summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Doxyfile297
-rw-r--r--INSTALL7
-rw-r--r--LANGUAGE.HOWTO50
-rw-r--r--LICENSE340
-rw-r--r--Makefile.in139
-rw-r--r--Makefile.win_make.in32
-rw-r--r--Makefile.win_nmake.in49
-rw-r--r--PLATFORMS31
-rw-r--r--README29
-rw-r--r--VERSION1
-rw-r--r--addon/doxmlparser/Doxyfile177
-rw-r--r--addon/doxmlparser/Doxyfile.impl179
-rw-r--r--addon/doxmlparser/examples/metrics/Makefile33
-rw-r--r--addon/doxmlparser/examples/metrics/Makefile.in13
-rw-r--r--addon/doxmlparser/examples/metrics/Makefile.metrics77
-rw-r--r--addon/doxmlparser/examples/metrics/main.cpp254
-rw-r--r--addon/doxmlparser/examples/metrics/metrics.pro25
-rw-r--r--addon/doxmlparser/examples/metrics/metrics.pro.in20
-rw-r--r--addon/doxmlparser/include/doxmlintf.h1134
-rw-r--r--addon/doxmlparser/src/Makefile33
-rw-r--r--addon/doxmlparser/src/Makefile.doxmlparser224
-rw-r--r--addon/doxmlparser/src/Makefile.in13
-rw-r--r--addon/doxmlparser/src/basehandler.cpp3
-rw-r--r--addon/doxmlparser/src/basehandler.h325
-rw-r--r--addon/doxmlparser/src/baseiterator.h50
-rw-r--r--addon/doxmlparser/src/compoundhandler.cpp650
-rw-r--r--addon/doxmlparser/src/compoundhandler.h236
-rw-r--r--addon/doxmlparser/src/debug.cpp24
-rw-r--r--addon/doxmlparser/src/debug.h7
-rw-r--r--addon/doxmlparser/src/dochandler.cpp2240
-rw-r--r--addon/doxmlparser/src/dochandler.h1352
l---------addon/doxmlparser/src/doxmlintf.h1
-rw-r--r--addon/doxmlparser/src/doxmlparser.pro32
-rw-r--r--addon/doxmlparser/src/doxmlparser.pro.in27
-rw-r--r--addon/doxmlparser/src/graphhandler.cpp216
-rw-r--r--addon/doxmlparser/src/graphhandler.h154
-rw-r--r--addon/doxmlparser/src/linkedtexthandler.cpp133
-rw-r--r--addon/doxmlparser/src/linkedtexthandler.h54
-rw-r--r--addon/doxmlparser/src/loamhandler.cpp75
-rw-r--r--addon/doxmlparser/src/loamhandler.h52
-rw-r--r--addon/doxmlparser/src/mainhandler.cpp299
-rw-r--r--addon/doxmlparser/src/mainhandler.h82
-rw-r--r--addon/doxmlparser/src/memberhandler.cpp600
-rw-r--r--addon/doxmlparser/src/memberhandler.h252
-rw-r--r--addon/doxmlparser/src/paramhandler.cpp158
-rw-r--r--addon/doxmlparser/src/paramhandler.h103
-rw-r--r--addon/doxmlparser/src/sectionhandler.cpp168
-rw-r--r--addon/doxmlparser/src/sectionhandler.h102
-rw-r--r--addon/doxmlparser/src/stringimpl.h30
-rw-r--r--addon/doxmlparser/test/Makefile33
-rw-r--r--addon/doxmlparser/test/Makefile.in13
-rw-r--r--addon/doxmlparser/test/Makefile.xmlparse77
-rw-r--r--addon/doxmlparser/test/main.cpp759
-rw-r--r--addon/doxmlparser/test/xmlparse.pro25
-rw-r--r--addon/doxmlparser/test/xmlparse.pro.in20
-rw-r--r--addon/doxyapp/Makefile.in17
-rw-r--r--addon/doxyapp/README8
-rw-r--r--addon/doxyapp/doxyapp.cpp314
-rw-r--r--addon/doxyapp/doxyapp.pro.in12
-rw-r--r--addon/doxywizard/Makefile59
-rw-r--r--addon/doxywizard/Makefile.doxywizard408
-rw-r--r--addon/doxywizard/Makefile.in39
-rw-r--r--addon/doxywizard/README3
-rw-r--r--addon/doxywizard/config.h18
-rw-r--r--addon/doxywizard/config.l555
-rw-r--r--addon/doxywizard/doxywizard.cpp639
-rw-r--r--addon/doxywizard/doxywizard.h84
-rw-r--r--addon/doxywizard/doxywizard.icobin0 -> 84070 bytes
-rw-r--r--addon/doxywizard/doxywizard.pro33
-rw-r--r--addon/doxywizard/doxywizard.pro.in28
-rw-r--r--addon/doxywizard/doxywizard.qrc11
-rw-r--r--addon/doxywizard/doxywizard.rc1
-rw-r--r--addon/doxywizard/expert.cpp561
-rw-r--r--addon/doxywizard/expert.h65
-rw-r--r--addon/doxywizard/helplabel.h33
-rw-r--r--addon/doxywizard/images/add.pngbin0 -> 4321 bytes
-rw-r--r--addon/doxywizard/images/del.pngbin0 -> 4231 bytes
-rw-r--r--addon/doxywizard/images/file.pngbin0 -> 4380 bytes
-rw-r--r--addon/doxywizard/images/folder.pngbin0 -> 4308 bytes
-rw-r--r--addon/doxywizard/images/refresh.pngbin0 -> 4458 bytes
-rw-r--r--addon/doxywizard/images/tunecolor.pngbin0 -> 116333 bytes
-rw-r--r--addon/doxywizard/input.h34
-rw-r--r--addon/doxywizard/inputbool.cpp110
-rw-r--r--addon/doxywizard/inputbool.h70
-rw-r--r--addon/doxywizard/inputint.cpp96
-rw-r--r--addon/doxywizard/inputint.h70
-rw-r--r--addon/doxywizard/inputstring.cpp193
-rw-r--r--addon/doxywizard/inputstring.h90
-rw-r--r--addon/doxywizard/inputstrlist.cpp254
-rw-r--r--addon/doxywizard/inputstrlist.h91
-rw-r--r--addon/doxywizard/version.h23
-rw-r--r--addon/doxywizard/wizard.cpp1295
-rw-r--r--addon/doxywizard/wizard.h253
-rwxr-xr-xconfigure671
-rw-r--r--doc/Doxyfile51
-rw-r--r--doc/Makefile56
-rw-r--r--doc/Makefile.in36
-rw-r--r--doc/Makefile.latex25
-rw-r--r--doc/Makefile.win_make.in36
-rw-r--r--doc/Makefile.win_nmake.in38
-rw-r--r--doc/arch.doc242
-rw-r--r--doc/archoverview.eps380
-rw-r--r--doc/archoverview.gifbin0 -> 7822 bytes
-rw-r--r--doc/autolink.doc132
-rw-r--r--doc/commands.doc2738
-rw-r--r--doc/config.doc2585
-rw-r--r--doc/custcmd.doc123
-rw-r--r--doc/customize.doc263
-rw-r--r--doc/dbusxml.doc149
-rw-r--r--doc/diagrams.doc148
-rw-r--r--doc/docblocks.doc483
-rw-r--r--doc/doxygen.146
-rw-r--r--doc/doxygen.sty323
-rw-r--r--doc/doxygen_logo.eps6322
-rw-r--r--doc/doxygen_logo.gifbin0 -> 29863 bytes
-rw-r--r--doc/doxygen_logo_low.gifbin0 -> 3952 bytes
-rw-r--r--doc/doxygen_manual.tex86
-rw-r--r--doc/doxygen_usage.doc106
-rw-r--r--doc/doxytag.121
-rw-r--r--doc/doxytag_usage.doc97
-rw-r--r--doc/doxywizard.110
-rw-r--r--doc/doxywizard.gifbin0 -> 18928 bytes
-rw-r--r--doc/doxywizard_expert.pngbin0 -> 30056 bytes
-rw-r--r--doc/doxywizard_main.pngbin0 -> 57204 bytes
-rw-r--r--doc/doxywizard_menu.pngbin0 -> 58661 bytes
-rw-r--r--doc/doxywizard_page1.pngbin0 -> 39646 bytes
-rw-r--r--doc/doxywizard_page2.pngbin0 -> 39048 bytes
-rw-r--r--doc/doxywizard_page3.pngbin0 -> 50904 bytes
-rw-r--r--doc/doxywizard_page4.pngbin0 -> 43718 bytes
-rw-r--r--doc/doxywizard_usage.doc138
-rw-r--r--doc/external.doc138
-rw-r--r--doc/faq.doc293
-rw-r--r--doc/features.doc115
-rw-r--r--doc/formulas.doc112
-rw-r--r--doc/grouping.doc228
-rw-r--r--doc/htmlcmds.doc151
-rw-r--r--doc/index.doc211
-rw-r--r--doc/index.hhp.txt108
-rw-r--r--doc/infoflow.eps646
-rw-r--r--doc/infoflow.fig240
-rw-r--r--doc/infoflow.gifbin0 -> 13383 bytes
-rw-r--r--doc/install.doc683
-rw-r--r--doc/install_prefix2
-rw-r--r--doc/installdox_usage.doc59
-rw-r--r--doc/language.doc737
-rw-r--r--doc/language.tpl357
-rw-r--r--doc/lists.doc119
-rw-r--r--doc/mailto.txt5
-rw-r--r--doc/maintainers.txt156
-rw-r--r--doc/output.doc62
-rw-r--r--doc/perlmod.doc193
-rw-r--r--doc/perlmod_tree.doc377
-rw-r--r--doc/preprocessing.doc263
-rw-r--r--doc/searching.doc158
-rw-r--r--doc/starting.doc300
-rw-r--r--doc/translator.py2012
-rw-r--r--doc/translator_report.txt848
-rw-r--r--doc/trouble.doc142
-rw-r--r--doc/xmlcmds.doc100
-rw-r--r--examples/Makefile146
-rw-r--r--examples/Makefile.in126
-rw-r--r--examples/Makefile.win.in118
-rw-r--r--examples/afterdoc.cfg10
-rw-r--r--examples/afterdoc.h18
-rw-r--r--examples/author.cfg10
-rw-r--r--examples/author.cpp14
-rw-r--r--examples/autolink.cfg10
-rw-r--r--examples/autolink.cpp99
-rw-r--r--examples/class.cfg10
-rw-r--r--examples/class.h11
-rw-r--r--examples/dbusxml.cfg12
-rw-r--r--examples/dbusxml.xml78
-rw-r--r--examples/define.cfg11
-rw-r--r--examples/define.h18
-rw-r--r--examples/diagrams.cfg14
-rw-r--r--examples/diagrams_a.h4
-rw-r--r--examples/diagrams_b.h5
-rw-r--r--examples/diagrams_c.h6
-rw-r--r--examples/diagrams_d.h7
-rw-r--r--examples/diagrams_e.h5
-rw-r--r--examples/docstring.cfg11
-rw-r--r--examples/docstring.py27
-rw-r--r--examples/enum.cfg10
-rw-r--r--examples/enum.h24
-rw-r--r--examples/example.cfg12
-rw-r--r--examples/example.cpp19
-rw-r--r--examples/example.tag14
-rw-r--r--examples/example_test.cpp5
-rw-r--r--examples/file.cfg10
-rw-r--r--examples/file.h10
-rw-r--r--examples/func.cfg10
-rw-r--r--examples/func.h21
-rw-r--r--examples/group.cfg10
-rw-r--r--examples/group.cpp88
-rw-r--r--examples/include.cfg11
-rw-r--r--examples/include.cpp22
-rw-r--r--examples/jdstyle.cfg10
-rw-r--r--examples/jdstyle.cpp66
-rw-r--r--examples/manual.c87
-rw-r--r--examples/manual.cfg16
-rw-r--r--examples/memgrp.cfg11
-rw-r--r--examples/memgrp.cpp41
-rw-r--r--examples/mux.cfg14
-rw-r--r--examples/mux.vhdl32
-rw-r--r--examples/overload.cfg11
-rw-r--r--examples/overload.cpp25
-rw-r--r--examples/page.cfg10
-rw-r--r--examples/page.doc14
-rw-r--r--examples/par.cfg10
-rw-r--r--examples/par.cpp20
-rw-r--r--examples/pyexample.cfg10
-rw-r--r--examples/pyexample.py30
-rw-r--r--examples/qtstyle.cfg10
-rw-r--r--examples/qtstyle.cpp65
-rw-r--r--examples/relates.cfg10
-rw-r--r--examples/relates.cpp23
-rw-r--r--examples/restypedef.cfg10
-rw-r--r--examples/restypedef.cpp25
-rw-r--r--examples/structcmd.cfg10
-rw-r--r--examples/structcmd.h57
-rw-r--r--examples/tag.cfg12
-rw-r--r--examples/tag.cpp9
-rw-r--r--examples/templ.cfg10
-rw-r--r--examples/templ.cpp35
-rw-r--r--libmd5/Makefile36
-rw-r--r--libmd5/Makefile.in16
-rw-r--r--libmd5/Makefile.libmd582
-rw-r--r--libmd5/libmd5.pro15
-rw-r--r--libmd5/libmd5.pro.in10
-rw-r--r--libmd5/md5.c313
-rw-r--r--libmd5/md5.h57
-rw-r--r--libmd5/md5_loc.h6
-rw-r--r--packages/rpm/doxygen.spec104
-rw-r--r--packages/rpm/doxygen.spec.in101
-rw-r--r--packaging/doxygen-1.7.1-config.patch95
-rw-r--r--packaging/doxygen.changes11
-rw-r--r--packaging/doxygen.manifest5
-rw-r--r--packaging/doxygen.spec48
-rw-r--r--qtools/Doxyfile277
-rw-r--r--qtools/LICENSE.GPL349
-rw-r--r--qtools/LICENSE.QPL103
-rw-r--r--qtools/Makefile50
-rw-r--r--qtools/Makefile.in30
-rw-r--r--qtools/README4
-rw-r--r--qtools/qarray.doc486
-rw-r--r--qtools/qarray.h110
-rw-r--r--qtools/qasciidict.h107
-rw-r--r--qtools/qbuffer.cpp465
-rw-r--r--qtools/qbuffer.h98
-rw-r--r--qtools/qcache.h148
-rw-r--r--qtools/qcollection.cpp182
-rw-r--r--qtools/qcollection.h74
-rw-r--r--qtools/qconfig.h1
-rw-r--r--qtools/qcstring.cpp799
-rw-r--r--qtools/qcstring.h464
-rw-r--r--qtools/qdatastream.cpp951
-rw-r--r--qtools/qdatastream.h173
-rw-r--r--qtools/qdatetime.cpp1434
-rw-r--r--qtools/qdatetime.h216
-rw-r--r--qtools/qdict.doc492
-rw-r--r--qtools/qdict.h116
-rw-r--r--qtools/qdir.cpp1200
-rw-r--r--qtools/qdir.h235
-rw-r--r--qtools/qdir_unix.cpp288
-rw-r--r--qtools/qdir_win32.cpp485
-rw-r--r--qtools/qfeatures.h978
-rw-r--r--qtools/qfile.cpp550
-rw-r--r--qtools/qfile.h128
-rw-r--r--qtools/qfile_unix.cpp668
-rw-r--r--qtools/qfile_win32.cpp678
-rw-r--r--qtools/qfiledefs_p.h261
-rw-r--r--qtools/qfileinfo.cpp458
-rw-r--r--qtools/qfileinfo.h138
-rw-r--r--qtools/qfileinfo_unix.cpp425
-rw-r--r--qtools/qfileinfo_win32.cpp356
-rw-r--r--qtools/qgarray.cpp747
-rw-r--r--qtools/qgarray.h120
-rw-r--r--qtools/qgcache.cpp868
-rw-r--r--qtools/qgcache.h128
-rw-r--r--qtools/qgdict.cpp1218
-rw-r--r--qtools/qgdict.h222
-rw-r--r--qtools/qgeneric.h43
-rw-r--r--qtools/qglist.cpp1223
-rw-r--r--qtools/qglist.h257
-rw-r--r--qtools/qglobal.cpp685
-rw-r--r--qtools/qglobal.h641
-rw-r--r--qtools/qgstring.cpp258
-rw-r--r--qtools/qgstring.h139
-rw-r--r--qtools/qgvector.cpp638
-rw-r--r--qtools/qgvector.h120
-rw-r--r--qtools/qintdict.doc475
-rw-r--r--qtools/qintdict.h102
-rw-r--r--qtools/qiodevice.cpp638
-rw-r--r--qtools/qiodevice.h155
-rw-r--r--qtools/qlist.doc1048
-rw-r--r--qtools/qlist.h139
-rw-r--r--qtools/qmap.cpp254
-rw-r--r--qtools/qmap.h606
-rw-r--r--qtools/qmodules.h11
-rw-r--r--qtools/qmutex.cpp96
-rw-r--r--qtools/qmutex.h83
-rw-r--r--qtools/qmutex_p.h90
-rw-r--r--qtools/qmutex_unix.cpp117
-rw-r--r--qtools/qmutex_win32.cpp108
-rw-r--r--qtools/qptrdict.doc486
-rw-r--r--qtools/qptrdict.h103
-rw-r--r--qtools/qqueue.h70
-rw-r--r--qtools/qregexp.cpp1092
-rw-r--r--qtools/qregexp.h92
-rw-r--r--qtools/qshared.h55
-rw-r--r--qtools/qsortedlist.doc94
-rw-r--r--qtools/qsortedlist.h59
-rw-r--r--qtools/qstack.doc135
-rw-r--r--qtools/qstack.h71
-rw-r--r--qtools/qstring.cpp15318
-rw-r--r--qtools/qstring.h833
-rw-r--r--qtools/qstringlist.cpp307
-rw-r--r--qtools/qstringlist.h82
-rw-r--r--qtools/qstrlist.doc5
-rw-r--r--qtools/qstrlist.h109
-rw-r--r--qtools/qstrvec.h90
-rw-r--r--qtools/qtextcodec.cpp2071
-rw-r--r--qtools/qtextcodec.h104
-rw-r--r--qtools/qtextstream.cpp2237
-rw-r--r--qtools/qtextstream.h351
-rw-r--r--qtools/qthread.cpp85
-rw-r--r--qtools/qthread.h77
-rw-r--r--qtools/qthread_p.h85
-rw-r--r--qtools/qthread_unix.cpp218
-rw-r--r--qtools/qthread_win32.cpp158
-rw-r--r--qtools/qtl.doc249
-rw-r--r--qtools/qtl.h223
-rw-r--r--qtools/qtools.pro107
-rw-r--r--qtools/qtools.pro.in102
-rw-r--r--qtools/qutfcodec.cpp276
-rw-r--r--qtools/qutfcodec.h71
-rw-r--r--qtools/qvaluelist.doc772
-rw-r--r--qtools/qvaluelist.h449
-rw-r--r--qtools/qvaluestack.h64
-rw-r--r--qtools/qvector.doc344
-rw-r--r--qtools/qvector.h85
-rw-r--r--qtools/qwaitcondition.h68
-rw-r--r--qtools/qwaitcondition_unix.cpp133
-rw-r--r--qtools/qwaitcondition_win32.cpp186
-rw-r--r--qtools/qxml.cpp6046
-rw-r--r--qtools/qxml.h671
-rw-r--r--qtools/scstring.cpp798
-rw-r--r--qtools/scstring.h155
-rw-r--r--src/Makefile74
-rw-r--r--src/Makefile.in54
-rw-r--r--src/Makefile.libdoxycfg147
-rw-r--r--src/bufstr.h118
-rw-r--r--src/ce_lex.cpp2005
-rw-r--r--src/ce_parse.cpp1972
-rw-r--r--src/ce_parse.h115
-rw-r--r--src/classdef.cpp3904
-rw-r--r--src/classdef.h479
-rw-r--r--src/classlist.cpp157
-rw-r--r--src/classlist.h61
-rw-r--r--src/cmdmapper.cpp199
-rw-r--r--src/cmdmapper.h217
-rw-r--r--src/code.cpp14003
-rw-r--r--src/code.h35
-rw-r--r--src/code.l3473
-rw-r--r--src/commentcnv.cpp3396
-rw-r--r--src/commentcnv.h27
-rw-r--r--src/commentcnv.l845
-rw-r--r--src/commentscan.cpp7471
-rw-r--r--src/commentscan.h84
-rw-r--r--src/commentscan.l2761
-rw-r--r--src/compound.xsd821
-rw-r--r--src/compound_xsd.h821
-rw-r--r--src/config.cpp3528
-rw-r--r--src/config.h610
-rw-r--r--src/config.l1588
-rw-r--r--src/config.xml1567
-rwxr-xr-xsrc/configgen.py137
-rw-r--r--src/configoptions.cpp2386
-rw-r--r--src/configoptions.h26
-rw-r--r--src/constexp.h33
-rw-r--r--src/constexp.l120
-rw-r--r--src/constexp.y278
-rw-r--r--src/cppvalue.cpp95
-rw-r--r--src/cppvalue.h62
-rw-r--r--src/dbusxmlscanner.cpp891
-rw-r--r--src/dbusxmlscanner.h58
-rw-r--r--src/debug.cpp116
-rw-r--r--src/debug.h49
-rw-r--r--src/declinfo.cpp2343
-rw-r--r--src/declinfo.h33
-rw-r--r--src/declinfo.l357
-rw-r--r--src/defargs.cpp2629
-rw-r--r--src/defargs.h29
-rw-r--r--src/defargs.l481
-rw-r--r--src/defgen.cpp630
-rw-r--r--src/defgen.h20
-rw-r--r--src/define.cpp52
-rw-r--r--src/define.h91
-rw-r--r--src/definition.cpp1655
-rw-r--r--src/definition.h370
-rw-r--r--src/diagram.cpp1301
-rw-r--r--src/diagram.h133
-rw-r--r--src/dirdef.cpp911
-rw-r--r--src/dirdef.h179
-rw-r--r--src/docparser.cpp6590
-rw-r--r--src/docparser.h1221
-rw-r--r--src/docsets.cpp471
-rw-r--r--src/docsets.h83
-rw-r--r--src/doctokenizer.cpp12645
-rw-r--r--src/doctokenizer.h151
-rw-r--r--src/doctokenizer.l1120
-rw-r--r--src/docvisitor.h189
-rw-r--r--src/dot.cpp4174
-rw-r--r--src/dot.h450
-rw-r--r--src/doxygen.cpp10772
-rw-r--r--src/doxygen.css835
-rw-r--r--src/doxygen.h173
-rw-r--r--src/doxygen.pro44
-rw-r--r--src/doxygen.pro.in39
-rw-r--r--src/doxygen_css.h835
-rw-r--r--src/doxytag.cpp3923
-rw-r--r--src/doxytag.l930
-rw-r--r--src/doxytag.pro36
-rw-r--r--src/doxytag.pro.in31
-rw-r--r--src/doxytag.t50
-rw-r--r--src/eclipsehelp.cpp201
-rw-r--r--src/eclipsehelp.h77
-rw-r--r--src/entry.cpp467
-rw-r--r--src/entry.h450
-rw-r--r--src/example.h45
-rw-r--r--src/filedef.cpp1656
-rw-r--r--src/filedef.h324
-rw-r--r--src/filename.cpp144
-rw-r--r--src/filename.h69
-rw-r--r--src/formula.cpp329
-rw-r--r--src/formula.h59
-rw-r--r--src/fortrancode.cpp9942
-rw-r--r--src/fortrancode.h35
-rw-r--r--src/fortrancode.l1070
-rw-r--r--src/fortranscanner.cpp27350
-rw-r--r--src/fortranscanner.h51
-rw-r--r--src/fortranscanner.l2076
-rw-r--r--src/ftextstream.cpp259
-rw-r--r--src/ftextstream.h82
-rw-r--r--src/ftvhelp.cpp1364
-rw-r--r--src/ftvhelp.h77
-rw-r--r--src/groupdef.cpp1437
-rw-r--r--src/groupdef.h193
-rw-r--r--src/htags.cpp179
-rw-r--r--src/htags.h28
-rw-r--r--src/htmlattrib.h65
-rw-r--r--src/htmldocvisitor.cpp1751
-rw-r--r--src/htmldocvisitor.h162
-rw-r--r--src/htmlgen.cpp3206
-rw-r--r--src/htmlgen.h281
-rw-r--r--src/htmlhelp.cpp704
-rw-r--r--src/htmlhelp.h101
-rw-r--r--src/image.cpp540
-rw-r--r--src/image.h69
-rw-r--r--src/increasebuffer.pl9
-rw-r--r--src/index.cpp4179
-rw-r--r--src/index.h278
-rw-r--r--src/index.xsd66
-rw-r--r--src/index_xsd.h66
-rw-r--r--src/indexlog.cpp152
-rw-r--r--src/indexlog.h57
-rw-r--r--src/instdox.cpp180
-rw-r--r--src/instdox.h23
-rw-r--r--src/jquery.js13
-rw-r--r--src/jquery_js.h13
-rw-r--r--src/jquery_ui.js32
-rw-r--r--src/jquery_ui_js.h32
-rw-r--r--src/lang_cfg.h39
-rw-r--r--src/language.cpp413
-rw-r--r--src/language.h26
-rw-r--r--src/latexdocvisitor.cpp1520
-rw-r--r--src/latexdocvisitor.h175
-rw-r--r--src/latexgen.cpp2368
-rw-r--r--src/latexgen.h264
-rw-r--r--src/layout.cpp1224
-rw-r--r--src/layout.h190
-rw-r--r--src/layout_default.h185
-rw-r--r--src/layout_default.xml185
-rw-r--r--src/libdoxycfg.pro32
-rw-r--r--src/libdoxycfg.pro.in27
-rw-r--r--src/libdoxycfg.t52
-rw-r--r--src/libdoxygen.pro265
-rw-r--r--src/libdoxygen.pro.in260
-rw-r--r--src/libdoxygen.t145
-rw-r--r--src/lockingptr.h162
-rw-r--r--src/lodepng.cpp4095
-rw-r--r--src/lodepng.h1575
-rw-r--r--src/logos.cpp1986
-rw-r--r--src/logos.h27
-rw-r--r--src/main.cpp41
-rw-r--r--src/mandocvisitor.cpp959
-rw-r--r--src/mandocvisitor.h157
-rw-r--r--src/mangen.cpp742
-rw-r--r--src/mangen.h253
-rw-r--r--src/marshal.cpp826
-rw-r--r--src/marshal.h132
-rw-r--r--src/memberdef.cpp4296
-rw-r--r--src/memberdef.h392
-rw-r--r--src/membergroup.cpp363
-rw-r--r--src/membergroup.h153
-rw-r--r--src/memberlist.cpp798
-rw-r--r--src/memberlist.h201
-rw-r--r--src/membername.cpp83
-rw-r--r--src/membername.h98
-rw-r--r--src/message.cpp196
-rw-r--r--src/message.h31
-rw-r--r--src/msc.cpp198
-rw-r--r--src/msc.h38
-rw-r--r--src/namespacedef.cpp992
-rw-r--r--src/namespacedef.h167
-rw-r--r--src/navtree.css123
-rw-r--r--src/navtree.js245
-rw-r--r--src/navtree_css.h123
-rw-r--r--src/navtree_js.h245
-rw-r--r--src/objcache.cpp332
-rw-r--r--src/objcache.h113
-rw-r--r--src/outputgen.cpp81
-rw-r--r--src/outputgen.h486
-rw-r--r--src/outputlist.cpp315
-rw-r--r--src/outputlist.h501
-rw-r--r--src/pagedef.cpp264
-rw-r--r--src/pagedef.h76
-rw-r--r--src/parserintf.h171
-rw-r--r--src/perlmodgen.cpp2899
-rw-r--r--src/perlmodgen.h23
-rw-r--r--src/portable.cpp401
-rw-r--r--src/portable.h47
-rw-r--r--src/portable_c.c24
-rw-r--r--src/pre.cpp7030
-rw-r--r--src/pre.h34
-rw-r--r--src/pre.l2703
-rw-r--r--src/printdocvisitor.h691
-rw-r--r--src/pycode.cpp3811
-rw-r--r--src/pycode.h41
-rw-r--r--src/pycode.l1460
-rw-r--r--src/pyscanner.cpp4604
-rw-r--r--src/pyscanner.h60
-rw-r--r--src/pyscanner.l1680
-rw-r--r--src/qhp.cpp334
-rw-r--r--src/qhp.h68
-rw-r--r--src/qhpxmlwriter.cpp151
-rw-r--r--src/qhpxmlwriter.h63
-rw-r--r--src/qtbc.h45
-rw-r--r--src/reflist.cpp162
-rw-r--r--src/reflist.h94
-rw-r--r--src/resize.js81
-rw-r--r--src/resize_js.h81
-rw-r--r--src/rtfdocvisitor.cpp1646
-rw-r--r--src/rtfdocvisitor.h165
-rw-r--r--src/rtfgen.cpp2822
-rw-r--r--src/rtfgen.h277
-rw-r--r--src/rtfstyle.cpp518
-rw-r--r--src/rtfstyle.h83
-rw-r--r--src/scanner.cpp18858
-rw-r--r--src/scanner.h55
-rw-r--r--src/scanner.l6010
-rw-r--r--src/search.css240
-rw-r--r--src/search.js709
-rw-r--r--src/search.php317
-rw-r--r--src/search_css.h240
-rw-r--r--src/search_js.h709
-rw-r--r--src/search_php.h317
-rw-r--r--src/searchindex.cpp307
-rw-r--r--src/searchindex.h71
-rw-r--r--src/section.h63
-rw-r--r--src/sizzle.js9
-rw-r--r--src/sizzle_js.h9
-rw-r--r--src/sortdict.h647
-rw-r--r--src/store.cpp405
-rw-r--r--src/store.h118
-rw-r--r--src/tagreader.cpp1406
-rw-r--r--src/tagreader.h28
-rw-r--r--src/textdocvisitor.cpp88
-rw-r--r--src/textdocvisitor.h136
-rw-r--r--src/translator.cpp248
-rw-r--r--src/translator.h503
-rw-r--r--src/translator_adapter.h234
-rw-r--r--src/translator_ar.h1615
-rw-r--r--src/translator_br.h1866
-rw-r--r--src/translator_ca.h1822
-rw-r--r--src/translator_cn.h1868
-rw-r--r--src/translator_cz.h1909
-rw-r--r--src/translator_de.h1915
-rw-r--r--src/translator_dk.h1816
-rw-r--r--src/translator_en.h1876
-rw-r--r--src/translator_eo.h1880
-rw-r--r--src/translator_es.h1935
-rw-r--r--src/translator_fa.h1834
-rw-r--r--src/translator_fi.h1903
-rw-r--r--src/translator_fr.h1978
-rw-r--r--src/translator_gr.h1851
-rw-r--r--src/translator_hr.h1557
-rw-r--r--src/translator_hu.h1546
-rw-r--r--src/translator_id.h1596
-rw-r--r--src/translator_it.h1853
-rw-r--r--src/translator_je.h67
-rw-r--r--src/translator_jp.h1772
-rw-r--r--src/translator_ke.h59
-rw-r--r--src/translator_kr.h1889
-rw-r--r--src/translator_lt.h1563
-rw-r--r--src/translator_mk.h1767
-rw-r--r--src/translator_nl.h1456
-rw-r--r--src/translator_no.h1617
-rw-r--r--src/translator_pl.h1804
-rw-r--r--src/translator_pt.h1483
-rw-r--r--src/translator_ro.h1797
-rw-r--r--src/translator_ru.h1846
-rw-r--r--src/translator_sc.h1805
-rw-r--r--src/translator_si.h1251
-rw-r--r--src/translator_sk.h1836
-rw-r--r--src/translator_sr.h1838
-rw-r--r--src/translator_sv.h1662
-rw-r--r--src/translator_tr.h1872
-rw-r--r--src/translator_tw.h1759
-rw-r--r--src/translator_ua.h1589
-rw-r--r--src/translator_vi.h1787
-rw-r--r--src/translator_za.h1767
-rw-r--r--src/translatordecoder.h750
-rw-r--r--src/util.cpp6985
-rw-r--r--src/util.h404
-rw-r--r--src/version.cpp1
-rw-r--r--src/version.h23
-rw-r--r--src/vhdlcode.cpp11274
-rw-r--r--src/vhdlcode.h18
-rw-r--r--src/vhdlcode.l1581
-rw-r--r--src/vhdldocgen.cpp2569
-rw-r--r--src/vhdldocgen.h281
-rw-r--r--src/vhdlscanner.cpp10776
-rw-r--r--src/vhdlscanner.h75
-rw-r--r--src/vhdlscanner.l2041
-rw-r--r--src/xmldocvisitor.cpp968
-rw-r--r--src/xmldocvisitor.h160
-rw-r--r--src/xmlgen.cpp2010
-rw-r--r--src/xmlgen.h20
-rw-r--r--tmake/CHANGES49
-rw-r--r--tmake/LICENSE9
-rw-r--r--tmake/README10
-rw-r--r--tmake/bin/progen249
-rw-r--r--tmake/bin/tmake1262
-rw-r--r--tmake/doc/m-linux-gcc.html85
-rw-r--r--tmake/doc/m-win32-msvc.html89
-rw-r--r--tmake/doc/tmake.html727
-rw-r--r--tmake/doc/tmake_ref.html463
-rw-r--r--tmake/example/hello.cpp102
-rw-r--r--tmake/example/hello.h34
-rw-r--r--tmake/example/hello.pro3
-rw-r--r--tmake/example/main.cpp38
-rw-r--r--tmake/example/wc.t6
-rw-r--r--tmake/lib/aix-g++/app.t2
-rw-r--r--tmake/lib/aix-g++/lib.t2
-rw-r--r--tmake/lib/aix-g++/subdirs.t2
-rw-r--r--tmake/lib/aix-g++/tmake.conf58
-rw-r--r--tmake/lib/aix-xlc/app.t2
-rw-r--r--tmake/lib/aix-xlc/lib.t2
-rw-r--r--tmake/lib/aix-xlc/subdirs.t2
-rw-r--r--tmake/lib/aix-xlc/tmake.conf64
-rw-r--r--tmake/lib/beos-g++/app.t2
-rw-r--r--tmake/lib/beos-g++/lib.t2
-rw-r--r--tmake/lib/beos-g++/subdirs.t2
-rw-r--r--tmake/lib/beos-g++/tmake.conf51
-rw-r--r--tmake/lib/bsdi-g++/app.t2
-rw-r--r--tmake/lib/bsdi-g++/lib.t2
-rw-r--r--tmake/lib/bsdi-g++/subdirs.t2
-rw-r--r--tmake/lib/bsdi-g++/tmake.conf61
-rw-r--r--tmake/lib/dgux-g++/app.t2
-rw-r--r--tmake/lib/dgux-g++/lib.t2
-rw-r--r--tmake/lib/dgux-g++/subdirs.t2
-rw-r--r--tmake/lib/dgux-g++/tmake.conf59
-rw-r--r--tmake/lib/freebsd-g++/app.t2
-rw-r--r--tmake/lib/freebsd-g++/lib.t2
-rw-r--r--tmake/lib/freebsd-g++/subdirs.t2
-rw-r--r--tmake/lib/freebsd-g++/tmake.conf60
-rw-r--r--tmake/lib/gnu-g++/app.t2
-rw-r--r--tmake/lib/gnu-g++/lib.t2
-rw-r--r--tmake/lib/gnu-g++/subdirs.t2
-rw-r--r--tmake/lib/gnu-g++/tmake.conf58
-rw-r--r--tmake/lib/hpux-acc/app.t2
-rw-r--r--tmake/lib/hpux-acc/lib.t2
-rw-r--r--tmake/lib/hpux-acc/subdirs.t2
-rw-r--r--tmake/lib/hpux-acc/tmake.conf60
-rw-r--r--tmake/lib/hpux-cc/app.t2
-rw-r--r--tmake/lib/hpux-cc/lib.t2
-rw-r--r--tmake/lib/hpux-cc/subdirs.t2
-rw-r--r--tmake/lib/hpux-cc/tmake.conf59
-rw-r--r--tmake/lib/hpux-g++/app.t2
-rw-r--r--tmake/lib/hpux-g++/lib.t2
-rw-r--r--tmake/lib/hpux-g++/subdirs.t2
-rw-r--r--tmake/lib/hpux-g++/tmake.conf60
-rw-r--r--tmake/lib/irix-64/app.t2
-rw-r--r--tmake/lib/irix-64/lib.t2
-rw-r--r--tmake/lib/irix-64/subdirs.t2
-rw-r--r--tmake/lib/irix-64/tmake.conf60
-rw-r--r--tmake/lib/irix-dcc/app.t2
-rw-r--r--tmake/lib/irix-dcc/lib.t2
-rw-r--r--tmake/lib/irix-dcc/subdirs.t2
-rw-r--r--tmake/lib/irix-dcc/tmake.conf60
-rw-r--r--tmake/lib/irix-g++/app.t2
-rw-r--r--tmake/lib/irix-g++/lib.t2
-rw-r--r--tmake/lib/irix-g++/subdirs.t2
-rw-r--r--tmake/lib/irix-g++/tmake.conf60
-rw-r--r--tmake/lib/irix-n32/app.t2
-rw-r--r--tmake/lib/irix-n32/lib.t2
-rw-r--r--tmake/lib/irix-n32/subdirs.t2
-rw-r--r--tmake/lib/irix-n32/tmake.conf60
-rw-r--r--tmake/lib/irix-o32/app.t2
-rw-r--r--tmake/lib/irix-o32/lib.t2
-rw-r--r--tmake/lib/irix-o32/subdirs.t2
-rw-r--r--tmake/lib/irix-o32/tmake.conf60
-rw-r--r--tmake/lib/linux-64/app.t2
-rw-r--r--tmake/lib/linux-64/lib.t2
-rw-r--r--tmake/lib/linux-64/subdirs.t2
-rw-r--r--tmake/lib/linux-64/tmake.conf59
-rw-r--r--tmake/lib/linux-g++/app.t2
-rw-r--r--tmake/lib/linux-g++/lib.t2
-rw-r--r--tmake/lib/linux-g++/subdirs.t2
-rw-r--r--tmake/lib/linux-g++/tmake.conf59
-rw-r--r--tmake/lib/m68k-atari-mint-g++/app.t2
-rw-r--r--tmake/lib/m68k-atari-mint-g++/lib.t2
-rw-r--r--tmake/lib/m68k-atari-mint-g++/subdirs.t2
-rw-r--r--tmake/lib/m68k-atari-mint-g++/tmake.conf59
-rw-r--r--tmake/lib/macosx-c++/app.t2
-rw-r--r--tmake/lib/macosx-c++/lib.t2
-rw-r--r--tmake/lib/macosx-c++/subdirs.t2
-rw-r--r--tmake/lib/macosx-c++/tmake.conf59
-rw-r--r--tmake/lib/macosx-uni-c++/app.t2
-rw-r--r--tmake/lib/macosx-uni-c++/lib.t2
-rw-r--r--tmake/lib/macosx-uni-c++/subdirs.t2
-rw-r--r--tmake/lib/macosx-uni-c++/tmake.conf59
-rw-r--r--tmake/lib/netbsd-g++/app.t2
-rw-r--r--tmake/lib/netbsd-g++/lib.t2
-rw-r--r--tmake/lib/netbsd-g++/subdirs.t2
-rw-r--r--tmake/lib/netbsd-g++/tmake.conf61
-rw-r--r--tmake/lib/openbsd-g++/app.t2
-rw-r--r--tmake/lib/openbsd-g++/lib.t2
-rw-r--r--tmake/lib/openbsd-g++/subdirs.t2
-rw-r--r--tmake/lib/openbsd-g++/tmake.conf61
-rw-r--r--tmake/lib/osf1-cxx/app.t2
-rw-r--r--tmake/lib/osf1-cxx/lib.t2
-rw-r--r--tmake/lib/osf1-cxx/subdirs.t2
-rw-r--r--tmake/lib/osf1-cxx/tmake.conf60
-rw-r--r--tmake/lib/osf1-g++/app.t2
-rw-r--r--tmake/lib/osf1-g++/lib.t2
-rw-r--r--tmake/lib/osf1-g++/subdirs.t2
-rw-r--r--tmake/lib/osf1-g++/tmake.conf58
-rw-r--r--tmake/lib/qnx-g++/app.t2
-rw-r--r--tmake/lib/qnx-g++/lib.t2
-rw-r--r--tmake/lib/qnx-g++/subdirs.t2
-rw-r--r--tmake/lib/qnx-g++/tmake.conf58
-rw-r--r--tmake/lib/sco-g++/app.t2
-rw-r--r--tmake/lib/sco-g++/lib.t2
-rw-r--r--tmake/lib/sco-g++/subdirs.t2
-rw-r--r--tmake/lib/sco-g++/tmake.conf58
-rw-r--r--tmake/lib/solaris-cc-64/app.t2
-rw-r--r--tmake/lib/solaris-cc-64/lib.t2
-rw-r--r--tmake/lib/solaris-cc-64/subdirs.t2
-rw-r--r--tmake/lib/solaris-cc-64/tmake.conf61
-rw-r--r--tmake/lib/solaris-cc-gcc/app.t2
-rw-r--r--tmake/lib/solaris-cc-gcc/lib.t2
-rw-r--r--tmake/lib/solaris-cc-gcc/subdirs.t2
-rw-r--r--tmake/lib/solaris-cc-gcc/tmake.conf62
-rw-r--r--tmake/lib/solaris-cc/app.t2
-rw-r--r--tmake/lib/solaris-cc/lib.t2
-rw-r--r--tmake/lib/solaris-cc/subdirs.t2
-rw-r--r--tmake/lib/solaris-cc/tmake.conf61
-rw-r--r--tmake/lib/solaris-g++/app.t2
-rw-r--r--tmake/lib/solaris-g++/lib.t2
-rw-r--r--tmake/lib/solaris-g++/subdirs.t2
-rw-r--r--tmake/lib/solaris-g++/tmake.conf59
-rw-r--r--tmake/lib/sunos-g++/app.t2
-rw-r--r--tmake/lib/sunos-g++/lib.t2
-rw-r--r--tmake/lib/sunos-g++/subdirs.t2
-rw-r--r--tmake/lib/sunos-g++/tmake.conf58
-rw-r--r--tmake/lib/ultrix-g++/app.t2
-rw-r--r--tmake/lib/ultrix-g++/lib.t2
-rw-r--r--tmake/lib/ultrix-g++/subdirs.t2
-rw-r--r--tmake/lib/ultrix-g++/tmake.conf58
-rw-r--r--tmake/lib/unix/app.t6
-rw-r--r--tmake/lib/unix/generic.t283
-rw-r--r--tmake/lib/unix/lib.t6
-rw-r--r--tmake/lib/unix/subdirs.t38
-rw-r--r--tmake/lib/unixware-g++/app.t2
-rw-r--r--tmake/lib/unixware-g++/lib.t2
-rw-r--r--tmake/lib/unixware-g++/subdirs.t2
-rw-r--r--tmake/lib/unixware-g++/tmake.conf60
-rw-r--r--tmake/lib/unixware7-cc/app.t2
-rw-r--r--tmake/lib/unixware7-cc/lib.t2
-rw-r--r--tmake/lib/unixware7-cc/subdirs.t2
-rw-r--r--tmake/lib/unixware7-cc/tmake.conf60
-rw-r--r--tmake/lib/unixware7-g++/app.t2
-rw-r--r--tmake/lib/unixware7-g++/lib.t2
-rw-r--r--tmake/lib/unixware7-g++/subdirs.t2
-rw-r--r--tmake/lib/unixware7-g++/tmake.conf60
-rw-r--r--tmake/lib/win32-borland/app.t6
-rw-r--r--tmake/lib/win32-borland/generic.t237
-rw-r--r--tmake/lib/win32-borland/lib.t6
-rw-r--r--tmake/lib/win32-borland/subdirs.t3
-rw-r--r--tmake/lib/win32-borland/tmake.conf56
-rw-r--r--tmake/lib/win32-g++/app.t6
-rw-r--r--tmake/lib/win32-g++/generic.t241
-rw-r--r--tmake/lib/win32-g++/lib.t6
-rw-r--r--tmake/lib/win32-g++/subdirs.t2
-rw-r--r--tmake/lib/win32-g++/tmake.conf56
-rw-r--r--tmake/lib/win32-mingw/app.t6
-rw-r--r--tmake/lib/win32-mingw/generic.t241
-rw-r--r--tmake/lib/win32-mingw/lib.t6
-rw-r--r--tmake/lib/win32-mingw/subdirs.t2
-rw-r--r--tmake/lib/win32-mingw/tmake.conf56
-rw-r--r--tmake/lib/win32-msvc/app.t6
-rw-r--r--tmake/lib/win32-msvc/generic.t229
-rw-r--r--tmake/lib/win32-msvc/lib.t6
-rw-r--r--tmake/lib/win32-msvc/subdirs.t2
-rw-r--r--tmake/lib/win32-msvc/tmake.conf65
-rw-r--r--tmake/lib/win32-msvc/vcapp.t244
-rw-r--r--tmake/lib/win32-msvc/vclib.t178
-rw-r--r--tmake/lib/win32-symantec/app.t6
-rw-r--r--tmake/lib/win32-symantec/generic.t211
-rw-r--r--tmake/lib/win32-symantec/lib.t6
-rw-r--r--tmake/lib/win32-symantec/subdirs.t2
-rw-r--r--tmake/lib/win32-symantec/tmake.conf56
-rw-r--r--tmake/lib/win32-visage/app.t6
-rw-r--r--tmake/lib/win32-visage/generic.t207
-rw-r--r--tmake/lib/win32-visage/lib.t6
-rw-r--r--tmake/lib/win32-visage/subdirs.t2
-rw-r--r--tmake/lib/win32-visage/tmake.conf56
-rw-r--r--tmake/lib/win32-watcom/app.t6
-rw-r--r--tmake/lib/win32-watcom/generic.t201
-rw-r--r--tmake/lib/win32-watcom/lib.t6
-rw-r--r--tmake/lib/win32-watcom/subdirs.t2
-rw-r--r--tmake/lib/win32-watcom/tmake.conf54
-rw-r--r--tmake/lib/win32/subdirs.t54
-rw-r--r--winbuild/Doxygen.sln44
-rw-r--r--winbuild/Doxygen.vcproj2621
-rw-r--r--winbuild/Doxytag.vcproj328
-rw-r--r--winbuild/Doxywizard.vcproj590
-rw-r--r--winbuild/Lex.rules40
-rw-r--r--winbuild/iconv.h141
-rw-r--r--winbuild/iconv.libbin0 -> 958612 bytes
-rw-r--r--winbuild/moc.rules20
-rw-r--r--winbuild/qtools.vcproj973
-rw-r--r--winbuild/runbison.bat3
-rw-r--r--winbuild/unistd.h7
-rw-r--r--winbuild/version.bat24
847 files changed, 487962 insertions, 0 deletions
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 0000000..fe3e33a
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,297 @@
+# Doxyfile 1.6.3
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = Doxygen
+PROJECT_NUMBER =
+OUTPUT_DIRECTORY = doxygen_docs
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = YES
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+TYPEDEF_HIDES_STRUCT = NO
+SYMBOL_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = NO
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = 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
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+#---------------------------------------------------------------------------
+# 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 = src
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *.h \
+ *.cpp
+RECURSIVE = NO
+EXCLUDE = src/code.cpp \
+ src/ce_lex.cpp \
+ src/ce_parse.cpp \
+ src/declinfo.cpp \
+ src/defargs.cpp \
+ src/doxytag.cpp \
+ src/pre.cpp \
+ src/scanner.cpp \
+ src/tag.cpp \
+ src/doctokenizer.cpp \
+ src/logos.cpp \
+ src/suffixtree.cpp \
+ src/suffixtree.h \
+ src/searchindex.cpp \
+ src/searchindex.h \
+ src/commentcnv.cpp \
+ src/commentscan.cpp \
+ src/pycode.cpp \
+ src/config.cpp \
+ src/pyscanner.cpp \
+ src/fortranscanner.cpp \
+ src/fortrancode.cpp \
+ src/vhdlscanner.cpp \
+ src/vhdlcode.cpp \
+ src/doxygen_css.h \
+ src/doxygen_js.h \
+ src/doxygen_php.h \
+ src/compound_xsd.h \
+ src/layout_default.h \
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+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 = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT =
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = YES
+HTML_ALIGN_MEMBERS = YES
+HTML_DYNAMIC_SECTIONS = YES
+GENERATE_DOCSET = YES
+DOCSET_FEEDNAME = "Doxygen docs"
+DOCSET_BUNDLE_ID = org.doxygen.Doxygen
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = YES
+USE_INLINE_TREES = YES
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+SEARCHENGINE = YES
+SERVER_BASED_SEARCH = NO
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT =
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT =
+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_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+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 = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES = qtools_docs/qtools.tag=../../qtools_docs/html
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = NO
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+DOT_FONTNAME = Helvetica
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = YES
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = svg
+DOT_PATH =
+DOTFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = NO
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..eb1af46
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,7 @@
+DOXYGEN Version 1.7.4
+
+Please read the installation section of the manual
+(http://www.doxygen.org/install.html) for instructions.
+
+--------
+Dimitri van Heesch (28 March 2011)
diff --git a/LANGUAGE.HOWTO b/LANGUAGE.HOWTO
new file mode 100644
index 0000000..e535a05
--- /dev/null
+++ b/LANGUAGE.HOWTO
@@ -0,0 +1,50 @@
+This short howto explains how to add support for a new language to Doxygen:
+
+Just follow these steps:
+
+1) Tell me which language you want to add support for. If no one else
+ is already working on support for that language, you will be
+ assigned as the maintainer for the language. I'll create a
+ list on Doxygen's homepage, so everyone knows who is doing what.
+2) Create a copy of translator_en.h and name it
+ translator_<your_2_letter_country_code>.h
+ I'll use xx in the rest of this document.
+3) Edit language.cpp:
+ - Add a #include<translator_xx.h>
+ - In setTranslator() add
+
+ else if (L_EQUAL("your_language_name"))
+ {
+ theTranslator = new TranslatorYourLanguage;
+ }
+
+ after the if { ... }
+4) Edit libdoxygen.pro.in and add translator_xx.h to the HEADERS line.
+5) Edit translator_xx.h:
+ - Change TRANSLATOR_EN_H to TRANSLATOR_XX_H (in both the #include line and
+ the #define line).
+ - Change TranslatorEnglish to TranslatorYourLanguage
+ - In the member idLanguage() change "english" into the name of your
+ language (use lower case characters only). Depending on the language you
+ may also wish to change the member functions latexLanguageSupportCommand()
+ and idLanguageCharset().
+ - Edit all the strings that are returned by the members that start
+ with tr. Try to match punctuation and capitals!
+ To enter special characters (with accents) you can:
+ a) Enter them directly if your keyboard supports that and you are
+ using a Latin-1 font.
+ Doxygen will translate the characters to proper Latex and
+ leave the Html and man output for what it is (which is fine, if
+ idLanguageCharset() is set correctly).
+ b) Use html codes like &auml; for an a with an umlaut (i.e. ).
+ See the HTML specification for the codes.
+6) Run configure and make again from the root of the distribution,
+ in order to regenerate the Makefiles.
+7) Now you can use OUTPUT_LANGUAGE = your_language_name
+ in the config file to generate output in your language.
+8) Send translator_xx.h to me so I can add it to doxygen.
+ Send also your name and e-mail address to be included in the
+ maintainers.txt list.
+
+Good luck, and let me know if there are problems.
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..219ec28
--- /dev/null
+++ b/LICENSE
@@ -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) yyyy <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) yyyy 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/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..781d359
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,139 @@
+#all: src/version.cpp doxywizard
+# cd qtools ; $(MAKE)
+# cd src ; $(MAKE)
+
+DESTDIR =
+
+clean: FORCE
+ cd examples ; $(MAKE) clean
+ cd doc ; $(MAKE) clean
+ cd qtools ; $(MAKE) clean
+ cd src ; $(MAKE) clean
+ cd libmd5 ; $(MAKE) clean
+ cd addon/doxywizard ; $(MAKE) clean
+ cd addon/doxmlparser/src ; $(MAKE) clean
+ cd addon/doxmlparser/test ; $(MAKE) clean
+ cd addon/doxmlparser/examples/metrics ; $(MAKE) clean
+ -rm -f bin/doxy*
+ -rm -f objects/*.o
+
+distclean: clean
+ cd src ; $(MAKE) distclean
+ cd libmd5 ; $(MAKE) distclean
+ cd addon/doxywizard ; $(MAKE) distclean
+ cd addon/doxmlparser/src ; $(MAKE) distclean
+ cd addon/doxmlparser/test ; $(MAKE) distclean
+ cd addon/doxmlparser/examples/metrics ; $(MAKE) distclean
+ cd addon/doxyapp ; $(MAKE) distclean
+ -rm -f lib/lib*
+ -rm -f bin/doxy*
+ -rm -f html
+ -rm -f latex
+ -rm -f objects/*.o
+ -rm -f src/Makefile.doxygen src/Makefile.libdoxygen
+ -rm -f src/Makefile.doxytag src/Makefile.libdoxycfg
+ -rm -f libmd5/Makefile.libmd5
+ -rm -f Makefile qtools/Makefile src/Makefile examples/Makefile doc/Makefile
+ -rm -f .makeconfig .tmakeconfig
+ -rm -f src/doxygen.pro src/libdoxygen.pro src/doxytag.pro qtools/qtools.pro src/libdoxycfg.pro libmd5/libmd5.pro
+ -rm -f src/version.cpp
+ -rm -r addon/doxywizard/Makefile
+ -rm -f addon/doxywizard/doxywizard.pro
+ -rm -f VERSION
+ -rm -f packages/rpm/doxygen.spec
+
+DATE=$(shell date "+%B %Y")
+
+MAN1DIR = man/man1
+
+install: doxywizard_install
+ $(INSTTOOL) -d $(DESTDIR)/$(INSTALL)/bin
+ $(INSTTOOL) -m 755 bin/doxygen $(DESTDIR)/$(INSTALL)/bin
+ $(INSTTOOL) -m 755 bin/doxytag $(DESTDIR)/$(INSTALL)/bin
+ $(INSTTOOL) -d $(DESTDIR)/$(INSTALL)/$(MAN1DIR)
+ cat doc/doxygen.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > doxygen.1
+ $(INSTTOOL) -m 644 doxygen.1 $(DESTDIR)/$(INSTALL)/$(MAN1DIR)/doxygen.1
+ rm doxygen.1
+ cat doc/doxytag.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > doxytag.1
+ $(INSTTOOL) -m 644 doxytag.1 $(DESTDIR)/$(INSTALL)/$(MAN1DIR)/doxytag.1
+ rm doxytag.1
+
+install_docs:
+ $(INSTTOOL) -d $(DESTDIR)/$(DOCDIR)
+ $(MAKE) -C examples
+ $(MAKE) -C doc
+ $(MAKE) -C latex
+ $(INSTTOOL) -m 644 latex/doxygen_manual.pdf $(DESTDIR)/$(DOCDIR)
+ cp -r examples $(DESTDIR)/$(DOCDIR)
+ cp -r html $(DESTDIR)/$(DOCDIR)
+
+docs: FORCE
+ cd examples ; $(MAKE)
+ cd doc ; $(MAKE)
+
+pdf: docs
+ cd latex ; $(MAKE)
+
+DISTFILES = Doxyfile libmd5 addon tmake doc examples bin lib objects \
+ qtools src configure configure.bin Makefile.in Makefile.win_nmake.in \
+ Makefile.win_make.in INSTALL LANGUAGE.HOWTO LICENSE PLATFORMS \
+ VERSION packages winbuild
+
+archive: clean
+ tar zcvf dx`date +%y%m%d`.tgz $(DISTFILES)
+
+DISTDIR = doxygen-`echo $(VERSION) | tr - _`
+
+dist: clean
+ rm -rf $(DISTDIR)
+ mkdir $(DISTDIR)
+ cp -a $(DISTFILES) README $(DISTDIR)
+ find $(DISTDIR) \( -name ".svn" \) -print0 | xargs -0 rm -rf
+ tar zcvf $(DISTDIR).src.tar.gz $(DISTDIR)
+ rm -rf $(DISTDIR)
+
+src/version.cpp: Makefile
+ echo "char versionString[]=\"$(VERSION)\";" > src/version.cpp
+
+addon/doxywizard/version.cpp: Makefile
+ echo "char versionString[]=\"$(VERSION)\";" > addon/doxywizard/version.cpp
+
+DISTDIR = doxygen-`echo $(VERSION) | tr - _`
+rpm: dist
+ gzip -df $(DISTDIR).src.tar.gz
+ mkdir $(DISTDIR)
+ mkdir $(DISTDIR)/packages
+ mkdir $(DISTDIR)/packages/rpm
+ cp packages/rpm/doxygen.spec $(DISTDIR)/packages/rpm
+ rm -rf $(DISTDIR)
+ gzip -9v $(DISTDIR).src.tar
+ rpmbuild -ta %%WITHDOXYWIZARD%% $(DISTDIR).src.tar.gz
+
+rpmsrc: dist
+ gzip -df $(DISTDIR).src.tar.gz
+ mkdir $(DISTDIR)
+ mkdir $(DISTDIR)/packages
+ mkdir $(DISTDIR)/packages/rpm
+ cp packages/rpm/doxygen.spec $(DISTDIR)/packages/rpm
+ tar -rvf $(DISTDIR).src.tar $(DISTDIR)/packages/rpm/doxygen.spec
+ rm -rf $(DISTDIR)
+ gzip -9v $(DISTDIR).src.tar
+ rpmbuild -ts %%WITHDOXYWIZARD%% $(DISTDIR).src.tar.gz
+
+rpmbinary: dist
+ gzip -df $(DISTDIR).src.tar.gz
+ mkdir $(DISTDIR)
+ mkdir $(DISTDIR)/packages
+ mkdir $(DISTDIR)/packages/rpm
+ cp packages/rpm/doxygen.spec $(DISTDIR)/packages/rpm
+ tar -rvf $(DISTDIR).src.tar $(DISTDIR)/packages/rpm/doxygen.spec
+ rm -rf $(DISTDIR)
+ gzip -9v $(DISTDIR).src.tar
+ rpmbuild -tb %%WITHDOXYWIZARD%% $(DISTDIR).src.tar.gz
+
+
+ctags:
+ ctags -f tags src addon/doxywizard qtools
+
+FORCE:
+
diff --git a/Makefile.win_make.in b/Makefile.win_make.in
new file mode 100644
index 0000000..d3f270b
--- /dev/null
+++ b/Makefile.win_make.in
@@ -0,0 +1,32 @@
+all: src\version.cpp
+ set TMAKEPATH=$(TMAKEPATH) & cd qtools & $(MAKE)
+ set TMAKEPATH=$(TMAKEPATH) & cd libmd5 & $(MAKE)
+ set TMAKEPATH=$(TMAKEPATH) & cd src & $(MAKE)
+
+clean:
+ cd examples & $(MAKE) clean
+ cd doc & $(MAKE) clean
+ cd src & $(MAKE) clean
+ -del bin\doxy*.*
+ -del objects\*.o
+
+distclean: clean
+ -del src\Makefile.libdoxygen \
+ src\Makefile.doxygen \
+ src\Makefile.doxytag \
+ src\Makefile.libdoxycfg
+ -del Makefile src\Makefile examples\Makefile doc\Makefile
+ -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\libdoxycfg.pro
+ -del src\version.cpp
+
+docs:
+ set TMAKEPATH=$(TMAKEPATH) & cd examples & $(MAKE)
+ set TMAKEPATH=$(TMAKEPATH) & cd doc & $(MAKE)
+
+ps: docs
+ cd latex & $(MAKE)
+
+src\version.cpp: Makefile
+ echo char versionString[]="""$(VERSION)"""; > src\version.cpp
+
+FORCE:
diff --git a/Makefile.win_nmake.in b/Makefile.win_nmake.in
new file mode 100644
index 0000000..46dad89
--- /dev/null
+++ b/Makefile.win_nmake.in
@@ -0,0 +1,49 @@
+all: src\version.cpp
+ set TMAKEPATH=$(TMAKEPATH)
+ cd qtools
+ $(MAKE)
+ cd ..
+ cd libmd5
+ $(MAKE)
+ cd ..
+ cd src
+ $(MAKE)
+
+clean: FORCE
+ cd examples
+ $(MAKE) clean
+ cd ..
+ cd doc
+ $(MAKE) clean
+ cd ..
+ cd src
+ $(MAKE) clean
+ cd ..
+ -del bin\doxy*.*
+ -del objects\*.o
+
+distclean: clean
+ -del src\Makefile.libdoxygen \
+ src\Makefile.doxygen \
+ src\Makefile.doxytag \
+ src\Makefile.libdoxycfg
+ -del Makefile src\Makefile examples\Makefile doc\Makefile
+ -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\libdoxycfg.pro
+ -del src\version.cpp
+
+docs: FORCE
+ cd examples
+ $(MAKE)
+ cd ..
+ cd doc
+ $(MAKE)
+ cd ..
+
+ps: docs
+ cd latex
+ $(MAKE)
+
+src\version.cpp: Makefile
+ echo char versionString[]="$(VERSION)"; > src\version.cpp
+
+FORCE:
diff --git a/PLATFORMS b/PLATFORMS
new file mode 100644
index 0000000..c358a1d
--- /dev/null
+++ b/PLATFORMS
@@ -0,0 +1,31 @@
+aix-g++
+aix-xlc
+beos-g++
+dgux-g++
+freebsd-g++
+gnu-g++
+hpux-acc
+hpux-cc
+hpux-g++
+irix-64
+irix-dcc
+irix-g++
+irix-n32
+linux-g++
+linux-64
+macosx-c++
+macosx-uni-c++
+m68k-atari-mint-g++
+netbsd-g++
+openbsd-g++
+osf1-cxx
+osf1-g++
+qnx-g++
+sco-g++
+solaris-cc
+solaris-cc-64
+solaris-g++
+sunos-g++
+ultrix-g++
+unixware-g++
+win32-g++
diff --git a/README b/README
new file mode 100644
index 0000000..acb5590
--- /dev/null
+++ b/README
@@ -0,0 +1,29 @@
+DOXYGEN Version 1.7.4
+
+Please read INSTALL for compilation instructions.
+
+The latest version of doxygen can be obtained from:
+ http://www.doxygen.org/
+
+There are three mailing lists:
+ doxygen-users@lists.sourceforge.net For doxygen users
+ doxygen-develop@lists.sourceforge.net For doxygen developers
+ doxygen-announce@lists.sourceforge.net Announcement of new releases only
+
+please follow the link in
+
+ http://sourceforge.net/projects/doxygen
+
+to subscribe to the lists or to visit the archives.
+
+Use the bug tracker to report bugs:
+
+ https://bugzilla.gnome.org/enter_bug.cgi?product=doxygen
+
+Before reporting a bug, please check that it has not already been reported.
+Also, please use the bug tracker for reporting bugs rather than the help
+forum.
+
+Enjoy,
+
+Dimitri van Heesch (dimitri@stack.nl) (28 March 2011)
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..10c0880
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+1.7.4
diff --git a/addon/doxmlparser/Doxyfile b/addon/doxmlparser/Doxyfile
new file mode 100644
index 0000000..faf4bee
--- /dev/null
+++ b/addon/doxmlparser/Doxyfile
@@ -0,0 +1,177 @@
+# Doxyfile 1.2.12-20011209
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = doxmlparser
+PROJECT_NUMBER =
+OUTPUT_DIRECTORY = doc
+OUTPUT_LANGUAGE = English
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+INTERNAL_DOCS = NO
+STRIP_CODE_COMMENTS = YES
+CASE_SENSE_NAMES = YES
+SHORT_NAMES = NO
+HIDE_SCOPE_NAMES = NO
+VERBATIM_HEADERS = YES
+SHOW_INCLUDE_FILES = YES
+JAVADOC_AUTOBRIEF = NO
+INHERIT_DOCS = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+ALIASES =
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+OPTIMIZE_OUTPUT_FOR_C = NO
+SHOW_USED_FILES = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_FORMAT =
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = include
+FILE_PATTERNS = *.h
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_SOURCE_FILES = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = 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_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = NO
+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 = NO
+LATEX_OUTPUT =
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT =
+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_EXTENSION =
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# 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::addtions related to external references
+#---------------------------------------------------------------------------
+TAGFILES = ../../qtools_docs/qtools.tag=../../../../qtools_docs/html
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+PERL_PATH =
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = NO
+HAVE_DOT = NO
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+TEMPLATE_RELATIONS = YES
+HIDE_UNDOC_RELATIONS = YES
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+GRAPHICAL_HIERARCHY = YES
+DOT_PATH =
+DOTFILE_DIRS =
+MAX_DOT_GRAPH_WIDTH = 1280
+MAX_DOT_GRAPH_HEIGHT = 1024
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
+CGI_NAME =
+CGI_URL =
+DOC_URL =
+DOC_ABSPATH =
+BIN_ABSPATH =
+EXT_DOC_PATHS =
diff --git a/addon/doxmlparser/Doxyfile.impl b/addon/doxmlparser/Doxyfile.impl
new file mode 100644
index 0000000..a954db3
--- /dev/null
+++ b/addon/doxmlparser/Doxyfile.impl
@@ -0,0 +1,179 @@
+# Doxyfile 1.2.13.1
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = doxmlparser
+PROJECT_NUMBER =
+OUTPUT_DIRECTORY = doc_impl
+OUTPUT_LANGUAGE = English
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = NO
+STRIP_FROM_PATH =
+INTERNAL_DOCS = NO
+STRIP_CODE_COMMENTS = YES
+CASE_SENSE_NAMES = YES
+SHORT_NAMES = NO
+HIDE_SCOPE_NAMES = NO
+VERBATIM_HEADERS = YES
+SHOW_INCLUDE_FILES = YES
+JAVADOC_AUTOBRIEF = NO
+INHERIT_DOCS = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+ALIASES =
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+OPTIMIZE_OUTPUT_FOR_C = NO
+SHOW_USED_FILES = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_FORMAT =
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = src
+FILE_PATTERNS =
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_SOURCE_FILES = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = 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_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = NO
+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 = NO
+LATEX_OUTPUT =
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT =
+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_EXTENSION =
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED = DEFINE_CLS_IMPL
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+TAGFILES = ../../qtools_docs/qtools.tag=../../../../qtools_docs/html
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH =
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = NO
+HAVE_DOT = YES
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+TEMPLATE_RELATIONS = YES
+HIDE_UNDOC_RELATIONS = YES
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+GRAPHICAL_HIERARCHY = YES
+DOT_PATH =
+DOTFILE_DIRS =
+MAX_DOT_GRAPH_WIDTH = 1280
+MAX_DOT_GRAPH_HEIGHT = 1024
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
+CGI_NAME =
+CGI_URL =
+DOC_URL =
+DOC_ABSPATH =
+BIN_ABSPATH =
+EXT_DOC_PATHS =
diff --git a/addon/doxmlparser/examples/metrics/Makefile b/addon/doxmlparser/examples/metrics/Makefile
new file mode 100644
index 0000000..5156587
--- /dev/null
+++ b/addon/doxmlparser/examples/metrics/Makefile
@@ -0,0 +1,33 @@
+#
+# This file was generated from Makefile.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+DOXYGEN = /Users/dimitri/doxygen
+TMAKEPATH = /Users/dimitri/doxygen/tmake/lib/macosx-c++
+ENV = env TMAKEPATH=$(TMAKEPATH)
+TMAKE = /Users/dimitri/doxygen/tmake/bin/tmake
+MAKE = /opt/local/bin/gmake
+PERL = /opt/local/bin/perl
+RM = rm -f
+CP = cp
+VERSION = 1.7.3
+INSTALL = /usr/local
+INSTTOOL = /opt/local/bin/ginstall
+DOXYDOCS = ..
+DOCDIR = $(INSTALL)/share/doc/packages/doxygen
+QTDIR = /usr
+HAVE_DOT = /usr/local/bin/dot
+MKSPECS = -spec macx-g++
+all clean depend: Makefile.metrics
+ $(MAKE) -f Makefile.metrics $@
+
+distclean: clean
+ $(RM) -rf Makefile.metrics metrics.pro Makefile obj
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) metrics.pro >Makefile.metrics
+
+Makefile.metrics: metrics.pro
+ $(ENV) $(PERL) $(TMAKE) metrics.pro >Makefile.metrics
+
+install:
diff --git a/addon/doxmlparser/examples/metrics/Makefile.in b/addon/doxmlparser/examples/metrics/Makefile.in
new file mode 100644
index 0000000..83cbc28
--- /dev/null
+++ b/addon/doxmlparser/examples/metrics/Makefile.in
@@ -0,0 +1,13 @@
+all clean depend: Makefile.metrics
+ $(MAKE) -f Makefile.metrics $@
+
+distclean: clean
+ $(RM) -rf Makefile.metrics metrics.pro Makefile obj
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) metrics.pro >Makefile.metrics
+
+Makefile.metrics: metrics.pro
+ $(ENV) $(PERL) $(TMAKE) metrics.pro >Makefile.metrics
+
+install:
diff --git a/addon/doxmlparser/examples/metrics/Makefile.metrics b/addon/doxmlparser/examples/metrics/Makefile.metrics
new file mode 100644
index 0000000..f9bfc77
--- /dev/null
+++ b/addon/doxmlparser/examples/metrics/Makefile.metrics
@@ -0,0 +1,77 @@
+#############################################################################
+# Makefile for building metrics
+# Generated by tmake at 15:12, 2011/03/28
+# Project: metrics
+# Template: app.t
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cc
+CXX = c++
+CFLAGS = -pipe -Wall -W -g -fstack-protector
+CXXFLAGS= -pipe -D__FreeBSD__=6 -Wall -W -g -fstack-protector
+INCPATH = -I../../../../qtools -I../../include
+LINK = c++
+LFLAGS = -Wl,-search_paths_first
+LIBS = -L../../../../lib -L../../lib -ldoxmlparser -lqtools -liconv -framework CoreServices
+MOC = /usr/bin/moc
+
+TAR = tar -cf
+GZIP = gzip -9f
+
+####### Files
+
+HEADERS =
+SOURCES = main.cpp
+OBJECTS = obj/main.o
+SRCMOC =
+OBJMOC =
+DIST =
+TARGET = metrics
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .C .c
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+####### Build rules
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(OBJMOC) ../../lib/libdoxmlparser.a
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
+
+moc: $(SRCMOC)
+
+tmake:
+ tmake metrics.pro
+
+dist:
+ $(TAR) metrics.tar metrics.pro $(SOURCES) $(HEADERS) $(DIST)
+ $(GZIP) metrics.tar
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
+ -rm -f *~ core
+
+####### Compile
+
+obj/main.o: main.cpp \
+ ../../include/doxmlintf.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/main.o main.cpp
+
diff --git a/addon/doxmlparser/examples/metrics/main.cpp b/addon/doxmlparser/examples/metrics/main.cpp
new file mode 100644
index 0000000..4aa6d57
--- /dev/null
+++ b/addon/doxmlparser/examples/metrics/main.cpp
@@ -0,0 +1,254 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+/*! \mainpage Metrics
+ * This is a small example that shows how to use doxygen's XML output and
+ * the doxmlparser library. The example shows some very basic code metrics.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <doxmlintf.h>
+
+bool isDocumented(IDocRoot *brief,IDocRoot *detailed)
+{
+ bool found=false;
+ if (brief)
+ {
+ IDocIterator *docIt = brief->contents();
+ if (docIt->current()) // method has brief description
+ {
+ found=true;
+ }
+ docIt->release();
+ }
+ if (detailed && !found)
+ {
+ IDocIterator *docIt = detailed->contents();
+ if (docIt->current())
+ {
+ found=true;
+ }
+ docIt->release();
+ }
+ return found;
+}
+
+int main(int argc,char **argv)
+{
+ if (argc!=2)
+ {
+ printf("Usage: %s xml_output_dir\n",argv[0]);
+ exit(1);
+ }
+
+ int numClasses=0;
+ int numDocClasses=0;
+ int numStructs=0;
+ int numUnions=0;
+ int numInterfaces=0;
+ int numExceptions=0;
+ int numNamespaces=0;
+ int numFiles=0;
+ int numGroups=0;
+ int numPages=0;
+ int numPackages=0;
+ int numPubMethods=0;
+ int numProMethods=0;
+ int numPriMethods=0;
+ int numDocPubMethods=0;
+ int numDocProMethods=0;
+ int numDocPriMethods=0;
+ int numFunctions=0;
+ int numAttributes=0;
+ int numVariables=0;
+ int numDocFunctions=0;
+ int numDocAttributes=0;
+ int numDocVariables=0;
+ int numParams=0;
+
+ IDoxygen *dox = createObjectModel();
+
+ dox->setDebugLevel(0);
+
+ if (!dox->readXMLDir(argv[1]))
+ {
+ printf("Error reading %s/index.xml\n",argv[1]);
+ exit(1);
+ }
+
+ ICompoundIterator *cli = dox->compounds();
+ ICompound *comp;
+ for (cli->toFirst();(comp=cli->current());cli->toNext())
+ {
+ printf("Processing %s...\n",comp->name()->latin1());
+ bool hasDocs = isDocumented(comp->briefDescription(),comp->detailedDescription());
+ switch (comp->kind())
+ {
+ case ICompound::Class:
+ numClasses++;
+ if (hasDocs) numDocClasses++;
+ break;
+ case ICompound::Struct: numStructs++; break;
+ case ICompound::Union: numUnions++; break;
+ case ICompound::Interface: numInterfaces++; break;
+ case ICompound::Exception: numExceptions++; break;
+ case ICompound::Namespace: numNamespaces++; break;
+ case ICompound::File: numFiles++; break;
+ case ICompound::Group: numGroups++; break;
+ case ICompound::Page: numPages++; break;
+ default: break;
+ }
+
+ ISectionIterator *sli = comp->sections();
+ ISection *sec;
+ for (sli->toFirst();(sec=sli->current());sli->toNext())
+ {
+ IMemberIterator *mli = sec->members();
+ IMember *mem;
+ for (mli->toFirst();(mem=mli->current());mli->toNext())
+ {
+ IParamIterator *pli = mem->parameters();
+ IParam *par;
+ if (comp->kind()==ICompound::Class ||
+ comp->kind()==ICompound::Struct ||
+ comp->kind()==ICompound::Interface
+ )
+ {
+ if (mem->kind()==IMember::Function ||
+ mem->kind()==IMember::Prototype ||
+ mem->kind()==IMember::Signal ||
+ mem->kind()==IMember::Slot ||
+ mem->kind()==IMember::DCOP
+ ) // is a "method"
+ {
+ if (mem->section()->isPublic())
+ {
+ numPubMethods++;
+ if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
+ {
+ numDocPubMethods++;
+ }
+ }
+ else if (mem->section()->isProtected())
+ {
+ numProMethods++;
+ if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
+ {
+ numDocProMethods++;
+ }
+ }
+ else if (mem->section()->isPrivate())
+ {
+ numPriMethods++;
+ if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
+ {
+ numDocPriMethods++;
+ }
+ }
+ }
+ else if (mem->kind()==IMember::Variable ||
+ mem->kind()==IMember::Property
+ ) // is an "attribute"
+ {
+ numAttributes++;
+ if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
+ {
+ numDocAttributes++;
+ }
+ }
+ }
+ else if (comp->kind()==ICompound::File ||
+ comp->kind()==ICompound::Namespace
+ )
+ {
+ if (mem->kind()==IMember::Function ||
+ mem->kind()==IMember::Prototype ||
+ mem->kind()==IMember::Signal ||
+ mem->kind()==IMember::Slot ||
+ mem->kind()==IMember::DCOP
+ ) // is a "method"
+ {
+ numFunctions++;
+ if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
+ {
+ numDocFunctions++;
+ }
+ }
+ else if (mem->kind()==IMember::Variable ||
+ mem->kind()==IMember::Property
+ ) // is an "attribute"
+ {
+ numVariables++;
+ if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
+ {
+ numDocVariables++;
+ }
+ }
+ }
+
+ for (pli->toFirst();(par=pli->current());pli->toNext())
+ {
+ numParams++;
+ }
+ const char *type = mem->typeString()->latin1();
+ if (type && strcmp(type, "void"))
+ {
+ numParams++; // count non-void return types as well
+ }
+ pli->release();
+ }
+ mli->release();
+ }
+ sli->release();
+
+ comp->release();
+ }
+ cli->release();
+
+ dox->release();
+
+ int numMethods = numPubMethods+numProMethods+numPriMethods;
+ int numDocMethods = numDocPubMethods+numDocProMethods+numDocPriMethods;
+
+ printf("Metrics:\n");
+ printf("-----------------------------------\n");
+ if (numClasses>0) printf("Classes: %10d (%d documented)\n",numClasses,numDocClasses);
+ if (numStructs>0) printf("Structs: %10d\n",numStructs);
+ if (numUnions>0) printf("Unions: %10d\n",numUnions);
+ if (numInterfaces>0) printf("Interfaces: %10d\n",numInterfaces);
+ if (numExceptions>0) printf("Exceptions: %10d\n",numExceptions);
+ if (numNamespaces>0) printf("Namespaces: %10d\n",numNamespaces);
+ if (numFiles>0) printf("Files: %10d\n",numFiles);
+ if (numGroups>0) printf("Groups: %10d\n",numGroups);
+ if (numPages>0) printf("Pages: %10d\n",numPages);
+ if (numPackages>0) printf("Packages: %10d\n",numPackages);
+ if (numMethods>0) printf("Methods: %10d (%d documented)\n",numMethods,numDocMethods);
+ if (numPubMethods>0) printf(" Public: %10d (%d documented)\n",numPubMethods,numDocPubMethods);
+ if (numProMethods>0) printf(" Protected: %10d (%d documented)\n",numProMethods,numDocProMethods);
+ if (numPriMethods>0) printf(" Private: %10d (%d documented)\n",numPriMethods,numDocPriMethods);
+ if (numFunctions>0) printf("Functions: %10d (%d documented)\n",numFunctions,numDocFunctions);
+ if (numAttributes>0) printf("Attributes: %10d (%d documented)\n",numAttributes,numDocAttributes);
+ if (numVariables>0) printf("Variables: %10d (%d documented)\n",numVariables,numDocVariables);
+ if (numParams>0) printf("Params: %10d\n",numParams);
+ printf("-----------------------------------\n");
+ if (numClasses>0) printf("Avg. #methods/compound: %10f\n",(double)numMethods/(double)numClasses);
+ if (numMethods>0) printf("Avg. #params/method: %10f\n",(double)numParams/(double)numMethods);
+ printf("-----------------------------------\n");
+
+ return 0;
+}
+
diff --git a/addon/doxmlparser/examples/metrics/metrics.pro b/addon/doxmlparser/examples/metrics/metrics.pro
new file mode 100644
index 0000000..3439f38
--- /dev/null
+++ b/addon/doxmlparser/examples/metrics/metrics.pro
@@ -0,0 +1,25 @@
+#
+# This file was generated from metrics.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+TEMPLATE = app.t
+CONFIG = console warn_on debug
+HEADERS =
+SOURCES = main.cpp
+unix:LIBS += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
+win32-msvc:LIBS += doxmlparser.lib qtools.lib shell32.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\..\..\..\lib;..\..\lib
+win32-borland:LIBS += doxmlparser.lib qtools.lib shell32.lib
+win32-borland:TMAKE_LFLAGS += -L..\..\..\..\lib -L..\..\lib
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+DESTDIR =
+OBJECTS_DIR = obj
+TARGET = metrics
+DEPENDPATH = ../../include
+INCLUDEPATH += ../../../../qtools ../../include
+unix:TARGETDEPS = ../../lib/libdoxmlparser.a
+win32:TARGETDEPS = ..\..\lib\doxmlparser.lib
+
+TMAKE_MOC = /usr/bin/moc
diff --git a/addon/doxmlparser/examples/metrics/metrics.pro.in b/addon/doxmlparser/examples/metrics/metrics.pro.in
new file mode 100644
index 0000000..6dd344f
--- /dev/null
+++ b/addon/doxmlparser/examples/metrics/metrics.pro.in
@@ -0,0 +1,20 @@
+TEMPLATE = app.t
+CONFIG = console warn_on $extraopts
+HEADERS =
+SOURCES = main.cpp
+unix:LIBS += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
+win32-msvc:LIBS += doxmlparser.lib qtools.lib shell32.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\..\..\..\lib;..\..\lib
+win32-borland:LIBS += doxmlparser.lib qtools.lib shell32.lib
+win32-borland:TMAKE_LFLAGS += -L..\..\..\..\lib -L..\..\lib
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+DESTDIR =
+OBJECTS_DIR = obj
+TARGET = metrics
+DEPENDPATH = ../../include
+INCLUDEPATH += ../../../../qtools ../../include
+unix:TARGETDEPS = ../../lib/libdoxmlparser.a
+win32:TARGETDEPS = ..\..\lib\doxmlparser.lib
+
diff --git a/addon/doxmlparser/include/doxmlintf.h b/addon/doxmlparser/include/doxmlintf.h
new file mode 100644
index 0000000..59c1294
--- /dev/null
+++ b/addon/doxmlparser/include/doxmlintf.h
@@ -0,0 +1,1134 @@
+/******************************************************************************
+ *
+ * $Id: doxmlintf.h,v 1.29 2002/10/13 21:01:58 dimitri Exp $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _DOXMLINTF_H
+#define _DOXMLINTF_H
+
+/*! \file
+ * \brief The interface to the object model provided by the XML parser
+ * library.
+ *
+ * To start using this library one calls createObjectModel() and then
+ * uses the returned IDoxygen interface to read doxygen generated
+ * XML output and navigate through the information contained in it.
+ *
+ * @see createObjectModel()
+ */
+
+class IMember;
+class IDocIterator;
+class ICompound;
+class ISection;
+class INode;
+class IDocInternal;
+class IDocRoot;
+
+#define VIRTUAL_DESTRUCTOR(x) virtual ~x() {}
+
+/*! \brief Read only interface to a string.
+ */
+class IString
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IString)
+ /*! Returns a latin1 character representation of the string. */
+ virtual const char *latin1() const = 0;
+ /*! Returns a utf8 character representation of the string. */
+ virtual const char *utf8() const = 0;
+ /*! Returns a 16-bit unicode character representation of the character at
+ * position \a index in the string. The first character is at index 0.
+ */
+ virtual unsigned short unicodeCharAt(int index) const = 0;
+ /*! Returns true if this string is empty or false otherwise */
+ virtual bool isEmpty() const = 0;
+ /*! Returns the number of characters in the string. */
+ virtual int length() const = 0;
+};
+
+/*! \brief Base interface for hyperlinked text
+ *
+ * Depending on the result of kind() the interface is extended by
+ * ILT_Text or ILT_Ref.
+ */
+class ILinkedText
+{
+ public:
+ VIRTUAL_DESTRUCTOR(ILinkedText)
+ enum Kind { Kind_Text, Kind_Ref };
+ virtual Kind kind() const = 0;
+};
+
+/*! \brief Plain text fragment.
+ */
+class ILT_Text : public ILinkedText
+{
+ public:
+ VIRTUAL_DESTRUCTOR(ILT_Text)
+ virtual const IString *text() const = 0;
+};
+
+/*! \brief Reference to an object.
+ */
+class ILT_Ref : public ILinkedText
+{
+ public:
+ VIRTUAL_DESTRUCTOR(ILT_Ref)
+ enum TargetKind { Member, Compound };
+ virtual const IString *id() const = 0;
+ virtual TargetKind targetKind() const = 0;
+ virtual const IString *external() const = 0;
+ virtual const IString *text() const = 0;
+};
+
+/*! \brief Iterates over a list of ILinkedText fragments.
+ */
+class ILinkedTextIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(ILinkedTextIterator)
+ virtual ILinkedText *toFirst() = 0;
+ virtual ILinkedText *toLast() = 0;
+ virtual ILinkedText *toNext() = 0;
+ virtual ILinkedText *toPrev() = 0;
+ virtual ILinkedText *current() const = 0;
+ virtual void release() = 0;
+};
+
+/*! \brief Representation of a parameter of a function. */
+class IParam
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IParam)
+ virtual ILinkedTextIterator *type() const = 0;
+ virtual const IString * declarationName() const = 0;
+ virtual const IString * definitionName() const = 0;
+ virtual const IString * attrib() const = 0;
+ virtual const IString * arraySpecifier() const = 0;
+ virtual ILinkedTextIterator *defaultValue() const = 0;
+ virtual IDocRoot *briefDescription() const = 0;
+};
+
+class IParamIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IParamIterator)
+ virtual IParam *toFirst() = 0;
+ virtual IParam *toLast() = 0;
+ virtual IParam *toNext() = 0;
+ virtual IParam *toPrev() = 0;
+ virtual IParam *current() const = 0;
+ virtual void release() = 0;
+};
+
+class IMemberReference
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IMemberReference)
+ virtual IMember *member() const = 0;
+ virtual const IString * name() const = 0;
+ virtual const IString * scope() const = 0;
+ virtual const IString * protection() const = 0;
+ virtual const IString * virtualness() const = 0;
+ virtual const IString * ambiguityScope() const = 0;
+};
+
+class IMemberReferenceIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IMemberReferenceIterator)
+ virtual IMemberReference *toFirst() = 0;
+ virtual IMemberReference *toLast() = 0;
+ virtual IMemberReference *toNext() = 0;
+ virtual IMemberReference *toPrev() = 0;
+ virtual IMemberReference *current() const = 0;
+ virtual void release() = 0;
+};
+
+class IDoc
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IDoc)
+ enum Kind
+ {
+ Invalid = 0, // 0
+ Para, // 1 -> IDocPara
+ Text, // 2 -> IDocText
+ MarkupModifier, // 3 -> IDocMarkupModifier
+ ItemizedList, // 4 -> IDocItemizedList
+ OrderedList, // 5 -> IDocOrderedList
+ ListItem, // 6 -> IDocListItem
+ ParameterList, // 7 -> IDocParameterList
+ Parameter, // 8 -> IDocParameter
+ SimpleSect, // 9 -> IDocSimpleSect
+ Title, // 10 -> IDocTitle
+ Ref, // 11 -> IDocRef
+ VariableList, // 12 -> IDocVariableList
+ VariableListEntry, // 13 -> IDocVariableListEntry
+ HRuler, // 14 -> IDocHRuler
+ LineBreak, // 15 -> IDocLineBreak
+ ULink, // 16 -> IDocULink
+ EMail, // 17 -> IDocEMail
+ Link, // 18 -> IDocLink
+ ProgramListing, // 19 -> IDocProgramListing
+ CodeLine, // 20 -> IDocCodeLine
+ Highlight, // 21 -> IDocHighlight
+ Formula, // 22 -> IDocFormula
+ Image, // 23 -> IDocImage
+ DotFile, // 24 -> IDocDotFile
+ IndexEntry, // 25 -> IDocIndexEntry
+ Table, // 26 -> IDocTable
+ Row, // 27 -> IDocRow
+ Entry, // 28 -> IDocEntry
+ Section, // 29 -> IDocSection
+ Verbatim, // 30 -> IDocVerbatim
+ Copy, // 31 -> IDocCopy
+ TocList, // 32 -> IDocTocList
+ TocItem, // 33 -> IDocTocItem
+ Anchor, // 34 -> IDocAnchor
+ Symbol, // 35 -> IDocSymbol
+ Internal, // 36 -> IDocInternal
+ Root, // 37 -> IDocRoot
+ ParameterItem // 38 -> IDocParameterItem
+ };
+ virtual Kind kind() const = 0;
+};
+
+class IDocMarkup : public IDoc
+{
+ public:
+ enum Markup
+ {
+ Normal = 0x000,
+ Bold = 0x001,
+ Emphasis = 0x002,
+ ComputerOutput = 0x004,
+ Subscript = 0x008,
+ Superscript = 0x010,
+ SmallFont = 0x020,
+ Center = 0x040,
+ Preformatted = 0x080,
+ Heading = 0x100
+ };
+};
+
+class IDocPara : public IDoc
+{
+ public:
+ virtual IDocIterator *contents() const = 0;
+};
+
+class IDocText : public IDocMarkup
+{
+ public:
+ virtual const IString * text() const = 0;
+ virtual int markup() const = 0;
+ virtual int headingLevel() const = 0;
+};
+
+class IDocMarkupModifier : public IDoc
+{
+ public:
+ virtual bool enabled() const = 0;
+ virtual int markup() const = 0;
+ virtual int headingLevel() const = 0;
+};
+
+class IDocItemizedList : public IDoc
+{
+ public:
+ virtual IDocIterator *elements() const = 0;
+};
+
+class IDocOrderedList : public IDoc
+{
+ public:
+ virtual IDocIterator *elements() const = 0;
+};
+
+class IDocListItem : public IDoc
+{
+ public:
+ virtual IDocIterator *contents() const = 0;
+};
+
+class IDocParameterList : public IDoc
+{
+ public:
+ enum Types { Param, RetVal, Exception };
+ virtual Types sectType() const = 0;
+ virtual IDocIterator *params() const = 0;
+};
+
+class IDocParameterItem : public IDoc
+{
+ public:
+ virtual IDocIterator *paramNames() const = 0;
+ virtual IDocPara *description() const = 0;
+};
+
+class IDocParameter : public IDoc
+{
+ public:
+ virtual const IString * name() const = 0;
+};
+
+class IDocTitle : public IDoc
+{
+ public:
+ virtual IDocIterator *title() const = 0;
+};
+
+class IDocSimpleSect : public IDoc
+{
+ public:
+ enum Types { Invalid = 0,
+ See, Return, Author, Version,
+ Since, Date, Bug, Note,
+ Warning, Par, Deprecated, Pre,
+ Post, Invar, Remark, Attention,
+ Todo, Test, RCS, EnumValues,
+ Examples
+ };
+ virtual Types type() const = 0;
+ virtual const IString * typeString() const = 0;
+ virtual IDocTitle *title() const = 0;
+ virtual IDocPara *description() const = 0;
+};
+
+class IDocRef : public IDoc
+{
+ public:
+ enum TargetKind { Member, Compound };
+ virtual const IString * refId() const = 0;
+ virtual TargetKind targetKind() const = 0;
+ virtual const IString * external() const = 0;
+ virtual const IString * text() const = 0;
+};
+
+class IDocVariableList : public IDoc
+{
+ public:
+ virtual IDocIterator *entries() const = 0;
+};
+
+class IDocVariableListEntry : public IDoc
+{
+ public:
+ virtual ILinkedTextIterator * term() const = 0;
+ virtual IDocPara *description() const = 0;
+};
+
+class IDocHRuler : public IDoc
+{
+};
+
+class IDocLineBreak : public IDoc
+{
+};
+
+class IDocULink : public IDoc
+{
+ public:
+ virtual const IString * url() const = 0;
+ virtual const IString * text() const = 0;
+};
+
+class IDocEMail : public IDoc
+{
+ public:
+ virtual const IString * address() const = 0;
+};
+
+class IDocLink : public IDoc
+{
+ public:
+ virtual const IString * refId() const = 0;
+ virtual const IString * text() const = 0;
+};
+
+class IDocProgramListing : public IDoc
+{
+ public:
+ virtual IDocIterator *codeLines() const = 0;
+};
+
+class IDocCodeLine : public IDoc
+{
+ public:
+ virtual int lineNumber() const = 0;
+ virtual const IString * refId() const = 0;
+ virtual IDocIterator *codeElements() const = 0;
+};
+
+class IDocHighlight : public IDoc
+{
+ public:
+ enum HighlightKind
+ { Invalid=0,
+ Comment, Keyword,
+ KeywordType, KeywordFlow, CharLiteral,
+ StringLiteral, Preprocessor
+ };
+ virtual HighlightKind highlightKind() const = 0;
+ virtual IDocIterator *codeElements() const = 0;
+};
+
+class IDocFormula : public IDoc
+{
+ public:
+ virtual const IString * id() const = 0;
+ virtual const IString * text() const = 0;
+};
+
+class IDocImage : public IDoc
+{
+ public:
+ virtual const IString * name() const = 0;
+ virtual const IString * caption() const = 0;
+};
+
+class IDocDotFile : public IDoc
+{
+ public:
+ virtual const IString * name() const = 0;
+ virtual const IString * caption() const = 0;
+};
+
+class IDocIndexEntry : public IDoc
+{
+ public:
+ virtual const IString * primary() const = 0;
+ virtual const IString * secondary() const = 0;
+};
+
+class IDocTable : public IDoc
+{
+ public:
+ virtual IDocIterator *rows() const = 0;
+ virtual int numColumns() const = 0;
+ virtual const IString * caption() const = 0;
+};
+
+class IDocRow : public IDoc
+{
+ public:
+ virtual IDocIterator *entries() const = 0;
+};
+
+class IDocEntry : public IDoc
+{
+ public:
+ virtual IDocIterator *contents() const = 0;
+};
+
+class IDocSection : public IDoc
+{
+ public:
+ virtual const IString * id() const = 0;
+ virtual int level() const = 0;
+ virtual IDocTitle *title() const = 0;
+ virtual IDocIterator *paragraphs() const = 0;
+ virtual IDocIterator *subSections() const = 0;
+ virtual IDocInternal *internal() const = 0;
+};
+
+class IDocInternal : public IDoc
+{
+ public:
+ virtual IDocIterator *paragraphs() const = 0;
+ virtual IDocIterator *subSections() const = 0;
+};
+
+class IDocTocList : public IDoc
+{
+ public:
+ virtual IDocIterator *elements() const = 0;
+};
+
+class IDocTocItem : public IDoc
+{
+ public:
+ virtual const IString *id() const = 0;
+ virtual const IString *title() const = 0;
+};
+
+class IDocCopy : public IDoc
+{
+ public:
+ virtual IDocIterator *contents() const = 0;
+};
+
+class IDocVerbatim : public IDoc
+{
+ public:
+ enum Types { Invalid = 0, HtmlOnly, LatexOnly, Verbatim };
+ virtual const IString *text() const = 0;
+ virtual Types type() const = 0;
+};
+
+class IDocAnchor : public IDoc
+{
+ public:
+ virtual const IString *id() const = 0;
+};
+
+class IDocSymbol : public IDoc
+{
+ public:
+ enum Types
+ { Invalid = 0,
+ Umlaut, Acute, Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Copy
+ };
+ virtual Types type() const = 0;
+ virtual const IString * typeString() const = 0;
+ virtual char letter() const = 0;
+};
+
+class IDocRoot : public IDoc
+{
+ public:
+ virtual IDocIterator *contents() const = 0;
+ virtual IDocInternal *internal() const = 0;
+};
+
+class IDocIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IDocIterator)
+ virtual IDoc *toFirst() = 0;
+ virtual IDoc *toLast() = 0;
+ virtual IDoc *toNext() = 0;
+ virtual IDoc *toPrev() = 0;
+ virtual IDoc *current() const = 0;
+ virtual void release() = 0;
+};
+
+class IEdgeLabel
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IEdgeLabel)
+ virtual const IString * label() const = 0;
+};
+
+class IEdgeLabelIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IEdgeLabelIterator)
+ virtual IEdgeLabel *toFirst() = 0;
+ virtual IEdgeLabel *toLast() = 0;
+ virtual IEdgeLabel *toNext() = 0;
+ virtual IEdgeLabel *toPrev() = 0;
+ virtual IEdgeLabel *current() const = 0;
+ virtual void release() = 0;
+};
+
+class IChildNode
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IChildNode)
+ enum NodeRelation { PublicInheritance, ProtectedInheritance,
+ PrivateInheritance, Usage, TemplateInstance
+ };
+ virtual INode * node() const = 0;
+ virtual NodeRelation relation() const = 0;
+ virtual const IString * relationString() const = 0;
+ virtual IEdgeLabelIterator *edgeLabels() const = 0;
+};
+
+class IChildNodeIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IChildNodeIterator)
+ virtual IChildNode *toFirst() = 0;
+ virtual IChildNode *toLast() = 0;
+ virtual IChildNode *toNext() = 0;
+ virtual IChildNode *toPrev() = 0;
+ virtual IChildNode *current() const = 0;
+ virtual void release() = 0;
+};
+
+class INode
+{
+ public:
+ VIRTUAL_DESTRUCTOR(INode)
+ virtual const IString * id() const = 0;
+ virtual const IString * label() const = 0;
+ virtual const IString * linkId() const = 0;
+ virtual IChildNodeIterator *children() const = 0;
+};
+
+class INodeIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(INodeIterator)
+ virtual INode *toFirst() = 0;
+ virtual INode *toLast() = 0;
+ virtual INode *toNext() = 0;
+ virtual INode *toPrev() = 0;
+ virtual INode *current() const = 0;
+ virtual void release() = 0;
+};
+
+class IGraph
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IGraph)
+ virtual INodeIterator *nodes() const = 0;
+};
+
+class IMember
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IMember)
+ enum MemberKind { Invalid=0,
+ Define, Property, Variable, Typedef, Enum,
+ Function, Signal, Prototype, Friend, DCOP, Slot,
+ EnumValue
+ };
+ virtual ICompound *compound() const = 0;
+ virtual ISection *section() const = 0;
+ virtual MemberKind kind() const = 0;
+ virtual const IString * kindString() const = 0;
+ virtual const IString * id() const = 0;
+ virtual const IString * protection() const = 0;
+ virtual const IString * virtualness() const = 0;
+ virtual ILinkedTextIterator *type() const = 0;
+ virtual const IString * typeString() const = 0;
+ virtual const IString * name() const = 0;
+ virtual const IString * readAccessor() const = 0;
+ virtual const IString * writeAccessor() const = 0;
+ virtual const IString * definition() const = 0;
+ virtual const IString * argsstring() const = 0;
+ virtual bool isConst() const = 0;
+ virtual bool isVolatile() const = 0;
+ virtual bool isStatic() const = 0;
+ virtual bool isExplicit() const = 0;
+ virtual bool isInline() const = 0;
+ virtual bool isMutable() const = 0;
+ virtual bool isReadable() const = 0;
+ virtual bool isWritable() const = 0;
+ virtual IParamIterator *parameters() const = 0;
+ virtual IParamIterator *templateParameters() const = 0;
+ virtual ILinkedTextIterator *initializer() const = 0;
+ virtual ILinkedTextIterator *exceptions() const = 0;
+ virtual IMemberReferenceIterator *references() const = 0;
+ virtual IMemberReferenceIterator *referencedBy() const = 0;
+ virtual const IString *bodyFile() const = 0;
+ virtual int bodyStart() const = 0;
+ virtual int bodyEnd() const = 0;
+ virtual const IString * definitionFile() const = 0;
+ virtual int definitionLine() const = 0;
+ virtual IMemberReference *reimplements() const = 0;
+ virtual IMemberReferenceIterator *reimplementedBy() const = 0;
+ virtual IDocRoot *briefDescription() const = 0;
+ virtual IDocRoot *detailedDescription() const = 0;
+ virtual IDocRoot *inbodyDescription() const = 0;
+};
+
+class IDefine : public IMember
+{
+ public:
+};
+
+class IProperty : public IMember
+{
+ public:
+};
+
+class IVariable : public IMember
+{
+ public:
+};
+
+class ITypedef : public IMember
+{
+ public:
+};
+
+class IFunction : public IMember
+{
+ public:
+};
+
+class ISignal : public IMember
+{
+ public:
+};
+
+class IPrototype : public IMember
+{
+ public:
+};
+
+class IFriend : public IMember
+{
+ public:
+};
+
+class IDCOP : public IMember
+{
+ public:
+};
+
+class ISlot : public IMember
+{
+ public:
+};
+
+class IEnumValue : public IMember
+{
+ public:
+ virtual const IString * name() const = 0;
+};
+
+/*! \brief Include relation
+ */
+class IInclude
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IInclude)
+ virtual const IString * name() const = 0;
+ virtual const IString * refId() const = 0;
+ virtual bool isLocal() const = 0;
+};
+
+class IIncludeIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IIncludeIterator)
+ virtual IInclude *toFirst() = 0;
+ virtual IInclude *toLast() = 0;
+ virtual IInclude *toNext() = 0;
+ virtual IInclude *toPrev() = 0;
+ virtual IInclude *current() const = 0;
+ virtual void release() = 0;
+};
+
+class IMemberIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IMemberIterator)
+ virtual IMember *toFirst() = 0;
+ virtual IMember *toLast() = 0;
+ virtual IMember *toNext() = 0;
+ virtual IMember *toPrev() = 0;
+ virtual IMember *current() const = 0;
+ virtual void release() = 0;
+};
+
+class IEnum : public IMember
+{
+ public:
+ virtual IMemberIterator *enumValues() const = 0;
+};
+
+/*! \brief The interface to a section in the object model.
+ *
+ * A compound can have a number of sections, where each
+ * section contains a set of members with the properties implied by
+ * the section kind. The kind() method returns the kind of the section.
+ * The members of the section can be accessed via members(). Apart
+ * from using kind(), some of the individual properties of the section can
+ * also be inspected via isStatic(), isPublic(), isProtected() and
+ * isPrivate().
+ */
+class ISection
+{
+ public:
+ VIRTUAL_DESTRUCTOR(ISection)
+ /*! Possible section types */
+ enum SectionKind
+ { Invalid=0,
+ UserDefined, //!< A user defined member group
+ PubTypes, //!< Public member typedefs
+ PubFuncs, //!< Public member functions
+ PubAttribs, //!< Public member attributes
+ PubSlots, //!< Public Qt Slots
+ Signals, //!< Qt Signals
+ DCOPFuncs, //!< KDE-DCOP interface functions
+ Properties, //!< IDL properties
+ Events, //!< C# events
+ PubStatFuncs, //!< Public static member functions
+ PubStatAttribs, //!< Public static attributes
+ ProTypes, //!< Protected member typedefs
+ ProFuncs, //!< Protected member functions
+ ProAttribs, //!< Protected member attributes
+ ProSlots, //!< Protected slots
+ ProStatFuncs, //!< Protected static member functions
+ ProStatAttribs, //!< Protected static member attributes
+ PacTypes, //!< Package member typedefs
+ PacFuncs, //!< Package member functions
+ PacAttribs, //!< Package member attributes
+ PacStatFuncs, //!< Package static member functions
+ PacStatAttribs, //!< Package static member attributes
+ PriTypes, //!< Private member typedefs
+ PriFuncs, //!< Private member functions
+ PriAttribs, //!< Private member attributes
+ PriSlots, //!< Private Qt slots
+ PriStatFuncs, //!< Private static member functions
+ PriStatAttribs, //!< Private static member attributes
+ Friend, //!< Friends
+ Related, //!< Function marked as related
+ Defines, //!< Preprocessor defines
+ Prototypes, //!< Global function prototypes
+ Typedefs, //!< Global typedefs
+ Enums, //!< Enumerations
+ Functions, //!< Global functions
+ Variables //!< Global variables
+ };
+
+ /*! Returns a string representation of the value returned by kind() */
+ virtual const IString * kindString() const = 0;
+
+ /*! Returns what kind of section this is */
+ virtual SectionKind kind() const = 0;
+
+ /*! Returns the description attached to this section (for user defined
+ * sections, also known as member groups).
+ */
+ virtual IDocRoot *description() const = 0;
+
+ /*! Returns an iterator for the members of this section */
+ virtual IMemberIterator *members() const = 0;
+
+ /*! Returns \c true if this section contains statics */
+ virtual bool isStatic() const = 0;
+
+ /*! Returns \c true if this section belongs to a
+ * public section of a class
+ */
+ virtual bool isPublic() const = 0;
+
+ /*! Returns \c true if this section belongs to a
+ * private section of a class
+ */
+ virtual bool isPrivate() const = 0;
+
+ /*! Returns \c true if this section belongs to a
+ * protected section of a class
+ * */
+ virtual bool isProtected() const = 0;
+};
+
+class IUserDefined : public ISection
+{
+ public:
+ virtual const IString * header() const = 0;
+};
+
+class ISectionIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(ISectionIterator)
+ virtual ISection *toFirst() = 0;
+ virtual ISection *toLast() = 0;
+ virtual ISection *toNext() = 0;
+ virtual ISection *toPrev() = 0;
+ virtual ISection *current() const = 0;
+ virtual void release() = 0;
+};
+
+/*! \brief The interface to a compound in the object model.
+ *
+ * A compound has a name which can be obtained via the name() method
+ * and a unique id, which is return via the id() method.
+ * A compound consists zero or more members which are grouped into sections.
+ * The sections() method can be used to access the individual sections.
+ * Alternatively, members can be obtained by name or id. There are
+ * different types of compounds. The kind() method returns what kind of
+ * compound this is. Depending on the return value one can dynamically
+ * cast an interface pointer to an more specialised interface that provides
+ * additional methods.
+ * Example:
+ * \code
+ * ICompound *comp=...;
+ * if (comp->kind()==ICompound::Class)
+ * {
+ * IClass *cls = dynamic_cast<IClass*>(comp);
+ * // use methods of IClass
+ * }
+ * \endcode
+ * The documentation that is provided by a compound is available via
+ * the briefDescription() and detailedDescription() methods.
+ * To avoid excessive memory usage, release() should be called (once) on each
+ * compound interface pointer that is no longer needed.
+ */
+class ICompound
+{
+ public:
+ VIRTUAL_DESTRUCTOR(ICompound)
+ /*! Represents the kind of compounds recognised by doxygen. */
+ enum CompoundKind { Invalid=0,
+ Class, Struct, Union, Interface, Protocol, Category,
+ Exception, File, Namespace, Group, Page, Example, Dir
+ };
+
+ /*! Returns the name of this compound */
+ virtual const IString * name() const = 0;
+
+ /*! Returns the id of this compound. The id is a
+ * unique string representing a specific compound object.
+ */
+ virtual const IString * id() const = 0;
+
+ /*! Returns the kind of compound. See #CompoundKind for possible
+ * values.
+ */
+ virtual CompoundKind kind() const = 0;
+
+ /*! Returns a string representation of the compound kind.
+ * @see kind()
+ */
+ virtual const IString * kindString() const = 0;
+
+ /*! Returns an iterator for the different member sections in this
+ * compound.
+ */
+ virtual ISectionIterator *sections() const = 0;
+
+ /*! Returns a tree-structured representation of the brief
+ * description that is attached to this compound.
+ */
+ virtual IDocRoot *briefDescription() const = 0;
+
+ /*! Returns a tree-structured representation of the detailed
+ * description that is attached to this compound.
+ */
+ virtual IDocRoot *detailedDescription() const = 0;
+
+ /*! Returns an interface to a member given its id.
+ * @param id The member id.
+ */
+ virtual IMember *memberById(const char * id) const = 0;
+
+ /*! Returns a list of all members within the compound having a certain
+ * name. Member overloading is the reason why there can be more than
+ * one member.
+ * @param name The name of the member.
+ */
+ virtual IMemberIterator *memberByName(const char * name) const = 0;
+
+ /*! Decreases the reference counter for this compound. If it reaches
+ * zero, the memory for the compound will be released.
+ */
+ virtual void release() = 0;
+};
+
+class ICompoundIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(ICompoundIterator)
+ virtual void toFirst() = 0;
+ virtual void toLast() = 0;
+ virtual void toNext() = 0;
+ virtual void toPrev() = 0;
+ virtual ICompound *current() const = 0;
+ virtual void release() = 0;
+};
+
+class IRelatedCompound
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IRelatedCompound)
+ enum Protection { Public, Protected, Private };
+ enum Kind { Normal, Virtual };
+ virtual ICompound *compound() const = 0;
+ virtual Protection protection() const = 0;
+ virtual Kind kind() const = 0;
+ virtual const IString *name() const = 0;
+
+};
+
+class IRelatedCompoundIterator
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IRelatedCompoundIterator)
+ virtual IRelatedCompound *toFirst() = 0;
+ virtual IRelatedCompound *toLast() = 0;
+ virtual IRelatedCompound *toNext() = 0;
+ virtual IRelatedCompound *toPrev() = 0;
+ virtual IRelatedCompound *current() const = 0;
+ virtual void release() = 0;
+};
+
+/*! \brief The interface to a class in the object model.
+ */
+class IClass : public ICompound
+{
+ public:
+ virtual IGraph *inheritanceGraph() const = 0;
+ virtual IGraph *collaborationGraph() const = 0;
+ virtual IRelatedCompoundIterator *baseCompounds() const = 0;
+ virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
+ virtual ICompoundIterator *nestedCompounds() const = 0;
+ virtual IParamIterator *templateParameters() const = 0;
+ virtual const IString *locationFile() const = 0;
+ virtual int locationLine() const = 0;
+ virtual const IString *locationBodyFile() const = 0;
+ virtual int locationBodyStartLine() const = 0;
+ virtual int locationBodyEndLine() const = 0;
+
+ // TODO:
+ // class:
+ // listOfAllMembers()
+ // protection()
+ // isAbstract()
+};
+
+/*! \brief The interface to a struct in the object model.
+ */
+class IStruct : public ICompound
+{
+ public:
+ virtual ICompoundIterator *nestedCompounds() const = 0;
+ virtual IRelatedCompoundIterator *baseCompounds() const = 0;
+ virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
+ virtual const IString *locationFile() const = 0;
+ virtual int locationLine() const = 0;
+ virtual int locationBodyStartLine() const = 0;
+ virtual int locationBodyEndLine() const = 0;
+};
+
+/*! \brief The interface to a union in the object model.
+ */
+class IUnion : public ICompound
+{
+ public:
+ virtual ICompoundIterator *nestedCompounds() const = 0;
+};
+
+/*! \brief The interface to a Java/IDL interface in the object model.
+ */
+class IInterface : public ICompound
+{
+ public:
+ virtual IRelatedCompoundIterator *baseCompounds() const = 0;
+ virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
+};
+
+
+/*! \brief The interface to a Java/IDL exception in the object model.
+ */
+class IException : public ICompound
+{
+};
+
+/*! \brief The interface to a namespace in the object model.
+ */
+class INamespace : public ICompound
+{
+ public:
+ virtual ICompoundIterator *nestedCompounds() const = 0;
+};
+
+/*! \brief The interface to a file in the object model.
+ */
+class IFile : public ICompound
+{
+ public:
+ virtual IGraph *includeDependencyGraph() const = 0;
+ virtual IGraph *includedByDependencyGraph() const = 0;
+ virtual IDocProgramListing *source() const = 0;
+ virtual ICompoundIterator *nestedCompounds() const = 0;
+
+ virtual IIncludeIterator *includes() const = 0;
+ virtual IIncludeIterator *includedBy() const = 0;
+
+ // ICompound *innerNamespaces()
+ // ICompoundIterator *innerClasses()
+};
+
+/*! \brief The interface to a group in the object model.
+ */
+class IGroup : public ICompound
+{
+ public:
+ virtual ICompoundIterator *nestedCompounds() const = 0;
+ // group:
+ // Title()
+ // innerFile()
+ // innerPage()
+};
+
+/*! \brief The interface to a page in the object model.
+ */
+class IPage : public ICompound
+{
+ public:
+ virtual const IDocTitle *title() const = 0;
+};
+
+/*! Root node of the object model. */
+class IDoxygen
+{
+ public:
+ VIRTUAL_DESTRUCTOR(IDoxygen)
+
+ /*! Returns an iterator that can be used to iterate over the list
+ * of compounds found in the project.
+ */
+ virtual ICompoundIterator *compounds() const = 0;
+
+ /*! Returns a compound given its unique \a id. If you have a
+ * compound id this function is much more efficient than iterating
+ * over the compound list. Returns 0 if the id is not valid.
+ */
+ virtual ICompound *compoundById(const char * id) const = 0;
+
+ /*! Returns a compound given its name (including the scope).
+ * Returns 0 if the name is not found in the project.
+ */
+ virtual ICompound *compoundByName(const char * name) const = 0;
+
+ /*! Returns an interface to a compound containing a member given it the
+ * member's id. Given the ICompound interface one can use the same id
+ * to obtain the IMember interface.
+ * @param id The member id.
+ */
+ virtual ICompound *memberById(const char * id) const = 0;
+
+ /*! Returns a list of all compounds containing at least one members
+ * with a certain name. Each compound can be asked to return the
+ * list of members with that name.
+ * @param name The name of the member.
+ */
+ virtual ICompoundIterator *memberByName(const char * name) const = 0;
+
+ /*! Releases the memory for the object hierarchy obtained by
+ * createdObjecModelFromXML(). First release all iterators before calling
+ * this function.
+ */
+ virtual void release() = 0;
+
+ /*! Sets the debug level.
+ * - 0 all debugging messages are disabled (the default).
+ * - 1 display important messages only
+ * - 2 display any messages.
+ */
+ virtual void setDebugLevel(int level) = 0;
+
+ /*! Reads an XML directory produced by doxygen and builds up a data
+ * structure representing the contents of the XML files in the directory.
+ */
+ virtual bool readXMLDir(const char *xmlDirName) = 0;
+};
+
+/*! Factory method that creates an empty object model for a doxygen generated XML file.
+ * Use the readXMLDir() method to build the model from an XML output
+ * directory containing doxygen output.
+ */
+IDoxygen *createObjectModel();
+
+#endif
diff --git a/addon/doxmlparser/src/Makefile b/addon/doxmlparser/src/Makefile
new file mode 100644
index 0000000..b96d192
--- /dev/null
+++ b/addon/doxmlparser/src/Makefile
@@ -0,0 +1,33 @@
+#
+# This file was generated from Makefile.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+DOXYGEN = /Users/dimitri/doxygen
+TMAKEPATH = /Users/dimitri/doxygen/tmake/lib/macosx-c++
+ENV = env TMAKEPATH=$(TMAKEPATH)
+TMAKE = /Users/dimitri/doxygen/tmake/bin/tmake
+MAKE = /opt/local/bin/gmake
+PERL = /opt/local/bin/perl
+RM = rm -f
+CP = cp
+VERSION = 1.7.3
+INSTALL = /usr/local
+INSTTOOL = /opt/local/bin/ginstall
+DOXYDOCS = ..
+DOCDIR = $(INSTALL)/share/doc/packages/doxygen
+QTDIR = /usr
+HAVE_DOT = /usr/local/bin/dot
+MKSPECS = -spec macx-g++
+all clean depend: Makefile.doxmlparser
+ $(MAKE) -f Makefile.doxmlparser $@
+
+distclean: clean
+ $(RM) -rf Makefile.doxmlparser doxmlparser.pro Makefile obj
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) doxmlparser.pro >Makefile.doxmlparser
+
+Makefile.doxmlparser: doxmlparser.pro
+ $(ENV) $(PERL) $(TMAKE) doxmlparser.pro >Makefile.doxmlparser
+
+install:
diff --git a/addon/doxmlparser/src/Makefile.doxmlparser b/addon/doxmlparser/src/Makefile.doxmlparser
new file mode 100644
index 0000000..d0d83b1
--- /dev/null
+++ b/addon/doxmlparser/src/Makefile.doxmlparser
@@ -0,0 +1,224 @@
+#############################################################################
+# Makefile for building ../lib/libdoxmlparser.a
+# Generated by tmake at 15:12, 2011/03/28
+# Project: doxmlparser
+# Template: lib.t
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cc
+CXX = c++
+CFLAGS = -pipe -Wall -W -g -fstack-protector
+CXXFLAGS= -pipe -D__FreeBSD__=6 -Wall -W -g -fstack-protector
+INCPATH = -I../../../qtools -I../include
+AR = ar cq
+RANLIB = ranlib
+MOC = /usr/bin/moc
+
+TAR = tar -cf
+GZIP = gzip -9f
+
+####### Files
+
+HEADERS = basehandler.h \
+ mainhandler.h \
+ compoundhandler.h \
+ sectionhandler.h \
+ memberhandler.h \
+ paramhandler.h \
+ dochandler.h \
+ linkedtexthandler.h \
+ debug.h \
+ graphhandler.h \
+ stringimpl.h \
+ loamhandler.h
+SOURCES = mainhandler.cpp \
+ compoundhandler.cpp \
+ sectionhandler.cpp \
+ memberhandler.cpp \
+ paramhandler.cpp \
+ dochandler.cpp \
+ linkedtexthandler.cpp \
+ basehandler.cpp \
+ debug.cpp \
+ graphhandler.cpp \
+ loamhandler.cpp
+OBJECTS = ../objects/mainhandler.o \
+ ../objects/compoundhandler.o \
+ ../objects/sectionhandler.o \
+ ../objects/memberhandler.o \
+ ../objects/paramhandler.o \
+ ../objects/dochandler.o \
+ ../objects/linkedtexthandler.o \
+ ../objects/basehandler.o \
+ ../objects/debug.o \
+ ../objects/graphhandler.o \
+ ../objects/loamhandler.o
+SRCMOC =
+OBJMOC =
+DIST =
+TARGET = ../lib/libdoxmlparser.a
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .C .c
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+####### Build rules
+
+all: $(TARGET)
+
+staticlib: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(OBJMOC)
+ -rm -f $(TARGET)
+ $(AR) $(TARGET) $(OBJECTS) $(OBJMOC)
+ ranlib $(TARGET)
+
+moc: $(SRCMOC)
+
+tmake:
+ tmake doxmlparser.pro
+
+dist:
+ $(TAR) doxmlparser.tar doxmlparser.pro $(SOURCES) $(HEADERS) $(DIST)
+ $(GZIP) doxmlparser.tar
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
+ -rm -f *~ core
+
+####### Compile
+
+../objects/mainhandler.o: mainhandler.cpp \
+ mainhandler.h \
+ doxmlintf.h \
+ basehandler.h \
+ debug.h \
+ compoundhandler.h \
+ stringimpl.h \
+ baseiterator.h \
+ sectionhandler.h \
+ graphhandler.h \
+ dochandler.h \
+ memberhandler.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/mainhandler.o mainhandler.cpp
+
+../objects/compoundhandler.o: compoundhandler.cpp \
+ mainhandler.h \
+ doxmlintf.h \
+ basehandler.h \
+ debug.h \
+ compoundhandler.h \
+ stringimpl.h \
+ baseiterator.h \
+ dochandler.h \
+ graphhandler.h \
+ sectionhandler.h \
+ paramhandler.h \
+ loamhandler.h \
+ memberhandler.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/compoundhandler.o compoundhandler.cpp
+
+../objects/sectionhandler.o: sectionhandler.cpp \
+ mainhandler.h \
+ doxmlintf.h \
+ basehandler.h \
+ debug.h \
+ compoundhandler.h \
+ stringimpl.h \
+ baseiterator.h \
+ sectionhandler.h \
+ memberhandler.h \
+ dochandler.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/sectionhandler.o sectionhandler.cpp
+
+../objects/memberhandler.o: memberhandler.cpp \
+ memberhandler.h \
+ doxmlintf.h \
+ basehandler.h \
+ debug.h \
+ baseiterator.h \
+ stringimpl.h \
+ sectionhandler.h \
+ dochandler.h \
+ mainhandler.h \
+ linkedtexthandler.h \
+ paramhandler.h \
+ compoundhandler.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/memberhandler.o memberhandler.cpp
+
+../objects/paramhandler.o: paramhandler.cpp \
+ paramhandler.h \
+ doxmlintf.h \
+ stringimpl.h \
+ basehandler.h \
+ debug.h \
+ baseiterator.h \
+ memberhandler.h \
+ linkedtexthandler.h \
+ dochandler.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/paramhandler.o paramhandler.cpp
+
+../objects/dochandler.o: dochandler.cpp \
+ dochandler.h \
+ doxmlintf.h \
+ stringimpl.h \
+ basehandler.h \
+ debug.h \
+ baseiterator.h \
+ linkedtexthandler.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/dochandler.o dochandler.cpp
+
+../objects/linkedtexthandler.o: linkedtexthandler.cpp \
+ linkedtexthandler.h \
+ baseiterator.h \
+ doxmlintf.h \
+ basehandler.h \
+ debug.h \
+ stringimpl.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/linkedtexthandler.o linkedtexthandler.cpp
+
+../objects/basehandler.o: basehandler.cpp \
+ basehandler.h \
+ debug.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/basehandler.o basehandler.cpp
+
+../objects/debug.o: debug.cpp \
+ debug.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/debug.o debug.cpp
+
+../objects/graphhandler.o: graphhandler.cpp \
+ graphhandler.h \
+ stringimpl.h \
+ doxmlintf.h \
+ basehandler.h \
+ debug.h \
+ baseiterator.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/graphhandler.o graphhandler.cpp
+
+../objects/loamhandler.o: loamhandler.cpp \
+ loamhandler.h \
+ doxmlintf.h \
+ basehandler.h \
+ debug.h \
+ memberhandler.h \
+ baseiterator.h \
+ stringimpl.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/loamhandler.o loamhandler.cpp
+
diff --git a/addon/doxmlparser/src/Makefile.in b/addon/doxmlparser/src/Makefile.in
new file mode 100644
index 0000000..049f969
--- /dev/null
+++ b/addon/doxmlparser/src/Makefile.in
@@ -0,0 +1,13 @@
+all clean depend: Makefile.doxmlparser
+ $(MAKE) -f Makefile.doxmlparser $@
+
+distclean: clean
+ $(RM) -rf Makefile.doxmlparser doxmlparser.pro Makefile obj
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) doxmlparser.pro >Makefile.doxmlparser
+
+Makefile.doxmlparser: doxmlparser.pro
+ $(ENV) $(PERL) $(TMAKE) doxmlparser.pro >Makefile.doxmlparser
+
+install:
diff --git a/addon/doxmlparser/src/basehandler.cpp b/addon/doxmlparser/src/basehandler.cpp
new file mode 100644
index 0000000..02d98c2
--- /dev/null
+++ b/addon/doxmlparser/src/basehandler.cpp
@@ -0,0 +1,3 @@
+#include "basehandler.h"
+
+QXmlLocator * LocatorContainer::s_theLocator=0;
diff --git a/addon/doxmlparser/src/basehandler.h b/addon/doxmlparser/src/basehandler.h
new file mode 100644
index 0000000..0aafb03
--- /dev/null
+++ b/addon/doxmlparser/src/basehandler.h
@@ -0,0 +1,325 @@
+/******************************************************************************
+ *
+ * $Id: basehandler.h,v 1.33 2002/10/13 21:01:58 dimitri Exp $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _BASEHANDLER_H
+#define _BASEHANDLER_H
+
+#include <qxml.h>
+#include <qdict.h>
+#include <qstring.h>
+
+#include "debug.h"
+
+//-----------------------------------------------------------------------------
+
+class IBaseHandler
+{
+ public:
+ virtual void setDelegate(QXmlDefaultHandler *delegate) = 0;
+ virtual QXmlDefaultHandler *delegate() const = 0;
+ virtual ~IBaseHandler() {}
+};
+
+//-----------------------------------------------------------------------------
+
+class IFallBackHandler
+{
+ public:
+ virtual bool handleStartElement(const QString & name,
+ const QXmlAttributes & attrib) = 0;
+ virtual bool handleEndElement(const QString &name) = 0;
+ virtual ~IFallBackHandler() {}
+};
+
+//-----------------------------------------------------------------------------
+
+template<class T> class ElementMapper
+{
+ class StartElementHandler
+ {
+ typedef void (T::*Handler)(const QXmlAttributes &attrib);
+ public:
+ StartElementHandler() : m_parent(0) {}
+ StartElementHandler(T *parent, Handler h)
+ : m_parent(parent), m_handler(h) {}
+ void operator()(const QXmlAttributes &attrib)
+ { if (m_parent) (m_parent->*m_handler)(attrib); }
+ private:
+ T *m_parent;
+ Handler m_handler;
+ };
+
+ class EndElementHandler
+ {
+ typedef void (T::*Handler)();
+ public:
+ EndElementHandler() : m_parent(0) {}
+ EndElementHandler(T *parent, Handler h)
+ : m_parent(parent), m_handler(h) {}
+ void operator()()
+ { if (m_parent) (m_parent->*m_handler)(); }
+ private:
+ T *m_parent;
+ Handler m_handler;
+ };
+
+ public:
+ typedef StartElementHandler StartElementHandlerT;
+ typedef EndElementHandler EndElementHandlerT;
+
+ ElementMapper() : m_startHandlers(67), m_endHandlers(67)
+ {
+ m_startHandlers.setAutoDelete(TRUE);
+ m_endHandlers.setAutoDelete(TRUE);
+ }
+ virtual ~ElementMapper()
+ {
+ }
+
+ void addStartHandler(const char *key)
+ {
+ m_startHandlers.insert(key,new StartElementHandlerT);
+ }
+
+ void addStartHandler(const char *key, T *obj, void (T::*handler)(const QXmlAttributes &))
+ {
+ m_startHandlers.insert(key,new StartElementHandlerT(obj,handler));
+ }
+
+ void addEndHandler(const char *key)
+ {
+ m_endHandlers.insert(key,new EndElementHandlerT);
+ }
+
+ void addEndHandler(const char *key, T *obj, void (T::*handler)())
+ {
+ m_endHandlers.insert(key,new EndElementHandlerT(obj,handler));
+ }
+
+
+ protected:
+ QDict<StartElementHandlerT> m_startHandlers;
+ QDict<EndElementHandlerT> m_endHandlers;
+};
+
+//-----------------------------------------------------------------------------
+
+struct LocatorContainer
+{
+ static QXmlLocator *s_theLocator;
+};
+
+//-----------------------------------------------------------------------------
+
+template<class T> class BaseHandler : public QXmlDefaultHandler,
+ public ElementMapper<T>,
+ public LocatorContainer,
+ public IBaseHandler
+{
+ public:
+ typedef typename ElementMapper<T>::StartElementHandlerT StartElementHandlerT;
+ typedef typename ElementMapper<T>::EndElementHandlerT EndElementHandlerT;
+
+ BaseHandler() : m_delegateHandler(0), m_fallBackHandler(0)
+ {
+ }
+
+ virtual ~BaseHandler()
+ {
+ ASSERT(m_delegateHandler==0);
+ }
+
+ virtual bool startDocument()
+ {
+ return TRUE;
+ }
+
+ virtual bool startElement( const QString & namespaceURI,
+ const QString & localName,
+ const QString & name,
+ const QXmlAttributes & attrib
+ )
+ {
+ if (m_delegateHandler)
+ {
+ return m_delegateHandler->startElement(namespaceURI,localName,name,attrib);
+ }
+ if (!m_skipUntil.isEmpty()) // skip mode
+ {
+ if (m_skipUntil==name) m_skipCount++;
+ debug(1,"line %d, col %d: skipping start tag %s count=%d\n",
+ s_theLocator->lineNumber(),s_theLocator->columnNumber(),
+ name.data(),m_skipCount);
+ return TRUE;
+ }
+
+ StartElementHandlerT *handler = ElementMapper<T>::m_startHandlers[name];
+ if (handler)
+ {
+ (*handler)(attrib);
+ //printf("found start tag %s\n",name.data());
+ }
+ else if (!m_fallBackHandler ||
+ !m_fallBackHandler->handleStartElement(name,attrib)
+ )
+ {
+ debug(1,"line %d, col %d: found unexpected tag `%s', skipping until matching end tag\n",
+ s_theLocator->lineNumber(),s_theLocator->columnNumber(),
+ name.data());
+ m_skipUntil = name;
+ m_skipCount=1;
+ }
+ return TRUE;
+ }
+
+ virtual bool endElement( const QString& namespaceURI, const QString& localName, const QString& name )
+ {
+ if (m_delegateHandler)
+ {
+ return m_delegateHandler->endElement(namespaceURI,localName,name);
+ }
+
+ if (name==m_skipUntil)
+ {
+ m_skipCount--;
+ debug(1,"line %d, col %d: skipping end tag %s count=%d\n",
+ s_theLocator->lineNumber(),s_theLocator->columnNumber(),
+ name.data(),m_skipCount);
+ if (m_skipCount==0)
+ {
+ m_skipUntil="";
+ }
+ //printf("found end tag %s\n",name.data());
+ }
+ else if (m_skipUntil.isEmpty())
+ {
+ EndElementHandlerT *handler = ElementMapper<T>::m_endHandlers[name];
+ if (handler)
+ {
+ (*handler)();
+ //printf("found end tag %s\n",name.data());
+ }
+ else if (m_fallBackHandler)
+ {
+ m_fallBackHandler->handleEndElement(name);
+ }
+ }
+ m_curString="";
+ return TRUE;
+ }
+
+ bool skippedEntity ( const QString &s )
+ {
+ if (m_delegateHandler)
+ {
+ return m_delegateHandler->skippedEntity(s);
+ }
+
+ debug(1,"line %d, col %d: Skipped unhandled entity %s\n",
+ s_theLocator->lineNumber(),s_theLocator->columnNumber(),
+ s.data());
+ return TRUE;
+ }
+
+ /*! called when a number of characters are received by the parser.
+ * \param ch the characters.
+ */
+ virtual bool characters ( const QString & ch )
+ {
+ if (m_delegateHandler)
+ {
+ return m_delegateHandler->characters(ch);
+ }
+
+ //printf("Found characters \"%s\"\n",ch.data());
+ m_curString+=ch;
+ return TRUE;
+ }
+
+ void setDelegate(QXmlDefaultHandler *delegate)
+ {
+ m_delegateHandler = delegate;
+ }
+
+ QXmlDefaultHandler *delegate() const
+ {
+ return m_delegateHandler;
+ }
+
+ void setFallBackHandler(IFallBackHandler *h)
+ {
+ m_fallBackHandler = h;
+ }
+
+ IFallBackHandler *fallBackHandler() const
+ {
+ return m_fallBackHandler;
+ }
+
+ void setDocumentLocator( QXmlLocator * locator )
+ {
+ debug(2,"setDocumentLocator(%p)\n",locator);
+ s_theLocator = locator;
+ }
+
+ protected:
+ QString m_curString;
+ QString m_skipUntil;
+ int m_skipCount;
+ QXmlDefaultHandler *m_delegateHandler;
+ IFallBackHandler *m_fallBackHandler;
+};
+
+//-----------------------------------------------------------------------------
+
+template<class T> class BaseFallBackHandler : public ElementMapper<T>,
+ public IFallBackHandler
+{
+ public:
+ typedef typename ElementMapper<T>::StartElementHandlerT StartElementHandlerT;
+ typedef typename ElementMapper<T>::EndElementHandlerT EndElementHandlerT;
+
+ BaseFallBackHandler()
+ {
+ }
+ virtual ~BaseFallBackHandler()
+ {
+ }
+
+ bool handleStartElement(const QString & name,
+ const QXmlAttributes & attrib)
+ {
+ StartElementHandlerT *handler = ElementMapper<T>::m_startHandlers[name];
+ if (handler)
+ {
+ (*handler)(attrib);
+ return TRUE;
+ }
+ return FALSE;
+ }
+ bool handleEndElement(const QString &name)
+ {
+ EndElementHandlerT *handler = ElementMapper<T>::m_endHandlers[name];
+ if (handler)
+ {
+ (*handler)();
+ return TRUE;
+ }
+ return FALSE;
+ }
+};
+
+
+#endif
diff --git a/addon/doxmlparser/src/baseiterator.h b/addon/doxmlparser/src/baseiterator.h
new file mode 100644
index 0000000..39b91d2
--- /dev/null
+++ b/addon/doxmlparser/src/baseiterator.h
@@ -0,0 +1,50 @@
+/******************************************************************************
+ *
+ * $Id: doxygen.cpp,v 1.87 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+#ifndef BASEITERATOR_H
+#define BASEITERATOR_H
+
+#include <qlist.h>
+#include <doxmlintf.h>
+
+template<class Intf,class ElemIntf,class ElemImpl> class BaseIterator :
+ public Intf, public QListIterator<ElemImpl>
+{
+ public:
+ BaseIterator(const QList<ElemImpl> &list) : QListIterator<ElemImpl>(list) {}
+ virtual ~BaseIterator() {}
+ virtual ElemIntf *toFirst() { return QListIterator<ElemImpl>::toFirst(); }
+ virtual ElemIntf *toLast() { return QListIterator<ElemImpl>::toLast(); }
+ virtual ElemIntf *toNext() { return QListIterator<ElemImpl>::operator++(); }
+ virtual ElemIntf *toPrev() { return QListIterator<ElemImpl>::operator--(); }
+ virtual ElemIntf *current() const { return QListIterator<ElemImpl>::current(); }
+ virtual void release() { delete this; }
+};
+
+template<class Intf,class ElemIntf,class ElemImpl,class Intermediate>
+ class BaseIteratorVia :
+ public Intf, public QListIterator<ElemImpl>
+{
+ public:
+ BaseIteratorVia(const QList<ElemImpl> &list) : QListIterator<ElemImpl>(list) {}
+ virtual ~BaseIteratorVia() {}
+ virtual ElemIntf *toFirst() { return static_cast<Intermediate *>(QListIterator<ElemImpl>::toFirst()); }
+ virtual ElemIntf *toLast() { return static_cast<Intermediate *>(QListIterator<ElemImpl>::toLast()); }
+ virtual ElemIntf *toNext() { return static_cast<Intermediate *>(QListIterator<ElemImpl>::operator++()); }
+ virtual ElemIntf *toPrev() { return static_cast<Intermediate *>(QListIterator<ElemImpl>::operator--()); }
+ virtual ElemIntf *current() const { return static_cast<Intermediate *>(QListIterator<ElemImpl>::current()); }
+ virtual void release() { delete this; }
+};
+
+#endif
diff --git a/addon/doxmlparser/src/compoundhandler.cpp b/addon/doxmlparser/src/compoundhandler.cpp
new file mode 100644
index 0000000..0c22478
--- /dev/null
+++ b/addon/doxmlparser/src/compoundhandler.cpp
@@ -0,0 +1,650 @@
+/******************************************************************************
+ *
+ * $Id: compoundhandler.cpp,v 1.33 2002/10/13 21:01:58 dimitri Exp $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include "mainhandler.h"
+#include "compoundhandler.h"
+#include "dochandler.h"
+#include "debug.h"
+#include "graphhandler.h"
+#include "sectionhandler.h"
+#include "paramhandler.h"
+#include "loamhandler.h"
+#include "memberhandler.h"
+
+//----------------------------------------------------------------------------
+
+IncludeHandler::IncludeHandler(IBaseHandler *parent,const char *endtag) :
+ m_parent(parent)
+{
+ addEndHandler(endtag,this,&IncludeHandler::endInclude);
+}
+
+IncludeHandler::~IncludeHandler()
+{
+}
+
+void IncludeHandler::startInclude(const QXmlAttributes &attrib)
+{
+ m_curString = "";
+ m_refId = attrib.value("refid");
+ m_isLocal = attrib.value("local")=="yes";
+ m_parent->setDelegate(this);
+}
+
+void IncludeHandler::endInclude()
+{
+ m_name = m_curString;
+ m_parent->setDelegate(0);
+ debug(2,"Found include %s\n",m_name.data());
+}
+
+//----------------------------------------------------------------------------
+
+class CompoundIdIterator : public ICompoundIterator,
+ public QListIterator<QString>
+{
+ public:
+ CompoundIdIterator(const MainHandler *m,const QList<QString> &list) :
+ QListIterator<QString>(list), m_mainHandler(m) {}
+ virtual ~CompoundIdIterator() {}
+
+ virtual void toFirst()
+ {
+ QListIterator<QString>::toFirst();
+ }
+ virtual void toLast()
+ {
+ QListIterator<QString>::toLast();
+ }
+ virtual void toNext()
+ {
+ QListIterator<QString>::operator++();
+ }
+ virtual void toPrev()
+ {
+ QListIterator<QString>::operator--();
+ }
+ virtual ICompound *current() const
+ {
+ QString *id = QListIterator<QString>::current();
+ return id ? m_mainHandler->compoundById(*id) : 0;
+ }
+ virtual void release()
+ { delete this; }
+
+ private:
+ const MainHandler *m_mainHandler;
+};
+
+//----------------------------------------------------------------------------
+
+ICompound *RelatedCompound::compound() const
+{
+ return m_parent->m_mainHandler->compoundById(m_id);
+}
+
+//----------------------------------------------------------------------------
+
+class CompoundErrorHandler : public QXmlErrorHandler
+{
+ public:
+ virtual ~CompoundErrorHandler() {}
+ bool warning( const QXmlParseException & )
+ {
+ return FALSE;
+ }
+ bool error( const QXmlParseException & )
+ {
+ return FALSE;
+ }
+ bool fatalError( const QXmlParseException &exception )
+ {
+ debug(1,"Fatal error at line %d column %d: %s\n",
+ exception.lineNumber(),exception.columnNumber(),
+ exception.message().data());
+ return FALSE;
+ }
+ QString errorString() { return ""; }
+
+ private:
+ QString errorMsg;
+};
+
+//----------------------------------------------------------------------------
+
+class CompoundTypeMap
+{
+ public:
+ CompoundTypeMap()
+ {
+ m_map.setAutoDelete(TRUE);
+ m_map.insert("class", new int(ICompound::Class));
+ m_map.insert("struct", new int(ICompound::Struct));
+ m_map.insert("union", new int(ICompound::Union));
+ m_map.insert("interface",new int(ICompound::Interface));
+ m_map.insert("protocol", new int(ICompound::Protocol));
+ m_map.insert("category", new int(ICompound::Category));
+ m_map.insert("exception",new int(ICompound::Exception));
+ m_map.insert("file", new int(ICompound::File));
+ m_map.insert("namespace",new int(ICompound::Namespace));
+ m_map.insert("group", new int(ICompound::Group));
+ m_map.insert("page", new int(ICompound::Page));
+ m_map.insert("example", new int(ICompound::Example));
+ m_map.insert("dir", new int(ICompound::Dir));
+ }
+ virtual ~CompoundTypeMap()
+ {
+ }
+ ICompound::CompoundKind map(const QString &s)
+ {
+ int *val = m_map.find(s);
+ if (val==0)
+ {
+ debug(1,"Warning: `%s' is an invalid compound type\n",s.data());
+ return ICompound::Invalid;
+ }
+ else return (ICompound::CompoundKind)*val;
+ }
+ private:
+ QDict<int> m_map;
+};
+
+static CompoundTypeMap *s_typeMap;
+
+void compoundhandler_init()
+{
+ s_typeMap = new CompoundTypeMap;
+}
+
+void compoundhandler_exit()
+{
+ delete s_typeMap;
+}
+
+//----------------------------------------------------------------------------
+
+CompoundHandler::CompoundHandler(const QString &xmlDir)
+ : m_titleHandler(0),
+ m_includeDependencyGraph(0),
+ m_includedByDependencyGraph(0),
+ m_templateParamList(0),
+ m_brief(0),
+ m_detailed(0),
+ m_inheritanceGraph(0),
+ m_collaborationGraph(0),
+ m_programListing(0),
+ m_members(0),
+ m_xmlDir(xmlDir),
+ m_refCount(1),
+ m_memberDict(257),
+ m_memberNameDict(257),
+ m_mainHandler(0)
+{
+ m_superClasses.setAutoDelete(TRUE);
+ m_subClasses.setAutoDelete(TRUE);
+ m_sections.setAutoDelete(TRUE);
+ m_memberNameDict.setAutoDelete(TRUE);
+ m_innerCompounds.setAutoDelete(TRUE);
+ m_includes.setAutoDelete(TRUE);
+ m_includedBy.setAutoDelete(TRUE);
+
+ addStartHandler("doxygen");
+ addEndHandler("doxygen");
+
+ addStartHandler("compounddef",this,&CompoundHandler::startCompound);
+ addEndHandler("compounddef",this,&CompoundHandler::endCompound);
+
+ addStartHandler("compoundname");
+ addEndHandler("compoundname",this,&CompoundHandler::endCompoundName);
+
+ addStartHandler("title",this,&CompoundHandler::startTitle);
+
+ addStartHandler("basecompoundref",this,&CompoundHandler::startSuperClass);
+ addEndHandler("basecompoundref",this,&CompoundHandler::endSuperClass);
+
+ addStartHandler("derivedcompoundref",this,&CompoundHandler::startSubClass);
+ addEndHandler("derivedcompoundref",this,&CompoundHandler::endSubClass);
+
+ addStartHandler("includes",this,&CompoundHandler::startIncludes);
+ addStartHandler("includedby",this,&CompoundHandler::startIncludedBy);
+
+ addStartHandler("incdepgraph",this,&CompoundHandler::startIncludeDependencyGraph);
+
+ addStartHandler("invincdepgraph",this,&CompoundHandler::startIncludedByDependencyGraph);
+
+ addStartHandler("innerdir",this,&CompoundHandler::startInnerDir);
+ addEndHandler("innerdir");
+
+ addStartHandler("innerfile",this,&CompoundHandler::startInnerFile);
+ addEndHandler("innerfile");
+
+ addStartHandler("innerclass",this,&CompoundHandler::startInnerClass);
+ addEndHandler("innerclass");
+
+ addStartHandler("innernamespace",this,&CompoundHandler::startInnerNamespace);
+ addEndHandler("innernamespace");
+
+ addStartHandler("innerpage",this,&CompoundHandler::startInnerPage);
+ addEndHandler("innerpage");
+
+ addStartHandler("innergroup",this,&CompoundHandler::startInnerGroup);
+ addEndHandler("innergroup");
+
+ addStartHandler("templateparamlist",this,&CompoundHandler::startTemplateParamList);
+
+ addStartHandler("sectiondef",this,&CompoundHandler::startSection);
+
+ addStartHandler("briefdescription",this,&CompoundHandler::startBriefDesc);
+
+ addStartHandler("detaileddescription",this,&CompoundHandler::startDetailedDesc);
+
+ addStartHandler("inheritancegraph",this,&CompoundHandler::startInheritanceGraph);
+
+ addStartHandler("collaborationgraph",this,&CompoundHandler::startCollaborationGraph);
+
+ addStartHandler("programlisting",this,&CompoundHandler::startProgramListing);
+
+ addStartHandler("location",this,&CompoundHandler::startLocation);
+ addEndHandler("location");
+
+ addStartHandler("listofallmembers",this,&CompoundHandler::startListOfAllMembers);
+}
+
+CompoundHandler::~CompoundHandler()
+{
+ debug(2,"CompoundHandler::~CompoundHandler()\n");
+ delete m_titleHandler;
+ delete m_brief;
+ delete m_detailed;
+ delete m_programListing;
+ delete m_inheritanceGraph;
+ delete m_collaborationGraph;
+ delete m_includeDependencyGraph;
+ delete m_includedByDependencyGraph;
+ delete m_templateParamList;
+ delete m_members;
+}
+
+void CompoundHandler::startSection(const QXmlAttributes& attrib)
+{
+ SectionHandler *sectHandler = new SectionHandler(this);
+ sectHandler->startSection(attrib);
+ m_sections.append(sectHandler);
+}
+
+void CompoundHandler::startBriefDesc(const QXmlAttributes& attrib)
+{
+ DocHandler *docHandler = new DocHandler(this);
+ docHandler->startDoc(attrib);
+ m_brief = docHandler;
+}
+
+void CompoundHandler::startDetailedDesc(const QXmlAttributes& attrib)
+{
+ DocHandler *docHandler = new DocHandler(this);
+ docHandler->startDoc(attrib);
+ m_detailed = docHandler;
+}
+
+void CompoundHandler::startProgramListing(const QXmlAttributes& attrib)
+{
+ ProgramListingHandler *plHandler = new ProgramListingHandler(this);
+ plHandler->startProgramListing(attrib);
+ m_programListing = plHandler;
+}
+
+void CompoundHandler::startIncludes(const QXmlAttributes& attrib)
+{
+ IncludeHandler *inc = new IncludeHandler(this,"includes");
+ m_includes.append(inc);
+ inc->startInclude(attrib);
+}
+
+void CompoundHandler::startIncludedBy(const QXmlAttributes& attrib)
+{
+ IncludeHandler *inc = new IncludeHandler(this,"includedby");
+ m_includedBy.append(inc);
+ inc->startInclude(attrib);
+}
+
+void CompoundHandler::startCompound(const QXmlAttributes& attrib)
+{
+ m_id = attrib.value("id");
+ m_kindString = attrib.value("kind");
+ m_kind = s_typeMap->map(m_kindString);
+ m_protection = attrib.value("prot");
+ debug(2,"startCompound(id=`%s' type=`%s')\n",m_id.data(),m_kindString.data());
+}
+
+void CompoundHandler::endCompound()
+{
+ debug(2,"endCompound()\n");
+}
+
+void CompoundHandler::startLocation(const QXmlAttributes& attrib)
+{
+ m_defFile = attrib.value("file");
+ m_defLine = attrib.value("line").toInt();
+ m_defBodyFile = attrib.value("bodyfile");
+ m_defBodyStart = attrib.value("bodystart").toInt();
+ m_defBodyEnd = attrib.value("bodyend").toInt();
+}
+
+void CompoundHandler::endCompoundName()
+{
+ m_name = m_curString.stripWhiteSpace();
+ debug(2,"Compound name `%s'\n",m_name.data());
+}
+
+void CompoundHandler::startInnerClass(const QXmlAttributes& attrib)
+{
+ m_innerCompounds.append(new QString(attrib.value("refid")));
+}
+
+void CompoundHandler::startInnerNamespace(const QXmlAttributes& attrib)
+{
+ m_innerCompounds.append(new QString(attrib.value("refid")));
+}
+
+void CompoundHandler::startInnerFile(const QXmlAttributes& attrib)
+{
+ m_innerCompounds.append(new QString(attrib.value("refid")));
+}
+
+void CompoundHandler::startInnerGroup(const QXmlAttributes& attrib)
+{
+ m_innerCompounds.append(new QString(attrib.value("refid")));
+}
+
+void CompoundHandler::startInnerPage(const QXmlAttributes& attrib)
+{
+ m_innerCompounds.append(new QString(attrib.value("refid")));
+}
+
+void CompoundHandler::startInnerDir(const QXmlAttributes& attrib)
+{
+ m_innerCompounds.append(new QString(attrib.value("refid")));
+}
+
+void CompoundHandler::startTemplateParamList(const QXmlAttributes& attrib)
+{
+ m_templateParamList = new TemplateParamListHandler(this);
+ m_templateParamList->startTemplateParamList(attrib);
+}
+
+void CompoundHandler::startListOfAllMembers(const QXmlAttributes& attrib)
+{
+ m_members = new ListOfAllMembersHandler(this);
+ m_members->startListOfAllMembers(attrib);
+}
+
+void CompoundHandler::startSuperClass(const QXmlAttributes& attrib)
+{
+ IRelatedCompound::Protection prot = IRelatedCompound::Public;
+ QString protString = attrib.value("prot");
+ if (protString=="protected")
+ {
+ prot = IRelatedCompound::Protected;
+ }
+ else if (protString=="private")
+ {
+ prot = IRelatedCompound::Private;
+ }
+ IRelatedCompound::Kind kind = IRelatedCompound::Normal;
+ QString kindString = attrib.value("virt");
+ if (kindString=="virtual") kind = IRelatedCompound::Virtual;
+
+ RelatedCompound *sc=new RelatedCompound(
+ this,
+ attrib.value("refid"),
+ prot,
+ kind
+ );
+ debug(2,"super class id=`%s' prot=`%s' virt=`%s'\n",
+ attrib.value("refid").data(),
+ protString.data(),
+ kindString.data());
+ m_superClasses.append(sc);
+ m_curString = "";
+}
+
+void CompoundHandler::endSuperClass()
+{
+ m_superClasses.getLast()->setName(m_curString);
+}
+
+void CompoundHandler::startSubClass(const QXmlAttributes& attrib)
+{
+ IRelatedCompound::Protection prot = IRelatedCompound::Public;
+ QString protString = attrib.value("prot");
+ if (protString=="protected") prot = IRelatedCompound::Protected;
+ else if (protString=="private") prot = IRelatedCompound::Private;
+
+ IRelatedCompound::Kind kind = IRelatedCompound::Normal;
+ QString kindString = attrib.value("virt");
+ if (kindString=="virtual") kind = IRelatedCompound::Virtual;
+
+ RelatedCompound *sc = new RelatedCompound(
+ this,
+ attrib.value("refid"),
+ prot,
+ kind
+ );
+ debug(2,"sub class id=`%s' prot=`%s' virt=`%s'\n",
+ attrib.value("refid").data(),
+ protString.data(),
+ kindString.data());
+ m_subClasses.append(sc);
+ m_curString = "";
+}
+
+void CompoundHandler::endSubClass()
+{
+ m_subClasses.getLast()->setName(m_curString);
+}
+
+void CompoundHandler::startTitle(const QXmlAttributes& attrib)
+{
+ ASSERT(m_titleHandler==0);
+ m_titleHandler = new TitleHandler(this);
+ m_titleHandler->startTitle(attrib);
+}
+
+bool CompoundHandler::parseXML(const char *compId)
+{
+ QFile xmlFile(m_xmlDir+"/"+compId+".xml");
+ if (!xmlFile.exists()) return FALSE;
+ CompoundErrorHandler errorHandler;
+ QXmlInputSource source( xmlFile );
+ QXmlSimpleReader reader;
+ reader.setContentHandler( this );
+ reader.setErrorHandler( &errorHandler );
+ reader.parse( source );
+ return TRUE;
+}
+
+void CompoundHandler::initialize(MainHandler *mh)
+{
+ m_mainHandler = mh;
+ QListIterator<SectionHandler> msi(m_sections);
+ SectionHandler *sec;
+ for (;(sec=msi.current());++msi)
+ {
+ sec->initialize(this);
+ }
+ if (m_members)
+ {
+ m_members->initialize(mh);
+ }
+}
+
+void CompoundHandler::insertMember(MemberHandler *mh)
+{
+ m_memberDict.insert(mh->id()->latin1(),mh);
+ mh->initialize(m_mainHandler);
+ QList<MemberHandler> *mhl = m_memberNameDict.find(mh->id()->latin1());
+ if (mhl==0)
+ {
+ mhl = new QList<MemberHandler>;
+ m_memberNameDict.insert(mh->name()->latin1(),mhl);
+ }
+ mhl->append(mh);
+}
+
+ICompound *CompoundHandler::toICompound() const
+{
+ switch (m_kind)
+ {
+ case IClass::Class: return (IClass *)this;
+ case IStruct::Struct: return (IStruct *)this;
+ case IUnion::Union: return (IUnion *)this;
+ case IException::Exception: return (IException *)this;
+ case IInterface::Interface: return (IInterface *)this;
+ case INamespace::Namespace: return (INamespace *)this;
+ case IFile::File: return (IFile *)this;
+ case IGroup::Group: return (IGroup *)this;
+ case IPage::Page: return (IPage *)this;
+ default: return 0;
+ }
+ return 0;
+}
+
+void CompoundHandler::release()
+{
+ debug(2,"CompoundHandler::release() %d->%d\n",m_refCount,m_refCount-1);
+ if (--m_refCount<=0)
+ {
+ m_mainHandler->unloadCompound(this);
+ delete this;
+ }
+}
+
+ISectionIterator *CompoundHandler::sections() const
+{
+ return new SectionIterator(m_sections);
+}
+
+IMemberIterator *CompoundHandler::memberByName(const char *name) const
+{
+ QList<MemberHandler> *ml = m_memberNameDict[name];
+ if (ml==0) return 0;
+ return new MemberIterator(*ml);
+}
+
+void CompoundHandler::startInheritanceGraph(const QXmlAttributes &attrib)
+{
+ m_inheritanceGraph = new GraphHandler(this,"inheritancegraph");
+ m_inheritanceGraph->startGraph(attrib);
+}
+
+void CompoundHandler::startCollaborationGraph(const QXmlAttributes &attrib)
+{
+ m_collaborationGraph = new GraphHandler(this,"collaborationgraph");
+ m_collaborationGraph->startGraph(attrib);
+}
+
+void CompoundHandler::startIncludeDependencyGraph(const QXmlAttributes &attrib)
+{
+ m_includeDependencyGraph = new GraphHandler(this,"incdepgraph");
+ m_includeDependencyGraph->startGraph(attrib);
+}
+
+void CompoundHandler::startIncludedByDependencyGraph(const QXmlAttributes &attrib)
+{
+ m_includedByDependencyGraph = new GraphHandler(this,"invincdepgraph");
+ m_includedByDependencyGraph->startGraph(attrib);
+}
+
+IDocRoot *CompoundHandler::briefDescription() const
+{
+ return m_brief;
+}
+
+IDocRoot *CompoundHandler::detailedDescription() const
+{
+ return m_detailed;
+}
+
+IMember *CompoundHandler::memberById(const char *id) const
+{
+ return (IFunction*)m_memberDict[id];
+}
+
+IGraph *CompoundHandler::inheritanceGraph() const
+{
+ return m_inheritanceGraph;
+}
+
+IGraph *CompoundHandler::collaborationGraph() const
+{
+ return m_collaborationGraph;
+}
+
+IGraph *CompoundHandler::includeDependencyGraph() const
+{
+ return m_includeDependencyGraph;
+}
+
+IGraph *CompoundHandler::includedByDependencyGraph() const
+{
+ return m_includedByDependencyGraph;
+}
+
+IRelatedCompoundIterator *CompoundHandler::baseCompounds() const
+{
+ return new RelatedCompoundIterator(m_superClasses);
+}
+
+IRelatedCompoundIterator *CompoundHandler::derivedCompounds() const
+{
+ return new RelatedCompoundIterator(m_subClasses);
+}
+
+ICompoundIterator *CompoundHandler::nestedCompounds() const
+{
+ return new CompoundIdIterator(m_mainHandler,m_innerCompounds);
+}
+
+IDocProgramListing *CompoundHandler::source() const
+{
+ return m_programListing;
+}
+
+IIncludeIterator *CompoundHandler::includes() const
+{
+ return new IncludeIterator(m_includes);
+}
+
+IIncludeIterator *CompoundHandler::includedBy() const
+{
+ return new IncludeIterator(m_includedBy);
+}
+
+IParamIterator *CompoundHandler::templateParameters() const
+{
+ return m_templateParamList ? m_templateParamList->templateParams() : 0;
+}
+
+const IDocTitle *CompoundHandler::title() const
+{
+ return m_titleHandler;
+}
+
+IMemberReferenceIterator *CompoundHandler::members() const
+{
+ return m_members ? m_members->members() : 0;
+}
+
+
diff --git a/addon/doxmlparser/src/compoundhandler.h b/addon/doxmlparser/src/compoundhandler.h
new file mode 100644
index 0000000..d872be8
--- /dev/null
+++ b/addon/doxmlparser/src/compoundhandler.h
@@ -0,0 +1,236 @@
+/******************************************************************************
+ *
+ * $Id: compoundhandler.h,v 1.33 2002/10/13 21:01:58 dimitri Exp $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+#ifndef _COMPOUNDHANDLER_H
+#define _COMPOUNDHANDLER_H
+
+#include <qstring.h>
+#include <qlist.h>
+#include <qxml.h>
+#include <doxmlintf.h>
+
+#include "stringimpl.h"
+#include "basehandler.h"
+#include "baseiterator.h"
+
+class MainHandler;
+class DocHandler;
+class ProgramListingHandler;
+class GraphHandler;
+class MemberHandler;
+class CompoundHandler;
+class SectionHandler;
+class ParamHandler;
+class TemplateParamListHandler;
+class TitleHandler;
+class ListOfAllMembersHandler;
+
+class IncludeHandler : public IInclude, public BaseHandler<IncludeHandler>
+{
+ public:
+ IncludeHandler(IBaseHandler *parent,const char *endtag);
+ virtual ~IncludeHandler();
+
+ void startInclude(const QXmlAttributes &attrib);
+ void endInclude();
+
+ // IInclude
+ virtual const IString * name() const
+ { return &m_name; }
+ virtual const IString * refId() const
+ { return &m_refId; }
+ virtual bool isLocal() const
+ { return &m_isLocal; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_name; // element's content
+ StringImpl m_refId; // refid
+ bool m_isLocal; // local
+};
+
+class IncludeIterator : public BaseIterator<IIncludeIterator,IInclude,IncludeHandler>
+{
+ public:
+ IncludeIterator(const QList<IncludeHandler> &list) :
+ BaseIterator<IIncludeIterator,IInclude,IncludeHandler>(list) {}
+};
+
+
+class RelatedCompound : public IRelatedCompound
+{
+ public:
+ RelatedCompound(CompoundHandler *parent,
+ const QString &id,
+ Protection prot,
+ Kind kind
+ ) :
+ m_parent(parent), m_id(id), m_protection(prot), m_kind(kind) {}
+ virtual ~RelatedCompound() {}
+ void setName(const QString &str) { m_name = str; }
+
+ virtual ICompound *compound() const;
+ virtual Protection protection() const { return m_protection; }
+ virtual Kind kind() const { return m_kind; }
+ virtual const IString *name() const { return &m_name; }
+
+ private:
+ CompoundHandler *m_parent;
+ QString m_id; // refid
+ Protection m_protection; // prot
+ Kind m_kind; // virt
+ StringImpl m_name; // element's content
+};
+
+class RelatedCompoundIterator : public BaseIterator<IRelatedCompoundIterator,IRelatedCompound,RelatedCompound>
+{
+ public:
+ RelatedCompoundIterator(const QList<RelatedCompound> &list) :
+ BaseIterator<IRelatedCompoundIterator,IRelatedCompound,RelatedCompound>(list) {}
+};
+
+
+class CompoundHandler : public IClass,
+ public IStruct,
+ public IUnion,
+ public IException,
+ public IInterface,
+ public INamespace,
+ public IFile,
+ public IGroup,
+ public IPage,
+ public BaseHandler<CompoundHandler>
+{
+ friend class RelatedCompound;
+
+ public:
+ virtual void startSection(const QXmlAttributes& attrib);
+ virtual void startCompound(const QXmlAttributes& attrib);
+ virtual void startSuperClass(const QXmlAttributes& attrib);
+ virtual void endSuperClass();
+ virtual void startSubClass(const QXmlAttributes& attrib);
+ virtual void endSubClass();
+ virtual void endCompound();
+ virtual void endCompoundName();
+ virtual void startBriefDesc(const QXmlAttributes& attrib);
+ virtual void startDetailedDesc(const QXmlAttributes& attrib);
+ virtual void startLocation(const QXmlAttributes& attrib);
+ virtual void startProgramListing(const QXmlAttributes& attrib);
+ virtual void startInheritanceGraph(const QXmlAttributes& attrib);
+ virtual void startCollaborationGraph(const QXmlAttributes& attrib);
+ virtual void startIncludeDependencyGraph(const QXmlAttributes& attrib);
+ virtual void startIncludedByDependencyGraph(const QXmlAttributes& attrib);
+ virtual void startIncludes(const QXmlAttributes& attrib);
+ virtual void startIncludedBy(const QXmlAttributes& attrib);
+ virtual void startInnerDir(const QXmlAttributes& attrib);
+ virtual void startInnerClass(const QXmlAttributes& attrib);
+ virtual void startInnerNamespace(const QXmlAttributes& attrib);
+ virtual void startInnerFile(const QXmlAttributes& attrib);
+ virtual void startInnerGroup(const QXmlAttributes& attrib);
+ virtual void startInnerPage(const QXmlAttributes& attrib);
+ virtual void startTitle(const QXmlAttributes& attrib);
+ virtual void startTemplateParamList(const QXmlAttributes& attrib);
+ virtual void startListOfAllMembers(const QXmlAttributes& attrib);
+ virtual void addref() { m_refCount++; }
+
+ CompoundHandler(const QString &dirName);
+ virtual ~CompoundHandler();
+ bool parseXML(const char *compId);
+ void initialize(MainHandler *mh);
+ void insertMember(MemberHandler *mh);
+ ICompound *toICompound() const;
+
+ // ICompound implementation
+ const IString *name() const { return &m_name; }
+ const IString *id() const { return &m_id; }
+ CompoundKind kind() const { return m_kind; }
+ const IString *kindString() const { return &m_kindString; }
+ ISectionIterator *sections() const;
+ IDocRoot *briefDescription() const;
+ IDocRoot *detailedDescription() const;
+ IMember *memberById(const char *id) const;
+ IMemberIterator *memberByName(const char *name) const;
+ IParamIterator *templateParameters() const;
+ void release();
+
+ // IClass implementation
+ IGraph *inheritanceGraph() const;
+ IGraph *collaborationGraph() const;
+ IRelatedCompoundIterator *baseCompounds() const;
+ IRelatedCompoundIterator *derivedCompounds() const;
+ ICompoundIterator *nestedCompounds() const;
+ ICompoundIterator *nestedGroup() const;
+ const IString *locationFile() const { return &m_defFile; }
+ int locationLine() const { return m_defLine; }
+ const IString *locationBodyFile() const { return &m_defBodyFile; }
+ int locationBodyStartLine() const { return m_defBodyStart; }
+ int locationBodyEndLine() const { return m_defBodyEnd; }
+ IMemberReferenceIterator *members() const;
+
+ // IFile implementation
+ IGraph *includeDependencyGraph() const;
+ IGraph *includedByDependencyGraph() const;
+ IDocProgramListing *source() const;
+ IIncludeIterator *includes() const;
+ IIncludeIterator *includedBy() const;
+
+ // IPage implementation
+ const IDocTitle *title() const;
+
+ private:
+ // XML elements:
+ // -------------
+ StringImpl m_name; // compoundname
+ TitleHandler* m_titleHandler; // title
+ QList<RelatedCompound> m_subClasses; // basecompoundref
+ QList<RelatedCompound> m_superClasses; // derivedcompoundref
+ QList<IncludeHandler> m_includes; // includes
+ QList<IncludeHandler> m_includedBy; // includedBy
+ GraphHandler* m_includeDependencyGraph; // incdepgraph
+ GraphHandler* m_includedByDependencyGraph; // invincdepgraph
+ QList<QString> m_innerCompounds; // innerdir/innerfile/innerclass/innernamespace/innergroup
+ TemplateParamListHandler* m_templateParamList; // templateparamlist
+ QList<SectionHandler> m_sections; // sectiondef
+ DocHandler* m_brief; // briefdescription
+ DocHandler* m_detailed; // detaileddescription
+ GraphHandler* m_inheritanceGraph; // inheritancegraph
+ GraphHandler* m_collaborationGraph; // collaborationgraph
+ ProgramListingHandler* m_programListing; // programlisting
+ // location
+ StringImpl m_defFile; // - file
+ int m_defLine; // - line
+ StringImpl m_defBodyFile; // - bodyfile
+ int m_defBodyStart; // - bodystart
+ int m_defBodyEnd; // - bodyend
+ ListOfAllMembersHandler* m_members; // listofallmember
+
+ // XML attributes:
+ // ---------------
+ StringImpl m_id; // id
+ CompoundKind m_kind; // kind
+ StringImpl m_kindString; // kind as a string
+ StringImpl m_protection; // prot
+
+ // local variables
+ QString m_xmlDir; // directory where the info is found
+ int m_refCount; // object reference counter
+ QDict<MemberHandler> m_memberDict; // id->member lookup
+ QDict<QList<MemberHandler> > m_memberNameDict; // name->memberlist lookup
+ MainHandler* m_mainHandler; // parent object
+};
+
+void compoundhandler_init();
+void compoundhandler_exit();
+
+#endif
diff --git a/addon/doxmlparser/src/debug.cpp b/addon/doxmlparser/src/debug.cpp
new file mode 100644
index 0000000..a8be32c
--- /dev/null
+++ b/addon/doxmlparser/src/debug.cpp
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "debug.h"
+
+static int s_debugLevel = 0;
+
+void debug(int level,const char *msg,...)
+{
+ if (level<=s_debugLevel)
+ {
+ va_list args;
+ va_start(args, msg);
+ vfprintf(stderr, msg, args);
+ va_end(args);
+ }
+}
+
+void setDebugLevel(int level)
+{
+ s_debugLevel = level;
+}
+
diff --git a/addon/doxmlparser/src/debug.h b/addon/doxmlparser/src/debug.h
new file mode 100644
index 0000000..c77f7fe
--- /dev/null
+++ b/addon/doxmlparser/src/debug.h
@@ -0,0 +1,7 @@
+#ifndef _DEBUG_H
+#define _DEBUG_H
+
+void debug(int level,const char *msg,...);
+void setDebugLevel(int level);
+
+#endif
diff --git a/addon/doxmlparser/src/dochandler.cpp b/addon/doxmlparser/src/dochandler.cpp
new file mode 100644
index 0000000..9499b5d
--- /dev/null
+++ b/addon/doxmlparser/src/dochandler.cpp
@@ -0,0 +1,2240 @@
+/******************************************************************************
+ *
+ * $Id: dochandler.cpp,v 1.33 2002/10/13 21:01:58 dimitri Exp $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include <qmap.h>
+
+#include "dochandler.h"
+#include "debug.h"
+#include "linkedtexthandler.h"
+
+
+//----------------------------------------------------------------------
+
+class TypeNameMapper
+{
+ public:
+ TypeNameMapper()
+ {
+ m_map.insert("see", SimpleSectHandler::See);
+ m_map.insert("return", SimpleSectHandler::Return);
+ m_map.insert("author", SimpleSectHandler::Author);
+ m_map.insert("version", SimpleSectHandler::Version);
+ m_map.insert("since", SimpleSectHandler::Since);
+ m_map.insert("date", SimpleSectHandler::Date);
+ m_map.insert("bug", SimpleSectHandler::Bug);
+ m_map.insert("note", SimpleSectHandler::Note);
+ m_map.insert("warning", SimpleSectHandler::Warning);
+ m_map.insert("par", SimpleSectHandler::Par);
+ m_map.insert("deprecated",SimpleSectHandler::Deprecated);
+ m_map.insert("pre", SimpleSectHandler::Pre);
+ m_map.insert("post", SimpleSectHandler::Post);
+ m_map.insert("invariant", SimpleSectHandler::Invar);
+ m_map.insert("remark", SimpleSectHandler::Remark);
+ m_map.insert("attention", SimpleSectHandler::Attention);
+ m_map.insert("todo", SimpleSectHandler::Todo);
+ m_map.insert("test", SimpleSectHandler::Test);
+ m_map.insert("rcs", SimpleSectHandler::RCS);
+ m_map.insert("enumvalues",SimpleSectHandler::EnumValues);
+ m_map.insert("examples", SimpleSectHandler::Examples);
+ }
+ SimpleSectHandler::Types stringToType(const QString &typeStr)
+ {
+ return m_map[typeStr];
+ }
+ private:
+ QMap<QString,SimpleSectHandler::Types> m_map;
+};
+
+class HighlightMapper
+{
+ public:
+ HighlightMapper()
+ {
+ m_map.insert("comment", HighlightHandler::Comment);
+ m_map.insert("keyword", HighlightHandler::Keyword);
+ m_map.insert("keywordtype", HighlightHandler::KeywordType);
+ m_map.insert("keywordflow", HighlightHandler::KeywordFlow);
+ m_map.insert("charliteral", HighlightHandler::CharLiteral);
+ m_map.insert("stringliteral", HighlightHandler::StringLiteral);
+ m_map.insert("preprocessor", HighlightHandler::Preprocessor);
+ }
+ HighlightHandler::HighlightKind stringToKind(const QString &kindStr)
+ {
+ return m_map[kindStr];
+ }
+ private:
+ QMap<QString,HighlightHandler::HighlightKind> m_map;
+};
+
+static TypeNameMapper *s_typeMapper;
+static HighlightMapper *s_highlightMapper;
+
+void dochandler_init()
+{
+ s_typeMapper = new TypeNameMapper;
+ s_highlightMapper = new HighlightMapper;
+}
+
+void dochandler_exit()
+{
+ delete s_typeMapper;
+ delete s_highlightMapper;
+}
+
+//----------------------------------------------------------------------
+// MarkupHandler
+//----------------------------------------------------------------------
+
+MarkupHandler::MarkupHandler(QList<DocImpl> &children,QString &curString)
+ : m_children(children), m_curString(curString),
+ m_curMarkup(IDocMarkup::Normal), m_headingLevel(0)
+{
+ addStartHandler("bold",this,&MarkupHandler::startBold);
+ addEndHandler("bold",this,&MarkupHandler::endBold);
+
+ addStartHandler("emphasis",this,&MarkupHandler::startEmphasis);
+ addEndHandler("emphasis",this,&MarkupHandler::endEmphasis);
+
+ addStartHandler("computeroutput",this,&MarkupHandler::startComputerOutput);
+ addEndHandler("computeroutput",this,&MarkupHandler::endComputerOutput);
+
+ addStartHandler("center",this,&MarkupHandler::startCenter);
+ addEndHandler("center",this,&MarkupHandler::endCenter);
+
+ addStartHandler("small",this,&MarkupHandler::startSmallFont);
+ addEndHandler("small",this,&MarkupHandler::endSmallFont);
+
+ addStartHandler("subscript",this,&MarkupHandler::startSubscript);
+ addEndHandler("subscript",this,&MarkupHandler::endSubscript);
+
+ addStartHandler("superscript",this,&MarkupHandler::startSuperscript);
+ addEndHandler("superscript",this,&MarkupHandler::endSuperscript);
+
+ addStartHandler("preformatted",this,&MarkupHandler::startPreformatted);
+ addEndHandler("preformatted",this,&MarkupHandler::endPreformatted);
+
+ addStartHandler("heading1",this,&MarkupHandler::startHeading1);
+ addEndHandler("heading1",this,&MarkupHandler::endHeading1);
+
+ addStartHandler("heading2",this,&MarkupHandler::startHeading2);
+ addEndHandler("heading2",this,&MarkupHandler::endHeading2);
+
+ addStartHandler("heading3",this,&MarkupHandler::startHeading3);
+ addEndHandler("heading3",this,&MarkupHandler::endHeading3);
+
+ addStartHandler("heading4",this,&MarkupHandler::startHeading4);
+ addEndHandler("heading4",this,&MarkupHandler::endHeading4);
+
+ addStartHandler("heading5",this,&MarkupHandler::startHeading5);
+ addEndHandler("heading5",this,&MarkupHandler::endHeading5);
+
+ addStartHandler("heading6",this,&MarkupHandler::startHeading6);
+ addEndHandler("heading6",this,&MarkupHandler::endHeading6);
+}
+
+MarkupHandler::~MarkupHandler()
+{
+}
+
+void MarkupHandler::addTextNode()
+{
+ if (!m_curString.isEmpty())
+ {
+ m_children.append(new TextNode(m_curString,m_curMarkup,m_headingLevel));
+ debug(2,"addTextNode() text=%s markup=%x\n",m_curString.data(),m_curMarkup);
+ m_curString="";
+ }
+}
+
+void MarkupHandler::startBold(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Bold,TRUE));
+ m_curMarkup |= IDocMarkup::Bold;
+}
+
+void MarkupHandler::endBold()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Bold,FALSE));
+ m_curMarkup &= ~IDocMarkup::Bold;
+}
+
+void MarkupHandler::startEmphasis(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Emphasis,TRUE));
+ m_curMarkup |= IDocMarkup::Emphasis;
+}
+
+void MarkupHandler::endEmphasis()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Emphasis,FALSE));
+ m_curMarkup &= ~IDocMarkup::Emphasis;
+}
+
+void MarkupHandler::startComputerOutput(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::ComputerOutput,TRUE));
+ m_curMarkup |= IDocMarkup::ComputerOutput;
+}
+
+void MarkupHandler::endComputerOutput()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::ComputerOutput,FALSE));
+ m_curMarkup &= ~IDocMarkup::ComputerOutput;
+}
+
+void MarkupHandler::startCenter(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Center,TRUE));
+ m_curMarkup |= IDocMarkup::Center;
+}
+
+void MarkupHandler::endCenter()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Center,FALSE));
+ m_curMarkup &= ~IDocMarkup::Center;
+}
+
+void MarkupHandler::startSmallFont(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::SmallFont,TRUE));
+ m_curMarkup |= IDocMarkup::SmallFont;
+}
+
+void MarkupHandler::endSmallFont()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::SmallFont,FALSE));
+ m_curMarkup &= ~IDocMarkup::SmallFont;
+}
+
+void MarkupHandler::startSubscript(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Subscript,TRUE));
+ m_curMarkup |= IDocMarkup::Subscript;
+}
+
+void MarkupHandler::endSubscript()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Subscript,FALSE));
+ m_curMarkup &= ~IDocMarkup::Subscript;
+}
+
+void MarkupHandler::startSuperscript(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Superscript,TRUE));
+ m_curMarkup |= IDocMarkup::Superscript;
+}
+
+void MarkupHandler::endSuperscript()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Superscript,FALSE));
+ m_curMarkup &= ~IDocMarkup::Superscript;
+}
+
+void MarkupHandler::startPreformatted(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Preformatted,TRUE));
+ m_curMarkup |= IDocMarkup::Preformatted;
+}
+
+void MarkupHandler::endPreformatted()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Preformatted,FALSE));
+ m_curMarkup &= ~IDocMarkup::Preformatted;
+}
+
+void MarkupHandler::startHeading1(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,1));
+ m_curMarkup |= IDocMarkup::Heading;
+ m_headingLevel=1;
+}
+
+void MarkupHandler::endHeading1()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,1));
+ m_curMarkup &= ~IDocMarkup::Heading;
+ m_headingLevel=0;
+}
+
+void MarkupHandler::startHeading2(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,2));
+ m_curMarkup |= IDocMarkup::Heading;
+ m_headingLevel=2;
+}
+
+void MarkupHandler::endHeading2()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,2));
+ m_curMarkup &= ~IDocMarkup::Heading;
+ m_headingLevel=0;
+}
+
+void MarkupHandler::startHeading3(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,3));
+ m_curMarkup |= IDocMarkup::Heading;
+ m_headingLevel=3;
+}
+
+void MarkupHandler::endHeading3()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,3));
+ m_curMarkup &= ~IDocMarkup::Heading;
+ m_headingLevel=0;
+}
+
+void MarkupHandler::startHeading4(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,4));
+ m_curMarkup |= IDocMarkup::Heading;
+ m_headingLevel=4;
+}
+
+void MarkupHandler::endHeading4()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,4));
+ m_curMarkup &= ~IDocMarkup::Heading;
+ m_headingLevel=0;
+}
+
+void MarkupHandler::startHeading5(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,5));
+ m_curMarkup |= IDocMarkup::Heading;
+ m_headingLevel=5;
+}
+
+void MarkupHandler::endHeading5()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,5));
+ m_curMarkup &= ~IDocMarkup::Heading;
+ m_headingLevel=0;
+}
+
+void MarkupHandler::startHeading6(const QXmlAttributes & /*attrib*/)
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,6));
+ m_curMarkup |= IDocMarkup::Heading;
+ m_headingLevel=6;
+}
+
+void MarkupHandler::endHeading6()
+{
+ addTextNode();
+ m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,6));
+ m_curMarkup &= ~IDocMarkup::Heading;
+ m_headingLevel=0;
+}
+
+
+//----------------------------------------------------------------------
+// ListItemHandler
+//----------------------------------------------------------------------
+
+ListItemHandler::ListItemHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+
+ addEndHandler("listitem",this,&ListItemHandler::endListItem);
+
+ addStartHandler("para",this,&ListItemHandler::startParagraph);
+}
+
+ListItemHandler::~ListItemHandler()
+{
+}
+
+void ListItemHandler::startListItem(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"start list item handler\n");
+}
+
+void ListItemHandler::endListItem()
+{
+ debug(2,"end list item handler\n");
+ m_parent->setDelegate(0);
+}
+
+void ListItemHandler::startParagraph(const QXmlAttributes& attrib)
+{
+ ParagraphHandler *parHandler = new ParagraphHandler(this);
+ parHandler->startParagraph(attrib);
+ m_children.append(parHandler);
+}
+
+IDocIterator *ListItemHandler::contents() const
+{
+ return new ListItemIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// OrderedListHandler
+//----------------------------------------------------------------------
+
+OrderedListHandler::OrderedListHandler(IBaseHandler *parent) : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ addEndHandler("orderedlist",this,&OrderedListHandler::endOrderedList);
+ addStartHandler("listitem",this,&OrderedListHandler::startOrderedListItem);
+}
+
+OrderedListHandler::~OrderedListHandler()
+{
+}
+
+void OrderedListHandler::startOrderedList(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+}
+
+void OrderedListHandler::endOrderedList()
+{
+ m_parent->setDelegate(0);
+}
+
+void OrderedListHandler::startOrderedListItem(const QXmlAttributes& attrib)
+{
+ ListItemHandler *liHandler = new ListItemHandler(this);
+ liHandler->startListItem(attrib);
+ m_children.append(liHandler);
+}
+
+IDocIterator *OrderedListHandler::elements() const
+{
+ return new OrderedListIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// ItemizedListHandler
+//----------------------------------------------------------------------
+
+ItemizedListHandler::ItemizedListHandler(IBaseHandler *parent) : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ addEndHandler("itemizedlist",this,&ItemizedListHandler::endItemizedList);
+ addStartHandler("listitem",this,&ItemizedListHandler::startItemizedListItem);
+}
+
+ItemizedListHandler::~ItemizedListHandler()
+{
+}
+
+void ItemizedListHandler::startItemizedList(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+}
+
+void ItemizedListHandler::endItemizedList()
+{
+ m_parent->setDelegate(0);
+}
+
+void ItemizedListHandler::startItemizedListItem(const QXmlAttributes& attrib)
+{
+ ListItemHandler *liHandler = new ListItemHandler(this);
+ liHandler->startListItem(attrib);
+ m_children.append(liHandler);
+}
+
+IDocIterator *ItemizedListHandler::elements() const
+{
+ return new ItemizedListIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// TocListHandler
+//----------------------------------------------------------------------
+
+TocListHandler::TocListHandler(IBaseHandler *parent) : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ addEndHandler("toclist",this,&TocListHandler::endTocList);
+ addStartHandler("tocitem",this,&TocListHandler::startTocItem);
+}
+
+TocListHandler::~TocListHandler()
+{
+}
+
+void TocListHandler::startTocList(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+}
+
+void TocListHandler::endTocList()
+{
+ m_parent->setDelegate(0);
+}
+
+void TocListHandler::startTocItem(const QXmlAttributes& attrib)
+{
+ TocItemHandler *tiHandler = new TocItemHandler(this);
+ tiHandler->startTocItem(attrib);
+ m_children.append(tiHandler);
+}
+
+IDocIterator *TocListHandler::elements() const
+{
+ return new TocListIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// TocItemHandler
+//----------------------------------------------------------------------
+
+TocItemHandler::TocItemHandler(IBaseHandler *parent) : m_parent(parent)
+{
+ addEndHandler("tocitem",this,&TocItemHandler::endTocItem);
+}
+
+TocItemHandler::~TocItemHandler()
+{
+}
+
+void TocItemHandler::startTocItem(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ m_id = attrib.value("id");
+ m_curString="";
+}
+
+void TocItemHandler::endTocItem()
+{
+ m_title = m_curString;
+ m_parent->setDelegate(0);
+}
+
+//----------------------------------------------------------------------
+// ParameterHandler
+//----------------------------------------------------------------------
+
+ParameterHandler::ParameterHandler(IBaseHandler *parent) :
+ m_parent(parent)
+{
+ addEndHandler("parametername",this,&ParameterHandler::endParameterName);
+}
+
+ParameterHandler::~ParameterHandler()
+{
+}
+
+void ParameterHandler::startParameterName(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+}
+
+void ParameterHandler::endParameterName()
+{
+ m_name = m_curString;
+ debug(2,"parameter %s\n",m_name.data());
+ m_curString="";
+ m_parent->setDelegate(0);
+}
+
+//----------------------------------------------------------------------
+// ParameterListHandler
+//----------------------------------------------------------------------
+
+ParameterItemHandler::ParameterItemHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("parameteritem",this,&ParameterItemHandler::endParameterItem);
+ addStartHandler("parameternamelist");
+ addEndHandler("parameternamelist");
+ addStartHandler("parametername",this,&ParameterItemHandler::startParameterName);
+ addStartHandler("parameterdescription");
+ addEndHandler("parameterdescription");
+ addStartHandler("para",this,&ParameterItemHandler::startParagraph);
+ m_parameters.setAutoDelete(TRUE);
+ m_description = 0;
+}
+
+ParameterItemHandler::~ParameterItemHandler()
+{
+ delete m_description;
+}
+
+void ParameterItemHandler::startParameterItem(const QXmlAttributes&)
+{
+ m_parent->setDelegate(this);
+}
+
+void ParameterItemHandler::endParameterItem()
+{
+ m_parent->setDelegate(0);
+}
+
+void ParameterItemHandler::startParameterName(const QXmlAttributes& attrib)
+{
+ ParameterHandler *param = new ParameterHandler(this);
+ m_parameters.append(param);
+ param->startParameterName(attrib);
+}
+
+void ParameterItemHandler::startParagraph(const QXmlAttributes& attrib)
+{
+ m_description = new ParagraphHandler(this);
+ m_description->startParagraph(attrib);
+}
+
+IDocIterator *ParameterItemHandler::paramNames() const
+{
+ return new ParameterItemIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// ParameterListHandler
+//----------------------------------------------------------------------
+
+ParameterListHandler::ParameterListHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("parameterlist",this,&ParameterListHandler::endParameterList);
+ addStartHandler("parameteritem",this,&ParameterListHandler::startParameterItem);
+ m_paramItems.setAutoDelete(TRUE);
+}
+
+ParameterListHandler::~ParameterListHandler()
+{
+}
+
+void ParameterListHandler::startParameterList(const QXmlAttributes& attrib)
+{
+ QString kind = attrib.value("kind");
+ if (kind=="retval") m_type=RetVal;
+ else if (kind=="exception") m_type=Exception;
+ else if (kind=="param") m_type=Param;
+ else
+ {
+ debug(1,"Error: invalid parameterlist type: %s\n",kind.data());
+ }
+ debug(2,"parameterlist kind=%s\n",kind.data());
+ m_parent->setDelegate(this);
+}
+
+void ParameterListHandler::endParameterList()
+{
+ m_parent->setDelegate(0);
+}
+
+void ParameterListHandler::startParameterItem(const QXmlAttributes& attrib)
+{
+ ParameterItemHandler *paramItem = new ParameterItemHandler(this);
+ m_paramItems.append(paramItem);
+ paramItem->startParameterItem(attrib);
+}
+
+IDocIterator *ParameterListHandler::params() const
+{
+ return new ParameterListIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// LinkHandler
+//----------------------------------------------------------------------
+
+LinkHandler::LinkHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("link",this,&LinkHandler::endLink);
+}
+
+LinkHandler::~LinkHandler()
+{
+}
+
+void LinkHandler::startLink(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ debug(2,"Start link\n");
+ m_ref = attrib.value("linkend");
+ m_curString="";
+}
+
+void LinkHandler::endLink()
+{
+ m_text = m_curString;
+ m_curString="";
+ m_parent->setDelegate(0);
+ debug(2,"End link\n");
+}
+
+//----------------------------------------------------------------------
+// EMailHandler
+//----------------------------------------------------------------------
+
+EMailHandler::EMailHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("email",this,&EMailHandler::endEMail);
+}
+
+EMailHandler::~EMailHandler()
+{
+}
+
+void EMailHandler::startEMail(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"Start email\n");
+ m_curString="";
+}
+
+void EMailHandler::endEMail()
+{
+ m_address = m_curString;
+ m_curString="";
+ m_parent->setDelegate(0);
+ debug(2,"End email\n");
+}
+
+//----------------------------------------------------------------------
+// ULinkHandler
+//----------------------------------------------------------------------
+
+ULinkHandler::ULinkHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("ulink",this,&ULinkHandler::endULink);
+}
+
+ULinkHandler::~ULinkHandler()
+{
+}
+
+void ULinkHandler::startULink(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ debug(2,"Start ulink\n");
+ m_url = attrib.value("url");
+ m_curString="";
+}
+
+void ULinkHandler::endULink()
+{
+ m_text = m_curString;
+ m_curString="";
+ m_parent->setDelegate(0);
+ debug(2,"End ulink\n");
+}
+
+//----------------------------------------------------------------------
+// LineBreakHandler
+//----------------------------------------------------------------------
+
+LineBreakHandler::LineBreakHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("linebreak",this,&LineBreakHandler::endLineBreak);
+}
+
+LineBreakHandler::~LineBreakHandler()
+{
+}
+
+void LineBreakHandler::startLineBreak(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"Start linebreak\n");
+}
+
+void LineBreakHandler::endLineBreak()
+{
+ m_parent->setDelegate(0);
+ debug(2,"End linebreak\n");
+}
+
+//----------------------------------------------------------------------
+// HRulerHandler
+//----------------------------------------------------------------------
+
+HRulerHandler::HRulerHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("hruler",this,&HRulerHandler::endHRuler);
+}
+
+HRulerHandler::~HRulerHandler()
+{
+}
+
+void HRulerHandler::startHRuler(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"Start hruler\n");
+}
+
+void HRulerHandler::endHRuler()
+{
+ m_parent->setDelegate(0);
+ debug(2,"End hruler\n");
+}
+
+//----------------------------------------------------------------------
+// RefHandler
+//----------------------------------------------------------------------
+
+RefHandler::RefHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("ref",this,&RefHandler::endRef);
+}
+
+RefHandler::~RefHandler()
+{
+}
+
+void RefHandler::startRef(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ m_refId = attrib.value("refid");
+ m_extId = attrib.value("external");
+ ASSERT(attrib.value("kindref")=="compound" ||
+ attrib.value("kindref")=="member");
+ m_targetKind = attrib.value("kindref")=="compound" ? Compound : Member;
+ debug(2,"Start ref refId=%s\n",m_refId.data());
+ m_curString="";
+}
+
+void RefHandler::endRef()
+{
+ m_linkText = m_curString;
+ m_parent->setDelegate(0);
+ debug(2,"End ref: text=`%s'\n",m_linkText.data());
+}
+
+
+//----------------------------------------------------------------------
+// TitleHandler
+//----------------------------------------------------------------------
+
+TitleHandler::TitleHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ m_markupHandler = new MarkupHandler(m_children,m_curString);
+ setFallBackHandler(m_markupHandler);
+ addStartHandler("ref",this,&TitleHandler::startRef);
+ addEndHandler("title",this,&TitleHandler::endTitle);
+}
+
+TitleHandler::~TitleHandler()
+{
+ delete m_markupHandler;
+}
+
+void TitleHandler::startTitle(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"Start title\n");
+ m_curString="";
+}
+
+void TitleHandler::endTitle()
+{
+ addTextNode();
+ m_parent->setDelegate(0);
+ debug(2,"End title\n");
+}
+
+void TitleHandler::addTextNode()
+{
+ if (!m_curString.isEmpty())
+ {
+ m_children.append(
+ new TextNode(
+ m_curString,
+ m_markupHandler->markup(),
+ m_markupHandler->headingLevel()
+ )
+ );
+ debug(2,"addTextNode() text=\"%s\" markup=%x headingLevel=%d\n",
+ m_curString.data(),m_markupHandler->markup(),m_markupHandler->headingLevel());
+ m_curString="";
+ }
+}
+
+void TitleHandler::startRef(const QXmlAttributes& attrib)
+{
+ RefHandler *ref = new RefHandler(this);
+ ref->startRef(attrib);
+ m_children.append(ref);
+}
+
+IDocIterator *TitleHandler::title() const
+{
+ return new TitleIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// SimpleSectHandler
+//----------------------------------------------------------------------
+
+SimpleSectHandler::SimpleSectHandler(IBaseHandler *parent)
+ : m_parent(parent), m_paragraph(0), m_title(0)
+{
+ addStartHandler("title",this,&SimpleSectHandler::startTitle);
+ addStartHandler("para",this,&SimpleSectHandler::startParagraph);
+ addEndHandler("simplesect",this,&SimpleSectHandler::endSimpleSect);
+}
+
+SimpleSectHandler::~SimpleSectHandler()
+{
+}
+
+void SimpleSectHandler::startSimpleSect(const QXmlAttributes& attrib)
+{
+ m_typeString = attrib.value("kind");
+ m_type = s_typeMapper->stringToType(m_typeString);
+ debug(2,"start simple section %s\n",m_typeString.data());
+ m_parent->setDelegate(this);
+}
+
+void SimpleSectHandler::endSimpleSect()
+{
+ debug(2,"end simple section\n");
+ m_parent->setDelegate(0);
+}
+
+void SimpleSectHandler::startTitle(const QXmlAttributes& attrib)
+{
+ ASSERT(m_title==0);
+ m_title = new TitleHandler(this);
+ m_title->startTitle(attrib);
+}
+
+void SimpleSectHandler::startParagraph(const QXmlAttributes& attrib)
+{
+ ASSERT(m_paragraph==0);
+ m_paragraph = new ParagraphHandler(this);
+ m_paragraph->startParagraph(attrib);
+}
+
+//----------------------------------------------------------------------
+// VariableListEntryHandler
+//----------------------------------------------------------------------
+
+VariableListEntryHandler::VariableListEntryHandler(IBaseHandler *parent)
+ : m_parent(parent), m_description(0), m_linkedTextHandler(0)
+{
+ addStartHandler("term",this,&VariableListEntryHandler::startTerm);
+ addEndHandler("term",this,&VariableListEntryHandler::endTerm);
+ addStartHandler("para",this,&VariableListEntryHandler::startParagraph);
+ addEndHandler("varlistentry",this,&VariableListEntryHandler::endVarListEntry);
+ addEndHandler("listitem",this,&VariableListEntryHandler::endListItem);
+}
+
+VariableListEntryHandler::~VariableListEntryHandler()
+{
+ delete m_description;
+}
+
+void VariableListEntryHandler::startVarListEntry(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"start varlistentry\n");
+}
+
+void VariableListEntryHandler::endVarListEntry()
+{
+ m_parent->setDelegate(0);
+ debug(2,"end varlistentry\n");
+}
+
+void VariableListEntryHandler::startListItem(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"start listitem\n");
+}
+
+void VariableListEntryHandler::endListItem()
+{
+ m_parent->setDelegate(0);
+ debug(2,"end listitem\n");
+}
+
+void VariableListEntryHandler::startTerm(const QXmlAttributes& /*attrib*/)
+{
+ m_curString="";
+ m_linkedTextHandler = new LinkedTextHandler(this,m_term);
+ m_linkedTextHandler->start("term");
+}
+
+void VariableListEntryHandler::endTerm()
+{
+ delete m_linkedTextHandler;
+}
+
+void VariableListEntryHandler::startParagraph(const QXmlAttributes& attrib)
+{
+ ASSERT(m_description==0);
+ m_description = new ParagraphHandler(this);
+ m_description->startParagraph(attrib);
+}
+
+ILinkedTextIterator *VariableListEntryHandler::term() const
+{
+ return new LinkedTextIterator(m_term);
+}
+
+
+//----------------------------------------------------------------------
+// VariableListHandler
+//----------------------------------------------------------------------
+
+VariableListHandler::VariableListHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_entries.setAutoDelete(TRUE);
+ addStartHandler("varlistentry",this,&VariableListHandler::startVarListEntry);
+ addStartHandler("listitem",this,&VariableListHandler::startListItem);
+ addEndHandler("variablelist",this,&VariableListHandler::endVariableList);
+}
+
+VariableListHandler::~VariableListHandler()
+{
+}
+
+void VariableListHandler::startVariableList(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"start variablelist\n");
+}
+
+void VariableListHandler::endVariableList()
+{
+ debug(2,"end variablelist\n");
+ m_parent->setDelegate(0);
+}
+
+void VariableListHandler::startVarListEntry(const QXmlAttributes& attrib)
+{
+ VariableListEntryHandler *vle = new VariableListEntryHandler(this);
+ vle->startVarListEntry(attrib);
+ m_curEntry = vle;
+ m_entries.append(vle);
+}
+
+void VariableListHandler::startListItem(const QXmlAttributes& attrib)
+{
+ ASSERT(m_curEntry!=0);
+ m_curEntry->startListItem(attrib);
+}
+
+IDocIterator *VariableListHandler::entries() const
+{
+ return new VariableListIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// HighlightHandler
+//----------------------------------------------------------------------
+
+HighlightHandler::HighlightHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ addEndHandler("highlight",this,&HighlightHandler::endHighlight);
+ addStartHandler("ref",this,&HighlightHandler::startRef);
+ addStartHandler("sp",this,&HighlightHandler::startSpace);
+ m_hl = IDocHighlight::Invalid;
+}
+
+HighlightHandler::~HighlightHandler()
+{
+}
+
+void HighlightHandler::startHighlight(const QXmlAttributes& attrib)
+{
+ m_hlString = attrib.value("class");
+ m_hl = s_highlightMapper->stringToKind(m_hlString);
+ m_curString="";
+ m_parent->setDelegate(this);
+ debug(2,"start highlight\n");
+}
+
+void HighlightHandler::endHighlight()
+{
+ addTextNode();
+ debug(2,"end highlight class=`%s'\n",m_hlString.data());
+ m_parent->setDelegate(0);
+}
+
+void HighlightHandler::startRef(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ RefHandler *rh = new RefHandler(this);
+ m_children.append(rh);
+ rh->startRef(attrib);
+}
+
+void HighlightHandler::startSpace(const QXmlAttributes&)
+{
+ m_curString=" ";
+ addTextNode();
+}
+
+void HighlightHandler::addTextNode()
+{
+ if (!m_curString.isEmpty())
+ {
+ m_children.append(new TextNode(m_curString,IDocMarkup::Normal,0));
+ debug(2,"addTextNode() text=\"%s\"\n",
+ m_curString.data());
+ m_curString="";
+ }
+}
+
+IDocIterator *HighlightHandler::codeElements() const
+{
+ return new HighlightIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// CodeLineHandler
+//----------------------------------------------------------------------
+
+CodeLineHandler::CodeLineHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ addEndHandler("codeline",this,&CodeLineHandler::endCodeLine);
+ addEndHandler("linenumber",this,&CodeLineHandler::endLineNumber);
+ addStartHandler("highlight",this,&CodeLineHandler::startHighlight);
+ addStartHandler("ref",this,&CodeLineHandler::startRef);
+ m_lineNumber = 0;
+}
+
+CodeLineHandler::~CodeLineHandler()
+{
+}
+
+void CodeLineHandler::startCodeLine(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"start codeline\n");
+}
+
+void CodeLineHandler::endCodeLine()
+{
+ addTextNode();
+ debug(2,"end codeline\n");
+ m_parent->setDelegate(0);
+}
+
+void CodeLineHandler::startLineNumber(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ debug(2,"start linenumber\n");
+ m_lineNumber = attrib.value("line").toInt();
+ m_refId = attrib.value("refid");
+}
+
+void CodeLineHandler::endLineNumber()
+{
+ m_parent->setDelegate(0);
+}
+
+void CodeLineHandler::startHighlight(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ HighlightHandler *hlh = new HighlightHandler(this);
+ m_children.append(hlh);
+ hlh->startHighlight(attrib);
+}
+
+void CodeLineHandler::startRef(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ RefHandler *rh = new RefHandler(this);
+ m_children.append(rh);
+ rh->startRef(attrib);
+}
+
+void CodeLineHandler::addTextNode()
+{
+ if (!m_curString.isEmpty())
+ {
+ m_children.append(new TextNode(m_curString,IDocMarkup::Normal,0));
+ debug(2,"addTextNode() text=\"%s\"\n",
+ m_curString.data());
+ m_curString="";
+ }
+}
+
+IDocIterator *CodeLineHandler::codeElements() const
+{
+ return new CodeLineIterator(*this);
+}
+
+
+//----------------------------------------------------------------------
+// ProgramListingHandler
+//----------------------------------------------------------------------
+
+ProgramListingHandler::ProgramListingHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ m_hasLineNumber=FALSE;
+ addEndHandler("programlisting",this,&ProgramListingHandler::endProgramListing);
+
+ addStartHandler("linenumber",this,&ProgramListingHandler::startLineNumber);
+ addStartHandler("codeline",this,&ProgramListingHandler::startCodeLine);
+}
+
+ProgramListingHandler::~ProgramListingHandler()
+{
+}
+
+void ProgramListingHandler::startProgramListing(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"start programlisting\n");
+}
+
+void ProgramListingHandler::endProgramListing()
+{
+ debug(2,"end programlisting\n");
+ m_parent->setDelegate(0);
+}
+
+void ProgramListingHandler::startLineNumber(const QXmlAttributes& attrib)
+{
+ CodeLineHandler *clh = new CodeLineHandler(this);
+ m_children.append(clh);
+ m_hasLineNumber=TRUE;
+ clh->startLineNumber(attrib);
+}
+
+void ProgramListingHandler::startCodeLine(const QXmlAttributes& attrib)
+{
+ CodeLineHandler *clh = 0;
+ if (!m_hasLineNumber)
+ {
+ clh = new CodeLineHandler(this);
+ m_children.append(clh);
+ }
+ else
+ {
+ clh = m_children.getLast();
+ }
+ ASSERT(clh!=0);
+ clh->startCodeLine(attrib);
+ m_hasLineNumber=FALSE;
+}
+
+IDocIterator *ProgramListingHandler::codeLines() const
+{
+ return new ProgramListingIterator(*this);
+}
+
+
+
+//----------------------------------------------------------------------
+// FormulaHandler
+//----------------------------------------------------------------------
+
+FormulaHandler::FormulaHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("formula",this,&FormulaHandler::endFormula);
+}
+
+FormulaHandler::~FormulaHandler()
+{
+}
+
+void FormulaHandler::startFormula(const QXmlAttributes& attrib)
+{
+ m_id = attrib.value("id");
+ m_curString="";
+ m_parent->setDelegate(this);
+}
+
+void FormulaHandler::endFormula()
+{
+ m_text = m_curString;
+ debug(2,"formula id=`%s' text=`%s'\n",m_id.data(),m_text.data());
+ m_parent->setDelegate(0);
+}
+
+//----------------------------------------------------------------------
+// AnchorHandler
+//----------------------------------------------------------------------
+
+AnchorHandler::AnchorHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("anchor",this,&AnchorHandler::endAnchor);
+}
+
+AnchorHandler::~AnchorHandler()
+{
+}
+
+void AnchorHandler::startAnchor(const QXmlAttributes& attrib)
+{
+ m_id = attrib.value("id");
+ m_parent->setDelegate(this);
+}
+
+void AnchorHandler::endAnchor()
+{
+ debug(2,"anchor id=`%s'\n",m_id.data());
+ m_parent->setDelegate(0);
+}
+
+//----------------------------------------------------------------------
+// ImageHandler
+//----------------------------------------------------------------------
+
+ImageHandler::ImageHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("image",this,&ImageHandler::endImage);
+}
+
+ImageHandler::~ImageHandler()
+{
+}
+
+void ImageHandler::startImage(const QXmlAttributes& attrib)
+{
+ m_name = attrib.value("name");
+ m_curString="";
+ m_parent->setDelegate(this);
+}
+
+void ImageHandler::endImage()
+{
+ m_caption = m_curString;
+ debug(2,"image name=`%s' caption=`%s'\n",m_name.data(),m_caption.data());
+ m_parent->setDelegate(0);
+}
+
+//----------------------------------------------------------------------
+// DotFileHandler
+//----------------------------------------------------------------------
+
+DotFileHandler::DotFileHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("dotfile",this,&DotFileHandler::endDotFile);
+}
+
+DotFileHandler::~DotFileHandler()
+{
+}
+
+void DotFileHandler::startDotFile(const QXmlAttributes& attrib)
+{
+ m_name = attrib.value("name");
+ m_curString="";
+ m_parent->setDelegate(this);
+}
+
+void DotFileHandler::endDotFile()
+{
+ m_caption = m_curString;
+ debug(2,"image name=`%s' caption=`%s'\n",m_name.data(),m_caption.data());
+ m_parent->setDelegate(0);
+}
+
+//----------------------------------------------------------------------
+// IndexEntryHandler
+//----------------------------------------------------------------------
+
+IndexEntryHandler::IndexEntryHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("indexentry",this,&IndexEntryHandler::endIndexEntry);
+ addStartHandler("primaryie",this,&IndexEntryHandler::startPrimaryIE);
+ addEndHandler("primaryie",this,&IndexEntryHandler::endPrimaryIE);
+ addStartHandler("secondaryie",this,&IndexEntryHandler::startSecondaryIE);
+ addEndHandler("secondaryie",this,&IndexEntryHandler::endSecondaryIE);
+}
+
+IndexEntryHandler::~IndexEntryHandler()
+{
+}
+
+void IndexEntryHandler::startIndexEntry(const QXmlAttributes& /*attrib*/)
+{
+ debug(2,"start index entry\n");
+ m_parent->setDelegate(this);
+}
+
+void IndexEntryHandler::endIndexEntry()
+{
+ debug(2,"index entry primary=`%s' secondary=`%s'\n",
+ m_primary.data(),m_secondary.data());
+ m_parent->setDelegate(0);
+}
+
+void IndexEntryHandler::startPrimaryIE(const QXmlAttributes& /*attrib*/)
+{
+ m_curString="";
+}
+
+void IndexEntryHandler::endPrimaryIE()
+{
+ m_primary = m_curString;
+}
+
+void IndexEntryHandler::startSecondaryIE(const QXmlAttributes& /*attrib*/)
+{
+ m_curString="";
+}
+
+void IndexEntryHandler::endSecondaryIE()
+{
+ m_secondary = m_curString;
+}
+
+//----------------------------------------------------------------------
+// EntryHandler
+//----------------------------------------------------------------------
+
+EntryHandler::EntryHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ addEndHandler("entry",this,&EntryHandler::endEntry);
+ addStartHandler("para",this,&EntryHandler::startParagraph);
+}
+
+EntryHandler::~EntryHandler()
+{
+}
+
+void EntryHandler::startEntry(const QXmlAttributes&)
+{
+ m_parent->setDelegate(this);
+}
+
+void EntryHandler::endEntry()
+{
+ m_parent->setDelegate(0);
+}
+
+void EntryHandler::startParagraph(const QXmlAttributes& attrib)
+{
+ ParagraphHandler *ph = new ParagraphHandler(this);
+ ph->startParagraph(attrib);
+ m_children.append(ph);
+}
+
+IDocIterator *EntryHandler::contents() const
+{
+ return new EntryIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// RowHandler
+//----------------------------------------------------------------------
+
+RowHandler::RowHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ addEndHandler("row",this,&RowHandler::endRow);
+ addStartHandler("entry",this,&RowHandler::startEntry);
+}
+
+RowHandler::~RowHandler()
+{
+}
+
+void RowHandler::startRow(const QXmlAttributes&)
+{
+ m_parent->setDelegate(this);
+}
+
+void RowHandler::endRow()
+{
+ m_parent->setDelegate(0);
+}
+
+void RowHandler::startEntry(const QXmlAttributes& attrib)
+{
+ EntryHandler *eh = new EntryHandler(this);
+ eh->startEntry(attrib);
+ m_children.append(eh);
+}
+
+IDocIterator *RowHandler::entries() const
+{
+ return new RowIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// TableHandler
+//----------------------------------------------------------------------
+
+TableHandler::TableHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+ addEndHandler("table",this,&TableHandler::endTable);
+ addStartHandler("row",this,&TableHandler::startRow);
+ addStartHandler("caption",this,&TableHandler::startCaption);
+ addEndHandler("caption",this,&TableHandler::endCaption);
+}
+
+TableHandler::~TableHandler()
+{
+}
+
+void TableHandler::startTable(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ m_numColumns = attrib.value("cols").toInt();
+ debug(2,"table cols=%d\n",m_numColumns);
+}
+
+void TableHandler::endTable()
+{
+ m_parent->setDelegate(0);
+}
+
+void TableHandler::startRow(const QXmlAttributes& attrib)
+{
+ RowHandler *rh = new RowHandler(this);
+ rh->startRow(attrib);
+ m_children.append(rh);
+}
+
+void TableHandler::startCaption(const QXmlAttributes& /*attrib*/)
+{
+ m_curString="";
+}
+
+void TableHandler::endCaption()
+{
+ m_caption = m_curString;
+}
+
+IDocIterator *TableHandler::rows() const
+{
+ return new TableIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// CopyHandler
+//----------------------------------------------------------------------
+
+CopyHandler::CopyHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+
+ addEndHandler("copydoc",this,&CopyHandler::endCopy);
+
+ addStartHandler("para",this,&CopyHandler::startParagraph);
+}
+
+CopyHandler::~CopyHandler()
+{
+}
+
+void CopyHandler::startCopy(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"start copy handler\n");
+}
+
+void CopyHandler::endCopy()
+{
+ debug(2,"end copy handler\n");
+ m_parent->setDelegate(0);
+}
+
+void CopyHandler::startParagraph(const QXmlAttributes& attrib)
+{
+ ParagraphHandler *parHandler = new ParagraphHandler(this);
+ parHandler->startParagraph(attrib);
+ m_children.append(parHandler);
+}
+
+IDocIterator *CopyHandler::contents() const
+{
+ return new CopyIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// VerbatimHandler
+//----------------------------------------------------------------------
+
+VerbatimHandler::VerbatimHandler(IBaseHandler *parent)
+ : m_parent(parent), m_type(IDocVerbatim::Invalid)
+{
+ addEndHandler("verbatim",this,&VerbatimHandler::endVerbatim);
+ addEndHandler("latexonly",this,&VerbatimHandler::endVerbatim);
+ addEndHandler("htmlonly",this,&VerbatimHandler::endVerbatim);
+}
+
+VerbatimHandler::~VerbatimHandler()
+{
+}
+
+void VerbatimHandler::startVerbatim(const QXmlAttributes&,Types type)
+{
+ m_type = type;
+ m_parent->setDelegate(this);
+ m_curString="";
+}
+
+void VerbatimHandler::endVerbatim()
+{
+ m_text = m_curString;
+ m_parent->setDelegate(0);
+}
+
+
+//----------------------------------------------------------------------
+// SymbolHandler
+//----------------------------------------------------------------------
+
+SymbolHandler::SymbolHandler(IBaseHandler *parent,Types type)
+ : m_parent(parent), m_letter('\0'), m_type(type)
+{
+ addEndHandler("symbol");
+ switch (type)
+ {
+ case IDocSymbol::Invalid: m_typeString="invalid"; break;
+ case IDocSymbol::Umlaut: m_typeString="umlaut"; break;
+ case IDocSymbol::Acute: m_typeString="acute"; break;
+ case IDocSymbol::Grave: m_typeString="grave"; break;
+ case IDocSymbol::Circ: m_typeString="circ"; break;
+ case IDocSymbol::Tilde: m_typeString="tilde"; break;
+ case IDocSymbol::Szlig: m_typeString="szlig"; break;
+ case IDocSymbol::Cedil: m_typeString="cedil"; break;
+ case IDocSymbol::Ring: m_typeString="ring"; break;
+ case IDocSymbol::Nbsp: m_typeString="nbsp"; break;
+ case IDocSymbol::Copy: m_typeString="copy"; break;
+ }
+}
+
+SymbolHandler::~SymbolHandler()
+{
+}
+
+void SymbolHandler::startSymbol(const QXmlAttributes& attrib)
+{
+ QString ls = attrib.value("char");
+ if (!ls.isEmpty()) m_letter = ls.latin1()[0];
+}
+
+//----------------------------------------------------------------------
+// ParagraphHandler
+//----------------------------------------------------------------------
+
+ParagraphHandler::ParagraphHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+
+ m_markupHandler = new MarkupHandler(m_children,m_curString);
+
+ // preformatted
+ setFallBackHandler(m_markupHandler);
+
+ addEndHandler("para",this,&ParagraphHandler::endParagraph);
+
+ addStartHandler("linebreak",this,&ParagraphHandler::startLineBreak);
+ addStartHandler("hruler",this,&ParagraphHandler::startHRuler);
+ addStartHandler("programlisting",this,&ParagraphHandler::startProgramListing);
+ addStartHandler("verbatim",this,&ParagraphHandler::startVerbatim);
+ addStartHandler("indexentry",this,&ParagraphHandler::startIndexEntry);
+ addStartHandler("orderedlist",this,&ParagraphHandler::startOrderedList);
+ addStartHandler("itemizedlist",this,&ParagraphHandler::startItemizedList);
+ addStartHandler("simplesect",this,&ParagraphHandler::startSimpleSect);
+ // TODO: title
+ addStartHandler("variablelist",this,&ParagraphHandler::startVariableList);
+ addStartHandler("table",this,&ParagraphHandler::startTable);
+ // TODO: heading
+ addStartHandler("image",this,&ParagraphHandler::startImage);
+ addStartHandler("dotfile",this,&ParagraphHandler::startDotFile);
+ addStartHandler("toclist",this,&ParagraphHandler::startTocList);
+ // TODO: language???
+ addStartHandler("parameterlist",this,&ParagraphHandler::startParameterList);
+ // TODO: xrefsect
+ addStartHandler("copydoc",this,&ParagraphHandler::startCopyDoc);
+
+ addStartHandler("ref",this,&ParagraphHandler::startRef);
+ addStartHandler("ulink",this,&ParagraphHandler::startULink);
+ addStartHandler("email",this,&ParagraphHandler::startEMail);
+ addStartHandler("link",this,&ParagraphHandler::startLink);
+ addStartHandler("formula",this,&ParagraphHandler::startFormula);
+ addStartHandler("latexonly",this,&ParagraphHandler::startHtmlOnly);
+ addStartHandler("htmlonly",this,&ParagraphHandler::startLatexOnly);
+ addStartHandler("umlaut",this,&ParagraphHandler::startUmlaut);
+ addStartHandler("acute",this,&ParagraphHandler::startAcute);
+ addStartHandler("grave",this,&ParagraphHandler::startGrave);
+ addStartHandler("circ",this,&ParagraphHandler::startCirc);
+ addStartHandler("tilde",this,&ParagraphHandler::startTilde);
+ addStartHandler("szlig",this,&ParagraphHandler::startSzlig);
+ addStartHandler("cedil",this,&ParagraphHandler::startCedil);
+ addStartHandler("ring",this,&ParagraphHandler::startRing);
+ addStartHandler("nbsp",this,&ParagraphHandler::startNbsp);
+ addStartHandler("copy",this,&ParagraphHandler::startCopy);
+ addStartHandler("anchor",this,&ParagraphHandler::startAnchor);
+}
+
+ParagraphHandler::~ParagraphHandler()
+{
+ delete m_markupHandler;
+}
+
+void ParagraphHandler::startParagraph(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"para\n");
+}
+
+void ParagraphHandler::endParagraph()
+{
+ addTextNode();
+ debug(2,"end para\n");
+ m_parent->setDelegate(0);
+}
+
+void ParagraphHandler::startItemizedList(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ ItemizedListHandler *listHandler = new ItemizedListHandler(this);
+ listHandler->startItemizedList(attrib);
+ m_children.append(listHandler);
+}
+
+void ParagraphHandler::startOrderedList(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ OrderedListHandler *listHandler = new OrderedListHandler(this);
+ listHandler->startOrderedList(attrib);
+ m_children.append(listHandler);
+}
+
+void ParagraphHandler::startParameterList(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ ParameterListHandler *listHandler = new ParameterListHandler(this);
+ listHandler->startParameterList(attrib);
+ m_children.append(listHandler);
+}
+
+void ParagraphHandler::startSimpleSect(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SimpleSectHandler *sectHandler = new SimpleSectHandler(this);
+ sectHandler->startSimpleSect(attrib);
+ m_children.append(sectHandler);
+}
+
+void ParagraphHandler::startRef(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ RefHandler *ref = new RefHandler(this);
+ ref->startRef(attrib);
+ m_children.append(ref);
+}
+
+void ParagraphHandler::startVariableList(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ VariableListHandler *vl = new VariableListHandler(this);
+ vl->startVariableList(attrib);
+ m_children.append(vl);
+}
+
+void ParagraphHandler::startHRuler(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ HRulerHandler *hr = new HRulerHandler(this);
+ hr->startHRuler(attrib);
+ m_children.append(hr);
+}
+
+void ParagraphHandler::startLineBreak(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ LineBreakHandler *lb = new LineBreakHandler(this);
+ lb->startLineBreak(attrib);
+ m_children.append(lb);
+}
+
+void ParagraphHandler::startULink(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ ULinkHandler *uh = new ULinkHandler(this);
+ uh->startULink(attrib);
+ m_children.append(uh);
+}
+
+void ParagraphHandler::startEMail(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ EMailHandler *eh = new EMailHandler(this);
+ eh->startEMail(attrib);
+ m_children.append(eh);
+}
+
+void ParagraphHandler::startLink(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ LinkHandler *lh = new LinkHandler(this);
+ lh->startLink(attrib);
+ m_children.append(lh);
+}
+
+void ParagraphHandler::startProgramListing(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ ProgramListingHandler *pl = new ProgramListingHandler(this);
+ pl->startProgramListing(attrib);
+ m_children.append(pl);
+}
+
+void ParagraphHandler::startFormula(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ FormulaHandler *fh = new FormulaHandler(this);
+ fh->startFormula(attrib);
+ m_children.append(fh);
+}
+
+void ParagraphHandler::startImage(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ ImageHandler *ih = new ImageHandler(this);
+ ih->startImage(attrib);
+ m_children.append(ih);
+}
+
+void ParagraphHandler::startDotFile(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ DotFileHandler *df = new DotFileHandler(this);
+ df->startDotFile(attrib);
+ m_children.append(df);
+}
+
+void ParagraphHandler::startIndexEntry(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ IndexEntryHandler *df = new IndexEntryHandler(this);
+ df->startIndexEntry(attrib);
+ m_children.append(df);
+}
+
+void ParagraphHandler::startTable(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ TableHandler *th = new TableHandler(this);
+ th->startTable(attrib);
+ m_children.append(th);
+}
+
+void ParagraphHandler::startVerbatim(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ VerbatimHandler *vh = new VerbatimHandler(this);
+ vh->startVerbatim(attrib,IDocVerbatim::Verbatim);
+ m_children.append(vh);
+}
+
+void ParagraphHandler::startHtmlOnly(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ VerbatimHandler *vh = new VerbatimHandler(this);
+ vh->startVerbatim(attrib,IDocVerbatim::HtmlOnly);
+ m_children.append(vh);
+}
+
+void ParagraphHandler::startLatexOnly(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ VerbatimHandler *vh = new VerbatimHandler(this);
+ vh->startVerbatim(attrib,IDocVerbatim::LatexOnly);
+ m_children.append(vh);
+}
+
+void ParagraphHandler::startUmlaut(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Umlaut);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startAcute(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Acute);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startGrave(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Grave);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startCirc(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Circ);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startTilde(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Tilde);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startSzlig(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Szlig);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startCedil(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Cedil);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startRing(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Ring);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startNbsp(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Nbsp);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startCopy(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Copy);
+ sh->startSymbol(attrib);
+ m_children.append(sh);
+}
+
+void ParagraphHandler::startAnchor(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ AnchorHandler *ah = new AnchorHandler(this);
+ ah->startAnchor(attrib);
+ m_children.append(ah);
+}
+
+void ParagraphHandler::startCopyDoc(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ CopyHandler *ch = new CopyHandler(this);
+ ch->startCopy(attrib);
+ m_children.append(ch);
+}
+
+void ParagraphHandler::startTocList(const QXmlAttributes& attrib)
+{
+ addTextNode();
+ TocListHandler *th = new TocListHandler(this);
+ th->startTocList(attrib);
+ m_children.append(th);
+}
+
+void ParagraphHandler::addTextNode()
+{
+ if (!m_curString.isEmpty())
+ {
+ m_children.append(
+ new TextNode(
+ m_curString,
+ m_markupHandler->markup(),
+ m_markupHandler->headingLevel()
+ )
+ );
+ debug(2,"addTextNode() text=\"%s\" markup=%x headingLevel=%d\n",
+ m_curString.data(),m_markupHandler->markup(),m_markupHandler->headingLevel());
+ m_curString="";
+ }
+}
+
+IDocIterator *ParagraphHandler::contents() const
+{
+ return new ParagraphIterator(*this);
+}
+
+//----------------------------------------------------------------------
+// DocSectionHandler
+//----------------------------------------------------------------------
+
+DocSectionHandler::DocSectionHandler(IBaseHandler *parent,int level)
+ : m_parent(parent), m_internal(0), m_level(level), m_title(0)
+{
+ QString sectionKey;
+ m_paragraphs.setAutoDelete(TRUE);
+ m_subsections.setAutoDelete(TRUE);
+ addStartHandler("title",this,&DocSectionHandler::startTitle);
+ addStartHandler("para",this,&DocSectionHandler::startParagraph);
+ if (level<6)
+ {
+ sectionKey.sprintf("sect%d",level+1);
+ addStartHandler(sectionKey,this,&DocSectionHandler::startSubSection);
+ }
+ addStartHandler("internal",this,&DocSectionHandler::startInternal);
+ sectionKey.sprintf("sect%d",level);
+ addEndHandler(sectionKey,this,&DocSectionHandler::endDocSection);
+}
+
+DocSectionHandler::~DocSectionHandler()
+{
+}
+
+void DocSectionHandler::startDocSection(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ debug(2,"Start docsection\n");
+ m_id = attrib.value("id");
+}
+
+void DocSectionHandler::endDocSection()
+{
+ m_parent->setDelegate(0);
+ debug(2,"End docsection\n");
+}
+
+void DocSectionHandler::startSubSection(const QXmlAttributes& attrib)
+{
+ DocSectionHandler *secHandler = new DocSectionHandler(this,m_level+1);
+ secHandler->startDocSection(attrib);
+ m_subsections.append(secHandler);
+}
+
+void DocSectionHandler::startParagraph(const QXmlAttributes& attrib)
+{
+ ParagraphHandler *parHandler = new ParagraphHandler(this);
+ parHandler->startParagraph(attrib);
+ m_paragraphs.append(parHandler);
+}
+
+void DocSectionHandler::startInternal(const QXmlAttributes& attrib)
+{
+ m_internal = new DocInternalHandler(this,m_level);
+ m_internal->startInternal(attrib);
+}
+
+void DocSectionHandler::startTitle(const QXmlAttributes& attrib)
+{
+ m_title = new TitleHandler(this);
+ m_title->startTitle(attrib);
+}
+
+IDocIterator *DocSectionHandler::paragraphs() const
+{
+ return new DocSectionParaIterator(*this);
+}
+
+IDocIterator *DocSectionHandler::subSections() const
+{
+ return new DocSectionSubIterator(*this);
+}
+
+IDocInternal *DocSectionHandler::internal() const
+{
+ return m_internal;
+}
+
+//----------------------------------------------------------------------
+// DocInternal
+//----------------------------------------------------------------------
+
+DocInternalHandler::DocInternalHandler(IBaseHandler *parent,int level)
+ : m_parent(parent), m_level(level)
+{
+ m_paragraphs.setAutoDelete(TRUE);
+ m_subsections.setAutoDelete(TRUE);
+ addStartHandler("para",this,&DocInternalHandler::startParagraph);
+ QString sectionKey;
+ sectionKey.sprintf("sect%d",level+1);
+ addStartHandler(sectionKey,this,&DocInternalHandler::startSubSection);
+ addEndHandler("internal",this,&DocInternalHandler::endInternal);
+}
+
+DocInternalHandler::~DocInternalHandler()
+{
+}
+
+void DocInternalHandler::startInternal(const QXmlAttributes&)
+{
+ m_parent->setDelegate(this);
+ debug(2,"Start internal\n");
+}
+
+void DocInternalHandler::endInternal()
+{
+ m_parent->setDelegate(0);
+ debug(2,"End internal\n");
+}
+
+void DocInternalHandler::startSubSection(const QXmlAttributes& attrib)
+{
+ DocSectionHandler *secHandler = new DocSectionHandler(this,m_level+1);
+ secHandler->startDocSection(attrib);
+ m_subsections.append(secHandler);
+}
+
+void DocInternalHandler::startParagraph(const QXmlAttributes& attrib)
+{
+ ParagraphHandler *parHandler = new ParagraphHandler(this);
+ parHandler->startParagraph(attrib);
+ m_paragraphs.append(parHandler);
+}
+
+IDocIterator *DocInternalHandler::paragraphs() const
+{
+ return new DocInternalParaIterator(*this);
+}
+
+IDocIterator *DocInternalHandler::subSections() const
+{
+ return new DocInternalSubIterator(*this);
+}
+
+
+//----------------------------------------------------------------------
+// DocHandler
+//----------------------------------------------------------------------
+
+DocHandler::DocHandler(IBaseHandler *parent) : m_parent(parent)
+{
+ m_children.setAutoDelete(TRUE);
+
+ addEndHandler("briefdescription",this,&DocHandler::endDoc);
+ addEndHandler("detaileddescription",this,&DocHandler::endDoc);
+ addEndHandler("inbodydescription",this,&DocHandler::endDoc);
+ //addEndHandler("internal"); // TODO: implement this as a section
+ addStartHandler("internal",this,&DocHandler::startInternal);
+
+ addStartHandler("para",this,&DocHandler::startParagraph);
+ addStartHandler("sect1",this,&DocHandler::startSect1);
+ addStartHandler("title",this,&DocHandler::startTitle);
+ //addStartHandler("internal");
+}
+
+DocHandler::~DocHandler()
+{
+}
+
+void DocHandler::startDoc(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"start dochandler\n");
+}
+
+void DocHandler::endDoc()
+{
+ debug(2,"end dochandler\n");
+ m_parent->setDelegate(0);
+}
+
+void DocHandler::startParagraph(const QXmlAttributes& attrib)
+{
+ ParagraphHandler *parHandler = new ParagraphHandler(this);
+ parHandler->startParagraph(attrib);
+ m_children.append(parHandler);
+}
+
+void DocHandler::startSect1(const QXmlAttributes& attrib)
+{
+ DocSectionHandler *secHandler = new DocSectionHandler(this,1);
+ secHandler->startDocSection(attrib);
+ m_children.append(secHandler);
+}
+
+void DocHandler::startTitle(const QXmlAttributes& attrib)
+{
+ TitleHandler *titleHandler = new TitleHandler(this);
+ titleHandler->startTitle(attrib);
+ m_children.append(titleHandler);
+}
+
+void DocHandler::startInternal(const QXmlAttributes& attrib)
+{
+ m_internal = new DocInternalHandler(this,1);
+ m_internal->startInternal(attrib);
+}
+
+IDocIterator *DocHandler::contents() const
+{
+ return new DocIterator(*this);
+}
+
+IDocInternal *DocHandler::internal() const
+{
+ return m_internal;
+}
+
diff --git a/addon/doxmlparser/src/dochandler.h b/addon/doxmlparser/src/dochandler.h
new file mode 100644
index 0000000..77fa379
--- /dev/null
+++ b/addon/doxmlparser/src/dochandler.h
@@ -0,0 +1,1352 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _DOCHANDLER_H
+#define _DOCHANDLER_H
+
+#include <qstring.h>
+#include <qlist.h>
+#include <qxml.h>
+
+#include <doxmlintf.h>
+#include "stringimpl.h"
+#include "basehandler.h"
+#include "baseiterator.h"
+
+class ParagraphHandler;
+class DocInternalHandler;
+class LinkedTextImpl;
+class LinkedTextHandler;
+
+//-----------------------------------------------------------------------------
+
+class DocImpl : public IDoc { public: virtual ~DocImpl() {} };
+
+#define DEFINE_CLS_IMPL(cls) \
+ class cls##Impl : public I##cls, public DocImpl { public: virtual ~cls##Impl() {} }
+
+DEFINE_CLS_IMPL(DocMarkup);
+DEFINE_CLS_IMPL(DocPara);
+DEFINE_CLS_IMPL(DocText);
+DEFINE_CLS_IMPL(DocMarkupModifier);
+DEFINE_CLS_IMPL(DocItemizedList);
+DEFINE_CLS_IMPL(DocOrderedList);
+DEFINE_CLS_IMPL(DocListItem);
+DEFINE_CLS_IMPL(DocParameterList);
+DEFINE_CLS_IMPL(DocParameterItem);
+DEFINE_CLS_IMPL(DocParameter);
+DEFINE_CLS_IMPL(DocTitle);
+DEFINE_CLS_IMPL(DocSimpleSect);
+DEFINE_CLS_IMPL(DocRef);
+DEFINE_CLS_IMPL(DocVariableList);
+DEFINE_CLS_IMPL(DocVariableListEntry);
+DEFINE_CLS_IMPL(DocHRuler);
+DEFINE_CLS_IMPL(DocLineBreak);
+DEFINE_CLS_IMPL(DocULink);
+DEFINE_CLS_IMPL(DocEMail);
+DEFINE_CLS_IMPL(DocLink);
+DEFINE_CLS_IMPL(DocProgramListing);
+DEFINE_CLS_IMPL(DocCodeLine);
+DEFINE_CLS_IMPL(DocHighlight);
+DEFINE_CLS_IMPL(DocFormula);
+DEFINE_CLS_IMPL(DocImage);
+DEFINE_CLS_IMPL(DocDotFile);
+DEFINE_CLS_IMPL(DocIndexEntry);
+DEFINE_CLS_IMPL(DocTable);
+DEFINE_CLS_IMPL(DocRow);
+DEFINE_CLS_IMPL(DocEntry);
+DEFINE_CLS_IMPL(DocSection);
+DEFINE_CLS_IMPL(DocVerbatim);
+DEFINE_CLS_IMPL(DocCopy);
+DEFINE_CLS_IMPL(DocTocList);
+DEFINE_CLS_IMPL(DocTocItem);
+DEFINE_CLS_IMPL(DocAnchor);
+DEFINE_CLS_IMPL(DocSymbol);
+DEFINE_CLS_IMPL(DocInternal);
+DEFINE_CLS_IMPL(DocRoot);
+
+//-----------------------------------------------------------------------------
+
+
+/*! \brief Node representing a piece of text.
+ *
+ */
+class TextNode : public DocTextImpl
+{
+ public:
+ TextNode(const QString &t,int markup,int level)
+ : m_text(t), m_markup(markup), m_headingLevel(level) {}
+ virtual ~TextNode() {}
+
+ // IDocText
+ virtual Kind kind() const { return DocImpl::Text; }
+ virtual const IString *text() const { return &m_text; }
+ virtual int markup() const { return m_markup; }
+ virtual int headingLevel() const { return m_headingLevel; }
+
+ private:
+ StringImpl m_text;
+ int m_markup;
+ int m_headingLevel;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a change in the markup style.
+ *
+ */
+class MarkupModifierNode : public DocMarkupModifierImpl
+{
+ public:
+ MarkupModifierNode(int markup,bool enabled,int level=0)
+ : m_markup(markup), m_enabled(enabled), m_headingLevel(level) {}
+ virtual ~MarkupModifierNode() {}
+
+ // IDocMarkupModifier
+ virtual Kind kind() const { return DocImpl::MarkupModifier; }
+ virtual bool enabled() const { return m_enabled; }
+ virtual int markup() const { return m_markup; }
+ virtual int headingLevel() const { return m_headingLevel; }
+
+ private:
+ int m_markup;
+ bool m_enabled;
+ int m_headingLevel;
+};
+
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Handles markup commands in the XML input.
+ *
+ */
+class MarkupHandler : public BaseFallBackHandler<MarkupHandler>
+{
+ public:
+ MarkupHandler(QList<DocImpl> &children,QString &curString);
+ virtual ~MarkupHandler();
+ int markup() const { return m_curMarkup; }
+ int headingLevel() const { return m_headingLevel; }
+
+ virtual void startBold(const QXmlAttributes &attrib);
+ virtual void endBold();
+ virtual void startEmphasis(const QXmlAttributes &attrib);
+ virtual void endEmphasis();
+ virtual void startComputerOutput(const QXmlAttributes &attrib);
+ virtual void endComputerOutput();
+ virtual void startCenter(const QXmlAttributes &attrib);
+ virtual void endCenter();
+ virtual void startSmallFont(const QXmlAttributes &attrib);
+ virtual void endSmallFont();
+ virtual void startSubscript(const QXmlAttributes &attrib);
+ virtual void endSubscript();
+ virtual void startSuperscript(const QXmlAttributes &attrib);
+ virtual void endSuperscript();
+ virtual void startPreformatted(const QXmlAttributes &attrib);
+ virtual void endPreformatted();
+ virtual void startHeading1(const QXmlAttributes &attrib);
+ virtual void endHeading1();
+ virtual void startHeading2(const QXmlAttributes &attrib);
+ virtual void endHeading2();
+ virtual void startHeading3(const QXmlAttributes &attrib);
+ virtual void endHeading3();
+ virtual void startHeading4(const QXmlAttributes &attrib);
+ virtual void endHeading4();
+ virtual void startHeading5(const QXmlAttributes &attrib);
+ virtual void endHeading5();
+ virtual void startHeading6(const QXmlAttributes &attrib);
+ virtual void endHeading6();
+
+
+ private:
+ void addTextNode();
+
+ QList<DocImpl> &m_children;
+ QString &m_curString;
+ int m_curMarkup;
+ int m_headingLevel;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a paragraph of text and commands.
+ *
+ */
+// children: itemizedlist, orderedlist, parameterlist, simplesect, ref,
+// variablelist, hruler, linebreak, ulink, email, link
+// programlisting, formula, image, dotfile, indexentry,
+// table
+//
+// children handled by MarkupHandler:
+// bold, computeroutput, emphasis, center,
+// small, subscript, superscript.
+//
+class ParagraphHandler : public DocParaImpl,
+ public BaseHandler<ParagraphHandler>
+{
+ friend class ParagraphIterator;
+
+ public:
+ virtual void startParagraph(const QXmlAttributes& attrib);
+ virtual void endParagraph();
+ virtual void startItemizedList(const QXmlAttributes& attrib);
+ virtual void startOrderedList(const QXmlAttributes& attrib);
+ virtual void startParameterList(const QXmlAttributes& attrib);
+ virtual void startSimpleSect(const QXmlAttributes& attrib);
+ virtual void startRef(const QXmlAttributes& attrib);
+ virtual void startVariableList(const QXmlAttributes& attrib);
+ virtual void startHRuler(const QXmlAttributes& attrib);
+ virtual void startLineBreak(const QXmlAttributes& attrib);
+ virtual void startULink(const QXmlAttributes& attrib);
+ virtual void startEMail(const QXmlAttributes& attrib);
+ virtual void startLink(const QXmlAttributes& attrib);
+ virtual void startProgramListing(const QXmlAttributes& attrib);
+ virtual void startFormula(const QXmlAttributes& attrib);
+ virtual void startImage(const QXmlAttributes& attrib);
+ virtual void startDotFile(const QXmlAttributes& attrib);
+ virtual void startIndexEntry(const QXmlAttributes& attrib);
+ virtual void startTable(const QXmlAttributes& attrib);
+ virtual void startVerbatim(const QXmlAttributes& attrib);
+ virtual void startHtmlOnly(const QXmlAttributes& attrib);
+ virtual void startLatexOnly(const QXmlAttributes& attrib);
+ virtual void startUmlaut(const QXmlAttributes& attrib);
+ virtual void startAcute(const QXmlAttributes& attrib);
+ virtual void startGrave(const QXmlAttributes& attrib);
+ virtual void startCirc(const QXmlAttributes& attrib);
+ virtual void startTilde(const QXmlAttributes& attrib);
+ virtual void startSzlig(const QXmlAttributes& attrib);
+ virtual void startCedil(const QXmlAttributes& attrib);
+ virtual void startRing(const QXmlAttributes& attrib);
+ virtual void startNbsp(const QXmlAttributes& attrib);
+ virtual void startCopy(const QXmlAttributes& attrib);
+ virtual void startAnchor(const QXmlAttributes& attrib);
+ virtual void startCopyDoc(const QXmlAttributes& attrib);
+ virtual void startTocList(const QXmlAttributes& attrib);
+
+ ParagraphHandler(IBaseHandler *parent);
+ virtual ~ParagraphHandler();
+
+ // IDocPara
+ virtual Kind kind() const { return DocImpl::Para; }
+ virtual IDocIterator *contents() const;
+
+ private:
+ void addTextNode();
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_children;
+ MarkupHandler *m_markupHandler;
+};
+
+class ParagraphIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ ParagraphIterator(const ParagraphHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a list item.
+ *
+ */
+class ListItemHandler : public DocListItemImpl, public BaseHandler<ListItemHandler>
+{
+ friend class ListItemIterator;
+ public:
+ ListItemHandler(IBaseHandler *parent);
+ virtual ~ListItemHandler();
+ virtual void startListItem(const QXmlAttributes& attrib);
+ virtual void endListItem();
+ virtual void startParagraph(const QXmlAttributes& attrib);
+
+ // IDocItem
+ virtual Kind kind() const { return DocImpl::ListItem; }
+ virtual IDocIterator *contents() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_children;
+};
+
+class ListItemIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ ListItemIterator(const ListItemHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing list of items.
+ *
+ */
+class OrderedListHandler : public DocOrderedListImpl, public BaseHandler<OrderedListHandler>
+{
+ friend class OrderedListIterator;
+ public:
+ OrderedListHandler(IBaseHandler *parent);
+ virtual ~OrderedListHandler();
+ virtual void startOrderedList(const QXmlAttributes& attrib);
+ virtual void endOrderedList();
+ virtual void startOrderedListItem(const QXmlAttributes& attrib);
+
+ // IDocOrderedList
+ virtual Kind kind() const { return DocImpl::OrderedList; }
+ virtual IDocIterator *elements() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_children;
+};
+
+class OrderedListIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ OrderedListIterator(const OrderedListHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing table of contents list.
+ *
+ */
+class TocListHandler : public DocTocListImpl, public BaseHandler<TocListHandler>
+{
+ friend class TocListIterator;
+ public:
+ TocListHandler(IBaseHandler *parent);
+ virtual ~TocListHandler();
+ virtual void startTocList(const QXmlAttributes& attrib);
+ virtual void endTocList();
+ virtual void startTocItem(const QXmlAttributes& attrib);
+
+ // IDocTocList
+ virtual Kind kind() const { return DocImpl::TocList; }
+ virtual IDocIterator *elements() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_children;
+};
+
+class TocListIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ TocListIterator(const TocListHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a table of contents item.
+ *
+ */
+class TocItemHandler : public DocTocItemImpl, public BaseHandler<TocItemHandler>
+{
+ friend class TocItemIterator;
+ public:
+ TocItemHandler(IBaseHandler *parent);
+ virtual ~TocItemHandler();
+ virtual void startTocItem(const QXmlAttributes& attrib);
+ virtual void endTocItem();
+
+ // IDocItem
+ virtual Kind kind() const { return DocImpl::TocItem; }
+ virtual const IString *id() const { return &m_id; }
+ virtual const IString *title() const { return &m_title; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_id;
+ StringImpl m_title;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing list of items.
+ *
+ */
+class ItemizedListHandler : public DocItemizedListImpl, public BaseHandler<ItemizedListHandler>
+{
+ friend class ItemizedListIterator;
+ public:
+ ItemizedListHandler(IBaseHandler *parent);
+ virtual ~ItemizedListHandler();
+ virtual void startItemizedList(const QXmlAttributes& attrib);
+ virtual void endItemizedList();
+ virtual void startItemizedListItem(const QXmlAttributes& attrib);
+
+ // IDocItemizedList
+ virtual Kind kind() const { return DocImpl::ItemizedList; }
+ virtual IDocIterator *elements() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_children;
+};
+
+class ItemizedListIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ ItemizedListIterator(const ItemizedListHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+
+//-----------------------------------------------------------------------------
+/*! \brief Node representing a parameter.
+ *
+ */
+class ParameterHandler : public DocParameterImpl,
+ public BaseHandler<ParameterHandler>
+{
+ public:
+ ParameterHandler(IBaseHandler *parent);
+ virtual ~ParameterHandler();
+ virtual void startParameterName(const QXmlAttributes& attrib);
+ virtual void endParameterName();
+
+ // IDocParameter
+ virtual Kind kind() const { return DocImpl::Parameter; }
+ virtual const IString *name() const { return &m_name; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_name;
+};
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing a list of param names with a single description.
+ *
+ */
+class ParameterItemHandler : public DocParameterItemImpl,
+ public BaseHandler<ParameterItemHandler>
+{
+ friend class ParameterItemIterator;
+ public:
+ ParameterItemHandler(IBaseHandler *parent);
+ virtual ~ParameterItemHandler();
+ virtual void startParameterItem(const QXmlAttributes& attrib);
+ virtual void endParameterItem();
+ virtual void startParameterName(const QXmlAttributes& attrib);
+ virtual void startParagraph(const QXmlAttributes& attrib);
+
+ // IDocParameterItem
+ virtual Kind kind() const { return DocImpl::ParameterItem; }
+ virtual IDocIterator *paramNames() const;
+ virtual IDocPara *description() const { return m_description; }
+
+ private:
+ IBaseHandler *m_parent;
+ QList<ParameterHandler> m_parameters;
+ ParagraphHandler *m_description;
+};
+
+class ParameterItemIterator : public BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>
+{
+ public:
+ ParameterItemIterator(const ParameterItemHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>(handler.m_parameters) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing a parameter section.
+ *
+ */
+class ParameterListHandler : public DocParameterListImpl,
+ public BaseHandler<ParameterListHandler>
+{
+ friend class ParameterListIterator;
+ public:
+ ParameterListHandler(IBaseHandler *parent);
+ virtual ~ParameterListHandler();
+ virtual void startParameterList(const QXmlAttributes& attrib);
+ virtual void endParameterList();
+ virtual void startParameterItem(const QXmlAttributes& attrib);
+
+ // IDocParameterList
+ virtual Kind kind() const { return DocImpl::ParameterList; }
+ virtual Types sectType() const { return m_type; }
+ virtual IDocIterator *params() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<ParameterItemHandler> m_paramItems;
+ Types m_type;
+};
+
+class ParameterListIterator : public BaseIteratorVia<IDocIterator,IDoc,ParameterItemHandler,DocImpl>
+{
+ public:
+ ParameterListIterator(const ParameterListHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,ParameterItemHandler,DocImpl>(handler.m_paramItems) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing a horizontal ruler
+ *
+ */
+class LineBreakHandler : public DocLineBreakImpl, public BaseHandler<LineBreakHandler>
+{
+ public:
+ LineBreakHandler(IBaseHandler *parent);
+ virtual ~LineBreakHandler();
+
+ void startLineBreak(const QXmlAttributes& attrib);
+ void endLineBreak();
+
+ // IDocLineBreak
+ virtual Kind kind() const { return DocImpl::LineBreak; }
+
+ private:
+ IBaseHandler *m_parent;
+};
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing a link to section
+ *
+ */
+class LinkHandler : public DocLinkImpl, public BaseHandler<LinkHandler>
+{
+ public:
+ LinkHandler(IBaseHandler *parent);
+ virtual ~LinkHandler();
+
+ void startLink(const QXmlAttributes& attrib);
+ void endLink();
+
+ // IDocLink
+ virtual Kind kind() const { return DocImpl::Link; }
+ virtual const IString *refId() const { return &m_ref; }
+ virtual const IString *text() const { return &m_text; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_ref;
+ StringImpl m_text;
+};
+
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing a link to an email address
+ *
+ */
+class EMailHandler : public DocEMailImpl, public BaseHandler<EMailHandler>
+{
+ public:
+ EMailHandler(IBaseHandler *parent);
+ virtual ~EMailHandler();
+
+ void startEMail(const QXmlAttributes& attrib);
+ void endEMail();
+
+ // IDocEMail
+ virtual Kind kind() const { return DocImpl::EMail; }
+ virtual const IString *address() const { return &m_address; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_address;
+};
+
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing a link to an URL
+ *
+ */
+class ULinkHandler : public DocULinkImpl, public BaseHandler<ULinkHandler>
+{
+ public:
+ ULinkHandler(IBaseHandler *parent);
+ virtual ~ULinkHandler();
+
+ void startULink(const QXmlAttributes& attrib);
+ void endULink();
+
+ // IDocULink
+ virtual Kind kind() const { return DocImpl::ULink; }
+ virtual const IString * url() const { return &m_url; }
+ virtual const IString * text() const { return &m_text; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_url;
+ StringImpl m_text;
+};
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing a horizontal ruler
+ *
+ */
+class HRulerHandler : public DocHRulerImpl, public BaseHandler<HRulerHandler>
+{
+ public:
+ HRulerHandler(IBaseHandler *parent);
+ virtual ~HRulerHandler();
+
+ void startHRuler(const QXmlAttributes& attrib);
+ void endHRuler();
+
+ // IDocHRuler
+ virtual Kind kind() const { return DocImpl::HRuler; }
+
+ private:
+ IBaseHandler *m_parent;
+};
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing a reference to another item
+ *
+ */
+class RefHandler : public DocRefImpl, public BaseHandler<RefHandler>
+{
+ public:
+ RefHandler(IBaseHandler *parent);
+ virtual ~RefHandler();
+ void startRef(const QXmlAttributes& attrib);
+ void endRef();
+
+ // IDocRef
+ virtual Kind kind() const { return DocImpl::Ref; }
+ virtual const IString *refId() const { return &m_refId; }
+ virtual TargetKind targetKind() const { return m_targetKind; }
+ virtual const IString *external() const { return &m_extId; }
+ virtual const IString *text() const { return &m_linkText; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_refId;
+ StringImpl m_extId;
+ StringImpl m_linkText;
+ TargetKind m_targetKind;
+};
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing the title of a section
+ *
+ */
+// children: text, ref
+// children handled by MarkupHandler:
+// bold, computeroutput, emphasis, center,
+// small, subscript, superscript.
+class TitleHandler : public DocTitleImpl, public BaseHandler<TitleHandler>
+{
+ friend class TitleIterator;
+ public:
+ TitleHandler(IBaseHandler *parent);
+ virtual ~TitleHandler();
+ virtual void startTitle(const QXmlAttributes& attrib);
+ virtual void endTitle();
+ virtual void startRef(const QXmlAttributes& attrib);
+ void addTextNode();
+
+ // IDocTitle
+ virtual Kind kind() const { return DocImpl::Title; }
+ virtual IDocIterator *title() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_children;
+ MarkupHandler *m_markupHandler;
+};
+
+class TitleIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ TitleIterator(const TitleHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing a simple section with an unnumbered header.
+ *
+ */
+// children: title, para
+class SimpleSectHandler : public DocSimpleSectImpl,
+ public BaseHandler<SimpleSectHandler>
+{
+ public:
+ SimpleSectHandler(IBaseHandler *parent);
+ virtual ~SimpleSectHandler();
+ virtual void startSimpleSect(const QXmlAttributes& attrib);
+ virtual void endSimpleSect();
+ virtual void startTitle(const QXmlAttributes& attrib);
+ virtual void startParagraph(const QXmlAttributes& attrib);
+
+ // IDocSimpleSect
+ virtual Kind kind() const { return DocImpl::SimpleSect; }
+ virtual Types type() const { return m_type; }
+ virtual const IString *typeString() const { return &m_typeString; }
+ virtual IDocTitle *title() const { return m_title; }
+ virtual IDocPara *description() const { return m_paragraph; }
+
+ private:
+ IBaseHandler *m_parent;
+ ParagraphHandler *m_paragraph;
+ Types m_type;
+ StringImpl m_typeString;
+ TitleHandler *m_title;
+};
+
+//-----------------------------------------------------------------------------
+
+/* \brief Node representing an named item of a VariableList.
+ *
+ */
+class VariableListEntryHandler : public DocVariableListEntryImpl,
+ public BaseHandler<VariableListEntryHandler>
+{
+ public:
+ virtual void startVarListEntry(const QXmlAttributes& attrib);
+ virtual void endVarListEntry();
+ virtual void startListItem(const QXmlAttributes& attrib);
+ virtual void endListItem();
+ virtual void startTerm(const QXmlAttributes& attrib);
+ virtual void endTerm();
+ virtual void startParagraph(const QXmlAttributes& attrib);
+
+ VariableListEntryHandler(IBaseHandler *parent);
+ virtual ~VariableListEntryHandler();
+
+ // IDocVariableListEntry
+ virtual Kind kind() const { return DocImpl::VariableListEntry; }
+ virtual ILinkedTextIterator *term() const;
+ virtual IDocPara *description() const { return m_description; }
+
+ private:
+ IBaseHandler* m_parent;
+ QList<LinkedTextImpl> m_term;
+ ParagraphHandler* m_description;
+ LinkedTextHandler* m_linkedTextHandler;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a list of named items.
+ *
+ */
+// children: varlistentry, listitem
+class VariableListHandler : public DocVariableListImpl,
+ public BaseHandler<VariableListHandler>
+{
+ friend class VariableListIterator;
+
+ public:
+ virtual void startVariableList(const QXmlAttributes& attrib);
+ virtual void endVariableList();
+ virtual void startVarListEntry(const QXmlAttributes& attrib);
+ virtual void startListItem(const QXmlAttributes& attrib);
+
+ VariableListHandler(IBaseHandler *parent);
+ virtual ~VariableListHandler();
+
+ // IDocVariableList
+ virtual Kind kind() const { return DocImpl::VariableList; }
+ virtual IDocIterator *entries() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<VariableListEntryHandler> m_entries;
+ VariableListEntryHandler *m_curEntry;
+};
+
+class VariableListIterator : public BaseIteratorVia<IDocIterator,IDoc,VariableListEntryHandler,DocImpl>
+{
+ public:
+ VariableListIterator(const VariableListHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,VariableListEntryHandler,DocImpl>(handler.m_entries) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a highlighted text fragment.
+ *
+ */
+// children: ref
+class HighlightHandler : public DocHighlightImpl, public BaseHandler<HighlightHandler>
+{
+ friend class HighlightIterator;
+ public:
+ HighlightHandler(IBaseHandler *parent);
+ virtual ~HighlightHandler();
+ void startHighlight(const QXmlAttributes& attrib);
+ void endHighlight();
+ virtual void startRef(const QXmlAttributes&);
+ virtual void startSpace(const QXmlAttributes&);
+
+ // IDocHighlight
+ virtual Kind kind() const { return DocImpl::Highlight; }
+ virtual HighlightKind highlightKind() const { return m_hl; }
+ virtual IDocIterator *codeElements() const;
+
+ private:
+ void addTextNode();
+
+ IBaseHandler *m_parent;
+ HighlightKind m_hl;
+ QString m_hlString;
+ QList<DocImpl> m_children;
+};
+
+class HighlightIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ HighlightIterator(const HighlightHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a line of code.
+ *
+ */
+// children: linenumber, highlight, anchor, ref
+class CodeLineHandler : public DocCodeLineImpl, public BaseHandler<CodeLineHandler>
+{
+ friend class CodeLineIterator;
+ public:
+
+ virtual void startCodeLine(const QXmlAttributes&);
+ virtual void endCodeLine();
+ virtual void startLineNumber(const QXmlAttributes&);
+ virtual void endLineNumber();
+ virtual void startHighlight(const QXmlAttributes&);
+ virtual void startRef(const QXmlAttributes&);
+
+ CodeLineHandler(IBaseHandler *parent);
+ virtual ~CodeLineHandler();
+
+ // IDocCodeLine
+ virtual Kind kind() const { return DocImpl::CodeLine; }
+ virtual int lineNumber() const { return m_lineNumber; }
+ virtual const IString *refId() const { return &m_refId; }
+ virtual IDocIterator *codeElements() const;
+
+ private:
+ void addTextNode();
+
+ IBaseHandler *m_parent;
+ int m_lineNumber;
+ StringImpl m_refId;
+ QList<DocImpl> m_children;
+};
+
+class CodeLineIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ CodeLineIterator(const CodeLineHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a program listing
+ *
+ */
+// children: codeline, linenumber
+class ProgramListingHandler : public DocProgramListingImpl, public BaseHandler<ProgramListingHandler>
+{
+ friend class ProgramListingIterator;
+ public:
+ virtual void startProgramListing(const QXmlAttributes& attrib);
+ virtual void endProgramListing();
+ virtual void startCodeLine(const QXmlAttributes&);
+ virtual void startLineNumber(const QXmlAttributes&);
+
+ ProgramListingHandler(IBaseHandler *parent);
+ virtual ~ProgramListingHandler();
+
+ // IDocProgramListing
+ virtual Kind kind() const { return DocImpl::ProgramListing; }
+ virtual IDocIterator *codeLines() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<CodeLineHandler> m_children;
+ bool m_hasLineNumber;
+};
+
+//-----------------------------------------------------------------------------
+
+class ProgramListingIterator : public BaseIteratorVia<IDocIterator,IDoc,CodeLineHandler,DocImpl>
+{
+ public:
+ ProgramListingIterator(const ProgramListingHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,CodeLineHandler,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a formula.
+ *
+ */
+// children: -
+class FormulaHandler : public DocFormulaImpl, public BaseHandler<FormulaHandler>
+{
+ public:
+ FormulaHandler(IBaseHandler *parent);
+ virtual ~FormulaHandler();
+ void startFormula(const QXmlAttributes& attrib);
+ void endFormula();
+
+ // IDocFormula
+ virtual Kind kind() const { return DocImpl::Formula; }
+ virtual const IString *id() const { return &m_id; }
+ virtual const IString *text() const { return &m_text; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_id;
+ StringImpl m_text;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing an image.
+ *
+ */
+// children: -
+class ImageHandler : public DocImageImpl, public BaseHandler<ImageHandler>
+{
+ public:
+ ImageHandler(IBaseHandler *parent);
+ virtual ~ImageHandler();
+ void startImage(const QXmlAttributes& attrib);
+ void endImage();
+
+ // IDocImage
+ virtual Kind kind() const { return DocImpl::Image; }
+ virtual const IString *name() const { return &m_name; }
+ virtual const IString *caption() const { return &m_caption; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_name;
+ StringImpl m_caption;
+};
+
+
+//-----------------------------------------------------------------------------
+/*! \brief Node representing an anchor.
+ *
+ */
+// children: -
+class AnchorHandler : public DocAnchorImpl, public BaseHandler<AnchorHandler>
+{
+ public:
+ AnchorHandler(IBaseHandler *parent);
+ virtual ~AnchorHandler();
+ void startAnchor(const QXmlAttributes& attrib);
+ void endAnchor();
+
+ // IDocAnchor
+ virtual Kind kind() const { return DocImpl::Anchor; }
+ virtual const IString *id() const { return &m_id; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_id;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a dot file.
+ *
+ */
+// children: -
+class DotFileHandler : public DocDotFileImpl, public BaseHandler<DotFileHandler>
+{
+ public:
+ DotFileHandler(IBaseHandler *parent);
+ virtual ~DotFileHandler();
+ void startDotFile(const QXmlAttributes& attrib);
+ void endDotFile();
+
+ // IDocDotFile
+ virtual Kind kind() const { return DocImpl::DotFile; }
+ virtual const IString *name() const { return &m_name; }
+ virtual const IString *caption() const { return &m_caption; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_name;
+ StringImpl m_caption;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing an entry in the index.
+ *
+ */
+// children: -
+class IndexEntryHandler : public DocIndexEntryImpl, public BaseHandler<IndexEntryHandler>
+{
+ public:
+ IndexEntryHandler(IBaseHandler *parent);
+ virtual ~IndexEntryHandler();
+ void startIndexEntry(const QXmlAttributes& attrib);
+ void endIndexEntry();
+ void startPrimaryIE(const QXmlAttributes& attrib);
+ void endPrimaryIE();
+ void startSecondaryIE(const QXmlAttributes& attrib);
+ void endSecondaryIE();
+
+ // IDocIndexEntry
+ virtual Kind kind() const { return DocImpl::IndexEntry; }
+ virtual const IString *primary() const { return &m_primary; }
+ virtual const IString *secondary() const { return &m_secondary; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_primary;
+ StringImpl m_secondary;
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing an entry in the table entry.
+ *
+ */
+// children: para
+class EntryHandler : public DocEntryImpl, public BaseHandler<EntryHandler>
+{
+ friend class EntryIterator;
+ public:
+ EntryHandler(IBaseHandler *parent);
+ virtual ~EntryHandler();
+ void startEntry(const QXmlAttributes& attrib);
+ void endEntry();
+ void startParagraph(const QXmlAttributes& attrib);
+
+ // IDocEntry
+ virtual Kind kind() const { return DocImpl::Entry; }
+ virtual IDocIterator *contents() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_children;
+};
+
+class EntryIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ EntryIterator(const EntryHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing an entry in the table row.
+ *
+ */
+// children: entry
+class RowHandler : public DocRowImpl, public BaseHandler<RowHandler>
+{
+ friend class RowIterator;
+ public:
+ RowHandler(IBaseHandler *parent);
+ virtual ~RowHandler();
+ void startRow(const QXmlAttributes& attrib);
+ void endRow();
+ void startEntry(const QXmlAttributes& attrib);
+
+ // IDocRow
+ virtual Kind kind() const { return DocImpl::Row; }
+ virtual IDocIterator *entries() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<EntryHandler> m_children;
+};
+
+class RowIterator : public BaseIteratorVia<IDocIterator,IDoc,EntryHandler,DocImpl>
+{
+ public:
+ RowIterator(const RowHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,EntryHandler,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing an entry in the table.
+ *
+ */
+// children: row, caption
+class TableHandler : public DocTableImpl, public BaseHandler<TableHandler>
+{
+ friend class TableIterator;
+ public:
+ TableHandler(IBaseHandler *parent);
+ virtual ~TableHandler();
+ void startTable(const QXmlAttributes& attrib);
+ void endTable();
+ void startRow(const QXmlAttributes& attrib);
+ void startCaption(const QXmlAttributes& attrib);
+ void endCaption();
+
+ // IDocTable
+ virtual Kind kind() const { return DocImpl::Table; }
+ virtual IDocIterator *rows() const;
+ virtual int numColumns() const { return m_numColumns; }
+ virtual const IString *caption() const { return &m_caption; }
+
+ private:
+ IBaseHandler *m_parent;
+ QList<RowHandler> m_children;
+ int m_numColumns;
+ StringImpl m_caption;
+};
+
+class TableIterator : public BaseIteratorVia<IDocIterator,IDoc,RowHandler,DocImpl>
+{
+ public:
+ TableIterator(const TableHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,RowHandler,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a copied piece of documentation.
+ *
+ */
+class CopyHandler : public DocCopyImpl, public BaseHandler<CopyHandler>
+{
+ friend class CopyIterator;
+ public:
+ CopyHandler(IBaseHandler *parent);
+ virtual ~CopyHandler();
+ virtual void startCopy(const QXmlAttributes& attrib);
+ virtual void endCopy();
+ virtual void startParagraph(const QXmlAttributes& attrib);
+
+ // IDocCopy
+ virtual Kind kind() const { return DocImpl::Copy; }
+ virtual IDocIterator *contents() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_children;
+};
+
+class CopyIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ CopyIterator(const CopyHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing an preformatted section
+ */
+class VerbatimHandler : public DocVerbatimImpl,
+ public BaseHandler<VerbatimHandler>
+{
+ public:
+ VerbatimHandler(IBaseHandler *parent);
+ virtual ~VerbatimHandler();
+ void startVerbatim(const QXmlAttributes& attrib,Types type);
+ void endVerbatim();
+
+ // IDocVerbatim
+ virtual Kind kind() const { return DocImpl::Verbatim; }
+ virtual const IString *text() const { return &m_text; }
+ virtual Types type() const { return m_type; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_text;
+ Types m_type;
+};
+
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing an special symbol.
+ *
+ */
+// children: -
+class SymbolHandler : public DocSymbolImpl, public BaseHandler<SymbolHandler>
+{
+ public:
+ SymbolHandler(IBaseHandler *parent,Types type);
+ virtual ~SymbolHandler();
+ void startSymbol(const QXmlAttributes& attrib);
+ void endSymbol();
+
+ // IDocSymbol
+ virtual Kind kind() const { return DocImpl::Symbol; }
+ virtual Types type() const { return m_type; }
+ virtual const IString *typeString() const { return &m_typeString; }
+ virtual char letter() const { return m_letter; }
+
+ private:
+ IBaseHandler *m_parent;
+ char m_letter;
+ Types m_type;
+ StringImpl m_typeString;
+};
+
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a section.
+ *
+ */
+// children: title, para, sect(n+1)
+class DocSectionHandler : public DocSectionImpl, public BaseHandler<DocSectionHandler>
+{
+ friend class DocSectionParaIterator;
+ friend class DocSectionSubIterator;
+ public:
+ DocSectionHandler(IBaseHandler *parent,int level);
+ virtual ~DocSectionHandler();
+ virtual void startDocSection(const QXmlAttributes& attrib);
+ virtual void endDocSection();
+ virtual void startTitle(const QXmlAttributes& attrib);
+ virtual void startSubSection(const QXmlAttributes& attrib);
+ virtual void startParagraph(const QXmlAttributes& attrib);
+ virtual void startInternal(const QXmlAttributes& attrib);
+
+ // IDocSection
+ virtual Kind kind() const { return DocImpl::Section; }
+ virtual const IString *id() const { return &m_id; }
+ virtual int level() const { return m_level; }
+ virtual IDocTitle *title() const { return m_title; }
+ virtual IDocIterator *paragraphs() const;
+ virtual IDocIterator *subSections() const;
+ virtual IDocInternal *internal() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_paragraphs;
+ QList<DocImpl> m_subsections;
+ DocInternalHandler *m_internal;
+ StringImpl m_id;
+ int m_level;
+ TitleHandler *m_title;
+};
+
+class DocSectionParaIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ DocSectionParaIterator(const DocSectionHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_paragraphs) {}
+};
+
+class DocSectionSubIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ DocSectionSubIterator(const DocSectionHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_subsections) {}
+};
+
+//-----------------------------------------------------------------------------
+
+class DocInternalHandler : public DocInternalImpl, public BaseHandler<DocInternalHandler>
+{
+ public:
+ friend class DocInternalParaIterator;
+ friend class DocInternalSubIterator;
+ DocInternalHandler(IBaseHandler *parent,int level);
+ virtual ~DocInternalHandler();
+ virtual void startInternal(const QXmlAttributes& attrib);
+ virtual void endInternal();
+ virtual void startSubSection(const QXmlAttributes& attrib);
+ virtual void startParagraph(const QXmlAttributes& attrib);
+
+ // IDocInternal
+ virtual Kind kind() const { return DocImpl::Internal; }
+ virtual IDocIterator *paragraphs() const;
+ virtual IDocIterator *subSections() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_paragraphs;
+ QList<DocImpl> m_subsections;
+ int m_level;
+};
+
+class DocInternalParaIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ DocInternalParaIterator(const DocInternalHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_paragraphs) {}
+};
+
+class DocInternalSubIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ DocInternalSubIterator(const DocInternalHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_subsections) {}
+};
+
+
+//-----------------------------------------------------------------------------
+
+/*! \brief Node representing a documentation block.
+ *
+ */
+// children: para, title, sect1, internal
+class DocHandler : public DocRootImpl, public BaseHandler<DocHandler>
+{
+ friend class DocIterator;
+ public:
+ virtual void startDoc(const QXmlAttributes& attrib);
+ virtual void endDoc();
+ virtual void startParagraph(const QXmlAttributes& attrib);
+ virtual void startSect1(const QXmlAttributes& attrib);
+ virtual void startTitle(const QXmlAttributes& attrib);
+ virtual void startInternal(const QXmlAttributes& attrib);
+
+ DocHandler(IBaseHandler *parent);
+ virtual ~DocHandler();
+
+ // IDocRoot
+ virtual Kind kind() const { return DocImpl::Root; }
+ virtual IDocIterator *contents() const;
+ virtual IDocInternal *internal() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<DocImpl> m_children;
+ DocInternalHandler *m_internal;
+};
+
+class DocIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
+{
+ public:
+ DocIterator(const DocHandler &handler) :
+ BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
+};
+
+//-----------------------------------------------------------------------------
+
+void dochandler_init();
+void dochandler_exit();
+
+#endif
diff --git a/addon/doxmlparser/src/doxmlintf.h b/addon/doxmlparser/src/doxmlintf.h
new file mode 120000
index 0000000..1b1e847
--- /dev/null
+++ b/addon/doxmlparser/src/doxmlintf.h
@@ -0,0 +1 @@
+../include/doxmlintf.h \ No newline at end of file
diff --git a/addon/doxmlparser/src/doxmlparser.pro b/addon/doxmlparser/src/doxmlparser.pro
new file mode 100644
index 0000000..fb4a476
--- /dev/null
+++ b/addon/doxmlparser/src/doxmlparser.pro
@@ -0,0 +1,32 @@
+#
+# This file was generated from doxmlparser.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+TEMPLATE = lib.t
+CONFIG = console staticlib warn_on debug
+HEADERS = basehandler.h mainhandler.h \
+ compoundhandler.h sectionhandler.h \
+ memberhandler.h paramhandler.h \
+ dochandler.h linkedtexthandler.h \
+ debug.h graphhandler.h stringimpl.h \
+ loamhandler.h
+SOURCES = mainhandler.cpp \
+ compoundhandler.cpp sectionhandler.cpp \
+ memberhandler.cpp paramhandler.cpp \
+ dochandler.cpp linkedtexthandler.cpp \
+ basehandler.cpp debug.cpp graphhandler.cpp \
+ loamhandler.cpp
+unix:LIBS += -L../../../lib -lqtools
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../../../lib -lqtools
+win32-msvc:LIBS += qtools.lib shell32.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:....\\..\lib
+win32-borland:LIBS += qtools.lib doxycfg.lib shell32.lib
+win32-borland:TMAKE_LFLAGS += -L..\..\..\lib
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+DESTDIR = ../lib
+OBJECTS_DIR = ../objects
+TARGET = doxmlparser
+INCLUDEPATH += ../../../qtools ../include
+
+TMAKE_MOC = /usr/bin/moc
diff --git a/addon/doxmlparser/src/doxmlparser.pro.in b/addon/doxmlparser/src/doxmlparser.pro.in
new file mode 100644
index 0000000..841a46c
--- /dev/null
+++ b/addon/doxmlparser/src/doxmlparser.pro.in
@@ -0,0 +1,27 @@
+TEMPLATE = lib.t
+CONFIG = console staticlib warn_on $extraopts
+HEADERS = basehandler.h mainhandler.h \
+ compoundhandler.h sectionhandler.h \
+ memberhandler.h paramhandler.h \
+ dochandler.h linkedtexthandler.h \
+ debug.h graphhandler.h stringimpl.h \
+ loamhandler.h
+SOURCES = mainhandler.cpp \
+ compoundhandler.cpp sectionhandler.cpp \
+ memberhandler.cpp paramhandler.cpp \
+ dochandler.cpp linkedtexthandler.cpp \
+ basehandler.cpp debug.cpp graphhandler.cpp \
+ loamhandler.cpp
+unix:LIBS += -L../../../lib -lqtools
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../../../lib -lqtools
+win32-msvc:LIBS += qtools.lib shell32.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:....\\..\lib
+win32-borland:LIBS += qtools.lib doxycfg.lib shell32.lib
+win32-borland:TMAKE_LFLAGS += -L..\..\..\lib
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+DESTDIR = ../lib
+OBJECTS_DIR = ../objects
+TARGET = doxmlparser
+INCLUDEPATH += ../../../qtools ../include
+
diff --git a/addon/doxmlparser/src/graphhandler.cpp b/addon/doxmlparser/src/graphhandler.cpp
new file mode 100644
index 0000000..7816970
--- /dev/null
+++ b/addon/doxmlparser/src/graphhandler.cpp
@@ -0,0 +1,216 @@
+#include "graphhandler.h"
+
+class EdgeRelationMapper
+{
+ public:
+ EdgeRelationMapper()
+ {
+ m_map.insert("public-inheritance", IChildNode::PublicInheritance);
+ m_map.insert("protected-inheritance", IChildNode::ProtectedInheritance);
+ m_map.insert("private-inheritance", IChildNode::PrivateInheritance);
+ m_map.insert("usage", IChildNode::Usage);
+ m_map.insert("template-instance", IChildNode::TemplateInstance);
+ }
+ IChildNode::NodeRelation stringToNodeRelation(const QString &nrStr)
+ {
+ return m_map[nrStr];
+ }
+ private:
+ QMap<QString,IChildNode::NodeRelation> m_map;
+};
+
+static EdgeRelationMapper *s_edgeRelationMapper;
+
+void graphhandler_init()
+{
+ s_edgeRelationMapper = new EdgeRelationMapper;
+}
+
+void graphhandler_exit()
+{
+ delete s_edgeRelationMapper;
+}
+
+//------------------------------------------------------------------------
+
+GraphHandler::GraphHandler(IBaseHandler *parent,const char *endTag)
+ : m_parent(parent)
+{
+ addEndHandler(endTag,this,&GraphHandler::endGraph);
+ addStartHandler("node",this,&GraphHandler::startNode);
+ m_nodes.setAutoDelete(TRUE);
+ m_nodeDict = new QDict<NodeHandler>(1009);
+}
+
+GraphHandler::~GraphHandler()
+{
+ delete m_nodeDict;
+}
+
+void GraphHandler::startGraph(const QXmlAttributes &)
+{
+ debug(2,"startGraph\n");
+ m_parent->setDelegate(this);
+}
+
+void GraphHandler::endGraph()
+{
+ debug(2,"endGraph\n");
+ m_parent->setDelegate(0);
+}
+
+void GraphHandler::startNode(const QXmlAttributes &attrib)
+{
+ NodeHandler *n = new NodeHandler(this);
+ n->startNode(attrib);
+ m_nodes.append(n);
+ m_nodeDict->insert(attrib.value("id"),n);
+}
+
+INodeIterator *GraphHandler::nodes() const
+{
+ return new NodeIterator(*this);
+}
+
+NodeHandler *GraphHandler::getNodeById(const QString &id) const
+{
+ return m_nodeDict->find(id);
+}
+
+//------------------------------------------------------------------------
+
+NodeHandler::NodeHandler(GraphHandler *gh)
+ : m_parent(gh), m_graph(gh)
+{
+ addEndHandler("node",this,&NodeHandler::endNode);
+ addStartHandler("link",this,&NodeHandler::startLink);
+ addEndHandler("link",this,&NodeHandler::endLink);
+ addStartHandler("label",this,&NodeHandler::startLabel);
+ addEndHandler("label",this,&NodeHandler::endLabel);
+ addStartHandler("childnode",this,&NodeHandler::startChildNode);
+ m_children.setAutoDelete(TRUE);
+}
+
+NodeHandler::~NodeHandler()
+{
+}
+
+void NodeHandler::startNode(const QXmlAttributes &attrib)
+{
+ debug(2,"startNode\n");
+ m_parent->setDelegate(this);
+ m_id = attrib.value("id");
+}
+
+void NodeHandler::endNode()
+{
+ debug(2,"endNode\n");
+ m_parent->setDelegate(0);
+}
+
+void NodeHandler::startLink(const QXmlAttributes &attrib)
+{
+ m_link = attrib.value("refid");
+}
+
+void NodeHandler::endLink()
+{
+}
+
+void NodeHandler::startLabel(const QXmlAttributes &/*attrib*/)
+{
+ m_curString="";
+}
+
+void NodeHandler::endLabel()
+{
+ m_label = m_curString;
+}
+
+void NodeHandler::startChildNode(const QXmlAttributes &attrib)
+{
+ ChildNodeHandler *cnh = new ChildNodeHandler(this,m_graph);
+ cnh->startChildNode(attrib);
+ m_children.append(cnh);
+}
+
+IChildNodeIterator *NodeHandler::children() const
+{
+ return new ChildNodeIterator(*this);
+}
+
+//------------------------------------------------------------------------
+
+ChildNodeHandler::ChildNodeHandler(IBaseHandler *parent,GraphHandler *gh)
+ : m_parent(parent), m_graph(gh)
+{
+ addEndHandler("childnode",this,&ChildNodeHandler::endChildNode);
+ addStartHandler("edgelabel",this,&ChildNodeHandler::startEdgeLabel);
+ m_edgeLabels.setAutoDelete(TRUE);
+}
+
+ChildNodeHandler::~ChildNodeHandler()
+{
+}
+
+void ChildNodeHandler::startChildNode(const QXmlAttributes &attrib)
+{
+ debug(2,"startChildNode\n");
+ m_id = attrib.value("refid");
+ m_relationString = attrib.value("relation");
+ m_relation = s_edgeRelationMapper->stringToNodeRelation(m_relationString);
+ m_parent->setDelegate(this);
+}
+
+void ChildNodeHandler::endChildNode()
+{
+ debug(2,"endChildNode\n");
+ m_parent->setDelegate(0);
+}
+
+
+void ChildNodeHandler::startEdgeLabel(const QXmlAttributes &attrib)
+{
+ EdgeLabelHandler *elh = new EdgeLabelHandler(this);
+ elh->startEdgeLabel(attrib);
+ m_edgeLabels.append(elh);
+}
+
+IEdgeLabelIterator *ChildNodeHandler::edgeLabels() const
+{
+ return new EdgeLabelIterator(*this);
+}
+
+INode *ChildNodeHandler::node() const
+{
+ return m_graph->getNodeById(m_id);
+}
+
+//-----------------------------------------------------------------------
+
+EdgeLabelHandler::EdgeLabelHandler(IBaseHandler *parent)
+ : m_parent(parent)
+{
+ addEndHandler("edgelabel",this,&EdgeLabelHandler::endEdgeLabel);
+}
+
+EdgeLabelHandler::~EdgeLabelHandler()
+{
+}
+
+void EdgeLabelHandler::startEdgeLabel(const QXmlAttributes &)
+{
+ m_parent->setDelegate(this);
+ m_curString="";
+}
+
+void EdgeLabelHandler::endEdgeLabel()
+{
+ m_label=m_curString;
+ m_parent->setDelegate(0);
+}
+
+
+
+
+
diff --git a/addon/doxmlparser/src/graphhandler.h b/addon/doxmlparser/src/graphhandler.h
new file mode 100644
index 0000000..f7105ec
--- /dev/null
+++ b/addon/doxmlparser/src/graphhandler.h
@@ -0,0 +1,154 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _GRAPHHANDLER_H
+#define _GRAPHHANDLER_H
+
+#include "stringimpl.h"
+#include "doxmlintf.h"
+#include "basehandler.h"
+#include "baseiterator.h"
+
+class NodeHandler;
+class ChildNodeHandler;
+class EdgeLabelHandler;
+
+class GraphHandler : public IGraph, public BaseHandler<GraphHandler>
+{
+ friend class NodeIterator;
+ public:
+ GraphHandler(IBaseHandler *parent,const char *endTag);
+ virtual ~GraphHandler();
+
+ void startGraph(const QXmlAttributes &attrib);
+ void endGraph();
+ void startNode(const QXmlAttributes &attrib);
+ NodeHandler *getNodeById(const QString &id) const;
+
+ // IGraph
+ virtual INodeIterator *nodes() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QList<NodeHandler> m_nodes;
+ QDict<NodeHandler> *m_nodeDict;
+};
+
+//----------------------------------------------------------------------
+
+class NodeHandler : public INode, public BaseHandler<NodeHandler>
+{
+ friend class ChildNodeIterator;
+ public:
+ NodeHandler(GraphHandler *gh);
+ virtual ~NodeHandler();
+
+ void startNode(const QXmlAttributes &attrib);
+ void endNode();
+ void startLabel(const QXmlAttributes &attrib);
+ void endLabel();
+ void startLink(const QXmlAttributes &attrib);
+ void endLink();
+ void startChildNode(const QXmlAttributes &attrib);
+
+ // INode
+ virtual const IString *id() const { return &m_id; }
+ virtual const IString *label() const { return &m_label; }
+ virtual const IString *linkId() const { return &m_link; }
+ virtual IChildNodeIterator *children() const;
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_id;
+ StringImpl m_label;
+ StringImpl m_link;
+ QList<ChildNodeHandler> m_children;
+ GraphHandler *m_graph;
+};
+
+class NodeIterator : public BaseIterator<INodeIterator,INode,NodeHandler>
+{
+ public:
+ NodeIterator(const GraphHandler &handler) :
+ BaseIterator<INodeIterator,INode,NodeHandler>(handler.m_nodes) {}
+};
+
+//----------------------------------------------------------------------
+
+class ChildNodeHandler : public IChildNode, public BaseHandler<ChildNodeHandler>
+{
+ friend class EdgeLabelIterator;
+ public:
+ ChildNodeHandler(IBaseHandler *parent,GraphHandler *gh);
+ virtual ~ChildNodeHandler();
+
+ void startChildNode(const QXmlAttributes &attrib);
+ void endChildNode();
+ void startEdgeLabel(const QXmlAttributes &attrib);
+
+ // IChildNode
+ virtual INode *node() const;
+ virtual NodeRelation relation() const { return m_relation; }
+ virtual const IString * relationString() const { return &m_relationString; }
+ virtual IEdgeLabelIterator *edgeLabels() const;
+
+ private:
+ IBaseHandler *m_parent;
+ QString m_id;
+ NodeRelation m_relation;
+ StringImpl m_relationString;
+ QList<EdgeLabelHandler> m_edgeLabels;
+ GraphHandler *m_graph;
+};
+
+class ChildNodeIterator : public BaseIterator<IChildNodeIterator,IChildNode,ChildNodeHandler>
+{
+ public:
+ ChildNodeIterator(const NodeHandler &handler) :
+ BaseIterator<IChildNodeIterator,IChildNode,ChildNodeHandler>(handler.m_children) {}
+};
+
+//----------------------------------------------------------------------
+
+class EdgeLabelHandler : public IEdgeLabel, public BaseHandler<EdgeLabelHandler>
+{
+ friend class EdgeLabelIterator;
+ public:
+ EdgeLabelHandler(IBaseHandler *parent);
+ virtual ~EdgeLabelHandler();
+
+ void startEdgeLabel(const QXmlAttributes &attrib);
+ void endEdgeLabel();
+
+ // IEdgeLabel
+ virtual const IString *label() const { return &m_label; }
+
+ private:
+ IBaseHandler *m_parent;
+ StringImpl m_label;
+};
+
+class EdgeLabelIterator : public BaseIterator<IEdgeLabelIterator,IEdgeLabel,EdgeLabelHandler>
+{
+ public:
+ EdgeLabelIterator(const ChildNodeHandler &handler) :
+ BaseIterator<IEdgeLabelIterator,IEdgeLabel,EdgeLabelHandler>(handler.m_edgeLabels) {}
+};
+
+void graphhandler_init();
+void graphhandler_exit();
+
+#endif
+
diff --git a/addon/doxmlparser/src/linkedtexthandler.cpp b/addon/doxmlparser/src/linkedtexthandler.cpp
new file mode 100644
index 0000000..e6cc065
--- /dev/null
+++ b/addon/doxmlparser/src/linkedtexthandler.cpp
@@ -0,0 +1,133 @@
+/******************************************************************************
+ *
+ * $Id: doxygen.cpp,v 1.87 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+#include "linkedtexthandler.h"
+#include "debug.h"
+#include <doxmlintf.h>
+#include "stringimpl.h"
+
+class LT_Text : public LinkedTextImpl, public ILT_Text
+{
+ public:
+ LT_Text(const QString &text) : m_text(text) {}
+ virtual ~LT_Text() {}
+
+ // ILT_Text
+ virtual const IString *text() const { return &m_text; }
+ virtual Kind kind() const { return LinkedTextImpl::Kind_Text; }
+ private:
+ StringImpl m_text;
+};
+
+class LT_Ref : public LinkedTextImpl, public ILT_Ref
+{
+ public:
+ LT_Ref() {}
+ virtual ~LT_Ref() {}
+ void setRefId(const QString &refId) { m_refId=refId; }
+ void setText(const QString &text) { m_text=text; }
+ void setExtId(const QString &extId) { m_extId=extId; }
+ void setTargetKind(TargetKind k) { m_targetKind=k; }
+
+ // ILT_Ref
+ virtual const IString *text() const { return &m_text; }
+ virtual const IString * id() const { return &m_refId; }
+ virtual TargetKind targetKind() const { return m_targetKind; }
+ virtual const IString *external() const { return &m_extId; }
+ virtual Kind kind() const { return LinkedTextImpl::Kind_Ref; }
+
+ private:
+ StringImpl m_refId;
+ StringImpl m_extId;
+ StringImpl m_text;
+ TargetKind m_targetKind;
+};
+
+LinkedTextHandler::LinkedTextHandler(IBaseHandler *parent,
+ QList<LinkedTextImpl> &children
+ )
+ : m_parent(parent), m_children(children)
+{
+ addStartHandler("ref",this,&LinkedTextHandler::startRef);
+ addEndHandler("ref",this,&LinkedTextHandler::endRef);
+ m_children.setAutoDelete(TRUE);
+ m_ref=0;
+}
+
+LinkedTextHandler::~LinkedTextHandler()
+{
+}
+
+void LinkedTextHandler::start(const char *endTag)
+{
+ addEndHandler(endTag,this,&LinkedTextHandler::end);
+ m_parent->setDelegate(this);
+ m_curString="";
+}
+
+void LinkedTextHandler::end()
+{
+ if (!m_curString.isEmpty())
+ {
+ m_children.append(new LT_Text(m_curString));
+ debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
+ m_curString="";
+ }
+ m_parent->setDelegate(0);
+}
+
+void LinkedTextHandler::startRef(const QXmlAttributes& attrib)
+{
+ if (!m_curString.isEmpty())
+ {
+ m_children.append(new LT_Text(m_curString));
+ debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
+ m_curString="";
+ }
+ ASSERT(m_ref==0);
+ m_ref = new LT_Ref;
+ m_ref->setRefId(attrib.value("refid"));
+ m_ref->setExtId(attrib.value("external"));
+ ASSERT(attrib.value("kindref")=="compound" || attrib.value("kindref")=="member");
+ m_ref->setTargetKind(attrib.value("kindref")=="compound" ? ILT_Ref::Compound : ILT_Ref::Member);
+}
+
+void LinkedTextHandler::endRef()
+{
+ m_ref->setText(m_curString);
+ m_children.append(m_ref);
+ debug(2,"LinkedTextHandler: add ref `%s'\n",m_ref->text()->latin1());
+ m_ref=0;
+}
+
+QString LinkedTextHandler::toString(const QList<LinkedTextImpl> &list)
+{
+ QListIterator<LinkedTextImpl> li(list);
+ QString result;
+ LinkedTextImpl *lt;
+ for (li.toFirst();(lt=li.current());++li)
+ {
+ switch(lt->kind())
+ {
+ case ILinkedText::Kind_Text:
+ result+=dynamic_cast<ILT_Text*>(lt)->text()->latin1();
+ break;
+ case ILinkedText::Kind_Ref:
+ result+=dynamic_cast<ILT_Ref *>(lt)->text()->latin1();
+ break;
+ }
+ }
+ return result;
+}
+
diff --git a/addon/doxmlparser/src/linkedtexthandler.h b/addon/doxmlparser/src/linkedtexthandler.h
new file mode 100644
index 0000000..d4ec307
--- /dev/null
+++ b/addon/doxmlparser/src/linkedtexthandler.h
@@ -0,0 +1,54 @@
+/******************************************************************************
+ *
+ * $Id: doxygen.cpp,v 1.87 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+#ifndef LINKEDTEXTHANDLER_H
+#define LINKEDTEXTHANDLER_H
+
+#include "baseiterator.h"
+#include "basehandler.h"
+
+class LT_Ref;
+class LinkedTextImpl : public ILinkedText
+{
+ public:
+ virtual ~LinkedTextImpl() {}
+};
+
+class LinkedTextHandler : public BaseHandler<LinkedTextHandler>
+{
+ public:
+ LinkedTextHandler(IBaseHandler *parent,QList<LinkedTextImpl> &children);
+ virtual ~LinkedTextHandler();
+ virtual void start(const char *endTag);
+ virtual void end();
+ virtual void startRef(const QXmlAttributes& attrib);
+ virtual void endRef();
+ static QString toString(const QList<LinkedTextImpl> &list);
+
+ // ILinkedText
+
+ private:
+ IBaseHandler *m_parent;
+ QList<LinkedTextImpl> &m_children;
+ LT_Ref *m_ref;
+};
+
+class LinkedTextIterator : public BaseIterator<ILinkedTextIterator,ILinkedText,LinkedTextImpl>
+{
+ public:
+ LinkedTextIterator(const QList<LinkedTextImpl> &list) :
+ BaseIterator<ILinkedTextIterator,ILinkedText,LinkedTextImpl>(list) {}
+};
+
+#endif
diff --git a/addon/doxmlparser/src/loamhandler.cpp b/addon/doxmlparser/src/loamhandler.cpp
new file mode 100644
index 0000000..a939b7b
--- /dev/null
+++ b/addon/doxmlparser/src/loamhandler.cpp
@@ -0,0 +1,75 @@
+#include "loamhandler.h"
+#include "memberhandler.h"
+
+
+ListOfAllMembersHandler::ListOfAllMembersHandler(IBaseHandler *parent) : m_parent(parent)
+{
+ m_members.setAutoDelete(TRUE);
+
+ addStartHandler("member",this,&ListOfAllMembersHandler::startMember);
+ addStartHandler("name",this,&ListOfAllMembersHandler::startName);
+ addEndHandler("name",this,&ListOfAllMembersHandler::endName);
+ addStartHandler("scope",this,&ListOfAllMembersHandler::startScope);
+ addEndHandler("scope",this,&ListOfAllMembersHandler::endScope);
+
+ addEndHandler("listofallmembers",this,&ListOfAllMembersHandler::endListOfAllMembers);
+}
+
+void ListOfAllMembersHandler::initialize(MainHandler *mh)
+{
+ QListIterator<MemberReference> mli(m_members);
+ MemberReference *mr;
+ for (;(mr=mli.current());++mli)
+ {
+ mr->initialize(mh);
+ }
+}
+
+void ListOfAllMembersHandler::startMember(const QXmlAttributes& attrib)
+{
+ MemberReference *mr = new MemberReference;
+ mr->m_memId = attrib.value("refid");
+ mr->m_virtualness = attrib.value("virt");
+ mr->m_protection = attrib.value("prot");
+ mr->m_ambiguityScope = attrib.value("ambiguityscope");
+ m_members.append(new MemberReference);
+}
+
+void ListOfAllMembersHandler::startName(const QXmlAttributes&)
+{
+ m_curString="";
+}
+
+void ListOfAllMembersHandler::endName()
+{
+ ASSERT(m_members.getLast());
+ m_members.getLast()->m_name = m_curString;
+}
+
+void ListOfAllMembersHandler::startScope(const QXmlAttributes&)
+{
+ m_curString="";
+}
+
+void ListOfAllMembersHandler::endScope()
+{
+ ASSERT(m_members.getLast());
+ m_members.getLast()->m_scope = m_curString;
+}
+
+void ListOfAllMembersHandler::startListOfAllMembers(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"listofallmembers start\n");
+}
+
+void ListOfAllMembersHandler::endListOfAllMembers()
+{
+ m_parent->setDelegate(0);
+ debug(2,"listofallmembers end\n");
+}
+
+IMemberReferenceIterator *ListOfAllMembersHandler::members() const
+{
+ return new MemberReferenceIterator(m_members);
+}
diff --git a/addon/doxmlparser/src/loamhandler.h b/addon/doxmlparser/src/loamhandler.h
new file mode 100644
index 0000000..ce2eda2
--- /dev/null
+++ b/addon/doxmlparser/src/loamhandler.h
@@ -0,0 +1,52 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _LOAMHANDLER_H
+#define _LOAMHANDLER_H
+
+#include <qstring.h>
+#include <qlist.h>
+#include <doxmlintf.h>
+
+#include "basehandler.h"
+
+class MainHandler;
+class MemberReference;
+
+class ListOfAllMembersHandler : public BaseHandler<ListOfAllMembersHandler>
+{
+ public:
+ virtual void startMember(const QXmlAttributes& attrib);
+ virtual void startName(const QXmlAttributes& attrib);
+ virtual void endName();
+ virtual void startScope(const QXmlAttributes& attrib);
+ virtual void endScope();
+ virtual void startListOfAllMembers(const QXmlAttributes& attrib);
+ virtual void endListOfAllMembers();
+
+ ListOfAllMembersHandler(IBaseHandler *parent);
+ virtual ~ListOfAllMembersHandler() {}
+
+ void initialize(MainHandler *mh);
+
+ virtual IMemberReferenceIterator *members() const;
+
+ protected:
+ IBaseHandler *m_parent;
+ QList<MemberReference> m_members;
+};
+
+#endif
+
diff --git a/addon/doxmlparser/src/mainhandler.cpp b/addon/doxmlparser/src/mainhandler.cpp
new file mode 100644
index 0000000..ff38b1b
--- /dev/null
+++ b/addon/doxmlparser/src/mainhandler.cpp
@@ -0,0 +1,299 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include <qxml.h>
+#include "mainhandler.h"
+#include "compoundhandler.h"
+#include "sectionhandler.h"
+#include "graphhandler.h"
+#include "dochandler.h"
+#include "memberhandler.h"
+#include "debug.h"
+
+
+class ErrorHandler : public QXmlErrorHandler
+{
+ public:
+ virtual ~ErrorHandler() {}
+ bool warning( const QXmlParseException & )
+ {
+ return FALSE;
+ }
+ bool error( const QXmlParseException & )
+ {
+ return FALSE;
+ }
+ bool fatalError( const QXmlParseException &exception )
+ {
+ debug(1,"Fatal error at line %d column %d: %s\n",
+ exception.lineNumber(),exception.columnNumber(),
+ exception.message().data());
+ return FALSE;
+ }
+ QString errorString() { return ""; }
+
+ private:
+ QString errorMsg;
+};
+
+//--------------------------------------------------------------------------
+
+class CompoundEntryIterator : public ICompoundIterator,
+ public QListIterator<CompoundEntry>
+{
+ public:
+ CompoundEntryIterator(const MainHandler *m,const QList<CompoundEntry> &list) :
+ QListIterator<CompoundEntry>(list), m_mainHandler(m) {}
+ virtual ~CompoundEntryIterator() {}
+
+ virtual void toFirst()
+ {
+ QListIterator<CompoundEntry>::toFirst();
+ }
+ virtual void toLast()
+ {
+ QListIterator<CompoundEntry>::toLast();
+ }
+ virtual void toNext()
+ {
+ QListIterator<CompoundEntry>::operator++();
+ }
+ virtual void toPrev()
+ {
+ QListIterator<CompoundEntry>::operator--();
+ }
+ virtual ICompound *current() const
+ {
+ CompoundEntry *ch = QListIterator<CompoundEntry>::current();
+ return ch ? m_mainHandler->compoundById(ch->id) : 0;
+ }
+ virtual void release()
+ { delete this; }
+
+ private:
+ const MainHandler *m_mainHandler;
+};
+
+//--------------------------------------------------------------------------
+
+MainHandler::MainHandler() : m_compoundDict(2999), m_compoundNameDict(2999),
+ m_memberDict(12251), m_memberNameDict(12251),
+ m_compoundsLoaded(1009)
+{
+ m_compounds.setAutoDelete(TRUE);
+ m_memberNameDict.setAutoDelete(TRUE);
+ addStartHandler("doxygenindex");
+ addEndHandler("doxygenindex");
+ addStartHandler("compound",this,&MainHandler::startCompound);
+ addEndHandler("compound");
+ addStartHandler("member",this,&MainHandler::startMember);
+ addEndHandler("member",this,&MainHandler::endMember);
+ addStartHandler("name",this,&MainHandler::startName);
+ addEndHandler("name",this,&MainHandler::endName);
+ m_curCompound = 0;
+ m_insideMember = FALSE;
+}
+
+MainHandler::~MainHandler()
+{
+ debug(2,"MainHandler::~MainHandler()\n");
+}
+
+void MainHandler::startCompound(const QXmlAttributes& attrib)
+{
+ m_curCompound = new CompoundEntry(257);
+ m_curCompound->id = attrib.value("refid");
+ m_compounds.append(m_curCompound);
+ m_compoundDict.insert(m_curCompound->id,m_curCompound);
+}
+
+void MainHandler::startName(const QXmlAttributes& /*attrib*/)
+{
+ m_curString = "";
+}
+
+void MainHandler::endName()
+{
+ if (m_insideMember)
+ {
+ m_curMember->name = m_curString;
+ }
+ else
+ {
+ m_curCompound->name = m_curString;
+ m_compoundNameDict.insert(m_curString,m_curCompound);
+ }
+}
+
+void MainHandler::startMember(const QXmlAttributes& attrib)
+{
+ m_insideMember = TRUE;
+ m_curMember = new MemberEntry;
+ m_curMember->id = attrib.value("refid");
+ m_curMember->compound = m_curCompound;
+ m_memberDict.insert(m_curMember->id,m_curMember);
+}
+
+void MainHandler::endMember()
+{
+ m_curCompound->memberDict.insert(m_curMember->name,m_curMember);
+ QList<CompoundEntry> *cel=0;
+ if ((cel=m_memberNameDict.find(m_curMember->name))==0)
+ {
+ cel = new QList<CompoundEntry>;
+ m_memberNameDict.insert(m_curMember->name,cel);
+ }
+ cel->append(m_curCompound);
+ m_insideMember = FALSE;
+}
+
+void MainHandler::setDebugLevel(int level)
+{
+ ::setDebugLevel(level);
+}
+
+void MainHandler::dump()
+{
+ QListIterator<CompoundEntry> cli(m_compounds);
+ CompoundEntry *ce;
+ for (cli.toFirst();(ce=cli.current());++cli)
+ {
+ debug(2,"compound id=`%s' name=`%s'\n",ce->id.data(),ce->name.data());
+ QDictIterator<MemberEntry> mdi(ce->memberDict);
+ MemberEntry *me;
+ for (mdi.toFirst();(me=mdi.current());++mdi)
+ {
+ debug(2," member id=`%s' name=`%s'\n",me->id.data(),me->name.data());
+ }
+ }
+}
+
+bool MainHandler::readXMLDir(const char * xmlDirName)
+{
+ m_xmlDirName = xmlDirName;
+ QString xmlFileName=m_xmlDirName+"/index.xml";
+ QFile xmlFile(xmlFileName);
+ //printf("Trying %s xmlFile.exists()=%d isReadable()=%d\n",
+ // xmlFileName.data(),xmlFile.exists(),xmlFile.isReadable());
+ if (xmlFile.exists())
+ {
+ ErrorHandler errorHandler;
+ QXmlInputSource source( xmlFile );
+ QXmlSimpleReader reader;
+ reader.setContentHandler( this );
+ reader.setErrorHandler( &errorHandler );
+ reader.parse( source );
+ dump();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+ICompoundIterator *MainHandler::compounds() const
+{
+ return new CompoundEntryIterator(this,m_compounds);
+}
+
+ICompound *MainHandler::compoundById(const char *id) const
+{
+ QString ids = id;
+ if (ids.isEmpty()) return 0;
+ CompoundHandler *ch = m_compoundsLoaded[ids];
+ if (ch) // compound already in memory
+ {
+ ch->addref(); // returning alias -> increase reference counter
+ return ch->toICompound();
+ }
+ CompoundEntry *ce = m_compoundDict.find(ids);
+ if (ce==0) return 0; // id not found
+ // create and load a new compound
+ ch = new CompoundHandler(m_xmlDirName);
+ if (!ch->parseXML(id))
+ {
+ // compound could not be initialized.
+ delete ch;
+ return 0;
+ }
+
+ // we disregard the constness here, because the object stays conceptually
+ // unchanged.
+ MainHandler *that = (MainHandler *)this;
+ ch->initialize(that);
+ //printf("loading compound %s in memory\n",id);
+ that->m_compoundsLoaded.insert(id,ch);
+ return ch->toICompound();
+}
+
+void MainHandler::unloadCompound(CompoundHandler *ch)
+{
+ //printf("unloading compound %s from memory\n",ch->id()->latin1());
+ bool result = m_compoundsLoaded.remove(ch->id()->latin1());
+ if (!result) debug(1,"Failed to unload component!\n");
+}
+
+ICompound *MainHandler::compoundByName(const char *name) const
+{
+ QString nameStr = name;
+ if (nameStr.isEmpty()) return 0;
+ CompoundEntry *ce = m_compoundNameDict[name];
+ if (ce==0) return 0; // name not found
+ return compoundById(ce->id);
+}
+
+ICompound *MainHandler::memberById(const char *id) const
+{
+ QString ids = id;
+ if (ids.isEmpty()) return 0;
+ MemberEntry *me = m_memberDict[id];
+ if (me==0) return 0; // id not found
+ return compoundById(me->compound->id);
+}
+
+ICompoundIterator *MainHandler::memberByName(const char *name) const
+{
+ QString nameStr = name;
+ if (nameStr.isEmpty()) return 0;
+ QList<CompoundEntry> *cel = m_memberNameDict[name];
+ if (cel==0) return 0; // name not found
+ return new CompoundEntryIterator(this,*cel);
+}
+
+IDoxygen *createObjectModel()
+{
+ compoundhandler_init();
+ sectionhandler_init();
+ memberhandler_init();
+ dochandler_init();
+ graphhandler_init();
+ return new MainHandler;
+}
+
+void MainHandler::release()
+{
+ //printf("MainHandler::release()\n");
+ QDictIterator<CompoundHandler> chi(m_compoundsLoaded);
+ CompoundHandler *ch;
+ for (chi.toFirst();(ch=chi.current());++chi)
+ {
+ debug(1,"Compound %s not released\n",ch->name()->latin1());
+ }
+ graphhandler_exit();
+ dochandler_exit();
+ memberhandler_exit();
+ sectionhandler_exit();
+ compoundhandler_exit();
+ delete this;
+}
+
diff --git a/addon/doxmlparser/src/mainhandler.h b/addon/doxmlparser/src/mainhandler.h
new file mode 100644
index 0000000..9ac8b79
--- /dev/null
+++ b/addon/doxmlparser/src/mainhandler.h
@@ -0,0 +1,82 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _MAINHANDLER_H
+#define _MAINHANDLER_H
+
+#include <qlist.h>
+
+#include <doxmlintf.h>
+#include "basehandler.h"
+
+class CompoundHandler;
+struct CompoundEntry;
+
+struct IndexEntry
+{
+ QString id;
+ QString name;
+};
+
+struct MemberEntry : public IndexEntry
+{
+ CompoundEntry *compound;
+};
+
+struct CompoundEntry : public IndexEntry
+{
+ CompoundEntry(int size) : memberDict(size)
+ { memberDict.setAutoDelete(TRUE); }
+ QDict<MemberEntry> memberDict;
+};
+
+class MainHandler : public IDoxygen, public BaseHandler<MainHandler>
+{
+ public:
+ virtual void startCompound(const QXmlAttributes& attrib);
+ virtual void startMember(const QXmlAttributes& attrib);
+ virtual void endMember();
+ virtual void startName(const QXmlAttributes& attrib);
+ virtual void endName();
+ MainHandler();
+ virtual ~MainHandler();
+
+ // IDoxygen
+ ICompoundIterator *compounds() const;
+ ICompound *compoundById(const char *id) const;
+ virtual ICompound *compoundByName(const char *name) const;
+ virtual ICompound *memberById(const char *id) const;
+ virtual ICompoundIterator *memberByName(const char *name) const;
+
+ virtual void release();
+ void setDebugLevel(int level);
+ bool readXMLDir(const char *dirName);
+ void dump();
+ void unloadCompound(CompoundHandler *ch);
+
+ private:
+ CompoundEntry *m_curCompound;
+ MemberEntry *m_curMember;
+ QList<CompoundEntry> m_compounds;
+ QDict<CompoundEntry> m_compoundDict;
+ QDict<CompoundEntry> m_compoundNameDict;
+ QDict<MemberEntry> m_memberDict;
+ QDict<QList<CompoundEntry> > m_memberNameDict;
+ QString m_xmlDirName;
+ QDict<CompoundHandler> m_compoundsLoaded;
+ bool m_insideMember;
+};
+
+#endif
diff --git a/addon/doxmlparser/src/memberhandler.cpp b/addon/doxmlparser/src/memberhandler.cpp
new file mode 100644
index 0000000..7225204
--- /dev/null
+++ b/addon/doxmlparser/src/memberhandler.cpp
@@ -0,0 +1,600 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include "memberhandler.h"
+#include "sectionhandler.h"
+#include "dochandler.h"
+#include "mainhandler.h"
+#include "linkedtexthandler.h"
+#include "paramhandler.h"
+#include "compoundhandler.h"
+#include "debug.h"
+
+//------------------------------------------------------------------------------
+
+class MemberTypeMap
+{
+ public:
+ MemberTypeMap()
+ {
+ m_map.setAutoDelete(TRUE);
+ m_map.insert("define",new int(IMember::Define));
+ m_map.insert("property",new int(IMember::Property));
+ m_map.insert("variable",new int(IMember::Variable));
+ m_map.insert("typedef",new int(IMember::Typedef));
+ m_map.insert("enum",new int(IMember::Enum));
+ m_map.insert("function",new int(IMember::Function));
+ m_map.insert("signal",new int(IMember::Signal));
+ m_map.insert("prototype",new int(IMember::Prototype));
+ m_map.insert("friend",new int(IMember::Friend));
+ m_map.insert("dcop",new int(IMember::DCOP));
+ m_map.insert("slot",new int(IMember::Slot));
+ m_map.insert("enumvalue",new int(IMember::EnumValue));
+ }
+ IMember::MemberKind map(const QString &s)
+ {
+ int *val = m_map.find(s);
+ if (val==0)
+ {
+ debug(1,"Warning: `%s' is an invalid member type\n",s.data());
+ return IMember::Invalid;
+ }
+ else return (IMember::MemberKind)*val;
+ }
+ private:
+ QDict<int> m_map;
+};
+
+static MemberTypeMap *s_typeMap;
+
+void memberhandler_init()
+{
+ s_typeMap = new MemberTypeMap;
+}
+
+void memberhandler_exit()
+{
+ delete s_typeMap;
+}
+
+//------------------------------------------------------------------------------
+
+void MemberReference::initialize(MainHandler *mh)
+{
+ m_mainHandler = mh;
+}
+
+IMember *MemberReference::member() const
+{
+ //return m_mainHandler->memberById(m_memId);
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+
+
+#if 0
+EnumValueHandler::EnumValueHandler(IBaseHandler *parent) :
+ m_parent(parent), m_brief(0), m_detailed(0), m_linkedTextHandler(0)
+{
+ addEndHandler("enumvalue",this,&EnumValueHandler::endEnumValue);
+
+ addStartHandler("name",this,&EnumValueHandler::startName);
+ addEndHandler("name",this,&EnumValueHandler::endName);
+ addStartHandler("initializer",this,&EnumValueHandler::startInitializer);
+
+ addStartHandler("briefdescription",this,&EnumValueHandler::startBriefDesc);
+
+ addStartHandler("detaileddescription",this,&EnumValueHandler::startDetailedDesc);
+
+ m_initializer.setAutoDelete(TRUE);
+}
+
+EnumValueHandler::~EnumValueHandler()
+{
+ delete m_brief;
+ delete m_detailed;
+ delete m_linkedTextHandler;
+}
+
+void EnumValueHandler::startEnumValue(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+}
+
+void EnumValueHandler::endEnumValue()
+{
+ m_parent->setDelegate(0);
+}
+
+void EnumValueHandler::startName(const QXmlAttributes& /*attrib*/)
+{
+ m_curString="";
+}
+
+void EnumValueHandler::endName()
+{
+ m_name = m_curString;
+}
+
+void EnumValueHandler::startInitializer(const QXmlAttributes& /*attrib*/)
+{
+ delete m_linkedTextHandler;
+ m_linkedTextHandler = new LinkedTextHandler(this,m_initializer);
+ m_linkedTextHandler->start("initializer");
+}
+
+void EnumValueHandler::startBriefDesc(const QXmlAttributes& attrib)
+{
+ DocHandler *docHandler = new DocHandler(this);
+ docHandler->startDoc(attrib);
+ m_brief = docHandler;
+}
+
+void EnumValueHandler::startDetailedDesc(const QXmlAttributes& attrib)
+{
+ DocHandler *docHandler = new DocHandler(this);
+ docHandler->startDoc(attrib);
+ m_detailed = docHandler;
+}
+#endif
+
+//------------------------------------------------------------------------------
+
+MemberHandler::MemberHandler(IBaseHandler *parent)
+ : m_brief(0), m_detailed(0), m_inbody(0),
+ m_compound(0), m_section(0), m_parent(parent)
+{
+ //printf("MemberHandler::MemberHandler() %p\n",this);
+ addEndHandler("memberdef",this,&MemberHandler::endMember);
+
+ addStartHandler("templateparamlist",this,&MemberHandler::startTemplateParamList);
+ addEndHandler("templateparamlist",this,&MemberHandler::endTemplateParamList);
+
+ addStartHandler("type",this,&MemberHandler::startType);
+
+ addStartHandler("definition",this,&MemberHandler::startDefinition);
+ addEndHandler("definition",this,&MemberHandler::endDefinition);
+
+ addStartHandler("argsstring",this,&MemberHandler::startArgsString);
+ addEndHandler("argsstring",this,&MemberHandler::endArgsString);
+
+ addStartHandler("name",this,&MemberHandler::startName);
+ addEndHandler("name",this,&MemberHandler::endName);
+
+ addStartHandler("read",this,&MemberHandler::startRead);
+ addEndHandler("read",this,&MemberHandler::endRead);
+
+ addStartHandler("write",this,&MemberHandler::startWrite);
+ addEndHandler("write",this,&MemberHandler::endWrite);
+
+ addStartHandler("reimplements",this,&MemberHandler::startReimplements);
+ addEndHandler("reimplements",this,&MemberHandler::endReimplements);
+
+ addStartHandler("reimplementedby",this,&MemberHandler::startReimplementedBy);
+ addEndHandler("reimplementedby",this,&MemberHandler::endReimplementedBy);
+
+ addStartHandler("param",this,&MemberHandler::startParam);
+
+ addStartHandler("enumvalue",this,&MemberHandler::startEnumValue2);
+ addEndHandler("enumvalue",this,&MemberHandler::endMember);
+
+ addStartHandler("initializer",this,&MemberHandler::startInitializer);
+ addStartHandler("exceptions",this,&MemberHandler::startException);
+
+ addStartHandler("briefdescription",this,&MemberHandler::startBriefDesc);
+
+ addStartHandler("detaileddescription",this,&MemberHandler::startDetailedDesc);
+
+ addStartHandler("inbodydescription",this,&MemberHandler::startInbodyDesc);
+
+ addStartHandler("location",this,&MemberHandler::startLocation);
+ addEndHandler("location");
+
+ addStartHandler("references",this,&MemberHandler::startReferences);
+ addEndHandler("references",this,&MemberHandler::endReferences);
+
+ addStartHandler("referencedby",this,&MemberHandler::startReferencedBy);
+ addEndHandler("referencedby",this,&MemberHandler::endReferencedBy);
+
+ m_type.setAutoDelete(TRUE);
+ m_initializer.setAutoDelete(TRUE);
+ m_exception.setAutoDelete(TRUE);
+ m_params.setAutoDelete(TRUE);
+ m_references.setAutoDelete(TRUE);
+ m_referencedBy.setAutoDelete(TRUE);
+ m_reimplements = 0;
+ m_reimplementedBy.setAutoDelete(TRUE);
+ m_enumValues.setAutoDelete(TRUE);
+ m_linkedTextHandler = 0;
+ m_defLine=0;
+ m_bodyStart=0;
+ m_bodyEnd=0;
+ m_insideTemplateParamList=FALSE;
+ m_hasTemplateParamList=FALSE;
+}
+
+MemberHandler::~MemberHandler()
+{
+ debug(2,"MemberHandler::~MemberHandler() %p\n",this);
+ delete m_brief;
+ delete m_detailed;
+ delete m_inbody;
+ delete m_linkedTextHandler;
+ delete m_reimplements;
+}
+
+void MemberHandler::startMember(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ m_kindString = attrib.value("kind");
+ //printf("startMember kindString=`%s'\n",m_kindString.data());
+ m_kind = s_typeMap->map(m_kindString);
+ m_id = attrib.value("id");
+ m_protection = attrib.value("prot");
+ m_isStatic = attrib.value("static")=="yes";
+ m_isConst = attrib.value("const")=="yes";
+ m_isExplicit = attrib.value("explicit")=="yes";
+ m_isInline = attrib.value("inline")=="yes";
+ m_virtualness = attrib.value("virt");
+ m_isVolatile = attrib.value("volatile")=="yes";
+ m_isMutable = attrib.value("mutable")=="yes";
+ m_isReadable = attrib.value("readable")=="yes";
+ m_isWritable = attrib.value("writable")=="yes";
+
+ debug(2,"member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
+ m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
+}
+
+void MemberHandler::startEnumValue(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ m_kindString = "enumvalue";
+ //printf("startEnumValue kindString=`%s'\n",m_kindString.data());
+ m_kind = s_typeMap->map(m_kindString);
+ m_id = attrib.value("id");
+ m_protection = attrib.value("prot");
+ m_isStatic = FALSE;
+ m_isConst = FALSE;
+ m_isExplicit = FALSE;
+ m_isInline = FALSE;
+ m_virtualness = "non-virtual";
+ m_isVolatile = FALSE;
+ m_isMutable = FALSE;
+ m_isReadable = FALSE;
+ m_isWritable = FALSE;
+ debug(2,"member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
+ m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
+}
+
+void MemberHandler::startEnumValue2(const QXmlAttributes& attrib)
+{
+ MemberHandler *mh = new MemberHandler(this);
+ mh->startEnumValue(attrib);
+ m_enumValues.append(mh);
+}
+
+
+void MemberHandler::startBriefDesc(const QXmlAttributes& attrib)
+{
+ DocHandler *docHandler = new DocHandler(this);
+ docHandler->startDoc(attrib);
+ m_brief = docHandler;
+}
+
+void MemberHandler::startDetailedDesc(const QXmlAttributes& attrib)
+{
+ DocHandler *docHandler = new DocHandler(this);
+ docHandler->startDoc(attrib);
+ m_detailed = docHandler;
+}
+
+void MemberHandler::startInbodyDesc(const QXmlAttributes& attrib)
+{
+ DocHandler *docHandler = new DocHandler(this);
+ docHandler->startDoc(attrib);
+ m_inbody = docHandler;
+}
+
+void MemberHandler::startLocation(const QXmlAttributes& attrib)
+{
+ m_defFile = attrib.value("file");
+ m_bodyFile = attrib.value("bodyfile");
+ QCString s;
+ s = attrib.value("line");
+ if (!s.isEmpty()) m_defLine=s.toInt();
+ s = attrib.value("bodystart");
+ if (!s.isEmpty()) m_bodyStart=s.toInt();
+ s = attrib.value("bodyend");
+ if (!s.isEmpty()) m_bodyEnd=s.toInt();
+}
+
+void MemberHandler::startReferences(const QXmlAttributes& attrib)
+{
+ MemberReference *mr = new MemberReference;
+ mr->m_memId = attrib.value("refid");
+ m_references.append(mr);
+ m_curString="";
+}
+
+void MemberHandler::endReferences()
+{
+ m_references.getLast()->m_name = m_curString;
+}
+
+void MemberHandler::startReferencedBy(const QXmlAttributes& attrib)
+{
+ MemberReference *mr = new MemberReference;
+ mr->m_memId = attrib.value("refid");
+ m_referencedBy.append(mr);
+ m_curString="";
+}
+
+void MemberHandler::endReferencedBy()
+{
+ m_referencedBy.getLast()->m_name = m_curString;
+}
+
+void MemberHandler::startReimplements(const QXmlAttributes& attrib)
+{
+ m_reimplements = new MemberReference;
+ m_reimplements->m_memId = attrib.value("refid");
+ m_curString="";
+}
+
+void MemberHandler::endReimplements()
+{
+ m_reimplements->m_name = m_curString;
+}
+
+void MemberHandler::startReimplementedBy(const QXmlAttributes& attrib)
+{
+ MemberReference *mr = new MemberReference;
+ mr->m_memId = attrib.value("refid");
+ m_reimplementedBy.append(mr);
+ m_curString="";
+}
+
+void MemberHandler::endReimplementedBy()
+{
+ m_reimplementedBy.getLast()->m_name = m_curString;
+}
+
+void MemberHandler::endMember()
+{
+ m_parent->setDelegate(0);
+}
+
+void MemberHandler::startType(const QXmlAttributes &)
+{
+ debug(2,"startType!\n");
+ delete m_linkedTextHandler;
+ m_linkedTextHandler = new LinkedTextHandler(this,m_type);
+ m_linkedTextHandler->start("type");
+}
+
+void MemberHandler::startInitializer(const QXmlAttributes &)
+{
+ debug(2,"startInitializer!\n");
+ delete m_linkedTextHandler;
+ m_linkedTextHandler = new LinkedTextHandler(this,m_initializer);
+ m_linkedTextHandler->start("initializer");
+}
+
+void MemberHandler::startException(const QXmlAttributes &)
+{
+ debug(2,"startException!\n");
+ delete m_linkedTextHandler;
+ m_linkedTextHandler = new LinkedTextHandler(this,m_exception);
+ m_linkedTextHandler->start("exceptions");
+}
+
+void MemberHandler::startName(const QXmlAttributes &)
+{
+ m_curString="";
+}
+
+void MemberHandler::endName()
+{
+ m_name = m_curString.stripWhiteSpace();
+ debug(2,"member name=`%s'\n",m_name.data());
+}
+
+void MemberHandler::startRead(const QXmlAttributes &)
+{
+ m_curString="";
+}
+
+void MemberHandler::endRead()
+{
+ m_read = m_curString.stripWhiteSpace();
+ debug(2,"member read=`%s'\n",m_read.data());
+}
+
+void MemberHandler::startWrite(const QXmlAttributes &)
+{
+ m_curString="";
+}
+
+void MemberHandler::endWrite()
+{
+ m_write = m_curString.stripWhiteSpace();
+ debug(2,"member write=`%s'\n",m_write.data());
+}
+
+void MemberHandler::startDefinition(const QXmlAttributes&)
+{
+ m_curString="";
+}
+
+void MemberHandler::endDefinition()
+{
+ m_definition = m_curString.stripWhiteSpace();
+ debug(2,"definition=%s\n",m_definition.data());
+}
+
+void MemberHandler::startArgsString(const QXmlAttributes&)
+{
+ m_curString="";
+}
+
+void MemberHandler::endArgsString()
+{
+ m_argsstring = m_curString.stripWhiteSpace();
+ debug(2,"arggstring=%s\n",m_argsstring.data());
+}
+
+void MemberHandler::startParam(const QXmlAttributes& attrib)
+{
+ ParamHandler *paramHandler = new ParamHandler(this);
+ paramHandler->startParam(attrib);
+ if (m_insideTemplateParamList)
+ {
+ m_templateParams.append(paramHandler);
+ }
+ else
+ {
+ m_params.append(paramHandler);
+ }
+}
+
+void MemberHandler::startTemplateParamList(const QXmlAttributes&)
+{
+ m_insideTemplateParamList = TRUE;
+ m_hasTemplateParamList = TRUE;
+}
+
+void MemberHandler::endTemplateParamList()
+{
+ m_insideTemplateParamList = FALSE;
+}
+
+void MemberHandler::initialize(MainHandler *mh)
+{
+ {
+ QListIterator<MemberReference> mli(m_references);
+ MemberReference *mr;
+ for (;(mr=mli.current());++mli)
+ {
+ mr->initialize(mh);
+ }
+ }
+ {
+ QListIterator<MemberReference> mli(m_referencedBy);
+ MemberReference *mr;
+ for (;(mr=mli.current());++mli)
+ {
+ mr->initialize(mh);
+ }
+ }
+ {
+ QListIterator<MemberReference> mli(m_reimplementedBy);
+ MemberReference *mr;
+ for (;(mr=mli.current());++mli)
+ {
+ mr->initialize(mh);
+ }
+ }
+ if (m_reimplements) m_reimplements->initialize(mh);
+}
+
+void MemberHandler::setCompoundHandler(CompoundHandler *c)
+{
+ m_compound = c;
+}
+
+ICompound *MemberHandler::compound() const
+{
+ m_compound->addref();
+ return m_compound->toICompound();
+}
+
+void MemberHandler::setSectionHandler(SectionHandler *c)
+{
+ m_section = c;
+}
+
+ISection *MemberHandler::section() const
+{
+ return m_section;
+}
+
+IMemberIterator *MemberHandler::enumValues() const
+{
+ return new MemberIterator(m_enumValues);
+}
+
+ILinkedTextIterator *MemberHandler::type() const
+{
+ return new LinkedTextIterator(m_type);
+}
+
+const IString *MemberHandler::typeString() const
+{
+ MemberHandler *that = (MemberHandler *)this;
+ that->m_typeString = LinkedTextHandler::toString(m_type);
+ return &m_typeString;
+}
+
+IParamIterator *MemberHandler::parameters() const
+{
+ return new ParamIterator(m_params);
+}
+
+IParamIterator *MemberHandler::templateParameters() const
+{
+ return m_hasTemplateParamList ? new ParamIterator(m_templateParams) : 0;
+}
+
+IMemberReferenceIterator *MemberHandler::references() const
+{
+ return new MemberReferenceIterator(m_references);
+}
+
+IMemberReferenceIterator *MemberHandler::referencedBy() const
+{
+ return new MemberReferenceIterator(m_referencedBy);
+}
+
+ILinkedTextIterator *MemberHandler::initializer() const
+{
+ return new LinkedTextIterator(m_initializer);
+}
+
+ILinkedTextIterator *MemberHandler::exceptions() const
+{
+ return new LinkedTextIterator(m_exception);
+}
+
+IMemberReferenceIterator *MemberHandler::reimplementedBy() const
+{
+ return new MemberReferenceIterator(m_reimplementedBy);
+}
+
+IDocRoot *MemberHandler::briefDescription() const
+{
+ return m_brief;
+}
+
+IDocRoot *MemberHandler::detailedDescription() const
+{
+ return m_detailed;
+}
+
+IDocRoot *MemberHandler::inbodyDescription() const
+{
+ return m_inbody;
+}
+
diff --git a/addon/doxmlparser/src/memberhandler.h b/addon/doxmlparser/src/memberhandler.h
new file mode 100644
index 0000000..9b409b6
--- /dev/null
+++ b/addon/doxmlparser/src/memberhandler.h
@@ -0,0 +1,252 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _MEMBERHANDLER_H
+#define _MEMBERHANDLER_H
+
+#include <qstring.h>
+#include <qlist.h>
+#include <qxml.h>
+#include <doxmlintf.h>
+
+#include "basehandler.h"
+#include "baseiterator.h"
+#include "stringimpl.h"
+
+class MainHandler;
+class CompoundHandler;
+class SectionHandler;
+class ParamHandler;
+class LinkedTextImpl;
+class LinkedTextHandler;
+class DocHandler;
+
+class MemberReference : public IMemberReference
+{
+ public:
+ virtual ~MemberReference() {}
+ virtual IMember *member() const;
+ virtual const IString *name() const { return &m_name; }
+ virtual const IString *scope() const { return &m_scope; }
+ virtual const IString *protection() const { return &m_protection; }
+ virtual const IString *virtualness() const { return &m_virtualness; }
+ virtual const IString *ambiguityScope() const { return &m_ambiguityScope; }
+ void initialize(MainHandler *m);
+
+ QString m_memId;
+ StringImpl m_name;
+ StringImpl m_scope;
+ StringImpl m_virtualness;
+ StringImpl m_protection;
+ StringImpl m_ambiguityScope;
+ MainHandler *m_mainHandler;
+};
+
+class MemberReferenceIterator : public BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>
+{
+ public:
+ MemberReferenceIterator(const QList<MemberReference> &list) :
+ BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>(list) {}
+};
+
+class MemberHandler : public IDefine,
+ public IProperty,
+ public IVariable,
+ public ITypedef,
+ public IFunction,
+ public ISignal,
+ public IPrototype,
+ public IFriend,
+ public IDCOP,
+ public ISlot,
+ public IEnum,
+ public IEnumValue,
+ public BaseHandler<MemberHandler>
+{
+ public:
+ virtual void startMember(const QXmlAttributes& attrib);
+ virtual void endMember();
+ virtual void startParam(const QXmlAttributes& attrib);
+ virtual void startType(const QXmlAttributes& attrib);
+ virtual void startName(const QXmlAttributes& attrib);
+ virtual void endName();
+ virtual void startRead(const QXmlAttributes& attrib);
+ virtual void endRead();
+ virtual void startWrite(const QXmlAttributes& attrib);
+ virtual void endWrite();
+ virtual void startDefinition(const QXmlAttributes& attrib);
+ virtual void endDefinition();
+ virtual void startArgsString(const QXmlAttributes& attrib);
+ virtual void endArgsString();
+ virtual void startBriefDesc(const QXmlAttributes& attrib);
+ virtual void startDetailedDesc(const QXmlAttributes& attrib);
+ virtual void startInbodyDesc(const QXmlAttributes& attrib);
+ virtual void startLocation(const QXmlAttributes& attrib);
+ virtual void startReferences(const QXmlAttributes& attrib);
+ virtual void endReferences();
+ virtual void startReferencedBy(const QXmlAttributes& attrib);
+ virtual void endReferencedBy();
+ virtual void startReimplements(const QXmlAttributes& attrib);
+ virtual void endReimplements();
+ virtual void startReimplementedBy(const QXmlAttributes& attrib);
+ virtual void endReimplementedBy();
+ virtual void startInitializer(const QXmlAttributes& attrib);
+ virtual void startException(const QXmlAttributes& attrib);
+ virtual void startEnumValue(const QXmlAttributes& attrib);
+ virtual void startEnumValue2(const QXmlAttributes& attrib);
+ virtual void startTemplateParamList(const QXmlAttributes &attrib);
+ virtual void endTemplateParamList();
+
+ MemberHandler(IBaseHandler *parent);
+ virtual ~MemberHandler();
+
+ // IMember implementation
+ virtual ICompound *compound() const;
+ virtual ISection *section() const;
+ virtual MemberKind kind() const
+ { return m_kind; }
+ virtual const IString *kindString() const
+ { return &m_kindString; }
+ virtual const IString *id() const
+ { return &m_id; }
+ virtual const IString *protection() const
+ { return &m_protection; }
+ virtual const IString *virtualness() const
+ { return &m_virtualness; }
+ virtual const IString *name() const
+ { return &m_name; }
+ virtual const IString *readAccessor() const
+ { return &m_read; }
+ virtual const IString *writeAccessor() const
+ { return &m_write; }
+ virtual const IString *definition() const
+ { return &m_definition; }
+ virtual const IString *argsstring() const
+ { return &m_argsstring; }
+ virtual bool isConst() const
+ { return m_isConst; }
+ virtual bool isVolatile() const
+ { return m_isVolatile; }
+ virtual bool isStatic() const
+ { return m_isStatic; }
+ virtual bool isExplicit() const
+ { return m_isExplicit; }
+ virtual bool isInline() const
+ { return m_isInline; }
+ virtual bool isMutable() const
+ { return m_isMutable; }
+ virtual bool isReadable() const
+ { return m_isReadable; }
+ virtual bool isWritable() const
+ { return m_isWritable; }
+ virtual ILinkedTextIterator *type() const;
+ virtual const IString *typeString() const;
+ virtual IParamIterator *parameters() const;
+ virtual IParamIterator *templateParameters() const;
+ virtual IMemberReferenceIterator *references() const;
+ virtual IMemberReferenceIterator *referencedBy() const;
+ virtual ILinkedTextIterator *initializer() const;
+ virtual ILinkedTextIterator *exceptions() const;
+ virtual const IString *bodyFile() const
+ { return &m_bodyFile; }
+ virtual int bodyStart() const
+ { return m_bodyStart; }
+ virtual int bodyEnd() const
+ { return m_bodyEnd; }
+ virtual const IString *definitionFile() const
+ { return &m_defFile; }
+ virtual int definitionLine() const
+ { return m_defLine; }
+ virtual IMemberReference *reimplements() const
+ { return m_reimplements; }
+ virtual IMemberReferenceIterator *reimplementedBy() const;
+ virtual IDocRoot *briefDescription() const;
+ virtual IDocRoot *detailedDescription() const;
+ virtual IDocRoot *inbodyDescription() const;
+
+ // IEnum
+ virtual IMemberIterator *enumValues() const;
+
+ void initialize(MainHandler *m);
+ void setCompoundHandler(CompoundHandler *c);
+ void setSectionHandler(SectionHandler *s);
+
+ private:
+ // XML elements:
+ // -----------------
+ QList<ParamHandler> m_templateParams; // templateparamlist
+ QList<LinkedTextImpl> m_type; // type
+ StringImpl m_definition; // definition
+ StringImpl m_argsstring; // argsstring
+ StringImpl m_name; // name
+ StringImpl m_read; // read
+ StringImpl m_write; // write
+ MemberReference *m_reimplements; // reimplements
+ QList<MemberReference> m_reimplementedBy; // reimplementedby
+ QList<ParamHandler> m_params; // param
+ QList<MemberHandler> m_enumValues; // enumvalue
+ QList<LinkedTextImpl> m_initializer; // initializer
+ QList<LinkedTextImpl> m_exception; // exceptions
+ DocHandler *m_brief; // briefdescription
+ DocHandler *m_detailed; // detaileddescription
+ DocHandler *m_inbody; // inbodydescription
+ // location
+ StringImpl m_defFile; // - file
+ int m_defLine; // - line
+ StringImpl m_bodyFile; // - bodyfile
+ int m_bodyStart; // - bodystart
+ int m_bodyEnd; // - bodyend
+ QList<MemberReference> m_references; // references
+ QList<MemberReference> m_referencedBy; // referencedby
+
+ // XML attributes:
+ // ---------------
+ MemberKind m_kind; // kind
+ StringImpl m_kindString; // kind as a string
+ StringImpl m_id; // id
+ StringImpl m_protection; // prot
+ bool m_isStatic; // static
+ bool m_isConst; // const
+ bool m_isExplicit; // explicit
+ bool m_isInline; // inline
+ StringImpl m_virtualness; // virt
+ bool m_isVolatile; // volatile
+ bool m_isMutable; // mutable
+ bool m_isReadable; // readable
+ bool m_isWritable; // writable
+
+ CompoundHandler *m_compound;
+ SectionHandler *m_section;
+ StringImpl m_typeString;
+ LinkedTextHandler *m_linkedTextHandler;
+ bool m_insideTemplateParamList;
+ bool m_hasTemplateParamList;
+ IBaseHandler *m_parent;
+};
+
+class MemberIterator : public BaseIteratorVia<IMemberIterator,
+ IMember,
+ MemberHandler,
+ IFunction>
+{
+ public:
+ MemberIterator(const QList<MemberHandler> &list) :
+ BaseIteratorVia<IMemberIterator,IMember,MemberHandler,IFunction>(list) {}
+};
+
+void memberhandler_init();
+void memberhandler_exit();
+
+#endif
diff --git a/addon/doxmlparser/src/paramhandler.cpp b/addon/doxmlparser/src/paramhandler.cpp
new file mode 100644
index 0000000..3f1f699
--- /dev/null
+++ b/addon/doxmlparser/src/paramhandler.cpp
@@ -0,0 +1,158 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include "paramhandler.h"
+#include "memberhandler.h"
+#include "linkedtexthandler.h"
+#include "debug.h"
+#include "dochandler.h"
+
+TemplateParamListHandler::TemplateParamListHandler(IBaseHandler *parent) : m_parent(parent)
+{
+ addStartHandler("param",this,&TemplateParamListHandler::startParam);
+
+ addEndHandler("templateparamlist",this,&TemplateParamListHandler::endTemplateParamList);
+}
+
+void TemplateParamListHandler::startParam(const QXmlAttributes& attrib)
+{
+ ParamHandler *ph = new ParamHandler(this);
+ ph->startParam(attrib);
+ m_templateParams.append(ph);
+}
+
+void TemplateParamListHandler::endParam()
+{
+}
+
+void TemplateParamListHandler::startTemplateParamList(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"templateparamlist\n");
+}
+
+void TemplateParamListHandler::endTemplateParamList()
+{
+ m_parent->setDelegate(0);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ParamHandler::ParamHandler(IBaseHandler *parent) : m_brief(0), m_parent(parent)
+{
+ addEndHandler("param",this,&ParamHandler::endParam);
+
+ addStartHandler("type",this,&ParamHandler::startType);
+
+ addStartHandler("declname");
+ addEndHandler("declname",this,&ParamHandler::endDeclName);
+
+ addStartHandler("defname");
+ addEndHandler("defname",this,&ParamHandler::endDefName);
+
+ addStartHandler("array");
+ addEndHandler("array",this,&ParamHandler::endArray);
+
+ addStartHandler("attribute");
+ addEndHandler("attribute",this,&ParamHandler::endAttrib);
+
+ addStartHandler("briefdescription",this,&ParamHandler::startBriefDesc);
+
+ addStartHandler("defval",this,&ParamHandler::startDefVal);
+
+ m_linkedTextHandler = 0;
+}
+
+ParamHandler::~ParamHandler()
+{
+ delete m_brief;
+ delete m_linkedTextHandler;
+}
+
+void ParamHandler::startParam(const QXmlAttributes& /*attrib*/)
+{
+ m_parent->setDelegate(this);
+ debug(2,"param\n");
+}
+
+void ParamHandler::endParam()
+{
+ m_parent->setDelegate(0);
+}
+
+void ParamHandler::startType(const QXmlAttributes& /*attrib*/)
+{
+ delete m_linkedTextHandler;
+ m_linkedTextHandler = new LinkedTextHandler(this,m_type);
+ m_linkedTextHandler->start("type");
+ debug(2,"param type\n");
+}
+
+void ParamHandler::endDeclName()
+{
+ m_declName = m_curString.stripWhiteSpace();
+ debug(2,"member declName=`%s'\n",m_declName.data());
+}
+
+void ParamHandler::endDefName()
+{
+ m_defName = m_curString.stripWhiteSpace();
+ debug(2,"member defName=`%s'\n",m_defName.data());
+}
+
+void ParamHandler::endAttrib()
+{
+ m_attrib = m_curString.stripWhiteSpace();
+ debug(2,"member attrib=`%s'\n",m_attrib.data());
+}
+
+void ParamHandler::endArray()
+{
+ m_array = m_curString.stripWhiteSpace();
+ debug(2,"member array=`%s'\n",m_array.data());
+}
+
+void ParamHandler::startDefVal(const QXmlAttributes& /*attrib*/)
+{
+ delete m_linkedTextHandler;
+ m_linkedTextHandler = new LinkedTextHandler(this,m_defVal);
+ m_linkedTextHandler->start("defval");
+ debug(2,"member defVal\n");
+}
+
+void ParamHandler::startBriefDesc(const QXmlAttributes& attrib)
+{
+ DocHandler *docHandler = new DocHandler(this);
+ docHandler->startDoc(attrib);
+ m_brief = docHandler;
+}
+
+ILinkedTextIterator *ParamHandler::type() const
+{
+ return new LinkedTextIterator(m_type);
+}
+
+ILinkedTextIterator *ParamHandler::defaultValue() const
+{
+ return new LinkedTextIterator(m_defVal);
+}
+
+IDocRoot *ParamHandler::briefDescription() const
+{
+ return m_brief;
+}
+
+
+
diff --git a/addon/doxmlparser/src/paramhandler.h b/addon/doxmlparser/src/paramhandler.h
new file mode 100644
index 0000000..d840679
--- /dev/null
+++ b/addon/doxmlparser/src/paramhandler.h
@@ -0,0 +1,103 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _PARAMHANDLER_H
+#define _PARAMHANDLER_H
+
+#include <qstring.h>
+#include <qlist.h>
+#include <qxml.h>
+#include <doxmlintf.h>
+
+#include "stringimpl.h"
+#include "basehandler.h"
+#include "baseiterator.h"
+
+class LinkedTextImpl;
+class LinkedTextHandler;
+class DocHandler;
+
+
+class ParamHandler : public IParam, public BaseHandler<ParamHandler>
+{
+ public:
+ virtual void startParam(const QXmlAttributes& attrib);
+ virtual void endParam();
+ virtual void startType(const QXmlAttributes& attrib);
+ virtual void endDeclName();
+ virtual void endDefName();
+ virtual void endAttrib();
+ virtual void endArray();
+ virtual void startDefVal(const QXmlAttributes& attrib);
+ virtual void startBriefDesc(const QXmlAttributes& attrib);
+
+ ParamHandler(IBaseHandler *parent);
+ virtual ~ParamHandler();
+
+ // IParam
+ virtual ILinkedTextIterator *type() const;
+ virtual const IString * declarationName() const { return &m_declName; }
+ virtual const IString * definitionName() const { return &m_defName; }
+ virtual const IString * attrib() const { return &m_attrib; }
+ virtual const IString * arraySpecifier() const { return &m_array; }
+ virtual ILinkedTextIterator *defaultValue() const;
+ virtual IDocRoot *briefDescription() const;
+
+ private:
+
+ // XML elements:
+ // -------------
+ QList<LinkedTextImpl> m_type; // type
+ StringImpl m_declName; // declname
+ StringImpl m_defName; // defname
+ StringImpl m_array; // array
+ QList<LinkedTextImpl> m_defVal; // defval
+ DocHandler *m_brief; // briefdescription
+
+ StringImpl m_attrib; // TODO: not yet in XML output
+
+ IBaseHandler *m_parent;
+ LinkedTextHandler *m_linkedTextHandler;
+};
+
+class ParamIterator : public BaseIterator<IParamIterator,IParam,ParamHandler>
+{
+ public:
+ ParamIterator(const QList<ParamHandler> &list) :
+ BaseIterator<IParamIterator,IParam,ParamHandler>(list) {}
+};
+
+class TemplateParamListHandler : public BaseHandler<TemplateParamListHandler>
+{
+ public:
+
+ virtual void startParam(const QXmlAttributes& attrib);
+ virtual void endParam();
+
+ virtual void startTemplateParamList(const QXmlAttributes& attrib);
+ virtual void endTemplateParamList();
+
+ TemplateParamListHandler(IBaseHandler *parent);
+ virtual ~TemplateParamListHandler() {}
+
+ ParamIterator* templateParams() { return new ParamIterator(m_templateParams); }
+
+ protected:
+ IBaseHandler *m_parent;
+ QList<ParamHandler> m_templateParams;
+};
+
+
+#endif
diff --git a/addon/doxmlparser/src/sectionhandler.cpp b/addon/doxmlparser/src/sectionhandler.cpp
new file mode 100644
index 0000000..70adf9c
--- /dev/null
+++ b/addon/doxmlparser/src/sectionhandler.cpp
@@ -0,0 +1,168 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include "mainhandler.h"
+#include "compoundhandler.h"
+#include "sectionhandler.h"
+#include "memberhandler.h"
+#include "dochandler.h"
+#include "debug.h"
+
+class SectionTypeMap
+{
+ public:
+ SectionTypeMap() : m_map(37)
+ {
+ m_map.setAutoDelete(TRUE);
+ m_map.insert("user-defined",new int(ISection::UserDefined));
+ m_map.insert("public-type",new int(ISection::PubTypes));
+ m_map.insert("public-func",new int(ISection::PubFuncs));
+ m_map.insert("public-attrib",new int(ISection::PubAttribs));
+ m_map.insert("public-slot",new int(ISection::PubSlots));
+ m_map.insert("signal",new int(ISection::Signals));
+ m_map.insert("dcop-func",new int(ISection::DCOPFuncs));
+ m_map.insert("property",new int(ISection::Properties));
+ m_map.insert("event",new int(ISection::Events));
+ m_map.insert("public-static-func",new int(ISection::PubStatFuncs));
+ m_map.insert("public-static-attrib",new int(ISection::PubStatAttribs));
+ m_map.insert("protected-type",new int(ISection::ProTypes));
+ m_map.insert("protected-func",new int(ISection::ProFuncs));
+ m_map.insert("protected-attrib",new int(ISection::ProAttribs));
+ m_map.insert("protected-slot",new int(ISection::ProSlots));
+ m_map.insert("protected-static-func",new int(ISection::ProStatFuncs));
+ m_map.insert("protected-static-attrib",new int(ISection::ProStatAttribs));
+ m_map.insert("package-type",new int(ISection::PacTypes));
+ m_map.insert("package-func",new int(ISection::PacFuncs));
+ m_map.insert("package-attrib",new int(ISection::PacAttribs));
+ m_map.insert("package-static-func",new int(ISection::PacStatFuncs));
+ m_map.insert("package-static-attrib",new int(ISection::PacStatAttribs));
+ m_map.insert("private-type",new int(ISection::PriTypes));
+ m_map.insert("private-func",new int(ISection::PriFuncs));
+ m_map.insert("private-attrib",new int(ISection::PriAttribs));
+ m_map.insert("private-slot",new int(ISection::PriSlots));
+ m_map.insert("private-static-func",new int(ISection::PriStatFuncs));
+ m_map.insert("private-static-attrib",new int(ISection::PriStatAttribs));
+ m_map.insert("friend",new int(ISection::Friend));
+ m_map.insert("related",new int(ISection::Related));
+ m_map.insert("define",new int(ISection::Defines));
+ m_map.insert("prototype",new int(ISection::Prototypes));
+ m_map.insert("typedef",new int(ISection::Typedefs));
+ m_map.insert("enum",new int(ISection::Enums));
+ m_map.insert("func",new int(ISection::Functions));
+ m_map.insert("var",new int(ISection::Variables));
+ }
+ ISection::SectionKind map(const QString &s)
+ {
+ int *val = m_map.find(s);
+ if (val==0)
+ {
+ debug(1,"Warning: `%s' is an invalid section type\n",s.data());
+ return ISection::Invalid;
+ }
+ else return (ISection::SectionKind)*val;
+ }
+ private:
+ QDict<int> m_map;
+};
+
+static SectionTypeMap *s_typeMap;
+
+void sectionhandler_init()
+{
+ s_typeMap = new SectionTypeMap;
+}
+
+void sectionhandler_exit()
+{
+ delete s_typeMap;
+}
+
+SectionHandler::SectionHandler(IBaseHandler *parent) : m_parent(parent)
+{
+ //printf("SectionHandler::SectionHandler()\n");
+ m_members.setAutoDelete(TRUE);
+ addEndHandler("sectiondef",this,&SectionHandler::endSection);
+ addStartHandler("memberdef",this,&SectionHandler::startMember);
+ addStartHandler("header",this,&SectionHandler::startHeader);
+ addEndHandler("header",this,&SectionHandler::endHeader);
+ addStartHandler("description",this,&SectionHandler::startDescription);
+}
+
+SectionHandler::~SectionHandler()
+{
+ debug(2,"SectionHandler::~SectionHandler()\n");
+}
+
+void SectionHandler::startSection(const QXmlAttributes& attrib)
+{
+ m_parent->setDelegate(this);
+ m_kindString = attrib.value("kind");
+ m_kind = s_typeMap->map(m_kindString);
+ debug(2,"section kind=`%s'\n",m_kindString.data());
+}
+
+void SectionHandler::startDescription(const QXmlAttributes& attrib)
+{
+ DocHandler *docHandler = new DocHandler(this);
+ docHandler->startDoc(attrib);
+ m_description = docHandler;
+}
+
+void SectionHandler::endSection()
+{
+ m_parent->setDelegate(0);
+}
+
+void SectionHandler::startMember(const QXmlAttributes& attrib)
+{
+ MemberHandler *memHandler = new MemberHandler(this);
+ memHandler->startMember(attrib);
+ m_members.append(memHandler);
+}
+
+void SectionHandler::startHeader(const QXmlAttributes&)
+{
+ m_header="";
+ m_curString="";
+}
+
+void SectionHandler::endHeader()
+{
+ m_header = m_curString.stripWhiteSpace();
+ debug(2,"member header=`%s'\n",m_header.data());
+}
+
+void SectionHandler::initialize(CompoundHandler *ch)
+{
+ QListIterator<MemberHandler> mli(m_members);
+ MemberHandler *mh;
+ for (;(mh=mli.current());++mli)
+ {
+ mh->setCompoundHandler(ch);
+ ch->insertMember(mh);
+ mh->setSectionHandler(this);
+ }
+}
+
+IDocRoot *SectionHandler::description() const
+{
+ return m_description;
+}
+
+IMemberIterator *SectionHandler::members() const
+{
+ return new MemberIterator(m_members);
+}
+
diff --git a/addon/doxmlparser/src/sectionhandler.h b/addon/doxmlparser/src/sectionhandler.h
new file mode 100644
index 0000000..c462b91
--- /dev/null
+++ b/addon/doxmlparser/src/sectionhandler.h
@@ -0,0 +1,102 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _SECTIONHANDLER_H
+#define _SECTIONHANDLER_H
+
+#include <qstring.h>
+#include <qlist.h>
+#include <qxml.h>
+#include <doxmlintf.h>
+
+#include "basehandler.h"
+
+class SectionIterator :
+ public BaseIterator<ISectionIterator,ISection,SectionHandler>
+{
+ public:
+ SectionIterator(const QList<SectionHandler> &list) :
+ BaseIterator<ISectionIterator,ISection,SectionHandler>(list) {}
+};
+
+
+class SectionHandler : public IUserDefined, public BaseHandler<SectionHandler>
+{
+ public:
+ virtual void startMember(const QXmlAttributes& attrib);
+ virtual void startHeader(const QXmlAttributes& attrib);
+ virtual void startSection(const QXmlAttributes& attrib);
+ virtual void startDescription(const QXmlAttributes& attrib);
+ virtual void endSection();
+ virtual void endHeader();
+
+ SectionHandler(IBaseHandler *parent);
+ virtual ~SectionHandler();
+
+ // ISection
+ virtual const IString *kindString() const
+ { return &m_kindString; }
+ virtual SectionKind kind() const
+ { return m_kind; }
+ IDocRoot *description() const;
+ virtual IMemberIterator *members() const;
+ virtual bool isStatic() const
+ {
+ return m_kind==PubStatFuncs || m_kind==PubStatAttribs ||
+ m_kind==ProStatFuncs || m_kind==ProStatAttribs ||
+ m_kind==PriStatFuncs || m_kind==PriStatAttribs;
+ }
+ virtual bool isPublic() const
+ {
+ return !isProtected() && !isPrivate();
+ }
+ virtual bool isProtected() const
+ {
+ return m_kind==ProTypes || m_kind==ProFuncs || m_kind==ProAttribs ||
+ m_kind==ProSlots || m_kind==ProStatFuncs || m_kind==ProStatAttribs;
+ }
+ virtual bool isPrivate() const
+ {
+ return m_kind==PriTypes || m_kind==PriFuncs || m_kind==PriAttribs ||
+ m_kind==PriSlots || m_kind==PriStatFuncs || m_kind==PriStatAttribs;
+ }
+
+ void initialize(CompoundHandler *c);
+
+ // IUserDefined implementation
+ virtual const IString *header() const
+ {
+ return &m_header;
+ }
+
+ private:
+ IBaseHandler *m_parent;
+
+ // XML elements:
+ // -------------
+ StringImpl m_header; // header
+ DocHandler* m_description; // description
+ QList<MemberHandler> m_members; // memberdef
+
+ // XML attributes:
+ // ---------------
+ SectionKind m_kind; // kind
+ StringImpl m_kindString; // kind as a string
+};
+
+void sectionhandler_init();
+void sectionhandler_exit();
+
+#endif
diff --git a/addon/doxmlparser/src/stringimpl.h b/addon/doxmlparser/src/stringimpl.h
new file mode 100644
index 0000000..013858f
--- /dev/null
+++ b/addon/doxmlparser/src/stringimpl.h
@@ -0,0 +1,30 @@
+#ifndef STRINGIMPL_H
+#define STRINGIMPL_H
+
+#include <qstring.h>
+#include "doxmlintf.h"
+
+class StringImpl : public QString, public IString
+{
+ public:
+ StringImpl() {}
+ StringImpl(const QString &str) : QString(str) {}
+ StringImpl &operator=(const QString &str)
+ { QString::operator=(str); return *this; }
+ virtual ~StringImpl() {}
+
+ // IString
+ const char *latin1() const
+ { return QString::latin1(); }
+ const char *utf8() const
+ { return QString::utf8(); }
+ unsigned short unicodeCharAt(int index) const
+ { return QString::unicode()[index].unicode(); }
+ bool isEmpty() const
+ { return QString::isEmpty(); }
+ int length() const
+ { return QString::length(); }
+};
+
+#endif
+
diff --git a/addon/doxmlparser/test/Makefile b/addon/doxmlparser/test/Makefile
new file mode 100644
index 0000000..6621794
--- /dev/null
+++ b/addon/doxmlparser/test/Makefile
@@ -0,0 +1,33 @@
+#
+# This file was generated from Makefile.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+DOXYGEN = /Users/dimitri/doxygen
+TMAKEPATH = /Users/dimitri/doxygen/tmake/lib/macosx-c++
+ENV = env TMAKEPATH=$(TMAKEPATH)
+TMAKE = /Users/dimitri/doxygen/tmake/bin/tmake
+MAKE = /opt/local/bin/gmake
+PERL = /opt/local/bin/perl
+RM = rm -f
+CP = cp
+VERSION = 1.7.3
+INSTALL = /usr/local
+INSTTOOL = /opt/local/bin/ginstall
+DOXYDOCS = ..
+DOCDIR = $(INSTALL)/share/doc/packages/doxygen
+QTDIR = /usr
+HAVE_DOT = /usr/local/bin/dot
+MKSPECS = -spec macx-g++
+all clean depend: Makefile.xmlparse
+ $(MAKE) -f Makefile.xmlparse $@
+
+distclean: clean
+ $(RM) -rf Makefile.xmlparse xmlparse.pro Makefile obj
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) xmlparse.pro >Makefile.xmlparse
+
+Makefile.xmlparse: xmlparse.pro
+ $(ENV) $(PERL) $(TMAKE) xmlparse.pro >Makefile.xmlparse
+
+install:
diff --git a/addon/doxmlparser/test/Makefile.in b/addon/doxmlparser/test/Makefile.in
new file mode 100644
index 0000000..1dfbd17
--- /dev/null
+++ b/addon/doxmlparser/test/Makefile.in
@@ -0,0 +1,13 @@
+all clean depend: Makefile.xmlparse
+ $(MAKE) -f Makefile.xmlparse $@
+
+distclean: clean
+ $(RM) -rf Makefile.xmlparse xmlparse.pro Makefile obj
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) xmlparse.pro >Makefile.xmlparse
+
+Makefile.xmlparse: xmlparse.pro
+ $(ENV) $(PERL) $(TMAKE) xmlparse.pro >Makefile.xmlparse
+
+install:
diff --git a/addon/doxmlparser/test/Makefile.xmlparse b/addon/doxmlparser/test/Makefile.xmlparse
new file mode 100644
index 0000000..d4d9ba1
--- /dev/null
+++ b/addon/doxmlparser/test/Makefile.xmlparse
@@ -0,0 +1,77 @@
+#############################################################################
+# Makefile for building xmlparse
+# Generated by tmake at 15:12, 2011/03/28
+# Project: xmlparse
+# Template: app.t
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cc
+CXX = c++
+CFLAGS = -pipe -Wall -W -g -fstack-protector
+CXXFLAGS= -pipe -D__FreeBSD__=6 -Wall -W -g -fstack-protector
+INCPATH = -I../../../qtools -I../include
+LINK = c++
+LFLAGS = -Wl,-search_paths_first
+LIBS = -L../../../lib -L../lib -ldoxmlparser -lqtools -liconv -framework CoreServices
+MOC = /usr/bin/moc
+
+TAR = tar -cf
+GZIP = gzip -9f
+
+####### Files
+
+HEADERS =
+SOURCES = main.cpp
+OBJECTS = ../objects/main.o
+SRCMOC =
+OBJMOC =
+DIST =
+TARGET = xmlparse
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .C .c
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+####### Build rules
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(OBJMOC) ../lib/libdoxmlparser.a
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
+
+moc: $(SRCMOC)
+
+tmake:
+ tmake xmlparse.pro
+
+dist:
+ $(TAR) xmlparse.tar xmlparse.pro $(SOURCES) $(HEADERS) $(DIST)
+ $(GZIP) xmlparse.tar
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
+ -rm -f *~ core
+
+####### Compile
+
+../objects/main.o: main.cpp \
+ ../include/doxmlintf.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/main.o main.cpp
+
diff --git a/addon/doxmlparser/test/main.cpp b/addon/doxmlparser/test/main.cpp
new file mode 100644
index 0000000..a01d0f8
--- /dev/null
+++ b/addon/doxmlparser/test/main.cpp
@@ -0,0 +1,759 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <doxmlintf.h>
+#include <qstring.h>
+
+/*! Dumps the contents of a hyperlinked text fragment as plain text to the
+ * output.
+ */
+QString linkedTextToString(ILinkedTextIterator *ti)
+{
+ QString result;
+ ILinkedText *lt=0;
+ for (ti->toFirst();(lt=ti->current());ti->toNext())
+ {
+ switch (lt->kind())
+ {
+ case ILinkedText::Kind_Text: // plain text
+ result+=dynamic_cast<ILT_Text*>(lt)->text()->latin1(); break;
+ case ILinkedText::Kind_Ref: // a link
+ result+=dynamic_cast<ILT_Ref *>(lt)->text()->latin1(); break;
+ }
+ }
+ return result;
+}
+
+/*! Macro for printing an indented message. */
+#define InPrint(x) printf("%s",indent.latin1()), printf x;
+
+/*! Dumps the contents of a documentation block to stdout.
+ * @note This function will call itself recursively.
+ * @param doc The root of the documentation tree.
+ * @param level The indent level.
+ */
+void DumpDoc(IDoc *doc,int level)
+{
+ if (doc==0) return;
+ QString indent;
+ indent.fill(' ',level);
+ //printf(" doc node kind=`%d'\n",doc->kind());
+ switch (doc->kind())
+ {
+ case IDoc::Para:
+ {
+ InPrint(("<para>\n"));
+ IDocPara *par = dynamic_cast<IDocPara*>(doc);
+ ASSERT(par!=0);
+ IDocIterator *di = par->contents();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("</para>\n"));
+ }
+ break;
+ case IDoc::Text:
+ {
+ IDocText *txt = dynamic_cast<IDocText*>(doc);
+ ASSERT(txt!=0);
+ InPrint(("<text value=`%s' markup=%d headingLevel=%d/>\n",
+ txt->text()->latin1(),txt->markup(),txt->headingLevel()));
+ }
+ break;
+ case IDoc::MarkupModifier:
+ {
+ IDocMarkupModifier *md = dynamic_cast<IDocMarkupModifier*>(doc);
+ ASSERT(md!=0);
+ InPrint(("<markup modifier enabled=%d markup=%d headingLevel=%d/>\n",
+ md->enabled(),md->markup(),md->headingLevel()));
+ }
+ break;
+ case IDoc::ItemizedList:
+ {
+ InPrint(("<itemized list>\n"));
+ IDocItemizedList *list = dynamic_cast<IDocItemizedList*>(doc);
+ ASSERT(list!=0);
+ IDocIterator *di = list->elements();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("</itemized list>\n"));
+ }
+ break;
+ case IDoc::OrderedList:
+ {
+ InPrint(("<ordered list>\n"));
+ IDocOrderedList *list = dynamic_cast<IDocOrderedList*>(doc);
+ ASSERT(list!=0);
+ IDocIterator *di = list->elements();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("</ordered list>\n"));
+ }
+ break;
+ case IDoc::ListItem:
+ {
+ InPrint(("<list item>\n"));
+ IDocListItem *li = dynamic_cast<IDocListItem*>(doc);
+ ASSERT(li!=0);
+ IDocIterator *di = li->contents();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("</list item>\n"));
+ }
+ break;
+ case IDoc::ParameterItem:
+ {
+ IDocParameterItem *item = dynamic_cast<IDocParameterItem*>(doc);
+ InPrint(("<parameter item>\n"));
+ IDocIterator *di = item->paramNames();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ DumpDoc(item->description(),level+1);
+ InPrint(("</parameter item>\n"));
+ }
+ break;
+ case IDoc::ParameterList:
+ {
+ IDocParameterList *list = dynamic_cast<IDocParameterList*>(doc);
+ InPrint(("<parameter list type=%d>\n",list->sectType()));
+ IDocIterator *di = list->params();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("</parameter list>\n"));
+ ASSERT(list!=0);
+ }
+ break;
+ case IDoc::Parameter:
+ {
+ IDocParameter *par = dynamic_cast<IDocParameter*>(doc);
+ ASSERT(par!=0);
+ InPrint(("<parameter name=%s/>\n",par->name()->latin1()));
+ }
+ break;
+ case IDoc::SimpleSect:
+ {
+ IDocSimpleSect *ss = dynamic_cast<IDocSimpleSect*>(doc);
+ ASSERT(ss!=0);
+ InPrint(("<simplesect type=%s>\n",ss->typeString()->latin1()));
+ DumpDoc(ss->title(),level+1);
+ DumpDoc(ss->description(),level+1);
+ InPrint(("<simplesect/>\n"));
+ }
+ break;
+ case IDoc::Title:
+ {
+ InPrint(("<title>\n"));
+ IDocTitle *t = dynamic_cast<IDocTitle*>(doc);
+ ASSERT(t!=0);
+ IDocIterator *di = t->title();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ InPrint(("<title/>\n"));
+ }
+ break;
+ case IDoc::Ref:
+ {
+ IDocRef *ref = dynamic_cast<IDocRef*>(doc);
+ ASSERT(ref!=0);
+ InPrint(("<ref id=%s text=%s/>\n",
+ ref->refId()->latin1(),ref->text()->latin1()));
+ }
+ break;
+ case IDoc::VariableList:
+ {
+ InPrint(("<variablelist>\n"));
+ IDocVariableList *vl = dynamic_cast<IDocVariableList*>(doc);
+ ASSERT(vl!=0);
+ IDocIterator *di = vl->entries();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("<variablelist/>\n"));
+ }
+ break;
+ case IDoc::VariableListEntry:
+ {
+ IDocVariableListEntry *vle = dynamic_cast<IDocVariableListEntry*>(doc);
+ ASSERT(vle!=0);
+ ILinkedTextIterator *lti = vle->term();
+ QString term = linkedTextToString(lti);
+ lti->release();
+ InPrint(("<variablelistentry term=%s>\n",term.latin1()));
+ DumpDoc(vle->description(),level+1);
+ InPrint(("<variablelistentry/>\n"));
+ }
+ break;
+ case IDoc::HRuler:
+ {
+ IDocHRuler *hr = dynamic_cast<IDocHRuler*>(doc);
+ ASSERT(hr!=0);
+ InPrint(("<hruler/>\n"));
+ }
+ break;
+ case IDoc::LineBreak:
+ {
+ IDocLineBreak *lb = dynamic_cast<IDocLineBreak*>(doc);
+ ASSERT(lb!=0);
+ InPrint(("<linebreak/>\n"));
+ }
+ break;
+ case IDoc::ULink:
+ {
+ IDocULink *ul = dynamic_cast<IDocULink*>(doc);
+ ASSERT(ul!=0);
+ InPrint(("<ulink url=`%s' text=`%s'/>\n",ul->url()->latin1(),ul->text()->latin1()));
+ }
+ break;
+ case IDoc::EMail:
+ {
+ IDocEMail *em = dynamic_cast<IDocEMail*>(doc);
+ ASSERT(em!=0);
+ InPrint(("<email address=`%s'/>\n",em->address()->latin1()));
+ }
+ break;
+ case IDoc::Link:
+ {
+ IDocLink *lk = dynamic_cast<IDocLink*>(doc);
+ ASSERT(lk!=0);
+ InPrint(("<link refid=`%s' text=`%s'/>\n",lk->refId()->latin1(),lk->text()->latin1()));
+ }
+ break;
+ case IDoc::ProgramListing:
+ {
+ IDocProgramListing *pl = dynamic_cast<IDocProgramListing*>(doc);
+ ASSERT(pl!=0);
+ InPrint(("<programlisting>\n"));
+ IDocIterator *cli = pl->codeLines();
+ IDoc *cl;
+ for (cli->toFirst();(cl=cli->current());cli->toNext())
+ {
+ DumpDoc(cl,level+1);
+ }
+ cli->release();
+ InPrint(("</programlisting>\n"));
+ }
+ break;
+ case IDoc::CodeLine:
+ {
+ IDocCodeLine *cl = dynamic_cast<IDocCodeLine*>(doc);
+ ASSERT(cl!=0);
+ InPrint(("<codeline lineNumber=%d refId=`%s'>\n",cl->lineNumber(),cl->refId()->latin1()));
+ IDocIterator *cei = cl->codeElements();
+ IDoc *ce;
+ for (cei->toFirst();(ce=cei->current());cei->toNext())
+ {
+ DumpDoc(ce,level+1);
+ }
+ cei->release();
+ InPrint(("</codeline>\n"));
+ }
+ break;
+ case IDoc::Highlight:
+ {
+ IDocHighlight *hl = dynamic_cast<IDocHighlight*>(doc);
+ ASSERT(hl!=0);
+ InPrint(("<highlight kind=%d>\n",hl->kind()));
+ IDocIterator *cei = hl->codeElements();
+ IDoc *ce;
+ for (cei->toFirst();(ce=cei->current());cei->toNext())
+ {
+ DumpDoc(ce,level+1);
+ }
+ cei->release();
+ InPrint(("</highlight>\n"));
+ }
+ break;
+ case IDoc::Formula:
+ {
+ IDocFormula *fm = dynamic_cast<IDocFormula*>(doc);
+ ASSERT(fm!=0);
+ InPrint(("<formula id=`%s' text=`%s'/>\n",fm->id()->latin1(),fm->text()->latin1()));
+ }
+ break;
+ case IDoc::Image:
+ {
+ IDocImage *img = dynamic_cast<IDocImage*>(doc);
+ ASSERT(img!=0);
+ InPrint(("<image name=`%s' caption=`%s'/>\n",img->name()->latin1(),img->caption()->latin1()));
+ }
+ break;
+ case IDoc::DotFile:
+ {
+ IDocDotFile *df = dynamic_cast<IDocDotFile*>(doc);
+ ASSERT(df!=0);
+ InPrint(("<dotfile name=`%s' caption=`%s'/>\n",df->name()->latin1(),df->caption()->latin1()));
+ }
+ break;
+ case IDoc::IndexEntry:
+ {
+ IDocIndexEntry *ie = dynamic_cast<IDocIndexEntry*>(doc);
+ ASSERT(ie!=0);
+ InPrint(("<indexentry primary=`%s' secondary=`%s'/>\n",ie->primary()->latin1(),ie->secondary()->latin1()));
+ }
+ break;
+ case IDoc::Table:
+ {
+ IDocTable *tbl = dynamic_cast<IDocTable*>(doc);
+ ASSERT(tbl!=0);
+ InPrint(("<table numcols=%d caption=`%s'>\n",tbl->numColumns(),tbl->caption()->latin1()));
+ IDocIterator *ri = tbl->rows();
+ IDoc *row;
+ for (ri->toFirst();(row=ri->current());ri->toNext())
+ {
+ DumpDoc(row,level+1);
+ }
+ ri->release();
+ InPrint(("</table>\n"));
+ }
+ break;
+ case IDoc::Row:
+ {
+ IDocRow *row = dynamic_cast<IDocRow*>(doc);
+ ASSERT(row!=0);
+ InPrint(("<row>\n"));
+ IDocIterator *ei = row->entries();
+ IDoc *e;
+ for (ei->toFirst();(e=ei->current());ei->toNext())
+ {
+ DumpDoc(e,level+1);
+ }
+ ei->release();
+ InPrint(("</row>\n"));
+ }
+ break;
+ case IDoc::Entry:
+ {
+ IDocEntry *ent = dynamic_cast<IDocEntry*>(doc);
+ ASSERT(ent!=0);
+ InPrint(("<entry>\n"));
+ IDocIterator *di = ent->contents();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("</entry>\n"));
+ }
+ break;
+ case IDoc::Section:
+ {
+ IDocSection *sec = dynamic_cast<IDocSection*>(doc);
+ ASSERT(sec!=0);
+ InPrint(("<section id=`%s' level=%d>\n",
+ sec->id()->latin1(),sec->level()));
+ DumpDoc(sec->title(),level+1);
+ IDocIterator *di = sec->paragraphs();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di=sec->subSections();
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ IDocInternal *intern = sec->internal();
+ if (intern)
+ {
+ DumpDoc(intern,level+1);
+ }
+ InPrint(("</section>\n"));
+ }
+ break;
+ case IDoc::Internal:
+ {
+ IDocInternal *intern = dynamic_cast<IDocInternal*>(doc);
+ ASSERT(intern!=0);
+ InPrint(("<internal>\n"));
+ IDocIterator *di = intern->paragraphs();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di=intern->subSections();
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ InPrint(("</internal>\n"));
+ }
+ break;
+ case IDoc::Copy:
+ {
+ IDocCopy *cpy = dynamic_cast<IDocCopy*>(doc);
+ ASSERT(cpy!=0);
+ InPrint(("<copydoc>\n"));
+ IDocIterator *di = cpy->contents();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("<copydoc/>\n"));
+ }
+ break;
+ case IDoc::TocItem:
+ {
+ IDocTocItem *ti = dynamic_cast<IDocTocItem*>(doc);
+ ASSERT(ti!=0);
+ InPrint(("<tocitem id=\"%s\" title=\"%s\"/>\n",
+ ti->id()->latin1(),ti->title()->latin1()));
+ }
+ break;
+ case IDoc::TocList:
+ {
+ IDocTocList *tl = dynamic_cast<IDocTocList*>(doc);
+ ASSERT(tl!=0);
+ InPrint(("<toclist>\n"));
+ IDocIterator *di = tl->elements();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("<toclist/>\n"));
+ }
+ break;
+ case IDoc::Verbatim:
+ {
+ IDocVerbatim *vt = dynamic_cast<IDocVerbatim*>(doc);
+ ASSERT(vt!=0);
+ const char *s=0;
+ switch (vt->type())
+ {
+ case IDocVerbatim::Verbatim: s="verbatim"; break;
+ case IDocVerbatim::HtmlOnly: s="htmlonly"; break;
+ case IDocVerbatim::LatexOnly: s="latexonly"; break;
+ default:
+ printf("Invalid verbatim type!\n");
+ }
+ InPrint(("<verbatim %s>\n",s));
+ InPrint(("%s",vt->text()->latin1()));
+ InPrint(("</verbatim>\n"));
+ }
+ break;
+ case IDoc::Anchor:
+ {
+ IDocAnchor *anc = dynamic_cast<IDocAnchor*>(doc);
+ ASSERT(anc!=0);
+ InPrint(("<anchor id='%s'/>\n",anc->id()->latin1()));
+ }
+ break;
+ case IDoc::Symbol:
+ {
+ IDocSymbol *sym = dynamic_cast<IDocSymbol*>(doc);
+ ASSERT(sym!=0);
+ InPrint(("<symbol type=%s letter=%c/>\n",
+ sym->typeString()->latin1(),sym->letter()));
+ }
+ break;
+ case IDoc::Root:
+ {
+ InPrint(("<root>\n"));
+ IDocRoot *root = dynamic_cast<IDocRoot*>(doc);
+ ASSERT(root!=0);
+ IDocIterator *di = root->contents();
+ IDoc *pdoc;
+ for (di->toFirst();(pdoc=di->current());di->toNext())
+ {
+ DumpDoc(pdoc,level+1);
+ }
+ di->release();
+ InPrint(("</root>\n"));
+ }
+ break;
+
+ default:
+ printf("Found unsupported node type %d!\n",doc->kind());
+ break;
+ }
+}
+
+void DumpGraph(IGraph *graph)
+{
+ if (graph==0) { printf(" --- no graph ---\n"); return; }
+ printf(" --- graph ----\n");
+ INodeIterator *ni = graph->nodes();
+ INode *node;
+ for (ni->toFirst();(node=ni->current());ni->toNext())
+ {
+ printf(" --- node id=%s label=%s linkId=%s\n",
+ node->id()->latin1(),
+ node->label()->latin1(),
+ node->linkId()->latin1()
+ );
+ IChildNodeIterator *cni = node->children();
+ IChildNode *cn;
+ for (cni->toFirst();(cn=cni->current());cni->toNext())
+ {
+ printf(" + child id=%s label=%s relation=%s\n",
+ cn->node()->id()->latin1(),
+ cn->node()->label()->latin1(),
+ cn->relationString()->latin1()
+ );
+ IEdgeLabelIterator *eli = cn->edgeLabels();
+ IEdgeLabel *el;
+ for (eli->toFirst();(el=eli->current());eli->toNext())
+ {
+ printf(" edgeLabel=%s\n",el->label()->latin1());
+ }
+ eli->release();
+ }
+ cni->release();
+ }
+ ni->release();
+ printf(" --- end graph ----\n");
+
+}
+
+void DumpParamList(IParamIterator *pli,int indent)
+{
+ QString indentStr;
+ indentStr.fill(' ',indent);
+ IParam *par;
+ for (pli->toFirst();(par=pli->current());pli->toNext())
+ {
+ ILinkedTextIterator *lti = par->type();
+ QString parType = linkedTextToString(lti);
+ lti->release();
+ lti = par->defaultValue();
+ QString defVal = linkedTextToString(lti);
+ lti->release();
+ printf("%sParam type=%s decl_name=%s def_name=%s defvalue=%s\n",
+ indentStr.data(), parType.latin1(),
+ par->declarationName()->latin1(),
+ par->definitionName()->latin1(),
+ defVal.latin1());
+ }
+}
+
+int main(int argc,char **argv)
+{
+ if (argc!=2)
+ {
+ printf("Usage: %s xmldir\n",argv[0]);
+ exit(1);
+ }
+
+ IDoxygen *dox = createObjectModel();
+
+ dox->setDebugLevel(4);
+
+ if (!dox->readXMLDir(argv[1]))
+ {
+ printf("Error reading %s/index.xml\n",argv[1]);
+ exit(1);
+ }
+
+ ICompoundIterator *cli = dox->compounds();
+ ICompound *comp;
+ printf("--- compound list ---------\n");
+ for (cli->toFirst();(comp=cli->current());cli->toNext())
+ {
+ printf("Compound name=%s id=%s kind=%s\n",
+ comp->name()->latin1(),comp->id()->latin1(),comp->kindString()->latin1());
+
+ ISectionIterator *sli = comp->sections();
+ ISection *sec;
+ for (sli->toFirst();(sec=sli->current());sli->toNext())
+ {
+ printf(" Section kind=%s\n",sec->kindString()->latin1());
+ IMemberIterator *mli = sec->members();
+ IMember *mem;
+ if( sec->kind() == ISection::UserDefined )
+ {
+ IUserDefined *group = dynamic_cast<IUserDefined*>(sec);
+ printf(" Title=%s\n", group->header()->latin1() );
+ }
+ for (mli->toFirst();(mem=mli->current());mli->toNext())
+ {
+ ILinkedTextIterator *lti = mem->type();
+ printf(" Member type=%s name=%s\n",
+ linkedTextToString(lti).latin1(),mem->name()->latin1());
+ lti->release();
+
+ IParamIterator *pli = mem->parameters();
+ DumpParamList(pli,6);
+ pli->release();
+ IMemberReferenceIterator *mri = mem->references();
+ IMemberReference *mr;
+ for (mri->toFirst();(mr=mri->current());mri->toNext())
+ {
+ IMember *memr = mr->member();
+ printf(" References %s at line %d\n",
+ mr->name()->latin1(),memr->bodyStart());
+ }
+
+ mri->release();
+ mri = mem->referencedBy();
+ for (mri->toFirst();(mr=mri->current());mri->toNext())
+ {
+ IMember *memr = mr->member();
+ printf(" ReferencedBy %s at line %d\n",
+ mr->name()->latin1(),memr->bodyStart());
+ }
+ mri->release();
+
+ if (mem->kind()==IMember::Enum) // we have found an enum
+ {
+ IEnum *e = dynamic_cast<IEnum*>(mem);
+ IMemberIterator *evi = e->enumValues(); // get the enum values
+ IMember *mev;
+ for (evi->toFirst();(mev=evi->current());evi->toNext())
+ {
+ IEnumValue *ev = dynamic_cast<IEnumValue*>(mev);
+ ILinkedTextIterator *lti = ev->initializer();
+ QString init = linkedTextToString(lti);
+ lti->release();
+ printf(" Enum value `%s' init=`%s'\n",
+ ev->name()->latin1(),init.latin1());
+ }
+ evi->release();
+ }
+
+ pli = mem->templateParameters();
+ if (pli)
+ {
+ printf(" Template parameters\n");
+ DumpParamList(pli,8);
+ pli->release();
+ }
+
+ IDoc *doc = mem->briefDescription();
+ if (doc)
+ {
+ printf("===== brief description ==== \n");
+ DumpDoc(doc,0);
+ }
+
+ doc = mem->detailedDescription();
+ if (doc)
+ {
+ printf("===== detailed description ==== \n");
+ DumpDoc(doc,0);
+ }
+ }
+ mli->release();
+ }
+ sli->release();
+
+ IDoc *doc = comp->briefDescription();
+ if (doc)
+ {
+ printf("===== brief description ==== \n");
+ DumpDoc(doc,0);
+ }
+
+ doc = comp->detailedDescription();
+ if (doc)
+ {
+ printf("===== detailed description ==== \n");
+ DumpDoc(doc,0);
+ }
+
+ if (comp->kind()==ICompound::Class)
+ {
+ IClass *cls = dynamic_cast<IClass*>(comp);
+ ASSERT(cls!=0);
+
+ printf("==== inheritance graph ==== \n");
+ DumpGraph(cls->inheritanceGraph());
+
+ printf("==== collabration graph ==== \n");
+ DumpGraph(cls->collaborationGraph());
+
+ printf("==== base classes ==== \n");
+ IRelatedCompoundIterator *bcli = cls->baseCompounds();
+ IRelatedCompound *bClass;
+ for (bcli->toFirst();(bClass=bcli->current());bcli->toNext())
+ {
+ ICompound *bc = bClass->compound();
+ printf(" + class %s\n",bc->name()->latin1());
+ bc->release();
+ }
+ bcli->release();
+
+ printf("==== derived classes ==== \n");
+ IRelatedCompoundIterator *dcli = cls->derivedCompounds();
+ IRelatedCompound *dClass;
+ for (dcli->toFirst();(dClass=dcli->current());dcli->toNext())
+ {
+ ICompound *dc = dClass->compound();
+ printf(" + class %s\n",dc->name()->latin1());
+ dc->release();
+ }
+ dcli->release();
+ }
+ else if (comp->kind()==ICompound::File)
+ {
+ IFile *file = dynamic_cast<IFile*>(comp);
+ ASSERT(file!=0);
+
+ printf("==== include dependency graph ==== \n");
+ DumpGraph(file->includeDependencyGraph());
+
+ printf("==== included by dependency graph ==== \n");
+ DumpGraph(file->includedByDependencyGraph());
+
+ printf("==== source ====\n");
+ DumpDoc(file->source(),0);
+ }
+
+ comp->release();
+ }
+ cli->release();
+ printf("---------------------------\n");
+
+ dox->release();
+
+ return 0;
+}
+
diff --git a/addon/doxmlparser/test/xmlparse.pro b/addon/doxmlparser/test/xmlparse.pro
new file mode 100644
index 0000000..48de0e8
--- /dev/null
+++ b/addon/doxmlparser/test/xmlparse.pro
@@ -0,0 +1,25 @@
+#
+# This file was generated from xmlparse.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+TEMPLATE = app.t
+CONFIG = console warn_on debug
+HEADERS =
+SOURCES = main.cpp
+unix:LIBS += -L../../../lib -L../lib -ldoxmlparser -lqtools
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../../../lib -L../lib -ldoxmlparser -lqtools
+win32-msvc:LIBS += doxmlparser.lib qtools.lib shell32.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\..\..\lib;..\lib
+win32-borland:LIBS += doxmlparser.lib qtools.lib shell32.lib
+win32-borland:TMAKE_LFLAGS += -L..\..\..\lib -L..\lib
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+DESTDIR =
+OBJECTS_DIR = ../objects
+TARGET = xmlparse
+INCLUDEPATH += ../../../qtools ../include
+DEPENDPATH += ../include
+unix:TARGETDEPS = ../lib/libdoxmlparser.a
+win32:TARGETDEPS = ..\lib\doxmlparser.lib
+
+TMAKE_MOC = /usr/bin/moc
diff --git a/addon/doxmlparser/test/xmlparse.pro.in b/addon/doxmlparser/test/xmlparse.pro.in
new file mode 100644
index 0000000..cfb95be
--- /dev/null
+++ b/addon/doxmlparser/test/xmlparse.pro.in
@@ -0,0 +1,20 @@
+TEMPLATE = app.t
+CONFIG = console warn_on $extraopts
+HEADERS =
+SOURCES = main.cpp
+unix:LIBS += -L../../../lib -L../lib -ldoxmlparser -lqtools
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../../../lib -L../lib -ldoxmlparser -lqtools
+win32-msvc:LIBS += doxmlparser.lib qtools.lib shell32.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\..\..\lib;..\lib
+win32-borland:LIBS += doxmlparser.lib qtools.lib shell32.lib
+win32-borland:TMAKE_LFLAGS += -L..\..\..\lib -L..\lib
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+DESTDIR =
+OBJECTS_DIR = ../objects
+TARGET = xmlparse
+INCLUDEPATH += ../../../qtools ../include
+DEPENDPATH += ../include
+unix:TARGETDEPS = ../lib/libdoxmlparser.a
+win32:TARGETDEPS = ..\lib\doxmlparser.lib
+
diff --git a/addon/doxyapp/Makefile.in b/addon/doxyapp/Makefile.in
new file mode 100644
index 0000000..c5acd67
--- /dev/null
+++ b/addon/doxyapp/Makefile.in
@@ -0,0 +1,17 @@
+
+all clean depend distclean: Makefile.doxyapp
+ $(MAKE) -f Makefile.doxyapp $@
+
+distclean: clean
+ $(RM) -rf Makefile doxyapp.pro Makefile.doxyapp
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) doxyapp.pro >Makefile.doxyapp
+
+strip:
+ strip doxyapp
+
+Makefile.doxyapp: doxyapp.pro
+ $(ENV) $(PERL) $(TMAKE) doxyapp.pro >Makefile.doxyapp
+
+install:
diff --git a/addon/doxyapp/README b/addon/doxyapp/README
new file mode 100644
index 0000000..f92e106
--- /dev/null
+++ b/addon/doxyapp/README
@@ -0,0 +1,8 @@
+This directory contains an example of how to use doxygen as
+an "source parsing engine" in an application. It shows how to configure doxygen
+from the application and shows how to run doxygen without generating output,
+and then uses the information about the symbols found in the source code.
+
+Note that if you use this approach your application should be licensed under the GPL.
+
+
diff --git a/addon/doxyapp/doxyapp.cpp b/addon/doxyapp/doxyapp.cpp
new file mode 100644
index 0000000..c6b7ed4
--- /dev/null
+++ b/addon/doxyapp/doxyapp.cpp
@@ -0,0 +1,314 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2006 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/** @file
+ * @brief Example of how to use doxygen as part of another GPL applications
+ *
+ * This example shows how to configure and run doxygen programmatically from
+ * within an application without generating the usual output.
+ * The example should work on any Unix like OS (including Linux and Mac OS X).
+ *
+ * This example shows how to use to code parser to get cross-references information
+ * and it also shows how to look up symbols in a program parsed by doxygen and
+ * show some information about them.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include "doxygen.h"
+#include "outputgen.h"
+#include "parserintf.h"
+
+class XRefDummyCodeGenerator : public CodeOutputInterface
+{
+ public:
+ XRefDummyCodeGenerator(FileDef *fd) : m_fd(fd) {}
+ ~XRefDummyCodeGenerator() {}
+
+ // these are just null functions, they can be used to produce a syntax highlighted
+ // and cross-linked version of the source code, but who needs that anyway ;-)
+ void codify(const char *) {}
+ void writeCodeLink(const char *,const char *,const char *,const char *,const char *) {}
+ void startCodeLine() {}
+ void endCodeLine() {}
+ void startCodeAnchor(const char *) {}
+ void endCodeAnchor() {}
+ void startFontClass(const char *) {}
+ void endFontClass() {}
+ void writeCodeAnchor(const char *) {}
+ void writeLineNumber(const char *,const char *,const char *,int) {}
+
+ // here we are presented with the symbols found by the code parser
+ void linkableSymbol(int l, const char *sym,Definition *symDef,Definition *context)
+ {
+ QCString ctx;
+ if (context) // the context of the symbol is known
+ {
+ if (context->definitionType()==Definition::TypeMember) // it is inside a member
+ {
+ Definition *parentContext = context->getOuterScope();
+ if (parentContext && parentContext->definitionType()==Definition::TypeClass)
+ // it is inside a member of a class
+ {
+ ctx.sprintf("inside %s %s of %s %s",
+ ((MemberDef *)context)->memberTypeName().data(),
+ context->name().data(),
+ ((ClassDef*)parentContext)->compoundTypeString().data(),
+ parentContext->name().data());
+ }
+ else if (parentContext==Doxygen::globalScope) // it is inside a global member
+ {
+ ctx.sprintf("inside %s %s",
+ ((MemberDef *)context)->memberTypeName().data(),
+ context->name().data());
+ }
+ }
+ if (ctx.isEmpty()) // it is something else (class, or namespace member, ...)
+ {
+ ctx.sprintf("in %s",context->name().data());
+ }
+ }
+ printf("Found symbol %s at line %d of %s %s\n",
+ sym,l,m_fd->getDefFileName().data(),ctx.data());
+ if (symDef && context) // in this case the definition of the symbol is
+ // known to doxygen.
+ {
+ printf("-> defined at line %d of %s\n",
+ symDef->getDefLine(),symDef->getDefFileName().data());
+ }
+ }
+ private:
+ FileDef *m_fd;
+};
+
+static void findXRefSymbols(FileDef *fd)
+{
+ // get the interface to a parser that matches the file extension
+ ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
+
+ // reset the parsers state
+ pIntf->resetCodeParserState();
+
+ // create a new backend object
+ XRefDummyCodeGenerator *xrefGen = new XRefDummyCodeGenerator(fd);
+
+ // parse the source code
+ pIntf->parseCode(*xrefGen,
+ 0,
+ fileToString(fd->absFilePath()),
+ FALSE,
+ 0,
+ fd);
+
+ // dismiss the object.
+ delete xrefGen;
+}
+
+static void listSymbol(Definition *d)
+{
+ if (d!=Doxygen::globalScope && // skip the global namespace symbol
+ d->name().at(0)!='@' // skip anonymous stuff
+ )
+ {
+ printf("%s\n",
+ d->name().data());
+ }
+}
+
+static void listSymbols()
+{
+ QDictIterator<DefinitionIntf> sli(*Doxygen::symbolMap);
+ DefinitionIntf *di;
+ for (sli.toFirst();(di=sli.current());++sli)
+ {
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
+ // with same name
+ {
+ DefinitionListIterator dli(*(DefinitionList*)di);
+ Definition *d;
+ // for each symbol
+ for (dli.toFirst();(d=dli.current());++dli)
+ {
+ listSymbol(d);
+ }
+ }
+ else // single symbol
+ {
+ listSymbol((Definition*)di);
+ }
+ }
+}
+
+static void lookupSymbol(Definition *d)
+{
+ if (d!=Doxygen::globalScope && // skip the global namespace symbol
+ d->name().at(0)!='@' // skip anonymous stuff
+ )
+ {
+ printf("Symbol info\n");
+ printf("-----------\n");
+ printf("Name: %s\n",d->name().data());
+ printf("File: %s\n",d->getDefFileName().data());
+ printf("Line: %d\n",d->getDefLine());
+ // depending on the definition type we can case to the appropriate
+ // derived to get additional information
+ switch (d->definitionType())
+ {
+ case Definition::TypeClass:
+ {
+ ClassDef *cd = (ClassDef *)d;
+ printf("Kind: %s\n",cd->compoundTypeString().data());
+ }
+ break;
+ case Definition::TypeFile:
+ {
+ FileDef *fd = (FileDef *)d;
+ printf("Kind: File: #includes %d other files\n",
+ fd->includeFileList() ? fd->includeFileList()->count() : 0);
+ }
+ break;
+ case Definition::TypeNamespace:
+ {
+ NamespaceDef *nd = (NamespaceDef *)d;
+ printf("Kind: Namespace: contains %d classes and %d namespaces\n",
+ nd->getClassSDict() ? nd->getClassSDict()->count() : 0,
+ nd->getNamespaceSDict() ? nd->getNamespaceSDict()->count() : 0);
+ }
+ break;
+ case Definition::TypeMember:
+ {
+ MemberDef *md = (MemberDef *)d;
+ printf("Kind: %s\n",md->memberTypeName().data());
+ }
+ break;
+ default:
+ // ignore groups/pages/packages/dirs for now
+ break;
+ }
+ }
+}
+
+static void lookupSymbols(const QCString &sym)
+{
+ if (!sym.isEmpty())
+ {
+ DefinitionIntf *di = Doxygen::symbolMap->find(sym);
+ if (di)
+ {
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList)
+ {
+ DefinitionListIterator dli(*(DefinitionList*)di);
+ Definition *d;
+ // for each symbol with the given name
+ for (dli.toFirst();(d=dli.current());++dli)
+ {
+ lookupSymbol(d);
+ }
+ }
+ else
+ {
+ lookupSymbol((Definition*)di);
+ }
+ }
+ else
+ {
+ printf("Unknown symbol\n");
+ }
+ }
+}
+
+int main(int argc,char **argv)
+{
+ char cmd[256];
+
+ if (argc<2)
+ {
+ printf("Usage: %s [source_file | source_dir]\n",argv[0]);
+ exit(1);
+ }
+
+ // initialize data structures
+ initDoxygen();
+
+ // setup the non-default configuration options
+
+ // we need a place to put intermediate files
+ Config_getString("OUTPUT_DIRECTORY")="/tmp/doxygen";
+ // disable html output
+ Config_getBool("GENERATE_HTML")=FALSE;
+ // disable latex output
+ Config_getBool("GENERATE_LATEX")=FALSE;
+ // be quiet
+ Config_getBool("QUIET")=TRUE;
+ // turn off warnings
+ Config_getBool("WARNINGS")=FALSE;
+ Config_getBool("WARN_IF_UNDOCUMENTED")=FALSE;
+ Config_getBool("WARN_IF_DOC_ERROR")=FALSE;
+ // Extract as much as possible
+ Config_getBool("EXTRACT_ALL")=TRUE;
+ Config_getBool("EXTRACT_STATIC")=TRUE;
+ Config_getBool("EXTRACT_PRIVATE")=TRUE;
+ Config_getBool("EXTRACT_LOCAL_METHODS")=TRUE;
+ // Extract source browse information, needed
+ // to make doxygen gather the cross reference info
+ Config_getBool("SOURCE_BROWSER")=TRUE;
+
+ // set the input
+ Config_getList("INPUT").append(argv[1]);
+
+ // check and finialize the configuration
+ checkConfiguration();
+ adjustConfiguration();
+
+ // parse the files
+ parseInput();
+
+ // iterate over the input files
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ // foreach file with a certain name
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ // for each file definition
+ for (;(fd=fni.current());++fni)
+ {
+ // get the references (linked and unlinked) found in this file
+ findXRefSymbols(fd);
+ }
+ }
+
+ // remove temporary files
+ if (!Doxygen::objDBFileName.isEmpty()) unlink(Doxygen::objDBFileName);
+ if (!Doxygen::entryDBFileName.isEmpty()) unlink(Doxygen::entryDBFileName);
+ // clean up after us
+ rmdir("/tmp/doxygen");
+
+ while (1)
+ {
+ printf("> Type a symbol name or\n> .list for a list of symbols or\n> .quit to exit\n> ");
+ fgets(cmd,256,stdin);
+ QCString s(cmd);
+ if (s.at(s.length()-1)=='\n') s=s.left(s.length()-1); // strip trailing \n
+ if (s==".list")
+ listSymbols();
+ else if (s==".quit")
+ exit(0);
+ else
+ lookupSymbols(s);
+ }
+}
+
diff --git a/addon/doxyapp/doxyapp.pro.in b/addon/doxyapp/doxyapp.pro.in
new file mode 100644
index 0000000..68fea3d
--- /dev/null
+++ b/addon/doxyapp/doxyapp.pro.in
@@ -0,0 +1,12 @@
+TEMPLATE = app.t
+CONFIG = console warn_on debug
+HEADERS =
+SOURCES = doxyapp.cpp
+LIBS += -L../../lib -L../../lib -ldoxygen -lqtools -lmd5 -ldoxycfg -lpng
+DESTDIR =
+OBJECTS_DIR = ../../objects
+TARGET = ../../bin/doxyapp
+INCLUDEPATH += ../../qtools ../../src
+DEPENDPATH += ../../src
+TARGETDEPS = ../../lib/libdoxygen.a
+
diff --git a/addon/doxywizard/Makefile b/addon/doxywizard/Makefile
new file mode 100644
index 0000000..c7faeac
--- /dev/null
+++ b/addon/doxywizard/Makefile
@@ -0,0 +1,59 @@
+#
+# This file was generated from Makefile.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+DOXYGEN = /Users/dimitri/doxygen
+TMAKEPATH = /Users/dimitri/doxygen/tmake/lib/macosx-c++
+ENV = env TMAKEPATH=$(TMAKEPATH)
+TMAKE = /Users/dimitri/doxygen/tmake/bin/tmake
+MAKE = /opt/local/bin/gmake
+PERL = /opt/local/bin/perl
+RM = rm -f
+CP = cp
+VERSION = 1.7.3
+INSTALL = /usr/local
+INSTTOOL = /opt/local/bin/ginstall
+DOXYDOCS = ..
+DOCDIR = $(INSTALL)/share/doc/packages/doxygen
+QTDIR = /usr
+HAVE_DOT = /usr/local/bin/dot
+MKSPECS = -spec macx-g++
+#
+#
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+
+QMAKE=qmake $(MKSPECS)
+
+all: Makefile.doxywizard
+ $(MAKE) -f Makefile.doxywizard
+
+Makefile.doxywizard: doxywizard.pro
+ $(QMAKE) doxywizard.pro -o Makefile.doxywizard
+
+qmake:
+ $(QMAKE) doxywizard.pro -o Makefile.doxywizard
+
+clean: Makefile.doxywizard
+ $(MAKE) -f Makefile.doxywizard clean
+
+distclean: Makefile.doxywizard
+ $(MAKE) -f Makefile.doxywizard distclean
+ $(RM) Makefile.doxywizard
+
+install:
+ $(INSTTOOL) -d $(INSTALL)/bin
+ $(INSTTOOL) -m 755 ../../bin/doxywizard $(INSTALL)/bin
+ $(INSTTOOL) -d $(INSTALL)/$(MAN1DIR)
+ cat ../../doc/doxywizard.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > doxywizard.1
+ $(INSTTOOL) -m 644 doxywizard.1 $(INSTALL)/$(MAN1DIR)/doxywizard.1
+ rm doxywizard.1
+
+FORCE:
diff --git a/addon/doxywizard/Makefile.doxywizard b/addon/doxywizard/Makefile.doxywizard
new file mode 100644
index 0000000..dca1efa
--- /dev/null
+++ b/addon/doxywizard/Makefile.doxywizard
@@ -0,0 +1,408 @@
+#############################################################################
+# Makefile for building: ../../bin/doxywizard.app/Contents/MacOS/doxywizard
+# Generated by qmake (2.01a) (Qt 4.6.2) on: Mon Mar 28 15:12:43 2011
+# Project: doxywizard.pro
+# Template: app
+# Command: /usr/bin/qmake -spec /usr/local/Qt4.6/mkspecs/macx-g++ -macx -o Makefile.doxywizard doxywizard.pro
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = gcc
+CXX = g++
+DEFINES = -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
+CFLAGS = -pipe -g -gdwarf-2 -arch i386 -arch ppc -Wall -W $(DEFINES)
+CXXFLAGS = -pipe -g -gdwarf-2 -arch i386 -arch ppc -Wall -W $(DEFINES)
+INCPATH = -I/usr/local/Qt4.6/mkspecs/macx-g++ -I. -I/Library/Frameworks/QtCore.framework/Versions/4/Headers -I/usr/include/QtCore -I/Library/Frameworks/QtGui.framework/Versions/4/Headers -I/usr/include/QtGui -I/Library/Frameworks/QtXml.framework/Versions/4/Headers -I/usr/include/QtXml -I/usr/include -I. -Imoc -F/Library/Frameworks
+LINK = g++
+LFLAGS = -headerpad_max_install_names -arch i386 -arch ppc
+LIBS = $(SUBLIBS) -F/Library/Frameworks -L/Library/Frameworks -framework QtXml -framework QtGui -framework QtCore
+AR = ar cq
+RANLIB = ranlib -s
+QMAKE = /usr/bin/qmake
+TAR = tar -cf
+COMPRESS = gzip -9f
+COPY = cp -f
+SED = sed
+COPY_FILE = cp -f
+COPY_DIR = cp -f -R
+STRIP =
+INSTALL_FILE = $(COPY_FILE)
+INSTALL_DIR = $(COPY_DIR)
+INSTALL_PROGRAM = $(COPY_FILE)
+DEL_FILE = rm -f
+SYMLINK = ln -f -s
+DEL_DIR = rmdir
+MOVE = mv -f
+CHK_DIR_EXISTS= test -d
+MKDIR = mkdir -p
+export MACOSX_DEPLOYMENT_TARGET = 10.4
+
+####### Output directory
+
+OBJECTS_DIR = obj/
+
+####### Files
+
+SOURCES = doxywizard.cpp \
+ ../../src/version.cpp \
+ expert.cpp \
+ wizard.cpp \
+ inputbool.cpp \
+ inputstring.cpp \
+ inputint.cpp \
+ inputstrlist.cpp moc/moc_doxywizard.cpp \
+ moc/moc_expert.cpp \
+ moc/moc_helplabel.cpp \
+ moc/moc_inputbool.cpp \
+ moc/moc_inputstring.cpp \
+ moc/moc_inputint.cpp \
+ moc/moc_inputstrlist.cpp \
+ moc/moc_wizard.cpp \
+ rcc/qrc_doxywizard.cpp \
+ config_lex.cpp
+OBJECTS = obj/doxywizard.o \
+ obj/version.o \
+ obj/expert.o \
+ obj/wizard.o \
+ obj/inputbool.o \
+ obj/inputstring.o \
+ obj/inputint.o \
+ obj/inputstrlist.o \
+ obj/moc_doxywizard.o \
+ obj/moc_expert.o \
+ obj/moc_helplabel.o \
+ obj/moc_inputbool.o \
+ obj/moc_inputstring.o \
+ obj/moc_inputint.o \
+ obj/moc_inputstrlist.o \
+ obj/moc_wizard.o \
+ obj/qrc_doxywizard.o \
+ obj/config_lex.o
+DIST = /usr/local/Qt4.6/mkspecs/common/unix.conf \
+ /usr/local/Qt4.6/mkspecs/common/mac.conf \
+ /usr/local/Qt4.6/mkspecs/common/mac-g++.conf \
+ /usr/local/Qt4.6/mkspecs/qconfig.pri \
+ /usr/local/Qt4.6/mkspecs/features/qt_functions.prf \
+ /usr/local/Qt4.6/mkspecs/features/qt_config.prf \
+ /usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf \
+ /usr/local/Qt4.6/mkspecs/features/default_pre.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/dwarf2.prf \
+ /usr/local/Qt4.6/mkspecs/features/debug.prf \
+ /usr/local/Qt4.6/mkspecs/features/default_post.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/default_post.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/x86.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/ppc.prf \
+ /usr/local/Qt4.6/mkspecs/features/warn_on.prf \
+ /usr/local/Qt4.6/mkspecs/features/qt.prf \
+ /usr/local/Qt4.6/mkspecs/features/unix/thread.prf \
+ /usr/local/Qt4.6/mkspecs/features/moc.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/rez.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/sdk.prf \
+ /usr/local/Qt4.6/mkspecs/features/resources.prf \
+ /usr/local/Qt4.6/mkspecs/features/uic.prf \
+ /usr/local/Qt4.6/mkspecs/features/yacc.prf \
+ /usr/local/Qt4.6/mkspecs/features/lex.prf \
+ /usr/local/Qt4.6/mkspecs/features/include_source_dir.prf \
+ doxywizard.pro
+QMAKE_TARGET = doxywizard
+DESTDIR = ../../bin/
+TARGET = ../../bin/doxywizard.app/Contents/MacOS/doxywizard
+
+####### Custom Compiler Variables
+QMAKE_COMP_QMAKE_OBJECTIVE_CFLAGS = -pipe \
+ -g \
+ -gdwarf-2 \
+ -arch \
+ i386 \
+ -arch \
+ ppc \
+ -Wall \
+ -W
+
+
+first: all
+####### Implicit rules
+
+.SUFFIXES: .o .c .cpp .cc .cxx .C
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
+
+####### Build rules
+
+all: Makefile.doxywizard ../../bin/doxywizard.app/Contents/PkgInfo ../../bin/doxywizard.app/Contents/Resources/empty.lproj ../../bin/doxywizard.app/Contents/Info.plist $(TARGET)
+
+$(TARGET): $(OBJECTS)
+ @$(CHK_DIR_EXISTS) ../../bin/doxywizard.app/Contents/MacOS/ || $(MKDIR) ../../bin/doxywizard.app/Contents/MacOS/
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
+
+Makefile.doxywizard: doxywizard.pro /usr/local/Qt4.6/mkspecs/macx-g++/qmake.conf /usr/local/Qt4.6/mkspecs/common/unix.conf \
+ /usr/local/Qt4.6/mkspecs/common/mac.conf \
+ /usr/local/Qt4.6/mkspecs/common/mac-g++.conf \
+ /usr/local/Qt4.6/mkspecs/qconfig.pri \
+ /usr/local/Qt4.6/mkspecs/features/qt_functions.prf \
+ /usr/local/Qt4.6/mkspecs/features/qt_config.prf \
+ /usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf \
+ /usr/local/Qt4.6/mkspecs/features/default_pre.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/dwarf2.prf \
+ /usr/local/Qt4.6/mkspecs/features/debug.prf \
+ /usr/local/Qt4.6/mkspecs/features/default_post.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/default_post.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/x86.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/ppc.prf \
+ /usr/local/Qt4.6/mkspecs/features/warn_on.prf \
+ /usr/local/Qt4.6/mkspecs/features/qt.prf \
+ /usr/local/Qt4.6/mkspecs/features/unix/thread.prf \
+ /usr/local/Qt4.6/mkspecs/features/moc.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/rez.prf \
+ /usr/local/Qt4.6/mkspecs/features/mac/sdk.prf \
+ /usr/local/Qt4.6/mkspecs/features/resources.prf \
+ /usr/local/Qt4.6/mkspecs/features/uic.prf \
+ /usr/local/Qt4.6/mkspecs/features/yacc.prf \
+ /usr/local/Qt4.6/mkspecs/features/lex.prf \
+ /usr/local/Qt4.6/mkspecs/features/include_source_dir.prf \
+ /Library/Frameworks/QtXml.framework/QtXml.prl \
+ /Library/Frameworks/QtCore.framework/QtCore.prl \
+ /Library/Frameworks/QtGui.framework/QtGui.prl
+ $(QMAKE) -spec /usr/local/Qt4.6/mkspecs/macx-g++ -macx -o Makefile.doxywizard doxywizard.pro
+/usr/local/Qt4.6/mkspecs/common/unix.conf:
+/usr/local/Qt4.6/mkspecs/common/mac.conf:
+/usr/local/Qt4.6/mkspecs/common/mac-g++.conf:
+/usr/local/Qt4.6/mkspecs/qconfig.pri:
+/usr/local/Qt4.6/mkspecs/features/qt_functions.prf:
+/usr/local/Qt4.6/mkspecs/features/qt_config.prf:
+/usr/local/Qt4.6/mkspecs/features/exclusive_builds.prf:
+/usr/local/Qt4.6/mkspecs/features/default_pre.prf:
+/usr/local/Qt4.6/mkspecs/features/mac/default_pre.prf:
+/usr/local/Qt4.6/mkspecs/features/mac/dwarf2.prf:
+/usr/local/Qt4.6/mkspecs/features/debug.prf:
+/usr/local/Qt4.6/mkspecs/features/default_post.prf:
+/usr/local/Qt4.6/mkspecs/features/mac/default_post.prf:
+/usr/local/Qt4.6/mkspecs/features/mac/x86.prf:
+/usr/local/Qt4.6/mkspecs/features/mac/objective_c.prf:
+/usr/local/Qt4.6/mkspecs/features/mac/ppc.prf:
+/usr/local/Qt4.6/mkspecs/features/warn_on.prf:
+/usr/local/Qt4.6/mkspecs/features/qt.prf:
+/usr/local/Qt4.6/mkspecs/features/unix/thread.prf:
+/usr/local/Qt4.6/mkspecs/features/moc.prf:
+/usr/local/Qt4.6/mkspecs/features/mac/rez.prf:
+/usr/local/Qt4.6/mkspecs/features/mac/sdk.prf:
+/usr/local/Qt4.6/mkspecs/features/resources.prf:
+/usr/local/Qt4.6/mkspecs/features/uic.prf:
+/usr/local/Qt4.6/mkspecs/features/yacc.prf:
+/usr/local/Qt4.6/mkspecs/features/lex.prf:
+/usr/local/Qt4.6/mkspecs/features/include_source_dir.prf:
+/Library/Frameworks/QtXml.framework/QtXml.prl:
+/Library/Frameworks/QtCore.framework/QtCore.prl:
+/Library/Frameworks/QtGui.framework/QtGui.prl:
+qmake: FORCE
+ @$(QMAKE) -spec /usr/local/Qt4.6/mkspecs/macx-g++ -macx -o Makefile.doxywizard doxywizard.pro
+
+../../bin/doxywizard.app/Contents/PkgInfo:
+ @$(CHK_DIR_EXISTS) ../../bin/doxywizard.app/Contents || $(MKDIR) ../../bin/doxywizard.app/Contents
+ @$(DEL_FILE) ../../bin/doxywizard.app/Contents/PkgInfo
+ @echo "APPL????" >../../bin/doxywizard.app/Contents/PkgInfo
+../../bin/doxywizard.app/Contents/Resources/empty.lproj:
+ @$(CHK_DIR_EXISTS) ../../bin/doxywizard.app/Contents/Resources || $(MKDIR) ../../bin/doxywizard.app/Contents/Resources
+ @touch ../../bin/doxywizard.app/Contents/Resources/empty.lproj
+
+../../bin/doxywizard.app/Contents/Info.plist:
+ @$(CHK_DIR_EXISTS) ../../bin/doxywizard.app/Contents || $(MKDIR) ../../bin/doxywizard.app/Contents
+ @$(DEL_FILE) ../../bin/doxywizard.app/Contents/Info.plist
+ @sed -e "s,@ICON@,,g" -e "s,@EXECUTABLE@,doxywizard,g" -e "s,@TYPEINFO@,????,g" /usr/local/Qt4.6/mkspecs/macx-g++/Info.plist.app >../../bin/doxywizard.app/Contents/Info.plist
+dist:
+ @$(CHK_DIR_EXISTS) obj/doxywizard1.0.0 || $(MKDIR) obj/doxywizard1.0.0
+ $(COPY_FILE) --parents $(SOURCES) $(DIST) obj/doxywizard1.0.0/ && $(COPY_FILE) --parents doxywizard.h version.h expert.h config.h helplabel.h inputbool.h inputstring.h inputint.h inputstrlist.h wizard.h obj/doxywizard1.0.0/ && $(COPY_FILE) --parents doxywizard.qrc obj/doxywizard1.0.0/ && $(COPY_FILE) --parents doxywizard.cpp ../../src/version.cpp expert.cpp wizard.cpp inputbool.cpp inputstring.cpp inputint.cpp inputstrlist.cpp obj/doxywizard1.0.0/ && $(COPY_FILE) --parents config.l obj/doxywizard1.0.0/ && (cd `dirname obj/doxywizard1.0.0` && $(TAR) doxywizard1.0.0.tar doxywizard1.0.0 && $(COMPRESS) doxywizard1.0.0.tar) && $(MOVE) `dirname obj/doxywizard1.0.0`/doxywizard1.0.0.tar.gz . && $(DEL_FILE) -r obj/doxywizard1.0.0
+
+
+clean:compiler_clean
+ -$(DEL_FILE) $(OBJECTS)
+ -$(DEL_FILE) *~ core *.core
+
+
+####### Sub-libraries
+
+distclean: clean
+ -$(DEL_FILE) -r ../../bin/doxywizard.app
+ -$(DEL_FILE) Makefile.doxywizard
+
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+compiler_objective_c_make_all:
+compiler_objective_c_clean:
+compiler_moc_header_make_all: moc/moc_doxywizard.cpp moc/moc_expert.cpp moc/moc_helplabel.cpp moc/moc_inputbool.cpp moc/moc_inputstring.cpp moc/moc_inputint.cpp moc/moc_inputstrlist.cpp moc/moc_wizard.cpp
+compiler_moc_header_clean:
+ -$(DEL_FILE) moc/moc_doxywizard.cpp moc/moc_expert.cpp moc/moc_helplabel.cpp moc/moc_inputbool.cpp moc/moc_inputstring.cpp moc/moc_inputint.cpp moc/moc_inputstrlist.cpp moc/moc_wizard.cpp
+moc/moc_doxywizard.cpp: doxywizard.h
+ /usr/bin/moc $(DEFINES) $(INCPATH) -D__APPLE__ -D__GNUC__ doxywizard.h -o moc/moc_doxywizard.cpp
+
+moc/moc_expert.cpp: expert.h
+ /usr/bin/moc $(DEFINES) $(INCPATH) -D__APPLE__ -D__GNUC__ expert.h -o moc/moc_expert.cpp
+
+moc/moc_helplabel.cpp: helplabel.h
+ /usr/bin/moc $(DEFINES) $(INCPATH) -D__APPLE__ -D__GNUC__ helplabel.h -o moc/moc_helplabel.cpp
+
+moc/moc_inputbool.cpp: input.h \
+ inputbool.h
+ /usr/bin/moc $(DEFINES) $(INCPATH) -D__APPLE__ -D__GNUC__ inputbool.h -o moc/moc_inputbool.cpp
+
+moc/moc_inputstring.cpp: input.h \
+ inputstring.h
+ /usr/bin/moc $(DEFINES) $(INCPATH) -D__APPLE__ -D__GNUC__ inputstring.h -o moc/moc_inputstring.cpp
+
+moc/moc_inputint.cpp: input.h \
+ inputint.h
+ /usr/bin/moc $(DEFINES) $(INCPATH) -D__APPLE__ -D__GNUC__ inputint.h -o moc/moc_inputint.cpp
+
+moc/moc_inputstrlist.cpp: input.h \
+ inputstrlist.h
+ /usr/bin/moc $(DEFINES) $(INCPATH) -D__APPLE__ -D__GNUC__ inputstrlist.h -o moc/moc_inputstrlist.cpp
+
+moc/moc_wizard.cpp: wizard.h
+ /usr/bin/moc $(DEFINES) $(INCPATH) -D__APPLE__ -D__GNUC__ wizard.h -o moc/moc_wizard.cpp
+
+compiler_rcc_make_all: rcc/qrc_doxywizard.cpp
+compiler_rcc_clean:
+ -$(DEL_FILE) rcc/qrc_doxywizard.cpp
+rcc/qrc_doxywizard.cpp: doxywizard.qrc \
+ ../../src/config.xml \
+ images/file.png \
+ images/add.png \
+ images/folder.png \
+ images/refresh.png \
+ images/tunecolor.png \
+ images/del.png
+ /Developer/Tools/Qt/rcc -name doxywizard doxywizard.qrc -o rcc/qrc_doxywizard.cpp
+
+compiler_image_collection_make_all: qmake_image_collection.cpp
+compiler_image_collection_clean:
+ -$(DEL_FILE) qmake_image_collection.cpp
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_rez_source_make_all:
+compiler_rez_source_clean:
+compiler_uic_make_all:
+compiler_uic_clean:
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all: config_lex.cpp
+compiler_lex_clean:
+ -$(DEL_FILE) config_lex.cpp
+config_lex.cpp: config.l
+ flex -Pconfig config.l
+ rm -f config_lex.cpp
+ mv -f lex.config.c config_lex.cpp
+
+
+compiler_clean: compiler_moc_header_clean compiler_rcc_clean compiler_lex_clean
+
+####### Compile
+
+obj/doxywizard.o: doxywizard.cpp doxywizard.h \
+ version.h \
+ expert.h \
+ wizard.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/doxywizard.o doxywizard.cpp
+
+obj/version.o: ../../src/version.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/version.o ../../src/version.cpp
+
+obj/expert.o: expert.cpp expert.h \
+ inputbool.h \
+ input.h \
+ inputstring.h \
+ inputint.h \
+ inputstrlist.h \
+ config.h \
+ version.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/expert.o expert.cpp
+
+obj/wizard.o: wizard.cpp wizard.h \
+ input.h \
+ doxywizard.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/wizard.o wizard.cpp
+
+obj/inputbool.o: inputbool.cpp inputbool.h \
+ input.h \
+ helplabel.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/inputbool.o inputbool.cpp
+
+obj/inputstring.o: inputstring.cpp inputstring.h \
+ input.h \
+ helplabel.h \
+ doxywizard.h \
+ config.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/inputstring.o inputstring.cpp
+
+obj/inputint.o: inputint.cpp inputint.h \
+ input.h \
+ helplabel.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/inputint.o inputint.cpp
+
+obj/inputstrlist.o: inputstrlist.cpp inputstrlist.h \
+ input.h \
+ helplabel.h \
+ doxywizard.h \
+ config.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/inputstrlist.o inputstrlist.cpp
+
+obj/moc_doxywizard.o: moc/moc_doxywizard.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_doxywizard.o moc/moc_doxywizard.cpp
+
+obj/moc_expert.o: moc/moc_expert.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_expert.o moc/moc_expert.cpp
+
+obj/moc_helplabel.o: moc/moc_helplabel.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_helplabel.o moc/moc_helplabel.cpp
+
+obj/moc_inputbool.o: moc/moc_inputbool.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_inputbool.o moc/moc_inputbool.cpp
+
+obj/moc_inputstring.o: moc/moc_inputstring.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_inputstring.o moc/moc_inputstring.cpp
+
+obj/moc_inputint.o: moc/moc_inputint.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_inputint.o moc/moc_inputint.cpp
+
+obj/moc_inputstrlist.o: moc/moc_inputstrlist.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_inputstrlist.o moc/moc_inputstrlist.cpp
+
+obj/moc_wizard.o: moc/moc_wizard.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_wizard.o moc/moc_wizard.cpp
+
+obj/qrc_doxywizard.o: rcc/qrc_doxywizard.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qrc_doxywizard.o rcc/qrc_doxywizard.cpp
+
+obj/config_lex.o: config_lex.cpp
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/config_lex.o config_lex.cpp
+
+####### Install
+
+install: FORCE
+
+uninstall: FORCE
+
+FORCE:
+
diff --git a/addon/doxywizard/Makefile.in b/addon/doxywizard/Makefile.in
new file mode 100644
index 0000000..3ae02c8
--- /dev/null
+++ b/addon/doxywizard/Makefile.in
@@ -0,0 +1,39 @@
+#
+#
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+
+QMAKE=qmake $(MKSPECS)
+
+all: Makefile.doxywizard
+ $(MAKE) -f Makefile.doxywizard
+
+Makefile.doxywizard: doxywizard.pro
+ $(QMAKE) doxywizard.pro -o Makefile.doxywizard
+
+qmake:
+ $(QMAKE) doxywizard.pro -o Makefile.doxywizard
+
+clean: Makefile.doxywizard
+ $(MAKE) -f Makefile.doxywizard clean
+
+distclean: Makefile.doxywizard
+ $(MAKE) -f Makefile.doxywizard distclean
+ $(RM) Makefile.doxywizard
+
+install:
+ $(INSTTOOL) -d $(INSTALL)/bin
+ $(INSTTOOL) -m 755 ../../bin/doxywizard $(INSTALL)/bin
+ $(INSTTOOL) -d $(INSTALL)/$(MAN1DIR)
+ cat ../../doc/doxywizard.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > doxywizard.1
+ $(INSTTOOL) -m 644 doxywizard.1 $(INSTALL)/$(MAN1DIR)/doxywizard.1
+ rm doxywizard.1
+
+FORCE:
diff --git a/addon/doxywizard/README b/addon/doxywizard/README
new file mode 100644
index 0000000..57705f0
--- /dev/null
+++ b/addon/doxywizard/README
@@ -0,0 +1,3 @@
+Doxywizard is a graphical front-end to read/edit/write doxygen configuration
+files and to launch doxygen. It requires Qt version 4.3 or higher.
+
diff --git a/addon/doxywizard/config.h b/addon/doxywizard/config.h
new file mode 100644
index 0000000..d40f1f4
--- /dev/null
+++ b/addon/doxywizard/config.h
@@ -0,0 +1,18 @@
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include <QHash>
+#include <QString>
+
+class Input;
+class QTextStream;
+class QTextCodec;
+
+bool parseConfig(
+ const QString &fileName,
+ const QHash<QString,Input *> &options
+ );
+
+void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s);
+
+#endif
diff --git a/addon/doxywizard/config.l b/addon/doxywizard/config.l
new file mode 100644
index 0000000..f8782eb
--- /dev/null
+++ b/addon/doxywizard/config.l
@@ -0,0 +1,555 @@
+/******************************************************************************
+ *
+ * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+%{
+
+/*
+ * includes
+ */
+#include "config.h"
+#include "input.h"
+#include <QtCore>
+
+#define MAX_INCLUDE_DEPTH 10
+
+
+/* -----------------------------------------------------------------
+ *
+ * static variables
+ */
+
+struct ConfigFileState
+{
+ int lineNr;
+ FILE *file;
+ YY_BUFFER_STATE oldState;
+ YY_BUFFER_STATE newState;
+ QString fileName;
+};
+
+static const QHash<QString,Input*> *g_options;
+static FILE *g_file;
+static QString g_yyFileName;
+static QString g_includeName;
+static QVariant g_includePathList;
+static QStack<ConfigFileState*> g_includeStack;
+static int g_includeDepth;
+static QVariant *g_arg;
+static Input *g_curOption=0;
+static QString g_elemStr;
+static QTextCodec *g_codec = QTextCodec::codecForName("UTF-8");
+static QString g_codecName = QString::fromAscii("UTF-8");
+static int g_lastState;
+static QByteArray g_tmpString;
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int maxSize)
+{
+ // no file included
+ if (g_includeStack.isEmpty())
+ {
+ return fread(buf,1,maxSize,g_file);
+ }
+ else
+ {
+ return fread(buf,1,maxSize,g_includeStack.top()->file);
+ }
+}
+
+void config_err(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
+void config_warn(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
+
+static void substEnvVarsInStrList(QStringList &sl);
+static void substEnvVarsInString(QString &s);
+
+static void checkEncoding()
+{
+ Input *option = g_options->value(QString::fromAscii("DOXYFILE_ENCODING"));
+ if (option && option->value().toString()!=g_codecName)
+ {
+ QTextCodec *newCodec = QTextCodec::codecForName(option->value().toString().toAscii());
+ if (newCodec)
+ {
+ g_codec = newCodec;
+ g_codecName = option->value().toString();
+ }
+ }
+}
+
+static FILE *tryPath(const QString &path,const QString &fileName)
+{
+ QString absName=!path.isEmpty() ? path+QString::fromAscii("/")+fileName : fileName;
+ QFileInfo fi(absName);
+ if (fi.exists() && fi.isFile())
+ {
+ FILE *f = fopen(absName.toLocal8Bit(),"r");
+ if (f==NULL)
+ config_err("Error: could not open file %s for reading\n",absName.toLatin1().data());
+ else
+ return f;
+ }
+ return NULL;
+}
+
+static FILE *findFile(const QString &fileName)
+{
+ if (QFileInfo(fileName).isAbsolute()) // absolute path
+ {
+ return tryPath(QString(), fileName);
+ }
+
+ // relative path, try with include paths in the list
+ QStringList sl = g_includePathList.toStringList();
+ substEnvVarsInStrList(sl);
+ foreach (QString s, sl)
+ {
+ FILE *f = tryPath(s,fileName);
+ if (f) return f;
+ }
+ // try cwd if g_includePathList fails
+ return tryPath(QString::fromAscii("."),fileName);
+}
+
+static void readIncludeFile(const QString &incName)
+{
+ if (g_includeDepth==MAX_INCLUDE_DEPTH)
+ {
+ config_err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
+ MAX_INCLUDE_DEPTH,qPrintable(incName));
+ exit(1);
+ }
+
+ QString inc = incName;
+ substEnvVarsInString(inc);
+ inc = inc.trimmed();
+ uint incLen = inc.length();
+ if (inc.at(0)==QChar::fromAscii('"') &&
+ inc.at(incLen-1)==QChar::fromAscii('"')) // strip quotes
+ {
+ inc=inc.mid(1,incLen-2);
+ }
+
+ FILE *f = findFile(inc);
+ if (f) // see if the include file can be found
+ {
+ // For debugging
+#if SHOW_INCLUDES
+ for (i=0;i<includeStack.count();i++) msg(" ");
+ msg("@INCLUDE = %s: parsing...\n",inc.toLatin1().data());
+#endif
+
+ // store the state of the old file
+ ConfigFileState *fs=new ConfigFileState;
+ fs->oldState=YY_CURRENT_BUFFER;
+ fs->fileName=g_yyFileName;
+ fs->file=f;
+ // push the state on the stack
+ g_includeStack.push(fs);
+ // set the scanner to the include file
+ yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
+ fs->newState=YY_CURRENT_BUFFER;
+ g_yyFileName=inc;
+ g_includeDepth++;
+ }
+ else
+ {
+ config_err("Error: @INCLUDE = %s: not found!\n",inc.toLatin1().data());
+ exit(1);
+ }
+}
+
+
+%}
+
+%option nounput
+%option noyywrap
+%option yylineno
+
+%x Start
+%x SkipComment
+%x SkipInvalid
+%x GetString
+%x GetStrList
+%x GetQuotedString
+%x GetEnvVar
+%x Include
+
+%%
+
+<*>\0x0d
+<Start,GetString,GetStrList,SkipInvalid>"#" { BEGIN(SkipComment); }
+<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { QString cmd = g_codec->toUnicode(yytext);
+ cmd=cmd.left(cmd.length()-1).trimmed();
+ g_curOption = g_options->value(cmd);
+ if (g_curOption==0) // oops not known
+ {
+ config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+ qPrintable(cmd),yylineno,qPrintable(g_yyFileName));
+ BEGIN(SkipInvalid);
+ }
+ else // known tag
+ {
+ //option->setEncoding(encoding);
+ g_arg = &g_curOption->value();
+ switch(g_curOption->kind())
+ {
+ case Input::StrList:
+ g_elemStr = QString();
+ *g_arg = QStringList();
+ BEGIN(GetStrList);
+ break;
+ case Input::String:
+ BEGIN(GetString);
+ break;
+ case Input::Int:
+ BEGIN(GetString);
+ break;
+ case Input::Bool:
+ BEGIN(GetString);
+ break;
+ case Input::Obsolete:
+ config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+ "To avoid this warning please update your configuration "
+ "file using \"doxygen -u\"\n", qPrintable(cmd),
+ yylineno,qPrintable(g_yyFileName));
+ BEGIN(SkipInvalid);
+ break;
+ }
+ }
+ }
+<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" { QString cmd=g_codec->toUnicode(yytext);
+ cmd=cmd.left(cmd.length()-2).trimmed();
+ g_curOption = g_options->value(cmd);
+ if (g_curOption==0) // oops not known
+ {
+ config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+ yytext,yylineno,qPrintable(g_yyFileName));
+ BEGIN(SkipInvalid);
+ }
+ else // known tag
+ {
+ switch(g_curOption->kind())
+ {
+ case Input::StrList:
+ g_arg = &g_curOption->value();
+ g_elemStr=QString();
+ BEGIN(GetStrList);
+ break;
+ case Input::String:
+ case Input::Int:
+ case Input::Bool:
+ config_err("Warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
+ yytext,yylineno,qPrintable(g_yyFileName));
+ BEGIN(SkipInvalid);
+ break;
+ case Input::Obsolete:
+ config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+ "To avoid this warning please update your configuration "
+ "file using \"doxygen -u\"\n",
+ qPrintable(cmd),yylineno,qPrintable(g_yyFileName));
+ BEGIN(SkipInvalid);
+ break;
+ }
+ }
+ }
+<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); g_arg=&g_includePathList; *g_arg = QStringList(); g_elemStr=QString(); }
+ /* include a config file */
+<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);}
+<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
+ readIncludeFile(g_codec->toUnicode(yytext));
+ BEGIN(Start);
+ }
+<<EOF>> {
+ //printf("End of include file\n");
+ //printf("Include stack depth=%d\n",g_includeStack.count());
+ if (g_includeStack.isEmpty())
+ {
+ //printf("Terminating scanner!\n");
+ yyterminate();
+ }
+ else
+ {
+ ConfigFileState *fs = g_includeStack.pop();
+ fclose(fs->file);
+ YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer( fs->oldState );
+ yy_delete_buffer( oldBuf );
+ g_yyFileName=fs->fileName;
+ delete fs;
+ g_includeDepth--;
+ }
+ }
+
+<Start>[a-z_A-Z0-9]+ { config_err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yylineno,qPrintable(g_yyFileName)); }
+<GetString,SkipInvalid>\n { BEGIN(Start); }
+<GetStrList>\n {
+ if (!g_elemStr.isEmpty())
+ {
+ //printf("elemStr1=`%s'\n",elemStr.toLatin1().data());
+ *g_arg = QVariant(g_arg->toStringList() << g_elemStr);
+ }
+ BEGIN(Start);
+ }
+<GetStrList>[ \t]+ {
+ if (!g_elemStr.isEmpty())
+ {
+ //printf("elemStr2=`%s'\n",elemStr.toLatin1().data());
+ *g_arg = QVariant(g_arg->toStringList() << g_elemStr);
+ }
+ g_elemStr = QString();
+ }
+<GetString>[^ \"\t\r\n]+ {
+ *g_arg = QVariant(g_codec->toUnicode(yytext));
+ checkEncoding();
+ }
+<GetString,GetStrList,SkipInvalid>"\"" { g_lastState=YY_START;
+ BEGIN(GetQuotedString);
+ g_tmpString="";
+ }
+<GetQuotedString>"\""|"\n" {
+ // we add a bogus space to signal that the string was quoted. This space will be stripped later on.
+ g_tmpString+=" ";
+ //printf("Quoted String = `%s'\n",tmpString.toLatin1().data());
+ if (g_lastState==GetString)
+ {
+ *g_arg = g_codec->toUnicode(g_tmpString);
+ checkEncoding();
+ }
+ else
+ {
+ g_elemStr+=g_codec->toUnicode(g_tmpString);
+ }
+ if (*yytext=='\n')
+ {
+ config_err("Warning: Missing end quote (\") on line %d, file %s\n",yylineno,
+ qPrintable(g_yyFileName));
+ }
+ BEGIN(g_lastState);
+ }
+<GetQuotedString>"\\\"" {
+ g_tmpString+='"';
+ }
+<GetQuotedString>. { g_tmpString+=*yytext; }
+<GetStrList>[^ \#\"\t\r\n]+ {
+ g_elemStr+=g_codec->toUnicode(yytext);
+ }
+<SkipComment>\n { BEGIN(Start); }
+<SkipComment>\\[ \r\t]*\n { BEGIN(Start); }
+<*>\\[ \r\t]*\n { }
+<*>\n
+<*>.
+
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+static void substEnvVarsInString(QString &s)
+{
+ static QRegExp re(QString::fromAscii("\\$\\([a-z_A-Z0-9]+\\)"));
+ if (s.isEmpty()) return;
+ int p=0;
+ int i,l;
+ //printf("substEnvVarInString(%s) start\n",s.toLatin1().data());
+ while ((i=re.indexIn(s,p))!=-1)
+ {
+ l = re.matchedLength();
+ //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).toLatin1().data());
+ QString env=g_codec->toUnicode(getenv(s.mid(i+2,l-3).toLatin1()));
+ substEnvVarsInString(env); // recursively expand variables if needed.
+ s = s.left(i)+env+s.right(s.length()-i-l);
+ p=i+env.length(); // next time start at the end of the expanded string
+ }
+ s=s.trimmed(); // to strip the bogus space that was added when an argument
+ // has quotes
+ //printf("substEnvVarInString(%s) end\n",s.toLatin1().data());
+}
+
+static void substEnvVarsInStrList(QStringList &sl)
+{
+ QStringList out;
+
+ foreach (QString result, sl)
+ {
+ // an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
+ bool wasQuoted = (result.indexOf(QChar::fromAscii(' '))!=-1) ||
+ (result.indexOf(QChar::fromAscii('\t'))!=-1);
+ // here we strip the quote again
+ substEnvVarsInString(result);
+
+ //printf("Result %s was quoted=%d\n",result.toLatin1().data(),wasQuoted);
+
+ if (!wasQuoted) /* as a result of the expansion, a single string
+ may have expanded into a list, which we'll
+ add to sl. If the orginal string already
+ contained multiple elements no further
+ splitting is done to allow quoted items with spaces! */
+ {
+ int l=result.length();
+ int i,p=0;
+ // skip spaces
+ // search for a "word"
+ for (i=0;i<l;i++)
+ {
+ QChar c=0;
+ // skip until start of new word
+ while (i<l && ((c=result.at(i))==QChar::fromAscii(' ') || c==QChar::fromAscii('\t'))) i++;
+ p=i; // p marks the start index of the word
+ // skip until end of a word
+ while (i<l && ((c=result.at(i))!=QChar::fromAscii(' ') &&
+ c!=QChar::fromAscii('\t') &&
+ c!=QChar::fromAscii('"'))) i++;
+ if (i<l) // not at the end of the string
+ {
+ if (c==QChar::fromAscii('"')) // word within quotes
+ {
+ p=i+1;
+ for (i++;i<l;i++)
+ {
+ c=result.at(i);
+ if (c==QChar::fromAscii('"')) // end quote
+ {
+ out += result.mid(p,i-p);
+ p=i+1;
+ break;
+ }
+ else if (c==QChar::fromAscii('\\')) // skip escaped stuff
+ {
+ i++;
+ }
+ }
+ }
+ else if (c==QChar::fromAscii(' ') || c==QChar::fromAscii('\t')) // separator
+ {
+ out += result.mid(p,i-p);
+ p=i+1;
+ }
+ }
+ }
+ if (p!=l) // add the leftover as a string
+ {
+ out += result.right(l-p);
+ }
+ }
+ else // just goto the next element in the list
+ {
+ out += result;
+ }
+ }
+ sl = out;
+}
+
+//--------------------------------------------------------------------------
+
+bool parseConfig(
+ const QString &fileName,
+ const QHash<QString,Input *> &options
+ )
+{
+ QHashIterator<QString, Input*> i(options);
+ g_file = fopen(fileName.toLocal8Bit(),"r");
+ if (g_file==NULL) return false;
+
+ // reset all values
+ i.toFront();
+ while (i.hasNext())
+ {
+ i.next();
+ if (i.value())
+ {
+ i.value()->reset();
+ }
+ }
+
+ // parse config file
+ g_options = &options;
+ g_yyFileName = fileName;
+ g_includeStack.clear();
+ g_includeDepth = 0;
+ configrestart( configin );
+ BEGIN( Start );
+ configlex();
+
+ // update the values in the UI
+ i.toFront();
+ while (i.hasNext())
+ {
+ i.next();
+ if (i.value())
+ {
+ //printf("Updating: %s\n",qPrintable(i.key()));
+ i.value()->update();
+ }
+ else
+ {
+ printf("Invalid option: %s\n",qPrintable(i.key()));
+ }
+ }
+ fclose(g_file);
+ return true;
+}
+
+void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s)
+{
+ QChar c;
+ bool needsEscaping=FALSE;
+ // convert the string back to it original encoding
+ //QByteArray se = codec->fromUnicode(s);
+ t.setCodec(codec);
+ const QChar *p=s.data();
+ if (!s.isEmpty() && !p->isNull())
+ {
+ while (!(c=*p++).isNull() && !needsEscaping)
+ {
+ needsEscaping = (c==QChar::fromAscii(' ') ||
+ c==QChar::fromAscii('\n') ||
+ c==QChar::fromAscii('\t') ||
+ c==QChar::fromAscii('"'));
+ }
+ if (needsEscaping)
+ {
+ t << "\"";
+ p=s.data();
+ while (!p->isNull())
+ {
+ if (*p ==QChar::fromAscii(' ') &&
+ *(p+1)==QChar::fromAscii('\0')) break; // skip inserted space at the end
+ if (*p ==QChar::fromAscii('"')) t << "\\"; // escape quotes
+ t << *p++;
+ }
+ t << "\"";
+ }
+ else
+ {
+ t << s;
+ }
+ }
+}
+
diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp
new file mode 100644
index 0000000..c26a389
--- /dev/null
+++ b/addon/doxywizard/doxywizard.cpp
@@ -0,0 +1,639 @@
+#include <QtGui>
+#include "doxywizard.h"
+#include "version.h"
+#include "expert.h"
+#include "wizard.h"
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#define MAX_RECENT_FILES 10
+
+const int messageTimeout = 5000; //!< status bar message timeout in millisec.
+
+MainWindow &MainWindow::instance()
+{
+ static MainWindow *theInstance = new MainWindow;
+ return *theInstance;
+}
+
+MainWindow::MainWindow()
+ : m_settings(QString::fromAscii("Doxygen.org"), QString::fromAscii("Doxywizard"))
+{
+ QMenu *file = menuBar()->addMenu(tr("File"));
+ file->addAction(tr("Open..."),
+ this, SLOT(openConfig()), Qt::CTRL+Qt::Key_O);
+ m_recentMenu = file->addMenu(tr("Open recent"));
+ file->addAction(tr("Save"),
+ this, SLOT(saveConfig()), Qt::CTRL+Qt::Key_S);
+ file->addAction(tr("Save as..."),
+ this, SLOT(saveConfigAs()), Qt::SHIFT+Qt::CTRL+Qt::Key_S);
+ file->addAction(tr("Quit"),
+ this, SLOT(quit()), Qt::CTRL+Qt::Key_Q);
+
+ QMenu *settings = menuBar()->addMenu(tr("Settings"));
+ settings->addAction(tr("Reset to factory defaults"),
+ this,SLOT(resetToDefaults()));
+ settings->addAction(tr("Use current settings at startup"),
+ this,SLOT(makeDefaults()));
+ settings->addAction(tr("Clear recent list"),
+ this,SLOT(clearRecent()));
+
+ QMenu *help = menuBar()->addMenu(tr("Help"));
+ help->addAction(tr("Online manual"),
+ this, SLOT(manual()), Qt::Key_F1);
+ help->addAction(tr("About"),
+ this, SLOT(about()) );
+
+ m_expert = new Expert;
+ m_wizard = new Wizard(m_expert->modelData());
+
+ // ----------- top part ------------------
+ QWidget *topPart = new QWidget;
+ QVBoxLayout *rowLayout = new QVBoxLayout(topPart);
+
+ // select working directory
+ QHBoxLayout *dirLayout = new QHBoxLayout;
+ m_workingDir = new QLineEdit;
+ m_selWorkingDir = new QPushButton(tr("Select..."));
+ dirLayout->addWidget(m_workingDir);
+ dirLayout->addWidget(m_selWorkingDir);
+
+ //------------- bottom part --------------
+ QWidget *runTab = new QWidget;
+ QVBoxLayout *runTabLayout = new QVBoxLayout(runTab);
+
+ // run doxygen
+ QHBoxLayout *runLayout = new QHBoxLayout;
+ m_run = new QPushButton(tr("Run doxygen"));
+ m_run->setEnabled(false);
+ m_runStatus = new QLabel(tr("Status: not running"));
+ m_saveLog = new QPushButton(tr("Save log..."));
+ m_saveLog->setEnabled(false);
+ QPushButton *showSettings = new QPushButton(tr("Show configuration"));
+ runLayout->addWidget(m_run);
+ runLayout->addWidget(m_runStatus);
+ runLayout->addStretch(1);
+ runLayout->addWidget(showSettings);
+ runLayout->addWidget(m_saveLog);
+
+ // output produced by doxygen
+ runTabLayout->addLayout(runLayout);
+ runTabLayout->addWidget(new QLabel(tr("Output produced by doxygen")));
+ QGridLayout *grid = new QGridLayout;
+ m_outputLog = new QTextEdit;
+ m_outputLog->setReadOnly(true);
+ m_outputLog->setFontFamily(QString::fromAscii("courier"));
+ m_outputLog->setMinimumWidth(600);
+ grid->addWidget(m_outputLog,0,0);
+ grid->setColumnStretch(0,1);
+ grid->setRowStretch(0,1);
+ QHBoxLayout *launchLayout = new QHBoxLayout;
+ m_launchHtml = new QPushButton(tr("Show HTML output"));
+ launchLayout->addWidget(m_launchHtml);
+
+ launchLayout->addStretch(1);
+ grid->addLayout(launchLayout,1,0);
+ runTabLayout->addLayout(grid);
+
+ QTabWidget *tabs = new QTabWidget;
+ tabs->addTab(m_wizard,tr("Wizard"));
+ tabs->addTab(m_expert,tr("Expert"));
+ tabs->addTab(runTab,tr("Run"));
+
+ rowLayout->addWidget(new QLabel(tr("Step 1: Specify the working directory from which doxygen will run")));
+ rowLayout->addLayout(dirLayout);
+ rowLayout->addWidget(new QLabel(tr("Step 2: Configure doxygen using the Wizard and/or Expert tab, then switch to the Run tab to generate the documentation")));
+ rowLayout->addWidget(tabs);
+
+ setCentralWidget(topPart);
+ statusBar()->showMessage(tr("Welcome to Doxygen"),messageTimeout);
+
+ m_runProcess = new QProcess;
+ m_running = false;
+ m_timer = new QTimer;
+
+ // connect signals and slots
+ connect(tabs,SIGNAL(currentChanged(int)),SLOT(selectTab(int)));
+ connect(m_selWorkingDir,SIGNAL(clicked()),SLOT(selectWorkingDir()));
+ connect(m_recentMenu,SIGNAL(triggered(QAction*)),SLOT(openRecent(QAction*)));
+ connect(m_workingDir,SIGNAL(returnPressed()),SLOT(updateWorkingDir()));
+ connect(m_runProcess,SIGNAL(readyReadStandardOutput()),SLOT(readStdout()));
+ connect(m_runProcess,SIGNAL(finished(int, QProcess::ExitStatus)),SLOT(runComplete()));
+ connect(m_timer,SIGNAL(timeout()),SLOT(readStdout()));
+ connect(m_run,SIGNAL(clicked()),SLOT(runDoxygen()));
+ connect(m_launchHtml,SIGNAL(clicked()),SLOT(showHtmlOutput()));
+ connect(m_saveLog,SIGNAL(clicked()),SLOT(saveLog()));
+ connect(showSettings,SIGNAL(clicked()),SLOT(showSettings()));
+ connect(m_expert,SIGNAL(changed()),SLOT(configChanged()));
+
+ loadSettings();
+ updateLaunchButtonState();
+ m_modified = false;
+ updateTitle();
+ m_wizard->refresh();
+}
+
+void MainWindow::closeEvent(QCloseEvent *event)
+{
+ if (discardUnsavedChanges())
+ {
+ saveSettings();
+ event->accept();
+ }
+ else
+ {
+ event->ignore();
+ }
+}
+
+void MainWindow::quit()
+{
+ if (discardUnsavedChanges())
+ {
+ saveSettings();
+ }
+ QApplication::exit(0);
+}
+
+void MainWindow::setWorkingDir(const QString &dirName)
+{
+ QDir::setCurrent(dirName);
+ m_workingDir->setText(dirName);
+ m_run->setEnabled(!dirName.isEmpty());
+}
+
+void MainWindow::selectWorkingDir()
+{
+ QString dirName = QFileDialog::getExistingDirectory(this,
+ tr("Select working directory"),m_workingDir->text());
+ if (!dirName.isEmpty())
+ {
+ setWorkingDir(dirName);
+ }
+}
+
+void MainWindow::updateWorkingDir()
+{
+ setWorkingDir(m_workingDir->text());
+}
+
+void MainWindow::manual()
+{
+ QDesktopServices::openUrl(QUrl(QString::fromAscii("http://www.doxygen.org/manual.html")));
+}
+
+void MainWindow::about()
+{
+ QString msg;
+ QTextStream t(&msg,QIODevice::WriteOnly);
+ t << QString::fromAscii("<qt><center>A tool to configure and run doxygen version ")+
+ QString::fromAscii(versionString)+
+ QString::fromAscii(" on your source files.</center><p><br>"
+ "<center>Written by<br> Dimitri van Heesch<br>&copy; 2000-2010</center><p>"
+ "</qt>");
+ QMessageBox::about(this,tr("Doxygen GUI"),msg);
+}
+
+void MainWindow::openConfig()
+{
+ if (discardUnsavedChanges(false))
+ {
+ QString fn = QFileDialog::getOpenFileName(this,
+ tr("Open configuration file"),
+ m_workingDir->text());
+ if (!fn.isEmpty())
+ {
+ loadConfigFromFile(fn);
+ }
+ }
+}
+
+void MainWindow::updateConfigFileName(const QString &fileName)
+{
+ if (m_fileName!=fileName)
+ {
+ m_fileName = fileName;
+ QString curPath = QFileInfo(fileName).path();
+ setWorkingDir(curPath);
+ addRecentFile(fileName);
+ updateTitle();
+ }
+}
+
+void MainWindow::loadConfigFromFile(const QString & fileName)
+{
+ m_expert->loadConfig(fileName);
+ m_wizard->refresh();
+ updateConfigFileName(fileName);
+ updateLaunchButtonState();
+ m_modified = false;
+ updateTitle();
+}
+
+void MainWindow::saveConfig(const QString &fileName)
+{
+ if (fileName.isEmpty()) return;
+ QFile f(fileName);
+ if (!f.open(QIODevice::WriteOnly))
+ {
+ QMessageBox::warning(this,
+ tr("Error saving"),
+ tr("Error: cannot open the file ")+fileName+tr(" for writing!\n")+
+ tr("Reason given: ")+f.error());
+ return;
+ }
+ QTextStream t(&f);
+ m_expert->writeConfig(t,false);
+ updateConfigFileName(fileName);
+ m_modified = false;
+ updateTitle();
+}
+
+bool MainWindow::saveConfig()
+{
+ if (m_fileName.isEmpty())
+ {
+ return saveConfigAs();
+ }
+ else
+ {
+ saveConfig(m_fileName);
+ return true;
+ }
+}
+
+bool MainWindow::saveConfigAs()
+{
+ QString fileName = QFileDialog::getSaveFileName(this, QString(),
+ m_workingDir->text()+QString::fromAscii("/Doxyfile"));
+ if (fileName.isEmpty()) return false;
+ saveConfig(fileName);
+ return true;
+}
+
+void MainWindow::makeDefaults()
+{
+ if (QMessageBox::question(this,tr("Use current setting at startup?"),
+ tr("Do you want to save the current settings "
+ "and use them next time Doxywizard starts?"),
+ QMessageBox::Save|
+ QMessageBox::Cancel)==QMessageBox::Save)
+ {
+ //printf("MainWindow:makeDefaults()\n");
+ m_expert->saveSettings(&m_settings);
+ m_settings.setValue(QString::fromAscii("wizard/loadsettings"), true);
+ m_settings.sync();
+ }
+}
+
+void MainWindow::clearRecent()
+{
+ if (QMessageBox::question(this,tr("Clear the list of recent files?"),
+ tr("Do you want to clear the list of recently "
+ "loaded configuration files?"),
+ QMessageBox::Yes|
+ QMessageBox::Cancel)==QMessageBox::Yes)
+ {
+ m_recentMenu->clear();
+ m_recentFiles.clear();
+ for (int i=0;i<MAX_RECENT_FILES;i++)
+ {
+ m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromAscii(""));
+ }
+ m_settings.sync();
+ }
+
+}
+
+void MainWindow::resetToDefaults()
+{
+ if (QMessageBox::question(this,tr("Reset settings to their default values?"),
+ tr("Do you want to revert all settings back "
+ "to their original values?"),
+ QMessageBox::Reset|
+ QMessageBox::Cancel)==QMessageBox::Reset)
+ {
+ //printf("MainWindow:resetToDefaults()\n");
+ m_expert->resetToDefaults();
+ m_settings.setValue(QString::fromAscii("wizard/loadsettings"), false);
+ m_settings.sync();
+ m_wizard->refresh();
+ }
+}
+
+void MainWindow::loadSettings()
+{
+ QVariant geometry = m_settings.value(QString::fromAscii("main/geometry"), QVariant::Invalid);
+ QVariant state = m_settings.value(QString::fromAscii("main/state"), QVariant::Invalid);
+ QVariant wizState = m_settings.value(QString::fromAscii("wizard/state"), QVariant::Invalid);
+ QVariant loadSettings = m_settings.value(QString::fromAscii("wizard/loadsettings"), QVariant::Invalid);
+ QVariant workingDir = m_settings.value(QString::fromAscii("wizard/workingdir"), QVariant::Invalid);
+
+ if (geometry !=QVariant::Invalid) restoreGeometry(geometry.toByteArray());
+ if (state !=QVariant::Invalid) restoreState (state.toByteArray());
+ if (wizState !=QVariant::Invalid) m_wizard->restoreState(wizState.toByteArray());
+ if (loadSettings!=QVariant::Invalid && loadSettings.toBool())
+ {
+ m_expert->loadSettings(&m_settings);
+ if (workingDir!=QVariant::Invalid && QDir(workingDir.toString()).exists())
+ {
+ setWorkingDir(workingDir.toString());
+ }
+ }
+
+ for (int i=0;i<MAX_RECENT_FILES;i++)
+ {
+ QString entry = m_settings.value(QString().sprintf("recent/config%d",i)).toString();
+ if (!entry.isEmpty() && QFileInfo(entry).exists())
+ {
+ addRecentFile(entry);
+ }
+ }
+
+}
+
+void MainWindow::saveSettings()
+{
+ QSettings settings(QString::fromAscii("Doxygen.org"), QString::fromAscii("Doxywizard"));
+
+ m_settings.setValue(QString::fromAscii("main/geometry"), saveGeometry());
+ m_settings.setValue(QString::fromAscii("main/state"), saveState());
+ m_settings.setValue(QString::fromAscii("wizard/state"), m_wizard->saveState());
+ m_settings.setValue(QString::fromAscii("wizard/workingdir"), m_workingDir->text());
+}
+
+void MainWindow::selectTab(int id)
+{
+ if (id==0) m_wizard->refresh();
+}
+
+void MainWindow::addRecentFile(const QString &fileName)
+{
+ int i=m_recentFiles.indexOf(fileName);
+ if (i!=-1) m_recentFiles.removeAt(i);
+
+ // not found
+ if (m_recentFiles.count() < MAX_RECENT_FILES) // append
+ {
+ m_recentFiles.prepend(fileName);
+ }
+ else // add + drop last item
+ {
+ m_recentFiles.removeLast();
+ m_recentFiles.prepend(fileName);
+ }
+ m_recentMenu->clear();
+ i=0;
+ foreach( QString str, m_recentFiles )
+ {
+ m_recentMenu->addAction(str);
+ m_settings.setValue(QString().sprintf("recent/config%d",i++),str);
+ }
+ for (;i<MAX_RECENT_FILES;i++)
+ {
+ m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromAscii(""));
+ }
+}
+
+void MainWindow::openRecent(QAction *action)
+{
+ if (discardUnsavedChanges(false))
+ {
+ loadConfigFromFile(action->text());
+ }
+}
+
+void MainWindow::runDoxygen()
+{
+ if (!m_running)
+ {
+ QString doxygenPath;
+#if defined(Q_OS_MACX)
+ doxygenPath = qApp->applicationDirPath()+QString::fromAscii("/../Resources/");
+ qDebug() << tr("Doxygen path: ") << doxygenPath;
+ if ( !QFile(doxygenPath + QString::fromAscii("doxygen")).exists() )
+ {
+ // No doygen binary in the resources, if there is a system doxygen binary, use that instead
+ if ( QFile(QString::fromAscii("/usr/local/bin/doxygen")).exists() )
+ {
+ doxygenPath = QString::fromAscii("/usr/local/bin/");
+ }
+ else
+ {
+ qDebug() << tr("Can't find the doxygen command, make sure it's in your $$PATH");
+ doxygenPath = QString::fromAscii("");
+ }
+ }
+ qDebug() << tr("Getting doxygen from: ") << doxygenPath;
+#endif
+
+ m_runProcess->setReadChannel(QProcess::StandardOutput);
+ m_runProcess->setProcessChannelMode(QProcess::MergedChannels);
+ m_runProcess->setWorkingDirectory(m_workingDir->text());
+ QStringList env=QProcess::systemEnvironment();
+ // set PWD environment variable to m_workingDir
+ env.replaceInStrings(QRegExp(QString::fromAscii("^PWD=(.*)"),Qt::CaseInsensitive),
+ QString::fromAscii("PWD=")+m_workingDir->text());
+ m_runProcess->setEnvironment(env);
+
+ QStringList args;
+ args << QString::fromAscii("-b"); // make stdout unbuffered
+ args << QString::fromAscii("-"); // read config from stdin
+
+ m_outputLog->clear();
+ m_runProcess->start(doxygenPath + QString::fromAscii("doxygen"), args);
+
+ if (!m_runProcess->waitForStarted())
+ {
+ m_outputLog->append(QString::fromAscii("*** Failed to run doxygen\n"));
+ return;
+ }
+ QTextStream t(m_runProcess);
+ m_expert->writeConfig(t,false);
+ m_runProcess->closeWriteChannel();
+
+ if (m_runProcess->state() == QProcess::NotRunning)
+ {
+ m_outputLog->append(QString::fromAscii("*** Failed to run doxygen\n"));
+ }
+ else
+ {
+ m_saveLog->setEnabled(false);
+ m_running=true;
+ m_run->setText(tr("Stop doxygen"));
+ m_runStatus->setText(tr("Status: running"));
+ m_timer->start(1000);
+ }
+ }
+ else
+ {
+ m_running=false;
+ m_run->setText(tr("Run doxygen"));
+ m_runStatus->setText(tr("Status: not running"));
+ m_runProcess->kill();
+ m_timer->stop();
+ //updateRunnable(m_workingDir->text());
+ }
+}
+
+void MainWindow::readStdout()
+{
+ if (m_running)
+ {
+ QByteArray data = m_runProcess->readAllStandardOutput();
+ QString text = QString::fromLocal8Bit(data);
+ if (!text.isEmpty())
+ {
+ m_outputLog->append(text.trimmed());
+ }
+ }
+}
+
+void MainWindow::runComplete()
+{
+ if (m_running)
+ {
+ m_outputLog->append(tr("*** Doxygen has finished\n"));
+ }
+ else
+ {
+ m_outputLog->append(tr("*** Cancelled by user\n"));
+ }
+ m_outputLog->ensureCursorVisible();
+ m_run->setText(tr("Run doxygen"));
+ m_runStatus->setText(tr("Status: not running"));
+ m_running=false;
+ updateLaunchButtonState();
+ //updateRunnable(m_workingDir->text());
+ m_saveLog->setEnabled(true);
+}
+
+void MainWindow::updateLaunchButtonState()
+{
+ m_launchHtml->setEnabled(m_expert->htmlOutputPresent(m_workingDir->text()));
+#if 0
+ m_launchPdf->setEnabled(m_expert->pdfOutputPresent(m_workingDir->text()));
+#endif
+}
+
+void MainWindow::showHtmlOutput()
+{
+ QString indexFile = m_expert->getHtmlOutputIndex(m_workingDir->text());
+ QFileInfo fi(indexFile);
+ // TODO: the following doesn't seem to work with IE
+#ifdef WIN32
+ //QString indexUrl(QString::fromAscii("file:///"));
+ ShellExecute(NULL, L"open", fi.absoluteFilePath().utf16(), NULL, NULL, SW_SHOWNORMAL);
+#else
+ QString indexUrl(QString::fromAscii("file://"));
+ indexUrl+=fi.absoluteFilePath();
+ QDesktopServices::openUrl(QUrl(indexUrl));
+#endif
+}
+
+void MainWindow::saveLog()
+{
+ QString fn = QFileDialog::getSaveFileName(this, tr("Save log file"),
+ m_workingDir->text()+
+ QString::fromAscii("/doxygen_log.txt"));
+ if (!fn.isEmpty())
+ {
+ QFile f(fn);
+ if (f.open(QIODevice::WriteOnly))
+ {
+ QTextStream t(&f);
+ t << m_outputLog->toPlainText();
+ statusBar()->showMessage(tr("Output log saved"),messageTimeout);
+ }
+ else
+ {
+ QMessageBox::warning(0,tr("Warning"),
+ tr("Cannot open file ")+fn+tr(" for writing. Nothing saved!"),tr("ok"));
+ }
+ }
+}
+
+void MainWindow::showSettings()
+{
+ QString text;
+ QTextStream t(&text);
+ m_expert->writeConfig(t,true);
+ m_outputLog->clear();
+ m_outputLog->append(text);
+ m_outputLog->ensureCursorVisible();
+ m_saveLog->setEnabled(true);
+}
+
+void MainWindow::configChanged()
+{
+ m_modified = true;
+ updateTitle();
+}
+
+void MainWindow::updateTitle()
+{
+ QString title = tr("Doxygen GUI frontend");
+ if (m_modified)
+ {
+ title+=QString::fromAscii(" +");
+ }
+ if (!m_fileName.isEmpty())
+ {
+ title+=QString::fromAscii(" (")+m_fileName+QString::fromAscii(")");
+ }
+ setWindowTitle(title);
+}
+
+bool MainWindow::discardUnsavedChanges(bool saveOption)
+{
+ if (m_modified)
+ {
+ QMessageBox::StandardButton button;
+ if (saveOption)
+ {
+ button = QMessageBox::question(this,
+ tr("Unsaved changes"),
+ tr("Unsaved changes will be lost! Do you want to save the configuration file?"),
+ QMessageBox::Save |
+ QMessageBox::Discard |
+ QMessageBox::Cancel
+ );
+ if (button==QMessageBox::Save)
+ {
+ return saveConfig();
+ }
+ }
+ else
+ {
+ button = QMessageBox::question(this,
+ tr("Unsaved changes"),
+ tr("Unsaved changes will be lost! Do you want to continue?"),
+ QMessageBox::Discard |
+ QMessageBox::Cancel
+ );
+ }
+ return button==QMessageBox::Discard;
+ }
+ return true;
+}
+
+//-----------------------------------------------------------------------
+
+int main(int argc,char **argv)
+{
+ QApplication a(argc,argv);
+ MainWindow &main = MainWindow::instance();
+ if (argc==2 && argv[1][0]!='-') // name of config file as an argument
+ {
+ main.loadConfigFromFile(QString::fromLocal8Bit(argv[1]));
+ }
+ else if (argc>1)
+ {
+ printf("Usage: %s [config file]\n",argv[0]);
+ exit(1);
+ }
+ main.show();
+ return a.exec();
+}
diff --git a/addon/doxywizard/doxywizard.h b/addon/doxywizard/doxywizard.h
new file mode 100644
index 0000000..46cd748
--- /dev/null
+++ b/addon/doxywizard/doxywizard.h
@@ -0,0 +1,84 @@
+#ifndef DOXYWIZARD_H
+#define DOXYWIZARD_H
+
+#include <QMainWindow>
+#include <QSettings>
+#include <QStringList>
+
+class Expert;
+class Wizard;
+class QLabel;
+class QLineEdit;
+class QPushButton;
+class QTextEdit;
+class QMenu;
+class QProcess;
+class QTimer;
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+ public:
+ static MainWindow &instance();
+ void loadConfigFromFile(const QString &fileName);
+ void loadSettings();
+ void saveSettings();
+ void closeEvent(QCloseEvent *event);
+ QString configFileName() const { return m_fileName; }
+ void updateTitle();
+
+ public slots:
+ void manual();
+ void about();
+ void openConfig();
+ bool saveConfig();
+ bool saveConfigAs();
+ void makeDefaults();
+ void resetToDefaults();
+ void selectTab(int);
+ void quit();
+
+ private slots:
+ void openRecent(QAction *action);
+ void selectWorkingDir();
+ void updateWorkingDir();
+ void runDoxygen();
+ void readStdout();
+ void runComplete();
+ void showHtmlOutput();
+ void saveLog();
+ void showSettings();
+ void configChanged();
+ void clearRecent();
+
+ private:
+ MainWindow();
+ void saveConfig(const QString &fileName);
+ void addRecentFile(const QString &fileName);
+ void updateConfigFileName(const QString &fileName);
+ void setWorkingDir(const QString &dirName);
+ void updateLaunchButtonState();
+ bool discardUnsavedChanges(bool saveOption=true);
+
+ QLineEdit *m_workingDir;
+ QPushButton *m_selWorkingDir;
+ QPushButton *m_run;
+ QPushButton *m_saveLog;
+ QPushButton *m_launchHtml;
+ QPushButton *m_launchPdf;
+ QTextEdit *m_outputLog;
+ QLabel *m_runStatus;
+ Expert *m_expert;
+ Wizard *m_wizard;
+ QString m_fileName;
+ QSettings m_settings;
+ QMenu *m_recentMenu;
+ QStringList m_recentFiles;
+ QProcess *m_runProcess;
+ QTimer *m_timer;
+ bool m_running;
+ bool m_modified;
+};
+
+#endif
diff --git a/addon/doxywizard/doxywizard.ico b/addon/doxywizard/doxywizard.ico
new file mode 100644
index 0000000..d91f219
--- /dev/null
+++ b/addon/doxywizard/doxywizard.ico
Binary files differ
diff --git a/addon/doxywizard/doxywizard.pro b/addon/doxywizard/doxywizard.pro
new file mode 100644
index 0000000..6bd1a85
--- /dev/null
+++ b/addon/doxywizard/doxywizard.pro
@@ -0,0 +1,33 @@
+#
+# This file was generated from doxywizard.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+######################################################################
+# Automatically generated by qmake (2.01a) zo okt 19 12:50:02 2008
+######################################################################
+
+TEMPLATE = app
+DESTDIR = ../../bin
+TARGET =
+DEPENDPATH += .
+INCLUDEPATH += .
+QT += xml
+CONFIG += debug
+OBJECTS_DIR = obj
+MOC_DIR = moc
+RCC_DIR = rcc
+DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII
+
+macx-g++ {
+ CONFIG += x86 ppc
+}
+
+# Input
+HEADERS += doxywizard.h version.h expert.h config.h helplabel.h \
+ inputbool.h inputstring.h inputint.h inputstrlist.h wizard.h
+SOURCES += doxywizard.cpp ../../src/version.cpp expert.cpp wizard.cpp \
+ inputbool.cpp inputstring.cpp inputint.cpp inputstrlist.cpp
+LEXSOURCES += config.l
+RESOURCES += doxywizard.qrc
+win32:RC_FILE += doxywizard.rc
+TMAKE_MOC = /usr/bin/moc
diff --git a/addon/doxywizard/doxywizard.pro.in b/addon/doxywizard/doxywizard.pro.in
new file mode 100644
index 0000000..3b40576
--- /dev/null
+++ b/addon/doxywizard/doxywizard.pro.in
@@ -0,0 +1,28 @@
+######################################################################
+# Automatically generated by qmake (2.01a) zo okt 19 12:50:02 2008
+######################################################################
+
+TEMPLATE = app
+DESTDIR = ../../bin
+TARGET =
+DEPENDPATH += .
+INCLUDEPATH += .
+QT += xml
+CONFIG += $extraopts
+OBJECTS_DIR = obj
+MOC_DIR = moc
+RCC_DIR = rcc
+DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII
+
+macx-g++ {
+ CONFIG += x86 ppc
+}
+
+# Input
+HEADERS += doxywizard.h version.h expert.h config.h helplabel.h \
+ inputbool.h inputstring.h inputint.h inputstrlist.h wizard.h
+SOURCES += doxywizard.cpp ../../src/version.cpp expert.cpp wizard.cpp \
+ inputbool.cpp inputstring.cpp inputint.cpp inputstrlist.cpp
+LEXSOURCES += config.l
+RESOURCES += doxywizard.qrc
+win32:RC_FILE += doxywizard.rc
diff --git a/addon/doxywizard/doxywizard.qrc b/addon/doxywizard/doxywizard.qrc
new file mode 100644
index 0000000..88316ed
--- /dev/null
+++ b/addon/doxywizard/doxywizard.qrc
@@ -0,0 +1,11 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/">
+ <file alias="config.xml">../../src/config.xml</file>
+ <file>images/add.png</file>
+ <file>images/del.png</file>
+ <file>images/file.png</file>
+ <file>images/folder.png</file>
+ <file>images/refresh.png</file>
+ <file>images/tunecolor.png</file>
+</qresource>
+</RCC>
diff --git a/addon/doxywizard/doxywizard.rc b/addon/doxywizard/doxywizard.rc
new file mode 100644
index 0000000..7f5327c
--- /dev/null
+++ b/addon/doxywizard/doxywizard.rc
@@ -0,0 +1 @@
+IDI_ICON1 ICON DISCARDABLE "doxywizard.ico"
diff --git a/addon/doxywizard/expert.cpp b/addon/doxywizard/expert.cpp
new file mode 100644
index 0000000..4bbb104
--- /dev/null
+++ b/addon/doxywizard/expert.cpp
@@ -0,0 +1,561 @@
+#include "expert.h"
+#include "inputbool.h"
+#include "inputstring.h"
+#include "inputint.h"
+#include "inputstring.h"
+#include "inputstrlist.h"
+#include <QtGui>
+#include <QtXml>
+#include "config.h"
+#include "version.h"
+
+#undef SA
+#define SA(x) QString::fromAscii(x)
+
+static QString convertToComment(const QString &s)
+{
+ if (s.isEmpty())
+ {
+ return QString();
+ }
+ else
+ {
+ return SA("# ")+
+ s.trimmed().replace(SA("\n"),SA("\n# "))+
+ SA("\n");
+ }
+}
+
+//------------------------------------------------------------------------------------
+
+Expert::Expert()
+{
+ m_treeWidget = new QTreeWidget;
+ m_treeWidget->setColumnCount(1);
+ m_topicStack = new QStackedWidget;
+ m_inShowHelp = FALSE;
+
+ QFile file(SA(":/config.xml"));
+ QString err;
+ int errLine,errCol;
+ QDomDocument configXml;
+ if (file.open(QIODevice::ReadOnly))
+ {
+ if (!configXml.setContent(&file,false,&err,&errLine,&errCol))
+ {
+ QString msg = tr("Error parsing internal config.xml at line %1 column %2.\n%3").
+ arg(errLine).arg(errCol).arg(err);
+ QMessageBox::warning(this, tr("Error"), msg);
+ exit(1);
+ }
+ }
+ m_rootElement = configXml.documentElement();
+
+ createTopics(m_rootElement);
+ m_helper = new QTextEdit;
+ m_helper->setReadOnly(true);
+ m_splitter = new QSplitter(Qt::Vertical);
+ m_splitter->addWidget(m_treeWidget);
+ m_splitter->addWidget(m_helper);
+
+ QWidget *rightSide = new QWidget;
+ QGridLayout *grid = new QGridLayout(rightSide);
+ m_prev = new QPushButton(tr("Previous"));
+ m_prev->setEnabled(false);
+ m_next = new QPushButton(tr("Next"));
+ grid->addWidget(m_topicStack,0,0,1,2);
+ grid->addWidget(m_prev,1,0,Qt::AlignLeft);
+ grid->addWidget(m_next,1,1,Qt::AlignRight);
+ grid->setColumnStretch(0,1);
+ grid->setRowStretch(0,1);
+
+ addWidget(m_splitter);
+ addWidget(rightSide);
+ connect(m_next,SIGNAL(clicked()),SLOT(nextTopic()));
+
+ connect(m_prev,SIGNAL(clicked()),SLOT(prevTopic()));
+}
+
+Expert::~Expert()
+{
+ QHashIterator<QString,Input*> i(m_options);
+ while (i.hasNext())
+ {
+ i.next();
+ delete i.value();
+ }
+}
+
+void Expert::createTopics(const QDomElement &rootElem)
+{
+ QList<QTreeWidgetItem*> items;
+ QDomElement childElem = rootElem.firstChildElement();
+ while (!childElem.isNull())
+ {
+ if (childElem.tagName()==SA("group"))
+ {
+ QString name = childElem.attribute(SA("name"));
+ items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(name)));
+ QWidget *widget = createTopicWidget(childElem);
+ m_topics[name] = widget;
+ m_topicStack->addWidget(widget);
+ }
+ childElem = childElem.nextSiblingElement();
+ }
+ m_treeWidget->setHeaderLabels(QStringList() << SA("Topics"));
+ m_treeWidget->insertTopLevelItems(0,items);
+ connect(m_treeWidget,
+ SIGNAL(currentItemChanged(QTreeWidgetItem *,QTreeWidgetItem *)),
+ this,
+ SLOT(activateTopic(QTreeWidgetItem *,QTreeWidgetItem *)));
+}
+
+
+QWidget *Expert::createTopicWidget(QDomElement &elem)
+{
+ QScrollArea *area = new QScrollArea;
+ QWidget *topic = new QWidget;
+ QGridLayout *layout = new QGridLayout(topic);
+ QDomElement child = elem.firstChildElement();
+ int row=0;
+ while (!child.isNull())
+ {
+ QString type = child.attribute(SA("type"));
+ if (type==SA("bool"))
+ {
+ InputBool *boolOption =
+ new InputBool(
+ layout,row,
+ child.attribute(SA("id")),
+ child.attribute(SA("defval"))==SA("1"),
+ child.attribute(SA("docs"))
+ );
+ m_options.insert(
+ child.attribute(SA("id")),
+ boolOption
+ );
+ connect(boolOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+ connect(boolOption,SIGNAL(changed()),SIGNAL(changed()));
+ }
+ else if (type==SA("string"))
+ {
+ InputString::StringMode mode;
+ QString format = child.attribute(SA("format"));
+ if (format==SA("dir"))
+ {
+ mode = InputString::StringDir;
+ }
+ else if (format==SA("file"))
+ {
+ mode = InputString::StringFile;
+ }
+ else // format=="string"
+ {
+ mode = InputString::StringFree;
+ }
+ InputString *stringOption =
+ new InputString(
+ layout,row,
+ child.attribute(SA("id")),
+ child.attribute(SA("defval")),
+ mode,
+ child.attribute(SA("docs")),
+ child.attribute(SA("abspath"))
+ );
+ m_options.insert(
+ child.attribute(SA("id")),
+ stringOption
+ );
+ connect(stringOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+ connect(stringOption,SIGNAL(changed()),SIGNAL(changed()));
+ }
+ else if (type==SA("enum"))
+ {
+ InputString *enumList = new InputString(
+ layout,row,
+ child.attribute(SA("id")),
+ child.attribute(SA("defval")),
+ InputString::StringFixed,
+ child.attribute(SA("docs"))
+ );
+ QDomElement enumVal = child.firstChildElement();
+ while (!enumVal.isNull())
+ {
+ enumList->addValue(enumVal.attribute(SA("name")));
+ enumVal = enumVal.nextSiblingElement();
+ }
+ enumList->setDefault();
+
+ m_options.insert(child.attribute(SA("id")),enumList);
+ connect(enumList,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+ connect(enumList,SIGNAL(changed()),SIGNAL(changed()));
+ }
+ else if (type==SA("int"))
+ {
+ InputInt *intOption =
+ new InputInt(
+ layout,row,
+ child.attribute(SA("id")),
+ child.attribute(SA("defval")).toInt(),
+ child.attribute(SA("minval")).toInt(),
+ child.attribute(SA("maxval")).toInt(),
+ child.attribute(SA("docs"))
+ );
+ m_options.insert(
+ child.attribute(SA("id")),
+ intOption
+ );
+ connect(intOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+ connect(intOption,SIGNAL(changed()),SIGNAL(changed()));
+ }
+ else if (type==SA("list"))
+ {
+ InputStrList::ListMode mode;
+ QString format = child.attribute(SA("format"));
+ if (format==SA("dir"))
+ {
+ mode = InputStrList::ListDir;
+ }
+ else if (format==SA("file"))
+ {
+ mode = InputStrList::ListFile;
+ }
+ else if (format==SA("filedir"))
+ {
+ mode = InputStrList::ListFileDir;
+ }
+ else // format=="string"
+ {
+ mode = InputStrList::ListString;
+ }
+ QStringList sl;
+ QDomElement listVal = child.firstChildElement();
+ while (!listVal.isNull())
+ {
+ sl.append(listVal.attribute(SA("name")));
+ listVal = listVal.nextSiblingElement();
+ }
+ InputStrList *listOption =
+ new InputStrList(
+ layout,row,
+ child.attribute(SA("id")),
+ sl,
+ mode,
+ child.attribute(SA("docs"))
+ );
+ m_options.insert(
+ child.attribute(SA("id")),
+ listOption
+ );
+ connect(listOption,SIGNAL(showHelp(Input*)),SLOT(showHelp(Input*)));
+ connect(listOption,SIGNAL(changed()),SIGNAL(changed()));
+ }
+ else if (type==SA("obsolete"))
+ {
+ // ignore
+ }
+ else // should not happen
+ {
+ printf("Unsupported type %s\n",qPrintable(child.attribute(SA("type"))));
+ }
+ child = child.nextSiblingElement();
+ }
+
+ // compute dependencies between options
+ child = elem.firstChildElement();
+ while (!child.isNull())
+ {
+ QString dependsOn = child.attribute(SA("depends"));
+ QString id = child.attribute(SA("id"));
+ if (!dependsOn.isEmpty())
+ {
+ Input *parentOption = m_options[dependsOn];
+ Input *thisOption = m_options[id];
+ Q_ASSERT(parentOption);
+ Q_ASSERT(thisOption);
+ if (parentOption && thisOption)
+ {
+ //printf("Adding dependency '%s' (%p)->'%s' (%p)\n",
+ // qPrintable(dependsOn),parentOption,
+ // qPrintable(id),thisOption);
+ parentOption->addDependency(thisOption);
+ }
+ }
+ child = child.nextSiblingElement();
+ }
+
+ // set initial dependencies
+ QHashIterator<QString,Input*> i(m_options);
+ while (i.hasNext())
+ {
+ i.next();
+ if (i.value())
+ {
+ i.value()->updateDependencies();
+ }
+ }
+
+ layout->setRowStretch(row,1);
+ layout->setColumnStretch(1,2);
+ layout->setSpacing(5);
+ topic->setLayout(layout);
+ area->setWidget(topic);
+ area->setWidgetResizable(true);
+ return area;
+}
+
+void Expert::activateTopic(QTreeWidgetItem *item,QTreeWidgetItem *)
+{
+ if (item)
+ {
+ QWidget *w = m_topics[item->text(0)];
+ m_topicStack->setCurrentWidget(w);
+ m_prev->setEnabled(m_topicStack->currentIndex()!=0);
+ m_next->setEnabled(m_topicStack->currentIndex()!=m_topicStack->count()-1);
+ }
+}
+
+void Expert::loadSettings(QSettings *s)
+{
+ QHashIterator<QString,Input*> i(m_options);
+ while (i.hasNext())
+ {
+ i.next();
+ QVariant var = s->value(SA("config/")+i.key());
+ if (i.value())
+ {
+ //printf("Loading key %s: type=%d value='%s'\n",qPrintable(i.key()),var.type(),qPrintable(var.toString()));
+ i.value()->value() = var;
+ i.value()->update();
+ }
+ }
+}
+
+void Expert::saveSettings(QSettings *s)
+{
+ QHashIterator<QString,Input*> i(m_options);
+ while (i.hasNext())
+ {
+ i.next();
+ //printf("Saving key %s: type=%d value='%s'\n",qPrintable(i.key()),i.value()->value().type(),qPrintable(i.value()->value().toString()));
+ if (i.value())
+ {
+ s->setValue(SA("config/")+i.key(),i.value()->value());
+ }
+ }
+}
+
+void Expert::loadConfig(const QString &fileName)
+{
+ //printf("Expert::loadConfig(%s)\n",qPrintable(fileName));
+ parseConfig(fileName,m_options);
+}
+
+void Expert::saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,
+ bool brief)
+{
+ // write group header
+ t << endl;
+ t << "#---------------------------------------------------------------------------" << endl;
+ t << "# " << elem.attribute(SA("docs")) << endl;
+ t << "#---------------------------------------------------------------------------" << endl;
+
+ // write options...
+ QDomElement childElem = elem.firstChildElement();
+ while (!childElem.isNull())
+ {
+ QString type = childElem.attribute(SA("type"));
+ QString name = childElem.attribute(SA("id"));
+ QHash<QString,Input*>::const_iterator i = m_options.find(name);
+ if (i!=m_options.end())
+ {
+ Input *option = i.value();
+ if (!brief)
+ {
+ t << endl;
+ t << convertToComment(childElem.attribute(SA("docs")));
+ t << endl;
+ }
+ t << name.leftJustified(23) << "= ";
+ if (option)
+ {
+ option->writeValue(t,codec);
+ }
+ t << endl;
+ }
+ childElem = childElem.nextSiblingElement();
+ }
+
+}
+
+bool Expert::writeConfig(QTextStream &t,bool brief)
+{
+ if (!brief)
+ {
+ // write global header
+ t << "# Doxyfile " << versionString << endl << endl; // TODO: add version
+ t << "# This file describes the settings to be used by the documentation system\n";
+ t << "# doxygen (www.doxygen.org) for a project\n";
+ t << "#\n";
+ t << "# All text after a hash (#) is considered a comment and will be ignored\n";
+ t << "# The format is:\n";
+ t << "# TAG = value [value, ...]\n";
+ t << "# For lists items can also be appended using:\n";
+ t << "# TAG += value [value, ...]\n";
+ t << "# Values that contain spaces should be placed between quotes (\" \")\n";
+ }
+
+ QTextCodec *codec = 0;
+ Input *option = m_options[QString::fromAscii("DOXYFILE_ENCODING")];
+ if (option)
+ {
+ codec = QTextCodec::codecForName(option->value().toString().toAscii());
+ if (codec==0) // fallback: use UTF-8
+ {
+ codec = QTextCodec::codecForName("UTF-8");
+ }
+ }
+ QDomElement childElem = m_rootElement.firstChildElement();
+ while (!childElem.isNull())
+ {
+ saveTopic(t,childElem,codec,brief);
+ childElem = childElem.nextSiblingElement();
+ }
+ return true;
+}
+
+QByteArray Expert::saveInnerState () const
+{
+ return m_splitter->saveState();
+}
+
+bool Expert::restoreInnerState ( const QByteArray & state )
+{
+ return m_splitter->restoreState(state);
+}
+
+void Expert::showHelp(Input *option)
+{
+ if (!m_inShowHelp)
+ {
+ m_inShowHelp = TRUE;
+ m_helper->setText(
+ QString::fromAscii("<qt><b>")+option->id()+
+ QString::fromAscii("</b><br>")+
+ option->docs().
+ replace(QChar::fromAscii('\n'),QChar::fromAscii(' '))+
+ QString::fromAscii("<qt>")
+ );
+ m_inShowHelp = FALSE;
+ }
+}
+
+void Expert::nextTopic()
+{
+ m_topicStack->setCurrentIndex(m_topicStack->currentIndex()+1);
+ m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1);
+ m_prev->setEnabled(m_topicStack->currentIndex()!=0);
+ m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex()));
+}
+
+void Expert::prevTopic()
+{
+ m_topicStack->setCurrentIndex(m_topicStack->currentIndex()-1);
+ m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1);
+ m_prev->setEnabled(m_topicStack->currentIndex()!=0);
+ m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex()));
+}
+
+void Expert::resetToDefaults()
+{
+ //printf("Expert::makeDefaults()\n");
+ QHashIterator<QString,Input*> i(m_options);
+ while (i.hasNext())
+ {
+ i.next();
+ if (i.value())
+ {
+ i.value()->reset();
+ }
+ }
+}
+
+static bool stringVariantToBool(const QVariant &v)
+{
+ QString s = v.toString().toLower();
+ return s==QString::fromAscii("yes") || s==QString::fromAscii("true") || s==QString::fromAscii("1");
+}
+
+static bool getBoolOption(
+ const QHash<QString,Input*>&model,const QString &name)
+{
+ Input *option = model[name];
+ Q_ASSERT(option!=0);
+ return stringVariantToBool(option->value());
+}
+
+static QString getStringOption(
+ const QHash<QString,Input*>&model,const QString &name)
+{
+ Input *option = model[name];
+ Q_ASSERT(option!=0);
+ return option->value().toString();
+}
+
+
+bool Expert::htmlOutputPresent(const QString &workingDir) const
+{
+ bool generateHtml = getBoolOption(m_options,QString::fromAscii("GENERATE_HTML"));
+ if (!generateHtml || workingDir.isEmpty()) return false;
+ QString indexFile = getHtmlOutputIndex(workingDir);
+ QFileInfo fi(indexFile);
+ return fi.exists() && fi.isFile();
+}
+
+QString Expert::getHtmlOutputIndex(const QString &workingDir) const
+{
+ QString outputDir = getStringOption(m_options,QString::fromAscii("OUTPUT_DIRECTORY"));
+ QString htmlOutputDir = getStringOption(m_options,QString::fromAscii("HTML_OUTPUT"));
+ //printf("outputDir=%s\n",qPrintable(outputDir));
+ //printf("htmlOutputDir=%s\n",qPrintable(htmlOutputDir));
+ QString indexFile = workingDir;
+ if (QFileInfo(outputDir).isAbsolute()) // override
+ {
+ indexFile = outputDir;
+ }
+ else // append
+ {
+ indexFile += QString::fromAscii("/")+outputDir;
+ }
+ if (QFileInfo(htmlOutputDir).isAbsolute()) // override
+ {
+ indexFile = htmlOutputDir;
+ }
+ else // append
+ {
+ indexFile += QString::fromAscii("/")+htmlOutputDir;
+ }
+ indexFile+=QString::fromAscii("/index.html");
+ return indexFile;
+}
+
+bool Expert::pdfOutputPresent(const QString &workingDir) const
+{
+ bool generateLatex = getBoolOption(m_options,QString::fromAscii("GENERATE_LATEX"));
+ bool pdfLatex = getBoolOption(m_options,QString::fromAscii("USE_PDFLATEX"));
+ if (!generateLatex || !pdfLatex) return false;
+ QString latexOutput = getStringOption(m_options,QString::fromAscii("LATEX_OUTPUT"));
+ QString indexFile;
+ if (QFileInfo(latexOutput).isAbsolute())
+ {
+ indexFile = latexOutput+QString::fromAscii("/refman.pdf");
+ }
+ else
+ {
+ indexFile = workingDir+QString::fromAscii("/")+
+ latexOutput+QString::fromAscii("/refman.pdf");
+ }
+ QFileInfo fi(indexFile);
+ return fi.exists() && fi.isFile();
+}
+
diff --git a/addon/doxywizard/expert.h b/addon/doxywizard/expert.h
new file mode 100644
index 0000000..8d43161
--- /dev/null
+++ b/addon/doxywizard/expert.h
@@ -0,0 +1,65 @@
+#ifndef EXPERT_H
+#define EXPERT_H
+
+#include <QSplitter>
+#include <QDomElement>
+#include <QHash>
+
+class QTreeWidget;
+class QTreeWidgetItem;
+class QStackedWidget;
+class QSettings;
+class QTextEdit;
+class QTextCodec;
+class QPushButton;
+class Input;
+
+class Expert : public QSplitter
+{
+ Q_OBJECT
+
+ public:
+ Expert();
+ ~Expert();
+ void loadSettings(QSettings *);
+ void saveSettings(QSettings *);
+ void loadConfig(const QString &fileName);
+ bool writeConfig(QTextStream &t,bool brief);
+ QByteArray saveInnerState () const;
+ bool restoreInnerState ( const QByteArray & state );
+ const QHash<QString,Input*> &modelData() const { return m_options; }
+ void resetToDefaults();
+ bool htmlOutputPresent(const QString &workingDir) const;
+ bool pdfOutputPresent(const QString &workingDir) const;
+ QString getHtmlOutputIndex(const QString &workingDir) const;
+
+ public slots:
+ void activateTopic(QTreeWidgetItem *,QTreeWidgetItem *);
+ QWidget *createTopicWidget(QDomElement &elem);
+
+ private slots:
+ void showHelp(Input *);
+ void nextTopic();
+ void prevTopic();
+
+ signals:
+ void changed();
+
+ private:
+ void createTopics(const QDomElement &);
+ void saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,bool brief);
+
+ QSplitter *m_splitter;
+ QTextEdit *m_helper;
+ QTreeWidget *m_treeWidget;
+ QStackedWidget *m_topicStack;
+ QHash<QString,QWidget *> m_topics;
+ QHash<QString,QObject *> m_optionWidgets;
+ QHash<QString,Input *> m_options;
+ QPushButton *m_next;
+ QPushButton *m_prev;
+ QDomElement m_rootElement;
+ bool m_inShowHelp;
+};
+
+#endif
diff --git a/addon/doxywizard/helplabel.h b/addon/doxywizard/helplabel.h
new file mode 100644
index 0000000..07e2932
--- /dev/null
+++ b/addon/doxywizard/helplabel.h
@@ -0,0 +1,33 @@
+#ifndef HELPLABEL_H
+#define HELPLABEL_H
+
+#include <QLabel>
+#include <QMenu>
+
+class HelpLabel : public QLabel
+{
+ Q_OBJECT
+ public:
+ HelpLabel(const QString &text) : QLabel(text)
+ { setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(this,SIGNAL(customContextMenuRequested(const QPoint&)),
+ this,SLOT(showMenu(const QPoint&)));
+ }
+ signals:
+ void enter();
+ void reset();
+ private slots:
+ void showMenu(const QPoint &p)
+ {
+ QMenu menu(this);
+ QAction *a = menu.addAction(tr("Reset to default"));
+ if (menu.exec(mapToGlobal(p))==a)
+ {
+ reset();
+ }
+ }
+ protected:
+ void enterEvent( QEvent * event ) { enter(); QLabel::enterEvent(event); }
+};
+
+#endif
diff --git a/addon/doxywizard/images/add.png b/addon/doxywizard/images/add.png
new file mode 100644
index 0000000..30a7090
--- /dev/null
+++ b/addon/doxywizard/images/add.png
Binary files differ
diff --git a/addon/doxywizard/images/del.png b/addon/doxywizard/images/del.png
new file mode 100644
index 0000000..ceb6a60
--- /dev/null
+++ b/addon/doxywizard/images/del.png
Binary files differ
diff --git a/addon/doxywizard/images/file.png b/addon/doxywizard/images/file.png
new file mode 100644
index 0000000..e204f67
--- /dev/null
+++ b/addon/doxywizard/images/file.png
Binary files differ
diff --git a/addon/doxywizard/images/folder.png b/addon/doxywizard/images/folder.png
new file mode 100644
index 0000000..2e420e0
--- /dev/null
+++ b/addon/doxywizard/images/folder.png
Binary files differ
diff --git a/addon/doxywizard/images/refresh.png b/addon/doxywizard/images/refresh.png
new file mode 100644
index 0000000..fd6d565
--- /dev/null
+++ b/addon/doxywizard/images/refresh.png
Binary files differ
diff --git a/addon/doxywizard/images/tunecolor.png b/addon/doxywizard/images/tunecolor.png
new file mode 100644
index 0000000..bf7be83
--- /dev/null
+++ b/addon/doxywizard/images/tunecolor.png
Binary files differ
diff --git a/addon/doxywizard/input.h b/addon/doxywizard/input.h
new file mode 100644
index 0000000..dd1773c
--- /dev/null
+++ b/addon/doxywizard/input.h
@@ -0,0 +1,34 @@
+#ifndef INPUT_H
+#define INPUT_H
+
+#include <QVariant>
+
+class QTextStream;
+class QTextCodec;
+
+class Input
+{
+ public:
+ enum Kind
+ {
+ Bool,
+ Int,
+ String,
+ StrList,
+ Obsolete
+ };
+ virtual ~Input() {}
+ virtual QVariant &value() = 0;
+ virtual void update() = 0;
+ virtual Kind kind() const = 0;
+ virtual QString docs() const = 0;
+ virtual QString id() const = 0;
+ virtual void addDependency(Input *option) = 0;
+ virtual void setEnabled(bool) = 0;
+ virtual void updateDependencies() = 0;
+ virtual void reset() = 0;
+ virtual void writeValue(QTextStream &t,QTextCodec *codec) = 0;
+};
+
+
+#endif
diff --git a/addon/doxywizard/inputbool.cpp b/addon/doxywizard/inputbool.cpp
new file mode 100644
index 0000000..efbb5ee
--- /dev/null
+++ b/addon/doxywizard/inputbool.cpp
@@ -0,0 +1,110 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include "inputbool.h"
+#include "helplabel.h"
+#include <QtGui>
+
+InputBool::InputBool( QGridLayout *layout, int &row,
+ const QString &id, bool checked,
+ const QString &docs )
+ : m_default(checked), m_docs(docs), m_id(id)
+{
+ m_lab = new HelpLabel(id);
+ m_cb = new QCheckBox;
+ layout->addWidget(m_lab,row, 0);
+ layout->addWidget(m_cb,row, 1);
+ m_enabled = true;
+ m_state=!checked; // force update
+ setValue(checked);
+ connect( m_cb, SIGNAL(toggled(bool)), SLOT(setValue(bool)) );
+ connect( m_lab, SIGNAL(enter()), SLOT(help()) );
+ connect( m_lab, SIGNAL(reset()), SLOT(reset()) );
+ row++;
+}
+
+void InputBool::help()
+{
+ showHelp(this);
+}
+
+void InputBool::setEnabled(bool b)
+{
+ m_enabled = b;
+ m_cb->setEnabled(b);
+ updateDependencies();
+}
+
+void InputBool::updateDependencies()
+{
+ for (int i=0;i<m_dependencies.count();i++)
+ {
+ m_dependencies[i]->setEnabled(m_enabled && m_state);
+ }
+}
+
+void InputBool::setValue( bool s )
+{
+ if (m_state!=s)
+ {
+ m_state=s;
+ updateDefault();
+ updateDependencies();
+ m_cb->setChecked( s );
+ m_value = m_state;
+ emit changed();
+ }
+}
+
+void InputBool::updateDefault()
+{
+ if (m_state==m_default)
+ {
+ m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
+ }
+ else
+ {
+ m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
+ }
+}
+
+QVariant &InputBool::value()
+{
+ return m_value;
+}
+
+void InputBool::update()
+{
+ QString v = m_value.toString().toLower();
+ m_state = (v==QString::fromAscii("yes") ||
+ v==QString::fromAscii("true") ||
+ v==QString::fromAscii("1"));
+ m_cb->setChecked( m_state );
+ updateDefault();
+ updateDependencies();
+}
+
+void InputBool::reset()
+{
+ setValue(m_default);
+}
+
+void InputBool::writeValue(QTextStream &t,QTextCodec *codec)
+{
+ if (m_state)
+ t << codec->fromUnicode(QString::fromAscii("YES"));
+ else
+ t << codec->fromUnicode(QString::fromAscii("NO"));
+}
+
diff --git a/addon/doxywizard/inputbool.h b/addon/doxywizard/inputbool.h
new file mode 100644
index 0000000..a19de76
--- /dev/null
+++ b/addon/doxywizard/inputbool.h
@@ -0,0 +1,70 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _INPUTBOOL_H
+#define _INPUTBOOL_H
+
+#include "input.h"
+#include <QObject>
+
+class QCheckBox;
+class QGridLayout;
+class QLabel;
+
+class InputBool : public QObject, public Input
+{
+ Q_OBJECT
+
+ public:
+ InputBool(QGridLayout *layout,int &row,const QString &id,
+ bool enabled, const QString &docs );
+
+ // Input
+ QVariant &value();
+ void update();
+ Kind kind() const { return Bool; }
+ QString docs() const { return m_docs; }
+ QString id() const { return m_id; }
+ void addDependency(Input *option) { m_dependencies+=option; }
+ void setEnabled(bool);
+ void updateDependencies();
+ void writeValue(QTextStream &t,QTextCodec *codec);
+
+ public slots:
+ void reset();
+ void setValue(bool);
+
+ signals:
+ void changed();
+ void toggle(QString,bool);
+ void showHelp(Input *);
+
+ private slots:
+ void help();
+
+ private:
+ void updateDefault();
+ bool m_state;
+ bool m_default;
+ bool m_enabled;
+ QVariant m_value;
+ QCheckBox *m_cb;
+ QString m_docs;
+ QList<Input*> m_dependencies;
+ QString m_id;
+ QLabel *m_lab;
+
+};
+
+#endif
diff --git a/addon/doxywizard/inputint.cpp b/addon/doxywizard/inputint.cpp
new file mode 100644
index 0000000..48544bb
--- /dev/null
+++ b/addon/doxywizard/inputint.cpp
@@ -0,0 +1,96 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include "inputint.h"
+#include "helplabel.h"
+
+#include <QtGui>
+
+InputInt::InputInt( QGridLayout *layout,int &row,
+ const QString & id,
+ int defVal, int minVal,int maxVal,
+ const QString & docs )
+ : m_default(defVal), m_minVal(minVal), m_maxVal(maxVal), m_docs(docs), m_id(id)
+{
+ m_lab = new HelpLabel(id);
+ m_sp = new QSpinBox;
+ m_sp->setMinimum(minVal);
+ m_sp->setMaximum(maxVal);
+ m_sp->setSingleStep(1);
+ m_val=defVal-1; // force update
+ setValue(defVal);
+
+ layout->addWidget( m_lab, row, 0 );
+ layout->addWidget( m_sp, row, 1 );
+
+ connect(m_sp, SIGNAL(valueChanged(int)),
+ this, SLOT(setValue(int)) );
+ connect( m_lab, SIGNAL(enter()), SLOT(help()) );
+ connect( m_lab, SIGNAL(reset()), SLOT(reset()) );
+ row++;
+}
+
+void InputInt::help()
+{
+ showHelp(this);
+}
+
+
+void InputInt::setValue(int val)
+{
+ val = qMax(m_minVal,val);
+ val = qMin(m_maxVal,val);
+ if (val!=m_val)
+ {
+ m_val = val;
+ m_sp->setValue(val);
+ m_value = m_val;
+ if (m_val==m_default)
+ {
+ m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
+ }
+ else
+ {
+ m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
+ }
+ emit changed();
+ }
+}
+
+void InputInt::setEnabled(bool state)
+{
+ m_lab->setEnabled(state);
+ m_sp->setEnabled(state);
+}
+
+QVariant &InputInt::value()
+{
+ return m_value;
+}
+
+void InputInt::update()
+{
+ setValue(m_value.toInt());
+}
+
+void InputInt::reset()
+{
+ setValue(m_default);
+}
+
+void InputInt::writeValue(QTextStream &t,QTextCodec *)
+{
+ t << m_val;
+}
+
diff --git a/addon/doxywizard/inputint.h b/addon/doxywizard/inputint.h
new file mode 100644
index 0000000..31fcfbd
--- /dev/null
+++ b/addon/doxywizard/inputint.h
@@ -0,0 +1,70 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _INPUTINT_H
+#define _INPUTINT_H
+
+#include "input.h"
+#include <QObject>
+
+class QGridLayout;
+class QLabel;
+class QSpinBox;
+
+class InputInt : public QObject, public Input
+{
+ Q_OBJECT
+
+ public:
+ InputInt( QGridLayout *layout,int &row,
+ const QString &id, int defVal,
+ int minVal, int maxVal,
+ const QString &docs );
+ ~InputInt(){};
+
+ // Input
+ QVariant &value();
+ void update();
+ Kind kind() const { return Int; }
+ QString docs() const { return m_docs; }
+ QString id() const { return m_id; }
+ void addDependency(Input *) { Q_ASSERT(false); }
+ void setEnabled(bool);
+ void updateDependencies() {}
+ void writeValue(QTextStream &t,QTextCodec *codec);
+
+ public slots:
+ void reset();
+ void setValue(int val);
+
+ private slots:
+ void help();
+
+ signals:
+ void changed();
+ void showHelp(Input *);
+
+ private:
+ QLabel *m_lab;
+ QSpinBox *m_sp;
+ int m_val;
+ int m_default;
+ int m_minVal;
+ int m_maxVal;
+ QVariant m_value;
+ QString m_docs;
+ QString m_id;
+};
+
+#endif
diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp
new file mode 100644
index 0000000..538efce
--- /dev/null
+++ b/addon/doxywizard/inputstring.cpp
@@ -0,0 +1,193 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include "inputstring.h"
+#include "helplabel.h"
+#include "doxywizard.h"
+#include "config.h"
+
+#include <QtGui>
+
+InputString::InputString( QGridLayout *layout,int &row,
+ const QString & id, const QString &s,
+ StringMode m, const QString &docs,
+ const QString &absPath )
+ : m_default(s), m_sm(m), m_index(0), m_docs(docs), m_id(id),
+ m_absPath(absPath==QString::fromAscii("1"))
+{
+ m_lab = new HelpLabel(id);
+ if (m==StringFixed)
+ {
+ layout->addWidget( m_lab, row, 0 );
+ m_com = new QComboBox;
+ layout->addWidget( m_com, row, 1, 1, 3, Qt::AlignLeft );
+ m_le=0;
+ m_br=0;
+ row++;
+ }
+ else
+ {
+ layout->addWidget( m_lab, row, 0 );
+ m_le = new QLineEdit;
+ m_le->setText( s );
+ //layout->setColumnMinimumWidth(2,150);
+ if (m==StringFile || m==StringDir)
+ {
+ layout->addWidget( m_le, row, 1 );
+ m_br = new QToolBar;
+ m_br->setIconSize(QSize(24,24));
+ if (m==StringFile)
+ {
+ QAction *file = m_br->addAction(QIcon(QString::fromAscii(":/images/file.png")),QString(),this,SLOT(browse()));
+ file->setToolTip(tr("Browse to a file"));
+ }
+ else
+ {
+ QAction *dir = m_br->addAction(QIcon(QString::fromAscii(":/images/folder.png")),QString(),this,SLOT(browse()));
+ dir->setToolTip(tr("Browse to a folder"));
+ }
+ layout->addWidget( m_br,row,2 );
+ }
+ else
+ {
+ layout->addWidget( m_le, row, 1, 1, 2 );
+ m_br=0;
+ }
+ m_com=0;
+ row++;
+ }
+
+ if (m_le) connect( m_le, SIGNAL(textChanged(const QString&)),
+ this, SLOT(setValue(const QString&)) );
+ if (m_com) connect( m_com, SIGNAL(activated(const QString &)),
+ this, SLOT(setValue(const QString &)) );
+ m_str = s+QChar::fromAscii('!'); // force update
+ setValue(s);
+ connect( m_lab, SIGNAL(enter()), SLOT(help()) );
+ connect( m_lab, SIGNAL(reset()), SLOT(reset()) );
+}
+
+void InputString::help()
+{
+ showHelp(this);
+}
+
+
+InputString::~InputString()
+{
+}
+
+
+void InputString::setValue(const QString &s)
+{
+ if (m_str!=s)
+ {
+ m_str = s;
+ m_value = m_str;
+ if (m_str==m_default)
+ {
+ m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
+ }
+ else
+ {
+ m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
+ }
+ if (m_le && m_le->text()!=m_str) m_le->setText( m_str );
+ emit changed();
+ }
+}
+
+void InputString::setEnabled(bool state)
+{
+ m_lab->setEnabled(state);
+ if (m_le) m_le->setEnabled(state);
+ if (m_br) m_br->setEnabled(state);
+ if (m_com) m_com->setEnabled(state);
+}
+
+void InputString::browse()
+{
+ QString path = QFileInfo(MainWindow::instance().configFileName()).path();
+ if (m_sm==StringFile)
+ {
+ QString fileName = QFileDialog::getOpenFileName(&MainWindow::instance(),
+ tr("Select file"),path);
+ if (!fileName.isNull())
+ {
+ QDir dir(path);
+ if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
+ {
+ fileName = m_absPath ? fileName : dir.relativeFilePath(fileName);
+ }
+ setValue(fileName);
+ }
+ }
+ else // sm==StringDir
+ {
+ QString dirName = QFileDialog::getExistingDirectory(&MainWindow::instance(),
+ tr("Select directory"),path);
+ if (!dirName.isNull())
+ {
+ QDir dir(path);
+ if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
+ {
+ dirName = m_absPath ? dirName : dir.relativeFilePath(dirName);
+ }
+ setValue(dirName);
+ }
+ }
+}
+
+void InputString::clear()
+{
+ setValue(QString());
+}
+
+void InputString::addValue(QString s)
+{
+ if (m_sm==StringFixed)
+ {
+ m_values.append(s);
+ m_com->addItem(s);
+ }
+}
+
+void InputString::setDefault()
+{
+ int index = m_values.indexOf(m_str);
+ if (index!=-1 && m_com) m_com->setCurrentIndex(index);
+}
+
+QVariant &InputString::value()
+{
+ return m_value;
+}
+
+void InputString::update()
+{
+ setValue(m_value.toString().trimmed());
+ setDefault();
+}
+
+void InputString::reset()
+{
+ setValue(m_default);
+ setDefault();
+}
+
+void InputString::writeValue(QTextStream &t,QTextCodec *codec)
+{
+ writeStringValue(t,codec,m_str);
+}
+
diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h
new file mode 100644
index 0000000..940c9eb
--- /dev/null
+++ b/addon/doxywizard/inputstring.h
@@ -0,0 +1,90 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _INPUTSTRING_H
+#define _INPUTSTRING_H
+
+#include "input.h"
+
+#include <QObject>
+#include <QMap>
+#include <QStringList>
+
+class QLabel;
+class QLineEdit;
+class QToolBar;
+class QComboBox;
+class QGridLayout;
+
+class InputString : public QObject, public Input
+{
+ Q_OBJECT
+
+ public:
+ enum StringMode { StringFree=0,
+ StringFile=1,
+ StringDir=2,
+ StringFixed=3
+ };
+
+ InputString( QGridLayout *layout,int &row,
+ const QString &id, const QString &s,
+ StringMode m,
+ const QString &docs,
+ const QString &absPath = QString() );
+ ~InputString();
+ void addValue(QString s);
+ void setDefault();
+
+ // Input
+ QVariant &value();
+ void update();
+ Kind kind() const { return String; }
+ QString docs() const { return m_docs; }
+ QString id() const { return m_id; }
+ void addDependency(Input *) { Q_ASSERT(false); }
+ void setEnabled(bool);
+ void updateDependencies() {}
+ void writeValue(QTextStream &t,QTextCodec *codec);
+
+ public slots:
+ void reset();
+ void setValue(const QString&);
+
+ signals:
+ void changed();
+ void showHelp(Input *);
+
+ private slots:
+ void browse();
+ void clear();
+ void help();
+
+ private:
+ QLabel *m_lab;
+ QLineEdit *m_le;
+ QToolBar *m_br;
+ QComboBox *m_com;
+ QString m_str;
+ QString m_default;
+ StringMode m_sm;
+ QStringList m_values;
+ int m_index;
+ QVariant m_value;
+ QString m_docs;
+ QString m_id;
+ bool m_absPath;
+};
+
+#endif
diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp
new file mode 100644
index 0000000..3be7dd5
--- /dev/null
+++ b/addon/doxywizard/inputstrlist.cpp
@@ -0,0 +1,254 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#include "inputstrlist.h"
+#include "helplabel.h"
+#include "doxywizard.h"
+#include "config.h"
+
+#include <QtGui>
+
+InputStrList::InputStrList( QGridLayout *layout,int &row,
+ const QString & id,
+ const QStringList &sl, ListMode lm,
+ const QString & docs)
+ : m_default(sl), m_strList(sl), m_docs(docs), m_id(id)
+{
+ m_lab = new HelpLabel( id );
+
+ m_le = new QLineEdit;
+ m_le->clear();
+
+ QToolBar *toolBar = new QToolBar;
+ toolBar->setIconSize(QSize(24,24));
+ m_add = toolBar->addAction(QIcon(QString::fromAscii(":/images/add.png")),QString(),
+ this,SLOT(addString()));
+ m_add->setToolTip(tr("Add item"));
+ m_del = toolBar->addAction(QIcon(QString::fromAscii(":/images/del.png")),QString(),
+ this,SLOT(delString()));
+ m_del->setToolTip(tr("Delete selected item"));
+ m_upd = toolBar->addAction(QIcon(QString::fromAscii(":/images/refresh.png")),QString(),
+ this,SLOT(updateString()));
+ m_upd->setToolTip(tr("Update selected item"));
+
+ m_lb = new QListWidget;
+ //m_lb->setMinimumSize(400,100);
+ foreach (QString s, m_strList) m_lb->addItem(s);
+
+ m_brFile=0;
+ m_brDir=0;
+ if (lm!=ListString)
+ {
+ if (lm&ListFile)
+ {
+ m_brFile = toolBar->addAction(QIcon(QString::fromAscii(":/images/file.png")),QString(),
+ this,SLOT(browseFiles()));
+ m_brFile->setToolTip(tr("Browse to a file"));
+ }
+ if (lm&ListDir)
+ {
+ m_brDir = toolBar->addAction(QIcon(QString::fromAscii(":/images/folder.png")),QString(),
+ this,SLOT(browseDir()));
+ m_brDir->setToolTip(tr("Browse to a folder"));
+ }
+ }
+ QHBoxLayout *rowLayout = new QHBoxLayout;
+ rowLayout->addWidget( m_le );
+ rowLayout->addWidget( toolBar );
+ layout->addWidget( m_lab, row,0 );
+ layout->addLayout( rowLayout, row,1,1,2 );
+ layout->addWidget( m_lb, row+1,1,1,2 );
+ row+=2;
+
+ m_value = m_strList;
+
+ connect(m_le, SIGNAL(returnPressed()),
+ this, SLOT(addString()) );
+ connect(m_lb, SIGNAL(currentTextChanged(const QString &)),
+ this, SLOT(selectText(const QString &)));
+ connect( m_lab, SIGNAL(enter()), SLOT(help()) );
+ connect( m_lab, SIGNAL(reset()), SLOT(reset()) );
+}
+
+void InputStrList::help()
+{
+ showHelp(this);
+}
+
+
+void InputStrList::addString()
+{
+ if (!m_le->text().isEmpty())
+ {
+ m_lb->addItem(m_le->text());
+ m_strList.append(m_le->text());
+ m_value = m_strList;
+ updateDefault();
+ emit changed();
+ m_le->clear();
+ }
+}
+
+void InputStrList::delString()
+{
+ if (m_lb->currentRow()!=-1)
+ {
+ int itemIndex = m_lb->currentRow();
+ delete m_lb->currentItem();
+ m_strList.removeAt(itemIndex);
+ m_value = m_strList;
+ updateDefault();
+ emit changed();
+ }
+}
+
+void InputStrList::updateString()
+{
+ if (m_lb->currentRow()!=-1 && !m_le->text().isEmpty())
+ {
+ m_lb->currentItem()->setText(m_le->text());
+ m_strList.insert(m_lb->currentRow(),m_le->text());
+ m_strList.removeAt(m_lb->currentRow()+1);
+ m_value = m_strList;
+ updateDefault();
+ emit changed();
+ }
+}
+
+void InputStrList::selectText(const QString &s)
+{
+ m_le->setText(s);
+}
+
+void InputStrList::setEnabled(bool state)
+{
+ m_lab->setEnabled(state);
+ m_le->setEnabled(state);
+ m_add->setEnabled(state);
+ m_del->setEnabled(state);
+ m_upd->setEnabled(state);
+ m_lb->setEnabled(state);
+ if (m_brFile) m_brFile->setEnabled(state);
+ if (m_brDir) m_brDir->setEnabled(state);
+}
+
+void InputStrList::browseFiles()
+{
+ QString path = QFileInfo(MainWindow::instance().configFileName()).path();
+ QStringList fileNames = QFileDialog::getOpenFileNames();
+
+ if (!fileNames.isEmpty())
+ {
+ QStringList::Iterator it;
+ for ( it= fileNames.begin(); it != fileNames.end(); ++it )
+ {
+ QString fileName;
+ QDir dir(path);
+ if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
+ {
+ fileName = dir.relativeFilePath(*it);
+ }
+ if (fileName.isEmpty())
+ {
+ fileName = *it;
+ }
+ m_lb->addItem(fileName);
+ m_strList.append(fileName);
+ m_value = m_strList;
+ updateDefault();
+ emit changed();
+ }
+ m_le->setText(m_strList[0]);
+ }
+}
+
+void InputStrList::browseDir()
+{
+ QString path = QFileInfo(MainWindow::instance().configFileName()).path();
+ QString dirName = QFileDialog::getExistingDirectory();
+
+ if (!dirName.isNull())
+ {
+ QDir dir(path);
+ if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
+ {
+ dirName = dir.relativeFilePath(dirName);
+ }
+ if (dirName.isEmpty())
+ {
+ dirName=QString::fromAscii(".");
+ }
+ m_lb->addItem(dirName);
+ m_strList.append(dirName);
+ m_value = m_strList;
+ updateDefault();
+ emit changed();
+ m_le->setText(dirName);
+ }
+}
+
+void InputStrList::setValue(const QStringList &sl)
+{
+ m_le->clear();
+ m_lb->clear();
+ m_strList = sl;
+ for (int i=0;i<m_strList.size();i++)
+ {
+ m_lb->addItem(m_strList[i].trimmed());
+ }
+ updateDefault();
+}
+
+QVariant &InputStrList::value()
+{
+ return m_value;
+}
+
+void InputStrList::update()
+{
+ setValue(m_value.toStringList());
+}
+
+void InputStrList::updateDefault()
+{
+ if (m_strList==m_default)
+ {
+ m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
+ }
+ else
+ {
+ m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
+ }
+}
+
+void InputStrList::reset()
+{
+ setValue(m_default);
+}
+
+void InputStrList::writeValue(QTextStream &t,QTextCodec *codec)
+{
+ bool first=TRUE;
+ foreach (QString s, m_strList)
+ {
+ if (!first)
+ {
+ t << " \\" << endl;
+ t << " ";
+ }
+ first=FALSE;
+ writeStringValue(t,codec,s);
+ }
+}
+
diff --git a/addon/doxywizard/inputstrlist.h b/addon/doxywizard/inputstrlist.h
new file mode 100644
index 0000000..9dc43d7
--- /dev/null
+++ b/addon/doxywizard/inputstrlist.h
@@ -0,0 +1,91 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _INPUTSTRLIST_H
+#define _INPUTSTRLIST_H
+
+#include "input.h"
+
+#include <QObject>
+#include <QStringList>
+
+class QLabel;
+class QLineEdit;
+class QPushButton;
+class QListWidget;
+class QStringList;
+class QGridLayout;
+class QAction;
+
+class InputStrList : public QObject, public Input
+{
+ Q_OBJECT
+
+ public:
+ enum ListMode { ListString = 0,
+ ListFile = 1,
+ ListDir = 2,
+ ListFileDir = ListFile | ListDir
+ };
+
+ InputStrList( QGridLayout *layout,int &row,
+ const QString &id, const QStringList &sl,
+ ListMode v, const QString &docs);
+ void setValue(const QStringList &sl);
+
+ QVariant &value();
+ void update();
+ Kind kind() const { return StrList; }
+ QString docs() const { return m_docs; }
+ QString id() const { return m_id; }
+ void addDependency(Input *) { Q_ASSERT(false); }
+ void setEnabled(bool);
+ void updateDependencies() {}
+ void writeValue(QTextStream &t,QTextCodec *codec);
+
+ public slots:
+ void reset();
+
+ signals:
+ void changed();
+ void showHelp(Input *);
+
+ private slots:
+ void addString();
+ void delString();
+ void updateString();
+ void selectText(const QString &s);
+ void browseFiles();
+ void browseDir();
+ void help();
+
+ private:
+ void updateDefault();
+ QLabel *m_lab;
+ QLineEdit *m_le;
+ QAction *m_add;
+ QAction *m_del;
+ QAction *m_upd;
+ QAction *m_brFile;
+ QAction *m_brDir;
+ QListWidget *m_lb;
+ QStringList m_default;
+ QStringList m_strList;
+ QVariant m_value;
+ QString m_docs;
+ QString m_id;
+
+};
+
+#endif
diff --git a/addon/doxywizard/version.h b/addon/doxywizard/version.h
new file mode 100644
index 0000000..116ecdd
--- /dev/null
+++ b/addon/doxywizard/version.h
@@ -0,0 +1,23 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef VERSION_H
+#define VERSION_H
+
+extern char versionString[];
+
+#endif
diff --git a/addon/doxywizard/wizard.cpp b/addon/doxywizard/wizard.cpp
new file mode 100644
index 0000000..ce989e7
--- /dev/null
+++ b/addon/doxywizard/wizard.cpp
@@ -0,0 +1,1295 @@
+#include "wizard.h"
+#include "input.h"
+#include "doxywizard.h"
+
+#include <math.h>
+#include <QtGui>
+
+// options configurable via the wizard
+#define STR_PROJECT_NAME QString::fromAscii("PROJECT_NAME")
+#define STR_PROJECT_LOGO QString::fromAscii("PROJECT_LOGO")
+#define STR_PROJECT_BRIEF QString::fromAscii("PROJECT_BRIEF")
+#define STR_INPUT QString::fromAscii("INPUT")
+#define STR_OUTPUT_DIRECTORY QString::fromAscii("OUTPUT_DIRECTORY")
+#define STR_PROJECT_NUMBER QString::fromAscii("PROJECT_NUMBER")
+#define STR_RECURSIVE QString::fromAscii("RECURSIVE")
+#define STR_OPTIMIZE_OUTPUT_FOR_C QString::fromAscii("OPTIMIZE_OUTPUT_FOR_C")
+#define STR_OPTIMIZE_OUTPUT_JAVA QString::fromAscii("OPTIMIZE_OUTPUT_JAVA")
+#define STR_OPTIMIZE_FOR_FORTRAN QString::fromAscii("OPTIMIZE_FOR_FORTRAN")
+#define STR_OPTIMIZE_OUTPUT_VHDL QString::fromAscii("OPTIMIZE_OUTPUT_VHDL")
+#define STR_CPP_CLI_SUPPORT QString::fromAscii("CPP_CLI_SUPPORT")
+#define STR_HIDE_SCOPE_NAMES QString::fromAscii("HIDE_SCOPE_NAMES")
+#define STR_EXTRACT_ALL QString::fromAscii("EXTRACT_ALL")
+#define STR_SOURCE_BROWSER QString::fromAscii("SOURCE_BROWSER")
+#define STR_GENERATE_HTML QString::fromAscii("GENERATE_HTML")
+#define STR_GENERATE_LATEX QString::fromAscii("GENERATE_LATEX")
+#define STR_GENERATE_MAN QString::fromAscii("GENERATE_MAN")
+#define STR_GENERATE_RTF QString::fromAscii("GENERATE_RTF")
+#define STR_GENERATE_XML QString::fromAscii("GENERATE_XML")
+#define STR_GENERATE_HTMLHELP QString::fromAscii("GENERATE_HTMLHELP")
+#define STR_GENERATE_TREEVIEW QString::fromAscii("GENERATE_TREEVIEW")
+#define STR_USE_PDFLATEX QString::fromAscii("USE_PDFLATEX")
+#define STR_PDF_HYPERLINKS QString::fromAscii("PDF_HYPERLINKS")
+#define STR_SEARCHENGINE QString::fromAscii("SEARCHENGINE")
+#define STR_HAVE_DOT QString::fromAscii("HAVE_DOT")
+#define STR_CLASS_DIAGRAMS QString::fromAscii("CLASS_DIAGRAMS")
+#define STR_CLASS_GRAPH QString::fromAscii("CLASS_GRAPH")
+#define STR_COLLABORATION_GRAPH QString::fromAscii("COLLABORATION_GRAPH")
+#define STR_GRAPHICAL_HIERARCHY QString::fromAscii("GRAPHICAL_HIERARCHY")
+#define STR_INCLUDE_GRAPH QString::fromAscii("INCLUDE_GRAPH")
+#define STR_INCLUDED_BY_GRAPH QString::fromAscii("INCLUDED_BY_GRAPH")
+#define STR_CALL_GRAPH QString::fromAscii("CALL_GRAPH")
+#define STR_CALLER_GRAPH QString::fromAscii("CALLER_GRAPH")
+#define STR_HTML_COLORSTYLE_HUE QString::fromAscii("HTML_COLORSTYLE_HUE")
+#define STR_HTML_COLORSTYLE_SAT QString::fromAscii("HTML_COLORSTYLE_SAT")
+#define STR_HTML_COLORSTYLE_GAMMA QString::fromAscii("HTML_COLORSTYLE_GAMMA")
+
+static bool g_optimizeMapping[6][6] =
+{
+ // A: OPTIMIZE_OUTPUT_FOR_C
+ // B: OPTIMIZE_OUTPUT_JAVA
+ // C: OPTIMIZE_FOR_FORTRAN
+ // D: OPTIMIZE_OUTPUT_VHDL
+ // E: CPP_CLI_SUPPORT
+ // F: HIDE_SCOPE_NAMES
+ // A B C D E F
+ { false,false,false,false,false,false }, // 0: C++
+ { false,false,false,false,true, false }, // 1: C++/CLI
+ { false,true, false,false,false,false }, // 2: C#/Java
+ { true, false,false,false,false,true }, // 3: C/PHP
+ { false,false,true, false,false,false }, // 4: Fortran
+ { false,false,false,true, false,false }, // 5: VHDL
+};
+
+static QString g_optimizeOptionNames[6] =
+{
+ STR_OPTIMIZE_OUTPUT_FOR_C,
+ STR_OPTIMIZE_OUTPUT_JAVA,
+ STR_OPTIMIZE_FOR_FORTRAN,
+ STR_OPTIMIZE_OUTPUT_VHDL,
+ STR_CPP_CLI_SUPPORT,
+ STR_HIDE_SCOPE_NAMES
+};
+
+//==========================================================================
+
+static bool stringVariantToBool(const QVariant &v)
+{
+ QString s = v.toString().toLower();
+ return s==QString::fromAscii("yes") || s==QString::fromAscii("true") || s==QString::fromAscii("1");
+}
+
+static bool getBoolOption(
+ const QHash<QString,Input*>&model,const QString &name)
+{
+ Input *option = model[name];
+ Q_ASSERT(option!=0);
+ return stringVariantToBool(option->value());
+}
+
+static int getIntOption(
+ const QHash<QString,Input*>&model,const QString &name)
+{
+ Input *option = model[name];
+ Q_ASSERT(option!=0);
+ return option->value().toInt();
+}
+
+static QString getStringOption(
+ const QHash<QString,Input*>&model,const QString &name)
+{
+ Input *option = model[name];
+ Q_ASSERT(option!=0);
+ return option->value().toString();
+}
+
+static void updateBoolOption(
+ const QHash<QString,Input*>&model,const QString &name,bool bNew)
+{
+ Input *option = model[name];
+ Q_ASSERT(option!=0);
+ bool bOld = stringVariantToBool(option->value());
+ if (bOld!=bNew)
+ {
+ option->value()=QString::fromAscii(bNew ? "true" : "false");
+ option->update();
+ }
+}
+
+static void updateIntOption(
+ const QHash<QString,Input*>&model,const QString &name,int iNew)
+{
+ Input *option = model[name];
+ Q_ASSERT(option!=0);
+ int iOld = option->value().toInt();
+ if (iOld!=iNew)
+ {
+ option->value()=QString::fromAscii("%1").arg(iNew);
+ option->update();
+ }
+}
+
+
+static void updateStringOption(
+ const QHash<QString,Input*>&model,const QString &name,const QString &s)
+{
+ Input *option = model[name];
+ Q_ASSERT(option!=0);
+ if (option->value().toString()!=s)
+ {
+ option->value() = s;
+ option->update();
+ }
+}
+
+//==========================================================================
+
+TuneColorDialog::TuneColorDialog(int hue,int sat,int gamma,QWidget *parent) : QDialog(parent)
+{
+ setWindowTitle(tr("Tune the color of the HTML output"));
+ QGridLayout *layout = new QGridLayout(this);
+ m_image = new QImage(QString::fromAscii(":/images/tunecolor.png"));
+ m_imageLab = new QLabel;
+ updateImage(hue,sat,gamma);
+ layout->addWidget(new QLabel(tr("Example output: use the sliders on the right to adjust the color")),0,0);
+ layout->addWidget(m_imageLab,1,0);
+ QHBoxLayout *buttonsLayout = new QHBoxLayout;
+
+ QPushButton *okButton = new QPushButton(tr("Ok"));
+ connect(okButton,SIGNAL(clicked()),SLOT(accept()));
+ okButton->setDefault(true);
+ QPushButton *cancelButton = new QPushButton(tr("Cancel"));
+ connect(cancelButton,SIGNAL(clicked()),SLOT(reject()));
+
+ ColorPicker *huePicker = new ColorPicker(ColorPicker::Hue);
+ huePicker->setCol(hue,sat,gamma);
+ huePicker->setFixedWidth(20);
+ layout->addWidget(huePicker,1,1);
+ ColorPicker *satPicker = new ColorPicker(ColorPicker::Saturation);
+ satPicker->setCol(hue,sat,gamma);
+ satPicker->setFixedWidth(20);
+ layout->addWidget(satPicker,1,2);
+ ColorPicker *gamPicker = new ColorPicker(ColorPicker::Gamma);
+ gamPicker->setCol(hue,sat,gamma);
+ gamPicker->setFixedWidth(20);
+ layout->addWidget(gamPicker,1,3);
+
+ connect(huePicker,SIGNAL(newHsv(int,int,int)),satPicker,SLOT(setCol(int,int,int)));
+ connect(satPicker,SIGNAL(newHsv(int,int,int)),huePicker,SLOT(setCol(int,int,int)));
+ connect(huePicker,SIGNAL(newHsv(int,int,int)),gamPicker,SLOT(setCol(int,int,int)));
+ connect(satPicker,SIGNAL(newHsv(int,int,int)),gamPicker,SLOT(setCol(int,int,int)));
+ connect(gamPicker,SIGNAL(newHsv(int,int,int)),satPicker,SLOT(setCol(int,int,int)));
+ connect(gamPicker,SIGNAL(newHsv(int,int,int)),huePicker,SLOT(setCol(int,int,int)));
+ connect(huePicker,SIGNAL(newHsv(int,int,int)),this,SLOT(updateImage(int,int,int)));
+ connect(satPicker,SIGNAL(newHsv(int,int,int)),this,SLOT(updateImage(int,int,int)));
+ connect(gamPicker,SIGNAL(newHsv(int,int,int)),this,SLOT(updateImage(int,int,int)));
+
+ buttonsLayout->addStretch();
+ buttonsLayout->addWidget(okButton);
+ buttonsLayout->addWidget(cancelButton);
+ layout->addLayout(buttonsLayout,5,0,1,4);
+}
+
+void hsl2rgb(double h,double s,double l,
+ double *pRed,double *pGreen,double *pBlue)
+{
+ double v;
+ double r,g,b;
+
+ r = l; // default to gray
+ g = l;
+ b = l;
+ v = (l <= 0.5) ? (l * (1.0 + s)) : (l + s - l * s);
+ if (v > 0)
+ {
+ double m;
+ double sv;
+ int sextant;
+ double fract, vsf, mid1, mid2;
+
+ m = l + l - v;
+ sv = (v - m ) / v;
+ h *= 6.0;
+ sextant = (int)h;
+ fract = h - sextant;
+ vsf = v * sv * fract;
+ mid1 = m + vsf;
+ mid2 = v - vsf;
+ switch (sextant)
+ {
+ case 0:
+ r = v;
+ g = mid1;
+ b = m;
+ break;
+ case 1:
+ r = mid2;
+ g = v;
+ b = m;
+ break;
+ case 2:
+ r = m;
+ g = v;
+ b = mid1;
+ break;
+ case 3:
+ r = m;
+ g = mid2;
+ b = v;
+ break;
+ case 4:
+ r = mid1;
+ g = m;
+ b = v;
+ break;
+ case 5:
+ r = v;
+ g = m;
+ b = mid2;
+ break;
+ }
+ }
+ *pRed = r;
+ *pGreen = g;
+ *pBlue = b;
+}
+
+
+
+void TuneColorDialog::updateImage(int hue,int sat,int gam)
+{
+ QImage coloredImg(m_image->width(),m_image->height(),QImage::Format_RGB32);
+ uint *srcPixel = (uint *)m_image->scanLine(0);
+ uint *dstPixel = (uint *)coloredImg.scanLine(0);
+ uint nrPixels = coloredImg.width()*coloredImg.height();
+ for (uint i=0;i<nrPixels;i++,srcPixel++,dstPixel++)
+ {
+ QColor c = QColor::fromRgb(*srcPixel);
+ double r,g,b;
+ hsl2rgb(hue/359.0, sat/255.0, pow(c.green()/255.0,gam/100.0),&r,&g,&b);
+ *dstPixel = qRgb((int)(r*255.0),(int)(g*255.0),(int)(b*255.0));
+ }
+ m_imageLab->setPixmap(QPixmap::fromImage(coloredImg));
+ m_hue = hue;
+ m_sat = sat;
+ m_gam = gam;
+}
+
+int TuneColorDialog::getHue() const
+{
+ return m_hue;
+}
+
+int TuneColorDialog::getSaturation() const
+{
+ return m_sat;
+}
+
+int TuneColorDialog::getGamma() const
+{
+ return m_gam;
+}
+
+//==========================================================================
+
+ColorPicker::ColorPicker(Mode m)
+{
+ m_hue = 220;
+ m_gam = 100;
+ m_sat = 100;
+ m_mode = m;
+ m_pix = 0;
+}
+
+ColorPicker::~ColorPicker()
+{
+ delete m_pix;
+}
+
+void ColorPicker::paintEvent(QPaintEvent*)
+{
+ int w = width() - 5;
+
+ QRect r(0, foff, w, height() - 2*foff);
+ int wi = r.width() - 2;
+ int hi = r.height() - 2;
+ if (!m_pix || m_pix->height() != hi || m_pix->width() != wi)
+ {
+ delete m_pix;
+ QImage img(wi, hi, QImage::Format_RGB32);
+ int y;
+ uint *pixel = (uint *) img.scanLine(0);
+ for (y = 0; y < hi; y++)
+ {
+ const uint *end = pixel + wi;
+ int yh = y2hue(y+coff);
+ int ys = y2sat(y+coff);
+ int yg = y2gam(y+coff);
+ while (pixel < end)
+ {
+ QColor c;
+ c.setHsv(yh, ys, (int)(255*pow(0.7,yg/100.0)));
+ *pixel = c.rgb();
+ ++pixel;
+ }
+ }
+ m_pix = new QPixmap(QPixmap::fromImage(img));
+ }
+ QPainter p(this);
+ p.drawPixmap(1, coff, *m_pix);
+ const QPalette &g = palette();
+ qDrawShadePanel(&p, r, g, true);
+ p.setPen(g.foreground().color());
+ p.setBrush(g.foreground());
+ QPolygon a;
+ int y = m_mode==Hue ? hue2y(m_hue) :
+ m_mode==Saturation ? sat2y(m_sat) :
+ gam2y(m_gam);
+ a.setPoints(3, w, y, w+5, y+5, w+5, y-5);
+ p.eraseRect(w, 0, 5, height());
+ p.drawPolygon(a);
+}
+
+void ColorPicker::mouseMoveEvent(QMouseEvent *m)
+{
+ if (m_mode==Hue) setHue(y2hue(m->y()));
+ else if (m_mode==Saturation) setSat(y2sat(m->y()));
+ else setGam(y2gam(m->y()));
+}
+
+void ColorPicker::mousePressEvent(QMouseEvent *m)
+{
+ if (m_mode==Hue) setHue(y2hue(m->y()));
+ else if (m_mode==Saturation) setSat(y2sat(m->y()));
+ else setGam(y2gam(m->y()));
+}
+
+void ColorPicker::setHue(int h)
+{
+ if (h==m_hue) return;
+ m_hue = qMax(0,qMin(h,359));
+ delete m_pix; m_pix=0;
+ repaint();
+ emit newHsv(m_hue,m_sat,m_gam);
+}
+
+void ColorPicker::setSat(int s)
+{
+ if (s==m_sat) return;
+ m_sat = qMax(0,qMin(s,255));
+ delete m_pix; m_pix=0;
+ repaint();
+ emit newHsv(m_hue,m_sat,m_gam);
+}
+
+void ColorPicker::setGam(int g)
+{
+ if (g==m_gam) return;
+ m_gam = qMax(40,qMin(g,240));
+ delete m_pix; m_pix=0;
+ repaint();
+ emit newHsv(m_hue,m_sat,m_gam);
+}
+
+void ColorPicker::setCol(int h, int s, int g)
+{
+ if (m_hue!=h || m_sat!=s || m_gam!=g)
+ {
+ m_hue = h;
+ m_sat = s;
+ m_gam = g;
+ delete m_pix; m_pix=0;
+ repaint();
+ }
+}
+
+int ColorPicker::y2hue(int y)
+{
+ int d = height() - 2*coff - 1;
+ return m_mode==Hue ? (y - coff)*359/d : m_hue;
+}
+
+int ColorPicker::hue2y(int v)
+{
+ int d = height() - 2*coff - 1;
+ return coff + v*d/359;
+}
+
+int ColorPicker::y2sat(int y)
+{
+ int d = height() - 2*coff - 1;
+ return m_mode==Saturation ? 255 - (y - coff)*255/d : m_sat;
+}
+
+int ColorPicker::sat2y(int v)
+{
+ int d = height() - 2*coff - 1;
+ return coff + (255-v)*d/255;
+}
+
+int ColorPicker::y2gam(int y)
+{
+ int d = height() - 2*coff - 1;
+ return m_mode==Gamma ? 240 - (y - coff)*200/d : m_gam;
+}
+
+int ColorPicker::gam2y(int g)
+{
+ int d = height() - 2*coff - 1;
+ return coff + (240-g)*d/200;
+}
+
+//==========================================================================
+
+Step1::Step1(Wizard *wizard,const QHash<QString,Input*> &modelData) : m_wizard(wizard), m_modelData(modelData)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setMargin(4);
+ layout->setSpacing(8);
+ QLabel *l = new QLabel(this);
+ l->setText(tr("Provide some information "
+ "about the project you are documenting"));
+ layout->addWidget(l);
+ QWidget *w = new QWidget( this );
+ QGridLayout *grid = new QGridLayout(w);
+ grid->setSpacing(10);
+
+ // project name
+ QLabel *projName = new QLabel(this);
+ projName->setText(tr("Project name:"));
+ projName->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+ // project brief
+ QLabel *projBrief = new QLabel(this);
+ projBrief->setText(tr("Project synopsis:"));
+ projBrief->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+ // project version
+ QLabel *projVersion = new QLabel(this);
+ projVersion->setText(tr("Project version or id:"));
+ projVersion->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+ // project icon
+ QLabel *projLogo = new QLabel(this);
+ projLogo->setText(tr("Project logo:"));
+ projLogo->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+
+ grid->addWidget(projName,0,0);
+ grid->addWidget(projBrief,1,0);
+ grid->addWidget(projVersion,2,0);
+ grid->addWidget(projLogo,3,0);
+
+ m_projName = new QLineEdit;
+ m_projBrief = new QLineEdit;
+ m_projNumber = new QLineEdit;
+ QPushButton *projIconSel = new QPushButton(this);
+ projIconSel->setText(tr("Select..."));
+ QPixmap pm(QSize(120,55));
+ pm.fill();
+ m_projIconLab = new QLabel;
+ m_projIconLab->setPixmap(pm);
+
+ grid->addWidget(m_projName,0,1,1,2);
+ grid->addWidget(m_projBrief,1,1,1,2);
+ grid->addWidget(m_projNumber,2,1,1,2);
+ grid->addWidget(projIconSel,3,1);
+ grid->addWidget(m_projIconLab,3,2);
+
+ grid->setColumnStretch(2,1);
+
+ w->setLayout(grid);
+
+ layout->addWidget(w);
+
+ //---------------------------------------------------
+ QFrame *f = new QFrame( this );
+ f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
+ layout->addWidget(f);
+
+ l = new QLabel(this);
+ l->setText(tr("Specify the directory to scan for source code"));
+ layout->addWidget(l);
+ QWidget *row = new QWidget;
+ QHBoxLayout *rowLayout = new QHBoxLayout(row);
+ rowLayout->setSpacing(10);
+ l = new QLabel(this);
+ l->setText(tr("Source code directory:"));
+ rowLayout->addWidget(l);
+ m_sourceDir = new QLineEdit;
+ m_srcSelectDir = new QPushButton(this);
+ m_srcSelectDir->setText(tr("Select..."));
+ rowLayout->addWidget(m_sourceDir);
+ rowLayout->addWidget(m_srcSelectDir);
+ layout->addWidget(row);
+
+ m_recursive = new QCheckBox(this);
+ m_recursive->setText(tr("Scan recursively"));
+ m_recursive->setChecked(TRUE);
+ layout->addWidget(m_recursive);
+
+ //---------------------------------------------------
+ f = new QFrame( this );
+ f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
+ layout->addWidget(f);
+
+ l = new QLabel(this);
+ l->setText(tr("Specify the directory where doxygen should "
+ "put the generated documentation"));
+ layout->addWidget(l);
+ row = new QWidget;
+ rowLayout = new QHBoxLayout(row);
+ rowLayout->setSpacing(10);
+ l = new QLabel(this);
+ l->setText(tr("Destination directory:"));
+ rowLayout->addWidget(l);
+ m_destDir = new QLineEdit;
+ m_dstSelectDir = new QPushButton(this);
+ m_dstSelectDir->setText(tr("Select..."));
+ rowLayout->addWidget(m_destDir);
+ rowLayout->addWidget(m_dstSelectDir);
+ layout->addWidget(row);
+ layout->addStretch(1);
+ setLayout(layout);
+
+ connect(projIconSel,SIGNAL(clicked()),
+ this,SLOT(selectProjectIcon()));
+ connect(m_srcSelectDir,SIGNAL(clicked()),
+ this,SLOT(selectSourceDir()));
+ connect(m_dstSelectDir,SIGNAL(clicked()),
+ this,SLOT(selectDestinationDir()));
+ connect(m_projName,SIGNAL(textChanged(const QString &)),SLOT(setProjectName(const QString &)));
+ connect(m_projBrief,SIGNAL(textChanged(const QString &)),SLOT(setProjectBrief(const QString &)));
+ connect(m_projNumber,SIGNAL(textChanged(const QString &)),SLOT(setProjectNumber(const QString &)));
+ connect(m_sourceDir,SIGNAL(textChanged(const QString &)),SLOT(setSourceDir(const QString &)));
+ connect(m_recursive,SIGNAL(stateChanged(int)),SLOT(setRecursiveScan(int)));
+ connect(m_destDir,SIGNAL(textChanged(const QString &)),SLOT(setDestinationDir(const QString &)));
+}
+
+void Step1::selectProjectIcon()
+{
+ QString path = QFileInfo(MainWindow::instance().configFileName()).path();
+ QString iconName = QFileDialog::getOpenFileName(this,
+ tr("Select project icon/image"),path);
+ QPixmap pm(iconName);
+ if (!pm.isNull())
+ {
+ m_projIconLab->setPixmap(pm.scaledToHeight(55,Qt::SmoothTransformation));
+ updateStringOption(m_modelData,STR_PROJECT_LOGO,iconName);
+ }
+}
+
+void Step1::selectSourceDir()
+{
+ QString path = QFileInfo(MainWindow::instance().configFileName()).path();
+ QString dirName = QFileDialog::getExistingDirectory(this,
+ tr("Select source directory"),path);
+ QDir dir(path);
+ if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
+ {
+ dirName = dir.relativeFilePath(dirName);
+ }
+ if (dirName.isEmpty())
+ {
+ dirName=QString::fromAscii(".");
+ }
+ m_sourceDir->setText(dirName);
+}
+
+void Step1::selectDestinationDir()
+{
+ QString path = QFileInfo(MainWindow::instance().configFileName()).path();
+ QString dirName = QFileDialog::getExistingDirectory(this,
+ tr("Select destination directory"),path);
+ QDir dir(path);
+ if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
+ {
+ dirName = dir.relativeFilePath(dirName);
+ }
+ if (dirName.isEmpty())
+ {
+ dirName=QString::fromAscii(".");
+ }
+ m_destDir->setText(dirName);
+}
+
+void Step1::setProjectName(const QString &name)
+{
+ updateStringOption(m_modelData,STR_PROJECT_NAME,name);
+}
+
+void Step1::setProjectBrief(const QString &desc)
+{
+ updateStringOption(m_modelData,STR_PROJECT_BRIEF,desc);
+}
+
+void Step1::setProjectNumber(const QString &num)
+{
+ updateStringOption(m_modelData,STR_PROJECT_NUMBER,num);
+}
+
+void Step1::setSourceDir(const QString &dir)
+{
+ Input *option = m_modelData[STR_INPUT];
+ if (option->value().toStringList().count()>0)
+ {
+ QStringList sl = option->value().toStringList();
+ if (sl[0]!=dir)
+ {
+ sl[0] = dir;
+ option->value() = sl;
+ option->update();
+ }
+ }
+ else
+ {
+ option->value() = QStringList() << dir;
+ option->update();
+ }
+}
+
+void Step1::setDestinationDir(const QString &dir)
+{
+ updateStringOption(m_modelData,STR_OUTPUT_DIRECTORY,dir);
+}
+
+void Step1::setRecursiveScan(int s)
+{
+ updateBoolOption(m_modelData,STR_RECURSIVE,s==Qt::Checked);
+}
+
+void Step1::init()
+{
+ Input *option;
+ m_projName->setText(getStringOption(m_modelData,STR_PROJECT_NAME));
+ m_projBrief->setText(getStringOption(m_modelData,STR_PROJECT_BRIEF));
+ m_projNumber->setText(getStringOption(m_modelData,STR_PROJECT_NUMBER));
+ QString iconName = getStringOption(m_modelData,STR_PROJECT_LOGO);
+ if (!iconName.isEmpty())
+ {
+ QPixmap pm(iconName);
+ if (!pm.isNull())
+ {
+ m_projIconLab->setPixmap(pm.scaledToHeight(55,Qt::SmoothTransformation));
+ }
+ }
+ else
+ {
+ QPixmap pm(QSize(120,55));
+ pm.fill();
+ m_projIconLab->setPixmap(pm);
+ }
+ option = m_modelData[STR_INPUT];
+ if (option->value().toStringList().count()>0)
+ {
+ m_sourceDir->setText(option->value().toStringList().first());
+ }
+ m_recursive->setChecked(
+ getBoolOption(m_modelData,STR_RECURSIVE) ? Qt::Checked : Qt::Unchecked);
+ m_destDir->setText(getStringOption(m_modelData,STR_OUTPUT_DIRECTORY));
+}
+
+
+//==========================================================================
+
+Step2::Step2(Wizard *wizard,const QHash<QString,Input*> &modelData)
+ : m_wizard(wizard), m_modelData(modelData)
+{
+ QRadioButton *r;
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+ //---------------------------------------------------
+ m_extractModeGroup = new QButtonGroup(this);
+ m_extractMode = new QGroupBox(this);
+ m_extractMode->setTitle(tr("Select the desired extraction mode:"));
+ QGridLayout *gbox = new QGridLayout( m_extractMode );
+ r = new QRadioButton(tr("Documented entities only"));
+ r->setChecked(true);
+ m_extractModeGroup->addButton(r, 0);
+ gbox->addWidget(r,1,0);
+ // 1 -> EXTRACT_ALL = NO
+ r = new QRadioButton(tr("All Entities"));
+ m_extractModeGroup->addButton(r, 1);
+ gbox->addWidget(r,2,0);
+ // 2 -> EXTRACT_ALL = YES
+ m_crossRef = new QCheckBox(m_extractMode);
+ m_crossRef->setText(tr("Include cross-referenced source code in the output"));
+ // m_crossRef -> SOURCE_BROWSER = YES/NO
+ gbox->addWidget(m_crossRef,3,0);
+ layout->addWidget(m_extractMode);
+
+ //---------------------------------------------------
+ QFrame *f = new QFrame( this );
+ f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
+ layout->addWidget(f);
+
+ m_optimizeLangGroup = new QButtonGroup(this);
+ m_optimizeLang = new QGroupBox(this);
+ m_optimizeLang->setTitle(tr("Select programming language to optimize the results for"));
+ gbox = new QGridLayout( m_optimizeLang );
+
+ r = new QRadioButton(m_optimizeLang);
+ r->setText(tr("Optimize for C++ output"));
+ r->setChecked(true);
+ m_optimizeLangGroup->addButton(r, 0);
+ // 0 -> OPTIMIZE_OUTPUT_FOR_C = NO
+ // OPTIMIZE_OUTPUT_JAVA = NO
+ // OPTIMIZE_FOR_FORTRAN = NO
+ // OPTIMIZE_OUTPUT_VHDL = NO
+ // CPP_CLI_SUPPORT = NO
+ // HIDE_SCOPE_NAMES = NO
+ gbox->addWidget(r,0,0);
+ r = new QRadioButton(tr("Optimize for C++/CLI output"));
+ gbox->addWidget(r,1,0);
+ m_optimizeLangGroup->addButton(r, 1);
+ // 1 -> OPTIMIZE_OUTPUT_FOR_C = NO
+ // OPTIMIZE_OUTPUT_JAVA = NO
+ // OPTIMIZE_FOR_FORTRAN = NO
+ // OPTIMIZE_OUTPUT_VHDL = NO
+ // CPP_CLI_SUPPORT = YES
+ // HIDE_SCOPE_NAMES = NO
+ r = new QRadioButton(tr("Optimize for Java or C# output"));
+ m_optimizeLangGroup->addButton(r, 2);
+ // 2 -> OPTIMIZE_OUTPUT_FOR_C = NO
+ // OPTIMIZE_OUTPUT_JAVA = YES
+ // OPTIMIZE_FOR_FORTRAN = NO
+ // OPTIMIZE_OUTPUT_VHDL = NO
+ // CPP_CLI_SUPPORT = NO
+ // HIDE_SCOPE_NAMES = NO
+ gbox->addWidget(r,2,0);
+ r = new QRadioButton(tr("Optimize for C or PHP output"));
+ m_optimizeLangGroup->addButton(r, 3);
+ // 3 -> OPTIMIZE_OUTPUT_FOR_C = YES
+ // OPTIMIZE_OUTPUT_JAVA = NO
+ // OPTIMIZE_FOR_FORTRAN = NO
+ // OPTIMIZE_OUTPUT_VHDL = NO
+ // CPP_CLI_SUPPORT = NO
+ // HIDE_SCOPE_NAMES = YES
+ gbox->addWidget(r,3,0);
+ r = new QRadioButton(tr("Optimize for Fortran output"));
+ m_optimizeLangGroup->addButton(r, 4);
+ // 4 -> OPTIMIZE_OUTPUT_FOR_C = NO
+ // OPTIMIZE_OUTPUT_JAVA = NO
+ // OPTIMIZE_FOR_FORTRAN = YES
+ // OPTIMIZE_OUTPUT_VHDL = NO
+ // CPP_CLI_SUPPORT = NO
+ // HIDE_SCOPE_NAMES = NO
+ gbox->addWidget(r,4,0);
+ r = new QRadioButton(tr("Optimize for VHDL output"));
+ m_optimizeLangGroup->addButton(r, 5);
+ // 5 -> OPTIMIZE_OUTPUT_FOR_C = NO
+ // OPTIMIZE_OUTPUT_JAVA = NO
+ // OPTIMIZE_FOR_FORTRAN = NO
+ // OPTIMIZE_OUTPUT_VHDL = YES
+ // CPP_CLI_SUPPORT = NO
+ // HIDE_SCOPE_NAMES = NO
+ gbox->addWidget(r,5,0);
+
+ layout->addWidget(m_optimizeLang);
+ layout->addStretch(1);
+
+ connect(m_crossRef,SIGNAL(stateChanged(int)),
+ SLOT(changeCrossRefState(int)));
+ connect(m_optimizeLangGroup,SIGNAL(buttonClicked(int)),
+ SLOT(optimizeFor(int)));
+ connect(m_extractModeGroup,SIGNAL(buttonClicked(int)),
+ SLOT(extractMode(int)));
+}
+
+
+void Step2::optimizeFor(int choice)
+{
+ for (int i=0;i<6;i++)
+ {
+ updateBoolOption(m_modelData,
+ g_optimizeOptionNames[i],
+ g_optimizeMapping[choice][i]);
+ }
+}
+
+void Step2::extractMode(int choice)
+{
+ updateBoolOption(m_modelData,STR_EXTRACT_ALL,choice==1);
+}
+
+void Step2::changeCrossRefState(int choice)
+{
+ updateBoolOption(m_modelData,STR_SOURCE_BROWSER,choice==Qt::Checked);
+}
+
+void Step2::init()
+{
+ m_extractModeGroup->button(
+ getBoolOption(m_modelData,STR_EXTRACT_ALL) ? 1 : 0)->setChecked(true);
+ m_crossRef->setChecked(getBoolOption(m_modelData,STR_SOURCE_BROWSER));
+
+ int x=0;
+ if (getBoolOption(m_modelData,STR_CPP_CLI_SUPPORT)) x=1;
+ else if (getBoolOption(m_modelData,STR_OPTIMIZE_OUTPUT_JAVA)) x=2;
+ else if (getBoolOption(m_modelData,STR_OPTIMIZE_OUTPUT_FOR_C)) x=3;
+ else if (getBoolOption(m_modelData,STR_OPTIMIZE_FOR_FORTRAN)) x=4;
+ else if (getBoolOption(m_modelData,STR_OPTIMIZE_OUTPUT_VHDL)) x=5;
+ m_optimizeLangGroup->button(x)->setChecked(true);
+}
+
+//==========================================================================
+
+Step3::Step3(Wizard *wizard,const QHash<QString,Input*> &modelData)
+ : m_wizard(wizard), m_modelData(modelData)
+{
+ QVBoxLayout *vbox = 0;
+ QRadioButton *r = 0;
+
+ QGridLayout *gbox = new QGridLayout( this );
+ gbox->addWidget(new QLabel(tr("Select the output format(s) to generate")),0,0);
+ {
+ m_htmlOptions = new QGroupBox(tr("HTML"));
+ m_htmlOptions->setCheckable(true);
+ // GENERATE_HTML
+ m_htmlOptionsGroup = new QButtonGroup(m_htmlOptions);
+ QRadioButton *r = new QRadioButton(tr("plain HTML"));
+ r->setChecked(true);
+ m_htmlOptionsGroup->addButton(r, 0);
+ vbox = new QVBoxLayout;
+ vbox->addWidget(r);
+ r = new QRadioButton(tr("with navigation panel"));
+ m_htmlOptionsGroup->addButton(r, 1);
+ // GENERATE_TREEVIEW
+ vbox->addWidget(r);
+ r = new QRadioButton(tr("prepare for compressed HTML (.chm)"));
+ m_htmlOptionsGroup->addButton(r, 2);
+ // GENERATE_HTMLHELP
+ vbox->addWidget(r);
+ m_searchEnabled=new QCheckBox(tr("With search function"));
+ vbox->addWidget(m_searchEnabled);
+ // SEARCH_ENGINE
+ QHBoxLayout *hbox = new QHBoxLayout;
+ m_tuneColor=new QPushButton(tr("Change color..."));
+ hbox->addWidget(m_tuneColor);
+ hbox->addStretch(1);
+ vbox->addLayout(hbox);
+ m_htmlOptions->setLayout(vbox);
+ m_htmlOptions->setChecked(true);
+ }
+ gbox->addWidget(m_htmlOptions,1,0);
+
+ {
+ m_texOptions = new QGroupBox(tr("LaTeX"));
+ m_texOptions->setCheckable(true);
+ // GENERATE_LATEX
+ m_texOptionsGroup = new QButtonGroup(m_texOptions);
+ vbox = new QVBoxLayout;
+ r = new QRadioButton(tr("as intermediate format for hyperlinked PDF"));
+ m_texOptionsGroup->addButton(r, 0);
+ // PDF_HYPERLINKS = YES
+ r->setChecked(true);
+ vbox->addWidget(r);
+ r = new QRadioButton(tr("as intermediate format for PDF"));
+ m_texOptionsGroup->addButton(r, 1);
+ // PDF_HYPERLINKS = NO, USE_PDFLATEX = YES
+ vbox->addWidget(r);
+ r = new QRadioButton(tr("as intermediate format for PostScript"));
+ m_texOptionsGroup->addButton(r, 2);
+ // USE_PDFLATEX = NO
+ vbox->addWidget(r);
+ vbox->addStretch(1);
+ m_texOptions->setLayout(vbox);
+ m_texOptions->setChecked(true);
+ }
+ gbox->addWidget(m_texOptions,2,0);
+
+ m_manEnabled=new QCheckBox(tr("Man pages"));
+ // GENERATE_MAN
+ m_rtfEnabled=new QCheckBox(tr("Rich Text Format (RTF)"));
+ // GENERATE_RTF
+ m_xmlEnabled=new QCheckBox(tr("XML"));
+ // GENERATE_XML
+ gbox->addWidget(m_manEnabled,3,0);
+ gbox->addWidget(m_rtfEnabled,4,0);
+ gbox->addWidget(m_xmlEnabled,5,0);
+
+ gbox->setRowStretch(6,1);
+ connect(m_htmlOptions,SIGNAL(toggled(bool)),SLOT(setHtmlEnabled(bool)));
+ connect(m_texOptions,SIGNAL(toggled(bool)),SLOT(setLatexEnabled(bool)));
+ connect(m_manEnabled,SIGNAL(stateChanged(int)),SLOT(setManEnabled(int)));
+ connect(m_rtfEnabled,SIGNAL(stateChanged(int)),SLOT(setRtfEnabled(int)));
+ connect(m_xmlEnabled,SIGNAL(stateChanged(int)),SLOT(setXmlEnabled(int)));
+ connect(m_searchEnabled,SIGNAL(stateChanged(int)),SLOT(setSearchEnabled(int)));
+ connect(m_htmlOptionsGroup,SIGNAL(buttonClicked(int)),
+ SLOT(setHtmlOptions(int)));
+ connect(m_texOptionsGroup,SIGNAL(buttonClicked(int)),
+ SLOT(setLatexOptions(int)));
+ connect(m_tuneColor,SIGNAL(clicked()),SLOT(tuneColorDialog()));
+}
+
+void Step3::tuneColorDialog()
+{
+ int hue = getIntOption(m_modelData,STR_HTML_COLORSTYLE_HUE);
+ int sat = getIntOption(m_modelData,STR_HTML_COLORSTYLE_SAT);
+ int gam = getIntOption(m_modelData,STR_HTML_COLORSTYLE_GAMMA);
+ TuneColorDialog tuneColor(hue,sat,gam,this);
+ if (tuneColor.exec()==QDialog::Accepted)
+ {
+ updateIntOption(m_modelData,STR_HTML_COLORSTYLE_HUE,tuneColor.getHue());
+ updateIntOption(m_modelData,STR_HTML_COLORSTYLE_SAT,tuneColor.getSaturation());
+ updateIntOption(m_modelData,STR_HTML_COLORSTYLE_GAMMA,tuneColor.getGamma());
+ }
+}
+
+void Step3::setHtmlEnabled(bool b)
+{
+ updateBoolOption(m_modelData,STR_GENERATE_HTML,b);
+}
+
+void Step3::setLatexEnabled(bool b)
+{
+ updateBoolOption(m_modelData,STR_GENERATE_LATEX,b);
+}
+
+void Step3::setManEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_GENERATE_MAN,state==Qt::Checked);
+}
+
+void Step3::setRtfEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_GENERATE_RTF,state==Qt::Checked);
+}
+
+void Step3::setXmlEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_GENERATE_XML,state==Qt::Checked);
+}
+
+void Step3::setSearchEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_SEARCHENGINE,state==Qt::Checked);
+}
+
+void Step3::setHtmlOptions(int id)
+{
+ if (id==0) // plain HTML
+ {
+ updateBoolOption(m_modelData,STR_GENERATE_HTMLHELP,false);
+ updateBoolOption(m_modelData,STR_GENERATE_TREEVIEW,false);
+ }
+ else if (id==1) // with navigation tree
+ {
+ updateBoolOption(m_modelData,STR_GENERATE_HTMLHELP,false);
+ updateBoolOption(m_modelData,STR_GENERATE_TREEVIEW,true);
+ }
+ else if (id==2) // with compiled help
+ {
+ updateBoolOption(m_modelData,STR_GENERATE_HTMLHELP,true);
+ updateBoolOption(m_modelData,STR_GENERATE_TREEVIEW,false);
+ }
+}
+
+void Step3::setLatexOptions(int id)
+{
+ if (id==0) // hyperlinked PDF
+ {
+ updateBoolOption(m_modelData,STR_USE_PDFLATEX,true);
+ updateBoolOption(m_modelData,STR_PDF_HYPERLINKS,true);
+ }
+ else if (id==1) // PDF
+ {
+ updateBoolOption(m_modelData,STR_USE_PDFLATEX,true);
+ updateBoolOption(m_modelData,STR_PDF_HYPERLINKS,false);
+ }
+ else if (id==2) // PostScript
+ {
+ updateBoolOption(m_modelData,STR_USE_PDFLATEX,false);
+ updateBoolOption(m_modelData,STR_PDF_HYPERLINKS,false);
+ }
+}
+
+void Step3::init()
+{
+ m_htmlOptions->setChecked(getBoolOption(m_modelData,STR_GENERATE_HTML));
+ m_texOptions->setChecked(getBoolOption(m_modelData,STR_GENERATE_LATEX));
+ m_manEnabled->setChecked(getBoolOption(m_modelData,STR_GENERATE_MAN));
+ m_rtfEnabled->setChecked(getBoolOption(m_modelData,STR_GENERATE_RTF));
+ m_xmlEnabled->setChecked(getBoolOption(m_modelData,STR_GENERATE_XML));
+ m_searchEnabled->setChecked(getBoolOption(m_modelData,STR_SEARCHENGINE));
+ if (getBoolOption(m_modelData,STR_GENERATE_HTMLHELP))
+ {
+ m_htmlOptionsGroup->button(2)->setChecked(true); // compiled help
+ }
+ else if (getBoolOption(m_modelData,STR_GENERATE_TREEVIEW))
+ {
+ m_htmlOptionsGroup->button(1)->setChecked(true); // navigation tree
+ }
+ else
+ {
+ m_htmlOptionsGroup->button(0)->setChecked(true); // plain HTML
+ }
+ if (!getBoolOption(m_modelData,STR_USE_PDFLATEX))
+ {
+ m_texOptionsGroup->button(2)->setChecked(true); // PostScript
+ }
+ else if (!getBoolOption(m_modelData,STR_PDF_HYPERLINKS))
+ {
+ m_texOptionsGroup->button(1)->setChecked(true); // Plain PDF
+ }
+ else
+ {
+ m_texOptionsGroup->button(0)->setChecked(true); // PDF with hyperlinks
+ }
+}
+
+//==========================================================================
+
+Step4::Step4(Wizard *wizard,const QHash<QString,Input*> &modelData)
+ : m_wizard(wizard), m_modelData(modelData)
+{
+ m_diagramModeGroup = new QButtonGroup(this);
+ QGridLayout *gbox = new QGridLayout( this );
+ gbox->addWidget(new QLabel(tr("Diagrams to generate")),0,0);
+
+ QRadioButton *rb = new QRadioButton(tr("No diagrams"));
+ m_diagramModeGroup->addButton(rb, 0);
+ gbox->addWidget(rb,1,0);
+ // CLASS_DIAGRAMS = NO, HAVE_DOT = NO
+ rb->setChecked(true);
+ rb = new QRadioButton(tr("Use built-in class diagram generator"));
+ m_diagramModeGroup->addButton(rb, 1);
+ // CLASS_DIAGRAMS = YES, HAVE_DOT = NO
+ gbox->addWidget(rb,2,0);
+ rb = new QRadioButton(tr("Use dot tool from the GraphViz package"));
+ m_diagramModeGroup->addButton(rb, 2);
+ gbox->addWidget(rb,3,0);
+ // CLASS_DIAGRAMS = NO, HAVE_DOT = YES
+
+ m_dotGroup = new QGroupBox(tr("Dot graphs to generate"));
+ QVBoxLayout *vbox = new QVBoxLayout;
+ m_dotClass=new QCheckBox(tr("Class diagrams"));
+ // CLASS_GRAPH
+ m_dotCollaboration=new QCheckBox(tr("Collaboration diagrams"));
+ // COLLABORATION_GRAPH
+ m_dotInheritance=new QCheckBox(tr("Overall Class hierarchy"));
+ // GRAPHICAL_HIERARCHY
+ m_dotInclude=new QCheckBox(tr("Include dependency graphs"));
+ // INCLUDE_GRAPH
+ m_dotIncludedBy=new QCheckBox(tr("Included by dependency graphs"));
+ // INCLUDED_BY_GRAPH
+ m_dotCall=new QCheckBox(tr("Call graphs"));
+ // CALL_GRAPH
+ m_dotCaller=new QCheckBox(tr("Called by graphs"));
+ // CALLER_GRAPH
+ vbox->addWidget(m_dotClass);
+ vbox->addWidget(m_dotCollaboration);
+ vbox->addWidget(m_dotInheritance);
+ vbox->addWidget(m_dotInclude);
+ vbox->addWidget(m_dotIncludedBy);
+ vbox->addWidget(m_dotCall);
+ vbox->addWidget(m_dotCaller);
+ vbox->addStretch(1);
+ m_dotGroup->setLayout(vbox);
+ m_dotClass->setChecked(true);
+ m_dotGroup->setEnabled(false);
+ gbox->addWidget(m_dotGroup,4,0);
+
+ m_dotInclude->setChecked(true);
+ m_dotCollaboration->setChecked(true);
+ gbox->setRowStretch(5,1);
+
+ connect(m_diagramModeGroup,SIGNAL(buttonClicked(int)),
+ this,SLOT(diagramModeChanged(int)));
+ connect(m_dotClass,SIGNAL(stateChanged(int)),
+ this,SLOT(setClassGraphEnabled(int)));
+ connect(m_dotCollaboration,SIGNAL(stateChanged(int)),
+ this,SLOT(setCollaborationGraphEnabled(int)));
+ connect(m_dotInheritance,SIGNAL(stateChanged(int)),
+ this,SLOT(setGraphicalHierarchyEnabled(int)));
+ connect(m_dotInclude,SIGNAL(stateChanged(int)),
+ this,SLOT(setIncludeGraphEnabled(int)));
+ connect(m_dotIncludedBy,SIGNAL(stateChanged(int)),
+ this,SLOT(setIncludedByGraphEnabled(int)));
+ connect(m_dotCall,SIGNAL(stateChanged(int)),
+ this,SLOT(setCallGraphEnabled(int)));
+ connect(m_dotCaller,SIGNAL(stateChanged(int)),
+ this,SLOT(setCallerGraphEnabled(int)));
+}
+
+void Step4::diagramModeChanged(int id)
+{
+ if (id==0) // no diagrams
+ {
+ updateBoolOption(m_modelData,STR_HAVE_DOT,false);
+ updateBoolOption(m_modelData,STR_CLASS_DIAGRAMS,false);
+ }
+ else if (id==1) // builtin diagrams
+ {
+ updateBoolOption(m_modelData,STR_HAVE_DOT,false);
+ updateBoolOption(m_modelData,STR_CLASS_DIAGRAMS,true);
+ }
+ else if (id==2) // dot diagrams
+ {
+ updateBoolOption(m_modelData,STR_HAVE_DOT,true);
+ updateBoolOption(m_modelData,STR_CLASS_DIAGRAMS,false);
+ }
+ m_dotGroup->setEnabled(id==2);
+}
+
+void Step4::setClassGraphEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_CLASS_GRAPH,state==Qt::Checked);
+}
+
+void Step4::setCollaborationGraphEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_COLLABORATION_GRAPH,state==Qt::Checked);
+}
+
+void Step4::setGraphicalHierarchyEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_GRAPHICAL_HIERARCHY,state==Qt::Checked);
+}
+
+void Step4::setIncludeGraphEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_INCLUDE_GRAPH,state==Qt::Checked);
+}
+
+void Step4::setIncludedByGraphEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_INCLUDED_BY_GRAPH,state==Qt::Checked);
+}
+
+void Step4::setCallGraphEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_CALL_GRAPH,state==Qt::Checked);
+}
+
+void Step4::setCallerGraphEnabled(int state)
+{
+ updateBoolOption(m_modelData,STR_CALLER_GRAPH,state==Qt::Checked);
+}
+
+void Step4::init()
+{
+ if (getBoolOption(m_modelData,STR_HAVE_DOT))
+ {
+ m_diagramModeGroup->button(2)->setChecked(true); // Dot
+ }
+ else if (getBoolOption(m_modelData,STR_CLASS_DIAGRAMS))
+ {
+ m_diagramModeGroup->button(1)->setChecked(true); // Builtin diagrams
+ }
+ else
+ {
+ m_diagramModeGroup->button(0)->setChecked(true); // no diagrams
+ }
+ m_dotClass->setChecked(getBoolOption(m_modelData,STR_CLASS_GRAPH));
+ m_dotCollaboration->setChecked(getBoolOption(m_modelData,STR_COLLABORATION_GRAPH));
+ m_dotInheritance->setChecked(getBoolOption(m_modelData,STR_GRAPHICAL_HIERARCHY));
+ m_dotInclude->setChecked(getBoolOption(m_modelData,STR_INCLUDE_GRAPH));
+ m_dotIncludedBy->setChecked(getBoolOption(m_modelData,STR_INCLUDED_BY_GRAPH));
+ m_dotCall->setChecked(getBoolOption(m_modelData,STR_CALL_GRAPH));
+ m_dotCaller->setChecked(getBoolOption(m_modelData,STR_CALLER_GRAPH));
+}
+
+//==========================================================================
+
+Wizard::Wizard(const QHash<QString,Input*> &modelData, QWidget *parent) :
+ QSplitter(parent), m_modelData(modelData)
+{
+ m_treeWidget = new QTreeWidget;
+ m_treeWidget->setColumnCount(1);
+ m_treeWidget->setHeaderLabels(QStringList() << QString::fromAscii("Topics"));
+ QList<QTreeWidgetItem*> items;
+ items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(tr("Project"))));
+ items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(tr("Mode"))));
+ items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(tr("Output"))));
+ items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(tr("Diagrams"))));
+ m_treeWidget->insertTopLevelItems(0,items);
+
+ m_topicStack = new QStackedWidget;
+ m_step1 = new Step1(this,modelData);
+ m_step2 = new Step2(this,modelData);
+ m_step3 = new Step3(this,modelData);
+ m_step4 = new Step4(this,modelData);
+ m_topicStack->addWidget(m_step1);
+ m_topicStack->addWidget(m_step2);
+ m_topicStack->addWidget(m_step3);
+ m_topicStack->addWidget(m_step4);
+
+ QWidget *rightSide = new QWidget;
+ QGridLayout *grid = new QGridLayout(rightSide);
+ m_prev = new QPushButton(tr("Previous"));
+ m_prev->setEnabled(false);
+ m_next = new QPushButton(tr("Next"));
+ grid->addWidget(m_topicStack,0,0,1,2);
+ grid->addWidget(m_prev,1,0,Qt::AlignLeft);
+ grid->addWidget(m_next,1,1,Qt::AlignRight);
+ grid->setColumnStretch(0,1);
+ grid->setRowStretch(0,1);
+ addWidget(m_treeWidget);
+ addWidget(rightSide);
+
+ connect(m_treeWidget,
+ SIGNAL(currentItemChanged(QTreeWidgetItem *,QTreeWidgetItem *)),
+ SLOT(activateTopic(QTreeWidgetItem *,QTreeWidgetItem *)));
+ connect(m_next,SIGNAL(clicked()),SLOT(nextTopic()));
+ connect(m_prev,SIGNAL(clicked()),SLOT(prevTopic()));
+
+ refresh();
+}
+
+Wizard::~Wizard()
+{
+}
+
+void Wizard::activateTopic(QTreeWidgetItem *item,QTreeWidgetItem *)
+{
+ if (item)
+ {
+
+ QString label = item->text(0);
+ if (label==tr("Project"))
+ {
+ m_topicStack->setCurrentWidget(m_step1);
+ m_prev->setEnabled(false);
+ m_next->setEnabled(true);
+ }
+ else if (label==tr("Mode"))
+ {
+ m_topicStack->setCurrentWidget(m_step2);
+ m_prev->setEnabled(true);
+ m_next->setEnabled(true);
+ }
+ else if (label==tr("Output"))
+ {
+ m_topicStack->setCurrentWidget(m_step3);
+ m_prev->setEnabled(true);
+ m_next->setEnabled(true);
+ }
+ else if (label==tr("Diagrams"))
+ {
+ m_topicStack->setCurrentWidget(m_step4);
+ m_prev->setEnabled(true);
+ m_next->setEnabled(false);
+ }
+ }
+}
+
+void Wizard::nextTopic()
+{
+ m_topicStack->setCurrentIndex(m_topicStack->currentIndex()+1);
+ m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1);
+ m_prev->setEnabled(m_topicStack->currentIndex()!=0);
+ m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex()));
+}
+
+void Wizard::prevTopic()
+{
+ m_topicStack->setCurrentIndex(m_topicStack->currentIndex()-1);
+ m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1);
+ m_prev->setEnabled(m_topicStack->currentIndex()!=0);
+ m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex()));
+}
+
+void Wizard::refresh()
+{
+ m_step1->init();
+ m_step2->init();
+ m_step3->init();
+ m_step4->init();
+}
diff --git a/addon/doxywizard/wizard.h b/addon/doxywizard/wizard.h
new file mode 100644
index 0000000..bdebd2b
--- /dev/null
+++ b/addon/doxywizard/wizard.h
@@ -0,0 +1,253 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef WIZARD_H
+#define WIZARD_H
+
+#include <QSplitter>
+#include <QHash>
+#include <QDialog>
+
+class Input;
+class QTreeWidget;
+class QTreeWidgetItem;
+class QStackedWidget;
+class QCheckBox;
+class QLineEdit;
+class QPushButton;
+class QRadioButton;
+class QGroupBox;
+class QButtonGroup;
+class Wizard;
+class QImage;
+class QLabel;
+
+enum OptLang { Lang_Cpp, Lang_C, Lang_Java, Lang_CS };
+enum HtmlStyle { HS_Plain, HS_TreeView, HS_CHM };
+enum TexStyle { TS_PDFHyper, TS_PDF, TS_PS };
+enum DiagramMode { DM_None, DM_Builtin, DM_Dot };
+
+class TuneColorDialog : public QDialog
+{
+ Q_OBJECT
+
+ public:
+ TuneColorDialog(int hue,int sat,int gamma,QWidget *parent=0);
+ int getHue() const;
+ int getSaturation() const;
+ int getGamma() const;
+
+ private slots:
+ void updateImage(int hue,int sat,int val);
+
+ private:
+ QImage *m_image;
+ QLabel *m_imageLab;
+ int m_hue;
+ int m_sat;
+ int m_gam;
+};
+
+class ColorPicker : public QWidget
+{
+ Q_OBJECT
+public:
+ enum Mode { Hue, Saturation, Gamma };
+ ColorPicker(Mode m);
+ ~ColorPicker();
+
+public slots:
+ void setCol(int h, int s, int g);
+ //void setCol(int h, int s);
+
+signals:
+ void newHsv(int h, int s, int g);
+
+protected:
+ void paintEvent(QPaintEvent*);
+ void mouseMoveEvent(QMouseEvent *);
+ void mousePressEvent(QMouseEvent *);
+
+private:
+ enum { foff = 3, coff = 4 }; //frame and contents offset
+ int y2hue(int y);
+ int y2sat(int y);
+ int y2gam(int y);
+ int hue2y(int hue);
+ int sat2y(int sat);
+ int gam2y(int gamma);
+ void setHue(int v);
+ void setSat(int v);
+ void setGam(int v);
+
+ QPixmap *m_pix;
+ Mode m_mode;
+ int m_gam;
+ int m_hue;
+ int m_sat;
+
+};
+
+
+class Step1 : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ Step1(Wizard *parent,const QHash<QString,Input*> &modelData);
+ void init();
+
+ private slots:
+ void selectSourceDir();
+ void selectDestinationDir();
+ void selectProjectIcon();
+ void setProjectName(const QString &name);
+ void setProjectBrief(const QString &desc);
+ void setProjectNumber(const QString &num);
+ void setSourceDir(const QString &dir);
+ void setDestinationDir(const QString &dir);
+ void setRecursiveScan(int);
+
+ private:
+ QLineEdit *m_projName;
+ QLineEdit *m_projBrief;
+ QLineEdit *m_projNumber;
+ QLineEdit *m_sourceDir;
+ QLineEdit *m_destDir;
+ QLabel *m_projIconLab;
+ QCheckBox *m_recursive;
+ QPushButton *m_srcSelectDir;
+ QPushButton *m_dstSelectDir;
+ Wizard *m_wizard;
+ const QHash<QString,Input *> &m_modelData;
+};
+
+class Step2 : public QWidget
+{
+ Q_OBJECT
+ public:
+ Step2(Wizard *parent,const QHash<QString,Input*> &modelData);
+ void init();
+
+ private slots:
+ void optimizeFor(int choice);
+ void extractMode(int choice);
+ void changeCrossRefState(int choice);
+
+ private:
+ QGroupBox *m_extractMode;
+ QGroupBox *m_optimizeLang;
+ QButtonGroup *m_extractModeGroup;
+ QButtonGroup *m_optimizeLangGroup;
+ QCheckBox *m_crossRef;
+ Wizard *m_wizard;
+ const QHash<QString,Input *> &m_modelData;
+};
+
+class Step3 : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ Step3(Wizard *parent,const QHash<QString,Input*> &modelData);
+ void init();
+
+ private slots:
+ void setHtmlEnabled(bool);
+ void setLatexEnabled(bool);
+ void setManEnabled(int);
+ void setRtfEnabled(int);
+ void setXmlEnabled(int);
+ void setSearchEnabled(int);
+ void setHtmlOptions(int);
+ void setLatexOptions(int);
+ void tuneColorDialog();
+
+ private:
+ QGroupBox *m_texOptions;
+ QButtonGroup *m_texOptionsGroup;
+ QGroupBox *m_htmlOptions;
+ QButtonGroup *m_htmlOptionsGroup;
+ QCheckBox *m_htmlEnabled;
+ QCheckBox *m_latexEnabled;
+ QCheckBox *m_manEnabled;
+ QCheckBox *m_rtfEnabled;
+ QCheckBox *m_xmlEnabled;
+ QCheckBox *m_searchEnabled;
+ QPushButton *m_tuneColor;
+ Wizard *m_wizard;
+ const QHash<QString,Input *> &m_modelData;
+};
+
+class Step4 : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ Step4(Wizard *parent,const QHash<QString,Input*> &modelData);
+ void init();
+
+ private slots:
+ void diagramModeChanged(int);
+ void setClassGraphEnabled(int state);
+ void setCollaborationGraphEnabled(int state);
+ void setGraphicalHierarchyEnabled(int state);
+ void setIncludeGraphEnabled(int state);
+ void setIncludedByGraphEnabled(int state);
+ void setCallGraphEnabled(int state);
+ void setCallerGraphEnabled(int state);
+
+ private:
+ QGroupBox *m_diagramMode;
+ QButtonGroup *m_diagramModeGroup;
+ QGroupBox *m_dotGroup;
+ QCheckBox *m_dotClass;
+ QCheckBox *m_dotCollaboration;
+ QCheckBox *m_dotInclude;
+ QCheckBox *m_dotIncludedBy;
+ QCheckBox *m_dotInheritance;
+ QCheckBox *m_dotCall;
+ QCheckBox *m_dotCaller;
+ Wizard *m_wizard;
+ const QHash<QString,Input *> &m_modelData;
+};
+
+class Wizard : public QSplitter
+{
+ Q_OBJECT
+ public:
+ Wizard(const QHash<QString,Input*> &modelData, QWidget *parent=0);
+ ~Wizard();
+
+ public slots:
+ void refresh();
+
+ private slots:
+ void activateTopic(QTreeWidgetItem *item,QTreeWidgetItem *);
+ void nextTopic();
+ void prevTopic();
+
+ private:
+ const QHash<QString,Input *> &m_modelData;
+ QTreeWidget *m_treeWidget;
+ QStackedWidget *m_topicStack;
+ Step1 *m_step1;
+ Step2 *m_step2;
+ Step3 *m_step3;
+ Step4 *m_step4;
+ QPushButton *m_next;
+ QPushButton *m_prev;
+};
+
+#endif
diff --git a/configure b/configure
new file mode 100755
index 0000000..468a759
--- /dev/null
+++ b/configure
@@ -0,0 +1,671 @@
+#!/bin/sh
+#
+# $Id: configure,v 1.229 2005/11/09 21:17:03 dimitri Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+# shell script to configure doxygen
+
+doxygen_version_major=1
+doxygen_version_minor=7
+doxygen_version_revision=4
+
+#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
+doxygen_version_mmn=NO
+
+bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
+
+f_debug=NO
+f_shared=YES
+f_make=NO
+f_dot=NO
+f_perl=NO
+f_plf_auto=NO
+f_prefix=/usr/local
+f_insttool=NO
+f_english=NO
+f_wizard=NO
+f_app=NO
+f_thread=NO
+f_flex=NO
+f_bison=NO
+f_langs=nl,sv,cz,fr,id,it,de,jp,je,es,fi,ru,hr,pl,pt,hu,kr,ke,ro,si,cn,no,mk,br,dk,sk,ua,gr,tw,sr,ca,lt,za,ar,fa,sc,vi,tr,eo
+
+while test -n "$1"; do
+ case $1 in
+ --prefix | -prefix)
+ shift; f_prefix=$1
+ ;;
+ --docdir | -docdir)
+ shift; f_docdir=$1
+ ;;
+ --shared | -shared)
+ f_shared=YES
+ ;;
+ --static | -static)
+ f_shared=NO
+ ;;
+ --release | -release)
+ f_debug=NO
+ ;;
+ --debug | -debug)
+ f_debug=YES
+ ;;
+ --english-only | -english-only)
+ f_english=YES
+ ;;
+ --enable-langs | -enable-langs)
+ shift; f_langs=$1
+ ;;
+ --platform | -platform)
+ shift; f_platform=$1
+ ;;
+ --make | -make)
+ shift; f_make=$1
+ ;;
+ --dot | -dot)
+ shift; f_dot=$1
+ ;;
+ --perl | -perl)
+ shift; f_perl=$1
+ ;;
+ --flex | -flex)
+ shift; f_flex=$1
+ ;;
+ --bison | -bison)
+ shift; f_bison=$1
+ ;;
+ --install | -install)
+ shift; f_insttool=$1
+ ;;
+ --with-doxywizard | -with-doxywizard)
+ f_wizard=YES
+ ;;
+ --with-doxyapp | -with-doxyapp)
+ f_app=YES
+ ;;
+ -h | -help | --help)
+ f_help=y
+ ;;
+ *)
+ echo $1: unknown argument
+ f_help=y
+ f_error=y
+ ;;
+ esac
+ shift
+done
+
+if test "$f_help" = y; then
+ cat <<EOF
+Usage: $0 [--help] [--shared] [--static] [--release] [--debug]
+ [--perl name] [--flex name] [--bison name] [--make name]
+ [--dot name] [--platform target] [--prefix dir] [--docdir dir]
+ [--install name] [--english-only] [----enable-langs list]
+ [--with-doxywizard] [--with-doxyapp]
+
+Options:
+
+ --help Print this help
+ --shared | --static Build using shared or static linking
+ [default: shared]
+ --release | --debug Build for release or debug
+ [default: release]
+ --perl name Use \`name' as the name of the perl interpreter
+ [default: autodetect]
+ --flex name Use \`name' as the name of the GNU lexical scanner
+ [default: autodetect]
+ --bison name Use \`name' as the name of the GNU compiler generator
+ [default: autodetect]
+ --make name Use \`name' as the name of the GNU make tool
+ [default: autodetect]
+ --dot name Use \`name' as the name of the dot tool that
+ is part of the Graphviz package.
+ [default: autodetect]
+ --platform target Do not detect platform but use \`target' instead.
+ See PLATFORMS for a list of possibilities
+ --prefix dir Installation prefix directory (doxygen will be
+ put in PREFIX/bin/doxygen)
+ [default: $f_prefix]
+ --docdir dir Documentation is installed in DOCDIR/
+ [default: PREFIX/share/doc/packages/doxygen]
+ --install name Use \`name' as the name of the GNU install tool
+ [default: autodetect]
+ --english-only Include support for English only.
+ --enable-langs list Include support for output languages listed in list.
+ [default: $f_langs]
+ --with-doxywizard Build the GUI frontend for doxygen. This
+ requires Qt 3.3.x
+ --with-doxyapp Example showing how to embed doxygen in an application.
+
+EOF
+ test "$f_error" = y && exit 1
+ exit 0;
+fi
+
+u_release=`(uname -r) 2>/dev/null` || u_release=unknown
+u_system=`(uname -s) 2>/dev/null` || u_system=unknown
+
+if test -z "$f_platform"; then
+ f_platforms="`cat PLATFORMS`"
+
+ case "$u_system:$u_release" in
+ AIX*)
+ f_platform=aix-xlc
+ ;;
+ BeOS*)
+ f_platform=beos-g++
+ ;;
+ dgux:*)
+ f_platform=dgux-g++
+ ;;
+ Darwin:*)
+ f_platform=macosx-c++
+ if test "$f_insttool" = NO; then
+ f_insttool=/usr/bin/install
+ fi
+ ;;
+ FreeBSD:*)
+ f_platform=freebsd-g++
+ if test "$f_insttool" = NO; then
+ f_insttool=/usr/bin/install
+ fi
+ ;;
+ HP-UX:*)
+ f_platform=hpux-g++
+ if test "$f_insttool" = NO; then
+ f_insttool=/usr/bin/install
+ fi
+ ;;
+ IRIX64:*)
+ f_platform=irix-64
+ ;;
+ IRIX:*)
+ f_platform=irix-n32
+ ;;
+ Linux:*|GNU:*|GNU/*:*)
+ f_platform=linux-g++
+ ;;
+ NetBSD:*)
+ f_platform=netbsd-g++
+ ;;
+ OpenBSD:*)
+ f_platform=openbsd-g++
+ ;;
+ OSF1:*)
+ f_platform=osf1-g++
+ ;;
+ QNX:*)
+ f_platform=qnx-g++
+ ;;
+ *:3.2)
+ f_platform=sco-g++
+ ;;
+ SunOS:4*)
+ f_platform=sunos-g++
+ ;;
+ SunOS:5*)
+ f_platform=solaris-g++
+ if test "$f_insttool" = NO; then
+ f_insttool=/usr/bin/install
+ fi
+ ;;
+ ULTRIX:*)
+ f_platform=ultrix-g++
+ ;;
+ UNIX_SV:4.2*)
+ f_platform=unixware-g++
+ ;;
+ Cygwin:*|CYGWIN*)
+ f_platform=win32-g++
+ ;;
+ *MiNT:*)
+ f_platform=m68k-atari-mint-g++
+ ;;
+ *)
+ echo
+ echo "Your platform was not recognised by this configure script"
+ echo "Please use the -platform option to specify one of platforms"
+ echo "in this list:"
+ echo
+ for p in $f_platforms
+ do
+ echo " $0 $* -platform $p"
+ done
+ echo
+ exit 2
+ esac
+ echo " Autodetected platform $f_platform... "
+ f_plf_auto=YES
+fi
+
+if test -z "$f_docdir"; then
+ f_docdir='$(INSTALL)/share/doc/packages/doxygen'
+fi
+
+if test "$f_plf_auto" = NO; then
+ echo -n " Checking for platform $f_platform... "
+ if test '!' -d tmake/lib/$f_platform; then
+ echo "not supported!"
+ echo
+ exit 2
+ fi
+ echo "supported"
+fi
+
+#- check for qt --------------------------------------------------------------
+
+if test "$f_wizard" = YES; then
+ if test -z "$QTDIR"; then
+ echo " QTDIR environment variable not set!"
+ echo -n " Checking for Qt..."
+ for d in /usr/{lib,share,qt}/{qt-4,qt4,qt,qt*,4} /usr; do
+ if test -x "$d/bin/qmake"; then
+ QTDIR=$d
+ fi
+ done
+ else
+ echo " Detected Qt via the QTDIR environment variable..."
+ echo -n " "
+ fi
+ if test -z "$QTDIR"; then
+ echo "QTDIR not set and Qt not found at standard locations!"
+ echo
+ echo "Set the QTDIR environment variable such that \$QTDIR/bin/qmake exists."
+ echo "check the Qt installation instructions!"
+ exit 2
+ fi
+fi
+
+# - check for make ------------------------------------------------------------
+
+echo -n " Checking for GNU make tool... "
+if test "$f_make" = NO; then
+ make_names="gmake make"
+ make_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin"
+ make_prog=NO
+ for i in $make_names; do
+ for j in $make_dirs; do
+ if test -x "$j/$i"; then
+ if test -n "`$j/$i --version 2>/dev/null | grep GNU`"; then
+ make_prog="$j/$i"
+ break 2
+ fi
+ fi
+ done
+ done
+ f_make="$make_prog"
+fi
+
+if test "$f_make" = NO; then
+ echo "not found!";
+ echo
+ exit 2
+fi
+echo "using $f_make"
+
+# - check for install ------------------------------------------------------------
+
+echo -n " Checking for GNU install tool... "
+if test "$f_insttool" = NO; then
+ install_names="ginstall install"
+ install_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin /usr/ucb"
+ install_prog=NO
+ install_found=NO
+ for i in $install_names; do
+ for j in $install_dirs; do
+ if test -x "$j/$i"; then
+ if test -n "`$j/$i --version 2>/dev/null | grep utils`"; then
+ install_found=YES
+ install_prog="$j/$i"
+ break 2
+ fi
+ fi
+ done
+ done
+ f_insttool="$install_prog"
+fi
+
+if test "$f_insttool" = NO; then
+ if test "$install_found" = YES; then
+ echo;
+ else
+ echo "not found!";
+ echo
+ fi
+ echo "GNU version of install is required: this is part of the fileutils/coreutils package: "
+ echo "see http://www.gnu.org/software/fileutils/fileutils.html"
+ echo
+ exit 2
+fi
+echo "using $f_insttool";
+
+
+# - check for dot ------------------------------------------------------------
+
+echo -n " Checking for dot (part of GraphViz)... "
+if test "$f_dot" = NO; then
+ dot_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin"
+ dot_prog=NO
+ for j in $dot_dirs; do
+ if test -x "$j/dot"; then
+ dot_prog="$j/dot"
+ break 2
+ fi
+ done
+ f_dot="$dot_prog"
+fi
+
+if test "$f_dot" = NO; then
+ echo "not found!";
+else
+ echo "using $f_dot"
+fi
+
+# - check for perl ------------------------------------------------------------
+
+echo -n " Checking for perl... "
+if test "$f_perl" = NO; then
+ perl_names="perl perl5"
+ perl_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin"
+ perl_prog=NO
+ perl_found=NO
+ for i in $perl_names; do
+ for j in $perl_dirs; do
+ if test -x "$j/$i"; then
+ perl_found=YES
+ if $j/$i -e 'require 5.000;' 2>/dev/null ; then
+ perl_prog="$j/$i"
+ break 2
+ fi
+ fi
+ done
+ done
+ f_perl="$perl_prog"
+fi
+
+if test "$f_perl" = NO; then
+ if test "$perl_found" = YES; then
+ echo "version is too old (5.000 or higher is required)."
+ else
+ echo "not found!";
+ fi
+ echo
+ exit 2
+fi
+echo "using $f_perl";
+
+# - check for flex ------------------------------------------------------------
+
+echo -n " Checking for flex... "
+if test "$f_flex" = NO; then
+ flex_dirs="$bin_dirs /usr/bin /usr/local/bin /bin"
+ flex_prog=NO
+ flex_found=NO
+ for j in $flex_dirs; do
+ if test -x "$j/flex"; then
+ flex_found=YES
+ flex_prog="$j/flex"
+ break
+ fi
+ done
+ f_flex="$flex_prog"
+fi
+
+if test "$f_flex" = NO; then
+ echo "not found!";
+ exit 2
+else
+ echo "using $f_flex"
+fi
+
+# - check for bison ------------------------------------------------------------
+
+echo -n " Checking for bison... "
+if test "$f_bison" = NO; then
+ bison_dirs="$bin_dirs /usr/bin /usr/local/bin /bin"
+ bison_prog=NO
+ bison_found=NO
+ for j in $bison_dirs; do
+ if test -x "$j/bison"; then
+ bison_found=YES
+ bison_prog="$j/bison"
+ break
+ fi
+ done
+ f_bison="$bison_prog"
+fi
+
+if test "$f_bison" = NO; then
+ echo "not found!";
+ exit 2
+else
+ echo "using $f_bison"
+fi
+
+# -----------------------------------------------------------------------------
+
+#
+# Make VERSION file
+#
+echo " Creating VERSION file."
+# Output should be something like 1.4.5-20051010
+if test "x$doxygen_version_mmn" = "xNO"; then
+ echo "$doxygen_version_major.$doxygen_version_minor.$doxygen_version_revision" > VERSION
+else
+ echo "$doxygen_version_major.$doxygen_version_minor.$doxygen_version_revision-$doxygen_version_mmn" > VERSION
+fi
+
+test -f .makeconfig && rm .makeconfig
+test -f .tmakeconfig && rm .tmakeconfig
+
+configPWD=`pwd`
+
+cat > .makeconfig <<EOF
+DOXYGEN = $configPWD
+TMAKEPATH = $configPWD/tmake/lib/$f_platform
+ENV = env TMAKEPATH=\$(TMAKEPATH)
+TMAKE = $configPWD/tmake/bin/tmake
+MAKE = $f_make
+PERL = $f_perl
+RM = rm -f
+CP = cp
+VERSION = `cat VERSION`
+INSTALL = $f_prefix
+INSTTOOL = $f_insttool
+DOXYDOCS = ..
+DOCDIR = $f_docdir
+QTDIR = $QTDIR
+EOF
+
+if test "$f_dot" != NO; then
+ cat >> .makeconfig <<EOF
+HAVE_DOT = $f_dot
+EOF
+fi
+
+if test "$f_platform" = "m68k-atari-mint-g++"; then
+ cat >> .makeconfig <<EOF
+TMAKE += -unix
+EOF
+fi
+
+if test "$f_platform" = "macosx-c++"; then
+ cat >> .makeconfig <<EOF
+MKSPECS = -spec macx-g++
+EOF
+fi
+if test "$f_platform" = "macosx-uni-c++"; then
+ cat >> .makeconfig <<EOF
+MKSPECS = -spec macx-g++
+EOF
+ fi
+
+
+# Make doxygen.spec...
+#
+echo " Created doxygen.spec file, for rpm generation."
+
+echo "%define version $doxygen_version_major.$doxygen_version_minor.$doxygen_version_revision" > spec.tmp
+if test "$doxygen_version_mmn" = NO; then
+ echo "%define revision 1" >> spec.tmp
+ echo "%define mmn 1" >> spec.tmp
+else
+ echo "%define revision $doxygen_version_mmn" >> spec.tmp
+ echo "%define mmn $doxygen_version_mmn" >> spec.tmp
+fi
+
+mkdir -p packages
+mkdir -p packages/rpm
+
+cat spec.tmp ./packages/rpm/doxygen.spec.in > ./packages/rpm/doxygen.spec
+
+rm -f spec.tmp
+
+
+# make .tmakeconfig
+#
+touch .tmakeconfig
+if test "$f_shared" = NO; then
+ if test "$f_platform" = "osf1-cxx" -o "$f_platform" = "irix-n32"; then
+ cat >> .tmakeconfig <<EOF
+ TMAKE_LFLAGS += -non_shared
+EOF
+ elif test "$f_platform" = "solaris-cc"; then
+ cat >> .tmakeconfig <<EOF
+ TMAKE_LFLAGS += -Bstatic
+EOF
+ elif test "$f_platform" = "hpux-cc"; then
+ cat >> .tmakeconfig <<EOF
+ TMAKE_LFLAGS += -noshared
+EOF
+ else
+ cat >> .tmakeconfig <<EOF
+ TMAKE_LFLAGS += -static
+EOF
+ fi
+fi
+if test "$f_platform" = "hpux-g++" -o "$f_platform" = "linux-g++"; then
+ cat >> .tmakeconfig <<EOF
+ TMAKE_CXXFLAGS += -D_LARGEFILE_SOURCE
+EOF
+fi
+if test "$f_platform" = "macosx-uni-c++"; then
+ if test -n "`ls /Developer/SDKs/MacOSX10.*.sdk 2>/dev/null`"; then
+ mac_sdk=MacOSX10.4u.sdk
+ fi
+ if test -n "`ls /Developer/SDKs/MacOSX10.5*.sdk 2>/dev/null`"; then
+ mac_sdk=MacOSX10.5.sdk
+ fi
+ if test -n $mac_sdk; then
+ cat >> .tmakeconfig <<EOF
+ TMAKE_CFLAGS += -isysroot /Developer/SDKs/$mac_sdk
+ TMAKE_CXXFLAGS += -isysroot /Developer/SDKs/$mac_sdk
+ TMAKE_LFLAGS += -Wl,-syslibroot,/Developer/SDKs/$mac_sdk
+EOF
+ fi
+fi
+if test "$f_wizard" = YES; then
+ cat >> .tmakeconfig <<EOF
+TMAKE_MOC = $QTDIR/bin/moc
+EOF
+fi
+
+if test "$f_english" = YES; then
+ cat >> .tmakeconfig <<EOF
+TMAKE_CXXFLAGS += -DENGLISH_ONLY
+EOF
+fi
+
+f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in addon/doxmlparser/examples/metrics/Makefile.in libmd5/Makefile.in addon/doxyapp/Makefile.in"
+
+for i in $f_inmakefiles ; do
+ SRC=$i
+ DST=`echo $i|sed 's%\(.*\).in$%\1%'`
+ TIME=`date`
+ cat > $DST <<EOF
+#
+# This file was generated from `basename $i` on $TIME
+#
+
+EOF
+ cat .makeconfig >> $DST
+ if test $i = Makefile.in; then
+ echo "" >> $DST
+ echo "all: src/version.cpp " >> $DST
+ echo " \$(MAKE) -C qtools" >> $DST
+ echo " \$(MAKE) -C libmd5" >> $DST
+ echo " \$(MAKE) -C src" >> $DST
+ if test $f_wizard = YES; then
+ echo " \$(MAKE) MAN1DIR=\$(MAN1DIR) -C addon/doxywizard" >> $DST
+ fi
+ if test $f_app = YES; then
+ echo " \$(MAKE) -C addon/doxyapp" >> $DST
+ fi
+ echo "" >> $DST
+ echo "doxywizard_install:" >> $DST
+ if test $f_wizard = YES; then
+ echo " \$(MAKE) MAN1DIR=\$(MAN1DIR) -C addon/doxywizard install" >> $DST
+ fi
+ echo "" >> $DST
+ fi
+ if test $f_wizard = YES; then
+ sed -e "s/%%WITHDOXYWIZARD%% /--with doxywizard /g" $SRC >> $DST
+ else
+ sed -e "s/%%WITHDOXYWIZARD%% //g" $SRC >> $DST
+ fi
+ echo " Created $DST from $SRC..."
+done
+
+f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libmd5/libmd5.pro.in addon/doxyapp/doxyapp.pro.in"
+
+for i in $f_inprofiles ; do
+ SRC=$i
+ DST=`echo $i|sed 's%\(.*\).in$%\1%'`
+ TIME=`date`
+ cat > $DST <<EOF
+#
+# This file was generated from `basename $i` on $TIME
+#
+
+EOF
+ if test "$f_debug" = NO; then
+ realopts="release"
+ else
+ realopts="debug"
+ fi
+ #if test "$f_thread" = YES; then
+ # realopts="$realopts thread"
+ #fi
+ cat $SRC .tmakeconfig | sed -e "s/\$extraopts/$realopts/g" >> $DST
+ echo " Created $DST from $SRC..."
+done
+
+# - generating src/lang_cfg.h
+
+if test -f "src/lang_cfg.h"; then
+ chmod u+w src/lang_cfg.h # make sure file can be overwritten
+fi
+echo -n " Generating src/lang_cfg.h..."
+echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>);
+ chomp @l;
+ @allowed=(split(/,/,"NL,SV,CZ,FR,ID,IT,DE,JP,JE,ES,FI,RU,HR,PL,PT,HU,KR,KE,RO,SI,CN,NO,MK,BR,DK,SK,UA,GR,TW,SR,CA,LT,ZA,AR,FA,SC,VI,TR,EO"));
+ foreach my $elem (@l){
+ $elem =~ tr/a-z/A-Z/;
+ $r=0;
+ foreach my $tst (@allowed){
+ if ($tst eq $elem) { $r=1; last; }
+ }
+ if ($r!=1) { die "ERROR: Invalid language $elem was selected!\n"; }
+ print "#define LANG_$elem\n";
+ };' > ./src/lang_cfg.h
+echo
diff --git a/doc/Doxyfile b/doc/Doxyfile
new file mode 100644
index 0000000..b0f281e
--- /dev/null
+++ b/doc/Doxyfile
@@ -0,0 +1,51 @@
+#
+#
+#
+# Copyright (C) 1997-1999 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+
+PROJECT_NAME = "Doxygen manual"
+OUTPUT_DIRECTORY = ..
+HTML_HEADER =
+HTML_FOOTER =
+QUIET = NO
+WARNINGS = YES
+DISABLE_INDEX = YES
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+GENERATE_MAN = NO
+GENERATE_LATEX = YES
+GENERATE_HTML = YES
+GENERATE_HTMLHELP = YES
+GENERATE_RTF = NO
+GENERATE_XML = NO
+ENABLED_SECTIONS = logo_on
+ENABLE_PREPROCESSING = NO
+CASE_SENSE_NAMES = NO
+IMAGE_PATH = .
+INPUT = index.doc install.doc starting.doc docblocks.doc lists.doc \
+ grouping.doc formulas.doc diagrams.doc preprocessing.doc \
+ autolink.doc output.doc searching.doc customize.doc custcmd.doc \
+ external.doc faq.doc trouble.doc features.doc \
+ doxygen_usage.doc doxytag_usage.doc \
+ doxywizard_usage.doc installdox_usage.doc \
+ config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \
+ perlmod.doc perlmod_tree.doc arch.doc
+FILE_PATTERNS = *.cpp *.h *.doc
+EXAMPLE_PATH = ../examples
+RECURSIVE = NO
+TAGFILES =
+ALLEXTERNALS = NO
+PERL_PATH = /usr/bin/perl
+SEARCHENGINE = NO
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+STRIP_CODE_COMMENTS = NO
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..6fb33c7
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,56 @@
+#
+# This file was generated from Makefile.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+DOXYGEN = /Users/dimitri/doxygen
+TMAKEPATH = /Users/dimitri/doxygen/tmake/lib/macosx-c++
+ENV = env TMAKEPATH=$(TMAKEPATH)
+TMAKE = /Users/dimitri/doxygen/tmake/bin/tmake
+MAKE = /opt/local/bin/gmake
+PERL = /opt/local/bin/perl
+RM = rm -f
+CP = cp
+VERSION = 1.7.3
+INSTALL = /usr/local
+INSTTOOL = /opt/local/bin/ginstall
+DOXYDOCS = ..
+DOCDIR = $(INSTALL)/share/doc/packages/doxygen
+QTDIR = /usr
+HAVE_DOT = /usr/local/bin/dot
+MKSPECS = -spec macx-g++
+#
+#
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+
+all: language FORCE
+ DOXYGEN_DOCDIR=$(DOXYDOCS); \
+ export DOXYGEN_DOCDIR; \
+ VERSION=$(VERSION) ; \
+ export VERSION; \
+ $(DOXYGEN)/bin/doxygen
+ @rm -f ../latex/refman.tex
+ @cp doxygen_logo*.gif ../html
+ @cp Makefile.latex ../latex/Makefile
+ @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen_manual.tex >../latex/doxygen_manual.tex
+ @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen.sty >../latex/doxygen.sty
+ @epstopdf doxygen_logo.eps --outfile=../latex/doxygen_logo.pdf
+
+clean:
+ rm -rf ../html ../latex *.bak
+
+language: language.doc
+
+language.doc: $(wildcard ../src/translator*.h) maintainers.txt language.tpl translator.py
+ python translator.py
+
+FORCE:
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..5e0f9aa
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,36 @@
+#
+#
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+
+all: language FORCE
+ DOXYGEN_DOCDIR=$(DOXYDOCS); \
+ export DOXYGEN_DOCDIR; \
+ VERSION=$(VERSION) ; \
+ export VERSION; \
+ $(DOXYGEN)/bin/doxygen
+ @rm -f ../latex/refman.tex
+ @cp doxygen_logo*.gif ../html
+ @cp Makefile.latex ../latex/Makefile
+ @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen_manual.tex >../latex/doxygen_manual.tex
+ @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen.sty >../latex/doxygen.sty
+ @epstopdf doxygen_logo.eps --outfile=../latex/doxygen_logo.pdf
+
+clean:
+ rm -rf ../html ../latex *.bak
+
+language: language.doc
+
+language.doc: $(wildcard ../src/translator*.h) maintainers.txt language.tpl translator.py
+ python translator.py
+
+FORCE:
diff --git a/doc/Makefile.latex b/doc/Makefile.latex
new file mode 100644
index 0000000..55f275d
--- /dev/null
+++ b/doc/Makefile.latex
@@ -0,0 +1,25 @@
+#
+#
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+
+all: doxygen_manual.pdf
+
+doxygen_manual.pdf: doxygen_manual.tex doxygen.sty
+ echo "Running latex..."
+ pdflatex doxygen_manual.tex
+ echo "Running makeindex..."
+ makeindex doxygen_manual.idx
+ echo "Rerunning latex...."
+ pdflatex doxygen_manual.tex
+clean:
+ rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log doxygen_manual.pdf
diff --git a/doc/Makefile.win_make.in b/doc/Makefile.win_make.in
new file mode 100644
index 0000000..c6262ec
--- /dev/null
+++ b/doc/Makefile.win_make.in
@@ -0,0 +1,36 @@
+#
+#
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+
+all: language FORCE
+ @xcopy /s /q /i ..\examples ..\html\examples
+ set DOXYGEN_DOCDIR=. & \
+ set VERSION=$(VERSION) & \
+ $(DOXYGEN)\bin\doxygen
+ @del ..\latex\refman.tex
+ @copy doxygen_logo*.gif ..\html
+ @copy Makefile.latex ..\latex\Makefile
+ @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen_manual.tex >..\latex\doxygen_manual.tex
+ @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen.sty >..\latex\doxygen.sty
+ @epstopdf doxygen_logo.eps --outfile=..\latex\doxygen_logo.pdf
+
+clean:
+ del /s /q ..\html ..\latex
+ del translator_report.txt *.bak
+
+language: language.doc
+
+language.doc: maintainers.txt language.tpl translator.py
+ set DOXYGEN_DOCDIR=. & set VERSION=$(VERSION) & python translator.py
+
+FORCE:
diff --git a/doc/Makefile.win_nmake.in b/doc/Makefile.win_nmake.in
new file mode 100644
index 0000000..e98c46f
--- /dev/null
+++ b/doc/Makefile.win_nmake.in
@@ -0,0 +1,38 @@
+#
+#
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+
+all: language FORCE
+ @xcopy /s /q /i ..\examples ..\html\examples
+ set DOXYGEN_DOCDIR=.
+ set VERSION=$(VERSION)
+ $(DOXYGEN)\bin\doxygen
+ @del ..\latex\refman.tex
+ @copy doxygen_logo*.gif ..\html
+ @copy Makefile.latex ..\latex\Makefile
+ @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen_manual.tex >..\latex\doxygen_manual.tex
+ @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen.sty >..\latex\doxygen.sty
+ @epstopdf doxygen_logo.eps --outfile=..\latex\doxygen_logo.pdf
+
+clean:
+ del /s /q ..\html ..\latex
+ del translator_report.txt *.bak
+
+language: language.doc
+
+language.doc: maintainers.txt language.tpl translator.py
+ set DOXYGEN_DOCDIR=.
+ set VERSION=$(VERSION)
+ python translator.py
+
+FORCE:
diff --git a/doc/arch.doc b/doc/arch.doc
new file mode 100644
index 0000000..cdaf7b7
--- /dev/null
+++ b/doc/arch.doc
@@ -0,0 +1,242 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page arch Doxygen's Internals
+
+<h3>Doxygen's internals</h3>
+
+<B>Note that this section is still under construction!</B>
+
+The following picture shows how source files are processed by doxygen.
+
+\image html archoverview.gif "Data flow overview"
+\image latex archoverview.eps "Data flow overview" width=14cm
+
+The following sections explain the steps above in more detail.
+
+<h3>Config parser</h3>
+
+The configuration file that controls the settings of a project is parsed
+and the settings are stored in the singleton class \c Config
+in <code>src/config.h</code>. The parser itself is written using \c flex
+and can be found in <code>src/config.l</code>. This parser is also used
+directly by \c doxywizard, so it is put in a separate library.
+
+Each configuration option has one of 5 possible types: \c String,
+\c List, \c Enum, \c Int, or \c Bool. The values of these options are
+available through the global functions \c Config_getXXX(), where \c XXX is the
+type of the option. The argument of these function is a string naming
+the option as it appears in the configuration file. For instance:
+\c Config_getBool("GENERATE_TESTLIST") returns a reference to a boolean
+value that is \c TRUE if the test list was enabled in the config file.
+
+The function \c readConfiguration() in \c src/doxygen.cpp
+reads the command line options and then calls the configuration parser.
+
+<h3>C Preprocessor</h3>
+
+The input files mentioned in the config file are (by default) fed to the
+C Preprocessor (after being piped through a user defined filter if available).
+
+The way the preprocessor works differs somewhat from a standard C Preprocessor.
+By default it does not do macro expansion, although it can be configured to
+expand all macros. Typical usage is to only expand a user specified set
+of macros. This is to allow macro names to appear in the type of
+function parameters for instance.
+
+Another difference is that the preprocessor parses, but not actually includes
+code when it encounters a \#include (with the exception of \#include
+found inside { ... } blocks). The reasons behind this deviation from
+the standard is to prevent feeding multiple definitions of the
+same functions/classes to doxygen's parser. If all source files would
+include a common header file for instance, the class and type
+definitions (and their documentation) would be present in each
+translation unit.
+
+The preprocessor is written using \c flex and can be found in
+\c src/pre.l. For condition blocks (\#if) evaluation of constant expressions
+is needed. For this a \c yacc based parser is used, which can be found
+in \c src/constexp.y and \c src/constexp.l.
+
+The preprocessor is invoked for each file using the \c preprocessFile()
+function declared in \c src/pre.h, and will append the preprocessed result
+to a character buffer. The format of the character buffer is
+
+\verbatim
+0x06 file name 1
+0x06 preprocessed contents of file 1
+...
+0x06 file name n
+0x06 preprocessed contents of file n
+\endverbatim
+
+<h3>Language parser</h3>
+
+The preprocessed input buffer is fed to the language parser, which is
+implemented as a big state machine using \c flex. It can be found
+in the file \c src/scanner.l. There is one parser for all
+languages (C/C++/Java/IDL). The state variables \c insideIDL
+and \c insideJava are uses at some places for language specific choices.
+
+The task of the parser is to convert the input buffer into a tree of entries
+(basically an abstract syntax tree). An entry is defined in \c src/entry.h
+and is a blob of loosely structured information. The most important field
+is \c section which specifies the kind of information contained in the entry.
+
+Possible improvements for future versions:
+ - Use one scanner/parser per language instead of one big scanner.
+ - Move the first pass parsing of documentation blocks to a separate module.
+ - Parse defines (these are currently gathered by the preprocessor, and
+ ignored by the language parser).
+
+<h3>Data organizer</h3>
+
+This step consists of many smaller steps, that build
+dictionaries of the extracted classes, files, namespaces,
+variables, functions, packages, pages, and groups. Besides building
+dictionaries, during this step relations (such as inheritance relations),
+between the extracted entities are computed.
+
+Each step has a function defined in \c src/doxygen.cpp, which operates
+on the tree of entries, built during language parsing. Look at the
+"Gathering information" part of \c parseInput() for details.
+
+The result of this step is a number of dictionaries, which can be
+found in the Doxygen "namespace" defined in \c src/doxygen.h. Most
+elements of these dictionaries are derived from the class \c Definition;
+The class \c MemberDef, for instance, holds all information for a member.
+An instance of such a class can be part of a file ( class \c FileDef ),
+a class ( class \c ClassDef ), a namespace ( class \c NamespaceDef ),
+a group ( class \c GroupDef ), or a Java package ( class \c PackageDef ).
+
+<h3>Tag file parser</h3>
+
+If tag files are specified in the configuration file, these are parsed
+by a SAX based XML parser, which can be found in \c src/tagreader.cpp.
+The result of parsing a tag file is the insertion of \c Entry objects in the
+entry tree. The field \c Entry::tagInfo is used to mark the entry as
+external, and holds information about the tag file.
+
+<h3>Documentation parser</h3>
+
+Special comment blocks are stored as strings in the entities that they
+document. There is a string for the brief description and a string
+for the detailed description. The documentation parser reads these
+strings and executes the commands it finds in it (this is the second pass
+in parsing the documentation). It writes the result directly to the output
+generators.
+
+The parser is written in C++ and can be found in src/docparser.cpp. The
+tokens that are eaten by the parser come from src/doctokenizer.l.
+Code fragments found in the comment blocks are passed on to the source parser.
+
+The main entry point for the documentation parser is \c validatingParseDoc()
+declared in \c src/docparser.h. For simple texts with special
+commands \c validatingParseText() is used.
+
+<h3>Source parser</h3>
+
+If source browsing is enabled or if code fragments are encountered in the
+documentation, the source parser is invoked.
+
+The code parser tries to cross-reference to source code it parses with
+documented entities. It also does syntax highlighting of the sources. The
+output is directly written to the output generators.
+
+The main entry point for the code parser is \c parseCode()
+declared in \c src/code.h.
+
+<h3>Output generators</h3>
+
+After data is gathered and cross-referenced, doxygen generates
+output in various formats. For this it uses the methods provided by
+the abstract class \c OutputGenerator. In order to generate output
+for multiple formats at once, the methods of \c OutputList are called
+instead. This class maintains a list of concrete output generators,
+where each method called is delegated to all generators in the list.
+
+To allow small deviations in what is written to the output for each
+concrete output generator, it is possible to temporarily disable certain
+generators. The OutputList class contains various \c disable() and \c enable()
+methods for this. The methods \c OutputList::pushGeneratorState() and
+\c OutputList::popGeneratorState() are used to temporarily save the
+set of enabled/disabled output generators on a stack.
+
+The XML is generated directly from the gathered data structures. In the
+future XML will be used as an intermediate language (IL). The output
+generators will then use this IL as a starting point to generate the
+specific output formats. The advantage of having an IL is that various
+independently developed tools written in various languages,
+could extract information from the XML output. Possible tools could be:
+- an interactive source browser
+- a class diagram generator
+- computing code metrics.
+
+<h3>Debugging</h3>
+
+Since doxygen uses a lot of \c flex code it is important to understand
+how \c flex works (for this one should read the man page)
+and to understand what it is doing when \c flex is parsing some input.
+Fortunately, when flex is used with the -d option it outputs what rules
+matched. This makes it quite easy to follow what is going on for a
+particular input fragment.
+
+To make it easier to toggle debug information for a given flex file I
+wrote the following perl script, which automatically adds or removes -d
+from the correct line in the Makefile:
+
+\verbatim
+#!/usr/bin/perl
+
+$file = shift @ARGV;
+print "Toggle debugging mode for $file\n";
+
+# add or remove the -d flex flag in the makefile
+unless (rename "Makefile.libdoxygen","Makefile.libdoxygen.old") {
+ print STDERR "Error: cannot rename Makefile.libdoxygen!\n";
+ exit 1;
+}
+if (open(F,"<Makefile.libdoxygen.old")) {
+ unless (open(G,">Makefile.libdoxygen")) {
+ print STDERR "Error: opening file Makefile.libdoxygen for writing\n";
+ exit 1;
+ }
+ print "Processing Makefile.libdoxygen...\n";
+ while (<F>) {
+ if ( s/\(LEX\) (-i )?-P([a-zA-Z]+)YY -t $file/(LEX) -d \1-P\2YY -t $file/g ) {
+ print "Enabling debug info for $file\n";
+ }
+ elsif ( s/\(LEX\) -d (-i )?-P([a-zA-Z]+)YY -t $file/(LEX) \1-P\2YY -t $file/g ) {
+ print "Disabling debug info for $file\n";
+ }
+ print G "$_";
+ }
+ close F;
+ unlink "Makefile.libdoxygen.old";
+}
+else {
+ print STDERR "Warning file Makefile.libdoxygen.old does not exist!\n";
+}
+
+# touch the file
+$now = time;
+utime $now, $now, $file
+
+\endverbatim
+
+*/
+
+
diff --git a/doc/archoverview.eps b/doc/archoverview.eps
new file mode 100644
index 0000000..b41d36c
--- /dev/null
+++ b/doc/archoverview.eps
@@ -0,0 +1,380 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: archoverview.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Sat Sep 8 19:41:40 2001
+%%For: root@blizzard (root)
+%%Orientation: Portrait
+%%BoundingBox: 0 0 733 511
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+-31.0 537.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def
+ /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc 0 0 1 startangle endangle arc
+ closepath
+ savematrix setmatrix
+ } def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 9949 m -1000 -1000 l 13719 -1000 l 13719 9949 l cp clip
+ 0.06000 0.06000 sc
+7.500 slw
+% Ellipse
+n 4425 1725 900 900 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 5100 4200 900 900 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 10500 4275 900 900 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 2402 4198 900 900 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 7863 8104 837 837 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 5113 6622 887 887 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 9375 6450 837 837 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 7800 4200 900 900 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+gs clippath
+1380 4170 m 1500 4200 l 1380 4230 l 1515 4230 l 1515 4170 l cp
+clip
+n 600 4200 m 1500 4200 l gs col0 s gr gr
+
+% arrowhead
+n 1380 4170 m 1500 4200 l 1380 4230 l 1380 4200 l 1380 4170 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+4080 4170 m 4200 4200 l 4080 4230 l 4215 4230 l 4215 4170 l cp
+clip
+n 3300 4200 m 4200 4200 l gs col0 s gr gr
+
+% arrowhead
+n 4080 4170 m 4200 4200 l 4080 4230 l 4080 4200 l 4080 4170 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+9480 4170 m 9600 4200 l 9480 4230 l 9615 4230 l 9615 4170 l cp
+clip
+n 8700 4200 m 9600 4200 l gs col0 s gr gr
+
+% arrowhead
+n 9480 4170 m 9600 4200 l 9480 4230 l 9480 4200 l 9480 4170 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+11881 3482 m 12000 3450 l 11910 3535 l 12028 3469 l 11999 3416 l cp
+clip
+n 11325 3825 m 12000 3450 l gs col0 s gr gr
+
+% arrowhead
+n 11881 3482 m 12000 3450 l 11910 3535 l 11895 3508 l 11881 3482 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+11876 4050 m 12000 4050 l 11891 4108 l 12022 4075 l 12007 4017 l cp
+clip
+n 11400 4200 m 12000 4050 l gs col0 s gr gr
+
+% arrowhead
+n 11876 4050 m 12000 4050 l 11891 4108 l 11884 4079 l 11876 4050 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+11900 5028 m 12000 5100 l 11877 5083 l 12003 5133 l 12025 5078 l cp
+clip
+n 11250 4800 m 12000 5100 l gs col0 s gr gr
+
+% arrowhead
+n 11900 5028 m 12000 5100 l 11877 5083 l 11889 5055 l 11900 5028 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+11891 4517 m 12000 4575 l 11876 4575 l 12007 4608 l 12022 4550 l cp
+clip
+n 11400 4425 m 12000 4575 l gs col0 s gr gr
+
+% arrowhead
+n 11891 4517 m 12000 4575 l 11876 4575 l 11884 4546 l 11891 4517 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+11880 2820 m 12000 2850 l 11880 2880 l 12015 2880 l 12015 2820 l cp
+clip
+n 7800 3300 m 7800 2850 l 12000 2850 l gs col0 s gr gr
+
+% arrowhead
+n 11880 2820 m 12000 2850 l 11880 2880 l 11880 2850 l 11880 2820 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+10470 5295 m 10500 5175 l 10530 5295 l 10530 5160 l 10470 5160 l cp
+clip
+n 8700 8100 m 10500 8100 l 10500 5175 l gs col0 s gr gr
+
+% arrowhead
+n 10470 5295 m 10500 5175 l 10530 5295 l 10500 5295 l 10470 5295 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+4455 705 m 4425 825 l 4395 705 l 4395 840 l 4455 840 l cp
+clip
+n 4425 450 m 4425 825 l gs col0 s gr gr
+
+% arrowhead
+n 4455 705 m 4425 825 l 4395 705 l 4425 705 l 4455 705 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+ [60] 0 sd
+gs clippath
+3405 1695 m 3525 1725 l 3405 1755 l 3540 1755 l 3540 1695 l cp
+clip
+n 3525 1725 m 2400 1725 l 2400 3300 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 3405 1695 m 3525 1725 l 3405 1755 l 3405 1725 l 3405 1695 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+ [60] 0 sd
+gs clippath
+5445 1680 m 5325 1650 l 5445 1620 l 5310 1620 l 5310 1680 l cp
+clip
+n 5325 1650 m 7575 1650 l 7575 3300 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 5445 1680 m 5325 1650 l 5445 1620 l 5445 1650 l 5445 1680 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+ [60] 0 sd
+gs clippath
+4845 2670 m 4875 2550 l 4905 2670 l 4905 2535 l 4845 2535 l cp
+clip
+n 4875 2550 m 4875 3300 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+n 4845 2670 m 4875 2550 l 4905 2670 l 4875 2670 l 4845 2670 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+ [60] 0 sd
+n 7575 1650 m 10500 1650 l 10500 3375 l gs col0 s gr [] 0 sd
+% Polyline
+gs clippath
+6930 8070 m 7050 8100 l 6930 8130 l 7065 8130 l 7065 8070 l cp
+clip
+n 2400 5100 m 2400 8100 l 7050 8100 l gs col0 s gr gr
+
+% arrowhead
+n 6930 8070 m 7050 8100 l 6930 8130 l 6930 8100 l 6930 8070 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+6780 4170 m 6900 4200 l 6780 4230 l 6915 4230 l 6915 4170 l cp
+clip
+n 6000 4200 m 6900 4200 l gs col0 s gr gr
+
+% arrowhead
+n 6780 4170 m 6900 4200 l 6780 4230 l 6780 4200 l 6780 4170 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+7090 4932 m 7200 4875 l 7130 4977 l 7231 4887 l 7191 4843 l cp
+clip
+n 5850 6075 m 7200 4875 l gs col0 s gr gr
+
+% arrowhead
+n 7090 4932 m 7200 4875 l 7130 4977 l 7110 4955 l 7090 4932 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+7830 7155 m 7800 7275 l 7770 7155 l 7770 7290 l 7830 7290 l cp
+clip
+n 7800 7275 m 7800 5100 l gs col0 s gr gr
+
+% arrowhead
+n 7830 7155 m 7800 7275 l 7770 7155 l 7800 7155 l 7830 7155 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+8886 5583 m 8925 5700 l 8835 5615 l 8908 5729 l 8958 5697 l cp
+clip
+n 8400 4875 m 8925 5700 l gs col0 s gr gr
+
+% arrowhead
+n 8886 5583 m 8925 5700 l 8835 5615 l 8861 5599 l 8886 5583 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+8575 7427 m 8475 7500 l 8529 7389 l 8442 7492 l 8488 7531 l cp
+clip
+n 8850 7050 m 8475 7500 l gs col0 s gr gr
+
+% arrowhead
+n 8575 7427 m 8475 7500 l 8529 7389 l 8552 7408 l 8575 7427 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+10106 5255 m 10200 5175 l 10155 5290 l 10233 5180 l 10184 5145 l cp
+clip
+n 9825 5700 m 10200 5175 l gs col0 s gr gr
+
+% arrowhead
+n 10106 5255 m 10200 5175 l 10155 5290 l 10130 5273 l 10106 5255 l cp gs 0.00 setgray ef gr col0 s
+/Helvetica ff 180.00 scf sf
+3900 1725 m
+gs 1 -1 sc (Config parser) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4425 4275 m
+gs 1 -1 sc (Language parser) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1725 4275 m
+gs 1 -1 sc (C Preprocessor) col0 sh gr
+/Helvetica ff 180.00 scf sf
+12150 3525 m
+gs 1 -1 sc (HTML) col0 sh gr
+/Helvetica ff 180.00 scf sf
+12150 4125 m
+gs 1 -1 sc (LaTeX) col0 sh gr
+/Helvetica ff 180.00 scf sf
+12150 4650 m
+gs 1 -1 sc (RTF) col0 sh gr
+/Helvetica ff 180.00 scf sf
+12150 2925 m
+gs 1 -1 sc (XML) col0 sh gr
+/Helvetica ff 180.00 scf sf
+3450 4500 m
+gs 1 -1 sc (input) col0 sh gr
+/Helvetica ff 180.00 scf sf
+3450 4725 m
+gs 1 -1 sc (string) col0 sh gr
+/Helvetica ff 180.00 scf sf
+6150 4500 m
+gs 1 -1 sc (entry) col0 sh gr
+/Helvetica ff 180.00 scf sf
+6150 4725 m
+gs 1 -1 sc (tree) col0 sh gr
+/Helvetica ff 180.00 scf sf
+525 3975 m
+gs 1 -1 sc (input files) col0 sh gr
+/Helvetica ff 180.00 scf sf
+12150 5175 m
+gs 1 -1 sc (Man) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4650 750 m
+gs 1 -1 sc (config file) col0 sh gr
+/Helvetica ff 180.00 scf sf
+7950 5475 m
+gs 1 -1 sc (drives) col0 sh gr
+/Helvetica ff 180.00 scf sf
+8850 4050 m
+gs 1 -1 sc (drives) col0 sh gr
+/Helvetica ff 180.00 scf sf
+2475 3150 m
+gs 1 -1 sc (get settings) col0 sh gr
+/Helvetica ff 180.00 scf sf
+6675 5550 m
+gs 1 -1 sc (entry) col0 sh gr
+/Helvetica ff 180.00 scf sf
+6675 5775 m
+gs 1 -1 sc (tree) col0 sh gr
+/Helvetica ff 180.00 scf sf
+9525 5325 m
+gs 1 -1 sc (drives) col0 sh gr
+/Helvetica ff 180.00 scf sf
+8700 7500 m
+gs 1 -1 sc (drives) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4575 6675 m
+gs 1 -1 sc (tag file parser) col0 sh gr
+/Helvetica ff 180.00 scf sf
+8925 6525 m
+gs 1 -1 sc (Doc Parser) col0 sh gr
+/Helvetica ff 180.00 scf sf
+7275 8175 m
+gs 1 -1 sc (Source Parser) col0 sh gr
+/Helvetica ff 180.00 scf sf
+7200 4275 m
+gs 1 -1 sc (Data organiser) col0 sh gr
+/Helvetica ff 180.00 scf sf
+9750 4275 m
+gs 1 -1 sc (Output generators) col0 sh gr
+/Helvetica ff 180.00 scf sf
+8775 8325 m
+gs 1 -1 sc (drives) col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/archoverview.gif b/doc/archoverview.gif
new file mode 100644
index 0000000..f404076
--- /dev/null
+++ b/doc/archoverview.gif
Binary files differ
diff --git a/doc/autolink.doc b/doc/autolink.doc
new file mode 100644
index 0000000..4eb4989
--- /dev/null
+++ b/doc/autolink.doc
@@ -0,0 +1,132 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page autolink Automatic link generation
+
+ Most documentation systems have special `see also' sections where links
+ to other pieces of documentation can be inserted.
+ Although doxygen also has a command to start such a section (See section
+ \ref cmdsa "\\sa"), it does allow you to put these kind of links anywhere in the
+ documentation.
+ For \f$\mbox{\LaTeX}\f$ documentation a reference to the page number
+ is written instead of a link. Furthermore, the index at the end of the
+ document can be used to quickly find the documentation of a member, class,
+ namespace or file.
+ For man pages no reference information is generated.
+
+ The next sections show how to generate links to the various documented
+ entities in a source file.
+
+ \section linkurl Links to web pages and mail addresses
+
+ Doxygen will automatically replace any URLs and mail addresses found in the
+ documentation by links (in HTML). To manually specify link text, use the
+ HTML '<tt>a</tt>' tag:
+ \verbatim <a href="linkURL">link text</a> \endverbatim
+ which will be automatically translated to other output formats by Doxygen.
+
+ \section linkclass Links to classes.
+
+ All words in the documentation that correspond to a documented class and
+ contain at least one non-lower case character will automatically be
+ replaced by a link to the page containing the
+ documentation of the class. If you want to prevent that a word
+ that corresponds to a documented class is replaced by a link you
+ should put a \% in front of the word.
+ To link to an all lower case symbol, use \ref cmdref "\\ref".
+
+ \section linkfile Links to files.
+
+ All words that contain a dot (<tt>.</tt>) that is not the last character
+ in the word are considered to be file names.
+ If the word is indeed the name of a documented input file, a link will
+ automatically be created to the documentation of that file.
+
+ \section linkfunc Links to functions.
+
+ Links to functions are created if one of the following patterns is
+ encountered:
+ <ol>
+ <li><tt>\<functionName\>"("\<argument-list\>")"</tt>
+ <li><tt>\<functionName\>"()"</tt>
+ <li><tt>"::"\<functionName\></tt>
+ <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"("\<argument-list\>")"</tt>
+ <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"("\<argument-list\>")"\<modifiers\></tt>
+ <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"()"</tt>
+ <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\></tt>
+ </ol>
+ where n\>0.
+
+ \par Note 1:
+ Function arguments should be specified with correct types, i.e.
+ 'fun(const std::string&,bool)' or '()' to match any prototype.
+ \par Note 2:
+ Member function modifiers (like 'const' and 'volatile')
+ are required to identify the target, i.e. 'func(int) const' and 'fun(int)'
+ target different member functions.
+ \par Note 3:
+ For JavaDoc compatibility a \# may be used instead of a :: in
+ the patterns above.
+ \par Note 4:
+ In the documentation of a class containing a member foo,
+ a reference to a global variable is made using "::foo", whereas \#foo
+ will link to the member.
+
+ For non overloaded members the argument list may be omitted.
+
+ If a function is overloaded and no matching argument list is specified
+ (i.e. pattern 2 or 6 is used), a link will be created to the
+ documentation of one of the overloaded members.
+
+ For member functions the class scope (as used in patterns 4 to 7) may
+ be omitted, if:
+ <ol>
+ <li>The pattern points to a documented member that belongs to the same class
+ as the documentation block that contains the pattern.
+ <li>The class that corresponds to the documentation blocks that contains
+ the pattern has a base class that contains a documented member
+ that matches the pattern.
+ </ol>
+
+ \section linkother Links to variables, typedefs, enum types, enum values and defines.
+
+ All of these entities can be linked to in the same way as described in the
+ previous section. For sake of clarity it is advised to only use
+ patterns 3 and 7 in this case.
+
+ \par Example:
+ \verbinclude autolink.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/autolink/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by Doxygen.
+ \endhtmlonly
+
+ \section resolving typedefs.
+
+ Typedefs that involve classes, structs and unions, like
+\verbatim
+typedef struct StructName TypeName
+\endverbatim
+ create an alias for StructName, so links will be generated to StructName,
+ when either StructName itself or TypeName is encountered.
+
+ \par Example:
+ \verbinclude restypedef.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/restypedef/html/restypedef_8cpp.html">here</a>
+ for the corresponding HTML documentation that is generated by Doxygen.
+ \endhtmlonly
+*/
diff --git a/doc/commands.doc b/doc/commands.doc
new file mode 100644
index 0000000..bf2b39c
--- /dev/null
+++ b/doc/commands.doc
@@ -0,0 +1,2738 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page commands Special Commands
+
+\section cmd_intro Introduction
+
+All commands in the documentation start with a backslash (<b>\\</b>) or an
+at-sign (<b>\@</b>). If you prefer you can replace all commands starting with a
+backslash below by their counterparts that start with an at-sign.
+
+Some commands have one or more arguments.
+Each argument has a certain range:
+<ul>
+<li>If \<sharp\> braces are used the argument is a single word.
+<li>If (round) braces are used the argument extends until the end of the line
+ on which the command was found.
+<li>If {curly} braces are used the argument extends until the next paragraph.
+ Paragraphs are delimited by a blank line or by a section indicator.
+</ul>
+If in addition to the aboveargument specifiers [square] brackets are used the argument is optional.
+
+Here is an alphabetically sorted list of all commands with references to their
+documentation:
+\secreflist
+\refitem cmda \\a
+\refitem cmdaddindex \\addindex
+\refitem cmdaddtogroup \\addtogroup
+\refitem cmdanchor \\anchor
+\refitem cmdarg \\arg
+\refitem cmdattention \\attention
+\refitem cmdauthor \\author
+\refitem cmdauthors \\authors
+\refitem cmdb \\b
+\refitem cmdbrief \\brief
+\refitem cmdbug \\bug
+\refitem cmdc \\c
+\refitem cmdcallgraph \\callgraph
+\refitem cmdcallergraph \\callergraph
+\refitem cmdcategory \\category
+\refitem cmdclass \\class
+\refitem cmdcode \\code
+\refitem cmdcond \\cond
+\refitem cmdcopybrief \\copybrief
+\refitem cmdcopydetails \\copydetails
+\refitem cmdcopydoc \\copydoc
+\refitem cmddate \\date
+\refitem cmddef \\def
+\refitem cmddefgroup \\defgroup
+\refitem cmddeprecated \\deprecated
+\refitem cmddetails \\details
+\refitem cmddir \\dir
+\refitem cmddontinclude \\dontinclude
+\refitem cmddot \\dot
+\refitem cmddotfile \\dotfile
+\refitem cmde \\e
+\refitem cmdelse \\else
+\refitem cmdelseif \\elseif
+\refitem cmdem \\em
+\refitem cmdendcode \\endcode
+\refitem cmdendcond \\endcond
+\refitem cmdenddot \\enddot
+\refitem cmdendhtmlonly \\endhtmlonly
+\refitem cmdendif \\endif
+\refitem cmdendinternal \\endinternal
+\refitem cmdendlatexonly \\endlatexonly
+\refitem cmdendlink \\endlink
+\refitem cmdendmanonly \\endmanonly
+\refitem cmdendmsc \\endmsc
+\refitem cmdendrtfonly \\endrtfonly
+\refitem cmdendverbatim \\endverbatim
+\refitem cmdendxmlonly \\endxmlonly
+\refitem cmdenum \\enum
+\refitem cmdexample \\example
+\refitem cmdexception \\exception
+\refitem cmdextends \\extends
+\refitem cmdfdollar \\f\$
+\refitem cmdfbropen \\f[
+\refitem cmdfbrclose \\f]
+\refitem cmdfcurlyopen \\f{
+\refitem cmdfcurlyclose \\f}
+\refitem cmdfile \\file
+\refitem cmdfn \\fn
+\refitem cmdheaderfile \\headerfile
+\refitem cmdhideinitializer \\hideinitializer
+\refitem cmdhtmlinclude \\htmlinclude
+\refitem cmdhtmlonly \\htmlonly
+\refitem cmdif \\if
+\refitem cmdifnot \\ifnot
+\refitem cmdimage \\image
+\refitem cmdimplements \\implements
+\refitem cmdinclude \\include
+\refitem cmdincludelineno \\includelineno
+\refitem cmdingroup \\ingroup
+\refitem cmdinternal \\internal
+\refitem cmdinvariant \\invariant
+\refitem cmdinterface \\interface
+\refitem cmdlatexonly \\latexonly
+\refitem cmdli \\li
+\refitem cmdline \\line
+\refitem cmdlink \\link
+\refitem cmdmainpage \\mainpage
+\refitem cmdmanonly \\manonly
+\refitem cmdmemberof \\memberof
+\refitem cmdmsc \\msc
+\refitem cmdmscfile \\mscfile
+\refitem cmdn \\n
+\refitem cmdname \\name
+\refitem cmdnamespace \\namespace
+\refitem cmdnosubgrouping \\nosubgrouping
+\refitem cmdnote \\note
+\refitem cmdoverload \\overload
+\refitem cmdp \\p
+\refitem cmdpackage \\package
+\refitem cmdpage \\page
+\refitem cmdpar \\par
+\refitem cmdparagraph \\paragraph
+\refitem cmdparam \\param
+\refitem cmdpost \\post
+\refitem cmdpre \\pre
+\refitem cmdprivate \\private
+\refitem cmdprivate \\privatesection
+\refitem cmdproperty \\property
+\refitem cmdprotected \\protected
+\refitem cmdprotected \\protectedsection
+\refitem cmdprotocol \\protocol
+\refitem cmdpublic \\public
+\refitem cmdpublic \\publicsection
+\refitem cmdref \\ref
+\refitem cmdrelated \\related
+\refitem cmdrelates \\relates
+\refitem cmdrelatedalso \\relatedalso
+\refitem cmdrelatesalso \\relatesalso
+\refitem cmdremark \\remark
+\refitem cmdremarks \\remarks
+\refitem cmdresult \\result
+\refitem cmdreturn \\return
+\refitem cmdreturns \\returns
+\refitem cmdretval \\retval
+\refitem cmdrtfonly \\rtfonly
+\refitem cmdsa \\sa
+\refitem cmdsection \\section
+\refitem cmdsee \\see
+\refitem cmdshort \\short
+\refitem cmdshowinitializer \\showinitializer
+\refitem cmdsince \\since
+\refitem cmdskip \\skip
+\refitem cmdskipline \\skipline
+\refitem cmdstruct \\struct
+\refitem cmdsubpage \\subpage
+\refitem cmdsubsection \\subsection
+\refitem cmdsubsubsection \\subsubsection
+\refitem cmdtest \\test
+\refitem cmdthrow \\throw
+\refitem cmdthrows \\throws
+\refitem cmdtodo \\todo
+\refitem cmdtparam \\tparam
+\refitem cmdtypedef \\typedef
+\refitem cmdunion \\union
+\refitem cmduntil \\until
+\refitem cmdvar \\var
+\refitem cmdverbatim \\verbatim
+\refitem cmdverbinclude \\verbinclude
+\refitem cmdversion \\version
+\refitem cmdwarning \\warning
+\refitem cmdweakgroup \\weakgroup
+\refitem cmdxmlonly \\xmlonly
+\refitem cmdxrefitem \\xrefitem
+\refitem cmddollar \\\$
+\refitem cmdat \\\@
+\refitem cmdbackslash \\\\
+\refitem cmdamp \\\&
+\refitem cmdtilde \\~
+\refitem cmdlt \\\<
+\refitem cmdgt \\\>
+\refitem cmdhash \\\#
+\refitem cmdperc \\\%
+\refitem cmdquot \\\"
+\refitem cmddcolon \\\::
+\endsecreflist
+
+The following subsections provide a list of all commands that are recognized by
+doxygen. Unrecognized commands are treated as normal text.
+
+
+\htmlonly <center> \endhtmlonly
+<h2>
+\htmlonly --- \endhtmlonly
+Structural indicators
+\htmlonly --- \endhtmlonly
+</h2>
+\htmlonly </center> \endhtmlonly
+
+\section cmdaddtogroup \\addtogroup <name> [(title)]
+ \addindex \\addtogroup
+ Defines a group just like \ref cmddefgroup "\\defgroup", but in contrast to
+ that command using the same \<name\> more than once will not result in a warning,
+ but rather one group with a merged documentation and the first title found in
+ any of the commands.
+
+ The title is optional, so this command can also be used to add a number of
+ entities to an existing group using \@{ and \@} like this:
+
+\verbatim
+ /*! \addtogroup mygrp
+ * Additional documentation for group `mygrp'
+ * @{
+ */
+
+ /*!
+ * A function
+ */
+ void func1()
+ {
+ }
+
+ /*! Another function */
+ void func2()
+ {
+ }
+
+ /*! @} */
+\endverbatim
+
+ \sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup", \ref cmdingroup "\\ingroup", and
+ \ref cmdweakgroup "\\weakgroup".
+
+<hr>
+\section cmdcallgraph \\callgraph
+
+ \addindex \\callgraph
+ When this command is put in a comment block of a function or method
+ and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will
+ generate a call graph for that function (provided the implementation of the
+ function or method calls other documented functions). The call graph will be
+ generated regardless of the value of \ref cfg_call_graph "CALL_GRAPH".
+ \note The completeness (and correctness) of the call graph depends on the
+ doxygen code parser which is not perfect.
+
+ \sa section \ref cmdcallergraph "\\callergraph".
+
+<hr>
+\section cmdcallergraph \\callergraph
+
+ \addindex \\callergraph
+ When this command is put in a comment block of a function or method
+ and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will
+ generate a caller graph for that function (provided the implementation of the
+ function or method calls other documented functions). The caller graph will be
+ generated regardless of the value of \ref cfg_caller_graph "CALLER_GRAPH".
+ \note The completeness (and correctness) of the caller graph depends on the
+ doxygen code parser which is not perfect.
+
+ \sa section \ref cmdcallgraph "\\callgraph".
+
+<hr>
+\section cmdcategory \\category <name> [<header-file>] [<header-name>]
+
+ \addindex \\category
+ For Objective-C only: Indicates that a comment block contains documentation
+ for a class category with name \<name\>. The arguments are
+ equal to the \\class command.
+
+ \sa section \ref cmdclass "\\class".
+
+<hr>
+\section cmdclass \\class <name> [<header-file>] [<header-name>]
+
+ \addindex \\class
+ Indicates that a comment block contains documentation for a
+ class with name \<name\>. Optionally a header file and a header name
+ can be specified. If the header-file is specified, a link to a verbatim copy
+ of the header will be included in the HTML documentation.
+ The \<header-name\> argument can be used to overwrite the
+ name of the link that is used in the class documentation to something other
+ than \<header-file\>. This can be useful if the include name is not located
+ on the default include path (like \<X11/X.h\>). With the \<header-name\>
+ argument you can also specify how the include statement should look like,
+ by adding either quotes or sharp brackets around the name.
+ Sharp brackets are used if just the name is given. Note that the
+ last two arguments can also be specified using
+ the \ref cmdheaderfile "\\headerfile" command.
+
+ \par Example:
+ \verbinclude class.h
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/class/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+<hr>
+\section cmddef \\def <name>
+
+ \addindex \\def
+ Indicates that a comment block contains documentation for a
+ \c \#define macro.
+
+ \par Example:
+ \verbinclude define.h
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/define/html/define_8h.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+<hr>
+\section cmddefgroup \\defgroup <name> (group title)
+
+ \addindex \\defgroup
+ Indicates that a comment block contains documentation for a
+ \ref modules "group" of classes, files or namespaces. This can be used to
+ categorize classes, files or namespaces, and document those
+ categories. You can also use groups as members of other groups,
+ thus building a hierarchy of groups.
+
+ The \<name\> argument should be a single-word identifier.
+
+ \sa page \ref grouping "Grouping", sections \ref cmdingroup "\\ingroup", \ref cmdaddtogroup "\\addtogroup", and
+ \ref cmdweakgroup "\\weakgroup".
+
+<hr>
+\section cmddir \\dir [<path fragment>]
+
+ \addindex \\dir
+ Indicates that a comment block contains documentation for a directory.
+ The "path fragment" argument should include the directory name and
+ enough of the path to be unique with respect to the other directories
+ in the project.
+ The \ref cfg_show_dirs "SHOW_DIRECTORIES" option determines whether
+ or not the directory information is shown and the
+ \ref cfg_strip_from_path "STRIP_FROM_PATH" option determines what is
+ stripped from the full path before it appears in the output.
+
+<hr>
+\section cmdenum \\enum <name>
+
+ \addindex \\enum
+ Indicates that a comment block contains documentation for an
+ enumeration, with name \<name\>. If the enum is a member of a class and
+ the documentation block is located outside the class definition,
+ the scope of the class should be specified as well.
+ If a comment block is located directly in front of an enum declaration,
+ the \\enum comment may be omitted.
+
+ \par Note:
+ The type of an anonymous enum cannot be documented, but the values
+ of an anonymous enum can.
+
+ \par Example:
+ \verbinclude enum.h
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/enum/html/class_test.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+<hr>
+\section cmdexample \\example <file-name>
+
+ \addindex \\example
+ Indicates that a comment block contains documentation for a source code
+ example. The name of the source file is \<file-name\>. The text of
+ this file will be included in the documentation, just after the
+ documentation contained in the comment block. All examples are placed
+ in a list. The source code is scanned for documented members and classes.
+ If any are found, the names are cross-referenced with the documentation.
+ Source files or directories can be specified using the
+ \ref cfg_example_path "EXAMPLE_PATH"
+ tag of doxygen's configuration file.
+
+ If \<file-name\> itself is not unique for the set of example files specified
+ by the
+ \ref cfg_example_path "EXAMPLE_PATH" tag, you can include part of the absolute path
+ to disambiguate it.
+
+ If more that one source file is needed for the example,
+ the \\include command can be used.
+
+ \par Example:
+ \verbinclude example.cpp
+ Where the example file \c example_test.cpp looks as follows:
+ \verbinclude example_test.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/example/html/examples.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+ \sa section \ref cmdinclude "\\include".
+
+<hr>
+\section cmdendinternal \\endinternal
+
+ \addindex \\endinternal
+ This command ends a documentation fragment that was started with a
+ \ref cmdinternal "\\internal" command. The text between \c \\internal and
+ \c \\endinternal will only be visible
+ if \ref cfg_internal_docs "INTERNAL_DOCS" is set to YES.
+
+<hr>
+\section cmdextends \\extends <name>
+
+ \addindex \\extends
+ This command can be used to manually indicate an inheritance relation,
+ when the programming language does not support this concept natively
+ (e.g. C).
+
+ The file \c manual.c in the example directory shows how to use this command.
+
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+ \sa section \ref cmdimplements "\\implements" and section
+ \ref cmdmemberof "\\memberof"
+
+<hr>
+\section cmdfile \\file [<name>]
+
+ \addindex \\file
+ Indicates that a comment block contains documentation for a source or
+ header file with name \<name\>. The file name may include (part of) the
+ path if the file-name alone is not unique. If the file name is omitted
+ (i.e. the line after \\file is left blank) then the documentation block that
+ contains the \\file command will belong to the file it is located in.
+
+ \par Important:
+ The documentation of global functions, variables, typedefs, and enums will
+ only be included in the output if the file they are in is documented as well.
+
+ \par Example:
+ \verbinclude file.h
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/file/html/file_8h.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+ \note In the above example \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF"
+ has been set to YES in the configuration file.
+
+<hr>
+\section cmdfn \\fn (function declaration)
+
+ \addindex \\fn
+ Indicates that a comment block contains documentation for a function
+ (either global or as a member of a class). This command is \em only
+ needed if a comment block is \e not placed in front (or behind)
+ the function declaration or definition.
+
+ If your comment block \e is in front of the function
+ declaration or definition this command can (and to avoid redundancy
+ should) be omitted.
+
+ A full function declaration including arguments should be specified after the
+ \\fn command on a \e single line, since the argument ends at the end
+ of the line!
+
+ This command is equivalent to \\var, \\typedef, and \\property.
+
+ \warning Do not use this command
+ if it is not absolutely needed, since it will lead to duplication of
+ information and thus to errors.
+
+ \par Example:
+ \verbinclude func.h
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/func/html/class_test.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+
+ \sa sections \ref cmdvar "\\var", \ref cmdproperty "\\property", and
+ \ref cmdtypedef "\\typedef".
+
+<hr>
+\section cmdheaderfile \\headerfile <header-file> [<header-name>]
+
+ \addindex \\headerfile
+ Intended to be used for class, struct, or union documentation, where
+ the documentation is in front of the definition. The arguments of
+ this command are the same as the second and third argument of
+ \ref cmdclass "\\class".
+ The \<header-file\> name refers to the file that should by included by the
+ application to obtain the definition of the class, struct, or union.
+ The \<header-name\> argument can be used to overwrite the
+ name of the link that is used in the class documentation to something other
+ than \<header-file\>. This can be useful if the include name is not located
+ on the default include path (like \<X11/X.h\>).
+
+ With the \<header-name\>
+ argument you can also specify how the include statement should look like,
+ by adding either double quotes or sharp brackets around the name.
+ By default sharp brackets are used if just the name is given.
+
+ If a pair of double quotes is given for either the \<header-file\> or
+ \<header-name\> argument, the current file (in which the command was found)
+ will be used but with quotes. So for a comment block with a \\headerfile
+ command inside a file test.h, the following three commands are equivalent:
+ \verbatim
+ \headerfile test.h "test.h"
+ \headerfile test.h ""
+ \headerfile "" \endverbatim
+ To get sharp brackets you do not need to specify anything,
+ but if you want to be explicit you could use any of the following:
+ \verbatim
+ \headerfile test.h <test.h>
+ \headerfile test.h <>
+ \headerfile <> \endverbatim
+
+ To globally reverse the default include representation to
+ local includes you can set
+ \ref cfg_force_local_includes "FORCE_LOCAL_INCLUDES" to \c YES.
+
+ To disable the include information altogether set
+ \ref cfg_show_include_files "SHOW_INCLUDE_FILES" to \c NO.
+
+<hr>
+\section cmdhideinitializer \\hideinitializer
+
+ \addindex \\hideinitializer
+ By default the value of a define and the initializer of a variable
+ are displayed unless they are longer than 30 lines. By putting
+ this command in a comment block of a define or variable, the
+ initializer is always hidden. The maximum number of initalization linens
+ can be changed by means of the configuration parameter
+ \ref cfg_max_initializer_lines "MAX_INITIALIZER_LINES", the default value is
+ 30.
+
+ \sa section \ref cmdshowinitializer "\\showinitializer".
+
+<hr>
+\section cmdimplements \\implements <name>
+
+ \addindex \\implements
+ This command can be used to manually indicate an inheritance relation,
+ when the programming language does not support this concept natively
+ (e.g. C).
+
+ The file \c manual.c in the example directory shows how to use this command.
+
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+ \sa section \ref cmdextends "\\extends" and section
+ \ref cmdmemberof "\\memberof"
+
+<hr>
+\section cmdingroup \\ingroup (<groupname> [<groupname> <groupname>])
+
+ \addindex \\ingroup
+ If the \\ingroup command is placed in a comment block of a
+ class, file or namespace, then it will be added to the group or
+ groups identified by \<groupname\>.
+
+ \sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup",
+ \ref cmdaddtogroup "\\addtogroup", and \ref cmdweakgroup "\\weakgroup"
+
+<hr>
+\section cmdinterface \\interface <name> [<header-file>] [<header-name>]
+
+ \addindex \\interface
+ Indicates that a comment block contains documentation for an
+ interface with name \<name\>. The arguments are equal to the arguments of the \\class
+ command.
+
+ \sa section \ref cmdclass "\\class".
+
+<hr>
+\section cmdinternal \\internal
+
+ \addindex \\internal
+ This command starts a documentation fragment that is meant for internal
+ use only. The fragment naturally ends at the end of the comment block.
+ You can also force the internal section to end earlier by using the
+ \ref cmdendinternal "\\endinternal" command.
+
+ If the \\internal command is put inside a section
+ (see for example \ref cmdsection "\\section") all subsections after the
+ command are considered to be internal as well. Only a new section at the
+ same level will end the fragment that is considered internal.
+
+ You can use \ref cfg_internal_docs "INTERNAL_DOCS" in the config file
+ to show (\c YES) or hide (\c NO) the internal documentation.
+
+ \sa section \ref cmdendinternal "\\endinternal".
+
+<hr>
+\section cmdmainpage \\mainpage [(title)]
+
+ \addindex \\mainpage
+
+ If the \\mainpage command is placed in a comment block the
+ block is used to customize the index page (in HTML) or
+ the first chapter (in \f$\mbox{\LaTeX}\f$).
+
+ The title argument is optional and replaces the default title that
+ doxygen normally generates. If you do not want any title you can
+ specify \c notitle as the argument of \\mainpage.
+
+ Here is an example:
+\verbatim
+/*! \mainpage My Personal Index Page
+ *
+ * \section intro_sec Introduction
+ *
+ * This is the introduction.
+ *
+ * \section install_sec Installation
+ *
+ * \subsection step1 Step 1: Opening the box
+ *
+ * etc...
+ */
+\endverbatim
+
+ You can refer to the main page using \\ref index (if the treeview
+ is disabled, otherwise you should use \\ref main).
+
+ \sa section \ref cmdsection "\\section",
+ section \ref cmdsubsection "\\subsection", and
+ section \ref cmdpage "\\page".
+
+<hr>
+\section cmdmemberof \\memberof <name>
+
+ \addindex \\memberof
+ This command makes a function a member of a class in a similar way
+ as \ref cmdrelates "\\relates" does, only with this command the function
+ is represented as a real member of the class.
+ This can be useful when the programming language does not support
+ the concept of member functions natively (e.g. C).
+
+ It is also possible to use this command together with
+ \ref cmdpublic "\\public", \ref cmdprotected "\\protected" or
+ \ref cmdprivate "\\private".
+
+ The file \c manual.c in the example directory shows how to use this command.
+
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+ \sa sections \ref cmdextends "\\extends", \ref cmdimplements "\\implements",
+ \ref cmdpublic "\\public", \ref cmdprotected "\\protected" and
+ \ref cmdprivate "\\private".
+
+<hr>
+\section cmdname \\name [(header)]
+
+ \addindex \\name
+
+ This command turns a comment block into a header
+ definition of a member group. The
+ comment block should be followed by a
+ <code>//\@{ ... //\@}</code> block containing the
+ members of the group.
+
+ See section \ref memgroup for an example.
+
+<hr>
+\section cmdnamespace \\namespace <name>
+
+ \addindex \\namespace
+ Indicates that a comment block contains documentation for a
+ namespace with name \<name\>.
+
+<hr>
+\section cmdnosubgrouping \\nosubgrouping
+
+ \addindex \\nosubgrouping
+ This command can be put in the documentation
+ of a class. It can be used in combination with member grouping
+ to avoid that doxygen puts a member group as a subgroup of a
+ Public/Protected/Private/... section.
+
+ \sa sections \ref cmdpublicsection "\\publicsection",
+ \ref cmdprotectedsection "\\protectedsection" and
+ \ref cmdprivatesection "\\privatesection".
+<hr>
+\section cmdoverload \\overload [(function declaration)]
+
+ \addindex \\overload
+ This command can be used to generate the following
+ standard text for an overloaded member function:
+
+ `This is an overloaded member function, provided for convenience.
+ It differs from the above function only in what argument(s) it accepts.'
+
+ If the documentation for the overloaded member function is not located
+ in front of the function declaration or definition, the optional
+ argument should be used to specify the correct function.
+
+ Any other documentation that is inside the documentation block will
+ by appended after the generated message.
+
+ \par Note 1:
+ You are responsible that there is indeed an
+ earlier documented member that is overloaded by this one.
+ To prevent that document reorders the documentation you should set
+ \ref cfg_sort_member_docs "SORT_MEMBER_DOCS" to NO in this case.
+ \par Note 2:
+ The \\overload command does not work inside a one-line comment.
+ \par Example:
+ \verbinclude examples/overload.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/overload/html/class_test.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+<hr>
+\section cmdpackage \\package <name>
+
+ \addindex \\package
+ Indicates that a comment block contains documentation for a
+ Java package with name \<name\>.
+
+<hr>
+\section cmdpage \\page <name> (title)
+
+ \addindex \\page
+ Indicates that a comment block contains a piece of documentation that is
+ not directly related to one specific class, file or member.
+ The HTML generator creates a page containing the documentation. The
+ \f$\mbox{\LaTeX}\f$ generator
+ starts a new section in the chapter `Page documentation'.
+
+ \par Example:
+ \verbinclude page.doc
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/page/html/pages.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+ \par Note:
+ The \<name\> argument consists of a combination of letters and number
+ digits. If you wish to use upper case letters (e.g. \c MYPAGE1), or
+ mixed case letters (e.g. \c MyPage1) in the \<name\> argument, you
+ should set \c CASE_SENSE_NAMES to \c YES. However, this is advisable
+ only if your file system is case sensitive. Otherwise (and for better
+ portability) you should use all lower case letters (e.g. \c mypage1)
+ for \<name\> in all references to the page.
+
+ \sa section \ref cmdsection "\\section", section
+ \ref cmdsubsection "\\subsection", and section
+ \ref cmdref "\\ref".
+
+<hr>
+\section cmdprivate \\private
+
+ \addindex \\private
+ Indicates that the member documented in the comment block is private,
+ i.e., should only be accessed by other members in the same class.
+
+ Note that Doxygen automatically detects the protection level of members
+ in object-oriented languages. This command is intended for use only when
+ the language does not support the concept of protection level natively
+ (e.g. C, PHP 4).
+
+ For starting a section of private members, in a way similar to the
+ "private:" class marker in C++, use \\privatesection.
+
+ \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
+ \ref cmdprotected "\\protected" and \ref cmdprivatesection "\\privatesection".
+
+<hr>
+\section cmdprivatesection \\privatesection
+
+ \addindex \\privatesection
+ Starting a section of private members, in a way similar to the
+ "private:" class marker in C++.
+ Indicates that the member documented in the comment block is private,
+ i.e., should only be accessed by other members in the same class.
+
+ \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
+ \ref cmdprotected "\\protected" and \ref cmdprivate "\\private".
+
+<hr>
+\section cmdproperty \\property (qualified property name)
+
+ \addindex \\property
+ Indicates that a comment block contains documentation for a
+ property (either global or as a member of a class).
+ This command is equivalent to \\var, \\typedef, and \\fn.
+
+ \sa sections \ref cmdfn "\\fn", \ref cmdtypedef "\\typedef", and
+ \ref cmdvar "\\var".
+
+<hr>
+\section cmdprotected \\protected
+
+ \addindex \\protected
+ Indicates that the member documented in the comment block is protected,
+ i.e., should only be accessed by other members in the same or derived
+ classes.
+
+ Note that Doxygen automatically detects the protection level of members
+ in object-oriented languages. This command is intended for use only when
+ the language does not support the concept of protection level natively
+ (e.g. C, PHP 4).
+
+ For starting a section of protected members, in a way similar to the
+ "protected:" class marker in C++, use \\protectedsection.
+
+ \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
+ \ref cmdprivate "\\private" and \ref cmdprotectedsection "\\protectedsection".
+
+<hr>
+\section cmdprotectedsection \\protectedsection
+
+ \addindex \\protectedsection
+ Starting a section of protected members, in a way similar to the
+ "protected:" class marker in C++.
+ Indicates that the member documented in the comment block is protected,
+ i.e., should only be accessed by other members in the same or derived
+ classes.
+
+ \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
+ \ref cmdprivate "\\private" and \ref cmdprotected "\\protected".
+
+<hr>
+\section cmdprotocol \\protocol <name> [<header-file>] [<header-name>]
+
+ \addindex \\protocol
+ Indicates that a comment block contains documentation for a
+ protocol in Objective-C with name \<name\>. The arguments are equal
+ to the \\class command.
+
+ \sa section \ref cmdclass "\\class".
+
+<hr>
+\section cmdpublic \\public
+
+ \addindex \\public
+ Indicates that the member documented in the comment block is public,
+ i.e., can be accessed by any other class or function.
+
+ Note that Doxygen automatically detects the protection level of members
+ in object-oriented languages. This command is intended for use only when
+ the language does not support the concept of protection level natively
+ (e.g. C, PHP 4).
+
+ For starting a section of public members, in a way similar to the
+ "public:" class marker in C++, use \\publicsection.
+
+ \sa sections \ref cmdmemberof "\\memberof", \ref cmdprotected "\\protected",
+ \ref cmdprivate "\\private" and \ref cmdpublicsection "\\publicsection".
+
+<hr>
+\section cmdpublicsection \\publicsection
+
+ \addindex \\publicsection
+ Starting a section of public members, in a way similar to the
+ "public:" class marker in C++.
+ Indicates that the member documented in the comment block is public,
+ i.e., can be accessed by any other class or function.
+
+ \sa sections \ref cmdmemberof "\\memberof", \ref cmdprotected "\\protected",
+ \ref cmdprivate "\\private" and \ref cmdpublic "\\public".
+
+<hr>
+\section cmdrelates \\relates <name>
+
+ \addindex \\relates
+ This command can be used in the documentation of a non-member function
+ \<name\>. It puts the function inside the `related function' section
+ of the class documentation. This command is useful for documenting
+ non-friend functions that are nevertheless strongly coupled to a certain
+ class. It prevents the need of having to document a file, but
+ only works for functions.
+
+ \par Example:
+ \verbinclude relates.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/relates/html/class_string.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+<hr>
+\section cmdrelated \\related <name>
+
+ \addindex related
+ Equivalent to \ref cmdrelates "\\relates"
+
+<hr>
+\section cmdrelatesalso \\relatesalso <name>
+
+ \addindex \\relatesalso
+ This command can be used in the documentation of a non-member function
+ \<name\>. It puts the function both inside the `related function' section
+ of the class documentation as well as leaving it at its normal file documentation
+ location. This command is useful for documenting
+ non-friend functions that are nevertheless strongly coupled to a certain
+ class. It only works for functions.
+
+<hr>
+\section cmdrelatedalso \\relatedalso <name>
+
+ \addindex relatedalso
+ Equivalent to \ref cmdrelatesalso "\\relatesalso"
+
+<hr>
+\section cmdshowinitializer \\showinitializer
+
+ \addindex \\showinitializer
+ By default the value of a define and the initializer of a variable
+ are only displayed if they are less than 30 lines long. By putting
+ this command in a comment block of a define or variable, the
+ initializer is shown unconditionally.
+ The maximum number of initalization linens
+ can be changed by means of the configuration parameter
+ \ref cfg_max_initializer_lines "MAX_INITIALIZER_LINES", the default value is
+ 30.
+
+ \sa section \ref cmdhideinitializer "\\hideinitializer".
+
+<hr>
+\section cmdstruct \\struct <name> [<header-file>] [<header-name>]
+
+ \addindex \\struct
+ Indicates that a comment block contains documentation for a
+ struct with name \<name\>. The arguments are equal to the arguments of the \\class
+ command.
+
+ \sa section \ref cmdclass "\\class".
+
+<hr>
+\section cmdtypedef \\typedef (typedef declaration)
+
+ \addindex \\typedef
+ Indicates that a comment block contains documentation for a
+ typedef (either global or as a member of a class).
+ This command is equivalent to \\var, \\propery, and \\fn.
+
+ \sa section \ref cmdfn "\\fn", \ref cmdproperty "\\property", and
+ \ref cmdvar "\\var".
+
+<hr>
+\section cmdunion \\union <name> [<header-file>] [<header-name>]
+
+ \addindex \\union
+ Indicates that a comment block contains documentation for a
+ union with name \<name\>. The arguments are equal to the arguments of the \\class
+ command.
+
+ \sa section \ref cmdclass "\\class".
+
+<hr>
+\section cmdvar \\var (variable declaration)
+
+ \addindex \\var
+ Indicates that a comment block contains documentation for a variable or
+ enum value (either global or as a member of a class).
+ This command is equivalent to \\typedef, \\propery, and \\fn.
+
+ \sa section \ref cmdfn "\\fn", \ref cmdproperty "\\property", and \ref cmdtypedef "\\typedef".
+
+<hr>
+\section cmdweakgroup \\weakgroup <name> [(title)]
+ \addindex \\addtogroup
+ Can be used exactly like \ref cmdaddtogroup "\\addtogroup", but has
+ a lower priority when it comes to resolving conflicting grouping
+ definitions.
+
+ \sa page \ref grouping "Grouping" and section \ref cmdaddtogroup "\\addtogroup".
+
+<hr>
+
+\htmlonly <center> \endhtmlonly
+<h2>
+\htmlonly --- \endhtmlonly
+Section indicators
+\htmlonly --- \endhtmlonly
+</h2>
+\htmlonly </center>\endhtmlonly
+
+<hr>
+\section cmdattention \\attention { attention text }
+
+ \addindex \\attention
+ Starts a paragraph where a message that needs attention may be entered.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\attention commands will be joined into a single paragraph.
+ The \\attention command ends when a blank line or some other
+ sectioning command is encountered.
+
+<hr>
+\section cmdauthor \\author { list of authors }
+
+ \addindex \\author
+ Starts a paragraph where one or more author names may be entered.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\author commands will be joined into a single paragraph.
+ Each author description will start a new line. Alternatively, one \\author command
+ may mention several authors. The \\author command ends when a blank line or some other
+ sectioning command is encountered.
+
+ \par Example:
+ \verbinclude author.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/author/html/class_windows_n_t.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+<hr>
+\section cmdauthors \\authors { list of authors }
+
+ \addindex \\authors
+ Equivalent to \ref cmdauthor "\\author".
+
+<hr>
+\section cmdbrief \\brief { brief description }
+
+ \addindex \\brief
+ Starts a paragraph that serves as a brief description. For classes and files
+ the brief description will be used in lists and at the start of the
+ documentation page. For class and file members, the brief description
+ will be placed at the declaration of the member and prepended to the
+ detailed description. A brief description may span several lines (although
+ it is advised to keep it brief!). A brief description ends when a
+ blank line or another sectioning command is encountered. If multiple
+ \\brief commands are present they will be joined. See section
+ \ref cmdauthor "\\author" for an example.
+
+ Synonymous to \\short.
+
+<hr>
+\section cmdbug \\bug { bug description }
+
+ \addindex \\bug
+ Starts a paragraph where one or more bugs may be reported.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\bug commands will be joined into a single paragraph.
+ Each bug description will start on a new line.
+ Alternatively, one \\bug command may mention
+ several bugs. The \\bug command ends when a blank line or some other
+ sectioning command is encountered. See section \ref cmdauthor "\\author"
+ for an example.
+
+<hr>
+\section cmdcond \\cond [<section-label>]
+
+ \addindex \\cond
+ Starts a conditional section that ends with a corresponding
+ \ref cmdendcond "\\endcond" command, which is typically found in
+ another comment block. The main purpose of this pair of
+ commands is to (conditionally) exclude part of a file from processing
+ (in older version of doxygen this could only be achieved using C preprocessor commands).
+
+ The section between \\cond and \\endcond commands can be included by
+ adding its section label to the \ref cfg_enabled_sections "ENABLED_SECTIONS"
+ configuration option. If the section label is omitted, the section will
+ be excluded from processing unconditionally.
+
+ For conditional sections within a comment block one should
+ use a \ref cmdif "\\if" ... \ref cmdendif "\\endif" block.
+
+ Conditional sections can be nested. In this case a nested section will only
+ be shown if it and its containing section are included.
+
+ Here is an example showing the commands in action:
+
+\verbatim
+/** An interface */
+class Intf
+{
+ public:
+ /** A method */
+ virtual void func() = 0;
+
+ /// @cond TEST
+
+ /** A method used for testing */
+ virtual void test() = 0;
+
+ /// @endcond
+};
+
+/// @cond DEV
+/*
+ * The implementation of the interface
+ */
+class Implementation : public Intf
+{
+ public:
+ void func();
+
+ /// @cond TEST
+ void test();
+ /// @endcond
+
+ /// @cond
+ /** This method is obsolete and does
+ * not show up in the documentation.
+ */
+ void obsolete();
+ /// @endcond
+};
+
+/// @endcond
+\endverbatim
+
+The output will be different depending on whether or not \c ENABLED_SECTIONS
+contains \c TEST, or \c DEV
+
+ \sa section \ref cmdendcond "\\endcond".
+
+<hr>
+\section cmddate \\date { date description }
+
+ \addindex \\date
+ Starts a paragraph where one or more dates may be entered.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\date commands will be joined into a single paragraph.
+ Each date description will start on a new line.
+ Alternatively, one \\date command may mention
+ several dates. The \\date command ends when a blank line or some other
+ sectioning command is encountered. See section \ref cmdauthor "\\author"
+ for an example.
+
+<hr>
+\section cmddeprecated \\deprecated { description }
+
+ \addindex \\deprecated
+ Starts a paragraph indicating that this documentation block belongs to
+ a deprecated entity. Can be used to describe alternatives,
+ expected life span, etc.
+
+<hr>
+\section cmddetails \\details { detailed decription }
+
+ \addindex \\details
+ Just like \ref cmdbrief "\\brief" starts a brief description, \\details
+ starts the detailed description. You can also start a new paragraph (blank line)
+ then the \\details command is not needed.
+
+<hr>
+\section cmdelse \\else
+
+ \addindex \\else
+ Starts a conditional section if the previous conditional section
+ was not enabled. The previous section should have been started with
+ a \c \\if, \c \\ifnot, or \c \\elseif command.
+
+ \sa \ref cmdif "\\if", \ref cmdifnot "\\ifnot", \ref cmdelseif "\\elseif",
+ \ref cmdendif "\\endif."
+
+<hr>
+\section cmdelseif \\elseif <section-label>
+
+ \addindex \\elseif
+ Starts a conditional documentation section if the previous section
+ was not enabled. A conditional section is
+ disabled by default. To enable it you must put the
+ section-label after the \ref cfg_enabled_sections "ENABLED_SECTIONS"
+ tag in the configuration
+ file. Conditional blocks can be nested. A nested section is
+ only enabled if all enclosing sections are enabled as well.
+
+ \sa sections \ref cmdendif "\\endif", \ref cmdifnot "\\ifnot",
+ \ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
+
+<hr>
+\section cmdendcond \\endcond
+
+ \addindex \\endcond
+ Ends a conditional section that was started by \ref cmdcond "\\cond".
+
+ \sa section \ref cmdcond "\\cond".
+
+<hr>
+\section cmdendif \\endif
+
+ \addindex \\endif
+ Ends a conditional section that was started by \c \\if or \c \\ifnot
+ For each \c \\if or \c \\ifnot one and only one matching \c \\endif must follow.
+
+ \sa sections \ref cmdif "\\if" and \ref cmdifnot "\\ifnot".
+
+<hr>
+\section cmdexception \\exception <exception-object> { exception description }
+
+ \addindex \\exception
+ Starts an exception description for an exception object with name
+ \<exception-object\>. Followed by a description of the exception.
+ The existence of the exception object is not checked.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\exception commands will be joined into a single paragraph.
+ Each exception description will start on a new line.
+ The \\exception description ends when a blank line or some other
+ sectioning command is encountered. See section \ref cmdfn "\\fn" for an
+ example.
+
+<hr>
+\section cmdif \\if <section-label>
+
+ \addindex \\if
+ Starts a conditional documentation section. The section ends
+ with a matching \c \\endif command. A conditional section is
+ disabled by default. To enable it you must put the
+ section-label after the \ref cfg_enabled_sections "ENABLED_SECTIONS"
+ tag in the configuration
+ file. Conditional blocks can be nested. A nested section is
+ only enabled if all enclosing sections are enabled as well.
+
+ \par Example:
+\verbatim
+ /*! Unconditionally shown documentation.
+ * \if Cond1
+ * Only included if Cond1 is set.
+ * \endif
+ * \if Cond2
+ * Only included if Cond2 is set.
+ * \if Cond3
+ * Only included if Cond2 and Cond3 are set.
+ * \endif
+ * More text.
+ * \endif
+ * Unconditional text.
+ */
+\endverbatim
+
+ You can also use conditional commands inside aliases. To
+ document a class in two languages you could for instance use:
+
+\par Example 2:
+\verbatim
+/*! \english
+ * This is English.
+ * \endenglish
+ * \dutch
+ * Dit is Nederlands.
+ * \enddutch
+ */
+class Example
+{
+};
+\endverbatim
+
+ Where the following aliases are defined in the configuration file:
+
+\verbatim
+ALIASES = "english=\if english" \
+ "endenglish=\endif" \
+ "dutch=\if dutch" \
+ "enddutch=\endif"
+\endverbatim
+
+ and \c ENABLED_SECTIONS can be used to enable either \c english or \c dutch.
+
+ \sa sections \ref cmdendif "\\endif", \ref cmdifnot "\\ifnot",
+ \ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
+
+<hr>
+\section cmdifnot \\ifnot <section-label>
+
+ \addindex \\ifnot
+ Starts a conditional documentation section. The section ends
+ with a matching \c \\endif command. This conditional section is
+ enabled by default. To disable it you must put the
+ section-label after the \ref cfg_enabled_sections "ENABLED_SECTIONS"
+ tag in the configuration
+ file.
+
+ \sa sections \ref cmdendif "\\endif", \ref cmdif "\\if",
+ \ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
+
+<hr>
+\section cmdinvariant \\invariant { description of invariant }
+
+ \addindex \\invariant
+ Starts a paragraph where the invariant of an entity can be described.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\invariant commands will be joined into a single paragraph.
+ Each invariant description will start on a new line.
+ Alternatively, one \\invariant command may mention
+ several invariants. The \\invariant command ends when a blank line or some other
+ sectioning command is encountered.
+
+<hr>
+\section cmdnote \\note { text }
+
+ \addindex \\note
+ Starts a paragraph where a note can be entered. The paragraph will be
+ indented. The text of the paragraph has no special internal structure.
+ All visual enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\note commands will be joined into a single paragraph.
+ Each note description will start on a new line.
+ Alternatively, one \\note command may mention
+ several notes. The \\note command ends when a blank line or some other
+ sectioning command is encountered. See section \ref cmdpar "\\par"
+ for an example.
+
+<hr>
+\section cmdpar \\par [(paragraph title)] { paragraph }
+
+ \addindex \\par
+ If a paragraph title is given this command starts a paragraph with a
+ user defined heading. The heading extends until the end of the
+ line. The paragraph following the command will be indented.
+
+ If no paragraph title is given this command will start a new paragraph.
+ This will also work inside other paragraph commands
+ (like \\param or \\warning) without ending that command.
+
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ The \\par command ends when a blank line or some other
+ sectioning command is encountered.
+
+ \par Example:
+ \verbinclude par.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/par/html/class_test.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+<hr>
+\section cmdparam \\param [(dir)] <parameter-name> { parameter description }
+
+ \addindex \\param
+ Starts a parameter description for a function parameter with name
+ \<parameter-name\>, followed by a description of the parameter.
+ The existence of the parameter is checked and a warning is given if
+ the documentation of this (or any other) parameter is missing or not
+ present in the function declaration or definition.
+
+ The \\param command has an optional attribute, (dir), specifying the direction
+ of the parameter. Possible values are "[in]", "[in,out]", and "[out]",
+ note the [square] brackets in this description.
+ When a parameter is both input and output, [in,out] is used as attribute.
+ Here is an example for the function memcpy:
+ \code
+/*!
+ * Copies bytes from a source memory area to a destination memory area,
+ * where both areas may not overlap.
+ * @param[out] dest The memory area to copy to.
+ * @param[in] src The memory area to copy from.
+ * @param[in] n The number of bytes to copy
+ */
+void memcpy(void *dest, const void *src, size_t n);
+ \endcode
+
+ The parameter description is a paragraph with no special internal structure.
+ All visual enhancement commands may be used inside the paragraph.
+
+ Multiple adjacent \\param commands will be joined into a single paragraph.
+ Each parameter description will start on a new line.
+ The \\param description ends when a blank line or some other
+ sectioning command is encountered. See section \ref cmdfn "\\fn" for an
+ example.
+
+ Note that for PHP one can also specify the type (or types if you
+ separate them with a pipe symbol) which are allowed for a parameter
+ (as this is not part of the definition).
+ The syntax is the same as for phpDocumentor, i.e.
+\verbatim
+@param datatype1|datatype2 $paramname description
+\endverbatim
+
+<hr>
+\section cmdtparam \\tparam <template-parameter-name> { description }
+
+ \addindex \\tparam
+ Starts a template parameter for a class or function template parameter
+ with name \<template-parameter-name\>, followed by a description of the
+ template parameter.
+
+ Otherwise similar to \ref cmdparam "\\param".
+
+<hr>
+\section cmdpost \\post { description of the postcondition }
+
+ \addindex \\post
+ Starts a paragraph where the postcondition of an entity can be described.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\post commands will be joined into a single paragraph.
+ Each postcondition will start on a new line.
+ Alternatively, one \\post command may mention
+ several postconditions. The \\post command ends when a blank line or some other
+ sectioning command is encountered.
+
+<hr>
+\section cmdpre \\pre { description of the precondition }
+
+ \addindex \\pre
+ Starts a paragraph where the precondition of an entity can be described.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\pre commands will be joined into a single paragraph.
+ Each precondition will start on a new line.
+ Alternatively, one \\pre command may mention
+ several preconditions. The \\pre command ends when a blank line or some other
+ sectioning command is encountered.
+
+<hr>
+\section cmdremark \\remark { remark text }
+
+ \addindex \\remark
+ Starts a paragraph where one or more remarks may be entered.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\remark commands will be joined into a single paragraph.
+ Each remark will start on a new line.
+ Alternatively, one \\remark command may mention
+ several remarks. The \\remark command ends when a blank line or some other
+ sectioning command is encountered.
+
+<hr>
+\section cmdremarks \\remarks { remark text }
+
+ \addindex \\remarks
+ Equivalent to \ref cmdremark "\\remark".
+
+<hr>
+\section cmdresult \\result { description of the result value }
+
+ \addindex \\result
+ Equivalent to \ref cmdreturn "\\return".
+
+<hr>
+\section cmdreturn \\return { description of the return value }
+
+ \addindex \\return
+ Starts a return value description for a function.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\return commands will be joined into a single paragraph.
+ The \\return description ends when a blank line or some other
+ sectioning command is encountered. See section \ref cmdfn "\\fn" for an
+ example.
+
+<hr>
+\section cmdreturns \\returns { description of the return value }
+
+ \addindex \\returns
+ Equivalent to \ref cmdreturn "\\return".
+
+<hr>
+\section cmdretval \\retval <return value> { description }
+
+ \addindex \\retval
+ Starts a description for a function's return value with name
+ \<return value\>, followed by a description of the return value.
+ The text of the paragraph that forms the description has no special
+ internal structure. All visual enhancement commands may be used inside the
+ paragraph.
+ Multiple adjacent \\retval commands will be joined into a single paragraph.
+ Each return value description will start on a new line.
+ The \\retval description ends when a blank line or some other
+ sectioning command is encountered.
+
+<hr>
+\section cmdsa \\sa { references }
+
+ \addindex \\sa
+ Starts a paragraph where one or more cross-references to classes,
+ functions, methods, variables, files or URL may be specified.
+ Two names joined by either <code>::</code> or <code>\#</code>
+ are understood as referring to a class and one of its members.
+ One of several overloaded methods or constructors
+ may be selected by including a parenthesized list of argument types after
+ the method name.
+
+ Synonymous to \\see.
+
+ \sa section \ref autolink "autolink" for information on how to create links
+ to objects.
+
+<hr>
+\section cmdsee \\see { references }
+
+ \addindex \\see
+ Equivalent to \ref cmdsa "\\sa". Introduced for compatibility with Javadoc.
+
+<hr>
+\section cmdshort \\short { short description }
+
+ \addindex \\short
+ Equivalent to \ref cmdbrief "\\brief".
+
+<hr>
+\section cmdsince \\since { text }
+
+ \addindex \\since
+ This tag can be used to specify since when (version or time) an
+ entity is available. The paragraph that follows \\since does not have any
+ special internal structure. All visual enhancement commands may be
+ used inside the paragraph. The \\since description ends when a blank
+ line or some other sectioning command is encountered.
+
+<hr>
+\section cmdtest \\test { paragraph describing a test case }
+
+ \addindex \\test
+ Starts a paragraph where a test case can be described.
+ The description will also add the test case to a separate test list.
+ The two instances of the description will be cross-referenced.
+ Each test case in the test list will be preceded by a header that
+ indicates the origin of the test case.
+
+<hr>
+\section cmdthrow \\throw <exception-object> { exception description }
+
+ \addindex \\throw
+ Synonymous to \\exception (see section \ref cmdexception "\\exception").
+
+ \par Note:
+ the tag \\throws is a synonym for this tag.
+
+ \sa section \ref cmdexception "\\exception"
+
+<hr>
+\section cmdthrows \\throws <exception-object> { exception description }
+
+ \addindex \\throws
+ Equivalent to \ref cmdthrow "\\throw".
+
+<hr>
+\section cmdtodo \\todo { paragraph describing what is to be done }
+
+ \addindex \\todo
+ Starts a paragraph where a TODO item is described.
+ The description will also add an item to a separate TODO list.
+ The two instances of the description will be cross-referenced.
+ Each item in the TODO list will be preceded by a header that
+ indicates the origin of the item.
+
+<hr>
+\section cmdversion \\version { version number }
+
+ \addindex \\version
+ Starts a paragraph where one or more version strings may be entered.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\version commands will be joined into a single paragraph.
+ Each version description will start on a new line.
+ Alternatively, one \\version command may mention
+ several version strings.
+ The \\version command ends when a blank line or some other
+ sectioning command is encountered. See section \ref cmdauthor "\\author"
+ for an example.
+
+<hr>
+\section cmdwarning \\warning { warning message }
+
+ \addindex \\warning
+ Starts a paragraph where one or more warning messages may be entered.
+ The paragraph will be indented.
+ The text of the paragraph has no special internal structure. All visual
+ enhancement commands may be used inside the paragraph.
+ Multiple adjacent \\warning commands will be joined into a single paragraph.
+ Each warning description will start on a new line.
+ Alternatively, one \\warning command may mention
+ several warnings. The \\warning command ends when a blank line or some other
+ sectioning command is encountered. See section \ref cmdauthor "\\author"
+ for an example.
+
+<hr>
+\section cmdxrefitem \\xrefitem <key> "(heading)" "(list title)" { text }
+
+ \addindex \\xrefitem
+ This command is a generalization of commands such as \ref cmdtodo "\\todo"
+ and \ref cmdbug "\\bug".
+ It can be used to create user-defined text sections which are automatically
+ cross-referenced between the place of occurrence and a related page,
+ which will be generated. On the related page all sections of
+ the same type will be collected.
+
+ The first argument \<key\> is an
+ identifier uniquely representing the type of the section. The second argument
+ is a quoted string representing the heading of the section under which
+ text passed as the fourth argument is put. The third argument (list title)
+ is used as the title for the related page containing all items with the
+ same key. The keys "todo", "test", "bug" and "deprecated" are predefined.
+
+ To get an idea on how to use the \\xrefitem command and what its effect
+ is, consider the todo list, which (for English output) can be seen an
+ alias for the command
+ \verbatim \xrefitem todo "Todo" "Todo List" \endverbatim
+
+ Since it is very tedious and error-prone to repeat the first three
+ parameters of the command for each section, the command is meant to
+ be used in combination with the \ref cfg_aliases "ALIASES" option in the
+ configuration file.
+ To define a new command \\reminder, for instance, one should add the following
+ line to the configuration file:
+ \verbatim ALIASES += "reminder=\xrefitem reminders \"Reminder\" \"Reminders\"" \endverbatim
+ Note the use of escaped quotes for the second and third argument of the
+ \\xrefitem command.
+
+<hr>
+
+\htmlonly <center> \endhtmlonly
+<h2>
+\htmlonly --- \endhtmlonly
+Commands to create links
+\htmlonly --- \endhtmlonly
+</h2>
+\htmlonly </center>\endhtmlonly
+
+<hr>
+\section cmdaddindex \\addindex (text)
+
+ \addindex \\addindex
+ This command adds (text) to the \f$\mbox{\LaTeX}\f$ index.
+
+<hr>
+\section cmdanchor \\anchor <word>
+
+ \addindex \\anchor
+ This command places an invisible, named anchor into the documentation
+ to which you can refer with the \\ref command.
+
+ \note Anchors can currently only be put into a comment block
+ that is marked as a page (using \ref cmdpage "\\page") or mainpage
+ (\ref cmdmainpage "\\mainpage").
+
+ \sa section \ref cmdref "\\ref".
+
+<hr>
+\section cmdendlink \\endlink
+
+ \addindex \\endlink
+ This command ends a link that is started with the \\link command.
+
+ \sa section \ref cmdlink "\\link".
+
+<hr>
+\section cmdlink \\link <link-object>
+
+ \addindex \\link
+ The links that are automatically generated by doxygen always have the
+ name of the object they point to as link-text.
+
+ The \\link command can be used to create a link to an object (a file,
+ class, or member) with a user specified link-text.
+ The link command should end with an \\endlink command. All text between
+ the \\link and \\endlink commands serves as text for a link to
+ the \<link-object\> specified as the first argument of \\link.
+
+ See section \ref autolink "autolink" for more information on automatically
+ generated links and valid link-objects.
+
+<hr>
+\section cmdref \\ref <name> ["(text)"]
+
+ \addindex \\ref
+ Creates a reference to a named section, subsection, page or anchor.
+ For HTML documentation the reference command will generate a link to
+ the section. For a section or subsection the title of the section will be
+ used as the text of the link. For an anchor the optional text between quotes
+ will be used or \<name\> if no text is specified.
+ For \f$\mbox{\LaTeX}\f$ documentation the reference command will
+ generate a section number for sections or the text followed by a
+ page number if \<name\> refers to an anchor.
+
+ \sa
+ Section \ref cmdpage "\\page" for an example of the \\ref command.
+
+<hr>
+\section cmdsubpage \\subpage <name> ["(text)"]
+
+ \addindex \\subpage
+ This command can be used to create a hierarchy of pages. The
+ same structure can be made using the \ref cmddefgroup "\\defgroup" and
+ \ref cmdingroup "\\ingroup" commands, but for pages the \\subpage command
+ is often more convenient. The main page (see \ref cmdmainpage "\\mainpage")
+ is typically the root of hierarchy.
+
+ This command behaves similar as \ref cmdref "\\ref" in the sense that
+ it creates a reference to a page labeled \<name\> with the optional
+ link text as specified in the second argument.
+
+ It differs from the \\ref command in that it only works for pages,
+ and creates a parent-child relation between pages, where the
+ child page (or sub page) is identified by label \<name\>.
+
+ See the \ref cmdsection "\\section"
+ and \ref cmdsubsection "\\subsection" commands if you want to add structure
+ without creating multiple pages.
+
+ \note Each page can be the sub page of only one other page and
+ no cyclic relations are allowed, i.e. the page hierarchy must have a tree
+ structure.
+
+ Here is an example:
+\verbatim
+/*! \mainpage A simple manual
+
+Some general info.
+
+This manual is divided in the following sections:
+- \subpage intro
+- \subpage advanced "Advanced usage"
+*/
+
+//-----------------------------------------------------------
+
+/*! \page intro Introduction
+This page introduces the user to the topic.
+Now you can proceed to the \ref advanced "advanced section".
+*/
+
+//-----------------------------------------------------------
+
+/*! \page advanced Advanced Usage
+This page is for advanced users.
+Make sure you have first read \ref intro "the introduction".
+*/
+\endverbatim
+
+<hr>
+\section cmdsection \\section <section-name> (section title)
+
+ \addindex \\section
+ Creates a section with name \<section-name\>. The title of the
+ section should be specified as the second argument of the \\section
+ command.
+
+ \warning This command only works inside related page documentation and
+ \e not in other documentation blocks!
+
+ \sa
+ Section \ref cmdpage "\\page" for an example of the
+ \ref cmdsection "\\section" command.
+
+<hr>
+\section cmdsubsection \\subsection <subsection-name> (subsection title)
+
+ \addindex \\subsection
+ Creates a subsection with name \<subsection-name\>. The title of the
+ subsection should be specified as the second argument of the \\subsection
+ command.
+
+ \warning This command only works inside a section of a related page
+ documentation block and
+ \e not in other documentation blocks!
+
+ \sa
+ Section \ref cmdpage "\\page" for an example of the
+ \ref cmdsubsection "\\subsection" command.
+
+<hr>
+\section cmdsubsubsection \\subsubsection <subsubsection-name> (subsubsection title)
+
+ \addindex \\subsubsection
+ Creates a subsubsection with name \<subsubsection-name\>. The title of the
+ subsubsection should be specified as the second argument of the
+ \\subsubsection command.
+
+ \warning This command only works inside a subsection of a
+ related page documentation block and
+ \e not in other documentation blocks!
+
+ \sa
+ Section \ref cmdpage "\\page" for an example of the
+ \ref cmdsection "\\section" command and
+ \ref cmdsubsection "\\subsection" command.
+
+<hr>
+\section cmdparagraph \\paragraph <paragraph-name> (paragraph title)
+
+ \addindex \\paragraph
+ Creates a named paragraph with name \<paragraph-name\>. The title of the
+ paragraph should be specified as the second argument of the
+ \\paragraph command.
+
+ \warning This command only works inside a subsubsection of a
+ related page documentation block and
+ \e not in other documentation blocks!
+
+<hr>
+
+\htmlonly <center> \endhtmlonly
+<h2>
+\htmlonly --- \endhtmlonly
+Commands for displaying examples
+\htmlonly --- \endhtmlonly
+</h2>
+\htmlonly </center>\endhtmlonly
+
+<hr>
+\section cmddontinclude \\dontinclude <file-name>
+
+ \addindex \\dontinclude
+ This command can be used to parse a source file without actually
+ verbatim including it in the documentation (as the \\include command does).
+ This is useful if you want to divide the source file into smaller pieces and
+ add documentation between the pieces.
+ Source files or directories can be specified using the
+ \ref cfg_example_path "EXAMPLE_PATH"
+ tag of doxygen's configuration file.
+
+ The class and member declarations and definitions inside the code fragment
+ are `remembered' during the parsing of the comment block that contained
+ the \\dontinclude command.
+
+ For line by line descriptions of source files, one or more lines
+ of the example can be displayed using the \\line, \\skip, \\skipline, and
+ \\until commands. An internal pointer is used for these commands. The
+ \\dontinclude command sets the pointer to the first line of the example.
+
+ \par Example:
+ \verbinclude include.cpp
+ Where the example file \c example_test.cpp looks as follows:
+ \verbinclude example_test.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/include/html/example.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+ \sa sections \ref cmdline "\\line", \ref cmdskip "\\skip",
+ \ref cmdskipline "\\skipline", \ref cmduntil "\\until", and
+ \ref cmdinclude "\\include".
+
+<hr>
+\section cmdinclude \\include <file-name>
+
+ \addindex \\include
+ This command can be used to include a source file as a block of code.
+ The command takes the name of an include file as an argument.
+ Source files or directories can be specified using the
+ \ref cfg_example_path "EXAMPLE_PATH"
+ tag of doxygen's configuration file.
+
+ If \<file-name\> itself is not unique for the set of example files specified
+ by the \ref cfg_example_path "EXAMPLE_PATH" tag, you can include part
+ of the absolute path to disambiguate it.
+
+ Using the \\include command is equivalent to inserting the file into
+ the documentation block and surrounding it
+ with \ref cmdcode "\\code" and \ref cmdendcode "\\endcode" commands.
+
+ The main purpose of the \\include command is to avoid code
+ duplication in case of example blocks that consist of multiple
+ source and header files.
+
+ For a line by line description of a source files use the
+ \ref cmddontinclude "\\dontinclude" command in combination with
+ the \ref cmdline "\\line", \ref cmdskip "\\skip",
+ \ref cmdskipline "\\skipline",
+ and \\until commands.
+
+ \note Doxygen's special commands do not work inside blocks of code.
+ It is allowed to nest C-style comments inside a code block though.
+
+ \sa sections \ref cmdexample "\\example", \ref cmddontinclude "\\dontinclude", and
+ \ref cmdverbatim "\\verbatim".
+
+<hr>
+\section cmdincludelineno \\includelineno <file-name>
+
+ \addindex \\includelineno
+ This command works the same way as \\include, but will add line
+ numbers to the included file.
+
+ \sa section \ref cmdinclude "\\include".
+
+<hr>
+\section cmdline \\line ( pattern )
+
+ \addindex \\line
+ This command searches line by line through the example that was last
+ included using \\include or \\dontinclude until it finds a non-blank
+ line. If that line contains the specified pattern, it is written
+ to the output.
+
+ The internal pointer that is used to keep track of the current line in
+ the example, is set to the start of the line following the non-blank
+ line that was found (or to the end of the example if no such line could
+ be found).
+
+ See section \ref cmddontinclude "\\dontinclude" for an example.
+
+<hr>
+\section cmdskip \\skip ( pattern )
+
+ \addindex \\skip
+ This command searches line by line through the example that was last
+ included using \\include or \\dontinclude until it finds a line that contains
+ the specified pattern.
+
+ The internal pointer that is used to keep track of the current line in
+ the example, is set to the start of the line that contains the specified
+ pattern (or to the end of the example if the pattern could not be found).
+
+ See section \ref cmddontinclude "\\dontinclude" for an example.
+
+<hr>
+\section cmdskipline \\skipline ( pattern )
+
+ \addindex \\skipline
+ This command searches line by line through the example that was last
+ included using \\include or \\dontinclude until it finds a line that contains
+ the specified pattern. It then writes the line to the output.
+
+ The internal pointer that is used to keep track of the current line in
+ the example, is set to the start of the line following the line that is
+ written (or to the end of the example if the pattern could not be found).
+
+ \par Note:
+ The command:
+ \verbatim\skipline pattern\endverbatim
+ is equivalent to:
+\verbatim
+\skip pattern
+\line pattern\endverbatim
+
+ See section \ref cmddontinclude "\\dontinclude" for an example.
+
+<hr>
+\section cmduntil \\until ( pattern )
+
+ \addindex \\until
+ This command writes all lines of the example that was last
+ included using \\include or \\dontinclude to the output, until it finds
+ a line containing the specified pattern. The line containing the pattern
+ will be written as well.
+
+ The internal pointer that is used to keep track of the current line in
+ the example, is set to the start of the line following last written
+ line (or to the end of the example if the pattern could not be found).
+
+ See section \ref cmddontinclude "\\dontinclude" for an example.
+
+<hr>
+\section cmdverbinclude \\verbinclude <file-name>
+
+ \addindex \\verbinclude
+ This command includes the file \<file-name\> verbatim in the documentation.
+ The command is equivalent to pasting the file in the documentation and
+ placing \\verbatim and \\endverbatim commands around it.
+
+ Files or directories that doxygen should look for can be specified using the
+ \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
+
+<hr>
+\section cmdhtmlinclude \\htmlinclude <file-name>
+
+ \addindex \\htmlinclude
+ This command includes the file \<file-name\> as is in the HTML documentation.
+ The command is equivalent to pasting the file in the documentation and
+ placing \\htmlonly and \\endhtmlonly commands around it.
+
+ Files or directories that doxygen should look for can be specified using the
+ \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
+
+<hr>
+
+\htmlonly <center> \endhtmlonly
+<h2>
+\htmlonly --- \endhtmlonly
+Commands for visual enhancements
+\htmlonly --- \endhtmlonly
+</h2>
+\htmlonly </center>\endhtmlonly
+
+\section cmda \\a <word>
+
+ \addindex \\a
+ Displays the argument \<word\> in italics.
+ Use this command to emphasize words.
+ Use this command to refer to member arguments in the running text.
+
+ \par Example:
+ \verbatim
+ ... the \a x and \a y coordinates are used to ...
+ \endverbatim
+ This will result in the following text:<br><br>
+ ... the \a x and \a y coordinates are used to ...
+
+ Equivalent to \ref cmda "\\e" and \ref cmdem "\\em".
+ To emphasize multiple words use \<em\>multiple words\</em\>.
+
+<hr>
+\section cmdarg \\arg { item-description }
+
+ \addindex \\arg
+ This command has one argument that continues until the first
+ blank line or until another \\arg is encountered.
+ The command can be used to generate a simple, not nested list of
+ arguments.
+ Each argument should start with a \\arg command.
+
+ \par Example:
+ Typing:
+ \verbatim
+ \arg \c AlignLeft left alignment.
+ \arg \c AlignCenter center alignment.
+ \arg \c AlignRight right alignment
+
+ No other types of alignment are supported.
+ \endverbatim
+ will result in the following text:<br><br>
+ <ul>
+ <li> \c AlignLeft left alignment.
+ <li> \c AlignCenter center alignment.
+ <li> \c AlignRight right alignment
+ </ul><br>
+ No other types of alignment are supported.
+
+ \par Note:
+ For nested lists, HTML commands should be used.
+
+ Equivalent to \ref cmdli "\\li"
+
+
+<hr>
+\section cmdb \\b <word>
+
+ \addindex \\b
+ Displays the argument \<word\> using a bold font.
+ Equivalent to \<b\>word\</b\>.
+ To put multiple words in bold use \<b\>multiple words\</b\>.
+
+<hr>
+\section cmdc \\c <word>
+
+ \addindex \\c
+ Displays the argument \<word\> using a typewriter font.
+ Use this to refer to a word of code.
+ Equivalent to \<tt\>word\</tt\>.
+
+ \par Example:
+ Typing:
+ \verbatim
+ ... This function returns \c void and not \c int ...
+ \endverbatim
+ will result in the following text:<br><br>
+ ... This function returns \c void and not \c int ...
+
+ Equivalent to \ref cmdp "\\p"
+ To have multiple words in typewriter font use \<tt\>multiple words\</tt\>.
+
+<hr>
+\section cmdcode \\code
+
+ \addindex \\code
+ Starts a block of code. A code block is treated differently
+ from ordinary text. It is interpreted as C/C++ code. The names of the
+ classes and members that are documented are automatically replaced by
+ links to the documentation.
+
+ \sa section \ref cmdendcode "\\endcode" and section \ref cmdverbatim "\\verbatim".
+
+<hr>
+\section cmdcopydoc \\copydoc <link-object>
+
+ \addindex \\copydoc
+ Copies a documentation block from the object specified by \<link-object\>
+ and pastes it at the location of the command. This command can be useful
+ to avoid cases where a documentation block would otherwise have to be
+ duplicated or it can be used to extend the documentation of an inherited
+ member.
+
+ The link object can point to a member (of a class, file or group),
+ a class, a namespace, a group, a page, or a file (checked in that order).
+ Note that if the object pointed to is a member (function, variable,
+ typedef, etc), the compound (class, file, or group) containing it
+ should also be documented for the copying to work.
+
+ To copy the documentation for a member of a
+ class for instance one can put the following in the documentation
+
+\verbatim
+ /*! @copydoc MyClass::myfunction()
+ * More documentation.
+ */
+\endverbatim
+
+ if the member is overloaded, you should specify the argument types
+ explicitly (without spaces!), like in the following:
+
+\verbatim
+ /*! @copydoc MyClass::myfunction(type1,type2) */
+\endverbatim
+
+ Qualified names are only needed if the context in which the documentation
+ block is found requires them.
+
+ The \\copydoc command can be used recursively, but cycles in the \\copydoc
+ relation will be broken and flagged as an error.
+
+ Note that both the brief description and the detailed documentation
+ will be copied. See \ref cmdcopybrief "\\copybrief" and
+ \ref cmdcopydetails "\\copydetails" for copying only the brief or
+ detailed part of the comment block.
+
+ \sa sections \ref cmdcopybrief "\\copybrief" and \ref cmdcopydetails "\\copydetails"
+
+<hr>
+\section cmdcopybrief \\copybrief <link-object>
+
+Works in a similar way as \ref cmdcopydoc "\\copydoc" but will
+only copy the brief description, not the detailed documentation.
+
+<hr>
+\section cmdcopydetails \\copydetails <link-object>
+
+Works in a similar way as \ref cmdcopydoc "\\copydoc" but will
+only copy the detailed documentation, not the brief description.
+
+<hr>
+\section cmddot \\dot
+
+ \addindex \\dot
+ Starts a text fragment which should contain a valid description of a
+ dot graph. The text fragment ends with \ref cmdenddot "\\enddot".
+ Doxygen will pass the text on to dot and include the resulting
+ image (and image map) into the output.
+ The nodes of a graph can be made clickable by using the URL attribute.
+ By using the command \\ref inside the URL value you can conveniently
+ link to an item inside doxygen. Here is an example:
+\code
+/*! class B */
+class B {};
+
+/*! class C */
+class C {};
+
+/*! \mainpage
+ *
+ * Class relations expressed via an inline dot graph:
+ * \dot
+ * digraph example {
+ * node [shape=record, fontname=Helvetica, fontsize=10];
+ * b [ label="class B" URL="\ref B"];
+ * c [ label="class C" URL="\ref C"];
+ * b -> c [ arrowhead="open", style="dashed" ];
+ * }
+ * \enddot
+ * Note that the classes in the above graph are clickable
+ * (in the HTML output).
+ */
+\endcode
+
+<hr>
+\section cmdmsc \\msc
+
+ \addindex \\msc
+ Starts a text fragment which should contain a valid description of a
+ message sequence chart. See http://www.mcternan.me.uk/mscgen/ for examples.
+ The text fragment ends with \ref cmdendmsc "\\endmsc".
+ \note The text fragment should only include the part of the message
+ sequence chart that is
+ within the <code>msc {...}</code> block.
+ \note You need to install the <code>mscgen</code> tool, if you want to use this
+ command.
+
+Here is an example of the use of the \\msc command.
+\code
+/** Sender class. Can be used to send a command to the server.
+ * The receiver will acknowledge the command by calling Ack().
+ * \msc
+ * Sender,Receiver;
+ * Sender->Receiver [label="Command()", URL="\ref Receiver::Command()"];
+ * Sender<-Receiver [label="Ack()", URL="\ref Ack()", ID="1"];
+ * \endmsc
+ */
+class Sender
+{
+ public:
+ /** Acknowledgement from server */
+ void Ack(bool ok);
+};
+
+/** Receiver class. Can be used to receive and execute commands.
+ * After execution of a command, the receiver will send an acknowledgement
+ * \msc
+ * Receiver,Sender;
+ * Receiver<-Sender [label="Command()", URL="\ref Command()"];
+ * Receiver->Sender [label="Ack()", URL="\ref Sender::Ack()", ID="1"];
+ * \endmsc
+ */
+class Receiver
+{
+ public:
+ /** Executable a command on the server */
+ void Command(int commandId);
+};
+
+\endcode
+
+ \sa section \ref cmdmscfile "\\mscfile".
+
+<hr>
+\section cmddotfile \\dotfile <file> ["caption"]
+
+ \addindex \\dotfile
+ Inserts an image generated by dot from \<file\> into the documentation.
+
+ The first argument specifies the file name of the image.
+ doxygen will look for files in the paths (or files) that you specified
+ after the \ref cfg_dotfile_dirs "DOTFILE_DIRS" tag.
+ If the dot file is found it will be used as an input file to the dot tool.
+ The resulting image will be put into the correct output directory.
+ If the dot file name contains spaces you'll have to put quotes ("...") around it.
+
+ The second argument is optional and can be used to specify the caption
+ that is displayed below the image. This argument has to be specified
+ between quotes even if it does not contain any spaces. The quotes are
+ stripped before the caption is displayed.
+
+<hr>
+\section cmdmscfile \\mscfile <file> ["caption"]
+
+ \addindex \\mscfile
+ Inserts an image generated by mscgen from \<file\> into the documentation.
+ See http://www.mcternan.me.uk/mscgen/ for examples.
+
+ The first argument specifies the file name of the image.
+ doxygen will look for files in the paths (or files) that you specified
+ after the \ref cfg_mscfile_dirs "MSCFILE_DIRS" tag.
+ If the msc file is found it will be used as an input file to the mscgen tool.
+ The resulting image will be put into the correct output directory.
+ If the msc file name contains spaces you'll have to put quotes ("...") around it.
+
+ The second argument is optional and can be used to specify the caption
+ that is displayed below the image. This argument has to be specified
+ between quotes even if it does not contain any spaces. The quotes are
+ stripped before the caption is displayed.
+
+ \sa section \ref cmdmsc "\\msc".
+
+<hr>
+\section cmde \\e <word>
+
+ \addindex \\e
+ Displays the argument \<word\> in italics.
+ Use this command to emphasize words.
+
+ \par Example:
+ Typing:
+ \verbatim
+ ... this is a \e really good example ...
+ \endverbatim
+ will result in the following text:<br><br>
+ ... this is a \e really good example ...
+
+ Equivalent to \ref cmda "\\a" and \ref cmdem "\\em".
+ To emphasize multiple words use \<em\>multiple words\</em\>.
+
+<hr>
+\section cmdem \\em <word>
+
+ \addindex \\em
+ Displays the argument \<word\> in italics.
+ Use this command to emphasize words.
+
+ \par Example:
+ Typing:
+ \verbatim
+ ... this is a \em really good example ...
+ \endverbatim
+ will result in the following text:<br><br>
+ ... this is a \em really good example ...
+
+ Equivalent to \ref cmda "\\a" and \ref cmde "\\e".
+ To emphasize multiple words use \<em\>multiple words\</em\>.
+
+<hr>
+\section cmdendcode \\endcode
+
+ \addindex \\endcode
+ Ends a block of code.
+ \sa section \ref cmdcode "\\code"
+
+<hr>
+\section cmdenddot \\enddot
+
+ \addindex \\enddot
+ Ends a blocks that was started with \ref cmddot "\\dot".
+
+<hr>
+\section cmdendmsc \\endmsc
+
+ \addindex \\endmsc
+ Ends a blocks that was started with \ref cmdmsc "\\msc".
+
+<hr>
+\section cmdendhtmlonly \\endhtmlonly
+
+ \addindex \\endhtmlonly
+ Ends a block of text that was started with a \\htmlonly command.
+
+ \sa section \ref cmdhtmlonly "\\htmlonly".
+
+<hr>
+\section cmdendlatexonly \\endlatexonly
+
+ \addindex \\endlatexonly
+ Ends a block of text that was started with a \\latexonly command.
+
+ \sa section \ref cmdlatexonly "\\latexonly".
+
+<hr>
+\section cmdendmanonly \\endmanonly
+
+ \addindex \\endmanonly
+ Ends a block of text that was started with a \\manonly command.
+
+ \sa section \ref cmdmanonly "\\manonly".
+
+<hr>
+\section cmdendrtfonly \\endrtfonly
+
+ \addindex \\endrtfonly
+ Ends a block of text that was started with a \\rtfonly command.
+
+ \sa section \ref cmdrtfonly "\\rtfonly".
+
+
+<hr>
+\section cmdendverbatim \\endverbatim
+
+ \addindex \\endverbatim
+ Ends a block of text that was started with a \\verbatim command.
+
+ \sa section \ref cmdverbatim "\\verbatim".
+
+<hr>
+\section cmdendxmlonly \\endxmlonly
+
+ \addindex \\endxmlonly
+ Ends a block of text that was started with a \\xmlonly command.
+
+ \sa section \ref cmdxmlonly "\\xmlonly".
+
+<hr>
+\section cmdfdollar \\f$
+
+ \addindex \\f\$
+
+ Marks the start and end of an in-text formula.
+ \sa section \ref formulas "formulas" for an example.
+
+<hr>
+\section cmdfbropen \\f[
+
+ \addindex \\f[
+
+ Marks the start of a long formula that is displayed
+ centered on a separate line.
+ \sa section \ref cmdfbrclose "\\f]" and section \ref formulas "formulas".
+
+<hr>
+\section cmdfbrclose \\f]
+
+ \addindex \\f]
+
+ Marks the end of a long formula that is displayed
+ centered on a separate line.
+ \sa section \ref cmdfbropen "\\f[" and section \ref formulas "formulas".
+
+<hr>
+\section cmdfcurlyopen \\f{environment}{
+
+ Marks the start of a formula that is in a specific environment.
+ \note The second { is optional and is only to help editors (such as Vim) to
+ do proper syntax highlighting by making the number of opening and closing braces
+ the same.
+
+<hr>
+\section cmdfcurlyclose \\f}
+
+ Marks the end of a formula that is in a specific environment.
+
+<hr>
+\section cmdhtmlonly \\htmlonly
+
+ \addindex \\htmlonly
+ Starts a block of text that will be verbatim included in the
+ generated HTML documentation only. The block ends with a
+ \ref cmdhtmlonly "\\endhtmlonly" command.
+
+ This command can be used to include HTML code that is too complex
+ for doxygen (i.e. applets, java-scripts, and HTML tags that
+ require attributes). You can use the \\latexonly and \\endlatexonly
+ pair to provide a proper \f$\mbox{\LaTeX}\f$ alternative.
+
+ \note environment variables (like \$(HOME) ) are resolved inside a
+ HTML-only block.
+
+ \sa section \ref cmdmanonly "\\manonly", section
+ \ref cmdlatexonly "\\latexonly", and section
+ \ref cmdrtfonly "\\rtfonly".
+
+<hr>
+\section cmdimage \\image <format> <file> ["caption"] [<sizeindication>=<size>]
+
+ \addindex \\image
+ Inserts an image into the documentation. This command is format
+ specific, so if you want to insert an image for more than one
+ format you'll have to repeat this command for each format.
+
+ The first argument specifies the output format. Currently, the
+ following values are supported: \c html, \c latex and \c rtf.
+
+ The second argument specifies the file name of the image.
+ doxygen will look for files in the paths (or files) that you specified
+ after the \ref cfg_image_path "IMAGE_PATH" tag.
+ If the image is found it will be copied to the correct output directory.
+ If the image name contains spaces you'll have to put quotes ("...") around it.
+ You can also specify an absolute URL instead of a file name, but then
+ doxygen does not copy the image nor check its existence.
+
+ The third argument is optional and can be used to specify the caption
+ that is displayed below the image. This argument has to be specified
+ on a single line and between quotes even if it does not contain any
+ spaces. The quotes are stripped before the caption is displayed.
+
+ The fourth argument is also optional and can be used to specify the
+ width or height of the image. This is only useful
+ for \f$\mbox{\LaTeX}\f$ output
+ (i.e. format=<code>latex</code>). The \c sizeindication can be
+ either \c width or \c height. The size should be a valid
+ size specifier in \f$\mbox{\LaTeX}\f$ (for example <code>10cm</code> or
+ <code>6in</code> or a symbolic width like <code>\\textwidth</code>).
+
+ Here is example of a comment block:
+
+\verbatim
+ /*! Here is a snapshot of my new application:
+ * \image html application.jpg
+ * \image latex application.eps "My application" width=10cm
+ */
+\endverbatim
+
+ And this is an example of how the relevant part of the configuration file
+ may look:
+
+\verbatim
+ IMAGE_PATH = my_image_dir
+\endverbatim
+
+ \warning The image format for HTML is limited to what your
+ browser supports. For \f$\mbox{\LaTeX}\f$, the image format
+ must be Encapsulated PostScript (eps).
+ <br><br>
+ Doxygen does not check if the image is in the correct format.
+ So \e you have to make sure this is the case!
+
+<hr>
+\section cmdlatexonly \\latexonly
+
+ \addindex \\latexonly
+ Starts a block of text that will be verbatim included in the
+ generated \f$\mbox{\LaTeX}\f$ documentation only. The block ends with a
+ \ref cmdendlatexonly "\\endlatexonly" command.
+
+ This command can be used to include \f$\mbox{\LaTeX}\f$ code that is too
+ complex for doxygen (i.e. images, formulas, special characters). You can
+ use the \\htmlonly and \\endhtmlonly pair to provide a proper HTML
+ alternative.
+
+ \b Note:
+ environment variables (like \$(HOME) ) are resolved inside a
+ \f$\mbox{\LaTeX}\f$-only block.
+
+ \sa section \ref cmdrtfonly "\\rtfonly",
+ section \ref cmdxmlonly "\\xmlonly",
+ section \ref cmdmanonly "\\manonly", and
+ section \ref cmdhtmlonly "\\htmlonly".
+
+<hr>
+\section cmdmanonly \\manonly
+
+ \addindex \\manonly
+ Starts a block of text that will be verbatim included in the
+ generated MAN documentation only. The block ends with a
+ \ref cmdendmanonly "\\endmanonly" command.
+
+ This command can be used to include groff code directly into
+ MAN pages. You can use the \\htmlonly and \\latexonly and
+ \\endhtmlonly and \\endlatexonly pairs to provide proper
+ HTML and \f$\mbox{\LaTeX}\f$ alternatives.
+
+ \sa section \ref cmdhtmlonly "\\htmlonly",
+ section \ref cmdxmlonly "\\xmlonly",
+ section \ref cmdrtfonly "\\rtfonly", and
+ section \ref cmdlatexonly "\\latexonly".
+
+<hr>
+\section cmdli \\li { item-description }
+
+ \addindex \\li
+ This command has one argument that continues until the first
+ blank line or until another \\li is encountered.
+ The command can be used to generate a simple, not nested list of
+ arguments.
+ Each argument should start with a \\li command.
+
+ \par Example:
+ Typing:
+ \verbatim
+ \li \c AlignLeft left alignment.
+ \li \c AlignCenter center alignment.
+ \li \c AlignRight right alignment
+
+ No other types of alignment are supported.
+ \endverbatim
+ will result in the following text:<br><br>
+ <ul>
+ <li> \c AlignLeft left alignment.
+ <li> \c AlignCenter center alignment.
+ <li> \c AlignRight right alignment
+ </ul><br>
+ No other types of alignment are supported.
+
+ \par Note:
+ For nested lists, HTML commands should be used.
+
+ Equivalent to \ref cmdarg "\\arg"
+
+<hr>
+\section cmdn \\n
+
+ \addindex \\n
+ Forces a new line. Equivalent to \<br\> and inspired by
+ the printf function.
+
+<hr>
+\section cmdp \\p <word>
+
+ \addindex \\p
+ Displays the parameter \<word\> using a typewriter font.
+ You can use this command to refer to member function parameters in
+ the running text.
+
+ \par Example:
+ \verbatim
+ ... the \p x and \p y coordinates are used to ...
+ \endverbatim
+ This will result in the following text:<br><br>
+ ... the \p x and \p y coordinates are used to ...
+
+ Equivalent to \ref cmdc "\\c"
+ To have multiple words in typewriter font use \<tt\>multiple words\</tt\>.
+
+<hr>
+\section cmdrtfonly \\rtfonly
+
+ \addindex \\rtfonly
+ Starts a block of text that will be verbatim included in the
+ generated RTF documentation only. The block ends with a
+ \ref cmdendrtfonly "\\endrtfonly" command.
+
+ This command can be used to include RTF code that is too complex
+ for doxygen.
+
+ \b Note:
+ environment variables (like \$(HOME) ) are resolved inside a
+ RTF-only block.
+
+ \sa section \ref cmdmanonly "\\manonly", section
+ \ref cmdxmlonly "\\xmlonly", section
+ \ref cmdlatexonly "\\latexonly", and section
+ \ref cmdhtmlonly "\\htmlonly".
+
+<hr>
+\section cmdverbatim \\verbatim
+
+ \addindex \\verbatim
+ Starts a block of text that will be verbatim included in
+ the documentation. The block should end with a
+ \ref cmdendverbatim "\\endverbatim" block.
+ All commands are disabled in a verbatim block.
+
+ \warning Make sure you include a \\endverbatim command for each
+ \\verbatim command or the parser will get confused!
+
+ \sa section \ref cmdcode "\\code", and
+ section \ref cmdverbinclude "\\verbinclude".
+
+<hr>
+\section cmdxmlonly \\xmlonly
+
+ \addindex \\xmlonly
+ Starts a block of text that will be verbatim included in the
+ generated XML output only. The block ends with a
+ endxmlonly command.
+
+ This command can be used to include custom XML tags.
+
+ \sa section \ref cmdmanonly "\\manonly", section
+ \ref cmdrtfonly "\\rtfonly", section
+ \ref cmdlatexonly "\\latexonly", and section
+ \ref cmdhtmlonly "\\htmlonly".
+
+<hr>
+\section cmdbackslash \\\\
+
+ \addindex \\\\
+ This command writes a backslash character (\\) to the
+ output. The backslash has to be escaped in some
+ cases because doxygen uses it to detect commands.
+
+<hr>
+\section cmdat \\\@
+
+ \addindex \\\@
+ This command writes an at-sign (\@) to the output.
+ The at-sign has to be escaped in some cases
+ because doxygen uses it to detect JavaDoc commands.
+
+<hr>
+\section cmdtilde \\~[LanguageId]
+ \addindex \\~
+ This command enables/disables a language specific filter. This can be
+ used to put documentation for different language into one comment block
+ and use the \c OUTPUT_LANGUAGE tag to filter out only a specific language.
+ Use \\~language_id to enable output for a specific language only and
+ \\~ to enable output for all languages (this is also the default mode).
+
+ Example:
+\verbatim
+/*! \~english This is english \~dutch Dit is Nederlands \~german Dieses ist
+ deutsch. \~ output for all languages.
+ */
+\endverbatim
+
+
+<hr>
+\section cmdamp \\\&
+
+ \addindex \\\&
+ This command writes the \& character to output.
+ This character has to be escaped because it has a special meaning in HTML.
+
+<hr>
+\section cmddollar \\\$
+
+ \addindex \\\$
+ This command writes the \$ character to the output.
+ This character has to be escaped in some cases, because it is used to expand
+ environment variables.
+
+<hr>
+\section cmdhash \\\#
+
+ \addindex \\\#
+ This command writes the \# character to the output. This
+ character has to be escaped in some cases, because it is used to refer
+ to documented entities.
+
+<hr>
+\section cmdlt \\\<
+
+ \addindex \\\<
+ This command writes the \< character to the output.
+ This character has to be escaped because it has a special meaning in HTML.
+
+<hr>
+\section cmdgt \\\>
+
+ \addindex \\\>
+ This command writes the \> character to the output. This
+ character has to be escaped because it has a special meaning in HTML.
+
+<hr>
+\section cmdperc \\\%
+
+ \addindex \\\%
+ This command writes the \% character to the output. This
+ character has to be escaped in some cases, because it is used to
+ prevent auto-linking to word that is also a documented class or struct.
+
+<hr>
+\section cmdquot \\"
+
+ \addindex \\\"
+ This command writes the \" character to the output. This
+ character has to be escaped in some cases, because it is used in pairs
+ to indicate an unformatted text fragment.
+
+<hr>
+\section cmddcolon \\::
+
+ \addindex \\\::
+ This command write a double colon (\::) to the output. This
+ character sequence has to be escaped in some cases, because it is used
+ to ref to documented entities.
+
+<hr>
+\htmlonly <center> \endhtmlonly
+<h2>
+\htmlonly --- \endhtmlonly
+Commands included for Qt compatibility
+\htmlonly --- \endhtmlonly
+</h2>
+\htmlonly </center>\endhtmlonly
+
+The following commands are supported to remain compatible to the Qt class
+browser generator. Do \e not use these commands in your own documentation.
+<ul>
+<li>\\annotatedclasslist
+<li>\\classhierarchy
+<li>\\define
+<li>\\functionindex
+<li>\\header
+<li>\\headerfilelist
+<li>\\inherit
+<li>\\l
+<li>\\postheader
+</ul>
+<hr>
+
+*/
+
diff --git a/doc/config.doc b/doc/config.doc
new file mode 100644
index 0000000..a511f8b
--- /dev/null
+++ b/doc/config.doc
@@ -0,0 +1,2585 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page config Configuration
+
+\section config_format Format
+
+A configuration file is a free-form ASCII text file with a structure
+that is similar to that of a Makefile, with the default name \c Doxyfile. It is
+parsed by \c doxygen. The file may contain tabs and newlines for
+formatting purposes. The statements in the file are case-sensitive.
+Comments may be placed anywhere within the file (except within quotes).
+Comments begin with the \# character and end at the end of the line.
+
+The file essentially consists of a list of assignment statements.
+Each statement consists of a \c TAG_NAME written in capitals,
+followed by the <code>=</code> character and one or more values. If the same tag
+is assigned more than once, the last assignment overwrites any earlier
+assignment. For options that take a list as their argument,
+the <code>+=</code> operator can be used instead of <code>=</code> to append
+new values to the list. Values are sequences of non-blanks. If the value should
+contain one or more blanks it must be surrounded by quotes (&quot;...&quot;).
+Multiple lines can be concatenated by inserting a backslash (\\)
+as the last character of a line. Environment variables can be expanded
+using the pattern <code>\$(ENV_VARIABLE_NAME)</code>.
+
+You can also include part of a configuration file from another configuration
+file using a <code>\@INCLUDE</code> tag as follows:
+\verbatim
+@INCLUDE = config_file_name
+\endverbatim
+The include file is searched in the current working directory. You can
+also specify a list of directories that should be searched before looking
+in the current working directory. Do this by putting a <code>\@INCLUDE_PATH</code> tag
+with these paths before the <code>\@INCLUDE</code> tag, e.g:
+\verbatim
+@INCLUDE_PATH = my_config_dir
+\endverbatim
+
+The configuration options can be divided into several categories.
+Below is an alphabetical index of the tags that are recognized
+followed by the descriptions of the tags grouped by category.
+
+\secreflist
+\refitem cfg_abbreviate_brief ABBREVIATE_BRIEF
+\refitem cfg_aliases ALIASES
+\refitem cfg_allexternals ALLEXTERNALS
+\refitem cfg_alphabetical_index ALPHABETICAL_INDEX
+\refitem cfg_always_detailed_sec ALWAYS_DETAILED_SEC
+\refitem cfg_binary_toc BINARY_TOC
+\refitem cfg_brief_member_desc BRIEF_MEMBER_DESC
+\refitem cfg_builtin_stl_support BUILTIN_STL_SUPPORT
+\refitem cfg_call_graph CALL_GRAPH
+\refitem cfg_caller_graph CALLER_GRAPH
+\refitem cfg_case_sense_names CASE_SENSE_NAMES
+\refitem cfg_chm_file CHM_FILE
+\refitem cfg_chm_index_encoding CHM_INDEX_ENCODING
+\refitem cfg_class_diagrams CLASS_DIAGRAMS
+\refitem cfg_class_graph CLASS_GRAPH
+\refitem cfg_collaboration_graph COLLABORATION_GRAPH
+\refitem cfg_cols_in_alpha_index COLS_IN_ALPHA_INDEX
+\refitem cfg_compact_latex COMPACT_LATEX
+\refitem cfg_compact_rtf COMPACT_RTF
+\refitem cfg_cpp_cli_support CPP_CLI_SUPPORT
+\refitem cfg_create_subdirs CREATE_SUBDIRS
+\refitem cfg_directory_graph DIRECTORY_GRAPH
+\refitem cfg_disable_index DISABLE_INDEX
+\refitem cfg_distribute_group_doc DISTRIBUTE_GROUP_DOC
+\refitem cfg_docset_bundle_id DOCSET_BUNDLE_ID
+\refitem cfg_docset_feedname DOCSET_FEEDNAME
+\refitem cfg_docset_publisher_id DOCSET_PUBLISHER_ID
+\refitem cfg_docset_publisher_name DOCSET_PUBLISHER_NAME
+\refitem cfg_dot_cleanup DOT_CLEANUP
+\refitem cfg_dot_fontname DOT_FONTNAME
+\refitem cfg_dot_fontpath DOT_FONTPATH
+\refitem cfg_dot_fontsize DOT_FONTSIZE
+\refitem cfg_dot_graph_max_nodes DOT_GRAPH_MAX_NODES
+\refitem cfg_dot_image_format DOT_IMAGE_FORMAT
+\refitem cfg_dot_multi_targets DOT_MULTI_TARGETS
+\refitem cfg_dot_num_threads DOT_NUM_THREADS
+\refitem cfg_dot_path DOT_PATH
+\refitem cfg_dot_transparent DOT_TRANSPARENT
+\refitem cfg_dotfile_dirs DOTFILE_DIRS
+\refitem cfg_doxyfile_encoding DOXYFILE_ENCODING
+\refitem cfg_eclipse_doc_id ECLIPSE_DOC_ID
+\refitem cfg_enable_preprocessing ENABLE_PREPROCESSING
+\refitem cfg_enabled_sections ENABLED_SECTIONS
+\refitem cfg_enum_values_per_line ENUM_VALUES_PER_LINE
+\refitem cfg_example_path EXAMPLE_PATH
+\refitem cfg_example_patterns EXAMPLE_PATTERNS
+\refitem cfg_example_recursive EXAMPLE_RECURSIVE
+\refitem cfg_exclude EXCLUDE
+\refitem cfg_exclude_patterns EXCLUDE_PATTERNS
+\refitem cfg_exclude_symbols EXCLUDE_SYMBOLS
+\refitem cfg_exclude_symlinks EXCLUDE_SYMLINKS
+\refitem cfg_expand_as_defined EXPAND_AS_DEFINED
+\refitem cfg_expand_only_predef EXPAND_ONLY_PREDEF
+\refitem cfg_ext_links_in_window EXT_LINKS_IN_WINDOW
+\refitem cfg_extension_mapping EXTENSION_MAPPING
+\refitem cfg_external_groups EXTERNAL_GROUPS
+\refitem cfg_extra_packages EXTRA_PACKAGES
+\refitem cfg_extract_all EXTRACT_ALL
+\refitem cfg_extract_anon_nspaces EXTRACT_ANON_NSPACES
+\refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES
+\refitem cfg_extract_local_methods EXTRACT_LOCAL_METHODS
+\refitem cfg_extract_private EXTRACT_PRIVATE
+\refitem cfg_extract_static EXTRACT_STATIC
+\refitem cfg_file_patterns FILE_PATTERNS
+\refitem cfg_file_version_filter FILE_VERSION_FILTER
+\refitem cfg_filter_patterns FILTER_PATTERNS
+\refitem cfg_filter_source_files FILTER_SOURCE_FILES
+\refitem cfg_filter_source_patterns FILTER_SOURCE_PATTERNS
+\refitem cfg_force_local_includes FORCE_LOCAL_INCLUDES
+\refitem cfg_formula_fontsize FORMULA_FONTSIZE
+\refitem cfg_formula_transparent FORMULA_TRANSPARENT
+\refitem cfg_full_path_names FULL_PATH_NAMES
+\refitem cfg_generate_autogen_def GENERATE_AUTOGEN_DEF
+\refitem cfg_generate_buglist GENERATE_BUGLIST
+\refitem cfg_generate_chi GENERATE_CHI
+\refitem cfg_generate_deprecatedlist GENERATE_DEPRECIATEDLIST
+\refitem cfg_generate_docset GENERATE_DOCSET
+\refitem cfg_generate_eclipsehelp GENERATE_ECLIPSEHELP
+\refitem cfg_generate_html GENERATE_HTML
+\refitem cfg_generate_htmlhelp GENERATE_HTMLHELP
+\refitem cfg_generate_latex GENERATE_LATEX
+\refitem cfg_generate_legend GENERATE_LEGEND
+\refitem cfg_generate_man GENERATE_MAN
+\refitem cfg_generate_perlmod GENERATE_PERLMOD
+\refitem cfg_generate_qhp GENERATE_QHP
+\refitem cfg_generate_rtf GENERATE_RTF
+\refitem cfg_generate_tagfile GENERATE_TAGFILE
+\refitem cfg_generate_testlist GENERATE_TESTLIST
+\refitem cfg_generate_todolist GENERATE_TODOLIST
+\refitem cfg_generate_treeview GENERATE_TREEVIEW
+\refitem cfg_generate_xml GENERATE_XML
+\refitem cfg_graphical_hierarchy GRAPHICAL_HIERARCHY
+\refitem cfg_group_graphs GROUP_GRAPHS
+\refitem cfg_have_dot HAVE_DOT
+\refitem cfg_hhc_location HHC_LOCATION
+\refitem cfg_hide_friend_compounds HIDE_FRIEND_COMPOUNDS
+\refitem cfg_hide_in_body_docs HIDE_IN_BODY_DOCS
+\refitem cfg_hide_scope_names HIDE_SCOPE_NAMES
+\refitem cfg_hide_undoc_classes HIDE_UNDOC_CLASSES
+\refitem cfg_hide_undoc_members HIDE_UNDOC_MEMBERS
+\refitem cfg_hide_undoc_relations HIDE_UNDOC_RELATIONS
+\refitem cfg_html_align_members HTML_ALIGN_MEMBERS
+\refitem cfg_html_colorstyle_gamma HTML_COLORSTYLE_GAMMA
+\refitem cfg_html_colorstyle_hue HTML_COLORSTYLE_HUE
+\refitem cfg_html_colorstyle_sat HTML_COLORSTYLE_SAT
+\refitem cfg_html_dynamic_sections HTML_DYNAMIC_SECTIONS
+\refitem cfg_html_extra_files HTML_EXTRA_FILES
+\refitem cfg_html_file_extension HTML_FILE_EXTENSION
+\refitem cfg_html_footer HTML_FOOTER
+\refitem cfg_html_header HTML_HEADER
+\refitem cfg_html_output HTML_OUTPUT
+\refitem cfg_html_stylesheet HTML_STYLESHEET
+\refitem cfg_html_timestamp HTML_TIMESTAMP
+\refitem cfg_idl_property_support IDL_PROPERTY_SUPPORT
+\refitem cfg_ignore_prefix IGNORE_PREFIX
+\refitem cfg_image_path IMAGE_PATH
+\refitem cfg_include_file_patterns INCLUDE_FILE_PATTERNS
+\refitem cfg_include_graph INCLUDE_GRAPH
+\refitem cfg_include_path INCLUDE_PATH
+\refitem cfg_included_by_graph INCLUDED_BY_GRAPH
+\refitem cfg_inherit_docs INHERIT_DOCS
+\refitem cfg_inline_grouped_classes INLINE_GROUPED_CLASSES
+\refitem cfg_inline_info INLINE_INFO
+\refitem cfg_inline_inherited_memb INLINE_INHERITED_MEMB
+\refitem cfg_inline_sources INLINE_SOURCES
+\refitem cfg_input INPUT
+\refitem cfg_input_encoding INPUT_ENCODING
+\refitem cfg_input_filter INPUT_FILTER
+\refitem cfg_internal_docs INTERNAL_DOCS
+\refitem cfg_javadoc_autobrief JAVADOC_AUTOBRIEF
+\refitem cfg_latex_batchmode LATEX_BATCHMODE
+\refitem cfg_latex_cmd_name LATEX_CMD_NAME
+\refitem cfg_latex_footer LATEX_FOOTER
+\refitem cfg_latex_header LATEX_HEADER
+\refitem cfg_latex_hide_indices LATEX_HIDE_INDICES
+\refitem cfg_latex_output LATEX_OUTPUT
+\refitem cfg_latex_source_code LATEX_SOURCE_CODE
+\refitem cfg_layout_file LAYOUT_FILE
+\refitem cfg_macro_expansion MACRO_EXPANSION
+\refitem cfg_makeindex_cmd_name MAKEINDEX_CMD_NAME
+\refitem cfg_man_extension MAN_EXTENSION
+\refitem cfg_man_links MAN_LINKS
+\refitem cfg_man_output MAN_OUTPUT
+\refitem cfg_mathjax_relpath MATHJAX_RELPATH
+\refitem cfg_max_dot_graph_depth MAX_DOT_GRAPH_DEPTH
+\refitem cfg_max_initializer_lines MAX_INITIALIZER_LINES
+\refitem cfg_mscfile_dirs MSCFILE_DIRS
+\refitem cfg_mscgen_path MSCGEN_PATH
+\refitem cfg_multiline_cpp_is_brief MULTILINE_CPP_IS_BRIEF
+\refitem cfg_optimize_for_fortran OPTIMIZE_FOR_FORTRAN
+\refitem cfg_optimize_output_for_c OPTIMIZE_OUTPUT_FOR_C
+\refitem cfg_optimize_output_java OPTIMIZE_OUTPUT_JAVA
+\refitem cfg_optimize_output_vhdl OPTIMIZE_OUTPUT_VHDL
+\refitem cfg_output_directory OUTPUT_DIRECTORY
+\refitem cfg_output_language OUTPUT_LANGUAGE
+\refitem cfg_paper_type PAPER_TYPE
+\refitem cfg_pdf_hyperlinks PDF_HYPERLINKS
+\refitem cfg_perl_path PERL_PATH
+\refitem cfg_perlmod_latex PERLMOD_LATEX
+\refitem cfg_perlmod_makevar_prefix PERLMOD_MAKEVAR_PREFIX
+\refitem cfg_perlmod_pretty PERLMOD_PRETTY
+\refitem cfg_predefined PREDEFINED
+\refitem cfg_project_brief PROJECT_BRIEF
+\refitem cfg_project_logo PROJECT_LOGO
+\refitem cfg_project_name PROJECT_NAME
+\refitem cfg_project_number PROJECT_NUMBER
+\refitem cfg_qch_file QCH_FILE
+\refitem cfg_qhg_location QHG_LOCATION
+\refitem cfg_qhp_cust_filter_attrs QHP_CUST_FILTER_ATTRS
+\refitem cfg_qhp_cust_filter_name QHP_CUST_FILTER_NAME
+\refitem cfg_qhp_namespace QHP_NAMESPACE
+\refitem cfg_qhp_sect_filter_attrs QHP_SECT_FILTER_ATTRS
+\refitem cfg_qhp_virtual_folder QHP_VIRTUAL_FOLDER
+\refitem cfg_qt_autobrief QT_AUTOBRIEF
+\refitem cfg_quiet QUIET
+\refitem cfg_recursive RECURSIVE
+\refitem cfg_referenced_by_relation REFERENCED_BY_RELATION
+\refitem cfg_references_link_source REFERENCES_LINK_SOURCE
+\refitem cfg_references_relation REFERENCES_RELATION
+\refitem cfg_repeat_brief REPEAT_BRIEF
+\refitem cfg_rtf_extensions_file RTF_EXTENSIONS_FILE
+\refitem cfg_rtf_hyperlinks RTF_HYPERLINKS
+\refitem cfg_rtf_output RTF_OUTPUT
+\refitem cfg_rtf_stylesheet_file RTF_STYLESHEET_FILE
+\refitem cfg_search_includes SEARCH_INCLUDES
+\refitem cfg_searchengine SEARCHENGINE
+\refitem cfg_separate_member_pages SEPARATE_MEMBER_PAGES
+\refitem cfg_server_based_search SERVER_BASED_SEARCH
+\refitem cfg_short_names SHORT_NAMES
+\refitem cfg_show_dirs SHOW_DIRECTORIES
+\refitem cfg_show_files SHOW_FILES
+\refitem cfg_show_include_files SHOW_INCLUDE_FILES
+\refitem cfg_show_namespaces SHOW_NAMESPACES
+\refitem cfg_show_used_files SHOW_USED_FILES
+\refitem cfg_sip_support SIP_SUPPORT
+\refitem cfg_skip_function_macros SKIP_FUNCTION_MACROS
+\refitem cfg_sort_brief_docs SORT_BRIEF_DOCS
+\refitem cfg_sort_by_scope_name SORT_BY_SCOPE_NAME
+\refitem cfg_sort_group_names SORT_GROUP_NAMES
+\refitem cfg_sort_member_docs SORT_MEMBER_DOCS
+\refitem cfg_sort_members_constructors_first SORT_MEMBERS_CTORS_1ST
+\refitem cfg_source_browser SOURCE_BROWSER
+\refitem cfg_strip_code_comments STRIP_CODE_COMMENTS
+\refitem cfg_strip_from_inc_path STRIP_FROM_INC_PATH
+\refitem cfg_strip_from_path STRIP_FROM_PATH
+\refitem cfg_subgrouping SUBGROUPING
+\refitem cfg_symbol_cache_size SYMBOL_CACHE_SIZE
+\refitem cfg_tab_size TAB_SIZE
+\refitem cfg_tagfiles TAGFILES
+\refitem cfg_template_relations TEMPLATE_RELATIONS
+\refitem cfg_toc_expand TOC_EXPAND
+\refitem cfg_treeview_width TREEVIEW_WIDTH
+\refitem cfg_typedef_hides_struct TYPEDEF_HIDES_STRUCT
+\refitem cfg_uml_look UML_LOOK
+\refitem cfg_use_htags USE_HTAGS
+\refitem cfg_use_inline_trees USE_INLINE_TREES
+\refitem cfg_use_mathjax USE_MATHJAX
+\refitem cfg_use_pdflatex USE_PDFLATEX
+\refitem cfg_verbatim_headers VERBATIM_HEADERS
+\refitem cfg_warn_format WARN_FORMAT
+\refitem cfg_warn_if_doc_error WARN_IF_DOC_ERROR
+\refitem cfg_warn_if_undocumented WARN_IF_UNDOCUMENTED
+\refitem cfg_warn_logfile WARN_LOGFILE
+\refitem cfg_warn_no_paramdoc WARN_NO_PARAMDOC
+\refitem cfg_warnings WARNINGS
+\refitem cfg_xml_dtd XML_DTD
+\refitem cfg_xml_output XML_OUTPUT
+\refitem cfg_xml_programlisting XML_PROGRAMLISTING
+\refitem cfg_xml_schema XML_SCHEMA
+\endsecreflist
+
+\section config_project Project related options
+\anchor cfg_doxyfile_encoding
+<dl>
+
+<dt>\c DOXYFILE_ENCODING <dd>
+ \addindex DOXYFILE_ENCODING
+ This tag specifies the encoding used for all characters in the config file that
+ follow. The default is UTF-8 which is also the encoding used for all text before
+ the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into
+ libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of
+ possible encodings.
+
+\anchor cfg_project_name
+<dt>\c PROJECT_NAME <dd>
+ \addindex PROJECT_NAME
+ The \c PROJECT_NAME tag is a single word (or a sequence of words
+ surrounded by double-quotes) that should identify the project for which the
+ documentation is generated. This name is used in the title of most
+ generated pages and in a few other places.
+
+\anchor cfg_project_number
+<dt>\c PROJECT_NUMBER <dd>
+ \addindex PROJECT_NUMBER
+ The \c PROJECT_NUMBER tag can be used to enter a project or revision number.
+ This could be handy for archiving the generated documentation or
+ if some version control system is used.
+
+\anchor cfg_project_brief
+<dt>\c PROJECT_BRIEF <dd>
+ Using the \c PROJECT_BRIEF tag one can provide an optional one line description
+ for a project that appears at the top of each page and should give viewer
+ a quick idea about the purpose of the project. Keep the description short.
+
+\anchor cfg_project_logo
+<dt>\c PROJECT_LOGO <dd>
+ With the \c PROJECT_LOGO tag one can specify an logo or icon that is
+ included in the documentation. The maximum height of the logo should not
+ exceed 55 pixels and the maximum width should not exceed 200 pixels.
+ Doxygen will copy the logo to the output directory.
+
+\anchor cfg_output_directory
+<dt>\c OUTPUT_DIRECTORY <dd>
+ \addindex OUTPUT_DIRECTORY
+ The \c OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+ path into which the generated documentation will be written.
+ If a relative path is entered, it will be relative to the location
+ where doxygen was started. If left blank the current directory will be used.
+
+\anchor cfg_create_subdirs
+<dt>\c CREATE_SUBDIRS <dd>
+ \addindex CREATE_SUBDIRS
+ If the \c CREATE_SUBDIRS tag is set to \c YES, then doxygen will create
+ 4096 sub-directories (in 2 levels) under the output directory of each output
+ format and will distribute the generated files over these directories.
+ Enabling this option can be useful when feeding doxygen a huge amount of source
+ files, where putting all generated files in the same directory would otherwise
+ causes performance problems for the file system.
+
+\anchor cfg_output_language
+<dt>\c OUTPUT_LANGUAGE <dd>
+ \addindex OUTPUT_LANGUAGE
+ The \c OUTPUT_LANGUAGE tag is used to specify the language in which all
+ documentation generated by doxygen is written. Doxygen will use this
+ information to generate all constant output in the proper language.
+ The default language is English, other supported languages are:
+ Afrikaans, Arabic, Brazilian, Catalan, Chinese, Croatian, Czech, Danish, Dutch,
+ Finnish, French, German, Greek, Hungarian, Italian, Japanese, Korean,
+ Lithuanian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian,
+ Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+\anchor cfg_brief_member_desc
+<dt>\c BRIEF_MEMBER_DESC <dd>
+ \addindex BRIEF_MEMBER_DESC
+ If the \c BRIEF_MEMBER_DESC tag is set to \c YES (the default) doxygen will
+ include brief member descriptions after the members that are listed in
+ the file and class documentation (similar to JavaDoc).
+ Set to NO to disable this.
+
+\anchor cfg_repeat_brief
+<dt>\c REPEAT_BRIEF <dd>
+ \addindex REPEAT_BRIEF
+ If the \c REPEAT_BRIEF tag is set to \c YES (the default) doxygen will
+ prepend the brief description of a member or function before the detailed
+ description
+
+ \par Note:
+ If both \c HIDE_UNDOC_MEMBERS and \c BRIEF_MEMBER_DESC are set to \c NO, the
+ brief descriptions will be completely suppressed.
+
+\anchor cfg_abbreviate_brief
+<dt>\c ABBREVIATE_BRIEF <dd>
+ \addindex ABBREVIATE_BRIEF
+ This tag implements a quasi-intelligent brief description abbreviator
+ that is used to form the text in various listings. Each string
+ in this list, if found as the leading text of the brief description, will be
+ stripped from the text and the result after processing the whole list, is used
+ as the annotated text. Otherwise, the brief description is used as-is. If left
+ blank, the following values are used ("\$name" is automatically replaced with the
+ name of the entity): "The $name class" "The $name widget" "The $name file"
+ "is" "provides" "specifies" "contains" "represents" "a" "an" "the".
+
+\anchor cfg_always_detailed_sec
+<dt>\c ALWAYS_DETAILED_SEC <dd>
+ \addindex ALWAYS_DETAILED_SEC
+ If the \c ALWAYS_DETAILED_SEC and \c REPEAT_BRIEF tags are both set to \c YES then
+ doxygen will generate a detailed section even if there is only a brief
+ description.
+
+\anchor cfg_inline_inherited_memb
+<dt>\c INLINE_INHERITED_MEMB <dd>
+\addindex INLINE_INHERITED_MEMB
+ If the \c INLINE_INHERITED_MEMB tag is set to \c YES, doxygen will show all inherited
+ members of a class in the documentation of that class as if those members were
+ ordinary class members. Constructors, destructors and assignment operators of
+ the base classes will not be shown.
+
+\anchor cfg_full_path_names
+<dt>\c FULL_PATH_NAMES <dd>
+ \addindex FULL_PATH_NAMES
+ If the \c FULL_PATH_NAMES tag is set to \c YES doxygen will prepend the full
+ path before files name in the file list and in the header files. If set
+ to NO the shortest path that makes the file name unique will be used
+
+\anchor cfg_strip_from_path
+<dt>\c STRIP_FROM_PATH <dd>
+ \addindex STRIP_FROM_PATH
+ If the \c FULL_PATH_NAMES tag is set to \c YES then the \c STRIP_FROM_PATH tag
+ can be used to strip a user-defined part of the path. Stripping is
+ only done if one of the specified strings matches the left-hand part of the
+ path. The tag can be used to show relative paths in the file list.
+ If left blank the directory from which doxygen is run is used as the
+ path to strip.
+
+\anchor cfg_strip_from_inc_path
+<dt>\c STRIP_FROM_INC_PATH <dd>
+ \addindex STRIP_FROM_INC_PATH
+ The \c STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+ the path mentioned in the documentation of a class, which tells
+ the reader which header file to include in order to use a class.
+ If left blank only the name of the header file containing the class
+ definition is used. Otherwise one should specify the include paths that
+ are normally passed to the compiler using the -I flag.
+
+\anchor cfg_short_names
+<dt>\c SHORT_NAMES <dd>
+ \addindex SHORT_NAMES
+ If the \c SHORT_NAMES tag is set to \c YES, doxygen will generate much shorter
+ (but less readable) file names. This can be useful is your file systems
+ doesn't support long names like on DOS, Mac, or CD-ROM.
+
+\anchor cfg_javadoc_autobrief
+<dt>\c JAVADOC_AUTOBRIEF <dd>
+ \addindex JAVADOC_AUTOBRIEF
+ If the \c JAVADOC_AUTOBRIEF is set to \c YES then doxygen
+ will interpret the first line (until the first dot) of a JavaDoc-style
+ comment as the brief description. If set to NO (the default), the
+ Javadoc-style will behave just like regular Qt-style comments
+ (thus requiring an explicit \@brief command for a brief description.)
+
+\anchor cfg_qt_autobrief
+<dt>\c QT_AUTOBRIEF <dd>
+ \addindex QT_AUTOBRIEF
+ If the \c QT_AUTOBRIEF is set to \c YES then doxygen
+ will interpret the first line (until the first dot) of a Qt-style
+ comment as the brief description. If set to NO (the default), the
+ Qt-style will behave just like regular Qt-style comments (thus
+ requiring an explicit \\brief command for a brief description.)
+
+\anchor cfg_builtin_stl_support
+<dt>\c BUILTIN_STL_SUPPORT <dd>
+ \addindex BUILTIN_STL_SUPPORT
+ If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+ include (a tag file for) the STL sources as input, then you should
+ set this tag to \c YES in order to let doxygen match functions declarations and
+ definitions whose arguments contain STL classes (e.g. func(std::string); versus
+ func(std::string) {}). This also make the inheritance and collaboration
+ diagrams that involve STL classes more complete and accurate.
+
+\anchor cfg_cpp_cli_support
+<dt>\c CPP_CLI_SUPPORT <dd>
+ \addindex CPP_CLI_SUPPORT
+ If you use Microsoft's C++/CLI language, you should set this option to YES to
+ enable parsing support.
+
+\anchor cfg_sip_support
+<dt>\c SIP_SUPPORT <dd>
+ \addindex OPTIMIZE_OUTPUT_SIP
+ Set the SIP_SUPPORT tag to YES if your project consists
+ of <a href="http://www.riverbankcomputing.co.uk/sip/">sip</a> sources only.
+ Doxygen will parse them like normal C++ but will assume all classes use public
+ instead of private inheritance when no explicit protection keyword is present.
+
+\anchor cfg_idl_property_support
+<dt>\c IDL_PROPERTY_SUPPORT <dd>
+ \addindex IDL_PROPERTY_SUPPORT
+ For Microsoft's IDL there are propget and propput attributes to indicate getter
+ and setter methods for a property. Setting this option to \c YES (the default)
+ will make doxygen to replace the get and set methods by a property in the
+ documentation. This will only work if the methods are indeed getting or
+ setting a simple type. If this is not the case, or you want to show the
+ methods anyway, you should set this option to \c NO.
+
+\anchor cfg_distribute_group_doc
+<dt>\c DISTRIBUTE_GROUP_DOC <dd>
+ \addindex DISTRIBUTE_GROUP_DOC
+ If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+ tag is set to YES, then doxygen will reuse the documentation of the first
+ member in the group (if any) for the other members of the group. By default
+ all members of a group must be documented explicitly.
+
+\anchor cfg_multiline_cpp_is_brief
+<dt>\c MULTILINE_CPP_IS_BRIEF <dd>
+ \addindex MULTILINE_CPP_IS_BRIEF
+ The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+ treat a multi-line C++ special comment block (i.e. a block of //! or ///
+ comments) as a brief description. This used to be the default behavior.
+ The new default is to treat a multi-line C++ comment block as a detailed
+ description. Set this tag to YES if you prefer the old behavior instead.
+ Note that setting this tag to YES also means that rational rose comments
+ are not recognized any more.
+
+<!--
+\anchor cfg_details_at_top
+<dt>\c DETAILS_AT_TOP <dd>
+ \addindex DETAILS_AT_TOP
+ If the DETAILS_AT_TOP tag is set to YES then Doxygen
+ will output the detailed description near the top, like JavaDoc.
+ If set to NO, the detailed description appears after the member
+ documentation.
+-->
+
+\anchor cfg_inherit_docs
+<dt>\c INHERIT_DOCS <dd>
+ \addindex INHERIT_DOCS
+ If the \c INHERIT_DOCS tag is set to \c YES (the default) then an undocumented
+ member inherits the documentation from any documented member that it
+ re-implements.
+
+\anchor cfg_separate_member_pages
+<dt>\c SEPARATE_MEMBER_PAGES <dd>
+ \addindex SEPARATE_MEMBER_PAGES
+ If the \c SEPARATE_MEMBER_PAGES tag is set to \c YES, then doxygen will produce
+ a new page for each member. If set to \c NO, the documentation of a member will
+ be part of the file/class/namespace that contains it.
+
+\anchor cfg_tab_size
+<dt>\c TAB_SIZE <dd>
+ \addindex TAB_SIZE
+ the \c TAB_SIZE tag can be used to set the number of spaces in a tab.
+ Doxygen uses this value to replace tabs by spaces in code fragments.
+
+\anchor cfg_aliases
+<dt>\c ALIASES <dd>
+ \addindex ALIASES
+ This tag can be used to specify a number of aliases that acts
+ as commands in the documentation. An alias has the form
+\verbatim
+ name=value
+\endverbatim
+ For example adding
+\verbatim
+ "sideeffect=\par Side Effects:\n"
+\endverbatim
+ will allow you to
+ put the command \\sideeffect (or \@sideeffect) in the documentation, which
+ will result in a user-defined paragraph with heading "Side Effects:".
+ You can put \\n's in the value part of an alias to insert newlines.
+
+\anchor cfg_optimize_output_for_c
+<dt>\c OPTIMIZE_OUTPUT_FOR_C <dd>
+ \addindex OPTIMIZE_OUTPUT_FOR_C
+ Set the \c OPTIMIZE_OUTPUT_FOR_C tag to \c YES if your project consists
+ of C sources only. Doxygen will then generate output that is more tailored
+ for C. For instance, some of the names that are used will be different.
+ The list of all members will be omitted, etc.
+
+\anchor cfg_optimize_output_java
+<dt>\c OPTIMIZE_OUTPUT_JAVA <dd>
+ \addindex OPTIMIZE_OUTPUT_JAVA
+ Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+ Python sources only. Doxygen will then generate output that is more tailored
+ for that language. For instance, namespaces will be presented as packages,
+ qualified scopes will look different, etc.
+
+\anchor cfg_optimize_for_fortran
+<dt>\c OPTIMIZE_FOR_FORTRAN <dd>
+ \addindex OPTIMIZE_FOR_FORTRAN
+ Set the \c OPTIMIZE_FOR_FORTRAN tag to \c YES if your project consists of Fortran
+ sources. Doxygen will then generate output that is tailored for Fortran.
+
+\anchor cfg_optimize_output_vhdl
+<dt>\c OPTIMIZE_OUTPUT_VHDL <dd>
+ \addindex OPTIMIZE_OUTPUT_VHDL
+ Set the \c OPTIMIZE_OUTPUT_VHDL tag to \c YES if your project consists of VHDL
+ sources. Doxygen will then generate output that is tailored for VHDL.
+
+\anchor cfg_extension_mapping
+<dt>\c EXTENSION_MAPPING <dd>
+ \addindex EXTENSION_MAPPING
+ Doxygen selects the parser to use depending on the extension of the files it parses.
+ With this tag you can assign which parser to use for a given extension.
+ Doxygen has a built-in mapping, but you can override or extend it using this tag.
+ The format is ext=language, where ext is a file extension, and language is one of
+ the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
+ Objective-C, Python, Fortran, VHDL. For instance to make doxygen treat
+ .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
+ use: inc=Fortran f=C
+
+\anchor cfg_subgrouping
+<dt>\c SUBGROUPING <dd>
+ \addindex SUBGROUPING
+ Set the \c SUBGROUPING tag to \c YES (the default) to allow class member groups of
+ the same type (for instance a group of public functions) to be put as a
+ subgroup of that type (e.g. under the Public Functions section). Set it to
+ \c NO to prevent subgrouping. Alternatively, this can be done per class using
+ the \ref cmdnosubgrouping "\\nosubgrouping" command.
+
+\anchor cfg_inline_grouped_classes
+<dt>\c INLINE_GROUPED_CLASSES <dd>
+ \addindex INLINE_GROUPED_CLASSES
+When the \c INLINE_GROUPED_CLASSES tag is set to \c YES, classes, structs and
+unions are shown inside the group in which they are included
+(e.g. using @@ingroup) instead of on a separate page (for HTML and Man pages)
+or section (for LaTeX and RTF). Note that this feature does not work in
+combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
+
+\anchor cfg_typedef_hides_struct
+<dt>\c TYPEDEF_HIDES_STRUCT <dd>
+ \addindex TYPEDEF_HIDES_STRUCT
+ When \c TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+ is documented as struct, union, or enum with the name of the typedef. So
+ <code>typedef struct TypeS {} TypeT</code>, will appear in the documentation as a struct
+ with name \c TypeT. When disabled the typedef will appear as a member of a file,
+ namespace, or class. And the struct will be named \c TypeS. This can typically
+ be useful for C code in case the coding convention dictates that all compound
+ types are typedef'ed and only the typedef is referenced, never the tag name.
+
+\anchor cfg_symbol_cache_size
+<dt>\c SYMBOL_CACHE_SIZE <dd>
+ \addindex SYMBOL_CACHE_SIZE
+ The \c SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+ determine which symbols to keep in memory and which to flush to disk.
+ When the cache is full, less often used symbols will be written to disk.
+ For small to medium size projects (<1000 input files) the default value is
+ probably good enough. For larger projects a too small cache size can cause
+ doxygen to be busy swapping symbols to and from disk most of the time
+ causing a significant performance penalty.
+ If the system has enough physical memory increasing the cache will improve the
+ performance by keeping more symbols in memory. Note that the value works on
+ a logarithmic scale so increasing the size by one will roughly double the
+ memory usage. The cache size is given by this formula:
+ \f$2^{(16+\mbox{SYMBOL\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0,
+ corresponding to a cache size of \f$2^{16} = 65536\f$ symbols.
+
+</dl>
+
+\section config_build Build related options
+\anchor cfg_extract_all
+<dl>
+
+<dt>\c EXTRACT_ALL <dd>
+ \addindex EXTRACT_ALL
+ If the \c EXTRACT_ALL tag is set to \c YES doxygen will assume all
+ entities in documentation are documented, even if no documentation was
+ available. Private class members and static file members will be hidden
+ unless the \c EXTRACT_PRIVATE and \c EXTRACT_STATIC tags are set to \c YES
+
+ \par Note:
+ This will also disable the warnings about undocumented members
+ that are normally produced when \c WARNINGS is set to \c YES
+
+\anchor cfg_extract_private
+<dt>\c EXTRACT_PRIVATE <dd>
+ \addindex EXTRACT_PRIVATE
+ If the \c EXTRACT_PRIVATE tag is set to \c YES all private members of a
+ class will be included in the documentation.
+
+\anchor cfg_extract_static
+<dt>\c EXTRACT_STATIC <dd>
+ \addindex EXTRACT_STATIC
+ If the \c EXTRACT_STATIC tag is set to \c YES all static members of a file
+ will be included in the documentation.
+
+\anchor cfg_extract_local_classes
+<dt>\c EXTRACT_LOCAL_CLASSES <dd>
+ \addindex EXTRACT_LOCAL_CLASSES
+ If the \c EXTRACT_LOCAL_CLASSES tag is set to \c YES classes (and structs)
+ defined locally in source files will be included in the documentation.
+ If set to NO only classes defined in header files are included. Does not
+ have any effect for Java sources.
+
+\anchor cfg_extract_anon_nspaces
+<dt>\c EXTRACT_ANON_NSPACES <dd>
+ \addindex EXTRACT_ANON_NSPACES
+ If this flag is set to YES, the members of anonymous namespaces will be extracted
+ and appear in the documentation as a namespace called 'anonymous_namespace{file}',
+ where file will be replaced with the base name of the file that contains the anonymous
+ namespace. By default anonymous namespace are hidden.
+
+\anchor cfg_extract_local_methods
+<dt>\c EXTRACT_LOCAL_METHODS <dd>
+ \addindex EXTRACT_LOCAL_METHODS
+ This flag is only useful for Objective-C code. When set to \c YES local
+ methods, which are defined in the implementation section but not in
+ the interface are included in the documentation.
+ If set to \c NO (the default) only methods in the interface are included.
+
+\anchor cfg_hide_undoc_members
+<dt>\c HIDE_UNDOC_MEMBERS <dd>
+ \addindex HIDE_UNDOC_MEMBERS
+ If the \c HIDE_UNDOC_MEMBERS tag is set to \c YES, doxygen will hide all
+ undocumented members inside documented classes or files.
+ If set to \c NO (the default) these members will be included in the
+ various overviews, but no documentation section is generated.
+ This option has no effect if \c EXTRACT_ALL is enabled.
+
+\anchor cfg_hide_undoc_classes
+<dt>\c HIDE_UNDOC_CLASSES <dd>
+ \addindex HIDE_UNDOC_CLASSES
+ If the \c HIDE_UNDOC_CLASSESS tag is set to \c YES, doxygen will hide all
+ undocumented classes.
+ If set to \c NO (the default) these classes will be included in the
+ various overviews.
+ This option has no effect if \c EXTRACT_ALL is enabled.
+
+\anchor cfg_hide_friend_compounds
+<dt>\c HIDE_FRIEND_COMPOUNDS <dd>
+ \addindex HIDE_FRIEND_COMPOUNDS
+ If the \c HIDE_FRIEND_COMPOUNDS tag is set to \c YES, Doxygen will hide all
+ friend (class|struct|union) declarations.
+ If set to \c NO (the default) these declarations will be included in the
+ documentation.
+
+\anchor cfg_hide_in_body_docs
+<dt>\c HIDE_IN_BODY_DOCS <dd>
+ \addindex HIDE_IN_BODY_DOCS
+If the \c HIDE_IN_BODY_DOCS tag is set to \c YES, Doxygen will hide any
+documentation blocks found inside the body of a function.
+If set to \c NO (the default) these blocks will be appended to the
+function's detailed documentation block.
+
+\anchor cfg_internal_docs
+<dt>\c INTERNAL_DOCS <dd>
+ \addindex INTERNAL_DOCS
+ The \c INTERNAL_DOCS tag determines if documentation
+ that is typed after a \ref cmdinternal "\\internal" command is included. If the tag is set
+ to \c NO (the default) then the documentation will be excluded.
+ Set it to \c YES to include the internal documentation.
+
+\anchor cfg_case_sense_names
+<dt>\c CASE_SENSE_NAMES <dd>
+ \addindex CASE_SENSE_NAMES
+ If the \c CASE_SENSE_NAMES tag is set to \c NO then doxygen
+ will only generate file names in lower-case letters. If set to
+ \c YES upper-case letters are also allowed. This is useful if you have
+ classes or files whose names only differ in case and if your file system
+ supports case sensitive file names. Windows users are advised to set this
+ option to NO.
+
+\anchor cfg_hide_scope_names
+<dt>\c HIDE_SCOPE_NAMES <dd>
+ \addindex HIDE_SCOPE_NAMES
+ If the \c HIDE_SCOPE_NAMES tag is set to \c NO (the default) then doxygen
+ will show members with their full class and namespace scopes in the
+ documentation. If set to \c YES the scope will be hidden.
+
+\anchor cfg_show_include_files
+<dt>\c SHOW_INCLUDE_FILES <dd>
+ \addindex SHOW_INCLUDE_FILES
+ If the SHOW_INCLUDE_FILES tag is set to \c YES (the default) then doxygen
+ will put a list of the files that are included by a file in the documentation
+ of that file.
+
+\anchor cfg_force_local_includes
+<dt>\c FORCE_LOCAL_INCLUDES <dd>
+ \addindex FORCE_LOCAL_INCLUDES
+ If the \c FORCE_LOCAL_INCLUDES tag is set to \c YES then Doxygen
+ will list include files with double quotes in the documentation
+ rather than with sharp brackets.
+
+\anchor cfg_inline_info
+<dt>\c INLINE_INFO <dd>
+ \addindex INLINE_INFO
+ If the \c INLINE_INFO tag is set to \c YES (the default) then a tag [inline]
+ is inserted in the documentation for inline members.
+
+\anchor cfg_sort_member_docs
+<dt>\c SORT_MEMBER_DOCS <dd>
+ \addindex SORT_MEMBER_DOCS
+ If the \c SORT_MEMBER_DOCS tag is set to \c YES (the default) then doxygen
+ will sort the (detailed) documentation of file and class members
+ alphabetically by member name. If set to \c NO the members will appear in
+ declaration order.
+
+\anchor cfg_sort_brief_docs
+<dt>\c SORT_BRIEF_DOCS <dd>
+ \addindex SORT_BRIEF_DOCS
+ If the \c SORT_BRIEF_DOCS tag is set to \c YES then doxygen will sort the
+ brief descriptions of file, namespace and class members alphabetically
+ by member name. If set to \c NO (the default) the members will appear in
+ declaration order.
+
+
+\anchor cfg_sort_group_names
+<dt>\c SORT_GROUP_NAMES <dd>
+ \addindex SORT_GROUP_NAMES
+ If the \c SORT_GROUP_NAMES tag is set to \c YES then doxygen will sort the
+ hierarchy of group names into alphabetical order. If set to \c NO (the default)
+ the group names will appear in their defined order.
+
+\anchor cfg_sort_by_scope_name
+<dt>\c SORT_BY_SCOPE_NAME <dd>
+ \addindex SORT_BY_SCOPE_NAME
+ If the \c SORT_BY_SCOPE_NAME tag is set to \c YES, the class list will be
+ sorted by fully-qualified names, including namespaces. If set to
+ NO (the default), the class list will be sorted only by class name,
+ not including the namespace part.
+ @note This option is not very useful if \c HIDE_SCOPE_NAMES is set to \c YES.
+ @note This option applies only to the class list, not to the
+ alphabetical list.
+
+\anchor cfg_sort_members_constructors_first
+<dt>\c SORT_MEMBERS_CTORS_1ST <dd>
+ \addindex SORT_MEMBERS_CTORS_1ST
+ If the \c SORT_MEMBERS_CTORS_1ST tag is set to \c YES then doxygen
+ will sort the (brief and detailed) documentation of class members so that
+ constructors and destructors are listed first. If set to NO (the default)
+ the constructors will appear in the respective orders defined by
+ \c SORT_MEMBER_DOCS and \c SORT_BRIEF_DOCS.
+ @note If \c SORT_BRIEF_DOCS is set to \c NO this option is ignored for
+ sorting brief member documentation.
+ @note If \c SORT_MEMBER_DOCS is set to \c NO this option is ignored for
+ sorting detailed member documentation.
+
+\anchor cfg_generate_deprecatedlist
+<dt>\c GENERATE_DEPRECATEDLIST <dd>
+ \addindex GENERATE_DEPRECATEDLIST
+ The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+ disable (NO) the deprecated list. This list is created by
+ putting \ref cmddeprecated "\\deprecated"
+ commands in the documentation.
+
+\anchor cfg_strict_proto_matching
+<dt>\c STRICT_PROTO_MATCHING <dd>
+ \addindex STRICT_PROTO_MATCHING
+ If the \c STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+ do proper type resolution of all parameters of a function it will reject a
+ match between the prototype and the implementation of a member function even
+ if there is only one candidate or it is obvious which candidate to choose
+ by doing a simple string match. By disabling \c STRICT_PROTO_MATCHING doxygen
+ will still accept a match between prototype and implementation in such cases.
+
+\anchor cfg_generate_todolist
+<dt>\c GENERATE_TODOLIST <dd>
+ \addindex GENERATE_TODOLIST
+ The GENERATE_TODOLIST tag can be used to enable (YES) or
+ disable (NO) the todo list. This list is created by
+ putting \ref cmdtodo "\\todo"
+ commands in the documentation.
+
+\anchor cfg_generate_testlist
+<dt>\c GENERATE_TESTLIST <dd>
+ \addindex GENERATE_TESTLIST
+ The GENERATE_TESTLIST tag can be used to enable (YES) or
+ disable (NO) the test list. This list is created by
+ putting \ref cmdtest "\\test" commands in the documentation.
+
+\anchor cfg_generate_buglist
+<dt>\c GENERATE_BUGLIST <dd>
+ \addindex GENERATE_BUGLIST
+ The GENERATE_BUGLIST tag can be used to enable (YES) or
+ disable (NO) the bug list. This list is created by
+ putting \ref cmdbug "\\bug" commands in the documentation.
+
+\anchor cfg_enabled_sections
+<dt>\c ENABLED_SECTIONS <dd>
+ \addindex ENABLED_SECTIONS
+ The \c ENABLED_SECTIONS tag can be used to enable conditional
+ documentation sections, marked by \ref cmdif "\\if" \<section-label\> ...
+ \ref cmdendif "\\endif" and \ref cmdcond "\\cond" \<section-label\> ...
+ \ref cmdendcond "\\endcond" blocks.
+
+\anchor cfg_max_initializer_lines
+<dt>\c MAX_INITIALIZER_LINES <dd>
+ \addindex MAX_INITIALIZER_LINES
+ The \c MAX_INITIALIZER_LINES tag determines the maximum number of lines
+ that the initial value of a variable or define can be. If the initializer
+ consists of more lines than specified here it will be hidden. Use a value
+ of 0 to hide initializers completely. The appearance of the value of
+ individual variables and defines can be controlled using \ref cmdshowinitializer "\\showinitializer"
+ or \ref cmdhideinitializer "\\hideinitializer" command in the documentation.
+
+\anchor cfg_show_used_files
+<dt>\c SHOW_USED_FILES <dd>
+ \addindex SHOW_USED_FILES
+ Set the \c SHOW_USED_FILES tag to \c NO to disable the list of files generated
+ at the bottom of the documentation of classes and structs. If set to \c YES the
+ list will mention the files that were used to generate the documentation.
+
+\anchor cfg_show_dirs
+<dt>\c SHOW_DIRECTORIES <dd>
+ \addindex SHOW_DIRECTORIES
+ If the sources in your project are distributed over multiple directories
+ then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+ in the documentation.
+
+\anchor cfg_show_files
+<dt>\c SHOW_FILES <dd>
+ \addindex SHOW_FILES
+ Set the \c SHOW_FILES tag to \c NO to disable the generation of the Files page.
+ This will remove the Files entry from the Quick Index and from the
+ Folder Tree View (if specified). The default is \c YES.
+
+\anchor cfg_show_namespaces
+<dt>\c SHOW_NAMESPACES <dd>
+ \addindex SHOW_NAMESPACES
+ Set the \c SHOW_NAMESPACES tag to \c NO to disable the generation of the
+ Namespaces page. This will remove the Namespaces entry from the Quick Index
+ and from the Folder Tree View (if specified). The default is \c YES.
+
+\anchor cfg_file_version_filter
+<dt>\c FILE_VERSION_FILTER <dd>
+ \addindex FILE_VERSION_FILTER
+ The \c FILE_VERSION_FILTER tag can be used to specify a program or script that
+ doxygen should invoke to get the current version for each file (typically from the
+ version control system). Doxygen will invoke the program by executing (via
+ popen()) the command <code>command input-file</code>, where \c command is
+ the value of the \c FILE_VERSION_FILTER tag, and \c input-file is the name
+ of an input file provided by doxygen.
+ Whatever the program writes to standard output is used as the file version.
+
+Example of using a shell script as a filter for Unix:
+\verbatim
+ FILE_VERSION_FILTER = "/bin/sh versionfilter.sh"
+\endverbatim
+
+Example shell script for CVS:
+\verbatim
+#!/bin/sh
+cvs status $1 | sed -n 's/^[ \]*Working revision:[ \t]*\([0-9][0-9\.]*\).*/\1/p'
+\endverbatim
+
+Example shell script for Subversion:
+\verbatim
+#!/bin/sh
+svn stat -v $1 | sed -n 's/^[ A-Z?\*|!]\{1,15\}/r/;s/ \{1,15\}/\/r/;s/ .*//p'
+\endverbatim
+
+Example filter for ClearCase:
+\verbatim
+FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
+\endverbatim
+
+\anchor cfg_layout_file
+<dt>\c LAYOUT_FILE <dd>
+ The \c LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
+ doxygen. The layout file controls the global structure of the generated output files
+ in an output format independent way. The create the layout file that represents
+ doxygen's defaults, run doxygen with the -l option. You can optionally specify a
+ file name after the option, if omitted DoxygenLayout.xml will be used as the name
+ of the layout file. Note that if you run doxygen from a directory containing
+ a file called DoxygenLayout.xml, doxygen will parse it automatically even if
+ the \c LAYOUT_FILE tag is left empty.
+
+</dl>
+
+\section messages_input Options related to warning and progress messages
+\anchor cfg_quiet
+<dl>
+
+<dt>\c QUIET <dd>
+ \addindex QUIET
+ The \c QUIET tag can be used to turn on/off the messages that are generated
+ to standard output by doxygen. Possible values are \c YES and \c NO,
+ where \c YES implies that the messages are off.
+ If left blank \c NO is used.
+
+\anchor cfg_warnings
+<dt>\c WARNINGS <dd>
+ \addindex WARNINGS
+ The \c WARNINGS tag can be used to turn on/off the warning messages that are
+ generated to standard error by doxygen. Possible values are \c YES and \c NO,
+ where \c YES implies that the warnings are on. If left blank \c NO is used.
+
+ \b Tip: Turn warnings on while writing the documentation.
+
+\anchor cfg_warn_if_undocumented
+<dt>\c WARN_IF_UNDOCUMENTED <dd>
+ \addindex WARN_IF_UNDOCUMENTED
+ If \c WARN_IF_UNDOCUMENTED is set to \c YES, then doxygen will generate warnings
+ for undocumented members. If \c EXTRACT_ALL is set to \c YES then this flag will
+ automatically be disabled.
+
+\anchor cfg_warn_if_doc_error
+<dt>\c WARN_IF_DOC_ERROR <dd>
+ \addindex WARN_IF_DOC_ERROR
+ If \c WARN_IF_DOC_ERROR is set to \c YES, doxygen will generate warnings for
+ potential errors in the documentation, such as not documenting some
+ parameters in a documented function, or documenting parameters that
+ don't exist or using markup commands wrongly.
+
+\anchor cfg_warn_no_paramdoc
+<dt>\c WARN_NO_PARAMDOC <dd>
+ \addindex WARN_NO_PARAMDOC
+ This \c WARN_NO_PARAMDOC option can be enabled to get warnings for
+ functions that are documented, but have no documentation for their parameters
+ or return value. If set to \c NO (the default) doxygen will only warn about
+ wrong or incomplete parameter documentation, but not about the absence of
+ documentation.
+
+\anchor cfg_warn_format
+<dt>\c WARN_FORMAT <dd>
+ \addindex WARN_FORMAT
+ The \c WARN_FORMAT tag determines the format of the warning messages that
+ doxygen can produce. The string should contain the <code>\$file</code>,
+ <code>\$line</code>, and <code>\$text</code>
+ tags, which will be replaced by the file and line number from which the
+ warning originated and the warning text.
+
+\anchor cfg_warn_logfile
+<dt>\c WARN_LOGFILE <dd>
+ \addindex WARN_LOGFILE
+ The \c WARN_LOGFILE tag can be used to specify a file to which warning
+ and error messages should be written. If left blank the output is written
+ to stderr.
+
+</dl>
+
+\section config_input Input related options
+\anchor cfg_input
+<dl>
+
+<dt>\c INPUT <dd>
+ \addindex INPUT
+ The \c INPUT tag is used to specify the files and/or directories that contain
+ documented source files. You may enter file names like
+ \c myfile.cpp or directories like \c /usr/src/myproject.
+ Separate the files or directories with spaces.<br>
+
+ \b Note:
+ If this tag is empty the current directory is searched.
+
+\anchor cfg_input_encoding
+<dt>\c INPUT_ENCODING <dd>
+ \addindex INPUT_ENCODING
+ This tag can be used to specify the character encoding of the source files that
+ doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default
+ input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding.
+ See <a href="http://www.gnu.org/software/libiconv">the libiconv documentation</a> for
+ the list of possible encodings.
+
+\anchor cfg_file_patterns
+<dt>\c FILE_PATTERNS <dd>
+ \addindex FILE_PATTERNS
+ If the value of the \c INPUT tag contains directories, you can use the
+ \c FILE_PATTERNS tag to specify one or more wildcard patterns
+ (like \c *.cpp and \c *.h ) to filter out the source-files
+ in the directories. If left blank the following patterns are tested:
+ <code>
+ *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+ *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+ *.f90 *.f *.vhd *.vhdl
+ </code>
+
+\anchor cfg_recursive
+<dt>\c RECURSIVE <dd>
+ \addindex RECURSIVE
+ The \c RECURSIVE tag can be used to specify whether or not subdirectories
+ should be searched for input files as well. Possible values are \c YES
+ and \c NO. If left blank \c NO is used.
+
+\anchor cfg_exclude
+<dt>\c EXCLUDE <dd>
+ \addindex EXCLUDE
+ The \c EXCLUDE tag can be used to specify files and/or directories that should
+ excluded from the \c INPUT source files. This way you can easily exclude a
+ subdirectory from a directory tree whose root is specified with the \c INPUT tag.
+
+\anchor cfg_exclude_symlinks
+<dt>\c EXCLUDE_SYMLINKS <dd>
+ \addindex EXCLUDE_SYMLINKS
+ The \c EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
+ that are symbolic links (a Unix file system feature) are excluded from the input.
+
+\anchor cfg_exclude_patterns
+<dt>\c EXCLUDE_PATTERNS <dd>
+ \addindex EXCLUDE_PATTERNS
+ If the value of the \c INPUT tag contains directories, you can use the
+ \c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+ certain files from those directories.
+
+\anchor cfg_exclude_symbols
+<dt>\c EXCLUDE_SYMBOLS <dd>
+The \c EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+(namespaces, classes, functions, etc.) that should be excluded from the
+output. The symbol name can be a fully qualified name, a word, or if the
+wildcard * is used, a substring. Examples: ANamespace, AClass,
+AClass::ANamespace, ANamespace::*Test
+
+ Note that the wildcards are matched against the file with absolute path,
+ so to exclude all test directories use the pattern
+ <code>*</code><code>/test/</code><code>*</code>
+
+\anchor cfg_example_path
+<dt>\c EXAMPLE_PATH <dd>
+ \addindex EXAMPLE_PATH
+ The \c EXAMPLE_PATH tag can be used to specify one or more files or
+ directories that contain example code fragments that are included (see
+ the \\include command in section \ref cmdinclude "\\include").
+
+\anchor cfg_example_recursive
+<dt>\c EXAMPLE_RECURSIVE <dd>
+ \addindex EXAMPLE_RECURSIVE
+ If the \c EXAMPLE_RECURSIVE tag is set to \c YES then subdirectories will be
+ searched for input files to be used with the \\include or \\dontinclude
+ commands irrespective of the value of the \c RECURSIVE tag.
+ Possible values are \c YES and \c NO. If left blank \c NO is used.
+
+\anchor cfg_example_patterns
+<dt>\c EXAMPLE_PATTERNS <dd>
+ \addindex EXAMPLE_PATTERNS
+ If the value of the \c EXAMPLE_PATH tag contains directories, you can use the
+ \c EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+ and *.h) to filter out the source-files in the directories. If left
+ blank all files are included.
+
+\anchor cfg_image_path
+<dt>\c IMAGE_PATH <dd>
+ \addindex IMAGE_PATH
+ The \c IMAGE_PATH tag can be used to specify one or more files or
+ directories that contain images that are to be included in the
+ documentation (see the \ref cmdimage "\\image" command).
+
+\anchor cfg_input_filter
+<dt>\c INPUT_FILTER <dd>
+ \addindex INPUT_FILTER
+ The \c INPUT_FILTER tag can be used to specify a program that doxygen should
+ invoke to filter for each input file. Doxygen will invoke the filter program
+ by executing (via popen()) the command:
+\verbatim <filter> <input-file>
+\endverbatim
+
+ where \<filter\>
+ is the value of the \c INPUT_FILTER tag, and \<input-file\> is the name of an
+ input file. Doxygen will then use the output that the filter program writes
+ to standard output.
+
+\anchor cfg_filter_patterns
+<dt>\c FILTER_PATTERNS <dd>
+ \addindex FILTER_PATTERNS
+ The \c FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+ basis. Doxygen will compare the file name with each pattern and apply the
+ filter if there is a match. The filters are a list of the form:
+ pattern=filter (like <code>*.cpp=my_cpp_filter</code>). See \c INPUT_FILTER for further
+ info on how filters are used. If \c FILTER_PATTERNS is empty or if
+ non of the patterns match the file name, \c INPUT_FILTER is applied.
+
+\anchor cfg_filter_source_files
+<dt>\c FILTER_SOURCE_FILES <dd>
+ \addindex FILTER_SOURCE_FILES
+ If the \c FILTER_SOURCE_FILES tag is set to \c YES, the input filter (if set using
+ \ref cfg_input_filter "INPUT_FILTER" ) will also be used to filter the input
+ files that are used for producing the source files to browse
+ (i.e. when SOURCE_BROWSER is set to YES).
+
+\anchor cfg_filter_source_patterns
+<dt>\c FILTER_SOURCE_PATTERNS <dd>
+ \addindex FILTER_SOURCE_PATTERNS
+ The \c FILTER_SOURCE_PATTERNS tag can be used to specify source filters per
+ file pattern. A pattern will override the setting for \c FILTER_PATTERN (if any)
+ and it is also possible to disable source filtering for a specific pattern
+ using *.ext= (so without naming a filter). This option only has effect when
+ \c FILTER_SOURCE_FILES is enabled.
+
+</dl>
+
+\section sourcebrowser_index Source browsing related options
+\anchor cfg_source_browser
+<dl>
+
+<dt>\c SOURCE_BROWSER <dd>
+ \addindex SOURCE_BROWSER
+ If the \c SOURCE_BROWSER tag is set to \c YES then a list of source files will
+ be generated. Documented entities will be cross-referenced with these sources.
+ Note: To get rid of all source code in the generated output, make sure also
+ \c VERBATIM_HEADERS is set to NO.
+
+\anchor cfg_inline_sources
+<dt>\c INLINE_SOURCES <dd>
+ \addindex INLINE_SOURCES
+ Setting the \c INLINE_SOURCES tag to \c YES will include the body
+ of functions, classes and enums directly into the documentation.
+
+\anchor cfg_strip_code_comments
+<dt>\c STRIP_CODE_COMMENTS <dd>
+ \addindex STRIP_CODE_COMMENTS
+ Setting the \c STRIP_CODE_COMMENTS tag to \c YES (the default) will instruct
+ doxygen to hide any special comment blocks from generated source code
+ fragments. Normal C and C++ comments will always remain visible.
+
+\anchor cfg_referenced_by_relation
+<dt>\c REFERENCED_BY_RELATION <dd>
+ \addindex REFERENCED_BY_RELATION
+ If the \c REFERENCED_BY_RELATION tag is set to \c YES
+ then for each documented function all documented
+ functions referencing it will be listed.
+
+\anchor cfg_references_relation
+<dt>\c REFERENCES_RELATION <dd>
+ \addindex REFERENCES_RELATION
+ If the \c REFERENCES_RELATION tag is set to \c YES
+ then for each documented function all documented entities
+ called/used by that function will be listed.
+
+\anchor cfg_references_link_source
+<dt>\c REFERENCES_LINK_SOURCE <dd>
+ \addindex REFERENCES_LINK_SOURCE
+ If the \c REFERENCES_LINK_SOURCE tag is set to \c YES (the default)
+ and SOURCE_BROWSER tag is set to \c YES, then the hyperlinks from
+ functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+ link to the source code. Otherwise they will link to the documentation.
+
+\anchor cfg_verbatim_headers
+<dt>\c VERBATIM_HEADERS <dd>
+ \addindex VERBATIM_HEADERS
+ If the \c VERBATIM_HEADERS tag is set the \c YES (the default) then doxygen
+ will generate a verbatim copy of the header file for each class for
+ which an include is specified. Set to NO to disable this.
+ \sa Section \ref cmdclass "\\class".
+
+\anchor cfg_use_htags
+<dt>\c USE_HTAGS <dd>
+ \addindex USE_HTAGS
+ If the \c USE_HTAGS tag is set to \c YES then the references to source code
+ will point to the HTML generated by the htags(1) tool instead of doxygen
+ built-in source browser. The htags tool is part of GNU's global source
+ tagging system (see http://www.gnu.org/software/global/global.html).
+ To use it do the following:
+
+ -# Install the latest version of global (i.e. 4.8.6 or better)
+ -# Enable SOURCE_BROWSER and USE_HTAGS in the config file
+ -# Make sure the INPUT points to the root of the source tree
+ -# Run doxygen as normal
+
+ Doxygen will invoke htags (and that will in turn invoke gtags), so these tools
+ must be available from the command line (i.e. in the search path).
+
+ The result: instead of the source browser generated by doxygen, the links to
+ source code will now point to the output of htags.
+
+</dl>
+
+\section alphabetical_index Alphabetical index options
+\anchor cfg_alphabetical_index
+<dl>
+
+<dt>\c ALPHABETICAL_INDEX <dd>
+ \addindex ALPHABETICAL_INDEX
+ If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index
+ of all compounds will be generated. Enable this if the project contains
+ a lot of classes, structs, unions or interfaces.
+
+<dt>\c COLS_IN_ALPHA_INDEX <dd>
+ \anchor cfg_cols_in_alpha_index
+ \addindex COLS_IN_ALPHA_INDEX
+ If the alphabetical index is enabled
+ (see \c ALPHABETICAL_INDEX) then the \c COLS_IN_ALPHA_INDEX tag can be
+ used to specify the number of columns in which this list will be split (can be a number in the range [1..20])
+
+\anchor cfg_ignore_prefix
+<dt>\c IGNORE_PREFIX <dd>
+ \addindex IGNORE_PREFIX
+ In case all classes in a project start with a common prefix, all classes will
+ be put under the same header in the alphabetical index.
+ The \c IGNORE_PREFIX tag can be used to specify a prefix
+ (or a list of prefixes) that should be ignored while generating the index
+ headers.
+
+</dl>
+\section html_output HTML related options
+\anchor cfg_generate_html
+<dl>
+
+<dt>\c GENERATE_HTML <dd>
+ \addindex GENERATE_HTML
+ If the \c GENERATE_HTML tag is set to \c YES (the default) doxygen will
+ generate HTML output
+
+\anchor cfg_html_output
+<dt>\c HTML_OUTPUT <dd>
+ \addindex HTML_OUTPUT
+ The \c HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+ If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
+ put in front of it. If left blank `html' will be used as the default path.
+
+\anchor cfg_html_file_extension
+<dt>\c HTML_FILE_EXTENSION <dd>
+ \addindex HTML_FILE_EXTENSION
+ The \c HTML_FILE_EXTENSION tag can be used to specify the file extension for
+ each generated HTML page (for example: .htm, .php, .asp). If it is left blank
+ doxygen will generate files with .html extension.
+
+\anchor cfg_html_header
+<dt>\c HTML_HEADER <dd>
+ \addindex HTML_HEADER
+ The \c HTML_HEADER tag can be used to specify a user-defined HTML
+ header file for each generated HTML page.
+ If the tag is left blank doxygen will generate a
+ standard header.
+
+ To get valid HTML the header file that
+ includes any scripts and style sheets that doxygen
+ needs, it is highly recommended to start with a default header using
+\verbatim
+doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFile
+\endverbatim
+ and then modify the file \c new_header.html.
+
+ The following markers have a special meaning inside the header and footer:
+ <dl>
+ <dt><code>\$title</code><dd>will be replaced with the title of the page.
+ <dt><code>\$datetime</code><dd>will be replaced with current the date and time.
+ <dt><code>\$date</code><dd>will be replaced with the current date.
+ <dt><code>\$year</code><dd>will be replaces with the current year.
+ <dt><code>\$doxygenversion</code><dd>will be replaced with the version of doxygen
+ <dt><code>\$projectname</code><dd>will be replaced with the name of
+ the project (see \ref cfg_project_name "PROJECT_NAME")
+ <dt><code>\$projectnumber</code><dd>will be replaced with the project number
+ (see \ref cfg_project_number "PROJECT_NUMBER")
+ <dt><code>\$projectbrief</code><dd>will be replaced with the project brief
+ description (see \ref cfg_project_brief "PROJECT_BRIEF")
+ <dt><code>\$projectlogo</code><dd>will be replaced with the project logo
+ (see \ref cfg_project_logo "PROJECT_LOGO")
+ <dt><code>\$treeview</code><dd>will be replaced with links to
+ the javascript and style sheets needed for the navigation tree
+ (or an empty string when \ref cfg_generate_treeview "GENERATE_TREEVIEW"
+ is disabled).
+ <dt><code>\$search</code><dd>will be replaced with a links to
+ the javascript and style sheets needed for the search engine
+ (or an empty string when \ref cfg_searchengine "SEARCHENGINE"
+ is disabled).
+ <dt><code>\$mathjax</code><dd>will be replaced with a links to
+ the javascript and style sheets needed for the MathJax feature
+ (or an empty string when \ref cfg_use_mathjax "USE_MATHJAX" is disabled).
+ <dt><code>\$relpath\$</code><dd>
+ If \c CREATE_SUBDIRS is enabled, the command <code>\$relpath\$</code> can be
+ used to produce a relative path to the root of the HTML output directory,
+ e.g. use \$relpath\$doxygen.css, to refer to the standard style sheet.
+ </dl>
+
+ To cope with differences in the layout of the header and footer that depend on
+ configuration settings, the header can also contain special blocks that
+ will be copied to the output or skipped depending on the configuration.
+ Such blocks have the following form:
+\verbatim
+ <!--BEGIN BLOCKNAME-->
+ Some context copied when condition BLOCKNAME holds
+ <!--END BLOCKNAME-->
+ <!--BEGIN !BLOCKNAME-->
+ Some context copied when condition BLOCKNAME does not hold
+ <!--END !BLOCKNAME-->
+\endverbatim
+ The following block names are supported:
+ <dl>
+ <dt><code>DISABLE_INDEX</code><dd>Content within this block is copied to the output
+ when the \ref cfg_disable_index "DISABLE_INDEX" option is enabled (so when the index is disabled).
+ <dt><code>GENERATE_TREEVIEW</code><dd>Content within this block is copied to the output
+ when the \ref cfg_generate_treeview "GENERATE_TREEVIEW" option is enabled.
+ <dt><code>SEARCHENGINE</code><dd>Content within this block is copied to the output
+ when the \ref cfg_searchengine "SEARCHENGINE" option is enabled.
+ <dt><code>PROJECT_NAME</code><dd>Content within the block is copied to the output
+ when the \ref cfg_project_name "PROJECT_NAME" option is not empty.
+ <dt><code>PROJECT_NUMBER</code><dd>Content within the block is copied to the output
+ when the \ref cfg_project_number "PROJECT_NUMBER" option is not empty.
+ <dt><code>PROJECT_BRIEF</code><dd>Content within the block is copied to the output
+ when the \ref cfg_project_brief "PROJECT_BRIEF" option is not empty.
+ <dt><code>PROJECT_LOGO</code><dd>Content within the block is copied to the output
+ when the \ref cfg_project_logo "PROJECT_LOGO" option is not empty.
+ <dt><code>TITLEAREA</code><dd>Content within this block is copied to the output
+ when a title is visible at the top of each page. This is the case
+ if either \ref cfg_project_name "PROJECT_NAME",
+ \ref cfg_project_brief "PROJECT_BRIEF", \ref cfg_project_logo "PROJECT_LOGO"
+ is filled in or if both \ref cfg_disable_index "DISABLE_INDEX" and
+ \ref cfg_searchengine "SEARCHENGINE" are enabled.
+ </dl>
+
+ See also section \ref doxygen_usage for information on how to generate
+ the default header that doxygen normally uses.
+
+ @note The header is subject to change so you typically
+ have to regenerate the default header when upgrading to a newer version of
+ doxygen.
+
+\anchor cfg_html_footer
+<dt>\c HTML_FOOTER <dd>
+ \addindex HTML_FOOTER
+ The \c HTML_FOOTER tag can be used to specify a user-defined HTML footer for
+ each generated HTML page.
+ If the tag is left blank doxygen will generate a standard footer.
+
+ See \ref cfg_html_header "HTML_HEADER" for more information on
+ how to generate a default footer and what special commands can be
+ used inside the footer.
+
+ See also section \ref doxygen_usage for information on how to generate
+ the default footer that doxygen normally uses.
+
+\anchor cfg_html_stylesheet
+<dt>\c HTML_STYLESHEET <dd>
+ \addindex HTML_STYLESHEET
+ The \c HTML_STYLESHEET tag can be used to specify a user-defined cascading
+ style sheet that is used by each HTML page. It can be used to
+ fine-tune the look of the HTML output. If the tag is left blank doxygen
+ will generate a default style sheet.
+
+ See also section \ref doxygen_usage for information on how to generate
+ the style sheet that doxygen normally uses.
+
+\anchor cfg_html_extra_files
+<dt>\c HTML_EXTRA_FILES <dd>
+ \addindex HTML_EXTRA_FILES
+ The \c HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+ other source files which should be copied to the HTML output directory. Note
+ that these files will be copied to the base HTML output directory. Use the
+ $relpath$ marker in the \c HTML_HEADER and/or \c HTML_FOOTER files to load these
+ files. In the \c HTML_STYLESHEET file, use the file name only. Also note that
+ the files will be copied as-is; there are no commands or markers available.
+
+\anchor cfg_html_colorstyle_hue
+<dt>\c HTML_COLORSTYLE_HUE <dd>
+ \addindex HTML_COLOR_STYLE_HUE
+ The \c HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+ Doxygen will adjust the colors in the stylesheet and background images
+ according to this color. Hue is specified as an angle on a colorwheel,
+ see http://en.wikipedia.org/wiki/Hue for more information.
+ For instance the value 0 represents red, 60 is yellow, 120 is green,
+ 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+ The allowed range is 0 to 359.
+
+\anchor cfg_html_colorstyle_sat
+<dt>\c HTML_COLORSTYLE_SAT <dd>
+ \addindex HTML_COLORSTYLE_SAT
+ The \c HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+ the colors in the HTML output. For a value of 0 the output will use
+ grayscales only. A value of 255 will produce the most vivid colors.
+
+\anchor cfg_html_colorstyle_gamma
+<dt>\c HTML_COLORSTYLE_GAMMA <dd>
+ The \c HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+ the luminance component of the colors in the HTML output. Values below
+ 100 gradually make the output lighter, whereas values above 100 make
+ the output darker. The value divided by 100 is the actual gamma applied,
+ so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+ and 100 does not change the gamma.
+
+\anchor cfg_html_timestamp
+<dt>\c HTML_TIMESTAMP <dd>
+ \addindex HTML_TIMESTAMP
+ If the \c HTML_TIMESTAMP tag is set to \c YES then the footer of
+ each generated HTML page will contain the date and time when the page
+ was generated. Setting this to NO can help when comparing the output of
+ multiple runs.
+
+\anchor cfg_html_align_members
+<dt>\c HTML_ALIGN_MEMBERS <dd>
+ \addindex HTML_ALIGN_MEMBERS
+ If the \c HTML_ALIGN_MEMBERS tag is set to \c YES, the members of classes,
+ files or namespaces will be aligned in HTML using tables. If set to
+ \c NO a bullet list will be used.
+
+ <b>Note:</b>
+ Setting this tag to \c NO will become obsolete in the future, since I only
+ intent to support and test the aligned representation.
+
+\anchor cfg_html_dynamic_sections
+<dt>\c HTML_DYNAMIC_SECTIONS <dd>
+ \addindex HTML_DYNAMIC_SECTIONS
+ If the \c HTML_DYNAMIC_SECTIONS tag is set to \c YES then the generated HTML
+ documentation will contain sections that can be hidden and shown after the
+ page has loaded. For this to work a browser that supports
+ JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+ Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+\anchor cfg_generate_docset
+<dt>\c GENERATE_DOCSET <dd>
+ \addindex GENERATE_DOCSET
+ If the \c GENERATE_DOCSET tag is set to \c YES, additional index files
+ will be generated that can be used as input for
+ <a href="http://developer.apple.com/tools/xcode/">Apple's Xcode 3
+ integrated development environment</a>, introduced with OSX 10.5 (Leopard).
+ To create a documentation set, doxygen will generate a Makefile in the
+ HTML output directory. Running \c make will produce the docset in that
+ directory and running <code>make install</code> will install the docset in
+ <code>~/Library/Developer/Shared/Documentation/DocSets</code>
+ so that Xcode will find it at startup. See
+ <a href="http://developer.apple.com/tools/creatingdocsetswithdoxygen.html">
+ this article</a> for more information.
+
+\anchor cfg_docset_feedname
+<dt>\c DOCSET_FEEDNAME <dd>
+ \addindex DOCSET_FEEDNAME
+ When \c GENERATE_DOCSET tag is set to \c YES, this tag determines the name of the
+ feed. A documentation feed provides an umbrella under which multiple
+ documentation sets from a single provider (such as a company or product suite)
+ can be grouped.
+
+\anchor cfg_docset_bundle_id
+<dt>\c DOCSET_BUNDLE_ID <dd>
+ When \c GENERATE_DOCSET tag is set to \c YES, this tag specifies a string that
+ should uniquely identify the documentation set bundle. This should be a
+ reverse domain-name style string, e.g. <code>com.mycompany.MyDocSet</code>.
+ Doxygen will append <code>.docset</code> to the name.
+
+\anchor cfg_docset_publisher_id
+<dt>\c DOCSET_PUBLISHER_ID <dd>
+When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+the documentation publisher. This should be a reverse domain-name style
+string, e.g. com.mycompany.MyDocSet.documentation.
+
+\anchor cfg_docset_publisher_name
+<dt>\c DOCSET_PUBLISHER_NAME <dd>
+The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+\anchor cfg_generate_htmlhelp
+<dt>\c GENERATE_HTMLHELP <dd>
+ \addindex GENERATE_HTMLHELP
+ If the \c GENERATE_HTMLHELP tag is set to \c YES then
+ doxygen generates three additional HTML index files:
+ \c index.hhp, \c index.hhc, and \c index.hhk. The \c index.hhp is a
+ project file that can be read by
+ <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconHH1Start.asp">
+ Microsoft's HTML Help Workshop</a>
+ on Windows.
+
+ The HTML Help Workshop contains a compiler that can convert all HTML output
+ generated by doxygen into a single compiled HTML file (.chm). Compiled
+ HTML files are now used as the Windows 98 help format, and will replace
+ the old Windows help format (.hlp) on all Windows platforms in the future.
+ Compressed HTML files also contain an index, a table of contents,
+ and you can search for words in the documentation.
+ The HTML workshop also contains a viewer for compressed HTML files.
+
+\anchor cfg_chm_file
+<dt>\c CHM_FILE <dd>
+ \addindex CHM_FILE
+ If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c CHM_FILE tag can
+ be used to specify the file name of the resulting .chm file. You
+ can add a path in front of the file if the result should not be
+ written to the html output directory.
+
+\anchor cfg_hhc_location
+<dt>\c HHC_LOCATION <dd>
+ \addindex HHC_LOCATION
+ If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c HHC_LOCATION tag can
+ be used to specify the location (absolute path including file name) of
+ the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+ the HTML help compiler on the generated index.hhp.
+
+\anchor cfg_generate_chi
+<dt>\c GENERATE_CHI <dd>
+ \addindex GENERATE_CHI
+ If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c GENERATE_CHI flag
+ controls if a separate .chi index file is generated (<code>YES</code>) or that
+ it should be included in the master .chm file (<code>NO</code>).
+
+\anchor cfg_chm_index_encoding
+<dt>\c CHM_INDEX_ENCODING <dd>
+ \addindex CHM_INDEX_ENCODING
+ If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c CHM_INDEX_ENCODING
+ is used to encode HtmlHelp index (hhk), content (hhc) and project file
+ content.
+
+\anchor cfg_binary_toc
+<dt>\c BINARY_TOC <dd>
+ \addindex BINARY_TOC
+ If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c BINARY_TOC flag
+ controls whether a binary table of contents is generated (<code>YES</code>) or a
+ normal table of contents (<code>NO</code>) in the .chm file.
+
+\anchor cfg_toc_expand
+<dt>\c TOC_EXPAND <dd>
+ \addindex TOC_EXPAND
+ The \c TOC_EXPAND flag can be set to YES to add extra items for
+ group members to the table of contents of the HTML help documentation
+ and to the tree view.
+
+\anchor cfg_generate_qhp
+<dt>\c GENERATE_QHP <dd>
+ \addindex GENERATE_QHP
+ If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE
+ and QHP_VIRTUAL_FOLDER are set, an additional index file will
+ be generated that can be used as input for Qt's qhelpgenerator
+ to generate a Qt Compressed Help (.qch) of the generated HTML
+ documentation.
+
+\anchor cfg_qch_file
+<dt>\c QCH_FILE <dd>
+ \addindex QCH_FILE
+ If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+ be used to specify the file name of the resulting .qch file.
+ The path specified is relative to the HTML output folder.
+
+\anchor cfg_qhp_namespace
+<dt>\c QHP_NAMESPACE <dd>
+ \addindex QHP_NAMESPACE
+ The QHP_NAMESPACE tag specifies the namespace to use when generating
+ Qt Help Project output. For more information please see
+ <a href="http://doc.trolltech.com/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
+
+\anchor cfg_qhp_virtual_folder
+<dt>\c QHP_VIRTUAL_FOLDER <dd>
+ \addindex QHP_VIRTUAL_FOLDER
+ The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when
+ generating Qt Help Project output. For more information please see
+ <a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
+
+\anchor cfg_qhp_cust_filter_name
+<dt>\c QHP_CUST_FILTER_NAME <dd>
+ \addindex QHP_CUST_FILTER_NAME
+ If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. For more information please see
+ <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+\anchor cfg_qhp_cust_filter_attrs
+<dt>\c QHP_CUST_FILTER_ATTRS <dd>
+ \addindex QHP_CUST_FILTER_ATTRS
+ The QHP_CUST_FILTER_ATTRIBUTES tag specifies the list of the attributes of the custom filter to add.
+ For more information please see
+ <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+\anchor cfg_qhp_sect_filter_attrs
+<dt>\c QHP_SECT_FILTER_ATTRS <dd>
+ \addindex QHP_SECT_FILTER_ATTRS
+ The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's filter section matches.
+ <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+\anchor cfg_qhg_location
+<dt>\c QHG_LOCATION <dd>
+ \addindex QHG_LOCATION
+ If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+ be used to specify the location of Qt's qhelpgenerator.
+ If non-empty doxygen will try to run qhelpgenerator on the generated
+ .qhp file.
+
+\anchor cfg_generate_eclipsehelp
+<dt>\c GENERATE_ECLIPSEHELP <dd>
+ \addindex GENERATE_ECLIPSEHELP
+ If the \c GENERATE_ECLIPSEHELP tag is set to \c YES, additional index files
+ will be generated, which together with the HTML files, form an Eclipse help
+ plugin.
+
+ To install this plugin and make it available under the help contents
+ menu in Eclipse, the contents of the directory containing the HTML and XML
+ files needs to be copied into the plugins directory of eclipse. The name of
+ the directory within the plugins directory should be the same as
+ the \ref cfg_eclipse_doc_id "ECLIPSE_DOC_ID" value.
+
+ After copying Eclipse needs to be restarted before the help appears.
+
+\anchor cfg_eclipse_doc_id
+<dt>\c ECLIPSE_DOC_ID <dd>
+ \addindex ECLIPSE_DOC_ID
+ A unique identifier for the eclipse help plugin. When installing the plugin
+ the directory name containing the HTML and XML files should also have
+ this name. Each documentation set should have its own identifier.
+
+\anchor cfg_searchengine
+<dt>\c SEARCHENGINE <dd>
+ \addindex SEARCHENGINE
+
+ When the \c SEARCHENGINE tag is enabled doxygen will generate a search box
+ for the HTML output. The underlying search engine uses javascript
+ and DHTML and should work on any modern browser. Note that when using
+ HTML help (\ref cfg_generate_htmlhelp "GENERATE_HTMLHELP"),
+ Qt help (\ref cfg_generate_qhp "GENERATE_QHP"), or docsets
+ (\ref cfg_generate_docset "GENERATE_DOCSET") there is already a search
+ function so this one should typically be disabled. For large projects
+ the javascript based search engine can be slow, then enabling
+ \ref cfg_server_based_search "SERVER_BASED_SEARCH" may provide a
+ better solution.
+
+ It is possible to search using the keyboard;
+ to jump to the search box use access key + S (what the access key is
+ depends on the OS and browser, but it is typically CTRL, ALT/option, or both).
+ Inside the search box use the cursor down key to jump into the search
+ results window, the results can be navigated using the cursor keys.
+ Press Enter to select an item or escape to cancel the search. The
+ filter options can be selected when the cursor is inside the search box
+ by pressing Shift+cursor down. Also here use the cursor keys to
+ select a filter and enter or escape to activate or cancel the filter option.
+
+\anchor cfg_server_based_search
+<dt>\c SERVER_BASED_SEARCH <dd>
+ \addindex SERVER_BASED_SEARCH
+
+When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+implemented using a PHP enabled web server instead of at the web client
+using Javascript. Doxygen will generate the search PHP script and index
+file to put on the web server. The advantage of the server
+based approach is that it scales better to large projects and also allows
+full text search. The disadvantages are that it is more difficult to setup
+and does not have live searching capabilities.
+
+\anchor cfg_disable_index
+<dt>\c DISABLE_INDEX <dd>
+ \addindex DISABLE_INDEX
+ If you want full control over the layout of the generated HTML pages it
+ might be necessary to disable the index and replace it with your own.
+ The \c DISABLE_INDEX tag can be used to turn on/off the condensed index at
+ top of each page. A value of NO (the default) enables the index and the
+ value YES disables it.
+
+\anchor cfg_enum_values_per_line
+<dt>\c ENUM_VALUES_PER_LINE <dd>
+ \addindex ENUM_VALUES_PER_LINE
+ This tag can be used to set the number of enum values (range [0,1..20])
+ that doxygen will group on one line in the generated HTML documentation.
+ Note that a value of 0 will completely suppress the enum values from
+ appearing in the overview section.
+
+\anchor cfg_generate_treeview
+<dt>\c GENERATE_TREEVIEW <dd>
+ \addindex GENERATE_TREEVIEW
+ The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+ structure should be generated to display hierarchical information.
+ If the tag value is set to YES, a side panel will be generated
+ containing a tree-like index structure (just like the one that
+ is generated for HTML Help). For this to work a browser that supports
+ JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+ Windows users are probably better off using the HTML help feature.
+
+ Via custom stylesheets (see \ref cfg_html_stylesheet "HTML_STYLESHEET")
+ one can further \ref doxygen_finetune "fine-tune" the look of the index.
+ As an example, the default style sheet generated by doxygen has an
+ example that shows how to put an image at the root of the tree instead of
+ the \ref cfg_project_name "project name".
+
+\anchor cfg_use_inline_trees
+<dt>\c USE_INLINE_TREES <dd>
+ \addindex USE_INLINE_TREES
+By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+and Class Hierarchy pages using a tree view instead of an ordered list.
+
+\anchor cfg_treeview_width
+<dt>\c TREEVIEW_WIDTH <dd>
+ \addindex TREEVIEW_WIDTH
+ If the treeview is enabled (see \c GENERATE_TREEVIEW) then this tag can be
+ used to set the initial width (in pixels) of the frame in which the tree
+ is shown.
+
+\anchor cfg_ext_links_in_window
+<dt>\c EXT_LINKS_IN_WINDOW <dd>
+ \addindex EXT_LINKS_IN_WINDOW
+ When the \c EXT_LINKS_IN_WINDOW option is set to \c YES doxygen will open
+ links to external symbols imported via tag files in a separate window.
+
+\anchor cfg_formula_fontsize
+<dt>\c FORMULA_FONTSIZE <dd>
+ \addindex FORMULA_FONTSIZE
+ Use this tag to change the font size of Latex formulas included
+ as images in the HTML documentation. The default is 10.
+ when you change the font size after a successful doxygen run you need
+ to manually remove any <code>form_*.png</code> images from the HTML
+ output directory to force them to be regenerated.
+
+\anchor cfg_formula_transparent
+<dt>\c FORMULA_TRANSPARENT <dd>
+ \addindex FORMULA_TRANSPARENT
+ Use the \c FORMULA_TRANPARENT tag to determine whether or not the images
+ generated for formulas are transparent PNGs. Transparent PNGs are
+ not supported properly for IE 6.0, but are supported on all modern browsers.
+ Note that when changing this option you need to delete any form_*.png files
+ in the HTML output before the changes have effect.
+
+\anchor cfg_use_mathjax
+<dt>\c USE_MATHJAX <dd>
+ \addindex USE_MATHJAX
+ Enable the \c USE_MATHJAX option to render LaTeX formulas using MathJax
+ (see http://www.mathjax.org) which uses client side Javascript for the
+ rendering instead of using prerendered bitmaps. Use this if you do not
+ have LaTeX installed or if you want to formulas look prettier in the HTML
+ output. When enabled you also need to install MathJax separately and
+ configure the path to it using the \ref cfg_mathjax_relpath "MATHJAX_RELPATH" option.
+
+\anchor cfg_mathjax_relpath
+<dt>\c MATHJAX_RELPATH <dd>
+ \addindex MATHJAX_RELPATH
+ When MathJax is enabled you need to specify the location relative to the
+ HTML output directory using the \c MATHJAX_RELPATH option. The destination
+ directory should contain the MathJax.js script. For instance, if the mathjax
+ directory is located at the same level as the HTML output directory, then
+ \c MATHJAX_RELPATH should be <code>../mathjax</code>. The default value points to
+ the http://www.mathjax.org site, so you can quickly see the result without installing
+ MathJax, but it is strongly recommended to install a local copy of MathJax
+ before deployment.
+
+</dl>
+\section latex_output LaTeX related options
+\anchor cfg_generate_latex
+<dl>
+
+<dt>\c GENERATE_LATEX <dd>
+ \addindex GENERATE_LATEX
+ If the \c GENERATE_LATEX tag is set to \c YES (the default) doxygen will
+ generate \f$\mbox{\LaTeX}\f$ output.
+
+\anchor cfg_latex_output
+<dt>\c LATEX_OUTPUT <dd>
+ \addindex LATEX_OUTPUT
+ The \c LATEX_OUTPUT tag is used to specify where the \f$\mbox{\LaTeX}\f$
+ docs will be put.
+ If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
+ put in front of it. If left blank `latex' will be used as the default path.
+
+\anchor cfg_latex_cmd_name
+<dt>\c LATEX_CMD_NAME <dd>
+ \addindex LATEX_CMD_NAME
+ The \c LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be invoked.
+ If left blank `latex' will be used as the default command name.
+ Note that when enabling USE_PDFLATEX this option is only used for
+ generating bitmaps for formulas in the HTML output, but not in the
+ Makefile that is written to the output directory.
+
+\anchor cfg_makeindex_cmd_name
+<dt>\c MAKEINDEX_CMD_NAME <dd>
+ \addindex MAKEINDEX_CMD_NAME
+ The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+ generate index for LaTeX. If left blank `makeindex' will be used as the
+ default command name.
+
+\anchor cfg_compact_latex
+<dt>\c COMPACT_LATEX <dd>
+ \addindex COMPACT_LATEX
+ If the \c COMPACT_LATEX tag is set to \c YES doxygen generates more compact
+ \f$\mbox{\LaTeX}\f$ documents. This may be useful for small projects and may help to
+ save some trees in general.
+
+\anchor cfg_paper_type
+<dt>\c PAPER_TYPE <dd>
+ \addindex PAPER_TYPE
+ The \c PAPER_TYPE tag can be used to set the paper type that is used
+ by the printer. Possible values are:
+ <ul>
+ <li><code>a4</code> (210 x 297 mm).
+ <li><code>letter</code> (8.5 x 11 inches).
+ <li><code>legal</code> (8.5 x 14 inches).
+ <li><code>executive</code> (7.25 x 10.5 inches)
+ </ul>
+ If left blank a4 will be used.
+
+\anchor cfg_extra_packages
+<dt>\c EXTRA_PACKAGES <dd>
+ \addindex EXTRA_PACKAGES
+ The \c EXTRA_PACKAGES tag can be used to specify one or more \f$\mbox{\LaTeX}\f$
+ package names that should be included in the \f$\mbox{\LaTeX}\f$ output.
+ To get the times font for instance you can specify
+\verbatim
+EXTRA_PACKAGES = times
+\endverbatim
+ If left blank no extra packages will be included.
+
+\anchor cfg_latex_header
+<dt>\c LATEX_HEADER <dd>
+ \addindex LATEX_HEADER
+ The \c LATEX_HEADER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$
+ header for the generated \f$\mbox{\LaTeX}\f$ document.
+ The header should contain everything until the first chapter.
+
+ If it is left blank doxygen will generate a
+ standard header. See section \ref doxygen_usage for information on how to
+ let doxygen write the default header to a separate file.
+
+ \par Note:
+ Only use a user-defined header if you know what you are doing!
+
+ The following commands have a special meaning inside the header:
+ <code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>,
+ <code>\$doxygenversion</code>, <code>\$projectname</code>,
+ <code>\$projectnumber</code>.
+ Doxygen will replace them by respectively
+ the title of the page, the current date and time, only the current date,
+ the version number of doxygen, the project name (see \c PROJECT_NAME), or the
+ project number (see \c PROJECT_NUMBER).
+
+\anchor cfg_latex_footer
+<dt>\c LATEX_FOOTER <dd>
+ \addindex LATEX_FOOTER
+ The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+ the generated latex document. The footer should contain everything after
+ the last chapter. If it is left blank doxygen will generate a
+ standard footer. Notice: only use this tag if you know what you are doing!
+
+\anchor cfg_pdf_hyperlinks
+<dt>\c PDF_HYPERLINKS <dd>
+ \addindex PDF_HYPERLINKS
+
+ If the \c PDF_HYPERLINKS tag is set to \c YES, the \f$\mbox{\LaTeX}\f$ that
+ is generated is prepared for conversion to PDF (using ps2pdf or pdflatex).
+ The PDF file will
+ contain links (just like the HTML output) instead of page references.
+ This makes the output suitable for online browsing using a PDF viewer.
+
+\anchor cfg_use_pdflatex
+<dt>\c USE_PDFLATEX <dd>
+ \addindex LATEX_PDFLATEX
+
+ If the \c LATEX_PDFLATEX tag is set to \c YES, doxygen will use
+ pdflatex to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$
+ files.
+
+\anchor cfg_latex_batchmode
+<dt>\c LATEX_BATCHMODE <dd>
+ \addindex LATEX_BATCHMODE
+
+ If the \c LATEX_BATCHMODE tag is set to \c YES, doxygen will add the \\batchmode.
+ command to the generated \f$\mbox{\LaTeX}\f$ files. This will
+ instruct \f$\mbox{\LaTeX}\f$ to keep running if errors occur, instead of
+ asking the user for help. This option is also used when generating formulas
+ in HTML.
+
+\anchor cfg_latex_hide_indices
+<dt>\c LATEX_HIDE_INDICES <dd>
+ \addindex LATEX_HIDE_INDICES
+
+ If \c LATEX_HIDE_INDICES is set to \c YES then doxygen will not
+ include the index chapters (such as File Index, Compound Index, etc.)
+ in the output.
+
+\anchor cfg_latex_source_code
+ <dt>\c LATEX_SOURCE_CODE <dd>
+ If \c LATEX_SOURCE_CODE is set to \c YES then doxygen will include
+ source code with syntax highlighting in the LaTeX output.
+ Note that which sources are shown also depends on other settings
+ such as \ref cfg_source_browser "SOURCE_BROWSER".
+
+</dl>
+\section rtf_output RTF related options
+\anchor cfg_generate_rtf
+<dl>
+
+<dt>\c GENERATE_RTF <dd>
+ \addindex GENERATE_RTF
+ If the \c GENERATE_RTF tag is set to \c YES doxygen will generate RTF output.
+ The RTF output is optimized for Word 97 and may not look too pretty with
+ other readers/editors.
+
+\anchor cfg_rtf_output
+<dt>\c RTF_OUTPUT <dd>
+ \addindex RTF_OUTPUT
+ The \c RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+ If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
+ put in front of it. If left blank \c rtf will be used as the default path.
+
+\anchor cfg_compact_rtf
+<dt>\c COMPACT_RTF <dd>
+ \addindex COMPACT_RTF
+ If the \c COMPACT_RTF tag is set to \c YES doxygen generates more compact
+ RTF documents. This may be useful for small projects and may help to
+ save some trees in general.
+
+\anchor cfg_rtf_hyperlinks
+<dt>\c RTF_HYPERLINKS <dd>
+ \addindex RTF_HYPERLINKS
+ If the \c RTF_HYPERLINKS tag is set to \c YES, the RTF that is generated
+ will contain hyperlink fields. The RTF file will
+ contain links (just like the HTML output) instead of page references.
+ This makes the output suitable for online browsing using Word or some other
+ Word compatible reader that support those fields.
+
+ \par note:
+ WordPad (write) and others do not support links.
+
+\anchor cfg_rtf_stylesheet_file
+<dt>\c RTF_STYLESHEET_FILE <dd>
+ \addindex RTF_STYLESHEET_FILE
+ Load stylesheet definitions from file. Syntax is similar to doxygen's
+ config file, i.e. a series of assignments. You only have to provide
+ replacements, missing definitions are set to their default value.
+
+ See also section \ref doxygen_usage for information on how to generate
+ the default style sheet that doxygen normally uses.
+
+\anchor cfg_rtf_extensions_file
+<dt>\c RTF_EXTENSIONS_FILE <dd>
+ Set optional variables used in the generation of an RTF document.
+ Syntax is similar to doxygen's config file.
+ A template extensions file can be generated using
+ <code>doxygen -e rtf extensionFile</code>.
+
+</dl>
+
+\section man_output Man page related options
+\anchor cfg_generate_man
+<dl>
+
+<dt>\c GENERATE_MAN <dd>
+ \addindex GENERATE_MAN
+ If the \c GENERATE_MAN tag is set to \c YES (the default) doxygen will
+ generate man pages for classes and files.
+
+\anchor cfg_man_output
+<dt>\c MAN_OUTPUT <dd>
+ \addindex MAN_OUTPUT
+ The \c MAN_OUTPUT tag is used to specify where the man pages will be put.
+ If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
+ put in front of it. If left blank `man' will be used as the default path.
+ A directory man3 will be created inside the directory specified by
+ \c MAN_OUTPUT.
+
+\anchor cfg_man_extension
+<dt>\c MAN_EXTENSION <dd>
+ \addindex MAX_EXTENSION
+ The \c MAN_EXTENSION tag determines the extension that is added to
+ the generated man pages (default is the subroutine's section .3)
+
+\anchor cfg_man_links
+<dt>\c MAN_LINKS <dd>
+ \addindex MAN_LINKS
+ If the \c MAN_LINKS tag is set to \c YES and doxygen generates man output,
+ then it will generate one additional man file for each entity documented in
+ the real man page(s). These additional files only source the real man page,
+ but without them the man command would be unable to find the correct page.
+ The default is \c NO.
+
+</dl>
+
+\section xml_output XML related options
+\anchor cfg_generate_xml
+<dl>
+
+<dt>\c GENERATE_XML <dd>
+ \addindex GENERATE_XML
+ If the \c GENERATE_XML tag is set to \c YES Doxygen will
+ generate an XML file that captures the structure of
+ the code including all documentation.
+
+\anchor cfg_xml_output
+<dt>\c XML_OUTPUT <dd>
+ \addindex XML_OUTPUT
+ The \c XML_OUTPUT tag is used to specify where the XML pages will be put.
+ If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
+ put in front of it. If left blank \c xml will be used as the default path.
+
+\anchor cfg_xml_schema
+<dt>\c XML_SCHEMA <dd>
+ \addindex XML_SCHEMA
+ The \c XML_SCHEMA tag can be used to specify an XML schema,
+ which can be used by a validating XML parser to check the
+ syntax of the XML files.
+
+\anchor cfg_xml_dtd
+<dt>\c XML_DTD <dd>
+ \addindex XML_DTD
+ The \c XML_DTD tag can be used to specify an XML DTD,
+ which can be used by a validating XML parser to check the
+ syntax of the XML files.
+
+\anchor cfg_xml_programlisting
+<dt>\c XML_PROGRAMLISTING <dd>
+ \addindex XML_PROGRAMLISTING
+ If the \c XML_PROGRAMLISTING tag is set to \c YES Doxygen will
+ dump the program listings (including syntax highlighting
+ and cross-referencing information) to the XML output. Note that
+ enabling this will significantly increase the size of the XML output.
+
+</dl>
+
+\section autogen_output AUTOGEN_DEF related options
+\anchor cfg_generate_autogen_def
+<dl>
+
+<dt>\c GENERATE_AUTOGEN_DEF <dd>
+ \addindex GENERATE_AUTOGEN_DEF
+ If the \c GENERATE_AUTOGEN_DEF tag is set to \c YES Doxygen will
+ generate an AutoGen Definitions (see http://autogen.sf.net) file
+ that captures the structure of the code including all
+ documentation. Note that this feature is still experimental
+ and incomplete at the moment.
+
+</dl>
+
+\section perlmod_output PERLMOD related options
+\anchor cfg_generate_perlmod
+<dl>
+
+<dt>\c GENERATE_PERLMOD <dd>
+ \addindex GENERATE_PERLMOD
+ If the \c GENERATE_PERLMOD tag is set to \c YES Doxygen will
+ generate a Perl module file that captures the structure of
+ the code including all documentation. Note that this
+ feature is still experimental and incomplete at the
+ moment.
+
+\anchor cfg_perlmod_latex
+<dt>\c PERLMOD_LATEX <dd>
+ \addindex PERLMOD_LATEX
+ If the \c PERLMOD_LATEX tag is set to \c YES Doxygen will generate
+ the necessary Makefile rules, Perl scripts and LaTeX code to be able
+ to generate PDF and DVI output from the Perl module output.
+
+\anchor cfg_perlmod_pretty
+<dt>\c PERLMOD_PRETTY <dd>
+ \addindex PERLMOD_PRETTY
+ If the \c PERLMOD_PRETTY tag is set to \c YES the Perl module output will be
+ nicely formatted so it can be parsed by a human reader. This is useful
+ if you want to understand what is going on. On the other hand, if this
+ tag is set to \c NO the size of the Perl module output will be much smaller
+ and Perl will parse it just the same.
+
+\anchor cfg_perlmod_makevar_prefix
+<dt>\c PERLMOD_MAKEVAR_PREFIX <dd>
+ \addindex PERLMOD_MAKEVAR_PREFIX
+ The names of the make variables in the generated doxyrules.make file
+ are prefixed with the string contained in \c PERLMOD_MAKEVAR_PREFIX.
+ This is useful so different doxyrules.make files included by the same
+ Makefile don't overwrite each other's variables.
+
+</dl>
+
+\section config_prepro Preprocessor related options
+\anchor cfg_enable_preprocessing
+<dl>
+
+<dt>\c ENABLE_PREPROCESSING <dd>
+ \addindex ENABLE_PREPROCESSING
+ If the \c ENABLE_PREPROCESSING tag is set to \c YES (the default) doxygen will
+ evaluate all C-preprocessor directives found in the sources and include
+ files.
+
+\anchor cfg_macro_expansion
+<dt>\c MACRO_EXPANSION <dd>
+ \addindex MACRO_EXPANSION
+ If the \c MACRO_EXPANSION tag is set to \c YES doxygen will expand all macro
+ names in the source code. If set to \c NO (the default) only conditional
+ compilation will be performed. Macro expansion can be done in a controlled
+ way by setting \c EXPAND_ONLY_PREDEF to \c YES.
+
+\anchor cfg_expand_only_predef
+<dt>\c EXPAND_ONLY_PREDEF <dd>
+ \addindex EXPAND_ONLY_PREDEF
+ If the \c EXPAND_ONLY_PREDEF and \c MACRO_EXPANSION tags are both set to YES
+ then the macro expansion is limited to the macros specified with the
+ \c PREDEFINED and \c EXPAND_AS_DEFINED tags.
+
+\anchor cfg_search_includes
+<dt>\c SEARCH_INCLUDES <dd>
+ \addindex SEARCH_INCLUDES
+ If the \c SEARCH_INCLUDES tag is set to \c YES (the default) the includes files
+ in the \c INCLUDE_PATH (see below) will be searched if a \#include is found.
+
+\anchor cfg_include_path
+<dt>\c INCLUDE_PATH <dd>
+ \addindex INCLUDE_PATH
+ The \c INCLUDE_PATH tag can be used to specify one or more directories that
+ contain include files that are not input files but should be processed by
+ the preprocessor.
+
+\anchor cfg_include_file_patterns
+<dt>\c INCLUDE_FILE_PATTERNS <dd>
+ \addindex INCLUDE_FILE_PATTERNS
+ You can use the \c INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+ patterns (like *.h and *.hpp) to filter out the header-files in the
+ directories. If left blank, the patterns specified with \c FILE_PATTERNS will
+ be used.
+
+\anchor cfg_predefined
+<dt>\c PREDEFINED <dd>
+ \addindex PREDEFINED
+ The \c PREDEFINED tag can be used to specify one or more macro names that
+ are defined before the preprocessor is started (similar to the -D option of
+ gcc). The argument of the tag is a list of macros of the form:
+ <code>name</code> or <code>name=definition</code> (no spaces).
+ If the definition and the "=" are omitted, "=1" is assumed. To prevent
+ a macro definition from being undefined via \#undef or recursively expanded
+ use the := operator instead of the = operator.
+
+\anchor cfg_expand_as_defined
+<dt>\c EXPAND_AS_DEFINED <dd>
+ \addindex EXPAND_AS_DEFINED
+ If the \c MACRO_EXPANSION and \c EXPAND_ONLY_PREDEF tags are set to \c YES then
+ this tag can be used to specify a list of macro names that should be expanded.
+ The macro definition that is found in the sources will be used.
+ Use the \c PREDEFINED tag if you want to use a different macro definition.
+
+\anchor cfg_skip_function_macros
+<dt>\c SKIP_FUNCTION_MACROS <dd>
+ \addindex SKIP_FUNCTION_MACROS
+ If the \c SKIP_FUNCTION_MACROS tag is set to \c YES (the default) then
+ doxygen's preprocessor will remove all function-like macros that are alone
+ on a line, have an all uppercase name, and do not end with a semicolon.
+ Such function macros are typically
+ used for boiler-plate code, and will confuse the parser if not removed.
+
+</dl>
+\section config_extref External reference options
+\anchor cfg_tagfiles
+<dl>
+
+<dt>\c TAGFILES <dd>
+ \addindex TAGFILES
+ The \c TAGFILES tag can be used to specify one or more tagfiles.
+
+ See section \ref doxytag_usage for more information about the usage of
+ tag files.
+
+ Optionally an initial location of the external documentation
+ can be added for each tagfile.
+ The format of a tag file without this location is as follows:
+ <pre>
+TAGFILES = file1 file2 ... </pre>
+ Adding location for the tag files is done as follows:
+ <pre>
+TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
+ where \c loc1 and \c loc2 can be relative or absolute paths or URLs,
+ If a location is present for each tag, the installdox tool (see
+ section \ref installdox_usage for more information) does not
+ have to be run to correct the links.
+
+ \par Note:
+ Each tag file must have a unique name
+ (where the name does \e not include the path)
+ If a tag file is not located in the directory in which doxygen
+ is run, you must also specify the path to the tagfile here.
+
+\anchor cfg_generate_tagfile
+<dt>\c GENERATE_TAGFILE <dd>
+ \addindex GENERATE_TAGFILE
+ When a file name is specified after \c GENERATE_TAGFILE, doxygen will create
+ a tag file that is based on the input files it reads.
+ See section \ref doxytag_usage for more information about the usage of
+ tag files.
+
+\anchor cfg_allexternals
+<dt>\c ALLEXTERNALS <dd>
+ \addindex ALLEXTERNALS
+ If the \c ALLEXTERNALS tag is set to \c YES all external class will be listed
+ in the class index. If set to \c NO only the inherited external classes
+ will be listed.
+
+\anchor cfg_external_groups
+<dt>\c EXTERNAL_GROUPS <dd>
+ \addindex EXTERNAL_GROUPS
+ If the \c EXTERNAL_GROUPS tag is set to \c YES all external groups will be listed
+ in the modules index. If set to \c NO, only the current project's groups will
+ be listed.
+
+\anchor cfg_perl_path
+<dt>\c PERL_PATH <dd>
+ \addindex PERL_PATH
+ The \c PERL_PATH should be the absolute path and name of the perl script
+ interpreter (i.e. the result of `<tt>which perl</tt>').
+
+</dl>
+\section config_dot Dot options
+\anchor cfg_class_diagrams
+<dl>
+
+<dt>\c CLASS_DIAGRAMS <dd>
+ \addindex CLASS_DIAGRAMS
+ If the \c CLASS_DIAGRAMS tag is set to \c YES (the default) doxygen will
+ generate a class diagram (in HTML and \f$\mbox{\LaTeX}\f$) for classes with base or
+super classes. Setting the tag to NO turns the diagrams off. Note that
+this option also works with HAVE_DOT disabled, but it is recommended to
+install and use dot, since it yields more powerful graphs.
+
+\anchor cfg_mscgen_path
+<dt>\c MSCGEN_PATH <dd>
+ \addindex MSCGEN_PATH
+ You can define message sequence charts within doxygen comments using the \ref cmdmsc "\\msc"
+ command. Doxygen will then run the <a href="http://www.mcternan.me.uk/mscgen/">mscgen tool</a>) to
+ produce the chart and insert it in the documentation. The <code>MSCGEN_PATH</code> tag allows you to
+ specify the directory where the mscgen tool resides. If left empty the tool is assumed to
+ be found in the default search path.
+
+\anchor cfg_have_dot
+<dt>\c HAVE_DOT <dd>
+ \addindex HAVE_DOT
+ If you set the \c HAVE_DOT tag to \c YES then doxygen will assume the dot tool is
+ available from the path. This tool is part of
+ <a href="http://www.research.att.com/sw/tools/graphviz/">Graphviz</a>, a graph
+ visualization toolkit from AT\&T and Lucent Bell Labs. The other options in
+ this section have no effect if this option is set to \c NO (the default)
+
+\anchor cfg_dot_num_threads
+<dt>\c DOT_NUM_THREADS <dd>
+ \addindex DOT_NUM_THREADS
+ The \c DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+ allowed to run in parallel. When set to 0 (the default) doxygen will
+ base this on the number of processors available in the system. You can set it
+ explicitly to a value larger than 0 to get control over the balance
+ between CPU load and processing speed.
+
+\anchor cfg_dot_fontname
+<dt>\c DOT_FONTNAME <dd>
+ \addindex DOT_FONTNAME
+ By default doxygen will write a font called \c FreeSans.ttf to the output
+ directory and reference it in all dot files that doxygen generates. This
+ font does not include all possible unicode characters however, so when you need
+ these (or just want a differently looking font) you can specify the font name
+ using \c DOT_FONTNAME. You need to make sure dot is able to find the font,
+ which can be done by putting it in a standard location or by setting the
+ \c DOTFONTPATH environment variable or by setting \c DOT_FONTPATH to the directory
+ containing the font.
+
+\anchor cfg_dot_fontsize
+<dt>\c DOT_FONTSIZE <dd>
+The \c DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+The default size is 10pt.
+
+\anchor cfg_dot_fontpath
+<dt>\c DOT_FONTPATH <dd>
+ \addindex DOT_FONTPATH
+ By default doxygen will tell dot to use the output directory to look for the
+ \c FreeSans.ttf font (which doxygen will put there itself). If you specify a
+ different font using \c DOT_FONTNAME you can set the path where dot
+ can find it using this tag.
+
+\anchor cfg_class_graph
+<dt>\c CLASS_GRAPH <dd>
+ \addindex CLASS_GRAPH
+ If the \c CLASS_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen
+ will generate a graph for each documented class showing the direct and
+ indirect inheritance relations. Setting this tag to \c YES will force the
+ the \c CLASS_DIAGRAMS tag to NO.
+
+\anchor cfg_collaboration_graph
+<dt>\c COLLABORATION_GRAPH <dd>
+ \addindex COLLABORATION_GRAPH
+ If the \c COLLABORATION_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen
+ will generate a graph for each documented class showing the direct and
+ indirect implementation dependencies (inheritance, containment, and
+ class references variables) of the class with other documented classes.
+
+\anchor cfg_group_graphs
+<dt>\c GROUP_GRAPHS <dd>
+ \addindex GROUP_GRAPHS
+ If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+ will generate a graph for groups, showing the direct groups dependencies.
+
+\anchor cfg_uml_look
+<dt>\c UML_LOOK <dd>
+ \addindex UML_LOOK
+ If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+ collaboration diagrams in a style similar to the OMG's Unified Modeling
+ Language.
+
+\anchor cfg_template_relations
+<dt>\c TEMPLATE_RELATIONS <dd>
+ \addindex TEMPLATE_RELATIONS
+ If the \c TEMPLATE_RELATIONS and \c HAVE_DOT tags are set to \c YES then
+ doxygen will show the relations between templates and their instances.
+
+\anchor cfg_hide_undoc_relations
+<dt>\c HIDE_UNDOC_RELATIONS <dd>
+ \addindex HIDE_UNDOC_RELATIONS
+ If set to YES, the inheritance and collaboration graphs will hide
+ inheritance and usage relations if the target is undocumented
+ or is not a class.
+
+\anchor cfg_include_graph
+<dt>\c INCLUDE_GRAPH <dd>
+ \addindex INCLUDE_GRAPH
+ If the \c ENABLE_PREPROCESSING, \c SEARCH_INCLUDES, \c INCLUDE_GRAPH, and \c HAVE_DOT
+ tags are set to \c YES then doxygen will generate a graph for each documented file
+ showing the direct and indirect include dependencies of the file with other
+ documented files.
+
+\anchor cfg_included_by_graph
+<dt>\c INCLUDED_BY_GRAPH <dd>
+ \addindex INCLUDED_BY_GRAPH
+ If the \c ENABLE_PREPROCESSING, \c SEARCH_INCLUDES, \c INCLUDED_BY_GRAPH, and
+ \c HAVE_DOT tags are set to \c YES then doxygen will generate a graph for each
+ documented header file showing the documented files that directly or indirectly
+ include this file.
+
+\anchor cfg_call_graph
+<dt>\c CALL_GRAPH <dd>
+ \addindex CALL_GRAPH
+ If the \c CALL_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen will
+ generate a call dependency graph for every global function or class method.
+ Note that enabling this option will significantly increase the time of a run.
+ So in most cases it will be better to enable call graphs for selected
+ functions only using the \\callgraph command.
+
+\anchor cfg_caller_graph
+<dt>\c CALLER_GRAPH <dd>
+ \addindex CALLER_GRAPH
+ If the \c CALLER_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen will
+ generate a caller dependency graph for every global function or class method.
+ Note that enabling this option will significantly increase the time of a run.
+ So in most cases it will be better to enable caller graphs for selected
+ functions only using the \\callergraph command.
+
+\anchor cfg_graphical_hierarchy
+<dt>\c GRAPHICAL_HIERARCHY <dd>
+ \addindex GRAPHICAL_HIERARCHY
+ If the \c GRAPHICAL_HIERARCHY and \c HAVE_DOT tags are set to \c YES then
+ doxygen will graphical hierarchy of all classes instead of a textual one.
+
+\anchor cfg_directory_graph
+<dt>\c DIRECTORY_GRAPH <dd>
+ \addindex DIRECTORY_GRAPH
+ If the \c DIRECTORY_GRAPH, \c SHOW_DIRECTORIES and \c HAVE_DOT options are set
+ to \c YES then doxygen will show the dependencies a directory has on other directories
+ in a graphical way. The dependency relations are determined by the \#include
+ relations between the files in the directories.
+
+\anchor cfg_dot_graph_max_nodes
+<dt>\c DOT_GRAPH_MAX_NODES <dd>
+ \addindex DOT_GRAPH_MAX_NODES
+ The \c DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+ nodes that will be shown in the graph. If the number of nodes in a graph
+ becomes larger than this value, doxygen will truncate the graph, which is
+ visualized by representing a node as a red box. Note that doxygen if the number
+ of direct children of the root node in a graph is already larger than
+ \c DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+ that the size of a graph can be further restricted by \c MAX_DOT_GRAPH_DEPTH.
+
+\anchor cfg_max_dot_graph_depth
+<dt>\c MAX_DOT_GRAPH_DEPTH <dd>
+ \addindex MAX_DOT_GRAPH_DEPTH
+ The \c MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+ graphs generated by dot. A depth value of 3 means that only nodes reachable
+ from the root by following a path via at most 3 edges will be shown. Nodes
+ that lay further from the root node will be omitted. Note that setting this
+ option to 1 or 2 may greatly reduce the computation time needed for large
+ code bases. Also note that the size of a graph can be further restricted by
+ \c DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction (the default).
+
+\anchor cfg_dot_image_format
+<dt>\c DOT_IMAGE_FORMAT <dd>
+ \addindex DOT_IMAGE_FORMAT
+ The \c DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+ generated by dot. Possible values are svg, png, jpg, or gif.
+ If left blank png will be used.
+
+\anchor cfg_dot_path
+<dt>\c DOT_PATH <dd>
+ \addindex DOT_PATH
+ This tag can be used to specify the path where the dot tool can be found.
+ If left blank, it is assumed the dot tool can be found on the path.
+
+\anchor cfg_dotfile_dirs
+<dt>\c DOTFILE_DIRS <dd>
+ \addindex DOTFILE_DIRS
+ This tag can be used to specify one or more directories that
+ contain dot files that are included in the documentation (see the
+ \ref cmddotfile "\\dotfile" command).
+
+\anchor cfg_mscfile_dirs
+<dt>\c MSCFILE_DIRS <dd>
+ \addindex MSCFILE_DIRS
+ This tag can be used to specify one or more directories that
+ contain msc files that are included in the documentation (see the
+ \ref cmdmscfile "\\mscfile" command).
+
+\anchor cfg_dot_transparent
+<dt>\c DOT_TRANSPARENT <dd>
+ \addindex DOT_TRANSPARENT
+ Set the \c DOT_TRANSPARENT tag to \c YES to generate images with a transparent
+ background. This is disabled by default, because dot on Windows does not
+ seem to support this out of the box. Warning: Depending on the platform used,
+ enabling this option may lead to badly anti-aliased labels on the edges of
+ a graph (i.e. they become hard to read).
+
+\anchor cfg_dot_multi_targets
+<dt>\c DOT_MULTI_TARGETS <dd>
+ \addindex DOT_MULTI_TARGET
+ Set the \c DOT_MULTI_TARGETS tag to \c YES allow dot to generate multiple output
+ files in one run (i.e. multiple -o and -T options on the command line). This
+ makes dot run faster, but since only newer versions of dot (>1.8.10)
+ support this, this feature is disabled by default.
+
+\anchor cfg_generate_legend
+<dt>\c GENERATE_LEGEND <dd>
+ \addindex GENERATE_LEGEND
+ If the \c GENERATE_LEGEND tag is set to \c YES (the default) doxygen will
+ generate a legend page explaining the meaning of the various boxes and
+ arrows in the dot generated graphs.
+
+\anchor cfg_dot_cleanup
+<dt>\c DOT_CLEANUP <dd>
+ \addindex DOT_CLEANUP
+If the \c DOT_CLEANUP tag is set to \c YES (the default) doxygen will
+remove the intermediate dot files that are used to generate the various graphs.
+
+
+</dl>
+<h2>Examples</h2>
+
+Suppose you have a simple project consisting of two files: a source file
+\c example.cc and a header file \c example.h.
+Then a minimal configuration file is as simple as:
+\verbatim
+INPUT = example.cc example.h
+\endverbatim
+
+Assuming the example makes use of Qt classes and perl is located
+in <code>/usr/bin</code>, a more realistic configuration file would be:
+\verbatim
+PROJECT_NAME = Example
+INPUT = example.cc example.h
+WARNINGS = YES
+TAGFILES = qt.tag
+PERL_PATH = /usr/local/bin/perl
+SEARCHENGINE = NO
+\endverbatim
+
+To generate the documentation for the
+<a href="http://www.stack.nl/~dimitri/qdbttabular/index.html">QdbtTabular</a> package
+I have used the following configuration file:
+\verbatim
+PROJECT_NAME = QdbtTabular
+OUTPUT_DIRECTORY = html
+WARNINGS = YES
+INPUT = examples/examples.doc src
+FILE_PATTERNS = *.cc *.h
+INCLUDE_PATH = examples
+TAGFILES = qt.tag
+PERL_PATH = /usr/bin/perl
+SEARCHENGINE = YES
+\endverbatim
+
+To regenerate the Qt-1.44 documentation from the sources, you could use the
+following config file:
+\verbatim
+PROJECT_NAME = Qt
+OUTPUT_DIRECTORY = qt_docs
+HIDE_UNDOC_MEMBERS = YES
+HIDE_UNDOC_CLASSES = YES
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = $(QTDIR)/
+PREDEFINED = USE_TEMPLATECLASS Q_EXPORT= \
+ QArrayT:=QArray \
+ QListT:=QList \
+ QDictT:=QDict \
+ QQueueT:=QQueue \
+ QVectorT:=QVector \
+ QPtrDictT:=QPtrDict \
+ QIntDictT:=QIntDict \
+ QStackT:=QStack \
+ QDictIteratorT:=QDictIterator \
+ QListIteratorT:=QListIterator \
+ QCacheT:=QCache \
+ QCacheIteratorT:=QCacheIterator \
+ QIntCacheT:=QIntCache \
+ QIntCacheIteratorT:=QIntCacheIterator \
+ QIntDictIteratorT:=QIntDictIterator \
+ QPtrDictIteratorT:=QPtrDictIterator
+INPUT = $(QTDIR)/doc \
+ $(QTDIR)/src/widgets \
+ $(QTDIR)/src/kernel \
+ $(QTDIR)/src/dialogs \
+ $(QTDIR)/src/tools
+FILE_PATTERNS = *.cpp *.h q*.doc
+INCLUDE_PATH = $(QTDIR)/include
+RECURSIVE = YES
+\endverbatim
+
+For the Qt-2.1 sources I recommend to use the following settings:
+\verbatim
+PROJECT_NAME = Qt
+PROJECT_NUMBER = 2.1
+HIDE_UNDOC_MEMBERS = YES
+HIDE_UNDOC_CLASSES = YES
+SOURCE_BROWSER = YES
+INPUT = $(QTDIR)/src
+FILE_PATTERNS = *.cpp *.h q*.doc
+RECURSIVE = YES
+EXCLUDE_PATTERNS = *codec.cpp moc_* */compat/* */3rdparty/*
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 3
+IGNORE_PREFIX = Q
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+INCLUDE_PATH = $(QTDIR)/include
+PREDEFINED = Q_PROPERTY(x)= \
+ Q_OVERRIDE(x)= \
+ Q_EXPORT= \
+ Q_ENUMS(x)= \
+ "QT_STATIC_CONST=static const " \
+ _WS_X11_ \
+ INCLUDE_MENUITEM_DEF
+EXPAND_ONLY_PREDEF = YES
+EXPAND_AS_DEFINED = Q_OBJECT_FAKE Q_OBJECT ACTIVATE_SIGNAL_WITH_PARAM \
+ Q_VARIANT_AS
+\endverbatim
+
+Here doxygen's preprocessor is used to substitute some
+macro names that are normally substituted by the C preprocessor,
+but without doing full macro expansion.
+
+*/
+
diff --git a/doc/custcmd.doc b/doc/custcmd.doc
new file mode 100644
index 0000000..312a307
--- /dev/null
+++ b/doc/custcmd.doc
@@ -0,0 +1,123 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page custcmd Custom Commands
+
+Doxygen provides a large number of \ref commands "special commands",
+\ref xmlcmds "XML commands", and \ref htmlcmds "HTML commands".
+that can be used to enhance or structure the documentation inside a comment block.
+If you for some reason have a need to define new commands you can do
+so by means of an \e alias definition.
+
+The definition of an alias should be specified in the configuration file using
+the \ref cfg_aliases "ALIASES" configuration tag.
+
+\section custcmd_simple Simple aliases
+The simplest form of an alias is a simple substitution of the form
+\verbatim
+ name=value
+\endverbatim
+ For example defining the following alias:
+\verbatim
+ ALIASES += sideeffect="\par Side Effects:\n"
+\endverbatim
+ will allow you to
+ put the command \\sideeffect (or \@sideeffect) in the documentation, which
+ will result in a user-defined paragraph with heading <b>Side Effects:</b>.
+
+Note that you can put \\n's in the value part of an alias to insert newlines.
+
+Also note that you can redefine existing special commands if you wish.
+
+Some commands, such as \ref cmdxrefitem "\\xrefitem" are designed to be used in
+combination with aliases.
+
+\section custcmd_complex Aliases with arguments
+Aliases can also have one or more arguments. In the alias definition you then need
+to specify the number of arguments between curly braces. In the value part of the
+definition you can place \\x markers, where 'x' represents the argument number starting
+with 1.
+
+Here is an example of an alias definition with a single argument:
+\verbatim
+ALIASES += l{1}="\ref \1"
+\endverbatim
+
+Inside a comment block you can use it as follows
+\verbatim
+/** See \l{SomeClass} for more information. */
+\endverbatim
+which would be the same as writing
+\verbatim
+/** See \ref SomeClass for more information. */
+\endverbatim
+
+Note that you can overload an alias by a version with multiple arguments, for instance:
+\verbatim
+ALIASES += l{1}="\ref \1"
+ALIASES += l{2}="\ref \1 \"\2\""
+\endverbatim
+Note that the quotes inside the alias definition have to be escaped with a backslash.
+
+With these alias definitions, we can write
+\verbatim
+/** See \l{SomeClass,Some Text} for more information. */
+\endverbatim
+inside the comment block and it will expand to
+\verbatim
+/** See \ref SomeClass "Some Text" for more information. */
+\endverbatim
+where the command with a single argument would still work as shown before.
+
+Aliases can also be expressed in terms of other aliases, e.g. a new command
+\\reminder can be expressed as a \\xrefitem via an intermediate \\xreflist command
+as follows:
+\verbatim
+ALIASES += xreflist{3}="\xrefitem \1 \"\2\" \"\3\" " \
+ALIASES += reminder="\xreflist{reminders,Reminder,Reminders}" \
+\endverbatim
+
+Note that if for aliases with more than one argument a comma is used as a separator,
+if you want to put a comma inside the command, you will need to escape it with a backslash,
+i.e.
+\verbatim
+\l{SomeClass,Some text\, with an escaped comma}
+\endverbatim
+given the alias definition of \\l in the example above.
+
+\section custcmd_nesting Nesting custom command
+
+You can use commands as arguments of aliases, including commands
+defined using aliases.
+
+As an example consider the following alias definitions
+
+\verbatim
+ALIASES += Bold{1}="<b>\1</b>"
+ALIASES += Emph{1}="<em>\1</em>"
+\endverbatim
+
+Inside a comment block you can now use:
+\verbatim
+/** This is a \Bold{bold \Emph{and} Emphasized} text fragment. */
+\endverbatim
+which will expand to
+\verbatim
+/** This is a <b>bold <em>and</em> Emphasized</b> text fragment. */
+\endverbatim
+
+
+*/
diff --git a/doc/customize.doc b/doc/customize.doc
new file mode 100644
index 0000000..1a8b3dd
--- /dev/null
+++ b/doc/customize.doc
@@ -0,0 +1,263 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page customize Customizing the output
+
+Doxygen provides various levels of customization.
+The \ref minor_tweaks "first section" discusses what to
+do if you want to do minor tweaking to the look and feel of the output.
+The \ref layout "next" section show how to reorder and hide certain
+information on a page.
+The \ref xmlgenerator "last" section show how to generate whatever output
+you want based on the XML output produced by doxygen.
+
+\section minor_tweaks Minor Tweaks
+
+To simply tweak things like fonts or colors, margins, or other look \& feel
+expects of the HTML output you can create a different
+<a href="http://www.w3schools.com/css/default.asp">cascading style sheet</a>.
+You can also let doxygen use a custom header and footer for each HTML
+page it generates, for instance to include a logo or to make the
+doxygen output blend in with the rest of the web site.
+
+To do this first run doxygen as follows:
+\verbatim
+doxygen -w html header.html footer.html customdoxygen.css
+\endverbatim
+
+This will create 3 files:
+- header.html is a HTML fragment which doxygen normally uses to start
+ a HTML page. Note that the fragment ends with a body tag and that is
+ contains a couple of commands of the form \$word. These will be replaced
+ by doxygen on the fly.
+- footer.html is a HTML fragment which doxygen normally uses to end
+ a HTML page. Also here special commands can be used. This file contain the
+ link to www.doxygen.org and the body and html end tags.
+- customdoxygen.css is the default cascading style sheet
+ used by doxygen.
+
+You should edit these files and then reference them from the config file.
+\verbatim
+HTML_HEADER = header.html
+HTML_FOOTER = footer.html
+HTML_STYLESHEET = customdoxygen.css
+\endverbatim
+
+See the documentation of the \ref cfg_html_header "HTML_HEADER" tag
+for more information about the possible meta commands.
+
+\note You should not put the style sheet in the HTML output directory. Treat
+it is a source file. Doxygen will copy it for you.
+
+\note If you use images or other external content in a custom header you
+need to make sure these end up in the HTML output directory yourself,
+for instance by writing a script that runs doxygen can then copies the
+images to the output.
+
+
+\section layout Changing the layout of pages
+
+In some cases you may want to change the way the output is structured.
+A different style sheet or custom headers and footers do not help in such
+case.
+
+The solution doxygen provides is a layout file, which you can
+modify and doxygen will use to control what information is presented,
+in which order, and to some extent also how information is presented.
+The layout file is an XML file.
+
+The default layout can be generated
+by doxygen using the following command:
+\verbatim
+doxygen -l
+\endverbatim
+optionally the name of the layout file can be specified, if omitted
+\c DoxygenLayout.xml will be used.
+
+The next step is to mention the layout file in the config file
+\verbatim
+LAYOUT_FILE = DoxygenLayout.xml
+\endverbatim
+The change the layout all you need to do is edit the layout file.
+
+The toplevel structure of the file looks as follows:
+\verbatim
+<doxygenlayout version="1.0">
+ <navindex>
+ ...
+ </navindex>
+ <class>
+ ...
+ </class>
+ <namespace>
+ ...
+ </namespace>
+ <file>
+ ...
+ </file>
+ <group>
+ ...
+ </group>
+ <directory>
+ ...
+ </directory>
+</doxygenlayout>
+\endverbatim
+
+The root tag of the XML is \c doxygenlayout, it has an attribute named
+\c version, which will be used in the future to cope with changes that are
+not backward compatible.
+
+The first section, enclosed by \c navindex tags represents the layout of
+the navigation tabs displayed at the top of each HTML page.
+Each tab is represented by a \c tab tag in the XML file.
+
+You can hide tabs by setting the \c visible attribute to \c no.
+You can also override the default title of a tab by specifying it as
+the value of the \c title attribute. If the title field is the empty string
+(the default) then doxygen will fill in an appropriate title.
+You can reorder the tabs by moving the tab tags in the XML file
+within the \c navindex section and even change the tree structure.
+Do not change the value of the \c type attribute however.
+Only a fixed set of types are supported, each representing a link to a
+specific index.
+
+The sections after \c navindex represent the layout of the different
+pages generated by doxygen:
+- The \c class section represents the layout of all pages generated for
+ documented classes, structs, unions, and interfaces.
+- The \c namespace section represents the layout of all pages generated for
+ documented namespaces (and also Java packages).
+- The \c file section represents the layout of all pages generated for
+ documented files.
+- The \c group section represents the layout of all pages generated for
+ documented groups (or modules).
+- The \c directory section represents the layout of all pages generated for
+ documented directories.
+
+Each XML tag within one of the above page sections represents a certain
+piece of information. Some pieces can appear in each type of page,
+others are specific for a certain type of page.
+Doxygen will list the pieces in the order in which they appear
+in the XML file.
+
+Some tags have a \c visible attribute which can be
+used to hide the fragment from the generated output, by setting the attribute's
+value to "no". You can also use the value of a configuration option to
+determine the visibility, by using
+its name prefixed with a dollar sign, e.g.
+\verbatim
+ ...
+ <includes visible="$SHOW_INCLUDE_FILES"/>
+ ...
+\endverbatim
+This was mainly added for backward compatibility.
+Note that the \c visible attribute is just a hint for doxygen.
+If no relevant information is available for a certain piece it is
+omitted even if it is set to \c yes (i.e. no empty sections are generated).
+
+Some tags have a \c title attribute. This attribute can be used
+to customize the title doxygen will use as a header for the piece.
+
+@warning at the moment you should not remove tags from the layout file
+as a way to hide information. Doing so can cause broken links in the
+generated output!
+
+At the moment the following generic tags are possible for each page:
+<dl>
+<dt>\c briefdescription
+ <dd>Represents the brief description on a page.
+<dt>\c detaileddescription
+ <dd>Represents the detailed description on a page.
+<dt>\c authorsection
+ <dd>Represents the author section of a page (only used for man pages).
+<dt>\c memberdecl
+ <dd>Represents the quick overview of members on a page (member declarations).
+ This tag has child tags each representing a list of
+ members of a certain type.
+ The possible child tags are not listed in detail in the document,
+ but the name of the tag should be a good indication of the type
+ of members that the tag represents.
+<dt>\c memberdef
+ <dd>Represents the detailed member list on a page (member definition).
+ Like the \c memberdecl tag, also this tag has a number of
+ possible child tags.
+</dl>
+
+The class page has the following specific tags:
+<dl>
+<dt>\c includes
+ <dd>Represents the include file needed to obtain the definition for
+ this class.
+<dt>\c inheritancegraph
+ <dd>Represents the inheritance relations for a class.
+ Note that the CLASS_DIAGRAM option determines
+ if the inheritance relation is a list of base and derived classes or
+ a graph.
+<dt>\c collaborationgraph
+ <dd>Represents the collaboration graph for a class.
+<dt>\c allmemberslink
+ <dd>Represents the link to the list of all members for a class.
+<dt>\c usedfiles
+ <dd>Represents the list of files from which documentation for the class was
+ extracted.
+</dl>
+
+The file page has the following specific tags:
+<dl>
+<dt>\c includes
+ <dd>Represents the list of \#include statements contained in this file.
+<dt>\c includegraph
+ <dd>Represents the include dependency graph for the file.
+<dt>\c includedbygraph
+ <dd>Represents the included by dependency graph for the file.
+<dt>\c sourcelink
+ <dd>Represents the link to the source code of this file.
+</dl>
+
+The group page has a specific \c groupgraph tag which represents the
+graph showing the dependencies between groups.
+
+Similarly, the directory page has a specific \c directorygraph tag
+which represents the graph showing the dependencies between the directories
+based on the \#include relations of the files inside the directories.
+
+\section xmlgenerator Using the XML output
+
+If the above two methods still do not provide enough flexibility, you
+can also use the XML output produced by doxygen as a basis to
+generate the output you like. To do this set GENERATE_XML to YES.
+
+The XML output consists of an index file named \c index.xml which
+lists all items extracted by doxygen with references to the other XML files
+for details. The structure of the index is described by a schema file
+\c index.xsd. All other XML files are described by the schema file
+named \c compound.xsd. If you prefer one big XML file
+you can combine the index and the other files using the
+XSLT file \c combine.xslt.
+
+You can use any XML parser to parse the file or use the one that can be found
+in the \c addon/doxmlparser directory of doxygen source distribution.
+Look at \c addon/doxmlparser/include/doxmlintf.h for the interface of the
+parser and in \c addon/doxmlparser/example for examples.
+
+The advantage of using the doxmlparser is that it
+will only read the index file into memory and then only those XML
+files that you implicitly load via navigating through the index. As a
+result this works even for very large projects where reading all XML
+files as one big DOM tree would not fit into memory.
+
+ */
diff --git a/doc/dbusxml.doc b/doc/dbusxml.doc
new file mode 100644
index 0000000..e487126
--- /dev/null
+++ b/doc/dbusxml.doc
@@ -0,0 +1,149 @@
+/*! \page dbusxml DBus XML output format
+
+\addindex dbusxml
+
+<p>Doxygen can generate documentation for DBus XML files. This way
+DBus interfaces can be annotated with doxygen style comments, and
+without writing custom XML parsers. Doxygen extracts its text from
+all XML comments starting with '*' or '!'. An additional '<' can be
+used to assign the documentation string to the previous entity instead
+of the one following the comment.
+
+Note that before the parsing of DBus XML file works one has to
+assign the .xml extension to the DBus XML parser using the
+following configuration option:
+
+\verbatim
+EXTENSION_MAPPING = xml=dbusxml
+\endverbatim
+
+\section dbusxml_supported Supported XML elements and attributes
+
+<p>The following DBus XML elemets can be annotated:
+
+<ul>
+<li><b>interface</b>
+
+<li><b>method</b> or <b>signal</b>
+
+<li><b>arg</b>
+
+<li><b>property</b>
+
+</ul>
+
+Additional elements are supported. These are available once
+the xmlns "http://psiamp.org/dtd/doxygen_dbusxml.dtd" is
+available.
+
+<ul>
+<li><b>namespace</b>: This can be used to group other more of the
+additional elemets. This element requires a <b>name</b> attribute.
+
+<li><b>enum</b> is used to define enums. <b>value</b> element is
+ then used to define the individual values in the enum. This element
+ requires the <b>name</b> and <b>type</b> attributes. A
+ optional <b>named-type</b> attribute is allowed, referrencing typed
+ previously defined by one of the additional elements. A enum name
+ can be used anywhere a type is required using the <b>named-type</b>
+ attribute.
+
+<li><b>flagset</b> is used to define sets of flags. Required and
+ optional attributes are identical to the ones used by <b>enum</b>.
+ While <b>enum</b>s assume the values to be consecutive, while
+ a <b>flagset</b> is values suitable for flags. A flagset name
+ can be used anywhere a type is required using the <b>named-type</b>
+ attribute.
+
+<li><b>struct</b> is used to define structures. A <b>name</b>
+ attribute is required.
+
+<li><b>member</b> is used to define members of <b>structs</b>. It
+ is valid inside <b>struct</b> elements. This
+ element requires <b>name</b> and <b>type</b> attributes. In
+ addition to (or even instead of) the <b>type</b> attribute a
+ <b>named-type</b> attribute may be used to reference types defined
+ by <b>enum</b>, <b>flagset</b> or <b>struct</b>.
+
+\section dbusxml_example Example
+
+<pre>
+<?xml version="1.0" ?>
+<!-- Comment -->
+<!--*< File comment -->
+<node name="/SomeNode" xmlns:dx="http://psiamp.org/dtd/doxygen_dbusxml.dtd">
+ <!--* test struct outside a namespace and interface -->
+ <dx:struct name="StructOutsideNamespace">
+ <!--* member 1 -->
+ <dx:member name="member1" type="s"/>
+ <!--* complex member 1 -->
+ <dx:member name="complexMember1" type="(ssu)"/>
+ </dx:struct>
+
+ <!--* Test flag set -->
+ <dx:flagset name="flagset">
+ <!--* Flag 1 of flagset. -->
+ <dx:value name="FLAG1"/>
+ </dx:flagset>
+
+ <!--* namespace comment -->
+ <dx:namespace name="SomeNamespace">
+ <!--* struct inside a namespace -->
+ <dx:struct name="StructInNamespace">
+ <!--* member 2 -->
+ <dx:member name="member2" type="s"/>
+ </dx:struct>
+ </dx:namespace>
+ <!--* Documentation on the interface -->
+ <interface name="nl.stack.doxygen.test.interface">
+ <!--* Test Enum documentation -->
+ <dx:enum name="TestEnum">
+ <!--* key 1 with value 13 -->
+ <dx:value name="KEY1" value="13"/>
+ <!--* key 2 without a value -->
+ <dx:value name="KEY2"/>
+ </dx:enum>
+
+ <!--* struct inside a interface -->
+ <dx:struct name="StructInInterface">
+ <!--* member 3 -->
+ <dx:member name="member3" type="s"/>
+ <!--* Struct in a struct -->
+ <dx:struct name="StructInAStruct">
+ <!--* member4 -->
+ <dx:member name="member4" type="s"/>
+ </dx:struct>
+ <!--* struct member -->
+ <dx:member name="structMembor" type="(s)" named-type="StructInAStruct"/>
+ </dx:struct>
+ <!--* Document method
+
+ Some extended documentation for the method.
+
+ @param[in] input blah.
+ @param[out] output blub
+ -->
+ <method name="method">
+ <arg direction="in" name="input" type="(s(s))" named-type="::nl::stack::doxygen::test::interface::StructInInterface"/>
+ <arg direction="out" type="v" name="output"/>
+ </method>
+
+ <signal name="signal">
+ <!--*< Documentation for signal.
+
+ @param parameter some parameter.
+ -->
+ <arg name="parameter" type="s"/>
+ </signal>
+
+ <!--* property documentation -->
+ <property name="property" type="s" access="readwrite"/>
+
+ <!--* property documentation read-only -->
+ <property name="propertyRead" type="s" access="read"/>
+ <!--* property documentation write-only -->
+ <property name="propertyWrite" type="s" access="write"/>
+ </interface>
+</node>
+</pre>
+*/
diff --git a/doc/diagrams.doc b/doc/diagrams.doc
new file mode 100644
index 0000000..78fcfbd
--- /dev/null
+++ b/doc/diagrams.doc
@@ -0,0 +1,148 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page diagrams Graphs and diagrams
+
+ Doxygen has built-in support to generate inheritance diagrams for C++
+ classes.
+
+ Doxygen can use the "dot" tool from graphviz to generate
+ more advanced diagrams and graphs. Graphviz is an open-source,
+ cross-platform graph drawing toolkit and can be found
+ at http://www.graphviz.org/
+
+ If you have the "dot" tool in the path, you can set
+ \ref cfg_have_dot "HAVE_DOT" to \c YES in the configuration file to
+ let doxygen use it.
+
+ Doxygen uses the "dot" tool to generate the following graphs:
+ <ul>
+ <li>A graphical representation of the class hierarchy will be drawn, along
+ with the textual one. Currently this feature is supported for HTML only.\n
+ <b>Warning:</b> When you have a very large class hierarchy where many
+ classes derive from a common base class, the resulting image may become
+ too big to handle for some browsers.
+ <li>An inheritance graph will be generated for each documented class showing the
+ direct and indirect inheritance relations. This disables the
+ generation of the built-in class inheritance diagrams.
+ <li>An include dependency graph is generated for each documented file that
+ includes at least one other file. This feature is currently supported
+ for HTML and RTF only.
+ <li>An inverse include dependency graph is also generated showing for
+ a (header) file, which other files include it.
+ <li>A graph is drawn for each documented class and struct that shows:
+ <ul>
+ <li> the inheritance relations with base classes.
+ <li> the usage relations with other structs and classes (e.g.
+ class \c A has a member variable \c m_a of type class \c B, then
+ \c A has an arrow to \c B with \c m_a as label).
+ </ul>
+ <li>if \ref cfg_call_graph "CALL_GRAPH" is set to YES, a
+ graphical call graph is drawn for each function showing the
+ functions that the function directly or indirectly calls.
+ <li>if \ref cfg_caller_graph "CALLER_GRAPH" is set to YES, a
+ graphical caller graph is drawn for each function showing the
+ functions that the function is directly or indirectly called by.
+ </ul>
+
+ Using a \ref customize "layout file" you can determine which of the
+ graphs are actually shown.
+
+ The options \ref cfg_dot_graph_max_nodes "DOT_GRAPH_MAX_NODES" and
+ \ref cfg_max_dot_graph_depth "MAX_DOT_GRAPH_DEPTH" can be used to
+ limit the size of the various graphs.
+
+ The elements in the class diagrams in HTML and RTF
+ have the following meaning:
+ <ul>
+ <li> A \b yellow box indicates a class. A box can have a
+ little marker in the lower right corner to indicate that the class
+ contains base classes that are hidden.
+ For the class diagrams the maximum tree width is currently 8 elements.
+ If a tree is wider some nodes will be hidden.
+ If the box is filled with a
+ dashed pattern the inheritance relation is virtual.
+ <li> A \b white box indicates that the documentation of the class
+ is currently shown.
+ <li> A \b gray box indicates an undocumented class.
+ <li> A <b>solid dark blue</b> arrow indicates public inheritance.
+ <li> A <b>dashed dark green</b> arrow indicates protected inheritance.
+ <li> A <b>dotted dark green</b> arrow indicates private inheritance.
+ </ul>
+
+ The elements in the class diagram in \f$\mbox{\LaTeX}\f$ have the
+ following meaning:
+ <ul>
+ <li> A \b white box indicates a class.
+ A \b marker in the lower right corner of the box indicates that the
+ class has base classes that are hidden.
+ If the box has a \b dashed border this indicates virtual inheritance.
+ <li> A \b solid arrow indicates public inheritance.
+ <li> A \b dashed arrow indicates protected inheritance.
+ <li> A \b dotted arrow indicates private inheritance.
+ </ul>
+
+ The elements in the graphs generated by the dot tool have the following
+ meaning:
+ <ul>
+ <li> A \b white box indicates a class or struct or file.
+ <li> A box with a \b red border indicates a node that has
+ \e more arrows than are shown!
+ In other words: the graph is \e truncated with respect to this node.
+ The reason why a graph is sometimes truncated is to prevent images
+ from becoming too large.
+ For the graphs generated with dot doxygen tries
+ to limit the width of the resulting image to 1024 pixels.
+ <li> A \b black box indicates that the class' documentation is currently shown.
+ <li> A <b>dark blue</b> arrow indicates an include relation (for the
+ include dependency graph) or public inheritance (for the other graphs).
+ <li> A <b>dark green</b> arrow indicates protected inheritance.
+ <li> A <b>dark red</b> arrow indicates private inheritance.
+ <li> A <b>purple dashed</b> arrow indicated a "usage" relation, the
+ edge of the arrow is labeled with the variable(s) responsible for the
+ relation.
+ Class \c A uses class \c B, if class \c A has a member variable \c m
+ of type C, where B is a subtype of C (e.g. C could be \c B, \c B*, <code>T\<B\>*</code> ).
+ </ul>
+
+
+Here are a couple of header files that together show the various diagrams
+that doxygen can generate:
+
+<code>diagrams_a.h</code>
+\verbinclude diagrams_a.h
+<code>diagrams_b.h</code>
+\verbinclude diagrams_b.h
+<code>diagrams_c.h</code>
+\verbinclude diagrams_c.h
+<code>diagrams_d.h</code>
+\verbinclude diagrams_d.h
+<code>diagrams_e.h</code>
+\verbinclude diagrams_e.h
+
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/diagrams/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen<br/>
+ (<code>EXTRACT_ALL</code> = <code>YES</code> is used here).
+ \endhtmlonly
+
+\htmlonly
+Go to the <a href="preprocessing.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
+
diff --git a/doc/docblocks.doc b/doc/docblocks.doc
new file mode 100644
index 0000000..8d6f569
--- /dev/null
+++ b/doc/docblocks.doc
@@ -0,0 +1,483 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page docblocks Documenting the code
+
+\section specialblock Special documentation blocks
+
+A special documentation block is a C or C++ style comment block with some
+additional markings, so doxygen knows it is a piece of documentation that
+needs to end up in the generated documentation. For Python and VHDL
+code there are a different comment conventions, which can be found in section
+\ref pythonblocks and \ref vhdlblocks respectively.
+
+For each code item there are two (or in some cases three) types of descriptions,
+which together form the documentation: a \e brief description and \e detailed
+description, both are optional. For methods and functions there is also a third
+type of description, the so called "in body" description, which consists of
+the concatenation of all comment blocks found within the body of the method or function.
+
+Having more than one brief or detailed description is allowed (but not recommended,
+as the order in which the descriptions will appear is not specified).
+
+As the name suggest, a brief description is
+a short one-liner, whereas the detailed description provides longer,
+more detailed documentation. An "in body" description can also act as a detailed
+description or can describe a collection of implementation details.
+For the HTML output brief descriptions are also
+use to provide tooltips at places where an item is referenced.
+
+There are several ways to mark a comment block as a detailed description:
+<ol>
+<li> You can use the JavaDoc style, which consist of a C-style comment
+block starting with two *'s, like this:
+
+\verbatim
+/**
+ * ... text ...
+ */
+\endverbatim
+
+<li> or you can use the Qt style and add an exclamation mark (!)
+after the opening of a C-style comment block, as shown in this example:
+
+\verbatim
+/*!
+ * ... text ...
+ */
+\endverbatim
+
+In both cases the intermediate *'s are optional, so
+
+\verbatim
+/*!
+ ... text ...
+*/
+\endverbatim
+
+is also valid.
+
+<li> A third alternative is to use a block of <i>at least two</i> C++ comment
+lines, where each line starts with an additional slash or an
+exclamation mark. Here are examples of the two cases:
+
+\verbatim
+///
+/// ... text ...
+///
+\endverbatim
+
+or
+
+\verbatim
+//!
+//!... text ...
+//!
+\endverbatim
+
+Note that a blank line ends a documentation block in this case.
+
+<li>
+
+Some people like to make their comment blocks more visible in the
+documentation. For this purpose you can use the following:
+
+\verbatim
+/********************************************//**
+ * ... text
+ ***********************************************/
+\endverbatim
+(note the 2 slashes to end the normal comment block and start a special comment block).
+
+or
+
+\verbatim
+/////////////////////////////////////////////////
+/// ... text ...
+/////////////////////////////////////////////////
+\endverbatim
+
+</ol>
+
+For the brief description there are also several posibilities:
+<ol>
+<li>One could use the \ref cmdbrief "\\brief" command with one of the
+above comment blocks. This command ends at the end of a paragraph,
+so the detailed description follows after an empty line.
+
+Here is an example:
+
+\verbatim
+/*! \brief Brief description.
+ * Brief description continued.
+ *
+ * Detailed description starts here.
+ */
+\endverbatim
+
+<li>If \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" is set to \c YES
+ in the configuration file,
+ then using JavaDoc style comment
+ blocks will automatically start a brief description which ends at the
+ first dot followed by a space or new line. Here is an example:
+
+\verbatim
+/** Brief description which ends at this dot. Details follow
+ * here.
+ */
+\endverbatim
+The option has the same effect for multi-line special C++ comments:
+\verbatim
+/// Brief description which ends at this dot. Details follow
+/// here.
+\endverbatim
+
+<li>A third option is to use a special C++ style comment which does not
+ span more than one line. Here are two examples:
+\verbatim
+/// Brief description.
+/** Detailed description. */
+\endverbatim
+
+or
+
+\verbatim
+//! Brief description.
+
+//! Detailed description
+//! starts here.
+\endverbatim
+
+Note the blank line in the last example, which is required to separate the
+brief description from the block containing the detailed description. The
+\ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" should also be set to \c NO
+for this case.
+
+</ol>
+
+As you can see doxygen is quite flexible. If you have multiple
+detailed descriptions, like in the following example:
+
+\verbatim
+//! Brief description, which is
+//! really a detailed description since it spans multiple lines.
+/*! Another detailed description!
+ */
+\endverbatim
+
+They will be joined. Note that this is also the case if the descriptions
+are at different places in the code! In this case the order will depend
+on the order in which doxygen parses the code.
+
+Here is an example of a documented piece of C++ code using the Qt style:
+\include qtstyle.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/qtstyle/html/class_test.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+The one-line comments contain a brief description,
+whereas the multi-line comment blocks contain a more detailed description.
+
+The brief descriptions are included in the member overview of a
+class, namespace or file and are printed using a small italic font
+(this description can be hidden by setting
+\ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" to \c NO in
+the config file). By default the brief descriptions become the first
+sentence of the detailed descriptions
+(but this can be changed by setting the \ref cfg_repeat_brief "REPEAT_BRIEF"
+tag to \c NO). Both the brief and the detailed descriptions are optional
+for the Qt style.
+
+By default a JavaDoc style documentation block behaves the same way as a
+Qt style documentation block. This is not according the JavaDoc specification
+however, where the first sentence of the documentation block is automatically
+treated as a brief description. To enable this behavior you should set
+\ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" to YES in the configuration
+file. If you enable this option and want to put a dot in the middle of a
+sentence without ending it, you should put a backslash and a space after it.
+Here is an example:
+\verbatim
+ /** Brief description (e.g.\ using only a few words). Details follow. */
+\endverbatim
+
+Here is the same piece of code as shown above, this time documented using the
+JavaDoc style and \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" set to YES:
+\include jdstyle.cpp
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/jdstyle/html/class_test.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+Similarly, if one wishes the first sentence of a Qt style documentation
+block to automatically be treated as a brief description, one may set
+\ref cfg_qt_autobrief "QT_AUTOBRIEF" to YES in the configuration file.
+
+Unlike most other documentation systems, doxygen also allows you to put
+the documentation of members (including global functions) in front of
+the \e definition. This way the documentation can be placed in the source
+file instead of the header file. This keeps the header file compact, and allows the
+implementer of the members more direct access to the documentation.
+As a compromise the brief description could be placed before the
+declaration and the detailed description before the member definition.
+
+\section memberdoc Putting documentation after members
+
+If you want to document the members of a file, struct, union, class, or enum,
+and you want to put the documentation for these members inside the compound,
+it is sometimes desired to place the documentation block after the member
+instead of before. For this purpose you have to put an additional \< marker
+in the comment block. Note that this also works for the parameters
+of a function.
+
+Here are some examples:
+\verbatim
+int var; /*!< Detailed description after the member */
+\endverbatim
+This block can be used to put a Qt style detailed
+documentation block \e after a member. Other ways to do the
+same are:
+\verbatim
+int var; /**< Detailed description after the member */
+\endverbatim
+or
+\verbatim
+int var; //!< Detailed description after the member
+ //!<
+\endverbatim
+or
+\verbatim
+int var; ///< Detailed description after the member
+ ///<
+\endverbatim
+
+Most often one only wants to put a brief description after a member.
+This is done as follows:
+\verbatim
+int var; //!< Brief description after the member
+\endverbatim
+or
+\verbatim
+int var; ///< Brief description after the member
+\endverbatim
+
+For functions one can use \@param to document the parameters
+and then use <code>[in]</code>, <code>[out]</code>, <code>[in,out]</code>
+to document the direction. For inline documentation this is also possible
+by starting with the direction attribute, e.g.
+\verbatim
+void foo(int v /**< [in] docs for input parameter v. */);
+\endverbatim
+
+Note that these blocks have the same structure and meaning as the
+special comment blocks in the previous section
+only the \< indicates that the member is
+located in front of the block instead of after the block.
+
+Here is an example of the use of these comment blocks:
+\include afterdoc.h
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/afterdoc/html/class_test.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+\warning These blocks can only be used to document \e members and \e parameters.
+ They cannot be used to document files, classes, unions, structs,
+ groups, namespaces and enums themselves. Furthermore, the structural
+ commands mentioned in the next section
+ (like <code>\\class</code>) are not allowed
+ inside these comment blocks.
+
+\section structuralcommands Documentation at other places
+
+So far we have assumed that the documentation blocks are always located \e in
+\e front of the declaration or definition of a file, class or namespace or in
+front or after one of its members.
+Although this is often comfortable, there may sometimes be reasons to put the
+documentation somewhere else. For documenting a file this is even
+required since there is no such thing as "in front of a file".
+
+Doxygen allows you to put your documentation blocks practically
+anywhere (the exception is inside the body of a function or inside a
+normal C style comment block).
+
+The price you pay for not putting the
+documentation block directly before (or after) an item is the need to put a
+structural command inside the documentation block, which leads to some
+duplication of information. So in practice you should \e avoid the use of
+structural commands \e unless other requirements force you to do so.
+
+Structural commands (like all other commands) start with a backslash
+(<tt>\\</tt>), or an at-sign (<tt>\@</tt>) if you prefer JavaDoc style,
+followed by a command name and one or more parameters.
+For instance, if you want to document the class \c Test in the example
+above, you could have also put the following documentation block somewhere
+in the input that is read by doxygen:
+\verbatim
+/*! \class Test
+ \brief A test class.
+
+ A more detailed class description.
+*/
+\endverbatim
+
+Here the special command \c \\class is used to indicate that the
+comment block contains documentation for the class \c Test.
+Other structural commands are:
+<ul>
+<li>\c \\struct to document a C-struct.
+<li>\c \\union to document a union.
+<li>\c \\enum to document an enumeration type.
+<li>\c \\fn to document a function.
+<li>\c \\var to document a variable or typedef or enum value.
+<li>\c \\def to document a \#define.
+<li>\c \\typedef to document a type definition.
+<li>\c \\file to document a file.
+<li>\c \\namespace to document a namespace.
+<li>\c \\package to document a Java package.
+<li>\c \\interface to document an IDL interface.
+</ul>
+See section \ref commands for detailed information about these and many other
+commands.
+
+To document a member of a C++ class, you must also document the class
+itself. The same holds for namespaces. To document a global C function,
+typedef, enum or preprocessor definition you must first document the file
+that contains it (usually this will be a header file, because that file
+contains the information that is exported to other source files).
+
+Let's repeat that, because it is often overlooked:
+to document global objects (functions, typedefs, enum, macros, etc), you
+<em>must</em> document the file in which they are defined. In other words,
+there <em>must</em> at least be a \verbatim /*! \file */ \endverbatim
+or a \verbatim /** @file */ \endverbatim line in this file.
+
+Here is an example of a C header named \c structcmd.h that is documented
+using structural commands:
+\include structcmd.h
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/structcmd/html/structcmd_8h.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+ Because each comment block in the example above contains a structural command, all
+ the comment blocks could be moved to another location or input file
+ (the source file for instance), without affecting the generated
+ documentation. The disadvantage of this approach is that prototypes are
+ duplicated, so all changes have to be made twice! Because of this you
+ should first consider if this is really needed, and avoid structural
+ commands if possible. I often receive examples that contain \\fn command
+ in comment blocks which are place in front of a function. This is clearly
+ a case where the \\fn command is redundant and will only lead to problems.
+
+\section pythonblocks Special documentation blocks in Python
+
+For Python there is a standard way of documenting the code using
+so called documentation strings. Such strings are stored in \c __doc__
+and can be retrieved at runtime. Doxygen will extract such comments
+and assume they have to be represented in a preformatted way.
+
+\include docstring.py
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/docstring/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+Note that in this case none of doxygen's \ref cmd_intro "special commands"
+are supported.
+
+There is also another way to document Python code using comments that
+start with "##". These type of comment blocks are more in line with the
+way documentation blocks work for the other languages supported by doxygen
+and this also allows the use of special commands.
+
+Here is the same example again but now using doxygen style comments:
+
+\include pyexample.py
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/pyexample/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+Since python looks more like Java than like C or C++, you should set
+\ref cfg_optimize_output_java "OPTMIZE_OUTPUT_JAVA" to \c YES in the
+config file.
+
+
+\htmlonly
+Go to the <a href="lists.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+\section vhdlblocks Special documentation blocks in VHDL
+
+For VHDL a comment normally start with "--". Doxygen will extract comments
+starting with "--!". There are only two types of comment blocks in VHDL;
+a one line --! comment representing a brief description, and a multi-line
+--! comment (where the --! prefix is repeated for each line) representing
+a detailed description.
+
+Comments are always located in front of the item that is being documented
+with one exception: for ports the comment can also be after the item
+and is then treated as a brief description for the port.
+
+Here is an example VHDL file with doxygen comments:
+
+\include mux.vhdl
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/mux/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by doxygen.
+ \endhtmlonly
+
+To get proper looking output you need to set
+\ref cfg_optimize_output_vhdl "OPTIMIZE_OUTPUT_VHDL" to \c YES in the
+config file. This will also affect a number of other settings. When they
+were not already set correctly doxygen will produce a warning telling which
+settings where overruled.
+
+\section fortranblocks Special documentation blocks in Fortran
+
+When using doxygen for Fortran code you should
+set \ref cfg_optimize_for_fortran "OPTIMIZE_FOR_FORTRAN" to \c YES.
+
+For Fortran "!>" or "!<" starts a comment and "!!" or "!>" can be used to
+continuate a one line comment into a multi-line comment.
+
+Here is an example of a documented Fortran subroutine:
+\verbatim
+ !> Build the restriction matrix for the aggregation
+ !! method.
+ !! @param aggr information about the aggregates
+ !! @todo Handle special case
+ subroutine IntRestBuild(A,aggr,Restrict,A_ghost)
+ implicit none
+ Type(SpMtx), intent(in) :: A !< our fine level matrix
+ Type(Aggrs), intent(in) :: aggr
+ Type(SpMtx), intent(out) :: Restrict !< Our restriction matrix
+\endverbatim
+
+As a alternative you can also use comments in fixed format code:
+
+\verbatim
+C> Function comment
+C> another line of comment
+ function A(i)
+C> input parameter
+ integer i
+ end function A
+\endverbatim
+
+*/
diff --git a/doc/doxygen.1 b/doc/doxygen.1
new file mode 100644
index 0000000..37e4adb
--- /dev/null
+++ b/doc/doxygen.1
@@ -0,0 +1,46 @@
+.TH DOXYGEN "1" "DATE" "doxygen VERSION" "User Commands"
+.SH NAME
+doxygen \- documentation system for various programming languages
+.SH DESCRIPTION
+Doxygen is a documentation system for C++, C, Java, Objective-C, IDL
+(Corba and Microsoft flavors) and to some extent PHP, C#, and D.
+.PP
+You can use doxygen in a number of ways:
+.TP
+1) Use doxygen to generate a template configuration file:
+.IP
+doxygen [-s] \fB\-g\fR [configName]
+.IP
+If - is used for configName doxygen will write to standard output.
+.TP
+2) Use doxygen to update an old configuration file:
+.IP
+doxygen [-s] \fB\-u\fR [configName]
+.TP
+3) Use doxygen to generate documentation using an existing configuration file:
+.IP
+doxygen [configName]
+.IP
+If - is used for configName doxygen will read from standard input.
+.TP
+4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.
+.TP
+RTF:
+doxygen \fB\-w\fR rtf styleSheetFile
+.TP
+HTML:
+doxygen \fB\-w\fR html headerFile footerFile styleSheetFile [configFile]
+.TP
+LaTeX: doxygen \fB\-w\fR latex headerFile footerFile styleSheetFile [configFile]
+.TP
+5) Use doxygen to generate an rtf extensions file
+.TP
+RTF:
+doxygen \fB\-e\fR rtf extensionsFile
+.PP
+If \fB\-s\fR is specified the comments in the config file will be omitted.
+If configName is omitted `Doxyfile' will be used as a default.
+.SH AUTHOR
+Doxygen version VERSION, Copyright Dimitri van Heesch 1997-2011
+.SH SEE ALSO
+doxytag(1), doxywizard(1).
diff --git a/doc/doxygen.sty b/doc/doxygen.sty
new file mode 100644
index 0000000..4bd82f1
--- /dev/null
+++ b/doc/doxygen.sty
@@ -0,0 +1,323 @@
+%
+%
+%
+% Copyright (C) 1997-2011 by Dimitri van Heesch.
+%
+% Permission to use, copy, modify, and distribute this software and its
+% documentation under the terms of the GNU General Public License is hereby
+% granted. No representations are made about the suitability of this software
+% for any purpose. It is provided "as is" without express or implied warranty.
+% See the GNU General Public License for more details.
+%
+% Documents produced by Doxygen are derivative works derived from the
+% input used in their production; they are not affected by this license.
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+\RequirePackage{calc}
+\RequirePackage{array}
+\RequirePackage{verbatim}
+\pagestyle{fancyplain}
+\addtolength{\headwidth}{\marginparsep}
+\addtolength{\headwidth}{\marginparwidth}
+\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}}
+\lhead[\fancyplain{}{\bfseries\thepage}]
+ {\fancyplain{}{\bfseries\rightmark}}
+\rhead[\fancyplain{}{\bfseries\leftmark}]
+ {\fancyplain{}{\bfseries\thepage}}
+\rfoot[\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2011}]{}
+\lfoot[]{\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2011}}
+\cfoot{}
+
+%---------- Internal commands used in this style file ----------------
+
+% Generic environment used by all paragraph-based environments defined
+% below. Note that the command \title{...} needs to be defined inside
+% those environments!
+\newenvironment{DoxyDesc}[1]{%
+ \begin{list}{}%
+ {%
+ \settowidth{\labelwidth}{40pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{-4pt}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1:]%
+}{%
+ \end{list}%
+}
+
+%---------- Commands used by doxygen LaTeX output generator ----------
+
+% Used by <pre> ... </pre>
+\newenvironment{DoxyPre}{%
+ \small%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+
+% Used by @code ... @endcode
+\newenvironment{DoxyCode}{%
+ \footnotesize%
+ \verbatim%
+}{%
+ \endverbatim%
+ \normalsize%
+}
+
+% Used by @example, @include, @includelineno and @dontinclude
+\newenvironment{DoxyCodeInclude}{%
+ \DoxyCode%
+}{%
+ \endDoxyCode%
+}
+
+% Used by @verbatim ... @endverbatim
+\newenvironment{DoxyVerb}{%
+ \footnotesize%
+ \verbatim%
+}{%
+ \endverbatim%
+ \normalsize%
+}
+
+% Used by @verbinclude
+\newenvironment{DoxyVerbInclude}{%
+ \DoxyVerb%
+}{%
+ \endDoxyVerb%
+}
+
+% Used by numbered lists (using '-#' or <ol> ... </ol>)
+\newenvironment{DoxyEnumerate}{%
+ \enumerate%
+}{%
+ \endenumerate%
+}
+
+% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)
+\newenvironment{DoxyItemize}{%
+ \itemize%
+}{%
+ \enditemize%
+}
+
+% Used by description lists (using <dl> ... </dl>)
+\newenvironment{DoxyDescription}{%
+ \description%
+}{%
+ \enddescription%
+}
+
+% Used by @image, @dotfile, and @dot ... @enddot
+% (only if caption is specified)
+\newenvironment{DoxyImage}{%
+ \begin{figure}[H]%
+ \begin{center}%
+}{%
+ \end{center}%
+ \end{figure}%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if no caption is specified)
+\newenvironment{DoxyImageNoCaption}{%
+}{%
+}
+
+% Used by @attention
+\newenvironment{DoxyAttention}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @author and @authors
+\newenvironment{DoxyAuthor}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @date
+\newenvironment{DoxyDate}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @invariant
+\newenvironment{DoxyInvariant}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @note
+\newenvironment{DoxyNote}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @post
+\newenvironment{DoxyPostcond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @pre
+\newenvironment{DoxyPrecond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @remark
+\newenvironment{DoxyRemark}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @return
+\newenvironment{DoxyReturn}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @since
+\newenvironment{DoxySince}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @see
+\newenvironment{DoxySeeAlso}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @version
+\newenvironment{DoxyVersion}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @warning
+\newenvironment{DoxyWarning}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @internal
+\newenvironment{DoxyInternal}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @par and @paragraph
+\newenvironment{DoxyParagraph}[1]{%
+ \begin{list}{}%
+ {%
+ \settowidth{\labelwidth}{40pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{-4pt}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists
+\newenvironment{DoxyParams}[1]{%
+ \begin{DoxyDesc}{#1}%
+ \begin{description}%
+}{%
+ \end{description}%
+ \end{DoxyDesc}%
+}
+
+% Used by return value lists
+\newenvironment{DoxyRetVals}[1]{%
+ \begin{DoxyDesc}{#1}%
+ \begin{description}%
+}{%
+ \end{description}%
+ \end{DoxyDesc}%
+}
+
+% Used by exception lists
+\newenvironment{DoxyExceptions}[1]{%
+ \begin{DoxyDesc}{#1}%
+ \begin{description}%
+}{%
+ \end{description}%
+ \end{DoxyDesc}%
+}
+
+% Used by template parameter lists
+\newenvironment{DoxyTemplParams}[1]{%
+ \begin{DoxyDesc}{#1}%
+ \begin{description}%
+}{%
+ \end{description}%
+ \end{DoxyDesc}%
+}
+
+\newcommand{\doxyref}[3]{\textbf{#1} (\textnormal{#2}\,\pageref{#3})}
+\newenvironment{DoxyCompactList}
+{\begin{list}{}{
+ \setlength{\leftmargin}{0.5cm}
+ \setlength{\itemsep}{0pt}
+ \setlength{\parsep}{0pt}
+ \setlength{\topsep}{0pt}
+ \renewcommand{\makelabel}{}}}
+{\end{list}}
+\newenvironment{DoxyCompactItemize}
+{
+ \begin{itemize}
+ \setlength{\itemsep}{-4pt}
+ \setlength{\parsep}{0pt}
+ \setlength{\topsep}{0pt}
+ \setlength{\partopsep}{0pt}
+}
+{\end{itemize}}
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}
+\newlength{\tmplength}
+\newenvironment{TabularC}[1]
+{
+\setlength{\tmplength}
+ {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}
+ \par\begin{tabular*}{\linewidth}
+ {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}
+}
+{\end{tabular*}\par}
+\newcommand{\entrylabel}[1]{
+ {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\\}}}
+\newenvironment{Desc}
+{\begin{list}{}
+ {
+ \settowidth{\labelwidth}{40pt}
+ \setlength{\leftmargin}{\labelwidth}
+ \setlength{\parsep}{0pt}
+ \setlength{\itemsep}{-4pt}
+ \renewcommand{\makelabel}{\entrylabel}
+ }
+}
+{\end{list}}
+\setlength{\parindent}{0cm}
+\setlength{\parskip}{0.2cm}
+\sloppy
diff --git a/doc/doxygen_logo.eps b/doc/doxygen_logo.eps
new file mode 100644
index 0000000..6539c3a
--- /dev/null
+++ b/doc/doxygen_logo.eps
@@ -0,0 +1,6322 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 634 197
+%%HiResBoundingBox: 0.000000 0.000000 634.000000 197.000000
+%.........................................
+%%Creator: GNU Ghostscript 705 (epswrite)
+%%CreationDate: 2002/09/28 21:44:36
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+% This copyright applies to everything between here and the %%EndProlog:
+% Copyright (C) 2002 artofcode LLC, Benicia, CA. All rights reserved.
+%%BeginResource: procset GS_epswrite_2_0_1001
+/GS_epswrite_2_0_1001 80 dict dup begin
+/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
+4 index eq and{ pop pop pop}{ PageSize dup 1
+5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
+{ pop/setpagedevice where
+{ pop 1 dict dup /PageSize PageSize put setpagedevice}
+{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
+setpage}if}ifelse}ifelse}ifelse} bind def
+/!{bind def}bind def/#{load def}!/N/counttomark #
+/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
+/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
+/w/setlinewidth #/J/setlinecap #
+/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
+/m/moveto #/l/lineto #/c/rcurveto #
+/p{N 2 idiv{N -2 roll rlineto}repeat}!
+/P{N 0 gt{N -2 roll moveto p}if}!
+/h{p closepath}!/H{P closepath}!
+/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
+/re{4 -2 roll m exch dup lx exch ly neg lx h}!
+/^{3 index neg 3 index neg}!
+/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
+/q/gsave #/Q/grestore #/rf{re fill}!
+/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
+/|={pop exch 4 1 roll 3 array astore cvx exch 1 index def exec}!
+/|{exch string readstring |=}!
+/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
+/@/currentfile #/${+ @ |}!
+/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
+3 1 roll}repeat pop pop true}!
+/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
+/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
+/Ic{exch Ix false 3 colorimage}!
+/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
+/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
+/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
+/@F{@ &2<<F}!/@C{@X &2 FX}!
+/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
+/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
+/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
+currentdict end image}!
+/~{@ read {pop} if}!
+end readonly def
+%%EndResource
+/pagesave null def
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+GS_epswrite_2_0_1001 begin
+/pagesave save store 100 dict begin
+0.1 0.1 scale
+%%EndPageSetup
+gsave mark
+K
+0 0 0 0 rf
+Q q
+0 0 250000 0 0 250000 ^ Y
+q[6340 0 0 1970 0 0]concat
+634 197 8[634 0 0 -197 0 197]@X false 3
+colorimage
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.]_qcA
+r;N/?b*;hr`rH)=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+r;OA/s8W#r]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.Rf*/Rr;N/_gkY.I\c;^0
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.]_qcA
+r;OA,rk/1.]_qbtr;OA,rgNcaRf*/tr;N/_rgNcaRf*/8r;M6EgkY+:X8MV0s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W#r]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.]_qcAr;OA,rk/1.Rf*/t
+r;OA,rgNcaRf*/Rr;N/_rdaq=Qi-i5r;N/_rk/1$Qi-3gs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.]_qcA
+r;OA,rk/1.]_qcAr;N/_rk/1.]_qcAr;OA,rk/1.Rf*/tr;OA,rgNca]_qbtr;N/_rgNcaJGfD8
+r;M6ErgNcaRf*/tr;OA,rgNcWEW?(=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#rRf*/tr;N/_rk/1.]_qcAr;N/_rk/1.]_qcA
+r;OA,rgNca]_qbtr;OA,rk/1.Rf*/tr;N/_rk/1.Rf*/8r;N/_rdaqGJGfD8r;N/_rk/1.Rf*/R
+r;M6Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!r;OA,rk/1.]_qcAr;N/_rk/1.]_qcAr;N/_rk/1.]_qcAr;OA,rgNca]_qbt
+r;OA,rgNcaRf*/Rr;N/_rgNcaJGfD8r;M6ErdaqG]_qcAr;N/_rgNcaJGfDZs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#rRf*/t
+r;N/_rk/1.]_qcAr;OA,rgNca]_qcAr;N/_rk/1.Rf*/tr;OA,rgNcaRf*/tr;N/_rk/1.Rf*/8
+r;N/_rdaqGJGfCsr;N/_rk/1.]_qbZr;M6Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.Rf*/tr;OA,rk/1.Rf*/t
+r;OA,rgNca]_qcAr;N/_rk/1.Rf*/tr;N/_rgNcaRf*/Rr;N/_rdaqGJGfD8r;M6ErgNcaRf*/t
+r;N/_rdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W#r]_qbtr;OA,rk/1.Rf*/tr;OA,rk/1.]_qcAr;OA,rk/1.Rf*/t
+r;N/_rgNca]_qbtr;OA,rgNcaRf*/8r;M6ErgNcaJGfCsr;N/_rgNcaRf*/8r;M6Hs8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+r;N/_rk/1.Rf*/tr;OA,rgNca]_qbtr;OA,rgNca]_qbtr;OA,rgNca]_qbtr;N/_rgNcaRf*/R
+r;N/_rdaqGRf*/8r;N/_rdaqG]_qcAr;N/_rdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#rRf*/tr;OA,rk/1.Rf*/t
+r;OA,rk/1.Rf*/tr;OA,rk/1.Rf*/tr;N/_rgNcaRf*/tr;N/_rgNcaRf*/8r;M6ErgNcaJGfCs
+r;N/_rgNcaRf*/8r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq>^Kpr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/tr;OA,rgNcaRf*/t
+r;N/_rk/1.Rf*/tr;N/_rgNcaRf*/Rr;N/_rdaqGJGfD8r;M6ErgNcaRf*/tr;N/_rdaqGJH,ZL
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Yrk/1.]_qcAr;OA,rgNca]_qcAr;N/_rk/1.Rf*/tr;OA,rgNca]_qbtr;OA,rgNcaRf*/R
+r;N/_rgNcaRf*/8r;M6ErdaqGRf*/8r;N/_rgNcaRf*/8r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp&G'lr;N/_rgNca]_qcA
+r;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/Rr;OA,rgNcaRf*/Rr;M6ErdaqGJGfD8
+r;M6ErdaqG]_qbtr;N/_rdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d9oZ$h.Rf*/tr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/t
+r;N/_rk/1.]_qbtr;OA,rgNcaRf*/Rr;N/_rgNcaRf*/8r;M6ErgNcaJGfCsr;N/_rgNcaJGfCs
+r;N/_rk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-ilnkPXtlr;OA,rgNca]_qbtr;OA,rgNca]_qbtr;OA,rgNca]_qbtr;OA,rgNca]_qbt
+r;N/_rgNcaRf*/Rr;M6ErdaqGJGfD8r;M6ErdaqGRf*/Rr;M6ErdaqGJGfDZs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9oZ$h.Rf*/t
+r;N/_rk/1.Rf*/tr;N/_rgNca]_qbtr;OA,rgNca]_qcAr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8
+r;M6ErgNcaJGfCsr;N/_rdaqGRf*/8r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkPXtlr;OA,rgNca]_qbtr;OA,rgNca]_qbt
+r;N/_rk/1.Rf*/tr;N/_rgNca]_qbtr;N/_rgNcaRf*/Rr;M6ErdaqGJGfD8r;M6ErdaqGRf*/R
+r;M6ErdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726kj7d9oZ$h.Rf*/Rr;N/_rgNca]_qbtr;N/_rgNca]_qbtr;OA,rgNca]_qcA
+r;N/_rgNca]_qbtr;N/_rgNcaRf*/8r;N/_rdaqGJGfCsr;N/_rdaqGJGfCsr;M6Erk/:2s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n,2gt
+r;OA,rgNca]_qbtr;N/_rk/1.Rf*/tr;N/_rgNca]_qbtr;OA,rgNca]_qbtr;N/_rgNcaRf*/R
+r;N/_rdaqGRf*/8r;M6ErdaqGJGfCsr;N/_rdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVi8j)!oZ$h.Rf*/tr;N/_rk/1.Rf*/R
+r;N/_rgNca]_qbtr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/tr;N/_rk/1.Rf*/8r;M6ErgNcaJGfCs
+r;N/_rdaqGJGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_&&kOeKDr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/t
+r;N/_rk/1.Rf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8r;M6ErdaqGJGfCsr;M6ErdaqGJGfDZ
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
+kj7d9oZ$h.Rf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/Rr;OA,rgNca]_qbt
+r;OA,rgNca]_qbZr;N/_rgNcaJGfCsr;M6ErdaqGJGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n,2gtr;N/_rgNcaRf*/R
+r;N/_rgNcaRf*/Rr;N/_rgNcaRf*/Rr;OA,rgNca]_qbtr;OA,rgNcaRf*/tr;N/_rdaqGRf*/8
+r;N/_rdaqGJGfCsr;M6Erdaq=EW#gKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7d9oZ$h.Rf*/Rr;N/_rgNcaRf*/8r;N/_rgNcaJGfD8
+r;N/_rgNcaRf*/Rr;OA,rgNcaRf*/tr;N/_rgNcaRf*/Rr;N/_rgNcaJGfCsr;M6EoPsg.JGfCs
+r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_>6n,2Ojr;N/_rdaqGRf*/8r;N/_rgNcaJGfD8r;M6ErgNcaJGfD8r;N/_rgNcaRf*/R
+r;OA,rgNcaRf*/tr;N/_rdaqGJGfCsr;M6ErdaqGJGfCsr;M6Erdaq=EW#gKs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7d9oZ$h.JGfD8
+r;M6ErgNcaJGfCsr;N/_rdaqGRf*/8r;N/_rdaqGRf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8
+r;N/_rdaqGJGfD8r;M6EoPsg.JGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n+Z23r;M6ErgNcaJGfD8r;M6ErgNcaJGfCs
+r;M6ErgNcaJGfD8r;N/_rgNcaRf*/Rr;N/_rgNca]_qbtr;N/_rgNcaJGfCsr;M6ErdaqGJGfCs
+r;M6ErdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726kj7d9oZ$h.JGfCsr;N/_rdaqGJGfCsr;M6ErgNcaJGfCsr;N/_rdaqGRf*/R
+r;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6Erk/:2s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kPXtl
+r;N/_rdaqGJGfD8r;M6ErgNcaJGfCsr;M6ErgNcaJGfD8r;M6ErgNcaRf*/Rr;N/_rgNcaRf*/R
+r;N/_rdaqGJGfCsr;N/_rdaqGJGfCsr;M6ErdaqGJGfDZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d9oZ$h.Rf*/8r;N/_rdaqGJGfCs
+r;M6ErdaqGRf*/8r;M6ErdaqGRf*/Rr;N/_rgNcaRf*/Rr;N/_rgNcaRf*/8r;M6ErdaqGJGfCs
+r;M6ErdaqGJGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_>6n,2Ojr;M6ErgNcaJGfCsr;N/_rdaqGRf*/8r;M6ErgNcaRf*/8
+r;N/_rdaqGRf*/Rr;N/_rgNcaRf*/Rr;N/_rdaqGJGfCsr;M6Erdaq=EW#HKr;M6ErdaqGJGfDZ
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<
+kj7d9oZ$h.JGfCsr;M6ErgNcaJGfCsr;M6ErdaqGRf*/8r;M6ErgNcaRf*/Rr;M6ErgNcaRf*/R
+r;N/_rgNcaRf*/8r;M6ErdaqGJGf%Zr:G",oPsg.JGfCsr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kPXtlr;N/_rdaqGJGfCs
+r;M6ErgNcaJGfD8r;M6ErgNcaJGfD8r;M6ErgNcaRf*/Rr;M6ErgNcaRf*/Rr;M6ErdaqGJGf%Z
+r;M6EoPsg$EW#fdr;M6Erdaq=EW#gKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9oZ$h.JGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGfD8
+r;M6ErgNcaJGfD8r;M6ErgNcaRf*/Rr;M6ErgNcaJGfCsr;M6Erdaq=EW#HKr:G",oPsg.JGfCs
+r;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+QpA*q=n,2Ojr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGfD8r;N/_rgNcaRf*/R
+r;M6ErgNcaRf*/Rr;M6Erdaq=EW#HKr:G",oPsg$EW#HKr;M6Erdaq=EW#gKs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7d9m)8i$JGfCs
+r;M6ErdaqGJGfCsr;N/_rdaqGJGfCsr;N/_rdaqGJGfD8r;M6ErgNcaJGfD8r;M6ErdaqGJGf%Z
+r;M6EoPsg$EW#HKr:G",rdaq=EW#HKr;M6Erk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n,2Ojr;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
+r;N/_rdaqGRf*/8r;N/_rdaqGRf*/8r;N/_rdaqGRf*/Rr;M6Erdaq=EW#HKr8qbloPsg$EW#HK
+r;M6EoPsg$EW#gKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726kj7d9m)8i$JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfD8r;M6ErgNcaJGfD8
+r;M6ErgNcaJGfCsr;M6ErdaqGJGf%Zr:G",oPsfkCAd^Dr:G",rdaq=EW#HKr:G",rk/:2s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n,2Oj
+r;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;N/_rdaqGRf*/8r;N/_rdaqGJGfCsr;N/_rdaqGRf*/8
+r;M6EoPsg$EW#HKr8qblk%ahdEW#HKr;M6EoPsfqG5V?Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d9m)8i$JGfCsr;M6ErdaqGJGfCs
+r;M6ErdaqGRf*/8r;N/_rdaqGJGfCsr;N/_rdaqGJGfCsr;M6ErdaqGJGf%Zr:G",k%ahVCAd4/
+r:G",oPsg$EW#HKr8qblrk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_>6n,2Ojr;M6ErdaqGJGfCsr;M6ErdaqGRf*/Rr;M6ErgNcaJGfCs
+r;M6ErdaqGJGfCsr;N/_rdaqGRf*/8r;M6EoPsg$EW"s6r8qblk%ahdEW#HKr:G",oPsg$EW#gK
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<
+kj7d9m)8i$JGfCsr;M6ErdaqGJGfD8r;M6ErdaqGRf*/8r;M6ErgNcaJGfCsr;M6ErdaqGJGfCs
+r;M6ErdaqGJGebWr:G",k%ahVCAd4/r8qbloPsg$EW#HKr8qblrk/:2s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n,2Ojr;M6ErdaqGJGfCs
+r;M6ErdaqGJGfD8r;M6ErgNcaJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfD8r;M6EoPsfkCAd4/
+r8qblk%ahdEW#HKr:G",oPsfqG5V?Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9m)8i$JGfCsr;M6ErdaqGJGfD8r;M6ErgNcaJGfCs
+r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGf%Zr8qblk%ahVCAd4/r8qbloPsg$EW#HK
+r9SV)rk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_>6n,2Ojr;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
+r;M6ErdaqGJGfCsr;M6EoPsfkCAd4/r8qblk%ahVCAd^Dr9SV)lur=!EW#IKs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9m)8i$JGfCs
+r;M6ErdaqGJGfD8r;M6ErdaqGJGfD8r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGf%Z
+r8qblk%ahLB)Le+r8qbloPsg$EW#HKr9SV)rk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kPX\br;M6ErdaqGJGfCsr;M6ErdaqGRf*/8
+r;N/_rdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6Elur<hCAd4/r8qblk%ahVCAd^D
+r9SV)oPsg$EW#IKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<[_Gkj7d9m)8i$JGfCsr;M6ErdaqGJGfD8r;M6ErgNcaJGfCsr;M6ErdaqGJGfCs
+r;M6ErdaqGJGfCsr;M6ErdaqGJGf%Zr8qblk%ahVCAd4/r8qbloPsfqG5UuPr9SV)rk/:2s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kPX\b
+r;M6ErdaqGJGfCsr;M6ErdaqGJGfD8r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
+r;M6Ek%ahVCAd4/r7ko^k%ahVCAdFAr9SV)oPsg$EW#IKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d9m)8i$JGfCsr;M6ErdaqGJGfCs
+r;M6ErdaqGRf*/8r;N/_rdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGebWr8qblk%ahVCAd4/
+r8qbloPsfqG5UuPr8qblrk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_&&kPX\br;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;M6ErdaqGJGfCs
+r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6Ek%ah\G5UK;r8qblk%ah\G5U]Mr9SV)oPsfkCAe(D
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+kj7d9m)8i$JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;N/_rdaqGRf*/8r;M6ErdaqGJGfCs
+r;M6ErdaqGJGePEr8qblgh-KHCAdFAr8qbllur<nG5U]Mr8qbloZ$q2s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kPX\br;M6ErdaqGJGfCs
+r;M6ErdaqGJGfCsr;M6ErdaqGRf*/8r;M6ErdaqGRf*/8r;M6ErgNcaJGfCsr;M6Ek%ah\G5UK;
+r8qblk%ah\G5UK;r9SV)oPsfkCAd^js8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d9m)8i$JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGRf*/8
+r;M6ErgNcaJGfD8r;M6ErdaqGJGfCsr;M6ErdaqGJGePEr8qblgh-KHCAdFAr9SV)k%ah\G5UK;
+r7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_&&kPX\br;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErgNcaJGfCsr;N/_rdaqGJGfD8
+r;M6ErgNcaJGfCsr;M6Ek%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahLB)M:fs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVi8j)!m)8i$JGfCs
+r;M6ErdaqGJGfCsr;M6ErgNcaJGfCsr;N/_rdaqGJGfD8r;M6ErgNcaJGfCsr;M6Erdaq=EW"s6
+r7ko^gh-KHCAd4/r8qblk%ahVCAd4/r7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kPX\br;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
+r;M6ErgNcaJGfCsr;N/_rdaqGJGfCsr;N/_rdaqGJGfCsr;M6Egh-K>B)LFrr8qblk%ahVCAck!
+r8qblk%ahLB)M:fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VHWp%7tRi8j)!m)8i$JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGfCs
+r;N/_rdaqGJGfCsr;M6ErdaqGJGe27r7ko^gh-K>B)LFrr8qblgh-K>B)Le+r7ko^oZ$q2s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kPX\b
+r:G",rdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;N/_rdaqGJGfCsr;M6ErdaqGJGfCs
+r:G",k%ahD@JnV`r7ko^gh-K>B)LFrr7ko^k%ahLB)M:fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d8jMCcnJGf%Zr;M6ErdaqGJGfCs
+r;M6ErdaqGJGfCsr;N/_rdaqGJGfCsr;M6ErdaqGJGfCsr;M6Erdaq=EW"<pr7#0Qe7&:)@Jnnm
+r7ko^e7&:1B)LFrr7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_&&kPO>Vr:G",rdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
+r;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr:G",e7&:)@Jn>Tr7#0Qe7&:)@JnV`r7#0Qgh-K6@Joc;
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+kj7d9m)8hoEW#HKr:G",oPsg.JGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr;M6ErdaqGJGfCs
+r;M6Erdaq=EW"<pr6/IEb[(.j?2VoPr7#0Qb[(.r@JnV`r7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n,)1^r:G",oPsg$EW#HK
+r:G",oPsg.JGf%Zr;M6ErdaqGJGfCsr;M6ErdaqGJGfCsr:G",rdaq=EW#HKr9SV)e7&:!?2VoP
+r6/IEb[(.j?2VoPr6/IEe7&:)@JoGZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j)!m)8haCAd4/r:G",oPsg$EW#HKr:G",oPsg$EW#HK
+r:G",oPsg.JGfCsr;M6EoPsg$EW#HKr:G",oPsfkCAc:]r5;b9b[(.b=o?3@r6/IE`**#^?2VoP
+r7#0QoZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_>6n,)1^r8qblk%ahdEW#0Hr:G",oPsg$EW#HKr:G",oPsg$EW#HKr:G",oPsg$EW#HK
+r:G",oPsfqG5UuPr8qbl`**#V=o>p3r5;b9]N"gI=o?3@r5;b9`**#^?2X?7s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVi8j(ujMCcVCAd4/
+r8qblk%ah\G5U]Mr9SV)lur<nG5U]Mr9SV)lur=!EW#HKr9SV)oPsfqG5UuPr8qbllur<^B)K;@
+r5;b9`**#V=o>p3r5;b9]N"gA<;a[;r6/IEm)8r(s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n,)1^r8qblk%ahVCAd4/r8qblk%ahVCAd4/
+r8qbllur<hCAdFAr9SV)lur<nG5U]Mr9SV)k%ah\G5UK;r7ko^]N"gI=o>p3r4H#,]N"gI=o>p3
+r4H#,]N"gQ?2X#Vs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+(Hp#tc2i8j(tgopY2B)LFrr8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAdFA
+r8qblk%ahVCAd4/r8qblk%ahD@Jmc;r5;b9]N"gA<;a+"r4H#,]N"gA<;aC.r5;b9m)8r(s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W#r]`8$3s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/r:J#,oU#LARJcDpr9KdKl^@\:RJc]D
+r:J#,oZ$h$`r,JKs8W,soZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o.jQGI^kPEu;
+r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^k%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahLB)Le+
+r7#0Q]N"gA<;aC.r4H#,Zr$\5<;a+"r3T;uZr$\5<;c'Ms8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#rRf)fEr8qblk%ahVCAd4/
+r8qblk%ahVCAd4/r9SV)lur<mRJc]Dr:J#,oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,soZ$gaL]#Y1r7#0Qe7&:)@Jnnmr7ko^e7&:)@Jnnmr7#0Qgh-K>B)LFrr8qblgh-K6@Jn>T
+r5;b9]N"gA<;a[;r4HkDc%GrDM#,o1qrGTfm-!U!n)39ig"bH\gopY2B)LFrr7ko^gh-K6@Jnnm
+r7#0Qgh-K>B)LFrr7ko^gh-K>B)LFrr8qblgh-K>B)LFrr7ko^gh-K.?2V'+r3T;u]N"g9;#ICg
+r4H#,Zr$\%9`1tcr3T;um)8r(s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!r;OA,lur<hCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/
+r8qblk%ahLB)LFrr7#0Q`**#N<;a[;qV8:PoZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!r:H?Rk%ahD@JmK/r4H#,e;4%p`rH)=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8;kbr:G",lur=!QiI*cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,srk/1.Rf)et
+r9SV)lur<nG5V!Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,soZ$gQ?2Wi"r9SV)rgNles8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,rk/1.]_qcAr;OA/s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;N/r9VAugopS0YPdFS
+r9KdKlur<nG5UK;r9SV)lur<hCAd4/r8qblk%ah\G5V!!r;N/bs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o:oC_JAp$D;C
+m.9oBpA+(Hp%7tRs8W,kpA+@Sq=j7=r9VB"m)8e^_>;rjqV8:Pj.ZD2U&=5Er9KdKlur<nG5UK;
+r9SV)lur<nG5V!!r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r9KdKe7&9n=o?KLr6/IEb[(.j?2W2\
+r7#0Qe7&:)@JnV`r7ko^e7&:)@Jnnmr7ko^gh-K>B)LFrr8qblgh-K>B)LFrr6/IE]N"g9;#ICg
+r2`TiUe(Eb9`1\Wr3T;u]PQfTX8:&;r7#0Qe7&:)@JnV`r7#0Qe7&:1B)L.er7ko^e7&:1B)LFr
+r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr6/IEZr$\-;#I[sr3T;uXA&Q!;#I[sr2`TiXA&Q!;#K@I
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/r8qblk%ahVCAck!
+r8qblgh-K>B)LFrr8qblk%ahLB)Le+r7ko^gh-KHCAck!r7ko^k%ahLB)LFrr7ko^gh-K>B)LFr
+r7ko^b[(.Z<;`gkr2`Ti`*)rlYQ+Y&s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r:G",k%ahVCAd4/
+r8qbl`**#>9`1tcr4H#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,slur<nG5U]M
+r:G",k%ahSU&Y/ms8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;N/_lur<hCAd4/r8qblk%ahVCAd4/r8qblgh-Tds8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s89f<r7#0Qgh-K>B)LFrr7ko^k%ahdEW#gKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+r;OA,rk/1$EW#0Hr9SV)lur<nG5U]Mr9SV)lur<nG5UuPr:G",lur=!EW#HKr:H?RrgNca]_qcA
+r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq=OCVqrGTigopRnM>Y"cr2`TiZr$\==o@&er9SV)lur<hCAdFAr9SV)k%ahVCAdFA
+r8qblk%ahVCAd4/r8qbllur<nG5UuPr:G",oPsg.]_qcAs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+r9VB"m)8hg`;AW3r9KdKl^@\2U&=5Er9KdKlur<nG5U^Fkj7crjQGd\\bag[qSe<h]PRMQ;#ICg
+r3T;uXA&Pn9`27or5;b9e7&:;CAd4/r9SV)k%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/
+r8qbloU#LT]`8$3s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8;6%r6/IE`**#V=o?3@r5;b9]N"gI=o?KLr5;b9b[(.j?2VoPr7#0Qe7&:)@JnV`
+r7ko^e7&:1B)LFrr7ko^e7&:1B)LFrr7#0Qgh-K6@JnV`r5;b9Zr$\%9`1\Wr1lm]Ue(ER6N!WM
+r1lm]Zr$\E?2W2\r6/IEe7&:)@JnV`r7#0Qe7&:1B)L.er7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
+r7#0Qe7&9n=o>?pr3T;uZr$\%9`1tcr2`TiUe(EZ8Go8Sr2`ThjMClrs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W#r]_po,r7ko^gh-K>B)L.er7ko^gh-K>B)LFrr7ko^gh-K>B)LFr
+r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7#0Qe7&:)@Jnnmr7#0Qe7&9n=o>?p
+r1lm]XA&Q)<;PCRs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r9SV)k%ahVCAd4/r8qblk%ahVCAd4/r3T;uXA&Pn9`2h3
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#`G5UK;r9SV)k%ahVCAdFAr9SV)k%ah[RK*<e
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#r]_qDg
+r8qblk%ahVCAd4/r7ko^k%ahLB)Le+r7ko^k%ahVCAck!r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!qrGTk`**#nB)LFr
+r7ko^gh-K>B)LFrr7ko^k%ahVCAdFAr;N/bs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,sm)8h^U&=5Er9SV)oPsg$EW#HKr9SV)lur<nG5U]M
+r8qblk%ah\G5U]Mr9SV)lur<hCAdFAr9SV)lur<nG5U]Mr9SV)lur<nG5U]Mr:G",lur<nG5U]M
+r:G",oU#LJQi-iOr;OA,rk/1.]_qcAr;OA/s8W#r]`8$3s8W,srk/:2s8;l/s8W,srk/1.]_qcA
+r;OA,rgNles8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n+thCqSe<hZr$\%9`1tc
+r3T;u`**#nB)Le+r9SV)k%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/
+r9SV)lur<nG5U]Mr9SV)lur<nG5V!!r;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8V`bq=OCVm.9o:oC_JAp$D;C
+m.9oBpA+@Sq=j7=r9VB!jMC`S_>N>er8XLKgkYg_L]#Y1r7#0Qgh-KHCAd4/r9SV)lur<hCAdFA
+r9SV)lur<hCAd4/r9SV)e;4"/Er<:@r2`TiXA&Q!;#ICgr3T;uXA&Pn9`2h3r7#0Qk%ahVCAd4/
+r8qblk%ahVCAd4/r8qblgh-K>B)LFrr7ko^gh-K>B)Le+r7ko^k%ahLB)Le+r7ko^lur=!`rH)=
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8:oNr5;b9]N"gI=o>p3
+r4H#,]N"gA<;a[;r4H#,`**#V=o?KLr6/IEb[(.r@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:1B)L.e
+r7#0Qe7&:)@JnV`r7#0Qe7&:!?2VoPr4H#,Ue(EZ8Go8Sr1lm]S3m.D6N!oYr6/IEb[(.j?2VoP
+r6/IEb[(.r@JnV`r6/IEe7&:)@Jn>Tr7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r5;b9XA&Pn9`1tc
+r2`TiXA&Pn9`1\Wr1lm]S3m.L8GqMAs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#hQi,WN
+r7ko^e7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:1B)LFrr7ko^gh-K>B)LFrr7ko^e7&:)@Jnnm
+r7#0Qgh-K>B)L.er7#0Qe7&:)@JnV`r7#0Qb[(.r@JnV`r6/IEe7&9n=o>?pr1$+OUe(Eb9`2P>
+r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/
+r9SV)gh-K>B)LFrr7ko^k%ahLB)Le+r7ko^k%ah<?2Uctr1lm]Zr$\\U&Y/ms8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8;5,r8qblk%ahVCAd4/r8qblk%ah\G5UK;r8qblgh-KMRK*<es8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r;OA,oU#LBG5UK;r8qblk%ahVCAd4/r7ko^gh-K>B)LFr
+r7ko^gh-K>B)L.er7ko^gh-K6@K6B-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#0D#DL_r7ko^e7&:1B)LFrr7#0Qgh-K>B)LFr
+r7ko^k%ahLB)Le+r8qbllur=+]`8$3s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+qV8:Pe;4%P@JoJ8r9SV)lur<nG5U]Mr9SV)lur<nG5UK;r8qblk%ahVCAd4/r8qblk%ahVCAd4/
+r9SV)k%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r9SV)k%ah\G5U]M
+r9SV)lur<nG5U]Mr9SV)k%ahVCAdFAr9SV)lur<hCAdFAr9SV)lur<hCAd^js8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq=OCVm.9o6m-j2l\ba:%r3T;uUe(Eb9`1tcr4H#,e7&:;CAdFAr9SV)k%ahVCAd4/
+r8qblk%ahVCAd4/r8qblgh-KHCAck!r7ko^gh-K>B)LFrr8qblk%ahVCAdFAr9SV)lur<hCAd4/
+r8qblk%ahLL]$L^r:H?Us8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq=OCVm.9o:oC_JAp#tc2l.NWCgsP?/X89elqSe<h]SQHlEr<:@r2`TiUe(Er<;bln
+r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblgkYgoG5UK;r8qblk%ahVCAd4/r8qblk%ahVCAb_D
+r2`TiXA&Pn9`1tcr2`TiXA&Pn9`27or7ko^k%ahVCAd4/r7ko^gh-K>B)LFrr7ko^e7&:1B)LFr
+r7ko^gh-K6@Jnnmr7ko^e7&:1B)LFrr7ko^gh-K>B)LFrr7ko^k%ah\`;fl;s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8:Z-r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r4H#,]N"gA<;a[;
+r5;b9`**#^?2VWDr6/IEb[(.r@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@Jn>Tr6/IEb[(.j?2VoP
+r5;b9b[(.b=o?3@r2`TiS3m.D6N!WMr1$+OUe(F%=o?3@r6/IEb[(.j?2VoPr6/IEb[(.j?2VoP
+r5;b9b[(.j?2VoPr6/IEb[(.j?2VoPr6/IEb[(.b=o>?pr2`TiXA&Pn9`1DIr2`TiS3m.D6N!??
+r1$+NjMClrs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#_RJbQCr7#0Qb[(.r@Jn>Tr6/IEe7&:!?2VoP
+r6/IEe7&:!?2W2\r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
+r6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEe7&9f<;`gkr1$+OUe(EZ8GohkqV8:Ss8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;l/r7m)*gh-K6@Jnnmr7ko^gh-K>B)LFr
+r7ko^gh-KHCAck!r7ko^]N"g)8Go8Sr3T<#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r9KdKgh-K>B)LFr
+r8qblgh-KHCAd4/r8qbllur<hCAdFAr7m)*e7&:8U&Y/ms8W-!s8W-!s8W-!s8W-!s8W-!s8;MU
+r8qblk%ahVCAd4/r8qblk%ahVCAd4/r7ko^gh-K6@Jnnmr7#0Qe7&:)@Jn>Tr7#0Qe7&:)@JnV`
+r7#0QoZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV
+o_/+QpA+@Sq>/mMr4H#,e7&:1B)L.er7#0Qe7&:)@Jnnmr7ko^gh-K>B)LFrr7ko^gh-K>B)LFr
+r7ko^k%ah\G5V?.s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8(NSqSe<h`**#nB)Le+r9SV)k%ahVCAdFA
+r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAck!r7ko^k%ahLB)LFr
+r8qblgh-KHCAck!r8qblgh-KHCAck!r8qblgh-K>B)Le+r8qblk%ahVCAdFAr8qblk%ahVCAd4/
+r8qblk%ahVCAd4/r8qblk%ah\G5UK;r9SV)rk/:2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Cm.9o.jQHB`VYd`@
+r1lm]XA&Pf8GoP_r4H#,gh-KHCAd4/r8qblk%ahVCAd4/r8qblk%ahVCAd4/r8qblk%ahLB)LFr
+r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr8qbllur<hCAd4/r8qblk%ahLB)Le+r8qblgh-KHCAd4/
+r9SV,s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o6m-j0)n)39i
+i8j(t`JOMo9`1\Wr1$+OUe(EZ8Go8Sr2`TiUe(EZ8Go8Sr4H#,gh-K>B)LFrr8qblgh-KHCAck!
+r8qblgh-KHCAd4/r8qblk%ahLL]$:Lr7m)*k%ahLB)Le+r8qbl]N"g19`1\Wr2`TiXA&Pn9`1\W
+r6/IEgh-KHCAck!r7ko^gh-K>B)LFrr7#0Qgh-K6@Jnnmr7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
+r7ko^gh-K>B)L.er7#0Qgh-K6@JnV`r7ko^gh-KV`rH)=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8:Z-
+r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r5;b9`**#V=o?KL
+r6/IEb[(.j?2W2\r6/IEb[(.j?2VoPr6/IEb[(.b=o?3@r5;b9`**#V=o?3@r4H#,`**#N<;a+"
+r1$+OS3m.D6N!WMr5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#^?2VWD
+r6/IEb[(.b=o?KLr4H#,Ue(EZ8Go8Sr1$+OS3m.L8GnuEr1$+OS3m.D6N#l;s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W#_RJbQCr6/IEb[(.j?2VoPr6/IEb[(.j?2VWDr6/IE`**#^?2VWDr6/IEb[(.j?2VoP
+r7#0Qe7&:!?2W2\r7#0Qe7&:!?2W2\r7#0Qe7&:!?2VoPr6/IEb[(.j?2VoPr5;b9b[(.j?2VoP
+r6/IE`**#^?2VWDr5;b9`**#F;#HhMr1$+OPX55C8GoP_qV8:Ss8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8;N/r7#0Qb[(.r@JnV`r7#0Qe7&:)@JnV`r7ko^gh-K>B)LFrr7ko^gh-K>B)L.e
+r2`TiS3m.L8Gp,:s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Ym)8hO@JnV`r7#0Qgh-K6@Jnnmr7ko^gh-K>B)Le+
+r7ko^k%ahVCAd4/r7ko^e7&78_>jQ8s8W-!s8W-!s8W-!s8W,sgh-K>B)LFrr7m)*gh-K>B)L.e
+r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r6/IEe7&:!?2VoPr6/IEb[(.j?2W2\s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o6m-j0)n*'-,kj7d9]PRMa=o?cX
+r7#0Qe7&:)@JnV`r7#0Qe7&:1B)LFrr7ko^gh-K6@Jnnmr7ko^gh-K>B)LFrr7ko^gh-KHCAd4/
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8Vi[kPE]4r3T;u`**#nB)Le+r8qblk%ahVCAd4/r8qblk%ahVCAd4/r7ko^k%ahLB)Le+
+r8qblgh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFr
+r7ko^gh-K6@Jnnmr7ko^gh-K>B)LFrr8qblgh-KHCAd4/r7ko^k%ahLB)Le+r8qblk%ahVCAd4/
+r8qblk%ahVCB+>6s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+(Hp$D;Ckj7crjQHBYM>X/?r1lm]Ue(ER6N!WMr4H#,e7&:;CAck!
+r8qblgh-K>B)Le+r7ko^k%ahLB)LFrr7ko^gh-K>B)LFrr8qblgh-KHCAck!r7ko^gh-K>B)LFr
+r7ko^gh-KHCAd4/r7m)*k%ahVCAck!r7ko^gh-K>B)Le+r7ko^gh-KHCAck!r9KdNs8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mm.9o6m-ilnkLnYIg"bH;gtp`>hXA+;r1lm]S3m.D6N!??
+r1$+OUe(EZ8GnuEr1$+OS3m.d<;bN`r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFr
+r8qblk%ahVCAck!r7m)*k%ahLB)K;@r1lm]Ue(Eb9`1DIr3T;ue7&:;CAd4/r7ko^gh-K6@JnV`
+r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qb[(.j?2W2\r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
+r7#0Qe7&:!?2W2\r7#0Qj.ZMQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8:oNr5;b9]N"gA<;aC.r4H#,]N"g9;#I[s
+r3T;uZr$\-;#I[sr3T;u]N"gA<;aC.r5;b9]N"gA<;a[;r5;b9`**#V=o?3@r6/IE`**#^?2VoP
+r5;b9`**#V=o?3@r5;b9`**#V=o>p3r4H#,]N"gA<;a+"r4H#,]N"g9;#HhMr00MFS3m.d<;aC.
+r4H#,`**#N<;a[;r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,`**#V=o?3@r5;b9`**#F;#I+[
+r1$+OUe(ER6N!??r1$+OPX4o!2Z/e*r1$+MgopbXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W#h`r+)6r6/IEb[(.j?2VWD
+r5;b9`**#V=o?3@r5;b9`**#V=o>p3r5;b9]N"gI=o?3@r5;b9b[(.b=o?3@r6/IE`**#^?2VoP
+r6/IEb[(.j?2VoPr6/IEb[(.b=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
+r5;b9`**#>9`1DIr00MFPX55;6N!WMqrGTns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;6%r7#0Q`**#^?2VoP
+r6/IEb[(.j?2VoPr7#0Qe7&:)@JnV`r7m)*e7&:1B)L.er7ko^gh-K&=o=dVr1$+OUe(CD_>jQ8
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-j]8kPWSWr7#0Qb[(.r@JnV`r7#0Qe7&:)@Jnnmr7ko^gh-K>B)L.er7ko^e7&:1B)LFr
+r7#0Q`*)rlYQ+Y&s8W-!s8W-!s8:Z-r7#0Qgh-K6@JnV`r7#0Qe7&:)@JnV`r6/IEe7&:!?2VoP
+r6/IEb[(.j?2VWDr6/IEb[(.j?2VoPr6/IE]N"q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7d%m-ilnkMYFai8j(ZjQG[Lao&56r6/IEb[(.r@Jn>Tr7#0Qe7&:)@Jnnm
+r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qgh-K6@Jnnmr7ko^oZ$q2s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8Vi[kPE/Sr2`Ti]N"gaB)Le+
+r7ko^gh-K>B)LFrr7ko^gh-K6@Jnnmr7#0Qgh-K6@Jnnmr7ko^e7&:1B)L.er7ko^e7&:1B)LFr
+r7ko^e7&:1B)L.er7ko^e7&:)@JnV`r7#0Qe7&:1B)L.er7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
+r7#0Qgh-K>B)LFrr7ko^gkYg_B)Le+r7m)*k%ahLB)LG>r7ko^gh-KHCAckBr9SV,s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp$D;C
+kj7d#gt_h?M#=&>r1$+OS3m.D6N!??r2`Tie7&:1B)LFrr7ko^k%ahLB)LFrr7ko^gh-K>B)LFr
+r7ko^gh-KHCAck!r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7#0Qgh-K>B)LFrr7ko^gh-KHCAck!
+r7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr7ko^gh-K>B)LFrr:J#/s8W-!s8W-!s8W-!s8W-!s8W-!
+m.9o:oC_&&kMYFag"bH;gtpK/f$`(!daZk:]T2o[6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??
+r2`Tib[(.r@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qgh-K6@Jnnmr7ko^k%ahLB)LFr
+r8qblZr$[r8Go8Sr1$+O]N"gaB)LFrr7ko^e7&:1B)L.er7#0Qe7&:)@JnV`r6/IEe7&:!?2W2\
+r6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr7#0Qe7&:)@Jn>Tr6/IEb[(.j?2VoPr6/IEb[(.j?2VoP
+r7#0Ts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8;N/r4HkD]N"gA<;aC.r4H#,]N"g9;#I[sr4H#,Zr$\-;#I[sr3T;uZr$\-;#I[s
+r4H#,Zr$\5<;aC.r4H#,]N"gA<;aC.r5;b9]N"gA<;a[;r4H#,`**#N<;a[;r4H#,]N"gA<;aC.
+r4H#,Zr$\-;#I[sr3T;uZr$\-;#I[sr3T;uXA&P^6N!??r4H#,]N"gA<;a+"r4H#,Zr$\5<;a+"
+r3T;uZr$\-;#It*r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r3T;uS3m.D6N!WMr1$+OS3m.D6M$*n
+o8>NuM`1L'6Mf39s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8:ATr5;b9`**#V=o?3@r5;b9`**#N<;a[;r4H#,]N"gA<;aC.
+r4H#,]N"gA<;a[;r4H#,`**#N<;a[;r4H#,`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
+r5;b9`**#N<;aC.r4H#,]N"gA<;aC.r4H#,`**#N<;aC.r4H#,]N"gA<;aC.r4H#,Zr$[j6M$*n
+o8>O)PX55;6Mn-1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8;6%r7#0Q`**#V=o?3@r5;b9`**#V=o?3@r6/IEb[(.j?2VoP
+r69llb[(.r@JnV`r69lle7&:)@JnV`r7#0QXA&P^6N!??r2`Tls8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n*'-,r69ll`**#^?2VoP
+r6/IEb[(.j?2W2\r7#0Qe7&:)@JnV`r7#0Qgh-K6@Jnnmr7$Q#e7&:)@JnV`r6/IE]PRH"YQ+Y&
+s8W,sm)8hO@JnV`r7#0Qe7&:!?2VoPr6/IEb[(.j?2VoPr6/IEb[(.b=o?3@r5;b9`**#V=o?3@
+r5;b9`**#V=o?3@r69los8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
+g"bH;gtpK/f%Jj8m&ka6]N"gQ?2VoPr6/IEb[(.j?2VoPr6/IEe7&:)@JnV`r7#0Qe7&:!?2W2\
+r7#0Qe7&:)@JnV`r7$Q#e7&:)@K6B-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq>/'er1lm]Zr$\M@Jnnmr7ko^gh-K>B)LFrr7ko^gh-K6@JnV`
+r7#0Qe7&:)@JnV`r7#0Qb[(.j?2W2\r6/IEe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`
+r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r6/IEe7&:)@Jn>Tr7#0Qe7&:)@JnV`r7#0Qgh-K>B)LFr
+r7ko^gkYg_B)LFrr7ko^k%ahLB)LFrr7ko^gh-KV`rH)=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<[_Gkj7ckgtqM4Nr5D6r00MFPX55362Zs5
+r1$+O]N"gY@JnV`r7#0Qgh-K>B)L.er7$Q#gh-K6@Jnnmr7#0Qe7&:1B)LFrr7#0Qgh-K>B)LFr
+r7ko^gh-K6@Jnnmr7#0Qe7&:)@JnV`r7ko^gh-K>L]#q>r7m)*gh-K>B)L.er7ko^e7&:)@JnV`
+r7#0Qe7&:)@JnV`r7#0Qe7&:)@JoJ8s8W-!s8W-!s8W-!s8W,coC_JAp#+ooi8j(SgtpK/f#u:^
+bKS5Sbg")F`T41Lr00MFPX55362Zs5r00MFS3m.D6N!'6r00MFPX55K9`3+?r6/IEb[(.j?2VoP
+r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:1B)L.er7ko^gh-K>B)K#4r1$+OS3m.l=o@&e
+r7ko^gh-K6@Jnnmr7#0Qe7&:!?2VoPr6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IE`**#^?2VWD
+r6/IEb[(.j?2VoPr5;b9b[(.j?2VoPr6/IEb[(.b=o?KLr5;b9b[(.b=o?d*s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r69llZr$\-;#I[s
+r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr2`TiZr$\%9`27or3T;uZr$\%9`27or3T;uZr$\-;#I[s
+r3T;uZr$\-;#I[sr3T;uZr$\-;#It*r4H#,]N"gA<;aC.r3T;uZr$\-;#ICgr3T;uXA&Pn9`1tc
+r2`TiXA&Pn9`1tcr3T;uS3m.\;#I[sr3T;uZr$\-;#ICgr3T;uZr$\-;#I[sr3T;uZr$\-;#It*
+r3T;u]N"gA<;aC.r4H#,]N"g9;#HhMr1$+OS3m.D6N!'6r1$+FM`10b2Y2hbr/<f8gopbXs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8:oN
+r4H#,]N"gI=o?3@r4H#,]N"gA<;aC.r4H#,]N"gA<;a+"r4H#,Zr$\-;#I[sr4H#,Zr$\-;#I[s
+r3T;u]N"g9;#It*r4H#,]N"gA<;aC.r5;b9]N"gA<;a[;r5;b9`**#V=o>p3r4H#,]N"gA<;aC.
+r4H#,]N"gA<;aC.r4H#,Zr$\5<;a+"r3T;uZr$\-;#It*r4H#,XA&PV61^!mqh.$.PX55362\u[
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8;6%
+r5;b9`**#V=o?3@r5;b9`**#N<;a[;r4H#,`**#V=o?3@r5;b9`**#V=o?KLr5;b9`**#^?2VWD
+r5;b9b[(.j?2VWDr1$+OPX55362\BOs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,i8j)!e;4%@=o?3@r5;b9`**#^?2VWDr6/IEb[(.j?2VoP
+r7#0Qe7&:)@JnW2r7#0Qe7&:)@JnV`r7#0Qb[(.r@Jn>Tr5;b9XCh=QVYBH?r7$Q#e7&:"KD`r!
+r6/IEb[(.b=o?KLr5;b9`**#V=o?3@r5;b9]N"gI=o?3@r4H#,]N"gI=o>p3r4H#,]N"g9;#gRq
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH4eCN'tf#u:^bKS5_`4c)E8GpD/
+r5;b9b[(.j?2VoPr6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEb[(.j?2W2\
+r9KdNs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=rI]
+r1lm]SP8t"=o?cXr7#0Qgh-K6@JnW2r7ko^e7&:)@JnV`r7#0Qe7&:)@JnV`r6/IEb[(.j?2VoP
+r6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEe7&:!?2W2\r6/IEe7&:!?2VoPr6/IEb[(.j?2VoP
+r6/IEb[(.j?2VoPr6/IEb[(.j?2W2\r6/IEe7&:)@JnV`r7#0Qe7&:)@Jnnmr7ko^gkYgW@JnV`
+r7#0Qe7&:)@Jnnmr;OA/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VHWp#tc2kj7crjQGaMX7;cdo8>O)PX55362Zs5o8>O)XA&Q1=o?cXr6/IEe7&:)@JnB&
+r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r7#0Qe7&:)@JnW2r7#0Qgh-K6M#>b2r7#0Qe7&:)@JnV`
+r7#0Qe7&:)@JnV`r7#0Qe7&:1B)L.er7#0Qe7&:)@JnV`r7#0Qe7&:)@JnV`r6/IEe7&:)@JnV`
+r6/IEb[(.r@K6B-s8W-!s8V`bq<[_Gkj7ckgtp`>hU9p)`5T^6`PoI%]u7n/]=bi0Uj2g%62Zs5
+o8>O)PX4o!2Z/e*r00MFPX4o!2Y2hbr1$+O`**#V=o?3@r5;b9b[(.b=o?3@r6/IE`**#^?2VoP
+r6/IEc%GrD@JnV`r7#0Qe7&:)@JnV`r7#0QXA&P^6N#&5r7#0Qe7&:)@JnV`r7#0Qb[(.j?2VoP
+r6/IEb[(.b=o?KLr5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
+r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#nL]@DSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r:J#,]PRMI9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tc
+r1lm]XA&Pn9`1\Wr2`TiXA&Pf8GoP_r2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tc
+r3T;uXA&Q!;#ICgr3T;uZr$\%9`27or2`TiXA&Pn9`1\Wr2`TiUe(EZ8Go8Sr2`TiUe(Eb9`1tc
+r2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr3T;uZr$\-;#I[sr4HkD]N"gA<;aC.
+r2`TiPX55362Zs5r00MFPX55361^!mo8>NuM`1Kt62]5gs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r69llZr$\-;#I[sr4H#,]N"g9;#It*
+r3T;uZr$\-;#I[sr3T;uZr$\-;#ICgr3T;uXA&Pn9`1tcr3T;uXA&Pn9`27or3T;uZr$\-;#I[s
+r4H#,Zr$\5<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r3T;uZr$\-;#I[sr3T;uZr$\-;#I[s
+r3T;uZr$\-;#I[sr3T;uZr$\-;#It*r3T;uPX4o!2Z&.go8>O)PX55CD?'Y9s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,rjMCc,<;aC.r4H#,]N"gA<;aC.
+r4H#,]N"gA<;aC.r4H#,]PRMa=o?3@r5;b9`**#V=o?3@r5;b9`**#ND#D4Sr5;b9`**#F;#H88
+o8>O)PX53-_>jQ8s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
+i8j(ZjQGdXfDN9\r4H#,]N"gI=o?3@r5;b9`**#V=o?3@r6/IEb[(.j?2VoPr6/IEe7&:!?2Vs"
+r7#0Qb[(.kKD`r!r6/IEb[(.Z<;_\<r1$+9gt_hWM#>J&r6/IEb[(.j?2VWDr5;b9`**#V=o?3@
+r5;b9`**#N<;a[;r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r3T;ue;4/)s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726i8j(SgtpK/f%A3i`5T^=bg")F`T41Lr2`Tib[(.b=o?3@r6/IE`**#V=o?3@
+r6/IE`**#V=o?KLr5;b9`**#^?2VWDr6/IEb[(.kKD`r!r6/IEc%H&rs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726n%=\YPX55C8GpD/r6/IEb[(.r@Jn>T
+r6/IEe7&:!?2W2\r69lle7&:"KD`r!r7#0Qb[(.j?2VoPr5;b9`**#V=o?3@r5;b9`**#V=o?3@
+r6/IE`**#^?2VWDr6/IE`**#V=o?KLr5;b9b[(.b=o?KLr5;b9`**#V=o?3@r5;b9`**#V=o?3@
+r6/IE`**#^?2VoPr6/IEc%GrD@JnV`r7#0Qc%GrD@Jn>Tr7#0Qb[(.r@JnB&r7#0Qe7&CWs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Ckj7crjQG4OhW1he
+r00MFPX55;6M$*no8>O)PX55S;#JOCr6/IEb[(.j?2VoPr6/IEb[(.j?2VoPr6/IEc%Gr<?2Vs"
+r6/IEb[(.kKD`r!r6/IEe7&:)@JnV`r7#0Qe7&:)@JnB&r6/IEb[(.j?2VoPr7#0Qe7&:)@JnW2
+r7#0Qe7&:"KD`r!r6/IEb[(.j?2VoPr6/IEb[(.j?2VWDr5;b9b[(.b=o?KLr5;b9c%Grd`rH)=
+m.9o6m-iW_hV$]@bKS5L`PoI%]t:qj]=bha['[3I[+M1!o8>NuM`10b2Y2hbo8>NuM`10b2Z/Ls
+o8>O(KKB%$6N"c)r4H#,`**#N<;aC.r5;b9]PRMa=o?3@r4HkD`**#^?2VWDr5;b9b[(.kKD`r!
+r7#0Qc%GrD@Jm3#r5;b9b[(.j?2VoPr6/IE`**#^?2VWDr5;b9`**#V=o?3@r5;b9`**#V=o?3@
+r5;b9`**#N<;a[;r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r4H#,`**#N<;a[;r4H#,]N"gI=o>p3
+r4H#,]N"gA<;aC.r4H#,oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,rjMCbq9`1tcr1lm]Ue(Eb9`1tcr1lm]XA&Pf8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8GnuE
+r1lm]Ue(EZ8GnuEr1lm]S3m.D6N!??r1lm]S3m.L8Go8Sr1lm]XA&Pf8GoP_r2`TiXA&Pf8GoP_
+r1lm]XA&Pf8Go8Sr1lm]S3m.D6N!WMr1$+OS3m.L8Go8Sr1lm]Ue(Eb9`1\Wr1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8GoP_r2`TiXA&Pn9`1tcr2aN.Zr$\-;#I[sr3T;uZr$[r8Gn]<r/<f:N'7*'61^!m
+qh.$-KKB!`3r=Rkqh.$,e?JuQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,s]PRMI9`27or3T;uZr$\-;#I[sr3T;uXA&Pn9`27or2`TiXA&Pn9`1tc
+r2`TiUe(Eb9`1\Wr2`TiXA&Pf8GoP_r2`TiUe(Eb9`1tcr2`TiXA&Pn9`1tcr2`TiZr$\-;#I[s
+r3T;u]N"g9;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uXA&Pn9`1tcr2`TiXA&Q!;#I[s
+r3T;uZr$\-;#It*r1$+NKKB!`3r=Rkr/<f:S3m/?`;fl;s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!r69llZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#It*
+r4H#,]N"gA<;aCFr4H#,`**#ND#CqFr5;b9]PRMa=o?3@r4H#,Ue(*82Y2hbr1$+Rs8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7d%m-iW_hW`SBr4HkDZr$\5<;aC.
+r4H#,]N"gA<;aC.r4H#,]N"gA<;a[;r5;b9`**#^?2DNsr6/IEb[(.j?2VWDr6/IE`**#^?2V?7
+r00MFPX4NVX4c:bk1nbg`JON2=o?3@r5;b9`**#V=o?3@r4H#,`**#N<;aC.r4H#,]N"gA<;aC.
+r3T;u]N"g9;#I[sr3T;uZr$\-;#ICgs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7d%m-iW_hU9p)
+bKS5L`Pod7`Pfa7`k8n\S3m.d<;a[;r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b9`**#^?2VWD
+r6/IE`**#V=o?KLr5;b9`**#V=o@'1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<[_Gq;gN)Sm;2P4oCO1r4H#,`**#V=o>pKr5;b9`**#V=o?KLr5;b9b[(.j?2VoP
+r6/IEb[(.j?2VWDr5;b9`**#V=o?3@r5;b9`**#N<;a[;r5;b9`**#V=o?3@r5;b9`**#V=o?3@
+r4H#,`**#N<;a[;r4H#,`**#N<;a[;r5;b9]N"gI=o>p3r5;b9]N"gI=o?3@r5;b9`**#^?2VoP
+r6/IEc%Gr<?2VoPr6/IEb[(.j?2VoPr5;b9b[(.j?2WK5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7crjQGI^kLe#%r1-OZPX4o!2Z/Lso8>NuM`1L'6N"Jq
+r5;b9b[(.b=o?3@r6/IE`**#^?2VWDr6/IE`**#V=o?3@r5;b9`**#V=o?3@r6/IE`**#^?2VoP
+r6/IEc%Gr<?2Vs"r6/IEb[(.j?2VoPr6/IEb[(.kKD`r!r69llb[(.j?2VoPr6/IEb[(.b=o?3@
+r6/IE]PRMa=o>p3r5;b9`**#V=o?3@r5;b9`**#V=o?3@r5;b4m-!U!n)39ig"bH4eCMgec+CX%
+['[3I['Zm8XfJP*X/rGIO_"'A2Y2hbqh.$-KKB!`3qJ7fqh.$%M`1Hc3r=Rkr1$+OZr$\5<;a+"
+r3T;u]N"g9;#It*r4H#,]N"gA<;a[;r4H#,`**#V=o>p3r4H#,`**#V=o?3@r5;b9`**#V=o>p3
+r5;b9]N"gI=o?3@r5;b9]N"gI=o>p3r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;a+"
+r4H#,Zr$\5<;aC.r4H#,Zr$\5<;a+"r4H#,]N"gA<;aC.r3T;u]N"gA<;aC.r4H#,Zr$\5<;b!n
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VrNYPb1er1-OZUe(EZ8Go8S
+r1$+OUe(EZ8GnuEr1lm]Ue(ER6N!WMr1$+OS3m.D6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??
+r1$+OS3m.D6N!??r1$+OS3m.D6N!??r1lm]S3m.L8Go8Sr1lm]S3m.L8GnuEr1$+OS3m.D6N!??
+r1$+OS3m.D6N!??r1$+OS3m.D6N!WMr1$+OS3m.L8GnuEr1$+OS3m.D6N!WMr1lm]Ue(EZ8GoP_
+r2`TiXA&Pn9`1tcr2`TiXChC39`1tcr1lm]N'6cj2Y2hbo8>NuM`1Hc3r=Rkqh.#sF=Qm?2Z2'\
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+Wn;#ICg
+r2`TiXA&Pn9`1u(r2`TiXA&PfD>^J/r1lm]Ue(Eb9`1\Wr1lm]Ue(EZ8Go8Sr1lm]S3m.L8GnuE
+r1lm]Ue(ER6N!WMr1lm]Ue(EZ8Go8Sr1lm]XA&Pf8GoP_r2`TiXA&Pn9`1u(r3T;uZr$\%9`1tc
+r3T;uXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`27or3T;uZr$\-;#HhM
+qh.$-KKB!`3qJ7fr/<f9jMClrs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+ILkPVtlr2`TiZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#It*r3T;u]N"g9;#I[s
+r4H#,]N"g9;#It*r4H#,]N"gA<;a+"r/<f1M`1Hc3r?:)s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_>6n)iE\g"bH\`JON";#I[sr3T;uZr$\5<;a+"r4H#,Zr$\5<;aC.
+r4H#,]N"gAD#D4Sr4HkD`**#V=o>pKr5;b7`JON2=o>pKr4HkDS3m.44m]>!g"bH4eCN'tf)!@B
+r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"g9;#I[sr3T;uZr$\-;#I[sr3T;uXA&Pn9`27o
+r2`TiZr$VSYQ+Y&s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)39idaZjreCMgec,@T?`5T^6`Ppo@I/Kd2
+r5;b9]N"gI=o>p3r5;b9`**#N<;a[;r5;b9`**#V=o?3@r5;b9`**#ND#D4SqSe<h`**#V=o-*o
+r5;b<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d#gt_Fk>k<k3
+r/<f:Zr$\5<;aC.r4H#,]N"gI=o>pKr5;b9]PRMa=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
+r5;b9]N"gA<;aC.r4H#,]N"gA<;aCFr4H#,]N"gA<;aC.r4H#,]N"gA<;aC.r4H#,]N"gA<;aC.
+r4H#,Zr$\5<;a+"r3T;u]N"g9;#It*r4H#,]N"gI=o?3@r5;b9`**#V=o?3@r5;b9`**#V=o?3@
+r5;b9]PRMa=o?3@r5;b9oZ$q2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+m.9o6m-ilnkLnYIf>PB#PX4o!2Y2hbo8>NuM`1Hc3rG4.r5;b9`**#V=o?3@r5;b9`**#V=o>pK
+r5;b9]PRMa=o>pKr5;b9]PRMa=o>pKr4H#,]PRMa=o>pKr5;b7`JON2=o?KLr5;b9b[(.b=o?KL
+r5;b9c%Gr4=o?KLr6/IEb[(.j?2VoPr5;b9`**#ND#D4Sr4HkD`**#V=o>pKr5;b9]N"gA<;aC.
+r4H#,]N"gA<;aCFr4H#,`**#N<;a[;q:sBUjQFt@f#u:^]=bhh]Y1AIXfJP*Unsl_V50o`Us+s3
+r/<f9HoV"V3r=Rkqh.$-KKB!`3r=Rkqg:BiF=R3Q62\)dr3T;uXA&Q!;#ICgr3T;uZr$\-;#I[s
+r4H#,Zr$\-;#I[sr3T;u]N"gA<;a+"r4H#,]N"gA<;a+"r4H#,]N"g9;#It*r4H#,]N"g9;#It*
+r3T;uZr$\5<;aC.r3T;u]N"g9;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[s
+r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\m`rH)=s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8(6Lr1$+OPX55;6N!'6r00MFPX55;6N!??r00MFS3m.<62[6>
+r00MFS3m.<62[6>r00MFS3m.<62[6>r00MFPX55362Zs5r00MFPX55;6N!'6r00MFPX55362Zs5
+r00MFS3m.<62[6>r00MFS3m.<62[6>r00MFS3m.<62Zs5r00MFPX55362Zs5r00MFPX55362Zs5
+r00MFS3m.<62[6>r1$+OPX55;6N!??r1$+OS3m.D6N!WMr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
+r1lm]Ue(ER6M$*nqg:C#KKA^_2Z&.gqh.#sF=R0@3r=:aqh.$,bbkF?s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s88rlr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8GnuEr1lm]S3m.L8GnuEr1lm]S3m.D6N!WMr1$+OS3m.L8GnuEr1lm]S3m.D6N!??
+r1$+OS3m.L8Go8Sr1lm]Ue(EZ8GoP_r2`TiXA&Pn9`1u(r2`TiXChC39`1tcr2`TiXA&Pf8GoP_
+r1lm]XA&Pf8Go8Sr1lm]XA&Pf8GoP_r2`TiXA&Pn9`1tcr2`TiXA&PV60r\Cqg:BiF=Qm?2Z&.g
+qrGTns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7d6gsQ%q8Go8S
+r2`TiUe(Eb9`1tcr2`TiXA&Q!;#I[sr2`TiZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[s
+r3T;uZr$[r8Ge'$qh.$-KKB"k_>jQ8s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+i8j(Sgtq8<X8K%mr2`TiXA&Pn9`27or2`TiZr$\%9`27or3T;uZr$\-;#I[sr3T;u]N"gA<;aC.
+r4HkD`**#ND#CqFr5;b9]N"g!6MlEsnXa"6eCMgec-+>UbKS5nbfTdi;#I[sr3T;uZr$\-;#I[s
+r3T;uZr$\-;#I[sr3T;uZr$\%9`27or2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`Tls8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<[_Gi8j(SgtpK/f#u:^`5T^6`Pod7`Q#R%r0:.WZr$\5<;aC.r4H#,]N"gA<;aC.
+r4H#,]N"gA<;aC.r4H#,`**#ND#D4Sr5;b9`**#ND#D4Sr5;b9]N"gRKE(uOs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d%m-iW_hXR1Bqh.$-KKB%49`27or3T;uZr$\-;#@V?
+r3T;uZr$\5<;aC.r4H#,]PRMa=o>pKr5;b9`**#ND#D4Sr4HkD]N"gA<;aC.r4H#,]N"g9;#It*
+r3T;uZr$\-;#I[sr3T;uZr$\-;#ICgr3T;uZr$\%9`27or2`TiZr$\-;#I[sr2`TiZr$\-;#I[s
+r3T;uZr$\-;#It*r4H#,]PRMa=o>pKr5;b9`**#V=o?3@r4H#,]PRMa=o>p3r5;b9]N"gA<<*!u
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIg"bH:]XIEi2Y2hb
+o8>NuM`1Hc3qJ7fr00MF]N"gA<;aC.r4H#,]N"gA<;aCFr4H#,]N"gAD#CqFr4H#,]N"g9;#It*
+r4H#,Zr$\5<;aC.r4H#,]PRMa=o?3@r4HkD`**#V=o>pKr5;b9]PRMa=o>p3r5;b9]PRMa=o>pK
+r5;b9]PRMa=o>pKr5;b9]PRMa=o>pKr4H#,]N"gA<;aC.r4HkDZr$\5<;aC.r4H#,]N"gA<;aC.
+r4H#,]N"gA<9`)HdaZjkbg!c4]sP/RX/rFnSt)UQUnji_Unsm2O_"?:3;\@iluX`SHoUJ7.dV7,
+o8>NnF=Qm?2Z%k]r/<f:XA&Pn9`1tcr2`TiXA&Pn9`1tcr3T;uXA&Q!;#ICgr3T;uZr$\%9`1tc
+r2`TiZr$\%B)J`(r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#ICgr3T;uXA&Q!;#ICg
+r3T;uXA&Q!;#I[sr3T;uXA&Q!;#ICgr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr3T;uXA&Pn9`1tc
+r3T;uXA&Pn9`1tcr2`TiXA&Pn9`1tcqTPi:s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+r9VB"Pu7ID62Zs5r00MFPX55362Zs5r00MFPX55+4oCO1r00MFN'7*'62Z[)r00M=M`1Kl4oC7%
+r/<f:N'7)t4oCO1o8>O)N'7)t4oCO1r/<f:PX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5
+r00MFPX55362Zs5r00MFPX55+4oCO1r/<f:PX55362Zs5r00MFS3m.<62Zs5r1$+OPX55362Zs5
+r1$+OPX55;6N!??r1-OZSP8sP9`1GTr1-OZUe(ES9`1\Wr1lm]Ue(EZ8Go8Sr1$+NHoV"N3;\@i
+qh.$-KKAIA.f4l[luX`SHoV"N3;Ujrs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!qm:DAS3m.D6N!??r1lm]SP8sW8Go#Pr1lm]SP8sO6N!??r1$+OS3m.D6N!??
+r00MFS3m.<62[6>r00MFS3m.D6N!'6r1$+OS3m.<62[6>r1$+OS3m.D6N!??r1$+OS3m.L8Go8S
+r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8GoP_
+r1lm]XA&Pf8GoP_r2`TiUe(Eb9`1\Wr1lmTM`0pD.f4TQluX`SHoU_U2Y?_=s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQGI^kLnYIqSe<hUe(EZ8Go8Sr1lm]Ue(Eb9`1\W
+r2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2`TiXA&Pn9`1tcr2aN.XA&Pn9`27or2`TiN'7&c3;\(_
+r00MIs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhW`SBr3T;uUe(Eb9`1\W
+r2`TiXA&Pf8GoP_r2`TiXA&Pn9`1tcr3T;uZr$\-;#I[sqm:DAZr$\5<;a+"r4H#,]PRMQ;#ICg
+qg:BpM`/Mm`QQKMbKS5Sbg">Tc,@T?r4Ij`XA&Q!;#ICgr2`TiXA&Q!;#I[sr2`TiZr$\%9`27o
+r2`TiXA&Pn9`1tcr1lm]XA&Pf8Go8Sr2`TiUe(EZ8GhJas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
+fZ_O^bg")F`Pfa7`5T^JXIo*B2Z0pYr3T;uZr$\-;#I[sr3T;uZr$Y,Er<RLr3T;u]PRMQ;#ItB
+r4H#,]PRMYD#CqFr4H#,]PRMQ;#It*r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
+m.9o6m-ilnkLnYIkbX@;HoUJ7.f>f'r3T;uXA&PnB)K#4r2`TiXA&Q!;#I[sr3T;tZuZ)O;#It*
+r3T;u]N"g9;#ItBr3T;uZr$\5<;a+"r3T;uZr$\-;#I[sr3T;uXA&Q!;#ICgr3T;uXA&PnB)J`(
+r2`TiXA&Pf8GoP_r1lm]XA&Pf8GoP_r1lm]XA&Pn9`1\Wr2`TiUe(Eb9`1tcr3T;uZr$\-;#It*
+r4H#,]N"gA<;X%Cr4H#,Zr$\5<;a+"r3T;uZr$\-;#I[sr4HkGs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH4eCMXP](:h<o8>NuM`1Hc3p^r<qg:BpM`1L79`2P&
+r4H#,Zr$\-;#I[sr3T;uZr$\5<;a+"r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uXChC;;#I[s
+r3T;u]N"gA<;aCFr4HkD]N"gAD#CqFr4H#+ZuZ)W<;aC.r4HkD]N"gA<;a+"r3T;u]N"g9;#I[s
+r3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;uZr$\-;#I[sr3T;tZuZ)O;#I[sr3T;tZuYBRX2Mur
+]=bha['Zm8Xe_ehUnsl_V50o`Us+s3o8>NnF=QX!.dV7,qh.#sF=R083:(`:luX`DF=R3Q62[fX
+r2`TiXA&Pf8GoP_r1lm]Ue(Eb9`1\Wr2`TiXA&Pf8Go8Sr2`TiUe(EZ8Go8Sr1lm]XA&Pf8Go8S
+r1lm]XA&Pf8Go8Sr2`TiXA&Pn9`1tcr2`TiXA&Pf8GoP_r1lm]XA&Pf8GoP_r1lm]Ue(Eb9`1\W
+r2`TiUe(Eb9`1\Wr2`TiUe(EZ8GoP_r1lm]Ue(Eb9`1\Wr2`TiXA&Pf8GoP_r1lm]Ue(EZ8GnuE
+r1lm]S3m.TB)ho2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W"f9`0i4r/<f:N'7)t4oC7%
+r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%o8>NuM`1Hc3qJ7fo8>NuM`10b2Y2hbqh.$%M`1Hc3qJ7f
+o8>NuM`1Kl4oC7%r/<f:N'7)t4oCO1r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
+r/<f:PX55+4oCO1r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5r00MFS3m.<62Zs5
+r1$+OPX55<9`1GTr0:.WSP8sP9`1GTr1-OZSP8sG60r\CluX`DF=QX!.f4TQluX`DF=QX!.dV7,
+luX`RbbkF?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,q`JOMW62Zs5
+r1$+OPX55;6N!'6r1-OZPX55<9`1DIr00MFSP8sG62Zs5r00MFPX55362Zs5r00MFN'7*'62Z[)
+r/<f:PX55+4oCO1r00MFPX55362Zs5r1$+OPX55;6N!??r1$+OS3m.E9`1GTr1lm]SP8sWD>^2#
+r1lm]Ue(EZ8Go8Sr1-OZUe(ES9`1DIr1lm]S3m.L8Go8Sr1lm]Ue(EZ8GnuEr1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8GnuEqh.#sF=QX!.dV7,qg:C$N'74@s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-ilnkN:RTg"bH4eCN=.hYX[#r1$+OS3m.L8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]XA&Pf8Go8Sqg:BiF=QX!.f6Sns8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+QpA*Y-kMYFag"bH^[>t0\8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8GoP_r1n3-XA&Pn9`1tcr2aN.Zr$\%B)K#4r2`ThHoU_U2V>[NfZ_O^bg")F`QQKM
+`5T^=bg#@gYl(Rrr2aN.XA&Pn9`1tcr2`TiXA&Pn9`1\Wr2`TiUe(Eb9`1\Wr1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8Go8Sr1lm]XChM4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2g"bH4eCN'tf#5PH`5T^6`Pod7`TE.\
+r1lm]XA&Pn9`1tcr2aN.XA&PnB)J`(r3T;uXChC;;#ID,r3T;uZr$\-;#I[sr3T;tZuZ)O;#I[s
+r3T;u]PRWJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-ilnkLnYIdaZk"`4bMZ.f4TQ
+r/<f:XA&Pf8GoP_r2`TiUe(Eb9`1tcr1lm]XChC39`1tcr2`TiZr$Y,Er<:@r3T;uXA&Q!;#I[s
+r2`TiZr$\%9`1tcr2`TiXA&Pn9`1tcr1lm]XA&Pf8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8Go8Sr1$+OUe(EZ8Go8Sr1lm]Ue(EZ8GoP_r2`TiZr$\%B)K#4r3T;uXA&Q!;#I[s
+r3T;uZr$\%9`27or3T;uXChC[M#[MTs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
+g"bH;gtpK/f#5PHk)EF.F=R0@3p^r<luX`SHoUJ7.f?)5r2`TiZr$\-;#ICgr3T;uXA&Q!;#ID,
+r3T;uZr$\%B)K#4r2aN.XA&PnB)J`(r1n3-Ue(Eb9`1tcr2`TiXA&Pn9`1tcr2aN.Zr$\-;#I[s
+r3T;uZr$\%9`27or2aN.XA&Q!;#I[sr3T;uXChC;;#ICgr2aN.Zr$\-;#I[sr3T;uXChC39`1u(
+r2`TiXChC39`1u(r1lm]Ui$%29`1tcr2`TiXChC39`1tcqm:C^`PoI%]sP/RUnsl_V50o`Unji_
+Unsm2O_!g#.dV7,qg:BiF=QX!.eAQVluX`KM`1Hc3p^r<o8>O)XA&Pf8GoP_r1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8Go8Sr1lm]Ue(ES9`1GTr1-OZSP8sW8Go#Pr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1$+OUe(ER6N!WMr1$+OUe(ER6N!WMr1lm]Ue(ER6N!WM
+r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8GnuEr1lm]S3m.D6N!??r1$+OS3m.D6N!??r1$+Om)8r(s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s800Dqh.$.N'7)t4oC7%r/<f9KKB$i4o9mnqh.$-KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$%M`1Hc3qJ7fo8>NuM`1Kl4oCO1
+r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r00MFN'7*'62Z[)r00MFN'7)t4oCO1
+r00MFN'7*'62Z[)r00MFN'7*'62Zs5r00MFPX55362[!Fr1$+OPX55362Zs5r1$+OPX55;6N!'6
+r00MFPu7IL6N!'6r/<f*F=QX!.dV7,qg:BiF=QX!.dV7,luX`DF=QX!.f.Ads8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VoMdJT4pr00MFPX55362Zs5r00MFPX55;6N!'6
+r00MFPX55362Zs5r00MFPX55362Zs5r00MFN'7)t4oC7%r/<f1M`10b2Z/Lsr/<f:N'7*'62Z[)
+r00MFPX55362Zs5r00MFPX55362Zs5r00MFSP8sP9`1DIr1$+OSP8sP9`1GTr1-OZSP8sP9`1DI
+r1$+OS3m.<62[6>r1$+OS3m.<62[6>r1$+OS3m.D6N!??r1$+OSP8sO6N!WMr1-OZS3m.44m[8?
+luX`DF=QX!.dV7,qm:DDs8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(SgtpK/f$`(!
+fZ_Okbffp[D>]njr1$+OS3m.D6N!??r1$+OS3m.D6N!BJr1$+OSP8sO6N!BJr1-OZSP8sP9`1GT
+r1-OZSP8sP9`1GTr1-OZUe(EB4m[8?r+n1UF=R+AdJs7Hs8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
+k1nbFgtqnGXSeSTr1$+OS3m.D6N!??r1$+OS3m.D6N!WMr1$+OUe(ER6N!WMr1-OZUe(EZ8Go8S
+r1lm]XA&Pn9`1\Wr2`TiUe(B13;\(_fVEc8bg">Tc-+>UbKS5L`Pp$Ec,@T?bKS6/XChC+8GoP_
+r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]S3m.L8GnuEr1$+OUe(ER6N!WMr1$+OUe(EZ8GnuE
+r9VB%s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7crjQG4OhU9p)`5T^=bg")F`Pfa7aK268HoV&"8GoP_r1lm]Ue(EZ8GoQ$
+r2`TiXA&Pn9`1tcr2`TiXA&PnB)J`Br2aN.XA&PnB)J`(r2`TiUi$%*8Gqhms8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIg"bH4eCN9rbN=dbluX`DF=R3a8Go8Sr1lm]Ue(EZ8Go8S
+r1n3-Ue(EZ8Go8Sr2`TiXA&PnB)J`(r2`TiXA&PnB)J`(r1lm]XA&Pf8GoP_r1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8Go#Pr1lm]SP8sO6N!BJr1$+OS3m.D6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??
+r1$+OS3m.D6N!WMr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8GoP_r1lm]XA&Pf8GoP_
+r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Ci8j(SgtpK/f$`(!`5T^HPC`(B.dV7,
+luX`DF=QX!.dV7,r/<f:XA&Pf8Go8Sr2`TiUe(EbB)JGqr2`TiXA&Pf8GoQ$r2`TiXA&Pf8Go8S
+r1lm]Ue(EZ8Go8Sr1lm]Ue(EZD>^2#r2`TiUe(Eb9`1\Wr2aN.Ue(EbB)JGqr2aN.Ue(Eb9`1tc
+r2aN.XA&PnB)JGqr2`TiUe(Eb9`1]'r2`TiUi$%29`1tcr1lm]XA&Pf8Go8Sr2`TiUe(EZ8Go8S
+r1lm]Ue(EZ8Go8Sr2`TiUe(Eb9`1u(`k8mi['ZX*Unji_Unsl_V50o`Us+s3luX`DF=QX!.dV7,
+luX`DF=QX!.dV7,luX`DF=R0@3rGdEr1lm]Ue(EZ8Go8Sr1$+OUe(ER6N!??r1-OZS3m.E9`1GT
+r1$+OS3m.D6N!'6r1$+OSP8sP9`1GTr1lm]SP8sW8GnuEr1lm]S3m.D6N!??r1$+OS3m.D6N!??
+r1$+OS3m.D6N!??r1$+OPX55;6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??r1$+OS3m.D6N!??
+r1$+OS3m.D6N!??r00MFS3m.D6N!'6r1$+OS3m.<62JO$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+qUDbHKKB!`3r=Rkqh.$-KKB!X3;\@iqh.$-HoV"V3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$%M`1Hc3qJ7fo8>O)N'7)t4oC7%r/<f:N'6cj2Y2hb
+o8>NuM`1Kl4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
+r/<f:PX55+4oCO1r00MFPX55362[!Fr00MFPX55362Zs5r00MFPX55362Zs5r00MFN'7)t4m[8?
+lte*:F=QX!.dV7,lte*:F=QWn.-taulte*H`2s"=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!r1-OZN'7*'62Z[)r/<f:N'7*'62Zs5r00MFPX55362Zs5r00MFN'7*'62Z[)
+r00MFN'7)t4oC7%r/<f:N'7&k3r=Rkqh.$-KKA^_2Z&.go8>O)N'6cj2Z/Lsr/<f:N'7)t4oC7%
+r/<f:N'7*'62Z[)r00MFN'7*'62Z[)r00MFPu7I<4oCO1r00MFPX55362[6>r00MFPX55362Zs5
+r00MFPX55362Zs5r00MFPX55362[!Fr00MFSP8sO6N!??r1$+NHoV%F3UCi;luX`DF=QX!.f%lI
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG[\gsX^'daZjreCMgec.L7`f>PB#PX55362Zs5
+r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5
+r00MFF#iT'.-tauqg:C's8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhWE&(r1lm]PX55;6N!'6
+r00MFPX55362Zs5r1$+OPX55;6N!'6r00MFS3m.<62[6>r1$+OSP8sP9`1GTr1-OZSP8sP9`'K(
+lte*4NE4]UbL4nkbKS5L`Pp$Ec.L7``5T^=bg">Tc02gEr1-OZSP8sP9`1\Wr1-OZUe(ER6N!??
+r1$+OS3m.D6N!??r1$+OUe(ER6N!??r1$+OS3m.D6N!??r1$+OS3m.TB)ho2s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQ
+daZjkbg")F`Pfa7`5T^6`Ppu!<rA1Jr1lm]Ue(Eb9`1]'r1lm]Ue(EZD>^2#r1lm]Ui$%*8Go9#
+r1lm]XA&Pf8Go8Sr1lm]Ue(EZ8Go8Sr2aN1s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39i
+i8j(LeCN'tf#u:^f:7<VCaeXl.f>5gr1lm]SP8sW8Go#Pr1-OZSP8sO6N!BJr1lm]SP8sW8Go#P
+r1lm]Ue(EZ8GoP_r1lm]Ue(EZ8Go8Sr1-OZUe(EZ8Go#Pr1-OZSP8sP9`1GTr1-OZPu7IL6N!*G
+r1$+OS3m.<62[6>r00MFPX55362[9Ir00MFS3m.<62[6>r00MFS3m.<62[6>r1$+OS3m.D6N!??
+r1-OZSP8sP9`1GTr1-OZSP8sP9`1GTqTPi2m-"<=`qSi_r:J#$pA+ags8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5L`Pop"V<i"HluX`DCaeXl.dLUjlte*JF#j/g6N!??
+r1-OZUe(EZ8Go#Pr1lm]SP8sW8Go#Pr1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go#Pr1-OZUe(ES9`1GT
+r1$+OSP8sP9`1GTr1-OZSP8sP9`1GTr00MFPX55+4oCO1r0:.WSP8sW8Go8Sr1lm]Ue(EZ8Go8S
+r1lm]Ue(EZ8Go8Sr1lm]Ue(EZ8Go#Pr1lm]Ue(ES9`1GTr1-OZUe(ES9`1\Wr1-OZUe(EZ8Go8S
+r1-OZUe(EZD7$[WUnsl_V50o`Unji_Unsm.Kk'Ic.-u%*lte*:CaeXd.-taulte*:F=QWn.-tau
+qg:C$Ue(ER6N!WMr1$+OS3m.D6N!??r00MFS3m.<62Zs5r00MFPX55362Zs5r00MFPX55362Zs5
+r00MFS3m.E9`1,@r1$+OS3m.D6N!'6r1$+OPX55;6N!'6r00MFPX55362Zs5r00MFPX55362Zs5
+r00MFPX55362Zs5r00MFS3m.<62[6>r00MFS3m.<62Zs5r1$+OPX55362Zs5r00MFPX55362Zs5
+r00MFS3m.<62Zs5r1$+OUi$/3s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VtU<Vq/'qg:C#HoV"N3;\(_
+qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"V3r=:aqg:C#HoV"N3;\@i
+qg:C#KKB!`3r=Rkqh.$-KKB!`3r=Rko8>NuM`10b2Y2hbo8>O(KKB$i4o9mno8>NuM`1Kl4o9mn
+r/<f9KKB$i4oC7%qh.$.N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
+r00MFN'7*'62Z[)r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%qh.#rA0gMX.-taulte*:CaeXd.-tau
+lte*:CaeXd./Ll`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,s]SQH<3rFq"
+qh.$.N'7)t4oC7%r/<f:N'7&k3rFq"r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%qh.$-KKB!`3r=Rk
+qh.$-KKB!`3r=:aqh.$-KKB!`3r=Rkqh.$-KKB!`3r=:aqg:C#KKB!`3rFq"qh.$.N'7)t4oC7%
+qi+VRN'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7*'62Z[)r00MFN'7*'62Z[)r/<f:N'7)t4oC7%
+r00MFPX55362Zs5r00MFPX55362Z[)lte*:CaeXd.-taulte*IKKB/5s8W-!s8W-!s8W-!s8W-!
+s8W,kpA*q=n)39ig"bH;gtpK/f%A3ibKS5Sbg">Tc0r<*r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
+r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4o:4=r/<f:PX55362Z[)lte*9A0gJO,lFHT
+s8W-!s8W-!s8W-!o_/+Em-ilnkN:RTg"bH^Ui$$o62Zs5r/<f:PX55362Zs5r00MFPX55362Zs5
+r/<f:PX55362Z[)r00MFPX55+4oCRBr00MFPu7IE;>c\Vqh.$.AMN@k7+0T9daZjreCMgec-+>U
+bKS5L`Pp$Ec-+>U`5T^I`4c)ED>]Var1-OZPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5
+r00MFPX55362Zs5r00MFPX55;6N!'6r00MIs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5L`Poj0]#V4`
+qg:C$Ue(EZ8Go8Sr1lm]Ue(ES9`1GTr1$+OSP8sP9`1\Wr1-OZUe(ES9`1GTr1-OZSP8sP9`1GT
+r0:.WSP8n0YlFb's8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5O[B](?.dUt"
+r,XmrS3m.E9`1GTr1-OZSP8sP9`1GTr1-OZSP8sP9`1GTr1-OZSP8sP9`1GTr1lm]SP8sW8Go#P
+r1-OZSP8sP9`1/Qr0:.WSP8sG62Zs5r00MFN'7*'62Zs5r/<f:PX55+4oCO1r/<f:Pu7I<4oCO1
+r00MFPX55362[!Fr/<f:PX55+4oCO1r00MFN'7*'62[!Fr00MFPu7ID62Zs5r00MFPX55362[!F
+r1$+OPX52RErZ1>s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYI
+daZjkbg")F`OidrkB98ZA0gMX.-kChlXV:,A0gJO,l<6Ur1$+OS3m.=;>ctYr1-OZSP8sP9`1GT
+r1-OZSP8sP9`1GTr1-OZSP8sP9`1GTr1-OZPu7IL6N!*Gr00MFSP8sG62Zs5r00MFPu7IM9_kNC
+f:7<DKOX:i.dLUjlXV:-CaeXd.-taulte*IHoV"V3rG4.r1-OZSP8sW8Go#Pr1-OZSP8sP9`1GT
+r1-OZSP8sP9`1GTr1-OZS3m.E9`1,@r1-OZPu7IM9`1GTr0:.WS3m.E9`1DIr1$+OUi!06Xe_eh
+S=Z7HV50o`Ur\7"lte*9A0gJO,jStdlXV:-CaeXd.-taulte*:Caf1.3;f:5r1$+OPX55;6N!'6
+r00MFPX55362Z[)r00MFPX55+4oCO1r/<f:PX55+4oCO1r/<f:PX55362Zs5r00MFPX554;>cYE
+r00MFPX55362Z[)r00MFN'7*'62Z[)r/<f:N'7)t4oC7%r/<f:PX55+4oCO1r00MFPX55362Z[)
+r00MFPX55362Zs5r00MFPX55362Zs5r00MFPX55362Zs5r00MFN'7*'62Z[)r00MFPX55+4oCO1
+r:J#/s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s800Dr,XmrF#j,F3;dhXqg:C$F#j,F3;dhXr,XmqHoV%F3W*qY
+qg:C$F#j/>3W"1`r,XmqHoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\@i
+qg:C#HoV%F3W*qYr,XmrF#j,F3;\@iqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$-KKB$i4oC7%qh.$-KKB$i4o9mnr/<f:N'7)t4o9mnr/<f9KKB$i4o9mn
+qh.$-KKB!`3r=Rkqh.$-KKB!X39t*#lXV:,A0gMX.-kChlXV:,A0gJO,jStdlXV:;`2s"=s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VoUiVS9hqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
+r/<f9KKB$i4o9mnr/<f9KKB$i4o9mnqh.$-KKB!`3r=Rkqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_
+qg:C$Cbu!#1$`?qlXV:&<$1F:,j/D^lXV:,Jn4)AO8Pejqi+VQKKB!`3r=Rkqh.$-KKB!`3r=n:
+qh.$.N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%
+r/<f:N'7&c3:(H0lte*:CaeXd.-taur3_Rbs8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-j)lgtCK>
+daZjreCMgec-k+mbKS5ZeCOGlMu8Msr/<f9KKB!`3r=Rkqh.$-KKB!X3;\@iqg:C#KKB!`3r=Rk
+qh.$-KKB!`3r=Rkr/<f:N'7)t4o:4=r/<f:N'7)[3TjWslXV:,A0grn_#OH7s8W,kpA+(Hp#tc2
+i8j(Sgtqt:Nr4i!r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4o:4=
+r/<f:N'7)t4oC7%r/<f9KKAF0,j]=qkeaRWgtp`>hU9p)daZjkbg">Tc-+>U`5T^=bg">Tc-+>U
+m^/#PN'7)t4o:4=r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r00MFN'7)t4oC7%r00MFN'7*'62Zs5
+r00MFPX55362S$0s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIfZ_O^bg")F`Pfa7`5T^HPC`Ua3rGL7r1-OZSP8sP9`1GT
+r1-OZSP8sP9`1GTr1-OZPu7IM9`1GTr1-OZSP8sP9`1GTr0:.WPX554;>ctYs8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5Sbg">Tc.S&#lte*9A0h)34oCjEr1-OZSP8sP9`1/Q
+r00MFSP8sG62Zs5r00MFPu7ID62[!Fr00MFPu7IE;>ctYr0:.WSP8sH;>cqNr0:.WPX55362Zs5
+r0:.WN'7)t4o:4=r/<f:N'7)t4oC7%r/<f9KKB$i4o9mnr/<f9KKB$i4oC7%r/<f9KKB$i4o:4=
+r/<f:N'7)t4o:4=r/<f:N'7)t4oC7%r/<f:PX55+4oCRBr/<f:N'7*'62Z[)r00MEjMClrs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH-bg")F`Pfa7]=bi$O_!W[.dLUj
+k?KM">Uni7+6QlYr+n1eN'7)t4oC7%r00MFPX55362[!Fr00MFPu7ID62[!Fr0:.WPX52+<W&(I
+r00MENE,n84oCO1r/<f:PX52+<W%e=r/<f:Pu6Y5LWH9^X/rG(XKAP)Xe_ehX/rG5PDdn1;sRs>
+lXV:,A0gJO,jStdlte*9A0h(o3W+h!r0:.WSP8sP9`1DIr0:.WPX554;>cYEr0:.WPX554;>cYE
+r00MFPX55362Zs5r00MFPX554;>cYEr00MFPu7IM9`1,@gS9t.V50o`Unji_Unsm.Kk'FZ,jStd
+lXV:(>Uo&M,jStdlXV:,A0gJO,jStdr,XmrPX55362Zs5r00MFN'7)t4oC7%qh.$.N'7)t4o9mn
+r/<f:N'7)t4oC7%r/<f:N'7)t4o9mnr/<f:N'7)t4oC7%r/<f:N'7)t4o9mnqh.$-KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f9KKB$i4oC7%
+qh.$.N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7$eYlFb's8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+p[%)@F#j/71]2;Sr+n1eCbu!*1]2&Fr+n1eCbu!13W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qY
+r,XmrF#j/>3W*qYr,XmrF#j,F3;dhXr,XmqHoV%F3W*qYr+n1TA0gJO,j/D^lXV:(>Uo&M,j/D^
+lXV:,A0gJO,lD^Dqh.$-HoV"N3;\(_qg:C#HoV"N3;\@iqg:C#KKB!`3r=Rkqg:C#KKB!`3r=:a
+qh.$-HoV"V3r=Rkqg:C#KKB!X3;\@iqh.$-KKB!`3r=Rkqg:C#KKB!`3r=:aqh.$-HoV"V3r=:a
+r,XmaA0g>C.dLUjlXV:,A0gJO,jStdk?KM&A0gJO,k&C+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!r1n3,HoV"N3;\(_qg:C#HoV"N3;\(_qh.$-KKB!X3;\@iqh.$-KKB!`3r=Rk
+qh.$-HoV"V3r=:aqh.$-HoV"N3;\(_qg:C#HoV%F3W"1`r+n1eAMN:G+6?HDj]!>`<$14$+6QlY
+lte*%S:9).^!bE]fZ_O^bg"eabNQ:2qODj.KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$.N'7&k3rFq"
+qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$.N'7&k3rFq"qh.$.N'7)t4o9mnqh.#rA0gJO,jStd
+lXV:,A0gMX.0'>Is8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f$`(!daZk#bfe2Rc-+>U
+fZ_P:SP8p.3;\@iqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qh.$-KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$.AMN@Q.d(%dlte*Em-"$7q<[_Gkj7crjQG4OhWVh\qh.$-KKB!`3r=Rk
+r/<f9KKB$i4o9mnr/<f9KKB$i4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4o:4=r/<f9KKB!`3rEeM
+k?KM!Xde80kMYFag"bH;gtpK/f%A3ibKS5Sbg")F`QQKM`5T^=bg"bX^&*dhqh.$-KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr/<f9KKB$i4oC7%qh.$.N'7&k3rFq"r/<f9KKB/5s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
+g"bH4eCMRW`Pfa7`5T^6`Pom*Z0ZQ^r00MFPX55362[!Fr00MFPu7ID62Zs5qi+VRPX554;>cYE
+r0:.WPu7IE;>c\Vr0:.WPX554;>cYEr00MDbbkF?s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYI
+daZjkbg">Tc,@T?a0i2=CaeXd./[m;r00MFPX554;>cA9r0:.WPX55+4oCO1r0:.WN'7*'62Z[)
+r00MFPX55362[!Fr00MFPX554;>cYEr/<f9NE,n84oC7%r/<f9KKB$i4o:4=qODj%U2o@cLY-`S
+r+.VG>UoVU0)TNAr,XmqHoV"N3;\@iqg:C#KKAsW=Smb4qg:C#KKB!X3;\@iqh.$-KKB!`3r=Rk
+qh.$-NE,n84o9mnr/<f9KKB$i4oC7%qh.$-NE,n84oCRBs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<[_Gi8j(Sgtp5uc-+>U`5T^-]Y1hWWp=1@j]!>`<$14$+6?HDk?KLu<$2!j3rFq"
+r/<f:N'7&t<W%e=r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f:N'7)t4oC7%r/<f9KKB$i4oC7%
+r/<f:Pu6bAO0l:$['[3@XKAP)XfJP*X/rG(XKAP)XfJP*X/rG5PDe444Qfs!lXV:,A0g>C.dLUj
+lXV:,A0gMX./SZYr/<f:PX55+4oCO1r/<f:N'7)t4oC7%r/<f:N'7&t<W%e=r/<f9NE,n84oC7%
+r/<f:PX55362Z[)r00MFPX554;9,)aX/rFnSt)UQUr\7"k?KM">Uni7+6?HDlXV9o<%[HQ.,&/h
+k?KM">UoYf1]31pr/<f:N'7)t4o9mnqh.$-KKB!`3r=Rkqg:C#KKB!X3;\@iqg:C#KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$-KKB!`3r=:aqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\@i
+qg:C#KKB!X3;\@iqh.$-KKB!`3r=Rkqg:C#KKB!`3r=Rkqg:C#KKB!`3r=Rkqg:C#KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr3_Rbs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VqcH2M5.r+n1eAMO+!1]2&F
+r+n1eAMO+!1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!*1]2;Sr+n1eF#j/71]2;Sr,XmrF#j/71]2;S
+r+n1eF#j/71]1f=lXV:(>Uni7+6?HDj]!>b>Uni7+6?HDj]!>`<$14$+513_k)EEo[&hlt^$MnL
+qh.$-HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;dhXqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_
+qg:C#HoV%F3W"1`r,XmqHoV"N3;\(_r,XmqHoV%F3W*qYr,XmqHoV%F3TjWsk?KM">UnoA.d(%d
+j]!>b>UnoA.cjVOk?KM5`2s"=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,qe?Jjl3W"1`
+r,XmrF#j/>3W"1`r,XmqHoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qg:C#HoV"N3;\(_
+qg:C#HoV"N3;\(_r+n1TA0g89+6?HDj]!>b>UnoA.cjVOkB98GXImqjf%Jj8daZjreCN'tf$`(!
+daZk#bfe2Rc03$KqODj.KKB!X3;\@iqh.$-KKB!X3;\@iqh.$-HoV"V3r=Rkqg:C#KKB!X3;\@i
+qg:C#KKB!`3r=:aqh.$-HoV"V3r=Rkqg:C#KKB!X3;dhXk?KM&A0gJO,jStdlXV:;S9b/7s8W-!
+s8W-!s8W-!s8W-!o_/+QpA*Y-kMYFag"bH;gtpK/f$`(!bKS5ZeCMgec.BnIqh.$-HoV"N3;\(_
+qg:C#HoV"N3;\(_r,XmqHoV%F3W"1`qg:C#HoV"N3;\(_qg:C#HoV"N3;\@iqg:C#KKB!`3rF%Z
+j]!>`<$14$+6f#<kj7d%m-ilnkLnYIl.+D_NE,k'3;\(_qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$.N'7&k3r=Rkqh.$-KKB!`3r=Rkr+n1P>Unlq<p8o=kj7d%m-ilnkN:RT
+daZjreCMgec.L7``5T^=bg")F`Pfa7bKS6,V2P4u3;\@iqg:C#KKB!`3r=Rkqh.$-KKB!`3r=Rk
+qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr4Ijcs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQFt@f$`(!bKS5Sbg")F`Pfa7
+ert[^HoV%_4oCO1qi+VRN'7)t4oC7%qi+VRN'7)t4o9mnr/<f:N'7&t<W%e=r00MFN'7&t<W%e=
+r/<f:N'7*(;?-[rs8W-!s8W-!s8W-!s8W-!s8V`bq;C>si8j(LeCMgec,@T?`5T^6`Pp&`AER2I
+lXV:<HoV%g62Z[)r0:.WN'7)t4oC7%qi+VRN'7&k3rFq"qi+VQKKB!i<VqG1r/<f:N'7)t4oC7%
+r/<f:N'7)t4o9mnqh.$-KKB!`3r,"_kbX?\[B[?V]t:qj['[3P]Y1hWWlU*Hl"!'@<$13r*W'(o
+qeSRqHoV"N3;\(_qg:C#HoV"N3;\(_qKuEBKKB!X3;\@iqKuEBKKB!X3;\@iqg:C#KKB!`3r=Rk
+qKuEBKKB!`3r=Rkqh.$-KKAtJXT/>#s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhTO-f
+bKS5L`PoI%]sP/RaG"-c<$14$+6?HDj]!>`<$14$+8f\)qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rk
+qi+VQKKB!`3r=Rkqh.$-KKB!`3r=Rkqg:C#KKB!X3;\@iqh.$-NE,,CS&W+P]=bhh]Y1qi]sP/R
+X/rG1['Zm8XfJP*X/rG(XKAP)XfJP*Unsm.Kk'4D+6?HDj]!>`<$14$+6?HDk?KLu<$2$S1])hd
+qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$.N'7&k3rFq"qh.$.N'7)t4o:4=r/<f:N'7&t<W%e=
+r/<f:Pu4?RUnji_UnslrHtqhL.cjVOfi0Qb<$0dm/a$@gk?KLu<$1:..cjVOr+n1eN'7&k3r=Rk
+qh.$-KKB!`3r=:aqg:C#HoV"N3;[emqg:C#HoV"N3;\(_qg:C#HoV"N3;\(_qKuEBHoV"N3;\(_
+r,XmqHoV"N3;dhXqg:C$F#j,F3;dSKr+.VKA0h%P-fn;Lqc,$AAMO+!1]2;Sqg:C#HoV%F3W"1`
+qg:C$F#j,F3;\(_r,XmqHoV"N3;\(_r,XmqHoUtM=SmJ*qg:C#KKB!X3;\@iqg:C#HoV"N3;\(_
+qg:C#KKB$r;?-[rs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7ta7r+n1eAMO*o1&G3.qckcN>V>qc1&PT;r+.V\AMO*o1&PT;
+r+.V\Cbu!#1&PiDr+.V\Cbu!*1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!*1](E0j]!>`<$14$+6?HD
+j]!>`<$14$+6?HDj]!>T<%[32+6QlYb`QGf`4aUKf$`(!bKS5Sbg"eabN,gRqh.$.F#j/>3W*qY
+r,XmrF#j/>3W*qYqg:C$F#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr+n1eF#j/71]2&F
+r+n1eCbu!13W*\Lr,XmrF#j/>3W*qYr+.VE<$14$+6?HDj]!>`<$1:..cjVOj]!>b>Uni7+8<=C
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq>$7tr+n1eCbu!*1]2;Sr,XmrF#j/>3W*qY
+r,XmrF#j/>3W"1`qg:C#FAD^\3;\(_qg:C$F#j,F3;\(_r,XmqHoV"N3;dhXr+n1TA0g89+6?HD
+j]!>`<$1:..cjVOlXV:'Xde80kMYFai8j(ZjQG[\gtCK>g"bH4eCN'tf$`(!daZjkbg"eabLa\G
+q36%"F#j,F3;\(_qg:C#HoV"N3;\(_qg:C$F#j,F3;\(_r,XmqHoV"N3;dhXqg:C#HoV%F3W"1`
+qg:C$F#j,F3;\(_qg:C$F#iPs,iquIk?KM">UnoA.dLUjp[%)Cs8W-!s8W-!s8W-!s8W-!s7H$\
+kj7d%m-j)lgtCK>daZjreCMgec-+>UdaZjkbg#@aYkrf-qg:C$F#j/>3W*qYr,XmrF#j/>3W*qY
+r,XmrF#j/>3W*qYr,XmrF#j,F3;[emqg:C#FAD^\3;dhXqg:C#HoV%81$)+Mj\6cW<$1>:Yi+U*
+i8j(SgtqmtH2DtKr,XmqHoV%F3W"1`qg:C#HoV"N3;\(_qh.$-HoV"V3r=Rkqh.$-KKB!`3r45+
+qh.$-HoV"N3;\(_qh.$.F#iDg.d(tCp[%)0oC_JAp#tc2i8j(`gt^T<hU9p)bKS5Sbg">Tc-+>U
+`5T^=bg")F`Rqi3qh.$-HoV"N3;\(_qfGU1HoV%F3W"1`r,XmqHoV"N3;\(_qg:C#HoV"N3;\(_
+qg:C#HoV"N3;\(_qKuEBKKAsW=TAF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjkbg")F`Pfa7`5T^8]XmHG./SZYqh.$.N'7&k3rFq"
+qh.$-KKB!`3r=Rkqh.$-KKAm\@f(g>qh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkr3_Rbs8W-!s8W-!
+s8W-!s8W-!s6T@Mkj7crjQFt@f$`(!bKS5L`Pod7`Q,Bkk?KM">Uo&M,l<6Uqh.$-NE,k/3rFq"
+qh.$-KKB$i4o9mnqh.$-KKB!`3r=Rkqh.$-KKB!`3r=Rkqh.$-KKB!`3r45+qh.$-KKAsW=Sn(X
+k,k,m]Xl+q]">Vg]=bhh]Y1qi]t:qj['[3P]Y1hWWlU*Hk?KLi9-E:b)#I;\r+.V\F#j,F3;[em
+qg:C#HoV%F3W"1`qg:C#FAD^\3;\(_qg:C#HoV"N3;S#)qg:C#HoV"N3;\(_qg:C#HoV"V3r=Rk
+qh.$1s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_&&kLnYIdaZjkbg")F`Oidr]=bheXfC&R/`]A<
+fh3IL9c_n[+QZQEj\6cnF#j,F3;\(_qg:C"Hs$8n3;\(_qKuEBHoV"N3;\(_qKuEBHoUtM=SmJ*
+qKuECF#j,F3;S#)r,XmpHs$<BD:m(UbKS5Sbg")F`Oidr]=bhh]Y1\Z[&^:1X/rG(XKAP)XfJP*
+X/rG(XKAP)Xf.\Rgh]+7<$14$+6?HDj]!>`<$14$+6?HDj]!?"AMO(83r45+qg:C#KKAsW=SmJ*
+qg:C"Hs$8n3;\@iqKuEBKKB!X3;\@iqh.$-KKB!`3r=Rkr/<f:N'7)t4o9mnq36#tV50o`Ur[Xa
+j]!>T<%[32+6?HDj]!>T<%[32+5'UFj]!>`<$2$L1&H>Xqg:C#HoV"N3;[emr,XmrF#j/>3W*qY
+r,XmrF#j/>3W!VYr+n1dCdIu81]2;Sr,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr+n1eF#j/71](E0
+qc,$)7Mt2U)!".'j@1!>9-Dn\+QQ!/j@1!J<$2!;-i@d:r,XmrF#j/71]2;Sr+n1eCbu!13W*qY
+r+n1eF#j/>3W*qYr,XmrF#j/>3W!nnr,XmrF#j/>3W"1`qg:C$F#j,F3;dhXqg:BqpA+ags8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,qS9b$D1&FruqckcN>V>nY0)Jm+qc,$@<@@ZD-i7.$qckcN>V>qc1&G3.r+.V\AMO'e0)T98
+r+.V\AMO*o1&PT;r+.V\AMO*o1&Fruj\6cW<$0dd+QZ<<fh3I@9-Dn\+PBC1fh3IL<$0dd+QZQE
+g4Wqe`4ajZhV$]@g"bH;gtpK/f$`(!daZk#bfe2Rc17TLr,XmrF#j/>3W*\Lr,XmrCbu!*1]2;S
+r+n1eF#j/71]2&Fr+n1eCbu!*1]2&Fr+.V\Cbu!#1&PT;r+n1eAMO*o1&PT;r+.V\AMO*o1&PiD
+r+.V\Cbu!#1$)@Vj]!>`<$14$+5'UFj]!>`<$0dd+QZQEj]!>r\YfE,s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\prgJNCbu!#1&PiDr+.V\AMO+!1]1f=r+n1eAMO+!1]2&Fr+n1eCbu!*1]2&F
+r,XmrCbu!13W*qYr+n1eF#j/>3W*\Lr+n1d>V>,;+6?3;j\6cW9c`=p+6?HDj]!>fJn4-!\a8q\
+m.9oEm-!U!n*'-,kj7crjQG4OhV$]@g"bH4eCN'tf$`(!daZjkbg"eabPA9)qg:C#CdIu?3W*qY
+r,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*qY
+r+.VE<$14$+6?HDj]!>`<$1t,H2mpEs8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp`>hU9p)
+daZjreCMgec.L7`bKS6%U2p0Q3W*qYr,XmrCbu!13W*\Lr,XmrCbu!13W*\Lr+n1eCbu!*1]2&F
+r+n1eCbu!*1]2&Fr+n1eF#j/71]2;Sr+n1N<$10j)!".'k?KM$e^rL0hY4RXr,XmrF#j/>3W*qY
+r,XmrF#j/>3W*qYqg:C$F#j/>3W"1`r,XmqHoV%F3W!nnqg:C#HoV"N3;\(_qg:C#HoV%F3TX3^
+k?KM4gsQ0%s8W-!o_/+QpA*q=n*'-,g"bH;gtpK/f#u:^bKS5L`Pp$Ec-+>UbKS5L`Pq\DH2M_D
+r,XmrF#j/>3W*qYr,XmrCbu!13W*qYr,XmrF#j/>3W*qYqg:C$F#j/>3W"1`qfGU1HoV%F3W"1`
+r,Xmp`2s"=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+i8j(SgtpK/f%A3i`5T^6`Pod7`RgW/r+n1dHoV"V3r=:aqh.$-HoV"N3;S#)qh.$-HoUtM=Smb4
+qh.$-HoV"N3;\(_qKuEBHoV"N3;S#)qg:C#HoUclq>^Kps8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
+daZjkbg")F`Q#R%`5T^:Mga\d+6?3;r+.V[HoV"N3;\(_qg:C"Hs$9!3r=RkqKuEBKKB!`3r=Rk
+qh.$-HoV"V3r=:aqKuEBHoUtM=Smb4qKuEBHoV"N3;\@iq5on)bg">Tc,@T?]=bhq`PoI%]uI^r
+['[3P]Y1qi]sP/R]=bhh]Y1hWWmbuefh3IK7MsfG)>dD]r+n1eF#j/>3W*qYr,XmrF#j/>3W*qY
+r,XmqCdIu?3W!VYr,XmrF#j/>3W"1`r,XmrF#j,F3;[emr,XmpHs$8n3;g1Es8W-!s8W-!s8W-!
+s8W-!s8VHWp#tc2i8j(LeCMgec,@T?]=bhh]Y1\Z[)m].j@1!>6Q+rS)!".'j@1!I7Mu#&-i@d:
+r,XmqCdIu?3W*qYr,XmrF#j/>3W*qYqeSRrF#j/>3W*qYr,XmrF#j/>3W*qYr+n1eF#j,F3;URp
+g"bH;gtpK/f#u:^bKS5L`PoI%]t:qj['[3I['[?FWiN5'X/rG(XKAP)Xe_eh\Vbdr<$0dd+QQ!/
+fh3I@9-E=q+5':0j]!>`<$2$S1])PZqg:C#HoV"N3;dhXqg:C#FAD^\3;\(_qg:C$F#j,F3;\(_
+qg:C"Hs$8n3;\(_qKuEBKKB!X3;\@iqg:C#KKB!`3ldYJUnsm.FC*Wn+PBC1fh3I@9-E=q+5':0
+j]!>T9-E=q+5':0qckcNHoV%F3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W*\Lr+n1eCbu!*1]2&F
+r+n1eCbu!*1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!*1[BX'[uH*_D,f1U);.@pfg?Y16Q+QE);.@p
+j@1!>6Q+QE)<=7(j@1!I7Mu#&-i@O1r+n1eCbu!*1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!*1]2&F
+r+n1eF#j/71]2;Sr+n1eCbu!*1]2;Sr+n1eF#j/>3VhIXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8Vi[kPSmGqc,$@>V>nR-i6mk
+qc,$@<@@ZK0)JWrqc,$@<@@ZK0)Jm+qc,$@>V>nY0)Jm+qckcN>V>nR-i7.$qckcOAMO*o1&G3.
+j]!>_7Mt5]*TT[,fh3IL9c`:a)!+I4j\6cK9-E:b)!".'fi0QUXInG3kMYFakj7ckgtpuMkLnYI
+g"bH;gtpK/f$`(!bKS5ZeCN9b[ek_=r+n1eAMO*o1&PiDr+.V\AMO*o1&PT;r+.V\AMO'e0)Jm+
+qckcN>V>nY0)Jm+qckcOAMO'e0)T98r+.V[>V>nY0)T98qckcOAMO*o1&PT;qckc89c`:a(thP)
+fh3I@9-E=j*SF(.j\6cV7MsfO+RZUss8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+TF<W$D_
+qckcN>V>qc1&G3.qckcOAMO'e0)T98r+.V\AMO*o1&PT;r+.V\Cbu!#1&PT;r+.V\Cbu!#1&PT;
+r+.V\AMN:@*TT[,j@1!I7MsfO+QQ!/fg?Y19-EJ`II-Ruo_/+QpA+@Sq=OCVo_/+IoC_>6n*'-,
+i8j(ZjQG[\gtCK>daZjreCN'tf%A3ibKS5Sbg"eQ[ebARr+n1eCbu!#1&PiDr+n1eAMO+!1]2&F
+r+n1eCbu!*1]1f=r+n1eAMO+!1]2&Fr+n1eCbu!*1]2&Fr+n1eCbu!#1$)@Vj\6cK9-E=j*SF(.
+j]!?%s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ik1nb?eCN'tf$`(!bKS5ZeCMgec-+>U
+q36%"Cbu!*1]2&Fr+n1eCbu!#1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\Cbu!#1&PiD
+r+n1eCbu!*1]1f=j@1!>9-DnT);9aQfZ_P9HoV%?1]2&Fr+n1eF#j/>3W*qYr+n1eF#j/71]2;S
+r,XmrF#j/>3W*\Lr,XmrF#j/>3W*\Lr,XmrF#j/>3W!VYqc,#s9-F)LXT/>#s8W-!s8W-!s7H$\
+o_/+Em-iW_hV$]@daZk#bfe2Rc,@T?bKS5L`Pod7`QQKMfY"ZjCbu!*1]2&Fr+n1eCbu!*1]2&F
+r+n1eCbu!*1]2&Fr,XmrCbu!*1]2;Sr,XmrCbu!13W*qYr,XmrF#j/>3W*qYs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o.jQG4OhU9p)bKS5L`Pod7`Pfa7
+`k8n<CcqW31])PZqg:C#FADaT3W"1`qfGU1HoV%F3W"1`r,XmrF#j/>3W*qYr,XmqCdIu81](uS
+r+n1eCbu!*1]!Ves8W-!s8W-!s8W-!s8W-!s8V`bq<726g"bH4eCMgec-+>U`5T^-]Y1qi^"QsS
+fg?Y<7Mu&>1]2;Sr,XmrF#j/>3W"1`r,XmqHoV%F3W"1`qfGU1FAD^\3;\(_qfGU1HoV"N3;\(_
+qg:C#HoV"N3;\(_on[GHbfSPnhU9p)bKS5Sbg">Tc,@T?]=bhh]Y1qi]t:qj]=bhh]Y1\Z[(Eua
+]=bhh]Y2CEIG$t*j@1!A4r!'I)#IPjr+n1eF#j/71](uSr+n1eCbu!*1]2&Fr+n1eCbu!*1](uS
+r+n1eF#j,662YdaqeSRrF#j/>3W*\Lr,XmqFADl9s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhTO-f
+`5T^-]Y1qi]sP/R\?2da9-E"R']__#gccG-4qud9']__#qckcOCbu!*1]2&Fr+n1eCbu!*1]2&F
+r+n1eCbu!*1]2&Fr+n1eCbu!*1]2&Fr+n1eCbts)62YdaprgJ:m-ilnkLnYIg"bH4eCMgec,@T?
+`5T^-]Y1\Z[&^:1X/rG(XKAP)XfJP*\XJc'@nPfO)!".'j@1!I7MsfO+QZ<<j@1!I7Mu#&-i@d:
+r,XmrF#j/>3W*qYqg:C$F#j/>3W*qYr,XmrF#j/>3W*qYr,XmrF#j/>3W"1`r,XmqHoV"N3;dhX
+qg:C#FAD^\3;\(_qg:C#KK>p*Ur[CPj@1!I7Mt2U(th7ofg?Y<7MsfG)<=7(j@1!I7Mu#&-iA$G
+r+n1eF#j/71]2&Fr,XmrCbu!*1]2&Fr+n1eF#j/71]2&Fr+n1eCbu!#1&PT;r+n1eAMO*o1&PiD
+r+.V\Cbu!*1](uSb`QG+St)=BS=H1@[rc*?7Mt2U(th7oj@1!I7MsoE']__#fg?Y<7MsoE']__#
+j@1!`<@@]U1&PiDr+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\Cbu!#1&PT;r+.V\Cbu!#1&PiD
+r+.V\Cbu!*1]2&Fr+n1c`2s"=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!q5onY<@@ZD-i6mkqc,$@<@@ZD-i6mkqc,$@<@@ZD-i6mk
+qc,$@<@@ZD-i6mkqc,$@<@@ZD-i6mkqc,$@<@@ZD-i6mkqc,$)7Mt2U(th7ofg?Y44r!'I(th7o
+fg?Y44r!'I(th7ofg?Y2@lDu`bNS<]kj7d%m-j0)n*'-,kj7d%m-ilnkLnYIg"bH;gtpK/f$`(!
+bKS5Sbg#sJFo5f*r+.V[>V>nY0)Jm+r+.V[<@@ZD-i6mkqc,$@<@@ZD-i6mkqckcN<@@ZD-i6mk
+qc,$@<@@ZD-i6mkqckcN<@@ZK0)Jm+qckcN>V>nR-eUj)fg?Y<7MsfG)<=7(gccG57MsfG);.@p
+gccGH\YfE,s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=rI]r+.V[<@@]U1&G3.qckcN>V>nY0)Jm+
+qckcN>V>nR-i7.$qc,$@>V>nY0)Jm+qckcOAMO'e0)Jm+r+.V\AMO'^-fd`6j@1!I7MsfG)<=7(
+fg?Y44r!'I)!IfWo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+ILkNM:$i8j(ZjQG[\gtCK>
+daZjreCN'tf$`(!bKS5_`4c"p=Su_br+.V\AMO*o1&PT;r+.V[>V>nY0)T98qckcOAMO*o1&G3.
+r+.V[>V>qc1&PT;r+.V\AMO'e0)T98r+.V[<@?Qc']__#gccG57MsfG)>]kKs8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\p[%),m-ilnkLnYIg"bH4eCN'tf#u:^bKS5ZeCN6i^&*1:r+n1eCbu!#1&PT;
+r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V[>V>qc1&PT;r+.V\AMO'^-epm"
+j@1!I7Mu#E:AeZXr+.V\Cbu!#1&PiDr+.V\AMO*o1&PT;r+n1eAMO*o1&PT;r+n1eAMO+!1]1f=
+r+n1eCbu!*1](uSr+n1d<@?He)>]kKs8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtpK/f#u:^
+bKS5Sbg">Tc-+>UfZ_OW`Pp$Ec1lp#r+.V\AMO*o1&PT;r+.VYANfs&1&PT;r+n1eAMO*o1&PiD
+r+.V\AMO*o1&PT;r+.V\Cbu!#1&PiDr+n1eCbtk0_#OH7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH4eCMgec-+>U`5T^6`PoooSblD7r,XmrF#j/71]2;S
+r,XmrCbu!*1]2&Fr+n1dCdIu81](uSr+.V[CdIu11&PiDr+.V\Cbu!#1&PiDr+.VYjPg.=s8W-!
+s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5L`PoI%]u7n/aK25k6Q+ZC'`1lXr+n1eCbu!*1]2&F
+r+n1eCbu!*1](uSr+n1dCdIu?3W*qYr,XmrF#j/>3W*qYr,XmqCdIu?3W!VYr,XmpHs$0nal)7C
+i8j(Sgtp`>hU9p)bKS5Sbg")F`Pfa7]=bhs]XkJW[(Eua]=bhh]Y1\Z['[3I['[3^HtV4u'\Phk
+gccG57Mu#-0)T98r+.V\Cbu!*1]2&Fr+.V\Cbu!#1&PiDr+.V\Cbu!*1]2&Fr+n1eCbu!*1]2&F
+r+n1eCbu!*1]2&Fq5on]s8W-!s8W-!s8W,coC_>6n(HLQdaZjkbg")F`Oidr]=bha['[o-EnNet
+gccG-4r!'I(u.:hj@1!J9ca.J1]2&Fr+n1eCbu!*1]2&Fr+.V\Cbu!*1]1f=r+.V\AMO+!1]1f=
+qeSRrCbu!*1]2&Fr+.VZ`2rV)q<726kj7crjQG4OhU9p)bKS5Sbg!c4]t:qj['[3P]Y1AIXfJP*
+X/rG6Km;9M/_iN(fg?Y44qu[;);.@pfg?Y44r!'I)#IPjr+n1eCbu!*1]2&Fr+n1eCbts)62YOT
+r,XmrCbu!*1](uSr+n1dCdIu81]2&Fr+n1eCbts)62YOTqeSRrF#j/>3W*qYr,XmrF#j,>:?ROT
+Unsm.D,f1U);ICigccG*6Q+ZC'\kkdfg?Y44qud9'\Phkqc,$AAMO+!1]2&Fr+n1eCbu!#1&PiD
+r+n1eAMO+!1]1f=r+.V\Cbu!#1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;qeSR=R>m`.S=H1@
+S=Z7HV50WQS@W9-gccG57MsoE'\kkdgccG-4qud9'\kkdgccG-4qud9'\kkdqc,$AAMO*o1&PT;
+r+.V\AMO+!1\kTFr+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V[>V>qc1&7Z(
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+Vt1&Fruqc,$@<@@ZD-i6mkqc,$@>V>nR-i7.$qc,$@>V>nR-i6mkqckcN<@@ZD-i7.$
+qc,$@<@@ZK0)JWrqc,$@<@?Qc'\kkdgccG*6Q+QE);.@pfg?Y16Q+QE);.@pgccG-4qu^\2WifM
+kj7d%m-j<4p$D;Cp[%)0oC_JAp#tc2kj7d%m-ilnkLnYIg"bH;gtpK/f$`(!bKS5qP^WF/-i6mk
+qc,$@<@@ZD-i7.$qckcN>V>nY0)T98qckcN>V>nY0)Jm+qckcN>V>nY0)JWrqckcN>V>nR-i6mk
+qckcN<@@ZD-i7.$qc,$)7MsoE'\kkdj@1!A4qud9'\kkdj@1!A4r!'I)#::us8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9oHS9b!:0)Jm+qc,$@>V>nY0)Jm+qc,$@>V>nY0)Jm+qckcOAMO'e0)Jm+
+qckcN>V>nR-i7.$qc,$@>V>nR-i6mkj@1!I7MsoE'\kkdgccG-4qud9'\kkdk_<pRs8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n*'-,i8j(Sgtp`>hV$]@daZjreCN9rbKJ,S
+f>PB#Cbtrn0)Jm+qckcN>V>nY0)T98qckcN>V>qc1&G3.r+.V\AMO*o1&G3.r+.V[>V>qc1&Fru
+r+.V[>V>nY0)JWrgccG-4qu[;);ICifg?Y?>UodRs8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
+kj7d#gt^T<hU9p)daZjreCN9rbKJ,SbKS5`]XI`S1]1f=qckcOAMO'e0)T98qckcOAMO*o1&PT;
+r+.VYANfs&1&5BDr+.V\AMO*o1&PT;r+.V[>V>qc1&PT;qckc77MsoE'`1lXr+.V\AMO*o1&PT;
+qckcOAMO*o1&PT;r+.V\AMO*o1&PT;r+.V\AMO*o1&G3.r+.V\AMO*o1&PT;r+.V\AMO'^-epm"
+k\Nrms8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)iE\g"bH4eCMgec-+>U`5T^=bg")F`QQKM
+`5T^ZZ`*b;62YOTqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIar+n1dCdIu11&PT;
+r+.V\AMO*o1&PT;qKuEFs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
+kj7ckgtpK/f%A3i`5T^6`Pod7`Pfa7g1*&<>V>qj1]1f=r+.V\AMO*o1&GcQr+.V\Cbu!#1&GcQ
+r+.V\Cbts)62YOTq.2_dCdIu81](uSqeSRqCdI`MD#aP8s8W-!s8W-!s8W-!s8W,coC_>6n(HLQ
+daZjkbg")F`Pfa7`k8mp]Y2C>EnihmgccGL<@@]U1&PT;q.2_eAMO*o1&5BDr+n1eAMO+!1]2&F
+r+.V\Cbu!*1]1f=r+n1eCbu!*1]2&Fr+n1eCbu!*1\\GWo_/+IoC_>6n)39ig"bH;gtpK/f$`(!
+bKS5L`Pod7`Oidr]=bhh]Y1\Z[(Eua['[3P]Y1qi]st2Ee6YPr6Q+QE);.@pj@1!aAMO'u62YOT
+qeSRqCdIr762PIaqeSRqCdIr762YOTr+.V\AMO*o1&PiDr+n1eCbu!*1]2&Fr+n1eAMO+(3WK-Z
+s8W-!s8V`bq<[_Gi8j(Sgtp5uc,@T?]=bhh]Y1\Z['[3Ia]U^\4qud9'\kkdgccG-4qud9'`1lX
+r+n1eCbu!#1&PT;r+n1bANfs-1]1f=q.2_eCbts)62PIar+n1dCdIu11&PT;q.2_eCbtpXH2mpE
+o_/+QpA+(Hp#+ooi8j(LeCN'tf#5PH`5T^-]Y1\Z[&^:1['[39V52.A9&)TEgccG-4qud9'\kkd
+fg?Y44qud9']i%0r+.V\AMO+!1]1f=r+n1eAMO+!1]1f=r+.V\AMO*o1&PiDr+n1eAMO+!1]1f=
+r+n1eAMO+!1]1f=r+n1eAMO*o1&PT;r+n1eCbts)62Gt2\XJbYV50o`UpkGTgccG-4qu[;);.@p
+gccG*6Q+ZC'\kkdfg?Y44r!*Q*W0J'r+.V\AMO*o1&PT;r+.V\AMO*o1&PT;r+.V\AMO'u62Y:K
+qeSRrCbts)62YOTq.2_eCbu!#1&GcQr+.V\Cbt:0Cn.)eUnslWSt)=BS=H1@S=Z7LN/$"Y+PB+"
+fg?Y16Q+QE);.@pfg?Y16Q+QE);.@pfg?Y44qu[;)>n&#r+n1dCdIr762>(TqeSRrCbts)62Y:K
+q.2_eCbu!#1&GcQr+n1bANfs&1&5BDr+.VYANfs&1&GcQr+.VYP]d$+s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8'[8qc,$@<@@ZD-i6mk
+qc,$@<@@ZK0)JWrqckcN>V>nY0)Jm+qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+qckcN>V>2E.bR0,
+fg?Y16Q+!7,2#=$fh3I@6Q+QM+PB+"fh3I@6Q+!7,2#pIk01s2m-j<4p%7tRo_/+QpA+ags8W-!
+o_/+QpA+@Sq=j7=kj7crjQGI^kLnYIg"bH4eCN'tf#u:^pk*&Q>V>qc1&G3.r+.V[>V>nY0)Jm+
+qckcN>V>nY0)T98qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+qckcOAMO'e0)Jm+qckcN<@@ZD-epm"
+gccG*6Q+ZC'\kkdfg?Y44qu[;);.@pgccG9Z`*p(s8W-!s8W-!s8W-!s8W-!s8W,kpA+OFiVRFW
+qckcN>V>qc1&G3.qckcOAMO'e0)T98qckcOAMO'e0)Jm+r+.V[>V>nY0)T98qckcN>V>qc1&G3.
+r+.V[<@?Qc'\Phkfg?Y44qu[;);.@pfg?Y1>s%]Pq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\o_/+Em-j0)n*'-,k1nbFgtp`>hU9p)bKS5ZeCMgec02L4qckcOAMO'e0)T98
+r+.V[>V>qc1&PT;r+.V\AMO*o1&PT;q.2_eAMO+!1]2&Fr+.V\AMO*o1&PT;r+n1eAMN:G+5'"!
+fh3I@6Q+QE);.@pprgJQs8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,k1nbFgtp`>hTO-f
+daZjkbg"eabKJ,SkbX@<AMO*o1&PT;r+.V\AMO*o1&PT;r+.VYANfs&1&5BDq.2_eAMO!l4o&YP
+q.2_bANfj#4oAkGr+.V\AMO*o1&G3.j@1!aAMO*o1&PT;r+.VYANfs&1&PT;r+.V\AMO*o1&PT;
+r+.V\AMO*o1&PT;r+.VYANfs&1&PT;r+.V\AMO*o1&G3.fg?Y=<$1c+q>^Kps8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7d%m-iW_hU9p)fZ_O^bg"eabJ_B=bKS5L`Pp$Ec-+>Upk*&QCdIr762PIa
+qeSRqFADaT3W!nnr,XmqFAD^L62YdaqeSRrF#j,662PIaqeSRqCdIr762PIaqeSRoANfs&1&9nh
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjkbg">Tc,@T?
+`5T^:XJP#Q*W0J'r+n1dCdIr762PIaqeSRqCdIr762YdaqeSRqCdIr762PIaqeSRqCdIr762PIa
+qeSRqCdIr762PIaq:sBts8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp5uc-+>U`5T^6`Pod7`Q#R%
+e6YPr6Q+QE)>n&#qeSRrCbts)62PIaqeSRrCbts)62PIar+n1bANfs-1]1f=q.2_eAMO!l4oB+P
+q.2_eAMO+!1\kTFqi+VUs8W-!s7H$\o_/+Em-j0)n)39ig"bH4eCN'tf#u:^`5T^6`Poj0]">Vg
+`k8mi['[HX]sP/R]=bhh]Y1kEPhA\Pfg?Y16Q+QE)>dD]qeSRqCdIr762PIaqeSRqCdIr762PIa
+qeSRqCdIr762PIaqeSRrAMO'u62Y:Kq.2_eCbtlu4oB+PqeSRnbJ=/Xs8W-!m.9o.jQG4OhU9p)
+bKS5L`PoI%]sP/R['[3MPDe3['\Phkfg?Y16Q+QE);ICij@1!aCbu!#1&PT;qeSRrAMO!l4oB+P
+qeSRqCdIu81](uSr+n1dCdIu81](uSqeSRrCbts)62Pb!o_/+\s8W-!s8W-!m.9o6m-ilnkLnYI
+bKS5Sbg!c4]t:qj]=bha['[B$I+_INfg?Y16Q+QE);.@pfg?Y16Q+QE);.@pqckcOCbu!*1]2&F
+r+n1dCdIu81](uSq.2_dCdIu81](uSr+n1bANfs-1\kTFr+n1dCdIr762PIar+n1dCdIl.4oB+P
+qeSRrAMO*o1&GcQfo10OV50o`Unji_UnslqCg#FY)9G;kfg?Y16Q+QE);.@pfg?Y16Q+QE);.@p
+qc,$ACbts)62PIaqeSRqCdIr762YOTqeSRqCdIr762PIar+n1dCdIr762PIar+n1bANfs-1](uS
+qeSRrCbts)62Pb!Unsl_V50WQS=H1@W1'!ASt)=BS=H1@\n+[j6Q+!7,2#=$fg?Y16Q+QE);.@p
+fh3I@6Q+QE);.@pfg?YS<@@Z[62YOTqeSRqCdIr762>(TqeSRrCbts)62PIaqeSRoANfs-1](uS
+qeSRqCdIr762YOTqeSRrAMO*o1&?9"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,lLhurg-i7.$qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+
+qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+qckcN>V>nY0)Jm+fh3I073]iB,0<7tfh3I073]iB,0<7t
+a[IDq73]iB,0<7ta[IE.UQap.n+?>Lo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
+kj7crjQG[\gtCK>daZjreCN9rbPQ*AqckcN>V>nY0)Jm+qckcN>V>qc1&G3.qckcN>V>nY0)T98
+qckcN>V>qc1&G3.r+.V[>V>nY0)Jm+qckcOAMO'e0)Jm+qc,#s6Q+QE)9G;kfg?Y!73^DP);.@p
+a[IE,6Q+!7,3H"ss8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mke+.s>V>nY0)Jm+qckcOAMO'e0)T98
+r+.V[>V>qc1&PT;r+.V\AMO*o1&PT;r+.V[>V>qc1&PT;qckcOAMO'^-eUj)fg?Y!73^DP);.@p
+fg?Y!73^DP)<e`;s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+kj7d%m-ilnkLnYIg"bH;gtpK/f$`(!fZ_O^bg#g:D#@j!r+.V\AMO*o1&PT;q.2_eAMO!l4o&YP
+qeSRoANfp,62PIaqeSRoANfp,62PIaqeSRqCdIr762PIaqckbo9.JUf+NI,)fh3I.9.K4S?N:'*
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIg"bH4eCN'tf#u:^daZjkbg">Tc2!TH
+r+.V\AMO*o1&5BDr+.V[CdIl.4o&YPqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762>(T
+r+n1dCdIl.4o9%]qeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIaqfGU1CdIr762PIa
+qeSRqCdIr762>(Tq.2_N9c_n[+SaI.s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
+g"bH;gtp5uc-+>UbKS5L`Pp$Ec-+>U`5T^=bg#:PS,7;&r,XmqFAD^T:A]-.qfGU1FAD^T:A]-.
+qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.r,XmqFAD^L62YdaqfGU/P]d$+s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726g"bH4eCN'tf#u:^`5T^6`Pod7`Q3.-qckcNCdIr762PIa
+r,XmqCdIr?:Af/nqfGU2F#j,>:Af/nqfGU2F#j,>:Af/nqfGU2F#j,>:Af/nqfGU1NE-#Ys8W-!
+s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2bKS5L`Pod7`Oidr]=bheXfC&I+N[%rj]!?!CdIr762PIa
+r,XmqCdIu?3W!VYqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdImPdJs7H
+s8W-!s8W-!s7H$\m.9o6m-ilnkLnYIdaZjreCMRW`Pfa7`5T^-]Y1qi]t:qj]=bha['[HX]sP/R
+]=bhuD,eVG,0<7ta%Io(73_VF62Ydar,XmrF#j/>3W*qYr,XmqCdIu?3W*qYqeSRqCdIr762PIa
+r+n1dCdIr762PIaqeSRqCdIr762[Nqs8W,kpA+(Hp#+oog"bH-bg")F`Oidr['[3I['[3I['tEt
+fg?Y16Q+QE);.@pfg?Y16Q,c$-i@d:qeSRrCbu!#1&GcQqeSRqCdIr762YOTqeSRqCdIr762PIa
+qeSRqCdIu?3W!VYqeSRp`2s"=s8W-!s8W-!s8V`bq<726i8j(LeCN'tf#5PH`5T^-]Y1AIXiPTj
+a%Io86Q+!7,0<7tfh3I073^DX+N[%rj]!?"Cbts)62PIaqeSRqCdIr762PIar,XmqCdIu?3W!VY
+qeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIar+n1dCdIu81\kTFpk*%sUn+<XUnji_
+Unsl_V50o`Ur[Xaa[IDq73]iB,0<7ta[IDq73]iB,0<7ta[IDq73^hf*W'Y=qeSRqCdIr762PIa
+qeSRqCdIr762PIaqeSRqCdIr762PIar+n1bANfp,62PIar+.VYANfp,62>(TqeSR]MfGf!Xe_eh
+UnslWSt)=BS=H1@S=Z7@St)^3I*"f$fg?Y!73]iB,0<7ta[IDq73]iB,0<7ta[IE,6Q+!7,2#=$
+qeSRqCdIr762PIaqeSRqCdIr762PIaq.2_dCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIa
+qeSRrF#j:#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VoUiVQk4k?KM6<@?s7.f33nk?KM6<@?s7.d(%dk?KM">UnoA.cjVOl"!'B>UnoA.d(%d
+k?KM$A3f<_.d:J/k?KLi<%Z3\,0*>+a[IDo9.ItT.`k+'a%Io&9.J%P,0*>+a%Io(73]fi<9W];
+o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,i8j(`gt^T<hU9p)
+daZk#XIoAp0)9'Al"!'V>V>h`4o8J:qckcN>V>h`4o8J:q.2_d>V>h`4o8J:r+.V[>V>h`4o8J:
+r+.V\AMO'e0)Jm+r+.V[>V>2E.`k+'a[IDq73]iB,2#U3a[IDq73]iB,0<7tfg?Y@Z`*p(s8W-!
+s8W-!s8W-!s8W-!o_/+Em-jb7FnoT3q.2_bANfj#4o&YPr+.VYANfj#4o&YPq.2_bANfj#4o&YP
+q.2_bANfj#4o&YPq.2_bANfs&1&5BDj]!>D73]iB,2#U3a[IDq73]iB,0<7tg20[ds8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d%m-j)lgtCK>
+daZjreCMgec-k+mf>PB"CdIl.4o&YPq.2_dCdIl.4o9%]qeSRqCdIr762PIaqeSRqCdIr762PIa
+qeSRqCdIr762PIaqeSRqCdIr76.nmRa%Io&9.ItT.`k+'a]U_*s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s6T@Mkj7d#gt^T<hV$]@daZjreCMgec-+>UdaZk"`4bi"D#8$7qeSRqCdIr762PIa
+qeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr762PIa
+qeSRrF#j,>:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.r,XmqFAD^L62PIaqeSRqCdI/^+3?qq
+kbX@?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjreCMgec-+>U
+`5T^=bg")F`RrDX`5T^jK4=_":A]-.qfGU1FAD[[=Sm28qKuEAHs$5m=SdDIqKuEAHs$5m=Sm28
+qKuEBFAD^T:A]-.qfGU1FAD^T:A\ino_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+m.9o.jQG4OhU9p)bKS5L`Pod7`Pfa7a0i2*<%[u`62PIar,XmqCdIr?:Af/nqfGU1CdIr?:A]-.
+qfGU1FAD^T:A]-.qfGU1FAD^T:AT??qfGU0Hs$8f:AN\ms8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
+g"bH4eCMgec,@T?`k8n$`PoI%]uQP#a%Io&9.KgD0)K`cqfGU1FAD^T:A]-.qfGU2F#j,>:Af/n
+r,XmrF#j/>3W!nnr,XmrF#j/>3W*qYqeSRrF#j/>3Ven^s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
+kj7crjQG4OhU9p)daZjd`Pod7`Oidr]=bhh]Y1\Z[(Eua['[3P]Y1\Z[(2Wia[IE,9-D>F,2#U3
+k?KM6CdIr?:A]-.qfGU1CdIr?:Af/nqfGU1CdIr?:Af/nr,XmrF#j,662PIaqeSRqCdIr762Yda
+qeSRpHs$FKs6T@Mkj7ckgtpK/f#u:^`5T^-]Y1qi]sP/R\?2dQ=Za_o,0<7tfg?Y!73]iB,0<7t
+q.2_dCdIr762PIaqfGU2F#j/>3W*qYqeSRqFADaT3W!nnr,XmrF#j,>:Af/nqfGU2F#j#J@fQK.
+s8W-!s8W-!s7H$\m.9o6m-ilnkLnYIdaZjd`Pod7`ODY9a]U^G9.ItT.`Y13a%Io&9.J%P,0*>+
+a%IoXANfp4:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:Af/nqfGU2F#j,>:Af/n
+r,XmqCdIu?3W!VYqeSRqCdIr762PIaqfGTsV2r7$]rS6:Unsl_V50o`Unji_UnslrFCN?\,0<7t
+a[IDq73]iB,0<7ta[IDq73]iB,0<7tj]!?"F#j,662YdaqeSRrF#j,662PIaqeSRqCdIr762PIa
+qeSRqCdIr762PIaqeSRqCdIr762PIaqeSRqCdIr76-,jm\?2d,V50o`Un"$HW1'!ASt)=BS=H1@
+W1'!n73]iB,0<7ta[IDq73]iB,0<7ta[IDq73]iB,0<7ta[IDq73_V60)9'AqeSRqCdIr762PIa
+qeSRqCdIr762YdaqeSRqFAD^L62PIaqfGU2F#j,662PIaqeSRqCdIr762PIao_/+\s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!pUR0a>UnoA.d(%d
+k?KM">UnoA.d(%dk?KM6>V>2E.d:J/k?KM$A3f<_.d(%dl"!'B>UnuK5j)B%k?KM$A3f<_.`Y13
+\OIsg73]cF.`Y13\OIsg73]93-cne$a%Inm7OQ;H,0*>+fY"ZbpA+ags8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n*'-,g"bH;gtpK/f$`(!l[i[1>UoP\4m?KB
+k?KM$A3fBi5l4e=l"!'DA3g#s0'Qn3qckc<A3fs%4m?KBq.2_bANfoq0'Qn3q.2_bANfoq0)9'A
+j]!>D73]iB,0<7ta[IDo9.J%P,0<7ta[IDq73]cF.d!k&s8W-!s8W-!s8W-!s8W-!s8V`bq<$Jf
+q.2_bANfj#4o&YPq.2_bANfj#4o9%]qeSRoANfp,62PIaqeSRqCdIr762>(TqeSRoANfj#4o&YP
+q.2_d>V=,e,0<7ta[IDq73]iB,0<7ta[IDq73_THXT/>#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ILkNM:$i8j(Sgtp`>hV$]@daZjkbg">Tc/kIN
+q.2_dCdIr762PIaq.2_bANfj#4o&YPqeSRoANfp,62PIaqeSRqFAD^L62PIaqeSRqCdIr762PIa
+qeSR]>Umia,0*>+a%Io&9.J%P,58XFs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726
+k1nbFgtpK/f$`(!daZjkbg">Tc-+>Uf>PB!Hs$8^62PIaqeSRqCdIr762PIaqeSRqCdIr762Pb!
+qeSRqFADaT3W!nnqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
+qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:?c:Sa%Io7KPphis8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtp`>hUp&qbKS5Sbg")F`QQKM`5T^=bg")F`TX.Z
+qfGU1FAD[[=Sm28qfGU0Hs$5m=Sm28qKuEBFAD^T:AT??qfGU0Hs$8f:AT??qKuEAHs$5m=SdDI
+qfGU0Hs$3@MuWhWs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39idaZjreCMgec,@T?
+`5T^6`PooOEr0)oqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU0Hs$8f:AT??
+qfGU0Hs$5m=Sm28on[Gas8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQFt@f#u:^bKS5L`PoI%]t:qj
+`5T^;HtUJm.`Y13qeSRpHs$8f:AT??qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qeSRqFAD^T:A]-.
+qeSRqFAD^T:A]-.qfGU/gsQ0%s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2i8j(SgtpK/f$`(!
+`5T^-]Y28&`O*"Z]=bha['[HX]sP/R]=bhh]Y2?q9$'LGa%Io(73]cF.f4$JqfGU1FADaT3W!nn
+qeSRqFAD^L62Pb!r,XmqFAD^T:A]-.r,XmqFADaT3W*qYqeSRqFAD^T:Af/nq;gMum-ilnkLnYI
+bKS5L`PoI%]sP/R['[3I['[?,MoeC3a[IDq73]iB,0<7ta[IE,9-F+J62YdaqfGU1FADaT3W!nn
+qeSRqFAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qS]K8s8W-!s8W-!s8W,kpA+(Hp#+oo
+g"bH4eCMgec,@T?[sVr29.ItT.`Y13a%Io&9.ItT.`Y13a%Io8>s%t*3Vn,*qfGU0Hs$8n3;S#)
+qfGU1HoV"F:AT??qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU2F#j,>:Af/n
+qfGU/P]bTr]u7n/['[3I['ZX*Unji_Unsl_V50o`Upb)Ba[IDq73]iB,0<7ta[IDq73]iB,0<7t
+a[IDq73^hm+8^.TqeSRqCdIr?:A]-.r,XmqFADaT3W!nnr,XmqFAD^L62YdaqeSRqCdIr762PIa
+qeSRrF#j,662Pb!pk*%f]Y1\Z[&^:1Unsl_V50WQS=H1@S=Z7@St)=BS@Vupa[IDq73]iB,0<7t
+a[IDq73]iB,0<7ta[IDq73]iB,0<7tj]!?!CdIr762PIaqeSRrF#j,662Pb!qeSRqFAD^L62Pb!
+qfGU1FAD^L62Pb!qfGU1FAD^T:A]-.qeSRqCdImXiW&rXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+!$?KYQCfj-]&>UnoA.d(%dfi0QfA3f<_.bS)h
+fj-]&>UnoA.d(%dfj-](A3fBi5hTF)k?KM$A3egR46^9@a%Inm7OQ;H,.U/j\OIsW7OQ;H,.U/j
+a%Inm7OP`9-b2\o\OIsfD,g0$q>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7d%m-ilnkMYFag"bH4eCN9ZXQa7\k?KM6>V>8O5l4e=l"!'DA3fBi5l4e=
+l"!'TANf9g5j;fEqckc<A3g#s0'Qn3q.2_RA3g#s0'Qn3q.2_RA3f<_.`Y13a%Io&9.J%P,.U/j
+a[IDo9.ItT.`Y13a[IE;Z`*p(s8W-!s8W-!s8W-!s7H$\kj7d%Z`*\24o&YPq.2_bANfj#4o9%]
+q.2_bANfp,62>(TqeSRoANfp,62>(TqeSRoANfp,62>(Tq.2_bANfj#4kWINa[IDo9.J%P,0*>+
+a%Io&9.J%P,04V#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_>6n)39ik1nb?eCN'tf$`(!fZ_Oj`4c%a62>(TqeSRoANfp,62PIa
+qeSRqCdIr762PIaqeSRqCdIr762PIaqfGU1CdIr?:A\inqeSRqFADXC4m?KBa%Io&9.J%P,0*>+
+a%Io6Ht*-Us8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n)iE\g"bH4eCN'tf#u:^
+daZjkbg"eabLj2'qfGU1FAD^T:A\inqfGU1CdIr762Pb!qeSRqFAD^T:A\inqfGU1CdIr?:A]-.
+qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU0Hs$8f:A]-.
+qfGU1FAD^T:A]-.qeSR=9.Itl9)nqks8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+(Hp#b&bg"bH4eCMgec-+>UbKS5Sbg">Tc,@T?bKS5_`4bqu@etISqfGU0Hs$8f:AT??
+qfGU0Hs$8f:AT??qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=Sm28qfGU5s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtpK/f%A3ibKS5L`Pod7`Q#R%a]U_&FAD^T:A]-.
+qfGU1FAD^T:A]-.qfGU1FAD^T:AT??qfGU0Hs$8f:A]-.qfGU0Hs$8f:AT??qfGU0Hs$6pYlFb'
+s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjkbg")F`Pfa7`5T^-]Y2=t]!cEX[o5?.9.Kg\:AT??
+qKuEBFAD[[=SdDIqfGU0Hs$8f:A]-.qfGU1FAD^T:A]-.qfGU1FAD[[=Sm28qfGU1FADU`@fQK.
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)39ig"bH4eCMgec,@T?]=bhs]XkJW[(Eua
+['[3P]Y1\Z['[3I\V5:<9JFL[.`Y13a[IE<A3g$6:A]-.qfGU1FAD^T:Af/nqfGU1CdIr?:A\in
+qfGU1CdIr?:A\inqfGU1FAD^T:A]-.qeSRqFAD\NXQ]$>i8j(LeCMgec,@T?]=bha['[3I['[3I
+[rc)i7OQ;H,.U/ja[IDq73]iB,3N2\qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
+qeSRqFAD^T:A]-.qfGU0Hs$FKs8W-!s8W-!s8V`bq<[_Gi8j(ZjQG4OhTO-faK25LAP]d63k.j;
+[o5>t9JEqS3k&$Ka%Ink;`a/R5l,k1qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEBFAD[[=SdDI
+qKuEAHs$5m=SdDIqKuEAHs$8f:AT??qfGU1FAD^T:A]-.qfGU+Lhu:fYh@ggbKS5L`PoI%]rS6:
+Unsl_V50o`Unji_UnslrFCMdM-b2\oa[IDa7OP`9-cne$\OIsg73]93-cne$fi0R#FAD^T:A]-.
+qfGU1CdIr?:A]-.qeSRqFAD^T:A\inqfGU1FAD^L62Pb!qfGU1FAD^T:A]-.qfGU1FAD(bICm/*
+['[3@XKA:pUnji_S=Z7@St)aJQ(4G9S=Z7MFCi!P-b2\o\OIsW7OP`9-b2\o\OIsg73]93-b2\o
+a[IDa7OQkg/c0?MqeSRqCdIr762Pb!qeSRqFAD^L62Pb!qfGU1FAD^L62Pb!qfGU1FAD^T:A\in
+qfGU1CdIr?:A]-.q:sBts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7ta7fk!\,>s$_F45!n$fj-\m>s%4S.bS)hfi0Qd>UnE445!Rbfj-\m>s%4S.bS)h
+fj-](A3egR45!n$fj-\m>s#Sd-b2\o\OIsW7OP`9-b2\o\OIsW7OP`9-b2\o\OIsW7OP`9-ePf-
+o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
+kj7crjQG4OhV$]@daZk3L2?*b5j;fEl"!'DA3f<_.d:J/l"!'DA3f<_.d:J/l"!'DA3fBi5j;fE
+l"!'DA3fBi5j;fEl"!'DA3fBi5j;fEfi0QD9.IJA-cne$\OIse9.IJA-b2\o\OIsW7OP`9-ePf-
+s8W-!s8W-!s8W-!s8W,kpA*q=n)oUKq.2_RA3fBi5j3#Xl"!'CCeX)(5j3#Xk\NrVCeX)(5j3#X
+k\NrVCeX&/9^$:dl"!'VCdI;r5l5@`l"!&h9JFRW,.L<#\OIse9.IJA-b2\oa%Io7XIoOms8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+m.9o6m-iW_hV$]@g"bH4eCMgec-+>Ul'-VnCdIl.4o9%]qeSRoANfp,62>(TqeSRqCdI9$9`&Wl
+qeSR^CeX_B62PIak\NriCdIr?:A\ink\NriCdH*7._&/+a%Inl9JEtM0ZdHZs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7d%m-iW_hV$]@daZjreCMgec-+>UbKS5Sbg#@JO8F#o
+qfGU1FAD^T:A]-.qfGU1FAD^T:A\inqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qKuEBFAD[[=SdDI
+qKuEAHs$8f:AT??qfGU0Hs$5m=Sm28qKuEAHs$5m=Sm28qKuEBFAD[[=Sm28qKuEBFAB;D3ltMd
+q;gN7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hU9p)
+daZjkbg">Tc,@T?`5T^6`Pp$Ec,@T?kbX@;FAD[[=SdDIqKuEBFAD[[=SdDIqKuEAHs$5m=SdDI
+qKuEAHs$5m=SdDIpk*&PHs$5m=SdDIqKuEAHs$5m=SKA's8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-ilnkLnYIdaZjkbg")F`Pfa7`5T^:Mgabn.f4<_qKuEBFAD[[=Sm28qKuEAHs$5m=SdDI
+qKuEBFAD[[=Sm28qKuEAHs$8n3;[emqKuEAHs$8f:ABHNs8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
+i8j(SgtpK/f#5PH`5T^-]Y1qi]u7n/]=bht>YV\+3ltMdpk*&PHs$5m=SdDIqKuEAHs$5m=SdDI
+qfGU0Hs$5m=SdDIqKuEBFAD[[=Sm28qKuEAHs$5m=SdDIr3_Rbs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o.jQG4OhU9p)daZjd`Pod7`Oidr]=bha['[HX]sP/R]=bha['[oMS[h3;
+a%Inl9JFL[.`Y13qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
+qfGU1FAD^T:A]-.q5on>jQG4OhU9p)`5T^-]Y1qi]sP/R['[3@XKB'>7EItB\4eTe7OP]>0Y'Y#
+\4eURCdIr?:A]-.qfGU1FAD^T:AT??qKuEAHs$8f:A]-.qKuEBFAD^T:A]-.qfGU1FAD^T:AM#V
+s8W-!s8W-!s6T@Mm.9o.jQGI^kL.l2bKS5?NJ4i?3k.j;\4eTs9.IGF0Xse1a%Inl9JFRk48X+p
+qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
+qKuEAHs$5m=SdDIqKuEAHs$3HPi1Wck1nbFgtp5uc,@T?['[3@XKA:pUnji_Unsl_V50o`UpkGT
+\OIsW7OP`9-b2\o\OIsW7OP`9-b2\o\OIsW7OQkg/c0WbqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
+qfGU1FAD^T:A]-.qfGU1CdIr?:A\inqfGU1FAD^T:A]-.fW:^``PoI%]sP/RX/rG!V50WQS=H1@
+S=Z7@St)=BS>V$f\OIsW7OP`9-b2\o\OIsb2E86:-b2\o\OIsW7OP`9-b2\o\OItDCdIr?:A]-.
+qfGU1CdIr?:A\inqfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qeSRqFADV\aoDD@
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,_Z`)A[7+kj-
+e6YPm?:<IP46^9@bZ%]t>s$_F45!n$fj-\m>s$_F45!n$fj-\m>s$_F45!n$fj-\m>s$_F43'uD
+\OIsW7OP`9-b2\o\OIsD6n>f;-`09^\OIsD6n>f;-`09^\m7bgm-juSs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ILkMYFai8j(SgtpK/f%@'r
+l"!'4AOkuq5h'+.l"!'DA3fBi5j;fEk\NrWA3fBi5j;fEl"!'DA3fBi5j;fEl"!'DA3fBi5j;fE
+l"!'DA3egR41Is<\OIsV9JEtM0Y'Y#\4eTe7OP]>0Xse1\4eU/XIo.Yq>^Kps8W-!s8V`bq<[_G
+k1nbUFB7UA9^-(Qk\NrWA3g$.60VoFk\NrVCeX)(5j3#Xk\NrVCeX&/9^$:dl"!'CCeX&/9^$:d
+k\NrWA3egR41Is<\4eTd9JF"H-b)i(\4eTd9JEqS3qr"(s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8Vi[kNM:$kj7d#gt^T<hU9p)
+daZk#bfeYGXQXIoqeSRqCdIr760N,Yq.2_dFAD^L60N,YqeSR^CeX_J:A\ink\NriFAD%99`&p,
+qeSR^CeX_J:A]-.e6YPQ9JEtM0ZdHZ\4eTd9JH7b_#OH7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VHWp#tc2k1nbFgtp`>hU9p)daZjkbg"Scf%A3ibKS5qP^WFN:A]-.qfGU1FAD^T:A]-.
+qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qKuEAHs$8f:AT??qfGU0Hs$8f:AT??qKuEBFAD[[=SdDI
+qfGU0Hs$5m=Sm28qKuEBFAD[[=SdDIqKuEAHs$8f:<-U6\4eU?Z`*p(s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726k1nbFgtpK/f%A3i`5T^=bg">Tc-+>U
+`5T^=bg"eQ[ebARqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
+qKuE?K4=\)=SdDIqKuE1HsZjQs8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2g"bH4eCMgec-+>U
+`5T^6`Pod7`Q)I\qfGU0Hs$8f:AT??qKuEAHs$5m=Sm28qKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
+qKuEAHs$5m=SdDIqKuE?bJ=/Xs8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2daZjd`Pod7`Q#R%
+`5T^-]Y2@nZ+!Xm[o5?;?:=R@@etISqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEBFAD[[=SdDI
+qKuEAHs$5m=Sm28qKuEAHs$4*iW&rXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
+i8j(SgtpK/f#u:^`5T^-]Y1qi]t:qj['[3P]Y1\Z[(Eua]=bht>YV_%0ZQg9\4eTs9.Kg\:AT??
+qfGU0Hs$5m=Sm28qKuEAHs$8f:AT??qKuEAHs$5m=SdDIqKuEAHs$8f:AT??qKuEBFADY.Mr<[Z
+g"bH-bg")F`Oidr['[3I['[3I[(2Wi\4eTd9JEtM0Xse1\OIsV9JFL[.f4<_qKuEBFAD[[=SdDI
+qKuEBFAD[[=Sm28qKuEAHs$8f:AT??qKuEAHs$8f:AT??qfGU/gsQ0%s7H$\m.9o.jQGI^kLnYI
+daZjg[BZZA<4GUU\4eTd9JEtM0Xse1\4eTd9JEtM0\U"pqKuEAHs$5m=SdDIqKuEAHs$/r@etIS
+pk*&PHs$/r@etISpk*&PHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$3/Fnsh?
+o_/+Em-ilnkL.l2bKS5L`PoI%]rS6:Unsl_V50o`Unji_UnsldFChsU0Xse1\4eTd9JF"H-b)i(
+\OIsW7OP]>0Y'Y#e6YQ?FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.qfGU1FAD^T:A]-.
+qfGU1FAD^T:A]-.qfGU1FACH+]u7n/]=bha['Zm8Xe_ehUnslWSt)=BS=H1@S=Z7LN/"2t/#G]b
+`&9TP6n>f;-`09^VF2rQ2E7R%/%J+sVF2rF7OP`9-g>/,k\NriCdI9$9`&p,k\NriFAD%99`&p,
+k\NriFAD%A<p4?nqfGTsFB7UA9^$:dqfGTsFB7UA9`&p,q:sBts8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s43Bbe6YPm?:<:L7+>O2e6YPm?:<:L7+kj-
+e6YPr>s$_F44IS)fj-\`<*7gZ44IS)bZ%]t<%ZU+7*JV4fj-\M7OP'$/#G]bVF2r36n>-&/%J+s
+VF2r36n>f;-`09^VF2r36n?KDAG#Tks8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC_>6n(HLQg"bH:bfeIU;qY_Pl"!'4AOkEb8(hHD
+fk!\,AOkEb8(qfVfk!\;CeWMn8(qfVk\NrGAOks#9\EuIk\NrGAOkuq5hT^=fj-\L9JEtM0Xse1
+\4eTd9JEtM0Xse1\4eTd9JEtM0\EJ!s8W,kpA+@Sq=OCVo_/+IoC_4`_WYf0k\NrVCeX&/9\O>[
+k\NrHD,BG49^-(Qk\NrVCeX&/9^$:dk\NrVCeX&/9^$:dk\NrHD,BG49\O>[\4eTd9JEtM0Xse1
+W(f.Z9JEqS3k.j;aa@b$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQg"bH4eCN'tf#u:^bKS5rHsZ#Q9^$:d
+k\NrVCeX&/9^$:dk\NriFAD^T:?ZLfqfGTsFB7UA9`&p,k\NriFAD%A<r6u6k]BkhFB7(+8%2DX
+[o5>t9JEqS3k&$KgS9u4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)iE\
+g"bH4eCN'tf$`(!bKS5Sbg">Tc.L7`kDO?VHs$5m=SdDIqKuEAHs$5m=SdDIqKuEBFAD[[=Sm28
+qKuEAHs$8f:AT??qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
+qKuE/FB86c=R(9?fk![_;``!XIK0?Is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQdaZjreCMgec-+>U`5T^JbfdrD`QQKM`5T^WS;6rg=SdDI
+qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuE?K4=\)=SdDIpk*&PHs$5m=SdDIqKuE?K4=\)=SdDI
+prgJQs8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)fZ_OW`Pod7`Pfa7a-hq->YY'B=SdDI
+qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuE?K4=\)=SdDIpk*&PHs$/r@etISpk*&PHs$/r@fQK.
+s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2g"bH;gtp5uc,@T?`5T^-]Y1qi]t:qj\?2d?;`_Bd3ne(%
+pk*&NK4=V.@ebRbqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$/r@etIS
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)39idaZjkbg")F`Oidr
+]=bha['[HX]sP/R]=bha['[3I['t-d\4eTd9JEtM0XjtAk\NrhHs$5m=SdDIqKuEAHs$5m=SdDI
+qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=SdDIq36$TgtpK/f#u:^`5T^-]Y1qi]sP/R
+['[3=N/"i90W7]'\4eTd9JEtM0Xse1a]U_%Hs$5m=SdDIqKuEAHs$5m=SdDIqKuEAHs$5m=Sm28
+qKuEBFAD[[=Sm28qKuEAHs$&tD"RGso_/+Em-ilnkMYFadaZjkbg!VVKr7m7\4eTT9f9FS0W7]'
+\4eTd9JEtM0XjtAk]Bl%Hs$5m=SdDIqKuEAHs$5m=SRMXqKuE?K4=V.@d8>Ipk*&NK4=\)=SRMX
+pk*&NK4=\)=SRMXqKuE?K4=\)=SRMXqKuEAHs$&tD#2)Os8W-!s8V`bq<726i8j(LeCMgec,@T?
+['[3I['ZX*Unji_Unsl_V50o`UoA3<W(f.Z9JED>27Z1(W(f.Z9JEtM0W7]'\4eTd9JFRk48O>,
+qKuEAHs$5m=SdDIqKuEAHs$5m=SdDIqKuEBFAD%A<r.2Gk]Bl%Hs#TS<p4X+k]BkhFB7UI<p59S
+daZjkbg")F`O*"ZX/rG!V50WQS=H1@S=Z7@St)=BS=,S)W(f.H6n>-&/#G]bVF2r36n>-&/#G]b
+VF2r36n>f;-`09^VF2rf>s%q*:?ZLfk\NrVCeX_J:?ZLfk\NrVCeX&7<p4?nk]BkhFB7UI<p4X+
+k]BkhFB7UI<p4X+k]BkhFB84mdJs7Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+0E`:"`9ugL5a';?g?:;h=:!$O"a]U^T?:;n<43(T#a]U^L<*7XV7*/Rn
+e6YPb=Zb;B43:Vefj-\[>YW73.],TaVF2r36n>-&/#G]bVF2r36n>-&/#G]bVF2r36n>-&/#G]b
+daZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq=OCVkj7crjQG4OhU9p)ert[<AOkEb8(hHDfk!\,AOkHk:tfb_g20[?D,Ar':tfb_
+k\NrGAOkHk:tfb_g20[?D,BG49\O>[g20[MCeVlZ9"7PK\4eTT9f9CY3iGb1[o5>s;`^jO27HLF
+Vc5n5XInkNp%7tRo_/+QpA+(Hp#tc2kbX?oD,Ar':tfb_g20[?D,Ar':tfb_g20[?D,Ar':tfb_
+g20[>AOkHk:tfb_g20[?D,Ar';!;^hg20[>AOj7(0W.l7W(f.J9f9CY3iGb1W(f.J9f:S9[f?C-
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7d%m-iW_hV$]@daZjreCMgec.f"Wk]BkhFB7UI<p4X+k]BkhFB7UI<p4?n
+k]BkhFB7UA9^$S!k]BkhFB7UI<p4X+k]BkhFB7UI<p4X+k\Nqj<'Rij3k&$KVc5mi;`_@'=o\O%
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hWEVKdaZjreCN'tf#u:^
+bKS5Sbg"eQ[d&6HqKuE/FB86c=Qjj-qKuE/FB89\:AT??qKuEAHs$5m=SdDIqKuEAHs$5m=SdDI
+qKuE1HsZYs=SdDIl?lq7Hs$5m=R(9?qKuE1HsZ)c?M]%Ol?lq'HsZYs=R1QLpk*&2E`BMH3k'3?
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+kj7crjQG4OhTO-ffZ_O^bg">Tc,@T?bKS5L`Pp$Ec,RE-pk*&NK4=\)=SRMXpk*&NK4=\)=SRMX
+pk*&NK4=V.@ebRbpk*&NK4=\)=SRMXpk*&NK4=V.@ebRbpk*&PHs#TeD#aP8s8W-!s8W-!s8W-!
+s8W,coC_>6n(HLQdaZjreCMRW`Pfa7`5T^6`Po<.@d%o7pk*&NK4=V.@ebRbpk*&NK4=V.@ebRb
+pk*&NK4=V.@ebRbpk*&NK4=V.@ebRbpk*&NK4=V.@ebRbqS]K8s8W-!s8W-!s8W-!s8W-!s8W-!
+kj7d%m-iW_hU9p)bKS5N]Xl&#`Oidr`5T^-]Y2@nZ+!Xm[o5?AD,C"[@ebRbpk*&PHs$/r@ebRb
+pk*&NK4=V.@etISpk*&NK4=\)=SRMXpk*&NK4=V.@ebRbpk*&KLi!+ks8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhU9p)`5T^6`Poj0]">Vg['[3P]Y1\Z[(Eua
+['[3LHtp/b0XjtA[o5>t9JG.28,@U8qKuEAHs$5m=SdDIqKuEAHs$5m=SRMXqKuE?K4=V.@ebRb
+pk*&NK4=V.@ebRbpk*&PHs$&tCt[V#daZjd`PoI%]sP/R['[3I['[3I['t-dW(f.Z9JED>27Q=6
+W(f.J9f:U88,.^GqKuEAHs$5m=SdDIl?lq7Hs$5m=SdDIpk*&PHs$5m=SdDIqKuEAHs$5m=SdDI
+q5'#9oC_>6n)39ig"bH4eCM[JZ*nIOW(f.J9f9FS0W%5gW(f.Z9JED>27Q=6a(%a<Hs#Z]?M]%O
+l?lq'HsZYs=R(9?l?lq'HsZ)c?KuoEl?lq7Hs#]dAEnPKl[i[4HsZT#@d8>Il?lq5K4=+n?MK.^
+l[i[5Jn4Y/@eljYo_/+\s8W-!s8W-!o_/+Em-ilnkLnYIdaZj[]Y1qi]rS6:Unsl_V50o`Unji_
+UnsldFChsU0W7]'W(f.J9f9FS0W7]'W(f.Z9JED>25j5,a';@&FB7UI<pG'=k]BkhFB86c=Qjj-
+k]BkhFB7UI<pG'=qKuE/FB7[S?KuoEk]BkjHsZ#Y<pG'=k]BkVRZQ4XhU9p)`5T^-]Y1\Z[%sOo
+UnslWSt)aJQ(4G9S=Z7@St)`R25WblVF2r36n>-&/#G]bVF2r36n>-&/#G]bVF2r36n>-&/&tmh
+k\NrVCeX&7<p4?nk\NrVFB7UA9^$S!k\NrVFB7UA9^$S!k\NrVFB7UI<p4X+k]BkhFB7UA9^$S!
+q:sBts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V?6f?%/W
+a]U^I=Za`.43(T#a]U^G>YW7D:!$O"a';?\=ZaZ/:!$O"a]U^I=Za`.43:Vea]U^G>YW=C43:Ve
+\4eTR6n>-&/#G]bVF2r36n>-&/#G]bVF2r36n>-&/#G]bVF2rGAP_slq>^Kps8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
+k1nbFgtp\r[b54^g20[?D,Ar':tfb_g20[?D,Ar':tfb_g20[?D,Ar':t'G`g20[?D,Ar':tfb_
+drJC@D,Ar':t'G`aDFnc;`^gU5IXQPVc5mi;`^gU5GqIF[o5>c<'Rij3nUg@m.9oBpA+(Hp$D;C
+m.9o6m-iVdGhR"2g20[?D,Ar':tfb_g20[?D,Ar':tfb_g20[AE`Cb0:tfb_g20[?D,Ar':tfb_
+g20[?D,Ar':qBq$W(f.J9f9FS0W7]'W(f.J9f8kD25j5,q;gN7s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726
+k1nbFgtpK/f$`(!bKS5`]XHU9<7l=uk]BkXF^4-P<p4X+fQCH_FB71;<9SF)k]BkhFB7UI<p4X+
+k]BkhFB7UI<p4X+k]BkWHt);]<ju!gVc5mY<'Rij3i>qAVc5n\s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtp`>hU9p)daZjreCN9rbKJ,SbKS5`XIng1AEnPK
+qKuE1HsZYs=R(9?l?lq'HsZ)c?KuoEl?lq'HsZ)c?KuoEl?lq'HsZ)c?KuoEl?lq'HsZ)c?KuoE
+l[i[5Jn42!AGCddl?lq(Jn4Y/@dAVVl[i[4HsZ#Y<k;R*\m7c#jPg.=s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH;gtp5uc-+>U
+bKS5L`Pp$Ec,@T?bKS5L`Ppr/L\QL2k_<pKK4=V.@dAVVon[GMJn4Y/@dAVVpk*&NK4=V.@ebRb
+pk*&NK4=V.@ebRbpk*&PHs#]dAGCddl?lq5bJ=/Xs8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^
+bKS5L`Pod7`Q4jGa(%a:K4=V.@eGOnpk*&NK4=M0D"rWlpk*&NK4=M0D"rWlpk*&NK4=V.@ebRb
+pk*&NK4=V.@ebRbpk*&KLi!+ks8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCMRW`Oidr
+]=bhq`PoI%]u7n/\?2d?;`_Bd3ll/;qKuE?K4=V.@ebRbpk*&PHs$/r@ebRbqKuE?K4=V.@ebRb
+pk*&NK4=V.@ebRbpk*&NK4=V.@eGOns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VHWp#tc2g"bH4eCMgec,@T?]=bha['[HX]sP/R]=bha['[HX]r-6sW(f.I<'R<U27HLF
+a(%a:K4=V.@ebRbpk*&NK4=V.@ebRbpk*&NK4=.uAG(appk*&AJn4Y/@dAVVpk*&AJn4Y/@dAVV
+l[iZqeCMgec,@T?]=bha['[3I['[3IX/rG%AQ5U&25j5,W(f.J9f8kD27Q=6k]BkjHsZ)c?MK.^
+l?lq'HsZT#@d8>Il[i[DHs#Z]?M]%OqKuEAHs$5m=SdDIqKuEAHs#UFYi+U*i8j(SgtpK/f!pp%
+Vc5mZ9f8kD25j5,W(f.J9f8kD25j5,[o5?AD,C(V=R(9?qKuE1HsZ)c?MK.^l?lq(Jn4.o?MK.^
+l[i[5Jn42!AF"hXl[i[5Jn42!AEnPKl[i[5Jn42!AF"hXl[i[5Jn42!AG(appsdFcs8W-!s8W-!
+s8W-!s8VHWp#tc2i8j(LeCMgec,@T?['[3I['ZX*Unji_Unsl_V50o`UoAHIW(f.J9f8kD25j5,
+W(f.J9f8kD25j5,W(f.Z9JFRk46h3"pk*&@HsZ)c?KuoEl?lq'HsZYs=R(9?k]BkhFB7UI<pG'=
+k]BkhFB7UI<pG'=k]BkhFB7UI<p6B@g"bH4eCMRW`Oidr['[3@XKA:pUn"$HS=Z7@St)=BS=H1@
+VHZKd6n>-&/#G]bVF2r36n>-&/#G]bVF2r36n>-&/#G]bVF2rE9JG[H9\O>[k\NrVFB7+4;!;^h
+k]BkhCeWW)<9SF)gi?BXFB71;<8;Lngi?BJD,B#.<8;Lng20[MFB7YVfDkmNs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!fY"Z(>t)e=:!$O"\m7bH=ZaZ69"J:s
+a]U^I=ZaZ69$(3ta]U^I=ZaZ/:!$O"a';?\=ZaZ/:!$O"a]U^:>t(VY/#G]bVF2r36n>-&/#G]b
+VF2r36n>-&/#G]bVF2r36n>-&/'*p-o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjiHtV,D8(2KW
+a(%`qD,A;j<8)1caDFo1D,A;j<7>kdaDFo1D,A]%;qc(bdrJC@D,A]%;quCmfQCHSE`C+s<2W\[
+VHZKu;`^gU5GqIFVHZKu;`^gU5GhXRVHZL1XJP:Tp$D;Cm.9oBpA*q=n)39ifQCHSE`CM.;quCm
+drJCBE`Ch7<7>kdgi?BCE`:G-;qQ4tdrJC>F^3RA>hF1(g20[=F^3^B<7>kdgi?B*>t(\d25aD<
+Vc5mZ9f8kD25aD<W(f.XCg$f<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n)iE\daZjreCN9rbKJ,S
+fS".pF^3OG@b>g.fQCHOF^3RA>j-91fQCHOF^4-P<nMP"k]BkXF^4-P<nMP"l?lpjF^3OG@d8>I
+f6h&=>t(Yj5GqIFVc5mY<'R9[5PaC!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA*q=n)39ik1nbFgtpK/f#u:^daZjkbg">Tc-+>Ujd_+kHsZ)c?KuoEl?lq'HsZ)c?KuoE
+qKuE1HsZ)c?KuoEqKuE1HsZ)c?KuoEl?lq'HsZT#@dAVVpk*&AJn42!AF"hXl?lq(Jn42!AF"hX
+l[i[5Jn42!AF"hXa(%`=>=IbgYlFb's8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j)lgtCK>daZjkbg">Tc-+>U`5T^=bg")F`QQKM
+fX.aDL2?X;@d&P_k_<p;L2?(.D"WU#k_<p;L2?(.D!6Uil[i[5Jn42!AF"hXl[i[5Jn42!AF"hX
+l[i[5Jn42!AD)ods8W-!s8W-!s8W-!o_/+Em-j)lgsX^'fZ_O^bg")F`Pfa7`5T^)Htq;V>jHuP
+on[GWLhuj=@d&P_pk*&KLhuj=@eGOnpk*&KLhua?D"rWlon[GWLhua?D"WU#on[GWLhua?D"kK;
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhTO-f`5T^6`Pod7`Oidr`5T^-]Y2=t\u91>
+[o5?/D,g1aD"rWlon[GZK4=V.@eGOnpk*&NK4=V.@eGOnpk*&KLhuj=@eGOnpk*&KLhua?D"WU#
+on[G[P]d$+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
+bKS5L`PoI%]t:qj['[3P]Y1\Z[(Eua['[3LFCM.I5GqIFVc5mY<'SE59'_(>l[i[5Jn42!AF"hX
+l[i[5Jn42!AF"hXpk*&AJn42!AF"hXl[i[5Jn42!AF"hXl[i[4HsZK%CsphabKS5L`PoI%]sP/R
+['[3I['[?FWi&f\W(f.J9f8hJ5H%:6W(f.I<'TYq?L*2Rl[i[5Jn42!AF"hXl[i[5Jn4Y/@dAVV
+pk*&AJn42!AF"hXl[i[4HsZ)c?L*2Rk01s#gtpK/f#P2'WGQ"@9f8kD25j5,W(f.J9f8kD25j5,
+W(f.i@nQ$6?KuoEl?lq'HsZ)c?L*2Rl[i[4HsZ,jAF"hXl[i[5Jn4.o?L*2Rl[i[5Jn4)"D!Q[`
+k_<p>Jn42!AF"hXl[i[5Jn42!AF"hXq5'#Ls8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2
+bKS5L`PoI%]rS6:Unsl_V50o`Unji_UnsldFChCF25j5,W(f.J9f8kD25j5,W(f.J9f8kD25j5,
+a(%a,HsZ)c?KuoEl?lq'HsZ)c?KcK3k]BkhFB7[S?KcK3k]BkhFB7UI<nMP"k]BkXF^3RA>hF1(
+fQCHO[&hs9hU9p)bKS5L`Po3k[&^:1UnslWSt)=BS=H1@S=Z7@St)0N8Z"m+VF2r36n>-&/#G]b
+VF2r36n>-&/#G]bVF2r36n>-&/%8G<g20[MFB71;<8)1ck\NrJE`Cb0:u$(jgi?BLE`Ch7<8)1c
+gi?BLE`Ch7<8;Lngi?BLE`Ch7<8)1cq:sBts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA*:.ON1j'\m7b9>t)k<41\]d\m7bH=Za3#7Clbna]U^:>t)eD9$(3t
+\n+[X@nOjG43(i'a(%`^@nOdO9"._[VF2r36n>-&/#G]bVF2r36n=[$4JkLsVF2r36n=[$4JkLs
+R85rt]XIk?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7ckgtp`>hU[mAaDFntD,eu);oifTg20[-D,eSn<7>kd
+g20[*DI1e4;q#bcdrJC9E`:V5>hF1(aE1b@F^3RA>hF1(`GT"[<'R6a7Aj*LVHZKd>=GGh5GhXR
+VHZKe<'R9[5KKq&p[%)0oC_>6n*'-,kj7d&e^rGr>hF1(fQCHOF^3RA>hF1(fQCHOF^3RA>hF1(
+fQCHOF^3RA>hF1(fQCHOF^3RA>hF1(fQCHOF^3C9;l<SZVc5mY<'R9[5GqIFVc5mY<'R9[5KK%A
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7ckgtp`>hU9p)bKS5Sbg"_-OP"\\fQCHOF^43Z?J'C*
+fQCHOF^3RA>j-91fQCHOF^4-P<nMP"fQCHaHsYHJ>h=@4k]BkWHt(`N>fU>HVc5mY<'R9[5GqIF
+Vc5nE]WhG9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-j)lgtCK>
+g"bH4eCN'tf#u:^fZ_O^bg">Tc0:I@l?lq(Jn4.o?L*2Rl[i[5Jn42!AF"hXl?lq(Jn42!AF"hX
+l[i[5Jn42!AF"hXk_<p=HsZ#kD!6Uik_<p;L2?(.D!6Uik_<p>Jn42!AF"hXl[iZk@V)E@7EC[G
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<[_Gi8j(SgtpK/f%A3ibKS5L`Pp$Ec,@T?`5T^=bg")F`T<VFk_<p;L2?(.D!-^r
+k_<p:MfIp<ET`7"k_<p;L2?%2ETi-non[GJL2?1-AE\bal[i[2L2?1-AF"hXon[GLHsZ'ffDkmN
+s8W,kpA+(Hp#+oog"bH4eCMgec-+>U`5T^6`Pom*Z+=LBk_<pHLhuC/AE\bak_<p:MfIs8D!-^r
+k_<p:MfIs8D!6UikDO?DL2?%2ETi-nk_<p;L2?(.D!-^rkDO?[s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA*q=n)39ig"bH:bfdrD`Oidr`k8mp]Y1qi]u7n/]=bhcCg!W>7E8n1on[GWLhua?D"WU#
+k_<pHLhua?D"WU#on[GWLhua?D!6Uion[GJL2?O=D!-^ron[GWLhu74EV5-(s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<i8j(SgtpK/f#5PH]=bhh]Y1\Z[(Eua
+['[3P]Y1\Z[&.%rVc5mY<'R9[5GqIFdrJCNL2?1-AE\baon[GMJn42!AE\bal[i[2L2?(.D!Q[`
+l[i[2L2?1-AE\bal[i[5Jn42!AF"hXk_<osbg")F`Oidr['[3I['[3I[&^:1W1'!L<'R9[5GqIF
+Vc5mY<'R9[5It,hl[i[4HsZ,jAE\bal[i[5Jn4)"D!Q[`k_<p>Jn42!AF"hXl[i[5Jn42!AF"hX
+l[i[5Jn3NXbL4nk\XJb[>=GJb2476&W(f.I<'R<U25j5,W(f.Y;``BJ;sJa:l[i[5Jn4Y/@dAVV
+l[i[5Jn42!AF"hXl[i[2L2?1-AE\bak_<p;L2?(.D!6Uik_<p;L2?(.D!6Uil[i[2L2?1-AE\ba
+kDO?UgsQ0%s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp5uc,@T?['[3@XKA:pUnji_
+Unsl_V50o`UoAHIR85rD9f8>74K(t3W(f.J9f8kD25j5,W(f.J9f9Ln:[3=6l?lq%FB7UI<pG'=
+k]BkWHt)Ag?IsR6k]BkWHt);]<nMP"fQCH_FB7%:>hF1(fQCHOF^3RA>iio@i8j(LeCMgec,@T?
+['[3I['ZX*Un"$HS=Z7LR['D7S=H1@Qs!"K:HYLB/#G]bR85rB6n>-&.ssB?VF2r36n>-&/#G]b
+VF2rG>t*Oh<7l=uk]Bk\E`C\6>hj@!gi?BLE`Ch7<8;LnfQCHSE`C\6>gm^lgi?BLE`Ch7<7l=u
+gi?BHF^41]fDkmNs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+aFnTF>t)>17Clbn\m7b9AP^EN41\]d\n+[Z=Za3+:WHs;\n+[K>t)eD9"JS0a(%`QAP^?V9"JS0
+a(%`><'R<U2476&R85r5:HY%@4IJu-VF2r&:HY%@4IJu-VF2r&:HYOS5N(Vcs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+QpA*q=n)39ig"bH*XJNmR?H?t_`GT#$DI1D+?H$egaE1b-DI1D+?H@4paE1b0FC)q(?H@4p
+`GT#'FC*%1?H@4paE1b0FC*%*<2W\[VHZKe<'R6a7Aj*LVHZKe<'QaQ8Z,NPVHZL1XJP.In*'-,
+m.9o6m-j0)n(>:]aE1b0FC*%1?J'C*aE1b?Ht(3FB@q?3f6h&KFC*RH@b>g.f6h&LHtUQKB@hN?
+aa@aQHt(0=?IsR6`GT"[<'R9[5GqIFVc5mY<'R6a7Aj*LVHZLAXIoOms8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA*q=n*'-,g"bH4eCN'tf#u:^fW:^tF^3OG@b>g.f6h&[F^3OG@b>g.fQCHOF^3OG@b>g.
+f6h&ZHt(`N>h=@4f6h&[F^3OG@b6!:f6h&HDI05?5GqIFVc5mY<'QdH4P6a-s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d#gt^T<hU9p)daZjreCN'tf#u:^
+bKS5N]Xm9aES,q^k_<p>Jn3MeDX)UUfS"/.Jn4)"CtF&Dk_<p*Ht)DnACuQQl?lq%L2>Ih@d&P_
+fS"/.Jn3MeDWlgkfS"/+L2?(.CtODYk_<p;L2=qQ?D^pq[sVrjs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)iE\
+daZjreCMgec-+>UbKS5Sbg")F`QQKM`5T^9[B\nQETi-nkDO?CMfIs8D!-^rkDO?DL2?%2ET`7"
+k_<p:MfIs8D!6Uik_<p;L2?(.D!6Uik_<p>Jn4)"D!6Uies_^#s8W-!s7H$\kj7crjQFt@f$`(!
+bKS5L`Pod7`Pfa7VhBHHE`;1VD!6UikDO?CMfIp<ETi-nkDO?DL2?%2ET`7"kDO?CMfIp<ET`7"
+kDO?CMfIp<ET`7"kDO?CMfJQpPlLd`s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQFt@f$`(!
+`5T^-]Y28&`Oidr`5T^-]Y28&`M\*&Vc5ml>t*q7ETi-nk_<p:MfJEGD!-^rkDO?CMfIs8D!-^r
+k_<p:MfIp<ET`7"on[GJL2?%2ET`7"kDO?QLhu_Wq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjd`Poj0]">Vg]=bha['[HX]sP/R\XJb[>=FrU4Jl=O
+Vc5mY<'Su^@d&P_k_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p;L2?(.D!6Ui
+k_<p;L2?+=IF?WrbKS5C]Y1\Z['[3I['[3I['ZcrOI00BVc5mJ=\5Mj5GqIFVc5mlAP_NED!6Ui
+k_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p*Ht);oD!6Uik_<p;L2?(.D!-^r`k8m^D-s2?5FG;0
+Vc5mY<'R9[5FG;0Vc5mY<'Rs*:[3=6k_<p>Jn4)"D!Q[`k_<p>Jn4P1D!6Uik_<p;L2?(.D!6Ui
+k_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<pJ\YfE,s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o6m-ilnkL.l2bKS5L`PoI%]sP/RUnsl_V50o`Unji_UnslbHuPKL4K(t3
+R85rD9f8>74IJu-W(f.;:HY%@4IJu-\m7bVHt(]T@dAVVf6h&ZHt(`N>j?]CfQCHOF^3RA>hF1(
+fQCHOF^3RA>hF1(fQCHOF^3RA>hF1(fQCHN`4ajZhV$]@bKS5L`Po3k['[3IUnslWSt)=BS=H1@
+S=Z7@St)0N8Z"m+MGZ^;6n=-l6Dd.$R85rB6n=[$4JkLsHoaBX:HY%@4M"fefQCH_FB7%:>hF1(
+fQCHOF^3RA>hF1(fQCHOF^3RA>hF1(fQCHOF^3RA>fCSefQCHOF^3"0?J'C*q:sBts8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC]S?C:[\>\m7b9>t)>17Clbn
+\n+[KAP^?V9"JS0\n+[KAP^?V9"JS0aDFnfAP]mK:V(+5a(%`QAP]mK:T%/VR85r5:HYLB/"'0q
+R85r5:HY%@4IJu-R85r5:HY%@4IJu-Qs!#QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7d%m-j)lgt0KX
+`GT#'FC*%1?H@4paE1b0FC*%1?H@4paE1b0FC*%1?H@4paE1b1HtUNB?H@4paE1b1HtUNB?HIS-
+[VT*6=\4u`8XNXPR85r4=\4u`8XW@:Qs!"J=\4u`8]\!0kj7d%m-j0)n*'-,kj7cj[&h>j?H@4p
+fQCH@HtUNB?IsR6aE1b?Ht(3FB@hN?aa@aCHtV&Y@`WXtf6h&LHtV&Y@`a"1f6h&LHtTm(=f54`
+VHZKd>=GDn7Aj*LVHZKd>=GGh5M*ies8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG[\gsX^'
+daZjkbg"eIXOhi/f6h&ZHt(`N>h=@4fQCHNHt(]T@b6!:fQCHNHt(]T@b6!:f6h&[F^3OG@b6!:
+f6h&ZHt(]T@`WXtR85rC<'QaQ8Z,NPQs!#$R>q7Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH;gtpK/f$`(!bKS5Sbg"eabKJ,SfX.a4KPp".CtODY
+k_<p+KPp".CtODYfS"/.Jn3MeDV0V[fS"/-HsYHYDV0V[fS".oHt);oCtF&DfS".pKPp".CtF&D
+fS"/+L2>LqDV'8FVHZKfAQ8EjkPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhU9p)daZjd`Pod7`Pfa7
+bKS5L`Pod7`Pfa7l'-VLN-O!.DWcptfo11=MfIp<ET`7"kDO?CMfIF/Git!)fo11>L2>P%Gj'lu
+k_<p;L2?(.D!6Uik_<p;L2>Ih@d2Fpm.9o6m-ilnkLnYIdaZjkbg">Tc,@T?`5T^8]Xk[c:YLJ2
+k_<p;L2?(.D!6UikDO?CMfIp<ET`7"kDO?CMfJ!GIHQN.kDO?CMfIp<ET`7"l'-V\P^V_QETr^9
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH-bg")F`Oidr`5T^-]Y28&`Oidr
+]=bhdNJ3a&8Z#]\k_<p:MfIp<ETi-nkDO?DL2?(.D!-^rk_<p:MfIs8D!6Uik_<p:MfIp<ET`7"
+kDO?CMfIp<ET`7"prgJQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
+kj7ckgtpK/f#5PH]=bhh]Y1\Z[(Eua['[3P]Y14rI$e&.VHZKV=\5Mj5GhXRfo11=MfIs8CtODY
+k_<p+KPp".CtODYk_<p+KPoFqDWcptfS"/*MfIC&DWcptfS"/+L2>LqDWlgkes_]Dbg")F`Oidr
+['[3I['[3I['[3IW/QJ/<'QaQ8Z,NPQs!"J=\5Mj5IPB2kDO?5N-OQ@D!-^rfo11>L2>LqDWlgk
+fS".pKPp".CtODYk_<p+KPoFqDV0V[fS".oHt'$c<1-NER85rC<'QdH4IJu-R85rC<'R9[5KIqQ
+k_<p;L2?(.D!6Uik_<p;L2?(.D!6Uik_<p;L2?(.D!-^rkDO?CMfIp<ET`7"kDO?CMfIp<ET`7"
+kDO?4KPot2ES,q^fS"/,P^WAgiUlj>s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
+i8j(Sgtp5uc,@T?['[3@XKA:pUnji_Unsl_V50o`UmH1=R85r5:HY%@4IJu-R85r5:HY%@4IJu-
+Vc5mK:HZ4":[3=6fS".oHt(]T@d8>If6h&[F^3OG@d8>If6h&[F^3OG@d8>If6h&[F^3OG@d8>I
+fQCHNHt(`N>iio@i8j(Sgtp5uc,@T?]=bhXXKAP)XdkuQS=Z7@St)=BS=H1@Q=Ep_:HYLB.uI1j
+VF2ql;*q-J/"'0qR85r5:HYLB/#G]bR85rS;``NX@b6!:f6h&mHsYEP@b6!:f6h&ZHt(`N>h=@4
+fQCH@HtV)S>hF1(aE1b@F^3RA>f_"nfQCH?FC+4^fDkmNs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV[VT*XAP]mK:V(+5\n+[KAP]mK:V(+5\n+[KAP]mK:V(+5
+[VT*XAP]mK:V(+5\n+[KAP]mK:UY(B\n+[*:HY%@4IJu-R85r5:HY%@4IJu-R85r5:HY%@4IJu-
+R85r5:HYP&E:il"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+ooi8j(LeCM]_?FP#c[VT*UFCM_$@^gGg
+[rc)gFCM_$@^gGg[rc)tH[WAF@`WXt[rc)tH[WtW?FP;saE1atHtp*+=dW>`Qs!"J=\4u`8XNXP
+Qs!"J=\4u`8XNXPQs!#%Un-`9n*'-,kj7d%m-ilnkLcl.aE1b1HtUNB?HIS-aa@aBFC*(:B?>O6
+aE1b1HtV)S>fhA+aa@aCHtUQKB?>O6aE1b1HtUNB?IsR6\n+[)=\5Mj5F>SFVc5mJ=\4u`8XNXP
+Qs!#CbfTnbs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8Vi[kNM:$g"bH;gtpK/f%A3i`5T^IHt(]T@`a"1
+f6h&ZHt(]T@b6!:f6h&ZHt(]T@b6!:f6h&ZHt(]T@b6!:aa@aRF^3%9B@hN?aa@aBFC(hK7@74L
+Vc5mJ=\4u`8][*Ks8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+p[%),m-ilnkN:RTg"bH4eCN9rbL4nkbKS5Sbg">Tc.K+ifS".pKPoFqDV0V[fS".pKPoFqDV'8F
+fS".oHt(`]DV0V[fS".oHt(`]DV0V[fS".pKPoFqDV0V[fo11.KPoFqDV0V[fS".@AQ5O27G#Jk
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH4eCN'tf#u:^fZ_OW`Pp$Ec,@T?bKS5L`PpK:XOr2D
+fo11/N-O!.DV9tnfo11.KPoJ%Gh@[efo11.KPoJ%Gh@[ekDO?4KPoJ%Gh@[efo11.KPoFqDV0V[
+k_<ooR>pFsn*'-,i8j(SgtpK/f#u:^`5T^6`Pod7`OM+i[VT+1L2?%2ES6:qkDO?5N-ONDES,q^
+fo11=MfIF/GhJ%#fo11/N-O$7GhJ%#fo11/N-O$7Gh@[efo11>V2tZVs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7crjQFt@f$`(!`5T^-]Y28&`Oidr`k8mp]Y28&`ODY9Qs!"X>=HY]BBY(d
+fo11=MfIF/Git!)fo11>L2>P%Gh@[efo11=MfIC&DV9tnk_<p,N-ONDETi-nkDO?CMfIjKL]@DS
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjkbg!c4]t:qj
+]=bha['[HX]sP/RW+Ar*>=Fo^8Z#]\Qs!"iFCNp^Git!)fo11/N-OQ@CtXblkDO?4KPoJ%Gj'lu
+fo11=MfIC&DV9tnkDO?5N-ONDES6:qfo11/N-O!^XNSi4`5T^&['[3I['[3I['[3I['ZcjL6u+8
+Qs!"J=\5Mj5F>SFQs!#%FC+-gES6:qfo11/N-O!.DV9tnfo11/N-O!.DV9tnfS".pKPoFqDV0V[
+fS"/+L2>LqDV0V[Qs!"K:HY"I8XW@:Qs!"Y<'QaQ8\/J/fS".rKOX,&ES,q^kDO?4KPp".D!-^r
+fS"/+L2>P%Git!)fo11=MfIp<ES6:qkDO?5N-ONDES6:qkDO?5N-O$7GhJ%#k_<p,N-P*-VZ6\r
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkL.l2bKS5L`PoI%]sP/R
+Unsl_V50o`Unji_UnslRFDI:?4IB8CR85r5:HY%@4IJu-R85r5:HY%@4IJu-\n+[iKPoFqDV0V[
+fS".oHt(`]DV'8Ff6h&ZHt(]T@dAVVf6h&ZHt(]T@b6!:fS".oHt(]T@b6!:f6h&[bfer*kLnYI
+daZjd`PoI%]sP/RUnsl_V50WQS=H1@S=Z7LR['7C8XW@:MGZ^;6n=-l6Dd.$R85r&;*q-J/"'0q
+R85r5:HY%@4M"fefQCHNHt(`N>h=@4f6h&ZHt(]T@b6!:f6h&[KPoCh@b>g.aa@aQHt(`N>fhA+
+fQCH@HtV&Y@`WXtq:sBts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-hMs:V(+5\n+[KAP]mK:V(+5\n+[KAP]aN=h80?[VT*XAP]aN=gi-L[VT*TCg"2_=gi-L
+[VT*TCg"2_=d`&JR85r5:HXM36CCV3R85r5:HXM36C:nIMGZ^-=\4KJ6C:nIVgNI`s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o6m-ilnkLnYI[sVr"FCM_$@`WXt[rc)gFCM_$@`WXt[rc)gFCM_$@^gGg
+aa@a1FCM_,C:A:o[sVr"FCM_,C<1L'WGQ"0=\5#W4IB8CQs!"J=\4KJ6C:nIMGZ]t;*p.;6Fa.t
+kj7d%m-ilnkNM:$i8j(UUQ`07C<1L'aa@aCHtUQKB?>O6`-ZpSHtUQKB?>O6`-ZpSHtUQKB?>O6
+aa@aQHt(3FB?>O6aa@aCHtTBh<2W\[Qs!"J=\4u`8XNXPVc5mJ=\4u`8`n7=s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIdaZjkbg")F`RfKHf6h&ZHt(3FB@hN?aa@aQHt(]T@b??O
+f6h&[KPoCh@`3VAfS".\H[XP"DV0V[`-ZpbKPoFqDTR9=Qs!"J=\4u`8Z#]\Qs!"jPDfJ@s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQG4OhV$]@
+daZjreCMgec-+>UbKS5Sbg"_-OP#5(fS".pKPoFqDV0V[fS".\H[XP"DV0V[aFnTdKPn_TIFs3j
+fS".pKPnkaEnH%_fS".qN-O!.DV9tnfo11/N-MdI=dW>`Q=EqepA+ags8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-ilnkLnYIdaZk#bfe2Rc-+>U`5T^6`Pp$Ec,@T?`5T^HPC_DGGhJ%#fo11/N-O!.DV9tn
+fo11/N-O!.DV9tnfS".qN-O!.DV9tnfo11>L2>P%GhJ%#k_<p,N-O!.DTR9=daZk+jQG4OhU9p)
+fZ_OW`Pp$Ec,@T?`k8m^D-tqKDV9tnkDO?5N-ONDES6:ql'-VLN-O$7GhJ%#fo11.KPot2ES6:q
+fo11/N-O$7GhJ%#fo11/N-O$7Gk^Rfs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39i
+g"bH-bg")F`Pfa7]=bhq`PoI%]t:qj`5T^&['Z]77@74L[rc*4N-ONDES6:qfo11.KPoJ%Gh@[e
+fo11/N-O!.DV9tnfo11/N-O$7Gh@[efo11/N-O$7Git!)kDO?[s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtpK/f#5PH]=bhh]Y1\Z[(Eua['[3=P`V888XNXP
+Qs!"X>=Fo^8_A]6fo11=MfIF/Git!)fo11/N-ONDES6:qfo11/N-O$7GhJ%#kDO?5N-O$7GhJ%#
+kDO?5N-ONDES6:qfY"Z2`PoI%]t:qj['[3I['[3I[&^:1W/QIu=\4u`8XNXPQs!"J=\4u`8[ieN
+fo11/N-O!.DV9tnfo11.KPoFqDV9tnfS".qN-O$7Gh@[efo11/N-O!.DV0V[fS".pKPm/[8XNXP
+Qs!"J=\5#W4IB8CaE1bAN-O!.DV9tnfS"/*MfIF/GhJ%#kDO?4KPoJ%Git!)fS".qN-ONDES6:q
+fo11/N-O$7GhJ%#fo11/N-O$7GhJ%#fS".qN-OHSL\^#is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp5uc,@T?]=bhXXKA:pUnji_Unsl_V50o`UmQOP
+MGZ^.:HXM36CCV3Qs!"K:HY%@4IJu-R85r5:HYRe<7cM,f6h&[KPoCh@b??Of6h&ZHt(`]DV'8F
+f6h&ZHt(`]DV0V[fS".pKPoCh@b??O`-ZpbKPoCh@bAoJi8j(SgtpK/f#5PH]=bha['Zm8XdkuQ
+S=Z7@St)=BS=H1@Q=Ep_:HY%@4IJu-MGZ^.:HY%@4IJu-MGZ^.:HY%@4Gm!&R85rB>=I.k@b6!:
+f6h&[KPoFb>f:u;f6h&LHtV&Y@`a"1aa@aRKPn_TIFijUaa@aQHt($@IFijUaa@aCHtVTsh#IES
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s5;u$W+Ar>AP]79<4ZX:
+W+Ar:Cg"2_=gi-L[VT*TCg"2_=gi-L[VT*TCg"2_=gi-L\n+[HFCM[p=gi-L[VT*6=\4KJ6CCV3
+Qs!"<;*pXQ8W$A3Qs!"K:HXM36C:nIR85r5:HYP.I.[..s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726
+i8j(SgtoSqGd_Ek[rc)fCg"5h@^gGg[rc)gFCM_$@^gGg[rc)gFCM_$@^g`"[rc)gFCM_$@^g`"
+[rc)gHtoWt?]%]IQs!"<;*p.;6AeW,Lg!Q2;*p(B:7,0ULg!QpUn-H)kNM:$k1nbUm-ilnkK'Hi
+aa@aBFC*(:B=E8'aa@a1HtpcNB?>O6aa@aBKQ>1^B?5aHf6h&KKQ>.eEl<<Qaa@a>H[X"`B?>O6
+W+Aqq=\4u`8Z#]\Qs!"J=\4u`8XNXPQs!#4`4c3Ns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+i8j(SgtpK/f#u:^f>PAEHtUQKB@hN?`-ZpaHt($@IFijU`-ZpSHtUQKB>f.Ff6h&KKQ>^uDV0V[
+aa@aRKPnkaEn>\JaFnTTKQ<G_8Z#]\Qs!"H@o\n!8]R6Ys8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,g"bH;gtpK/f$`(!bKS5`bfe2Rc-k+m
+`k8n(KQ>^uDTIKOaFnTPH[WtgEnH%_aFnTdKPn_TIFs3jaFnTdKPnkaEl`oSfS".`KQ>b)GfYPY
+fo10sMga62DT$mMW+Aqo@o\n!8\'P"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d#gt^?-f#u:^
+bKS5Sbg")F`RrDX`5T^6`Pp$Ec,cu_fo11/N-O$7GfYekfo10sMga9;GfYekfo10sMga9;GhJ%#
+fo11/N-O$7GhJ%#fo11/N-O$7GhJ%#fo11/N-NF>S`\__g"bH4eCMgec,@T?`5T^6`PoBVPdYC2
+fo11=MfIF/GhJ%#kDO?5N-O$7GhJ%#fo11.KPoJ%GhJ%#fo11/N-O$7Gh@[efo11/N-O$7GhJ%#
+kbX@?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQFt@f$`(!`5T^-]Y28&`Oidr
+`5T^-]Y2=t]">VgVgNHN=\6&<=kSaYfo11/N-O$7GhJ%#fo11/N-O$7GhJ%#fo11.KPoJ%Gh@[e
+fo11/N-O$7GhJ%#fS".nPC_DGGj)K4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_&&kLnYIdaZjd`Pod7`Oidr['[3P]Y1\Z[&J.YQs!"H@o\n!8XNXPW+Ar]N-Np;J_?!,
+fo11,PC_DGGhJ%#fo11/N-ONDES6:qkDO?5N-O$7GhJ%#kDO?5N-O$7GhJ%#fo11/N-NOic-+>U
+]=bha['[3I['[3I['[3I['Z`aI$e&.Qs!"J=\4u`8XNXPQs!"iHtq>nGhJ%#fo10sMga62DTI`a
+fS".`Mg`["EnQCraFnTeN-NF%IFs3jaGYK"N-NF%IFs3jQ=EpP;*pXQ8XW@:WGQ"`KQ>b)GhJ%#
+fo11/N-O$7GhJ%#fS".qN-O$7GhJ%#fo11/N-O$7GhJ%#fo11/N-OTOIFaU5fo11?P^V5DGhJ%#
+fo11/N-Np;Jbm<ds8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+m.9o6m-ilnkLnYIbKS5L`Po3k['[3IUnsl_V50o`Unji_UnslRFDHb26AeW,MGZ]t;*p.;6AeW,
+MGZ]t;*p.;6AeW,W+ArLKQ>^uDT$mMf6h&GH[XP"DV'8F`-ZpbKPnkaEn>\J`-ZpaHt(]T@`3VA
+fS".`KQ>^uDTIKOfS".pbff5:n(HLQdaZjkbg!c4]sP/RUnsl_V50WQS>_mAS=Z7@St)*V<JjX?
+R85r&;*p[H4IJu-MGZ^.:HY%@4Gm!&R85r5:HY%@4K)gjfS".oHt($@IFijU`-ZpaHt(]T@`3VA
+f6h&GH[XLn@`a"1fS".\H[XP"DTR9=aFnTUHtUQKB?>O6q:sBts8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+=jQEsf=fH7F[VT*FAQ6-\@]3j;[VT*GD-s8Z?`@mL
+[VT*GFChFg?aacRWGQ"NCg"5h@^^)U[rc)fCg!`S?^OtfQs!"<;*pXQ8W$A3Qs!"<;*pXQ8W$A3
+Qs!"<;*p.;6C:nIQu-=4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)iE\\V5::Cg"5h@]=H\
+[rc)YD-sbo@]=H\[rc)YFChq'@]+Tm[rc)WHuQQ:@^g`"[sVr"FCM_,C:A:oWGQ!u>#'lW:7,0U
+Qs!":>#(Gf8VgPFQs!":>#(Gf8[kLgi8j(ZjQGI^kMYFai8j(BUn,VTB=E8'[rc*$HtUQKB?>O6
+[sVr/H[WtgEli]AaFnTPH[WtgEl`oSaa@aBKQ>.eEl`oSaFnTUHtTEq?^OtfQs!"J=\4u`8XNXP
+Q=Ep^=\4u`8]\!0s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kN:RTdaZjreCMXP]#f>4
+aFnTTKQ>.eEli]AaFnTTKQ>1^B?5aHaFnTdKPnkaEl`oSaFnTTKQ>.eEl`oSfS".`KQ>.eEl`oS
+Qs!"H@o\h)<L?o\Q=Eq9XJPsss8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjreCMgec-+>UbKS5Sbg"1rNQ?cn`-ZpRKQ>.eEl`oS
+aFnTUHtUNREli]AaFnTTKQ>.eEl`oSaFnTTMg`["Ela/eaGYJfKQ>.lIFs3jaGYJfKQ>1^B:)gn
+Qs!"H@o^UGScA`is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n(HLQg"bH4eCMgec-+>U`5T^=bg")F`QQKM
+`5T^6`PpDlJ]NataGYJfMg`[)IG'R(aGYJfMga9;GfYekfo10sMg`[)IG'R(aGYK"N-NF%IG'R(
+aGYJfMga9;GfYek[sVrCbfeGaf#u:^bKS5L`Pod7`Pfa7Qu-<RKQ>b)GhJ%#fo11/N-O$7GhJ%#
+fo11/N-O$7GhJ%#fo11/N-O$7GfYekfo10sMga9;GfYekfo10sMgbE^iW&rXs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCMRW`Pfa7]=bhs]Xk_f]u7n/]=bhh]Y18.OI00B
+Q=EqJN-Np;J_?!,fo11/N-O$7GhJ%#aGYK!KPoJ%GfYekaGYK"N-NEsEnQCraGYK!KPnkhIG'R(
+fo11/N-PC&s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(Sgtp5uc,@T?
+]=bhh]Y1qi]sP/RW0EC2=\4u`8XNXPQs!"H@o^WuB@`8tfo11,PC_;KJ_$$9ert[9PC_DGGh/(0
+fo11,PC_DGGh/(0l'-VLN-O$7GhJ%#fo11/N-O$7Gh/=FdaZjd`PoI%]sP/R['[3I['[3I['[3I
+R?Nhl;*p.;6AeW,Lg!Q@=\4KJ6FV&Gert[+Mga9;GfYPYaFnTeN-NEsEl`oSfS".`Mg`["Ela/e
+fS".`Mg`[)IE7(^fo10sMg_O8</=^QQs!"iHtp`UEnQCraGYK"N-NF%IG'R(fo11/N-Np;J_?!,
+ert[9PC_DGGh/(0ert[<N-Np;J_$$9ert[9PC_;KJ_$$9ert[<N-O$7Gh]!Wo_/+\s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp5uc,@T?
+]=bhXXKAP)Xe_ehUnsl_V50o`UmH1=MGZ]t;*p.;6AeW,MGZ]t;*p.;6AeW,MGZ]t;*q-a7EC.&
+`-ZpRKQ>.eEl`oSaa@aBKQ>.eEli]A`-ZpRKQ>.eEl`oSaa@aBKQ>1^B?5aHaFnTTKQ>.eEotTf
+i8j(SgtpK/f#5PH]=bhh]Y1AIXdkuQS=Z7@St)=BS=H1@Q=Ep_:HXM36CCV3MGZ]t;*p[H4Gm!&
+MGZ^.:HXM36AeW,R85rDAQ6a(EnH%_aFnTcHt(0MEnH%_aFnTTKQ>.eEl`oSaFnTTKQ>.eEl`oS
+aFnTTKQ>1^B?5aH`-ZpSHtVTsh#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726[rc)YD-s8Z?`A-YWGQ"OFCM4kAZ9NR[rc)YD-s8aA[ZDXWGQ"NCg!`ZA[ZDX
+WGQ"OFCM4d?ak,d[VT*(;*pXQ8W$A3Qs!"<;*pXQ8W$A3MGZ]t;*p.;6C:nILg!Q2;*pXQ8a,O0
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(SgtoMfC8l;dWGQ"OFCM_$@]=H\[rc)gFCM4kA[cbj
+[rc)YFChFnA[cbjWH;^LHuQQ:@]+Tm[sVr"HtoWt?\hl\Qs!":>#'lW:5E(KLg!Q@=\4EQ:5E(K
+Lg!QpXJOk9kMYFakj7crjQGI^kLcl.[sVr"FCN@>B=E8'[sVr4HtU!DGfb>G\V5:LKQ>.eEl`oS
+aFnTTKQ>.eEl`oSaa@aBKQ=PLC<2'KWH;^;@o\n!8W%"[Qs!"H@o\n!8W%"[Qs!"iNJ7E4s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtpK/f%A3i`k8n)HtUNREl<<Qaa@aBKQ>1^B?5aH
+aFnTTKQ>.eEl`oSaFnTTKQ>.eEl`oSaGYJfMg`[)IE7=paFnTEKm8tf8X<jdQs!"H@o\h)<S,1&
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+i8j(`gt^?-f$`(!daZk#bfe2Rc,c]OaFnTPH[WtgEl`oS`-ZpSHtUQKB>f.FaFnTPH[WtgEli]A
+aFnTdKPnkhIE7(^fS".`Mg`["EnQCraGYJfMg`[)IG'R(aGYJUFCLPG<L?o\Qs!#CbfTnbs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\m.9o6m-iW_hU9p)bKS5`bfe2Rc,@T?bKS5L`Pod7`QQKMaJ>BJMg`[)IE7=p
+aGYJfKQ>.lIE7=paFnTTMg`[)IE7(^fo10sKQ>.lIE7(^aGYJfMga62DTI`aaFnTeN-NEsEjqj;
+daZjkbg">Tc,@T?`5T^)UnFYt<8!4TfS".pKPoFqDV9tnfo10sKQ>b)GfYPYfo10sKQ>b)GfYek
+aFnTdKPnkhIE7(^aFnTTKQ>.lIFaU5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+m.9o.jQG4OhU9p)`5T^6`Pod7`Oidr]=bhq`PoI%]u7n/\?2cg@p#+$8]ZR*aGYJtPC^f5IFaU5
+aGYK"N-NF%IFaU5aGYJfMga62DTI`aaGYJfKQ>.lIE7=paFnTTMg`["Ela/eke+/"s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkL.l2daZjd`PoI%]sP/R]=bheXf@b*@Ye2_
+Qs!":>#(Gf8Z63"aHM;1N-NpBOOfVHert[9PC_;KJ_$$9es_]OPC_;KJ_$$9ert[9PC_DGGh/(0
+ert[9PC_DGGhJ%#ert[;[&hHpc-+>U]=bha['[3I[&^:1['[3I['Zd#Q&&U=Qs!":>#'rP6C:nI
+Lg!Q_FCN=LIG'R(aFnTeN-NF%IE7(^aFnTTKQ>.lIE7(^fo10sMg`[)IE7(^fo10sMg`[)IE7=p
+WGQ"@AQ6a(Ela/efo10sMga9;GfYekfo10sMga0?J]NataGYJtPC^f5IG'R(ert[<N-Np;J_$$9
+ert[9PC_;KJ_$$9ert[9PC_;KJ_$9OpsdFcs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIbKS5L`Po3k['[3IUnsl_V50WQS><!W
+UnslSI!(<D6AeW,MGZ]t;*p.;6AeW,MGZ]t;*p.;6AeW,Q=Eq9KQ>.eEl`oSaFnTPH[WtgEl`oS
+aa@aBKQ>.eEli]AaFnTPH[WtgEl`oSaFnTTKQ>.eEl`oSaFnTdbff5:n(HLQdaZjkbg!c4]sP/R
+X/rG!V50WQS>_mAS=Z7@St([J=GU-UMGZ]t;*p.;6AeW,MGZ^-=\4KJ6AeW,R85r&;*p[H4K)gj
+aFnTTKQ>^uDTIKOaFnTTKQ>.eEl`oSaFnTdKPnkaEl`oSaFnTTKQ>1^B?5aHaFnTTKQ>.eEl`oS
+k1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC]YJGc>Oe
+WH;^ND-s8aAZ9NRWGQ"AFChFg?`A-YWGQ"AFChFnAZ9c_WGQ"OFCM4kA[ZDXWH;^[Cg!`ZAXHUl
+MGZ]r>#'rP6ASf?MGZ]r>#'lW:7,0UMGZ]r>#'rP6ASf?Lg!R+bfg%ds8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_>6n(>k-WH;^\FCM4kA[cbjWH;^NFChq'@]+Tm[rc)WHuQ',AZ9c_WH;^NFChFnA[cbj
+VgNHmHtoX&A[d&%WH;^->#(Gf8VgPFQs!":>#(Gf8VgPFLg!Q@=\4EQ::RF+i8j(ZjQGI^kMYFa
+i8j(A[B[2_@`a"1[sVr"HtpTHICFT=aa@a3Km:^eB=W_@aFnTEKm:[lEk-mKaFnTEKm:.^GfYPY
+\V5:;Htp-<C7&-qMITbU=\4K\=GU-UQ=EpN>#(An<L@W4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_>6n(HLQdaZjreCM^:S]HJ)aFnTTKQ=VWGfYPYaFnTTKQ>.eEl`oSaGYJWML<L'IE7=p
+aGYJfMg`[)IE7(^aGYJfMg`[)ICFT=Q=Ep\@o\h)<L.,pQ=EqWgt_r0s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n(HLQg"bH4eCMgec-+>U
+a0i1nKQ=PLC<2'K[sVr"Htp`UEk-mK[sVr3KQ=VWGfYPYaa@aBKQ>.eEl`oSaFnTTKQ>.lIE7(^
+aGYJfKQ>.lIE7(^aGYJfKQ>.lIE7(^W+Aqq=\4u`8X<jds8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
+k1nbFgtpK/f#u:^bKS5L`Pod7`RrDX`5T^6`Poj0]#]eXaFnTTMg`["Ela/eaFnTTMg`[)IE7=p
+aFnTTMg`["El`oSaGYJfMg`["Ela/eaFnTTKQ>.eEl`oSaFnTCHtpjKc-+>U`5T^6`Pod7`Kt[^
+[rc*#KQ>.eEla/eaFnTTKQ>.eEnH%_aFnTTMg`["Ela/eaFnTTMg`[)IE7=paFnTTMg`[)IE7(^
+aGYKAeB.ajs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2g"bH4eCMgec,@T?
+]=bhq`PoI%]u7n/]=bhs]Xk_f]pNYGQs!"[FCj-aGfYekert[+Mga0?J]NataGYJfKQ>.lIE7=p
+aGYJfMg`["Ela/eaFnTTMg`[)IE7(^aGYJfMg`["EqK)$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VHWp#+oog"bH4eCMRW`Pfa7]=bhh]Y1\Z[$Z5`Lg!Q>@o\Cr=GU-UQ=Eq*Km;14J]O%.
+ert[+PD%MUOOfVHes_]OPC_;KJ_$$9es_]OPC_;KJ_$$9aHM;.PC_;KJ]O%.ert[+PD%VJGhC6`
+daZjd`PoI%]sP/R['[3I['[3I['[3IUnslC>#'lW:5E(KLg!Q2;*p(B:8r);aGYJfMg`[)IE7=p
+aFnTTMg`[)IE7(^aFnTTKQ>.lIE7(^aGYJfMg`[)IE7=paGYJfMg`["Ela/eaGYJfMg`[1KZK("
+ert[+Mga0?J]Natfo10sMga0?J_$$9aGYJtPC^f=K[u?<ert[9PC_;KJ_$$9ert[9RZQ*aJ_$$9
+kd.5fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726i8j(Sgtp5uc,@T?]=bhXXKAP)Xe_ehUnsl_V50o`UmQOPG#Cqg>#'6=8r?J4
+G#Cqi;*oG(8r?J4MGZ]t;*pRY<QKi6\V5:LKQ>.eEl`oS\V5:LKQ>.eEk-mKaFnTEKm:[lEk-mK
+`-ZpCKm:[lEl<<QaFnTTKQ=VWGhC6`i8j(SgtpK/f#u:^]=bhh]Y1,;Unji_S=Z7@St)=BS=H1@
+Q=EpN>#'rP6ASf?Lg!Q2;*p(B:5Vn8MGZ]t;*p.;6AeW,MGZ^>D-tA;El`oSaFnTTKQ>.eEl`oS
+aFnTTKQ>.eEl`oSaFnTTKQ>.eEl`oSaFnTTKQ>.eEl`oSaFnTTKQ?51h#IESs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726\<DiMD-s8aAZ9NRWH;^NFChFg?`A-Y
+WGQ"AFChFg?`@mLWGQ"AFChFnAZ9NRWH;^NFChFnAZ9c_WH;^;@o\=g:5E(KMGZ]r>#'lW:5Vn8
+Lg!Q2;*p(B:5E(KLg!Q0>#'lW:<9N5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7bmCkj7cV`Po<.@]=H\
+WH;^NFChFnA[cbjVgNH_FCh@tE49puVgNHmFCM.qE4:40VgNH]HuQQ:@]+Tm[sVr"HtoX&AXHUl
+Lg!Q2@p#+$8VgPFMITbG@p#+$8W%"[Lg!QpXJOk9kMYFai8j(ZjQGI^kL[Yc[sVr"Htp-<C:AS*
+[sVr3KQ=VWGfYPY\V5:LKQ=VWGfYPY\V5:=Km:.^GfYPY\V5:=Km:.^Ge&NQ\V59o@o\h)<JXgR
+Q=Ep\@o\h)<L.,pQ=EpP@p&QfiW&rXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7d#gt^?-f$`(!
+a-hptKm:.^Ge&NQ\V5:LMg`-nI(>,^\VbdUMg`'oKuf1#\VbdUMg`-nI)q4oaGYJUNJ5H3ICG2i
+aGYJGFCg>>=I*GsMITbS@o\Cr=TAF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVi8j(ZjQFt@f$`(!fZ_OY]XkY-Ge&NQ[sVr$Km:(SC:AS*
+[sVr"Htp-<C:AS*aFnTCHtp3GGe&NQ`-ZpCKm:[lEl`oSaFnTTMg`[)IE7=paGYJfMga0?J]Nat
+fo10sMg`["EgC38Q=Ep^=\5N=E<#t<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQdaZjkbg">Tc-+>U
+`5T^=bg")F`QQKM`5T^9R>nb2Ge&NQ\V5:LMg`-iGe&NQaFnTEKm:[sIE7(^\V5:LKQ>.eEl`oS
+aGYJfKQ=VWGfYekaFnTTMg`[)ICFT=\"o\8`Pod7`Pfa7\?2cu=\6\fEl`oSaFnTTKQ>.eEla/e
+aFnTTMg`["El`oSaFnTTMg`[)IE7(^aGYJfKQ>.lIE7=paFnTTMg`[1K`D)Ps8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2bKS5L`Pod7`Oidr`k8mp]Y28&`Oidr
+]=bhUP`V2@<L.,paHM:uMg`[)IFaU5aGYJfMg`[)IE7=paGYJfMg`[)IE7=paGYJWKm:[lEk-mK
+\V5:LMg`-iGe&]ZaGYJtRZRRLs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQG4OhU9p)
+`5T^6`PoI%]sP/RR!a%B@o\Cr=GU-UQ=EpN>#(uCE7U5(aHM:uPD%MUON3cKert[*R>o7TNRjP[
+a-hq<RZPRXNRjP[a-hq<RZQ*hON<W=es_]OPC^f=K[u?<aJ>B[gtp5uc,@T?]=bha['[3I['[3I
+X/rG1['[?FWet:gQs!":>#'lW:7,0ULg!QQD-tABIE7V*aGYJfMg`[)IE7(^aGYJfMg`[)IE7=p
+aGYJfMg`[)IE7=p\VbdUMg`[)IE7=paGYJfMg`[1KZK@1ert[+PD%#@KZK@1aHM;.PC^cBNRj;E
+a-hq<PC^f=K[u?<aHM;.PC^f=K[u?<a-hq<PC_;ROOfVHes_]qeB.ajs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYI
+bKS5L`Po3k['[3IUnsl_V50o`Unji_UnslSI!'^=</OO>Lg!Q2;*p(B:5Vn8Lg!Q0>#'6=8r-YG
+Qu-<CML<L'IE7(^\VbdFKm:[sICY&V\V5:LKQ=VWGe&NQ[sVr$Km:.^Gdi'8\V5:=Km:.^Gf4rW
+\V5:\bff5:n)39idaZjkbg!c4]sP/RX/rG!V50WQS=H1@S=Z7@St([J=GU-ULg!Q0>#'lW:5Vn8
+Lg!Q2;*p(B:5E(KLg!Q0>#'rP6C;V!aFnTTMg`[)IE7(^aGYJfKQ>.eEl`oSaFnTEKm:[lEk-mK
+aFnTTKQ=VWGfYPY\V5:LKQ=VWGfYPYk1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o:oC]SgTW)d8Qu-<3FCghV@]=3OWH;^ND-s8Z?`@mLWH;^ND-s8Z?`A-Y
+WH;^NFChFg?`A-YWH;^NFChFnAX6h+MGZ]r>#'lW:5E(KMGZ]r>#'lW:5E(KLg!Q0>#'lW:5E(K
+Lg!QPN/%B4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n&V;qWH;^NFChq/C8ZGuWH;^LHuQ',AZ'op
+VgNH]HuQ!2E2S)&WH;^LHuQQ:@]+TmVgNHmHtoR,E4:40QZR#!>#'rb=GU-UMITbE>#'lW:5E(K
+MITbE>#'rb=LbK5q;gMmjQGI^kMYFai8j(RbfdPNGdi'8\V5:=Km:.^Gdi'8\V5:=Km:.^Ge&NQ
+\V5:=Km:.^Ge&NQ\V5:=Km:.^Ge&NQaFnTEKm:.^Ga;i>Q=EpP@p#%,<Jk9gMITbG@p"Uu=GgTj
+`k8n_s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjkbg!\UI)pt]\V5:=Km:[lEk.'T
+\VbdUMg`-nI(>,^aGYJUNJ5H3ICG2i[uH*_Mg`+!Mo^g)[uH*_Mg`'oKrK0*MITbG@p"Uu=GgTj
+VgNI`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,_m-j0)n)iE\daZjreCMRW`Q3sc\V5:;Htp-<C:T%C[sVr$Km:(SC:AS*\V5:;Htp3GGfYPY
+[sVr3KQ=VWGfYPYaGYJWKm:[lEla/eaGYJfMga9;GfYekaGYJfMg`[)IE7=paGYJfKQ;lP:6oBi
+Lg!Q`PDfJ@s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mi8j(Sgtp`>hU9p)bKS5Sbg")F`Pfa7`5T^6`Pp$Ec,[5s
+\V5:=Km:.^Ge&NQ\VbdUMg`-iGe&NQ\V5:=Km:[sICY&V\V5:LMg`-iGfYPYaGYJWKm:.^GfYPY
+aFnTTKQ<uDI)O"C`5T^6`Pna.I&Usi\V5:LKQ=VWGfYPYaFnTTKQ>.lIE7(^aGYJfMg`[)IE7=p
+aFnTTMg`-nI)q4o[uH*_Mg`-iGfYekk01sIs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VHWp#tc2i8j(Sgtp5uc,@T?`5T^-]Y1qi]u7n/]=bhq`PoI%]sP/RQ=Ep\@o^U'ElXT-
+aHM:uPD%#8IE7V*aGYJfMg`[)ICG2iaGYJWKm:.cI(>,^\VbdFML<L'ICY&V\VbdUMg`'oKt3(g
+aJ>C,s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYIdaZjkbg")F`OidrUnslSD.8B4=GgTj
+MITbG@p"Uu=JpOca-hq=S:8MHNQ7HHa-hq-R>o7TNQ7HHes_]@R>o:OKZBL?es_]APD%MUON<W=
+a-hq<PC^cBNRjP[aHM;.RZQ17[aN[VdaZjd`PoI%]sP/R['[3I['[3I['[3I['[3,FDH\9:5E(K
+Lg!Q0>#'lW:6oBiaHM:uMg`[1KZK("aGYJfPD%#8IE7=paGYJfMg`[)ICG2iaGYJfMg`[1KXZqp
+aGYJUNJ5H;KZK@1aHM:uPD%#@KZBL?aHM;.RZPUSKZBL?es_]@R>oddON<W=es_]@R>od]J]O%.
+ert[*R>oddON<W=aHM;@]WhG9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(LeCMgec,@T?]=bhXXKA:pUnji_
+Unsl_V50o`UmQOPG#Cqg>#'6=8r-YGH!=7(>#'6=8r-YGLg!Q2;*pXe@`XIU\VbdFML;slI(>,^
+\V5:=Km:.^Ge&NQ\V5:=Km:.^Ge&NQ[sVr$Km:(SC8Z`4[sVqgKRC=aGhC6`i8j(SgtpK/f#u:^
+]=bhh]Y1AIXdkuQS=Z7@St)=BS=H1@LM^[[>#'lW:5E(KLg!Q0>#'lW:5E(KG#Cqg>#'lW:5Vn8
+Lg!Q@D.:SEICY5_\V5:=ML;sgGfYek\V5:=Km:.^GfYPY\V5:=Km:.^GfYek\V5:=Km:.^Ge&NQ
+\V5:=Km;b8h#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+a0i1>D.9J]?^P\>Qu-<3FCghV@]=H\Qu-<"D.9JdAXI=DWH;^ND-s8aAZ9c_WH;^NFChFnAZ9c_
+WH;^NFCghB8VgPFLg!Q0>#'lW:5E(KLg!Q0>#'lW:5E(KLg!Q0>#'lW:6oBikj7d<s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s6/h<kj7cJPDc>dE2dqjVgNH_FCh@tE2S)&VgNH]HuQ!2E2dqjVgNH]HuQ!2E2S)&
+VgNHmHtoR,E2SA:[sVqgKRBb@AVsu"Lg!Q2@p"Oj:5WO`MITbG@p"Uu=GgTjLg!Q`XfC=?kNM:$
+i8j(ZjQGI^kLnYI\<Di]Km:(SC:T%C[sVr$Km:(SC:T%C\V5:=Km:.^Ge&]Z\V5:=Km:.^Ge&NQ
+\V5:=ML;sgGe&]Z\V5:-FCg>>=I*GsMITbE>#(An<Jk9gQ=EpN>#(uKI/j6Hs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726kj7d#gt^T<hT!4>\V5:=Km:.cI(=rU[uH*PML;sgGe&]Z\VbdDNJ4j$Kt!%q
+\<DilMg`'oKt*>)aGYJUNJ4j$Kuf1#[uH*/D.8B4=GgTjQ=EpP@p$49T`>&ls8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726kj7ckgtp`>hUp&q
+a-hptKm:(SC:T%C\V5:;Htp3GGdi'8\V5:;Htp3GGe&NQ[sVr$Km:.^Ge&NQ\V5:LMg`-iGfYek
+\VbdUMg`[)IE7=paGYJfPD%#8IE7=paGYJfMg`[)IE7=p[sVqH>#'lW:5E(KfY"Zms8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+ILkMYFag"bH4eCN9rbKJ,S`5T^JbfdrD`QQKM`5T^6`PoBVPduKm\V5:=Km:.^Ge&NQ
+\V5:LMg`-nI(>,^\V5:LMg`-iGe&NQ\V5:=Km:.^Ge&NQaFnTEML;slI(=rU[sVr"UnGZF`Oidr
+Lg!Q_Htp-<C:T%C\V5:=Km:[sICG2i\V5:=ML;slI)q4o\V5:;NJ5H3ICG2iaGYJUNJ5H;KZK("
+[uH*^R>q7Hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYI
+daZjd`Pod7`Pfa7`5T^-]Y28&`Oidr`k8n$`Pn1&MMbnGWH;^mPD%#@KZK@1a-hq.PD$uENQ@$+
+\<DilMg`'oKt!%qaGYJUNJ5H3ICG2i\VbdDNJ4j$Kt!%q[uH*_Mg`'oKug'\p[%)Cs8W-!s8W-!
+s8W,kpA+(Hp#tc2g"bH;gtpK/f#u:^['[3-I!(<V=GgTjMITbG@p"Uu=GgTj\V5:LPD$uENQ7HH
+a-hq-R>o7TNRjP[a-hq-R>o7TNQ7HHes_]@R>o7TNQ7HHa-hq<RZPRXNRjP[a-hq-R>o7TNQ7HH
+g"bH;gtpK/f#5PH]=bha['[3I['[3I['[3I['[3I[$QGsLg!Q0>#'lW:5E(KLg!Q0>#*.sIE7V*
+aGYJfPD%#@KZK("aHM:dNJ5H;KXZqpaHM:uPD%#@KXZqpaGYJfPD%#@KZK@1aGYJUNJ5H;KZK@1
+aHM:uPD$uENQ@<:a-hq-R>o:OKZBL?a-hq-R>o:OKZBL?a-hq-R>o7TNRj;Ea-hq<RZR@+iW&rX
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIdaZjd`PoI%]sP/RUnsl_V50o`Unji_UnslSI!'U18r?J4
+G#CqU;G)gD6?Z7!Lg!Ps;G)aK:3KN-Qu-<CML;slI(>,^aGYJWML;sgGdiZd\V5:=Km:.^Ge&NQ
+\V5:;Htp3GGc,q.\V5:=Km9MCE4L[I[sVr6bg#),kMYFadaZjkbg!c4]sP/RX/rG!V50WQS=H1@
+S=Z7@St(RQB8B_dLg!Q!>?$D^:5E(KH!=7(>#'lW:5E(KLg!Q0>#'lW:7,m-aGYJUNJ5H3ICY5_
+aGYJWML;slI(=rU\V5:=Km:.^GfYPY\V5:=Km:.^Ge&NQ\V5:HH[WGYGe&NQk1nbls8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC^b[bF!-UQu-<"D.9JdAXI=D
+Qu-<3FCge\CT2DeQu-<3FCghV@]=H\WH;^NFChFnAZ'opVgNH_FCh@tE2dqjMITbE>#'lW:5E(K
+Q=EpN>#'lW:5E(KLg!Q0>#'lW:5E(KLg!Q0>#*)M])Vg1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC^elhPkU.
+WH;^LHuQ',AZ'opVgNH]HuQ!2E2S)&VgNH]HuQ!2E4:40VgNH]HuQ!:I&D@2[sVqgKRB\FE4L[I
+QZR##@p"Uu=GgTjLg!Q2@p"Oj:5E(KLg!Q!>?$Ji=LbK5i8j(ZjQGann)39ii8j(LeCM^:SYq-g
+\V5:;HtoR4I(+K<VhBH.Km9MCE4L[I\V5:=Km:.^Ge&NQ\VbdFKm:.^Ge&NQVhBH.Km:.^Gc-4B
+MITbG@p"Uu=GgTjLg!Q2@p"Oj:5WO`Lg!R;m-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLnYI
+daZjhUn,&RI(>,^\VbdFML;sgGdiZd\VbdDNJ4p#I(,)h[uH*NNJ4j$Kt!%q\<Di]ML;ptMn+^m
+\<Di[NJ4osG`$!5MITbG@p"Uu=GgTjfZ_P=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjhXJNI]Ge&NQ\V5:=Km:.^Ge&NQ
+\V5:=Km:.^Ge&NQ\V5:=Km:.^Ge&]Z\V5:LKQ=V\I)q4o\VbdUMg`[)IE7V*[uH*_PD%#@KZK@1
+aGYJfPD%#8ICPK!aGYJVPDdM?I@#%kMITbE>#'rb=Q\Dos8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hU9p)
+daZjkbg">Tc,@T?bKS5L`Pp$Ec,@T?a0i1_Km:.^GdiZd\VbdDNJ4p#I(>,^\VbdFML;slI(>,^
+[uH*_Mg`'oKuf1#\VbdFML;slI(=rU\VbdUMg`-nI&DXF`5T]oN/!^:@_%2;\V5:=Km:.^Ge&]Z
+\VbdFML<L'ICG2iaGYJUNJ5H;KXZqpaHM:dNJ5H;KXZqpaHM:dNJ5H;K\+/Us8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtpK/f#u:^`5T^-]Y2=t]">Vg
+]=bhq`PoI%]t:qj['[3-D.8B4=NH\Za-hq-R>o7TNQ7HH\<DilPD$H0Mo_*8\<DilMg`+!Mmn\"
+[uH*NNJ5H;KXZqp[uH*_PD$E)Kt*>)\<DilMg`+!Mq>n\o_/+\s8V`bq<[_Gkj7ckgtp`>hTO-f
+UnslSI!(6K:5WO`Lg!Q2@p"Oj:5WO`QZR#RML<I4NQ7HHa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HH
+a-hq-R>o7TNQ7HHa-hq-R>o7TNQ@<:a-hq-R>o:OKZBL?es_]Q]XHbZkLnYIbKS5L`PoI%]sP/R
+['[3@XKAk:['[3IX/rG%R[&\4:3U5VLg!Q2@p"Oj:5E(KVhBH=PD$E)KufI2[uH*_PD$E)KufI2
+aHM:uPD$E)KufI2aHM:uPD$E)KufI2[uH*_PD%#@KZBL?aHM:ePDdJLNQ@<:a-hq-R>o7TNQ7HH
+a-hq-R>o7TNQ7HHa-hq.PD$uENQ@<:a-hq-R>ok+XT/>#s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+i8j(Sgtp5uc,@T?]=bhXXKAP)XdkuQUnsl_V50o`UkX8DG#CqU;G)4=</OO>G#CqU;G)gD6?Z7!
+G#Cqi;*pXe@_%2;\VbdFKm:.cI(=rU\V5:=Km:.cI(>,^VhBH.Km9MKI(=rUVhBGqHuQ!:I&D@2
+\V5:+HuQ!:I+ZZdi8j(SgtpK/f#u:^]=bhh]Y1AIXe_ehS=Z7@St)44PGG%NLM^[L>?$D^:3g&C
+Lg!Q!>?$D^:5WO`H!=7(>#'9P@#.u]MITbUD.:#=Mo^g)[uH*_Mg`'oKt3(gaGYJWKm:.^Ge&NQ
+\V5:=Km:.^Ge&NQ\V5:=Km:.^Ge&NQVgNHoKm;b8h#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gk1naYFDI7\@[M"AQu-<"D.8lL@[D1PWGQ"/FDI7\@]=H\
+QZR#BFCge\CSuQ!VgNH_FCh@tE2S)&WH;^LHuPHi@Ye2_Lg!Q0>#'lW:5E(KLg!Q0>#'lW:5E(K
+Lg!Q!>?$D^:3g&CVhBHts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726a0i1=FDI4bCR9-YR!a%CFDI4bCSuQ!
+QZR#@HuQ!2E2S)&VgNH]KRB\FE2S)&VgNH]KRB\FE2SA:VgNH]KRB,.CPZ.hLg!Q!>?$Ji=F"+M
+Lg!PtA71:)=F"+MLg!Q_UnHr<n*'-,i8j(bm-ilnkLnYIa0i1_Km9MCE2SA:VhBH,HtoR4I&D@2
+\V5:+KRB\NI&DXFVhBGqKRB\NI&DXFVhBGqKRC=aGe&]ZVhBH.Km8nn<JXgRLg!Q0>#'rb=F"+M
+Lg!PtA713s::RF+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f!pp%\VbdFKm:(dKt2n^
+W/QJAKm:(dKt!%q[uH*NNJ4j$Kt!%q\<Di[NJ4j$Kt!%q[uH*OPDcu/I(5AuVgNH@@p"Uu=GgTj
+MITbDD.inKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+@Sq<726i8j(Sgtp)ZZ)EV9\V5:+KRC=aGe&NQ\V5:=Km9MKI(=rU\V5:=Km:(dKt2n^
+\VbdFML<L'ICG2i[uH*PML<L/KXZqpaHM:dNJ5H3ICG2iaHM:dNJ4m+Mmn\"[uH*OPDdM?ICG2i
+aGYJWML:e.@Z"YtMITbTFDLpVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5Sbg")F`QQKM
+`5T^6`Pod7`Mf#_\Vbd4KRC=fI(,)hVhBH.ML;mmKt3(g\VbdDNJ4j$Kt!%q[uH*NNJ4p#I(,)h
+\VbdFKm:(dKt2n^\Vbd4HuQQjTSQcHVhBH.Km:.cI(>,^\VbdDNJ4osGdiZd[uH*NNJ4j$Kt!%q
+[uH*NNJ4j$Kt!%q[uH*NNJ4j$Kt!%q[uH+As8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH-bg")F`Pfa7`5T^-]Y28&`Oidr`k8n$`PoI%]r7Bb
+MITbTFDJpbNQ7HHa-hq-R>o7TNQ7HHa-hpsPDdJLNOY11\<Di\PDdMGKXd5([uH*OPDcr7Mmn\"
+\<Di\PDco0Kt*>)\<Di[NJ5E@NQ8H3`k8mi['[?FWi2AOR!a%6@p"Oj:3g&CH!=6n>?#lP</=^Q
+QZR#RML<I4NQ7HHaHM:tR>o7TNQ7HHa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HH
+a-hq-R>o7TNQ7HHa-hq-R>o:`S`&Slkj7ckgtpK/f#u:^]=bha['[3I['[3I['[3I['[3I[%sOo
+MITb6>?$Ji=GU-UH!=7*@p#^PA]U'g\<DilPD$H0Mo_*8\<DilPD$H0Mo_*8aHM:uPD$H0Mo_*8
+aHM:tR>o:OKZBL?\<DilPD$H0Mo_*8a-hq.PD$H0Mo_*8a-hq-R>o7TNQ7HHaHM:tR>o:OKZK@1
+a-hq-R>o:`Sb_@*s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIbKS5L`Po3k['[3I
+Unsl_V50o`Unji_UnslSI!'U18p4*)G#CqU;G)+18pOW?G#CqU;G)+18p4*)MITbtNJ4osGdiZd
+\V5:;NJ49`I(=rUVhBH.Km9MKI(>,^\V5:+HuQWMGc,q.VgNHoKm9MCE2SA:VgNI9bfer*kMYFa
+daZjkbg!c4]sP/RX/rG!V50NCPGG%NS=Z7@St(RQB6d]\Lg!Q!>?#lP</=^QH!=6n>?$D^:3g&C
+Lg!Q!>?$D^:7$'<[uH*OPDcr7Mn"t/[uH*NNJ4j$Kt3(g[uH*PKm:.^Ge&NQ\V5:=Km:.^Ge&NQ
+\V5:+KRC=aGc,q.k1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_>6n#22"Qu-<"D.8lL@[D1PQu-<"D.8iRCRAsJQZR#1D.8iRCSuQ!VgNH_FCgheFf0V+
+WH;^LHuQ',AZ'opQu-;g>#'?I</=^QH!=6n>?$D^:3g&CH!=6n>?#lP</=^QH!=6k;G)gV=P;Kd
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o6m-gm;OI(')WH;^<FDIe%E0kZ^VgNHMFDI7kFf0V+R!a%DI!)?7E2S)&
+VgNH]KRB\FE2S)&VhBGqHuQ!:I&D@2QZR##@p!qc@#.u]H!=7*@p""\<-_\IH!=6n>?#lP<4K'1
+kj7crjQGann)39ii8j(`gt^)sc)65BVgNH]HuQ!2E2S)&VgNH]KRB\FE2S)&VgNH]KRB\FE2S)&
+\V5:+HuQWMGc-4BVhBGqKRB\NI&DXFQZR#!>#'9P@#.u]H!=7*@p""\</=^QG@Y*KD.<PFs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o6m-j)lgtCK>a0i1MKRC=aGc6RUVhBH.ML;sgGc6RU[uH*NNJ4j$Kt!%q
+\<Di[NJ4j$Kt!%q\<Di[NJ4m+Mmn\"[uH*NNJ3^@CPlV(MITb4A71:)=K%15s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQGI^kLe#%
+[uH*PKm9MKI(>,^W/QJ?NJ49`I(,)h\V5:;NJ4<iL:<.r[uH*PML;mmKt*>)[uH*OPDdMGKXZqp
+aHM:dNJ4j$KufI2[uH*_PD$E)KufI2[uH*_PD$E)Kuf1#\<Di[NJ4m+Mo^g)\Vbcl@p"Uu=GU-U
+VhBHts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQdaZjreCMgec-+>U`5T^6`PpKRbJ_B=bKS5PXJMhJI(>,^
+VhBH.ML;@]L:N1hW/QJ?NJ4p#I(,)h[uH*NNJ4j$KufI2[uH*PML;mmKt3(g[uH*PKm:(dKt2n^
+LM^[ZD.gD5Ge&NQVhBH,NJ4osGdiZd\VbdFML;slI(,)h[uH*PML;mmKt!%q[uH*OPDco0Kt!%q
+[uH*NNJ6#t[f?C-s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+m.9o.jQG4OhU9p)bKS5L`PoI%]u7n/]=bhh]Y1qi]u7n/]=bhq`Pn0sJVmr>[uH*^R>n_?MoV6F
+\XJbmPDdJLNObLBa-hpsPDdJLNOY11\XJbmPDcr7Mn"t/[uH*OPDcr7Mn"t/\<Di]ML;ptMmn\"
+[uH*OPDdM?ICG2iQZR#1D.7cp<-_\IH!=6n>?$Ji=I<r7R!a%eML;ptMn"t/\<Di\PDcr7Mn"t/
+aHM:fRZtj\NQ7HHa-hq-R>nbGPfK2Oa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HH
+k1nbapA*Y-kLnYIdaZjd`PoI%]sP/R['[3I['[3I['[3I['[3I['YU1E-YYeH!=7(>#'9P@#.u]
+LM^\ER>n_?Mn"t/aHM:ePDdMGKXd5(aHM:fRZtj\NObLBa-hq-R>o7TNQ7HHa-hq-R>o7TNQ7HH
+a-hq-R>n_?MoV6Fa-hptRZtmWKXd5(aHM:ePDdMGKXd5(\<Di\PDcr7MqG\Ns8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(LeCN'tf#5PH]=bhXXKAP)Xe_ehUnsl_V50WQS;23*
+G#CqU;G)+18p4*)G#CqU;G)+18p4*)G#CqU;G*<n@]+m,\V5:+KRB\NI&DXF\V5:+KRB\NI&DXF
+\V5:+KRB\NI&D@2VgNH]KRB\FE2S)&VgNH]HuQ!:I+ZZdi8j(SgtpK/f#u:^]=bhh]Y1,;Unji_
+S=Z7@St)=BS=H1@LM^[I;G)4=<-_\IH!=6n>?#lP<-_\IH!=6n>?$D^:3g&CH!=77FDJFEI(5Au
+\VbdEPDco0Kuf1#[uH*PKm9MKI(=rUVhBGqKRB\NI&DXFVgNH]KRB\FE2SA:VgNH]HuS6'h#IES
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7cJXf@b*@Y\f5
+Qu-;fD.f5Q@[M"AQu-<"D.8lL@[D1PQZR#0FDI4bCSuQ!QZR#BFCgheFdI2cVgNHMFDI4bCPlV(
+Lg!Q!>?$D^:3KN-H!=6n>?#lP</=^QG#CqX>?#cD8pOW?G#Cr2R[*pQs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq:XQ[
+QZR#0FDI4bCR9-YQZR#1I!(ctCSuQ!QZR#1I!(ctCSuQ!R!a%DI!)?7E0u#qVgNHNI!)?7E2SA:
+VgNH]HuPEoCPZ.hH!=6n>?#lP<-_\IH!=6n>?$Ji=F"+MH!=7XXfCUOn*'-,kj7d4m-!<fkMYFa
+daZjHN/"6XE0u#qVgNHNI!)?7E0u#qVhBGqHuQ!2E2S)&VgNH]HuQ!2E2S)&VhBGqHuQ!:I(+K<
+VhBGqKRB\FE/J.-G@Y*;>#'9P@#.u]G@Y*;>#'9P@#.u]`5T^qs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,
+g"bH;gtoT1Pc0Oq\Vbd4KRC=fI&DXFW/QJ?NJ4j$KrBrb[uH*NNJ4j$Kt!%q[uH*NNJ4j$Kt!%q
+W/QJ@PDco0Kt!%qLM^[]@p!qc@#AGrMITc,`PqlWs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n)39ifZ_OKPDc>lI&N!Y\Vbd5N/"g$Kr9TO
+[uH*>KRC7gKrBrb\VbdDNJ4j$Kt!%q[uH*OPDcr7Mmn\"\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/
+\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/[uH*OPDco0Kr9TOMITbG@p""\<4AZrs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+kj7d#gt^T<hU9p)bKS5Sbg">Tc,@T?`5T^6`Pod7`Pfa7\<DiKKRB_WL:N1hW/QJ?NJ4j$Kt!%q
+[uH*NNJ4j$Kt*>)[uH*NNJ4j$Kt!%q[uH*NNJ4j$Kt!%q[uH*>KRB\FE2S)&W/QJAKm9PTL:N"_
+W/QJ/KRB\NI&N!YVhBH,NJ4<iL:<.r[uH*NNJ4j$Kt!%q[uH*NNJ4<iL:<.rs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(LeCMgec,@T?
+`5T^6`PoI%]u7n/`5T^-]Y1qi]t:qj]=bhDFDHYKB=O.`a-hptRZtj\NObLBa-hpsPDcu?PfK2O
+\XJbmPDcu?Pdlp8\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/
+\Vbd5N/"lsGc6RU\VbdEPDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/a-hpsPDcu?Pe!6I
+a-hptRZt@OPfK2O\XJbnRZt@OPe!6Ia-hptRZtj\NQ7HHa-hqLbfTnbs6T@Mkj7ckgtpK/f#u:^
+`5T^&['[3I['[3I['[3@XKAk:['[3IQ\9pI@p""\<-_\IH!=6n>?$Ji=LX9DaHM:ePDdMGKXd5(
+\<DilPD$H0MoV6F\<DikR>o7TNQ7HH\XJc'R>nbGPfT&A\XJc'R>nbGPfK2Oa-hptRZtj\NQ7HH
+\<DikR>nbGPfT&A\XJbmPDdMGKZKs[p[%)Cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+m.9o6m-ilnkLnYIbKS5L`PoI%]sP/RUnsl_V50o`Unji_UnslAI!^$78p4*)BMV3C;G)+18p4*)
+G#CqU;G)+18p4*)MITbdKRB\NI&DXF\V5:+KRB\FE2SA:VhBGqKRB\FE2SA:VgNH]KRB\FE2S)&
+VhBGqHuQ!:I&DXFVgNI,bg#A<n(HLQdaZjkbg!c4]sP/RX/rFnSt)=BS=H1@R?Ni)St("8@!PsU
+G#CqX>?#cD8pOW?G#CqX>?#lP<-_\IH!=6n>?#lP<1%N3[uH*NNJ4m+Mmn\"\<DiLN/"g$Kt!%q
+VhBH,NJ49`I(=rUVhBH.Km9MKI&DXFVgNH]KRB\NI&DXFk1nbls8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n&32aQu-;fD.f5Q@Z"YtQZR"uD.f2WCRAsJ
+QZR#0FDI4bCR9-YQZR#0FDI4bCR9-YQZR#0FDI4bCR9-YQZR#1D.7Zd8pOW?H!=6n>?#cD8pOW?
+G#CqX>?#lP<-D/3H!=6n>?#cD8p=fRkj7d<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9nZUnF)l@[D1PQZR#0FDI4bCR9-Y
+QZR#1I!(g(Ff0V+R!a%DI!)?7E0u#qR!a%SHuPI#Ff0V+R!a%DI!(g(Ff0V+LNIK\>?#lP<-_\I
+H!=6n>?#lP<-_\IH!=6n>?#lP<4K'1kj7d%m-j0)n*'-,kj7ckgtp`>hRB;RR!a%SHuPI#Ff0V+
+R!a%SHuPEoCRBKlR!a%DI!)?7E0u#qR!a%SHuQ!:I&D@2VhBGqKRB\NI&DXFVhBGQD.eZ.:3U5V
+H!=6n>?#fW@#.u]G@Y*,>?$r2C]FG7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG[\grmpdW/QJAML;@]L8^&c
+W/QJAML;@]L:<.rW/QJ?NJ4j$KrC5t[uH*?N/"j+Ml;Sh[uH*?N/"g$KrBrb\<Di;KRo"j=Ee:`
+MITb4A71:)=TAF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq;C>si8j(SgtoN9TXTo7W/QJAML;@]L:N"_W/QJAML;@]L:N1hW/QJ/KRC7gKrBrb
+[uH*OPDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mmn\"
+\<Di[NJ4m+Mn+^m[uH*NNJ3aIFa71jH!=6n>?'4m^&S-4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH4eCN9rbKJ,S
+`5T^=bg")F`QQKM`5T^=bg!Z"WjdtA[uH*?N/"g$KrBrb[uH*?N/"j+Mmn\"\<Di\PDco0Kt*>)
+\<Di\PDco0Kt!%q[uH*NNJ4j$Kt!%q[uH*NNJ4j$KrBrb[uH*?N/"g$Kt!%qW/QJ?NJ4j$KrBrb
+[uH*OPDcAuL:<.rW/QJ?NJ4<iL8^&c\V5:LXJPsss8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjkbg")F`Pfa7]=bhs]Xk_f]t:qj
+`5T^-]Y1qi]st2ELM^[jFDJFUPe!6I\XJc'R>nbGPe!6I\XJbnRZt@OPdlp8\<Di\PDcr7Mn"t/
+\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/[uH*OPDcr7Ml;Sh
+\<Di\PDcAuL:EG*\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/a-hptRZt@OPfK2O\XJbnRZtj\NQ7HH
+\XJc'R>nbGPfK2O\XJbnRZuFB^&S-4s8W,coC_>6n)39idaZjkbg")F`O*"Z['[3I['[3I['[3I
+['[3@XKA:pUj60DH!=6lA713s:3g&CH!=7GKRC:nMn,:@\<Di]RZt@OPe!6I\XJc'R>nbGPfK2O
+\XJbnRZtj\NObLBa-hptRZtj\NObLBa-hptRZt=GMoV6F\XJc'R>n_?Mo_*8\<Di\PDcr7Mo_*8
+f>PB&s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(Sgtp5uc,@T?
+]=bhXXKAP)XdkuQUnsl_V50o`Uka&2BMV35:J#_-8n_!lG#CqG:J#_-8p4*)G#CqU;G)gV=Lj<:
+VhBGqKRB\NI&DXFVhBGqKRB\FE2S)&R!a%SHuPF*JZ!m7VhBGqKRB\NI&DXFVhBGqKRB\NI*9aY
+i8j(SgtpK/f#5PH]=bha['Zm8Xe_ehS=Z7@St)=BS>_mAG@Y*);G(Uu8U4N>BMV3C;G)+18p4*)
+G#CqU;G)4=<-D/3G#CqfD.ff+L8^&cW/QJ?NJ4<iL:<.rW/QJ0N/"g$Kr9TOW/QJ/KRB\NI&DXF
+VhBGqHuQ!:I&DXFVgNH]KRDq;h#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq=OCVkj7crjQDnXFbagHLM^[ZD.f5Q@Y\f5Qu-;fFE!RgCR9-YQZR#0FDI4bCR9-Y
+QZR#0FDI4bCR9-YQZR#0FDI4bCR9-YH!=6n>?#cD8p4*)H!=6k;G)4=<-D/3BMV3F>?#938Tn!(
+BMV3C;G*mPOT5@\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA*k+gmEJ3LM^[jFDHYRE0kZ^QZR#0FDI4bCR9-YQZR#1I!(g(Ff0V+
+R!a%DI!)?7E0u#qR!a%DI!)?7E0u#qVgNHNI!(ctCO',`H!=6n>?#lP<-_\IH!=6n>?#lP<-_\I
+H!=7XXfD-^kNM:$kj7d%m-j0)n)iE\g"bH(]XjJXFdI2cQZR#1I!(ctCRBKlQZR#0FDI4bCR9-Y
+QZR#0FDI4bCRBKlR!a%DI!)?7E0u#qVhBGqKRB\NI$f;(H!=6lA70[e</P0fH!=6lA70[e<-Mk\
+G@Y+$]Xn.Cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bGnUnFZFL8^&cVhBGqKRB_WL8^&c[uH*?N/"g$KrBrb
+[uH*?N/"g$KrBrb[uH*?N/"g$KrBrb\<DiLN/"g$KpQmsG@Y*=@p!qc@#.u]Q]-h%s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhT2dp
+VhBGqKRB_WL8T]PW/QJ0N/"9iL8^&cVhBGrN/"m#I&N!YW/QJ?NJ4<iL8^&c\<DiLN/"j+Ml;l%
+\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/\<Di\PDcr7Mn"t/[uH*OPDcAuL:<.r[uH*?N/"g$KrBrb
+\V59`D.e,u<-_\IG@Y+Um-"EKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+=jQGI^kLnYIdaZk#bfe2Rc,@T?`5T^6`Pod7`QQKM
+`k8m]P`Vi&L8^&c[uH*?P`WA6KrC5t[uH*?P`WD=Mmn\"W0ECQNJ4m+Mmn\"\<Di[NJ4j$Kt!%q
+W/QJ?NJ4<iL8^&c[uH*OPDco0Kt!%qW/QJ0N/"g$KrBrbW/QJ?NJ4<iL8^&c[uH*?N/"g$KrBrb
+VhBGrN/"6`I.[..s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7crjQFt@f#u:^bKS5L`Pod7`Pfa7]=bhq`PoI%]uI^r]=bhh]Y1hWWcr;q
+VgNHoRZt@OPe!6I\XJbnRZt@OPe!6I\<Di]RZt=GMn"t/\<Di\PDcB(OLUL4\<Di\PDcr7Mn"t/
+\<Di\PDcr7Mmn\"[uH*?N/"g$Kt*>)W/QJ@PDcAuL:EG*W/QJ@PDcr7Ml;l%\<Di\PDcr7Mn"t/
+\<Di\PDcr7Mn"t/\<Di\PDcr7Mn,:@\<Di]RZt@OPe!6I\XJbnRZt@OPe!6Ia-hptRZt@OPi]j#
+s8W-!s8W-!s7H$\kj7crjQG4OhTO-f`5T^-]Y1\Z['[3I['[3I['[3I['[3I['[2qD.e,u<-_\I
+H!=6n>?#fW@$btN\<Di\PDcr7Mn,:@\<Di]RZt=GMn,:@a-hptRZt@OPfK2O\XJbnRZt@OPfK2O
+\<Di]RZt=GMoV6F\XJc'R>n_?MoV6F\<Di]RZt=GMn,:@aJ>C!pA+ags8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7bnD.eTNH`3Bu
+a0i2#eCO9cq>^Kps8W-!s8W-!s8W-!m.9o6m-ilnkL.l2daZjd`PoI%]sP/RUnsl_V50o`Unji_
+UnslBFDuD$8n_!lBMV35:J#4q8Tn!(BMV35:J#4q8SCmkMITbdKRB\NI&DXFVhBGqKRB\NI$f;(
+VgNHNI!)?7E2S)&R!a%SKRB\NI$f;(VhBGqKRB\NI&DXFVhBH@bg#),kLnYIdaZjkbg!c4]sP/R
+X/rFnSt)=BS=H1@S=Z7@St("8?t`>-BMV35:J#h9<+o'!BMV3F>?#938SCmkG#CqF>Zu;K8r@+\
+W/QJ0N/"6`I&N!YW/QJ/KRC7gKr9TOW/QJ/KRC7gKr9TOVhBGqKRB\NI&DXFVhBGqKRB\NI&DXF
+k1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
+\XJbMD.89;B:*OFLM^[ZD.f2WCPQb>QZR"uD.f2WCPQb>QZR"uFE!RgCPR"NQu-;fFE!Ua@Y]&E
+QZR"uFE!+I=D1K%H!=6]:J#4q8SCmkBMV35:J#h9<+o'!BMV3F>?#938SCmkH!=8$gtr)2s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
+\?2cdD.eW@B8:>:QZR"uFE!"WE//OSQZR#1I!(g(FdRQ!R!a%DI!(g(Ff0n?R!a%CFDI7kFdRQ!
+R!a%DI!(g(FdRQ!QZR"g>?#lP<-_\IH!=6k;G)4=<-_\IH!=6]:J#h9<4K'1m.9o:oC_kEkNqg5
+kj7crjQG4OhU9p)VhBGaFDI4bCR9-YQZR#0FDI4bCR9-YQZR"uD.f2WCR9-YQZR#1I!(ctCRBKl
+R!a%DI!)??I$]M;VhBGqKRAPlB8U2$G@Y*,>?#fW@!PsUG@Y*;>#'?I<-N1po_/+\s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
+kj7d#gt^)sc)?SUW/QJ/KRB_WL8^&cW/QJ0N/"9iL8^>uW/QJ0P`Vi&L8^&cW/QJ0N/"9iL:EG*
+W/QJ0N/"9iL:<.rW/QIg@p""\<-Mk\H!=6lA74'6bQ%VBs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkMYFa`k8m\KRB\NI&DXFW/QJ/KRB_WL8T]P
+VhBGrN/"6`I&N!YVhBGrN/"6`I&N!YW/QJ?NJ4<iL8^>u[uH*?P`WD=Ml;l%W0ECBP`Vi.OLUL4
+W0ECBN/"9qOLL4'W0ECBN/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cMITb6>?#lP</5R7
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<[_Gi8j(SgtpK/f#u:^bKS5Sbg")F`QQKM`5T^6`Pp$Ec*sLA\<DiLN/"9qOJn+m
+W/QJ?NJ4<iL8^&cW/QJ0N/"g$KrBrbW/QJ0N/"9iL8^&cW/QJ?NJ4<iL:<.rW/QJ@PDcr7Ml;l%
+\<DiLP`WA6KrBrb\<DiLN/"9iL8^&cW/QJ?NJ4<iL8^&cW/QJ0N/"9iL8T]PaJ>C,s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
+k1nb?eCMgec,@T?`5T^6`PoI%]uI^r]=bhh]Y28&`Oidr]=bhQV5/l`B;^E1\XJbnRZt@OPe!6I
+\XJbmPDcB.Q+3$9W0ECBP`Vi.OLUL4W0ECRPDcB(OJn+mW0ECQNJ4<qOJn+mW0ECBN/"9iL:<.r
+W/QJ0N/"9iL:<.rW0ECRPDcB(OLUL4W0ECRPDcB(OLUL4W1'!]PDcB.Q+3$9\<DiLP`WD=Ml;l%
+\<DiLP`WD=Mn"t/\XJbnRZt@OPe!6I\XJbnRZt=GMn,:@f>PB&s8W-!s8W-!s8W,kpA+(Hp#+oo
+daZjreCMRW`Oidr['[3I['[3I['[3IX/rG1['[3I[$Q`/H!=6lA70[e<-Mk\H!=7*@p#[oOL^gE
+\XJbnRZt=GMn,:@\XJbnRZt@OPe!6I\XJbnRZt=GMoV6F\XJbnRZtj\NObLBa-hptRZt@OPe!6I
+\XJbmPDcu?Pdlp8a-hqOe^sj$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,]gt[*a@!PsUBMV3F>?#6?>'<e9H!=6n>?$u;Ff:ao
+['[4(m-jT?q<[_Gi8j(Sgtp5uc,@T?]=bhXXKAP)Xe_ehUnsl_V50o`Uka&2BMV35:J#4q8SCmk
+BMV35:J#4q8SCmkG#CqG:J$FR=Jph"VhBGbI!)?7E0u#qVgNHNI!)?7E0u#qVhBGbI!)?7E0u#q
+VhBGqKRB\NI$f;(VhBGqKRB\NI*9aYi8j(SgtpK/f#5PH]=bha['Zm8XdkuQS=Z7@St)=BS=H1@
+G@Y)p:J#_-8n_!lBMV35:J#4q8SCmkBMV3F>?#938Tn!(BMV3TD.ff+L8T]PVhBGqKRB_WL8T]P
+W/QJ/KRB\NI&DXFW/QJ/KRB\NI&DXFR!a%SKRB\NI&DXFVhBGbI!+,thZ*WUs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-hm3`J8PSLM^[ZD.eW@B8:>:
+QZR"uFE!"WE0tKOLM^[ZD.eWGE//:CQu-;fD.eW@B8:>:LM^[kD.89;B8:>:LM^[L>?#938SCmk
+H!=6]:J#h9<+o'!BMV3F>?#938SCmkB3\VR:J#4q8V_D,o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+=jQDkOCPQb>Qu-;fD.eW@B8:>:
+QZR#0FDHYRE0u#qR!a%DI!(g(FdRQ!R!a%DI!(g(FdRQ!R!a%DI!(ctCRBKlR!a%DI!(3dE->,O
+H!=6n>?#cD8nVC4H!=6]:J#2(>'X=OBMV4,[']2kp$D;Cm.9oBpA*q=n)39ig"bH4eCM+)TSIAs
+LNIL%FDHYKB:!^ULM^[jFDHYKB8:SJLNIL%FDHYRE0kZ^R!a%DI!(g(FdRQ!R!a%CKRp%SI&DXF
+R!a%#A70Ul@!PsUH!=6lA70[e<-Mk\G@Y*,>?$rBJcGcMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI\XJb]N/"6`I&DXF
+W/QJ/KRB_WL8^&cW/QJ?NJ4<iL8^&cW/QJ?NJ4<iL:EG*W/QJ0N/"9iL:N1hW/QJ0N/!^IFa%A(
+MITb4A71:)=GM!;s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA*q=n*'-,i8j(>`Pnd7L8T]PQ\9pfKRB\NI&N!YVhBGqKRB\NI&DXFVhBGaKRp%SI&N!Y
+VhBGrN/"9iL8^&cW/QJ0N/"9iL8^>uW0ECBP`WD=Ml;l%\<DiLP`WD=Ml;l%[uH*?P`Vi&L8^&c
+W/QJ0N/"6`I&DXFVhBGqKRB_WL8^&cW/QJ0N/![PJU(I!H!=6lA71a_MZ<_Vs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n(HLQ
+g"bH4eCMgec-+>U`5T^6`Pod7`QQKM`5T^8]Xk&+OJnD*W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
+W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW0ECBP`WD=Ml;l%W0ECRPDcB(OLUL4W0ECRPDcB(OJn+m
+W/QJ@PDcAuL8^&cW/QJ0N/"9iL8^&cVhBGrN/%)nkPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjkbg")F`Pfa7
+`5T^-]Y28&`Oidr]=bhq`PoI%]uI^rW1&uqD/6)/L:Nb;\XJb]P`WGEPc0h.\<DiLP`Vi.OLUL4
+W/QJ0N/"9iL8^&cW0ECQNJ4<iL8^&cW0ECQNJ4<iL:<.rW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
+\<DiLN/"9qOLUL4W0ECBP`Vi.OLUL4W0ECRPDcB(OLUL4W0ECBN/"9iL:EG*W0ECRPDcB(OLUL4
+\XJbmPDcu?Pe!6I\<Dj8e^sj$s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hTO-fbKS5C]Y1qi]sP/R
+X/rG1['[3I['[3I['[39V5/B@<-_\IH!=6n>?#lP<-_\IW/QJ@PDcu?Pe!6I\XJbnRZt@OPe!6I
+\XJbnRZtj\NObLB\XJbnRZt@OPdlp8\XJbmPDcu?Pe!6I\<DikR>nbGPdlp8\XJc(XJPsss8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8U$V`FiFZBMV35:J#4q8SCmkBMV3F>?#938S;:3B3\V`;G)^dE5oQ%m.9o6m-ilnkLnYI
+daZjd`PoI%]sP/RUnsl_V50o`Unji_UnslBFDtnh8QA2FBMV3I3]q(O8SCmkBMV35:J#4q8SCmk
+G@Y*JKRp%SI$f;(VhBGqKRB/7Ff0n?R!a%CKRp%KE0u#qR!a%SKRB/7Ff0n?Q\9pfKRB\NI$]M;
+VhBH@bg#),kLnYIdaZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7@St("8?t`>-BMV35:J#4q8SCmk
+BMV35:J#4q8SCmkBMV35:J#4q8W%"[VhBGaKRp%SI&DXFVhBGqKRB\NI&DXFW/QJ/KRB\NI&DXF
+Q\9pfKRB,>JZ"0KQ\9pfKRB,>JZ"0Kk1nbls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+@Sq<726i8j'gI!(3]B8:>:LM^[ZD.eW@B8:>:LM^[ZD.eWGE0tKO
+LM^[ZD.eW@B8U2$LM^[ZD.eW@B8:>:LNIL%FDHYKB8:>:BMV34>Ztf:8SCmkB3\VR:J#4q8SCmk
+BMV35:J#4q8SCmkBMV35:J$t<PQ1[_s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8VHWor+=ELNIKjD.eW@B8:>:LM^[jFDHYRE//OSQZR"uFE!RgCPR"N
+QZR"uFE!RgCPR"NQZR#0FDHYRE0u#qQZR#1I!(ctCRBKlLM^[I;G(S,>%g]'B3\V`;G(Uu8S;:3
+BMV35:J#4q8[Pk3o_/+QpA+@Sq<[_Gm.9o6m-ilnkLnYI`5T]^FDHYKB8:>:LM^[ZFE!RgCPQb>
+LNIL&D.89BE//OSQZR#1I!(ctCRBKlR!a%DI!(d/JX;%@VhBGaN/FNdI$f;(H!=6lA70Ul@!PsU
+G@Y*,>?#fW@!?-hG@Y*[R[*pQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+@Sq<726i8j(A[BZ'WMPl,TQ]-g"KRB_WL8^&cW/QJ0N/"9iL8^&c
+W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cQZR"eA70[e<-Mk\G@Y*kXfDF$s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7d#gt^?-eu4gp
+VhBGaKRoJCJZ"0KQ\9pVKRoJCJZ"0KQ]-fgKRp%SI$]M;Q\9pVKRoJCJZ"0KQ]-g"KRB_WL8^&c
+W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"6`I$]eLW/QItKRp(\L8^&c
+W/QJ0N/"9qOJn+mW0EC2I!'XD@!PsUH!=7XXfDF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)fZ_O^bg")F`RrDX
+`5T^6`Pp$Ec,@T?\"o[qP`Vi&L8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
+W/QJ@PDcAuL:<.rW0ECBN/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8T]P
+W/QJ/KRB_WL:Nb;s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtp`>hU9p)bKS5L`Pod7`Oidr`5T^-]Y28&`Oidr
+]=bhh]Y1qi]qhL#G@Y*[N/"9qOJnD*W0ECBP`Vi.OJn+mW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
+W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^>uW/QJ0P`Vi.OJnD*\<DiLN/"9qOLUL4
+W0ECBP`WGEPc0h.\<DiLP`WD=Ml<)0\<DiLP`WD=Ml<)0\XJbnRZsb8OL^gE\XJbnRZuakkPtS^
+s8W-!s8W-!s8W-!s8W-!s8VHWp#+ooi8j(LeCMgec,@T?]=bha['[3I['[3IX/rG1['[3I[(*6<
+LNIKZA70[e<-_\IG@Y*,>?$B"E4D*i\<Di]RZt@OPe!6I\XJbmPDcu?Pdlp8\XJbnRZt=GMn,:@
+\XJbnRZt@OPe!6I\XJbnRZt@OPdlp8\XJbnRZusih#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+IoC_JAp%7tRo_/+\s8V`bq4+%HBMV35:J#4q8SCmk
+BMV35:J#4q8SCmkBMV35:J#4q8V_D,W/QJ0P`XhakNqg5i8j(Sgtp5uc,@T?]=bhXXKAP)Xe_eh
+Unsl_V50o`Uj$p&BMV3"76tT_8Q\YWBMV3"76tT_8SCmkBMV35:J$@G:7$WbVgNHMKRoJCJXCh-
+VhBGaKRp%KE0l6/VhBGaKRp%SI$]M;VhBGaKRp%SI&DXFQ]-g"KRB_WL<Ifci8j(SgtpK/f#5PH
+]=bha['ZX*Unji_S=Z7@St)aJQ(4G9G@Y)p:J#4q8SCmkBMV35:J#4q8SCmkBMV35:J#4q8SCmk
+BMV3DA72<gI$f;(Q\9pVKRoJCJX;%@VhBGaKRp%SI$]M;VhBGaKRp%SI$]M;Q\9pVKRp%SI$]M;
+VhBGaN/HcQh#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-j0)n$f*cLM^[ZD.e`9=GLa+LM^[ZD.eW@B8:>:LM^[ZD.eW@B8:>:LM^[JD/5#==GLa+
+LM^[ZD.eW@B8:>:LM^[ZD.e''?t`>-BMV35:J#4q8SCmkBMV35:J#4q8SCmkBMV35:J"Y^88(dj
+BMV3uR[*pQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+fZ_NoD.eW@B8:>:LM^[ZD.eW@B8:>:LM^[ZFE!RgCPR"NLNIL&I!(3dE0kZ^L4"?7FDHVYH^Ahi
+L4"?7FDHVYH\Z]^LNIL%FDHYKB4kIQBMV35:J#4q8S;:3BMV35:J#4q8SCmkBMV40XfD$eq=OCV
+o_/+QpA+@Sq<726i8j(SgtpK/esV_cQu-;fD.eW@B8:>:LM^[ZD.eW@B8:>:LM^[jFDHYRE//OS
+R!a%2I!_6.FdIc4R!a%CKRoJCJZ"0KQ\9pVKRnnqB6d]\G@Y**A70Ul@!?-hG@Y)o>ZuDW<-Mk\
+Q]-h%s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+kj7crjQF_1c'OBHVhBGaKRoJCJZ+N^Q]-g"KRB,FMPuJgW/QJ0P`Vi&L8^&cW0ECBN/"9iL8^&c
+W/QJ0N/"9iL8^&cW/QJ/KR@uS@!?-hG@Y**A70Ul@/p9,s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7d%m-ilnkLnYIW1'!<KRoJCJX;%@Q\9pVKRoJCJZ"0K
+Q\9pVKRoJCJX;%@Q\9pVKRoJCJZ"0KQ\9pVKRp%SI$]M;Q]-g#N/![XMO8d6G@Y*[N/"9iL8^>u
+W/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ/KRB,>JZ+N^Q\9pgN/"9iL8^&cW/QJ0N/"9iL8^>u
+LNIKZA70%T>'X=Og"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+@Sq<726i8j(LeCN'tf#u:^bKS5L`Pp$Ec,@T?`5T^6`Poj0\u:jT
+W/QJ0N/"9iL8^&cVhBGaN/FNdI&N!YW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cW/QJ0P`Vi&L8^&c
+W0ECBP`Vi&L8^>uW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&cQ]-g#N/![PJZ+N^Q\9qRm-juSs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+@Sq;C>sg"bH4eCMgec-+>U`5T^6`Pod7`Oidr]=bhs]Xk_f]u7n/]=bhs]Xjo8Uk`f"
+Q]-g3PDcAuL8^>uW/QJ0N/"9qOJn+mW/QJ0N/"9iL6mjVW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
+W/QJ0N/"9iL8^>uW/QJ0N/"9iL8^&cW/QJ0P`Vi.OJnD*W0ECBP`Vi4Q+3$9W0ECBP`Vi4Q+<?J
+W1'!]PDcB.Q+<?JW1'!^RZt@OPc1%9\XJbnRZt:WT`>&ls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_&&kLnYIbKS5L`PoI%]sP/R['[3I['[3I['[3I['[3@XK@nSPBgA3G@Y)o>ZuDW<-_\I
+G@Y*[P`WGEPdlp8\XJbmPDcu?Pe!6I\XJbnRZt=GMn,:@\XJbnRZt@OPdlp8\<Di]RZt=GMn"t/
+\XJbmPDdJhZ2ak(s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+m.9o:oC_>6n*'-,kj7d%m-j<4p#+ooL4">J76spB5ug?><CK2U9Lr8Z86APVBMV3%9Lrhm8SCmk
+QZR#AN/![PJZ"0K]=bi@m-ilnkL.l2daZjd`Po3k['[3IUnsl_V50o`Unji_UnslBFDt5K6"j%c
+<CK2e:J"Y^8:3H\BMV3"76spB6"j%cH!=7GHuPF*JXCh-VhBGbI!(d/JZ"0KQ\9pWI!(d/JXCh-
+Q\9pfKRB,>JX;%@VhBGaKRp(\L8^&cQ]-gFbg#),kLnYIdaZjd`PoI%]sP/RX/rFnSt)44PFS57
+S=Z7@St'Fu>#e!W<CK2R76spB5ug?>BMV35:J#4q8SCmkBMV35:J#4q8W%"[Q\9pWI!(g(FdRQ!
+VgNHMKRp%SI$]eLVhBGaKRoJCJX;%@Q\9pWI!)??I$]M;Q\9pVKRoJCJZ"0Kg"bHas8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7c]bfto[B8:>:
+GAV,Q@p"M'B8:>:LM^[ZD.eW@B8:>:G@Y*=@p!qlCNj;sGAV,Q@p!qlCPQb>LM^[ZD.eWGE//:C
+LM^[;:J#4q8SCmkBMV35:J"Y^88(dj=A28!:J"Y^88(djBMV3%9Lr8Z88(djL4"@3m-juSs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,Pgtmg.E//:CLM^[ZD.eW@B6S3.
+LM^[ZD.eW@B8:>:LNIKjFE!"WE//OSLNIL%FDHYRE/&aeLNIKjFE!RgCPR"NLNIKjFE!RgCPI4`
+LM^[;:J#4q8SCmkBMV35:J#4q8SCmkBMV3%9Lrhm8[Pk3o_/+\s8V`bq=OCVo_/+Em-ilnkN:RT
+daZjT['YU*B8:SJLM^[ZD.eW@B8:>:LM^[ZD.eW@B8:SJLNIL%FDHVYH^AhiL4"?8I!(d/JX;%@
+VhBGaKRoJCJZ+N^Q\9p6D/4?+@!PsUB3\Vc>?#fW@!PsUB3\VaA70[e</5R7daZkJs8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kLe#%W/QItKRoJCJX;%@
+Q\9pVKRoJCJX;%@W/QItN/FQmL8^&cW/QJ0P`Vi&L8^&cW0ECBN/"9iL8^&cW0ECBN/"9iL5()&
+G@Y*,>?#fW@!PsUUnsmes8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA*q=n)39ik1nb%Xf@_@JXCh-Q\9pWI!(d/JX;%@Q\9pVKRoJCJXCh-Q\9pWI!(d/JX;%@
+R!a%CKRoJCJX;%@Q]-g"KRB,>JZ+N^Q\9p6A70%T>*k2*W/QItN/FQmL6mjVQ]-g#N/![XMO09Z
+W/QItN/Es\MPuJgQ]-g"KRB,FMPuJgQ]-g#N/"9iL8^>uW0ECBN/"9iL3IKMH!=6\>Zu>^@/p9,
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-ilnkLnYIdaZjkbg")F`QQKM`5T^6`Pp$Ec,@T?`5T]oR['h1L6mjVVhBGaN/EsTJZ+N^
+Q\9pgN/![XMPl,TQ]-fgKRp(\L6mjVW/QItN/FQmL8^&cW/QJ0N/"9iL8^&cW/QJ0N/"9iL8^&c
+Q]-g#N/![PJX;=QVhBGaN/FNdI$]M;Q]-fgKRp(dOT5@\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n(HLQ
+daZjreCMgec,@T?`5T^-]Y28&`Oidr]=bhs]Xk_f]t:qj]=bhQV5/lgE0l6/W0ECBN/"9iL8^&c
+W/QItN/Es\MPuJgQ\9pfKRB,FMO0!IQ]-g#N/![XMPuJgQ]-g#N/![XMPuJgQ]-g#N/"9iL8^&c
+W0ECBN/"9qOLUL4W0ECRPDcB(OJnD*\<DiLP`Vi4Q+<?JW0ECBP`Vi4Q+<?JW1'!^RZsb>Q+<?J
+W1'!^RZsb>Q,LY\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(SgtpK/f#5PH
+]=bhh]Y1\Z['[3I['[3@XKAk:['[3IX/rFIA70%T>'X=OB3\VaA70[e<2bb1W1'!^RZsb>Q+<?J
+\XJb]P`WGEPe!6IW0ECSRZt=GMn,:@W0ECSRZt@OPc1%9\XJb]R[(FPPe!6IfZ_P=s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kMYFai8j(SgtpuMkMYFa
+['[2Q>Zt,r5ug?><CK2R76spB5ug?><CK2R76spB5ug?>BMV3SI!_35JX;%@Q\9pVKRp(dOPo3_
+i8j(Sgtp5uc,@T?]=bha['ZX*Unji_Unsl_V50o`Uka&2BMV3%9Lr/P6"j%c<CK2U9Lrhm8QA2F
+BMV3"76u3'<0r8hR!a%CKRoM<FdIc4R!a%CKRoJCJX;%@Q\9pVKRoJCJX;%@VhBGaN/EsTJZ+N^
+Q\9pgN/![PJ^W'!i8j(LeCN'tf#5PH]=bha['ZX*Unji_S=Z7@St)=BS=H1@B3\V?76spB5ug?>
+BMV3"76spB5ug?><CK2R76spB6"j%c<CK2tA71dPFdRQ!R!a%CKRoM<FdRQ!Q\9pVKRoJCJX;%@
+Q\9pWI!(d/JXCh-Q\9pWI!(d/JZ"0KQ\9pVKRr:@h#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)39iQ]-fGA7110B6RloGAV,>A70Ul@!?I'
+G@Y**D/4?+@!?I'MITb4A70Ul@!?I'G@Y**A70Ul@!?I'LM^[JA70Ul@#&T3B3\VB9Lrhm8Q\YW
+BMV3%9Lrhm8Q\YWBMV3%9Lr8Z86APVBMV3%9Lr8Z89\TP]=biWs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8Ud-hM-E)LM^[ZD.e'0CPQb>GAV,ND.eW@B6S3.LM^[ZFE!"PB8:SJ
+LNIKjFE!"WE//OSLNIL%FDHYRE//OSLNIKjFE!"PB8:>:LNIKjFDuG7?t`>-BMV35:J"Y^88(dj
+=A27f9Lr8Z86APV=A28m[']l5s8W-!s8W-!s8V`bq=OCVi8j(ZjQG4OhUp&qQ\9pFD.eW@B8:>:
+LM^[ZD.eW@B8:>:LM^[ZFE!"WE//OSLNIKjFDut^H^K2'R!a%DI!(g(FdIc4Q\9pVKRoJCJX;%@
+LM^[:>ZuDW<-Mk\B3\VaA70%T>'FLbB3\VQ>ZuDW<1/r6o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+@Sq<726`5T]^KRoJCJXCh-Q\9pWI!(d/JX;%@Q\9pfKRB,>JX;%@
+W/QItN/FQmL6mjVW/QItN/FQmL8^&cR?Ni5N/"9iL7+6hW/QITA70Ul@!?-hG@Y**A75''q>^Kp
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp&`\sJ)$
+Q\9pVKRoJCJX;%@Q\9pVKRoJCJX;%@L4"?8I!(0kH^K2'L4"?8I!(d/JXCh-Q\9pVKRp%SI$]eL
+Q]-g#N.uOnCN`TJL4"?d`PndEQ'[/TQ]-fgKRp(\L6mjVW/QItN/FQmL6mjVW/QItN/FQmL6mjV
+W/QItKRoJKMO09ZW/QJ!PEVr(L8^>uW/QItN/Dgi?t`>-B3\VpI!bnns8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<kj7ckgtpK/f$`(!
+fZ_OW`Pp$Ec,@T?`5T^6`Pod7`OidrQ\9pgN/![PJX;%@W/QItKRp(\L6mjVW/QItKRp(\L6mRE
+VhBGaKRoJKMPl,TQ]-fgKRoJKMO09ZQ]-fgN/FQmL6mjVW/QItKRoJKMO0!IQ\9pfKRB,FMO0!I
+Q]-fgN/FNdI$]eLl.+Dcs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5Sbg")F`Pfa7
+`5T^-]Y28&`Oidr]=bhq`PoI%]uI^r\?2cTD/5JkJZ+fpW0ECBN/![XMPuJgQ]-g"KRB,>JX;%@
+Q\9pfKRB,>JX;%@Q\9pgN/![XMPuJgQ]-g#N/"9iL6mjVW/QItN/FQmL8^>uW/QJ0P`Vi.OJnV5
+\XJb]R['h?Q+<?JW1'!MP`Vi.OJnV5\<DiLR[(FPPc0h.\XJb]R[(FPPc1%9f>PB&s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjd`Pod7`Oidr['[3I['[3I['[3I
+['[3@XKAk:["sBgH!=6\>Zu>^@!PsUB3\VqD.ff3OJnD*\XJb]R['h9OL^gEW0ECBR[(FPPe!6I
+W1'!MP`WGEPc1%9\XJb]P`WGEPe!6IW0ECBR[(FPPigcVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,coC_JAp#+ooi8j(SgtpK/f$`(!bKS4iMi:Y)5ug?><CK2R76spB5ug?>
+<CK2R76spB5ug?><CK2e:J$=`E0u#qR!a%DI!(d/JXCh-LkLH"`PpcrkLnYIdaZjd`PoI%]sP/R
+Unsl_V50o`Unji_UnslBFDt5K6"j%c<CK2e:J"Y^88(dj<CK2e:J"PT6!-fOH!=78I!(d/JX;%@
+R!a%CKRoM<FdIc4R!a%DI!(d/JX;%@Q\9pVKRoJCJZ+N^Q\9pVN/Es\MPuJgQ]-gFbg#),kLnYI
+daZjd`PoI%]rS6:X/rFnSt)=BS=H1@S=Z7@St't%8l\;G<CK2R76spB5ug?><CK2R76spB5ug?>
+<CK2R76spB6$Z[6L4"?8I!(0kH^K2'R!a%CKRoM<FdRQ!R!a%CKRoM<FdIc4R!a%DI!(d/JX;%@
+R!a%CKRoJCJX;%@g"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7d%m-hs,\p&",G@Y**A70Ul@#AGrGAV,Q@p!qc@!?-hG@Y**A70Ul@!?-h
+G@Y*,>?#fW@!?-hG@Y**A70Ul@!?I'G@Y**A70Ul@!PsU=A28!:J"Y^88(dj=A27f9Lrhm8Q\YW
+BMV3"76t$L86&)E=A27c76spB6&0Q$bKS62s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s2;mq
+LNIKjD.e''@#&T3GAV,>A7110B6S3.LM^[ZD.e'7FGF^GLNIKjD.eWGE//OSLNIKjFDut^H\Z]^
+LNIKjFE!"WE//:CGB@q^D.eW@B8:SJG@Y)`9Lr8Z86APV=A27f9Lrhm8Q\YW=A28!:J"Y^8@5b2
+s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH4eCM.3Wcqu]LM^[JD/4oDB6S3.LM^[ZD.e'0CPQb>
+LNIKjFE!"WE//OSR!a%3FDut^H\d?.R!a%4KS5_?FdRQ!Q\9pVKRoJKMO8d6G@Y)o>ZuDW<+fH>
+H!=6\>Zu>^@!?-hB3\VaA70%T>+D1Sp[%)Cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV
+i8j(1UnF'-JX;%@L4"?7KRoJCJX;%@Q\9pWI!(d7MO0!IQ]-g#N/![XMPuJgQ]-g#N/"9qOI(o`
+W/QItN/FQmL7+6hQ]-g#N/!+0E-Gi#G@Y)o>Zu>^@&TNZs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7d%m-ilnkKD)oQ]-fgKRoJCJX;%@Q\9pVKRoJCJX;%@
+Q\9pWI!(0kH^K2'L4"?8I!(0kH^BD:Q\9pGKS5_?FdIc4Q\9pVKRp%SI"uf_BMV34>[#(b`RrDX
+`k8m]N/![XMO0!IQ]-fgKRp(\L6mjVQ]-g#N/![XMPuJgQ]-fgN/FQmL6mjVW/QJ0N/![XMPuJg
+W0EC3PEVr(L6mjVQ\9p&>Ztf:8SCmkR?Nj7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH4eCMgec-+>U`5T^=bg")F`Pfa7
+f>PA@`Pnd?OI(WOQ\9pVKRoJCJX;%@Q]-g"KRB,FMO09ZQ\9pVKRoJKMPl,TQ\9pVN/EsTJX;%@
+Q\9pVKRp%SI$]eLQ]-g#N/![XMO0!IQ\9pVKRoJCJX;%@Q\9pVKRp%SI$]M;Q\9pgP`YqFs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp`>hTO-fbKS5L`Pod7`Oidr]=bhq`PoI%]t:qj
+]=bhh]Y1\ZZtN6,BMV3TFE!S*MO09ZVhBGaN/EsTJX;%@Q]-fgKRoJCJX;%@Q\9pfKRB,FMO09Z
+W/QItN/FQmL6mjVW/QItN/FQmL8^>uW0EC3PEVr0OJnD*W0ECBP`Vi4Q)Kq/W1'!MP`Vi4Q+<?J
+W1'!MR['h?Q)L.:W1'!^RZsb>Q)L.:W1'!MR['h9OQP?Rs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s6T@Mkj7crjQG4OhTO-f`5T^-]Y1\Z['[3IX/rG1['[3I['[3I['[39V5.a/>%_)D
+BMV34>ZuDW<+fH>W/QJ0P`Vi.OJnD*W0ECBP`WGEPc0h.W1'!MP`WGEPc1%9W0ECBR['h9OJnV5
+\XJb]R['h9OL^gEW0ECBR[)glkPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp#tc2
+i8j(SgtpK/f$`(!bKS53XK>uCAQ;/b<CK2R76spB5ug?><CK2R76spB5ug?><CK2R76u-.@$l=a
+L4"?&I!_6.FbY9jR!a%DI!(d/JXM^ci8j(Sgtp5uc,@T?]=bha['ZX*Unji_Unsl_V50o`Uj$p&
+=A27c76tT_8QA2FBMV3"76tT_8QA2FBMV35:J#2(>*jnnR!a%DI!(d/JVJQ!Q\9pWI!(6uKU7@C
+R!a%CKRoJCJX;%@Q\9pVKRoJCJX;%@Q]-fgKRoJKMTa5gi8j(Sgtp5uc,@T?]=bha['ZX*Un"$H
+S=Z7@St)=BS=,S)B3\V?76spB5ug?><CK2R76spB5ug?><CK2R76spB5ug?><CK2s;G)^dE0u#q
+LNIL&I!(0kH\Z]^L4"?8I!(0kH^K2'R!a%2I!^TqH\QopR!a%4KS5_?FdIc4R!a%CN/HcQh#IES
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
+k1naHI!^'J@!?-hG@Y**A70Ul?tW_JG@Y*,>?#fW@!?-hG@Y*,>?#fW@!?-hG@Y**A70Ul@!?-h
+G@Y**A70Ul@!?-hG@Y**A70Ul?t`>-=A27f9Lr8Z86APV=A27c76spB6!-fO<CK2R76spB6!-fO
+<CK2R76spB6$IEm]=biWs8W-!s8W-!s8W-!s8W-!s5;u$W1&uqA7110B6S3.GAV,>A7110B6S3.
+G@Y**D/4?4CPQb>GAV,ND.e'0CPR"NLM^[ZFE!"WE//OSLNIKjFE!"WE//OSLNIKjFE!"WE-HDG
+LNIKZD/4?+?t`>-=A27f9Lrhm8Q\YW=A27f9Lr8Z86APV=A28m[']l5s8W-!s8W-!s8W-!s7H$\
+kj7crjQGI^kL.l2bKS4cI!^WcB6RloLM^[ZD.e'0CPQb>LM^[JD/4oKE//:CLNIKjD.eWGE/&ae
+LNIKiI!_6.FbY9jL4"?(KS5\FJX;%@Q\9pGKS5_?Fbb'XB3\VaA70%T>'FLbB3\VQ>ZtcF>%_)D
+H!=6\>ZtcF>*k2*`5T^qs8W-!s8W-!s8W-!s8W-!s7H$\m.9ni]XjGgMMQq=R!a%4KS5\FJVJQ!
+Q\9pEI!_35JX;%@Q\9pVKRoJCJX;=QQ]-fgN/FQmL6mjVQ]-g#N/![XMOBZlW/QItN/FQmL6mjV
+G@Y)o>Zu>^?tW_JG@Y+RpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,_m-j0)n)iE\daZjHP`V5jMO0!IQ\9pVKRoJCJX;=QQ\9pVKRoJKMO0!ILkLGKI!(6uKSFl$
+R!a%2I!_6.FdIc4Q\9pGKS5_?FdIc4L4">]:J"Mb<Of02bKS5Sbg")F`ON%MQ\9pgN/![PJZ+N^
+Q]-fgN/FQmL6mjVW/QJ!PEVr(L6mjVW/QItN/FQmL6mjVW/QJ!PEV>lMPuJgQ]-fgN/Es\MMH:m
+BMV3!<)mU-8\;XKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\o_/+=jQG4OhU9p)bKS5Sbg"eabJ_B=`5T^=bg")F`Pfa7\?2ctKRoJCJX;=Q
+Q\9pVKRoJCJX;=QQ\9pVKRp(\L6mREQ\9pVKRoJCJXCh-Q\9pVKRoM<FdIc4Q\9pVKRoJCJV\u4
+R!a%CKRoJCJXCh-LkLGKI!(d/JX;%@Q\9pVKRoJCJ_82is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA*q=n)iE\g"bH4eCMgec,@T?`5T^6`Pod7`Oidr`k8mp]Y28&`OidrS=Z6Q9Lrhm8Q\YW
+LNIL5KRB,FMO0!IW/QItN/FNdI$]M;R!a%CKRoJCJX;=QQ]-g#N/"9iL7+6hW/QJ!PEVr(L7+6h
+W/QJ!PEVr0OJnD*W1'!MR['h?Q)L.:W1'!MR['h?Q+<?JW1'!MR['h9OL^gEW1'!^RZsb>Q)L.:
+W1'!MR['h9OL^gEW1'!MR[*$jh#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#+oo
+g"bH-bg">Tc+CX%]=bha['[3I['[3I['[3@XKAk:['[3IL4">]:J#2(>%_)DB3\VQ>Zuo)E2]"_
+W0ECBP`Vi.OJnV5W1'!MP`Vi4Q)Kq/W0ECBP`Vi.OJnD*\XJb]P`Vi4Q)Kq/W1'!MP`Vi.OJnD*
+W0ECleCO["s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp$D;Ci8j(ZjQG4OhU9p)bKS53XK?5RDHKS'
+<CK2R76spB5ug?><CK2R76sC+4B4g9<CK2R76tT_8V_.qR!a%2I!_6.FbY9jL4"?&I!^TqH\Qop
+L4"?&I!`fN`S'&'daZjd`PoI%]sP/RUnsl_V50o`Unji_UnslBFDt5K6!-fO<CK2R76spB5ug?>
+<CK2e:J"PT6!-fOB3\W,KRoJCJVJQ!R!a%2I!_35JVJQ!R!a%2I!_6.Fbk^(R!a%4KS5\FJX;%@
+Q\9pVN/EsTJX;=QQ]-gFbg#),kLnYIdaZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7LR[%Mj>#e!W
+<CK2R76spB5ug?>HoaAi76spB5ug?><CK2R76spB6"aG+L4"?'FE!"WE//OSL4"?'FE!"WE/&ae
+LNIKiI!^WjE/&aeR!a%2I!_6.FbY9jQ\9pVKRoJCJX;=Qg"bHas8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkI@XoG@Y**A70%T>'X=O
+B3\VaA70[e<+BHMG@Y)o>Zu>^?t3_YG@Y**A70Ul@!?-hG@Y**A70Ul@!?-hG@Y**A70Ul@!?-h
+G@Y**A70%T>$+Hh<CK2R76spB5ug?><CK2R76t$L86&)E<CK2R76spB6!-fO779RE76spB6"j%c
+R?NiXbg#MGp#tc2['[2qFDuG7@!?I'G@Y**D/4?+@!?I'G@Y**A70UuCNjW2LM^[JD/4oDB6SH>
+LNIKjFDuGGFGFsWGB@q^FE!"WE/&aeLNIKZFEE:[E-HDGLNIKjD.e'7FGFsWG@Y)`9Lr8Z86APV
+=A28!:J"Y^88(dj=A28!:J"Y^8@uOJs8W-!s8W-!s8W-!s8W,kpA+@Sq<726k1nbFgtpK/f!qi^
+LM^[JD/4oDB6S3.LM^[JD/4oDB6S3.LM^[JD/4oKE-HDGLM^[ZFE!"WE/&aeLNIKiI!_6.FdRQ!
+LkLGKI!(d/JX;%@Q\9pVKRnr4KSODWB3\Vc>?#6?>'X=OB3\VaA70%T>'X=OB3\VQ>ZtcF>'FLb
+LkLGkXfB=Y`S'&'daZjd`Pnd7L5:M9L4"?8I!(0kH^BD:L4"?7KRoJCJX;%@LkLGKI!(6uKU7@C
+Q]-fgN/FQmL6mjVQ]-g#P`V5jMO09ZW/QItN/Es\MO09ZW/QIcI!^'J?tW_JG@Y)o>["MA[/^1+
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2i8j(Sgtnj'Uo96,
+Q]-fgN/EsTJX;=QQ\9pVKRoJKMO0!IQ\9pVKRoJCJV\u4R!a%2I!^TqH^BD:LkLGJKRoJCJX;%@
+LkLG9I!]L2>%g]'Q\9q<eCMgec-+>UbKS5Sbg!)TQ'[/TQ]-fgKRoJKMPuJgQ]-fgN/FQmL6mjV
+W0EC3PEV>lMPuc$R?Ni5N/!aaPF%5cW/QItN/Es\MO09ZQ\9pVKRn>aCM6L8=A27b<)r)9h#IES
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
+i8j(SgtpK/f#u:^`5T^=bg")F`Pfa7bKS5L`Pod7`Ku7/Q\9pWI!(d/JX;=QQ\9pVKRoJCJX;%@
+Q\9pVKRoJCJV\u4L4"?8I!(0kH\QopL4"?8I!(6uKU@.0LkLGKI!(0kH\QopL4"?&I!_6.FbY9j
+L4"?&I!_35JV\u4Q\9qis8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hV$]@
+daZjkbg")F`Pfa7]=bhh]Y1qi]t:qj`k8mp]Y0&IHWWs4=A27f9Lsq\E0lN@Q\9pgN/![XMO0!I
+Q\9pVKRoJCJX;%@Q]-g#N/![XMPuJgR?Ni5N/!aaPGjFpR?Ni5P`V;sPGj_-W0EC3PEVr0OJnV5
+W0ECBR['h?Q)L.:W1'!MR['h9OJnV5W1'!MR['h?Q)Kq/W1'!MP`Vi4Q)L.:W1'!MR['h?Q)Kq/
+W1'"0jQHRCs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkL.l2bKS5L`PoI%]sP/R
+['[3I['[3I['[3I['[3I['ZX*Uh<q9B3\VR:J#2(>%g]'B3\W=P`Vi.OJnD*W0ECBP`Vi4Q)L.:
+W1'!MP`Vi4Q)Kq/W0ECBR['h9OJnD*W0ECBR['h9OJnD*W0ECBP`Vi.OJnD*`k8nTpA+ags8W-!
+o_/+IoC_JAp#tc2i8j(ZjQG4OhU9p)['[3!Mi;:R>"(hJ=A27c76spB5ug?><CK2R76spB5ug?>
+<CK2R76spB6$Z[6L4"?&I!^TqH\QopLNIKiI!_6.FbY9jR!a%2I!_6.FbY9jUnsm?gtp5uc,@T?
+]=bha['ZX*Unji_Unsl_V50o`Uj$p&=A27f9Lr8Z86APV=A28!:J"PT5ug?><CK2e:J#2(>*s\[
+L4"?&I!_6.FbY9jL4"?8I!(0kH\d?.R!a%2I!^TqH^BD:LkLGJKRoJCJX;%@Q\9pVKRoJCJ]l9^
+i8j(LeCN'tf#5PH]=bha['ZX*Un"$HS=Z7@St)=BS=H1@B3\V04Zl_55t4""<CK2C4Zl_55ug?>
+<CK2R76spB5ug?><CK2s;G)[kH^K2'LNIKiI!^WjE//OSL4"?'FE!"WE/&aeLNIKjFDut^H\Qop
+Q\9pEI!_35JX;%@Q]-fgN/HcQh#IESs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7ckgtm6sFE_8'B3\VaA70%T>'FLbB3\VQ>Zu>^?tW_J
+G@Y**A70Ul@!?-hB3\VaA70%T>'X=O@q9.pA70Ul@!?-hGAV,>A70UuCNjW2G@Y**A70%T>$+Hh
+=A27c76t$L86&)E<CK2R76spB5t+11<CK2B6q(*E5ug?>779RE76s@179E5SGAV,MI!^WjE-Gi#
+GAV,>A70UuCNj;sLM^[JD/4?4CNjW2G@Y*:D.e'0CNjW2GAV,>D/4oDB6SH>LNIKjFE!"WE-HDG
+LNIKjFDut^H\QopLNIKiI!^WjE-HDGLNIKjFDuG7?s$)n=A27f9Lrhm8Q\YW<)ck2:J"Y^85rPg
+BMV4,[']l5s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkMYFadaZjkbftliH\Z]^LNIKjD.e'7FGF^G
+GAV,NFDuG@CPR"NGB@q^FE!"WE//OSLNIKiI!^TqH^K2'LkLG;KS5_?Fbk^(N/NX]KRo)?N0f3K
+Q\9pVKRo)?N/)LoG@Y)kA7]CY>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%_)D@q9/+D.eTNH^BD:
+L4"?(KS5_?Fbk^(L4"?(KS5_?Fbk^(Q\9pGKS5\FJV\u4Q\9pVKRoJCJX;=QQ]-g#N/![XMO09Z
+Q]-fgN/Es\MPuJgQ]-fiPEV>dJTkX4G@Y)o>ZtcF>).3=s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhRK\fQ\9pVN/FNdI$]eLQ]-fgKRoJKMO0!I
+Q]-fgKRoJKMO0!IQ\9pGKS5\FJVJQ!Q\9pGKS5\FJX;%@Q\9pGKS5_?Fa%A(=A280D/7>=c-+>U
+bKS5Sbg">Tc-+>U`5T]^KRoJCJX;=QQ\9pVN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09Z
+Q]-fgN/Es\MO09ZQ]-fgKRoJCJX;%@L4">\>Zt6'86APVB3\X?s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kLnYIdaZk#bfe2Rc,@T?
+bKS5L`Pod7`Pfa7`5T]kV5/inH^BD:LkLGJKRoJCJX;%@Q]-fgKRoJKMO0!IQ\9pEI!_35JVJQ!
+L4"?8I!(0kH\QopR!a%2I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!`lG])Vg1
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^`5T^6`PoI%]t:qj
+`5T^-]Y1qi]t:qjB3\VB9Lr8Z88(djL4"?7KRoJKMO09ZQ]-g#N/![XMO09ZQ]-fgN/EsTJX;=Q
+W/QItN/FQuOI(o`W0EC3PEVr0OI;;rW0ECBP`V;sPGj_-W1'!MP`Vi4Q)Kq/W1'!MP`Vi4Q)Kq/
+W1'!MR['h?Q)L.:W0ECBR['h?Q)L.:W1'!MR['h?Q)L.:W1'!MR['h?Q)L.:o_/+\s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(Sgtp5uc,@T?]=bhh]Y1\Z['[3IX/rG1['[3I[&^:1
+['[2pI!]L2>%_)DBMV34>ZtcF>).3=R?Ni&PEVr0OJnD*W1'!MR['h9OJnV5W0ECBR['h9OJnV5
+W0ECBR['h9OJnD*W1'!MP`Vi4Q'mi"W0EC1N/F$ePIR`pi8j(foC_JAp#tc2i8j(LeCM7E]pt[a
+H[C0C>[CE!5t+11<CK2U9Lr/P6!-fO<CK2U9Lr/P6!-fO<CK2R76t$L89nE=LNIKiI!^TqH\Qop
+L4"?'FDut^H\QopLNIKiI!^WjE/&aeLNIKiI!^[&KZhTadaZjd`PoI%]rS6:X/rG!V50o`Unji_
+UnslBFDt>U86&)E<CK2U9Lr/P6!-fO=A27f9Lr8Z86APVB3\W,KRnr4KU7@CL4"?7KRnl*H\d?.
+R!a%2I!^TqH^K2'LkLGJKRoJCJX;%@Q]-fgN/ERPN0f3KQ]-g?`PpcrkLnYIdaZjd`PoI%]sP/R
+Unsl_V50WQS=H1@S=Z7@St'Ii8Obj*7Qik676sC+4B4g9<CK2C4Zl1s4B4g9<CK2R76spB6"j%c
+L4"?&I!^TqH^AhiL4"?&I!^WjE//OSLNIKjFE!"WE/&aeLNIKiI!_6.Fbk^(Q\9pVKRoJCJX;=Q
+g"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+IoC_>6n)39i\?2cD>Zu>^?t3_YG@Y)o>Zu>^?t3_YG@Y)o>Zu>^?t3_YG@Y)kA7]sq?t3_Y
+G@Y)kA7]sq@!?-h@q9.pA7/nXATqZmC2@d3A7/nXATqZmG@Y**A70%T>$+Hh=A27S6q(*E5t+11
+<CK2R76spB5ug?><CK2R76t$L87u12G@Y*:FDuGGFGFsWGAV,>FEE:TB6S3.GAV,>D/4?+@!?I'
+LM^[JD/4?4CNjW2LM^[JD/4oKE-H/7GB@q^FDuGGFGFsWGB@q^FDuGGFGFsWH[C0rFDut^H\Z]^
+L4"?&I!^WjE-lq[GAV+t9Lrhm8Q8Yh=A28!:J"Mb<EMpcB3\VB9Lr,^<Q;\_s8W-!s8W-!s8W-!
+s8W-!s8V`bq<[_Gkj7ckgtp`>hU9p)['[2aD/4oKE-HDGLNIKjFDuGGFGF^GGB@q^FE!"WE//OS
+H[C0qI!^TqH\Z]^L4"?&I!^TqH^K2'LkLG;KS5_?FdIc4Q\9pVN/EsTJX;%@Q\9pVN/EsTJV\u4
+LNIKZD/4?+?tW_JG@Y)o>Zu>^@!?I'LNIKiI!_35JV\u4Q\9pEI!_35JV\u4L4"?&I!_6.FbY9j
+LkLG9I!^[&KU@.0LkLGJKRo)?N/3.?Q]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09Z
+LNIKJ>ZtcF>%_)DB3\WgeCO["s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-ilnkN:RT`k8mLN/Es\MO09ZQ\9pVN/EsTJX;=QQ\9pVN/EsTJX;%@LkLGJKRnr4KSY;7
+R!a%4KS5_?Fbk^(Q\9pGKS5\FJX;%@GAV+t9Lrhm8\;XKdaZjreCN'tf#u:^bKS5Sbg">Tc+'mU
+LkLGJKRoJCJX;%@Q]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/EsTJX;=Q
+LkLGJKRnr4KSOYg=A27c76t$L89]/ts8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQG4OhU9p)bKS5Sbg")F`Pfa7bKS5L`Pp$Ec,RE-
+Q]-fXKS5\FJX;%@Q]-fgN/EsTJW,MGQ]-fgKRnr4KU7@CLkLG9I!^[&KSFl$L4"?(KS5)-H\d?.
+R!a%2I!^TqH\Z]^LNIKjFE!"WE/&aeLNIKiI!^TqH^K2's8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,coC_>6n(HLQg"bH-bg">Tc,@T?`k8mp]Y1qi]t:qj]=bhQV5.*[5ug?>
+=A28!:J$n3MO0!IQ]-fgKRoJKMO09ZQ]-fgN/EsTJX;=QQ]-fgN/Es\MOBZlQ]-g#P`V5jMPuc$
+Q]-g#P`V;sPF7VuW0EC3PEVr0OIVo4W0EC6St)aDOJnV5W0ECBR['h?Q)Kq/W1'!MR['h?Q)L.:
+W1'!MR['h?Q)Kq/W1'!MR['h?Q)L.:W1'!MP`V];V#UJps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,coC_&&kLnYIdaZjkbg")F`Oidr['[3I['[3I['[3IX/rG1['[3I[%sOoB3\VB9Lrf$>#\I$
+B3\VQ>[!JQMPuc$R?Ni5R['h9OJnV5W0ECBR[';)PGj_-R?Ni5R[';)PGjq8R?Ni5R['D7S>_[6
+R?Ni5P`V;sPGj_-Q]-fgN/FR&Q(4G9LkLG*FED86DHKS'=A27f9Lr8Z86&)E=A27c76spB5t+11
+<CK2R76s@179)cB<CK2U9Lrf$>'FLbL4"?&I!^[&KU@.0L4"?'FE!"WE/&aeLNIKjFDut^H\Z]^
+LNIKiI!^WjE/&aeQ\9pjXKBq#f#5PH]=bha['ZX*Unji_Unsl_V50o`Uj$p&=A27f9Lr8Z86&)E
+=A27c76spB5ug?>=A27c76tQk>*jnnL4"?7KRnr4KSFl$Q\9pEI!^[&KU7@CL4"?(KS5\FJW,MG
+Q\9pKMi=!]MO0!IQ\9pKMi=!UJ]l9^i8j(Sgtp5uc,@T?]=bha['ZX*Un"$HS=Z7@St)44PFS57
+<)cje4Zl1s4@VIr7Qik'4Zl1s4B4g97Qik676sC+4B4g9<CK2e:J$:gH\QopLNIKiI!^TqH\Z]^
+L4"?&I!^TqH\QopLNIKiI!^TqH\QopLkLG9I!_35JX;%@Q]-fgKRr(BkPtS^s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQG4OhKsTt
+G@Y**A7/nXATqZmB3\VaA70%T>'FLb@q9.r>?#*CAS57OG@Y)o>ZtcF>'FLbB3\VaA7/nXATqZm
+@q9.pA7/nXATqZmG@Y**A7/nXATr!,B3\VaA70%T>%_)DB3\VR:J"Mb<G50"<)ck">[D&J>'FLb
+GAV,>FED_KFG>0iLNIKZFEE:[E//:CGAV,>D/4?4CNjW2GAV,NFDuG@CNjlBLM^[JD/4?4CNjW2
+GAV,>D/4?4CNjW2LNIKZFED_KFGFsWH[C0rFDuGGFG>0iL4"?&I!^TqH\QopL4"?&I!^'SCM6L8
+<)ck2:J"Mb<G50"<)ck2:J"Mb<G50"<)cl0]Y4@Fs8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,
+g"bH4eCN9rbEn0FGAV,NFDuGGFGFsWGB@q^FDuGGFGFsWGB@q]I!^TqH\QopL4"?(KS5)-H\d?.
+R!a%4KS5/7KU@.0LkLG?Mi=!UJW,MGQ\9pKMi<IFKT(hJQ\9pVKRnr4KU7@CLkLGJKRnr4KSY;7
+Q\9pEI!^TqH\d?.R!a%4KS5)-H^BD:LkLG;KS5\FJV\u4L4"?&I!^TqH\QopL4"?(KS5/7KSY;7
+LkLGJKRnr4KU7@CQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgKRmWDAS57OB3\VQ>["(pQ2gma
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n*'-,g"bH-bfuQ>PF%5c
+Q\9pVN/Es\MO0!IQ]-fgN/EsTJX;%@Q]-fgKRoJKMO0!IQ\9pGKS5\FJV\u4Q\9pGKS5\FJVJQ!
+LkLG9I!]O&8Q\YWS=Z8(gtp`>hU9p)daZk#bfe2Rc-+>UbKS5L`PndEQ&(*HLkLG;KS5\FJX;=Q
+Q\9pVN/Es\MO09ZQ]-fgN/Es\MO0!IQ]-fgKRoJKMMQq=Q]-fgKRnr4KU7@CLkLG9I!^'SCKO8$
+<CK2R77!H8SH&Whs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V<Ln)39ig"bH4eCN9rbJ_B=fZ_OW`Pod7`Pfa7`5T^6`PnXLUmHacQ]-fgN/Es\MO09Z
+Q]-fgN/Es\MO09ZQ]-fgKRnl*H^BD:L4"?7KRnl*H\QopL4"?&I!^TqH\QopL4">pH[UZkE-lq[
+GB@q^FDuGGFGFsWLNILFXfDF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
+kj7crjQFt@f$`(!bKS5L`PoI%]t:qj`5T^-]Y2=t\ql#m<CK2B6q(*E6"=G:L4"?(KS5\FJX;%@
+Q]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/FQuOI;;rR?Ni&PEVDuPF%5cW0EC3PEVr0OI;;r
+Q]-fiPEVN.S>_[6W0EC6St)aDOIVo4W1'!>PEVr6Q'mi"W1'!>PEVr6Q'mi"W1'!MR[';)PGjq8
+W1'!>PEVr6Q)L.:W0ECRXfDF$s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7crjQG4OhTO-f
+`5T^-]Y1\Z['[3IX/rG1['[3I['[3I['[3@XK@G>N+c!Y<)ck2:J"Y^87u12LNIL%N/Es\MOBZl
+R?Ni&PEVDuPF7VuR?Ni&PEVDuPF7VuW0EC3PEVr6Q'mi"W0EC6St)aJQ)Kq/R?Ni&PEVDuPF%5c
+R?Ni$N/Es\MM?M*G@Y)o>Zt6'86APV=A27f9Lr8Z86APV=A27f9Lr8Z86&)EB3\VQ>Zu>gCPR"N
+L4"?&I!^[&KSFl$L4"?&I!^TqH\QopL4"?'FDut^H\Z]^L4"?'FDut^H\Z]^L4"?&I!^[&KT(hJ
+bKS5L`PoI%]sP/RX/rG!V50o`Unji_Unsl2FECVY86&)E=A27f9Lr8Z86APV=A27c76t$L86APV
+B3\W,KRnr4KSFl$Q\9pVKRnr4KU7@CQ\9pGKS5\FJV\u4N/NX]KRoJKMO09ZQ]-fgN/EsTJW,MG
+LkLH"`PpcrkLnYIdaZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7LR[%Mj>"1Y;7Qik'4Zl1s4@VIr
+7Qik'4Zl1s4@VIr7Qik'4Zl1s4B,9[LNIKZFEE:[E-HDGLNIKjFDut^H\Z]^LNIKjFDut^H\Qop
+L4"?(KS5_?FbY9jLkLG;KS5/7KU7XTg"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(.['X=RATqZm@q9.pA7/nXAS57O
+B3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%;)SG@Y)o>Zu>^?tW_JG@Y)kA7]CY>%;)S
+G@Y)o>Zu>gCM-mUGAV,.>Zu>^?tsLqG@Y)rCi4H-@!?I'GAV,>D/4?;FGFsWGB@q^FDuSRI>3,r
+GB@qNFED_KFGF^GGB@qND/4oKE-HDGGB@q^FDuG@CNjW2GAV,>D/4?4CPR"NGAV,>FED_DCPR"N
+GB@qNFED_KFGFsWL4"?&I!^'ZFG>0iL4"?&I!^WjE/&aeGAV+p<)mU-8Q]5(BMV3!<)mU-8Q]5(
+BMV3!<)mU-8\;XKs8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o.jQGI^kLnYIdaZj[]Y0)BE-HDG
+LNIKZFEE:[E-HDGLNIKZFEE7bH\Z]^H[C0qI!^TqH\QopR!a%4KS5/7KSY;7R!a%4KS5/7KU7@C
+LkLGJKRo)?N0f3KLkLGJKRnr4KSY;7LkLGJKRnr4KSY;7LkLG;KS5)-H\d?.L4"?(KS5)-H\d?.
+Q\9pGKS5)-H\d?.L4"?&I!^TqH\QopL4"?&I!^TqH^BD:LkLGJKRnr4KSY;7Q\9pVN/Es\MO09Z
+Q]-fgN/Es\MO09ZQ]-fgN/Es\MK`oQB3\VQ>ZtcF>'kUEs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(ZjQFt@eu4gpQ]-fgKRoJCJX;=QQ]-fgN/Es\MO09Z
+Q\9pKMi=!UJW,MGQ\9pGKS5\FJV\u4Q\9pGKS5\FJV\u4LkLG9I!^TqHY6Se=A284H[Xi5kMYFa
+g"bH;gtpK/f$`(!bKS5Sbg">Tc-+>U`5T]^N/EFEKSY;7Q\9pKMi=!]MO09ZQ]-fgN/Es\MO09Z
+Q]-fgN/EFEKU7@CN/NX]KRoJKMMQq=LkLG;KS5/7KSFl$L4">\>Zt6'84>p8<CK3l`PqlWs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hV$]@
+daZjkbg")F`Pfa7fZ_OW`Pp$Ec,@T?`k8mLN/EFEKU7XTQ]-f\Mi=!]MO09ZQ]-fgN/ERPN/3.?
+LkLG9I!^TqH\QopL4"?&I!^TqH\Z]^H[C0qI!^WjE/&aeGB@q^FDuGGFGFsWGB@q^FDuGGFT;C@
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCMRW`Pfa7
+`5T^-]Y1qi]u7n/]=bgeA7\4n4B4g9<CK2tD/4r\KSFl$Q\9pGKS5\FJX;%@Q]-fgN/Es\MPuJg
+Q]-fgN/Es\MPuJgR?Ni$N/FQmL7+6hW0EC3PEVr0OI;;rR?Ni&PEVr0OI;;rW0EC3PEVN.S>_[6
+R?Ni5P`V;sPGjq8S=Z7LR['h?Q'mi"W1'!MR[';)PGjq8W1'!>PEVr6Q'mi"W1'!>PEVr6Q(4G9
+`5T^qs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#+oog"bH4eCMgec,@T?]=bha['[3I['[3I
+X/rG1['[3I['[3IX/rF<Ci3o^8Q]5(BMV3!<)mR9>)7ibR?Ni$N/Es\MOBZlW0EC3PEVDuPGj_-
+R?Ni&PEVDuPF7VuR?Ni5R[';)PGjq8R?Ni&PEVDuPGj_-Q]-fiPEV>lMOBZlQ]-fgN/Es\MO09Z
+LkLG9I!^'SCMI['@q9.pA70.gDKfr5GB@q]I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!^TqH\Qop
+L4"?'FDut^H\Z]^GB@q^FDuGGFG>0iGB@q]I!^TqH\d?.L4"?7KRpM;[)Br&]=bha['ZX*Unji_
+Unsl_V50o`Uj$p&=A27f9Lr8Z86APV8k_r]9Lr8Z86APV=A27c76tQk>)7ibL4"?7KRnr4KU7@C
+Q]-f\Mi<IFKU7@CLkLGJKRoJCJW,MGQ]-fgN/Es\MN!IPN/NXNKS5/7KZ(jKi8j(SgtpK/f#5PH
+]=bha['ZX*Un"$HS=Z7@St)=BS=H1@<)cje4Zl1s4B4g97Qik'4Zl1s4@VIr7Qik'4Zl1s4@VIr
+7QikI:J#bPFGFsWGB@q^FDuGGFE_hKLNIKZFEE7bH\QopH[C0qI!^TqH\QopLkLG9I!_35JV\u4
+LkLGJKRqh3hZ*WUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+Em-j0)n)39iN/NX=A7/nXAS57OB3\VQ>ZtWJAS57OB3\VQ>ZtcF>%;)S
+B3\VQ>ZtcF>%;)SG@Y)kA7]CY>%_)D@q9.\A7]CY>%_)DB3\VQ>ZtcF>%;)SB3\VMA7]7]ATqZm
+@q9.pA7/nXATqZmC2@d3A70UuCNjW2GAV,>FED_KFF/@_LNIK^H[UZkE-HDGLNIKZFED_KFE_hK
+GB@qND/4?4CNjlBGAV,>D/4?4CNjlBGAV,>D/4?;FE_hKGAV,>FED_DCNjW2LNIKZFED_KFGFsW
+L4"?&I!^TqH\QopL4">pH[U*TCM6L8<)cjs<)mU-8Q8Yh<)ck2:J"Yn?>*,+<)cl0]Y4@Fs8W-!
+s8W-!s8W-!s8W-!s8W-!s8VHWp%Rh9i8j(Sgtp`>hU9p)Unsl2D/4?;FE_hKLNIKZD/4?;FG>0i
+LNIK^H[UWrH\Z]^L4"?&I!^TqH\QopL4"?&I!^[&KSY;7LkLG;KS5\FJV\u4LkLG;KS5/7KSY;7
+LkLG;KS5/7KSY;7LkLG;KS5\FJVJQ!LkLG;KS5\FJVJQ!LkLG;KS5)-H\d?.L4"?(KS5)-H\Qop
+L4"?&I!^TqH\QopL4"?&I!^TqH\d?.R!a%4KS5/7KT(hJLkLGJN/ERPN0f3KQ]-fgN/EsTJX;=Q
+LNIKJ>ZtcF>%_)D@q907m-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+kj7d%m-j0)n']_:UnslRN/Es\MN!IPQ\9pVN/Es\MO0!IQ]-fgKRo)?N0fK\Q\9pGKS5\NMMQq=
+Q\9pGKS5\FJV\u4LkLGJKRnl*H\QopGAV+t9Lrf$>1q]fkj7d%m-ilnkN:RTg"bH4eCMgec.L7`
+bKS5Sbg">Tc*XjbQ\9pGKS5/7KU7XTQ]-fgN/Es\MO09ZQ]-fgN/Es\MO0!IN/NX]N/EFEKT(hJ
+Q\9pGKS5/7KU@.0LkLG9I!^TqHZsRRB3\VB9Lr/P5u^f`kj7d<s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5Sbg")F`Pfa7
+`5T^6`Pod7`MB?+Q\9pKMi=!]MO09ZN/NX]N/ERPN/W[RQ\9pGKS5)-H\QopL4"?&I!^TqHZsRR
+L4">pH[UZkE/&aeGB@q^FDuGGFE_hKGB@qNFEE:[E-HDGS=Z8Ns8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!kj7d%m-iW_hU9p)bKS5L`Poj0]#;S,`5T^6`Po3kZrKO\
+7Qik'4Zl_56&'c6L4"?(KS5/7KU7@CN/NX]KRoJKMO09ZQ]-fgN/Es\MOBZlQ]-fiPEV>lMOBZl
+R?Ni5R[';)PGjq8R?Ni&PEVr0OI;;rR?Ni&PEVDuPGjq8R?Ni5R[';)PFS57W1'!>PEVr6Q'mi"
+R?Ni5R[';)PGj_-R?Ni&PEVDuPGjq8R?Ni5R[';)PGjq8R?Ni&PEVr0OQc'"s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o:oC_&&kL.l2bKS5L`PoI%]sP/R['[3I['[3I['[3I['[3@XKB"7WgoZN
+B3\V><)lms<G50"<)ckAD/5JsMPuc$Q]-fiPEVDuPF7VuR?Ni&PEVDuPF7VuR?Ni&PEVDuPF7Vu
+R?Ni&PEVr0OI;;rR?Ni$N/F$ePF%5cQ]-fgN/Es\MO09ZN/NXRMi=!]MN!IPQ\9pGKS5\FJV\u4
+LkLGJKRnr4KSY;7L4"?(KS5)-H\QopL4"?&I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!^TqHZsRR
+GB@q]I!^TqH\QopL4"?&I!^[&KT(hJS=Z7h`PoI%]sP/RUnsl_V50o`Unji_Unsl2FECVY86APV
+8k_r]9Lr8Z86APV=A27S6q(3O86APVB3\W,KRnr4KU7@CLkLG;KS5/7KSY;7Q\9pGKS5/7KSY;7
+N/NX]N/Es\MN!IPQ]-fgN/Es\MMQq=LkLH"`PpcrkLnYIdaZjd`PoI%]sP/RUnsl_V50WQS=H1@
+S=Z7@St'Ii8Obj*7Qik'4Zl1s4@VIr7Qik'4Zl1s4@VIr7Qik'4Zl_55u^f`LNIKZFED_DCNjlB
+GB@q^FDuGGFE_hKGB@qRH[UZkE/&aeL4"?&I!^TqH\d?.L4"?(KS5/7KSY;7g"bHas8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+kj7crjQF_1c!t9qB3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtWJAS57OB3\VQ>ZtcF>%_)D
+B3\VMA7]sq?tW_JB3\VMA7]sq?tW_J@q9.pA70%T>'FLbB3\VTCi3`nATr!,G@Y)rCi4H6CMI['
+GAV,>D/4?;FE_hKLNIKZFED_KFGFsWGB@qNFED_KFE_hKLNIKZD/4?;FE_S;GB@qND/4?4CNjW2
+GB@qND/4?4CNjlBGAV,NFDuGGFE_S;GAV,>FED_DCNjlBGB@qNFEE7bHZsRRL4"?&I!^TqH\Qop
+GAV+p<)mU-8S;:3<)ck1>Ztf:8Q]5(=A27f>[D)>8\;XKs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,coC_>6n)39ig"bH4eCN9rbD:h)GB@qND/4?;FE_hKLNIKZFED_KFG>0iGB@q]I!^3eI>;o`
+L4"?&I!^TqH\QopL4"?(KS5)-H\d?.LkLG;KS5/7KSY;7L4"?(KS5)-H^BD:L4"?(KS5)-H\d?.
+LkLG;KS5)-H\d?.L4"?&I!^TqH\QopL4"?&I!^[&KSFl$L4"?(KS5/7KSFl$L4"?&I!^[&KSFl$
+LkLG;KS5)-H\d?.LkLGJKRoJKMMQq=Q]-f\Mi<UQN0fK\N/NXLI!]L2>%_)DB3\VQ>[#S*f)PdM
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bGoXf@_HMO09Z
+Q]-fgN/Es\MO09ZQ]-fgN/ERPN0fK\Q\9pKMi<UQN0f3KN/NX]N/ERPN0f3KN/NX]KRnr4KSFl$
+LkLG:FDt>U85rPg]=biLpA*q=n*'-,kj7crjQG4OhV$]@daZjreCMgec-+>UbKS5Sbfur[Ukj\W
+LkLG;KS5\NMN!IPQ]-fgN/Es\MO09ZN/NX]N/ERPN0f3KN/NXNKS5/7KSY;7LkLG;KS5)-H\d?.
+L4"?&I!^'ZFBD4-=A27c76tEoAcMf1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjreCMgec,@T?`5T^=bg")F`Pfa7`5T^-]Y0,SKT(hJ
+Q]-f\Mi=!]MN!IPQ]-fXKS5/7KSY;7LkLG9I!^TqH[C*fL4"?&I!^TqHZsRRH[C0bFEE:[E-HDG
+GB@q^FDuG@CNjlBGB@q^FE$I1n,NFfs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VHWp#tc2g"bH;gtp5uc,@T?`5T^6`Pp$Ec-+>US=Z6?4Zl1s4@VIrBMV3HH[UZkE/&ae
+LkLG;KS5/7KU7@CN/NX]N/Es\MO09ZR?Ni5P`V];UoUT!\?2d<['[3I[(Eua]=bhh]Y1\Z['[3I
+X/rG!V51&SOJnV5R?Ni)St)44PFS57R?Ni5R[';)PF7VuR?Ni5R[';)PF7VuR?Ni&PEVDuPGj_-
+R?Ni&PEVDuPF7VuR?Ni&PEVDuPF7VuR?Ni5R[*pQs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
+i8j(SgtpK/f#u:^`5T^-]Y1\Z['[3I['[3@XKAk:['[3IX/rG1['YXBKNLo==A27b<)mU-8Q]5(
+LkLGJN/F$ePF7VuR?Ni$N/F$ePF%5cR?Ni$N/F$ePF7VuR?Ni&PEVDuPF7VuQ]-fiPEVDuPF%5c
+Q]-fgN/ERPN0fK\N/NXRMi=!]MMQq=Q]-fXKS5;BN/3.?LkLG;KS5)-H\d?.L4"?&I!^[&KSY;7
+L4"?&I!^TqH\QopL4"?&I!^TqH\QopL4"?&I!^3eI>;o`H[C0rFDut^HZsRRL4"?&I!^TqH\d?.
+LkLGJKRo)?N3ot!]=bha['Zm8Xe_ehUnsl_V50o`Uj$p&=A27X9MJV_86&)E=A27f9Lr8Z86APV
+=A27f9Lrf$>)7ibLkLG9I!^[&KSY;7Q\9pGKS5\FJW,MGQ\9pKMi=!UJW,MGQ]-fgN/Es\MN!IP
+Q\9pKMi<IFKZ(jKi8j(Sgtp5uc,@T?]=bha['ZX*Un"$HS=Z7@St)aJQ(4G9<)cje4Zl1s4@VIr
+7Qik'4Zl1s4@VIr7Qik'4Zl_55t4""7QikI:J#bPFE_hKGB@qND/4?;FE_S;GB@qNFED_KFGFsW
+GB@qRH[UZkE/&aeL4"?&I!^TqH\QopLkLG;KS8%6hZ*WUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq;C>si8j'sV5.a/>%_)D
+B3\VB>[D&J>$,$9B3\VB>[D&J>%_)D@q9.`>ZtcF>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtWJAS57O
+@q9.`>ZtcF>%_)DB3\VMA7]7]AS57OG@Y)kA7]t%CL^mdGAV,>A70.gDKfr5GAV,>FED_KFGFsW
+GB@qRH[UWrHZsRRLNIKZFED_KFGFsWGB@qNFED_DCNjW2C2@d3D/4?4CNjlBGB@qND/4?;FE_hK
+GAV,>FED_KFE_S;GAV,>FED_KFGFsWGB@q]I!^TqH\QopL4"?&I!^'SCK+85B3\V><)m$o85rPg
+<)ck2:J"Mb<EMpc<)cl0]Y4@Fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG[\gtCK>
+daZjd`PmUSE-H/7GAV,>FEE:[E-HDGL4"?&I!^TqH\Z]^H[C0qI!^3eI>3,rH[C0qI!^TqH\d?.
+L4"?(KS5)-H\d?.L4"?&I!^[&KSY;7LkLG;KS5/7KSY;7Q\9pGKS5)-H\d?.L4"?(KS5)-H\Qop
+L4"?&I!^3eI>3,rL4"?&I!^TqH\QopL4"?(KS5/7KSFl$L4"?&I!^TqH\QopL4"?&I!^[&KSY;7
+LkLG?Mi=!UJV\u4Q]-fXKS5;BN-Af?=Bo0F>ZtcF>11pOs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp&`\sJA5Q]-fgN/Es\MO09ZN/NX]N/ERPN0fK\
+N/NXNKS5\NMMQq=Q]-fXKS5/7KT(hJQ\9pGKS5/7KSY;7LkLG;KS5)-HY6Se<)ckaN/IZ8s8W-!
+s8W,kpA*q=n*'-,i8j(SgtpK/f$`(!bKS5Sbg">Tc-+>U`5T]^N/EFEKU7@CLkLG?Mi=!]MOBZl
+N/NX]N/EFEKU7XTLkLG?Mi=!]MO0!ILkLGJKRnr4KSFl$LkLG9I!^TqH\QopL4">lD/36I86&)E
+779S!I!bnns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+kj7crjQG4OhU9p)bKS5Sbg")F`Pfa7bKS5L`Pod7`Pfa7S=Z7,KS5;BN1#lnQ]-fgN/EFEKU7XT
+LkLG;KS5)-H\QopL4"?(KS5/7KSFl$H[C0qI!^TqHZsRRGB@qNFED_KFE_S;GB@qND/4?;FIA>V
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYI
+daZjreCN'tf#u:^daZjreCKA%HU^.\7Qik'4Zm4bATr6<L4"?&I!^TqH\d?.LkLG;KS5\NMOBZl
+X/rG8]Y28&`QQKM`5T^6`Pod7`Oidr`5T^-]Y1\Z[(Eua['[3P]Y1\Z[(Eua['[3@XK@nSPF7Vu
+W0EC3PEVr6Q'mi"R?Ni&PEVDuPF7VuQ]-fgN/Es\MO09ZQ]-fgN/Es\MO09ZQ]-fgN/Es\MOBZl
+R?Ni&PEVDuPF7Vu`5T^qs8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp#+oodaZjkbg")F`Oidr
+]=bha['[3I[&^:1['[3I['Zm8XgGIBX/rFIFECVY86APV<)ck"9Lrf$>*k2*Q]-fgN/F$ePF7Vu
+R?Ni&PEVDuPF7VuR?Ni&PEV>lMOBZlQ]-fgN/F$ePF7VuQ]-f\Mi=!]MN!IPN/NXRMi=!]MN!IP
+N/NX]N/ERPN0fK\N/NX]KRnr4KSY;7LkLG;KS5)-H\QopL4"?(KS5)-H[C*fL4">pH[UWrH\Qop
+L4"?&I!^TqH\QopL4"?&I!^'ZFE_hKH[C0qI!^3eI>3,rL4"?&I!^[&KSY;7N/NXjV51`9]sP/R
+Unsl_V50o`Unji_Unsl2FECVY86APV=A27X9MJV_84lQM=A27X9MJV_86APVB3\VrKS5)-H\d?.
+Q\9pEI!^[&KT(hJN/NXRMi=!UJW,MGN/NX]N/Es\MN!IPQ]-f\Mi<UQN/3.?LkLH"`PpcrkLnYI
+daZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7@St&nV84Ga)7Qijk1c.Zb4@VIr7Qik'4Zl1s4@VIr
+2)I-Z4Zl1s4B,9[GB@qND/4?;FE_S;GAV,>FED_DCNjW2GAV,>FED_DCNjlBGAV,>FED_KFE_hK
+L4"?&I!^TqH\d?.g"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-j0)n(HLQLkLF\<)mR9>#\I$B3\VQ>Zt*+<G,Q?
+B3\VQ>ZtcF>$,$9=Bo0F>Zt*+<G,Q?=Bo0F>ZtcF>%_)DB3\VQ>ZtWJATqZm@q9.`>ZtWJATqZm
+@q9.pA70.gDI[3gG@Y)kA7]t%CL^mdGAV,1Ci4H6CNjW2GB@qNFED_KFG>0iGB@qNFEE7bHZsRR
+GB@qNFED_KFE_hKGAV,>FED_DCNjW2C2@d3D/4?;FE_hKLNIKZFEE:[E-HDGGAV,>FED_DCPR"N
+GB@q]I!^TqH[C*fL4"?&I!^3eI>3,rGAV+p<)m$o88(dj=Bo079Lr,^<E)pt<)ck"9Lr,^<P,oW
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(Sgtp`>hU9p)['[2aD/4?4CNjlB
+GB@q]I!^'ZFF/@_H[C0qI!^3eI>;o`H[C0bFEE7bHZsRRL4"?&I!^TqH\QopL4"?&I!^[&KSFl$
+L4"?&I!^[&KSFl$LkLG;KS5)-H\d?.L4"?&I!^3eI<TdTL4">pH[U*[FF/@_GB@q]I!^3eI=$<h
+L4">pH[UWrH\QopLkLG.H[U^'KR8&oLkLG;KS5/7KSFl$LkLG;KS5/7KSY;7N/NXRMi<IFKU7XT
+GAV+t>[D&J>&%kkdaZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+kj7d%m-j)lgrmpdR?NhnMi<UQN/W[RN/NX]N/ERPN0fK\N/NX]N/ERPN0fK\N/NXNKS5\NMMQq=
+Q\9pKMi<IFKSY;7LkLG;KS5)-H\d?.GAV+t9Lro7DY3Yus8W-!s8W-!s8W-!o_/+Em-j0)n)iE\
+g"bH4eCN'tf%A3ibKS5Sbg">Tc+CX%LkLG;KS5\NMN!IPQ]-f\Mi=!]MN!IPN/NXNKS5\FJV\u4
+LkLG;KS5/7KSFl$L4"?(KS5)-H\QopL4">lFEE7bHZsRRC2@cV6q'O477KF&S=Z8Ns8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq;C>sk1nb?eCN9rbKJ,S
+`5T^6`Pod7`Pfa7f>PA@`Po3k[$Q`/N/NXRMi<UQN/W[RQ]-f\Mi<IFKSY;7LkLG;KS5/7KSFl$
+LkLG;KS5)-H[C*fLNIKZFEE:[E-HDGGB@qNFED_KFE_S;GB@r[gtr)2s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2i8j(Sgtp`>hU9p)daZjreCN=.hV$]@
+<)cje4Zl1s4B4g9GAV,MI!^TqH\QopLkLG;KS5/7KW(?)]=bi1gtp`>hV$]@daZjreCMgec-+>U
+`5T^6`Pod7`Oidr]=bhh]Y1qi]t:qj['[3I['[HX]sP/R['[2pI!^[&KUJ$fR?Ni&PEVr6Q'mi"
+R?Ni&PEVDuPF%5cR?Ni$N/ERPN/W[RQ]-fiPEV>lMO09ZQ]-fgN/Es\MOBZlR?Ni&PEVDuPP"SE
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o.jQG4OhU9p)bKS5L`PoI%]sP/R['[3I['[3I['[3I
+X/rG1['[3I[&^:1C2@c[9MJV_84lQM=A27qA7^^XN0fK\Q]-fgN/Es\MOBZlR?Ni$N/F$ePF%5c
+Q]-fgN/F$ePF%5cN/NX]N/Es\MO09ZN/NXRMi=!UJW,MGLkLGJN/ERPN/W[RQ\9pKMi<IFKSY;7
+LkLG9I!^TqH[C*fL4"?&I!^3eI>3,rH[C0qI!^3eI>3,rL4">pH[UWrH[C*fL4">pH[UWrH\Qop
+L4"?&I!^[&KSY;7LkLG;KS5/7KSY;7LkLGJN/ERPN0fK\['[3I['ZX*Unji_Unsl_V50o`Uj$p&
+<)ck"9Lr8Z86APV8k_r]9Lr8Z86APV8k_r]9LrZ(AVc"mLkLG;KS5/7KSY;7Q\9pKMi=!UJW,MG
+N/NX]KRo)?N0fK\N/NX]N/ERPN/3.?Q\9pGKS5)-HcsXXi8j(SgtpK/f#5PH]=bha['ZX*Un"$H
+S=Z7@St)=BS=H1@<)cje4Zl1s4@VIr2)I-Z4Zl1s4>erP7Qik'4Zl1s4@VIr7Qik99LsALFE_hK
+GAV,>FED_KFE_S;GAV,>FED_DCNjlBGB@qND/4?;FE_hKGB@qNFEDkVI=$<hL4"?&I!aQ%hZ*WU
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq=OCVkj7crjQFt@eou4XB3\VQ>ZtcF>$,$9B3\VQ>ZtWJAS57O=Bo0F>ZtcF>#\I$
+B3\V><)mR9>#\I$B3\VMA7]CY>%;)S@q9.`>ZtWJARf7^B3\VQ>ZtWJARf7^G@Y)kA7]7]ATqZm
+@q9.\A7]7]ARf7^GAV,>FED_DCNjlBGB@qNFEDkVI>3,rH[C0bFED_KFGFsWGB@qNFED_KFE_S;
+GB@qNFED_KFE_S;GAV,>FED_KFE_hKGB@qND/4?;FE_hKGB@qNFEE7bHZsRRH[C0bFEE7bH[C*f
+L4">pH[U*TCK+85<)cjs<)m$o85rPg<)ck2:J"Mb<E)pt=A28t]Y4@Fs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+QpA*q=n)39ig"bH4eCN'tetf.<C2@d3D/4?;FE_hKGB@q^FDuGGFF/@_
+GB@qRH[U6fI>;o`H[C0qI!^3eI>3,rH[C0sKS4]!I>3,rL4"?&I!^TqH\QopL4"?&I!^[&KSFl$
+L4"?&I!^3eI=$<hGB@q^FDuGGFE_hKGB@qNFED_KFE_hKL4">lFEDkVI>3,rH[C0fH[UWrH[C*f
+L4">pH[UWrH\QopL4"?(KS5/7KSY;7LkLG;KS5/7KU7XTLkLG*D/36Y?>!MHLkLHFm-juSs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kMYFadaZj9PEUfUKU7XT
+Q]-fXKS5\NMN!IPQ\9pKMi=!]MMQq=N/NX]N/EFEKT(hJLkLG?Mi<IFKSY;7LkLG;KS5)-H\Qop
+LkLG*D/36I86APVg"bHas8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhV$]@daZjkbg">Tc-+>U
+`5T^=bg!Z"Wec=]N/NXNKS5;BN0fK\LkLG?Mi=!UJW,MGLkLG;KS5/7KSY;7L4"?(KS5)-H\Qop
+L4"?&I!^'ZFF/@_GB@q^FDuGGFD"i^7Qik'4ZkSY1t'n)s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZk#bfdrD`RrDX`5T^6`Pp$Ec,@T?
+`5T]`PEV>lMO09ZN/NX]N/ERPN/W[RLkLG;KS5/7KR8&oLkLG.H[UWrH\d?.LkLG9I!^3eI>3,r
+H[C0bFED_KFGFsWGB@qNFEEk.MZ<_Vs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH;gtp`>hVdJXi8j(5]Y.<65t+11<CK2U9LsMWI=$<h
+H[C0qI!^[&KW(?)bKS5pm-j<4p#tc2kj7crjQGI^kLnYIdaZjreCN'tf#5PH`5T^6`PoI%]uI^r
+['[3P]Y1qi]t:qj['[3P]Y1\Z[&^:1B3\VTCi52iN1#lnR?Ni&PEVDuPF7VuR?Ni&PEUr`N0fK\
+Q]-fgN/ERPN0fK\N/NX_PEV>lMN!IPR?Ni&PEVDuPF7VuR?NiH]Y4@Fs8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<[_Gi8j(SgtpK/f#5PH]=bhh]Y1\Z['[3I['[3I['[3I['[3IX/rG1['Zm8X`nl/
+<CK2B6q'^A9it([GAV,SMi<UQN/W[RQ]-fgN/Es\MN!IPQ]-f\Mi='fPDkEYQ]-f\Mi<UQN0fK\
+N/NXRMi<UQN/W[RN/NX]N/EFEKT(hJLkLG;KS5;BN/3.?LkLG;KS5)-H\QopH[C0bFEDkVI=$<h
+L4">pH[UWrH[C*fL4"?&I!^3eI>3,rH[C0qI!^3eI>3,rLkLG.H[U^'KSFl$L4"?(KS5/7KT(hJ
+Q]-fXKS5;BN/W[RN/NXNKS6D-XgGIBUnsl_V50o`Unji_Unsl2FECVY86APV8k_r]9Lr,^<EMpc
+8k_r]9Lr8Z86APVB3\VrKS5/7KSY;7LkLG;KS5/7KT(hJN/NX]KRo)?N/W[RQ]-f\Mi=!]MN!IP
+N/NXRMi<IFKSY;7H[C1Z`PpcrkLnYIdaZjd`PoI%]sP/RX/rFnSt)aJQ(4G9S=Z7LR[$iO<CT,6
+7Qik'4Zl1s4@VIr7Qik'4Zl1s4>erP7Qik'4Zl1s4BP9JGB@qNFED_KFE_hKGAV,>D/4?;FE_hK
+GB@qNFED_KFE_hKGB@qNFED_KFE_hKGB@qRH[UWrH[C*fg"bHas8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oo
+i8j(Ebft?RFD"i^@q9.`>ZtWJARf7^B3\VMA7]CY>%_)D<)ck1>Zt*+<G,Q?<)ck1>ZtcF>$,$9
+B3\VMA7]CY>%;)S@q9.pA7/nXARf7^B3\VMA7]7]ARf7^@q9.\A7]CY>%;)SG@Y)kA7]t%CMI['
+GAV,>FED_KFG>0iL4">pH[U*[FG>0iH[C0fH[U*[FGFsWGB@qNFED_KFE_hKGB@qNFED_KFE_hK
+LNIKZFED_KFE_hKGAV,NFDuGGFE_hKGB@qNFED_KFE_hKGB@qNFEDkVI<TdTGAV+t9Lr,^<G50"
+<)cjs<)m$o85rPg=A27f9Lr,^<P,oWs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+m.9o6m-ilnkLnYIg"bH4eCLFlUj$ZkC2@d3D/4?;FE_hKGB@qNFED_KFG>0iGB@qRH[U*[FE_hK
+H[C0fH[UWrH[C*fL4">pH[U6fI>EQ0H[C0qI!^3eI>3,rL4">pH[U6fI<TODGB@qND/4?;FE_hK
+H[C0bFEE:[E-HDGL4">lFEDkVI<TdTLNIK^H[UWrH[C*fL4">pH[U6fI>3,rH[C0fH[U6fI>3,r
+L4"?&I!^[&KSY;7N/NXNKS4PdCK+85B3\W9V54.ks8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(LeCLFlUl:4jQ]-fXKS5;BN/W[RN/NXNKS5;BN/W[R
+N/NXRMi<IFKU7XTN/NX]N/ERPN0fK\LkLG;KS5)-H\QopL4"?&I!^3eI99`\<CK3SXKDO&s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f$`(!fZ_O^bg">Tc-+>U`5T]`PEV>lMO09Z
+N/NX]N/ERPN/3.?LkLG;KS5/7KSY;7L4">pH[UWrH[C*fH[C0qI!^3eI<TdTL4">lFED_KFE_hK
+GB@qND/2R.75ZnY7Qik&6q..Us8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726i8j(SgtpK/f#u:^bKS5Sbg")F`Pfa7`5T^6`Pod7`ON%MN/NXRMi<UQN0fK\
+N/NXRMi<IFKSY;7LkLG9I!^[&KSY;7LkLG;KS5/7KSY;7LkLG;KS5)-H\QopL4">pH[UWrH[C*f
+daZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
+m.9o6m-ilnkNM:$i8j(bm-j<4ophVD7Qik676sC+4C_o5L4"?&I!^TqH^U(]bKS6'pA+ags7H$\
+o_/+IoC_JAp#tc2kj7crjQG4OhV$]@daZjkbg">Tc,@T?`5T^-]Y1qi]t:qj]=bhh]Y1qi]sP/R
+]=bhh]Y0_sP>kL]B3\VeH[V<GPF7VuR?Ni&PEVDuPF7VuQ]-fiPEUr`N/W[RN/NX_PEUr`N1#ln
+R?Ni&PEUr`N1#lnR?Ni&PEVDuPF7Vus8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQ
+daZjkbg")F`Oidr]=bha['[3I[&^:1['[3I['Zm8XgGIBX/rG5Xf@21KM"p4<CK2B6q(3O89]/t
+LkLG;KS5;BN/W[RN/NX]N/ERPN/W[RN/NXRMi<UQN/W[RN/NXRMi<UQN/3.?LkLG;KS5;BN/W[R
+N/NXNKS5/7KSY;7LkLG;KS5)-H[C*fH[C0bFED_KFE_hKL4">lFEDkVI>3,rH[C0fH[UWrH[C*f
+L4">pH[UWrH[C*fLkLG;KS5/7KSY;7LkLG;KS5/7KSY;7N/NXNKS5;BN/W[RQ]-f\Mi<UQN1#ln
+['[3I['Zm8Xe_ehUnsl_V50o`Uj$p&8k_r]9LqcL9it([8k_r]9Lr8Z84lQM=A27f9LrZ(AXA@5
+LkLG?Mi<IFKU7XTLkLG?Mi=!]MN!IPN/NX]N/ERPN1#lnN/NXRMi=!UJW,MGL4"?(KS4]!IDj+D
+i8j(SgtpK/f#5PH]=bha['ZX*Unji_S=Z7@St)=BS=H1@=Bo0$6q'O477KF&7Qik'4Zl1s4@VIr
+7Qik'4Zl1s4@VIr7Qik99LsALFF/@_GB@qRH[U6fI<TdTGB@qNFED_KFE_hKGB@qNFED_KFE_hK
+L4">pH[UWrH\QopL4"?(KS8%6hZ*WUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kMYFabKS4cI!]@6ARf7^
+B3\VMA7]7]ARf7^B3\VQ>ZtcF>$,$9B3\VB>[D&J>$,$9B3\VQ>ZtWJAS57O@q9.`>ZtcF>%;)S
+B3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%_)DB3\VQ>ZtcF>%;)S@q9.cCi4H6CNjW2GB@qRH[UWrHZsRR
+L4">lFED_KFE_hKGB@qNFED_DCNjlBGAV,>FED_KFE_S;GB@qNFED_KFE_hKGAV,>FED_KFE_hK
+GB@q^FDuGGFE_hKGB@qND/4?4CNjlBGB@qNFED_DCK+85=A27b<)m$o86APV=A27b<)m$o85rPg
+=A28m[']l5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=j7=kj7crjQG4OhV$]@
+daZjT['Y%!FD>W0GAV,>FED_DCNjlBGAV,>FED_KFF/@_GB@qNFED_KFE_hKH[C0bFEDkVI=$<h
+H[C0fH[U6fI=$<hH[C0fH[U6fI<TdTGB@qNFED_KFE_S;GB@qNFED_DCNjlBGB@qNFED_KFE_hK
+GB@qRH[U*[FE_hKGB@qRH[U6fI=$<hH[C0fH[U6fI>3,rL4">pH[U6fI>EQ0LkLG;KS5/7KO\P(
+<)ckPI!af4kPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+kj7crjQG4OhRK\fLkLG?Mi<IFKT(hJQ]-fXKS5\NMMQq=N/NXRMi<IFKU7XTN/NXNKS5;BN/W[R
+LkLG?Mi<IFKSY;7H[C0fH[U6fI=$<hB3\V04Zmq1FT;C@s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-j0)n)iE\g"bH4eCN'tf#u:^bKS5Sbg">Tc+CX%R?NhnMi=!]MN!IPN/NXNKS5;BN.u_,
+LkLG9I!^[&KR8&oGB@qNFEDkVI=$<hL4">pH[U*[FE_hKGB@qNFED86DKfr5B3\V04ZkSY1c7*H
+@q90Ns8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39i
+g"bH4eCMgec,@T?`5T^=bg")F`Pfa7`5T^6`Pn7/PDkEYN/NXRMi<UQN/W[RN/NXLI!^[&KSY;7
+H[C0sKS5/7KT(hJLkLG;KS5/7KSY;7LkLG;KS4]!I=$<hL4"?(KS9C*s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVkj7d%m-j<4p%7tR
+o_/*NSt&5;77BU5779RgD/4KFI>EQ0]=biWs8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2
+i8j(Sgtp`>hV$]@bKS5Sbg")F`Pfa7]=bhs]XkJW[(Eua['[3P]Y1\Z[(Eua['[2aFECJ]<E)pt
+H[C1/PEUr`N1#lnR?NhnMi='fPDkEYN/NXRMi<UQN/W[RN/NX_PEUr`N1#lnR?Ni&PEVDuPDkEY
+R?Ni&PEXGEf)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hU9p)daZjd`PoI%]t:qj
+['[3I['[3I[&^:1['[3@XKAk:[&^:1X/rFkPESsF<D#qZ779R:9MK_QFGPU'N/NXRMi<UQN/3.?
+N/NXRMi=!]MN!IPN/NXRMi<UQN/W[RLkLG?Mi<IFKSY;7LkLG;KS5/7KSY;7LkLG;KS5/7KR8&o
+L4">pH[U6fI<TdTGB@qNFED_KFF/@_H[C0fH[UWrH\QopH[C0fH[U6fI>3,rH[C0qI!^[&KSY;7
+LkLG;KS5;BN/3.?N/NXNKS5;BN/W[RN/NXRMi<UQN/3.?S=Z7h`PoI%]sP/RUnsl_V50o`Unji_
+Unsl2FEC,K9it([8k_rO9MJV_84lQM8k_r]9LqcL9it([@q9/,KS5;BN/3.?LkLG;KS5;BN/3.?
+N/NXRMi<UQN/W[RQ]-f\Mi=!]MN!IPLkLG;KS5)-H[C*fH[C1Z`PpcrkLnYIdaZjd`PoI%]sP/R
+X/rFnSt)=BS=H1@S=Z7@St'Fu>"(hJ=A27T4Zl>19gqH=<CK2C4Zl_55t4""7Qik'4Zl/$79!5d
+GB@qRH[UZkE-lq[GB@qRH[U6fI=$<hH[C0bFED_KFE_hKGB@qNFEE7bHZsRRH[C0fH[U^'KR8&o
+g"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7d%m-ilnkL.l2Q]-f3A7]7]ATqZm@q9.\A7]7]ARf7^
+@q9.`>ZtcF>%_)DB3\VB>[CoNAS57O@q9.`>ZtWJAS57O@q9.`>Zt67?>!MH=Bo07>[D&J>#\I$
+=Bo03<)m%*?<CH=B3\VQ>ZtWJATqZmC2@d&Ci4H6CNjlBGB@qNFED_KFE_hKGB@qND/4?4CNjlB
+GAV,>FED_DCL^mdGAV,>FED_DCNjlBGB@qNFED_KFE_hKGB@qNFED_KFE_hKGB@qND/4?4CNjW2
+GB@qND/4KFI<TdTC2@ci9Lr,^<EMpc=A27b<)m$o84lQM=A27X9MJ,Q9tS'Os8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(`gt^T<hU9p)`5T]OKS3iGATr!,
+GAV,>D/4?4CNjlBGAV,>FED_DCNjlBGB@qNFED_KFE_hKGB@qNFED_KFGFsWGB@qND/4?;FE_S;
+GB@qNFED_KFE_S;GB@qND/4?;FE_S;GB@qND/4?4CNjlBGB@qNFED_DCNjlBGB@qRH[U*[FG>0i
+GB@qNFEE7bH\QopLkLG.H[U^'KR8&oLkLG.H[U^'KQhN[B3\VMA7`]u`W,u<s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkN:RT]=bh9Mi<IFKT(hJ
+LkLG?Mi<IFKT(hJLkLG?Mi<IFKSY;7N/NXNKS5;BN/W[RLkLG?Mi<UQN/3.?LkLG.H[U6fI<TOD
+GB@q:A7\4n4B,9[o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7d%m-iW_hV$]@
+daZk#bfe2Rc-+>UbKS5Sbg!N%[#Bp%N/NXRMi<UQN/3.?LkLG;KS4]!I=$<hH[C0fH[U*[FE_hK
+H[C0bFEDkVI<TdTGB@qND/4?4CNjW2C2@d&Ci4!(DJ*3X2)I-I1c1PXMZ<_Vs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5Sbg")F`Pfa7
+`5T^=bg")F`Pfa7X/rFZKS5/7KSY;7N/NXNKS5;BN/3.?LkLG;KS5/7KSY;7LkLG;KS5;BN/W[R
+N/NXRMi<IFKSY;7LkLG.H[UWrHd^Eps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+@Sq=OCVs8W-!s8W-!s8W-!UnskZ9MJ,Q9m_58
+UnsmZpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(SgtpK/f$`(!
+bKS5L`Pod7`Oidr]=bhh]Y1qi]sP/R['[3P]Y1\Z[&BFY<)ck2:J"Yn?AO8fN/NX_PEVDuPF7Vu
+N/NX_PEUr`N0fK\N/NXRMi='fPDkEYR?Ni&PEVDuPF7VuR?Ni&PEUr`N1#lnX/rH's8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(SgtpK/f#u:^`5T^-]Y1qi]sP/R['[3I['[3I[(*6<
+X/rG1['[3I['[3IUnsl2FECVY84>p8=A28#Ci5&^KSY;7LkLG;KS5/7KSY;7LkLG;KS5/7KSY;7
+LkLG;KS5/7KSY;7LkLG;KS5/7KSY;7L4"?&I!^TqH[C*fL4">pH[U6fI<TdTGB@qNFED_DCNjW2
+GB@qNFEE7bH[C*fL4">pH[UWrH[C*fL4">pH[U^'KSY;7LkLG;KS5;BN/3.?N/NXRMi<UQN/W[R
+LkLG;KS5;BN/3.?Q]-g&XKB[ic,@T?]=bha['ZX*Unji_Unsl_V50o`Uj$Zk779R:9MIrD79E5S
+8k_r]9LqcL9it([8k_rO9MK/)>)7ibLkLG;KS5/7KSY;7LkLG;KS5/7KSY;7LkLG;KS5;BN/W[R
+LkLG;KS5/7KR8&oH[C0fH[U*[FMu/;i8j(SgtpK/f#5PH]=bha['ZX*Unji_S=Z7@St)44PGG%N
+<)cjd6q'O477BU5<CK2R76s@177BU5779R:9MJMU5t4""779RH>[E/4H[C*fH[C0fH[U6fI=$<h
+GB@q]I!^TqH\QopLkLG.H[UWrH[C*fH[C0fH[UWrH[C*fH[C0qI!aQ%hZ*WUs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726i8j(Sgtp`>hQ*`[GAV,*A7]sq?tsLqG@Y)rCi3lj>%;)S=Bo0BA7]CY>%;)S
+B3\VQ>Zt67?>!MHB3\VQ>Zt67?>!MH=Bo0F>Zt*+<E)pt<)cjs<)mR9>#\I$<)cjs<)m%*?=RMW
+@q9.\A7]7]ARf7^C2@d&Ci4H=FE_S;GAV,>FED_DCNjW2C2@d3D/3m&DKfr5=Bo03<)n-ZCNjlB
+GAV,>FEDkVI<TdTL4">lFED_KFE_hKC2@d3D/3m&DJF!*C2@d&Ci4H6CNjlBGB@qNFED86DHKS'
+=A27f9LqcL9hJ)R8k_rO9MJ,Q9hJ)R779SO[']l5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+Em-j0)n)39ii8j(SgtpK/f$`(!Unsl2D/3m&DJF!*C2@d3D/4?4CNjlB
+GB@qNFED_KFE_S;GB@qND/4?;FE_S;H[C0bFED_DCO:DVGB@qNFED_KFE_S;GB@qND/4?;FE_hK
+GB@qND/3m&DKg2EC2@d3D/4?4CNjlBGB@qNFED_KFE_hKGB@qNFEDkVI=$<hH[C0fH[U6fI>EQ0
+H[C0qI!^3eI<TdT@q9.cCi6Ve[/^1+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA*q=n)39ii8j(>`PmdoN/3.?LkLG;KS5/7KSY;7LkLG;KS5;BN/3.?
+LkLG;KS5/7KT(hJLkLG?Mi<IFKSY;7LkLG;KS4]!I=$<hGB@qNFED_DCJ%8p779S_`PqlWs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726k1nbFgtpK/f$`(!bKS5Sbg">Tc-+>U
+`5T]cSt(atN/W[RN/NXNKS5)-H\d?.H[C0qI!^TqHZsRRH[C0bFED_KFE_hKGB@qNFED_KFE_hK
+GAV,1Ci4H6CL^md@q9.\A7\_><EMpcs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH4eCN9rbKJ,SbKS5L`Pod7`Pfa7`5T^6`PmRZH[C*f
+LkLG;KS5/7KSY;7N/NXNKS5/7KSY;7N/NXNKS5/7KSY;7LkLG?Mi<UQN/W[RN/NXRMi<IFKR8&o
+N/NYps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s2;mqGAV-Kgtr)2s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_&&kMYFag"bH4eCN'tf#5PH`5T^-]Y2=t]!SiO
+]=bha['[HX]sP/R]=bha['XRaDH'S8<)ck-A7^^XN1#lnN/NX_PEVDuPF7VuN/NX_PEUr`N1#ln
+N/NX_PEVDuPDkEYN/NXRMi='fPDkEYN/NXRMi<UQN;rqXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+(Hp#+oog"bH4eCMgec,@T?`5T^-]Y1qi]sP/R['[3@XKAk:[&^:1['[3@XKAk:[&^:1
+S=Z6`>ZsQa77BU5@q9.tH[U6fI>EQ0H[C0sKS5/7KSY;7LkLG;KS4]!I>EQ0LkLG;KS5/7KSY;7
+LkLG.H[U^'KR8&oH[C0fH[U6fI=$<hGB@qRH[U*[FE_hKGAV,>D/4?;FF/@_H[C0qI!^3eI>3,r
+H[C0qI!^3eI>EQ0LkLG;KS5/7KSY;7N/NXRMi<UQN/W[RN/NXNKS5;BN/W[RN/NX_PEWr(`S'&'
+bKS5L`PoI%]rS6:X/rG!V50o`Unji_Unsl2FEBr>77BU5779RE76s@177BU5779R:9MJV_84lQM
+@q9/,KS5)-H\d?.LkLG;KS5/7KR8&oLkLG;KS5/7KSY;7LkLG;KS5/7KSY;7H[C0fH[U6fI<TdT
+GB@rF`PpcrkLnYIdaZjkbg!c4]sP/RX/rFnSt)=BS=H1@S=Z7@St'Fu>"(hJ<CK2B6q'R.4@MY,
+779R56q(*E5t+11779R:9MIrD7;#k/H[C0fH[UWrH[C*fH[C0fH[UWrH[C*fLkLG.H[UWrH[C*f
+L4">pH[U6fI=$<hH[C0qI!^3eI=$<hdaZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+(Hp#tc2
+i8j(Sgtoug`JB2#@q9.\A7]7]ARf7^C2@d#>ZtWJARf7^=Bo0F>Zt67?<CH==Bo07>[CB/<ENL4
+=Bo03<)lms<E)pt<)cjs<)lms<E)pt<)cjs<)lms<E)ptB3\VB>[D&J>%;)SGAV,*A7]sq?tsLq
+C2@d&Ci3`nASQ%!GAV,1Ci4!(DJF!*C2@ce<)l@T79!5dGAV,1Ci4!(DKg2EGB@qNFED_DCNjW2
+GAV,1Ci4!(DI[3gC2@d#>ZtlYDJF!*C2@d3D/4?4CNjW2@q9.C9MJ,Q9hJ)R8k_rZ76sO>9iXVJ
+<CK2R76sO>9sh:7s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+Em-ilnkMYFag"bH;gtpK/f#5PHN/NX0Ci4!(DJF!*GAV,1Ci4H6CNjW2GB@qNFED_DCNjW2
+GAV,>FED_KFE_hKGB@qNFED_DCNjW2GB@qND/4?;FD>W0GB@qND/4?;FD>W0GB@qND/3m&DKg2E
+C2@d3FED_DCNjlBGAV,>FED_KFF/@_GB@qRH[U6fI=$<hLkLG.H[U6fI=$<hC2@d3FEFms[/^1+
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+m.9o.jQFt@esV_cLkLG.H[U^'KSY;7LkLG;KS5/7KSY;7H[C0sKS4]!I>EQ0H[C0sKS5/7KSY;7
+LkLG;KS5/7KR8&oLkLG*FED_KFD>W0<)cjt76uljN;rqXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQg"bH4eCN'tf%A3ibKS5Sbg">Tc,@T?Q]-fXKS5/7KR8&o
+H[C0fH[U6fI=$<hH[C0fH[U*[FE_hKH[C0bFEE7bH[C*fGB@qNFED86DKg2EC2@d&Ci3`nATqZm
+N/NYYm-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+m.9o6m-j)lgtCK>bKS5Sbg")F`Pfa7bKS5L`Pod7`O*"Z=Bo0eI!^[&KSY;7LkLG;KS5;BN/3.?
+LkLG;KS5/7KSY;7LkLG;KS5;BN/W[RN/NXRMi<UQN/W[RLkLG;KS7:_`W,u<s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\o_/+Em-ilnkLnYIdaZjkbg">Tc,@T?]=bhh]Y1qi]sP/R]=bha['[3I[(Eua
+Q]-f(9Lr,^<E)ptGB@qcMi='fPDkEYN/NX_PEUr`N/W[RN/NXRMi<UQN/W[RN/NXRMi<UQN/W[R
+N/NXRMi<UQN/W[RN/NYQjQHRCs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkLnYI
+daZjkbg")F`Oidr]=bhh]Y1\Z['[3I['[3@XKAk:[&^:1['[3@XKAP)XfJP*N/NWo<)l@T79!5d
+H[C0fH[U^'KSY;7LkLG;KS4]!I=$<hLkLG.H[U^'KR8&oLkLG.H[U6fI>EQ0H[C0fH[U6fI=$<h
+GB@qRH[U*[FE_hKGB@qND/4?;FD>W0GB@qRH[U6fI=$<hH[C0sKS4]!I>EQ0LkLG;KS5/7KT(hJ
+LkLG;KS5;BN0fK\N/NXRMi<UQN/W[RN/NXNKS6.tUtOP[i8j(LeCN'tf#5PH]=bha['ZX*Unji_
+Unsl_V50o`Uj$Zk4$5Yq4Zkeg4[qRs779RE76spB5t4""779R56q(`n>'kUELkLG.H[U6fI=$<h
+H[C0sKS4]!I>EQ0LkLG.H[U6fI=$<hH[C0fH[U6fI=$<hH[C0bFED_KFM#3!i8j(SgtpK/f#5PH
+]=bha['Zm8XdkuQS=Z7@St)=BS=H1@=Bo0$6q'^A9gqH=<CK2B6q'O477BU5779R64Zl/$79)cB
+779RH>[Dc(I=$<hH[C0fH[UWrH[C*fH[C0sKS4]!I=$<hH[C0fH[U6fI=$<hH[C0bFEDkVI=$<h
+H[C0fH[XT&hZ*WUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+Em-j0)n)39ig"bH;gto*5X`nl/
+@q9.\A7]CY>%;)S@q9.Q>[D&J>$,$9<)cjs<)lms<E)pt<)cjs<)lms<EMpc<)ck"9Lr,^<EMpc
+<)ck"9Lr,^<E)pt=A27b<)lms<G,Q?@q9.\A7]7]ARf7^@q9.\A7]7]ARf7^@q9.cCi4!(DKfr5
+C2@d#>ZsQa77BU5779RH9Lro7DJF!*C2@d&Ci4H6CMI['C2@d&Ci4!(DJF!*B3\VMA7]CY>%;)S
+@q9.`>ZtWJASQ%!C2@d&Ci3`nAP,Wj8k_rO9MJMU5tXgF779R64Zl/$76<Up7QilG]Y4@Fs8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVp[%),m-ilnkMYFa
+g"bH;gtpK/f!MfkL4">_Ci4!(DJF!*C2@d&Ci4H=FD>W0GB@qNFED_KFE_hKGB@qNFED_KFE_hK
+GB@qNFED86DKg2EC2@d3FED86DKg2EGB@qNFED86DKg2EGB@qACi4H=FE_hKC2@d3FED_KFE_hK
+GB@qND/4?;FE_hKGB@qRH[U6fI=$<hGB@qpPEX26c2[hDs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39idaZjKXK@G>N/3.?
+H[C0fH[U^'KR8&oLkLG.H[U^'KR8&oH[C0fH[U6fI<TdTH[C0fH[U6fI=$<hH[C0fH[U6fI=$<h
+GB@q:A7\1t7:Tk>s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+kj7d%m-iW_hV$]@daZjkbg">Tc,@T?bKS5Sbg!2iXc/0sH[C0sKS4]!I>EQ0H[C0fH[U6fI<TdT
+GB@qNFED_KFE_hKGB@qNFED_KFE_hKC2@d3D/3m&DKfr5UnsmNm-juSs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726g"bH;gtp5uc-+>U
+`5T^6`Pod7`Pfa7`5T]BH[TXFDL6_YLkLG.H[U^'KSY;7LkLG;KS5/7KSY;7N/NXAH[U^'KSY;7
+N/NXRMi<UQN/W[RN/NXRMi<IFKT(hJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6/h<
+kj7crjQG4OhU9p)bKS5L`Poj0]">Vg]=bhh]Y1\Z[(Eua]=bha['Zm8X]Sh7=A27f9Lr8j?Asf$
+N/NXRMi<UQN/W[RN/NXNKS5;BN/W[RLkLG?Mi<UQN/W[RN/NXRMi<UQN/W[RN/NXRMi<UQN4Za9
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o.jQG4OhU9p)bKS5Sbg")F`Oidr
+]=bhh]Y1\Z['[3IX/rG5XfAG'XgGIBX/rG1['[?FWiN5'LkLF\<)lOa9k.^FH[C0sKS4]!I>EQ0
+LkLG;KS4]!I>EQ0H[C0sKS4]!I>EQ0H[C0fH[U*[FF/@_GB@qRH[U*[FE_hKGB@qNFED_KFD>W0
+C2@d&Ci4H6CNjlBGB@qRH[U6fI=$<hH[C0fH[U^'KSY;7LkLG;KS5;BN/W[RN/NX_PEUr`N/W[R
+N/NXNKS5bWPJkGZm.9o6m-ilnkLnYIbKS5L`PoI%]rS6:Unsl_V50o`Unji_Unsl2D/2!c1c7*H
+4$5Yq4Zkeg4Zbbh4$5Yp6q(*E5t+11=Bo0ZH[U6fI=$<hLkLG.H[U6fI=$<hLkLG.H[U6fI=$<h
+H[C0fH[U6fI<TdTH[C0fH[U6fI<TdTC2@e+`PpcrkLnYIdaZjd`PoI%]sP/RX/rFnSt)=BS>_mA
+S=Z7@St'Fu>"(hJ<CK2G9MIrD77BU5<CK2G9MJ,Q9gqH=779R56q(*E5u^f`H[C0fH[U6fI=$<h
+H[C0fH[U6fI=$<hH[C0fH[U6fI=$<hH[C0fH[U6fI>3,rGB@qRH[U6fI=$<hdaZkJs8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-ilnkMYFag"bH4eCL.]S9K's@q9.\A7]CY>#\I$
+=Bo03<)lms<E)pt<)ck"9Lr8Z86APV=A27b<)lms<EMpc<)cjs<)lms<EMpc<)cjs<)lms<E)pt
+<)cjs<)m%*?>!MHB3\VB>[CoNARf7^@q9.`>ZtWJARf7^@q9.\A7\_><CK;E7Qik'4Zkeg4[hb-
+@q9.\A7]7]ASQ%!C2@ctA7]7]ARf7^@q9.\A7]CY>%;)S@q9.Q>[D&J>$,$9@q9.\A7]7]ATr!,
+B3\V?76s@177KF&779R64Zl1s4@MY,4$5Yq4Zm4bA^])Zs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d%m-ilnkN:RTg"bH;gtpK/f!qi^
+H[C0UCi4H6CMI['GAV,>FED_KFD>W0GB@qACi4H=FD>W0C2@d3D/3m&DJF!*GB@qACi4H=FE_S;
+GB@qNFEDkVI<TdTGB@qNFED86DKfr5C2@d&Ci4H=FD>W0GB@qACi4!(DKg2EGB@qNFED_KFE_hK
+LkLG^XKCFAkPtS^s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-iW_hV$]@daZj[]Y0i,S;`AbH[C0sKS5/7KR8&o
+H[C0fH[U6fI<TdTGB@qNFED_KFE_hKH[C0fH[U6fI=$<hH[C0bFED86DG!Ss8k_t-eCO["s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2k1nbFgtpK/f$`(!
+daZk#bfe2Rc-+>UbKS5$St(UiKR8&oH[C0bFEDkVI=$<hGB@qNFED_KFD>W0GB@qNFED_KFE_hK
+GB@qACi4!(DMWt!]=biWs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIbKS5Sbg")F`RrDX`5T^6`Po3kZrC")
+LkLG;KS5/7KSY;7H[C0sKS4]!I>EQ0LkLG;KS4]!I>EQ0LkLG;KS5;BN/W[RN/NXRMi<UQN/W[R
+LkLGn]Y4@Fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCN'tf#5PH
+`5T^-]Y1qi]sP/R]=bha['[3I[(Eua['[2aD/3*M<E)pt<)ckAFEEJ"N/3.?LkLG;KS5/7KSY;7
+H[C0sKS4]!I>EQ0LkLG?Mi<UQN/W[RN/NXRMi<UQN/W[RN/NXbSt,i\s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gi8j(ZjQG4OhU9p)bKS5L`Pod7`Oidr]=bhh]Y1\Z['[3I
+['[3@XKAk:[&^:1X/rG(XKB"7WiN5'N/NX)A7\_><GH>fH[C0fH[U^'KSY;7LkLG.H[U^'KR8&o
+LkLG.H[U6fI=$<hGB@qNFED_KFE_hKGB@qNFED86DKg2EC2@d3FED86DJF!*C2@d3D/4?;FE_hK
+H[C0fH[U^'KT(hJH[C1"Mi<IFKT(hJN/NXRMi<UQN/W[RN/NX_PEUr`N2s%^m.9oMs8VHWp#tc2
+i8j(LeCN'tf"8T.]=bha['ZX*Unji_Unsl_V50o`UgmqH2)I-I1c.'H1c7*H4$5Yq4Zkeg4Zbbh
+4$5Yq4Zl\C<I9(@H[C0fH[U6fI=$<hH[C0fH[U6fI=$<hH[C0fH[U6fI<TdTGB@qNFED_KFE_hK
+GB@qNFED86DS*Qpkj7ckgtpK/f#5PH]=bha['Zm8Xe_ehS=Z7@St)=BS=H1@<)cjd6q'O477KF&
+779R:9MIrD77BU5<CK2B6q'^A9gqH=779RH>[E/4H[C*fH[C0fH[U^'KR8&oLkLG.H[U6fI=$<h
+H[C0fH[U6fI=$<hH[C0fH[U6fI=$<hH[C0bFEGs\f)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq=OCVkj7d%m-ilnkMYFag"bH-bfuZLS8)kX=Bo0F>Zt*+<E)pt<)cjs<)m$o85rPg
+8k_rY<)lOa9iP(l8k_rO9MJJc<EMpc8k_rY<)lOa9it([=A27b<)lms<E)pt<)cjs<)lms<ENL4
+B3\V><)m%*?<CH=@q9.`>Zt67?:@7N7Qijk1c.'H1cmf_<)ckAD/36Y?>!MHB3\VQ>ZtcF>%;)S
+@q9.`>ZtWJAS57O@q9.Q>[D&J>#\I$=Bo03<)lms<G,Q?@q9.\A7\_><CK;E7Qik&6q'R.4?GYg
+<)ckEH[VrrXm#-?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+@Sq=j7=kj7d%m-ilnkMYFag"bH;gtpK/f!MfkN/NX0Ci4H=FD>W0
+GB@qACi4H=FE_S;C2@d&Ci4H=FD>W0C2@d3D/3m&DKg2EC2@d3FED_KFF/@_GB@qRH[U*[FE_hK
+GB@qNFED_KFD>W0GB@qACi4!(DJF!*GB@qNFED_KFF/@_R?NiXbg$1fs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726i8j(ZjQG4OhV$]@g"bH-bg!N%[$d,ALkLG;KS4]!I=$<hGB@qNFED_KFD>W0
+C2@d&Ci4!(DKg2EGB@qNFED_KFE_hK<)cje4ZoO:V#UJps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)iE\g"bH4eCN'tf#u:^bKS5Sbg"Scf#u:^
+N/NXAH[U6fI<TdTH[C0bFED_KFE_hKC2@d3FED_KFD>W0GB@qNFEDkVI@Qn!g"bHas8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<726i8j(Sgtp]-bKJ,S`5T^6`Pp$Ec,@T?L4">XA7^+7I=$<hH[C0fH[U6fI=$<h
+H[C0sKS4]!I>EQ0LkLG?Mi<"0I>j)CH[C1"Mi<UQN/W[RN/NXRMi<UQN;rqXs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n(HLQdaZjkbg")F`Oidr]=bhh]Y1\Z['[3I
+]=bha['[HX]nh>p<)ck"9Lr,^<F]QNN/NXAH[Uj2N-fo"N/NXAH[U6fI=$<hH[C0sKS4]!I=$<h
+N/NXAH[U^'KSY;7N/NXRMi<UQN/W[Rs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+QpA+(Hp#tc2g"bH;gtpK/f$`(!bKS5L`PoI%]t:qj]=bhh]Y1\Z['[3I['[3@XKAk:['[3I
+X/rG(XKAP)XfJP*S=Z6pFED#'AUAcPH[C0fH[U6fI>EQ0H[C0sKS4]!I=$<hH[C0fH[U6fI=$<h
+GB@qACi4THI;3S9GB@qACi4!(DI[3gC2@ctA7]LlDJF!*C2@d&Ci4H=FF/@_H[C0fH[U^'KR8&o
+LkLG?Mi<UQN/W[RN/NX_PEUr`N1?K0i8j)$s8W-!s8W-!m.9o6m-ilnkLnYIbKS5L`PoI%]rS6:
+Unsl_V50o`Unji_Unsl%Ci2*e1c7*H2)I-B/1i_91bL=22)I-O4?YPY1cmf_8k_s'FED86DKg2E
+C2@d3FED_KFF/@_GB@qNFED_KFD>W0GB@qACi4H=FD>W0GB@qACi4!(DJF!*C2@e"]Y37akLnYI
+daZjd`PoI%]sP/RX/rFnSt)=BS=H1@S=Z7@St'Fu>"(hJ8k_rJ6q'^A9gqH=8k_rJ6q'O477BU5
+8k_rJ6q(*E6"=G:H[C0fH[U6fI=$<hH[C0fH[U^'KR8&oH[C0bFEDkVI<TdTH[C0bFEDkVI=$<h
+H[C0bFED_KFF/@_daZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<[_G
+kj7crjQGI^kMYFag"bH:bfcNJS8)kX<)cjs<)m$o84lQM8k_rO9MJV_84lQM8k_rO9MJV_85rPg
+8k_rO9MJJc<EMpc<)cji9MJJc<E)pt<)cjs<)m%*?;sm(=Bo03<)lms<E)pt<)cjs<)lms<CK;E
+2)I-O4?ZYC<JGmJUnsm*`Pp9Tf!qi^=Bo07>[CN;?<CH==Bo0F>Zt67?<CH==Bo0F>Zt67?>!MH
+=Bo03<)lms<E)pt<)cjs<)m%*?>!MH<)cjZ4?Z;19k.^FR?NiQ`PqKCq>^Kps8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+(Hp%7tRkj7d%m-ilnkMYFag"bH;gtp`>hSdCPS=Z6tH[TXFDKg2EGB@qACi4H=FD>W0
+C2@d3FED_DCNjlBGB@qNFED_KFE_hKGB@qRH[U6fI<TdTH[C0bFED_KFE_hKC2@d&Ci4!(DJF!*
+GB@qACi4H=FF/@_X/rG]jQHRCs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*q=n)39i
+i8j(Sgtp`>hV$]@daZjreCMRW`MB?+N/NXAH[U*[FE_hKC2@d&Ci3`nARf7^C2@d&Ci4H=FE_hK
+GB@q/>[Bl_4C_o5s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\m.9o6m-iW_hV$]@daZk$gtpK/f$`(!daZk$gtoug`Hur[H[C0fH[U6fI<TdT
+H[C0bFED_KFD>W0C2@d3FEE=lKXA+nm.9oMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hV$]@
+bKS5Sbg")F`Pfa7`5T^&['WG!9m:]$H[C0fH[U6fI=$<hH[C0fH[U6fI=$<hH[C0sKS4]!I>EQ0
+LkLG;KS5/7KSY;7H[C1"Mi<UQN/3.?['[4?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s6T@Mkj7crjQG4OhTO-f`5T^6`PoI%]sP/R]=bhh]Y1\Z[(Eua['[31St&DH9iP(l
+8k_rY<)na-KT(hJN/NXNKS5;BN-fo"H[C0fH[U6fI=$<hH[C1"Mi<"0I>j)CLkLG.H[Uj2N-fo"
+N/NXRMi@#op&G'ls8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_JAp#+oo
+g"bH;gtpK/f$`(!bKS5L`PoI%]t:qj]=bha['[3I['[3I['[3@XKAk:[&^:1['[3@XKAP)XfJP*
+X/rF^Mi<"0I=$<hN/NXAH[U6fI=$<hH[C0fH[U6fI=$<hH[C0bFED_KFE_hKH[C0UCi4H=FD>W0
+@q9.\A7]7]ASQ%!@q9.cCi4H=FD>W0GB@qRH[U6fI=$<hLkLG.H[Uj2N-fo"N/NXRMi<UQN1?K0
+`5T^qs8W-!s8W-!s8W-!s8V`bq<726i8j(LeCMgec,@T?['[3I['ZX*Unji_Unsl_V50o`Uj$Zk
+2)I-I1c.'H1c7*H2)I-B/1iJ*/N#@A2)I-I1c.fu9knK^C2@d&Ci4!(DKg2EC2@d&Ci4!(DJF!*
+C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DS*Qpkj7ckgtpK/f#5PH]=bha['Zm8XdkuQ
+S=Z7@St)=BS=H1@B3\V/6q'^A9iXVJ779RE76s@177BU5779R:9MIu>4@MY,779RH>[Dc(I>EQ0
+H[C0sKS5/7KSY;7LkLG.H[U6fI=$<hH[C0fH[U*[FF/@_GB@qNFED_KFE_hKGB@qNFEGs\f)PdM
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVkj7d%m-ilnkMYFa
+g"bH;gto*5XbM4M<)cjs<)lOa9hJ)R8k_r]9LqcL9hJ)R8k_rO9MJ,Q9iP(l8k_rY<)lms<E)pt
+=A27b<)lms<E)pt<)cjs<)m$o85rPg=A27b<)lms<E)pt@q9/,KS6k;Wm]DJi8j(ZjQG4OhVdJX
+g"bGk['We3<E)pt<)cjs<)lms<E)pt<)cjs<)m$o85rPg<)cjs<)lms<E)pt<)ck"9Lr8j??^7%
+H[C1"Mi<UQN2s%^g"bHNoC`.`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=j7=
+kj7d%m-j0)n)39ii8j(Sgtp`>hU9p)['[3!Mi;k%FE_hKC2@d3FED86DKg2EGB@qNFED_KFD>W0
+GB@qNFED_KFF/@_H[C0fH[U6fI<TdTGB@qACi4!(DJF!*C2@d&Ci4THI@Qn!bKS62s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+Em-j0)n*'-,i8j(ZjQG4OhV$]@
+g"bH;gtpK/f"8T.R?NhYFED86DI[3g=Bo07>[CN;?>=:o@q9.cCi3`nAO\gF=Bo2!oC`.`s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+kj7crjQG4OhWEVKg"bH;gtq2KgtCK>i8j(.['YXBKR8&oGB@qRH[U*[FD>W0C2@d&Ci52iN6BGi
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq<726g"bH;gtp5uc-+>U`5T^6`Pp$Ec%^Um
+=Bo0VFED_KFE_hKGB@qNFED_KFE_hKGB@qRH[U6fI=$<hH[C0sKS5/7KT(hJN/NXRMi<UQN/W[R
+H[C1"Mi@]9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#+oo
+g"bH4eCMRW`Pfa7]=bhh]Y1\Z['[3I['[3P]Y1\Z[%sOo8k_rY<)lOa9iP(lH[C0sKS5/7KSY;7
+LkLG;KS5/7KSY;7H[C0fH[U6fI=$<hH[C0sKS4]!I>EQ0LkLG?Mi<IFKT(hJdaZkJs8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC_>6n)39ig"bH;gtpK/f$`(!
+bKS5L`Pod7`Oidr]=bhh]Y1\Z['[3I['[3I['Zm8XgGIBX/rG(XKAP)XfJP*X/rG!V50'.N/W[R
+N/NXRMi<"0I=$<hH[C0fH[U6fI<TdTC2@d3FED_KFD>W0GB@qACi4!(DI[3g@q9.\A7]7]ASQ%!
+C2@d3FED_KFE_hKH[C0fH[U6fI>EQ0H[C0sKS5;BN1#ln`5T^qs8W-!s8W-!s8W-!s8W-!s8W-!
+m.9o6m-iW_hU9p)bKS5L`PoI%]rS6:X/rG!V51/nXe_ehUnsl6H[S=N77KF&2)I-Z4ZkSY1c7*H
+2)I-I1c.'H1bL=2779RZCi4!(DJF!*C2@d&Ci3`nASQ%!@q9.\A7]7]ASQ%!@q9.\A7]7]ARf7^
+@q9.\A7]7]ASQ%!C2@e"]Y37akLnYIdaZjkbg!c4]sP/RX/rFnSt)UQUn"$HUnslWSt'P3DFHr^
+779R56q'O477BU5779R:9MJ,Q9gqH=8k_rO9MIrD79Ef$H[C0sKS5/7KR8&oLkLG.H[U^'KT(hJ
+H[C0sKS4]!I=$<hGB@qNFED86DJF!*C2@d3FED_KFE_hKdaZkJs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+(Hp#tc2kj7d%m-ilnkMYFag"bHBjQFJ#`LNNi
+GAV+p<)lOa9hJ)R8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9iP(l<)cjs<)lms<E)pt<)cjs<)lms<E)pt
+8k_rY<)n-aFIA>V]=bi1gtq8]n*'-,kj7d%m-j0)n*'-,kj7crjQGI^kI\C?=Bo07>[CB/<E)pt
+<)ck-A7]LlDKg2EH[C1"Mi=0tS><!W['[3[]Xl;1c.Un/i8j(bm-j<4p$D;Co_/+QpA+@Sq>^Kp
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVkj7d%m-j0)n*'-,
+i8j(ZjQGI^kLnYIdaZjT['Z6bPC%Y)GB@qACi4H=FD>W0H[C0bFEDkVI<TdTH[C0fH[U6fI=$<h
+H[C0bFED86DKg2EC2@d7H[V<GPJkGZm.9oMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq>^Kpo_/+Em-j0)n*'-,i8j(ZjQGI^kLnYIi8j(ZjQGI^kL.l2
+['[2rKS3H4?<CH=@q9.\A7]7]ASQ%!779S'Mi@]9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2kj7crjQGann)39i
+kj7d%m-j<4p#tc2R?Nh]H[U6fI<TdTGB@qRH[V]dV!.16s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\m.9o.jQG[\gsX^'bKS5Sbg")F`Pfa7['[249MK8<DJF!*GB@qNFED_KFE_hK
+GB@qACi4THI;3S9H[C0fH[U6fI>j)CLkLG;KS5;BN/3.?N/NXNKS5/7KWD2Vs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-ilnkLnYIbKS5L`PoI%]t:qj
+['[3[]Xk_f]sP/R]=bhQV5-^W9it([8k_r]9LrZ(AVc"mLkLG;KS4]!I>j)CH[C0fH[U6fI=$<h
+H[C0fH[U6fI=$<hH[C0fH[U6fI>j)CH[C0fH[WN=^&S-4s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-ilnkMYFag"bH;gtpK/f$`(!bKS5Sbg")F`Pfa7
+]=bhh]Y1qi]sP/R]=bha['[3I['[3I['[3I['[3I['[3I['[3I['Zm8XdkuQLkLG.H[U6fI=$<h
+H[C0UCi4H=FD>W0C2@d3FED86DJF!*@q9.\A7]7]ARf7^@q9.\A7]LlDJF!*C2@d7H[U6fI=$<h
+H[C0fH[Uj2N3ot!g"bHVpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#u:^
+]=bhh]Y1AIXgGIB['[3I['[3I['[3IUnslGMi;jsCJ%8p7Qik'4Zkeg4Z,&Q2)I-I1c.Wh7;?XV
+C2@d&Ci4!(DJF!*@q9.cCi3`nASQ%!@q9.\A7]LlDI[3g@q9.\A7]7]ARf7^@q9.\A7]LlDS*Qp
+kj7ckgtp`>hTO-f`5T^-]Y1\Z[&^:1UnslfXKAP)XfJP*X/rG!V50'.N-BAc=Bo0)9MJ,Q9gqH=
+<CK2B6q'^A9gqH=8k_r]>[Dc(I>EQ0LkLG;KS5/7KR8&oLkLG.H[U^'KR8&oH[C0fH[U6fI;3S9
+GB@qNFED_KFD>W0GB@qACi7\Nf)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+@Sq<726kj7d%m-j0)n)39ii8j(ZjQG4OhTO-fUnsl6H[TC7AP,Wj
+8k_rO9MJ,Q9iP(l8k_rY<)lms<E)pt<)cjs<)m%*?>=:oLkLGOSt*F*^#7u7kj7d%m-j<4p%7tR
+o_/+QpA+@Sq=OCVm.9o:oC_kEkNM:$kj7ckgto*5Xh26Z`5T^=bg"hrhVdJXi8j(bm-j0)n*'-,
+kj7d%m-j0)n*'-,m.9o:oC_bLq=OCVo_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVp[%)0oC_>6n*'-,kj7d%m-ilnkMYFa
+i8j(Sgtoug`MB?+S=Z7,KS4]!I<TdTGB@qNFEDkVI<TdTGB@qACi4THI>j)CS=Z7X['\92f(A\3
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\o_/+IoC_JAp#tc2kj7d%m-j0)n*'-,i8j(foC_>6n*KZ=g"bG[V5/<WFD>W0
+@q9.cCi7G?c2[hDs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+ILkNqg5kj7d)oC_JAp%7tRo_/+QpA*Y-kBhQ(
+H[C1"Mi>Tn`Urm"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA*q=n)39i
+g"bH4eCMgec-+>U`5T^6`PmXdKN(oNGB@qNFEDkVI=$<hGB@qRH[U6fI=$<hH[C0bFED86DL6_Y
+H[C0fH[U6fI=$<hLkLG;KS5/7KT(hJLkLHJoC`.`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<726i8j(SgtpK/f#5PH`k8mp]Y1qi]sP/R]=bha['[3I[%*_X
+8k_rO9MJ,Q9hJ)R=Bo0gKS5;BN-fo"N/NXAH[U6fI=$<hH[C0fH[TXFDKg2EH[C0fH[U6fI=$<h
+H[C0fH[U^'KR8&oX/rH's8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq=OCVm.9o:oC_&&kMYFag"bH;gtpK/f$`(!bKS5Sbg">Tc,@T?`5T^6`PoI%]t:qj
+]=bhh]Y1qi]t:qj]=bhh]Y1qi]u7n/]=bhq`PoI%]sP/RS=Z7,KS4]!I=$<hC2@d&Ci4!(DJF!*
+C2@ctA7]7]ARf7^=Bo0BA7]7]ARf7^C2@d&Ci4!(DJF!*LkLGOSt*a<`TZ[Ws8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH4eCMRW`Pfa7]=bha['[HX]t:qj
+]=bhh]Y1qi]t:qj`5T^-]Y1,;Ul:4j@q9.>6q'R.4@VIr8k_s'FED_KFD>W0C2@d3FED86DJF!*
+C2@d&Ci4THI=$<hN/NXbSt)UQUpRM9]=bi#bg"Scf&5WPkj7d%m-j0)n)39ig"bH4eCN'tf#5PH
+]=bha['[3I['[3I['[3I['[3I[(Eua['[3I['[HX]sP/RS=Z70Mi;CeDH'S87Qik&6q(*E6!.Au
+H[C0sKS5/7KSY;7N/NXAH[U^'KR8&oH[C1"Mi<UQN1?K0UnslfXKB+I]t:qjbKS5agtq8]n*KZ=
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+\s8V`bq<726kj7d%m-j0)n)39ii8j(ZjQGI^kMYFag"bH-bg!N%[%*_XQ]-fXKS5/7KT(hJ
+N/NXbSt*0p[)Br&daZk+jQGann*'-,kj7d)oC_JAp%7tRo_/+QpA+ags8W-!o_/+\s8V`bq=OCV
+o_/+QpA+@Sq=OCVkj7d%m-j0)n*'-,kj7d%m-j<4p#tc2o_/+Em-jT?q=OCVm.9oBpA+@Sq=OCV
+o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+IoC_JAp#tc2kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
+g"bH4eCMRW`Oidr`5T^-]Y2M4c.Un/kj7d)oC`.`s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+o_/+QpA+(Hp$D;Cm.9o:oC_JAp$D;Co_/+QpA+ags8W-!s8W,PgtoEF[/^1+s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVs8W-!s8W-!s8W-!s8W,Pgtp`>hXpO;s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7ckgtpK/f$`(!bKS5L`Pod7`Q#R%
+8k_roCi4!(DKg2EH[C0UCi4THI=$<hGB@qNFED86DJF!*C2@d7H[TXFDL6_YH[C1"Mi<"0I>j)C
+H[C1"Mi=0tSH&Whs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,+['WG!:"e=Y
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,coC_&&kLnYIdaZjd`Pod7`Oidr['[3I['[3I[(Eua]=bhDN/C5$9gqH=8k_rO9MJJc<JZ<]
+H[C1"Mi<"0I>j)CH[C0fH[U6fI=$<hH[C0UCi4THI;3S9H[C0fH[U6fI=$<hH[C0fH[VEUSH&Wh
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV
+m.9o6m-ilnkMYFag"bH;gtp`>hU9p)daZjkbg">Tc-+>UbKS5Sbg")F`QQKM`5T^6`Pod7`Pfa7
+`5T^6`Pp$Ec,@T?daZjkbg"Scf#u:^]=bhXXKA"aS9oU2GB@qACi4!(DI[3g@q9.\A7]7]ARf7^
+@q9.pFEEJ"N2s%^bKS5toC_bLq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq<[_Gkj7crjQG4OhV$]@bKS5Sbg")F`Pfa7`5T^6`Pod7`QQKMbKS5Sbg")F`QQKM
+bKS5ZeCN'tf$`(!X/rF^Mi;CeDN'L4S=Z7OXKB+I]u7n/daZk+jQGann+?>Ls8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Cm.9o6m-ilnkLnYIdaZjd`Pod7`Oidr]=bhh]Y1qi]t:qj
+`5T^-]Y28&`Oidr`5T^6`Pp$Ec-k+mdaZk$gtoug`MB?+LkLG.H[VEUS?&`n['[3Y`Pp$Ec.Un/
+i8j(bm-j<4p%7tRs8W-!s8W-!s8W-!o_/+\s8W-!s7H$\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCV
+m.9o:oC_>6n*'-,kj7d%m-ilnkNM:$i8j(ZjQGI^kMYFai8j(ZjQGann*'-,kj7d%m-j0)n*'-,
+m.9o:oC_bLq=OCVo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVs8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+IoC`.`s6T@Mm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp%7tR
+o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+Em-ilnkLnYIdaZjkbg">Tc-+>U`5T]SMi:8%9m:]$C2@d3FED_KFE_hK
+C2@d&Ci4THI;3S9H[C0UCi4!(DJF!*H[C0UCi4THI=$<hH[C0fH[U6fI=$<hi8j)$s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8UNsejVtq779R:9MNsbf)PdMs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7crjQFt@f#u:^
+]=bhh]Y1qi]t:qj['[3P]Y1\Z[!-V6779R:9MJ,Q9hJ)R8k_s<Mi<"0I>j)CH[C0fH[U6fI=$<h
+H[C0fH[U6fI<TdTH[C0fH[TXFDL6_YC2@d7H[U6fI=$<hR?Nj7s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o:oC_>6n)39i
+i8j(Sgtp`>hV$]@g"bH4eCN'tf#u:^daZjkbg">Tc-k+mbKS5ZeCN'tf$`(!daZjreCN'tf$`(!
+g"bH;gtpuMkMYFai8j(bm-iW_hTO-f`5T^-]Y28&`OidrdaZk+jQGn$p&G'ls8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_JAp$D;C
+i8j(Sgtp`>hU9p)bKS5Sbg">Tc-k+mdaZjkbg">Tc-+>UdaZjreCN'tf%Jj8i8j(ZjQGann*KZ=
+o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,coC_JAp#tc2i8j(Sgtp`>hU9p)daZjd`Pod7`Pfa7`5T^=bg")F`Pfa7bKS5Sbg">Tc-+>U
+daZk$gtpuMkMYFai8j(foC_JAp$D;Co_/+QpA+@Sq=OCVo_/+QpA+@Sq>^Kps8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9oBpA*q=n*KZ=
+kj7d%m-j0)n*'-,kj7d)oC_>6n*KZ=kj7d)oC_>6n+?>Lo_/+QpA+@Sq=OCVs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+ags8W-!s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
+g"bH;gtpK/f#u:^`5T^6`PoI%]h1sm@q9.cCi4!(DKg2EC2@d&Ci4!(DKg2EC2@d7H[TXFDJF!*
+C2@d&Ci4!(DJF!*C2@d7H[U6fI=$<hH[C1"Mi@]9s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s5;u$779R+4?Z.s4@MY,8k_t-eCO["s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjkbg")F`Oidr['[3I['[HX]sP/R
+['[2><)l@T77p6J779R:9MJ,Q9m_58H[C1"Mi<"0I=$<hH[C0fH[U6fI=$<hH[C0fH[TXFDL6_Y
+C2@d7H[U*[FE_hKC2@d7H[Uj2N;rqXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o:oC_JAp#+ooi8j(ZjQG4OhV$]@
+g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@i8j(ZjQGI^kMYFai8j(bm-j0)n*KZ=
+m.9o:oC_bLq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o:oC_>6n*'-,g"bH;gtpK/f%Jj8
+g"bH;gtpK/f%Jj8g"bH;gtp`>hV$]@i8j(ZjQGI^kNqg5m.9oBpA+@Sq=OCVs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o:oC_JAp#+oo
+i8j(SgtpK/f$`(!daZjkbg"Scf$`(!daZjreCN'tf$`(!daZjreCN=.hV$]@i8j(bm-j<4p$D;C
+m.9oBpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
+m.9oBpA+@Sq=OCVo_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)bKS5Sbg")F`QQKM
+N/NWe9MK8<DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DKg2EC2@d&Ci4!(DJF!*
+C2@d7H[TXFDUR%cs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+@Sq>^Kpkj7b;<)l"B4Zbbh
+4$5Yf4?Z;19o+IUs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s6T@Mkj7crjQFt@f#u:^`5T^-]Y1qi]sP/R]=bha['Z6bP=7l.779R56q'^A9gqH=
+=Bo0kMi<"0I=$<hH[C0fH[U6fI=$<hH[C0fH[TXFDL6_YH[C0UCi4THI;3S9C2@d7H[TXFDKg2E
+N/NYps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+@Sq<[_Gm.9o:oC_>6n*'-,i8j(ZjQGI^kLnYIi8j(Sgtp`>hV$]@
+g"bHBjQG4OhVdJXi8j(ZjQGI^kMYFakj7d%m-j<4p$D;Cm.9o:oC_bLq>^Kps8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+(Hp$D;Cm.9o6m-ilnkMYFag"bH;gtp`>hV$]@g"bHBjQG4OhVdJX
+i8j(ZjQGI^kMYFakj7d)oC_JAp$D;Co_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp$D;Ckj7d%m-ilnkMYFag"bH4eCN'tf$`(!
+daZjreCN'tf$`(!daZk$gtp`>hV$]@i8j(ZjQGann*KZ=m.9o:oC_bLq=OCVs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+ags7H$\o_/+QpA+@Sq=OCVm.9oBpA+ags7H$\o_/+\s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA*q=n)39idaZk#bfe2Rc,@T?bKS5N]Xg^/9knK^C2@d&Ci4!(DJF!*
+C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*H[C0UCi4!(DJF!*C2@d&Ci4!(DJF!*H[C2@s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o:oC_>6n*KZ=m.9o6m-eFpAMl;$2)I-O4?Ybg4[hb-@q9.tH[WiO`W,u<
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQ
+g"bH-bg")F`O*"Z]=bha['[HX]sP/R@q9.>6q'O479)cB779R56q(TrAUAcPH[C0fH[U6fI=$<h
+H[C0fH[U6fI;3S9H[C0UCi4!(DL6_YC2@d7H[TXFDL6_YC2@d&Ci6&FV#UJps8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+o_/+IoC_JAp#tc2i8j(bm-ilnkMYFai8j(SgtpuMkLnYIi8j(Sgtp`>hV$]@i8j(ZjQGI^kMYFa
+i8j(bm-j0)n*'-,kj7d)oC_JAp$D;Co_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCV
+m.9o:oC_>6n*'-,i8j(ZjQG4OhV$]@g"bHBjQG4OhV$]@i8j(ZjQG4OhVdJXi8j(ZjQGann*'-,
+m.9o:oC_bLq=OCVo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VHWp$D;Cm.9o6m-j0)n)39ii8j(Sgtp`>hU9p)daZk$gtpK/f%Jj8daZk$gtp`>hU9p)
+g"bH;gtpuMkMYFam.9o6m-j<4p$D;Co_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags7H$\
+o_/+\s8V`bq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+ags8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+i8j(SgtpK/f#u:^bKS5Sbg")F`Jf_68k_rhA7]LlDJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*
+C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci721`W,u<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n*'-,
+i8j(ZjQGI^kBhQ(/hAS31c.'H1cmf_4$5Z.>[Dc(I=$<hH[C2@s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@Mkj7ckgtpK/f#u:^]=bhh]Y1\Z[(Eua
+['[31St&5;77KF&779R56q'O477BU5C2@d7H[U6fI=$<hH[C0fH[TXFDL6_YC2@d&Ci4!(DJF!*
+C2@d&Ci4!(DJF!*H[C0UCi4!(DJF!*['[4?s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVm.9o6m-j0)n)39i
+i8j(ZjQG4OhVdJXg"bH;gtp`>hVdJXg"bHBjQG4OhVdJXi8j(ZjQGann)39ikj7d%m-j0)n*KZ=
+m.9oBpA+@Sq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o:oC_JAp#tc2kj7crjQGI^kLnYI
+g"bH;gtpuMkLnYIi8j(ZjQG4OhVdJXi8j(ZjQGI^kMYFakj7d%m-j0)n*KZ=m.9o:oC_JAp$D;C
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+(Hp$D;Cm.9o6m-j0)n*'-,
+i8j(ZjQG4OhV$]@g"bH4eCN'tf$`(!g"bH4eCN=.hU9p)daZk$gtp`>hVdJXi8j(ZjQGI^kNqg5
+m.9o:oC_bLq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq>^Kpo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-ilnkL.l2daZjkbg")F`Pfa7
+`5T\p<)mF=ARf7^@q9.\A7]LlDJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*
+C2@d&Ci4!(DJF!*o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2i8j(Sgtp`>hV$]@R?Ngl1c-g9/N#@A
+/hAS31c.fu9m:]$GB@qRH[U6fI@Qn!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,coC_>6n(HLQdaZjkbg")F`Oidr['[3I['[3IZrgR>4$5Yf4?Z,$77BU5
+779R:9MKk\I=$<hH[C0fH[U6fI=$<hC2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DL6_Y
+C2@d&Ci7\Nf)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVm.9o:oC_JAp#tc2kj7crjQGI^kMYFai8j(SgtpuMkLnYI
+g"bH;gtpuMkLnYIi8j(ZjQGI^kMYFai8j(bm-j0)n*'-,m.9o:oC_JAp$D;Cm.9oBpA+(Hp%7tR
+o_/+\s8V`bq>^Kpo_/+\s8V`bq=OCVs8W,kpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+IoC_bLq<[_G
+o_/+IoC_bLq<[_Gm.9o:oC_>6n*'-,i8j(bm-ilnkMYFai8j(SgtpuMkLnYIg"bH;gtp`>hVdJX
+g"bHBjQG4OhVdJXi8j(ZjQGann)39ikj7d%m-j0)n*KZ=m.9o6m-j<4p$D;Cm.9o6m-j<4p#tc2
+kj7d%m-j0)n*'-,kj7d%m-j<4p#tc2kj7d%m-j0)n)39ii8j(ZjQG4OhV$]@g"bH;gtpK/f$`(!
+daZjreCN'tf%Jj8g"bH;gtpK/f%Jj8daZk$gtpuMkMYFakj7d)oC_JAp$D;Co_/+QpA+ags8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA*q=n)39ig"bH4eCMgec-+>UbKS5L`Pn7/P<1li@q9.\A7]7]ARf7^
+@q9.\A7]LlDI[3gC2@d&Ci4!(DJF!*@q9.\A7]7]ASQ%!C2@d&Ci4!(DJF!*@q9/OXKDO&s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s6T@Mkj7ckgtp`>hU9p)daZjDV5-184Z,&Q/hAS,/1i_91cmf_C2@d&Ci4!(DKg2E
+H[C0fH[WiO`W,u<s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<726
+i8j(SgtpK/f#5PH]=bhh]Y1qi]sP/RLkLFC4?Ybg4Zbbh4$5Yf4?Z,$7:Tk>H[C0fH[U6fI=$<h
+H[C0UCi4THI;3S9C2@d&Ci3`nARf7^@q9.\A7]7]ARf7^C2@d&Ci4!(DJF!*i8j)$s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\s8W,kpA+ags7H$\s8W,kpA+@Sq>^Kpo_/+QpA+(Hp#tc2
+kj7d%m-j0)n)39ii8j(ZjQGI^kLnYIg"bH;gtpK/f$`(!bKS5ZeCN'tf$`(!bKS5ZeCN'tf$`(!
+daZjreCN'tf$`(!daZjreCN=.hV$]@g"bH;gtpuMkLnYIg"bH;gtp`>hV$]@g"bH;gtp`>hU9p)
+g"bH4eCN'tf$`(!daZjreCN'tf$`(!daZjreCMgec-k+mbKS5Sbg">Tc-+>UbKS5Sbg">Tc,@T?
+`5T^6`Pod7`Pfa7]=bhh]Y1qi]t:qj]=bhh]Y1qi]t:qj]=bhh]Y1qi]t:qj['[3P]Y1qi]t:qj
+]=bhh]Y1qi]t:qj]=bhh]Y1qi]sP/R]=bha['[3I[(Eua['[3I['[3I[(Eua['[3@XKAk:[&^:1
+['[3@XKAk:[&^:1X/rG(XKA:pUoUT!Unsl_V50WQS><!WS=Z7@St)=BS><!WS=Z7@St)=BS=H1@
+S=Z7@St)=BS=H1@Unsl_V50o`UoUT!X/rG(XKAk:['[3I['[3P]Y1qi^!"XEs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!kj7cF['Z?pS=H1@S=Z7@St)=BS=,S)S=Z7@St)44PFS57S=Z7=PEVN.S=H1@
+S=Z70Mi=0tS=H1@N/NXbSt)44PF7VuS=Z7=PEVDuPF7VuR?Ni&PEVDuPF7VuN/NX_PEVDuPF7Vu
+R?Ni&PEUr`N/W[RN/NX_PEUr`N/W[RR?NhnMi<UQN1#lnN/NXRMi<UQN/W[RN/NXRMi<UQN/W[R
+N/NXRMi<UQN/W[RLkLG;KS5/7KSY;7LkLG?Mi<IFKSY;7N/NXNKS5;BN/3.?LkLG;KS5/7KSY;7
+H[C1"Mi<IFKSY;7H[C0sKS4]!I>3,rH[C0fH[U^'KR8&oH[C0qI!^3eI=$<hH[C0fH[U6fI=$<h
+H[C0fH[U6fI=$<hH[C0bFEDkVI<TdTGB@qNFED_KFE_hKGB@qNFED_KFE_hKGB@qNFED86DKg2E
+C2@d3FED86DKg2EC2@d3FED86DKg2EC2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*
+C2@ctA7]LlDI[3gC2@ctA7]LlDI[3gC2@ctA7]LlDJ*3X@q9.\A7]7]AS57O@q9.\A7]7]ARf7^
+@q9.\A7\kJ?>!MH=Bo0F>Zt67?=RMW=Bo0F>Zt67?>!MH=Bo07>[CB/<ENL4<)ck">[CB/<ENL4
+<)ck">[CB/<ENL4<)cjs<)lms<E)pt<)cjs<)lms<E)pt<)cjs<)lOa9it([8k_r]9LqcL9it([
+8k_rO9MJV_84lQM=A27X9MIrD77p6J779R:9MJ,Q9gqH==A27X9MIrD77p6J779R56q'O477BU5
+779R56q'O477BU5779R56q'O477KF&4$5Yp6q'1"4[qRs4$5Yq4Zkeg4[qRs4$5Yq4Zkeg4Z,&Q
+4$5Y`1c.9V4Z,&Q4$5Y`1c.9V4Z,&Q4$5Y`1c.'H1c7*H2)I-I1c.'H1c7*H2)I-I1c.'H1c7*H
+/hAS31c-g9/M8S+/hAS,/1i_91bL=22)I-I1c.'H1bL=22)I-B/1iJ*/M8S+/hASe>[%1-s6T@M
+kj7crjQG4OhU9p)bKS5L`Pod7`Pfa7<)cjs<)mF=ARf7^=Bo0BA7]7]AQW2D@q9.Q>[CoNAQW2D
+@q9.\A7]7]AQW2D@q9.cCi3`nARf7^@q9.\A7]7]AaK$]s8W-!s8W-!s8W-!s8W-!s8W-!s+YoJ
+'b1Zk)]BG$%2B?^)B0S0%Lj-_%2B?^'b1Zf%Lj-_%2B?^'b1Zf%Lj-_%2B?^$k!IP$OdFO$l'6]
+$k!IY%Lj-_%2B?^'b1Zf%Lj-_%H-=1s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hV$]@
+daZjkbg!N%ZpdAO2)I-I1c.'H1bL=24$5Z9A7]7]ASQ%!C2@d3FEDkVI<TdTH[C1ogtr)2s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!m.9o6m-iW_hV$]@bKS5L`Pod7`Oidr
+['[3!Mi9_[4Z,&Q4$5Yf4?Ybg4[hb-779RZCi4THI=$<hH[C0UCi4THI;3S9C2@d&Ci4!(DJF!*
+@q9.\A7]7]AQW2D=Bo07>[CoNARf7^C2@d7H[Xi5k7nI9"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-">25WH[C1abg$1fs8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V<Ln$KI/C2@c+)]Ah\"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"B\o8o_/+Em-ilnkLnYIdaZjkbg">Tc,@T?
+`5T]cSt%Yp1h1'-@q9.Q>[CoNARf7^@q9.\A7\kJ?=RMW=Bo07>[CoNAQW2D@q9.\A7]7]ARf7^
+@q9.\A7]7]AQW2DS=Z8Ns8W-!s8W-!s8W-!s8W-!s7H$\i8j&(!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]O,:*<hs8W-!s8W-!s8W-!s8W-!s8W,coC_>6n(HLQg"bH4eCMgec+CX%<)cjZ4?YPY1c7*H
+2)I-O4?ZeO?>=:o@q9.cCi4!(DJF!*C2@d3FEDkVI>j)CdaZkJs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,coC_>6n)39ig"bH4eCN'tf#5PH]=bha['Y1,I5Ni<2)I-I1c.9V4Z,&Q
+4$5Yf4?ZeO?@.$IC2@d7H[TXFDL6_YC2@d7H[TXFDJF!*C2@ctA7]7]ARf7^=Bo0BA7\kJ?<CH=
+@q9.\A7]LlDOd;gS=Z5R!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]`1c0Q+IF?Wrs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/*m]Y/&rDBpGP"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J_<]Y3\'p#tc2i8j(Sgtp]-bKJ,SbKS5L`Pod7`E6AO8k_rhA7\kJ?>=:o
+@q9.\A7]7]ARf7^@q9.Q>[CoNARf7^@q9.\A7]7]ASQ%!@q9.Q>[CoNAQW2D@q9.Q>[H+=hZ*WU
+s8W-!s8V`bq=OCVm.9o:oC[<LF9DXJ"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/Unsmes8W-!s8W-!
+s8W-!s8V`bq<726i8j(SgtpK/f#u:^`5T]1Ci2<s4Zbbh2)I-I1c.'H1fRFSC2@d&Ci4!(DJF!*
+C2@d7H[U6fI=$<hGB@qRH[TXFDN'L4daZkJs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2
+i8j(ZjQFt@f#u:^`5T^6`Pn@=S4ZIL/hAS,/1iJ*/M8S+2)I-I1c.9V4[hb-C2@d&Ci4H=FD>W0
+H[C0UCi4!(DJF!*C2@ctA7]7]AQW2D@q9.\A7]7]ARf7^=Bo0BA7]7]ASQ%!C2@dp['VG:/Hc+X
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/
+"9J]/!X&W-"9\c/"9J]/!X&W-"9\c/(BO^B!X&W-"9\c/(BO^B!X&W-"9\c/(BO^B!X';@"9\c/
+(BO^B!X';@"9\c/(BO^B!X';@"9\c/(BO^U!X&W-";_+B(BO^U!X&W-";_+B(BO^U!X&W-";_+B
+(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^U!X';@";_+B
+(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^U!X';@";_+B(BO^e!X';@"=F6R(BO^e!X';@"=F6R
+(BO^U!X'kP";_+B-NXDe!X'kP";_+B-NXDe!X'kP";_+B-NXDe!X'kP"=F6R-NXDu!X'kP"=F6R
+-NXDu!X'kP"=F6R-NXDu!X'kP"=F6R-NXDu!X'kP"=F6R-NXDu!X'kP"=F6R-NXDu!X'kP"=F6R
+-NXDu!X'kP"=F6R-NXDu!X)U,"K"R;ke+/"s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W+r>=DWq"?HSe
+3W]FF!X(Oc"?HSe3W]FF!X)$q"?HSe3W]FF!X(Oc"@rRs3W]FF!X)$q"?HSe3W]FT!X)$q"?HSe
+8-/ob!X(Oc"@rRs8-/oT!X)$q"@rRs8-/ob!X)$q"@rRs8-/ob!X)$q"@rRs8-/ob!X)$q"@rRs
+8-/ob!X)$q"@rRs8-/ob!X)$q"@rRs8-/or!X)$q"BY^.8-/ob!X)U,"@rRs=98Ur!X)U,"@rRs
+=98V-!X)$q"BY^.=98V-!X)U,"BY^.=98V-!X)U,"BY^.=98V-!X)U,"BY^.=98V-!X)U,"BY^.
+=98V-!X)U,"BY^.=98V=!X)U,"BY^.=98V-!X*0<"BY^.=98V=!X)U,"D@i>=98V=!X)U,"D@i>
+=98V=!X)U,"D@i>BEA<M!X*0<"D@i>BEA<M!X*0<"D@i>BEA<M!X*0<"D@i>BEA<M!X*0<"D@i>
+BEA<M!X*0<"D@i>BEA<M!X*0<"F1%OBEA<M!X*cM"D@i>BEA<M!X*cM"D@i>Gle+^!X*cM"D@i>
+Gle+o!X*0<"F1%OGle+^!X*cM"F1%OGle+o!X*cM"F1%OGle+o!X*cM"F1%OGle+o!X*cM"F1%O
+Gle+o!X*cM"F1%OGle+o!X*cM"F1%OGle,)!X*cM"Gd*^Gle,)!X*cM"Gd*^Gle,)!X*cM"Gd*^
+L]R^8!X+;\"F1%OL]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^
+L]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^L]R^8!X+;\"Gd*^L]R^D!X+_h"Gd*^PQCuP!X+;\"I&rj
+PQCuD!X+_h"I&rjPQCuP!X+_h"I&rjPQCuP!X+_h"I&rjPQCuP!X+_h"J>f!PQCu\!X+_h"J>f!
+PQCu\!X+_h"J>f!PQCu\!X,.t"J>f!PQCu\!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X-G"3:-80
+p[%)$jQG4OhU9p)bKS5Sbg")F`Pfa7UnskK4?ZeO?<CH==Bo0ICi4!(DI[3gC2@ctA7]7]ARf7^
+=Bo0BA7]7]ARf7^@q9.cCi4!(DI[3g@q9.Q>[CN;?Asf$s8W-!s8W-!s7H$\m.9o6m-j0)n(HLQ
+"9J]/!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X-7T)#sX9s8W-!s8W-!s6T@Mkj7crjQFt@f$`(!
+bKS5SbftK]I76Om779R+4?Ybg4Z,&Q<)ck4Ci3`nASQ%!C2@d&Ci4!(DJF!*C2@d&Ci4THI;3S9
+H[C0NA7[hb4_&#6['[4,oC`.`s8W-!s8W-!s8W-!s6T@Mm.9o.jQGI^kL.l2daZjd`PmdoN(Qc<
+/hAS",:"lm/M8S+/hAS,/1iJ*/N#@A4$5Z.>[D/]DJF!*C2@d&Ci4!(DJF!*C2@d&Ci3`nARf7^
+@q9.\A7\kJ?=RMW=Bo0ICi4!(DJF!*C2@d&Ci4THIB0HO"9J]/!X&W-"9\c/"9J]/!X,h2"J>f!
+ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
+ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:99!X,.t"LA.4
+ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,h2"J>f!TE58&!X,.t"J>f!
+ZN:9&!X,.t"J>f!ZN:9&!X,.t"J>f!ZN:9&!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X+_h"J>f!
+PQCu\!X,.t"J>f!PQCu\!X,.t"I&rjTE57h!X+_h"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"O(=ds8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7ta7`&9TJ!X,h2"J>f!ZN:9&!X,.t"LA.4
+TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!
+ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,.t"LA.4ZN:99!X,.t"LA.4
+ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:9B$P'fW%^Q3>
+]F,4^$P'KE"M>*P]F,4U!X-.D%^Q3>ZN:99!X,h2"LA.4]F,4U!X,h2"LA.4ZN:99!X-.D%^Q3>
+ZN:99!X,h2"LA.4]F,4U!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:9B$P'fW%^Q3>ZN:9B$P'KE"M>*PZN:99!X,h2"LA.4kbX@(m-j0)n)39ig"bH4eCMgec-+>U
+`5T^6`Pkqa?:mmc@q9.\A7]7]ARf7^C2@ci>[CoNARf7^=Bo07>[CN;?=RMW=Bo0BA7]7]ASQ%!
+@q9.Q>[CoNARf7^=Bo1\eCO9cq=OCVm.9o6m-ilnkMYFag"bG.FE@We"?HSeZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:9pHsZjQs8W-!o_/+IoC_&&kLnYIdaZjkbg">Tc'acZ4$5Yf4?Z,$77BU5
+4$5Yu9MK8<DJF!*C2@d&Ci4!(DJF!*C2@d&Ci4!(DL6_YC2@d&Ci4H=FD>W0C2@cL4?YPY1cmf_
+@q9/=PEWr(`S'&'m.9o6m-ilnkLnYI]=bh9Mi;.VAM,Mc,U4Q[,:"NZ,VCW"/hAS,/1iJ*/M8S+
+/hAS31c/02<GH>fC2@d&Ci4!(DJF!*C2@d&Ci4!(DJF!*@q9.Q>[CoNAQW2D=Bo07>[D/]DJF!*
+C2@d&Ci4THI;3S9N/NWe9MGWk"9\c/"9J]/!X&W-"BY^.TE58&!X,h2"J>f!ZN:99!X,.t"LA.4
+TE58&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,.t"J>f!ZN:9&!X,.t"LA.4TE57h!X,h2"J>f!
+TE57h!X,h2"J>f!TE57h!X,.t"LA.4TE57h!X,h2"J>f!TE58&!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+PQCu\!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X+_h"J>f!TE57\!X,.t"I&rjTE57\!X,.t"I&rj
+TE57\!X,.t"I&rjTE57\!X+_h"J>f!PQCu\!X+_h"I&rjPQCuP!X+_h"I&rjTE57\!X,eG)X5f(
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq:L@<ZN:9&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,.t"LA.4
+TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!
+TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!
+TE58&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4ZN:99!X,.t"LA.4
+TE58&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X,h2"LA.4ZN:99!X-.D%^Q3>
+]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P
+]F,4U!X-.D%_N/Z]F,4U!X-.D%_N/Z]F,4^$P'fW%^Q3>]F,4^$P'fW%_N/Z]F,4^$P'KE"M>*P
+]F,4^$P'fW%_N/Z]F,4^$P'fW%^Q3>]F,4^$P'KE"M>*P]F,4^$P'KE"M>*P]F,4^$P'KE"M>*P
+ZN:99!X,h2"M>*P]F,4^$P'fW%_N/Z]F,4^$P'KE"M>*P]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P
+ZN:9B$P'KE"M>*P]F,4f,:)L>n*'-,i8j(SgtpK/f%A3ibKS5L`Pod7`MB?+4$5Z.>[CoNAQW2D
+@q9.\A7]7]ARf7^@q9.Q>[CN;?<CH==Bo07>[CoNAQW2D=Bo0BA7]LlDI[3g@q9.\A7^RMK^A='
+o_/+IoC_&&kMYFag"bH;gtp]-b6.kL"9J_!!X,h2"LA.4ZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>
+ZN:9B$P'KE"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ji#%.pA*q=n)39ig"bH;gtp5uc-+>UUnskK4?YPY1cmf_779R+4?Z;19m_58C2@d7H[TXFDJF!*
+C2@d&Ci3`nARf7^C2@d&Ci4!(DL6_YC2@d&Ci4!(DI[3g8k_r:1c.'H1aF:k/hAS",:#?54Zbbh
+779Qs/1hbZ)B'P5)B0S5)]BtH,U=T[,U4Q[,:"NZ,VCW"/hAS",:#-'1fRFS@q9.\A7]7]ARf7^
+@q9.cCi3`nASQ%!@q9.\A7]7]AQW2D=Bo0BA7]7]ARf7^C2@d&Ci4!(DJF!*C2@d&Ci5c7S-/lr
+"9J]/!X&W-"9\c/"9J_!!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"LA.4TE58&!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,.t"LA.4
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4
+TE57h!X,h2"J>f!TE58&!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57\!X,.t"J>f!TE57h!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X,.t"I&rjTE57h!X+_h"J>f!
+PQCu\!X,.t"I&rjTE57h!X+_h"J>f!TE57h!X+_h"J>f!TE57\!X,.t"J>f!PQCu\!X+_h"J>f!
+PQCu\!X+_h"I&rjTE57\!X,.t"J>f!PQCu\!X+_h"I&rjTE57h!X.28GlRgDs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8U]h]tYC$TE57h!X,h2"J>f!TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4
+TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
+ZN:99!X,.t"LA.4ZN:9&!X,h2"LA.4TE58&!X,h2"J>f!ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4
+TE58&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:99!X,h2"LA.4TE58&!X,h2"LA.4
+ZN:99!X,.t"LA.4TE58&!X,.t"LA.4ZN:9&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:9B$P'KE"M>*PZN:9B$P'KE"LA.4
+ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'fW%_N/Z]F,4^$P'fW%_N/Z
+ZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P
+ZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*P]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
+]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%^Q3>
+]F,4^$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*P]F,4U!X-.D%_N/Z]F,4U!X-.D%^Q3>
+]F,4U!X,h2"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%_N/Z]F,4U!X-.D%^Q3>]F,4U!X,h2"Qc//
+kj7d%m-ilnkLnYIdaZjkbg">Tc,@T?bKS4@A7\A,9k.^F@q9.\A7]7]AQW2D=Bo07>[CN;?<CH=
+=Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo0BA7]7]ARf7^`5T^^oC_JAp#+oog"bH;gtpK/f#u:^
+H[C/D!X'kP"LA.4ZN:9B$P'KE"M>*PZN:9B$P'KE"LA.4ZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>
+]F,4U!X-.D%^Q3>]F,4U!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,_S.,!D4kj7ckgtp`>hTO-f
+bKS5L`Pl=tAM,Mc/hAS31c.9V4[hb-GB@qRH[U6fI<TdTC2@d&Ci4!(DI[3g@q9.Q>[D/]DJF!*
+C2@d&Ci4!(DJF!*C2@d&Ci3`nAQW2D779R%1c-I&,VCW")B0S5)]BV6)B'P5)B0S?,:"0H)B'P5
+,U4QQ)]BV6)C-OQ,U4Q[,:#-'1eLG9=Bo07>[CN;?<CH==Bo0BA7]7]ARf7^=Bo0BA7]7]ARf7^
+=Bo0BA7\kJ?=RMW@q9.\A7]LlDI[3gC2@d&Ci4THI=$<h8k_q^!X&W-"9\c/"9J]/!X'kP"LA.4
+TE58&!X,h2"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4
+TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4
+TE57h!X,h2"J>f!TE58&!X,.t"J>f!TE57h!X,h2"J>f!ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4
+TE58&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"LA.4TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X+_h"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X+_h"J>f!
+PQCu\!X+_h"J>f!TE57\!X,.t"I&rjTE57\!X,.t"J>f!PQCu\!X,.t"I&rjTE57\!X,.t"I&rj
+PQCuP!X,.t"I&rjTE57\!X,.t"I&rjTE58#-7J]NiW&rXs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+=jQFQg9sXm(
+TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4
+ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"J>f!ZN:99!X,h2"LA.4ZN:9&!X,h2"J>f!
+ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4
+ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"J>f!ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:9B$P'KE"LA.4]F,4U!X,h2"LA.4
+]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>ZN:99!X,h2"LA.4]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P
+ZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>ZN:99!X,h2"LA.4ZN:99!X-.D%^Q3>]F,4U!X-.D%_N/Z
+ZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%^Q3>ZN:9B$P'KE"M>*P
+ZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'fW%_N/ZZN:9B$P'KE"M>*P
+]F,4U!X-.D%^Q3>]F,4^$P'fW%^Q3>]F,4U!X-.D%_N/Z]F,4^$P'KE"LA.4]F,4U!X-.D%_N/Z
+ZN:9B$P'fW%^Q3>]F,4U!X-.D%_N/Z]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'fW%^Q3>
+]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*P]F,4U!X-.D%_N/Z^DIgGjQGann)39ig"bH4eCMgec-+>U
+bKS5L`PnXLUcU\%=Bo0BA7]7]ARf7^@q9.\A7\kJ?=RMW=Bo07>[CN;?<CH=<)ck">[CN;?<CH=
+=Bo0BA7\kJ?=RMW@q9.tH[Y8Pp$D;Ci8j(ZjQFt@f#u:^bKS5Sbfpq*"9\c/PQD!#$P'KE"LA.4
+]F,4U!X,h2"LA.4ZN:9B$P'KE"LA.4]F,4U!X,h2"M>*PZN:99!X-.D%^Q3>ZN:99!X,h2"M>*P
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:9.AQ7@<hV$]@daZjkbg")F`Pfa7UnskE1c-g9/M8S+
+4$5Z9A7]t,FD>W0C2@d3FED86DJF!*@q9.\A7]7]AQW2D@q9.cCi4!(DJF!*C2@d&Ci4!(DHL.M
+@q9.\A7]7]AQW2D8k_r:1c-g9/L2Pd)B0S5)]BV6)B'P5)B0S5)]BV6)C-OQ)B0S?,:"lm/P8]2
+<)ck">[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CoNARf7^
+@q9.cCi4!(DJF!*C2@dHMi7c?"9\c/"9J]/!X&W-"9\c/L]R^c!X,h2"J>f!ZN:9&!X,h2"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,h2"LA.4TE57h!X,h2"J>f!
+TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!
+TE58&!X,.t"LA.4TE57h!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,h2"J>f!
+TE58&!X,.t"J>f!TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"I&rjTE57h!X+_h"J>f!TE57h!X+_h"J>f!TE57\!X,.t"I&rj
+TE57h!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X,.t"I&rjTE57h!X+_h"J>f!TE57\!X,.t"I&rj
+TE57\!X,.t"J>f!PQCu\!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X,.t"I&rjTE57\!X,.t"I&rj
+TE57\!X+_h"J>f!TE58NUQb`Xs8W-!s8W-!s8W-!s7H$\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7cZUn+gn"J>f!ZN:9&!X,.t"LA.4
+TE57h!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
+ZN:9&!X,h2"J>f!ZN:9&!X,h2"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4
+TE58&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4
+TE58&!X,h2"J>f!ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,.t"LA.4
+ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4]F,4U!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>
+ZN:9B$P'KE"M>*PZN:9B$P'KE"LA.4]F,4U!X,h2"LA.4]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4
+]F,4U!X-.D%_N/Z]F,4^$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
+]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*P]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/ZZN:9B$P'fW%^Q3>
+]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P]F,4^$P'KE"M>*P
+ZN:9B$P'fW%_N/ZZN:99!X-.D%_N/Z]F,4^$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>
+]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/Z]F,4U!X-.D%^Q3>]F,4^$P'fW%^Q3>]F,4U!X-.D%_N/Z
+]F,4U!X-.D%^Q3>]F,4U!X.\EETlcXi8j(`gt^T<hU9p)bKS5Sbg")F`Pfa7@q9.C9MJVo?<CH=
+=Bo07>[CoNAQW2D=Bo07>[CoNAQW2D=Bo07>[CN;?<CH==Bo07>[CN;?<CH=@q9.Q>[CoNA[JhO
+m.9o6m-iW_hU9p)daZjkbg")F`JB2#"9J]B!X,h2"LA.4]F,4U!X,h2"M>*PZN:9B$P'KE"M>*P
+ZN:9B$P'KE"LA.4]F,4U!X,h2"M>*PZN:99!X-.D%^Q3>ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>
+ZN:99!X,h2"J>f!\"o\FeCMgec,@T?`5T^6`PoI%]o7l./hAS31c/02<GH>fC2@d&Ci4!(DJF!*
+@q9.\A7]7]ARf7^@q9.\A7]7]ARf7^@q9.\A7]7]ARf7^=Bo0BA7\kJ?=RMW@q9.\A7]7]AQW2D
+=Bo0)9MIT24YA9;)B0S5)]BtH,U=T[,U4Qe/1iqG4\ACB<)cji9MJ,Q9iP(l8k_rO9MJ,Q9iP(l
+8k_rO9MJ,Q9hJ)R=Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo0BA7]7]ASQ%!C2@d7H[U6fI76Om
+"9J]/!X&W-"9\c/"9J]B!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4ZN:9&!X,h2"J>f!
+ZN:99!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
+ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,.t"LA.4
+TE57h!X,.t"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!TE57h!X,.t"J>f!TE58&!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X+_h"J>f!TE57\!X,.t"I&rjTE57h!X+_h"J>f!
+PQCu\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X,.t"I&rjTE57\!X,.t"I&rj
+TE57h!X+_h"J>f!PQCu\!X+_h"I&rjTE57\!X+_h"J>f!PQCuP!X+_h"J>f!PQCu\!X+_h"J>f!
+cV74!m-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!o_/+QpA*q=n)39ifZ_OL7OOi1"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
+TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4TE58&!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"LA.4TE58&!X,.t"LA.4
+TE58&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"J>f!ZN:99!X,h2"LA.4TE58&!X,h2"LA.4
+ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4ZN:99!X,.t"LA.4
+ZN:99!X,h2"LA.4TE58&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:9B$P'KE"M>*PZN:99!X,h2"LA.4ZN:9B$P'KE"LA.4ZN:9B$P'KE"LA.4
+]F,4U!X,h2"LA.4]F,4^$P'KE"LA.4]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4]F,4U!X,h2"LA.4
+ZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P
+]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%_N/Z
+ZN:9B$P'KE"M>*P]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'fW%_N/ZZN:9B$P'fW%_N/Z
+ZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'fW%^Q3>
+]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"MYcj
+k1nbUm-ilnkLnYIdaZk#bfe2Rc,@T?`5T]rXK=*+/Qc7a=Bo07>[CN;?<CH=@q9.\A7]7]AQW2D
+=Bo07>[D/]DHL.M=Bo0BA7]LlDI[3g=Bo0BA7]7]ARf7^C2@eOm-j0)n)39ig"bH;gtp5uc,@T?
+`5T\6)]Ah\"Gd*^ZN:99!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X,h2"LA.4ZN:9B$P'KE"LA.4
+]F,4U!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X+;\"N89u
+`5T^6`Pod7`Oidr]=bhh]Y.EP?:@7N=Bo0BA7]7]ARf7^@q9.\A7\kJ?=RMW=Bo07>[CoNARf7^
+@q9.\A7]7]ARf7^@q9.Q>[CN;?<CH=@q9.Q>[CoNAQW2D=Bo07>[CN;?<CH==Bo03<)lms<D#qZ
+8k_rY<)lms<E)pt<)cji9MJ,Q9hJ)R8k_rO9MJ,Q9hJ)R8k_rJ6q'O477BU58k_rO9MJ,Q9hJ)R
+8k_rY<)lms<E)pt8k_rO9MJVo?<CH==Bo0BA7]7]ASQ%!H[C/D!X&W-"9\c/"9J]/!X&W-"F1%O
+ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4TE57h!X,h2"J>f!
+ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4TE57h!X,.t"LA.4TE57h!X,.t"LA.4TE58&!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"LA.4TE58&!X,.t"J>f!TE57h!X,h2"J>f!TE57h!X,h2"J>f!
+TE57h!X,.t"J>f!TE57h!X,h2"J>f!TE57h!X,.t"J>f!TE57h!X,.t"LA.4TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"I&rjTE57h!X,.t"J>f!PQCu\!X,.t"J>f!
+TE57\!X,.t"J>f!TE57\!X,.t"J>f!TE57h!X,.t"I&rjTE57h!X,.t"J>f!PQCu\!X+_h"J>f!
+PQCu\!X,.t"I&rjTE57h!X,.t"J>f!PQCu\!X,.t"I&rjTE57\!X,.t"I&rjTE57\!X,.t"I&rj
+TE57\!X,.t"I&rjTE57\!X,.t"I&rjTE57\!X,.t"I&rjTE57\!X,.t"J>f!ke+/"s8W-!s8W-!
+s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+m.9o6m-j0)n)39iaGYJQ!X,.t"J>f!TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
+ZN:99!X,.t"LA.4TE58&!X,h2"LA.4TE58&!X,h2"J>f!ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4
+ZN:99!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"LA.4TE58&!X,.t"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"J>f!ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>
+ZN:99!X,h2"LA.4]F,4U!X,h2"LA.4]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4
+]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
+]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'fW%^Q3>
+]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
+]F,4^$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/Z
+ZN:9B$P'fW%_N/ZZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>
+]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P]F,4U!X-.D%_N/ZZN:9^KPp#?n)39ii8j(SgtpK/f#u:^
+`5T^6`Pp$Ec!t9q4$5Z.>[CN;?<CH==Bo07>[CN;?=RMW@q9.\A7]7]ARf7^C2@ctA7]LlDI[3g
+@q9.\A7]7]AQW2D=Bo07>[FeE[-[DWm.9o6m-iW_hV$]@daZjreCM"6ZigF5(BO`G!X,h2"M>*P
+ZN:99!X-.D%^Q3>ZN:99!X,h2"M>*PZN:9B$P'KE"LA.4]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:8W3]t@"`Pfa7]=bhh]Y1qi]t:qj
+X/rF<Ci3`nAQW2D@q9.Q>[CN;?<CH==Bo07>[CN;?<CH==Bo0BA7\kJ?=RMW=Bo0BA7\kJ?<CH=
+=Bo07>[CN;?=RMW@q9.\A7]7]AQW2D=Bo07>[CB/<E)pt<)cjs<)lms<D#qZ8k_rO9MJ,Q9hJ)R
+8k_rO9MIrD77BU5779R56q'O477BU5779R:9MIrD77BU58k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9itY,
+=Bo07>[CN;?=RMW@q9.tH[Uj2N!'1b"9J]/!X&W-"9\c/(BO`G!X,.t"LA.4ZN:9&!X,h2"J>f!
+ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!
+ZN:9&!X,h2"J>f!ZN:9&!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,.t"LA.4TE58&!X,.t"LA.4
+TE57h!X,.t"LA.4TE57h!X,h2"J>f!TE57h!X,.t"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,h2"J>f!TE57h!X,h2"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!PQCu\!X,.t"J>f!TE57\!X,.t"J>f!
+TE57\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X+_h"I&rj
+TE57\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X+_h"I&rjTE57\!X+_h"J>f!PQCu\!X+_h"I&rj
+TE57\!X+_h"I&rjTE57\!X+_h"I&rjPQCu\!X+_h"O(=ds8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVkj7d%m-ilnkLdGU
+`%3U8!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!TE58&!X,.t"LA.4TE57h!X,h2"J>f!
+ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"LA.4
+TE58&!X,.t"LA.4TE58&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4
+ZN:9&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4TE58&!X,h2"J>f!ZN:99!X,.t"LA.4
+ZN:99!X,h2"LA.4TE58&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"M>*PZN:99!X,h2"M>*P
+ZN:9B$P'KE"LA.4ZN:99!X,h2"M>*PZN:99!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"LA.4
+]F,4U!X-.D%^Q3>]F,4U!X,h2"M>*PZN:9B$P'KE"M>*PZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>
+]F,4U!X-.D%^Q3>]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4U!X-.D%_N/Z
+ZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4^$P'KE"M>*P
+ZN:9B$P'fW%^Q3>]F,4U!X-.D%_N/Z]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*PZN:9B$P'fW%^Q3>
+]F,4^$P'KE"M>*P]F,4^$P'KE"M>*PZN:9B$P'fW%^Q3>ZN:9B$P'fW%^Q3>]F,4U!X-.D%^Q3>
+]F,4^$P'KE"M>*PZN:9B$P'fW%d)R%kj7d%m-iW_hU9p)bKS5Sbg">Tc,@T?['[1m/1jIf9iP(l
+<)cji9MJJc<ENL4=Bo07>[CN;?<CH=@q9.\A7]LlDJF!*@q9.cCi4!(DI[3g@q9.Q>[CN;?>=:o
+m.9oBpA+@Sq<[_Gkj7ckgtp`>hV$]@`5T[u!X*cM"LA.4ZN:99!X-.D%^Q3>ZN:9B$P'KE"M>*P
+ZN:99!X-.D%^Q3>]F,4U!X,h2"M>*PZN:99!X,h2"LA.4]F,4U!X,h2"M>*PZN:99!X-.D%^Q3>
+ZN:99!X,h2"LA.4ZN:99!X,h2"J>f!Q]-g?`PoI%]u7n/]=bhh]Y1qi]qhL#@q9.Q>[CN;?<CH=
+=Bo07>[CN;?;sm(<)ck">[CN;?<CH==Bo07>[CoNAQW2D@q9.\A7\kJ?=RMW=Bo0BA7]7]ARf7^
+@q9.\A7\kJ?<CH==Bo07>[CN;?;sm(<)cji9MJ,Q9hJ)R779R56q'1"4[hb-779R56q'O477BU5
+779R56q'O477BU5779R56q'O476<Up779R:9MJ,Q9hJ)R8k_rO9MJ,Q9itY,@q9.\A7]7]AXo?^
+bKS5<['V(s(^'mC"9J]/!X*cM"J>f!ZN:99!X,.t"LA.4TE58&!X,h2"J>f!ZN:99!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!TE58&!X,.t"LA.4
+TE58&!X,.t"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,.t"J>f!TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!
+TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE57h!X,.t"J>f!TE57h!X,.t"LA.4TE57h!X,.t"LA.4
+TE58&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!ZN:9&!X,.t"J>f!TE57h!X,h2"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57\!X,.t"J>f!TE57h!X,.t"J>f!TE57\!X,.t"J>f!TE57h!X+_h"J>f!TE57h!X+_h"J>f!
+TE57\!X,.t"J>f!PQCu\!X,.t"I&rjTE57h!X+_h"J>f!TE57h!X+_h"J>f!PQCu\!X+_h"I&rj
+TE57\!X,.t"I&rjPQCu\!X+_h"J>f!PQCu\!X+_h"I&rjTE57\!X+_h"J>f!PQCu\!X+_h"I&rj
+PQCu\!X+_h"J>f!PQCuP!X,eG)Ud-ds8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8VHWp$D;Ckj7d%m-iW_hT0eFZN:9&!X,h2"J>f!
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,h2"J>f!ZN:9&!X,h2"LA.4TE58&!X,.t"LA.4ZN:9&!X,h2"J>f!
+ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4ZN:9&!X,h2"LA.4ZN:9&!X,h2"LA.4ZN:9&!X,h2"LA.4
+TE58&!X,.t"LA.4TE58&!X,h2"LA.4TE58&!X,h2"LA.4ZN:99!X,.t"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+]F,4U!X,h2"LA.4]F,4U!X,h2"M>*PZN:99!X,h2"M>*PZN:99!X-.D%^Q3>ZN:9B$P'KE"M>*P
+ZN:99!X-.D%^Q3>ZN:99!X,h2"M>*PZN:99!X,h2"LA.4]F,4U!X-.D%^Q3>ZN:9B$P'KE"M>*P
+ZN:9B$P'KE"LA.4]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
+]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>ZN:9B$P'KE"M>*P
+ZN:9B$P'KE"M>*P]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>]F,4U!X-.D%^Q3>
+]F,4U!X-.D%_N/Z]F,4U!X-.D%_N/ZZN:9B$P'KE"M>*P]F,4^$P'fW%^Q3>]F,4U!X-.D%^Q3>
+]F,4U!X-.D%^Q3>]F,4^$P'KE"M>*PZN:9B$P'fW%^Q3>]F,4^$P'KE"M>*PZN:9B$P'KE"M>*P
+fQCHnm-!<fkN:RTg"bH4eCMgec-+>U`5T^6`PlS.DD!Il<)cji9MJJc<E)pt=Bo0)9MJVo?<CH=
+=Bo0BA7\kJ?=RMWC2@ctA7]7]ASQ%!C2@ctA7\kJ?<CH==Bo1.V53bWq>^Kpo_/+IoC_>6n*'-,
+i8j(SgtpuMk;iYIZN:99!X,h2"M>*PZN:99!X-.D%^Q3>ZN:9B$P'KE"M>*PZN:99!X,h2"M>*P
+ZN:99!X-.D%^Q3>ZN:9B$P'KE"LA.4]F,4U!X,h2"M>*PZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,#/'ZRes]=bhh]Y1qi]t:qj]=bhh]Y0_sP?;'r<)cjs<)lms<D#qZ8k_rY<)lms<E)pt
+=Bo07>[CN;?<CH==Bo0BA7\kJ?=RMW=Bo07>[CN;?=RMW@q9.cCi3`nAQW2D=Bo07>[CN;?<CH=
+=Bo07>[CB/<D#qZ<)cji9MIrD77BU5779R56q'O477BU5779R56q'O477BU5779R56q'O477BU5
+779R56q'^A9gqH=8k_rO9MJ,Q9hJ)R<)ck">[CN;?=RMWH[C1abg"Scf$`(!g"bG2H[Q"u";_+B
+ZN:99!X,.t"LA.4ZN:9&!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:99!X,.t"LA.4TE58&!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE58&!X,.t"J>f!ZN:9&!X,.t"LA.4
+TE58&!X,.t"LA.4TE58&!X,.t"J>f!TE58&!X,.t"J>f!TE58&!X,.t"LA.4TE57h!X,.t"J>f!
+TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!TE57h!X,.t"LA.4TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE58&!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!
+TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X,.t"J>f!TE57h!X+_h"J>f!
+TE57h!X+_h"J>f!TE57\!X,.t"J>f!TE57\!X,.t"I&rjTE57h!X+_h"J>f!TE57\!X,.t"I&rj
+TE57h!X+_h"J>f!TE57\!X,.t"I&rjTE57h!X+_h"J>f!PQCu\!X+_h"J>f!PQCu\!X+_h"J>f!
+PQCu\!X+_h"I&rjTE57\!X+_h"J>f!PQCuP!X,.t"I&rjTE57\!X,.t"I&rjPQCuP!X,.t"I&rj
+TE57h!X-GgIK0?Is8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+@Sq<726kj7crjQG1&XKiZ]TE57h!X,h2"J>f!TE57h!X,h2"J>f!
+TE58&!X,.t"LA.4TE58&!X,.t"LA.4TE57h!X,h2"J>f!ZN:9&!X,h2"J>f!ZN:9&!X,h2"LA.4
+TE58&!X,.t"LA.4ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:9&!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4ZN:99!X,h2"LA.4
+ZN:99!X,h2"LA.4ZN:99!X-.D%^Q3>ZN:99!X,h2"LA.4ZN:9B$P'KE"LA.4ZN:9B$P'KE"LA.4
+]F,4U!X-.D%_N/Z]F,4^$P'fW%_N/Z]F,4^$P'fW%_N/Z]F,4^$P'fW%_iht]F,4^$P'fW%_N/Z
+]F,4^$P'fW%_iht]F,4a(`9mn%_iht]F,4a(`:")(q^4d^DIg#$P'og(r$n)^DIg&(`:")(r$n)
+^DIg&(`:")(r$n)^DIg&(`:")(r$n)^DIg+,:(#@(r$n)`$6PB(`:")(r$n)^DIg+,:(2P,fCoQ
+^DIg+,:(2P,fCoQ^DIg+,:(2P,fCoQ`$6PG/25!e,fD5f`$6PG,:(2Y0Z51]`%3U\,:(2Y0Z5Lr
+`%3U\/25!n0Z5Lr`%3U\/25!n0Z5Lr`%3U\2E8W535d@%`&9Tn/25"#35d@%`&9Tn/25"#35d@%
+`&9Tn2E8W535d^7`&9Tn2E8W535d^7`&9Tn2E8W536XKL`&9U!4?pbB36XKL`&9Tn2E8W536XKL
+`&9Tn2E8oC5Kl5SbWJ,64?q%P5Kl5SbWJ,64?q%P5Kl5SbWJ,66q#6]5KlM`bWJ,66q#6]5KlM`
+bWJ,66q#6]5KlM`bX=kF9i&u$7*eS'cV73]9i')0:X;a2cV73]9i($(fBDSii8j(SgtpK/f%A3i
+bKS5L`Pod7`O*"Z/hASC6q'^A9hJ)R<)ck">[CB/<ENL4<)ck">[CN;?<CH==Bo0BA7\kJ?=RMW
+=Bo0BA7\kJ?=RMW@q9.Q>[CoNAaK$]s8W-!s8W-!s7H$\m.9o6m-j0)n*'-,kj7cVH[Wq>:!?R=
+bZ%]g<*7@D=Nj`HbZ%]g<*7@D=Nj`HbZ%]g<*7XV7*K+ObZ%]g<*7@RA^"+Ue6YPe<*7@RA^"+U
+b[P/-@V*bmA^"Upb[P/-@V+5(8'GFRb[P/-@V*b_=Nk5cb[P/-<*6_;7Ee_5[o5>sUnG?4]u7n/
+]=bhh]Y1qi]t:qj]=bh(H[Sjm<ENL4<)cjs<)m%*?:mmc<)cjs<)lms<ENL4=Bo07>[CN;?<CH=
+=Bo07>[CN;?<CH=@q9.\A7]7]ASQ%!C2@ctA7]7]AQW2D=Bo07>[CN;?<CH==Bo07>[CB/<D#qZ
+8k_rJ6q'O476<Up779R+4?Z,$77BU5779R+4?Z,$76<Up779R56q'1"4[hb-779R:9MJ,Q9hJ)R
+8k_rY<)lms<ENL4@q9.\A7`-T[+X6ki8j(Sgtp`>hV$]@]=bhdHtpTHIE6M:`-ZpRFC)n4IDgJ\
+aa@a>H[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\
+`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\
+`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\`-ZpNH[WhZIDgJ\aFnTPH[WtgEl<<Q\V5:HH[WGYGf4rW
+\V5:HH[WtgEl<<QaGYJbH[WGYGfYek`-ZpRMg`NjIE7=p`-ZpRMg`'oKuf1#\VbdUMg`[)IE7=p
+\VbdUMg`-nI)q4o\VbdUMg`'oKuf1#[uH*_Mg`[)ICG2iaGYJUNJ5H3ICY5_aHM:dNJ5H;KXZqp
+aHM:dNJ5H;KXZqp[uH*NNJ4j$Kt!%q\<Di\PDcr7Mn"t/aHM:dNJ4m+Mn"t/aHM:dNJ4m+Mn"t/
+\<Di\PDcr7Mn"t/[uH*OPDco0Kt*>)[uH*OPDcu?Pdlp8\<Di\PDcu?Pdlp8\<Di\PDcr7Mn,:@
+\XJbnRZt@OPe!6I\XJbnRZt@OPe!6I\XJbnRZtmhS[YDfaK25ZXJO">V:`/VfY"ZF]XHG1^#d2L
+k01s3e^s'9fD*k;l.+DMe^s'9fBLi;l.+DMe^s'9fBLi;l.+DJgt_/EfD44Ll.+DXpA+ags8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+QpA+@Sq<[_Gm.9o6m-j)\al^ghf>PATbff.mak4h\fZ_P$bfSM]bLk%^fZ_OkbfeY_bLk%^
+fZ_Okbff8$f@\<jdaZk4e^rHtbL4nkl.+D6eCNm7f@&1"l.+D=gtq;GfB1lDl.+D=gtq;Gf@es9
+k1nbFgtq;Gf@es9k1nbSgt_&IgtCK>i8j(`gt_&IgudDIg"bHHgt^iKkMYFai8j(ZjQG[\h!"+n
+k1nbMjQGI^kN:RTi8j(bm-ilnkNM:$i8j(bm-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
+m.9o6m-j<4p#tc2m.9o6m-j<4p#tc2o_/+Em-jT?q<726o_/+Em-jT?q<726o_/+Em-j<4p#tc2
+m.9oEm-!a,p$D;Ckj7d1pA*q=n*'-,o_/+Tm-"$7q<726o_/+Tm-"$7q=j7=o_/+Tm-"$7q=j7=
+o_/+Tm-"$7q=OCVo_/+Tm-"$7q=OCVp[%)8pA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=j7=
+o_/+QpA+@Sq=j7=o_/+QpA+ILkOeKDp[%)8pA+@Sq=OCVo_/+QpA+ILkOeKDo_/+QpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+\s8W-!s7H$\o_/+QpA+@Sq=OCVo_/+QpA+ags7H$\
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+\s8V`bq=OCVo_/+\s8V`bq=OCVo_/+QpA+ags7H$\
+o_/+\s8V`bq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+\s8V`bq=OCVo_/+QpA+ags7H$\s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq=OCVkj7d%m-ilnkLnYIdaZjkbg">Tc,@T?`5T]>FEB,d/P8]2
+8k_rO9MJJc<ENL4<)ck">[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH=
+S=Z8CpA+ags8W-!s8W-!s8W-!s7H$\m.9o:oC_JAp$D;Ckj7d1pA+@Sq=OCVm.9oBpA+(Hp%7tR
+m.9oBpA+(Hp%7tRkj7d1pA+@Sq=OCVp[%)0oC_JAp%7tRp[%)0oC_bLq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+ILkNM:$kj7crjQG4OhV$]@daZjkbg")F`Pfa7`k8mp]Y1qi]t:qj]=bhh]Y1qi]t:qj
+H[C059MJJc<E)pt<)cjs<)lms<E)pt<)ck">[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH=
+C2@d&Ci3`nAQW2D=Bo07>[CN;?<CH=<)cji9MJJc<E)pt8k_rY<)lOa9hJ)R8k_rO9MIrD77p6J
+8k_rO9MJ,Q9hJ)R779R56q'O477p6J8k_rO9MJ,Q9hJ)R8k_rO9MJVo?:mmc=Bo07>[CN;?Asf$
+kj7d%m-ilnkNM:$kj7crjQGann)39ii8j(ZjQGI^kMYFai8j(ZjQGI^kN:RTi8j(SgtpuMkLnYI
+i8j(SgtpuMkLnYIi8j(ZjQGI^kLnYIi8j(ZjQG4OhVdJXg"bHBjQGI^kLnYIi8j(SgtpuMkLnYI
+i8j(SgtpuMkLnYIi8j(ZjQGI^kMYFai8j(SgtpuMkLnYIi8j(SgtpuMkLnYIi8j(Sgtp`>hV$]@
+g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hVdJX
+g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@daZk$gtpK/f%Jj8daZjreCN'tf$`(!
+daZjreCN'tf$`(!daZjreCN'tf$`(!daZjreCN'tf$`(!daZjreCN'tf$`(!daZjreCN'tf%Jj8
+daZk$gtpK/f%Jj8daZjreCN'tf$`(!daZjreCN'tf$`(!daZjreCN'tf#u:^daZjreCN'tf#u:^
+daZjkbg"Scf#u:^daZjkbg"Scf#u:^bKS5ZeCMgec-k+mbKS5Sbg">Tc-+>UdaZjkbg">Tc-+>U
+bKS5ZeCMgec-k+mbKS5ZeCN'tf&5WPi8j(bm-j0)n*KZ=m.9oMs8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCV
+kj7d)oC_>6n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
+m.9oEm-!U!n*'-,kj7d1pA*q=n*KZ=kj7d)oC_JAp#tc2m.9oBpA*q=n*KZ=m.9o:oC_JAp$D;C
+m.9oBpA+@Sq=OCVm.9o:oC_bLq=OCVm.9oBpA+@Sq=OCVo_/+IoC_JAp%Rh9m.9oBpA+(Hp%7tR
+o_/+QpA+@Sq=OCVp[%)8pA+(Hp%Rh9o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
+s8W,kpA+@Sq=OCVo_/+QpA+@Sq>^Kpo_/+QpA+@Sq>^Kpo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+\s8V`bq>^Kpo_/+\s8V`bq>^Kp
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\
+s8W-!s8V`bq>^Kps8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+QpA*q=n)39ig"bH4eCMgec-+>U`5T^6`PoI%]eqW'779R:9MJ,Q9hJ)R8k_rO9MJVo?:mmc
+=Bo0)9MJJc<E)pt<)ck">[C#r9hJ)R8k_rO9MJ,Q9iP(l<)ck">[Hdgp&G'ls8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+QpA+ags7H$\o_/+QpA+@Sq=OCVo_/+QpA+ags7H$\
+o_/+\s8V`bq>^Kps8W,kpA+ags8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA+(Hp#tc2
+i8j(SgtpK/f$`(!bKS5L`Pod7`Pfa7]=bhq`PoI%]t:qj`5T^-]Y1\Z[!-V6=Bo03<)m%*?;sm(
+<)cji9MJJc<E)pt<)ck">[C#r9iP(l<)cjs<)lms<E)pt=Bo07>[CN;?=RMW@q9.\A7\kJ?<CH=
+=Bo07>[CN;?<CH=<)cjs<)m%*?;sm(<)cji9MJ,Q9hJ)R8k_rO9MJJc<D#qZ8k_rO9MJ,Q9hJ)R
+8k_rO9MJ,Q9iP(l8k_r]>[CB/<E)pt<)ck">[CN;?<CH=C2@eGjQGn$p$D;Cm.9o:oC_JAp$D;C
+m.9o:oC_JAp$D;Cm.9o:oC_JAp#tc2kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
+kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,
+kj7d%m-j0)n*'-,kj7crjQGann)39ikj7crjQGI^kMYFakj7crjQGI^kMYFakj7crjQGI^kMYFa
+i8j(bm-j0)n)39ikj7crjQGI^kNM:$i8j(bm-ilnkNM:$kj7crjQGI^kNM:$i8j(ZjQGann)39i
+kj7crjQGI^kMYFai8j(ZjQGI^kMYFai8j(SgtpuMkMYFag"bHBjQGI^kMYFag"bHBjQGI^kLnYI
+i8j(ZjQG4OhVdJXi8j(SgtpuMkLnYIi8j(SgtpuMkMYFai8j(Sgtp`>hVdJXg"bH;gtp`>hV$]@
+i8j(SgtpuMkLnYIg"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@daZk$gtp`>hV$]@
+g"bH;gtp`>hV$]@g"bH;gtp`>hV$]@g"bH;gtpK/f%Jj8g"bH;gtp`>hU9p)g"bH;gtp`>hV$]@
+i8j(ZjQGI^kNM:$m.9oBpA+@Sq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq<[_Go_/+QpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVs8W,kpA+@Sq>^Kpo_/+\s8W-!s7H$\s8W-!s8W-!s8W-!
+o_/+\s8V`bq=OCVo_/+QpA+ags7H$\s8W-!s8V`bq=OCVs8W,kpA+@Sq=OCVs8W,kpA+ags8W-!
+o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7crjQG4OhU9p)
+fZ_O^bg")F`Pfa7H[C/n/1jIf9hJ)R8k_rO9MJ,Q9hJ)R<)cji9MJVo?<CH=8k_rO9MJ,Q9hJ)R
+8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9oP!hs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+IoC_>6n)39ig"bH4eCN'tf#u:^
+`5T^6`PoI%]t:qj]=bhh]Y1qi]t:qj]=bha['Y1,I99`\<)cjs<)lms<E)pt<)ck">[C#r9iP(l
+8k_rY<)lOa9itY,8k_r]>[CN;?<CH==Bo0BA7\kJ?<CH=@q9.Q>[CN;?<CH=<)cji9MJJc<ENL4
+<)ck">[CB/<E)pt<)cjs<)lms<E)pt<)cjs<)lms<E)pt<)cji9MJJc<D#qZ=Bo03<)m%*?<CH=
+=Bo03<)m%*?<CH==Bo0BA7a3=f'N#$m.9oBpA+@Sq=OCVs8W-!s8W-!s7H$\o_/+QpA+@Sq=OCV
+o_/+QpA+ags7H$\o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+(Hp%7tRo_/+IoC_bLq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVm.9o:oC_bLq<[_G
+m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp#tc2m.9o:oC_>6n*KZ=
+m.9o6m-j<4p$D;Ckj7d)oC_>6n*KZ=kj7d)oC_JAp#tc2m.9o6m-j<4p$D;Ckj7d%m-j<4p#tc2
+kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,i8j(bm-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-ilnkNM:$
+kj7d%m-j0)n*'-,kj7crjQGann*'-,kj7crjQGann*'-,kj7d%m-ilnkNM:$kj7d%m-j0)n*'-,
+i8j(bm-ilnkMYFai8j(ZjQGI^kLnYIi8j(ZjQGI^kMYFai8j(SgtpuMkMYFai8j(SgtpuMkMYFa
+i8j(ZjQGI^kMYFai8j(ZjQGI^kMYFai8j(ZjQGI^kMYFai8j(ZjQGann*'-,kj7d%m-j<4p$D;C
+o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8V`bq>^Kp
+o_/+\s8W-!s7H$\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+QpA*Y-kN:RTdaZjreCMgec-+>U`5T^-]Y-0Z1eLG9
+<)cji9MJ,Q9hJ)R8k_rO9MIrD77p6J779R:9MJ,Q9gqH=8k_r@4?Ybg4Zbbh4$5Yf4?Ybg4Zbbh
+779T.m-juSs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n(HLQdaZjreCMgec,@T?`5T^6`Pod7`Oidr
+]=bhh]Y1qi]t:qj['[2eH[SL[9itY,<)ck">[CB/<ENL4<)cjs<)lOa9hJ)R8k_rY<)lOa9hJ)R
+=Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo03<)lms<E)pt<)cjs<)lOa9iP(l<)cjs<)m%*?<CH=
+<)ck">[CB/<E)pt=Bo07>[CN;?;sm(<)cjs<)m%*?<CH==Bo07>[CN;?<CH==Bo07>[CoNA\5Ug
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8V`bq>^Kps8W-!s8W-!s8W-!o_/+\s8V`bq>^Kpo_/+\s8V`bq>^Kpo_/+\s8V`bq=OCV
+o_/+QpA+@Sq<[_Go_/+QpA+@Sq=OCVo_/+QpA+(Hp%7tRo_/+QpA+@Sq=OCVo_/+QpA+@Sq<[_G
+o_/+QpA+(Hp%7tRo_/+IoC_bLq=OCVm.9oBpA+@Sq=OCVo_/+IoC_bLq<[_Gm.9o:oC_JAp$D;C
+m.9o:oC_JAp$D;Cm.9o:oC_JAp#tc2m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;C
+m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_>6n*'-,kj7d%m-j0)n*KZ=kj7d%m-j0)n*'-,
+kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n*'-,kj7d%m-j0)n)39ikj7d%m-ilnkNM:$
+kj7d%m-j0)n*'-,kj7crjQGann*'-,kj7d)oC_JAp$D;Co_/+QpA+@Sq=OCVs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8VHWp#tc2i8j(SgtpK/f#u:^bKS5L`Pod7`Hur[/hASH9MJ,Q9hJ)R8k_rJ6q'O476<Up
+8k_rJ6q'O477BU5779R+4?Ybg4Zbbh4$5Yf4?Ybg4Zbbh4$5Yf4?\%<IJ!7/s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s7H$\kj7crjQGI^kL.l2daZjkbg")F`Pfa7]=bhh]Y28&`Oidr]=bhh]Y1qi]sP/R
+H[C0C>[CN;?;sm(<)cjs<)lms<D#qZ<)cji9MJ,Q9hJ)R8k_r]>[CB/<ENL4=Bo07>[CN;?<CH=
+=Bo03<)lOa9iP(l8k_rO9MJ,Q9iP(l<)cjs<)lms<ENL4<)ck">[CB/<ENL4<)ck">[CB/<ENL4
+=Bo07>[CB/<ENL4=Bo07>[CN;?=RMW=Bo07>[CN;?=RMW]=biLpA+ags8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8W-!s8W-!o_/+\s8V`bq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+ags7H$\
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+IoC_bLq=OCVm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;C
+m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;C
+m.9o:oC_JAp$D;Co_/+QpA+@Sq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\m.9o6m-ilnkL.l2
+daZjkbg">Tc,@T?]=bg71c.9V4\ACB8k_rJ6q'^A9gqH=779R56q'O476<Up8k_rJ6q'^A9fkI#
+4$5Yf4?Ybg4Zbbh4$5Yf4?Ybg4Zbbhg"bHas8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
+i8j(Sgtp`>hU9p)bKS5Sbg")F`Pfa7`5T^-]Y1qi]t:qj]=bhh]Y1qi]o7l.<)ck">[CB/<ENL4
+<)cjs<)lOa9iP(l8k_rO9MJJc<D#qZ<)cjs<)lms<ENL4=Bo07>[CN;?<CH==Bo03<)lms<E)pt
+8k_rY<)lOa9iP(l<)ck">[CB/<E)pt=Bo0)9MJJc<E)pt<)ck">[CN;?<CH==Bo07>[CN;?<CH=
+@q9.Q>[CN;?<CH=C2@e@gtr)2s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+ags8W-!s8W,kpA+@Sq>^Kpo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCV
+o_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVo_/+QpA+@Sq=OCVs8W,kpA+ags8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq>^Kp
+o_/+\s8V`bq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#+oog"bH4eCMgec-+>U`5T^6`Pm1NI3^$_
+8k_r@4?Ybg4Zbbh4$5Yf4?Ybg4Zbbh779R56q'O477BU5779R56q'O477BU5779R56q'^A9gqH=
+779RZCi8n=q>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+(Hp#tc2g"bH;gtpK/f#u:^
+`5T^6`Pod7`Oidr`5T^-]Y1qi]t:qj]=bhh]Y0i,S60$&<)ck">[CB/<E)pt<)cjs<)m%*?<CH=
+<)ck">[CB/<E)pt<)cjs<)lms<ENL4=Bo07>[CB/<E)pt8k_rY<)lms<E)pt=Bo07>[CB/<E)pt
+<)cji9MJ,Q9iP(l<)ck">[CN;?<CH==Bo07>[CoNARf7^=Bo0BA7\kJ?=RMW=Bo0kMi@#op&G'l
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s6T@Mkj7d#gt^?-f$`(!bKS5L`Pod7`Pfa78k_r@4?Ybg4Zbbh4$5Yf4?Z,$76<Up
+4$5Yf4?Ybg4Zbbh779R56q'^A9fkI#779R56q'O477BU5779R56q'O47G6JQs8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+Em-j0)n)39ig"bH;gtpK/f#u:^bKS5L`Pod7`Oidr
+`5T^-]Y1qi]t:qj]=bhQV5.jBDH'S8=Bo03<)lms<ENL4=Bo07>[CN;?<CH==Bo03<)lms<D#qZ
+=Bo07>[CN;?<CH=<)ck">[CB/<E)pt<)cjs<)lms<ENL4=Bo03<)m%*?;sm(8k_rO9MJJc<ENL4
+=Bo07>[CoNARf7^@q9.\A7]7]ARf7^@q9.tH[X>lf)PdMs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W,kpA+ags8W-!s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,coC_>6n)39i
+g"bH4eCMgec-+>UbKS5C]Y,pK/NZ'X4$5YY/1i_91c7*H4$5Yf4?Z,$77p6J8k_rJ6q'^A9gqH=
+4$5Yu9MIrD77p6J8k_rO9MJ,Q9hJ)RC2@e[pA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!m.9o6m-ilnkMYFag"bH4eCN'tf#u:^bKS5L`Pod7`Pfa7]=bhq`PoI%]t:qj
+['[2rKS3H4?<CH=@q9.Q>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH=
+<)cjs<)lms<E)pt<)ck">[CB/<ENL4=Bo03<)m%*?<CH==Bo07>[CN;?<CH=@q9.\A7]LlDJF!*
+C2@d&Ci6kt^%D$oo_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq>^Kp
+s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\kj7crjQG4OhU9p)daZjreCMgec(q23
+/hAS31c.'H1bL=22)I-B/1iqG4Zbbh779R56q'1"4[hb-779R+4?Z;19gqH=779R:9MJ,Q9gqH=
+8k_rO9MN^Sc2[hDs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s6T@M
+m.9o.jQGI^kLnYIg"bH4eCN'tf#u:^bKS5Sbg")F`Pfa7`5T^6`PoI%]t:qjUnsl6H[TC7ARf7^
+=Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CN;?<CH==Bo07>[CB/<E)pt=Bo03<)lms<ENL4
+8k_r]>[CB/<E)pt<)ck">[CN;?<CH=@q9.\A7]LlDI[3gC2@d7H[W9.[/^1+s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8V`bq>^Kp
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8VHWp#tc2i8j(ZjQG4OhU9p)daZj(KS23>1bL=2/hAS31c-g9/N#@A
+2)I-O4?Z,$77p6J8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9knK^o_/+\s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o.jQGI^kLnYI
+g"bH;gtpK/f$`(!bKS5Sbg">Tc,@T?bKS5L`Pod7`OidrS=Z6tH[TC7AQW2D=Bo07>[CN;?<CH=
+@q9.Q>[CN;?<CH=8k_r]>[C#r9iP(l<)ck">[C#r9itY,<)cjs<)m%*?:mmc<)ck">[CB/<ENL4
+=Bo07>[CoNARf7^@q9/0Mi>j'c1L`*o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+QpA*q=n)39ii8j(ZjQGI^kG4rMC2@ci>[BKS4YA9;2)I-B/1iqG4Zbbh4$5Yp6q'^A9gqH=
+8k_rO9MJ,Q9iP(l<)cjs<)lms<D#qZ8k_sk]Y4@Fs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gkj7d)oC_&&kMYFag"bH;gtp`>hU9p)
+daZjreCN'tf#u:^daZjkbg">Tc-+>U['[3!Mi;CeDHL.M=Bo07>[CN;?<CH==Bo0)9MJVo?;sm(
+=Bo07>[C#r9iP(l<)cjs<)lms<E)pt<)ck">[C#r9iP(l8k_rO9MJVo?<CH=@q9/HV53>An+?>L
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+\s8W-!s7H$\s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+Em-j0)n*'-,
+kj7crjQGI^kMYFai8j(>`Po3k[%*_XN/NXAH[TC7AP,Wj4$5Yu9MJ,Q9iP(l<)cjs<)lms<E)pt
+8k_rY<)m%*?N:'*s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8V`bq<[_Gm.9o6m-j0)n)39ii8j(ZjQG4OhV$]@g"bH;gtpK/f$`(!
+g"bH4eCN=.hU9p)daZj[]Y0i,S9K's=Bo0)9MJ,Q9itY,=Bo0)9MJVo?:mmc8k_rO9MJ,Q9hJ)R
+8k_rO9MJ,Q9hJ)R8k_rO9MJ,Q9itY,S=Z8!eCO9cq=OCVs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8W-!s8W-!
+o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+IoC_JAp$D;Cm.9o:oC_>6n*KZ=
+kj7d)oC_>6n*KZ=m.9o:oC_&&kKD)o]=bhXXK@G>N-fo"=Bo03<)lms<E)pt['[4?s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W,kpA+@Sq<[_Gm.9o:oC_>6n*'-,i8j(ZjQGI^kLnYIi8j(ZjQG4OhVdJXg"bH;gtpuMkLnYI
+g"bHBjQG4OhSdCPUnslGMi<"0I99`\<)cjs<)lOa9hJ)R8k_rO9MJ,Q9hJ)R8k_r]>[EAIN3ot!
+i8j)$s8V`bq>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+@Sq=OCVm.9o:oC_JAp$D;Cm.9oBpA+@Sq=OCV
+o_/+\s8V`bq=OCVo_/+\s8V`bq>^Kpm.9o.jQH1/q>^Kps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8V`bq<[_G
+o_/+IoC_JAp$D;Ckj7d%m-j0)n)39ikj7crjQGann*'-,i8j(bm-j0)n*'-,kj7d)oC_JAp$D;C
+m.9o:oC_&&kL.l2daZjd`Pp$Ec-k+mg"bHBjQGn$p&G'lo_/+QpA+ags8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+o_/+\s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\o_/+IoC_bLq<[_G
+m.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Cm.9o:oC_JAp$D;Co_/+QpA+ags7H$\s8W,kpA+ags7H$\
+s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!o_/+\s8V`bq>^Kp
+s8W,kpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,kpA+ags7H$\o_/+QpA+(Hp%7tR
+o_/+QpA+ags8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!
+s8W-!s8W-!s8W-!s8W-!s8W-!s7H$\s8W-!s8W-!s8W-!s8W,kpA+ags8W-!o_/+\s8N~>
+Q
+cleartomark end end pagesave restore showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
diff --git a/doc/doxygen_logo.gif b/doc/doxygen_logo.gif
new file mode 100644
index 0000000..6b45597
--- /dev/null
+++ b/doc/doxygen_logo.gif
Binary files differ
diff --git a/doc/doxygen_logo_low.gif b/doc/doxygen_logo_low.gif
new file mode 100644
index 0000000..02e3c9a
--- /dev/null
+++ b/doc/doxygen_logo_low.gif
Binary files differ
diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex
new file mode 100644
index 0000000..4db934f
--- /dev/null
+++ b/doc/doxygen_manual.tex
@@ -0,0 +1,86 @@
+%
+%
+%
+% Copyright (C) 1997-2011 by Dimitri van Heesch.
+%
+% Permission to use, copy, modify, and distribute this software and its
+% documentation under the terms of the GNU General Public License is hereby
+% granted. No representations are made about the suitability of this software
+% for any purpose. It is provided "as is" without express or implied warranty.
+% See the GNU General Public License for more details.
+%
+% Documents produced by Doxygen are derivative works derived from the
+% input used in their production; they are not affected by this license.
+
+\documentclass[a4paper]{report}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{float}
+\usepackage{longtable}
+\usepackage{graphicx}
+\usepackage{epsf}
+\usepackage{doxygen}
+\usepackage{multicol}
+\usepackage{times}
+\usepackage{alltt}
+\usepackage{tocloft}
+\usepackage[pdftex,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue
+ ]{hyperref}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+\renewcommand{\cftsecindent}{0 em}
+\renewcommand{\cftsecnumwidth}{3.2 em}
+\renewcommand{\cftsubsecindent}{3.2 em}
+\newcommand{\thisyear}{\the\year}
+\begin{document}
+\begin{titlepage}
+\includegraphics[width=\textwidth]{doxygen_logo}
+\begin{center}
+Manual for version $VERSION\\[2ex]
+Written by Dimitri van Heesch\\[2ex]
+\copyright 1997-\thisyear
+\end{center}
+\end{titlepage}
+\clearemptydoublepage
+\tableofcontents
+\clearemptydoublepage
+\pagenumbering{arabic}
+\include{index}
+\part{User Manual}
+\chapter{Installation}\label{install}\hypertarget{install}{}\input{install}
+\chapter{Getting Started}\label{starting}\hypertarget{starting}{}\input{starting}
+\chapter{Documenting the code}\label{docblocks}\hypertarget{docblocks}{}\input{docblocks}
+\chapter{Lists}\label{lists}\hypertarget{lists}{}\input{lists}
+\chapter{Grouping}\label{grouping}\hypertarget{grouping}{}\input{grouping}
+\chapter{Including Formulas}\label{formulas}\hypertarget{formulas}{}\input{formulas}
+\chapter{Graphs and diagrams}\label{diagrams}\hypertarget{diagrams}{}\input{diagrams}
+\chapter{Preprocessing}\label{preprocessing}\hypertarget{preprocessing}{}\input{preprocessing}
+\chapter{Automatic link generation}\label{autolink}\hypertarget{autolink}{}\input{autolink}
+\chapter{Output Formats}\label{output}\hypertarget{output}{}\input{output}
+\chapter{Searching}\label{searching}\hypertarget{searching}{}\input{searching}
+\chapter{Customizing the Output}\label{customize}\hypertarget{customize}{}\input{customize}
+\chapter{Custom Commands}\label{custcmd}\hypertarget{custcmd}{}\input{custcmd}
+\chapter{Link to external documentation}\label{external}\hypertarget{external}{}\input{external}
+\chapter{Frequently Asked Questions}\label{faq}\hypertarget{faq}{}\input{faq}
+\chapter{Troubleshooting}\label{trouble}\hypertarget{trouble}{}\input{trouble}
+\part{Reference Manual}
+\chapter{Features}\label{features}\hypertarget{features}{}\input{features}
+\chapter{Doxygen usage}\label{doxygen_usage}\hypertarget{doxygen_usage}{}\input{doxygen_usage}
+\chapter{Doxytag usage}\label{doxytag_usage}\hypertarget{doxytag_usage}{}\input{doxytag_usage}
+\chapter{Doxywizard usage}\label{doxywizard_usage}\hypertarget{doxywizard_usage}{}\input{doxywizard_usage}
+\chapter{Installdox usage}\label{installdox_usage}\hypertarget{installdox_usage}{}\input{installdox_usage}
+\chapter{Configuration}\label{config}\hypertarget{config}{}\input{config}
+\chapter{Special Commands}\label{commands}\hypertarget{commands}{}\input{commands}
+\chapter{HTML commands}\label{htmlcmds}\hypertarget{htmlcmds}{}\input{htmlcmds}
+\chapter{XML commands}\label{xmlcmds}\hypertarget{xmlcmds}{}\input{xmlcmds}
+\part{Developers Manual}
+\chapter{Doxygen's internals}\label{arch}\hypertarget{arch}{}\input{arch}
+\chapter{Perl Module Output format}\label{perlmod}\hypertarget{perlmod}{}\input{perlmod}
+\chapter{Internationalization}\label{langhowto}\hypertarget{langhowto}{}\input{langhowto}
+\printindex
+\end{document}
diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc
new file mode 100644
index 0000000..0cffb3d
--- /dev/null
+++ b/doc/doxygen_usage.doc
@@ -0,0 +1,106 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page doxygen_usage Doxygen usage
+
+Doxygen is a command line based utility. Calling \c doxygen with the
+\c --help option at the command line will give you a brief description of the
+usage of the program.
+
+All options consist of a leading character <tt>-</tt>,
+followed by one character and one or more arguments depending on the option.
+
+To generate a manual for your project you typically
+need to follow these steps:
+<ol>
+<li> You document your source code with
+ special documentation blocks (see section \ref specialblock).
+<li> You generate a configuration file (see section \ref config) by
+ calling doxygen with the \c -g option:
+\verbatim
+doxygen -g <config_file>
+\endverbatim
+<li> You edit the configuration file so it matches your project.
+ In the configuration file you can specify the input files and
+ a lot of optional information.
+<li> You let doxygen generate the documentation, based on the settings in the
+ configuration file:
+\verbatim
+doxygen <config_file>
+\endverbatim
+</ol>
+
+If you have a configuration file generated with an older version of
+doxygen, you can upgrade it to the current version by running doxygen
+with the -u option.
+\verbatim
+doxygen -u <config_file>
+\endverbatim
+All configuration settings in the original configuration file will be copied
+to the new configuration file. Any new options will have their default value.
+Note that comments that you may have added in the original configuration file
+will be lost.
+
+\section doxygen_finetune Fine-tuning the output
+If you want to fine-tune the way the output looks, doxygen allows you
+generate default style sheet, header, and footer files that you can edit
+afterwards:
+<ul>
+<li>For HTML output, you can generate the default header file
+ (see \ref cfg_html_header "HTML_HEADER"), the default footer
+ (see \ref cfg_html_footer "HTML_FOOTER"), and the default style
+ sheet (see \ref cfg_html_stylesheet "HTML_STYLESHEET"), using the
+ following command:
+\verbatim
+doxygen -w html header.html footer.html stylesheet.css <config_file>
+\endverbatim
+ The config_file is optional. When omitted doxygen will search for
+ a file named Doxyfile and process that. When this is also not found it
+ will used the default settings.
+
+<li>For LaTeX output, you can generate the first part of \c refman.tex
+ (see \ref cfg_latex_header "LATEX_HEADER") and the style sheet included
+ by that header (normally <code>doxygen.sty</code>), using:
+\verbatim
+doxygen -w latex header.tex doxygen.sty
+\endverbatim
+If you need non-default options (for instance to use pdflatex) you need
+to make a config file with those options set correctly and then specify
+that config file as the third argument.
+<li>For RTF output, you can generate the default style sheet file (see
+ \ref cfg_rtf_stylesheet_file "RTF_STYLESHEET_FILE") using:
+\verbatim
+doxygen -w rtf rtfstyle.cfg
+\endverbatim
+</ul>
+\warning When using a custom header you are responsible
+ for the proper inclusion of any scripts and style sheets that doxygen
+ needs, which is dependent on the configuration options and may changes
+ when upgrading to a new doxygen release.
+
+\note
+<ul>
+<li> If you do not want documentation for each item inside the configuration
+ file then you can use the optional \c -s option. This can use be
+ used in combination with the \c -u option, to add or strip the
+ documentation from an existing configuration file.
+ Please use the \c -s option if you send me a configuration file
+ as part of a bug report!
+<li> To make doxygen read/write to standard input/output instead of from/to
+ a file, use \c - for the file name.
+</ul>
+
+*/
diff --git a/doc/doxytag.1 b/doc/doxytag.1
new file mode 100644
index 0000000..a28879a
--- /dev/null
+++ b/doc/doxytag.1
@@ -0,0 +1,21 @@
+.TH DOXYTAG "1" "DATE" "doxytag VERSION" "User Commands"
+.SH NAME
+doxytag \- generates a tag file and/or a search index for a set of HTML files
+.SH SYNOPSIS
+.B doxytag
+[\fI-t tag_file\fR] [\fI-s index_file\fR] [ \fIhtml_file \fR[\fIhtml_file\fR...] ]
+.SH DESCRIPTION
+Generates a tag file and/or a search index for a set of HTML files. Use
+doxysearch as a CGI program to search the tag file generated by doxytag.
+.SH OPTIONS
+.TP
+\fB\-t\fR <tag_file>
+Generate tag file <tag_file>.
+.TP
+\fB\-s\fR <index_file>
+Generate search index <index_file>.
+.PP
+If no HTML files are given all files in the current dir that
+have a .html extension are parsed.
+.SH SEE ALSO
+doxygen(1), doxywizard(1).
diff --git a/doc/doxytag_usage.doc b/doc/doxytag_usage.doc
new file mode 100644
index 0000000..25d45fd
--- /dev/null
+++ b/doc/doxytag_usage.doc
@@ -0,0 +1,97 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page doxytag_usage Doxytag usage
+
+Doxytag is a small command line based utility.
+It can generate <em>tag files</em>.
+These tag files can be used with <a href="doxygen_usage.html">doxygen</a>
+to generate references to external documentation
+(i.e. documentation not contained in the input files that are used by
+doxygen).
+
+A tag file contains information about files, classes and members
+documented in external documentation. Doxytag extracts this information
+directly from the HTML files. This has the advantage that you do not need
+to have the sources from which the documentation was extracted.
+
+If you \e do have the sources it is better to let \c doxygen generate the
+tag file by putting the name of the tag file after
+\ref cfg_generate_tagfile "GENERATE_TAGFILE" in
+the configuration file.
+
+The input of doxytag consists of a set of HTML files.
+
+\par Important:
+ If you use tag files, the links that
+ are generated by doxygen will contain \e dummy links. You have to run
+ the \c installdox script to change these dummy links into real links.
+ See \ref installdox_usage for more information.
+ The use of dummy links may seem redundant, but it is really useful,
+ if you want to move the external documentation to another location.
+ Then the documentation does not need to be regenerated by \c doxygen,
+ only \c installdox has to be run.
+
+\par Note:
+ Because the HTML files are expected to have a certain
+ structure, only HTML files generated with doxygen or with Qt's class
+ browser generator can be used. Doxytag only <em>reads</em> the HTML files,
+ they are not altered in any way.
+
+Doxytag expects a list of all HTML files that form the documentation
+or a directory that contains all HTML files. If neither is present doxytag
+will read all files with a <tt>.html</tt> extension from the current directory.
+If doxytag is used with the <code>-t</code> flag it generates a tag file.
+
+\par Example 1:
+ Suppose the file \c example.cpp from the \c examples directory that is listed
+ below is included in some package for which you do not have the sources.
+ Fortunately, the distributor of the packages included the HTML documentation
+ that was generated by doxygen in the package.
+ \verbinclude example.cpp
+ Now you can create a tag file from the HTML files in the package by
+ typing:
+\verbatim
+doxytag -t example.tag example/html
+\endverbatim
+ from the examples directory.
+ Finally you can use this tag file with your own piece of code, such
+ as done in the following example:
+ \verbinclude tag.cpp
+ Doxygen will now include links to the external package in your own
+ documentation. Because the tag file does not specify where the
+ documentation is located, you will have to specify that by running the
+ installdox script that doxygen generates
+ (See section \ref installdox_usage for more information).
+
+ Note that this is actually a feature because if you (or someone else)
+ moves the external documentation to a different
+ directory or URL you can simply run the script again and all links in
+ the HTML files will be updated.
+
+ \htmlonly
+ Click <a href="$(DOXYGEN_DOCDIR)/examples/tag/html/index.html">here</a>
+ for the corresponding HTML documentation that is generated by Doxygen using
+ only the tag file and second piece of code.
+ \endhtmlonly
+
+\par Example 2:
+ To generate a tag file of the Qt documentation you can do the following:
+\verbatim
+doxytag -t qt.tag $QTDIR/doc/html
+\endverbatim
+
+*/
diff --git a/doc/doxywizard.1 b/doc/doxywizard.1
new file mode 100644
index 0000000..4195cbb
--- /dev/null
+++ b/doc/doxywizard.1
@@ -0,0 +1,10 @@
+.TH DOXYWIZARD "1" "DATE" "doxywizard VERSION" "User Commands"
+.SH NAME
+doxywizard \- a tool to configure and run doxygen on your source files
+.SH SYNOPSIS
+.B doxywizard
+.SH DESCRIPTION
+Doxywizard is an interactive frontend to the doxygen tool to configure
+and run doxygen on your source files.
+.SH SEE ALSO
+doxygen(1), doxytag(1).
diff --git a/doc/doxywizard.gif b/doc/doxywizard.gif
new file mode 100644
index 0000000..80bb636
--- /dev/null
+++ b/doc/doxywizard.gif
Binary files differ
diff --git a/doc/doxywizard_expert.png b/doc/doxywizard_expert.png
new file mode 100644
index 0000000..93fd4ee
--- /dev/null
+++ b/doc/doxywizard_expert.png
Binary files differ
diff --git a/doc/doxywizard_main.png b/doc/doxywizard_main.png
new file mode 100644
index 0000000..e57c144
--- /dev/null
+++ b/doc/doxywizard_main.png
Binary files differ
diff --git a/doc/doxywizard_menu.png b/doc/doxywizard_menu.png
new file mode 100644
index 0000000..37adc46
--- /dev/null
+++ b/doc/doxywizard_menu.png
Binary files differ
diff --git a/doc/doxywizard_page1.png b/doc/doxywizard_page1.png
new file mode 100644
index 0000000..ee3181d
--- /dev/null
+++ b/doc/doxywizard_page1.png
Binary files differ
diff --git a/doc/doxywizard_page2.png b/doc/doxywizard_page2.png
new file mode 100644
index 0000000..dc9b5a8
--- /dev/null
+++ b/doc/doxywizard_page2.png
Binary files differ
diff --git a/doc/doxywizard_page3.png b/doc/doxywizard_page3.png
new file mode 100644
index 0000000..f75e63f
--- /dev/null
+++ b/doc/doxywizard_page3.png
Binary files differ
diff --git a/doc/doxywizard_page4.png b/doc/doxywizard_page4.png
new file mode 100644
index 0000000..e4f4361
--- /dev/null
+++ b/doc/doxywizard_page4.png
Binary files differ
diff --git a/doc/doxywizard_usage.doc b/doc/doxywizard_usage.doc
new file mode 100644
index 0000000..de24add
--- /dev/null
+++ b/doc/doxywizard_usage.doc
@@ -0,0 +1,138 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page doxywizard_usage Doxywizard usage
+
+Doxywizard is a GUI front-end for configuring and running doxygen.
+
+When you start doxywizard it will display the main window
+(the actual look depends on the OS used).
+
+\image html doxywizard_main.png "Main window"
+
+The windows shows the steps to take to configure and run doxygen.
+The first step is to choose one of the ways to configure doxygen.
+<dl>
+<dt>Wizard<dd>Click this button to quickly configure the most important
+ settings and leave the rest of the options to their defaults.
+<dt>Expert<dd>Click this button to to gain access to the
+ \ref config "full range of configuration options".
+<dt>Load<dd>Click this button to load an existing configuration file
+ from disk.
+</dl>
+Note that you can select multiple buttons in a row, for instance to first
+configure doxygen using the Wizard and then fine tune the settings via
+the Expert.
+
+After doxygen is configured you need to save the configuration as a file
+to disk. This second step allows doxygen to use the configuration
+and has the additional advantage that the configuration can be reused
+to run doxygen with the same settings at a later point in time.
+
+Since some configuration options may use relative paths, the next step is
+to select a directory from which to run doxygen. This is typically the root
+of the source tree and will most of the time already be filled in correctly.
+
+Once the configuration file is saved and the working directory is set, you
+can run doxygen based on the selected settings. Do this by pressing the
+"Start" button. Once doxygen runs you can cancel it by clicking the same
+button again. The output produced by doxygen is captured and shown in a log
+window. Once doxygen finishes, the log can be saved as a text file.
+
+<h3>The Wizard Dialog</h3>
+
+If you select the Wizard button in step 1, then a dialog with
+a number of tabs will appear.
+
+\image html doxywizard_page1.png "Wizard dialog: Project settings"
+
+The fields in the project tab speak for themselves. Once doxygen has finished
+the Destination directory is where to look for the results. Doxygen will
+put each output format in a separate sub-directory.
+
+\image html doxywizard_page2.png "Wizard dialog: Mode of operating"
+
+The mode tab allows you to select how doxygen will look at your sources.
+The default is to only look for things that have been documented.
+
+You can also select how doxygen should present the results.
+The latter does not affect the way doxygen parses your source code.
+
+\image html doxywizard_page3.png "Wizard dialog: Output to produce"
+
+You can select one or more of the output formats that doxygen should
+produce. For HTML and LaTeX there are additional options.
+
+\image html doxywizard_page4.png "Wizard dialog: Diagrams to generate"
+
+Doxygen can produce a number of diagrams. Using the diagrams tab you
+can select which ones to generate. For most diagrams the
+dot tool of the <a href="http://www.graphviz.org">GraphViz</a> package
+is needed (if you use the binary packages for MacOSX this
+tool is already included).
+
+<h3>Expert dialog</h3>
+
+The Expert dialog has a number of tab fields, one
+for each section in the configuration file. Each tab-field
+contains a number of lines, one for each configuration option in
+that section.
+
+The kind of input widget depends on the type of the configuration option.
+<ul>
+<li>For each boolean option (those options that are answered with YES or
+ NO in the configuration file) there is a check-box.
+<li>For items taking one of a fixed set of values (like
+ \ref cfg_output_language "OUTPUT_LANGUAGE") a combo box is used.
+<li>For items taking an integer value from a range, a spinbox is used.
+<li>For free form string-type options there is a one line edit field
+<li>For options taking a lists of strings, a one line edit field is
+ available, with a `+' button to add this string to the list and
+ a `-' button to remove the selected string from the list. There
+ is also a `*' button that, when pressed,
+ replaces the selected item in the list with the string entered in the
+ edit field.
+<li>For file and folder entries, there are special buttons
+ that start a file selection dialog.
+</ul>
+
+\image html doxywizard_expert.png "Some options from the Expert dialog"
+
+The get additional information about the meaning of an option, click
+on the "Help" button at the bottom right of the dialog and then on the
+item. A tooltip with additional information will appear.
+
+<h3>Menu options</h3>
+
+The GUI front-end has a menu with a couple of useful items
+
+\image html doxywizard_menu.png "File menu"
+
+<dl>
+<dt>Open...<dd>This is the same as the "Load" button in the main window
+ and allows to open a configuration file from disk.
+<dt>Save as..<dd>This is the same as the "Save" button in the main window
+ and can be used to save the current configuration settings to disk.
+<dt>Recent configurations<dd>Allow to quickly load a recently saved
+ configuration.
+<dt>Set as default...<dd>Stores the current configuration settings as the
+ default to use next time the GUI is started. You will be asked to
+ confirm the action.
+<dt>Reset...<dd>Restores the factory defaults as the default settings to use.
+ You will be asked to confirm the action.
+</dl>
+
+*/
diff --git a/doc/external.doc b/doc/external.doc
new file mode 100644
index 0000000..a1be8b1
--- /dev/null
+++ b/doc/external.doc
@@ -0,0 +1,138 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page external Linking to external documentation
+
+If your project depends on external libraries or tools, there are several
+reasons to not include all sources for these with every run of doxygen:
+
+<dl>
+<dt>Disk space:<dd> Some documentation may be available outside of the output
+ directory of doxygen already, for instance somewhere on the web.
+ You may want to link to these pages instead of generating the documentation
+ in your local output directory.
+<dt>Compilation speed:<dd> External projects typically have a different update
+ frequency from your own project. It does not make much sense to let doxygen
+ parse the sources for these external project over and over again, even if
+ nothing has changed.
+<dt>Memory:<dd> For very large source trees, letting doxygen parse all sources
+ may simply take too much of your system's memory. By dividing the sources
+ into several "packages", the sources of one package can be parsed by
+ doxygen, while all other packages that this package depends on, are
+ linked in externally. This saves a lot of memory.
+<dt>Availability:<dd> For some projects that are documented with doxygen,
+ the sources may just not be available.
+<dt>Copyright issues:<dd>If the external
+ package and its documentation are copyright someone else, it may be
+ better - or even necessary - to reference it rather than include a
+ copy of it with your project's documentation. When the author forbids
+ redistribution, this is necessary. If the author requires compliance
+ with some license condition as a precondition of redistribution, and
+ you do not want to be bound by those conditions, referring to their
+ copy of their documentation is preferable to including a copy.
+
+</dl>
+
+If any of the above apply, you can use doxygen's tag file mechanism.
+A tag file is basically a compact representation of the entities found in the
+external sources. Doxygen can both generate and read tag files.
+
+To generate a tag file for your project, simply put the name of the
+tag file after the \ref cfg_generate_tagfile "GENERATE_TAGFILE" option in
+the configuration file.
+
+To combine the output of one or more external projects with your own project
+you should specify the name of the tag files after
+the \ref cfg_tagfiles "TAGFILES" option in the configuration file.
+
+A tag file does not contain information about where the external documentation
+is located. This could be a directory or an URL. So when you include a tag
+file you have to specify where the external documentation is located.
+There are two ways to do this:
+<dl>
+<dt>At configuration time:<dd> just assign the location of the output to the
+ tag files specified after the \ref cfg_tagfiles "TAGFILES" configuration
+ option. If you use a relative path it should be relative with respect to
+ the directory where the HTML output of your project is generated.
+<dt>After compile time:<dd> if you do not assign a location to a tag file,
+ doxygen will generate dummy links for all external HTML references. It will
+ also generate a perl script called \ref installdox_usage "installdox" in
+ the HTML output directory. This script should be run to replace the
+ dummy links with real links for all generated HTML files.
+</dl>
+
+\par Example:
+Suppose you have a project \c proj that uses two external
+projects called \c ext1 and \c ext2.
+The directory structure looks as follows:
+
+\par
+\verbatim
+<root>
+ +- proj
+ | +- html HTML output directory for proj
+ | +- src sources for proj
+ | |- proj.cpp
+ +- ext1
+ | +- html HTML output directory for ext1
+ | |- ext1.tag tag file for ext1
+ +- ext2
+ | +- html HTML output directory for ext2
+ | |- ext2.tag tag file for ext2
+ |- proj.cfg doxygen configuration file for proj
+ |- ext1.cfg doxygen configuration file for ext1
+ |- ext2.cfg doxygen configuration file for ext2
+\endverbatim
+
+\par
+Then the relevant parts of the configuration files look as follows:
+\par
+proj.cfg:
+\verbatim
+OUTPUT_DIRECTORY = proj
+INPUT = proj/src
+TAGFILES = ext1/ext1.tag=../../ext1/html \
+ ext2/ext2.tag=../../ext2/html
+\endverbatim
+ext1.cfg:
+\verbatim
+OUTPUT_DIRECTORY = ext1
+GENERATE_TAGFILE = ext1/ext1.tag
+\endverbatim
+ext2.cfg:
+\verbatim
+OUTPUT_DIRECTORY = ext2
+GENERATE_TAGFILE = ext2/ext2.tag
+\endverbatim
+
+In some (hopefully exceptional) cases you may have the documentation
+generated by doxygen, but not the sources nor a tag file. In this case you
+can use the \ref doxytag_usage "doxytag" tool to extract a tag file from
+the generated HTML sources. Another case where you should use doxytag is
+if you want to create a tag file for the Qt documentation.
+
+The tool \c doxytag depends on the particular structure
+of the generated output and on some special markers that are generated by
+doxygen. Since this type of extraction is brittle and error-prone I
+suggest you only use this approach if there is no alternative. The
+doxytag tool may even become obsolete in the future.
+
+\htmlonly
+Go to the <a href="faq.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
diff --git a/doc/faq.doc b/doc/faq.doc
new file mode 100644
index 0000000..7bbf858
--- /dev/null
+++ b/doc/faq.doc
@@ -0,0 +1,293 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page faq Frequently Asked Questions
+
+<ol>
+<li><b>How to get information on the index page in HTML?</b>
+<p>
+You should use the \\mainpage command inside a comment block like this:
+\verbatim
+/*! \mainpage My Personal Index Page
+ *
+ * \section intro_sec Introduction
+ *
+ * This is the introduction.
+ *
+ * \section install_sec Installation
+ *
+ * \subsection step1 Step 1: Opening the box
+ *
+ * etc...
+ */
+\endverbatim
+
+<li><b>Help, some/all of the members of my class / file / namespace
+ are not documented?</b>
+
+ Check the following:
+ <ol>
+ <li>Is your class / file / namespace documented? If not, it will not
+ be extracted from the sources unless \c EXTRACT_ALL is set to \c YES
+ in the config file.
+ <li>Are the members private? If so, you must set \c EXTRACT_PRIVATE to \c YES
+ to make them appear in the documentation.
+ <li>Is there a function macro in your class that does not end with a
+ semicolon (e.g. MY_MACRO())? If so then you have to instruct
+ doxygen's preprocessor to remove it.
+
+ This typically boils down to the following settings in the config file:
+
+ \verbatim
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+PREDEFINED = MY_MACRO()=
+ \endverbatim
+
+ Please read the \ref preprocessing "preprocessing" section of the
+ manual for more information.
+ </ol>
+
+<li><b>When I set EXTRACT_ALL to NO none of my functions are shown in the
+ documentation.</b>
+
+In order for global functions, variables, enums, typedefs, and defines
+to be documented you should document the file in which these commands are
+located using a comment block containing a \\file (or \@file)
+command.
+
+Alternatively, you can put all members in a group (or module)
+using the \\ingroup command and then document the group using a comment
+block containing the \\defgroup command.
+
+For member functions or functions that are part of a namespace you should
+document either the class or namespace.
+
+<li><b>How can I make doxygen ignore some code fragment?</b>
+
+The new and easiest way is to add one comment block
+with a \ref cmdcond "\\cond" command at the start and one comment block
+with a \ref cmdendcond "\\endcond" command at the end of the piece of
+code that should be ignored. This should be within the same file of course.
+
+But you can also use Doxygen's preprocessor for this:
+If you put
+\verbatim
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+ /* code that must be skipped by Doxygen */
+
+#endif /* DOXYGEN_SHOULD_SKIP_THIS */
+\endverbatim
+around the blocks that should be hidden and put:
+\verbatim
+ PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS
+\endverbatim
+in the config file then all blocks should be skipped by Doxygen as long
+as <code>PREPROCESSING = YES</code>.
+
+<li><b>How can I change what is after the <code>\#include</code> in the class documentation?</b>
+
+In most cases you can use STRIP_FROM_INC_PATH to strip a user defined
+part of a path.
+
+You can also document your class as follows
+
+\verbatim
+/*! \class MyClassName include.h path/include.h
+ *
+ * Docs for MyClassName
+ */
+\endverbatim
+
+To make doxygen put <br><br>
+<code>
+\#include \<path/include.h\>
+</code>
+
+in the documentation of the class MyClassName regardless of the name of the actual
+header file in which the definition of MyClassName is contained.
+
+If you want doxygen to show that the include file should be included using
+quotes instead of angle brackets you should type:
+\verbatim
+/*! \class MyClassName myhdr.h "path/myhdr.h"
+ *
+ * Docs for MyClassName
+ */
+\endverbatim
+
+<li><b>How can I use tag files in combination with compressed HTML?</b>
+
+If you want to refer from one compressed HTML file
+\c a.chm to another compressed HTML file
+called \c b.chm, the
+link in \c a.chm must have the following format:
+\verbatim
+<a href="b.chm::/file.html">
+\endverbatim
+Unfortunately this only works if both compressed HTML files are in the same
+directory.
+
+As a result you must rename the generated \c index.chm files for all projects
+into something unique and put all <code>.chm</code> files in one directory.
+
+Suppose you have a project \e a referring to a project \e b using tag file
+\c b.tag, then you could rename the \c index.chm for project \e a into
+\c a.chm and the \c index.chm for project \e b into \c b.chm. In the
+configuration file for project \e a you write:
+\verbatim
+TAGFILES = b.tag=b.chm::
+\endverbatim
+or you can use \c installdox to set the links as follows:
+\verbatim
+installdox -lb.tag@b.chm::
+\endverbatim
+
+<li><b>I don't like the quick index that is put above each HTML page, what do I do?</b>
+
+You can disable the index by setting DISABLE_INDEX to YES. Then you can
+put in your own header file by writing your own header and feed that to
+HTML_HEADER.
+
+<li><b>The overall HTML output looks different, while I only wanted to
+ use my own html header file</b>
+
+You probably forgot to include the stylesheet <code>doxygen.css</code> that
+doxygen generates. You can include this by putting
+\verbatim
+<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
+\endverbatim
+in the HEAD section of the HTML page.
+
+<li><b>Why does doxygen use Qt?</b>
+
+The most important reason is to have a platform abstraction for most
+Unices and Windows by means of the QFile, QFileInfo, QDir, QDate,
+QTime and QIODevice classes.
+Another reason is for the nice and bug free utility classes, like QList,
+QDict, QString, QArray, QTextStream, QRegExp, QXML etc.
+
+The GUI front-end doxywizard uses Qt for... well... the GUI!
+
+<li><b>How can I exclude all test directories from my directory tree?</b>
+
+Simply put an exclude pattern like this in the configuration file:
+
+\verbatim
+EXCLUDE_PATTERNS = */test/*
+\endverbatim
+
+<li><b>Doxygen automatically generates a link to the
+ class MyClass somewhere in the running text.
+ How do I prevent that at a certain place?</b>
+
+Put a \% in front of the class name. Like this: \%MyClass. Doxygen will then
+remove the % and keep the word unlinked.
+
+<li><b>My favorite programming language is X. Can I still use doxygen?</b>
+
+No, not as such; doxygen needs to understand the structure of what it reads.
+If you don't mind spending some time on it, there are several options:
+- If the grammar of X is close to C or C++, then it is probably not too hard to
+ tweak src/scanner.l a bit so the language is supported. This is done
+ for all other languages directly supported by doxygen
+ (i.e. Java, IDL, C#, PHP).
+- If the grammar of X is somewhat different than you can write an input
+ filter that translates X into something similar enough to C/C++ for
+ doxygen to understand (this approach is taken for VB, Object Pascal, and
+ Javascript, see http://www.stack.nl/~dimitri/doxygen/download.html#helpers).
+- If the grammar is completely different one could write a parser for X and
+ write a backend that produces a similar syntax tree as is done by
+ src/scanner.l (and also by src/tagreader.cpp while reading tag files).
+
+<li><b>Help! I get the cryptic message
+ "input buffer overflow, can't enlarge buffer because scanner uses REJECT"</b>
+
+This error happens when doxygen's lexical scanner has a rule that matches
+more than 256K of input characters in one go. I've seen this happening
+on a very large generated file (\>256K lines), where the built-in preprocessor
+converted it into an empty file (with \>256K of newlines). Another case
+where this might happen is if you have lines in your code with more than
+256K characters.
+
+If you have run into such a case and want me to fix it, you
+should send me a code fragment that triggers the message. To work around
+the problem, put some line-breaks into your file, split it up into smaller
+parts, or exclude it from the input using EXCLUDE.
+
+<li><b>When running make in the latex dir I get "TeX capacity exceeded". Now what?</b>
+
+You can edit the texmf.cfg file to increase the default values of the
+various buffers and then run "texconfig init".
+
+<li><b>Why are dependencies via STL classes not shown in the dot graphs?</b>
+
+Doxygen is unaware of the STL classes, unless the option BUILTIN_STL_SUPPORT is
+turned on.
+
+<li><b>I have problems getting the search engine to work with PHP5 and/or windows</b>
+
+Please read <a href="searchengine.html">this</a> for hints on where to look.
+
+<li><b>Can I configure doxygen from the command line?</b>
+
+Not via command line options, but doxygen can read from <code>stdin</code>,
+so you can pipe things through it. Here's an example how to override an option
+in a configuration file from the command line (assuming a UNIX environment):
+
+\verbatim
+( cat Doxyfile ; echo "PROJECT_NUMBER=1.0" ) | doxygen -
+\endverbatim
+
+If multiple options with the same name are specified then doxygen will use
+the last one. To append to an existing option you can use the += operator.
+
+<li><b>How did doxygen get its name?</b>
+
+Doxygen got its name from playing with the words
+documentation and generator.
+
+\verbatim
+documentation -> docs -> dox
+generator -> gen
+\endverbatim
+
+At the time I was looking into lex and yacc, where a lot of things start with
+"yy", so the "y" slipped in and made things pronounceable
+(the proper pronouncement is Docs-ee-gen, so with a long "e").
+
+<li><b>What was the reason to develop doxygen?</b>
+
+I once wrote a GUI widget based on the Qt library (it is still available at
+http://qdbttabular.sourceforge.net/ and maintained by Sven Meyer).
+Qt had nicely generated documentation (using an internal tool which
+they didn't want to release) and I wrote similar docs by hand.
+This was a nightmare to maintain, so I wanted a similar tool. I looked at
+Doc++ but that just wasn't good enough (it didn't support signals and
+slots and did not have the Qt look and feel I had grown to like),
+so I started to write my own tool...
+
+</ol>
+
+\htmlonly
+Go to the <a href="trouble.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
+
diff --git a/doc/features.doc b/doc/features.doc
new file mode 100644
index 0000000..12de7b9
--- /dev/null
+++ b/doc/features.doc
@@ -0,0 +1,115 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page features Features
+
+\addindex features
+<UL>
+<li>Requires very little overhead from the writer of the documentation.
+ Plain text will do, but for more fancy or structured output HTML tags
+ and/or some of doxygen's special commands can be used.
+<li>Cross platform: works on Windows and many Unices (including Linux and
+ MacOSX).
+<li>Indexes, organizes and generates browsable and cross-referenced
+ output even from undocumented code.
+<li>Generates structured XML output for parsed sources, which can be
+ used by external tools.
+<li>Supports C/C++, Java, (Corba and Microsoft) Java, Python, VHDL, PHP
+ IDL, C#, Objective-C 2.0, and to some extent D and Fortran sources.
+<li>Supports documentation of files, namespaces, packages, classes,
+ structs, unions, templates, variables, functions, typedefs, enums and
+ defines.
+<li>JavaDoc (1.1), qdoc3 (partially), and ECMA-334 (C# spec.) compatible.
+<li>Comes with a GUI frontend (Doxywizard) to ease editing the options and run doxygen.
+ The GUI is available on Windows, Linux, and MacOSX.
+<li>Automatically generates class and collaboration diagrams in HTML (as clickable
+ image maps) and \f$\mbox{\LaTeX}\f$ (as Encapsulated PostScript images).
+<li>Uses the dot tool of the Graphviz tool kit to generate
+ include dependency graphs, collaboration diagrams, call graphs, directory structure
+ graphs, and graphical class hierarchy graphs.
+<li>Allows grouping of entities in modules and creating a hierarchy of modules.
+<li>Flexible comment placement: Allows you to put documentation in the
+ header file (before the
+ declaration of an entity), source file (before the definition of an entity)
+ or in a separate file.
+<li>Generates a list of all members of a class (including any inherited
+ members) along with their protection level.
+<li>Outputs documentation in on-line format (XHTML and UNIX man page) and
+ off-line format (\f$\mbox{\LaTeX}\f$ and RTF) simultaneously
+ (any of these can be disabled if desired). All formats are optimized for
+ ease of reading. <br>
+ Furthermore, compressed HTML can be generated from HTML output using
+ Microsoft's HTML Help Workshop (Windows only) and PDF can be generated
+ from the \f$\mbox{\LaTeX}\f$ output.
+<li>Support for various third party help formats including HTML Help,
+ docsets, Qt-Help, and eclipse help.
+<li>Includes a full C preprocessor to allow proper parsing of conditional
+ code fragments and to allow expansion of all or part of macros definitions.
+<li>Automatically detects public, protected and private sections, as well as
+ the Qt specific signal and slots sections. Extraction of private class
+ members is optional.
+<li>Automatically generates references to documented classes, files, namespaces
+ and members. Documentation of global functions, globals variables,
+ typedefs, defines and enumerations is also supported.
+<li>References to base/super classes and inherited/overridden members are
+ generated automatically.
+<li>Includes a fast, rank based search engine to search for strings or words
+ in the class and member documentation (PHP based).
+<li>Includes an Javascript based live search feature to search for symbols
+ as you type (for small to medium sized projects).
+<li>You can type normal HTML tags in your documentation. Doxygen will convert
+ them to their equivalent \f$\mbox{\LaTeX}\f$, RTF, and man-page
+ counterparts automatically.
+<li>Allows references to documentation generated for other (doxygen documented)
+ projects (or another part of the same project) in a location independent way.
+<li>Allows inclusion of source code examples that are automatically
+ cross-referenced with the documentation.
+<li>Inclusion of undocumented classes is also supported, allowing to quickly
+ learn the structure and interfaces of a (large) piece of code without
+ looking into the implementation details.
+<li>Allows automatic cross-referencing of (documented) entities with their
+ definition in the source code.
+<li>All source code fragments are syntax highlighted for ease of reading.
+<li>Allows inclusion of function/member/class definitions in the documentation.
+<li>All options are read from an easy to edit and (optionally) annotated
+ configuration file.
+<li>Documentation and search engine can be transferred to another
+ location or machine without regenerating the documentation.
+<li>Supports many different character encodings and uses UTF-8 internally and
+ for the generated output.
+<li>Doxygen can generate a layout which you can use and edit to change the
+ layout of each page.
+<li>There more than a 100 configurable options to fine-tune the output.
+<li>Can cope with large projects easily.
+</UL>
+
+Although doxygen can now be used in any project written in a language that is
+supported by doxygen, initially it was specifically designed to be used for projects
+that make use of Qt Software's
+<A HREF="http://www.trolltech.com/products/qt.html">Qt toolkit</A>. I have tried to
+make doxygen `Qt-compatible'. That is: Doxygen can read the documentation contained in
+the Qt source code and create a class browser that looks quite similar to the
+one that is generated by Qt Software. Doxygen understands the C++ extensions
+used by Qt such as signals and slots and many of the markup commands used in the Qt sources.
+
+Doxygen can also automatically generate links to existing documentation
+that was generated with Doxygen or with Qt's non-public class browser
+generator. For a Qt based project this means that whenever you refer to
+members or classes belonging to the Qt toolkit, a link will be generated to
+the Qt documentation. This is done independent of where this documentation
+is located!
+
+*/
diff --git a/doc/formulas.doc b/doc/formulas.doc
new file mode 100644
index 0000000..9f049eb
--- /dev/null
+++ b/doc/formulas.doc
@@ -0,0 +1,112 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page formulas Including formulas
+
+Doxygen allows you to put \f$\mbox{\LaTeX}\f$ formulas in the
+output (this works only for the HTML and \f$\mbox{\LaTeX}\f$ output,
+not for the RTF nor for the man page output). To be able to include
+formulas (as images) in the HTML documentation, you will also need to
+have the following tools installed
+<ul>
+<li>\c latex: the \f$\mbox{\LaTeX}\f$ compiler, needed to parse the formulas.
+ To test I have used the teTeX 1.0 distribution.
+<li>\c dvips: a tool to convert DVI files to PostScript files
+ I have used version 5.92b from Radical Eye software for testing.
+<li>\c gs: the GhostScript interpreter for converting PostScript files
+ to bitmaps. I have used Aladdin GhostScript 8.0 for testing.
+</ul>
+For the HTML output there is also an alternative solution using
+<a href="http://www.mathjax.org">MathJax</a> which does not
+require the above tools. If you enable \ref cfg_use_mathjax "USE_MATHJAX" in
+the config then the latex formulas will be copied to the HTML "as is" and a
+client side javascript will parse them and turn them into (interactive) images.
+
+There are three ways to include formulas in the documentation.
+<ol>
+<li>Using in-text formulas that appear in the running text.
+ These formulas should be put between a pair of \\f\$
+ commands, so
+\verbatim
+ The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is
+ \f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$.
+\endverbatim results in:
+
+ The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is
+ \f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$.
+<br>
+<li>Unnumbered displayed formulas that are centered on a separate line.
+ These formulas should be put between \\f[ and \\f] commands.
+ An example:
+\verbatim
+ \f[
+ |I_2|=\left| \int_{0}^T \psi(t)
+ \left\{
+ u(a,t)-
+ \int_{\gamma(t)}^a
+ \frac{d\theta}{k(\theta,t)}
+ \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi
+ \right\} dt
+ \right|
+ \f]
+\endverbatim
+ results in:
+ \f[
+ |I_2|=\left| \int_{0}^T \psi(t)
+ \left\{
+ u(a,t)-
+ \int_{\gamma(t)}^a
+ \frac{d\theta}{k(\theta,t)}
+ \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi
+ \right\} dt
+ \right|
+ \f]
+<li>Formulas or other latex elements that are not in a math
+ environment can be specified using \\f{environment}, where
+ \c environment is the name of the \f$\mbox{\LaTeX}\f$ environment,
+ the corresponding end command is \\f}. Here is an example for an
+ equation array
+\verbatim
+ \f{eqnarray*}{
+ g &=& \frac{Gm_2}{r^2} \\
+ &=& \frac{(6.673 \times 10^{-11}\,\mbox{m}^3\,\mbox{kg}^{-1}\,
+ \mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
+ &=& 9.82066032\,\mbox{m/s}^2
+ \f}
+\endverbatim
+ which results in:
+ \f{eqnarray*}
+ g &=& \frac{Gm_2}{r^2} \\
+ &=& \frac{(6.673 \times 10^{-11}\,\mbox{m}^3\,\mbox{kg}^{-1}\,
+ \mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
+ &=& 9.82066032\,\mbox{m/s}^2
+ \f}
+</ol>
+For the first two commands one should make sure formulas contain
+valid commands in \f$\mbox{\LaTeX}\f$'s math-mode. For the third command
+the section should contain valid command for the specific environment.
+
+\warning Currently, doxygen is not very fault tolerant in recovering
+from typos in formulas. It may be necessary to remove the
+file <code>formula.repository</code> that is written to the html directory to
+get rid of an incorrect formula.
+
+\htmlonly
+Go to the <a href="diagrams.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
diff --git a/doc/grouping.doc b/doc/grouping.doc
new file mode 100644
index 0000000..825a289
--- /dev/null
+++ b/doc/grouping.doc
@@ -0,0 +1,228 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page grouping Grouping
+
+Doxygen has three mechanisms to group things together.
+One mechanism works at a global level, creating a new page
+for each group. These groups are called \ref modules "'modules'" in the documentation.
+The second mechanism works within a member list of some compound entity,
+and is referred to as a \ref memgroup "'member groups'".
+For \ref cmdpage "pages" there is a third grouping mechanism referred to
+as \ref subpaging "subpaging".
+
+\section modules Modules
+
+Modules are a way to group things together on a separate page. You
+can document a group as a whole, as well as all individual members.
+Members of a group can be files, namespaces, classes, functions,
+variables, enums, typedefs, and defines, but also other groups.
+
+To define a group, you should put the \ref cmddefgroup "\\defgroup"
+command in a special comment block. The first argument of the command
+is a label that should uniquely identify the group.
+The second argument is the name or title of the group as it should appear
+in the documentation.
+
+You can make an entity a member of a specific group by putting
+a \ref cmdingroup "\\ingroup" command inside its documentation block.
+
+To avoid putting \ref cmdingroup "\\ingroup" commands in the documentation
+for each member you can also group members together by the
+open marker <code>\@{</code> before the group and the
+closing marker <code>\@}</code> after the group. The markers can
+be put in the documentation of the group definition or in a separate
+documentation block.
+
+Groups themselves can also be nested using these grouping markers.
+
+You will get an error message when you use the same group label more than once.
+If you don't want doxygen to enforce unique labels, then you can
+use \ref cmdaddtogroup "\\addtogroup" instead of
+\ref cmddefgroup "\\defgroup".
+It can be used exactly like \ref cmddefgroup "\\defgroup",
+but when the group has been defined already, then it silently merges the
+existing documentation with the new one.
+The title of the group is optional for this command, so you can use
+\verbatim
+/** \addtogroup <label>
+ * @{
+ */
+...
+
+/** @}*/
+\endverbatim
+to add additional members to a group that is defined in more detail elsewhere.
+
+Note that compound entities (like classes, files and namespaces) can
+be put into multiple groups, but members (like variable, functions, typedefs
+and enums) can only be a member of one group
+(this restriction is in place to avoid ambiguous linking targets in case
+a member is not documented in the context of its class, namespace
+or file, but only visible as part of a group).
+
+Doxygen will put members into the group whose definition has
+the highest "priority": e.g. An explicit \ref cmdingroup "\\ingroup" overrides
+an implicit grouping definition via <code>\@{</code> <code>\@}</code>.
+Conflicting grouping definitions with the same priority trigger a warning,
+unless one definition was for a member without any explicit documentation.
+
+The following example puts VarInA into group A and silently resolves
+the conflict for IntegerVariable by putting it into group IntVariables,
+because the second instance of IntegerVariable
+is undocumented:
+
+\verbatim
+
+/**
+ * \ingroup A
+ */
+extern int VarInA;
+
+/**
+ * \defgroup IntVariables Global integer variables
+ * @{
+ */
+
+/** an integer variable */
+extern int IntegerVariable;
+
+/**@}*/
+
+....
+
+/**
+ * \defgroup Variables Global variables
+ */
+/**@{*/
+
+/** a variable in group A */
+int VarInA;
+
+int IntegerVariable;
+
+/**@}*/
+\endverbatim
+
+The \ref cmdref "\\ref" command can be used to refer to a group.
+The first argument of the \\ref command should be group's label.
+To use a custom link name, you can put the name of the links in
+double quotes after the label, as shown by the following example
+\verbatim
+This is the \ref group_label "link" to this group.
+\endverbatim
+
+The priorities of grouping definitions are (from highest to lowest):
+\ref cmdingroup "\\ingroup", \ref cmddefgroup "\\defgroup",
+\ref cmdaddtogroup "\\addtogroup", \ref cmdweakgroup "\\weakgroup".
+The last command is exactly like \ref cmdaddtogroup "\\addtogroup"
+with a lower priority. It was added to allow "lazy" grouping
+definitions: you can use commands with a higher priority in your .h
+files to define the hierarchy and \ref cmdweakgroup "\\weakgroup"
+in .c files without having to duplicate the hierarchy exactly.
+
+\par Example:
+\verbinclude group.cpp
+
+\htmlonly
+Click <a href="$(DOXYGEN_DOCDIR)/examples/group/html/modules.html">here</a>
+for the corresponding HTML documentation that is generated by Doxygen.
+\endhtmlonly
+
+\section memgroup Member Groups
+
+If a compound (e.g. a class or file) has many members, it is often
+desired to group them together. Doxygen already automatically groups
+things together on type and protection level, but maybe you feel that
+this is not enough or that that default grouping is wrong.
+For instance, because you feel that members of different (syntactic)
+types belong to the same (semantic) group.
+
+A member group is defined by
+a
+\verbatim
+///@{
+ ...
+///@}
+\endverbatim
+block or a
+\verbatim
+/**@{*/
+ ...
+/**@}*/
+\endverbatim
+block if you prefer C style
+comments. Note that the members of the group should be
+physically inside the member group's body.
+
+Before the opening marker of a block a separate comment block may be
+placed. This block should contain the \ref cmdname "@@name"
+(or \ref cmdname "\\name") command and is used to specify the header
+of the group. Optionally, the comment block may also contain more
+detailed information about the group.
+
+Nesting of member groups is not allowed.
+
+If all members of a member group inside a class have the same type
+and protection level (for instance all are static public members),
+then the whole member group is displayed as a subgroup of
+the type/protection level group (the group is displayed as a
+subsection of the "Static Public Members" section for instance).
+If two or more members have different types, then the group is put
+at the same level as the automatically generated groups.
+If you want to force all member-groups of a class to be at the top level,
+you should put a \ref cmdnosubgrouping "\\nosubgrouping" command inside the
+documentation of the class.
+
+\par Example:
+\verbinclude memgrp.cpp
+
+\htmlonly
+Click <a href="$(DOXYGEN_DOCDIR)/examples/memgrp/html/class_test.html">here</a>
+for the corresponding HTML documentation that is generated by Doxygen.
+\endhtmlonly
+
+Here Group1 is displayed as a subsection of the "Public Members". And
+Group2 is a separate section because it contains members with
+different protection levels (i.e. public and protected).
+
+\htmlonly
+Go to the <a href="formulas.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+\section subpaging Subpaging
+
+Information can be grouped into pages using the \ref cmdpage "\\page" and
+\ref cmdsubpage "\\mainpage" commands. Normally, this results in a
+flat list of pages, where the "main" page is the first in the list.
+
+Instead of adding structure using the approach described in section
+\ref modules "modules" it is often more natural and convenient to add
+additional structure to the pages using the \ref cmdsubpage "\\subpage"
+command.
+
+For a page A the \\subpage command adds a link to another page B and at
+the same time makes page B a subpage of A. This has the effect of making
+two groups GA and GB, where GB is part of GA, page A is put in group GA,
+and page B is put in group GB.
+
+\htmlonly
+Go to the <a href="formulas.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc
new file mode 100644
index 0000000..1327246
--- /dev/null
+++ b/doc/htmlcmds.doc
@@ -0,0 +1,151 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page htmlcmds HTML Commands
+
+Here is a list of all HTML commands that may be used inside the
+documentation. Note that although these HTML tags are translated to the
+proper commands for output formats other than HTML, all attributes
+of a HTML tag are passed on to the HTML output only
+(the HREF and NAME attributes for the A tag are the only exception).
+
+<ul>
+<li><tt>\<A HREF="..."\></tt> Starts a hyperlink
+ (if supported by the output format).
+<li><tt>\<A NAME="..."\></tt> Starts an named anchor
+ (if supported by the output format).
+<li><tt>\</A\></tt> Ends a link or anchor
+<li><tt>\<B\></tt> Starts a piece of text displayed in a bold font.
+<li><tt>\</B\></tt> Ends a <tt>\<B\></tt> section.
+<li><tt>\<BODY\></tt> Does not generate any output.
+<li><tt>\</BODY\></tt> Does not generate any output.
+<li><tt>\<BR\></tt> Forces a line break.
+<li><tt>\<CENTER\></tt> starts a section of centered text.
+<li><tt>\</CENTER\></tt> ends a section of centered text.
+<li><tt>\<CAPTION\></tt> Starts a caption. Use within a table only.
+<li><tt>\</CAPTION\></tt> Ends a caption. Use within a table only.
+<li><tt>\<CODE\></tt> Starts a piece of text displayed in a typewriter font.
+ Note that for C# code, this command is equivalent to
+ \ref cmdcode "\\code".
+<li><tt>\</CODE\></tt> Ends a <tt>\<CODE\></tt> section.
+ Note that for C# code, this command is equivalent to
+ \ref cmdendcode "\\endcode".
+<li><tt>\<DD\></tt> Starts an item description.
+<li><tt>\<DFN\></tt> Starts a piece of text displayed in a typewriter font.
+<li><tt>\</DFN\></tt> Ends a <tt>\<DFN\></tt> section.
+<li><tt>\<DIV></tt> Starts a section with a specific style (HTML only)
+<li><tt>\</DIV></tt> Ends a section with a specific style (HTML only)
+<li><tt>\<DL\></tt> Starts a description list.
+<li><tt>\</DL\></tt> Ends a description list.
+<li><tt>\<DT\></tt> Starts an item title.
+<li><tt>\</DT\></tt> Ends an item title.
+<li><tt>\<EM\></tt> Starts a piece of text displayed in an italic font.
+<li><tt>\</EM\></tt> Ends a <tt>\<EM\></tt> section.
+<li><tt>\<FORM\></tt> Does not generate any output.
+<li><tt>\</FORM\></tt> Does not generate any output.
+<li><tt>\<HR\></tt> Writes a horizontal ruler.
+<li><tt>\<H1\></tt> Starts an unnumbered section.
+<li><tt>\</H1\></tt> Ends an unnumbered section.
+<li><tt>\<H2\></tt> Starts an unnumbered subsection.
+<li><tt>\</H2\></tt> Ends an unnumbered subsection.
+<li><tt>\<H3\></tt> Starts an unnumbered subsubsection.
+<li><tt>\</H3\></tt> Ends an unnumbered subsubsection.
+<li><tt>\<I\></tt> Starts a piece of text displayed in an italic font.
+<li><tt>\<INPUT\></tt> Does not generate any output.
+<li><tt>\</I\></tt> Ends a <tt>\<I\></tt> section.
+<li><tt>\<IMG\></tt> This command is written with attributes to the HTML output only.
+<li><tt>\<LI\></tt> Starts a new list item.
+<li><tt>\</LI\></tt> Ends a list item.
+<li><tt>\<META\></tt> Does not generate any output.
+<li><tt>\<MULTICOL\></tt> ignored by doxygen.
+<li><tt>\</MUTLICOL\></tt> ignored by doxygen.
+<li><tt>\<OL\></tt> Starts a numbered item list.
+<li><tt>\</OL\></tt> Ends a numbered item list.
+<li><tt>\<P\></tt> Starts a new paragraph.
+<li><tt>\</P\></tt> Ends a paragraph.
+<li><tt>\<PRE\></tt> Starts a preformatted fragment.
+<li><tt>\</PRE\></tt> Ends a preformatted fragment.
+<li><tt>\<SMALL\></tt> Starts a section of text displayed in a smaller font.
+<li><tt>\</SMALL\></tt> Ends a <tt>\<SMALL\></tt> section.
+<li><tt>\<SPAN></tt> Starts an inline text fragment with a specific style (HTML only)
+<li><tt>\</SPAN></tt> Ends an inline text fragment with a specific style (HTML only)
+<li><tt>\<STRONG\></tt> Starts a section of bold text.
+<li><tt>\</STRONG\></tt> Ends a section of bold text.
+<li><tt>\<SUB\></tt> Starts a piece of text displayed in subscript.
+<li><tt>\</SUB\></tt> Ends a <tt>\<SUB\></tt> section.
+<li><tt>\<SUP\></tt> Starts a piece of text displayed in superscript.
+<li><tt>\</SUP\></tt> Ends a <tt>\</SUP\></tt> section.
+<li><tt>\<TABLE\></tt> starts a table.
+<li><tt>\</TABLE\></tt> ends a table.
+<li><tt>\<TD\></tt> Starts a new table data element.
+<li><tt>\</TD\></tt> Ends a table data element.
+<li><tt>\<TH\></tt> Starts a new table header.
+<li><tt>\</TH\></tt> Ends a table header.
+<li><tt>\<TR\></tt> Starts a new table row.
+<li><tt>\</TR\></tt> Ends a table row.
+<li><tt>\<TT\></tt> Starts a piece of text displayed in a typewriter font.
+<li><tt>\</TT\></tt> Ends a <tt>\<TT\></tt> section.
+<li><tt>\<KBD\></tt> Starts a piece of text displayed in a typewriter font.
+<li><tt>\</KBD\></tt> Ends a <tt>\<KBD\></tt> section.
+<li><tt>\<UL\></tt> Starts an unnumbered item list.
+<li><tt>\</UL\></tt> Ends an unnumbered item list.
+<li><tt>\<VAR\></tt> Starts a piece of text displayed in an italic font.
+<li><tt>\</VAR\></tt> Ends a <tt>\<VAR\></tt> section.
+</ul>
+
+The special HTML character entities that are recognized by Doxygen:
+
+<ul>
+<li><tt>\&copy;</tt> the copyright symbol
+<li><tt>\&tm;</tt> the trade mark symbol
+<li><tt>\&reg;</tt> the registered trade mark symbol
+<li><tt>\&lt;</tt> less-than symbol
+<li><tt>\&gt;</tt> greater-than symbol
+<li><tt>\&amp;</tt> ampersand
+<li><tt>\&apos;</tt> single quotation mark (straight)
+<li><tt>\&quot;</tt> double quotation mark (straight)
+<li><tt>\&lsquo;</tt> left single quotation mark
+<li><tt>\&rsquo;</tt> right single quotation mark
+<li><tt>\&ldquo;</tt> left double quotation mark
+<li><tt>\&rdquo;</tt> right double quotation mark
+<li><tt>\&ndash;</tt> n-dash (for numeric ranges, eg. 2&ndash;8)
+<li><tt>\&mdash;</tt> m-dash (for parenthetical punctuation &mdash; like this)
+<li><tt>\&?uml;</tt> where ? is one of {A,E,I,O,U,Y,a,e,i,o,u,y},
+ writes a character with a diaeresis accent (like &auml;).
+<li><tt>\&?acute;</tt> where ? is one of {A,E,I,O,U,Y,a,e,i,o,u,y},
+ writes a character with a acute accent (like &aacute;).
+<li><tt>\&?grave;</tt> where ? is one of {A,E,I,O,U,a,e,i,o,u,y},
+ writes a character with a grave accent (like &agrave;).
+<li><tt>\&?circ;</tt> where ? is one of {A,E,I,O,U,a,e,i,o,u,y},
+ writes a character with a circumflex accent (like &acirc;).
+<li><tt>\&?tilde;</tt> where ? is one of {A,N,O,a,n,o},
+ writes a character with a tilde accent (like &atilde;).
+<li><tt>\&szlig;</tt> write a sharp s (i.e. &szlig;) to the output.
+<li><tt>\&?cedil;</tt> where ? is one of {c,C},
+ writes a c-cedille (like &ccedil;).
+<li><tt>\&?ring;</tt> where ? is one of {a,A},
+ writes an <tt>a</tt> with a ring (like &aring;).
+<li><tt>\&nbsp;</tt> a non breakable space.
+</ul>
+
+Finally, to put invisible comments inside comment blocks, HTML style
+comments can be used:
+\verbatim
+/*! <!-- This is a comment with a comment block --> Visible text */
+\endverbatim
+
+*/
+
diff --git a/doc/index.doc b/doc/index.doc
new file mode 100644
index 0000000..0609b11
--- /dev/null
+++ b/doc/index.doc
@@ -0,0 +1,211 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page index
+\if logo_on
+<center>
+\htmlonly
+<img src="doxygen_logo.gif" width="634" height="197" alt="doxygen"/><br/>
+Version: $(VERSION)
+\endhtmlonly
+</center>
+\endif
+
+<h2>Introduction</h2>
+Doxygen is a documentation system for C++, C, Java, Objective-C, Python, IDL
+(Corba and Microsoft flavors), Fortran, VHDL, PHP, C#, and to some extent D.
+
+It can help you in three ways:
+<ol>
+<li> It can generate an on-line documentation browser (in HTML) and/or an
+ off-line reference manual (in \f$\mbox{\LaTeX}\f$) from a set
+ of documented source files.
+ There is also support for generating output in RTF (MS-Word),
+ PostScript, hyperlinked PDF, compressed HTML, and Unix man pages.
+ The documentation is extracted directly from the sources, which
+ makes it much easier to keep the documentation consistent with the
+ source code.
+<li> You can \ref extract_all "configure" doxygen to extract the code structure
+ from undocumented source files. This is very useful to quickly
+ find your way in large source distributions.
+ You can also visualize the relations between the various elements
+ by means of include dependency graphs, inheritance diagrams,
+ and collaboration diagrams, which are all generated automatically.
+<li> You can even `abuse' doxygen for creating normal documentation (as I did
+ for this manual).
+</ol>
+
+Doxygen is developed under <a href="http://www.linux.org">Linux</a>
+and Mac OS X, but is set-up to be highly portable. As a result, it
+runs on most other Unix flavors as well. Furthermore, executables for
+Windows are available.
+
+\n This manual is divided into three parts, each of which is divided into several
+sections.
+
+The first part forms a user manual:
+<ul>
+<li>Section \ref install discusses how to
+ <a href="http://www.doxygen.org/download.html">download</a>, compile and install
+ doxygen for your platform.
+<li>Section \ref starting tells you how to generate your first piece of
+ documentation quickly.
+<li>Section \ref docblocks demonstrates the various ways that code can
+ be documented.
+<li>Section \ref lists show various ways to create lists.
+<li>Section \ref grouping shows how to group things together.
+<li>Section \ref formulas shows how to insert formulas in the documentation.
+<li>Section \ref diagrams describes the diagrams and graphs that doxygen can generate.
+<li>Section \ref preprocessing explains how doxygen deals with macro definitions.
+<li>Section \ref autolink shows how to put links to files, classes,
+ and members in the documentation.
+<li>Section \ref output shows how to generate the various output formats
+ supported by doxygen.
+<li>Section \ref searching shows various ways to search in the HTML documentation.
+<li>Section \ref customize explains how you can customize the output generated
+ by doxygen.
+<li>Section \ref custcmd show how to define and use custom commands in your comments.
+<li>Section \ref external explains how to let doxygen create links to externally generated documentation.
+<li>Section \ref faq gives answers to frequently asked questions.
+<li>Section \ref trouble tells you what to do when you have problems.
+</ul>
+
+The second part forms a reference manual:
+
+<ul>
+<li>Section \ref features presents an overview of what doxygen can do.
+<li>Section \ref doxygen_usage shows how to use the \c doxygen program.
+<li>Section \ref doxytag_usage shows how to use the \c doxytag program.
+<li>Section \ref doxywizard_usage shows how to use the \c doxywizard program.
+<li>Section \ref installdox_usage shows how to use the \c installdox
+ script that is generated by doxygen if you use tag files.
+<li>Section \ref config shows how to fine-tune doxygen, so it
+ generates the documentation you want.
+<li>Section \ref commands shows an overview of the special commands that can be
+ used within the documentation.
+<li>Section \ref htmlcmds shows an overview of the HTML commands that
+ can be used within the documentation.
+<li>Section \ref xmlcmds shows an overview of the C# style XML commands that
+ can be used within the documentation.
+</ul>
+
+The third part provides information for developers:
+
+<ul>
+<li>Section \ref arch gives a global overview of how doxygen is internally
+ structured.
+<li>Section \ref perlmod shows how to use the PerlMod output.
+<li>Section \ref langhowto explains how to add support for new
+ output languages.
+</ul>
+
+\n<h2>Doxygen license</h2>
+\addindex license
+\addindex GPL
+
+Copyright &copy; 1997-2011 by
+<a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>.<p>
+
+Permission to use, copy, modify, and distribute this software and its
+documentation under the terms of the GNU General Public License is hereby
+granted. No representations are made about the suitability of this software
+for any purpose. It is provided "as is" without express or implied warranty.
+See the
+<a href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">
+GNU General Public License</a>
+for more details.
+<p>
+Documents produced by doxygen are derivative works derived from the
+input used in their production; they are not affected by this license.
+
+<h2>User examples</h2>
+
+Doxygen supports a number of \ref output "output formats" where HTML is the
+most popular one. I've gathered
+\htmlonly
+<a href="http://www.doxygen.org/results.html">some nice examples</a>
+\endhtmlonly
+\latexonly
+some nice examples (see {\tt http://www.doxygen.org/results.html})
+\endlatexonly
+of real-life projects using doxygen.
+
+These are part of a larger
+\htmlonly
+<a href="http://www.doxygen.org/projects.html">list of projects</a>
+that use doxygen.
+\endhtmlonly
+\latexonly
+list of projects that use doxygen (see {\tt http://www.doxygen.org/projects.html}).
+\endlatexonly
+If you know other projects, let <a href="mailto:dimitri@stack.nl?subject=New%20project%20using%20Doxygen">me</a>
+know and I'll add them.
+
+<h2>Commercial Support</h2>
+
+I'm currently investigating the possibilities of providing
+commercial support for doxygen. The forms of support I'm thinking of
+are:
+<ul>
+<li>implementing features,
+<li>fixing bugs,
+<li>providing priority help in answering questions.
+</ul>
+To get a better understanding of the feasibility,
+please let <a href="mailto:dimitri@stack.nl?subject=Doxygen%20Commercial%20Support">me</a> know if you
+have a need for this type (or another type)
+of doxygen related commercial support.
+
+<h2>Future work</h2>
+Although doxygen is successfully used by large number of companies and
+open source projects already, there is always room for improvement.
+<p>
+You can submit enhancement requests in
+<a href="https://bugzilla.gnome.org/buglist.cgi?product=doxygen&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_severity=enhancement">the bug tracker</a>.
+Make sure the severity of the bug report is set to "enhancement".
+
+<h2>Acknowledgements</h2>
+\addindex acknowledgements
+Thanks go to:
+<ul>
+<li>\addindex Doc++
+ Malte Z&ouml;ckler and Roland Wunderling, authors of DOC++.
+ The first version of doxygen borrowed some code of an old version of DOC++.
+ Although I have rewritten practically all code since then, DOC++ has still
+ given me a good start in writing doxygen.
+<li>All people at Qt Software, for creating a beautiful GUI Toolkit
+ (which is very useful as a Windows/Unix platform abstraction layer :-)
+<li>My brother Frank
+ for rendering the logos.
+<li>Harm van der Heijden for adding HTML help support.
+<li>Wouter Slegers of
+ <a href="http://www.yourcreativesolutions.nl">Your Creative Solutions</a>
+ for registering the www.doxygen.org domain.
+<li>Parker Waechter for adding the RTF output generator.
+<li>Joerg Baumann, for adding conditional documentation blocks,
+ PDF links, and the configuration generator.
+<li>Tim Mensch for adding the todo command.
+<li>Christian Hammond for redesigning the web-site.
+<li>Ken Wong for providing the HTML tree view code.
+<li>Talin for adding support for C# style comments with XML markup.
+<li>Petr Prikryl for coordinating the internationalization support.
+ All language maintainers for providing translations into many languages.
+<li>The band <a href="http://www.porcupinetree.com">Porcupine Tree</a> for
+ providing hours of great music to listen to while coding.
+<li>many, many others for suggestions, patches and bug reports.
+</ul>
+*/
+
diff --git a/doc/index.hhp.txt b/doc/index.hhp.txt
new file mode 100644
index 0000000..b676d83
--- /dev/null
+++ b/doc/index.hhp.txt
@@ -0,0 +1,108 @@
+examples/afterdoc/html/tab_a.png
+examples/afterdoc/html/tab_b.png
+examples/afterdoc/html/tab_h.png
+examples/afterdoc/html/tab_s.png
+examples/author/html/tab_a.png
+examples/author/html/tab_b.png
+examples/author/html/tab_h.png
+examples/author/html/tab_s.png
+examples/autolink/html/tab_a.png
+examples/autolink/html/tab_b.png
+examples/autolink/html/tab_h.png
+examples/autolink/html/tab_s.png
+examples/class/html/tab_a.png
+examples/class/html/tab_b.png
+examples/class/html/tab_h.png
+examples/class/html/tab_s.png
+examples/define/html/tab_a.png
+examples/define/html/tab_b.png
+examples/define/html/tab_h.png
+examples/define/html/tab_s.png
+examples/diagrams/html/tab_a.png
+examples/diagrams/html/tab_b.png
+examples/diagrams/html/tab_h.png
+examples/diagrams/html/tab_s.png
+examples/docstring/html/tab_a.png
+examples/docstring/html/tab_b.png
+examples/docstring/html/tab_h.png
+examples/docstring/html/tab_s.png
+examples/enum/html/tab_a.png
+examples/enum/html/tab_b.png
+examples/enum/html/tab_h.png
+examples/enum/html/tab_s.png
+examples/example/html/tab_a.png
+examples/example/html/tab_b.png
+examples/example/html/tab_h.png
+examples/example/html/tab_s.png
+examples/file/html/tab_a.png
+examples/file/html/tab_b.png
+examples/file/html/tab_h.png
+examples/file/html/tab_s.png
+examples/func/html/tab_a.png
+examples/func/html/tab_b.png
+examples/func/html/tab_h.png
+examples/func/html/tab_s.png
+examples/group/html/tab_a.png
+examples/group/html/tab_b.png
+examples/group/html/tab_h.png
+examples/group/html/tab_s.png
+examples/include/html/tab_a.png
+examples/include/html/tab_b.png
+examples/include/html/tab_h.png
+examples/include/html/tab_s.png
+examples/jdstyle/html/tab_a.png
+examples/jdstyle/html/tab_b.png
+examples/jdstyle/html/tab_h.png
+examples/jdstyle/html/tab_s.png
+examples/manual/html/tab_a.png
+examples/manual/html/tab_b.png
+examples/manual/html/tab_h.png
+examples/manual/html/tab_s.png
+examples/memgrp/html/tab_a.png
+examples/memgrp/html/tab_b.png
+examples/memgrp/html/tab_h.png
+examples/memgrp/html/tab_s.png
+examples/mux/html/tab_a.png
+examples/mux/html/tab_b.png
+examples/mux/html/tab_h.png
+examples/mux/html/tab_s.png
+examples/overload/html/tab_a.png
+examples/overload/html/tab_b.png
+examples/overload/html/tab_h.png
+examples/overload/html/tab_s.png
+examples/page/html/tab_a.png
+examples/page/html/tab_b.png
+examples/page/html/tab_h.png
+examples/page/html/tab_s.png
+examples/par/html/tab_a.png
+examples/par/html/tab_b.png
+examples/par/html/tab_h.png
+examples/par/html/tab_s.png
+examples/pyexample/html/tab_a.png
+examples/pyexample/html/tab_b.png
+examples/pyexample/html/tab_h.png
+examples/pyexample/html/tab_s.png
+examples/qtstyle/html/tab_a.png
+examples/qtstyle/html/tab_b.png
+examples/qtstyle/html/tab_h.png
+examples/qtstyle/html/tab_s.png
+examples/relates/html/tab_a.png
+examples/relates/html/tab_b.png
+examples/relates/html/tab_h.png
+examples/relates/html/tab_s.png
+examples/restypedef/html/tab_a.png
+examples/restypedef/html/tab_b.png
+examples/restypedef/html/tab_h.png
+examples/restypedef/html/tab_s.png
+examples/structcmd/html/tab_a.png
+examples/structcmd/html/tab_b.png
+examples/structcmd/html/tab_h.png
+examples/structcmd/html/tab_s.png
+examples/tag/html/tab_a.png
+examples/tag/html/tab_b.png
+examples/tag/html/tab_h.png
+examples/tag/html/tab_s.png
+examples/template/html/tab_a.png
+examples/template/html/tab_b.png
+examples/template/html/tab_h.png
+examples/template/html/tab_s.png
diff --git a/doc/infoflow.eps b/doc/infoflow.eps
new file mode 100644
index 0000000..dd7f799
--- /dev/null
+++ b/doc/infoflow.eps
@@ -0,0 +1,646 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: infoflow.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5
+%%CreationDate: Sun Aug 17 14:52:37 2008
+%%For: dimitri@macbook.home.nl (Dimitri Van Heesch)
+%%BoundingBox: 0 0 661 582
+%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.878 0.878 0.878 srgb} bind def
+/col33 {0.000 0.000 0.000 srgb} bind def
+
+end
+save
+newpath 0 582 moveto 0 0 lineto 661 0 lineto 661 582 lineto closepath clip newpath
+-53.3 599.2 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Times-Roman /Times-Roman-iso isovec ReEncode
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06000 0.06000 sc
+%
+% Fig objects follow
+%
+%
+% here starts figure with depth 50
+/Times-Roman-iso ff 200.00 scf sf
+8100 7200 m
+gs 1 -1 sc (import) col0 sh gr
+% Polyline
+0 slj
+0 slc
+7.500 slw
+n 975 3600 m 975 3300 l 2175 3300 l 2175 4800 l
+ 2100 4800 l gs col0 s gr
+% Polyline
+n 1050 3300 m 1050 3225 l 2250 3225 l 2250 4725 l
+ 2175 4725 l gs col0 s gr
+% Polyline
+n 1125 3225 m 1125 3150 l 2325 3150 l 2325 4650 l
+ 2250 4650 l gs col0 s gr
+% Polyline
+n 900 5700 m 1200 5400 l 2100 5400 l 2100 6900 l 900 6900 l 900 5700 l
+ 1200 5700 l
+ 1200 5400 l gs col0 s gr
+% Polyline
+n 975 5625 m 975 5325 l 2175 5325 l 2175 6825 l
+ 2100 6825 l gs col0 s gr
+% Polyline
+n 1050 5325 m 1050 5250 l 2250 5250 l 2250 6750 l
+ 2175 6750 l gs col0 s gr
+% Polyline
+n 1125 5250 m 1125 5175 l 2325 5175 l 2325 6675 l
+ 2250 6675 l gs col0 s gr
+/Times-Roman-iso ff 200.00 scf sf
+1275 6075 m
+gs 1 -1 sc (- headers) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+1275 6675 m
+gs 1 -1 sc (- images) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+1275 6375 m
+gs 1 -1 sc (- footers) col0 sh gr
+% Polyline
+n 6675 8775 m 6975 8475 l 7875 8475 l 7875 9975 l 6675 9975 l 6675 8775 l
+ 6975 8775 l
+ 6975 8475 l gs col0 s gr
+% Polyline
+n 6750 8700 m 6750 8400 l 7950 8400 l 7950 9900 l
+ 7875 9900 l gs col0 s gr
+% Polyline
+n 6825 8400 m 6825 8325 l 8025 8325 l 8025 9825 l
+ 7950 9825 l gs col0 s gr
+% Polyline
+n 6900 8325 m 6900 8250 l 8100 8250 l 8100 9750 l
+ 8025 9750 l gs col0 s gr
+% Polyline
+n 6600 4950 m 6900 4650 l 7800 4650 l 7800 6150 l 6600 6150 l 6600 4950 l
+ 6900 4950 l
+ 6900 4650 l gs col0 s gr
+% Polyline
+n 6675 4875 m 6675 4575 l 7875 4575 l 7875 6075 l
+ 7800 6075 l gs col0 s gr
+% Polyline
+n 6750 4575 m 6750 4500 l 7950 4500 l 7950 6000 l
+ 7875 6000 l gs col0 s gr
+% Polyline
+n 6825 4500 m 6825 4425 l 8025 4425 l 8025 5925 l
+ 7950 5925 l gs col0 s gr
+% Polyline
+n 6600 2925 m 6900 2625 l 7800 2625 l 7800 4125 l 6600 4125 l 6600 2925 l
+ 6900 2925 l
+ 6900 2625 l gs col0 s gr
+% Polyline
+n 6675 2850 m 6675 2550 l 7875 2550 l 7875 4050 l
+ 7800 4050 l gs col0 s gr
+% Polyline
+n 6750 2550 m 6750 2475 l 7950 2475 l 7950 3975 l
+ 7875 3975 l gs col0 s gr
+% Polyline
+n 6825 2475 m 6825 2400 l 8025 2400 l 8025 3900 l
+ 7950 3900 l gs col0 s gr
+% Polyline
+n 6600 900 m 6900 600 l 7800 600 l 7800 2100 l 6600 2100 l 6600 900 l
+ 6900 900 l
+ 6900 600 l gs col0 s gr
+% Polyline
+n 6675 825 m 6675 525 l 7875 525 l 7875 2025 l
+ 7800 2025 l gs col0 s gr
+% Polyline
+n 6750 525 m 6750 450 l 7950 450 l 7950 1950 l
+ 7875 1950 l gs col0 s gr
+% Polyline
+n 6825 450 m 6825 375 l 8025 375 l 8025 1875 l
+ 7950 1875 l gs col0 s gr
+% Polyline
+n 4350 1950 m 4650 1650 l 5550 1650 l 5550 3150 l 4350 3150 l 4350 1950 l
+ 4650 1950 l
+ 4650 1650 l gs col0 s gr
+/Times-Roman-iso ff 200.00 scf sf
+4575 2250 m
+gs 1 -1 sc (Config file) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+4575 2550 m
+gs 1 -1 sc (Doxyfile) col0 sh gr
+% Polyline
+n 2850 1950 m 3150 1650 l 4050 1650 l 4050 3150 l 2850 3150 l 2850 1950 l
+ 3150 1950 l
+ 3150 1650 l gs col0 s gr
+/Times-Roman-iso ff 200.00 scf sf
+3000 2475 m
+gs 1 -1 sc (Layout file) col0 sh gr
+% Polyline
+gs clippath
+3164 4155 m 3315 4155 l 3315 4095 l 3164 4095 l 3164 4095 l 3284 4125 l 3164 4155 l cp
+eoclip
+n 2100 4125 m
+ 3300 4125 l gs col0 s gr gr
+
+% arrowhead
+n 3164 4155 m 3284 4125 l 3164 4095 l 3164 4155 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3164 4380 m 3315 4380 l 3315 4320 l 3164 4320 l 3164 4320 l 3284 4350 l 3164 4380 l cp
+eoclip
+n 2100 6225 m 2700 6225 l 2700 4350 l
+ 3300 4350 l gs col0 s gr gr
+
+% arrowhead
+n 3164 4380 m 3284 4350 l 3164 4320 l 3164 4380 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 3675 5925 m 3975 5625 l 4875 5625 l 4875 7125 l 3675 7125 l 3675 5925 l
+ 3975 5925 l
+ 3975 5625 l gs col0 s gr
+% Polyline
+gs clippath
+4155 4786 m 4155 4635 l 4095 4635 l 4095 4786 l 4095 4786 l 4125 4666 l 4155 4786 l cp
+eoclip
+n 4125 5625 m
+ 4125 4650 l gs col0 s gr gr
+
+% arrowhead
+n 4155 4786 m 4125 4666 l 4095 4786 l 4155 4786 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+4320 5489 m 4320 5640 l 4380 5640 l 4380 5489 l 4380 5489 l 4350 5609 l 4320 5489 l cp
+eoclip
+n 4350 5625 m
+ 4350 4650 l gs col0 s gr gr
+
+% arrowhead
+n 4320 5489 m 4350 5609 l 4380 5489 l 4320 5489 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+6464 1455 m 6615 1455 l 6615 1395 l 6464 1395 l 6464 1395 l 6584 1425 l 6464 1455 l cp
+eoclip
+n 5100 3900 m 6000 3900 l 6000 1425 l
+ 6600 1425 l gs col0 s gr gr
+
+% arrowhead
+n 6464 1455 m 6584 1425 l 6464 1395 l 6464 1455 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+6464 3480 m 6615 3480 l 6615 3420 l 6464 3420 l 6464 3420 l 6584 3450 l 6464 3480 l cp
+eoclip
+n 5100 4050 m 6300 4050 l 6300 3450 l
+ 6600 3450 l gs col0 s gr gr
+
+% arrowhead
+n 6464 3480 m 6584 3450 l 6464 3420 l 6464 3480 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+6464 5580 m 6615 5580 l 6615 5520 l 6464 5520 l 6464 5520 l 6584 5550 l 6464 5580 l cp
+eoclip
+n 5100 4200 m 6300 4200 l 6300 5550 l
+ 6600 5550 l gs col0 s gr gr
+
+% arrowhead
+n 6464 5580 m 6584 5550 l 6464 5520 l 6464 5580 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+6539 7380 m 6690 7380 l 6690 7320 l 6539 7320 l 6539 7320 l 6659 7350 l 6539 7380 l cp
+eoclip
+n 5100 4350 m 6000 4350 l 6000 7350 l
+ 6675 7350 l gs col0 s gr gr
+
+% arrowhead
+n 6539 7380 m 6659 7350 l 6539 7320 l 6539 7380 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+6539 9180 m 6690 9180 l 6690 9120 l 6539 9120 l 6539 9120 l 6659 9150 l 6539 9180 l cp
+eoclip
+n 5100 4500 m 5700 4500 l 5700 9150 l
+ 6675 9150 l gs col0 s gr gr
+
+% arrowhead
+n 6539 9180 m 6659 9150 l 6539 9120 l 6539 9180 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 6675 6675 m 6975 6375 l 7875 6375 l 7875 7875 l 6675 7875 l 6675 6675 l
+ 6975 6675 l
+ 6975 6375 l gs col0 s gr
+% Polyline
+n 3300 3750 m 5100 3750 l 5100 4650 l 3300 4650 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr
+% Polyline
+n 8775 450 m 10800 450 l 10800 1575 l 8775 1575 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr
+% Polyline
+n 9075 900 m 10650 900 l 10650 1425 l 9075 1425 l
+ cp gs col0 s gr
+% Polyline
+gs clippath
+8639 1380 m 8790 1380 l 8790 1320 l 8639 1320 l 8639 1320 l 8759 1350 l 8639 1380 l cp
+eoclip
+n 7800 1350 m
+ 8775 1350 l gs col0 s gr gr
+
+% arrowhead
+n 8639 1380 m 8759 1350 l 8639 1320 l 8639 1380 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+11339 1380 m 11490 1380 l 11490 1320 l 11339 1320 l 11339 1320 l 11459 1350 l 11339 1380 l cp
+eoclip
+n 10800 1350 m
+ 11475 1350 l gs col0 s gr gr
+
+% arrowhead
+n 11339 1380 m 11459 1350 l 11339 1320 l 11339 1380 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+8864 3180 m 9015 3180 l 9015 3120 l 8864 3120 l 8864 3120 l 8984 3150 l 8864 3180 l cp
+eoclip
+n 7800 3150 m
+ 9000 3150 l gs col0 s gr gr
+
+% arrowhead
+n 8864 3180 m 8984 3150 l 8864 3120 l 8864 3180 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+8864 3555 m 9015 3555 l 9015 3495 l 8864 3495 l 8864 3495 l 8984 3525 l 8864 3555 l cp
+eoclip
+n 7800 3525 m
+ 9000 3525 l gs col0 s gr gr
+
+% arrowhead
+n 8864 3555 m 8984 3525 l 8864 3495 l 8864 3555 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 9000 2925 m 10800 2925 l 10800 3675 l 9000 3675 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr
+% Polyline
+gs clippath
+11339 3180 m 11490 3180 l 11490 3120 l 11339 3120 l 11339 3120 l 11459 3150 l 11339 3180 l cp
+eoclip
+n 10800 3150 m
+ 11475 3150 l gs col0 s gr gr
+
+% arrowhead
+n 11339 3180 m 11459 3150 l 11339 3120 l 11339 3180 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+11339 3555 m 11490 3555 l 11490 3495 l 11339 3495 l 11339 3495 l 11459 3525 l 11339 3555 l cp
+eoclip
+n 10800 3525 m
+ 11475 3525 l gs col0 s gr gr
+
+% arrowhead
+n 11339 3555 m 11459 3525 l 11339 3495 l 11339 3555 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+8864 7305 m 9015 7305 l 9015 7245 l 8864 7245 l 8864 7245 l 8984 7275 l 8864 7305 l cp
+eoclip
+n 7875 7275 m
+ 9000 7275 l gs col0 s gr gr
+
+% arrowhead
+n 8864 7305 m 8984 7275 l 8864 7245 l 8864 7305 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+8864 9180 m 9015 9180 l 9015 9120 l 8864 9120 l 8864 9120 l 8984 9150 l 8864 9180 l cp
+eoclip
+n 7875 9150 m
+ 9000 9150 l gs col0 s gr gr
+
+% arrowhead
+n 8864 9180 m 8984 9150 l 8864 9120 l 8864 9180 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 3300 8850 m 5100 8850 l 5100 9525 l 3300 9525 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr
+% Polyline
+gs clippath
+5236 9270 m 5085 9270 l 5085 9330 l 5236 9330 l 5236 9330 l 5116 9300 l 5236 9270 l cp
+eoclip
+n 6675 9300 m
+ 5100 9300 l gs col0 s gr gr
+
+% arrowhead
+n 5236 9270 m 5116 9300 l 5236 9330 l 5236 9270 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+ [60] 0 sd
+n 8700 6450 m 11850 6450 l 11850 9975 l 8700 9975 l
+ cp gs col0 s gr [] 0 sd
+% Polyline
+gs clippath
+4305 7261 m 4305 7110 l 4245 7110 l 4245 7261 l 4245 7261 l 4275 7141 l 4305 7261 l cp
+eoclip
+n 4275 8850 m
+ 4275 7125 l gs col0 s gr gr
+
+% arrowhead
+n 4305 7261 m 4275 7141 l 4245 7261 l 4305 7261 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+4845 1514 m 4845 1665 l 4905 1665 l 4905 1514 l 4905 1514 l 4875 1634 l 4845 1514 l cp
+4905 1186 m 4905 1035 l 4845 1035 l 4845 1186 l 4845 1186 l 4875 1066 l 4905 1186 l cp
+eoclip
+n 4875 1050 m
+ 4875 1650 l gs col0 s gr gr
+
+% arrowhead
+n 4905 1186 m 4875 1066 l 4845 1186 l 4905 1186 l cp gs 0.00 setgray ef gr col0 s
+% arrowhead
+n 4845 1514 m 4875 1634 l 4905 1514 l 4845 1514 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 4125 300 m 5925 300 l 5925 1050 l 4125 1050 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr
+% Polyline
+gs clippath
+4905 3286 m 4905 3135 l 4845 3135 l 4845 3286 l 4845 3286 l 4875 3166 l 4905 3286 l cp
+eoclip
+n 4875 3150 m
+ 4875 3750 l gs col0 s gr gr
+
+% arrowhead
+n 4905 3286 m 4875 3166 l 4845 3286 l 4905 3286 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+4620 3614 m 4620 3765 l 4680 3765 l 4680 3614 l 4680 3614 l 4650 3734 l 4620 3614 l cp
+eoclip
+n 4650 3150 m
+ 4650 3750 l gs col0 s gr gr
+
+% arrowhead
+n 4620 3614 m 4650 3734 l 4680 3614 l 4620 3614 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3720 3614 m 3720 3765 l 3780 3765 l 3780 3614 l 3780 3614 l 3750 3734 l 3720 3614 l cp
+eoclip
+n 3750 3150 m
+ 3750 3750 l gs col0 s gr gr
+
+% arrowhead
+n 3720 3614 m 3750 3734 l 3780 3614 l 3720 3614 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+gs clippath
+3555 3286 m 3555 3135 l 3495 3135 l 3495 3286 l 3495 3286 l 3525 3166 l 3555 3286 l cp
+eoclip
+n 3525 3150 m
+ 3525 3750 l gs col0 s gr gr
+
+% arrowhead
+n 3555 3286 m 3525 3166 l 3495 3286 l 3555 3286 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 9000 8775 m 11175 8775 l 11175 9525 l 9000 9525 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr
+% Polyline
+gs clippath
+11639 7305 m 11790 7305 l 11790 7245 l 11639 7245 l 11639 7245 l 11759 7275 l 11639 7305 l cp
+eoclip
+n 11250 7275 m
+ 11775 7275 l gs col0 s gr gr
+
+% arrowhead
+n 11639 7305 m 11759 7275 l 11639 7245 l 11639 7305 l cp gs 0.00 setgray ef gr col0 s
+% Polyline
+n 9000 6900 m 11250 6900 l 11250 7650 l 9000 7650 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr
+% Polyline
+gs clippath
+11564 9180 m 11715 9180 l 11715 9120 l 11564 9120 l 11564 9120 l 11684 9150 l 11564 9180 l cp
+eoclip
+n 11175 9150 m
+ 11700 9150 l gs col0 s gr gr
+
+% arrowhead
+n 11564 9180 m 11684 9150 l 11564 9120 l 11564 9180 l cp gs 0.00 setgray ef gr col0 s
+/Times-Roman-iso ff 200.00 scf sf
+2850 3975 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+2850 4650 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+4425 5175 m
+gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+3675 5175 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+3900 4275 m
+gs 1 -1 sc (Doxygen) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+8175 3000 m
+gs 1 -1 sc (make ps) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+9675 3375 m
+gs 1 -1 sc (latex) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+11025 825 m
+gs 1 -1 sc (custom) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+11025 1050 m
+gs 1 -1 sc (output) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+11025 3000 m
+gs 1 -1 sc (postscript) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+11025 3825 m
+gs 1 -1 sc (PDF) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6975 9075 m
+gs 1 -1 sc (HTML) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6975 9300 m
+gs 1 -1 sc (pages) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+5475 9525 m
+gs 1 -1 sc (parse) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+3825 9300 m
+gs 1 -1 sc (Doxytag) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+8775 6675 m
+gs 1 -1 sc (Windows only) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+8250 1200 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+1200 4200 m
+gs 1 -1 sc (Sources) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+1275 5775 m
+gs 1 -1 sc (Custom) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+4350 8175 m
+gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+3675 1350 m
+gs 1 -1 sc (generate/edit) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+4425 750 m
+gs 1 -1 sc (Doxywizard) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+4050 3525 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+5025 3375 m
+gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+5025 3600 m
+gs 1 -1 sc (update) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+2625 3375 m
+gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6825 1350 m
+gs 1 -1 sc (XML files) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6750 3300 m
+gs 1 -1 sc (Latex files) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6750 3750 m
+gs 1 -1 sc (Makefile) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+7125 3525 m
+gs 1 -1 sc (+) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6750 5625 m
+gs 1 -1 sc (Man pages) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6900 7350 m
+gs 1 -1 sc (refman.rtf) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+9075 9225 m
+gs 1 -1 sc (HTML Help Workshop) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+8100 3750 m
+gs 1 -1 sc (make pdf) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+9225 1275 m
+gs 1 -1 sc (doxmlparser lib) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+9150 750 m
+gs 1 -1 sc (Your application) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+3900 6450 m
+gs 1 -1 sc (Tag file\(s\)) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+11325 7125 m
+gs 1 -1 sc (doc) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+9750 7350 m
+gs 1 -1 sc (MS-Word) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+11325 9000 m
+gs 1 -1 sc (chm) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+8250 9075 m
+gs 1 -1 sc (read) col0 sh gr
+% Polyline
+n 900 3675 m 1200 3375 l 2100 3375 l 2100 4875 l 900 4875 l 900 3675 l
+ 1200 3675 l
+ 1200 3375 l gs col0 s gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
+%%Trailer
+%EOF
diff --git a/doc/infoflow.fig b/doc/infoflow.fig
new file mode 100644
index 0000000..d09c571
--- /dev/null
+++ b/doc/infoflow.fig
@@ -0,0 +1,240 @@
+#FIG 3.2 Produced by xfig version 3.2.5
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+0 32 #e0e0e0
+0 33 #000000
+6 900 3150 2325 4875
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 900 3675 1200 3375 2100 3375 2100 4875 900 4875 900 3675
+ 1200 3675 1200 3375
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 975 3600 975 3300 2175 3300 2175 4800 2100 4800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1050 3300 1050 3225 2250 3225 2250 4725 2175 4725
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1125 3225 1125 3150 2325 3150 2325 4650 2250 4650
+-6
+6 900 5175 2325 6900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 900 5700 1200 5400 2100 5400 2100 6900 900 6900 900 5700
+ 1200 5700 1200 5400
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 975 5625 975 5325 2175 5325 2175 6825 2100 6825
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1050 5325 1050 5250 2250 5250 2250 6750 2175 6750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1125 5250 1125 5175 2325 5175 2325 6675 2250 6675
+-6
+6 1275 5925 2025 6750
+4 0 0 50 0 0 12 0.0000 4 150 795 1275 6075 - headers\001
+4 0 0 50 0 0 12 0.0000 4 195 720 1275 6675 - images\001
+4 0 0 50 0 0 12 0.0000 4 150 705 1275 6375 - footers\001
+-6
+6 6675 8250 8100 9975
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 6675 8775 6975 8475 7875 8475 7875 9975 6675 9975 6675 8775
+ 6975 8775 6975 8475
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6750 8700 6750 8400 7950 8400 7950 9900 7875 9900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6825 8400 6825 8325 8025 8325 8025 9825 7950 9825
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6900 8325 6900 8250 8100 8250 8100 9750 8025 9750
+-6
+6 6600 4425 8025 6150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 6600 4950 6900 4650 7800 4650 7800 6150 6600 6150 6600 4950
+ 6900 4950 6900 4650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6675 4875 6675 4575 7875 4575 7875 6075 7800 6075
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6750 4575 6750 4500 7950 4500 7950 6000 7875 6000
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6825 4500 6825 4425 8025 4425 8025 5925 7950 5925
+-6
+6 6600 2400 8025 4125
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 6600 2925 6900 2625 7800 2625 7800 4125 6600 4125 6600 2925
+ 6900 2925 6900 2625
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6675 2850 6675 2550 7875 2550 7875 4050 7800 4050
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6750 2550 6750 2475 7950 2475 7950 3975 7875 3975
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6825 2475 6825 2400 8025 2400 8025 3900 7950 3900
+-6
+6 6600 375 8025 2100
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 6600 900 6900 600 7800 600 7800 2100 6600 2100 6600 900
+ 6900 900 6900 600
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6675 825 6675 525 7875 525 7875 2025 7800 2025
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6750 525 6750 450 7950 450 7950 1950 7875 1950
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6825 450 6825 375 8025 375 8025 1875 7950 1875
+-6
+6 4350 1650 5550 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 4350 1950 4650 1650 5550 1650 5550 3150 4350 3150 4350 1950
+ 4650 1950 4650 1650
+4 0 0 50 0 0 12 0.0000 4 195 870 4575 2250 Config file\001
+4 0 0 50 0 0 12 0.0000 4 195 720 4575 2550 Doxyfile\001
+-6
+6 2850 1650 4050 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 2850 1950 3150 1650 4050 1650 4050 3150 2850 3150 2850 1950
+ 3150 1950 3150 1650
+4 0 0 50 -1 0 12 0.0000 4 195 915 3000 2475 Layout file\001
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 2100 4125 3300 4125
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 1 1 1.00 60.00 120.00
+ 2100 6225 2700 6225 2700 4350 3300 4350
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 3675 5925 3975 5625 4875 5625 4875 7125 3675 7125 3675 5925
+ 3975 5925 3975 5625
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 4125 5625 4125 4650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+ 1 1 1.00 60.00 120.00
+ 4350 5625 4350 4650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 1 1 1.00 60.00 120.00
+ 5100 3900 6000 3900 6000 1425 6600 1425
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 1 1 1.00 60.00 120.00
+ 5100 4050 6300 4050 6300 3450 6600 3450
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 1 1 1.00 60.00 120.00
+ 5100 4200 6300 4200 6300 5550 6600 5550
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 1 1 1.00 60.00 120.00
+ 5100 4350 6000 4350 6000 7350 6675 7350
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+ 1 1 1.00 60.00 120.00
+ 5100 4500 5700 4500 5700 9150 6675 9150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+ 6675 6675 6975 6375 7875 6375 7875 7875 6675 7875 6675 6675
+ 6975 6675 6975 6375
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+ 3300 3750 5100 3750 5100 4650 3300 4650 3300 3750
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+ 8775 450 10800 450 10800 1575 8775 1575 8775 450
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 9075 900 10650 900 10650 1425 9075 1425 9075 900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 7800 1350 8775 1350
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 10800 1350 11475 1350
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 7800 3150 9000 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 7800 3525 9000 3525
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+ 9000 2925 10800 2925 10800 3675 9000 3675 9000 2925
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 10800 3150 11475 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 10800 3525 11475 3525
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 7875 7275 9000 7275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 7875 9150 9000 9150
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+ 3300 8850 5100 8850 5100 9525 3300 9525 3300 8850
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 6675 9300 5100 9300
+2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 8700 6450 11850 6450 11850 9975 8700 9975 8700 6450
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 4275 8850 4275 7125
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2
+ 1 1 1.00 60.00 120.00
+ 1 1 1.00 60.00 120.00
+ 4875 1050 4875 1650
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+ 4125 300 5925 300 5925 1050 4125 1050 4125 300
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+ 1 1 1.00 60.00 120.00
+ 4875 3150 4875 3750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 4650 3150 4650 3750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 3750 3150 3750 3750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+ 1 1 1.00 60.00 120.00
+ 3525 3150 3525 3750
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+ 9000 8775 11175 8775 11175 9525 9000 9525 9000 8775
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 11250 7275 11775 7275
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+ 9000 6900 11250 6900 11250 7650 9000 7650 9000 6900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 11175 9150 11700 9150
+4 0 0 50 0 0 12 0.0000 4 150 390 2850 3975 read\001
+4 0 0 50 0 0 12 0.0000 4 150 390 2850 4650 read\001
+4 0 0 50 0 0 12 0.0000 4 165 765 4425 5175 generate\001
+4 0 0 50 0 0 12 0.0000 4 150 390 3675 5175 read\001
+4 0 0 50 0 0 12 0.0000 4 195 780 3900 4275 Doxygen\001
+4 0 0 50 0 0 12 0.0000 4 195 720 8175 3000 make ps\001
+4 0 0 50 0 0 12 0.0000 4 150 420 9675 3375 latex\001
+4 0 0 50 0 0 12 0.0000 4 120 630 11025 825 custom\001
+4 0 0 50 0 0 12 0.0000 4 165 540 11025 1050 output\001
+4 0 0 50 0 0 12 0.0000 4 195 840 11025 3000 postscript\001
+4 0 0 50 0 0 12 0.0000 4 150 390 11025 3825 PDF\001
+4 0 0 50 0 0 12 0.0000 4 150 615 6975 9075 HTML\001
+4 0 0 50 0 0 12 0.0000 4 150 510 6975 9300 pages\001
+4 0 0 50 0 0 12 0.0000 4 150 480 5475 9525 parse\001
+4 0 0 50 0 0 12 0.0000 4 195 735 3825 9300 Doxytag\001
+4 0 0 50 0 0 12 0.0000 4 195 1215 8775 6675 Windows only\001
+4 0 0 50 0 0 12 0.0000 4 150 390 8250 1200 read\001
+4 0 0 50 0 0 12 0.0000 4 150 705 1200 4200 Sources\001
+4 0 0 50 0 0 12 0.0000 4 150 675 1275 5775 Custom\001
+4 0 0 50 0 0 12 0.0000 4 165 765 4350 8175 generate\001
+4 0 0 50 0 0 12 0.0000 4 195 1140 3675 1350 generate/edit\001
+4 0 0 50 0 0 12 0.0000 4 195 1050 4425 750 Doxywizard\001
+4 0 0 50 0 0 12 0.0000 4 150 390 4050 3525 read\001
+4 0 0 50 0 0 12 0.0000 4 165 765 5025 3375 generate\001
+4 0 0 50 -1 0 12 0.0000 4 195 585 5025 3600 update\001
+4 0 0 50 0 0 12 0.0000 4 165 765 2625 3375 generate\001
+4 0 0 50 0 0 12 0.0000 4 150 870 6825 1350 XML files\001
+4 0 0 50 0 0 12 0.0000 4 150 900 6750 3300 Latex files\001
+4 0 0 50 0 0 12 0.0000 4 150 765 6750 3750 Makefile\001
+4 0 0 50 0 0 12 0.0000 4 105 120 7125 3525 +\001
+4 0 0 50 0 0 12 0.0000 4 195 960 6750 5625 Man pages\001
+4 0 0 50 0 0 12 0.0000 4 150 870 6900 7350 refman.rtf\001
+4 0 0 50 0 0 12 0.0000 4 195 1995 9075 9225 HTML Help Workshop\001
+4 0 0 50 0 0 12 0.0000 4 195 795 8100 3750 make pdf\001
+4 0 0 50 0 0 12 0.0000 4 195 1320 9225 1275 doxmlparser lib\001
+4 0 0 50 0 0 12 0.0000 4 195 1395 9150 750 Your application\001
+4 0 0 50 0 0 12 0.0000 4 195 885 3900 6450 Tag file(s)\001
+4 0 0 50 0 0 12 0.0000 4 150 315 11325 7125 doc\001
+4 0 0 50 0 0 12 0.0000 4 150 855 9750 7350 MS-Word\001
+4 0 0 50 0 0 12 0.0000 4 150 375 11325 9000 chm\001
+4 0 0 50 0 0 12 0.0000 4 150 390 8250 9075 read\001
+4 0 0 50 0 0 12 0.0000 4 195 555 8100 7200 import\001
diff --git a/doc/infoflow.gif b/doc/infoflow.gif
new file mode 100644
index 0000000..4bd30c5
--- /dev/null
+++ b/doc/infoflow.gif
Binary files differ
diff --git a/doc/install.doc b/doc/install.doc
new file mode 100644
index 0000000..64eda00
--- /dev/null
+++ b/doc/install.doc
@@ -0,0 +1,683 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page install Installation
+
+\addindex installation
+First go to the
+<a href="http://www.doxygen.org/download.html">download</a> page
+\latexonly({\tt http://www.doxygen.org/download.html})\endlatexonly
+to get the latest distribution, if you did not have it already.
+
+This section is divided into the following sections:
+<ul>
+<li>\ref install_src_unix "Compiling from source on UNIX"
+<li>\ref install_bin_unix "Installing the binaries on UNIX"
+<li>\ref unix_problems "Known compilation problems for UNIX"
+<li>\ref install_src_windows "Compiling from source on Windows"
+<li>\ref install_bin_windows "Installing the binaries on Windows"
+<li>\ref build_tools "Tools used to develop doxygen"
+</ul>
+
+\section install_src_unix Compiling from source on UNIX
+
+If you downloaded the source distribution, you need at least the
+following to build the executable:
+<ul>
+<li>The <a href="ftp://prep.ai.mit.edu/pub/gnu/">GNU</a> tools
+ flex, bison and GNU make, and strip
+ \addindex flex
+ \addindex bison
+ \addindex make
+ \addindex strip
+<li>In order to generate a Makefile for your platform, you need
+ <a href="http://www.perl.com/">perl</a>
+ \latexonly(see {\tt http://www.perl.com/})\endlatexonly.
+ \addindex perl
+<li>The configure script assume the availability of standard UNIX tools such
+ as sed, date, find, uname, mv, cp, cat, echo, tr, cd, and rm.
+</ul>
+
+To take full advantage of doxygen's features the following additional
+tools should be installed.
+
+<ul>
+<li>Qt Software's GUI toolkit
+ <a href="http://qt.nokia.com/">Qt</A>
+ \latexonly(see {\tt http://qt.nokia.com/})\endlatexonly
+ \addindex Qt
+ version 4.3 or higher.
+ This is needed to build the GUI front-end doxywizard.
+<li>A \f$\mbox{\LaTeX}\f$ distribution: for instance
+ <a href="http://www.tug.org/interest.html#free">teTeX 1.0</a>
+ \latexonly (see {\tt http://www.tug.org/interest.html\#free})\endlatexonly.
+ This is needed for generating LaTeX, Postscript, and PDF output.
+<li><a href="http://www.graphviz.org/">
+ the Graph visualization toolkit version 1.8.10 or higher</a>
+ \latexonly (see {\tt http://www.graphviz.org/})\endlatexonly.
+ Needed for the include dependency graphs,
+ the graphical inheritance graphs, and the collaboration graphs.
+ If you compile graphviz yourself, make sure you do include
+ freetype support (which requires the freetype library and header files),
+ otherwise the graphs will not render proper text labels.
+<li>For formulas or if you do not wish to use pdflatex, the ghostscript interpreter
+ is needed. You can find it at
+ <a href="http://www.ghostscript.com/">www.ghostscript.com</a>.
+<li>In order to generate doxygen's own documentation, Python is needed, you
+ can find it at <a href="http://www.python.org">www.python.org</a>.
+</ul>
+
+Compilation is now done by performing the following steps:
+
+<ol>
+<li> Unpack the archive, unless you already have done that:
+
+\verbatim
+ gunzip doxygen-$VERSION.src.tar.gz # uncompress the archive
+ tar xf doxygen-$VERSION.src.tar # unpack it
+\endverbatim
+
+<li>Run the configure script:
+
+\verbatim
+ sh ./configure
+\endverbatim
+
+ The script tries to determine the platform you use, the make tool
+ (which \e must be GNU make) and the perl
+ interpreter. It will report what it finds.
+
+ To override the auto detected platform and compiler you can run
+ configure as follows:
+
+\verbatim
+ configure --platform platform-type
+\endverbatim
+
+ See the <code>PLATFORMS</code> file for a list of possible platform
+ options.
+
+ If you have Qt-4.3 or higher installed and want to build the GUI
+ front-end, you should run the configure script with
+ the <code>--with-doxywizard</code> option:
+
+\verbatim
+ configure --with-doxywizard
+\endverbatim
+
+ For an overview of other configuration options use
+
+\verbatim
+ configure --help
+\endverbatim
+
+<li>Compile the program by running make:
+
+\verbatim
+ make
+\endverbatim
+
+ The program should compile without problems and three binaries
+ (<code>doxygen</code> and <code>doxytag</code>)
+ should be available in the bin directory of the distribution.
+
+<li>Optional: Generate the user manual.
+
+\verbatim
+ make docs
+\endverbatim
+
+ To let doxygen generate the HTML documentation.
+
+ The HTML directory of the distribution will now contain the html
+ documentation (just point a HTML browser to the file
+ <code>index.html</code> in the
+ html directory). You will need the <code>python</code> interpreter
+ for this.
+
+<li>Optional: Generate a PDF version of the manual
+ (you will need <code>pdflatex</code>, <code>makeindex</code>, and
+ <code>egrep</code> for this).
+
+\verbatim
+ make pdf
+\endverbatim
+
+ The PDF manual <code>doxygen_manual.pdf</code> will be located
+ in the latex directory of the distribution. Just
+ view and print it via the acrobat reader.
+
+</ol>
+
+\section install_bin_unix Installing the binaries on UNIX
+
+ After the compilation of the source code do a <code>make install</code>
+ to install doxygen. If you downloaded the binary distribution for UNIX,
+ type:
+
+\verbatim
+ ./configure
+ make install
+\endverbatim
+
+ Binaries are installed into the directory <code>\<prefix\>/bin</code>.
+ Use <code>make install_docs</code> to install the
+ documentation and examples into <code>\<docdir\>/doxygen</code>.
+
+ <code>\<prefix\></code> defaults to <code>/usr/local</code> but can be changed with
+ the <code>--prefix</code> option of the configure script.
+ The default <code>\<docdir\></code> directory is
+ <code>\<prefix\>/share/doc/packages</code> and can be changed with
+ the <code>--docdir</code> option of the configure script.
+
+ Alternatively, you can also copy the binaries from the <code>bin</code>
+ directory manually to some <code>bin</code> directory in your search path.
+ This is sufficient to use doxygen.
+
+ \note You need the GNU install tool for this to work (it is part of
+ the coreutils package). Other install tools may put the binaries in
+ the wrong directory!
+
+ If you have a RPM or DEP package, then please follow the
+ standard installation procedure that is required for these packages.
+
+\section unix_problems Known compilation problems for UNIX
+
+<b>Qt problems</b>
+
+The Qt include files and libraries are not a subdirectory of the
+directory pointed to by QTDIR on some systems
+(for instance on Red Hat 6.0 includes are in /usr/include/qt and
+libs are in /usr/lib).
+
+The solution: go to the root of the doxygen distribution and do:
+\verbatim
+ mkdir qt
+ cd qt
+ ln -s your-qt-include-dir-here include
+ ln -s your-qt-lib-dir-here lib
+ ln -s your-qt-bin-dir-here bin
+ export QTDIR=$PWD
+\endverbatim
+
+If you have a csh-like shell you should use <code>setenv QTDIR \$PWD</code>
+instead of the <code>export</code> command above.
+
+Now install doxygen as described above.
+
+<b>Bison problems</b>
+
+Versions 1.31 to 1.34 of bison contain a "bug" that results in a
+compiler errors like this:
+
+ce_parse.cpp:348: member `class CPPValue yyalloc::yyvs' with
+constructor not allowed in union
+
+This problem has been solved in version 1.35 (versions before 1.31
+will also work).
+
+<b>Latex problems</b>
+
+The file <code>a4wide.sty</code> is not available for all distributions. If
+your distribution does not have it please select another paper type
+in the config file (see the \ref cfg_paper_type "PAPER_TYPE" tag in the
+config file).
+
+<b>HP-UX \& Digital UNIX problems</b>
+
+If you are compiling for HP-UX with aCC and you get this error:
+\verbatim
+ /opt/aCC/lbin/ld: Unsatisfied symbols:
+ alloca (code)
+\endverbatim
+ then you should (according to Anke Selig) edit <code>ce_parse.cpp</code>
+ and replace
+\verbatim
+ extern "C" {
+ void *alloca (unsigned int);
+ };
+\endverbatim
+ with
+\verbatim
+ #include <alloca.h>
+\endverbatim
+
+ If that does not help, try removing <code>ce_parse.cpp</code> and let
+ bison rebuild it (this worked for me).
+
+If you are compiling for Digital UNIX, the same problem can be solved
+(according to Barnard Schmallhof) by replacing the following in
+ce_parse.cpp:
+
+\verbatim
+ #else /* not GNU C. */
+ #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
+ || defined (__sparc) || defined (__sgi)
+ #include <alloca.h>
+\endverbatim
+
+ with
+
+\verbatim
+ #else /* not GNU C. */
+ #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
+ || defined (__sparc) || defined (__sgi) || defined (__osf__)
+ #include <alloca.h>
+\endverbatim
+
+ Alternatively, one could fix the problem at the bison side.
+ Here is patch for bison.simple (provided by Andre Johansen):
+
+\verbatim
+--- bison.simple~ Tue Nov 18 11:45:53 1997
++++ bison.simple Mon Jan 26 15:10:26 1998
+@@ -27,7 +27,7 @@
+ #ifdef __GNUC__
+ #define alloca __builtin_alloca
+ #else /* not GNU C. */
+-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
+ || defined (__sparc) || defined (__sgi)
++#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
+ || defined (__sparc) || defined (__sgi) || defined (__alpha)
+ #include <alloca.h>
+ #else /* not sparc */
+ #if defined (MSDOS) && !defined (__TURBOC__)
+\endverbatim
+
+ The generated scanner.cpp that comes with doxygen is build with this
+ patch applied.
+
+<b>Sun compiler problems</b>
+
+It appears that doxygen doesn't work properly if it is compiled
+with Sun's C++ WorkShop 6 Compiler. I cannot verify this myself as I do
+not have access to a Solaris machine with this compiler. With GNU compiler
+it does work and installing Sun patch 111679-13 has also been reported
+as a way to fix the problem.
+
+when configuring with <code>--static</code> I got:
+
+\verbatim
+Undefined first referenced
+ symbol in file
+dlclose /usr/lib/libc.a(nss_deffinder.o)
+dlsym /usr/lib/libc.a(nss_deffinder.o)
+dlopen /usr/lib/libc.a(nss_deffinder.o)
+\endverbatim
+
+Manually adding <code>-Bdynamic</code> after the target rule in
+<code>Makefile.doxygen</code> and <code>Makefile.doxytag</code>
+will fix this:
+
+\verbatim
+$(TARGET): $(OBJECTS) $(OBJMOC)
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) -Bdynamic
+\endverbatim
+
+<b>GCC compiler problems</b>
+
+Older versions of the GNU compiler have problems with constant strings
+containing characters with character codes larger than 127. Therefore
+the compiler will fail to compile some of the translator_xx.h files.
+A workaround, if you are planning to use the English translation only,
+is to configure doxygen with the <code>--english-only</code> option.
+
+On some platforms (such as OpenBSD) using some versions of gcc with
+-O2 can lead to eating all memory during the compilation of files
+such as config.cpp. As a workaround use --debug as a configure option
+or omit the -O2 for the particular files in the Makefile.
+
+Gcc versions before 2.95 may produce broken binaries due to bugs in
+these compilers.
+
+<b>Dot problems</b>
+
+Due to a change in the way image maps are generated, older versions
+of doxygen (\<=1.2.17) will not work correctly with newer versions of
+graphviz (\>=1.8.8). The effect of this incompatibility is that
+generated graphs in HTML are not properly clickable. For doxygen 1.3
+it is recommended to use at least graphviz 1.8.10 or higher.
+For doxygen 1.4.7 or higher it is recommended to
+use GraphViz 2.8 or higher to avoid font issues.
+
+<b>Red Hat 9.0 problems</b>
+
+If you get the following error after running make
+\verbatim
+tmake error: qtools.pro:70: Syntax error
+\endverbatim
+then first type
+\verbatim
+export LANG=
+\endverbatim
+before running make.
+
+\section install_src_windows Compiling from source on Windows
+
+From version 1.7.0 onwards, build files are provided for Visual Studio 2008.
+Also the free (as in beer) "Express" version of Developer Studio can be used to
+compile doxygen. Alternatively, you can compile doxygen
+\ref install_src_unix "the UNIX way" using
+<a href="http://en.wikipedia.org/wiki/Cygwin">Cygwin</a>
+or <a href="http://www.mingw.org/">MinGW</a>.
+
+The next step is to install unxutils (see http://sourceforge.net/projects/unxutils).
+This packages contains the tools \c flex and \c bison which are needed during the
+compilation process if you use a CVS snapshot of doxygen (the official source releases
+come with pre-generated sources).
+Download the zip extract it to e.g. <code>c:\\tools\\unxutils</code>.
+
+Now you need to add/adjust the following environment variables
+(via Control Panel/System/Advanced/Environment Variables):
+- add <code>c:\\tools\\unxutils\\usr\\local\\wbin;</code> to the start of <code>PATH</code>
+- set <code>BISON_SIMPLE</code> to <code>c:\\tools\\unxutils\\usr\\local\\share\\bison.simple</code>
+
+Download doxygen's source tarball and put it somewhere (e.g use <code>c:\\tools</code>)
+
+Now start a new command shell and type
+\verbatim
+cd c:\tools
+gunzip doxygen-x.y.z.src.tar.gz
+tar xvf doxygen-x.y.z.src.tar
+\endverbatim
+to unpack the sources.
+
+Now your environment is setup to build \c doxygen and \c doxytag.
+
+Inside the \c doxygen-x.y.z directory you will find a \c winbuild directory
+containing a \c Doxygen.sln file. Open this file in Visual Studio.
+You can now build the Release or Debug flavor of Doxygen and Doxytag by right-clicking
+the project in the solutions explorer, and selecting Build.
+
+Note that compiling Doxywizard currently requires Qt version 4
+(see http://qt.nokia.com/products/platform/qt-for-windows).
+
+Also read the next section for additional tools you may need to install to run
+doxygen with certain features enabled.
+
+<!--
+
+Currently, I have only compiled doxygen for Windows using Microsoft's
+Visual C++ (). For other compilers you may need to edit the
+perl script in <code>wintools/make.pl</code> a bit.
+Let me know what you had to change if you got Doxygen working with another
+compiler. If you have Visual Studio you can also use the .dsw file found in
+the <code>wintools</code> directory. Note that this file is not maintained
+by me, so it might be outdated a little.
+
+If you have Visual C++ 6.0, and the source distribution, you can easily
+build doxygen using the project files in the \c wintools directory. If
+you want to build the CVS sources, or want to build from the command line,
+or with another compiler, you have to follow the steps below.
+
+Thomas Baust reported that if you have Visual Studio.NET (2003) then
+you should be aware that there is a problem with the _popen() and _pclose()
+implementation, which currently leaks handles, so if you build doxygen with
+it and use the INPUT_FILTER, you will run to risk of crashing Windows!
+The problem is reported to and confirmed by Microsoft so maybe it will
+fixed in the next service pack.
+
+Since Windows comes without all the nice tools that UNIX users are
+used to, you'll need to install a number of these tools before you can compile
+doxygen for Windows from the command-line.
+
+Here is what is required:
+<ul>
+<li>An unzip/untar tool like WinZip to unpack the tar source distribution.
+ This can be found at http://www.winzip.com/
+
+ The good, tested, and free alternative is the <code>tar</code> utility
+ supplied with <a href="http://sourceware.cygnus.com/cygwin/">cygwin
+ tools</a>. Anyway, the cygwin's flex, bison, and sed are also
+ recommended below.
+
+<li>Microsoft Visual C++ (I only tested with version 6.0).
+ Use the <code>vcvars32.bat</code> batch file to set the environment
+ variables (if you did not select to do this automatically during
+ installation).
+
+ Borland C++ or MINGW (see http://www.mingw.org/) are also supported.
+
+<li>Perl 5.0 or higher for Windows. This can be downloaded from:
+ http://www.ActiveState.com/Products/ActivePerl/
+
+<li>The GNU tools flex, bison, and sed.
+ To get these working on Windows you should install the
+ <a href="http://sources.redhat.com/cygwin/">cygwin tools</a>
+ \latexonly(see {\tt http://sources.redhat.com/cygwin/})\endlatexonly
+
+ Alternatively, you can also choose to
+ download only a <a href="http://www.doxygen.org/dl/cygwin_tools.zip">small subset</a>
+ \latexonly(see {\tt http://www.doxygen.org/dl/cygwin\_tools.zip})\endlatexonly
+ of the cygwin tools that I put together just to compile doxygen.
+
+ As a third alternative one could use the GNUWin32 tools that can be
+ found at http://gnuwin32.sourceforge.net/
+
+ Make sure the <code>BISON_SIMPLE</code> environment variable points to the
+ location where the files <code>bison.simple</code> and
+ is located. For instance if these file is in
+ <code>c:\\tools\\cygwin\\usr\\share</code> then BISON_SIMPLE should
+ be set to <code>c:/tools/cygwin/usr/share/bison.simple</code>
+
+ Also make sure the tools are available from a dos box, by adding
+ the directory they are in to the search path.
+
+ For those of you who are very new to cygwin (if you are going to
+ install it from scratch), you should notice that there is an
+ archive file <code>bootstrap.zip</code> which also contains the
+ <code>tar</code> utility (<code>tar.exe</code>), <code>gzip</code>
+ utilities, and the <code>cygwin1.dll</code> core. This also means
+ that you have the <code>tar</code> in hands from the start. It
+ can be used to unpack the tar source distribution instead of
+ using WinZip -- as mentioned at the beginning of this list of
+ steps.
+
+<li>From Doxygen-1.2.2-20001015 onwards, the distribution includes the part
+ of Qt that is needed for to compile doxygen and doxytag,
+ The Windows specific part were also created.
+ As a result doxygen (without the wizard) can be compiled on systems
+ without X11 or the (commerical) version of Qt.
+
+<li>If you used WinZip to extract the tar archive it will (apparently) not
+ create empty folders, so you have to add the folders
+ <code>objects</code> and <code>bin</code> manually in the root of the
+ distribution before compiling.
+
+</ul>
+
+
+Compilation is now done by performing the following steps:
+
+<ol>
+<li>Open a dos box.
+ Make sure all tools (i.e. <code>nmake</code>, <code>latex</code>,
+ <code>gswin32</code>, <code>dvips</code>, <code>sed</code>,
+ <code>flex</code>, <code>bison</code>, <code>cl</code>,
+ <code>rm</code>, and <code>perl</code>), are accessible from
+ the command-line (add them to the PATH environment variable if
+ needed).
+
+ Notice: The use of LaTeX is optional and only needed for compilation
+ of the documentation into PostScript or PDF.
+ It is \e not needed for compiling the doxygen's binaries.
+
+<li>Go to the doxygen root dir and type:
+
+\verbatim
+ make.bat msvc
+\endverbatim
+
+ This should build the executables
+ <code>doxygen.exe</code> and <code>doxytag.exe</code>
+ using Microsoft's Visual C++ compiler
+ (The compiler should not produce any serious warnings or errors).
+
+ You can use also the <code>bcc</code> argument to build
+ executables using the Borland C++ compiler, or
+ <code>mingw</code> argument to compile using GNU gcc.
+
+<li>To build the examples, go to the <code>examples</code> subdirectory
+ and type:
+
+\verbatim
+ nmake
+\endverbatim
+
+<li>To generate the doxygen documentation, go to the <code>doc</code>
+ subdirectory and type:
+
+\verbatim
+ nmake
+\endverbatim
+
+ The generated HTML docs are located in the <code>..\\html</code>
+ subdirectory.
+
+ The sources for LaTeX documentation are located in the <code>..\\latex</code>
+ subdirectory. From those sources, the DVI, PostScript, and PDF
+ documentation can be generated.
+</ol>
+
+-->
+
+\section install_bin_windows Installing the binaries on Windows
+
+Doxygen comes as a self-installing archive, so installation is extremely simple.
+Just follow the dialogs.
+
+After installation it is recommended to also download and install GraphViz
+(version 2.8 or better is highly recommended). Doxygen can use the \c dot tool
+of the GraphViz package to render nicer diagrams, see the
+\ref cfg_have_dot "HAVE_DOT" option in the configuration file.
+
+If you want to produce compressed HTML files (see \ref
+cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the config file, then
+you need the Microsoft HTML help workshop.
+You can download it from
+<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconHH1Start.asp">Microsoft</a>.
+
+If you want to produce Qt Compressed Help files (see \ref
+cfg_qhg_location "QHG_LOCATION") in the config file, then
+you need qhelpgenerator which is part of Qt.
+You can download Qt from <a href="http://trolltech.com/downloads/">Qt Software Downloads</a>.
+
+In order to generate PDF output or use scientific formulas you will also need to
+install <a href="http://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and
+<a href="http://en.wikipedia.org/wiki/Ghostscript">Ghostscript</a>.
+
+For LaTeX a number of distributions exists. Popular ones that should work with
+doxygen are <a href="http://www.miktex.org">MikTex</a>
+and <a href="http://www.xemtex.org">XemTex</a>.
+
+Ghostscript can be <a href="http://sourceforge.net/projects/ghostscript/">downloaded</a>
+from Sourceforge.
+
+After installing LaTeX and Ghostscript you'll need to make sure the tools
+latex.exe, pdflatex.exe, and gswin32c.exe are present in the search path of a
+command box. Follow <a href="http://www.computerhope.com/issues/ch000549.htm">these</a>
+instructions if you are unsure and run the commands from a command box to verify it works.
+
+<!--
+There is no fancy installation procedure at the moment (if anyone can
+add it in a location independent way please let me know).
+
+To install doxygen, just copy the binaries from the <code>bin</code> directory
+to a location somewhere in the path. Alternatively, you can include
+the <code>bin</code> directory of the distribution to the path.
+
+There are a couple of tools you may want to install to use all of doxygen's
+features:
+
+<ul>
+<li>To generate LaTeX documentation or formulas in HTML you need the tools:
+ <code>latex</code>, <code>dvips</code> and <code>gswin32</code>.
+ To get these working under Windows
+ install the fpTeX distribution. You can find more info at:
+ http://www.fptex.org/ and download it from CTAN or one of its mirrors.
+ In the Netherlands for example this would be:
+ ftp://ftp.easynet.nl/mirror/CTAN/systems/win32/fptex/
+
+ Make sure the tools are available from a dos box, by adding the
+ directory they are in to the search path.
+
+ For your information, the LaTeX is freely available set of so
+ called macros and styles on the top of the famous TeX program
+ (by famous Donald Knuth) and the accompanied utilities (all
+ available for free). It is used for high quality
+ typesetting. The result -- in the form of so called
+ <code>DVI</code> (DeVice Independent) file -- can be printed or
+ displayed on various devices preserving exactly the same look up
+ to the capability of the device. The <code>dvips</code> allows you
+ to convert the <code>dvi</code> to the high quality PostScript
+ (i.e. PostScript that can be processed by utilities like
+ <code>psnup</code>, <code>psbook</code>, <code>psselect</code>,
+ and others). The derived version of TeX (the pdfTeX) can be used
+ to produce PDF output instead of DVI, or the PDF can be produced
+ from PostScript using the utility <code>ps2pdf</code>.
+
+ If you want to use MikTeX then you need to select at least the
+ medium size installation. For really old versions of MikTex or minimal
+ installations, you may need to download the fancyhdr package separately.
+ You can find it in the
+ <a href="ftp://ftp.tex.ac.uk/tex-archive/macros/latex/contrib/supported/fancyhdr/">
+ contrib/supported</a> directory of the tex archives.
+
+<li>If you want to generate compressed HTML help
+ (see \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the
+ config file, then you need the Microsoft HTML help workshop.
+ You can download it from
+ <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconHH1Start.asp">Microsoft</a>.
+
+<li>If you want to produce Qt Compressed Help files (see \ref
+ cfg_qhelgenerator_loc "QHG_LOCATION") in the config file,
+ then you need qhelpgenerator which is part of Qt.
+ You can download Qt from
+ <a href="http://trolltech.com/downloads/">Qt Software Downloads</a>.
+
+<li><a href="http://www.graphviz.org/">
+ the Graph visualization toolkit version 1.8.10</a><br>
+ \latexonly(see {\tt http://www.graphviz.org/})\endlatexonly.
+ Needed for the include dependency graphs, the graphical inheritance graphs,
+ and the collaboration graphs.
+</ul>
+
+-->
+
+\section build_tools Tools used to develop doxygen
+
+Doxygen was developed and tested under Linux &amp; MacOSX using the following
+open-source tools:
+<ul>
+<li>GCC version 3.3.6 (Linux) and 4.0.1 (MacOSX)
+<li>GNU flex version 2.5.33 (Linux) and 2.5.4 (MacOSX)
+<li>GNU bison version 1.75
+<li>GNU make version 3.80
+<li>Perl version 5.8.1
+<li>VIM version 6.2
+<li>Firefox 1.5
+<li>Trolltech's tmake version 1.3 (included in the distribution)
+<li>teTeX version 2.0.2
+<li>CVS 1.12.12
+</ul>
+
+\htmlonly
+Go to the <a href="starting.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
+
diff --git a/doc/install_prefix b/doc/install_prefix
new file mode 100644
index 0000000..681eca9
--- /dev/null
+++ b/doc/install_prefix
@@ -0,0 +1,2 @@
+VERSION = $(VERSION)
+
diff --git a/doc/installdox_usage.doc b/doc/installdox_usage.doc
new file mode 100644
index 0000000..a93ca0a
--- /dev/null
+++ b/doc/installdox_usage.doc
@@ -0,0 +1,59 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page installdox_usage Installdox usage
+
+Installdox is a perl script that is generated by doxygen whenever
+tag files are used (See \c TAGFILES
+in section \ref config_extref). The script is
+located in the same directory where the HTML files are located.
+
+Its purpose is to set the location of the external documentation
+for each tag file at install time.
+
+Calling \c installdox with option <b>-h</b> at the command line
+will give you a brief description of the usage of the program.
+
+The following options are available:
+<dl>
+<dt><b>-l <tt>\<tagfile\>\@\<location\></tt></b><dd>
+ Each tag file contains information about the files, classes and members
+ documented in a set of HTML files. A user can install these
+ HTML files anywhere on his/her hard disk or web site.
+ Therefore installdox \e requires the location of the
+ documentation for each tag file <tt>\<tagfile\></tt>
+ that is used by doxygen. The location <tt>\<location\></tt> can be
+ an absolute path or a URL.
+
+ \par Note:
+ Each \<tagfile\> must be unique and should only be the name of the
+ file, not including the path.
+
+<dt><b>-q</b><dd>
+ When this option is specified, installdox will generate no output other
+ than fatal errors.
+</dl>
+Optionally a list of HTML files may be given.
+These files are scanned and modified if needed.
+If this list is omitted all files in the current directory
+that end with \c .html are used.
+
+The \c installdox script is unique for each generated class browser
+in the sense that it `knows' what tag files are used. It will generate an error if
+the <b>-l</b> option is missing for a tag file or if an invalid tag file
+is given.
+
+*/
diff --git a/doc/language.doc b/doc/language.doc
new file mode 100644
index 0000000..250f166
--- /dev/null
+++ b/doc/language.doc
@@ -0,0 +1,737 @@
+/******************************************************************************
+ * Do not edit this file. It was generated by the translator.py script.
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * $Id$
+ */
+/*! \page langhowto Internationalization
+
+<h3>Support for multiple languages</h3>
+
+Doxygen has built-in support for multiple languages. This means that the
+text fragments, generated by doxygen, can be produced in languages other
+than English (the default). The output language is chosen through the
+configuration file (with default name and known as Doxyfile).
+
+Currently (version 1.7.3), 38 languages
+are supported (sorted alphabetically):
+Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese
+Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto,
+Finnish, French, German, Greek, Hungarian, Indonesian, Italian,
+Japanese (+En), Korean (+En), Lithuanian, Macedonian, Norwegian,
+Persian, Polish, Portuguese, Romanian, Russian, Serbian,
+SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish, Ukrainian,
+and Vietnamese..
+
+The table of information related to the supported languages follows.
+It is sorted by language alphabetically. The <b>Status</b> column
+was generated from sources and shows approximately the last version
+when the translator was updated.
+
+\htmlonly
+<table align="center" cellspacing="0" cellpadding="0" border="0">
+<tr bgcolor="#000000">
+<td>
+ <table cellspacing="1" cellpadding="2" border="0">
+ <tr bgcolor="#4040c0">
+ <td ><b><font size="+1" color="#ffffff"> Language </font></b></td>
+ <td ><b><font size="+1" color="#ffffff"> Maintainer </font></b></td>
+ <td ><b><font size="+1" color="#ffffff"> Contact address </font>
+ <font size="-2" color="#ffffff">(replace the at and dot)</font></b></td>
+ <td ><b><font size="+1" color="#ffffff"> Status </font></b></td>
+ </tr>
+ <!-- table content begin -->
+
+ <tr bgcolor="#ffffff">
+ <td>Afrikaans</td>
+ <td>Johan Prinsloo</td>
+ <td>johan at zippysnoek dot com</td>
+ <td>1.6.0</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Arabic</td>
+ <td>Moaz Reyad<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td>
+ <td><span style="color: brown">[resigned]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td>
+ <td>1.4.6</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Brazilian Portuguese</td>
+ <td>Fabio "FJTC" Jun Takada Chino</td>
+ <td>jun-chino at uol dot com dot br</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Catalan</td>
+ <td>Maximiliano Pin<br/>Albert Mora</td>
+ <td>max dot pin at bitroit dot com<br/><span style="color: brown">[unreachable]</span></td>
+ <td>1.6.3</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Chinese</td>
+ <td>Lang Yang<br/>Li Daobing<br/>Wei Liu</td>
+ <td>lian dot yang dot cn at gmail dot com<br/>lidaobing at gmail dot com<br/>liuwei at asiainfo dot com</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Chinese Traditional</td>
+ <td>Daniel YC Lin<br/>Gary Lee</td>
+ <td>dlin dot tw at gmail dot com<br/>garywlee at gmail dot com</td>
+ <td>1.6.0</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Croatian</td>
+ <td>Boris Bralo</td>
+ <td>boris dot bralo at gmail dot com</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Czech</td>
+ <td>Petr Přikryl</td>
+ <td>prikrylp at skil dot cz</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Danish</td>
+ <td>Poul-Erik Hansen<br/>Erik Søe Sørensen</td>
+ <td>pouhan at gnotometrics dot dk<br/>eriksoe+doxygen at daimi dot au dot dk</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Dutch</td>
+ <td>Dimitri van Heesch</td>
+ <td>dimitri at stack dot nl</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>English</td>
+ <td>Dimitri van Heesch</td>
+ <td>dimitri at stack dot nl</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Esperanto</td>
+ <td>Ander Martinez</td>
+ <td>dwarfnauko at gmail dot com</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Finnish</td>
+ <td>Antti Laine</td>
+ <td>antti dot a dot laine at tut dot fi</td>
+ <td>1.6.0</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>French</td>
+ <td>Xavier Outhier</td>
+ <td>xouthier at yahoo dot fr</td>
+ <td>1.6.3</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>German</td>
+ <td>Jens Seidel</td>
+ <td>jensseidel at users dot sf dot net</td>
+ <td>1.6.3</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Greek</td>
+ <td>Paul Gessos</td>
+ <td>gessos dot paul at yahoo dot gr</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Hungarian</td>
+ <td>Ákos Kiss<br/>Földvári György</td>
+ <td>akiss at users dot sourceforge dot net<br/><span style="color: brown">[unreachable]</span></td>
+ <td>1.4.6</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Indonesian</td>
+ <td>Hendy Irawan</td>
+ <td>ceefour at gauldong dot net</td>
+ <td>1.4.6</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Italian</td>
+ <td>Alessandro Falappa<br/>Ahmed Aldo Faisal</td>
+ <td>alessandro at falappa dot net<br/>aaf23 at cam dot ac dot uk</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Japanese</td>
+ <td>Hiroki Iseri<br/>Ryunosuke Satoh<br/>Kenji Nagamatsu<br/>Iwasa Kazmi</td>
+ <td>goyoki at gmail dot com<br/>sun594 at hotmail dot com<br/>naga at joyful dot club dot ne dot jp<br/><span style="color: brown">[unreachable]</span></td>
+ <td>1.6.0</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>JapaneseEn</td>
+ <td>see the Japanese language</td>
+ <td>&nbsp;</td>
+ <td>English based</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Korean</td>
+ <td>Kim Taedong<br/>SooYoung Jung<br/>Richard Kim</td>
+ <td>fly1004 at gmail dot com<br/>jung5000 at gmail dot com<br/><span style="color: brown">[unreachable]</span></td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>KoreanEn</td>
+ <td>see the Korean language</td>
+ <td>&nbsp;</td>
+ <td>English based</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Lithuanian</td>
+ <td>Tomas Simonaitis<br/>Mindaugas Radzius<br/>Aidas Berukstis<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td>
+ <td><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td>
+ <td>1.4.6</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Macedonian</td>
+ <td>Slave Jovanovski</td>
+ <td>slavejovanovski at yahoo dot com</td>
+ <td>1.6.0</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Norwegian</td>
+ <td>Lars Erik Jordet</td>
+ <td>lejordet at gmail dot com</td>
+ <td>1.4.6</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Persian</td>
+ <td>Ali Nadalizadeh</td>
+ <td>nadalizadeh at gmail dot com</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Polish</td>
+ <td>Piotr Kaminski<br/>Grzegorz Kowal<br/>Krzysztof Kral</td>
+ <td><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/>krzysztof dot kral at gmail dot com</td>
+ <td>1.6.3</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Portuguese</td>
+ <td>Rui Godinho Lopes<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td>
+ <td><span style="color: brown">[resigned]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td>
+ <td>1.3.3</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Romanian</td>
+ <td>Ionut Dumitrascu<br/>Alexandru Iosup</td>
+ <td>reddumy at yahoo dot com<br/>aiosup at yahoo dot com</td>
+ <td>1.6.0</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Russian</td>
+ <td>Alexandr Chelpanov</td>
+ <td>cav at cryptopro dot ru</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Serbian</td>
+ <td>Dejan Milosavljevic</td>
+ <td><span style="color: brown">[unreachable]</span></td>
+ <td>1.6.0</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>SerbianCyrilic</td>
+ <td>Nedeljko Stefanovic</td>
+ <td>stenedjo at yahoo dot com</td>
+ <td>1.6.0</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Slovak</td>
+ <td>Kali+Laco Švec<br/>Petr Přikryl</td>
+ <td>the Slovak language advisors<br/>prikrylp at skil dot cz</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Slovene</td>
+ <td>Matjaž Ostroveršnik</td>
+ <td>matjaz dot ostroversnik at ostri dot org</td>
+ <td>1.4.6</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Spanish</td>
+ <td>Bartomeu<br/>Francisco Oltra Thennet<br/>David Vaquero</td>
+ <td>bartomeu at loteria3cornella dot com<br/><span style="color: brown">[unreachable]</span><br/>david at grupoikusnet dot com</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Swedish</td>
+ <td>Mikael Hallin</td>
+ <td>mikaelhallin at yahoo dot se</td>
+ <td>1.6.0</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Turkish</td>
+ <td>Emin Ilker Cetinbas</td>
+ <td>niw3 at yahoo dot com</td>
+ <td>up-to-date</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Ukrainian</td>
+ <td>Olexij Tkatchenko<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td>
+ <td><span style="color: brown">[resigned]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td>
+ <td>1.4.1</td>
+ </tr>
+ <tr bgcolor="#ffffff">
+ <td>Vietnamese</td>
+ <td>Dang Minh Tuan</td>
+ <td>tuanvietkey at gmail dot com</td>
+ <td>1.6.0</td>
+ </tr>
+ <!-- table content end -->
+ </table>
+</td>
+</tr>
+</table>
+\endhtmlonly
+
+
+\latexonly
+\footnotesize
+\begin{longtable}{|l|l|l|l|}
+ \hline
+ {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
+ \hline
+
+ \hline
+ Afrikaans & Johan Prinsloo & {\tt\tiny johan at zippysnoek dot com} & 1.6.0 \\
+ \hline
+ Arabic & Moaz Reyad & {\tt\tiny [resigned] moazreyad at yahoo dot com} & 1.4.6 \\
+ ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\
+ \hline
+ Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino at uol dot com dot br} & up-to-date \\
+ \hline
+ Catalan & Maximiliano Pin & {\tt\tiny max dot pin at bitroit dot com} & 1.6.3 \\
+ ~ & Albert Mora & {\tt\tiny [unreachable] amora at iua dot upf dot es} & ~ \\
+ \hline
+ Chinese & Lang Yang & {\tt\tiny lian dot yang dot cn at gmail dot com} & up-to-date \\
+ ~ & Li Daobing & {\tt\tiny lidaobing at gmail dot com} & ~ \\
+ ~ & Wei Liu & {\tt\tiny liuwei at asiainfo dot com} & ~ \\
+ \hline
+ Chinese Traditional & Daniel YC Lin & {\tt\tiny dlin dot tw at gmail dot com} & 1.6.0 \\
+ ~ & Gary Lee & {\tt\tiny garywlee at gmail dot com} & ~ \\
+ \hline
+ Croatian & Boris Bralo & {\tt\tiny boris dot bralo at gmail dot com} & up-to-date \\
+ \hline
+ Czech & Petr Přikryl & {\tt\tiny prikrylp at skil dot cz} & up-to-date \\
+ \hline
+ Danish & Poul-Erik Hansen & {\tt\tiny pouhan at gnotometrics dot dk} & up-to-date \\
+ ~ & Erik Søe Sørensen & {\tt\tiny eriksoe+doxygen at daimi dot au dot dk} & ~ \\
+ \hline
+ Dutch & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & up-to-date \\
+ \hline
+ English & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & up-to-date \\
+ \hline
+ Esperanto & Ander Martinez & {\tt\tiny dwarfnauko at gmail dot com} & up-to-date \\
+ \hline
+ Finnish & Antti Laine & {\tt\tiny antti dot a dot laine at tut dot fi} & 1.6.0 \\
+ \hline
+ French & Xavier Outhier & {\tt\tiny xouthier at yahoo dot fr} & 1.6.3 \\
+ \hline
+ German & Jens Seidel & {\tt\tiny jensseidel at users dot sf dot net} & 1.6.3 \\
+ \hline
+ Greek & Paul Gessos & {\tt\tiny gessos dot paul at yahoo dot gr} & up-to-date \\
+ \hline
+ Hungarian & Ákos Kiss & {\tt\tiny akiss at users dot sourceforge dot net} & 1.4.6 \\
+ ~ & Földvári György & {\tt\tiny [unreachable] foldvari lost at cyberspace} & ~ \\
+ \hline
+ Indonesian & Hendy Irawan & {\tt\tiny ceefour at gauldong dot net} & 1.4.6 \\
+ \hline
+ Italian & Alessandro Falappa & {\tt\tiny alessandro at falappa dot net} & up-to-date \\
+ ~ & Ahmed Aldo Faisal & {\tt\tiny aaf23 at cam dot ac dot uk} & ~ \\
+ \hline
+ Japanese & Hiroki Iseri & {\tt\tiny goyoki at gmail dot com} & 1.6.0 \\
+ ~ & Ryunosuke Satoh & {\tt\tiny sun594 at hotmail dot com} & ~ \\
+ ~ & Kenji Nagamatsu & {\tt\tiny naga at joyful dot club dot ne dot jp} & ~ \\
+ ~ & Iwasa Kazmi & {\tt\tiny [unreachable] iwasa at cosmo-system dot jp} & ~ \\
+ \hline
+ JapaneseEn & see the Japanese language & {\tt\tiny ~} & English based \\
+ \hline
+ Korean & Kim Taedong & {\tt\tiny fly1004 at gmail dot com} & up-to-date \\
+ ~ & SooYoung Jung & {\tt\tiny jung5000 at gmail dot com} & ~ \\
+ ~ & Richard Kim & {\tt\tiny [unreachable] ryk at dspwiz dot com} & ~ \\
+ \hline
+ KoreanEn & see the Korean language & {\tt\tiny ~} & English based \\
+ \hline
+ Lithuanian & Tomas Simonaitis & {\tt\tiny [unreachable] haden at homelan dot lt} & 1.4.6 \\
+ ~ & Mindaugas Radzius & {\tt\tiny [unreachable] mindaugasradzius at takas dot lt} & ~ \\
+ ~ & Aidas Berukstis & {\tt\tiny [unreachable] aidasber at takas dot lt} & ~ \\
+ ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\
+ \hline
+ Macedonian & Slave Jovanovski & {\tt\tiny slavejovanovski at yahoo dot com} & 1.6.0 \\
+ \hline
+ Norwegian & Lars Erik Jordet & {\tt\tiny lejordet at gmail dot com} & 1.4.6 \\
+ \hline
+ Persian & Ali Nadalizadeh & {\tt\tiny nadalizadeh at gmail dot com} & up-to-date \\
+ \hline
+ Polish & Piotr Kaminski & {\tt\tiny [unreachable] Piotr dot Kaminski at ctm dot gdynia dot pl} & 1.6.3 \\
+ ~ & Grzegorz Kowal & {\tt\tiny [unreachable] g\_kowal at poczta dot onet dot pl} & ~ \\
+ ~ & Krzysztof Kral & {\tt\tiny krzysztof dot kral at gmail dot com} & ~ \\
+ \hline
+ Portuguese & Rui Godinho Lopes & {\tt\tiny [resigned] rgl at ruilopes dot com} & 1.3.3 \\
+ ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\
+ \hline
+ Romanian & Ionut Dumitrascu & {\tt\tiny reddumy at yahoo dot com} & 1.6.0 \\
+ ~ & Alexandru Iosup & {\tt\tiny aiosup at yahoo dot com} & ~ \\
+ \hline
+ Russian & Alexandr Chelpanov & {\tt\tiny cav at cryptopro dot ru} & up-to-date \\
+ \hline
+ Serbian & Dejan Milosavljevic & {\tt\tiny [unreachable] dmilos at email dot com} & 1.6.0 \\
+ \hline
+ SerbianCyrilic & Nedeljko Stefanovic & {\tt\tiny stenedjo at yahoo dot com} & 1.6.0 \\
+ \hline
+ Slovak & Kali+Laco Švec & {\tt\tiny the Slovak language advisors} & up-to-date \\
+ ~ & Petr Přikryl & {\tt\tiny prikrylp at skil dot cz} & ~ \\
+ \hline
+ Slovene & Matjaž Ostroveršnik & {\tt\tiny matjaz dot ostroversnik at ostri dot org} & 1.4.6 \\
+ \hline
+ Spanish & Bartomeu & {\tt\tiny bartomeu at loteria3cornella dot com} & up-to-date \\
+ ~ & Francisco Oltra Thennet & {\tt\tiny [unreachable] foltra at puc dot cl} & ~ \\
+ ~ & David Vaquero & {\tt\tiny david at grupoikusnet dot com} & ~ \\
+ \hline
+ Swedish & Mikael Hallin & {\tt\tiny mikaelhallin at yahoo dot se} & 1.6.0 \\
+ \hline
+ Turkish & Emin Ilker Cetinbas & {\tt\tiny niw3 at yahoo dot com} & up-to-date \\
+ \hline
+ Ukrainian & Olexij Tkatchenko & {\tt\tiny [resigned] olexij at tkatchenko dot com} & 1.4.1 \\
+ ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\
+ \hline
+ Vietnamese & Dang Minh Tuan & {\tt\tiny tuanvietkey at gmail dot com} & 1.6.0 \\
+ \hline
+\end{longtable}
+\normalsize
+\endlatexonly
+
+
+Most people on the list have indicated that they were also busy
+doing other things, so if you want to help to speed things up please
+let them (or me) know.
+
+If you want to add support for a language that is not yet listed
+please read the next section.
+
+
+<h3>Adding a new language to doxygen</h3>
+
+This short HOWTO explains how to add support for the new language to Doxygen:
+
+Just follow these steps:
+<ol>
+<li>Tell me for which language you want to add support. If no one else
+ is already working on support for that language, you will be
+ assigned as the maintainer for the language.
+<li>Create a copy of translator_en.h and name it
+ translator_\<your_2_letter_country_code\>.h
+ I'll use xx in the rest of this document.
+<li>Add definition of the symbol for your language in the configure
+at two places in the script:
+ <ol>
+ <li>After the <code>f_langs=</code> is statement, in lower case.
+ <li>In the string that following <code>\@allowed=</code> in upper case.
+ </ol>
+The rerun the configure script such that is generates src/lang_cfg.h.
+This file should now contain a \#define for your language code.
+<li>Edit language.cpp:
+ Add a
+\verbatim
+#ifdef LANG_xx
+#include<translator_xx.h>
+#endif
+\endverbatim
+ Remember to use the same symbol LANG_xx that you added to \c lang_cfg.h.
+ I.e., the \c xx should be capital letters that identify your language.
+ On the other hand, the \c xx inside your \c translator_xx.h should use
+ lower case.
+ <p>Now, in <code>setTranslator()</code> add
+\verbatim
+#ifdef LANG_xx
+ else if (L_EQUAL("your_language_name"))
+ {
+ theTranslator = new TranslatorYourLanguage;
+ }
+#endif
+\endverbatim
+ after the <code>if { ... }</code>. I.e., it must be placed after the code
+ for creating the English translator at the beginning, and before the
+ <code>else { ... }</code> part that creates the translator for the
+ default language (English again).
+<li>Edit libdoxygen.pro.in and add \c translator_xx.h to
+ the \c HEADERS line.
+<li>Edit <code>translator_xx.h</code>:
+ <ul>
+ <li>Rename <code>TRANSLATOR_EN_H</code> to <code>TRANSLATOR_XX_H</code>
+ twice (i.e. in the \c \#ifndef and \c \#define preprocessor commands at
+ the beginning of the file).
+ <li>Rename TranslatorEnglish to TranslatorYourLanguage
+ <li>In the member <code>idLanguage()</code> change "english" into the
+ name of your language (use lower case characters only). Depending
+ on the language you may also wish to change the member functions
+ latexLanguageSupportCommand(), idLanguageCharset() and others
+ (you will recognize them when you start the work).
+ <li>Edit all the strings that are returned by the member functions that
+ start with tr.
+ Try to match punctuation and capitals!
+ To enter special characters (with accents) you can:
+ <ul>
+ <li> Enter them directly if your keyboard supports that and you are
+ using a Latin-1 font. Doxygen will translate the
+ characters to proper \f$\mbox{\LaTeX}\f$ and leave the
+ HTML and man output for what it is (which is fine, if
+ idLanguageCharset() is set correctly).
+ <li> Use html codes like \&auml; for an a with an umlaut (i.e. &auml;).
+ See the HTML specification for the codes.
+ </ul>
+ </ul>
+<li>Run configure and make again from the root of the distribution,
+ in order to regenerated the Makefiles.
+<li>Now you can use <code>OUTPUT_LANGUAGE = your_language_name</code>
+ in the config file to generate output in your language.
+<li>Send <code>translator_xx.h</code> to me so I can add it to doxygen.
+ Send also your name and e-mail address to be included in the
+ \c maintainers.txt list.
+</ol>
+
+
+<h3>Maintaining a language</h3>
+
+New versions of doxygen may use new translated sentences. In such
+situation, the \c Translator class requires implementation of new
+methods -- its interface changes. Of course, the English
+sentences need to be translated to the other languages. At least,
+new methods have to be implemented by the language-related
+translator class; otherwise, doxygen wouldn't even compile. Waiting
+until all language maintainers have translated the new sentences and
+sent the results would not be very practical. The following text
+describes the usage of translator adapters to solve the problem.
+
+<b>The role of Translator Adapters.</b>
+Whenever the \c Translator class interface changes in the new
+release, the new class \c TranslatorAdapter_x_y_z is added to the \c
+translator_adapter.h file (here x, y, and z are numbers that
+correspond to the current official version of doxygen). All
+translators that previously derived from the \c Translator class now
+derive from this adapter class.
+
+The \c TranslatorAdapter_x_y_z class implements the new, required
+methods. If the new method replaces some similar but obsolete
+method(s) (e.g. if the number of arguments changed and/or the
+functionality of the older method was changed or enriched), the \c
+TranslatorAdapter_x_y_z class may use the obsolete method to get the
+result which is as close as possible to the older result in the
+target language. If it is not possible, the result (the default
+translation) is obtained using the English translator, which is (by
+definition) always up-to-date.
+
+<b>For example,</b> when the new \c trFile() method with
+parameters (to determine the capitalization of the first letter and
+the singular/plural form) was introduced to replace the older method
+\c trFiles() without arguments, the following code appeared in one
+of the translator adapter classes:
+
+\verbatim
+ /*! This is the default implementation of the obsolete method
+ * used in the documentation of a group before the list of
+ * links to documented files. This is possibly localized.
+ */
+ virtual QCString trFiles()
+ { return "Files"; }
+
+ /*! This is the localized implementation of newer equivalent
+ * using the obsolete method trFiles().
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ if (first_capital && !singular)
+ return trFiles(); // possibly localized, obsolete method
+ else
+ return english.trFile(first_capital, singular);
+ }
+\endverbatim
+
+The \c trFiles() is not present in the \c TranslatorEnglish class,
+because it was removed as obsolete. However, it was used until now
+and its call was replaced by
+
+\verbatim
+ trFile(true, false)
+\endverbatim
+
+in the doxygen source files. Probably, many language translators
+implemented the obsolete method, so it perfectly makes sense to use
+the same language dependent result in those cases. The \c
+TranslatorEnglish does not implement the old method. It derives
+from the abstract \c Translator class. On the other hand, the old
+translator for a different language does not implement the new \c
+trFile() method. Because of that it is derived from another base
+class -- \c TranslatorAdapter_x_y_z. The \c TranslatorAdapter_x_y_z
+class have to implement the new, required \c trFile() method.
+However, the translator adapter would not be compiled if the \c
+trFiles() method was not implemented. This is the reason for
+implementing the old method in the translator adapter class (using
+the same code, that was removed from the TranslatorEnglish).
+
+The simplest way would be to pass the arguments to the English
+translator and to return its result. Instead, the adapter uses the
+old \c trFiles() in one special case -- when the new
+<code>trFile(true,&nbsp;false)</code> is called. This is the
+mostly used case at the time of introducing the new method -- see
+above. While this may look too complicated, the technique allows
+the developers of the core sources to change the Translator
+interface, while the users may not even notice the change. Of
+course, when the new \c trFile() is used with different arguments,
+the English result is returned and it will be noticed by non English
+users. Here the maintainer of the language translator should
+implement at least that one particular method.
+
+<b>What says the base class of a language translator?</b>
+If the language translator class inherits from any adapter class the
+maintenance is needed. In such case, the language translator is not
+considered up-to-date. On the other hand, if the language
+translator derives directly from the abstract class \c Translator, the
+language translator is up-to-date.
+
+The translator adapter classes are chained so that the older
+translator adapter class uses the one-step-newer translator adapter
+as the base class. The newer adapter does less \e adapting work
+than the older one. The oldest adapter class derives (indirectly)
+from all of the adapter classes. The name of the adapter class is
+chosen so that its suffix is derived from the previous official
+version of doxygen that did not need the adapter. This way, one can
+say approximately, when the language translator class was last
+updated -- see details below.
+
+The newest translator adapter derives from the abstract \c
+TranslatorAdapterBase class that derives directly from the abstract
+\c Translator class. It adds only the private English-translator
+member for easy implementation of the default translation inside the
+adapter classes, and it also enforces implementation of one method
+for noticing the user that the language translation is not up-to-date
+(because of that some sentences in the generated files may appear in
+English).
+
+Once the oldest adapter class is not used by any of the language
+translators, it can be removed from the doxygen project. The
+maintainers should try to reach the state with the minimal number of
+translator adapter classes.
+
+<b>To simplify the maintenance of the language translator classes</b>
+for the supported languages, the \c translator.py Python
+script was developed (located in \c doxygen/doc directory).
+It extracts the important information about obsolete and
+new methods from the source files for each of the languages.
+The information is stored in the <em>translator report</em> ASCII file
+(translator_report.txt).
+
+\htmlonly If you compiled this documentation
+from sources and if you have also doxygen sources available the
+link <a href="../doc/translator_report.txt"
+><code>doxygen/doc/translator_report.txt</code></a> should be valid.\endhtmlonly
+
+Looking at the base class of the language translator, the script
+guesses also the status of the translator -- see the last column of
+the table with languages above. The \c translator.py is called
+automatically when the doxygen documentation is generated. You can
+also run the script manually whenever you feel that it can help you.
+Of course, you are not forced to use the results of the script. You
+can find the same information by looking at the adapter class and
+its base classes.
+
+<b>How should I update my language translator?</b> Firstly, you
+should be the language maintainer, or you should let him/her know
+about the changes. The following text was written for the language
+maintainers as the primary audience.
+
+There are several approaches to be taken when updating your
+language. If you are not extremely busy, you should always chose
+the most radical one. When the update takes much more time than you
+expected, you can always decide use some suitable translator adapter to
+finish the changes later and still make your translator working.
+
+<b>The most radical way of updating the language translator</b> is
+to make your translator class derive directly
+from the abstract class \c Translator and provide translations for the
+methods that are required to be implemented -- the compiler will
+tell you if you forgot to implement some of them. If you are in
+doubt, have a look at the \c TranslatorEnglish class to recognize the
+purpose of the implemented method. Looking at the previously used
+adapter class may help you sometimes, but it can also be misleading
+because the adapter classes do implement also the obsolete methods
+(see the previous \c trFiles() example).
+
+In other words, the up-to-date language translators do not need the
+\c TranslatorAdapter_x_y_z classes at all, and you do not need to
+implement anything else than the methods required by the Translator
+class (i.e. the pure virtual methods of the \c Translator -- they
+end with <code>=0;</code>).
+
+If everything compiles fine, try to run \c translator.py, and have a
+look at the translator report (ASCII file) at the \c doxygen/doc
+directory. Even if your translator is marked as up-to-date, there
+still may be some remarks related to your source code. Namely, the
+obsolete methods--that are not used at all--may be listed in the
+section for your language. Simply, remove their code (and run the \c
+translator.py again). Also, you will be informed when you forgot to
+change the base class of your translator class to some newer adapter
+class or directly to the Translator class.
+
+<b>If you do not have time to finish all the updates</b> you should
+still start with <em>the most radical approach</em> as described
+above. You can always change the base class to the translator
+adapter class that implements all of the not-yet-implemented methods.
+
+<b>If you prefer to update your translator gradually</b>, have a look
+at \c TranslatorEnglish (the \c translator_en.h file). Inside, you
+will find the comments like <code>new since 1.2.4</code> that separate
+always a number of methods that were implemented in the stated
+version. Do implement the group of methods that are placed below the
+comment that uses the same version numbers as your translator adapter
+class. (For example, your translator class have to use the \c
+TranslatorAdapter_1_2_4, if it does not implement the methods below
+the comment <code>new since 1.2.4</code>. When you implement them,
+your class should use newer translator adapter.
+
+Run the \c translator.py script occasionally and give it your \c xx
+identification (from \c translator_xx.h) to create the translator
+report shorter (also produced faster) -- it will contain only the
+information related to your translator. Once you reach the state when
+the base class should be changed to some newer adapter, you will see
+the note in the translator report.
+
+Warning: Don't forget to compile Doxygen to discover, whether it is
+compilable. The \c translator.py does not check if everything is
+correct with respect to the compiler. Because of that, it may lie
+sometimes about the necessary base class.
+
+<b>The most obsolete language translators</b> would lead to
+implementation of too complicated adapters. Because of that, doxygen
+developers may decide to derive such translators from the \c
+TranslatorEnglish class, which is by definition always up-to-date.
+
+When doing so, all the missing methods will be replaced by the
+English translation. This means that not-implemented methods will
+always return the English result. Such translators are marked using
+word \c obsolete. You should read it <b>really obsolete</b>. No
+guess about the last update can be done.
+
+Often, it is possible to construct better result from the obsolete
+methods. Because of that, the translator adapter classes should be
+used if possible. On the other hand, implementation of adapters for
+really obsolete translators brings too much maintenance and
+run-time overhead.
+
+*/
+
diff --git a/doc/language.tpl b/doc/language.tpl
new file mode 100644
index 0000000..cba8b8a
--- /dev/null
+++ b/doc/language.tpl
@@ -0,0 +1,357 @@
+
+ATTENTION! This is the template for generating language.doc. If you want to
+change the language.doc, make the changes here and inside maintainers.txt.
+
+/******************************************************************************
+ * %(editnote)s
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * $Id$
+ */
+/*! \page langhowto Internationalization
+
+<h3>Support for multiple languages</h3>
+
+Doxygen has built-in support for multiple languages. This means that the
+text fragments, generated by doxygen, can be produced in languages other
+than English (the default). The output language is chosen through the
+configuration file (with default name and known as Doxyfile).
+
+Currently (version %(doxVersion)s), %(numLangStr)s languages
+are supported (sorted alphabetically):
+%(supportedLangReadableStr)s.
+
+The table of information related to the supported languages follows.
+It is sorted by language alphabetically. The <b>Status</b> column
+was generated from sources and shows approximately the last version
+when the translator was updated.
+
+%(informationTable)s
+
+Most people on the list have indicated that they were also busy
+doing other things, so if you want to help to speed things up please
+let them (or me) know.
+
+If you want to add support for a language that is not yet listed
+please read the next section.
+
+
+<h3>Adding a new language to doxygen</h3>
+
+This short HOWTO explains how to add support for the new language to Doxygen:
+
+Just follow these steps:
+<ol>
+<li>Tell me for which language you want to add support. If no one else
+ is already working on support for that language, you will be
+ assigned as the maintainer for the language.
+<li>Create a copy of translator_en.h and name it
+ translator_\<your_2_letter_country_code\>.h
+ I'll use xx in the rest of this document.
+<li>Add definition of the symbol for your language in the configure
+at two places in the script:
+ <ol>
+ <li>After the <code>f_langs=</code> is statement, in lower case.
+ <li>In the string that following <code>\@allowed=</code> in upper case.
+ </ol>
+The rerun the configure script such that is generates src/lang_cfg.h.
+This file should now contain a \#define for your language code.
+<li>Edit language.cpp:
+ Add a
+\verbatim
+#ifdef LANG_xx
+#include<translator_xx.h>
+#endif
+\endverbatim
+ Remember to use the same symbol LANG_xx that you added to \c lang_cfg.h.
+ I.e., the \c xx should be capital letters that identify your language.
+ On the other hand, the \c xx inside your \c translator_xx.h should use
+ lower case.
+ <p>Now, in <code>setTranslator()</code> add
+\verbatim
+#ifdef LANG_xx
+ else if (L_EQUAL("your_language_name"))
+ {
+ theTranslator = new TranslatorYourLanguage;
+ }
+#endif
+\endverbatim
+ after the <code>if { ... }</code>. I.e., it must be placed after the code
+ for creating the English translator at the beginning, and before the
+ <code>else { ... }</code> part that creates the translator for the
+ default language (English again).
+<li>Edit libdoxygen.pro.in and add \c translator_xx.h to
+ the \c HEADERS line.
+<li>Edit <code>translator_xx.h</code>:
+ <ul>
+ <li>Rename <code>TRANSLATOR_EN_H</code> to <code>TRANSLATOR_XX_H</code>
+ twice (i.e. in the \c \#ifndef and \c \#define preprocessor commands at
+ the beginning of the file).
+ <li>Rename TranslatorEnglish to TranslatorYourLanguage
+ <li>In the member <code>idLanguage()</code> change "english" into the
+ name of your language (use lower case characters only). Depending
+ on the language you may also wish to change the member functions
+ latexLanguageSupportCommand(), idLanguageCharset() and others
+ (you will recognize them when you start the work).
+ <li>Edit all the strings that are returned by the member functions that
+ start with tr.
+ Try to match punctuation and capitals!
+ To enter special characters (with accents) you can:
+ <ul>
+ <li> Enter them directly if your keyboard supports that and you are
+ using a Latin-1 font. Doxygen will translate the
+ characters to proper \f$\mbox{\LaTeX}\f$ and leave the
+ HTML and man output for what it is (which is fine, if
+ idLanguageCharset() is set correctly).
+ <li> Use html codes like \&auml; for an a with an umlaut (i.e. &auml;).
+ See the HTML specification for the codes.
+ </ul>
+ </ul>
+<li>Run configure and make again from the root of the distribution,
+ in order to regenerated the Makefiles.
+<li>Now you can use <code>OUTPUT_LANGUAGE = your_language_name</code>
+ in the config file to generate output in your language.
+<li>Send <code>translator_xx.h</code> to me so I can add it to doxygen.
+ Send also your name and e-mail address to be included in the
+ \c maintainers.txt list.
+</ol>
+
+
+<h3>Maintaining a language</h3>
+
+New versions of doxygen may use new translated sentences. In such
+situation, the \c Translator class requires implementation of new
+methods -- its interface changes. Of course, the English
+sentences need to be translated to the other languages. At least,
+new methods have to be implemented by the language-related
+translator class; otherwise, doxygen wouldn't even compile. Waiting
+until all language maintainers have translated the new sentences and
+sent the results would not be very practical. The following text
+describes the usage of translator adapters to solve the problem.
+
+<b>The role of Translator Adapters.</b>
+Whenever the \c Translator class interface changes in the new
+release, the new class \c TranslatorAdapter_x_y_z is added to the \c
+translator_adapter.h file (here x, y, and z are numbers that
+correspond to the current official version of doxygen). All
+translators that previously derived from the \c Translator class now
+derive from this adapter class.
+
+The \c TranslatorAdapter_x_y_z class implements the new, required
+methods. If the new method replaces some similar but obsolete
+method(s) (e.g. if the number of arguments changed and/or the
+functionality of the older method was changed or enriched), the \c
+TranslatorAdapter_x_y_z class may use the obsolete method to get the
+result which is as close as possible to the older result in the
+target language. If it is not possible, the result (the default
+translation) is obtained using the English translator, which is (by
+definition) always up-to-date.
+
+<b>For example,</b> when the new \c trFile() method with
+parameters (to determine the capitalization of the first letter and
+the singular/plural form) was introduced to replace the older method
+\c trFiles() without arguments, the following code appeared in one
+of the translator adapter classes:
+
+\verbatim
+ /*! This is the default implementation of the obsolete method
+ * used in the documentation of a group before the list of
+ * links to documented files. This is possibly localized.
+ */
+ virtual QCString trFiles()
+ { return "Files"; }
+
+ /*! This is the localized implementation of newer equivalent
+ * using the obsolete method trFiles().
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ if (first_capital && !singular)
+ return trFiles(); // possibly localized, obsolete method
+ else
+ return english.trFile(first_capital, singular);
+ }
+\endverbatim
+
+The \c trFiles() is not present in the \c TranslatorEnglish class,
+because it was removed as obsolete. However, it was used until now
+and its call was replaced by
+
+\verbatim
+ trFile(true, false)
+\endverbatim
+
+in the doxygen source files. Probably, many language translators
+implemented the obsolete method, so it perfectly makes sense to use
+the same language dependent result in those cases. The \c
+TranslatorEnglish does not implement the old method. It derives
+from the abstract \c Translator class. On the other hand, the old
+translator for a different language does not implement the new \c
+trFile() method. Because of that it is derived from another base
+class -- \c TranslatorAdapter_x_y_z. The \c TranslatorAdapter_x_y_z
+class have to implement the new, required \c trFile() method.
+However, the translator adapter would not be compiled if the \c
+trFiles() method was not implemented. This is the reason for
+implementing the old method in the translator adapter class (using
+the same code, that was removed from the TranslatorEnglish).
+
+The simplest way would be to pass the arguments to the English
+translator and to return its result. Instead, the adapter uses the
+old \c trFiles() in one special case -- when the new
+<code>trFile(true,&nbsp;false)</code> is called. This is the
+mostly used case at the time of introducing the new method -- see
+above. While this may look too complicated, the technique allows
+the developers of the core sources to change the Translator
+interface, while the users may not even notice the change. Of
+course, when the new \c trFile() is used with different arguments,
+the English result is returned and it will be noticed by non English
+users. Here the maintainer of the language translator should
+implement at least that one particular method.
+
+<b>What says the base class of a language translator?</b>
+If the language translator class inherits from any adapter class the
+maintenance is needed. In such case, the language translator is not
+considered up-to-date. On the other hand, if the language
+translator derives directly from the abstract class \c Translator, the
+language translator is up-to-date.
+
+The translator adapter classes are chained so that the older
+translator adapter class uses the one-step-newer translator adapter
+as the base class. The newer adapter does less \e adapting work
+than the older one. The oldest adapter class derives (indirectly)
+from all of the adapter classes. The name of the adapter class is
+chosen so that its suffix is derived from the previous official
+version of doxygen that did not need the adapter. This way, one can
+say approximately, when the language translator class was last
+updated -- see details below.
+
+The newest translator adapter derives from the abstract \c
+TranslatorAdapterBase class that derives directly from the abstract
+\c Translator class. It adds only the private English-translator
+member for easy implementation of the default translation inside the
+adapter classes, and it also enforces implementation of one method
+for noticing the user that the language translation is not up-to-date
+(because of that some sentences in the generated files may appear in
+English).
+
+Once the oldest adapter class is not used by any of the language
+translators, it can be removed from the doxygen project. The
+maintainers should try to reach the state with the minimal number of
+translator adapter classes.
+
+<b>To simplify the maintenance of the language translator classes</b>
+for the supported languages, the \c translator.py Python
+script was developed (located in \c doxygen/doc directory).
+It extracts the important information about obsolete and
+new methods from the source files for each of the languages.
+The information is stored in the <em>translator report</em> ASCII file
+(%(translatorReportFileName)s).
+
+\htmlonly If you compiled this documentation
+from sources and if you have also doxygen sources available the
+link %(translatorReportLink)s should be valid.\endhtmlonly
+
+Looking at the base class of the language translator, the script
+guesses also the status of the translator -- see the last column of
+the table with languages above. The \c translator.py is called
+automatically when the doxygen documentation is generated. You can
+also run the script manually whenever you feel that it can help you.
+Of course, you are not forced to use the results of the script. You
+can find the same information by looking at the adapter class and
+its base classes.
+
+<b>How should I update my language translator?</b> Firstly, you
+should be the language maintainer, or you should let him/her know
+about the changes. The following text was written for the language
+maintainers as the primary audience.
+
+There are several approaches to be taken when updating your
+language. If you are not extremely busy, you should always chose
+the most radical one. When the update takes much more time than you
+expected, you can always decide use some suitable translator adapter to
+finish the changes later and still make your translator working.
+
+<b>The most radical way of updating the language translator</b> is
+to make your translator class derive directly
+from the abstract class \c Translator and provide translations for the
+methods that are required to be implemented -- the compiler will
+tell you if you forgot to implement some of them. If you are in
+doubt, have a look at the \c TranslatorEnglish class to recognize the
+purpose of the implemented method. Looking at the previously used
+adapter class may help you sometimes, but it can also be misleading
+because the adapter classes do implement also the obsolete methods
+(see the previous \c trFiles() example).
+
+In other words, the up-to-date language translators do not need the
+\c TranslatorAdapter_x_y_z classes at all, and you do not need to
+implement anything else than the methods required by the Translator
+class (i.e. the pure virtual methods of the \c Translator -- they
+end with <code>=0;</code>).
+
+If everything compiles fine, try to run \c translator.py, and have a
+look at the translator report (ASCII file) at the \c doxygen/doc
+directory. Even if your translator is marked as up-to-date, there
+still may be some remarks related to your source code. Namely, the
+obsolete methods--that are not used at all--may be listed in the
+section for your language. Simply, remove their code (and run the \c
+translator.py again). Also, you will be informed when you forgot to
+change the base class of your translator class to some newer adapter
+class or directly to the Translator class.
+
+<b>If you do not have time to finish all the updates</b> you should
+still start with <em>the most radical approach</em> as described
+above. You can always change the base class to the translator
+adapter class that implements all of the not-yet-implemented methods.
+
+<b>If you prefer to update your translator gradually</b>, have a look
+at \c TranslatorEnglish (the \c translator_en.h file). Inside, you
+will find the comments like <code>new since 1.2.4</code> that separate
+always a number of methods that were implemented in the stated
+version. Do implement the group of methods that are placed below the
+comment that uses the same version numbers as your translator adapter
+class. (For example, your translator class have to use the \c
+TranslatorAdapter_1_2_4, if it does not implement the methods below
+the comment <code>new since 1.2.4</code>. When you implement them,
+your class should use newer translator adapter.
+
+Run the \c translator.py script occasionally and give it your \c xx
+identification (from \c translator_xx.h) to create the translator
+report shorter (also produced faster) -- it will contain only the
+information related to your translator. Once you reach the state when
+the base class should be changed to some newer adapter, you will see
+the note in the translator report.
+
+Warning: Don't forget to compile Doxygen to discover, whether it is
+compilable. The \c translator.py does not check if everything is
+correct with respect to the compiler. Because of that, it may lie
+sometimes about the necessary base class.
+
+<b>The most obsolete language translators</b> would lead to
+implementation of too complicated adapters. Because of that, doxygen
+developers may decide to derive such translators from the \c
+TranslatorEnglish class, which is by definition always up-to-date.
+
+When doing so, all the missing methods will be replaced by the
+English translation. This means that not-implemented methods will
+always return the English result. Such translators are marked using
+word \c obsolete. You should read it <b>really obsolete</b>. No
+guess about the last update can be done.
+
+Often, it is possible to construct better result from the obsolete
+methods. Because of that, the translator adapter classes should be
+used if possible. On the other hand, implementation of adapters for
+really obsolete translators brings too much maintenance and
+run-time overhead.
+
+*/
+
diff --git a/doc/lists.doc b/doc/lists.doc
new file mode 100644
index 0000000..f5f9f96
--- /dev/null
+++ b/doc/lists.doc
@@ -0,0 +1,119 @@
+/*! \page lists Lists
+
+Doxygen provides a number of ways to create lists of items.
+
+<b>Using dashes</b>
+
+ By putting a number of column-aligned minus signs at the start of a
+ line, a bullet list will automatically be generated.
+ Numbered lists can also be generated by using a minus followed by a hash.
+ Nesting of lists is allowed and is based on indentation of the items.<p>
+ Here is an example:
+\verbatim
+ /*!
+ * A list of events:
+ * - mouse events
+ * -# mouse move event
+ * -# mouse click event\n
+ * More info about the click event.
+ * -# mouse double click event
+ * - keyboard events
+ * -# key down event
+ * -# key up event
+ *
+ * More text here.
+ */
+\endverbatim
+ The result will be:
+
+ A list of events:
+ - mouse events
+ -# mouse move event
+ -# mouse click event\n
+ More info about the click event.
+ -# mouse double click event
+ - keyboard events
+ -# key down event
+ -# key up event
+
+ More text here.
+
+If you use tabs for indentation within lists, please make sure
+that \ref cfg_tab_size "TAB_SIZE" in the configuration file is set to
+the correct tab size.
+
+You can end a list by starting a new paragraph or
+by putting a dot (.) on an empty line at the same indent level as the
+list you would like to end.
+
+Here is an example that speaks for itself:
+
+\verbatim
+/**
+ * Text before the list
+ * - list item 1
+ * - sub item 1
+ * - sub sub item 1
+ * - sub sub item 2
+ * .
+ * The dot above ends the sub sub item list.
+ * More text for the first sub item
+ * .
+ * The dot above ends the first sub item.
+ * More text for the first list item
+ * - sub item 2
+ * - sub item 3
+ * - list item 2
+ * .
+ * More text in the same paragraph.
+ *
+ * More text in a new paragraph.
+ */
+\endverbatim
+
+<b>Using HTML commands</b>
+
+If you like you can also use HTML commands inside the documentation
+blocks. Using these commands has the advantage that it is more natural
+for list items that consist of multiple paragraphs.
+
+Here is the above example with HTML commands:
+\verbatim
+ /*!
+ * A list of events:
+ * <ul>
+ * <li> mouse events
+ * <ol>
+ * <li>mouse move event
+ * <li>mouse click event\n
+ * More info about the click event.
+ * <li>mouse double click event
+ * </ol>
+ * <li> keyboard events
+ * <ol>
+ * <li>key down event
+ * <li>key up event
+ * </ol>
+ * </ul>
+ * More text here.
+ */
+\endverbatim
+
+\note In this case the indentation is not important.
+
+<b>Using \\arg or \\li</b>
+
+For compatibility with the Qt Software's internal documentation tool qdoc and
+with KDoc, doxygen has two commands that can be used to create simple
+unnested lists.
+
+See \ref cmdarg "\\arg" and \ref cmdli "\\li" for more info.
+
+\htmlonly
+Go to the <a href="grouping.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
+
+
diff --git a/doc/mailto.txt b/doc/mailto.txt
new file mode 100644
index 0000000..40e09d7
--- /dev/null
+++ b/doc/mailto.txt
@@ -0,0 +1,5 @@
+up-to-date
+jun-chino@uol.com.br; lian.yang.cn@gmail.com; lidaobing@gmail.com; liuwei@asiainfo.com; boris.bralo@gmail.com; prikrylp@skil.cz; pouhan@gnotometrics.dk; eriksoe+doxygen@daimi.au.dk; dimitri@stack.nl; dimitri@stack.nl; dwarfnauko@gmail.com; gessos.paul@yahoo.gr; alessandro@falappa.net; aaf23@cam.ac.uk; fly1004@gmail.com; jung5000@gmail.com; nadalizadeh@gmail.com; cav@cryptopro.ru; the Slovak language advisors; prikrylp@skil.cz; bartomeu@loteria3cornella.com; david@grupoikusnet.com; niw3@yahoo.com
+
+translator based
+krzysztof.kral@gmail.com; jensseidel@users.sf.net; xouthier@yahoo.fr; max.pin@bitroit.com; tuanvietkey@gmail.com; mikaelhallin@yahoo.se; stenedjo@yahoo.com; reddumy@yahoo.com; aiosup@yahoo.com; slavejovanovski@yahoo.com; goyoki@gmail.com; sun594@hotmail.com; naga@joyful.club.ne.jp; antti.a.laine@tut.fi; dlin.tw@gmail.com; garywlee@gmail.com; johan@zippysnoek.com; matjaz.ostroversnik@ostri.org; lejordet@gmail.com; ceefour@gauldong.net; akiss@users.sourceforge.net \ No newline at end of file
diff --git a/doc/maintainers.txt b/doc/maintainers.txt
new file mode 100644
index 0000000..2ab5bb3
--- /dev/null
+++ b/doc/maintainers.txt
@@ -0,0 +1,156 @@
+% $Id: maintainers.txt 742 2010-09-20 18:19:55Z dimitri $
+%
+% The text is in UTF-8. Comments start with % sign at the beginning.
+% There is one record for each language. The records are separated
+% by the empty line and they do not contain empty lines.
+% First line of the record identifies the translator class for the language.
+% The following one or more lines contain information about
+% the maintainer(s) for the language (one line, one maintainer)
+% in the form: <readable name><colon><e-mail>
+% If the readable name name starts with '--' it will be displayed in HTML
+% output as a highlighted text notice related to the langluage (usually
+% '-- searching for the maintainer --').
+% If the <e-mail> is prefixed [some_text] it is not displayed in the table
+% of maintainers in the Doxygen documentation, nor it is used when building
+% the mailto.txt by translator.py. The mark is displayed in the documentation
+% instead.
+
+TranslatorAfrikaans
+Johan Prinsloo: johan at zippysnoek dot com
+
+TranslatorArabic
+Moaz Reyad: [resigned] moazreyad at yahoo dot com
+-- searching for the maintainer --: [Please, try to help to find someone.]
+
+TranslatorBrazilian
+Fabio "FJTC" Jun Takada Chino: jun-chino at uol dot com dot br
+
+TranslatorCatalan
+Maximiliano Pin: max dot pin at bitroit dot com
+Albert Mora: [unreachable] amora at iua dot upf dot es
+
+TranslatorChinese
+Lang Yang: lian dot yang dot cn at gmail dot com
+Li Daobing: lidaobing at gmail dot com
+Wei Liu: liuwei at asiainfo dot com
+
+TranslatorChinesetraditional
+Daniel YC Lin: dlin dot tw at gmail dot com
+Gary Lee: garywlee at gmail dot com
+
+TranslatorCroatian
+Boris Bralo: boris dot bralo at gmail dot com
+
+TranslatorCzech
+Petr Přikryl: prikrylp at skil dot cz
+
+TranslatorDanish
+Poul-Erik Hansen: pouhan at gnotometrics dot dk
+Erik Søe Sørensen: eriksoe+doxygen at daimi dot au dot dk
+
+TranslatorDutch
+Dimitri van Heesch: dimitri at stack dot nl
+
+TranslatorEnglish
+Dimitri van Heesch: dimitri at stack dot nl
+
+TranslatorEsperanto
+Ander Martinez: dwarfnauko at gmail dot com
+
+TranslatorFinnish
+Antti Laine: antti dot a dot laine at tut dot fi
+
+TranslatorFrench
+Xavier Outhier: xouthier at yahoo dot fr
+
+TranslatorGerman
+Jens Seidel: jensseidel at users dot sf dot net
+
+TranslatorGreek
+Paul Gessos: gessos dot paul at yahoo dot gr
+
+TranslatorHungarian
+Ákos Kiss: akiss at users dot sourceforge dot net
+Földvári György: [unreachable] foldvari lost at cyberspace
+
+TranslatorIndonesian
+Hendy Irawan: ceefour at gauldong dot net
+
+TranslatorItalian
+Alessandro Falappa: alessandro at falappa dot net
+Ahmed Aldo Faisal: aaf23 at cam dot ac dot uk
+
+TranslatorJapanese
+Hiroki Iseri: goyoki at gmail dot com
+Ryunosuke Satoh: sun594 at hotmail dot com
+Kenji Nagamatsu: naga at joyful dot club dot ne dot jp
+Iwasa Kazmi: [unreachable] iwasa at cosmo-system dot jp
+
+TranslatorKorean
+Kim Taedong: fly1004 at gmail dot com
+SooYoung Jung: jung5000 at gmail dot com
+Richard Kim: [unreachable] ryk at dspwiz dot com
+
+TranslatorLithuanian
+Tomas Simonaitis: [unreachable] haden at homelan dot lt
+Mindaugas Radzius: [unreachable] mindaugasradzius at takas dot lt
+Aidas Berukstis: [unreachable] aidasber at takas dot lt
+-- searching for the maintainer --: [Please, try to help to find someone.]
+
+TranslatorNorwegian
+Lars Erik Jordet: lejordet at gmail dot com
+
+TranslatorMacedonian
+Slave Jovanovski: slavejovanovski at yahoo dot com
+
+TranslatorPersian
+Ali Nadalizadeh: nadalizadeh at gmail dot com
+
+TranslatorPolish
+Piotr Kaminski: [unreachable] Piotr dot Kaminski at ctm dot gdynia dot pl
+Grzegorz Kowal: [unreachable] g_kowal at poczta dot onet dot pl
+Krzysztof Kral: krzysztof dot kral at gmail dot com
+
+TranslatorPortuguese
+Rui Godinho Lopes: [resigned] rgl at ruilopes dot com
+-- searching for the maintainer --: [Please, try to help to find someone.]
+
+TranslatorRomanian
+Ionut Dumitrascu: reddumy at yahoo dot com
+Alexandru Iosup: aiosup at yahoo dot com
+
+TranslatorRussian
+Alexandr Chelpanov: cav at cryptopro dot ru
+
+TranslatorSerbian
+Dejan Milosavljevic: [unreachable] dmilos at email dot com
+
+TranslatorSerbianCyrilic
+Nedeljko Stefanovic: stenedjo at yahoo dot com
+
+TranslatorSlovak
+% Stanislav Kudláč: [resigned] skudlac at pobox dot sk
+Kali+Laco Švec: the Slovak language advisors
+Petr Přikryl: prikrylp at skil dot cz
+
+TranslatorSlovene
+Matjaž Ostroveršnik: matjaz dot ostroversnik at ostri dot org
+
+TranslatorSpanish
+Bartomeu: bartomeu at loteria3cornella dot com
+Francisco Oltra Thennet: [unreachable] foltra at puc dot cl
+David Vaquero: david at grupoikusnet dot com
+
+TranslatorSwedish
+Mikael Hallin: mikaelhallin at yahoo dot se
+
+TranslatorTurkish
+Emin Ilker Cetinbas: niw3 at yahoo dot com
+
+TranslatorUkrainian
+Olexij Tkatchenko: [resigned] olexij at tkatchenko dot com
+-- searching for the maintainer --: [Please, try to help to find someone.]
+
+TranslatorVietnamese
+Dang Minh Tuan: tuanvietkey at gmail dot com
+
diff --git a/doc/output.doc b/doc/output.doc
new file mode 100644
index 0000000..0661670
--- /dev/null
+++ b/doc/output.doc
@@ -0,0 +1,62 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page output Output Formats
+
+\section output_sec Output Formats
+
+\addindex output formats
+
+The following output formats are \e directly supported by doxygen:
+<dl>
+<dt><b>HTML</b>
+<dd>Generated if \c GENERATE_HTML is set to \c YES in the configuration file.
+<dt>\f$\mbox{\LaTeX}\f$
+<dd>Generated if \c GENERATE_LATEX is set to \c YES in the configuration file.
+<dt><b>Man pages</b>
+<dd>Generated if \c GENERATE_MAN is set to \c YES in the configuration file.
+<dt><b>RTF</b>
+<dd>Generated if \c GENERATE_RTF is set to \c YES in the configuration file.<p>
+ Note that the RTF output probably only looks nice with Microsoft's
+ Word 97. If you have success with other programs, please let me know.
+<dt><b>XML</b>
+<dd>Generated if \c GENERATE_XML is set to \c YES in the configuration file.<p>
+<dt><b>Qt Help Project (.qhp)</b>
+<dd>Generated if \c GENERATE_QHP is set to \c YES in the configuration file.
+</dl>
+
+The following output formats are \e indirectly supported by doxygen:
+<dl>
+<dt><b>Compiled HTML Help</b> (a.k.a. Windows 98 help)
+<dd>Generated by Microsoft's HTML Help workshop from the HTML output if
+ \c GENERATE_HTMLHELP is set to \c YES.
+<dt><b>Qt Compressed Help (.qch)</b>
+<dd>Generated by Qt's qhelpgenerator tool from the HTML output if
+ \c GENERATE_QHP is set to \c YES.
+<dt><b>PostScript</b>
+<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by
+ running <code>make ps</code> in the output directory.
+ For the best results \c PDF_HYPERLINKS should be set to \c NO.
+<dt><b>PDF</b>\htmlonly &nbsp;&nbsp;&nbsp;\endhtmlonly
+<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by
+ running <code>make pdf</code> in the output directory.
+ To improve the PDF output, you typically would want to enable the use
+ of \c pdflatex by setting \ref cfg_use_pdflatex "USE_PDFLATEX" to \c YES in the
+ configuration file. In order to get hyperlinks in the PDF file you also need to enable
+ \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS".
+</dl>
+
+*/
diff --git a/doc/perlmod.doc b/doc/perlmod.doc
new file mode 100644
index 0000000..9c0d79f
--- /dev/null
+++ b/doc/perlmod.doc
@@ -0,0 +1,193 @@
+/*! \page perlmod Perl Module output format documentation
+
+\addindex perlmod
+
+<p>Since version 1.2.18, Doxygen can generate a new output format we
+have called the &quot;Perl Module output format&quot;. It has been
+designed as an intermediate format that can be used to generate new
+and customized output without having to modify the Doxygen source.
+Therefore, its purpose is similar to the XML output format that can be
+also generated by Doxygen. The XML output format is more standard,
+but the Perl Module output format is possibly simpler and easier to
+use.
+
+<p>The Perl Module output format is still experimental at the moment
+and could be changed in incompatible ways in future versions, although
+this should not be very probable. It is also lacking some features of
+other Doxygen backends. However, it can be already used to generate
+useful output, as shown by the Perl Module-based LaTeX generator.
+
+<p>Please report any bugs or problems you find in the Perl Module
+backend or the Perl Module-based LaTeX generator to the
+doxygen-develop mailing list. Suggestions are welcome as well.
+
+\section using_perlmod_fmt Using the Perl Module output format.
+
+<p>When the <b>GENERATE_PERLMOD</b> tag is enabled in the Doxyfile,
+running Doxygen generates a number of files in the <b>perlmod/</b>
+subdirectory of your output directory. These files are the following:
+
+<ul>
+
+<li><b>DoxyDocs.pm</b>. This is the Perl module that actually
+contains the documentation, in the Perl Module format described
+\ref doxydocs_format "below".
+
+<li><b>DoxyModel.pm</b>. This Perl module describes the structure of
+<b>DoxyDocs.pm</b>, independently of the actual documentation. See
+\ref doxymodel_format "below" for details.
+
+<li><b>doxyrules.make</b>. This file contains the make rules to build
+and clean the files that are generated from the Doxyfile. Also
+contains the paths to those files and other relevant information. This
+file is intended to be included by your own Makefile.
+
+<li><b>Makefile</b>. This is a simple Makefile including
+<b>doxyrules.make</b>.
+
+</ul>
+
+<p>To make use of the documentation stored in DoxyDocs.pm you can use
+one of the default Perl Module-based generators provided by Doxygen
+(at the moment this includes the Perl Module-based LaTeX generator,
+see \ref perlmod_latex "below") or write your own customized
+generator. This should not be too hard if you have some knowledge of
+Perl and it's the main purpose of including the Perl Module backend in
+Doxygen. See \ref doxydocs_format "below" for details on how
+to do this.
+
+\section perlmod_latex Using the Perl Module-based LaTeX generator.
+
+<p>The Perl Module-based LaTeX generator is pretty experimental and
+incomplete at the moment, but you could find it useful nevertheless.
+It can generate documentation for functions, typedefs and variables
+within files and classes and can be customized quite a lot by
+redefining TeX macros. However, there is still no documentation on
+how to do this.
+
+<p>Setting the <b>PERLMOD_LATEX</b> tag to <b>YES</b> in the Doxyfile
+enables the creation of some additional files in the <b>perlmod/</b>
+subdirectory of your output directory. These files contain the Perl
+scripts and LaTeX code necessary to generate PDF and DVI output from
+the Perl Module output, using PDFLaTeX and LaTeX respectively. Rules
+to automate the use of these files are also added to
+<b>doxyrules.make</b> and the <b>Makefile</b>.
+
+<p>The additional generated files are the following:
+
+<ul>
+
+<li><b>doxylatex.pl</b>. This Perl script uses DoxyDocs.pm and
+DoxyModel.pm to generate <b>doxydocs.tex</b>, a TeX file containing
+the documentation in a format that can be accessed by LaTeX code. This
+file is not directly LaTeXable.
+
+<li><b>doxyformat.tex</b>. This file contains the LaTeX code that
+transforms the documentation from doxydocs.tex into LaTeX text
+suitable to be LaTeX'ed and presented to the user.
+
+<li><b>doxylatex-template.pl</b>. This Perl script uses DoxyModel.pm
+to generate <b>doxytemplate.tex</b>, a TeX file defining default
+values for some macros. doxytemplate.tex is included by
+doxyformat.tex to avoid the need of explicitly defining some macros.
+
+<li><b>doxylatex.tex</b>. This is a very simple LaTeX document that
+loads some packages and includes doxyformat.tex and doxydocs.tex. This
+document is LaTeX'ed to produce the PDF and DVI documentation by the
+rules added to <b>doxyrules.make</b>.
+
+</ul>
+
+\subsection pm_pdf_gen Simple creation of PDF and DVI output using the Perl Module-based LaTeX generator.
+
+<p>To try this you need to have installed LaTeX, PDFLaTeX and the
+packages used by <b>doxylatex.tex</b>.
+
+<ol>
+
+<li>Update your Doxyfile to the latest version using:
+
+<pre>doxygen -u Doxyfile</pre>
+
+<li>Set both <b>GENERATE_PERLMOD</b> and <b>PERLMOD_LATEX</b> tags to
+YES in your Doxyfile.
+
+<li>Run Doxygen on your Doxyfile:
+
+<pre>doxygen Doxyfile</pre>
+
+<li>A <b>perlmod/</b> subdirectory should have appeared in your output
+directory. Enter the <b>perlmod/</b> subdirectory and run:
+
+<pre>make pdf</pre>
+
+<p>This should generate a <b>doxylatex.pdf</b> with the documentation
+in PDF format.
+
+<li>Run:
+
+<pre>make dvi</pre>
+
+<p>This should generate a <b>doxylatex.dvi</b> with the documentation
+in DVI format.
+
+</ol>
+
+\section doxydocs_format Perl Module documentation format.
+
+<p>The Perl Module documentation generated by Doxygen is stored in
+<b>DoxyDocs.pm</b>. This is a very simple Perl module that contains
+only two statements: an assignment to the variable <b>$doxydocs</b> and
+the customary <b>1;</b> statement which usually ends Perl modules.
+The documentation is stored in the variable <b>$doxydocs</b>, which
+can then be accessed by a Perl script using <b>DoxyDocs.pm</b>.
+
+<p><b>$doxydocs</b> contains a tree-like structure composed of three
+types of nodes: strings, hashes and lists.
+
+<ul>
+
+<li><b>Strings</b>. These are normal Perl strings. They can be of
+any length can contain any character. Their semantics depends on
+their location within the tree. This type of node has no children.
+
+<li><b>Hashes</b>. These are references to anonymous Perl hashes. A
+hash can have multiple fields, each with a different key. The value
+of a hash field can be a string, a hash or a list, and its semantics
+depends on the key of the hash field and the location of the hash
+within the tree. The values of the hash fields are the children of
+the node.
+
+<li><b>Lists</b>. These are references to anonymous Perl lists. A
+list has an undefined number of elements, which are the children of
+the node. Each element has the same type (string, hash or list) and
+the same semantics, depending on the location of the list within the
+tree.
+
+</ul>
+
+<p>As you can see, the documentation contained in <b>$doxydocs</b>
+does not present any special impediment to be processed by a simple
+Perl script.
+<!--
+To be able to generate meaningful output using the
+documentation contained in <b>$doxydocs</b> you'll probably need to
+know the semantics of the nodes of the documentation tree, which we
+present in \ref perlmod_tree "this page".
+-->
+
+\section doxymodel_format Data structure describing the Perl Module documentation tree.
+
+<p>You might be interested in processing the documentation contained
+in <b>DoxyDocs.pm</b> without needing to take into account the
+semantics of each node of the documentation tree. For this purpose,
+Doxygen generates a <b>DoxyModel.pm</b> file which contains a data
+structure describing the type and children of each node in the
+documentation tree.
+
+<p>The rest of this section is to be written yet, but in the meantime
+you can look at the Perl scripts generated by Doxygen (such as
+<b>doxylatex.pl</b> or <b>doxytemplate-latex.pl</b>) to get an idea on
+how to use <b>DoxyModel.pm</b>.
+
+*/
diff --git a/doc/perlmod_tree.doc b/doc/perlmod_tree.doc
new file mode 100644
index 0000000..e2b1366
--- /dev/null
+++ b/doc/perlmod_tree.doc
@@ -0,0 +1,377 @@
+/*! \page perlmod_tree Nodes in the documentation tree of the Perl Module output format
+
+<h2>Nodes in the documentation tree of the Perl Module output
+format.</h2>
+
+This is a description of the structure of the documentation tree in
+<b>DoxyDocs.pm</b>. Each item in the list below describes a node in
+the tree, and the format of the description is as follows:
+
+<ul>
+<li>[ key =&gt; ] <b>Name</b> <i>(type)</i>. Explanation of the content.
+</ul>
+
+Where
+
+<ul>
+
+<li>The "key =>" part only appears if the parent node is a hash.
+"key" is the key for this node.
+
+<li><b>"Name"</b> is a unique name for the node, defined in
+DoxyModel.pm.
+
+<li><i>"(type)"</i> is the type of the node: "string" for string
+nodes, "hash" for hash nodes, "list" for list nodes, and "doc" for
+documentation subtrees. The structure of documentation subtrees is
+not described anywhere yet, but you can look for example at
+<b>doxylatex.pl</b> to see how to process it.
+
+</ul>
+
+The meaning of each node in the documentation tree is as follows:
+<ul>
+<li> <b>Root</b> <i>(hash)</i>. Root node.
+<ul>
+<li>classes =&gt; <b>Classes</b> <i>(list)</i>. Documented classes.
+<ul>
+<li> <b>Class</b> <i>(hash)</i>. A documented class.
+<ul>
+<li>protected_members =&gt; <b>ClassProtectedMembers</b> <i>(hash)</i>. Information about the protected members in the class.
+<ul>
+<li>members =&gt; <b>ClassProtectedMemberList</b> <i>(list)</i>. protected member list.
+<ul>
+<li> <b>ClassProtectedMember</b> <i>(hash)</i>. A protected member.
+<ul>
+<li>protection =&gt; <b>ClassProtectedMemberProtection</b> <i>(string)</i>. Protection of the protected member.
+<li>detailed =&gt; <b>ClassProtectedMemberDetailed</b> <i>(hash)</i>. Detailed information about the protected member.
+<ul>
+<li>doc =&gt; <b>ClassProtectedMemberDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the protected member.
+<li>see =&gt; <b>ClassProtectedMemberSee</b> <i>(doc)</i>. "See also" documentation for the protected member.
+</ul>
+<li>kind =&gt; <b>ClassProtectedMemberKind</b> <i>(string)</i>. Kind of protected member (usually "variable").
+<li>name =&gt; <b>ClassProtectedMemberName</b> <i>(string)</i>. Name of the protected member.
+<li>type =&gt; <b>ClassProtectedMemberType</b> <i>(string)</i>. Data type of the protected member.
+</ul>
+</ul>
+</ul>
+<li>detailed =&gt; <b>ClassDetailed</b> <i>(hash)</i>. Detailed information about the class.
+<ul>
+<li>doc =&gt; <b>ClassDetailedDoc</b> <i>(doc)</i>. Detailed documentation block for the class.
+</ul>
+<li>protected_typedefs =&gt; <b>ClassProtectedTypedefs</b> <i>(hash)</i>. Information about the protected typedefs in the class.
+<ul>
+<li>members =&gt; <b>ClassProtectedTypedefList</b> <i>(list)</i>. protected typedef list.
+<ul>
+<li> <b>ClassProtectedTypedef</b> <i>(hash)</i>. A protected typedef.
+<ul>
+<li>protection =&gt; <b>ClassProtectedTypedefProtection</b> <i>(string)</i>. Protection of the protected typedef.
+<li>detailed =&gt; <b>ClassProtectedTypedefDetailed</b> <i>(hash)</i>. Detailed information about the protected typedef.
+<ul>
+<li>doc =&gt; <b>ClassProtectedTypedefDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the protected typedef.
+<li>see =&gt; <b>ClassProtectedTypedefSee</b> <i>(doc)</i>. "See also" documentation for the protected typedef.
+</ul>
+<li>kind =&gt; <b>ClassProtectedTypedefKind</b> <i>(string)</i>. Kind of protected typedef (usually "typedef").
+<li>name =&gt; <b>ClassProtectedTypedefName</b> <i>(string)</i>. Name of the protected typedef.
+<li>type =&gt; <b>ClassProtectedTypedefType</b> <i>(string)</i>. Data type of the protected typedef.
+</ul>
+</ul>
+</ul>
+<li>name =&gt; <b>ClassName</b> <i>(string)</i>. Name of the class.
+<li>private_members =&gt; <b>ClassPrivateMembers</b> <i>(hash)</i>. Information about the private members in the class.
+<ul>
+<li>members =&gt; <b>ClassPrivateMemberList</b> <i>(list)</i>. private member list.
+<ul>
+<li> <b>ClassPrivateMember</b> <i>(hash)</i>. A private member.
+<ul>
+<li>protection =&gt; <b>ClassPrivateMemberProtection</b> <i>(string)</i>. Protection of the private member.
+<li>detailed =&gt; <b>ClassPrivateMemberDetailed</b> <i>(hash)</i>. Detailed information about the private member.
+<ul>
+<li>doc =&gt; <b>ClassPrivateMemberDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the private member.
+<li>see =&gt; <b>ClassPrivateMemberSee</b> <i>(doc)</i>. "See also" documentation for the private member.
+</ul>
+<li>kind =&gt; <b>ClassPrivateMemberKind</b> <i>(string)</i>. Kind of private member (usually "variable").
+<li>name =&gt; <b>ClassPrivateMemberName</b> <i>(string)</i>. Name of the private member.
+<li>type =&gt; <b>ClassPrivateMemberType</b> <i>(string)</i>. Data type of the private member.
+</ul>
+</ul>
+</ul>
+<li>private_typedefs =&gt; <b>ClassPrivateTypedefs</b> <i>(hash)</i>. Information about the private typedefs in the class.
+<ul>
+<li>members =&gt; <b>ClassPrivateTypedefList</b> <i>(list)</i>. private typedef list.
+<ul>
+<li> <b>ClassPrivateTypedef</b> <i>(hash)</i>. A private typedef.
+<ul>
+<li>protection =&gt; <b>ClassPrivateTypedefProtection</b> <i>(string)</i>. Protection of the private typedef.
+<li>detailed =&gt; <b>ClassPrivateTypedefDetailed</b> <i>(hash)</i>. Detailed information about the private typedef.
+<ul>
+<li>doc =&gt; <b>ClassPrivateTypedefDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the private typedef.
+<li>see =&gt; <b>ClassPrivateTypedefSee</b> <i>(doc)</i>. "See also" documentation for the private typedef.
+</ul>
+<li>kind =&gt; <b>ClassPrivateTypedefKind</b> <i>(string)</i>. Kind of private typedef (usually "typedef").
+<li>name =&gt; <b>ClassPrivateTypedefName</b> <i>(string)</i>. Name of the private typedef.
+<li>type =&gt; <b>ClassPrivateTypedefType</b> <i>(string)</i>. Data type of the private typedef.
+</ul>
+</ul>
+</ul>
+<li>protected_methods =&gt; <b>ClassProtectedMethods</b> <i>(hash)</i>. Information about the protected methods in the class.
+<ul>
+<li>members =&gt; <b>ClassProtectedMethodList</b> <i>(list)</i>. protected method list.
+<ul>
+<li> <b>ClassProtectedMethod</b> <i>(hash)</i>. A protected method.
+<ul>
+<li>parameters =&gt; <b>ClassProtectedMethodParams</b> <i>(list)</i>. List of the parameters of the protected method.
+<ul>
+<li> <b>ClassProtectedMethodParam</b> <i>(hash)</i>. A parameter of the protected method.
+<ul>
+<li>declaration_name =&gt; <b>ClassProtectedMethodParamName</b> <i>(string)</i>. The name of the parameter.
+<li>type =&gt; <b>ClassProtectedMethodParamType</b> <i>(string)</i>. The data type of the parameter.
+</ul>
+</ul>
+<li>protection =&gt; <b>ClassProtectedMethodProtection</b> <i>(string)</i>. Protection of the protected method.
+<li>virtualness =&gt; <b>ClassProtectedMethodVirtualness</b> <i>(string)</i>. Virtualness of the protected method.
+<li>detailed =&gt; <b>ClassProtectedMethodDetailed</b> <i>(hash)</i>. Detailed information about the protected method.
+<ul>
+<li>params =&gt; <b>ClassProtectedMethodPDBlocks</b> <i>(list)</i>. List of parameter documentation blocks for the protected method.
+<ul>
+<li> <b>ClassProtectedMethodPDBlock</b> <i>(hash)</i>. A parameter documentation block for the protected method.
+<ul>
+<li>parameters =&gt; <b>ClassProtectedMethodPDParams</b> <i>(list)</i>. Parameter list for this parameter documentation block.
+<ul>
+<li> <b>ClassProtectedMethodPDParam</b> <i>(hash)</i>. A parameter documented by this documentation block.
+<ul>
+<li>name =&gt; <b>ClassProtectedMethodPDParamName</b> <i>(string)</i>. Name of the parameter.
+</ul>
+</ul>
+<li>doc =&gt; <b>ClassProtectedMethodPDDoc</b> <i>(doc)</i>. Documentation for this parameter documentation block.
+</ul>
+</ul>
+<li>doc =&gt; <b>ClassProtectedMethodDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the protected method.
+<li>see =&gt; <b>ClassProtectedMethodSee</b> <i>(doc)</i>. "See also" documentation for the protected method.
+<li>return =&gt; <b>ClassProtectedMethodReturn</b> <i>(doc)</i>. Documentation about the return value of the protected method.
+</ul>
+<li>kind =&gt; <b>ClassProtectedMethodKind</b> <i>(string)</i>. Kind of protected method (usually "function").
+<li>name =&gt; <b>ClassProtectedMethodName</b> <i>(string)</i>. Name of the protected method.
+<li>type =&gt; <b>ClassProtectedMethodType</b> <i>(string)</i>. Data type returned by the protected method.
+<li>static =&gt; <b>ClassProtectedMethodStatic</b> <i>(string)</i>. Whether the protected method is static.
+</ul>
+</ul>
+</ul>
+<li>public_typedefs =&gt; <b>ClassPublicTypedefs</b> <i>(hash)</i>. Information about the public typedefs in the class.
+<ul>
+<li>members =&gt; <b>ClassPublicTypedefList</b> <i>(list)</i>. public typedef list.
+<ul>
+<li> <b>ClassPublicTypedef</b> <i>(hash)</i>. A public typedef.
+<ul>
+<li>protection =&gt; <b>ClassPublicTypedefProtection</b> <i>(string)</i>. Protection of the public typedef.
+<li>detailed =&gt; <b>ClassPublicTypedefDetailed</b> <i>(hash)</i>. Detailed information about the public typedef.
+<ul>
+<li>doc =&gt; <b>ClassPublicTypedefDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the public typedef.
+<li>see =&gt; <b>ClassPublicTypedefSee</b> <i>(doc)</i>. "See also" documentation for the public typedef.
+</ul>
+<li>kind =&gt; <b>ClassPublicTypedefKind</b> <i>(string)</i>. Kind of public typedef (usually "typedef").
+<li>name =&gt; <b>ClassPublicTypedefName</b> <i>(string)</i>. Name of the public typedef.
+<li>type =&gt; <b>ClassPublicTypedefType</b> <i>(string)</i>. Data type of the public typedef.
+</ul>
+</ul>
+</ul>
+<li>public_members =&gt; <b>ClassPublicMembers</b> <i>(hash)</i>. Information about the public members in the class.
+<ul>
+<li>members =&gt; <b>ClassPublicMemberList</b> <i>(list)</i>. public member list.
+<ul>
+<li> <b>ClassPublicMember</b> <i>(hash)</i>. A public member.
+<ul>
+<li>protection =&gt; <b>ClassPublicMemberProtection</b> <i>(string)</i>. Protection of the public member.
+<li>detailed =&gt; <b>ClassPublicMemberDetailed</b> <i>(hash)</i>. Detailed information about the public member.
+<ul>
+<li>doc =&gt; <b>ClassPublicMemberDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the public member.
+<li>see =&gt; <b>ClassPublicMemberSee</b> <i>(doc)</i>. "See also" documentation for the public member.
+</ul>
+<li>kind =&gt; <b>ClassPublicMemberKind</b> <i>(string)</i>. Kind of public member (usually "variable").
+<li>name =&gt; <b>ClassPublicMemberName</b> <i>(string)</i>. Name of the public member.
+<li>type =&gt; <b>ClassPublicMemberType</b> <i>(string)</i>. Data type of the public member.
+</ul>
+</ul>
+</ul>
+<li>private_methods =&gt; <b>ClassPrivateMethods</b> <i>(hash)</i>. Information about the private methods in the class.
+<ul>
+<li>members =&gt; <b>ClassPrivateMethodList</b> <i>(list)</i>. private method list.
+<ul>
+<li> <b>ClassPrivateMethod</b> <i>(hash)</i>. A private method.
+<ul>
+<li>parameters =&gt; <b>ClassPrivateMethodParams</b> <i>(list)</i>. List of the parameters of the private method.
+<ul>
+<li> <b>ClassPrivateMethodParam</b> <i>(hash)</i>. A parameter of the private method.
+<ul>
+<li>declaration_name =&gt; <b>ClassPrivateMethodParamName</b> <i>(string)</i>. The name of the parameter.
+<li>type =&gt; <b>ClassPrivateMethodParamType</b> <i>(string)</i>. The data type of the parameter.
+</ul>
+</ul>
+<li>protection =&gt; <b>ClassPrivateMethodProtection</b> <i>(string)</i>. Protection of the private method.
+<li>virtualness =&gt; <b>ClassPrivateMethodVirtualness</b> <i>(string)</i>. Virtualness of the private method.
+<li>detailed =&gt; <b>ClassPrivateMethodDetailed</b> <i>(hash)</i>. Detailed information about the private method.
+<ul>
+<li>params =&gt; <b>ClassPrivateMethodPDBlocks</b> <i>(list)</i>. List of parameter documentation blocks for the private method.
+<ul>
+<li> <b>ClassPrivateMethodPDBlock</b> <i>(hash)</i>. A parameter documentation block for the private method.
+<ul>
+<li>parameters =&gt; <b>ClassPrivateMethodPDParams</b> <i>(list)</i>. Parameter list for this parameter documentation block.
+<ul>
+<li> <b>ClassPrivateMethodPDParam</b> <i>(hash)</i>. A parameter documented by this documentation block.
+<ul>
+<li>name =&gt; <b>ClassPrivateMethodPDParamName</b> <i>(string)</i>. Name of the parameter.
+</ul>
+</ul>
+<li>doc =&gt; <b>ClassPrivateMethodPDDoc</b> <i>(doc)</i>. Documentation for this parameter documentation block.
+</ul>
+</ul>
+<li>doc =&gt; <b>ClassPrivateMethodDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the private method.
+<li>see =&gt; <b>ClassPrivateMethodSee</b> <i>(doc)</i>. "See also" documentation for the private method.
+<li>return =&gt; <b>ClassPrivateMethodReturn</b> <i>(doc)</i>. Documentation about the return value of the private method.
+</ul>
+<li>kind =&gt; <b>ClassPrivateMethodKind</b> <i>(string)</i>. Kind of private method (usually "function").
+<li>name =&gt; <b>ClassPrivateMethodName</b> <i>(string)</i>. Name of the private method.
+<li>type =&gt; <b>ClassPrivateMethodType</b> <i>(string)</i>. Data type returned by the private method.
+<li>static =&gt; <b>ClassPrivateMethodStatic</b> <i>(string)</i>. Whether the private method is static.
+</ul>
+</ul>
+</ul>
+<li>public_methods =&gt; <b>ClassPublicMethods</b> <i>(hash)</i>. Information about the public methods in the class.
+<ul>
+<li>members =&gt; <b>ClassPublicMethodList</b> <i>(list)</i>. public method list.
+<ul>
+<li> <b>ClassPublicMethod</b> <i>(hash)</i>. A public method.
+<ul>
+<li>parameters =&gt; <b>ClassPublicMethodParams</b> <i>(list)</i>. List of the parameters of the public method.
+<ul>
+<li> <b>ClassPublicMethodParam</b> <i>(hash)</i>. A parameter of the public method.
+<ul>
+<li>declaration_name =&gt; <b>ClassPublicMethodParamName</b> <i>(string)</i>. The name of the parameter.
+<li>type =&gt; <b>ClassPublicMethodParamType</b> <i>(string)</i>. The data type of the parameter.
+</ul>
+</ul>
+<li>protection =&gt; <b>ClassPublicMethodProtection</b> <i>(string)</i>. Protection of the public method.
+<li>virtualness =&gt; <b>ClassPublicMethodVirtualness</b> <i>(string)</i>. Virtualness of the public method.
+<li>detailed =&gt; <b>ClassPublicMethodDetailed</b> <i>(hash)</i>. Detailed information about the public method.
+<ul>
+<li>params =&gt; <b>ClassPublicMethodPDBlocks</b> <i>(list)</i>. List of parameter documentation blocks for the public method.
+<ul>
+<li> <b>ClassPublicMethodPDBlock</b> <i>(hash)</i>. A parameter documentation block for the public method.
+<ul>
+<li>parameters =&gt; <b>ClassPublicMethodPDParams</b> <i>(list)</i>. Parameter list for this parameter documentation block.
+<ul>
+<li> <b>ClassPublicMethodPDParam</b> <i>(hash)</i>. A parameter documented by this documentation block.
+<ul>
+<li>name =&gt; <b>ClassPublicMethodPDParamName</b> <i>(string)</i>. Name of the parameter.
+</ul>
+</ul>
+<li>doc =&gt; <b>ClassPublicMethodPDDoc</b> <i>(doc)</i>. Documentation for this parameter documentation block.
+</ul>
+</ul>
+<li>doc =&gt; <b>ClassPublicMethodDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the public method.
+<li>see =&gt; <b>ClassPublicMethodSee</b> <i>(doc)</i>. "See also" documentation for the public method.
+<li>return =&gt; <b>ClassPublicMethodReturn</b> <i>(doc)</i>. Documentation about the return value of the public method.
+</ul>
+<li>kind =&gt; <b>ClassPublicMethodKind</b> <i>(string)</i>. Kind of public method (usually "function").
+<li>name =&gt; <b>ClassPublicMethodName</b> <i>(string)</i>. Name of the public method.
+<li>type =&gt; <b>ClassPublicMethodType</b> <i>(string)</i>. Data type returned by the public method.
+<li>static =&gt; <b>ClassPublicMethodStatic</b> <i>(string)</i>. Whether the public method is static.
+</ul>
+</ul>
+</ul>
+</ul>
+</ul>
+<li>files =&gt; <b>Files</b> <i>(list)</i>. Documented files.
+<ul>
+<li> <b>File</b> <i>(hash)</i>. A documented file.
+<ul>
+<li>detailed =&gt; <b>FileDetailed</b> <i>(hash)</i>. Detailed information about the file.
+<ul>
+<li>doc =&gt; <b>FileDetailedDoc</b> <i>(doc)</i>. Detailed documentation block for the file.
+</ul>
+<li>functions =&gt; <b>FileFunctions</b> <i>(hash)</i>. Information about the functions in the file.
+<ul>
+<li>members =&gt; <b>FileFunctionList</b> <i>(list)</i>. function list.
+<ul>
+<li> <b>FileFunction</b> <i>(hash)</i>. A function.
+<ul>
+<li>parameters =&gt; <b>FileFunctionParams</b> <i>(list)</i>. List of the parameters of the function.
+<ul>
+<li> <b>FileFunctionParam</b> <i>(hash)</i>. A parameter of the function.
+<ul>
+<li>declaration_name =&gt; <b>FileFunctionParamName</b> <i>(string)</i>. The name of the parameter.
+<li>type =&gt; <b>FileFunctionParamType</b> <i>(string)</i>. The data type of the parameter.
+</ul>
+</ul>
+<li>protection =&gt; <b>FileFunctionProtection</b> <i>(string)</i>. Protection of the function.
+<li>virtualness =&gt; <b>FileFunctionVirtualness</b> <i>(string)</i>. Virtualness of the function.
+<li>detailed =&gt; <b>FileFunctionDetailed</b> <i>(hash)</i>. Detailed information about the function.
+<ul>
+<li>params =&gt; <b>FileFunctionPDBlocks</b> <i>(list)</i>. List of parameter documentation blocks for the function.
+<ul>
+<li> <b>FileFunctionPDBlock</b> <i>(hash)</i>. A parameter documentation block for the function.
+<ul>
+<li>parameters =&gt; <b>FileFunctionPDParams</b> <i>(list)</i>. Parameter list for this parameter documentation block.
+<ul>
+<li> <b>FileFunctionPDParam</b> <i>(hash)</i>. A parameter documented by this documentation block.
+<ul>
+<li>name =&gt; <b>FileFunctionPDParamName</b> <i>(string)</i>. Name of the parameter.
+</ul>
+</ul>
+<li>doc =&gt; <b>FileFunctionPDDoc</b> <i>(doc)</i>. Documentation for this parameter documentation block.
+</ul>
+</ul>
+<li>doc =&gt; <b>FileFunctionDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the function.
+<li>see =&gt; <b>FileFunctionSee</b> <i>(doc)</i>. "See also" documentation for the function.
+<li>return =&gt; <b>FileFunctionReturn</b> <i>(doc)</i>. Documentation about the return value of the function.
+</ul>
+<li>kind =&gt; <b>FileFunctionKind</b> <i>(string)</i>. Kind of function (usually "function").
+<li>name =&gt; <b>FileFunctionName</b> <i>(string)</i>. Name of the function.
+<li>type =&gt; <b>FileFunctionType</b> <i>(string)</i>. Data type returned by the function.
+<li>static =&gt; <b>FileFunctionStatic</b> <i>(string)</i>. Whether the function is static.
+</ul>
+</ul>
+</ul>
+<li>name =&gt; <b>FileName</b> <i>(string)</i>. Name of the file.
+<li>variables =&gt; <b>FileVariables</b> <i>(hash)</i>. Information about the variables in the file.
+<ul>
+<li>members =&gt; <b>FileVariableList</b> <i>(list)</i>. variable list.
+<ul>
+<li> <b>FileVariable</b> <i>(hash)</i>. A variable.
+<ul>
+<li>protection =&gt; <b>FileVariableProtection</b> <i>(string)</i>. Protection of the variable.
+<li>detailed =&gt; <b>FileVariableDetailed</b> <i>(hash)</i>. Detailed information about the variable.
+<ul>
+<li>doc =&gt; <b>FileVariableDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the variable.
+<li>see =&gt; <b>FileVariableSee</b> <i>(doc)</i>. "See also" documentation for the variable.
+</ul>
+<li>kind =&gt; <b>FileVariableKind</b> <i>(string)</i>. Kind of variable (usually "variable").
+<li>name =&gt; <b>FileVariableName</b> <i>(string)</i>. Name of the variable.
+<li>type =&gt; <b>FileVariableType</b> <i>(string)</i>. Data type of the variable.
+</ul>
+</ul>
+</ul>
+<li>typedefs =&gt; <b>FileTypedefs</b> <i>(hash)</i>. Information about the typedefs in the file.
+<ul>
+<li>members =&gt; <b>FileTypedefList</b> <i>(list)</i>. typedef list.
+<ul>
+<li> <b>FileTypedef</b> <i>(hash)</i>. A typedef.
+<ul>
+<li>protection =&gt; <b>FileTypedefProtection</b> <i>(string)</i>. Protection of the typedef.
+<li>detailed =&gt; <b>FileTypedefDetailed</b> <i>(hash)</i>. Detailed information about the typedef.
+<ul>
+<li>doc =&gt; <b>FileTypedefDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the typedef.
+<li>see =&gt; <b>FileTypedefSee</b> <i>(doc)</i>. "See also" documentation for the typedef.
+</ul>
+<li>kind =&gt; <b>FileTypedefKind</b> <i>(string)</i>. Kind of typedef (usually "typedef").
+<li>name =&gt; <b>FileTypedefName</b> <i>(string)</i>. Name of the typedef.
+<li>type =&gt; <b>FileTypedefType</b> <i>(string)</i>. Data type of the typedef.
+</ul>
+</ul>
+</ul>
+</ul>
+</ul>
+</ul>
+</ul>
+
+*/
diff --git a/doc/preprocessing.doc b/doc/preprocessing.doc
new file mode 100644
index 0000000..603c683
--- /dev/null
+++ b/doc/preprocessing.doc
@@ -0,0 +1,263 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page preprocessing Preprocessing
+
+Source files that are used as input to doxygen can be parsed by doxygen's
+built-in C-preprocessor.
+
+By default doxygen does only partial preprocessing. That is, it
+evaluates conditional compilation statements (like \#if) and
+evaluates macro definitions, but it does not perform macro expansion.
+
+So if you have the following code fragment
+\verbatim
+#define VERSION 200
+#define CONST_STRING const char *
+
+#if VERSION >= 200
+ static CONST_STRING version = "2.xx";
+#else
+ static CONST_STRING version = "1.xx";
+#endif
+\endverbatim
+
+Then by default doxygen will feed the following to its parser:
+
+\verbatim
+#define VERSION
+#define CONST_STRING
+
+ static CONST_STRING version = "2.xx";
+\endverbatim
+
+You can disable all preprocessing by setting
+\ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" to \c
+NO in the configuration file. In the case above doxygen will then read
+both statements, i.e:
+
+\verbatim
+ static CONST_STRING version = "2.xx";
+ static CONST_STRING version = "1.xx";
+\endverbatim
+
+In case you want to expand the \c CONST_STRING macro, you should set the
+\ref cfg_macro_expansion "MACRO_EXPANSION" tag in the config file
+to \c YES. Then the result after preprocessing becomes:
+
+\verbatim
+#define VERSION
+#define CONST_STRING
+
+ static const char * version = "1.xx";
+\endverbatim
+
+Note that doxygen will now expand \e all macro definitions
+(recursively if needed). This is often too much. Therefore, doxygen also
+allows you to expand only those defines that you explicitly
+specify. For this you have to set the
+\ref cfg_expand_only_predef "EXPAND_ONLY_PREDEF" tag to \c YES
+and specify the macro definitions after
+the \ref cfg_predefined "PREDEFINED" or
+\ref cfg_expand_as_defined "EXPAND_AS_DEFINED" tag.
+
+A typically example where some help from the preprocessor is needed is
+when dealing with Microsoft's __declspec language extension. Here is an
+example function.
+
+\verbatim
+extern "C" void __declspec(dllexport) ErrorMsg( String aMessage,...);
+\endverbatim
+
+When nothing is done, doxygen will be confused and see __declspec as
+some sort of function. To help doxygen one typically uses the following
+preprocessor settings:
+
+\verbatim
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+PREDEFINED = __declspec(x)=
+\endverbatim
+
+This will make sure the __declspec(dllexport) is removed before doxygen
+parses the source code.
+
+For a more complex example, suppose you have the following obfuscated
+code fragment of an abstract base class called \c IUnknown:
+
+\verbatim
+/*! A reference to an IID */
+#ifdef __cplusplus
+#define REFIID const IID &
+#else
+#define REFIID const IID *
+#endif
+
+
+/*! The IUnknown interface */
+DECLARE_INTERFACE(IUnknown)
+{
+ STDMETHOD(HRESULT,QueryInterface) (THIS_ REFIID iid, void **ppv) PURE;
+ STDMETHOD(ULONG,AddRef) (THIS) PURE;
+ STDMETHOD(ULONG,Release) (THIS) PURE;
+};
+\endverbatim
+
+without macro expansion doxygen will get confused, but we may not want to
+expand the REFIID macro, because it is documented and the user that reads
+the documentation should use it when implementing the interface.
+
+By setting the following in the config file:
+
+\verbatim
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+PREDEFINED = "DECLARE_INTERFACE(name)=class name" \
+ "STDMETHOD(result,name)=virtual result name" \
+ "PURE= = 0" \
+ THIS_= \
+ THIS= \
+ __cplusplus
+\endverbatim
+
+we can make sure that the proper result is fed to doxygen's parser:
+\verbatim
+/*! A reference to an IID */
+#define REFIID
+
+/*! The IUnknown interface */
+class IUnknown
+{
+ virtual HRESULT QueryInterface ( REFIID iid, void **ppv) = 0;
+ virtual ULONG AddRef () = 0;
+ virtual ULONG Release () = 0;
+};
+\endverbatim
+
+Note that the \ref cfg_predefined "PREDEFINED" tag accepts function
+like macro definitions
+(like \c DECLARE_INTERFACE ), normal macro
+substitutions (like \c PURE and \c THIS) and plain
+defines (like \c __cplusplus).
+
+Note also that preprocessor definitions that are normally defined
+automatically by the preprocessor (like \c __cplusplus), have to be defined
+by hand with doxygen's parser (this is done because these defines
+are often platform/compiler specific).
+
+In some cases you may want to substitute a macro name or function by
+something else without exposing the result to further macro substitution.
+You can do this but using the <code>:=</code> operator instead of
+<code>=</code>
+
+As an example suppose we have the following piece of code:
+\verbatim
+#define QList QListT
+class QListT
+{
+};
+\endverbatim
+
+Then the only way to get doxygen interpret this as a class definition
+for class QList is to define:
+\verbatim
+PREDEFINED = QListT:=QList
+\endverbatim
+
+Here is an example provided by Valter Minute and Reyes Ponce that helps
+doxygen to wade through the boilerplate code in Microsoft's ATL \& MFC
+libraries:
+
+\verbatim
+PREDEFINED = "DECLARE_INTERFACE(name)=class name" \
+ "STDMETHOD(result,name)=virtual result name" \
+ "PURE= = 0" \
+ THIS_= \
+ THIS= \
+ DECLARE_REGISTRY_RESOURCEID=// \
+ DECLARE_PROTECT_FINAL_CONSTRUCT=// \
+ "DECLARE_AGGREGATABLE(Class)= " \
+ "DECLARE_REGISTRY_RESOURCEID(Id)= " \
+ DECLARE_MESSAGE_MAP= \
+ BEGIN_MESSAGE_MAP=/* \
+ END_MESSAGE_MAP=*/// \
+ BEGIN_COM_MAP=/* \
+ END_COM_MAP=*/// \
+ BEGIN_PROP_MAP=/* \
+ END_PROP_MAP=*/// \
+ BEGIN_MSG_MAP=/* \
+ END_MSG_MAP=*/// \
+ BEGIN_PROPERTY_MAP=/* \
+ END_PROPERTY_MAP=*/// \
+ BEGIN_OBJECT_MAP=/* \
+ END_OBJECT_MAP()=*/// \
+ DECLARE_VIEW_STATUS=// \
+ "STDMETHOD(a)=HRESULT a" \
+ "ATL_NO_VTABLE= " \
+ "__declspec(a)= " \
+ BEGIN_CONNECTION_POINT_MAP=/* \
+ END_CONNECTION_POINT_MAP=*/// \
+ "DECLARE_DYNAMIC(class)= " \
+ "IMPLEMENT_DYNAMIC(class1, class2)= " \
+ "DECLARE_DYNCREATE(class)= " \
+ "IMPLEMENT_DYNCREATE(class1, class2)= " \
+ "IMPLEMENT_SERIAL(class1, class2, class3)= " \
+ "DECLARE_MESSAGE_MAP()= " \
+ TRY=try \
+ "CATCH_ALL(e)= catch(...)" \
+ END_CATCH_ALL= \
+ "THROW_LAST()= throw"\
+ "RUNTIME_CLASS(class)=class" \
+ "MAKEINTRESOURCE(nId)=nId" \
+ "IMPLEMENT_REGISTER(v, w, x, y, z)= " \
+ "ASSERT(x)=assert(x)" \
+ "ASSERT_VALID(x)=assert(x)" \
+ "TRACE0(x)=printf(x)" \
+ "OS_ERR(A,B)={ #A, B }" \
+ __cplusplus \
+ "DECLARE_OLECREATE(class)= " \
+ "BEGIN_DISPATCH_MAP(class1, class2)= " \
+ "BEGIN_INTERFACE_MAP(class1, class2)= " \
+ "INTERFACE_PART(class, id, name)= " \
+ "END_INTERFACE_MAP()=" \
+ "DISP_FUNCTION(class, name, function, result, id)=" \
+ "END_DISPATCH_MAP()=" \
+ "IMPLEMENT_OLECREATE2(class, name, id1, id2, id3, id4,\
+ id5, id6, id7, id8, id9, id10, id11)="
+\endverbatim
+
+As you can see doxygen's preprocessor is quite powerful, but if you want
+even more flexibility you can always write an input filter and specify it
+after the \ref cfg_input_filter "INPUT_FILTER" tag.
+
+If you are unsure what the effect of doxygen's preprocessing will be
+you can run doxygen as follows:
+\verbatim
+ doxygen -d Preprocessor
+\endverbatim
+This will instruct doxygen to dump the input sources to standard output after
+preprocessing has been done (Hint: set <code>QUIET = YES</code> and
+<code>WARNINGS = NO</code> in the configuration file to disable any other
+output).
+
+\htmlonly
+Go to the <a href="external.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
diff --git a/doc/searching.doc b/doc/searching.doc
new file mode 100644
index 0000000..dc0dd9e
--- /dev/null
+++ b/doc/searching.doc
@@ -0,0 +1,158 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page searching Searching
+
+Doxygen indexes your source code in various ways to make it easier
+to navigate and find what you are looking for.
+There are also situations however where you want to
+search for something by keyword rather than browse for it.
+
+HTML browsers by default have no search capabilities that work across multiple
+pages, so either doxygen or external tools need to help to facilitate
+this feature.
+
+Doxygen has 6 different ways to add searching to the HTML output, each of which
+has its own advantages and disadvantages:
+
+<h2>1. Client side searching</h2>
+ The easiest way to enable searching is to enable the built-in client
+ side search engine. This engine is implemented using Javascript and DHTML
+ only and runs entirely on the clients browser. So no additional tooling is
+ required to make it work.
+
+ To enable it set
+ \ref cfg_searchengine "SEARCHENGINE" to \c YES in the config file
+ and make sure \ref cfg_server_based_search "SERVER_BASED_SEARCH" is set
+ to \c NO.
+
+ An additional advantage of this method is that it provides live
+ searching, i.e. the search results are presented and adapted as you type.
+
+ This method also has its drawbacks: it is limited to searching for symbols
+ only. It does not provide full text search capabilities, and it does not
+ scale well to very large projects (then searching becomes very slow).
+
+<h2>2. Server side searching</h2>
+ If you plan to put the HTML documentation on a web server, and that
+ web server has the capability to process PHP code, then you can also use
+ doxygen's built-in server side search engine.
+
+ To enable this set both
+ \ref cfg_searchengine "SEARCHENGINE" and
+ \ref cfg_server_based_search "SERVER_BASED_SEARCH" to \c YES in the config
+ file.
+
+ Advantages over the client side search engine are that it provides full
+ text search and it scales well to large projects.
+
+ Disadvantages are that it does not work locally (i.e. using a file:// URL)
+ and that it does not provide live search capabilities.
+
+<h2>3. Windows Compiled HTML Help</h2>
+ If you are running doxygen on Windows, then you can make a
+ compiled HTML Help file (.chm) out of the HTML files produced by doxygen.
+ This is a single file containing all HTML files and it also includes a
+ search index. There are viewers for this format on many platforms,
+ and Windows even supports it natively.
+
+ To enable this set \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" to \c YES
+ in the config file. To let doxygen compile the HTML Help file for you,
+ you also need to specify the path to the HTML compiler (hhc.exe) using the
+ \ref cfg_hhc_location "HHC_LOCATION" config option and the name of the
+ resulting CHM file using \ref cfg_chm_file "CHM_FILE".
+
+ An advantage of this method is that the result is a single file that can
+ easily be distributed. It also provides full text search.
+
+ Disadvantages are that compiling the CHM file only works on Windows
+ and requires Microsoft's HTML compiler, which is not very actively supported
+ by Microsoft. Although the tool works fine for most people, it can
+ sometimes crash for no apparent reason (how typical).
+
+<h2>4. Mac OS X Doc Sets</h2>
+ If you are running doxygen on Mac OS X 10.5 or higher,
+ then you can make a "doc set" out of the HTML files produced by doxygen.
+ A doc set consists of a single directory with a special structure
+ containing the HTML files along with a precompiled search index.
+ A doc set can be embedded in Xcode (the integrated development environment
+ provided by Apple).
+
+ To enable the creation of doc sets set \ref cfg_generate_docset "GENERATE_DOCSET"
+ to \c YES in the config file. There are a couple of other doc set related
+ options you may want to set. After doxygen has finished you will find
+ a Makefile in the HTML output directory. Running "make install" on this
+ Makefile will compile and install the doc set.
+ See <a href="http://developer.apple.com/tools/creatingdocsetswithdoxygen.html">this
+ article</a> for more info.
+
+ Advantage of this method is that it nicely integrates with the Xcode
+ development environment, allowing for instance to click on an identifier
+ in the editor and jump to the corresponding section in the doxygen
+ documentation.
+
+ Disadvantage is that it only works in combination with Xcode on MacOSX.
+
+<h2>5. Qt Compressed Help</h2>
+ If you develop for or want to install the Qt application framework,
+ you will get an application
+ called <a href="http://doc.trolltech.com/4.6/assistant-manual.html">Qt assistant</a>.
+ This is a help viewer for Qt Compressed Help files (.qch).
+
+ To enable this feature set \ref cfg_generate_qhp "GENERATE_QHP" to \c YES.
+ You also need to fill in the other Qt help related options, such as
+ \ref cfg_qhp_namespace "QHP_NAMESPACE",
+ \ref cfg_qhg_location "QHG_LOCATION",
+ \ref cfg_qhp_virtual_folder "QHP_VIRTUAL_FOLDER".
+ See <a href="http://doc.trolltech.com/qq/qq28-qthelp.html#htmlfilesandhelpprojects">this article</a>
+ for more info.
+
+ Feature wise the Qt compressed help feature is comparable with the CHM
+ output, with the additional advantage that compiling the QCH file is
+ not limited to Windows.
+
+ Disadvantage is that it requires setting up a Qt 4.5 (or better) for
+ each user, or distributing the Qt help assistant along with
+ the documentation, which is complicated by the fact that it is not
+ available as a separate package at this moment.
+
+<h2>6. Eclipse Help Plugin</h2>
+ If you use eclipse, you can embed the documentation generated by
+ doxygen as a help plugin. It will then appear as a topic in the help
+ browser that can be started from "Help contents" in the Help menu.
+ Eclipse will generate a search index for the documentation when you
+ first search for an keyword.
+
+ To enable the help plugin set
+ \ref cfg_generate_eclipsehelp "GENERATE_ECLIPSEHELP" to \c YES,
+ and define a unique identifier for your project via
+ \ref cfg_eclipse_doc_id "ECLIPSE_DOC_ID", i.e:
+\verbatim
+ GENERATE_ECLIPSEHELP = YES
+ ECLIPSE_DOC_ID = com.yourcompany.yourproject
+\endverbatim
+ then create the \c com.yourcompany.yourproject directory (so with
+ the same name as the value of \c ECLIPSE_DOC_ID) in the
+ \c plugin directory of eclipse and after doxygen completes copy
+ to contents of the help output directory to
+ the \c com.yourcompany.yourproject directory.
+ Then restart eclipse to make let it find the new plugin.
+
+ The eclipse help plugin provides similar functionality as the
+ Qt compressed help or CHM output, but it does require that Eclipse is
+ installed and running.
+
+*/
diff --git a/doc/starting.doc b/doc/starting.doc
new file mode 100644
index 0000000..6b76be7
--- /dev/null
+++ b/doc/starting.doc
@@ -0,0 +1,300 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page starting Getting started
+
+The executable \c doxygen is the main program that parses the sources and
+generates the documentation. See section \ref doxygen_usage for more
+detailed usage information.
+
+The executable \c doxytag is only needed if you want to generate references
+to external documentation (i.e. documentation that was generated by doxygen)
+for which you do not have the sources. See section \ref doxytag_usage
+for more detailed usage information.
+
+Optionally, the executable \c doxywizard can be used, which is a
+\ref doxywizard_usage "graphical front-end" for editing the configuration file
+that is used by doxygen and for running doxygen in a graphical environment.
+For Mac OS X doxywizard will be started by clicking on the Doxygen application
+icon.
+
+The following figure shows the relation between the tools and the flow
+of information between them (it looks complex but that's only because it
+tries to be complete):
+
+\image html infoflow.gif "Doxygen information flow"
+\image latex infoflow.eps "Doxygen information flow" width=14cm
+
+\section step0 Step 0: Check if doxygen supports your programming language
+
+First, assure that your programming language has a reasonable chance of being
+recognized by Doxygen. These languages are supported by default: C, C++, C#,
+Objective-C, IDL, Java, VHDL, PHP, Python, Fortran, and D. It
+is possible to configure certain filetype extensions to use certain parsers:
+see the \ref cfg_extension_mapping "Configuration/ExtensionMappings" for details.
+Also, completely different languages can be supported by using preprocessor
+programs: see the <a href="http://www.doxygen.org/helpers.html">Helpers page</a>
+for details.
+
+\section step1 Step 1: Creating a configuration file
+
+Doxygen uses a configuration file to determine all of its settings.
+Each project should get its own configuration file. A project can consist
+of a single source file, but can also be an entire source tree that is
+recursively scanned.
+
+To simplify the creation of a configuration file, doxygen can create a
+template configuration file for you. To do this call \c doxygen
+from the command line with the \c -g option:
+\verbatim
+doxygen -g <config-file>
+\endverbatim
+
+where \<config-file\> is the name of the configuration file. If you omit
+the file name, a file named \c Doxyfile will be created. If a file with the
+name \<config-file\> already exists, doxygen will rename it to
+\<config-file\>.bak before generating the configuration template.
+If you use <code>-</code> (i.e. the minus sign) as the file name then
+doxygen will try to read the configuration file from standard
+input (<code>stdin</code>), which can be useful for scripting.
+
+The configuration file has a format that is similar to that of a (simple)
+Makefile. It consists of a number of assignments (tags) of the form:
+
+<tt>TAGNAME = VALUE</tt> or <br>
+<tt>TAGNAME = VALUE1 VALUE2 ... </tt><br>
+
+You can probably leave the values of most tags in a generated template
+configuration file to their default value. See section \ref config for
+more details about the configuration file.
+
+If you do not wish to edit the config file with a text editor, you should
+have a look at \ref doxywizard_usage "doxywizard", which is a GUI
+front-end that can create, read and write doxygen configuration files,
+and allows setting configuration options by entering them via dialogs.
+
+For a small project consisting of a few C and/or C++ source
+and header files, you can leave
+\ref cfg_input "INPUT" tag empty and doxygen will search for sources in
+the current directory.
+
+If you have a larger project consisting of a source directory or tree
+you should assign the root directory or
+directories to the \ref cfg_input "INPUT" tag, and add one or more file
+patterns to the \ref cfg_file_patterns "FILE_PATTERNS" tag
+(for instance <code>*.cpp *.h</code>). Only files that match one of the
+patterns will be parsed (if the patterns are omitted a list of
+source extensions is used).
+For recursive parsing of a source tree you must set
+the \ref cfg_recursive "RECURSIVE" tag to \c YES. To further fine-tune the
+list of files that is parsed the \ref cfg_exclude "EXCLUDE" and
+\ref cfg_exclude_patterns "EXCLUDE_PATTERNS" tags can be used.
+To omit all \c test directories from a source tree for instance, one could use:
+\verbatim EXCLUDE_PATTERNS = */test/*
+\endverbatim
+
+Doxygen looks at the file's extension to determine how to parse a file.
+If a file has an <code>.idl</code> or <code>.odl</code> extension it is
+treated as an IDL file. If it has a <code>.java</code> extension it is
+treated as a file written in Java. Files ending with <code>.cs</code> are
+treated as C# files and the <code>.py</code> extension selects the
+Python parser. Finally, files with the extensions <code>.php</code>, <code>.php4</code>,
+<code>.inc</code> or <code>.phtml</code> are treated as PHP sources.
+Any other extension is parsed as if it is a C/C++ file, where files that
+end with <code>.m</code> are treated as Objective-C source files.
+
+\anchor extract_all
+If you start using doxygen for an existing project (thus without any
+documentation that doxygen is aware of), you can still get an idea of
+what the structure is and how the documented result would look like.
+To do so, you must set
+the \ref cfg_extract_all "EXTRACT_ALL" tag in the configuration file
+to \c YES. Then, doxygen will pretend everything in your sources is documented.
+Please note that as a consequence warnings about undocumented members
+will not be generated as long as \ref cfg_extract_all "EXTRACT_ALL" is
+set to \c YES.
+
+To analyze an existing piece of software it is useful to cross-reference
+a (documented) entity with its definition in the source files. Doxygen will
+generate such cross-references if you set
+the \ref cfg_source_browser "SOURCE_BROWSER" tag to \c YES.
+It can also include the sources directly into the documentation by setting
+\ref cfg_inline_sources "INLINE_SOURCES" to \c YES (this can be handy for
+code reviews for instance).
+
+\section step2 Step 2: Running doxygen
+
+To generate the documentation you can now enter:
+\verbatim
+doxygen <config-file>
+\endverbatim
+
+Depending on your settings doxygen will create \c html, \c rtf,
+\c latex, \c xml and/or \c man directories inside the output directory.
+As the names suggest these directories contain the
+generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$, XML and
+Unix-Man page format.
+
+The default output directory is the directory in which \c doxygen
+is started. The root directory to which the output is written can be changed
+using the \ref cfg_output_directory "OUTPUT_DIRECTORY". The format specific
+directory within the output directory can be selected using the
+\ref cfg_html_output "HTML_OUTPUT", \ref cfg_rtf_output "RTF_OUTPUT",
+\ref cfg_latex_output "LATEX_OUTPUT", \ref cfg_xml_output "XML_OUTPUT",
+and \ref cfg_man_output "MAN_OUTPUT"
+tags of the configuration file. If the output directory does not exist,
+\c doxygen will try to create it for you (but it will \e not try to create
+a whole path recursively, like <code>mkdir -p</code> does).
+
+\subsection html_out HTML output
+\addindex browser
+The generated HTML documentation can be viewed by pointing a HTML browser
+to the \c index.html file in the \c html directory. For the best results
+a browser that supports cascading style sheets (CSS) should be used
+(I'm using Mozilla, Safari, Konqueror, and sometimes IE6 to test the
+generated output).
+
+Some of the features the HTML section (such as
+\ref cfg_generate_treeview "GENERATE_TREEVIEW" or the search engine)
+require a browser that supports DHTML and Javascript.
+
+\subsection latex_out LaTeX output
+\addindex LaTeX
+The generated \f$\mbox{\LaTeX}\f$ documentation must first be compiled by
+a \f$\mbox{\LaTeX}\f$ compiler (I use a recent teTeX distribution for Linux
+and MacOSX and MikTex for Windows).
+To simplify the process of compiling the generated
+documentation, \c doxygen writes a \c Makefile into the \c latex directory.
+
+The contents and targets in the \c Makefile depend on the setting of
+\ref cfg_use_pdflatex "USE_PDFLATEX". If it is disabled (set to \c NO), then
+typing \c make in the \c latex directory a dvi file called \c refman.dvi
+will be generated. This file can then be viewed using \c xdvi or
+converted into a PostScript file \c refman.ps by
+typing <code>make ps</code> (this requires <code>dvips</code>).
+
+To put 2 pages on one physical page use <code>make ps_2on1</code> instead.
+The resulting PostScript file can be send to a PostScript
+printer. If you do not have a PostScript printer, you can try to use
+ghostscript to convert PostScript into something your printer understands.
+
+Conversion to PDF is also possible if you have installed the ghostscript
+interpreter; just type <code>make pdf</code> (or <code>make pdf_2on1</code>).
+
+To get the best results for PDF output you should set
+the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS"
+and \ref cfg_use_pdflatex "USE_PDFLATEX" tags to \c YES.
+In this case the \c Makefile will only contain a target to build
+\c refman.pdf directly.
+
+\subsection rtf_out RTF output
+\addindex RTF
+Doxygen combines the RTF output to a single file called refman.rtf. This
+file is optimized for importing into the Microsoft Word. Certain information
+is encoded using field. To show the actual value you need to
+select all (Edit - select all) and then toggle fields (right click and select
+the option from the drop down menu).
+
+\subsection xml_out XML output
+\addindex XML
+The XML output consists of a structured "dump" of the information gathered
+by doxygen. Each compound (class/namespace/file/...) has its own XML file
+and there is also an index file called index.xml.
+
+A file called combine.xslt
+XSLT script is also generated and can be used to combine all XML files
+into a single file.
+
+Doxygen also generates two XML schema files index.xsd
+(for the index file) and compound.xsd (for the compound files).
+This schema file describes the possible elements, their attributes and
+how they are structured, i.e. it the describes the grammar of the XML
+files and can be used for validation or to steer XSLT scripts.
+
+In the addon/doxmlparser directory you can find a parser library for reading
+the XML output produced by doxygen in an incremental way
+(see addon/doxmlparser/include/doxmlintf.h for the interface of the library)
+
+\subsection man_out Man page output
+The generated man pages can be viewed using the \c man program. You do need
+to make sure the man directory is in the man path (see the \c MANPATH
+environment variable). Note that there are some limitations to the
+capabilities of the man page format, so some information
+(like class diagrams, cross references and formulas) will be lost.
+
+\section step3 Step 3: Documenting the sources
+
+Although documenting the sources is presented as step 3, in a new project
+this should of course be step 1. Here I assume
+you already have some code and you want doxygen to generate a nice document
+describing the API and maybe the internals as well.
+
+If the \ref cfg_extract_all "EXTRACT_ALL" option is set to \c NO in the
+configuration file (the default), then doxygen will only generate
+documentation for \e documented members, files, classes and namespaces. So
+how do you document these? For members, classes and namespaces there are
+basically two options:
+<ol>
+<li>Place a \e special documentation block in front of the declaration or
+ definition of the member, class or namespace. For file, class and namespace
+ members it is also allowed to place the documentation directly after the
+ member. See section \ref specialblock to learn more about special
+ documentation blocks.
+<li>Place a special documentation block somewhere else (another file or
+ another location) \e and put a <em>structural command</em> in the
+ documentation block. A structural command links a documentation block
+ to a certain entity that can be documented (e.g. a member, class,
+ namespace or file). See section \ref structuralcommands to learn more
+ about structural commands.
+</ol>
+Files can only be documented using the second option, since there is
+no way to put a documentation block before a file. Of course, file members
+(functions, variables, typedefs, defines) do not need an explicit
+structural command; just putting a special documentation block in front or
+behind them will do.
+
+The text inside a special documentation block is parsed
+before it is written to the HTML and/or \f$\mbox{\LaTeX}\f$ output files.
+
+\addindex parsing
+During parsing the following steps take place:
+<ul>
+<li> The special commands inside the documentation are executed. See
+ section \ref commands for an overview of all commands.
+<li> If a line starts with some whitespace followed by one or more asterisks
+ (<tt>*</tt>) and then optionally more whitespace,
+ then all whitespace and asterisks are removed.
+<li> All resulting blank lines are treated as a paragraph separators.
+ This saves you from placing new-paragraph commands yourself
+ in order to make the generated documentation readable.
+<li> Links are created for words corresponding to documented classes
+ (unless the word is preceded by a \%; then the word will not be linked and
+ the \% sign is removed).
+<li> Links to members are created when certain patterns are found in the
+ text. See section \ref autolink
+ for more information on how the automatic link generation works.
+<li> HTML tags that are in the documentation are interpreted and converted
+ to \f$\mbox{\LaTeX}\f$ equivalents for the \f$\mbox{\LaTeX}\f$ output.
+ See section \ref htmlcmds for an overview of all supported HTML tags.
+</ul>
+
+\htmlonly
+Go to the <a href="docblocks.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
+
diff --git a/doc/translator.py b/doc/translator.py
new file mode 100644
index 0000000..ea61abf
--- /dev/null
+++ b/doc/translator.py
@@ -0,0 +1,2012 @@
+"""Script to generate reports on translator classes from Doxygen sources.
+
+ The main purpose of the script is to extract the information from sources
+ related to internationalization (the translator classes). It uses the
+ information to generate documentation (language.doc,
+ translator_report.txt) from templates (language.tpl, maintainers.txt).
+
+ Simply run the script without parameters to get the reports and
+ documentation for all supported languages. If you want to generate the
+ translator report only for some languages, pass their codes as arguments
+ to the script. In that case, the language.doc will not be generated.
+ Example:
+
+ python translator.py en nl cz
+
+ Originally, the script was written in Perl and was known as translator.pl.
+ The last Perl version was dated 2002/05/21 (plus some later corrections)
+
+ $Id: translator.py 742 2010-09-20 18:19:55Z dimitri $
+
+ Petr Prikryl (prikrylp@skil.cz)
+
+ History:
+ --------
+ 2002/05/21 - This was the last Perl version.
+ 2003/05/16 - List of language marks can be passed as arguments.
+ 2004/01/24 - Total reimplementation started: classes TrManager, and Transl.
+ 2004/02/05 - First version that produces translator report. No language.doc yet.
+ 2004/02/10 - First fully functional version that generates both the translator
+ report and the documentation. It is a bit slower than the
+ Perl version, but is much less tricky and much more flexible.
+ It also solves some problems that were not solved by the Perl
+ version. The translator report content should be more useful
+ for developers.
+ 2004/02/11 - Some tuning-up to provide more useful information.
+ 2004/04/16 - Added new tokens to the tokenizer (to remove some warnings).
+ 2004/05/25 - Added from __future__ import generators not to force Python 2.3.
+ 2004/06/03 - Removed dependency on textwrap module.
+ 2004/07/07 - Fixed the bug in the fill() function.
+ 2004/07/21 - Better e-mail mangling for HTML part of language.doc.
+ - Plural not used for reporting a single missing method.
+ - Removal of not used translator adapters is suggested only
+ when the report is not restricted to selected languages
+ explicitly via script arguments.
+ 2004/07/26 - Better reporting of not-needed adapters.
+ 2004/10/04 - Reporting of not called translator methods added.
+ 2004/10/05 - Modified to check only doxygen/src sources for the previous report.
+ 2005/02/28 - Slight modification to generate "mailto.txt" auxiliary file.
+ 2005/08/15 - Doxygen's root directory determined primarily from DOXYGEN
+ environment variable. When not found, then relatively to the script.
+ 2007/03/20 - The "translate me!" searched in comments and reported if found.
+ 2008/06/09 - Warning when the MAX_DOT_GRAPH_HEIGHT is still part of trLegendDocs().
+ 2009/05/09 - Changed HTML output to fit it with XHTML DTD
+ 2009/09/02 - Added percentage info to the report (implemented / to be implemented).
+ 2010/02/09 - Added checking/suggestion 'Reimplementation using UTF-8 suggested.
+ 2010/03/03 - Added [unreachable] prefix used in maintainers.txt.
+ 2010/05/28 - BOM skipped; minor code cleaning.
+ 2010/05/31 - e-mail mangled already in maintainers.txt
+ 2010/08/20 - maintainers.txt to UTF-8, related processin of unicode strings
+ - [any mark] introduced instead of [unreachable] only
+ - marks hihglighted in HTML
+ 2010/08/30 - Highlighting in what will be the table in langhowto.html modified.
+ 2010/09/27 - The underscore in \latexonly part of the generated language.doc
+ was prefixed by backslash (was LaTeX related error).
+ """
+
+from __future__ import generators
+import codecs
+import os
+import re
+import sys
+
+
+def fill(s):
+ """Returns string formated to the wrapped paragraph multiline string.
+
+ Replaces whitespaces by one space and then uses he textwrap.fill()."""
+
+ # Replace all whitespace by spaces, remove whitespaces that are not
+ # necessary, strip the left and right whitespaces, and break the string
+ # to list of words.
+ rexWS = re.compile(r'\s+')
+ lst = rexWS.sub(' ', s).strip().split()
+
+ # If the list is not empty, put the words together and form the lines
+ # of maximum 70 characters. Build the list of lines.
+ lines = []
+ if lst:
+ line = lst.pop(0) # no separation space in front of the first word
+ for word in lst:
+ if len(line) + len(word) < 70:
+ line += ' ' + word
+ else:
+ lines.append(line) # another full line formed
+ line = word # next line started
+ lines.append(line) # the last line
+ return '\n'.join(lines)
+
+
+# The following function dedent() is the verbatim copy from the textwrap.py
+# module. The textwrap.py was introduced in Python 2.3. To make this script
+# working also in older Python versions, I have decided to copy it.
+# Notice that the textwrap.py is copyrighted:
+#
+# Copyright (C) 1999-2001 Gregory P. Ward.
+# Copyright (C) 2002, 2003 Python Software Foundation.
+# Written by Greg Ward <gward@python.net>
+#
+# The explicit permission to use the code here was sent by Guido van Rossum
+# (4th June, 2004).
+#
+def dedent(text):
+ """dedent(text : string) -> string
+
+ Remove any whitespace than can be uniformly removed from the left
+ of every line in `text`.
+
+ This can be used e.g. to make triple-quoted strings line up with
+ the left edge of screen/whatever, while still presenting it in the
+ source code in indented form.
+
+ For example:
+
+ def test():
+ # end first line with \ to avoid the empty line!
+ s = '''\
+ hello
+ world
+ '''
+ print repr(s) # prints ' hello\n world\n '
+ print repr(dedent(s)) # prints 'hello\n world\n'
+ """
+ lines = text.expandtabs().split('\n')
+ margin = None
+ for line in lines:
+ content = line.lstrip()
+ if not content:
+ continue
+ indent = len(line) - len(content)
+ if margin is None:
+ margin = indent
+ else:
+ margin = min(margin, indent)
+
+ if margin is not None and margin > 0:
+ for i in range(len(lines)):
+ lines[i] = lines[i][margin:]
+
+ return '\n'.join(lines)
+
+
+class Transl:
+ """One instance is build for each translator.
+
+ The abbreviation of the source file--part after 'translator_'--is used as
+ the identification of the object. The empty string is used for the
+ abstract Translator class from translator.h. The other information is
+ extracted from inside the source file."""
+
+ def __init__(self, fname, manager):
+ """Bind to the manager and initialize."""
+
+ # Store the filename and the reference to the manager object.
+ self.fname = fname
+ self.manager = manager
+
+ # The instance is responsible for loading the source file, so it checks
+ # for its existence and quits if something goes wrong.
+ if not os.path.isfile(fname):
+ sys.stderr.write("\a\nFile '%s' not found!\n" % fname)
+ sys.exit(1)
+
+ # Initialize the other collected information.
+ self.classId = None
+ self.baseClassId = None
+ self.readableStatus = None # 'up-to-date', '1.2.3', '1.3', etc.
+ self.status = None # '', '1.2.03', '1.3.00', etc.
+ self.lang = None # like 'Brasilian'
+ self.langReadable = None # like 'Brasilian Portuguese'
+ self.note = None # like 'should be cleaned up'
+ self.prototypeDic = {} # uniPrototype -> prototype
+ self.translateMeText = 'translate me!'
+ self.translateMeFlag = False # comments with "translate me!" found
+ self.txtMAX_DOT_GRAPH_HEIGHT_flag = False # found in string in trLegendDocs()
+ self.obsoleteMethods = None # list of prototypes to be removed
+ self.missingMethods = None # list of prototypes to be implemented
+ self.implementedMethods = None # list of implemented required methods
+ self.adaptMinClass = None # The newest adapter class that can be used
+ self.isDecodedTranslator = None # Flag related to internal usage of UTF-8
+
+ def __tokenGenerator(self):
+ """Generator that reads the file and yields tokens as 4-tuples.
+
+ The tokens have the form (tokenId, tokenString, lineNo). The
+ last returned token has the form ('eof', None, None). When trying
+ to access next token afer that, the exception would be raised."""
+
+ # Set the dictionary for recognizing tokenId for keywords, separators
+ # and the similar categories. The key is the string to be recognized,
+ # the value says its token identification.
+ tokenDic = { 'class': 'class',
+ 'const': 'const',
+ 'public': 'public',
+ 'protected': 'protected',
+ 'private': 'private',
+ 'static': 'static',
+ 'virtual': 'virtual',
+ ':': 'colon',
+ ';': 'semic',
+ ',': 'comma',
+ '[': 'lsqbra',
+ ']': 'rsqbra',
+ '(': 'lpar',
+ ')': 'rpar',
+ '{': 'lcurly',
+ '}': 'rcurly',
+ '=': 'assign',
+ '*': 'star',
+ '&': 'amp',
+ '+': 'plus',
+ '-': 'minus',
+ '!': 'excl',
+ '?': 'qmark',
+ '<': 'lt',
+ '>': 'gt',
+ "'": 'quot',
+ '"': 'dquot',
+ '.': 'dot',
+ '%': 'perc',
+ '~': 'tilde',
+ '^': 'caret',
+ }
+
+ # Regular expression for recognizing identifiers.
+ rexId = re.compile(r'^[a-zA-Z]\w*$')
+
+ # Open the file for reading and extracting tokens until the eof.
+ # Initialize the finite automaton.
+ f = open(self.fname)
+ lineNo = 0
+ line = '' # init -- see the pos initialization below
+ linelen = 0 # init
+ pos = 100 # init -- pos after the end of line
+ status = 0
+
+ tokenId = None # init
+ tokenStr = '' # init -- the characters will be appended.
+ tokenLineNo = 0
+
+ while status != 777:
+
+ # Get the next character. Read next line first, if necessary.
+ if pos < linelen:
+ c = line[pos]
+ else:
+ lineNo += 1
+ line = f.readline()
+ if line.startswith('\xef\xbb\xbf'):
+ line = line[3:] # skip the BOM
+ linelen = len(line)
+ pos = 0
+ if line == '': # eof
+ status = 777
+ else:
+ c = line[pos]
+
+ # Consume the character based on the status
+
+ if status == 0: # basic status
+
+ # This is the initial status. If tokenId is set, yield the
+ # token here and only here (except when eof is found).
+ # Initialize the token variables after the yield.
+ if tokenId:
+ # If it is an unknown item, it can still be recognized
+ # here. Keywords and separators are the example.
+ if tokenId == 'unknown':
+ if tokenDic.has_key(tokenStr):
+ tokenId = tokenDic[tokenStr]
+ elif tokenStr.isdigit():
+ tokenId = 'num'
+ elif rexId.match(tokenStr):
+ tokenId = 'id'
+ else:
+ msg = '\aWarning: unknown token "' + tokenStr + '"'
+ msg += '\tfound on line %d' % tokenLineNo
+ msg += ' in "' + self.fname + '".\n'
+ sys.stderr.write(msg)
+
+ yield (tokenId, tokenStr, tokenLineNo)
+
+ # If it is a comment that contains the self.translateMeText
+ # string, set the flag -- the situation will be reported.
+ if tokenId == 'comment' and tokenStr.find(self.translateMeText) >= 0:
+ self.translateMeFlag = True
+
+ tokenId = None
+ tokenStr = ''
+ tokenLineNo = 0
+
+ # Now process the character. When we just skip it (spaces),
+ # stay in this status. All characters that will be part of
+ # some token cause moving to the specific status. And only
+ # when moving to the status == 0 (or the final state 777),
+ # the token is yielded. With respect to that the automaton
+ # behaves as Moore's one (output bound to status). When
+ # collecting tokens, the automaton is the Mealy's one
+ # (actions bound to transitions).
+ if c.isspace():
+ pass # just skip whitespace characters
+ elif c == '/': # Possibly comment starts here, but
+ tokenId = 'unknown' # it could be only a slash in code.
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 1
+ elif c == '#':
+ tokenId = 'preproc' # preprocessor directive
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 5
+ elif c == '"': # string starts here
+ tokenId = 'string'
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 6
+ elif c == "'": # char literal starts here
+ tokenId = 'charlit'
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 8
+ elif tokenDic.has_key(c): # known one-char token
+ tokenId = tokenDic[c]
+ tokenStr = c
+ tokenLineNo = lineNo
+ # stay in this state to yield token immediately
+ else:
+ tokenId = 'unknown' # totally unknown
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 333
+
+ pos += 1 # move position in any case
+
+ elif status == 1: # possibly a comment
+ if c == '/': # ... definitely the C++ comment
+ tokenId = 'comment'
+ tokenStr += c
+ pos += 1
+ status = 2
+ elif c == '*': # ... definitely the C comment
+ tokenId = 'comment'
+ tokenStr += c
+ pos += 1
+ status = 3
+ else:
+ status = 0 # unrecognized, don't move pos
+
+ elif status == 2: # inside the C++ comment
+ if c == '\n': # the end of C++ comment
+ status = 0 # yield the token
+ else:
+ tokenStr += c # collect the C++ comment
+ pos += 1
+
+ elif status == 3: # inside the C comment
+ if c == '*': # possibly the end of the C comment
+ tokenStr += c
+ status = 4
+ else:
+ tokenStr += c # collect the C comment
+ pos += 1
+
+ elif status == 4: # possibly the end of the C comment
+ if c == '/': # definitely the end of the C comment
+ tokenStr += c
+ status = 0 # yield the token
+ elif c == '*': # more stars inside the comment
+ tokenStr += c
+ else:
+ tokenStr += c # this cannot be the end of comment
+ status = 3
+ pos += 1
+
+ elif status == 5: # inside the preprocessor directive
+ if c == '\n': # the end of the preproc. command
+ status = 0 # yield the token
+ else:
+ tokenStr += c # collect the preproc
+ pos += 1
+
+ elif status == 6: # inside the string
+ if c == '\\': # escaped char inside the string
+ tokenStr += c
+ status = 7
+ elif c == '"': # end of the string
+ tokenStr += c
+ status = 0
+ else:
+ tokenStr += c # collect the chars of the string
+ pos += 1
+
+ elif status == 7: # escaped char inside the string
+ tokenStr += c # collect the char of the string
+ status = 6
+ pos += 1
+
+ elif status == 8: # inside the char literal
+ tokenStr += c # collect the char of the literal
+ status = 9
+ pos += 1
+
+ elif status == 9: # end of char literal expected
+ if c == "'": # ... and found
+ tokenStr += c
+ status = 0
+ pos += 1
+ else:
+ tokenId = 'error' # end of literal was expected
+ tokenStr += c
+ status = 0
+
+ elif status == 333: # start of the unknown token
+ if c.isspace():
+ pos += 1
+ status = 0 # tokenId may be determined later
+ elif tokenDic.has_key(c): # separator, don't move pos
+ status = 0
+ else:
+ tokenStr += c # collect
+ pos += 1
+
+ # We should have finished in the final status. If some token
+ # have been extracted, yield it first.
+ assert(status == 777)
+ if tokenId:
+ yield (tokenId, tokenStr, tokenLineNo)
+ tokenId = None
+ tokenStr = ''
+ tokenLineNo = 0
+
+ # The file content is processed. Close the file. Then always yield
+ # the eof token.
+ f.close()
+ yield ('eof', None, None)
+
+
+ def __collectClassInfo(self, tokenIterator):
+ """Collect the information about the class and base class.
+
+ The tokens including the opening left curly brace of the class are
+ consumed."""
+
+ status = 0 # initial state
+
+ while status != 777: # final state
+
+ # Always assume that the previous tokens were processed. Get
+ # the next one.
+ tokenId, tokenStr, tokenLineNo = tokenIterator.next()
+
+ # Process the token and never return back.
+ if status == 0: # waiting for the 'class' keyword.
+ if tokenId == 'class':
+ status = 1
+
+ elif status == 1: # expecting the class identification
+ if tokenId == 'id':
+ self.classId = tokenStr
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 2: # expecting the curly brace or base class info
+ if tokenId == 'lcurly':
+ status = 777 # correctly finished
+ elif tokenId == 'colon':
+ status = 3
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 3: # expecting the 'public' in front of base class id
+ if tokenId == 'public':
+ status = 4
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 4: # expecting the base class id
+ if tokenId == 'id':
+ self.baseClassId = tokenStr
+ status = 5
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 5: # expecting the curly brace and quitting
+ if tokenId == 'lcurly':
+ status = 777 # correctly finished
+ elif tokenId == 'comment':
+ pass
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ # Extract the status of the TranslatorXxxx class. The readable form
+ # will be used in reports the status form is a string that can be
+ # compared lexically (unified length, padding with zeros, etc.).
+ if self.baseClassId:
+ lst = self.baseClassId.split('_')
+ if lst[0] == 'Translator':
+ self.readableStatus = 'up-to-date'
+ self.status = ''
+ elif lst[0] == 'TranslatorAdapter':
+ self.status = lst[1] + '.' + lst[2]
+ self.readableStatus = self.status
+ if len(lst) > 3: # add the last part of the number
+ self.status += '.' + ('%02d' % int(lst[3]))
+ self.readableStatus += '.' + lst[3]
+ else:
+ self.status += '.00'
+ elif lst[0] == 'TranslatorEnglish':
+ # Obsolete or Based on English.
+ if self.classId[-2:] == 'En':
+ self.readableStatus = 'English based'
+ self.status = 'En'
+ else:
+ self.readableStatus = 'obsolete'
+ self.status = '0.0.00'
+
+ # Check whether status was set, or set 'strange'.
+ if self.status == None:
+ self.status = 'strange'
+ if not self.readableStatus:
+ self.readableStatus = 'strange'
+
+ # Extract the name of the language and the readable form.
+ self.lang = self.classId[10:] # without 'Translator'
+ if self.lang == 'Brazilian':
+ self.langReadable = 'Brazilian Portuguese'
+ elif self.lang == 'Chinesetraditional':
+ self.langReadable = 'Chinese Traditional'
+ else:
+ self.langReadable = self.lang
+
+
+ def __unexpectedToken(self, status, tokenId, tokenLineNo):
+ """Reports unexpected token and quits with exit code 1."""
+
+ import inspect
+ calledFrom = inspect.stack()[1][3]
+ msg = "\a\nUnexpected token '%s' on the line %d in '%s'.\n"
+ msg = msg % (tokenId, tokenLineNo, self.fname)
+ msg += 'status = %d in %s()\n' % (status, calledFrom)
+ sys.stderr.write(msg)
+ sys.exit(1)
+
+
+ def collectPureVirtualPrototypes(self):
+ """Returns dictionary 'unified prototype' -> 'full prototype'.
+
+ The method is expected to be called only for the translator.h. It
+ extracts only the pure virtual method and build the dictionary where
+ key is the unified prototype without argument identifiers."""
+
+ # Prepare empty dictionary that will be returned.
+ resultDic = {}
+
+ # Start the token generator which parses the class source file.
+ tokenIterator = self.__tokenGenerator()
+
+ # Collect the class and the base class identifiers.
+ self.__collectClassInfo(tokenIterator)
+ assert(self.classId == 'Translator')
+
+ # Let's collect readable form of the public virtual pure method
+ # prototypes in the readable form -- as defined in translator.h.
+ # Let's collect also unified form of the same prototype that omits
+ # everything that can be omitted, namely 'virtual' and argument
+ # identifiers.
+ prototype = '' # readable prototype (with everything)
+ uniPrototype = '' # unified prototype (without arg. identifiers)
+
+ # Collect the pure virtual method prototypes. Stop on the closing
+ # curly brace followed by the semicolon (end of class).
+ status = 0
+ curlyCnt = 0 # counter for the level of curly braces
+
+ # Loop until the final state 777 is reached. The errors are processed
+ # immediately. In this implementation, it always quits the application.
+ while status != 777:
+
+ # Get the next token.
+ tokenId, tokenStr, tokenLineNo = tokenIterator.next()
+
+ if status == 0: # waiting for 'public:'
+ if tokenId == 'public':
+ status = 1
+
+ elif status == 1: # colon after the 'public'
+ if tokenId == 'colon':
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 2: # waiting for 'virtual'
+ if tokenId == 'virtual':
+ prototype = tokenStr # but not to unified prototype
+ status = 3
+ elif tokenId == 'comment':
+ pass
+ elif tokenId == 'rcurly':
+ status = 11 # expected end of class
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 3: # return type of the method expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype = tokenStr # start collecting the unified prototype
+ status = 4
+ elif tokenId == 'tilde':
+ status = 4
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 4: # method identifier expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 5
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 5: # left bracket of the argument list expected
+ if tokenId == 'lpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 6
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 6: # collecting arguments of the method
+ if tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ elif tokenId == 'const':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 12
+ elif tokenId == 'id': # type identifier
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 7: # assignment expected or left curly brace
+ if tokenId == 'assign':
+ status = 8
+ elif tokenId == 'lcurly':
+ curlyCnt = 1 # method body entered
+ status = 10
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 8: # zero expected
+ if tokenId == 'num' and tokenStr == '0':
+ status = 9
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 9: # after semicolon, produce the dic item
+ if tokenId == 'semic':
+ assert(not resultDic.has_key(uniPrototype))
+ resultDic[uniPrototype] = prototype
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 10: # consuming the body of the method
+ if tokenId == 'rcurly':
+ curlyCnt -= 1
+ if curlyCnt == 0:
+ status = 2 # body consumed
+ elif tokenId == 'lcurly':
+ curlyCnt += 1
+
+ elif status == 11: # probably the end of class
+ if tokenId == 'semic':
+ status = 777
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 12: # type id for argument expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 13: # namespace qualification or * or & expected
+ if tokenId == 'colon': # was namespace id
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 14
+ elif tokenId == 'star' or tokenId == 'amp': # pointer or reference
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 16
+ elif tokenId == 'id': # argument identifier
+ prototype += ' ' + tokenStr
+ # don't put this into unified prototype
+ status = 17
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 14: # second colon for namespace:: expected
+ if tokenId == 'colon':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 15
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 15: # type after namespace:: expected
+ if tokenId == 'id':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 16: # argument identifier expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ # don't put this into unified prototype
+ status = 17
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 17: # comma or ')' after argument identifier expected
+ if tokenId == 'comma':
+ prototype += ', '
+ uniPrototype += ', '
+ status = 6
+ elif tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ # Eat the rest of the source to cause closing the file.
+ while tokenId != 'eof':
+ tokenId, tokenStr, tokenLineNo = tokenIterator.next()
+
+ # Return the resulting dictionary with 'uniPrototype -> prototype'.
+ return resultDic
+
+
+ def __collectPublicMethodPrototypes(self, tokenIterator):
+ """Collects prototypes of public methods and fills self.prototypeDic.
+
+ The dictionary is filled by items: uniPrototype -> prototype.
+ The method is expected to be called only for TranslatorXxxx classes,
+ i.e. for the classes that implement translation to some language.
+ It assumes that the openning curly brace of the class was already
+ consumed. The source is consumed until the end of the class.
+ The caller should consume the source until the eof to cause closing
+ the source file."""
+
+ assert(self.classId != 'Translator')
+ assert(self.baseClassId != None)
+
+ # The following finite automaton slightly differs from the one
+ # inside self.collectPureVirtualPrototypes(). It produces the
+ # dictionary item just after consuming the body of the method
+ # (transition from from state 10 to state 2). It also does not allow
+ # definitions of public pure virtual methods, except for
+ # TranslatorAdapterBase (states 8 and 9). Argument identifier inside
+ # method argument lists can be omitted or commented.
+ #
+ # Let's collect readable form of all public method prototypes in
+ # the readable form -- as defined in the source file.
+ # Let's collect also unified form of the same prototype that omits
+ # everything that can be omitted, namely 'virtual' and argument
+ # identifiers.
+ prototype = '' # readable prototype (with everything)
+ uniPrototype = '' # unified prototype (without arg. identifiers)
+ warning = '' # warning message -- if something special detected
+ methodId = None # processed method id
+
+ # Collect the method prototypes. Stop on the closing
+ # curly brace followed by the semicolon (end of class).
+ status = 0
+ curlyCnt = 0 # counter for the level of curly braces
+
+ # Loop until the final state 777 is reached. The errors are processed
+ # immediately. In this implementation, it always quits the application.
+ while status != 777:
+
+ # Get the next token.
+ tokenId, tokenStr, tokenLineNo = tokenIterator.next()
+
+ if status == 0: # waiting for 'public:'
+ if tokenId == 'public':
+ status = 1
+ elif tokenId == 'eof': # non-public things until the eof
+ status = 777
+
+ elif status == 1: # colon after the 'public'
+ if tokenId == 'colon':
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 2: # waiting for 'virtual' (can be omitted)
+ if tokenId == 'virtual':
+ prototype = tokenStr # but not to unified prototype
+ status = 3
+ elif tokenId == 'id': # 'virtual' was omitted
+ prototype = tokenStr
+ uniPrototype = tokenStr # start collecting the unified prototype
+ status = 4
+ elif tokenId == 'comment':
+ pass
+ elif tokenId == 'protected' or tokenId == 'private':
+ status = 0
+ elif tokenId == 'rcurly':
+ status = 11 # expected end of class
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 3: # return type of the method expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype = tokenStr # start collecting the unified prototype
+ status = 4
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 4: # method identifier expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ methodId = tokenStr # for reporting
+ status = 5
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 5: # left bracket of the argument list expected
+ if tokenId == 'lpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 6
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 6: # collecting arguments of the method
+ if tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ elif tokenId == 'const':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 12
+ elif tokenId == 'id': # type identifier
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 7: # left curly brace expected
+ if tokenId == 'lcurly':
+ curlyCnt = 1 # method body entered
+ status = 10
+ elif tokenId == 'comment':
+ pass
+ elif tokenId == 'assign': # allowed only for TranslatorAdapterBase
+ assert(self.classId == 'TranslatorAdapterBase')
+ status = 8
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 8: # zero expected (TranslatorAdapterBase)
+ assert(self.classId == 'TranslatorAdapterBase')
+ if tokenId == 'num' and tokenStr == '0':
+ status = 9
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 9: # after semicolon (TranslatorAdapterBase)
+ assert(self.classId == 'TranslatorAdapterBase')
+ if tokenId == 'semic':
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 10: # consuming the body of the method, then dic item
+ if tokenId == 'rcurly':
+ curlyCnt -= 1
+ if curlyCnt == 0:
+ # Insert new dictionary item.
+ assert(not self.prototypeDic.has_key(uniPrototype))
+ self.prototypeDic[uniPrototype] = prototype
+ status = 2 # body consumed
+ methodId = None # outside of any method
+ elif tokenId == 'lcurly':
+ curlyCnt += 1
+
+ # Warn in special case.
+ elif methodId == 'trLegendDocs' and tokenId == 'string' \
+ and tokenStr.find('MAX_DOT_GRAPH_HEIGHT') >= 0:
+ self.txtMAX_DOT_GRAPH_HEIGHT_flag = True
+
+
+ elif status == 11: # probably the end of class
+ if tokenId == 'semic':
+ status = 777
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 12: # type id for argument expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 13: # :: or * or & or id or ) expected
+ if tokenId == 'colon': # was namespace id
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 14
+ elif tokenId == 'star' or tokenId == 'amp': # pointer or reference
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 16
+ elif tokenId == 'id': # argument identifier
+ prototype += ' ' + tokenStr
+ # don't put this into unified prototype
+ status = 17
+ elif tokenId == 'comment': # probably commented-out identifier
+ prototype += tokenStr
+ elif tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ elif tokenId == 'comma':
+ prototype += ', '
+ uniPrototype += ', '
+ status = 6
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 14: # second colon for namespace:: expected
+ if tokenId == 'colon':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 15
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 15: # type after namespace:: expected
+ if tokenId == 'id':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 16: # argument identifier or ) expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ # don't put this into unified prototype
+ status = 17
+ elif tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ elif tokenId == 'comment':
+ prototype += tokenStr
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 17: # comma or ')' after argument identifier expected
+ if tokenId == 'comma':
+ prototype += ', '
+ uniPrototype += ', '
+ status = 6
+ elif tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+
+
+ def collectAdapterPrototypes(self):
+ """Returns the dictionary of prototypes implemented by adapters.
+
+ It is created to process the translator_adapter.h. The returned
+ dictionary has the form: unifiedPrototype -> (version, classId)
+ thus by looking for the prototype, we get the information what is
+ the newest (least adapting) adapter that is sufficient for
+ implementing the method."""
+
+ # Start the token generator which parses the class source file.
+ assert(os.path.split(self.fname)[1] == 'translator_adapter.h')
+ tokenIterator = self.__tokenGenerator()
+
+ # Get the references to the involved dictionaries.
+ reqDic = self.manager.requiredMethodsDic
+
+ # Create the empty dictionary that will be returned.
+ adaptDic = {}
+
+
+ # Loop through the source of the adapter file until no other adapter
+ # class is found.
+ while True:
+ try:
+ # Collect the class and the base class identifiers.
+ self.__collectClassInfo(tokenIterator)
+
+ # Extract the comparable version of the adapter class.
+ # Note: The self.status as set by self.__collectClassInfo()
+ # contains similar version, but is related to the base class,
+ # not to the class itself.
+ lst = self.classId.split('_')
+ version = ''
+ if lst[0] == 'TranslatorAdapter': # TranslatorAdapterBase otherwise
+ version = lst[1] + '.' + lst[2]
+ if len(lst) > 3: # add the last part of the number
+ version += '.' + ('%02d' % int(lst[3]))
+ else:
+ version += '.00'
+
+ # Collect the prototypes of implemented public methods.
+ self.__collectPublicMethodPrototypes(tokenIterator)
+
+ # For the required methods, update the dictionary of methods
+ # implemented by the adapter.
+ for protoUni in self.prototypeDic:
+ if reqDic.has_key(protoUni):
+ # This required method will be marked as implemented
+ # by this adapter class. This implementation assumes
+ # that newer adapters do not reimplement any required
+ # methods already implemented by older adapters.
+ assert(not adaptDic.has_key(protoUni))
+ adaptDic[protoUni] = (version, self.classId)
+
+ # Clear the dictionary object and the information related
+ # to the class as the next adapter class is to be processed.
+ self.prototypeDic.clear()
+ self.classId = None
+ self.baseClassId = None
+
+ except StopIteration:
+ break
+
+ # Return the result dictionary.
+ return adaptDic
+
+
+ def processing(self):
+ """Processing of the source file -- only for TranslatorXxxx classes."""
+
+ # Start the token generator which parses the class source file.
+ tokenIterator = self.__tokenGenerator()
+
+ # Collect the class and the base class identifiers.
+ self.__collectClassInfo(tokenIterator)
+ assert(self.classId != 'Translator')
+ assert(self.classId[:17] != 'TranslatorAdapter')
+
+ # Collect the prototypes of implemented public methods.
+ self.__collectPublicMethodPrototypes(tokenIterator)
+
+ # Eat the rest of the source to cause closing the file.
+ while True:
+ try:
+ t = tokenIterator.next()
+ except StopIteration:
+ break
+
+ # Shorthands for the used dictionaries.
+ reqDic = self.manager.requiredMethodsDic
+ adaptDic = self.manager.adaptMethodsDic
+ myDic = self.prototypeDic
+
+ # Build the list of obsolete methods.
+ self.obsoleteMethods = []
+ for p in myDic:
+ if not reqDic.has_key(p):
+ self.obsoleteMethods.append(p)
+
+ # Build the list of missing methods and the list of implemented
+ # required methods.
+ self.missingMethods = []
+ self.implementedMethods = []
+ for p in reqDic:
+ if myDic.has_key(p):
+ self.implementedMethods.append(p)
+ else:
+ self.missingMethods.append(p)
+
+ # Set the least important note first if the translator is decoded.
+ # If yes, then it means that the implementation should be switched
+ # to UTF-8 later (suggestion).
+ self.isDecodedTranslator = self.classId in self.manager.decodedTranslators
+ if self.isDecodedTranslator:
+ self.note = 'Reimplementation using UTF-8 suggested.'
+
+ # Check whether adapter must be used or suggest the newest one.
+ # Change the status and set the note accordingly.
+ if self.baseClassId != 'Translator':
+ if not self.missingMethods:
+ self.note = 'Change the base class to Translator.'
+ self.status = ''
+ self.readableStatus = 'up-to-date'
+ elif self.baseClassId != 'TranslatorEnglish':
+ # The translator uses some of the adapters.
+ # Look at the missing methods and check what adapter
+ # implements them. Remember the one with the lowest version.
+ adaptMinVersion = '9.9.99'
+ adaptMinClass = 'TranslatorAdapter_9_9_99'
+ for uniProto in self.missingMethods:
+ if adaptDic.has_key(uniProto):
+ version, cls = adaptDic[uniProto]
+ if version < adaptMinVersion:
+ adaptMinVersion = version
+ adaptMinClass = cls
+
+ # Test against the current status -- preserve the self.status.
+ # Possibly, the translator implements enough methods to
+ # use some newer adapter.
+ status = self.status
+
+ # If the version of the used adapter is smaller than
+ # the required, set the note and update the status as if
+ # the newer adapter was used.
+ if adaptMinVersion > status:
+ self.note = 'Change the base class to %s.' % adaptMinClass
+ self.status = adaptMinVersion
+ self.adaptMinClass = adaptMinClass
+ self.readableStatus = adaptMinVersion # simplified
+
+ # If everything seems OK, some explicit warning flags still could
+ # be set.
+ if not self.note and self.status == '' and \
+ (self.translateMeFlag or self.txtMAX_DOT_GRAPH_HEIGHT_flag):
+ self.note = ''
+ if self.translateMeFlag:
+ self.note += 'The "%s" found in a comment.' % self.translateMeText
+ if self.note != '':
+ self.note += '\n\t\t'
+ if self.txtMAX_DOT_GRAPH_HEIGHT_flag:
+ self.note += 'The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()'
+
+ # If everything seems OK, but there are obsolete methods, set
+ # the note to clean-up source. This note will be used only when
+ # the previous code did not set another note (priority).
+ if not self.note and self.status == '' and self.obsoleteMethods:
+ self.note = 'Remove the obsolete methods (never used).'
+
+
+ def report(self, fout):
+ """Returns the report part for the source as a multiline string.
+
+ No output for up-to-date translators without problem."""
+
+ # If there is nothing to report, return immediately.
+ if self.status == '' and not self.note:
+ return
+
+ # Report the number of not implemented methods.
+ fout.write('\n\n\n')
+ fout.write(self.classId + ' (' + self.baseClassId + ')')
+ percentImplemented = 100 # init
+ allNum = len(self.manager.requiredMethodsDic)
+ if self.missingMethods:
+ num = len(self.missingMethods)
+ percentImplemented = 100 * (allNum - num) / allNum
+ fout.write(' %d' % num)
+ fout.write(' method')
+ if num > 1:
+ fout.write('s')
+ fout.write(' to implement (%d %%)' % (100 * num / allNum))
+ fout.write('\n' + '-' * len(self.classId))
+
+ # Write the info about the implemented required methods.
+ fout.write('\n\n Implements %d' % len(self.implementedMethods))
+ fout.write(' of the required methods (%d %%).' % percentImplemented)
+
+ # Report the missing method, but only when it is not English-based
+ # translator.
+ if self.missingMethods and self.status != 'En':
+ fout.write('\n\n Missing methods (should be implemented):\n')
+ reqDic = self.manager.requiredMethodsDic
+ for p in self.missingMethods:
+ fout.write('\n ' + reqDic[p])
+
+ # Always report obsolete methods.
+ if self.obsoleteMethods:
+ fout.write('\n\n Obsolete methods (should be removed, never used):\n')
+ myDic = self.prototypeDic
+ for p in self.obsoleteMethods:
+ fout.write('\n ' + myDic[p])
+
+ # For English-based translator, report the implemented methods.
+ if self.status == 'En' and self.implementedMethods:
+ fout.write('\n\n This English-based translator implements ')
+ fout.write('the following methods:\n')
+ reqDic = self.manager.requiredMethodsDic
+ for p in self.implementedMethods:
+ fout.write('\n ' + reqDic[p])
+
+
+ def getmtime(self):
+ """Returns the last modification time of the source file."""
+ assert(os.path.isfile(self.fname))
+ return os.path.getmtime(self.fname)
+
+
+class TrManager:
+ """Collects basic info and builds subordinate Transl objects."""
+
+ def __init__(self):
+ """Determines paths, creates and initializes structures.
+
+ The arguments of the script may explicitly say what languages should
+ be processed. Write the two letter identifications that are used
+ for composing the source filenames, so...
+
+ python translator.py cz
+
+ this will process only translator_cz.h source.
+ """
+
+ # Determine the path to the script and its name.
+ self.script = os.path.abspath(sys.argv[0])
+ self.script_path, self.script_name = os.path.split(self.script)
+ self.script_path = os.path.abspath(self.script_path)
+
+ # Determine the absolute path to the Doxygen's root subdirectory.
+ # If DOXYGEN environment variable is not found, the directory is
+ # determined from the path of the script.
+ doxy_default = os.path.join(self.script_path, '..')
+ self.doxy_path = os.path.abspath(os.getenv('DOXYGEN', doxy_default))
+
+ # Get the explicit arguments of the script.
+ self.script_argLst = sys.argv[1:]
+
+ # Build the path names based on the Doxygen's root knowledge.
+ self.doc_path = os.path.join(self.doxy_path, 'doc')
+ self.src_path = os.path.join(self.doxy_path, 'src')
+
+ # Create the empty dictionary for Transl object identitied by the
+ # class identifier of the translator.
+ self.__translDic = {}
+
+ # Create the None dictionary of required methods. The key is the
+ # unified prototype, the value is the full prototype. Set inside
+ # the self.__build().
+ self.requiredMethodsDic = None
+
+ # Create the empty dictionary that says what method is implemented
+ # by what adapter.
+ self.adaptMethodsDic = {}
+
+ # The last modification time will capture the modification of this
+ # script, of the translator.h, of the translator_adapter.h (see the
+ # self.__build() for the last two) of all the translator_xx.h files
+ # and of the template for generating the documentation. So, this
+ # time can be compared with modification time of the generated
+ # documentation to decide, whether the doc should be re-generated.
+ self.lastModificationTime = os.path.getmtime(self.script)
+
+ # Set the names of the translator report text file, of the template
+ # for generating "Internationalization" document, for the generated
+ # file itself, and for the maintainers list.
+ self.translatorReportFileName = 'translator_report.txt'
+ self.maintainersFileName = 'maintainers.txt'
+ self.languageTplFileName = 'language.tpl'
+ self.languageDocFileName = 'language.doc'
+
+ # The information about the maintainers will be stored
+ # in the dictionary with the following name.
+ self.__maintainersDic = None
+
+ # Define the other used structures and variables for information.
+ self.langLst = None # including English based
+ self.supportedLangReadableStr = None # coupled En-based as a note
+ self.numLang = None # excluding coupled En-based
+ self.doxVersion = None # Doxygen version
+
+ # Capture the knowledge about translators that are not implemented
+ # to use UTF-8 internally.
+ self.decodedTranslators = self.getDecodedTranslators()
+
+ # Build objects where each one is responsible for one translator.
+ self.__build()
+
+
+ def getDecodedTranslators(self):
+ """Parses language.cpp to find what translators do not use UTF-8 yet"""
+ decodedTranslators = []
+
+ # Regular expression to detect the lines like
+ # theTranslator=new TranslatorDecoder(new TranslatorSwedish);
+ rex = re.compile(r'^\s*theTranslator\s*=\s*new\s+.*$')
+
+ # Regular expression to get the (optional) TranslatorDecoder and TranslatorXXX
+ rex2 = re.compile(r'\bTranslator\w+')
+
+ # Parse the lines in the specific source code.
+ f = open(os.path.join(self.src_path, 'language.cpp'), 'rU')
+ for line in f:
+ if rex.match(line):
+ lst = rex2.findall(line)
+ if lst[0] == 'TranslatorDecoder':
+ decodedTranslators.append(lst[1])
+ f.close()
+
+ # Display warning when all translator implementations were converted
+ # to UTF-8.
+ if len(decodedTranslators) == 0:
+ print 'This script should be updated. All translators do use UTF-8'
+ print 'internally. The TranslatorDecoder adapter should be removed'
+ print 'from the code and its usage should not be checked any more.'
+
+ return decodedTranslators
+
+
+ def __build(self):
+ """Find the translator files and build the objects for translators."""
+
+ # The translator.h must exist (the Transl object will check it),
+ # create the object for it and let it build the dictionary of
+ # required methods.
+ tr = Transl(os.path.join(self.src_path, 'translator.h'), self)
+ self.requiredMethodsDic = tr.collectPureVirtualPrototypes()
+ tim = tr.getmtime()
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+ # The translator_adapter.h must exist (the Transl object will check it),
+ # create the object for it and store the reference in the dictionary.
+ tr = Transl(os.path.join(self.src_path, 'translator_adapter.h'), self)
+ self.adaptMethodsDic = tr.collectAdapterPrototypes()
+ tim = tr.getmtime()
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+ # Create the list of the filenames with language translator sources.
+ # If the explicit arguments of the script were typed, process only
+ # those files.
+ if self.script_argLst:
+ lst = ['translator_' + x + '.h' for x in self.script_argLst]
+ for fname in lst:
+ if not os.path.isfile(os.path.join(self.src_path, fname)):
+ sys.stderr.write("\a\nFile '%s' not found!\n" % fname)
+ sys.exit(1)
+ else:
+ lst = os.listdir(self.src_path)
+ lst = filter(lambda x: x[:11] == 'translator_'
+ and x[-2:] == '.h'
+ and x != 'translator_adapter.h', lst)
+
+ # Build the object for the translator_xx.h files, and process the
+ # content of the file. Then insert the object to the dictionary
+ # accessed via classId.
+ for fname in lst:
+ fullname = os.path.join(self.src_path, fname)
+ tr = Transl(fullname, self)
+ tr.processing()
+ assert(tr.classId != 'Translator')
+ self.__translDic[tr.classId] = tr
+
+ # Extract the global information of the processed info.
+ self.__extractProcessedInfo()
+
+
+ def __extractProcessedInfo(self):
+ """Build lists and strings of the processed info."""
+
+ # Build the auxiliary list with strings compound of the status,
+ # readable form of the language, and classId.
+ statLst = []
+ for obj in self.__translDic.values():
+ assert(obj.classId != 'Translator')
+ s = obj.status + '|' + obj.langReadable + '|' + obj.classId
+ statLst.append(s)
+
+ # Sort the list and extract the object identifiers (classId's) for
+ # the up-to-date translators and English-based translators.
+ statLst.sort()
+ self.upToDateIdLst = [x.split('|')[2] for x in statLst if x[0] == '|']
+ self.EnBasedIdLst = [x.split('|')[2] for x in statLst if x[:2] == 'En']
+
+ # Reverse the list and extract the TranslatorAdapter based translators.
+ statLst.reverse()
+ self.adaptIdLst = [x.split('|')[2] for x in statLst if x[0].isdigit()]
+
+ # Build the list of tuples that contain (langReadable, obj).
+ # Sort it by readable name.
+ self.langLst = []
+ for obj in self.__translDic.values():
+ self.langLst.append((obj.langReadable, obj))
+ self.langLst.sort(lambda a, b: cmp(a[0], b[0]))
+
+ # Create the list with readable language names. If the language has
+ # also the English-based version, modify the item by appending
+ # the note. Number of the supported languages is equal to the length
+ # of the list.
+ langReadableLst = []
+ for name, obj in self.langLst:
+ if obj.status == 'En': continue
+
+ # Append the 'En' to the classId to possibly obtain the classId
+ # of the English-based object. If the object exists, modify the
+ # name for the readable list of supported languages.
+ classIdEn = obj.classId + 'En'
+ if self.__translDic.has_key(classIdEn):
+ name += ' (+En)'
+
+ # Append the result name of the language, possibly with note.
+ langReadableLst.append(name)
+
+ # Create the multiline string of readable language names,
+ # with punctuation, wrapped to paragraph.
+ if len(langReadableLst) == 1:
+ s = langReadableLst[0]
+ elif len(langReadableLst) == 2:
+ s = ' and '.join(langReadableLst)
+ else:
+ s = ', '.join(langReadableLst[:-1]) + ', and '
+ s += langReadableLst[-1]
+
+ self.supportedLangReadableStr = fill(s + '.')
+
+ # Find the number of the supported languages. The English based
+ # languages are not counted if the non-English based also exists.
+ self.numLang = len(self.langLst)
+ for name, obj in self.langLst:
+ if obj.status == 'En':
+ classId = obj.classId[:-2]
+ if self.__translDic.has_key(classId):
+ self.numLang -= 1 # the couple will be counted as one
+
+ # Extract the version of Doxygen.
+ f = open(os.path.join(self.doxy_path, 'VERSION'))
+ self.doxVersion = f.readline().strip()
+ f.close()
+
+ # Update the last modification time.
+ for tr in self.__translDic.values():
+ tim = tr.getmtime()
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+
+ def __getNoTrSourceFilesLst(self):
+ """Returns the list of sources to be checked.
+
+ All .cpp files and also .h files that do not declare or define
+ the translator methods are included in the list. The file names
+ are searched in doxygen/src directory.
+ """
+ files = []
+ for item in os.listdir(self.src_path):
+ # Split the bare name to get the extension.
+ name, ext = os.path.splitext(item)
+ ext = ext.lower()
+
+ # Include only .cpp and .h files (case independent) and exclude
+ # the files where the checked identifiers are defined.
+ if ext == '.cpp' or (ext == '.h' and name.find('translator') == -1):
+ fname = os.path.join(self.src_path, item)
+ assert os.path.isfile(fname) # assumes no directory with the ext
+ files.append(fname) # full name
+ return files
+
+
+ def __removeUsedInFiles(self, fname, dic):
+ """Removes items for method identifiers that are found in fname.
+
+ The method reads the content of the file as one string and searches
+ for all identifiers from dic. The identifiers that were found in
+ the file are removed from the dictionary.
+
+ Note: If more files is to be checked, the files where most items are
+ probably used should be checked first and the resulting reduced
+ dictionary should be used for checking the next files (speed up).
+ """
+ lst_in = dic.keys() # identifiers to be searched for
+
+ # Read content of the file as one string.
+ assert os.path.isfile(fname)
+ f = open(fname)
+ cont = f.read()
+ f.close()
+
+ # Remove the items for identifiers that were found in the file.
+ while lst_in:
+ item = lst_in.pop(0)
+ if cont.find(item) != -1:
+ del dic[item]
+
+
+ def __checkForNotUsedTrMethods(self):
+ """Returns the dictionary of not used translator methods.
+
+ The method can be called only after self.requiredMethodsDic has been
+ built. The stripped prototypes are the values, the method identifiers
+ are the keys.
+ """
+ # Build the dictionary of the required method prototypes with
+ # method identifiers used as keys.
+ trdic = {}
+ for prototype in self.requiredMethodsDic.keys():
+ ri = prototype.split('(')[0]
+ identifier = ri.split()[1].strip()
+ trdic[identifier] = prototype
+
+ # Build the list of source files where translator method identifiers
+ # can be used.
+ files = self.__getNoTrSourceFilesLst()
+
+ # Loop through the files and reduce the dictionary of id -> proto.
+ for fname in files:
+ self.__removeUsedInFiles(fname, trdic)
+
+ # Return the dictionary of not used translator methods.
+ return trdic
+
+
+ def __emails(self, classId):
+ """Returns the list of maintainer emails.
+
+ The method returns the list of e-mail adresses for the translator
+ class, but only the addresses that were not marked as [xxx]."""
+ lst = []
+ for m in self.__maintainersDic[classId]:
+ if not m[1].startswith('['):
+ email = m[1]
+ email = email.replace(' at ', '@') # Unmangle the mangled e-mail
+ email = email.replace(' dot ', '.')
+ lst.append(email)
+ return lst
+
+
+ def generateTranslatorReport(self):
+ """Generates the translator report."""
+
+ output = os.path.join(self.doc_path, self.translatorReportFileName)
+
+ # Open the textual report file for the output.
+ f = open(output, 'w')
+
+ # Output the information about the version.
+ f.write('(' + self.doxVersion + ')\n\n')
+
+ # Output the information about the number of the supported languages
+ # and the list of the languages, or only the note about the explicitly
+ # given languages to process.
+ if self.script_argLst:
+ f.write('The report was generated for the following, explicitly')
+ f.write(' identified languages:\n\n')
+ f.write(self.supportedLangReadableStr + '\n\n')
+ else:
+ f.write('Doxygen supports the following ')
+ f.write(str(self.numLang))
+ f.write(' languages (sorted alphabetically):\n\n')
+ f.write(self.supportedLangReadableStr + '\n\n')
+
+ # Write the summary about the status of language translators (how
+ # many translators) are up-to-date, etc.
+ s = 'Of them, %d translators are up-to-date, ' % len(self.upToDateIdLst)
+ s += '%d translators are based on some adapter class, ' % len(self.adaptIdLst)
+ s += 'and %d are English based.' % len(self.EnBasedIdLst)
+ f.write(fill(s) + '\n\n')
+
+ # The e-mail addresses of the maintainers will be collected to
+ # the auxiliary file in the order of translator classes listed
+ # in the translator report.
+ fmail = open('mailto.txt', 'w')
+
+ # Write the list of up-to-date translator classes.
+ if self.upToDateIdLst:
+ s = '''The following translator classes are up-to-date (sorted
+ alphabetically). This means that they derive from the
+ Translator class and they implement all %d of the required
+ methods. Anyway, there still may be some details listed even
+ for them:'''
+ s = s % len(self.requiredMethodsDic)
+ f.write('-' * 70 + '\n')
+ f.write(fill(s) + '\n\n')
+
+ mailtoLst = []
+ for x in self.upToDateIdLst:
+ obj = self.__translDic[x]
+ f.write(' ' + obj.classId)
+ if obj.note:
+ f.write(' -- ' + obj.note)
+ f.write('\n')
+ mailtoLst.extend(self.__emails(obj.classId))
+
+ fmail.write('up-to-date\n')
+ fmail.write('; '.join(mailtoLst))
+
+ # Write the list of the adapter based classes. The very obsolete
+ # translators that derive from TranslatorEnglish are included.
+ if self.adaptIdLst:
+ s = '''The following translator classes need some maintenance
+ (the most obsolete at the end). The other info shows the
+ estimation of Doxygen version when the class was last
+ updated and number of methods that must be implemented to
+ become up-to-date:'''
+ f.write('\n' + '-' * 70 + '\n')
+ f.write(fill(s) + '\n\n')
+
+ # Find also whether some adapter classes may be removed.
+ adaptMinVersion = '9.9.99'
+
+ mailtoLst = []
+ numRequired = len(self.requiredMethodsDic)
+ for x in self.adaptIdLst:
+ obj = self.__translDic[x]
+ f.write(' %-30s' % obj.classId)
+ f.write(' %-6s' % obj.readableStatus)
+ numimpl = len(obj.missingMethods)
+ pluralS = ''
+ if numimpl > 1: pluralS = 's'
+ percent = 100 * numimpl / numRequired
+ f.write('\t%2d method%s to implement (%d %%)' % (
+ numimpl, pluralS, percent))
+ if obj.note:
+ f.write('\n\tNote: ' + obj.note + '\n')
+ f.write('\n')
+ mailtoLst.extend(self.__emails(obj.classId)) # to maintainer
+
+ # Check the level of required adapter classes.
+ if obj.status != '0.0.00' and obj.status < adaptMinVersion:
+ adaptMinVersion = obj.status
+
+ fmail.write('\n\ntranslator based\n')
+ fmail.write('; '.join(mailtoLst))
+
+ # Set the note if some old translator adapters are not needed
+ # any more. Do it only when the script is called without arguments,
+ # i.e. all languages were checked against the needed translator
+ # adapters.
+ if not self.script_argLst:
+ to_remove = {}
+ for version, adaptClassId in self.adaptMethodsDic.values():
+ if version < adaptMinVersion:
+ to_remove[adaptClassId] = True
+
+ if to_remove:
+ lst = to_remove.keys()
+ lst.sort()
+ plural = len(lst) > 1
+ note = 'Note: The adapter class'
+ if plural: note += 'es'
+ note += ' ' + ', '.join(lst)
+ if not plural:
+ note += ' is'
+ else:
+ note += ' are'
+ note += ' not used and can be removed.'
+ f.write('\n' + fill(note) + '\n')
+
+ # Write the list of the English-based classes.
+ if self.EnBasedIdLst:
+ s = '''The following translator classes derive directly from the
+ TranslatorEnglish. The class identifier has the suffix 'En'
+ that says that this is intentional. Usually, there is also
+ a non-English based version of the translator for
+ the language:'''
+ f.write('\n' + '-' * 70 + '\n')
+ f.write(fill(s) + '\n\n')
+
+ for x in self.EnBasedIdLst:
+ obj = self.__translDic[x]
+ f.write(' ' + obj.classId)
+ f.write('\timplements %d methods' % len(obj.implementedMethods))
+ if obj.note:
+ f.write(' -- ' + obj.note)
+ f.write('\n')
+
+ # Check for not used translator methods and generate warning if found.
+ # The check is rather time consuming, so it is not done when report
+ # is restricted to explicitly given language identifiers.
+ if not self.script_argLst:
+ dic = self.__checkForNotUsedTrMethods()
+ if dic:
+ s = '''WARNING: The following translator methods are declared
+ in the Translator class but their identifiers do not appear
+ in source files. The situation should be checked. The .cpp
+ files and .h files excluding the '*translator*' files
+ in doxygen/src directory were simply searched for occurence
+ of the method identifiers:'''
+ f.write('\n' + '=' * 70 + '\n')
+ f.write(fill(s) + '\n\n')
+
+ keys = dic.keys()
+ keys.sort()
+ for key in keys:
+ f.write(' ' + dic[key] + '\n')
+ f.write('\n')
+
+ # Write the details for the translators.
+ f.write('\n' + '=' * 70)
+ f.write('\nDetails for translators (classes sorted alphabetically):\n')
+
+ cls = self.__translDic.keys()
+ cls.sort()
+
+ for c in cls:
+ obj = self.__translDic[c]
+ assert(obj.classId != 'Translator')
+ obj.report(f)
+
+ # Close the report file and the auxiliary file with e-mails.
+ f.close()
+ fmail.close()
+
+
+ def __loadMaintainers(self):
+ """Load and process the file with the maintainers.
+
+ Fills the dictionary classId -> [(name, e-mail), ...]."""
+
+ fname = os.path.join(self.doc_path, self.maintainersFileName)
+
+ # Include the maintainers file to the group of files checked with
+ # respect to the modification time.
+ tim = os.path.getmtime(fname)
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+ # Process the content of the maintainers file.
+ f = codecs.open(fname, 'r', 'utf-8')
+ inside = False # inside the record for the language
+ lineReady = True
+ classId = None
+ maintainersLst = None
+ self.__maintainersDic = {}
+ while lineReady:
+ line = f.readline() # next line
+ lineReady = line != '' # when eof, then line == ''
+
+ line = line.strip() # eof should also behave as separator
+ if line != u'' and line[0] == u'%': # skip the comment line
+ continue
+
+ if not inside: # if outside of the record
+ if line != u'': # should be language identifier
+ classId = line
+ maintainersLst = []
+ inside = True
+ # Otherwise skip empty line that do not act as separator.
+
+ else: # if inside the record
+ if line == u'': # separator found
+ inside = False
+ else:
+ # If it is the first maintainer, create the empty list.
+ if not self.__maintainersDic.has_key(classId):
+ self.__maintainersDic[classId] = []
+
+ # Split the information about the maintainer and append
+ # the tuple. The address may be prefixed '[unreachable]'
+ # or whatever '[xxx]'. This will be processed later.
+ lst = line.split(u':', 1)
+ assert(len(lst) == 2)
+ t = (lst[0].strip(), lst[1].strip())
+ self.__maintainersDic[classId].append(t)
+ f.close()
+
+
+ def generateLanguageDoc(self):
+ """Checks the modtime of files and generates language.doc."""
+ self.__loadMaintainers()
+
+ # Check the last modification time of the template file. It is the
+ # last file from the group that decide whether the documentation
+ # should or should not be generated.
+ fTplName = os.path.join(self.doc_path, self.languageTplFileName)
+ tim = os.path.getmtime(fTplName)
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+ # If the generated documentation exists and is newer than any of
+ # the source files from the group, do not generate it and quit
+ # quietly.
+ fDocName = os.path.join(self.doc_path, self.languageDocFileName)
+ if os.path.isfile(fDocName):
+ if os.path.getmtime(fDocName) > self.lastModificationTime:
+ return
+
+ # The document or does not exist or is older than some of the
+ # sources. It must be generated again.
+ #
+ # Read the template of the documentation, and remove the first
+ # attention lines.
+ f = codecs.open(fTplName, 'r', 'utf-8')
+ doctpl = f.read()
+ f.close()
+
+ pos = doctpl.find(u'/***')
+ assert pos != -1
+ doctpl = doctpl[pos:]
+
+ # Fill the tplDic by symbols that will be inserted into the
+ # document template.
+ tplDic = {}
+
+ s = u'Do not edit this file. It was generated by the %s script.' % self.script_name
+ tplDic['editnote'] = s
+
+ tplDic['doxVersion'] = self.doxVersion
+ tplDic['supportedLangReadableStr'] = self.supportedLangReadableStr
+ tplDic['translatorReportFileName'] = self.translatorReportFileName
+
+ ahref = u'<a href="../doc/' + self.translatorReportFileName
+ ahref += u'"\n><code>doxygen/doc/' + self.translatorReportFileName
+ ahref += u'</code></a>'
+ tplDic['translatorReportLink'] = ahref
+ tplDic['numLangStr'] = str(self.numLang)
+
+ # Define templates for HTML table parts of the documentation.
+ htmlTableTpl = u'''\
+ \\htmlonly
+ <table align="center" cellspacing="0" cellpadding="0" border="0">
+ <tr bgcolor="#000000">
+ <td>
+ <table cellspacing="1" cellpadding="2" border="0">
+ <tr bgcolor="#4040c0">
+ <td ><b><font size="+1" color="#ffffff"> Language </font></b></td>
+ <td ><b><font size="+1" color="#ffffff"> Maintainer </font></b></td>
+ <td ><b><font size="+1" color="#ffffff"> Contact address </font>
+ <font size="-2" color="#ffffff">(replace the at and dot)</font></b></td>
+ <td ><b><font size="+1" color="#ffffff"> Status </font></b></td>
+ </tr>
+ <!-- table content begin -->
+ %s
+ <!-- table content end -->
+ </table>
+ </td>
+ </tr>
+ </table>
+ \\endhtmlonly
+ '''
+ htmlTableTpl = dedent(htmlTableTpl)
+ htmlTrTpl = u'\n <tr bgcolor="#ffffff">%s\n </tr>'
+ htmlTdTpl = u'\n <td>%s</td>'
+
+ # Loop through transl objects in the order of sorted readable names
+ # and add generate the content of the HTML table.
+ trlst = []
+ for name, obj in self.langLst:
+ # Fill the table data elements for one row. The first element
+ # contains the readable name of the language.
+ lst = [ htmlTdTpl % obj.langReadable ]
+
+ # The next two elements contain the list of maintainers
+ # and the list of their mangled e-mails. For English-based
+ # translators that are coupled with the non-English based,
+ # insert the 'see' note.
+ mm = None # init -- maintainer
+ ee = None # init -- e-mail address
+ if obj.status == 'En':
+ # Check whether there is the coupled non-English.
+ classId = obj.classId[:-2]
+ if classId in self.__translDic:
+ lang = self.__translDic[classId].langReadable
+ mm = u'see the %s language' % lang
+ ee = u'&nbsp;'
+
+ if not mm and obj.classId in self.__maintainersDic:
+ # Build a string of names separated by the HTML break element.
+ # Special notes used instead of names are highlighted.
+ lm = []
+ for maintainer in self.__maintainersDic[obj.classId]:
+ name = maintainer[0]
+ if name.startswith(u'--'):
+ name = u'<span style="color: red; background-color: yellow">'\
+ + name + u'</span>'
+ lm.append(name)
+ mm = u'<br/>'.join(lm)
+
+ # The marked adresses (they start with the mark '[unreachable]',
+ # '[resigned]', whatever '[xxx]') will not be displayed at all.
+ # Only the mark will be used instead.
+ rexMark = re.compile(ur'(?P<mark>\[.*?\])')
+ le = []
+ for maintainer in self.__maintainersDic[obj.classId]:
+ address = maintainer[1]
+ m = rexMark.search(address)
+ if m is not None:
+ address = u'<span style="color: brown">'\
+ + m.group(u'mark') + u'</span>'
+ le.append(address)
+ ee = u'<br/>'.join(le)
+
+ # Append the maintainer and e-mail elements.
+ lst.append(htmlTdTpl % mm)
+ lst.append(htmlTdTpl % ee)
+
+ # The last element contains the readable form of the status.
+ lst.append(htmlTdTpl % obj.readableStatus)
+
+ # Join the table data to one table row.
+ trlst.append(htmlTrTpl % (''.join(lst)))
+
+ # Join the table rows and insert into the template.
+ htmlTable = htmlTableTpl % (''.join(trlst))
+
+ # Define templates for LaTeX table parts of the documentation.
+ latexTableTpl = ur'''
+ \latexonly
+ \footnotesize
+ \begin{longtable}{|l|l|l|l|}
+ \hline
+ {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
+ \hline
+ %s
+ \hline
+ \end{longtable}
+ \normalsize
+ \endlatexonly
+ '''
+ latexTableTpl = dedent(latexTableTpl)
+ latexLineTpl = u'\n' + r' %s & %s & {\tt\tiny %s} & %s \\'
+
+ # Loop through transl objects in the order of sorted readable names
+ # and add generate the content of the LaTeX table.
+ trlst = []
+ for name, obj in self.langLst:
+ # For LaTeX, more maintainers for the same language are
+ # placed on separate rows in the table. The line separator
+ # in the table is placed explicitly above the first
+ # maintainer. Prepare the arguments for the LaTeX row template.
+ maintainers = []
+ if self.__maintainersDic.has_key(obj.classId):
+ maintainers = self.__maintainersDic[obj.classId]
+
+ lang = obj.langReadable
+ maintainer = None # init
+ email = None # init
+ if obj.status == 'En':
+ # Check whether there is the coupled non-English.
+ classId = obj.classId[:-2]
+ if classId in self.__translDic:
+ langNE = self.__translDic[classId].langReadable
+ maintainer = u'see the %s language' % langNE
+ email = u'~'
+
+ if not maintainer and (obj.classId in self.__maintainersDic):
+ lm = [ m[0] for m in self.__maintainersDic[obj.classId] ]
+ maintainer = maintainers[0][0]
+ email = maintainers[0][1]
+
+ status = obj.readableStatus
+
+ # Use the template to produce the line of the table and insert
+ # the hline plus the constructed line into the table content.
+ # The underscore character must be escaped.
+ trlst.append(u'\n \\hline')
+ s = latexLineTpl % (lang, maintainer, email, status)
+ s = s.replace(u'_', u'\\_')
+ trlst.append(s)
+
+ # List the other maintainers for the language. Do not set
+ # lang and status for them.
+ lang = u'~'
+ status = u'~'
+ for m in maintainers[1:]:
+ maintainer = m[0]
+ email = m[1]
+ s = latexLineTpl % (lang, maintainer, email, status)
+ s = s.replace(u'_', u'\\_')
+ trlst.append(s)
+
+ # Join the table lines and insert into the template.
+ latexTable = latexTableTpl % (u''.join(trlst))
+
+ # Put the HTML and LaTeX parts together and define the dic item.
+ tplDic['informationTable'] = htmlTable + u'\n' + latexTable
+
+ # Insert the symbols into the document template and write it down.
+ f = codecs.open(fDocName, 'w', 'utf-8')
+ f.write(doctpl % tplDic)
+ f.close()
+
+if __name__ == '__main__':
+
+ # Create the manager, build the transl objects, and parse the related
+ # sources.
+ trMan = TrManager()
+
+ # Generate the language.doc.
+ trMan.generateLanguageDoc()
+
+ # Generate the translator report.
+ trMan.generateTranslatorReport()
diff --git a/doc/translator_report.txt b/doc/translator_report.txt
new file mode 100644
index 0000000..30c1d89
--- /dev/null
+++ b/doc/translator_report.txt
@@ -0,0 +1,848 @@
+(1.7.3)
+
+Doxygen supports the following 38 languages (sorted alphabetically):
+
+Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese
+Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto,
+Finnish, French, German, Greek, Hungarian, Indonesian, Italian,
+Japanese (+En), Korean (+En), Lithuanian, Macedonian, Norwegian,
+Persian, Polish, Portuguese, Romanian, Russian, Serbian,
+SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish, Ukrainian,
+and Vietnamese.
+
+Of them, 16 translators are up-to-date, 22 translators are based on
+some adapter class, and 2 are English based.
+
+----------------------------------------------------------------------
+The following translator classes are up-to-date (sorted
+alphabetically). This means that they derive from the Translator class
+and they implement all 225 of the required methods. Anyway, there
+still may be some details listed even for them:
+
+ TranslatorBrazilian
+ TranslatorChinese -- Reimplementation using UTF-8 suggested.
+ TranslatorCroatian
+ TranslatorCzech
+ TranslatorDanish -- Reimplementation using UTF-8 suggested.
+ TranslatorDutch
+ TranslatorEnglish
+ TranslatorEsperanto
+ TranslatorGreek
+ TranslatorItalian
+ TranslatorKorean -- Change the base class to Translator.
+ TranslatorPersian -- The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()
+ TranslatorRussian -- Reimplementation using UTF-8 suggested.
+ TranslatorSlovak
+ TranslatorSpanish -- The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()
+ TranslatorTurkish
+
+----------------------------------------------------------------------
+The following translator classes need some maintenance (the most
+obsolete at the end). The other info shows the estimation of Doxygen
+version when the class was last updated and number of methods that
+must be implemented to become up-to-date:
+
+ TranslatorPolish 1.6.3 4 methods to implement (1 %)
+ TranslatorGerman 1.6.3 4 methods to implement (1 %)
+ TranslatorFrench 1.6.3 4 methods to implement (1 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorCatalan 1.6.3 4 methods to implement (1 %)
+ TranslatorVietnamese 1.6.0 9 methods to implement (4 %)
+ TranslatorSwedish 1.6.0 9 methods to implement (4 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorSerbian 1.6.0 9 methods to implement (4 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorSerbianCyrilic 1.6.0 9 methods to implement (4 %)
+ TranslatorRomanian 1.6.0 9 methods to implement (4 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorMacedonian 1.6.0 9 methods to implement (4 %)
+ TranslatorJapanese 1.6.0 9 methods to implement (4 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorFinnish 1.6.0 9 methods to implement (4 %)
+ TranslatorChinesetraditional 1.6.0 9 methods to implement (4 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorAfrikaans 1.6.0 9 methods to implement (4 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorSlovene 1.4.6 33 methods to implement (14 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorNorwegian 1.4.6 32 methods to implement (14 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorLithuanian 1.4.6 33 methods to implement (14 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorIndonesian 1.4.6 32 methods to implement (14 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorHungarian 1.4.6 33 methods to implement (14 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorArabic 1.4.6 32 methods to implement (14 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorUkrainian 1.4.1 33 methods to implement (14 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+ TranslatorPortuguese 1.3.3 44 methods to implement (19 %)
+ Note: Reimplementation using UTF-8 suggested.
+
+
+----------------------------------------------------------------------
+The following translator classes derive directly from the
+TranslatorEnglish. The class identifier has the suffix 'En' that says
+that this is intentional. Usually, there is also a non-English based
+version of the translator for the language:
+
+ TranslatorJapaneseEn implements 5 methods -- Reimplementation using UTF-8 suggested.
+ TranslatorKoreanEn implements 5 methods -- Reimplementation using UTF-8 suggested.
+
+======================================================================
+WARNING: The following translator methods are declared in the
+Translator class but their identifiers do not appear in source files.
+The situation should be checked. The .cpp files and .h files excluding
+the '*translator*' files in doxygen/src directory were simply searched
+for occurence of the method identifiers:
+
+ QCString idLanguageCharset()
+ QCString trAlphabeticalList()
+ QCString trDCOPMethods()
+ QCString trDirDependency(const char *)
+ QCString trFunctionPrototypeDocumentation()
+ QCString trSearchForIndex()
+
+
+======================================================================
+Details for translators (classes sorted alphabetically):
+
+
+
+TranslatorAfrikaans (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+-------------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorArabic (TranslatorAdapter_1_4_6) 32 methods to implement (14 %)
+----------------
+
+ Implements 193 of the required methods (85 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
+ virtual QCString trLoading()
+ virtual QCString trSubprograms()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trModulesListDescription(bool extractAll)
+ virtual QCString trModulesList()
+ virtual QCString trTypeConstraints()
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trMemberFunctionDocumentationFortran()
+ virtual QCString trCompoundListDescriptionFortran()
+ virtual QCString trTypeDocumentation()
+ virtual QCString trModuleReference(const char * namespaceName)
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ virtual QCString trModulesMembers()
+ virtual QCString trModulesIndex()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trCompoundListFortran()
+ virtual QCString trDataTypes()
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+ virtual QCString trCompoundIndexFortran()
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ virtual QCString trCallerGraph()
+ virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
+ virtual QCString trType(bool first_capital, bool singular)
+ virtual QCString trModule(bool first_capital, bool singular)
+ virtual QCString trCompoundMembersFortran()
+ virtual QCString trSubprogramDocumentation()
+
+ Obsolete methods (should be removed, never used):
+
+ virtual QCString trHeaderFilesDescription()
+ virtual QCString trField(bool/*first_capital*/, bool singular)
+ virtual QCString trPackageDocumentation()
+ virtual QCString trSources()
+ virtual QCString trReimplementedForInternalReasons()
+ virtual QCString trInterfaces()
+ virtual QCString trHeaderFiles()
+ virtual QCString trBugsAndLimitations()
+ virtual QCString trNoDescriptionAvailable()
+
+
+TranslatorCatalan (TranslatorAdapter_1_6_3) 4 methods to implement (1 %)
+-----------------
+
+ Implements 221 of the required methods (98 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorChinese (Translator)
+-----------------
+
+ Implements 225 of the required methods (100 %).
+
+
+TranslatorChinesetraditional (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+----------------------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorDanish (Translator)
+----------------
+
+ Implements 225 of the required methods (100 %).
+
+
+TranslatorFinnish (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+-----------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorFrench (TranslatorAdapter_1_6_3) 4 methods to implement (1 %)
+----------------
+
+ Implements 221 of the required methods (98 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorGerman (TranslatorAdapter_1_6_3) 4 methods to implement (1 %)
+----------------
+
+ Implements 221 of the required methods (98 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorHungarian (TranslatorAdapter_1_4_6) 33 methods to implement (14 %)
+-------------------
+
+ Implements 192 of the required methods (85 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
+ virtual QCString trLoading()
+ virtual QCString trSubprograms()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trModulesListDescription(bool extractAll)
+ virtual QCString trModulesList()
+ virtual QCString trTypeConstraints()
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trMemberFunctionDocumentationFortran()
+ virtual QCString trCompoundListDescriptionFortran()
+ virtual QCString trTypeDocumentation()
+ virtual QCString trModuleReference(const char * namespaceName)
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ virtual QCString trModulesMembers()
+ virtual QCString trModulesIndex()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trCompoundListFortran()
+ virtual QCString trDataTypes()
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+ virtual QCString trCompoundIndexFortran()
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ virtual QCString trCallerGraph()
+ virtual QCString trEnumerationValueDocumentation()
+ virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
+ virtual QCString trType(bool first_capital, bool singular)
+ virtual QCString trModule(bool first_capital, bool singular)
+ virtual QCString trCompoundMembersFortran()
+ virtual QCString trSubprogramDocumentation()
+
+
+TranslatorIndonesian (TranslatorAdapter_1_4_6) 32 methods to implement (14 %)
+--------------------
+
+ Implements 193 of the required methods (85 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
+ virtual QCString trLoading()
+ virtual QCString trSubprograms()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trModulesListDescription(bool extractAll)
+ virtual QCString trModulesList()
+ virtual QCString trTypeConstraints()
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trMemberFunctionDocumentationFortran()
+ virtual QCString trCompoundListDescriptionFortran()
+ virtual QCString trTypeDocumentation()
+ virtual QCString trModuleReference(const char * namespaceName)
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ virtual QCString trModulesMembers()
+ virtual QCString trModulesIndex()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trCompoundListFortran()
+ virtual QCString trDataTypes()
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+ virtual QCString trCompoundIndexFortran()
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ virtual QCString trCallerGraph()
+ virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
+ virtual QCString trType(bool first_capital, bool singular)
+ virtual QCString trModule(bool first_capital, bool singular)
+ virtual QCString trCompoundMembersFortran()
+ virtual QCString trSubprogramDocumentation()
+
+ Obsolete methods (should be removed, never used):
+
+ virtual QCString trHeaderFilesDescription()
+ virtual QCString trField(bool first_capital, bool)
+ virtual QCString trPackageDocumentation()
+ virtual QCString trSources()
+ virtual QCString trReimplementedForInternalReasons()
+ virtual QCString trInterfaces()
+ virtual QCString trHeaderFiles()
+ virtual QCString trBugsAndLimitations()
+ virtual QCString trNoDescriptionAvailable()
+
+
+TranslatorJapanese (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+------------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+ Obsolete methods (should be removed, never used):
+
+ virtual QCString trHeaderFilesDescription()
+ virtual QCString trField(bool first_capital, bool singular)
+ virtual QCString trPackageDocumentation()
+ virtual QCString trSources()
+ virtual QCString trReimplementedForInternalReasons()
+ virtual QCString trInterfaces()
+ virtual QCString trHeaderFiles()
+ virtual QCString trBugsAndLimitations()
+ virtual QCString trNoDescriptionAvailable()
+
+
+TranslatorJapaneseEn (TranslatorEnglish) 220 methods to implement (97 %)
+--------------------
+
+ Implements 5 of the required methods (2 %).
+
+ This English-based translator implements the following methods:
+
+ virtual QCString trRTFansicp()
+ virtual QCString idLanguage()
+ virtual QCString trRTFCharSet()
+ virtual QCString idLanguageCharset()
+ virtual QCString latexLanguageSupportCommand()
+
+
+TranslatorKorean (TranslatorAdapter_1_6_3)
+----------------
+
+ Implements 225 of the required methods (100 %).
+
+
+TranslatorKoreanEn (TranslatorEnglish) 220 methods to implement (97 %)
+------------------
+
+ Implements 5 of the required methods (2 %).
+
+ This English-based translator implements the following methods:
+
+ virtual QCString trRTFansicp()
+ virtual QCString idLanguage()
+ virtual QCString trRTFCharSet()
+ virtual QCString idLanguageCharset()
+ virtual QCString latexLanguageSupportCommand()
+
+
+TranslatorLithuanian (TranslatorAdapter_1_4_6) 33 methods to implement (14 %)
+--------------------
+
+ Implements 192 of the required methods (85 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
+ virtual QCString trLoading()
+ virtual QCString trSubprograms()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trModulesListDescription(bool extractAll)
+ virtual QCString trModulesList()
+ virtual QCString trTypeConstraints()
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trMemberFunctionDocumentationFortran()
+ virtual QCString trCompoundListDescriptionFortran()
+ virtual QCString trTypeDocumentation()
+ virtual QCString trModuleReference(const char * namespaceName)
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ virtual QCString trModulesMembers()
+ virtual QCString trModulesIndex()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trCompoundListFortran()
+ virtual QCString trDataTypes()
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+ virtual QCString trCompoundIndexFortran()
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ virtual QCString trCallerGraph()
+ virtual QCString trEnumerationValueDocumentation()
+ virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
+ virtual QCString trType(bool first_capital, bool singular)
+ virtual QCString trModule(bool first_capital, bool singular)
+ virtual QCString trCompoundMembersFortran()
+ virtual QCString trSubprogramDocumentation()
+
+
+TranslatorMacedonian (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+--------------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorNorwegian (TranslatorAdapter_1_4_6) 32 methods to implement (14 %)
+-------------------
+
+ Implements 193 of the required methods (85 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
+ virtual QCString trLoading()
+ virtual QCString trSubprograms()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trModulesListDescription(bool extractAll)
+ virtual QCString trModulesList()
+ virtual QCString trTypeConstraints()
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trMemberFunctionDocumentationFortran()
+ virtual QCString trCompoundListDescriptionFortran()
+ virtual QCString trTypeDocumentation()
+ virtual QCString trModuleReference(const char * namespaceName)
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ virtual QCString trModulesMembers()
+ virtual QCString trModulesIndex()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trCompoundListFortran()
+ virtual QCString trDataTypes()
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+ virtual QCString trCompoundIndexFortran()
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ virtual QCString trCallerGraph()
+ virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
+ virtual QCString trType(bool first_capital, bool singular)
+ virtual QCString trModule(bool first_capital, bool singular)
+ virtual QCString trCompoundMembersFortran()
+ virtual QCString trSubprogramDocumentation()
+
+ Obsolete methods (should be removed, never used):
+
+ virtual QCString trHeaderFilesDescription()
+ virtual QCString trField(bool first_capital, bool singular)
+ virtual QCString trPackageDocumentation()
+ virtual QCString trSources()
+ virtual QCString trReimplementedForInternalReasons()
+ virtual QCString trInterfaces()
+ virtual QCString trHeaderFiles()
+ virtual QCString trBugsAndLimitations()
+ virtual QCString trNoDescriptionAvailable()
+
+
+TranslatorPersian (Translator)
+-----------------
+
+ Implements 225 of the required methods (100 %).
+
+
+TranslatorPolish (TranslatorAdapter_1_6_3) 4 methods to implement (1 %)
+----------------
+
+ Implements 221 of the required methods (98 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+ Obsolete methods (should be removed, never used):
+
+ QCString trHeaderFilesDescription()
+ virtual QCString trField(bool first_capital, bool singular)
+ virtual QCString trPackageDocumentation()
+ QCString trSources()
+ QCString trReimplementedForInternalReasons()
+ virtual QCString trInterfaces()
+ QCString trHeaderFiles()
+ QCString trBugsAndLimitations()
+ QCString trNoDescriptionAvailable()
+
+
+TranslatorPortuguese (TranslatorAdapter_1_3_3) 44 methods to implement (19 %)
+--------------------
+
+ Implements 181 of the required methods (80 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ virtual QCString trSearching()
+ virtual QCString trOverloadText()
+ virtual QCString trDirIndex()
+ virtual QCString trNoMatches()
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
+ virtual QCString trLoading()
+ virtual QCString trSubprograms()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trModulesListDescription(bool extractAll)
+ virtual QCString trModulesList()
+ virtual QCString trDirDocumentation()
+ virtual QCString trSearchResultsTitle()
+ virtual QCString trDirectories()
+ virtual QCString trTypeConstraints()
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trMemberFunctionDocumentationFortran()
+ virtual QCString trDirDescription()
+ virtual QCString trCompoundListDescriptionFortran()
+ virtual QCString trTypeDocumentation()
+ virtual QCString trModuleReference(const char * namespaceName)
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ virtual QCString trModulesMembers()
+ virtual QCString trModulesIndex()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trCompoundListFortran()
+ virtual QCString trDataTypes()
+ virtual QCString trSearchResults(int numDocuments)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+ virtual QCString trSearchMatches()
+ virtual QCString trCompoundIndexFortran()
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ virtual QCString trCallerGraph()
+ virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
+ virtual QCString trType(bool first_capital, bool singular)
+ virtual QCString trModule(bool first_capital, bool singular)
+ virtual QCString trCompoundMembersFortran()
+ virtual QCString trSourceFile(QCString & filename)
+ virtual QCString trDirReference(const char * dirName)
+ virtual QCString trDir(bool first_capital, bool singular)
+ virtual QCString trSearchForIndex()
+ virtual QCString trSubprogramDocumentation()
+
+ Obsolete methods (should be removed, never used):
+
+ QCString trHeaderFilesDescription()
+ virtual QCString trField(bool first_capital, bool singular)
+ virtual QCString trPackageDocumentation()
+ virtual QCString trSources()
+ QCString trReimplementedForInternalReasons()
+ virtual QCString trInterfaces()
+ QCString trHeaderFiles()
+ QCString trBugsAndLimitations()
+ QCString trNoDescriptionAvailable()
+
+
+TranslatorRomanian (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+------------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorRussian (Translator)
+-----------------
+
+ Implements 225 of the required methods (100 %).
+
+
+TranslatorSerbian (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+-----------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorSerbianCyrilic (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+------------------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorSlovene (TranslatorAdapter_1_4_6) 33 methods to implement (14 %)
+-----------------
+
+ Implements 192 of the required methods (85 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
+ virtual QCString trLoading()
+ virtual QCString trSubprograms()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trModulesListDescription(bool extractAll)
+ virtual QCString trModulesList()
+ virtual QCString trTypeConstraints()
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trMemberFunctionDocumentationFortran()
+ virtual QCString trCompoundListDescriptionFortran()
+ virtual QCString trTypeDocumentation()
+ virtual QCString trModuleReference(const char * namespaceName)
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ virtual QCString trModulesMembers()
+ virtual QCString trModulesIndex()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trCompoundListFortran()
+ virtual QCString trDataTypes()
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+ virtual QCString trCompoundIndexFortran()
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ virtual QCString trCallerGraph()
+ virtual QCString trEnumerationValueDocumentation()
+ virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
+ virtual QCString trType(bool first_capital, bool singular)
+ virtual QCString trModule(bool first_capital, bool singular)
+ virtual QCString trCompoundMembersFortran()
+ virtual QCString trSubprogramDocumentation()
+
+
+TranslatorSpanish (Translator)
+-----------------
+
+ Implements 225 of the required methods (100 %).
+
+
+TranslatorSwedish (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+-----------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+
+
+TranslatorUkrainian (TranslatorAdapter_1_4_1) 33 methods to implement (14 %)
+-------------------
+
+ Implements 192 of the required methods (85 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ virtual QCString trSearching()
+ virtual QCString trOverloadText()
+ virtual QCString trNoMatches()
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
+ virtual QCString trLoading()
+ virtual QCString trSubprograms()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trModulesListDescription(bool extractAll)
+ virtual QCString trModulesList()
+ virtual QCString trTypeConstraints()
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trMemberFunctionDocumentationFortran()
+ virtual QCString trCompoundListDescriptionFortran()
+ virtual QCString trTypeDocumentation()
+ virtual QCString trModuleReference(const char * namespaceName)
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ virtual QCString trModulesMembers()
+ virtual QCString trModulesIndex()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trCompoundListFortran()
+ virtual QCString trDataTypes()
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name)
+ virtual QCString trCompoundIndexFortran()
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ virtual QCString trCallerGraph()
+ virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
+ virtual QCString trType(bool first_capital, bool singular)
+ virtual QCString trModule(bool first_capital, bool singular)
+ virtual QCString trCompoundMembersFortran()
+ virtual QCString trSubprogramDocumentation()
+
+ Obsolete methods (should be removed, never used):
+
+ virtual QCString trHeaderFilesDescription()
+ virtual QCString trField(bool first_capital, bool singular)
+ virtual QCString trPackageDocumentation()
+ virtual QCString trSources()
+ virtual QCString trReimplementedForInternalReasons()
+ virtual QCString trInterfaces()
+ virtual QCString trHeaderFiles()
+ virtual QCString trBugsAndLimitations()
+ virtual QCString trNoDescriptionAvailable()
+
+
+TranslatorVietnamese (TranslatorAdapter_1_6_0) 9 methods to implement (4 %)
+--------------------
+
+ Implements 216 of the required methods (96 %).
+
+ Missing methods (should be implemented):
+
+ virtual QCString trSearching()
+ virtual QCString trNoMatches()
+ virtual QCString trLoading()
+ virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
+ virtual QCString trFileIn(const char * name)
+ virtual QCString trGlobalNamespace()
+ virtual QCString trDirRelation(const char * name)
+ virtual QCString trDirDependency(const char * name)
+ virtual QCString trIncludesFileIn(const char * name) \ No newline at end of file
diff --git a/doc/trouble.doc b/doc/trouble.doc
new file mode 100644
index 0000000..4fb41d2
--- /dev/null
+++ b/doc/trouble.doc
@@ -0,0 +1,142 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page trouble Troubleshooting
+
+<h2>Known problems:</h2>
+<ul>
+<li>If you have problems building doxygen from sources, please
+ read \ref unix_problems "this section" first.
+<li>Doxygen is <em>not</em> a real compiler, it is only a lexical scanner.
+ This means that it can and will not detect errors in your source code.
+<li>Since it is impossible to test all possible code fragments, it is
+ very well possible, that some valid piece of C/C++ code is not handled
+ properly. If you find such a piece, please send it to me, so I can
+ improve doxygen's parsing capabilities. Try to make the piece of code
+ you send as small as possible, to help me narrow down the search.
+<li>Doxygen does not work properly if there are multiple classes, structs
+ or unions with the same name in your code. It should not crash however,
+ rather it should ignore all of the classes with the same name except one.
+<li>Some commands do not work inside the arguments of other commands.
+ Inside a HTML link (i.e \<a href="..."\>...\<a\>) for instance
+ other commands (including other HTML commands) do not work!
+ The sectioning commands are an important exception.
+<li>Redundant braces can confuse doxygen in some cases.
+ For example:
+\verbatim
+ void f (int);
+\endverbatim
+ is properly parsed as a function declaration, but
+\verbatim
+ const int (a);
+\endverbatim
+ is also seen as a function declaration with name
+ <code>int</code>, because only the syntax is analyzed,
+ not the semantics. If the redundant braces can be detected, as in
+\verbatim
+ int *(a[20]);
+\endverbatim
+ then doxygen will remove the braces and correctly parse the result.
+<li>Not all names in code fragments that are included in the documentation
+ are replaced by links (for instance when using \c SOURCE_BROWSER = \c YES)
+ and links to overloaded members may point to the wrong member.
+ This also holds for the "Referenced by" list that is generated for
+ each function.
+
+ For a part this is because the code parser isn't smart enough at the
+ moment. I'll try to improve this in the future. But even with these
+ improvements not everything can be properly linked to the corresponding
+ documentation, because of possible ambiguities or lack of
+ information about the context in which the code fragment is found.
+<li>It is not possible to insert a non-member function f in a class A
+ using the \\relates or \\relatesalso command, if class A already
+ has a member with name f and the same argument list.
+<li>There is only very limited support for member specialization at the
+ moment. It only works if there is a specialized template class as
+ well.
+<li>Not all special commands are properly translated to RTF.
+<li>Version 1.8.6 of dot (and maybe earlier versions too) do not
+ generate proper map files, causing the graphs that doxygen generates
+ not to be properly clickable.
+<li>PHP only: Doxygen requires that all PHP statements (i.e. code) is
+ wrapped in a functions/methods, otherwise you may run into parse problems.
+</ul>
+
+
+<h2>How to help</h2>
+The development of Doxygen highly depends on your input!
+
+If you are trying Doxygen let me know what you think of it (do you
+miss certain features?). Even if you decide not to use it, please let me
+know why.
+
+\anchor bug_reports
+<h2>How to report a bug</h2>
+
+Bugs are tracked in GNOME's <a href="http://bugzilla.gnome.org">bugzilla</a> database.
+Before submitting a
+<a href="http://bugzilla.gnome.org/enter_bug.cgi?product=doxygen">new bug</a>,
+first <a href="http://bugzilla.gnome.org/query.cgi?format=advanced&product=doxygen">search</a>
+through the database if the same bug has already been submitted by others (the doxygen
+product will be preselected).
+If you believe you have found a new bug,
+please <a href="http://bugzilla.gnome.org/enter_bug.cgi?product=doxygen">report it</a>.
+
+If you are unsure whether or not something is a bug, please ask help
+on the <a href="http://sourceforge.net/mail/?group_id=5971">users mailing list</a>
+first (subscription is required).
+
+If you send only a (vague) description of a bug, you are usually not very
+helpful and it will cost me much more time to figure out what you mean.
+In the worst-case your bug report may even be completely ignored by me, so
+always try to include the following information in your bug report:
+- The version of doxygen you are using (for instance 1.5.3, use
+ <code>doxygen --version</code> if you are not sure).
+- The name and version number of your operating system (for instance
+ SuSE Linux 6.4)
+- It is usually a good idea to send along the configuration file as well,
+ but please use doxygen with the <code>-s</code> flag while generating it
+ to keep it small (use <code>doxygen -s -u [configName]</code> to strip
+ the comments from an existing config file).
+- The easiest (and often the only) way for me to fix bugs is if you can
+ attach a small example demonstrating the problem you have to the bug report, so I can
+ reproduce it on my machine. Please make sure the example is valid
+ source code (could potentially compile) and that the problem is really
+ captured by the example (I often get examples that do not trigger the
+ actual bug!). If you intend to send more than one file please zip or tar
+ the files together into a single file for easier processing.
+ Note that when reporting a new bug you'll get a chance to attach a file to it
+ only \e after submitting the initial bug description.
+
+You can (and are encouraged to) add a patch for a bug. If you do so
+please use PATCH as a keyword in the bug entry form.
+
+If you have ideas how to fix existing bugs and limitations please discuss them on
+the <a href="http://sourceforge.net/mail/?group_id=5971">developers mailing list</a>
+(subscription required). Patches can also be sent directly to dimitri@stack.nl if
+you prefer not to send them via the bug tracker or mailing list.
+
+For patches please use
+"diff -uN" or include the files you modified. If you send more than
+one file please tar or zip everything, so I only have to save and download
+one file.
+
+\htmlonly
+Return to the <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
+
diff --git a/doc/xmlcmds.doc b/doc/xmlcmds.doc
new file mode 100644
index 0000000..5116209
--- /dev/null
+++ b/doc/xmlcmds.doc
@@ -0,0 +1,100 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page xmlcmds XML Commands
+
+Doxygen supports most of the XML commands that are typically used in C#
+code comments. The XML tags are defined in Appendix E of the
+<a href="http://www.ecma-international.org/publications/standards/Ecma-334.htm">ECMA-334</a>
+standard, which defines the C# language. Unfortunately, the specification is
+not very precise and a number of the examples given are of poor quality.
+
+Here is the list of tags supported by doxygen:
+
+<ul>
+<li><tt>\<c\></tt> Identifies inline text that should be rendered as a
+ piece of code. Similar to using <tt>\<tt\></tt>text<tt>\</tt\></tt>.
+<li><tt>\<code\></tt> Set one or more lines of source code or program output.
+ Note that this command behaves like <tt>\\code ... \\endcode</tt>
+ for C# code, but it behaves like the HTML equivalent
+ <tt>\<code\>...\</code\></tt> for other languages.
+<li><tt>\<description\></tt> Part of a <tt>\<list\></tt> command, describes an item.
+<li><tt>\<example\></tt> Marks a block of text as an example, ignored by doxygen.
+<li><tt>\<exception cref="member"\></tt> Identifies the exception a
+ method can throw.
+<li><tt>\<include\></tt> Can be used to import a piece of XML from an external
+ file. Ignored by doxygen at the moment.
+<li><tt>\<item\></tt> List item. Can only be used inside a <tt>\<list\></tt> context.
+<li><tt>\<list type="type"\></tt> Starts a list, supported types are <tt>bullet</tt>
+ or <tt>number</tt> and <tt>table</tt>.
+ A list consists of a number of <tt>\<item\></tt> tags.
+ A list of type table, is a two column table which can have
+ a header.
+<li><tt>\<listheader\></tt> Starts the header of a list of type "table".
+<li><tt>\<para\></tt> Identifies a paragraph of text.
+<li><tt>\<param name="paramName"\></tt> Marks a piece of text as the documentation
+ for parameter "paramName". Similar to
+ using \ref cmdparam "\\param".
+<li><tt>\<paramref name="paramName"\></tt> Refers to a parameter with name
+ "paramName". Similar to using \ref cmda "\\a".
+<li><tt>\<permission\></tt> Identifies the security accessibility of a member.
+ Ignored by doxygen.
+<li><tt>\<remarks\></tt> Identifies the detailed description.
+<li><tt>\<returns\></tt> Marks a piece of text as the return value of a
+ function or method. Similar to using \ref cmdreturn "\\return".
+<li><tt>\<see cref="member"\></tt> Refers to a member. Similar to \ref cmdref "\\ref".
+<li><tt>\<seealso cref="member"\></tt> Starts a "See also" section referring
+ to "member". Similar to using \ref cmdsa "\\sa" member.
+<li><tt>\<summary\></tt> Identifies the brief description.
+ Similar to using \ref cmdbrief "\\brief".
+<li><tt>\<term\></tt> Part of a <tt>\<list\></tt> command.
+<li><tt>\<typeparam name="paramName"\></tt> Marks a piece of text as the documentation
+ for type parameter "paramName". Similar to
+ using \ref cmdparam "\\param".
+<li><tt>\<typeparamref name="paramName"\></tt> Refers to a parameter with name
+ "paramName". Similar to using \ref cmda "\\a".
+<li><tt>\<value\></tt> Identifies a property. Ignored by doxygen.
+</ul>
+
+Here is an example of a typical piece of code using some of the above commands:
+
+\code
+/// <summary>
+/// A search engine.
+/// </summary>
+class Engine
+{
+ /// <summary>
+ /// The Search method takes a series of parameters to specify the search criterion
+ /// and returns a dataset containing the result set.
+ /// </summary>
+ /// <param name="connectionString">the connection string to connect to the
+ /// database holding the content to search</param>
+ /// <param name="maxRows">The maximum number of rows to
+ /// return in the result set</param>
+ /// <param name="searchString">The text that we are searching for</param>
+ /// <returns>A DataSet instance containing the matching rows. It contains a maximum
+ /// number of rows specified by the maxRows parameter</returns>
+ public DataSet Search(string connectionString, int maxRows, int searchString)
+ {
+ DataSet ds = new DataSet();
+ return ds;
+ }
+}
+\endcode
+
+*/
+
diff --git a/examples/Makefile b/examples/Makefile
new file mode 100644
index 0000000..13e6d9b
--- /dev/null
+++ b/examples/Makefile
@@ -0,0 +1,146 @@
+#
+# This file was generated from Makefile.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+DOXYGEN = /Users/dimitri/doxygen
+TMAKEPATH = /Users/dimitri/doxygen/tmake/lib/macosx-c++
+ENV = env TMAKEPATH=$(TMAKEPATH)
+TMAKE = /Users/dimitri/doxygen/tmake/bin/tmake
+MAKE = /opt/local/bin/gmake
+PERL = /opt/local/bin/perl
+RM = rm -f
+CP = cp
+VERSION = 1.7.3
+INSTALL = /usr/local
+INSTTOOL = /opt/local/bin/ginstall
+DOXYDOCS = ..
+DOCDIR = $(INSTALL)/share/doc/packages/doxygen
+QTDIR = /usr
+HAVE_DOT = /usr/local/bin/dot
+MKSPECS = -spec macx-g++
+
+all: class/html/index.html \
+ define/html/index.html \
+ enum/html/index.html \
+ file/html/index.html \
+ func/html/index.html \
+ page/html/index.html \
+ relates/html/index.html \
+ author/html/index.html \
+ par/html/index.html \
+ overload/html/index.html \
+ example/html/index.html \
+ include/html/index.html \
+ qtstyle/html/index.html \
+ jdstyle/html/index.html \
+ structcmd/html/index.html \
+ autolink/html/index.html \
+ restypedef/html/index.html \
+ afterdoc/html/index.html \
+ template/html/index.html \
+ tag/html/index.html \
+ group/html/index.html \
+ diagrams/html/index.html \
+ memgrp/html/index.html \
+ docstring/html/index.html \
+ pyexample/html/index.html \
+ mux/html/index.html \
+ manual/html/index.html
+
+# Disabled since it is broken :-(
+# dbusxml/html/index.html
+
+clean:
+ rm -rf class define enum file func page relates author \
+ par overload example include qtstyle jdstyle structcmd \
+ autolink tag restypedef afterdoc template tag group diagrams \
+ memgrp docstring pyexample mux manual dbusxml
+
+class/html/index.html: class.h class.cfg
+ $(DOXYGEN)/bin/doxygen class.cfg
+
+define/html/index.html: define.h define.cfg
+ $(DOXYGEN)/bin/doxygen define.cfg
+
+enum/html/index.html: enum.h enum.cfg
+ $(DOXYGEN)/bin/doxygen enum.cfg
+
+file/html/index.html: file.h file.cfg
+ $(DOXYGEN)/bin/doxygen file.cfg
+
+func/html/index.html: func.h func.cfg
+ $(DOXYGEN)/bin/doxygen func.cfg
+
+page/html/index.html: page.doc page.cfg
+ $(DOXYGEN)/bin/doxygen page.cfg
+
+relates/html/index.html: relates.cpp relates.cfg
+ $(DOXYGEN)/bin/doxygen relates.cfg
+
+author/html/index.html: author.cpp author.cfg
+ $(DOXYGEN)/bin/doxygen author.cfg
+
+par/html/index.html: par.cpp par.cfg
+ $(DOXYGEN)/bin/doxygen par.cfg
+
+overload/html/index.html: overload.cpp overload.cfg
+ $(DOXYGEN)/bin/doxygen overload.cfg
+
+example/html/index.html: example.cpp example_test.cpp example.cfg
+ $(DOXYGEN)/bin/doxygen example.cfg
+
+include/html/index.html: include.cpp example_test.cpp include.cfg
+ $(DOXYGEN)/bin/doxygen include.cfg
+
+qtstyle/html/index.html: qtstyle.cpp qtstyle.cfg
+ $(DOXYGEN)/bin/doxygen qtstyle.cfg
+
+jdstyle/html/index.html: jdstyle.cpp jdstyle.cfg
+ $(DOXYGEN)/bin/doxygen jdstyle.cfg
+
+structcmd/html/index.html: structcmd.h structcmd.cfg
+ $(DOXYGEN)/bin/doxygen structcmd.cfg
+
+autolink/html/index.html: autolink.cpp autolink.cfg
+ $(DOXYGEN)/bin/doxygen autolink.cfg
+
+tag/html/index.html: tag.cpp tag.cfg example/html/index.html
+ $(DOXYGEN)/bin/doxygen tag.cfg
+# sed -e "1,1s#perl#$(PERL)#g" tag/html/installdox >tag/html/installdox.perl
+# cd tag/html ; $(PERL) installdox.perl -lexample.tag@../../example/html
+
+restypedef/html/index.html: restypedef.cpp restypedef.cfg
+ $(DOXYGEN)/bin/doxygen restypedef.cfg
+
+afterdoc/html/index.html: afterdoc.h afterdoc.cfg
+ $(DOXYGEN)/bin/doxygen afterdoc.cfg
+
+template/html/index.html: templ.cpp templ.cfg
+ $(DOXYGEN)/bin/doxygen templ.cfg
+
+group/html/index.html: group.cpp group.cfg
+ $(DOXYGEN)/bin/doxygen group.cfg
+
+memgrp/html/index.html: memgrp.cpp memgrp.cfg
+ $(DOXYGEN)/bin/doxygen memgrp.cfg
+
+pyexample/html/index.html: pyexample.py pyexample.cfg
+ $(DOXYGEN)/bin/doxygen pyexample.cfg
+
+mux/html/index.html: mux.vhdl mux.cfg
+ $(DOXYGEN)/bin/doxygen mux.cfg
+
+manual/html/index.html: manual.c manual.cfg
+ $(DOXYGEN)/bin/doxygen manual.cfg
+
+docstring/html/index.html: docstring.py docstring.cfg
+ $(DOXYGEN)/bin/doxygen docstring.cfg
+
+#dbusxml/html/index.html: dbusxml.xml dbusxml.cfg
+# $(DOXYGEN)/bin/doxygen dbusxml.cfg
+
+diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
+ifneq ($(HAVE_DOT),)
+ $(DOXYGEN)/bin/doxygen diagrams.cfg
+endif
+
diff --git a/examples/Makefile.in b/examples/Makefile.in
new file mode 100644
index 0000000..55bce8f
--- /dev/null
+++ b/examples/Makefile.in
@@ -0,0 +1,126 @@
+
+all: class/html/index.html \
+ define/html/index.html \
+ enum/html/index.html \
+ file/html/index.html \
+ func/html/index.html \
+ page/html/index.html \
+ relates/html/index.html \
+ author/html/index.html \
+ par/html/index.html \
+ overload/html/index.html \
+ example/html/index.html \
+ include/html/index.html \
+ qtstyle/html/index.html \
+ jdstyle/html/index.html \
+ structcmd/html/index.html \
+ autolink/html/index.html \
+ restypedef/html/index.html \
+ afterdoc/html/index.html \
+ template/html/index.html \
+ tag/html/index.html \
+ group/html/index.html \
+ diagrams/html/index.html \
+ memgrp/html/index.html \
+ docstring/html/index.html \
+ pyexample/html/index.html \
+ mux/html/index.html \
+ manual/html/index.html
+
+# Disabled since it is broken :-(
+# dbusxml/html/index.html
+
+clean:
+ rm -rf class define enum file func page relates author \
+ par overload example include qtstyle jdstyle structcmd \
+ autolink tag restypedef afterdoc template tag group diagrams \
+ memgrp docstring pyexample mux manual dbusxml
+
+class/html/index.html: class.h class.cfg
+ $(DOXYGEN)/bin/doxygen class.cfg
+
+define/html/index.html: define.h define.cfg
+ $(DOXYGEN)/bin/doxygen define.cfg
+
+enum/html/index.html: enum.h enum.cfg
+ $(DOXYGEN)/bin/doxygen enum.cfg
+
+file/html/index.html: file.h file.cfg
+ $(DOXYGEN)/bin/doxygen file.cfg
+
+func/html/index.html: func.h func.cfg
+ $(DOXYGEN)/bin/doxygen func.cfg
+
+page/html/index.html: page.doc page.cfg
+ $(DOXYGEN)/bin/doxygen page.cfg
+
+relates/html/index.html: relates.cpp relates.cfg
+ $(DOXYGEN)/bin/doxygen relates.cfg
+
+author/html/index.html: author.cpp author.cfg
+ $(DOXYGEN)/bin/doxygen author.cfg
+
+par/html/index.html: par.cpp par.cfg
+ $(DOXYGEN)/bin/doxygen par.cfg
+
+overload/html/index.html: overload.cpp overload.cfg
+ $(DOXYGEN)/bin/doxygen overload.cfg
+
+example/html/index.html: example.cpp example_test.cpp example.cfg
+ $(DOXYGEN)/bin/doxygen example.cfg
+
+include/html/index.html: include.cpp example_test.cpp include.cfg
+ $(DOXYGEN)/bin/doxygen include.cfg
+
+qtstyle/html/index.html: qtstyle.cpp qtstyle.cfg
+ $(DOXYGEN)/bin/doxygen qtstyle.cfg
+
+jdstyle/html/index.html: jdstyle.cpp jdstyle.cfg
+ $(DOXYGEN)/bin/doxygen jdstyle.cfg
+
+structcmd/html/index.html: structcmd.h structcmd.cfg
+ $(DOXYGEN)/bin/doxygen structcmd.cfg
+
+autolink/html/index.html: autolink.cpp autolink.cfg
+ $(DOXYGEN)/bin/doxygen autolink.cfg
+
+tag/html/index.html: tag.cpp tag.cfg example/html/index.html
+ $(DOXYGEN)/bin/doxygen tag.cfg
+# sed -e "1,1s#perl#$(PERL)#g" tag/html/installdox >tag/html/installdox.perl
+# cd tag/html ; $(PERL) installdox.perl -lexample.tag@../../example/html
+
+restypedef/html/index.html: restypedef.cpp restypedef.cfg
+ $(DOXYGEN)/bin/doxygen restypedef.cfg
+
+afterdoc/html/index.html: afterdoc.h afterdoc.cfg
+ $(DOXYGEN)/bin/doxygen afterdoc.cfg
+
+template/html/index.html: templ.cpp templ.cfg
+ $(DOXYGEN)/bin/doxygen templ.cfg
+
+group/html/index.html: group.cpp group.cfg
+ $(DOXYGEN)/bin/doxygen group.cfg
+
+memgrp/html/index.html: memgrp.cpp memgrp.cfg
+ $(DOXYGEN)/bin/doxygen memgrp.cfg
+
+pyexample/html/index.html: pyexample.py pyexample.cfg
+ $(DOXYGEN)/bin/doxygen pyexample.cfg
+
+mux/html/index.html: mux.vhdl mux.cfg
+ $(DOXYGEN)/bin/doxygen mux.cfg
+
+manual/html/index.html: manual.c manual.cfg
+ $(DOXYGEN)/bin/doxygen manual.cfg
+
+docstring/html/index.html: docstring.py docstring.cfg
+ $(DOXYGEN)/bin/doxygen docstring.cfg
+
+#dbusxml/html/index.html: dbusxml.xml dbusxml.cfg
+# $(DOXYGEN)/bin/doxygen dbusxml.cfg
+
+diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
+ifneq ($(HAVE_DOT),)
+ $(DOXYGEN)/bin/doxygen diagrams.cfg
+endif
+
diff --git a/examples/Makefile.win.in b/examples/Makefile.win.in
new file mode 100644
index 0000000..0d5e64e
--- /dev/null
+++ b/examples/Makefile.win.in
@@ -0,0 +1,118 @@
+DOXYDIR = ..\bin
+
+all: class/html/index.html \
+ define/html/index.html \
+ enum/html/index.html \
+ file/html/index.html \
+ func/html/index.html \
+ page/html/index.html \
+ relates/html/index.html \
+ author/html/index.html \
+ par/html/index.html \
+ overload/html/index.html \
+ example/html/index.html \
+ include/html/index.html \
+ qtstyle/html/index.html \
+ jdstyle/html/index.html \
+ structcmd/html/index.html \
+ autolink/html/index.html \
+ restypedef/html/index.html \
+ afterdoc/html/index.html \
+ template/html/index.html \
+ tag/html/index.html \
+ group/html/index.html \
+ diagrams/html/index.html \
+ memgrp/html/index.html \
+ docstring/html/index.html \
+ pyexample/html/index.html \
+ mux/html/index.html \
+ manual/html/index.html
+
+clean:
+ del /s/y class define enum file pyexample docstring
+ del /s/y func page relates author
+ del /s/y par overload example include qtstyle
+ del /s/y jdstyle structcmd autolink resdefine mux manual
+ del /s/y restypedef afterdoc template tag group diagrams memgrp
+
+class/html/index.html: class.h class.cfg
+ $(DOXYDIR)\doxygen class.cfg
+
+define/html/index.html: define.h define.cfg
+ $(DOXYDIR)\doxygen define.cfg
+
+enum/html/index.html: enum.h enum.cfg
+ $(DOXYDIR)\doxygen enum.cfg
+
+file/html/index.html: file.h file.cfg
+ $(DOXYDIR)\doxygen file.cfg
+
+func/html/index.html: func.h func.cfg
+ $(DOXYDIR)\doxygen func.cfg
+
+page/html/index.html: page.doc page.cfg
+ $(DOXYDIR)\doxygen page.cfg
+
+relates/html/index.html: relates.cpp relates.cfg
+ $(DOXYDIR)\doxygen relates.cfg
+
+author/html/index.html: author.cpp author.cfg
+ $(DOXYDIR)\doxygen author.cfg
+
+par/html/index.html: par.cpp par.cfg
+ $(DOXYDIR)\doxygen par.cfg
+
+overload/html/index.html: overload.cpp overload.cfg
+ $(DOXYDIR)\doxygen overload.cfg
+
+example/html/index.html: example.cpp example_test.cpp example.cfg
+ $(DOXYDIR)\doxygen example.cfg
+
+include/html/index.html: include.cpp example_test.cpp include.cfg
+ $(DOXYDIR)\doxygen include.cfg
+
+qtstyle/html/index.html: qtstyle.cpp qtstyle.cfg
+ $(DOXYDIR)\doxygen qtstyle.cfg
+
+jdstyle/html/index.html: jdstyle.cpp jdstyle.cfg
+ $(DOXYDIR)\doxygen jdstyle.cfg
+
+structcmd/html/index.html: structcmd.h structcmd.cfg
+ $(DOXYDIR)\doxygen structcmd.cfg
+
+autolink/html/index.html: autolink.cpp autolink.cfg
+ $(DOXYDIR)\doxygen autolink.cfg
+
+tag/html/index.html: tag.cpp tag.cfg
+ $(DOXYDIR)\doxygen tag.cfg
+
+restypedef/html/index.html: restypedef.cpp restypedef.cfg
+ $(DOXYDIR)\doxygen restypedef.cfg
+
+afterdoc/html/index.html: afterdoc.h afterdoc.cfg
+ $(DOXYDIR)\doxygen afterdoc.cfg
+
+template/html/index.html: templ.cpp templ.cfg
+ $(DOXYDIR)\doxygen templ.cfg
+
+group/html/index.html: group.cpp group.cfg
+ $(DOXYDIR)\doxygen group.cfg
+
+memgrp/html/index.html: memgrp.cpp memgrp.cfg
+ $(DOXYDIR)\doxygen memgrp.cfg
+
+pyexample/html/index.html: pyexample.py pyexample.cfg
+ $(DOXYDIR)\doxygen pyexample.cfg
+
+mux/html/index.html: mux.vhdl mux.cfg
+ $(DOXYDIR)\doxygen mux.cfg
+
+manual/html/index.html: manual.c manual.cfg
+ $(DOXYDIR)\doxygen manual.cfg
+
+docstring/html/index.html: docstring.py docstring.cfg
+ $(DOXYDIR)\doxygen docstring.cfg
+
+diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
+ $(DOXYDIR)\doxygen diagrams.cfg
+
diff --git a/examples/afterdoc.cfg b/examples/afterdoc.cfg
new file mode 100644
index 0000000..fcdbcae
--- /dev/null
+++ b/examples/afterdoc.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "AfterDocs"
+OUTPUT_DIRECTORY = afterdoc
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = afterdoc.h
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/afterdoc.h b/examples/afterdoc.h
new file mode 100644
index 0000000..907dabe
--- /dev/null
+++ b/examples/afterdoc.h
@@ -0,0 +1,18 @@
+/*! A test class */
+
+class Test
+{
+ public:
+ /** An enum type.
+ * The documentation block cannot be put after the enum!
+ */
+ enum EnumType
+ {
+ int EVal1, /**< enum value 1 */
+ int EVal2 /**< enum value 2 */
+ };
+ void member(); //!< a member function.
+
+ protected:
+ int value; /*!< an integer value */
+};
diff --git a/examples/author.cfg b/examples/author.cfg
new file mode 100644
index 0000000..8bb04f7
--- /dev/null
+++ b/examples/author.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Author Command"
+OUTPUT_DIRECTORY = author
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = author.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/author.cpp b/examples/author.cpp
new file mode 100644
index 0000000..59cc7ab
--- /dev/null
+++ b/examples/author.cpp
@@ -0,0 +1,14 @@
+/*! \class WindowsNT
+ * \brief Windows Nice Try.
+ * \author Bill Gates
+ * \author Several species of small furry animals gathered together
+ * in a cave and grooving with a pict.
+ * \version 4.0
+ * \date 1996-1998
+ * \bug It crashes a lot and requires huge amounts of memory.
+ * \bug The class introduces the more bugs, the longer it is used.
+ * \warning This class may explode in your face.
+ * \warning If you inherit anything from this class, you're doomed.
+ */
+
+class WindowsNT {};
diff --git a/examples/autolink.cfg b/examples/autolink.cfg
new file mode 100644
index 0000000..406d52c
--- /dev/null
+++ b/examples/autolink.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Automatic link generation"
+OUTPUT_DIRECTORY = autolink
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = autolink.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/autolink.cpp b/examples/autolink.cpp
new file mode 100644
index 0000000..e028f22
--- /dev/null
+++ b/examples/autolink.cpp
@@ -0,0 +1,99 @@
+/*! \file autolink.cpp
+ Testing automatic link generation.
+
+ A link to a member of the Test class: Test::member,
+
+ More specific links to the each of the overloaded members:
+ Test::member(int) and Test#member(int,int)
+
+ A link to a protected member variable of Test: Test#var,
+
+ A link to the global enumeration type #GlobEnum.
+
+ A link to the define #ABS(x).
+
+ A link to the destructor of the Test class: Test::~Test,
+
+ A link to the typedef ::B.
+
+ A link to the enumeration type Test::EType
+
+ A link to some enumeration values Test::Val1 and ::GVal2
+*/
+
+/*!
+ Since this documentation block belongs to the class Test no link to
+ Test is generated.
+
+ Two ways to link to a constructor are: #Test and Test().
+
+ Links to the destructor are: #~Test and ~Test().
+
+ A link to a member in this class: member().
+
+ More specific links to the each of the overloaded members:
+ member(int) and member(int,int).
+
+ A link to the variable #var.
+
+ A link to the global typedef ::B.
+
+ A link to the global enumeration type #GlobEnum.
+
+ A link to the define ABS(x).
+
+ A link to a variable \link #var using another text\endlink as a link.
+
+ A link to the enumeration type #EType.
+
+ A link to some enumeration values: \link Test::Val1 Val1 \endlink and ::GVal1.
+
+ And last but not least a link to a file: autolink.cpp.
+
+ \sa Inside a see also section any word is checked, so EType,
+ Val1, GVal1, ~Test and member will be replaced by links in HTML.
+*/
+
+class Test
+{
+ public:
+ Test(); //!< constructor
+ ~Test(); //!< destructor
+ void member(int); /**< A member function. Details. */
+ void member(int,int); /**< An overloaded member function. Details */
+
+ /** An enum type. More details */
+ enum EType {
+ Val1, /**< enum value 1 */
+ Val2 /**< enum value 2 */
+ };
+
+ protected:
+ int var; /**< A member variable */
+};
+
+/*! details. */
+Test::Test() { }
+
+/*! details. */
+Test::~Test() { }
+
+/*! A global variable. */
+int globVar;
+
+/*! A global enum. */
+enum GlobEnum {
+ GVal1, /*!< global enum value 1 */
+ GVal2 /*!< global enum value 2 */
+ };
+
+/*!
+ * A macro definition.
+ */
+#define ABS(x) (((x)>0)?(x):-(x))
+
+typedef Test B;
+
+/*! \fn typedef Test B
+ * A type definition.
+ */
diff --git a/examples/class.cfg b/examples/class.cfg
new file mode 100644
index 0000000..f2c4796
--- /dev/null
+++ b/examples/class.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Class Command"
+OUTPUT_DIRECTORY = class
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = class.h
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/class.h b/examples/class.h
new file mode 100644
index 0000000..e5a9121
--- /dev/null
+++ b/examples/class.h
@@ -0,0 +1,11 @@
+/* A dummy class */
+
+class Test
+{
+};
+
+/*! \class Test class.h "inc/class.h"
+ * \brief This is a test class.
+ *
+ * Some details about the Test class
+ */
diff --git a/examples/dbusxml.cfg b/examples/dbusxml.cfg
new file mode 100644
index 0000000..23b9dea
--- /dev/null
+++ b/examples/dbusxml.cfg
@@ -0,0 +1,12 @@
+PROJECT_NAME = "DBusXMLDocs"
+OUTPUT_DIRECTORY = dbusxml
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = dbusxml.xml
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+EXTRACT_ALL = YES
+SEARCHENGINE = NO
+EXTENSION_MAPPING = xml=dbusxml
diff --git a/examples/dbusxml.xml b/examples/dbusxml.xml
new file mode 100644
index 0000000..4ab7f78
--- /dev/null
+++ b/examples/dbusxml.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" ?>
+<!-- Comment -->
+<!--*< File comment -->
+<node name="/SomeNode" xmlns:dx="http://psiamp.org/dtd/doxygen_dbusxml.dtd">
+ <!--* test struct outside a namespace and interface -->
+ <dx:struct name="StructOutsideNamespace">
+ <!--* member 1 -->
+ <dx:member name="member1" type="s"/>
+ <!--* complex member 1 -->
+ <dx:member name="complexMember1" type="(ssu)"/>
+ </dx:struct>
+
+ <!--* Test flag set -->
+ <dx:flagset name="flagset">
+ <!--* Flag 1 of flagset. -->
+ <dx:value name="FLAG1"/>
+ </dx:flagset>
+
+ <!--* namespace comment -->
+ <dx:namespace name="SomeNamespace">
+ <!--* struct inside a namespace -->
+ <dx:struct name="StructInNamespace">
+ <!--* member 2 -->
+ <dx:member name="member2" type="s"/>
+ </dx:struct>
+ </dx:namespace>
+ <!--* Documentation on the interface -->
+ <interface name="nl.stack.doxygen.test.interface">
+ <!--* Test Enum documentation -->
+ <dx:enum name="TestEnum">
+ <!--* key 1 with value 13 -->
+ <dx:value name="KEY1" value="13"/>
+ <!--* key 2 without a value -->
+ <dx:value name="KEY2"/>
+ </dx:enum>
+
+ <!--* struct inside a interface -->
+ <dx:struct name="StructInInterface">
+ <!--* member 3 -->
+ <dx:member name="member3" type="s"/>
+ <!--* Struct in a struct -->
+ <dx:struct name="StructInAStruct">
+ <!--* member4 -->
+ <dx:member name="member4" type="s"/>
+ </dx:struct>
+ <!--* struct member -->
+ <dx:member name="structMembor" type="(s)" named-type="StructInAStruct"/>
+ </dx:struct>
+ <!--* Document method
+
+ Some extended documentation for the method.
+
+ @param[in] input blah.
+ @param[out] output blub
+ -->
+ <method name="method">
+ <arg direction="in" name="input" type="(s(s))" named-type="::nl::stack::doxygen::test::interface::StructInInterface"/>
+ <arg direction="out" type="v" name="output"/>
+ </method>
+
+ <signal name="signal">
+ <!--*< Documentation for signal.
+
+ @param parameter some parameter.
+ -->
+ <arg name="parameter" type="s"/>
+ </signal>
+
+ <!--* property documentation -->
+ <property name="property" type="s" access="readwrite"/>
+
+ <!--* property documentation read-only -->
+ <property name="propertyRead" type="s" access="read"/>
+ <!--* property documentation write-only -->
+ <property name="propertyWrite" type="s" access="write"/>
+ </interface>
+</node>
+<!-- vim:set sw=2 sts=2 et ft=xml: -->
diff --git a/examples/define.cfg b/examples/define.cfg
new file mode 100644
index 0000000..547591e
--- /dev/null
+++ b/examples/define.cfg
@@ -0,0 +1,11 @@
+PROJECT_NAME = "Define Command"
+OUTPUT_DIRECTORY = define
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = define.h
+ENABLE_PREPROCESSING = YES
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/define.h b/examples/define.h
new file mode 100644
index 0000000..c330447
--- /dev/null
+++ b/examples/define.h
@@ -0,0 +1,18 @@
+/*! \file define.h
+ \brief testing defines
+
+ This is to test the documentation of defines.
+*/
+
+/*!
+ \def MAX(x,y)
+ Computes the maximum of \a x and \a y.
+*/
+
+/*!
+ Computes the absolute value of its argument \a x.
+*/
+#define ABS(x) (((x)>0)?(x):-(x))
+#define MAX(x,y) ((x)>(y)?(x):(y))
+#define MIN(x,y) ((x)>(y)?(y):(x))
+ /*!< Computes the minimum of \a x and \a y. */
diff --git a/examples/diagrams.cfg b/examples/diagrams.cfg
new file mode 100644
index 0000000..9bc5551
--- /dev/null
+++ b/examples/diagrams.cfg
@@ -0,0 +1,14 @@
+PROJECT_NAME = "Diagrams"
+OUTPUT_DIRECTORY = diagrams
+HAVE_DOT = YES
+EXTRACT_ALL = YES
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+ENABLE_PREPROCESSING = YES
+INPUT = .
+FILE_PATTERNS = diagrams_*.h
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/diagrams_a.h b/examples/diagrams_a.h
new file mode 100644
index 0000000..047a8ab
--- /dev/null
+++ b/examples/diagrams_a.h
@@ -0,0 +1,4 @@
+#ifndef _DIAGRAMS_A_H
+#define _DIAGRAMS_A_H
+class A { public: A *m_self; };
+#endif
diff --git a/examples/diagrams_b.h b/examples/diagrams_b.h
new file mode 100644
index 0000000..5fcd247
--- /dev/null
+++ b/examples/diagrams_b.h
@@ -0,0 +1,5 @@
+#ifndef _DIAGRAMS_B_H
+#define _DIAGRAMS_B_H
+class A;
+class B { public: A *m_a; };
+#endif
diff --git a/examples/diagrams_c.h b/examples/diagrams_c.h
new file mode 100644
index 0000000..e4ec11d
--- /dev/null
+++ b/examples/diagrams_c.h
@@ -0,0 +1,6 @@
+#ifndef _DIAGRAMS_C_H
+#define _DIAGRAMS_C_H
+#include "diagrams_c.h"
+class D;
+class C : public A { public: D *m_d; };
+#endif
diff --git a/examples/diagrams_d.h b/examples/diagrams_d.h
new file mode 100644
index 0000000..3e635ce
--- /dev/null
+++ b/examples/diagrams_d.h
@@ -0,0 +1,7 @@
+#ifndef _DIAGRAM_D_H
+#define _DIAGRAM_D_H
+#include "diagrams_a.h"
+#include "diagrams_b.h"
+class C;
+class D : virtual protected A, private B { public: C m_c; };
+#endif
diff --git a/examples/diagrams_e.h b/examples/diagrams_e.h
new file mode 100644
index 0000000..5282388
--- /dev/null
+++ b/examples/diagrams_e.h
@@ -0,0 +1,5 @@
+#ifndef _DIAGRAM_E_H
+#define _DIAGRAM_E_H
+#include "diagrams_d.h"
+class E : public D {};
+#endif
diff --git a/examples/docstring.cfg b/examples/docstring.cfg
new file mode 100644
index 0000000..2a5cd9a
--- /dev/null
+++ b/examples/docstring.cfg
@@ -0,0 +1,11 @@
+PROJECT_NAME = "Python"
+OUTPUT_DIRECTORY = docstring
+EXTRACT_ALL = YES
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+OPTIMIZE_OUTPUT_JAVA = YES
+INPUT = docstring.py
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/docstring.py b/examples/docstring.py
new file mode 100644
index 0000000..07b13e0
--- /dev/null
+++ b/examples/docstring.py
@@ -0,0 +1,27 @@
+"""@package docstring
+Documentation for this module.
+
+More details.
+"""
+
+def func():
+ """Documentation for a function.
+
+ More details.
+ """
+ pass
+
+class PyClass:
+ """Documentation for a class.
+
+ More details.
+ """
+
+ def __init__(self):
+ """The constructor."""
+ self._memVar = 0;
+
+ def PyMethod(self):
+ """Documentation for a method."""
+ pass
+
diff --git a/examples/enum.cfg b/examples/enum.cfg
new file mode 100644
index 0000000..ed83670
--- /dev/null
+++ b/examples/enum.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Enum Command"
+OUTPUT_DIRECTORY = enum
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = enum.h
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/enum.h b/examples/enum.h
new file mode 100644
index 0000000..4c54fab
--- /dev/null
+++ b/examples/enum.h
@@ -0,0 +1,24 @@
+class Test
+{
+ public:
+ enum TEnum { Val1, Val2 };
+
+ /*! Another enum, with inline docs */
+ enum AnotherEnum
+ {
+ V1, /*!< value 1 */
+ V2 /*!< value 2 */
+ };
+};
+
+/*! \class Test
+ * The class description.
+ */
+
+/*! \enum Test::TEnum
+ * A description of the enum type.
+ */
+
+/*! \var Test::TEnum Test::Val1
+ * The description of the first enum value.
+ */
diff --git a/examples/example.cfg b/examples/example.cfg
new file mode 100644
index 0000000..4c5c869
--- /dev/null
+++ b/examples/example.cfg
@@ -0,0 +1,12 @@
+PROJECT_NAME = "Example Command"
+OUTPUT_DIRECTORY = example
+GENERATE_TAGFILE = example.tag
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = example.cpp
+EXAMPLE_PATH = example_test.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/example.cpp b/examples/example.cpp
new file mode 100644
index 0000000..230d6ec
--- /dev/null
+++ b/examples/example.cpp
@@ -0,0 +1,19 @@
+/** A Test class.
+ * More details about this class.
+ */
+
+class Test
+{
+ public:
+ /** An example member function.
+ * More details about this function.
+ */
+ void example();
+};
+
+void Test::example() {}
+
+/** \example example_test.cpp
+ * This is an example of how to use the Test class.
+ * More details about this example.
+ */
diff --git a/examples/example.tag b/examples/example.tag
new file mode 100644
index 0000000..a38ab5c
--- /dev/null
+++ b/examples/example.tag
@@ -0,0 +1,14 @@
+<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?>
+<tagfile>
+ <compound kind="class">
+ <name>Test</name>
+ <filename>class_test.html</filename>
+ <member kind="function">
+ <type>void</type>
+ <name>example</name>
+ <anchorfile>class_test.html</anchorfile>
+ <anchor>a47b775f65718978f1ffcd96376f8ecfa</anchor>
+ <arglist>()</arglist>
+ </member>
+ </compound>
+</tagfile>
diff --git a/examples/example_test.cpp b/examples/example_test.cpp
new file mode 100644
index 0000000..a7e1643
--- /dev/null
+++ b/examples/example_test.cpp
@@ -0,0 +1,5 @@
+void main()
+{
+ Test t;
+ t.example();
+}
diff --git a/examples/file.cfg b/examples/file.cfg
new file mode 100644
index 0000000..e54b1c7
--- /dev/null
+++ b/examples/file.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "File Command"
+OUTPUT_DIRECTORY = file
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = file.h
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/file.h b/examples/file.h
new file mode 100644
index 0000000..8dff6cb
--- /dev/null
+++ b/examples/file.h
@@ -0,0 +1,10 @@
+/** \file file.h
+ * A brief file description.
+ * A more elaborated file description.
+ */
+
+/**
+ * A global integer value.
+ * More details about this value.
+ */
+extern int globalValue;
diff --git a/examples/func.cfg b/examples/func.cfg
new file mode 100644
index 0000000..32c3190
--- /dev/null
+++ b/examples/func.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Fn Command"
+OUTPUT_DIRECTORY = func
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = func.h
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/func.h b/examples/func.h
new file mode 100644
index 0000000..b335448
--- /dev/null
+++ b/examples/func.h
@@ -0,0 +1,21 @@
+class Test
+{
+ public:
+ const char *member(char,int) throw(std::out_of_range);
+};
+
+const char *Test::member(char c,int n) throw(std::out_of_range) {}
+
+/*! \class Test
+ * \brief Test class.
+ *
+ * Details about Test.
+ */
+
+/*! \fn const char *Test::member(char c,int n)
+ * \brief A member function.
+ * \param c a character.
+ * \param n an integer.
+ * \exception std::out_of_range parameter is out of range.
+ * \return a character pointer.
+ */
diff --git a/examples/group.cfg b/examples/group.cfg
new file mode 100644
index 0000000..98cc27e
--- /dev/null
+++ b/examples/group.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Grouping"
+OUTPUT_DIRECTORY = group
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = group.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/group.cpp b/examples/group.cpp
new file mode 100644
index 0000000..b120b90
--- /dev/null
+++ b/examples/group.cpp
@@ -0,0 +1,88 @@
+/** @defgroup group1 The First Group
+ * This is the first group
+ * @{
+ */
+
+/** @brief class C1 in group 1 */
+class C1 {};
+
+/** @brief class C2 in group 1 */
+class C2 {};
+
+/** function in group 1 */
+void func() {}
+
+/** @} */ // end of group1
+
+/**
+ * @defgroup group2 The Second Group
+ * This is the second group
+ */
+
+/** @defgroup group3 The Third Group
+ * This is the third group
+ */
+
+/** @defgroup group4 The Fourth Group
+ * @ingroup group3
+ * Group 4 is a subgroup of group 3
+ */
+
+/**
+ * @ingroup group2
+ * @brief class C3 in group 2
+ */
+class C3 {};
+
+/** @ingroup group2
+ * @brief class C4 in group 2
+ */
+class C4 {};
+
+/** @ingroup group3
+ * @brief class C5 in @link group3 the third group@endlink.
+ */
+class C5 {};
+
+/** @ingroup group1 group2 group3 group4
+ * namespace N1 is in four groups
+ * @sa @link group1 The first group@endlink, group2, group3, group4
+ *
+ * Also see @ref mypage2
+ */
+namespace N1 {};
+
+/** @file
+ * @ingroup group3
+ * @brief this file in group 3
+ */
+
+/** @defgroup group5 The Fifth Group
+ * This is the fifth group
+ * @{
+ */
+
+/** @page mypage1 This is a section in group 5
+ * Text of the first section
+ */
+
+/** @page mypage2 This is another section in group 5
+ * Text of the second section
+ */
+
+/** @} */ // end of group5
+
+/** @addtogroup group1
+ *
+ * More documentation for the first group.
+ * @{
+ */
+
+/** another function in group 1 */
+void func2() {}
+
+/** yet another function in group 1 */
+void func3() {}
+
+/** @} */ // end of group1
+
diff --git a/examples/include.cfg b/examples/include.cfg
new file mode 100644
index 0000000..8516b32
--- /dev/null
+++ b/examples/include.cfg
@@ -0,0 +1,11 @@
+PROJECT_NAME = "Include Command"
+OUTPUT_DIRECTORY = include
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = include.cpp
+EXAMPLE_PATH = example_test.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/include.cpp b/examples/include.cpp
new file mode 100644
index 0000000..c50ab96
--- /dev/null
+++ b/examples/include.cpp
@@ -0,0 +1,22 @@
+
+/*! A test class. */
+
+class Test
+{
+ public:
+ /// a member function
+ void example();
+};
+
+/*! \page example
+ * \dontinclude example_test.cpp
+ * Our main function starts like this:
+ * \skip main
+ * \until {
+ * First we create a object \c t of the Test class.
+ * \skipline Test
+ * Then we call the example member function
+ * \line example
+ * After that our little test routine ends.
+ * \line }
+ */
diff --git a/examples/jdstyle.cfg b/examples/jdstyle.cfg
new file mode 100644
index 0000000..02bf18c
--- /dev/null
+++ b/examples/jdstyle.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "JavaDoc Style"
+OUTPUT_DIRECTORY = jdstyle
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = jdstyle.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/jdstyle.cpp b/examples/jdstyle.cpp
new file mode 100644
index 0000000..bd8b9a7
--- /dev/null
+++ b/examples/jdstyle.cpp
@@ -0,0 +1,66 @@
+/**
+ * A test class. A more elaborate class description.
+ */
+
+class Test
+{
+ public:
+
+ /**
+ * An enum.
+ * More detailed enum description.
+ */
+
+ enum TEnum {
+ TVal1, /**< enum value TVal1. */
+ TVal2, /**< enum value TVal2. */
+ TVal3 /**< enum value TVal3. */
+ }
+ *enumPtr, /**< enum pointer. Details. */
+ enumVar; /**< enum variable. Details. */
+
+ /**
+ * A constructor.
+ * A more elaborate description of the constructor.
+ */
+ Test();
+
+ /**
+ * A destructor.
+ * A more elaborate description of the destructor.
+ */
+ ~Test();
+
+ /**
+ * a normal member taking two arguments and returning an integer value.
+ * @param a an integer argument.
+ * @param s a constant character pointer.
+ * @see Test()
+ * @see ~Test()
+ * @see testMeToo()
+ * @see publicVar()
+ * @return The test results
+ */
+ int testMe(int a,const char *s);
+
+ /**
+ * A pure virtual member.
+ * @see testMe()
+ * @param c1 the first argument.
+ * @param c2 the second argument.
+ */
+ virtual void testMeToo(char c1,char c2) = 0;
+
+ /**
+ * a public variable.
+ * Details.
+ */
+ int publicVar;
+
+ /**
+ * a function variable.
+ * Details.
+ */
+ int (*handler)(int a,int b);
+};
+
diff --git a/examples/manual.c b/examples/manual.c
new file mode 100644
index 0000000..fac6832
--- /dev/null
+++ b/examples/manual.c
@@ -0,0 +1,87 @@
+/**
+ * \file manual.c
+ */
+
+typedef struct Object Object; //!< Object type
+typedef struct Vehicle Vehicle; //!< Vehicle type
+typedef struct Car Car; //!< Car type
+typedef struct Truck Truck; //!< Truck type
+
+/*!
+ * Base object class.
+ */
+struct Object
+{
+ int ref; //!< \private Reference count.
+};
+
+
+/*!
+ * Increments object reference count by one.
+ * \public \memberof Object
+ */
+static Object * objRef(Object *obj);
+
+
+/*!
+ * Decrements object reference count by one.
+ * \public \memberof Object
+ */
+static Object * objUnref(Object *obj);
+
+
+/*!
+ * Vehicle class.
+ * \extends Object
+ */
+struct Vehicle
+{
+ Object base; //!< \protected Base class.
+};
+
+
+/*!
+ * Starts the vehicle.
+ * \public \memberof Vehicle
+ */
+void vehicleStart(Vehicle *obj);
+
+
+/*!
+ * Stops the vehicle.
+ * \public \memberof Vehicle
+ */
+void vehicleStop(Vehicle *obj);
+
+
+/*!
+ * Car class.
+ * \extends Vehicle
+ */
+struct Car
+{
+ Vehicle base; //!< \protected Base class.
+};
+
+
+/*!
+ * Truck class.
+ * \extends Vehicle
+ */
+struct Truck
+{
+ Vehicle base; //!< \protected Base class.
+};
+
+
+/*!
+ * Main function.
+ *
+ * Ref vehicleStart(), objRef(), objUnref().
+ */
+int main(void)
+{
+ Car c;
+ vehicleStart((Vehicle*) &c);
+}
+
diff --git a/examples/manual.cfg b/examples/manual.cfg
new file mode 100644
index 0000000..9359842
--- /dev/null
+++ b/examples/manual.cfg
@@ -0,0 +1,16 @@
+PROJECT_NAME = "Manual inheritance and membership"
+OUTPUT_DIRECTORY = manual
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = manual.c
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+TYPEDEF_HIDES_STRUCT = YES
+INLINE_SOURCES = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+SEARCHENGINE = NO
diff --git a/examples/memgrp.cfg b/examples/memgrp.cfg
new file mode 100644
index 0000000..a69c33c
--- /dev/null
+++ b/examples/memgrp.cfg
@@ -0,0 +1,11 @@
+PROJECT_NAME = "Member Grouping"
+OUTPUT_DIRECTORY = memgrp
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = memgrp.cpp
+QUIET = YES
+DISTRIBUTE_GROUP_DOC = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/memgrp.cpp b/examples/memgrp.cpp
new file mode 100644
index 0000000..394cdbc
--- /dev/null
+++ b/examples/memgrp.cpp
@@ -0,0 +1,41 @@
+/** A class. Details */
+class Test
+{
+ public:
+ //@{
+ /** Same documentation for both members. Details */
+ void func1InGroup1();
+ void func2InGroup1();
+ //@}
+
+ /** Function without group. Details. */
+ void ungroupedFunction();
+ void func1InGroup2();
+ protected:
+ void func2InGroup2();
+};
+
+void Test::func1InGroup1() {}
+void Test::func2InGroup1() {}
+
+/** @name Group2
+ * Description of group 2.
+ */
+//@{
+/** Function 2 in group 2. Details. */
+void Test::func2InGroup2() {}
+/** Function 1 in group 2. Details. */
+void Test::func1InGroup2() {}
+//@}
+
+/*! \file
+ * docs for this file
+ */
+
+//@{
+//! one description for all members of this group
+//! (because DISTRIBUTE_GROUP_DOC is YES in the config file)
+#define A 1
+#define B 2
+void glob_func();
+//@}
diff --git a/examples/mux.cfg b/examples/mux.cfg
new file mode 100644
index 0000000..86abd9e
--- /dev/null
+++ b/examples/mux.cfg
@@ -0,0 +1,14 @@
+PROJECT_NAME = Mux
+OUTPUT_DIRECTORY = mux
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = mux.vhdl
+OPTIMIZE_OUTPUT_VHDL = YES
+QUIET = YES
+INHERIT_DOCS = YES
+EXTRACT_PRIVATE = YES
+HIDE_SCOPE_NAMES = YES
+INHERIT_DOCS = NO
+SEARCHENGINE = NO
diff --git a/examples/mux.vhdl b/examples/mux.vhdl
new file mode 100644
index 0000000..211e56e
--- /dev/null
+++ b/examples/mux.vhdl
@@ -0,0 +1,32 @@
+-------------------------------------------------------
+--! @file
+--! @brief 2:1 Mux using with-select
+-------------------------------------------------------
+
+--! Use standard library
+library ieee;
+--! Use logic elements
+ use ieee.std_logic_1164.all;
+
+--! Mux entity brief description
+
+--! Detailed description of this
+--! mux design element.
+entity mux_using_with is
+ port (
+ din_0 : in std_logic; --! Mux first input
+ din_1 : in std_logic; --! Mux Second input
+ sel : in std_logic; --! Select input
+ mux_out : out std_logic --! Mux output
+ );
+end entity;
+
+--! @brief Architure definition of the MUX
+--! @details More details about this mux element.
+architecture behavior of mux_using_with is
+begin
+ with (sel) select
+ mux_out <= din_0 when '0',
+ din_1 when others;
+end architecture;
+
diff --git a/examples/overload.cfg b/examples/overload.cfg
new file mode 100644
index 0000000..d29cb9c
--- /dev/null
+++ b/examples/overload.cfg
@@ -0,0 +1,11 @@
+PROJECT_NAME = "Overloaded Command"
+OUTPUT_DIRECTORY = overload
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+SORT_MEMBER_DOCS = NO
+INPUT = overload.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/overload.cpp b/examples/overload.cpp
new file mode 100644
index 0000000..02bcced
--- /dev/null
+++ b/examples/overload.cpp
@@ -0,0 +1,25 @@
+class Test
+{
+ public:
+ void drawRect(int,int,int,int);
+ void drawRect(const Rect &r);
+};
+
+void Test::drawRect(int x,int y,int w,int h) {}
+void Test::drawRect(const Rect &r) {}
+
+/*! \class Test
+ * \brief A short description.
+ *
+ * More text.
+ */
+
+/*! \fn void Test::drawRect(int x,int y,int w,int h)
+ * This command draws a rectangle with a left upper corner at ( \a x , \a y ),
+ * width \a w and height \a h.
+ */
+
+/*!
+ * \overload void Test::drawRect(const Rect &r)
+ */
+
diff --git a/examples/page.cfg b/examples/page.cfg
new file mode 100644
index 0000000..cd1ff84
--- /dev/null
+++ b/examples/page.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Page Command"
+OUTPUT_DIRECTORY = page
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = page.doc
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/page.doc b/examples/page.doc
new file mode 100644
index 0000000..747a4b8
--- /dev/null
+++ b/examples/page.doc
@@ -0,0 +1,14 @@
+/*! \page page1 A documentation page
+ Leading text.
+ \section sec An example section
+ This page contains the subsections \ref subsection1 and \ref subsection2.
+ For more info see page \ref page2.
+ \subsection subsection1 The first subsection
+ Text.
+ \subsection subsection2 The second subsection
+ More text.
+*/
+
+/*! \page page2 Another page
+ Even more info.
+*/
diff --git a/examples/par.cfg b/examples/par.cfg
new file mode 100644
index 0000000..de6caa9
--- /dev/null
+++ b/examples/par.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Par Command"
+OUTPUT_DIRECTORY = par
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = par.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/par.cpp b/examples/par.cpp
new file mode 100644
index 0000000..6fd2c4e
--- /dev/null
+++ b/examples/par.cpp
@@ -0,0 +1,20 @@
+/*! \class Test
+ * Normal text.
+ *
+ * \par User defined paragraph:
+ * Contents of the paragraph.
+ *
+ * \par
+ * New paragraph under the same heading.
+ *
+ * \note
+ * This note consists of two paragraphs.
+ * This is the first paragraph.
+ *
+ * \par
+ * And this is the second paragraph.
+ *
+ * More normal text.
+ */
+
+class Test {};
diff --git a/examples/pyexample.cfg b/examples/pyexample.cfg
new file mode 100644
index 0000000..27db0f7
--- /dev/null
+++ b/examples/pyexample.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Python"
+OUTPUT_DIRECTORY = pyexample
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+OPTIMIZE_OUTPUT_JAVA = YES
+INPUT = pyexample.py
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/pyexample.py b/examples/pyexample.py
new file mode 100644
index 0000000..666c25b
--- /dev/null
+++ b/examples/pyexample.py
@@ -0,0 +1,30 @@
+## @package pyexample
+# Documentation for this module.
+#
+# More details.
+
+## Documentation for a function.
+#
+# More details.
+def func():
+ pass
+
+## Documentation for a class.
+#
+# More details.
+class PyClass:
+
+ ## The constructor.
+ def __init__(self):
+ self._memVar = 0;
+
+ ## Documentation for a method.
+ # @param self The object pointer.
+ def PyMethod(self):
+ pass
+
+ ## A class variable.
+ classVar = 0;
+
+ ## @var _memVar
+ # a member variable
diff --git a/examples/qtstyle.cfg b/examples/qtstyle.cfg
new file mode 100644
index 0000000..0a930be
--- /dev/null
+++ b/examples/qtstyle.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Qt Style"
+OUTPUT_DIRECTORY = qtstyle
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = qtstyle.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/qtstyle.cpp b/examples/qtstyle.cpp
new file mode 100644
index 0000000..e24d541
--- /dev/null
+++ b/examples/qtstyle.cpp
@@ -0,0 +1,65 @@
+//! A test class.
+/*!
+ A more elaborate class description.
+*/
+
+class Test
+{
+ public:
+
+ //! An enum.
+ /*! More detailed enum description. */
+ enum TEnum {
+ TVal1, /*!< Enum value TVal1. */
+ TVal2, /*!< Enum value TVal2. */
+ TVal3 /*!< Enum value TVal3. */
+ }
+ //! Enum pointer.
+ /*! Details. */
+ *enumPtr,
+ //! Enum variable.
+ /*! Details. */
+ enumVar;
+
+ //! A constructor.
+ /*!
+ A more elaborate description of the constructor.
+ */
+ Test();
+
+ //! A destructor.
+ /*!
+ A more elaborate description of the destructor.
+ */
+ ~Test();
+
+ //! A normal member taking two arguments and returning an integer value.
+ /*!
+ \param a an integer argument.
+ \param s a constant character pointer.
+ \return The test results
+ \sa Test(), ~Test(), testMeToo() and publicVar()
+ */
+ int testMe(int a,const char *s);
+
+ //! A pure virtual member.
+ /*!
+ \sa testMe()
+ \param c1 the first argument.
+ \param c2 the second argument.
+ */
+ virtual void testMeToo(char c1,char c2) = 0;
+
+ //! A public variable.
+ /*!
+ Details.
+ */
+ int publicVar;
+
+ //! A function variable.
+ /*!
+ Details.
+ */
+ int (*handler)(int a,int b);
+};
+
diff --git a/examples/relates.cfg b/examples/relates.cfg
new file mode 100644
index 0000000..4e1d90b
--- /dev/null
+++ b/examples/relates.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Relates Command"
+OUTPUT_DIRECTORY = relates
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = relates.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/relates.cpp b/examples/relates.cpp
new file mode 100644
index 0000000..c6f7dc9
--- /dev/null
+++ b/examples/relates.cpp
@@ -0,0 +1,23 @@
+/*!
+ * A String class.
+ */
+
+class String
+{
+ friend int strcmp(const String &,const String &);
+};
+
+/*!
+ * Compares two strings.
+ */
+
+int strcmp(const String &s1,const String &s2)
+{
+}
+
+/*! \relates String
+ * A string debug function.
+ */
+void stringDebug()
+{
+}
diff --git a/examples/restypedef.cfg b/examples/restypedef.cfg
new file mode 100644
index 0000000..c55926e
--- /dev/null
+++ b/examples/restypedef.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Resolving Typedefs"
+OUTPUT_DIRECTORY = restypedef
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = restypedef.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/restypedef.cpp b/examples/restypedef.cpp
new file mode 100644
index 0000000..923cf70
--- /dev/null
+++ b/examples/restypedef.cpp
@@ -0,0 +1,25 @@
+/*! \file restypedef.cpp
+ * An example of resolving typedefs.
+ */
+
+/*! \struct CoordStruct
+ * A coordinate pair.
+ */
+struct CoordStruct
+{
+ /*! The x coordinate */
+ float x;
+ /*! The y coordinate */
+ float y;
+};
+
+/*! Creates a type name for CoordStruct */
+typedef CoordStruct Coord;
+
+/*!
+ * This function returns the addition of \a c1 and \a c2, i.e:
+ * (c1.x+c2.x,c1.y+c2.y)
+ */
+Coord add(Coord c1,Coord c2)
+{
+}
diff --git a/examples/structcmd.cfg b/examples/structcmd.cfg
new file mode 100644
index 0000000..f956ad4
--- /dev/null
+++ b/examples/structcmd.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Structural commands"
+OUTPUT_DIRECTORY = structcmd
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = structcmd.h
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/structcmd.h b/examples/structcmd.h
new file mode 100644
index 0000000..3e27029
--- /dev/null
+++ b/examples/structcmd.h
@@ -0,0 +1,57 @@
+/*! \file structcmd.h
+ \brief A Documented file.
+
+ Details.
+*/
+
+/*! \def MAX(a,b)
+ \brief A macro that returns the maximum of \a a and \a b.
+
+ Details.
+*/
+
+/*! \var typedef unsigned int UINT32
+ \brief A type definition for a .
+
+ Details.
+*/
+
+/*! \var int errno
+ \brief Contains the last error code.
+
+ \warning Not thread safe!
+*/
+
+/*! \fn int open(const char *pathname,int flags)
+ \brief Opens a file descriptor.
+
+ \param pathname The name of the descriptor.
+ \param flags Opening flags.
+*/
+
+/*! \fn int close(int fd)
+ \brief Closes the file descriptor \a fd.
+ \param fd The descriptor to close.
+*/
+
+/*! \fn size_t write(int fd,const char *buf, size_t count)
+ \brief Writes \a count bytes from \a buf to the filedescriptor \a fd.
+ \param fd The descriptor to write to.
+ \param buf The data buffer to write.
+ \param count The number of bytes to write.
+*/
+
+/*! \fn int read(int fd,char *buf,size_t count)
+ \brief Read bytes from a file descriptor.
+ \param fd The descriptor to read from.
+ \param buf The buffer to read into.
+ \param count The number of bytes to read.
+*/
+
+#define MAX(a,b) (((a)>(b))?(a):(b))
+typedef unsigned int UINT32;
+int errno;
+int open(const char *,int);
+int close(int);
+size_t write(int,const char *, size_t);
+int read(int,char *,size_t);
diff --git a/examples/tag.cfg b/examples/tag.cfg
new file mode 100644
index 0000000..3627281
--- /dev/null
+++ b/examples/tag.cfg
@@ -0,0 +1,12 @@
+PROJECT_NAME = "Tag Files"
+OUTPUT_DIRECTORY = tag
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = tag.cpp
+TAGFILES = example.tag=../../example/html
+PERL_PATH = perl
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/tag.cpp b/examples/tag.cpp
new file mode 100644
index 0000000..6497dd4
--- /dev/null
+++ b/examples/tag.cpp
@@ -0,0 +1,9 @@
+/*! A class that is inherited from the external class Test.
+*/
+
+class Tag : public Test
+{
+ public:
+ /*! an overloaded member. */
+ void example();
+};
diff --git a/examples/templ.cfg b/examples/templ.cfg
new file mode 100644
index 0000000..c8d9514
--- /dev/null
+++ b/examples/templ.cfg
@@ -0,0 +1,10 @@
+PROJECT_NAME = "Template Test"
+OUTPUT_DIRECTORY = template
+GENERATE_LATEX = NO
+GENERATE_MAN = NO
+GENERATE_RTF = NO
+CASE_SENSE_NAMES = NO
+INPUT = templ.cpp
+QUIET = YES
+JAVADOC_AUTOBRIEF = YES
+SEARCHENGINE = NO
diff --git a/examples/templ.cpp b/examples/templ.cpp
new file mode 100644
index 0000000..9ed48fb
--- /dev/null
+++ b/examples/templ.cpp
@@ -0,0 +1,35 @@
+
+/*! A template class */
+template<class T,int i=100> class Test
+{
+ public:
+ Test();
+ Test(const Test &);
+};
+
+/*! complete specialization */
+template<> class Test<void *,200>
+{
+ public:
+ Test();
+};
+
+/*! A partial template specialization */
+template<class T> class Test<T *> : public Test<void *,200>
+{
+ public:
+ Test();
+};
+
+/*! The constructor of the template class*/
+template<class T,int i> Test<T,i>::Test() {}
+
+/*! The copy constructor */
+template<class T,int i> Test<T,i>::Test(const Test &t) {}
+
+/*! The constructor of the partial specilization */
+template<class T> Test<T *>::Test() {}
+
+/*! The constructor of the specilization */
+template<> Test<void *,200>::Test() {}
+
diff --git a/libmd5/Makefile b/libmd5/Makefile
new file mode 100644
index 0000000..04300dc
--- /dev/null
+++ b/libmd5/Makefile
@@ -0,0 +1,36 @@
+#
+# This file was generated from Makefile.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+DOXYGEN = /Users/dimitri/doxygen
+TMAKEPATH = /Users/dimitri/doxygen/tmake/lib/macosx-c++
+ENV = env TMAKEPATH=$(TMAKEPATH)
+TMAKE = /Users/dimitri/doxygen/tmake/bin/tmake
+MAKE = /opt/local/bin/gmake
+PERL = /opt/local/bin/perl
+RM = rm -f
+CP = cp
+VERSION = 1.7.3
+INSTALL = /usr/local
+INSTTOOL = /opt/local/bin/ginstall
+DOXYDOCS = ..
+DOCDIR = $(INSTALL)/share/doc/packages/doxygen
+QTDIR = /usr
+HAVE_DOT = /usr/local/bin/dot
+MKSPECS = -spec macx-g++
+all: Makefile.libmd5
+ $(MAKE) -f Makefile.libmd5
+
+clean: Makefile.libmd5
+ $(MAKE) -f Makefile.libmd5 clean
+
+distclean: clean
+ $(RM) -f Makefile.libmd5 libmd5.pro Makefile
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) libmd5.pro >Makefile.libmd5
+
+Makefile.libmd5: libmd5.pro
+ $(ENV) $(PERL) $(TMAKE) libmd5.pro >Makefile.libmd5
+
+install:
diff --git a/libmd5/Makefile.in b/libmd5/Makefile.in
new file mode 100644
index 0000000..5f71b11
--- /dev/null
+++ b/libmd5/Makefile.in
@@ -0,0 +1,16 @@
+all: Makefile.libmd5
+ $(MAKE) -f Makefile.libmd5
+
+clean: Makefile.libmd5
+ $(MAKE) -f Makefile.libmd5 clean
+
+distclean: clean
+ $(RM) -f Makefile.libmd5 libmd5.pro Makefile
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) libmd5.pro >Makefile.libmd5
+
+Makefile.libmd5: libmd5.pro
+ $(ENV) $(PERL) $(TMAKE) libmd5.pro >Makefile.libmd5
+
+install:
diff --git a/libmd5/Makefile.libmd5 b/libmd5/Makefile.libmd5
new file mode 100644
index 0000000..3b08d3b
--- /dev/null
+++ b/libmd5/Makefile.libmd5
@@ -0,0 +1,82 @@
+#############################################################################
+# Makefile for building ../lib/libmd5.a
+# Generated by tmake at 15:12, 2011/03/28
+# Project: libmd5
+# Template: lib
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cc
+CXX = c++
+CFLAGS = -pipe -Wall -W -g -fstack-protector
+CXXFLAGS= -pipe -D__FreeBSD__=6 -Wall -W -g -fstack-protector
+INCPATH =
+AR = ar cq
+RANLIB = ranlib
+MOC = /usr/bin/moc
+
+TAR = tar -cf
+GZIP = gzip -9f
+
+####### Files
+
+HEADERS = md5.h \
+ md5_loc.h
+SOURCES = md5.c
+OBJECTS = ../objects/md5.o
+SRCMOC =
+OBJMOC =
+DIST =
+TARGET = ../lib/libmd5.a
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .C .c
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+####### Build rules
+
+all: $(TARGET)
+
+staticlib: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(OBJMOC)
+ -rm -f $(TARGET)
+ $(AR) $(TARGET) $(OBJECTS) $(OBJMOC)
+ ranlib $(TARGET)
+
+moc: $(SRCMOC)
+
+tmake:
+ tmake libmd5.pro
+
+dist:
+ $(TAR) libmd5.tar libmd5.pro $(SOURCES) $(HEADERS) $(DIST)
+ $(GZIP) libmd5.tar
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
+ -rm -f *~ core
+
+####### Compile
+
+../objects/md5.o: md5.c \
+ md5.h \
+ md5_loc.h
+ $(CC) -c $(CFLAGS) $(INCPATH) -o ../objects/md5.o md5.c
+
diff --git a/libmd5/libmd5.pro b/libmd5/libmd5.pro
new file mode 100644
index 0000000..daac1b3
--- /dev/null
+++ b/libmd5/libmd5.pro
@@ -0,0 +1,15 @@
+#
+# This file was generated from libmd5.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+TEMPLATE = lib
+CONFIG = warn_on staticlib debug
+HEADERS = md5.h md5_loc.h
+SOURCES = md5.c
+win32:INCLUDEPATH += .
+win32-g++:TMAKE_CFLAGS += -D__CYGWIN__ -DALL_STATIC
+DESTDIR = ../lib
+TARGET = md5
+OBJECTS_DIR = ../objects
+
+TMAKE_MOC = /usr/bin/moc
diff --git a/libmd5/libmd5.pro.in b/libmd5/libmd5.pro.in
new file mode 100644
index 0000000..8cf7118
--- /dev/null
+++ b/libmd5/libmd5.pro.in
@@ -0,0 +1,10 @@
+TEMPLATE = lib
+CONFIG = warn_on staticlib $extraopts
+HEADERS = md5.h md5_loc.h
+SOURCES = md5.c
+win32:INCLUDEPATH += .
+win32-g++:TMAKE_CFLAGS += -D__CYGWIN__ -DALL_STATIC
+DESTDIR = ../lib
+TARGET = md5
+OBJECTS_DIR = ../objects
+
diff --git a/libmd5/md5.c b/libmd5/md5.c
new file mode 100644
index 0000000..0763598
--- /dev/null
+++ b/libmd5/md5.c
@@ -0,0 +1,313 @@
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ *
+ * Changed so as no longer to depend on Colin Plumb's `usual.h' header
+ * definitions; now uses stuff from dpkg's config.h.
+ * - Ian Jackson <ian@chiark.greenend.org.uk>.
+ * Still in the public domain.
+ */
+
+#include <string.h> /* for memcpy() */
+#include <sys/types.h> /* for stupid systems */
+
+#include "md5.h"
+
+void
+MD5Transform(UWORD32 buf[4], UWORD32 const in[16]);
+
+int g_bigEndian = 0;
+int g_endianessDetected = 0;
+
+static void
+detectEndianess()
+{
+ int nl = 0x12345678;
+ short ns = 0x1234;
+
+ unsigned char *p = (unsigned char *)(&nl);
+ unsigned char *sp = (unsigned char *)(&ns);
+
+ if (g_endianessDetected) return;
+ if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 )
+ {
+ g_bigEndian = 1;
+ }
+ else if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 )
+ {
+ g_bigEndian = 0;
+ }
+ else
+ {
+ g_bigEndian = *sp != 0x12;
+ }
+
+ g_endianessDetected=1;
+}
+
+static void
+byteSwap(UWORD32 *buf, unsigned words)
+{
+ md5byte *p;
+
+ if (!g_bigEndian) return;
+
+ p = (md5byte *)buf;
+
+ do {
+ *buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 |
+ ((unsigned)p[1] << 8 | p[0]);
+ p += 4;
+ } while (--words);
+}
+
+/*
+ * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
+ * initialization constants.
+ */
+void
+MD5Init(struct MD5Context *ctx)
+{
+ detectEndianess();
+
+ ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+ ctx->buf[2] = 0x98badcfe;
+ ctx->buf[3] = 0x10325476;
+
+ ctx->bytes[0] = 0;
+ ctx->bytes[1] = 0;
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void
+MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len)
+{
+ UWORD32 t;
+
+ /* Update byte count */
+
+ t = ctx->bytes[0];
+ if ((ctx->bytes[0] = t + len) < t)
+ ctx->bytes[1]++; /* Carry from low to high */
+
+ t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */
+ if (t > len) {
+ memcpy((md5byte *)ctx->in + 64 - t, buf, len);
+ return;
+ }
+ /* First chunk is an odd size */
+ memcpy((md5byte *)ctx->in + 64 - t, buf, t);
+ byteSwap(ctx->in, 16);
+ MD5Transform(ctx->buf, ctx->in);
+ buf += t;
+ len -= t;
+
+ /* Process data in 64-byte chunks */
+ while (len >= 64) {
+ memcpy(ctx->in, buf, 64);
+ byteSwap(ctx->in, 16);
+ MD5Transform(ctx->buf, ctx->in);
+ buf += 64;
+ len -= 64;
+ }
+
+ /* Handle any remaining bytes of data. */
+ memcpy(ctx->in, buf, len);
+}
+
+/*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+void
+MD5Final(md5byte digest[16], struct MD5Context *ctx)
+{
+ int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */
+ md5byte *p = (md5byte *)ctx->in + count;
+
+ /* Set the first char of padding to 0x80. There is always room. */
+ *p++ = 0x80;
+
+ /* Bytes of padding needed to make 56 bytes (-8..55) */
+ count = 56 - 1 - count;
+
+ if (count < 0) { /* Padding forces an extra block */
+ memset(p, 0, count + 8);
+ byteSwap(ctx->in, 16);
+ MD5Transform(ctx->buf, ctx->in);
+ p = (md5byte *)ctx->in;
+ count = 56;
+ }
+ memset(p, 0, count);
+ byteSwap(ctx->in, 14);
+
+ /* Append length in bits and transform */
+ ctx->in[14] = ctx->bytes[0] << 3;
+ ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
+ MD5Transform(ctx->buf, ctx->in);
+
+ byteSwap(ctx->buf, 4);
+ memcpy(digest, ctx->buf, 16);
+ memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
+}
+
+#ifndef ASM_MD5
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f,w,x,y,z,in,s) \
+ (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
+
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data. MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+void
+MD5Transform(UWORD32 buf[4], UWORD32 const in[16])
+{
+ register UWORD32 a, b, c, d;
+
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+ MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+ MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
+ MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+ MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+ MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+ MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
+ MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
+ MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
+ MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+ MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+ MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+ MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
+ MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
+ MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
+ MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
+
+ MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+ MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
+ MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+ MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+ MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+ MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
+ MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+ MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+ MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+ MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+ MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+ MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+ MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+ MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+ MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+ MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+
+ MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+ MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
+ MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+ MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+ MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+ MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+ MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+ MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+ MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+ MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+ MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+ MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
+ MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+ MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+ MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+ MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+
+ MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
+ MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
+ MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+ MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+ MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+ MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+ MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+ MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+ MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+ MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+ MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
+ MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+ MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+ MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+ MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+ MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
+}
+
+#endif
+
+void MD5Buffer (const unsigned char *buf,unsigned int len,unsigned char sig[16])
+{
+ struct MD5Context md5;
+ MD5Init(&md5);
+ MD5Update(&md5,buf,len);
+ MD5Final(sig,&md5);
+}
+
+#define HEX_STRING "0123456789abcdef" /* to convert to hex */
+
+void MD5SigToString(unsigned char signature[16],char *str,int len)
+{
+ unsigned char *sig_p;
+ char *str_p, *max_p;
+ unsigned int high, low;
+
+ str_p = str;
+ max_p = str + len;
+
+ for (sig_p = (unsigned char *)signature;
+ sig_p < (unsigned char *)signature + 16;
+ sig_p++)
+ {
+ high = *sig_p / 16;
+ low = *sig_p % 16;
+ /* account for 2 chars */
+ if (str_p + 1 >= max_p) {
+ break;
+ }
+ *str_p++ = HEX_STRING[high];
+ *str_p++ = HEX_STRING[low];
+ }
+ /* account for 2 chars */
+ if (str_p < max_p) {
+ *str_p++ = '\0';
+ }
+}
+
+
diff --git a/libmd5/md5.h b/libmd5/md5.h
new file mode 100644
index 0000000..03f8ff6
--- /dev/null
+++ b/libmd5/md5.h
@@ -0,0 +1,57 @@
+/*
+ * This is the header file for the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ *
+ * Changed so as no longer to depend on Colin Plumb's `usual.h'
+ * header definitions; now uses stuff from dpkg's config.h
+ * - Ian Jackson <ian@chiark.greenend.org.uk>.
+ * Still in the public domain.
+ */
+
+#ifndef MD5_H
+#define MD5_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "md5_loc.h"
+
+#define md5byte unsigned char
+
+//#if SIZEOF_UNSIGNED_LONG==4
+//# define UWORD32 unsigned long
+//#elif SIZEOF_UNSIGNED_INT==4
+//#else
+//# error I do not know what to use for a UWORD32.
+//#endif
+
+struct MD5Context {
+ UWORD32 buf[4];
+ UWORD32 bytes[2];
+ UWORD32 in[16];
+};
+
+void MD5Init(struct MD5Context *context);
+void MD5Update(struct MD5Context *context, md5byte const *buf, unsigned len);
+void MD5Final(unsigned char digest[16], struct MD5Context *context);
+void MD5Buffer (const unsigned char *buf,unsigned int len,unsigned char sig[16]);
+void MD5SigToString(unsigned char sig[16],char *str,int len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !MD5_H */
diff --git a/libmd5/md5_loc.h b/libmd5/md5_loc.h
new file mode 100644
index 0000000..ef67c02
--- /dev/null
+++ b/libmd5/md5_loc.h
@@ -0,0 +1,6 @@
+#ifndef _MD5LOC_H
+#define _MD5LOC_H
+
+# define UWORD32 unsigned int
+
+#endif
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
new file mode 100644
index 0000000..da88e67
--- /dev/null
+++ b/packages/rpm/doxygen.spec
@@ -0,0 +1,104 @@
+%define version 1.7.3
+%define revision 1
+%define mmn 1
+%define name doxygen
+
+# optionally pass --with-doxywizard to rpmbuild
+
+%define contentdir /var/www
+%define suexec_caller doxygen
+%define buildroot /var/tmp/%{name}-%{version}-%{revision}root
+
+Summary: A documentation system for C/C++.
+Name: doxygen
+Version: %{version}
+Release: %{revision}
+URL: http://www.stack.nl/~dimitri/doxygen/index.html
+Vendor: Dimitri van Heesch
+License: GNU General Public License
+Group: Development/Tools
+Source: %{name}-%{version}.src.tar.gz
+BuildRoot: %{buildroot}
+BuildPrereq: libstdc++-devel >= 2.96, /usr/bin/perl, /usr/bin/latex, /usr/bin/dvips, /usr/bin/gs
+Prereq: /sbin/chkconfig, /bin/mktemp, /bin/rm, /bin/mv, libstdc++ >= 2.96
+Provides: doxygen = %{mmn}
+
+%description
+Doxygen can generate an online class browser (in HTML) and/or a
+reference manual (in LaTeX) from a set of documented source files. The
+documentation is extracted directly from the sources. Doxygen can
+also be configured to extract the code structure from undocumented
+source files.
+
+%if %{?_with_doxywizard:1}%{!?_with_doxywizard:0}
+%package doxywizard
+Group: Development/Libraries
+Summary: GUI Interface for doxygen.
+Requires: doxygen = %{mmn}
+Requires: qt >= 3.3
+Provides: doxywizard = %{mmn}
+# Obsoletes:
+
+%description doxywizard
+Doxygen can generate an online class browser (in HTML) and/or a
+reference manual (in LaTeX) from a set of documented source files. The
+documentation is extracted directly from the sources. Doxygen can
+also be configured to extract the code structure from undocumented
+source files.
+
+This is the GUI interface for doxygen. It requires qt and X11 to
+install.
+%endif
+
+%prep
+%setup -q -n %{name}-%{version}
+./configure %{?_with_doxywizard} --prefix $RPM_BUILD_ROOT/usr
+
+%build
+make %{?_smp_mflags}
+make %{?_smp_mflags} pdf
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+
+%doc README LICENSE LANGUAGE.HOWTO examples ./latex/*.pdf
+%doc /usr/man/man1/doxygen.1.gz
+%doc /usr/man/man1/doxytag.1.gz
+
+%{_bindir}/doxygen
+%{_bindir}/doxytag
+
+%if %{?_with_doxywizard:1}%{!?_with_doxywizard:0}
+%files doxywizard
+%defattr(-,root,root)
+%{_bindir}/doxywizard
+%doc /usr/man/man1/doxywizard.1.gz
+%endif
+
+%changelog
+* Fri Apr 18 2008 Kenneth Porter <shiva+doxygenspec@sewingwitch.com> 1.5.5-1
+- consolidate with and without doxywizard spec files with rpm macro
+- add gs BuildPrereq
+
+* Sun Nov 18 2007 Kevin McBride <kevin@planetsaphire.com> 1.5.4
+- consolidated manual package in lieu of --excludedocs flag for rpm --install
+
+* Mon Oct 10 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.5
+- fixed versioning bugs.
+
+* Tue Oct 4 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.5
+- added obsoletes and proides sections.
+
+* Sun Sep 20 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.4
+- modified rpm spec file for Fedora Core acceptance criteria.
+
+* Sun Aug 7 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.4
+- created initial rpm spec file for doxygen-1.4.4
+
diff --git a/packages/rpm/doxygen.spec.in b/packages/rpm/doxygen.spec.in
new file mode 100644
index 0000000..c97b229
--- /dev/null
+++ b/packages/rpm/doxygen.spec.in
@@ -0,0 +1,101 @@
+%define name doxygen
+
+# optionally pass --with-doxywizard to rpmbuild
+
+%define contentdir /var/www
+%define suexec_caller doxygen
+%define buildroot /var/tmp/%{name}-%{version}-%{revision}root
+
+Summary: A documentation system for C/C++.
+Name: doxygen
+Version: %{version}
+Release: %{revision}
+URL: http://www.stack.nl/~dimitri/doxygen/index.html
+Vendor: Dimitri van Heesch
+License: GNU General Public License
+Group: Development/Tools
+Source: %{name}-%{version}.src.tar.gz
+BuildRoot: %{buildroot}
+BuildPrereq: libstdc++-devel >= 2.96, /usr/bin/perl, /usr/bin/latex, /usr/bin/dvips, /usr/bin/gs
+Prereq: /sbin/chkconfig, /bin/mktemp, /bin/rm, /bin/mv, libstdc++ >= 2.96
+Provides: doxygen = %{mmn}
+
+%description
+Doxygen can generate an online class browser (in HTML) and/or a
+reference manual (in LaTeX) from a set of documented source files. The
+documentation is extracted directly from the sources. Doxygen can
+also be configured to extract the code structure from undocumented
+source files.
+
+%if %{?_with_doxywizard:1}%{!?_with_doxywizard:0}
+%package doxywizard
+Group: Development/Libraries
+Summary: GUI Interface for doxygen.
+Requires: doxygen = %{mmn}
+Requires: qt >= 3.3
+Provides: doxywizard = %{mmn}
+# Obsoletes:
+
+%description doxywizard
+Doxygen can generate an online class browser (in HTML) and/or a
+reference manual (in LaTeX) from a set of documented source files. The
+documentation is extracted directly from the sources. Doxygen can
+also be configured to extract the code structure from undocumented
+source files.
+
+This is the GUI interface for doxygen. It requires qt and X11 to
+install.
+%endif
+
+%prep
+%setup -q -n %{name}-%{version}
+./configure %{?_with_doxywizard} --prefix $RPM_BUILD_ROOT/usr
+
+%build
+make %{?_smp_mflags}
+make %{?_smp_mflags} pdf
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+
+%doc README LICENSE LANGUAGE.HOWTO examples ./latex/*.pdf
+%doc /usr/man/man1/doxygen.1.gz
+%doc /usr/man/man1/doxytag.1.gz
+
+%{_bindir}/doxygen
+%{_bindir}/doxytag
+
+%if %{?_with_doxywizard:1}%{!?_with_doxywizard:0}
+%files doxywizard
+%defattr(-,root,root)
+%{_bindir}/doxywizard
+%doc /usr/man/man1/doxywizard.1.gz
+%endif
+
+%changelog
+* Fri Apr 18 2008 Kenneth Porter <shiva+doxygenspec@sewingwitch.com> 1.5.5-1
+- consolidate with and without doxywizard spec files with rpm macro
+- add gs BuildPrereq
+
+* Sun Nov 18 2007 Kevin McBride <kevin@planetsaphire.com> 1.5.4
+- consolidated manual package in lieu of --excludedocs flag for rpm --install
+
+* Mon Oct 10 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.5
+- fixed versioning bugs.
+
+* Tue Oct 4 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.5
+- added obsoletes and proides sections.
+
+* Sun Sep 20 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.4
+- modified rpm spec file for Fedora Core acceptance criteria.
+
+* Sun Aug 7 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.4
+- created initial rpm spec file for doxygen-1.4.4
+
diff --git a/packaging/doxygen-1.7.1-config.patch b/packaging/doxygen-1.7.1-config.patch
new file mode 100644
index 0000000..f6be5b9
--- /dev/null
+++ b/packaging/doxygen-1.7.1-config.patch
@@ -0,0 +1,95 @@
+diff -up doxygen-1.7.1/addon/doxywizard/Makefile.in.config doxygen-1.7.1/addon/doxywizard/Makefile.in
+--- doxygen-1.7.1/addon/doxywizard/Makefile.in.config 2010-05-23 16:51:31.000000000 +0200
++++ doxygen-1.7.1/addon/doxywizard/Makefile.in 2010-07-19 13:38:33.000000000 +0200
+@@ -10,8 +10,6 @@
+ # See the GNU General Public License for more details.
+ #
+
+-QMAKE=qmake $(MKSPECS)
+-
+ all: Makefile.doxywizard
+ $(MAKE) -f Makefile.doxywizard
+
+@@ -29,11 +27,11 @@ distclean: Makefile.doxywizard
+ $(RM) Makefile.doxywizard
+
+ install:
+- $(INSTTOOL) -d $(INSTALL)/bin
+- $(INSTTOOL) -m 755 ../../bin/doxywizard $(INSTALL)/bin
+- $(INSTTOOL) -d $(INSTALL)/$(MAN1DIR)
++ $(INSTTOOL) -d $(DESTDIR)$(INSTALL)/bin
++ $(INSTTOOL) -m 755 ../../bin/doxywizard $(DESTDIR)$(INSTALL)/bin
++ $(INSTTOOL) -d $(DESTDIR)$(INSTALL)/$(MAN1DIR)
+ cat ../../doc/doxywizard.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > doxywizard.1
+- $(INSTTOOL) -m 644 doxywizard.1 $(INSTALL)/$(MAN1DIR)/doxywizard.1
++ $(INSTTOOL) -m 644 doxywizard.1 $(DESTDIR)$(INSTALL)/$(MAN1DIR)/doxywizard.1
+ rm doxywizard.1
+
+ FORCE:
+diff -up doxygen-1.7.1/configure.config doxygen-1.7.1/configure
+--- doxygen-1.7.1/configure.config 2010-06-25 11:46:38.000000000 +0200
++++ doxygen-1.7.1/configure 2010-07-19 12:03:53.000000000 +0200
+@@ -268,9 +268,10 @@ if test "$f_wizard" = YES; then
+ if test -z "$QTDIR"; then
+ echo " QTDIR environment variable not set!"
+ echo -n " Checking for Qt..."
+- for d in /usr/{lib,share,qt}/{qt-4,qt4,qt,qt*,4} /usr; do
++ for d in /usr/{lib64,lib,share,qt}/{qt-4,qt4,qt,qt*,4} /usr; do
+ if test -x "$d/bin/qmake"; then
+ QTDIR=$d
++ QMAKE=$d/bin/qmake
+ fi
+ done
+ else
+@@ -485,6 +486,8 @@ INSTTOOL = $f_insttool
+ DOXYDOCS = ..
+ DOCDIR = $f_docdir
+ QTDIR = $QTDIR
++QMAKE = $QMAKE
++MAN1DIR = share/man/man1
+ EOF
+
+ if test "$f_dot" != NO; then
+diff -up doxygen-1.7.1/Makefile.in.config doxygen-1.7.1/Makefile.in
+--- doxygen-1.7.1/Makefile.in.config 2009-08-20 21:41:13.000000000 +0200
++++ doxygen-1.7.1/Makefile.in 2010-07-19 12:03:53.000000000 +0200
+@@ -44,8 +44,6 @@ distclean: clean
+
+ DATE=$(shell date "+%B %Y")
+
+-MAN1DIR = man/man1
+-
+ install: doxywizard_install
+ $(INSTTOOL) -d $(DESTDIR)/$(INSTALL)/bin
+ $(INSTTOOL) -m 755 bin/doxygen $(DESTDIR)/$(INSTALL)/bin
+diff -up doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf.config doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf
+--- doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf.config 2008-12-06 14:16:20.000000000 +0100
++++ doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf 2010-07-19 12:03:53.000000000 +0200
+@@ -11,7 +11,7 @@ TMAKE_CC = gcc
+ TMAKE_CFLAGS = -pipe
+ TMAKE_CFLAGS_WARN_ON = -Wall -W -fno-exceptions
+ TMAKE_CFLAGS_WARN_OFF =
+-TMAKE_CFLAGS_RELEASE = -O2
++TMAKE_CFLAGS_RELEASE = $(RPM_OPT_FLAGS)
+ TMAKE_CFLAGS_DEBUG = -g
+ TMAKE_CFLAGS_SHLIB = -fPIC
+ TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+@@ -27,12 +27,12 @@ TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YAC
+
+ TMAKE_INCDIR =
+ TMAKE_LIBDIR =
+-TMAKE_INCDIR_X11 = /usr/X11R6/include
+-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+-TMAKE_INCDIR_QT = $(QTDIR)/include
+-TMAKE_LIBDIR_QT = $(QTDIR)/lib
+-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
++TMAKE_INCDIR_X11 =
++TMAKE_LIBDIR_X11 =
++TMAKE_INCDIR_QT =
++TMAKE_LIBDIR_QT =
++TMAKE_INCDIR_OPENGL =
++TMAKE_LIBDIR_OPENGL =
+
+ TMAKE_LINK = g++
+ TMAKE_LINK_SHLIB = g++
diff --git a/packaging/doxygen.changes b/packaging/doxygen.changes
new file mode 100644
index 0000000..b4a43fb
--- /dev/null
+++ b/packaging/doxygen.changes
@@ -0,0 +1,11 @@
+* Thu Jun 21 2012 Anas Nashif <anas.nashif@intel.com> 73c4132
+- change tarball name to make gbs work
+
+* Wed May 30 2012 Ryan Ware <ryan.r.ware@intel.com> b141332
+- Add default Smack manifest for doxygen.spec
+
+* Mon May 21 2012 Kim Kibum <kb0929.kim@samsung.com> e28059a
+- Upload Tizen:Base source
+[ Hyesook Choi ]
+- Initial empty repository
+
diff --git a/packaging/doxygen.manifest b/packaging/doxygen.manifest
new file mode 100644
index 0000000..017d22d
--- /dev/null
+++ b/packaging/doxygen.manifest
@@ -0,0 +1,5 @@
+<manifest>
+ <request>
+ <domain name="_"/>
+ </request>
+</manifest>
diff --git a/packaging/doxygen.spec b/packaging/doxygen.spec
new file mode 100644
index 0000000..0b85818
--- /dev/null
+++ b/packaging/doxygen.spec
@@ -0,0 +1,48 @@
+
+Name: doxygen
+Version: 1.7.4
+Release: 1
+License: GPLv2+
+Group: Development/Tools
+Summary: Automated C, C++, and Java Documentation Generator
+Url: http://www.stack.nl/~dimitri/doxygen/
+Source: http://ftp.stack.nl/pub/users/dimitri/doxygen-%{version}.tar.gz
+Source1001: packaging/doxygen.manifest
+Patch0: doxygen-1.7.1-config.patch
+BuildRequires: gettext-tools
+BuildRequires: flex
+BuildRequires: bison
+%description
+Doxygen is a documentation system for C, C++, Java, and IDL. It can
+generate an online class browser (in HTML) and an offline reference
+manual (in LaTeX) from a set of documented source files. The
+documentation is extracted directly from the sources. Doxygen is
+developed on a Linux platform, but it runs on most other UNIX flavors
+as well. An executable for Windows 95/NT is also available.
+
+%prep
+%setup -q
+%patch0 -p1
+
+%build
+cp %{SOURCE1001} .
+unset QTDIR
+./configure \
+ --prefix %{_prefix} \
+ --shared \
+ --release
+make %{?jobs:-j%jobs}
+
+%install
+%make_install
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%manifest doxygen.manifest
+%defattr(-,root,root)
+%attr(444,root,root) %doc %{_mandir}/man1/doxygen.1.*
+%attr(444,root,root) %doc %{_mandir}/man1/doxytag.1.*
+%attr(755,root,root) /usr/bin/*
+
diff --git a/qtools/Doxyfile b/qtools/Doxyfile
new file mode 100644
index 0000000..329fb48
--- /dev/null
+++ b/qtools/Doxyfile
@@ -0,0 +1,277 @@
+# Doxyfile 1.7.2
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = Qtools
+PROJECT_NUMBER =
+OUTPUT_DIRECTORY = ../qtools_docs
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF =
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = $(PWD)/
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = YES
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 8
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+SUBGROUPING = YES
+TYPEDEF_HIDES_STRUCT = NO
+SYMBOL_CACHE_SIZE = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = NO
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = 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 = NO
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+#---------------------------------------------------------------------------
+# 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 = .
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *.h \
+ *.cpp \
+ *.doc
+RECURSIVE = NO
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 4
+IGNORE_PREFIX = Q
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT =
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = YES
+HTML_ALIGN_MEMBERS = YES
+HTML_DYNAMIC_SECTIONS = NO
+GENERATE_DOCSET = YES
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = YES
+QCH_FILE =
+QHP_NAMESPACE = com.qtools
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = YES
+ECLIPSE_DOC_ID = org.doxygen.qtools
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = YES
+USE_INLINE_TREES = NO
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+SEARCHENGINE = YES
+SERVER_BASED_SEARCH = YES
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = YES
+LATEX_OUTPUT =
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = YES
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT =
+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_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+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 = YES
+EXPAND_ONLY_PREDEF = YES
+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 = ../qtools_docs/qtools.tag
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = NO
+MSCGEN_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = FreeSans.ttf
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = YES
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = YES
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = NO
diff --git a/qtools/LICENSE.GPL b/qtools/LICENSE.GPL
new file mode 100644
index 0000000..935a2a0
--- /dev/null
+++ b/qtools/LICENSE.GPL
@@ -0,0 +1,349 @@
+
+ The Qt GUI Toolkit is Copyright (C) 1994-2000 Trolltech AS.
+
+ You may use, distribute and copy the Qt GUI Toolkit under the terms of
+ GNU General Public License version 2, which is display below.
+
+-------------------------------------------------------------------------
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, 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
+
+ Appendix: 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., 675 Mass Ave, Cambridge, MA 02139, 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/qtools/LICENSE.QPL b/qtools/LICENSE.QPL
new file mode 100644
index 0000000..ecdad6e
--- /dev/null
+++ b/qtools/LICENSE.QPL
@@ -0,0 +1,103 @@
+ THE Q PUBLIC LICENSE
+ version 1.0
+
+ Copyright (C) 1999-2000 Trolltech AS, Norway.
+ Everyone is permitted to copy and
+ distribute this license document.
+
+The intent of this license is to establish freedom to share and change the
+software regulated by this license under the open source model.
+
+This license applies to any software containing a notice placed by the
+copyright holder saying that it may be distributed under the terms of
+the Q Public License version 1.0. Such software is herein referred to as
+the Software. This license covers modification and distribution of the
+Software, use of third-party application programs based on the Software,
+and development of free software which uses the Software.
+
+ Granted Rights
+
+1. You are granted the non-exclusive rights set forth in this license
+ provided you agree to and comply with any and all conditions in this
+ license. Whole or partial distribution of the Software, or software
+ items that link with the Software, in any form signifies acceptance of
+ this license.
+
+2. You may copy and distribute the Software in unmodified form provided
+ that the entire package, including - but not restricted to - copyright,
+ trademark notices and disclaimers, as released by the initial developer
+ of the Software, is distributed.
+
+3. You may make modifications to the Software and distribute your
+ modifications, in a form that is separate from the Software, such as
+ patches. The following restrictions apply to modifications:
+
+ a. Modifications must not alter or remove any copyright notices in
+ the Software.
+
+ b. When modifications to the Software are released under this
+ license, a non-exclusive royalty-free right is granted to the
+ initial developer of the Software to distribute your modification
+ in future versions of the Software provided such versions remain
+ available under these terms in addition to any other license(s) of
+ the initial developer.
+
+4. You may distribute machine-executable forms of the Software or
+ machine-executable forms of modified versions of the Software, provided
+ that you meet these restrictions:
+
+ a. You must include this license document in the distribution.
+
+ b. You must ensure that all recipients of the machine-executable forms
+ are also able to receive the complete machine-readable source code
+ to the distributed Software, including all modifications, without
+ any charge beyond the costs of data transfer, and place prominent
+ notices in the distribution explaining this.
+
+ c. You must ensure that all modifications included in the
+ machine-executable forms are available under the terms of this
+ license.
+
+5. You may use the original or modified versions of the Software to
+ compile, link and run application programs legally developed by you
+ or by others.
+
+6. You may develop application programs, reusable components and other
+ software items that link with the original or modified versions of the
+ Software. These items, when distributed, are subject to the following
+ requirements:
+
+ a. You must ensure that all recipients of machine-executable forms of
+ these items are also able to receive and use the complete
+ machine-readable source code to the items without any charge
+ beyond the costs of data transfer.
+
+ b. You must explicitly license all recipients of your items to use
+ and re-distribute original and modified versions of the items in
+ both machine-executable and source code forms. The recipients must
+ be able to do so without any charges whatsoever, and they must be
+ able to re-distribute to anyone they choose.
+
+
+ c. If the items are not available to the general public, and the
+ initial developer of the Software requests a copy of the items,
+ then you must supply one.
+
+ Limitations of Liability
+
+In no event shall the initial developers or copyright holders be liable
+for any damages whatsoever, including - but not restricted to - lost
+revenue or profits or other direct, indirect, special, incidental or
+consequential damages, even if they have been advised of the possibility
+of such damages, except to the extent invariable law, if any, provides
+otherwise.
+
+ No Warranty
+
+The Software and this license document are provided AS IS with NO WARRANTY
+OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE.
+ Choice of Law
+
+This license is governed by the Laws of Norway. Disputes shall be settled
+by Oslo City Court.
diff --git a/qtools/Makefile b/qtools/Makefile
new file mode 100644
index 0000000..c0cf102
--- /dev/null
+++ b/qtools/Makefile
@@ -0,0 +1,50 @@
+#
+# This file was generated from Makefile.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+DOXYGEN = /Users/dimitri/doxygen
+TMAKEPATH = /Users/dimitri/doxygen/tmake/lib/macosx-c++
+ENV = env TMAKEPATH=$(TMAKEPATH)
+TMAKE = /Users/dimitri/doxygen/tmake/bin/tmake
+MAKE = /opt/local/bin/gmake
+PERL = /opt/local/bin/perl
+RM = rm -f
+CP = cp
+VERSION = 1.7.3
+INSTALL = /usr/local
+INSTTOOL = /opt/local/bin/ginstall
+DOXYDOCS = ..
+DOCDIR = $(INSTALL)/share/doc/packages/doxygen
+QTDIR = /usr
+HAVE_DOT = /usr/local/bin/dot
+MKSPECS = -spec macx-g++
+#
+#
+#
+# Copyright (C) 1997-2000 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+
+all: Makefile.qtools Makefile
+ $(MAKE) -f Makefile.qtools $@
+
+Makefile.qtools: qtools.pro
+ $(ENV) $(PERL) $(TMAKE) qtools.pro >Makefile.qtools
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) qtools.pro >Makefile.qtools
+
+clean: Makefile.qtools
+ $(MAKE) -f Makefile.qtools clean
+
+distclean: clean
+
+FORCE:
diff --git a/qtools/Makefile.in b/qtools/Makefile.in
new file mode 100644
index 0000000..78710fd
--- /dev/null
+++ b/qtools/Makefile.in
@@ -0,0 +1,30 @@
+#
+#
+#
+# Copyright (C) 1997-2000 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+
+all: Makefile.qtools Makefile
+ $(MAKE) -f Makefile.qtools $@
+
+Makefile.qtools: qtools.pro
+ $(ENV) $(PERL) $(TMAKE) qtools.pro >Makefile.qtools
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) qtools.pro >Makefile.qtools
+
+clean: Makefile.qtools
+ $(MAKE) -f Makefile.qtools clean
+
+distclean: clean
+
+FORCE:
diff --git a/qtools/README b/qtools/README
new file mode 100644
index 0000000..1e7fc8d
--- /dev/null
+++ b/qtools/README
@@ -0,0 +1,4 @@
+This directory contains a small subset of Troll-Tech's Qt library
+The subset is enough to build the doxygen executable, but lacks many of
+the features found in the Qt library. See http://www.trolltech.com
+for the full package.
diff --git a/qtools/qarray.doc b/qtools/qarray.doc
new file mode 100644
index 0000000..6914dbc
--- /dev/null
+++ b/qtools/qarray.doc
@@ -0,0 +1,486 @@
+/****************************************************************************
+**
+**
+** QArray class documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+
+/*****************************************************************************
+ QArray documentation
+ *****************************************************************************/
+
+/*!
+ \class QArray qarray.h
+ \brief The QArray class is a template class that provides arrays of simple types.
+
+ \ingroup tools
+
+ QArray is implemented as a template class. Define a template
+ instance QArray\<X\> to create an array that contains X items.
+
+ QArray stores the array elements directly in the array. It can only
+ deal with simple types, i.e. C++ types, structs and classes that have
+ no constructors, destructors or virtual functions. QArray uses
+ bitwise operations to copy and compare array elements.
+
+ The QVector collection class is also a kind of array. Like most
+ \link collection.html collection classes\endlink, it has pointers to the
+ contained items.
+
+ QArray uses explicit \link shclass.html sharing\endlink with a reference
+ count. If more than one array share common data, and one array is
+ modified, all arrays will be modified.
+
+ The benefit of sharing is that a program does not need to duplicate
+ data when it is not required, which results in less memory usage and
+ less copying of data.
+
+ Example:
+ \code
+ #include <qarray.h>
+ #include <stdio.h>
+
+ QArray<int> fib( int num ) // returns fibonacci array
+ {
+ ASSERT( num > 2 );
+ QArray<int> f( num ); // array of ints
+
+ f[0] = f[1] = 1; // initialize first two numbers
+ for ( int i=2; i<num; i++ )
+ f[i] = f[i-1] + f[i-2];
+
+ return f;
+ }
+
+ void main()
+ {
+ QArray<int> a = fib( 6 ); // get 6 first fibonaccis
+ int i;
+
+ for ( i=0; i<a.size(); i++ ) // print them
+ prinf( "%d: %d\n", i, a[i] );
+
+ printf( "1 is found %d time(s)\n", a.contains(1) );
+ printf( "5 is found at index %d\n", a.find(5) );
+ }
+ \endcode
+
+ Program output:
+ \code
+ 0: 1
+ 1: 1
+ 2: 2
+ 3: 3
+ 4: 5
+ 5: 8
+ 1 is found 2 times
+ 5 is found at index 4
+ \endcode
+
+ Note about using QArray for manipulating structs or classes:
+ Compilers will often pad the size of structs of odd sizes up to the
+ nearest word boundary. This will then be the size QArray will use
+ for its bitwise element comparisons. Since the remaining bytes will
+ typically be uninitialized, this can cause find() etc. to fail to
+ find the element. Example:
+
+ \code
+ struct MyStruct
+ {
+ short i; // 2 bytes
+ char c; // 1 byte
+ }; // sizeof(MyStruct) may be padded to 4 bytes
+
+ QArray<MyStruct> a(1);
+ a[0].i = 5;
+ a[0].c = 't';
+
+ MyStruct x;
+ x.i = '5';
+ x.c = 't';
+ int i = a.find( x ); // May return -1 if the pad bytes differ
+ \endcode
+
+ To workaround this, make sure that you use a struct where sizeof()
+ returns the same as the sum of the sizes of the members, either by
+ changing the types of the struct members or by adding dummy members.
+
+ \sa \link shclass.html Shared Classes\endlink
+*/
+
+
+/*!
+ \fn QArray::QArray()
+ Constructs a null array.
+ \sa isNull()
+*/
+
+/*!
+ \fn QArray::QArray( int size )
+ Constructs an array with room for \e size elements.
+ Makes a null array if \e size == 0.
+
+ Note that the elements are not initialized.
+
+ \sa resize(), isNull()
+*/
+
+/*!
+ \fn QArray::QArray( const QArray<type> &a )
+ Constructs a shallow copy of \e a.
+ \sa assign()
+*/
+
+/*!
+ \fn QArray::QArray( int, int )
+ Constructs an array <em>without allocating</em> array space.
+ The arguments should be (0, 0). Use at own risk.
+*/
+
+/*!
+ \fn QArray::~QArray()
+ Dereferences the array data and deletes it if this was the last
+ reference.
+*/
+
+/*!
+ \fn QArray<type> &QArray::operator=( const QArray<type> &a )
+ Assigns a shallow copy of \e a to this array and returns a reference
+ to this array.
+
+ Equivalent to assign( a ).
+*/
+
+/*!
+ \fn type *QArray::data() const
+ Returns a pointer to the actual array data.
+
+ The array is a null array if data() == 0 (null pointer).
+
+ \sa isNull()
+*/
+
+/*!
+ \fn uint QArray::nrefs() const
+ Returns the reference count for the shared array data. This reference count
+ is always greater than zero.
+*/
+
+/*!
+ \fn uint QArray::size() const
+ Returns the size of the array (max number of elements).
+
+ The array is a null array if size() == 0.
+
+ \sa isNull(), resize()
+*/
+
+/*!
+ \fn uint QArray::count() const
+ Returns the same as size().
+
+ \sa size()
+*/
+
+/*!
+ \fn bool QArray::isEmpty() const
+ Returns TRUE if the array is empty, i.e. size() == 0, otherwise FALSE.
+
+ isEmpty() is equivalent with isNull() for QArray. Note that this is not
+ the case for QCString::isEmpty().
+*/
+
+/*!
+ \fn bool QArray::isNull() const
+ Returns TRUE if the array is null, otherwise FALSE.
+
+ A null array has size() == 0 and data() == 0.
+*/
+
+/*!
+ \fn bool QArray::resize( uint size )
+ Resizes (expands or shrinks) the array to \e size elements. The array
+ becomes a null array if \e size == 0.
+
+ Returns TRUE if successful, or FALSE if the memory cannot be allocated.
+
+ New elements will not be initialized.
+
+ \sa size()
+*/
+
+/*!
+ \fn bool QArray::truncate( uint pos )
+ Truncates the array at position \e pos.
+
+ Returns TRUE if successful, or FALSE if the memory cannot be allocated.
+
+ Equivalent to resize(\e pos).
+
+ \sa resize()
+*/
+
+/*!
+ \fn bool QArray::fill( const type &v, int size )
+ Fills the array with the value \e v. If \e size is specified as different
+ from -1, then the array will be resized before filled.
+
+ Returns TRUE if successful, or FALSE if the memory cannot be allocated
+ (only when \e size != -1).
+
+ \sa resize()
+*/
+
+/*!
+ \fn void QArray::detach()
+ Detaches this array from shared array data, i.e. makes a private, deep
+ copy of the data.
+
+ Copying will only be performed if the
+ \link nrefs() reference count\endlink is greater than one.
+
+ \sa copy()
+*/
+
+/*!
+ \fn QArray<type> QArray::copy() const
+ Returns a deep copy of this array.
+ \sa detach(), duplicate()
+*/
+
+/*!
+ \fn QArray<type> &QArray::assign( const QArray<type> &a )
+ Shallow copy. Dereferences the current array and references the data
+ contained in \e a instead. Returns a reference to this array.
+ \sa operator=()
+*/
+
+/*!
+ \fn QArray<type> &QArray::assign( const type *data, uint size )
+ Shallow copy. Dereferences the current array and references the
+ array data \e data, which contains \e size elements.
+ Returns a reference to this array.
+
+ Do not delete \e data later, QArray takes care of that.
+*/
+
+/*!
+ \fn QArray<type> &QArray::duplicate( const QArray<type> &a )
+ Deep copy. Dereferences the current array and obtains a copy of the data
+ contained in \e a instead. Returns a reference to this array.
+ \sa copy()
+*/
+
+/*!
+ \fn QArray<type> &QArray::duplicate( const type *data, uint size )
+ Deep copy. Dereferences the current array and obtains a copy of the
+ array data \e data instead. Returns a reference to this array.
+ \sa copy()
+*/
+
+/*!
+ \fn QArray<type> &QArray::setRawData( const type *data, uint size )
+
+ Sets raw data and returns a reference to the array.
+
+ Dereferences the current array and sets the new array data to \e data and
+ the new array size to \e size. Do not attempt to resize or re-assign the
+ array data when raw data has been set.
+ Call resetRawData(d,len) to reset the array.
+
+ Setting raw data is useful because it sets QArray data without allocating
+ memory or copying data.
+
+ Example I (intended use):
+ \code
+ static char bindata[] = { 231, 1, 44, ... };
+ QByteArray a;
+ a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
+ QDataStream s( a, IO_ReadOnly ); // open on a's data
+ s >> <something>; // read raw bindata
+ a.resetRawData( bindata, sizeof(bindata) ); // finished
+ \endcode
+
+ Example II (you don't want to do this):
+ \code
+ static char bindata[] = { 231, 1, 44, ... };
+ QByteArray a, b;
+ a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
+ a.resize( 8 ); // will crash
+ b = a; // will crash
+ a[2] = 123; // might crash
+ // forget to resetRawData - will crash
+ \endcode
+
+ \warning If you do not call resetRawData(), QArray will attempt to
+ deallocate or reallocate the raw data, which might not be too good.
+ Be careful.
+
+ \sa resetRawData()
+*/
+
+/*!
+ \fn void QArray::resetRawData( const type *data, uint size )
+ Resets raw data that was set using setRawData().
+
+ The arguments must be the data and length that were passed to
+ setRawData(). This is for consistency checking.
+
+ \sa setRawData()
+*/
+
+/*!
+ \fn int QArray::find( const type &v, uint index ) const
+ Finds the first occurrence of \e v, starting at position \e index.
+
+ Returns the position of \e v, or -1 if \e v could not be found.
+
+ \sa contains()
+*/
+
+/*!
+ \fn int QArray::contains( const type &v ) const
+ Returns the number of times \e v occurs in the array.
+ \sa find()
+*/
+
+/*!
+ \fn void QArray::sort()
+ Sorts the array elements in ascending order, using bitwise
+ comparison (memcmp()).
+
+ \sa bsearch()
+*/
+
+/*!
+ \fn int QArray::bsearch( const type &v ) const
+ In a sorted array, finds the first occurrence of \e v using binary
+ search. For a sorted array, this is generally much faster than
+ find(), which does a linear search.
+
+ Returns the position of \e v, or -1 if \e v could not be found.
+
+ \sa sort(), find()
+*/
+
+/*!
+ \fn type &QArray::operator[]( int index ) const
+ Returns a reference to the element at position \e index in the array.
+
+ This can be used to both read and set an element. Equivalent to at().
+
+ \sa at()
+*/
+
+/*!
+ \fn type &QArray::at( uint index ) const
+ Returns a reference to the element at position \e index in the array.
+
+ This can be used to both read and set an element.
+
+ \sa operator[]()
+*/
+
+/*!
+ \fn QArray::operator const type *() const
+ Cast operator. Returns a pointer to the array.
+ \sa data()
+*/
+
+/*!
+ \fn bool QArray::operator==( const QArray<type> &a ) const
+ Returns TRUE if this array is equal to \e a, otherwise FALSE.
+
+ The two arrays are bitwise compared.
+
+ \sa operator!=()
+*/
+
+/*!
+ \fn bool QArray::operator!=( const QArray<type> &a ) const
+ Returns TRUE if this array is different from \e a, otherwise FALSE.
+
+ The two arrays are bitwise compared.
+
+ \sa operator==()
+*/
+
+/*!
+ \fn Iterator QArray::begin()
+ Returns an iterator pointing at the beginning of this array.
+ This iterator can be used as the iterators of QValueList and QMap
+ for example. In fact it does not only behave like a usual pointer:
+ It is a pointer.
+*/
+
+/*!
+ \fn Iterator QArray::end()
+ Returns an iterator pointing behind the last element of this array.
+ This iterator can be used as the iterators of QValueList and QMap
+ for example. In fact it does not only behave like a usual pointer:
+ It is a pointer.
+*/
+
+/*!
+ \fn ConstIterator QArray::begin() const
+ Returns a const iterator pointing at the beginning of this array.
+ This iterator can be used as the iterators of QValueList and QMap
+ for example. In fact it does not only behave like a usual pointer:
+ It is a pointer.
+*/
+
+/*!
+ \fn ConstIterator QArray::end() const
+ Returns a const iterator pointing behind the last element of this array.
+ This iterator can be used as the iterators of QValueList and QMap
+ for example. In fact it does not only behave like a usual pointer:
+ It is a pointer.
+*/
+
+
+/*****************************************************************************
+ QByteArray documentation
+ *****************************************************************************/
+
+/*!
+ \class QByteArray qcstring.h
+ \brief The QByteArray class provides an array of bytes.
+
+ \inherit QArray
+
+ \ingroup tools
+
+ The QByteArray class provides an explicitly shared array of
+ bytes. It is useful for manipulating memory areas with custom
+ data. QByteArray is implemented as QArray<char>. See the QArray
+ documentation for further information.
+*/
diff --git a/qtools/qarray.h b/qtools/qarray.h
new file mode 100644
index 0000000..90dcbb7
--- /dev/null
+++ b/qtools/qarray.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+**
+** Definition of QArray template/macro class
+**
+** Created : 930906
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QARRAY_H
+#define QARRAY_H
+
+#ifndef QT_H
+#include "qgarray.h"
+#endif // QT_H
+
+
+template<class type> class Q_EXPORT QArray : public QGArray
+{
+public:
+ typedef type* Iterator;
+ typedef const type* ConstIterator;
+ typedef type ValueType;
+
+protected:
+ QArray( int, int ) : QGArray( 0, 0 ) {}
+
+public:
+ QArray() {}
+ QArray( int size ) : QGArray(size*sizeof(type)) {}
+ QArray( const QArray<type> &a ) : QGArray(a) {}
+ ~QArray() {}
+ QArray<type> &operator=(const QArray<type> &a)
+ { return (QArray<type>&)QGArray::assign(a); }
+ type *data() const { return (type *)QGArray::data(); }
+ uint nrefs() const { return QGArray::nrefs(); }
+ uint size() const { return QGArray::size()/sizeof(type); }
+ uint count() const { return size(); }
+ bool isEmpty() const { return QGArray::size() == 0; }
+ bool isNull() const { return QGArray::data() == 0; }
+ bool resize( uint size ) { return QGArray::resize(size*sizeof(type)); }
+ bool truncate( uint pos ) { return QGArray::resize(pos*sizeof(type)); }
+ bool fill( const type &d, int size = -1 )
+ { return QGArray::fill((char*)&d,size,sizeof(type) ); }
+ void detach() { QGArray::detach(); }
+ QArray<type> copy() const
+ { QArray<type> tmp; return tmp.duplicate(*this); }
+ QArray<type>& assign( const QArray<type>& a )
+ { return (QArray<type>&)QGArray::assign(a); }
+ QArray<type>& assign( const type *a, uint n )
+ { return (QArray<type>&)QGArray::assign((char*)a,n*sizeof(type)); }
+ QArray<type>& duplicate( const QArray<type>& a )
+ { return (QArray<type>&)QGArray::duplicate(a); }
+ QArray<type>& duplicate( const type *a, uint n )
+ { return (QArray<type>&)QGArray::duplicate((char*)a,n*sizeof(type)); }
+ QArray<type>& setRawData( const type *a, uint n )
+ { return (QArray<type>&)QGArray::setRawData((char*)a,
+ n*sizeof(type)); }
+ void resetRawData( const type *a, uint n )
+ { QGArray::resetRawData((char*)a,n*sizeof(type)); }
+ int find( const type &d, uint i=0 ) const
+ { return QGArray::find((char*)&d,i,sizeof(type)); }
+ int contains( const type &d ) const
+ { return QGArray::contains((char*)&d,sizeof(type)); }
+ void sort() { QGArray::sort(sizeof(type)); }
+ int bsearch( const type &d ) const
+ { return QGArray::bsearch((const char*)&d,sizeof(type)); }
+ type& operator[]( int i ) const
+ { return (type &)(*(type *)QGArray::at(i*sizeof(type))); }
+ type& at( uint i ) const
+ { return (type &)(*(type *)QGArray::at(i*sizeof(type))); }
+ operator const type*() const { return (const type *)QGArray::data(); }
+ bool operator==( const QArray<type> &a ) const { return isEqual(a); }
+ bool operator!=( const QArray<type> &a ) const { return !isEqual(a); }
+ Iterator begin() { return data(); }
+ Iterator end() { return data() + size(); }
+ ConstIterator begin() const { return data(); }
+ ConstIterator end() const { return data() + size(); }
+};
+
+
+#endif // QARRAY_H
diff --git a/qtools/qasciidict.h b/qtools/qasciidict.h
new file mode 100644
index 0000000..29fcf2f
--- /dev/null
+++ b/qtools/qasciidict.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+**
+** Definition of QAsciiDict template class
+**
+** Created : 920821
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QASCIIDICT_H
+#define QASCIIDICT_H
+
+#ifndef QT_H
+#include "qgdict.h"
+#endif // QT_H
+
+
+template<class type> class Q_EXPORT QAsciiDict : public QGDict
+{
+public:
+ QAsciiDict(int size=17, bool caseSensitive=TRUE, bool copyKeys=TRUE )
+ : QGDict(size,AsciiKey,caseSensitive,copyKeys) {}
+ QAsciiDict( const QAsciiDict<type> &d ) : QGDict(d) {}
+ ~QAsciiDict() { clear(); }
+ QAsciiDict<type> &operator=(const QAsciiDict<type> &d)
+ { return (QAsciiDict<type>&)QGDict::operator=(d); }
+ uint count() const { return QGDict::count(); }
+ uint size() const { return QGDict::size(); }
+ bool isEmpty() const { return QGDict::count() == 0; }
+
+ void insert( const char *k, const type *d )
+ { QGDict::look_ascii(k,(Item)d,1); }
+ void replace( const char *k, const type *d )
+ { QGDict::look_ascii(k,(Item)d,2); }
+ bool remove( const char *k ) { return QGDict::remove_ascii(k); }
+ type *take( const char *k ) { return (type *)QGDict::take_ascii(k); }
+ type *find( const char *k ) const
+ { return (type *)((QGDict*)this)->QGDict::look_ascii(k,0,0); }
+ type *operator[]( const char *k ) const
+ { return (type *)((QGDict*)this)->QGDict::look_ascii(k,0,0); }
+
+ void clear() { QGDict::clear(); }
+ void resize( uint n ) { QGDict::resize(n); }
+ void statistics() const { QGDict::statistics(); }
+private:
+ void deleteItem( Item d );
+};
+
+#if defined(Q_DELETING_VOID_UNDEFINED)
+template<> inline void QAsciiDict<void>::deleteItem( Item )
+{
+}
+#endif
+
+template<class type> inline void QAsciiDict<type>::deleteItem( QCollection::Item d )
+{
+ if ( del_item ) delete (type *)d;
+}
+
+
+template<class type> class Q_EXPORT QAsciiDictIterator : public QGDictIterator
+{
+public:
+ QAsciiDictIterator(const QAsciiDict<type> &d)
+ : QGDictIterator((QGDict &)d) {}
+ ~QAsciiDictIterator() {}
+ uint count() const { return dict->count(); }
+ bool isEmpty() const { return dict->count() == 0; }
+ type *toFirst() { return (type *)QGDictIterator::toFirst(); }
+ operator type *() const { return (type *)QGDictIterator::get(); }
+ type *current() const { return (type *)QGDictIterator::get(); }
+ const char *currentKey() const { return QGDictIterator::getKeyAscii(); }
+ type *operator()() { return (type *)QGDictIterator::operator()(); }
+ type *operator++() { return (type *)QGDictIterator::operator++(); }
+ type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
+};
+
+
+#endif // QASCIIDICT_H
diff --git a/qtools/qbuffer.cpp b/qtools/qbuffer.cpp
new file mode 100644
index 0000000..beed0ba
--- /dev/null
+++ b/qtools/qbuffer.cpp
@@ -0,0 +1,465 @@
+/****************************************************************************
+**
+**
+** Implementation of QBuffer class
+**
+** Created : 930812
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qbuffer.h"
+#include <stdlib.h>
+
+// REVISED: paul
+/*!
+ \class QBuffer qbuffer.h
+ \brief The QBuffer class is an I/O device that operates on a QByteArray
+
+ \ingroup io
+
+ QBuffer allows reading and writing a memory buffer. It is normally
+ used together with a QTextStream or a QDataStream. QBuffer has an
+ associated QByteArray which holds the buffer data. The size() of the
+ buffer is automatically adjusted as data is written.
+
+ The constructor \c QBuffer(QByteArray) creates a QBuffer with an
+ existing byte array. The byte array can also be set with setBuffer().
+ Writing to the QBuffer will modify the original byte array, since
+ QByteArray is \link shclass.html explicitly shared.\endlink
+
+ Use open() to open the buffer before use, and to set the mode
+ (read-only,write-only, etc.). close() closes the buffer. The buffer
+ must be closed before reopening or calling setBuffer().
+
+ The common way to use QBuffer is through \l QDataStream or \l QTextStream
+ which have constructors that take a QBuffer parameter. For
+ convenience, there are also QDataStream and QTextStream constructors
+ that take a QByteArray parameter. These constructors create and open
+ an internal QBuffer.
+
+ Note that QTextStream can also operate on a QString (a Unicode
+ string); a QBuffer cannot.
+
+ You can also use QBuffer directly through the standard QIODevice
+ functions readBlock(), writeBlock() readLine(), at(), getch(), putch() and
+ ungetch().
+
+ \sa QFile, QDataStream, QTextStream, QByteArray, \link shclass.html Shared Classes\endlink
+*/
+
+
+/*!
+ Constructs an empty buffer.
+*/
+
+QBuffer::QBuffer()
+{
+ setFlags( IO_Direct );
+ a_inc = 16; // initial increment
+ a_len = 0;
+ ioIndex = 0;
+}
+
+
+/*!
+ Constructs a buffer that operates on \a buf.
+ If you open the buffer in write mode (\c IO_WriteOnly or
+ \c IO_ReadWrite) and write something into the buffer, \a buf
+ will be modified.
+
+
+ Example:
+ \code
+ QCString str = "abc";
+ QBuffer b( str );
+ b.open( IO_WriteOnly );
+ b.at( 3 ); // position at \0
+ b.writeBlock( "def", 4 ); // write including \0
+ b.close();
+ // Now, str == "abcdef"
+ \endcode
+
+
+ \sa setBuffer()
+*/
+
+QBuffer::QBuffer( QByteArray buf ) : a(buf)
+{
+ setFlags( IO_Direct );
+ a_len = a.size();
+ a_inc = (a_len > 512) ? 512 : a_len; // initial increment
+ if ( a_inc < 16 )
+ a_inc = 16;
+ ioIndex = 0;
+}
+
+/*!
+ Destructs the buffer.
+*/
+
+QBuffer::~QBuffer()
+{
+}
+
+
+/*!
+ Replaces the buffer's contents with \a buf.
+
+ This may not be done when isOpen() is TRUE.
+
+ Note that if you open the buffer in write mode (\c IO_WriteOnly or
+ IO_ReadWrite) and write something into the buffer, \a buf is also
+ modified because QByteArray is an explicitly shared class.
+
+ \sa buffer(), open(), close()
+*/
+
+bool QBuffer::setBuffer( QByteArray buf )
+{
+ if ( isOpen() ) {
+#if defined(CHECK_STATE)
+ qWarning( "QBuffer::setBuffer: Buffer is open");
+#endif
+ return FALSE;
+ }
+ a = buf;
+ a_len = a.size();
+ a_inc = (a_len > 512) ? 512 : a_len; // initial increment
+ if ( a_inc < 16 )
+ a_inc = 16;
+ ioIndex = 0;
+ return TRUE;
+}
+
+/*!
+ \fn QByteArray QBuffer::buffer() const
+
+ Returns this buffer's byte array.
+
+ \sa setBuffer()
+*/
+
+/*!
+ \reimp
+ Opens the buffer in the mode \a m. Returns TRUE if successful,
+ otherwise FALSE. The buffer must be opened before use.
+
+ The mode parameter \a m must be a combination of the following flags.
+ <ul>
+ <li>\c IO_ReadOnly opens a buffer in read-only mode.
+ <li>\c IO_WriteOnly opens a buffer in write-only mode.
+ <li>\c IO_ReadWrite opens a buffer in read/write mode.
+ <li>\c IO_Append sets the buffer index to the end of the buffer.
+ <li>\c IO_Truncate truncates the buffer.
+ </ul>
+
+ \sa close(), isOpen()
+*/
+
+bool QBuffer::open( int m )
+{
+ if ( isOpen() ) { // buffer already open
+#if defined(CHECK_STATE)
+ qWarning( "QBuffer::open: Buffer already open" );
+#endif
+ return FALSE;
+ }
+ setMode( m );
+ if ( m & IO_Truncate ) { // truncate buffer
+ a.resize( 0 );
+ a_len = 0;
+ }
+ if ( m & IO_Append ) { // append to end of buffer
+ ioIndex = a.size();
+ } else {
+ ioIndex = 0;
+ }
+ a_inc = 16;
+ setState( IO_Open );
+ setStatus( 0 );
+ return TRUE;
+}
+
+/*!
+ \reimp
+ Closes an open buffer.
+ \sa open()
+*/
+
+void QBuffer::close()
+{
+ if ( isOpen() ) {
+ setFlags( IO_Direct );
+ ioIndex = 0;
+ a_inc = 16;
+ }
+}
+
+/*!
+ \reimp
+ The flush function does nothing for a QBuffer.
+*/
+
+void QBuffer::flush()
+{
+ return;
+}
+
+
+/*!
+ \fn int QBuffer::at() const
+ \reimp
+*/
+
+/*!
+ \fn uint QBuffer::size() const
+ \reimp
+*/
+
+/*!
+ \reimp
+*/
+
+bool QBuffer::at( int pos )
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) {
+ qWarning( "QBuffer::at: Buffer is not open" );
+ return FALSE;
+ }
+#endif
+ if ( (uint)pos > a_len ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QBuffer::at: Index %d out of range", pos );
+#endif
+ return FALSE;
+ }
+ ioIndex = pos;
+ return TRUE;
+}
+
+
+/*!
+ \reimp
+*/
+
+int QBuffer::readBlock( char *p, uint len )
+{
+#if defined(CHECK_STATE)
+ CHECK_PTR( p );
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QBuffer::readBlock: Buffer not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QBuffer::readBlock: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ if ( (uint)ioIndex + len > a.size() ) { // overflow
+ if ( (uint)ioIndex >= a.size() ) {
+ setStatus( IO_ReadError );
+ return -1;
+ } else {
+ len = a.size() - (uint)ioIndex;
+ }
+ }
+ memcpy( p, a.data()+ioIndex, len );
+ ioIndex += len;
+ return len;
+}
+
+/*!
+ \reimp
+
+ Writes \a len bytes from \a p into the buffer at the current index,
+ overwriting any characters there and extending the buffer if necessary.
+ Returns the number of bytes actually written.
+
+ Returns -1 if a serious error occurred.
+
+ \sa readBlock()
+*/
+
+int QBuffer::writeBlock( const char *p, uint len )
+{
+#if defined(CHECK_NULL)
+ if ( p == 0 && len != 0 )
+ qWarning( "QBuffer::writeBlock: Null pointer error" );
+#endif
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QBuffer::writeBlock: Buffer not open" );
+ return -1;
+ }
+ if ( !isWritable() ) { // writing not permitted
+ qWarning( "QBuffer::writeBlock: Write operation not permitted" );
+ return -1;
+ }
+#endif
+ if ( (uint)ioIndex + len >= a_len ) { // overflow
+ uint new_len = a_len + a_inc*(((uint)ioIndex+len-a_len)/a_inc+1);
+ if ( !a.resize( new_len ) ) { // could not resize
+#if defined(CHECK_NULL)
+ qWarning( "QBuffer::writeBlock: Memory allocation error" );
+#endif
+ setStatus( IO_ResourceError );
+ return -1;
+ }
+ a_inc *= 2; // double increment
+ a_len = new_len;
+ a.shd->len = (uint)ioIndex + len;
+ }
+ memcpy( a.data()+ioIndex, p, len );
+ ioIndex += len;
+ if ( a.shd->len < (uint)ioIndex )
+ a.shd->len = (uint)ioIndex; // fake (not alloc'd) length
+ return len;
+}
+
+
+/*!
+ \reimp
+*/
+
+int QBuffer::readLine( char *p, uint maxlen )
+{
+#if defined(CHECK_STATE)
+ CHECK_PTR( p );
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QBuffer::readLine: Buffer not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QBuffer::readLine: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ if ( maxlen == 0 )
+ return 0;
+ uint start = (uint)ioIndex;
+ char *d = a.data() + ioIndex;
+ maxlen--; // make room for 0-terminator
+ if ( a.size() - (uint)ioIndex < maxlen )
+ maxlen = a.size() - (uint)ioIndex;
+ while ( maxlen-- ) {
+ if ( (*p++ = *d++) == '\n' )
+ break;
+ }
+ *p = '\0';
+ ioIndex = d - a.data();
+ return (uint)ioIndex - start;
+}
+
+
+/*!
+ \reimp
+*/
+
+int QBuffer::getch()
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QBuffer::getch: Buffer not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QBuffer::getch: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ if ( (uint)ioIndex+1 > a.size() ) { // overflow
+ setStatus( IO_ReadError );
+ return -1;
+ }
+ return uchar(*(a.data()+ioIndex++));
+}
+
+/*!
+ \reimp
+ Writes the character \a ch into the buffer, overwriting
+ the character at the current index, extending the buffer
+ if necessary.
+
+ Returns \a ch, or -1 if some error occurred.
+
+ \sa getch(), ungetch()
+*/
+
+int QBuffer::putch( int ch )
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QBuffer::putch: Buffer not open" );
+ return -1;
+ }
+ if ( !isWritable() ) { // writing not permitted
+ qWarning( "QBuffer::putch: Write operation not permitted" );
+ return -1;
+ }
+#endif
+ if ( (uint)ioIndex + 1 >= a_len ) { // overflow
+ char buf[1];
+ buf[0] = (char)ch;
+ if ( writeBlock(buf,1) != 1 )
+ return -1; // write error
+ } else {
+ *(a.data() + ioIndex++) = (char)ch;
+ if ( a.shd->len < (uint)ioIndex )
+ a.shd->len = (uint)ioIndex;
+ }
+ return ch;
+}
+
+/*!
+ \reimp
+*/
+
+int QBuffer::ungetch( int ch )
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QBuffer::ungetch: Buffer not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QBuffer::ungetch: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ if ( ch != -1 ) {
+ if ( ioIndex )
+ ioIndex--;
+ else
+ ch = -1;
+ }
+ return ch;
+}
diff --git a/qtools/qbuffer.h b/qtools/qbuffer.h
new file mode 100644
index 0000000..9dcd286
--- /dev/null
+++ b/qtools/qbuffer.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+**
+** Definition of QBuffer class
+**
+** Created : 930812
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QBUFFER_H
+#define QBUFFER_H
+
+#ifndef QT_H
+#include "qiodevice.h"
+#include "qstring.h"
+#endif // QT_H
+
+
+class Q_EXPORT QBuffer : public QIODevice
+{
+public:
+ QBuffer();
+ QBuffer( QByteArray );
+ ~QBuffer();
+
+ QByteArray buffer() const;
+ bool setBuffer( QByteArray );
+
+ bool open( int );
+ void close();
+ void flush();
+
+ uint size() const;
+ int at() const;
+ bool at( int );
+
+ int readBlock( char *p, uint );
+ int writeBlock( const char *p, uint );
+ int readLine( char *p, uint );
+
+ int getch();
+ int putch( int );
+ int ungetch( int );
+
+protected:
+ QByteArray a;
+
+private:
+ uint a_len;
+ uint a_inc;
+
+private: // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+ QBuffer( const QBuffer & );
+ QBuffer &operator=( const QBuffer & );
+#endif
+};
+
+
+inline QByteArray QBuffer::buffer() const
+{ return a; }
+
+inline uint QBuffer::size() const
+{ return a.size(); }
+
+inline int QBuffer::at() const
+{ return ioIndex; }
+
+
+#endif // QBUFFER_H
diff --git a/qtools/qcache.h b/qtools/qcache.h
new file mode 100644
index 0000000..f15345e
--- /dev/null
+++ b/qtools/qcache.h
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+**
+** Definition of QCache template class
+**
+** Created : 950209
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QCACHE_H
+#define QCACHE_H
+
+#ifndef QT_H
+#include "qgcache.h"
+#endif // QT_H
+
+#define USE_ASCII_STRING
+
+#ifndef USE_ASCII_STRING
+
+template<class type> class Q_EXPORT QCache : public QGCache
+{
+public:
+ QCache( const QCache<type> &c ) : QGCache(c) {}
+ QCache( int maxCost=100, int size=17, bool caseSensitive=TRUE )
+ : QGCache( maxCost, size, StringKey, caseSensitive, FALSE ) {}
+ ~QCache() { clear(); }
+ QCache<type> &operator=( const QCache<type> &c )
+ { return (QCache<type>&)QGCache::operator=(c); }
+ int maxCost() const { return QGCache::maxCost(); }
+ int totalCost() const { return QGCache::totalCost(); }
+ void setMaxCost( int m ) { QGCache::setMaxCost(m); }
+ uint count() const { return QGCache::count(); }
+ uint size() const { return QGCache::size(); }
+ bool isEmpty() const { return QGCache::count() == 0; }
+ void clear() { QGCache::clear(); }
+ bool insert( const QString &k, const type *d, int c=1, int p=0 )
+ { return QGCache::insert_string(k,(Item)d,c,p);}
+ bool remove( const QString &k )
+ { return QGCache::remove_string(k); }
+ type *take( const QString &k )
+ { return (type *)QGCache::take_string(k); }
+ type *find( const QString &k, bool ref=TRUE ) const
+ { return (type *)QGCache::find_string(k,ref);}
+ type *operator[]( const QString &k ) const
+ { return (type *)QGCache::find_string(k);}
+ void statistics() const { QGCache::statistics(); }
+private:
+ void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
+};
+
+#else
+
+
+template<class type> class Q_EXPORT QCache : public QGCache
+{
+public:
+ QCache( const QCache<type> &c ) : QGCache(c) {}
+ QCache( int maxCost=100, int size=17, bool caseSensitive=TRUE )
+ : QGCache( maxCost, size, AsciiKey, caseSensitive, TRUE ) {}
+ ~QCache() { clear(); }
+ QCache<type> &operator=( const QCache<type> &c )
+ { return (QCache<type>&)QGCache::operator=(c); }
+ int maxCost() const { return QGCache::maxCost(); }
+ int totalCost() const { return QGCache::totalCost(); }
+ void setMaxCost( int m ) { QGCache::setMaxCost(m); }
+ uint count() const { return QGCache::count(); }
+ uint size() const { return QGCache::size(); }
+ bool isEmpty() const { return QGCache::count() == 0; }
+ void clear() { QGCache::clear(); }
+ bool insert( const char *k, const type *d, int c=1, int p=0 )
+ { return QGCache::insert_other(k,(Item)d,c,p);}
+ bool remove( const char *k )
+ { return QGCache::remove_other(k); }
+ type *take( const char *k )
+ { return (type *)QGCache::take_other(k); }
+ type *find( const char *k, bool ref=TRUE ) const
+ { return (type *)QGCache::find_other(k,ref);}
+ type *operator[]( const char *k ) const
+ { return (type *)QGCache::find_other(k);}
+ void statistics() const { QGCache::statistics(); }
+private:
+ void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
+};
+
+
+#endif
+
+
+
+template<class type> class Q_EXPORT QCacheIterator : public QGCacheIterator
+{
+public:
+ QCacheIterator( const QCache<type> &c ):QGCacheIterator((QGCache &)c) {}
+ QCacheIterator( const QCacheIterator<type> &ci)
+ : QGCacheIterator( (QGCacheIterator &)ci ) {}
+ QCacheIterator<type> &operator=(const QCacheIterator<type>&ci)
+ { return ( QCacheIterator<type>&)QGCacheIterator::operator=( ci ); }
+ uint count() const { return QGCacheIterator::count(); }
+ bool isEmpty() const { return QGCacheIterator::count() == 0; }
+ bool atFirst() const { return QGCacheIterator::atFirst(); }
+ bool atLast() const { return QGCacheIterator::atLast(); }
+ type *toFirst() { return (type *)QGCacheIterator::toFirst(); }
+ type *toLast() { return (type *)QGCacheIterator::toLast(); }
+ operator type *() const { return (type *)QGCacheIterator::get(); }
+ type *current() const { return (type *)QGCacheIterator::get(); }
+#ifndef USE_ASCII_STRING
+ QString currentKey() const{ return QGCacheIterator::getKeyString(); }
+#else
+ const char *currentKey() const{ return QGCacheIterator::getKeyAscii(); }
+#endif
+ type *operator()() { return (type *)QGCacheIterator::operator()();}
+ type *operator++() { return (type *)QGCacheIterator::operator++(); }
+ type *operator+=(uint j) { return (type *)QGCacheIterator::operator+=(j);}
+ type *operator--() { return (type *)QGCacheIterator::operator--(); }
+ type *operator-=(uint j) { return (type *)QGCacheIterator::operator-=(j);}
+};
+
+
+#endif // QCACHE_H
diff --git a/qtools/qcollection.cpp b/qtools/qcollection.cpp
new file mode 100644
index 0000000..e70b64b
--- /dev/null
+++ b/qtools/qcollection.cpp
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+**
+** Implementation of base class for all collection classes
+**
+** Created : 920820
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qcollection.h"
+
+// NOT REVISED
+/*!
+ \class QCollection qcollection.h
+ \brief The QCollection class is the base class of all Qt collections.
+
+ \ingroup collection
+ \ingroup tools
+
+ The QCollection class is an abstract base class for the Qt \link
+ collection.html collection classes\endlink QDict, QList etc. via QGDict,
+ QGList etc.
+
+ A QCollection knows only about the number of objects in the
+ collection and the deletion strategy (see setAutoDelete()).
+
+ A collection is implemented using the \c Item (generic collection
+ item) type, which is a \c void*. The template classes that create
+ the real collections cast the \c Item to the required type.
+
+ \sa \link collection.html Collection Classes\endlink
+*/
+
+
+/*! \enum QCollection::Item
+
+ This type is the generic "item" in a QCollection.
+*/
+
+
+/*!
+ \fn QCollection::QCollection()
+
+ Constructs a collection. The constructor is protected because
+ QCollection is an abstract class.
+*/
+
+/*!
+ \fn QCollection::QCollection( const QCollection & source )
+
+ Constructs a copy of \a source with autoDelete() set to FALSE. The
+ constructor is protected because QCollection is an abstract class.
+
+ Note that if \a source has autoDelete turned on, copying it is a
+ good way to get memory leaks, reading freed memory, or both.
+*/
+
+/*!
+ \fn QCollection::~QCollection()
+ Destroys the collection. The destructor is protected because QCollection
+ is an abstract class.
+*/
+
+
+/*!
+ \fn bool QCollection::autoDelete() const
+ Returns the setting of the auto-delete option (default is FALSE).
+ \sa setAutoDelete()
+*/
+
+/*!
+ \fn void QCollection::setAutoDelete( bool enable )
+
+ Sets the auto-delete option of the collection.
+
+ Enabling auto-delete (\e enable is TRUE) will delete objects that
+ are removed from the collection. This can be useful if the
+ collection has the only reference to the objects. (Note that the
+ object can still be copied using the copy constructor - copying such
+ objects is a good way to get memory leaks, reading freed memory or
+ both.)
+
+ Disabling auto-delete (\e enable is FALSE) will \e not delete objects
+ that are removed from the collection. This is useful if the objects
+ are part of many collections.
+
+ The default setting is FALSE.
+
+ \sa autoDelete()
+*/
+
+
+/*!
+ \fn virtual uint QCollection::count() const
+ Returns the number of objects in the collection.
+*/
+
+/*!
+ \fn virtual void QCollection::clear()
+ Removes all objects from the collection. The objects will be deleted
+ if auto-delete has been enabled.
+ \sa setAutoDelete()
+*/
+
+
+/*!
+ Virtual function that creates a copy of an object that is about to
+ be inserted into the collection.
+
+ The default implementation returns the \e d pointer, i.e. no copy
+ is made.
+
+ This function is seldom reimplemented in the collection template
+ classes. It is not common practice to make a copy of something
+ that is being inserted.
+
+ \sa deleteItem()
+*/
+
+QCollection::Item QCollection::newItem( Item d )
+{
+ return d; // just return reference
+}
+
+/*!
+ Virtual function that deletes an item that is about to be removed from
+ the collection.
+
+ The default implementation deletes \e d pointer if and only if
+ auto-delete has been enabled.
+
+ This function is always reimplemented in the collection template
+ classes.
+
+ \warning If you reimplement this function you must also reimplement
+ the destructor and call the virtual function clear() from your
+ destructor. This is due to the way virtual functions and
+ destructors work in C++: virtual functions in derived classes cannot
+ be called from a destructor. If you do not do this your
+ deleteItem() function will not be called when the container is
+ destructed.
+
+ \sa newItem(), setAutoDelete()
+*/
+
+void QCollection::deleteItem( Item d )
+{
+ if ( del_item )
+#if defined(Q_DELETING_VOID_UNDEFINED)
+ delete (char *)d; // default operation
+#else
+ delete d; // default operation
+#endif
+}
diff --git a/qtools/qcollection.h b/qtools/qcollection.h
new file mode 100644
index 0000000..a169b7c
--- /dev/null
+++ b/qtools/qcollection.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+**
+** Definition of base class for all collection classes
+**
+** Created : 920629
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QCOLLECTION_H
+#define QCOLLECTION_H
+
+#ifndef QT_H
+#include "qglobal.h"
+#endif // QT_H
+
+
+class QGVector;
+class QGList;
+class QGDict;
+
+
+class Q_EXPORT QCollection // inherited by all collections
+{
+public:
+ bool autoDelete() const { return del_item; }
+ void setAutoDelete( bool enable ) { del_item = enable; }
+
+ virtual uint count() const = 0;
+ virtual void clear() = 0; // delete all objects
+
+ typedef void *Item; // generic collection item
+
+protected:
+ QCollection() { del_item = FALSE; } // no deletion of objects
+ QCollection(const QCollection &) { del_item = FALSE; }
+ virtual ~QCollection() {}
+
+ bool del_item; // default FALSE
+
+ virtual Item newItem( Item ); // create object
+ virtual void deleteItem( Item ); // delete object
+};
+
+
+#endif // QCOLLECTION_H
diff --git a/qtools/qconfig.h b/qtools/qconfig.h
new file mode 100644
index 0000000..7a880f9
--- /dev/null
+++ b/qtools/qconfig.h
@@ -0,0 +1 @@
+// Everything
diff --git a/qtools/qcstring.cpp b/qtools/qcstring.cpp
new file mode 100644
index 0000000..4038d55
--- /dev/null
+++ b/qtools/qcstring.cpp
@@ -0,0 +1,799 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2004 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qcstring.h"
+#include "qgstring.h"
+
+#include <qstring.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <qregexp.h>
+#include <qdatastream.h>
+
+
+QCString::QCString(int size)
+{
+ if (size>0)
+ {
+ m_data = (char *)malloc(size);
+ if (m_data)
+ {
+ if (size>1) memset(m_data,' ',size-1);
+ m_data[size-1]='\0';
+ }
+ }
+ else
+ {
+ m_data=0;
+ }
+}
+
+QCString::QCString( const QCString &s )
+{
+ duplicate(s);
+}
+
+QCString::QCString( const char *str )
+{
+ duplicate(str);
+}
+
+QCString::QCString( const char *str, uint maxlen )
+{
+ uint l;
+ if (str && ( l = QMIN(qstrlen(str),maxlen) ))
+ {
+ m_data=(char *)malloc(l+1);
+ strncpy(m_data,str,l+1);
+ m_data[l]='\0';
+ }
+ else
+ {
+ m_data=0;
+ }
+}
+
+QCString::~QCString()
+{
+ if (m_data) free(m_data);
+ m_data=0;
+}
+
+QCString &QCString::assign( const char *str )
+{
+ if (m_data) free(m_data);
+ duplicate(str);
+ return *this;
+}
+
+bool QCString::resize( uint newlen )
+{
+ if (newlen==0)
+ {
+ if (m_data) { free(m_data); m_data=0; }
+ return TRUE;
+ }
+ if (m_data==0) // newlen>0
+ {
+ m_data = (char *)malloc(newlen);
+ }
+ else
+ {
+ m_data = (char *)realloc(m_data,newlen);
+ }
+ if (m_data==0) return FALSE;
+ m_data[newlen-1]='\0';
+ return TRUE;
+}
+
+bool QCString::fill( char c, int len )
+{
+ uint l=length();
+ if (len<0) len=l;
+ if ((uint)len!=l)
+ {
+ if (m_data) free(m_data);
+ if (len>0)
+ {
+ m_data=(char *)malloc(len+1);
+ if (m_data==0) return FALSE;
+ m_data[len]='\0';
+ }
+ else
+ {
+ m_data=0;
+ }
+ }
+ if (len>0)
+ {
+ uint i;
+ for (i=0;i<(uint)len;i++) m_data[i]=c;
+ }
+ return TRUE;
+}
+
+QCString &QCString::sprintf( const char *format, ... )
+{
+ va_list ap;
+ va_start( ap, format );
+ uint l = length();
+ const uint minlen=256;
+ if (l<minlen)
+ {
+ if (m_data)
+ m_data = (char *)realloc(m_data,minlen);
+ else
+ m_data = (char *)malloc(minlen);
+ }
+ vsprintf( m_data, format, ap );
+ resize( qstrlen(m_data) + 1 ); // truncate
+ va_end( ap );
+ return *this;
+}
+
+
+int QCString::find( char c, int index, bool cs ) const
+{
+ uint len = length();
+ if ( m_data==0 || (uint)index>len ) // index outside string
+ return -1;
+ register const char *d;
+ if ( cs ) // case sensitive
+ {
+ d = strchr( m_data+index, c );
+ }
+ else
+ {
+ d = m_data+index;
+ c = tolower( (uchar) c );
+ while ( *d && tolower((uchar) *d) != c )
+ d++;
+ if ( !*d && c ) // not found
+ d = 0;
+ }
+ return d ? (int)(d - m_data) : -1;
+}
+
+int QCString::find( const char *str, int index, bool cs ) const
+{
+ uint l = length();
+ if ( m_data==0 || (uint)index > l ) // index outside string
+ return -1;
+ if ( !str ) // no search string
+ return -1;
+ if ( !*str ) // zero-length search string
+ return index;
+ register const char *d;
+ if ( cs ) // case sensitive
+ {
+ d = strstr( m_data+index, str );
+ }
+ else // case insensitive
+ {
+ d = m_data+index;
+ int len = qstrlen( str );
+ while ( *d )
+ {
+ if ( qstrnicmp(d, str, len) == 0 )
+ break;
+ d++;
+ }
+ if ( !*d ) // not found
+ d = 0;
+ }
+ return d ? (int)(d - m_data) : -1;
+}
+
+int QCString::find( const QCString &str,int index,bool cs) const
+{
+ return find(str.data(),index,cs);
+}
+
+int QCString::find( const QRegExp &rx, int index ) const
+{
+ QString d = QString::fromLatin1( m_data );
+ return d.find( rx, index );
+}
+
+int QCString::findRev( char c, int index, bool cs) const
+{
+ const char *b = m_data;
+ const char *d;
+ uint len = length();
+ if ( b == 0 ) return -1; // empty string
+ if ( index < 0 ) // neg index ==> start from end
+ {
+ if ( len == 0 ) return -1;
+ if ( cs )
+ {
+ d = strrchr( b, c );
+ return d ? (int)(d - b) : -1;
+ }
+ index = len;
+ }
+ else if ( (uint)index > len ) // bad index
+ {
+ return -1;
+ }
+ d = b+index;
+ if ( cs ) // case sensitive
+ {
+ while ( d >= b && *d != c )
+ d--;
+ }
+ else // case insensitive
+ {
+ c = tolower( (uchar) c );
+ while ( d >= b && tolower((uchar) *d) != c )
+ d--;
+ }
+ return d >= b ? (int)(d - b) : -1;
+}
+
+int QCString::findRev( const char *str, int index, bool cs) const
+{
+ int slen = qstrlen(str);
+ uint len = length();
+ if ( index < 0 ) // neg index ==> start from end
+ index = len-slen;
+ else if ( (uint)index > len ) // bad index
+ return -1;
+ else if ( (uint)(index + slen) > len ) // str would be too long
+ index = len - slen;
+ if ( index < 0 )
+ return -1;
+
+ register char *d = m_data + index;
+ if ( cs ) // case sensitive
+ {
+ for ( int i=index; i>=0; i-- )
+ if ( qstrncmp(d--,str,slen)==0 )
+ return i;
+ }
+ else // case insensitive
+ {
+ for ( int i=index; i>=0; i-- )
+ if ( qstrnicmp(d--,str,slen)==0 )
+ return i;
+ }
+ return -1;
+
+}
+
+int QCString::findRev( const QRegExp &rx, int index ) const
+{
+ QString d = QString::fromLatin1( m_data );
+ return d.findRev( rx, index );
+}
+
+int QCString::contains( char c, bool cs ) const
+{
+ int count = 0;
+ char *d = m_data;
+ if ( !d )
+ return 0;
+ if ( cs ) // case sensitive
+ {
+ while ( *d )
+ if ( *d++ == c )
+ count++;
+ }
+ else // case insensitive
+ {
+ c = tolower( (uchar) c );
+ while ( *d ) {
+ if ( tolower((uchar) *d) == c )
+ count++;
+ d++;
+ }
+ }
+ return count;
+}
+
+int QCString::contains( const char *str, bool cs ) const
+{
+ int count = 0;
+ char *d = data();
+ if ( !d )
+ return 0;
+ int len = qstrlen( str );
+ while ( *d ) // counts overlapping strings
+ {
+ if ( cs )
+ {
+ if ( qstrncmp( d, str, len ) == 0 )
+ count++;
+ }
+ else
+ {
+ if ( qstrnicmp(d, str, len) == 0 )
+ count++;
+ }
+ d++;
+ }
+ return count;
+}
+
+int QCString::contains( const QRegExp &rx ) const
+{
+ QString d = QString::fromLatin1( m_data );
+ return d.contains( rx );
+}
+
+QCString QCString::left( uint len ) const
+{
+ if ( isEmpty() )
+ {
+ return QCString();
+ }
+ else if ( len >= length() )
+ {
+ return *this;
+ }
+ else
+ {
+ QCString s( len+1 );
+ strncpy( s.data(), m_data, len );
+ *(s.data()+len) = '\0';
+ return s;
+ }
+}
+
+QCString QCString::right( uint len ) const
+{
+ if ( isEmpty() )
+ {
+ return QCString();
+ }
+ else
+ {
+ uint l = length();
+ if ( len > l ) len = l;
+ char *p = m_data + (l - len);
+ return QCString( p );
+ }
+}
+
+QCString QCString::mid( uint index, uint len) const
+{
+ uint slen = length();
+ if ( len == 0xffffffff ) len = slen-index;
+ if ( isEmpty() || index >= slen )
+ {
+ return QCString();
+ }
+ else
+ {
+ register char *p = data()+index;
+ QCString s( len+1 );
+ strncpy( s.data(), p, len );
+ *(s.data()+len) = '\0';
+ return s;
+ }
+}
+
+QCString QCString::lower() const
+{
+ QCString s( m_data );
+ register char *p = s.data();
+ if ( p )
+ {
+ while ( *p )
+ {
+ *p = tolower((uchar) *p);
+ p++;
+ }
+ }
+ return s;
+}
+
+QCString QCString::upper() const
+{
+ QCString s( m_data );
+ register char *p = s.data();
+ if ( p ) {
+ while ( *p ) {
+ *p = toupper((uchar)*p);
+ p++;
+ }
+ }
+ return s;
+}
+
+QCString QCString::stripWhiteSpace() const
+{
+ if ( isEmpty() ) // nothing to do
+ return *this;
+
+ register char *s = m_data;
+ int reslen = length();
+ if ( !isspace((uchar) s[0]) && !isspace((uchar) s[reslen-1]) )
+ return *this; // returns a copy
+
+ QCString result(s);
+ s = result.data();
+ int start = 0;
+ int end = reslen - 1;
+ while ( isspace((uchar) s[start]) ) // skip white space from start
+ start++;
+ if ( s[start] == '\0' )
+ { // only white space
+ return QCString();
+ }
+ while ( end && isspace((uchar) s[end]) ) // skip white space from end
+ end--;
+ end -= start - 1;
+ memmove( result.data(), &s[start], end );
+ result.resize( end + 1 );
+ return result;
+}
+
+QCString QCString::simplifyWhiteSpace() const
+{
+ if ( isEmpty() ) // nothing to do
+ return *this;
+
+ QCString result( length()+1 );
+ char *from = data();
+ char *to = result.data();
+ char *first = to;
+ while ( TRUE )
+ {
+ while ( *from && isspace((uchar) *from) )
+ from++;
+ while ( *from && !isspace((uchar)*from) )
+ *to++ = *from++;
+ if ( *from )
+ *to++ = 0x20; // ' '
+ else
+ break;
+ }
+ if ( to > first && *(to-1) == 0x20 )
+ to--;
+ *to = '\0';
+ result.resize( (int)((long)to - (long)result.data()) + 1 );
+ return result;
+}
+
+QCString &QCString::insert( uint index, const char *s )
+{
+ int len = s ? qstrlen(s) : 0;
+ if ( len == 0 )
+ return *this;
+ uint olen = length();
+ int nlen = olen + len;
+ if ( index >= olen ) // insert after end of string
+ {
+ m_data = (char *)realloc(m_data,nlen+index-olen+1);
+ if ( m_data )
+ {
+ memset( m_data+olen, ' ', index-olen );
+ memcpy( m_data+index, s, len+1 );
+ }
+ }
+ else if ( (m_data = (char *)realloc(m_data,nlen+1)) ) // normal insert
+ {
+ memmove( m_data+index+len, m_data+index, olen-index+1 );
+ memcpy( m_data+index, s, len );
+ }
+ return *this;
+}
+
+QCString &QCString::insert( uint index, char c ) // insert char
+{
+ char buf[2];
+ buf[0] = c;
+ buf[1] = '\0';
+ return insert( index, buf );
+}
+
+QCString& QCString::operator+=( const char *str )
+{
+ if ( !str ) return *this; // nothing to append
+ uint len1 = length();
+ uint len2 = qstrlen(str);
+ char *newData = (char *)realloc( m_data, len1 + len2 + 1 );
+ if (newData)
+ {
+ m_data = newData;
+ memcpy( m_data + len1, str, len2 + 1 );
+ }
+ return *this;
+}
+
+QCString &QCString::operator+=( char c )
+{
+ uint len = length();
+ char *newData = (char *)realloc( m_data, length()+2 );
+ if (newData)
+ {
+ m_data = newData;
+ m_data[len] = c;
+ m_data[len+1] = '\0';
+ }
+ return *this;
+}
+
+QCString &QCString::remove( uint index, uint len )
+{
+ uint olen = length();
+ if ( index + len >= olen ) // range problems
+ {
+ if ( index < olen ) // index ok
+ {
+ resize( index+1 );
+ }
+ }
+ else if ( len != 0 )
+ {
+ memmove( m_data+index, m_data+index+len, olen-index-len+1 );
+ resize( olen-len+1 );
+ }
+ return *this;
+}
+
+QCString &QCString::replace( uint index, uint len, const char *s )
+{
+ remove( index, len );
+ insert( index, s );
+ return *this;
+}
+
+QCString &QCString::replace( const QRegExp &rx, const char *str )
+{
+ QString d = QString::fromLatin1( m_data );
+ QString r = QString::fromLatin1( str );
+ d.replace( rx, r );
+ operator=( d.ascii() );
+ return *this;
+}
+
+long QCString::toLong( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toLong(ok);
+}
+
+ulong QCString::toULong( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toULong(ok);
+}
+
+short QCString::toShort( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toShort(ok);
+}
+
+ushort QCString::toUShort( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toUShort(ok);
+}
+
+int QCString::toInt( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toInt(ok);
+}
+
+uint QCString::toUInt( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toUInt(ok);
+}
+
+QCString &QCString::setNum( long n )
+{
+ char buf[20];
+ register char *p = &buf[19];
+ bool neg;
+ if ( n < 0 )
+ {
+ neg = TRUE;
+ n = -n;
+ }
+ else
+ {
+ neg = FALSE;
+ }
+ *p = '\0';
+ do
+ {
+ *--p = ((int)(n%10)) + '0';
+ n /= 10;
+ } while ( n );
+ if ( neg ) *--p = '-';
+ operator=( p );
+ return *this;
+}
+
+QCString &QCString::setNum( ulong n )
+{
+ char buf[20];
+ register char *p = &buf[19];
+ *p = '\0';
+ do
+ {
+ *--p = ((int)(n%10)) + '0';
+ n /= 10;
+ } while ( n );
+ operator=( p );
+ return *this;
+}
+
+void QCString::msg_index( uint index )
+{
+#if defined(CHECK_RANGE)
+ qWarning( "QCString::at: Absolute index %d out of range", index );
+#else
+ Q_UNUSED( index )
+#endif
+}
+
+bool QCString::stripPrefix(const char *prefix)
+{
+ if (prefix==0) return FALSE;
+ uint plen = qstrlen(prefix);
+ if (m_data && qstrncmp(prefix,m_data,plen)==0) // prefix matches
+ {
+ uint len = qstrlen(m_data);
+ uint newlen = len-plen+1;
+ qmemmove(m_data,m_data+plen,newlen);
+ resize(newlen);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//---------------------------------------------------------------------------
+
+void *qmemmove( void *dst, const void *src, uint len )
+{
+ register char *d;
+ register char *s;
+ if ( dst > src ) {
+ d = (char *)dst + len - 1;
+ s = (char *)src + len - 1;
+ while ( len-- )
+ *d-- = *s--;
+ } else if ( dst < src ) {
+ d = (char *)dst;
+ s = (char *)src;
+ while ( len-- )
+ *d++ = *s++;
+ }
+ return dst;
+}
+
+char *qstrdup( const char *str )
+{
+ if ( !str )
+ return 0;
+ char *dst = new char[strlen(str)+1];
+ CHECK_PTR( dst );
+ return strcpy( dst, str );
+}
+
+char *qstrncpy( char *dst, const char *src, uint len )
+{
+ if ( !src )
+ return 0;
+ strncpy( dst, src, len );
+ if ( len > 0 )
+ dst[len-1] = '\0';
+ return dst;
+}
+
+int qstricmp( const char *str1, const char *str2 )
+{
+ register const uchar *s1 = (const uchar *)str1;
+ register const uchar *s2 = (const uchar *)str2;
+ int res;
+ uchar c;
+ if ( !s1 || !s2 )
+ return s1 == s2 ? 0 : (int)((long)s2 - (long)s1);
+ for ( ; !(res = (c=tolower(*s1)) - tolower(*s2)); s1++, s2++ )
+ if ( !c ) // strings are equal
+ break;
+ return res;
+}
+
+int qstrnicmp( const char *str1, const char *str2, uint len )
+{
+ register const uchar *s1 = (const uchar *)str1;
+ register const uchar *s2 = (const uchar *)str2;
+ int res;
+ uchar c;
+ if ( !s1 || !s2 )
+ return (int)((long)s2 - (long)s1);
+ for ( ; len--; s1++, s2++ ) {
+ if ( (res = (c=tolower(*s1)) - tolower(*s2)) )
+ return res;
+ if ( !c ) // strings are equal
+ break;
+ }
+ return 0;
+}
+
+#ifndef QT_NO_DATASTREAM
+
+QDataStream &operator<<( QDataStream &s, const QByteArray &a )
+{
+ return s.writeBytes( a.data(), a.size() );
+}
+
+QDataStream &operator>>( QDataStream &s, QByteArray &a )
+{
+ Q_UINT32 len;
+ s >> len; // read size of array
+ if ( len == 0 || s.eof() ) { // end of file reached
+ a.resize( 0 );
+ return s;
+ }
+ if ( !a.resize( (uint)len ) ) { // resize array
+#if defined(CHECK_NULL)
+ qWarning( "QDataStream: Not enough memory to read QByteArray" );
+#endif
+ len = 0;
+ }
+ if ( len > 0 ) // not null array
+ s.readRawBytes( a.data(), (uint)len );
+ return s;
+}
+
+QDataStream &operator<<( QDataStream &s, const QCString &str )
+{
+ return s.writeBytes( str.data(), str.size() );
+}
+
+QDataStream &operator>>( QDataStream &s, QCString &str )
+{
+ Q_UINT32 len;
+ s >> len; // read size of string
+ if ( len == 0 || s.eof() ) { // end of file reached
+ str.resize( 0 );
+ return s;
+ }
+ if ( !str.resize( (uint)len )) {// resize string
+#if defined(CHECK_NULL)
+ qWarning( "QDataStream: Not enough memory to read QCString" );
+#endif
+ len = 0;
+ }
+ if ( len > 0 ) // not null array
+ s.readRawBytes( str.data(), (uint)len );
+ return s;
+}
+
+#endif //QT_NO_DATASTREAM
+
+inline QCString operator+( const QCString &s1, const QGString &s2 )
+{
+ QCString tmp(s1);
+ tmp += s2.data();
+ return tmp;
+}
+
+inline QCString operator+( const QGString &s1, const QCString &s2 )
+{
+ QCString tmp(s1.data());
+ tmp += s2;
+ return tmp;
+}
+
diff --git a/qtools/qcstring.h b/qtools/qcstring.h
new file mode 100644
index 0000000..1e5f6f8
--- /dev/null
+++ b/qtools/qcstring.h
@@ -0,0 +1,464 @@
+/****************************************************************************
+**
+**
+** Definition of the extended char array operations,
+** and QByteArray and QCString classes
+**
+** Created : 920609
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QCSTRING_H
+#define QCSTRING_H
+
+#ifndef QT_H
+#include "qarray.h"
+#endif // QT_H
+
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(_OS_SUN_) && defined(_CC_GNU_)
+#include <strings.h>
+#endif
+
+
+class QGString;
+
+/*****************************************************************************
+ Fixes and workarounds for some platforms
+ *****************************************************************************/
+
+#if defined(_OS_HPUX_)
+// HP-UX has badly defined strstr() etc.
+// ### fix in 3.0: change hack_* to qt_hack_*
+// by the way HP-UX is probably right, the standard has evolved and
+// we'll have to adapt to it
+inline char *hack_strstr( const char *s1, const char *s2 )
+{ return (char *)strstr(s1, s2); }
+inline char *hack_strchr( const char *s, int c )
+{ return (char *)strchr(s, c); }
+inline char *hack_strrchr( const char *s, int c )
+{ return (char *)strrchr(s, c); }
+#define strstr(s1,s2) hack_strstr((s1),(s2))
+#define strchr(s,c) hack_strchr((s),(c))
+#define strrchr(s,c) hack_strrchr((s),(c))
+#endif
+
+
+/*****************************************************************************
+ Safe and portable C string functions; extensions to standard string.h
+ *****************************************************************************/
+
+Q_EXPORT void *qmemmove( void *dst, const void *src, uint len );
+
+#if defined(_OS_SUN_) || defined(_CC_OC_)
+#define memmove(s1,s2,n) qmemmove((s1),(s2),(n))
+#endif
+
+Q_EXPORT char *qstrdup( const char * );
+
+Q_EXPORT inline uint cstrlen( const char *str )
+{ return strlen(str); }
+
+Q_EXPORT inline uint qstrlen( const char *str )
+{ return str ? strlen(str) : 0; }
+
+Q_EXPORT inline char *cstrcpy( char *dst, const char *src )
+{ return strcpy(dst,src); }
+
+Q_EXPORT inline char *qstrcpy( char *dst, const char *src )
+{ return src ? strcpy(dst, src) : 0; }
+
+Q_EXPORT char *qstrncpy( char *dst, const char *src, uint len );
+
+Q_EXPORT inline int cstrcmp( const char *str1, const char *str2 )
+{ return strcmp(str1,str2); }
+
+Q_EXPORT inline int qstrcmp( const char *str1, const char *str2 )
+{ return (str1 && str2) ? strcmp(str1,str2) : (int)((long)str2 - (long)str1); }
+
+Q_EXPORT inline int cstrncmp( const char *str1, const char *str2, uint len )
+{ return strncmp(str1,str2,len); }
+
+Q_EXPORT inline int qstrncmp( const char *str1, const char *str2, uint len )
+{ return (str1 && str2) ? strncmp(str1,str2,len) :
+ (int)((long)str2 - (long)str1); }
+
+Q_EXPORT int qstricmp( const char *, const char * );
+
+Q_EXPORT int qstrnicmp( const char *, const char *, uint len );
+
+// ### TODO for 3.0: these and the cstr* functions should be used if
+// !defined(QT_CLEAN_NAMESPACE)
+// We want to keep source compatibility for 2.x
+// ### TODO for 4.0: completely remove these and the cstr* functions
+
+#if !defined(QT_GENUINE_STR)
+
+#undef strlen
+#define strlen qstrlen
+
+#undef strcpy
+#define strcpy qstrcpy
+
+#undef strcmp
+#define strcmp qstrcmp
+
+#undef strncmp
+#define strncmp qstrncmp
+
+#undef stricmp
+#define stricmp qstricmp
+
+#undef strnicmp
+#define strnicmp qstrnicmp
+
+#endif
+
+// qChecksum: Internet checksum
+
+Q_EXPORT Q_UINT16 qChecksum( const char *s, uint len );
+
+/*****************************************************************************
+ QByteArray class
+ *****************************************************************************/
+
+#if defined(Q_TEMPLATEDLL)
+template class Q_EXPORT QArray<char>;
+#endif
+typedef QArray<char> QByteArray;
+
+
+/*****************************************************************************
+ QByteArray stream functions
+ *****************************************************************************/
+#ifndef QT_NO_DATASTREAM
+Q_EXPORT QDataStream &operator<<( QDataStream &, const QByteArray & );
+Q_EXPORT QDataStream &operator>>( QDataStream &, QByteArray & );
+#endif
+
+class QRegExp;
+
+/** This is an alternative implementation of QCString. It provides basically
+ * the same functions but uses less memory for administration. This class
+ * is just a wrapper around a plain C string requiring only 4 bytes "overhead".
+ * QCString features sharing of data and stores the string length, but
+ * requires 4 + 12 bytes for this (even for the empty string). As doxygen
+ * uses a LOT of string during a run it saves a lot of memory to use a
+ * more memory efficient implementation at the cost of relatively low
+ * runtime overhead.
+ */
+class QCString
+{
+public:
+ QCString() : m_data(0) {} // make null string
+ QCString( const QCString &s );
+ QCString( int size );
+ QCString( const char *str );
+ QCString( const char *str, uint maxlen );
+ ~QCString();
+
+ QCString &operator=( const QCString &s );// deep copy
+ QCString &operator=( const char *str ); // deep copy
+
+ bool isNull() const;
+ bool isEmpty() const;
+ uint length() const;
+ uint size() const { return m_data ? length()+1 : 0; }
+ char * data() const { return m_data; }
+ bool resize( uint newlen );
+ bool truncate( uint pos );
+ bool fill( char c, int len = -1 );
+
+ QCString copy() const;
+
+ QCString &sprintf( const char *format, ... );
+
+ int find( char c, int index=0, bool cs=TRUE ) const;
+ int find( const char *str, int index=0, bool cs=TRUE ) const;
+ int find( const QCString &str, int index=0, bool cs=TRUE ) const;
+ int find( const QRegExp &, int index=0 ) const;
+ int findRev( char c, int index=-1, bool cs=TRUE) const;
+ int findRev( const char *str, int index=-1, bool cs=TRUE) const;
+ int findRev( const QRegExp &, int index=-1 ) const;
+ int contains( char c, bool cs=TRUE ) const;
+ int contains( const char *str, bool cs=TRUE ) const;
+ int contains( const QRegExp & ) const;
+ bool stripPrefix(const char *prefix);
+
+ QCString left( uint len ) const;
+ QCString right( uint len ) const;
+ QCString mid( uint index, uint len=0xffffffff) const;
+
+ QCString lower() const;
+ QCString upper() const;
+
+ QCString stripWhiteSpace() const;
+ QCString simplifyWhiteSpace() const;
+
+ QCString &assign( const char *str );
+ QCString &insert( uint index, const char * );
+ QCString &insert( uint index, char );
+ QCString &append( const char *s );
+ QCString &prepend( const char *s );
+ QCString &remove( uint index, uint len );
+ QCString &replace( uint index, uint len, const char * );
+ QCString &replace( const QRegExp &, const char * );
+
+ short toShort( bool *ok=0 ) const;
+ ushort toUShort( bool *ok=0 ) const;
+ int toInt( bool *ok=0 ) const;
+ uint toUInt( bool *ok=0 ) const;
+ long toLong( bool *ok=0 ) const;
+ ulong toULong( bool *ok=0 ) const;
+
+ QCString &setNum( short );
+ QCString &setNum( ushort );
+ QCString &setNum( int );
+ QCString &setNum( uint );
+ QCString &setNum( long );
+ QCString &setNum( ulong );
+ QCString &setNum( float, char f='g', int prec=6 );
+ QCString &setNum( double, char f='g', int prec=6 );
+
+ operator const char *() const;
+ QCString &operator+=( const char *str );
+ QCString &operator+=( char c );
+ char &at( uint index ) const;
+ char &operator[]( int i ) const { return at(i); }
+
+ private:
+ static void msg_index( uint );
+ void duplicate( const QCString &s );
+ void duplicate( const char *str);
+ QCString &duplicate( const char *str, int);
+
+ char * m_data;
+};
+
+inline char &QCString::at( uint index ) const
+{
+ return m_data[index];
+}
+
+inline void QCString::duplicate( const QCString &s )
+{
+ if (!s.isEmpty())
+ {
+ uint l = strlen(s.data());
+ m_data = (char *)malloc(l+1);
+ if (m_data) memcpy(m_data,s.data(),l+1);
+ }
+ else
+ m_data=0;
+}
+
+inline void QCString::duplicate( const char *str)
+{
+ if (str && str[0]!='\0')
+ {
+ uint l = strlen(str);
+ m_data = (char *)malloc(l+1);
+ if (m_data) memcpy(m_data,str,l+1);
+ }
+ else
+ m_data=0;
+}
+
+inline QCString &QCString::duplicate( const char *str, int)
+{
+ if (m_data==str) return *this;
+ if (m_data) free(m_data);
+ duplicate(str);
+ return *this;
+}
+
+/*****************************************************************************
+ QCString stream functions
+ *****************************************************************************/
+#ifndef QT_NO_DATASTREAM
+Q_EXPORT QDataStream &operator<<( QDataStream &, const QCString & );
+Q_EXPORT QDataStream &operator>>( QDataStream &, QCString & );
+#endif
+
+/*****************************************************************************
+ QCString inline functions
+ *****************************************************************************/
+
+inline QCString &QCString::operator=( const QCString &s )
+{ return (QCString&)assign( s ); }
+
+inline QCString &QCString::operator=( const char *str )
+{ return (QCString&)duplicate( str, qstrlen(str)+1 ); }
+
+inline bool QCString::isNull() const
+{ return data() == 0; }
+
+inline bool QCString::isEmpty() const
+{ return data() == 0 || *data() == '\0'; }
+
+inline uint QCString::length() const
+{ return qstrlen( data() ); }
+
+inline bool QCString::truncate( uint pos )
+{ return resize(pos+1); }
+
+inline QCString QCString::copy() const
+{ return QCString( data() ); }
+
+inline QCString &QCString::prepend( const char *s )
+{ return insert(0,s); }
+
+inline QCString &QCString::append( const char *s )
+{ return operator+=(s); }
+
+inline QCString &QCString::setNum( short n )
+{ return setNum((long)n); }
+
+inline QCString &QCString::setNum( ushort n )
+{ return setNum((ulong)n); }
+
+inline QCString &QCString::setNum( int n )
+{ return setNum((long)n); }
+
+inline QCString &QCString::setNum( uint n )
+{ return setNum((ulong)n); }
+
+inline QCString &QCString::setNum( float n, char f, int prec )
+{ return setNum((double)n,f,prec); }
+
+inline QCString::operator const char *() const
+{ return (const char *)data(); }
+
+
+/*****************************************************************************
+ QCString non-member operators
+ *****************************************************************************/
+
+Q_EXPORT inline bool operator==( const QCString &s1, const QCString &s2 )
+{ return qstrcmp(s1.data(),s2.data()) == 0; }
+
+Q_EXPORT inline bool operator==( const QCString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) == 0; }
+
+Q_EXPORT inline bool operator==( const char *s1, const QCString &s2 )
+{ return qstrcmp(s1,s2.data()) == 0; }
+
+Q_EXPORT inline bool operator!=( const QCString &s1, const QCString &s2 )
+{ return qstrcmp(s1.data(),s2.data()) != 0; }
+
+Q_EXPORT inline bool operator!=( const QCString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) != 0; }
+
+Q_EXPORT inline bool operator!=( const char *s1, const QCString &s2 )
+{ return qstrcmp(s1,s2.data()) != 0; }
+
+Q_EXPORT inline bool operator<( const QCString &s1, const QCString& s2 )
+{ return qstrcmp(s1.data(),s2.data()) < 0; }
+
+Q_EXPORT inline bool operator<( const QCString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) < 0; }
+
+Q_EXPORT inline bool operator<( const char *s1, const QCString &s2 )
+{ return qstrcmp(s1,s2.data()) < 0; }
+
+Q_EXPORT inline bool operator<=( const QCString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) <= 0; }
+
+Q_EXPORT inline bool operator<=( const char *s1, const QCString &s2 )
+{ return qstrcmp(s1,s2.data()) <= 0; }
+
+Q_EXPORT inline bool operator>( const QCString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) > 0; }
+
+Q_EXPORT inline bool operator>( const char *s1, const QCString &s2 )
+{ return qstrcmp(s1,s2.data()) > 0; }
+
+Q_EXPORT inline bool operator>=( const QCString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) >= 0; }
+
+Q_EXPORT inline bool operator>=( const char *s1, const QCString &s2 )
+{ return qstrcmp(s1,s2.data()) >= 0; }
+
+Q_EXPORT inline QCString operator+( const QCString &s1, const QCString &s2 )
+{
+ QCString tmp(s1);
+ tmp += s2;
+ return tmp;
+}
+
+
+inline QCString operator+( const QCString &s1, const QGString &s2 );
+inline QCString operator+( const QGString &s1, const QCString &s2 );
+
+
+Q_EXPORT inline QCString operator+( const QCString &s1, const char *s2 )
+{
+ QCString tmp(s1);
+ tmp += s2;
+ return tmp;
+}
+
+Q_EXPORT inline QCString operator+( const char *s1, const QCString &s2 )
+{
+ QCString tmp(s1);
+ tmp += s2;
+ return tmp;
+}
+
+Q_EXPORT inline QCString operator+( const QCString &s1, char c2 )
+{
+ QCString tmp( s1.data() );
+ tmp += c2;
+ return tmp;
+}
+
+Q_EXPORT inline QCString operator+( char c1, const QCString &s2 )
+{
+ QCString tmp;
+ tmp += c1;
+ tmp += s2;
+ return tmp;
+}
+
+inline const char *qPrint(const char *s)
+{
+ if (s) return s; else return "";
+}
+
+inline const char *qPrint(const QCString &s)
+{
+ if (!s.isEmpty()) return s.data(); else return "";
+}
+
+
+#endif // QCSTRING_H
diff --git a/qtools/qdatastream.cpp b/qtools/qdatastream.cpp
new file mode 100644
index 0000000..7f63cbf
--- /dev/null
+++ b/qtools/qdatastream.cpp
@@ -0,0 +1,951 @@
+/****************************************************************************
+**
+**
+** Implementation of QDataStream class
+**
+** Created : 930831
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qdatastream.h"
+
+#ifndef QT_NO_DATASTREAM
+#include "qbuffer.h"
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+// REVISED: warwick
+/*!
+ \class QDataStream qdatastream.h
+
+ \brief The QDataStream class provides serialization of
+ binary data to a QIODevice.
+
+ \ingroup io
+
+ A data stream is a binary stream of encoded information which is 100%
+ independent of the host computer operation system, CPU or byte order. A
+ stream that is written by a PC under DOS/Windows can be read by a
+ Sun SPARC running Solaris.
+
+ The QDataStream class implements serialization of primitive types, like
+ \c char, \c short, \c int, \c char* etc. Serialization of more complex
+ data is accomplished by breaking up the data into primitive units.
+
+ The programmer can select which byte order to use when serializing data.
+ The default setting is big endian (MSB first). Changing it to little
+ endian breaks the portability (unless the reader also changes to little
+ endian). We recommend keeping this setting unless you have
+ special requirements.
+
+ A data stream cooperates closely with a QIODevice. A QIODevice
+ represents an input/output medium one can read data from and write data
+ to. The QFile class is an example of an IO device.
+
+ Example (write data to a stream):
+ \code
+ QFile f( "file.dta" );
+ f.open( IO_WriteOnly ); // open file for writing
+ QDataStream s( &f ); // serialize using f
+ s << "the answer is"; // serialize string
+ s << (Q_INT32)42; // serialize integer
+ \endcode
+
+ Example (read data from a stream):
+ \code
+ QFile f( "file.dta" );
+ f.open( IO_ReadOnly ); // open file for reading
+ QDataStream s( &f ); // serialize using f
+ char *str;
+ Q_INT32 a;
+ s >> str >> a; // "the answer is" and 42
+ delete str; // delete string
+ \endcode
+
+ In the last example, if you read into a QString instead of a \c char*
+ you do not have to delete it.
+
+ Normally, each item written to the stream is written in a fixed binary
+ format.
+ For example, a \c char* is written as a 32-bit integer equal to the
+ length of the string including the NUL byte, followed by all the
+ characters of the string including the NUL byte. Similarly when
+ reading a string, 4 bytes are read to create the 32-bit length value,
+ then that many characters for the string including the NUL. For a complete
+ description of all Qt types supporting data streaming see \link
+ datastreamformat.html Format of the QDataStream operators \endlink .
+
+ If you want a "parsing" input stream, see QTextStream. If you just want the
+ data to be human-readable to aid in debugging, you can set the data
+ stream into printable data mode with setPrintableData(). The data is
+ then written slower, in a human readable bloated form that is sufficient
+ for debugging.
+
+ If you are producing a new binary data format, such as a file format
+ for documents created by your application, you could use a QDataStream
+ to write the data in a portable format. Typically, you would write
+ a brief header containing a magic string and a version number to give
+ yourself room for future expansion. For example:
+
+ \code
+ // Open the file.
+ QFile f( "file.xxx" );
+ f.open( IO_WriteOnly );
+ QDataStream s( &f );
+
+ // Write a header with a "magic number" and a version
+ s << 0xa0b0c0d0;
+ s << 123;
+
+ // Write the data
+ s << [lots of interesting data]
+ \endcode
+
+ Then read it in with:
+
+ \code
+ // Open the file.
+ QFile f( "file.xxx" );
+ f.open( IO_ReadOnly );
+ QDataStream s( &f );
+
+ // Read and check the header
+ Q_UINT32 magic;
+ s >> magic;
+ if ( magic != 0xa0b0c0d0 )
+ return XXX_BAD_FILE_FORMAT;
+
+ // Read the version
+ Q_INT32 version;
+ s >> version;
+ if ( version < 100 )
+ return XXX_BAD_FILE_TOO_OLD;
+ if ( version > 123 )
+ return XXX_BAD_FILE_TOO_NEW;
+ if ( version <= 110 )
+ s.setVersion(1);
+
+ // Read the data
+ s >> [lots of interesting data];
+ if ( version > 120 )
+ s >> [data new in XXX version 1.2];
+ s >> [other interesting data];
+ \endcode
+
+ \sa QTextStream QVariant
+*/
+
+
+/*****************************************************************************
+ QDataStream member functions
+ *****************************************************************************/
+
+#if defined(CHECK_STATE)
+#undef CHECK_STREAM_PRECOND
+#define CHECK_STREAM_PRECOND if ( !dev ) { \
+ qWarning( "QDataStream: No device" ); \
+ return *this; }
+#else
+#define CHECK_STREAM_PRECOND
+#endif
+
+static int systemWordSize = 0;
+static bool systemBigEndian;
+
+static const int DefaultStreamVersion = 3;
+// 3 is default in Qt 2.1
+// 2 is the Qt 2.0.x format
+// 1 is the Qt 1.x format
+
+/*!
+ Constructs a data stream that has no IO device.
+
+ \sa setDevice()
+*/
+
+QDataStream::QDataStream()
+{
+ if ( systemWordSize == 0 ) // get system features
+ qSysInfo( &systemWordSize, &systemBigEndian );
+ dev = 0; // no device set
+ owndev = FALSE;
+ byteorder = BigEndian; // default byte order
+ printable = FALSE;
+ ver = DefaultStreamVersion;
+ noswap = systemBigEndian;
+}
+
+/*!
+ Constructs a data stream that uses the IO device \a d.
+
+ \sa setDevice(), device()
+*/
+
+QDataStream::QDataStream( QIODevice *d )
+{
+ if ( systemWordSize == 0 ) // get system features
+ qSysInfo( &systemWordSize, &systemBigEndian );
+ dev = d; // set device
+ owndev = FALSE;
+ byteorder = BigEndian; // default byte order
+ printable = FALSE;
+ ver = DefaultStreamVersion;
+ noswap = systemBigEndian;
+}
+
+/*!
+ Constructs a data stream that operates on a byte array through an
+ internal QBuffer device.
+
+ Example:
+ \code
+ static char bindata[] = { 231, 1, 44, ... };
+ QByteArray a;
+ a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
+ QDataStream s( a, IO_ReadOnly ); // open on a's data
+ s >> [something]; // read raw bindata
+ a.resetRawData( bindata, sizeof(bindata) ); // finished
+ \endcode
+
+ The QArray::setRawData() function is not for the inexperienced.
+*/
+
+QDataStream::QDataStream( QByteArray a, int mode )
+{
+ if ( systemWordSize == 0 ) // get system features
+ qSysInfo( &systemWordSize, &systemBigEndian );
+ dev = new QBuffer( a ); // create device
+ ((QBuffer *)dev)->open( mode ); // open device
+ owndev = TRUE;
+ byteorder = BigEndian; // default byte order
+ printable = FALSE;
+ ver = DefaultStreamVersion;
+ noswap = systemBigEndian;
+}
+
+/*!
+ Destructs the data stream.
+
+ The destructor will not affect the current IO device, unless it
+ is an internal IO device processing a QByteArray passed in the constructor.
+*/
+
+QDataStream::~QDataStream()
+{
+ if ( owndev )
+ delete dev;
+}
+
+
+/*!
+ \fn QIODevice *QDataStream::device() const
+ Returns the IO device currently set.
+ \sa setDevice(), unsetDevice()
+*/
+
+/*!
+ void QDataStream::setDevice(QIODevice *d )
+ Sets the IO device to \a d.
+ \sa device(), unsetDevice()
+*/
+
+void QDataStream::setDevice(QIODevice *d )
+{
+ if ( owndev ) {
+ delete dev;
+ owndev = FALSE;
+ }
+ dev = d;
+}
+
+/*!
+ Unsets the IO device. This is the same as calling setDevice( 0 ).
+ \sa device(), setDevice()
+*/
+
+void QDataStream::unsetDevice()
+{
+ setDevice( 0 );
+}
+
+
+/*!
+ \fn bool QDataStream::atEnd() const
+ Returns TRUE if the IO device has reached the end position (end of
+ stream or file) or if there is no IO device set.
+
+ Returns FALSE if the current position of the read/write head of the IO
+ device is somewhere before the end position.
+
+ \sa QIODevice::atEnd()
+*/
+
+/*!\fn bool QDataStream::eof() const
+
+ \obsolete
+
+ Returns TRUE if the IO device has reached the end position (end of
+ stream or file) or if there is no IO device set.
+
+ Returns FALSE if the current position of the read/write head of the IO
+ device is somewhere before the end position.
+
+ \sa QIODevice::atEnd()
+*/
+
+/*!
+ \fn int QDataStream::byteOrder() const
+ Returns the current byte order setting - either \c BigEndian or
+ \c LittleEndian.
+
+ \sa setByteOrder()
+*/
+
+/*!
+ Sets the serialization byte order to \a bo.
+
+ The \a bo parameter can be \c QDataStream::BigEndian or
+ \c QDataStream::LittleEndian.
+
+ The default setting is big endian. We recommend leaving this setting unless
+ you have special requirements.
+
+ \sa byteOrder()
+*/
+
+void QDataStream::setByteOrder( int bo )
+{
+ byteorder = bo;
+ if ( systemBigEndian )
+ noswap = byteorder == BigEndian;
+ else
+ noswap = byteorder == LittleEndian;
+}
+
+
+/*!
+ \fn bool QDataStream::isPrintableData() const
+ Returns TRUE if the printable data flag has been set.
+ \sa setPrintableData()
+*/
+
+/*!
+ \fn void QDataStream::setPrintableData( bool enable )
+ Sets or clears the printable data flag.
+
+ If this flag is set, the write functions will generate output that
+ consists of printable characters (7 bit ASCII).
+
+ We recommend enabling printable data only for debugging purposes
+ (it is slower and creates larger output).
+*/
+
+
+/*!
+ \fn int QDataStream::version() const
+ Returns the version number of the data serialization format.
+ In Qt 2.1, this number is by default 3.
+ \sa setVersion()
+*/
+
+/*!
+ \fn void QDataStream::setVersion( int v )
+ Sets the version number of the data serialization format.
+
+ In order to accomodate for new functionality, the datastream
+ serialization format of some Qt classes has changed in some versions of
+ Qt. If you want to read data that was created by an earlier version of
+ Qt, or write data that can be read by a program that was compiled with
+ an earlier version of Qt, use this function to modify the serialization
+ format of QDataStream.
+
+ For Qt 1.x compatibility, use \a v == 1.
+
+ For Qt 2.0.x compatibility, use \a v == 2 (Not required for reading in
+ Qt 2.1).
+
+ \sa version()
+*/
+
+/*****************************************************************************
+ QDataStream read functions
+ *****************************************************************************/
+
+
+static Q_INT32 read_int_ascii( QDataStream *s )
+{
+ register int n = 0;
+ char buf[40];
+ while ( TRUE ) {
+ buf[n] = s->device()->getch();
+ if ( buf[n] == '\n' || n > 38 ) // $-terminator
+ break;
+ n++;
+ }
+ buf[n] = '\0';
+ return atol( buf );
+}
+
+
+/*!
+ \fn QDataStream &QDataStream::operator>>( Q_UINT8 &i )
+ Reads an unsigned byte from the stream and returns a reference to
+ the stream.
+*/
+
+/*!
+ Reads a signed byte from the stream.
+*/
+
+QDataStream &QDataStream::operator>>( Q_INT8 &i )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ i = (Q_INT8)dev->getch();
+ if ( i == '\\' ) { // read octal code
+ char buf[4];
+ dev->readBlock( buf, 3 );
+ i = (buf[2] & 0x07)+((buf[1] & 0x07) << 3)+((buf[0] & 0x07) << 6);
+ }
+ } else { // data or text
+ i = (Q_INT8)dev->getch();
+ }
+ return *this;
+}
+
+
+/*!
+ \fn QDataStream &QDataStream::operator>>( Q_UINT16 &i )
+ Reads an unsigned 16-bit integer from the stream and returns a reference to
+ the stream.
+*/
+
+/*!
+ Reads a signed 16-bit integer from the stream and returns a reference to
+ the stream.
+*/
+
+QDataStream &QDataStream::operator>>( Q_INT16 &i )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ i = (Q_INT16)read_int_ascii( this );
+ } else if ( noswap ) { // no conversion needed
+ dev->readBlock( (char *)&i, sizeof(Q_INT16) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&i);
+ char b[2];
+ dev->readBlock( b, 2 );
+ *p++ = b[1];
+ *p = b[0];
+ }
+ return *this;
+}
+
+
+/*!
+ \fn QDataStream &QDataStream::operator>>( Q_UINT32 &i )
+ Reads an unsigned 32-bit integer from the stream and returns a reference to
+ the stream.
+*/
+
+/*!
+ Reads a signed 32-bit integer from the stream and returns a reference to
+ the stream.
+*/
+
+QDataStream &QDataStream::operator>>( Q_INT32 &i )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ i = read_int_ascii( this );
+ } else if ( noswap ) { // no conversion needed
+ dev->readBlock( (char *)&i, sizeof(Q_INT32) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&i);
+ char b[4];
+ dev->readBlock( b, 4 );
+ *p++ = b[3];
+ *p++ = b[2];
+ *p++ = b[1];
+ *p = b[0];
+ }
+ return *this;
+}
+
+/*!
+ \fn QDataStream &QDataStream::operator>>( Q_UINT64 &i )
+ Reads an unsigned 64-bit integer from the stream and returns a reference to
+ the stream, or uses the Q_UINT32 operator if 64 bit is not available.
+*/
+
+/*!
+ Reads a signed 64-bit integer from the stream and returns a reference to
+ the stream, or uses the Q_UINT32 operator if 64 bit is not available.
+*/
+
+QDataStream &QDataStream::operator>>( Q_INT64 &i )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ i = read_int_ascii( this );
+ } else if ( noswap ) { // no conversion needed
+ dev->readBlock( (char *)&i, sizeof(Q_INT64) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&i);
+ char b[sizeof(Q_INT64)];
+ dev->readBlock( b, sizeof(Q_INT64) );
+ if ( sizeof(Q_INT64) == 8 ) {
+ *p++ = b[7];
+ *p++ = b[6];
+ *p++ = b[5];
+ *p++ = b[4];
+ }
+ *p++ = b[3];
+ *p++ = b[2];
+ *p++ = b[1];
+ *p = b[0];
+ }
+ return *this;
+}
+
+static double read_double_ascii( QDataStream *s )
+{
+ register int n = 0;
+ char buf[80];
+ while ( TRUE ) {
+ buf[n] = s->device()->getch();
+ if ( buf[n] == '\n' || n > 78 ) // $-terminator
+ break;
+ n++;
+ }
+ buf[n] = '\0';
+ return atof( buf );
+}
+
+
+/*!
+ Reads a 32-bit floating point number from the stream using the standard
+ IEEE754 format. Returns a reference to the stream.
+*/
+
+QDataStream &QDataStream::operator>>( float &f )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ f = (float)read_double_ascii( this );
+ } else if ( noswap ) { // no conversion needed
+ dev->readBlock( (char *)&f, sizeof(float) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&f);
+ char b[4];
+ dev->readBlock( b, 4 );
+ *p++ = b[3];
+ *p++ = b[2];
+ *p++ = b[1];
+ *p = b[0];
+ }
+ return *this;
+}
+
+
+/*!
+ Reads a 64-bit floating point number from the stream using the standard
+ IEEE754 format. Returns a reference to the stream.
+*/
+
+QDataStream &QDataStream::operator>>( double &f )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ f = read_double_ascii( this );
+ } else if ( noswap ) { // no conversion needed
+ dev->readBlock( (char *)&f, sizeof(double) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&f);
+ char b[8];
+ dev->readBlock( b, 8 );
+ *p++ = b[7];
+ *p++ = b[6];
+ *p++ = b[5];
+ *p++ = b[4];
+ *p++ = b[3];
+ *p++ = b[2];
+ *p++ = b[1];
+ *p = b[0];
+ }
+ return *this;
+}
+
+
+/*!
+ Reads the '\0'-terminated string \a s from the stream and returns
+ a reference to the stream.
+
+ Space for the string is allocated using \c new - the caller must
+ eventually call delete[] on the value.
+*/
+
+QDataStream &QDataStream::operator>>( char *&s )
+{
+ uint len = 0;
+ return readBytes( s, len );
+}
+
+
+/*!
+ Reads the buffer \a s from the stream and returns a reference to the
+ stream.
+
+ The buffer \a s is allocated using \c new. Destroy it with the \c delete[]
+ operator. If the length is zero or \a s cannot be allocated, \a s is
+ set to 0.
+
+ The \a l parameter will be set to the length of the buffer.
+
+ The serialization format is an Q_UINT32 length specifier first, then the
+ data (\a l bytes).
+
+ \sa readRawBytes(), writeBytes()
+*/
+
+QDataStream &QDataStream::readBytes( char *&s, uint &l )
+{
+ CHECK_STREAM_PRECOND
+ Q_UINT32 len;
+ *this >> len; // first read length spec
+ l = (uint)len;
+ if ( len == 0 || eof() ) {
+ s = 0;
+ return *this;
+ } else {
+ s = new char[len]; // create char array
+ CHECK_PTR( s );
+ if ( !s ) // no memory
+ return *this;
+ return readRawBytes( s, (uint)len );
+ }
+}
+
+
+/*!
+ Reads \a len bytes from the stream into \a s and returns a reference to
+ the stream.
+
+ The buffer \a s must be preallocated.
+
+ \sa readBytes(), QIODevice::readBlock(), writeRawBytes()
+*/
+
+QDataStream &QDataStream::readRawBytes( char *s, uint len )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ register Q_INT8 *p = (Q_INT8*)s;
+ while ( len-- )
+ *this >> *p++;
+ } else { // read data char array
+ dev->readBlock( s, len );
+ }
+ return *this;
+}
+
+
+/*****************************************************************************
+ QDataStream write functions
+ *****************************************************************************/
+
+
+/*!
+ \fn QDataStream &QDataStream::operator<<( Q_UINT8 i )
+ Writes an unsigned byte to the stream and returns a reference to
+ the stream.
+*/
+
+/*!
+ Writes a signed byte to the stream.
+*/
+
+QDataStream &QDataStream::operator<<( Q_INT8 i )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable && (i == '\\' || !isprint(i)) ) {
+ char buf[6]; // write octal code
+ buf[0] = '\\';
+ buf[1] = '0' + ((i >> 6) & 0x07);
+ buf[2] = '0' + ((i >> 3) & 0x07);
+ buf[3] = '0' + (i & 0x07);
+ buf[4] = '\0';
+ dev->writeBlock( buf, 4 );
+ } else {
+ dev->putch( i );
+ }
+ return *this;
+}
+
+
+/*!
+ \fn QDataStream &QDataStream::operator<<( Q_UINT16 i )
+ Writes an unsigned 16-bit integer to the stream and returns a reference
+ to the stream.
+*/
+
+/*!
+ Writes a signed 16-bit integer to the stream and returns a reference to
+ the stream.
+*/
+
+QDataStream &QDataStream::operator<<( Q_INT16 i )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ char buf[16];
+ sprintf( buf, "%d\n", i );
+ dev->writeBlock( buf, strlen(buf) );
+ } else if ( noswap ) { // no conversion needed
+ dev->writeBlock( (char *)&i, sizeof(Q_INT16) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&i);
+ char b[2];
+ b[1] = *p++;
+ b[0] = *p;
+ dev->writeBlock( b, 2 );
+ }
+ return *this;
+}
+
+
+/*!
+ \fn QDataStream &QDataStream::operator<<( Q_UINT32 i )
+ Writes an unsigned 32-bit integer to the stream and returns a reference to
+ the stream.
+*/
+
+/*!
+ Writes a signed 32-bit integer to the stream and returns a reference to
+ the stream.
+*/
+
+QDataStream &QDataStream::operator<<( Q_INT32 i )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ char buf[16];
+ sprintf( buf, "%d\n", i );
+ dev->writeBlock( buf, strlen(buf) );
+ } else if ( noswap ) { // no conversion needed
+ dev->writeBlock( (char *)&i, sizeof(Q_INT32) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&i);
+ char b[4];
+ b[3] = *p++;
+ b[2] = *p++;
+ b[1] = *p++;
+ b[0] = *p;
+ dev->writeBlock( b, 4 );
+ }
+ return *this;
+}
+
+/*!
+ \fn QDataStream &QDataStream::operator<<( Q_UINT64 i )
+ Writes an unsigned 64-bit integer to the stream and returns a reference to
+ the stream, or uses the Q_UINT32-operator if 64 bit is not available.
+*/
+
+/*!
+ Writes a signed 64-bit integer to the stream and returns a reference to
+ the stream, or calls the Q_INT32-operator if 64 bit is not available.
+*/
+
+QDataStream &QDataStream::operator<<( Q_INT64 i )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ char buf[20];
+ sprintf( buf, "%ld\n", i );
+ dev->writeBlock( buf, strlen(buf) );
+ } else if ( noswap ) { // no conversion needed
+ dev->writeBlock( (char *)&i, sizeof(Q_INT64) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&i);
+ char b[sizeof(Q_INT64)];
+ if ( sizeof(Q_INT64) == 8 ) {
+ b[7] = *p++;
+ b[6] = *p++;
+ b[5] = *p++;
+ b[4] = *p++;
+ }
+ b[3] = *p++;
+ b[2] = *p++;
+ b[1] = *p++;
+ b[0] = *p;
+ dev->writeBlock( b, sizeof(Q_INT64) );
+ }
+ return *this;
+}
+
+/*!
+ \fn QDataStream &QDataStream::operator<<( uint i )
+ Writes an unsigned integer to the stream as a 32-bit unsigned integer
+ (Q_UINT32).
+ Returns a reference to the stream.
+*/
+
+/*!
+ \fn QDataStream &QDataStream::operator<<( int i )
+ Writes a signed integer to the stream as a 32-bit signed integer (Q_INT32).
+ Returns a reference to the stream.
+*/
+
+
+/*!
+ Writes a 32-bit floating point number to the stream using the standard
+ IEEE754 format. Returns a reference to the stream.
+*/
+
+QDataStream &QDataStream::operator<<( float f )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ char buf[32];
+ sprintf( buf, "%g\n", (double)f );
+ dev->writeBlock( buf, strlen(buf) );
+ } else {
+ float g = f; // fixes float-on-stack problem
+ if ( noswap ) { // no conversion needed
+ dev->writeBlock( (char *)&g, sizeof(float) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&g);
+ char b[4];
+ b[3] = *p++;
+ b[2] = *p++;
+ b[1] = *p++;
+ b[0] = *p;
+ dev->writeBlock( b, 4 );
+ }
+ }
+ return *this;
+}
+
+
+/*!
+ Writes a 64-bit floating point number to the stream using the standard
+ IEEE754 format. Returns a reference to the stream.
+*/
+
+QDataStream &QDataStream::operator<<( double f )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // printable data
+ char buf[32];
+ sprintf( buf, "%g\n", f );
+ dev->writeBlock( buf, strlen(buf) );
+ } else if ( noswap ) { // no conversion needed
+ dev->writeBlock( (char *)&f, sizeof(double) );
+ } else { // swap bytes
+ register uchar *p = (uchar *)(&f);
+ char b[8];
+ b[7] = *p++;
+ b[6] = *p++;
+ b[5] = *p++;
+ b[4] = *p++;
+ b[3] = *p++;
+ b[2] = *p++;
+ b[1] = *p++;
+ b[0] = *p;
+ dev->writeBlock( b, 8 );
+ }
+ return *this;
+}
+
+
+/*!
+ Writes the '\0'-terminated string \a s to the stream and returns
+ a reference to the stream.
+
+ The string is serialized using writeBytes().
+*/
+
+QDataStream &QDataStream::operator<<( const char *s )
+{
+ if ( !s ) {
+ *this << (Q_UINT32)0;
+ return *this;
+ }
+ uint len = qstrlen( s ) + 1; // also write null terminator
+ *this << (Q_UINT32)len; // write length specifier
+ return writeRawBytes( s, len );
+}
+
+
+/*!
+ Writes the length specifier \a len and the buffer \a s to the stream and
+ returns a reference to the stream.
+
+ The \a len is serialized as an Q_UINT32, followed by \a len bytes from
+ \a s.
+
+ \sa writeRawBytes(), readBytes()
+*/
+
+QDataStream &QDataStream::writeBytes(const char *s, uint len)
+{
+ CHECK_STREAM_PRECOND
+ *this << (Q_UINT32)len; // write length specifier
+ if ( len )
+ writeRawBytes( s, len );
+ return *this;
+}
+
+
+/*!
+ Writes \a len bytes from \a s to the stream and returns a reference to the
+ stream.
+
+ \sa writeBytes(), QIODevice::writeBlock(), readRawBytes()
+*/
+
+QDataStream &QDataStream::writeRawBytes( const char *s, uint len )
+{
+ CHECK_STREAM_PRECOND
+ if ( printable ) { // write printable
+ register char *p = (char *)s;
+ while ( len-- )
+ *this << *p++;
+ } else { // write data char array
+ dev->writeBlock( s, len );
+ }
+ return *this;
+}
+
+#endif // QT_NO_DATASTREAM
diff --git a/qtools/qdatastream.h b/qtools/qdatastream.h
new file mode 100644
index 0000000..3d18062
--- /dev/null
+++ b/qtools/qdatastream.h
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+**
+** Definition of QDataStream class
+**
+** Created : 930831
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QDATASTREAM_H
+#define QDATASTREAM_H
+
+#ifndef QT_H
+#include "qiodevice.h"
+#include "qstring.h"
+#endif // QT_H
+
+#ifndef QT_NO_DATASTREAM
+class Q_EXPORT QDataStream // data stream class
+{
+public:
+ QDataStream();
+ QDataStream( QIODevice * );
+ QDataStream( QByteArray, int mode );
+ virtual ~QDataStream();
+
+ QIODevice *device() const;
+ void setDevice( QIODevice * );
+ void unsetDevice();
+
+ bool atEnd() const;
+ bool eof() const;
+
+ enum ByteOrder { BigEndian, LittleEndian };
+ int byteOrder() const;
+ void setByteOrder( int );
+
+ bool isPrintableData() const;
+ void setPrintableData( bool );
+
+ int version() const;
+ void setVersion( int );
+
+ QDataStream &operator>>( Q_INT8 &i );
+ QDataStream &operator>>( Q_UINT8 &i );
+ QDataStream &operator>>( Q_INT16 &i );
+ QDataStream &operator>>( Q_UINT16 &i );
+ QDataStream &operator>>( Q_INT32 &i );
+ QDataStream &operator>>( Q_UINT32 &i );
+ QDataStream &operator>>( Q_INT64 &i );
+ QDataStream &operator>>( Q_UINT64 &i );
+
+ QDataStream &operator>>( float &f );
+ QDataStream &operator>>( double &f );
+ QDataStream &operator>>( char *&str );
+
+ QDataStream &operator<<( Q_INT8 i );
+ QDataStream &operator<<( Q_UINT8 i );
+ QDataStream &operator<<( Q_INT16 i );
+ QDataStream &operator<<( Q_UINT16 i );
+ QDataStream &operator<<( Q_INT32 i );
+ QDataStream &operator<<( Q_UINT32 i );
+ QDataStream &operator<<( Q_INT64 i );
+ QDataStream &operator<<( Q_UINT64 i );
+ QDataStream &operator<<( float f );
+ QDataStream &operator<<( double f );
+ QDataStream &operator<<( const char *str );
+
+ QDataStream &readBytes( char *&, uint &len );
+ QDataStream &readRawBytes( char *, uint len );
+
+ QDataStream &writeBytes( const char *, uint len );
+ QDataStream &writeRawBytes( const char *, uint len );
+
+private:
+ QIODevice *dev;
+ bool owndev;
+ int byteorder;
+ bool printable;
+ bool noswap;
+ int ver;
+
+private: // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+ QDataStream( const QDataStream & );
+ QDataStream &operator=( const QDataStream & );
+#endif
+};
+
+
+/*****************************************************************************
+ QDataStream inline functions
+ *****************************************************************************/
+
+inline QIODevice *QDataStream::device() const
+{ return dev; }
+
+inline bool QDataStream::atEnd() const
+{ return dev ? dev->atEnd() : TRUE; }
+
+inline bool QDataStream::eof() const
+{ return atEnd(); }
+
+inline int QDataStream::byteOrder() const
+{ return byteorder; }
+
+inline bool QDataStream::isPrintableData() const
+{ return printable; }
+
+inline void QDataStream::setPrintableData( bool p )
+{ printable = p; }
+
+inline int QDataStream::version() const
+{ return ver; }
+
+inline void QDataStream::setVersion( int v )
+{ ver = v; }
+
+inline QDataStream &QDataStream::operator>>( Q_UINT8 &i )
+{ return *this >> (Q_INT8&)i; }
+
+inline QDataStream &QDataStream::operator>>( Q_UINT16 &i )
+{ return *this >> (Q_INT16&)i; }
+
+inline QDataStream &QDataStream::operator>>( Q_UINT32 &i )
+{ return *this >> (Q_INT32&)i; }
+
+inline QDataStream &QDataStream::operator>>( Q_UINT64 &i )
+{ return *this >> (Q_INT64&)i; }
+
+inline QDataStream &QDataStream::operator<<( Q_UINT8 i )
+{ return *this << (Q_INT8)i; }
+
+inline QDataStream &QDataStream::operator<<( Q_UINT16 i )
+{ return *this << (Q_INT16)i; }
+
+inline QDataStream &QDataStream::operator<<( Q_UINT32 i )
+{ return *this << (Q_INT32)i; }
+
+inline QDataStream &QDataStream::operator<<( Q_UINT64 i )
+{ return *this << (Q_INT64)i; }
+
+
+#endif // QT_NO_DATASTREAM
+#endif // QDATASTREAM_H
diff --git a/qtools/qdatetime.cpp b/qtools/qdatetime.cpp
new file mode 100644
index 0000000..4edaca9
--- /dev/null
+++ b/qtools/qdatetime.cpp
@@ -0,0 +1,1434 @@
+/****************************************************************************
+**
+**
+** Implementation of date and time classes
+**
+** Created : 940124
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#define gettimeofday __hide_gettimeofday
+#include "qdatetime.h"
+#include "qdatastream.h"
+#include <stdio.h>
+#include <time.h>
+#if defined(_OS_WIN32_)
+#if defined(_CC_BOOL_DEF_)
+#undef bool
+#include <windows.h>
+#define bool int
+#else
+#include <windows.h>
+#endif
+#elif defined(_OS_MSDOS_)
+#include <dos.h>
+#elif defined(_OS_OS2_)
+#include <os2.h>
+#elif defined(_OS_UNIX_)
+#include <sys/time.h>
+#include <unistd.h>
+#undef gettimeofday
+extern "C" int gettimeofday( struct timeval *, struct timezone * );
+#endif
+
+static const uint FIRST_DAY = 2361222; // Julian day for 1752/09/14
+static const int FIRST_YEAR = 1752; // ### wrong for many countries
+static const uint SECS_PER_DAY = 86400;
+static const uint MSECS_PER_DAY = 86400000;
+static const uint SECS_PER_HOUR = 3600;
+static const uint MSECS_PER_HOUR= 3600000;
+static const uint SECS_PER_MIN = 60;
+static const uint MSECS_PER_MIN = 60000;
+
+static const short monthDays[] ={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+
+// ##### Localize.
+
+const char * const QDate::monthNames[] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+
+const char * const QDate::weekdayNames[] ={
+ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
+
+
+/*****************************************************************************
+ QDate member functions
+ *****************************************************************************/
+
+// REVISED: aavit
+
+/*!
+ \class QDate qdatetime.h
+ \brief The QDate class provides date functions.
+
+ \ingroup time
+
+ A QDate object contains a calendar date, i.e. year, month, and day
+ numbers in the modern western (Gregorian) calendar. It can read the
+ current date from the system clock. It provides functions for
+ comparing dates and for manipulating a date by adding a number of
+ days.
+
+ A QDate object is typically created either by giving the year, month
+ and day numbers explicitly, or by using the static function
+ currentDate(), which makes a QDate object which contains the
+ system's clock date. An explicit date can also be set using
+ setYMD().
+
+ The year(), month(), and day() functions provide access to the year,
+ month, and day numbers. Also, dayOfWeek() and dayOfYear() functions
+ are provided. The same information is provided in textual format by
+ the toString(), dayName(), and monthName() functions.
+
+ QDate provides a full set of operators to compare two QDate
+ objects. A date is considered smaller than another if it is earlier
+ than the other.
+
+ The date a given number of days later than a given date can be found
+ using the addDays() function. Correspondingly, the number of days
+ between two dates can be found using the daysTo() function.
+
+ The daysInMonth() and daysInYear() functions tell how many days
+ there are in this date's month and year, respectively. The
+ isLeapYear() function tells whether this date is in a leap year.
+
+ Note that QDate may not be used for date calculations for dates in
+ the remote past, i.e. prior to the introduction of the Gregorian
+ calendar. This calendar was adopted by England Sep. 14. 1752 (hence
+ this is the earliest valid QDate), and subsequently by most other
+ western countries, until 1923.
+
+ The end of time is reached around 8000AD, by which time we expect Qt
+ to be obsolete.
+
+ \sa QTime, QDateTime
+*/
+
+
+/*!
+ \fn QDate::QDate()
+ Constructs a null date. Null dates are invalid.
+
+ \sa isNull(), isValid()
+*/
+
+
+/*!
+ Constructs a date with the year \a y, month \a m and day \a d.
+
+ \a y must be in the range 1752-ca. 8000, \a m must be in the range
+ 1-12, and \a d must be in the range 1-31. Exception: if \a y is in
+ the range 0-99, it is interpreted as 1900-1999.
+
+ \sa isValid()
+*/
+
+QDate::QDate( int y, int m, int d )
+{
+ jd = 0;
+ setYMD( y, m, d );
+}
+
+
+/*!
+ \fn bool QDate::isNull() const
+
+ Returns TRUE if the date is null. A null date is invalid.
+
+ \sa isValid()
+*/
+
+
+/*!
+ Returns TRUE if this date is valid.
+
+ \sa isNull()
+*/
+
+bool QDate::isValid() const
+{
+ return jd >= FIRST_DAY;
+}
+
+
+/*!
+ Returns the year (>= 1752) of this date.
+
+ \sa month(), day()
+*/
+
+int QDate::year() const
+{
+ int y, m, d;
+ jul2greg( jd, y, m, d );
+ return y;
+}
+
+/*!
+ Returns the month (January=1 .. December=12) of this date.
+
+ \sa year(), day()
+*/
+
+int QDate::month() const
+{
+ int y, m, d;
+ jul2greg( jd, y, m, d );
+ return m;
+}
+
+/*!
+ Returns the day of the month (1..31) of this date.
+
+ \sa year(), month(), dayOfWeek()
+*/
+
+int QDate::day() const
+{
+ int y, m, d;
+ jul2greg( jd, y, m, d );
+ return d;
+}
+
+/*!
+ Returns the weekday (Monday=1 .. Sunday=7) for this date.
+
+ \sa day(), dayOfYear()
+*/
+
+int QDate::dayOfWeek() const
+{
+ return (((jd+1) % 7) + 6)%7 + 1;
+}
+
+/*!
+ Returns the day of the year (1..365) for this date.
+
+ \sa day(), dayOfWeek()
+*/
+
+int QDate::dayOfYear() const
+{
+ return jd - greg2jul(year(), 1, 1) + 1;
+}
+
+/*!
+ Returns the number of days in the month (28..31) for this date.
+
+ \sa day(), daysInYear()
+*/
+
+int QDate::daysInMonth() const
+{
+ int y, m, d;
+ jul2greg( jd, y, m, d );
+ if ( m == 2 && leapYear(y) )
+ return 29;
+ else
+ return monthDays[m];
+}
+
+/*!
+ Returns the number of days in the year (365 or 366) for this date.
+
+ \sa day(), daysInMonth()
+*/
+
+int QDate::daysInYear() const
+{
+ int y, m, d;
+ jul2greg( jd, y, m, d );
+ return leapYear(y) ? 366 : 365;
+}
+
+
+/*!
+ Returns the name of the \a month.
+
+ Month 1 == "Jan", month 2 == "Feb" etc.
+
+ \sa toString(), dayName()
+*/
+
+QString QDate::monthName( int month ) const
+{
+#if defined(CHECK_RANGE)
+ if ( month < 1 || month > 12 ) {
+ qWarning( "QDate::monthName: Parameter out ouf range." );
+ month = 1;
+ }
+#endif
+ // ### Remove the fromLatin1 during localization
+ return QString::fromLatin1(monthNames[month-1]);
+}
+
+/*!
+ Returns the name of the \a weekday.
+
+ Weekday 1 == "Mon", day 2 == "Tue" etc.
+
+ \sa toString(), monthName()
+*/
+
+QString QDate::dayName( int weekday ) const
+{
+#if defined(CHECK_RANGE)
+ if ( weekday < 1 || weekday > 7 ) {
+ qWarning( "QDate::dayName: Parameter out of range." );
+ weekday = 1;
+ }
+#endif
+ // ### Remove the fromLatin1 during localization
+ return QString::fromLatin1(weekdayNames[weekday-1]);
+}
+
+
+/*!
+ Returns the date as a string.
+
+ The string format is "Sat May 20 1995". This function uses the
+ dayName() and monthName() functions to generate the string.
+
+ \sa dayName(), monthName()
+*/
+
+QString QDate::toString() const
+{
+ int y, m, d;
+ jul2greg( jd, y, m, d );
+ QString buf = dayName(dayOfWeek());
+ buf += ' ';
+ buf += monthName(m);
+ QString t;
+ t.sprintf( " %d %d", d, y);
+ buf += t;
+ return buf;
+}
+
+
+/*!
+ Sets the year \a y, month \a m and day \a d.
+
+ \a y must be in the range 1752-ca. 8000, \a m must be in the range
+ 1-12, and \a d must be in the range 1-31. Exception: if \a y is in
+ the range 0-99, it is interpreted as 1900-1999.
+
+ Returns TRUE if the date is valid, otherwise FALSE.
+*/
+
+bool QDate::setYMD( int y, int m, int d )
+{
+ if ( !isValid(y,m,d) ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QDate::setYMD: Invalid date %04d/%02d/%02d", y, m, d );
+#endif
+ return FALSE;
+ }
+ jd = greg2jul( y, m, d );
+#if defined(DEBUG)
+ ASSERT( year() == (y > 99 ? y : 1900+y) && month() == m && day() == d );
+#endif
+ return TRUE;
+}
+
+/*!
+ Returns a QDate object containing a date \a ndays later than the
+ date of this object (or earlier if \a ndays is negative).
+
+ \sa daysTo()
+*/
+
+QDate QDate::addDays( int ndays ) const
+{
+ QDate d;
+ d.jd = jd + ndays;
+ return d;
+}
+
+/*!
+ Returns the number of days from this date to \a d (which is negative
+ if \a d is earlier than this date).
+
+ Example:
+ \code
+ QDate d1( 1995, 5, 17 ); // May 17th 1995
+ QDate d2( 1995, 5, 20 ); // May 20th 1995
+ d1.daysTo( d2 ); // returns 3
+ d2.daysTo( d1 ); // returns -3
+ \endcode
+
+ \sa addDays()
+*/
+
+int QDate::daysTo( const QDate &d ) const
+{
+ return d.jd - jd;
+}
+
+
+/*!
+ \fn bool QDate::operator==( const QDate &d ) const
+ Returns TRUE if this date is equal to \a d, or FALSE if
+ they are different.
+*/
+
+/*!
+ \fn bool QDate::operator!=( const QDate &d ) const
+ Returns TRUE if this date is different from \a d, or FALSE if
+ they are equal.
+*/
+
+/*!
+ \fn bool QDate::operator<( const QDate &d ) const
+ Returns TRUE if this date is earlier than \a d, otherwise FALSE.
+*/
+
+/*!
+ \fn bool QDate::operator<=( const QDate &d ) const
+ Returns TRUE if this date is earlier than or equal to \a d, otherwise FALSE.
+*/
+
+/*!
+ \fn bool QDate::operator>( const QDate &d ) const
+ Returns TRUE if this date is later than \a d, otherwise FALSE.
+*/
+
+/*!
+ \fn bool QDate::operator>=( const QDate &d ) const
+ Returns TRUE if this date is later than or equal to \a d, otherwise FALSE.
+*/
+
+
+/*!
+ Returns the current date, as reported by the system clock.
+
+ \sa QTime::currentTime(), QDateTime::currentDateTime()
+*/
+
+QDate QDate::currentDate()
+{
+#if defined(_OS_WIN32_)
+
+ SYSTEMTIME t;
+ GetLocalTime( &t );
+ QDate d;
+ d.jd = greg2jul( t.wYear, t.wMonth, t.wDay );
+ return d;
+
+#else
+
+ time_t ltime;
+ time( &ltime );
+ tm *t = localtime( &ltime );
+ QDate d;
+ d.jd = greg2jul( t->tm_year + 1900, t->tm_mon + 1, t->tm_mday );
+ return d;
+
+#endif
+}
+
+/*!
+ Returns TRUE if the specified date (year \a y, month \a m and day \a
+ d) is valid.
+
+ Example:
+ \code
+ QDate::isValid( 2002, 5, 17 ); // TRUE; May 17th 2002 is OK.
+ QDate::isValid( 2002, 2, 30 ); // FALSE; Feb 30th does not exist
+ QDate::isValid( 2004, 2, 29 ); // TRUE; 2004 is a leap year
+ QDate::isValid( 1202, 6, 6 ); // FALSE; 1202 is pre-Gregorian
+ \endcode
+
+ Note that a \a y value in the range 00-99 is interpreted as
+ 1900-1999.
+
+ \sa isNull(), setYMD()
+*/
+
+bool QDate::isValid( int y, int m, int d )
+{
+ if ( y >= 0 && y <= 99 )
+ y += 1900;
+ else if ( y < FIRST_YEAR || (y == FIRST_YEAR && (m < 9 ||
+ (m == 9 && d < 14))) )
+ return FALSE;
+ return (d > 0 && m > 0 && m <= 12) &&
+ (d <= monthDays[m] || (d == 29 && m == 2 && leapYear(y)));
+}
+
+/*!
+ Returns TRUE if the specified year \a y is a leap year.
+*/
+
+bool QDate::leapYear( int y )
+{
+ return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
+}
+
+/*!
+ \internal
+ Converts a Gregorian date to a Julian day.
+ This algorithm is taken from Communications of the ACM, Vol 6, No 8.
+ \sa jul2greg()
+*/
+
+uint QDate::greg2jul( int y, int m, int d )
+{
+ uint c, ya;
+ if ( y <= 99 )
+ y += 1900;
+ if ( m > 2 ) {
+ m -= 3;
+ } else {
+ m += 9;
+ y--;
+ }
+ c = y; // NOTE: Sym C++ 6.0 bug
+ c /= 100;
+ ya = y - 100*c;
+ return 1721119 + d + (146097*c)/4 + (1461*ya)/4 + (153*m+2)/5;
+}
+
+/*!
+ \internal
+ Converts a Julian day to a Gregorian date.
+ This algorithm is taken from Communications of the ACM, Vol 6, No 8.
+ \sa greg2jul()
+*/
+
+void QDate::jul2greg( uint jd, int &y, int &m, int &d )
+{
+ uint x;
+ uint j = jd - 1721119;
+ y = (j*4 - 1)/146097;
+ j = j*4 - 146097*y - 1;
+ x = j/4;
+ j = (x*4 + 3) / 1461;
+ y = 100*y + j;
+ x = (x*4) + 3 - 1461*j;
+ x = (x + 4)/4;
+ m = (5*x - 3)/153;
+ x = 5*x - 3 - 153*m;
+ d = (x + 5)/5;
+ if ( m < 10 ) {
+ m += 3;
+ } else {
+ m -= 9;
+ y++;
+ }
+}
+
+
+/*****************************************************************************
+ QTime member functions
+ *****************************************************************************/
+
+/*!
+ \class QTime qdatetime.h
+
+ \brief The QTime class provides clock time functions.
+
+ \ingroup time
+
+ A QTime object contains a clock time, i.e. a number of hours,
+ minutes, seconds and milliseconds since midnight. It can read the
+ current time from the system clock, and measure a span of elapsed
+ time. It provides functions for comparing times and for manipulating
+ a time by adding a number of (milli)seconds.
+
+ QTime operates with 24-hour clock format; it has no concept of
+ AM/PM. It operates with local time; it does not know anything about
+ time zones or daylight savings time.
+
+ A QTime object is typically created either by giving the number of
+ hours, minutes, seconds, and milliseconds explicitly, or by using
+ the static function currentTime(), which makes a QTime object which
+ contains the system's clock time. Note that the accuracy depends on
+ the accuracy of the underlying operating system; not all systems
+ provide 1-millisecond accuracy.
+
+ The hour(), minute(), second(), and msec() functions provide access
+ to the number of hours, minutes, seconds, and milliseconds of the
+ time. The same information is provided in textual format by the
+ toString() function.
+
+ QTime provides a full set of operators to compare two QTime
+ objects. A time is considered smaller than another if it is earlier
+ than the other.
+
+ The time a given number of seconds or milliseconds later than a
+ given time can be found using the addSecs() or addMSecs()
+ functions. Correspondingly, the number of (milli)seconds between two
+ times can be found using the secsTo() or msecsTo() functions.
+
+ QTime can be used to measure a span of elapsed time using the
+ start(), restart(), and elapsed() functions.
+
+ \sa QDate, QDateTime
+*/
+
+/*!
+ \fn QTime::QTime()
+
+ Constructs the time 0 hours, minutes, seconds and milliseconds,
+ i.e. 00:00:00.000 (midnight). This is a valid time.
+
+ \sa isValid()
+*/
+
+/*!
+ Constructs a time with hour \a h, minute \a m, seconds \a s and
+ milliseconds \a ms.
+
+ \a h must be in the range 0-23, \a m and \a s must be in the range
+ 0-59, and \a ms must be in the range 0-999.
+
+ \sa isValid()
+*/
+
+QTime::QTime( int h, int m, int s, int ms )
+{
+ setHMS( h, m, s, ms );
+}
+
+
+/*!
+ \fn bool QTime::isNull() const
+ Returns TRUE if the time is equal to 00:00:00.000. A null time is valid.
+
+ \sa isValid()
+*/
+
+/*!
+ Returns TRUE if the time is valid, or FALSE if the time is invalid.
+ The time 23:30:55.746 is valid, while 24:12:30 is invalid.
+
+ \sa isNull()
+*/
+
+bool QTime::isValid() const
+{
+ return ds < MSECS_PER_DAY;
+}
+
+
+/*!
+ Returns the hour part (0..23) of the time.
+*/
+
+int QTime::hour() const
+{
+ return ds / MSECS_PER_HOUR;
+}
+
+/*!
+ Returns the minute part (0..59) of the time.
+*/
+
+int QTime::minute() const
+{
+ return (ds % MSECS_PER_HOUR)/MSECS_PER_MIN;
+}
+
+/*!
+ Returns the second part (0..59) of the time.
+*/
+
+int QTime::second() const
+{
+ return (ds / 1000)%SECS_PER_MIN;
+}
+
+/*!
+ Returns the millisecond part (0..999) of the time.
+*/
+
+int QTime::msec() const
+{
+ return ds % 1000;
+}
+
+
+/*!
+ Returns the time of this object in a textual format. Milliseconds
+ are not included. The string format is HH:MM:SS, e.g. 1 second
+ before midnight would be "23:59:59".
+*/
+
+QString QTime::toString() const
+{
+ QString buf;
+ buf.sprintf( "%.2d:%.2d:%.2d", hour(), minute(), second() );
+ return buf;
+}
+
+
+/*!
+ Sets the time to hour \a h, minute \a m, seconds \a s and
+ milliseconds \a ms.
+
+ \a h must be in the range 0-23, \a m and \a s must be in the range
+ 0-59, and \a ms must be in the range 0-999. Returns TRUE if the set
+ time is valid, otherwise FALSE.
+
+ \sa isValid()
+*/
+
+bool QTime::setHMS( int h, int m, int s, int ms )
+{
+ if ( !isValid(h,m,s,ms) ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QTime::setHMS Invalid time %02d:%02d:%02d.%03d", h, m, s,
+ ms );
+#endif
+ ds = MSECS_PER_DAY; // make this invalid
+ return FALSE;
+ }
+ ds = (h*SECS_PER_HOUR + m*SECS_PER_MIN + s)*1000 + ms;
+ return TRUE;
+}
+
+/*!
+ Returns a QTime object containing a time \a nsecs seconds later than
+ the time of this object (or earlier if \a ms is negative).
+
+ Note that the time will wrap if it passes midnight.
+
+ Example:
+ \code
+ QTime n( 14, 0, 0 ); // n == 14:00:00
+ QTime t;
+ t = n.addSecs( 70 ); // t == 14:01:10
+ t = n.addSecs( -70 ); // t == 13:58:50
+ t = n.addSecs( 10*60*60 + 5 ); // t == 00:00:05
+ t = n.addSecs( -15*60*60 ); // t == 23:00:00
+ \endcode
+
+ \sa addMSecs(), secsTo(), QDateTime::addSecs()
+*/
+
+QTime QTime::addSecs( int nsecs ) const
+{
+ return addMSecs(nsecs*1000);
+}
+
+/*!
+ Returns the number of seconds from this time to \a t (which is
+ negative if \a t is earlier than this time).
+
+ Since QTime measures time within a day and there are 86400 seconds
+ in a day, the result is between -86400 and 86400.
+
+ \sa addSecs() QDateTime::secsTo()
+*/
+
+int QTime::secsTo( const QTime &t ) const
+{
+ return ((int)t.ds - (int)ds)/1000;
+}
+
+/*!
+ Returns a QTime object containing a time \a ms milliseconds later than
+ the time of this object (or earlier if \a ms is negative).
+
+ Note that the time will wrap if it passes midnight. See addSecs()
+ for an example.
+
+ \sa addSecs(), msecsTo()
+*/
+
+QTime QTime::addMSecs( int ms ) const
+{
+ QTime t;
+ if ( ms < 0 ) {
+ // % not well-defined for -ve, but / is.
+ int negdays = (MSECS_PER_DAY-ms) / MSECS_PER_DAY;
+ t.ds = ((int)ds + ms + negdays*MSECS_PER_DAY)
+ % MSECS_PER_DAY;
+ } else {
+ t.ds = ((int)ds + ms) % MSECS_PER_DAY;
+ }
+ return t;
+}
+
+/*!
+ Returns the number of milliseconds from this time to \a t (which is
+ negative if \a t is earlier than this time).
+
+ Since QTime measures time within a day and there are 86400000
+ milliseconds in a day, the result is between -86400000 and 86400000.
+
+ \sa secsTo()
+*/
+
+int QTime::msecsTo( const QTime &t ) const
+{
+ return (int)t.ds - (int)ds;
+}
+
+
+/*!
+ \fn bool QTime::operator==( const QTime &t ) const
+
+ Returns TRUE if this time is equal to \a t, or FALSE if they are
+ different.
+*/
+
+/*!
+ \fn bool QTime::operator!=( const QTime &t ) const
+
+ Returns TRUE if this time is different from \a t, or FALSE if they
+ are equal.
+*/
+
+/*!
+ \fn bool QTime::operator<( const QTime &t ) const
+
+ Returns TRUE if this time is earlier than \a t, otherwise FALSE.
+*/
+
+/*!
+ \fn bool QTime::operator<=( const QTime &t ) const
+
+ Returns TRUE if this time is earlier than or equal to \a t,
+ otherwise FALSE.
+*/
+
+/*!
+ \fn bool QTime::operator>( const QTime &t ) const
+
+ Returns TRUE if this time is later than \a t, otherwise FALSE.
+*/
+
+/*!
+ \fn bool QTime::operator>=( const QTime &t ) const
+
+ Returns TRUE if this time is later than or equal to \a t, otherwise
+ FALSE.
+*/
+
+
+
+/*!
+ Returns the current time, as reported by the system clock.
+
+ Note that the accuracy depends on the accuracy of the underlying
+ operating system; not all systems provide 1-millisecond accuracy.
+*/
+
+QTime QTime::currentTime()
+{
+ QTime ct;
+ currentTime( &ct );
+ return ct;
+}
+
+/*!
+ \internal
+
+ Fetches the current time and returns TRUE if the time is within one
+ minute after midnight, otherwise FALSE. The return value is used by
+ QDateTime::currentDateTime() to ensure that the date there is correct.
+*/
+
+bool QTime::currentTime( QTime *ct )
+{
+ if ( !ct ) {
+#if defined(CHECK_NULL)
+ qWarning( "QTime::currentTime(QTime *): Null pointer not allowed" );
+#endif
+ return FALSE;
+ }
+
+#if defined(_OS_WIN32_)
+
+ SYSTEMTIME t;
+ GetLocalTime( &t );
+ ct->ds = MSECS_PER_HOUR*t.wHour + MSECS_PER_MIN*t.wMinute +
+ 1000*t.wSecond + t.wMilliseconds;
+ return (t.wHour == 0 && t.wMinute == 0);
+
+#elif defined(_OS_OS2_)
+
+ DATETIME t;
+ DosGetDateTime( &t );
+ ct->ds = MSECS_PER_HOUR*t.hours + MSECS_PER_MIN*t.minutes +
+ 1000*t.seconds + 10*t.hundredths;
+ return (t.hours == 0 && t.minutes == 0);
+
+#elif defined(_OS_MSDOS_)
+
+ _dostime_t t;
+ _dos_gettime( &t );
+ ct->ds = MSECS_PER_HOUR*t.hour + MSECS_PER_MIN*t.minute +
+ t.second*1000 + t.hsecond*10;
+ return (t.hour== 0 && t.minute == 0);
+
+#elif defined(_OS_UNIX_)
+
+ struct timeval tv;
+ gettimeofday( &tv, 0 );
+ time_t ltime = tv.tv_sec;
+ tm *t = localtime( &ltime );
+ ct->ds = (uint)( MSECS_PER_HOUR*t->tm_hour + MSECS_PER_MIN*t->tm_min +
+ 1000*t->tm_sec + tv.tv_usec/1000 );
+ return (t->tm_hour== 0 && t->tm_min == 0);
+
+#else
+
+ time_t ltime; // no millisecond resolution!!
+ ::time( &ltime );
+ tm *t = localtime( &ltime );
+ ct->ds = MSECS_PER_HOUR*t->tm_hour + MSECS_PER_MIN*t->tm_min +
+ 1000*t->tm_sec;
+ return (t->tm_hour== 0 && t->tm_min == 0);
+#endif
+}
+
+/*!
+ Returns TRUE if the specified time is valid, otherwise FALSE.
+
+ The time is valid if \a h is in the range 0-23, \a m and \a s are in
+ the range 0-59, and \a ms is in the range 0-999.
+
+ Example:
+ \code
+ QTime::isValid(21, 10, 30); // returns TRUE
+ QTime::isValid(22, 5, 62); // returns FALSE
+ \endcode
+*/
+
+bool QTime::isValid( int h, int m, int s, int ms )
+{
+ return (uint)h < 24 && (uint)m < 60 && (uint)s < 60 && (uint)ms < 1000;
+}
+
+
+/*!
+ Sets this time to the current time. This is practical for timing:
+
+ \code
+ QTime t;
+ t.start(); // start clock
+ ... // some lengthy task
+ qDebug( "%d\n", t.elapsed() ); // prints # msecs elapsed
+ \endcode
+
+ \sa restart(), elapsed(), currentTime()
+*/
+
+void QTime::start()
+{
+ *this = currentTime();
+}
+
+/*!
+ Sets this time to the current time, and returns the number of
+ milliseconds that have elapsed since the last time start() or
+ restart() was called.
+
+ This function is guaranteed to be atomic, and is thus very handy for
+ repeated measurements: call start() to start the first measurement,
+ then restart() for each later measurement.
+
+ Note that the counter wraps to zero 24 hours after the last call to
+ start() or restart().
+
+ \warning If the system's clock setting has been changed since the
+ last time start() or restart() was called, the result is undefined.
+ This can happen e.g. when daylight saving is turned on or off.
+
+ \sa start(), elapsed(), currentTime()
+*/
+
+int QTime::restart()
+{
+ QTime t = currentTime();
+ int n = msecsTo( t );
+ if ( n < 0 ) // passed midnight
+ n += 86400*1000;
+ *this = t;
+ return n;
+}
+
+/*!
+ Returns the number of milliseconds that have elapsed since the last
+ time start() or restart() was called.
+
+ Note that the counter wraps to zero 24 hours after the last call to
+ start() or restart.
+
+ Note that the accuracy depends on the accuracy of the underlying
+ operating system; not all systems provide 1-millisecond accuracy.
+
+ \warning If the system's clock setting has been changed since the
+ last time start() or restart() was called, the result is undefined.
+ This can happen e.g. when daylight saving is turned on or off.
+
+ \sa start(), restart()
+*/
+
+int QTime::elapsed()
+{
+ int n = msecsTo( currentTime() );
+ if ( n < 0 ) // passed midnight
+ n += 86400*1000;
+ return n;
+}
+
+
+/*****************************************************************************
+ QDateTime member functions
+ *****************************************************************************/
+
+/*!
+ \class QDateTime qdatetime.h
+ \brief The QDateTime class provides date and time functions.
+
+ \ingroup time
+
+ A QDateTime object contains a calendar date and a clock time (a
+ "datetime"). It is a combination of the QDate and QTime classes. It
+ can read the current datetime from the system clock. It provides
+ functions for comparing datetimes and for manipulating a datetime by
+ adding a number of seconds or days.
+
+ A QDateTime object is typically created either by giving a date and
+ time explicitly, or by using the static function currentTime(),
+ which makes a QDateTime object which contains the system's clock
+ time.
+
+ The date() and time() functions provide access to the date and time
+ parts of the datetime. The same information is provided in textual
+ format by the toString() function.
+
+ QDateTime provides a full set of operators to compare two QDateTime
+ objects. A datetime is considered smaller than another if it is
+ earlier than the other.
+
+ The datetime a given number of days or seconds later than a given
+ datetime can be found using the addDays() and addSecs()
+ functions. Correspondingly, the number of days or seconds between
+ two times can be found using the daysTo() or secsTo() functions.
+
+ A datetime can also be set using the setTime_t() function, which
+ takes a POSIX-standard "number of seconds since 00:00:00 on January
+ 1, 1970" value.
+
+ The limitations regarding range and resolution mentioned in the
+ QDate and QTime documentation apply for QDateTime also.
+
+ \sa QDate, QTime
+*/
+
+
+/*!
+ \fn QDateTime::QDateTime()
+
+ Constructs a null datetime (i.e. null date and null time). A null
+ datetime is invalid, since the date is invalid.
+
+ \sa isValid()
+*/
+
+
+/*!
+ Constructs a datetime with date \a date and null time (00:00:00.000).
+*/
+
+QDateTime::QDateTime( const QDate &date )
+ : d(date)
+{
+}
+
+/*!
+ Constructs a datetime with date \a date and time \a time.
+*/
+
+QDateTime::QDateTime( const QDate &date, const QTime &time )
+ : d(date), t(time)
+{
+}
+
+
+/*!
+ \fn bool QDateTime::isNull() const
+
+ Returns TRUE if both the date and the time are null. A null date is invalid.
+
+ \sa QDate::isNull(), QTime::isNull()
+*/
+
+/*!
+ \fn bool QDateTime::isValid() const
+
+ Returns TRUE if both the date and the time are valid.
+
+ \sa QDate::isValid(), QTime::isValid()
+*/
+
+/*!
+ \fn QDate QDateTime::date() const
+
+ Returns the date part of this datetime.
+
+ \sa setDate(), time()
+*/
+
+/*!
+ \fn QTime QDateTime::time() const
+
+ Returns the time part of this datetime.
+
+ \sa setTime(), date()
+*/
+
+/*!
+ \fn void QDateTime::setDate( const QDate &date )
+
+ Sets the date part of this datetime.
+
+ \sa date(), setTime()
+*/
+
+/*!
+ \fn void QDateTime::setTime( const QTime &time )
+
+ Sets the time part of this datetime.
+
+ \sa time(), setDate()
+*/
+
+
+/*!
+ Sets the local date and time given the number of seconds that have passed
+ since 00:00:00 on January 1, 1970, Coordinated Universal Time (UTC).
+ On systems that do not support timezones this function will behave as if
+ local time were UTC.
+
+ Note that Microsoft Windows supports only a limited range of values for
+ \a secsSince1Jan1970UTC.
+*/
+
+void QDateTime::setTime_t( uint secsSince1Jan1970UTC )
+{
+ time_t tmp = (time_t) secsSince1Jan1970UTC;
+ tm *tM = localtime( &tmp );
+ if ( !tM ) {
+ tM = gmtime( &tmp );
+ if ( !tM ) {
+ d.jd = QDate::greg2jul( 1970, 1, 1 );
+ t.ds = 0;
+ return;
+ }
+ }
+ d.jd = QDate::greg2jul( tM->tm_year + 1900, tM->tm_mon + 1, tM->tm_mday );
+ t.ds = MSECS_PER_HOUR*tM->tm_hour + MSECS_PER_MIN*tM->tm_min +
+ 1000*tM->tm_sec;
+}
+
+
+/*!
+ Returns the datetime as a string.
+
+ The string format is "Sat May 20 03:40:13 1998".
+
+ This function uses QDate::dayName(), QDate::monthName(), and
+ QTime::toString() to generate the string.
+
+*/
+
+QString QDateTime::toString() const
+{
+ QString buf = d.dayName(d.dayOfWeek());
+ buf += ' ';
+ buf += d.monthName(d.month());
+ buf += ' ';
+ buf += QString().setNum(d.day());
+ buf += ' ';
+ buf += t.toString();
+ buf += ' ';
+ buf += QString().setNum(d.year());
+ return buf;
+}
+
+/*!
+ Returns a QDateTime object containing a datetime \a ndays days later
+ than the datetime of this object (or earlier if \a ndays is
+ negative).
+
+ \sa daysTo(), addSecs()
+*/
+
+QDateTime QDateTime::addDays( int ndays ) const
+{
+ return QDateTime( d.addDays(ndays), t );
+}
+
+/*!
+ Returns a QDateTime object containing a datetime \a nsecs seconds
+ later than the datetime of this object (or earlier if \a nsecs is
+ negative).
+
+ \sa secsTo(), addDays()
+*/
+
+QDateTime QDateTime::addSecs( int nsecs ) const
+{
+ uint dd = d.jd;
+ int tt = t.ds;
+ int sign = 1;
+ if ( nsecs < 0 ) {
+ nsecs = -nsecs;
+ sign = -1;
+ }
+ if ( nsecs >= (int)SECS_PER_DAY ) {
+ dd += sign*(nsecs/SECS_PER_DAY);
+ nsecs %= SECS_PER_DAY;
+ }
+ tt += sign*nsecs*1000;
+ if ( tt < 0 ) {
+ tt = MSECS_PER_DAY - tt - 1;
+ dd -= tt / MSECS_PER_DAY;
+ tt = tt % MSECS_PER_DAY;
+ tt = MSECS_PER_DAY - tt - 1;
+ } else if ( tt >= (int)MSECS_PER_DAY ) {
+ dd += ( tt / MSECS_PER_DAY );
+ tt = tt % MSECS_PER_DAY;
+ }
+ QDateTime ret;
+ ret.t.ds = tt;
+ ret.d.jd = dd;
+ return ret;
+}
+
+/*!
+ Returns the number of days from this datetime to \a dt (which is
+ negative if \a dt is earlier than this datetime).
+
+ \sa addDays(), secsTo()
+*/
+
+int QDateTime::daysTo( const QDateTime &dt ) const
+{
+ return d.daysTo( dt.d );
+}
+
+/*!
+ Returns the number of seconds from this datetime to \a dt (which is
+ negative if \a dt is earlier than this datetime).
+
+ Example:
+ \code
+ QDateTime dt = QDateTime::currentDateTime();
+ QDateTime x( QDate(dt.year(),12,24), QTime(17,00) );
+ qDebug( "There are %d seconds to Christmas", dt.secsTo(x) );
+ \endcode
+
+ \sa addSecs(), daysTo(), QTime::secsTo()
+*/
+
+int QDateTime::secsTo( const QDateTime &dt ) const
+{
+ return t.secsTo(dt.t) + d.daysTo(dt.d)*SECS_PER_DAY;
+}
+
+
+/*!
+ Returns TRUE if this datetime is equal to \a dt, or FALSE if
+ they are different.
+ \sa operator!=()
+*/
+
+bool QDateTime::operator==( const QDateTime &dt ) const
+{
+ return t == dt.t && d == dt.d;
+}
+
+/*!
+ Returns TRUE if this datetime is different from \a dt, or FALSE if
+ they are equal.
+ \sa operator==()
+*/
+
+bool QDateTime::operator!=( const QDateTime &dt ) const
+{
+ return t != dt.t || d != dt.d;
+}
+
+/*!
+ Returns TRUE if this datetime is earlier than \a dt, otherwise FALSE.
+*/
+
+bool QDateTime::operator<( const QDateTime &dt ) const
+{
+ if ( d < dt.d )
+ return TRUE;
+ return d == dt.d ? t < dt.t : FALSE;
+}
+
+/*!
+ Returns TRUE if this datetime is earlier than or equal to \a dt,
+ otherwise FALSE.
+*/
+
+bool QDateTime::operator<=( const QDateTime &dt ) const
+{
+ if ( d < dt.d )
+ return TRUE;
+ return d == dt.d ? t <= dt.t : FALSE;
+}
+
+/*!
+ Returns TRUE if this datetime is later than \a dt, otherwise FALSE.
+*/
+
+bool QDateTime::operator>( const QDateTime &dt ) const
+{
+ if ( d > dt.d )
+ return TRUE;
+ return d == dt.d ? t > dt.t : FALSE;
+}
+
+/*!
+ Returns TRUE if this datetime is later than or equal to \a dt,
+ otherwise FALSE.
+*/
+
+bool QDateTime::operator>=( const QDateTime &dt ) const
+{
+ if ( d > dt.d )
+ return TRUE;
+ return d == dt.d ? t >= dt.t : FALSE;
+}
+
+/*!
+ Returns the current datetime, as reported by the system clock.
+
+ \sa QDate::currentDate(), QTime::currentTime()
+*/
+
+QDateTime QDateTime::currentDateTime()
+{
+ QDate cd = QDate::currentDate();
+ QTime ct;
+ if ( QTime::currentTime(&ct) ) // too close to midnight?
+ cd = QDate::currentDate(); // YES! time for some midnight
+ // voodoo, fetch date again
+ return QDateTime( cd, ct );
+}
+
+
+/*****************************************************************************
+ Date/time stream functions
+ *****************************************************************************/
+
+#ifndef QT_NO_DATASTREAM
+/*!
+ \relates QDate
+ Writes the date to the stream.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator<<( QDataStream &s, const QDate &d )
+{
+ return s << (Q_UINT32)(d.jd);
+}
+
+/*!
+ \relates QDate
+ Reads a date from the stream.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator>>( QDataStream &s, QDate &d )
+{
+ Q_UINT32 jd;
+ s >> jd;
+ d.jd = jd;
+ return s;
+}
+
+/*!
+ \relates QTime
+ Writes a time to the stream.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator<<( QDataStream &s, const QTime &t )
+{
+ return s << (Q_UINT32)(t.ds);
+}
+
+/*!
+ \relates QTime
+ Reads a time from the stream.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator>>( QDataStream &s, QTime &t )
+{
+ Q_UINT32 ds;
+ s >> ds;
+ t.ds = ds;
+ return s;
+}
+
+/*!
+ \relates QDateTime
+ Writes a datetime to the stream.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator<<( QDataStream &s, const QDateTime &dt )
+{
+ return s << dt.d << dt.t;
+}
+
+/*!
+ \relates QDateTime
+ Reads a datetime from the stream.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator>>( QDataStream &s, QDateTime &dt )
+{
+ s >> dt.d >> dt.t;
+ return s;
+}
+#endif //QT_NO_DATASTREAM
diff --git a/qtools/qdatetime.h b/qtools/qdatetime.h
new file mode 100644
index 0000000..2d5869c
--- /dev/null
+++ b/qtools/qdatetime.h
@@ -0,0 +1,216 @@
+/****************************************************************************
+**
+**
+** Definition of date and time classes
+**
+** Created : 940124
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QDATETIME_H
+#define QDATETIME_H
+
+#ifndef QT_H
+#include "qstring.h"
+#endif // QT_H
+
+
+/*****************************************************************************
+ QDate class
+ *****************************************************************************/
+
+class Q_EXPORT QDate
+{
+public:
+ QDate() { jd=0; } // set null date
+ QDate( int y, int m, int d ); // set date
+ virtual ~QDate() {}
+
+ bool isNull() const { return jd == 0; }
+ bool isValid() const; // valid date
+
+ int year() const; // 1752..
+ int month() const; // 1..12
+ int day() const; // 1..31
+ int dayOfWeek() const; // 1..7 (monday==1)
+ int dayOfYear() const; // 1..365
+ int daysInMonth() const; // 28..31
+ int daysInYear() const; // 365 or 366
+
+ virtual QString monthName( int month ) const;
+ virtual QString dayName( int weekday ) const;
+
+ QString toString() const;
+
+ bool setYMD( int y, int m, int d );
+
+ QDate addDays( int days ) const;
+ int daysTo( const QDate & ) const;
+
+ bool operator==( const QDate &d ) const { return jd == d.jd; }
+ bool operator!=( const QDate &d ) const { return jd != d.jd; }
+ bool operator<( const QDate &d ) const { return jd < d.jd; }
+ bool operator<=( const QDate &d ) const { return jd <= d.jd; }
+ bool operator>( const QDate &d ) const { return jd > d.jd; }
+ bool operator>=( const QDate &d ) const { return jd >= d.jd; }
+
+ static QDate currentDate();
+ static bool isValid( int y, int m, int d );
+ static bool leapYear( int year );
+
+protected:
+ static uint greg2jul( int y, int m, int d );
+ static void jul2greg( uint jd, int &y, int &m, int &d );
+private:
+ static const char * const monthNames[];
+ static const char * const weekdayNames[];
+ uint jd;
+ friend class QDateTime;
+#ifndef QT_NO_DATASTREAM
+ friend Q_EXPORT QDataStream &operator<<( QDataStream &, const QDate & );
+ friend Q_EXPORT QDataStream &operator>>( QDataStream &, QDate & );
+#endif
+};
+
+
+/*****************************************************************************
+ QTime class
+ *****************************************************************************/
+
+class Q_EXPORT QTime
+{
+public:
+ QTime() { ds=0; } // set null time
+ QTime( int h, int m, int s=0, int ms=0 ); // set time
+
+ bool isNull() const { return ds == 0; }
+ bool isValid() const; // valid time
+
+ int hour() const; // 0..23
+ int minute() const; // 0..59
+ int second() const; // 0..59
+ int msec() const; // 0..999
+
+ QString toString() const;
+
+ bool setHMS( int h, int m, int s, int ms=0 );
+
+ QTime addSecs( int secs ) const;
+ int secsTo( const QTime & ) const;
+ QTime addMSecs( int ms ) const;
+ int msecsTo( const QTime & ) const;
+
+ bool operator==( const QTime &d ) const { return ds == d.ds; }
+ bool operator!=( const QTime &d ) const { return ds != d.ds; }
+ bool operator<( const QTime &d ) const { return ds < d.ds; }
+ bool operator<=( const QTime &d ) const { return ds <= d.ds; }
+ bool operator>( const QTime &d ) const { return ds > d.ds; }
+ bool operator>=( const QTime &d ) const { return ds >= d.ds; }
+
+ static QTime currentTime();
+ static bool isValid( int h, int m, int s, int ms=0 );
+
+ void start();
+ int restart();
+ int elapsed();
+
+private:
+ static bool currentTime( QTime * );
+
+ uint ds;
+ friend class QDateTime;
+#ifndef QT_NO_DATASTREAM
+ friend Q_EXPORT QDataStream &operator<<( QDataStream &, const QTime & );
+ friend Q_EXPORT QDataStream &operator>>( QDataStream &, QTime & );
+#endif
+};
+
+
+/*****************************************************************************
+ QDateTime class
+ *****************************************************************************/
+
+class Q_EXPORT QDateTime
+{
+public:
+ QDateTime() {} // set null date and null time
+ QDateTime( const QDate & );
+ QDateTime( const QDate &, const QTime & );
+
+ bool isNull() const { return d.isNull() && t.isNull(); }
+ bool isValid() const { return d.isValid() && t.isValid(); }
+
+ QDate date() const { return d; }
+ QTime time() const { return t; }
+ void setDate( const QDate &date ) { d=date; }
+ void setTime( const QTime &time ) { t=time; }
+ void setTime_t( uint secsSince1Jan1970UTC );
+
+ QString toString() const;
+
+ QDateTime addDays( int days ) const;
+ QDateTime addSecs( int secs ) const;
+ int daysTo( const QDateTime & ) const;
+ int secsTo( const QDateTime & ) const;
+
+ bool operator==( const QDateTime &dt ) const;
+ bool operator!=( const QDateTime &dt ) const;
+ bool operator<( const QDateTime &dt ) const;
+ bool operator<=( const QDateTime &dt ) const;
+ bool operator>( const QDateTime &dt ) const;
+ bool operator>=( const QDateTime &dt ) const;
+
+ static QDateTime currentDateTime();
+
+private:
+ QDate d;
+ QTime t;
+#ifndef QT_NO_DATASTREAM
+ friend Q_EXPORT QDataStream &operator<<( QDataStream &, const QDateTime &);
+ friend Q_EXPORT QDataStream &operator>>( QDataStream &, QDateTime & );
+#endif
+};
+
+
+/*****************************************************************************
+ Date and time stream functions
+ *****************************************************************************/
+
+#ifndef QT_NO_DATASTREAM
+Q_EXPORT QDataStream &operator<<( QDataStream &, const QDate & );
+Q_EXPORT QDataStream &operator>>( QDataStream &, QDate & );
+Q_EXPORT QDataStream &operator<<( QDataStream &, const QTime & );
+Q_EXPORT QDataStream &operator>>( QDataStream &, QTime & );
+Q_EXPORT QDataStream &operator<<( QDataStream &, const QDateTime & );
+Q_EXPORT QDataStream &operator>>( QDataStream &, QDateTime & );
+#endif // QT_NO_DATASTREAM
+
+#endif // QDATETIME_H
diff --git a/qtools/qdict.doc b/qtools/qdict.doc
new file mode 100644
index 0000000..d9f6ca5
--- /dev/null
+++ b/qtools/qdict.doc
@@ -0,0 +1,492 @@
+/****************************************************************************
+**
+**
+** QDict and QDictIterator class documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+
+/*****************************************************************************
+ QDict documentation
+ *****************************************************************************/
+
+/*!
+ \class QDict qdict.h
+ \brief The QDict class is a template class that provides a dictionary based on \c QString keys.
+
+ \ingroup collection
+ \ingroup tools
+
+ QDict is implemented as a template class. Define a template instance
+ QDict\<X\> to create a dictionary that operates on pointers to X, or X*.
+
+ A dictionary is a collection that associates an item with a key.
+ The key is used for inserting and looking up an item. QDict has
+ \l QString keys, which are Unicode strings. If you want to use
+ non-Unicode, plain 8-bit \c char* keys, use the QAsciiDict template.
+ A QDict has the same performace as a QAsciiDict.
+
+ The dictionary has very fast insertion and lookup.
+
+ Example:
+ \code
+ #include <qdict.h>
+ #include <stdio.h>
+
+ void main()
+ {
+ // Creates a dictionary that maps QString ==> char* (case insensitive)
+ QDict<char> dict( 17, FALSE );
+
+ dict.insert( "France", "Paris" );
+ dict.insert( "Russia", "Moscow" );
+ dict.insert( "Norway", "Oslo" );
+
+ printf( "%s\n", dict["Norway"] );
+ printf( "%s\n", dict["FRANCE"] );
+ printf( "%s\n", dict["russia"] );
+
+ if ( !dict["Italy"] )
+ printf( "Italy not defined\n" );
+ }
+ \endcode
+
+ Program output:
+ \code
+ Oslo
+ Paris
+ Moscow
+ Italy not defined
+ \endcode
+
+ The dictionary in our example maps \c QString keys to \c char* items.
+ Note that the mapping is case insensitive (specified in the
+ \link QDict::QDict() constructor\endlink).
+ QDict implements the \link operator[] [] operator\endlink to lookup an item.
+
+ QDict is implemented by QGDict as a hash array with a fixed number of
+ entries. Each array entry points to a singly linked list of buckets, in
+ which the dictionary items are stored.
+
+ When an item is inserted with a key, the key is converted (hashed) to
+ an integer index into the hash array. The item is inserted before the
+ first bucket in the list of buckets.
+
+ Looking up an item is normally very fast. The key is again hashed to an
+ array index. Then QDict scans the list of buckets and returns the item
+ found or null if the item was not found. You cannot insert null pointers
+ into a dictionary.
+
+ The size of the hash array is very important. In order to get good
+ performance, you should use a suitably large \link primes.html prime
+ number\endlink. Suitable means equal to or larger than the maximum
+ expected number of dictionary items.
+
+ Items with equal keys are allowed. When inserting two items with the
+ same key, only the last inserted item will be visible (last in, first out)
+ until it is removed.
+
+ Example:
+ \code
+ #include <qdict.h>
+ #include <stdio.h>
+
+ void main()
+ {
+ // Creates a dictionary that maps QString ==> char* (case sensitive)
+ QDict<char> dict;
+
+ dict.insert( "Germany", "Berlin" );
+ dict.insert( "Germany", "Bonn" );
+
+ printf( "%s\n", dict["Germany"] );
+ dict.remove( "Germany" ); // Oct 3rd 1990
+ printf( "%s\n", dict["Germany"] );
+ }
+ \endcode
+
+ Program output:
+ \code
+ Bonn
+ Berlin
+ \endcode
+
+ The QDictIterator class can traverse the dictionary contents, but only
+ in an arbitrary order. Multiple iterators may independently traverse the
+ same dictionary.
+
+ Calling setAutoDelete(TRUE) for a dictionary tells it to delete items
+ that are removed . The default is to not delete items when they are
+ removed.
+
+ When inserting an item into a dictionary, only the pointer is copied, not
+ the item itself. This is called a shallow copy. It is possible to make the
+ dictionary copy all of the item's data (known as a deep copy) when an
+ item is inserted. insert() calls the virtual function
+ QCollection::newItem() for the item to be inserted.
+ Inherit a dictionary and reimplement it if you want deep copies.
+
+ When removing a dictionary item, the virtual function
+ QCollection::deleteItem() is called. QDict's default implementation
+ is to delete the item if auto-deletion is enabled.
+
+ \sa QDictIterator, QAsciiDict, QIntDict, QPtrDict,
+ \link collection.html Collection Classes\endlink
+*/
+
+
+/*!
+ \fn QDict::QDict( int size, bool caseSensitive )
+ Constructs a dictionary with the following properties:
+ \arg \e size is the size of the internal hash array.
+ \arg \e caseSensitive specifies whether to use case sensitive lookup or not.
+
+ Setting \e size to a suitably large \link primes.html prime
+ number\endlink (equal to or greater than the expected number of entries)
+ makes the hash distribution better and hence the loopup faster.
+
+ Setting \e caseSensitive to TRUE will treat "abc" and "Abc" as different
+ keys. Setting it to FALSE will make the dictionary ignore case.
+ Case insensitive comparison includes the whole Unicode alphabeth.
+*/
+
+/*!
+ \fn QDict::QDict( const QDict<type> &dict )
+ Constructs a copy of \e dict.
+
+ Each item in \e dict are inserted into this dictionary.
+ Only the pointers are copied (shallow copy).
+*/
+
+/*!
+ \fn QDict::~QDict()
+ Removes all items from the dictionary and destroys it.
+ All iterators that access this dictionary will be reset.
+
+ \sa setAutoDelete()
+*/
+
+/*!
+ \fn QDict<type> &QDict::operator=(const QDict<type> &dict)
+ Assigns \e dict to this dictionary and returns a reference to this
+ dictionary.
+
+ This dictionary is first cleared, then each item in \e dict is inserted
+ into this dictionary.
+ Only the pointers are copied (shallow copy), unless newItem() has been
+ reimplemented().
+*/
+
+/*!
+ \fn uint QDict::count() const
+ Returns the number of items in the dictionary.
+ \sa isEmpty()
+*/
+
+/*!
+ \fn uint QDict::size() const
+ Returns the size of the internal hash array (as specified in the
+ constructor).
+ \sa count()
+*/
+
+/*!
+ \fn void QDict::resize( uint newsize )
+ Changes the size of the hashtable the \a newsize.
+ The contents of the dictionary are preserved,
+ but all iterators on the dictionary become invalid.
+*/
+
+/*!
+ \fn bool QDict::isEmpty() const
+ Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
+ otherwise.
+ \sa count()
+*/
+
+/*!
+ \fn void QDict::insert( const QString &key, const type *item )
+
+ Inserts the \e key with the \e item into the dictionary.
+
+ The key does not have to be a unique dictionary key. If multiple items
+ are inserted with the same key, only the last item will be visible.
+
+ Null items are not allowed.
+
+ \sa replace()
+*/
+
+/*!
+ \fn void QDict::replace( const QString &key, const type *item )
+
+ Replaces an item which has a key equal to \e key with \e item.
+
+ If the item does not already exist, it will be inserted.
+
+ Null items are not allowed.
+
+ Equivalent to:
+ \code
+ QDict<char> dict;
+ ...
+ if ( dict.find(key) )
+ dict.remove( key );
+ dict.insert( key, item );
+ \endcode
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be replaced.
+
+ \sa insert()
+*/
+
+/*!
+ \fn bool QDict::remove( const QString &key )
+
+ Removes the item associated with \e key from the dictionary.
+ Returns TRUE if successful, or FALSE if the key does not exist in the
+ dictionary.
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be removed.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ All dictionary iterators that refer to the removed item will be set to
+ point to the next item in the dictionary traversing order.
+
+ \sa take(), clear(), setAutoDelete()
+*/
+
+/*!
+ \fn type *QDict::take( const QString &key )
+
+ Takes the item associated with \e key out of the dictionary without
+ deleting it (even if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled).
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be taken.
+
+ Returns a pointer to the item taken out, or null if the key does not
+ exist in the dictionary.
+
+ All dictionary iterators that refer to the taken item will be set to
+ point to the next item in the dictionary traversal order.
+
+ \sa remove(), clear(), setAutoDelete()
+*/
+
+/*!
+ \fn void QDict::clear()
+
+ Removes all items from the dictionary.
+
+ The removed items are deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ All dictionary iterators that operate on dictionary are reset.
+
+ \sa remove(), take(), setAutoDelete()
+*/
+
+/*!
+ \fn type *QDict::find( const QString &key ) const
+
+ Returns the item associated with \e key, or null if the key does not
+ exist in the dictionary.
+
+ This function uses an internal hashing algorithm to optimize lookup.
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be found.
+
+ Equivalent to the [] operator.
+
+ \sa operator[]()
+*/
+
+/*!
+ \fn type *QDict::operator[]( const QString &key ) const
+
+ Returns the item associated with \e key, or null if the key does not
+ exist in the dictionary.
+
+ This function uses an internal hashing algorithm to optimize lookup.
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be found.
+
+ Equivalent to the find() function.
+
+ \sa find()
+*/
+
+/*!
+ \fn void QDict::statistics() const
+ Debugging-only function that prints out the dictionary distribution
+ using qDebug().
+*/
+
+
+/*****************************************************************************
+ QDictIterator documentation
+ *****************************************************************************/
+
+/*!
+ \class QDictIterator qdict.h
+ \brief The QDictIterator class provides an iterator for QDict collections.
+
+ \ingroup collection
+ \ingroup tools
+
+ QDictIterator is implemented as a template class.
+ Define a template instance QDictIterator\<X\> to create a
+ dictionary iterator that operates on QDict\<X\> (dictionary of X*).
+
+ Example:
+ \code
+ #include <qdict.h>
+ #include <stdio.h>
+
+ void main()
+ {
+ // Creates a dictionary that maps QString ==> char* (case insensitive)
+ QDict<char> dict( 17, FALSE );
+
+ dict.insert( "France", "Paris" );
+ dict.insert( "Russia", "Moscow" );
+ dict.insert( "Norway", "Oslo" );
+
+ QDictIterator<char> it( dict ); // iterator for dict
+
+ while ( it.current() ) {
+ printf( "%s -> %s\n", it.currentKey().latin1(), it.current() );
+ ++it;
+ }
+ }
+ \endcode
+
+ Program output:
+ \code
+ Russia -> Moscow
+ Norway -> Oslo
+ France -> Paris
+ \endcode
+
+ Note that the traversal order is arbitrary, you are not guaranteed the
+ order above.
+
+ Multiple iterators may independently traverse the same dictionary.
+ A QDict knows about all iterators that are operating on the dictionary.
+ When an item is removed from the dictionary, QDict update all iterators
+ that are referring the removed item to point to the next item in the
+ traversing order.
+
+ \sa QDict, \link collection.html Collection Classes\endlink
+*/
+
+/*!
+ \fn QDictIterator::QDictIterator( const QDict<type> &dict )
+ Constructs an iterator for \e dict. The current iterator item is
+ set to point on the first item in the \e dict.
+*/
+
+/*!
+ \fn QDictIterator::~QDictIterator()
+ Destroys the iterator.
+*/
+
+/*!
+ \fn uint QDictIterator::count() const
+ Returns the number of items in the dictionary this iterator operates on.
+ \sa isEmpty()
+*/
+
+/*!
+ \fn bool QDictIterator::isEmpty() const
+ Returns TRUE if the dictionary is empty, i.e. count() == 0, otherwise FALSE.
+ \sa count()
+*/
+
+/*!
+ \fn type *QDictIterator::toFirst()
+ Sets the current iterator item to point to the first item in the
+ dictionary and returns a pointer to the item.
+ If the dictionary is empty it sets the current item to null and
+ returns null.
+*/
+
+/*!
+ \fn QDictIterator::operator type *() const
+ Cast operator. Returns a pointer to the current iterator item.
+ Same as current().
+*/
+
+/*!
+ \fn type *QDictIterator::current() const
+ Returns a pointer to the current iterator item.
+*/
+
+/*!
+ \fn QString QDictIterator::currentKey() const
+ Returns a pointer to the key for the current iterator item.
+*/
+
+/*!
+ \fn type *QDictIterator::operator()()
+ Makes the succeeding item current and returns the original current item.
+
+ If the current iterator item was the last item in the dictionary or if it
+ was null, null is returned.
+*/
+
+/*!
+ \fn type *QDictIterator::operator++()
+ Prefix ++ makes the succeeding item current and returns the new current
+ item.
+
+ If the current iterator item was the last item in the dictionary or if it
+ was null, null is returned.
+*/
+
+/*!
+ \fn type *QDictIterator::operator+=( uint jump )
+ Sets the current item to the item \e jump positions after the current item,
+ and returns a pointer to that item.
+
+ If that item is beyond the last item or if the dictionary is empty,
+ it sets the current item to null and returns null.
+*/
+
+
diff --git a/qtools/qdict.h b/qtools/qdict.h
new file mode 100644
index 0000000..682b270
--- /dev/null
+++ b/qtools/qdict.h
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+**
+** Definition of QDict template class
+**
+** Created : 920821
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QDICT_H
+#define QDICT_H
+
+#ifndef QT_H
+#include "qgdict.h"
+#endif // QT_H
+
+#define USE_ASCII_STRING
+
+#ifdef USE_ASCII_STRING
+
+#define QAsciiDict QDict
+#define QAsciiDictIterator QDictIterator
+#include "qasciidict.h"
+
+#else
+
+template<class type> class Q_EXPORT QDict : public QGDict
+{
+public:
+ QDict(int size=17, bool caseSensitive=TRUE)
+ : QGDict(size,StringKey,caseSensitive,FALSE) {}
+ QDict( const QDict<type> &d ) : QGDict(d) {}
+ ~QDict() { clear(); }
+ QDict<type> &operator=(const QDict<type> &d)
+ { return (QDict<type>&)QGDict::operator=(d); }
+ uint count() const { return QGDict::count(); }
+ uint size() const { return QGDict::size(); }
+ bool isEmpty() const { return QGDict::count() == 0; }
+
+ void insert( const QString &k, const type *d )
+ { QGDict::look_string(k,(Item)d,1); }
+ void replace( const QString &k, const type *d )
+ { QGDict::look_string(k,(Item)d,2); }
+ bool remove( const QString &k ) { return QGDict::remove_string(k); }
+ type *take( const QString &k ) { return (type *)QGDict::take_string(k); }
+ type *find( const QString &k ) const
+ { return (type *)((QGDict*)this)->QGDict::look_string(k,0,0); }
+ type *operator[]( const QString &k ) const
+ { return (type *)((QGDict*)this)->QGDict::look_string(k,0,0); }
+
+ void clear() { QGDict::clear(); }
+ void resize( uint n ) { QGDict::resize(n); }
+ void statistics() const { QGDict::statistics(); }
+private:
+ void deleteItem( Item d );
+};
+
+#if defined(Q_DELETING_VOID_UNDEFINED)
+template<> inline void QDict<void>::deleteItem( Item )
+{
+}
+#endif
+
+template<class type> inline void QDict<type>::deleteItem( QCollection::Item d )
+{
+ if ( del_item ) delete (type *)d;
+}
+
+
+template<class type> class Q_EXPORT QDictIterator : public QGDictIterator
+{
+public:
+ QDictIterator(const QDict<type> &d) :QGDictIterator((QGDict &)d) {}
+ ~QDictIterator() {}
+ uint count() const { return dict->count(); }
+ bool isEmpty() const { return dict->count() == 0; }
+ type *toFirst() { return (type *)QGDictIterator::toFirst(); }
+ operator type *() const { return (type *)QGDictIterator::get(); }
+ type *current() const { return (type *)QGDictIterator::get(); }
+ QString currentKey() const{ return QGDictIterator::getKeyString(); }
+ type *operator()() { return (type *)QGDictIterator::operator()(); }
+ type *operator++() { return (type *)QGDictIterator::operator++(); }
+ type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
+};
+
+#endif // USE_ASCII_STRING
+
+#endif // QDICT_H
diff --git a/qtools/qdir.cpp b/qtools/qdir.cpp
new file mode 100644
index 0000000..d0c1233
--- /dev/null
+++ b/qtools/qdir.cpp
@@ -0,0 +1,1200 @@
+/****************************************************************************
+**
+**
+** Implementation of QDir class
+**
+** Created : 950427
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglobal.h"
+
+#include "qdir.h"
+
+#ifndef QT_NO_DIR
+#include "qfileinfo.h"
+#include "qfiledefs_p.h"
+#include "qregexp.h"
+#include "qstringlist.h"
+#include <stdlib.h>
+#include <ctype.h>
+
+// NOT REVISED
+/*!
+ \class QDir qdir.h
+ \brief Traverses directory structures and contents in a
+ platform-independent way.
+
+ \ingroup io
+
+ A QDir can point to a file using either a relative or an absolute file
+ path. Absolute file paths begin with the directory separator ('/') or a
+ drive specification (not applicable to UNIX). Relative file names begin
+ with a directory name or a file name and specify a path relative to the
+ current directory.
+
+ An example of an absolute path is the string "/tmp/quartz", a relative
+ path might look like "src/fatlib". You can use the function isRelative()
+ to check if a QDir is using a relative or an absolute file path. You can
+ call the function convertToAbs() to convert a relative QDir to an
+ absolute one.
+
+ The directory "example" under the current directory is checked for existence
+ in the example below:
+
+ \code
+ QDir d( "example" ); // "./example"
+ if ( !d.exists() )
+ qWarning( "Cannot find the example directory" );
+ \endcode
+
+ If you always use '/' as a directory separator, Qt will translate your
+ paths to conform to the underlying operating system.
+
+ cd() and cdUp() can be used to navigate the directory tree. Note that the
+ logical cd and cdUp operations are not performed if the new directory does
+ not exist.
+
+ Example:
+ \code
+ QDir d = QDir::root(); // "/"
+ if ( !d.cd("tmp") ) { // "/tmp"
+ qWarning( "Cannot find the \"/tmp\" directory" );
+ } else {
+ QFile f( d.filePath("ex1.txt") ); // "/tmp/ex1.txt"
+ if ( !f.open(IO_ReadWrite) )
+ qWarning( "Cannot create the file %s", f.name() );
+ }
+ \endcode
+
+ To read the contents of a directory you can use the entryList() and
+ entryInfoList() functions.
+
+ Example:
+ \code
+ #include <stdio.h>
+ #include <qdir.h>
+
+ //
+ // This program scans the current directory and lists all files
+ // that are not symbolic links, sorted by size with the smallest files
+ // first.
+ //
+
+ int main( int argc, char **argv )
+ {
+ QDir d;
+ d.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks );
+ d.setSorting( QDir::Size | QDir::Reversed );
+
+ const QFileInfoList *list = d.entryInfoList();
+ QFileInfoListIterator it( *list ); // create list iterator
+ QFileInfo *fi; // pointer for traversing
+
+ printf( " BYTES FILENAME\n" ); // print header
+ while ( (fi=it.current()) ) { // for each file...
+ printf( "%10li %s\n", fi->size(), fi->fileName().data() );
+ ++it; // goto next list element
+ }
+ }
+ \endcode
+*/
+
+
+/*!
+ Constructs a QDir pointing to the current directory.
+ \sa currentDirPath()
+*/
+
+QDir::QDir()
+{
+ dPath = QString::fromLatin1(".");
+ init();
+}
+
+/*!
+ Constructs a QDir.
+
+ \arg \e path is the directory.
+ \arg \e nameFilter is the file name filter.
+ \arg \e sortSpec is the sort specification, which describes how to
+ sort the files in the directory.
+ \arg \e filterSpec is the filter specification, which describes how
+ to filter the files in the directory.
+
+ Most of these arguments (except \e path) have optional values.
+
+ Example:
+ \code
+ // lists all files in /tmp
+
+ QDir d( "/tmp" );
+ for ( int i=0; i<d.count(); i++ )
+ printf( "%s\n", d[i] );
+ \endcode
+
+ If \e path is "" or null, the directory is set to "." (the current
+ directory). If \e nameFilter is "" or null, it is set to "*" (all
+ files).
+
+ No check is made to ensure that the directory exists.
+
+ \sa exists(), setPath(), setNameFilter(), setFilter(), setSorting()
+*/
+
+QDir::QDir( const QString &path, const QString &nameFilter,
+ int sortSpec, int filterSpec )
+{
+ init();
+ dPath = cleanDirPath( path );
+ if ( dPath.isEmpty() )
+ dPath = QString::fromLatin1(".");
+ nameFilt = nameFilter;
+ if ( nameFilt.isEmpty() )
+ nameFilt = QString::fromLatin1("*");
+ filtS = (FilterSpec)filterSpec;
+ sortS = (SortSpec)sortSpec;
+}
+
+/*!
+ Constructs a QDir that is a copy of the given directory.
+ \sa operator=()
+*/
+
+QDir::QDir( const QDir &d )
+{
+ dPath = d.dPath;
+ fList = 0;
+ fiList = 0;
+ nameFilt = d.nameFilt;
+ dirty = TRUE;
+ allDirs = d.allDirs;
+ filtS = d.filtS;
+ sortS = d.sortS;
+}
+
+
+void QDir::init()
+{
+ fList = 0;
+ fiList = 0;
+ nameFilt = QString::fromLatin1("*");
+ dirty = TRUE;
+ allDirs = FALSE;
+ filtS = All;
+ sortS = SortSpec(Name | IgnoreCase);
+}
+
+/*!
+ Destructs the QDir and cleans up.
+*/
+
+QDir::~QDir()
+{
+ if ( fList )
+ delete fList;
+ if ( fiList )
+ delete fiList;
+}
+
+
+/*!
+ Sets the path of the directory. The path is cleaned of redundant ".", ".."
+ and multiple separators. No check is made to ensure that a directory
+ with this path exists.
+
+ The path can be either absolute or relative. Absolute paths begin with the
+ directory separator ('/') or a drive specification (not
+ applicable to UNIX).
+ Relative file names begin with a directory name or a file name and specify
+ a path relative to the current directory. An example of
+ an absolute path is the string "/tmp/quartz", a relative path might look like
+ "src/fatlib". You can use the function isRelative() to check if a QDir
+ is using a relative or an absolute file path. You can call the function
+ convertToAbs() to convert a relative QDir to an absolute one.
+
+ \sa path(), absPath(), exists(), cleanDirPath(), dirName(),
+ absFilePath(), isRelative(), convertToAbs()
+*/
+
+void QDir::setPath( const QString &path )
+{
+ dPath = cleanDirPath( path );
+ if ( dPath.isEmpty() )
+ dPath = QString::fromLatin1(".");
+ dirty = TRUE;
+}
+
+/*!
+ \fn QString QDir::path() const
+ Returns the path, this may contain symbolic links, but never contains
+ redundant ".", ".." or multiple separators.
+
+ The returned path can be either absolute or relative (see setPath()).
+
+ \sa setPath(), absPath(), exists(), cleanDirPath(), dirName(),
+ absFilePath(), convertSeparators()
+*/
+
+/*!
+ Returns the absolute (a path that starts with '/') path, which may
+ contain symbolic links, but never contains redundant ".", ".." or
+ multiple separators.
+
+ \sa setPath(), canonicalPath(), exists(), cleanDirPath(), dirName(),
+ absFilePath()
+*/
+
+QString QDir::absPath() const
+{
+ if ( QDir::isRelativePath(dPath) ) {
+ QString tmp = currentDirPath();
+ if ( tmp.right(1) != QString::fromLatin1("/") )
+ tmp += '/';
+ tmp += dPath;
+ return cleanDirPath( tmp );
+ } else {
+ return cleanDirPath( dPath );
+ }
+}
+
+/*!
+ Returns the name of the directory, this is NOT the same as the path, e.g.
+ a directory with the name "mail", might have the path "/var/spool/mail".
+ If the directory has no name (e.g. the root directory) a null string is
+ returned.
+
+ No check is made to ensure that a directory with this name actually exists.
+
+ \sa path(), absPath(), absFilePath(), exists(), QString::isNull()
+*/
+
+QString QDir::dirName() const
+{
+ int pos = dPath.findRev( '/' );
+ if ( pos == -1 )
+ return dPath;
+ return dPath.right( dPath.length() - pos - 1 );
+}
+
+/*!
+ Returns the path name of a file in the directory. Does NOT check if
+ the file actually exists in the directory. If the QDir is relative
+ the returned path name will also be relative. Redundant multiple separators
+ or "." and ".." directories in \e fileName will not be removed (see
+ cleanDirPath()).
+
+ If \e acceptAbsPath is TRUE a \e fileName starting with a separator
+ ('/') will be returned without change.
+ If \e acceptAbsPath is FALSE an absolute path will be appended to
+ the directory path.
+
+ \sa absFilePath(), isRelative(), canonicalPath()
+*/
+
+QString QDir::filePath( const QString &fileName,
+ bool acceptAbsPath ) const
+{
+ if ( acceptAbsPath && !isRelativePath(fileName) )
+ return QString(fileName);
+
+ QString tmp = dPath;
+ if ( tmp.isEmpty() || (tmp[(int)tmp.length()-1] != '/' && !!fileName &&
+ fileName[0] != '/') )
+ tmp += '/';
+ tmp += fileName;
+ return tmp;
+}
+
+/*!
+ Returns the absolute path name of a file in the directory. Does NOT check if
+ the file actually exists in the directory. Redundant multiple separators
+ or "." and ".." directories in \e fileName will NOT be removed (see
+ cleanDirPath()).
+
+ If \e acceptAbsPath is TRUE a \e fileName starting with a separator
+ ('/') will be returned without change.
+ if \e acceptAbsPath is FALSE an absolute path will be appended to
+ the directory path.
+
+ \sa filePath()
+*/
+
+QString QDir::absFilePath( const QString &fileName,
+ bool acceptAbsPath ) const
+{
+ if ( acceptAbsPath && !isRelativePath( fileName ) )
+ return fileName;
+
+ QString tmp = absPath();
+ if ( tmp.isEmpty() || (tmp[(int)tmp.length()-1] != '/' && !!fileName &&
+ fileName[0] != '/') )
+ tmp += '/';
+ tmp += fileName;
+ return tmp;
+}
+
+
+/*!
+ Converts the '/' separators in \a pathName to system native
+ separators. Returns the translated string.
+
+ On Windows, convertSeparators("c:/winnt/system32") returns
+ "c:\winnt\system32".
+
+ No conversion is done on UNIX.
+*/
+
+QString QDir::convertSeparators( const QString &pathName )
+{
+ QString n( pathName );
+#if defined(_OS_FATFS_) || defined(_OS_OS2EMX_)
+ for ( int i=0; i<(int)n.length(); i++ ) {
+ if ( n[i] == '/' )
+ n[i] = '\\';
+ }
+#endif
+ return n;
+}
+
+
+/*!
+ Changes directory by descending into the given directory. Returns
+ TRUE if the new directory exists and is readable. Note that the logical
+ cd operation is NOT performed if the new directory does not exist.
+
+ If \e acceptAbsPath is TRUE a path starting with a separator ('/')
+ will cd to the absolute directory, if \e acceptAbsPath is FALSE
+ any number of separators at the beginning of \e dirName will be removed.
+
+ Example:
+ \code
+ QDir d = QDir::home(); // now points to home directory
+ if ( !d.cd("c++") ) { // now points to "c++" under home directory if OK
+ QFileInfo fi( d, "c++" );
+ if ( fi.exists() ) {
+ if ( fi.isDir() )
+ qWarning( "Cannot cd into \"%s\".", (char*)d.absFilePath("c++") );
+ else
+ qWarning( "Cannot create directory \"%s\"\n"
+ "A file named \"c++\" already exists in \"%s\"",
+ (const char *)d.absFilePath("c++"),
+ (const char *)d.path() );
+ return;
+ } else {
+ qWarning( "Creating directory \"%s\"",
+ (const char *) d.absFilePath("c++") );
+ if ( !d.mkdir( "c++" ) ) {
+ qWarning("Could not create directory \"%s\"",
+ (const char *)d.absFilePath("c++") );
+ return;
+ }
+ }
+ }
+ \endcode
+
+ Calling cd( ".." ) is equivalent to calling cdUp().
+
+ \sa cdUp(), isReadable(), exists(), path()
+*/
+
+bool QDir::cd( const QString &dirName, bool acceptAbsPath )
+{
+ if ( dirName.isEmpty() || dirName==QString::fromLatin1(".") )
+ return TRUE;
+ QString old = dPath;
+ if ( acceptAbsPath && !isRelativePath(dirName) ) {
+ dPath = cleanDirPath( dirName );
+ } else {
+ if ( !isRoot() )
+ dPath += '/';
+ dPath += dirName;
+ if ( dirName.find('/') >= 0
+ || old == QString::fromLatin1(".")
+ || dirName == QString::fromLatin1("..") )
+ dPath = cleanDirPath( dPath );
+ }
+ if ( !exists() ) {
+ dPath = old; // regret
+ return FALSE;
+ }
+ dirty = TRUE;
+ return TRUE;
+}
+
+/*!
+ Changes directory by moving one directory up the path followed to arrive
+ at the current directory.
+
+ Returns TRUE if the new directory exists and is readable. Note that the
+ logical cdUp() operation is not performed if the new directory does not
+ exist.
+
+ \sa cd(), isReadable(), exists(), path()
+*/
+
+bool QDir::cdUp()
+{
+ return cd( QString::fromLatin1("..") );
+}
+
+/*!
+ \fn QString QDir::nameFilter() const
+ Returns the string set by setNameFilter()
+*/
+
+/*!
+ Sets the name filter used by entryList() and entryInfoList().
+
+ The name filter is a wildcarding filter that understands "*" and "?"
+ wildcards, You may specify several filter entries separated by a " " or a ";". If
+ you want entryList() and entryInfoList() to list all files ending with
+ ".cpp" and all files ending with ".h", you simply call
+ dir.setNameFilter("*.cpp *.h") or dir.setNameFilter("*.cpp;*.h")
+
+ \sa nameFilter(), setFilter()
+*/
+
+void QDir::setNameFilter( const QString &nameFilter )
+{
+ nameFilt = nameFilter;
+ if ( nameFilt.isEmpty() )
+ nameFilt = QString::fromLatin1("*");
+ dirty = TRUE;
+}
+
+/*!
+ \fn QDir::FilterSpec QDir::filter() const
+ Returns the value set by setFilter()
+*/
+
+/*! \enum QDir::FilterSpec
+
+ This enum describes how QDir is to select what entries in a
+ directory to return. The filter value is specified by or-ing
+ together values from the following list: <ul>
+
+ <li> \c Dirs - List directories only
+ <li> \c Files - List files only
+
+ <li> \c Drives - List disk drives (does nothing under unix)
+ <li> \c NoSymLinks - Do not list symbolic links (where they exist)
+ <li> \c Readable - List files for which the application has read access.
+ <li> \c Writable - List files for which the application has write access.
+ <li> \c Executable - List files for which the application has execute access
+ <li> \c Modified - Only list files that have been modified (does nothing
+ under unix)
+ <li> \c Hidden - List hidden files (on unix, files starting with a .)
+ <li> \c System - List system files (does nothing under unix)
+ </ul>
+
+ If you do not set any of \c Readable, \c Writable or \c Executable,
+ QDir will set all three of them. This makes the default easy to
+ write and at the same time useful.
+
+ Examples: \c Readable|Writable means list all files for which the
+ application has read access, write access or both. \c Dirs|Drives
+ means list drives, directories, all files that the application can
+ read, write or execute, and also symlinks to such files/directories.
+*/
+
+
+/*!
+ Sets the filter used by entryList() and entryInfoList(). The filter is used
+ to specify the kind of files that should be returned by entryList() and
+ entryInfoList().
+
+ \sa filter(), setNameFilter()
+*/
+
+void QDir::setFilter( int filterSpec )
+{
+ if ( filtS == (FilterSpec) filterSpec )
+ return;
+ filtS = (FilterSpec) filterSpec;
+ dirty = TRUE;
+}
+
+/*!
+ \fn QDir::SortSpec QDir::sorting() const
+
+ Returns the value set by setSorting()
+
+ \sa setSorting()
+*/
+
+/*! \enum QDir::SortSpec
+
+ This enum describes how QDir is to sort entries in a directory when
+ it returns a list of them. The sort value is specified by or-ing
+ together values from the following list: <ul>
+
+ <li> \c Name - sort by name
+ <li> \c Time - sort by time (modification time)
+ <li> \c Size - sort by file size
+ <li> \c Unsorted - do not sort
+
+ <li> \c DirsFirst - put all directories first in the list
+ <li> \c Reversed - reverse the sort order
+ <li> \c IgnoreCase - sort case-insensitively
+
+ </ul>
+
+ You can only specify one of the first four. If you specify both \c
+ DirsFirst and \c Reversed, directories are still put first but the
+ list is otherwise reversed.
+*/
+
+// ### Unsorted+DirsFirst ? Unsorted+Reversed?
+
+/*!
+ Sets the sorting order used by entryList() and entryInfoList().
+
+ The \e sortSpec is specified by or-ing values from the enum
+ SortSpec. The different values are:
+
+ One of these:
+ <dl compact>
+ <dt>Name<dd> Sort by name (alphabetical order).
+ <dt>Time<dd> Sort by time (most recent first).
+ <dt>Size<dd> Sort by size (largest first).
+ <dt>Unsorted<dd> Use the operating system order (UNIX does NOT sort
+ alphabetically).
+
+ ORed with zero or more of these:
+
+ <dt>DirsFirst<dd> Always put directory names first.
+ <dt>Reversed<dd> Reverse sort order.
+ <dt>IgnoreCase<dd> Ignore case when sorting by name.
+ </dl>
+*/
+
+void QDir::setSorting( int sortSpec )
+{
+ if ( sortS == (SortSpec) sortSpec )
+ return;
+ sortS = (SortSpec) sortSpec;
+ dirty = TRUE;
+}
+
+/*!
+ \fn bool QDir::matchAllDirs() const
+ Returns the value set by setMatchAllDirs()
+
+ \sa setMatchAllDirs()
+*/
+
+/*!
+ If \e enable is TRUE, all directories will be listed (even if they do not
+ match the filter or the name filter), otherwise only matched directories
+ will be listed.
+
+ \bug Currently, directories that do not match the filter will not be
+ included (the name filter will be ignored as expected).
+
+ \sa matchAllDirs()
+*/
+
+void QDir::setMatchAllDirs( bool enable )
+{
+ if ( (bool)allDirs == enable )
+ return;
+ allDirs = enable;
+ dirty = TRUE;
+}
+
+
+/*!
+ Returns the number of files that was found.
+ Equivalent to entryList().count().
+ \sa operator[](), entryList()
+*/
+
+uint QDir::count() const
+{
+ return entryList().count();
+}
+
+/*!
+ Returns the file name at position \e index in the list of found file
+ names.
+ Equivalent to entryList().at(index).
+
+ Returns null if the \e index is out of range or if the entryList()
+ function failed.
+
+ \sa count(), entryList()
+*/
+
+QString QDir::operator[]( int index ) const
+{
+ entryList();
+ return fList && index >= 0 && index < (int)fList->count() ?
+ (*fList)[index] : QString::null;
+}
+
+
+/*!
+ This function is included to easy porting from Qt 1.x to Qt 2.0,
+ it is the same as entryList(), but encodes the filenames as 8-bit
+ strings using QFile::encodedName().
+
+ It is more efficient to use entryList().
+*/
+QStrList QDir::encodedEntryList( int filterSpec, int sortSpec ) const
+{
+ QStrList r;
+ QStringList l = entryList(filterSpec,sortSpec);
+ for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it ) {
+ r.append( QFile::encodeName(*it) );
+ }
+ return r;
+}
+
+/*!
+ This function is included to easy porting from Qt 1.x to Qt 2.0,
+ it is the same as entryList(), but encodes the filenames as 8-bit
+ strings using QFile::encodedName().
+
+ It is more efficient to use entryList().
+*/
+QStrList QDir::encodedEntryList( const QString &nameFilter,
+ int filterSpec,
+ int sortSpec ) const
+{
+ QStrList r;
+ QStringList l = entryList(nameFilter,filterSpec,sortSpec);
+ for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it ) {
+ r.append( QFile::encodeName(*it) );
+ }
+ return r;
+}
+
+
+
+/*!
+ Returns a list of the names of all files and directories in the directory
+ indicated by the setSorting(), setFilter() and setNameFilter()
+ specifications.
+
+ The the filter and sorting specifications can be overridden using the
+ \e filterSpec and \e sortSpec arguments.
+
+ Returns an empty list if the directory is unreadable or does not exist.
+
+ \sa entryInfoList(), setNameFilter(), setSorting(), setFilter(),
+ encodedEntryList()
+*/
+
+QStringList QDir::entryList( int filterSpec, int sortSpec ) const
+{
+ if ( !dirty && filterSpec == (int)DefaultFilter &&
+ sortSpec == (int)DefaultSort )
+ return *fList;
+ return entryList( nameFilt, filterSpec, sortSpec );
+}
+
+/*!
+ Returns a list of the names of all files and directories in the directory
+ indicated by the setSorting(), setFilter() and setNameFilter()
+ specifications.
+
+ The the filter and sorting specifications can be overridden using the
+ \e nameFilter, \e filterSpec and \e sortSpec arguments.
+
+ Returns and empty list if the directory is unreadable or does not exist.
+
+ \sa entryInfoList(), setNameFilter(), setSorting(), setFilter(),
+ encodedEntryList()
+*/
+
+QStringList QDir::entryList( const QString &nameFilter,
+ int filterSpec, int sortSpec ) const
+{
+ if ( filterSpec == (int)DefaultFilter )
+ filterSpec = filtS;
+ if ( sortSpec == (int)DefaultSort )
+ sortSpec = sortS;
+ QDir *that = (QDir*)this; // mutable function
+ if ( that->readDirEntries(nameFilter, filterSpec, sortSpec) )
+ return *that->fList;
+ else
+ return QStringList();
+}
+
+/*!
+ Returns a list of QFileInfo objects for all files and directories in
+ the directory pointed to using the setSorting(), setFilter() and
+ setNameFilter() specifications.
+
+ The the filter and sorting specifications can be overridden using the
+ \e filterSpec and \e sortSpec arguments.
+
+ Returns 0 if the directory is unreadable or does not exist.
+
+ The returned pointer is a const pointer to a QFileInfoList. The list is
+ owned by the QDir object and will be reused on the next call to
+ entryInfoList() for the same QDir instance. If you want to keep the
+ entries of the list after a subsequent call to this function you will
+ need to copy them.
+
+ \sa entryList(), setNameFilter(), setSorting(), setFilter()
+*/
+
+const QFileInfoList *QDir::entryInfoList( int filterSpec, int sortSpec ) const
+{
+ if ( !dirty && filterSpec == (int)DefaultFilter &&
+ sortSpec == (int)DefaultSort )
+ return fiList;
+ return entryInfoList( nameFilt, filterSpec, sortSpec );
+}
+
+/*!
+ Returns a list of QFileInfo objects for all files and directories in
+ the directory pointed to using the setSorting(), setFilter() and
+ setNameFilter() specifications.
+
+ The the filter and sorting specifications can be overridden using the
+ \e nameFilter, \e filterSpec and \e sortSpec arguments.
+
+ Returns 0 if the directory is unreadable or does not exist.
+
+ The returned pointer is a const pointer to a QFileInfoList. The list is
+ owned by the QDir object and will be reused on the next call to
+ entryInfoList() for the same QDir instance. If you want to keep the
+ entries of the list after a subsequent call to this function you will
+ need to copy them.
+
+ \sa entryList(), setNameFilter(), setSorting(), setFilter()
+*/
+
+const QFileInfoList *QDir::entryInfoList( const QString &nameFilter,
+ int filterSpec, int sortSpec ) const
+{
+ if ( filterSpec == (int)DefaultFilter )
+ filterSpec = filtS;
+ if ( sortSpec == (int)DefaultSort )
+ sortSpec = sortS;
+ QDir *that = (QDir*)this; // mutable function
+ if ( that->readDirEntries(nameFilter, filterSpec, sortSpec) )
+ return that->fiList;
+ else
+ return 0;
+}
+
+/*!
+ Returns TRUE if the directory exists. (If a file with the same
+ name is found this function will of course return FALSE).
+
+ \sa QFileInfo::exists(), QFile::exists()
+*/
+
+bool QDir::exists() const
+{
+ QFileInfo fi( dPath );
+ return fi.exists() && fi.isDir();
+}
+
+/*!
+ Returns TRUE if the directory path is relative to the current directory,
+ FALSE if the path is absolute (e.g. under UNIX a path is relative if it
+ does not start with a '/').
+
+ According to Einstein this function should always return TRUE.
+
+ \sa convertToAbs()
+*/
+
+bool QDir::isRelative() const
+{
+ return isRelativePath( dPath );
+}
+
+/*!
+ Converts the directory path to an absolute path. If it is already
+ absolute nothing is done.
+
+ \sa isRelative()
+*/
+
+void QDir::convertToAbs()
+{
+ dPath = absPath();
+}
+
+/*!
+ Makes a copy of d and assigns it to this QDir.
+*/
+
+QDir &QDir::operator=( const QDir &d )
+{
+ dPath = d.dPath;
+ delete fList;
+ fList = 0;
+ delete fiList;
+ fiList = 0;
+ nameFilt = d.nameFilt;
+ dirty = TRUE;
+ allDirs = d.allDirs;
+ filtS = d.filtS;
+ sortS = d.sortS;
+ return *this;
+}
+
+/*!
+ Sets the directory path to be the given path.
+*/
+
+QDir &QDir::operator=( const QString &path )
+{
+ dPath = cleanDirPath( path );
+ dirty = TRUE;
+ return *this;
+}
+
+
+/*!
+ \fn bool QDir::operator!=( const QDir &d ) const
+ Returns TRUE if the \e d and this dir have different path or
+ different sort/filter settings, otherwise FALSE.
+*/
+
+/*!
+ Returns TRUE if the \e d and this dir have the same path and all sort
+ and filter settings are equal, otherwise FALSE.
+*/
+
+bool QDir::operator==( const QDir &d ) const
+{
+ return dPath == d.dPath &&
+ nameFilt == d.nameFilt &&
+ allDirs == d.allDirs &&
+ filtS == d.filtS &&
+ sortS == d.sortS;
+}
+
+
+/*!
+ Removes a file.
+
+ If \e acceptAbsPath is TRUE a path starting with a separator ('/')
+ will remove the file with the absolute path, if \e acceptAbsPath is FALSE
+ any number of separators at the beginning of \e fileName will be removed.
+
+ Returns TRUE if successful, otherwise FALSE.
+*/
+
+bool QDir::remove( const QString &fileName, bool acceptAbsPath )
+{
+ if ( fileName.isEmpty() ) {
+#if defined(CHECK_NULL)
+ qWarning( "QDir::remove: Empty or null file name" );
+#endif
+ return FALSE;
+ }
+ QString p = filePath( fileName, acceptAbsPath );
+ return QFile::remove( p );
+}
+
+/*!
+ Checks for existence of a file.
+
+ If \e acceptAbsPaths is TRUE a path starting with a separator ('/')
+ will check the file with the absolute path, if \e acceptAbsPath is FALSE
+ any number of separators at the beginning of \e name will be removed.
+
+ Returns TRUE if the file exists, otherwise FALSE.
+
+ \sa QFileInfo::exists(), QFile::exists()
+*/
+
+bool QDir::exists( const QString &name, bool acceptAbsPath )
+{
+ if ( name.isEmpty() ) {
+#if defined(CHECK_NULL)
+ qWarning( "QDir::exists: Empty or null file name" );
+#endif
+ return FALSE;
+ }
+ QString tmp = filePath( name, acceptAbsPath );
+ return QFile::exists( tmp );
+}
+
+/*!
+ Returns the native directory separator; '/' under UNIX and '\' under
+ MS-DOS, Windows NT and OS/2.
+
+ You do not need to use this function to build file paths. If you always
+ use '/', Qt will translate your paths to conform to the underlying
+ operating system.
+*/
+
+char QDir::separator()
+{
+#if defined(_OS_UNIX_)
+ return '/';
+#elif defined (_OS_FATFS_)
+ return '\\';
+#elif defined (_OS_MAC_)
+ return ':';
+#else
+ return '/';
+#endif
+}
+
+/*!
+ Returns the current directory.
+ \sa currentDirPath(), QDir::QDir()
+*/
+
+QDir QDir::current()
+{
+ return QDir( currentDirPath() );
+}
+
+/*!
+ Returns the home directory.
+ \sa homeDirPath()
+*/
+
+QDir QDir::home()
+{
+ return QDir( homeDirPath() );
+}
+
+/*!
+ Returns the root directory.
+ \sa rootDirPath() drives()
+*/
+
+QDir QDir::root()
+{
+ return QDir( rootDirPath() );
+}
+
+/*!
+ \fn QString QDir::homeDirPath()
+
+ Returns the absolute path for the user's home directory,
+ \sa home()
+*/
+
+QStringList qt_makeFilterList( const QString &filter )
+{
+ if ( filter.isEmpty() )
+ return QStringList();
+
+ QChar sep( ';' );
+ int i = filter.find( sep, 0 );
+ if ( i == -1 && filter.find( ' ', 0 ) != -1 )
+ sep = QChar( ' ' );
+
+ QStringList lst = QStringList::split( sep, filter );
+ QStringList lst2;
+ QStringList::Iterator it = lst.begin();
+
+ for ( ; it != lst.end(); ++it ) {
+ QString s = *it;
+ lst2 << s.stripWhiteSpace();
+ }
+ return lst2;
+}
+
+/*!
+ Returns TRUE if the \e fileName matches one of the wildcards in the list \e filters.
+ \sa QRegExp
+*/
+
+bool QDir::match( const QStringList &filters, const QString &fileName )
+{
+ QStringList::ConstIterator sit = filters.begin();
+ bool matched = FALSE;
+ for ( ; sit != filters.end(); ++sit ) {
+ QRegExp regexp( (*sit).data(), FALSE, TRUE );
+ if ( regexp.match( fileName.data() ) != -1 ) {
+ matched = TRUE;
+ break;
+ }
+ }
+
+ return matched;
+}
+
+/*!
+ Returns TRUE if the \e fileName matches the wildcard \e filter.
+ \a Filter may also contain multiple wildcards separated by spaces or
+ semicolons.
+ \sa QRegExp
+*/
+
+bool QDir::match( const QString &filter, const QString &fileName )
+{
+ QStringList lst = qt_makeFilterList( filter );
+ return match( lst, fileName );
+}
+
+
+/*!
+ Removes all multiple directory separators ('/') and resolves
+ any "." or ".." found in the path.
+
+ Symbolic links are kept. This function does not return the
+ canonical path, but rather the most simplified version of the input.
+ "../stuff" becomes "stuff", "stuff/../nonsense" becomes "nonsense"
+ and "\\stuff\\more\\..\\nonsense" becomes "\\stuff\\nonsense".
+
+ \sa absPath() canonicalPath()
+*/
+
+QString QDir::cleanDirPath( const QString &filePath )
+{
+ QString name = filePath;
+ QString newPath;
+
+ if ( name.isEmpty() )
+ return name;
+
+ slashify( name );
+
+ bool addedSeparator;
+ if ( isRelativePath(name) ) {
+ addedSeparator = TRUE;
+ name.insert( 0, '/' );
+ } else {
+ addedSeparator = FALSE;
+ }
+
+ int ePos, pos, upLevel;
+
+ pos = ePos = name.length();
+ upLevel = 0;
+ int len;
+
+ while ( pos && (pos = name.findRev('/',--pos)) != -1 ) {
+ len = ePos - pos - 1;
+ if ( len == 2 && name.at(pos + 1) == '.'
+ && name.at(pos + 2) == '.' ) {
+ upLevel++;
+ } else {
+ if ( len != 0 && (len != 1 || name.at(pos + 1) != '.') ) {
+ if ( !upLevel )
+ newPath = QString::fromLatin1("/")
+ + name.mid(pos + 1, len) + newPath;
+ else
+ upLevel--;
+ }
+ }
+ ePos = pos;
+ }
+ if ( addedSeparator ) {
+ while ( upLevel-- )
+ newPath.insert( 0, QString::fromLatin1("/..") );
+ if ( !newPath.isEmpty() )
+ newPath.remove( 0, 1 );
+ else
+ newPath = QString::fromLatin1(".");
+ } else {
+ if ( newPath.isEmpty() )
+ newPath = QString::fromLatin1("/");
+#if defined(_OS_FATFS_) || defined(_OS_OS2EMX_)
+ if ( name[0] == '/' ) {
+ if ( name[1] == '/' ) // "\\machine\x\ ..."
+ newPath.insert( 0, '/' );
+ } else {
+ newPath = name.left(2) + newPath;
+ }
+#endif
+ }
+ return newPath;
+}
+
+int qt_cmp_si_sortSpec;
+
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+int qt_cmp_si( const void *n1, const void *n2 )
+{
+ if ( !n1 || !n2 )
+ return 0;
+
+ QDirSortItem* f1 = (QDirSortItem*)n1;
+ QDirSortItem* f2 = (QDirSortItem*)n2;
+
+ if ( qt_cmp_si_sortSpec & QDir::DirsFirst )
+ if ( f1->item->isDir() != f2->item->isDir() )
+ return f1->item->isDir() ? -1 : 1;
+
+ int r = 0;
+ int sortBy = qt_cmp_si_sortSpec & QDir::SortByMask;
+
+ switch ( sortBy ) {
+ case QDir::Time:
+ r = f1->item->lastModified().secsTo(f2->item->lastModified());
+ break;
+ case QDir::Size:
+ r = f2->item->size() - f1->item->size();
+ break;
+ default:
+ ;
+ }
+
+ if ( r == 0 && sortBy != QDir::Unsorted ) {
+ // Still not sorted - sort by name
+ bool ic = qt_cmp_si_sortSpec & QDir::IgnoreCase;
+
+ if ( f1->filename_cache.isNull() )
+ f1->filename_cache = ic ? f1->item->fileName().lower()
+ : f1->item->fileName();
+ if ( f2->filename_cache.isNull() )
+ f2->filename_cache = ic ? f2->item->fileName().lower()
+ : f2->item->fileName();
+
+ r = f1->filename_cache.compare(f2->filename_cache);
+ }
+
+ if ( r == 0 ) {
+ // Enforce an order - the order the items appear in the array
+ r = (char*)n1 - (char*)n2;
+ }
+
+ if ( qt_cmp_si_sortSpec & QDir::Reversed )
+ return -r;
+ else
+ return r;
+}
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+#endif // QT_NO_DIR
diff --git a/qtools/qdir.h b/qtools/qdir.h
new file mode 100644
index 0000000..dd74271
--- /dev/null
+++ b/qtools/qdir.h
@@ -0,0 +1,235 @@
+/****************************************************************************
+**
+**
+** Definition of QDir class
+**
+** Created : 950427
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QDIR_H
+#define QDIR_H
+
+#ifndef QT_H
+#include "qstrlist.h"
+#include "qfileinfo.h"
+#endif // QT_H
+
+#ifndef QT_NO_DIR
+typedef QList<QFileInfo> QFileInfoList;
+typedef QListIterator<QFileInfo> QFileInfoListIterator;
+class QStringList;
+
+
+class Q_EXPORT QDir
+{
+public:
+ enum FilterSpec { Dirs = 0x001,
+ Files = 0x002,
+ Drives = 0x004,
+ NoSymLinks = 0x008,
+ All = 0x007,
+ TypeMask = 0x00F,
+
+ Readable = 0x010,
+ Writable = 0x020,
+ Executable = 0x040,
+ RWEMask = 0x070,
+
+ Modified = 0x080,
+ Hidden = 0x100,
+ System = 0x200,
+ AccessMask = 0x3F0,
+
+ DefaultFilter = -1 };
+
+ enum SortSpec { Name = 0x00,
+ Time = 0x01,
+ Size = 0x02,
+ Unsorted = 0x03,
+ SortByMask = 0x03,
+
+ DirsFirst = 0x04,
+ Reversed = 0x08,
+ IgnoreCase = 0x10,
+ DefaultSort = -1 };
+
+ QDir();
+ QDir( const QString &path, const QString &nameFilter = QString::null,
+ int sortSpec = Name | IgnoreCase, int filterSpec = All );
+ QDir( const QDir & );
+
+ virtual ~QDir();
+
+ QDir &operator=( const QDir & );
+ QDir &operator=( const QString &path );
+
+ virtual void setPath( const QString &path );
+ virtual QString path() const;
+ virtual QString absPath() const;
+ virtual QString canonicalPath() const;
+
+ virtual QString dirName() const;
+ virtual QString filePath( const QString &fileName,
+ bool acceptAbsPath = TRUE ) const;
+ virtual QString absFilePath( const QString &fileName,
+ bool acceptAbsPath = TRUE ) const;
+
+ static QString convertSeparators( const QString &pathName );
+
+ virtual bool cd( const QString &dirName, bool acceptAbsPath = TRUE );
+ virtual bool cdUp();
+
+ QString nameFilter() const;
+ virtual void setNameFilter( const QString &nameFilter );
+ FilterSpec filter() const;
+ virtual void setFilter( int filterSpec );
+ SortSpec sorting() const;
+ virtual void setSorting( int sortSpec );
+
+ bool matchAllDirs() const;
+ virtual void setMatchAllDirs( bool );
+
+ uint count() const;
+ QString operator[]( int ) const;
+
+ virtual QStrList encodedEntryList( int filterSpec = DefaultFilter,
+ int sortSpec = DefaultSort ) const;
+ virtual QStrList encodedEntryList( const QString &nameFilter,
+ int filterSpec = DefaultFilter,
+ int sortSpec = DefaultSort ) const;
+ virtual QStringList entryList( int filterSpec = DefaultFilter,
+ int sortSpec = DefaultSort ) const;
+ virtual QStringList entryList( const QString &nameFilter,
+ int filterSpec = DefaultFilter,
+ int sortSpec = DefaultSort ) const;
+
+ virtual const QFileInfoList *entryInfoList( int filterSpec = DefaultFilter,
+ int sortSpec = DefaultSort ) const;
+ virtual const QFileInfoList *entryInfoList( const QString &nameFilter,
+ int filterSpec = DefaultFilter,
+ int sortSpec = DefaultSort ) const;
+
+ static const QFileInfoList *drives();
+
+ virtual bool mkdir( const QString &dirName,
+ bool acceptAbsPath = TRUE ) const;
+ virtual bool rmdir( const QString &dirName,
+ bool acceptAbsPath = TRUE ) const;
+
+ virtual bool isReadable() const;
+ virtual bool exists() const;
+ virtual bool isRoot() const;
+
+ virtual bool isRelative() const;
+ virtual void convertToAbs();
+
+ virtual bool operator==( const QDir & ) const;
+ virtual bool operator!=( const QDir & ) const;
+
+ virtual bool remove( const QString &fileName,
+ bool acceptAbsPath = TRUE );
+ virtual bool rename( const QString &name, const QString &newName,
+ bool acceptAbsPaths = TRUE );
+ virtual bool exists( const QString &name,
+ bool acceptAbsPath = TRUE );
+
+ static char separator();
+
+ static bool setCurrent( const QString &path );
+ static QDir current();
+ static QDir home();
+ static QDir root();
+ static QString currentDirPath();
+ static QString homeDirPath();
+ static QString rootDirPath();
+
+ static bool match( const QStringList &filters, const QString &fileName );
+ static bool match( const QString &filter, const QString &fileName );
+ static QString cleanDirPath( const QString &dirPath );
+ static bool isRelativePath( const QString &path );
+
+private:
+ void init();
+ virtual bool readDirEntries( const QString &nameFilter,
+ int FilterSpec, int SortSpec );
+
+ static void slashify ( QString &);
+
+ QString dPath;
+ QStringList *fList;
+ QFileInfoList *fiList;
+ QString nameFilt;
+ FilterSpec filtS;
+ SortSpec sortS;
+ uint dirty : 1;
+ uint allDirs : 1;
+};
+
+
+inline QString QDir::path() const
+{
+ return dPath;
+}
+
+inline QString QDir::nameFilter() const
+{
+ return nameFilt;
+}
+
+inline QDir::FilterSpec QDir::filter() const
+{
+ return filtS;
+}
+
+inline QDir::SortSpec QDir::sorting() const
+{
+ return sortS;
+}
+
+inline bool QDir::matchAllDirs() const
+{
+ return allDirs;
+}
+
+inline bool QDir::operator!=( const QDir &d ) const
+{
+ return !(*this == d);
+}
+
+
+struct QDirSortItem {
+ QString filename_cache;
+ QFileInfo* item;
+};
+
+#endif // QT_NO_DIR
+#endif // QDIR_H
diff --git a/qtools/qdir_unix.cpp b/qtools/qdir_unix.cpp
new file mode 100644
index 0000000..46a3b69
--- /dev/null
+++ b/qtools/qdir_unix.cpp
@@ -0,0 +1,288 @@
+/****************************************************************************
+**
+**
+** Implementation of QDirclass
+**
+** Created : 950628
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses for Unix/X11 or for Qt/Embedded may use this file in accordance
+** with the Qt Commercial License Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglobal.h"
+
+#include "qdir.h"
+#ifndef QT_NO_DIR
+
+#include "qfileinfo.h"
+#include "qfiledefs_p.h"
+#include "qregexp.h"
+#include "qstringlist.h"
+#include <stdlib.h>
+#include <ctype.h>
+
+extern QStringList qt_makeFilterList( const QString &filter );
+
+extern int qt_cmp_si_sortSpec;
+
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+extern int qt_cmp_si( const void *, const void * );
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+
+void QDir::slashify( QString& )
+{
+}
+
+QString QDir::homeDirPath()
+{
+ QString d;
+ d = QFile::decodeName(getenv("HOME"));
+ slashify( d );
+ if ( d.isNull() )
+ d = rootDirPath();
+ return d;
+}
+
+QString QDir::canonicalPath() const
+{
+ QString r;
+
+ char cur[PATH_MAX];
+ char tmp[PATH_MAX];
+ GETCWD( cur, PATH_MAX );
+ if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) {
+ GETCWD( tmp, PATH_MAX );
+ r = QFile::decodeName(tmp);
+ }
+ CHDIR( cur );
+
+ slashify( r );
+ return r;
+}
+
+bool QDir::mkdir( const QString &dirName, bool acceptAbsPath ) const
+{
+ return MKDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)), 0777 )
+ == 0;
+}
+
+bool QDir::rmdir( const QString &dirName, bool acceptAbsPath ) const
+{
+ return RMDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)) ) == 0;
+}
+
+bool QDir::isReadable() const
+{
+ return ACCESS( QFile::encodeName(dPath), R_OK | X_OK ) == 0;
+}
+
+bool QDir::isRoot() const
+{
+ return dPath == QString::fromLatin1("/");
+}
+
+bool QDir::rename( const QString &name, const QString &newName,
+ bool acceptAbsPaths )
+{
+ if ( name.isEmpty() || newName.isEmpty() ) {
+#if defined(CHECK_NULL)
+ qWarning( "QDir::rename: Empty or null file name(s)" );
+#endif
+ return FALSE;
+ }
+ QString fn1 = filePath( name, acceptAbsPaths );
+ QString fn2 = filePath( newName, acceptAbsPaths );
+ return ::rename( QFile::encodeName(fn1),
+ QFile::encodeName(fn2) ) == 0;
+}
+
+bool QDir::setCurrent( const QString &path )
+{
+ int r;
+ r = CHDIR( QFile::encodeName(path) );
+ return r >= 0;
+}
+
+QString QDir::currentDirPath()
+{
+ QString result;
+
+ STATBUF st;
+ if ( STAT( ".", &st ) == 0 ) {
+ char currentName[PATH_MAX];
+ if ( GETCWD( currentName, PATH_MAX ) != 0 )
+ result = QFile::decodeName(currentName);
+#if defined(DEBUG)
+ if ( result.isNull() )
+ qWarning( "QDir::currentDirPath: getcwd() failed" );
+#endif
+ } else {
+#if defined(DEBUG)
+ qWarning( "QDir::currentDirPath: stat(\".\") failed" );
+#endif
+ }
+ slashify( result );
+ return result;
+}
+
+QString QDir::rootDirPath()
+{
+ QString d = QString::fromLatin1( "/" );
+ return d;
+}
+
+bool QDir::isRelativePath( const QString &path )
+{
+ int len = path.length();
+ if ( len == 0 )
+ return TRUE;
+ return path[0] != '/';
+}
+
+bool QDir::readDirEntries( const QString &nameFilter,
+ int filterSpec, int sortSpec )
+{
+ int i;
+ if ( !fList ) {
+ fList = new QStringList;
+ CHECK_PTR( fList );
+ fiList = new QFileInfoList;
+ CHECK_PTR( fiList );
+ fiList->setAutoDelete( TRUE );
+ } else {
+ fList->clear();
+ fiList->clear();
+ }
+
+ QStringList filters = qt_makeFilterList( nameFilter );
+
+ bool doDirs = (filterSpec & Dirs) != 0;
+ bool doFiles = (filterSpec & Files) != 0;
+ bool noSymLinks = (filterSpec & NoSymLinks) != 0;
+ bool doReadable = (filterSpec & Readable) != 0;
+ bool doWritable = (filterSpec & Writable) != 0;
+ bool doExecable = (filterSpec & Executable) != 0;
+ bool doHidden = (filterSpec & Hidden) != 0;
+
+#if defined(_OS_OS2EMX_)
+ //QRegExp wc( nameFilter, FALSE, TRUE ); // wild card, case insensitive
+#else
+ //QRegExp wc( nameFilter, TRUE, TRUE ); // wild card, case sensitive
+#endif
+ QFileInfo fi;
+ DIR *dir;
+ dirent *file;
+
+ dir = opendir( QFile::encodeName(dPath) );
+ if ( !dir ) {
+#if defined(CHECK_NULL)
+ qWarning( "QDir::readDirEntries: Cannot read the directory: %s",
+ QFile::encodeName(dPath).data() );
+#endif
+ return FALSE;
+ }
+
+ while ( (file = readdir(dir)) ) {
+ QString fn = QFile::decodeName(file->d_name);
+ fi.setFile( *this, fn );
+ if ( !match( filters, fn ) && !(allDirs && fi.isDir()) )
+ continue;
+ if ( (doDirs && fi.isDir()) || (doFiles && fi.isFile()) ) {
+ if ( noSymLinks && fi.isSymLink() )
+ continue;
+ if ( (filterSpec & RWEMask) != 0 )
+ if ( (doReadable && !fi.isReadable()) ||
+ (doWritable && !fi.isWritable()) ||
+ (doExecable && !fi.isExecutable()) )
+ continue;
+ if ( !doHidden && fn[0] == '.' &&
+ fn != QString::fromLatin1(".")
+ && fn != QString::fromLatin1("..") )
+ continue;
+ fiList->append( new QFileInfo( fi ) );
+ }
+ }
+ if ( closedir(dir) != 0 ) {
+#if defined(CHECK_NULL)
+ qWarning( "QDir::readDirEntries: Cannot close the directory: %s",
+ dPath.local8Bit().data() );
+#endif
+ }
+
+ // Sort...
+ if(fiList->count()) {
+ QDirSortItem* si= new QDirSortItem[fiList->count()];
+ QFileInfo* itm;
+ i=0;
+ for (itm = fiList->first(); itm; itm = fiList->next())
+ si[i++].item = itm;
+ qt_cmp_si_sortSpec = sortSpec;
+ qsort( si, i, sizeof(si[0]), qt_cmp_si );
+ // put them back in the list
+ fiList->setAutoDelete( FALSE );
+ fiList->clear();
+ int j;
+ for ( j=0; j<i; j++ ) {
+ fiList->append( si[j].item );
+ fList->append( si[j].item->fileName() );
+ }
+ delete [] si;
+ fiList->setAutoDelete( TRUE );
+ }
+
+ if ( filterSpec == (FilterSpec)filtS && sortSpec == (SortSpec)sortS &&
+ nameFilter == nameFilt )
+ dirty = FALSE;
+ else
+ dirty = TRUE;
+ return TRUE;
+}
+
+const QFileInfoList * QDir::drives()
+{
+ // at most one instance of QFileInfoList is leaked, and this variable
+ // points to that list
+ static QFileInfoList * knownMemoryLeak = 0;
+
+ if ( !knownMemoryLeak ) {
+ knownMemoryLeak = new QFileInfoList;
+ // non-win32 versions both use just one root directory
+ knownMemoryLeak->append( new QFileInfo( rootDirPath() ) );
+ }
+
+ return knownMemoryLeak;
+}
+#endif //QT_NO_DIR
diff --git a/qtools/qdir_win32.cpp b/qtools/qdir_win32.cpp
new file mode 100644
index 0000000..f1515a1
--- /dev/null
+++ b/qtools/qdir_win32.cpp
@@ -0,0 +1,485 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Based on qdir_unix.cpp
+ *
+ * Copyright (C) 1992-2000 Trolltech AS.
+ */
+
+
+#include "qglobal.h"
+
+#include "qdir.h"
+#ifndef QT_NO_DIR
+
+
+#include "qfileinfo.h"
+#include "qfiledefs_p.h"
+#include "qregexp.h"
+#include "qstringlist.h"
+#include <stdlib.h>
+#include <ctype.h>
+#if defined(_OS_WIN32_)
+#if defined(_CC_BOOL_DEF_)
+#undef bool
+#include <windows.h>
+#define bool int
+#else
+#include <windows.h>
+#endif
+#endif
+#if defined(_OS_OS2EMX_)
+extern Q_UINT32 DosQueryCurrentDisk(Q_UINT32*,Q_UINT32*);
+#define NO_ERROR 0
+#endif
+
+extern QStringList qt_makeFilterList( const QString &filter );
+
+extern int qt_cmp_si_sortSpec;
+
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+extern int qt_cmp_si( const void *, const void * );
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+static QString p_getenv( QString name )
+{
+ DWORD len = GetEnvironmentVariableW( ( LPCWSTR ) qt_winTchar ( name, TRUE ), NULL, 0 );
+ if ( len == 0 )
+ return QString::null;
+ /* ansi: we allocate too much memory, but this shouldn't be the problem here ... */
+ LPWSTR buf = (LPWSTR)new WCHAR[ len ];
+ len = GetEnvironmentVariableW ( ( LPCWSTR ) qt_winTchar ( name, TRUE ), buf, len );
+ if ( len == 0 )
+ {
+ delete[] buf;
+ return QString::null;
+ }
+ QString ret = qt_winQString ( buf );
+ delete[] buf;
+ return ret;
+}
+
+
+void QDir::slashify( QString& n )
+{
+ for ( int i=0; i<(int)n.length(); i++ )
+ {
+ if ( n[i] == '\\' )
+ n[i] = '/';
+ }
+}
+
+QString QDir::homeDirPath()
+{
+ QString d = p_getenv ( "HOME" );
+ if ( d.isNull () ) {
+ d = p_getenv ( "USERPROFILE" );
+ if ( d.isNull () ) {
+ QString homeDrive = p_getenv ( "HOMEDRIVE" );
+ QString homePath = p_getenv ( "HOMEPATH" );
+ if ( !homeDrive.isNull () && !homePath.isNull () ) {
+ d = homeDrive + homePath;
+ } else {
+ d = rootDirPath ();
+ }
+ }
+ }
+ slashify( d );
+ return d;
+}
+
+QString QDir::canonicalPath() const
+{
+ QString r;
+
+ char cur[PATH_MAX];
+ char tmp[PATH_MAX];
+ GETCWD( cur, PATH_MAX );
+ if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) {
+ GETCWD( tmp, PATH_MAX );
+ r = QFile::decodeName(tmp);
+ }
+ CHDIR( cur );
+
+ slashify( r );
+ return r;
+}
+
+bool QDir::mkdir( const QString &dirName, bool acceptAbsPath ) const
+{
+#if defined(__CYGWIN32_)
+ return MKDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)), 0777 ) == 0;
+#else
+ return _wmkdir( ( LPCWSTR ) filePath( dirName, acceptAbsPath ).ucs2() ) == 0;
+#endif
+}
+
+bool QDir::rmdir( const QString &dirName, bool acceptAbsPath ) const
+{
+#if defined(__CYGWIN32_)
+ return RMDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)) ) == 0;
+#else
+ return _wrmdir( ( LPCWSTR ) filePath( dirName, acceptAbsPath ).ucs2() ) == 0;
+#endif
+}
+
+bool QDir::isReadable() const
+{
+ QString path = dPath;
+ if ( ( path[ 0 ] == '\\' ) || ( path[ 0 ] == '/' ) )
+ path = rootDirPath() + path;
+#if defined(__CYGWIN32_)
+ return ACCESS( QFile::encodeName(dPath), R_OK ) == 0;
+#else
+ return ( _waccess( (wchar_t*) path.ucs2(), R_OK ) == 0 );
+#endif
+}
+
+bool QDir::isRoot() const
+{
+ QString path = dPath;
+ slashify( path );
+ return path == rootDirPath ();
+}
+
+bool QDir::rename( const QString &name, const QString &newName,
+ bool acceptAbsPaths )
+{
+ if ( name.isEmpty() || newName.isEmpty() ) {
+#if defined(CHECK_NULL)
+ qWarning( "QDir::rename: Empty or null file name(s)" );
+#endif
+ return FALSE;
+ }
+ QString fn1 = filePath( name, acceptAbsPaths );
+ QString fn2 = filePath( newName, acceptAbsPaths );
+#if defined(__CYGWIN32_)
+ return ::rename( QFile::encodeName(fn1),
+ QFile::encodeName(fn2) ) == 0;
+#else
+ return MoveFileW( ( LPCWSTR ) fn1.ucs2(), ( LPCWSTR ) fn2.ucs2() ) != 0;
+#endif
+}
+
+bool QDir::setCurrent( const QString &path )
+{
+#if defined(__CYGWIN32_)
+ int r;
+ r = CHDIR( QFile::encodeName(path) );
+ return r >= 0;
+#else
+ if ( !QDir( path ).exists() )
+ return false;
+ return ( SetCurrentDirectoryW( ( LPCWSTR ) path.ucs2() ) >= 0 );
+#endif
+}
+
+QString QDir::currentDirPath()
+{
+ QString result;
+
+#if defined(__CYGWIN32_)
+
+ STATBUF st;
+ if ( STAT( ".", &st ) == 0 ) {
+ char currentName[PATH_MAX];
+ if ( GETCWD( currentName, PATH_MAX ) != 0 )
+ result = QFile::decodeName(currentName);
+#if defined(DEBUG)
+ if ( result.isNull() )
+ qWarning( "QDir::currentDirPath: getcwd() failed" );
+#endif
+ } else {
+#if defined(DEBUG)
+ qWarning( "QDir::currentDirPath: stat(\".\") failed" );
+#endif
+ }
+
+#else
+
+ DWORD size = 0;
+ WCHAR currentName[ PATH_MAX ];
+ size = ::GetCurrentDirectoryW( PATH_MAX, currentName );
+ if ( size != 0 ) {
+ if ( size > PATH_MAX ) {
+ WCHAR * newCurrentName = new WCHAR[ size ];
+ if ( ::GetCurrentDirectoryW( PATH_MAX, newCurrentName ) != 0 )
+ result = QString::fromUcs2( ( ushort* ) newCurrentName );
+ delete [] newCurrentName;
+ } else {
+ result = QString::fromUcs2( ( ushort* ) currentName );
+ }
+ }
+
+ if ( result.length() >= 2 && result[ 1 ] == ':' )
+ result[ 0 ] = result.at( 0 ).upper(); // Force uppercase drive letters.
+#endif
+ slashify( result );
+ return result;
+}
+
+QString QDir::rootDirPath()
+{
+ QString d = p_getenv ( "SystemDrive" );
+ if ( d.isNull () )
+ d = QString::fromLatin1( "c:" ); // not "c:\\" !
+ slashify ( d );
+ return d;
+}
+
+bool QDir::isRelativePath( const QString &path )
+{
+ if ( path.isEmpty() )
+ return TRUE;
+ int p = 0;
+ if ( path[ 0 ].isLetter() && path[ 1 ] == ':' )
+ p = 2; // we have checked the first 2.
+ return ( ( path[ p ] != '/' ) && ( path[ p ] != '\\' ) );
+}
+
+#undef IS_SUBDIR
+#undef IS_RDONLY
+#undef IS_ARCH
+#undef IS_HIDDEN
+#undef IS_SYSTEM
+#undef FF_GETFIRST
+#undef FF_GETNEXT
+#undef FF_ERROR
+
+#if defined(_OS_WIN32_)
+#define IS_SUBDIR FILE_ATTRIBUTE_DIRECTORY
+#define IS_RDONLY FILE_ATTRIBUTE_READONLY
+#define IS_ARCH FILE_ATTRIBUTE_ARCHIVE
+#define IS_HIDDEN FILE_ATTRIBUTE_HIDDEN
+#define IS_SYSTEM FILE_ATTRIBUTE_SYSTEM
+#define FF_GETFIRST FindFirstFile
+#define FF_GETNEXT FindNextFile
+#define FF_ERROR INVALID_HANDLE_VALUE
+#else
+#define IS_SUBDIR _A_SUBDIR
+#define IS_RDONLY _A_RDONLY
+#define IS_ARCH _A_ARCH
+#define IS_HIDDEN _A_HIDDEN
+#define IS_SYSTEM _A_SYSTEM
+#define FF_GETFIRST _findfirst
+#define FF_GETNEXT _findnext
+#define FF_ERROR -1
+#endif
+
+
+bool QDir::readDirEntries( const QString &nameFilter,
+ int filterSpec, int sortSpec )
+{
+ int i;
+ if ( !fList ) {
+ fList = new QStringList;
+ CHECK_PTR( fList );
+ fiList = new QFileInfoList;
+ CHECK_PTR( fiList );
+ fiList->setAutoDelete( TRUE );
+ } else {
+ fList->clear();
+ fiList->clear();
+ }
+
+ QStringList filters = qt_makeFilterList( nameFilter );
+
+ bool doDirs = (filterSpec & Dirs) != 0;
+ bool doFiles = (filterSpec & Files) != 0;
+ bool noSymLinks = (filterSpec & NoSymLinks) != 0;
+ bool doReadable = (filterSpec & Readable) != 0;
+ bool doWritable = (filterSpec & Writable) != 0;
+ bool doExecable = (filterSpec & Executable) != 0;
+ bool doHidden = (filterSpec & Hidden) != 0;
+ // show hidden files if the user asks explicitly for e.g. .*
+ if ( !doHidden && !nameFilter.isEmpty() && nameFilter[0] == '.' )
+ doHidden = TRUE;
+ bool doModified = (filterSpec & Modified) != 0;
+ bool doSystem = (filterSpec & System) != 0;
+
+ QRegExp wc( nameFilter.data(), FALSE, TRUE ); // wild card, case insensitive
+ bool first = TRUE;
+ QString p = dPath.copy();
+ int plen = p.length();
+#if defined(_OS_WIN32_)
+ HANDLE ff;
+ WIN32_FIND_DATAW finfo;
+#else
+ long ff;
+ _finddata_t finfo;
+#endif
+ QFileInfo fi;
+ if ( plen == 0 )
+ {
+#if defined(CHECK_NULL)
+ warning( "QDir::readDirEntries: No directory name specified" );
+#endif
+ return FALSE;
+ }
+ if ( p.at(plen-1) != '/' && p.at(plen-1) != '\\' )
+ p += '/';
+ p += "*.*";
+
+#if defined(__CYGWIN32_)
+ ff = FF_GETFIRST( p.data(), &finfo );
+#else
+ ff = FindFirstFileW ( ( LPCWSTR ) p.ucs2(), &finfo );
+#endif
+ if ( ff == FF_ERROR )
+ {
+#if defined(DEBUG)
+ warning( "QDir::readDirEntries: Cannot read the directory: %s",
+ (const char *)dPath );
+#endif
+ return FALSE;
+ }
+
+ while ( TRUE )
+ {
+ if ( first )
+ first = FALSE;
+ else
+ {
+#if defined(__CYGWIN32_)
+ if ( FF_GETNEXT(ff,&finfo) == -1 )
+ break;
+#else
+ //if ( !FF_GETNEXT(ff,&finfo) )
+ // break;
+ if (!FindNextFileW(ff, &finfo ))
+ break;
+#endif
+ }
+#if defined(__CYGWIN32_)
+ int attrib = finfo.attrib;
+#else
+ int attrib = finfo.dwFileAttributes;
+#endif
+ bool isDir = (attrib & IS_SUBDIR) != 0;
+ bool isFile = !isDir;
+ bool isSymLink = FALSE;
+ bool isReadable = TRUE;
+ bool isWritable = (attrib & IS_RDONLY) == 0;
+ bool isExecable = FALSE;
+ bool isModified = (attrib & IS_ARCH) != 0;
+ bool isHidden = (attrib & IS_HIDDEN) != 0;
+ bool isSystem = (attrib & IS_SYSTEM) != 0;
+
+#if defined(__CYGWIN32_)
+ const char *fname = finfo.name;
+#else
+ //const char *fname = finfo.cFileName;
+ QString fname = QString::fromUcs2( ( const unsigned short* ) finfo.cFileName);
+#endif
+ if ( wc.match(fname.utf8()) == -1 && !(allDirs && isDir) )
+ continue;
+
+ QString name = fname;
+ if ( doExecable )
+ {
+ QString ext = name.right(4).lower();
+ if ( ext == ".exe" || ext == ".com" || ext == ".bat" ||
+ ext == ".pif" || ext == ".cmd" )
+ isExecable = TRUE;
+ }
+
+ if ( (doDirs && isDir) || (doFiles && isFile) )
+ {
+ if ( noSymLinks && isSymLink )
+ continue;
+ if ( (filterSpec & RWEMask) != 0 )
+ if ( (doReadable && !isReadable) ||
+ (doWritable && !isWritable) ||
+ (doExecable && !isExecable) )
+ continue;
+ if ( doModified && !isModified )
+ continue;
+ if ( !doHidden && isHidden )
+ continue;
+ if ( !doSystem && isSystem )
+ continue;
+ fi.setFile( *this, name );
+ fiList->append( new QFileInfo( fi ) );
+ }
+ }
+#if defined(__CYGWIN32_)
+ _findclose( ff );
+#else
+ FindClose( ff );
+#endif
+
+ // Sort...
+ QDirSortItem* si= new QDirSortItem[fiList->count()];
+ QFileInfo* itm;
+ i=0;
+ for (itm = fiList->first(); itm; itm = fiList->next())
+ si[i++].item = itm;
+ qt_cmp_si_sortSpec = sortSpec;
+ qsort( si, i, sizeof(si[0]), qt_cmp_si );
+ // put them back in the list
+ fiList->setAutoDelete( FALSE );
+ fiList->clear();
+ int j;
+ for ( j=0; j<i; j++ ) {
+ fiList->append( si[j].item );
+ fList->append( si[j].item->fileName() );
+ }
+ delete [] si;
+ fiList->setAutoDelete( TRUE );
+
+ if ( filterSpec == (FilterSpec)filtS && sortSpec == (SortSpec)sortS &&
+ nameFilter == nameFilt )
+ dirty = FALSE;
+ else
+ dirty = TRUE;
+ return TRUE;
+}
+
+const QFileInfoList * QDir::drives()
+{
+ // at most one instance of QFileInfoList is leaked, and this variable
+ // points to that list
+ static QFileInfoList * knownMemoryLeak = 0;
+
+ if ( !knownMemoryLeak ) {
+ knownMemoryLeak = new QFileInfoList;
+
+#if defined(_OS_WIN32_)
+ Q_UINT32 driveBits = (Q_UINT32) GetLogicalDrives() & 0x3ffffff;
+#elif defined(_OS_OS2EMX_)
+ Q_UINT32 driveBits, cur;
+ if (DosQueryCurrentDisk(&cur,&driveBits) != NO_ERROR)
+ exit(1);
+ driveBits &= 0x3ffffff;
+#endif
+ char driveName[4];
+ qstrcpy( driveName, "a:/" );
+ while( driveBits ) {
+ if ( driveBits & 1 )
+ knownMemoryLeak->append( new QFileInfo( driveName ) );
+ driveName[0]++;
+ driveBits = driveBits >> 1;
+ }
+ }
+
+ return knownMemoryLeak;
+}
+#endif //QT_NO_DIR
diff --git a/qtools/qfeatures.h b/qtools/qfeatures.h
new file mode 100644
index 0000000..84fa715
--- /dev/null
+++ b/qtools/qfeatures.h
@@ -0,0 +1,978 @@
+/****************************************************************************
+**
+**
+** Global feature selection
+**
+** Created : 000417
+**
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QFEATURES_H
+#define QFEATURES_H
+
+/*! \page features....html
+ ...
+*/
+
+// Qt ships with a number of pre-defined configurations. If none suit
+// your needs, define QCONFIG_LOCAL and create a "qconfig-local.h" file.
+//
+// Note that disabling some features will produce a libqt that is not
+// compatible with other libqt builds. Such modifications are only
+// supported on Qt/Embedded where reducing the library size is important
+// and where the application-suite is often a fixed set.
+//
+#if defined(QCONFIG_LOCAL)
+#include <qconfig-local.h>
+#elif defined(QCONFIG_MINIMAL)
+#include <qconfig-minimal.h>
+#elif defined(QCONFIG_SMALL)
+#include <qconfig-small.h>
+#elif defined(QCONFIG_MEDIUM)
+#include <qconfig-medium.h>
+#elif defined(QCONFIG_LARGE)
+#include <qconfig-large.h>
+#else // everything...
+#include <qconfig.h>
+#endif
+
+
+// Data structures
+/*!
+ QStringList
+*/
+//#define QT_NO_STRINGLIST
+
+#if defined(QT_NO_IMAGE_SMOOTHSCALE)
+/*!
+ QIconSet
+*/
+# define QT_NO_ICONSET
+#endif
+
+// File I/O
+#if defined(QT_NO_STRINGLIST)
+ /*!
+ QDir
+ */
+# define QT_NO_DIR
+#endif
+
+/*!
+ Palettes
+*/
+//#define QT_NO_PALETTE
+
+/*!
+ QTextStream
+*/
+//#define QT_NO_TEXTSTREAM
+/*!
+ QDataStream
+*/
+//#define QT_NO_DATASTREAM
+
+/*!
+ Dynamic module linking
+*/
+//#define QT_NO_PLUGIN
+
+
+// Images
+/*!
+ BMP image I/O
+ <p>The Windows Bitmap (BMP) image format is common on MS-Windows.
+ <p>This is an uncompressed image format
+ offering few advantages over PNG or JPEG.
+*/
+#if defined(QT_NO_DATASTREAM)
+# define QT_NO_IMAGEIO_BMP
+#endif
+/*!
+ PPM image I/O
+ <p>The Portable PixMap (PPM) image format is common on Unix.
+ <p>This is an uncompressed image format
+ offering few advantages over PNG or JPEG.
+*/
+//#define QT_NO_IMAGEIO_PPM
+/*!
+ XBM image I/O
+ <p>The X11 BitMap (XBM) image format is common on X11.
+ <p>This is an uncompressed monochrome image format.
+ Qt uses this format for some internal images (eg. mouse cursors).
+*/
+//#define QT_NO_IMAGEIO_XBM
+/*!
+ XPM image I/O
+ <p>The X11 PixMap (XPM) image format is common on X11.
+ <p>This is an uncompressed image format.
+ XPM images have the small advantage that they can be trivially
+ included in source files as they are C code.
+ Qt uses this format for some internal images (eg. QMessageBox icons).
+*/
+#if defined(QT_NO_TEXTSTREAM)
+# define QT_NO_IMAGEIO_XPM
+#endif
+/*!
+ PNG image I/O
+ <p>The Portable Network Graphics (PNG) is a compressed image format.
+ <p>See <a href=http://www.libpng.org/pub/png/>The PNG Home Site</a> for
+ details of the format.
+*/
+//#define QT_NO_IMAGEIO_PNG
+/*!
+ MNG image I/O
+ <p>The Multiple-image Network Graphics (MNG) is a compressed animation format.
+ <p>See <a href=http://www.libpng.org/pub/mng/>The MNG Home Site</a> for
+ details of the format.
+*/
+//#define QT_NO_IMAGEIO_MNG
+/*!
+ JPEG image I/O
+ <p>The Joint Photographic Experts Group (JPEG) is a compressed lossy image format that gives high compression
+ for real-world and photo-realistic images.
+*/
+//#define QT_NO_IMAGEIO_JPEG
+
+/*!
+ Asynchronous I/O
+ <p>Allows push-driven data processing.
+*/
+//#define QT_NO_ASYNC_IO
+/*!
+ Asynchronous image I/O
+ <p>Allows push-driven images.
+*/
+//#define QT_NO_ASYNC_IMAGE_IO
+#if defined(QT_NO_ASYNC_IO) || defined(QT_NO_ASYNC_IMAGE_IO)
+ /*!
+ Animated images
+ <p>This includes animated GIFs.
+ <p><b>Note: this currently also requires <tt>QT_BUILTIN_GIF_READER</tt> to
+ be defined when building Qt.</b>
+ */
+# define QT_NO_MOVIE
+#endif
+
+// Fonts
+/*!
+ TrueType font files
+ <p>Scalable font format common on MS-Windows and becoming common on Unix.
+ <p>Only supported on Qt/Embedded.
+*/
+//#define QT_NO_TRUETYPE
+/*!
+ BDF font files
+ <p>The Bitmap Distribution Format (BDF) font file format, common
+ on Unix.
+ <p>Only supported on Qt/Embedded.
+*/
+#if defined(QT_NO_TEXTSTREAM) || defined(QT_NO_STRINGLIST)
+# define QT_NO_BDF
+#endif
+/*!
+ QFontDatabase
+*/
+#if defined(QT_NO_STRINGLIST)
+# define QT_NO_FONTDATABASE
+#endif
+
+// Internationalization
+
+/*!
+ QObject::tr()
+*/
+#if defined(QT_NO_DATASTREAM)
+# define QT_NO_TRANSLATION
+#endif
+
+/*!
+ QTextCodec class and subclasses
+*/
+//#define QT_NO_TEXTCODEC
+
+#if defined(QT_NO_TEXTCODEC)
+ /*!
+ QTextCodec classes
+ <p>This includes some large conversion tables.
+ */
+# define QT_NO_CODECS
+#endif
+#if defined(QT_LITE_UNICODE)
+ /*!
+ Unicode property tables
+ <p>These include some large tables.
+ */
+# define QT_NO_UNICODETABLES
+#endif
+
+/*!
+ MIME
+*/
+#if defined(QT_NO_DIR)
+# define QT_NO_MIME
+#endif
+#if defined(QT_NO_MIME) || defined(QT_NO_TEXTSTREAM) || defined(QT_NO_DRAWUTIL) || defined(QT_NO_IMAGE_SMOOTHSCALE)
+ /*!
+ RichText (HTML) display
+ */
+# define QT_NO_RICHTEXT
+#endif
+
+/*!
+ XML
+*/
+#if defined(QT_NO_STRINGLIST) || defined(QT_NO_TEXTSTREAM) || defined(QT_NO_TEXTCODEC)
+# define QT_NO_XML
+#endif
+
+/*!
+ Document Object Model
+*/
+#if defined(QT_NO_XML) || defined(QT_NO_MIME)
+# define QT_NO_DOM
+#endif
+
+// Sound
+/*!
+ Playing sounds
+*/
+//#define QT_NO_SOUND
+
+/*!
+ Properties
+*/
+#if defined(QT_NO_STRINGLIST) || defined(QT_NO_ICONSET)
+# define QT_NO_PROPERTIES
+#endif
+
+
+
+// Networking
+
+/*!
+ Network support
+*/
+//#define QT_NO_NETWORK
+
+#if defined(QT_NO_NETWORK) || defined(QT_NO_STRINGLIST) || defined(QT_NO_TEXTSTREAM)
+ /*!
+ DNS
+ */
+# define QT_NO_DNS
+#endif
+/*!
+ Network file access
+*/
+#if defined(QT_NO_NETWORK) || defined(QT_NO_DIR) || defined(QT_NO_STRINGLIST)
+# define QT_NO_NETWORKPROTOCOL
+#endif
+#if defined(QT_NO_NETWORKPROTOCOL) || defined(QT_NO_DNS)
+ /*!
+ FTP file access
+ */
+# define QT_NO_NETWORKPROTOCOL_FTP
+ /*!
+ HTTP file access
+ */
+# define QT_NO_NETWORKPROTOCOL_HTTP
+#endif
+
+/*!
+ External process invocation.
+*/
+//#define QT_NO_PROCESS
+
+
+// Qt/Embedded-specific
+
+#if defined(QT_NO_NETWORK)
+ /*!
+ Multi-process support.
+ */
+# define QT_NO_QWS_MULTIPROCESS
+#endif
+
+#if defined(QT_NO_QWS_MULTIPROCESS) || defined(QT_NO_DATASTREAM)
+ /*!
+ Palmtop Communication Protocol
+ */
+# define QT_NO_COP
+#endif
+
+/*!
+ Console keyboard support
+*/
+//#define QT_NO_QWS_KEYBOARD
+
+/*!
+ Visible cursor
+*/
+#if defined(QT_NO_CURSOR)
+# define QT_NO_QWS_CURSOR
+#endif
+
+/*!
+ Alpha-blended cursor
+*/
+//#define QT_NO_QWS_ALPHA_CURSOR
+/*!
+ Mach64 acceleration
+*/
+//#define QT_NO_QWS_MACH64
+/*!
+ Voodoo3 acceleration
+*/
+//#define QT_NO_QWS_VOODOO3
+/*!
+ Matrox MGA acceleration (Millennium/Millennium II/Mystique/G200/G400)
+*/
+//#define QT_NO_QWS_MATROX
+/*!
+ Virtual frame buffer
+*/
+
+//#define QT_NO_QWS_VFB
+/*!
+ Transformed frame buffer
+*/
+//#define QT_NO_QWS_TRANSFORMED
+#if defined(QT_NO_NETWORK)
+/*!
+ Remote frame buffer (VNC)
+*/
+# ifndef QT_NO_QWS_VNC
+# define QT_NO_QWS_VNC
+# endif
+#endif
+/*!
+ 1-bit monochrome
+*/
+//#define QT_NO_QWS_DEPTH_1
+/*!
+ 4-bit greyscale
+*/
+//#define QT_NO_QWS_DEPTH_4
+/*!
+ 4-bit VGA
+*/
+//#define QT_NO_QWS_VGA_16
+/*!
+ SVGALib Support
+ Not implemented yet
+*/
+#define QT_NO_QWS_SVGALIB
+/*!
+ 8-bit grayscale
+*/
+#define QT_NO_QWS_DEPTH_8GRAYSCALE
+/*!
+ 8-bit color
+*/
+//#define QT_NO_QWS_DEPTH_8
+/*!
+ 15 or 16-bit color (define QT_QWS_DEPTH16_RGB as 555 for 15-bit)
+*/
+//#define QT_NO_QWS_DEPTH_16
+/*!
+ 24-bit color
+*/
+//#define QT_NO_QWS_DEPTH_24
+/*!
+ 32-bit color
+*/
+//#define QT_NO_QWS_DEPTH_32
+
+/*!
+ Window Manager
+*/
+//#define QT_NO_QWS_MANAGER
+
+/*!
+ Window Manager Styles
+*/
+#define QT_NO_QWS_KDE2_WM_STYLE
+#if defined( QT_NO_QWS_MANAGER ) || defined( QT_NO_IMAGEIO_XPM )
+# define QT_NO_QWS_AQUA_WM_STYLE
+# define QT_NO_QWS_BEOS_WM_STYLE
+# define QT_NO_QWS_KDE_WM_STYLE
+# define QT_NO_QWS_QPE_WM_STYLE
+# define QT_NO_QWS_WINDOWS_WM_STYLE
+#endif
+
+/*!
+ Saving of fonts
+*/
+//#define QT_NO_QWS_SAVEFONTS
+
+/*!
+ Favour code size over graphics speed
+ <p>Smaller, slower code will be used for drawing operations.
+ <p>Only supported on Qt/Embedded.
+*/
+//#define QT_NO_QWS_GFX_SPEED
+
+/*!
+ Qt/Embedded window system properties.
+*/
+//#define QT_NO_QWS_PROPERTIES
+
+#if defined(QT_NO_QWS_PROPERTIES) || defined(QT_NO_MIME)
+ /*!
+ Cut and paste
+ */
+# define QT_NO_CLIPBOARD
+#endif
+
+#if defined(QT_NO_MIME) || defined(QT_NO_QWS_PROPERTIES)
+ /*!
+ Drag and drop
+ */
+# define QT_NO_DRAGANDDROP
+#endif
+
+#if defined(QT_NO_PROPERTIES)
+ /*!
+ SQL
+ */
+# define QT_NO_SQL
+#endif
+
+#if defined(QT_NO_CLIPBOARD) || defined(QT_NO_MIME) || defined(_WS_QWS_)
+ /*!
+ Cut and paste of complex data types (non-text)
+ Not yet implemented for QWS.
+ */
+# define QT_NO_MIMECLIPBOARD
+#endif
+
+
+/*!
+ Drawing utility functions
+*/
+//#define QT_NO_DRAWUTIL
+/*!
+ TrueColor QImage
+*/
+//#define QT_NO_IMAGE_TRUECOLOR
+/*!
+ Smooth QImage scaling
+*/
+//#define QT_NO_IMAGE_SMOOTHSCALE
+/*!
+ Image file text strings
+*/
+#if defined(QT_NO_STRINGLIST)
+# define QT_NO_IMAGE_TEXT
+#endif
+
+#if defined(QT_NO_IMAGE_TRUECOLOR)
+ /*!
+ 16-bit QImage
+ */
+# define QT_NO_IMAGE_16_BIT
+#endif
+/*!
+ Cursors
+*/
+//#define QT_NO_CURSOR
+
+// Painting
+/*!
+ Named colors
+*/
+//#define QT_NO_COLORNAMES
+/*!
+ Scaling and rotation
+*/
+//#define QT_NO_TRANSFORMATIONS
+
+/*!
+ Printing
+*/
+#if defined(QT_NO_TEXTSTREAM)
+# define QT_NO_PRINTER
+#endif
+
+/*!
+ QPicture
+*/
+#if defined(QT_NO_DATASTREAM)
+# define QT_NO_PICTURE
+#endif
+
+// Layout
+/*!
+ Automatic widget layout
+*/
+//#define QT_NO_LAYOUT
+
+// Widgets
+#if defined(QT_NO_DRAWUTIL) || defined(QT_NO_PALETTE)
+/*!
+ QStyle
+*/
+# define QT_NO_STYLE
+#endif
+
+
+/*!
+ Dialogs
+*/
+//#define QT_NO_DIALOG
+/*!
+ Semi-modal dialogs
+*/
+//#define QT_NO_SEMIMODAL
+/*!
+ Framed widgets
+*/
+//#define QT_NO_FRAME
+
+/*!
+ Special widget effects (fading, scrolling)
+*/
+//#define QT_NO_EFFECTS
+
+
+/*!
+ QLabel
+*/
+#ifdef QT_NO_FRAME
+# define QT_NO_LABEL
+#endif
+
+/*!
+ Toolbars
+*/
+#ifdef QT_NO_LAYOUT
+# define QT_NO_TOOLBAR
+#endif
+
+/*!
+ Buttons
+*/
+#if defined(QT_NO_BUTTON) || defined(QT_NO_STYLE)
+/*!
+ Check-boxes
+*/
+# define QT_NO_CHECKBOX
+/*!
+ Radio-buttons
+*/
+# define QT_NO_RADIOBUTTON
+#endif
+#if defined(QT_NO_BUTTON) || defined(QT_NO_TOOLBAR) || defined(QT_NO_ICONSET)
+/*!
+ Tool-buttons
+*/
+# define QT_NO_TOOLBUTTON
+#endif
+/*!
+ Grid layout widgets
+*/
+#ifdef QT_NO_FRAME
+# define QT_NO_GRID
+#endif
+/*!
+ Group boxes
+*/
+#ifdef QT_NO_FRAME
+# define QT_NO_GROUPBOX
+#endif
+#if defined(QT_NO_GROUPBOX)
+/*!
+ Button groups
+*/
+# define QT_NO_BUTTONGROUP
+/*!
+ Horizontal group boxes
+*/
+# define QT_NO_HGROUPBOX
+#endif
+#if defined(QT_NO_HGROUPBOX)
+/*!
+ Vertical group boxes
+*/
+# define QT_NO_VGROUPBOX
+#endif
+#if defined(QT_NO_BUTTONGROUP)
+/*!
+ Horizontal button groups
+*/
+# define QT_NO_HBUTTONGROUP
+#endif
+#if defined(QT_NO_HBUTTONGROUP)
+/*!
+ Vertical button groups
+*/
+# define QT_NO_VBUTTONGROUP
+#endif
+/*!
+ Horizonal box layout widgets
+*/
+#ifdef QT_NO_FRAME
+# define QT_NO_HBOX
+#endif
+#if defined(QT_NO_HBOX)
+/*!
+ Vertical box layout widgets
+*/
+# define QT_NO_VBOX
+#endif
+/*!
+ Single-line edits
+*/
+#if defined(QT_NO_PALETTE)
+# define QT_NO_LINEEDIT
+#endif
+#if defined(QT_NO_TOOLBAR)
+/*!
+ Main-windows
+*/
+# define QT_NO_MAINWINDOW
+#endif
+#if defined(QT_NO_ICONSET)
+/*!
+ Menu-like widgets
+*/
+# define QT_NO_MENUDATA
+#endif
+#if defined(QT_NO_MENUDATA)
+/*!
+ Popup-menus
+*/
+# define QT_NO_POPUPMENU
+/*!
+ Menu bars
+*/
+# define QT_NO_MENUBAR
+#endif
+#if defined(QT_NO_BUTTON) || defined(QT_NO_ICONSET) || defined(QT_NO_POPUPMENU)
+/*!
+ Push-buttons
+*/
+# define QT_NO_PUSHBUTTON
+#endif
+/*!
+ Progress bars
+*/
+#ifdef QT_NO_FRAME
+# define QT_NO_PROGRESSBAR
+#endif
+/*!
+ Range-control widgets
+*/
+//#define QT_NO_RANGECONTROL
+#if defined(QT_NO_RANGECONTROL) || defined(QT_NO_STYLE)
+/*!
+ Scroll bars
+*/
+# define QT_NO_SCROLLBAR
+/*!
+ Sliders
+*/
+# define QT_NO_SLIDER
+/*!
+ Spin boxes
+*/
+# define QT_NO_SPINBOX
+/*!
+ Dials
+*/
+# define QT_NO_DIAL
+#endif
+
+
+#if defined(QT_NO_SCROLLBAR) || defined(QT_NO_FRAME)
+/*!
+ Scrollable view widgets
+*/
+# define QT_NO_SCROLLVIEW
+#endif
+#if defined(QT_NO_SCROLLVIEW)
+/*!
+ QCanvas
+*/
+# define QT_NO_CANVAS
+/*!
+ QIconView
+*/
+# define QT_NO_ICONVIEW
+#endif
+
+#if defined(QT_NO_SCROLLBAR)
+/*!
+ Table-like widgets
+*/
+# define QT_NO_TABLEVIEW
+#endif
+#if defined(QT_NO_TABLEVIEW)
+/*!
+ Multi-line edits
+*/
+# define QT_NO_MULTILINEEDIT
+#endif
+
+/*!
+ Splitters
+*/
+#ifdef QT_NO_FRAME
+# define QT_NO_SPLITTER
+#endif
+/*!
+ Status bars
+*/
+#ifdef QT_NO_LAYOUT
+# define QT_NO_STATUSBAR
+#endif
+/*!
+ Tab-bars
+*/
+#if defined(QT_NO_ICONSET)
+# define QT_NO_TABBAR
+#endif
+#if defined(QT_NO_TABBAR)
+/*!
+ Tab widgets
+*/
+# define QT_NO_TABWIDGET
+#endif
+/*!
+ Tool tips
+*/
+#if defined( QT_NO_LABEL ) || defined( QT_NO_PALETTE )
+# define QT_NO_TOOLTIP
+#endif
+/*!
+ Input validators
+*/
+//#define QT_NO_VALIDATOR
+/*!
+ "What's this" help
+*/
+#if defined( QT_NO_TOOLTIP )
+# define QT_NO_WHATSTHIS
+#endif
+/*!
+ Widget stacks
+*/
+#ifdef QT_NO_FRAME
+# define QT_NO_WIDGETSTACK
+#endif
+
+#if defined(QT_NO_RICHTEXT) || defined(QT_NO_SCROLLVIEW)
+ /*!
+ QTextView
+ */
+# define QT_NO_TEXTVIEW
+#endif
+
+#if defined(QT_NO_TEXTVIEW)
+ /*!
+ QTextBrowser
+ */
+# define QT_NO_TEXTBROWSER
+#endif
+
+#if defined(QT_NO_STYLE)
+ /*!
+ Windows style
+ */
+# define QT_NO_STYLE_WINDOWS
+ /*!
+ Motif style
+ */
+# define QT_NO_STYLE_MOTIF
+#endif
+
+#if defined(QT_NO_STYLE_MOTIF)
+ /*!
+ Motif-plus style
+ */
+# define QT_NO_STYLE_MOTIFPLUS
+#endif
+
+
+#if defined(QT_NO_SCROLLVIEW) || defined(QT_NO_STRINGLIST)
+ /*!
+ QListBox
+ */
+# define QT_NO_LISTBOX
+#endif
+
+/*!
+ QAccel
+*/
+//#define QT_NO_ACCEL
+
+/*!
+ QSizeGrip
+*/
+#ifdef QT_NO_PALETTE
+# define QT_NO_SIZEGRIP
+#endif
+/*!
+ QHeader
+*/
+#ifdef QT_NO_ICONSET
+# define QT_NO_HEADER
+#endif
+/*!
+ QWorkSpace
+*/
+#ifdef QT_NO_FRAME
+# define QT_NO_WORKSPACE
+#endif
+/*!
+ QLCDNumber
+*/
+#ifdef QT_NO_FRAME
+# define QT_NO_LCDNUMBER
+#endif
+/*!
+ QAction
+*/
+//#define QT_NO_ACTION
+
+#if defined(QT_NO_HEADER)
+ /*!
+ QTable
+ */
+# define QT_NO_TABLE
+#endif
+
+#if defined(QT_NO_LISTBOX)
+ /*!
+ QComboBox
+ */
+# define QT_NO_COMBOBOX
+#endif
+
+#if defined(QT_NO_HEADER) || defined(QT_NO_SCROLLVIEW)
+ /*!
+ QListView
+ */
+# define QT_NO_LISTVIEW
+#endif
+
+#if defined(QT_NO_STYLE_WINDOWS)
+ /*!
+ Compact Windows style
+ */
+# define QT_NO_STYLE_COMPACT
+#endif
+
+#if defined(QT_NO_STYLE_MOTIF) || defined(QT_NO_TRANSFORMATIONS)
+ /*!
+ CDE style
+ */
+# define QT_NO_STYLE_CDE
+ /*!
+ SGI style
+ */
+# define QT_NO_STYLE_SGI
+#endif
+#if defined(QT_NO_STYLE_WINDOWS)
+ /*!
+ Platinum style
+ */
+# define QT_NO_STYLE_PLATINUM
+#endif
+
+/*!
+ QColorDialog
+*/
+#if defined(QT_NO_LAYOUT) || defined(QT_NO_LABEL) || defined(QT_NO_PUSHBUTTON) || defined(QT_NO_DIALOG)
+# define QT_NO_COLORDIALOG
+#endif
+#if defined(QT_NO_DIALOG)
+/*!
+ QMessageBox
+*/
+# define QT_NO_MESSAGEBOX
+#endif
+#if defined(QT_NO_DIALOG) || defined(QT_NO_TABBAR)
+/*!
+ QTabDialog
+*/
+#define QT_NO_TABDIALOG
+#endif
+
+#if defined(QT_NO_DIALOG)
+/*!
+ QWizard
+*/
+# define QT_NO_WIZARD
+#endif
+
+#if defined(QT_NO_DIALOG) || defined(QT_NO_LISTVIEW) || defined(QT_NO_NETWORKPROTOCOL) || defined(QT_NO_COMBOBOX) || defined(QT_NO_DIR) || defined(QT_NO_MESSAGEBOX) || defined(QT_NO_SEMIMODAL)
+ /*!
+ QFileDialog
+ */
+# define QT_NO_FILEDIALOG
+#endif
+
+#if defined(QT_NO_DIALOG) || defined(QT_NO_FONTDATABASE) || defined(QT_NO_COMBOBOX)
+ /*!
+ QFontDialog
+ */
+# define QT_NO_FONTDIALOG
+#endif
+
+#if defined(QT_NO_DIALOG) || defined(QT_NO_LISTVIEW) || defined(QT_NO_PRINTER) || defined(QT_NO_COMBOBOX) || defined(QT_NO_DIR) || defined(QT_NO_LAYOUT) || defined(QT_NO_LABEL)
+ /*!
+ QPrintDialog
+ */
+# define QT_NO_PRINTDIALOG
+#endif
+
+#if defined(QT_NO_SEMIMODAL)
+ /*!
+ QProgressDialog
+ */
+# define QT_NO_PROGRESSDIALOG
+#endif
+#if defined(QT_NO_DIALOG) || defined(QT_NO_COMBOBOX)
+ /*!
+ QInputDialog
+ */
+# define QT_NO_INPUTDIALOG
+#endif
+
+#if defined(QT_NO_STRINGLIST)
+ /*!
+ Session management support
+ */
+# define QT_NO_SESSIONMANAGER
+#endif
+
+#endif // QFEATURES_H
diff --git a/qtools/qfile.cpp b/qtools/qfile.cpp
new file mode 100644
index 0000000..98ed9a3
--- /dev/null
+++ b/qtools/qfile.cpp
@@ -0,0 +1,550 @@
+/****************************************************************************
+**
+**
+** Implementation of QFile class
+**
+** Created : 930812
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglobal.h"
+#if defined(_OS_WIN32_)
+#ifdef UNICODE
+#ifndef _UNICODE
+#define _UNICODE
+#endif
+#endif
+#endif
+
+#include "qfile.h"
+#include "qfiledefs_p.h"
+
+extern bool qt_file_access( const QString& fn, int t );
+
+// NOT REVISED
+/*!
+ \class QFile qfile.h
+ \brief The QFile class is an I/O device that operates on files.
+
+ \ingroup io
+
+ QFile is an I/O device for reading and writing binary and text files. A
+ QFile may be used by itself (readBlock and writeBlock) or by more
+ conveniently using QDataStream or QTextStream.
+
+ Here is a code fragment that uses QTextStream to read a text
+ file line by line. It prints each line with a line number.
+ \code
+ QFile f("file.txt");
+ if ( f.open(IO_ReadOnly) ) { // file opened successfully
+ QTextStream t( &f ); // use a text stream
+ QString s;
+ int n = 1;
+ while ( !t.eof() ) { // until end of file...
+ s = t.readLine(); // line of text excluding '\n'
+ printf( "%3d: %s\n", n++, (const char *)s );
+ }
+ f.close();
+ }
+ \endcode
+
+ The QFileInfo class holds detailed information about a file, such as
+ access permissions, file dates and file types.
+
+ The QDir class manages directories and lists of file names.
+
+ \sa QDataStream, QTextStream
+*/
+
+
+/*!
+ Constructs a QFile with no name.
+*/
+
+QFile::QFile()
+{
+ init();
+}
+
+/*!
+ Constructs a QFile with a file name \e name.
+ \sa setName()
+*/
+
+QFile::QFile( const QString &name )
+ : fn(name)
+{
+ init();
+}
+
+
+/*!
+ Destructs a QFile. Calls close().
+*/
+
+QFile::~QFile()
+{
+ close();
+}
+
+
+/*!
+ \internal
+ Initialize internal data.
+*/
+
+void QFile::init()
+{
+ setFlags( IO_Direct );
+ setStatus( IO_Ok );
+ fh = 0;
+ fd = 0;
+ length = 0;
+ ioIndex = 0;
+ ext_f = FALSE; // not an external file handle
+}
+
+
+/*!
+ \fn QString QFile::name() const
+ Returns the name set by setName().
+ \sa setName(), QFileInfo::fileName()
+*/
+
+/*!
+ Sets the name of the file. The name can include an absolute directory
+ path or it can be a name or a path relative to the current directory.
+
+ Do not call this function if the file has already been opened.
+
+ Note that if the name is relative QFile does not associate it with the
+ current directory. If you change directory before calling open(), open
+ uses the new current directory.
+
+ Example:
+ \code
+ QFile f;
+ QDir::setCurrent( "/tmp" );
+ f.setName( "readme.txt" );
+ QDir::setCurrent( "/home" );
+ f.open( IO_ReadOnly ); // opens "/home/readme.txt" under UNIX
+ \endcode
+
+ Also note that the directory separator '/' works for all operating
+ systems supported by Qt.
+
+ \sa name(), QFileInfo, QDir
+*/
+
+void QFile::setName( const QString &name )
+{
+ if ( isOpen() ) {
+#if defined(CHECK_STATE)
+ qWarning( "QFile::setName: File is open" );
+#endif
+ close();
+ }
+ fn = name;
+}
+
+/*!
+ Returns TRUE if this file exists, otherwise FALSE.
+ \sa name()
+*/
+
+bool QFile::exists() const
+{
+ return qt_file_access( fn, F_OK );
+}
+
+/*!
+ Returns TRUE if the file given by \e fileName exists, otherwise FALSE.
+*/
+
+bool QFile::exists( const QString &fileName )
+{
+ return qt_file_access( fileName, F_OK );
+}
+
+
+/*!
+ Removes the file specified by the file name currently set.
+ Returns TRUE if successful, otherwise FALSE.
+
+ The file is closed before it is removed.
+*/
+
+bool QFile::remove()
+{
+ close();
+ return remove( fn );
+}
+
+#if defined(_OS_MAC_) || defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_) || defined(_OS_CYGWIN_)
+# define HAS_TEXT_FILEMODE // has translate/text filemode
+#endif
+#if defined(O_NONBLOCK)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NONBLOCK
+#elif defined(O_NDELAY)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NDELAY
+#endif
+
+/*!
+ Flushes the file buffer to the disk.
+
+ close() also flushes the file buffer.
+*/
+
+void QFile::flush()
+{
+ if ( isOpen() && fh ) // can only flush open/buffered
+ fflush( fh ); // file
+}
+
+/*!
+ Returns TRUE if the end of file has been reached, otherwise FALSE.
+ \sa size()
+*/
+
+bool QFile::atEnd() const
+{
+ if ( !isOpen() ) {
+#if defined(CHECK_STATE)
+ qWarning( "QFile::atEnd: File is not open" );
+#endif
+ return FALSE;
+ }
+ if ( isDirectAccess() && !isTranslated() ) {
+ if ( at() < length )
+ return FALSE;
+ }
+ return QIODevice::atEnd();
+}
+
+/*!
+ Reads a line of text.
+
+ Reads bytes from the file until end-of-line is reached, or up to \a
+ maxlen bytes, and returns the number of bytes read, or -1 in case of
+ error. The terminating newline is not stripped.
+
+ This function is efficient only for buffered files. Avoid
+ readLine() for files that have been opened with the \c IO_Raw
+ flag.
+
+ \sa readBlock(), QTextStream::readLine()
+*/
+
+int QFile::readLine( char *p, uint maxlen )
+{
+ if ( maxlen == 0 ) // application bug?
+ return 0;
+#if defined(CHECK_STATE)
+ CHECK_PTR( p );
+ if ( !isOpen() ) { // file not open
+ qWarning( "QFile::readLine: File not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QFile::readLine: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ int nread; // number of bytes read
+ if ( isRaw() ) { // raw file
+ nread = QIODevice::readLine( p, maxlen );
+ } else { // buffered file
+ p = fgets( p, maxlen, fh );
+ if ( p ) {
+ nread = qstrlen( p );
+ ioIndex += nread;
+ } else {
+ nread = -1;
+ setStatus(IO_ReadError);
+ }
+ }
+ return nread;
+}
+
+
+/*!
+ Reads a line of text.
+
+ Reads bytes from the file until end-of-line is reached, or up to \a
+ maxlen bytes, and returns the number of bytes read, or -1 in case of
+ error. The terminating newline is not stripped.
+
+ This function is efficient only for buffered files. Avoid
+ readLine() for files that have been opened with the \c IO_Raw
+ flag.
+
+ Note that the string is read as plain Latin1 bytes, not Unicode.
+
+ \sa readBlock(), QTextStream::readLine()
+*/
+
+int QFile::readLine( QString& s, uint maxlen )
+{
+ QByteArray ba(maxlen);
+ int l = readLine(ba.data(),maxlen);
+ if ( l >= 0 ) {
+ ba.truncate(l);
+ s = QString(ba);
+ }
+ return l;
+}
+
+
+/*!
+ Reads a single byte/character from the file.
+
+ Returns the byte/character read, or -1 if the end of the file has been
+ reached.
+
+ \sa putch(), ungetch()
+*/
+
+int QFile::getch()
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // file not open
+ qWarning( "QFile::getch: File not open" );
+ return EOF;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QFile::getch: Read operation not permitted" );
+ return EOF;
+ }
+#endif
+
+ int ch;
+
+ if ( !ungetchBuffer.isEmpty() ) {
+ int len = ungetchBuffer.length();
+ ch = ungetchBuffer[ len-1 ];
+ ungetchBuffer.truncate( len - 1 );
+ return ch;
+ }
+
+ if ( isRaw() ) { // raw file (inefficient)
+ char buf[1];
+ ch = readBlock( buf, 1 ) == 1 ? buf[0] : EOF;
+ } else { // buffered file
+ if ( (ch = getc( fh )) != EOF )
+ ioIndex++;
+ else
+ setStatus(IO_ReadError);
+ }
+ return ch;
+}
+
+/*!
+ \fn int QFile::writeBlock( const QByteArray& data )
+ \reimp
+ \internal
+ Should be removed in 3.0
+*/
+
+/*!
+ Writes the character \e ch to the file.
+
+ Returns \e ch, or -1 if some error occurred.
+
+ \sa getch(), ungetch()
+*/
+
+int QFile::putch( int ch )
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // file not open
+ qWarning( "QFile::putch: File not open" );
+ return EOF;
+ }
+ if ( !isWritable() ) { // writing not permitted
+ qWarning( "QFile::putch: Write operation not permitted" );
+ return EOF;
+ }
+#endif
+ if ( isRaw() ) { // raw file (inefficient)
+ char buf[1];
+ buf[0] = ch;
+ ch = writeBlock( buf, 1 ) == 1 ? ch : EOF;
+ } else { // buffered file
+ if ( (ch = putc( ch, fh )) != EOF ) {
+ ioIndex++;
+ if ( ioIndex > length ) // update file length
+ length = ioIndex;
+ } else {
+ setStatus(IO_WriteError);
+ }
+ }
+ return ch;
+}
+
+/*!
+ Puts the character \e ch back into the file and decrements the index if it
+ is not zero.
+
+ This function is normally called to "undo" a getch() operation.
+
+ Returns \e ch, or -1 if some error occurred.
+
+ \sa getch(), putch()
+*/
+
+int QFile::ungetch( int ch )
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // file not open
+ qWarning( "QFile::ungetch: File not open" );
+ return EOF;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QFile::ungetch: Read operation not permitted" );
+ return EOF;
+ }
+#endif
+ if ( ch == EOF ) // cannot unget EOF
+ return ch;
+
+ if ( isSequentialAccess() && !fh) {
+ // pipe or similar => we cannot ungetch, so do it manually
+ ungetchBuffer +=ch;
+ return ch;
+ }
+
+ if ( isRaw() ) { // raw file (very inefficient)
+ char buf[1];
+ at( ioIndex-1 );
+ buf[0] = ch;
+ if ( writeBlock(buf, 1) == 1 )
+ at ( ioIndex-1 );
+ else
+ ch = EOF;
+ } else { // buffered file
+ if ( (ch = ungetc(ch, fh)) != EOF )
+ ioIndex--;
+ else
+ setStatus( IO_ReadError );
+ }
+ return ch;
+}
+
+
+static QCString locale_encoder( const QString &fileName )
+{
+ return fileName.local8Bit();
+}
+
+
+static QFile::EncoderFn encoder = locale_encoder;
+
+/*!
+ When you use QFile, QFileInfo, and QDir to access the filesystem
+ with Qt, you can use Unicode filenames. On Unix, these filenames
+ are converted to an 8-bit encoding. If you want to do your own
+ file I/O on Unix, you should convert the filename using this
+ function. On Windows NT, Unicode filenames are supported directly
+ in the filesystem and this function should be avoided. On Windows 95,
+ non-Latin1 locales are not supported at this time.
+
+ By default, this function converts to the local 8-bit encoding
+ determined by the user's locale. This is sufficient for
+ filenames that the user chooses. Filenames hard-coded into the
+ application should only use 7-bit ASCII filename characters.
+
+ The conversion scheme can be changed using setEncodingFunction().
+ This might be useful if you wish to give the user an option to
+ store in filenames in UTF-8, etc., but beware that such filenames
+ would probably then be unrecognizable when seen by other programs.
+
+ \sa decodeName()
+*/
+
+QCString QFile::encodeName( const QString &fileName )
+{
+ return (*encoder)(fileName);
+}
+
+/*!
+ \enum QFile::EncoderFn
+
+ This is used by QFile::setEncodingFunction().
+*/
+
+/*!
+ Sets the function for encoding Unicode filenames.
+ The default encodes in the locale-specific 8-bit encoding.
+
+ \sa encodeName()
+*/
+void QFile::setEncodingFunction( EncoderFn f )
+{
+ encoder = f;
+}
+
+static
+QString locale_decoder( const QCString &localFileName )
+{
+ return QString::fromLocal8Bit(localFileName);
+}
+
+static QFile::DecoderFn decoder = locale_decoder;
+
+/*!
+ This does the reverse of QFile::encodeName().
+
+ \sa setDecodingFunction()
+*/
+QString QFile::decodeName( const QCString &localFileName )
+{
+ return (*decoder)(localFileName);
+}
+
+/*!
+ \enum QFile::DecoderFn
+
+ This is used by QFile::setDecodingFunction().
+*/
+
+/*!
+ Sets the function for decoding 8-bit filenames.
+ The default uses the locale-specific 8-bit encoding.
+
+ \sa encodeName(), decodeName()
+*/
+
+void QFile::setDecodingFunction( DecoderFn f )
+{
+ decoder = f;
+}
diff --git a/qtools/qfile.h b/qtools/qfile.h
new file mode 100644
index 0000000..a447d2f
--- /dev/null
+++ b/qtools/qfile.h
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+**
+** Definition of QFile class
+**
+** Created : 930831
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QFILE_H
+#define QFILE_H
+
+#ifndef QT_H
+#include "qiodevice.h"
+#include "qstring.h"
+#include <stdio.h>
+#endif // QT_H
+
+class QDir;
+
+
+class Q_EXPORT QFile : public QIODevice // file I/O device class
+{
+public:
+ QFile();
+ QFile( const QString &name );
+ virtual ~QFile();
+
+ QString name() const;
+ void setName( const QString &name );
+
+ typedef QCString (*EncoderFn)( const QString &fileName );
+ typedef QString (*DecoderFn)( const QCString &localfileName );
+ static QCString encodeName( const QString &fileName );
+ static QString decodeName( const QCString &localFileName );
+ static void setEncodingFunction( EncoderFn );
+ static void setDecodingFunction( DecoderFn );
+
+ bool exists() const;
+ static bool exists( const QString &fileName );
+
+ bool remove();
+ static bool remove( const QString &fileName );
+
+ bool open( int );
+ bool open( int, FILE * );
+ bool open( int, int );
+ void close();
+ void flush();
+
+ uint size() const;
+ int at() const;
+ bool at( int );
+ bool atEnd() const;
+
+ int readBlock( char *data, uint len );
+ int writeBlock( const char *data, uint len );
+ int writeBlock( const QByteArray& data )
+ { return QIODevice::writeBlock(data); }
+ int readLine( char *data, uint maxlen );
+ int readLine( QString &, uint maxlen );
+
+ int getch();
+ int putch( int );
+ int ungetch( int );
+
+ int handle() const;
+
+ int64 pos() const;
+ int64 toEnd();
+ bool seek(int64 pos);
+
+protected:
+ QString fn;
+ FILE *fh;
+ int fd;
+ int length;
+ bool ext_f;
+ void * d;
+
+private:
+ void init();
+ QCString ungetchBuffer;
+
+private: // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+ QFile( const QFile & );
+ QFile &operator=( const QFile & );
+#endif
+};
+
+
+inline QString QFile::name() const
+{ return fn; }
+
+inline int QFile::at() const
+{ return ioIndex; }
+
+
+#endif // QFILE_H
diff --git a/qtools/qfile_unix.cpp b/qtools/qfile_unix.cpp
new file mode 100644
index 0000000..fa53d13
--- /dev/null
+++ b/qtools/qfile_unix.cpp
@@ -0,0 +1,668 @@
+/****************************************************************************
+**
+**
+** Implementation of QFileInfo class
+**
+** Created : 950628
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses for Unix/X11 or for Qt/Embedded may use this file in accordance
+** with the Qt Commercial License Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglobal.h"
+
+#include "qfile.h"
+#include "qfiledefs_p.h"
+
+#if (defined(_OS_MAC_) && (!defined(_OS_UNIX_))) || defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_) || defined(_OS_CYGWIN_)
+# define HAS_TEXT_FILEMODE // has translate/text filemode
+#endif
+#if defined(O_NONBLOCK)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NONBLOCK
+#elif defined(O_NDELAY)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NDELAY
+#endif
+
+bool qt_file_access( const QString& fn, int t )
+{
+ if ( fn.isEmpty() )
+ return FALSE;
+ return ACCESS( QFile::encodeName(fn), t ) == 0;
+}
+
+/*!
+ Removes the file \a fileName.
+ Returns TRUE if successful, otherwise FALSE.
+*/
+
+bool QFile::remove( const QString &fileName )
+{
+ if ( fileName.isEmpty() ) {
+#if defined(CHECK_NULL)
+ qWarning( "QFile::remove: Empty or null file name" );
+#endif
+ return FALSE;
+ }
+ return unlink( QFile::encodeName(fileName) ) == 0;
+ // unlink more common in UNIX
+}
+
+#if defined(O_NONBLOCK)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NONBLOCK
+#elif defined(O_NDELAY)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NDELAY
+#endif
+
+/*!
+ Opens the file specified by the file name currently set, using the mode \e m.
+ Returns TRUE if successful, otherwise FALSE.
+
+ The mode parameter \e m must be a combination of the following flags:
+ <ul>
+ <li>\c IO_Raw specified raw (non-buffered) file access.
+ <li>\c IO_ReadOnly opens the file in read-only mode.
+ <li>\c IO_WriteOnly opens the file in write-only mode (and truncates).
+ <li>\c IO_ReadWrite opens the file in read/write mode, equivalent to
+ \c (IO_ReadOnly|IO_WriteOnly).
+ <li>\c IO_Append opens the file in append mode. This mode is very useful
+ when you want to write something to a log file. The file index is set to
+ the end of the file. Note that the result is undefined if you position the
+ file index manually using at() in append mode.
+ <li>\c IO_Truncate truncates the file.
+ <li>\c IO_Translate enables carriage returns and linefeed translation
+ for text files under MS-DOS, Windows and OS/2.
+ </ul>
+
+ The raw access mode is best when I/O is block-operated using 4kB block size
+ or greater. Buffered access works better when reading small portions of
+ data at a time.
+
+ <strong>Important:</strong> When working with buffered files, data may
+ not be written to the file at once. Call \link flush() flush\endlink
+ to make sure the data is really written.
+
+ \warning We have experienced problems with some C libraries when a buffered
+ file is opened for both reading and writing. If a read operation takes place
+ immediately after a write operation, the read buffer contains garbage data.
+ Worse, the same garbage is written to the file. Calling flush() before
+ readBlock() solved this problem.
+
+ If the file does not exist and \c IO_WriteOnly or \c IO_ReadWrite is
+ specified, it is created.
+
+ Example:
+ \code
+ QFile f1( "/tmp/data.bin" );
+ QFile f2( "readme.txt" );
+ f1.open( IO_Raw | IO_ReadWrite | IO_Append );
+ f2.open( IO_ReadOnly | IO_Translate );
+ \endcode
+
+ \sa name(), close(), isOpen(), flush()
+*/
+
+bool QFile::open( int m )
+{
+ if ( isOpen() ) { // file already open
+#if defined(CHECK_STATE)
+ qWarning( "QFile::open: File already open" );
+#endif
+ return FALSE;
+ }
+ if ( fn.isNull() ) { // no file name defined
+#if defined(CHECK_NULL)
+ qWarning( "QFile::open: No file name specified" );
+#endif
+ return FALSE;
+ }
+ init(); // reset params
+ setMode( m );
+ if ( !(isReadable() || isWritable()) ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QFile::open: File access not specified" );
+#endif
+ return FALSE;
+ }
+ bool ok = TRUE;
+ STATBUF st;
+ if ( isRaw() ) { // raw file I/O
+ int oflags = OPEN_RDONLY;
+ if ( isReadable() && isWritable() )
+ oflags = OPEN_RDWR;
+ else if ( isWritable() )
+ oflags = OPEN_WRONLY;
+ if ( flags() & IO_Append ) { // append to end of file?
+ if ( flags() & IO_Truncate )
+ oflags |= (OPEN_CREAT | OPEN_TRUNC);
+ else
+ oflags |= (OPEN_APPEND | OPEN_CREAT);
+ setFlags( flags() | IO_WriteOnly ); // append implies write
+ } else if ( isWritable() ) { // create/trunc if writable
+ if ( flags() & IO_Truncate )
+ oflags |= (OPEN_CREAT | OPEN_TRUNC);
+ else
+ oflags |= OPEN_CREAT;
+ }
+#if defined(HAS_TEXT_FILEMODE)
+ if ( isTranslated() )
+#ifdef __CYGWIN__
+ /* Do nothing, allowing the Cygwin mount mode to take effect. */;
+#else
+ oflags |= OPEN_TEXT;
+#endif
+ else
+ oflags |= OPEN_BINARY;
+#endif
+#if defined(HAS_ASYNC_FILEMODE)
+ if ( isAsynchronous() )
+ oflags |= OPEN_ASYNC;
+#endif
+ fd = OPEN( QFile::encodeName(fn), oflags, 0666 );
+
+ if ( fd != -1 ) { // open successful
+ FSTAT( fd, &st ); // get the stat for later usage
+ } else {
+ ok = FALSE;
+ }
+ } else { // buffered file I/O
+ QCString perm;
+ char perm2[4];
+ bool try_create = FALSE;
+ if ( flags() & IO_Append ) { // append to end of file?
+ setFlags( flags() | IO_WriteOnly ); // append implies write
+ perm = isReadable() ? "a+" : "a";
+ } else {
+ if ( isReadWrite() ) {
+ if ( flags() & IO_Truncate ) {
+ perm = "w+";
+ } else {
+ perm = "r+";
+ try_create = TRUE; // try to create if not exists
+ }
+ } else if ( isReadable() ) {
+ perm = "r";
+ } else if ( isWritable() ) {
+ perm = "w";
+ }
+ }
+ qstrcpy( perm2, perm );
+#if defined(HAS_TEXT_FILEMODE)
+ if ( isTranslated() )
+#ifdef __CYGWIN__
+ /* Do nothing, allowing the Cygwin mount mode to take effect. */;
+#else
+ strcat( perm2, "t" );
+#endif
+ else
+ strcat( perm2, "b" );
+#endif
+ while (1) { // At most twice
+
+ fh = fopen( QFile::encodeName(fn), perm2 );
+
+ if ( !fh && try_create ) {
+ perm2[0] = 'w'; // try "w+" instead of "r+"
+ try_create = FALSE;
+ } else {
+ break;
+ }
+ }
+ if ( fh ) {
+ FSTAT( FILENO(fh), &st ); // get the stat for later usage
+ } else {
+ ok = FALSE;
+ }
+ }
+ if ( ok ) {
+ setState( IO_Open );
+ // on successful open the file stat was got; now test what type
+ // of file we have
+ if ( (st.st_mode & STAT_MASK) != STAT_REG ) {
+ // non-seekable
+ setType( IO_Sequential );
+ length = INT_MAX;
+ ioIndex = (flags() & IO_Append) == 0 ? 0 : length;
+ } else {
+ length = (int)st.st_size;
+ ioIndex = (flags() & IO_Append) == 0 ? 0 : length;
+ if ( !(flags()&IO_Truncate) && length == 0 && isReadable() ) {
+ // try if you can read from it (if you can, it's a sequential
+ // device; e.g. a file in the /proc filesystem)
+ int c = getch();
+ if ( c != -1 ) {
+ ungetch(c);
+ setType( IO_Sequential );
+ length = INT_MAX;
+ }
+ }
+ }
+ } else {
+ init();
+ if ( errno == EMFILE ) // no more file handles/descrs
+ setStatus( IO_ResourceError );
+ else
+ setStatus( IO_OpenError );
+ }
+ return ok;
+}
+
+/*!
+ Opens a file in the mode \e m using an existing file handle \e f.
+ Returns TRUE if successful, otherwise FALSE.
+
+ Example:
+ \code
+ #include <stdio.h>
+
+ void printError( const char* msg )
+ {
+ QFile f;
+ f.open( IO_WriteOnly, stderr );
+ f.writeBlock( msg, qstrlen(msg) ); // write to stderr
+ f.close();
+ }
+ \endcode
+
+ When a QFile is opened using this function, close() does not actually
+ close the file, only flushes it.
+
+ \warning If \e f is \c stdin, \c stdout, \c stderr, you may not
+ be able to seek. See QIODevice::isSequentialAccess() for more
+ information.
+
+ \sa close()
+*/
+
+bool QFile::open( int m, FILE *f )
+{
+ if ( isOpen() ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QFile::open: File already open" );
+#endif
+ return FALSE;
+ }
+ init();
+ setMode( m &~IO_Raw );
+ setState( IO_Open );
+ fh = f;
+ ext_f = TRUE;
+ STATBUF st;
+ FSTAT( FILENO(fh), &st );
+ ioIndex = (int)ftell( fh );
+ if ( (st.st_mode & STAT_MASK) != STAT_REG || f == stdin ) { //stdin is non seekable
+ // non-seekable
+ setType( IO_Sequential );
+ length = INT_MAX;
+ } else {
+ length = (int)st.st_size;
+ if ( !(flags()&IO_Truncate) && length == 0 && isReadable() ) {
+ // try if you can read from it (if you can, it's a sequential
+ // device; e.g. a file in the /proc filesystem)
+ int c = getch();
+ if ( c != -1 ) {
+ ungetch(c);
+ setType( IO_Sequential );
+ length = INT_MAX;
+ }
+ }
+ }
+ return TRUE;
+}
+
+/*!
+ Opens a file in the mode \e m using an existing file descriptor \e f.
+ Returns TRUE if successful, otherwise FALSE.
+
+ When a QFile is opened using this function, close() does not actually
+ close the file.
+
+ \warning If \e f is one of 0 (stdin), 1 (stdout) or 2 (stderr), you may not
+ be able to seek. size() is set to \c INT_MAX (in limits.h).
+
+ \sa close()
+*/
+
+
+bool QFile::open( int m, int f )
+{
+ if ( isOpen() ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QFile::open: File already open" );
+#endif
+ return FALSE;
+ }
+ init();
+ setMode( m |IO_Raw );
+ setState( IO_Open );
+ fd = f;
+ ext_f = TRUE;
+ STATBUF st;
+ FSTAT( fd, &st );
+ ioIndex = (int)LSEEK(fd, 0, SEEK_CUR);
+ if ( (st.st_mode & STAT_MASK) != STAT_REG || f == 0 ) { // stdin is not seekable...
+ // non-seekable
+ setType( IO_Sequential );
+ length = INT_MAX;
+ } else {
+ length = (int)st.st_size;
+ if ( length == 0 && isReadable() ) {
+ // try if you can read from it (if you can, it's a sequential
+ // device; e.g. a file in the /proc filesystem)
+ int c = getch();
+ if ( c != -1 ) {
+ ungetch(c);
+ setType( IO_Sequential );
+ length = INT_MAX;
+ }
+ resetStatus();
+ }
+ }
+ return TRUE;
+}
+
+/*!
+ Returns the file size.
+ \sa at()
+*/
+
+uint QFile::size() const
+{
+ STATBUF st;
+ if ( isOpen() ) {
+ FSTAT( fh ? FILENO(fh) : fd, &st );
+ } else {
+ STAT( QFile::encodeName(fn), &st );
+ }
+ return st.st_size;
+}
+
+/*!
+ \fn int QFile::at() const
+ Returns the file index.
+ \sa size()
+*/
+
+/*!
+ Sets the file index to \e pos. Returns TRUE if successful, otherwise FALSE.
+
+ Example:
+ \code
+ QFile f( "data.bin" );
+ f.open( IO_ReadOnly ); // index set to 0
+ f.at( 100 ); // set index to 100
+ f.at( f.at()+50 ); // set index to 150
+ f.at( f.size()-80 ); // set index to 80 before EOF
+ f.close();
+ \endcode
+
+ \warning The result is undefined if the file was \link open() opened\endlink
+ using the \c IO_Append specifier.
+
+ \sa size(), open()
+*/
+
+bool QFile::at( int pos )
+{
+ if ( !isOpen() ) {
+#if defined(CHECK_STATE)
+ qWarning( "QFile::at: File is not open" );
+#endif
+ return FALSE;
+ }
+ bool ok;
+ if ( isRaw() ) { // raw file
+ pos = (int)LSEEK(fd, pos, SEEK_SET);
+ ok = pos != -1;
+ } else { // buffered file
+ ok = fseek(fh, pos, SEEK_SET) == 0;
+ }
+ if ( ok )
+ ioIndex = pos;
+#if defined(CHECK_RANGE)
+ else
+ qWarning( "QFile::at: Cannot set file position %d", pos );
+#endif
+ return ok;
+}
+
+/*!
+ Reads at most \e len bytes from the file into \e p and returns the
+ number of bytes actually read.
+
+ Returns -1 if a serious error occurred.
+
+ \warning We have experienced problems with some C libraries when a buffered
+ file is opened for both reading and writing. If a read operation takes place
+ immediately after a write operation, the read buffer contains garbage data.
+ Worse, the same garbage is written to the file. Calling flush() before
+ readBlock() solved this problem.
+
+ \sa writeBlock()
+*/
+
+int QFile::readBlock( char *p, uint len )
+{
+#if defined(CHECK_NULL)
+ if ( !p )
+ qWarning( "QFile::readBlock: Null pointer error" );
+#endif
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // file not open
+ qWarning( "QFile::readBlock: File not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QFile::readBlock: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ int nread = 0; // number of bytes read
+ if ( !ungetchBuffer.isEmpty() ) {
+ // need to add these to the returned string.
+ int l = ungetchBuffer.length();
+ while( nread < l ) {
+ *p = ungetchBuffer[ l - nread - 1 ];
+ p++;
+ nread++;
+ }
+ ungetchBuffer.truncate( l - nread );
+ }
+
+ if ( nread < (int)len ) {
+ if ( isRaw() ) { // raw file
+ nread += READ( fd, p, len-nread );
+ if ( len && nread <= 0 ) {
+ nread = 0;
+ setStatus(IO_ReadError);
+ }
+ } else { // buffered file
+ nread += fread( p, 1, len-nread, fh );
+ if ( (uint)nread != len ) {
+ if ( ferror( fh ) || nread==0 )
+ setStatus(IO_ReadError);
+ }
+ }
+ }
+ ioIndex += nread;
+ return nread;
+}
+
+/*! \overload int writeBlock( const QByteArray& data )
+*/
+
+/*! \reimp
+
+ Writes \e len bytes from \e p to the file and returns the number of
+ bytes actually written.
+
+ Returns -1 if a serious error occurred.
+
+ \warning When working with buffered files, data may not be written
+ to the file at once. Call flush() to make sure the data is really
+ written.
+
+ \sa readBlock()
+*/
+
+int QFile::writeBlock( const char *p, uint len )
+{
+#if defined(CHECK_NULL)
+ if ( p == 0 && len != 0 )
+ qWarning( "QFile::writeBlock: Null pointer error" );
+#endif
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // file not open
+ qWarning( "QFile::writeBlock: File not open" );
+ return -1;
+ }
+ if ( !isWritable() ) { // writing not permitted
+ qWarning( "QFile::writeBlock: Write operation not permitted" );
+ return -1;
+ }
+#endif
+ int nwritten; // number of bytes written
+ if ( isRaw() ) // raw file
+ nwritten = WRITE( fd, p, len );
+ else // buffered file
+ nwritten = fwrite( p, 1, len, fh );
+ if ( nwritten != (int)len ) { // write error
+ if ( errno == ENOSPC ) // disk is full
+ setStatus( IO_ResourceError );
+ else
+ setStatus( IO_WriteError );
+ if ( isRaw() ) // recalc file position
+ ioIndex = (int)LSEEK( fd, 0, SEEK_CUR );
+ else
+ ioIndex = fseek( fh, 0, SEEK_CUR );
+ } else {
+ ioIndex += nwritten;
+ }
+ if ( ioIndex > length ) // update file length
+ length = ioIndex;
+ return nwritten;
+}
+
+/*!
+ Returns the file handle of the file.
+
+ This is a small positive integer, suitable for use with C library
+ functions such as fdopen() and fcntl(), as well as with QSocketNotifier.
+
+ If the file is not open or there is an error, handle() returns -1.
+
+ \sa QSocketNotifier
+*/
+
+int QFile::handle() const
+{
+ if ( !isOpen() )
+ return -1;
+ else if ( fh )
+ return FILENO( fh );
+ else
+ return fd;
+}
+
+/*!
+ Closes an open file.
+
+ The file is not closed if it was opened with an existing file handle.
+ If the existing file handle is a \c FILE*, the file is flushed.
+ If the existing file handle is an \c int file descriptor, nothing
+ is done to the file.
+
+ Some "write-behind" filesystems may report an unspecified error on
+ closing the file. These errors only indicate that something may
+ have gone wrong since the previous open(). In such a case status()
+ reports IO_UnspecifiedError after close(), otherwise IO_Ok.
+
+ \sa open(), flush()
+*/
+
+
+void QFile::close()
+{
+ bool ok = FALSE;
+ if ( isOpen() ) { // file is not open
+ if ( fh ) { // buffered file
+ if ( ext_f )
+ ok = fflush( fh ) != -1; // flush instead of closing
+ else
+ ok = fclose( fh ) != -1;
+ } else { // raw file
+ if ( ext_f )
+ ok = TRUE; // cannot close
+ else
+ ok = CLOSE( fd ) != -1;
+ }
+ init(); // restore internal state
+ }
+ if (!ok)
+ setStatus (IO_UnspecifiedError);
+
+ return;
+}
+
+int64 QFile::pos() const
+{
+ if (isOpen())
+ {
+ // TODO: support 64 bit size
+ return ftell( fh );
+ }
+ return -1;
+}
+
+int64 QFile::toEnd()
+{
+ if (isOpen())
+ {
+ // TODO: support 64 bit size
+ if (fseek( fh, 0, SEEK_END )!=-1)
+ {
+ return ftell( fh );
+ }
+ }
+ return -1;
+}
+
+bool QFile::seek( int64 pos )
+{
+ if (isOpen())
+ {
+ // TODO: support 64 bit size
+ return fseek( fh, pos, SEEK_SET )!=-1;
+ }
+ return FALSE;
+}
+
diff --git a/qtools/qfile_win32.cpp b/qtools/qfile_win32.cpp
new file mode 100644
index 0000000..80ad628
--- /dev/null
+++ b/qtools/qfile_win32.cpp
@@ -0,0 +1,678 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Based on qfile_unix.cpp
+ *
+ * Copyright (C) 1992-2000 Trolltech AS.
+ */
+
+#include "qglobal.h"
+
+#include "qfile.h"
+#include "qfiledefs_p.h"
+
+#if defined(_OS_MAC_) || defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_)
+# define HAS_TEXT_FILEMODE // has translate/text filemode
+#endif
+#if defined(O_NONBLOCK)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NONBLOCK
+#elif defined(O_NDELAY)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NDELAY
+#endif
+
+static void reslashify( QString& n )
+{
+ for ( int i=0; i<(int)n.length(); i++ )
+ {
+ if ( n[i] == '/' )
+ n[i] = '\\';
+ }
+}
+
+bool qt_file_access( const QString& fn, int t )
+{
+ if ( fn.isEmpty() )
+ return FALSE;
+#if defined(__CYGWIN32_)
+ return ACCESS( QFile::encodeName(fn), t ) == 0;
+#else
+ QString str = fn;
+ reslashify(str);
+ return ( _waccess( (wchar_t*) str.ucs2(), t ) == 0 );
+#endif
+}
+
+/*!
+ Removes the file \a fileName.
+ Returns TRUE if successful, otherwise FALSE.
+*/
+
+bool QFile::remove( const QString &fileName )
+{
+ if ( fileName.isEmpty() ) {
+#if defined(CHECK_NULL)
+ qWarning( "QFile::remove: Empty or null file name" );
+#endif
+ return FALSE;
+ }
+#if defined(__CYGWIN32_)
+ // unlink more common in UNIX
+ return ::remove( QFile::encodeName(fileName) ) == 0;
+#else
+ QString str = fileName;
+ reslashify(str);
+ return ( _wunlink( (wchar_t*) str.ucs2() ) == 0 );
+#endif
+}
+
+#if defined(O_NONBLOCK)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NONBLOCK
+#elif defined(O_NDELAY)
+# define HAS_ASYNC_FILEMODE
+# define OPEN_ASYNC O_NDELAY
+#endif
+
+/*!
+ Opens the file specified by the file name currently set, using the mode \e m.
+ Returns TRUE if successful, otherwise FALSE.
+
+ The mode parameter \e m must be a combination of the following flags:
+ <ul>
+ <li>\c IO_Raw specified raw (non-buffered) file access.
+ <li>\c IO_ReadOnly opens the file in read-only mode.
+ <li>\c IO_WriteOnly opens the file in write-only mode (and truncates).
+ <li>\c IO_ReadWrite opens the file in read/write mode, equivalent to
+ \c (IO_ReadOnly|IO_WriteOnly).
+ <li>\c IO_Append opens the file in append mode. This mode is very useful
+ when you want to write something to a log file. The file index is set to
+ the end of the file. Note that the result is undefined if you position the
+ file index manually using at() in append mode.
+ <li>\c IO_Truncate truncates the file.
+ <li>\c IO_Translate enables carriage returns and linefeed translation
+ for text files under MS-DOS, Windows and OS/2.
+ </ul>
+
+ The raw access mode is best when I/O is block-operated using 4kB block size
+ or greater. Buffered access works better when reading small portions of
+ data at a time.
+
+ <strong>Important:</strong> When working with buffered files, data may
+ not be written to the file at once. Call \link flush() flush\endlink
+ to make sure the data is really written.
+
+ \warning We have experienced problems with some C libraries when a buffered
+ file is opened for both reading and writing. If a read operation takes place
+ immediately after a write operation, the read buffer contains garbage data.
+ Worse, the same garbage is written to the file. Calling flush() before
+ readBlock() solved this problem.
+
+ If the file does not exist and \c IO_WriteOnly or \c IO_ReadWrite is
+ specified, it is created.
+
+ Example:
+ \code
+ QFile f1( "/tmp/data.bin" );
+ QFile f2( "readme.txt" );
+ f1.open( IO_Raw | IO_ReadWrite | IO_Append );
+ f2.open( IO_ReadOnly | IO_Translate );
+ \endcode
+
+ \sa name(), close(), isOpen(), flush()
+*/
+
+bool QFile::open( int m )
+{
+ if ( isOpen() ) { // file already open
+#if defined(CHECK_STATE)
+ qWarning( "QFile::open: File already open" );
+#endif
+ return FALSE;
+ }
+ if ( fn.isNull() ) { // no file name defined
+#if defined(CHECK_NULL)
+ qWarning( "QFile::open: No file name specified" );
+#endif
+ return FALSE;
+ }
+ init(); // reset params
+ setMode( m );
+ if ( !(isReadable() || isWritable()) ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QFile::open: File access not specified" );
+#endif
+ return FALSE;
+ }
+ bool ok = TRUE;
+ STATBUF st;
+ if ( isRaw() ) { // raw file I/O
+ int oflags = OPEN_RDONLY;
+ if ( isReadable() && isWritable() )
+ oflags = OPEN_RDWR;
+ else if ( isWritable() )
+ oflags = OPEN_WRONLY;
+ if ( flags() & IO_Append ) { // append to end of file?
+ if ( flags() & IO_Truncate )
+ oflags |= (OPEN_CREAT | OPEN_TRUNC);
+ else
+ oflags |= (OPEN_APPEND | OPEN_CREAT);
+ setFlags( flags() | IO_WriteOnly ); // append implies write
+ } else if ( isWritable() ) { // create/trunc if writable
+ if ( flags() & IO_Truncate )
+ oflags |= (OPEN_CREAT | OPEN_TRUNC);
+ else
+ oflags |= OPEN_CREAT;
+ }
+#if defined(HAS_TEXT_FILEMODE)
+ if ( isTranslated() )
+ oflags |= OPEN_TEXT;
+ else
+ oflags |= OPEN_BINARY;
+#endif
+#if defined(HAS_ASYNC_FILEMODE)
+ if ( isAsynchronous() )
+ oflags |= OPEN_ASYNC;
+#endif
+
+
+#if defined(__CYGWIN32_)
+ fd = OPEN( QFile::encodeName(fn), oflags, 0666 );
+#else
+ QString str = fn;
+ reslashify(str);
+ fd = _wopen( (wchar_t*) str.ucs2(), oflags, 0666 );
+#endif
+
+ if ( fd != -1 ) { // open successful
+ FSTAT( fd, &st ); // get the stat for later usage
+ } else {
+ ok = FALSE;
+ }
+ } else { // buffered file I/O
+ QCString perm;
+ char perm2[4];
+ bool try_create = FALSE;
+ if ( flags() & IO_Append ) { // append to end of file?
+ setFlags( flags() | IO_WriteOnly ); // append implies write
+ perm = isReadable() ? "a+" : "a";
+ } else {
+ if ( isReadWrite() ) {
+ if ( flags() & IO_Truncate ) {
+ perm = "w+";
+ } else {
+ perm = "r+";
+ try_create = TRUE; // try to create if not exists
+ }
+ } else if ( isReadable() ) {
+ perm = "r";
+ } else if ( isWritable() ) {
+ perm = "w";
+ }
+ }
+ qstrcpy( perm2, perm );
+ if ( isTranslated() )
+ strcat( perm2, "t" );
+ else
+ strcat( perm2, "b" );
+ while (1) { // At most twice
+
+#if defined(__CYGWIN32_)
+ fh = fopen( QFile::encodeName(fn), perm2 );
+#else
+ QString str = fn;
+ QString prm( perm2 );
+ reslashify(str);
+ fh = _wfopen( (wchar_t*) str.ucs2(), (wchar_t*) prm.ucs2() );
+#endif
+
+ if ( !fh && try_create ) {
+ perm2[0] = 'w'; // try "w+" instead of "r+"
+ try_create = FALSE;
+ } else {
+ break;
+ }
+ }
+ if ( fh ) {
+ FSTAT( FILENO(fh), &st ); // get the stat for later usage
+ } else {
+ ok = FALSE;
+ }
+ }
+ if ( ok ) {
+ setState( IO_Open );
+ // on successful open the file stat was got; now test what type
+ // of file we have
+ if ( (st.st_mode & STAT_MASK) != STAT_REG ) {
+ // non-seekable
+ setType( IO_Sequential );
+ length = INT_MAX;
+ ioIndex = (flags() & IO_Append) == 0 ? 0 : length;
+ } else {
+ length = (int)st.st_size;
+ ioIndex = (flags() & IO_Append) == 0 ? 0 : length;
+ if ( (flags() & !IO_Truncate) && length == 0 && isReadable() ) {
+ // try if you can read from it (if you can, it's a sequential
+ // device; e.g. a file in the /proc filesystem)
+ int c = getch();
+ if ( c != -1 ) {
+ ungetch(c);
+ setType( IO_Sequential );
+ length = INT_MAX;
+ }
+ }
+ }
+ } else {
+ init();
+ if ( errno == EMFILE ) // no more file handles/descrs
+ setStatus( IO_ResourceError );
+ else
+ setStatus( IO_OpenError );
+ }
+ return ok;
+}
+
+/*!
+ Opens a file in the mode \e m using an existing file handle \e f.
+ Returns TRUE if successful, otherwise FALSE.
+
+ Example:
+ \code
+ #include <stdio.h>
+
+ void printError( const char* msg )
+ {
+ QFile f;
+ f.open( IO_WriteOnly, stderr );
+ f.writeBlock( msg, qstrlen(msg) ); // write to stderr
+ f.close();
+ }
+ \endcode
+
+ When a QFile is opened using this function, close() does not actually
+ close the file, only flushes it.
+
+ \warning If \e f is \c stdin, \c stdout, \c stderr, you may not
+ be able to seek. See QIODevice::isSequentialAccess() for more
+ information.
+
+ \sa close()
+*/
+
+bool QFile::open( int m, FILE *f )
+{
+ if ( isOpen() ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QFile::open: File already open" );
+#endif
+ return FALSE;
+ }
+ init();
+ setMode( m &~IO_Raw );
+ setState( IO_Open );
+ fh = f;
+ ext_f = TRUE;
+ STATBUF st;
+ FSTAT( FILENO(fh), &st );
+ ioIndex = (int)ftell( fh );
+ if ( (st.st_mode & STAT_MASK) != STAT_REG ) {
+ // non-seekable
+ setType( IO_Sequential );
+ length = INT_MAX;
+ } else {
+ length = (int)st.st_size;
+ if ( (flags() & !IO_Truncate) && length == 0 && isReadable() ) {
+ // try if you can read from it (if you can, it's a sequential
+ // device; e.g. a file in the /proc filesystem)
+ int c = getch();
+ if ( c != -1 ) {
+ ungetch(c);
+ setType( IO_Sequential );
+ length = INT_MAX;
+ }
+ }
+ }
+ return TRUE;
+}
+
+/*!
+ Opens a file in the mode \e m using an existing file descriptor \e f.
+ Returns TRUE if successful, otherwise FALSE.
+
+ When a QFile is opened using this function, close() does not actually
+ close the file.
+
+ \warning If \e f is one of 0 (stdin), 1 (stdout) or 2 (stderr), you may not
+ be able to seek. size() is set to \c INT_MAX (in limits.h).
+
+ \sa close()
+*/
+
+
+bool QFile::open( int m, int f )
+{
+ if ( isOpen() ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QFile::open: File already open" );
+#endif
+ return FALSE;
+ }
+ init();
+ setMode( m |IO_Raw );
+ setState( IO_Open );
+ fd = f;
+ ext_f = TRUE;
+ STATBUF st;
+ FSTAT( fd, &st );
+ ioIndex = (int)LSEEK(fd, 0, SEEK_CUR);
+ if ( (st.st_mode & STAT_MASK) != STAT_REG ) {
+ // non-seekable
+ setType( IO_Sequential );
+ length = INT_MAX;
+ } else {
+ length = (int)st.st_size;
+ if ( length == 0 && isReadable() ) {
+ // try if you can read from it (if you can, it's a sequential
+ // device; e.g. a file in the /proc filesystem)
+ int c = getch();
+ if ( c != -1 ) {
+ ungetch(c);
+ setType( IO_Sequential );
+ length = INT_MAX;
+ }
+ }
+ }
+ return TRUE;
+}
+
+/*!
+ Returns the file size.
+ \sa at()
+*/
+
+uint QFile::size() const
+{
+ STATBUF st;
+ if ( isOpen() ) {
+ FSTAT( fh ? FILENO(fh) : fd, &st );
+ return st.st_size;
+ } else {
+#if defined(__CYGWIN32_)
+ STAT( QFile::encodeName(fn), &st );
+#else
+ QString str = fn;
+ reslashify(str);
+#ifdef QT_LARGEFILE_SUPPORT
+ if ( _wstati64( (wchar_t*) str.ucs2(), &st ) != -1 ) {
+#else
+ if ( _wstat( (wchar_t*) str.ucs2(), &st ) != -1 ) {
+#endif
+#endif
+ return st.st_size;
+ }
+ }
+ return 0;
+}
+
+/*!
+ \fn int QFile::at() const
+ Returns the file index.
+ \sa size()
+*/
+
+/*!
+ Sets the file index to \e pos. Returns TRUE if successful, otherwise FALSE.
+
+ Example:
+ \code
+ QFile f( "data.bin" );
+ f.open( IO_ReadOnly ); // index set to 0
+ f.at( 100 ); // set index to 100
+ f.at( f.at()+50 ); // set index to 150
+ f.at( f.size()-80 ); // set index to 80 before EOF
+ f.close();
+ \endcode
+
+ \warning The result is undefined if the file was \link open() opened\endlink
+ using the \c IO_Append specifier.
+
+ \sa size(), open()
+*/
+
+bool QFile::at( int pos )
+{
+ if ( !isOpen() ) {
+#if defined(CHECK_STATE)
+ qWarning( "QFile::at: File is not open" );
+#endif
+ return FALSE;
+ }
+ bool ok;
+ if ( isRaw() ) { // raw file
+ pos = (int)LSEEK(fd, pos, SEEK_SET);
+ ok = pos != -1;
+ } else { // buffered file
+ ok = fseek(fh, pos, SEEK_SET) == 0;
+ }
+ if ( ok )
+ ioIndex = pos;
+#if defined(CHECK_RANGE)
+ else
+ qWarning( "QFile::at: Cannot set file position %d", pos );
+#endif
+ return ok;
+}
+
+/*!
+ Reads at most \e len bytes from the file into \e p and returns the
+ number of bytes actually read.
+
+ Returns -1 if a serious error occurred.
+
+ \warning We have experienced problems with some C libraries when a buffered
+ file is opened for both reading and writing. If a read operation takes place
+ immediately after a write operation, the read buffer contains garbage data.
+ Worse, the same garbage is written to the file. Calling flush() before
+ readBlock() solved this problem.
+
+ \sa writeBlock()
+*/
+
+int QFile::readBlock( char *p, uint len )
+{
+#if defined(CHECK_NULL)
+ if ( !p )
+ qWarning( "QFile::readBlock: Null pointer error" );
+#endif
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // file not open
+ qWarning( "QFile::readBlock: File not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QFile::readBlock: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ int nread; // number of bytes read
+ if ( isRaw() ) { // raw file
+ nread = READ( fd, p, len );
+ if ( len && nread <= 0 ) {
+ nread = 0;
+ setStatus(IO_ReadError);
+ }
+ } else { // buffered file
+ nread = fread( p, 1, len, fh );
+ if ( (uint)nread != len ) {
+ if ( ferror( fh ) || nread==0 )
+ setStatus(IO_ReadError);
+ }
+ }
+ ioIndex += nread;
+ return nread;
+}
+
+/*! \overload int writeBlock( const QByteArray& data )
+*/
+
+/*! \reimp
+
+ Writes \e len bytes from \e p to the file and returns the number of
+ bytes actually written.
+
+ Returns -1 if a serious error occurred.
+
+ \warning When working with buffered files, data may not be written
+ to the file at once. Call flush() to make sure the data is really
+ written.
+
+ \sa readBlock()
+*/
+
+int QFile::writeBlock( const char *p, uint len )
+{
+#if defined(CHECK_NULL)
+ if ( p == 0 && len != 0 )
+ qWarning( "QFile::writeBlock: Null pointer error" );
+#endif
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // file not open
+ qWarning( "QFile::writeBlock: File not open" );
+ return -1;
+ }
+ if ( !isWritable() ) { // writing not permitted
+ qWarning( "QFile::writeBlock: Write operation not permitted" );
+ return -1;
+ }
+#endif
+ int nwritten; // number of bytes written
+ if ( isRaw() ) // raw file
+ nwritten = WRITE( fd, p, len );
+ else // buffered file
+ nwritten = fwrite( p, 1, len, fh );
+ if ( nwritten != (int)len ) { // write error
+ if ( errno == ENOSPC ) // disk is full
+ setStatus( IO_ResourceError );
+ else
+ setStatus( IO_WriteError );
+ if ( isRaw() ) // recalc file position
+ ioIndex = (int)LSEEK( fd, 0, SEEK_CUR );
+ else
+ ioIndex = fseek( fh, 0, SEEK_CUR );
+ } else {
+ ioIndex += nwritten;
+ }
+ if ( ioIndex > length ) // update file length
+ length = ioIndex;
+ return nwritten;
+}
+
+/*!
+ Returns the file handle of the file.
+
+ This is a small positive integer, suitable for use with C library
+ functions such as fdopen() and fcntl(), as well as with QSocketNotifier.
+
+ If the file is not open or there is an error, handle() returns -1.
+
+ \sa QSocketNotifier
+*/
+
+int QFile::handle() const
+{
+ if ( !isOpen() )
+ return -1;
+ else if ( fh )
+ return FILENO( fh );
+ else
+ return fd;
+}
+
+/*!
+ Closes an open file.
+
+ The file is not closed if it was opened with an existing file handle.
+ If the existing file handle is a \c FILE*, the file is flushed.
+ If the existing file handle is an \c int file descriptor, nothing
+ is done to the file.
+
+ Some "write-behind" filesystems may report an unspecified error on
+ closing the file. These errors only indicate that something may
+ have gone wrong since the previous open(). In such a case status()
+ reports IO_UnspecifiedError after close(), otherwise IO_Ok.
+
+ \sa open(), flush()
+*/
+
+
+void QFile::close()
+{
+ bool ok = FALSE;
+ if ( isOpen() ) { // file is not open
+ if ( fh ) { // buffered file
+ if ( ext_f )
+ ok = fflush( fh ) != -1; // flush instead of closing
+ else
+ ok = fclose( fh ) != -1;
+ } else { // raw file
+ if ( ext_f )
+ ok = TRUE; // cannot close
+ else
+ ok = CLOSE( fd ) != -1;
+ }
+ init(); // restore internal state
+ }
+ if (!ok)
+ setStatus (IO_UnspecifiedError);
+
+ return;
+}
+
+int64 QFile::pos() const
+{
+ if (isOpen())
+ {
+ // TODO: support 64 bit size
+ return ftell( fh );
+ }
+ return -1;
+}
+
+int64 QFile::toEnd()
+{
+ if (isOpen())
+ {
+ // TODO: support 64 bit size
+ if (fseek( fh, 0, SEEK_END )!=-1)
+ {
+ return ftell( fh );
+ }
+ }
+ return -1;
+}
+
+bool QFile::seek( int64 pos )
+{
+ if (isOpen())
+ {
+ // TODO: support 64 bit size
+ return fseek( fh, pos, SEEK_SET )!=-1;
+ }
+ return FALSE;
+}
+
+
+
diff --git a/qtools/qfiledefs_p.h b/qtools/qfiledefs_p.h
new file mode 100644
index 0000000..5105c45
--- /dev/null
+++ b/qtools/qfiledefs_p.h
@@ -0,0 +1,261 @@
+/****************************************************************************
+**
+**
+** Common macros and system include files for QFile, QFileInfo and QDir.
+**
+** Created : 930812
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QFILEDEFS_P_H
+#define QFILEDEFS_P_H
+
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of qfile.cpp, qfileinfo.cpp and qdir.cpp.
+// This header file may change from version to version without notice,
+// or even be removed.
+//
+//
+#if defined(_CC_MWERKS_)
+# include <stdlib.h>
+# include <stat.h>
+#elif !defined(_OS_MAC_)
+# include <sys/types.h>
+# include <sys/stat.h>
+#elif defined(_OS_MAC_)
+# include <sys/types.h>
+# include <sys/stat.h>
+# define _OS_UNIX_
+#endif
+#include <fcntl.h>
+#include <errno.h>
+#if defined(_OS_UNIX_)
+# include <dirent.h>
+# include <unistd.h>
+#endif
+#if defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_)
+# define _OS_FATFS_
+# if defined(__CYGWIN32__)
+# include <dirent.h>
+# include <unistd.h>
+# if !defined(_OS_UNIX_)
+# define _OS_UNIX_
+# endif
+# else
+# include <io.h>
+# if !defined(_CC_MWERKS_)
+# include <dos.h>
+# endif
+# include <direct.h>
+# endif
+#endif
+#include <limits.h>
+
+
+#if !defined(PATH_MAX)
+#if defined( MAXPATHLEN )
+#define PATH_MAX MAXPATHLEN
+#else
+#define PATH_MAX 1024
+#endif
+#endif
+
+
+#undef STATBUF
+#undef STAT
+#undef STAT_REG
+#undef STAT_DIR
+#undef STAT_LNK
+#undef STAT_MASK
+#undef FILENO
+#undef OPEN
+#undef CLOSE
+#undef LSEEK
+#undef READ
+#undef WRITE
+#undef ACCESS
+#undef GETCWD
+#undef CHDIR
+#undef MKDIR
+#undef RMDIR
+#undef OPEN_RDONLY
+#undef OPEN_WRONLY
+#undef OPEN_CREAT
+#undef OPEN_TRUNC
+#undef OPEN_APPEND
+#undef OPEN_TEXT
+#undef OPEN_BINARY
+
+
+#if defined(_CC_MSVC_) || defined(_CC_SYM_)
+
+# define STATBUF struct _stat // non-ANSI defs
+# define STATBUF4TSTAT struct _stat // non-ANSI defs
+# define STAT ::_stat
+# define FSTAT ::_fstat
+# define STAT_REG _S_IFREG
+# define STAT_DIR _S_IFDIR
+# define STAT_MASK _S_IFMT
+# if defined(_S_IFLNK)
+# define STAT_LNK _S_IFLNK
+# endif
+# define FILENO _fileno
+# define OPEN ::_open
+# define CLOSE ::_close
+# define LSEEK ::_lseek
+# define READ ::_read
+# define WRITE ::_write
+# define ACCESS ::_access
+# define GETCWD ::_getcwd
+# define CHDIR ::_chdir
+# define MKDIR ::_mkdir
+# define RMDIR ::_rmdir
+# define OPEN_RDONLY _O_RDONLY
+# define OPEN_WRONLY _O_WRONLY
+# define OPEN_RDWR _O_RDWR
+# define OPEN_CREAT _O_CREAT
+# define OPEN_TRUNC _O_TRUNC
+# define OPEN_APPEND _O_APPEND
+# if defined(O_TEXT)
+# define OPEN_TEXT _O_TEXT
+# define OPEN_BINARY _O_BINARY
+# endif
+
+#elif defined(_CC_BOR_) && __BORLANDC__ >= 0x550
+
+# define STATBUF struct stat // non-ANSI defs
+# define STATBUF4TSTAT struct _stat // non-ANSI defs
+# define STAT ::stat
+# define FSTAT ::fstat
+# define STAT_REG _S_IFREG
+# define STAT_DIR _S_IFDIR
+# define STAT_MASK _S_IFMT
+# if defined(_S_IFLNK)
+# define STAT_LNK _S_IFLNK
+# endif
+# define FILENO _fileno
+# define OPEN ::open
+# define CLOSE ::_close
+# define LSEEK ::_lseek
+# define READ ::_read
+# define WRITE ::_write
+# define ACCESS ::_access
+# define GETCWD ::_getcwd
+# define CHDIR ::chdir
+# define MKDIR ::_mkdir
+# define RMDIR ::_rmdir
+# define OPEN_RDONLY _O_RDONLY
+# define OPEN_WRONLY _O_WRONLY
+# define OPEN_RDWR _O_RDWR
+# define OPEN_CREAT _O_CREAT
+# define OPEN_TRUNC _O_TRUNC
+# define OPEN_APPEND _O_APPEND
+# if defined(O_TEXT)
+# define OPEN_TEXT _O_TEXT
+# define OPEN_BINARY _O_BINARY
+# endif
+
+#else // all other systems
+
+# define STATBUF struct stat
+# define STATBUF4TSTAT struct stat
+# define STAT ::stat
+# define FSTAT ::fstat
+# define STAT_REG S_IFREG
+# define STAT_DIR S_IFDIR
+# define STAT_MASK S_IFMT
+# if defined(S_IFLNK)
+# define STAT_LNK S_IFLNK
+# endif
+# define FILENO fileno
+# define OPEN ::open
+# define CLOSE ::close
+# define LSEEK ::lseek
+# define READ ::read
+# define WRITE ::write
+# define ACCESS ::access
+# if defined(_OS_OS2EMX_)
+# define GETCWD ::_getcwd2
+# define CHDIR ::_chdir2
+# else
+# define GETCWD ::getcwd
+# define CHDIR ::chdir
+# endif
+# define MKDIR ::mkdir
+# define RMDIR ::rmdir
+# define OPEN_RDONLY O_RDONLY
+# define OPEN_WRONLY O_WRONLY
+# define OPEN_RDWR O_RDWR
+# define OPEN_CREAT O_CREAT
+# define OPEN_TRUNC O_TRUNC
+# define OPEN_APPEND O_APPEND
+# if defined(O_TEXT)
+# define OPEN_TEXT O_TEXT
+# define OPEN_BINARY O_BINARY
+# endif
+#endif
+
+#if defined(_CC_MWERKS_)
+#undef mkdir
+#undef MKDIR
+#define MKDIR _mkdir
+#undef rmdir
+#undef RMDIR
+#define RMDIR _rmdir
+#endif
+
+
+#if defined(_OS_FATFS_)
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+#if defined(_OS_MAC_) && !defined(_OS_UNIX_)
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+struct QFileInfoCache
+{
+ STATBUF st;
+ bool isSymLink;
+};
+
+#endif
diff --git a/qtools/qfileinfo.cpp b/qtools/qfileinfo.cpp
new file mode 100644
index 0000000..5053b76
--- /dev/null
+++ b/qtools/qfileinfo.cpp
@@ -0,0 +1,458 @@
+/****************************************************************************
+**
+**
+** Implementation of QFileInfo class
+**
+** Created : 950628
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglobal.h"
+
+#include "qfileinfo.h"
+#include "qfiledefs_p.h"
+#include "qdatetime.h"
+#include "qdir.h"
+
+extern bool qt_file_access( const QString& fn, int t );
+
+// NOT REVISED
+/*!
+ \class QFileInfo qfileinfo.h
+ \brief The QFileInfo class provides system-independent file information.
+
+ \ingroup io
+
+ QFileInfo provides information about a file's name and position (path) in
+ the file system, its access rights and whether it is a directory or a
+ symbolic link. Its size and last modified/read times are also available.
+
+ To speed up performance QFileInfo caches information about the file. Since
+ files can be changed by other users or programs, or even by other parts of
+ the same program there is a function that refreshes the file information;
+ refresh(). If you would rather like a QFileInfo to access the file system
+ every time you request information from it, you can call the function
+ setCaching( FALSE ).
+
+ A QFileInfo can point to a file using either a relative or an absolute
+ file path. Absolute file paths begin with the directory separator
+ ('/') or a drive specification (not applicable to UNIX).
+ Relative file names begin with a directory name or a file name and specify
+ a path relative to the current directory. An example of
+ an absolute path is the string "/tmp/quartz". A relative path might look like
+ "src/fatlib". You can use the function isRelative() to check if a QFileInfo
+ is using a relative or an absolute file path. You can call the function
+ convertToAbs() to convert a relative QFileInfo to an absolute one.
+
+ If you need to read and traverse directories, see the QDir class.
+*/
+
+
+/*!
+ Constructs a new empty QFileInfo.
+*/
+
+QFileInfo::QFileInfo()
+{
+ fic = 0;
+ cache = TRUE;
+}
+
+/*!
+ Constructs a new QFileInfo that gives information about the given file.
+ The string given can be an absolute or a relative file path.
+
+ \sa bool setFile(QString ), isRelative(), QDir::setCurrent(),
+ QDir::isRelativePath()
+*/
+
+QFileInfo::QFileInfo( const QString &file )
+{
+ fn = file;
+ slashify( fn );
+ fic = 0;
+ cache = TRUE;
+}
+
+/*!
+ Constructs a new QFileInfo that gives information about \e file.
+
+ If the file has a relative path, the QFileInfo will also have one.
+
+ \sa isRelative()
+*/
+
+QFileInfo::QFileInfo( const QFile &file )
+{
+ fn = file.name();
+ slashify( fn );
+ fic = 0;
+ cache = TRUE;
+}
+
+/*!
+ Constructs a new QFileInfo that gives information about the file
+ named \e fileName in the directory \e d.
+
+ If the directory has a relative path, the QFileInfo will also have one.
+
+ \sa isRelative()
+*/
+#ifndef QT_NO_DIR
+QFileInfo::QFileInfo( const QDir &d, const QString &fileName )
+{
+ fn = d.filePath( fileName );
+ slashify( fn );
+ fic = 0;
+ cache = TRUE;
+}
+#endif
+/*!
+ Constructs a new QFileInfo that is a copy of \e fi.
+*/
+
+QFileInfo::QFileInfo( const QFileInfo &fi )
+{
+ fn = fi.fn;
+ if ( fi.fic ) {
+ fic = new QFileInfoCache;
+ *fic = *fi.fic;
+ } else {
+ fic = 0;
+ }
+ cache = fi.cache;
+}
+
+/*!
+ Destructs the QFileInfo.
+*/
+
+QFileInfo::~QFileInfo()
+{
+ delete fic;
+}
+
+
+/*!
+ Makes a copy of \e fi and assigns it to this QFileInfo.
+*/
+
+QFileInfo &QFileInfo::operator=( const QFileInfo &fi )
+{
+ fn = fi.fn;
+ if ( !fi.fic ) {
+ delete fic;
+ fic = 0;
+ } else {
+ if ( !fic ) {
+ fic = new QFileInfoCache;
+ CHECK_PTR( fic );
+ }
+ *fic = *fi.fic;
+ }
+ cache = fi.cache;
+ return *this;
+}
+
+
+/*!
+ Sets the file to obtain information about.
+
+ The string given can be an absolute or a relative file path. Absolute file
+ paths begin with the directory separator (e.g. '/' under UNIX) or a drive
+ specification (not applicable to UNIX). Relative file names begin with a
+ directory name or a file name and specify a path relative to the current
+ directory.
+
+ Example:
+ \code
+ #include <qfileinfo.h>
+ #include <qdir.h>
+
+ void test()
+ {
+ QString absolute = "/liver/aorta";
+ QString relative = "liver/aorta";
+ QFileInfo fi1( absolute );
+ QFileInfo fi2( relative );
+
+ QDir::setCurrent( QDir::rootDirPath() );
+ // fi1 and fi2 now point to the same file
+
+ QDir::setCurrent( "/tmp" );
+ // fi1 now points to "/liver/aorta",
+ // while fi2 points to "/tmp/liver/aorta"
+ }
+ \endcode
+
+ \sa isRelative(), QDir::setCurrent(), QDir::isRelativePath()
+*/
+
+void QFileInfo::setFile( const QString &file )
+{
+ fn = file;
+ slashify( fn );
+ delete fic;
+ fic = 0;
+}
+
+/*!
+ Sets the file to obtain information about.
+
+ If the file has a relative path, the QFileInfo will also have one.
+
+ \sa isRelative()
+*/
+
+void QFileInfo::setFile( const QFile &file )
+{
+ fn = file.name();
+ slashify( fn );
+ delete fic;
+ fic = 0;
+}
+
+/*!
+ Sets the file to obtains information about to \e fileName in the
+ directory \e d.
+
+ If the directory has a relative path, the QFileInfo will also have one.
+
+ \sa isRelative()
+*/
+#ifndef QT_NO_DIR
+void QFileInfo::setFile( const QDir &d, const QString &fileName )
+{
+ fn = d.filePath( fileName );
+ slashify( fn );
+ delete fic;
+ fic = 0;
+}
+#endif
+
+/*!
+ Returns TRUE if the file pointed to exists, otherwise FALSE.
+*/
+
+bool QFileInfo::exists() const
+{
+ return qt_file_access( fn, F_OK );
+}
+
+/*!
+ Refresh the information about the file, i.e. read in information from the
+ file system the next time a cached property is fetched.
+
+ \sa setCaching()
+*/
+
+void QFileInfo::refresh() const
+{
+ QFileInfo *that = (QFileInfo*)this; // Mutable function
+ delete that->fic;
+ that->fic = 0;
+}
+
+/*!
+ \fn bool QFileInfo::caching() const
+ Returns TRUE if caching is enabled.
+ \sa setCaching(), refresh()
+*/
+
+/*!
+ Enables caching of file information if \e enable is TRUE, or disables it
+ if \e enable is FALSE.
+
+ When caching is enabled, QFileInfo reads the file information the first
+ time
+
+ Caching is enabled by default.
+
+ \sa refresh(), caching()
+*/
+
+void QFileInfo::setCaching( bool enable )
+{
+ if ( cache == enable )
+ return;
+ cache = enable;
+ if ( cache ) {
+ delete fic;
+ fic = 0;
+ }
+}
+
+
+/*!
+ Returns the name, i.e. the file name including the path (which can be
+ absolute or relative).
+
+ \sa isRelative(), absFilePath()
+*/
+
+QString QFileInfo::filePath() const
+{
+ return fn;
+}
+
+/*!
+ Returns the base name of the file.
+
+ The base name consists of all characters in the file name up to (but not
+ including) the first '.' character. The path is not included.
+
+ Example:
+ \code
+ QFileInfo fi( "/tmp/abdomen.lower" );
+ QString base = fi.baseName(); // base = "abdomen"
+ \endcode
+
+ \sa fileName(), extension()
+*/
+
+QString QFileInfo::baseName() const
+{
+ QString tmp = fileName();
+ int pos = tmp.find( '.' );
+ if ( pos == -1 )
+ return tmp;
+ else
+ return tmp.left( pos );
+}
+
+/*!
+ Returns the extension name of the file.
+
+ If \a complete is TRUE (the default), extension() returns the string
+ of all characters in the file name after (but not including) the
+ first '.' character. For a file named "archive.tar.gz" this
+ returns "tar.gz".
+
+ If \a complete is FALSE, extension() returns the string of all
+ characters in the file name after (but not including) the last '.'
+ character. For a file named "archive.tar.gz" this returns "gz".
+
+ Example:
+ \code
+ QFileInfo fi( "lex.yy.c" );
+ QString ext = fi.extension(); // ext = "yy.c"
+ QString ext = fi.extension( FALSE ); // ext = "c"
+ \endcode
+
+ \sa fileName(), baseName()
+
+*/
+
+QString QFileInfo::extension( bool complete ) const
+{
+ QString s = fileName();
+ int pos = complete ? s.find( '.' ) : s.findRev( '.' );
+ if ( pos < 0 )
+ return QString::fromLatin1( "" );
+ else
+ return s.right( s.length() - pos - 1 );
+}
+
+/*!
+ Returns the directory path of the file.
+
+ If the QFileInfo is relative and \e absPath is FALSE, the QDir will be
+ relative, otherwise it will be absolute.
+
+ \sa dirPath(), filePath(), fileName(), isRelative()
+*/
+#ifndef QT_NO_DIR
+QDir QFileInfo::dir( bool absPath ) const
+{
+ return QDir( dirPath(absPath) );
+}
+#endif
+
+
+/*!
+ Returns TRUE if the file is readable.
+ \sa isWritable(), isExecutable(), permission()
+*/
+
+bool QFileInfo::isReadable() const
+{
+ return qt_file_access( fn, R_OK );
+}
+
+/*!
+ Returns TRUE if the file is writable.
+ \sa isReadable(), isExecutable(), permission()
+*/
+
+bool QFileInfo::isWritable() const
+{
+ return qt_file_access( fn, W_OK );
+}
+
+/*!
+ Returns TRUE if the file is executable.
+ \sa isReadable(), isWritable(), permission()
+*/
+
+bool QFileInfo::isExecutable() const
+{
+ return qt_file_access( fn, X_OK );
+}
+
+
+/*!
+ Returns TRUE if the file path name is relative to the current directory,
+ FALSE if the path is absolute (e.g. under UNIX a path is relative if it
+ does not start with a '/').
+
+ According to Einstein this function should always return TRUE.
+*/
+#ifndef QT_NO_DIR
+bool QFileInfo::isRelative() const
+{
+ return QDir::isRelativePath( fn );
+}
+
+/*!
+ Converts the file path name to an absolute path.
+
+ If it is already absolute nothing is done.
+
+ \sa filePath(), isRelative()
+*/
+
+bool QFileInfo::convertToAbs()
+{
+ if ( isRelative() )
+ fn = absFilePath();
+ return QDir::isRelativePath( fn );
+}
+#endif
diff --git a/qtools/qfileinfo.h b/qtools/qfileinfo.h
new file mode 100644
index 0000000..76ef8c2
--- /dev/null
+++ b/qtools/qfileinfo.h
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+**
+** Definition of QFileInfo class
+**
+** Created : 950628
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QFILEINFO_H
+#define QFILEINFO_H
+
+#ifndef QT_H
+#include "qfile.h"
+#include "qdatetime.h"
+#endif // QT_H
+
+
+class QDir;
+struct QFileInfoCache;
+
+
+class Q_EXPORT QFileInfo // file information class
+{
+public:
+ enum PermissionSpec {
+ ReadUser = 0400, WriteUser = 0200, ExeUser = 0100,
+ ReadGroup = 0040, WriteGroup = 0020, ExeGroup = 0010,
+ ReadOther = 0004, WriteOther = 0002, ExeOther = 0001 };
+
+ QFileInfo();
+ QFileInfo( const QString &file );
+ QFileInfo( const QFile & );
+#ifndef QT_NO_DIR
+ QFileInfo( const QDir &, const QString &fileName );
+#endif
+ QFileInfo( const QFileInfo & );
+ ~QFileInfo();
+
+ QFileInfo &operator=( const QFileInfo & );
+
+ void setFile( const QString &file );
+ void setFile( const QFile & );
+#ifndef QT_NO_DIR
+ void setFile( const QDir &, const QString &fileName );
+#endif
+ bool exists() const;
+ void refresh() const;
+ bool caching() const;
+ void setCaching( bool );
+
+ QString filePath() const;
+ QString fileName() const;
+#ifndef QT_NO_DIR //###
+ QString absFilePath() const;
+#endif
+ QString baseName() const;
+ QString extension( bool complete = TRUE ) const;
+
+#ifndef QT_NO_DIR //###
+ QString dirPath( bool absPath = FALSE ) const;
+#endif
+#ifndef QT_NO_DIR
+ QDir dir( bool absPath = FALSE ) const;
+#endif
+ bool isReadable() const;
+ bool isWritable() const;
+ bool isExecutable() const;
+
+#ifndef QT_NO_DIR //###
+ bool isRelative() const;
+ bool convertToAbs();
+#endif
+
+ bool isFile() const;
+ bool isDir() const;
+ bool isSymLink() const;
+
+ QString readLink() const;
+
+ QString owner() const;
+ uint ownerId() const;
+ QString group() const;
+ uint groupId() const;
+
+ bool permission( int permissionSpec ) const;
+
+ uint size() const;
+
+ QDateTime lastModified() const;
+ QDateTime lastRead() const;
+
+private:
+ void doStat() const;
+ static void slashify( QString & );
+ static void makeAbs( QString & );
+
+ QString fn;
+ QFileInfoCache *fic;
+ bool cache;
+};
+
+
+inline bool QFileInfo::caching() const
+{
+ return cache;
+}
+
+
+#endif // QFILEINFO_H
diff --git a/qtools/qfileinfo_unix.cpp b/qtools/qfileinfo_unix.cpp
new file mode 100644
index 0000000..5a8fe04
--- /dev/null
+++ b/qtools/qfileinfo_unix.cpp
@@ -0,0 +1,425 @@
+/****************************************************************************
+**
+**
+** Implementation of QFileInfo class
+**
+** Created : 950628
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses for Unix/X11 or for Qt/Embedded may use this file in accordance
+** with the Qt Commercial License Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglobal.h"
+
+#if defined(_OS_SUN_)
+#define readlink _qt_hide_readlink
+#endif
+
+#include <pwd.h>
+#include <grp.h>
+
+#include "qfileinfo.h"
+#include "qfiledefs_p.h"
+#include "qdatetime.h"
+#include "qdir.h"
+
+#if defined(_OS_SUN_)
+#undef readlink
+extern "C" int readlink( const char *, void *, uint );
+#endif
+
+
+void QFileInfo::slashify( QString& )
+{
+ return;
+}
+
+
+void QFileInfo::makeAbs( QString & )
+{
+ return;
+}
+
+extern bool qt_file_access( const QString& fn, int t );
+
+/*!
+ Returns TRUE if we are pointing to a real file.
+ \sa isDir(), isSymLink()
+*/
+bool QFileInfo::isFile() const
+{
+ if ( !fic || !cache )
+ doStat();
+ return fic ? (fic->st.st_mode & STAT_MASK) == STAT_REG : FALSE;
+}
+
+/*!
+ Returns TRUE if we are pointing to a directory or a symbolic link to
+ a directory.
+ \sa isFile(), isSymLink()
+*/
+
+bool QFileInfo::isDir() const
+{
+ if ( !fic || !cache )
+ doStat();
+ return fic ? (fic->st.st_mode & STAT_MASK) == STAT_DIR : FALSE;
+}
+
+/*!
+ Returns TRUE if we are pointing to a symbolic link.
+ \sa isFile(), isDir(), readLink()
+*/
+
+bool QFileInfo::isSymLink() const
+{
+ if ( !fic || !cache )
+ doStat();
+ return fic ? fic->isSymLink : FALSE;
+}
+
+
+/*!
+ Returns the name a symlink points to, or a null QString if the
+ object does not refer to a symbolic link.
+
+ This name may not represent an existing file; it is only a string.
+ QFileInfo::exists() returns TRUE if the symlink points to an
+ existing file.
+
+ \sa exists(), isSymLink(), isDir(), isFile()
+*/
+
+QString QFileInfo::readLink() const
+{
+ QString r;
+
+#if defined(_OS_UNIX_) && !defined(_OS_OS2EMX_)
+ char s[PATH_MAX+1];
+ if ( !isSymLink() )
+ return QString();
+ int len = readlink( QFile::encodeName(fn).data(), s, PATH_MAX );
+ if ( len >= 0 ) {
+ s[len] = '\0';
+ r = QFile::decodeName(s);
+ }
+#endif
+
+ return r;
+}
+
+static const uint nobodyID = (uint) -2;
+
+/*!
+ Returns the owner of the file.
+
+ On systems where files do not have owners this function returns 0.
+
+ Note that this function can be time-consuming under UNIX. (in the order
+ of milliseconds on a 486 DX2/66 running Linux).
+
+ \sa ownerId(), group(), groupId()
+*/
+
+QString QFileInfo::owner() const
+{
+ passwd *pw = getpwuid( ownerId() );
+ if ( pw )
+ return QFile::decodeName( pw->pw_name );
+ return QString::null;
+}
+
+/*!
+ Returns the id of the owner of the file.
+
+ On systems where files do not have owners this function returns ((uint) -2).
+
+ \sa owner(), group(), groupId()
+*/
+
+uint QFileInfo::ownerId() const
+{
+ if ( !fic || !cache )
+ doStat();
+ if ( fic )
+ return fic->st.st_uid;
+ return nobodyID;
+}
+
+/*!
+ Returns the group the file belongs to.
+
+ On systems where files do not have groups this function always
+ returns 0.
+
+ Note that this function can be time-consuming under UNIX (in the order of
+ milliseconds on a 486 DX2/66 running Linux).
+
+ \sa groupId(), owner(), ownerId()
+*/
+
+QString QFileInfo::group() const
+{
+ struct group *gr = getgrgid( groupId() );
+ if ( gr )
+ return QFile::decodeName( gr->gr_name );
+ return QString::null;
+}
+
+/*!
+ Returns the id of the group the file belongs to.
+
+ On systems where files do not have groups this function always
+ returns ((uind) -2).
+
+ \sa group(), owner(), ownerId()
+*/
+
+uint QFileInfo::groupId() const
+{
+ if ( !fic || !cache )
+ doStat();
+ if ( fic )
+ return fic->st.st_gid;
+ return nobodyID;
+}
+
+
+/*!
+ \fn bool QFileInfo::permission( int permissionSpec ) const
+
+ Tests for file permissions. The \e permissionSpec argument can be several
+ flags of type PermissionSpec or'ed together to check for permission
+ combinations.
+
+ On systems where files do not have permissions this function always
+ returns TRUE.
+
+ Example:
+ \code
+ QFileInfo fi( "/tmp/tonsils" );
+ if ( fi.permission( QFileInfo::WriteUser | QFileInfo::ReadGroup ) )
+ qWarning( "Tonsils can be changed by me, and the group can read them.");
+ if ( fi.permission( QFileInfo::WriteGroup | QFileInfo::WriteOther ) )
+ qWarning( "Danger! Tonsils can be changed by the group or others!" );
+ \endcode
+
+ \sa isReadable(), isWritable(), isExecutable()
+*/
+
+bool QFileInfo::permission( int permissionSpec ) const
+{
+ if ( !fic || !cache )
+ doStat();
+ if ( fic ) {
+ uint mask = 0;
+ if ( permissionSpec & ReadUser)
+ mask |= S_IRUSR;
+ if ( permissionSpec & WriteUser)
+ mask |= S_IWUSR;
+ if ( permissionSpec & ExeUser)
+ mask |= S_IXUSR;
+ if ( permissionSpec & ReadGroup)
+ mask |= S_IRGRP;
+ if ( permissionSpec & WriteGroup)
+ mask |= S_IWGRP;
+ if ( permissionSpec & ExeGroup)
+ mask |= S_IXGRP;
+ if ( permissionSpec & ReadOther)
+ mask |= S_IROTH;
+ if ( permissionSpec & WriteOther)
+ mask |= S_IWOTH;
+ if ( permissionSpec & ExeOther)
+ mask |= S_IXOTH;
+ if ( mask ) {
+ return (fic->st.st_mode & mask) == mask;
+ } else {
+#if defined(CHECK_NULL)
+ qWarning( "QFileInfo::permission: permissionSpec is 0" );
+#endif
+ return TRUE;
+ }
+ } else {
+ return FALSE;
+ }
+}
+
+/*!
+ Returns the file size in bytes, or 0 if the file does not exist if the size
+ cannot be fetched.
+*/
+
+uint QFileInfo::size() const
+{
+ if ( !fic || !cache )
+ doStat();
+ if ( fic )
+ return (uint)fic->st.st_size;
+ else
+ return 0;
+}
+
+
+/*!
+ Returns the date and time when the file was last modified.
+ \sa lastRead()
+*/
+
+QDateTime QFileInfo::lastModified() const
+{
+ QDateTime dt;
+ if ( !fic || !cache )
+ doStat();
+ if ( fic )
+ dt.setTime_t( fic->st.st_mtime );
+ return dt;
+}
+
+/*!
+ Returns the date and time when the file was last read (accessed).
+
+ On systems that do not support last read times, the modification time is
+ returned.
+
+ \sa lastModified()
+*/
+
+QDateTime QFileInfo::lastRead() const
+{
+ QDateTime dt;
+ if ( !fic || !cache )
+ doStat();
+ if ( fic )
+ dt.setTime_t( fic->st.st_atime );
+ return dt;
+}
+
+
+void QFileInfo::doStat() const
+{
+ QFileInfo *that = ((QFileInfo*)this); // mutable function
+ if ( !that->fic )
+ that->fic = new QFileInfoCache;
+ STATBUF *b = &that->fic->st;
+ that->fic->isSymLink = FALSE;
+
+#if defined(_OS_UNIX_) && defined(S_IFLNK)
+ if ( ::lstat(QFile::encodeName(fn),b) == 0 ) {
+ if ( S_ISLNK( b->st_mode ) )
+ that->fic->isSymLink = TRUE;
+ else
+ return;
+ }
+#endif
+ int r;
+
+ r = STAT( QFile::encodeName(fn), b );
+
+ if ( r != 0 ) {
+ delete that->fic;
+ that->fic = 0;
+ }
+}
+
+/*!
+ Returns the directory path of the file.
+
+ If \e absPath is TRUE an absolute path is always returned.
+
+ \sa dir(), filePath(), fileName(), isRelative()
+*/
+#ifndef QT_NO_DIR
+QString QFileInfo::dirPath( bool absPath ) const
+{
+ QString s;
+ if ( absPath )
+ s = absFilePath();
+ else
+ s = fn;
+ int pos = s.findRev( '/' );
+ if ( pos == -1 ) {
+ return QString::fromLatin1(".");
+ } else {
+ if ( pos == 0 )
+ return QString::fromLatin1( "/" );
+ return s.left( pos );
+ }
+}
+#endif
+/*!
+ Returns the name of the file, the file path is not included.
+
+ Example:
+ \code
+ QFileInfo fi( "/tmp/abdomen.lower" );
+ QString name = fi.fileName(); // name = "abdomen.lower"
+ \endcode
+
+ \sa isRelative(), filePath(), baseName(), extension()
+*/
+
+QString QFileInfo::fileName() const
+{
+ int p = fn.findRev( '/' );
+ if ( p == -1 ) {
+ return fn;
+ } else {
+ return fn.mid(p+1);
+ }
+}
+
+/*!
+ Returns the absolute path name.
+
+ The absolute path name is the file name including the absolute path. If
+ the QFileInfo is absolute (i.e. not relative) this function will return
+ the same string as filePath().
+
+ Note that this function can be time-consuming under UNIX. (in the order
+ of milliseconds on a 486 DX2/66 running Linux).
+
+ \sa isRelative(), filePath()
+*/
+#ifndef QT_NO_DIR
+QString QFileInfo::absFilePath() const
+{
+ if ( QDir::isRelativePath(fn) ) {
+ QString tmp = QDir::currentDirPath();
+ tmp += '/';
+ tmp += fn;
+ makeAbs( tmp );
+ return QDir::cleanDirPath( tmp );
+ } else {
+ QString tmp = fn;
+ makeAbs( tmp );
+ return QDir::cleanDirPath( tmp );
+ }
+
+}
+#endif
diff --git a/qtools/qfileinfo_win32.cpp b/qtools/qfileinfo_win32.cpp
new file mode 100644
index 0000000..8f83107
--- /dev/null
+++ b/qtools/qfileinfo_win32.cpp
@@ -0,0 +1,356 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Based on qfileinfo_unix.cpp
+ *
+ * Copyright (C) 1992-2000 Trolltech AS.
+ */
+
+#include "qglobal.h"
+
+#include "qfileinfo.h"
+#include "qfiledefs_p.h"
+#include "qdatetime.h"
+#include "qdir.h"
+
+static void reslashify( QString& n )
+{
+ for ( int i=0; i<(int)n.length(); i++ )
+ {
+ if ( n[i] == '/' )
+ n[i] = '\\';
+ }
+}
+
+void QFileInfo::slashify( QString& n )
+{
+ for ( int i=0; i<(int)n.length(); i++ )
+ {
+ if ( n[i] == '\\' )
+ n[i] = '/';
+ }
+}
+
+void QFileInfo::makeAbs( QString & )
+{
+ // TODO: what to do here?
+ return;
+}
+
+extern bool qt_file_access( const QString& fn, int t );
+
+/*!
+ Returns TRUE if we are pointing to a real file.
+ \sa isDir(), isSymLink()
+*/
+bool QFileInfo::isFile() const
+{
+ if ( !fic || !cache )
+ doStat();
+ return fic ? (fic->st.st_mode & STAT_MASK) == STAT_REG : FALSE;
+}
+
+/*!
+ Returns TRUE if we are pointing to a directory or a symbolic link to
+ a directory.
+ \sa isFile(), isSymLink()
+*/
+
+bool QFileInfo::isDir() const
+{
+ if ( !fic || !cache )
+ doStat();
+ return fic ? (fic->st.st_mode & STAT_MASK) == STAT_DIR : FALSE;
+}
+
+/*!
+ Returns TRUE if we are pointing to a symbolic link.
+ \sa isFile(), isDir(), readLink()
+*/
+
+bool QFileInfo::isSymLink() const
+{
+ if ( !fic || !cache )
+ doStat();
+ return fic ? fic->isSymLink : FALSE;
+}
+
+
+/*!
+ Returns the name a symlink points to, or a null QString if the
+ object does not refer to a symbolic link.
+
+ This name may not represent an existing file; it is only a string.
+ QFileInfo::exists() returns TRUE if the symlink points to an
+ existing file.
+
+ \sa exists(), isSymLink(), isDir(), isFile()
+*/
+
+QString QFileInfo::readLink() const
+{
+ QString r;
+ return r;
+}
+
+static const uint nobodyID = (uint) -2;
+
+/*!
+ Returns the owner of the file.
+
+ On systems where files do not have owners this function returns
+ a null string.
+
+ Note that this function can be time-consuming under UNIX. (in the order
+ of milliseconds on a 486 DX2/66 running Linux).
+
+ \sa ownerId(), group(), groupId()
+*/
+
+QString QFileInfo::owner() const
+{
+ return QString::null;
+}
+
+/*!
+ Returns the id of the owner of the file.
+
+ On systems where files do not have owners this function returns ((uint) -2).
+
+ \sa owner(), group(), groupId()
+*/
+
+uint QFileInfo::ownerId() const
+{
+ return (uint)-2;
+}
+
+/*!
+ Returns the group the file belongs to.
+
+ On systems where files do not have groups this function always
+ returns 0.
+
+ Note that this function can be time-consuming under UNIX (in the order of
+ milliseconds on a 486 DX2/66 running Linux).
+
+ \sa groupId(), owner(), ownerId()
+*/
+
+QString QFileInfo::group() const
+{
+ return QString::null;
+}
+
+/*!
+ Returns the id of the group the file belongs to.
+
+ On systems where files do not have groups this function always
+ returns ((uind) -2).
+
+ \sa group(), owner(), ownerId()
+*/
+
+uint QFileInfo::groupId() const
+{
+ return (uint)-2;
+}
+
+
+/*!
+ \fn bool QFileInfo::permission( int permissionSpec ) const
+
+ Tests for file permissions. The \e permissionSpec argument can be several
+ flags of type PermissionSpec or'ed together to check for permission
+ combinations.
+
+ On systems where files do not have permissions this function always
+ returns TRUE.
+
+ Example:
+ \code
+ QFileInfo fi( "/tmp/tonsils" );
+ if ( fi.permission( QFileInfo::WriteUser | QFileInfo::ReadGroup ) )
+ qWarning( "Tonsils can be changed by me, and the group can read them.");
+ if ( fi.permission( QFileInfo::WriteGroup | QFileInfo::WriteOther ) )
+ qWarning( "Danger! Tonsils can be changed by the group or others!" );
+ \endcode
+
+ \sa isReadable(), isWritable(), isExecutable()
+*/
+
+bool QFileInfo::permission( int permissionSpec ) const
+{
+ return TRUE;
+}
+
+/*!
+ Returns the file size in bytes, or 0 if the file does not exist if the size
+ cannot be fetched.
+*/
+
+uint QFileInfo::size() const
+{
+ if ( !fic || !cache )
+ doStat();
+ if ( fic )
+ return (uint)fic->st.st_size;
+ else
+ return 0;
+}
+
+
+/*!
+ Returns the date and time when the file was last modified.
+ \sa lastRead()
+*/
+
+QDateTime QFileInfo::lastModified() const
+{
+ QDateTime dt;
+ if ( !fic || !cache )
+ doStat();
+ if ( fic )
+ dt.setTime_t( fic->st.st_mtime );
+ return dt;
+}
+
+/*!
+ Returns the date and time when the file was last read (accessed).
+
+ On systems that do not support last read times, the modification time is
+ returned.
+
+ \sa lastModified()
+*/
+
+QDateTime QFileInfo::lastRead() const
+{
+ QDateTime dt;
+ if ( !fic || !cache )
+ doStat();
+ if ( fic )
+ dt.setTime_t( fic->st.st_atime );
+ return dt;
+}
+
+
+void QFileInfo::doStat() const
+{
+ QFileInfo *that = ((QFileInfo*)this); // mutable function
+ if ( !that->fic )
+ that->fic = new QFileInfoCache;
+ STATBUF *b = &that->fic->st;
+ that->fic->isSymLink = FALSE;
+
+#if defined(__CYGWIN32_)
+ int r;
+
+ r = STAT( QFile::encodeName(fn), b );
+
+ if ( r != 0 ) {
+ delete that->fic;
+ that->fic = 0;
+ }
+#else
+ QString file = fn;
+ reslashify(file);
+#ifdef QT_LARGEFILE_SUPPORT
+ if ( _wstati64( (wchar_t*) file.ucs2(), b ) == -1 ) {
+#else
+ if ( _wstat( (wchar_t*) file.ucs2(), b ) == -1 ) {
+#endif
+ delete that->fic;
+ that->fic = 0;
+ }
+#endif
+}
+
+/*!
+ Returns the directory path of the file.
+
+ If \e absPath is TRUE an absolute path is always returned.
+
+ \sa dir(), filePath(), fileName(), isRelative()
+*/
+#ifndef QT_NO_DIR
+QString QFileInfo::dirPath( bool absPath ) const
+{
+ QString s;
+ if ( absPath )
+ s = absFilePath();
+ else
+ s = fn;
+ int pos = s.findRev( '/' );
+ if ( pos == -1 ) {
+ return QString::fromLatin1(".");
+ } else {
+ if ( pos == 0 )
+ return QString::fromLatin1( "/" );
+ return s.left( pos );
+ }
+}
+#endif
+/*!
+ Returns the name of the file, the file path is not included.
+
+ Example:
+ \code
+ QFileInfo fi( "/tmp/abdomen.lower" );
+ QString name = fi.fileName(); // name = "abdomen.lower"
+ \endcode
+
+ \sa isRelative(), filePath(), baseName(), extension()
+*/
+
+QString QFileInfo::fileName() const
+{
+ int p = fn.findRev( '/' );
+ if ( p == -1 ) {
+ return fn;
+ } else {
+ return fn.mid(p+1);
+ }
+}
+
+/*!
+ Returns the absolute path name.
+
+ The absolute path name is the file name including the absolute path. If
+ the QFileInfo is absolute (i.e. not relative) this function will return
+ the same string as filePath().
+
+ Note that this function can be time-consuming under UNIX. (in the order
+ of milliseconds on a 486 DX2/66 running Linux).
+
+ \sa isRelative(), filePath()
+*/
+#ifndef QT_NO_DIR
+QString QFileInfo::absFilePath() const
+{
+ if ( QDir::isRelativePath(fn) ) {
+ QString tmp = QDir::currentDirPath();
+ tmp += '/';
+ tmp += fn;
+ makeAbs( tmp );
+ return QDir::cleanDirPath( tmp );
+ } else {
+ QString tmp = fn;
+ makeAbs( tmp );
+ return QDir::cleanDirPath( tmp );
+ }
+
+}
+#endif
diff --git a/qtools/qgarray.cpp b/qtools/qgarray.cpp
new file mode 100644
index 0000000..efc9de0
--- /dev/null
+++ b/qtools/qgarray.cpp
@@ -0,0 +1,747 @@
+/****************************************************************************
+**
+**
+** Implementation of QGArray class
+**
+** Created : 930906
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#define QGARRAY_CPP
+#include "qgarray.h"
+#include "qstring.h"
+#include <stdlib.h>
+
+#define USE_MALLOC // comment to use new/delete
+
+#undef NEW
+#undef DELETE
+
+#if defined(USE_MALLOC)
+#define NEW(type,size) ((type*)malloc(size*sizeof(type)))
+#define DELETE(array) (free((char*)array))
+#else
+#define NEW(type,size) (new type[size])
+#define DELETE(array) (delete[] array)
+#define DONT_USE_REALLOC // comment to use realloc()
+#endif
+
+
+// NOT REVISED
+/*!
+ \class QShared qshared.h
+ \brief The QShared struct is internally used for implementing shared classes.
+
+ It only contains a reference count and member functions to increment and
+ decrement it.
+
+ Shared classes normally have internal classes that inherit QShared and
+ add the shared data.
+
+ \sa \link shclass.html Shared Classes\endlink
+*/
+
+
+/*!
+ \class QGArray qgarray.h
+ \brief The QGArray class is an internal class for implementing the QArray class.
+
+ QGArray is a strictly internal class that acts as base class for the
+ QArray template array.
+
+ It contains an array of bytes and has no notion of an array element.
+*/
+
+
+/*!
+ \internal
+ Constructs a null array.
+*/
+
+QGArray::QGArray()
+{
+ shd = newData();
+ CHECK_PTR( shd );
+}
+
+/*!
+ \internal
+ Dummy constructor; does not allocate any data.
+
+ This constructor does not initialize any array data so subclasses
+ must do it. The intention is to make the code more efficient.
+*/
+
+QGArray::QGArray( int, int )
+{
+}
+
+/*!
+ \internal
+ Constructs an array with room for \e size bytes.
+*/
+
+QGArray::QGArray( int size )
+{
+ if ( size < 0 ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QGArray: Cannot allocate array with negative length" );
+#endif
+ size = 0;
+ }
+ shd = newData();
+ CHECK_PTR( shd );
+ if ( size == 0 ) // zero length
+ return;
+ shd->data = NEW(char,size);
+ CHECK_PTR( shd->data );
+ shd->len = size;
+}
+
+/*!
+ \internal
+ Constructs a shallow copy of \e a.
+*/
+
+QGArray::QGArray( const QGArray &a )
+{
+ shd = a.shd;
+ shd->ref();
+}
+
+/*!
+ \internal
+ Dereferences the array data and deletes it if this was the last
+ reference.
+*/
+
+QGArray::~QGArray()
+{
+ if ( shd && shd->deref() ) { // delete when last reference
+ if ( shd->data ) // is lost
+ DELETE(shd->data);
+ deleteData( shd );
+ }
+}
+
+
+/*!
+ \fn QGArray &QGArray::operator=( const QGArray &a )
+ \internal
+ Assigns a shallow copy of \e a to this array and returns a reference to
+ this array. Equivalent to assign().
+*/
+
+/*!
+ \fn void QGArray::detach()
+ \internal
+ Detaches this array from shared array data.
+*/
+
+/*!
+ \fn char *QGArray::data() const
+ \internal
+ Returns a pointer to the actual array data.
+*/
+
+/*!
+ \fn uint QGArray::nrefs() const
+ \internal
+ Returns the reference count.
+*/
+
+/*!
+ \fn uint QGArray::size() const
+ \internal
+ Returns the size of the array, in bytes.
+*/
+
+
+/*!
+ \internal
+ Returns TRUE if this array is equal to \e a, otherwise FALSE.
+ The comparison is bitwise, of course.
+*/
+
+bool QGArray::isEqual( const QGArray &a ) const
+{
+ if ( size() != a.size() ) // different size
+ return FALSE;
+ if ( data() == a.data() ) // has same data
+ return TRUE;
+ return (size() ? memcmp( data(), a.data(), size() ) : 0) == 0;
+}
+
+
+/*!
+ \internal
+ Resizes the array to \e newsize bytes.
+*/
+
+bool QGArray::resize( uint newsize )
+{
+ if ( newsize == shd->len ) // nothing to do
+ return TRUE;
+ if ( newsize == 0 ) { // remove array
+ duplicate( 0, 0 );
+ return TRUE;
+ }
+ if ( shd->data ) { // existing data
+#if defined(DONT_USE_REALLOC)
+ char *newdata = NEW(char,newsize); // manual realloc
+ memcpy( newdata, shd->data, QMIN(shd->len,newsize) );
+ DELETE(shd->data);
+ shd->data = newdata;
+#else
+ shd->data = (char *)realloc( shd->data, newsize );
+#endif
+ } else {
+ shd->data = NEW(char,newsize);
+ }
+ CHECK_PTR( shd->data );
+ if ( !shd->data ) // no memory
+ return FALSE;
+ shd->len = newsize;
+ return TRUE;
+}
+
+/*!
+ \internal
+ Fills the array with the repeated occurrences of \e d, which is
+ \e sz bytes long.
+ If \e len is specified as different from -1, then the array will be
+ resized to \e len*sz before it is filled.
+
+ Returns TRUE if successful, or FALSE if the memory cannot be allocated
+ (only when \e len != -1).
+
+ \sa resize()
+*/
+
+bool QGArray::fill( const char *d, int len, uint sz )
+{
+ if ( len < 0 )
+ len = shd->len/sz; // default: use array length
+ else if ( !resize( len*sz ) )
+ return FALSE;
+ if ( sz == 1 ) // 8 bit elements
+ memset( data(), *d, len );
+ else if ( sz == 4 ) { // 32 bit elements
+ register Q_INT32 *x = (Q_INT32*)data();
+ Q_INT32 v = *((Q_INT32*)d);
+ while ( len-- )
+ *x++ = v;
+ } else if ( sz == 2 ) { // 16 bit elements
+ register Q_INT16 *x = (Q_INT16*)data();
+ Q_INT16 v = *((Q_INT16*)d);
+ while ( len-- )
+ *x++ = v;
+ } else { // any other size elements
+ register char *x = data();
+ while ( len-- ) { // more complicated
+ memcpy( x, d, sz );
+ x += sz;
+ }
+ }
+ return TRUE;
+}
+
+/*!
+ \internal
+ Shallow copy. Dereference the current array and references the data
+ contained in \e a instead. Returns a reference to this array.
+ \sa operator=()
+*/
+
+QGArray &QGArray::assign( const QGArray &a )
+{
+ a.shd->ref(); // avoid 'a = a'
+ if ( shd->deref() ) { // delete when last reference
+ if ( shd->data ) // is lost
+ DELETE(shd->data);
+ deleteData( shd );
+ }
+ shd = a.shd;
+ return *this;
+}
+
+/*!
+ \internal
+ Shallow copy. Dereference the current array and references the
+ array data \e d, which contains \e len bytes.
+ Returns a reference to this array.
+
+ Do not delete \e d later, because QGArray takes care of that.
+*/
+
+QGArray &QGArray::assign( const char *d, uint len )
+{
+ if ( shd->count > 1 ) { // disconnect this
+ shd->count--;
+ shd = newData();
+ CHECK_PTR( shd );
+ } else {
+ if ( shd->data )
+ DELETE(shd->data);
+ }
+ shd->data = (char *)d;
+ shd->len = len;
+ return *this;
+}
+
+/*!
+ \internal
+ Deep copy. Dereference the current array and obtains a copy of the data
+ contained in \e a instead. Returns a reference to this array.
+ \sa assign(), operator=()
+*/
+
+QGArray &QGArray::duplicate( const QGArray &a )
+{
+ if ( a.shd == shd ) { // a.duplicate(a) !
+ if ( shd->count > 1 ) {
+ shd->count--;
+ register array_data *n = newData();
+ CHECK_PTR( n );
+ if ( (n->len=shd->len) ) {
+ n->data = NEW(char,n->len);
+ CHECK_PTR( n->data );
+ if ( n->data )
+ memcpy( n->data, shd->data, n->len );
+ } else {
+ n->data = 0;
+ }
+ shd = n;
+ }
+ return *this;
+ }
+ char *oldptr = 0;
+ if ( shd->count > 1 ) { // disconnect this
+ shd->count--;
+ shd = newData();
+ CHECK_PTR( shd );
+ } else { // delete after copy was made
+ oldptr = shd->data;
+ }
+ if ( a.shd->len ) { // duplicate data
+ shd->data = NEW(char,a.shd->len);
+ CHECK_PTR( shd->data );
+ if ( shd->data )
+ memcpy( shd->data, a.shd->data, a.shd->len );
+ } else {
+ shd->data = 0;
+ }
+ shd->len = a.shd->len;
+ if ( oldptr )
+ DELETE(oldptr);
+ return *this;
+}
+
+/*!
+ \internal
+ Deep copy. Dereferences the current array and obtains a copy of the
+ array data \e d instead. Returns a reference to this array.
+ \sa assign(), operator=()
+*/
+
+QGArray &QGArray::duplicate( const char *d, uint len )
+{
+ char *data;
+ if ( d == 0 || len == 0 ) {
+ data = 0;
+ len = 0;
+ } else {
+ if ( shd->count == 1 && shd->len == len ) {
+ memcpy( shd->data, d, len ); // use same buffer
+ return *this;
+ }
+ data = NEW(char,len);
+ CHECK_PTR( data );
+ memcpy( data, d, len );
+ }
+ if ( shd->count > 1 ) { // detach
+ shd->count--;
+ shd = newData();
+ CHECK_PTR( shd );
+ } else { // just a single reference
+ if ( shd->data )
+ DELETE(shd->data);
+ }
+ shd->data = data;
+ shd->len = len;
+ return *this;
+}
+
+/*!
+ \internal
+ Resizes this array to \e len bytes and copies the \e len bytes at
+ address \e into it.
+
+ \warning This function disregards the reference count mechanism. If
+ other QGArrays reference the same data as this, all will be updated.
+*/
+
+void QGArray::store( const char *d, uint len )
+{ // store, but not deref
+ resize( len );
+ memcpy( shd->data, d, len );
+}
+
+
+/*!
+ \fn array_data *QGArray::sharedBlock() const
+ \internal
+ Returns a pointer to the shared array block.
+
+ \warning
+
+ Do not use this function. Using it is begging for trouble. We dare
+ not remove it, for fear of breaking code, but we \e strongly
+ discourage new use of it.
+*/
+
+/*!
+ \fn void QGArray::setSharedBlock( array_data *p )
+ \internal
+ Sets the shared array block to \e p.
+
+ \warning
+
+ Do not use this function. Using it is begging for trouble. We dare
+ not remove it, for fear of breaking code, but we \e strongly
+ discourage new use of it.
+*/
+
+
+/*!
+ \internal
+ Sets raw data and returns a reference to the array.
+
+ Dereferences the current array and sets the new array data to \e d and
+ the new array size to \e len. Do not attempt to resize or re-assign the
+ array data when raw data has been set.
+ Call resetRawData(d,len) to reset the array.
+
+ Setting raw data is useful because it set QArray data without allocating
+ memory or copying data.
+
+ Example of intended use:
+ \code
+ static uchar bindata[] = { 231, 1, 44, ... };
+ QByteArray a;
+ a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
+ QDataStream s( a, IO_ReadOnly ); // open on a's data
+ s >> <something>; // read raw bindata
+ s.close();
+ a.resetRawData( bindata, sizeof(bindata) ); // finished
+ \endcode
+
+ Example of misuse (do not do this):
+ \code
+ static uchar bindata[] = { 231, 1, 44, ... };
+ QByteArray a, b;
+ a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
+ a.resize( 8 ); // will crash
+ b = a; // will crash
+ a[2] = 123; // might crash
+ // forget to resetRawData - will crash
+ \endcode
+
+ \warning If you do not call resetRawData(), QGArray will attempt to
+ deallocate or reallocate the raw data, which might not be too good.
+ Be careful.
+*/
+
+QGArray &QGArray::setRawData( const char *d, uint len )
+{
+ duplicate( 0, 0 ); // set null data
+ shd->data = (char *)d;
+ shd->len = len;
+ return *this;
+}
+
+/*!
+ \internal
+ Resets raw data.
+
+ The arguments must be the data and length that were passed to
+ setRawData(). This is for consistency checking.
+*/
+
+void QGArray::resetRawData( const char *d, uint len )
+{
+ if ( d != shd->data || len != shd->len ) {
+#if defined(CHECK_STATE)
+ qWarning( "QGArray::resetRawData: Inconsistent arguments" );
+#endif
+ return;
+ }
+ shd->data = 0;
+ shd->len = 0;
+}
+
+
+/*!
+ \internal
+ Finds the first occurrence of \e d in the array from position \e index,
+ where \e sz is the size of the \e d element.
+
+ Note that \e index is given in units of \e sz, not bytes.
+
+ This function only compares whole cells, not bytes.
+*/
+
+int QGArray::find( const char *d, uint index, uint sz ) const
+{
+ index *= sz;
+ if ( index >= shd->len ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QGArray::find: Index %d out of range", index/sz );
+#endif
+ return -1;
+ }
+ register uint i;
+ uint ii;
+ switch ( sz ) {
+ case 1: { // 8 bit elements
+ register char *x = data() + index;
+ char v = *d;
+ for ( i=index; i<shd->len; i++ ) {
+ if ( *x++ == v )
+ break;
+ }
+ ii = i;
+ }
+ break;
+ case 2: { // 16 bit elements
+ register Q_INT16 *x = (Q_INT16*)(data() + index);
+ Q_INT16 v = *((Q_INT16*)d);
+ for ( i=index; i<shd->len; i+=2 ) {
+ if ( *x++ == v )
+ break;
+ }
+ ii = i/2;
+ }
+ break;
+ case 4: { // 32 bit elements
+ register Q_INT32 *x = (Q_INT32*)(data() + index);
+ Q_INT32 v = *((Q_INT32*)d);
+ for ( i=index; i<shd->len; i+=4 ) {
+ if ( *x++ == v )
+ break;
+ }
+ ii = i/4;
+ }
+ break;
+ default: { // any size elements
+ for ( i=index; i<shd->len; i+=sz ) {
+ if ( memcmp( d, &shd->data[i], sz ) == 0 )
+ break;
+ }
+ ii = i/sz;
+ }
+ break;
+ }
+ return i<shd->len ? (int)ii : -1;
+}
+
+/*!
+ \internal
+ Returns the number of occurrences of \e d in the array, where \e sz is
+ the size of the \e d element.
+
+ This function only compares whole cells, not bytes.
+*/
+
+int QGArray::contains( const char *d, uint sz ) const
+{
+ register uint i = shd->len;
+ int count = 0;
+ switch ( sz ) {
+ case 1: { // 8 bit elements
+ register char *x = data();
+ char v = *d;
+ while ( i-- ) {
+ if ( *x++ == v )
+ count++;
+ }
+ }
+ break;
+ case 2: { // 16 bit elements
+ register Q_INT16 *x = (Q_INT16*)data();
+ Q_INT16 v = *((Q_INT16*)d);
+ i /= 2;
+ while ( i-- ) {
+ if ( *x++ == v )
+ count++;
+ }
+ }
+ break;
+ case 4: { // 32 bit elements
+ register Q_INT32 *x = (Q_INT32*)data();
+ Q_INT32 v = *((Q_INT32*)d);
+ i /= 4;
+ while ( i-- ) {
+ if ( *x++ == v )
+ count++;
+ }
+ }
+ break;
+ default: { // any size elements
+ for ( i=0; i<shd->len; i+=sz ) {
+ if ( memcmp(d, &shd->data[i], sz) == 0 )
+ count++;
+ }
+ }
+ break;
+ }
+ return count;
+}
+
+static int cmp_item_size = 0;
+
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+static int cmp_arr( const void *n1, const void *n2 )
+{
+ return ( n1 && n2 ) ? memcmp( n1, n2, cmp_item_size )
+ : (int)((long)n1 - (long)n2);
+ // Qt 3.0: Add a virtual compareItems() method and call that instead
+}
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+/*!
+ \internal
+
+ Sort the array.
+*/
+
+void QGArray::sort( uint sz )
+{
+ int numItems = size() / sz;
+ if ( numItems < 2 )
+ return;
+ cmp_item_size = sz;
+ qsort( shd->data, numItems, sz, cmp_arr );
+}
+
+/*!
+ \internal
+
+ Binary search; assumes sorted array
+*/
+
+int QGArray::bsearch( const char *d, uint sz ) const
+{
+ int numItems = size() / sz;
+ if ( !numItems )
+ return -1;
+ cmp_item_size = sz;
+ char* r = (char*)::bsearch( d, shd->data, numItems, sz, cmp_arr );
+ if ( !r )
+ return -1;
+ while( (r >= shd->data + sz) && (cmp_arr( r - sz, d ) == 0) )
+ r -= sz; // search to first of equal elements; bsearch is undef
+ return (int)(( r - shd->data ) / sz);
+}
+
+
+/*!
+ \fn char *QGArray::at( uint index ) const
+ \internal
+ Returns a pointer to the byte at offset \e index in the array.
+*/
+
+/*!
+ \internal
+ Expand the array if necessary, and copies (the first part of) its
+ contents from the \e index*zx bytes at \e d.
+
+ Returns TRUE if the operation succeeds, FALSE if it runs out of
+ memory.
+
+ \warning This function disregards the reference count mechanism. If
+ other QGArrays reference the same data as this, all will be changed.
+*/
+
+bool QGArray::setExpand( uint index, const char *d, uint sz )
+{
+ index *= sz;
+ if ( index >= shd->len ) {
+ if ( !resize( index+sz ) ) // no memory
+ return FALSE;
+ }
+ memcpy( data() + index, d, sz );
+ return TRUE;
+}
+
+
+/*!
+ \internal
+ Prints a warning message if at() or [] is given a bad index.
+*/
+
+void QGArray::msg_index( uint index )
+{
+#if defined(CHECK_RANGE)
+ qWarning( "QGArray::at: Absolute index %d out of range", index );
+#else
+ Q_UNUSED( index )
+#endif
+}
+
+
+/*!
+ \internal
+ Returns a new shared array block.
+*/
+
+QGArray::array_data * QGArray::newData()
+{
+ return new array_data;
+}
+
+
+/*!
+ \internal
+ Deletes the shared array block.
+*/
+
+void QGArray::deleteData( array_data *p )
+{
+ delete p;
+ p = 0;
+}
diff --git a/qtools/qgarray.h b/qtools/qgarray.h
new file mode 100644
index 0000000..12c463b
--- /dev/null
+++ b/qtools/qgarray.h
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+**
+** Definition of QGArray class
+**
+** Created : 930906
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QGARRAY_H
+#define QGARRAY_H
+
+#ifndef QT_H
+#include "qshared.h"
+#endif // QT_H
+
+
+class Q_EXPORT QGArray // generic array
+{
+friend class QBuffer;
+public:
+ //### DO NOT USE THIS. IT IS PUBLIC BUT DO NOT USE IT IN NEW CODE.
+ struct array_data : public QShared { // shared array
+ array_data() { data=0; len=0; }
+ char *data; // actual array data
+ uint len;
+ };
+ QGArray();
+protected:
+ QGArray( int, int ); // dummy; does not alloc
+ QGArray( int size ); // allocate 'size' bytes
+ QGArray( const QGArray &a ); // shallow copy
+ virtual ~QGArray();
+
+ QGArray &operator=( const QGArray &a ) { return assign( a ); }
+
+ virtual void detach() { duplicate(*this); }
+
+ char *data() const { return shd->data; }
+ uint nrefs() const { return shd->count; }
+ uint size() const { return shd->len; }
+ bool isEqual( const QGArray &a ) const;
+
+ bool resize( uint newsize );
+
+ bool fill( const char *d, int len, uint sz );
+
+ QGArray &assign( const QGArray &a );
+ QGArray &assign( const char *d, uint len );
+ QGArray &duplicate( const QGArray &a );
+ QGArray &duplicate( const char *d, uint len );
+ void store( const char *d, uint len );
+
+ array_data *sharedBlock() const { return shd; }
+ void setSharedBlock( array_data *p ) { shd=(array_data*)p; }
+
+ QGArray &setRawData( const char *d, uint len );
+ void resetRawData( const char *d, uint len );
+
+ int find( const char *d, uint index, uint sz ) const;
+ int contains( const char *d, uint sz ) const;
+
+ void sort( uint sz );
+ int bsearch( const char *d, uint sz ) const;
+
+ char *at( uint index ) const;
+
+ bool setExpand( uint index, const char *d, uint sz );
+
+protected:
+ virtual array_data *newData();
+ virtual void deleteData( array_data *p );
+
+private:
+ static void msg_index( uint );
+ array_data *shd;
+};
+
+
+inline char *QGArray::at( uint index ) const
+{
+#if defined(CHECK_RANGE)
+ if ( index >= size() ) {
+ msg_index( index );
+ index = 0;
+ }
+#endif
+ return &shd->data[index];
+}
+
+
+#endif // QGARRAY_H
diff --git a/qtools/qgcache.cpp b/qtools/qgcache.cpp
new file mode 100644
index 0000000..89282c7
--- /dev/null
+++ b/qtools/qgcache.cpp
@@ -0,0 +1,868 @@
+/****************************************************************************
+**
+**
+** Implementation of QGCache and QGCacheIterator classes
+**
+** Created : 950208
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qgcache.h"
+#include "qlist.h"
+#include "qdict.h"
+#include "qstring.h"
+
+
+// NOT REVISED
+/*!
+ \class QGCache qgcache.h
+
+ \brief The QGCache class is an internal class for implementing QCache template classes.
+
+ QGCache is a strictly internal class that acts as a base class for the
+ \link collection.html collection classes\endlink QCache and QIntCache.
+*/
+
+
+/*****************************************************************************
+ QGCacheItem class (internal cache item)
+ *****************************************************************************/
+
+struct QCacheItem
+{
+ QCacheItem( void *k, QCollection::Item d, int c, short p )
+ : priority(p), skipPriority(p), cost(c), key(k), data(d), node(0) {}
+ short priority;
+ short skipPriority;
+ int cost;
+ void *key;
+ QCollection::Item data;
+ QLNode *node;
+};
+
+
+/*****************************************************************************
+ QCList class (internal list of cache items)
+ *****************************************************************************/
+
+class QCList : private QList<QCacheItem>
+{
+friend class QGCacheIterator;
+friend class QCListIt;
+public:
+ QCList() {}
+ ~QCList();
+
+ void insert( QCacheItem * ); // insert according to priority
+ void insert( int, QCacheItem * );
+ void take( QCacheItem * );
+ void reference( QCacheItem * );
+
+ void setAutoDelete( bool del ) { QCollection::setAutoDelete(del); }
+
+ bool removeFirst() { return QList<QCacheItem>::removeFirst(); }
+ bool removeLast() { return QList<QCacheItem>::removeLast(); }
+
+ QCacheItem *first() { return QList<QCacheItem>::first(); }
+ QCacheItem *last() { return QList<QCacheItem>::last(); }
+ QCacheItem *prev() { return QList<QCacheItem>::prev(); }
+ QCacheItem *next() { return QList<QCacheItem>::next(); }
+
+#if defined(DEBUG)
+ int inserts; // variables for statistics
+ int insertCosts;
+ int insertMisses;
+ int finds;
+ int hits;
+ int hitCosts;
+ int dumps;
+ int dumpCosts;
+#endif
+};
+
+
+QCList::~QCList()
+{
+#if defined(DEBUG)
+ ASSERT( count() == 0 );
+#endif
+}
+
+
+void QCList::insert( QCacheItem *ci )
+{
+ QCacheItem *item = first();
+ while( item && item->skipPriority > ci->priority ) {
+ item->skipPriority--;
+ item = next();
+ }
+ if ( item )
+ QList<QCacheItem>::insert( at(), ci );
+ else
+ append( ci );
+#if defined(DEBUG)
+ ASSERT( ci->node == 0 );
+#endif
+ ci->node = currentNode();
+}
+
+inline void QCList::insert( int i, QCacheItem *ci )
+{
+ QList<QCacheItem>::insert( i, ci );
+#if defined(DEBUG)
+ ASSERT( ci->node == 0 );
+#endif
+ ci->node = currentNode();
+}
+
+
+void QCList::take( QCacheItem *ci )
+{
+ if ( ci ) {
+#if defined(DEBUG)
+ ASSERT( ci->node != 0 );
+#endif
+ takeNode( ci->node );
+ ci->node = 0;
+ }
+}
+
+
+inline void QCList::reference( QCacheItem *ci )
+{
+#if defined(DEBUG)
+ ASSERT( ci != 0 && ci->node != 0 );
+#endif
+ ci->skipPriority = ci->priority;
+ relinkNode( ci->node ); // relink as first item
+}
+
+
+class QCListIt: public QListIterator<QCacheItem>
+{
+public:
+ QCListIt( const QCList *p ): QListIterator<QCacheItem>( *p ) {}
+ QCListIt( const QCListIt *p ): QListIterator<QCacheItem>( *p ) {}
+};
+
+
+/*****************************************************************************
+ QCDict class (internal dictionary of cache items)
+ *****************************************************************************/
+
+//
+// Since we need to decide if the dictionary should use an int or const
+// char * key (the "bool trivial" argument in the constructor below)
+// we cannot use the macro/template dict, but inherit directly from QGDict.
+//
+
+class QCDict : public QGDict
+{
+public:
+ QCDict( uint size, uint kt, bool caseSensitive, bool copyKeys )
+ : QGDict( size, (KeyType)kt, caseSensitive, copyKeys ) {}
+
+ QCacheItem *find_string(const QString &key) const
+ { return (QCacheItem*)((QCDict*)this)->look_string(key, 0, 0); }
+ QCacheItem *find_ascii(const char *key) const
+ { return (QCacheItem*)((QCDict*)this)->look_ascii(key, 0, 0); }
+ QCacheItem *find_int(long key) const
+ { return (QCacheItem*)((QCDict*)this)->look_int(key, 0, 0); }
+
+ QCacheItem *take_string(const QString &key)
+ { return (QCacheItem*)QGDict::take_string(key); }
+ QCacheItem *take_ascii(const char *key)
+ { return (QCacheItem*)QGDict::take_ascii(key); }
+ QCacheItem *take_int(long key)
+ { return (QCacheItem*)QGDict::take_int(key); }
+
+ bool insert_string( const QString &key, const QCacheItem *ci )
+ { return QGDict::look_string(key,(Item)ci,1)!=0;}
+ bool insert_ascii( const char *key, const QCacheItem *ci )
+ { return QGDict::look_ascii(key,(Item)ci,1)!=0;}
+ bool insert_int( long key, const QCacheItem *ci )
+ { return QGDict::look_int(key,(Item)ci,1)!=0;}
+
+ bool remove_string( QCacheItem *item )
+ { return QGDict::remove_string(*((QString*)(item->key)),item); }
+ bool remove_ascii( QCacheItem *item )
+ { return QGDict::remove_ascii((const char *)item->key,item); }
+ bool remove_int( QCacheItem *item )
+ { return QGDict::remove_int((long)item->key,item);}
+
+ void statistics() { QGDict::statistics(); }
+};
+
+
+/*****************************************************************************
+ QGDict member functions
+ *****************************************************************************/
+
+/*!
+ \internal
+ Constructs a cache.
+*/
+
+QGCache::QGCache( int maxCost, uint size, KeyType kt, bool caseSensitive,
+ bool copyKeys )
+{
+ keytype = kt;
+ lruList = new QCList;
+ CHECK_PTR( lruList );
+ lruList->setAutoDelete( TRUE );
+ copyk = ((keytype == AsciiKey) && copyKeys);
+ dict = new QCDict( size, kt, caseSensitive, FALSE );
+ CHECK_PTR( dict );
+ mCost = maxCost;
+ tCost = 0;
+#if defined(DEBUG)
+ lruList->inserts = 0;
+ lruList->insertCosts = 0;
+ lruList->insertMisses = 0;
+ lruList->finds = 0;
+ lruList->hits = 0;
+ lruList->hitCosts = 0;
+ lruList->dumps = 0;
+ lruList->dumpCosts = 0;
+#endif
+}
+
+/*!
+ \internal
+ Cannot copy a cache.
+*/
+
+QGCache::QGCache( const QGCache & )
+ : QCollection()
+{
+#if defined(CHECK_NULL)
+ qFatal( "QGCache::QGCache(QGCache &): Cannot copy a cache" );
+#endif
+}
+
+/*!
+ \internal
+ Removes all items from the cache and destroys it.
+*/
+
+QGCache::~QGCache()
+{
+ clear(); // delete everything first
+ delete dict;
+ delete lruList;
+}
+
+/*!
+ \internal
+ Cannot assign a cache.
+*/
+
+QGCache &QGCache::operator=( const QGCache & )
+{
+#if defined(CHECK_NULL)
+ qFatal( "QGCache::operator=: Cannot copy a cache" );
+#endif
+ return *this; // satisfy the compiler
+}
+
+
+/*!
+ \fn uint QGCache::count() const
+ \internal
+ Returns the number of items in the cache.
+*/
+
+/*!
+ \fn uint QGCache::size() const
+ \internal
+ Returns the size of the hash array.
+*/
+
+/*!
+ \fn int QGCache::maxCost() const
+ \internal
+ Returns the maximum cache cost.
+*/
+
+/*!
+ \fn int QGCache::totalCost() const
+ \internal
+ Returns the total cache cost.
+*/
+
+/*!
+ \internal
+ Sets the maximum cache cost.
+*/
+
+void QGCache::setMaxCost( int maxCost )
+{
+ if ( maxCost < tCost ) {
+ if ( !makeRoomFor(tCost - maxCost) ) // remove excess cost
+ return;
+ }
+ mCost = maxCost;
+}
+
+
+/*!
+ \internal
+ Inserts an item into the cache.
+
+ \warning If this function returns FALSE, you must delete \a data
+ yourself. Additionally, be very careful about using \a data after
+ calling this function, as any other insertions into the cache, from
+ anywhere in the application, or within Qt itself, could cause the
+ data to be discarded from the cache, and the pointer to become
+ invalid.
+*/
+
+bool QGCache::insert_string( const QString &key, QCollection::Item data,
+ int cost, int priority)
+{
+ if ( tCost + cost > mCost ) {
+ if ( !makeRoomFor(tCost + cost - mCost, priority) ) {
+#if defined(DEBUG)
+ lruList->insertMisses++;
+#endif
+ return FALSE;
+ }
+ }
+#if defined(DEBUG)
+ ASSERT( keytype == StringKey );
+ lruList->inserts++;
+ lruList->insertCosts += cost;
+#endif
+ if ( priority < -32768 )
+ priority = -32768;
+ else if ( priority > 32767 )
+ priority = 32677;
+ QCacheItem *ci = new QCacheItem( new QString(key), newItem(data),
+ cost, (short)priority );
+ CHECK_PTR( ci );
+ lruList->insert( 0, ci );
+ dict->insert_string( key, ci );
+ tCost += cost;
+ return TRUE;
+}
+
+
+/*! \internal */
+
+bool QGCache::insert_other( const char *key, QCollection::Item data,
+ int cost, int priority)
+{
+ if ( tCost + cost > mCost ) {
+ if ( !makeRoomFor(tCost + cost - mCost, priority) ) {
+#if defined(DEBUG)
+ lruList->insertMisses++;
+#endif
+ return FALSE;
+ }
+ }
+#if defined(DEBUG)
+ ASSERT( keytype != StringKey );
+ lruList->inserts++;
+ lruList->insertCosts += cost;
+#endif
+ if ( keytype == AsciiKey && copyk )
+ key = qstrdup( key );
+ if ( priority < -32768 )
+ priority = -32768;
+ else if ( priority > 32767 )
+ priority = 32677;
+ QCacheItem *ci = new QCacheItem( (void*)key, newItem(data), cost,
+ (short)priority );
+ CHECK_PTR( ci );
+ lruList->insert( 0, ci );
+ if ( keytype == AsciiKey )
+ dict->insert_ascii( key, ci );
+ else
+ dict->insert_int( (long)key, ci );
+ tCost += cost;
+ return TRUE;
+}
+
+
+/*!
+ \internal
+ Removes an item from the cache.
+*/
+
+bool QGCache::remove_string( const QString &key )
+{
+ Item d = take_string( key );
+ if ( d )
+ deleteItem( d );
+ return d != 0;
+}
+
+
+/*! \internal */
+
+bool QGCache::remove_other( const char *key )
+{
+ Item d = take_other( key );
+ if ( d )
+ deleteItem( d );
+ return d != 0;
+}
+
+
+/*!
+ \internal
+ Takes an item out of the cache (no delete).
+*/
+
+QCollection::Item QGCache::take_string( const QString &key )
+{
+ QCacheItem *ci = dict->take_string( key ); // take from dict
+ Item d;
+ if ( ci ) {
+ d = ci->data;
+ tCost -= ci->cost;
+ lruList->take( ci ); // take from list
+ delete (QString*)ci->key;
+ delete ci;
+ } else {
+ d = 0;
+ }
+ return d;
+}
+
+/*!
+ \internal
+ Takes an item out of the cache (no delete).
+*/
+
+QCollection::Item QGCache::take_other( const char *key )
+{
+ QCacheItem *ci;
+ if ( keytype == AsciiKey )
+ ci = dict->take_ascii( key );
+ else
+ ci = dict->take_int( (long)key );
+ Item d;
+ if ( ci ) {
+ d = ci->data;
+ tCost -= ci->cost;
+ lruList->take( ci ); // take from list
+ if ( copyk )
+ delete [] (char *)ci->key;
+ delete ci;
+ } else {
+ d = 0;
+ }
+ return d;
+}
+
+
+/*!
+ \internal
+ Clears the cache.
+*/
+
+void QGCache::clear()
+{
+ QCacheItem *ci;
+ while ( (ci = lruList->first()) ) {
+ switch ( keytype ) {
+ case StringKey:
+ dict->remove_string( ci );
+ delete (QString*)ci->key;
+ break;
+ case AsciiKey:
+ dict->remove_ascii( ci );
+ if ( copyk )
+ delete [] (char*)ci->key;
+ break;
+ case IntKey:
+ dict->remove_int( ci );
+ break;
+ case PtrKey: // unused
+ break;
+ }
+ deleteItem( ci->data ); // delete data
+ lruList->removeFirst(); // remove from list
+ }
+ tCost = 0;
+}
+
+
+/*!
+ \internal
+ Finds an item in the cache.
+*/
+
+QCollection::Item QGCache::find_string( const QString &key, bool ref ) const
+{
+ QCacheItem *ci = dict->find_string( key );
+#if defined(DEBUG)
+ lruList->finds++;
+#endif
+ if ( ci ) {
+#if defined(DEBUG)
+ lruList->hits++;
+ lruList->hitCosts += ci->cost;
+#endif
+ if ( ref )
+ lruList->reference( ci );
+ return ci->data;
+ }
+ return 0;
+}
+
+
+/*!
+ \internal
+ Finds an item in the cache.
+*/
+
+QCollection::Item QGCache::find_other( const char *key, bool ref ) const
+{
+ QCacheItem *ci = keytype == AsciiKey ? dict->find_ascii(key)
+ : dict->find_int((long)key);
+#if defined(DEBUG)
+ lruList->finds++;
+#endif
+ if ( ci ) {
+#if defined(DEBUG)
+ lruList->hits++;
+ lruList->hitCosts += ci->cost;
+#endif
+ if ( ref )
+ lruList->reference( ci );
+ return ci->data;
+ }
+ return 0;
+}
+
+
+/*!
+ \internal
+ Allocates cache space for one or more items.
+*/
+
+bool QGCache::makeRoomFor( int cost, int priority )
+{
+ if ( cost > mCost ) // cannot make room for more
+ return FALSE; // than maximum cost
+ if ( priority == -1 )
+ priority = 32767;
+ register QCacheItem *ci = lruList->last();
+ int cntCost = 0;
+ int dumps = 0; // number of items to dump
+ while ( cntCost < cost && ci && ci->skipPriority <= priority ) {
+ cntCost += ci->cost;
+ ci = lruList->prev();
+ dumps++;
+ }
+ if ( cntCost < cost ) // can enough cost be dumped?
+ return FALSE; // no
+#if defined(DEBUG)
+ ASSERT( dumps > 0 );
+#endif
+ while ( dumps-- ) {
+ ci = lruList->last();
+#if defined(DEBUG)
+ lruList->dumps++;
+ lruList->dumpCosts += ci->cost;
+#endif
+ switch ( keytype ) {
+ case StringKey:
+ dict->remove_string( ci );
+ delete (QString*)ci->key;
+ break;
+ case AsciiKey:
+ dict->remove_ascii( ci );
+ if ( copyk )
+ delete [] (char *)ci->key;
+ break;
+ case IntKey:
+ dict->remove_int( ci );
+ break;
+ case PtrKey: // unused
+ break;
+ }
+ deleteItem( ci->data ); // delete data
+ lruList->removeLast(); // remove from list
+ }
+ tCost -= cntCost;
+ return TRUE;
+}
+
+
+/*!
+ \internal
+ Outputs debug statistics.
+*/
+
+void QGCache::statistics() const
+{
+#if defined(DEBUG)
+ QString line;
+ line.fill( '*', 80 );
+ qDebug( "%s",line.ascii() );
+ qDebug( "CACHE STATISTICS:" );
+ qDebug( "cache contains %d item%s, with a total cost of %d",
+ count(), count() != 1 ? "s" : "", tCost );
+ qDebug( "maximum cost is %d, cache is %d%% full.",
+ mCost, (200*tCost + mCost) / (mCost*2) );
+ qDebug( "find() has been called %d time%s",
+ lruList->finds, lruList->finds != 1 ? "s" : "" );
+ qDebug( "%d of these were hits, items found had a total cost of %d.",
+ lruList->hits,lruList->hitCosts );
+ qDebug( "%d item%s %s been inserted with a total cost of %d.",
+ lruList->inserts,lruList->inserts != 1 ? "s" : "",
+ lruList->inserts != 1 ? "have" : "has", lruList->insertCosts );
+ qDebug( "%d item%s %s too large or had too low priority to be inserted.",
+ lruList->insertMisses, lruList->insertMisses != 1 ? "s" : "",
+ lruList->insertMisses != 1 ? "were" : "was" );
+ qDebug( "%d item%s %s been thrown away with a total cost of %d.",
+ lruList->dumps, lruList->dumps != 1 ? "s" : "",
+ lruList->dumps != 1 ? "have" : "has", lruList->dumpCosts );
+ qDebug( "Statistics from internal dictionary class:" );
+ dict->statistics();
+ qDebug( "%s",line.ascii() );
+#endif
+}
+
+
+/*****************************************************************************
+ QGCacheIterator member functions
+ *****************************************************************************/
+
+/*!
+ \class QGCacheIterator qgcache.h
+
+ \brief An internal class for implementing QCacheIterator and QIntCacheIterator.
+
+ QGCacheIterator is a strictly internal class that does the heavy work for
+ QCacheIterator and QIntCacheIterator.
+*/
+
+/*!
+ \internal
+ Constructs an iterator that operates on the cache \e c.
+*/
+
+QGCacheIterator::QGCacheIterator( const QGCache &c )
+{
+ it = new QCListIt( c.lruList );
+#if defined(DEBUG)
+ ASSERT( it != 0 );
+#endif
+}
+
+/*!
+ \internal
+ Constructs an iterator that operates on the same cache as \e ci.
+*/
+
+QGCacheIterator::QGCacheIterator( const QGCacheIterator &ci )
+{
+ it = new QCListIt( ci.it );
+#if defined(DEBUG)
+ ASSERT( it != 0 );
+#endif
+}
+
+/*!
+ \internal
+ Destroys the iterator.
+*/
+
+QGCacheIterator::~QGCacheIterator()
+{
+ delete it;
+}
+
+/*!
+ \internal
+ Assigns the iterator \e ci to this cache iterator.
+*/
+
+QGCacheIterator &QGCacheIterator::operator=( const QGCacheIterator &ci )
+{
+ *it = *ci.it;
+ return *this;
+}
+
+/*!
+ \internal
+ Returns the number of items in the cache.
+*/
+
+uint QGCacheIterator::count() const
+{
+ return it->count();
+}
+
+/*!
+ \internal
+ Returns TRUE if the iterator points to the first item.
+*/
+
+bool QGCacheIterator::atFirst() const
+{
+ return it->atFirst();
+}
+
+/*!
+ \internal
+ Returns TRUE if the iterator points to the last item.
+*/
+
+bool QGCacheIterator::atLast() const
+{
+ return it->atLast();
+}
+
+/*!
+ \internal
+ Sets the list iterator to point to the first item in the cache.
+*/
+
+QCollection::Item QGCacheIterator::toFirst()
+{
+ QCacheItem *item = it->toFirst();
+ return item ? item->data : 0;
+}
+
+/*!
+ \internal
+ Sets the list iterator to point to the last item in the cache.
+*/
+
+QCollection::Item QGCacheIterator::toLast()
+{
+ QCacheItem *item = it->toLast();
+ return item ? item->data : 0;
+}
+
+/*!
+ \internal
+ Returns the current item.
+*/
+
+QCollection::Item QGCacheIterator::get() const
+{
+ QCacheItem *item = it->current();
+ return item ? item->data : 0;
+}
+
+/*!
+ \internal
+ Returns the key of the current item.
+*/
+
+QString QGCacheIterator::getKeyString() const
+{
+ QCacheItem *item = it->current();
+ return item ? *((QString*)item->key) : QString::null;
+}
+
+/*!
+ \internal
+ Returns the key of the current item, as a \0-terminated C string.
+*/
+
+const char *QGCacheIterator::getKeyAscii() const
+{
+ QCacheItem *item = it->current();
+ return item ? (const char *)item->key : 0;
+}
+
+/*!
+ \internal
+ Returns the key of the current item, as a long.
+*/
+
+long QGCacheIterator::getKeyInt() const
+{
+ QCacheItem *item = it->current();
+ return item ? (long)item->key : 0;
+}
+
+/*!
+ \internal
+ Moves to the next item (postfix).
+*/
+
+QCollection::Item QGCacheIterator::operator()()
+{
+ QCacheItem *item = it->operator()();
+ return item ? item->data : 0;
+}
+
+/*!
+ \internal
+ Moves to the next item (prefix).
+*/
+
+QCollection::Item QGCacheIterator::operator++()
+{
+ QCacheItem *item = it->operator++();
+ return item ? item->data : 0;
+}
+
+/*!
+ \internal
+ Moves \e jumps positions forward.
+*/
+
+QCollection::Item QGCacheIterator::operator+=( uint jump )
+{
+ QCacheItem *item = it->operator+=(jump);
+ return item ? item->data : 0;
+}
+
+/*!
+ \internal
+ Moves to the previous item (prefix).
+*/
+
+QCollection::Item QGCacheIterator::operator--()
+{
+ QCacheItem *item = it->operator--();
+ return item ? item->data : 0;
+}
+
+/*!
+ \internal
+ Moves \e jumps positions backward.
+*/
+
+QCollection::Item QGCacheIterator::operator-=( uint jump )
+{
+ QCacheItem *item = it->operator-=(jump);
+ return item ? item->data : 0;
+}
diff --git a/qtools/qgcache.h b/qtools/qgcache.h
new file mode 100644
index 0000000..5c3e126
--- /dev/null
+++ b/qtools/qgcache.h
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+**
+** Definition of QGCache and QGCacheIterator classes
+**
+** Created : 950208
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QGCACHE_H
+#define QGCACHE_H
+
+#ifndef QT_H
+#include "qcollection.h"
+#include "qglist.h"
+#include "qgdict.h"
+#endif // QT_H
+
+
+class QCList; // internal classes
+class QCListIt;
+class QCDict;
+
+
+class Q_EXPORT QGCache : public QCollection // generic LRU cache
+{
+friend class QGCacheIterator;
+protected:
+ enum KeyType { StringKey, AsciiKey, IntKey, PtrKey };
+ // identical to QGDict's, but PtrKey is not used at the moment
+
+ QGCache( int maxCost, uint size, KeyType kt, bool caseSensitive,
+ bool copyKeys );
+ QGCache( const QGCache & ); // not allowed, calls fatal()
+ ~QGCache();
+ QGCache &operator=( const QGCache & ); // not allowed, calls fatal()
+
+ uint count() const { return ((QGDict*)dict)->count(); }
+ uint size() const { return ((QGDict*)dict)->size(); }
+ int maxCost() const { return mCost; }
+ int totalCost() const { return tCost; }
+ void setMaxCost( int maxCost );
+ void clear();
+
+ bool insert_string( const QString &key, QCollection::Item,
+ int cost, int priority );
+ bool insert_other( const char *key, QCollection::Item,
+ int cost, int priority );
+ bool remove_string( const QString &key );
+ bool remove_other( const char *key );
+ QCollection::Item take_string( const QString &key );
+ QCollection::Item take_other( const char *key );
+
+ QCollection::Item find_string( const QString &key, bool ref=TRUE ) const;
+ QCollection::Item find_other( const char *key, bool ref=TRUE ) const;
+
+ void statistics() const;
+
+private:
+ bool makeRoomFor( int cost, int priority = -1 );
+ KeyType keytype;
+ QCList *lruList;
+ QCDict *dict;
+ int mCost;
+ int tCost;
+ bool copyk;
+};
+
+
+class Q_EXPORT QGCacheIterator // generic cache iterator
+{
+protected:
+ QGCacheIterator( const QGCache & );
+ QGCacheIterator( const QGCacheIterator & );
+ ~QGCacheIterator();
+ QGCacheIterator &operator=( const QGCacheIterator & );
+
+ uint count() const;
+ bool atFirst() const;
+ bool atLast() const;
+ QCollection::Item toFirst();
+ QCollection::Item toLast();
+
+ QCollection::Item get() const;
+ QString getKeyString() const;
+ const char *getKeyAscii() const;
+ long getKeyInt() const;
+
+ QCollection::Item operator()();
+ QCollection::Item operator++();
+ QCollection::Item operator+=( uint );
+ QCollection::Item operator--();
+ QCollection::Item operator-=( uint );
+
+protected:
+ QCListIt *it; // iterator on cache list
+};
+
+
+#endif // QGCACHE_H
diff --git a/qtools/qgdict.cpp b/qtools/qgdict.cpp
new file mode 100644
index 0000000..e51b9c1
--- /dev/null
+++ b/qtools/qgdict.cpp
@@ -0,0 +1,1218 @@
+/****************************************************************************
+**
+**
+** Implementation of QGDict and QGDictIterator classes
+**
+** Created : 920529
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qgdict.h"
+#include "qlist.h"
+#include "qstring.h"
+#include "qdatastream.h"
+#include <ctype.h>
+
+// NOT REVISED
+/*!
+ \class QGDict qgdict.h
+ \brief The QGDict class is an internal class for implementing QDict template classes.
+
+ QGDict is a strictly internal class that acts as a base class for the
+ \link collection.html collection classes\endlink QDict and QIntDict.
+
+ QGDict has some virtual functions that can be reimplemented to customize
+ the subclasses.
+ <ul>
+ <li> read() reads a collection/dictionary item from a QDataStream.
+ <li> write() writes a collection/dictionary item to a QDataStream.
+ </ul>
+ Normally, you do not have to reimplement any of these functions.
+*/
+
+static const int op_find = 0;
+static const int op_insert = 1;
+static const int op_replace = 2;
+
+
+class QGDItList : public QList<QGDictIterator>
+{
+public:
+ QGDItList() : QList<QGDictIterator>() {}
+ QGDItList( const QGDItList &list ) : QList<QGDictIterator>(list) {}
+ ~QGDItList() { clear(); }
+ QGDItList &operator=(const QGDItList &list)
+ { return (QGDItList&)QList<QGDictIterator>::operator=(list); }
+};
+
+
+/*****************************************************************************
+ Default implementation of special and virtual functions
+ *****************************************************************************/
+
+/*!
+ \internal
+ Returns the hash key for \e key, when key is a string.
+*/
+
+int QGDict::hashKeyString( const QString &key )
+{
+#if defined(CHECK_NULL)
+ if ( key.isNull() )
+ qWarning( "QGDict::hashStringKey: Invalid null key" );
+#endif
+ int i;
+ register uint h=0;
+ uint g;
+ int len = key.length();
+ const QChar *p = key.unicode();
+ if ( cases ) { // case sensitive
+ for ( i=0; i<len; i++ ) {
+ h = (h<<4) + p[i].cell();
+ if ( (g = h & 0xf0000000) )
+ h ^= g >> 24;
+ h &= ~g;
+ }
+ } else { // case insensitive
+ for ( i=0; i<len; i++ ) {
+ h = (h<<4) + p[i].lower().cell();
+ if ( (g = h & 0xf0000000) )
+ h ^= g >> 24;
+ h &= ~g;
+ }
+ }
+ int index = h;
+ if ( index < 0 ) // adjust index to table size
+ index = -index;
+ return index;
+}
+
+/*!
+ \internal
+ Returns the hash key for \a key, which is a C string.
+*/
+
+int QGDict::hashKeyAscii( const char *key )
+{
+#if defined(CHECK_NULL)
+ if ( key == 0 )
+ {
+ qWarning( "QGDict::hashAsciiKey: Invalid null key" );
+ return 0;
+ }
+#endif
+ register const char *k = key;
+ register uint h=0;
+ uint g;
+ if ( cases ) { // case sensitive
+ while ( *k ) {
+ h = (h<<4) + *k++;
+ if ( (g = h & 0xf0000000) )
+ h ^= g >> 24;
+ h &= ~g;
+ }
+ } else { // case insensitive
+ while ( *k ) {
+ h = (h<<4) + tolower(*k);
+ if ( (g = h & 0xf0000000) )
+ h ^= g >> 24;
+ h &= ~g;
+ k++;
+ }
+ }
+ int index = h;
+ if ( index < 0 ) // adjust index to table size
+ index = -index;
+ return index;
+}
+
+#ifndef QT_NO_DATASTREAM
+
+/*!
+ Reads a collection/dictionary item from the stream \e s and returns a
+ reference to the stream.
+
+ The default implementation sets \e item to 0.
+
+ \sa write()
+*/
+
+QDataStream& QGDict::read( QDataStream &s, QCollection::Item &item )
+{
+ item = 0;
+ return s;
+}
+
+/*!
+ Writes a collection/dictionary item to the stream \e s and returns a
+ reference to the stream.
+
+ \sa read()
+*/
+
+QDataStream& QGDict::write( QDataStream &s, QCollection::Item ) const
+{
+ return s;
+}
+#endif //QT_NO_DATASTREAM
+
+/*****************************************************************************
+ QGDict member functions
+ *****************************************************************************/
+
+/*!
+ \internal
+ Constructs a dictionary.
+*/
+
+QGDict::QGDict( uint len, KeyType kt, bool caseSensitive, bool copyKeys )
+{
+ init( len, kt, caseSensitive, copyKeys );
+}
+
+
+void QGDict::init( uint len, KeyType kt, bool caseSensitive, bool copyKeys )
+{
+ vec = new QBaseBucket *[vlen = len]; // allocate hash table
+ CHECK_PTR( vec );
+ memset( (char*)vec, 0, vlen*sizeof(QBaseBucket*) );
+ numItems = 0;
+ iterators = 0;
+ // The caseSensitive and copyKey options don't make sense for
+ // all dict types.
+ switch ( (keytype = (uint)kt) ) {
+ case StringKey:
+ cases = caseSensitive;
+ copyk = FALSE;
+ break;
+ case AsciiKey:
+ cases = caseSensitive;
+ copyk = copyKeys;
+ break;
+ default:
+ cases = FALSE;
+ copyk = FALSE;
+ break;
+ }
+}
+
+
+/*!
+ \internal
+ Constructs a copy of \e dict.
+*/
+
+QGDict::QGDict( const QGDict & dict )
+ : QCollection( dict )
+{
+ init( dict.vlen, (KeyType)dict.keytype, dict.cases, dict.copyk );
+ QGDictIterator it( dict );
+ while ( it.get() ) { // copy from other dict
+ switch ( keytype ) {
+ case StringKey:
+ look_string( it.getKeyString(), it.get(), op_insert );
+ break;
+ case AsciiKey:
+ look_ascii( it.getKeyAscii(), it.get(), op_insert );
+ break;
+ case IntKey:
+ look_int( it.getKeyInt(), it.get(), op_insert );
+ break;
+ case PtrKey:
+ look_ptr( it.getKeyPtr(), it.get(), op_insert );
+ break;
+ }
+ ++it;
+ }
+}
+
+
+/*!
+ \internal
+ Removes all items from the dictionary and destroys it.
+*/
+
+QGDict::~QGDict()
+{
+ clear(); // delete everything
+ delete [] vec;
+ if ( !iterators ) // no iterators for this dict
+ return;
+ QGDictIterator *i = iterators->first();
+ while ( i ) { // notify all iterators that
+ i->dict = 0; // this dict is deleted
+ i = iterators->next();
+ }
+ delete iterators;
+}
+
+
+/*!
+ \internal
+ Assigns \e dict to this dictionary.
+*/
+
+QGDict &QGDict::operator=( const QGDict &dict )
+{
+ clear();
+ QGDictIterator it( dict );
+ while ( it.get() ) { // copy from other dict
+ switch ( keytype ) {
+ case StringKey:
+ look_string( it.getKeyString(), it.get(), op_insert );
+ break;
+ case AsciiKey:
+ look_ascii( it.getKeyAscii(), it.get(), op_insert );
+ break;
+ case IntKey:
+ look_int( it.getKeyInt(), it.get(), op_insert );
+ break;
+ case PtrKey:
+ look_ptr( it.getKeyPtr(), it.get(), op_insert );
+ break;
+ }
+ ++it;
+ }
+ return *this;
+}
+
+
+/*! \fn QCollection::Item QGDictIterator::get() const
+
+ \internal
+*/
+
+
+/*! \fn QString QGDictIterator::getKeyString() const
+
+ \internal
+*/
+
+
+/*! \fn const char * QGDictIterator::getKeyAscii() const
+
+ \internal
+*/
+
+
+/*! \fn void * QGDictIterator::getKeyPtr() const
+
+ \internal
+*/
+
+
+/*! \fn long QGDictIterator::getKeyInt() const
+
+ \internal
+*/
+
+
+/*!
+ \fn uint QGDict::count() const
+ \internal
+ Returns the number of items in the dictionary.
+*/
+
+/*!
+ \fn uint QGDict::size() const
+ \internal
+ Returns the size of the hash array.
+*/
+
+
+/*!
+ \internal
+ The do-it-all function; op is one of op_find, op_insert, op_replace
+*/
+
+QCollection::Item QGDict::look_string( const QString &key, QCollection::Item d, int op )
+{
+ QStringBucket *n;
+ int index = hashKeyString(key) % vlen;
+ if ( op == op_find ) { // find
+ if ( cases ) {
+ for ( n=(QStringBucket*)vec[index]; n;
+ n=(QStringBucket*)n->getNext() ) {
+ if ( key == n->getKey() )
+ return n->getData(); // item found
+ }
+ } else {
+ QString k = key.lower();
+ for ( n=(QStringBucket*)vec[index]; n;
+ n=(QStringBucket*)n->getNext() ) {
+ if ( k == n->getKey().lower() )
+ return n->getData(); // item found
+ }
+ }
+ return 0; // not found
+ }
+ if ( op == op_replace ) { // replace
+ if ( vec[index] != 0 ) // maybe something there
+ remove_string( key );
+ }
+ // op_insert or op_replace
+ n = new QStringBucket(key,newItem(d),vec[index]);
+ CHECK_PTR( n );
+#if defined(CHECK_NULL)
+ if ( n->getData() == 0 )
+ qWarning( "QDict: Cannot insert null item" );
+#endif
+ vec[index] = n;
+ numItems++;
+ return n->getData();
+}
+
+
+/*! \internal */
+
+QCollection::Item QGDict::look_ascii( const char *key, QCollection::Item d, int op )
+{
+ QAsciiBucket *n;
+ int index = hashKeyAscii(key) % vlen;
+ if ( op == op_find ) { // find
+ if ( cases ) {
+ for ( n=(QAsciiBucket*)vec[index]; n;
+ n=(QAsciiBucket*)n->getNext() ) {
+ if ( qstrcmp(n->getKey(),key) == 0 )
+ return n->getData(); // item found
+ }
+ } else {
+ for ( n=(QAsciiBucket*)vec[index]; n;
+ n=(QAsciiBucket*)n->getNext() ) {
+ if ( qstricmp(n->getKey(),key) == 0 )
+ return n->getData(); // item found
+ }
+ }
+ return 0; // not found
+ }
+ if ( op == op_replace ) { // replace
+ if ( vec[index] != 0 ) // maybe something there
+ remove_ascii( key );
+ }
+ // op_insert or op_replace
+ n = new QAsciiBucket(copyk ? qstrdup(key) : key,newItem(d),vec[index]);
+ CHECK_PTR( n );
+#if defined(CHECK_NULL)
+ if ( n->getData() == 0 )
+ qWarning( "QAsciiDict: Cannot insert null item" );
+#endif
+ vec[index] = n;
+ numItems++;
+ return n->getData();
+}
+
+
+/*! \internal */
+
+QCollection::Item QGDict::look_int( long key, QCollection::Item d, int op )
+{
+ QIntBucket *n;
+ int index = (int)((ulong)key % vlen); // simple hash
+ if ( op == op_find ) { // find
+ for ( n=(QIntBucket*)vec[index]; n;
+ n=(QIntBucket*)n->getNext() ) {
+ if ( n->getKey() == key )
+ return n->getData(); // item found
+ }
+ return 0; // not found
+ }
+ if ( op == op_replace ) { // replace
+ if ( vec[index] != 0 ) // maybe something there
+ remove_int( key );
+ }
+ // op_insert or op_replace
+ n = new QIntBucket(key,newItem(d),vec[index]);
+ CHECK_PTR( n );
+#if defined(CHECK_NULL)
+ if ( n->getData() == 0 )
+ qWarning( "QIntDict: Cannot insert null item" );
+#endif
+ vec[index] = n;
+ numItems++;
+ return n->getData();
+}
+
+
+/*! \internal */
+
+QCollection::Item QGDict::look_ptr( void *key, QCollection::Item d, int op )
+{
+ QPtrBucket *n;
+ int index = (int)((ulong)key % vlen); // simple hash
+ if ( op == op_find ) { // find
+ for ( n=(QPtrBucket*)vec[index]; n;
+ n=(QPtrBucket*)n->getNext() ) {
+ if ( n->getKey() == key )
+ return n->getData(); // item found
+ }
+ return 0; // not found
+ }
+ if ( op == op_replace ) { // replace
+ if ( vec[index] != 0 ) // maybe something there
+ remove_ptr( key );
+ }
+ // op_insert or op_replace
+ n = new QPtrBucket(key,newItem(d),vec[index]);
+ CHECK_PTR( n );
+#if defined(CHECK_NULL)
+ if ( n->getData() == 0 )
+ qWarning( "QPtrDict: Cannot insert null item" );
+#endif
+ vec[index] = n;
+ numItems++;
+ return n->getData();
+}
+
+
+/*!
+ \internal
+ Changes the size of the hashtable.
+ The contents of the dictionary are preserved,
+ but all iterators on the dictionary become invalid.
+*/
+void QGDict::resize( uint newsize )
+{
+ // Save old information
+ QBaseBucket **old_vec = vec;
+ uint old_vlen = vlen;
+ bool old_copyk = copyk;
+
+ vec = new QBaseBucket *[vlen = newsize];
+ CHECK_PTR( vec );
+ memset( (char*)vec, 0, vlen*sizeof(QBaseBucket*) );
+ numItems = 0;
+ copyk = FALSE;
+
+ // Reinsert every item from vec, deleting vec as we go
+ for ( uint index = 0; index < old_vlen; index++ ) {
+ switch ( keytype ) {
+ case StringKey:
+ {
+ QStringBucket *n=(QStringBucket *)old_vec[index];
+ while ( n ) {
+ look_string( n->getKey(), n->getData(), op_insert );
+ QStringBucket *t=(QStringBucket *)n->getNext();
+ delete n;
+ n = t;
+ }
+ }
+ break;
+ case AsciiKey:
+ {
+ QAsciiBucket *n=(QAsciiBucket *)old_vec[index];
+ while ( n ) {
+ look_ascii( n->getKey(), n->getData(), op_insert );
+ QAsciiBucket *t=(QAsciiBucket *)n->getNext();
+ delete n;
+ n = t;
+ }
+ }
+ break;
+ case IntKey:
+ {
+ QIntBucket *n=(QIntBucket *)old_vec[index];
+ while ( n ) {
+ look_int( n->getKey(), n->getData(), op_insert );
+ QIntBucket *t=(QIntBucket *)n->getNext();
+ delete n;
+ n = t;
+ }
+ }
+ break;
+ case PtrKey:
+ {
+ QPtrBucket *n=(QPtrBucket *)old_vec[index];
+ while ( n ) {
+ look_ptr( n->getKey(), n->getData(), op_insert );
+ QPtrBucket *t=(QPtrBucket *)n->getNext();
+ delete n;
+ n = t;
+ }
+ }
+ break;
+ }
+ }
+ delete [] old_vec;
+
+ // Restore state
+ copyk = old_copyk;
+
+ // Invalidate all iterators, since order is lost
+ if ( iterators && iterators->count() ) {
+ QGDictIterator *i = iterators->first();
+ while ( i ) {
+ i->toFirst();
+ i = iterators->next();
+ }
+ }
+}
+
+/*!
+ \internal
+ Unlinks the bucket with the specified key (and specified data pointer,
+ if it is set).
+*/
+
+void QGDict::unlink_common( int index, QBaseBucket *node, QBaseBucket *prev )
+{
+ if ( iterators && iterators->count() ) { // update iterators
+ QGDictIterator *i = iterators->first();
+ while ( i ) { // invalidate all iterators
+ if ( i->curNode == node ) // referring to pending node
+ i->operator++();
+ i = iterators->next();
+ }
+ }
+ if ( prev ) // unlink node
+ prev->setNext( node->getNext() );
+ else
+ vec[index] = node->getNext();
+ numItems--;
+}
+
+QStringBucket *QGDict::unlink_string( const QString &key, QCollection::Item d )
+{
+ if ( numItems == 0 ) // nothing in dictionary
+ return 0;
+ QStringBucket *n;
+ QStringBucket *prev = 0;
+ int index = hashKeyString(key) % vlen;
+ if ( cases ) {
+ for ( n=(QStringBucket*)vec[index]; n;
+ n=(QStringBucket*)n->getNext() ) {
+ bool found = (key == n->getKey());
+ if ( found && d )
+ found = (n->getData() == d);
+ if ( found ) {
+ unlink_common(index,n,prev);
+ return n;
+ }
+ prev = n;
+ }
+ } else {
+ QString k = key.lower();
+ for ( n=(QStringBucket*)vec[index]; n;
+ n=(QStringBucket*)n->getNext() ) {
+ bool found = (k == n->getKey().lower());
+ if ( found && d )
+ found = (n->getData() == d);
+ if ( found ) {
+ unlink_common(index,n,prev);
+ return n;
+ }
+ prev = n;
+ }
+ }
+ return 0;
+}
+
+QAsciiBucket *QGDict::unlink_ascii( const char *key, QCollection::Item d )
+{
+ if ( numItems == 0 ) // nothing in dictionary
+ return 0;
+ QAsciiBucket *n;
+ QAsciiBucket *prev = 0;
+ int index = hashKeyAscii(key) % vlen;
+ for ( n=(QAsciiBucket *)vec[index]; n; n=(QAsciiBucket *)n->getNext() ) {
+ bool found = (cases ? qstrcmp(n->getKey(),key)
+ : qstricmp(n->getKey(),key)) == 0;
+ if ( found && d )
+ found = (n->getData() == d);
+ if ( found ) {
+ unlink_common(index,n,prev);
+ return n;
+ }
+ prev = n;
+ }
+ return 0;
+}
+
+QIntBucket *QGDict::unlink_int( long key, QCollection::Item d )
+{
+ if ( numItems == 0 ) // nothing in dictionary
+ return 0;
+ QIntBucket *n;
+ QIntBucket *prev = 0;
+ int index = (int)((ulong)key % vlen);
+ for ( n=(QIntBucket *)vec[index]; n; n=(QIntBucket *)n->getNext() ) {
+ bool found = (n->getKey() == key);
+ if ( found && d )
+ found = (n->getData() == d);
+ if ( found ) {
+ unlink_common(index,n,prev);
+ return n;
+ }
+ prev = n;
+ }
+ return 0;
+}
+
+QPtrBucket *QGDict::unlink_ptr( void *key, QCollection::Item d )
+{
+ if ( numItems == 0 ) // nothing in dictionary
+ return 0;
+ QPtrBucket *n;
+ QPtrBucket *prev = 0;
+ int index = (int)((ulong)key % vlen);
+ for ( n=(QPtrBucket *)vec[index]; n; n=(QPtrBucket *)n->getNext() ) {
+ bool found = (n->getKey() == key);
+ if ( found && d )
+ found = (n->getData() == d);
+ if ( found ) {
+ unlink_common(index,n,prev);
+ return n;
+ }
+ prev = n;
+ }
+ return 0;
+}
+
+
+/*!
+ \internal
+ Removes the item with the specified key. If item is non-null,
+ the remove will match the \a item as well (used to remove an
+ item when several items have the same key).
+*/
+
+bool QGDict::remove_string( const QString &key, QCollection::Item item )
+{
+ QStringBucket *n = unlink_string( key, item );
+ if ( n ) {
+ deleteItem( n->getData() );
+ delete n;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+
+/*! \internal */
+
+bool QGDict::remove_ascii( const char *key, QCollection::Item item )
+{
+ QAsciiBucket *n = unlink_ascii( key, item );
+ if ( n ) {
+ if ( copyk )
+ delete [] (char *)n->getKey();
+ deleteItem( n->getData() );
+ delete n;
+ }
+ return n != 0;
+}
+
+
+/*! \internal */
+
+bool QGDict::remove_int( long key, QCollection::Item item )
+{
+ QIntBucket *n = unlink_int( key, item );
+ if ( n ) {
+ deleteItem( n->getData() );
+ delete n;
+ }
+ return n != 0;
+}
+
+
+/*! \internal */
+
+bool QGDict::remove_ptr( void *key, QCollection::Item item )
+{
+ QPtrBucket *n = unlink_ptr( key, item );
+ if ( n ) {
+ deleteItem( n->getData() );
+ delete n;
+ }
+ return n != 0;
+}
+
+
+/*! \internal */
+
+QCollection::Item QGDict::take_string( const QString &key )
+{
+ QStringBucket *n = unlink_string( key );
+ Item d;
+ if ( n ) {
+ d = n->getData();
+ delete n;
+ } else {
+ d = 0;
+ }
+ return d;
+}
+
+
+/*! \internal */
+
+QCollection::Item QGDict::take_ascii( const char *key )
+{
+ QAsciiBucket *n = unlink_ascii( key );
+ Item d;
+ if ( n ) {
+ if ( copyk )
+ delete [] (char *)n->getKey();
+ d = n->getData();
+ delete n;
+ } else {
+ d = 0;
+ }
+ return d;
+}
+
+
+/*! \internal */
+
+QCollection::Item QGDict::take_int( long key )
+{
+ QIntBucket *n = unlink_int( key );
+ Item d;
+ if ( n ) {
+ d = n->getData();
+ delete n;
+ } else {
+ d = 0;
+ }
+ return d;
+}
+
+
+/*! \internal */
+
+QCollection::Item QGDict::take_ptr( void *key )
+{
+ QPtrBucket *n = unlink_ptr( key );
+ Item d;
+ if ( n ) {
+ d = n->getData();
+ delete n;
+ } else {
+ d = 0;
+ }
+ return d;
+}
+
+
+/*!
+ \internal
+ Removes all items from the dictionary.
+*/
+
+void QGDict::clear()
+{
+ if ( !numItems )
+ return;
+ numItems = 0; // disable remove() function
+ for ( uint j=0; j<vlen; j++ ) { // destroy hash table
+ if ( vec[j] ) {
+ switch ( keytype ) {
+ case StringKey:
+ {
+ QStringBucket *n=(QStringBucket *)vec[j];
+ while ( n ) {
+ QStringBucket *next = (QStringBucket*)n->getNext();
+ deleteItem( n->getData() );
+ delete n;
+ n = next;
+ }
+ }
+ break;
+ case AsciiKey:
+ {
+ QAsciiBucket *n=(QAsciiBucket *)vec[j];
+ while ( n ) {
+ QAsciiBucket *next = (QAsciiBucket*)n->getNext();
+ if ( copyk )
+ delete [] (char *)n->getKey();
+ deleteItem( n->getData() );
+ delete n;
+ n = next;
+ }
+ }
+ break;
+ case IntKey:
+ {
+ QIntBucket *n=(QIntBucket *)vec[j];
+ while ( n ) {
+ QIntBucket *next = (QIntBucket*)n->getNext();
+ deleteItem( n->getData() );
+ delete n;
+ n = next;
+ }
+ }
+ break;
+ case PtrKey:
+ {
+ QPtrBucket *n=(QPtrBucket *)vec[j];
+ while ( n ) {
+ QPtrBucket *next = (QPtrBucket*)n->getNext();
+ deleteItem( n->getData() );
+ delete n;
+ n = next;
+ }
+ }
+ break;
+ }
+ vec[j] = 0; // detach list of buckets
+ }
+ }
+ if ( iterators && iterators->count() ) { // invalidate all iterators
+ QGDictIterator *i = iterators->first();
+ while ( i ) {
+ i->curNode = 0;
+ i = iterators->next();
+ }
+ }
+}
+
+
+/*!
+ \internal
+ Outputs debug statistics.
+*/
+
+void QGDict::statistics() const
+{
+#if defined(DEBUG)
+ QString line;
+ line.fill( '-', 60 );
+ double real, ideal;
+ qDebug( "%s",line.ascii() );
+ qDebug( "DICTIONARY STATISTICS:" );
+ if ( count() == 0 ) {
+ qDebug( "Empty!" );
+ qDebug( "%s", line.ascii() );
+ return;
+ }
+ real = 0.0;
+ ideal = (float)count()/(2.0*size())*(count()+2.0*size()-1);
+ uint i = 0;
+ while ( i<size() ) {
+ QBaseBucket *n = vec[i];
+ int b = 0;
+ while ( n ) { // count number of buckets
+ b++;
+ n = n->getNext();
+ }
+ real = real + (double)b * ((double)b+1.0)/2.0;
+ char buf[80], *pbuf;
+ if ( b > 78 )
+ b = 78;
+ pbuf = buf;
+ while ( b-- )
+ *pbuf++ = '*';
+ *pbuf = '\0';
+ qDebug( "%s", buf );
+ i++;
+ }
+ qDebug( "Array size = %d", size() );
+ qDebug( "# items = %d", count() );
+ qDebug( "Real dist = %g", real );
+ qDebug( "Rand dist = %g", ideal );
+ qDebug( "Real/Rand = %g", real/ideal );
+ qDebug( "%s",line.ascii() );
+#endif // DEBUG
+}
+
+
+/*****************************************************************************
+ QGDict stream functions
+ *****************************************************************************/
+#ifndef QT_NO_DATASTREAM
+QDataStream &operator>>( QDataStream &s, QGDict &dict )
+{
+ return dict.read( s );
+}
+
+QDataStream &operator<<( QDataStream &s, const QGDict &dict )
+{
+ return dict.write( s );
+}
+
+#if defined(_CC_DEC_) && defined(__alpha) && (__DECCXX_VER >= 50190001)
+#pragma message disable narrowptr
+#endif
+
+/*!
+ \internal
+ Reads a dictionary from the stream \e s.
+*/
+
+QDataStream &QGDict::read( QDataStream &s )
+{
+ uint num;
+ s >> num; // read number of items
+ clear(); // clear dict
+ while ( num-- ) { // read all items
+ Item d;
+ switch ( keytype ) {
+ case StringKey:
+ {
+ QString k;
+ s >> k;
+ read( s, d );
+ look_string( k, d, op_insert );
+ }
+ break;
+ case AsciiKey:
+ {
+ char *k;
+ s >> k;
+ read( s, d );
+ look_ascii( k, d, op_insert );
+ if ( copyk )
+ delete [] k;
+ }
+ break;
+ case IntKey:
+ {
+ Q_UINT32 k;
+ s >> k;
+ read( s, d );
+ look_int( k, d, op_insert );
+ }
+ break;
+ case PtrKey:
+ {
+ Q_UINT32 k;
+ s >> k;
+ read( s, d );
+ // ### cannot insert 0 - this renders the thing
+ // useless since all pointers are written as 0,
+ // but hey, serializing pointers? can it be done
+ // at all, ever?
+ if ( k )
+ look_ptr( (void *)k, d, op_insert );
+ }
+ break;
+ }
+ }
+ return s;
+}
+
+/*!
+ \internal
+ Writes the dictionary to the stream \e s.
+*/
+
+QDataStream& QGDict::write( QDataStream &s ) const
+{
+ s << count(); // write number of items
+ uint i = 0;
+ while ( i<size() ) {
+ QBaseBucket *n = vec[i];
+ while ( n ) { // write all buckets
+ switch ( keytype ) {
+ case StringKey:
+ s << ((QStringBucket*)n)->getKey();
+ break;
+ case AsciiKey:
+ s << ((QAsciiBucket*)n)->getKey();
+ break;
+ case IntKey:
+ s << (Q_UINT32)((QIntBucket*)n)->getKey();
+ break;
+ case PtrKey:
+ s << (Q_UINT32)0; // ### cannot serialize a pointer
+ break;
+ }
+ write( s, n->getData() ); // write data
+ n = n->getNext();
+ }
+ i++;
+ }
+ return s;
+}
+#endif //QT_NO_DATASTREAM
+
+/*****************************************************************************
+ QGDictIterator member functions
+ *****************************************************************************/
+
+/*!
+ \class QGDictIterator qgdict.h
+ \brief An internal class for implementing QDictIterator and QIntDictIterator.
+
+ QGDictIterator is a strictly internal class that does the heavy work for
+ QDictIterator and QIntDictIterator.
+*/
+
+/*!
+ \internal
+ Constructs an iterator that operates on the dictionary \e d.
+*/
+
+QGDictIterator::QGDictIterator( const QGDict &d )
+{
+ dict = (QGDict *)&d; // get reference to dict
+ toFirst(); // set to first noe
+ if ( !dict->iterators ) {
+ dict->iterators = new QGDItList; // create iterator list
+ CHECK_PTR( dict->iterators );
+ }
+ dict->iterators->append( this ); // attach iterator to dict
+}
+
+/*!
+ \internal
+ Constructs a copy of the iterator \e it.
+*/
+
+QGDictIterator::QGDictIterator( const QGDictIterator &it )
+{
+ dict = it.dict;
+ curNode = it.curNode;
+ curIndex = it.curIndex;
+ if ( dict )
+ dict->iterators->append( this ); // attach iterator to dict
+}
+
+/*!
+ \internal
+ Assigns a copy of the iterator \e it and returns a reference to this
+ iterator.
+*/
+
+QGDictIterator &QGDictIterator::operator=( const QGDictIterator &it )
+{
+ if ( dict ) // detach from old dict
+ dict->iterators->removeRef( this );
+ dict = it.dict;
+ curNode = it.curNode;
+ curIndex = it.curIndex;
+ if ( dict )
+ dict->iterators->append( this ); // attach to new list
+ return *this;
+}
+
+/*!
+ \internal
+ Destroys the iterator.
+*/
+
+QGDictIterator::~QGDictIterator()
+{
+ if ( dict ) // detach iterator from dict
+ dict->iterators->removeRef( this );
+}
+
+
+/*!
+ \internal
+ Sets the iterator to point to the first item in the dictionary.
+*/
+
+QCollection::Item QGDictIterator::toFirst()
+{
+ if ( !dict ) {
+#if defined(CHECK_NULL)
+ qWarning( "QGDictIterator::toFirst: Dictionary has been deleted" );
+#endif
+ return 0;
+ }
+ if ( dict->count() == 0 ) { // empty dictionary
+ curNode = 0;
+ return 0;
+ }
+ register uint i = 0;
+ register QBaseBucket **v = dict->vec;
+ while ( !(*v++) )
+ i++;
+ curNode = dict->vec[i];
+ curIndex = i;
+ return curNode->getData();
+}
+
+
+/*!
+ \internal
+ Moves to the next item (postfix).
+*/
+
+QCollection::Item QGDictIterator::operator()()
+{
+ if ( !dict ) {
+#if defined(CHECK_NULL)
+ qWarning( "QGDictIterator::operator(): Dictionary has been deleted" );
+#endif
+ return 0;
+ }
+ if ( !curNode )
+ return 0;
+ QCollection::Item d = curNode->getData();
+ this->operator++();
+ return d;
+}
+
+/*!
+ \internal
+ Moves to the next item (prefix).
+*/
+
+QCollection::Item QGDictIterator::operator++()
+{
+ if ( !dict ) {
+#if defined(CHECK_NULL)
+ qWarning( "QGDictIterator::operator++: Dictionary has been deleted" );
+#endif
+ return 0;
+ }
+ if ( !curNode )
+ return 0;
+ curNode = curNode->getNext();
+ if ( !curNode ) { // no next bucket
+ register uint i = curIndex + 1; // look from next vec element
+ register QBaseBucket **v = &dict->vec[i];
+ while ( i < dict->size() && !(*v++) )
+ i++;
+ if ( i == dict->size() ) { // nothing found
+ curNode = 0;
+ return 0;
+ }
+ curNode = dict->vec[i];
+ curIndex = i;
+ }
+ return curNode->getData();
+}
+
+/*!
+ \internal
+ Moves \e jumps positions forward.
+*/
+
+QCollection::Item QGDictIterator::operator+=( uint jumps )
+{
+ while ( curNode && jumps-- )
+ operator++();
+ return curNode ? curNode->getData() : 0;
+}
diff --git a/qtools/qgdict.h b/qtools/qgdict.h
new file mode 100644
index 0000000..6243364
--- /dev/null
+++ b/qtools/qgdict.h
@@ -0,0 +1,222 @@
+/****************************************************************************
+**
+**
+** Definition of QGDict and QGDictIterator classes
+**
+** Created : 920529
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QGDICT_H
+#define QGDICT_H
+
+#ifndef QT_H
+#include "qcollection.h"
+#include "qstring.h"
+#endif // QT_H
+
+class QGDictIterator;
+class QGDItList;
+
+
+class QBaseBucket // internal dict node
+{
+public:
+ QCollection::Item getData() { return data; }
+ QCollection::Item setData( QCollection::Item d ) { return data = d; }
+ QBaseBucket *getNext() { return next; }
+ void setNext( QBaseBucket *n) { next = n; }
+protected:
+ QBaseBucket( QCollection::Item d, QBaseBucket *n ) : data(d), next(n) {}
+ QCollection::Item data;
+ QBaseBucket *next;
+};
+
+class QStringBucket : public QBaseBucket
+{
+public:
+ QStringBucket( const QString &k, QCollection::Item d, QBaseBucket *n )
+ : QBaseBucket(d,n), key(k) {}
+ const QString &getKey() const { return key; }
+private:
+ QString key;
+};
+
+class QAsciiBucket : public QBaseBucket
+{
+public:
+ QAsciiBucket( const char *k, QCollection::Item d, QBaseBucket *n )
+ : QBaseBucket(d,n), key(k) {}
+ const char *getKey() const { return key; }
+private:
+ const char *key;
+};
+
+class QIntBucket : public QBaseBucket
+{
+public:
+ QIntBucket( long k, QCollection::Item d, QBaseBucket *n )
+ : QBaseBucket(d,n), key(k) {}
+ long getKey() const { return key; }
+private:
+ long key;
+};
+
+class QPtrBucket : public QBaseBucket
+{
+public:
+ QPtrBucket( void *k, QCollection::Item d, QBaseBucket *n )
+ : QBaseBucket(d,n), key(k) {}
+ void *getKey() const { return key; }
+private:
+ void *key;
+};
+
+
+class Q_EXPORT QGDict : public QCollection // generic dictionary class
+{
+public:
+ uint count() const { return numItems; }
+ uint size() const { return vlen; }
+ QCollection::Item look_string( const QString& key, QCollection::Item,
+ int );
+ QCollection::Item look_ascii( const char *key, QCollection::Item, int );
+ QCollection::Item look_int( long key, QCollection::Item, int );
+ QCollection::Item look_ptr( void *key, QCollection::Item, int );
+#ifndef QT_NO_DATASTREAM
+ QDataStream &read( QDataStream & );
+ QDataStream &write( QDataStream & ) const;
+#endif
+protected:
+ enum KeyType { StringKey, AsciiKey, IntKey, PtrKey };
+
+ QGDict( uint len, KeyType kt, bool cs, bool ck );
+ QGDict( const QGDict & );
+ ~QGDict();
+
+ QGDict &operator=( const QGDict & );
+
+ bool remove_string( const QString &key, QCollection::Item item=0 );
+ bool remove_ascii( const char *key, QCollection::Item item=0 );
+ bool remove_int( long key, QCollection::Item item=0 );
+ bool remove_ptr( void *key, QCollection::Item item=0 );
+ QCollection::Item take_string( const QString &key );
+ QCollection::Item take_ascii( const char *key );
+ QCollection::Item take_int( long key );
+ QCollection::Item take_ptr( void *key );
+
+ void clear();
+ void resize( uint );
+
+ int hashKeyString( const QString & );
+ int hashKeyAscii( const char * );
+
+ void statistics() const;
+
+#ifndef QT_NO_DATASTREAM
+ virtual QDataStream &read( QDataStream &, QCollection::Item & );
+ virtual QDataStream &write( QDataStream &, QCollection::Item ) const;
+#endif
+private:
+ QBaseBucket **vec;
+ uint vlen;
+ uint numItems;
+ uint keytype : 2;
+ uint cases : 1;
+ uint copyk : 1;
+ QGDItList *iterators;
+ void unlink_common( int, QBaseBucket *, QBaseBucket * );
+ QStringBucket *unlink_string( const QString &,
+ QCollection::Item item = 0 );
+ QAsciiBucket *unlink_ascii( const char *, QCollection::Item item = 0 );
+ QIntBucket *unlink_int( long, QCollection::Item item = 0 );
+ QPtrBucket *unlink_ptr( void *, QCollection::Item item = 0 );
+ void init( uint, KeyType, bool, bool );
+ friend class QGDictIterator;
+};
+
+
+class Q_EXPORT QGDictIterator // generic dictionary iterator
+{
+friend class QGDict;
+public:
+ QGDictIterator( const QGDict & );
+ QGDictIterator( const QGDictIterator & );
+ QGDictIterator &operator=( const QGDictIterator & );
+ ~QGDictIterator();
+
+ QCollection::Item toFirst();
+
+ QCollection::Item get() const;
+ QString getKeyString() const;
+ const char *getKeyAscii() const;
+ long getKeyInt() const;
+ void *getKeyPtr() const;
+
+ QCollection::Item operator()();
+ QCollection::Item operator++();
+ QCollection::Item operator+=(uint);
+
+protected:
+ QGDict *dict;
+
+private:
+ QBaseBucket *curNode;
+ uint curIndex;
+};
+
+inline QCollection::Item QGDictIterator::get() const
+{
+ return curNode ? curNode->getData() : 0;
+}
+
+inline QString QGDictIterator::getKeyString() const
+{
+ return curNode ? ((QStringBucket*)curNode)->getKey() : QString::null;
+}
+
+inline const char *QGDictIterator::getKeyAscii() const
+{
+ return curNode ? ((QAsciiBucket*)curNode)->getKey() : 0;
+}
+
+inline long QGDictIterator::getKeyInt() const
+{
+ return curNode ? ((QIntBucket*)curNode)->getKey() : 0;
+}
+
+inline void *QGDictIterator::getKeyPtr() const
+{
+ return curNode ? ((QPtrBucket*)curNode)->getKey() : 0;
+}
+
+
+#endif // QGDICT_H
diff --git a/qtools/qgeneric.h b/qtools/qgeneric.h
new file mode 100644
index 0000000..c2892a0
--- /dev/null
+++ b/qtools/qgeneric.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+**
+** Macros for pasting tokens; utilized by our generic classes
+**
+** Created : 920529
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QGENERIC_H
+#define QGENERIC_H
+
+#error "do not include qgeneric.h any more"
+
+#endif // QGENERIC_H
diff --git a/qtools/qglist.cpp b/qtools/qglist.cpp
new file mode 100644
index 0000000..f464a73
--- /dev/null
+++ b/qtools/qglist.cpp
@@ -0,0 +1,1223 @@
+/****************************************************************************
+**
+**
+** Implementation of QGList and QGListIterator classes
+**
+** Created : 920624
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglist.h"
+#include "qgvector.h"
+#include "qdatastream.h"
+
+
+// NOT REVISED
+/*!
+ \class QLNode qglist.h
+ \brief The QLNode class is an internal class for the QList template collection.
+
+ QLNode is a doubly linked list node; it has three pointers:
+ <ol>
+ <li> Pointer to the previous node.
+ <li> Pointer to the next node.
+ <li> Pointer to the actual data.
+ </ol>
+
+ Sometimes it might be practical to have direct access to the list nodes
+ in a QList, but it is seldom required.
+
+ \warning Be very careful if you want to access the list nodes. The heap
+ can easily get corrupted if you make a mistake.
+
+ \sa QList::currentNode(), QList::removeNode(), QList::takeNode()
+*/
+
+/*!
+ \fn QCollection::Item QLNode::getData()
+ Returns a pointer (\c void*) to the actual data in the list node.
+*/
+
+
+/*!
+ \class QGList qglist.h
+ \brief The QGList class is an internal class for implementing Qt collection classes.
+
+ QGList is a strictly internal class that acts as a base class for several
+ \link collection.html collection classes\endlink; QList, QQueue and
+ QStack.
+
+ QGList has some virtual functions that can be reimplemented to customize
+ the subclasses.
+ <ul>
+ <li> compareItems() compares two collection/list items.
+ <li> read() reads a collection/list item from a QDataStream.
+ <li> write() writes a collection/list item to a QDataStream.
+ </ul>
+ Normally, you do not have to reimplement any of these functions.
+ If you still want to reimplement them, see the QStrList class (qstrlist.h),
+ which is a good example.
+*/
+
+
+/*****************************************************************************
+ Default implementation of virtual functions
+ *****************************************************************************/
+
+/*!
+ This virtual function compares two list items.
+
+ Returns:
+ <ul>
+ <li> 0 if \e item1 == \e item2
+ <li> non-zero if \e item1 != \e item2
+ </ul>
+
+ This function returns \e int rather than \e bool so that
+ reimplementations can return three values and use it to sort by:
+
+ <ul>
+ <li> 0 if \e item1 == \e item2
+ <li> \> 0 (positive integer) if \e item1 \> \e item2
+ <li> \< 0 (negative integer) if \e item1 \< \e item2
+ </ul>
+
+ The QList::inSort() function requires that compareItems() is implemented
+ as described here.
+
+ This function should not modify the list because some const functions
+ call compareItems().
+
+ The default implementation compares the pointers:
+ \code
+
+ \endcode
+*/
+
+int QGList::compareItems( QCollection::Item item1, QCollection::Item item2 )
+{
+ return item1 != item2; // compare pointers
+}
+
+#ifndef QT_NO_DATASTREAM
+/*!
+ Reads a collection/list item from the stream \a s and returns a reference
+ to the stream.
+
+ The default implementation sets \a item to 0.
+
+ \sa write()
+*/
+
+QDataStream &QGList::read( QDataStream &s, QCollection::Item &item )
+{
+ item = 0;
+ return s;
+}
+
+/*!
+ Writes a collection/list item to the stream \a s and returns a reference
+ to the stream.
+
+ The default implementation does nothing.
+
+ \sa read()
+*/
+
+QDataStream &QGList::write( QDataStream &s, QCollection::Item ) const
+{
+ return s;
+}
+#endif // QT_NO_DATASTREAM
+
+/*****************************************************************************
+ QGList member functions
+ *****************************************************************************/
+
+/*!
+ \internal
+ Constructs an empty list.
+*/
+
+QGList::QGList()
+{
+ firstNode = lastNode = curNode = 0; // initialize list
+ numNodes = 0;
+ curIndex = -1;
+ iterators = 0; // initialize iterator list
+}
+
+/*!
+ \internal
+ Constructs a copy of \e list.
+*/
+
+QGList::QGList( const QGList & list )
+ : QCollection( list )
+{
+ firstNode = lastNode = curNode = 0; // initialize list
+ numNodes = 0;
+ curIndex = -1;
+ iterators = 0; // initialize iterator list
+ QLNode *n = list.firstNode;
+ while ( n ) { // copy all items from list
+ append( n->data );
+ n = n->next;
+ }
+}
+
+/*!
+ \internal
+ Removes all items from the list and destroys the list.
+*/
+
+QGList::~QGList()
+{
+ clear();
+ if ( !iterators ) // no iterators for this list
+ return;
+ QGListIterator *i = (QGListIterator*)iterators->first();
+ while ( i ) { // notify all iterators that
+ i->list = 0; // this list is deleted
+ i->curNode = 0;
+ i = (QGListIterator*)iterators->next();
+ }
+ delete iterators;
+}
+
+
+/*!
+ \internal
+ Assigns \e list to this list.
+*/
+
+QGList& QGList::operator=( const QGList &list )
+{
+ clear();
+ if ( list.count() > 0 ) {
+ QLNode *n = list.firstNode;
+ while ( n ) { // copy all items from list
+ append( n->data );
+ n = n->next;
+ }
+ curNode = firstNode;
+ curIndex = 0;
+ }
+ return *this;
+}
+
+/*!
+ Compares this list with \a list. Retruns TRUE if the lists
+ contain the same data, else FALSE.
+*/
+
+bool QGList::operator==( const QGList &list ) const
+{
+ if ( count() != list.count() )
+ return FALSE;
+
+ if ( count() == 0 )
+ return TRUE;
+
+ QLNode *n1 = firstNode;
+ QLNode *n2 = list.firstNode;
+ while ( n1 && n2 ) {
+ // should be mutable
+ if ( ( (QGList*)this )->compareItems( n1->data, n2->data ) != 0 )
+ return FALSE;
+ n1 = n1->next;
+ n2 = n2->next;
+ }
+
+ return TRUE;
+}
+
+/*!
+ \fn uint QGList::count() const
+ \internal
+ Returns the number of items in the list.
+*/
+
+
+/*!
+ \internal
+ Returns the node at position \e index. Sets this node to current.
+*/
+
+QLNode *QGList::locate( uint index )
+{
+ if ( index == (uint)curIndex ) // current node ?
+ return curNode;
+ if ( !curNode && firstNode ) { // set current node
+ curNode = firstNode;
+ curIndex = 0;
+ }
+ register QLNode *node;
+ int distance = index - curIndex; // node distance to cur node
+ bool forward; // direction to traverse
+
+ if ( index >= numNodes ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QGList::locate: Index %d out of range", index );
+#endif
+ return 0;
+ }
+
+ if ( distance < 0 )
+ distance = -distance;
+ if ( (uint)distance < index && (uint)distance < numNodes - index ) {
+ node = curNode; // start from current node
+ forward = index > (uint)curIndex;
+ } else if ( index < numNodes - index ) { // start from first node
+ node = firstNode;
+ distance = index;
+ forward = TRUE;
+ } else { // start from last node
+ node = lastNode;
+ distance = numNodes - index - 1;
+ if ( distance < 0 )
+ distance = 0;
+ forward = FALSE;
+ }
+ if ( forward ) { // now run through nodes
+ while ( distance-- )
+ node = node->next;
+ } else {
+ while ( distance-- )
+ node = node->prev;
+ }
+ curIndex = index; // must update index
+ return curNode = node;
+}
+
+
+/*!
+ \internal
+ Inserts an item at its sorted position in the list.
+*/
+
+void QGList::inSort( QCollection::Item d )
+{
+ int index = 0;
+ register QLNode *n = firstNode;
+ while ( n && compareItems(n->data,d) < 0 ){ // find position in list
+ n = n->next;
+ index++;
+ }
+ insertAt( index, d );
+}
+
+
+/*!
+ \internal
+ Inserts an item at the start of the list.
+*/
+
+void QGList::prepend( QCollection::Item d )
+{
+ register QLNode *n = new QLNode( newItem(d) );
+ CHECK_PTR( n );
+ n->prev = 0;
+ if ( (n->next = firstNode) ) // list is not empty
+ firstNode->prev = n;
+ else // initialize list
+ lastNode = n;
+ firstNode = curNode = n; // curNode affected
+ numNodes++;
+ curIndex = 0;
+}
+
+
+/*!
+ \internal
+ Inserts an item at the end of the list.
+*/
+
+void QGList::append( QCollection::Item d )
+{
+ register QLNode *n = new QLNode( newItem(d) );
+ CHECK_PTR( n );
+ n->next = 0;
+ if ( (n->prev = lastNode) ) // list is not empty
+ lastNode->next = n;
+ else // initialize list
+ firstNode = n;
+ lastNode = curNode = n; // curNode affected
+ curIndex = numNodes;
+ numNodes++;
+}
+
+
+/*!
+ \internal
+ Inserts an item at position \e index in the list.
+*/
+
+bool QGList::insertAt( uint index, QCollection::Item d )
+{
+ if ( index == 0 ) { // insert at head of list
+ prepend( d );
+ return TRUE;
+ } else if ( index == numNodes ) { // append at tail of list
+ append( d );
+ return TRUE;
+ }
+ QLNode *nextNode = locate( index );
+ if ( !nextNode ) // illegal position
+ return FALSE;
+ QLNode *prevNode = nextNode->prev;
+ register QLNode *n = new QLNode( newItem(d) );
+ CHECK_PTR( n );
+ nextNode->prev = n;
+ prevNode->next = n;
+ n->prev = prevNode; // link new node into list
+ n->next = nextNode;
+ curNode = n; // curIndex set by locate()
+ numNodes++;
+ return TRUE;
+}
+
+
+/*!
+ \internal
+ Relinks node \e n and makes it the first node in the list.
+*/
+
+void QGList::relinkNode( QLNode *n )
+{
+ if ( n == firstNode ) // already first
+ return;
+ curNode = n;
+ unlink();
+ n->prev = 0;
+ if ( (n->next = firstNode) ) // list is not empty
+ firstNode->prev = n;
+ else // initialize list
+ lastNode = n;
+ firstNode = curNode = n; // curNode affected
+ numNodes++;
+ curIndex = 0;
+}
+
+
+/*!
+ \internal
+ Unlinks the current list node and returns a pointer to this node.
+*/
+
+QLNode *QGList::unlink()
+{
+ if ( curNode == 0 ) // null current node
+ return 0;
+ register QLNode *n = curNode; // unlink this node
+ if ( n == firstNode ) { // removing first node ?
+ if ( (firstNode = n->next) ) {
+ firstNode->prev = 0;
+ } else {
+ lastNode = curNode = 0; // list becomes empty
+ curIndex = -1;
+ }
+ } else {
+ if ( n == lastNode ) { // removing last node ?
+ lastNode = n->prev;
+ lastNode->next = 0;
+ } else { // neither last nor first node
+ n->prev->next = n->next;
+ n->next->prev = n->prev;
+ }
+ }
+ if ( n->next ) { // change current node
+ curNode = n->next;
+ } else if ( n->prev ) {
+ curNode = n->prev;
+ curIndex--;
+ }
+ if ( iterators && iterators->count() ) { // update iterators
+ QGListIterator *i = (QGListIterator*)iterators->first();
+ while ( i ) { // fix all iterators that
+ if ( i->curNode == n ) // refers to pending node
+ i->curNode = curNode;
+ i = (QGListIterator*)iterators->next();
+ }
+ }
+ numNodes--;
+ return n;
+}
+
+
+/*!
+ \internal
+ Removes the node \e n from the list.
+*/
+
+bool QGList::removeNode( QLNode *n )
+{
+#if defined(CHECK_NULL)
+ if ( n == 0 || (n->prev && n->prev->next != n) ||
+ (n->next && n->next->prev != n) ) {
+ qWarning( "QGList::removeNode: Corrupted node" );
+ return FALSE;
+ }
+#endif
+ curNode = n;
+ unlink(); // unlink node
+ deleteItem( n->data ); // deallocate this node
+ delete n;
+ curNode = firstNode;
+ curIndex = curNode ? 0 : -1;
+ return TRUE;
+}
+
+/*!
+ \internal
+ Removes the item \e d from the list. Uses compareItems() to find the item.
+*/
+
+bool QGList::remove( QCollection::Item d )
+{
+ if ( d ) { // find the item
+ if ( find(d) == -1 )
+ return FALSE;
+ }
+ QLNode *n = unlink(); // unlink node
+ if ( !n )
+ return FALSE;
+ deleteItem( n->data ); // deallocate this node
+ delete n;
+ return TRUE;
+}
+
+/*!
+ \internal
+ Removes the item \e d from the list.
+*/
+
+bool QGList::removeRef( QCollection::Item d )
+{
+ if ( d ) { // find the item
+ if ( findRef(d) == -1 )
+ return FALSE;
+ }
+ QLNode *n = unlink(); // unlink node
+ if ( !n )
+ return FALSE;
+ deleteItem( n->data ); // deallocate this node
+ delete n;
+ return TRUE;
+}
+
+/*!
+ \fn bool QGList::removeFirst()
+ \internal
+ Removes the first item in the list.
+*/
+
+/*!
+ \fn bool QGList::removeLast()
+ \internal
+ Removes the last item in the list.
+*/
+
+/*!
+ \internal
+ Removes the item at position \e index from the list.
+*/
+
+bool QGList::removeAt( uint index )
+{
+ if ( !locate(index) )
+ return FALSE;
+ QLNode *n = unlink(); // unlink node
+ if ( !n )
+ return FALSE;
+ deleteItem( n->data ); // deallocate this node
+ delete n;
+ return TRUE;
+}
+
+
+/*!
+ \internal
+ Takes the node \e n out of the list.
+*/
+
+QCollection::Item QGList::takeNode( QLNode *n )
+{
+#if defined(CHECK_NULL)
+ if ( n == 0 || (n->prev && n->prev->next != n) ||
+ (n->next && n->next->prev != n) ) {
+ qWarning( "QGList::takeNode: Corrupted node" );
+ return 0;
+ }
+#endif
+ curNode = n;
+ unlink(); // unlink node
+ Item d = n->data;
+ delete n; // delete the node, not data
+ curNode = firstNode;
+ curIndex = curNode ? 0 : -1;
+ return d;
+}
+
+/*!
+ \internal
+ Takes the current item out of the list.
+*/
+
+QCollection::Item QGList::take()
+{
+ QLNode *n = unlink(); // unlink node
+ Item d = n ? n->data : 0;
+ delete n; // delete node, keep contents
+ return d;
+}
+
+/*!
+ \internal
+ Takes the item at position \e index out of the list.
+*/
+
+QCollection::Item QGList::takeAt( uint index )
+{
+ if ( !locate(index) )
+ return 0;
+ QLNode *n = unlink(); // unlink node
+ Item d = n ? n->data : 0;
+ delete n; // delete node, keep contents
+ return d;
+}
+
+/*!
+ \internal
+ Takes the first item out of the list.
+*/
+
+QCollection::Item QGList::takeFirst()
+{
+ first();
+ QLNode *n = unlink(); // unlink node
+ Item d = n ? n->data : 0;
+ delete n;
+ return d;
+}
+
+/*!
+ \internal
+ Takes the last item out of the list.
+*/
+
+QCollection::Item QGList::takeLast()
+{
+ last();
+ QLNode *n = unlink(); // unlink node
+ Item d = n ? n->data : 0;
+ delete n;
+ return d;
+}
+
+
+/*!
+ \internal
+ Removes all items from the list.
+*/
+
+void QGList::clear()
+{
+ register QLNode *n = firstNode;
+
+ firstNode = lastNode = curNode = 0; // initialize list
+ numNodes = 0;
+ curIndex = -1;
+
+ if ( iterators && iterators->count() ) {
+ QGListIterator *i = (QGListIterator*)iterators->first();
+ while ( i ) { // notify all iterators that
+ i->curNode = 0; // this list is empty
+ i = (QGListIterator*)iterators->next();
+ }
+ }
+
+ QLNode *prevNode;
+ while ( n ) { // for all nodes ...
+ deleteItem( n->data ); // deallocate data
+ prevNode = n;
+ n = n->next;
+ delete prevNode; // deallocate node
+ }
+}
+
+
+/*!
+ \internal
+ Finds an item in the list.
+*/
+
+int QGList::findRef( QCollection::Item d, bool fromStart )
+{
+ register QLNode *n;
+ int index;
+ if ( fromStart ) { // start from first node
+ n = firstNode;
+ index = 0;
+ } else { // start from current node
+ n = curNode;
+ index = curIndex;
+ }
+ while ( n && n->data != d ) { // find exact match
+ n = n->next;
+ index++;
+ }
+ curNode = n;
+ curIndex = n ? index : -1;
+ return curIndex; // return position of item
+}
+
+/*!
+ \internal
+ Finds an item in the list. Uses compareItems().
+*/
+
+int QGList::find( QCollection::Item d, bool fromStart )
+{
+ register QLNode *n;
+ int index;
+ if ( fromStart ) { // start from first node
+ n = firstNode;
+ index = 0;
+ } else { // start from current node
+ n = curNode;
+ index = curIndex;
+ }
+ while ( n && compareItems(n->data,d) ){ // find equal match
+ n = n->next;
+ index++;
+ }
+ curNode = n;
+ curIndex = n ? index : -1;
+ return curIndex; // return position of item
+}
+
+
+/*!
+ \internal
+ Counts the number an item occurs in the list.
+*/
+
+uint QGList::containsRef( QCollection::Item d ) const
+{
+ register QLNode *n = firstNode;
+ uint count = 0;
+ while ( n ) { // for all nodes...
+ if ( n->data == d ) // count # exact matches
+ count++;
+ n = n->next;
+ }
+ return count;
+}
+
+/*!
+ \internal
+ Counts the number an item occurs in the list. Uses compareItems().
+*/
+
+uint QGList::contains( QCollection::Item d ) const
+{
+ register QLNode *n = firstNode;
+ uint count = 0;
+ QGList *that = (QGList*)this; // mutable for compareItems()
+ while ( n ) { // for all nodes...
+ if ( !that->compareItems(n->data,d) ) // count # equal matches
+ count++;
+ n = n->next;
+ }
+ return count;
+}
+
+
+/*!
+ \fn QCollection::Item QGList::at( uint index )
+ \internal
+ Sets the item at position \e index to the current item.
+*/
+
+/*!
+ \fn int QGList::at() const
+ \internal
+ Returns the current index.
+*/
+
+/*!
+ \fn QLNode *QGList::currentNode() const
+ \internal
+ Returns the current node.
+*/
+
+/*!
+ \fn QCollection::Item QGList::get() const
+ \internal
+ Returns the current item.
+*/
+
+/*!
+ \fn QCollection::Item QGList::cfirst() const
+ \internal
+ Returns the first item in the list.
+*/
+
+/*!
+ \fn QCollection::Item QGList::clast() const
+ \internal
+ Returns the last item in the list.
+*/
+
+
+/*!
+ \internal
+ Returns the first list item. Sets this to current.
+*/
+
+QCollection::Item QGList::first()
+{
+ if ( firstNode ) {
+ curIndex = 0;
+ return (curNode=firstNode)->data;
+ }
+ return 0;
+}
+
+/*!
+ \internal
+ Returns the last list item. Sets this to current.
+*/
+
+QCollection::Item QGList::last()
+{
+ if ( lastNode ) {
+ curIndex = numNodes-1;
+ return (curNode=lastNode)->data;
+ }
+ return 0;
+}
+
+/*!
+ \internal
+ Returns the next list item (after current). Sets this to current.
+*/
+
+QCollection::Item QGList::next()
+{
+ if ( curNode ) {
+ if ( curNode->next ) {
+ curIndex++;
+ curNode = curNode->next;
+ return curNode->data;
+ }
+ curIndex = -1;
+ curNode = 0;
+ }
+ return 0;
+}
+
+/*!
+ \internal
+ Returns the previous list item (before current). Sets this to current.
+*/
+
+QCollection::Item QGList::prev()
+{
+ if ( curNode ) {
+ if ( curNode->prev ) {
+ curIndex--;
+ curNode = curNode->prev;
+ return curNode->data;
+ }
+ curIndex = -1;
+ curNode = 0;
+ }
+ return 0;
+}
+
+
+/*!
+ \internal
+ Converts the list to a vector.
+*/
+
+void QGList::toVector( QGVector *vector ) const
+{
+ vector->clear();
+ if ( !vector->resize( count() ) )
+ return;
+ register QLNode *n = firstNode;
+ uint i = 0;
+ while ( n ) {
+ vector->insert( i, n->data );
+ n = n->next;
+ i++;
+ }
+}
+
+void QGList::heapSortPushDown( QCollection::Item* heap, int first, int last )
+{
+ int r = first;
+ while( r <= last/2 ) {
+ // Node r has only one child ?
+ if ( last == 2*r ) {
+ // Need for swapping ?
+ if ( compareItems( heap[r], heap[ 2*r ] ) > 0 ) {
+ QCollection::Item tmp = heap[r];
+ heap[ r ] = heap[ 2*r ];
+ heap[ 2*r ] = tmp;
+ }
+ // That's it ...
+ r = last;
+ } else {
+ // Node has two children
+ if ( compareItems( heap[r], heap[ 2*r ] ) > 0 &&
+ compareItems( heap[ 2*r ], heap[ 2*r+1 ] ) <= 0 ) {
+ // Swap with left child
+ QCollection::Item tmp = heap[r];
+ heap[ r ] = heap[ 2*r ];
+ heap[ 2*r ] = tmp;
+ r *= 2;
+ } else if ( compareItems( heap[r], heap[ 2*r+1 ] ) > 0 &&
+ compareItems( heap[ 2*r+1 ], heap[ 2*r ] ) < 0 ) {
+ // Swap with right child
+ QCollection::Item tmp = heap[r];
+ heap[ r ] = heap[ 2*r+1 ];
+ heap[ 2*r+1 ] = tmp;
+ r = 2*r+1;
+ } else {
+ // We are done
+ r = last;
+ }
+ }
+ }
+}
+
+
+/*! Sorts the list by the result of the virtual compareItems() function.
+
+ The Heap-Sort algorithm is used for sorting. It sorts n items with
+ O(n*log n) compares. This is the asymptotic optimal solution of the
+ sorting problem.
+*/
+
+void QGList::sort()
+{
+ uint n = count();
+ if ( n < 2 )
+ return;
+
+ // Create the heap
+ QCollection::Item* realheap = new QCollection::Item[ n ];
+ // Wow, what a fake. But I want the heap to be indexed as 1...n
+ QCollection::Item* heap = realheap - 1;
+ int size = 0;
+ QLNode* insert = firstNode;
+ for( ; insert != 0; insert = insert->next ) {
+ heap[++size] = insert->data;
+ int i = size;
+ while( i > 1 && compareItems( heap[i], heap[ i / 2 ] ) < 0 ) {
+ QCollection::Item tmp = heap[ i ];
+ heap[ i ] = heap[ i/2 ];
+ heap[ i/2 ] = tmp;
+ i /= 2;
+ }
+ }
+
+ insert = firstNode;
+ // Now do the sorting
+ for ( int i = n; i > 0; i-- ) {
+ insert->data = heap[1];
+ insert = insert->next;
+ if ( i > 1 ) {
+ heap[1] = heap[i];
+ heapSortPushDown( heap, 1, i - 1 );
+ }
+ }
+
+ delete [] realheap;
+}
+
+
+/*****************************************************************************
+ QGList stream functions
+ *****************************************************************************/
+
+#ifndef QT_NO_DATASTREAM
+QDataStream &operator>>( QDataStream &s, QGList &list )
+{ // read list
+ return list.read( s );
+}
+
+QDataStream &operator<<( QDataStream &s, const QGList &list )
+{ // write list
+ return list.write( s );
+}
+
+/*!
+ \internal
+ Reads a list from the stream \e s.
+*/
+
+QDataStream &QGList::read( QDataStream &s )
+{
+ uint num;
+ s >> num; // read number of items
+ clear(); // clear list
+ while ( num-- ) { // read all items
+ Item d;
+ read( s, d );
+ CHECK_PTR( d );
+ if ( !d ) // no memory
+ break;
+ QLNode *n = new QLNode( d );
+ CHECK_PTR( n );
+ if ( !n ) // no memory
+ break;
+ n->next = 0;
+ if ( (n->prev = lastNode) ) // list is not empty
+ lastNode->next = n;
+ else // initialize list
+ firstNode = n;
+ lastNode = n;
+ numNodes++;
+ }
+ curNode = firstNode;
+ curIndex = curNode ? 0 : -1;
+ return s;
+}
+
+/*!
+ \internal
+ Writes the list to the stream \e s.
+*/
+
+QDataStream &QGList::write( QDataStream &s ) const
+{
+ s << count(); // write number of items
+ QLNode *n = firstNode;
+ while ( n ) { // write all items
+ write( s, n->data );
+ n = n->next;
+ }
+ return s;
+}
+
+#endif // QT_NO_DATASTREAM
+
+/*****************************************************************************
+ QGListIterator member functions
+ *****************************************************************************/
+
+/*!
+ \class QGListIterator qglist.h
+ \brief The QGListIterator class is an internal class for implementing QListIterator.
+
+ QGListIterator is a strictly internal class that does the heavy work for
+ QListIterator.
+*/
+
+/*!
+ \internal
+ Constructs an iterator that operates on the list \e l.
+*/
+
+QGListIterator::QGListIterator( const QGList &l )
+{
+ list = (QGList *)&l; // get reference to list
+ curNode = list->firstNode; // set to first node
+ if ( !list->iterators ) {
+ list->iterators = new QGList; // create iterator list
+ CHECK_PTR( list->iterators );
+ }
+ list->iterators->append( this ); // attach iterator to list
+}
+
+/*!
+ \internal
+ Constructs a copy of the iterator \e it.
+*/
+
+QGListIterator::QGListIterator( const QGListIterator &it )
+{
+ list = it.list;
+ curNode = it.curNode;
+ if ( list )
+ list->iterators->append( this ); // attach iterator to list
+}
+
+/*!
+ \internal
+ Assigns a copy of the iterator \e it and returns a reference to this
+ iterator.
+*/
+
+QGListIterator &QGListIterator::operator=( const QGListIterator &it )
+{
+ if ( list ) // detach from old list
+ list->iterators->removeRef( this );
+ list = it.list;
+ curNode = it.curNode;
+ if ( list )
+ list->iterators->append( this ); // attach to new list
+ return *this;
+}
+
+/*!
+ \internal
+ Destroys the iterator.
+*/
+
+QGListIterator::~QGListIterator()
+{
+ if ( list ) // detach iterator from list
+ list->iterators->removeRef(this);
+}
+
+
+/*!
+ \fn bool QGListIterator::atFirst() const
+ \internal
+ Returns TRUE if the iterator points to the first item, otherwise FALSE.
+*/
+
+/*!
+ \fn bool QGListIterator::atLast() const
+ \internal
+ Returns TRUE if the iterator points to the last item, otherwise FALSE.
+*/
+
+
+/*!
+ \internal
+ Sets the list iterator to point to the first item in the list.
+*/
+
+QCollection::Item QGListIterator::toFirst()
+{
+ if ( !list ) {
+#if defined(CHECK_NULL)
+ qWarning( "QGListIterator::toFirst: List has been deleted" );
+#endif
+ return 0;
+ }
+ return list->firstNode ? (curNode = list->firstNode)->getData() : 0;
+}
+
+/*!
+ \internal
+ Sets the list iterator to point to the last item in the list.
+*/
+
+QCollection::Item QGListIterator::toLast()
+{
+ if ( !list ) {
+#if defined(CHECK_NULL)
+ qWarning( "QGListIterator::toLast: List has been deleted" );
+#endif
+ return 0;
+ }
+ return list->lastNode ? (curNode = list->lastNode)->getData() : 0;
+}
+
+
+/*!
+ \fn QCollection::Item QGListIterator::get() const
+ \internal
+ Returns the iterator item.
+*/
+
+
+/*!
+ \internal
+ Moves to the next item (postfix).
+*/
+
+QCollection::Item QGListIterator::operator()()
+{
+ if ( !curNode )
+ return 0;
+ QCollection::Item d = curNode->getData();
+ curNode = curNode->next;
+ return d;
+}
+
+/*!
+ \internal
+ Moves to the next item (prefix).
+*/
+
+QCollection::Item QGListIterator::operator++()
+{
+ if ( !curNode )
+ return 0;
+ curNode = curNode->next;
+ return curNode ? curNode->getData() : 0;
+}
+
+/*!
+ \internal
+ Moves \e jumps positions forward.
+*/
+
+QCollection::Item QGListIterator::operator+=( uint jumps )
+{
+ while ( curNode && jumps-- )
+ curNode = curNode->next;
+ return curNode ? curNode->getData() : 0;
+}
+
+/*!
+ \internal
+ Moves to the previous item (prefix).
+*/
+
+QCollection::Item QGListIterator::operator--()
+{
+ if ( !curNode )
+ return 0;
+ curNode = curNode->prev;
+ return curNode ? curNode->getData() : 0;
+}
+
+/*!
+ \internal
+ Moves \e jumps positions backward.
+*/
+
+QCollection::Item QGListIterator::operator-=( uint jumps )
+{
+ while ( curNode && jumps-- )
+ curNode = curNode->prev;
+ return curNode ? curNode->getData() : 0;
+}
diff --git a/qtools/qglist.h b/qtools/qglist.h
new file mode 100644
index 0000000..f400b64
--- /dev/null
+++ b/qtools/qglist.h
@@ -0,0 +1,257 @@
+/****************************************************************************
+**
+**
+** Definition of QGList and QGListIterator classes
+**
+** Created : 920624
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QGLIST_H
+#define QGLIST_H
+
+#ifndef QT_H
+#include "qcollection.h"
+#endif // QT_H
+
+
+/*****************************************************************************
+ QLNode class (internal doubly linked list node)
+ *****************************************************************************/
+
+class Q_EXPORT QLNode
+{
+friend class QGList;
+friend class QGListIterator;
+public:
+ QCollection::Item getData() { return data; }
+private:
+ QCollection::Item data;
+ QLNode *prev;
+ QLNode *next;
+ QLNode( QCollection::Item d ) { data = d; }
+};
+
+
+/*****************************************************************************
+ QGList class
+ *****************************************************************************/
+
+class Q_EXPORT QGList : public QCollection // doubly linked generic list
+{
+friend class QGListIterator;
+friend class QGVector; // needed by QGVector::toList
+public:
+ uint count() const; // return number of nodes
+
+#ifndef QT_NO_DATASTREAM
+ QDataStream &read( QDataStream & ); // read list from stream
+ QDataStream &write( QDataStream & ) const; // write list to stream
+#endif
+protected:
+ QGList(); // create empty list
+ QGList( const QGList & ); // make copy of other list
+ virtual ~QGList();
+
+ QGList &operator=( const QGList & ); // assign from other list
+ bool operator==( const QGList& ) const;
+
+ void inSort( QCollection::Item ); // add item sorted in list
+ void append( QCollection::Item ); // add item at end of list
+ bool insertAt( uint index, QCollection::Item ); // add item at i'th position
+ void relinkNode( QLNode * ); // relink as first item
+ bool removeNode( QLNode * ); // remove node
+ bool remove( QCollection::Item = 0 ); // remove item (0=current)
+ bool removeRef( QCollection::Item = 0 ); // remove item (0=current)
+ bool removeFirst(); // remove first item
+ bool removeLast(); // remove last item
+ bool removeAt( uint index ); // remove item at i'th position
+ QCollection::Item takeNode( QLNode * ); // take out node
+ QCollection::Item take(); // take out current item
+ QCollection::Item takeAt( uint index ); // take out item at i'th pos
+ QCollection::Item takeFirst(); // take out first item
+ QCollection::Item takeLast(); // take out last item
+
+ void sort(); // sort all items;
+ void clear(); // remove all items
+
+ int findRef( QCollection::Item, bool = TRUE ); // find exact item in list
+ int find( QCollection::Item, bool = TRUE ); // find equal item in list
+
+ uint containsRef( QCollection::Item ) const; // get number of exact matches
+ uint contains( QCollection::Item ) const; // get number of equal matches
+
+ QCollection::Item at( uint index ); // access item at i'th pos
+ int at() const; // get current index
+ QLNode *currentNode() const; // get current node
+
+ QCollection::Item get() const; // get current item
+
+ QCollection::Item cfirst() const; // get ptr to first list item
+ QCollection::Item clast() const; // get ptr to last list item
+ QCollection::Item first(); // set first item in list curr
+ QCollection::Item last(); // set last item in list curr
+ QCollection::Item next(); // set next item in list curr
+ QCollection::Item prev(); // set prev item in list curr
+
+ void toVector( QGVector * ) const; // put items in vector
+
+ virtual int compareItems( QCollection::Item, QCollection::Item );
+
+#ifndef QT_NO_DATASTREAM
+ virtual QDataStream &read( QDataStream &, QCollection::Item & );
+ virtual QDataStream &write( QDataStream &, QCollection::Item ) const;
+#endif
+private:
+ void prepend( QCollection::Item ); // add item at start of list
+
+ void heapSortPushDown( QCollection::Item* heap, int first, int last );
+
+ QLNode *firstNode; // first node
+ QLNode *lastNode; // last node
+ QLNode *curNode; // current node
+ int curIndex; // current index
+ uint numNodes; // number of nodes
+ QGList *iterators; // list of iterators
+
+ QLNode *locate( uint ); // get node at i'th pos
+ QLNode *unlink(); // unlink node
+};
+
+
+inline uint QGList::count() const
+{
+ return numNodes;
+}
+
+inline bool QGList::removeFirst()
+{
+ first();
+ return remove();
+}
+
+inline bool QGList::removeLast()
+{
+ last();
+ return remove();
+}
+
+inline int QGList::at() const
+{
+ return curIndex;
+}
+
+inline QCollection::Item QGList::at( uint index )
+{
+ QLNode *n = locate( index );
+ return n ? n->data : 0;
+}
+
+inline QLNode *QGList::currentNode() const
+{
+ return curNode;
+}
+
+inline QCollection::Item QGList::get() const
+{
+ return curNode ? curNode->data : 0;
+}
+
+inline QCollection::Item QGList::cfirst() const
+{
+ return firstNode ? firstNode->data : 0;
+}
+
+inline QCollection::Item QGList::clast() const
+{
+ return lastNode ? lastNode->data : 0;
+}
+
+
+/*****************************************************************************
+ QGList stream functions
+ *****************************************************************************/
+
+#ifndef QT_NO_DATASTREAM
+Q_EXPORT QDataStream &operator>>( QDataStream &, QGList & );
+Q_EXPORT QDataStream &operator<<( QDataStream &, const QGList & );
+#endif
+
+/*****************************************************************************
+ QGListIterator class
+ *****************************************************************************/
+
+class Q_EXPORT QGListIterator // QGList iterator
+{
+friend class QGList;
+protected:
+ QGListIterator( const QGList & );
+ QGListIterator( const QGListIterator & );
+ QGListIterator &operator=( const QGListIterator & );
+ ~QGListIterator();
+
+ bool atFirst() const; // test if at first item
+ bool atLast() const; // test if at last item
+ QCollection::Item toFirst(); // move to first item
+ QCollection::Item toLast(); // move to last item
+
+ QCollection::Item get() const; // get current item
+ QCollection::Item operator()(); // get current and move to next
+ QCollection::Item operator++(); // move to next item (prefix)
+ QCollection::Item operator+=(uint); // move n positions forward
+ QCollection::Item operator--(); // move to prev item (prefix)
+ QCollection::Item operator-=(uint); // move n positions backward
+
+protected:
+ QGList *list; // reference to list
+
+private:
+ QLNode *curNode; // current node in list
+};
+
+
+inline bool QGListIterator::atFirst() const
+{
+ return curNode == list->firstNode;
+}
+
+inline bool QGListIterator::atLast() const
+{
+ return curNode == list->lastNode;
+}
+
+inline QCollection::Item QGListIterator::get() const
+{
+ return curNode ? curNode->data : 0;
+}
+
+
+#endif // QGLIST_H
diff --git a/qtools/qglobal.cpp b/qtools/qglobal.cpp
new file mode 100644
index 0000000..50f5202
--- /dev/null
+++ b/qtools/qglobal.cpp
@@ -0,0 +1,685 @@
+/****************************************************************************
+**
+**
+** Global functions
+**
+** Created : 920604
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qglobal.h"
+#include "qasciidict.h"
+#include "qstring.h"
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+// NOT REVISED
+
+/*!
+ \relates QApplication
+ Returns the Qt version number for the library, typically "1.30"
+ or "2.1.0".
+*/
+
+const char *qVersion()
+{
+ return QT_VERSION_STR;
+}
+
+
+/*****************************************************************************
+ System detection routines
+ *****************************************************************************/
+
+static bool si_alreadyDone = FALSE;
+static int si_wordSize;
+static bool si_bigEndian;
+
+/*!
+ \relates QApplication
+ Obtains information about the system.
+
+ The system's word size in bits (typically 32) is returned in \e *wordSize.
+ The \e *bigEndian is set to TRUE if this is a big-endian machine,
+ or to FALSE if this is a little-endian machine.
+
+ This function calls qFatal() with a message if the computer is truly weird
+ (i.e. different endianness for 16 bit and 32 bit integers).
+*/
+
+bool qSysInfo( int *wordSize, bool *bigEndian )
+{
+#if defined(CHECK_NULL)
+ ASSERT( wordSize != 0 );
+ ASSERT( bigEndian != 0 );
+#endif
+
+ if ( si_alreadyDone ) { // run it only once
+ *wordSize = si_wordSize;
+ *bigEndian = si_bigEndian;
+ return TRUE;
+ }
+ si_alreadyDone = TRUE;
+
+ si_wordSize = 0;
+ uint n = (uint)(~0);
+ while ( n ) { // detect word size
+ si_wordSize++;
+ n /= 2;
+ }
+ *wordSize = si_wordSize;
+
+ if ( *wordSize != 64 &&
+ *wordSize != 32 &&
+ *wordSize != 16 ) { // word size: 16, 32 or 64
+#if defined(CHECK_RANGE)
+ qFatal( "qSysInfo: Unsupported system word size %d", *wordSize );
+#endif
+ return FALSE;
+ }
+ if ( sizeof(Q_INT8) != 1 || sizeof(Q_INT16) != 2 || sizeof(Q_INT32) != 4 ||
+ sizeof(float) != 4 || sizeof(double) != 8 ) {
+#if defined(CHECK_RANGE)
+ qFatal( "qSysInfo: Unsupported system data type size" );
+#endif
+ return FALSE;
+ }
+
+ bool be16, be32; // determine byte ordering
+ short ns = 0x1234;
+ int nl = 0x12345678;
+
+ unsigned char *p = (unsigned char *)(&ns); // 16-bit integer
+ be16 = *p == 0x12;
+
+ p = (unsigned char *)(&nl); // 32-bit integer
+ if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 )
+ be32 = TRUE;
+ else
+ if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 )
+ be32 = FALSE;
+ else
+ be32 = !be16;
+
+ if ( be16 != be32 ) { // strange machine!
+#if defined(CHECK_RANGE)
+ qFatal( "qSysInfo: Inconsistent system byte order" );
+#endif
+ return FALSE;
+ }
+
+ *bigEndian = si_bigEndian = be32;
+ return TRUE;
+}
+
+
+/*****************************************************************************
+ Debug output routines
+ *****************************************************************************/
+
+/*!
+ \fn void qDebug( const char *msg, ... )
+
+ \relates QApplication
+ Prints a debug message, or calls the message handler (if it has been
+ installed).
+
+ This function takes a format string and a list of arguments, similar to
+ the C printf() function.
+
+ Example:
+ \code
+ qDebug( "my window handle = %x", myWidget->id() );
+ \endcode
+
+ Under X11, the text is printed to stderr. Under Windows, the text is
+ sent to the debugger.
+
+ \warning The internal buffer is limited to 8196 bytes (including the
+ 0-terminator).
+
+ \sa qWarning(), qFatal(), qInstallMsgHandler(),
+ \link debug.html Debugging\endlink
+*/
+
+/*!
+ \fn void qWarning( const char *msg, ... )
+
+ \relates QApplication
+ Prints a warning message, or calls the message handler (if it has been
+ installed).
+
+ This function takes a format string and a list of arguments, similar to
+ the C printf() function.
+
+ Example:
+ \code
+ void f( int c )
+ {
+ if ( c > 200 )
+ qWarning( "f: bad argument, c == %d", c );
+ }
+ \endcode
+
+ Under X11, the text is printed to stderr. Under Windows, the text is
+ sent to the debugger.
+
+ \warning The internal buffer is limited to 8196 bytes (including the
+ 0-terminator).
+
+ \sa qDebug(), qFatal(), qInstallMsgHandler(),
+ \link debug.html Debugging\endlink
+*/
+
+/*!
+ \fn void qFatal( const char *msg, ... )
+
+ \relates QApplication
+ Prints a fatal error message and exits, or calls the message handler (if it
+ has been installed).
+
+ This function takes a format string and a list of arguments, similar to
+ the C printf() function.
+
+ Example:
+ \code
+ int divide( int a, int b )
+ {
+ if ( b == 0 ) // program error
+ qFatal( "divide: cannot divide by zero" );
+ return a/b;
+ }
+ \endcode
+
+ Under X11, the text is printed to stderr. Under Windows, the text is
+ sent to the debugger.
+
+ \warning The internal buffer is limited to 8196 bytes (including the
+ 0-terminator).
+
+ \sa qDebug(), qWarning(), qInstallMsgHandler(),
+ \link debug.html Debugging\endlink
+*/
+
+
+static msg_handler handler = 0; // pointer to debug handler
+
+
+#ifdef _OS_MAC_
+
+static FILE * mac_debug=0;
+
+void qDebug( const char *msg, ... )
+{
+ mac_debug=fopen( "debug.txt", "a+" );
+ if(mac_debug) {
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtDebugMsg, buf );
+ } else {
+ vfprintf( mac_debug, msg, ap );
+ va_end( ap );
+ fprintf( mac_debug, "\n" ); // add newline
+ fflush( mac_debug );
+ }
+ fclose(mac_debug);
+ } else {
+ exit(0);
+ }
+}
+
+// copied... this looks really bad.
+void debug( const char *msg, ... )
+{
+ mac_debug=fopen( "debug.txt", "a+" );
+ if(mac_debug) {
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtDebugMsg, buf );
+ } else {
+ vfprintf( mac_debug, msg, ap );
+ va_end( ap );
+ fprintf( mac_debug, "\n" ); // add newline
+ fflush( mac_debug );
+ }
+ fclose(mac_debug);
+ }
+}
+
+void qWarning( const char *msg, ... )
+{
+ mac_debug=fopen( "debug.txt", "a+" );
+ if(mac_debug) {
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtDebugMsg, buf );
+ } else {
+ vfprintf( mac_debug, msg, ap );
+ va_end( ap );
+ fprintf( mac_debug, "\n" ); // add newline
+ fflush( mac_debug );
+ }
+ fclose(mac_debug);
+ }
+}
+
+// copied... this looks really bad.
+void warning( const char *msg, ... )
+{
+ mac_debug=fopen( "debug.txt", "a+" );
+ if(mac_debug) {
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtDebugMsg, buf );
+ } else {
+ vfprintf( mac_debug, msg, ap );
+ va_end( ap );
+ fprintf( mac_debug, "\n" ); // add newline
+ fflush( mac_debug );
+ }
+ fclose(mac_debug);
+ }
+}
+
+void qFatal( const char *msg, ... )
+{
+ mac_debug=fopen( "debug.txt", "a+");
+ if(mac_debug) {
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtDebugMsg, buf );
+ } else {
+ vfprintf( mac_debug, msg, ap );
+ va_end( ap );
+ fprintf( mac_debug, "\n" ); // add newline
+ fflush( mac_debug );
+ }
+ fclose(mac_debug);
+ }
+ exit(0);
+}
+
+// copied... this looks really bad.
+void fatal( const char *msg, ... )
+{
+ mac_debug=fopen( "debug.txt", "a+" );
+ if(mac_debug) {
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtDebugMsg, buf );
+ } else {
+ vfprintf( mac_debug, msg, ap );
+ va_end( ap );
+ fprintf( mac_debug, "\n" ); // add newline
+ fflush( mac_debug );
+ }
+ fclose(mac_debug);
+ }
+ exit(0);
+}
+
+#else
+
+void qDebug( const char *msg, ... )
+{
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap ); // ### vsnprintf would be great here
+ va_end( ap );
+ (*handler)( QtDebugMsg, buf );
+ } else {
+ vfprintf( stderr, msg, ap );
+ va_end( ap );
+ fprintf( stderr, "\n" ); // add newline
+ }
+}
+
+// copied... this looks really bad.
+void debug( const char *msg, ... )
+{
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtDebugMsg, buf );
+ } else {
+ vfprintf( stderr, msg, ap );
+ va_end( ap );
+ fprintf( stderr, "\n" ); // add newline
+ }
+}
+
+void qWarning( const char *msg, ... )
+{
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtWarningMsg, buf );
+ } else {
+ vfprintf( stderr, msg, ap );
+ va_end( ap );
+ fprintf( stderr, "\n" ); // add newline
+ }
+}
+
+
+// again, copied
+void warning( const char *msg, ... )
+{
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtWarningMsg, buf );
+ } else {
+ vfprintf( stderr, msg, ap );
+ va_end( ap );
+ fprintf( stderr, "\n" ); // add newline
+ }
+}
+
+void qFatal( const char *msg, ... )
+{
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtFatalMsg, buf );
+ } else {
+ vfprintf( stderr, msg, ap );
+ va_end( ap );
+ fprintf( stderr, "\n" ); // add newline
+#if defined(_OS_UNIX_) && defined(DEBUG)
+ abort(); // trap; generates core dump
+#else
+ exit( 1 ); // goodbye cruel world
+#endif
+ }
+}
+
+// yet again, copied
+void fatal( const char *msg, ... )
+{
+ char buf[8196];
+ va_list ap;
+ va_start( ap, msg ); // use variable arg list
+ if ( handler ) {
+ vsprintf( buf, msg, ap );
+ va_end( ap );
+ (*handler)( QtFatalMsg, buf );
+ } else {
+ vfprintf( stderr, msg, ap );
+ va_end( ap );
+ fprintf( stderr, "\n" ); // add newline
+#if defined(_OS_UNIX_) && defined(DEBUG)
+ abort(); // trap; generates core dump
+#else
+ exit( 1 ); // goodbye cruel world
+#endif
+ }
+}
+
+#endif
+
+
+/*!
+ \fn void ASSERT( bool test )
+ \relates QApplication
+ Prints a warning message containing the source code file name and line number
+ if \e test is FALSE.
+
+ This is really a macro defined in qglobal.h.
+
+ ASSERT is useful for testing required conditions in your program.
+
+ Example:
+ \code
+ //
+ // File: div.cpp
+ //
+
+ #include <qglobal.h>
+
+ int divide( int a, int b )
+ {
+ ASSERT( b != 0 ); // this is line 9
+ return a/b;
+ }
+ \endcode
+
+ If \c b is zero, the ASSERT statement will output the following message
+ using the qWarning() function:
+ \code
+ ASSERT: "b == 0" in div.cpp (9)
+ \endcode
+
+ \sa qWarning(), \link debug.html Debugging\endlink
+*/
+
+
+/*!
+ \fn void CHECK_PTR( void *p )
+ \relates QApplication
+ If \e p is null, a fatal messages says that the program ran out of memory
+ and exits. If \e p is not null, nothing happens.
+
+ This is really a macro defined in qglobal.h.
+
+ Example:
+ \code
+ int *a;
+ CHECK_PTR( a = new int[80] ); // never do this!
+ // do this instead:
+ a = new int[80];
+ CHECK_PTR( a ); // this is fine
+ \endcode
+
+ \sa qFatal(), \link debug.html Debugging\endlink
+*/
+
+
+//
+// The CHECK_PTR macro calls this function to check if an allocation went ok.
+//
+
+bool qt_check_pointer( bool c, const char *n, int l )
+{
+ if ( c )
+ qFatal( "In file %s, line %d: Out of memory", n, l );
+ return TRUE;
+}
+
+
+static bool firstObsoleteWarning(const char *obj, const char *oldfunc )
+{
+ static QAsciiDict<int> *obsoleteDict = 0;
+ if ( !obsoleteDict ) { // first time func is called
+ obsoleteDict = new QAsciiDict<int>;
+#if defined(DEBUG)
+ qDebug(
+ "You are using obsolete functions in the Qt library. Call the function\n"
+ "qSuppressObsoleteWarnings() to suppress obsolete warnings.\n"
+ );
+#endif
+ }
+ QCString s( obj );
+ s += "::";
+ s += oldfunc;
+ if ( obsoleteDict->find(s.data()) == 0 ) {
+ obsoleteDict->insert( s.data(), (int*)1 ); // anything different from 0
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool suppressObsolete = FALSE;
+
+void qSuppressObsoleteWarnings( bool suppress )
+{
+ suppressObsolete = suppress;
+}
+
+void qObsolete( const char *obj, const char *oldfunc, const char *newfunc )
+{
+ if ( suppressObsolete )
+ return;
+ if ( !firstObsoleteWarning(obj, oldfunc) )
+ return;
+ if ( obj )
+ qDebug( "%s::%s: This function is obsolete, use %s instead.",
+ obj, oldfunc, newfunc );
+ else
+ qDebug( "%s: This function is obsolete, use %s instead.",
+ oldfunc, newfunc );
+}
+
+void qObsolete( const char *obj, const char *oldfunc )
+{
+ if ( suppressObsolete )
+ return;
+ if ( !firstObsoleteWarning(obj, oldfunc) )
+ return;
+ if ( obj )
+ qDebug( "%s::%s: This function is obsolete.", obj, oldfunc );
+ else
+ qDebug( "%s: This function is obsolete.", oldfunc );
+}
+
+void qObsolete( const char *message )
+{
+ if ( suppressObsolete )
+ return;
+ if ( !firstObsoleteWarning( "Qt", message) )
+ return;
+ qDebug( "%s", message );
+}
+
+
+/*!
+ \relates QApplication
+ Installs a Qt message handler. Returns a pointer to the message handler
+ previously defined.
+
+ The message handler is a function that prints out debug messages,
+ warnings and fatal error messages. The Qt library (debug version)
+ contains hundreds of warning messages that are printed when internal
+ errors (usually invalid function arguments) occur. If you implement
+ your own message handler, you get total control of these messages.
+
+ The default message handler prints the message to the standard output
+ under X11 or to the debugger under Windows. If it is a fatal message,
+ the application aborts immediately.
+
+ Only one message handler can be defined, since this is usually done on
+ an application-wide basis to control debug output.
+
+ To restore the message handler, call \c qInstallMsgHandler(0).
+
+ Example:
+ \code
+ #include <qapplication.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ void myMessageOutput( QtMsgType type, const char *msg )
+ {
+ switch ( type ) {
+ case QtDebugMsg:
+ fprintf( stderr, "Debug: %s\n", msg );
+ break;
+ case QtWarningMsg:
+ fprintf( stderr, "Warning: %s\n", msg );
+ break;
+ case QtFatalMsg:
+ fprintf( stderr, "Fatal: %s\n", msg );
+ abort(); // dump core on purpose
+ }
+ }
+
+ int main( int argc, char **argv )
+ {
+ qInstallMsgHandler( myMessageOutput );
+ QApplication a( argc, argv );
+ ...
+ return a.exec();
+ }
+ \endcode
+
+ \sa qDebug(), qWarning(), qFatal(), \link debug.html Debugging\endlink
+*/
+
+msg_handler qInstallMsgHandler( msg_handler h )
+{
+ msg_handler old = handler;
+ handler = h;
+ return old;
+}
+
+
+#ifdef _WS_WIN_
+bool qt_winunicode=FALSE;
+#endif
diff --git a/qtools/qglobal.h b/qtools/qglobal.h
new file mode 100644
index 0000000..700cb80
--- /dev/null
+++ b/qtools/qglobal.h
@@ -0,0 +1,641 @@
+/****************************************************************************
+**
+**
+** Global type declarations and definitions
+**
+** Created : 920529
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QGLOBAL_H
+#define QGLOBAL_H
+
+
+#define QT_VERSION 223
+#define QT_VERSION_STR "2.2.3"
+
+
+//
+// The operating system, must be one of: (_OS_x_)
+//
+// MAC - Macintosh
+// MSDOS - MS-DOS and Windows
+// OS2 - OS/2
+// OS2EMX - XFree86 on OS/2 (not PM)
+// WIN32 - Win32 (Windows 95/98 and Windows NT)
+// SUN - SunOS
+// SOLARIS - Sun Solaris
+// HPUX - HP-UX
+// ULTRIX - DEC Ultrix
+// LINUX - Linux
+// FREEBSD - FreeBSD
+// NETBSD - NetBSD
+// OPENBSD - OpenBSD
+// IRIX - SGI Irix
+// OSF - OSF Unix
+// BSDI - BSDI Unix
+// SCO - SCO of some sort
+// AIX - AIX Unix
+// UNIXWARE - SCO UnixWare
+// GNU - GNU Hurd
+// DGUX - DG Unix
+// UNIX - Any UNIX bsd/sysv system
+//
+
+#if defined(__APPLE__) || defined(macintosh)
+#define _OS_MAC_
+# ifdef MAC_OS_X_VERSION_MIN_REQUIRED
+# undef MAC_OS_X_VERSION_MIN_REQUIRED
+# endif
+# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_3
+# include <AvailabilityMacros.h>
+# if !defined(MAC_OS_X_VERSION_10_3)
+# define MAC_OS_X_VERSION_10_3 MAC_OS_X_VERSION_10_2 + 1
+# endif
+# if !defined(MAC_OS_X_VERSION_10_4)
+# define MAC_OS_X_VERSION_10_4 MAC_OS_X_VERSION_10_3 + 1
+# endif
+# if !defined(MAC_OS_X_VERSION_10_5)
+# define MAC_OS_X_VERSION_10_5 MAC_OS_X_VERSION_10_4 + 1
+# endif
+# if !defined(MAC_OS_X_VERSION_10_6)
+# define MAC_OS_X_VERSION_10_6 MAC_OS_X_VERSION_10_5 + 1
+# endif
+# if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_6)
+# error "This version of Mac OS X is unsupported"
+# endif
+#elif defined(MSDOS) || defined(_MSDOS) || defined(__MSDOS__)
+#define _OS_MSDOS_
+#elif defined(OS2) || defined(_OS2) || defined(__OS2__)
+#if defined(__EMX__)
+#define _OS_OS2EMX_
+#else
+#define _OS_OS2_
+#endif
+#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
+#define _OS_WIN32_
+#elif defined(__MWERKS__) && defined(__INTEL__)
+#define _OS_WIN32_
+#elif defined(sun) || defined(__sun) || defined(__sun__)
+#if defined(__SVR4)
+#define _OS_SOLARIS_
+#else
+#define _OS_SUN_
+#endif
+#elif defined(hpux) || defined(__hpux) || defined(__hpux__)
+#define _OS_HPUX_
+#elif defined(ultrix) || defined(__ultrix) || defined(__ultrix__)
+#define _OS_ULTRIX_
+#elif defined(reliantunix)
+#define _OS_RELIANTUNIX_
+#elif defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)
+#define _OS_LINUX_
+#elif defined(__FreeBSD__)
+#define _OS_FREEBSD_
+#elif defined(__NetBSD__)
+#define _OS_NETBSD_
+#elif defined(__OpenBSD__)
+#define _OS_OPENBSD_
+#elif defined(sgi) || defined(__sgi)
+#define _OS_IRIX_
+#elif defined(__osf__)
+#define _OS_OSF_
+#elif defined(bsdi) || defined(__bsdi__)
+#define _OS_BSDI_
+#elif defined(_AIX)
+#define _OS_AIX_
+#elif defined(__Lynx__)
+#define _OS_LYNXOS_
+#elif defined(_UNIXWARE)
+#define _OS_UNIXWARE_
+#elif defined(DGUX)
+#define _OS_DGUX_
+#elif defined(__QNX__)
+#define _OS_QNX_
+#elif defined(_SCO_DS) || defined(M_UNIX) || defined(M_XENIX)
+#define _OS_SCO_
+#elif defined(sco) || defined(_UNIXWARE7)
+#define _OS_UNIXWARE7_
+#elif !defined(_SCO_DS) && defined(__USLC__) && defined(__SCO_VERSION__)
+#define _OS_UNIXWARE7_
+#elif defined(__CYGWIN__)
+#define _OS_CYGWIN_
+#elif defined(__BEOS__)
+#define _OS_BEOS_
+#elif defined(__MINT__)
+#define _OS_MINT_
+#else
+#error "Qt has not been ported to this OS - talk to qt-bugs@trolltech.com"
+#endif
+
+#if defined(_OS_MAC_) || defined(_OS_MSDOS_) || defined(_OS_OS2_) || defined(_OS_WIN32_)
+#undef _OS_UNIX_
+#elif !defined(_OS_UNIX_)
+#define _OS_UNIX_
+// QT_CLEAN_NAMESPACE is not defined by default; it would break too
+// much code.
+#if !defined(QT_CLEAN_NAMESPACE) && !defined(UNIX)
+// ### remove 3.0
+#define UNIX
+#endif
+#endif
+
+
+//
+// The compiler, must be one of: (_CC_x_)
+//
+// SYM - Symantec C++ for both PC and Macintosh
+// MPW - MPW C++
+// MWERKS - Metrowerks CodeWarrior
+// MSVC - Microsoft Visual C/C++
+// BOR - Borland/Turbo C++
+// WAT - Watcom C++
+// GNU - GNU C++
+// COMEAU - Comeau C++
+// EDG - Edison Design Group C++
+// OC - CenterLine C++
+// SUN - Sun C++
+// DEC - DEC C++
+// HP - HPUX C++
+// USLC - SCO UnixWare7 C++
+// CDS - Reliant C++
+// KAI - KAI C++
+//
+
+
+// Should be sorted most-authorative to least-authorative
+
+#if defined(__SC__)
+#define _CC_SYM_
+#elif defined( __KCC )
+#define _CC_KAI_
+#define _CC_EDG_
+#define Q_HAS_BOOL_TYPE
+#elif defined(applec)
+#define _CC_MPW_
+#elif defined(__MWERKS__)
+#define _CC_MWERKS_
+#define Q_HAS_BOOL_TYPE
+#elif defined(_MSC_VER)
+#define _CC_MSVC_
+#elif defined(__BORLANDC__) || defined(__TURBOC__)
+#define _CC_BOR_
+#elif defined(__WATCOMC__)
+#define _CC_WAT_
+#define Q_HAS_BOOL_TYPE
+#elif defined(__GNUC__)
+#define _CC_GNU_
+#if __GNUC__ == 2 && __GNUC_MINOR__ <= 7
+#define Q_FULL_TEMPLATE_INSTANTIATION
+#define Q_TEMPLATE_NEEDS_CLASS_DECLARATION
+#define Q_TEMPLATE_NEEDS_EXPLICIT_CONVERSION
+#define Q_SPURIOUS_NON_VOID_WARNING
+#endif
+#if __GNUC__ == 2 && __GNUC_MINOR__ >= 95
+#define Q_DELETING_VOID_UNDEFINED
+#endif
+#if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
+#define Q_PACKED __attribute__ ((packed))
+#endif
+#elif defined(__xlC__)
+#define _CC_XLC_
+#define Q_FULL_TEMPLATE_INSTANTIATION
+#if __xlC__ >= 0x400
+#define Q_HAS_BOOL_TYPE
+#endif
+#if __xlC__ <= 0x0306
+#define Q_TEMPLATE_NEEDS_EXPLICIT_CONVERSION
+#endif
+#elif defined(como40)
+#define _CC_EDG_
+#define _CC_COMEAU_
+#define Q_HAS_BOOL_TYPE
+#define Q_C_CALLBACKS
+#elif defined(__USLC__)
+#define _CC_USLC_
+#ifdef __EDG__ // UnixWare7
+#define Q_HAS_BOOL_TYPE
+#endif
+#elif defined(__DECCXX)
+#define _CC_DEC_
+#if __DECCXX_VER >= 60060005
+#define Q_HAS_BOOL_TYPE
+#endif
+#elif defined(__EDG) || defined(__EDG__)
+// one observed on SGI DCC, the other documented
+#define _CC_EDG_
+#elif defined(OBJECTCENTER) || defined(CENTERLINE_CLPP)
+#define _CC_OC_
+#if defined(_BOOL)
+#define Q_HAS_BOOL_TYPE
+#endif
+#elif defined(__SUNPRO_CC)
+#define _CC_SUN_
+#if __SUNPRO_CC >= 0x500
+#define Q_HAS_BOOL_TYPE
+#define Q_C_CALLBACKS
+#endif
+#elif defined(__CDS__)
+#define _CC_CDS_
+#define Q_HAS_BOOL_TYPE
+#elif defined(_OS_HPUX_)
+// this test is from aCC online help
+#if defined(__HP_aCC) || __cplusplus >= 199707L
+// this is the aCC
+#define _CC_HP_ACC_
+#define Q_HAS_BOOL_TYPE
+#else
+// this is the CC
+#define _CC_HP_
+#define Q_FULL_TEMPLATE_INSTANTIATION
+#define Q_TEMPLATE_NEEDS_EXPLICIT_CONVERSION
+#endif // __HP_aCC
+#else
+#error "Qt has not been tested with this compiler - talk to qt-bugs@trolltech.com"
+#endif
+
+// detect Microsoft compiler version
+#ifdef _CC_MSVC_
+#if _MSC_VER >= 1400
+#define _CC_V2005
+#elif _MSC_VER >= 1310
+#define _CC_V2003
+#elif _MSC_VER > 1300
+#define _CC_V2002
+#else
+#define _CC_V1998
+#endif
+#endif
+
+#ifndef Q_PACKED
+#define Q_PACKED
+#endif
+
+// Window system setting
+
+#if defined(_OS_MAC_)
+#define _WS_MAC_
+#elif defined(_OS_MSDOS_)
+#define _WS_WIN16_
+#error "Qt requires Win32 and does not work with Windows 3.x"
+#elif defined(_WIN32_X11_)
+#define _WS_X11_
+#elif defined(_OS_WIN32_)
+#define _WS_WIN32_
+#elif defined(_OS_OS2_)
+#error "Qt does not work with OS/2 Presentation Manager or Workplace Shell"
+#elif defined(_OS_UNIX_)
+#ifdef QWS
+#define _WS_QWS_
+#else
+#define _WS_X11_
+#endif
+#endif
+
+#if defined(_WS_WIN16_) || defined(_WS_WIN32_)
+#define _WS_WIN_
+#endif
+
+
+//
+// Some classes do not permit copies to be made of an object.
+// These classes contains a private copy constructor and operator=
+// to disable copying (the compiler gives an error message).
+// Undefine Q_DISABLE_COPY to turn off this checking.
+//
+
+#define Q_DISABLE_COPY
+
+
+//
+// Useful type definitions for Qt
+//
+
+#if defined(bool)
+#define Q_HAS_BOOL_TYPE
+#elif __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6)
+#define Q_HAS_BOOL_TYPE
+#elif _MSC_VER >= 1100 || __BORLANDC__ >= 0x500
+#define Q_HAS_BOOL_TYPE
+#elif defined(sgi) && defined(_BOOL)
+#define Q_HAS_BOOL_TYPE
+#endif
+
+#if (QT_VERSION >= 300)
+#error "Use an enum for bool"
+#endif
+
+#if !defined(Q_HAS_BOOL_TYPE)
+#if defined(_CC_MSVC_)
+#define _CC_BOOL_DEF_
+#define bool int
+#else
+typedef int bool;
+#endif
+#endif
+
+typedef unsigned char uchar;
+typedef unsigned short ushort;
+typedef unsigned uint;
+typedef unsigned long ulong;
+typedef char *pchar;
+typedef uchar *puchar;
+typedef const char *pcchar;
+#if defined(_OS_WIN32_) && !defined(_CC_GNU_)
+typedef __int64 int64;
+typedef unsigned __int64 uint64;
+#else
+typedef long long int64;
+typedef unsigned long long uint64;
+#endif
+
+
+//
+// Constant bool values
+//
+
+#ifndef TRUE
+const bool FALSE = 0;
+const bool TRUE = !0;
+#endif
+
+
+#if defined(_CC_MSVC_)
+// Workaround for static const members.
+#define QT_STATIC_CONST static
+#define QT_STATIC_CONST_IMPL
+#else
+#define QT_STATIC_CONST static const
+#define QT_STATIC_CONST_IMPL const
+#endif
+
+
+
+//
+// Utility macros and inline functions
+//
+
+#define QMAX(a,b) ((a) > (b) ? (a) : (b))
+#define QMIN(a,b) ((a) < (b) ? (a) : (b))
+#define QABS(a) ((a) >= 0 ? (a) : -(a))
+
+inline int qRound( double d )
+{
+ return d > 0.0 ? int(d+0.5) : int(d-0.5);
+}
+
+
+//
+// Size-dependent types (architechture-dependent byte order)
+//
+
+// QT_CLEAN_NAMESPACE is not defined by default; it would break too
+// much code.
+#if !defined(QT_CLEAN_NAMESPACE)
+typedef signed char INT8; // 8 bit signed
+typedef unsigned char UINT8; // 8 bit unsigned
+typedef short INT16; // 16 bit signed
+typedef unsigned short UINT16; // 16 bit unsigned
+typedef int INT32; // 32 bit signed
+typedef unsigned int UINT32; // 32 bit unsigned
+#endif
+
+typedef signed char Q_INT8; // 8 bit signed
+typedef unsigned char Q_UINT8; // 8 bit unsigned
+typedef short Q_INT16; // 16 bit signed
+typedef unsigned short Q_UINT16; // 16 bit unsigned
+typedef int Q_INT32; // 32 bit signed
+typedef unsigned int Q_UINT32; // 32 bit unsigned
+typedef long Q_INT64; // up to 64 bit signed
+typedef unsigned long Q_UINT64; // up to 64 bit unsigned
+
+//
+// Data stream functions is provided by many classes (defined in qdatastream.h)
+//
+
+class QDataStream;
+
+
+
+#ifdef _WS_WIN_
+extern bool qt_winunicode;
+#endif
+
+#ifndef QT_H
+#include <qfeatures.h>
+#endif // QT_H
+
+//
+// Create Qt DLL if QT_DLL is defined (Windows only)
+//
+
+#if defined(_OS_WIN32_)
+#if defined(QT_NODLL)
+#undef QT_MAKEDLL
+#undef QT_DLL
+#endif
+#ifdef QT_DLL
+#if defined(QT_MAKEDLL) /* create a Qt DLL library */
+#undef QT_DLL
+#define Q_EXPORT __declspec(dllexport)
+#define Q_TEMPLATEDLL
+#undef Q_DISABLE_COPY /* avoid unresolved externals */
+#endif
+#endif
+#if defined(QT_DLL) /* use a Qt DLL library */
+#define Q_EXPORT __declspec(dllimport)
+#define Q_TEMPLATEDLL
+#undef Q_DISABLE_COPY /* avoid unresolved externals */
+#endif
+#else // ! _OS_WIN32_
+#undef QT_MAKEDLL /* ignore these for other platforms */
+#undef QT_DLL
+#endif
+
+#ifndef Q_EXPORT
+#define Q_EXPORT
+#endif
+
+//
+// System information
+//
+
+Q_EXPORT const char *qVersion();
+Q_EXPORT bool qSysInfo( int *wordSize, bool *bigEndian );
+
+
+//
+// Debugging and error handling
+//
+
+#if !defined(NO_CHECK)
+#define CHECK_STATE // check state of objects etc.
+#define CHECK_RANGE // check range of indexes etc.
+#define CHECK_NULL // check null pointers
+#define CHECK_MATH // check math functions
+#endif
+
+#if !defined(NO_DEBUG) && !defined(DEBUG)
+#define DEBUG // display debug messages
+#endif
+
+//
+// Avoid some particularly useless warnings from some stupid compilers.
+// To get ALL C++ compiler warnings, define CC_WARNINGS or comment out
+// the line "#define Q_NO_WARNINGS"
+//
+
+#if !defined(CC_WARNINGS)
+#define Q_NO_WARNINGS
+#endif
+#if defined(Q_NO_WARNINGS)
+#if defined(_CC_MSVC_)
+#pragma warning(disable: 4244)
+#pragma warning(disable: 4275)
+#pragma warning(disable: 4514)
+#pragma warning(disable: 4800)
+#pragma warning(disable: 4097)
+#pragma warning(disable: 4706)
+#elif defined(_CC_BOR_)
+#pragma option -w-inl
+#pragma option -w-aus
+#pragma warn -inl
+#pragma warn -pia
+#pragma warn -ccc
+#pragma warn -rch
+#pragma warn -sig
+#elif defined(_CC_MWERKS_)
+#pragma warn_possunwant off
+#endif
+#endif // Q_NO_WARNINGS
+
+//
+// Avoid dead code
+//
+
+#if defined(_CC_EDG_) || defined(_CC_WAT_)
+#define Q_NO_DEAD_CODE
+#endif
+
+//
+// Use to avoid "unused parameter" warnings
+//
+
+#define Q_UNUSED(x) x=x;
+#define Q_CONST_UNUSED(x) (void)x;
+
+Q_EXPORT void qDebug( const char *, ... ) // print debug message
+#if defined(_CC_GNU_) && !defined(__INSURE__)
+ __attribute__ ((format (printf, 1, 2)))
+#endif
+;
+
+Q_EXPORT void qWarning( const char *, ... ) // print warning message
+#if defined(_CC_GNU_) && !defined(__INSURE__)
+ __attribute__ ((format (printf, 1, 2)))
+#endif
+;
+
+Q_EXPORT void qFatal( const char *, ... ) // print fatal message and exit
+#if defined(_CC_GNU_)
+ __attribute__ ((format (printf, 1, 2)))
+#endif
+;
+
+
+// QT_CLEAN_NAMESPACE is not defined by default; it would break too
+// much code.
+#if !defined(QT_CLEAN_NAMESPACE)
+// in that case, also define the old ones...
+
+Q_EXPORT void debug( const char *, ... ) // print debug message
+#if defined(_CC_GNU_) && !defined(__INSURE__)
+ __attribute__ ((format (printf, 1, 2)))
+#endif
+;
+
+Q_EXPORT void warning( const char *, ... ) // print warning message
+#if defined(_CC_GNU_) && !defined(__INSURE__)
+ __attribute__ ((format (printf, 1, 2)))
+#endif
+;
+
+Q_EXPORT void fatal( const char *, ... ) // print fatal message and exit
+#if defined(_CC_GNU_) && !defined(__INSURE__)
+ __attribute__ ((format (printf, 1, 2)))
+#endif
+;
+
+// okay, that was debug()/warning()/fatal()
+#endif
+
+#if !defined(ASSERT)
+#if defined(CHECK_STATE)
+#if defined(QT_FATAL_ASSERT)
+#define ASSERT(x) if ( !(x) )\
+ qFatal("ASSERT: \"%s\" in %s (%d)",#x,__FILE__,__LINE__)
+#else
+#define ASSERT(x) if ( !(x) )\
+ qWarning("ASSERT: \"%s\" in %s (%d)",#x,__FILE__,__LINE__)
+#endif
+#else
+#define ASSERT(x)
+#endif
+#endif
+
+Q_EXPORT bool qt_check_pointer( bool c, const char *, int );
+
+#if defined(CHECK_NULL)
+#define CHECK_PTR(p) (qt_check_pointer((p)==0,__FILE__,__LINE__))
+#else
+#define CHECK_PTR(p)
+#endif
+
+enum QtMsgType { QtDebugMsg, QtWarningMsg, QtFatalMsg };
+
+typedef void (*msg_handler)(QtMsgType, const char *);
+Q_EXPORT msg_handler qInstallMsgHandler( msg_handler );
+
+
+Q_EXPORT void qSuppressObsoleteWarnings( bool = TRUE );
+
+#if !defined(QT_REJECT_OBSOLETE)
+#define QT_OBSOLETE
+Q_EXPORT void qObsolete( const char *obj, const char *oldfunc,
+ const char *newfunc );
+Q_EXPORT void qObsolete( const char *obj, const char *oldfunc );
+Q_EXPORT void qObsolete( const char *message );
+#endif
+
+// DvH: added to avoid warnings on recent gcc versions
+#define Q_DELETING_VOID_UNDEFINED
+
+#endif // QGLOBAL_H
diff --git a/qtools/qgstring.cpp b/qtools/qgstring.cpp
new file mode 100644
index 0000000..85dd879
--- /dev/null
+++ b/qtools/qgstring.cpp
@@ -0,0 +1,258 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2004 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdio.h>
+#include "qgstring.h"
+
+#include <assert.h>
+
+#define BLOCK_SIZE 64
+#define ROUND_SIZE(x) ((x)+BLOCK_SIZE-1)&~(BLOCK_SIZE-1)
+
+#define DBG_STR(x) do { } while(0)
+//#define DBG_STR(x) printf x
+
+QGString::QGString() // make null string
+ : m_data(0), m_len(0), m_memSize(0)
+{
+ DBG_STR(("%p: QGString::QGString() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+}
+
+QGString::QGString(uint size)
+{
+ if (size==0)
+ {
+ m_data=0;
+ m_len=0;
+ }
+ else
+ {
+ m_memSize = ROUND_SIZE(size+1);
+ m_data = (char*)malloc(m_memSize);
+ memset(m_data,' ',size);
+ m_data[size]='\0';
+ m_len=size;
+ }
+ DBG_STR(("%p: QGString::QGString(uint size=%d) %d:%s\n",
+ this,size,m_len,m_data?m_data:"<none>"));
+}
+
+QGString::QGString( const QGString &s )
+{
+ if (s.m_memSize==0)
+ {
+ m_data = 0;
+ m_len = 0;
+ m_memSize = 0;
+ }
+ else
+ {
+ m_data = (char *)malloc(s.m_memSize);
+ m_len = s.m_len;
+ m_memSize = s.m_memSize;
+ qstrcpy(m_data,s.m_data);
+ }
+ DBG_STR(("%p: QGString::QGString(const QGString &) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+}
+
+QGString::QGString( const char *str )
+{
+ if (str==0)
+ {
+ m_data=0;
+ m_len=0;
+ m_memSize=0;
+ }
+ else
+ {
+ m_len = qstrlen(str);
+ m_memSize = ROUND_SIZE(m_len+1);
+ assert(m_memSize>=m_len+1);
+ m_data = (char *)malloc(m_memSize);
+ qstrcpy(m_data,str);
+ }
+ DBG_STR(("%p: QGString::QGString(const char *) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+}
+
+QGString::~QGString()
+{
+ free(m_data);
+ m_data=0;
+ DBG_STR(("%p: QGString::~QGString() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+}
+
+bool QGString::resize( uint newlen )
+{
+ m_len = 0;
+ if (newlen==0)
+ {
+ if (m_data) { free(m_data); m_data=0; }
+ m_memSize=0;
+ DBG_STR(("%p: 1.QGString::resize() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+ return TRUE;
+ }
+ m_memSize = ROUND_SIZE(newlen+1);
+ assert(m_memSize>=newlen+1);
+ if (m_data==0)
+ {
+ m_data = (char *)malloc(m_memSize);
+ }
+ else
+ {
+ m_data = (char *)realloc(m_data,m_memSize);
+ }
+ if (m_data==0)
+ {
+ DBG_STR(("%p: 2.QGString::resize() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+ return FALSE;
+ }
+ m_data[newlen]='\0';
+ m_len = qstrlen(m_data);
+ DBG_STR(("%p: 3.QGString::resize() %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+ return TRUE;
+}
+
+bool QGString::enlarge( uint newlen )
+{
+ if (newlen==0)
+ {
+ if (m_data) { free(m_data); m_data=0; }
+ m_memSize=0;
+ m_len=0;
+ return TRUE;
+ }
+ uint newMemSize = ROUND_SIZE(newlen+1);
+ if (newMemSize==m_memSize) return TRUE;
+ m_memSize = newMemSize;
+ if (m_data==0)
+ {
+ m_data = (char *)malloc(m_memSize);
+ }
+ else
+ {
+ m_data = (char *)realloc(m_data,m_memSize);
+ }
+ if (m_data==0)
+ {
+ return FALSE;
+ }
+ m_data[newlen-1]='\0';
+ if (m_len>newlen) m_len=newlen;
+ return TRUE;
+}
+
+void QGString::setLen( uint newlen )
+{
+ m_len = newlen<=m_memSize ? newlen : m_memSize;
+}
+
+QGString &QGString::operator=( const QGString &s )
+{
+ if (m_data) free(m_data);
+ if (s.m_memSize==0) // null string
+ {
+ m_data = 0;
+ m_len = 0;
+ m_memSize = 0;
+ }
+ else
+ {
+ m_len = s.m_len;
+ m_memSize = s.m_memSize;
+ m_data = (char*)malloc(m_memSize);
+ qstrcpy(m_data,s.m_data);
+ }
+ DBG_STR(("%p: QGString::operator=(const QGString &%p) %d:%s\n",
+ this,&s,m_len,m_data?m_data:"<none>"));
+ return *this;
+}
+
+QGString &QGString::operator=( const char *str )
+{
+ if (m_data) free(m_data);
+ if (str==0) // null string
+ {
+ m_data = 0;
+ m_len = 0;
+ m_memSize = 0;
+ }
+ else
+ {
+ m_len = qstrlen(str);
+ m_memSize = ROUND_SIZE(m_len+1);
+ assert(m_memSize>=m_len+1);
+ m_data = (char*)malloc(m_memSize);
+ qstrcpy(m_data,str);
+ }
+ DBG_STR(("%p: QGString::operator=(const char *) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+ return *this;
+}
+
+QGString &QGString::operator+=( const QGString &s )
+{
+ if (s.m_memSize==0) return *this;
+ uint len1 = length();
+ uint len2 = s.length();
+ uint memSize = ROUND_SIZE(len1 + len2 + 1);
+ assert(memSize>=len1+len2+1);
+ char *newData = memSize!=m_memSize ? (char*)realloc( m_data, memSize ) : m_data;
+ m_memSize = memSize;
+ if (m_data)
+ {
+ m_data = newData;
+ memcpy( m_data + len1, s, len2 + 1 );
+ }
+ m_len = len1+len2;
+ DBG_STR(("%p: QGString::operator+=(const QGString &) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+ return *this;
+}
+
+QGString &QGString::operator+=( const char *str )
+{
+ if (!str) return *this;
+ uint len1 = length();
+ uint len2 = qstrlen(str);
+ uint memSize = ROUND_SIZE(len1 + len2 + 1);
+ assert(memSize>=len1+len2+1);
+ char *newData = memSize!=m_memSize ? (char *)realloc( m_data, memSize ) : m_data;
+ m_memSize = memSize;
+ if (newData)
+ {
+ m_data = newData;
+ memcpy( m_data + len1, str, len2 + 1 );
+ }
+ m_len+=len2;
+ DBG_STR(("%p: QGString::operator+=(const char *) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+ return *this;
+}
+
+QGString &QGString::operator+=( char c )
+{
+ uint len = m_len;
+ uint memSize = ROUND_SIZE(len+2);
+ assert(memSize>=len+2);
+ char *newData = memSize!=m_memSize ? (char *)realloc( m_data, memSize ) : m_data;
+ m_memSize = memSize;
+ if (newData)
+ {
+ m_data = newData;
+ m_data[len] = c;
+ m_data[len+1] = '\0';
+ }
+ m_len++;
+ DBG_STR(("%p: QGString::operator+=(char s) %d:%s\n",this,m_len,m_data?m_data:"<none>"));
+ return *this;
+}
+
diff --git a/qtools/qgstring.h b/qtools/qgstring.h
new file mode 100644
index 0000000..6934c93
--- /dev/null
+++ b/qtools/qgstring.h
@@ -0,0 +1,139 @@
+#ifndef QGSTRING_H
+#define QGSTRING_H
+
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(_OS_SUN_) && defined(_CC_GNU_)
+#include <strings.h>
+#endif
+
+#include "qcstring.h"
+
+/*****************************************************************************
+ Fixes and workarounds for some platforms
+ *****************************************************************************/
+
+/** This is an alternative implementation of QCString.
+ */
+class QGString
+{
+ public:
+ QGString(); // make null string
+ QGString(uint size);
+ QGString( const QGString &s );
+ QGString( const char *str );
+ ~QGString() ;
+
+ bool resize( uint newlen );
+ bool enlarge( uint newlen );
+ void setLen( uint newlen );
+
+ QGString &operator=( const QGString &s );
+ QGString &operator=( const char *str );
+ QGString &operator+=( const QGString &s );
+ QGString &operator+=( const char *str );
+ QGString &operator+=( char c );
+
+ bool isNull() const { return m_data==0; }
+ bool isEmpty() const { return m_len==0; }
+ uint length() const { return m_len; }
+ uint size() const { return m_memSize; }
+ char * data() const { return m_data; }
+ bool truncate( uint pos ) { return resize(pos+1); }
+ operator const char *() const { return (const char *)data(); }
+ char &at( uint index ) const { return m_data[index]; }
+ char &operator[]( int i ) const { return at(i); }
+
+ private:
+ char * m_data;
+ uint m_len;
+ uint m_memSize;
+};
+
+/*****************************************************************************
+ QGString non-member operators
+ *****************************************************************************/
+
+Q_EXPORT inline bool operator==( const QGString &s1, const QGString &s2 )
+{ return qstrcmp(s1.data(),s2.data()) == 0; }
+
+Q_EXPORT inline bool operator==( const QGString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) == 0; }
+
+Q_EXPORT inline bool operator==( const char *s1, const QGString &s2 )
+{ return qstrcmp(s1,s2.data()) == 0; }
+
+Q_EXPORT inline bool operator!=( const QGString &s1, const QGString &s2 )
+{ return qstrcmp(s1.data(),s2.data()) != 0; }
+
+Q_EXPORT inline bool operator!=( const QGString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) != 0; }
+
+Q_EXPORT inline bool operator!=( const char *s1, const QGString &s2 )
+{ return qstrcmp(s1,s2.data()) != 0; }
+
+Q_EXPORT inline bool operator<( const QGString &s1, const QGString& s2 )
+{ return qstrcmp(s1.data(),s2.data()) < 0; }
+
+Q_EXPORT inline bool operator<( const QGString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) < 0; }
+
+Q_EXPORT inline bool operator<( const char *s1, const QGString &s2 )
+{ return qstrcmp(s1,s2.data()) < 0; }
+
+Q_EXPORT inline bool operator<=( const QGString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) <= 0; }
+
+Q_EXPORT inline bool operator<=( const char *s1, const QGString &s2 )
+{ return qstrcmp(s1,s2.data()) <= 0; }
+
+Q_EXPORT inline bool operator>( const QGString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) > 0; }
+
+Q_EXPORT inline bool operator>( const char *s1, const QGString &s2 )
+{ return qstrcmp(s1,s2.data()) > 0; }
+
+Q_EXPORT inline bool operator>=( const QGString &s1, const char *s2 )
+{ return qstrcmp(s1.data(),s2) >= 0; }
+
+Q_EXPORT inline bool operator>=( const char *s1, const QGString &s2 )
+{ return qstrcmp(s1,s2.data()) >= 0; }
+
+Q_EXPORT inline QGString operator+( const QGString &s1, const QGString &s2 )
+{
+ QGString tmp( s1.data() );
+ tmp += s2;
+ return tmp;
+}
+
+Q_EXPORT inline QGString operator+( const QGString &s1, const char *s2 )
+{
+ QGString tmp( s1.data() );
+ tmp += s2;
+ return tmp;
+}
+
+Q_EXPORT inline QGString operator+( const char *s1, const QGString &s2 )
+{
+ QGString tmp( s1 );
+ tmp += s2;
+ return tmp;
+}
+
+Q_EXPORT inline QGString operator+( const QGString &s1, char c2 )
+{
+ QGString tmp( s1.data() );
+ tmp += c2;
+ return tmp;
+}
+
+Q_EXPORT inline QGString operator+( char c1, const QGString &s2 )
+{
+ QGString tmp;
+ tmp += c1;
+ tmp += s2;
+ return tmp;
+}
+
+#endif // QGSTRING_H
diff --git a/qtools/qgvector.cpp b/qtools/qgvector.cpp
new file mode 100644
index 0000000..88409ce
--- /dev/null
+++ b/qtools/qgvector.cpp
@@ -0,0 +1,638 @@
+/****************************************************************************
+**
+**
+** Implementation of QGVector class
+**
+** Created : 930907
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#define QGVECTOR_CPP
+#include "qgvector.h"
+#include "qglist.h"
+#include "qstring.h"
+#include "qdatastream.h"
+#include <stdlib.h>
+
+#define USE_MALLOC // comment to use new/delete
+
+#undef NEW
+#undef DELETE
+
+#if defined(USE_MALLOC)
+#define NEW(type,size) ((type*)malloc(size*sizeof(type)))
+#define DELETE(array) (free((char*)array))
+#else
+#define NEW(type,size) (new type[size])
+#define DELETE(array) (delete[] array)
+#define DONT_USE_REALLOC // comment to use realloc()
+#endif
+
+// NOT REVISED
+
+/*!
+ \class QGVector qgvector.h
+
+ \brief The QGVector class is an internal class for implementing Qt
+ collection classes.
+
+ QGVector is a strictly internal class that acts as a base class for
+ the QVector collection class.
+
+ QGVector has some virtual functions that may be reimplemented in
+ subclasses to to customize behavior.
+
+ <ul>
+ <li> compareItems() compares two collection/vector items.
+ <li> read() reads a collection/vector item from a QDataStream.
+ <li> write() writes a collection/vector item to a QDataStream.
+ </ul>
+*/
+
+/*****************************************************************************
+ Default implementation of virtual functions
+ *****************************************************************************/
+
+/*!
+ This virtual function compares two list items.
+
+ Returns:
+ <ul>
+ <li> 0 if \a item1 == \a item2
+ <li> non-zero if \a item1 != \a item2
+ </ul>
+
+ This function returns \e int rather than \e bool so that
+ reimplementations can return one of three values and use it to sort
+ by:
+
+ <ul>
+ <li> 0 if \e item1 == \e item2
+ <li> \> 0 (positive integer) if \a item1 \> \a item2
+ <li> \< 0 (negative integer) if \a item1 \< \a item2
+ </ul>
+
+ The QVector::sort() and QVector::bsearch() functions require that
+ compareItems() is implemented as described here.
+
+ This function should not modify the vector because some const
+ functions call compareItems().
+*/
+
+int QGVector::compareItems( Item d1, Item d2 )
+{
+ return d1 != d2; // compare pointers
+}
+
+#ifndef QT_NO_DATASTREAM
+/*!
+ Reads a collection/vector item from the stream \a s and returns a reference
+ to the stream.
+
+ The default implementation sets \e item to 0.
+
+ \sa write()
+*/
+
+QDataStream &QGVector::read( QDataStream &s, Item &d )
+{ // read item from stream
+ d = 0;
+ return s;
+}
+
+/*!
+ Writes a collection/vector item to the stream \a s and returns a reference
+ to the stream.
+
+ The default implementation does nothing.
+
+ \sa read()
+*/
+
+QDataStream &QGVector::write( QDataStream &s, Item ) const
+{ // write item to stream
+ return s;
+}
+#endif // QT_NO_DATASTREAM
+
+/*****************************************************************************
+ QGVector member functions
+ *****************************************************************************/
+
+/*!
+ \internal
+*/
+
+QGVector::QGVector() // create empty vector
+{
+ vec = 0;
+ len = numItems = 0;
+}
+
+/*!
+ \internal
+*/
+QGVector::QGVector( uint size ) // create vectors with nullptrs
+{
+ len = size;
+ numItems = 0;
+ if ( len == 0 ) { // zero length
+ vec = 0;
+ return;
+ }
+ vec = NEW(Item,len);
+ CHECK_PTR( vec );
+ memset( (void*)vec, 0, len*sizeof(Item) ); // fill with nulls
+}
+
+/*!
+ \internal
+*/
+
+QGVector::QGVector( const QGVector &a ) // make copy of other vector
+ : QCollection( a )
+{
+ len = a.len;
+ numItems = a.numItems;
+ vec = NEW(Item,len);
+ CHECK_PTR( vec );
+ for ( uint i=0; i<len; i++ ) {
+ vec[i] = a.vec[i] ? newItem( a.vec[i] ) : 0;
+ CHECK_PTR( vec[i] );
+ }
+}
+
+/*!
+ \internal
+*/
+
+QGVector::~QGVector()
+{
+ clear();
+}
+
+
+/*!
+ \internal
+*/
+
+QGVector& QGVector::operator=( const QGVector &v )
+{ // assign from other vector
+ clear(); // first delete old vector
+ len = v.len;
+ numItems = v.numItems;
+ vec = NEW(Item,len); // create new vector
+ CHECK_PTR( vec );
+ for ( uint i=0; i<len; i++ ) { // copy elements
+ vec[i] = v.vec[i] ? newItem( v.vec[i] ) : 0;
+ CHECK_PTR( vec[i] );
+ }
+ return *this;
+}
+
+
+/*!
+ \fn Item *QGVector::data() const
+ \internal
+*/
+
+/*!
+ \fn uint QGVector::size() const
+ \internal
+*/
+
+/*!
+ \fn uint QGVector::count() const
+ \internal
+*/
+
+/*!
+ \fn Item QGVector::at( uint index ) const
+ \internal
+*/
+
+/*!
+ \internal
+*/
+
+bool QGVector::insert( uint index, Item d ) // insert item at index
+{
+#if defined(CHECK_RANGE)
+ if ( index >= len ) { // range error
+ qWarning( "QGVector::insert: Index %d out of range", index );
+ return FALSE;
+ }
+#endif
+ if ( vec[index] ) { // remove old item
+ deleteItem( vec[index] );
+ numItems--;
+ }
+ if ( d ) {
+ vec[index] = newItem( d );
+ CHECK_PTR( vec[index] );
+ numItems++;
+ return vec[index] != 0;
+ } else {
+ vec[index] = 0; // reset item
+ }
+ return TRUE;
+}
+
+/*!
+ \internal
+*/
+
+bool QGVector::remove( uint index ) // remove item at index
+{
+#if defined(CHECK_RANGE)
+ if ( index >= len ) { // range error
+ qWarning( "QGVector::remove: Index %d out of range", index );
+ return FALSE;
+ }
+#endif
+ if ( vec[index] ) { // valid item
+ deleteItem( vec[index] ); // delete it
+ vec[index] = 0; // reset pointer
+ numItems--;
+ }
+ return TRUE;
+}
+
+/*!
+ \internal
+*/
+
+QCollection::Item QGVector::take( uint index ) // take out item
+{
+#if defined(CHECK_RANGE)
+ if ( index >= len ) { // range error
+ qWarning( "QGVector::take: Index %d out of range", index );
+ return 0;
+ }
+#endif
+ Item d = vec[index]; // don't delete item
+ if ( d )
+ numItems--;
+ vec[index] = 0;
+ return d;
+}
+
+
+/*!
+ \internal
+*/
+
+void QGVector::clear() // clear vector
+{
+ if ( vec ) {
+ for ( uint i=0; i<len; i++ ) { // delete each item
+ if ( vec[i] )
+ deleteItem( vec[i] );
+ }
+ DELETE(vec);
+ vec = 0;
+ len = numItems = 0;
+ }
+}
+
+/*!
+ \internal
+*/
+
+bool QGVector::resize( uint newsize ) // resize array
+{
+ if ( newsize == len ) // nothing to do
+ return TRUE;
+ if ( vec ) { // existing data
+ if ( newsize < len ) { // shrink vector
+ uint i = newsize;
+ while ( i < len ) { // delete lost items
+ if ( vec[i] ) {
+ deleteItem( vec[i] );
+ numItems--;
+ }
+ i++;
+ }
+ }
+ if ( newsize == 0 ) { // vector becomes empty
+ DELETE(vec);
+ vec = 0;
+ len = numItems = 0;
+ return TRUE;
+ }
+#if defined(DONT_USE_REALLOC)
+ Item *newvec = NEW(Item,newsize); // manual realloc
+ memcpy( newvec, vec, (len < newsize ? len : newsize)*sizeof(Item) );
+ DELETE(vec);
+ vec = newvec;
+#else
+ vec = (Item*)realloc( (char *)vec, newsize*sizeof(Item) );
+#endif
+ } else { // create new vector
+ vec = NEW(Item,newsize);
+ len = numItems = 0;
+ }
+ CHECK_PTR( vec );
+ if ( !vec ) // no memory
+ return FALSE;
+ if ( newsize > len ) // init extra space added
+ memset( (void*)&vec[len], 0, (newsize-len)*sizeof(Item) );
+ len = newsize;
+ return TRUE;
+}
+
+
+/*!
+ \internal
+*/
+
+bool QGVector::fill( Item d, int flen ) // resize and fill vector
+{
+ if ( flen < 0 )
+ flen = len; // default: use vector length
+ else if ( !resize( flen ) )
+ return FALSE;
+ for ( uint i=0; i<(uint)flen; i++ ) // insert d at every index
+ insert( i, d );
+ return TRUE;
+}
+
+
+static QGVector *sort_vec=0; // current sort vector
+
+
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+static int cmp_vec( const void *n1, const void *n2 )
+{
+ return sort_vec->compareItems( *((QCollection::Item*)n1), *((QCollection::Item*)n2) );
+}
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+
+/*!
+ \internal
+*/
+
+void QGVector::sort() // sort vector
+{
+ if ( count() == 0 ) // no elements
+ return;
+ register Item *start = &vec[0];
+ register Item *end = &vec[len-1];
+ Item tmp;
+ while ( TRUE ) { // put all zero elements behind
+ while ( start < end && *start != 0 )
+ start++;
+ while ( end > start && *end == 0 )
+ end--;
+ if ( start < end ) {
+ tmp = *start;
+ *start = *end;
+ *end = tmp;
+ } else {
+ break;
+ }
+ }
+ sort_vec = (QGVector*)this;
+ qsort( vec, count(), sizeof(Item), cmp_vec );
+ sort_vec = 0;
+}
+
+/*!
+ \internal
+*/
+
+int QGVector::bsearch( Item d ) const // binary search; when sorted
+{
+ if ( !len )
+ return -1;
+ if ( !d ) {
+#if defined(CHECK_NULL)
+ qWarning( "QGVector::bsearch: Cannot search for null object" );
+#endif
+ return -1;
+ }
+ int n1 = 0;
+ int n2 = len - 1;
+ int mid = 0;
+ bool found = FALSE;
+ while ( n1 <= n2 ) {
+ int res;
+ mid = (n1 + n2)/2;
+ if ( vec[mid] == 0 ) // null item greater
+ res = -1;
+ else
+ res = ((QGVector*)this)->compareItems( d, vec[mid] );
+ if ( res < 0 )
+ n2 = mid - 1;
+ else if ( res > 0 )
+ n1 = mid + 1;
+ else { // found it
+ found = TRUE;
+ break;
+ }
+ }
+ if ( !found )
+ return -1;
+ // search to first of equal items
+ while ( (mid - 1 >= 0) && !((QGVector*)this)->compareItems(d, vec[mid-1]) )
+ mid--;
+ return mid;
+}
+
+
+/*!
+ \internal
+*/
+
+int QGVector::findRef( Item d, uint index) const // find exact item in vector
+{
+#if defined(CHECK_RANGE)
+ if ( index >= len ) { // range error
+ qWarning( "QGVector::findRef: Index %d out of range", index );
+ return -1;
+ }
+#endif
+ for ( uint i=index; i<len; i++ ) {
+ if ( vec[i] == d )
+ return i;
+ }
+ return -1;
+}
+
+/*!
+ \internal
+*/
+
+int QGVector::find( Item d, uint index ) const // find equal item in vector
+{
+#if defined(CHECK_RANGE)
+ if ( index >= len ) { // range error
+ qWarning( "QGVector::find: Index %d out of range", index );
+ return -1;
+ }
+#endif
+ for ( uint i=index; i<len; i++ ) {
+ if ( vec[i] == 0 && d == 0 ) // found null item
+ return i;
+ if ( vec[i] && ((QGVector*)this)->compareItems( vec[i], d ) == 0 )
+ return i;
+ }
+ return -1;
+}
+
+/*!
+ \internal
+*/
+
+uint QGVector::containsRef( Item d ) const // get number of exact matches
+{
+ uint count = 0;
+ for ( uint i=0; i<len; i++ ) {
+ if ( vec[i] == d )
+ count++;
+ }
+ return count;
+}
+
+/*!
+ \internal
+*/
+
+uint QGVector::contains( Item d ) const // get number of equal matches
+{
+ uint count = 0;
+ for ( uint i=0; i<len; i++ ) {
+ if ( vec[i] == 0 && d == 0 ) // count null items
+ count++;
+ if ( vec[i] && ((QGVector*)this)->compareItems( vec[i], d ) == 0 )
+ count++;
+ }
+ return count;
+}
+
+
+/*!
+ \internal
+*/
+
+bool QGVector::insertExpand( uint index, Item d )// insert and grow if necessary
+{
+ if ( index >= len ) {
+ if ( !resize( index+1 ) ) // no memory
+ return FALSE;
+ }
+ insert( index, d );
+ return TRUE;
+}
+
+
+/*!
+ \internal
+*/
+
+void QGVector::toList( QGList *list ) const // store items in list
+{
+ list->clear();
+ for ( uint i=0; i<len; i++ ) {
+ if ( vec[i] )
+ list->append( vec[i] );
+ }
+}
+
+
+void QGVector::warningIndexRange( uint i )
+{
+#if defined(CHECK_RANGE)
+ qWarning( "QGVector::operator[]: Index %d out of range", i );
+#else
+ Q_UNUSED( i )
+#endif
+}
+
+
+/*****************************************************************************
+ QGVector stream functions
+ *****************************************************************************/
+#ifndef QT_NO_DATASTREAM
+QDataStream &operator>>( QDataStream &s, QGVector &vec )
+{ // read vector
+ return vec.read( s );
+}
+
+QDataStream &operator<<( QDataStream &s, const QGVector &vec )
+{ // write vector
+ return vec.write( s );
+}
+
+/*!
+ \internal
+*/
+
+QDataStream &QGVector::read( QDataStream &s ) // read vector from stream
+{
+ uint num;
+ s >> num; // read number of items
+ clear(); // clear vector
+ resize( num );
+ for (uint i=0; i<num; i++) { // read all items
+ Item d;
+ read( s, d );
+ CHECK_PTR( d );
+ if ( !d ) // no memory
+ break;
+ vec[i] = d;
+ }
+ return s;
+}
+
+/*!
+ \internal
+*/
+
+QDataStream &QGVector::write( QDataStream &s ) const
+{ // write vector to stream
+ uint num = count();
+ s << num; // number of items to write
+ num = size();
+ for (uint i=0; i<num; i++) { // write non-null items
+ if ( vec[i] )
+ write( s, vec[i] );
+ }
+ return s;
+}
+#endif // QT_NO_DATASTREAM
diff --git a/qtools/qgvector.h b/qtools/qgvector.h
new file mode 100644
index 0000000..6a7999d
--- /dev/null
+++ b/qtools/qgvector.h
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+**
+** Definition of QGVector class
+**
+** Created : 930907
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QGVECTOR_H
+#define QGVECTOR_H
+
+#ifndef QT_H
+#include "qcollection.h"
+#endif // QT_H
+
+
+class Q_EXPORT QGVector : public QCollection // generic vector
+{
+friend class QGList; // needed by QGList::toVector
+public:
+#ifndef QT_NO_DATASTREAM
+ QDataStream &read( QDataStream & ); // read vector from stream
+ QDataStream &write( QDataStream & ) const; // write vector to stream
+#endif
+ virtual int compareItems( Item, Item );
+
+protected:
+ QGVector(); // create empty vector
+ QGVector( uint size ); // create vector with nullptrs
+ QGVector( const QGVector &v ); // make copy of other vector
+ ~QGVector();
+
+ QGVector &operator=( const QGVector &v ); // assign from other vector
+
+ Item *data() const { return vec; }
+ uint size() const { return len; }
+ uint count() const { return numItems; }
+
+ bool insert( uint index, Item ); // insert item at index
+ bool remove( uint index ); // remove item
+ Item take( uint index ); // take out item
+
+ void clear(); // clear vector
+ bool resize( uint newsize ); // resize vector
+
+ bool fill( Item, int flen ); // resize and fill vector
+
+ void sort(); // sort vector
+ int bsearch( Item ) const; // binary search (when sorted)
+
+ int findRef( Item, uint index ) const; // find exact item in vector
+ int find( Item, uint index ) const; // find equal item in vector
+ uint containsRef( Item ) const; // get number of exact matches
+ uint contains( Item ) const; // get number of equal matches
+
+ Item at( uint index ) const // return indexed item
+ {
+#if defined(CHECK_RANGE)
+ if ( index >= len )
+ warningIndexRange( index );
+#endif
+ return vec[index];
+ }
+
+ bool insertExpand( uint index, Item ); // insert, expand if necessary
+
+ void toList( QGList * ) const; // put items in list
+
+#ifndef QT_NO_DATASTREAM
+ virtual QDataStream &read( QDataStream &, Item & );
+ virtual QDataStream &write( QDataStream &, Item ) const;
+#endif
+private:
+ Item *vec;
+ uint len;
+ uint numItems;
+
+ static void warningIndexRange( uint );
+};
+
+
+/*****************************************************************************
+ QGVector stream functions
+ *****************************************************************************/
+
+#ifndef QT_NO_DATASTREAM
+Q_EXPORT QDataStream &operator>>( QDataStream &, QGVector & );
+Q_EXPORT QDataStream &operator<<( QDataStream &, const QGVector & );
+#endif
+
+#endif // QGVECTOR_H
diff --git a/qtools/qintdict.doc b/qtools/qintdict.doc
new file mode 100644
index 0000000..e027fb2
--- /dev/null
+++ b/qtools/qintdict.doc
@@ -0,0 +1,475 @@
+/****************************************************************************
+**
+**
+** QIntDict and QIntDictIterator class documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+
+/*****************************************************************************
+ QIntDict documentation
+ *****************************************************************************/
+
+/*!
+ \class QIntDict qintdict.h
+ \brief The QIntDict class is a template class that provides a dictionary based on \c long keys.
+
+ \ingroup collection
+ \ingroup tools
+
+ QIntDict is implemented as a template class. Define a
+ template instance QIntDict\<X\> to create a dictionary that operates on
+ pointers to X, or X*.
+
+ A dictionary is a collection that associates an item with a key.
+ The key is used for inserting and looking up an item. QIntDict has
+ \c long keys.
+
+ The dictionary has very fast insertion and lookup.
+
+ Example:
+ \code
+ #include <qintdict.h>
+ #include <stdio.h>
+
+ void main()
+ {
+ QIntDict<char> dict; // maps long ==> char*
+
+ dict.insert( 33, "France" );
+ dict.insert( 7, "Russia" );
+ dict.insert( 49, "Norway" );
+
+ printf( "%s\n", dict[49] );
+ printf( "%s\n", dict[33] );
+ printf( "%s\n", dict[7] );
+
+ if ( !dict[39] )
+ printf( "39 not defined\n" );
+ }
+ \endcode
+
+ Program output:
+ \code
+ Norway
+ France
+ Russia
+ 39 not defined
+ \endcode
+
+ The dictionary in our example maps \c long keys to \c char* items.
+ QIntDict implements the \link operator[] [] operator\endlink to lookup
+ an item.
+
+ QIntDict is implemented by QGDict as a hash array with a fixed number of
+ entries. Each array entry points to a singly linked list of buckets, in
+ which the dictionary items are stored.
+
+ When an item is inserted with a key, the key is converted (hashed) to
+ an integer index into the hash array using the \c mod operation. The
+ item is inserted before the first bucket in the list of buckets.
+
+ Looking up an item is normally very fast. The key is again hashed to an
+ array index. Then QIntDict scans the list of buckets and returns the item
+ found or null if the item was not found. You cannot insert null pointers
+ into a dictionary.
+
+ The size of the hash array is very important. In order to get good
+ performance, you should use a suitably large \link primes.html prime
+ number\endlink. Suitable means equal to or larger than the maximum
+ expected number of dictionary items.
+
+ Items with equal keys are allowed. When inserting two items with the
+ same key, only the last inserted item will be visible (last in, first out)
+ until it is removed.
+
+ Example:
+ \code
+ #include <qintdict.h>
+ #include <stdio.h>
+
+ void main()
+ {
+ QIntDict<char> dict; // maps long ==> char*
+
+ dict.insert( 7, "Russia" );
+ dict.insert( 7, "USSR" );
+
+ printf( "%s\n", dict[7] );
+ dict.remove( 7 ); // Gorbie was here
+ printf( "%s\n", dict[7] );
+ }
+ \endcode
+
+ Program output:
+ \code
+ USSR
+ Russia
+ \endcode
+
+ The QIntDictIterator class can traverse the dictionary contents, but only
+ in an arbitrary order. Multiple iterators may independently traverse the
+ same dictionary.
+
+ Calling setAutoDelete(TRUE) for a dictionary tells it to delete items
+ that are removed . The default is to not delete items when they are
+ removed.
+
+ When inserting an item into a dictionary, only the pointer is copied, not
+ the item itself. This is called a shallow copy. It is possible to make the
+ dictionary copy all of the item's data (known as a deep copy) when an
+ item is inserted. insert() calls the virtual function
+ QCollection::newItem() for the item to be inserted.
+ Inherit a dictionary and reimplement it if you want deep copies.
+
+ When removing a dictionary item, the virtual function
+ QCollection::deleteItem() is called. QIntDict's default implementation
+ is to delete the item if auto-deletion is enabled.
+
+ \sa QIntDictIterator, QDict, QAsciiDict, QPtrDict,
+ \link collection.html Collection Classes\endlink
+*/
+
+
+/*!
+ \fn QIntDict::QIntDict( int size )
+ Constructs a dictionary using an internal hash array with the size
+ \e size.
+
+ Setting \e size to a suitably large \link primes.html prime number\endlink
+ (equal to or greater than the expected number of entries) makes the hash
+ distribution better and hence the loopup faster.
+*/
+
+/*!
+ \fn QIntDict::QIntDict( const QIntDict<type> &dict )
+ Constructs a copy of \e dict.
+
+ Each item in \e dict are inserted into this dictionary.
+ Only the pointers are copied (shallow copy).
+*/
+
+/*!
+ \fn QIntDict::~QIntDict()
+ Removes all items from the dictionary and destroys it.
+
+ All iterators that access this dictionary will be reset.
+
+ \sa setAutoDelete()
+*/
+
+/*!
+ \fn QIntDict<type> &QIntDict::operator=(const QIntDict<type> &dict)
+ Assigns \e dict to this dictionary and returns a reference to this
+ dictionary.
+
+ This dictionary is first cleared, then each item in \e dict is inserted
+ into this dictionary.
+ Only the pointers are copied (shallow copy), unless newItem() has been
+ reimplemented.
+*/
+
+/*!
+ \fn uint QIntDict::count() const
+ Returns the number of items in the dictionary.
+ \sa isEmpty()
+*/
+
+/*!
+ \fn uint QIntDict::size() const
+ Returns the size of the internal hash array (as specified in the
+ constructor).
+ \sa count()
+*/
+
+/*!
+ \fn void QIntDict::resize( uint newsize )
+ Changes the size of the hashtable the \a newsize.
+ The contents of the dictionary are preserved,
+ but all iterators on the dictionary become invalid.
+*/
+
+/*!
+ \fn bool QIntDict::isEmpty() const
+ Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
+ otherwise.
+ \sa count()
+*/
+
+/*!
+ \fn void QIntDict::insert( long key, const type *item )
+ Inserts the \e key with the \e item into the dictionary.
+
+ The key does not have to be a unique dictionary key. If multiple items
+ are inserted with the same key, only the last item will be visible.
+
+ Null items are not allowed.
+
+ \sa replace()
+*/
+
+/*!
+ \fn void QIntDict::replace( long key, const type *item )
+ Replaces an item which has a key equal to \e key with \e item.
+
+ If the item does not already exist, it will be inserted.
+
+ Null items are not allowed.
+
+ Equivalent to:
+ \code
+ QIntDict<char> dict;
+ ...
+ if ( dict.find(key) )
+ dict.remove( key );
+ dict.insert( key, item );
+ \endcode
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be replaced.
+
+ \sa insert()
+*/
+
+/*!
+ \fn bool QIntDict::remove( long key )
+ Removes the item associated with \e key from the dictionary.
+ Returns TRUE if successful, or FALSE if the key does not exist in the
+ dictionary.
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be removed.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ All dictionary iterators that refer to the removed item will be set to
+ point to the next item in the dictionary traversing order.
+
+ \sa take(), clear(), setAutoDelete()
+*/
+
+/*!
+ \fn type *QIntDict::take( long key )
+ Takes the item associated with \e key out of the dictionary without
+ deleting it (even if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled).
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be taken.
+
+ Returns a pointer to the item taken out, or null if the key does not
+ exist in the dictionary.
+
+ All dictionary iterators that refer to the taken item will be set to
+ point to the next item in the dictionary traversing order.
+
+ \sa remove(), clear(), setAutoDelete()
+*/
+
+/*!
+ \fn void QIntDict::clear()
+ Removes all items from the dictionary.
+
+ The removed items are deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ All dictionary iterators that access this dictionary will be reset.
+
+ \sa remove(), take(), setAutoDelete()
+*/
+
+/*!
+ \fn type *QIntDict::find( long key ) const
+ Returns the item associated with \e key, or null if the key does not
+ exist in the dictionary.
+
+ This function uses an internal hashing algorithm to optimize lookup.
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be found.
+
+ Equivalent to the [] operator.
+
+ \sa operator[]()
+*/
+
+/*!
+ \fn type *QIntDict::operator[]( long key ) const
+ Returns the item associated with \e key, or null if the key does not
+ exist in the dictionary.
+
+ This function uses an internal hashing algorithm to optimize lookup.
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be found.
+
+ Equivalent to the find() function.
+
+ \sa find()
+*/
+
+/*!
+ \fn void QIntDict::statistics() const
+ Debugging-only function that prints out the dictionary distribution
+ using qDebug().
+*/
+
+
+/*****************************************************************************
+ QIntDictIterator documentation
+ *****************************************************************************/
+
+/*!
+ \class QIntDictIterator qintdict.h
+ \brief The QIntDictIterator class provides an iterator for QIntDict collections.
+
+ \ingroup collection
+ \ingroup tools
+
+ QIntDictIterator is implemented as a template class.
+ Define a template instance QIntDictIterator\<X\> to create a
+ dictionary iterator that operates on QIntDict\<X\> (dictionary of X*).
+
+ Example:
+ \code
+ #include <qintdict.h>
+ #include <stdio.h>
+
+ void main()
+ {
+ QIntDict<char> dict; // maps long ==> char*
+
+ dict.insert( 33, "France" );
+ dict.insert( 7, "Russia" );
+ dict.insert( 49, "Norway" );
+
+ QIntDictIterator<char> it( dict ); // iterator for dict
+
+ while ( it.current() ) {
+ printf( "%d -> %s\n", it.currentKey(), it.current() );
+ ++it;
+ }
+ }
+ \endcode
+
+ Program output:
+ \code
+ 7 -> Russia
+ 49 -> Norway
+ 33 -> France
+ \endcode
+
+ Note that the traversal order is arbitrary, you are not guaranteed the
+ order above.
+
+ Multiple iterators may independently traverse the same dictionary.
+ A QIntDict knows about all iterators that are operating on the dictionary.
+ When an item is removed from the dictionary, QIntDict update all
+ iterators that are referring the removed item to point to the next item
+ in the traversing order.
+
+ \sa QIntDict, \link collection.html Collection Classes\endlink
+*/
+
+/*!
+ \fn QIntDictIterator::QIntDictIterator( const QIntDict<type> &dict )
+ Constructs an iterator for \e dict. The current iterator item is
+ set to point on the first item in the \e dict.
+*/
+
+/*!
+ \fn QIntDictIterator::~QIntDictIterator()
+ Destroys the iterator.
+*/
+
+/*!
+ \fn uint QIntDictIterator::count() const
+ Returns the number of items in the dictionary this iterator operates on.
+ \sa isEmpty()
+*/
+
+/*!
+ \fn bool QIntDictIterator::isEmpty() const
+ Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
+ otherwise.
+ \sa count()
+*/
+
+/*!
+ \fn type *QIntDictIterator::toFirst()
+ Sets the current iterator item to point to the first item in the
+ dictionary and returns a pointer to the item.
+ If the dictionary is empty it sets the current item to null and
+ returns null.
+*/
+
+/*!
+ \fn QIntDictIterator::operator type *() const
+ Cast operator. Returns a pointer to the current iterator item.
+ Same as current().
+*/
+
+/*!
+ \fn type *QIntDictIterator::current() const
+ Returns a pointer to the current iterator item.
+*/
+
+/*!
+ \fn long QIntDictIterator::currentKey() const
+ Returns the key for the current iterator item.
+*/
+
+/*!
+ \fn type *QIntDictIterator::operator()()
+ Makes the succeeding item current and returns the original current item.
+
+ If the current iterator item was the last item in the dictionary or if it
+ was null, null is returned.
+*/
+
+/*!
+ \fn type *QIntDictIterator::operator++()
+ Prefix ++ makes the succeeding item current and returns the new current
+ item.
+
+ If the current iterator item was the last item in the dictionary or if it
+ was null, null is returned.
+*/
+
+/*!
+ \fn type *QIntDictIterator::operator+=( uint jump )
+ Sets the current item to the item \e jump positions after the current item,
+ and returns a pointer to that item.
+
+ If that item is beyond the last item or if the dictionary is empty,
+ it sets the current item to null and returns null.
+*/
diff --git a/qtools/qintdict.h b/qtools/qintdict.h
new file mode 100644
index 0000000..ddc5fdf
--- /dev/null
+++ b/qtools/qintdict.h
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+**
+** Definition of QIntDict template class
+**
+** Created : 940624
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QINTDICT_H
+#define QINTDICT_H
+
+#ifndef QT_H
+#include "qgdict.h"
+#endif // QT_H
+
+
+template<class type> class Q_EXPORT QIntDict : public QGDict
+{
+public:
+ QIntDict(int size=17) : QGDict(size,IntKey,0,0) {}
+ QIntDict( const QIntDict<type> &d ) : QGDict(d) {}
+ ~QIntDict() { clear(); }
+ QIntDict<type> &operator=(const QIntDict<type> &d)
+ { return (QIntDict<type>&)QGDict::operator=(d); }
+ uint count() const { return QGDict::count(); }
+ uint size() const { return QGDict::size(); }
+ bool isEmpty() const { return QGDict::count() == 0; }
+ void insert( long k, const type *d )
+ { QGDict::look_int(k,(Item)d,1); }
+ void replace( long k, const type *d )
+ { QGDict::look_int(k,(Item)d,2); }
+ bool remove( long k ) { return QGDict::remove_int(k); }
+ type *take( long k ) { return (type*)QGDict::take_int(k); }
+ type *find( long k ) const
+ { return (type *)((QGDict*)this)->QGDict::look_int(k,0,0); }
+ type *operator[]( long k ) const
+ { return (type *)((QGDict*)this)->QGDict::look_int(k,0,0); }
+ void clear() { QGDict::clear(); }
+ void resize( uint n ) { QGDict::resize(n); }
+ void statistics() const { QGDict::statistics(); }
+private:
+ void deleteItem( Item d );
+};
+
+#if defined(Q_DELETING_VOID_UNDEFINED)
+template<> inline void QIntDict<void>::deleteItem( QCollection::Item )
+{
+}
+#endif
+
+template<class type> inline void QIntDict<type>::deleteItem( QCollection::Item d )
+{
+ if ( del_item ) delete (type *)d;
+}
+
+template<class type> class Q_EXPORT QIntDictIterator : public QGDictIterator
+{
+public:
+ QIntDictIterator(const QIntDict<type> &d) :QGDictIterator((QGDict &)d) {}
+ ~QIntDictIterator() {}
+ uint count() const { return dict->count(); }
+ bool isEmpty() const { return dict->count() == 0; }
+ type *toFirst() { return (type *)QGDictIterator::toFirst(); }
+ operator type *() const { return (type *)QGDictIterator::get(); }
+ type *current() const { return (type *)QGDictIterator::get(); }
+ long currentKey() const { return QGDictIterator::getKeyInt(); }
+ type *operator()() { return (type *)QGDictIterator::operator()(); }
+ type *operator++() { return (type *)QGDictIterator::operator++(); }
+ type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
+};
+
+
+#endif // QINTDICT_H
diff --git a/qtools/qiodevice.cpp b/qtools/qiodevice.cpp
new file mode 100644
index 0000000..43b2787
--- /dev/null
+++ b/qtools/qiodevice.cpp
@@ -0,0 +1,638 @@
+/****************************************************************************
+**
+**
+** Implementation of QIODevice class
+**
+** Created : 940913
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qiodevice.h"
+
+// NOT REVISED
+/*!
+ \class QIODevice qiodevice.h
+
+ \brief The QIODevice class is the base class of I/O devices.
+
+ \ingroup io
+
+ An I/O device represents a medium that one can read bytes from
+ and/or write bytes to. The QIODevice class is the abstract
+ superclass of all such devices; classes like QFile, QBuffer and
+ QSocket inherit QIODevice and implement virtual functions like
+ write() appropriately.
+
+ While applications sometimes use QIODevice directly, mostly it is
+ better to go through QTextStream and QDataStream, which provide
+ stream operations on any QIODevice subclass. QTextStream provides
+ text-oriented stream functionality (for human-readable ASCII files,
+ for example), while QDataStream deals with binary data in a totally
+ platform-independent manner.
+
+ The public member functions in QIODevice roughly fall into two
+ groups: The action functions and the state access functions. The
+ most important action functions are: <ul>
+
+ <li> open() opens a device for reading and/or writing, depending on
+ the argument to open().
+
+ <li> close() closes the device and tidies up.
+
+ <li> readBlock() reads a block of data from the device.
+
+ <li> writeBlock() writes a block of data to the device.
+
+ <li> readLine() reads a line (of text, usually) from the device.
+
+ <li> flush() ensures that all buffered data are written to the real device.
+
+ </ul>There are also some other, less used, action functions: <ul>
+
+ <li> getch() reads a single character.
+
+ <li> ungetch() forgets the last call to getch(), if possible.
+
+ <li> putch() writes a single character.
+
+ <li> size() returns the size of the device, if there is one.
+
+ <li> at() returns the current read/write pointer, if there is one
+ for this device, or it moves the pointer.
+
+ <li> atEnd() says whether there is more to read, if that is a
+ meaningful question for this device.
+
+ <li> reset() moves the read/write pointer to the start of the
+ device, if that is possible for this device.
+
+ </ul>The state access are all "get" functions. The QIODevice subclass
+ calls setState() to update the state, and simple access functions
+ tell the user of the device what the device's state is. Here are
+ the settings, and their associated access functions: <ul>
+
+ <li> Access type. Some devices are direct access (it is possible to
+ read/write anywhere) while others are sequential. QIODevice
+ provides the access functions isDirectAccess(), isSequentialAccess()
+ and isCombinedAccess() to tell users what a given I/O device
+ supports.
+
+ <li> Buffering. Some devices are accessed in raw mode while others
+ are buffered. Buffering usually provides greater efficiency,
+ particularly for small read/write operations. isBuffered() tells
+ the user whether a given device is buffered. (This can often be set
+ by the application in the call to open().)
+
+ <li> Synchronicity. Synchronous devices work there and then, for
+ example files. When you read from a file, the file delivers its
+ data right away. Others, such as a socket connected to a HTTP
+ server, may not deliver the data until seconds after you ask to read
+ it. isSynchronous() and isAsynchronous() tells the user how this
+ device operates.
+
+ <li> CR/LF translation. For simplicity, applications often like to
+ see just a single CR/LF style, and QIODevice subclasses can provide
+ that. isTranslated() returns TRUE if this object translates CR/LF
+ to just LF. (This can often be set by the application in the call
+ to open().)
+
+ <li> Accessibility. Some files cannot be written, for example.
+ isReadable(), isWritable and isReadWrite() tells the application
+ whether it can read from and write to a given device. (This can
+ often be set by the application in the call to open().)
+
+ <li> Finally, isOpen() returns TRUE if the device is open. This can
+ quite obviously be set using open() :)
+
+ </ul>
+
+ QIODevice provides numerous pure virtual functions you need to
+ implement when subclassing it. Here is a skeleton subclass with all
+ the members you are certain to need, and some it's likely that you
+ will need:
+
+ \code
+ class YourDevice : public QIODevice
+ {
+ public:
+ YourDevice();
+ ~YourDevice();
+
+ bool open( int mode );
+ void close();
+ void flush();
+
+ uint size() const;
+ int at() const; // not a pure virtual function
+ bool at( int ); // not a pure virtual function
+ bool atEnd() const; // not a pure virtual function
+
+ int readBlock( char *data, uint maxlen );
+ int writeBlock( const char *data, uint len );
+ int readLine( char *data, uint maxlen );
+
+ int getch();
+ int putch( int );
+ int ungetch( int );
+ };
+ \endcode
+
+ The three non-pure virtual functions can be ignored if your device
+ is sequential (e.g. an RS-232 port).
+
+ \sa QDataStream, QTextStream
+*/
+
+
+/*!
+ Constructs an I/O device.
+*/
+
+QIODevice::QIODevice()
+{
+ ioMode = 0; // initial mode
+ ioSt = IO_Ok;
+ ioIndex = 0;
+}
+
+/*!
+ Destructs the I/O device.
+*/
+
+QIODevice::~QIODevice()
+{
+}
+
+
+/*!
+ \fn int QIODevice::flags() const
+ Returns the current I/O device flags setting.
+
+ Flags consists of mode flags and state flags.
+
+ \sa mode(), state()
+*/
+
+/*!
+ \fn int QIODevice::mode() const
+ Returns bits OR'ed together that specify the current operation mode.
+
+ These are the flags that were given to the open() function.
+
+ The flags are: \c IO_ReadOnly, \c IO_WriteOnly, \c IO_ReadWrite,
+ \c IO_Append, \c IO_Truncate and \c IO_Translate.
+*/
+
+/*!
+ \fn int QIODevice::state() const
+ Returns bits OR'ed together that specify the current state.
+
+ The flags are: \c IO_Open.
+
+ Subclasses may define more flags.
+*/
+
+/*!
+ \fn bool QIODevice::isDirectAccess() const
+ Returns TRUE if the I/O device is a direct access (not sequential) device,
+ otherwise FALSE.
+ \sa isSequentialAccess()
+*/
+
+/*!
+ \fn bool QIODevice::isSequentialAccess() const
+ Returns TRUE if the I/O device is a sequential access (not direct) device,
+ otherwise FALSE. Operations involving size() and at(int) are not valid
+ on sequential devices.
+ \sa isDirectAccess()
+*/
+
+/*!
+ \fn bool QIODevice::isCombinedAccess() const
+ Returns TRUE if the I/O device is a combined access (both direct and
+ sequential) device, otherwise FALSE.
+
+ This access method is currently not in use.
+*/
+
+/*!
+ \fn bool QIODevice::isBuffered() const
+ Returns TRUE if the I/O device is a buffered (not raw) device, otherwise
+ FALSE.
+ \sa isRaw()
+*/
+
+/*!
+ \fn bool QIODevice::isRaw() const
+ Returns TRUE if the I/O device is a raw (not buffered) device, otherwise
+ FALSE.
+ \sa isBuffered()
+*/
+
+/*!
+ \fn bool QIODevice::isSynchronous() const
+ Returns TRUE if the I/O device is a synchronous device, otherwise
+ FALSE.
+ \sa isAsynchronous()
+*/
+
+/*!
+ \fn bool QIODevice::isAsynchronous() const
+ Returns TRUE if the I/O device is a asynchronous device, otherwise
+ FALSE.
+
+ This mode is currently not in use.
+
+ \sa isSynchronous()
+*/
+
+/*!
+ \fn bool QIODevice::isTranslated() const
+ Returns TRUE if the I/O device translates carriage-return and linefeed
+ characters.
+
+ A QFile is translated if it is opened with the \c IO_Translate mode
+ flag.
+*/
+
+/*!
+ \fn bool QIODevice::isReadable() const
+ Returns TRUE if the I/O device was opened using \c IO_ReadOnly or
+ \c IO_ReadWrite mode.
+ \sa isWritable(), isReadWrite()
+*/
+
+/*!
+ \fn bool QIODevice::isWritable() const
+ Returns TRUE if the I/O device was opened using \c IO_WriteOnly or
+ \c IO_ReadWrite mode.
+ \sa isReadable(), isReadWrite()
+*/
+
+/*!
+ \fn bool QIODevice::isReadWrite() const
+ Returns TRUE if the I/O device was opened using \c IO_ReadWrite mode.
+ \sa isReadable(), isWritable()
+*/
+
+/*!
+ \fn bool QIODevice::isInactive() const
+ Returns TRUE if the I/O device state is 0, i.e. the device is not open.
+ \sa isOpen()
+*/
+
+/*!
+ \fn bool QIODevice::isOpen() const
+ Returns TRUE if the I/O device state has been opened, otherwise FALSE.
+ \sa isInactive()
+*/
+
+
+/*!
+ \fn int QIODevice::status() const
+ Returns the I/O device status.
+
+ The I/O device status returns an error code. If open() returns FALSE
+ or readBlock() or writeBlock() return -1, this function can be called to
+ get the reason why the operation did not succeed.
+
+ The status codes are:
+ <ul>
+ <li>\c IO_Ok The operation was successful.
+ <li>\c IO_ReadError Could not read from the device.
+ <li>\c IO_WriteError Could not write to the device.
+ <li>\c IO_FatalError A fatal unrecoverable error occurred.
+ <li>\c IO_OpenError Could not open the device.
+ <li>\c IO_ConnectError Could not connect to the device.
+ <li>\c IO_AbortError The operation was unexpectedly aborted.
+ <li>\c IO_TimeOutError The operation timed out.
+ <li>\c IO_OnCloseError An unspecified error happened on close.
+ </ul>
+
+ \sa resetStatus()
+*/
+
+/*!
+ \fn void QIODevice::resetStatus()
+
+ Sets the I/O device status to \c IO_Ok.
+
+ \sa status()
+*/
+
+
+/*!
+ \fn void QIODevice::setFlags( int f )
+ \internal
+ Used by subclasses to set the device flags.
+*/
+
+/*!
+ \internal
+ Used by subclasses to set the device type.
+*/
+
+void QIODevice::setType( int t )
+{
+#if defined(CHECK_RANGE)
+ if ( (t & IO_TypeMask) != t )
+ qWarning( "QIODevice::setType: Specified type out of range" );
+#endif
+ ioMode &= ~IO_TypeMask; // reset type bits
+ ioMode |= t;
+}
+
+/*!
+ \internal
+ Used by subclasses to set the device mode.
+*/
+
+void QIODevice::setMode( int m )
+{
+#if defined(CHECK_RANGE)
+ if ( (m & IO_ModeMask) != m )
+ qWarning( "QIODevice::setMode: Specified mode out of range" );
+#endif
+ ioMode &= ~IO_ModeMask; // reset mode bits
+ ioMode |= m;
+}
+
+/*!
+ \internal
+ Used by subclasses to set the device state.
+*/
+
+void QIODevice::setState( int s )
+{
+#if defined(CHECK_RANGE)
+ if ( ((uint)s & IO_StateMask) != (uint)s )
+ qWarning( "QIODevice::setState: Specified state out of range" );
+#endif
+ ioMode &= ~IO_StateMask; // reset state bits
+ ioMode |= (uint)s;
+}
+
+/*!
+ \internal
+ Used by subclasses to set the device status (not state).
+*/
+
+void QIODevice::setStatus( int s )
+{
+ ioSt = s;
+}
+
+
+/*!
+ \fn bool QIODevice::open( int mode )
+ Opens the I/O device using the specified \e mode.
+ Returns TRUE if successful, or FALSE if the device could not be opened.
+
+ The mode parameter \e m must be a combination of the following flags.
+ <ul>
+ <li>\c IO_Raw specified raw (unbuffered) file access.
+ <li>\c IO_ReadOnly opens a file in read-only mode.
+ <li>\c IO_WriteOnly opens a file in write-only mode.
+ <li>\c IO_ReadWrite opens a file in read/write mode.
+ <li>\c IO_Append sets the file index to the end of the file.
+ <li>\c IO_Truncate truncates the file.
+ <li>\c IO_Translate enables carriage returns and linefeed translation
+ for text files under MS-DOS, Window, OS/2 and Macintosh. On Unix systems
+ this flag has no effect. Use with caution as it will also transform every linefeed
+ written to the file into a CRLF pair. This is likely to corrupt your file when
+ writing binary data to it. Cannot be combined with \c IO_Raw.
+ </ul>
+
+ This virtual function must be reimplemented by all subclasses.
+
+ \sa close()
+*/
+
+/*!
+ \fn void QIODevice::close()
+ Closes the I/O device.
+
+ This virtual function must be reimplemented by all subclasses.
+
+ \sa open()
+*/
+
+/*!
+ \fn void QIODevice::flush()
+
+ Flushes an open I/O device.
+
+ This virtual function must be reimplemented by all subclasses.
+*/
+
+
+/*!
+ \fn uint QIODevice::size() const
+ Virtual function that returns the size of the I/O device.
+ \sa at()
+*/
+
+/*!
+ Virtual function that returns the current I/O device index.
+
+ This index is the data read/write head of the I/O device.
+
+ \sa size()
+*/
+
+int QIODevice::at() const
+{
+ return ioIndex;
+}
+
+/*!
+ Virtual function that sets the I/O device index to \e pos.
+ \sa size()
+*/
+
+bool QIODevice::at( int pos )
+{
+#if defined(CHECK_RANGE)
+ if ( (uint)pos > size() ) {
+ qWarning( "QIODevice::at: Index %d out of range", pos );
+ return FALSE;
+ }
+#endif
+ ioIndex = pos;
+ return TRUE;
+}
+
+/*!
+ Virtual function that returns TRUE if the I/O device index is at the
+ end of the input.
+*/
+
+bool QIODevice::atEnd() const
+{
+ if ( isSequentialAccess() || isTranslated() ) {
+ QIODevice* that = (QIODevice*)this;
+ int c = that->getch();
+ bool result = c < 0;
+ that->ungetch(c);
+ return result;
+ } else {
+ return at() == (int)size();
+ }
+}
+
+/*!
+ \fn bool QIODevice::reset()
+ Sets the device index to 0.
+ \sa at()
+*/
+
+
+/*!
+ \fn int QIODevice::readBlock( char *data, uint maxlen )
+ Reads at most \e maxlen bytes from the I/O device into \e data and
+ returns the number of bytes actually read.
+
+ This virtual function must be reimplemented by all subclasses.
+
+ \sa writeBlock()
+*/
+
+/*!
+ This convenience function returns all of the remaining data in the
+ device. Note that this only works for direct access devices, such
+ as QFile.
+
+ \sa isDirectAccess()
+*/
+QByteArray QIODevice::readAll()
+{
+ int n = size()-at();
+ QByteArray ba(size()-at());
+ char* c = ba.data();
+ while ( n ) {
+ int r = readBlock( c, n );
+ if ( r < 0 )
+ return QByteArray();
+ n -= r;
+ c += r;
+ }
+ return ba;
+}
+
+/*!
+ \fn int QIODevice::writeBlock( const char *data, uint len )
+ Writes \e len bytes from \e p to the I/O device and returns the number of
+ bytes actually written.
+
+ This virtual function must be reimplemented by all subclasses.
+
+ \sa readBlock()
+*/
+
+/*!
+ This convenience function is the same as calling
+ writeBlock( data.data(), data.size() ).
+*/
+int QIODevice::writeBlock( const QByteArray& data )
+{
+ return writeBlock( data.data(), data.size() );
+}
+
+/*!
+ Reads a line of text, up to \e maxlen bytes including a terminating
+ \0. If there is a newline at the end if the line, it is not stripped.
+
+ Returns the number of bytes read, or -1 in case of error.
+
+ This virtual function can be reimplemented much more efficiently by
+ the most subclasses.
+
+ \sa readBlock(), QTextStream::readLine()
+*/
+
+int QIODevice::readLine( char *data, uint maxlen )
+{
+ if ( maxlen == 0 ) // application bug?
+ return 0;
+ int pos = at(); // get current position
+ int s = (int)size(); // size of I/O device
+ char *p = data;
+ if ( pos >= s )
+ return 0;
+ while ( pos++ < s && --maxlen ) { // read one byte at a time
+ readBlock( p, 1 );
+ if ( *p++ == '\n' ) // end of line
+ break;
+ }
+ *p++ = '\0';
+ return (int)((long)p - (long)data);
+}
+
+
+/*!
+ \fn int QIODevice::getch()
+
+ Reads a single byte/character from the I/O device.
+
+ Returns the byte/character read, or -1 if the end of the I/O device has been
+ reached.
+
+ This virtual function must be reimplemented by all subclasses.
+
+ \sa putch(), ungetch()
+*/
+
+/*!
+ \fn int QIODevice::putch( int ch )
+
+ Writes the character \e ch to the I/O device.
+
+ Returns \e ch, or -1 if some error occurred.
+
+ This virtual function must be reimplemented by all subclasses.
+
+ \sa getch(), ungetch()
+*/
+
+/*!
+ \fn int QIODevice::ungetch( int ch )
+
+ Puts the character \e ch back into the I/O device and decrements the
+ index if it is not zero.
+
+ This function is normally called to "undo" a getch() operation.
+
+ Returns \e ch, or -1 if some error occurred.
+
+ This virtual function must be reimplemented by all subclasses.
+
+ \sa getch(), putch()
+*/
diff --git a/qtools/qiodevice.h b/qtools/qiodevice.h
new file mode 100644
index 0000000..1c54217
--- /dev/null
+++ b/qtools/qiodevice.h
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+**
+** Definition of QIODevice class
+**
+** Created : 940913
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QIODEVICE_H
+#define QIODEVICE_H
+
+#ifndef QT_H
+#include "qglobal.h"
+#include "qcstring.h"
+#endif // QT_H
+
+
+// IO device access types
+
+#define IO_Direct 0x0100 // direct access device
+#define IO_Sequential 0x0200 // sequential access device
+#define IO_Combined 0x0300 // combined direct/sequential
+#define IO_TypeMask 0x0f00
+
+// IO handling modes
+
+#define IO_Raw 0x0040 // raw access (not buffered)
+#define IO_Async 0x0080 // asynchronous mode
+
+// IO device open modes
+
+#define IO_ReadOnly 0x0001 // readable device
+#define IO_WriteOnly 0x0002 // writable device
+#define IO_ReadWrite 0x0003 // read+write device
+#define IO_Append 0x0004 // append
+#define IO_Truncate 0x0008 // truncate device
+#define IO_Translate 0x0010 // translate CR+LF
+#define IO_ModeMask 0x00ff
+
+// IO device state
+
+#define IO_Open 0x1000 // device is open
+#define IO_StateMask 0xf000
+
+
+// IO device status
+
+#define IO_Ok 0
+#define IO_ReadError 1 // read error
+#define IO_WriteError 2 // write error
+#define IO_FatalError 3 // fatal unrecoverable error
+#define IO_ResourceError 4 // resource limitation
+#define IO_OpenError 5 // cannot open device
+#define IO_ConnectError 5 // cannot connect to device
+#define IO_AbortError 6 // abort error
+#define IO_TimeOutError 7 // time out
+#define IO_UnspecifiedError 8 // unspecified error
+
+class Q_EXPORT QIODevice // IO device class
+{
+public:
+ QIODevice();
+ virtual ~QIODevice();
+
+ int flags() const { return ioMode; }
+ int mode() const { return ioMode & IO_ModeMask; }
+ int state() const { return ioMode & IO_StateMask; }
+
+ bool isDirectAccess() const { return ((ioMode & IO_Direct) == IO_Direct); }
+ bool isSequentialAccess() const { return ((ioMode & IO_Sequential) == IO_Sequential); }
+ bool isCombinedAccess() const { return ((ioMode & IO_Combined) == IO_Combined); }
+ bool isBuffered() const { return ((ioMode & IO_Raw) != IO_Raw); }
+ bool isRaw() const { return ((ioMode & IO_Raw) == IO_Raw); }
+ bool isSynchronous() const { return ((ioMode & IO_Async) != IO_Async); }
+ bool isAsynchronous() const { return ((ioMode & IO_Async) == IO_Async); }
+ bool isTranslated() const { return ((ioMode & IO_Translate) == IO_Translate); }
+ bool isReadable() const { return ((ioMode & IO_ReadOnly) == IO_ReadOnly); }
+ bool isWritable() const { return ((ioMode & IO_WriteOnly) == IO_WriteOnly); }
+ bool isReadWrite() const { return ((ioMode & IO_ReadWrite) == IO_ReadWrite); }
+ bool isInactive() const { return state() == 0; }
+ bool isOpen() const { return state() == IO_Open; }
+
+ int status() const { return ioSt; }
+ void resetStatus() { ioSt = IO_Ok; }
+
+ virtual bool open( int mode ) = 0;
+ virtual void close() = 0;
+ virtual void flush() = 0;
+
+ virtual uint size() const = 0;
+ virtual int at() const;
+ virtual bool at( int );
+ virtual bool atEnd() const;
+ bool reset() { return at(0); }
+
+ virtual int readBlock( char *data, uint maxlen ) = 0;
+ virtual int writeBlock( const char *data, uint len ) = 0;
+ virtual int readLine( char *data, uint maxlen );
+ int writeBlock( const QByteArray& data );
+ QByteArray readAll();
+
+ virtual int getch() = 0;
+ virtual int putch( int ) = 0;
+ virtual int ungetch( int ) = 0;
+
+protected:
+ void setFlags( int f ) { ioMode = f; }
+ void setType( int );
+ void setMode( int );
+ void setState( int );
+ void setStatus( int );
+ int ioIndex;
+
+private:
+ int ioMode;
+ int ioSt;
+
+private: // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+ QIODevice( const QIODevice & );
+ QIODevice &operator=( const QIODevice & );
+#endif
+};
+
+
+#endif // QIODEVICE_H
diff --git a/qtools/qlist.doc b/qtools/qlist.doc
new file mode 100644
index 0000000..98decd1
--- /dev/null
+++ b/qtools/qlist.doc
@@ -0,0 +1,1048 @@
+/****************************************************************************
+**
+**
+** QList and QListIterator class documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+
+/*****************************************************************************
+ QList documentation
+ *****************************************************************************/
+
+/*!
+ \class QList qlist.h
+ \brief The QList class is a template class that provides doubly linked lists.
+
+ \ingroup collection
+ \ingroup tools
+
+ In Qt 2.0 QList is only implemented as a template class. Define a
+ template instance QList\<X\> to create a list that operates on pointers
+ to X, or X*.
+
+ Example:
+ \code
+ #include <qlist.h>
+ #include <qstring.h>
+ #include <stdio.h>
+
+ class Employee
+ {
+ public:
+ Employee( const QString& name, int salary ) { n=name; s=salary; }
+ QString name() const { return n; }
+ int salary() const { return s; }
+ private:
+ QString n;
+ int s;
+ };
+
+ void main()
+ {
+ QList<Employee> list; // list of pointers to Employee
+ list.setAutoDelete( TRUE ); // delete items when they are removed
+
+ list.append( new Employee("Bill", 50000) );
+ list.append( new Employee("Steve",80000) );
+ list.append( new Employee("Ron", 60000) );
+
+ Employee *emp;
+ for ( emp=list.first(); emp != 0; emp=list.next() )
+ printf( "%s earns %d\n", emp->name().latin1(), emp->salary() );
+ }
+ \endcode
+
+ Program output:
+ \code
+ Bill earns 50000
+ Steve earns 80000
+ Ron earns 60000
+ \endcode
+
+ The list class is indexable and has a \link at() current index\endlink
+ and a \link current() current item\endlink. The first item corresponds
+ to index 0. The current index is -1 if the current item is null.
+
+ QList has several member functions for traversing the list, but using
+ a QListIterator can be more practical. Multiple list iterators may
+ traverse the same list, independent of each other and independent of
+ the current list item.
+
+ In the example above, we make the call setAutoDelete(TRUE).
+ Enabling auto-deletion tells the list to delete items that are removed
+ from the list. The default is to not delete items when they are
+ removed, but that would cause a memory leak in our example since we have
+ no other references to the list items.
+
+ List items are stored as \c void* in an internal QLNode, which also
+ holds pointers to the next and previous list items. The functions
+ currentNode(), removeNode() and takeNode() operate directly on the
+ QLNode, but they should be used with care.
+
+ When inserting an item into a list, only the pointer is copied, not the
+ item itself. This is called a shallow copy. It is possible to make the
+ list copy all of the item's data (known as a deep copy) when an item is
+ inserted. insert(), inSort() and append() call the virtual function
+ QCollection::newItem() for the item to be inserted.
+ Inherit a list and reimplement it if you want deep copies.
+
+ When removing an item from a list, the virtual function
+ QCollection::deleteItem() is called. QList's default implementation
+ is to delete the item if auto-deletion is enabled.
+
+ The virtual function QGList::compareItems() can be reimplemented to
+ compare two list items. This function is called from all list functions
+ that need to compare list items, for instance remove(const type*).
+ If you only want to deal with pointers, there are functions that
+ compare pointers instead, for instance removeRef(const type*).
+ These functions are somewhat faster than those that call compareItems().
+
+ The QStrList class in qstrlist.h is a list of \c char*. QStrList is
+ a good example of a list that reimplements newItem(), deleteItem() and
+ compareItems()
+
+ \sa QListIterator, \link collection.html Collection Classes\endlink
+*/
+
+
+/*!
+ \fn QList::QList()
+ Constructs an empty list.
+*/
+
+/*!
+ \fn QList::QList( const QList<type> &list )
+ Constructs a copy of \e list.
+
+ Each item in \e list is \link append() appended\endlink to this list.
+ Only the pointers are copied (shallow copy).
+*/
+
+/*!
+ \fn QList::~QList()
+ Removes all items from the list and destroys the list.
+
+ All list iterators that access this list will be reset.
+
+ \sa setAutoDelete()
+*/
+
+/*!
+ \fn QList<type> &QList::operator=(const QList<type> &list)
+ Assigns \e list to this list and returns a reference to this list.
+
+ This list is first cleared, then each item in \e list is
+ \link append() appended\endlink to this list. Only the pointers are copied
+ (shallow copy), unless newItem() has been reimplemented().
+*/
+
+/*!
+ \fn bool QList::operator==(const QList<type> &list ) const
+
+ Compares this list with \a list. Retruns TRUE if the lists
+ contain the same data, else FALSE.
+*/
+
+/*!
+ \fn uint QList::count() const
+ Returns the number of items in the list.
+ \sa isEmpty()
+*/
+
+/*!
+ \fn void QList::sort()
+
+ Sorts the list by the result of the virtual compareItems() function.
+
+ The Heap-Sort algorithm is used for sorting. It sorts n items with
+ O(n*log n) compares. This is the asymptotic optimal solution of the
+ sorting problem.
+
+ If the items in your list support operator< and operator== then you
+ might be better off with QSortedList since it implements the
+ compareItems() function for you using these two operators.
+
+ \sa inSort()
+*/
+
+/*!
+ \fn bool QList::isEmpty() const
+ Returns TRUE if the list is empty, i.e. count() == 0. Returns FALSE
+ otherwise.
+ \sa count()
+*/
+
+/*!
+ \fn bool QList::insert( uint index, const type *item )
+ Inserts the \e item at the position \e index in the list.
+
+ Returns TRUE if successful, or FALSE if \e index is out of range.
+ The valid range is <code>0 .. count()</code> inclusive.
+ The item is appended if \e index == count().
+
+ The inserted item becomes the current list item.
+
+ The \e item must not be a null pointer.
+
+ \sa append(), current()
+*/
+
+/*!
+ \fn void QList::inSort( const type *item )
+ Inserts the \e item at its sorted position in the list.
+
+ The sort order depends on the virtual QGList::compareItems() function.
+ All items must be inserted with inSort() to maintain the sorting order.
+
+ The inserted item becomes the current list item.
+
+ The \e item must not be a null pointer.
+
+ Please note that inSort is slow. If you want to insert lots of items
+ in a list and sort after inserting then you should use sort().
+ inSort() takes up to O(n) compares. That means inserting n items in
+ your list will need O(n^2) compares while sort() only needs O(n*logn)
+ for the same task. So you inSort() only if you already have a pre-sorted
+ list and want to insert only few additional items.
+
+ \sa insert(), QGList::compareItems(), current(), sort()
+*/
+
+/*!
+ \fn void QList::append( const type *item )
+ Inserts the \e item at the end of the list.
+
+ The inserted item becomes the current list item.
+ This is equivalent to \c insert(count(),item).
+
+
+ The \e item must not be a null pointer.
+
+ \sa insert(), current(), prepend()
+*/
+
+/*!
+ \fn void QList::prepend( const type *item )
+
+ Inserts the \e item at the start of the list.
+
+ The inserted item becomes the current list item.
+ This is equivalent to \c insert(0,item).
+
+ The \e item must not be a null pointer.
+
+ \sa append(), insert(), current()
+*/
+
+/*!
+ \fn bool QList::remove( uint index )
+ Removes the item at position \e index in the list.
+
+ Returns TRUE if successful, or FALSE if \e index is out of range.
+ The valid range is <code>0 .. (count() - 1)</code> inclusive.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ The item after the removed item becomes the new current list item if
+ the removed item is not the last item in the list. If the last item
+ is removed, the new last item becomes the current item in Qt 2.x.
+ In 3.0, the current item will be set to null. The current item is
+ set to null if the list becomes empty.
+
+ All list iterators that refer to the removed item will be set to point
+ to the new current item.
+
+ \sa take(), clear(), setAutoDelete(), current() removeRef()
+*/
+
+/*!
+ \fn bool QList::remove()
+ Removes the current list item.
+
+ Returns TRUE if successful, or FALSE if the current item is null.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ The item after the removed item becomes the new current list item if
+ the removed item is not the last item in the list. If the last item
+ is removed, the new last item becomes the current item in Qt 2.x.
+ In 3.0, the current item will be set to null. The current item is
+ set to null if the list becomes empty.
+
+ All list iterators that refer to the removed item will be set to point
+ to the new current item.
+
+ \sa take(), clear(), setAutoDelete(), current() removeRef()
+*/
+
+/*!
+ \fn bool QList::remove( const type *item )
+ Removes the first occurrence of \e item from the list.
+
+ Returns TRUE if successful, or FALSE if the item could not be found in the
+ list.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ The compareItems() function is called when searching for the item
+ in the list. If compareItems() is not reimplemented, it is more
+ efficient to call removeRef().
+
+ The item after the removed item becomes the new current list item if
+ the removed item is not the last item in the list. If the last item
+ is removed, the new last item becomes the current item in Qt 2.x.
+ In 3.0, the current item will be set to null. The current item is
+ set to null if the list becomes empty.
+
+ All list iterators that refer to the removed item will be set to point
+ to the new current item.
+
+ \sa removeRef(), take(), clear(), setAutoDelete(), compareItems(), current()
+*/
+
+/*!
+ \fn bool QList::removeRef( const type *item )
+ Removes the first occurrence of \e item from the list.
+
+ Returns TRUE if successful, or FALSE if the item cannot be found in the
+ list.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ The list is scanned until the pointer \e item is found. It is removed
+ if it is found.
+
+ Equivalent to:
+ \code
+ if ( list.findRef(item) != -1 )
+ list.remove();
+ \endcode
+
+ The item after the removed item becomes the new current list item if
+ the removed item is not the last item in the list. If the last item
+ is removed, the new last item becomes the current item in Qt 2.x.
+ In 3.0, the current item will be set to null. The current item is
+ set to null if the list becomes empty.
+
+ All list iterators that refer to the removed item will be set to point
+ to the new current item.
+
+ \sa remove(), clear(), setAutoDelete(), current()
+*/
+
+/*!
+ \fn void QList::removeNode( QLNode *node )
+ Removes the \e node from the list.
+
+ This node must exist in the list, otherwise the program may crash.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ The first item in the list will become the new current list item.
+ The current item is set to null if the list becomes empty.
+
+ All list iterators that refer to the removed item will be set to point to
+ the item succeeding this item, or the preceding item if the removed item
+ was the last item.
+
+ \warning Do not call this function unless you are an expert.
+
+ \sa takeNode(), currentNode() remove() removeRef()
+*/
+
+/*!
+ \fn bool QList::removeFirst()
+ Removes the first item from the list.
+ Returns TRUE if successful, or FALSE if the list is empty.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ The first item in the list becomes the new current list item.
+ The current item is set to null if the list becomes empty.
+
+ All list iterators that refer to the removed item will be set to point
+ to the new current item.
+
+ \sa removeLast(), setAutoDelete(), current() remove()
+*/
+
+/*!
+ \fn bool QList::removeLast()
+ Removes the last item from the list.
+ Returns TRUE if successful, or FALSE if the list is empty.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ The last item in the list becomes the new current list item.
+ The current item is set to null if the list becomes empty.
+
+ All list iterators that refer to the removed item will be set to point
+ to the new current item.
+
+ \sa removeFirst(), setAutoDelete(), current()
+*/
+
+/*!
+ \fn type *QList::take( uint index )
+ Takes the item at position \e index out of the list without
+ deleting it (even if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled).
+
+ Returns a pointer to the item taken out of the list, or null if
+ the index is out of range.
+ The valid range is <code>0 .. (count() - 1)</code> inclusive.
+
+ The item after the taken item becomes the new current list item if
+ the taken item is not the last item in the list. If the last item
+ is taken, the new last item becomes the current item in Qt 2.x. In
+ 3.0, the current item will be set to null. The current item is set
+ to null if the list becomes empty.
+
+ All list iterators that refer to the taken item will be set to point to
+ the new current item.
+
+ \sa remove(), clear(), current()
+*/
+
+/*!
+ \fn type *QList::take()
+ Takes the current item out of the list without deleting it (even if
+ \link QCollection::setAutoDelete() auto-deletion\endlink is enabled).
+ Returns a pointer to the item taken out of the list, or null if
+ the current item is null.
+
+ The item after the taken item becomes the new current list item if
+ the taken item is not the last item in the list. If the last item
+ is taken, the new last item becomes the current item in Qt 2.x. In
+ 3.0, the current item will be set to null. The current item is set
+ to null if the list becomes empty.
+
+ All list iterators that refer to the taken item will be set to point to
+ the new current item.
+
+ \sa remove(), clear(), current()
+*/
+
+/*!
+ \fn type *QList::takeNode( QLNode *node )
+ Takes the \e node out of the list without deleting its item (even if
+ \link QCollection::setAutoDelete() auto-deletion\endlink is enabled).
+ Returns a pointer to the item taken out of the list.
+
+ This node must exist in the list, otherwise the program may crash.
+
+ The first item in the list becomes the new current list item.
+
+ All list iterators that refer to the taken item will be set to point to
+ the item succeeding this item, or the preceding item if the taken item
+ was the last item.
+
+ \warning Do not call this function unless you are an expert.
+
+ \sa removeNode(), currentNode()
+*/
+
+/*!
+ \fn void QList::clear()
+ Removes all items from the list.
+
+ The removed items are deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ All list iterators that access this list will be reset.
+
+ \sa remove(), take(), setAutoDelete()
+*/
+
+/*!
+ \fn int QList::find( const type *item )
+ Finds the first occurrence of \e item in the list.
+
+ If the item is found, the list sets the current item to point to
+ the found item and returns the index of this item.
+ If the item is not found, the list sets the current item to null,
+ the current index to -1 and returns -1.
+
+ The compareItems() function is called when searching for the item
+ in the list. If compareItems() is not reimplemented, it is more
+ efficient to call findRef().
+
+ \sa findNext(), findRef(), compareItems(), current()
+*/
+
+/*!
+ \fn int QList::findNext( const type *item )
+ Finds the next occurrence of \e item in the list, starting from
+ the current list item.
+
+ If the item is found, the list sets the current item to point to
+ the found item and returns the index of this item.
+ If the item is not found, the list sets the current item to null,
+ the current index to -1 and returns -1.
+
+ The compareItems() function is called when searching for the item
+ in the list. If compareItems() is not reimplemented, it is more
+ efficient to call findNextRef().
+
+ \sa find(), findNextRef(), compareItems(), current()
+*/
+
+/*!
+ \fn int QList::findRef( const type *item )
+ Finds the first occurrence of \e item in the list.
+
+ If the item is found, the list sets the current item to point to
+ the found item and returns the index of this item.
+ If the item is not found, the list sets the current item to null,
+ the current index to -1 and returns -1.
+
+ Calling this function is must faster than find(), because find()
+ compares \e item with each list item using compareItems().
+ This function only compares the pointers.
+
+ \sa findNextRef(), find(), current()
+*/
+
+/*!
+ \fn int QList::findNextRef( const type *item )
+ Finds the next occurrence of \e item in the list, starting from the
+ current list item.
+
+ If the item is found, the list sets the current item to point to
+ the found item and returns the index of this item.
+ If the item is not found, the list sets the current item to null,
+ the current index to -1 and returns -1.
+
+ Calling this function is must faster than findNext(), because findNext()
+ compares \e item with each list item using compareItems().
+ This function only compares the pointers.
+
+ \sa findRef(), findNext(), current()
+*/
+
+/*!
+ \fn uint QList::contains( const type *item ) const
+ Counts and returns the number of occurrences of \e item in the list.
+
+ The compareItems() function is called when looking for the \e item
+ in the list. If compareItems() is not reimplemented, it is more
+ efficient to call containsRef().
+
+ Does not affect the current list item.
+
+ \sa containsRef(), compareItems()
+*/
+
+/*!
+ \fn uint QList::containsRef( const type *item ) const
+ Counts and returns the number of occurrences of \e item in the list.
+
+ Calling this function is must faster than contains(), because contains()
+ compares \e item with each list item using compareItems().
+ This function only compares the pointers.
+
+ Does not affect the current list item.
+
+ \sa contains()
+*/
+
+/*!
+ \fn type *QList::at( uint index )
+ Returns a pointer to the item at position \e index in the list, or
+ null if the index is out of range.
+
+ Sets the current list item to this item if \e index is valid.
+ The valid range is <code>0 .. (count() - 1)</code> inclusive.
+
+ This function is very efficient. It starts scanning from the first
+ item, last item or current item, whichever is closest to \e index.
+
+ \sa current()
+*/
+
+/*!
+ \fn int QList::at() const
+ Returns the index of the current list item. The returned value is -1
+ if the current item is null.
+ \sa current()
+*/
+
+/*!
+ \fn type *QList::current() const
+ Returns a pointer to the current list item. The current item may be
+ null (implies that the current index is -1).
+ \sa at()
+*/
+
+/*!
+ \fn QLNode *QList::currentNode() const
+ Returns a pointer to the current list node.
+
+ The node can be kept and removed later using removeNode().
+ The advantage is that the item can be removed directly without
+ searching the list.
+
+ \warning Do not call this function unless you are an expert.
+
+ \sa removeNode(), takeNode(), current()
+*/
+
+/*!
+ \fn type *QList::getFirst() const
+ Returns a pointer to the first item in the list, or null if the
+ list is empty.
+
+ Does not affect the current list item.
+
+ \sa first(), getLast()
+*/
+
+/*!
+ \fn type *QList::getLast() const
+ Returns a pointer to the last item in the list, or null if the
+ list is empty.
+
+ Does not affect the current list item.
+
+ \sa last(), getFirst()
+*/
+
+/*!
+ \fn type *QList::first()
+ Returns a pointer to the first item in the list and makes this the
+ current list item, or null if the list is empty.
+ \sa getFirst(), last(), next(), prev(), current()
+*/
+
+/*!
+ \fn type *QList::last()
+ Returns a pointer to the last item in the list and makes this the
+ current list item, or null if the list is empty.
+ \sa getLast(), first(), next(), prev(), current()
+*/
+
+/*!
+ \fn type *QList::next()
+ Returns a pointer to the item succeeding the current item.
+ Returns null if the current item is null or equal to the last item.
+
+ Makes the succeeding item current. If the current item before this
+ function call was the last item, the current item will be set to null.
+ If the current item was null, this function does nothing.
+
+ \sa first(), last(), prev(), current()
+*/
+
+/*!
+ \fn type *QList::prev()
+ Returns a pointer to the item preceding the current item.
+ Returns null if the current item is null or equal to the first item.
+
+ Makes the preceding item current. If the current item before this
+ function call was the first item, the current item will be set to null.
+ If the current item was null, this function does nothing.
+
+ \sa first(), last(), next(), current()
+*/
+
+/*!
+ \fn void QList::toVector( QGVector *vec ) const
+ Stores all list items in the vector \e vec.
+
+ The vector must be have the same item type, otherwise the result
+ will be undefined.
+*/
+
+
+/*****************************************************************************
+ QListIterator documentation
+ *****************************************************************************/
+
+/*!
+ \class QListIterator qlist.h
+ \brief The QListIterator class provides an iterator for QList collections.
+
+ \ingroup collection
+ \ingroup tools
+
+ Define a template instance QListIterator\<X\> to create a list iterator
+ that operates on QList\<X\> (list of X*).
+
+ Example:
+ \code
+ #include <qlist.h>
+ #include <qstring.h>
+ #include <stdio.h>
+
+ class Employee
+ {
+ public:
+ Employee( const char *name, int salary ) { n=name; s=salary; }
+ const char *name() const { return n; }
+ int salary() const { return s; }
+ private:
+ QString n;
+ int s;
+ };
+
+ void main()
+ {
+ QList<Employee> list; // list of pointers to Employee
+ list.setAutoDelete( TRUE ); // delete items when they are removed
+
+ list.append( new Employee("Bill", 50000) );
+ list.append( new Employee("Steve",80000) );
+ list.append( new Employee("Ron", 60000) );
+
+ QListIterator<Employee> it(list); // iterator for employee list
+ for ( ; it.current(); ++it ) {
+ Employee *emp = it.current();
+ printf( "%s earns %d\n", emp->name().latin1(), emp->salary() );
+ }
+ }
+ \endcode
+
+ Program output:
+ \code
+ Bill earns 50000
+ Steve earns 80000
+ Ron earns 60000
+ \endcode
+
+ Although QList has member functions to traverse the doubly linked list
+ structure, using a list iterator is a much more robust way of traversing
+ the list, because multiple list iterators can operate on the same list,
+ independent of each other and independent of the QList's current item.
+ An iterator has its own current list item and can get the next and
+ previous list items. It can only traverse the list, never modify it.
+
+ A QList knows about all list iterators that are operating on the list.
+ When an item is removed from the list, the list update all iterators
+ that are pointing the removed item to point to the new current list item.
+
+ Example:
+ \code
+ #include <qlist.h>
+ #include <qstring.h>
+ #include <stdio.h>
+
+ class Employee
+ {
+ ... // same as above
+ };
+
+ void main()
+ {
+ QList<Employee> list; // list of pointers to Employee
+ list.setAutoDelete( TRUE ); // delete items when they are removed
+
+ list.append( new Employee("Bill", 50000) );
+ list.append( new Employee("Steve",80000) );
+ list.append( new Employee("Ron", 60000) );
+
+ QListIterator<Employee> it(list);
+
+ list.at( 1 ); // current list item: "Steve"
+ it.toLast(); // it: "Ron"
+ --it; // it: "Steve"
+
+ // Now, both the list and the iterator are referring the same item
+
+ list.remove();
+ printf( "%s\n", it.current()->name().latin1() );
+ }
+ \endcode
+
+ Program output:
+ \code
+ Ron
+ \endcode
+
+ \sa QList, \link collection.html collection classes\endlink
+*/
+
+/*!
+ \fn QListIterator::QListIterator( const QList<type> &list )
+ Constructs an iterator for \e list. The current iterator item is
+ set to point on the first item in the \e list.
+*/
+
+/*!
+ \fn QListIterator::~QListIterator()
+ Destroys the iterator.
+*/
+
+/*!
+ \fn uint QListIterator::count() const
+ Returns the number of items in the list this iterator operates on.
+ \sa isEmpty()
+*/
+
+/*!
+ \fn bool QListIterator::isEmpty() const
+ Returns TRUE if the list is empty, i.e. count() == 0, otherwise FALSE.
+ \sa count()
+*/
+
+/*!
+ \fn bool QListIterator::atFirst() const
+ Returns TRUE if the current iterator item is the first list item, otherwise
+ FALSE.
+ \sa toFirst(), atLast()
+*/
+
+/*!
+ \fn bool QListIterator::atLast() const
+ Returns TRUE if the current iterator item is the last list item, otherwise
+ FALSE.
+ \sa toLast(), atFirst()
+*/
+
+/*!
+ \fn type *QListIterator::toFirst()
+ Sets the current iterator item to point to the first list item and returns
+ a pointer to the item. Sets the current item to null and returns null
+ if the list is empty.
+ \sa toLast(), atFirst()
+*/
+
+/*!
+ \fn type *QListIterator::toLast()
+ Sets the current iterator item to point to the last list item and returns
+ a pointer to the item. Sets the current item to null and returns null
+ if the list is empty.
+ \sa toFirst(), atLast()
+*/
+
+/*!
+ \fn QListIterator::operator type *() const
+ Cast operator. Returns a pointer to the current iterator item.
+ Same as current().
+*/
+
+/*!
+ \fn type *QListIterator::operator*()
+ Asterix operator. Returns a pointer to the current iterator item.
+ Same as current().
+*/
+
+/*!
+ \fn type *QListIterator::current() const
+ Returns a pointer to the current iterator item.
+*/
+
+/*!
+ \fn type *QListIterator::operator()()
+ Makes the succeeding item current and returns the original current item.
+
+ If the current iterator item was the last item in the list or if it was
+ null, null is returned.
+*/
+
+/*!
+ \fn char *QStrListIterator::operator()()
+ Makes the succeeding item current and returns the original current item.
+
+ If the current iterator item was the last item in the list or if it was
+ null, null is returned.
+*/
+
+/*!
+ \fn type *QListIterator::operator++()
+ Prefix ++ makes the succeeding item current and returns the new current
+ item.
+
+ If the current iterator item was the last item in the list or if it was
+ null, null is returned.
+*/
+
+/*!
+ \fn type *QListIterator::operator+=( uint jump )
+ Sets the current item to the item \e jump positions after the current item,
+ and returns a pointer to that item.
+
+ If that item is beyond the last item or if the dictionary is empty,
+ it sets the current item to null and returns null
+*/
+
+/*!
+ \fn type *QListIterator::operator--()
+ Prefix -- makes the preceding item current and returns the new current
+ item.
+
+ If the current iterator item was the first item in the list or if it was
+ null, null is returned.
+*/
+
+/*!
+ \fn type *QListIterator::operator-=( uint jump )
+ Returns the item \e jump positions before the current item, or null if
+ it is beyond the first item. Makes this the current item.
+*/
+
+/*!
+ \fn QListIterator<type>& QListIterator::operator=( const QListIterator<type> &it )
+ Assignment. Makes a copy of the iterator \a it and returns a reference
+ to this iterator.
+*/
+
+
+/*****************************************************************************
+ QStrList documentation
+ *****************************************************************************/
+
+typedef QList<char> QStrList
+
+/*!
+ \class QStrList qstrlist.h
+ \brief The QStrList class provides a doubly linked list of \c char*.
+
+ \inherit QList
+
+ \ingroup collection
+ \ingroup tools
+
+ This class is a QList\<char\> instance (a list of char*).
+
+ QStrList can make deep or shallow copies of the strings that are inserted.
+
+ A deep copy means to allocate space for the string and then copy the string
+ data into it. A shallow copy is just a copy of the pointer value and not
+ the string data.
+
+ The disadvantage with shallow copies is that since a pointer can only
+ be deleted once, the program must put all strings in a central place and
+ know when it is safe to delete them (i.e. when the strings are no longer
+ referenced by other parts of the program). This can make the program
+ more complex. The advantage of shallow copies is that shallow copies
+ consume far less memory than deep copies. It is also much faster
+ to copy a pointer (typically 4 or 8 bytes) than to copy string data.
+
+ A QStrList that operates on deep copies will by default turn on
+ auto-deletion (see setAutoDelete()). Thus, by default, QStrList will
+ deallocate any string copies it allocates.
+
+ The virtual compareItems() function is reimplemented and does a case
+ sensitive string comparison. The inSort() function will insert
+ strings in a sorted order.
+
+ The QStrListIterator class is an iterator for QStrList.
+*/
+
+/*!
+ \fn QStrList::QStrList( bool deepCopies )
+ Constructs an empty list of strings. Will make deep copies of all inserted
+ strings if \e deepCopies is TRUE, or uses shallow copies if \e deepCopies
+ is FALSE.
+*/
+
+/*!
+ \fn QStrList::QStrList( const QStrList &list )
+ Constructs a copy of \e list.
+
+ If \e list has deep copies, this list will also get deep copies.
+ Only the pointers are copied (shallow copy) if the other list does not
+ use deep copies.
+*/
+
+/*!
+ \fn QStrList::~QStrList()
+ Destroys the list. All strings are removed.
+*/
+
+/*!
+ \fn QStrList& QStrList::operator=( const QStrList& list )
+ Assigns \e list to this list and returns a reference to this list.
+
+ If \e list has deep copies, this list will also get deep copies.
+ Only the pointers are copied (shallow copy) if the other list does not
+ use deep copies.
+*/
+
+
+/*****************************************************************************
+ QStrIList documentation
+ *****************************************************************************/
+
+/*!
+ \class QStrIList qstrlist.h
+ \brief The QStrIList class provides a doubly linked list of \c char* with
+case insensitive compare.
+
+ \ingroup collection
+ \ingroup tools
+
+ This class is a QList\<char\> instance (a list of char*).
+
+ QStrIList is similar to QStrList except that it is case insensitive.
+ The virtual compareItems() function is reimplemented and does a
+ case insensitive string comparison.
+ The inSort() function will insert strings in a sorted order.
+
+ The QStrListIterator class is an iterator for QStrList.
+*/
+
+/*!
+ \fn QStrIList::QStrIList( bool deepCopies )
+ Constructs a list of strings. Will make deep copies of all inserted
+ strings if \e deepCopies is TRUE, or uses shallow copies if \e deepCopies
+ is FALSE.
+*/
+
+/*!
+ \fn QStrIList::~QStrIList()
+ Destroys the list. All strings are removed.
+*/
+
+
+/*****************************************************************************
+ QStrListIterator documentation
+ *****************************************************************************/
+
+/*!
+ \class QStrListIterator qstrlist.h
+ \brief The QStrListIterator class is an iterator for the QStrList and QStrIList classes.
+
+ \inherit QListIterator
+
+ \ingroup tools
+
+ This class is a QListIterator\<char\> instance.
+ It can traverse the strings in the QStrList and QStrIList classes.
+*/
diff --git a/qtools/qlist.h b/qtools/qlist.h
new file mode 100644
index 0000000..a4608fb
--- /dev/null
+++ b/qtools/qlist.h
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+**
+** Definition of QList template/macro class
+**
+** Created : 920701
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QLIST_H
+#define QLIST_H
+
+#ifndef QT_H
+#include "qglist.h"
+#endif // QT_H
+
+
+template<class type> class Q_EXPORT QList : public QGList
+{
+public:
+ QList() {}
+ QList( const QList<type> &l ) : QGList(l) {}
+ ~QList() { clear(); }
+ QList<type> &operator=(const QList<type> &l)
+ { return (QList<type>&)QGList::operator=(l); }
+ bool operator==( const QList<type> &list ) const
+ { return QGList::operator==( list ); }
+ uint count() const { return QGList::count(); }
+ bool isEmpty() const { return QGList::count() == 0; }
+ bool insert( uint i, const type *d){ return QGList::insertAt(i,(QCollection::Item)d); }
+ void inSort( const type *d ) { QGList::inSort((QCollection::Item)d); }
+ void prepend( const type *d ) { QGList::insertAt(0,(QCollection::Item)d); }
+ void append( const type *d ) { QGList::append((QCollection::Item)d); }
+ bool remove( uint i ) { return QGList::removeAt(i); }
+ bool remove() { return QGList::remove((QCollection::Item)0); }
+ bool remove( const type *d ) { return QGList::remove((QCollection::Item)d); }
+ bool removeRef( const type *d ) { return QGList::removeRef((QCollection::Item)d); }
+ void removeNode( QLNode *n ) { QGList::removeNode(n); }
+ bool removeFirst() { return QGList::removeFirst(); }
+ bool removeLast() { return QGList::removeLast(); }
+ type *take( uint i ) { return (type *)QGList::takeAt(i); }
+ type *take() { return (type *)QGList::take(); }
+ type *takeNode( QLNode *n ) { return (type *)QGList::takeNode(n); }
+ void clear() { QGList::clear(); }
+ void sort() { QGList::sort(); }
+ int find( const type *d ) { return QGList::find((QCollection::Item)d); }
+ int findNext( const type *d ) { return QGList::find((QCollection::Item)d,FALSE); }
+ int findRef( const type *d ) { return QGList::findRef((QCollection::Item)d); }
+ int findNextRef( const type *d ){ return QGList::findRef((QCollection::Item)d,FALSE);}
+ uint contains( const type *d ) const { return QGList::contains((QCollection::Item)d); }
+ uint containsRef( const type *d ) const
+ { return QGList::containsRef((QCollection::Item)d); }
+ type *at( uint i ) { return (type *)QGList::at(i); }
+ int at() const { return QGList::at(); }
+ type *current() const { return (type *)QGList::get(); }
+ QLNode *currentNode() const { return QGList::currentNode(); }
+ type *getFirst() const { return (type *)QGList::cfirst(); }
+ type *getLast() const { return (type *)QGList::clast(); }
+ type *first() { return (type *)QGList::first(); }
+ type *last() { return (type *)QGList::last(); }
+ type *next() { return (type *)QGList::next(); }
+ type *prev() { return (type *)QGList::prev(); }
+ void toVector( QGVector *vec )const{ QGList::toVector(vec); }
+private:
+ void deleteItem( QCollection::Item d );
+};
+
+#if defined(Q_DELETING_VOID_UNDEFINED)
+template<> inline void QList<void>::deleteItem( QCollection::Item )
+{
+}
+#endif
+
+template<class type> inline void QList<type>::deleteItem( QCollection::Item d )
+{
+ if ( del_item ) delete (type *)d;
+}
+
+
+template<class type> class Q_EXPORT QListIterator : public QGListIterator
+{
+public:
+ QListIterator(const QList<type> &l) :QGListIterator((QGList &)l) {}
+ ~QListIterator() {}
+ uint count() const { return list->count(); }
+ bool isEmpty() const { return list->count() == 0; }
+ bool atFirst() const { return QGListIterator::atFirst(); }
+ bool atLast() const { return QGListIterator::atLast(); }
+ type *toFirst() { return (type *)QGListIterator::toFirst(); }
+ type *toLast() { return (type *)QGListIterator::toLast(); }
+ operator type *() const { return (type *)QGListIterator::get(); }
+ type *operator*() { return (type *)QGListIterator::get(); }
+
+ // No good, since QList<char> (ie. QStrList fails...
+ //
+ // MSVC++ gives warning
+ // Sunpro C++ 4.1 gives error
+ // type *operator->() { return (type *)QGListIterator::get(); }
+
+ type *current() const { return (type *)QGListIterator::get(); }
+ type *operator()() { return (type *)QGListIterator::operator()();}
+ type *operator++() { return (type *)QGListIterator::operator++(); }
+ type *operator+=(uint j) { return (type *)QGListIterator::operator+=(j);}
+ type *operator--() { return (type *)QGListIterator::operator--(); }
+ type *operator-=(uint j) { return (type *)QGListIterator::operator-=(j);}
+ QListIterator<type>& operator=(const QListIterator<type>&it)
+ { QGListIterator::operator=(it); return *this; }
+};
+
+
+#endif // QLIST_H
diff --git a/qtools/qmap.cpp b/qtools/qmap.cpp
new file mode 100644
index 0000000..1d2510a
--- /dev/null
+++ b/qtools/qmap.cpp
@@ -0,0 +1,254 @@
+/****************************************************************************
+**
+**
+** Implementation of QMap
+**
+** Created : 990406
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qmap.h"
+
+typedef QMapNodeBase* NodePtr;
+typedef QMapNodeBase Node;
+
+
+void QMapPrivateBase::rotateLeft( NodePtr x, NodePtr& root)
+{
+ NodePtr y = x->right;
+ x->right = y->left;
+ if (y->left !=0)
+ y->left->parent = x;
+ y->parent = x->parent;
+ if (x == root)
+ root = y;
+ else if (x == x->parent->left)
+ x->parent->left = y;
+ else
+ x->parent->right = y;
+ y->left = x;
+ x->parent = y;
+}
+
+
+void QMapPrivateBase::rotateRight( NodePtr x, NodePtr& root )
+{
+ NodePtr y = x->left;
+ x->left = y->right;
+ if (y->right != 0)
+ y->right->parent = x;
+ y->parent = x->parent;
+ if (x == root)
+ root = y;
+ else if (x == x->parent->right)
+ x->parent->right = y;
+ else
+ x->parent->left = y;
+ y->right = x;
+ x->parent = y;
+}
+
+
+void QMapPrivateBase::rebalance( NodePtr x, NodePtr& root)
+{
+ x->color = Node::Red;
+ while ( x != root && x->parent->color == Node::Red ) {
+ if ( x->parent == x->parent->parent->left ) {
+ NodePtr y = x->parent->parent->right;
+ if (y && y->color == Node::Red) {
+ x->parent->color = Node::Black;
+ y->color = Node::Black;
+ x->parent->parent->color = Node::Red;
+ x = x->parent->parent;
+ } else {
+ if (x == x->parent->right) {
+ x = x->parent;
+ rotateLeft( x, root );
+ }
+ x->parent->color = Node::Black;
+ x->parent->parent->color = Node::Red;
+ rotateRight (x->parent->parent, root );
+ }
+ } else {
+ NodePtr y = x->parent->parent->left;
+ if ( y && y->color == Node::Red ) {
+ x->parent->color = Node::Black;
+ y->color = Node::Black;
+ x->parent->parent->color = Node::Red;
+ x = x->parent->parent;
+ } else {
+ if (x == x->parent->left) {
+ x = x->parent;
+ rotateRight( x, root );
+ }
+ x->parent->color = Node::Black;
+ x->parent->parent->color = Node::Red;
+ rotateLeft( x->parent->parent, root );
+ }
+ }
+ }
+ root->color = Node::Black;
+}
+
+
+NodePtr QMapPrivateBase::removeAndRebalance( NodePtr z, NodePtr& root,
+ NodePtr& leftmost,
+ NodePtr& rightmost )
+{
+ NodePtr y = z;
+ NodePtr x;
+ NodePtr x_parent;
+ if (y->left == 0) {
+ x = y->right;
+ } else {
+ if (y->right == 0)
+ x = y->left;
+ else
+ {
+ y = y->right;
+ while (y->left != 0)
+ y = y->left;
+ x = y->right;
+ }
+ }
+ if (y != z) {
+ z->left->parent = y;
+ y->left = z->left;
+ if (y != z->right) {
+ x_parent = y->parent;
+ if (x)
+ x->parent = y->parent;
+ y->parent->left = x;
+ y->right = z->right;
+ z->right->parent = y;
+ } else {
+ x_parent = y;
+ }
+ if (root == z)
+ root = y;
+ else if (z->parent->left == z)
+ z->parent->left = y;
+ else
+ z->parent->right = y;
+ y->parent = z->parent;
+ // Swap the colors
+ Node::Color c = y->color;
+ y->color = z->color;
+ z->color = c;
+ y = z;
+ } else {
+ x_parent = y->parent;
+ if (x)
+ x->parent = y->parent;
+ if (root == z)
+ root = x;
+ else if (z->parent->left == z)
+ z->parent->left = x;
+ else
+ z->parent->right = x;
+ if ( leftmost == z ) {
+ if (z->right == 0)
+ leftmost = z->parent;
+ else
+ leftmost = x->minimum();
+ }
+ if (rightmost == z) {
+ if (z->left == 0)
+ rightmost = z->parent;
+ else
+ rightmost = x->maximum();
+ }
+ }
+ if (y->color != Node::Red) {
+ while (x != root && (x == 0 || x->color == Node::Black)) {
+ if (x == x_parent->left) {
+ NodePtr w = x_parent->right;
+ if (w->color == Node::Red) {
+ w->color = Node::Black;
+ x_parent->color = Node::Red;
+ rotateLeft(x_parent, root);
+ w = x_parent->right;
+ }
+ if ((w->left == 0 || w->left->color == Node::Black) &&
+ (w->right == 0 || w->right->color == Node::Black)) {
+ w->color = Node::Red;
+ x = x_parent;
+ x_parent = x_parent->parent;
+ } else {
+ if (w->right == 0 || w->right->color == Node::Black) {
+ if (w->left)
+ w->left->color = Node::Black;
+ w->color = Node::Red;
+ rotateRight(w, root);
+ w = x_parent->right;
+ }
+ w->color = x_parent->color;
+ x_parent->color = Node::Black;
+ if (w->right)
+ w->right->color = Node::Black;
+ rotateLeft(x_parent, root);
+ break;
+ }
+ } else {
+ NodePtr w = x_parent->left;
+ if (w->color == Node::Red) {
+ w->color = Node::Black;
+ x_parent->color = Node::Red;
+ rotateRight(x_parent, root);
+ w = x_parent->left;
+ }
+ if ((w->right == 0 || w->right->color == Node::Black) &&
+ (w->left == 0 || w->left->color == Node::Black)) {
+ w->color = Node::Red;
+ x = x_parent;
+ x_parent = x_parent->parent;
+ } else {
+ if (w->left == 0 || w->left->color == Node::Black) {
+ if (w->right)
+ w->right->color = Node::Black;
+ w->color = Node::Red;
+ rotateLeft(w, root);
+ w = x_parent->left;
+ }
+ w->color = x_parent->color;
+ x_parent->color = Node::Black;
+ if (w->left)
+ w->left->color = Node::Black;
+ rotateRight(x_parent, root);
+ break;
+ }
+ }
+ }
+ if (x)
+ x->color = Node::Black;
+ }
+ return y;
+}
diff --git a/qtools/qmap.h b/qtools/qmap.h
new file mode 100644
index 0000000..f384a3d
--- /dev/null
+++ b/qtools/qmap.h
@@ -0,0 +1,606 @@
+/****************************************************************************
+**
+**
+** Definition of QMap class
+**
+** Created : 990406
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QMAP_H
+#define QMAP_H
+
+#ifndef QT_H
+#include "qshared.h"
+#include "qdatastream.h"
+#endif // QT_H
+
+
+struct QMapNodeBase
+{
+ enum Color { Red, Black };
+
+ QMapNodeBase* left;
+ QMapNodeBase* right;
+ QMapNodeBase* parent;
+
+ Color color;
+
+ QMapNodeBase* minimum() {
+ QMapNodeBase* x = this;
+ while ( x->left )
+ x = x->left;
+ return x;
+ }
+
+ QMapNodeBase* maximum() {
+ QMapNodeBase* x = this;
+ while ( x->right )
+ x = x->right;
+ return x;
+ }
+};
+
+
+template <class K, class T>
+struct QMapNode : public QMapNodeBase
+{
+ QMapNode( const K& _key, const T& _data ) { data = _data; key = _key; }
+ QMapNode( const K& _key ) { key = _key; }
+ QMapNode( const QMapNode<K,T>& _n ) { key = _n.key; data = _n.data; }
+ QMapNode() { }
+ T data;
+ K key;
+};
+
+
+template<class K, class T>
+class Q_EXPORT QMapIterator
+{
+ public:
+ /**
+ * Typedefs
+ */
+ typedef QMapNode< K, T >* NodePtr;
+
+ /**
+ * Variables
+ */
+ QMapNode<K,T>* node;
+
+ /**
+ * Functions
+ */
+ QMapIterator() : node( 0 ) {}
+ QMapIterator( QMapNode<K,T>* p ) : node( p ) {}
+ QMapIterator( const QMapIterator<K,T>& it ) : node( it.node ) {}
+
+ bool operator==( const QMapIterator<K,T>& it ) const { return node == it.node; }
+ bool operator!=( const QMapIterator<K,T>& it ) const { return node != it.node; }
+ T& operator*() { return node->data; }
+ const T& operator*() const { return node->data; }
+
+ // Cannot have this - some compilers are too stupid
+ //T* operator->() const { return &(node->data); }
+
+ const K& key() const { return node->key; }
+ T& data() { return node->data; }
+ const T& data() const { return node->data; }
+
+private:
+ int inc() {
+ QMapNodeBase* tmp = node;
+ if ( tmp->right ) {
+ tmp = tmp->right;
+ while ( tmp->left )
+ tmp = tmp->left;
+ } else {
+ QMapNodeBase* y = tmp->parent;
+ while (tmp == y->right) {
+ tmp = y;
+ y = y->parent;
+ }
+ if (tmp->right != y)
+ tmp = y;
+ }
+ node = (NodePtr)tmp;
+ return 0;
+ }
+
+ int dec() {
+ QMapNodeBase* tmp = node;
+ if (tmp->color == QMapNodeBase::Red &&
+ tmp->parent->parent == tmp ) {
+ tmp = tmp->right;
+ } else if (tmp->left != 0) {
+ QMapNodeBase* y = tmp->left;
+ while ( y->right )
+ y = y->right;
+ tmp = y;
+ } else {
+ QMapNodeBase* y = tmp->parent;
+ while (tmp == y->left) {
+ tmp = y;
+ y = y->parent;
+ }
+ tmp = y;
+ }
+ node = (NodePtr)tmp;
+ return 0;
+ }
+
+public:
+ QMapIterator<K,T>& operator++() {
+ inc();
+ return *this;
+ }
+
+ QMapIterator<K,T> operator++(int) {
+ QMapIterator<K,T> tmp = *this;
+ inc();
+ return tmp;
+ }
+
+ QMapIterator<K,T>& operator--() {
+ dec();
+ return *this;
+ }
+
+ QMapIterator<K,T> operator--(int) {
+ QMapIterator<K,T> tmp = *this;
+ dec();
+ return tmp;
+ }
+};
+
+template<class K, class T>
+class Q_EXPORT QMapConstIterator
+{
+ public:
+ /**
+ * Typedefs
+ */
+ typedef QMapNode< K, T >* NodePtr;
+
+ /**
+ * Variables
+ */
+ QMapNode<K,T>* node;
+
+ /**
+ * Functions
+ */
+ QMapConstIterator() : node( 0 ) {}
+ QMapConstIterator( QMapNode<K,T>* p ) : node( p ) {}
+ QMapConstIterator( const QMapConstIterator<K,T>& it ) : node( it.node ) {}
+ QMapConstIterator( const QMapIterator<K,T>& it ) : node( it.node ) {}
+
+ bool operator==( const QMapConstIterator<K,T>& it ) const { return node == it.node; }
+ bool operator!=( const QMapConstIterator<K,T>& it ) const { return node != it.node; }
+ const T& operator*() const { return node->data; }
+
+ // Cannot have this - some compilers are too stupid
+ //const T* operator->() const { return &(node->data); }
+
+ const K& key() const { return node->key; }
+ const T& data() const { return node->data; }
+
+private:
+ int inc() {
+ QMapNodeBase* tmp = node;
+ if ( tmp->right ) {
+ tmp = tmp->right;
+ while ( tmp->left )
+ tmp = tmp->left;
+ } else {
+ QMapNodeBase* y = tmp->parent;
+ while (tmp == y->right) {
+ tmp = y;
+ y = y->parent;
+ }
+ if (tmp->right != y)
+ tmp = y;
+ }
+ node = (NodePtr)tmp;
+ return 0;
+ }
+
+ int dec() {
+ QMapNodeBase* tmp = node;
+ if (tmp->color == QMapNodeBase::Red &&
+ tmp->parent->parent == tmp ) {
+ tmp = tmp->right;
+ } else if (tmp->left != 0) {
+ QMapNodeBase* y = tmp->left;
+ while ( y->right )
+ y = y->right;
+ tmp = y;
+ } else {
+ QMapNodeBase* y = tmp->parent;
+ while (tmp == y->left) {
+ tmp = y;
+ y = y->parent;
+ }
+ tmp = y;
+ }
+ node = (NodePtr)tmp;
+ return 0;
+ }
+
+public:
+ QMapConstIterator<K,T>& operator++() {
+ inc();
+ return *this;
+ }
+
+ QMapConstIterator<K,T> operator++(int) {
+ QMapConstIterator<K,T> tmp = *this;
+ inc();
+ return tmp;
+ }
+
+ QMapConstIterator<K,T>& operator--() {
+ dec();
+ return *this;
+ }
+
+ QMapConstIterator<K,T> operator--(int) {
+ QMapConstIterator<K,T> tmp = *this;
+ dec();
+ return tmp;
+ }
+};
+
+
+class Q_EXPORT QMapPrivateBase : public QShared
+{
+public:
+ QMapPrivateBase() {
+ node_count = 0;
+ }
+ QMapPrivateBase( const QMapPrivateBase* _map) {
+ node_count = _map->node_count;
+ }
+
+ /**
+ * Implementations of basic tree algorithms
+ */
+ void rotateLeft( QMapNodeBase* x, QMapNodeBase*& root);
+ void rotateRight( QMapNodeBase* x, QMapNodeBase*& root );
+ void rebalance( QMapNodeBase* x, QMapNodeBase*& root );
+ QMapNodeBase* removeAndRebalance( QMapNodeBase* z, QMapNodeBase*& root,
+ QMapNodeBase*& leftmost,
+ QMapNodeBase*& rightmost );
+
+ /**
+ * Variables
+ */
+ int node_count;
+};
+
+
+template <class Key, class T>
+class QMapPrivate : public QMapPrivateBase
+{
+public:
+ /**
+ * Typedefs
+ */
+ typedef QMapIterator< Key, T > Iterator;
+ typedef QMapConstIterator< Key, T > ConstIterator;
+ typedef QMapNode< Key, T > Node;
+ typedef QMapNode< Key, T >* NodePtr;
+
+ /**
+ * Functions
+ */
+ QMapPrivate() {
+ header = new Node;
+ header->color = QMapNodeBase::Red; // Mark the header
+ header->parent = 0;
+ header->left = header->right = header;
+ }
+ QMapPrivate( const QMapPrivate< Key, T >* _map ) : QMapPrivateBase( _map ) {
+ header = new Node;
+ header->color = QMapNodeBase::Red; // Mark the header
+ if ( _map->header->parent == 0 ) {
+ header->parent = 0;
+ header->left = header->right = header;
+ } else {
+ header->parent = copy( (NodePtr)(_map->header->parent) );
+ header->parent->parent = header;
+ header->left = header->parent->minimum();
+ header->right = header->parent->maximum();
+ }
+ }
+ ~QMapPrivate() { clear(); delete header; }
+
+ NodePtr copy( NodePtr p ) {
+ if ( !p )
+ return 0;
+ NodePtr n = new Node( *p );
+ n->color = p->color;
+ if ( p->left ) {
+ n->left = copy( (NodePtr)(p->left) );
+ n->left->parent = n;
+ } else {
+ n->left = 0;
+ }
+ if ( p->right ) {
+ n->right = copy( (NodePtr)(p->right) );
+ n->right->parent = n;
+ } else {
+ n->right = 0;
+ }
+ return n;
+ }
+
+ void clear() {
+ clear( (NodePtr)(header->parent) );
+ header->color = QMapNodeBase::Red;
+ header->parent = 0;
+ header->left = header->right = header;
+ node_count = 0;
+ }
+
+ void clear( NodePtr p ) {
+ while ( p != 0 ) {
+ clear( (NodePtr)p->right );
+ NodePtr y = (NodePtr)p->left;
+ delete p;
+ p = y;
+ }
+ }
+
+ Iterator begin() { return Iterator( (NodePtr)(header->left ) ); }
+ Iterator end() { return Iterator( header ); }
+ ConstIterator begin() const { return ConstIterator( (NodePtr)(header->left ) ); }
+ ConstIterator end() const { return ConstIterator( header ); }
+
+ ConstIterator find(const Key& k) const {
+ QMapNodeBase* y = header; // Last node
+ QMapNodeBase* x = header->parent; // Root node.
+
+ while ( x != 0 ) {
+ // If as k <= key(x) go left
+ if ( !( key(x) < k ) ) {
+ y = x;
+ x = x->left;
+ } else {
+ x = x->right;
+ }
+ }
+
+ // Was k bigger/smaller then the biggest/smallest
+ // element of the tree ? Return end()
+ if ( y == header || k < key(y) )
+ return ConstIterator( header );
+ return ConstIterator( (NodePtr)y );
+ }
+
+ void remove( Iterator it ) {
+ NodePtr del = (NodePtr) removeAndRebalance( it.node, header->parent, header->left, header->right );
+ delete del;
+ --node_count;
+ }
+
+#ifdef QT_QMAP_DEBUG
+ void inorder( QMapNodeBase* x = 0, int level = 0 ){
+ if ( !x )
+ x = header->parent;
+ if ( x->left )
+ inorder( x->left, level + 1 );
+ //cout << level << " Key=" << key(x) << " Value=" << ((NodePtr)x)->data << endl;
+ if ( x->right )
+ inorder( x->right, level + 1 );
+ }
+#endif
+
+ Iterator insertMulti(const Key& v){
+ QMapNodeBase* y = header;
+ QMapNodeBase* x = header->parent;
+ while (x != 0){
+ y = x;
+ x = ( v < key(x) ) ? x->left : x->right;
+ }
+ return insert(x, y, v);
+ }
+
+ Iterator insertSingle( const Key& k ) {
+ // Search correct position in the tree
+ QMapNodeBase* y = header;
+ QMapNodeBase* x = header->parent;
+ bool result = TRUE;
+ while ( x != 0 ) {
+ result = ( k < key(x) );
+ y = x;
+ x = result ? x->left : x->right;
+ }
+ // Get iterator on the last not empty one
+ Iterator j( (NodePtr)y );
+ if ( result ) {
+ // Smaller then the leftmost one ?
+ if ( j == begin() ) {
+ return insert(x, y, k );
+ } else {
+ // Perhaps daddy is the right one ?
+ --j;
+ }
+ }
+ // Really bigger ?
+ if ( (j.node->key) < k )
+ return insert(x, y, k );
+ // We are going to replace a node
+ return j;
+ }
+
+ Iterator insert( QMapNodeBase* x, QMapNodeBase* y, const Key& k ) {
+ NodePtr z = new Node( k );
+ if (y == header || x != 0 || k < key(y) ) {
+ y->left = z; // also makes leftmost = z when y == header
+ if ( y == header ) {
+ header->parent = z;
+ header->right = z;
+ } else if ( y == header->left )
+ header->left = z; // maintain leftmost pointing to min node
+ } else {
+ y->right = z;
+ if ( y == header->right )
+ header->right = z; // maintain rightmost pointing to max node
+ }
+ z->parent = y;
+ z->left = 0;
+ z->right = 0;
+ rebalance( z, header->parent );
+ ++node_count;
+ return Iterator(z);
+ }
+
+protected:
+ /**
+ * Helpers
+ */
+ const Key& key( QMapNodeBase* b ) const { return ((NodePtr)b)->key; }
+
+ /**
+ * Variables
+ */
+ NodePtr header;
+};
+
+
+template<class Key, class T>
+class Q_EXPORT QMap
+{
+public:
+ /**
+ * Typedefs
+ */
+ typedef QMapIterator< Key, T > Iterator;
+ typedef QMapConstIterator< Key, T > ConstIterator;
+ typedef T ValueType;
+ typedef QMapPrivate< Key, T > Priv;
+
+ /**
+ * API
+ */
+ QMap() { sh = new QMapPrivate< Key, T >; }
+ QMap( const QMap<Key,T>& m ) { sh = m.sh; sh->ref(); }
+ ~QMap() { if ( sh->deref() ) delete sh; }
+
+ QMap<Key,T>& operator= ( const QMap<Key,T>& m )
+ { m.sh->ref(); if ( sh->deref() ) delete sh; sh = m.sh; return *this; }
+
+ Iterator begin() { detach(); return sh->begin(); }
+ Iterator end() { detach(); return sh->end(); }
+ ConstIterator begin() const { return ((const Priv*)sh)->begin(); }
+ ConstIterator end() const { return ((const Priv*)sh)->end(); }
+
+ Iterator find ( const Key& k )
+ { detach(); return Iterator( sh->find( k ).node ); }
+ ConstIterator find ( const Key& k ) const
+ { return sh->find( k ); }
+ T& operator[] ( const Key& k ) {
+ detach(); QMapNode<Key,T>* p = sh->find( k ).node;
+ if ( p != sh->end().node ) return p->data;
+ return insert( k, T() ).data(); }
+ const T& operator[] ( const Key& k ) const
+ { return sh->find( k ).data(); }
+ bool contains ( const Key& k ) const
+ { return find( k ) != end(); }
+ //{ return sh->find( k ) != ((const Priv*)sh)->end(); }
+
+ uint count() const { return sh->node_count; }
+
+ bool isEmpty() const { return sh->node_count == 0; }
+
+ Iterator insert( const Key& key, const T& value ) {
+ detach();
+ Iterator it = sh->insertSingle( key );
+ it.data() = value;
+ return it;
+ }
+
+ void remove( Iterator it ) { detach(); sh->remove( it ); }
+ void remove( const Key& k ) {
+ detach();
+ Iterator it( sh->find( k ).node );
+ if ( it != end() )
+ sh->remove( it );
+ }
+
+ Iterator replace( const Key& k, const T& v ) {
+ remove( k );
+ return insert( k, v );
+ }
+
+ void clear() { if ( sh->count == 1 ) sh->clear(); else { sh->deref(); sh = new QMapPrivate<Key,T>; } }
+
+#if defined(Q_FULL_TEMPLATE_INSTANTIATION)
+ bool operator==( const QMap<Key,T>& ) const { return FALSE; }
+#endif
+
+protected:
+ /**
+ * Helpers
+ */
+ void detach() { if ( sh->count > 1 ) { sh->deref(); sh = new QMapPrivate<Key,T>( sh ); } }
+
+ Priv* sh;
+};
+
+
+#ifndef QT_NO_DATASTREAM
+template<class Key, class T>
+inline QDataStream& operator>>( QDataStream& s, QMap<Key,T>& m ) {
+ m.clear();
+ Q_UINT32 c;
+ s >> c;
+ for( Q_UINT32 i = 0; i < c; ++i ) {
+ Key k; T t;
+ s >> k >> t;
+ m.insert( k, t );
+ }
+ return s;
+}
+
+
+template<class Key, class T>
+inline QDataStream& operator<<( QDataStream& s, const QMap<Key,T>& m ) {
+ s << (Q_UINT32)m.count();
+ QMapConstIterator<Key,T> it = m.begin();
+ for( ; it != m.end(); ++it )
+ s << it.key() << it.data();
+ return s;
+}
+#endif
+
+#endif // QMAP_H
diff --git a/qtools/qmodules.h b/qtools/qmodules.h
new file mode 100644
index 0000000..08f0baf
--- /dev/null
+++ b/qtools/qmodules.h
@@ -0,0 +1,11 @@
+// These modules are licensed to you
+#define QT_MODULE_TOOLS
+#define QT_MODULE_KERNEL
+#define QT_MODULE_WIDGETS
+#define QT_MODULE_DIALOGS
+#define QT_MODULE_ICONVIEW
+#define QT_MODULE_WORKSPACE
+#define QT_MODULE_NETWORK
+#define QT_MODULE_CANVAS
+#define QT_MODULE_TABLE
+#define QT_MODULE_XML
diff --git a/qtools/qmutex.cpp b/qtools/qmutex.cpp
new file mode 100644
index 0000000..fda5f07
--- /dev/null
+++ b/qtools/qmutex.cpp
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <stdio.h>
+
+#include "qglobal.h"
+
+#include "qmutex.h"
+#include "qmutex_p.h"
+
+QMutex::QMutex() : d(new QMutexPrivate())
+{
+}
+
+QMutex::~QMutex()
+{
+ delete d;
+}
+
+void QMutex::lock()
+{
+ //printf("%p: QMutex::lock(): enter\n",this);
+ bool isLocked;
+ isLocked = d->contenders == 0 && d->contenders.testAndSet(0, 1);
+ if (!isLocked)
+ {
+ isLocked = d->contenders.fetchAndAdd(1)==0;
+ if (!isLocked)
+ {
+ // didn't get the lock, wait for it
+ //printf("%p: QMutex::lock(): wait() %d\n",this,(int)d->contenders);
+ d->wait();
+
+ // release lock
+ d->contenders.fetchAndAdd(-1);
+ }
+ }
+ //printf("%p: QMutex::lock(): leave\n",this);
+}
+
+bool QMutex::tryLock()
+{
+ bool isLocked = d->contenders == 0 &&
+ d->contenders.testAndSet(0, 1);
+ return isLocked;
+}
+
+void QMutex::unlock()
+{
+ //printf("%p: QMutex::unlock(): enter %d\n",this,(int)d->contenders);
+ if (!d->contenders.testAndSet(1, 0))
+ {
+ //printf("%p: QMutex::unlock(): wakeUp()\n",this);
+ d->wakeUp();
+ }
+ //printf("%p: QMutex::unlock(): leave\n",this);
+}
+
diff --git a/qtools/qmutex.h b/qtools/qmutex.h
new file mode 100644
index 0000000..d3d2ac0
--- /dev/null
+++ b/qtools/qmutex.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMUTEX_H
+#define QMUTEX_H
+
+#include "qglobal.h"
+
+class QMutexPrivate;
+
+class QMutex
+{
+public:
+ QMutex();
+ ~QMutex();
+
+ void lock();
+ bool tryLock();
+ void unlock();
+
+private:
+ QMutex(const QMutex &);
+ QMutex &operator=(const QMutex &);
+
+ QMutexPrivate *d;
+};
+
+class QMutexLocker
+{
+ public:
+ QMutexLocker(QMutex *m) : m_mutex(m)
+ {
+ m_mutex->lock();
+ }
+ ~QMutexLocker()
+ {
+ m_mutex->unlock();
+ }
+ QMutex *mutex() const { return m_mutex; }
+
+ private:
+ QMutex *m_mutex;
+};
+
+#endif // QMUTEX_H
diff --git a/qtools/qmutex_p.h b/qtools/qmutex_p.h
new file mode 100644
index 0000000..a47b407
--- /dev/null
+++ b/qtools/qmutex_p.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMUTEX_P_H
+#define QMUTEX_P_H
+
+#include "qglobal.h"
+
+#if defined(_OS_UNIX_) || defined(_OS_MAC_)
+#include <pthread.h>
+#elif defined(_OS_WIN32_)
+#include <windows.h>
+#endif
+
+class QAtomicInt
+{
+ public:
+ QAtomicInt(int v=0) : m_value(v) {}
+ bool testAndSet(int expectedValue,int newValue);
+ int fetchAndAdd(int valueToAdd);
+ operator int () const { return m_value; }
+ bool operator==(int value) const { return m_value == value; }
+ bool operator!=(int value) const { return m_value != value; }
+ bool operator!() const { return m_value == 0; }
+
+ private:
+ volatile int m_value;
+};
+
+class QMutexPrivate
+{
+public:
+ QMutexPrivate();
+ ~QMutexPrivate();
+
+ void wait();
+ void wakeUp();
+
+ QAtomicInt contenders;
+
+#if defined(_OS_UNIX_) || defined(_OS_MAC_)
+ volatile bool wakeup;
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+#elif defined(_OS_WIN32_)
+ HANDLE event;
+#else
+#error "unsupported platform"
+#endif
+};
+
+#endif // QMUTEX_P_H
diff --git a/qtools/qmutex_unix.cpp b/qtools/qmutex_unix.cpp
new file mode 100644
index 0000000..4fe9a58
--- /dev/null
+++ b/qtools/qmutex_unix.cpp
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <errno.h>
+#include <pthread.h>
+
+#include "qglobal.h"
+#include "qmutex.h"
+#include "qmutex_p.h"
+
+static pthread_mutex_t qAtomicMutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void report_error(int code, const char *where, const char *what)
+{
+ if (code != 0)
+ qWarning("%s: %s failure: %d", where, what, code);
+}
+
+
+QMutexPrivate::QMutexPrivate()
+ : contenders(0), wakeup(FALSE)
+{
+ report_error(pthread_mutex_init(&mutex, NULL), "QMutex", "mutex init");
+ report_error(pthread_cond_init(&cond, NULL), "QMutex", "cv init");
+}
+
+QMutexPrivate::~QMutexPrivate()
+{
+ report_error(pthread_cond_destroy(&cond), "QMutex", "cv destroy");
+ report_error(pthread_mutex_destroy(&mutex), "QMutex", "mutex destroy");
+}
+
+void QMutexPrivate::wait()
+{
+ report_error(pthread_mutex_lock(&mutex), "QMutex::lock", "mutex lock");
+ int errorCode = 0;
+ while (!wakeup)
+ {
+ errorCode = pthread_cond_wait(&cond, &mutex);
+ if (errorCode)
+ {
+ report_error(errorCode, "QMutex::lock()", "cv wait");
+ }
+ }
+ wakeup = FALSE;
+ report_error(pthread_mutex_unlock(&mutex), "QMutex::lock", "mutex unlock");
+}
+
+void QMutexPrivate::wakeUp()
+{
+ report_error(pthread_mutex_lock(&mutex), "QMutex::unlock", "mutex lock");
+ wakeup = TRUE;
+ report_error(pthread_cond_signal(&cond), "QMutex::unlock", "cv signal");
+ report_error(pthread_mutex_unlock(&mutex), "QMutex::unlock", "mutex unlock");
+}
+
+bool QAtomicInt::testAndSet(int expectedValue,int newValue)
+{
+ bool returnValue = false;
+ pthread_mutex_lock(&qAtomicMutex);
+ if (m_value == expectedValue)
+ {
+ m_value = newValue;
+ returnValue = true;
+ }
+ pthread_mutex_unlock(&qAtomicMutex);
+ return returnValue;
+}
+
+int QAtomicInt::fetchAndAdd(int valueToAdd)
+{
+ int returnValue;
+ pthread_mutex_lock(&qAtomicMutex);
+ returnValue = m_value;
+ m_value += valueToAdd;
+ pthread_mutex_unlock(&qAtomicMutex);
+ return returnValue;
+}
+
diff --git a/qtools/qmutex_win32.cpp b/qtools/qmutex_win32.cpp
new file mode 100644
index 0000000..2d662ea
--- /dev/null
+++ b/qtools/qmutex_win32.cpp
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <windows.h>
+
+#include "qmutex.h"
+#include "qmutex_p.h"
+
+QMutexPrivate::QMutexPrivate()
+ : contenders(0)
+{
+ event = CreateEvent(0, FALSE, FALSE, 0);
+ if (!event)
+ qWarning("QMutexPrivate::QMutexPrivate: Cannot create event");
+}
+
+QMutexPrivate::~QMutexPrivate()
+{
+ CloseHandle(event);
+}
+
+void QMutexPrivate::wait()
+{
+ WaitForSingleObject(event, INFINITE);
+}
+
+void QMutexPrivate::wakeUp()
+{
+ SetEvent(event);
+}
+
+//----------------------------------------------------------------------
+
+class QCriticalSection
+{
+ public:
+ QCriticalSection() { InitializeCriticalSection(&section); }
+ ~QCriticalSection() { DeleteCriticalSection(&section); }
+ void lock() { EnterCriticalSection(&section); }
+ void unlock() { LeaveCriticalSection(&section); }
+
+ private:
+ CRITICAL_SECTION section;
+};
+
+static QCriticalSection qAtomicCriticalSection;
+
+bool QAtomicInt::testAndSet(int expectedValue,int newValue)
+{
+ bool returnValue = false;
+ qAtomicCriticalSection.lock();
+ if (m_value == expectedValue)
+ {
+ m_value = newValue;
+ returnValue = true;
+ }
+ qAtomicCriticalSection.unlock();
+ return returnValue;
+}
+
+int QAtomicInt::fetchAndAdd(int valueToAdd)
+{
+ int returnValue;
+ qAtomicCriticalSection.lock();
+ returnValue = m_value;
+ m_value += valueToAdd;
+ qAtomicCriticalSection.unlock();
+ return returnValue;
+}
+
diff --git a/qtools/qptrdict.doc b/qtools/qptrdict.doc
new file mode 100644
index 0000000..bff6a15
--- /dev/null
+++ b/qtools/qptrdict.doc
@@ -0,0 +1,486 @@
+/****************************************************************************
+**
+**
+** QPtrDict and QPtrDictIterator class documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+
+/*****************************************************************************
+ QPtrDict documentation
+ *****************************************************************************/
+
+/*!
+ \class QPtrDict qptrdict.h
+ \brief The QPtrDict class is a template class that provides a dictionary based on \c void* keys.
+
+ \ingroup collection
+ \ingroup tools
+
+ QPtrDict is implemented as a template class. Define a
+ template instance QPtrDict\<X\> to create a dictionary that operates on
+ pointers to X, or X*.
+
+ A dictionary is a collection that associates an item with a key.
+ The key is used for inserting and looking up an item. QPtrDict has
+ \c void* keys.
+
+ The dictionary has very fast insertion and lookup.
+
+ Example:
+ \code
+ #include <qptrdict.h>
+ #include <stdio.h>
+
+ void main()
+ {
+ int *a = new int[12];
+ int *b = new int[10];
+ int *c = new int[18];
+ int *d = new int[13];
+
+ QPtrDict<char> dict; // maps void* -> char*
+
+ dict.insert( a, "a is int[12]" ); // describe pointers
+ dict.insert( b, "b is int[10]" );
+ dict.insert( c, "c is int[18]" );
+
+ printf( "%s\n", dict[a] ); // print descriptions
+ printf( "%s\n", dict[b] );
+ printf( "%s\n", dict[c] );
+
+ if ( !dict[d] )
+ printf( "d not in dictionary\n" );
+ }
+ \endcode
+
+ Program output:
+ \code
+ a is int[12]
+ b is int[10]
+ c is int[18]
+ d not in dictionary
+ \endcode
+
+ The dictionary in our example maps \c int* keys to \c char* items.
+ QPtrDict implements the \link operator[] [] operator\endlink to lookup
+ an item.
+
+ QPtrDict is implemented by QGDict as a hash array with a fixed number of
+ entries. Each array entry points to a singly linked list of buckets, in
+ which the dictionary items are stored.
+
+ When an item is inserted with a key, the key is converted (hashed) to
+ an integer index into the hash array using the \c mod operation. The
+ item is inserted before the first bucket in the list of buckets.
+
+ Looking up an item is normally very fast. The key is again hashed to an
+ array index. Then QPtrDict scans the list of buckets and returns the item
+ found or null if the item was not found. You cannot insert null pointers
+ into a dictionary.
+
+ The size of the hash array is very important. In order to get good
+ performance, you should use a suitably large \link primes.html prime
+ number\endlink. Suitable means equal to or larger than the maximum
+ expected number of dictionary items.
+
+ Items with equal keys are allowed. When inserting two items with the
+ same key, only the last inserted item will be visible (last in, first out)
+ until it is removed.
+
+ Example:
+ \code
+ #include <qptrdict.h>
+ #include <stdio.h>
+
+ void main()
+ {
+ QPtrDict<char> dict; // maps char* ==> char*
+
+ double *ptr = new double[28];
+ dict.insert( ptr, "first" );
+ dict.insert( ptr, "second" );
+
+ printf( "%s\n", dict[ptr] );
+ dict.remove( ptr );
+ printf( "%s\n", dict[ptr] );
+ }
+ \endcode
+
+ Program output:
+ \code
+ second
+ first
+ \endcode
+
+ The QPtrDictIterator class can traverse the dictionary contents, but only
+ in an arbitrary order. Multiple iterators may independently traverse the
+ same dictionary.
+
+ Calling setAutoDelete(TRUE) for a dictionary tells it to delete items
+ that are removed . The default is to not delete items when they are
+ removed.
+
+ When inserting an item into a dictionary, only the pointer is copied, not
+ the item itself. This is called a shallow copy. It is possible to make the
+ dictionary copy all of the item's data (known as a deep copy) when an
+ item is inserted. insert() calls the virtual function
+ QCollection::newItem() for the item to be inserted.
+ Inherit a dictionary and reimplement it if you want deep copies.
+
+ When removing a dictionary item, the virtual function
+ QCollection::deleteItem() is called. QPtrDict's default implementation
+ is to delete the item if auto-deletion is enabled.
+
+ \sa QPtrDictIterator, QDict, QAsciiDict, QIntDict,
+ \link collection.html Collection Classes\endlink
+*/
+
+
+/*!
+ \fn QPtrDict::QPtrDict( int size )
+ Constructs a dictionary using an internal hash array with the size
+ \e size.
+
+ Setting \e size to a suitably large \link primes.html prime number\endlink
+ (equal to or greater than the expected number of entries) makes the hash
+ distribution better and hence the loopup faster.
+*/
+
+/*!
+ \fn QPtrDict::QPtrDict( const QPtrDict<type> &dict )
+ Constructs a copy of \e dict.
+
+ Each item in \e dict are inserted into this dictionary.
+ Only the pointers are copied (shallow copy).
+*/
+
+/*!
+ \fn QPtrDict::~QPtrDict()
+ Removes all items from the dictionary and destroys it.
+
+ All iterators that access this dictionary will be reset.
+
+ \sa setAutoDelete()
+*/
+
+/*!
+ \fn QPtrDict<type> &QPtrDict::operator=(const QPtrDict<type> &dict)
+ Assigns \e dict to this dictionary and returns a reference to this
+ dictionary.
+
+ This dictionary is first cleared, then each item in \e dict is inserted
+ into this dictionary.
+ Only the pointers are copied (shallow copy), unless newItem() has been
+ reimplemented().
+*/
+
+/*!
+ \fn uint QPtrDict::count() const
+ Returns the number of items in the dictionary.
+ \sa isEmpty()
+*/
+
+/*!
+ \fn uint QPtrDict::size() const
+ Returns the size of the internal hash array (as specified in the
+ constructor).
+ \sa count()
+*/
+
+/*!
+ \fn void QPtrDict::resize( uint newsize )
+ Changes the size of the hashtable the \a newsize.
+ The contents of the dictionary are preserved,
+ but all iterators on the dictionary become invalid.
+*/
+
+/*!
+ \fn bool QPtrDict::isEmpty() const
+ Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
+ otherwise.
+ \sa count()
+*/
+
+/*!
+ \fn void QPtrDict::insert( void *key, const type *item )
+ Inserts the \e key with the \e item into the dictionary.
+
+ The key does not have to be a unique dictionary key. If multiple items
+ are inserted with the same key, only the last item will be visible.
+
+ Null items are not allowed.
+
+ \sa replace()
+*/
+
+/*!
+ \fn void QPtrDict::replace( void *key, const type *item )
+ Replaces an item which has a key equal to \e key with \e item.
+
+ If the item does not already exist, it will be inserted.
+
+ Null items are not allowed.
+
+ Equivalent to:
+ \code
+ QPtrDict<char> dict;
+ ...
+ if ( dict.find(key) )
+ dict.remove( key );
+ dict.insert( key, item );
+ \endcode
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be replaced.
+
+ \sa insert()
+*/
+
+/*!
+ \fn bool QPtrDict::remove( void *key )
+ Removes the item associated with \e key from the dictionary.
+ Returns TRUE if successful, or FALSE if the key does not exist in the
+ dictionary.
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be removed.
+
+ The removed item is deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ All dictionary iterators that refer to the removed item will be set to
+ point to the next item in the dictionary traversing order.
+
+ \sa take(), clear(), setAutoDelete()
+*/
+
+/*!
+ \fn type *QPtrDict::take( void *key )
+ Takes the item associated with \e key out of the dictionary without
+ deleting it (even if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled).
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be taken.
+
+ Returns a pointer to the item taken out, or null if the key does not
+ exist in the dictionary.
+
+ All dictionary iterators that refer to the taken item will be set to
+ point to the next item in the dictionary traversing order.
+
+ \sa remove(), clear(), setAutoDelete()
+*/
+
+/*!
+ \fn void QPtrDict::clear()
+ Removes all items from the dictionary.
+
+ The removed items are deleted if \link QCollection::setAutoDelete()
+ auto-deletion\endlink is enabled.
+
+ All dictionary iterators that access this dictionary will be reset.
+
+ \sa remove(), take(), setAutoDelete()
+*/
+
+/*!
+ \fn type *QPtrDict::find( void *key ) const
+ Returns the item associated with \e key, or null if the key does not
+ exist in the dictionary.
+
+ This function uses an internal hashing algorithm to optimize lookup.
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be found.
+
+ Equivalent to the [] operator.
+
+ \sa operator[]()
+*/
+
+/*!
+ \fn type *QPtrDict::operator[]( void *key ) const
+ Returns the item associated with \e key, or null if the key does not
+ exist in the dictionary.
+
+ This function uses an internal hashing algorithm to optimize lookup.
+
+ If there are two or more items with equal keys, then the last inserted
+ of these will be found.
+
+ Equivalent to the find() function.
+
+ \sa find()
+*/
+
+/*!
+ \fn void QPtrDict::statistics() const
+ Debugging-only function that prints out the dictionary distribution
+ using qDebug().
+*/
+
+
+/*****************************************************************************
+ QPtrDictIterator documentation
+ *****************************************************************************/
+
+/*!
+ \class QPtrDictIterator qptrdict.h
+ \brief The QPtrDictIterator class provides an iterator for QPtrDict collections.
+
+ \ingroup collection
+ \ingroup tools
+
+ QPtrDictIterator is implemented as a template class.
+ Define a template instance QPtrDictIterator\<X\> to create a
+ dictionary iterator that operates on QPtrDict\<X\> (dictionary of X*).
+
+ Example:
+ \code
+ #include <qptrdict.h>
+ #include <stdio.h>
+
+ void main()
+ {
+ int *a = new int[12];
+ int *b = new int[10];
+ int *c = new int[18];
+ int *d = new int[13];
+
+ QPtrDict<char> dict; // maps void* -> char*
+
+ dict.insert( a, "a is int[12]" ); // describe pointers
+ dict.insert( b, "b is int[10]" );
+ dict.insert( c, "c is int[18]" );
+
+ QPtrDictIterator<char> it( dict ); // iterator for dict
+
+ while ( it.current() ) {
+ printf( "%x -> %s\n", it.currentKey(), it.current() );
+ ++it;
+ }
+ }
+ \endcode
+
+ Program output:
+ \code
+ 804a788 -> a is int[12]
+ 804a7f0 -> c is int[18]
+ 804a7c0 -> b is int[10]
+ \endcode
+
+ Note that the traversal order is arbitrary, you are not guaranteed the
+ order above.
+
+ Multiple iterators may independently traverse the same dictionary.
+ A QPtrDict knows about all iterators that are operating on the dictionary.
+ When an item is removed from the dictionary, QPtrDict update all
+ iterators that are referring the removed item to point to the next item
+ in the traversing order.
+
+ \sa QPtrDict, \link collection.html Collection Classes\endlink
+*/
+
+/*!
+ \fn QPtrDictIterator::QPtrDictIterator( const QPtrDict<type> &dict )
+ Constructs an iterator for \e dict. The current iterator item is
+ set to point on the first item in the \e dict.
+*/
+
+/*!
+ \fn QPtrDictIterator::~QPtrDictIterator()
+ Destroys the iterator.
+*/
+
+/*!
+ \fn uint QPtrDictIterator::count() const
+ Returns the number of items in the dictionary this iterator operates on.
+ \sa isEmpty()
+*/
+
+/*!
+ \fn bool QPtrDictIterator::isEmpty() const
+ Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
+ otherwise.
+ \sa count()
+*/
+
+/*!
+ \fn type *QPtrDictIterator::toFirst()
+ Sets the current iterator item to point to the first item in the
+ dictionary and returns a pointer to the item.
+ If the dictionary is empty it sets the current item to null and
+ returns null.
+*/
+
+/*!
+ \fn QPtrDictIterator::operator type *() const
+ Cast operator. Returns a pointer to the current iterator item.
+ Same as current().
+*/
+
+/*!
+ \fn type *QPtrDictIterator::current() const
+ Returns a pointer to the current iterator item.
+*/
+
+/*!
+ \fn void *QPtrDictIterator::currentKey() const
+ Returns the key for the current iterator item.
+*/
+
+/*!
+ \fn type *QPtrDictIterator::operator()()
+ Makes the succeeding item current and returns the original current item.
+
+ If the current iterator item was the last item in the dictionary or if it
+ was null, null is returned.
+*/
+
+/*!
+ \fn type *QPtrDictIterator::operator++()
+ Prefix ++ makes the succeeding item current and returns the new current
+ item.
+
+ If the current iterator item was the last item in the dictionary or if it
+ was null, null is returned.
+*/
+
+/*!
+ \fn type *QPtrDictIterator::operator+=( uint jump )
+ Sets the current item to the item \e jump positions after the current item,
+ and returns a pointer to that item.
+
+ If that item is beyond the last item or if the dictionary is empty,
+ it sets the current item to null and returns null.
+*/
diff --git a/qtools/qptrdict.h b/qtools/qptrdict.h
new file mode 100644
index 0000000..c075e30
--- /dev/null
+++ b/qtools/qptrdict.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+**
+** Definition of QPtrDict template class
+**
+** Created : 970415
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QPTRDICT_H
+#define QPTRDICT_H
+
+#ifndef QT_H
+#include "qgdict.h"
+#endif // QT_H
+
+
+template<class type> class Q_EXPORT QPtrDict : public QGDict
+{
+public:
+ QPtrDict(int size=17) : QGDict(size,PtrKey,0,0) {}
+ QPtrDict( const QPtrDict<type> &d ) : QGDict(d) {}
+ ~QPtrDict() { clear(); }
+ QPtrDict<type> &operator=(const QPtrDict<type> &d)
+ { return (QPtrDict<type>&)QGDict::operator=(d); }
+ uint count() const { return QGDict::count(); }
+ uint size() const { return QGDict::size(); }
+ bool isEmpty() const { return QGDict::count() == 0; }
+ void insert( void *k, const type *d )
+ { QGDict::look_ptr(k,(Item)d,1); }
+ void replace( void *k, const type *d )
+ { QGDict::look_ptr(k,(Item)d,2); }
+ bool remove( void *k ) { return QGDict::remove_ptr(k); }
+ type *take( void *k ) { return (type*)QGDict::take_ptr(k); }
+ type *find( void *k ) const
+ { return (type *)((QGDict*)this)->QGDict::look_ptr(k,0,0); }
+ type *operator[]( void *k ) const
+ { return (type *)((QGDict*)this)->QGDict::look_ptr(k,0,0); }
+ void clear() { QGDict::clear(); }
+ void resize( uint n ) { QGDict::resize(n); }
+ void statistics() const { QGDict::statistics(); }
+private:
+ void deleteItem( Item d );
+};
+
+#if defined(Q_DELETING_VOID_UNDEFINED)
+template<> inline void QPtrDict<void>::deleteItem( QCollection::Item )
+{
+}
+#endif
+
+template<class type> inline void QPtrDict<type>::deleteItem( QCollection::Item d )
+{
+ if ( del_item ) delete (type *)d;
+}
+
+
+template<class type> class Q_EXPORT QPtrDictIterator : public QGDictIterator
+{
+public:
+ QPtrDictIterator(const QPtrDict<type> &d) :QGDictIterator((QGDict &)d) {}
+ ~QPtrDictIterator() {}
+ uint count() const { return dict->count(); }
+ bool isEmpty() const { return dict->count() == 0; }
+ type *toFirst() { return (type *)QGDictIterator::toFirst(); }
+ operator type *() const { return (type *)QGDictIterator::get(); }
+ type *current() const { return (type *)QGDictIterator::get(); }
+ void *currentKey() const { return QGDictIterator::getKeyPtr(); }
+ type *operator()() { return (type *)QGDictIterator::operator()(); }
+ type *operator++() { return (type *)QGDictIterator::operator++(); }
+ type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
+};
+
+
+#endif // QPTRDICT_H
diff --git a/qtools/qqueue.h b/qtools/qqueue.h
new file mode 100644
index 0000000..94bc130
--- /dev/null
+++ b/qtools/qqueue.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+**
+** Definition of QQueue template/macro class
+**
+** Created : 920917
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QQUEUE_H
+#define QQUEUE_H
+
+#ifndef QT_H
+#include "qglist.h"
+#endif // QT_H
+
+
+template<class type> class QQueue : private QGList
+{
+public:
+ QQueue() {}
+ QQueue( const QQueue<type> &q ) : QGList(q) {}
+ ~QQueue() { clear(); }
+ QQueue<type>& operator=(const QQueue<type> &q)
+ { return (QQueue<type>&)QGList::operator=(q); }
+ bool autoDelete() const { return QCollection::autoDelete(); }
+ void setAutoDelete( bool del ) { QCollection::setAutoDelete(del); }
+ uint count() const { return QGList::count(); }
+ bool isEmpty() const { return QGList::count() == 0; }
+ void enqueue( const type *d ) { QGList::append(Item(d)); }
+ type *dequeue() { return (type *)QGList::takeFirst();}
+ bool remove() { return QGList::removeFirst(); }
+ void clear() { QGList::clear(); }
+ type *head() const { return (type *)QGList::cfirst(); }
+ operator type *() const { return (type *)QGList::cfirst(); }
+ type *current() const { return (type *)QGList::cfirst(); }
+private:
+ void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
+};
+
+
+#endif // QQUEUE_H
diff --git a/qtools/qregexp.cpp b/qtools/qregexp.cpp
new file mode 100644
index 0000000..b151558
--- /dev/null
+++ b/qtools/qregexp.cpp
@@ -0,0 +1,1092 @@
+/****************************************************************************
+**
+**
+** Implementation of QRegExp class
+**
+** Created : 950126
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qregexp.h"
+#include <ctype.h>
+#include <stdlib.h>
+
+// NOT REVISED
+/*!
+ \class QRegExp qregexp.h
+ \ingroup tools
+ \ingroup misc
+ \brief The QRegExp class provides pattern matching using regular
+ expressions or wildcards.
+
+ QRegExp knows these regexp primitives:
+ <ul plain>
+ <li><dfn>c</dfn> matches the character 'c'
+ <li><dfn>.</dfn> matches any character
+ <li><dfn>^</dfn> matches start of input
+ <li><dfn>$</dfn> matches end of input
+ <li><dfn>[]</dfn> matches a defined set of characters - see below.
+ <li><dfn>a*</dfn> matches a sequence of zero or more a's
+ <li><dfn>a+</dfn> matches a sequence of one or more a's
+ <li><dfn>a?</dfn> matches an optional a
+ <li><dfn>\c</dfn> escape code for matching special characters such
+ as \, [, *, +, . etc.
+ <li><dfn>\t</dfn> matches the TAB character (9)
+ <li><dfn>\n</dfn> matches newline (10)
+ <li><dfn>\r</dfn> matches return (13)
+ <li><dfn>\s</dfn> matches a white space (defined as any character
+ for which QChar::isSpace() returns TRUE. This includes at least
+ ASCII characters 9 (TAB), 10 (LF), 11 (VT), 12(FF), 13 (CR) and 32
+ (Space)).
+ <li><dfn>\d</dfn> matches a digit (defined as any character for
+ which QChar::isDigit() returns TRUE. This includes at least ASCII
+ characters '0'-'9').
+ <li><dfn>\x1f6b</dfn> matches the character with unicode point U1f6b
+ (hexadecimal 1f6b). \x0012 will match the ASCII/Latin1 character
+ 0x12 (18 decimal, 12 hexadecimal).
+ <li><dfn>\022</dfn> matches the ASCII/Latin1 character 022 (18
+ decimal, 22 octal).
+ </ul>
+
+ In wildcard mode, it only knows four primitives:
+ <ul plain>
+ <li><dfn>c</dfn> matches the character 'c'
+ <li><dfn>?</dfn> matches any character
+ <li><dfn>*</dfn> matches any sequence of characters
+ <li><dfn>[]</dfn> matches a defined set of characters - see below.
+ </ul>
+
+ QRegExp supports Unicode both in the pattern strings and in the
+ strings to be matched.
+
+ When writing regular expressions in C++ code, remember that C++
+ processes \ characters. So in order to match e.g. a "." character,
+ you must write "\\." in C++ source, not "\.".
+
+ A character set matches a defined set of characters. For example,
+ [BSD] matches any of 'B', 'D' and 'S'. Within a character set, the
+ special characters '.', '*', '?', '^', '$', '+' and '[' lose their
+ special meanings. The following special characters apply:
+ <ul plain>
+ <li><dfn>^</dfn> When placed first in the list, changes the
+ character set to match any character \e not in the list. To include
+ the character '^' itself in the set, escape it or place it anywhere
+ but first.
+ <li><dfn>-</dfn> Defines a range of characters. To include the
+ character '-' itself in the set, escape it or place it last.
+ <li><dfn>]</dfn> Ends the character set definition. To include the
+ character ']' itself in the set, escape it or place it first (but
+ after the negation operator '^', if present)
+ </ul>
+ Thus, [a-zA-Z0-9.] matches upper and lower case ASCII letters,
+ digits and dot; and [^\s] matches everything except white space.
+
+ \bug Case insensitive matching is not supported for non-ASCII/Latin1
+ (non-8bit) characters. Any character with a non-zero QChar.row() is
+ matched case sensitively even if the QRegExp is in case insensitive
+ mode.
+
+ \note In Qt 3.0, the language of regular expressions will contain
+ five more special characters, namely '(', ')', '{', '|' and '}'. To
+ ease porting, it's a good idea to escape these characters with a
+ backslash in all the regular expressions you'll write from now on.
+*/
+
+
+//
+// The regexp pattern is internally represented as an array of uints,
+// each element containing an 16-bit character or a 32-bit code
+// (listed below). User-defined character classes (e.g. [a-zA-Z])
+// are encoded as this:
+// uint no: 1 2 3 ...
+// value: CCL | n from | to from | to
+//
+// where n is the (16-bit) number of following range definitions and
+// from and to define the ranges inclusive. from <= to is always true,
+// otherwise it is a built-in charclass (Pxx, eg \s - PWS). Single
+// characters in the class are coded as from==to. Negated classes
+// (e.g. [^a-z]) use CCN instead of CCL.
+
+const uint END = 0x00000000;
+const uint PWS = 0x10010000; // predef charclass: whitespace (\s)
+const uint PDG = 0x10020000; // predef charclass: digit (\d)
+const uint CCL = 0x20010000; // character class []
+const uint CCN = 0x20020000; // neg character class [^]
+const uint CHR = 0x40000000; // character
+const uint BOL = 0x80010000; // beginning of line ^
+const uint EOL = 0x80020000; // end of line $
+const uint BOW = 0x80030000; // beginning of word \<
+const uint EOW = 0x80040000; // end of word \>
+const uint ANY = 0x80050000; // any character .
+const uint CLO = 0x80070000; // Kleene closure *
+const uint OPT = 0x80080000; // Optional closure ?
+
+const uint MCC = 0x20000000; // character class bitmask
+const uint MCD = 0xffff0000; // code mask
+const uint MVL = 0x0000ffff; // value mask
+
+//
+// QRegExp::error codes (internal)
+//
+
+const int PatOk = 0; // pattern ok
+const int PatNull = 1; // no pattern defined
+const int PatSyntax = 2; // pattern syntax error
+const int PatOverflow = 4; // pattern too long
+
+
+/*****************************************************************************
+ QRegExp member functions
+ *****************************************************************************/
+
+/*!
+ Constructs an empty regular expression.
+*/
+
+QRegExp::QRegExp()
+{
+ rxdata = 0;
+ cs = TRUE;
+ wc = FALSE;
+ error = PatOk;
+}
+
+/*!
+ Constructs a regular expression.
+
+ \arg \e pattern is the regular expression pattern string.
+ \arg \e caseSensitive specifies whether or not to use case sensitive
+ matching.
+ \arg \e wildcard specifies whether the pattern string should be used for
+ wildcard matching (also called globbing expression), normally used for
+ matching file names.
+
+ \sa setWildcard()
+*/
+
+QRegExp::QRegExp( const QCString &pattern, bool caseSensitive, bool wildcard )
+{
+ rxstring = pattern;
+ rxdata = 0;
+ cs = caseSensitive;
+ wc = wildcard;
+ compile();
+}
+
+/*!
+ Constructs a regular expression which is a copy of \e r.
+ \sa operator=(const QRegExp&)
+*/
+
+QRegExp::QRegExp( const QRegExp &r )
+{
+ rxstring = r.pattern();
+ rxdata = 0;
+ cs = r.caseSensitive();
+ wc = r.wildcard();
+ compile();
+}
+
+/*!
+ Destructs the regular expression and cleans up its internal data.
+*/
+
+QRegExp::~QRegExp()
+{
+ if ( rxdata ) // Avoid purify complaints
+ delete [] rxdata;
+}
+
+/*!
+ Copies the regexp \e r and returns a reference to this regexp.
+ The case sensitivity and wildcard options are copied, as well.
+*/
+
+QRegExp &QRegExp::operator=( const QRegExp &r )
+{
+ rxstring = r.rxstring;
+ cs = r.cs;
+ wc = r.wc;
+ compile();
+ return *this;
+}
+
+/*!
+ \obsolete
+ Consider using setPattern() instead of this method.
+
+ Sets the pattern string to \e pattern and returns a reference to this regexp.
+ The case sensitivity or wildcard options do not change.
+*/
+
+QRegExp &QRegExp::operator=( const QCString &pattern )
+{
+ rxstring = pattern;
+ compile();
+ return *this;
+}
+
+
+/*!
+ Returns TRUE if this regexp is equal to \e r.
+
+ Two regexp objects are equal if they have equal pattern strings,
+ case sensitivity options and wildcard options.
+*/
+
+bool QRegExp::operator==( const QRegExp &r ) const
+{
+ return rxstring == r.rxstring && cs == r.cs && wc == r.wc;
+}
+
+/*!
+ \fn bool QRegExp::operator!=( const QRegExp &r ) const
+
+ Returns TRUE if this regexp is \e not equal to \e r.
+
+ \sa operator==()
+*/
+
+/*!
+ \fn bool QRegExp::isEmpty() const
+ Returns TRUE if the regexp is empty.
+*/
+
+/*!
+ \fn bool QRegExp::isValid() const
+ Returns TRUE if the regexp is valid, or FALSE if it is invalid.
+
+ The pattern "[a-z" is an example of an invalid pattern, since it lacks a
+ closing bracket.
+*/
+
+
+/*!
+ \fn bool QRegExp::wildcard() const
+ Returns TRUE if wildcard mode is on, otherwise FALSE. \sa setWildcard().
+*/
+
+/*!
+ Sets the wildcard option for the regular expression. The default
+ is FALSE.
+
+ Setting \e wildcard to TRUE makes it convenient to match filenames
+ instead of plain text.
+
+ For example, "qr*.cpp" matches the string "qregexp.cpp" in wildcard mode,
+ but not "qicpp" (which would be matched in normal mode).
+
+ \sa wildcard()
+*/
+
+void QRegExp::setWildcard( bool wildcard )
+{
+ if ( wildcard != wc ) {
+ wc = wildcard;
+ compile();
+ }
+}
+
+/*!
+ \fn bool QRegExp::caseSensitive() const
+
+ Returns TRUE if case sensitivity is enabled, otherwise FALSE. The
+ default is TRUE.
+
+ \sa setCaseSensitive()
+*/
+
+/*!
+ Enables or disables case sensitive matching.
+
+ In case sensitive mode, "a.e" matches "axe" but not "Axe".
+
+ See also: caseSensitive()
+*/
+
+void QRegExp::setCaseSensitive( bool enable )
+{
+ if ( cs != enable ) {
+ cs = enable;
+ compile();
+ }
+}
+
+
+/*!
+ \fn QCString QRegExp::pattern() const
+ Returns the pattern string of the regexp.
+*/
+
+
+/*!
+ \fn void QRegExp::setPattern(const QCString & pattern)
+ Sets the pattern string to \a pattern and returns a reference to this regexp.
+ The case sensitivity or wildcard options do not change.
+*/
+
+static inline bool iswordchar( int x )
+{
+ return isalnum(x) || x == '_'; //# Only 8-bit support
+}
+
+
+/*!
+ \internal
+ Match character class
+*/
+
+static bool matchcharclass( uint *rxd, char c )
+{
+ uint *d = rxd;
+ uint clcode = *d & MCD;
+ bool neg = clcode == CCN;
+ if ( clcode != CCL && clcode != CCN)
+ qWarning("QRegExp: Internal error, please report to qt-bugs@trolltech.com");
+ uint numFields = *d & MVL;
+ uint cval = (uint)c; //(((uint)(c.row())) << 8) | ((uint)c.cell());
+ bool found = FALSE;
+ for ( int i = 0; i < (int)numFields; i++ ) {
+ d++;
+ if ( *d == PWS && isspace(c) ) {
+ found = TRUE;
+ break;
+ }
+ if ( *d == PDG && isdigit(c) ) {
+ found = TRUE;
+ break;
+ }
+ else {
+ uint from = ( *d & MCD ) >> 16;
+ uint to = *d & MVL;
+ if ( (cval >= from) && (cval <= to) ) {
+ found = TRUE;
+ break;
+ }
+ }
+ }
+ return neg ? !found : found;
+}
+
+
+
+/*
+ Internal: Recursively match string.
+*/
+
+static int matchstring( uint *rxd, const char *str, uint strlength,
+ const char *bol, bool cs )
+{
+ const char *p = str;
+ const char *start = p;
+ uint pl = strlength;
+ uint *d = rxd;
+
+ //### in all cases here: handle pl == 0! (don't read past strlen)
+ while ( *d ) {
+ if ( *d & CHR ) { // match char
+ if ( !pl )
+ return -1;
+ char c = *d;
+ if ( !cs /*&& !c.row()*/ ) { // case insensitive, #Only 8bit
+ if ( tolower(*p) != c )
+ return -1;
+ p++;
+ pl--;
+ } else { // case insensitive
+ if ( *p != c )
+ return -1;
+ p++;
+ pl--;
+ }
+ d++;
+ }
+ else if ( *d & MCC ) { // match char class
+ if ( !pl )
+ return -1;
+ if ( !matchcharclass( d, *p ) )
+ return -1;
+ p++;
+ pl--;
+ d += (*d & MVL) + 1;
+ }
+ else switch ( *d++ ) {
+ case PWS: // match whitespace
+ if ( !pl || !isspace(*p) )
+ return -1;
+ p++;
+ pl--;
+ break;
+ case PDG: // match digits
+ if ( !pl || !isdigit(*p) )
+ return -1;
+ p++;
+ pl--;
+ break;
+ case ANY: // match anything
+ if ( !pl )
+ return -1;
+ p++;
+ pl--;
+ break;
+ case BOL: // match beginning of line
+ if ( p != bol )
+ return -1;
+ break;
+ case EOL: // match end of line
+ if ( pl )
+ return -1;
+ break;
+ case BOW: // match beginning of word
+ if ( !iswordchar(*p) || (p > bol && iswordchar(*(p-1)) ) )
+ return -1;
+ break;
+ case EOW: // match end of word
+ if ( iswordchar(*p) || p == bol || !iswordchar(*(p-1)) )
+ return -1;
+ break;
+ case CLO: // Kleene closure
+ {
+ const char *first_p = p;
+ if ( *d & CHR ) { // match char
+ char c = *d;
+ if ( !cs /*&& !c.row()*/ ) { // case insensitive, #only 8bit
+ while ( pl /*&& !p->row()*/ && tolower(*p)==c ) {
+ p++;
+ pl--;
+ }
+ }
+ else { // case sensitive
+ while ( pl && *p == c ) {
+ p++;
+ pl--;
+ }
+ }
+ d++;
+ }
+ else if ( *d & MCC ) { // match char class
+ while( pl && matchcharclass( d, *p ) ) {
+ p++;
+ pl--;
+ }
+ d += (*d & MVL) + 1;
+ }
+ else if ( *d == PWS ) {
+ while ( pl && isspace(*p) ) {
+ p++;
+ pl--;
+ }
+ d++;
+ }
+ else if ( *d == PDG ) {
+ while ( pl && isdigit(*p) ) {
+ p++;
+ pl--;
+ }
+ d++;
+ }
+ else if ( *d == ANY ) {
+ p += pl;
+ pl = 0;
+ d++;
+ }
+ else {
+ return -1; // error
+ }
+ d++; // skip CLO's END
+ while ( p >= first_p ) { // go backwards
+ int end = matchstring( d, p, pl, bol, cs );
+ if ( end >= 0 )
+ return ( p - start ) + end;
+ if ( !p )
+ return -1;
+ --p;
+ ++pl;
+ }
+ }
+ return -1;
+ case OPT: // optional closure
+ {
+ const char *first_p = p;
+ if ( *d & CHR ) { // match char
+ char c = *d;
+ if ( !cs /*&& !c.row()*/ ) { // case insensitive, #only 8bit
+ if ( pl && /*!p->row() &&*/ tolower(*p) == c ) {
+ p++;
+ pl--;
+ }
+ }
+ else { // case sensitive
+ if ( pl && *p == c ) {
+ p++;
+ pl--;
+ }
+ }
+ d++;
+ }
+ else if ( *d & MCC ) { // match char class
+ if ( pl && matchcharclass( d, *p ) ) {
+ p++;
+ pl--;
+ }
+ d += (*d & MVL) + 1;
+ }
+ else if ( *d == PWS ) {
+ if ( pl && isspace(*p) ) {
+ p++;
+ pl--;
+ }
+ d++;
+ }
+ else if ( *d == PDG ) {
+ if ( pl && isdigit(*p) ) {
+ p++;
+ pl--;
+ }
+ d++;
+ }
+ else if ( *d == ANY ) {
+ if ( pl ) {
+ p++;
+ pl--;
+ }
+ d++;
+ }
+ else {
+ return -1; // error
+ }
+ d++; // skip OPT's END
+ while ( p >= first_p ) { // go backwards
+ int end = matchstring( d, p, pl, bol, cs );
+ if ( end >= 0 )
+ return ( p - start ) + end;
+ if ( !p )
+ return -1;
+ --p;
+ ++pl;
+ }
+ }
+ return -1;
+
+ default: // error
+ return -1;
+ }
+ }
+ return p - start;
+}
+
+
+/*!
+ \internal
+ Recursively match string.
+*/
+
+// This is obsolete now, but since it is protected (not private), it
+// is still implemented on the off-chance that somebody has made a
+// class derived from QRegExp and calls this directly.
+// Qt 3.0: Remove this?
+
+#if 0
+const char *QRegExp::matchstr( uint *rxd, const QChar *str, uint strlength,
+ const QChar *bol ) const
+{
+ int len = matchstring( rxd, str, strlength, bol, cs );
+ if ( len < 0 )
+ return 0;
+ return str + len;
+}
+#endif
+
+/*!
+ Attempts to match in \e str, starting from position \e index.
+ Returns the position of the match, or -1 if there was no match.
+
+ If \e len is not a null pointer, the length of the match is stored in
+ \e *len.
+
+ If \e indexIsStart is TRUE (the default), the position \e index in
+ the string will match the start-of-input primitive (^) in the
+ regexp, if present. Otherwise, position 0 in \e str will match.
+
+ Example:
+ \code
+ QRegExp r("[0-9]*\\.[0-9]+"); // matches floating point
+ int len;
+ r.match("pi = 3.1416", 0, &len); // returns 5, len == 6
+ \endcode
+
+ \note In Qt 3.0, this function will be replaced by find().
+*/
+
+int QRegExp::match( const QCString &str, int index, int *len,
+ bool indexIsStart ) const
+{
+ if ( !isValid() || isEmpty() )
+ return -1;
+ if ( str.length() < (uint)index )
+ return -1;
+ const char *start = str.data();
+ const char *p = start + index;
+ uint pl = str.length() - index;
+ uint *d = rxdata;
+ int ep = -1;
+
+ if ( *d == BOL ) { // match from beginning of line
+ ep = matchstring( d, p, pl, indexIsStart ? p : start, cs );
+ } else {
+ if ( *d & CHR ) {
+ char c = *d;
+ if ( !cs /*&& !c.row()*/ ) { // case sensitive, # only 8bit
+ while ( pl && ( /*p->row() ||*/ tolower(*p) != c ) ) {
+ p++;
+ pl--;
+ }
+ } else { // case insensitive
+ while ( pl && *p != c ) {
+ p++;
+ pl--;
+ }
+ }
+ }
+ while( 1 ) { // regular match
+ ep = matchstring( d, p, pl, indexIsStart ? start+index : start, cs );
+ if ( ep >= 0 )
+ break;
+ if ( !pl )
+ break;
+ p++;
+ pl--;
+ }
+ }
+ if ( len )
+ *len = ep >= 0 ? ep : 0; // No match -> 0, for historical reasons
+ return ep >= 0 ? (int)(p - start) : -1; // return index;
+}
+
+/*! \fn int QRegExp::find( const QCString& str, int index )
+
+ Attempts to match in \e str, starting from position \e index.
+ Returns the position of the match, or -1 if there was no match.
+
+ \sa match()
+*/
+
+//
+// Translate wildcard pattern to standard regexp pattern.
+// Ex: *.cpp ==> ^.*\.cpp$
+//
+
+static QCString wc2rx( const QCString &pattern )
+{
+ int patlen = (int)pattern.length();
+ QCString wcpattern("^");
+
+ char c;
+ for( int i = 0; i < patlen; i++ ) {
+ c = pattern[i];
+ switch ( (char)c ) {
+ case '*': // '*' ==> '.*'
+ wcpattern += '.';
+ break;
+ case '?': // '?' ==> '.'
+ c = '.';
+ break;
+ case '.': // quote special regexp chars
+ case '+':
+ case '\\':
+ case '$':
+ case '^':
+ wcpattern += '\\';
+ break;
+ case '[':
+ if ( (char)pattern[i+1] == '^' ) { // don't quote '^' after '['
+ wcpattern += '[';
+ c = pattern[i+1];
+ i++;
+ }
+ break;
+ }
+ wcpattern += c;
+
+ }
+ wcpattern += '$';
+ return wcpattern; // return new regexp pattern
+}
+
+
+//
+// Internal: Get char value and increment pointer.
+//
+
+static uint char_val( const char **str, uint *strlength ) // get char value
+{
+ const char *p = *str;
+ uint pl = *strlength;
+ uint len = 1;
+ uint v = 0;
+ if ( (char)*p == '\\' ) { // escaped code
+ p++;
+ pl--;
+ if ( !pl ) { // it is just a '\'
+ (*str)++;
+ (*strlength)--;
+ return '\\';
+ }
+ len++; // length at least 2
+ int i;
+ char c;
+ char ch = tolower((char)*p);
+ switch ( ch ) {
+ case 'b': v = '\b'; break; // bell
+ case 'f': v = '\f'; break; // form feed
+ case 'n': v = '\n'; break; // newline
+ case 'r': v = '\r'; break; // return
+ case 't': v = '\t'; break; // tab
+ case 's': v = PWS; break; // whitespace charclass
+ case 'd': v = PDG; break; // digit charclass
+ case '<': v = BOW; break; // word beginning matcher
+ case '>': v = EOW; break; // word ending matcher
+
+ case 'x': { // hex code
+ p++;
+ pl--;
+ for ( i = 0; (i < 4) && pl; i++ ) { //up to 4 hex digits
+ c = tolower((char)*p);
+ bool a = ( c >= 'a' && c <= 'f' );
+ if ( (c >= '0' && c <= '9') || a ) {
+ v <<= 4;
+ v += a ? 10 + c - 'a' : c - '0';
+ len++;
+ }
+ else {
+ break;
+ }
+ p++;
+ pl--;
+ }
+ }
+ break;
+
+ default: {
+ if ( ch >= '0' && ch <= '7' ) { //octal code
+ len--;
+ for ( i = 0; (i < 3) && pl; i++ ) { // up to 3 oct digits
+ c = (char)*p;
+ if ( c >= '0' && c <= '7' ) {
+ v <<= 3;
+ v += c - '0';
+ len++;
+ }
+ else {
+ break;
+ }
+ p++;
+ pl--;
+ }
+ }
+ else { // not an octal number
+ v = (uint)*p; //(((uint)(p->row())) << 8) | ((uint)p->cell());
+ }
+ }
+ }
+ } else {
+ v = (uint)*p; //(((uint)(p->row())) << 8) | ((uint)p->cell());
+ }
+ *str += len;
+ *strlength -= len;
+ return v;
+}
+
+
+#if defined(DEBUG)
+static uint *dump( uint *p )
+{
+ while ( *p != END ) {
+ if ( *p & CHR ) {
+ uchar uc = (uchar)*p;
+ char c = (char)uc;
+ uint u = (uint)uc; //(((uint)(uc.row())) << 8) | ((uint)uc.cell());
+ qDebug( "\tCHR\tU%04x (%c)", u, (c ? c : ' '));
+ p++;
+ }
+ else if ( *p & MCC ) {
+ uint clcode = *p & MCD;
+ uint numFields = *p & MVL;
+ if ( clcode == CCL )
+ qDebug( "\tCCL\t%i", numFields );
+ else if ( clcode == CCN )
+ qDebug( "\tCCN\t%i", numFields );
+ else
+ qDebug("coding error!");
+ for ( int i = 0; i < (int)numFields; i++ ) {
+ p++;
+ if ( *p == PWS )
+ qDebug( "\t\tPWS" );
+ else if ( *p == PDG )
+ qDebug( "\t\tPDG" );
+ else {
+ uint from = ( *p & MCD ) >> 16;
+ uint to = *p & MVL;
+ char fc = (char)from;
+ char tc = (char)to;
+ qDebug( "\t\tU%04x (%c) - U%04x (%c)", from,
+ (fc ? fc : ' '), to, (tc ? tc : ' ') );
+ }
+ }
+ p++;
+ }
+ else switch ( *p++ ) {
+ case PWS:
+ qDebug( "\tPWS" );
+ break;
+ case PDG:
+ qDebug( "\tPDG" );
+ break;
+ case BOL:
+ qDebug( "\tBOL" );
+ break;
+ case EOL:
+ qDebug( "\tEOL" );
+ break;
+ case BOW:
+ qDebug( "\tBOW" );
+ break;
+ case EOW:
+ qDebug( "\tEOW" );
+ break;
+ case ANY:
+ qDebug( "\tANY" );
+ break;
+ case CLO:
+ qDebug( "\tCLO" );
+ p = dump( p );
+ break;
+ case OPT:
+ qDebug( "\tOPT" );
+ p = dump( p );
+ break;
+ }
+ }
+ qDebug( "\tEND" );
+ return p+1;
+}
+#endif // DEBUG
+
+
+static const int maxlen = 1024; // max length of regexp array
+static uint rxarray[ maxlen ]; // tmp regexp array
+
+/*!
+ \internal
+ Compiles the regular expression and stores the result in rxdata.
+ The 'error' flag is set to non-zero if an error is detected.
+ NOTE! This function is not reentrant!
+*/
+
+void QRegExp::compile()
+{
+ if ( rxdata ) { // delete old data
+ delete [] rxdata;
+ rxdata = 0;
+ }
+ if ( rxstring.isEmpty() ) { // no regexp pattern set
+ error = PatNull;
+ return;
+ }
+
+ error = PatOk; // assume pattern is ok
+
+ QCString pattern;
+ if ( wc )
+ pattern = wc2rx(rxstring);
+ else
+ pattern = rxstring;
+ const char *start = pattern.data(); // pattern pointer
+ const char *p = start; // pattern pointer
+ uint pl = pattern.length();
+ uint *d = rxarray; // data pointer
+ uint *prev_d = 0;
+
+#define GEN(x) *d++ = (x)
+
+ while ( pl ) {
+ char ch = (char)*p;
+ switch ( ch ) {
+
+ case '^': // beginning of line
+ prev_d = d;
+ GEN( p == start ? BOL : (CHR | ch) );
+ p++;
+ pl--;
+ break;
+
+ case '$': // end of line
+ prev_d = d;
+ GEN( pl == 1 ? EOL : (CHR | ch) );
+ p++;
+ pl--;
+ break;
+
+ case '.': // any char
+ prev_d = d;
+ GEN( ANY );
+ p++;
+ pl--;
+ break;
+
+ case '[': // character class
+ {
+ prev_d = d;
+ p++;
+ pl--;
+ if ( !pl ) {
+ error = PatSyntax;
+ return;
+ }
+ bool firstIsEscaped = ( (char)*p == '\\' );
+ uint cch = char_val( &p, &pl );
+ if ( cch == '^' && !firstIsEscaped ) { // negate!
+ GEN( CCN );
+ if ( !pl ) {
+ error = PatSyntax;
+ return;
+ }
+ cch = char_val( &p, &pl );
+ } else {
+ GEN( CCL );
+ }
+ uint numFields = 0;
+ while ( pl ) {
+ if ((pl>2) && ((char)*p == '-') && ((char)*(p+1) != ']')) {
+ // Found a range
+ char_val( &p, &pl ); // Read the '-'
+ uint cch2 = char_val( &p, &pl ); // Read the range end
+ if ( cch > cch2 ) { // swap start and stop
+ int tmp = cch;
+ cch = cch2;
+ cch2 = tmp;
+ }
+ GEN( (cch << 16) | cch2 ); // from < to
+ numFields++;
+ }
+ else {
+ // Found a single character
+ if ( cch & MCD ) // It's a code; will not be mistaken
+ GEN( cch ); // for a range, since from > to
+ else
+ GEN( (cch << 16) | cch ); // from == to range
+ numFields++;
+ }
+ if ( d >= rxarray + maxlen ) { // pattern too long
+ error = PatOverflow;
+ return;
+ }
+ if ( !pl ) { // At least ']' should be left
+ error = PatSyntax;
+ return;
+ }
+ bool nextIsEscaped = ( (char)*p == '\\' );
+ cch = char_val( &p, &pl );
+ if ( cch == (uint)']' && !nextIsEscaped )
+ break;
+ if ( !pl ) { // End, should have seen ']'
+ error = PatSyntax;
+ return;
+ }
+ }
+ *prev_d |= numFields; // Store number of fields
+ }
+ break;
+
+ case '*': // Kleene closure, or
+ case '+': // positive closure, or
+ case '?': // optional closure
+ {
+ if ( prev_d == 0 ) { // no previous expression
+ error = PatSyntax; // empty closure
+ return;
+ }
+ switch ( *prev_d ) { // test if invalid closure
+ case BOL:
+ case BOW:
+ case EOW:
+ case CLO:
+ case OPT:
+ error = PatSyntax;
+ return;
+ }
+ int ddiff = d - prev_d;
+ if ( *p == '+' ) { // convert to Kleene closure
+ if ( d + ddiff >= rxarray + maxlen ) {
+ error = PatOverflow; // pattern too long
+ return;
+ }
+ memcpy( d, prev_d, ddiff*sizeof(uint) );
+ d += ddiff;
+ prev_d += ddiff;
+ }
+ memmove( prev_d+1, prev_d, ddiff*sizeof(uint) );
+ *prev_d = ch == '?' ? OPT : CLO;
+ d++;
+ GEN( END );
+ p++;
+ pl--;
+ }
+ break;
+
+ default:
+ {
+ prev_d = d;
+ uint cv = char_val( &p, &pl );
+ if ( cv & MCD ) { // It's a code
+ GEN( cv );
+ }
+ else {
+ if ( !cs && cv <= 0xff ) // #only 8bit support
+ cv = tolower( cv );
+ GEN( CHR | cv );
+ }
+ }
+ }
+ if ( d >= rxarray + maxlen ) { // oops!
+ error = PatOverflow; // pattern too long
+ return;
+ }
+ }
+ GEN( END );
+ int len = d - rxarray;
+ rxdata = new uint[ len ]; // copy from rxarray to rxdata
+ CHECK_PTR( rxdata );
+ memcpy( rxdata, rxarray, len*sizeof(uint) );
+#if defined(DEBUG)
+ //dump( rxdata ); // uncomment this line for debugging
+#endif
+}
diff --git a/qtools/qregexp.h b/qtools/qregexp.h
new file mode 100644
index 0000000..4bb0230
--- /dev/null
+++ b/qtools/qregexp.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+**
+** Definition of QRegExp class
+**
+** Created : 950126
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QREGEXP_H
+#define QREGEXP_H
+
+#ifndef QT_H
+#include "qcstring.h"
+#endif // QT_H
+
+
+class Q_EXPORT QRegExp
+{
+public:
+ QRegExp();
+ QRegExp( const QCString &, bool caseSensitive=TRUE, bool wildcard=FALSE );
+ QRegExp( const QRegExp & );
+ ~QRegExp();
+ QRegExp &operator=( const QRegExp & );
+ QRegExp &operator=( const QCString &pattern );
+
+ bool operator==( const QRegExp & ) const;
+ bool operator!=( const QRegExp &r ) const
+ { return !(this->operator==(r)); }
+
+ bool isEmpty() const { return rxdata == 0; }
+ bool isValid() const { return error == 0; }
+
+ bool caseSensitive() const { return cs; }
+ void setCaseSensitive( bool );
+
+ bool wildcard() const { return wc; }
+ void setWildcard( bool );
+
+ QCString pattern() const { return rxstring; }
+ // ### in Qt 3.0, provide a real implementation
+ void setPattern( const QCString& pattern )
+ { operator=( pattern ); }
+
+ int match( const QCString &str, int index=0, int *len=0,
+ bool indexIsStart = TRUE ) const;
+ int find( const QCString& str, int index )
+ { return match( str, index ); }
+
+protected:
+ void compile();
+ const char *matchstr( uint *, const char *, uint, const char * ) const;
+
+private:
+ QCString rxstring; // regular expression pattern
+ uint *rxdata; // compiled regexp pattern
+ int error; // error status
+ bool cs; // case sensitive
+ bool wc; // wildcard
+};
+
+
+#endif // QREGEXP_H
diff --git a/qtools/qshared.h b/qtools/qshared.h
new file mode 100644
index 0000000..79fab7b
--- /dev/null
+++ b/qtools/qshared.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+**
+** Definition of QShared struct
+**
+** Created : 940112
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QSHARED_H
+#define QSHARED_H
+
+#ifndef QT_H
+#include "qglobal.h"
+#endif // QT_H
+
+
+struct QShared
+{
+ QShared() { count = 1; }
+ void ref() { count++; }
+ bool deref() { return !--count; }
+ uint count;
+};
+
+
+#endif // QSHARED_H
diff --git a/qtools/qsortedlist.doc b/qtools/qsortedlist.doc
new file mode 100644
index 0000000..6f16f19
--- /dev/null
+++ b/qtools/qsortedlist.doc
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+**
+** QSortedList documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+
+/*****************************************************************************
+ QSortedList documentation
+ *****************************************************************************/
+
+/*!
+ \class QSortedList qsortedlist.h
+ \brief The QSortedList class provides a list sorted by operator< and operator==
+
+ \ingroup collection
+ \ingroup tools
+
+ If you want to sort a QList you have to reimplement the
+ QGList::compareItems() method. If the elements of your list support
+ operator<() and operator==() then you can use QSortedList instead.
+ Its compareItems() calls operator<() and operator==() and returns an
+ appropriate result.
+
+ Otherwise, this is as QList.
+
+ \sa QList, \link collection.html Collection Classes\endlink
+*/
+
+
+/*!
+ \fn QSortedList::QSortedList()
+ Constructs an empty list.
+*/
+
+/*!
+ \fn QSortedList::QSortedList( const QSortedList<type> &list )
+ Constructs a copy of \e list.
+
+ Each item in \e list is copied to this new list.
+*/
+
+/*!
+ \fn QSortedList::~QSortedList()
+ Removes all items from the list and destroys the list.
+
+ All list iterators that access this list will be reset.
+*/
+
+/*!
+ \fn QSortedList<type>& QSortedList::operator=(const QSortedList<type>& list)
+ Assigns \e list to this list and returns a reference to this list.
+
+ This list is first cleared, then each item in \e list is
+ appended to this list. Only the pointers are copied
+ (shallow copy), unless newItem() has been reimplemented().
+*/
+
+/*!
+ \fn int QSortedList::compareItems( QCollection::Item s1, QCollection::Item s2 )
+
+ \reimp
+
+ This reimplementation uses operator< and operator== to compare.
+*/
diff --git a/qtools/qsortedlist.h b/qtools/qsortedlist.h
new file mode 100644
index 0000000..aeadd90
--- /dev/null
+++ b/qtools/qsortedlist.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+**
+** Definition of QList template/macro class
+**
+** Created : 920701
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QSORTEDLIST_H
+#define QSORTEDLIST_H
+
+#ifndef QT_H
+#include "qlist.h"
+#endif // QT_H
+
+
+template<class type> class Q_EXPORT QSortedList : public QList<type>
+{
+public:
+ QSortedList() {}
+ QSortedList( const QSortedList<type> &l ) : QList<type>(l) {}
+ ~QSortedList() { clear(); }
+ QSortedList<type> &operator=(const QSortedList<type> &l)
+ { return (QSortedList<type>&)QList<type>::operator=(l); }
+
+ virtual int compareItems( QCollection::Item s1, QCollection::Item s2 )
+ { if ( *((type*)s1) == *((type*)s2) ) return 0; return ( *((type*)s1) < *((type*)s2) ? -1 : 1 ); }
+};
+
+#endif
diff --git a/qtools/qstack.doc b/qtools/qstack.doc
new file mode 100644
index 0000000..ece1e2a
--- /dev/null
+++ b/qtools/qstack.doc
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+**
+** QStack class documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+
+/*****************************************************************************
+ QStack documentation
+ *****************************************************************************/
+
+/*!
+ \class QStack qstack.h
+ \brief The QStack class is a template class that provides a stack.
+
+ \ingroup collection
+ \ingroup tools
+
+ QStack is implemented as a template class. Define a template
+ instance QStack\<X\> to create a stack that operates on pointers to
+ X, or X*.
+
+ A stack is a Last In, First Out (LIFO) structure. Items are added to
+ the top of the stack with push() and retrieved from the top
+ with pop().
+
+ \sa \link collection.html Collection Classes\endlink
+*/
+
+/*! \fn QStack::QStack ()
+ Creates and empty stack.
+*/
+
+/*! \fn QStack::QStack (const QStack<type>& s)
+ Creates a stack by making a shallow copy of another stack.
+*/
+
+/*! \fn QStack::~QStack ()
+ Destroys the stack. All items will be deleted if autoDelete() is TRUE.
+*/
+
+/*! \fn QStack<type>& QStack::operator= (const QStack<type>& s)
+ Sets the contents of this stack by making a shallow copy of another stack.
+ Elements currently in this stack will be deleted if autoDelete() is TRUE.
+*/
+
+/*! \fn bool QStack::isEmpty () const
+ Returns TRUE is the stack contains no elements to be \link pop() popped\endlink.
+*/
+
+/*! \fn void QStack::push (const type* d)
+ Adds an element to the top of the stack. Last in, first out.
+*/
+
+/*! \fn type* QStack::pop ()
+ Removes the top item from the stack and returns it.
+*/
+
+/*! \fn bool QStack::remove ()
+ Removes the top item from the stack and deletes it if
+ autoDelete() is TRUE. Returns TRUE if there was an item to pop.
+
+ \sa clear()
+*/
+
+/*! \fn void QStack::clear()
+ Removes all items from the stack, deleting them if
+ autoDelete() is TRUE.
+
+ \sa remove()
+*/
+
+/*! \fn uint QStack::count() const
+ Returns the number of items in the stack.
+
+ \sa isEmpty()
+*/
+
+/*! \fn type* QStack::top () const
+ Returns a reference to the top item on the stack (most recently pushed).
+ The stack is not changed.
+*/
+
+/*! \fn QStack::operator type* ()const
+ Returns a reference to the top item on the stack (most recently pushed).
+ The stack is not changed.
+*/
+
+/*! \fn type* QStack::current () const
+ Returns a reference to the top item on the stack (most recently pushed).
+ The stack is not changed.
+*/
+
+/*! \fn bool QStack::autoDelete() const
+
+ The same as QCollection::autoDelete().
+
+ \sa setAutoDelete()
+*/
+
+/*! \fn void QStack::setAutoDelete( bool enable )
+
+ The same as QCollection::setAutoDelete().
+
+ \sa autoDelete()
+*/
diff --git a/qtools/qstack.h b/qtools/qstack.h
new file mode 100644
index 0000000..c84d8d2
--- /dev/null
+++ b/qtools/qstack.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+**
+** Definition of QStack template/macro class
+**
+** Created : 920917
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QSTACK_H
+#define QSTACK_H
+
+#ifndef QT_H
+#include "qglist.h"
+#endif // QT_H
+
+
+template<class type> class QStack : private QGList
+{
+public:
+ QStack() {}
+ QStack( const QStack<type> &s ) : QGList(s) {}
+ ~QStack() { clear(); }
+ QStack<type> &operator=(const QStack<type> &s)
+ { return (QStack<type>&)QGList::operator=(s); }
+ bool autoDelete() const { return QCollection::autoDelete(); }
+ void setAutoDelete( bool del ) { QCollection::setAutoDelete(del); }
+ uint count() const { return QGList::count(); }
+ bool isEmpty() const { return QGList::count() == 0; }
+ void push( const type *d ) { QGList::insertAt(0,Item(d)); }
+ type *pop() { return (type *)QGList::takeFirst(); }
+ bool remove() { return QGList::removeFirst(); }
+ void clear() { QGList::clear(); }
+ type *bottom() const { return (type *)QGList::clast(); }
+ type *top() const { return (type *)QGList::cfirst(); }
+ operator type *() const { return (type *)QGList::cfirst(); }
+ type *current() const { return (type *)QGList::cfirst(); }
+private:
+ void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
+};
+
+
+#endif // QSTACK_H
diff --git a/qtools/qstring.cpp b/qtools/qstring.cpp
new file mode 100644
index 0000000..bc3dfc7
--- /dev/null
+++ b/qtools/qstring.cpp
@@ -0,0 +1,15318 @@
+/****************************************************************************
+**
+**
+** Implementation of the QString class and related Unicode functions
+**
+** Created : 920722
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+// Don't define it while compiling this module, or USERS of Qt will
+// not be able to link.
+#ifdef QT_NO_CAST_ASCII
+#undef QT_NO_CAST_ASCII
+#endif
+
+#include "qstring.h"
+#include "qregexp.h"
+#include "qdatastream.h"
+#include "qtextcodec.h"
+#include "qstack.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <limits.h>
+
+
+/* -------------------------------------------------------------------------
+ * unicode information
+ * these tables are generated from the unicode reference file
+ * ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html
+ *
+ * Lars Knoll <knoll@mpi-hd.mpg.de>
+ * -------------------------------------------------------------------------
+ */
+
+/* Perl script to generate (run perl -x tools/qstring.cpp)
+
+#!perl
+
+sub numberize
+{
+ my(%r, $n, $id);
+ for $id ( @_ ) {
+ $id="" if $id eq "EMPTY";
+ $r{$id}=$n++;
+ }
+ return %r;
+}
+
+
+# Code to integer mappings...
+#
+%category_code = numberize(qw{
+ EMPTY
+ Mn Mc Me
+ Nd Nl No
+ Zs Zl Zp
+ Cc Cf Cs Co Cn
+
+ Lu Ll Lt Lm Lo
+ Pc Pd Ps Pe Pi Pf Po
+ Sm Sc Sk So
+});
+%bidi_category_code = numberize(qw{
+ L R EN ES ET AN CS B S WS ON LRE LRO AL RLE RLO PDF NSM BN});
+%character_decomposition_tag = numberize(qw{
+ <single> <canonical> <font> <noBreak> <initial> <medial>
+ <final> <isolated> <circle> <super> <sub> <vertical>
+ <wide> <narrow> <small> <square> <compat> <fraction>
+});
+%mirrored_code = numberize(qw{N Y});
+
+%joining_code = numberize(qw{U D R C});
+
+# Read data into hashes...
+#
+open IN, "UnicodeData.txt";
+$position = 1;
+while (<IN>) {
+ @fields = split /;/;
+ $code = shift @fields;
+ for $n (qw{
+ name category combining_class bidi_category
+ character_decomposition decimal_digit_value digit_value
+ numeric_value mirrored oldname comment
+ uppercase lowercase titlecase})
+ {
+ $id = shift @fields;
+ $codes = "${n}_code";
+ if ( defined %$codes && defined $$codes{$id} ) {
+ $id = $$codes{$id};
+ }
+ ${$n}{$code}=$id;
+ }
+ $decomp = $character_decomposition{$code};
+ if ( length $decomp == 0 ) {
+ $decomp = "<single>";
+ }
+ if (substr($decomp, 0, 1) ne '<') {
+ $decomp = "<canonical> " . $decomp;
+ }
+ @fields = split(" ", $decomp);
+ $tag = shift @fields;
+ $tag = $character_decomposition_tag{$tag};
+ $decomp = join( ", 0x", @fields );
+ $decomp = "0x".$decomp;
+ $decomposition{$code} = $decomp;
+ $decomposition_tag{$code} = $tag;
+ $decomposition_pos{$code} = $position;
+ $len = scalar(@fields);
+ $decomposition_len{$code} = $len;
+
+# we use canonical decompositions longer than 1 char
+# and all arabic ligatures for the ligature table
+ if(($len > 1 and $tag == 1) or ($tag > 3 and $tag < 8)) {
+# ligature to add...
+ $start = shift @fields;
+ $ligature{$start} = $ligature{$start}." ".$code;
+ }
+
+# adjust position
+ if($len != 0) {
+ $position += $len + 3;
+ }
+
+
+}
+
+open IN2, "ArabicShaping.txt";
+$position = 1;
+while (<IN2>) {
+ @fields = split /;/;
+ $code = shift @fields;
+ $dummy = shift @fields;
+ $join = shift @fields;
+ $join =~ s/ //g;
+ $join = $joining_code{$join};
+ $joining{$code}=$join;
+}
+
+# Build pages...
+#
+$rowtable_txt =
+ "static const Q_UINT8 * const unicode_info[256] = {";
+for $row ( 0..255 ) {
+ $nonzero=0;
+ $txt = "";
+ for $cell ( 0..255 ) {
+ $code = sprintf("%02X%02X",$row,$cell);
+ $info = $category{$code};
+ $info = 0 if !defined $info;
+ $txt .= "\n " if $cell%8 == 0;
+ $txt .= "$info, ";
+ }
+ $therow = $row{$txt};
+ if ( !defined $therow ) {
+ $size+=256;
+ $therow = "ui_".sprintf("%02X",$row);
+ $rowtext{$therow} =
+ "static const Q_UINT8 ${therow}[] = {$txt\n};\n\n";
+ $row{$txt}=$therow;
+ }
+ $rowtable_txt .= "\n " if $row%8 == 0;
+ $rowtable_txt .= "$therow, ";
+}
+
+print "// START OF GENERATED DATA\n\n";
+print "#ifndef QT_NO_UNICODETABLES\n\n";
+
+# Print pages...
+#
+for $r ( sort keys %rowtext ) {
+ print $rowtext{$r};
+}
+print "$rowtable_txt\n};\n";
+$size += 256*4;
+print "// $size bytes\n\n";
+
+# Build decomposition tables
+#
+$rowtable_txt =
+ "static const Q_UINT16 * const decomposition_info[256] = {";
+$table_txt =
+ "static const Q_UINT16 decomposition_map[] = {\n 0,\n";
+for $row ( 0..255 ) {
+ $nonzero=0;
+ $txt = "";
+ for $cell ( 0..255 ) {
+ $code = sprintf("%02X%02X",$row,$cell);
+ $txt .= "\n " if $cell%8 == 0;
+ if( $decomposition_tag{$code} != 0 ) {
+ $txt .= " $decomposition_pos{$code},";
+ $table_txt .= " $decomposition_tag{$code},";
+ $table_txt .= " 0x$code,";
+ $table_txt .= " $decomposition{$code}, 0,\n";
+ $size += 2 * $decomposition_len{$code} + 6;
+ } else {
+ $txt .= " 0,";
+ }
+ }
+ $therow = $row{$txt};
+ if ( !defined $therow ) {
+ $size+=512;
+ $therow = "di_".sprintf("%02X",$row);
+ $dec_rowtext{$therow} =
+ "static const Q_UINT16 ${therow}[] = {$txt\n};\n\n";
+ $row{$txt}=$therow;
+ }
+ $rowtable_txt .= "\n " if $row%8 == 0;
+ $rowtable_txt .= "$therow, ";
+}
+
+# Print decomposition tables
+#
+print "$table_txt\n};\n\n";
+for $r ( sort keys %dec_rowtext ) {
+ print $dec_rowtext{$r};
+}
+print "$rowtable_txt\n};\n";
+$size += 256*4;
+print "// $size bytes\n\n";
+
+
+# build ligature tables
+#
+$size = 0;
+$position = 1;
+$rowtable_txt =
+ "static const Q_UINT16 * const ligature_info[256] = {";
+$table_txt =
+ "static const Q_UINT16 ligature_map[] = {\n 0,\n";
+for $lig_row ( 0..255 ) {
+ $nonzero=0;
+ $txt = "";
+ for $cell ( 0..255 ) {
+ $code = sprintf("%02X%02X",$lig_row,$cell);
+ $txt .= "\n " if $cell%8 == 0;
+ if( defined $ligature{$code} ) {
+ $txt .= " $position,";
+ @ligature = split(" ", $ligature{$code});
+# we need to sort ligatures according to their length.
+# long ones have to come first!
+ @ligature_sort = sort { $decomposition_len{$b} <=> $decomposition_len{$a} } @ligature;
+# now replace each code by it's position in
+# the decomposition map.
+ undef(@lig_pos);
+ for $n (@ligature_sort) {
+ push(@lig_pos, $decomposition_pos{$n});
+ }
+# debug info
+ if( 0 ) {
+ print "ligatures: $ligature{$code}\n";
+ $sort = join(" ", @ligature_sort);
+ print "sorted : $sort\n";
+ }
+ $lig = join(", ", @lig_pos);
+ $table_txt .= " $lig, 0,\n";
+ $size += 2 * scalar(@ligature) + 2;
+ $position += scalar(@ligature) + 1;
+ } else {
+ $txt .= " 0,";
+ }
+ }
+ $therow = $lig_row{$txt};
+ if ( !defined $therow ) {
+ $size+=512;
+ $therow = "li_".sprintf("%02X",$lig_row);
+ $lig_rowtext{$therow} =
+ "static const Q_UINT16 ${therow}[] = {$txt\n};\n\n";
+ $lig_row{$txt}=$therow;
+ }
+ $rowtable_txt .= "\n " if $lig_row%8 == 0;
+ $rowtable_txt .= "$therow, ";
+}
+
+# Print ligature tables
+#
+print "$table_txt\n};\n\n";
+for $r ( sort keys %lig_rowtext ) {
+ print $lig_rowtext{$r};
+}
+print "$rowtable_txt\n};\n";
+$size += 256*4;
+print "// $size bytes\n\n";
+
+
+
+# Build direction/joining/mirrored pages...
+#
+$rowtable_txt =
+ "static const Q_UINT8 * const direction_info[256] = {";
+for $dir_row ( 0..255 ) {
+ $nonzero=0;
+ $txt = "";
+ for $cell ( 0..255 ) {
+ $code = sprintf("%02X%02X",$dir_row,$cell);
+ $dir = $bidi_category{$code};
+ $dir = 0 if !defined $dir;
+ $join = $joining{$code};
+ $join = 0 if !defined $join;
+ $mirr = $mirrored{$code};
+ $mirr = 0 if !defined $mirr;
+ $info = $dir + 32*$join + 128*$mirr;
+ $txt .= "\n " if $cell%8 == 0;
+ $txt .= "$info, ";
+ }
+ $therow = $dir_row{$txt};
+ if ( !defined $therow ) {
+ $size+=256;
+ $therow = "dir_".sprintf("%02X",$dir_row);
+ $dir_rowtext{$therow} =
+ "static const Q_UINT8 ${therow}[] = {$txt\n};\n\n";
+ $dir_row{$txt}=$therow;
+ }
+ $rowtable_txt .= "\n " if $dir_row%8 == 0;
+ $rowtable_txt .= "$therow, ";
+}
+
+# Print pages...
+#
+for $r ( sort keys %dir_rowtext ) {
+ print $dir_rowtext{$r};
+}
+print "$rowtable_txt\n};\n";
+$size += 256*4;
+print "// $size bytes\n\n";
+
+
+
+print "#endif\n\n";
+print "// END OF GENERATED DATA\n\n";
+
+
+__END__
+
+*/
+
+
+// START OF GENERATED DATA
+
+static const Q_UINT8 ui_00[] = {
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 7, 26, 26, 26, 28, 26, 26, 26,
+ 22, 23, 26, 27, 26, 21, 26, 26,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 26, 26, 27, 27, 27, 26,
+ 26, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 22, 26, 23, 29, 20,
+ 29, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 22, 27, 23, 27, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 7, 26, 28, 28, 28, 28, 30, 30,
+ 29, 30, 16, 24, 27, 21, 30, 29,
+ 30, 27, 6, 6, 29, 16, 30, 26,
+ 29, 6, 16, 25, 6, 6, 6, 26,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 27,
+ 15, 15, 15, 15, 15, 15, 15, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 27,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+};
+
+#ifndef QT_NO_UNICODETABLES
+
+static const Q_UINT8 ui_01[] = {
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 16, 15, 16, 15, 16, 15, 16, 15,
+ 16, 15, 16, 15, 16, 15, 16, 15,
+ 16, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 15, 16, 15, 16, 15, 16, 16,
+ 16, 15, 15, 16, 15, 16, 15, 15,
+ 16, 15, 15, 15, 16, 16, 15, 15,
+ 15, 15, 16, 15, 15, 16, 15, 15,
+ 15, 16, 16, 16, 15, 15, 16, 15,
+ 15, 16, 15, 16, 15, 16, 15, 15,
+ 16, 15, 16, 16, 15, 16, 15, 15,
+ 16, 15, 15, 15, 16, 15, 16, 15,
+ 15, 16, 16, 19, 15, 16, 16, 16,
+ 19, 19, 19, 19, 15, 17, 16, 15,
+ 17, 16, 15, 17, 16, 15, 16, 15,
+ 16, 15, 16, 15, 16, 15, 16, 15,
+ 16, 15, 16, 15, 16, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 16, 15, 17, 16, 15, 16, 15, 15,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+};
+
+static const Q_UINT8 ui_02[] = {
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 0, 0, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 0, 0, 0, 0,
+ 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, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 0, 0,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 29, 29, 18, 18, 18, 18, 18,
+ 18, 18, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 18, 18, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 18, 18, 18, 18, 18, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 18, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_03[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 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, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 29, 29, 0, 0,
+ 0, 0, 18, 0, 0, 0, 26, 0,
+ 0, 0, 0, 0, 29, 29, 15, 26,
+ 15, 15, 15, 0, 15, 0, 15, 15,
+ 16, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 0, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 0,
+ 16, 16, 15, 15, 15, 16, 16, 16,
+ 0, 0, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 16, 16, 16, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_04[] = {
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 30, 1, 1, 1, 1, 0,
+ 3, 3, 0, 0, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 15, 16, 15, 16, 0, 0, 15,
+ 16, 0, 0, 15, 16, 0, 0, 0,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 0, 0,
+ 15, 16, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_05[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 0,
+ 0, 18, 26, 26, 26, 26, 26, 26,
+ 0, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 26, 21, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0, 1, 1, 1, 26, 1,
+ 26, 1, 1, 26, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 0, 0, 0, 0, 0,
+ 19, 19, 19, 26, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_06[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 26, 0, 0, 0, 26,
+ 0, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 0, 0, 0, 0, 0,
+ 18, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 26, 26, 26, 26, 0, 0,
+ 1, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 26, 19, 1, 1,
+ 1, 1, 1, 1, 1, 3, 3, 1,
+ 1, 1, 1, 1, 1, 18, 18, 1,
+ 1, 30, 1, 1, 1, 1, 0, 0,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 19, 19, 19, 30, 30, 0,
+};
+
+static const Q_UINT8 ui_07[] = {
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 0, 11,
+ 19, 1, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 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, 1, 1,
+ 1, 1, 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,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 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,
+};
+
+static const Q_UINT8 ui_08[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_09[] = {
+ 0, 1, 1, 2, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 0, 0, 1, 19, 2, 2,
+ 2, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 2, 2, 2, 1, 0, 0,
+ 19, 1, 1, 1, 1, 0, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 1, 1, 26, 26, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 2, 2, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 0, 19,
+ 19, 0, 0, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 0, 0, 0, 19, 19,
+ 19, 19, 0, 0, 1, 0, 2, 2,
+ 2, 1, 1, 1, 1, 0, 0, 2,
+ 2, 0, 0, 2, 2, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 0, 19, 19, 0, 19,
+ 19, 19, 1, 1, 0, 0, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 19, 19, 28, 28, 6, 6, 6, 6,
+ 6, 6, 30, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_0A[] = {
+ 0, 0, 1, 0, 0, 19, 19, 19,
+ 19, 19, 19, 0, 0, 0, 0, 19,
+ 19, 0, 0, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 0, 19, 19, 0,
+ 19, 19, 0, 0, 1, 0, 2, 2,
+ 2, 1, 1, 0, 0, 0, 0, 1,
+ 1, 0, 0, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 19, 19, 19, 19, 0, 19, 0,
+ 0, 0, 0, 0, 0, 0, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 1, 1, 19, 19, 19, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 2, 0, 19, 19, 19,
+ 19, 19, 19, 19, 0, 19, 0, 19,
+ 19, 19, 0, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 0, 19, 19, 19,
+ 19, 19, 0, 0, 1, 19, 2, 2,
+ 2, 1, 1, 1, 1, 1, 0, 1,
+ 1, 2, 0, 2, 2, 1, 0, 0,
+ 19, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 0, 0, 0, 0, 0, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_0B[] = {
+ 0, 1, 2, 2, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 0, 19,
+ 19, 0, 0, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 0, 0, 19, 19,
+ 19, 19, 0, 0, 1, 19, 2, 1,
+ 2, 1, 1, 1, 0, 0, 0, 2,
+ 2, 0, 0, 2, 2, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 2,
+ 0, 0, 0, 0, 19, 19, 0, 19,
+ 19, 19, 0, 0, 0, 0, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 30, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 2, 0, 19, 19, 19,
+ 19, 19, 19, 0, 0, 0, 19, 19,
+ 19, 0, 19, 19, 19, 19, 0, 0,
+ 0, 19, 19, 0, 19, 0, 19, 19,
+ 0, 0, 0, 19, 19, 0, 0, 0,
+ 19, 19, 19, 0, 0, 0, 19, 19,
+ 19, 19, 19, 19, 19, 19, 0, 19,
+ 19, 19, 0, 0, 0, 0, 2, 2,
+ 1, 2, 2, 0, 0, 0, 2, 2,
+ 2, 0, 2, 2, 2, 1, 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, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 6, 6, 6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_0C[] = {
+ 0, 2, 2, 2, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 0, 19, 19, 19,
+ 19, 19, 0, 0, 0, 0, 1, 1,
+ 1, 2, 2, 2, 2, 0, 1, 1,
+ 1, 0, 1, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 19, 0, 0, 0, 0, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 2, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 0, 19, 19, 19,
+ 19, 19, 0, 0, 0, 0, 2, 1,
+ 2, 2, 2, 2, 2, 0, 1, 2,
+ 2, 0, 2, 2, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 2, 2, 0,
+ 0, 0, 0, 0, 0, 0, 19, 0,
+ 19, 19, 0, 0, 0, 0, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_0D[] = {
+ 0, 0, 2, 2, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 0, 0, 0, 0, 2, 2,
+ 2, 1, 1, 1, 0, 0, 2, 2,
+ 2, 0, 2, 2, 2, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 19, 0, 0, 0, 0, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 2, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 0, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 0, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 0, 19, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 0, 0, 1, 0, 0, 0, 0, 2,
+ 2, 2, 1, 1, 1, 0, 1, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 2, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_0E[] = {
+ 0, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 1, 19, 19, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 28,
+ 19, 19, 19, 19, 19, 19, 18, 1,
+ 1, 1, 1, 1, 1, 1, 1, 26,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 26, 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, 19, 19, 0, 19, 0, 0, 19,
+ 19, 0, 19, 0, 0, 19, 0, 0,
+ 0, 0, 0, 0, 19, 19, 19, 19,
+ 0, 19, 19, 19, 19, 19, 19, 19,
+ 0, 19, 19, 19, 0, 19, 0, 19,
+ 0, 0, 19, 19, 0, 19, 19, 19,
+ 19, 1, 19, 19, 1, 1, 1, 1,
+ 1, 1, 0, 1, 1, 19, 0, 0,
+ 19, 19, 19, 19, 19, 0, 18, 0,
+ 1, 1, 1, 1, 1, 1, 0, 0,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 0, 0, 19, 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,
+};
+
+static const Q_UINT8 ui_0F[] = {
+ 19, 30, 30, 30, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 30, 30, 30, 30, 30,
+ 1, 1, 30, 30, 30, 30, 30, 30,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 30, 1, 30, 1,
+ 30, 1, 22, 23, 22, 23, 2, 2,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 0, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2,
+ 1, 1, 1, 1, 1, 26, 1, 1,
+ 19, 19, 19, 19, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 30, 30,
+ 30, 30, 30, 30, 30, 30, 1, 30,
+ 30, 30, 30, 30, 30, 0, 0, 30,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_10[] = {
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 0, 19, 19, 19, 19, 19,
+ 0, 19, 19, 0, 2, 1, 1, 1,
+ 1, 2, 1, 0, 0, 0, 1, 1,
+ 2, 1, 0, 0, 0, 0, 0, 0,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 26, 26, 26, 26, 26, 26,
+ 19, 19, 19, 19, 19, 19, 2, 2,
+ 1, 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,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 0, 0, 0, 26, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_11[] = {
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 0, 0, 0, 0, 0, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 0, 0, 0, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_12[] = {
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 0, 19, 19, 19, 19, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 0, 19, 19, 19, 19, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 0, 19, 19, 19, 19, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 0, 19, 19, 19, 19, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 0, 19, 19, 19, 19, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+};
+
+static const Q_UINT8 ui_13[] = {
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 0, 19, 19, 19, 19, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 0, 0, 0, 0, 0,
+ 0, 26, 26, 26, 26, 26, 26, 26,
+ 26, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_14[] = {
+ 0, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+};
+
+static const Q_UINT8 ui_15[] = {
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+};
+
+static const Q_UINT8 ui_16[] = {
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 26, 26, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 7, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 22, 23, 0, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 26, 26, 26, 6, 6,
+ 6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_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,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 2, 2, 2, 1,
+ 1, 1, 1, 1, 1, 1, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2,
+ 2, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 26, 26, 26, 26,
+ 26, 26, 26, 28, 26, 0, 0, 0,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_18[] = {
+ 26, 26, 26, 26, 26, 26, 21, 26,
+ 26, 26, 26, 11, 11, 11, 11, 0,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 0, 0, 0, 0, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 18, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 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,
+};
+
+static const Q_UINT8 ui_1E[] = {
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 16, 16,
+ 16, 16, 16, 16, 0, 0, 0, 0,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 15, 16, 15, 16, 15, 16,
+ 15, 16, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_1F[] = {
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 16, 16, 16, 16, 16, 16, 0, 0,
+ 15, 15, 15, 15, 15, 15, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 16, 16, 16, 16, 16, 16, 0, 0,
+ 15, 15, 15, 15, 15, 15, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 15, 0, 15, 0, 15, 0, 15,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 16, 16, 16, 16, 16, 0, 16, 16,
+ 15, 15, 15, 15, 17, 29, 16, 29,
+ 29, 29, 16, 16, 16, 0, 16, 16,
+ 15, 15, 15, 15, 17, 29, 29, 29,
+ 16, 16, 16, 16, 0, 0, 16, 16,
+ 15, 15, 15, 15, 0, 29, 29, 29,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 15, 15, 15, 15, 15, 29, 29, 29,
+ 0, 0, 16, 16, 16, 0, 16, 16,
+ 15, 15, 15, 15, 17, 29, 29, 0,
+};
+
+static const Q_UINT8 ui_20[] = {
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 11, 11, 11, 11,
+ 21, 21, 21, 21, 21, 21, 26, 26,
+ 24, 25, 22, 24, 24, 25, 22, 24,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 8, 9, 11, 11, 11, 11, 11, 7,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 24, 25, 26, 26, 26, 26, 20,
+ 20, 26, 26, 26, 27, 22, 23, 0,
+ 26, 26, 26, 26, 26, 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, 11, 11, 11, 11, 11, 11,
+ 6, 0, 0, 0, 6, 6, 6, 6,
+ 6, 6, 27, 27, 27, 22, 23, 16,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 27, 27, 27, 22, 23, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 3, 3, 3,
+ 3, 1, 3, 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,
+};
+
+static const Q_UINT8 ui_21[] = {
+ 30, 30, 15, 30, 30, 30, 30, 15,
+ 30, 30, 16, 15, 15, 15, 16, 16,
+ 15, 15, 15, 16, 30, 15, 30, 30,
+ 30, 15, 15, 15, 15, 15, 30, 30,
+ 30, 30, 30, 30, 15, 30, 15, 30,
+ 15, 30, 15, 15, 15, 15, 30, 16,
+ 15, 15, 30, 15, 16, 19, 19, 19,
+ 19, 16, 30, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 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, 5, 5, 5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 27, 27, 27, 27, 27, 30, 30, 30,
+ 30, 30, 27, 27, 30, 30, 30, 30,
+ 27, 30, 30, 27, 30, 30, 27, 30,
+ 30, 30, 30, 30, 30, 30, 27, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 27, 27,
+ 30, 30, 27, 30, 27, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_22[] = {
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_23[] = {
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 27, 27, 27, 27, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 27, 27, 30, 30, 30, 30, 30, 30,
+ 30, 22, 23, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_24[] = {
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_25[] = {
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 27,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 27, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_26[] = {
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 0, 0, 0,
+ 0, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 27,
+ 30, 30, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_27[] = {
+ 0, 30, 30, 30, 30, 0, 30, 30,
+ 30, 30, 0, 0, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 0, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 30, 0, 30,
+ 30, 30, 30, 0, 0, 0, 30, 0,
+ 30, 30, 30, 30, 30, 30, 30, 0,
+ 0, 30, 30, 30, 30, 30, 30, 30,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 30, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 0, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_28[] = {
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+};
+
+static const Q_UINT8 ui_2E[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 0, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_2F[] = {
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_30[] = {
+ 7, 26, 26, 26, 30, 18, 19, 5,
+ 22, 23, 22, 23, 22, 23, 22, 23,
+ 22, 23, 30, 30, 22, 23, 22, 23,
+ 22, 23, 22, 23, 21, 22, 23, 23,
+ 30, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 1, 1, 1, 1, 1, 1,
+ 21, 18, 18, 18, 18, 18, 30, 30,
+ 5, 5, 5, 0, 0, 0, 30, 30,
+ 0, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 0, 0,
+ 0, 1, 1, 29, 29, 18, 18, 0,
+ 0, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 20, 18, 18, 18, 0,
+};
+
+static const Q_UINT8 ui_31[] = {
+ 0, 0, 0, 0, 0, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 0, 0,
+ 0, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 30, 30, 6, 6, 6, 6, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 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,
+};
+
+static const Q_UINT8 ui_32[] = {
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 0, 0, 0,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 0, 0, 30,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 0,
+};
+
+static const Q_UINT8 ui_33[] = {
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 0,
+ 0, 0, 0, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 0,
+};
+
+static const Q_UINT8 ui_34[] = {
+ 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_4D[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_9F[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_A4[] = {
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 0, 0,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 0, 0, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 0, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 0, 30, 30, 30, 0, 30, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_D7[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_D8[] = {
+ 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_DB[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 12,
+ 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 12,
+};
+
+static const Q_UINT8 ui_DF[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 12,
+};
+
+static const Q_UINT8 ui_E0[] = {
+ 13, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_F8[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 13,
+};
+
+static const Q_UINT8 ui_FA[] = {
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_FB[] = {
+ 16, 16, 16, 16, 16, 16, 16, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 16, 16, 16, 16, 16,
+ 0, 0, 0, 0, 0, 19, 1, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 27, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 19, 19, 19, 19, 19, 0, 19, 0,
+ 19, 19, 0, 19, 19, 0, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 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, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+};
+
+static const Q_UINT8 ui_FD[] = {
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 22, 23,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 0, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 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,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 ui_FE[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 26, 21, 21, 20, 20, 22, 23, 22,
+ 23, 22, 23, 22, 23, 22, 23, 22,
+ 23, 22, 23, 22, 23, 0, 0, 0,
+ 0, 26, 26, 26, 26, 20, 20, 20,
+ 26, 26, 26, 0, 26, 26, 26, 26,
+ 21, 22, 23, 22, 23, 22, 23, 26,
+ 26, 26, 27, 21, 27, 27, 27, 0,
+ 26, 28, 26, 26, 0, 0, 0, 0,
+ 19, 19, 19, 0, 19, 0, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 0, 0, 11,
+};
+
+static const Q_UINT8 ui_FF[] = {
+ 0, 26, 26, 26, 28, 26, 26, 26,
+ 22, 23, 26, 27, 26, 21, 26, 26,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 26, 26, 27, 27, 27, 26,
+ 26, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 22, 26, 23, 29, 20,
+ 29, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 22, 27, 23, 27, 0,
+ 0, 26, 22, 23, 26, 20, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 18, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 18, 18,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 0,
+ 0, 0, 19, 19, 19, 19, 19, 19,
+ 0, 0, 19, 19, 19, 19, 19, 19,
+ 0, 0, 19, 19, 19, 19, 19, 19,
+ 0, 0, 19, 19, 19, 0, 0, 0,
+ 28, 28, 27, 29, 30, 28, 28, 0,
+ 30, 27, 27, 27, 27, 30, 30, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 11, 11, 11, 30, 30, 0, 0,
+};
+
+static const Q_UINT8 * const unicode_info[256] = {
+ ui_00, ui_01, ui_02, ui_03, ui_04, ui_05, ui_06, ui_07,
+ ui_08, ui_09, ui_0A, ui_0B, ui_0C, ui_0D, ui_0E, ui_0F,
+ ui_10, ui_11, ui_12, ui_13, ui_14, ui_15, ui_16, ui_17,
+ ui_18, ui_08, ui_08, ui_08, ui_08, ui_08, ui_1E, ui_1F,
+ ui_20, ui_21, ui_22, ui_23, ui_24, ui_25, ui_26, ui_27,
+ ui_28, ui_08, ui_08, ui_08, ui_08, ui_08, ui_2E, ui_2F,
+ ui_30, ui_31, ui_32, ui_33, ui_34, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_4D, ui_34, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_9F,
+ ui_15, ui_15, ui_15, ui_15, ui_A4, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_34, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_D7,
+ ui_D8, ui_08, ui_08, ui_DB, ui_D8, ui_08, ui_08, ui_DF,
+ ui_E0, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
+ ui_F8, ui_15, ui_FA, ui_FB, ui_15, ui_FD, ui_FE, ui_FF,
+};
+// 15616 bytes
+
+static const Q_UINT16 decomposition_map [] = {
+ 0,
+ 3, 0x00A0, 0x0020, 0,
+ 16, 0x00A8, 0x0020, 0x0308, 0,
+ 9, 0x00AA, 0x0061, 0,
+ 16, 0x00AF, 0x0020, 0x0304, 0,
+ 9, 0x00B2, 0x0032, 0,
+ 9, 0x00B3, 0x0033, 0,
+ 16, 0x00B4, 0x0020, 0x0301, 0,
+ 16, 0x00B5, 0x03BC, 0,
+ 16, 0x00B8, 0x0020, 0x0327, 0,
+ 9, 0x00B9, 0x0031, 0,
+ 9, 0x00BA, 0x006F, 0,
+ 17, 0x00BC, 0x0031, 0x2044, 0x0034, 0,
+ 17, 0x00BD, 0x0031, 0x2044, 0x0032, 0,
+ 17, 0x00BE, 0x0033, 0x2044, 0x0034, 0,
+ 1, 0x00C0, 0x0041, 0x0300, 0,
+ 1, 0x00C1, 0x0041, 0x0301, 0,
+ 1, 0x00C2, 0x0041, 0x0302, 0,
+ 1, 0x00C3, 0x0041, 0x0303, 0,
+ 1, 0x00C4, 0x0041, 0x0308, 0,
+ 1, 0x00C5, 0x0041, 0x030A, 0,
+ 1, 0x00C7, 0x0043, 0x0327, 0,
+ 1, 0x00C8, 0x0045, 0x0300, 0,
+ 1, 0x00C9, 0x0045, 0x0301, 0,
+ 1, 0x00CA, 0x0045, 0x0302, 0,
+ 1, 0x00CB, 0x0045, 0x0308, 0,
+ 1, 0x00CC, 0x0049, 0x0300, 0,
+ 1, 0x00CD, 0x0049, 0x0301, 0,
+ 1, 0x00CE, 0x0049, 0x0302, 0,
+ 1, 0x00CF, 0x0049, 0x0308, 0,
+ 1, 0x00D1, 0x004E, 0x0303, 0,
+ 1, 0x00D2, 0x004F, 0x0300, 0,
+ 1, 0x00D3, 0x004F, 0x0301, 0,
+ 1, 0x00D4, 0x004F, 0x0302, 0,
+ 1, 0x00D5, 0x004F, 0x0303, 0,
+ 1, 0x00D6, 0x004F, 0x0308, 0,
+ 1, 0x00D9, 0x0055, 0x0300, 0,
+ 1, 0x00DA, 0x0055, 0x0301, 0,
+ 1, 0x00DB, 0x0055, 0x0302, 0,
+ 1, 0x00DC, 0x0055, 0x0308, 0,
+ 1, 0x00DD, 0x0059, 0x0301, 0,
+ 1, 0x00E0, 0x0061, 0x0300, 0,
+ 1, 0x00E1, 0x0061, 0x0301, 0,
+ 1, 0x00E2, 0x0061, 0x0302, 0,
+ 1, 0x00E3, 0x0061, 0x0303, 0,
+ 1, 0x00E4, 0x0061, 0x0308, 0,
+ 1, 0x00E5, 0x0061, 0x030A, 0,
+ 1, 0x00E7, 0x0063, 0x0327, 0,
+ 1, 0x00E8, 0x0065, 0x0300, 0,
+ 1, 0x00E9, 0x0065, 0x0301, 0,
+ 1, 0x00EA, 0x0065, 0x0302, 0,
+ 1, 0x00EB, 0x0065, 0x0308, 0,
+ 1, 0x00EC, 0x0069, 0x0300, 0,
+ 1, 0x00ED, 0x0069, 0x0301, 0,
+ 1, 0x00EE, 0x0069, 0x0302, 0,
+ 1, 0x00EF, 0x0069, 0x0308, 0,
+ 1, 0x00F1, 0x006E, 0x0303, 0,
+ 1, 0x00F2, 0x006F, 0x0300, 0,
+ 1, 0x00F3, 0x006F, 0x0301, 0,
+ 1, 0x00F4, 0x006F, 0x0302, 0,
+ 1, 0x00F5, 0x006F, 0x0303, 0,
+ 1, 0x00F6, 0x006F, 0x0308, 0,
+ 1, 0x00F9, 0x0075, 0x0300, 0,
+ 1, 0x00FA, 0x0075, 0x0301, 0,
+ 1, 0x00FB, 0x0075, 0x0302, 0,
+ 1, 0x00FC, 0x0075, 0x0308, 0,
+ 1, 0x00FD, 0x0079, 0x0301, 0,
+ 1, 0x00FF, 0x0079, 0x0308, 0,
+ 1, 0x0100, 0x0041, 0x0304, 0,
+ 1, 0x0101, 0x0061, 0x0304, 0,
+ 1, 0x0102, 0x0041, 0x0306, 0,
+ 1, 0x0103, 0x0061, 0x0306, 0,
+ 1, 0x0104, 0x0041, 0x0328, 0,
+ 1, 0x0105, 0x0061, 0x0328, 0,
+ 1, 0x0106, 0x0043, 0x0301, 0,
+ 1, 0x0107, 0x0063, 0x0301, 0,
+ 1, 0x0108, 0x0043, 0x0302, 0,
+ 1, 0x0109, 0x0063, 0x0302, 0,
+ 1, 0x010A, 0x0043, 0x0307, 0,
+ 1, 0x010B, 0x0063, 0x0307, 0,
+ 1, 0x010C, 0x0043, 0x030C, 0,
+ 1, 0x010D, 0x0063, 0x030C, 0,
+ 1, 0x010E, 0x0044, 0x030C, 0,
+ 1, 0x010F, 0x0064, 0x030C, 0,
+ 1, 0x0112, 0x0045, 0x0304, 0,
+ 1, 0x0113, 0x0065, 0x0304, 0,
+ 1, 0x0114, 0x0045, 0x0306, 0,
+ 1, 0x0115, 0x0065, 0x0306, 0,
+ 1, 0x0116, 0x0045, 0x0307, 0,
+ 1, 0x0117, 0x0065, 0x0307, 0,
+ 1, 0x0118, 0x0045, 0x0328, 0,
+ 1, 0x0119, 0x0065, 0x0328, 0,
+ 1, 0x011A, 0x0045, 0x030C, 0,
+ 1, 0x011B, 0x0065, 0x030C, 0,
+ 1, 0x011C, 0x0047, 0x0302, 0,
+ 1, 0x011D, 0x0067, 0x0302, 0,
+ 1, 0x011E, 0x0047, 0x0306, 0,
+ 1, 0x011F, 0x0067, 0x0306, 0,
+ 1, 0x0120, 0x0047, 0x0307, 0,
+ 1, 0x0121, 0x0067, 0x0307, 0,
+ 1, 0x0122, 0x0047, 0x0327, 0,
+ 1, 0x0123, 0x0067, 0x0327, 0,
+ 1, 0x0124, 0x0048, 0x0302, 0,
+ 1, 0x0125, 0x0068, 0x0302, 0,
+ 1, 0x0128, 0x0049, 0x0303, 0,
+ 1, 0x0129, 0x0069, 0x0303, 0,
+ 1, 0x012A, 0x0049, 0x0304, 0,
+ 1, 0x012B, 0x0069, 0x0304, 0,
+ 1, 0x012C, 0x0049, 0x0306, 0,
+ 1, 0x012D, 0x0069, 0x0306, 0,
+ 1, 0x012E, 0x0049, 0x0328, 0,
+ 1, 0x012F, 0x0069, 0x0328, 0,
+ 1, 0x0130, 0x0049, 0x0307, 0,
+ 16, 0x0132, 0x0049, 0x004A, 0,
+ 16, 0x0133, 0x0069, 0x006A, 0,
+ 1, 0x0134, 0x004A, 0x0302, 0,
+ 1, 0x0135, 0x006A, 0x0302, 0,
+ 1, 0x0136, 0x004B, 0x0327, 0,
+ 1, 0x0137, 0x006B, 0x0327, 0,
+ 1, 0x0139, 0x004C, 0x0301, 0,
+ 1, 0x013A, 0x006C, 0x0301, 0,
+ 1, 0x013B, 0x004C, 0x0327, 0,
+ 1, 0x013C, 0x006C, 0x0327, 0,
+ 1, 0x013D, 0x004C, 0x030C, 0,
+ 1, 0x013E, 0x006C, 0x030C, 0,
+ 16, 0x013F, 0x004C, 0x00B7, 0,
+ 16, 0x0140, 0x006C, 0x00B7, 0,
+ 1, 0x0143, 0x004E, 0x0301, 0,
+ 1, 0x0144, 0x006E, 0x0301, 0,
+ 1, 0x0145, 0x004E, 0x0327, 0,
+ 1, 0x0146, 0x006E, 0x0327, 0,
+ 1, 0x0147, 0x004E, 0x030C, 0,
+ 1, 0x0148, 0x006E, 0x030C, 0,
+ 16, 0x0149, 0x02BC, 0x006E, 0,
+ 1, 0x014C, 0x004F, 0x0304, 0,
+ 1, 0x014D, 0x006F, 0x0304, 0,
+ 1, 0x014E, 0x004F, 0x0306, 0,
+ 1, 0x014F, 0x006F, 0x0306, 0,
+ 1, 0x0150, 0x004F, 0x030B, 0,
+ 1, 0x0151, 0x006F, 0x030B, 0,
+ 1, 0x0154, 0x0052, 0x0301, 0,
+ 1, 0x0155, 0x0072, 0x0301, 0,
+ 1, 0x0156, 0x0052, 0x0327, 0,
+ 1, 0x0157, 0x0072, 0x0327, 0,
+ 1, 0x0158, 0x0052, 0x030C, 0,
+ 1, 0x0159, 0x0072, 0x030C, 0,
+ 1, 0x015A, 0x0053, 0x0301, 0,
+ 1, 0x015B, 0x0073, 0x0301, 0,
+ 1, 0x015C, 0x0053, 0x0302, 0,
+ 1, 0x015D, 0x0073, 0x0302, 0,
+ 1, 0x015E, 0x0053, 0x0327, 0,
+ 1, 0x015F, 0x0073, 0x0327, 0,
+ 1, 0x0160, 0x0053, 0x030C, 0,
+ 1, 0x0161, 0x0073, 0x030C, 0,
+ 1, 0x0162, 0x0054, 0x0327, 0,
+ 1, 0x0163, 0x0074, 0x0327, 0,
+ 1, 0x0164, 0x0054, 0x030C, 0,
+ 1, 0x0165, 0x0074, 0x030C, 0,
+ 1, 0x0168, 0x0055, 0x0303, 0,
+ 1, 0x0169, 0x0075, 0x0303, 0,
+ 1, 0x016A, 0x0055, 0x0304, 0,
+ 1, 0x016B, 0x0075, 0x0304, 0,
+ 1, 0x016C, 0x0055, 0x0306, 0,
+ 1, 0x016D, 0x0075, 0x0306, 0,
+ 1, 0x016E, 0x0055, 0x030A, 0,
+ 1, 0x016F, 0x0075, 0x030A, 0,
+ 1, 0x0170, 0x0055, 0x030B, 0,
+ 1, 0x0171, 0x0075, 0x030B, 0,
+ 1, 0x0172, 0x0055, 0x0328, 0,
+ 1, 0x0173, 0x0075, 0x0328, 0,
+ 1, 0x0174, 0x0057, 0x0302, 0,
+ 1, 0x0175, 0x0077, 0x0302, 0,
+ 1, 0x0176, 0x0059, 0x0302, 0,
+ 1, 0x0177, 0x0079, 0x0302, 0,
+ 1, 0x0178, 0x0059, 0x0308, 0,
+ 1, 0x0179, 0x005A, 0x0301, 0,
+ 1, 0x017A, 0x007A, 0x0301, 0,
+ 1, 0x017B, 0x005A, 0x0307, 0,
+ 1, 0x017C, 0x007A, 0x0307, 0,
+ 1, 0x017D, 0x005A, 0x030C, 0,
+ 1, 0x017E, 0x007A, 0x030C, 0,
+ 16, 0x017F, 0x0073, 0,
+ 1, 0x01A0, 0x004F, 0x031B, 0,
+ 1, 0x01A1, 0x006F, 0x031B, 0,
+ 1, 0x01AF, 0x0055, 0x031B, 0,
+ 1, 0x01B0, 0x0075, 0x031B, 0,
+ 16, 0x01C4, 0x0044, 0x017D, 0,
+ 16, 0x01C5, 0x0044, 0x017E, 0,
+ 16, 0x01C6, 0x0064, 0x017E, 0,
+ 16, 0x01C7, 0x004C, 0x004A, 0,
+ 16, 0x01C8, 0x004C, 0x006A, 0,
+ 16, 0x01C9, 0x006C, 0x006A, 0,
+ 16, 0x01CA, 0x004E, 0x004A, 0,
+ 16, 0x01CB, 0x004E, 0x006A, 0,
+ 16, 0x01CC, 0x006E, 0x006A, 0,
+ 1, 0x01CD, 0x0041, 0x030C, 0,
+ 1, 0x01CE, 0x0061, 0x030C, 0,
+ 1, 0x01CF, 0x0049, 0x030C, 0,
+ 1, 0x01D0, 0x0069, 0x030C, 0,
+ 1, 0x01D1, 0x004F, 0x030C, 0,
+ 1, 0x01D2, 0x006F, 0x030C, 0,
+ 1, 0x01D3, 0x0055, 0x030C, 0,
+ 1, 0x01D4, 0x0075, 0x030C, 0,
+ 1, 0x01D5, 0x00DC, 0x0304, 0,
+ 1, 0x01D6, 0x00FC, 0x0304, 0,
+ 1, 0x01D7, 0x00DC, 0x0301, 0,
+ 1, 0x01D8, 0x00FC, 0x0301, 0,
+ 1, 0x01D9, 0x00DC, 0x030C, 0,
+ 1, 0x01DA, 0x00FC, 0x030C, 0,
+ 1, 0x01DB, 0x00DC, 0x0300, 0,
+ 1, 0x01DC, 0x00FC, 0x0300, 0,
+ 1, 0x01DE, 0x00C4, 0x0304, 0,
+ 1, 0x01DF, 0x00E4, 0x0304, 0,
+ 1, 0x01E0, 0x0226, 0x0304, 0,
+ 1, 0x01E1, 0x0227, 0x0304, 0,
+ 1, 0x01E2, 0x00C6, 0x0304, 0,
+ 1, 0x01E3, 0x00E6, 0x0304, 0,
+ 1, 0x01E6, 0x0047, 0x030C, 0,
+ 1, 0x01E7, 0x0067, 0x030C, 0,
+ 1, 0x01E8, 0x004B, 0x030C, 0,
+ 1, 0x01E9, 0x006B, 0x030C, 0,
+ 1, 0x01EA, 0x004F, 0x0328, 0,
+ 1, 0x01EB, 0x006F, 0x0328, 0,
+ 1, 0x01EC, 0x01EA, 0x0304, 0,
+ 1, 0x01ED, 0x01EB, 0x0304, 0,
+ 1, 0x01EE, 0x01B7, 0x030C, 0,
+ 1, 0x01EF, 0x0292, 0x030C, 0,
+ 1, 0x01F0, 0x006A, 0x030C, 0,
+ 16, 0x01F1, 0x0044, 0x005A, 0,
+ 16, 0x01F2, 0x0044, 0x007A, 0,
+ 16, 0x01F3, 0x0064, 0x007A, 0,
+ 1, 0x01F4, 0x0047, 0x0301, 0,
+ 1, 0x01F5, 0x0067, 0x0301, 0,
+ 1, 0x01F8, 0x004E, 0x0300, 0,
+ 1, 0x01F9, 0x006E, 0x0300, 0,
+ 1, 0x01FA, 0x00C5, 0x0301, 0,
+ 1, 0x01FB, 0x00E5, 0x0301, 0,
+ 1, 0x01FC, 0x00C6, 0x0301, 0,
+ 1, 0x01FD, 0x00E6, 0x0301, 0,
+ 1, 0x01FE, 0x00D8, 0x0301, 0,
+ 1, 0x01FF, 0x00F8, 0x0301, 0,
+ 1, 0x0200, 0x0041, 0x030F, 0,
+ 1, 0x0201, 0x0061, 0x030F, 0,
+ 1, 0x0202, 0x0041, 0x0311, 0,
+ 1, 0x0203, 0x0061, 0x0311, 0,
+ 1, 0x0204, 0x0045, 0x030F, 0,
+ 1, 0x0205, 0x0065, 0x030F, 0,
+ 1, 0x0206, 0x0045, 0x0311, 0,
+ 1, 0x0207, 0x0065, 0x0311, 0,
+ 1, 0x0208, 0x0049, 0x030F, 0,
+ 1, 0x0209, 0x0069, 0x030F, 0,
+ 1, 0x020A, 0x0049, 0x0311, 0,
+ 1, 0x020B, 0x0069, 0x0311, 0,
+ 1, 0x020C, 0x004F, 0x030F, 0,
+ 1, 0x020D, 0x006F, 0x030F, 0,
+ 1, 0x020E, 0x004F, 0x0311, 0,
+ 1, 0x020F, 0x006F, 0x0311, 0,
+ 1, 0x0210, 0x0052, 0x030F, 0,
+ 1, 0x0211, 0x0072, 0x030F, 0,
+ 1, 0x0212, 0x0052, 0x0311, 0,
+ 1, 0x0213, 0x0072, 0x0311, 0,
+ 1, 0x0214, 0x0055, 0x030F, 0,
+ 1, 0x0215, 0x0075, 0x030F, 0,
+ 1, 0x0216, 0x0055, 0x0311, 0,
+ 1, 0x0217, 0x0075, 0x0311, 0,
+ 1, 0x0218, 0x0053, 0x0326, 0,
+ 1, 0x0219, 0x0073, 0x0326, 0,
+ 1, 0x021A, 0x0054, 0x0326, 0,
+ 1, 0x021B, 0x0074, 0x0326, 0,
+ 1, 0x021E, 0x0048, 0x030C, 0,
+ 1, 0x021F, 0x0068, 0x030C, 0,
+ 1, 0x0226, 0x0041, 0x0307, 0,
+ 1, 0x0227, 0x0061, 0x0307, 0,
+ 1, 0x0228, 0x0045, 0x0327, 0,
+ 1, 0x0229, 0x0065, 0x0327, 0,
+ 1, 0x022A, 0x00D6, 0x0304, 0,
+ 1, 0x022B, 0x00F6, 0x0304, 0,
+ 1, 0x022C, 0x00D5, 0x0304, 0,
+ 1, 0x022D, 0x00F5, 0x0304, 0,
+ 1, 0x022E, 0x004F, 0x0307, 0,
+ 1, 0x022F, 0x006F, 0x0307, 0,
+ 1, 0x0230, 0x022E, 0x0304, 0,
+ 1, 0x0231, 0x022F, 0x0304, 0,
+ 1, 0x0232, 0x0059, 0x0304, 0,
+ 1, 0x0233, 0x0079, 0x0304, 0,
+ 9, 0x02B0, 0x0068, 0,
+ 9, 0x02B1, 0x0266, 0,
+ 9, 0x02B2, 0x006A, 0,
+ 9, 0x02B3, 0x0072, 0,
+ 9, 0x02B4, 0x0279, 0,
+ 9, 0x02B5, 0x027B, 0,
+ 9, 0x02B6, 0x0281, 0,
+ 9, 0x02B7, 0x0077, 0,
+ 9, 0x02B8, 0x0079, 0,
+ 16, 0x02D8, 0x0020, 0x0306, 0,
+ 16, 0x02D9, 0x0020, 0x0307, 0,
+ 16, 0x02DA, 0x0020, 0x030A, 0,
+ 16, 0x02DB, 0x0020, 0x0328, 0,
+ 16, 0x02DC, 0x0020, 0x0303, 0,
+ 16, 0x02DD, 0x0020, 0x030B, 0,
+ 9, 0x02E0, 0x0263, 0,
+ 9, 0x02E1, 0x006C, 0,
+ 9, 0x02E2, 0x0073, 0,
+ 9, 0x02E3, 0x0078, 0,
+ 9, 0x02E4, 0x0295, 0,
+ 1, 0x0340, 0x0300, 0,
+ 1, 0x0341, 0x0301, 0,
+ 1, 0x0343, 0x0313, 0,
+ 1, 0x0344, 0x0308, 0x0301, 0,
+ 1, 0x0374, 0x02B9, 0,
+ 16, 0x037A, 0x0020, 0x0345, 0,
+ 1, 0x037E, 0x003B, 0,
+ 16, 0x0384, 0x0020, 0x0301, 0,
+ 1, 0x0385, 0x00A8, 0x0301, 0,
+ 1, 0x0386, 0x0391, 0x0301, 0,
+ 1, 0x0387, 0x00B7, 0,
+ 1, 0x0388, 0x0395, 0x0301, 0,
+ 1, 0x0389, 0x0397, 0x0301, 0,
+ 1, 0x038A, 0x0399, 0x0301, 0,
+ 1, 0x038C, 0x039F, 0x0301, 0,
+ 1, 0x038E, 0x03A5, 0x0301, 0,
+ 1, 0x038F, 0x03A9, 0x0301, 0,
+ 1, 0x0390, 0x03CA, 0x0301, 0,
+ 1, 0x03AA, 0x0399, 0x0308, 0,
+ 1, 0x03AB, 0x03A5, 0x0308, 0,
+ 1, 0x03AC, 0x03B1, 0x0301, 0,
+ 1, 0x03AD, 0x03B5, 0x0301, 0,
+ 1, 0x03AE, 0x03B7, 0x0301, 0,
+ 1, 0x03AF, 0x03B9, 0x0301, 0,
+ 1, 0x03B0, 0x03CB, 0x0301, 0,
+ 1, 0x03CA, 0x03B9, 0x0308, 0,
+ 1, 0x03CB, 0x03C5, 0x0308, 0,
+ 1, 0x03CC, 0x03BF, 0x0301, 0,
+ 1, 0x03CD, 0x03C5, 0x0301, 0,
+ 1, 0x03CE, 0x03C9, 0x0301, 0,
+ 16, 0x03D0, 0x03B2, 0,
+ 16, 0x03D1, 0x03B8, 0,
+ 16, 0x03D2, 0x03A5, 0,
+ 1, 0x03D3, 0x03D2, 0x0301, 0,
+ 1, 0x03D4, 0x03D2, 0x0308, 0,
+ 16, 0x03D5, 0x03C6, 0,
+ 16, 0x03D6, 0x03C0, 0,
+ 16, 0x03F0, 0x03BA, 0,
+ 16, 0x03F1, 0x03C1, 0,
+ 16, 0x03F2, 0x03C2, 0,
+ 1, 0x0400, 0x0415, 0x0300, 0,
+ 1, 0x0401, 0x0415, 0x0308, 0,
+ 1, 0x0403, 0x0413, 0x0301, 0,
+ 1, 0x0407, 0x0406, 0x0308, 0,
+ 1, 0x040C, 0x041A, 0x0301, 0,
+ 1, 0x040D, 0x0418, 0x0300, 0,
+ 1, 0x040E, 0x0423, 0x0306, 0,
+ 1, 0x0419, 0x0418, 0x0306, 0,
+ 1, 0x0439, 0x0438, 0x0306, 0,
+ 1, 0x0450, 0x0435, 0x0300, 0,
+ 1, 0x0451, 0x0435, 0x0308, 0,
+ 1, 0x0453, 0x0433, 0x0301, 0,
+ 1, 0x0457, 0x0456, 0x0308, 0,
+ 1, 0x045C, 0x043A, 0x0301, 0,
+ 1, 0x045D, 0x0438, 0x0300, 0,
+ 1, 0x045E, 0x0443, 0x0306, 0,
+ 1, 0x0476, 0x0474, 0x030F, 0,
+ 1, 0x0477, 0x0475, 0x030F, 0,
+ 1, 0x04C1, 0x0416, 0x0306, 0,
+ 1, 0x04C2, 0x0436, 0x0306, 0,
+ 1, 0x04D0, 0x0410, 0x0306, 0,
+ 1, 0x04D1, 0x0430, 0x0306, 0,
+ 1, 0x04D2, 0x0410, 0x0308, 0,
+ 1, 0x04D3, 0x0430, 0x0308, 0,
+ 1, 0x04D6, 0x0415, 0x0306, 0,
+ 1, 0x04D7, 0x0435, 0x0306, 0,
+ 1, 0x04DA, 0x04D8, 0x0308, 0,
+ 1, 0x04DB, 0x04D9, 0x0308, 0,
+ 1, 0x04DC, 0x0416, 0x0308, 0,
+ 1, 0x04DD, 0x0436, 0x0308, 0,
+ 1, 0x04DE, 0x0417, 0x0308, 0,
+ 1, 0x04DF, 0x0437, 0x0308, 0,
+ 1, 0x04E2, 0x0418, 0x0304, 0,
+ 1, 0x04E3, 0x0438, 0x0304, 0,
+ 1, 0x04E4, 0x0418, 0x0308, 0,
+ 1, 0x04E5, 0x0438, 0x0308, 0,
+ 1, 0x04E6, 0x041E, 0x0308, 0,
+ 1, 0x04E7, 0x043E, 0x0308, 0,
+ 1, 0x04EA, 0x04E8, 0x0308, 0,
+ 1, 0x04EB, 0x04E9, 0x0308, 0,
+ 1, 0x04EC, 0x042D, 0x0308, 0,
+ 1, 0x04ED, 0x044D, 0x0308, 0,
+ 1, 0x04EE, 0x0423, 0x0304, 0,
+ 1, 0x04EF, 0x0443, 0x0304, 0,
+ 1, 0x04F0, 0x0423, 0x0308, 0,
+ 1, 0x04F1, 0x0443, 0x0308, 0,
+ 1, 0x04F2, 0x0423, 0x030B, 0,
+ 1, 0x04F3, 0x0443, 0x030B, 0,
+ 1, 0x04F4, 0x0427, 0x0308, 0,
+ 1, 0x04F5, 0x0447, 0x0308, 0,
+ 1, 0x04F8, 0x042B, 0x0308, 0,
+ 1, 0x04F9, 0x044B, 0x0308, 0,
+ 16, 0x0587, 0x0565, 0x0582, 0,
+ 1, 0x0622, 0x0627, 0x0653, 0,
+ 1, 0x0623, 0x0627, 0x0654, 0,
+ 1, 0x0624, 0x0648, 0x0654, 0,
+ 1, 0x0625, 0x0627, 0x0655, 0,
+ 1, 0x0626, 0x064A, 0x0654, 0,
+ 16, 0x0675, 0x0627, 0x0674, 0,
+ 16, 0x0676, 0x0648, 0x0674, 0,
+ 16, 0x0677, 0x06C7, 0x0674, 0,
+ 16, 0x0678, 0x064A, 0x0674, 0,
+ 1, 0x06C0, 0x06D5, 0x0654, 0,
+ 1, 0x06C2, 0x06C1, 0x0654, 0,
+ 1, 0x06D3, 0x06D2, 0x0654, 0,
+ 1, 0x0929, 0x0928, 0x093C, 0,
+ 1, 0x0931, 0x0930, 0x093C, 0,
+ 1, 0x0934, 0x0933, 0x093C, 0,
+ 1, 0x0958, 0x0915, 0x093C, 0,
+ 1, 0x0959, 0x0916, 0x093C, 0,
+ 1, 0x095A, 0x0917, 0x093C, 0,
+ 1, 0x095B, 0x091C, 0x093C, 0,
+ 1, 0x095C, 0x0921, 0x093C, 0,
+ 1, 0x095D, 0x0922, 0x093C, 0,
+ 1, 0x095E, 0x092B, 0x093C, 0,
+ 1, 0x095F, 0x092F, 0x093C, 0,
+ 1, 0x09CB, 0x09C7, 0x09BE, 0,
+ 1, 0x09CC, 0x09C7, 0x09D7, 0,
+ 1, 0x09DC, 0x09A1, 0x09BC, 0,
+ 1, 0x09DD, 0x09A2, 0x09BC, 0,
+ 1, 0x09DF, 0x09AF, 0x09BC, 0,
+ 1, 0x0A33, 0x0A32, 0x0A3C, 0,
+ 1, 0x0A36, 0x0A38, 0x0A3C, 0,
+ 1, 0x0A59, 0x0A16, 0x0A3C, 0,
+ 1, 0x0A5A, 0x0A17, 0x0A3C, 0,
+ 1, 0x0A5B, 0x0A1C, 0x0A3C, 0,
+ 1, 0x0A5E, 0x0A2B, 0x0A3C, 0,
+ 1, 0x0B48, 0x0B47, 0x0B56, 0,
+ 1, 0x0B4B, 0x0B47, 0x0B3E, 0,
+ 1, 0x0B4C, 0x0B47, 0x0B57, 0,
+ 1, 0x0B5C, 0x0B21, 0x0B3C, 0,
+ 1, 0x0B5D, 0x0B22, 0x0B3C, 0,
+ 1, 0x0B94, 0x0B92, 0x0BD7, 0,
+ 1, 0x0BCA, 0x0BC6, 0x0BBE, 0,
+ 1, 0x0BCB, 0x0BC7, 0x0BBE, 0,
+ 1, 0x0BCC, 0x0BC6, 0x0BD7, 0,
+ 1, 0x0C48, 0x0C46, 0x0C56, 0,
+ 1, 0x0CC0, 0x0CBF, 0x0CD5, 0,
+ 1, 0x0CC7, 0x0CC6, 0x0CD5, 0,
+ 1, 0x0CC8, 0x0CC6, 0x0CD6, 0,
+ 1, 0x0CCA, 0x0CC6, 0x0CC2, 0,
+ 1, 0x0CCB, 0x0CCA, 0x0CD5, 0,
+ 1, 0x0D4A, 0x0D46, 0x0D3E, 0,
+ 1, 0x0D4B, 0x0D47, 0x0D3E, 0,
+ 1, 0x0D4C, 0x0D46, 0x0D57, 0,
+ 1, 0x0DDA, 0x0DD9, 0x0DCA, 0,
+ 1, 0x0DDC, 0x0DD9, 0x0DCF, 0,
+ 1, 0x0DDD, 0x0DDC, 0x0DCA, 0,
+ 1, 0x0DDE, 0x0DD9, 0x0DDF, 0,
+ 16, 0x0E33, 0x0E4D, 0x0E32, 0,
+ 16, 0x0EB3, 0x0ECD, 0x0EB2, 0,
+ 16, 0x0EDC, 0x0EAB, 0x0E99, 0,
+ 16, 0x0EDD, 0x0EAB, 0x0EA1, 0,
+ 3, 0x0F0C, 0x0F0B, 0,
+ 1, 0x0F43, 0x0F42, 0x0FB7, 0,
+ 1, 0x0F4D, 0x0F4C, 0x0FB7, 0,
+ 1, 0x0F52, 0x0F51, 0x0FB7, 0,
+ 1, 0x0F57, 0x0F56, 0x0FB7, 0,
+ 1, 0x0F5C, 0x0F5B, 0x0FB7, 0,
+ 1, 0x0F69, 0x0F40, 0x0FB5, 0,
+ 1, 0x0F73, 0x0F71, 0x0F72, 0,
+ 1, 0x0F75, 0x0F71, 0x0F74, 0,
+ 1, 0x0F76, 0x0FB2, 0x0F80, 0,
+ 16, 0x0F77, 0x0FB2, 0x0F81, 0,
+ 1, 0x0F78, 0x0FB3, 0x0F80, 0,
+ 16, 0x0F79, 0x0FB3, 0x0F81, 0,
+ 1, 0x0F81, 0x0F71, 0x0F80, 0,
+ 1, 0x0F93, 0x0F92, 0x0FB7, 0,
+ 1, 0x0F9D, 0x0F9C, 0x0FB7, 0,
+ 1, 0x0FA2, 0x0FA1, 0x0FB7, 0,
+ 1, 0x0FA7, 0x0FA6, 0x0FB7, 0,
+ 1, 0x0FAC, 0x0FAB, 0x0FB7, 0,
+ 1, 0x0FB9, 0x0F90, 0x0FB5, 0,
+ 1, 0x1026, 0x1025, 0x102E, 0,
+ 1, 0x1E00, 0x0041, 0x0325, 0,
+ 1, 0x1E01, 0x0061, 0x0325, 0,
+ 1, 0x1E02, 0x0042, 0x0307, 0,
+ 1, 0x1E03, 0x0062, 0x0307, 0,
+ 1, 0x1E04, 0x0042, 0x0323, 0,
+ 1, 0x1E05, 0x0062, 0x0323, 0,
+ 1, 0x1E06, 0x0042, 0x0331, 0,
+ 1, 0x1E07, 0x0062, 0x0331, 0,
+ 1, 0x1E08, 0x00C7, 0x0301, 0,
+ 1, 0x1E09, 0x00E7, 0x0301, 0,
+ 1, 0x1E0A, 0x0044, 0x0307, 0,
+ 1, 0x1E0B, 0x0064, 0x0307, 0,
+ 1, 0x1E0C, 0x0044, 0x0323, 0,
+ 1, 0x1E0D, 0x0064, 0x0323, 0,
+ 1, 0x1E0E, 0x0044, 0x0331, 0,
+ 1, 0x1E0F, 0x0064, 0x0331, 0,
+ 1, 0x1E10, 0x0044, 0x0327, 0,
+ 1, 0x1E11, 0x0064, 0x0327, 0,
+ 1, 0x1E12, 0x0044, 0x032D, 0,
+ 1, 0x1E13, 0x0064, 0x032D, 0,
+ 1, 0x1E14, 0x0112, 0x0300, 0,
+ 1, 0x1E15, 0x0113, 0x0300, 0,
+ 1, 0x1E16, 0x0112, 0x0301, 0,
+ 1, 0x1E17, 0x0113, 0x0301, 0,
+ 1, 0x1E18, 0x0045, 0x032D, 0,
+ 1, 0x1E19, 0x0065, 0x032D, 0,
+ 1, 0x1E1A, 0x0045, 0x0330, 0,
+ 1, 0x1E1B, 0x0065, 0x0330, 0,
+ 1, 0x1E1C, 0x0228, 0x0306, 0,
+ 1, 0x1E1D, 0x0229, 0x0306, 0,
+ 1, 0x1E1E, 0x0046, 0x0307, 0,
+ 1, 0x1E1F, 0x0066, 0x0307, 0,
+ 1, 0x1E20, 0x0047, 0x0304, 0,
+ 1, 0x1E21, 0x0067, 0x0304, 0,
+ 1, 0x1E22, 0x0048, 0x0307, 0,
+ 1, 0x1E23, 0x0068, 0x0307, 0,
+ 1, 0x1E24, 0x0048, 0x0323, 0,
+ 1, 0x1E25, 0x0068, 0x0323, 0,
+ 1, 0x1E26, 0x0048, 0x0308, 0,
+ 1, 0x1E27, 0x0068, 0x0308, 0,
+ 1, 0x1E28, 0x0048, 0x0327, 0,
+ 1, 0x1E29, 0x0068, 0x0327, 0,
+ 1, 0x1E2A, 0x0048, 0x032E, 0,
+ 1, 0x1E2B, 0x0068, 0x032E, 0,
+ 1, 0x1E2C, 0x0049, 0x0330, 0,
+ 1, 0x1E2D, 0x0069, 0x0330, 0,
+ 1, 0x1E2E, 0x00CF, 0x0301, 0,
+ 1, 0x1E2F, 0x00EF, 0x0301, 0,
+ 1, 0x1E30, 0x004B, 0x0301, 0,
+ 1, 0x1E31, 0x006B, 0x0301, 0,
+ 1, 0x1E32, 0x004B, 0x0323, 0,
+ 1, 0x1E33, 0x006B, 0x0323, 0,
+ 1, 0x1E34, 0x004B, 0x0331, 0,
+ 1, 0x1E35, 0x006B, 0x0331, 0,
+ 1, 0x1E36, 0x004C, 0x0323, 0,
+ 1, 0x1E37, 0x006C, 0x0323, 0,
+ 1, 0x1E38, 0x1E36, 0x0304, 0,
+ 1, 0x1E39, 0x1E37, 0x0304, 0,
+ 1, 0x1E3A, 0x004C, 0x0331, 0,
+ 1, 0x1E3B, 0x006C, 0x0331, 0,
+ 1, 0x1E3C, 0x004C, 0x032D, 0,
+ 1, 0x1E3D, 0x006C, 0x032D, 0,
+ 1, 0x1E3E, 0x004D, 0x0301, 0,
+ 1, 0x1E3F, 0x006D, 0x0301, 0,
+ 1, 0x1E40, 0x004D, 0x0307, 0,
+ 1, 0x1E41, 0x006D, 0x0307, 0,
+ 1, 0x1E42, 0x004D, 0x0323, 0,
+ 1, 0x1E43, 0x006D, 0x0323, 0,
+ 1, 0x1E44, 0x004E, 0x0307, 0,
+ 1, 0x1E45, 0x006E, 0x0307, 0,
+ 1, 0x1E46, 0x004E, 0x0323, 0,
+ 1, 0x1E47, 0x006E, 0x0323, 0,
+ 1, 0x1E48, 0x004E, 0x0331, 0,
+ 1, 0x1E49, 0x006E, 0x0331, 0,
+ 1, 0x1E4A, 0x004E, 0x032D, 0,
+ 1, 0x1E4B, 0x006E, 0x032D, 0,
+ 1, 0x1E4C, 0x00D5, 0x0301, 0,
+ 1, 0x1E4D, 0x00F5, 0x0301, 0,
+ 1, 0x1E4E, 0x00D5, 0x0308, 0,
+ 1, 0x1E4F, 0x00F5, 0x0308, 0,
+ 1, 0x1E50, 0x014C, 0x0300, 0,
+ 1, 0x1E51, 0x014D, 0x0300, 0,
+ 1, 0x1E52, 0x014C, 0x0301, 0,
+ 1, 0x1E53, 0x014D, 0x0301, 0,
+ 1, 0x1E54, 0x0050, 0x0301, 0,
+ 1, 0x1E55, 0x0070, 0x0301, 0,
+ 1, 0x1E56, 0x0050, 0x0307, 0,
+ 1, 0x1E57, 0x0070, 0x0307, 0,
+ 1, 0x1E58, 0x0052, 0x0307, 0,
+ 1, 0x1E59, 0x0072, 0x0307, 0,
+ 1, 0x1E5A, 0x0052, 0x0323, 0,
+ 1, 0x1E5B, 0x0072, 0x0323, 0,
+ 1, 0x1E5C, 0x1E5A, 0x0304, 0,
+ 1, 0x1E5D, 0x1E5B, 0x0304, 0,
+ 1, 0x1E5E, 0x0052, 0x0331, 0,
+ 1, 0x1E5F, 0x0072, 0x0331, 0,
+ 1, 0x1E60, 0x0053, 0x0307, 0,
+ 1, 0x1E61, 0x0073, 0x0307, 0,
+ 1, 0x1E62, 0x0053, 0x0323, 0,
+ 1, 0x1E63, 0x0073, 0x0323, 0,
+ 1, 0x1E64, 0x015A, 0x0307, 0,
+ 1, 0x1E65, 0x015B, 0x0307, 0,
+ 1, 0x1E66, 0x0160, 0x0307, 0,
+ 1, 0x1E67, 0x0161, 0x0307, 0,
+ 1, 0x1E68, 0x1E62, 0x0307, 0,
+ 1, 0x1E69, 0x1E63, 0x0307, 0,
+ 1, 0x1E6A, 0x0054, 0x0307, 0,
+ 1, 0x1E6B, 0x0074, 0x0307, 0,
+ 1, 0x1E6C, 0x0054, 0x0323, 0,
+ 1, 0x1E6D, 0x0074, 0x0323, 0,
+ 1, 0x1E6E, 0x0054, 0x0331, 0,
+ 1, 0x1E6F, 0x0074, 0x0331, 0,
+ 1, 0x1E70, 0x0054, 0x032D, 0,
+ 1, 0x1E71, 0x0074, 0x032D, 0,
+ 1, 0x1E72, 0x0055, 0x0324, 0,
+ 1, 0x1E73, 0x0075, 0x0324, 0,
+ 1, 0x1E74, 0x0055, 0x0330, 0,
+ 1, 0x1E75, 0x0075, 0x0330, 0,
+ 1, 0x1E76, 0x0055, 0x032D, 0,
+ 1, 0x1E77, 0x0075, 0x032D, 0,
+ 1, 0x1E78, 0x0168, 0x0301, 0,
+ 1, 0x1E79, 0x0169, 0x0301, 0,
+ 1, 0x1E7A, 0x016A, 0x0308, 0,
+ 1, 0x1E7B, 0x016B, 0x0308, 0,
+ 1, 0x1E7C, 0x0056, 0x0303, 0,
+ 1, 0x1E7D, 0x0076, 0x0303, 0,
+ 1, 0x1E7E, 0x0056, 0x0323, 0,
+ 1, 0x1E7F, 0x0076, 0x0323, 0,
+ 1, 0x1E80, 0x0057, 0x0300, 0,
+ 1, 0x1E81, 0x0077, 0x0300, 0,
+ 1, 0x1E82, 0x0057, 0x0301, 0,
+ 1, 0x1E83, 0x0077, 0x0301, 0,
+ 1, 0x1E84, 0x0057, 0x0308, 0,
+ 1, 0x1E85, 0x0077, 0x0308, 0,
+ 1, 0x1E86, 0x0057, 0x0307, 0,
+ 1, 0x1E87, 0x0077, 0x0307, 0,
+ 1, 0x1E88, 0x0057, 0x0323, 0,
+ 1, 0x1E89, 0x0077, 0x0323, 0,
+ 1, 0x1E8A, 0x0058, 0x0307, 0,
+ 1, 0x1E8B, 0x0078, 0x0307, 0,
+ 1, 0x1E8C, 0x0058, 0x0308, 0,
+ 1, 0x1E8D, 0x0078, 0x0308, 0,
+ 1, 0x1E8E, 0x0059, 0x0307, 0,
+ 1, 0x1E8F, 0x0079, 0x0307, 0,
+ 1, 0x1E90, 0x005A, 0x0302, 0,
+ 1, 0x1E91, 0x007A, 0x0302, 0,
+ 1, 0x1E92, 0x005A, 0x0323, 0,
+ 1, 0x1E93, 0x007A, 0x0323, 0,
+ 1, 0x1E94, 0x005A, 0x0331, 0,
+ 1, 0x1E95, 0x007A, 0x0331, 0,
+ 1, 0x1E96, 0x0068, 0x0331, 0,
+ 1, 0x1E97, 0x0074, 0x0308, 0,
+ 1, 0x1E98, 0x0077, 0x030A, 0,
+ 1, 0x1E99, 0x0079, 0x030A, 0,
+ 16, 0x1E9A, 0x0061, 0x02BE, 0,
+ 1, 0x1E9B, 0x017F, 0x0307, 0,
+ 1, 0x1EA0, 0x0041, 0x0323, 0,
+ 1, 0x1EA1, 0x0061, 0x0323, 0,
+ 1, 0x1EA2, 0x0041, 0x0309, 0,
+ 1, 0x1EA3, 0x0061, 0x0309, 0,
+ 1, 0x1EA4, 0x00C2, 0x0301, 0,
+ 1, 0x1EA5, 0x00E2, 0x0301, 0,
+ 1, 0x1EA6, 0x00C2, 0x0300, 0,
+ 1, 0x1EA7, 0x00E2, 0x0300, 0,
+ 1, 0x1EA8, 0x00C2, 0x0309, 0,
+ 1, 0x1EA9, 0x00E2, 0x0309, 0,
+ 1, 0x1EAA, 0x00C2, 0x0303, 0,
+ 1, 0x1EAB, 0x00E2, 0x0303, 0,
+ 1, 0x1EAC, 0x1EA0, 0x0302, 0,
+ 1, 0x1EAD, 0x1EA1, 0x0302, 0,
+ 1, 0x1EAE, 0x0102, 0x0301, 0,
+ 1, 0x1EAF, 0x0103, 0x0301, 0,
+ 1, 0x1EB0, 0x0102, 0x0300, 0,
+ 1, 0x1EB1, 0x0103, 0x0300, 0,
+ 1, 0x1EB2, 0x0102, 0x0309, 0,
+ 1, 0x1EB3, 0x0103, 0x0309, 0,
+ 1, 0x1EB4, 0x0102, 0x0303, 0,
+ 1, 0x1EB5, 0x0103, 0x0303, 0,
+ 1, 0x1EB6, 0x1EA0, 0x0306, 0,
+ 1, 0x1EB7, 0x1EA1, 0x0306, 0,
+ 1, 0x1EB8, 0x0045, 0x0323, 0,
+ 1, 0x1EB9, 0x0065, 0x0323, 0,
+ 1, 0x1EBA, 0x0045, 0x0309, 0,
+ 1, 0x1EBB, 0x0065, 0x0309, 0,
+ 1, 0x1EBC, 0x0045, 0x0303, 0,
+ 1, 0x1EBD, 0x0065, 0x0303, 0,
+ 1, 0x1EBE, 0x00CA, 0x0301, 0,
+ 1, 0x1EBF, 0x00EA, 0x0301, 0,
+ 1, 0x1EC0, 0x00CA, 0x0300, 0,
+ 1, 0x1EC1, 0x00EA, 0x0300, 0,
+ 1, 0x1EC2, 0x00CA, 0x0309, 0,
+ 1, 0x1EC3, 0x00EA, 0x0309, 0,
+ 1, 0x1EC4, 0x00CA, 0x0303, 0,
+ 1, 0x1EC5, 0x00EA, 0x0303, 0,
+ 1, 0x1EC6, 0x1EB8, 0x0302, 0,
+ 1, 0x1EC7, 0x1EB9, 0x0302, 0,
+ 1, 0x1EC8, 0x0049, 0x0309, 0,
+ 1, 0x1EC9, 0x0069, 0x0309, 0,
+ 1, 0x1ECA, 0x0049, 0x0323, 0,
+ 1, 0x1ECB, 0x0069, 0x0323, 0,
+ 1, 0x1ECC, 0x004F, 0x0323, 0,
+ 1, 0x1ECD, 0x006F, 0x0323, 0,
+ 1, 0x1ECE, 0x004F, 0x0309, 0,
+ 1, 0x1ECF, 0x006F, 0x0309, 0,
+ 1, 0x1ED0, 0x00D4, 0x0301, 0,
+ 1, 0x1ED1, 0x00F4, 0x0301, 0,
+ 1, 0x1ED2, 0x00D4, 0x0300, 0,
+ 1, 0x1ED3, 0x00F4, 0x0300, 0,
+ 1, 0x1ED4, 0x00D4, 0x0309, 0,
+ 1, 0x1ED5, 0x00F4, 0x0309, 0,
+ 1, 0x1ED6, 0x00D4, 0x0303, 0,
+ 1, 0x1ED7, 0x00F4, 0x0303, 0,
+ 1, 0x1ED8, 0x1ECC, 0x0302, 0,
+ 1, 0x1ED9, 0x1ECD, 0x0302, 0,
+ 1, 0x1EDA, 0x01A0, 0x0301, 0,
+ 1, 0x1EDB, 0x01A1, 0x0301, 0,
+ 1, 0x1EDC, 0x01A0, 0x0300, 0,
+ 1, 0x1EDD, 0x01A1, 0x0300, 0,
+ 1, 0x1EDE, 0x01A0, 0x0309, 0,
+ 1, 0x1EDF, 0x01A1, 0x0309, 0,
+ 1, 0x1EE0, 0x01A0, 0x0303, 0,
+ 1, 0x1EE1, 0x01A1, 0x0303, 0,
+ 1, 0x1EE2, 0x01A0, 0x0323, 0,
+ 1, 0x1EE3, 0x01A1, 0x0323, 0,
+ 1, 0x1EE4, 0x0055, 0x0323, 0,
+ 1, 0x1EE5, 0x0075, 0x0323, 0,
+ 1, 0x1EE6, 0x0055, 0x0309, 0,
+ 1, 0x1EE7, 0x0075, 0x0309, 0,
+ 1, 0x1EE8, 0x01AF, 0x0301, 0,
+ 1, 0x1EE9, 0x01B0, 0x0301, 0,
+ 1, 0x1EEA, 0x01AF, 0x0300, 0,
+ 1, 0x1EEB, 0x01B0, 0x0300, 0,
+ 1, 0x1EEC, 0x01AF, 0x0309, 0,
+ 1, 0x1EED, 0x01B0, 0x0309, 0,
+ 1, 0x1EEE, 0x01AF, 0x0303, 0,
+ 1, 0x1EEF, 0x01B0, 0x0303, 0,
+ 1, 0x1EF0, 0x01AF, 0x0323, 0,
+ 1, 0x1EF1, 0x01B0, 0x0323, 0,
+ 1, 0x1EF2, 0x0059, 0x0300, 0,
+ 1, 0x1EF3, 0x0079, 0x0300, 0,
+ 1, 0x1EF4, 0x0059, 0x0323, 0,
+ 1, 0x1EF5, 0x0079, 0x0323, 0,
+ 1, 0x1EF6, 0x0059, 0x0309, 0,
+ 1, 0x1EF7, 0x0079, 0x0309, 0,
+ 1, 0x1EF8, 0x0059, 0x0303, 0,
+ 1, 0x1EF9, 0x0079, 0x0303, 0,
+ 1, 0x1F00, 0x03B1, 0x0313, 0,
+ 1, 0x1F01, 0x03B1, 0x0314, 0,
+ 1, 0x1F02, 0x1F00, 0x0300, 0,
+ 1, 0x1F03, 0x1F01, 0x0300, 0,
+ 1, 0x1F04, 0x1F00, 0x0301, 0,
+ 1, 0x1F05, 0x1F01, 0x0301, 0,
+ 1, 0x1F06, 0x1F00, 0x0342, 0,
+ 1, 0x1F07, 0x1F01, 0x0342, 0,
+ 1, 0x1F08, 0x0391, 0x0313, 0,
+ 1, 0x1F09, 0x0391, 0x0314, 0,
+ 1, 0x1F0A, 0x1F08, 0x0300, 0,
+ 1, 0x1F0B, 0x1F09, 0x0300, 0,
+ 1, 0x1F0C, 0x1F08, 0x0301, 0,
+ 1, 0x1F0D, 0x1F09, 0x0301, 0,
+ 1, 0x1F0E, 0x1F08, 0x0342, 0,
+ 1, 0x1F0F, 0x1F09, 0x0342, 0,
+ 1, 0x1F10, 0x03B5, 0x0313, 0,
+ 1, 0x1F11, 0x03B5, 0x0314, 0,
+ 1, 0x1F12, 0x1F10, 0x0300, 0,
+ 1, 0x1F13, 0x1F11, 0x0300, 0,
+ 1, 0x1F14, 0x1F10, 0x0301, 0,
+ 1, 0x1F15, 0x1F11, 0x0301, 0,
+ 1, 0x1F18, 0x0395, 0x0313, 0,
+ 1, 0x1F19, 0x0395, 0x0314, 0,
+ 1, 0x1F1A, 0x1F18, 0x0300, 0,
+ 1, 0x1F1B, 0x1F19, 0x0300, 0,
+ 1, 0x1F1C, 0x1F18, 0x0301, 0,
+ 1, 0x1F1D, 0x1F19, 0x0301, 0,
+ 1, 0x1F20, 0x03B7, 0x0313, 0,
+ 1, 0x1F21, 0x03B7, 0x0314, 0,
+ 1, 0x1F22, 0x1F20, 0x0300, 0,
+ 1, 0x1F23, 0x1F21, 0x0300, 0,
+ 1, 0x1F24, 0x1F20, 0x0301, 0,
+ 1, 0x1F25, 0x1F21, 0x0301, 0,
+ 1, 0x1F26, 0x1F20, 0x0342, 0,
+ 1, 0x1F27, 0x1F21, 0x0342, 0,
+ 1, 0x1F28, 0x0397, 0x0313, 0,
+ 1, 0x1F29, 0x0397, 0x0314, 0,
+ 1, 0x1F2A, 0x1F28, 0x0300, 0,
+ 1, 0x1F2B, 0x1F29, 0x0300, 0,
+ 1, 0x1F2C, 0x1F28, 0x0301, 0,
+ 1, 0x1F2D, 0x1F29, 0x0301, 0,
+ 1, 0x1F2E, 0x1F28, 0x0342, 0,
+ 1, 0x1F2F, 0x1F29, 0x0342, 0,
+ 1, 0x1F30, 0x03B9, 0x0313, 0,
+ 1, 0x1F31, 0x03B9, 0x0314, 0,
+ 1, 0x1F32, 0x1F30, 0x0300, 0,
+ 1, 0x1F33, 0x1F31, 0x0300, 0,
+ 1, 0x1F34, 0x1F30, 0x0301, 0,
+ 1, 0x1F35, 0x1F31, 0x0301, 0,
+ 1, 0x1F36, 0x1F30, 0x0342, 0,
+ 1, 0x1F37, 0x1F31, 0x0342, 0,
+ 1, 0x1F38, 0x0399, 0x0313, 0,
+ 1, 0x1F39, 0x0399, 0x0314, 0,
+ 1, 0x1F3A, 0x1F38, 0x0300, 0,
+ 1, 0x1F3B, 0x1F39, 0x0300, 0,
+ 1, 0x1F3C, 0x1F38, 0x0301, 0,
+ 1, 0x1F3D, 0x1F39, 0x0301, 0,
+ 1, 0x1F3E, 0x1F38, 0x0342, 0,
+ 1, 0x1F3F, 0x1F39, 0x0342, 0,
+ 1, 0x1F40, 0x03BF, 0x0313, 0,
+ 1, 0x1F41, 0x03BF, 0x0314, 0,
+ 1, 0x1F42, 0x1F40, 0x0300, 0,
+ 1, 0x1F43, 0x1F41, 0x0300, 0,
+ 1, 0x1F44, 0x1F40, 0x0301, 0,
+ 1, 0x1F45, 0x1F41, 0x0301, 0,
+ 1, 0x1F48, 0x039F, 0x0313, 0,
+ 1, 0x1F49, 0x039F, 0x0314, 0,
+ 1, 0x1F4A, 0x1F48, 0x0300, 0,
+ 1, 0x1F4B, 0x1F49, 0x0300, 0,
+ 1, 0x1F4C, 0x1F48, 0x0301, 0,
+ 1, 0x1F4D, 0x1F49, 0x0301, 0,
+ 1, 0x1F50, 0x03C5, 0x0313, 0,
+ 1, 0x1F51, 0x03C5, 0x0314, 0,
+ 1, 0x1F52, 0x1F50, 0x0300, 0,
+ 1, 0x1F53, 0x1F51, 0x0300, 0,
+ 1, 0x1F54, 0x1F50, 0x0301, 0,
+ 1, 0x1F55, 0x1F51, 0x0301, 0,
+ 1, 0x1F56, 0x1F50, 0x0342, 0,
+ 1, 0x1F57, 0x1F51, 0x0342, 0,
+ 1, 0x1F59, 0x03A5, 0x0314, 0,
+ 1, 0x1F5B, 0x1F59, 0x0300, 0,
+ 1, 0x1F5D, 0x1F59, 0x0301, 0,
+ 1, 0x1F5F, 0x1F59, 0x0342, 0,
+ 1, 0x1F60, 0x03C9, 0x0313, 0,
+ 1, 0x1F61, 0x03C9, 0x0314, 0,
+ 1, 0x1F62, 0x1F60, 0x0300, 0,
+ 1, 0x1F63, 0x1F61, 0x0300, 0,
+ 1, 0x1F64, 0x1F60, 0x0301, 0,
+ 1, 0x1F65, 0x1F61, 0x0301, 0,
+ 1, 0x1F66, 0x1F60, 0x0342, 0,
+ 1, 0x1F67, 0x1F61, 0x0342, 0,
+ 1, 0x1F68, 0x03A9, 0x0313, 0,
+ 1, 0x1F69, 0x03A9, 0x0314, 0,
+ 1, 0x1F6A, 0x1F68, 0x0300, 0,
+ 1, 0x1F6B, 0x1F69, 0x0300, 0,
+ 1, 0x1F6C, 0x1F68, 0x0301, 0,
+ 1, 0x1F6D, 0x1F69, 0x0301, 0,
+ 1, 0x1F6E, 0x1F68, 0x0342, 0,
+ 1, 0x1F6F, 0x1F69, 0x0342, 0,
+ 1, 0x1F70, 0x03B1, 0x0300, 0,
+ 1, 0x1F71, 0x03AC, 0,
+ 1, 0x1F72, 0x03B5, 0x0300, 0,
+ 1, 0x1F73, 0x03AD, 0,
+ 1, 0x1F74, 0x03B7, 0x0300, 0,
+ 1, 0x1F75, 0x03AE, 0,
+ 1, 0x1F76, 0x03B9, 0x0300, 0,
+ 1, 0x1F77, 0x03AF, 0,
+ 1, 0x1F78, 0x03BF, 0x0300, 0,
+ 1, 0x1F79, 0x03CC, 0,
+ 1, 0x1F7A, 0x03C5, 0x0300, 0,
+ 1, 0x1F7B, 0x03CD, 0,
+ 1, 0x1F7C, 0x03C9, 0x0300, 0,
+ 1, 0x1F7D, 0x03CE, 0,
+ 1, 0x1F80, 0x1F00, 0x0345, 0,
+ 1, 0x1F81, 0x1F01, 0x0345, 0,
+ 1, 0x1F82, 0x1F02, 0x0345, 0,
+ 1, 0x1F83, 0x1F03, 0x0345, 0,
+ 1, 0x1F84, 0x1F04, 0x0345, 0,
+ 1, 0x1F85, 0x1F05, 0x0345, 0,
+ 1, 0x1F86, 0x1F06, 0x0345, 0,
+ 1, 0x1F87, 0x1F07, 0x0345, 0,
+ 1, 0x1F88, 0x1F08, 0x0345, 0,
+ 1, 0x1F89, 0x1F09, 0x0345, 0,
+ 1, 0x1F8A, 0x1F0A, 0x0345, 0,
+ 1, 0x1F8B, 0x1F0B, 0x0345, 0,
+ 1, 0x1F8C, 0x1F0C, 0x0345, 0,
+ 1, 0x1F8D, 0x1F0D, 0x0345, 0,
+ 1, 0x1F8E, 0x1F0E, 0x0345, 0,
+ 1, 0x1F8F, 0x1F0F, 0x0345, 0,
+ 1, 0x1F90, 0x1F20, 0x0345, 0,
+ 1, 0x1F91, 0x1F21, 0x0345, 0,
+ 1, 0x1F92, 0x1F22, 0x0345, 0,
+ 1, 0x1F93, 0x1F23, 0x0345, 0,
+ 1, 0x1F94, 0x1F24, 0x0345, 0,
+ 1, 0x1F95, 0x1F25, 0x0345, 0,
+ 1, 0x1F96, 0x1F26, 0x0345, 0,
+ 1, 0x1F97, 0x1F27, 0x0345, 0,
+ 1, 0x1F98, 0x1F28, 0x0345, 0,
+ 1, 0x1F99, 0x1F29, 0x0345, 0,
+ 1, 0x1F9A, 0x1F2A, 0x0345, 0,
+ 1, 0x1F9B, 0x1F2B, 0x0345, 0,
+ 1, 0x1F9C, 0x1F2C, 0x0345, 0,
+ 1, 0x1F9D, 0x1F2D, 0x0345, 0,
+ 1, 0x1F9E, 0x1F2E, 0x0345, 0,
+ 1, 0x1F9F, 0x1F2F, 0x0345, 0,
+ 1, 0x1FA0, 0x1F60, 0x0345, 0,
+ 1, 0x1FA1, 0x1F61, 0x0345, 0,
+ 1, 0x1FA2, 0x1F62, 0x0345, 0,
+ 1, 0x1FA3, 0x1F63, 0x0345, 0,
+ 1, 0x1FA4, 0x1F64, 0x0345, 0,
+ 1, 0x1FA5, 0x1F65, 0x0345, 0,
+ 1, 0x1FA6, 0x1F66, 0x0345, 0,
+ 1, 0x1FA7, 0x1F67, 0x0345, 0,
+ 1, 0x1FA8, 0x1F68, 0x0345, 0,
+ 1, 0x1FA9, 0x1F69, 0x0345, 0,
+ 1, 0x1FAA, 0x1F6A, 0x0345, 0,
+ 1, 0x1FAB, 0x1F6B, 0x0345, 0,
+ 1, 0x1FAC, 0x1F6C, 0x0345, 0,
+ 1, 0x1FAD, 0x1F6D, 0x0345, 0,
+ 1, 0x1FAE, 0x1F6E, 0x0345, 0,
+ 1, 0x1FAF, 0x1F6F, 0x0345, 0,
+ 1, 0x1FB0, 0x03B1, 0x0306, 0,
+ 1, 0x1FB1, 0x03B1, 0x0304, 0,
+ 1, 0x1FB2, 0x1F70, 0x0345, 0,
+ 1, 0x1FB3, 0x03B1, 0x0345, 0,
+ 1, 0x1FB4, 0x03AC, 0x0345, 0,
+ 1, 0x1FB6, 0x03B1, 0x0342, 0,
+ 1, 0x1FB7, 0x1FB6, 0x0345, 0,
+ 1, 0x1FB8, 0x0391, 0x0306, 0,
+ 1, 0x1FB9, 0x0391, 0x0304, 0,
+ 1, 0x1FBA, 0x0391, 0x0300, 0,
+ 1, 0x1FBB, 0x0386, 0,
+ 1, 0x1FBC, 0x0391, 0x0345, 0,
+ 16, 0x1FBD, 0x0020, 0x0313, 0,
+ 1, 0x1FBE, 0x03B9, 0,
+ 16, 0x1FBF, 0x0020, 0x0313, 0,
+ 16, 0x1FC0, 0x0020, 0x0342, 0,
+ 1, 0x1FC1, 0x00A8, 0x0342, 0,
+ 1, 0x1FC2, 0x1F74, 0x0345, 0,
+ 1, 0x1FC3, 0x03B7, 0x0345, 0,
+ 1, 0x1FC4, 0x03AE, 0x0345, 0,
+ 1, 0x1FC6, 0x03B7, 0x0342, 0,
+ 1, 0x1FC7, 0x1FC6, 0x0345, 0,
+ 1, 0x1FC8, 0x0395, 0x0300, 0,
+ 1, 0x1FC9, 0x0388, 0,
+ 1, 0x1FCA, 0x0397, 0x0300, 0,
+ 1, 0x1FCB, 0x0389, 0,
+ 1, 0x1FCC, 0x0397, 0x0345, 0,
+ 1, 0x1FCD, 0x1FBF, 0x0300, 0,
+ 1, 0x1FCE, 0x1FBF, 0x0301, 0,
+ 1, 0x1FCF, 0x1FBF, 0x0342, 0,
+ 1, 0x1FD0, 0x03B9, 0x0306, 0,
+ 1, 0x1FD1, 0x03B9, 0x0304, 0,
+ 1, 0x1FD2, 0x03CA, 0x0300, 0,
+ 1, 0x1FD3, 0x0390, 0,
+ 1, 0x1FD6, 0x03B9, 0x0342, 0,
+ 1, 0x1FD7, 0x03CA, 0x0342, 0,
+ 1, 0x1FD8, 0x0399, 0x0306, 0,
+ 1, 0x1FD9, 0x0399, 0x0304, 0,
+ 1, 0x1FDA, 0x0399, 0x0300, 0,
+ 1, 0x1FDB, 0x038A, 0,
+ 1, 0x1FDD, 0x1FFE, 0x0300, 0,
+ 1, 0x1FDE, 0x1FFE, 0x0301, 0,
+ 1, 0x1FDF, 0x1FFE, 0x0342, 0,
+ 1, 0x1FE0, 0x03C5, 0x0306, 0,
+ 1, 0x1FE1, 0x03C5, 0x0304, 0,
+ 1, 0x1FE2, 0x03CB, 0x0300, 0,
+ 1, 0x1FE3, 0x03B0, 0,
+ 1, 0x1FE4, 0x03C1, 0x0313, 0,
+ 1, 0x1FE5, 0x03C1, 0x0314, 0,
+ 1, 0x1FE6, 0x03C5, 0x0342, 0,
+ 1, 0x1FE7, 0x03CB, 0x0342, 0,
+ 1, 0x1FE8, 0x03A5, 0x0306, 0,
+ 1, 0x1FE9, 0x03A5, 0x0304, 0,
+ 1, 0x1FEA, 0x03A5, 0x0300, 0,
+ 1, 0x1FEB, 0x038E, 0,
+ 1, 0x1FEC, 0x03A1, 0x0314, 0,
+ 1, 0x1FED, 0x00A8, 0x0300, 0,
+ 1, 0x1FEE, 0x0385, 0,
+ 1, 0x1FEF, 0x0060, 0,
+ 1, 0x1FF2, 0x1F7C, 0x0345, 0,
+ 1, 0x1FF3, 0x03C9, 0x0345, 0,
+ 1, 0x1FF4, 0x03CE, 0x0345, 0,
+ 1, 0x1FF6, 0x03C9, 0x0342, 0,
+ 1, 0x1FF7, 0x1FF6, 0x0345, 0,
+ 1, 0x1FF8, 0x039F, 0x0300, 0,
+ 1, 0x1FF9, 0x038C, 0,
+ 1, 0x1FFA, 0x03A9, 0x0300, 0,
+ 1, 0x1FFB, 0x038F, 0,
+ 1, 0x1FFC, 0x03A9, 0x0345, 0,
+ 1, 0x1FFD, 0x00B4, 0,
+ 16, 0x1FFE, 0x0020, 0x0314, 0,
+ 1, 0x2000, 0x2002, 0,
+ 1, 0x2001, 0x2003, 0,
+ 16, 0x2002, 0x0020, 0,
+ 16, 0x2003, 0x0020, 0,
+ 16, 0x2004, 0x0020, 0,
+ 16, 0x2005, 0x0020, 0,
+ 16, 0x2006, 0x0020, 0,
+ 3, 0x2007, 0x0020, 0,
+ 16, 0x2008, 0x0020, 0,
+ 16, 0x2009, 0x0020, 0,
+ 16, 0x200A, 0x0020, 0,
+ 3, 0x2011, 0x2010, 0,
+ 16, 0x2017, 0x0020, 0x0333, 0,
+ 16, 0x2024, 0x002E, 0,
+ 16, 0x2025, 0x002E, 0x002E, 0,
+ 16, 0x2026, 0x002E, 0x002E, 0x002E, 0,
+ 3, 0x202F, 0x0020, 0,
+ 16, 0x2033, 0x2032, 0x2032, 0,
+ 16, 0x2034, 0x2032, 0x2032, 0x2032, 0,
+ 16, 0x2036, 0x2035, 0x2035, 0,
+ 16, 0x2037, 0x2035, 0x2035, 0x2035, 0,
+ 16, 0x203C, 0x0021, 0x0021, 0,
+ 16, 0x203E, 0x0020, 0x0305, 0,
+ 16, 0x2048, 0x003F, 0x0021, 0,
+ 16, 0x2049, 0x0021, 0x003F, 0,
+ 9, 0x2070, 0x0030, 0,
+ 9, 0x2074, 0x0034, 0,
+ 9, 0x2075, 0x0035, 0,
+ 9, 0x2076, 0x0036, 0,
+ 9, 0x2077, 0x0037, 0,
+ 9, 0x2078, 0x0038, 0,
+ 9, 0x2079, 0x0039, 0,
+ 9, 0x207A, 0x002B, 0,
+ 9, 0x207B, 0x2212, 0,
+ 9, 0x207C, 0x003D, 0,
+ 9, 0x207D, 0x0028, 0,
+ 9, 0x207E, 0x0029, 0,
+ 9, 0x207F, 0x006E, 0,
+ 10, 0x2080, 0x0030, 0,
+ 10, 0x2081, 0x0031, 0,
+ 10, 0x2082, 0x0032, 0,
+ 10, 0x2083, 0x0033, 0,
+ 10, 0x2084, 0x0034, 0,
+ 10, 0x2085, 0x0035, 0,
+ 10, 0x2086, 0x0036, 0,
+ 10, 0x2087, 0x0037, 0,
+ 10, 0x2088, 0x0038, 0,
+ 10, 0x2089, 0x0039, 0,
+ 10, 0x208A, 0x002B, 0,
+ 10, 0x208B, 0x2212, 0,
+ 10, 0x208C, 0x003D, 0,
+ 10, 0x208D, 0x0028, 0,
+ 10, 0x208E, 0x0029, 0,
+ 16, 0x20A8, 0x0052, 0x0073, 0,
+ 16, 0x2100, 0x0061, 0x002F, 0x0063, 0,
+ 16, 0x2101, 0x0061, 0x002F, 0x0073, 0,
+ 2, 0x2102, 0x0043, 0,
+ 16, 0x2103, 0x00B0, 0x0043, 0,
+ 16, 0x2105, 0x0063, 0x002F, 0x006F, 0,
+ 16, 0x2106, 0x0063, 0x002F, 0x0075, 0,
+ 16, 0x2107, 0x0190, 0,
+ 16, 0x2109, 0x00B0, 0x0046, 0,
+ 2, 0x210A, 0x0067, 0,
+ 2, 0x210B, 0x0048, 0,
+ 2, 0x210C, 0x0048, 0,
+ 2, 0x210D, 0x0048, 0,
+ 2, 0x210E, 0x0068, 0,
+ 2, 0x210F, 0x0127, 0,
+ 2, 0x2110, 0x0049, 0,
+ 2, 0x2111, 0x0049, 0,
+ 2, 0x2112, 0x004C, 0,
+ 2, 0x2113, 0x006C, 0,
+ 2, 0x2115, 0x004E, 0,
+ 16, 0x2116, 0x004E, 0x006F, 0,
+ 2, 0x2119, 0x0050, 0,
+ 2, 0x211A, 0x0051, 0,
+ 2, 0x211B, 0x0052, 0,
+ 2, 0x211C, 0x0052, 0,
+ 2, 0x211D, 0x0052, 0,
+ 9, 0x2120, 0x0053, 0x004D, 0,
+ 16, 0x2121, 0x0054, 0x0045, 0x004C, 0,
+ 9, 0x2122, 0x0054, 0x004D, 0,
+ 2, 0x2124, 0x005A, 0,
+ 1, 0x2126, 0x03A9, 0,
+ 2, 0x2128, 0x005A, 0,
+ 1, 0x212A, 0x004B, 0,
+ 1, 0x212B, 0x00C5, 0,
+ 2, 0x212C, 0x0042, 0,
+ 2, 0x212D, 0x0043, 0,
+ 2, 0x212F, 0x0065, 0,
+ 2, 0x2130, 0x0045, 0,
+ 2, 0x2131, 0x0046, 0,
+ 2, 0x2133, 0x004D, 0,
+ 2, 0x2134, 0x006F, 0,
+ 16, 0x2135, 0x05D0, 0,
+ 16, 0x2136, 0x05D1, 0,
+ 16, 0x2137, 0x05D2, 0,
+ 16, 0x2138, 0x05D3, 0,
+ 2, 0x2139, 0x0069, 0,
+ 17, 0x2153, 0x0031, 0x2044, 0x0033, 0,
+ 17, 0x2154, 0x0032, 0x2044, 0x0033, 0,
+ 17, 0x2155, 0x0031, 0x2044, 0x0035, 0,
+ 17, 0x2156, 0x0032, 0x2044, 0x0035, 0,
+ 17, 0x2157, 0x0033, 0x2044, 0x0035, 0,
+ 17, 0x2158, 0x0034, 0x2044, 0x0035, 0,
+ 17, 0x2159, 0x0031, 0x2044, 0x0036, 0,
+ 17, 0x215A, 0x0035, 0x2044, 0x0036, 0,
+ 17, 0x215B, 0x0031, 0x2044, 0x0038, 0,
+ 17, 0x215C, 0x0033, 0x2044, 0x0038, 0,
+ 17, 0x215D, 0x0035, 0x2044, 0x0038, 0,
+ 17, 0x215E, 0x0037, 0x2044, 0x0038, 0,
+ 17, 0x215F, 0x0031, 0x2044, 0,
+ 16, 0x2160, 0x0049, 0,
+ 16, 0x2161, 0x0049, 0x0049, 0,
+ 16, 0x2162, 0x0049, 0x0049, 0x0049, 0,
+ 16, 0x2163, 0x0049, 0x0056, 0,
+ 16, 0x2164, 0x0056, 0,
+ 16, 0x2165, 0x0056, 0x0049, 0,
+ 16, 0x2166, 0x0056, 0x0049, 0x0049, 0,
+ 16, 0x2167, 0x0056, 0x0049, 0x0049, 0x0049, 0,
+ 16, 0x2168, 0x0049, 0x0058, 0,
+ 16, 0x2169, 0x0058, 0,
+ 16, 0x216A, 0x0058, 0x0049, 0,
+ 16, 0x216B, 0x0058, 0x0049, 0x0049, 0,
+ 16, 0x216C, 0x004C, 0,
+ 16, 0x216D, 0x0043, 0,
+ 16, 0x216E, 0x0044, 0,
+ 16, 0x216F, 0x004D, 0,
+ 16, 0x2170, 0x0069, 0,
+ 16, 0x2171, 0x0069, 0x0069, 0,
+ 16, 0x2172, 0x0069, 0x0069, 0x0069, 0,
+ 16, 0x2173, 0x0069, 0x0076, 0,
+ 16, 0x2174, 0x0076, 0,
+ 16, 0x2175, 0x0076, 0x0069, 0,
+ 16, 0x2176, 0x0076, 0x0069, 0x0069, 0,
+ 16, 0x2177, 0x0076, 0x0069, 0x0069, 0x0069, 0,
+ 16, 0x2178, 0x0069, 0x0078, 0,
+ 16, 0x2179, 0x0078, 0,
+ 16, 0x217A, 0x0078, 0x0069, 0,
+ 16, 0x217B, 0x0078, 0x0069, 0x0069, 0,
+ 16, 0x217C, 0x006C, 0,
+ 16, 0x217D, 0x0063, 0,
+ 16, 0x217E, 0x0064, 0,
+ 16, 0x217F, 0x006D, 0,
+ 1, 0x219A, 0x2190, 0x0338, 0,
+ 1, 0x219B, 0x2192, 0x0338, 0,
+ 1, 0x21AE, 0x2194, 0x0338, 0,
+ 1, 0x21CD, 0x21D0, 0x0338, 0,
+ 1, 0x21CE, 0x21D4, 0x0338, 0,
+ 1, 0x21CF, 0x21D2, 0x0338, 0,
+ 1, 0x2204, 0x2203, 0x0338, 0,
+ 1, 0x2209, 0x2208, 0x0338, 0,
+ 1, 0x220C, 0x220B, 0x0338, 0,
+ 1, 0x2224, 0x2223, 0x0338, 0,
+ 1, 0x2226, 0x2225, 0x0338, 0,
+ 16, 0x222C, 0x222B, 0x222B, 0,
+ 16, 0x222D, 0x222B, 0x222B, 0x222B, 0,
+ 16, 0x222F, 0x222E, 0x222E, 0,
+ 16, 0x2230, 0x222E, 0x222E, 0x222E, 0,
+ 1, 0x2241, 0x223C, 0x0338, 0,
+ 1, 0x2244, 0x2243, 0x0338, 0,
+ 1, 0x2247, 0x2245, 0x0338, 0,
+ 1, 0x2249, 0x2248, 0x0338, 0,
+ 1, 0x2260, 0x003D, 0x0338, 0,
+ 1, 0x2262, 0x2261, 0x0338, 0,
+ 1, 0x226D, 0x224D, 0x0338, 0,
+ 1, 0x226E, 0x003C, 0x0338, 0,
+ 1, 0x226F, 0x003E, 0x0338, 0,
+ 1, 0x2270, 0x2264, 0x0338, 0,
+ 1, 0x2271, 0x2265, 0x0338, 0,
+ 1, 0x2274, 0x2272, 0x0338, 0,
+ 1, 0x2275, 0x2273, 0x0338, 0,
+ 1, 0x2278, 0x2276, 0x0338, 0,
+ 1, 0x2279, 0x2277, 0x0338, 0,
+ 1, 0x2280, 0x227A, 0x0338, 0,
+ 1, 0x2281, 0x227B, 0x0338, 0,
+ 1, 0x2284, 0x2282, 0x0338, 0,
+ 1, 0x2285, 0x2283, 0x0338, 0,
+ 1, 0x2288, 0x2286, 0x0338, 0,
+ 1, 0x2289, 0x2287, 0x0338, 0,
+ 1, 0x22AC, 0x22A2, 0x0338, 0,
+ 1, 0x22AD, 0x22A8, 0x0338, 0,
+ 1, 0x22AE, 0x22A9, 0x0338, 0,
+ 1, 0x22AF, 0x22AB, 0x0338, 0,
+ 1, 0x22E0, 0x227C, 0x0338, 0,
+ 1, 0x22E1, 0x227D, 0x0338, 0,
+ 1, 0x22E2, 0x2291, 0x0338, 0,
+ 1, 0x22E3, 0x2292, 0x0338, 0,
+ 1, 0x22EA, 0x22B2, 0x0338, 0,
+ 1, 0x22EB, 0x22B3, 0x0338, 0,
+ 1, 0x22EC, 0x22B4, 0x0338, 0,
+ 1, 0x22ED, 0x22B5, 0x0338, 0,
+ 1, 0x2329, 0x3008, 0,
+ 1, 0x232A, 0x3009, 0,
+ 8, 0x2460, 0x0031, 0,
+ 8, 0x2461, 0x0032, 0,
+ 8, 0x2462, 0x0033, 0,
+ 8, 0x2463, 0x0034, 0,
+ 8, 0x2464, 0x0035, 0,
+ 8, 0x2465, 0x0036, 0,
+ 8, 0x2466, 0x0037, 0,
+ 8, 0x2467, 0x0038, 0,
+ 8, 0x2468, 0x0039, 0,
+ 8, 0x2469, 0x0031, 0x0030, 0,
+ 8, 0x246A, 0x0031, 0x0031, 0,
+ 8, 0x246B, 0x0031, 0x0032, 0,
+ 8, 0x246C, 0x0031, 0x0033, 0,
+ 8, 0x246D, 0x0031, 0x0034, 0,
+ 8, 0x246E, 0x0031, 0x0035, 0,
+ 8, 0x246F, 0x0031, 0x0036, 0,
+ 8, 0x2470, 0x0031, 0x0037, 0,
+ 8, 0x2471, 0x0031, 0x0038, 0,
+ 8, 0x2472, 0x0031, 0x0039, 0,
+ 8, 0x2473, 0x0032, 0x0030, 0,
+ 16, 0x2474, 0x0028, 0x0031, 0x0029, 0,
+ 16, 0x2475, 0x0028, 0x0032, 0x0029, 0,
+ 16, 0x2476, 0x0028, 0x0033, 0x0029, 0,
+ 16, 0x2477, 0x0028, 0x0034, 0x0029, 0,
+ 16, 0x2478, 0x0028, 0x0035, 0x0029, 0,
+ 16, 0x2479, 0x0028, 0x0036, 0x0029, 0,
+ 16, 0x247A, 0x0028, 0x0037, 0x0029, 0,
+ 16, 0x247B, 0x0028, 0x0038, 0x0029, 0,
+ 16, 0x247C, 0x0028, 0x0039, 0x0029, 0,
+ 16, 0x247D, 0x0028, 0x0031, 0x0030, 0x0029, 0,
+ 16, 0x247E, 0x0028, 0x0031, 0x0031, 0x0029, 0,
+ 16, 0x247F, 0x0028, 0x0031, 0x0032, 0x0029, 0,
+ 16, 0x2480, 0x0028, 0x0031, 0x0033, 0x0029, 0,
+ 16, 0x2481, 0x0028, 0x0031, 0x0034, 0x0029, 0,
+ 16, 0x2482, 0x0028, 0x0031, 0x0035, 0x0029, 0,
+ 16, 0x2483, 0x0028, 0x0031, 0x0036, 0x0029, 0,
+ 16, 0x2484, 0x0028, 0x0031, 0x0037, 0x0029, 0,
+ 16, 0x2485, 0x0028, 0x0031, 0x0038, 0x0029, 0,
+ 16, 0x2486, 0x0028, 0x0031, 0x0039, 0x0029, 0,
+ 16, 0x2487, 0x0028, 0x0032, 0x0030, 0x0029, 0,
+ 16, 0x2488, 0x0031, 0x002E, 0,
+ 16, 0x2489, 0x0032, 0x002E, 0,
+ 16, 0x248A, 0x0033, 0x002E, 0,
+ 16, 0x248B, 0x0034, 0x002E, 0,
+ 16, 0x248C, 0x0035, 0x002E, 0,
+ 16, 0x248D, 0x0036, 0x002E, 0,
+ 16, 0x248E, 0x0037, 0x002E, 0,
+ 16, 0x248F, 0x0038, 0x002E, 0,
+ 16, 0x2490, 0x0039, 0x002E, 0,
+ 16, 0x2491, 0x0031, 0x0030, 0x002E, 0,
+ 16, 0x2492, 0x0031, 0x0031, 0x002E, 0,
+ 16, 0x2493, 0x0031, 0x0032, 0x002E, 0,
+ 16, 0x2494, 0x0031, 0x0033, 0x002E, 0,
+ 16, 0x2495, 0x0031, 0x0034, 0x002E, 0,
+ 16, 0x2496, 0x0031, 0x0035, 0x002E, 0,
+ 16, 0x2497, 0x0031, 0x0036, 0x002E, 0,
+ 16, 0x2498, 0x0031, 0x0037, 0x002E, 0,
+ 16, 0x2499, 0x0031, 0x0038, 0x002E, 0,
+ 16, 0x249A, 0x0031, 0x0039, 0x002E, 0,
+ 16, 0x249B, 0x0032, 0x0030, 0x002E, 0,
+ 16, 0x249C, 0x0028, 0x0061, 0x0029, 0,
+ 16, 0x249D, 0x0028, 0x0062, 0x0029, 0,
+ 16, 0x249E, 0x0028, 0x0063, 0x0029, 0,
+ 16, 0x249F, 0x0028, 0x0064, 0x0029, 0,
+ 16, 0x24A0, 0x0028, 0x0065, 0x0029, 0,
+ 16, 0x24A1, 0x0028, 0x0066, 0x0029, 0,
+ 16, 0x24A2, 0x0028, 0x0067, 0x0029, 0,
+ 16, 0x24A3, 0x0028, 0x0068, 0x0029, 0,
+ 16, 0x24A4, 0x0028, 0x0069, 0x0029, 0,
+ 16, 0x24A5, 0x0028, 0x006A, 0x0029, 0,
+ 16, 0x24A6, 0x0028, 0x006B, 0x0029, 0,
+ 16, 0x24A7, 0x0028, 0x006C, 0x0029, 0,
+ 16, 0x24A8, 0x0028, 0x006D, 0x0029, 0,
+ 16, 0x24A9, 0x0028, 0x006E, 0x0029, 0,
+ 16, 0x24AA, 0x0028, 0x006F, 0x0029, 0,
+ 16, 0x24AB, 0x0028, 0x0070, 0x0029, 0,
+ 16, 0x24AC, 0x0028, 0x0071, 0x0029, 0,
+ 16, 0x24AD, 0x0028, 0x0072, 0x0029, 0,
+ 16, 0x24AE, 0x0028, 0x0073, 0x0029, 0,
+ 16, 0x24AF, 0x0028, 0x0074, 0x0029, 0,
+ 16, 0x24B0, 0x0028, 0x0075, 0x0029, 0,
+ 16, 0x24B1, 0x0028, 0x0076, 0x0029, 0,
+ 16, 0x24B2, 0x0028, 0x0077, 0x0029, 0,
+ 16, 0x24B3, 0x0028, 0x0078, 0x0029, 0,
+ 16, 0x24B4, 0x0028, 0x0079, 0x0029, 0,
+ 16, 0x24B5, 0x0028, 0x007A, 0x0029, 0,
+ 8, 0x24B6, 0x0041, 0,
+ 8, 0x24B7, 0x0042, 0,
+ 8, 0x24B8, 0x0043, 0,
+ 8, 0x24B9, 0x0044, 0,
+ 8, 0x24BA, 0x0045, 0,
+ 8, 0x24BB, 0x0046, 0,
+ 8, 0x24BC, 0x0047, 0,
+ 8, 0x24BD, 0x0048, 0,
+ 8, 0x24BE, 0x0049, 0,
+ 8, 0x24BF, 0x004A, 0,
+ 8, 0x24C0, 0x004B, 0,
+ 8, 0x24C1, 0x004C, 0,
+ 8, 0x24C2, 0x004D, 0,
+ 8, 0x24C3, 0x004E, 0,
+ 8, 0x24C4, 0x004F, 0,
+ 8, 0x24C5, 0x0050, 0,
+ 8, 0x24C6, 0x0051, 0,
+ 8, 0x24C7, 0x0052, 0,
+ 8, 0x24C8, 0x0053, 0,
+ 8, 0x24C9, 0x0054, 0,
+ 8, 0x24CA, 0x0055, 0,
+ 8, 0x24CB, 0x0056, 0,
+ 8, 0x24CC, 0x0057, 0,
+ 8, 0x24CD, 0x0058, 0,
+ 8, 0x24CE, 0x0059, 0,
+ 8, 0x24CF, 0x005A, 0,
+ 8, 0x24D0, 0x0061, 0,
+ 8, 0x24D1, 0x0062, 0,
+ 8, 0x24D2, 0x0063, 0,
+ 8, 0x24D3, 0x0064, 0,
+ 8, 0x24D4, 0x0065, 0,
+ 8, 0x24D5, 0x0066, 0,
+ 8, 0x24D6, 0x0067, 0,
+ 8, 0x24D7, 0x0068, 0,
+ 8, 0x24D8, 0x0069, 0,
+ 8, 0x24D9, 0x006A, 0,
+ 8, 0x24DA, 0x006B, 0,
+ 8, 0x24DB, 0x006C, 0,
+ 8, 0x24DC, 0x006D, 0,
+ 8, 0x24DD, 0x006E, 0,
+ 8, 0x24DE, 0x006F, 0,
+ 8, 0x24DF, 0x0070, 0,
+ 8, 0x24E0, 0x0071, 0,
+ 8, 0x24E1, 0x0072, 0,
+ 8, 0x24E2, 0x0073, 0,
+ 8, 0x24E3, 0x0074, 0,
+ 8, 0x24E4, 0x0075, 0,
+ 8, 0x24E5, 0x0076, 0,
+ 8, 0x24E6, 0x0077, 0,
+ 8, 0x24E7, 0x0078, 0,
+ 8, 0x24E8, 0x0079, 0,
+ 8, 0x24E9, 0x007A, 0,
+ 8, 0x24EA, 0x0030, 0,
+ 16, 0x2E9F, 0x6BCD, 0,
+ 16, 0x2EF3, 0x9F9F, 0,
+ 16, 0x2F00, 0x4E00, 0,
+ 16, 0x2F01, 0x4E28, 0,
+ 16, 0x2F02, 0x4E36, 0,
+ 16, 0x2F03, 0x4E3F, 0,
+ 16, 0x2F04, 0x4E59, 0,
+ 16, 0x2F05, 0x4E85, 0,
+ 16, 0x2F06, 0x4E8C, 0,
+ 16, 0x2F07, 0x4EA0, 0,
+ 16, 0x2F08, 0x4EBA, 0,
+ 16, 0x2F09, 0x513F, 0,
+ 16, 0x2F0A, 0x5165, 0,
+ 16, 0x2F0B, 0x516B, 0,
+ 16, 0x2F0C, 0x5182, 0,
+ 16, 0x2F0D, 0x5196, 0,
+ 16, 0x2F0E, 0x51AB, 0,
+ 16, 0x2F0F, 0x51E0, 0,
+ 16, 0x2F10, 0x51F5, 0,
+ 16, 0x2F11, 0x5200, 0,
+ 16, 0x2F12, 0x529B, 0,
+ 16, 0x2F13, 0x52F9, 0,
+ 16, 0x2F14, 0x5315, 0,
+ 16, 0x2F15, 0x531A, 0,
+ 16, 0x2F16, 0x5338, 0,
+ 16, 0x2F17, 0x5341, 0,
+ 16, 0x2F18, 0x535C, 0,
+ 16, 0x2F19, 0x5369, 0,
+ 16, 0x2F1A, 0x5382, 0,
+ 16, 0x2F1B, 0x53B6, 0,
+ 16, 0x2F1C, 0x53C8, 0,
+ 16, 0x2F1D, 0x53E3, 0,
+ 16, 0x2F1E, 0x56D7, 0,
+ 16, 0x2F1F, 0x571F, 0,
+ 16, 0x2F20, 0x58EB, 0,
+ 16, 0x2F21, 0x5902, 0,
+ 16, 0x2F22, 0x590A, 0,
+ 16, 0x2F23, 0x5915, 0,
+ 16, 0x2F24, 0x5927, 0,
+ 16, 0x2F25, 0x5973, 0,
+ 16, 0x2F26, 0x5B50, 0,
+ 16, 0x2F27, 0x5B80, 0,
+ 16, 0x2F28, 0x5BF8, 0,
+ 16, 0x2F29, 0x5C0F, 0,
+ 16, 0x2F2A, 0x5C22, 0,
+ 16, 0x2F2B, 0x5C38, 0,
+ 16, 0x2F2C, 0x5C6E, 0,
+ 16, 0x2F2D, 0x5C71, 0,
+ 16, 0x2F2E, 0x5DDB, 0,
+ 16, 0x2F2F, 0x5DE5, 0,
+ 16, 0x2F30, 0x5DF1, 0,
+ 16, 0x2F31, 0x5DFE, 0,
+ 16, 0x2F32, 0x5E72, 0,
+ 16, 0x2F33, 0x5E7A, 0,
+ 16, 0x2F34, 0x5E7F, 0,
+ 16, 0x2F35, 0x5EF4, 0,
+ 16, 0x2F36, 0x5EFE, 0,
+ 16, 0x2F37, 0x5F0B, 0,
+ 16, 0x2F38, 0x5F13, 0,
+ 16, 0x2F39, 0x5F50, 0,
+ 16, 0x2F3A, 0x5F61, 0,
+ 16, 0x2F3B, 0x5F73, 0,
+ 16, 0x2F3C, 0x5FC3, 0,
+ 16, 0x2F3D, 0x6208, 0,
+ 16, 0x2F3E, 0x6236, 0,
+ 16, 0x2F3F, 0x624B, 0,
+ 16, 0x2F40, 0x652F, 0,
+ 16, 0x2F41, 0x6534, 0,
+ 16, 0x2F42, 0x6587, 0,
+ 16, 0x2F43, 0x6597, 0,
+ 16, 0x2F44, 0x65A4, 0,
+ 16, 0x2F45, 0x65B9, 0,
+ 16, 0x2F46, 0x65E0, 0,
+ 16, 0x2F47, 0x65E5, 0,
+ 16, 0x2F48, 0x66F0, 0,
+ 16, 0x2F49, 0x6708, 0,
+ 16, 0x2F4A, 0x6728, 0,
+ 16, 0x2F4B, 0x6B20, 0,
+ 16, 0x2F4C, 0x6B62, 0,
+ 16, 0x2F4D, 0x6B79, 0,
+ 16, 0x2F4E, 0x6BB3, 0,
+ 16, 0x2F4F, 0x6BCB, 0,
+ 16, 0x2F50, 0x6BD4, 0,
+ 16, 0x2F51, 0x6BDB, 0,
+ 16, 0x2F52, 0x6C0F, 0,
+ 16, 0x2F53, 0x6C14, 0,
+ 16, 0x2F54, 0x6C34, 0,
+ 16, 0x2F55, 0x706B, 0,
+ 16, 0x2F56, 0x722A, 0,
+ 16, 0x2F57, 0x7236, 0,
+ 16, 0x2F58, 0x723B, 0,
+ 16, 0x2F59, 0x723F, 0,
+ 16, 0x2F5A, 0x7247, 0,
+ 16, 0x2F5B, 0x7259, 0,
+ 16, 0x2F5C, 0x725B, 0,
+ 16, 0x2F5D, 0x72AC, 0,
+ 16, 0x2F5E, 0x7384, 0,
+ 16, 0x2F5F, 0x7389, 0,
+ 16, 0x2F60, 0x74DC, 0,
+ 16, 0x2F61, 0x74E6, 0,
+ 16, 0x2F62, 0x7518, 0,
+ 16, 0x2F63, 0x751F, 0,
+ 16, 0x2F64, 0x7528, 0,
+ 16, 0x2F65, 0x7530, 0,
+ 16, 0x2F66, 0x758B, 0,
+ 16, 0x2F67, 0x7592, 0,
+ 16, 0x2F68, 0x7676, 0,
+ 16, 0x2F69, 0x767D, 0,
+ 16, 0x2F6A, 0x76AE, 0,
+ 16, 0x2F6B, 0x76BF, 0,
+ 16, 0x2F6C, 0x76EE, 0,
+ 16, 0x2F6D, 0x77DB, 0,
+ 16, 0x2F6E, 0x77E2, 0,
+ 16, 0x2F6F, 0x77F3, 0,
+ 16, 0x2F70, 0x793A, 0,
+ 16, 0x2F71, 0x79B8, 0,
+ 16, 0x2F72, 0x79BE, 0,
+ 16, 0x2F73, 0x7A74, 0,
+ 16, 0x2F74, 0x7ACB, 0,
+ 16, 0x2F75, 0x7AF9, 0,
+ 16, 0x2F76, 0x7C73, 0,
+ 16, 0x2F77, 0x7CF8, 0,
+ 16, 0x2F78, 0x7F36, 0,
+ 16, 0x2F79, 0x7F51, 0,
+ 16, 0x2F7A, 0x7F8A, 0,
+ 16, 0x2F7B, 0x7FBD, 0,
+ 16, 0x2F7C, 0x8001, 0,
+ 16, 0x2F7D, 0x800C, 0,
+ 16, 0x2F7E, 0x8012, 0,
+ 16, 0x2F7F, 0x8033, 0,
+ 16, 0x2F80, 0x807F, 0,
+ 16, 0x2F81, 0x8089, 0,
+ 16, 0x2F82, 0x81E3, 0,
+ 16, 0x2F83, 0x81EA, 0,
+ 16, 0x2F84, 0x81F3, 0,
+ 16, 0x2F85, 0x81FC, 0,
+ 16, 0x2F86, 0x820C, 0,
+ 16, 0x2F87, 0x821B, 0,
+ 16, 0x2F88, 0x821F, 0,
+ 16, 0x2F89, 0x826E, 0,
+ 16, 0x2F8A, 0x8272, 0,
+ 16, 0x2F8B, 0x8278, 0,
+ 16, 0x2F8C, 0x864D, 0,
+ 16, 0x2F8D, 0x866B, 0,
+ 16, 0x2F8E, 0x8840, 0,
+ 16, 0x2F8F, 0x884C, 0,
+ 16, 0x2F90, 0x8863, 0,
+ 16, 0x2F91, 0x897E, 0,
+ 16, 0x2F92, 0x898B, 0,
+ 16, 0x2F93, 0x89D2, 0,
+ 16, 0x2F94, 0x8A00, 0,
+ 16, 0x2F95, 0x8C37, 0,
+ 16, 0x2F96, 0x8C46, 0,
+ 16, 0x2F97, 0x8C55, 0,
+ 16, 0x2F98, 0x8C78, 0,
+ 16, 0x2F99, 0x8C9D, 0,
+ 16, 0x2F9A, 0x8D64, 0,
+ 16, 0x2F9B, 0x8D70, 0,
+ 16, 0x2F9C, 0x8DB3, 0,
+ 16, 0x2F9D, 0x8EAB, 0,
+ 16, 0x2F9E, 0x8ECA, 0,
+ 16, 0x2F9F, 0x8F9B, 0,
+ 16, 0x2FA0, 0x8FB0, 0,
+ 16, 0x2FA1, 0x8FB5, 0,
+ 16, 0x2FA2, 0x9091, 0,
+ 16, 0x2FA3, 0x9149, 0,
+ 16, 0x2FA4, 0x91C6, 0,
+ 16, 0x2FA5, 0x91CC, 0,
+ 16, 0x2FA6, 0x91D1, 0,
+ 16, 0x2FA7, 0x9577, 0,
+ 16, 0x2FA8, 0x9580, 0,
+ 16, 0x2FA9, 0x961C, 0,
+ 16, 0x2FAA, 0x96B6, 0,
+ 16, 0x2FAB, 0x96B9, 0,
+ 16, 0x2FAC, 0x96E8, 0,
+ 16, 0x2FAD, 0x9751, 0,
+ 16, 0x2FAE, 0x975E, 0,
+ 16, 0x2FAF, 0x9762, 0,
+ 16, 0x2FB0, 0x9769, 0,
+ 16, 0x2FB1, 0x97CB, 0,
+ 16, 0x2FB2, 0x97ED, 0,
+ 16, 0x2FB3, 0x97F3, 0,
+ 16, 0x2FB4, 0x9801, 0,
+ 16, 0x2FB5, 0x98A8, 0,
+ 16, 0x2FB6, 0x98DB, 0,
+ 16, 0x2FB7, 0x98DF, 0,
+ 16, 0x2FB8, 0x9996, 0,
+ 16, 0x2FB9, 0x9999, 0,
+ 16, 0x2FBA, 0x99AC, 0,
+ 16, 0x2FBB, 0x9AA8, 0,
+ 16, 0x2FBC, 0x9AD8, 0,
+ 16, 0x2FBD, 0x9ADF, 0,
+ 16, 0x2FBE, 0x9B25, 0,
+ 16, 0x2FBF, 0x9B2F, 0,
+ 16, 0x2FC0, 0x9B32, 0,
+ 16, 0x2FC1, 0x9B3C, 0,
+ 16, 0x2FC2, 0x9B5A, 0,
+ 16, 0x2FC3, 0x9CE5, 0,
+ 16, 0x2FC4, 0x9E75, 0,
+ 16, 0x2FC5, 0x9E7F, 0,
+ 16, 0x2FC6, 0x9EA5, 0,
+ 16, 0x2FC7, 0x9EBB, 0,
+ 16, 0x2FC8, 0x9EC3, 0,
+ 16, 0x2FC9, 0x9ECD, 0,
+ 16, 0x2FCA, 0x9ED1, 0,
+ 16, 0x2FCB, 0x9EF9, 0,
+ 16, 0x2FCC, 0x9EFD, 0,
+ 16, 0x2FCD, 0x9F0E, 0,
+ 16, 0x2FCE, 0x9F13, 0,
+ 16, 0x2FCF, 0x9F20, 0,
+ 16, 0x2FD0, 0x9F3B, 0,
+ 16, 0x2FD1, 0x9F4A, 0,
+ 16, 0x2FD2, 0x9F52, 0,
+ 16, 0x2FD3, 0x9F8D, 0,
+ 16, 0x2FD4, 0x9F9C, 0,
+ 16, 0x2FD5, 0x9FA0, 0,
+ 12, 0x3000, 0x0020, 0,
+ 16, 0x3036, 0x3012, 0,
+ 16, 0x3038, 0x5341, 0,
+ 16, 0x3039, 0x5344, 0,
+ 16, 0x303A, 0x5345, 0,
+ 1, 0x304C, 0x304B, 0x3099, 0,
+ 1, 0x304E, 0x304D, 0x3099, 0,
+ 1, 0x3050, 0x304F, 0x3099, 0,
+ 1, 0x3052, 0x3051, 0x3099, 0,
+ 1, 0x3054, 0x3053, 0x3099, 0,
+ 1, 0x3056, 0x3055, 0x3099, 0,
+ 1, 0x3058, 0x3057, 0x3099, 0,
+ 1, 0x305A, 0x3059, 0x3099, 0,
+ 1, 0x305C, 0x305B, 0x3099, 0,
+ 1, 0x305E, 0x305D, 0x3099, 0,
+ 1, 0x3060, 0x305F, 0x3099, 0,
+ 1, 0x3062, 0x3061, 0x3099, 0,
+ 1, 0x3065, 0x3064, 0x3099, 0,
+ 1, 0x3067, 0x3066, 0x3099, 0,
+ 1, 0x3069, 0x3068, 0x3099, 0,
+ 1, 0x3070, 0x306F, 0x3099, 0,
+ 1, 0x3071, 0x306F, 0x309A, 0,
+ 1, 0x3073, 0x3072, 0x3099, 0,
+ 1, 0x3074, 0x3072, 0x309A, 0,
+ 1, 0x3076, 0x3075, 0x3099, 0,
+ 1, 0x3077, 0x3075, 0x309A, 0,
+ 1, 0x3079, 0x3078, 0x3099, 0,
+ 1, 0x307A, 0x3078, 0x309A, 0,
+ 1, 0x307C, 0x307B, 0x3099, 0,
+ 1, 0x307D, 0x307B, 0x309A, 0,
+ 1, 0x3094, 0x3046, 0x3099, 0,
+ 16, 0x309B, 0x0020, 0x3099, 0,
+ 16, 0x309C, 0x0020, 0x309A, 0,
+ 1, 0x309E, 0x309D, 0x3099, 0,
+ 1, 0x30AC, 0x30AB, 0x3099, 0,
+ 1, 0x30AE, 0x30AD, 0x3099, 0,
+ 1, 0x30B0, 0x30AF, 0x3099, 0,
+ 1, 0x30B2, 0x30B1, 0x3099, 0,
+ 1, 0x30B4, 0x30B3, 0x3099, 0,
+ 1, 0x30B6, 0x30B5, 0x3099, 0,
+ 1, 0x30B8, 0x30B7, 0x3099, 0,
+ 1, 0x30BA, 0x30B9, 0x3099, 0,
+ 1, 0x30BC, 0x30BB, 0x3099, 0,
+ 1, 0x30BE, 0x30BD, 0x3099, 0,
+ 1, 0x30C0, 0x30BF, 0x3099, 0,
+ 1, 0x30C2, 0x30C1, 0x3099, 0,
+ 1, 0x30C5, 0x30C4, 0x3099, 0,
+ 1, 0x30C7, 0x30C6, 0x3099, 0,
+ 1, 0x30C9, 0x30C8, 0x3099, 0,
+ 1, 0x30D0, 0x30CF, 0x3099, 0,
+ 1, 0x30D1, 0x30CF, 0x309A, 0,
+ 1, 0x30D3, 0x30D2, 0x3099, 0,
+ 1, 0x30D4, 0x30D2, 0x309A, 0,
+ 1, 0x30D6, 0x30D5, 0x3099, 0,
+ 1, 0x30D7, 0x30D5, 0x309A, 0,
+ 1, 0x30D9, 0x30D8, 0x3099, 0,
+ 1, 0x30DA, 0x30D8, 0x309A, 0,
+ 1, 0x30DC, 0x30DB, 0x3099, 0,
+ 1, 0x30DD, 0x30DB, 0x309A, 0,
+ 1, 0x30F4, 0x30A6, 0x3099, 0,
+ 1, 0x30F7, 0x30EF, 0x3099, 0,
+ 1, 0x30F8, 0x30F0, 0x3099, 0,
+ 1, 0x30F9, 0x30F1, 0x3099, 0,
+ 1, 0x30FA, 0x30F2, 0x3099, 0,
+ 1, 0x30FE, 0x30FD, 0x3099, 0,
+ 16, 0x3131, 0x1100, 0,
+ 16, 0x3132, 0x1101, 0,
+ 16, 0x3133, 0x11AA, 0,
+ 16, 0x3134, 0x1102, 0,
+ 16, 0x3135, 0x11AC, 0,
+ 16, 0x3136, 0x11AD, 0,
+ 16, 0x3137, 0x1103, 0,
+ 16, 0x3138, 0x1104, 0,
+ 16, 0x3139, 0x1105, 0,
+ 16, 0x313A, 0x11B0, 0,
+ 16, 0x313B, 0x11B1, 0,
+ 16, 0x313C, 0x11B2, 0,
+ 16, 0x313D, 0x11B3, 0,
+ 16, 0x313E, 0x11B4, 0,
+ 16, 0x313F, 0x11B5, 0,
+ 16, 0x3140, 0x111A, 0,
+ 16, 0x3141, 0x1106, 0,
+ 16, 0x3142, 0x1107, 0,
+ 16, 0x3143, 0x1108, 0,
+ 16, 0x3144, 0x1121, 0,
+ 16, 0x3145, 0x1109, 0,
+ 16, 0x3146, 0x110A, 0,
+ 16, 0x3147, 0x110B, 0,
+ 16, 0x3148, 0x110C, 0,
+ 16, 0x3149, 0x110D, 0,
+ 16, 0x314A, 0x110E, 0,
+ 16, 0x314B, 0x110F, 0,
+ 16, 0x314C, 0x1110, 0,
+ 16, 0x314D, 0x1111, 0,
+ 16, 0x314E, 0x1112, 0,
+ 16, 0x314F, 0x1161, 0,
+ 16, 0x3150, 0x1162, 0,
+ 16, 0x3151, 0x1163, 0,
+ 16, 0x3152, 0x1164, 0,
+ 16, 0x3153, 0x1165, 0,
+ 16, 0x3154, 0x1166, 0,
+ 16, 0x3155, 0x1167, 0,
+ 16, 0x3156, 0x1168, 0,
+ 16, 0x3157, 0x1169, 0,
+ 16, 0x3158, 0x116A, 0,
+ 16, 0x3159, 0x116B, 0,
+ 16, 0x315A, 0x116C, 0,
+ 16, 0x315B, 0x116D, 0,
+ 16, 0x315C, 0x116E, 0,
+ 16, 0x315D, 0x116F, 0,
+ 16, 0x315E, 0x1170, 0,
+ 16, 0x315F, 0x1171, 0,
+ 16, 0x3160, 0x1172, 0,
+ 16, 0x3161, 0x1173, 0,
+ 16, 0x3162, 0x1174, 0,
+ 16, 0x3163, 0x1175, 0,
+ 16, 0x3164, 0x1160, 0,
+ 16, 0x3165, 0x1114, 0,
+ 16, 0x3166, 0x1115, 0,
+ 16, 0x3167, 0x11C7, 0,
+ 16, 0x3168, 0x11C8, 0,
+ 16, 0x3169, 0x11CC, 0,
+ 16, 0x316A, 0x11CE, 0,
+ 16, 0x316B, 0x11D3, 0,
+ 16, 0x316C, 0x11D7, 0,
+ 16, 0x316D, 0x11D9, 0,
+ 16, 0x316E, 0x111C, 0,
+ 16, 0x316F, 0x11DD, 0,
+ 16, 0x3170, 0x11DF, 0,
+ 16, 0x3171, 0x111D, 0,
+ 16, 0x3172, 0x111E, 0,
+ 16, 0x3173, 0x1120, 0,
+ 16, 0x3174, 0x1122, 0,
+ 16, 0x3175, 0x1123, 0,
+ 16, 0x3176, 0x1127, 0,
+ 16, 0x3177, 0x1129, 0,
+ 16, 0x3178, 0x112B, 0,
+ 16, 0x3179, 0x112C, 0,
+ 16, 0x317A, 0x112D, 0,
+ 16, 0x317B, 0x112E, 0,
+ 16, 0x317C, 0x112F, 0,
+ 16, 0x317D, 0x1132, 0,
+ 16, 0x317E, 0x1136, 0,
+ 16, 0x317F, 0x1140, 0,
+ 16, 0x3180, 0x1147, 0,
+ 16, 0x3181, 0x114C, 0,
+ 16, 0x3182, 0x11F1, 0,
+ 16, 0x3183, 0x11F2, 0,
+ 16, 0x3184, 0x1157, 0,
+ 16, 0x3185, 0x1158, 0,
+ 16, 0x3186, 0x1159, 0,
+ 16, 0x3187, 0x1184, 0,
+ 16, 0x3188, 0x1185, 0,
+ 16, 0x3189, 0x1188, 0,
+ 16, 0x318A, 0x1191, 0,
+ 16, 0x318B, 0x1192, 0,
+ 16, 0x318C, 0x1194, 0,
+ 16, 0x318D, 0x119E, 0,
+ 16, 0x318E, 0x11A1, 0,
+ 9, 0x3192, 0x4E00, 0,
+ 9, 0x3193, 0x4E8C, 0,
+ 9, 0x3194, 0x4E09, 0,
+ 9, 0x3195, 0x56DB, 0,
+ 9, 0x3196, 0x4E0A, 0,
+ 9, 0x3197, 0x4E2D, 0,
+ 9, 0x3198, 0x4E0B, 0,
+ 9, 0x3199, 0x7532, 0,
+ 9, 0x319A, 0x4E59, 0,
+ 9, 0x319B, 0x4E19, 0,
+ 9, 0x319C, 0x4E01, 0,
+ 9, 0x319D, 0x5929, 0,
+ 9, 0x319E, 0x5730, 0,
+ 9, 0x319F, 0x4EBA, 0,
+ 16, 0x3200, 0x0028, 0x1100, 0x0029, 0,
+ 16, 0x3201, 0x0028, 0x1102, 0x0029, 0,
+ 16, 0x3202, 0x0028, 0x1103, 0x0029, 0,
+ 16, 0x3203, 0x0028, 0x1105, 0x0029, 0,
+ 16, 0x3204, 0x0028, 0x1106, 0x0029, 0,
+ 16, 0x3205, 0x0028, 0x1107, 0x0029, 0,
+ 16, 0x3206, 0x0028, 0x1109, 0x0029, 0,
+ 16, 0x3207, 0x0028, 0x110B, 0x0029, 0,
+ 16, 0x3208, 0x0028, 0x110C, 0x0029, 0,
+ 16, 0x3209, 0x0028, 0x110E, 0x0029, 0,
+ 16, 0x320A, 0x0028, 0x110F, 0x0029, 0,
+ 16, 0x320B, 0x0028, 0x1110, 0x0029, 0,
+ 16, 0x320C, 0x0028, 0x1111, 0x0029, 0,
+ 16, 0x320D, 0x0028, 0x1112, 0x0029, 0,
+ 16, 0x320E, 0x0028, 0x1100, 0x1161, 0x0029, 0,
+ 16, 0x320F, 0x0028, 0x1102, 0x1161, 0x0029, 0,
+ 16, 0x3210, 0x0028, 0x1103, 0x1161, 0x0029, 0,
+ 16, 0x3211, 0x0028, 0x1105, 0x1161, 0x0029, 0,
+ 16, 0x3212, 0x0028, 0x1106, 0x1161, 0x0029, 0,
+ 16, 0x3213, 0x0028, 0x1107, 0x1161, 0x0029, 0,
+ 16, 0x3214, 0x0028, 0x1109, 0x1161, 0x0029, 0,
+ 16, 0x3215, 0x0028, 0x110B, 0x1161, 0x0029, 0,
+ 16, 0x3216, 0x0028, 0x110C, 0x1161, 0x0029, 0,
+ 16, 0x3217, 0x0028, 0x110E, 0x1161, 0x0029, 0,
+ 16, 0x3218, 0x0028, 0x110F, 0x1161, 0x0029, 0,
+ 16, 0x3219, 0x0028, 0x1110, 0x1161, 0x0029, 0,
+ 16, 0x321A, 0x0028, 0x1111, 0x1161, 0x0029, 0,
+ 16, 0x321B, 0x0028, 0x1112, 0x1161, 0x0029, 0,
+ 16, 0x321C, 0x0028, 0x110C, 0x116E, 0x0029, 0,
+ 16, 0x3220, 0x0028, 0x4E00, 0x0029, 0,
+ 16, 0x3221, 0x0028, 0x4E8C, 0x0029, 0,
+ 16, 0x3222, 0x0028, 0x4E09, 0x0029, 0,
+ 16, 0x3223, 0x0028, 0x56DB, 0x0029, 0,
+ 16, 0x3224, 0x0028, 0x4E94, 0x0029, 0,
+ 16, 0x3225, 0x0028, 0x516D, 0x0029, 0,
+ 16, 0x3226, 0x0028, 0x4E03, 0x0029, 0,
+ 16, 0x3227, 0x0028, 0x516B, 0x0029, 0,
+ 16, 0x3228, 0x0028, 0x4E5D, 0x0029, 0,
+ 16, 0x3229, 0x0028, 0x5341, 0x0029, 0,
+ 16, 0x322A, 0x0028, 0x6708, 0x0029, 0,
+ 16, 0x322B, 0x0028, 0x706B, 0x0029, 0,
+ 16, 0x322C, 0x0028, 0x6C34, 0x0029, 0,
+ 16, 0x322D, 0x0028, 0x6728, 0x0029, 0,
+ 16, 0x322E, 0x0028, 0x91D1, 0x0029, 0,
+ 16, 0x322F, 0x0028, 0x571F, 0x0029, 0,
+ 16, 0x3230, 0x0028, 0x65E5, 0x0029, 0,
+ 16, 0x3231, 0x0028, 0x682A, 0x0029, 0,
+ 16, 0x3232, 0x0028, 0x6709, 0x0029, 0,
+ 16, 0x3233, 0x0028, 0x793E, 0x0029, 0,
+ 16, 0x3234, 0x0028, 0x540D, 0x0029, 0,
+ 16, 0x3235, 0x0028, 0x7279, 0x0029, 0,
+ 16, 0x3236, 0x0028, 0x8CA1, 0x0029, 0,
+ 16, 0x3237, 0x0028, 0x795D, 0x0029, 0,
+ 16, 0x3238, 0x0028, 0x52B4, 0x0029, 0,
+ 16, 0x3239, 0x0028, 0x4EE3, 0x0029, 0,
+ 16, 0x323A, 0x0028, 0x547C, 0x0029, 0,
+ 16, 0x323B, 0x0028, 0x5B66, 0x0029, 0,
+ 16, 0x323C, 0x0028, 0x76E3, 0x0029, 0,
+ 16, 0x323D, 0x0028, 0x4F01, 0x0029, 0,
+ 16, 0x323E, 0x0028, 0x8CC7, 0x0029, 0,
+ 16, 0x323F, 0x0028, 0x5354, 0x0029, 0,
+ 16, 0x3240, 0x0028, 0x796D, 0x0029, 0,
+ 16, 0x3241, 0x0028, 0x4F11, 0x0029, 0,
+ 16, 0x3242, 0x0028, 0x81EA, 0x0029, 0,
+ 16, 0x3243, 0x0028, 0x81F3, 0x0029, 0,
+ 8, 0x3260, 0x1100, 0,
+ 8, 0x3261, 0x1102, 0,
+ 8, 0x3262, 0x1103, 0,
+ 8, 0x3263, 0x1105, 0,
+ 8, 0x3264, 0x1106, 0,
+ 8, 0x3265, 0x1107, 0,
+ 8, 0x3266, 0x1109, 0,
+ 8, 0x3267, 0x110B, 0,
+ 8, 0x3268, 0x110C, 0,
+ 8, 0x3269, 0x110E, 0,
+ 8, 0x326A, 0x110F, 0,
+ 8, 0x326B, 0x1110, 0,
+ 8, 0x326C, 0x1111, 0,
+ 8, 0x326D, 0x1112, 0,
+ 8, 0x326E, 0x1100, 0x1161, 0,
+ 8, 0x326F, 0x1102, 0x1161, 0,
+ 8, 0x3270, 0x1103, 0x1161, 0,
+ 8, 0x3271, 0x1105, 0x1161, 0,
+ 8, 0x3272, 0x1106, 0x1161, 0,
+ 8, 0x3273, 0x1107, 0x1161, 0,
+ 8, 0x3274, 0x1109, 0x1161, 0,
+ 8, 0x3275, 0x110B, 0x1161, 0,
+ 8, 0x3276, 0x110C, 0x1161, 0,
+ 8, 0x3277, 0x110E, 0x1161, 0,
+ 8, 0x3278, 0x110F, 0x1161, 0,
+ 8, 0x3279, 0x1110, 0x1161, 0,
+ 8, 0x327A, 0x1111, 0x1161, 0,
+ 8, 0x327B, 0x1112, 0x1161, 0,
+ 8, 0x3280, 0x4E00, 0,
+ 8, 0x3281, 0x4E8C, 0,
+ 8, 0x3282, 0x4E09, 0,
+ 8, 0x3283, 0x56DB, 0,
+ 8, 0x3284, 0x4E94, 0,
+ 8, 0x3285, 0x516D, 0,
+ 8, 0x3286, 0x4E03, 0,
+ 8, 0x3287, 0x516B, 0,
+ 8, 0x3288, 0x4E5D, 0,
+ 8, 0x3289, 0x5341, 0,
+ 8, 0x328A, 0x6708, 0,
+ 8, 0x328B, 0x706B, 0,
+ 8, 0x328C, 0x6C34, 0,
+ 8, 0x328D, 0x6728, 0,
+ 8, 0x328E, 0x91D1, 0,
+ 8, 0x328F, 0x571F, 0,
+ 8, 0x3290, 0x65E5, 0,
+ 8, 0x3291, 0x682A, 0,
+ 8, 0x3292, 0x6709, 0,
+ 8, 0x3293, 0x793E, 0,
+ 8, 0x3294, 0x540D, 0,
+ 8, 0x3295, 0x7279, 0,
+ 8, 0x3296, 0x8CA1, 0,
+ 8, 0x3297, 0x795D, 0,
+ 8, 0x3298, 0x52B4, 0,
+ 8, 0x3299, 0x79D8, 0,
+ 8, 0x329A, 0x7537, 0,
+ 8, 0x329B, 0x5973, 0,
+ 8, 0x329C, 0x9069, 0,
+ 8, 0x329D, 0x512A, 0,
+ 8, 0x329E, 0x5370, 0,
+ 8, 0x329F, 0x6CE8, 0,
+ 8, 0x32A0, 0x9805, 0,
+ 8, 0x32A1, 0x4F11, 0,
+ 8, 0x32A2, 0x5199, 0,
+ 8, 0x32A3, 0x6B63, 0,
+ 8, 0x32A4, 0x4E0A, 0,
+ 8, 0x32A5, 0x4E2D, 0,
+ 8, 0x32A6, 0x4E0B, 0,
+ 8, 0x32A7, 0x5DE6, 0,
+ 8, 0x32A8, 0x53F3, 0,
+ 8, 0x32A9, 0x533B, 0,
+ 8, 0x32AA, 0x5B97, 0,
+ 8, 0x32AB, 0x5B66, 0,
+ 8, 0x32AC, 0x76E3, 0,
+ 8, 0x32AD, 0x4F01, 0,
+ 8, 0x32AE, 0x8CC7, 0,
+ 8, 0x32AF, 0x5354, 0,
+ 8, 0x32B0, 0x591C, 0,
+ 16, 0x32C0, 0x0031, 0x6708, 0,
+ 16, 0x32C1, 0x0032, 0x6708, 0,
+ 16, 0x32C2, 0x0033, 0x6708, 0,
+ 16, 0x32C3, 0x0034, 0x6708, 0,
+ 16, 0x32C4, 0x0035, 0x6708, 0,
+ 16, 0x32C5, 0x0036, 0x6708, 0,
+ 16, 0x32C6, 0x0037, 0x6708, 0,
+ 16, 0x32C7, 0x0038, 0x6708, 0,
+ 16, 0x32C8, 0x0039, 0x6708, 0,
+ 16, 0x32C9, 0x0031, 0x0030, 0x6708, 0,
+ 16, 0x32CA, 0x0031, 0x0031, 0x6708, 0,
+ 16, 0x32CB, 0x0031, 0x0032, 0x6708, 0,
+ 8, 0x32D0, 0x30A2, 0,
+ 8, 0x32D1, 0x30A4, 0,
+ 8, 0x32D2, 0x30A6, 0,
+ 8, 0x32D3, 0x30A8, 0,
+ 8, 0x32D4, 0x30AA, 0,
+ 8, 0x32D5, 0x30AB, 0,
+ 8, 0x32D6, 0x30AD, 0,
+ 8, 0x32D7, 0x30AF, 0,
+ 8, 0x32D8, 0x30B1, 0,
+ 8, 0x32D9, 0x30B3, 0,
+ 8, 0x32DA, 0x30B5, 0,
+ 8, 0x32DB, 0x30B7, 0,
+ 8, 0x32DC, 0x30B9, 0,
+ 8, 0x32DD, 0x30BB, 0,
+ 8, 0x32DE, 0x30BD, 0,
+ 8, 0x32DF, 0x30BF, 0,
+ 8, 0x32E0, 0x30C1, 0,
+ 8, 0x32E1, 0x30C4, 0,
+ 8, 0x32E2, 0x30C6, 0,
+ 8, 0x32E3, 0x30C8, 0,
+ 8, 0x32E4, 0x30CA, 0,
+ 8, 0x32E5, 0x30CB, 0,
+ 8, 0x32E6, 0x30CC, 0,
+ 8, 0x32E7, 0x30CD, 0,
+ 8, 0x32E8, 0x30CE, 0,
+ 8, 0x32E9, 0x30CF, 0,
+ 8, 0x32EA, 0x30D2, 0,
+ 8, 0x32EB, 0x30D5, 0,
+ 8, 0x32EC, 0x30D8, 0,
+ 8, 0x32ED, 0x30DB, 0,
+ 8, 0x32EE, 0x30DE, 0,
+ 8, 0x32EF, 0x30DF, 0,
+ 8, 0x32F0, 0x30E0, 0,
+ 8, 0x32F1, 0x30E1, 0,
+ 8, 0x32F2, 0x30E2, 0,
+ 8, 0x32F3, 0x30E4, 0,
+ 8, 0x32F4, 0x30E6, 0,
+ 8, 0x32F5, 0x30E8, 0,
+ 8, 0x32F6, 0x30E9, 0,
+ 8, 0x32F7, 0x30EA, 0,
+ 8, 0x32F8, 0x30EB, 0,
+ 8, 0x32F9, 0x30EC, 0,
+ 8, 0x32FA, 0x30ED, 0,
+ 8, 0x32FB, 0x30EF, 0,
+ 8, 0x32FC, 0x30F0, 0,
+ 8, 0x32FD, 0x30F1, 0,
+ 8, 0x32FE, 0x30F2, 0,
+ 15, 0x3300, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0,
+ 15, 0x3301, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0,
+ 15, 0x3302, 0x30A2, 0x30F3, 0x30DA, 0x30A2, 0,
+ 15, 0x3303, 0x30A2, 0x30FC, 0x30EB, 0,
+ 15, 0x3304, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0,
+ 15, 0x3305, 0x30A4, 0x30F3, 0x30C1, 0,
+ 15, 0x3306, 0x30A6, 0x30A9, 0x30F3, 0,
+ 15, 0x3307, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0,
+ 15, 0x3308, 0x30A8, 0x30FC, 0x30AB, 0x30FC, 0,
+ 15, 0x3309, 0x30AA, 0x30F3, 0x30B9, 0,
+ 15, 0x330A, 0x30AA, 0x30FC, 0x30E0, 0,
+ 15, 0x330B, 0x30AB, 0x30A4, 0x30EA, 0,
+ 15, 0x330C, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0,
+ 15, 0x330D, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0,
+ 15, 0x330E, 0x30AC, 0x30ED, 0x30F3, 0,
+ 15, 0x330F, 0x30AC, 0x30F3, 0x30DE, 0,
+ 15, 0x3310, 0x30AE, 0x30AC, 0,
+ 15, 0x3311, 0x30AE, 0x30CB, 0x30FC, 0,
+ 15, 0x3312, 0x30AD, 0x30E5, 0x30EA, 0x30FC, 0,
+ 15, 0x3313, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0,
+ 15, 0x3314, 0x30AD, 0x30ED, 0,
+ 15, 0x3315, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0,
+ 15, 0x3316, 0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0,
+ 15, 0x3317, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0,
+ 15, 0x3318, 0x30B0, 0x30E9, 0x30E0, 0,
+ 15, 0x3319, 0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3, 0,
+ 15, 0x331A, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0,
+ 15, 0x331B, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0,
+ 15, 0x331C, 0x30B1, 0x30FC, 0x30B9, 0,
+ 15, 0x331D, 0x30B3, 0x30EB, 0x30CA, 0,
+ 15, 0x331E, 0x30B3, 0x30FC, 0x30DD, 0,
+ 15, 0x331F, 0x30B5, 0x30A4, 0x30AF, 0x30EB, 0,
+ 15, 0x3320, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0,
+ 15, 0x3321, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0,
+ 15, 0x3322, 0x30BB, 0x30F3, 0x30C1, 0,
+ 15, 0x3323, 0x30BB, 0x30F3, 0x30C8, 0,
+ 15, 0x3324, 0x30C0, 0x30FC, 0x30B9, 0,
+ 15, 0x3325, 0x30C7, 0x30B7, 0,
+ 15, 0x3326, 0x30C9, 0x30EB, 0,
+ 15, 0x3327, 0x30C8, 0x30F3, 0,
+ 15, 0x3328, 0x30CA, 0x30CE, 0,
+ 15, 0x3329, 0x30CE, 0x30C3, 0x30C8, 0,
+ 15, 0x332A, 0x30CF, 0x30A4, 0x30C4, 0,
+ 15, 0x332B, 0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8, 0,
+ 15, 0x332C, 0x30D1, 0x30FC, 0x30C4, 0,
+ 15, 0x332D, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0,
+ 15, 0x332E, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0,
+ 15, 0x332F, 0x30D4, 0x30AF, 0x30EB, 0,
+ 15, 0x3330, 0x30D4, 0x30B3, 0,
+ 15, 0x3331, 0x30D3, 0x30EB, 0,
+ 15, 0x3332, 0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9, 0,
+ 15, 0x3333, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0,
+ 15, 0x3334, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0,
+ 15, 0x3335, 0x30D5, 0x30E9, 0x30F3, 0,
+ 15, 0x3336, 0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB, 0,
+ 15, 0x3337, 0x30DA, 0x30BD, 0,
+ 15, 0x3338, 0x30DA, 0x30CB, 0x30D2, 0,
+ 15, 0x3339, 0x30D8, 0x30EB, 0x30C4, 0,
+ 15, 0x333A, 0x30DA, 0x30F3, 0x30B9, 0,
+ 15, 0x333B, 0x30DA, 0x30FC, 0x30B8, 0,
+ 15, 0x333C, 0x30D9, 0x30FC, 0x30BF, 0,
+ 15, 0x333D, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0,
+ 15, 0x333E, 0x30DC, 0x30EB, 0x30C8, 0,
+ 15, 0x333F, 0x30DB, 0x30F3, 0,
+ 15, 0x3340, 0x30DD, 0x30F3, 0x30C9, 0,
+ 15, 0x3341, 0x30DB, 0x30FC, 0x30EB, 0,
+ 15, 0x3342, 0x30DB, 0x30FC, 0x30F3, 0,
+ 15, 0x3343, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0,
+ 15, 0x3344, 0x30DE, 0x30A4, 0x30EB, 0,
+ 15, 0x3345, 0x30DE, 0x30C3, 0x30CF, 0,
+ 15, 0x3346, 0x30DE, 0x30EB, 0x30AF, 0,
+ 15, 0x3347, 0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3, 0,
+ 15, 0x3348, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0,
+ 15, 0x3349, 0x30DF, 0x30EA, 0,
+ 15, 0x334A, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0,
+ 15, 0x334B, 0x30E1, 0x30AC, 0,
+ 15, 0x334C, 0x30E1, 0x30AC, 0x30C8, 0x30F3, 0,
+ 15, 0x334D, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0,
+ 15, 0x334E, 0x30E4, 0x30FC, 0x30C9, 0,
+ 15, 0x334F, 0x30E4, 0x30FC, 0x30EB, 0,
+ 15, 0x3350, 0x30E6, 0x30A2, 0x30F3, 0,
+ 15, 0x3351, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0,
+ 15, 0x3352, 0x30EA, 0x30E9, 0,
+ 15, 0x3353, 0x30EB, 0x30D4, 0x30FC, 0,
+ 15, 0x3354, 0x30EB, 0x30FC, 0x30D6, 0x30EB, 0,
+ 15, 0x3355, 0x30EC, 0x30E0, 0,
+ 15, 0x3356, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0,
+ 15, 0x3357, 0x30EF, 0x30C3, 0x30C8, 0,
+ 16, 0x3358, 0x0030, 0x70B9, 0,
+ 16, 0x3359, 0x0031, 0x70B9, 0,
+ 16, 0x335A, 0x0032, 0x70B9, 0,
+ 16, 0x335B, 0x0033, 0x70B9, 0,
+ 16, 0x335C, 0x0034, 0x70B9, 0,
+ 16, 0x335D, 0x0035, 0x70B9, 0,
+ 16, 0x335E, 0x0036, 0x70B9, 0,
+ 16, 0x335F, 0x0037, 0x70B9, 0,
+ 16, 0x3360, 0x0038, 0x70B9, 0,
+ 16, 0x3361, 0x0039, 0x70B9, 0,
+ 16, 0x3362, 0x0031, 0x0030, 0x70B9, 0,
+ 16, 0x3363, 0x0031, 0x0031, 0x70B9, 0,
+ 16, 0x3364, 0x0031, 0x0032, 0x70B9, 0,
+ 16, 0x3365, 0x0031, 0x0033, 0x70B9, 0,
+ 16, 0x3366, 0x0031, 0x0034, 0x70B9, 0,
+ 16, 0x3367, 0x0031, 0x0035, 0x70B9, 0,
+ 16, 0x3368, 0x0031, 0x0036, 0x70B9, 0,
+ 16, 0x3369, 0x0031, 0x0037, 0x70B9, 0,
+ 16, 0x336A, 0x0031, 0x0038, 0x70B9, 0,
+ 16, 0x336B, 0x0031, 0x0039, 0x70B9, 0,
+ 16, 0x336C, 0x0032, 0x0030, 0x70B9, 0,
+ 16, 0x336D, 0x0032, 0x0031, 0x70B9, 0,
+ 16, 0x336E, 0x0032, 0x0032, 0x70B9, 0,
+ 16, 0x336F, 0x0032, 0x0033, 0x70B9, 0,
+ 16, 0x3370, 0x0032, 0x0034, 0x70B9, 0,
+ 15, 0x3371, 0x0068, 0x0050, 0x0061, 0,
+ 15, 0x3372, 0x0064, 0x0061, 0,
+ 15, 0x3373, 0x0041, 0x0055, 0,
+ 15, 0x3374, 0x0062, 0x0061, 0x0072, 0,
+ 15, 0x3375, 0x006F, 0x0056, 0,
+ 15, 0x3376, 0x0070, 0x0063, 0,
+ 15, 0x337B, 0x5E73, 0x6210, 0,
+ 15, 0x337C, 0x662D, 0x548C, 0,
+ 15, 0x337D, 0x5927, 0x6B63, 0,
+ 15, 0x337E, 0x660E, 0x6CBB, 0,
+ 15, 0x337F, 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0,
+ 15, 0x3380, 0x0070, 0x0041, 0,
+ 15, 0x3381, 0x006E, 0x0041, 0,
+ 15, 0x3382, 0x03BC, 0x0041, 0,
+ 15, 0x3383, 0x006D, 0x0041, 0,
+ 15, 0x3384, 0x006B, 0x0041, 0,
+ 15, 0x3385, 0x004B, 0x0042, 0,
+ 15, 0x3386, 0x004D, 0x0042, 0,
+ 15, 0x3387, 0x0047, 0x0042, 0,
+ 15, 0x3388, 0x0063, 0x0061, 0x006C, 0,
+ 15, 0x3389, 0x006B, 0x0063, 0x0061, 0x006C, 0,
+ 15, 0x338A, 0x0070, 0x0046, 0,
+ 15, 0x338B, 0x006E, 0x0046, 0,
+ 15, 0x338C, 0x03BC, 0x0046, 0,
+ 15, 0x338D, 0x03BC, 0x0067, 0,
+ 15, 0x338E, 0x006D, 0x0067, 0,
+ 15, 0x338F, 0x006B, 0x0067, 0,
+ 15, 0x3390, 0x0048, 0x007A, 0,
+ 15, 0x3391, 0x006B, 0x0048, 0x007A, 0,
+ 15, 0x3392, 0x004D, 0x0048, 0x007A, 0,
+ 15, 0x3393, 0x0047, 0x0048, 0x007A, 0,
+ 15, 0x3394, 0x0054, 0x0048, 0x007A, 0,
+ 15, 0x3395, 0x03BC, 0x2113, 0,
+ 15, 0x3396, 0x006D, 0x2113, 0,
+ 15, 0x3397, 0x0064, 0x2113, 0,
+ 15, 0x3398, 0x006B, 0x2113, 0,
+ 15, 0x3399, 0x0066, 0x006D, 0,
+ 15, 0x339A, 0x006E, 0x006D, 0,
+ 15, 0x339B, 0x03BC, 0x006D, 0,
+ 15, 0x339C, 0x006D, 0x006D, 0,
+ 15, 0x339D, 0x0063, 0x006D, 0,
+ 15, 0x339E, 0x006B, 0x006D, 0,
+ 15, 0x339F, 0x006D, 0x006D, 0x00B2, 0,
+ 15, 0x33A0, 0x0063, 0x006D, 0x00B2, 0,
+ 15, 0x33A1, 0x006D, 0x00B2, 0,
+ 15, 0x33A2, 0x006B, 0x006D, 0x00B2, 0,
+ 15, 0x33A3, 0x006D, 0x006D, 0x00B3, 0,
+ 15, 0x33A4, 0x0063, 0x006D, 0x00B3, 0,
+ 15, 0x33A5, 0x006D, 0x00B3, 0,
+ 15, 0x33A6, 0x006B, 0x006D, 0x00B3, 0,
+ 15, 0x33A7, 0x006D, 0x2215, 0x0073, 0,
+ 15, 0x33A8, 0x006D, 0x2215, 0x0073, 0x00B2, 0,
+ 15, 0x33A9, 0x0050, 0x0061, 0,
+ 15, 0x33AA, 0x006B, 0x0050, 0x0061, 0,
+ 15, 0x33AB, 0x004D, 0x0050, 0x0061, 0,
+ 15, 0x33AC, 0x0047, 0x0050, 0x0061, 0,
+ 15, 0x33AD, 0x0072, 0x0061, 0x0064, 0,
+ 15, 0x33AE, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0,
+ 15, 0x33AF, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2, 0,
+ 15, 0x33B0, 0x0070, 0x0073, 0,
+ 15, 0x33B1, 0x006E, 0x0073, 0,
+ 15, 0x33B2, 0x03BC, 0x0073, 0,
+ 15, 0x33B3, 0x006D, 0x0073, 0,
+ 15, 0x33B4, 0x0070, 0x0056, 0,
+ 15, 0x33B5, 0x006E, 0x0056, 0,
+ 15, 0x33B6, 0x03BC, 0x0056, 0,
+ 15, 0x33B7, 0x006D, 0x0056, 0,
+ 15, 0x33B8, 0x006B, 0x0056, 0,
+ 15, 0x33B9, 0x004D, 0x0056, 0,
+ 15, 0x33BA, 0x0070, 0x0057, 0,
+ 15, 0x33BB, 0x006E, 0x0057, 0,
+ 15, 0x33BC, 0x03BC, 0x0057, 0,
+ 15, 0x33BD, 0x006D, 0x0057, 0,
+ 15, 0x33BE, 0x006B, 0x0057, 0,
+ 15, 0x33BF, 0x004D, 0x0057, 0,
+ 15, 0x33C0, 0x006B, 0x03A9, 0,
+ 15, 0x33C1, 0x004D, 0x03A9, 0,
+ 15, 0x33C2, 0x0061, 0x002E, 0x006D, 0x002E, 0,
+ 15, 0x33C3, 0x0042, 0x0071, 0,
+ 15, 0x33C4, 0x0063, 0x0063, 0,
+ 15, 0x33C5, 0x0063, 0x0064, 0,
+ 15, 0x33C6, 0x0043, 0x2215, 0x006B, 0x0067, 0,
+ 15, 0x33C7, 0x0043, 0x006F, 0x002E, 0,
+ 15, 0x33C8, 0x0064, 0x0042, 0,
+ 15, 0x33C9, 0x0047, 0x0079, 0,
+ 15, 0x33CA, 0x0068, 0x0061, 0,
+ 15, 0x33CB, 0x0048, 0x0050, 0,
+ 15, 0x33CC, 0x0069, 0x006E, 0,
+ 15, 0x33CD, 0x004B, 0x004B, 0,
+ 15, 0x33CE, 0x004B, 0x004D, 0,
+ 15, 0x33CF, 0x006B, 0x0074, 0,
+ 15, 0x33D0, 0x006C, 0x006D, 0,
+ 15, 0x33D1, 0x006C, 0x006E, 0,
+ 15, 0x33D2, 0x006C, 0x006F, 0x0067, 0,
+ 15, 0x33D3, 0x006C, 0x0078, 0,
+ 15, 0x33D4, 0x006D, 0x0062, 0,
+ 15, 0x33D5, 0x006D, 0x0069, 0x006C, 0,
+ 15, 0x33D6, 0x006D, 0x006F, 0x006C, 0,
+ 15, 0x33D7, 0x0050, 0x0048, 0,
+ 15, 0x33D8, 0x0070, 0x002E, 0x006D, 0x002E, 0,
+ 15, 0x33D9, 0x0050, 0x0050, 0x004D, 0,
+ 15, 0x33DA, 0x0050, 0x0052, 0,
+ 15, 0x33DB, 0x0073, 0x0072, 0,
+ 15, 0x33DC, 0x0053, 0x0076, 0,
+ 15, 0x33DD, 0x0057, 0x0062, 0,
+ 16, 0x33E0, 0x0031, 0x65E5, 0,
+ 16, 0x33E1, 0x0032, 0x65E5, 0,
+ 16, 0x33E2, 0x0033, 0x65E5, 0,
+ 16, 0x33E3, 0x0034, 0x65E5, 0,
+ 16, 0x33E4, 0x0035, 0x65E5, 0,
+ 16, 0x33E5, 0x0036, 0x65E5, 0,
+ 16, 0x33E6, 0x0037, 0x65E5, 0,
+ 16, 0x33E7, 0x0038, 0x65E5, 0,
+ 16, 0x33E8, 0x0039, 0x65E5, 0,
+ 16, 0x33E9, 0x0031, 0x0030, 0x65E5, 0,
+ 16, 0x33EA, 0x0031, 0x0031, 0x65E5, 0,
+ 16, 0x33EB, 0x0031, 0x0032, 0x65E5, 0,
+ 16, 0x33EC, 0x0031, 0x0033, 0x65E5, 0,
+ 16, 0x33ED, 0x0031, 0x0034, 0x65E5, 0,
+ 16, 0x33EE, 0x0031, 0x0035, 0x65E5, 0,
+ 16, 0x33EF, 0x0031, 0x0036, 0x65E5, 0,
+ 16, 0x33F0, 0x0031, 0x0037, 0x65E5, 0,
+ 16, 0x33F1, 0x0031, 0x0038, 0x65E5, 0,
+ 16, 0x33F2, 0x0031, 0x0039, 0x65E5, 0,
+ 16, 0x33F3, 0x0032, 0x0030, 0x65E5, 0,
+ 16, 0x33F4, 0x0032, 0x0031, 0x65E5, 0,
+ 16, 0x33F5, 0x0032, 0x0032, 0x65E5, 0,
+ 16, 0x33F6, 0x0032, 0x0033, 0x65E5, 0,
+ 16, 0x33F7, 0x0032, 0x0034, 0x65E5, 0,
+ 16, 0x33F8, 0x0032, 0x0035, 0x65E5, 0,
+ 16, 0x33F9, 0x0032, 0x0036, 0x65E5, 0,
+ 16, 0x33FA, 0x0032, 0x0037, 0x65E5, 0,
+ 16, 0x33FB, 0x0032, 0x0038, 0x65E5, 0,
+ 16, 0x33FC, 0x0032, 0x0039, 0x65E5, 0,
+ 16, 0x33FD, 0x0033, 0x0030, 0x65E5, 0,
+ 16, 0x33FE, 0x0033, 0x0031, 0x65E5, 0,
+ 1, 0xF900, 0x8C48, 0,
+ 1, 0xF901, 0x66F4, 0,
+ 1, 0xF902, 0x8ECA, 0,
+ 1, 0xF903, 0x8CC8, 0,
+ 1, 0xF904, 0x6ED1, 0,
+ 1, 0xF905, 0x4E32, 0,
+ 1, 0xF906, 0x53E5, 0,
+ 1, 0xF907, 0x9F9C, 0,
+ 1, 0xF908, 0x9F9C, 0,
+ 1, 0xF909, 0x5951, 0,
+ 1, 0xF90A, 0x91D1, 0,
+ 1, 0xF90B, 0x5587, 0,
+ 1, 0xF90C, 0x5948, 0,
+ 1, 0xF90D, 0x61F6, 0,
+ 1, 0xF90E, 0x7669, 0,
+ 1, 0xF90F, 0x7F85, 0,
+ 1, 0xF910, 0x863F, 0,
+ 1, 0xF911, 0x87BA, 0,
+ 1, 0xF912, 0x88F8, 0,
+ 1, 0xF913, 0x908F, 0,
+ 1, 0xF914, 0x6A02, 0,
+ 1, 0xF915, 0x6D1B, 0,
+ 1, 0xF916, 0x70D9, 0,
+ 1, 0xF917, 0x73DE, 0,
+ 1, 0xF918, 0x843D, 0,
+ 1, 0xF919, 0x916A, 0,
+ 1, 0xF91A, 0x99F1, 0,
+ 1, 0xF91B, 0x4E82, 0,
+ 1, 0xF91C, 0x5375, 0,
+ 1, 0xF91D, 0x6B04, 0,
+ 1, 0xF91E, 0x721B, 0,
+ 1, 0xF91F, 0x862D, 0,
+ 1, 0xF920, 0x9E1E, 0,
+ 1, 0xF921, 0x5D50, 0,
+ 1, 0xF922, 0x6FEB, 0,
+ 1, 0xF923, 0x85CD, 0,
+ 1, 0xF924, 0x8964, 0,
+ 1, 0xF925, 0x62C9, 0,
+ 1, 0xF926, 0x81D8, 0,
+ 1, 0xF927, 0x881F, 0,
+ 1, 0xF928, 0x5ECA, 0,
+ 1, 0xF929, 0x6717, 0,
+ 1, 0xF92A, 0x6D6A, 0,
+ 1, 0xF92B, 0x72FC, 0,
+ 1, 0xF92C, 0x90CE, 0,
+ 1, 0xF92D, 0x4F86, 0,
+ 1, 0xF92E, 0x51B7, 0,
+ 1, 0xF92F, 0x52DE, 0,
+ 1, 0xF930, 0x64C4, 0,
+ 1, 0xF931, 0x6AD3, 0,
+ 1, 0xF932, 0x7210, 0,
+ 1, 0xF933, 0x76E7, 0,
+ 1, 0xF934, 0x8001, 0,
+ 1, 0xF935, 0x8606, 0,
+ 1, 0xF936, 0x865C, 0,
+ 1, 0xF937, 0x8DEF, 0,
+ 1, 0xF938, 0x9732, 0,
+ 1, 0xF939, 0x9B6F, 0,
+ 1, 0xF93A, 0x9DFA, 0,
+ 1, 0xF93B, 0x788C, 0,
+ 1, 0xF93C, 0x797F, 0,
+ 1, 0xF93D, 0x7DA0, 0,
+ 1, 0xF93E, 0x83C9, 0,
+ 1, 0xF93F, 0x9304, 0,
+ 1, 0xF940, 0x9E7F, 0,
+ 1, 0xF941, 0x8AD6, 0,
+ 1, 0xF942, 0x58DF, 0,
+ 1, 0xF943, 0x5F04, 0,
+ 1, 0xF944, 0x7C60, 0,
+ 1, 0xF945, 0x807E, 0,
+ 1, 0xF946, 0x7262, 0,
+ 1, 0xF947, 0x78CA, 0,
+ 1, 0xF948, 0x8CC2, 0,
+ 1, 0xF949, 0x96F7, 0,
+ 1, 0xF94A, 0x58D8, 0,
+ 1, 0xF94B, 0x5C62, 0,
+ 1, 0xF94C, 0x6A13, 0,
+ 1, 0xF94D, 0x6DDA, 0,
+ 1, 0xF94E, 0x6F0F, 0,
+ 1, 0xF94F, 0x7D2F, 0,
+ 1, 0xF950, 0x7E37, 0,
+ 1, 0xF951, 0x96FB, 0,
+ 1, 0xF952, 0x52D2, 0,
+ 1, 0xF953, 0x808B, 0,
+ 1, 0xF954, 0x51DC, 0,
+ 1, 0xF955, 0x51CC, 0,
+ 1, 0xF956, 0x7A1C, 0,
+ 1, 0xF957, 0x7DBE, 0,
+ 1, 0xF958, 0x83F1, 0,
+ 1, 0xF959, 0x9675, 0,
+ 1, 0xF95A, 0x8B80, 0,
+ 1, 0xF95B, 0x62CF, 0,
+ 1, 0xF95C, 0x6A02, 0,
+ 1, 0xF95D, 0x8AFE, 0,
+ 1, 0xF95E, 0x4E39, 0,
+ 1, 0xF95F, 0x5BE7, 0,
+ 1, 0xF960, 0x6012, 0,
+ 1, 0xF961, 0x7387, 0,
+ 1, 0xF962, 0x7570, 0,
+ 1, 0xF963, 0x5317, 0,
+ 1, 0xF964, 0x78FB, 0,
+ 1, 0xF965, 0x4FBF, 0,
+ 1, 0xF966, 0x5FA9, 0,
+ 1, 0xF967, 0x4E0D, 0,
+ 1, 0xF968, 0x6CCC, 0,
+ 1, 0xF969, 0x6578, 0,
+ 1, 0xF96A, 0x7D22, 0,
+ 1, 0xF96B, 0x53C3, 0,
+ 1, 0xF96C, 0x585E, 0,
+ 1, 0xF96D, 0x7701, 0,
+ 1, 0xF96E, 0x8449, 0,
+ 1, 0xF96F, 0x8AAA, 0,
+ 1, 0xF970, 0x6BBA, 0,
+ 1, 0xF971, 0x8FB0, 0,
+ 1, 0xF972, 0x6C88, 0,
+ 1, 0xF973, 0x62FE, 0,
+ 1, 0xF974, 0x82E5, 0,
+ 1, 0xF975, 0x63A0, 0,
+ 1, 0xF976, 0x7565, 0,
+ 1, 0xF977, 0x4EAE, 0,
+ 1, 0xF978, 0x5169, 0,
+ 1, 0xF979, 0x51C9, 0,
+ 1, 0xF97A, 0x6881, 0,
+ 1, 0xF97B, 0x7CE7, 0,
+ 1, 0xF97C, 0x826F, 0,
+ 1, 0xF97D, 0x8AD2, 0,
+ 1, 0xF97E, 0x91CF, 0,
+ 1, 0xF97F, 0x52F5, 0,
+ 1, 0xF980, 0x5442, 0,
+ 1, 0xF981, 0x5973, 0,
+ 1, 0xF982, 0x5EEC, 0,
+ 1, 0xF983, 0x65C5, 0,
+ 1, 0xF984, 0x6FFE, 0,
+ 1, 0xF985, 0x792A, 0,
+ 1, 0xF986, 0x95AD, 0,
+ 1, 0xF987, 0x9A6A, 0,
+ 1, 0xF988, 0x9E97, 0,
+ 1, 0xF989, 0x9ECE, 0,
+ 1, 0xF98A, 0x529B, 0,
+ 1, 0xF98B, 0x66C6, 0,
+ 1, 0xF98C, 0x6B77, 0,
+ 1, 0xF98D, 0x8F62, 0,
+ 1, 0xF98E, 0x5E74, 0,
+ 1, 0xF98F, 0x6190, 0,
+ 1, 0xF990, 0x6200, 0,
+ 1, 0xF991, 0x649A, 0,
+ 1, 0xF992, 0x6F23, 0,
+ 1, 0xF993, 0x7149, 0,
+ 1, 0xF994, 0x7489, 0,
+ 1, 0xF995, 0x79CA, 0,
+ 1, 0xF996, 0x7DF4, 0,
+ 1, 0xF997, 0x806F, 0,
+ 1, 0xF998, 0x8F26, 0,
+ 1, 0xF999, 0x84EE, 0,
+ 1, 0xF99A, 0x9023, 0,
+ 1, 0xF99B, 0x934A, 0,
+ 1, 0xF99C, 0x5217, 0,
+ 1, 0xF99D, 0x52A3, 0,
+ 1, 0xF99E, 0x54BD, 0,
+ 1, 0xF99F, 0x70C8, 0,
+ 1, 0xF9A0, 0x88C2, 0,
+ 1, 0xF9A1, 0x8AAA, 0,
+ 1, 0xF9A2, 0x5EC9, 0,
+ 1, 0xF9A3, 0x5FF5, 0,
+ 1, 0xF9A4, 0x637B, 0,
+ 1, 0xF9A5, 0x6BAE, 0,
+ 1, 0xF9A6, 0x7C3E, 0,
+ 1, 0xF9A7, 0x7375, 0,
+ 1, 0xF9A8, 0x4EE4, 0,
+ 1, 0xF9A9, 0x56F9, 0,
+ 1, 0xF9AA, 0x5BE7, 0,
+ 1, 0xF9AB, 0x5DBA, 0,
+ 1, 0xF9AC, 0x601C, 0,
+ 1, 0xF9AD, 0x73B2, 0,
+ 1, 0xF9AE, 0x7469, 0,
+ 1, 0xF9AF, 0x7F9A, 0,
+ 1, 0xF9B0, 0x8046, 0,
+ 1, 0xF9B1, 0x9234, 0,
+ 1, 0xF9B2, 0x96F6, 0,
+ 1, 0xF9B3, 0x9748, 0,
+ 1, 0xF9B4, 0x9818, 0,
+ 1, 0xF9B5, 0x4F8B, 0,
+ 1, 0xF9B6, 0x79AE, 0,
+ 1, 0xF9B7, 0x91B4, 0,
+ 1, 0xF9B8, 0x96B8, 0,
+ 1, 0xF9B9, 0x60E1, 0,
+ 1, 0xF9BA, 0x4E86, 0,
+ 1, 0xF9BB, 0x50DA, 0,
+ 1, 0xF9BC, 0x5BEE, 0,
+ 1, 0xF9BD, 0x5C3F, 0,
+ 1, 0xF9BE, 0x6599, 0,
+ 1, 0xF9BF, 0x6A02, 0,
+ 1, 0xF9C0, 0x71CE, 0,
+ 1, 0xF9C1, 0x7642, 0,
+ 1, 0xF9C2, 0x84FC, 0,
+ 1, 0xF9C3, 0x907C, 0,
+ 1, 0xF9C4, 0x9F8D, 0,
+ 1, 0xF9C5, 0x6688, 0,
+ 1, 0xF9C6, 0x962E, 0,
+ 1, 0xF9C7, 0x5289, 0,
+ 1, 0xF9C8, 0x677B, 0,
+ 1, 0xF9C9, 0x67F3, 0,
+ 1, 0xF9CA, 0x6D41, 0,
+ 1, 0xF9CB, 0x6E9C, 0,
+ 1, 0xF9CC, 0x7409, 0,
+ 1, 0xF9CD, 0x7559, 0,
+ 1, 0xF9CE, 0x786B, 0,
+ 1, 0xF9CF, 0x7D10, 0,
+ 1, 0xF9D0, 0x985E, 0,
+ 1, 0xF9D1, 0x516D, 0,
+ 1, 0xF9D2, 0x622E, 0,
+ 1, 0xF9D3, 0x9678, 0,
+ 1, 0xF9D4, 0x502B, 0,
+ 1, 0xF9D5, 0x5D19, 0,
+ 1, 0xF9D6, 0x6DEA, 0,
+ 1, 0xF9D7, 0x8F2A, 0,
+ 1, 0xF9D8, 0x5F8B, 0,
+ 1, 0xF9D9, 0x6144, 0,
+ 1, 0xF9DA, 0x6817, 0,
+ 1, 0xF9DB, 0x7387, 0,
+ 1, 0xF9DC, 0x9686, 0,
+ 1, 0xF9DD, 0x5229, 0,
+ 1, 0xF9DE, 0x540F, 0,
+ 1, 0xF9DF, 0x5C65, 0,
+ 1, 0xF9E0, 0x6613, 0,
+ 1, 0xF9E1, 0x674E, 0,
+ 1, 0xF9E2, 0x68A8, 0,
+ 1, 0xF9E3, 0x6CE5, 0,
+ 1, 0xF9E4, 0x7406, 0,
+ 1, 0xF9E5, 0x75E2, 0,
+ 1, 0xF9E6, 0x7F79, 0,
+ 1, 0xF9E7, 0x88CF, 0,
+ 1, 0xF9E8, 0x88E1, 0,
+ 1, 0xF9E9, 0x91CC, 0,
+ 1, 0xF9EA, 0x96E2, 0,
+ 1, 0xF9EB, 0x533F, 0,
+ 1, 0xF9EC, 0x6EBA, 0,
+ 1, 0xF9ED, 0x541D, 0,
+ 1, 0xF9EE, 0x71D0, 0,
+ 1, 0xF9EF, 0x7498, 0,
+ 1, 0xF9F0, 0x85FA, 0,
+ 1, 0xF9F1, 0x96A3, 0,
+ 1, 0xF9F2, 0x9C57, 0,
+ 1, 0xF9F3, 0x9E9F, 0,
+ 1, 0xF9F4, 0x6797, 0,
+ 1, 0xF9F5, 0x6DCB, 0,
+ 1, 0xF9F6, 0x81E8, 0,
+ 1, 0xF9F7, 0x7ACB, 0,
+ 1, 0xF9F8, 0x7B20, 0,
+ 1, 0xF9F9, 0x7C92, 0,
+ 1, 0xF9FA, 0x72C0, 0,
+ 1, 0xF9FB, 0x7099, 0,
+ 1, 0xF9FC, 0x8B58, 0,
+ 1, 0xF9FD, 0x4EC0, 0,
+ 1, 0xF9FE, 0x8336, 0,
+ 1, 0xF9FF, 0x523A, 0,
+ 1, 0xFA00, 0x5207, 0,
+ 1, 0xFA01, 0x5EA6, 0,
+ 1, 0xFA02, 0x62D3, 0,
+ 1, 0xFA03, 0x7CD6, 0,
+ 1, 0xFA04, 0x5B85, 0,
+ 1, 0xFA05, 0x6D1E, 0,
+ 1, 0xFA06, 0x66B4, 0,
+ 1, 0xFA07, 0x8F3B, 0,
+ 1, 0xFA08, 0x884C, 0,
+ 1, 0xFA09, 0x964D, 0,
+ 1, 0xFA0A, 0x898B, 0,
+ 1, 0xFA0B, 0x5ED3, 0,
+ 1, 0xFA0C, 0x5140, 0,
+ 1, 0xFA0D, 0x55C0, 0,
+ 1, 0xFA10, 0x585A, 0,
+ 1, 0xFA12, 0x6674, 0,
+ 1, 0xFA15, 0x51DE, 0,
+ 1, 0xFA16, 0x732A, 0,
+ 1, 0xFA17, 0x76CA, 0,
+ 1, 0xFA18, 0x793C, 0,
+ 1, 0xFA19, 0x795E, 0,
+ 1, 0xFA1A, 0x7965, 0,
+ 1, 0xFA1B, 0x798F, 0,
+ 1, 0xFA1C, 0x9756, 0,
+ 1, 0xFA1D, 0x7CBE, 0,
+ 1, 0xFA1E, 0x7FBD, 0,
+ 1, 0xFA20, 0x8612, 0,
+ 1, 0xFA22, 0x8AF8, 0,
+ 1, 0xFA25, 0x9038, 0,
+ 1, 0xFA26, 0x90FD, 0,
+ 1, 0xFA2A, 0x98EF, 0,
+ 1, 0xFA2B, 0x98FC, 0,
+ 1, 0xFA2C, 0x9928, 0,
+ 1, 0xFA2D, 0x9DB4, 0,
+ 16, 0xFB00, 0x0066, 0x0066, 0,
+ 16, 0xFB01, 0x0066, 0x0069, 0,
+ 16, 0xFB02, 0x0066, 0x006C, 0,
+ 16, 0xFB03, 0x0066, 0x0066, 0x0069, 0,
+ 16, 0xFB04, 0x0066, 0x0066, 0x006C, 0,
+ 16, 0xFB05, 0x017F, 0x0074, 0,
+ 16, 0xFB06, 0x0073, 0x0074, 0,
+ 16, 0xFB13, 0x0574, 0x0576, 0,
+ 16, 0xFB14, 0x0574, 0x0565, 0,
+ 16, 0xFB15, 0x0574, 0x056B, 0,
+ 16, 0xFB16, 0x057E, 0x0576, 0,
+ 16, 0xFB17, 0x0574, 0x056D, 0,
+ 1, 0xFB1D, 0x05D9, 0x05B4, 0,
+ 1, 0xFB1F, 0x05F2, 0x05B7, 0,
+ 2, 0xFB20, 0x05E2, 0,
+ 2, 0xFB21, 0x05D0, 0,
+ 2, 0xFB22, 0x05D3, 0,
+ 2, 0xFB23, 0x05D4, 0,
+ 2, 0xFB24, 0x05DB, 0,
+ 2, 0xFB25, 0x05DC, 0,
+ 2, 0xFB26, 0x05DD, 0,
+ 2, 0xFB27, 0x05E8, 0,
+ 2, 0xFB28, 0x05EA, 0,
+ 2, 0xFB29, 0x002B, 0,
+ 1, 0xFB2A, 0x05E9, 0x05C1, 0,
+ 1, 0xFB2B, 0x05E9, 0x05C2, 0,
+ 1, 0xFB2C, 0xFB49, 0x05C1, 0,
+ 1, 0xFB2D, 0xFB49, 0x05C2, 0,
+ 1, 0xFB2E, 0x05D0, 0x05B7, 0,
+ 1, 0xFB2F, 0x05D0, 0x05B8, 0,
+ 1, 0xFB30, 0x05D0, 0x05BC, 0,
+ 1, 0xFB31, 0x05D1, 0x05BC, 0,
+ 1, 0xFB32, 0x05D2, 0x05BC, 0,
+ 1, 0xFB33, 0x05D3, 0x05BC, 0,
+ 1, 0xFB34, 0x05D4, 0x05BC, 0,
+ 1, 0xFB35, 0x05D5, 0x05BC, 0,
+ 1, 0xFB36, 0x05D6, 0x05BC, 0,
+ 1, 0xFB38, 0x05D8, 0x05BC, 0,
+ 1, 0xFB39, 0x05D9, 0x05BC, 0,
+ 1, 0xFB3A, 0x05DA, 0x05BC, 0,
+ 1, 0xFB3B, 0x05DB, 0x05BC, 0,
+ 1, 0xFB3C, 0x05DC, 0x05BC, 0,
+ 1, 0xFB3E, 0x05DE, 0x05BC, 0,
+ 1, 0xFB40, 0x05E0, 0x05BC, 0,
+ 1, 0xFB41, 0x05E1, 0x05BC, 0,
+ 1, 0xFB43, 0x05E3, 0x05BC, 0,
+ 1, 0xFB44, 0x05E4, 0x05BC, 0,
+ 1, 0xFB46, 0x05E6, 0x05BC, 0,
+ 1, 0xFB47, 0x05E7, 0x05BC, 0,
+ 1, 0xFB48, 0x05E8, 0x05BC, 0,
+ 1, 0xFB49, 0x05E9, 0x05BC, 0,
+ 1, 0xFB4A, 0x05EA, 0x05BC, 0,
+ 1, 0xFB4B, 0x05D5, 0x05B9, 0,
+ 1, 0xFB4C, 0x05D1, 0x05BF, 0,
+ 1, 0xFB4D, 0x05DB, 0x05BF, 0,
+ 1, 0xFB4E, 0x05E4, 0x05BF, 0,
+ 16, 0xFB4F, 0x05D0, 0x05DC, 0,
+ 7, 0xFB50, 0x0671, 0,
+ 6, 0xFB51, 0x0671, 0,
+ 7, 0xFB52, 0x067B, 0,
+ 6, 0xFB53, 0x067B, 0,
+ 4, 0xFB54, 0x067B, 0,
+ 5, 0xFB55, 0x067B, 0,
+ 7, 0xFB56, 0x067E, 0,
+ 6, 0xFB57, 0x067E, 0,
+ 4, 0xFB58, 0x067E, 0,
+ 5, 0xFB59, 0x067E, 0,
+ 7, 0xFB5A, 0x0680, 0,
+ 6, 0xFB5B, 0x0680, 0,
+ 4, 0xFB5C, 0x0680, 0,
+ 5, 0xFB5D, 0x0680, 0,
+ 7, 0xFB5E, 0x067A, 0,
+ 6, 0xFB5F, 0x067A, 0,
+ 4, 0xFB60, 0x067A, 0,
+ 5, 0xFB61, 0x067A, 0,
+ 7, 0xFB62, 0x067F, 0,
+ 6, 0xFB63, 0x067F, 0,
+ 4, 0xFB64, 0x067F, 0,
+ 5, 0xFB65, 0x067F, 0,
+ 7, 0xFB66, 0x0679, 0,
+ 6, 0xFB67, 0x0679, 0,
+ 4, 0xFB68, 0x0679, 0,
+ 5, 0xFB69, 0x0679, 0,
+ 7, 0xFB6A, 0x06A4, 0,
+ 6, 0xFB6B, 0x06A4, 0,
+ 4, 0xFB6C, 0x06A4, 0,
+ 5, 0xFB6D, 0x06A4, 0,
+ 7, 0xFB6E, 0x06A6, 0,
+ 6, 0xFB6F, 0x06A6, 0,
+ 4, 0xFB70, 0x06A6, 0,
+ 5, 0xFB71, 0x06A6, 0,
+ 7, 0xFB72, 0x0684, 0,
+ 6, 0xFB73, 0x0684, 0,
+ 4, 0xFB74, 0x0684, 0,
+ 5, 0xFB75, 0x0684, 0,
+ 7, 0xFB76, 0x0683, 0,
+ 6, 0xFB77, 0x0683, 0,
+ 4, 0xFB78, 0x0683, 0,
+ 5, 0xFB79, 0x0683, 0,
+ 7, 0xFB7A, 0x0686, 0,
+ 6, 0xFB7B, 0x0686, 0,
+ 4, 0xFB7C, 0x0686, 0,
+ 5, 0xFB7D, 0x0686, 0,
+ 7, 0xFB7E, 0x0687, 0,
+ 6, 0xFB7F, 0x0687, 0,
+ 4, 0xFB80, 0x0687, 0,
+ 5, 0xFB81, 0x0687, 0,
+ 7, 0xFB82, 0x068D, 0,
+ 6, 0xFB83, 0x068D, 0,
+ 7, 0xFB84, 0x068C, 0,
+ 6, 0xFB85, 0x068C, 0,
+ 7, 0xFB86, 0x068E, 0,
+ 6, 0xFB87, 0x068E, 0,
+ 7, 0xFB88, 0x0688, 0,
+ 6, 0xFB89, 0x0688, 0,
+ 7, 0xFB8A, 0x0698, 0,
+ 6, 0xFB8B, 0x0698, 0,
+ 7, 0xFB8C, 0x0691, 0,
+ 6, 0xFB8D, 0x0691, 0,
+ 7, 0xFB8E, 0x06A9, 0,
+ 6, 0xFB8F, 0x06A9, 0,
+ 4, 0xFB90, 0x06A9, 0,
+ 5, 0xFB91, 0x06A9, 0,
+ 7, 0xFB92, 0x06AF, 0,
+ 6, 0xFB93, 0x06AF, 0,
+ 4, 0xFB94, 0x06AF, 0,
+ 5, 0xFB95, 0x06AF, 0,
+ 7, 0xFB96, 0x06B3, 0,
+ 6, 0xFB97, 0x06B3, 0,
+ 4, 0xFB98, 0x06B3, 0,
+ 5, 0xFB99, 0x06B3, 0,
+ 7, 0xFB9A, 0x06B1, 0,
+ 6, 0xFB9B, 0x06B1, 0,
+ 4, 0xFB9C, 0x06B1, 0,
+ 5, 0xFB9D, 0x06B1, 0,
+ 7, 0xFB9E, 0x06BA, 0,
+ 6, 0xFB9F, 0x06BA, 0,
+ 7, 0xFBA0, 0x06BB, 0,
+ 6, 0xFBA1, 0x06BB, 0,
+ 4, 0xFBA2, 0x06BB, 0,
+ 5, 0xFBA3, 0x06BB, 0,
+ 7, 0xFBA4, 0x06C0, 0,
+ 6, 0xFBA5, 0x06C0, 0,
+ 7, 0xFBA6, 0x06C1, 0,
+ 6, 0xFBA7, 0x06C1, 0,
+ 4, 0xFBA8, 0x06C1, 0,
+ 5, 0xFBA9, 0x06C1, 0,
+ 7, 0xFBAA, 0x06BE, 0,
+ 6, 0xFBAB, 0x06BE, 0,
+ 4, 0xFBAC, 0x06BE, 0,
+ 5, 0xFBAD, 0x06BE, 0,
+ 7, 0xFBAE, 0x06D2, 0,
+ 6, 0xFBAF, 0x06D2, 0,
+ 7, 0xFBB0, 0x06D3, 0,
+ 6, 0xFBB1, 0x06D3, 0,
+ 7, 0xFBD3, 0x06AD, 0,
+ 6, 0xFBD4, 0x06AD, 0,
+ 4, 0xFBD5, 0x06AD, 0,
+ 5, 0xFBD6, 0x06AD, 0,
+ 7, 0xFBD7, 0x06C7, 0,
+ 6, 0xFBD8, 0x06C7, 0,
+ 7, 0xFBD9, 0x06C6, 0,
+ 6, 0xFBDA, 0x06C6, 0,
+ 7, 0xFBDB, 0x06C8, 0,
+ 6, 0xFBDC, 0x06C8, 0,
+ 7, 0xFBDD, 0x0677, 0,
+ 7, 0xFBDE, 0x06CB, 0,
+ 6, 0xFBDF, 0x06CB, 0,
+ 7, 0xFBE0, 0x06C5, 0,
+ 6, 0xFBE1, 0x06C5, 0,
+ 7, 0xFBE2, 0x06C9, 0,
+ 6, 0xFBE3, 0x06C9, 0,
+ 7, 0xFBE4, 0x06D0, 0,
+ 6, 0xFBE5, 0x06D0, 0,
+ 4, 0xFBE6, 0x06D0, 0,
+ 5, 0xFBE7, 0x06D0, 0,
+ 4, 0xFBE8, 0x0649, 0,
+ 5, 0xFBE9, 0x0649, 0,
+ 7, 0xFBEA, 0x0626, 0x0627, 0,
+ 6, 0xFBEB, 0x0626, 0x0627, 0,
+ 7, 0xFBEC, 0x0626, 0x06D5, 0,
+ 6, 0xFBED, 0x0626, 0x06D5, 0,
+ 7, 0xFBEE, 0x0626, 0x0648, 0,
+ 6, 0xFBEF, 0x0626, 0x0648, 0,
+ 7, 0xFBF0, 0x0626, 0x06C7, 0,
+ 6, 0xFBF1, 0x0626, 0x06C7, 0,
+ 7, 0xFBF2, 0x0626, 0x06C6, 0,
+ 6, 0xFBF3, 0x0626, 0x06C6, 0,
+ 7, 0xFBF4, 0x0626, 0x06C8, 0,
+ 6, 0xFBF5, 0x0626, 0x06C8, 0,
+ 7, 0xFBF6, 0x0626, 0x06D0, 0,
+ 6, 0xFBF7, 0x0626, 0x06D0, 0,
+ 4, 0xFBF8, 0x0626, 0x06D0, 0,
+ 7, 0xFBF9, 0x0626, 0x0649, 0,
+ 6, 0xFBFA, 0x0626, 0x0649, 0,
+ 4, 0xFBFB, 0x0626, 0x0649, 0,
+ 7, 0xFBFC, 0x06CC, 0,
+ 6, 0xFBFD, 0x06CC, 0,
+ 4, 0xFBFE, 0x06CC, 0,
+ 5, 0xFBFF, 0x06CC, 0,
+ 7, 0xFC00, 0x0626, 0x062C, 0,
+ 7, 0xFC01, 0x0626, 0x062D, 0,
+ 7, 0xFC02, 0x0626, 0x0645, 0,
+ 7, 0xFC03, 0x0626, 0x0649, 0,
+ 7, 0xFC04, 0x0626, 0x064A, 0,
+ 7, 0xFC05, 0x0628, 0x062C, 0,
+ 7, 0xFC06, 0x0628, 0x062D, 0,
+ 7, 0xFC07, 0x0628, 0x062E, 0,
+ 7, 0xFC08, 0x0628, 0x0645, 0,
+ 7, 0xFC09, 0x0628, 0x0649, 0,
+ 7, 0xFC0A, 0x0628, 0x064A, 0,
+ 7, 0xFC0B, 0x062A, 0x062C, 0,
+ 7, 0xFC0C, 0x062A, 0x062D, 0,
+ 7, 0xFC0D, 0x062A, 0x062E, 0,
+ 7, 0xFC0E, 0x062A, 0x0645, 0,
+ 7, 0xFC0F, 0x062A, 0x0649, 0,
+ 7, 0xFC10, 0x062A, 0x064A, 0,
+ 7, 0xFC11, 0x062B, 0x062C, 0,
+ 7, 0xFC12, 0x062B, 0x0645, 0,
+ 7, 0xFC13, 0x062B, 0x0649, 0,
+ 7, 0xFC14, 0x062B, 0x064A, 0,
+ 7, 0xFC15, 0x062C, 0x062D, 0,
+ 7, 0xFC16, 0x062C, 0x0645, 0,
+ 7, 0xFC17, 0x062D, 0x062C, 0,
+ 7, 0xFC18, 0x062D, 0x0645, 0,
+ 7, 0xFC19, 0x062E, 0x062C, 0,
+ 7, 0xFC1A, 0x062E, 0x062D, 0,
+ 7, 0xFC1B, 0x062E, 0x0645, 0,
+ 7, 0xFC1C, 0x0633, 0x062C, 0,
+ 7, 0xFC1D, 0x0633, 0x062D, 0,
+ 7, 0xFC1E, 0x0633, 0x062E, 0,
+ 7, 0xFC1F, 0x0633, 0x0645, 0,
+ 7, 0xFC20, 0x0635, 0x062D, 0,
+ 7, 0xFC21, 0x0635, 0x0645, 0,
+ 7, 0xFC22, 0x0636, 0x062C, 0,
+ 7, 0xFC23, 0x0636, 0x062D, 0,
+ 7, 0xFC24, 0x0636, 0x062E, 0,
+ 7, 0xFC25, 0x0636, 0x0645, 0,
+ 7, 0xFC26, 0x0637, 0x062D, 0,
+ 7, 0xFC27, 0x0637, 0x0645, 0,
+ 7, 0xFC28, 0x0638, 0x0645, 0,
+ 7, 0xFC29, 0x0639, 0x062C, 0,
+ 7, 0xFC2A, 0x0639, 0x0645, 0,
+ 7, 0xFC2B, 0x063A, 0x062C, 0,
+ 7, 0xFC2C, 0x063A, 0x0645, 0,
+ 7, 0xFC2D, 0x0641, 0x062C, 0,
+ 7, 0xFC2E, 0x0641, 0x062D, 0,
+ 7, 0xFC2F, 0x0641, 0x062E, 0,
+ 7, 0xFC30, 0x0641, 0x0645, 0,
+ 7, 0xFC31, 0x0641, 0x0649, 0,
+ 7, 0xFC32, 0x0641, 0x064A, 0,
+ 7, 0xFC33, 0x0642, 0x062D, 0,
+ 7, 0xFC34, 0x0642, 0x0645, 0,
+ 7, 0xFC35, 0x0642, 0x0649, 0,
+ 7, 0xFC36, 0x0642, 0x064A, 0,
+ 7, 0xFC37, 0x0643, 0x0627, 0,
+ 7, 0xFC38, 0x0643, 0x062C, 0,
+ 7, 0xFC39, 0x0643, 0x062D, 0,
+ 7, 0xFC3A, 0x0643, 0x062E, 0,
+ 7, 0xFC3B, 0x0643, 0x0644, 0,
+ 7, 0xFC3C, 0x0643, 0x0645, 0,
+ 7, 0xFC3D, 0x0643, 0x0649, 0,
+ 7, 0xFC3E, 0x0643, 0x064A, 0,
+ 7, 0xFC3F, 0x0644, 0x062C, 0,
+ 7, 0xFC40, 0x0644, 0x062D, 0,
+ 7, 0xFC41, 0x0644, 0x062E, 0,
+ 7, 0xFC42, 0x0644, 0x0645, 0,
+ 7, 0xFC43, 0x0644, 0x0649, 0,
+ 7, 0xFC44, 0x0644, 0x064A, 0,
+ 7, 0xFC45, 0x0645, 0x062C, 0,
+ 7, 0xFC46, 0x0645, 0x062D, 0,
+ 7, 0xFC47, 0x0645, 0x062E, 0,
+ 7, 0xFC48, 0x0645, 0x0645, 0,
+ 7, 0xFC49, 0x0645, 0x0649, 0,
+ 7, 0xFC4A, 0x0645, 0x064A, 0,
+ 7, 0xFC4B, 0x0646, 0x062C, 0,
+ 7, 0xFC4C, 0x0646, 0x062D, 0,
+ 7, 0xFC4D, 0x0646, 0x062E, 0,
+ 7, 0xFC4E, 0x0646, 0x0645, 0,
+ 7, 0xFC4F, 0x0646, 0x0649, 0,
+ 7, 0xFC50, 0x0646, 0x064A, 0,
+ 7, 0xFC51, 0x0647, 0x062C, 0,
+ 7, 0xFC52, 0x0647, 0x0645, 0,
+ 7, 0xFC53, 0x0647, 0x0649, 0,
+ 7, 0xFC54, 0x0647, 0x064A, 0,
+ 7, 0xFC55, 0x064A, 0x062C, 0,
+ 7, 0xFC56, 0x064A, 0x062D, 0,
+ 7, 0xFC57, 0x064A, 0x062E, 0,
+ 7, 0xFC58, 0x064A, 0x0645, 0,
+ 7, 0xFC59, 0x064A, 0x0649, 0,
+ 7, 0xFC5A, 0x064A, 0x064A, 0,
+ 7, 0xFC5B, 0x0630, 0x0670, 0,
+ 7, 0xFC5C, 0x0631, 0x0670, 0,
+ 7, 0xFC5D, 0x0649, 0x0670, 0,
+ 7, 0xFC5E, 0x0020, 0x064C, 0x0651, 0,
+ 7, 0xFC5F, 0x0020, 0x064D, 0x0651, 0,
+ 7, 0xFC60, 0x0020, 0x064E, 0x0651, 0,
+ 7, 0xFC61, 0x0020, 0x064F, 0x0651, 0,
+ 7, 0xFC62, 0x0020, 0x0650, 0x0651, 0,
+ 7, 0xFC63, 0x0020, 0x0651, 0x0670, 0,
+ 6, 0xFC64, 0x0626, 0x0631, 0,
+ 6, 0xFC65, 0x0626, 0x0632, 0,
+ 6, 0xFC66, 0x0626, 0x0645, 0,
+ 6, 0xFC67, 0x0626, 0x0646, 0,
+ 6, 0xFC68, 0x0626, 0x0649, 0,
+ 6, 0xFC69, 0x0626, 0x064A, 0,
+ 6, 0xFC6A, 0x0628, 0x0631, 0,
+ 6, 0xFC6B, 0x0628, 0x0632, 0,
+ 6, 0xFC6C, 0x0628, 0x0645, 0,
+ 6, 0xFC6D, 0x0628, 0x0646, 0,
+ 6, 0xFC6E, 0x0628, 0x0649, 0,
+ 6, 0xFC6F, 0x0628, 0x064A, 0,
+ 6, 0xFC70, 0x062A, 0x0631, 0,
+ 6, 0xFC71, 0x062A, 0x0632, 0,
+ 6, 0xFC72, 0x062A, 0x0645, 0,
+ 6, 0xFC73, 0x062A, 0x0646, 0,
+ 6, 0xFC74, 0x062A, 0x0649, 0,
+ 6, 0xFC75, 0x062A, 0x064A, 0,
+ 6, 0xFC76, 0x062B, 0x0631, 0,
+ 6, 0xFC77, 0x062B, 0x0632, 0,
+ 6, 0xFC78, 0x062B, 0x0645, 0,
+ 6, 0xFC79, 0x062B, 0x0646, 0,
+ 6, 0xFC7A, 0x062B, 0x0649, 0,
+ 6, 0xFC7B, 0x062B, 0x064A, 0,
+ 6, 0xFC7C, 0x0641, 0x0649, 0,
+ 6, 0xFC7D, 0x0641, 0x064A, 0,
+ 6, 0xFC7E, 0x0642, 0x0649, 0,
+ 6, 0xFC7F, 0x0642, 0x064A, 0,
+ 6, 0xFC80, 0x0643, 0x0627, 0,
+ 6, 0xFC81, 0x0643, 0x0644, 0,
+ 6, 0xFC82, 0x0643, 0x0645, 0,
+ 6, 0xFC83, 0x0643, 0x0649, 0,
+ 6, 0xFC84, 0x0643, 0x064A, 0,
+ 6, 0xFC85, 0x0644, 0x0645, 0,
+ 6, 0xFC86, 0x0644, 0x0649, 0,
+ 6, 0xFC87, 0x0644, 0x064A, 0,
+ 6, 0xFC88, 0x0645, 0x0627, 0,
+ 6, 0xFC89, 0x0645, 0x0645, 0,
+ 6, 0xFC8A, 0x0646, 0x0631, 0,
+ 6, 0xFC8B, 0x0646, 0x0632, 0,
+ 6, 0xFC8C, 0x0646, 0x0645, 0,
+ 6, 0xFC8D, 0x0646, 0x0646, 0,
+ 6, 0xFC8E, 0x0646, 0x0649, 0,
+ 6, 0xFC8F, 0x0646, 0x064A, 0,
+ 6, 0xFC90, 0x0649, 0x0670, 0,
+ 6, 0xFC91, 0x064A, 0x0631, 0,
+ 6, 0xFC92, 0x064A, 0x0632, 0,
+ 6, 0xFC93, 0x064A, 0x0645, 0,
+ 6, 0xFC94, 0x064A, 0x0646, 0,
+ 6, 0xFC95, 0x064A, 0x0649, 0,
+ 6, 0xFC96, 0x064A, 0x064A, 0,
+ 4, 0xFC97, 0x0626, 0x062C, 0,
+ 4, 0xFC98, 0x0626, 0x062D, 0,
+ 4, 0xFC99, 0x0626, 0x062E, 0,
+ 4, 0xFC9A, 0x0626, 0x0645, 0,
+ 4, 0xFC9B, 0x0626, 0x0647, 0,
+ 4, 0xFC9C, 0x0628, 0x062C, 0,
+ 4, 0xFC9D, 0x0628, 0x062D, 0,
+ 4, 0xFC9E, 0x0628, 0x062E, 0,
+ 4, 0xFC9F, 0x0628, 0x0645, 0,
+ 4, 0xFCA0, 0x0628, 0x0647, 0,
+ 4, 0xFCA1, 0x062A, 0x062C, 0,
+ 4, 0xFCA2, 0x062A, 0x062D, 0,
+ 4, 0xFCA3, 0x062A, 0x062E, 0,
+ 4, 0xFCA4, 0x062A, 0x0645, 0,
+ 4, 0xFCA5, 0x062A, 0x0647, 0,
+ 4, 0xFCA6, 0x062B, 0x0645, 0,
+ 4, 0xFCA7, 0x062C, 0x062D, 0,
+ 4, 0xFCA8, 0x062C, 0x0645, 0,
+ 4, 0xFCA9, 0x062D, 0x062C, 0,
+ 4, 0xFCAA, 0x062D, 0x0645, 0,
+ 4, 0xFCAB, 0x062E, 0x062C, 0,
+ 4, 0xFCAC, 0x062E, 0x0645, 0,
+ 4, 0xFCAD, 0x0633, 0x062C, 0,
+ 4, 0xFCAE, 0x0633, 0x062D, 0,
+ 4, 0xFCAF, 0x0633, 0x062E, 0,
+ 4, 0xFCB0, 0x0633, 0x0645, 0,
+ 4, 0xFCB1, 0x0635, 0x062D, 0,
+ 4, 0xFCB2, 0x0635, 0x062E, 0,
+ 4, 0xFCB3, 0x0635, 0x0645, 0,
+ 4, 0xFCB4, 0x0636, 0x062C, 0,
+ 4, 0xFCB5, 0x0636, 0x062D, 0,
+ 4, 0xFCB6, 0x0636, 0x062E, 0,
+ 4, 0xFCB7, 0x0636, 0x0645, 0,
+ 4, 0xFCB8, 0x0637, 0x062D, 0,
+ 4, 0xFCB9, 0x0638, 0x0645, 0,
+ 4, 0xFCBA, 0x0639, 0x062C, 0,
+ 4, 0xFCBB, 0x0639, 0x0645, 0,
+ 4, 0xFCBC, 0x063A, 0x062C, 0,
+ 4, 0xFCBD, 0x063A, 0x0645, 0,
+ 4, 0xFCBE, 0x0641, 0x062C, 0,
+ 4, 0xFCBF, 0x0641, 0x062D, 0,
+ 4, 0xFCC0, 0x0641, 0x062E, 0,
+ 4, 0xFCC1, 0x0641, 0x0645, 0,
+ 4, 0xFCC2, 0x0642, 0x062D, 0,
+ 4, 0xFCC3, 0x0642, 0x0645, 0,
+ 4, 0xFCC4, 0x0643, 0x062C, 0,
+ 4, 0xFCC5, 0x0643, 0x062D, 0,
+ 4, 0xFCC6, 0x0643, 0x062E, 0,
+ 4, 0xFCC7, 0x0643, 0x0644, 0,
+ 4, 0xFCC8, 0x0643, 0x0645, 0,
+ 4, 0xFCC9, 0x0644, 0x062C, 0,
+ 4, 0xFCCA, 0x0644, 0x062D, 0,
+ 4, 0xFCCB, 0x0644, 0x062E, 0,
+ 4, 0xFCCC, 0x0644, 0x0645, 0,
+ 4, 0xFCCD, 0x0644, 0x0647, 0,
+ 4, 0xFCCE, 0x0645, 0x062C, 0,
+ 4, 0xFCCF, 0x0645, 0x062D, 0,
+ 4, 0xFCD0, 0x0645, 0x062E, 0,
+ 4, 0xFCD1, 0x0645, 0x0645, 0,
+ 4, 0xFCD2, 0x0646, 0x062C, 0,
+ 4, 0xFCD3, 0x0646, 0x062D, 0,
+ 4, 0xFCD4, 0x0646, 0x062E, 0,
+ 4, 0xFCD5, 0x0646, 0x0645, 0,
+ 4, 0xFCD6, 0x0646, 0x0647, 0,
+ 4, 0xFCD7, 0x0647, 0x062C, 0,
+ 4, 0xFCD8, 0x0647, 0x0645, 0,
+ 4, 0xFCD9, 0x0647, 0x0670, 0,
+ 4, 0xFCDA, 0x064A, 0x062C, 0,
+ 4, 0xFCDB, 0x064A, 0x062D, 0,
+ 4, 0xFCDC, 0x064A, 0x062E, 0,
+ 4, 0xFCDD, 0x064A, 0x0645, 0,
+ 4, 0xFCDE, 0x064A, 0x0647, 0,
+ 5, 0xFCDF, 0x0626, 0x0645, 0,
+ 5, 0xFCE0, 0x0626, 0x0647, 0,
+ 5, 0xFCE1, 0x0628, 0x0645, 0,
+ 5, 0xFCE2, 0x0628, 0x0647, 0,
+ 5, 0xFCE3, 0x062A, 0x0645, 0,
+ 5, 0xFCE4, 0x062A, 0x0647, 0,
+ 5, 0xFCE5, 0x062B, 0x0645, 0,
+ 5, 0xFCE6, 0x062B, 0x0647, 0,
+ 5, 0xFCE7, 0x0633, 0x0645, 0,
+ 5, 0xFCE8, 0x0633, 0x0647, 0,
+ 5, 0xFCE9, 0x0634, 0x0645, 0,
+ 5, 0xFCEA, 0x0634, 0x0647, 0,
+ 5, 0xFCEB, 0x0643, 0x0644, 0,
+ 5, 0xFCEC, 0x0643, 0x0645, 0,
+ 5, 0xFCED, 0x0644, 0x0645, 0,
+ 5, 0xFCEE, 0x0646, 0x0645, 0,
+ 5, 0xFCEF, 0x0646, 0x0647, 0,
+ 5, 0xFCF0, 0x064A, 0x0645, 0,
+ 5, 0xFCF1, 0x064A, 0x0647, 0,
+ 5, 0xFCF2, 0x0640, 0x064E, 0x0651, 0,
+ 5, 0xFCF3, 0x0640, 0x064F, 0x0651, 0,
+ 5, 0xFCF4, 0x0640, 0x0650, 0x0651, 0,
+ 7, 0xFCF5, 0x0637, 0x0649, 0,
+ 7, 0xFCF6, 0x0637, 0x064A, 0,
+ 7, 0xFCF7, 0x0639, 0x0649, 0,
+ 7, 0xFCF8, 0x0639, 0x064A, 0,
+ 7, 0xFCF9, 0x063A, 0x0649, 0,
+ 7, 0xFCFA, 0x063A, 0x064A, 0,
+ 7, 0xFCFB, 0x0633, 0x0649, 0,
+ 7, 0xFCFC, 0x0633, 0x064A, 0,
+ 7, 0xFCFD, 0x0634, 0x0649, 0,
+ 7, 0xFCFE, 0x0634, 0x064A, 0,
+ 7, 0xFCFF, 0x062D, 0x0649, 0,
+ 7, 0xFD00, 0x062D, 0x064A, 0,
+ 7, 0xFD01, 0x062C, 0x0649, 0,
+ 7, 0xFD02, 0x062C, 0x064A, 0,
+ 7, 0xFD03, 0x062E, 0x0649, 0,
+ 7, 0xFD04, 0x062E, 0x064A, 0,
+ 7, 0xFD05, 0x0635, 0x0649, 0,
+ 7, 0xFD06, 0x0635, 0x064A, 0,
+ 7, 0xFD07, 0x0636, 0x0649, 0,
+ 7, 0xFD08, 0x0636, 0x064A, 0,
+ 7, 0xFD09, 0x0634, 0x062C, 0,
+ 7, 0xFD0A, 0x0634, 0x062D, 0,
+ 7, 0xFD0B, 0x0634, 0x062E, 0,
+ 7, 0xFD0C, 0x0634, 0x0645, 0,
+ 7, 0xFD0D, 0x0634, 0x0631, 0,
+ 7, 0xFD0E, 0x0633, 0x0631, 0,
+ 7, 0xFD0F, 0x0635, 0x0631, 0,
+ 7, 0xFD10, 0x0636, 0x0631, 0,
+ 6, 0xFD11, 0x0637, 0x0649, 0,
+ 6, 0xFD12, 0x0637, 0x064A, 0,
+ 6, 0xFD13, 0x0639, 0x0649, 0,
+ 6, 0xFD14, 0x0639, 0x064A, 0,
+ 6, 0xFD15, 0x063A, 0x0649, 0,
+ 6, 0xFD16, 0x063A, 0x064A, 0,
+ 6, 0xFD17, 0x0633, 0x0649, 0,
+ 6, 0xFD18, 0x0633, 0x064A, 0,
+ 6, 0xFD19, 0x0634, 0x0649, 0,
+ 6, 0xFD1A, 0x0634, 0x064A, 0,
+ 6, 0xFD1B, 0x062D, 0x0649, 0,
+ 6, 0xFD1C, 0x062D, 0x064A, 0,
+ 6, 0xFD1D, 0x062C, 0x0649, 0,
+ 6, 0xFD1E, 0x062C, 0x064A, 0,
+ 6, 0xFD1F, 0x062E, 0x0649, 0,
+ 6, 0xFD20, 0x062E, 0x064A, 0,
+ 6, 0xFD21, 0x0635, 0x0649, 0,
+ 6, 0xFD22, 0x0635, 0x064A, 0,
+ 6, 0xFD23, 0x0636, 0x0649, 0,
+ 6, 0xFD24, 0x0636, 0x064A, 0,
+ 6, 0xFD25, 0x0634, 0x062C, 0,
+ 6, 0xFD26, 0x0634, 0x062D, 0,
+ 6, 0xFD27, 0x0634, 0x062E, 0,
+ 6, 0xFD28, 0x0634, 0x0645, 0,
+ 6, 0xFD29, 0x0634, 0x0631, 0,
+ 6, 0xFD2A, 0x0633, 0x0631, 0,
+ 6, 0xFD2B, 0x0635, 0x0631, 0,
+ 6, 0xFD2C, 0x0636, 0x0631, 0,
+ 4, 0xFD2D, 0x0634, 0x062C, 0,
+ 4, 0xFD2E, 0x0634, 0x062D, 0,
+ 4, 0xFD2F, 0x0634, 0x062E, 0,
+ 4, 0xFD30, 0x0634, 0x0645, 0,
+ 4, 0xFD31, 0x0633, 0x0647, 0,
+ 4, 0xFD32, 0x0634, 0x0647, 0,
+ 4, 0xFD33, 0x0637, 0x0645, 0,
+ 5, 0xFD34, 0x0633, 0x062C, 0,
+ 5, 0xFD35, 0x0633, 0x062D, 0,
+ 5, 0xFD36, 0x0633, 0x062E, 0,
+ 5, 0xFD37, 0x0634, 0x062C, 0,
+ 5, 0xFD38, 0x0634, 0x062D, 0,
+ 5, 0xFD39, 0x0634, 0x062E, 0,
+ 5, 0xFD3A, 0x0637, 0x0645, 0,
+ 5, 0xFD3B, 0x0638, 0x0645, 0,
+ 6, 0xFD3C, 0x0627, 0x064B, 0,
+ 7, 0xFD3D, 0x0627, 0x064B, 0,
+ 4, 0xFD50, 0x062A, 0x062C, 0x0645, 0,
+ 6, 0xFD51, 0x062A, 0x062D, 0x062C, 0,
+ 4, 0xFD52, 0x062A, 0x062D, 0x062C, 0,
+ 4, 0xFD53, 0x062A, 0x062D, 0x0645, 0,
+ 4, 0xFD54, 0x062A, 0x062E, 0x0645, 0,
+ 4, 0xFD55, 0x062A, 0x0645, 0x062C, 0,
+ 4, 0xFD56, 0x062A, 0x0645, 0x062D, 0,
+ 4, 0xFD57, 0x062A, 0x0645, 0x062E, 0,
+ 6, 0xFD58, 0x062C, 0x0645, 0x062D, 0,
+ 4, 0xFD59, 0x062C, 0x0645, 0x062D, 0,
+ 6, 0xFD5A, 0x062D, 0x0645, 0x064A, 0,
+ 6, 0xFD5B, 0x062D, 0x0645, 0x0649, 0,
+ 4, 0xFD5C, 0x0633, 0x062D, 0x062C, 0,
+ 4, 0xFD5D, 0x0633, 0x062C, 0x062D, 0,
+ 6, 0xFD5E, 0x0633, 0x062C, 0x0649, 0,
+ 6, 0xFD5F, 0x0633, 0x0645, 0x062D, 0,
+ 4, 0xFD60, 0x0633, 0x0645, 0x062D, 0,
+ 4, 0xFD61, 0x0633, 0x0645, 0x062C, 0,
+ 6, 0xFD62, 0x0633, 0x0645, 0x0645, 0,
+ 4, 0xFD63, 0x0633, 0x0645, 0x0645, 0,
+ 6, 0xFD64, 0x0635, 0x062D, 0x062D, 0,
+ 4, 0xFD65, 0x0635, 0x062D, 0x062D, 0,
+ 6, 0xFD66, 0x0635, 0x0645, 0x0645, 0,
+ 6, 0xFD67, 0x0634, 0x062D, 0x0645, 0,
+ 4, 0xFD68, 0x0634, 0x062D, 0x0645, 0,
+ 6, 0xFD69, 0x0634, 0x062C, 0x064A, 0,
+ 6, 0xFD6A, 0x0634, 0x0645, 0x062E, 0,
+ 4, 0xFD6B, 0x0634, 0x0645, 0x062E, 0,
+ 6, 0xFD6C, 0x0634, 0x0645, 0x0645, 0,
+ 4, 0xFD6D, 0x0634, 0x0645, 0x0645, 0,
+ 6, 0xFD6E, 0x0636, 0x062D, 0x0649, 0,
+ 6, 0xFD6F, 0x0636, 0x062E, 0x0645, 0,
+ 4, 0xFD70, 0x0636, 0x062E, 0x0645, 0,
+ 6, 0xFD71, 0x0637, 0x0645, 0x062D, 0,
+ 4, 0xFD72, 0x0637, 0x0645, 0x062D, 0,
+ 4, 0xFD73, 0x0637, 0x0645, 0x0645, 0,
+ 6, 0xFD74, 0x0637, 0x0645, 0x064A, 0,
+ 6, 0xFD75, 0x0639, 0x062C, 0x0645, 0,
+ 6, 0xFD76, 0x0639, 0x0645, 0x0645, 0,
+ 4, 0xFD77, 0x0639, 0x0645, 0x0645, 0,
+ 6, 0xFD78, 0x0639, 0x0645, 0x0649, 0,
+ 6, 0xFD79, 0x063A, 0x0645, 0x0645, 0,
+ 6, 0xFD7A, 0x063A, 0x0645, 0x064A, 0,
+ 6, 0xFD7B, 0x063A, 0x0645, 0x0649, 0,
+ 6, 0xFD7C, 0x0641, 0x062E, 0x0645, 0,
+ 4, 0xFD7D, 0x0641, 0x062E, 0x0645, 0,
+ 6, 0xFD7E, 0x0642, 0x0645, 0x062D, 0,
+ 6, 0xFD7F, 0x0642, 0x0645, 0x0645, 0,
+ 6, 0xFD80, 0x0644, 0x062D, 0x0645, 0,
+ 6, 0xFD81, 0x0644, 0x062D, 0x064A, 0,
+ 6, 0xFD82, 0x0644, 0x062D, 0x0649, 0,
+ 4, 0xFD83, 0x0644, 0x062C, 0x062C, 0,
+ 6, 0xFD84, 0x0644, 0x062C, 0x062C, 0,
+ 6, 0xFD85, 0x0644, 0x062E, 0x0645, 0,
+ 4, 0xFD86, 0x0644, 0x062E, 0x0645, 0,
+ 6, 0xFD87, 0x0644, 0x0645, 0x062D, 0,
+ 4, 0xFD88, 0x0644, 0x0645, 0x062D, 0,
+ 4, 0xFD89, 0x0645, 0x062D, 0x062C, 0,
+ 4, 0xFD8A, 0x0645, 0x062D, 0x0645, 0,
+ 6, 0xFD8B, 0x0645, 0x062D, 0x064A, 0,
+ 4, 0xFD8C, 0x0645, 0x062C, 0x062D, 0,
+ 4, 0xFD8D, 0x0645, 0x062C, 0x0645, 0,
+ 4, 0xFD8E, 0x0645, 0x062E, 0x062C, 0,
+ 4, 0xFD8F, 0x0645, 0x062E, 0x0645, 0,
+ 4, 0xFD92, 0x0645, 0x062C, 0x062E, 0,
+ 4, 0xFD93, 0x0647, 0x0645, 0x062C, 0,
+ 4, 0xFD94, 0x0647, 0x0645, 0x0645, 0,
+ 4, 0xFD95, 0x0646, 0x062D, 0x0645, 0,
+ 6, 0xFD96, 0x0646, 0x062D, 0x0649, 0,
+ 6, 0xFD97, 0x0646, 0x062C, 0x0645, 0,
+ 4, 0xFD98, 0x0646, 0x062C, 0x0645, 0,
+ 6, 0xFD99, 0x0646, 0x062C, 0x0649, 0,
+ 6, 0xFD9A, 0x0646, 0x0645, 0x064A, 0,
+ 6, 0xFD9B, 0x0646, 0x0645, 0x0649, 0,
+ 6, 0xFD9C, 0x064A, 0x0645, 0x0645, 0,
+ 4, 0xFD9D, 0x064A, 0x0645, 0x0645, 0,
+ 6, 0xFD9E, 0x0628, 0x062E, 0x064A, 0,
+ 6, 0xFD9F, 0x062A, 0x062C, 0x064A, 0,
+ 6, 0xFDA0, 0x062A, 0x062C, 0x0649, 0,
+ 6, 0xFDA1, 0x062A, 0x062E, 0x064A, 0,
+ 6, 0xFDA2, 0x062A, 0x062E, 0x0649, 0,
+ 6, 0xFDA3, 0x062A, 0x0645, 0x064A, 0,
+ 6, 0xFDA4, 0x062A, 0x0645, 0x0649, 0,
+ 6, 0xFDA5, 0x062C, 0x0645, 0x064A, 0,
+ 6, 0xFDA6, 0x062C, 0x062D, 0x0649, 0,
+ 6, 0xFDA7, 0x062C, 0x0645, 0x0649, 0,
+ 6, 0xFDA8, 0x0633, 0x062E, 0x0649, 0,
+ 6, 0xFDA9, 0x0635, 0x062D, 0x064A, 0,
+ 6, 0xFDAA, 0x0634, 0x062D, 0x064A, 0,
+ 6, 0xFDAB, 0x0636, 0x062D, 0x064A, 0,
+ 6, 0xFDAC, 0x0644, 0x062C, 0x064A, 0,
+ 6, 0xFDAD, 0x0644, 0x0645, 0x064A, 0,
+ 6, 0xFDAE, 0x064A, 0x062D, 0x064A, 0,
+ 6, 0xFDAF, 0x064A, 0x062C, 0x064A, 0,
+ 6, 0xFDB0, 0x064A, 0x0645, 0x064A, 0,
+ 6, 0xFDB1, 0x0645, 0x0645, 0x064A, 0,
+ 6, 0xFDB2, 0x0642, 0x0645, 0x064A, 0,
+ 6, 0xFDB3, 0x0646, 0x062D, 0x064A, 0,
+ 4, 0xFDB4, 0x0642, 0x0645, 0x062D, 0,
+ 4, 0xFDB5, 0x0644, 0x062D, 0x0645, 0,
+ 6, 0xFDB6, 0x0639, 0x0645, 0x064A, 0,
+ 6, 0xFDB7, 0x0643, 0x0645, 0x064A, 0,
+ 4, 0xFDB8, 0x0646, 0x062C, 0x062D, 0,
+ 6, 0xFDB9, 0x0645, 0x062E, 0x064A, 0,
+ 4, 0xFDBA, 0x0644, 0x062C, 0x0645, 0,
+ 6, 0xFDBB, 0x0643, 0x0645, 0x0645, 0,
+ 6, 0xFDBC, 0x0644, 0x062C, 0x0645, 0,
+ 6, 0xFDBD, 0x0646, 0x062C, 0x062D, 0,
+ 6, 0xFDBE, 0x062C, 0x062D, 0x064A, 0,
+ 6, 0xFDBF, 0x062D, 0x062C, 0x064A, 0,
+ 6, 0xFDC0, 0x0645, 0x062C, 0x064A, 0,
+ 6, 0xFDC1, 0x0641, 0x0645, 0x064A, 0,
+ 6, 0xFDC2, 0x0628, 0x062D, 0x064A, 0,
+ 4, 0xFDC3, 0x0643, 0x0645, 0x0645, 0,
+ 4, 0xFDC4, 0x0639, 0x062C, 0x0645, 0,
+ 4, 0xFDC5, 0x0635, 0x0645, 0x0645, 0,
+ 6, 0xFDC6, 0x0633, 0x062E, 0x064A, 0,
+ 6, 0xFDC7, 0x0646, 0x062C, 0x064A, 0,
+ 7, 0xFDF0, 0x0635, 0x0644, 0x06D2, 0,
+ 7, 0xFDF1, 0x0642, 0x0644, 0x06D2, 0,
+ 7, 0xFDF2, 0x0627, 0x0644, 0x0644, 0x0647, 0,
+ 7, 0xFDF3, 0x0627, 0x0643, 0x0628, 0x0631, 0,
+ 7, 0xFDF4, 0x0645, 0x062D, 0x0645, 0x062F, 0,
+ 7, 0xFDF5, 0x0635, 0x0644, 0x0639, 0x0645, 0,
+ 7, 0xFDF6, 0x0631, 0x0633, 0x0648, 0x0644, 0,
+ 7, 0xFDF7, 0x0639, 0x0644, 0x064A, 0x0647, 0,
+ 7, 0xFDF8, 0x0648, 0x0633, 0x0644, 0x0645, 0,
+ 7, 0xFDF9, 0x0635, 0x0644, 0x0649, 0,
+ 7, 0xFDFA, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0,
+ 7, 0xFDFB, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647, 0,
+ 11, 0xFE30, 0x2025, 0,
+ 11, 0xFE31, 0x2014, 0,
+ 11, 0xFE32, 0x2013, 0,
+ 11, 0xFE33, 0x005F, 0,
+ 11, 0xFE34, 0x005F, 0,
+ 11, 0xFE35, 0x0028, 0,
+ 11, 0xFE36, 0x0029, 0,
+ 11, 0xFE37, 0x007B, 0,
+ 11, 0xFE38, 0x007D, 0,
+ 11, 0xFE39, 0x3014, 0,
+ 11, 0xFE3A, 0x3015, 0,
+ 11, 0xFE3B, 0x3010, 0,
+ 11, 0xFE3C, 0x3011, 0,
+ 11, 0xFE3D, 0x300A, 0,
+ 11, 0xFE3E, 0x300B, 0,
+ 11, 0xFE3F, 0x3008, 0,
+ 11, 0xFE40, 0x3009, 0,
+ 11, 0xFE41, 0x300C, 0,
+ 11, 0xFE42, 0x300D, 0,
+ 11, 0xFE43, 0x300E, 0,
+ 11, 0xFE44, 0x300F, 0,
+ 16, 0xFE49, 0x203E, 0,
+ 16, 0xFE4A, 0x203E, 0,
+ 16, 0xFE4B, 0x203E, 0,
+ 16, 0xFE4C, 0x203E, 0,
+ 16, 0xFE4D, 0x005F, 0,
+ 16, 0xFE4E, 0x005F, 0,
+ 16, 0xFE4F, 0x005F, 0,
+ 14, 0xFE50, 0x002C, 0,
+ 14, 0xFE51, 0x3001, 0,
+ 14, 0xFE52, 0x002E, 0,
+ 14, 0xFE54, 0x003B, 0,
+ 14, 0xFE55, 0x003A, 0,
+ 14, 0xFE56, 0x003F, 0,
+ 14, 0xFE57, 0x0021, 0,
+ 14, 0xFE58, 0x2014, 0,
+ 14, 0xFE59, 0x0028, 0,
+ 14, 0xFE5A, 0x0029, 0,
+ 14, 0xFE5B, 0x007B, 0,
+ 14, 0xFE5C, 0x007D, 0,
+ 14, 0xFE5D, 0x3014, 0,
+ 14, 0xFE5E, 0x3015, 0,
+ 14, 0xFE5F, 0x0023, 0,
+ 14, 0xFE60, 0x0026, 0,
+ 14, 0xFE61, 0x002A, 0,
+ 14, 0xFE62, 0x002B, 0,
+ 14, 0xFE63, 0x002D, 0,
+ 14, 0xFE64, 0x003C, 0,
+ 14, 0xFE65, 0x003E, 0,
+ 14, 0xFE66, 0x003D, 0,
+ 14, 0xFE68, 0x005C, 0,
+ 14, 0xFE69, 0x0024, 0,
+ 14, 0xFE6A, 0x0025, 0,
+ 14, 0xFE6B, 0x0040, 0,
+ 7, 0xFE70, 0x0020, 0x064B, 0,
+ 5, 0xFE71, 0x0640, 0x064B, 0,
+ 7, 0xFE72, 0x0020, 0x064C, 0,
+ 7, 0xFE74, 0x0020, 0x064D, 0,
+ 7, 0xFE76, 0x0020, 0x064E, 0,
+ 5, 0xFE77, 0x0640, 0x064E, 0,
+ 7, 0xFE78, 0x0020, 0x064F, 0,
+ 5, 0xFE79, 0x0640, 0x064F, 0,
+ 7, 0xFE7A, 0x0020, 0x0650, 0,
+ 5, 0xFE7B, 0x0640, 0x0650, 0,
+ 7, 0xFE7C, 0x0020, 0x0651, 0,
+ 5, 0xFE7D, 0x0640, 0x0651, 0,
+ 7, 0xFE7E, 0x0020, 0x0652, 0,
+ 5, 0xFE7F, 0x0640, 0x0652, 0,
+ 7, 0xFE80, 0x0621, 0,
+ 7, 0xFE81, 0x0622, 0,
+ 6, 0xFE82, 0x0622, 0,
+ 7, 0xFE83, 0x0623, 0,
+ 6, 0xFE84, 0x0623, 0,
+ 7, 0xFE85, 0x0624, 0,
+ 6, 0xFE86, 0x0624, 0,
+ 7, 0xFE87, 0x0625, 0,
+ 6, 0xFE88, 0x0625, 0,
+ 7, 0xFE89, 0x0626, 0,
+ 6, 0xFE8A, 0x0626, 0,
+ 4, 0xFE8B, 0x0626, 0,
+ 5, 0xFE8C, 0x0626, 0,
+ 7, 0xFE8D, 0x0627, 0,
+ 6, 0xFE8E, 0x0627, 0,
+ 7, 0xFE8F, 0x0628, 0,
+ 6, 0xFE90, 0x0628, 0,
+ 4, 0xFE91, 0x0628, 0,
+ 5, 0xFE92, 0x0628, 0,
+ 7, 0xFE93, 0x0629, 0,
+ 6, 0xFE94, 0x0629, 0,
+ 7, 0xFE95, 0x062A, 0,
+ 6, 0xFE96, 0x062A, 0,
+ 4, 0xFE97, 0x062A, 0,
+ 5, 0xFE98, 0x062A, 0,
+ 7, 0xFE99, 0x062B, 0,
+ 6, 0xFE9A, 0x062B, 0,
+ 4, 0xFE9B, 0x062B, 0,
+ 5, 0xFE9C, 0x062B, 0,
+ 7, 0xFE9D, 0x062C, 0,
+ 6, 0xFE9E, 0x062C, 0,
+ 4, 0xFE9F, 0x062C, 0,
+ 5, 0xFEA0, 0x062C, 0,
+ 7, 0xFEA1, 0x062D, 0,
+ 6, 0xFEA2, 0x062D, 0,
+ 4, 0xFEA3, 0x062D, 0,
+ 5, 0xFEA4, 0x062D, 0,
+ 7, 0xFEA5, 0x062E, 0,
+ 6, 0xFEA6, 0x062E, 0,
+ 4, 0xFEA7, 0x062E, 0,
+ 5, 0xFEA8, 0x062E, 0,
+ 7, 0xFEA9, 0x062F, 0,
+ 6, 0xFEAA, 0x062F, 0,
+ 7, 0xFEAB, 0x0630, 0,
+ 6, 0xFEAC, 0x0630, 0,
+ 7, 0xFEAD, 0x0631, 0,
+ 6, 0xFEAE, 0x0631, 0,
+ 7, 0xFEAF, 0x0632, 0,
+ 6, 0xFEB0, 0x0632, 0,
+ 7, 0xFEB1, 0x0633, 0,
+ 6, 0xFEB2, 0x0633, 0,
+ 4, 0xFEB3, 0x0633, 0,
+ 5, 0xFEB4, 0x0633, 0,
+ 7, 0xFEB5, 0x0634, 0,
+ 6, 0xFEB6, 0x0634, 0,
+ 4, 0xFEB7, 0x0634, 0,
+ 5, 0xFEB8, 0x0634, 0,
+ 7, 0xFEB9, 0x0635, 0,
+ 6, 0xFEBA, 0x0635, 0,
+ 4, 0xFEBB, 0x0635, 0,
+ 5, 0xFEBC, 0x0635, 0,
+ 7, 0xFEBD, 0x0636, 0,
+ 6, 0xFEBE, 0x0636, 0,
+ 4, 0xFEBF, 0x0636, 0,
+ 5, 0xFEC0, 0x0636, 0,
+ 7, 0xFEC1, 0x0637, 0,
+ 6, 0xFEC2, 0x0637, 0,
+ 4, 0xFEC3, 0x0637, 0,
+ 5, 0xFEC4, 0x0637, 0,
+ 7, 0xFEC5, 0x0638, 0,
+ 6, 0xFEC6, 0x0638, 0,
+ 4, 0xFEC7, 0x0638, 0,
+ 5, 0xFEC8, 0x0638, 0,
+ 7, 0xFEC9, 0x0639, 0,
+ 6, 0xFECA, 0x0639, 0,
+ 4, 0xFECB, 0x0639, 0,
+ 5, 0xFECC, 0x0639, 0,
+ 7, 0xFECD, 0x063A, 0,
+ 6, 0xFECE, 0x063A, 0,
+ 4, 0xFECF, 0x063A, 0,
+ 5, 0xFED0, 0x063A, 0,
+ 7, 0xFED1, 0x0641, 0,
+ 6, 0xFED2, 0x0641, 0,
+ 4, 0xFED3, 0x0641, 0,
+ 5, 0xFED4, 0x0641, 0,
+ 7, 0xFED5, 0x0642, 0,
+ 6, 0xFED6, 0x0642, 0,
+ 4, 0xFED7, 0x0642, 0,
+ 5, 0xFED8, 0x0642, 0,
+ 7, 0xFED9, 0x0643, 0,
+ 6, 0xFEDA, 0x0643, 0,
+ 4, 0xFEDB, 0x0643, 0,
+ 5, 0xFEDC, 0x0643, 0,
+ 7, 0xFEDD, 0x0644, 0,
+ 6, 0xFEDE, 0x0644, 0,
+ 4, 0xFEDF, 0x0644, 0,
+ 5, 0xFEE0, 0x0644, 0,
+ 7, 0xFEE1, 0x0645, 0,
+ 6, 0xFEE2, 0x0645, 0,
+ 4, 0xFEE3, 0x0645, 0,
+ 5, 0xFEE4, 0x0645, 0,
+ 7, 0xFEE5, 0x0646, 0,
+ 6, 0xFEE6, 0x0646, 0,
+ 4, 0xFEE7, 0x0646, 0,
+ 5, 0xFEE8, 0x0646, 0,
+ 7, 0xFEE9, 0x0647, 0,
+ 6, 0xFEEA, 0x0647, 0,
+ 4, 0xFEEB, 0x0647, 0,
+ 5, 0xFEEC, 0x0647, 0,
+ 7, 0xFEED, 0x0648, 0,
+ 6, 0xFEEE, 0x0648, 0,
+ 7, 0xFEEF, 0x0649, 0,
+ 6, 0xFEF0, 0x0649, 0,
+ 7, 0xFEF1, 0x064A, 0,
+ 6, 0xFEF2, 0x064A, 0,
+ 4, 0xFEF3, 0x064A, 0,
+ 5, 0xFEF4, 0x064A, 0,
+ 7, 0xFEF5, 0x0644, 0x0622, 0,
+ 6, 0xFEF6, 0x0644, 0x0622, 0,
+ 7, 0xFEF7, 0x0644, 0x0623, 0,
+ 6, 0xFEF8, 0x0644, 0x0623, 0,
+ 7, 0xFEF9, 0x0644, 0x0625, 0,
+ 6, 0xFEFA, 0x0644, 0x0625, 0,
+ 7, 0xFEFB, 0x0644, 0x0627, 0,
+ 6, 0xFEFC, 0x0644, 0x0627, 0,
+ 12, 0xFF01, 0x0021, 0,
+ 12, 0xFF02, 0x0022, 0,
+ 12, 0xFF03, 0x0023, 0,
+ 12, 0xFF04, 0x0024, 0,
+ 12, 0xFF05, 0x0025, 0,
+ 12, 0xFF06, 0x0026, 0,
+ 12, 0xFF07, 0x0027, 0,
+ 12, 0xFF08, 0x0028, 0,
+ 12, 0xFF09, 0x0029, 0,
+ 12, 0xFF0A, 0x002A, 0,
+ 12, 0xFF0B, 0x002B, 0,
+ 12, 0xFF0C, 0x002C, 0,
+ 12, 0xFF0D, 0x002D, 0,
+ 12, 0xFF0E, 0x002E, 0,
+ 12, 0xFF0F, 0x002F, 0,
+ 12, 0xFF10, 0x0030, 0,
+ 12, 0xFF11, 0x0031, 0,
+ 12, 0xFF12, 0x0032, 0,
+ 12, 0xFF13, 0x0033, 0,
+ 12, 0xFF14, 0x0034, 0,
+ 12, 0xFF15, 0x0035, 0,
+ 12, 0xFF16, 0x0036, 0,
+ 12, 0xFF17, 0x0037, 0,
+ 12, 0xFF18, 0x0038, 0,
+ 12, 0xFF19, 0x0039, 0,
+ 12, 0xFF1A, 0x003A, 0,
+ 12, 0xFF1B, 0x003B, 0,
+ 12, 0xFF1C, 0x003C, 0,
+ 12, 0xFF1D, 0x003D, 0,
+ 12, 0xFF1E, 0x003E, 0,
+ 12, 0xFF1F, 0x003F, 0,
+ 12, 0xFF20, 0x0040, 0,
+ 12, 0xFF21, 0x0041, 0,
+ 12, 0xFF22, 0x0042, 0,
+ 12, 0xFF23, 0x0043, 0,
+ 12, 0xFF24, 0x0044, 0,
+ 12, 0xFF25, 0x0045, 0,
+ 12, 0xFF26, 0x0046, 0,
+ 12, 0xFF27, 0x0047, 0,
+ 12, 0xFF28, 0x0048, 0,
+ 12, 0xFF29, 0x0049, 0,
+ 12, 0xFF2A, 0x004A, 0,
+ 12, 0xFF2B, 0x004B, 0,
+ 12, 0xFF2C, 0x004C, 0,
+ 12, 0xFF2D, 0x004D, 0,
+ 12, 0xFF2E, 0x004E, 0,
+ 12, 0xFF2F, 0x004F, 0,
+ 12, 0xFF30, 0x0050, 0,
+ 12, 0xFF31, 0x0051, 0,
+ 12, 0xFF32, 0x0052, 0,
+ 12, 0xFF33, 0x0053, 0,
+ 12, 0xFF34, 0x0054, 0,
+ 12, 0xFF35, 0x0055, 0,
+ 12, 0xFF36, 0x0056, 0,
+ 12, 0xFF37, 0x0057, 0,
+ 12, 0xFF38, 0x0058, 0,
+ 12, 0xFF39, 0x0059, 0,
+ 12, 0xFF3A, 0x005A, 0,
+ 12, 0xFF3B, 0x005B, 0,
+ 12, 0xFF3C, 0x005C, 0,
+ 12, 0xFF3D, 0x005D, 0,
+ 12, 0xFF3E, 0x005E, 0,
+ 12, 0xFF3F, 0x005F, 0,
+ 12, 0xFF40, 0x0060, 0,
+ 12, 0xFF41, 0x0061, 0,
+ 12, 0xFF42, 0x0062, 0,
+ 12, 0xFF43, 0x0063, 0,
+ 12, 0xFF44, 0x0064, 0,
+ 12, 0xFF45, 0x0065, 0,
+ 12, 0xFF46, 0x0066, 0,
+ 12, 0xFF47, 0x0067, 0,
+ 12, 0xFF48, 0x0068, 0,
+ 12, 0xFF49, 0x0069, 0,
+ 12, 0xFF4A, 0x006A, 0,
+ 12, 0xFF4B, 0x006B, 0,
+ 12, 0xFF4C, 0x006C, 0,
+ 12, 0xFF4D, 0x006D, 0,
+ 12, 0xFF4E, 0x006E, 0,
+ 12, 0xFF4F, 0x006F, 0,
+ 12, 0xFF50, 0x0070, 0,
+ 12, 0xFF51, 0x0071, 0,
+ 12, 0xFF52, 0x0072, 0,
+ 12, 0xFF53, 0x0073, 0,
+ 12, 0xFF54, 0x0074, 0,
+ 12, 0xFF55, 0x0075, 0,
+ 12, 0xFF56, 0x0076, 0,
+ 12, 0xFF57, 0x0077, 0,
+ 12, 0xFF58, 0x0078, 0,
+ 12, 0xFF59, 0x0079, 0,
+ 12, 0xFF5A, 0x007A, 0,
+ 12, 0xFF5B, 0x007B, 0,
+ 12, 0xFF5C, 0x007C, 0,
+ 12, 0xFF5D, 0x007D, 0,
+ 12, 0xFF5E, 0x007E, 0,
+ 13, 0xFF61, 0x3002, 0,
+ 13, 0xFF62, 0x300C, 0,
+ 13, 0xFF63, 0x300D, 0,
+ 13, 0xFF64, 0x3001, 0,
+ 13, 0xFF65, 0x30FB, 0,
+ 13, 0xFF66, 0x30F2, 0,
+ 13, 0xFF67, 0x30A1, 0,
+ 13, 0xFF68, 0x30A3, 0,
+ 13, 0xFF69, 0x30A5, 0,
+ 13, 0xFF6A, 0x30A7, 0,
+ 13, 0xFF6B, 0x30A9, 0,
+ 13, 0xFF6C, 0x30E3, 0,
+ 13, 0xFF6D, 0x30E5, 0,
+ 13, 0xFF6E, 0x30E7, 0,
+ 13, 0xFF6F, 0x30C3, 0,
+ 13, 0xFF70, 0x30FC, 0,
+ 13, 0xFF71, 0x30A2, 0,
+ 13, 0xFF72, 0x30A4, 0,
+ 13, 0xFF73, 0x30A6, 0,
+ 13, 0xFF74, 0x30A8, 0,
+ 13, 0xFF75, 0x30AA, 0,
+ 13, 0xFF76, 0x30AB, 0,
+ 13, 0xFF77, 0x30AD, 0,
+ 13, 0xFF78, 0x30AF, 0,
+ 13, 0xFF79, 0x30B1, 0,
+ 13, 0xFF7A, 0x30B3, 0,
+ 13, 0xFF7B, 0x30B5, 0,
+ 13, 0xFF7C, 0x30B7, 0,
+ 13, 0xFF7D, 0x30B9, 0,
+ 13, 0xFF7E, 0x30BB, 0,
+ 13, 0xFF7F, 0x30BD, 0,
+ 13, 0xFF80, 0x30BF, 0,
+ 13, 0xFF81, 0x30C1, 0,
+ 13, 0xFF82, 0x30C4, 0,
+ 13, 0xFF83, 0x30C6, 0,
+ 13, 0xFF84, 0x30C8, 0,
+ 13, 0xFF85, 0x30CA, 0,
+ 13, 0xFF86, 0x30CB, 0,
+ 13, 0xFF87, 0x30CC, 0,
+ 13, 0xFF88, 0x30CD, 0,
+ 13, 0xFF89, 0x30CE, 0,
+ 13, 0xFF8A, 0x30CF, 0,
+ 13, 0xFF8B, 0x30D2, 0,
+ 13, 0xFF8C, 0x30D5, 0,
+ 13, 0xFF8D, 0x30D8, 0,
+ 13, 0xFF8E, 0x30DB, 0,
+ 13, 0xFF8F, 0x30DE, 0,
+ 13, 0xFF90, 0x30DF, 0,
+ 13, 0xFF91, 0x30E0, 0,
+ 13, 0xFF92, 0x30E1, 0,
+ 13, 0xFF93, 0x30E2, 0,
+ 13, 0xFF94, 0x30E4, 0,
+ 13, 0xFF95, 0x30E6, 0,
+ 13, 0xFF96, 0x30E8, 0,
+ 13, 0xFF97, 0x30E9, 0,
+ 13, 0xFF98, 0x30EA, 0,
+ 13, 0xFF99, 0x30EB, 0,
+ 13, 0xFF9A, 0x30EC, 0,
+ 13, 0xFF9B, 0x30ED, 0,
+ 13, 0xFF9C, 0x30EF, 0,
+ 13, 0xFF9D, 0x30F3, 0,
+ 13, 0xFF9E, 0x3099, 0,
+ 13, 0xFF9F, 0x309A, 0,
+ 13, 0xFFA0, 0x3164, 0,
+ 13, 0xFFA1, 0x3131, 0,
+ 13, 0xFFA2, 0x3132, 0,
+ 13, 0xFFA3, 0x3133, 0,
+ 13, 0xFFA4, 0x3134, 0,
+ 13, 0xFFA5, 0x3135, 0,
+ 13, 0xFFA6, 0x3136, 0,
+ 13, 0xFFA7, 0x3137, 0,
+ 13, 0xFFA8, 0x3138, 0,
+ 13, 0xFFA9, 0x3139, 0,
+ 13, 0xFFAA, 0x313A, 0,
+ 13, 0xFFAB, 0x313B, 0,
+ 13, 0xFFAC, 0x313C, 0,
+ 13, 0xFFAD, 0x313D, 0,
+ 13, 0xFFAE, 0x313E, 0,
+ 13, 0xFFAF, 0x313F, 0,
+ 13, 0xFFB0, 0x3140, 0,
+ 13, 0xFFB1, 0x3141, 0,
+ 13, 0xFFB2, 0x3142, 0,
+ 13, 0xFFB3, 0x3143, 0,
+ 13, 0xFFB4, 0x3144, 0,
+ 13, 0xFFB5, 0x3145, 0,
+ 13, 0xFFB6, 0x3146, 0,
+ 13, 0xFFB7, 0x3147, 0,
+ 13, 0xFFB8, 0x3148, 0,
+ 13, 0xFFB9, 0x3149, 0,
+ 13, 0xFFBA, 0x314A, 0,
+ 13, 0xFFBB, 0x314B, 0,
+ 13, 0xFFBC, 0x314C, 0,
+ 13, 0xFFBD, 0x314D, 0,
+ 13, 0xFFBE, 0x314E, 0,
+ 13, 0xFFC2, 0x314F, 0,
+ 13, 0xFFC3, 0x3150, 0,
+ 13, 0xFFC4, 0x3151, 0,
+ 13, 0xFFC5, 0x3152, 0,
+ 13, 0xFFC6, 0x3153, 0,
+ 13, 0xFFC7, 0x3154, 0,
+ 13, 0xFFCA, 0x3155, 0,
+ 13, 0xFFCB, 0x3156, 0,
+ 13, 0xFFCC, 0x3157, 0,
+ 13, 0xFFCD, 0x3158, 0,
+ 13, 0xFFCE, 0x3159, 0,
+ 13, 0xFFCF, 0x315A, 0,
+ 13, 0xFFD2, 0x315B, 0,
+ 13, 0xFFD3, 0x315C, 0,
+ 13, 0xFFD4, 0x315D, 0,
+ 13, 0xFFD5, 0x315E, 0,
+ 13, 0xFFD6, 0x315F, 0,
+ 13, 0xFFD7, 0x3160, 0,
+ 13, 0xFFDA, 0x3161, 0,
+ 13, 0xFFDB, 0x3162, 0,
+ 13, 0xFFDC, 0x3163, 0,
+ 12, 0xFFE0, 0x00A2, 0,
+ 12, 0xFFE1, 0x00A3, 0,
+ 12, 0xFFE2, 0x00AC, 0,
+ 12, 0xFFE3, 0x00AF, 0,
+ 12, 0xFFE4, 0x00A6, 0,
+ 12, 0xFFE5, 0x00A5, 0,
+ 12, 0xFFE6, 0x20A9, 0,
+ 13, 0xFFE8, 0x2502, 0,
+ 13, 0xFFE9, 0x2190, 0,
+ 13, 0xFFEA, 0x2191, 0,
+ 13, 0xFFEB, 0x2192, 0,
+ 13, 0xFFEC, 0x2193, 0,
+ 13, 0xFFED, 0x25A0, 0,
+ 13, 0xFFEE, 0x25CB, 0,
+
+};
+
+static const Q_UINT16 di_00[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,
+ 5, 0, 10, 0, 0, 0, 0, 14,
+ 0, 0, 19, 23, 27, 32, 0, 0,
+ 36, 41, 45, 0, 49, 55, 61, 0,
+ 67, 72, 77, 82, 87, 92, 0, 97,
+ 102, 107, 112, 117, 122, 127, 132, 137,
+ 0, 142, 147, 152, 157, 162, 167, 0,
+ 0, 172, 177, 182, 187, 192, 0, 0,
+ 197, 202, 207, 212, 217, 222, 0, 227,
+ 232, 237, 242, 247, 252, 257, 262, 267,
+ 0, 272, 277, 282, 287, 292, 297, 0,
+ 0, 302, 307, 312, 317, 322, 0, 327,
+};
+
+static const Q_UINT16 di_01[] = {
+ 332, 337, 342, 347, 352, 357, 362, 367,
+ 372, 377, 382, 387, 392, 397, 402, 407,
+ 0, 0, 412, 417, 422, 427, 432, 437,
+ 442, 447, 452, 457, 462, 467, 472, 477,
+ 482, 487, 492, 497, 502, 507, 0, 0,
+ 512, 517, 522, 527, 532, 537, 542, 547,
+ 552, 0, 557, 562, 567, 572, 577, 582,
+ 0, 587, 592, 597, 602, 607, 612, 617,
+ 622, 0, 0, 627, 632, 637, 642, 647,
+ 652, 657, 0, 0, 662, 667, 672, 677,
+ 682, 687, 0, 0, 692, 697, 702, 707,
+ 712, 717, 722, 727, 732, 737, 742, 747,
+ 752, 757, 762, 767, 772, 777, 0, 0,
+ 782, 787, 792, 797, 802, 807, 812, 817,
+ 822, 827, 832, 837, 842, 847, 852, 857,
+ 862, 867, 872, 877, 882, 887, 892, 897,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 901, 906, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 911,
+ 916, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 921, 926, 931, 936,
+ 941, 946, 951, 956, 961, 966, 971, 976,
+ 981, 986, 991, 996, 1001, 1006, 1011, 1016,
+ 1021, 1026, 1031, 1036, 1041, 0, 1046, 1051,
+ 1056, 1061, 1066, 1071, 0, 0, 1076, 1081,
+ 1086, 1091, 1096, 1101, 1106, 1111, 1116, 1121,
+ 1126, 1131, 1136, 1141, 1146, 1151, 0, 0,
+ 1156, 1161, 1166, 1171, 1176, 1181, 1186, 1191,
+};
+
+static const Q_UINT16 di_02[] = {
+ 1196, 1201, 1206, 1211, 1216, 1221, 1226, 1231,
+ 1236, 1241, 1246, 1251, 1256, 1261, 1266, 1271,
+ 1276, 1281, 1286, 1291, 1296, 1301, 1306, 1311,
+ 1316, 1321, 1326, 1331, 0, 0, 1336, 1341,
+ 0, 0, 0, 0, 0, 0, 1346, 1351,
+ 1356, 1361, 1366, 1371, 1376, 1381, 1386, 1391,
+ 1396, 1401, 1406, 1411, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1416, 1420, 1424, 1428, 1432, 1436, 1440, 1444,
+ 1448, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1452, 1457, 1462, 1467, 1472, 1477, 0, 0,
+ 1482, 1486, 1490, 1494, 1498, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_03[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1502, 1506, 0, 1510, 1514, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1519, 0, 0, 0,
+ 0, 0, 1523, 0, 0, 0, 1528, 0,
+ 0, 0, 0, 0, 1532, 1537, 1542, 1547,
+ 1551, 1556, 1561, 0, 1566, 0, 1571, 1576,
+ 1581, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1586, 1591, 1596, 1601, 1606, 1611,
+ 1616, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1621, 1626, 1631, 1636, 1641, 0,
+ 1646, 1650, 1654, 1658, 1663, 1668, 1672, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1676, 1680, 1684, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_04[] = {
+ 1688, 1693, 0, 1698, 0, 0, 0, 1703,
+ 0, 0, 0, 0, 1708, 1713, 1718, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1723, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1728, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1733, 1738, 0, 1743, 0, 0, 0, 1748,
+ 0, 0, 0, 0, 1753, 1758, 1763, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1768, 1773,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1778, 1783, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1788, 1793, 1798, 1803, 0, 0, 1808, 1813,
+ 0, 0, 1818, 1823, 1828, 1833, 1838, 1843,
+ 0, 0, 1848, 1853, 1858, 1863, 1868, 1873,
+ 0, 0, 1878, 1883, 1888, 1893, 1898, 1903,
+ 1908, 1913, 1918, 1923, 1928, 1933, 0, 0,
+ 1938, 1943, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_05[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1948,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_06[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1953, 1958, 1963, 1968, 1973, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1978, 1983, 1988,
+ 1993, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1998, 0, 2003, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2008, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_07[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_09[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2013, 0, 0, 0, 0, 0, 0,
+ 0, 2018, 0, 0, 2023, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2028, 2033, 2038, 2043, 2048, 2053, 2058, 2063,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2068, 2073, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2078, 2083, 0, 2088,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_0A[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2093, 0, 0, 2098, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2103, 2108, 2113, 0, 0, 2118, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_0B[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2123, 0, 0, 2128, 2133, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2138, 2143, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2148, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2153, 2158, 2163, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_0C[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2168, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2173, 0, 0, 0, 0, 0, 0, 2178,
+ 2183, 0, 2188, 2193, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_0D[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2198, 2203, 2208, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2213, 0, 2218, 2223, 2228, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_0E[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2233, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2238, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2243, 2248, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_0F[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2253, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2257, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2262, 0, 0,
+ 0, 0, 2267, 0, 0, 0, 0, 2272,
+ 0, 0, 0, 0, 2277, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2282, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2287, 0, 2292, 2297, 2302,
+ 2307, 2312, 0, 0, 0, 0, 0, 0,
+ 0, 2317, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2322, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2327, 0, 0,
+ 0, 0, 2332, 0, 0, 0, 0, 2337,
+ 0, 0, 0, 0, 2342, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2347, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_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, 2352, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_1E[] = {
+ 2357, 2362, 2367, 2372, 2377, 2382, 2387, 2392,
+ 2397, 2402, 2407, 2412, 2417, 2422, 2427, 2432,
+ 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472,
+ 2477, 2482, 2487, 2492, 2497, 2502, 2507, 2512,
+ 2517, 2522, 2527, 2532, 2537, 2542, 2547, 2552,
+ 2557, 2562, 2567, 2572, 2577, 2582, 2587, 2592,
+ 2597, 2602, 2607, 2612, 2617, 2622, 2627, 2632,
+ 2637, 2642, 2647, 2652, 2657, 2662, 2667, 2672,
+ 2677, 2682, 2687, 2692, 2697, 2702, 2707, 2712,
+ 2717, 2722, 2727, 2732, 2737, 2742, 2747, 2752,
+ 2757, 2762, 2767, 2772, 2777, 2782, 2787, 2792,
+ 2797, 2802, 2807, 2812, 2817, 2822, 2827, 2832,
+ 2837, 2842, 2847, 2852, 2857, 2862, 2867, 2872,
+ 2877, 2882, 2887, 2892, 2897, 2902, 2907, 2912,
+ 2917, 2922, 2927, 2932, 2937, 2942, 2947, 2952,
+ 2957, 2962, 2967, 2972, 2977, 2982, 2987, 2992,
+ 2997, 3002, 3007, 3012, 3017, 3022, 3027, 3032,
+ 3037, 3042, 3047, 3052, 3057, 3062, 3067, 3072,
+ 3077, 3082, 3087, 3092, 3097, 3102, 3107, 3112,
+ 3117, 3122, 3127, 3132, 0, 0, 0, 0,
+ 3137, 3142, 3147, 3152, 3157, 3162, 3167, 3172,
+ 3177, 3182, 3187, 3192, 3197, 3202, 3207, 3212,
+ 3217, 3222, 3227, 3232, 3237, 3242, 3247, 3252,
+ 3257, 3262, 3267, 3272, 3277, 3282, 3287, 3292,
+ 3297, 3302, 3307, 3312, 3317, 3322, 3327, 3332,
+ 3337, 3342, 3347, 3352, 3357, 3362, 3367, 3372,
+ 3377, 3382, 3387, 3392, 3397, 3402, 3407, 3412,
+ 3417, 3422, 3427, 3432, 3437, 3442, 3447, 3452,
+ 3457, 3462, 3467, 3472, 3477, 3482, 3487, 3492,
+ 3497, 3502, 3507, 3512, 3517, 3522, 3527, 3532,
+ 3537, 3542, 3547, 3552, 3557, 3562, 3567, 3572,
+ 3577, 3582, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_1F[] = {
+ 3587, 3592, 3597, 3602, 3607, 3612, 3617, 3622,
+ 3627, 3632, 3637, 3642, 3647, 3652, 3657, 3662,
+ 3667, 3672, 3677, 3682, 3687, 3692, 0, 0,
+ 3697, 3702, 3707, 3712, 3717, 3722, 0, 0,
+ 3727, 3732, 3737, 3742, 3747, 3752, 3757, 3762,
+ 3767, 3772, 3777, 3782, 3787, 3792, 3797, 3802,
+ 3807, 3812, 3817, 3822, 3827, 3832, 3837, 3842,
+ 3847, 3852, 3857, 3862, 3867, 3872, 3877, 3882,
+ 3887, 3892, 3897, 3902, 3907, 3912, 0, 0,
+ 3917, 3922, 3927, 3932, 3937, 3942, 0, 0,
+ 3947, 3952, 3957, 3962, 3967, 3972, 3977, 3982,
+ 0, 3987, 0, 3992, 0, 3997, 0, 4002,
+ 4007, 4012, 4017, 4022, 4027, 4032, 4037, 4042,
+ 4047, 4052, 4057, 4062, 4067, 4072, 4077, 4082,
+ 4087, 4092, 4096, 4101, 4105, 4110, 4114, 4119,
+ 4123, 4128, 4132, 4137, 4141, 4146, 0, 0,
+ 4150, 4155, 4160, 4165, 4170, 4175, 4180, 4185,
+ 4190, 4195, 4200, 4205, 4210, 4215, 4220, 4225,
+ 4230, 4235, 4240, 4245, 4250, 4255, 4260, 4265,
+ 4270, 4275, 4280, 4285, 4290, 4295, 4300, 4305,
+ 4310, 4315, 4320, 4325, 4330, 4335, 4340, 4345,
+ 4350, 4355, 4360, 4365, 4370, 4375, 4380, 4385,
+ 4390, 4395, 4400, 4405, 4410, 0, 4415, 4420,
+ 4425, 4430, 4435, 4440, 4444, 4449, 4454, 4458,
+ 4463, 4468, 4473, 4478, 4483, 0, 4488, 4493,
+ 4498, 4503, 4507, 4512, 4516, 4521, 4526, 4531,
+ 4536, 4541, 4546, 4551, 0, 0, 4555, 4560,
+ 4565, 4570, 4575, 4580, 0, 4584, 4589, 4594,
+ 4599, 4604, 4609, 4614, 4618, 4623, 4628, 4633,
+ 4638, 4643, 4648, 4653, 4657, 4662, 4667, 4671,
+ 0, 0, 4675, 4680, 4685, 0, 4690, 4695,
+ 4700, 4705, 4709, 4714, 4718, 4723, 4727, 0,
+};
+
+static const Q_UINT16 di_20[] = {
+ 4732, 4736, 4740, 4744, 4748, 4752, 4756, 4760,
+ 4764, 4768, 4772, 0, 0, 0, 0, 0,
+ 0, 4776, 0, 0, 0, 0, 0, 4780,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4785, 4789, 4794, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4800,
+ 0, 0, 0, 4804, 4809, 0, 4815, 4820,
+ 0, 0, 0, 0, 4826, 0, 4831, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 4836, 4841, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 4846, 0, 0, 0, 4850, 4854, 4858, 4862,
+ 4866, 4870, 4874, 4878, 4882, 4886, 4890, 4894,
+ 4898, 4902, 4906, 4910, 4914, 4918, 4922, 4926,
+ 4930, 4934, 4938, 4942, 4946, 4950, 4954, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 4958, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_21[] = {
+ 4963, 4969, 4975, 4979, 0, 4984, 4990, 4996,
+ 0, 5000, 5005, 5009, 5013, 5017, 5021, 5025,
+ 5029, 5033, 5037, 5041, 0, 5045, 5049, 0,
+ 0, 5054, 5058, 5062, 5066, 5070, 0, 0,
+ 5074, 5079, 5085, 0, 5090, 0, 5094, 0,
+ 5098, 0, 5102, 5106, 5110, 5114, 0, 5118,
+ 5122, 5126, 0, 5130, 5134, 5138, 5142, 5146,
+ 5150, 5154, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5158, 5164, 5170, 5176, 5182,
+ 5188, 5194, 5200, 5206, 5212, 5218, 5224, 5230,
+ 5235, 5239, 5244, 5250, 5255, 5259, 5264, 5270,
+ 5277, 5282, 5286, 5291, 5297, 5301, 5305, 5309,
+ 5313, 5317, 5322, 5328, 5333, 5337, 5342, 5348,
+ 5355, 5360, 5364, 5369, 5375, 5379, 5383, 5387,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 5391, 5396, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5401, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 5406, 5411, 5416,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_22[] = {
+ 0, 0, 0, 0, 5421, 0, 0, 0,
+ 0, 5426, 0, 0, 5431, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5436, 0, 5441, 0,
+ 0, 0, 0, 0, 5446, 5451, 0, 5457,
+ 5462, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5468, 0, 0, 5473, 0, 0, 5478,
+ 0, 5483, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 5488, 0, 5493, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 5498, 5503, 5508,
+ 5513, 5518, 0, 0, 5523, 5528, 0, 0,
+ 5533, 5538, 0, 0, 0, 0, 0, 0,
+ 5543, 5548, 0, 0, 5553, 5558, 0, 0,
+ 5563, 5568, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5573, 5578, 5583, 5588,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 5593, 5598, 5603, 5608, 0, 0, 0, 0,
+ 0, 0, 5613, 5618, 5623, 5628, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_23[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5633, 5637, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_24[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 5641, 5645, 5649, 5653, 5657, 5661, 5665, 5669,
+ 5673, 5677, 5682, 5687, 5692, 5697, 5702, 5707,
+ 5712, 5717, 5722, 5727, 5732, 5738, 5744, 5750,
+ 5756, 5762, 5768, 5774, 5780, 5786, 5793, 5800,
+ 5807, 5814, 5821, 5828, 5835, 5842, 5849, 5856,
+ 5863, 5868, 5873, 5878, 5883, 5888, 5893, 5898,
+ 5903, 5908, 5914, 5920, 5926, 5932, 5938, 5944,
+ 5950, 5956, 5962, 5968, 5974, 5980, 5986, 5992,
+ 5998, 6004, 6010, 6016, 6022, 6028, 6034, 6040,
+ 6046, 6052, 6058, 6064, 6070, 6076, 6082, 6088,
+ 6094, 6100, 6106, 6112, 6118, 6124, 6130, 6134,
+ 6138, 6142, 6146, 6150, 6154, 6158, 6162, 6166,
+ 6170, 6174, 6178, 6182, 6186, 6190, 6194, 6198,
+ 6202, 6206, 6210, 6214, 6218, 6222, 6226, 6230,
+ 6234, 6238, 6242, 6246, 6250, 6254, 6258, 6262,
+ 6266, 6270, 6274, 6278, 6282, 6286, 6290, 6294,
+ 6298, 6302, 6306, 6310, 6314, 6318, 6322, 6326,
+ 6330, 6334, 6338, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_2E[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 6342,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6346, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_2F[] = {
+ 6350, 6354, 6358, 6362, 6366, 6370, 6374, 6378,
+ 6382, 6386, 6390, 6394, 6398, 6402, 6406, 6410,
+ 6414, 6418, 6422, 6426, 6430, 6434, 6438, 6442,
+ 6446, 6450, 6454, 6458, 6462, 6466, 6470, 6474,
+ 6478, 6482, 6486, 6490, 6494, 6498, 6502, 6506,
+ 6510, 6514, 6518, 6522, 6526, 6530, 6534, 6538,
+ 6542, 6546, 6550, 6554, 6558, 6562, 6566, 6570,
+ 6574, 6578, 6582, 6586, 6590, 6594, 6598, 6602,
+ 6606, 6610, 6614, 6618, 6622, 6626, 6630, 6634,
+ 6638, 6642, 6646, 6650, 6654, 6658, 6662, 6666,
+ 6670, 6674, 6678, 6682, 6686, 6690, 6694, 6698,
+ 6702, 6706, 6710, 6714, 6718, 6722, 6726, 6730,
+ 6734, 6738, 6742, 6746, 6750, 6754, 6758, 6762,
+ 6766, 6770, 6774, 6778, 6782, 6786, 6790, 6794,
+ 6798, 6802, 6806, 6810, 6814, 6818, 6822, 6826,
+ 6830, 6834, 6838, 6842, 6846, 6850, 6854, 6858,
+ 6862, 6866, 6870, 6874, 6878, 6882, 6886, 6890,
+ 6894, 6898, 6902, 6906, 6910, 6914, 6918, 6922,
+ 6926, 6930, 6934, 6938, 6942, 6946, 6950, 6954,
+ 6958, 6962, 6966, 6970, 6974, 6978, 6982, 6986,
+ 6990, 6994, 6998, 7002, 7006, 7010, 7014, 7018,
+ 7022, 7026, 7030, 7034, 7038, 7042, 7046, 7050,
+ 7054, 7058, 7062, 7066, 7070, 7074, 7078, 7082,
+ 7086, 7090, 7094, 7098, 7102, 7106, 7110, 7114,
+ 7118, 7122, 7126, 7130, 7134, 7138, 7142, 7146,
+ 7150, 7154, 7158, 7162, 7166, 7170, 7174, 7178,
+ 7182, 7186, 7190, 7194, 7198, 7202, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_30[] = {
+ 7206, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7210, 0,
+ 7214, 7218, 7222, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7226, 0, 7231, 0,
+ 7236, 0, 7241, 0, 7246, 0, 7251, 0,
+ 7256, 0, 7261, 0, 7266, 0, 7271, 0,
+ 7276, 0, 7281, 0, 0, 7286, 0, 7291,
+ 0, 7296, 0, 0, 0, 0, 0, 0,
+ 7301, 7306, 0, 7311, 7316, 0, 7321, 7326,
+ 0, 7331, 7336, 0, 7341, 7346, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7351, 0, 0, 0,
+ 0, 0, 0, 7356, 7361, 0, 7366, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7371, 0, 7376, 0,
+ 7381, 0, 7386, 0, 7391, 0, 7396, 0,
+ 7401, 0, 7406, 0, 7411, 0, 7416, 0,
+ 7421, 0, 7426, 0, 0, 7431, 0, 7436,
+ 0, 7441, 0, 0, 0, 0, 0, 0,
+ 7446, 7451, 0, 7456, 7461, 0, 7466, 7471,
+ 0, 7476, 7481, 0, 7486, 7491, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7496, 0, 0, 7501,
+ 7506, 7511, 7516, 0, 0, 0, 7521, 0,
+};
+
+static const Q_UINT16 di_31[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7526, 7530, 7534, 7538, 7542, 7546, 7550,
+ 7554, 7558, 7562, 7566, 7570, 7574, 7578, 7582,
+ 7586, 7590, 7594, 7598, 7602, 7606, 7610, 7614,
+ 7618, 7622, 7626, 7630, 7634, 7638, 7642, 7646,
+ 7650, 7654, 7658, 7662, 7666, 7670, 7674, 7678,
+ 7682, 7686, 7690, 7694, 7698, 7702, 7706, 7710,
+ 7714, 7718, 7722, 7726, 7730, 7734, 7738, 7742,
+ 7746, 7750, 7754, 7758, 7762, 7766, 7770, 7774,
+ 7778, 7782, 7786, 7790, 7794, 7798, 7802, 7806,
+ 7810, 7814, 7818, 7822, 7826, 7830, 7834, 7838,
+ 7842, 7846, 7850, 7854, 7858, 7862, 7866, 7870,
+ 7874, 7878, 7882, 7886, 7890, 7894, 7898, 0,
+ 0, 0, 7902, 7906, 7910, 7914, 7918, 7922,
+ 7926, 7930, 7934, 7938, 7942, 7946, 7950, 7954,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_32[] = {
+ 7958, 7964, 7970, 7976, 7982, 7988, 7994, 8000,
+ 8006, 8012, 8018, 8024, 8030, 8036, 8042, 8049,
+ 8056, 8063, 8070, 8077, 8084, 8091, 8098, 8105,
+ 8112, 8119, 8126, 8133, 8140, 0, 0, 0,
+ 8147, 8153, 8159, 8165, 8171, 8177, 8183, 8189,
+ 8195, 8201, 8207, 8213, 8219, 8225, 8231, 8237,
+ 8243, 8249, 8255, 8261, 8267, 8273, 8279, 8285,
+ 8291, 8297, 8303, 8309, 8315, 8321, 8327, 8333,
+ 8339, 8345, 8351, 8357, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8363, 8367, 8371, 8375, 8379, 8383, 8387, 8391,
+ 8395, 8399, 8403, 8407, 8411, 8415, 8419, 8424,
+ 8429, 8434, 8439, 8444, 8449, 8454, 8459, 8464,
+ 8469, 8474, 8479, 8484, 0, 0, 0, 0,
+ 8489, 8493, 8497, 8501, 8505, 8509, 8513, 8517,
+ 8521, 8525, 8529, 8533, 8537, 8541, 8545, 8549,
+ 8553, 8557, 8561, 8565, 8569, 8573, 8577, 8581,
+ 8585, 8589, 8593, 8597, 8601, 8605, 8609, 8613,
+ 8617, 8621, 8625, 8629, 8633, 8637, 8641, 8645,
+ 8649, 8653, 8657, 8661, 8665, 8669, 8673, 8677,
+ 8681, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8685, 8690, 8695, 8700, 8705, 8710, 8715, 8720,
+ 8725, 8730, 8736, 8742, 0, 0, 0, 0,
+ 8748, 8752, 8756, 8760, 8764, 8768, 8772, 8776,
+ 8780, 8784, 8788, 8792, 8796, 8800, 8804, 8808,
+ 8812, 8816, 8820, 8824, 8828, 8832, 8836, 8840,
+ 8844, 8848, 8852, 8856, 8860, 8864, 8868, 8872,
+ 8876, 8880, 8884, 8888, 8892, 8896, 8900, 8904,
+ 8908, 8912, 8916, 8920, 8924, 8928, 8932, 0,
+};
+
+static const Q_UINT16 di_33[] = {
+ 8936, 8943, 8950, 8957, 8963, 8970, 8976, 8982,
+ 8990, 8997, 9003, 9009, 9015, 9022, 9029, 9035,
+ 9041, 9046, 9052, 9059, 9066, 9071, 9079, 9088,
+ 9096, 9102, 9110, 9118, 9125, 9131, 9137, 9143,
+ 9150, 9158, 9165, 9171, 9177, 9183, 9188, 9193,
+ 9198, 9203, 9209, 9215, 9223, 9229, 9236, 9244,
+ 9250, 9255, 9260, 9268, 9275, 9283, 9289, 9297,
+ 9302, 9308, 9314, 9320, 9326, 9332, 9339, 9345,
+ 9350, 9356, 9362, 9368, 9375, 9381, 9387, 9393,
+ 9401, 9408, 9413, 9421, 9426, 9433, 9440, 9446,
+ 9452, 9458, 9465, 9470, 9476, 9483, 9488, 9496,
+ 9502, 9507, 9512, 9517, 9522, 9527, 9532, 9537,
+ 9542, 9547, 9552, 9558, 9564, 9570, 9576, 9582,
+ 9588, 9594, 9600, 9606, 9612, 9618, 9624, 9630,
+ 9636, 9642, 9648, 9653, 9658, 9664, 9669, 0,
+ 0, 0, 0, 9674, 9679, 9684, 9689, 9694,
+ 9701, 9706, 9711, 9716, 9721, 9726, 9731, 9736,
+ 9741, 9747, 9754, 9759, 9764, 9769, 9774, 9779,
+ 9784, 9789, 9795, 9801, 9807, 9813, 9818, 9823,
+ 9828, 9833, 9838, 9843, 9848, 9853, 9858, 9863,
+ 9869, 9875, 9880, 9886, 9892, 9898, 9903, 9909,
+ 9915, 9922, 9927, 9933, 9939, 9945, 9951, 9959,
+ 9968, 9973, 9978, 9983, 9988, 9993, 9998, 10003,
+ 10008, 10013, 10018, 10023, 10028, 10033, 10038, 10043,
+ 10048, 10053, 10058, 10065, 10070, 10075, 10080, 10087,
+ 10093, 10098, 10103, 10108, 10113, 10118, 10123, 10128,
+ 10133, 10138, 10143, 10149, 10154, 10159, 10165, 10171,
+ 10176, 10183, 10189, 10194, 10199, 10204, 0, 0,
+ 10209, 10214, 10219, 10224, 10229, 10234, 10239, 10244,
+ 10249, 10254, 10260, 10266, 10272, 10278, 10284, 10290,
+ 10296, 10302, 10308, 10314, 10320, 10326, 10332, 10338,
+ 10344, 10350, 10356, 10362, 10368, 10374, 10380, 0,
+};
+
+static const Q_UINT16 di_F9[] = {
+ 10386, 10390, 10394, 10398, 10402, 10406, 10410, 10414,
+ 10418, 10422, 10426, 10430, 10434, 10438, 10442, 10446,
+ 10450, 10454, 10458, 10462, 10466, 10470, 10474, 10478,
+ 10482, 10486, 10490, 10494, 10498, 10502, 10506, 10510,
+ 10514, 10518, 10522, 10526, 10530, 10534, 10538, 10542,
+ 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574,
+ 10578, 10582, 10586, 10590, 10594, 10598, 10602, 10606,
+ 10610, 10614, 10618, 10622, 10626, 10630, 10634, 10638,
+ 10642, 10646, 10650, 10654, 10658, 10662, 10666, 10670,
+ 10674, 10678, 10682, 10686, 10690, 10694, 10698, 10702,
+ 10706, 10710, 10714, 10718, 10722, 10726, 10730, 10734,
+ 10738, 10742, 10746, 10750, 10754, 10758, 10762, 10766,
+ 10770, 10774, 10778, 10782, 10786, 10790, 10794, 10798,
+ 10802, 10806, 10810, 10814, 10818, 10822, 10826, 10830,
+ 10834, 10838, 10842, 10846, 10850, 10854, 10858, 10862,
+ 10866, 10870, 10874, 10878, 10882, 10886, 10890, 10894,
+ 10898, 10902, 10906, 10910, 10914, 10918, 10922, 10926,
+ 10930, 10934, 10938, 10942, 10946, 10950, 10954, 10958,
+ 10962, 10966, 10970, 10974, 10978, 10982, 10986, 10990,
+ 10994, 10998, 11002, 11006, 11010, 11014, 11018, 11022,
+ 11026, 11030, 11034, 11038, 11042, 11046, 11050, 11054,
+ 11058, 11062, 11066, 11070, 11074, 11078, 11082, 11086,
+ 11090, 11094, 11098, 11102, 11106, 11110, 11114, 11118,
+ 11122, 11126, 11130, 11134, 11138, 11142, 11146, 11150,
+ 11154, 11158, 11162, 11166, 11170, 11174, 11178, 11182,
+ 11186, 11190, 11194, 11198, 11202, 11206, 11210, 11214,
+ 11218, 11222, 11226, 11230, 11234, 11238, 11242, 11246,
+ 11250, 11254, 11258, 11262, 11266, 11270, 11274, 11278,
+ 11282, 11286, 11290, 11294, 11298, 11302, 11306, 11310,
+ 11314, 11318, 11322, 11326, 11330, 11334, 11338, 11342,
+ 11346, 11350, 11354, 11358, 11362, 11366, 11370, 11374,
+ 11378, 11382, 11386, 11390, 11394, 11398, 11402, 11406,
+};
+
+static const Q_UINT16 di_FA[] = {
+ 11410, 11414, 11418, 11422, 11426, 11430, 11434, 11438,
+ 11442, 11446, 11450, 11454, 11458, 11462, 0, 0,
+ 11466, 0, 11470, 0, 0, 11474, 11478, 11482,
+ 11486, 11490, 11494, 11498, 11502, 11506, 11510, 0,
+ 11514, 0, 11518, 0, 0, 11522, 11526, 0,
+ 0, 0, 11530, 11534, 11538, 11542, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_FB[] = {
+ 11546, 11551, 11556, 11561, 11567, 11573, 11578, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 11583, 11588, 11593, 11598, 11603,
+ 0, 0, 0, 0, 0, 11608, 0, 11613,
+ 11618, 11622, 11626, 11630, 11634, 11638, 11642, 11646,
+ 11650, 11654, 11658, 11663, 11668, 11673, 11678, 11683,
+ 11688, 11693, 11698, 11703, 11708, 11713, 11718, 0,
+ 11723, 11728, 11733, 11738, 11743, 0, 11748, 0,
+ 11753, 11758, 0, 11763, 11768, 0, 11773, 11778,
+ 11783, 11788, 11793, 11798, 11803, 11808, 11813, 11818,
+ 11823, 11827, 11831, 11835, 11839, 11843, 11847, 11851,
+ 11855, 11859, 11863, 11867, 11871, 11875, 11879, 11883,
+ 11887, 11891, 11895, 11899, 11903, 11907, 11911, 11915,
+ 11919, 11923, 11927, 11931, 11935, 11939, 11943, 11947,
+ 11951, 11955, 11959, 11963, 11967, 11971, 11975, 11979,
+ 11983, 11987, 11991, 11995, 11999, 12003, 12007, 12011,
+ 12015, 12019, 12023, 12027, 12031, 12035, 12039, 12043,
+ 12047, 12051, 12055, 12059, 12063, 12067, 12071, 12075,
+ 12079, 12083, 12087, 12091, 12095, 12099, 12103, 12107,
+ 12111, 12115, 12119, 12123, 12127, 12131, 12135, 12139,
+ 12143, 12147, 12151, 12155, 12159, 12163, 12167, 12171,
+ 12175, 12179, 12183, 12187, 12191, 12195, 12199, 12203,
+ 12207, 12211, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 12215, 12219, 12223, 12227, 12231,
+ 12235, 12239, 12243, 12247, 12251, 12255, 12259, 12263,
+ 12267, 12271, 12275, 12279, 12283, 12287, 12291, 12295,
+ 12299, 12303, 12307, 12312, 12317, 12322, 12327, 12332,
+ 12337, 12342, 12347, 12352, 12357, 12362, 12367, 12372,
+ 12377, 12382, 12387, 12392, 12397, 12401, 12405, 12409,
+};
+
+static const Q_UINT16 di_FC[] = {
+ 12413, 12418, 12423, 12428, 12433, 12438, 12443, 12448,
+ 12453, 12458, 12463, 12468, 12473, 12478, 12483, 12488,
+ 12493, 12498, 12503, 12508, 12513, 12518, 12523, 12528,
+ 12533, 12538, 12543, 12548, 12553, 12558, 12563, 12568,
+ 12573, 12578, 12583, 12588, 12593, 12598, 12603, 12608,
+ 12613, 12618, 12623, 12628, 12633, 12638, 12643, 12648,
+ 12653, 12658, 12663, 12668, 12673, 12678, 12683, 12688,
+ 12693, 12698, 12703, 12708, 12713, 12718, 12723, 12728,
+ 12733, 12738, 12743, 12748, 12753, 12758, 12763, 12768,
+ 12773, 12778, 12783, 12788, 12793, 12798, 12803, 12808,
+ 12813, 12818, 12823, 12828, 12833, 12838, 12843, 12848,
+ 12853, 12858, 12863, 12868, 12873, 12878, 12883, 12889,
+ 12895, 12901, 12907, 12913, 12919, 12924, 12929, 12934,
+ 12939, 12944, 12949, 12954, 12959, 12964, 12969, 12974,
+ 12979, 12984, 12989, 12994, 12999, 13004, 13009, 13014,
+ 13019, 13024, 13029, 13034, 13039, 13044, 13049, 13054,
+ 13059, 13064, 13069, 13074, 13079, 13084, 13089, 13094,
+ 13099, 13104, 13109, 13114, 13119, 13124, 13129, 13134,
+ 13139, 13144, 13149, 13154, 13159, 13164, 13169, 13174,
+ 13179, 13184, 13189, 13194, 13199, 13204, 13209, 13214,
+ 13219, 13224, 13229, 13234, 13239, 13244, 13249, 13254,
+ 13259, 13264, 13269, 13274, 13279, 13284, 13289, 13294,
+ 13299, 13304, 13309, 13314, 13319, 13324, 13329, 13334,
+ 13339, 13344, 13349, 13354, 13359, 13364, 13369, 13374,
+ 13379, 13384, 13389, 13394, 13399, 13404, 13409, 13414,
+ 13419, 13424, 13429, 13434, 13439, 13444, 13449, 13454,
+ 13459, 13464, 13469, 13474, 13479, 13484, 13489, 13494,
+ 13499, 13504, 13509, 13514, 13519, 13524, 13529, 13534,
+ 13539, 13544, 13549, 13554, 13559, 13564, 13569, 13574,
+ 13579, 13584, 13589, 13594, 13599, 13604, 13609, 13614,
+ 13619, 13624, 13629, 13635, 13641, 13647, 13652, 13657,
+ 13662, 13667, 13672, 13677, 13682, 13687, 13692, 13697,
+};
+
+static const Q_UINT16 di_FD[] = {
+ 13702, 13707, 13712, 13717, 13722, 13727, 13732, 13737,
+ 13742, 13747, 13752, 13757, 13762, 13767, 13772, 13777,
+ 13782, 13787, 13792, 13797, 13802, 13807, 13812, 13817,
+ 13822, 13827, 13832, 13837, 13842, 13847, 13852, 13857,
+ 13862, 13867, 13872, 13877, 13882, 13887, 13892, 13897,
+ 13902, 13907, 13912, 13917, 13922, 13927, 13932, 13937,
+ 13942, 13947, 13952, 13957, 13962, 13967, 13972, 13977,
+ 13982, 13987, 13992, 13997, 14002, 14007, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 14012, 14018, 14024, 14030, 14036, 14042, 14048, 14054,
+ 14060, 14066, 14072, 14078, 14084, 14090, 14096, 14102,
+ 14108, 14114, 14120, 14126, 14132, 14138, 14144, 14150,
+ 14156, 14162, 14168, 14174, 14180, 14186, 14192, 14198,
+ 14204, 14210, 14216, 14222, 14228, 14234, 14240, 14246,
+ 14252, 14258, 14264, 14270, 14276, 14282, 14288, 14294,
+ 14300, 14306, 14312, 14318, 14324, 14330, 14336, 14342,
+ 14348, 14354, 14360, 14366, 14372, 14378, 14384, 14390,
+ 0, 0, 14396, 14402, 14408, 14414, 14420, 14426,
+ 14432, 14438, 14444, 14450, 14456, 14462, 14468, 14474,
+ 14480, 14486, 14492, 14498, 14504, 14510, 14516, 14522,
+ 14528, 14534, 14540, 14546, 14552, 14558, 14564, 14570,
+ 14576, 14582, 14588, 14594, 14600, 14606, 14612, 14618,
+ 14624, 14630, 14636, 14642, 14648, 14654, 14660, 14666,
+ 14672, 14678, 14684, 14690, 14696, 14702, 14708, 14714,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 14720, 14726, 14732, 14739, 14746, 14753, 14760, 14767,
+ 14774, 14781, 14787, 14808, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 di_FE[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 14819, 14823, 14827, 14831, 14835, 14839, 14843, 14847,
+ 14851, 14855, 14859, 14863, 14867, 14871, 14875, 14879,
+ 14883, 14887, 14891, 14895, 14899, 0, 0, 0,
+ 0, 14903, 14907, 14911, 14915, 14919, 14923, 14927,
+ 14931, 14935, 14939, 0, 14943, 14947, 14951, 14955,
+ 14959, 14963, 14967, 14971, 14975, 14979, 14983, 14987,
+ 14991, 14995, 14999, 15003, 15007, 15011, 15015, 0,
+ 15019, 15023, 15027, 15031, 0, 0, 0, 0,
+ 15035, 15040, 15045, 0, 15050, 0, 15055, 15060,
+ 15065, 15070, 15075, 15080, 15085, 15090, 15095, 15100,
+ 15105, 15109, 15113, 15117, 15121, 15125, 15129, 15133,
+ 15137, 15141, 15145, 15149, 15153, 15157, 15161, 15165,
+ 15169, 15173, 15177, 15181, 15185, 15189, 15193, 15197,
+ 15201, 15205, 15209, 15213, 15217, 15221, 15225, 15229,
+ 15233, 15237, 15241, 15245, 15249, 15253, 15257, 15261,
+ 15265, 15269, 15273, 15277, 15281, 15285, 15289, 15293,
+ 15297, 15301, 15305, 15309, 15313, 15317, 15321, 15325,
+ 15329, 15333, 15337, 15341, 15345, 15349, 15353, 15357,
+ 15361, 15365, 15369, 15373, 15377, 15381, 15385, 15389,
+ 15393, 15397, 15401, 15405, 15409, 15413, 15417, 15421,
+ 15425, 15429, 15433, 15437, 15441, 15445, 15449, 15453,
+ 15457, 15461, 15465, 15469, 15473, 15477, 15481, 15485,
+ 15489, 15493, 15497, 15501, 15505, 15509, 15513, 15517,
+ 15521, 15525, 15529, 15533, 15537, 15541, 15545, 15549,
+ 15553, 15557, 15561, 15565, 15569, 15573, 15578, 15583,
+ 15588, 15593, 15598, 15603, 15608, 0, 0, 0,
+};
+
+static const Q_UINT16 di_FF[] = {
+ 0, 15613, 15617, 15621, 15625, 15629, 15633, 15637,
+ 15641, 15645, 15649, 15653, 15657, 15661, 15665, 15669,
+ 15673, 15677, 15681, 15685, 15689, 15693, 15697, 15701,
+ 15705, 15709, 15713, 15717, 15721, 15725, 15729, 15733,
+ 15737, 15741, 15745, 15749, 15753, 15757, 15761, 15765,
+ 15769, 15773, 15777, 15781, 15785, 15789, 15793, 15797,
+ 15801, 15805, 15809, 15813, 15817, 15821, 15825, 15829,
+ 15833, 15837, 15841, 15845, 15849, 15853, 15857, 15861,
+ 15865, 15869, 15873, 15877, 15881, 15885, 15889, 15893,
+ 15897, 15901, 15905, 15909, 15913, 15917, 15921, 15925,
+ 15929, 15933, 15937, 15941, 15945, 15949, 15953, 15957,
+ 15961, 15965, 15969, 15973, 15977, 15981, 15985, 0,
+ 0, 15989, 15993, 15997, 16001, 16005, 16009, 16013,
+ 16017, 16021, 16025, 16029, 16033, 16037, 16041, 16045,
+ 16049, 16053, 16057, 16061, 16065, 16069, 16073, 16077,
+ 16081, 16085, 16089, 16093, 16097, 16101, 16105, 16109,
+ 16113, 16117, 16121, 16125, 16129, 16133, 16137, 16141,
+ 16145, 16149, 16153, 16157, 16161, 16165, 16169, 16173,
+ 16177, 16181, 16185, 16189, 16193, 16197, 16201, 16205,
+ 16209, 16213, 16217, 16221, 16225, 16229, 16233, 16237,
+ 16241, 16245, 16249, 16253, 16257, 16261, 16265, 16269,
+ 16273, 16277, 16281, 16285, 16289, 16293, 16297, 16301,
+ 16305, 16309, 16313, 16317, 16321, 16325, 16329, 16333,
+ 16337, 16341, 16345, 16349, 16353, 16357, 16361, 0,
+ 0, 0, 16365, 16369, 16373, 16377, 16381, 16385,
+ 0, 0, 16389, 16393, 16397, 16401, 16405, 16409,
+ 0, 0, 16413, 16417, 16421, 16425, 16429, 16433,
+ 0, 0, 16437, 16441, 16445, 0, 0, 0,
+ 16449, 16453, 16457, 16461, 16465, 16469, 16473, 0,
+ 16477, 16481, 16485, 16489, 16493, 16497, 16501, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 * const decomposition_info[256] = {
+ di_00, di_01, di_02, di_03, di_04, di_05, di_06, di_07,
+ di_07, di_09, di_0A, di_0B, di_0C, di_0D, di_0E, di_0F,
+ di_10, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_1E, di_1F,
+ di_20, di_21, di_22, di_23, di_24, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_2E, di_2F,
+ di_30, di_31, di_32, di_33, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
+ di_07, di_F9, di_FA, di_FB, di_FC, di_FD, di_FE, di_FF,
+};
+// 68080 bytes
+
+static const Q_UINT16 ligature_map [] = {
+ 0,
+ 12883, 12889, 12895, 12901, 12907, 12913, 15035, 15045, 15050, 15055, 15065, 15075, 15085, 15095, 0,
+ 5503, 0,
+ 5488, 0,
+ 5508, 0,
+ 67, 72, 77, 82, 87, 92, 332, 342, 352, 966, 1196, 1206, 1346, 2357, 3137, 3147, 0,
+ 2367, 2377, 2387, 0,
+ 97, 362, 372, 382, 392, 0,
+ 402, 2407, 2417, 2427, 2437, 2447, 0,
+ 102, 107, 112, 117, 412, 422, 432, 442, 452, 1216, 1226, 1356, 2477, 2487, 3257, 3267, 3277, 0,
+ 2507, 0,
+ 462, 472, 482, 492, 1076, 1146, 2517, 0,
+ 502, 1336, 2527, 2537, 2547, 2557, 2567, 0,
+ 122, 127, 132, 137, 512, 522, 532, 542, 552, 976, 1236, 1246, 2577, 3337, 3347, 0,
+ 567, 0,
+ 577, 1086, 2597, 2607, 2617, 0,
+ 587, 597, 607, 2627, 2647, 2657, 0,
+ 2667, 2677, 2687, 0,
+ 142, 627, 637, 647, 1156, 2697, 2707, 2717, 2727, 0,
+ 147, 152, 157, 162, 167, 662, 672, 682, 901, 986, 1096, 1256, 1266, 1386, 3357, 3367, 0,
+ 2777, 2787, 0,
+ 692, 702, 712, 1276, 1286, 2797, 2807, 2827, 0,
+ 722, 732, 742, 752, 1316, 2837, 2847, 0,
+ 762, 772, 1326, 2887, 2897, 2907, 2917, 0,
+ 172, 177, 182, 187, 782, 792, 802, 812, 822, 832, 911, 996, 1296, 1306, 2927, 2937, 2947, 3477, 3487, 0,
+ 2977, 2987, 0,
+ 842, 2997, 3007, 3017, 3027, 3037, 0,
+ 3047, 3057, 0,
+ 192, 852, 862, 1406, 3067, 3547, 3557, 3567, 3577, 0,
+ 867, 877, 887, 3077, 3087, 3097, 0,
+ 197, 202, 207, 212, 217, 222, 337, 347, 357, 971, 1201, 1211, 1351, 2362, 3142, 3152, 0,
+ 2372, 2382, 2392, 0,
+ 227, 367, 377, 387, 397, 0,
+ 407, 2412, 2422, 2432, 2442, 2452, 0,
+ 232, 237, 242, 247, 417, 427, 437, 447, 457, 1221, 1231, 1361, 2482, 2492, 3262, 3272, 3282, 0,
+ 2512, 0,
+ 467, 477, 487, 497, 1081, 1151, 2522, 0,
+ 507, 1341, 2532, 2542, 2552, 2562, 2572, 3107, 0,
+ 252, 257, 262, 267, 517, 527, 537, 547, 981, 1241, 1251, 2582, 3342, 3352, 0,
+ 572, 1126, 0,
+ 582, 1091, 2602, 2612, 2622, 0,
+ 592, 602, 612, 2632, 2652, 2662, 0,
+ 2672, 2682, 2692, 0,
+ 272, 632, 642, 652, 1161, 2702, 2712, 2722, 2732, 0,
+ 277, 282, 287, 292, 297, 667, 677, 687, 906, 991, 1101, 1261, 1271, 1391, 3362, 3372, 0,
+ 2782, 2792, 0,
+ 697, 707, 717, 1281, 1291, 2802, 2812, 2832, 0,
+ 727, 737, 747, 757, 1321, 2842, 2852, 0,
+ 767, 777, 1331, 2892, 2902, 2912, 2922, 3112, 0,
+ 302, 307, 312, 317, 787, 797, 807, 817, 827, 837, 916, 1001, 1301, 1311, 2932, 2942, 2952, 3482, 3492, 0,
+ 2982, 2992, 0,
+ 847, 3002, 3012, 3022, 3032, 3042, 3117, 0,
+ 3052, 3062, 0,
+ 322, 327, 857, 1411, 3072, 3122, 3552, 3562, 3572, 3582, 0,
+ 872, 882, 892, 3082, 3092, 3102, 0,
+ 1537, 4468, 4662, 0,
+ 3157, 3167, 3177, 3187, 0,
+ 1046, 0,
+ 1166, 0,
+ 1066, 1176, 0,
+ 2397, 0,
+ 3287, 3297, 3307, 3317, 0,
+ 2587, 0,
+ 3377, 3387, 3397, 3407, 0,
+ 1376, 2737, 2747, 0,
+ 1366, 0,
+ 1186, 0,
+ 1006, 1016, 1026, 1036, 0,
+ 3162, 3172, 3182, 3192, 0,
+ 1051, 0,
+ 1171, 0,
+ 1071, 1181, 0,
+ 2402, 0,
+ 3292, 3302, 3312, 3322, 0,
+ 2592, 0,
+ 3382, 3392, 3402, 3412, 0,
+ 1381, 2742, 2752, 0,
+ 1371, 0,
+ 1191, 0,
+ 1011, 1021, 1031, 1041, 0,
+ 3207, 3217, 3227, 3237, 0,
+ 3212, 3222, 3232, 3242, 0,
+ 2457, 2467, 0,
+ 2462, 2472, 0,
+ 2757, 2767, 0,
+ 2762, 2772, 0,
+ 2857, 0,
+ 2862, 0,
+ 2867, 0,
+ 2872, 0,
+ 2957, 0,
+ 2962, 0,
+ 2967, 0,
+ 2972, 0,
+ 3132, 0,
+ 3427, 3437, 3447, 3457, 3467, 0,
+ 3432, 3442, 3452, 3462, 3472, 0,
+ 3497, 3507, 3517, 3527, 3537, 0,
+ 3502, 3512, 3522, 3532, 3542, 0,
+ 1116, 0,
+ 1106, 0,
+ 1111, 0,
+ 1056, 0,
+ 1061, 0,
+ 2497, 0,
+ 2502, 0,
+ 1396, 0,
+ 1401, 0,
+ 1121, 0,
+ 1514, 0,
+ 1542, 3627, 3632, 4425, 4430, 4435, 4444, 0,
+ 1551, 3697, 3702, 4498, 0,
+ 1556, 3767, 3772, 4507, 4516, 0,
+ 1561, 1586, 3847, 3852, 4565, 4570, 4575, 0,
+ 1566, 3917, 3922, 4700, 0,
+ 4657, 0,
+ 1571, 1591, 3987, 4638, 4643, 4648, 0,
+ 1576, 4047, 4052, 4709, 4718, 0,
+ 4410, 0,
+ 4483, 0,
+ 1596, 3587, 3592, 4087, 4390, 4395, 4405, 4415, 0,
+ 1601, 3667, 3672, 4096, 0,
+ 1606, 3727, 3732, 4105, 4478, 4488, 0,
+ 1611, 1621, 3807, 3812, 4114, 4536, 4541, 4555, 0,
+ 1631, 3887, 3892, 4123, 0,
+ 4618, 4623, 0,
+ 1626, 1636, 3947, 3952, 4132, 4599, 4604, 4628, 0,
+ 1641, 4007, 4012, 4141, 4680, 4690, 0,
+ 1581, 4546, 4560, 0,
+ 1616, 4609, 4633, 0,
+ 4685, 0,
+ 1658, 1663, 0,
+ 1703, 0,
+ 1788, 1798, 0,
+ 1698, 0,
+ 1688, 1693, 1808, 0,
+ 1778, 1828, 0,
+ 1838, 0,
+ 1713, 1723, 1848, 1858, 0,
+ 1708, 0,
+ 1868, 0,
+ 1718, 1898, 1908, 1918, 0,
+ 1928, 0,
+ 1938, 0,
+ 1888, 0,
+ 1793, 1803, 0,
+ 1743, 0,
+ 1733, 1738, 1813, 0,
+ 1783, 1833, 0,
+ 1843, 0,
+ 1728, 1758, 1853, 1863, 0,
+ 1753, 0,
+ 1873, 0,
+ 1763, 1903, 1913, 1923, 0,
+ 1933, 0,
+ 1943, 0,
+ 1893, 0,
+ 1748, 0,
+ 1768, 0,
+ 1773, 0,
+ 1818, 0,
+ 1823, 0,
+ 1878, 0,
+ 1883, 0,
+ 11678, 11683, 11688, 0,
+ 11693, 11803, 0,
+ 11698, 0,
+ 11703, 0,
+ 11708, 0,
+ 11713, 11798, 0,
+ 11718, 0,
+ 11723, 0,
+ 11608, 11728, 0,
+ 11733, 0,
+ 11738, 11808, 0,
+ 11743, 0,
+ 11748, 0,
+ 11753, 0,
+ 11758, 0,
+ 11763, 0,
+ 11768, 11813, 0,
+ 11773, 0,
+ 11778, 0,
+ 11783, 0,
+ 11658, 11663, 11788, 0,
+ 11793, 0,
+ 11613, 0,
+ 15105, 0,
+ 15109, 15113, 0,
+ 15117, 15121, 0,
+ 15125, 15129, 0,
+ 15133, 15137, 0,
+ 12307, 12312, 12317, 12322, 12327, 12332, 12337, 12342, 12347, 12352, 12357, 12362, 12367, 12372, 12377, 12382, 12387, 12392, 12413, 12418, 12423, 12428, 12433, 12919, 12924, 12929, 12934, 12939, 12944, 13174, 13179, 13184, 13189, 13194, 13534, 13539, 15141, 15145, 15149, 15153, 0,
+ 14732, 14739, 1958, 1968, 14007, 14002, 1953, 15157, 15161, 0,
+ 14468, 14684, 12448, 12453, 12458, 12463, 12949, 12954, 12959, 12964, 12969, 12974, 13199, 13204, 13209, 13214, 13219, 13544, 13549, 12438, 12443, 15165, 15169, 15173, 15177, 0,
+ 15181, 15185, 0,
+ 14012, 14018, 14024, 14030, 14036, 14042, 14048, 14054, 14474, 14480, 14486, 14492, 14498, 14504, 13229, 13234, 13239, 13244, 13559, 13554, 12468, 12473, 12478, 12483, 12488, 12493, 12979, 12984, 12989, 12994, 12999, 13004, 13224, 15189, 15193, 15197, 15201, 0,
+ 12498, 12503, 12508, 12513, 13009, 13014, 13019, 13024, 13029, 13034, 13249, 13564, 13569, 15205, 15209, 15213, 15217, 0,
+ 14808, 14660, 14060, 14066, 14510, 14516, 14522, 12518, 12523, 13254, 13259, 13707, 13712, 13847, 13852, 15221, 15225, 15229, 15233, 0,
+ 14072, 14078, 14666, 13264, 13269, 13697, 13702, 13842, 13837, 12528, 12533, 15237, 15241, 15245, 15249, 0,
+ 12538, 12543, 12548, 13274, 13279, 13717, 13722, 13857, 13862, 15253, 15257, 15261, 15265, 0,
+ 15269, 15273, 0,
+ 12868, 15277, 15281, 0,
+ 14760, 12873, 15285, 15289, 0,
+ 15293, 15297, 0,
+ 14084, 14090, 14096, 14102, 14108, 14114, 14120, 14126, 14528, 14708, 13677, 13682, 13772, 13817, 13822, 13912, 13947, 13962, 13967, 13972, 12553, 12558, 12563, 12568, 13284, 13289, 13294, 13299, 13574, 13579, 15301, 15305, 15309, 15313, 0,
+ 14150, 14156, 14162, 14168, 14174, 14180, 14186, 14540, 13767, 13827, 13832, 13887, 13892, 13897, 13902, 13907, 13927, 13932, 13937, 13942, 13952, 13977, 13982, 13987, 13584, 13589, 13687, 13692, 13747, 13752, 13757, 13762, 15317, 15321, 15325, 15329, 0,
+ 14787, 14753, 14781, 14138, 14132, 14144, 14534, 14702, 14720, 12573, 12578, 13304, 13309, 13314, 13727, 13732, 13777, 13872, 13917, 13867, 15333, 15337, 15341, 15345, 0,
+ 14192, 14198, 14204, 14546, 13319, 13324, 13329, 13334, 13737, 13742, 13782, 13877, 13882, 13922, 12583, 12588, 12593, 12598, 15349, 15353, 15357, 15361, 0,
+ 14210, 14216, 14222, 14228, 13647, 13652, 13787, 13792, 13992, 13957, 12603, 12608, 13339, 15365, 15369, 15373, 15377, 0,
+ 12613, 13344, 13997, 15381, 15385, 15389, 15393, 0,
+ 14767, 14696, 14234, 14240, 14246, 14252, 14612, 12618, 12623, 13349, 13354, 13657, 13662, 13797, 13802, 15397, 15401, 15405, 15409, 0,
+ 14258, 14264, 14270, 13359, 13364, 13667, 13672, 13812, 13807, 12628, 12633, 15413, 15417, 15421, 15425, 0,
+ 13629, 13635, 13641, 15040, 15060, 15070, 15080, 15090, 15100, 0,
+ 14276, 14282, 14678, 12653, 12658, 12663, 13039, 13044, 13369, 13374, 13379, 13384, 12638, 12643, 12648, 15429, 15433, 15437, 15441, 0,
+ 14600, 14726, 14294, 14288, 14588, 12668, 12673, 12678, 12683, 13049, 13054, 13389, 13394, 15445, 15449, 15453, 15457, 0,
+ 14618, 14642, 14690, 12703, 12708, 12713, 12718, 12723, 13059, 13064, 13069, 13074, 13079, 13399, 13404, 13409, 13414, 13419, 13594, 13599, 12688, 12693, 12698, 15461, 15465, 15469, 15473, 0,
+ 14648, 14300, 14306, 14312, 14318, 14324, 14330, 14336, 14342, 14348, 14552, 14558, 14606, 14636, 12728, 12733, 12738, 12743, 12748, 12753, 13084, 13089, 13094, 13424, 13429, 13434, 13439, 13444, 13604, 15573, 15578, 15583, 15588, 15593, 15598, 15603, 15608, 15477, 15481, 15485, 15489, 0,
+ 14746, 14354, 14360, 14366, 14372, 14378, 14384, 14390, 14396, 14582, 14630, 14672, 12758, 12763, 12768, 12773, 12778, 12783, 13099, 13104, 13449, 13454, 13459, 13464, 15493, 15497, 15501, 15505, 0,
+ 14414, 14420, 14426, 14432, 14438, 14444, 14450, 14594, 14624, 14654, 14714, 13134, 13469, 13474, 13479, 13484, 13489, 13609, 13614, 12788, 12793, 12798, 12803, 12808, 12813, 13109, 13114, 13119, 13124, 13129, 15509, 15513, 15517, 15521, 0,
+ 14402, 14408, 12823, 12828, 12833, 13494, 13504, 13499, 12818, 15525, 15529, 15533, 15537, 0,
+ 14774, 1963, 15541, 15545, 0,
+ 12878, 13139, 12299, 12303, 15549, 15553, 0,
+ 14456, 14462, 14564, 14570, 14576, 12858, 12863, 13144, 13149, 13154, 13159, 13164, 13169, 13509, 13514, 13519, 13524, 13529, 13619, 13624, 1973, 12838, 12843, 12848, 12853, 15557, 15561, 15565, 15569, 0,
+ 11823, 11827, 0,
+ 12255, 0,
+ 11911, 11915, 11919, 11923, 0,
+ 11879, 11883, 11887, 11891, 0,
+ 11831, 11835, 11839, 11843, 0,
+ 11847, 11851, 11855, 11859, 0,
+ 11895, 11899, 11903, 11907, 0,
+ 11863, 11867, 11871, 11875, 0,
+ 11975, 11979, 11983, 11987, 0,
+ 11959, 11963, 11967, 11971, 0,
+ 11991, 11995, 11999, 12003, 0,
+ 12007, 12011, 12015, 12019, 0,
+ 12047, 12051, 0,
+ 12031, 12035, 0,
+ 12023, 12027, 0,
+ 12039, 12043, 0,
+ 12063, 12067, 0,
+ 12055, 12059, 0,
+ 11927, 11931, 11935, 11939, 0,
+ 11943, 11947, 11951, 11955, 0,
+ 12071, 12075, 12079, 12083, 0,
+ 12215, 12219, 12223, 12227, 0,
+ 12087, 12091, 12095, 12099, 0,
+ 12119, 12123, 12127, 12131, 0,
+ 12103, 12107, 12111, 12115, 0,
+ 12135, 12139, 0,
+ 12143, 12147, 12151, 12155, 0,
+ 12183, 12187, 12191, 12195, 0,
+ 12159, 12163, 0,
+ 2003, 12167, 12171, 12175, 12179, 0,
+ 12267, 12271, 0,
+ 12239, 12243, 0,
+ 12231, 12235, 0,
+ 12247, 12251, 0,
+ 12275, 12279, 0,
+ 12259, 12263, 0,
+ 12397, 12401, 12405, 12409, 0,
+ 12283, 12287, 12291, 12295, 0,
+ 2008, 12199, 12203, 0,
+ 12207, 12211, 0,
+ 1998, 0,
+ 2028, 0,
+ 2033, 0,
+ 2038, 0,
+ 2043, 0,
+ 2048, 0,
+ 2053, 0,
+ 2013, 0,
+ 2058, 0,
+ 2063, 0,
+ 2018, 0,
+ 2023, 0,
+ 2078, 0,
+ 2083, 0,
+ 2088, 0,
+ 2068, 2073, 0,
+ 2103, 0,
+ 2108, 0,
+ 2113, 0,
+ 2118, 0,
+ 2093, 0,
+ 2098, 0,
+ 2138, 0,
+ 2143, 0,
+ 2123, 2128, 2133, 0,
+ 2148, 0,
+ 2153, 2163, 0,
+ 2158, 0,
+ 2168, 0,
+ 2173, 0,
+ 2178, 2183, 2188, 0,
+ 2193, 0,
+ 2198, 2208, 0,
+ 2203, 0,
+ 2213, 2218, 2228, 0,
+ 2223, 0,
+ 2282, 0,
+ 2257, 0,
+ 2262, 0,
+ 2267, 0,
+ 2272, 0,
+ 2277, 0,
+ 2287, 2292, 2317, 0,
+ 2347, 0,
+ 2322, 0,
+ 2327, 0,
+ 2332, 0,
+ 2337, 0,
+ 2342, 0,
+ 2297, 0,
+ 2307, 0,
+ 2352, 0,
+ 2637, 0,
+ 2642, 0,
+ 2817, 0,
+ 2822, 0,
+ 2877, 0,
+ 2882, 0,
+ 3197, 3247, 0,
+ 3202, 3252, 0,
+ 3327, 0,
+ 3332, 0,
+ 3417, 0,
+ 3422, 0,
+ 3597, 3607, 3617, 4150, 0,
+ 3602, 3612, 3622, 4155, 0,
+ 4160, 0,
+ 4165, 0,
+ 4170, 0,
+ 4175, 0,
+ 4180, 0,
+ 4185, 0,
+ 3637, 3647, 3657, 4190, 0,
+ 3642, 3652, 3662, 4195, 0,
+ 4200, 0,
+ 4205, 0,
+ 4210, 0,
+ 4215, 0,
+ 4220, 0,
+ 4225, 0,
+ 3677, 3687, 0,
+ 3682, 3692, 0,
+ 3707, 3717, 0,
+ 3712, 3722, 0,
+ 3737, 3747, 3757, 4230, 0,
+ 3742, 3752, 3762, 4235, 0,
+ 4240, 0,
+ 4245, 0,
+ 4250, 0,
+ 4255, 0,
+ 4260, 0,
+ 4265, 0,
+ 3777, 3787, 3797, 4270, 0,
+ 3782, 3792, 3802, 4275, 0,
+ 4280, 0,
+ 4285, 0,
+ 4290, 0,
+ 4295, 0,
+ 4300, 0,
+ 4305, 0,
+ 3817, 3827, 3837, 0,
+ 3822, 3832, 3842, 0,
+ 3857, 3867, 3877, 0,
+ 3862, 3872, 3882, 0,
+ 3897, 3907, 0,
+ 3902, 3912, 0,
+ 3927, 3937, 0,
+ 3932, 3942, 0,
+ 3957, 3967, 3977, 0,
+ 3962, 3972, 3982, 0,
+ 3992, 3997, 4002, 0,
+ 4017, 4027, 4037, 4310, 0,
+ 4022, 4032, 4042, 4315, 0,
+ 4320, 0,
+ 4325, 0,
+ 4330, 0,
+ 4335, 0,
+ 4340, 0,
+ 4345, 0,
+ 4057, 4067, 4077, 4350, 0,
+ 4062, 4072, 4082, 4355, 0,
+ 4360, 0,
+ 4365, 0,
+ 4370, 0,
+ 4375, 0,
+ 4380, 0,
+ 4385, 0,
+ 4400, 0,
+ 4473, 0,
+ 4675, 0,
+ 4420, 0,
+ 4521, 4526, 4531, 0,
+ 4493, 0,
+ 4695, 0,
+ 4584, 4589, 4594, 0,
+ 5391, 0,
+ 5396, 0,
+ 5401, 0,
+ 5406, 0,
+ 5416, 0,
+ 5411, 0,
+ 5421, 0,
+ 5426, 0,
+ 5431, 0,
+ 5436, 0,
+ 5441, 0,
+ 5468, 0,
+ 5473, 0,
+ 5478, 0,
+ 5483, 0,
+ 5498, 0,
+ 5493, 0,
+ 5513, 0,
+ 5518, 0,
+ 5523, 0,
+ 5528, 0,
+ 5533, 0,
+ 5538, 0,
+ 5543, 0,
+ 5548, 0,
+ 5593, 0,
+ 5598, 0,
+ 5553, 0,
+ 5558, 0,
+ 5563, 0,
+ 5568, 0,
+ 5603, 0,
+ 5608, 0,
+ 5573, 0,
+ 5578, 0,
+ 5583, 0,
+ 5588, 0,
+ 5613, 0,
+ 5618, 0,
+ 5623, 0,
+ 5628, 0,
+ 7351, 0,
+ 7226, 0,
+ 7231, 0,
+ 7236, 0,
+ 7241, 0,
+ 7246, 0,
+ 7251, 0,
+ 7256, 0,
+ 7261, 0,
+ 7266, 0,
+ 7271, 0,
+ 7276, 0,
+ 7281, 0,
+ 7286, 0,
+ 7291, 0,
+ 7296, 0,
+ 7301, 7306, 0,
+ 7311, 7316, 0,
+ 7321, 7326, 0,
+ 7331, 7336, 0,
+ 7341, 7346, 0,
+ 7366, 0,
+ 7496, 0,
+ 7371, 0,
+ 7376, 0,
+ 7381, 0,
+ 7386, 0,
+ 7391, 0,
+ 7396, 0,
+ 7401, 0,
+ 7406, 0,
+ 7411, 0,
+ 7416, 0,
+ 7421, 0,
+ 7426, 0,
+ 7431, 0,
+ 7436, 0,
+ 7441, 0,
+ 7446, 7451, 0,
+ 7456, 7461, 0,
+ 7466, 7471, 0,
+ 7476, 7481, 0,
+ 7486, 7491, 0,
+ 7501, 0,
+ 7506, 0,
+ 7511, 0,
+ 7516, 0,
+ 7521, 0,
+ 11668, 11673, 0,
+
+};
+
+static const Q_UINT16 li_00[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 16, 18, 20, 0,
+ 0, 22, 39, 43, 49, 56, 74, 76,
+ 84, 92, 108, 110, 116, 123, 127, 137,
+ 154, 0, 157, 166, 174, 182, 202, 205,
+ 212, 215, 225, 0, 0, 0, 0, 0,
+ 0, 232, 249, 253, 259, 266, 284, 286,
+ 294, 303, 318, 321, 327, 334, 338, 348,
+ 365, 0, 368, 377, 385, 394, 414, 417,
+ 425, 428, 439, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 446, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 450, 0, 455, 457, 459, 462,
+ 0, 0, 464, 0, 0, 0, 0, 469,
+ 0, 0, 0, 0, 471, 476, 480, 0,
+ 482, 0, 0, 0, 484, 0, 0, 0,
+ 0, 0, 489, 0, 494, 496, 498, 501,
+ 0, 0, 503, 0, 0, 0, 0, 508,
+ 0, 0, 0, 0, 510, 515, 519, 0,
+ 521, 0, 0, 0, 523, 0, 0, 0,
+};
+
+static const Q_UINT16 li_01[] = {
+ 0, 0, 528, 533, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 538, 541, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 544, 547, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 550, 552, 0, 0, 0, 0,
+ 554, 556, 0, 0, 0, 0, 0, 0,
+ 558, 560, 562, 564, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 566,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 568, 574, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 580,
+ 586, 0, 0, 0, 0, 0, 0, 592,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 594, 596, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_02[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 598, 600,
+ 602, 604, 0, 0, 0, 0, 606, 608,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 610, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_03[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 612, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 614, 0, 0, 0, 622, 0, 627,
+ 0, 633, 0, 0, 0, 0, 0, 641,
+ 0, 646, 0, 0, 0, 648, 0, 0,
+ 0, 655, 0, 0, 661, 0, 663, 0,
+ 0, 665, 0, 0, 0, 674, 0, 679,
+ 0, 686, 0, 0, 0, 0, 0, 695,
+ 0, 700, 0, 0, 0, 703, 0, 0,
+ 0, 712, 719, 723, 0, 0, 727, 0,
+ 0, 0, 729, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_04[] = {
+ 0, 0, 0, 0, 0, 0, 732, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 734, 0, 0, 737, 0, 739, 743, 746,
+ 748, 0, 753, 0, 0, 0, 755, 0,
+ 0, 0, 0, 757, 0, 0, 0, 762,
+ 0, 0, 0, 764, 0, 766, 0, 0,
+ 768, 0, 0, 771, 0, 773, 777, 780,
+ 782, 0, 787, 0, 0, 0, 789, 0,
+ 0, 0, 0, 791, 0, 0, 0, 796,
+ 0, 0, 0, 798, 0, 800, 0, 0,
+ 0, 0, 0, 0, 0, 0, 802, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 804, 806, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 808, 810, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 812, 814, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_05[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 816, 820, 823, 825, 827, 829, 832, 0,
+ 834, 836, 839, 841, 844, 0, 846, 0,
+ 848, 850, 0, 852, 854, 0, 857, 859,
+ 861, 863, 867, 0, 0, 0, 0, 0,
+ 0, 0, 869, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_06[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 871, 873, 876, 879, 882, 885, 926,
+ 936, 962, 965, 1003, 1021, 1041, 1057, 1071,
+ 1074, 1078, 1083, 1086, 1121, 1158, 1183, 1206,
+ 1224, 1232, 1252, 0, 0, 0, 0, 0,
+ 1268, 1278, 1298, 1316, 1344, 1386, 1415, 1450,
+ 1464, 1469, 1476, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1506, 0, 0, 0, 0, 0, 1509,
+ 0, 1511, 1516, 1521, 0, 0, 1526, 1531,
+ 1536, 0, 0, 1541, 1546, 0, 1551, 1556,
+ 1561, 0, 0, 0, 1564, 1567, 1570, 0,
+ 0, 1573, 0, 0, 0, 0, 0, 0,
+ 1576, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1579, 0, 1584, 0,
+ 0, 1589, 0, 0, 0, 1594, 0, 1599,
+ 0, 1604, 0, 1609, 0, 0, 0, 0,
+ 0, 0, 1614, 1617, 0, 0, 1622, 0,
+ 1627, 1630, 0, 0, 0, 1636, 1639, 1642,
+ 1645, 1648, 0, 1651, 1654, 0, 0, 0,
+ 1659, 0, 1664, 1668, 0, 1671, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_07[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_09[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1673, 1675, 1677,
+ 0, 0, 0, 0, 1679, 0, 0, 0,
+ 0, 1681, 1683, 0, 0, 0, 0, 0,
+ 1685, 0, 0, 1687, 0, 0, 0, 1689,
+ 1691, 0, 0, 1693, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1695, 1697, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1699,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1701,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_0A[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1704, 1706,
+ 0, 0, 0, 0, 1708, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1710, 0, 0, 0, 0,
+ 0, 0, 1712, 0, 0, 0, 0, 0,
+ 1714, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_0B[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1716, 1718, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1720,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1724, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1726, 1729,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_0C[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1731, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1733,
+ 0, 0, 0, 0, 0, 0, 1735, 0,
+ 0, 0, 1739, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_0D[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1741, 1744,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1746, 0, 0, 1750, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_0F[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1752, 0, 1754, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1756, 0, 0, 0,
+ 0, 1758, 0, 0, 0, 0, 1760, 0,
+ 0, 0, 0, 1762, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1764, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1768, 0, 1770, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1772, 0, 0, 0,
+ 0, 1774, 0, 0, 0, 0, 1776, 0,
+ 0, 0, 0, 1778, 0, 0, 0, 0,
+ 0, 0, 1780, 1782, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_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, 1784, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_1E[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1786, 1788,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1790, 1792, 0, 0, 0, 0,
+ 0, 0, 1794, 1796, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1798, 1801, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1804, 1806, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1808, 1810, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_1F[] = {
+ 1812, 1817, 1822, 1824, 1826, 1828, 1830, 1832,
+ 1834, 1839, 1844, 1846, 1848, 1850, 1852, 1854,
+ 1856, 1859, 0, 0, 0, 0, 0, 0,
+ 1862, 1865, 0, 0, 0, 0, 0, 0,
+ 1868, 1873, 1878, 1880, 1882, 1884, 1886, 1888,
+ 1890, 1895, 1900, 1902, 1904, 1906, 1908, 1910,
+ 1912, 1916, 0, 0, 0, 0, 0, 0,
+ 1920, 1924, 0, 0, 0, 0, 0, 0,
+ 1928, 1931, 0, 0, 0, 0, 0, 0,
+ 1934, 1937, 0, 0, 0, 0, 0, 0,
+ 1940, 1944, 0, 0, 0, 0, 0, 0,
+ 0, 1948, 0, 0, 0, 0, 0, 0,
+ 1952, 1957, 1962, 1964, 1966, 1968, 1970, 1972,
+ 1974, 1979, 1984, 1986, 1988, 1990, 1992, 1994,
+ 1996, 0, 0, 0, 1998, 0, 0, 0,
+ 0, 0, 0, 0, 2000, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2002, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2004,
+ 0, 0, 0, 0, 0, 0, 2008, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2010, 0,
+ 0, 0, 0, 0, 0, 0, 2012, 0,
+};
+
+static const Q_UINT16 li_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,
+ 2016, 0, 2018, 0, 2020, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2022, 0, 2024, 0, 2026, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_22[] = {
+ 0, 0, 0, 2028, 0, 0, 0, 0,
+ 2030, 0, 0, 2032, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2034, 0, 2036, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2038, 0, 0, 0,
+ 0, 0, 0, 2040, 0, 2042, 0, 0,
+ 2044, 0, 0, 0, 0, 2046, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2048, 0, 0, 2050, 2052, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2054, 2056, 0, 0, 2058, 2060,
+ 0, 0, 2062, 2064, 2066, 2068, 0, 0,
+ 0, 0, 2070, 2072, 0, 0, 2074, 2076,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2078, 2080, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2082, 0, 0, 0, 0, 0,
+ 2084, 2086, 0, 2088, 0, 0, 0, 0,
+ 0, 0, 2090, 2092, 2094, 2096, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 li_30[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2098, 0,
+ 0, 0, 0, 2100, 0, 2102, 0, 2104,
+ 0, 2106, 0, 2108, 0, 2110, 0, 2112,
+ 0, 2114, 0, 2116, 0, 2118, 0, 2120,
+ 0, 2122, 0, 0, 2124, 0, 2126, 0,
+ 2128, 0, 0, 0, 0, 0, 0, 2130,
+ 0, 0, 2133, 0, 0, 2136, 0, 0,
+ 2139, 0, 0, 2142, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2145, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2147, 0,
+ 0, 0, 0, 2149, 0, 2151, 0, 2153,
+ 0, 2155, 0, 2157, 0, 2159, 0, 2161,
+ 0, 2163, 0, 2165, 0, 2167, 0, 2169,
+ 0, 2171, 0, 0, 2173, 0, 2175, 0,
+ 2177, 0, 0, 0, 0, 0, 0, 2179,
+ 0, 0, 2182, 0, 0, 2185, 0, 0,
+ 2188, 0, 0, 2191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2194,
+ 2196, 2198, 2200, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2202, 0, 0,
+};
+
+static const Q_UINT16 li_FB[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2204, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 * const ligature_info[256] = {
+ li_00, li_01, li_02, li_03, li_04, li_05, li_06, li_07,
+ li_07, li_09, li_0A, li_0B, li_0C, li_0D, li_07, li_0F,
+ li_10, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_1E, li_1F,
+ li_07, li_21, li_22, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_30, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
+ li_07, li_07, li_07, li_FB, li_07, li_07, li_07, li_07,
+};
+// 16188 bytes
+
+static const Q_UINT8 dir_00[] = {
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 8, 7, 8, 9, 7, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 7, 7, 7, 8,
+ 9, 10, 10, 4, 4, 4, 10, 10,
+ 138, 138, 10, 4, 6, 4, 6, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 6, 10, 138, 10, 138, 10,
+ 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, 138, 10, 138, 10, 10,
+ 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, 138, 10, 138, 10, 18,
+ 18, 18, 18, 18, 18, 7, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 6, 10, 4, 4, 4, 4, 10, 10,
+ 10, 10, 0, 138, 10, 10, 10, 10,
+ 4, 4, 2, 2, 10, 0, 10, 10,
+ 10, 2, 0, 138, 10, 10, 10, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 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, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_01[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_02[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 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, 10, 0, 0, 0, 0, 0,
+ 0, 0, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 0, 0, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 0, 0, 0, 0, 0, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_03[] = {
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 17, 17, 17, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 10, 10, 0, 0,
+ 0, 0, 0, 0, 0, 0, 10, 0,
+ 0, 0, 0, 0, 10, 10, 0, 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,
+};
+
+static const Q_UINT8 dir_04[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 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, 17, 17, 17, 0,
+ 17, 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,
+};
+
+static const Q_UINT8 dir_05[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 0, 0, 0, 0, 0,
+ 0, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 0, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 0, 17, 17, 17, 1, 17,
+ 1, 17, 17, 1, 17, 0, 0, 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, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_06[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 13, 0, 0, 0, 13,
+ 0, 13, 77, 77, 77, 77, 45, 77,
+ 45, 77, 45, 45, 45, 45, 45, 77,
+ 77, 77, 77, 45, 45, 45, 45, 45,
+ 45, 45, 45, 0, 0, 0, 0, 0,
+ 109, 45, 45, 45, 45, 45, 45, 45,
+ 77, 77, 45, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 4, 5, 5, 13, 0, 0,
+ 17, 13, 77, 77, 13, 77, 77, 77,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 77, 45, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 45, 77, 45, 77,
+ 45, 45, 77, 77, 13, 13, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 13, 13, 17,
+ 17, 10, 17, 17, 17, 17, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 45, 45, 45, 13, 13, 0,
+};
+
+static const Q_UINT8 dir_07[] = {
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 0, 18,
+ 77, 17, 45, 45, 45, 77, 77, 77,
+ 77, 77, 45, 45, 45, 45, 77, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 77, 45, 77, 45, 77, 0, 0, 0,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 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,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 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,
+};
+
+static const Q_UINT8 dir_09[] = {
+ 0, 17, 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, 17, 0, 0, 0,
+ 0, 17, 17, 17, 17, 17, 17, 17,
+ 17, 0, 0, 0, 0, 17, 0, 0,
+ 0, 17, 17, 17, 17, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 17, 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, 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, 17, 0, 0, 0,
+ 0, 17, 17, 17, 17, 0, 0, 0,
+ 0, 0, 0, 0, 0, 17, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 17, 17, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_0A[] = {
+ 0, 0, 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, 17, 0, 0, 0,
+ 0, 17, 17, 0, 0, 0, 0, 17,
+ 17, 0, 0, 17, 17, 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,
+ 17, 17, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 17, 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, 17, 0, 0, 0,
+ 0, 17, 17, 17, 17, 17, 0, 17,
+ 17, 0, 0, 0, 0, 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,
+};
+
+static const Q_UINT8 dir_0B[] = {
+ 0, 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, 17, 0, 0, 17,
+ 0, 17, 17, 17, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 17, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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, 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,
+ 17, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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,
+};
+
+static const Q_UINT8 dir_0C[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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, 17,
+ 17, 0, 0, 0, 0, 0, 17, 17,
+ 17, 0, 17, 17, 17, 17, 0, 0,
+ 0, 0, 0, 0, 0, 17, 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, 17,
+ 0, 0, 0, 0, 0, 0, 17, 0,
+ 0, 0, 0, 0, 17, 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,
+};
+
+static const Q_UINT8 dir_0D[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 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, 17, 17, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 17, 0, 0, 0, 0, 0,
+ 0, 0, 17, 17, 17, 0, 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,
+};
+
+static const Q_UINT8 dir_0E[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 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, 0, 0, 17, 17, 17, 17,
+ 17, 17, 17, 0, 0, 0, 0, 4,
+ 0, 0, 0, 0, 0, 0, 0, 17,
+ 17, 17, 17, 17, 17, 17, 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, 17, 0, 0, 17, 17, 17, 17,
+ 17, 17, 0, 17, 17, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 17, 17, 17, 17, 17, 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,
+};
+
+static const Q_UINT8 dir_0F[] = {
+ 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, 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, 17, 0, 17,
+ 0, 17, 10, 10, 10, 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, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 0,
+ 17, 17, 17, 17, 17, 0, 17, 17,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 0, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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,
+};
+
+static const Q_UINT8 dir_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, 17, 17, 17,
+ 17, 0, 17, 0, 0, 0, 17, 17,
+ 0, 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,
+ 17, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_16[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 0, 0, 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, 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,
+};
+
+static const Q_UINT8 dir_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, 0, 0, 0, 0, 0, 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,
+ 17, 17, 17, 17, 17, 17, 0, 0,
+ 0, 0, 0, 0, 0, 0, 17, 0,
+ 0, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 0, 0, 0, 0,
+ 0, 0, 0, 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,
+};
+
+static const Q_UINT8 dir_18[] = {
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 18, 18, 18, 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_1F[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 0, 10,
+ 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 10, 10, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 10, 10, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 10, 10, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 10, 10, 0,
+};
+
+static const Q_UINT8 dir_20[] = {
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 18, 18, 18, 0, 1,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 9, 7, 11, 14, 16, 12, 15, 9,
+ 4, 4, 4, 4, 4, 10, 10, 10,
+ 10, 138, 138, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 138, 138, 0,
+ 10, 10, 10, 10, 10, 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, 18, 18, 18, 18, 18, 18,
+ 2, 0, 0, 0, 2, 2, 2, 2,
+ 2, 2, 4, 4, 10, 138, 138, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 4, 4, 10, 138, 138, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 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,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 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,
+};
+
+static const Q_UINT8 dir_21[] = {
+ 10, 10, 0, 10, 10, 10, 10, 0,
+ 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 10, 0, 10, 10,
+ 10, 0, 0, 0, 0, 0, 10, 10,
+ 10, 10, 10, 10, 0, 10, 0, 10,
+ 0, 10, 0, 0, 0, 0, 4, 0,
+ 0, 0, 10, 0, 0, 0, 0, 0,
+ 0, 0, 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, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 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,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_22[] = {
+ 10, 138, 138, 138, 138, 10, 10, 10,
+ 138, 138, 138, 138, 138, 138, 10, 10,
+ 10, 138, 4, 4, 10, 138, 138, 10,
+ 10, 10, 138, 138, 138, 138, 10, 138,
+ 138, 138, 138, 10, 138, 10, 138, 10,
+ 10, 10, 10, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 10, 10, 10, 10,
+ 10, 138, 10, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 10, 10, 10,
+ 10, 10, 138, 138, 138, 138, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 138,
+ 138, 10, 138, 10, 138, 138, 138, 138,
+ 138, 138, 138, 138, 10, 10, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 10, 10, 138,
+ 138, 138, 138, 10, 10, 10, 10, 10,
+ 138, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 138, 138, 10, 10, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 10, 10, 10, 10, 10, 138, 138,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 138, 138, 138, 138, 138, 10, 10,
+ 138, 138, 10, 10, 10, 10, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 10, 10,
+ 138, 138, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_23[] = {
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 138, 138, 138, 138, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 138, 138, 10, 10, 10, 10, 10, 10,
+ 10, 138, 138, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 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, 10, 0, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 0, 10, 10,
+ 10, 10, 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,
+};
+
+static const Q_UINT8 dir_24[] = {
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 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,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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,
+};
+
+static const Q_UINT8 dir_25[] = {
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_26[] = {
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 0, 0, 0, 0,
+ 0, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 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,
+};
+
+static const Q_UINT8 dir_27[] = {
+ 0, 10, 10, 10, 10, 0, 10, 10,
+ 10, 10, 0, 0, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 0, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 0, 10, 0, 10,
+ 10, 10, 10, 0, 0, 0, 10, 0,
+ 10, 10, 10, 10, 10, 10, 10, 0,
+ 0, 10, 10, 10, 10, 10, 10, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 0, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 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,
+};
+
+static const Q_UINT8 dir_28[] = {
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+};
+
+static const Q_UINT8 dir_2E[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 0, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_2F[] = {
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 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,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_30[] = {
+ 9, 10, 10, 10, 10, 0, 0, 0,
+ 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 10, 10, 138, 138, 138, 138,
+ 138, 138, 138, 138, 10, 10, 10, 10,
+ 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 17, 17, 17, 17, 17, 17,
+ 10, 0, 0, 0, 0, 0, 10, 10,
+ 0, 0, 0, 0, 0, 0, 10, 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, 17, 17, 10, 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, 10, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_A4[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 0, 0, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 0, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 0, 10, 10, 10, 0, 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,
+};
+
+static const Q_UINT8 dir_FB[] = {
+ 0, 0, 0, 0, 0, 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, 17, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 4, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 0, 1, 0,
+ 1, 1, 0, 1, 1, 0, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+};
+
+static const Q_UINT8 dir_FC[] = {
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+};
+
+static const Q_UINT8 dir_FD[] = {
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 10, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 0, 0, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 0, 0, 0, 0,
+};
+
+static const Q_UINT8 dir_FE[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 17, 17, 17, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 0, 0, 0,
+ 0, 10, 10, 10, 10, 10, 10, 10,
+ 6, 10, 6, 0, 10, 6, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 4,
+ 10, 10, 4, 4, 10, 10, 10, 0,
+ 10, 4, 4, 10, 0, 0, 0, 0,
+ 13, 13, 13, 0, 13, 0, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 0, 0, 18,
+};
+
+static const Q_UINT8 dir_FF[] = {
+ 0, 10, 10, 4, 4, 4, 10, 10,
+ 10, 10, 10, 4, 6, 4, 6, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 6, 10, 10, 10, 10, 10,
+ 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, 10, 10, 10, 10, 10,
+ 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, 10, 10, 10, 10, 0,
+ 0, 10, 10, 10, 10, 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,
+ 4, 4, 10, 10, 10, 4, 4, 0,
+ 10, 10, 10, 10, 10, 10, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 18, 18, 18, 10, 10, 0, 0,
+};
+
+static const Q_UINT8 * const direction_info[256] = {
+ dir_00, dir_01, dir_02, dir_03, dir_04, dir_05, dir_06, dir_07,
+ dir_01, dir_09, dir_0A, dir_0B, dir_0C, dir_0D, dir_0E, dir_0F,
+ dir_10, dir_01, dir_01, dir_01, dir_01, dir_01, dir_16, dir_17,
+ dir_18, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_1F,
+ dir_20, dir_21, dir_22, dir_23, dir_24, dir_25, dir_26, dir_27,
+ dir_28, dir_01, dir_01, dir_01, dir_01, dir_01, dir_2E, dir_2F,
+ dir_30, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_A4, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
+ dir_01, dir_01, dir_01, dir_FB, dir_FC, dir_FD, dir_FE, dir_FF,
+};
+// 26940 bytes
+
+#endif
+
+// END OF GENERATED DATA
+
+// This is generated too. Script?
+
+#ifndef QT_NO_UNICODETABLES
+
+static const Q_UINT16 case_0 [] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0, 0, 0, 0, 0,
+ 0, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0x0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0x0, 0, 0,
+ 0, 0, 0x0, 0, 0, 0, 0, 0,
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0,
+ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x0,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x178,
+};
+
+static const Q_UINT16 case_1 [] = {
+ 0x101, 0x100, 0x103, 0x102, 0x105, 0x104, 0x107, 0x106,
+ 0x109, 0x108, 0x10b, 0x10a, 0x10d, 0x10c, 0x10f, 0x10e,
+ 0x111, 0x110, 0x113, 0x112, 0x115, 0x114, 0x117, 0x116,
+ 0x119, 0x118, 0x11b, 0x11a, 0x11d, 0x11c, 0x11f, 0x11e,
+ 0x121, 0x120, 0x123, 0x122, 0x125, 0x124, 0x127, 0x126,
+ 0x129, 0x128, 0x12b, 0x12a, 0x12d, 0x12c, 0x12f, 0x12e,
+ 0x69, 0x49, 0x133, 0x132, 0x135, 0x134, 0x137, 0x136,
+ 0x0, 0x13a, 0x139, 0x13c, 0x13b, 0x13e, 0x13d, 0x140,
+ 0x13f, 0x142, 0x141, 0x144, 0x143, 0x146, 0x145, 0x148,
+ 0x147, 0x0, 0x14b, 0x14a, 0x14d, 0x14c, 0x14f, 0x14e,
+ 0x151, 0x150, 0x153, 0x152, 0x155, 0x154, 0x157, 0x156,
+ 0x159, 0x158, 0x15b, 0x15a, 0x15d, 0x15c, 0x15f, 0x15e,
+ 0x161, 0x160, 0x163, 0x162, 0x165, 0x164, 0x167, 0x166,
+ 0x169, 0x168, 0x16b, 0x16a, 0x16d, 0x16c, 0x16f, 0x16e,
+ 0x171, 0x170, 0x173, 0x172, 0x175, 0x174, 0x177, 0x176,
+ 0xff, 0x17a, 0x179, 0x17c, 0x17b, 0x17e, 0x17d, 0x53,
+ 0x0, 0x253, 0x183, 0x182, 0x185, 0x184, 0x254, 0x188,
+ 0x187, 0x256, 0x257, 0x18c, 0x18b, 0x0, 0x1dd, 0x259,
+ 0x25b, 0x192, 0x191, 0x260, 0x263, 0x3d9, 0x269, 0x268,
+ 0x199, 0x198, 0x51, 0x0, 0x26f, 0x272, 0x0, 0x275,
+ 0x1a1, 0x1a0, 0x1a3, 0x1a2, 0x1a5, 0x1a4, 0x280, 0x1a8,
+ 0x1a7, 0x283, 0, 0x0, 0x1ad, 0x1ac, 0x288, 0x1b0,
+ 0x1af, 0x28a, 0x28b, 0x1b4, 0x1b3, 0x1b6, 0x1b5, 0x292,
+ 0x1b9, 0x1b8, 0x0, 0, 0x1bd, 0x1bc, 0, 0,
+ 0, 0, 0, 0, 0x1c6, 0, 0x1c4, 0x1c9,
+ 0, 0x1c7, 0x1cc, 0, 0x1ca, 0x1ce, 0x1cd, 0x1d0,
+ 0x1cf, 0x1d2, 0x1d1, 0x1d4, 0x1d3, 0x1d6, 0x1d5, 0x1d8,
+ 0x1d7, 0x1da, 0x1d9, 0x1dc, 0x1db, 0x18e, 0x1df, 0x1de,
+ 0x1e1, 0x1e0, 0x1e3, 0x1e2, 0x1e5, 0x1e4, 0x1e7, 0x1e6,
+ 0x1e9, 0x1e8, 0x1eb, 0x1ea, 0x1ed, 0x1ec, 0x1ef, 0x1ee,
+ 0x0, 0x1f3, 0, 0x1f1, 0x1f5, 0x1f4, 0, 0,
+ 0, 0, 0x1fb, 0x1fa, 0x1fd, 0x1fc, 0x1ff, 0x1fe,
+};
+
+static const Q_UINT16 case_2 [] = {
+ 0x201, 0x200, 0x203, 0x202, 0x205, 0x204, 0x207, 0x206,
+ 0x209, 0x208, 0x20b, 0x20a, 0x20d, 0x20c, 0x20f, 0x20e,
+ 0x211, 0x210, 0x213, 0x212, 0x215, 0x214, 0x217, 0x216,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x0, 0x0, 0x0, 0x181, 0x186, 0x0, 0x189, 0x18a,
+ 0x0, 0x18f, 0x0, 0x190, 0x0, 0x0, 0x0, 0x0,
+ 0x193, 0x0, 0x0, 0x194, 0x0, 0x0, 0x631, 0x579,
+ 0x197, 0x196, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19c,
+ 0x0, 0x0, 0x19d, 0x0, 0x0, 0x19f, 0x0, 0x0,
+ 0x0, 0x0, 0x7e1, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x1a6, 0x0, 0x0, 0x1a9, 0x0, 0x0, 0x0, 0x0,
+ 0x1ae, 0x0, 0x1b1, 0x1b2, 0x0, 0xa21, 0x971, 0x0,
+ 0x0, 0x0, 0x1b7, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 case_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, 0x3ac, 0,
+ 0x3ad, 0x3ae, 0x3af, 0, 0x3cc, 0, 0x3cd, 0x3ce,
+ 0x0, 0x3b1, 0x3b2, 0x3b3, 0x3b4, 0x3b5, 0x3b6, 0x3b7,
+ 0x3b8, 0x3b9, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3be, 0x3bf,
+ 0x3c0, 0x3c1, 0, 0x3c3, 0x3c4, 0x3c5, 0x3c6, 0x3c7,
+ 0x3c8, 0x3c9, 0x3ca, 0x3cb, 0x386, 0x388, 0x389, 0x38a,
+ 0x0, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397,
+ 0x398, 0x399, 0x39a, 0x39b, 0x39c, 0x39d, 0x39e, 0x39f,
+ 0x3a0, 0x3a1, 0x3a3, 0x3a3, 0x3a4, 0x3a5, 0x3a6, 0x3a7,
+ 0x3a8, 0x3a9, 0x3aa, 0x3ab, 0x38c, 0x38e, 0x38f, 0,
+ 0x392, 0x398, 0x0, 0x0, 0x0, 0x3a6, 0x3a0, 0,
+ 0, 0, 0x0, 0, 0x0, 0, 0x0, 0,
+ 0x0, 0, 0x3e3, 0x3e2, 0x3e5, 0x3e4, 0x3e7, 0x3e6,
+ 0x3e9, 0x3e8, 0x3eb, 0x3ea, 0x3ed, 0x3ec, 0x3ef, 0x3ee,
+ 0x39a, 0x3a1, 0x3a3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 case_4 [] = {
+ 0, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457,
+ 0x458, 0x459, 0x45a, 0x45b, 0x45c, 0, 0x45e, 0x45f,
+ 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437,
+ 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, 0x43f,
+ 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447,
+ 0x448, 0x449, 0x44a, 0x44b, 0x44c, 0x44d, 0x44e, 0x44f,
+ 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417,
+ 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x41f,
+ 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427,
+ 0x428, 0x429, 0x42a, 0x42b, 0x42c, 0x42d, 0x42e, 0x42f,
+ 0, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407,
+ 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0, 0x40e, 0x40f,
+ 0x461, 0x460, 0x463, 0x462, 0x465, 0x464, 0x467, 0x466,
+ 0x469, 0x468, 0x46b, 0x46a, 0x46d, 0x46c, 0x46f, 0x46e,
+ 0x471, 0x470, 0x473, 0x472, 0x475, 0x474, 0x477, 0x476,
+ 0x479, 0x478, 0x47b, 0x47a, 0x47d, 0x47c, 0x47f, 0x47e,
+ 0x481, 0x480, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x491, 0x490, 0x493, 0x492, 0x495, 0x494, 0x497, 0x496,
+ 0x499, 0x498, 0x49b, 0x49a, 0x49d, 0x49c, 0x49f, 0x49e,
+ 0x4a1, 0x4a0, 0x4a3, 0x4a2, 0x4a5, 0x4a4, 0x4a7, 0x4a6,
+ 0x4a9, 0x4a8, 0x4ab, 0x4aa, 0x4ad, 0x4ac, 0x4af, 0x4ae,
+ 0x4b1, 0x4b0, 0x4b3, 0x4b2, 0x4b5, 0x4b4, 0x4b7, 0x4b6,
+ 0x4b9, 0x4b8, 0x4bb, 0x4ba, 0x4bd, 0x4bc, 0x4bf, 0x4be,
+ 0, 0x4c2, 0x4c1, 0x4c4, 0x4c3, 0, 0, 0x4c8,
+ 0x4c7, 0, 0, 0x4cc, 0x4cb, 0, 0, 0,
+ 0x4d1, 0x4d0, 0x4d3, 0x4d2, 0x4d5, 0x4d4, 0x4d7, 0x4d6,
+ 0x4d9, 0x4d8, 0x4db, 0x4da, 0x4dd, 0x4dc, 0x4df, 0x4de,
+ 0x4e1, 0x4e0, 0x4e3, 0x4e2, 0x4e5, 0x4e4, 0x4e7, 0x4e6,
+ 0x4e9, 0x4e8, 0x4eb, 0x4ea, 0, 0, 0x4ef, 0x4ee,
+ 0x4f1, 0x4f0, 0x4f3, 0x4f2, 0x4f5, 0x4f4, 0, 0,
+ 0x4f9, 0x4f8, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 case_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, 0x561, 0x562, 0x563, 0x564, 0x565, 0x566, 0x567,
+ 0x568, 0x569, 0x56a, 0x56b, 0x56c, 0x56d, 0x56e, 0x56f,
+ 0x570, 0x571, 0x572, 0x573, 0x574, 0x575, 0x576, 0x577,
+ 0x578, 0x579, 0x57a, 0x57b, 0x57c, 0x57d, 0x57e, 0x57f,
+ 0x580, 0x581, 0x582, 0x583, 0x584, 0x585, 0x586, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0x531, 0x532, 0x533, 0x534, 0x535, 0x536, 0x537,
+ 0x538, 0x539, 0x53a, 0x53b, 0x53c, 0x53d, 0x53e, 0x53f,
+ 0x540, 0x541, 0x542, 0x543, 0x544, 0x545, 0x546, 0x547,
+ 0x548, 0x549, 0x54a, 0x54b, 0x54c, 0x54d, 0x54e, 0x54f,
+ 0x550, 0x551, 0x552, 0x553, 0x554, 0x555, 0x556, 0x0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 case_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,
+ 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7,
+ 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df,
+ 0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7,
+ 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef,
+ 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 case_1e [] = {
+ 0x1e01, 0x1e00, 0x1e03, 0x1e02, 0x1e05, 0x1e04, 0x1e07, 0x1e06,
+ 0x1e09, 0x1e08, 0x1e0b, 0x1e0a, 0x1e0d, 0x1e0c, 0x1e0f, 0x1e0e,
+ 0x1e11, 0x1e10, 0x1e13, 0x1e12, 0x1e15, 0x1e14, 0x1e17, 0x1e16,
+ 0x1e19, 0x1e18, 0x1e1b, 0x1e1a, 0x1e1d, 0x1e1c, 0x1e1f, 0x1e1e,
+ 0x1e21, 0x1e20, 0x1e23, 0x1e22, 0x1e25, 0x1e24, 0x1e27, 0x1e26,
+ 0x1e29, 0x1e28, 0x1e2b, 0x1e2a, 0x1e2d, 0x1e2c, 0x1e2f, 0x1e2e,
+ 0x1e31, 0x1e30, 0x1e33, 0x1e32, 0x1e35, 0x1e34, 0x1e37, 0x1e36,
+ 0x1e39, 0x1e38, 0x1e3b, 0x1e3a, 0x1e3d, 0x1e3c, 0x1e3f, 0x1e3e,
+ 0x1e41, 0x1e40, 0x1e43, 0x1e42, 0x1e45, 0x1e44, 0x1e47, 0x1e46,
+ 0x1e49, 0x1e48, 0x1e4b, 0x1e4a, 0x1e4d, 0x1e4c, 0x1e4f, 0x1e4e,
+ 0x1e51, 0x1e50, 0x1e53, 0x1e52, 0x1e55, 0x1e54, 0x1e57, 0x1e56,
+ 0x1e59, 0x1e58, 0x1e5b, 0x1e5a, 0x1e5d, 0x1e5c, 0x1e5f, 0x1e5e,
+ 0x1e61, 0x1e60, 0x1e63, 0x1e62, 0x1e65, 0x1e64, 0x1e67, 0x1e66,
+ 0x1e69, 0x1e68, 0x1e6b, 0x1e6a, 0x1e6d, 0x1e6c, 0x1e6f, 0x1e6e,
+ 0x1e71, 0x1e70, 0x1e73, 0x1e72, 0x1e75, 0x1e74, 0x1e77, 0x1e76,
+ 0x1e79, 0x1e78, 0x1e7b, 0x1e7a, 0x1e7d, 0x1e7c, 0x1e7f, 0x1e7e,
+ 0x1e81, 0x1e80, 0x1e83, 0x1e82, 0x1e85, 0x1e84, 0x1e87, 0x1e86,
+ 0x1e89, 0x1e88, 0x1e8b, 0x1e8a, 0x1e8d, 0x1e8c, 0x1e8f, 0x1e8e,
+ 0x1e91, 0x1e90, 0x1e93, 0x1e92, 0x1e95, 0x1e94, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x1e60, 0, 0, 0, 0,
+ 0x1ea1, 0x1ea0, 0x1ea3, 0x1ea2, 0x1ea5, 0x1ea4, 0x1ea7, 0x1ea6,
+ 0x1ea9, 0x1ea8, 0x1eab, 0x1eaa, 0x1ead, 0x1eac, 0x1eaf, 0x1eae,
+ 0x1eb1, 0x1eb0, 0x1eb3, 0x1eb2, 0x1eb5, 0x1eb4, 0x1eb7, 0x1eb6,
+ 0x1eb9, 0x1eb8, 0x1ebb, 0x1eba, 0x1ebd, 0x1ebc, 0x1ebf, 0x1ebe,
+ 0x1ec1, 0x1ec0, 0x1ec3, 0x1ec2, 0x1ec5, 0x1ec4, 0x1ec7, 0x1ec6,
+ 0x1ec9, 0x1ec8, 0x1ecb, 0x1eca, 0x1ecd, 0x1ecc, 0x1ecf, 0x1ece,
+ 0x1ed1, 0x1ed0, 0x1ed3, 0x1ed2, 0x1ed5, 0x1ed4, 0x1ed7, 0x1ed6,
+ 0x1ed9, 0x1ed8, 0x1edb, 0x1eda, 0x1edd, 0x1edc, 0x1edf, 0x1ede,
+ 0x1ee1, 0x1ee0, 0x1ee3, 0x1ee2, 0x1ee5, 0x1ee4, 0x1ee7, 0x1ee6,
+ 0x1ee9, 0x1ee8, 0x1eeb, 0x1eea, 0x1eed, 0x1eec, 0x1eef, 0x1eee,
+ 0x1ef1, 0x1ef0, 0x1ef3, 0x1ef2, 0x1ef5, 0x1ef4, 0x1ef7, 0x1ef6,
+ 0x1ef9, 0x1ef8, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 case_1f [] = {
+ 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f,
+ 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07,
+ 0x1f18, 0x1f19, 0x1f1a, 0x1f1b, 0x1f1c, 0x1f1d, 0, 0,
+ 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0, 0,
+ 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f,
+ 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27,
+ 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f,
+ 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37,
+ 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0, 0,
+ 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0, 0,
+ 0x0, 0x1f59, 0x0, 0x1f5b, 0x0, 0x1f5d, 0x0, 0x1f5f,
+ 0, 0x1f51, 0, 0x1f53, 0, 0x1f55, 0, 0x1f57,
+ 0x1f68, 0x1f69, 0x1f6a, 0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f,
+ 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67,
+ 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9, 0x1fca, 0x1fcb, 0x1fda, 0x1fdb,
+ 0x1ff8, 0x1ff9, 0x1fea, 0x1feb, 0x1ffa, 0x1ffb, 0, 0,
+ 0x1f88, 0x1f89, 0x1f8a, 0x1f8b, 0x1f8c, 0x1f8d, 0x1f8e, 0x1f8f,
+ 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87,
+ 0x1f98, 0x1f99, 0x1f9a, 0x1f9b, 0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f,
+ 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97,
+ 0x1fa8, 0x1fa9, 0x1faa, 0x1fab, 0x1fac, 0x1fad, 0x1fae, 0x1faf,
+ 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7,
+ 0x1fb8, 0x1fb9, 0x0, 0x1fbc, 0x0, 0, 0x0, 0x0,
+ 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x1fb3, 0, 0x399, 0,
+ 0, 0, 0x0, 0x1fcc, 0x0, 0, 0x0, 0x0,
+ 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1fc3, 0, 0, 0,
+ 0x1fd8, 0x1fd9, 0x0, 0x0, 0, 0, 0x0, 0x0,
+ 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0, 0, 0, 0,
+ 0x1fe8, 0x1fe9, 0x0, 0x0, 0x0, 0x1fec, 0x0, 0x0,
+ 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0, 0, 0,
+ 0, 0, 0x0, 0x1ffc, 0x0, 0, 0x0, 0x0,
+ 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x1ff3, 0, 0, 0,
+};
+
+static const Q_UINT16 case_20 [] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0x0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 case_21 [] = {
+ 0, 0, 0x0, 0, 0, 0, 0, 0x0,
+ 0, 0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0, 0x0, 0, 0,
+ 0x761, 0x0, 0x0, 0x0, 0x0, 0x0, 0, 0,
+ 0, 0, 0, 0, 0x0, 0, 0x0, 0,
+ 0x0, 0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0, 0x0, 0x0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 case_fb [] = {
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 case_ff [] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47,
+ 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f,
+ 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57,
+ 0xff58, 0xff59, 0xff5a, 0, 0, 0, 0, 0,
+ 0, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27,
+ 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f,
+ 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37,
+ 0xff38, 0xff39, 0xff3a, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const Q_UINT16 * const case_info[256] = {
+
+ case_0, case_1, case_2, case_3, case_4, case_5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ case_10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, case_1e, case_1f,
+ case_20, case_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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, case_fb, 0, 0, 0, case_ff,
+};
+
+static const Q_INT8 num_0 [] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 2, 3, -1, -1, -1, -1,
+ -1, 1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+static const Q_INT8 num_6 [] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, -1, -1, -1, -1, -1, -1,
+};
+
+static const Q_INT8 num_9 [] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 0, 1,
+ 2, 3, 4, 5, 6, 7, 8, 9,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 0, 1,
+ 2, 3, 4, 5, 6, 7, 8, 9,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+static const Q_INT8 num_b [] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 0, 1,
+ 2, 3, 4, 5, 6, 7, 8, 9,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1,
+ 2, 3, 4, 5, 6, 7, 8, 9,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+static const Q_INT8 num_d [] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 0, 1,
+ 2, 3, 4, 5, 6, 7, 8, 9,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+static const Q_INT8 num_e [] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+static const Q_INT8 num_f [] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+static const Q_INT8 num_20 [] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, -1, -1, -1, 4, 5, 6, 7,
+ 8, 9, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+static const Q_INT8 num_ff [] = {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+};
+
+static const Q_INT8 * const decimal_info[256] = {
+ num_0, 0, 0, 0, 0, 0, num_6, 0,
+ 0, num_9, num_9, num_b, num_9, num_d, num_e, num_f,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ num_20, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, num_ff,
+};
+
+static const Q_UINT16 symmetricPairs[] = {
+ 0x0028, 0x0029, 0x0029, 0x0028, 0x003C, 0x003E, 0x003E, 0x003C,
+ 0x005B, 0x005D, 0x005D, 0x005B, 0x007B, 0x007D, 0x007D, 0x007B,
+ 0x2045, 0x2046, 0x2046, 0x2045, 0x207D, 0x207E, 0x207E, 0x207D,
+ 0x208D, 0x208E, 0x208E, 0x208D, 0x3008, 0x3009, 0x3009, 0x3008,
+ 0x300A, 0x300B, 0x300B, 0x300A, 0x300C, 0x300D, 0x300D, 0x300C,
+ 0x300E, 0x300F, 0x300F, 0x300E, 0x3010, 0x3011, 0x3011, 0x3010,
+ 0x3014, 0x3015, 0x3015, 0x3014, 0x3016, 0x3017, 0x3017, 0x3016,
+ 0x3018, 0x3019, 0x3019, 0x3018, 0x301A, 0x301B, 0x301B, 0x301A,
+ 0xFD3E, 0xFD3F, 0xFD3F, 0xFD3E, 0xFE59, 0xFE5A, 0xFE5A, 0xFE59,
+ 0xFE5B, 0xFE5C, 0xFE5C, 0xFE5B, 0xFE5D, 0xFE5E, 0xFE5E, 0xFE5D,
+ 0xFF08, 0xFF09, 0xFF09, 0xFF08, 0xFF3B, 0xFF3D, 0xFF3D, 0xFF3B,
+ 0xFF5B, 0xFF5D, 0xFF5D, 0xFF5B, 0xFF62, 0xFF63, 0xFF63, 0xFF62,
+};
+
+static int symmetricPairsSize =
+ sizeof(symmetricPairs)/sizeof(symmetricPairs[0]);
+
+/*
+ * ----------------------------------------------------------------------
+ * End of unicode tables
+ * ----------------------------------------------------------------------
+ */
+
+#endif
+
+
+static int ucstrcmp( const QString &as, const QString &bs )
+{
+ const QChar *a = as.unicode();
+ const QChar *b = bs.unicode();
+ if ( a == b )
+ return 0;
+ if ( a == 0 )
+ return 1;
+ if ( b == 0 )
+ return -1;
+ int l=QMIN(as.length(),bs.length());
+ while ( l-- && *a == *b )
+ a++,b++;
+ if ( l==-1 )
+ return ( as.length()-bs.length() );
+ return a->unicode() - b->unicode();
+}
+
+static int ucstrncmp( const QChar *a, const QChar *b, int l )
+{
+ while ( l-- && *a == *b )
+ a++,b++;
+ if ( l==-1 )
+ return 0;
+ return a->unicode() - b->unicode();
+}
+
+static int ucstrnicmp( const QChar *a, const QChar *b, int l )
+{
+ while ( l-- && a->lower() == b->lower() )
+ a++,b++;
+ if ( l==-1 )
+ return 0;
+ QChar al = a->lower();
+ QChar bl = b->lower();
+ return al.unicode() - bl.unicode();
+}
+
+// NOT REVISED
+/*! \class QCharRef qstring.h
+ \brief The QCharRef class is a helper class for QString.
+
+ It provides the ability to work on characters in a QString in a natural
+ fashion.
+
+ When you get an object of type QCharRef, you can assign to it, which
+ will operate on the string from which you got it. That is its whole
+ purpose in life. It becomes invalid once further modifications are
+ made to the string: If you want to keep it, copy it into a QChar.
+
+ Most of the QChar member functions also exist in QCharRef. However,
+ they are not explicitly documented here.
+
+ \sa QString::operator[]() QString::at() QChar
+*/
+
+/*! \class QChar qstring.h
+
+\brief The QChar class provides a light-weight Unicode character.
+
+Unicode characters are (so far) 16-bit entities without any markup or
+structure. This class represents such an entity. It is rather
+light-weight, so it can be used everywhere. Most compilers treat it
+approximately like "short int". (In a few years, it may be necessary
+to make QChar 32-bit, once more than 65536 Unicode code points have
+been defined and come into use.)
+
+QChar provides a full complement of testing/classification functions,
+conversion to and from other formats, from composed to decomposed
+unicode, and will try to compare and case-convert if you ask it to.
+
+The classification functions include functions like those in ctype.h,
+but operating on the full range of unicode characters. They all
+return TRUE if the character is a certain type of character, and FALSE
+otherwise.
+
+These functions are: isNull() (returns TRUE if the character is
+U+0000), isPrint() (TRUE if the character is any sort of printable
+character, including whitespace), isPunct() (any sort of punctation),
+isMark() (Unicode Marks), isLetter (letters), isNumber() (any sort of
+numeric characters), isLetterOrNumber(), and isDigit() (decimal digits).
+All of these are wrappers around category(), which returns the
+unicode-defined category of each character.
+
+QChar further provides direction(), which indicates the "natural"
+writing direction of this character, joining(), which indicates how
+this character joins with its neighbors (needed mostly for Arabic)
+and finally mirrored(), which indicates whether this character needs
+to be mirrored when it is printed in its unnatural writing
+direction.
+
+Composed Unicode characters (like &aring;) can be converted to
+decomposed Unicode ("a" followed by "ring above") using
+decomposition().
+
+In Unicode, comparison is not necessarily possible, and case
+conversion is at best very hard. Unicode, covering the "entire"
+globe, also includes a globe-sized collection of case and sorting
+problems. Qt tries, but not very hard: operator== and friends will do
+comparison based purely on the numeric Unicode value (code point) of
+the characters, and upper() and lower() will do case changes when the
+character has a well-defined upper/lower-case equivalent. There is no
+provision for locale-dependent case folding rules or comparison: These
+functions are meant to be fast, so they can be used unambiguously in
+data structures.
+
+The conversion functions include unicode() (to a scalar), latin1() (to
+scalar, but converts all non-Latin1 characters to 0), row() (gives the
+Unicode row), cell() (gives the unicode cell), digitValue() (gives the
+integer value of any of the numerous digit characters), and a host of
+constructors.
+
+\sa QString QCharRef \link unicode.html About Unicode \endlink
+*/
+
+/*! \enum QChar::Category
+
+This enum maps the Unicode character categories. The currently known
+categories are: <ul>
+
+<li> \c NoCategory - used when Qt is dazed and confused and cannot
+make sense of anything.
+
+<li> \c Mark_NonSpacing - (Mn) -
+
+<li> \c Mark_SpacingCombining - (Mc) -
+
+<li> \c Mark_Enclosing - (Me) -
+
+<li> \c Number_DecimalDigit - (Nd) -
+
+<li> \c Number_Letter - (Nl) -
+
+<li> \c Number_Other - (No) -
+
+<li> \c Separator_Space - (Zs) -
+
+<li> \c Separator_Line - (Zl) -
+
+<li> \c Separator_Paragraph - (Zp) -
+
+<li> \c Other_Control - (Cc) -
+
+<li> \c Other_Format - (Cf) -
+
+<li> \c Other_Surrogate - (Cs) -
+
+<li> \c Other_PrivateUse - (Co) -
+
+<li> \c Other_NotAssigned - (Cn) -
+
+<li> \c Letter_Uppercase - (Lu) -
+
+<li> \c Letter_Lowercase - (Ll) -
+
+<li> \c Letter_Titlecase - (Lt) -
+
+<li> \c Letter_Modifier - (Lm) -
+
+<li> \c Letter_Other - (Lo) -
+
+<li> \c Punctuation_Connector - (Pc) -
+
+<li> \c Punctuation_Dask - (Pd) -
+
+<li> \c Punctuation_Open - (Ps) -
+
+<li> \c Punctuation_Close - (Pe) -
+
+<li> \c Punctuation_InitialQuote - (Pi) -
+
+<li> \c Punctuation_FinalQuote - (Pf) -
+
+<li> \c Punctuation_Other - (Po) -
+
+<li> \c Symbol_Math - (Sm) -
+
+<li> \c Symbol_Currency - (Sc) -
+
+<li> \c Symbol_Modifier - (Sk) -
+
+<li> \c Symbol_Other - (So) -
+
+</ul>
+*/
+
+/*! \enum QChar::Direction
+
+ This enum type defines the Unicode direction attributes.
+ See <a href="http://www.unicode.org">the Unicode Standard</a>
+ for a description of the values.
+
+ In order to conform to C/C++ naming conventions "Dir" is
+ prepended to the codes used in The Unicode Standard.
+*/
+
+/*! \enum QChar::Decomposition
+
+ This enum type defines the Unicode decomposition attributes.
+ See <a href="http://www.unicode.org">the Unicode Standard</a>
+ for a description of the values.
+*/
+
+/*! \enum QChar::Joining
+
+ This enum type defines the Unicode decomposition attributes.
+ See <a href="http://www.unicode.org">the Unicode Standard</a>
+ for a description of the values.
+*/
+
+
+
+/*! \fn QChar::QChar()
+
+Constructs a null QChar (one that isNull()).
+*/
+
+
+/*! \fn QChar::QChar( char c )
+
+Constructs a QChar corresponding to ASCII/Latin1 character \a c.
+*/
+
+
+/*! \fn QChar::QChar( uchar c )
+
+Constructs a QChar corresponding to ASCII/Latin1 character \a c.
+*/
+
+
+/*! \fn QChar::QChar( uchar c, uchar r )
+
+Constructs a QChar for Unicode cell \a c in row \a r.
+*/
+
+
+/*! \fn QChar::QChar( const QChar& c )
+
+Constructs a copy of \a c. This is a deep copy, if such a
+light-weight object can be said to have deep copies.
+*/
+
+
+/*! \fn QChar::QChar( ushort rc )
+
+Constructs a QChar for the character with Unicode code point \a rc.
+*/
+
+
+/*! \fn QChar::QChar( short rc )
+
+Constructs a QChar for the character with Unicode code point \a rc.
+*/
+
+
+/*! \fn QChar::QChar( uint rc )
+
+Constructs a QChar for the character with Unicode code point \a rc.
+*/
+
+
+/*! \fn QChar::QChar( int rc )
+
+Constructs a QChar for the character with Unicode code point \a rc.
+*/
+
+
+/*! \fn bool QChar::networkOrdered ()
+
+ Returns TRUE if this character is in network byte order (MSB first),
+ and FALSE if it is not. This is a platform-dependent property, so
+ we strongly advise against using this function in portable code.
+*/
+
+
+/*!
+ \fn bool QChar::isNull() const
+ Returns TRUE if the characters is the unicode character 0x0000,
+ ie. ASCII NUL.
+*/
+
+/*!
+ \fn uchar QChar::cell () const
+ Returns the cell (least significant byte) of the Unicode character.
+*/
+/*!
+ \fn uchar QChar::row () const
+ Returns the row (most significant byte) of the Unicode character.
+*/
+/*!
+ \fn uchar& QChar::cell ()
+ Returns a reference to the cell (least significant byte) of the Unicode character.
+*/
+/*!
+ \fn uchar& QChar::row ()
+ Returns a reference to the row (most significant byte) of the Unicode character.
+*/
+
+/*!
+ Returns whether the character is a printable character. This is
+ any character not of category Cc or Cn. Note that this gives no indication
+ of whether the character is available in some font.
+*/
+bool QChar::isPrint() const
+{
+ Category c = category();
+ return !(c == Other_Control || c == Other_NotAssigned);
+}
+
+/*!
+ Returns whether the character is a separator
+ character (Separator_* categories).
+*/
+bool QChar::isSpace() const
+{
+ if( !row() )
+ if( cell() >= 9 && cell() <=13 ) return TRUE;
+ Category c = category();
+ return c >= Separator_Space && c <= Separator_Paragraph;
+}
+
+/*!
+ Returns whether the character is a mark (Mark_* categories).
+*/
+bool QChar::isMark() const
+{
+ Category c = category();
+ return c >= Mark_NonSpacing && c <= Mark_Enclosing;
+}
+
+/*!
+ Returns whether the character is punctuation (Punctuation_* categories).
+*/
+bool QChar::isPunct() const
+{
+ Category c = category();
+ return (c >= Punctuation_Connector && c <= Punctuation_Other);
+}
+
+/*!
+ Returns whether the character is a letter (Letter_* categories).
+*/
+bool QChar::isLetter() const
+{
+ Category c = category();
+ return (c >= Letter_Uppercase && c <= Letter_Other);
+}
+
+/*!
+ Returns whether the character is a number (of any sort - Number_* categories).
+
+ \sa isDigit()
+*/
+bool QChar::isNumber() const
+{
+ Category c = category();
+ return c >= Number_DecimalDigit && c <= Number_Other;
+}
+
+/*!
+ Returns whether the character is a letter or number (Letter_* or Number_* categories).
+*/
+bool QChar::isLetterOrNumber() const
+{
+ Category c = category();
+ return (c >= Letter_Uppercase && c <= Letter_Other)
+ || (c >= Number_DecimalDigit && c <= Number_Other);
+}
+
+
+/*!
+ Returns whether the character is a decimal digit (Number_DecimalDigit).
+ */
+bool QChar::isDigit() const
+{
+ return (category() == Number_DecimalDigit);
+}
+
+/*!
+ Returns the numeric value of the digit, or -1 if the character is not
+ a digit.
+*/
+int QChar::digitValue() const
+{
+#ifndef QT_NO_UNICODETABLES
+ const Q_INT8 *dec_row = decimal_info[row()];
+ if( !dec_row )
+ return -1;
+ return decimal_info[row()][cell()];
+#else
+ // ##### just latin1
+ if ( rw != 0 || cl < '0' || cl > '9' )
+ return -1;
+ else
+ return cl - '0';
+#endif
+}
+
+/*!
+ Returns the character category.
+
+ \sa Category
+*/
+QChar::Category QChar::category() const
+{
+#ifndef QT_NO_UNICODETABLES
+ return (Category)(unicode_info[row()][cell()]);
+#else
+// ### just ASCII
+ if ( rw == 0 ) {
+ return (Category)(ui_00[cell()]);
+ }
+ return Letter_Uppercase; //#######
+#endif
+}
+
+/*!
+ Returns the characters directionality.
+
+ \sa Direction
+*/
+QChar::Direction QChar::direction() const
+{
+#ifndef QT_NO_UNICODETABLES
+ const Q_UINT8 *rowp = direction_info[row()];
+ if(!rowp) return QChar::DirL;
+ return (Direction) ( *(rowp+cell()) &0x1f );
+#else
+ return DirL;
+#endif
+}
+
+/*!
+ This function is not supported (it may change to use Unicode
+ character classes).
+
+ Returns information about the joining properties of the
+ character (needed for arabic).
+*/
+QChar::Joining QChar::joining() const
+{
+#ifndef QT_NO_UNICODETABLES
+ const Q_UINT8 *rowp = direction_info[row()];
+ if ( !rowp )
+ return QChar::OtherJoining;
+ return (Joining) ((*(rowp+cell()) >> 5) &0x3);
+#else
+ return OtherJoining;
+#endif
+}
+
+
+/*!
+ Returns whether the character is a mirrored character (one that
+ should be reversed if the text direction is reversed).
+*/
+bool QChar::mirrored() const
+{
+#ifndef QT_NO_UNICODETABLES
+ const Q_UINT8 *rowp = direction_info[row()];
+ if ( !rowp )
+ return FALSE;
+ return *(rowp+cell())>128;
+#else
+ return FALSE;
+#endif
+}
+
+/*!
+ Returns the mirrored char if this character is a mirrored char, the char
+ itself otherwise
+*/
+QChar QChar::mirroredChar() const
+{
+#ifndef QT_NO_UNICODETABLES
+ if(!mirrored()) return *this;
+
+ int i;
+ int c = unicode();
+ for (i = 0; i < symmetricPairsSize; i += 2) {
+ if (symmetricPairs[i] == c)
+ return symmetricPairs[i+1];
+ }
+ return 0;
+#else
+ return *this;
+#endif
+}
+
+/*!
+ Decomposes a character into its parts. Returns QString::null if
+ no decomposition exists.
+*/
+QString QChar::decomposition() const
+{
+#ifndef QT_NO_UNICODETABLES
+ const Q_UINT16 *r = decomposition_info[row()];
+ if(!r) return QString::null;
+
+ Q_UINT16 pos = r[cell()];
+ if(!pos) return QString::null;
+ pos+=2;
+
+ QString s;
+ Q_UINT16 c;
+ while((c = decomposition_map[pos++]) != 0) s += QChar(c);
+
+ return s;
+#else
+ return null;
+#endif
+}
+
+/*!
+ Returns the tag defining the composition of the character.
+ Returns QChar::Single if no decomposition exists.
+*/
+QChar::Decomposition QChar::decompositionTag() const
+{
+#ifndef QT_NO_UNICODETABLES
+ const Q_UINT16 *r = decomposition_info[row()];
+ if(!r) return QChar::Single;
+
+ Q_UINT16 pos = r[cell()];
+ if(!pos) return QChar::Single;
+
+ return (QChar::Decomposition) decomposition_map[pos];
+#else
+ return Single; // ########### FIX eg. just latin1
+#endif
+}
+
+/*!
+ Returns the lowercase equivalent if the character is uppercase,
+ or the character itself otherwise.
+*/
+QChar QChar::lower() const
+{
+#ifndef QT_NO_UNICODETABLES
+ if(category() != Letter_Uppercase) return *this;
+ Q_UINT16 lower = *(case_info[row()]+cell());
+ if(lower == 0) return *this;
+ return lower;
+#else
+ if (row())
+ return *this;
+ else
+ return QChar(tolower(latin1()));
+#endif
+}
+
+/*!
+ Returns the uppercase equivalent if the character is lowercase,
+ or the character itself otherwise.
+*/
+QChar QChar::upper() const
+{
+#ifndef QT_NO_UNICODETABLES
+ if(category() != Letter_Lowercase) return *this;
+ Q_UINT16 upper = *(case_info[row()]+cell());
+ if(upper == 0) return *this;
+ return upper;
+#else
+ if (row())
+ return *this;
+ else
+ return QChar(toupper(latin1()));
+#endif
+}
+
+/*!
+ \fn QChar::operator char() const
+
+ Returns the Latin1 character equivalent to the QChar,
+ or 0. This is mainly useful for non-internationalized software.
+
+ \sa unicode()
+*/
+
+/*!
+ \fn ushort QChar::unicode() const
+
+ Returns the numeric Unicode value equal to the QChar. Normally, you
+ should use QChar objects as they are equivalent, but for some low-level
+ tasks (eg. indexing into an array of Unicode information), this function
+ is useful.
+*/
+
+/*****************************************************************************
+ Documentation of QChar related functions
+ *****************************************************************************/
+
+/*!
+ \fn int operator==( QChar c1, QChar c2 )
+ \relates QChar
+
+ Returns TRUE if \a c1 and \a c2 are the same Unicode character.
+*/
+
+/*!
+ \fn int operator==( char ch, QChar c )
+ \relates QChar
+
+ Returns TRUE if \a c is the ASCII/Latin1 character \a ch.
+*/
+
+/*!
+ \fn int operator==( QChar c, char ch )
+ \relates QChar
+
+ Returns TRUE if \a c is the ASCII/Latin1 character \a ch.
+*/
+
+/*!
+ \fn int operator!=( QChar c1, QChar c2 )
+ \relates QChar
+
+ Returns TRUE if \a c1 and \a c2 are not the same Unicode character.
+*/
+
+/*!
+ \fn int operator!=( char ch, QChar c )
+ \relates QChar
+
+ Returns TRUE if \a c is not the ASCII/Latin1 character \a ch.
+*/
+
+/*!
+ \fn int operator!=( QChar c, char ch )
+ \relates QChar
+
+ Returns TRUE if \a c is not the ASCII/Latin1 character \a ch.
+*/
+
+/*!
+ \fn int operator<=( QChar c1, QChar c2 )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of \a c1 is less than that
+ of \a c2, or they are the same Unicode character.
+*/
+
+/*!
+ \fn int operator<=( QChar c, char ch )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of \a c is less than or
+ equal to that of the ASCII/Latin1 character \a ch.
+*/
+
+/*!
+ \fn int operator<=( char ch, QChar c )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of the ASCII/Latin1
+ character \a ch is less than or equal to that of \a c.
+*/
+
+/*!
+ \fn int operator>=( QChar c1, QChar c2 )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of \a c1 is greater than that
+ of \a c2, or they are the same Unicode character.
+*/
+
+/*!
+ \fn int operator>=( QChar c, char ch )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of \a c is greater than or
+ equal to that of the ASCII/Latin1 character \a ch.
+*/
+
+/*!
+ \fn int operator>=( char ch, QChar c )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of the ASCII/Latin1
+ character \a ch is greater than or equal to that of \a c.
+*/
+
+/*!
+ \fn int operator<( QChar c1, QChar c2 )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of \a c1 is less than that
+ of \a c2.
+*/
+
+/*!
+ \fn int operator<( QChar c, char ch )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of \a c is less than that
+ of the ASCII/Latin1 character \a ch.
+*/
+
+/*!
+ \fn int operator<( char ch, QChar c )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of the ASCII/Latin1
+ character \a ch is less than that of \a c.
+*/
+
+/*!
+ \fn int operator>( QChar c1, QChar c2 )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of \a c1 is greater than
+ that of \a c2.
+*/
+
+/*!
+ \fn int operator>( QChar c, char ch )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of \a c is greater than
+ that of the ASCII/Latin1 character \a ch.
+*/
+
+/*!
+ \fn int operator>( char ch, QChar c )
+ \relates QChar
+
+ Returns TRUE if the numeric Unicode value of the ASCII/Latin1
+ character \a ch is greater than that of \a c.
+*/
+
+#ifndef QT_NO_UNICODETABLES
+
+// small class used internally in QString::Compose()
+class QLigature
+{
+public:
+ QLigature( QChar c );
+
+ Q_UINT16 first() { cur = ligatures; return cur ? *cur : 0; }
+ Q_UINT16 next() { return cur && *cur ? *(cur++) : 0; }
+ Q_UINT16 current() { return cur ? *cur : 0; }
+
+ int match(QString & str, unsigned int index);
+ QChar head();
+ QChar::Decomposition tag();
+
+private:
+ Q_UINT16 *ligatures;
+ Q_UINT16 *cur;
+};
+
+QLigature::QLigature( QChar c )
+{
+ const Q_UINT16 *r = ligature_info[c.row()];
+ if( !r )
+ ligatures = 0;
+ else
+ {
+ const Q_UINT16 pos = r[c.cell()];
+ ligatures = (Q_UINT16 *)&(ligature_map[pos]);
+ }
+ cur = ligatures;
+}
+
+QChar QLigature::head()
+{
+ if(current())
+ return QChar(decomposition_map[current()+1]);
+
+ return QChar::null;
+}
+
+QChar::Decomposition QLigature::tag()
+{
+ if(current())
+ return (QChar::Decomposition) decomposition_map[current()];
+
+ return QChar::Canonical;
+}
+
+int QLigature::match(QString & str, unsigned int index)
+{
+ unsigned int i=index;
+
+ if(!current()) return 0;
+
+ Q_UINT16 lig = current() + 2;
+ Q_UINT16 ch;
+
+ while ((i < str.length()) && (ch = decomposition_map[lig])) {
+ if (str[(int)i] != QChar(ch))
+ return 0;
+ i++; lig++;
+ }
+
+ if (!decomposition_map[lig])
+ {
+ return i-index;
+ }
+ return 0;
+}
+
+#endif
+
+// this function is just used in QString::compose()
+static inline bool format(QChar::Decomposition tag, QString & str,
+ int index, int len)
+{
+ unsigned int l = index + len;
+ unsigned int r = index;
+
+ bool left = FALSE, right = FALSE;
+
+ left = ((l < str.length()) &&
+ ((str[(int)l].joining() == QChar::Dual) ||
+ (str[(int)l].joining() == QChar::Right)));
+ if (r > 0) {
+ r--;
+ //printf("joining(right) = %d\n", str[(int)r].joining());
+ right = (str[(int)r].joining() == QChar::Dual);
+ }
+
+
+ switch (tag) {
+ case QChar::Medial:
+ return (left & right);
+ case QChar::Initial:
+ return (left && !right);
+ case QChar::Final:
+ return (right);// && !left);
+ case QChar::Isolated:
+ default:
+ return (!right && !left);
+ }
+} // format()
+
+/*
+ QString::compose() and visual() were developed by Gordon Tisher
+ <tisher@uniserve.ca>, with input from Lars Knoll <knoll@mpi-hd.mpg.de>,
+ who developed the unicode data tables.
+*/
+/*!
+ Note that this function is not supported in Qt 2.0, and is merely
+ for experimental and illustrative purposes. It is mainly of interest
+ to those experimenting with Arabic and other composition-rich texts.
+
+ Applies possible ligatures to a QString, useful when composition-rich
+ text requires rendering with glyph-poor fonts, but also
+ makes compositions such as QChar(0x0041) ('A') and QChar(0x0308)
+ (Unicode accent diaresis) giving QChar(0x00c4) (German A Umlaut).
+*/
+void QString::compose()
+{
+#ifndef QT_NO_UNICODETABLES
+ unsigned int index=0, len;
+ unsigned int cindex = 0;
+
+ QChar code, head;
+
+ QArray<QChar> dia;
+
+ QString composed = *this;
+
+ while (index < length()) {
+ code = at(index);
+ //printf("\n\nligature for 0x%x:\n", code.unicode());
+ QLigature ligature(code);
+ ligature.first();
+ while(ligature.current()) {
+ if ((len = ligature.match(*this, index)) != 0) {
+ head = ligature.head();
+ unsigned short code = head.unicode();
+ // we exclude Arabic presentation forms A and a few
+ // other ligatures, which are undefined in most fonts
+ if(!(code > 0xfb50 && code < 0xfe80) &&
+ !(code > 0xfb00 && code < 0xfb2a)) {
+ // joining info is only needed for arabic
+ if (format(ligature.tag(), *this, index, len)) {
+ //printf("using ligature 0x%x, len=%d\n",code,len);
+ // replace letter
+ composed.replace(cindex, len, QChar(head));
+ index += len-1;
+ // we continue searching in case we have a final
+ // form because medial ones are preferred.
+ if ( len != 1 || ligature.tag() !=QChar::Final )
+ break;
+ }
+ }
+ }
+ ligature.next();
+ }
+ cindex++;
+ index++;
+ }
+ *this = composed;
+#endif
+}
+
+static QChar LRM ((ushort)0x200e);
+static QChar RLM ((ushort)0x200f);
+static QChar LRE ((ushort)0x202a);
+static QChar RLE ((ushort)0x202b);
+static QChar RLO ((ushort)0x202e);
+static QChar LRO ((ushort)0x202d);
+static QChar PDF ((ushort)0x202c);
+
+#if 0
+static inline bool is_arabic(unsigned short x) {
+ return (((x >= 0x0600) && (x <= 0x07bf)) ||
+ ((x >= 0xfb50) && (x <= 0xfdff)) ||
+ ((x >= 0xfe70) && (x <= 0xfeff)));
+}
+#endif
+
+static inline bool is_neutral(unsigned short dir) {
+ return ((dir == QChar::DirB) ||
+ (dir == QChar::DirS) ||
+ (dir == QChar::DirWS) ||
+ (dir == QChar::DirON) ||
+ (dir == QChar::DirNSM));
+}
+
+/*!
+ This function returns the basic directionality of the string (QChar::DirR for
+ right to left and QChar::DirL for left to right). Useful to find the right
+ alignment.
+ */
+QChar::Direction QString::basicDirection()
+{
+#ifndef QT_NO_UNICODETABLES
+ // find base direction
+ unsigned int pos = 0;
+ while ((pos < length()) &&
+ (at(pos) != RLE) &&
+ (at(pos) != LRE) &&
+ (at(pos) != RLO) &&
+ (at(pos) != LRO) &&
+ (at(pos).direction() > 1) &&
+ (at(pos).direction() != QChar::DirAL)) // not R and not L
+ pos++;
+
+ if ((at(pos).direction() == QChar::DirR) ||
+ (at(pos).direction() == QChar::DirAL) ||
+ (at(pos) == RLE) ||
+ (at(pos) == RLO))
+ return QChar::DirR;
+#endif
+
+ return QChar::DirL;
+}
+
+#ifndef QT_NO_UNICODETABLES
+// reverses part of the QChar array to get visual ordering
+// called from QString::visual()
+//
+static unsigned int reverse( QString &chars, unsigned char *level,
+ unsigned int a, unsigned int b)
+{
+ unsigned int c = a;
+ unsigned char lev = level[c];
+
+ while ((c < b) && (level[c] >= lev)) {
+ if (level[c] > lev)
+ c = reverse(chars, level, c, b);
+ c++;
+ }
+
+ if (lev > 0) {
+ QChar temp;
+ unsigned int d = a, e = c-1;
+ while (d < e) {
+ temp = chars[(int)d];
+ chars[(int)d] = chars[(int)e];
+ chars[(int)e] = temp;
+
+ d++; e--;
+ }
+ }
+
+ return c;
+}
+
+// small class used for the ordering algorithm in QString::visual()
+class QBidiState {
+public:
+ unsigned char level;
+ signed char override;
+
+ QBidiState(unsigned char l, signed char o) : level(l), override(o) {};
+};
+
+// matrix for resolving neutral types
+
+#define NEG1 (QChar::Direction)(-1)
+
+static QChar::Direction resolv[5][5] =
+{
+ { NEG1, QChar::DirR, QChar::DirL, QChar::DirEN, QChar::DirAN },
+ { QChar::DirR, QChar::DirR, NEG1, QChar::DirR, QChar::DirR },
+ { QChar::DirL, NEG1, QChar::DirL, QChar::DirL, NEG1 },
+ { QChar::DirEN, QChar::DirR, QChar::DirL, QChar::DirEN, QChar::DirR },
+ { QChar::DirAN, QChar::DirR, NEG1, NEG1, QChar::DirAN }
+};
+
+#endif
+
+/*!
+ This function returns the QString ordered visually. Useful for
+ painting the string or when transforming to a visually ordered
+ encoding.
+*/
+QString QString::visual(int index, int len)
+{
+#ifndef QT_NO_UNICODETABLES
+ // #### This needs much more optimizing - it is called for
+ // #### every text operation.
+
+ unsigned char *level;
+ QChar::Direction *dir;
+ unsigned char base = 0;
+
+ unsigned int l = length();
+
+ // check bounds
+ if (len == -1)
+ len = length()-index;
+ if ((uint)index > l)
+ return QString::null;
+
+ // find base direction
+ unsigned int pos = 0;
+ while ((pos < length()) &&
+ (at(pos) != RLE) &&
+ (at(pos) != LRE) &&
+ (at(pos) != RLO) &&
+ (at(pos) != LRO) &&
+ (at(pos).direction() > 1) &&
+ (at(pos).direction() != QChar::DirAL)
+ ) // not R and not L
+ pos++;
+
+ if ((pos < length()) &&
+ ((at(pos).direction() == QChar::DirR) ||
+ (at(pos).direction() == QChar::DirAL) ||
+ (at(pos) == RLE) ||
+ (at(pos) == RLO)))
+ base = 1;
+
+ // is there any BiDi char at all?
+ if ( base == 0 && pos == l ) {
+ return mid(index, len);
+ }
+
+
+ level = new uchar[l];
+ dir = new QChar::Direction[l];
+
+ // explicit override pass
+ //unsigned int code_count = 0;
+
+ QStack<QBidiState> stack;
+ stack.setAutoDelete(TRUE);
+
+ unsigned char clevel = base;
+ signed char override = -1;
+
+ for (pos = 0; pos < l; pos++) {
+
+ if (at(pos) == RLE) {
+ //code_count++;
+ stack.push(new QBidiState(clevel, override));
+ if (clevel < 254)
+ clevel += 1 + clevel % 2;
+ override = -1;
+ }
+ else if (at(pos) == LRE) {
+ //code_count++;
+ stack.push(new QBidiState(clevel, override));
+ if (clevel < 254)
+ clevel += 2 - clevel % 2;
+ override = -1;
+ }
+ else if (at(pos) == RLO) {
+ //code_count++;
+ stack.push(new QBidiState(clevel, override));
+ if (clevel < 254)
+ clevel += 1 + clevel % 2;
+ override = QChar::DirR;
+ }
+ else if (at(pos) == LRO) {
+ //code_count++;
+ stack.push(new QBidiState(clevel, override));
+ if (clevel < 254)
+ clevel += 2 - clevel % 2;
+ override = QChar::DirL;
+ }
+ else if (at(pos) == PDF) {
+ //code_count++;
+ if (!stack.isEmpty()) {
+ override = stack.top()->override;
+ clevel = stack.top()->level;
+ stack.remove();
+ }
+ }
+
+ // TODO: catch block separators (newlines, paras, etc.)
+
+ level[pos] = clevel;
+ if (override != -1)
+ dir[pos] = (QChar::Direction) override;
+ else
+ dir[pos] = at(pos).direction();
+ }
+
+ // weak type pass
+ for (pos = 0; pos < l; pos++) {
+
+ int i;
+
+ switch (at(pos).direction()) {
+ case QChar::DirEN:
+ i = pos-1;
+ while ((i >= 0) &&
+ !(at(i).direction() == QChar::DirAN) &&
+ !(at(i).direction() == QChar::DirAL) &&
+ !(at(i).direction() == QChar::DirB))
+ i--;
+
+ if ((i >= 0) &&
+ ((at(i).direction() == QChar::DirAN) ||
+ (at(i).direction() == QChar::DirAL)))
+ dir[pos] = QChar::DirAN;
+
+ break;
+ case QChar::DirES:
+ case QChar::DirCS:
+ if ((pos > 0) && (pos < l-1) &&
+ (dir[pos-1] == dir[pos+1]))
+ dir[pos] = dir[pos-1];
+ else
+ dir[pos] = QChar::DirON;
+
+ break;
+ case QChar::DirET:
+ if (((pos > 0) && (dir[pos-1] == QChar::DirEN)) ||
+ ((pos < l-1) && (dir[pos+1] == QChar::DirEN)))
+ dir[pos] = QChar::DirEN;
+ else
+ dir[pos] = QChar::DirON;
+
+ break;
+ case QChar::DirAL:
+ dir[pos] = QChar::DirR;
+ break;
+ default:
+ break;
+ }
+ }
+
+ // neutral type pass
+ for (pos = 0; pos < l; pos++) {
+ QChar::Direction left,right; // declaring l here shadowed previous l
+
+ if (is_neutral(dir[pos])) {
+ if (pos > 0)
+ left = dir[pos-1];
+ else
+ left = (base == 0 ? QChar::DirL : QChar::DirR);
+
+ int i = pos;
+
+ while ((i < (int)l-1) && is_neutral(dir[i+1]))
+ i++;
+
+ if (i < (int)l-1)
+ right = dir[i+1];
+ else
+ right = (base == 0 ? QChar::DirL : QChar::DirR);
+
+ for (int j=pos; j <= i; j++) {
+ int a = 1, b = 1;
+ while ((a < 5) && (left != resolv[0][a]))
+ a++;
+ while ((b < 5) && (right != resolv[0][b]))
+ b++;
+ if ((a == 5) || (b == 5))
+ dir[j] = (base == 0 ? QChar::DirL : QChar::DirR);
+ else
+ dir[j] = resolv[a][b];
+
+ if (dir[j] == (QChar::Direction)(-1))
+ dir[j] = (base == 0 ? QChar::DirL : QChar::DirR);
+ }
+ }
+ }
+
+ // implicit level pass
+ QChar::Direction prec = (base == 0 ? QChar::DirL : QChar::DirR);
+
+ for (pos = 0; pos < l; pos++) {
+ if (level[pos] % 2) {
+ switch (dir[pos]) {
+ case QChar::DirL:
+ case QChar::DirAN:
+ case QChar::DirEN:
+ level[pos] += 1;
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (dir[pos]) {
+ case QChar::DirL:
+ // do nothing
+ break;
+ case QChar::DirR:
+ level[pos] += 1;
+ break;
+ case QChar::DirEN:
+ if (prec == QChar::DirL)
+ continue;
+ // fall through
+ case QChar::DirAN:
+ level[pos] += 2;
+ break;
+ default:
+ break;
+ }
+ }
+
+ prec = dir[pos];
+ }
+
+ // now do the work!
+ QString ret(*this);
+ reverse(ret, level, index, index+len);
+
+ delete [] level;
+ delete [] dir;
+
+ return ret;
+#else
+ return mid(index,len);
+#endif
+}
+
+
+
+// These macros are used for efficient allocation of QChar strings.
+// IMPORTANT! If you change these, make sure you also change the
+// "delete unicode" statement in ~QStringData() in qstring.h correspondingly!
+
+#define QT_ALLOC_QCHAR_VEC( N ) (QChar*) new char[ sizeof(QChar)*( N ) ]
+#define QT_DELETE_QCHAR_VEC( P ) delete[] ((char*)( P ))
+
+
+/*!
+ This utility function converts the 8-bit string
+ \a ba to Unicode, returning the result.
+
+ The caller is responsible for deleting the return value with delete[].
+*/
+
+QChar* QString::asciiToUnicode( const QByteArray& ba, uint* len )
+{
+ if ( ba.isNull() ) {
+ *len = 0;
+ return 0;
+ }
+ int l = 0;
+ while ( l < (int)ba.size() && ba[l] )
+ l++;
+ char* str = ba.data();
+ QChar *uc = new QChar[ l ]; // Can't use macro, since function is public
+ QChar *result = uc;
+ if ( len )
+ *len = l;
+ while (l--)
+ *uc++ = *str++;
+ return result;
+}
+
+static QChar* internalAsciiToUnicode( const QByteArray& ba, uint* len )
+{
+ if ( ba.isNull() ) {
+ *len = 0;
+ return 0;
+ }
+ int l = 0;
+ while ( l < (int)ba.size() && ba[l] )
+ l++;
+ char* str = ba.data();
+ QChar *uc = QT_ALLOC_QCHAR_VEC( l );
+ QChar *result = uc;
+ if ( len )
+ *len = l;
+ while (l--)
+ *uc++ = *str++;
+ return result;
+}
+
+/*!
+ This utility function converts the NUL-terminated 8-bit string
+ \a str to Unicode, returning the result and setting \a len to
+ the length of the Unicode string.
+
+ The caller is responsible for deleting the return value with delete[].
+*/
+
+QChar* QString::asciiToUnicode( const char *str, uint* len, uint maxlen )
+{
+ QChar* result = 0;
+ uint l = 0;
+ if ( str ) {
+ if ( maxlen != (uint)-1 ) {
+ while ( l < maxlen && str[l] )
+ l++;
+ } else {
+ // Faster?
+ l = qstrlen(str);
+ }
+ QChar *uc = new QChar[ l ]; // Can't use macro since function is public
+ result = uc;
+ uint i = l;
+ while ( i-- )
+ *uc++ = *str++;
+ }
+ if ( len )
+ *len = l;
+ return result;
+}
+
+static QChar* internalAsciiToUnicode( const char *str, uint* len,
+ uint maxlen = (uint)-1 )
+{
+ QChar* result = 0;
+ uint l = 0;
+ if ( str ) {
+ if ( maxlen != (uint)-1 ) {
+ while ( l < maxlen && str[l] )
+ l++;
+ } else {
+ // Faster?
+ l = qstrlen(str);
+ }
+ QChar *uc = QT_ALLOC_QCHAR_VEC( l );
+ result = uc;
+ uint i = l;
+ while ( i-- )
+ *uc++ = *str++;
+ }
+ if ( len )
+ *len = l;
+ return result;
+}
+
+/*!
+ This utility function converts \a l 16-bit characters from
+ \a uc to ASCII, returning a NUL-terminated string.
+
+ The caller is responsible for deleting the string with delete[].
+*/
+char* QString::unicodeToAscii(const QChar *uc, uint l)
+{
+ if (!uc) {
+ return 0;
+ }
+ char *a = new char[l+1];
+ char *result = a;
+ while (l--)
+ *a++ = *uc++;
+ *a = '\0';
+ return result;
+}
+
+static uint computeNewMax( uint len )
+{
+ if (len >= 0x80000000)
+ return len;
+
+ uint newMax = 4;
+ while ( newMax < len )
+ newMax *= 2;
+ // try to save some memory
+ if ( newMax >= 1024 * 1024 && len <= newMax - (newMax >> 2) )
+ newMax -= newMax >> 2;
+ return newMax;
+}
+
+/*!
+ Returns the QString as a zero terminated array of unsigned shorts
+ if the string is not null; otherwise returns zero.
+
+ The result remains valid so long as one unmodified
+ copy of the source string exists.
+ */
+const unsigned short *QString::ucs2() const
+{
+ if ( ! d->unicode )
+ return 0;
+ unsigned int len = d->len;
+ if ( d->maxl < len + 1 ) {
+ // detach, grow or shrink
+ uint newMax = computeNewMax( len + 1 );
+ QChar* nd = QT_ALLOC_QCHAR_VEC( newMax );
+ if ( nd ) {
+ if ( d->unicode )
+ memcpy( nd, d->unicode, sizeof(QChar)*len );
+ ((QString *)this)->deref();
+ ((QString *)this)->d = new QStringData( nd, len, newMax );
+ }
+ }
+ d->unicode[len] = 0;
+ return (unsigned short *) d->unicode;
+}
+
+/*!
+ Constructs a string that is a deep copy of \a str, interpreted as a
+ UCS2 encoded, zero terminated, Unicode string.
+
+ If \a str is 0, then a null string is created.
+ \sa isNull()
+ */
+QString QString::fromUcs2( const unsigned short *str )
+{
+ if ( !str ) {
+ return QString::null;
+ } else {
+ int length = 0;
+ while ( str[length] != 0 )
+ length++;
+ QChar* uc = QT_ALLOC_QCHAR_VEC( length );
+ memcpy( uc, str, length*sizeof(QChar) );
+ return QString( new QStringData( uc, length, length ), TRUE );
+ }
+}
+
+
+/*****************************************************************************
+ QString member functions
+ *****************************************************************************/
+
+/*!
+ \class QString qstring.h
+
+ \brief The QString class provides an abstraction of Unicode text and
+ the classic C null-terminated char array (<var>char*</var>).
+
+ \ingroup tools
+ \ingroup shared
+
+ QString uses \link shclass.html implicit sharing\endlink, and so it
+ is very efficient and easy to use.
+
+ In all QString methods that take <var>const char*</var> parameters,
+ the <var>const char*</var> is interpreted as a classic C-style
+ 0-terminated ASCII string. It is legal for the <var>const
+ char*</var> parameter to be 0. The results are undefined if the
+ <var>const char*</var> string is not 0-terminated. Functions that
+ copy classic C strings into a QString will not copy the terminating
+ 0-character. The QChar array of the QString (as returned by
+ unicode()) is not terminated by a null.
+
+ A QString that has not been assigned to anything is \a null, i.e. both
+ the length and data pointer is 0. A QString that references the empty
+ string ("", a single '\0' char) is \a empty. Both null and empty
+ QStrings are legal parameters to the methods. Assigning <var>const char
+ * 0</var> to QString gives a null QString.
+
+ Note that if you find that you are mixing usage of QCString, QString,
+ and QByteArray, this causes lots of unnecessary copying and might
+ indicate that the true nature of the data you are dealing with is
+ uncertain. If the data is NUL-terminated 8-bit data, use QCString;
+ if it is unterminated (ie. contains NULs) 8-bit data, use QByteArray;
+ if it is text, use QString.
+
+ \sa QChar \link shclass.html Shared classes\endlink
+*/
+
+Q_EXPORT QStringData *QString::shared_null = 0;
+//QT_STATIC_CONST_IMPL QString QString::null;
+QT_STATIC_CONST_IMPL QChar QChar::null;
+QT_STATIC_CONST_IMPL QChar QChar::replacement((ushort)0xfffd);
+QT_STATIC_CONST_IMPL QChar QChar::byteOrderMark((ushort)0xfeff);
+QT_STATIC_CONST_IMPL QChar QChar::byteOrderSwapped((ushort)0xfffe);
+QT_STATIC_CONST_IMPL QChar QChar::nbsp((ushort)0x00a0);
+
+#if defined(_CC_MSVC_) && _MSC_VER <= 1300
+const QString::Null QString::null;
+#else
+const QString::Null QString::null = { };
+#endif
+
+
+QStringData* QString::makeSharedNull()
+{
+ return shared_null=new QStringData;
+}
+
+// Uncomment this to get some useful statistics.
+// #define Q2HELPER(x) x
+
+#ifdef Q2HELPER
+static int stat_construct_charstar=0;
+static int stat_construct_charstar_size=0;
+static int stat_construct_null=0;
+static int stat_construct_int=0;
+static int stat_construct_int_size=0;
+static int stat_construct_ba=0;
+static int stat_get_ascii=0;
+static int stat_get_ascii_size=0;
+static int stat_copy_on_write=0;
+static int stat_copy_on_write_size=0;
+static int stat_fast_copy=0;
+Q_EXPORT void qt_qstring_stats()
+{
+ qDebug("construct_charstar = %d (%d chars)", stat_construct_charstar, stat_construct_charstar_size);
+ qDebug("construct_null = %d", stat_construct_null);
+ qDebug("construct_int = %d (%d chars)", stat_construct_int, stat_construct_int_size);
+ qDebug("construct_ba = %d", stat_construct_ba);
+ qDebug("get_ascii = %d (%d chars)", stat_get_ascii, stat_get_ascii_size);
+ qDebug("copy_on_write = %d (%d chars)", stat_copy_on_write, stat_copy_on_write_size);
+ qDebug("fast_copy = %d", stat_fast_copy);
+}
+#else
+#define Q2HELPER(x)
+#endif
+
+/*!
+ \fn QString::QString()
+
+ Constructs a null string.
+ \sa isNull()
+*/
+
+/*!
+ Constructs a string containing the one character \a ch.
+*/
+QString::QString( QChar ch )
+{
+ d = new QStringData( QT_ALLOC_QCHAR_VEC( 1 ), 1, 1 );
+ d->unicode[0] = ch;
+}
+
+/*!
+ Constructs an implicitly-shared copy of \a s.
+*/
+QString::QString( const QString &s ) :
+ d(s.d)
+{
+ Q2HELPER(stat_fast_copy++)
+ d->ref();
+}
+
+/*!
+ Private function.
+
+ Constructs a string with preallocated space for \a size characters.
+
+ The string is empty.
+
+ \sa isNull()
+*/
+
+QString::QString( int size, bool /*dummy*/ )
+{
+ if ( size ) {
+ Q2HELPER(stat_construct_int++)
+ int l = size;
+ Q2HELPER(stat_construct_int_size+=l)
+ QChar* uc = QT_ALLOC_QCHAR_VEC( l );
+ d = new QStringData( uc, 0, l );
+ } else {
+ Q2HELPER(stat_construct_null++)
+ d = shared_null ? shared_null : (shared_null=new QStringData);
+ d->ref();
+ }
+}
+
+/*!
+ Constructs a string that is a deep copy of \a ba interpreted as
+ a classic C string.
+*/
+
+QString::QString( const QByteArray& ba )
+{
+ Q2HELPER(stat_construct_ba++)
+ uint l;
+ QChar *uc = internalAsciiToUnicode(ba,&l);
+ d = new QStringData(uc,l,l);
+}
+
+QString::QString( const QCString& ba )
+{
+ //Q2HELPER(stat_construct_ba++)
+ //uint l;
+ //QChar *uc = internalAsciiToUnicode(ba,&l);
+ //d = new QStringData(uc,l,l);
+ Q2HELPER(stat_fast_copy++)
+ QString s = QString::fromUtf8(ba.data(),ba.length());
+ d = s.d;
+ d->ref();
+}
+
+/*!
+ Constructs a string that is a deep copy of the
+ first \a length QChar in the array \a unicode.
+
+ If \a unicode and \a length are 0, a null string is created.
+
+ If only \a unicode is 0, the string is empty, but has
+ \a length characters of space preallocated - QString expands
+ automatically anyway, but this may speed some cases up a little.
+
+ \sa isNull()
+*/
+
+QString::QString( const QChar* unicode, uint length )
+{
+ if ( !unicode && !length ) {
+ d = shared_null ? shared_null : makeSharedNull();
+ d->ref();
+ } else {
+ QChar* uc = QT_ALLOC_QCHAR_VEC( length );
+ if ( unicode )
+ memcpy(uc, unicode, length*sizeof(QChar));
+ d = new QStringData(uc,unicode ? length : 0,length);
+ }
+}
+
+/*!
+ Constructs a string that is a deep copy of \a str, interpreted as a
+ classic C string.
+
+ If \a str is 0 a null string is created.
+
+ This is a cast constructor, but it is perfectly safe: converting a Latin1
+ const char* to QString preserves all the information.
+ You can disable this constructor by
+ defining QT_NO_CAST_ASCII when you compile your applications.
+ You can also make QString objects by using setLatin1()/fromLatin1(), or
+ fromLocal8Bit(), fromUtf8(), or whatever encoding is appropriate for
+ the 8-bit data you have.
+
+ \sa isNull()
+*/
+
+QString::QString( const char *str )
+{
+ //Q2HELPER(stat_construct_charstar++)
+ //uint l;
+ //QChar *uc = internalAsciiToUnicode(str,&l);
+ //Q2HELPER(stat_construct_charstar_size+=l)
+ //d = new QStringData(uc,l,l);
+ Q2HELPER(stat_fast_copy++)
+ QString s = QString::fromUtf8(str);
+ d = s.d;
+ d->ref();
+}
+
+
+/*! \fn QString::~QString()
+
+Destroys the string and frees the "real" string, if this was the last
+copy of that string.
+*/
+
+
+/*!
+ Deallocates any space reserved solely by this QString.
+*/
+
+void QString::real_detach()
+{
+ setLength( length() );
+}
+
+void QString::deref()
+{
+ if ( d->deref() ) {
+ if ( d == shared_null )
+ shared_null = 0;
+ delete d;
+ d = 0; // helps debugging
+ }
+}
+
+void QStringData::deleteSelf()
+{
+ delete this;
+}
+
+/*!
+ \fn QString& QString::operator=( QChar c )
+ Sets the string to contain just the single character \a c.
+*/
+
+/*!
+ \fn QString& QString::operator=( char c )
+ Sets the string to contain just the single character \a c.
+*/
+
+/*!
+ Assigns a shallow copy of \a s to this string and returns a
+ reference to this string.
+*/
+QString &QString::operator=( const QString &s )
+{
+ Q2HELPER(stat_fast_copy++)
+ s.d->ref();
+ deref();
+ d = s.d;
+ return *this;
+}
+
+/*!
+ Assigns a deep copy of \a cs, interpreted as a classic C string, to
+ this string and returns a reference to this string.
+*/
+QString &QString::operator=( const QCString& cs )
+{
+ return setLatin1(cs);
+}
+
+
+/*!
+ Assigns a deep copy of \a str, interpreted as a classic C string,
+ to this string and returns a reference to this string.
+
+ If \a str is 0 a null string is created.
+
+ \sa isNull()
+*/
+QString &QString::operator=( const char *str )
+{
+ return setLatin1(str);
+}
+
+
+/*!
+ \fn bool QString::isNull() const
+
+ Returns TRUE if the string is null.
+ A null string is also an empty string.
+
+ Example:
+ \code
+ QString a; // a.unicode() == 0, a.length() == 0
+ QString b = ""; // b.unicode() == "", b.length() == 0
+ a.isNull(); // TRUE, because a.unicode() == 0
+ a.isEmpty(); // TRUE, because a.length() == 0
+ b.isNull(); // FALSE, because b.unicode() != 0
+ b.isEmpty(); // TRUE, because b.length() == 0
+ \endcode
+
+ \sa isEmpty(), length()
+*/
+
+/*!
+ \fn bool QString::isEmpty() const
+
+ Returns TRUE if the string is empty, i.e. if length() == 0.
+ An empty string is not always a null string.
+
+ See example in isNull().
+
+ \sa isNull(), length()
+*/
+
+/*!
+ \fn uint QString::length() const
+
+ Returns the length of the string.
+
+ Null strings and empty strings have zero length.
+
+ \sa isNull(), isEmpty()
+*/
+
+/*!
+ Truncates the string at position \a newLen if newLen is less than the
+ current length . Otherwise, nothing happens.
+
+ Example:
+ \code
+ QString s = "truncate this string";
+ s.truncate( 5 ); // s == "trunc"
+ \endcode
+
+ In Qt 1.x, it was possible to "truncate" a string to a longer
+ length. This is no longer possible.
+
+*/
+
+void QString::truncate( uint newLen )
+{
+ if ( newLen < d->len )
+ setLength( newLen );
+}
+
+/*### Make this public in 3.0
+ Ensures that at least \a newLen characters are allocated, and
+ sets the length to \a newLen. This function always detaches the
+ string from other references to the same data. Any new space
+ allocated is \e not defined.
+
+ If \a newLen is 0, this string becomes empty, unless this string is
+ null, in which case it remains null.
+
+ \sa truncate(), isNull(), isEmpty()
+*/
+
+void QString::setLength( uint newLen )
+{
+ if ( d->count != 1 || newLen > d->maxl || // detach, grow, or
+ ( newLen*4 < d->maxl && d->maxl > 4 ) ) { // shrink
+ Q2HELPER(stat_copy_on_write++)
+ Q2HELPER(stat_copy_on_write_size+=d->len)
+ uint newMax = 4;
+ while ( newMax < newLen )
+ newMax *= 2;
+ QChar* nd = QT_ALLOC_QCHAR_VEC( newMax );
+ uint len = QMIN( d->len, newLen );
+ if ( d->unicode )
+ memcpy( nd, d->unicode, sizeof(QChar)*len );
+ deref();
+ d = new QStringData( nd, newLen, newMax );
+ } else {
+ d->len = newLen;
+ d->dirtyascii = 1;
+ }
+}
+
+/*! Returns a string equal to this one, but with the lowest-numbered
+ occurrence of \c %i (for a positive integer i) replaced by \a a.
+
+ \code
+ label.setText( tr("Rename %1 to %2?").arg(oldName).arg(newName) );
+ \endcode
+
+ \a fieldwidth is the minimum amount of space \a a is padded to. A
+ positive value produces right-aligned text, while a negative value
+ produces left aligned text.
+
+ \warning Using arg() for constructing "real" sentences
+ programmatically is likely to lead to translation problems.
+ Inserting objects like numbers or file names is fairly safe.
+
+ \warning Relying on spaces to create alignment is prone to lead to
+ translation problems.
+
+ If there is no \c %i pattern, a warning message (qWarning()) is
+ printed and the text as appended at the end of the string. This is
+ error recovery and should not occur in correct code.
+
+ \sa QObject::tr()
+*/
+QString QString::arg(const QString& a, int fieldwidth) const
+{
+ int pos, len;
+ QString r = *this;
+
+ if ( !findArg( pos, len ) ) {
+ qWarning( "QString::arg(): Argument missing: %s, %s",
+ (const char *)this, (const char *)a );
+ // Make sure the text at least appears SOMEWHERE
+ r += ' ';
+ pos = r.length();
+ len = 0;
+ }
+
+ r.replace( pos, len, a );
+ if ( fieldwidth < 0 ) {
+ QString s;
+ while ( (uint)-fieldwidth > a.length() ) {
+ s += ' ';
+ fieldwidth++;
+ }
+ r.insert( pos + a.length(), s );
+ } else if ( fieldwidth ) {
+ QString s;
+ while ( (uint)fieldwidth > a.length() ) {
+ s += ' ';
+ fieldwidth--;
+ }
+ r.insert( pos, s );
+ }
+
+ return r;
+}
+
+
+/*! \overload
+
+ \a a is expressed in to \a base notation, which is decimal by
+ default and must be in the range 2-36 inclusive.
+*/
+QString QString::arg(long a, int fieldwidth, int base) const
+{
+ return arg( QString::number( a, base ), fieldwidth );
+}
+
+/*! \overload
+
+ \a a is expressed in to \a base notation, which is decimal by
+ default and must be in the range 2-36 inclusive.
+*/
+QString QString::arg(ulong a, int fieldwidth, int base) const
+{
+ return arg( QString::number( a, base ), fieldwidth );
+}
+
+/*!
+ \overload QString QString::arg(int a, int fieldwidth, int base) const
+
+ \a a is expressed in to \a base notation, which is decimal by
+ default and must be in the range 2-36 inclusive.
+
+*/
+
+/*!
+ \overload QString QString::arg(uint a, int fieldwidth, int base) const
+
+ \a a is expressed in to \a base notation, which is decimal by
+ default and must be in the range 2-36 inclusive.
+*/
+
+/*!
+ \overload QString QString::arg(short a, int fieldwidth, int base) const
+
+ \a a is expressed in to \a base notation, which is decimal by
+ default and must be in the range 2-36 inclusive.
+*/
+
+/*!
+ \overload QString QString::arg(ushort a, int fieldwidth, int base) const
+
+ \a a is expressed in to \a base notation, which is decimal by
+ default and must be in the range 2-36 inclusive.
+*/
+
+
+/*! \overload
+
+ \a a is assumed to be in the Latin1 character set.
+*/
+QString QString::arg(char a, int fieldwidth) const
+{
+ QString c;
+ c += a;
+ return arg( c, fieldwidth );
+}
+
+/*! \overload
+*/
+QString QString::arg(QChar a, int fieldwidth) const
+{
+ QString c;
+ c += a;
+ return arg( c, fieldwidth );
+}
+
+/*! \overload
+
+ \a is formatted according to the \a fmt format specified, which is
+ 'g' by default and can be any of 'f', 'F', 'e', 'E', 'g' or 'G', all
+ of which have the same meaning as for sprintf(). \a prec determines
+ the precision, just as for number() and sprintf().
+*/
+QString QString::arg(double a, int fieldwidth, char fmt, int prec) const
+{
+ return arg( QString::number( a, fmt, prec ), fieldwidth );
+}
+
+
+/*!
+ Just 1-digit arguments.
+*/
+bool QString::findArg(int& pos, int& len) const
+{
+ char lowest=0;
+ for (uint i=0; i<length(); i++) {
+ if ( at(i) == '%' && i+1<length() ) {
+ char dig = at(i+1);
+ if ( dig >= '0' && dig <= '9' ) {
+ if ( !lowest || dig < lowest ) {
+ lowest = dig;
+ pos = i;
+ len = 2;
+ }
+ }
+ }
+ }
+ return lowest != 0;
+}
+
+/*!
+ Safely builds a formatted string from a format string and an
+ arbitrary list of arguments. The format string supports all
+ the escape sequences of printf() in the standard C library.
+
+ The %s escape sequence expects a utf8() encoded string.
+ The format string \e cformat is expected to be in latin1. If you need a unicode
+ format string, use QString::arg() instead. For typesafe
+ string building, with full Unicode support, you can use QTextOStream
+ like this:
+
+ \code
+ QString str;
+ QString s = ...;
+ int x = ...;
+ QTextOStream(&str) << s << " : " << x;
+ \endcode
+
+ For \link QObject::tr() translations,\endlink especially if the
+ strings contains more than one escape sequence, you should consider
+ using the arg() function instead. This allows the order of the
+ replacements to be controlled by the translator, and has Unicode
+ support.
+
+ \sa arg()
+*/
+
+QString &QString::sprintf( const char* cformat, ... )
+{
+ va_list ap;
+ va_start( ap, cformat );
+
+ if ( !cformat || !*cformat ) {
+ // Qt 1.x compat
+ *this = QString::fromLatin1( "" );
+ return *this;
+ }
+ QString format = QString::fromLatin1( cformat );
+
+ static QRegExp *escape = 0;
+ if (!escape)
+ escape = new QRegExp( "%#?0?-? ?\\+?'?[0-9*]*\\.?[0-9*]*h?l?L?q?Z?" );
+
+ QString result;
+ uint last = 0;
+
+ int len = 0;
+ int pos;
+ while ( 1 ) {
+ pos = escape->match( cformat, last, &len );
+ // Non-escaped text
+ if ( pos > (int)last )
+ result += format.mid(last,pos-last);
+ if ( pos < 0 ) {
+ // The rest
+ if ( last < format.length() )
+ result += format.mid(last);
+ break;
+ }
+ last = pos + len + 1;
+
+ // Escape
+ QString f = format.mid( pos, len );
+ uint width, decimals;
+ int params = 0;
+ int wpos = f.find('*');
+ if ( wpos >= 0 ) {
+ params++;
+ width = va_arg( ap, int );
+ if ( f.find('*', wpos + 1) >= 0 ) {
+ decimals = va_arg( ap, int );
+ params++;
+ } else {
+ decimals = 0;
+ }
+ } else {
+ decimals = width = 0;
+ }
+ QString replacement;
+ if ( format[pos+len] == 's' ||
+ format[pos+len] == 'S' ||
+ format[pos+len] == 'c' )
+ {
+ bool rightjust = ( f.find('-') < 0 );
+ // Yes, %-5s really means left adjust in sprintf
+
+ if ( wpos < 0 ) {
+ QRegExp num( "[0-9]+" );
+ QRegExp dot( "\\." );
+ int nlen;
+ int p = num.match( f.data(), 0, &nlen );
+ int q = dot.match( f.data(), 0 );
+ if ( q < 0 || (p < q && p >= 0) )
+ width = f.mid( p, nlen ).toInt();
+ if ( q >= 0 ) {
+ p = num.match( f.data(), q );
+ // "decimals" is used to specify string truncation
+ if ( p >= 0 )
+ decimals = f.mid( p, nlen ).toInt();
+ }
+ }
+
+ if ( format[pos+len] == 's' ) {
+#ifndef QT_NO_TEXTCODEC
+ QString s = QString::fromUtf8(va_arg(ap, char*));
+#else
+ QString s = QString::fromLatin1(va_arg(ap, char*));
+#endif
+ if ( decimals <= 0 )
+ replacement = s;
+ else
+ replacement = s.left(decimals);
+ } else {
+ int ch = va_arg(ap, int);
+ replacement = QChar((ushort)ch);
+ }
+ if ( replacement.length() < width ) {
+ replacement = rightjust
+ ? replacement.rightJustify(width)
+ : replacement.leftJustify(width);
+ }
+ } else if ( format[pos+len] == '%' ) {
+ replacement = '%';
+ } else if ( format[pos+len] == 'n' ) {
+ int* n = va_arg(ap, int*);
+ *n = result.length();
+ } else {
+ char in[64], out[330] = "";
+ strncpy(in,f.latin1(),63);
+ char fch = format[pos+len].latin1();
+ in[f.length()] = fch;
+ switch ( fch ) {
+ case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': {
+ int value = va_arg(ap, int);
+ switch (params) {
+ case 0: ::sprintf( out, in, value ); break;
+ case 1: ::sprintf( out, in, width, value ); break;
+ case 2: ::sprintf( out, in, width, decimals, value ); break;
+ }
+ } break;
+ case 'e': case 'E': case 'f': case 'g': case 'G': {
+ double value = va_arg(ap, double);
+ switch (params) {
+ case 0: ::sprintf( out, in, value ); break;
+ case 1: ::sprintf( out, in, width, value ); break;
+ case 2: ::sprintf( out, in, width, decimals, value ); break;
+ }
+ } break;
+ case 'p': {
+ void* value = va_arg(ap, void*);
+ switch (params) {
+ case 0: ::sprintf( out, in, value ); break;
+ case 1: ::sprintf( out, in, width, value ); break;
+ case 2: ::sprintf( out, in, width, decimals, value ); break;
+ }
+ } break;
+ }
+ replacement = QString::fromLatin1(out);
+ }
+ result += replacement;
+ }
+ *this = result;
+
+ va_end( ap );
+ return *this;
+}
+
+/*!
+ Fills the string with \a len characters of value \a c.
+
+ If \a len is negative, the current string length is used.
+*/
+
+void QString::fill( QChar c, int len )
+{
+ if ( len < 0 )
+ len = length();
+ if ( len == 0 ) {
+ *this = "";
+ } else {
+ deref();
+ QChar * nd = QT_ALLOC_QCHAR_VEC( len );
+ d = new QStringData(nd,len,len);
+ while (len--) *nd++ = c;
+ }
+}
+
+
+/*!
+ \fn QString QString::copy() const
+
+ \obsolete
+
+ Returns a deep copy of this string.
+
+ Doing this is redundant in Qt 2.x, since QString is implicitly
+ shared, and so will automatically be deeply copied as necessary.
+*/
+
+/*!
+ Finds the first occurrence of the character \a c, starting at
+ position \a index. If \a index is -1, the search starts at the
+ last character; if -2, at the next to last character; etc.
+
+ The search is case sensitive if \a cs is TRUE, or case insensitive
+ if \a cs is FALSE.
+
+ Returns the position of \a c, or -1 if \a c could not be found.
+*/
+
+int QString::find( QChar c, int index, bool cs ) const
+{
+ if ( index < 0 )
+ index += length();
+ if ( (uint)index >= length() ) // index outside string
+ return -1;
+ register const QChar *uc;
+ uc = unicode()+index;
+ int n = length()-index;
+ if ( cs ) {
+ while ( n-- && *uc != c )
+ uc++;
+ } else {
+ c = c.lower();
+ while ( n-- && uc->lower() != c )
+ uc++;
+ }
+ if ( uint(uc - unicode()) >= length() )
+ return -1;
+ return (int)(uc - unicode());
+}
+
+/*!
+ Finds the first occurrence of the string \a str, starting at position
+ \a index. If \a index is -1, the search starts at the last character;
+ if -2, at the next to last character; etc.
+
+ The search is case sensitive if \a cs is TRUE, or case insensitive if
+ \a cs is FALSE.
+
+ Returns the position of \a str, or -1 if \a str could not be found.
+*/
+
+int QString::find( const QString& str, int index, bool cs ) const
+{
+ /*
+ We use some weird hashing for efficiency's sake. Instead of
+ comparing strings, we compare the hash value of str with that of
+ a part of this QString. Only if that matches, we call ucstrncmp
+ or ucstrnicmp.
+
+ The hash value of a string is the sum of the cells of its
+ QChars.
+ */
+ if ( index < 0 )
+ index += length();
+ int lstr = str.length();
+ int lthis = length() - index;
+ if ( (uint)lthis > length() )
+ return -1;
+ int delta = lthis - lstr;
+ if ( delta < 0 )
+ return -1;
+
+ const QChar *uthis = unicode() + index;
+ const QChar *ustr = str.unicode();
+ uint hthis = 0;
+ uint hstr = 0;
+ int i;
+ if ( cs ) {
+ for ( i = 0; i < lstr; i++ ) {
+ hthis += uthis[i].cell();
+ hstr += ustr[i].cell();
+ }
+ i = 0;
+ while ( TRUE ) {
+ if ( hthis == hstr && ucstrncmp(uthis + i, ustr, lstr) == 0 )
+ return index + i;
+ if ( i == delta )
+ return -1;
+ hthis += uthis[i + lstr].cell();
+ hthis -= uthis[i].cell();
+ i++;
+ }
+ } else {
+ for ( i = 0; i < lstr; i++ ) {
+ hthis += uthis[i].lower().cell();
+ hstr += ustr[i].lower().cell();
+ }
+ i = 0;
+ while ( TRUE ) {
+ if ( hthis == hstr && ucstrnicmp(uthis + i, ustr, lstr) == 0 )
+ return index + i;
+ if ( i == delta )
+ return -1;
+ hthis += uthis[i + lstr].lower().cell();
+ hthis -= uthis[i].lower().cell();
+ i++;
+ }
+ }
+#if defined(Q_SPURIOUS_NON_VOID_WARNING)
+ return -1;
+#endif
+}
+
+/*!
+ \fn int QString::findRev( const char* str, int index ) const
+
+ Equivalent to findRev(QString(str), index).
+*/
+
+/*!
+ \fn int QString::find( const char* str, int index ) const
+
+ Equivalent to find(QString(str), index).
+*/
+
+/*!
+ Finds the first occurrence of the character \a c, starting at
+ position \a index and searching backwards. If \a index is -1,
+ the search starts at the last character; if -2, at the next to
+ last character; etc.
+
+ The search is case sensitive if \a cs is TRUE, or case insensitive if \a
+ cs is FALSE.
+
+ Returns the position of \a c, or -1 if \a c could not be found.
+*/
+
+int QString::findRev( QChar c, int index, bool cs ) const
+{
+ QString t( c );
+ return findRev( t, index, cs );
+}
+
+/*!
+ Finds the first occurrence of the string \a str, starting at
+ position \a index and searching backwards. If \a index is -1,
+ the search starts at the last character; -2, at the next to last
+ character; etc.
+
+ The search is case sensitive if \a cs is TRUE, or case insensitive if \e
+ cs is FALSE.
+
+ Returns the position of \a str, or -1 if \a str could not be found.
+*/
+
+int QString::findRev( const QString& str, int index, bool cs ) const
+{
+ /*
+ See QString::find() for explanations.
+ */
+ int lthis = length();
+ if ( index < 0 )
+ index += lthis;
+
+ int lstr = str.length();
+ int delta = lthis - lstr;
+ if ( index < 0 || index > lthis || delta < 0 )
+ return -1;
+ if ( index > delta )
+ index = delta;
+
+ const QChar *uthis = unicode();
+ const QChar *ustr = str.unicode();
+ uint hthis = 0;
+ uint hstr = 0;
+ int i;
+ if ( cs ) {
+ for ( i = 0; i < lstr; i++ ) {
+ hthis += uthis[index + i].cell();
+ hstr += ustr[i].cell();
+ }
+ i = index;
+ while ( TRUE ) {
+ if ( hthis == hstr && ucstrncmp(uthis + i, ustr, lstr) == 0 )
+ return i;
+ if ( i == 0 )
+ return -1;
+ i--;
+ hthis -= uthis[i + lstr].cell();
+ hthis += uthis[i].cell();
+ }
+ } else {
+ for ( i = 0; i < lstr; i++ ) {
+ hthis += uthis[index + i].lower().cell();
+ hstr += ustr[i].lower().cell();
+ }
+ i = index;
+ while ( TRUE ) {
+ if ( hthis == hstr && ucstrnicmp(uthis + i, ustr, lstr) == 0 )
+ return i;
+ if ( i == 0 )
+ return -1;
+ i--;
+ hthis -= uthis[i + lstr].lower().cell();
+ hthis += uthis[i].lower().cell();
+ }
+ }
+#if defined(Q_SPURIOUS_NON_VOID_WARNING)
+ return -1;
+#endif
+}
+
+
+/*!
+ Returns the number of times the character \a c occurs in the string.
+
+ The match is case sensitive if \a cs is TRUE, or case insensitive if \a cs
+ is FALSE.
+*/
+
+int QString::contains( QChar c, bool cs ) const
+{
+ int count = 0;
+ const QChar *uc = unicode();
+ if ( !uc )
+ return 0;
+ int n = length();
+ if ( cs ) { // case sensitive
+ while ( n-- )
+ if ( *uc++ == c )
+ count++;
+ } else { // case insensitive
+ c = c.lower();
+ while ( n-- ) {
+ if ( uc->lower() == c )
+ count++;
+ uc++;
+ }
+ }
+ return count;
+}
+
+/*!
+ \overload
+*/
+int QString::contains( const char* str, bool cs ) const
+{
+ return contains(QString(str),cs);
+}
+
+/*!
+ \overload int QString::contains (char c, bool cs) const
+*/
+
+/*!
+ \overload int QString::find (char c, int index, bool cs) const
+
+*/
+
+/*!
+ \overload int QString::findRev (char c, int index, bool cs) const
+
+*/
+
+/*!
+ Returns the number of times \a str occurs in the string.
+
+ The match is case sensitive if \a cs is TRUE, or case insensitive if \e
+ cs is FALSE.
+
+ This function counts overlapping substrings, for example, "banana"
+ contains two occurrences of "ana".
+
+ \sa findRev()
+*/
+
+int QString::contains( const QString &str, bool cs ) const
+{
+ int count = 0;
+ const QChar *uc = unicode();
+ if ( !uc )
+ return 0;
+ int len = str.length();
+ int n = length();
+ while ( n-- ) { // counts overlapping strings
+ // ### Doesn't account for length of this - searches over "end"
+ if ( cs ) {
+ if ( ucstrncmp( uc, str.unicode(), len ) == 0 )
+ count++;
+ } else {
+ if ( ucstrnicmp(uc, str.unicode(), len) == 0 )
+ count++;
+ }
+ uc++;
+ }
+ return count;
+}
+
+/*!
+ Returns a substring that contains the \a len leftmost characters
+ of the string.
+
+ The whole string is returned if \a len exceeds the length of the
+ string.
+
+
+ Example:
+ \code
+ QString s = "Pineapple";
+ QString t = s.left( 4 ); // t == "Pine"
+ \endcode
+
+ \sa right(), mid(), isEmpty()
+*/
+
+QString QString::left( uint len ) const
+{
+ if ( isEmpty() ) {
+ return QString();
+ } else if ( len == 0 ) { // ## just for 1.x compat:
+ return QString::fromLatin1("");
+ } else if ( len > length() ) {
+ return *this;
+ } else {
+ QString s( len, TRUE );
+ memcpy( s.d->unicode, d->unicode, len*sizeof(QChar) );
+ s.d->len = len;
+ return s;
+ }
+}
+
+/*!
+ Returns a substring that contains the \a len rightmost characters
+ of the string.
+
+ The whole string is returned if \a len exceeds the length of the
+ string.
+
+ Example:
+ \code
+ QString s = "Pineapple";
+ QString t = s.right( 5 ); // t == "apple"
+ \endcode
+
+ \sa left(), mid(), isEmpty()
+*/
+
+QString QString::right( uint len ) const
+{
+ if ( isEmpty() ) {
+ return QString();
+ } else if ( len == 0 ) { // ## just for 1.x compat:
+ return QString::fromLatin1("");
+ } else {
+ uint l = length();
+ if ( len > l )
+ len = l;
+ QString s( len, TRUE );
+ memcpy( s.d->unicode, d->unicode+(l-len), len*sizeof(QChar) );
+ s.d->len = len;
+ return s;
+ }
+}
+
+/*!
+ Returns a substring that contains the \a len characters of this
+ string, starting at position \a index.
+
+ Returns a null string if the string is empty or \a index is out
+ of range. Returns the whole string from \a index if \a index+len exceeds
+ the length of the string.
+
+ Example:
+ \code
+ QString s = "Five pineapples";
+ QString t = s.mid( 5, 4 ); // t == "pine"
+ \endcode
+
+ \sa left(), right()
+*/
+
+QString QString::mid( uint index, uint len ) const
+{
+ uint slen = length();
+ if ( isEmpty() || index >= slen ) {
+ return QString();
+ } else if ( len == 0 ) { // ## just for 1.x compat:
+ return QString::fromLatin1("");
+ } else {
+ if ( len > slen-index )
+ len = slen - index;
+ if ( index == 0 && len == length() )
+ return *this;
+ register const QChar *p = unicode()+index;
+ QString s( len, TRUE );
+ memcpy( s.d->unicode, p, len*sizeof(QChar) );
+ s.d->len = len;
+ return s;
+ }
+}
+
+/*!
+ Returns a string of length \a width that contains this
+ string and padded by the \a fill character.
+
+ If the length of the string exceeds \a width and \a truncate is FALSE,
+ then the returned string is a copy of the string.
+ If the length of the string exceeds \a width and \a truncate is TRUE,
+ then the returned string is a left(\a width).
+
+ Example:
+ \code
+ QString s("apple");
+ QString t = s.leftJustify(8, '.'); // t == "apple..."
+ \endcode
+
+ \sa rightJustify()
+*/
+
+QString QString::leftJustify( uint width, QChar fill, bool truncate ) const
+{
+ QString result;
+ int len = length();
+ int padlen = width - len;
+ if ( padlen > 0 ) {
+ result.setLength(len+padlen);
+ if ( len )
+ memcpy( result.d->unicode, unicode(), sizeof(QChar)*len );
+ QChar* uc = result.d->unicode + len;
+ while (padlen--)
+ *uc++ = fill;
+ } else {
+ if ( truncate )
+ result = left( width );
+ else
+ result = *this;
+ }
+ return result;
+}
+
+/*!
+ Returns a string of length \a width that contains pad
+ characters followed by the string.
+
+ If the length of the string exceeds \a width and \a truncate is FALSE,
+ then the returned string is a copy of the string.
+ If the length of the string exceeds \a width and \a truncate is TRUE,
+ then the returned string is a left(\a width).
+
+ Example:
+ \code
+ QString s("pie");
+ QString t = s.rightJustify(8, '.'); // t == ".....pie"
+ \endcode
+
+ \sa leftJustify()
+*/
+
+QString QString::rightJustify( uint width, QChar fill, bool truncate ) const
+{
+ QString result;
+ int len = length();
+ int padlen = width - len;
+ if ( padlen > 0 ) {
+ result.setLength( len+padlen );
+ QChar* uc = result.d->unicode;
+ while (padlen--)
+ *uc++ = fill;
+ if ( len )
+ memcpy( uc, unicode(), sizeof(QChar)*len );
+ } else {
+ if ( truncate )
+ result = left( width );
+ else
+ result = *this;
+ }
+ return result;
+}
+
+/*!
+ Returns a new string that is the string converted to lower case.
+
+ Example:
+ \code
+ QString s("TeX");
+ QString t = s.lower(); // t == "tex"
+ \endcode
+
+ \sa upper()
+*/
+
+QString QString::lower() const
+{
+ QString s(*this);
+ int l=length();
+ if ( l ) {
+ s.real_detach(); // could do this only when we find a change
+ register QChar *p=s.d->unicode;
+ if ( p ) {
+ while ( l-- ) {
+ *p = p->lower();
+ p++;
+ }
+ }
+ }
+ return s;
+}
+
+/*!
+ Returns a new string that is the string converted to upper case.
+
+ Example:
+ \code
+ QString s("TeX");
+ QString t = s.upper(); // t == "TEX"
+ \endcode
+
+ \sa lower()
+*/
+
+QString QString::upper() const
+{
+ QString s(*this);
+ int l=length();
+ if ( l ) {
+ s.real_detach(); // could do this only when we find a change
+ register QChar *p=s.d->unicode;
+ if ( p ) {
+ while ( l-- ) {
+ *p = p->upper();
+ p++;
+ }
+ }
+ }
+ return s;
+}
+
+
+/*!
+ Returns a new string that has white space removed from the start and the end.
+
+ White space means any character for which QChar::isSpace() returns
+ TRUE. This includes ASCII characters 9 (TAB), 10 (LF), 11 (VT), 12
+ (FF), 13 (CR), and 32 (Space).
+
+ Example:
+ \code
+ QString s = " space ";
+ QString t = s.stripWhiteSpace(); // t == "space"
+ \endcode
+
+ \sa simplifyWhiteSpace()
+*/
+
+QString QString::stripWhiteSpace() const
+{
+ if ( isEmpty() ) // nothing to do
+ return *this;
+ if ( !at(0).isSpace() && !at(length()-1).isSpace() )
+ return *this;
+
+ register const QChar *s = unicode();
+ QString result = fromLatin1("");
+
+ int start = 0;
+ int end = length() - 1;
+ while ( start<=end && s[start].isSpace() ) // skip white space from start
+ start++;
+ if ( start > end ) { // only white space
+ return result;
+ }
+ while ( end && s[end].isSpace() ) // skip white space from end
+ end--;
+ int l = end - start + 1;
+ result.setLength( l );
+ if ( l )
+ memcpy( result.d->unicode, &s[start], sizeof(QChar)*l );
+ return result;
+}
+
+
+/*!
+ Returns a new string that has white space removed from the start and the end,
+ plus any sequence of internal white space replaced with a single space
+ (ASCII 32).
+
+ White space means any character for which QChar::isSpace() returns
+ TRUE. This includes ASCII characters 9 (TAB), 10 (LF), 11 (VT), 12
+ (FF), 13 (CR), and 32 (Space).
+
+ \code
+ QString s = " lots\t of\nwhite space ";
+ QString t = s.simplifyWhiteSpace(); // t == "lots of white space"
+ \endcode
+
+ \sa stripWhiteSpace()
+*/
+
+QString QString::simplifyWhiteSpace() const
+{
+ if ( isEmpty() ) // nothing to do
+ return *this;
+ QString result;
+ result.setLength( length() );
+ const QChar *from = unicode();
+ const QChar *fromend = from+length();
+ int outc=0;
+ QChar *to = result.d->unicode;
+ while ( TRUE ) {
+ while ( from!=fromend && from->isSpace() )
+ from++;
+ while ( from!=fromend && !from->isSpace() )
+ to[outc++] = *from++;
+ if ( from!=fromend )
+ to[outc++] = ' ';
+ else
+ break;
+ }
+ if ( outc > 0 && to[outc-1] == ' ' )
+ outc--;
+ result.truncate( outc );
+ return result;
+}
+
+
+/*!
+ Insert \a s into the string before position \a index.
+
+ If \a index is beyond the end of the string, the string is extended with
+ spaces (ASCII 32) to length \a index and \a s is then appended.
+
+ \code
+ QString s = "I like fish";
+ s.insert( 2, "don't "); // s == "I don't like fish"
+ s = "x";
+ s.insert( 3, "yz" ); // s == "x yz"
+ \endcode
+*/
+
+QString &QString::insert( uint index, const QString &s )
+{
+ // the sub function takes care of &s == this case.
+ return insert( index, s.unicode(), s.length() );
+}
+
+/*!
+ Insert \a len units of QChar data from \a s into the string before
+ position \a index.
+*/
+
+QString &QString::insert( uint index, const QChar* s, uint len )
+{
+ if ( len == 0 )
+ return *this;
+ uint olen = length();
+ int nlen = olen + len;
+
+ int df = s - d->unicode; // ### pointer subtraction, cast down to int
+ if ( df >= 0 && (uint)df < d->maxl ) {
+ // Part of me - take a copy.
+ QChar *tmp = QT_ALLOC_QCHAR_VEC( len );
+ memcpy(tmp,s,len*sizeof(QChar));
+ insert(index,tmp,len);
+ QT_DELETE_QCHAR_VEC( tmp );
+ return *this;
+ }
+
+ if ( index >= olen ) { // insert after end of string
+ setLength( len+index );
+ int n = index-olen;
+ QChar* uc = d->unicode+olen;
+ while (n--)
+ *uc++ = ' ';
+ memcpy( d->unicode+index, s, sizeof(QChar)*len );
+ } else { // normal insert
+ setLength( nlen );
+ memmove( d->unicode+index+len, unicode()+index,
+ sizeof(QChar)*(olen-index) );
+ memcpy( d->unicode+index, s, sizeof(QChar)*len );
+ }
+ return *this;
+}
+
+/*!
+ Insert \a c into the string at (before) position \a index and returns
+ a reference to the string.
+
+ If \a index is beyond the end of the string, the string is extended with
+ spaces (ASCII 32) to length \a index and \a c is then appended.
+
+ Example:
+ \code
+ QString s = "Ys";
+ s.insert( 1, 'e' ); // s == "Yes"
+ s.insert( 3, '!'); // s == "Yes!"
+ \endcode
+
+ \sa remove(), replace()
+*/
+
+QString &QString::insert( uint index, QChar c ) // insert char
+{
+ QString s( c );
+ return insert( index, s );
+}
+
+/*!
+ \overload QString& QString::insert( uint index, char c )
+*/
+
+/*!
+ \fn QString &QString::prepend( const QString &s )
+
+ Prepend \a s to the string. Equivalent to insert(0,s).
+
+ \sa insert()
+*/
+
+/*!
+ \fn QString& QString::prepend( char ch )
+ Prepends \a ch to the string and returns a reference to the result.
+
+ \sa insert()
+ */
+
+/*!
+ \fn QString& QString::prepend( QChar ch )
+ Prepends \a ch to the string and returns a reference to the result.
+
+ \sa insert()
+ */
+
+
+/*!
+ Removes \a len characters starting at position \a index from the
+ string and returns a reference to the string.
+
+ If \a index is too big, nothing happens. If \a index is valid, but
+ \a len is too large, the rest of the string is removed.
+
+ \code
+ QString s = "Montreal";
+ s.remove( 1, 4 );
+ // s == "Meal"
+ \endcode
+
+ \sa insert(), replace()
+*/
+
+QString &QString::remove( uint index, uint len )
+{
+ uint olen = length();
+ if ( index + len >= olen ) { // range problems
+ if ( index < olen ) { // index ok
+ setLength( index );
+ }
+ } else if ( len != 0 ) {
+ real_detach();
+ memmove( d->unicode+index, d->unicode+index+len,
+ sizeof(QChar)*(olen-index-len) );
+ setLength( olen-len );
+ }
+ return *this;
+}
+
+/*!
+ Replaces \a len characters starting at position \a index from the
+ string with \a s, and returns a reference to the string.
+
+ If \a index is too big, nothing is deleted and \a s is inserted at the
+ end of the string. If \a index is valid, but \a len is too large, \e
+ str replaces the rest of the string.
+
+ \code
+ QString s = "Say yes!";
+ s.replace( 4, 3, "NO" ); // s == "Say NO!"
+ \endcode
+
+ \sa insert(), remove()
+*/
+
+QString &QString::replace( uint index, uint len, const QString &s )
+{
+ return replace( index, len, s.unicode(), s.length() );
+}
+
+
+/*!
+ Replaces \a len characters starting at position \a index by
+ \a slen units ot QChar data from \a s, and returns a reference to the string.
+
+ \sa insert(), remove()
+*/
+
+QString &QString::replace( uint index, uint len, const QChar* s, uint slen )
+{
+ if ( len == slen && index + len <= length() ) {
+ // Optimized common case: replace without size change
+ real_detach();
+ memcpy( d->unicode+index, s, len*sizeof(QChar) );
+ } else {
+ int df = s - d->unicode; // ### pointer subtraction, cast down to int
+ if ( df >= 0 && (uint)df < d->maxl ) {
+ // Part of me - take a copy.
+ QChar *tmp = QT_ALLOC_QCHAR_VEC( slen );
+ memcpy(tmp,s,slen*sizeof(QChar));
+ replace(index,len,tmp,slen);
+ QT_DELETE_QCHAR_VEC( tmp );
+ return *this;
+ }
+
+ remove( index, len );
+ insert( index, s, slen );
+ }
+ return *this;
+}
+
+
+
+/*!
+ Finds the first occurrence of the regular expression \a rx, starting at
+ position \a index. If \a index is -1, the search starts at the last
+ character; if -2, at the next to last character; etc.
+
+ Returns the position of the next match, or -1 if \a rx was not found.
+
+ \sa findRev() replace() contains()
+*/
+
+int QString::find( const QRegExp &rx, int index ) const
+{
+ if ( index < 0 )
+ index += length();
+ return rx.match( data(), index );
+}
+
+/*!
+ Finds the first occurrence of the regular expression \a rx, starting at
+ position \a index and searching backwards. If \a index is -1, the
+ search starts at the last character; if -2, at the next to last
+ character; etc.
+
+ Returns the position of the next match (backwards), or -1 if \a rx was not
+ found.
+
+ \sa find()
+*/
+
+int QString::findRev( const QRegExp &rx, int index ) const
+{
+ if ( index < 0 ) // neg index ==> start from end
+ index += length();
+ if ( (uint)index > length() ) // bad index
+ return -1;
+ while( index >= 0 ) {
+ if ( rx.match( data(), index ) == index )
+ return index;
+ index--;
+ }
+ return -1;
+}
+
+/*!
+ Counts the number of overlapping occurrences of \a rx in the string.
+
+ Example:
+ \code
+ QString s = "banana and panama";
+ QRegExp r = QRegExp("a[nm]a", TRUE, FALSE);
+ s.contains( r ); // 4 matches
+ \endcode
+
+ \sa find() findRev()
+*/
+
+int QString::contains( const QRegExp &rx ) const
+{
+ if ( isEmpty() )
+ return rx.match( data() ) < 0 ? 0 : 1;
+ int count = 0;
+ int index = -1;
+ int len = length();
+ while ( index < len-1 ) { // count overlapping matches
+ index = rx.match( data(), index+1 );
+ if ( index < 0 )
+ break;
+ count++;
+ }
+ return count;
+}
+
+
+/*!
+ Replaces every occurrence of \a rx in the string with \a str.
+ Returns a reference to the string.
+
+ Examples:
+ \code
+ QString s = "banana";
+ s.replace( QRegExp("a.*a"), "" ); // becomes "b"
+
+ QString s = "banana";
+ s.replace( QRegExp("^[bn]a"), " " ); // becomes " nana"
+
+ QString s = "banana";
+ s.replace( QRegExp("^[bn]a"), "" ); // NOTE! becomes ""
+ \endcode
+
+ \sa find() findRev()
+*/
+
+QString &QString::replace( const QRegExp &rx, const QString &str )
+{
+ if ( isEmpty() )
+ return *this;
+ int index = 0;
+ int slen = str.length();
+ int len;
+ while ( index < (int)length() ) {
+ index = rx.match( data(), index, &len, FALSE );
+ if ( index >= 0 ) {
+ replace( index, len, str );
+ index += slen;
+ if ( !len )
+ break; // Avoid infinite loop on 0-length matches, e.g. [a-z]*
+ }
+ else
+ break;
+ }
+ return *this;
+}
+
+static bool
+ok_in_base( QChar c, int base )
+{
+ if ( base <= 10 )
+ return c.isDigit() && c.digitValue() < base;
+ else
+ return c.isDigit() || (c >= 'a' && c < char('a'+base-10))
+ || (c >= 'A' && c < char('A'+base-10));
+}
+
+/*!
+ Returns the string converted to a <code>long</code> value.
+
+ If \a ok is non-null, \a *ok is set to TRUE if there are no
+ conceivable errors, and FALSE if the string is not a number at all, or if
+ it has trailing garbage.
+*/
+
+long QString::toLong( bool *ok, int base ) const
+{
+ const QChar *p = unicode();
+ long val=0;
+ int l = length();
+ const long max_mult = INT_MAX / base;
+ bool is_ok = FALSE;
+ int neg = 0;
+ if ( !p )
+ goto bye;
+ while ( l && p->isSpace() ) // skip leading space
+ l--,p++;
+ if ( l && *p == '-' ) {
+ l--;
+ p++;
+ neg = 1;
+ } else if ( *p == '+' ) {
+ l--;
+ p++;
+ }
+
+ // NOTE: toULong() code is similar
+ if ( !l || !ok_in_base(*p,base) )
+ goto bye;
+ while ( l && ok_in_base(*p,base) ) {
+ l--;
+ int dv;
+ if ( p->isDigit() ) {
+ dv = p->digitValue();
+ } else {
+ if ( *p >= 'a' && *p <= 'z' )
+ dv = *p - 'a' + 10;
+ else
+ dv = *p - 'A' + 10;
+ }
+ if ( val > max_mult || (val == max_mult && dv > (INT_MAX%base)+neg) )
+ goto bye;
+ val = base*val + dv;
+ p++;
+ }
+ if ( neg )
+ val = -val;
+ while ( l && p->isSpace() ) // skip trailing space
+ l--,p++;
+ if ( !l )
+ is_ok = TRUE;
+bye:
+ if ( ok )
+ *ok = is_ok;
+ return is_ok ? val : 0;
+}
+
+/*!
+ Returns the string converted to an <code>unsigned long</code>
+ value.
+
+ If \a ok is non-null, \a *ok is set to TRUE if there are no
+ conceivable errors, and FALSE if the string is not a number at all,
+ or if it has trailing garbage.
+*/
+
+ulong QString::toULong( bool *ok, int base ) const
+{
+ const QChar *p = unicode();
+ ulong val=0;
+ int l = length();
+ const ulong max_mult = 429496729; // UINT_MAX/10, rounded down
+ bool is_ok = FALSE;
+ if ( !p )
+ goto bye;
+ while ( l && p->isSpace() ) // skip leading space
+ l--,p++;
+ if ( *p == '+' )
+ l--,p++;
+
+ // NOTE: toLong() code is similar
+ if ( !l || !ok_in_base(*p,base) )
+ goto bye;
+ while ( l && ok_in_base(*p,base) ) {
+ l--;
+ uint dv;
+ if ( p->isDigit() ) {
+ dv = p->digitValue();
+ } else {
+ if ( *p >= 'a' && *p <= 'z' )
+ dv = *p - 'a' + 10;
+ else
+ dv = *p - 'A' + 10;
+ }
+ if ( val > max_mult || (val == max_mult && dv > (UINT_MAX%base)) )
+ goto bye;
+ val = base*val + dv;
+ p++;
+ }
+
+ while ( l && p->isSpace() ) // skip trailing space
+ l--,p++;
+ if ( !l )
+ is_ok = TRUE;
+bye:
+ if ( ok )
+ *ok = is_ok;
+ return is_ok ? val : 0;
+}
+
+/*!
+ Returns the string converted to a <code>short</code> value.
+
+ If \a ok is non-null, \a *ok is set to TRUE if there are no
+ conceivable errors, and FALSE if the string is not a number at all, or if
+ it has trailing garbage.
+*/
+
+short QString::toShort( bool *ok, int base ) const
+{
+ long v = toLong( ok, base );
+ if ( ok && *ok && (v < -32768 || v > 32767) ) {
+ *ok = FALSE;
+ v = 0;
+ }
+ return (short)v;
+}
+
+/*!
+ Returns the string converted to an <code>unsigned short</code> value.
+
+ If \a ok is non-null, \a *ok is set to TRUE if there are no
+ conceivable errors, and FALSE if the string is not a number at all, or if
+ it has trailing garbage.
+*/
+
+ushort QString::toUShort( bool *ok, int base ) const
+{
+ ulong v = toULong( ok, base );
+ if ( ok && *ok && (v > 65535) ) {
+ *ok = FALSE;
+ v = 0;
+ }
+ return (ushort)v;
+}
+
+
+/*!
+ Returns the string converted to a <code>int</code> value.
+
+ \code
+ QString str("FF");
+ bool ok;
+ int hex = str.toInt( &ok, 16 ); // will return 255, and ok set to TRUE
+ int dec = str.toInt( &ok, 10 ); // will return 0, and ok set to FALSE
+ \endcode
+
+ If \a ok is non-null, \a *ok is set to TRUE if there are no
+ conceivable errors, and FALSE if the string is not a number at all,
+ or if it has trailing garbage.
+*/
+
+int QString::toInt( bool *ok, int base ) const
+{
+ return (int)toLong( ok, base );
+}
+
+/*!
+ Returns the string converted to an <code>unsigned int</code> value.
+
+ If \a ok is non-null, \a *ok is set to TRUE if there are no
+ conceivable errors, and FALSE if the string is not a number at all,
+ or if it has trailing garbage.
+*/
+
+uint QString::toUInt( bool *ok, int base ) const
+{
+ return (uint)toULong( ok, base );
+}
+
+/*!
+ Returns the string converted to a <code>double</code> value.
+
+ If \a ok is non-null, \a *ok is set to TRUE if there are no conceivable
+ errors, and FALSE if the string is not a number at all, or if it has
+ trailing garbage.
+*/
+
+double QString::toDouble( bool *ok ) const
+{
+ char *end;
+
+ QCString a = latin1();
+ // Just latin1() is not sufficient, since U0131 would look like '1'.
+ for (uint i=0; i<d->len; i++)
+ if ( d->unicode[i].row() )
+ a[(int)i]='z';
+
+ double val = strtod( a.data() ? a.data() : "", &end );
+ if ( ok )
+ *ok = ( a && *a && ( end == 0 || *end == '\0' ) );
+ return val;
+}
+
+/*!
+ Returns the string converted to a <code>float</code> value.
+
+ If \a ok is non-null, \a *ok is set to TRUE if there are no
+ conceivable errors, and FALSE if the string is not a number at all,
+ or if it has trailing garbage.
+*/
+
+float QString::toFloat( bool *ok ) const
+{
+ return (float)toDouble( ok );
+}
+
+
+/*!
+ Sets the string to the printed value of \a n and returns a
+ reference to the string.
+
+ The value is converted to \a base notation (default is decimal).
+ The base must be a value from 2 to 36.
+*/
+
+QString &QString::setNum( long n, int base )
+{
+#if defined(CHECK_RANGE)
+ if ( base < 2 || base > 36 ) {
+ qWarning( "QString::setNum: Invalid base %d", base );
+ base = 10;
+ }
+#endif
+ char charbuf[65*sizeof(QChar)];
+ QChar *buf = (QChar*)charbuf;
+ QChar *p = &buf[64];
+ int len = 0;
+ bool neg;
+ if ( n < 0 ) {
+ neg = TRUE;
+ if ( n == INT_MIN ) {
+ // Cannot always negate this special case
+ QString s1, s2;
+ s1.setNum(n/base);
+ s2.setNum((-(n+base))%base);
+ *this = s1 + s2;
+ return *this;
+ }
+ n = -n;
+ } else {
+ neg = FALSE;
+ }
+ do {
+ *--p = "0123456789abcdefghijklmnopqrstuvwxyz"[((int)(n%base))];
+ n /= base;
+ len++;
+ } while ( n );
+ if ( neg ) {
+ *--p = '-';
+ len++;
+ }
+ return setUnicode( p, len );
+}
+
+/*!
+ Sets the string to the printed unsigned value of \a n and
+ returns a reference to the string.
+
+ The value is converted to \a base notation (default is decimal).
+ The base must be a value from 2 to 36.
+*/
+
+QString &QString::setNum( ulong n, int base )
+{
+#if defined(CHECK_RANGE)
+ if ( base < 2 || base > 36 ) {
+ qWarning( "QString::setNum: Invalid base %d", base );
+ base = 10;
+ }
+#endif
+ char charbuf[65*sizeof(QChar)];
+ QChar *buf = (QChar*)charbuf;
+ QChar *p = &buf[64];
+ int len = 0;
+ do {
+ *--p = "0123456789abcdefghijklmnopqrstuvwxyz"[((int)(n%base))];
+ n /= base;
+ len++;
+ } while ( n );
+ return setUnicode(p,len);
+}
+
+/*!
+ \fn QString &QString::setNum( int n, int base )
+ Sets the string to the printed value of \a n and returns a reference
+ to the string.
+*/
+
+/*!
+ \fn QString &QString::setNum( uint n, int base )
+ Sets the string to the printed unsigned value of \a n and returns a
+ reference to the string.
+*/
+
+/*!
+ \fn QString &QString::setNum( short n, int base )
+ Sets the string to the printed value of \a n and returns a reference
+ to the string.
+*/
+
+/*!
+ \fn QString &QString::setNum( ushort n, int base )
+ Sets the string to the printed unsigned value of \a n and returns a
+ reference to the string.
+*/
+
+/*! Sets the string to the printed value of \a n, formatted in the \a f
+ format with \a prec precision, and returns a reference to the
+ string.
+
+ \a f can be 'f', 'F', 'e', 'E', 'g' or 'G', all of which have the
+ same meaning as for sprintf().
+*/
+
+QString &QString::setNum( double n, char f, int prec )
+{
+#if defined(CHECK_RANGE)
+ if ( !(f=='f' || f=='F' || f=='e' || f=='E' || f=='g' || f=='G') ) {
+ qWarning( "QString::setNum: Invalid format char '%c'", f );
+ f = 'f';
+ }
+#endif
+ char format[20];
+ char buf[120]; // enough for 99 precision?
+ char *fs = format; // generate format string
+ *fs++ = '%'; // "%.<prec>l<f>"
+ if ( prec >= 0 ) {
+ if ( prec > 99 ) // buf big enough for precision?
+ prec = 99;
+ *fs++ = '.';
+ if ( prec >= 10 ) {
+ *fs++ = prec / 10 + '0';
+ *fs++ = prec % 10 + '0';
+ } else {
+ *fs++ = prec + '0';
+ }
+ }
+ *fs++ = 'l';
+ *fs++ = f;
+ *fs = '\0';
+ ::sprintf( buf, format, n );
+ return setLatin1(buf);
+}
+
+/*!
+ \overload QString &QString::setNum( float n, char f, int prec )
+*/
+
+
+/*!
+ A convenience factory function that returns a string representation
+ of the number \a n.
+
+ \sa setNum()
+ */
+QString QString::number( long n, int base )
+{
+ QString s;
+ s.setNum( n, base );
+ return s;
+}
+
+/*!
+ A convenience factory function that returns a string representation
+ of the number \a n.
+
+ \sa setNum()
+ */
+QString QString::number( ulong n, int base )
+{
+ QString s;
+ s.setNum( n, base );
+ return s;
+}
+
+/*!
+ A convenience factory function that returns a string representation
+ of the number \a n.
+
+ \sa setNum()
+ */
+QString QString::number( int n, int base )
+{
+ QString s;
+ s.setNum( n, base );
+ return s;
+}
+
+/*!
+ A convenience factory function that returns a string representation
+ of the number \a n.
+
+ \sa setNum()
+ */
+QString QString::number( uint n, int base )
+{
+ QString s;
+ s.setNum( n, base );
+ return s;
+}
+
+/*!
+ This static function returns the printed value of \a n, formatted in the
+ \a f format with \a prec precision.
+
+ \a f can be 'f', 'F', 'e', 'E', 'g' or 'G', all of which have the
+ same meaning as for sprintf().
+
+ \sa setNum()
+ */
+QString QString::number( double n, char f, int prec )
+{
+ QString s;
+ s.setNum( n, f, prec );
+ return s;
+}
+
+
+/*! \obsolete
+
+ Sets the character at position \a index to \a c and expands the
+ string if necessary, filling with spaces.
+
+ This method is redundant in Qt 2.x, because operator[] will expand
+ the string as necessary.
+*/
+
+void QString::setExpand( uint index, QChar c )
+{
+ int spaces = index - d->len;
+ at(index) = c;
+ while (spaces-->0)
+ d->unicode[--index]=' ';
+}
+
+
+/*!
+ \fn const char* QString::data() const
+
+ \obsolete
+
+ Returns a pointer to a 0-terminated classic C string.
+
+ In Qt 1.x, this returned a char* allowing direct manipulation of the
+ string as a sequence of bytes. In Qt 2.x where QString is a Unicode
+ string, char* conversion constructs a temporary string, and hence
+ direct character operations are meaningless.
+*/
+
+/*!
+ \fn bool QString::operator!() const
+ Returns TRUE if it is a null string, otherwise FALSE. Thus
+ you can write:
+
+\code
+ QString name = getName();
+ if ( !name )
+ name = "Rodney";
+\endcode
+
+ Note that if you say:
+
+\code
+ QString name = getName();
+ if ( name )
+ doSomethingWith(name);
+\endcode
+
+ Then this will call <tt>operator const char*()</tt>, which will do what
+ you want, but rather inefficiently - you may wish to define the macro
+ QT_NO_ASCII_CAST when writing code which you wish to strictly remain
+ Unicode-clean.
+
+ When you want the above semantics, use <tt>!isNull()</tt>
+ or even <tt>!!</tt>:
+
+\code
+ QString name = getName();
+ if ( !!name )
+ doSomethingWith(name);
+\endcode
+*/
+
+
+/*!
+ \fn QString& QString::append( const QString& str )
+ Appends \a str to the string and returns a reference to the result.
+ Equivalent to operator+=().
+ */
+
+/*!
+ \fn QString& QString::append( char ch )
+ Appends \a ch to the string and returns a reference to the result.
+ Equivalent to operator+=().
+ */
+
+/*!
+ \fn QString& QString::append( QChar ch )
+ Appends \a ch to the string and returns a reference to the result.
+ Equivalent to operator+=().
+ */
+
+/*!
+ Appends \a str to the string and returns a reference to the string.
+*/
+QString& QString::operator+=( const QString &str )
+{
+ uint len1 = length();
+ uint len2 = str.length();
+ if ( len2 ) {
+ setLength(len1+len2);
+ memcpy( d->unicode+len1, str.unicode(), sizeof(QChar)*len2 );
+ } else if ( isNull() && !str.isNull() ) { // ## just for 1.x compat:
+ *this = fromLatin1("");
+ }
+ return *this;
+}
+
+/*!
+ Appends \a c to the string and returns a reference to the string.
+*/
+
+QString &QString::operator+=( QChar c )
+{
+ setLength(length()+1);
+ d->unicode[length()-1] = c;
+ return *this;
+}
+
+/*!
+ Appends \a c to the string and returns a reference to the string.
+*/
+
+QString &QString::operator+=( char c )
+{
+ setLength(length()+1);
+ d->unicode[length()-1] = c;
+ return *this;
+}
+
+
+
+/*! \fn char QChar::latin1() const
+
+ Returns a latin-1 copy of this character, if this character is in
+ the latin-1 character set. If not, this function returns 0.
+*/
+
+
+/*!
+ Returns a Latin-1 representation of the string. Note that the returned
+ value is undefined if the string contains non-Latin-1 characters. If you
+ want to convert strings into formats other than Unicode, see the
+ QTextCodec classes.
+
+ This function is mainly useful for boot-strapping legacy code to
+ use Unicode.
+
+ The result remains valid so long as one unmodified
+ copy of the source string exists.
+
+ \sa utf8(), local8Bit()
+*/
+const char* QString::latin1() const
+{
+ if ( d->ascii ) {
+ if ( d->dirtyascii )
+ delete [] d->ascii;
+ else
+ return d->ascii;
+ }
+ Q2HELPER(stat_get_ascii++)
+ Q2HELPER(stat_get_ascii_size+=d->len)
+ static QTextCodec* codec = QTextCodec::codecForMib(106);
+ if (codec) // we use utf8 coding also for latin1 if possible
+ {
+ QCString utf8str(codec->fromUnicode(*this));
+ d->ascii = new char[utf8str.length()+1];
+ if (utf8str.isEmpty())
+ {
+ d->ascii[0]='\0'; // make empty string
+ }
+ else // copy string
+ {
+ qstrcpy(d->ascii,utf8str.data());
+ }
+ }
+ else // fall back to latin1
+ {
+ d->ascii = unicodeToAscii( d->unicode, d->len );
+ }
+ QCString utf8str(utf8());
+ d->dirtyascii = 0;
+ return d->ascii;
+}
+
+/*! \obsolete
+
+ This functions simply calls latin1() and returns the result.
+*/
+const char* QString::ascii() const
+{
+ return latin1();
+}
+
+#ifndef QT_NO_TEXTCODEC
+/*!
+ Returns the string encoded in UTF8 format.
+
+ See QTextCodec for more diverse coding/decoding of Unicode strings.
+
+ \sa QString::fromUtf8(), local8Bit(), latin1()
+*/
+QCString QString::utf8() const
+{
+ static QTextCodec* codec = QTextCodec::codecForMib(106);
+ return codec
+ ? codec->fromUnicode(*this)
+ : QCString(latin1());
+}
+
+/*!
+ Returns the unicode string decoded from the
+ first \a len bytes of \a utf8. If \a len is -1 (the default), the
+ length of \a utf8 is used. If trailing partial characters are in
+ \a utf8, they are ignored.
+
+ See QTextCodec for more diverse coding/decoding of Unicode strings.
+*/
+QString QString::fromUtf8(const char* utf8, int len)
+{
+ static QTextCodec* codec = QTextCodec::codecForMib(106);
+ if ( len < 0 ) len = qstrlen(utf8);
+ return codec
+ ? codec->toUnicode(utf8, len)
+ : QString::fromLatin1(utf8, len);
+}
+#endif // QT_NO_TEXTCODEC
+/*!
+ Creates a QString from Latin1 text. This is the same as the
+ QString(const char*) constructor, but you can make that constructor
+ invisible if you compile with the define QT_NO_CAST_ASCII, in which
+ case you can explicitly create a QString from Latin-1 text using
+ this function.
+*/
+QString QString::fromLatin1(const char* chars, int len)
+{
+ uint l;
+ QChar *uc;
+ if ( len < 0 ) {
+ uc = internalAsciiToUnicode(chars,&l);
+ } else {
+ uc = internalAsciiToUnicode(chars,&l,len);
+ }
+ return QString(new QStringData(uc,l,l), TRUE);
+}
+
+/*!
+ \fn const QChar* QString::unicode() const
+
+ Returns the Unicode representation of the string. The result
+ remains valid until the string is modified.
+*/
+
+/*!
+ Returns the string encoded in a locale-specific format. On X11, this
+ is the QTextCodec::codecForLocale(). On Windows, it is a system-defined
+ encoding.
+
+ See QTextCodec for more diverse coding/decoding of Unicode strings.
+
+ \sa QString::fromLocal8Bit(), latin1(), utf8()
+*/
+
+
+QCString QString::local8Bit() const
+{
+#ifdef QT_NO_TEXTCODEC
+ return latin1();
+#else
+#ifdef _WS_X11_
+ static QTextCodec* codec = QTextCodec::codecForLocale();
+ return codec
+ ? codec->fromUnicode(*this)
+ : QCString(latin1());
+#endif
+#ifdef _WS_MAC_
+ static QTextCodec* codec = QTextCodec::codecForLocale();
+ return codec
+ ? codec->fromUnicode(*this)
+ : QCString(latin1());
+#endif
+#ifdef _WS_WIN_
+ return qt_winQString2MB( *this );
+#endif
+#ifdef _WS_QWS_
+ return utf8(); // ##### if there is ANY 8 bit format supported?
+#endif
+#endif
+}
+
+/*!
+ Returns the unicode string decoded from the
+ first \a len bytes of \a local8Bit. If \a len is -1 (the default), the
+ length of \a local8Bit is used. If trailing partial characters are in
+ \a local8Bit, they are ignored.
+
+ \a local8Bit is assumed to be encoded in a locale-specific format.
+
+ See QTextCodec for more diverse coding/decoding of Unicode strings.
+*/
+QString QString::fromLocal8Bit(const char* local8Bit, int len)
+{
+#ifdef QT_NO_TEXTCODEC
+ return fromLatin1( local8Bit, len );
+#else
+
+ if ( !local8Bit )
+ return QString::null;
+#ifdef _WS_X11_
+ static QTextCodec* codec = QTextCodec::codecForLocale();
+ if ( len < 0 ) len = qstrlen(local8Bit);
+ return codec
+ ? codec->toUnicode(local8Bit, len)
+ : QString::fromLatin1(local8Bit,len);
+#endif
+#ifdef _WS_MAC_
+ static QTextCodec* codec = QTextCodec::codecForLocale();
+ if ( len < 0 ) len = qstrlen(local8Bit);
+ return codec
+ ? codec->toUnicode(local8Bit, len)
+ : QString::fromLatin1(local8Bit,len);
+#endif
+// Should this be OS_WIN32?
+#ifdef _WS_WIN_
+ if ( len >= 0 ) {
+ QCString s(local8Bit,len+1);
+ return qt_winMB2QString(s);
+ }
+ return qt_winMB2QString( local8Bit );
+#endif
+#ifdef _WS_QWS_
+ return fromUtf8(local8Bit,len);
+#endif
+#endif // QT_NO_TEXTCODEC
+}
+
+/*!
+ \fn QString::operator const char *() const
+
+ Returns latin1(). Be sure to see the warnings documented there.
+ Note that for new code which you wish to be strictly Unicode-clean,
+ you can define the macro QT_NO_ASCII_CAST when compiling your code
+ to hide this function so that automatic casts are not done. This
+ has the added advantage that you catch the programming error
+ described under operator!().
+*/
+
+/*!
+ \fn QChar QString::at( uint ) const
+
+ Returns the character at \a i, or 0 if \a i is beyond the length
+ of the string.
+
+ Note: If this QString is not const or const&, the non-const at()
+ will be used instead, which will expand the string if \a i is beyond
+ the length of the string.
+*/
+
+/*!
+ \fn QChar QString::constref(uint i) const
+ Equivalent to at(i), this returns the QChar at \a i by value.
+
+ \sa ref()
+*/
+
+/*!
+ \fn QChar& QString::ref(uint i)
+ Returns the QChar at \a i by reference.
+
+ \sa constref()
+*/
+
+/*!
+ \fn QChar QString::operator[](int) const
+
+ Returns the character at \a i, or QChar::null if \a i is beyond the
+ length of the string.
+
+ Note: If this QString is not const or const&, the non-const operator[]
+ will be used instead, which will expand the string if \a i is beyond
+ the length of the string.
+*/
+
+/*!
+ \fn QCharRef QString::operator[](int)
+
+ Returns an object that references the character at \a i.
+ This reference
+ can then be assigned to, or otherwise used immediately, but
+ becomes invalid once further modifications are made to the string.
+ The QCharRef internal class can be used much like a constant QChar, but
+ if you assign to it, you change the original string (which enlarges
+ and detaches itself). You will get compilation errors if you try to
+ use the result as anything but a QChar.
+*/
+
+/*!
+ \fn QCharRef QString::at( uint i )
+ Returns a reference to the character at \a i, expanding
+ the string with QChar::null if necessary. The resulting reference
+ can then be assigned to, or otherwise used immediately, but
+ becomes invalid once further modifications are made to the string.
+*/
+
+/*!
+ Internal chunk of code to handle the
+ uncommon cases of at() above.
+*/
+void QString::subat( uint i )
+{
+ uint olen = d->len;
+ if ( i >= olen ) {
+ setLength( i+1 ); // i is index; i+1 is needed length
+ for ( uint j=olen; j<=i; j++ )
+ d->unicode[j] = QChar::null;
+ } else {
+ // Just be sure to detach
+ real_detach();
+ }
+}
+
+
+/*!
+ Resizes the string to \a len unicode characters and copies \a unicode
+ into the string. If \a unicode is null, nothing is copied, but the
+ string is resized to \a len anyway. If \a len is zero, the string
+ becomes a \link isNull() null\endlink string.
+
+ \sa setLatin1(), isNull()
+*/
+
+QString& QString::setUnicode( const QChar *unicode, uint len )
+{
+ if ( len == 0 ) { // set to null string
+ if ( d != shared_null ) { // beware of nullstring being set to nullstring
+ deref();
+ d = shared_null ? shared_null : makeSharedNull();
+ d->ref();
+ }
+ } else if ( d->count != 1 || len > d->maxl ||
+ ( len*4 < d->maxl && d->maxl > 4 ) ) { // detach, grown or shrink
+ Q2HELPER(stat_copy_on_write++)
+ Q2HELPER(stat_copy_on_write_size+=d->len)
+ uint newMax = 4;
+ while ( newMax < len )
+ newMax *= 2;
+ QChar* nd = QT_ALLOC_QCHAR_VEC( newMax );
+ if ( unicode )
+ memcpy( nd, unicode, sizeof(QChar)*len );
+ deref();
+ d = new QStringData( nd, len, newMax );
+ } else {
+ d->len = len;
+ d->dirtyascii = 1;
+ if ( unicode )
+ memcpy( d->unicode, unicode, sizeof(QChar)*len );
+ }
+ return *this;
+}
+
+/*!
+ Resizes the string to \a len unicode characters and copies
+ \a unicode_as_ushorts into the string (on some X11 client
+ platforms this will involve a byte-swapping pass).
+
+ If \a unicode is null, nothing is copied, but the
+ string is resized to \a len anyway. If \a len is zero, the string
+ becomes a \link isNull() null\endlink string.
+
+ \sa setLatin1(), isNull()
+*/
+QString& QString::setUnicodeCodes( const ushort* unicode_as_ushorts, uint len )
+{
+ setUnicode((const QChar*)unicode_as_ushorts, len);
+ QChar t(0x1234);
+ if ( unicode_as_ushorts && *((ushort*)&t) == 0x3412 ) {
+ // Need to byteswap
+ char* b = (char*)d->unicode;
+ while ( len-- ) {
+ char c = b[0];
+ b[0] = b[1];
+ b[1] = c;
+ b += sizeof(QChar);
+ }
+ }
+ return *this;
+}
+
+
+/*!
+ Sets this string to \a str, interpreted as a classic Latin 1 C string.
+ If the \a len argument is negative (default), it is set to strlen(str).
+
+ If \a str is 0 a null string is created. If \a str is "" an empty
+ string is created.
+
+ \sa isNull(), isEmpty()
+*/
+
+QString &QString::setLatin1( const char *str, int len )
+{
+ if ( str == 0 )
+ return setUnicode(0,0);
+ if ( len < 0 )
+ len = qstrlen(str);
+ if ( len == 0 ) { // won't make a null string
+ deref();
+ uint l;
+ QChar *uc = internalAsciiToUnicode(str,&l);
+ d = new QStringData(uc,l,l);
+ } else {
+ setUnicode( 0, len ); // resize but not copy
+ QChar *p = d->unicode;
+ while ( len-- )
+ *p++ = *str++;
+ }
+ return *this;
+}
+
+
+/*!
+ \fn int QString::compare (const QString & s1, const QString & s2)
+
+ Compare \a s1 to \a s2 returning an integer less than, equal to, or
+ greater than zero if s1 is, respectively, lexically less than, equal to,
+ or greater than s2.
+*/
+
+/*!
+ Compares this string to \a s, returning an integer less than, equal to, or
+ greater than zero if it is, respectively, lexically less than, equal to,
+ or greater than \a s.
+*/
+int QString::compare( const QString& s ) const
+{
+ return ucstrcmp(*this,s);
+}
+
+bool operator==( const QString &s1, const QString &s2 )
+{
+ return (s1.length() == s2.length()) && s1.isNull() == s2.isNull() &&
+ (memcmp((char*)s1.unicode(),(char*)s2.unicode(),
+ s1.length()*sizeof(QChar)) ==0);
+}
+
+bool operator!=( const QString &s1, const QString &s2 )
+{ return !(s1==s2); }
+
+bool operator<( const QString &s1, const QString &s2 )
+{ return ucstrcmp(s1,s2) < 0; }
+
+bool operator<=( const QString &s1, const QString &s2 )
+{ return ucstrcmp(s1,s2) <= 0; }
+
+bool operator>( const QString &s1, const QString &s2 )
+{ return ucstrcmp(s1,s2) > 0; }
+
+bool operator>=( const QString &s1, const QString &s2 )
+{ return ucstrcmp(s1,s2) >= 0; }
+
+
+bool operator==( const QString &s1, const char *s2 )
+{ return s1==QString(s2); }
+
+bool operator==( const char *s1, const QString &s2 )
+{ return QString(s1)==s2; }
+
+bool operator!=( const QString &s1, const char *s2 )
+{ return !(s1==s2); }
+
+bool operator!=( const char *s1, const QString &s2 )
+{ return !(s1==s2); }
+
+bool operator<( const QString &s1, const char *s2 )
+{ return ucstrcmp(s1,s2) < 0; }
+
+bool operator<( const char *s1, const QString &s2 )
+{ return ucstrcmp(s1,s2) < 0; }
+
+bool operator<=( const QString &s1, const char *s2 )
+{ return ucstrcmp(s1,s2) <= 0; }
+
+bool operator<=( const char *s1, const QString &s2 )
+{ return ucstrcmp(s1,s2) <= 0; }
+
+bool operator>( const QString &s1, const char *s2 )
+{ return ucstrcmp(s1,s2) > 0; }
+
+bool operator>( const char *s1, const QString &s2 )
+{ return ucstrcmp(s1,s2) > 0; }
+
+bool operator>=( const QString &s1, const char *s2 )
+{ return ucstrcmp(s1,s2) >= 0; }
+
+bool operator>=( const char *s1, const QString &s2 )
+{ return ucstrcmp(s1,s2) >= 0; }
+
+
+/*****************************************************************************
+ Documentation for QString related functions
+ *****************************************************************************/
+
+/*!
+ \fn bool operator==( const QString &s1, const QString &s2 )
+ \relates QString
+ Returns TRUE if the two strings are equal, or FALSE if they are different.
+ A null string is different from an empty, non-null string.
+
+ Equivalent to <code>qstrcmp(s1,s2) == 0</code>.
+*/
+
+/*!
+ \fn bool operator==( const QString &s1, const char *s2 )
+ \relates QString
+ Returns TRUE if the two strings are equal, or FALSE if they are different.
+
+ Equivalent to <code>qstrcmp(s1,s2) == 0</code>.
+*/
+
+/*!
+ \fn bool operator==( const char *s1, const QString &s2 )
+ \relates QString
+ Returns TRUE if the two strings are equal, or FALSE if they are different.
+
+ Equivalent to <code>qstrcmp(s1,s2) == 0</code>.
+*/
+
+/*!
+ \fn bool operator!=( const QString &s1, const QString &s2 )
+ \relates QString
+ Returns TRUE if the two strings are different, or FALSE if they are equal.
+
+ Equivalent to <code>qstrcmp(s1,s2) != 0</code>.
+*/
+
+/*!
+ \fn bool operator!=( const QString &s1, const char *s2 )
+ \relates QString
+ Returns TRUE if the two strings are different, or FALSE if they are equal.
+
+ Equivalent to <code>qstrcmp(s1,s2) != 0</code>.
+*/
+
+/*!
+ \fn bool operator!=( const char *s1, const QString &s2 )
+ \relates QString
+ Returns TRUE if the two strings are different, or FALSE if they are equal.
+
+ Equivalent to <code>qstrcmp(s1,s2) != 0</code>.
+*/
+
+/*!
+ \fn bool operator<( const QString &s1, const char *s2 )
+ \relates QString
+ Returns TRUE if \a s1 is alphabetically less than \a s2, otherwise FALSE.
+
+ Equivalent to <code>qstrcmp(s1,s2) \< 0</code>.
+*/
+
+/*!
+ \fn bool operator<( const char *s1, const QString &s2 )
+ \relates QString
+ Returns TRUE if \a s1 is alphabetically less than \a s2, otherwise FALSE.
+
+ Equivalent to <code>qstrcmp(s1,s2) \< 0</code>.
+*/
+
+/*!
+ \fn bool operator<=( const QString &s1, const char *s2 )
+ \relates QString
+ Returns TRUE if \a s1 is alphabetically less than or equal to \a s2,
+ otherwise FALSE.
+
+ Equivalent to <code>qstrcmp(s1,s2) \<= 0</code>.
+*/
+
+/*!
+ \fn bool operator<=( const char *s1, const QString &s2 )
+ \relates QString
+ Returns TRUE if \a s1 is alphabetically less than or equal to \a s2,
+ otherwise FALSE.
+
+ Equivalent to <code>qstrcmp(s1,s2) \<= 0</code>.
+*/
+
+/*!
+ \fn bool operator>( const QString &s1, const char *s2 )
+ \relates QString
+ Returns TRUE if \a s1 is alphabetically greater than \a s2, otherwise FALSE.
+
+ Equivalent to <code>qstrcmp(s1,s2) \> 0</code>.
+*/
+
+/*!
+ \fn bool operator>( const char *s1, const QString &s2 )
+ \relates QString
+ Returns TRUE if \a s1 is alphabetically greater than \a s2, otherwise FALSE.
+
+ Equivalent to <code>qstrcmp(s1,s2) \> 0</code>.
+*/
+
+/*!
+ \fn bool operator>=( const QString &s1, const char *s2 )
+ \relates QString
+ Returns TRUE if \a s1 is alphabetically greater than or equal to \a s2,
+ otherwise FALSE.
+
+ Equivalent to <code>qstrcmp(s1,s2) \>= 0</code>.
+*/
+
+/*!
+ \fn bool operator>=( const char *s1, const QString &s2 )
+ \relates QString
+ Returns TRUE if \a s1 is alphabetically greater than or equal to \a s2,
+ otherwise FALSE.
+
+ Equivalent to <code>qstrcmp(s1,s2) \>= 0</code>.
+*/
+
+/*!
+ \fn QString operator+( const QString &s1, const QString &s2 )
+ \relates QString
+ Returns the concatenated string of s1 and s2.
+*/
+
+/*!
+ \fn QString operator+( const QString &s1, const char *s2 )
+ \relates QString
+ Returns the concatenated string of s1 and s2.
+*/
+
+/*!
+ \fn QString operator+( const char *s1, const QString &s2 )
+ \relates QString
+ Returns the concatenated string of s1 and s2.
+*/
+
+/*!
+ \fn QString operator+( const QString &s, char c )
+ \relates QString
+ Returns the concatenated string of s and c.
+*/
+
+/*!
+ \fn QString operator+( char c, const QString &s )
+ \relates QString
+ Returns the concatenated string of c and s.
+*/
+
+
+/*****************************************************************************
+ QString stream functions
+ *****************************************************************************/
+#ifndef QT_NO_DATASTREAM
+/*!
+ \relates QString
+ Writes a string to the stream.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator<<( QDataStream &s, const QString &str )
+{
+ if ( s.version() == 1 ) {
+ QCString l( str.latin1() );
+ s << l;
+ }
+ else {
+ const char* ub = (const char*)str.unicode();
+ if ( ub || s.version() < 3 ) {
+ if ( QChar::networkOrdered() ==
+ (s.byteOrder()==QDataStream::BigEndian) ) {
+ s.writeBytes( ub, sizeof(QChar)*str.length() );
+ } else {
+ static const uint auto_size = 1024;
+ char t[auto_size];
+ char *b;
+ if ( str.length()*sizeof(QChar) > auto_size ) {
+ b = new char[str.length()*sizeof(QChar)];
+ } else {
+ b = t;
+ }
+ int l = str.length();
+ char *c=b;
+ while ( l-- ) {
+ *c++ = ub[1];
+ *c++ = ub[0];
+ ub+=sizeof(QChar);
+ }
+ s.writeBytes( b, sizeof(QChar)*str.length() );
+ if ( str.length()*sizeof(QChar) > auto_size )
+ delete [] b;
+ }
+ } else {
+ // write null marker
+ s << (Q_UINT32)0xffffffff;
+ }
+ }
+ return s;
+}
+
+/*!
+ \relates QString
+ Reads a string from the stream.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator>>( QDataStream &s, QString &str )
+{
+#ifdef QT_QSTRING_UCS_4
+#if defined(_CC_GNU_)
+#warning "operator>> not working properly"
+#endif
+#endif
+ if ( s.version() == 1 ) {
+ QCString l;
+ s >> l;
+ str = QString( l );
+ }
+ else {
+ Q_UINT32 bytes;
+ s >> bytes; // read size of string
+ if ( bytes == 0xffffffff ) { // null string
+ str = QString::null;
+ } else if ( bytes > 0 ) { // not empty
+ str.setLength( bytes/2 );
+ char* b = (char*)str.d->unicode;
+ s.readRawBytes( b, bytes );
+ if ( QChar::networkOrdered() !=
+ (s.byteOrder()==QDataStream::BigEndian) ) {
+ bytes /= 2;
+ while ( bytes-- ) {
+ char c = b[0];
+ b[0] = b[1];
+ b[1] = c;
+ b += 2;
+ }
+ }
+ } else {
+ str = "";
+ }
+ }
+ return s;
+}
+#endif // QT_NO_DATASTREAM
+
+/*****************************************************************************
+ QConstString member functions
+ *****************************************************************************/
+
+/*!
+ \class QConstString qstring.h
+ \brief A QString which uses constant Unicode data.
+
+ In order to minimize copying, highly optimized applications can use
+ QConstString to provide a QString-compatible object from existing
+ Unicode data. It is then the user's responsibility to make sure
+ that the Unicode data must exist for the entire lifetime of the
+ QConstString object.
+*/
+
+/*!
+ Constructs a QConstString that uses the first \a length Unicode
+ characters in the array \a unicode. Any attempt to modify
+ copies of the string will cause it to create a copy of the
+ data, thus it remains forever unmodified.
+
+ Note that \a unicode is \e not \e copied. The caller \e must be
+ able to guarantee that \a unicode will not be deleted or
+ modified. Since that is generally not the case with \c const strings
+ (they are references), this constructor demands a non-const pointer
+ even though it never modifies \a unicode.
+*/
+QConstString::QConstString( QChar* unicode, uint length ) :
+ QString(new QStringData(unicode, length, length),TRUE)
+{
+}
+
+/*!
+ Destroys the QConstString, creating a copy of the data if
+ other strings are still using it.
+*/
+QConstString::~QConstString()
+{
+ if ( d->count > 1 ) {
+ QChar* cp = QT_ALLOC_QCHAR_VEC( d->len );
+ memcpy( cp, d->unicode, d->len*sizeof(QChar) );
+ d->unicode = cp;
+ } else {
+ d->unicode = 0;
+ }
+
+ // The original d->unicode is now unlinked.
+}
+
+/*!
+ \fn const QString& QConstString::string() const
+
+ Returns a constant string referencing the data passed during
+ construction.
+*/
+
+/*!
+ Returns whether the strings starts with \a s, or not.
+ */
+bool QString::startsWith( const QString& s ) const
+{
+ for ( int i =0; i < (int) s.length(); i++ ) {
+ if ( i >= (int) length() || d->unicode[i] != s[i] )
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+
+#if defined(_OS_WIN32_)
+
+#include <windows.h>
+
+/*!
+ Returns a static Windows TCHAR* from a QString, possibly adding NUL.
+
+ The lifetime of the return value is until the next call to this function.
+*/
+const void* qt_winTchar(const QString& str_in, bool addnul)
+{
+ // So that the return value lives long enough.
+ static QString str;
+ str = str_in;
+
+#ifdef UNICODE
+ static uint buflen = 256;
+ static TCHAR *buf = new TCHAR[buflen];
+
+ const QChar* uc = str.unicode();
+
+#define EXTEND if (str.length() > buflen) { delete buf; buf = new TCHAR[buflen=str.length()+1]; }
+
+#if defined(_WS_X11_) || defined(_OS_WIN32_BYTESWAP_)
+ EXTEND
+ for ( int i=str.length(); i--; )
+ buf[i] = uc[i].row() << 8 | uc[i].cell();
+ if ( addnul )
+ buf[str.length()] = 0;
+#else
+ // Same endianness of TCHAR
+ if ( addnul ) {
+ EXTEND
+ memcpy(buf,uc,sizeof(TCHAR)*str.length());
+ buf[str.length()] = 0;
+ } else {
+ return uc;
+ }
+#endif
+ return buf;
+#undef EXTEND
+
+#else
+ return str.latin1();
+#endif
+}
+
+/*!
+ Makes a new null terminated Windows TCHAR* from a QString.
+*/
+void* qt_winTchar_new(const QString& str)
+{
+ TCHAR* result = new TCHAR[str.length()+1];
+ memcpy(result, qt_winTchar(str,FALSE), sizeof(TCHAR)*str.length());
+ result[str.length()] = 0;
+ return result;
+}
+
+/*!
+ Makes a QString from a Windows TCHAR*.
+*/
+QString qt_winQString(void* tc)
+{
+#ifdef UNICODE
+
+ int len=0;
+ while ( ((TCHAR*)tc)[len] )
+ len++;
+#if defined(_WS_X11_) || defined(_OS_WIN32_BYTESWAP_)
+ QString r;
+ for ( int i=0; i<len; i++ )
+ r += QChar(((TCHAR*)tc)[i]&0xff,((TCHAR*)tc)[i]>>8);
+ return r;
+#else
+ // Same endianness of TCHAR
+ return QString((QChar*)tc,len);
+#endif
+#undef EXTEND
+#else
+ return (TCHAR*)tc;
+#endif
+}
+
+QCString qt_winQString2MB( const QString& s, int uclen )
+{
+ if ( uclen < 0 )
+ uclen = s.length();
+ if ( uclen == 0 )
+ return QCString();
+ BOOL used_def;
+ int bufSize=4096;
+ QCString mb(bufSize);
+ int len;
+ while ( !(len=WideCharToMultiByte(CP_ACP, 0, (const WCHAR*)s.unicode(), uclen,
+ mb.data(), bufSize-1, 0, &used_def)) )
+ {
+ int r = GetLastError();
+ if ( r == ERROR_INSUFFICIENT_BUFFER ) {
+ bufSize=1+WideCharToMultiByte( CP_ACP, 0,
+ (const WCHAR*)s.unicode(), uclen,
+ 0, 0, 0, &used_def);
+ mb.resize(bufSize);
+ // and try again...
+ } else {
+ // Fail.
+ qWarning("WideCharToMultiByte cannot convert multibyte text (error %d): %s (UTF8)",
+ r, s.utf8().data());
+ break;
+ }
+ }
+ mb[len]='\0';
+ return mb;
+}
+
+// WATCH OUT: mblen must include the NUL (or just use -1)
+QString qt_winMB2QString( const char* mb, int mblen )
+{
+ if ( !mb || !mblen )
+ return QString::null;
+ const int wclen_auto = 4096;
+ WCHAR wc_auto[wclen_auto];
+ int wclen = wclen_auto;
+ WCHAR *wc = wc_auto;
+ int len;
+ while ( !(len=MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED,
+ mb, mblen, wc, wclen )) )
+ {
+ int r = GetLastError();
+ if ( r == ERROR_INSUFFICIENT_BUFFER ) {
+ if ( wc != wc_auto ) {
+ qWarning("Size changed in MultiByteToWideChar");
+ break;
+ } else {
+ wclen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED,
+ mb, mblen, 0, 0 );
+ wc = new WCHAR[wclen];
+ // and try again...
+ }
+ } else {
+ // Fail.
+ qWarning("MultiByteToWideChar cannot convert multibyte text");
+ break;
+ }
+ }
+ if ( len <= 0 )
+ return QString::null;
+ QString s( (QChar*)wc, len-1 ); // len-1: we don't want terminator
+ if ( wc != wc_auto )
+ delete [] wc;
+ return s;
+}
+
+
+#endif // _OS_WIN32_
diff --git a/qtools/qstring.h b/qtools/qstring.h
new file mode 100644
index 0000000..0dd6352
--- /dev/null
+++ b/qtools/qstring.h
@@ -0,0 +1,833 @@
+/****************************************************************************
+**
+**
+** Definition of the QString class, and related Unicode
+** functions.
+**
+** Created : 920609
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QSTRING_H
+#define QSTRING_H
+
+#ifndef QT_H
+#include "qcstring.h"
+#endif // QT_H
+
+
+/*****************************************************************************
+ QString class
+ *****************************************************************************/
+
+class QRegExp;
+class QString;
+class QCharRef;
+
+class Q_EXPORT Q_PACKED QChar {
+public:
+ QChar();
+ QChar( char c );
+ QChar( uchar c );
+ QChar( uchar c, uchar r );
+ QChar( const QChar& c );
+ QChar( ushort rc );
+ QChar( short rc );
+ QChar( uint rc );
+ QChar( int rc );
+
+ QT_STATIC_CONST QChar null; // 0000
+ QT_STATIC_CONST QChar replacement; // FFFD
+ QT_STATIC_CONST QChar byteOrderMark; // FEFF
+ QT_STATIC_CONST QChar byteOrderSwapped; // FFFE
+ QT_STATIC_CONST QChar nbsp; // 00A0
+
+ // Unicode information
+
+ enum Category
+ {
+ NoCategory,
+
+ Mark_NonSpacing, // Mn
+ Mark_SpacingCombining, // Mc
+ Mark_Enclosing, // Me
+
+ Number_DecimalDigit, // Nd
+ Number_Letter, // Nl
+ Number_Other, // No
+
+ Separator_Space, // Zs
+ Separator_Line, // Zl
+ Separator_Paragraph, // Zp
+
+ Other_Control, // Cc
+ Other_Format, // Cf
+ Other_Surrogate, // Cs
+ Other_PrivateUse, // Co
+ Other_NotAssigned, // Cn
+
+ Letter_Uppercase, // Lu
+ Letter_Lowercase, // Ll
+ Letter_Titlecase, // Lt
+ Letter_Modifier, // Lm
+ Letter_Other, // Lo
+
+ Punctuation_Connector, // Pc
+ Punctuation_Dask, // Pd
+ Punctuation_Open, // Ps
+ Punctuation_Close, // Pe
+ Punctuation_InitialQuote, // Pi
+ Punctuation_FinalQuote, // Pf
+ Punctuation_Other, // Po
+
+ Symbol_Math, // Sm
+ Symbol_Currency, // Sc
+ Symbol_Modifier, // Sk
+ Symbol_Other // So
+ };
+
+ enum Direction
+ {
+ DirL, DirR, DirEN, DirES, DirET, DirAN, DirCS, DirB, DirS, DirWS, DirON,
+ DirLRE, DirLRO, DirAL, DirRLE, DirRLO, DirPDF, DirNSM, DirBN
+ };
+
+ enum Decomposition
+ {
+ Single, Canonical, Font, NoBreak, Initial, Medial,
+ Final, Isolated, Circle, Super, Sub, Vertical,
+ Wide, Narrow, Small, Square, Compat, Fraction
+ };
+
+ enum Joining
+ {
+ OtherJoining, Dual, Right, Center
+ };
+
+ // ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO
+
+ int digitValue() const;
+ QChar lower() const;
+ QChar upper() const;
+
+ Category category() const;
+ Direction direction() const;
+ Joining joining() const;
+ bool mirrored() const;
+ QChar mirroredChar() const;
+ QString decomposition() const;
+ Decomposition decompositionTag() const;
+
+ char latin1() const { return rw ? 0 : cl; }
+ ushort unicode() const { return (rw << 8) | cl; }
+#ifndef QT_NO_CAST_ASCII
+ // like all ifdef'd code this is undocumented
+ operator char() const { return latin1(); }
+#endif
+
+ bool isNull() const { return unicode()==0; }
+ bool isPrint() const;
+ bool isPunct() const;
+ bool isSpace() const;
+ bool isMark() const;
+ bool isLetter() const;
+ bool isNumber() const;
+ bool isLetterOrNumber() const;
+ bool isDigit() const;
+
+ uchar& cell() { return cl; }
+ uchar& row() { return rw; }
+ uchar cell() const { return cl; }
+ uchar row() const { return rw; }
+
+ static bool networkOrdered() { return (int)net_ordered == 1; }
+
+ friend inline int operator==( char ch, QChar c );
+ friend inline int operator==( QChar c, char ch );
+ friend inline int operator==( QChar c1, QChar c2 );
+ friend inline int operator!=( QChar c1, QChar c2 );
+ friend inline int operator!=( char ch, QChar c );
+ friend inline int operator!=( QChar c, char ch );
+ friend inline int operator<=( QChar c, char ch );
+ friend inline int operator<=( char ch, QChar c );
+ friend inline int operator<=( QChar c1, QChar c2 );
+
+private:
+#if defined(_WS_X11_) || defined(_OS_WIN32_BYTESWAP_) || defined( _WS_QWS_ )
+ // XChar2b on X11, ushort on _OS_WIN32_BYTESWAP_
+ //### QWS must be defined on a platform by platform basis
+ uchar rw;
+ uchar cl;
+#if defined(QT_QSTRING_UCS_4)
+ ushort grp;
+#endif
+ enum { net_ordered = 1 };
+#else
+ // ushort on _OS_WIN32_
+ uchar cl;
+ uchar rw;
+#if defined(QT_QSTRING_UCS_4)
+ ushort grp;
+#endif
+ enum { net_ordered = 0 };
+#endif
+};
+
+inline QChar::QChar()
+{
+ rw = 0; cl = 0;
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+}
+inline QChar::QChar( char c )
+{
+ rw = 0; cl = (uchar)c;
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+}
+inline QChar::QChar( uchar c )
+{
+ rw = 0; cl = c;
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+}
+inline QChar::QChar( uchar c, uchar r )
+{
+ rw = r; cl = c;
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+}
+inline QChar::QChar( const QChar& c )
+{
+ rw = c.rw; cl = c.cl;
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+}
+inline QChar::QChar( ushort rc )
+{
+ rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+}
+inline QChar::QChar( short rc )
+{
+ rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+}
+inline QChar::QChar( uint rc )
+{
+ rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+}
+inline QChar::QChar( int rc )
+{
+ rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);
+#ifdef QT_QSTRING_UCS_4
+ grp = 0;
+#endif
+}
+
+
+inline int operator==( char ch, QChar c )
+{
+ return ch == c.cl && !c.rw;
+}
+
+inline int operator==( QChar c, char ch )
+{
+ return ch == c.cl && !c.rw;
+}
+
+inline int operator==( QChar c1, QChar c2 )
+{
+ return c1.cl == c2.cl
+ && c1.rw == c2.rw;
+}
+
+inline int operator!=( QChar c1, QChar c2 )
+{
+ return c1.cl != c2.cl
+ || c1.rw != c2.rw;
+}
+
+inline int operator!=( char ch, QChar c )
+{
+ return ch != c.cl || c.rw;
+}
+
+inline int operator!=( QChar c, char ch )
+{
+ return ch != c.cl || c.rw;
+}
+
+inline int operator<=( QChar c, char ch )
+{
+ return !(ch < c.cl || c.rw);
+}
+
+inline int operator<=( char ch, QChar c )
+{
+ return ch <= c.cl || c.rw;
+}
+
+inline int operator<=( QChar c1, QChar c2 )
+{
+ return c1.rw > c2.rw
+ ? FALSE
+ : c1.rw < c2.rw
+ ? TRUE
+ : c1.cl <= c2.cl;
+}
+
+inline int operator>=( QChar c, char ch ) { return ch <= c; }
+inline int operator>=( char ch, QChar c ) { return c <= ch; }
+inline int operator>=( QChar c1, QChar c2 ) { return c2 <= c1; }
+inline int operator<( QChar c, char ch ) { return !(ch<=c); }
+inline int operator<( char ch, QChar c ) { return !(c<=ch); }
+inline int operator<( QChar c1, QChar c2 ) { return !(c2<=c1); }
+inline int operator>( QChar c, char ch ) { return !(ch>=c); }
+inline int operator>( char ch, QChar c ) { return !(c>=ch); }
+inline int operator>( QChar c1, QChar c2 ) { return !(c2>=c1); }
+
+// internal
+struct Q_EXPORT QStringData : public QShared {
+ QStringData() :
+ unicode(0), ascii(0), len(0), maxl(0), dirtyascii(0) { ref(); }
+ QStringData(QChar *u, uint l, uint m) :
+ unicode(u), ascii(0), len(l), maxl(m), dirtyascii(0) { }
+
+ ~QStringData() { if ( unicode ) delete[] ((char*)unicode);
+ if ( ascii ) delete[] ascii; }
+
+ void deleteSelf();
+ QChar *unicode;
+ char *ascii;
+ uint len;
+ uint maxl:30;
+ uint dirtyascii:1;
+};
+
+
+class Q_EXPORT QString
+{
+public:
+ QString(); // make null string
+ QString( QChar ); // one-char string
+ QString( const QString & ); // impl-shared copy
+ QString( const QByteArray& ); // deep copy
+ QString( const QCString& ); // deep copy
+ QString( const QChar* unicode, uint length ); // deep copy
+#ifndef QT_NO_CAST_ASCII
+ QString( const char *str ); // deep copy
+#endif
+ ~QString();
+
+ QString &operator=( const QString & ); // impl-shared copy
+#ifndef QT_NO_CAST_ASCII
+ QString &operator=( const char * ); // deep copy
+#endif
+ QString &operator=( const QCString& ); // deep copy
+ QString &operator=( QChar c );
+ QString &operator=( char c );
+
+ //QT_STATIC_CONST QString null;
+ //bool isNull() const;
+
+ struct Null { };
+ static const Null null;
+ inline QString(const Null &): d(shared_null) { d->ref(); }
+ inline QString &operator=(const Null &) { *this = QString(); return *this; }
+ inline bool isNull() const { return d == shared_null; }
+
+ bool isEmpty() const;
+ uint length() const;
+ void truncate( uint pos );
+
+#if QT_VERSION >= 300
+#error "fill() Should return *this, or QChar constructor should take count=1"
+#endif
+ void fill( QChar c, int len = -1 );
+
+ QString copy() const;
+
+ QString arg(long a, int fieldwidth=0, int base=10) const;
+ QString arg(ulong a, int fieldwidth=0, int base=10) const;
+ QString arg(int a, int fieldwidth=0, int base=10) const;
+ QString arg(uint a, int fieldwidth=0, int base=10) const;
+ QString arg(short a, int fieldwidth=0, int base=10) const;
+ QString arg(ushort a, int fieldwidth=0, int base=10) const;
+ QString arg(char a, int fieldwidth=0) const;
+ QString arg(QChar a, int fieldwidth=0) const;
+ QString arg(const QString& a, int fieldwidth=0) const;
+ QString arg(double a, int fieldwidth=0, char fmt='g', int prec=-1) const;
+
+ QString &sprintf( const char* format, ... )
+#if defined(_CC_GNU_) && !defined(__INSURE__)
+ __attribute__ ((format (printf, 2, 3)))
+#endif
+ ;
+
+ int find( QChar c, int index=0, bool cs=TRUE ) const;
+ int find( char c, int index=0, bool cs=TRUE ) const;
+ int find( const QString &str, int index=0, bool cs=TRUE ) const;
+ int find( const QRegExp &, int index=0 ) const;
+#ifndef QT_NO_CAST_ASCII
+ int find( const char* str, int index=0 ) const;
+#endif
+ int findRev( QChar c, int index=-1, bool cs=TRUE) const;
+ int findRev( char c, int index=-1, bool cs=TRUE) const;
+ int findRev( const QString &str, int index=-1, bool cs=TRUE) const;
+ int findRev( const QRegExp &, int index=-1 ) const;
+#ifndef QT_NO_CAST_ASCII
+ int findRev( const char* str, int index=-1 ) const;
+#endif
+ int contains( QChar c, bool cs=TRUE ) const;
+ int contains( char c, bool cs=TRUE ) const
+ { return contains(QChar(c), cs); }
+#ifndef QT_NO_CAST_ASCII
+ int contains( const char* str, bool cs=TRUE ) const;
+#endif
+ int contains( const QString &str, bool cs=TRUE ) const;
+ int contains( const QRegExp & ) const;
+
+ QString left( uint len ) const;
+ QString right( uint len ) const;
+ QString mid( uint index, uint len=0xffffffff) const;
+
+ QString leftJustify( uint width, QChar fill=' ', bool trunc=FALSE)const;
+ QString rightJustify( uint width, QChar fill=' ',bool trunc=FALSE)const;
+
+ QString lower() const;
+ QString upper() const;
+
+ QString stripWhiteSpace() const;
+ QString simplifyWhiteSpace() const;
+
+ QString &insert( uint index, const QString & );
+ QString &insert( uint index, const QChar*, uint len );
+ QString &insert( uint index, QChar );
+ QString &insert( uint index, char c ) { return insert(index,QChar(c)); }
+ QString &append( char );
+ QString &append( QChar );
+ QString &append( const QString & );
+ QString &prepend( char );
+ QString &prepend( QChar );
+ QString &prepend( const QString & );
+ QString &remove( uint index, uint len );
+ QString &replace( uint index, uint len, const QString & );
+ QString &replace( uint index, uint len, const QChar*, uint clen );
+ QString &replace( const QRegExp &, const QString & );
+
+ short toShort( bool *ok=0, int base=10 ) const;
+ ushort toUShort( bool *ok=0, int base=10 ) const;
+ int toInt( bool *ok=0, int base=10 ) const;
+ uint toUInt( bool *ok=0, int base=10 ) const;
+ long toLong( bool *ok=0, int base=10 ) const;
+ ulong toULong( bool *ok=0, int base=10 ) const;
+ float toFloat( bool *ok=0 ) const;
+ double toDouble( bool *ok=0 ) const;
+
+ QString &setNum( short, int base=10 );
+ QString &setNum( ushort, int base=10 );
+ QString &setNum( int, int base=10 );
+ QString &setNum( uint, int base=10 );
+ QString &setNum( long, int base=10 );
+ QString &setNum( ulong, int base=10 );
+ QString &setNum( float, char f='g', int prec=6 );
+ QString &setNum( double, char f='g', int prec=6 );
+
+ static QString number( long, int base=10 );
+ static QString number( ulong, int base=10);
+ static QString number( int, int base=10 );
+ static QString number( uint, int base=10);
+ static QString number( double, char f='g', int prec=6 );
+
+ void setExpand( uint index, QChar c );
+
+ QString &operator+=( const QString &str );
+ QString &operator+=( QChar c );
+ QString &operator+=( char c );
+
+ // Your compiler is smart enough to use the const one if it can.
+ QChar at( uint i ) const
+ { return i<d->len ? d->unicode[i] : QChar::null; }
+ QChar operator[]( int i ) const { return at((uint)i); }
+ QCharRef at( uint i );
+ QCharRef operator[]( int i );
+
+ QChar constref(uint i) const
+ { return at(i); }
+ QChar& ref(uint i)
+ { // Optimized for easy-inlining by simple compilers.
+ if (d->count!=1 || i>=d->len)
+ subat(i);
+ d->dirtyascii=1;
+ return d->unicode[i];
+ }
+
+ const QChar* unicode() const { return d->unicode; }
+ const char* ascii() const;
+ const char* latin1() const;
+ static QString fromLatin1(const char*, int len=-1);
+ const unsigned short *ucs2() const;
+ static QString fromUcs2( const unsigned short *ucs2 );
+#ifndef QT_NO_TEXTCODEC
+ QCString utf8() const;
+ static QString fromUtf8(const char*, int len=-1);
+#endif
+ QCString local8Bit() const;
+ static QString fromLocal8Bit(const char*, int len=-1);
+ bool operator!() const;
+#ifndef QT_NO_ASCII_CAST
+ operator const char *() const { return latin1(); }
+#endif
+
+ QString &setUnicode( const QChar* unicode, uint len );
+ QString &setUnicodeCodes( const ushort* unicode_as_ushorts, uint len );
+ QString &setLatin1( const char*, int len=-1 );
+
+ int compare( const QString& s ) const;
+ static int compare( const QString& s1, const QString& s2 )
+ { return s1.compare(s2); }
+
+#ifndef QT_NO_DATASTREAM
+ friend Q_EXPORT QDataStream &operator>>( QDataStream &, QString & );
+#endif
+ // new functions for BiDi
+ void compose();
+ QChar::Direction basicDirection();
+ QString visual(int index = 0, int len = -1);
+
+#ifndef QT_NO_COMPAT
+ const char* data() const { return latin1(); }
+#endif
+
+ bool startsWith( const QString& ) const;
+
+private:
+ QString( int size, bool dummy ); // allocate size incl. \0
+
+ void deref();
+ void real_detach();
+ void setLength( uint pos );
+ void subat( uint );
+ bool findArg(int& pos, int& len) const;
+
+ static QChar* asciiToUnicode( const char*, uint * len, uint maxlen=(uint)-1 );
+ static QChar* asciiToUnicode( const QByteArray&, uint * len );
+ static char* unicodeToAscii( const QChar*, uint len );
+
+ QStringData *d;
+ static QStringData* shared_null;
+ static QStringData* makeSharedNull();
+
+ friend class QConstString;
+ QString(QStringData* dd, bool /*dummy*/) : d(dd) { }
+};
+
+class Q_EXPORT QCharRef {
+ friend class QString;
+ QString& s;
+ uint p;
+ QCharRef(QString* str, uint pos) : s(*str), p(pos) { }
+
+public:
+ // Most QChar operations repeated here...
+
+ // all this is not documented: We just say "like QChar" and let it be.
+#if 1
+ ushort unicode() const { return s.constref(p).unicode(); }
+ char latin1() const { return s.constref(p).latin1(); }
+
+ // An operator= for each QChar cast constructor...
+ QCharRef operator=(char c ) { s.ref(p)=c; return *this; }
+ QCharRef operator=(uchar c ) { s.ref(p)=c; return *this; }
+ QCharRef operator=(QChar c ) { s.ref(p)=c; return *this; }
+ QCharRef operator=(const QCharRef& c ) { s.ref(p)=c.unicode(); return *this; }
+ QCharRef operator=(ushort rc ) { s.ref(p)=rc; return *this; }
+ QCharRef operator=(short rc ) { s.ref(p)=rc; return *this; }
+ QCharRef operator=(uint rc ) { s.ref(p)=rc; return *this; }
+ QCharRef operator=(int rc ) { s.ref(p)=rc; return *this; }
+
+ operator QChar () const { return s.constref(p); }
+
+ // each function...
+ bool isNull() const { return unicode()==0; }
+ bool isPrint() const { return s.constref(p).isPrint(); }
+ bool isPunct() const { return s.constref(p).isPunct(); }
+ bool isSpace() const { return s.constref(p).isSpace(); }
+ bool isMark() const { return s.constref(p).isMark(); }
+ bool isLetter() const { return s.constref(p).isLetter(); }
+ bool isNumber() const { return s.constref(p).isNumber(); }
+ bool isLetterOrNumber() { return s.constref(p).isLetterOrNumber(); }
+ bool isDigit() const { return s.constref(p).isDigit(); }
+
+ int digitValue() const { return s.constref(p).digitValue(); }
+ QChar lower() { return s.constref(p).lower(); }
+ QChar upper() { return s.constref(p).upper(); }
+
+ QChar::Category category() const { return s.constref(p).category(); }
+ QChar::Direction direction() const { return s.constref(p).direction(); }
+ QChar::Joining joining() const { return s.constref(p).joining(); }
+ bool mirrored() const { return s.constref(p).mirrored(); }
+ QChar mirroredChar() const { return s.constref(p).mirroredChar(); }
+ QString decomposition() const { return s.constref(p).decomposition(); }
+ QChar::Decomposition decompositionTag() const { return s.constref(p).decompositionTag(); }
+
+ // Not the non-const ones of these.
+ uchar cell() const { return s.constref(p).cell(); }
+ uchar row() const { return s.constref(p).row(); }
+#endif
+};
+
+inline QCharRef QString::at( uint i ) { return QCharRef(this,i); }
+inline QCharRef QString::operator[]( int i ) { return at((uint)i); }
+
+
+class Q_EXPORT QConstString : private QString {
+public:
+ QConstString( QChar* unicode, uint length );
+ ~QConstString();
+ const QString& string() const { return *this; }
+};
+
+
+/*****************************************************************************
+ QString stream functions
+ *****************************************************************************/
+#ifndef QT_NO_DATASTREAM
+Q_EXPORT QDataStream &operator<<( QDataStream &, const QString & );
+Q_EXPORT QDataStream &operator>>( QDataStream &, QString & );
+#endif
+
+/*****************************************************************************
+ QString inline functions
+ *****************************************************************************/
+
+// These two move code into makeSharedNull() and deletesData()
+// to improve cache-coherence (and reduce code bloat), while
+// keeping the common cases fast.
+//
+// No safe way to pre-init shared_null on ALL compilers/linkers.
+inline QString::QString() :
+ d(shared_null ? shared_null : makeSharedNull())
+{
+ d->ref();
+}
+//
+inline QString::~QString()
+{
+ if ( d->deref() ) {
+ if ( d == shared_null )
+ shared_null = 0;
+ d->deleteSelf();
+ }
+}
+
+inline QString &QString::operator=( QChar c )
+{ return *this = QString(c); }
+
+inline QString &QString::operator=( char c )
+{ return *this = QString(QChar(c)); }
+
+//inline bool QString::isNull() const
+//{ return unicode() == 0; }
+
+inline bool QString::operator!() const
+{ return isNull(); }
+
+inline uint QString::length() const
+{ return d->len; }
+
+inline bool QString::isEmpty() const
+{ return length() == 0; }
+
+inline QString QString::copy() const
+{ return QString( *this ); }
+
+inline QString &QString::prepend( const QString & s )
+{ return insert(0,s); }
+
+inline QString &QString::prepend( QChar c )
+{ return insert(0,c); }
+
+inline QString &QString::prepend( char c )
+{ return insert(0,c); }
+
+inline QString &QString::append( const QString & s )
+{ return operator+=(s); }
+
+inline QString &QString::append( QChar c )
+{ return operator+=(c); }
+
+inline QString &QString::append( char c )
+{ return operator+=(c); }
+
+inline QString &QString::setNum( short n, int base )
+{ return setNum((long)n, base); }
+
+inline QString &QString::setNum( ushort n, int base )
+{ return setNum((ulong)n, base); }
+
+inline QString &QString::setNum( int n, int base )
+{ return setNum((long)n, base); }
+
+inline QString &QString::setNum( uint n, int base )
+{ return setNum((ulong)n, base); }
+
+inline QString &QString::setNum( float n, char f, int prec )
+{ return setNum((double)n,f,prec); }
+
+inline QString QString::arg(int a, int fieldwidth, int base) const
+{ return arg((long)a, fieldwidth, base); }
+
+inline QString QString::arg(uint a, int fieldwidth, int base) const
+{ return arg((ulong)a, fieldwidth, base); }
+
+inline QString QString::arg(short a, int fieldwidth, int base) const
+{ return arg((long)a, fieldwidth, base); }
+
+inline QString QString::arg(ushort a, int fieldwidth, int base) const
+{ return arg((ulong)a, fieldwidth, base); }
+
+inline int QString::find( char c, int index, bool cs ) const
+{ return find(QChar(c), index, cs); }
+
+inline int QString::findRev( char c, int index, bool cs) const
+{ return findRev( QChar(c), index, cs ); }
+
+
+#ifndef QT_NO_CAST_ASCII
+inline int QString::find( const char* str, int index ) const
+{ return find(QString::fromLatin1(str), index); }
+
+inline int QString::findRev( const char* str, int index ) const
+{ return findRev(QString::fromLatin1(str), index); }
+#endif
+
+
+/*****************************************************************************
+ QString non-member operators
+ *****************************************************************************/
+
+Q_EXPORT bool operator!=( const QString &s1, const QString &s2 );
+Q_EXPORT bool operator<( const QString &s1, const QString &s2 );
+Q_EXPORT bool operator<=( const QString &s1, const QString &s2 );
+Q_EXPORT bool operator==( const QString &s1, const QString &s2 );
+Q_EXPORT bool operator>( const QString &s1, const QString &s2 );
+Q_EXPORT bool operator>=( const QString &s1, const QString &s2 );
+#ifndef QT_NO_CAST_ASCII
+Q_EXPORT bool operator!=( const QString &s1, const char *s2 );
+Q_EXPORT bool operator<( const QString &s1, const char *s2 );
+Q_EXPORT bool operator<=( const QString &s1, const char *s2 );
+Q_EXPORT bool operator==( const QString &s1, const char *s2 );
+Q_EXPORT bool operator>( const QString &s1, const char *s2 );
+Q_EXPORT bool operator>=( const QString &s1, const char *s2 );
+Q_EXPORT bool operator!=( const char *s1, const QString &s2 );
+Q_EXPORT bool operator<( const char *s1, const QString &s2 );
+Q_EXPORT bool operator<=( const char *s1, const QString &s2 );
+Q_EXPORT bool operator==( const char *s1, const QString &s2 );
+//Q_EXPORT bool operator>( const char *s1, const QString &s2 ); // MSVC++
+Q_EXPORT bool operator>=( const char *s1, const QString &s2 );
+#endif
+
+Q_EXPORT inline QString operator+( const QString &s1, const QString &s2 )
+{
+ QString tmp( s1 );
+ tmp += s2;
+ return tmp;
+}
+
+#ifndef QT_NO_CAST_ASCII
+Q_EXPORT inline QString operator+( const QString &s1, const char *s2 )
+{
+ QString tmp( s1 );
+ tmp += QString::fromLatin1(s2);
+ return tmp;
+}
+
+Q_EXPORT inline QString operator+( const char *s1, const QString &s2 )
+{
+ QString tmp = QString::fromLatin1( s1 );
+ tmp += s2;
+ return tmp;
+}
+#endif
+
+Q_EXPORT inline QString operator+( const QString &s1, QChar c2 )
+{
+ QString tmp( s1 );
+ tmp += c2;
+ return tmp;
+}
+
+Q_EXPORT inline QString operator+( const QString &s1, char c2 )
+{
+ QString tmp( s1 );
+ tmp += c2;
+ return tmp;
+}
+
+Q_EXPORT inline QString operator+( QChar c1, const QString &s2 )
+{
+ QString tmp;
+ tmp += c1;
+ tmp += s2;
+ return tmp;
+}
+
+Q_EXPORT inline QString operator+( char c1, const QString &s2 )
+{
+ QString tmp;
+ tmp += c1;
+ tmp += s2;
+ return tmp;
+}
+
+#if defined(_OS_WIN32_)
+extern Q_EXPORT QString qt_winQString(void*);
+extern Q_EXPORT const void* qt_winTchar(const QString& str, bool addnul);
+extern Q_EXPORT void* qt_winTchar_new(const QString& str);
+extern Q_EXPORT QCString qt_winQString2MB( const QString& s, int len=-1 );
+extern Q_EXPORT QString qt_winMB2QString( const char* mb, int len=-1 );
+#endif
+
+#endif // QSTRING_H
diff --git a/qtools/qstringlist.cpp b/qtools/qstringlist.cpp
new file mode 100644
index 0000000..7696340
--- /dev/null
+++ b/qtools/qstringlist.cpp
@@ -0,0 +1,307 @@
+/****************************************************************************
+**
+**
+** Implementation of QStringList
+**
+** Created : 990406
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qstringlist.h"
+
+#ifndef QT_NO_STRINGLIST
+#include "qstrlist.h"
+#include "qdatastream.h"
+#include "qtl.h"
+
+// NOT REVISED
+/*!
+ \class QStringList qstringlist.h
+ \brief A list of strings.
+
+ \ingroup qtl
+ \ingroup tools
+ \ingroup shared
+
+ QStringList is basically a QValueList of QString objects. As opposed
+ to QStrList, that stores pointers to characters, QStringList deals
+ with real QString objects. It is the class of choice whenever you
+ work with unicode strings.
+
+ Like QString itself, QStringList objects are implicit shared.
+ Passing them around as value-parameters is both fast and safe.
+
+ Example:
+ \code
+ QStringList list;
+
+ // three different ways of appending values:
+ list.append( "Torben");
+ list += "Warwick";
+ list << "Matthias" << "Arnt" << "Paul";
+
+ // sort the list, Arnt's now first
+ list.sort();
+
+ // print it out
+ for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
+ printf( "%s \n", (*it).latin1() );
+ }
+ \endcode
+
+ Convenience methods such as sort(), split(), join() and grep() make
+ working with QStringList easy.
+*/
+
+/*!
+ \fn QStringList::QStringList()
+ Creates an empty list.
+*/
+
+/*! \fn QStringList::QStringList( const QStringList& l )
+ Creates a copy of the list. This function is very fast since
+ QStringList is implicit shared. However, for the programmer this
+ is the same as a deep copy. If this list or the original one or some
+ other list referencing the same shared data is modified, then the
+ modifying list makes a copy first.
+*/
+
+/*!
+ \fn QStringList::QStringList (const QString & i)
+ Constructs a string list consisting of the single string \a i.
+ To make longer lists easily, use:
+ \code
+ QString s1,s2,s3;
+ ...
+ QStringList mylist = QStringList() << s1 << s2 << s3;
+ \endcode
+*/
+
+/*!
+ \fn QStringList::QStringList (const char* i)
+ Constructs a string list consisting of the single latin-1 string \a i.
+*/
+
+/*! \fn QStringList::QStringList( const QValueList<QString>& l )
+
+ Constructs a new string list that is a copy of \a l.
+*/
+
+/*!
+ Sorts the list of strings in ascending order.
+
+ Sorting is very fast. It uses the Qt Template Library's
+ efficient HeapSort implementation that operates in O(n*log n).
+*/
+void QStringList::sort()
+{
+ qHeapSort(*this);
+}
+
+/*!
+ Splits the string \a str using \a sep as separator. Returns the
+ list of strings. If \a allowEmptyEntries is TRUE, also empty
+ entries are inserted into the list, else not. So if you have
+ a string 'abc..d.e.', a list which contains 'abc', 'd', and 'e'
+ would be returned if \a allowEmptyEntries is FALSE, but
+ a list containing 'abc', '', 'd', 'e' and '' would be returned if
+ \a allowEmptyEntries is TRUE.
+ If \a str doesn't contain \a sep, a stringlist
+ with one item, which is the same as \a str, is returned.
+
+ \sa join()
+*/
+
+QStringList QStringList::split( const QChar &sep, const QString &str, bool allowEmptyEntries )
+{
+ return split( QString( sep ), str, allowEmptyEntries );
+}
+
+/*!
+ Splits the string \a str using \a sep as separator. Returns the
+ list of strings. If \a allowEmptyEntries is TRUE, also empty
+ entries are inserted into the list, else not. So if you have
+ a string 'abc..d.e.', a list which contains 'abc', 'd', and 'e'
+ would be returned if \a allowEmptyEntries is FALSE, but
+ a list containing 'abc', '', 'd', 'e' and '' would be returned if
+ \a allowEmptyEntries is TRUE.
+ If \a str doesn't contain \a sep, a stringlist
+ with one item, which is the same as \a str, is returned.
+
+ \sa join()
+*/
+
+QStringList QStringList::split( const QString &sep, const QString &str, bool allowEmptyEntries )
+{
+ QStringList lst;
+
+ int j = 0;
+ int i = str.find( sep, j );
+
+ while ( i != -1 ) {
+ if ( str.mid( j, i - j ).length() > 0 )
+ lst << str.mid( j, i - j );
+ else if ( allowEmptyEntries )
+ lst << QString::null;
+ j = i + sep.length();
+ i = str.find( sep, j );
+ }
+
+ int l = str.length() - 1;
+ if ( str.mid( j, l - j + 1 ).length() > 0 )
+ lst << str.mid( j, l - j + 1 );
+ else if ( allowEmptyEntries )
+ lst << QString::null;
+
+ return lst;
+}
+
+QStringList QStringList::split( const QCString &sep, const QCString &str, bool allowEmptyEntries )
+{
+ return split(QString(sep.data()),QString(str.data()),allowEmptyEntries);
+}
+
+/*!
+ Splits the string \a str using the regular expression \a sep as separator. Returns the
+ list of strings. If \a allowEmptyEntries is TRUE, also empty
+ entries are inserted into the list, else not. So if you have
+ a string 'abc..d.e.', a list which contains 'abc', 'd', and 'e'
+ would be returned if \a allowEmptyEntries is FALSE, but
+ a list containing 'abc', '', 'd', 'e' and '' would be returned if
+ \a allowEmptyEntries is TRUE.
+ If \a str doesn't contain \a sep, a stringlist
+ with one item, which is the same as \a str, is returned.
+
+ \sa join()
+*/
+
+QStringList QStringList::split( const QRegExp &sep, const QString &str, bool allowEmptyEntries )
+{
+ QStringList lst;
+
+ int j = 0;
+ int len = 0;
+ int i = sep.match( str.data(), j, &len );
+
+ while ( i != -1 ) {
+ if ( str.mid( j, i - j ).length() > 0 )
+ lst << str.mid( j, i - j );
+ else if ( allowEmptyEntries )
+ lst << QString::null;
+ j = i + len;
+ i = sep.match( str.data(), j, &len );
+ }
+
+ int l = str.length() - 1;
+ if ( str.mid( j, l - j + 1 ).length() > 0 )
+ lst << str.mid( j, l - j + 1 );
+ else if ( allowEmptyEntries )
+ lst << QString::null;
+
+ return lst;
+}
+
+/*!
+ Returns a list of all strings containing the substring \a str.
+
+ If \a cs is TRUE, the grep is done case sensitively, else not.
+*/
+
+QStringList QStringList::grep( const QString &str, bool cs ) const
+{
+ QStringList res;
+ for ( QStringList::ConstIterator it = begin(); it != end(); ++it )
+ if ( (*it).contains( str, cs ) )
+ res << *it;
+
+ return res;
+}
+
+/*!
+ Returns a list of all strings containing a substring that matches
+ the regular expression \a expr.
+*/
+
+QStringList QStringList::grep( const QRegExp &expr ) const
+{
+ QStringList res;
+ for ( QStringList::ConstIterator it = begin(); it != end(); ++it )
+ if ( (*it).contains( expr ) )
+ res << *it;
+
+ return res;
+}
+
+/*!
+ Joins the stringlist into a single string with each element
+ separated by \a sep.
+
+ \sa split()
+*/
+QString QStringList::join( const QString &sep ) const
+{
+ QString res;
+ bool alredy = FALSE;
+ for ( QStringList::ConstIterator it = begin(); it != end(); ++it ) {
+ if ( alredy )
+ res += sep;
+ alredy = TRUE;
+ res += *it;
+ }
+
+ return res;
+}
+
+#ifndef QT_NO_DATASTREAM
+Q_EXPORT QDataStream &operator>>( QDataStream & s, QStringList& l )
+{
+ return s >> (QValueList<QString>&)l;
+}
+
+Q_EXPORT QDataStream &operator<<( QDataStream & s, const QStringList& l )
+{
+ return s << (const QValueList<QString>&)l;
+}
+#endif
+
+/*!
+ Converts from a QStrList (ASCII) to a QStringList (Unicode).
+*/
+QStringList QStringList::fromStrList(const QStrList& ascii)
+{
+ QStringList res;
+ const char * s;
+ for ( QStrListIterator it(ascii); (s=it.current()); ++it )
+ res << s;
+ return res;
+}
+
+#endif //QT_NO_STRINGLIST
diff --git a/qtools/qstringlist.h b/qtools/qstringlist.h
new file mode 100644
index 0000000..3f9fbb2
--- /dev/null
+++ b/qtools/qstringlist.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+**
+** Definition of QStringList class
+**
+** Created : 990406
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QSTRINGLIST_H
+#define QSTRINGLIST_H
+
+#ifndef QT_H
+#include "qvaluelist.h"
+#include "qstring.h"
+#include "qregexp.h"
+#endif // QT_H
+
+#ifndef QT_NO_STRINGLIST
+
+class QStrList;
+
+class Q_EXPORT QStringList : public QValueList<QString>
+{
+public:
+ QStringList() { }
+ QStringList( const QStringList& l ) : QValueList<QString>(l) { }
+ QStringList( const QValueList<QString>& l ) : QValueList<QString>(l) { }
+ QStringList( const QString& i ) { append(i); }
+#ifndef QT_NO_CAST_ASCII
+ QStringList( const char* i ) { append(i); }
+#endif
+
+ static QStringList fromStrList(const QStrList&);
+
+ void sort();
+
+ static QStringList split( const QString &sep, const QString &str, bool allowEmptyEntries = FALSE );
+ static QStringList split( const QCString &sep, const QCString &str, bool allowEmptyEntries = FALSE );
+ static QStringList split( const QChar &sep, const QString &str, bool allowEmptyEntries = FALSE );
+ static QStringList split( const QRegExp &sep, const QString &str, bool allowEmptyEntries = FALSE );
+ QString join( const QString &sep ) const;
+
+ QStringList grep( const QString &str, bool cs = TRUE ) const;
+ QStringList grep( const QRegExp &expr ) const;
+};
+
+#ifndef QT_NO_DATASTREAM
+class QDataStream;
+extern Q_EXPORT QDataStream &operator>>( QDataStream &, QStringList& );
+extern Q_EXPORT QDataStream &operator<<( QDataStream &, const QStringList& );
+#endif
+#endif // QT_NO_STRINGLIST
+#endif // QSTRINGLIST_H
diff --git a/qtools/qstrlist.doc b/qtools/qstrlist.doc
new file mode 100644
index 0000000..751c6c2
--- /dev/null
+++ b/qtools/qstrlist.doc
@@ -0,0 +1,5 @@
+/****************************************************************************
+**
+*****************************************************************************/
+
+//typedef QListIterator<char> QStrListIterator;
diff --git a/qtools/qstrlist.h b/qtools/qstrlist.h
new file mode 100644
index 0000000..c6a1864
--- /dev/null
+++ b/qtools/qstrlist.h
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+**
+** Definition of QStrList, QStrIList and QStrListIterator classes
+**
+** Created : 920730
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QSTRLIST_H
+#define QSTRLIST_H
+
+#ifndef QT_H
+#include "qstring.h"
+#include "qlist.h"
+#include "qdatastream.h"
+#endif // QT_H
+
+
+#if defined(Q_TEMPLATEDLL)
+template class Q_EXPORT QList<char>;
+template class Q_EXPORT QListIterator<char>;
+#endif
+
+typedef QList<char> QStrListBase;
+typedef QListIterator<char> QStrListIterator;
+
+
+class Q_EXPORT QStrList : public QStrListBase
+{
+public:
+ QStrList( bool deepCopies=TRUE ) { dc = deepCopies; del_item = deepCopies; }
+ QStrList( const QStrList & );
+ ~QStrList() { clear(); }
+ QStrList& operator=( const QStrList & );
+
+private:
+ QCollection::Item newItem( QCollection::Item d ) { return dc ? qstrdup( (const char*)d ) : d; }
+ void deleteItem( QCollection::Item d ) { if ( del_item ) delete[] (char*)d; }
+ int compareItems( QCollection::Item s1, QCollection::Item s2 ) { return qstrcmp((const char*)s1,
+ (const char*)s2); }
+#ifndef QT_NO_DATASTREAM
+ QDataStream &read( QDataStream &s, QCollection::Item &d )
+ { s >> (char *&)d; return s; }
+ QDataStream &write( QDataStream &s, QCollection::Item d ) const
+ { return s << (const char *)d; }
+#endif
+ bool dc;
+};
+
+
+class Q_EXPORT QStrIList : public QStrList // case insensitive string list
+{
+public:
+ QStrIList( bool deepCopies=TRUE ) : QStrList( deepCopies ) {}
+ ~QStrIList() { clear(); }
+private:
+ int compareItems( QCollection::Item s1, QCollection::Item s2 )
+ { return qstricmp((const char*)s1,
+ (const char*)s2); }
+};
+
+
+inline QStrList & QStrList::operator=( const QStrList &strList )
+{
+ clear();
+ dc = strList.dc;
+ del_item = dc;
+ QStrListBase::operator=(strList);
+ return *this;
+}
+
+inline QStrList::QStrList( const QStrList &strList )
+ : QStrListBase( strList )
+{
+ dc = FALSE;
+ operator=(strList);
+}
+
+
+#endif // QSTRLIST_H
diff --git a/qtools/qstrvec.h b/qtools/qstrvec.h
new file mode 100644
index 0000000..15d3abb
--- /dev/null
+++ b/qtools/qstrvec.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+**
+** Definition of QStrVec and QStrIVec classes
+**
+** Created : 931203
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QSTRVEC_H
+#define QSTRVEC_H
+
+#ifndef QT_H
+#include "qstring.h"
+#include "qvector.h"
+#include "qdatastream.h"
+#endif // QT_H
+
+
+#if defined(Q_TEMPLATEDLL)
+template class Q_EXPORT QVector<char>
+#endif
+
+typedef QVector<char> QStrVecBase;
+
+
+class Q_EXPORT QStrVec : public QStrVecBase
+{
+public:
+ QStrVec() { dc = TRUE; }
+ QStrVec( uint size, bool deepc = TRUE ) : QStrVecBase(size) {dc=deepc;}
+ ~QStrVec() { clear(); }
+private:
+ Item newItem( Item d ) { return dc ? qstrdup( (const char*)d ) : d; }
+ void deleteItem( Item d ) { if ( dc ) delete[] (char*)d; }
+ int compareItems( Item s1, Item s2 )
+ { return qstrcmp((const char*)s1,
+ (const char*)s2); }
+#ifndef QT_NO_DATASTREAM
+ QDataStream &read( QDataStream &s, Item &d )
+ { s >> (char *&)d; return s; }
+ QDataStream &write( QDataStream &s, Item d ) const
+ { return s << (const char*)d; }
+#endif
+ bool dc;
+};
+
+
+class Q_EXPORT QStrIVec : public QStrVec // case insensitive string vec
+{
+public:
+ QStrIVec() {}
+ QStrIVec( uint size, bool dc = TRUE ) : QStrVec( size, dc ) {}
+ ~QStrIVec() { clear(); }
+private:
+ int compareItems( Item s1, Item s2 )
+ { return qstricmp((const char*)s1,
+ (const char*)s2); }
+};
+
+
+#endif // QSTRVEC_H
diff --git a/qtools/qtextcodec.cpp b/qtools/qtextcodec.cpp
new file mode 100644
index 0000000..4eb8ba5
--- /dev/null
+++ b/qtools/qtextcodec.cpp
@@ -0,0 +1,2071 @@
+/****************************************************************************
+**
+**
+** Implementation of QTextCodec class
+**
+** Created : 981015
+**
+** Copyright (C)1998-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qtextcodec.h"
+#ifndef QT_NO_TEXTCODEC
+
+#include "qlist.h"
+#ifndef QT_NO_CODECS
+#include "qutfcodec.h"
+//#include "qgbkcodec.h"
+//#include "qeucjpcodec.h"
+//#include "qjiscodec.h"
+//#include "qsjiscodec.h"
+//#include "qeuckrcodec.h"
+//#include "qbig5codec.h"
+//#include "qrtlcodec.h"
+//#include "qtsciicodec.h"
+#endif
+
+#include "qfile.h"
+#include "qstrlist.h"
+#include "qstring.h"
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <locale.h>
+
+
+static QList<QTextCodec> * all = 0;
+static bool destroying_is_ok; // starts out as 0
+
+/*! Deletes all the created codecs.
+
+ \warning Do not call this function.
+
+ QApplication calls this just before exiting, to delete any
+ QTextCodec objects that may be lying around. Since various other
+ classes hold pointers to QTextCodec objects, it is not safe to call
+ this function earlier.
+
+ If you are using the utility classes (like QString) but not using
+ QApplication, calling this function at the very end of your
+ application can be helpful to chasing down memory leaks, as
+ QTextCodec objects will not show up.
+*/
+
+void QTextCodec::deleteAllCodecs()
+{
+ if ( !all )
+ return;
+
+ destroying_is_ok = TRUE;
+ QList<QTextCodec> * ball = all;
+ all = 0;
+ ball->clear();
+ delete ball;
+ destroying_is_ok = FALSE;
+}
+
+
+static void setupBuiltinCodecs();
+
+
+static void realSetup()
+{
+#if defined(CHECK_STATE)
+ if ( destroying_is_ok )
+ qWarning( "creating new codec during codec cleanup" );
+#endif
+ all = new QList<QTextCodec>;
+ all->setAutoDelete( TRUE );
+ setupBuiltinCodecs();
+}
+
+
+static inline void setup()
+{
+ if ( !all )
+ realSetup();
+}
+
+
+class QTextStatelessEncoder: public QTextEncoder {
+ const QTextCodec* codec;
+public:
+ QTextStatelessEncoder(const QTextCodec*);
+ QCString fromUnicode(const QString& uc, int& lenInOut);
+};
+
+
+class QTextStatelessDecoder : public QTextDecoder {
+ const QTextCodec* codec;
+public:
+ QTextStatelessDecoder(const QTextCodec*);
+ QString toUnicode(const char* chars, int len);
+};
+
+QTextStatelessEncoder::QTextStatelessEncoder(const QTextCodec* c) :
+ codec(c)
+{
+}
+
+
+QCString QTextStatelessEncoder::fromUnicode(const QString& uc, int& lenInOut)
+{
+ return codec->fromUnicode(uc,lenInOut);
+}
+
+
+QTextStatelessDecoder::QTextStatelessDecoder(const QTextCodec* c) :
+ codec(c)
+{
+}
+
+
+QString QTextStatelessDecoder::toUnicode(const char* chars, int len)
+{
+ return codec->toUnicode(chars,len);
+}
+
+
+
+// NOT REVISED
+/*!
+ \class QTextCodec qtextcodec.h
+ \brief Provides conversion between text encodings.
+
+ By making objects of subclasses of QTextCodec, support for
+ new text encodings can be added to Qt.
+
+ The abstract virtual functions describe the encoder to the
+ system and the coder is used as required in the different
+ text file formats supported QTextStream and, under X11 for the
+ locale-specific character input and output (under Windows NT
+ codecs are not needed for GUI I/O since the system works
+ with Unicode already, and Windows 95/98 has built-in convertors
+ for the 8-bit local encoding).
+
+ More recently created QTextCodec objects take precedence
+ over earlier ones.
+
+ To add support for another 8-bit encoding to Qt, make a subclass
+ or QTextCodec and implement at least the following methods:
+ <dl>
+ <dt>\c const char* name() const
+ <dd>Return the official name for the encoding.
+ <dt>\c int mibEnum() const
+ <dd>Return the MIB enum for the encoding if it is listed in the
+ <a href=ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets>
+ IANA character-sets encoding file</a>.
+ </dl>
+ If the encoding is multi-byte then it will have "state"; that is,
+ the interpretation of some bytes will be dependent on some preceding
+ bytes. For such an encoding, you will need to implement
+ <dl>
+ <dt> \c QTextDecoder* makeDecoder() const
+ <dd>Return a QTextDecoder that remembers incomplete multibyte
+ sequence prefixes or other required state.
+ </dl>
+ If the encoding does \e not require state, you should implement:
+ <dl>
+ <dt> \c QString toUnicode(const char* chars, int len) const
+ <dd>Converts \e len characters from \e chars to Unicode.
+ </dl>
+ The base QTextCodec class has default implementations of the above
+ two functions, <i>but they are mutually recursive</i>, so you must
+ re-implement at least one of them, or both for improved efficiency.
+
+ For conversion from Unicode to 8-bit encodings, it is rarely necessary
+ to maintain state. However, two functions similar to the two above
+ are used for encoding:
+ <dl>
+ <dt> \c QTextEncoder* makeEncoder() const
+ <dd>Return a QTextDecoder.
+ <dt> \c QCString fromUnicode(const QString& uc, int& lenInOut ) const;
+ <dd>Converts \e lenInOut characters (of type QChar) from the start
+ of the string \a uc, returning a QCString result, and also returning
+ the \link QCString::length() length\endlink
+ of the result in lenInOut.
+ </dl>
+ Again, these are mutually recursive so only one needs to be implemented,
+ or both if better efficiency is possible.
+
+ Finally, you must implement:
+ <dl>
+ <dt> \c int heuristicContentMatch(const char* chars, int len) const
+ <dd>Gives a value indicating how likely it is that \e len characters
+ from \e chars are in the encoding.
+ </dl>
+ A good model for this function is the
+ QWindowsLocalCodec::heuristicContentMatch function found in the Qt sources.
+
+ A QTextCodec subclass might have improved performance if you also
+ re-implement:
+ <dl>
+ <dt> \c bool canEncode( QChar ) const
+ <dd>Test if a Unicode character can be encoded.
+ <dt> \c bool canEncode( const QString& ) const
+ <dd>Test if a string of Unicode characters can be encoded.
+ <dt> \c int heuristicNameMatch(const char* hint) const
+ <dd>Test if a possibly non-standard name is referring to the codec.
+ </dl>
+*/
+
+
+/*!
+ Constructs a QTextCodec, making it of highest precedence.
+ The QTextCodec should always be constructed on the heap
+ (with new), and once constructed it becomes the responsibility
+ of Qt to delete it (which is done at QApplication destruction).
+*/
+QTextCodec::QTextCodec()
+{
+ setup();
+ all->insert(0,this);
+}
+
+
+/*!
+ Destructs the QTextCodec. Note that you should not delete
+ codecs yourself - once created they become the responsibility
+ of Qt to delete.
+*/
+QTextCodec::~QTextCodec()
+{
+ if ( !destroying_is_ok )
+ qWarning("QTextCodec::~QTextCodec() called by application");
+ if ( all )
+ all->remove( this );
+}
+
+
+/*!
+ Returns a value indicating how likely this decoder is
+ for decoding some format that has the given name.
+
+ A good match returns a positive number around
+ the length of the string. A bad match is negative.
+
+ The default implementation calls simpleHeuristicNameMatch()
+ with the name of the codec.
+*/
+int QTextCodec::heuristicNameMatch(const char* hint) const
+{
+ return simpleHeuristicNameMatch(name(),hint);
+}
+
+
+// returns a string cotnaining the letters and numbers from input,
+// with a space separating run of a character class. e.g. "iso8859-1"
+// becomes "iso 8859 1"
+static QString lettersAndNumbers( const char * input )
+{
+ QString result;
+ QChar c;
+
+ while( input && *input ) {
+ c = *input;
+ if ( c.isLetter() || c.isNumber() )
+ result += c.lower();
+ if ( input[1] ) {
+ // add space at character class transition, except
+ // transition from upper-case to lower-case letter
+ QChar n( input[1] );
+ if ( c.isLetter() && n.isLetter() ) {
+ if ( c == c.lower() && n == n.upper() )
+ result += ' ';
+ } else if ( c.category() != n.category() ) {
+ result += ' ';
+ }
+ }
+ input++;
+ }
+ return result.simplifyWhiteSpace();
+}
+
+/*!
+ A simple utility function for heuristicNameMatch() - it
+ does some very minor character-skipping
+ so that almost-exact matches score high.
+*/
+int QTextCodec::simpleHeuristicNameMatch(const char* name, const char* hint)
+{
+ // if they're the same, return a perfect score.
+ if ( name && hint && qstrcmp( name, hint ) == 0 )
+ return qstrlen( hint );
+
+ // if the letters and numbers are the same, we have an "almost"
+ // perfect match.
+ QString h( lettersAndNumbers( hint ) );
+ QString n( lettersAndNumbers( name ) );
+ if ( h == n )
+ return qstrlen( hint )-1;
+
+ if ( h.stripWhiteSpace() == n.stripWhiteSpace() )
+ return qstrlen( hint )-2;
+
+ // could do some more here, but I don't think it's worth it
+
+ return 0;
+}
+
+
+/*!
+ Returns the QTextCodec \a i places from the more recently
+ inserted, or NULL if there is no such QTextCodec. Thus,
+ codecForIndex(0) returns the most recently created QTextCodec.
+*/
+QTextCodec* QTextCodec::codecForIndex(int i)
+{
+ setup();
+ return (uint)i >= all->count() ? 0 : all->at(i);
+}
+
+
+/*!
+ Returns the QTextCodec which matches the
+ \link QTextCodec::mibEnum() MIBenum\endlink \a mib.
+*/
+QTextCodec* QTextCodec::codecForMib(int mib)
+{
+ setup();
+ QListIterator<QTextCodec> i(*all);
+ QTextCodec* result;
+ for ( ; (result=i); ++i ) {
+ if ( result->mibEnum()==mib )
+ break;
+ }
+ return result;
+}
+
+
+
+
+
+#ifdef _OS_WIN32_
+class QWindowsLocalCodec: public QTextCodec
+{
+public:
+ QWindowsLocalCodec();
+ ~QWindowsLocalCodec();
+
+ QString toUnicode(const char* chars, int len) const;
+ QCString fromUnicode(const QString& uc, int& lenInOut ) const;
+
+ const char* name() const;
+ int mibEnum() const;
+
+ int heuristicContentMatch(const char* chars, int len) const;
+};
+
+QWindowsLocalCodec::QWindowsLocalCodec()
+{
+}
+
+QWindowsLocalCodec::~QWindowsLocalCodec()
+{
+}
+
+
+QString QWindowsLocalCodec::toUnicode(const char* chars, int len) const
+{
+ if ( len == 1 && chars ) { // Optimization; avoids allocation
+ char c[2];
+ c[0] = *chars;
+ c[1] = 0;
+ return qt_winMB2QString( c, 2 );
+ }
+ if ( len < 0 )
+ return qt_winMB2QString( chars );
+ QCString s(chars,len+1);
+ return qt_winMB2QString(s);
+}
+
+QCString QWindowsLocalCodec::fromUnicode(const QString& uc, int& lenInOut ) const
+{
+ QCString r = qt_winQString2MB( uc, lenInOut );
+ lenInOut = r.length();
+ return r;
+}
+
+
+const char* QWindowsLocalCodec::name() const
+{
+ return "System";
+}
+
+int QWindowsLocalCodec::mibEnum() const
+{
+ return 0;
+}
+
+
+int QWindowsLocalCodec::heuristicContentMatch(const char* chars, int len) const
+{
+ // ### Not a bad default implementation?
+ QString t = toUnicode(chars,len);
+ int l = t.length();
+ QCString mb = fromUnicode(t,l);
+ int i=0;
+ while ( i < len )
+ if ( chars[i] == mb[i] )
+ i++;
+ return i;
+}
+
+#else
+
+/* locale names mostly copied from XFree86 */
+static const char * const iso8859_2locales[] = {
+ "croatian", "cs", "cs_CS", "cs_CZ","cz", "cz_CZ", "czech", "hr",
+ "hr_HR", "hu", "hu_HU", "hungarian", "pl", "pl_PL", "polish", "ro",
+ "ro_RO", "rumanian", "serbocroatian", "sh", "sh_SP", "sh_YU", "sk",
+ "sk_SK", "sl", "sl_CS", "sl_SI", "slovak", "slovene", "sr_SP", 0 };
+
+static const char * const iso8859_3locales[] = {
+ "eo", 0 };
+
+static const char * const iso8859_4locales[] = {
+ "ee", "ee_EE", "lt", "lt_LT", "lv", "lv_LV", 0 };
+
+static const char * const iso8859_5locales[] = {
+ "bg", "bg_BG", "bulgarian", "mk", "mk_MK",
+ "sp", "sp_YU", 0 };
+
+static const char * const iso8859_6locales[] = {
+ "ar_AA", "ar_SA", "arabic", 0 };
+
+static const char * const iso8859_7locales[] = {
+ "el", "el_GR", "greek", 0 };
+
+static const char * const iso8859_8locales[] = {
+ "hebrew", "he", "he_IL", "iw", "iw_IL", 0 };
+
+static const char * const iso8859_9locales[] = {
+ "tr", "tr_TR", "turkish", 0 };
+
+static const char * const iso8859_15locales[] = {
+ "fr", "fi", "french", "finnish", "et", "et_EE", 0 };
+
+static const char * const koi8_ulocales[] = {
+ "uk", "uk_UA", "ru_UA", "ukrainian", 0 };
+
+static const char * const tis_620locales[] = {
+ "th", "th_TH", "thai", 0 };
+
+
+static bool try_locale_list( const char * const locale[], const char * lang )
+{
+ int i;
+ for( i=0; locale[i] && qstrcmp(locale[i], lang); i++ )
+ { }
+ return locale[i] != 0;
+}
+
+// For the probably_koi8_locales we have to look. the standard says
+// these are 8859-5, but almsot all Russion users uses KOI8-R and
+// incorrectly set $LANG to ru_RU. We'll check tolower() to see what
+// tolower() thinks ru_RU means.
+
+// If you read the history, it seems that many Russians blame ISO and
+// Peristroika for the confusion.
+//
+// The real bug is that some programs break if the user specifies
+// ru_RU.KOI8-R.
+
+static const char * const probably_koi8_rlocales[] = {
+ "ru", "ru_SU", "ru_RU", "russian", 0 };
+
+// this means ANY of these locale aliases. if they're aliases for
+// different locales, the code breaks.
+static QTextCodec * ru_RU_codec = 0;
+
+static QTextCodec * ru_RU_hack( const char * i ) {
+ if ( ! ru_RU_codec ) {
+ QCString origlocale = setlocale( LC_CTYPE, i );
+ // unicode koi8r latin5 name
+ // 0x044E 0xC0 0xEE CYRILLIC SMALL LETTER YU
+ // 0x042E 0xE0 0xCE CYRILLIC CAPITAL LETTER YU
+ int latin5 = tolower( 0xCE );
+ int koi8r = tolower( 0xE0 );
+ if ( koi8r == 0xC0 && latin5 != 0xEE ) {
+ ru_RU_codec = QTextCodec::codecForName( "KOI8-R" );
+ } else if ( koi8r != 0xC0 && latin5 == 0xEE ) {
+ ru_RU_codec = QTextCodec::codecForName( "ISO 8859-5" );
+ } else {
+ // something else again... let's assume... *throws dice*
+ ru_RU_codec = QTextCodec::codecForName( "KOI8-R" );
+ qWarning( "QTextCodec: using KOI8-R, probe failed (%02x %02x %s)",
+ koi8r, latin5, i );
+ }
+ setlocale( LC_CTYPE, origlocale.data() );
+ }
+ return ru_RU_codec;
+}
+
+#endif
+
+static QTextCodec * localeMapper = 0;
+
+void qt_set_locale_codec( QTextCodec *codec )
+{
+ localeMapper = codec;
+}
+
+/*! Returns a pointer to the codec most suitable for this locale. */
+
+QTextCodec* QTextCodec::codecForLocale()
+{
+ if ( localeMapper )
+ return localeMapper;
+
+ setup();
+
+#ifdef _OS_WIN32_
+ localeMapper = new QWindowsLocalCodec;
+#else
+ // Very poorly defined and followed standards causes lots of code
+ // to try to get all the cases...
+
+ char * lang = qstrdup( getenv("LANG") );
+
+ char * p = lang ? strchr( lang, '.' ) : 0;
+ if ( !p || *p != '.' ) {
+ // Some versions of setlocale return encoding, others not.
+ char *ctype = qstrdup( setlocale( LC_CTYPE, 0 ) );
+ // Some Linux distributions have broken locales which will return
+ // "C" for LC_CTYPE
+ if ( qstrcmp( ctype, "C" ) == 0 ) {
+ delete [] ctype;
+ } else {
+ if ( lang )
+ delete [] lang;
+ lang = ctype;
+ p = lang ? strchr( lang, '.' ) : 0;
+ }
+ }
+
+ if( p && *p == '.' ) {
+ // if there is an encoding and we don't know it, we return 0
+ // User knows what they are doing. Codecs will believe them.
+ localeMapper = codecForName( lang );
+ if ( !localeMapper ) {
+ // Use or codec disagree.
+ localeMapper = codecForName( p+1 );
+ }
+ }
+ if ( !localeMapper || !(p && *p == '.') ) {
+ // if there is none, we default to 8859-1
+ // We could perhaps default to 8859-15.
+ if ( try_locale_list( iso8859_2locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-2" );
+ else if ( try_locale_list( iso8859_3locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-3" );
+ else if ( try_locale_list( iso8859_4locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-4" );
+ else if ( try_locale_list( iso8859_5locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-5" );
+ else if ( try_locale_list( iso8859_6locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-6-I" );
+ else if ( try_locale_list( iso8859_7locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-7" );
+ else if ( try_locale_list( iso8859_8locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-8-I" );
+ else if ( try_locale_list( iso8859_9locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-9" );
+ else if ( try_locale_list( iso8859_15locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-15" );
+ else if ( try_locale_list( tis_620locales, lang ) )
+ localeMapper = codecForName( "ISO 8859-11" );
+ else if ( try_locale_list( koi8_ulocales, lang ) )
+ localeMapper = codecForName( "KOI8-U" );
+ else if ( try_locale_list( probably_koi8_rlocales, lang ) )
+ localeMapper = ru_RU_hack( lang );
+ else if (!lang || !(localeMapper = codecForName(lang) ))
+ localeMapper = codecForName( "ISO 8859-1" );
+ }
+ delete[] lang;
+#endif
+
+ return localeMapper;
+}
+
+
+/*!
+ Searches all installed QTextCodec objects, returning the one
+ which best matches given name. Returns NULL if no codec has
+ a match closeness above \a accuracy.
+
+ \sa heuristicNameMatch()
+*/
+QTextCodec* QTextCodec::codecForName(const char* hint, int accuracy)
+{
+ setup();
+ QListIterator<QTextCodec> i(*all);
+ QTextCodec* result = 0;
+ int best=accuracy;
+ for ( QTextCodec* cursor; (cursor=i); ++i ) {
+ int s = cursor->heuristicNameMatch(hint);
+ if ( s > best ) {
+ best = s;
+ result = cursor;
+ }
+ }
+ return result;
+}
+
+
+/*!
+ Searches all installed QTextCodec objects, returning the one
+ which most recognizes the given content. May return 0.
+
+ Note that this is often a poor choice, since character
+ encodings often use most of the available character sequences,
+ and so only by linguistic analysis could a true match be made.
+
+ \sa heuristicContentMatch()
+*/
+QTextCodec* QTextCodec::codecForContent(const char* chars, int len)
+{
+ setup();
+ QListIterator<QTextCodec> i(*all);
+ QTextCodec* result = 0;
+ int best=0;
+ for ( QTextCodec* cursor; (cursor=i); ++i ) {
+ int s = cursor->heuristicContentMatch(chars,len);
+ if ( s > best ) {
+ best = s;
+ result = cursor;
+ }
+ }
+ return result;
+}
+
+
+/*!
+ \fn const char* QTextCodec::name() const
+ Subclasses of QTextCodec must reimplement this function. It returns
+ the name of the encoding supported by the subclass. When choosing
+ a name for an encoding, consider these points:
+ <ul>
+ <li>On X11, heuristicNameMatch( const char * hint )
+ is used to test if a the QTextCodec
+ can convert between Unicode and the encoding of a font
+ with encoding \e hint, such as "iso8859-1" for Latin-1 fonts,
+ "koi8-r" for Russian KOI8 fonts.
+ The default algorithm of heuristicNameMatch() uses name().
+ <li>Some applications may use this function to present
+ encodings to the end user.
+ </ul>
+*/
+
+/*!
+ \fn int QTextCodec::mibEnum() const
+
+ Subclasses of QTextCodec must reimplement this function. It returns the
+ MIBenum (see
+ <a href="ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets">
+ the IANA character-sets encoding file</a> for more information).
+ It is important that each QTextCodec subclass return the correct unique
+ value for this function.
+*/
+
+
+/*!
+ \fn int QTextCodec::heuristicContentMatch(const char* chars, int len) const
+
+ Subclasses of QTextCodec must reimplement this function. It examines
+ the first \a len bytes of \a chars and returns a value indicating how
+ likely it is that the string is a prefix of text encoded in the
+ encoding of the subclass. Any negative return value indicates that the text
+ is detectably not in the encoding (eg. it contains undefined characters).
+ A return value of 0 indicates that the text should be decoded with this
+ codec rather than as ASCII, but there
+ is no particular evidence. The value should range up to \a len. Thus,
+ most decoders will return -1, 0, or -\a len.
+
+ The characters are not null terminated.
+
+ \sa codecForContent().
+*/
+
+
+/*!
+ Creates a QTextDecoder which stores enough state to decode chunks
+ of char* data to create chunks of Unicode data. The default implementation
+ creates a stateless decoder, which is sufficient for only the simplest
+ encodings where each byte corresponds to exactly one Unicode character.
+
+ The caller is responsible for deleting the returned object.
+*/
+QTextDecoder* QTextCodec::makeDecoder() const
+{
+ return new QTextStatelessDecoder(this);
+}
+
+
+/*!
+ Creates a QTextEncoder which stores enough state to encode chunks
+ of Unicode data as char* data. The default implementation
+ creates a stateless encoder, which is sufficient for only the simplest
+ encodings where each Unicode character corresponds to exactly one char.
+
+ The caller is responsible for deleting the returned object.
+*/
+QTextEncoder* QTextCodec::makeEncoder() const
+{
+ return new QTextStatelessEncoder(this);
+}
+
+
+/*!
+ Subclasses of QTextCodec must reimplement this function or
+ makeDecoder(). It converts the first \a len characters of \a chars
+ to Unicode.
+
+ The default implementation makes a decoder with makeDecoder() and
+ converts the input with that. Note that the default makeDecoder()
+ implementation makes a decoder that simply calls
+ this function, hence subclasses \e must reimplement one function or
+ the other to avoid infinite recursion.
+*/
+QString QTextCodec::toUnicode(const char* chars, int len) const
+{
+ QTextDecoder* i = makeDecoder();
+ QString result = i->toUnicode(chars,len);
+ delete i;
+ return result;
+}
+
+
+/*!
+ Subclasses of QTextCodec must reimplement either this function or
+ makeEncoder(). It converts the first \a lenInOut characters of \a
+ uc from Unicode to the encoding of the subclass. If \a lenInOut
+ is negative or too large, the length of \a uc is used instead.
+
+ The value returned is the property of the caller, which is
+ responsible for deleting it with "delete []". The length of the
+ resulting Unicode character sequence is returned in \a lenInOut.
+
+ The default implementation makes an encoder with makeEncoder() and
+ converts the input with that. Note that the default makeEncoder()
+ implementation makes an encoder that simply calls
+ this function, hence subclasses \e must reimplement one function or
+ the other to avoid infinite recursion.
+*/
+
+QCString QTextCodec::fromUnicode(const QString& uc, int& lenInOut) const
+{
+ QTextEncoder* i = makeEncoder();
+ QCString result = i->fromUnicode(uc, lenInOut);
+ delete i;
+ return result;
+}
+
+/*!
+ \overload QCString QTextCodec::fromUnicode(const QString& uc) const
+*/
+QCString QTextCodec::fromUnicode(const QString& uc) const
+{
+ int l = uc.length();
+ return fromUnicode(uc,l);
+}
+
+/*!
+ \overload QString QTextCodec::toUnicode(const QByteArray& a, int len) const
+*/
+QString QTextCodec::toUnicode(const QByteArray& a, int len) const
+{
+ int l = a.size();
+ if( l > 0 && a.data()[l - 1] == '\0' ) l--;
+ l = QMIN( l, len );
+ return toUnicode( a.data(), l );
+}
+
+/*!
+ \overload QString QTextCodec::toUnicode(const QByteArray& a) const
+*/
+QString QTextCodec::toUnicode(const QByteArray& a) const
+{
+ int l = a.size();
+ if( l > 0 && a.data()[l - 1] == '\0' ) l--;
+ return toUnicode( a.data(), l );
+}
+
+/*!
+ \overload QString QTextCodec::toUnicode(const char* chars) const
+*/
+QString QTextCodec::toUnicode(const char* chars) const
+{
+ return toUnicode(chars,qstrlen(chars));
+}
+
+/*!
+ Returns TRUE if the unicode character \a ch can be fully encoded
+ with this codec. The default implementation tests if the result of
+ toUnicode(fromUnicode(ch)) is the original \a ch. Subclasses may be
+ able to improve the efficiency.
+*/
+bool QTextCodec::canEncode( QChar ch ) const
+{
+ return toUnicode(fromUnicode(ch)) == ch;
+}
+
+/*!
+ Returns TRUE if the unicode string \a s can be fully encoded
+ with this codec. The default implementation tests if the result of
+ toUnicode(fromUnicode(s)) is the original \a s. Subclasses may be
+ able to improve the efficiency.
+*/
+bool QTextCodec::canEncode( const QString& s ) const
+{
+ return toUnicode(fromUnicode(s)) == s;
+}
+
+
+
+/*!
+ \class QTextEncoder qtextcodec.h
+ \brief State-based encoder
+
+ A QTextEncoder converts Unicode into another format, remembering
+ any state that is required between calls.
+
+ \sa QTextCodec::makeEncoder()
+*/
+
+/*!
+ Destructs the encoder.
+*/
+QTextEncoder::~QTextEncoder()
+{
+}
+/*!
+ \fn QCString QTextEncoder::fromUnicode(const QString& uc, int& lenInOut)
+
+ Converts \a lenInOut characters (not bytes) from \a uc, producing
+ a QCString. \a lenInOut will also be set to the
+ \link QCString::length() length\endlink of the result (in bytes).
+
+ The encoder is free to record state to use when subsequent calls are
+ made to this function (for example, it might change modes with escape
+ sequences if needed during the encoding of one string, then assume that
+ mode applies when a subsequent call begins).
+*/
+
+/*!
+ \class QTextDecoder qtextcodec.h
+ \brief State-based decoder
+
+ A QTextEncoder converts a text format into Unicode, remembering
+ any state that is required between calls.
+
+ \sa QTextCodec::makeEncoder()
+*/
+
+
+/*!
+ Destructs the decoder.
+*/
+QTextDecoder::~QTextDecoder()
+{
+}
+
+/*!
+ \fn QString QTextDecoder::toUnicode(const char* chars, int len)
+
+ Converts the first \a len bytes at \a chars to Unicode, returning the
+ result.
+
+ If not all characters are used (eg. only part of a multi-byte
+ encoding is at the end of the characters), the decoder remembers
+ enough state to continue with the next call to this function.
+*/
+
+#define CHAINED 0xffff
+
+struct QMultiByteUnicodeTable {
+ // If multibyte, ignore unicode and index into multibyte
+ // with the next character.
+ QMultiByteUnicodeTable() : unicode(0xfffd), multibyte(0) { }
+
+ ~QMultiByteUnicodeTable()
+ {
+ if ( multibyte )
+ delete [] multibyte;
+ }
+
+ ushort unicode;
+ QMultiByteUnicodeTable* multibyte;
+};
+
+#ifndef QT_NO_CODECS
+static int getByte(char* &cursor)
+{
+ int byte = 0;
+ if ( *cursor ) {
+ if ( cursor[1] == 'x' )
+ byte = strtol(cursor+2,&cursor,16);
+ else if ( cursor[1] == 'd' )
+ byte = strtol(cursor+2,&cursor,10);
+ else
+ byte = strtol(cursor+2,&cursor,8);
+ }
+ return byte&0xff;
+}
+
+class QTextCodecFromIOD;
+
+class QTextCodecFromIODDecoder : public QTextDecoder {
+ const QTextCodecFromIOD* codec;
+ QMultiByteUnicodeTable* mb;
+public:
+ QTextCodecFromIODDecoder(const QTextCodecFromIOD* c);
+ QString toUnicode(const char* chars, int len);
+};
+
+class QTextCodecFromIOD : public QTextCodec {
+ friend class QTextCodecFromIODDecoder;
+
+ QCString n;
+
+ // If from_unicode_page[row()][cell()] is 0 and from_unicode_page_multibyte,
+ // use from_unicode_page_multibyte[row()][cell()] as string.
+ char** from_unicode_page;
+ char*** from_unicode_page_multibyte;
+ char unkn;
+
+ // Only one of these is used
+ ushort* to_unicode;
+ QMultiByteUnicodeTable* to_unicode_multibyte;
+ int max_bytes_per_char;
+ QStrList aliases;
+
+ bool stateless() const { return !to_unicode_multibyte; }
+
+public:
+ QTextCodecFromIOD(QIODevice* iod)
+ {
+ from_unicode_page = 0;
+ to_unicode_multibyte = 0;
+ to_unicode = 0;
+ from_unicode_page_multibyte = 0;
+ max_bytes_per_char = 1;
+
+ const int maxlen=100;
+ char line[maxlen];
+ char esc='\\';
+ char comm='%';
+ bool incmap = FALSE;
+ while (iod->readLine(line,maxlen) > 0) {
+ if (0==qstrnicmp(line,"<code_set_name>",15))
+ n = line+15;
+ else if (0==qstrnicmp(line,"<escape_char> ",14))
+ esc = line[14];
+ else if (0==qstrnicmp(line,"<comment_char> ",15))
+ comm = line[15];
+ else if (line[0]==comm && 0==qstrnicmp(line+1," alias ",7)) {
+ aliases.append(line+8);
+ } else if (0==qstrnicmp(line,"CHARMAP",7)) {
+ if (!from_unicode_page) {
+ from_unicode_page = new char*[256];
+ for (int i=0; i<256; i++)
+ from_unicode_page[i]=0;
+ }
+ if (!to_unicode) {
+ to_unicode = new ushort[256];
+ }
+ incmap = TRUE;
+ } else if (0==qstrnicmp(line,"END CHARMAP",11))
+ break;
+ else if (incmap) {
+ char* cursor = line;
+ int byte=0,unicode=-1;
+ ushort* mb_unicode=0;
+ const int maxmb=8; // more -> we'll need to improve datastructures
+ char mb[maxmb+1];
+ int nmb=0;
+
+ while (*cursor) {
+ if (cursor[0]=='<' && cursor[1]=='U' &&
+ cursor[2]>='0' && cursor[2]<='9' &&
+ cursor[3]>='0' && cursor[3]<='9') {
+
+ unicode = strtol(cursor+2,&cursor,16);
+
+ } else if (*cursor==esc) {
+
+ byte = getByte(cursor);
+
+ if ( *cursor == esc ) {
+ if ( !to_unicode_multibyte ) {
+ to_unicode_multibyte =
+ new QMultiByteUnicodeTable[256];
+ for (int i=0; i<256; i++) {
+ to_unicode_multibyte[i].unicode =
+ to_unicode[i];
+ to_unicode_multibyte[i].multibyte = 0;
+ }
+ delete [] to_unicode;
+ to_unicode = 0;
+ }
+ QMultiByteUnicodeTable* mbut =
+ to_unicode_multibyte+byte;
+ mb[nmb++] = byte;
+ while ( nmb < maxmb && *cursor == esc ) {
+ // Always at least once
+
+ mbut->unicode = CHAINED;
+ byte = getByte(cursor);
+ mb[nmb++] = byte;
+ if (!mbut->multibyte) {
+ mbut->multibyte =
+ new QMultiByteUnicodeTable[256];
+ }
+ mbut = mbut->multibyte+byte;
+ mb_unicode = & mbut->unicode;
+ }
+
+ if ( nmb > max_bytes_per_char )
+ max_bytes_per_char = nmb;
+ }
+ } else {
+ cursor++;
+ }
+ }
+
+ if (unicode >= 0 && unicode <= 0xffff)
+ {
+ QChar ch((ushort)unicode);
+ if (!from_unicode_page[ch.row()]) {
+ from_unicode_page[ch.row()] = new char[256];
+ for (int i=0; i<256; i++)
+ from_unicode_page[ch.row()][i]=0;
+ }
+ if ( mb_unicode ) {
+ from_unicode_page[ch.row()][ch.cell()] = 0;
+ if (!from_unicode_page_multibyte) {
+ from_unicode_page_multibyte = new char**[256];
+ for (int i=0; i<256; i++)
+ from_unicode_page_multibyte[i]=0;
+ }
+ if (!from_unicode_page_multibyte[ch.row()]) {
+ from_unicode_page_multibyte[ch.row()] = new char*[256];
+ for (int i=0; i<256; i++)
+ from_unicode_page_multibyte[ch.row()][i] = 0;
+ }
+ mb[nmb++] = 0;
+ from_unicode_page_multibyte[ch.row()][ch.cell()]
+ = qstrdup(mb);
+ *mb_unicode = unicode;
+ } else {
+ from_unicode_page[ch.row()][ch.cell()] = (char)byte;
+ if ( to_unicode )
+ to_unicode[byte] = unicode;
+ else
+ to_unicode_multibyte[byte].unicode = unicode;
+ }
+ } else {
+ }
+ }
+ }
+ n = n.stripWhiteSpace();
+
+ unkn = '?'; // ##### Might be a bad choice.
+ }
+
+ ~QTextCodecFromIOD()
+ {
+ if ( from_unicode_page ) {
+ for (int i=0; i<256; i++)
+ if (from_unicode_page[i])
+ delete [] from_unicode_page[i];
+ }
+ if ( from_unicode_page_multibyte ) {
+ for (int i=0; i<256; i++)
+ if (from_unicode_page_multibyte[i])
+ for (int j=0; j<256; j++)
+ if (from_unicode_page_multibyte[i][j])
+ delete [] from_unicode_page_multibyte[i][j];
+ }
+ if ( to_unicode )
+ delete [] to_unicode;
+ if ( to_unicode_multibyte )
+ delete [] to_unicode_multibyte;
+ }
+
+ bool ok() const
+ {
+ return !!from_unicode_page;
+ }
+
+ QTextDecoder* makeDecoder() const
+ {
+ if ( stateless() )
+ return QTextCodec::makeDecoder();
+ else
+ return new QTextCodecFromIODDecoder(this);
+ }
+
+ const char* name() const
+ {
+ return n;
+ }
+
+ int mibEnum() const
+ {
+ return 0; // #### Unknown.
+ }
+
+ int heuristicContentMatch(const char*, int) const
+ {
+ return 0;
+ }
+
+ int heuristicNameMatch(const char* hint) const
+ {
+ int bestr = QTextCodec::heuristicNameMatch(hint);
+ QStrListIterator it(aliases);
+ char* a;
+ while ((a=it.current())) {
+ ++it;
+ int r = simpleHeuristicNameMatch(a,hint);
+ if (r > bestr)
+ bestr = r;
+ }
+ return bestr;
+ }
+
+ QString toUnicode(const char* chars, int len) const
+ {
+ const uchar* uchars = (const uchar*)chars;
+ QString result;
+ QMultiByteUnicodeTable* multibyte=to_unicode_multibyte;
+ if ( multibyte ) {
+ while (len--) {
+ QMultiByteUnicodeTable& mb = multibyte[*uchars];
+ if ( mb.multibyte ) {
+ // Chained multi-byte
+ multibyte = mb.multibyte;
+ } else {
+ result += QChar(mb.unicode);
+ multibyte=to_unicode_multibyte;
+ }
+ uchars++;
+ }
+ } else {
+ while (len--)
+ result += QChar(to_unicode[*uchars++]);
+ }
+ return result;
+ }
+
+ QCString fromUnicode(const QString& uc, int& lenInOut) const
+ {
+ if (lenInOut > (int)uc.length())
+ lenInOut = uc.length();
+ int rlen = lenInOut*max_bytes_per_char;
+ QCString rstr(rlen);
+ char* cursor = rstr.data();
+ char* s=0;
+ int l = lenInOut;
+ int lout = 0;
+ for (int i=0; i<l; i++) {
+ QChar ch = uc[i];
+ if ( ch == QChar::null ) {
+ // special
+ *cursor++ = 0;
+ } else if ( from_unicode_page[ch.row()] &&
+ from_unicode_page[ch.row()][ch.cell()] )
+ {
+ *cursor++ = from_unicode_page[ch.row()][ch.cell()];
+ lout++;
+ } else if ( from_unicode_page_multibyte &&
+ from_unicode_page_multibyte[ch.row()] &&
+ (s=from_unicode_page_multibyte[ch.row()][ch.cell()]) )
+ {
+ while (*s) {
+ *cursor++ = *s++;
+ lout++;
+ }
+ } else {
+ *cursor++ = unkn;
+ lout++;
+ }
+ }
+ *cursor = 0;
+ lenInOut = lout;
+ return rstr;
+ }
+};
+
+QTextCodecFromIODDecoder::QTextCodecFromIODDecoder(const QTextCodecFromIOD* c) :
+ codec(c)
+{
+ mb = codec->to_unicode_multibyte;
+}
+
+QString QTextCodecFromIODDecoder::toUnicode(const char* chars, int len)
+{
+ const uchar* uchars = (const uchar*)chars;
+ QString result;
+ while (len--) {
+ QMultiByteUnicodeTable& t = mb[*uchars];
+ if ( t.multibyte ) {
+ // Chained multi-byte
+ mb = t.multibyte;
+ } else {
+ if ( t.unicode )
+ result += QChar(t.unicode);
+ mb=codec->to_unicode_multibyte;
+ }
+ uchars++;
+ }
+ return result;
+}
+
+/*!
+ Reads a POSIX2 charmap definition from \a iod.
+ The parser recognizes the following lines:
+<pre>
+ &lt;code_set_name&gt; <i>name</i>
+ &lt;escape_char&gt; <i>character</i>
+ % alias <i>alias</i>
+ CHARMAP
+ &lt;<i>token</i>&gt; /x<i>hexbyte</i> &lt;U<i>unicode</i>&gt; ...
+ &lt;<i>token</i>&gt; /d<i>decbyte</i> &lt;U<i>unicode</i>&gt; ...
+ &lt;<i>token</i>&gt; /<i>octbyte</i> &lt;U<i>unicode</i>&gt; ...
+ &lt;<i>token</i>&gt; /<i>any</i>/<i>any</i>... &lt;U<i>unicode</i>&gt; ...
+ END CHARMAP
+</pre>
+
+ The resulting QTextCodec is returned (and also added to the
+ global list of codecs). The name() of the result is taken
+ from the code_set_name.
+
+ Note that a codec constructed in this way uses much more memory
+ and is slower than a hand-written QTextCodec subclass, since
+ tables in code are in memory shared by all applications simultaneously
+ using Qt.
+
+ \sa loadCharmapFile()
+*/
+QTextCodec* QTextCodec::loadCharmap(QIODevice* iod)
+{
+ QTextCodecFromIOD* r = new QTextCodecFromIOD(iod);
+ if ( !r->ok() ) {
+ delete r;
+ r = 0;
+ }
+ return r;
+}
+
+/*!
+ A convenience function for loadCharmap().
+*/
+QTextCodec* QTextCodec::loadCharmapFile(QString filename)
+{
+ QFile f(filename);
+ if (f.open(IO_ReadOnly)) {
+ QTextCodecFromIOD* r = new QTextCodecFromIOD(&f);
+ if ( !r->ok() )
+ delete r;
+ else
+ return r;
+ }
+ return 0;
+}
+#endif //QT_NO_CODECS
+
+
+/*!
+ Returns a string representing the current language.
+*/
+
+const char* QTextCodec::locale()
+{
+ static QCString lang;
+ if ( lang.isEmpty() ) {
+ lang = getenv( "LANG" ); //########Windows??
+ if ( lang.isEmpty() )
+ lang = "C";
+ }
+ return lang;
+}
+
+
+
+#ifndef QT_NO_CODECS
+
+class QSimpleTextCodec: public QTextCodec
+{
+public:
+ QSimpleTextCodec( int );
+ ~QSimpleTextCodec();
+
+ QString toUnicode(const char* chars, int len) const;
+ QCString fromUnicode(const QString& uc, int& lenInOut ) const;
+
+ const char* name() const;
+ int mibEnum() const;
+
+ int heuristicContentMatch(const char* chars, int len) const;
+
+ int heuristicNameMatch(const char* hint) const;
+
+private:
+ int forwardIndex;
+};
+
+
+#define LAST_MIB 2259
+
+static struct {
+ const char * cs;
+ int mib;
+ Q_UINT16 values[128];
+} unicodevalues[] = {
+ // from RFC 1489, ftp://ftp.isi.edu/in-notes/rfc1489.txt
+ { "KOI8-R", 2084,
+ { 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
+ 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
+ 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219/**/, 0x221A, 0x2248,
+ 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
+ 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
+ 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E,
+ 0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
+ 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9,
+ 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+ 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
+ 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+ 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
+ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+ 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
+ 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+ 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A } },
+ // /**/ - The BULLET OPERATOR is confused. Some people think
+ // it should be 0x2022 (BULLET).
+
+ // from RFC 2319, ftp://ftp.isi.edu/in-notes/rfc2319.txt
+ { "KOI8-U", 2088,
+ { 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
+ 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
+ 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,
+ 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
+ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457,
+ 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x255D, 0x255E,
+ 0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407,
+ 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x256C, 0x00A9,
+ 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+ 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
+ 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+ 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
+ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+ 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
+ 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+ 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A } },
+
+ // next bits generated from tables on the Unicode 2.0 CD. we can
+ // use these tables since this is part of the transition to using
+ // unicode everywhere in qt.
+
+ // $ for A in 8 9 A B C D E F ; do for B in 0 1 2 3 4 5 6 7 8 9 A B C D E F ; do echo 0x${A}${B} 0xFFFD ; done ; done > /tmp/digits ; for a in 8859-* ; do ( awk '/^0x[89ABCDEF]/{ print $1, $2 }' < $a ; cat /tmp/digits ) | sort | uniq -w4 | cut -c6- | paste '-d ' - - - - - - - - | sed -e 's/ /, /g' -e 's/$/,/' -e '$ s/,$/} },/' -e '1 s/^/{ /' > ~/tmp/$a ; done
+
+ // then I inserted the files manually.
+ { "ISO 8859-2", 5,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7,
+ 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
+ 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7,
+ 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
+ 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
+ 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9} },
+ { "ISO 8859-3", 6,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0xFFFD, 0x0124, 0x00A7,
+ 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0xFFFD, 0x017B,
+ 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7,
+ 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0xFFFD, 0x017C,
+ 0x00C0, 0x00C1, 0x00C2, 0xFFFD, 0x00C4, 0x010A, 0x0108, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0xFFFD, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7,
+ 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0xFFFD, 0x00E4, 0x010B, 0x0109, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0xFFFD, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7,
+ 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9} },
+ { "ISO 8859-4", 7,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7,
+ 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
+ 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7,
+ 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
+ 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+ 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
+ 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9} },
+ { "ISO 8859-5", 8,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
+ 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
+ 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F} },
+ { "ISO 8859-6-I", 82,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0xFFFD, 0xFFFD, 0xFFFD, 0x00A4, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x060C, 0x00AD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0x061B, 0xFFFD, 0xFFFD, 0xFFFD, 0x061F,
+ 0xFFFD, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
+ 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
+ 0x0638, 0x0639, 0x063A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
+ 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
+ 0x0650, 0x0651, 0x0652, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
+ { "ISO 8859-7", 10,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x2018, 0x2019, 0x00A3, 0xFFFD, 0xFFFD, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0xFFFD, 0x00AB, 0x00AC, 0x00AD, 0xFFFD, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7,
+ 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0xFFFD, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+ 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
+ 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0xFFFD} },
+ { "ISO 8859-8-I", 85,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0xFFFD, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x203E,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2017,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
+ 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
+ 0x05E8, 0x05E9, 0x05EA, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
+ { "ISO 8859-9", 12,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF} },
+ { "ISO 8859-10", 13,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7,
+ 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
+ 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7,
+ 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168,
+ 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169,
+ 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138} },
+ { "ISO 8859-13", 109,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7,
+ 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7,
+ 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
+ 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
+ 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
+ 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
+ 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019} },
+ { "ISO 8859-14", 110,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7,
+ 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
+ 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56,
+ 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF} },
+ { "ISO 8859-15", 111,
+ { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7,
+ 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7,
+ 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF} },
+
+ // next bits generated again from tables on the Unicode 3.0 CD.
+
+ // $ for a in CP* ; do ( awk '/^0x[89ABCDEF]/{ print $1, $2 }' < $a ) | sort | sed -e 's/#UNDEF.*$/0xFFFD/' | cut -c6- | paste '-d ' - - - - - - - - | sed -e 's/ /, /g' -e 's/$/,/' -e '$ s/,$/} },/' -e '1 s/^/{ /' > ~/tmp/$a ; done
+
+ { "CP 874", 0, //### what is the mib?
+ { 0x20AC, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2026, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
+ 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
+ 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
+ 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
+ 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
+ 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
+ 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
+ 0x0E38, 0x0E39, 0x0E3A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0E3F,
+ 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
+ 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
+ 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
+ 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
+ { "CP 1250", 2250,
+ { 0x20AC, 0xFFFD, 0x201A, 0xFFFD, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0xFFFD, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
+ 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0xFFFD, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
+ 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
+ 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
+ 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
+ 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9} },
+ { "CP 1251", 2251,
+ { 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
+ 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0xFFFD, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
+ 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
+ 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
+ 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
+ 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F} },
+ { "CP 1252", 2252,
+ { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFD, 0x017D, 0xFFFD,
+ 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0xFFFD, 0x017E, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF} },
+ { "CP 1253", 2253,
+ { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0xFFFD, 0x2030, 0xFFFD, 0x2039, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0xFFFD, 0x2122, 0xFFFD, 0x203A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0xFFFD, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,
+ 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0xFFFD, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+ 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
+ 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0xFFFD} },
+ { "CP 1254", 2254,
+ { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0xFFFD, 0xFFFD, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF} },
+ { "CP 1255", 2255,
+ { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0xFFFD, 0x2039, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x02DC, 0x2122, 0xFFFD, 0x203A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,
+ 0x05B8, 0x05B9, 0xFFFD, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
+ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,
+ 0x05F4, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
+ 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
+ 0x05E8, 0x05E9, 0x05EA, 0xFFFD, 0xFFFD, 0x200E, 0x200F, 0xFFFD} },
+ { "CP 1256", 2256,
+ { 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
+ 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
+ 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
+ 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
+ 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
+ 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
+ 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
+ 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
+ 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2} },
+ { "CP 1257", 2257,
+ { 0x20AC, 0xFFFD, 0x201A, 0xFFFD, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0xFFFD, 0x2030, 0xFFFD, 0x2039, 0xFFFD, 0x00A8, 0x02C7, 0x00B8,
+ 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0xFFFD, 0x2122, 0xFFFD, 0x203A, 0xFFFD, 0x00AF, 0x02DB, 0xFFFD,
+ 0x00A0, 0xFFFD, 0x00A2, 0x00A3, 0x00A4, 0xFFFD, 0x00A6, 0x00A7,
+ 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
+ 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
+ 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
+ 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
+ 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9} },
+ { "CP 1258", 2258,
+ { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0xFFFD, 0x2039, 0x0152, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x02DC, 0x2122, 0xFFFD, 0x203A, 0x0153, 0xFFFD, 0xFFFD, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF,
+ 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF,
+ 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF} },
+
+ // this one is generated from the charmap file located in /usr/share/i18n/charmaps
+ // on most Linux distributions. The thai character set tis620 is byte by byte equivalent
+ // to iso8859-11, so we name it 8859-11 here, but recognise the name tis620 too.
+
+ // $ for A in 8 9 A B C D E F ; do for B in 0 1 2 3 4 5 6 7 8 9 A B C D E F ; do echo x${A}${B} 0xFFFD ; done ; done > /tmp/digits ; ( cut -c25- < TIS-620 ; cat /tmp/digits ) | awk '/^x[89ABCDEF]/{ print $1, $2 }' | sed -e 's/<U/0x/' -e 's/>//' | sort | uniq -w4 | cut -c5- | paste '-d ' - - - - - - - - | sed -e 's/ /, /g' -e 's/$/,/' -e '$ s/,$/} },/' -e '1 s/^/{ /' > ~/tmp/tis-620
+ { "ISO 8859-11", 2259, // Thai character set mib enum taken from tis620 (which is byte by byte equivalent)
+ { 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
+ 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
+ 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
+ 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
+ 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
+ 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
+ 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
+ 0x0E38, 0x0E39, 0x0E3A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0E3F,
+ 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
+ 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
+ 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
+ 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
+
+ // change LAST_MIB if you add more, and edit unicodevalues in
+ // kernel/qpsprinter.cpp too.
+};
+
+
+static const QSimpleTextCodec * reverseOwner = 0;
+static QArray<char> * reverseMap = 0;
+
+
+QSimpleTextCodec::QSimpleTextCodec( int i )
+ : QTextCodec(), forwardIndex( i )
+{
+}
+
+
+QSimpleTextCodec::~QSimpleTextCodec()
+{
+ if ( reverseOwner == this ) {
+ delete reverseMap;
+ reverseMap = 0;
+ reverseOwner = 0;
+ }
+}
+
+// what happens if strlen(chars)<len? what happens if !chars? if len<1?
+QString QSimpleTextCodec::toUnicode(const char* chars, int len) const
+{
+ if(len <= 0)
+ return QString::null;
+
+ int clen = qstrlen(chars);
+ len = QMIN(len, clen); // Note: NUL ends string
+
+ QString r;
+ r.setUnicode(0, len);
+ QChar* uc = (QChar*)r.unicode(); // const_cast
+ const unsigned char * c = (const unsigned char *)chars;
+ for( int i=0; i<len; i++ ) {
+ if ( c[i] > 127 )
+ uc[i] = unicodevalues[forwardIndex].values[c[i]-128];
+ else
+ uc[i] = c[i];
+ }
+ return r;
+}
+
+
+QCString QSimpleTextCodec::fromUnicode(const QString& uc, int& len ) const
+{
+ if ( reverseOwner != this ) {
+ int m = 0;
+ int i = 0;
+ while( i < 128 ) {
+ if ( unicodevalues[forwardIndex].values[i] > m &&
+ unicodevalues[forwardIndex].values[i] < 0xfffd )
+ m = unicodevalues[forwardIndex].values[i];
+ i++;
+ }
+ m++;
+ if ( !reverseMap )
+ reverseMap = new QArray<char>( m );
+ if ( m > (int)(reverseMap->size()) )
+ reverseMap->resize( m );
+ for( i = 0; i < 128 && i < m; i++ )
+ (*reverseMap)[i] = (char)i;
+ for( ;i < m; i++ )
+ (*reverseMap)[i] = '?';
+ for( i=128; i<256; i++ ) {
+ int u = unicodevalues[forwardIndex].values[i-128];
+ if ( u < m )
+ (*reverseMap)[u] = (char)(unsigned char)(i);
+ }
+ reverseOwner = this;
+ }
+ if ( len <0 || len > (int)uc.length() )
+ len = uc.length();
+ QCString r( len+1 );
+ int i = len;
+ int u;
+ const QChar* ucp = uc.unicode();
+ char* rp = r.data();
+ char* rmp = reverseMap->data();
+ int rmsize = (int) reverseMap->size();
+ while( i-- )
+ {
+ u = ucp->unicode();
+ *rp++ = u < 128 ? u : (( u < rmsize ) ? (*(rmp+u)) : '?' );
+ ucp++;
+ }
+ r[len] = 0;
+ return r;
+}
+
+
+const char* QSimpleTextCodec::name() const
+{
+ return unicodevalues[forwardIndex].cs;
+}
+
+
+int QSimpleTextCodec::mibEnum() const
+{
+ return unicodevalues[forwardIndex].mib;
+}
+
+int QSimpleTextCodec::heuristicNameMatch(const char* hint) const
+{
+ if ( hint[0]=='k' ) {
+ // Help people with messy fonts
+ if ( QCString(hint) == "koi8-1" )
+ return QTextCodec::heuristicNameMatch("koi8-r")-1;
+ if ( QCString(hint) == "koi8-ru" )
+ return QTextCodec::heuristicNameMatch("koi8-r")-1;
+ } else if ( hint[0] == 't' && QCString(name()) == "ISO 8859-11" ) {
+ // 8859-11 and tis620 are byte by bute equivalent
+ int i = simpleHeuristicNameMatch("tis620-0", hint);
+ if( !i )
+ i = simpleHeuristicNameMatch("tis-620", hint);
+ if( i ) return i;
+ }
+ return QTextCodec::heuristicNameMatch(hint);
+}
+
+int QSimpleTextCodec::heuristicContentMatch(const char* chars, int len) const
+{
+ if ( len<1 || !chars )
+ return -1;
+ int i = 0;
+ const uchar * c = (const unsigned char *)chars;
+ int r = 0;
+ while( i<len && c && *c ) {
+ if ( *c >= 128 ) {
+ if ( unicodevalues[forwardIndex].values[(*c)-128] == 0xfffd )
+ return -1;
+ }
+ if ( (*c >= ' ' && *c < 127) ||
+ *c == '\n' || *c == '\t' || *c == '\r' )
+ r++;
+ i++;
+ c++;
+ }
+ if ( mibEnum()==4 )
+ r+=1;
+ return r;
+}
+
+
+#endif // QT_NO_CODECS
+
+class QLatin1Codec: public QTextCodec
+{
+public:
+ QLatin1Codec();
+ ~QLatin1Codec();
+
+ QString toUnicode(const char* chars, int len) const;
+ QCString fromUnicode(const QString& uc, int& lenInOut ) const;
+
+ const char* name() const;
+ int mibEnum() const;
+
+ int heuristicContentMatch(const char* chars, int len) const;
+
+ int heuristicNameMatch(const char* hint) const;
+
+private:
+ int forwardIndex;
+};
+
+
+QLatin1Codec::QLatin1Codec()
+ : QTextCodec()
+{
+}
+
+
+QLatin1Codec::~QLatin1Codec()
+{
+}
+
+// what happens if strlen(chars)<len? what happens if !chars? if len<1?
+QString QLatin1Codec::toUnicode(const char* chars, int len) const
+{
+ if(len <= 0)
+ return QString::null;
+
+ return QString::fromLatin1(chars, len);
+}
+
+
+QCString QLatin1Codec::fromUnicode(const QString& uc, int& len ) const
+{
+ if ( len <0 || len > (int)uc.length() )
+ len = uc.length();
+ QCString r( len+1 );
+ int i = 0;
+ const QChar *ch = uc.unicode();
+ while ( i < len ) {
+ r[i] = ch->row() ? '?' : ch->cell();
+ i++;
+ ch++;
+ }
+ r[len] = 0;
+ return r;
+}
+
+
+const char* QLatin1Codec::name() const
+{
+ return "ISO 8859-1";
+}
+
+
+int QLatin1Codec::mibEnum() const
+{
+ return 4;
+}
+
+int QLatin1Codec::heuristicNameMatch(const char* hint) const
+{
+ return QTextCodec::heuristicNameMatch(hint);
+}
+
+int QLatin1Codec::heuristicContentMatch(const char* chars, int len) const
+{
+ if ( len<1 || !chars )
+ return -1;
+ int i = 0;
+ const uchar * c = (const unsigned char *)chars;
+ int r = 0;
+ while( i<len && c && *c ) {
+ if ( *c >= 0x80 && *c < 0xa0 )
+ return -1;
+ if ( (*c >= ' ' && *c < 127) ||
+ *c == '\n' || *c == '\t' || *c == '\r' )
+ r++;
+ i++;
+ c++;
+ }
+ return r;
+}
+
+
+static void setupBuiltinCodecs()
+{
+ (void)new QLatin1Codec;
+
+#ifndef QT_NO_CODECS
+ int i = 0;
+ do {
+ (void)new QSimpleTextCodec( i );
+ } while( unicodevalues[i++].mib != LAST_MIB );
+
+ //(void)new QEucJpCodec;
+ //(void)new QSjisCodec;
+ //(void)new QJisCodec;
+ //(void)new QEucKrCodec;
+ //(void)new QGbkCodec;
+ //(void)new QBig5Codec;
+ (void)new QUtf8Codec;
+ (void)new QUtf16Codec;
+ //(void)new QHebrewCodec;
+ //(void)new QArabicCodec;
+ //(void)new QTsciiCodec;
+#endif // QT_NO_CODECS
+}
+
+#endif // QT_NO_TEXTCODEC
diff --git a/qtools/qtextcodec.h b/qtools/qtextcodec.h
new file mode 100644
index 0000000..18ece20
--- /dev/null
+++ b/qtools/qtextcodec.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+**
+** Definition of QTextCodec class
+**
+** Created : 981015
+**
+** Copyright (C) 1998-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QTEXTCODEC_H
+#define QTEXTCODEC_H
+
+#ifndef QT_H
+#include "qstring.h"
+#endif // QT_H
+
+#ifndef QT_NO_TEXTCODEC
+
+class QTextCodec;
+class QIODevice;
+
+class Q_EXPORT QTextEncoder {
+public:
+ virtual ~QTextEncoder();
+ virtual QCString fromUnicode(const QString& uc, int& lenInOut) = 0;
+};
+
+class Q_EXPORT QTextDecoder {
+public:
+ virtual ~QTextDecoder();
+ virtual QString toUnicode(const char* chars, int len) = 0;
+};
+
+class Q_EXPORT QTextCodec {
+public:
+ virtual ~QTextCodec();
+
+#ifndef QT_NO_CODECS
+ static QTextCodec* loadCharmap(QIODevice*);
+ static QTextCodec* loadCharmapFile(QString filename);
+#endif
+ static QTextCodec* codecForMib(int mib);
+ static QTextCodec* codecForName(const char* hint, int accuracy=0);
+ static QTextCodec* codecForContent(const char* chars, int len);
+ static QTextCodec* codecForIndex(int i);
+ static QTextCodec* codecForLocale();
+
+ static void deleteAllCodecs();
+
+ static const char* locale();
+
+ virtual const char* name() const = 0;
+ virtual int mibEnum() const = 0;
+
+ virtual QTextDecoder* makeDecoder() const;
+ virtual QTextEncoder* makeEncoder() const;
+
+ virtual QString toUnicode(const char* chars, int len) const;
+ virtual QCString fromUnicode(const QString& uc, int& lenInOut) const;
+
+ QCString fromUnicode(const QString& uc) const;
+ QString toUnicode(const QByteArray&, int len) const;
+ QString toUnicode(const QByteArray&) const;
+ QString toUnicode(const char* chars) const;
+ virtual bool canEncode( QChar ) const;
+ virtual bool canEncode( const QString& ) const;
+
+ virtual int heuristicContentMatch(const char* chars, int len) const = 0;
+ virtual int heuristicNameMatch(const char* hint) const;
+
+protected:
+ QTextCodec();
+ static int simpleHeuristicNameMatch(const char* name, const char* hint);
+};
+#endif // QT_NO_TEXTCODEC
+#endif // QTEXTCODEC_H
diff --git a/qtools/qtextstream.cpp b/qtools/qtextstream.cpp
new file mode 100644
index 0000000..b12f86d
--- /dev/null
+++ b/qtools/qtextstream.cpp
@@ -0,0 +1,2237 @@
+/****************************************************************************
+**
+**
+** Implementation of QTextStream class
+**
+** Created : 940922
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qtextstream.h"
+
+#ifndef QT_NO_TEXTSTREAM
+#include "qtextcodec.h"
+#include "qregexp.h"
+#include "qbuffer.h"
+#include "qfile.h"
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#if defined(_OS_WIN32_)
+#include <windows.h>
+#endif
+
+// NOT REVISED
+/*!
+ \class QTextStream qtextstream.h
+
+ \brief The QTextStream class provides basic functions for reading and
+ writing text using a QIODevice.
+
+ \ingroup io
+
+ \define endl
+ \define bin
+ \define oct
+ \define dec
+ \define hex
+ \define flush
+ \define ws
+
+ The text stream class has a functional interface that is very
+ similar to that of the standard C++ iostream class. The difference
+ between iostream and QTextStream is that our stream operates on a
+ QIODevice, which is easily subclassed, while iostream operates on
+ FILE * pointers, which can not be subclassed.
+
+ Qt provides several global functions similar to the ones in iostream:
+ <ul>
+ <li> \c bin sets the QTextStream to read/write binary numbers
+ <li> \c oct sets the QTextStream to read/write octal numbers
+ <li> \c dec sets the QTextStream to read/write decimal numbers
+ <li> \c hex sets the QTextStream to read/write hexadecimal numbers
+ <li> \c endl forces a line break
+ <li> \c flush forces the QIODevice to flush any buffered data
+ <li> \c ws eats any available white space (on input)
+ <li> \c reset resets the QTextStream to its default mode (see reset()).
+ </ul>
+
+ \warning By default, QTextStream will automatically detect whether
+ integers in the stream are in decimal, octal, hexadecimal or binary
+ format when reading from the stream. In particular, a leading '0'
+ signifies octal, ie. the sequence "0100" will be interpreted as
+ 64.
+
+ The QTextStream class reads and writes text and it is not
+ appropriate for dealing with binary data (but QDataStream is).
+
+ By default output of Unicode text (ie. QString) is done using the
+ local 8-bit encoding. This can be changed using the setEncoding()
+ method. For input, the QTextStream will auto-detect standard
+ Unicode "byte order marked" text files, but otherwise the local
+ 8-bit encoding is used.
+
+ \sa QDataStream
+*/
+
+/*
+ \class QTSManip qtextstream.h
+
+ \brief The QTSManip class is an internal helper class for the
+ QTextStream.
+
+ It is generally a very bad idea to use this class directly in
+ application programs.
+
+ \internal
+
+ This class makes it possible to give the QTextStream function objects
+ with arguments, like this:
+ \code
+ QTextStream cout( stdout, IO_WriteOnly );
+ cout << setprecision( 8 ); // QTSManip used here!
+ cout << 3.14159265358979323846;
+ \endcode
+
+ The setprecision() function returns a QTSManip object.
+ The QTSManip object contains a pointer to a member function in
+ QTextStream and an integer argument.
+ When serializing a QTSManip into a QTextStream, the function
+ is executed with the argument.
+*/
+
+/*! \fn QTSManip::QTSManip (QTSMFI m, int a)
+
+ Constructs a QTSManip object which will call \a m (a member function
+ in QTextStream which accepts a single int) with argument \a a when
+ QTSManip::exec() is called. Used internally in e.g. endl:
+
+ \code
+ s << "some text" << endl << "more text";
+ \endcode
+*/
+
+/*! \fn void QTSManip::exec (QTextStream& s)
+
+ Calls the member function specified in the constructor, for object
+ \a s. Used internally in e.g. endl:
+
+ \code
+ s << "some text" << endl << "more text";
+ \endcode
+*/
+
+
+/*****************************************************************************
+ QTextStream member functions
+ *****************************************************************************/
+
+#if defined(CHECK_STATE)
+#undef CHECK_STREAM_PRECOND
+#define CHECK_STREAM_PRECOND if ( !dev ) { \
+ qWarning( "QTextStream: No device" ); \
+ return *this; }
+#else
+#define CHECK_STREAM_PRECOND
+#endif
+
+
+#define I_SHORT 0x0010
+#define I_INT 0x0020
+#define I_LONG 0x0030
+#define I_TYPE_MASK 0x00f0
+
+#define I_BASE_2 QTS::bin
+#define I_BASE_8 QTS::oct
+#define I_BASE_10 QTS::dec
+#define I_BASE_16 QTS::hex
+#define I_BASE_MASK (QTS::bin | QTS::oct | QTS::dec | QTS::hex)
+
+#define I_SIGNED 0x0100
+#define I_UNSIGNED 0x0200
+#define I_SIGN_MASK 0x0f00
+
+
+static const QChar QEOF = QChar((ushort)0xffff); //guaranteed not to be a character.
+
+const int QTextStream::basefield = I_BASE_MASK;
+const int QTextStream::adjustfield = ( QTextStream::left |
+ QTextStream::right |
+ QTextStream::internal );
+const int QTextStream::floatfield = ( QTextStream::scientific |
+ QTextStream::fixed );
+
+
+class QTextStreamPrivate {
+public:
+#ifndef QT_NO_TEXTCODEC
+ QTextStreamPrivate() : decoder( 0 ), sourceType( NotSet ) {}
+ ~QTextStreamPrivate() { delete decoder; }
+ QTextDecoder *decoder; //???
+#else
+ QTextStreamPrivate() : sourceType( NotSet ) {}
+ ~QTextStreamPrivate() { }
+#endif
+ QString ungetcBuf;
+
+ enum SourceType { NotSet, IODevice, String, ByteArray, File };
+ SourceType sourceType;
+};
+
+
+// skips whitespace and returns the first non-whitespace character
+QChar QTextStream::eat_ws()
+{
+ QChar c;
+ do { c = ts_getc(); } while ( c != QEOF && ts_isspace(c) );
+ return c;
+}
+
+void QTextStream::init()
+{
+ // ### ungetcBuf = QEOF;
+ dev = 0; // no device set
+ fstrm = owndev = FALSE;
+ mapper = 0;
+ d = new QTextStreamPrivate;
+ doUnicodeHeader = TRUE; //default to autodetect
+ latin1 = TRUE; // ### should use local?
+ internalOrder = QChar::networkOrdered(); //default to network order
+}
+
+/*!
+ Constructs a data stream that has no IO device.
+*/
+
+QTextStream::QTextStream()
+{
+ init();
+ setEncoding( Locale ); //###
+ reset();
+ d->sourceType = QTextStreamPrivate::NotSet;
+}
+
+/*!
+ Constructs a text stream that uses the IO device \a iod.
+*/
+
+QTextStream::QTextStream( QIODevice *iod )
+{
+ init();
+ setEncoding( Locale ); //###
+ dev = iod; // set device
+ reset();
+ d->sourceType = QTextStreamPrivate::IODevice;
+}
+
+// TODO: use special-case handling of this case in QTextStream, and
+// simplify this class to only deal with QChar or QString data.
+class QStringBuffer : public QIODevice {
+public:
+ QStringBuffer( QString* str );
+ ~QStringBuffer();
+ bool open( int m );
+ void close();
+ void flush();
+ uint size() const;
+ int at() const;
+ bool at( int pos );
+ int readBlock( char *p, uint len );
+ int writeBlock( const char *p, uint len );
+ int getch();
+ int putch( int ch );
+ int ungetch( int ch );
+protected:
+ QString* s;
+
+private: // Disabled copy constructor and operator=
+ QStringBuffer( const QStringBuffer & );
+ QStringBuffer &operator=( const QStringBuffer & );
+};
+
+
+QStringBuffer::QStringBuffer( QString* str )
+{
+ s = str;
+}
+
+QStringBuffer::~QStringBuffer()
+{
+}
+
+
+bool QStringBuffer::open( int m )
+{
+ if ( !s ) {
+#if defined(CHECK_STATE)
+ qWarning( "QStringBuffer::open: No string" );
+#endif
+ return FALSE;
+ }
+ if ( isOpen() ) { // buffer already open
+#if defined(CHECK_STATE)
+ qWarning( "QStringBuffer::open: Buffer already open" );
+#endif
+ return FALSE;
+ }
+ setMode( m );
+ if ( m & IO_Truncate ) { // truncate buffer
+ s->truncate( 0 );
+ }
+ if ( m & IO_Append ) { // append to end of buffer
+ ioIndex = s->length()*sizeof(QChar);
+ } else {
+ ioIndex = 0;
+ }
+ setState( IO_Open );
+ setStatus( 0 );
+ return TRUE;
+}
+
+void QStringBuffer::close()
+{
+ if ( isOpen() ) {
+ setFlags( IO_Direct );
+ ioIndex = 0;
+ }
+}
+
+void QStringBuffer::flush()
+{
+}
+
+uint QStringBuffer::size() const
+{
+ return s ? s->length()*sizeof(QChar) : 0;
+}
+
+int QStringBuffer::at() const
+{
+ return ioIndex;
+}
+
+bool QStringBuffer::at( int pos )
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) {
+ qWarning( "QStringBuffer::at: Buffer is not open" );
+ return FALSE;
+ }
+#endif
+ if ( (uint)pos >= s->length()*2 ) {
+#if defined(CHECK_RANGE)
+ qWarning( "QStringBuffer::at: Index %d out of range", pos );
+#endif
+ return FALSE;
+ }
+ ioIndex = pos;
+ return TRUE;
+}
+
+
+int QStringBuffer::readBlock( char *p, uint len )
+{
+#if defined(CHECK_STATE)
+ CHECK_PTR( p );
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QStringBuffer::readBlock: Buffer not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QStringBuffer::readBlock: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ if ( (uint)ioIndex + len > s->length()*sizeof(QChar) ) {
+ // overflow
+ if ( (uint)ioIndex >= s->length()*sizeof(QChar) ) {
+ setStatus( IO_ReadError );
+ return -1;
+ } else {
+ len = s->length()*2 - (uint)ioIndex;
+ }
+ }
+ memcpy( p, ((const char*)(s->unicode()))+ioIndex, len );
+ ioIndex += len;
+ return len;
+}
+
+int QStringBuffer::writeBlock( const char *p, uint len )
+{
+#if defined(CHECK_NULL)
+ if ( p == 0 && len != 0 )
+ qWarning( "QStringBuffer::writeBlock: Null pointer error" );
+#endif
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QStringBuffer::writeBlock: Buffer not open" );
+ return -1;
+ }
+ if ( !isWritable() ) { // writing not permitted
+ qWarning( "QStringBuffer::writeBlock: Write operation not permitted" );
+ return -1;
+ }
+ if ( ioIndex&1 ) {
+ qWarning( "QStringBuffer::writeBlock: non-even index - non Unicode" );
+ return -1;
+ }
+ if ( len&1 ) {
+ qWarning( "QStringBuffer::writeBlock: non-even length - non Unicode" );
+ return -1;
+ }
+#endif
+ s->replace(ioIndex/2, len/2, (QChar*)p, len/2);
+ ioIndex += len;
+ return len;
+}
+
+int QStringBuffer::getch()
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QStringBuffer::getch: Buffer not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QStringBuffer::getch: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ if ( (uint)ioIndex >= s->length()*2 ) { // overflow
+ setStatus( IO_ReadError );
+ return -1;
+ }
+ return *((char*)s->unicode() + ioIndex++);
+}
+
+int QStringBuffer::putch( int ch )
+{
+ char c = ch;
+ if ( writeBlock(&c,1) < 0 )
+ return -1;
+ else
+ return ch;
+}
+
+int QStringBuffer::ungetch( int ch )
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() ) { // buffer not open
+ qWarning( "QStringBuffer::ungetch: Buffer not open" );
+ return -1;
+ }
+ if ( !isReadable() ) { // reading not permitted
+ qWarning( "QStringBuffer::ungetch: Read operation not permitted" );
+ return -1;
+ }
+#endif
+ if ( ch != -1 ) { // something to do with eof
+ if ( ioIndex )
+ ioIndex--;
+ else
+ ch = -1;
+ }
+ return ch;
+}
+
+
+/*!
+ Constructs a text stream that operates on a Unicode QString through an
+ internal device.
+
+ If you set an encoding or codec with setEncoding() or setCodec(), this
+ setting is ignored for text streams that operate on QString.
+
+ Example:
+ \code
+ QString str;
+ QTextStream ts( &str, IO_WriteOnly );
+ ts << "pi = " << 3.14; // str == "pi = 3.14"
+ \endcode
+
+ Writing data to the text stream will modify the contents of the string.
+ The string will be expanded when data is written beyond the end of the
+ string. Note that the string will not be truncated:
+ \code
+ QString str = "pi = 3.14";
+ QTextStream ts( &str, IO_WriteOnly );
+ ts << "2+2 = " << 2+2; // str == "2+2 = 414"
+ \endcode
+
+ Note that since QString is Unicode, you should not use readRawBytes()
+ or writeRawBytes() on such a stream.
+*/
+
+QTextStream::QTextStream( QString* str, int filemode )
+{
+ // TODO: optimize for this case as it becomes more common
+ // (see QStringBuffer above)
+ init();
+ dev = new QStringBuffer( str );
+ ((QStringBuffer *)dev)->open( filemode );
+ owndev = TRUE;
+ setEncoding(RawUnicode);
+ reset();
+ d->sourceType = QTextStreamPrivate::String;
+}
+
+/*! \obsolete
+
+ This constructor is equivalent to the constructor taking a QString*
+ parameter.
+*/
+
+QTextStream::QTextStream( QString& str, int filemode )
+{
+ init();
+ dev = new QStringBuffer( &str );
+ ((QStringBuffer *)dev)->open( filemode );
+ owndev = TRUE;
+ setEncoding(RawUnicode);
+ reset();
+ d->sourceType = QTextStreamPrivate::String;
+}
+
+/*!
+ Constructs a text stream that operates on a byte array through an
+ internal QBuffer device.
+
+ Example:
+ \code
+ QByteArray array;
+ QTextStream ts( array, IO_WriteOnly );
+ ts << "pi = " << 3.14 << '\0'; // array == "pi = 3.14"
+ \endcode
+
+ Writing data to the text stream will modify the contents of the array.
+ The array will be expanded when data is written beyond the end of the
+ string.
+
+ Same example, using a QBuffer:
+ \code
+ QByteArray array;
+ QBuffer buf( array );
+ buf.open( IO_WriteOnly );
+ QTextStream ts( &buf );
+ ts << "pi = " << 3.14 << '\0'; // array == "pi = 3.14"
+ buf.close();
+ \endcode
+*/
+
+QTextStream::QTextStream( QByteArray a, int mode )
+{
+ init();
+ dev = new QBuffer( a );
+ ((QBuffer *)dev)->open( mode );
+ owndev = TRUE;
+ setEncoding( Locale ); //### Locale???
+ reset();
+ d->sourceType = QTextStreamPrivate::ByteArray;
+}
+
+/*!
+ Constructs a text stream that operates on an existing file handle \e fh
+ through an internal QFile device.
+
+ Example:
+ \code
+ QTextStream cout( stdout, IO_WriteOnly );
+ QTextStream cin ( stdin, IO_ReadOnly );
+ QTextStream cerr( stderr, IO_WriteOnly );
+ \endcode
+*/
+
+QTextStream::QTextStream( FILE *fh, int mode )
+{
+ init();
+ setEncoding( Locale ); //###
+ dev = new QFile;
+ ((QFile *)dev)->open( mode, fh );
+ fstrm = owndev = TRUE;
+ reset();
+ d->sourceType = QTextStreamPrivate::File;
+}
+
+/*!
+ Destructs the text stream.
+
+ The destructor does not affect the current IO device.
+*/
+
+QTextStream::~QTextStream()
+{
+ if ( owndev )
+ delete dev;
+ delete d;
+}
+
+/*!
+ Positions the read pointer at the first non-whitespace character.
+*/
+void QTextStream::skipWhiteSpace()
+{
+ ts_ungetc( eat_ws() );
+}
+
+
+/*!
+ \fn Encoding QTextStream::encoding() const
+
+ Returns the encoding mode of the stream.
+
+ \sa setEncoding()
+*/
+
+/*!
+ Tries to read len characters from the stream and stores them in \a buf.
+ Returns the number of characters really read.
+ Attention: There will no QEOF appended if the read reaches the end of
+ the file. EOF is reached when the return value does not equal \a len.
+*/
+uint QTextStream::ts_getbuf( QChar* buf, uint len )
+{
+ if( len<1 )
+ return 0;
+
+ uint rnum=0; // the number of QChars really read
+
+ if ( d && d->ungetcBuf.length() ) {
+ while( rnum < len && rnum < d->ungetcBuf.length() ) {
+ buf[rnum] = d->ungetcBuf.constref(rnum);
+ rnum++;
+ }
+ d->ungetcBuf = d->ungetcBuf.mid( rnum );
+ if ( rnum >= len )
+ return rnum;
+ }
+
+ // we use dev->ungetch() for one of the bytes of the unicode
+ // byte-order mark, but a local unget hack for the other byte:
+ int ungetHack = EOF;
+
+ if ( doUnicodeHeader ) {
+ doUnicodeHeader = FALSE; //only at the top
+ int c1 = dev->getch();
+ if ( c1 == EOF )
+ return rnum;
+ int c2 = dev->getch();
+ if ( c1 == 0xfe && c2 == 0xff ) {
+ mapper = 0;
+ latin1 = FALSE;
+ internalOrder = QChar::networkOrdered(); //network order
+ } else if ( c1 == 0xff && c2 == 0xfe ) {
+ mapper = 0;
+ latin1 = FALSE;
+ internalOrder = !QChar::networkOrdered(); //reverse network order
+ } else {
+ if ( c2 != EOF ) {
+ dev->ungetch( c2 );
+ ungetHack = c1;
+ } else {
+ dev->ungetch( c1 );
+ // note that a small possible bug might hide here
+ // here, if only the first byte of a file has made it
+ // so far, and that first byte is half of the
+ // byte-order mark, then the utfness will not be
+ // detected. whether or not this is a bug depends on
+ // taste. I can't really decide.
+ }
+ }
+ }
+
+#ifndef QT_NO_TEXTCODEC
+ if ( mapper ) {
+ bool shortRead = FALSE;
+ if ( !d->decoder )
+ d->decoder = mapper->makeDecoder();
+ while( rnum < len ) {
+ QString s;
+ bool readBlock = !( len == 1+rnum );
+ while ( TRUE ) {
+ // for efficiency: normally read a whole block
+ if ( readBlock ) {
+ // guess buffersize; this may be wrong (too small or too
+ // big). But we can handle this (either iterate reading
+ // or use ungetcBuf).
+ // Note that this might cause problems for codecs where
+ // one byte can result in >1 Unicode Characters if bytes
+ // are written to the stream in the meantime (loss of
+ // synchronicity).
+ uint rlen = len - rnum;
+ char *cbuf = new char[ rlen ];
+ if ( ungetHack != EOF ) {
+ rlen = 1+dev->readBlock( cbuf+1, rlen-1 );
+ cbuf[0] = (char)ungetHack;
+ ungetHack = EOF;
+ } else {
+ rlen = dev->readBlock( cbuf, rlen );
+ }
+ s += d->decoder->toUnicode( cbuf, rlen );
+ delete[] cbuf;
+ // use buffered reading only for the first time, because we
+ // have to get the stream synchronous again (this is easier
+ // with single character reading)
+ readBlock = FALSE;
+ }
+ // get stream (and codec) in sync
+ int c;
+ if ( ungetHack == EOF ) {
+ c = dev->getch();
+ } else {
+ c = ungetHack;
+ ungetHack = EOF;
+ }
+ if ( c == EOF ) {
+ shortRead = TRUE;
+ break;
+ }
+ char b = c;
+ uint lengthBefore = s.length();
+ s += d->decoder->toUnicode( &b, 1 );
+ if ( s.length() > lengthBefore )
+ break; // it seems we are in sync now
+ }
+ uint i = 0;
+ while( rnum < len && i < s.length() )
+ buf[rnum++] = s.constref(i++);
+ if ( s.length() > i )
+ // could be = but append is clearer
+ d->ungetcBuf.append( s.mid( i ) );
+ if ( shortRead )
+ return rnum;
+ }
+ } else
+#endif
+ if ( latin1 ) {
+ if ( len == 1+rnum ) {
+ // use this method for one character because it is more efficient
+ // (arnt doubts whether it makes a difference, but lets it stand)
+ int c = (ungetHack == EOF) ? dev->getch() : ungetHack;
+ if ( c != EOF )
+ buf[rnum++] = (char)c;
+ } else {
+ if ( ungetHack != EOF ) {
+ buf[rnum++] = (char)ungetHack;
+ ungetHack = EOF;
+ }
+ char *cbuf = new char[len - rnum];
+ while ( !dev->atEnd() && rnum < len ) {
+ uint rlen = len - rnum;
+ rlen = dev->readBlock( cbuf, rlen );
+ uint i = 0;
+ while( i < rlen )
+ buf[rnum++] = cbuf[i++];
+ }
+ delete[] cbuf;
+ }
+ } else { // UCS-2 or UTF-16
+ if ( len == 1+rnum ) {
+ int c1 = (ungetHack == EOF) ? dev->getch() : ungetHack;
+ if ( c1 == EOF )
+ return rnum;
+ int c2 = dev->getch();
+ if ( c2 == EOF )
+ return rnum;
+ if ( isNetworkOrder() )
+ buf[rnum++] = QChar( c2, c1 );
+ else
+ buf[rnum++] = QChar( c1, c2 );
+ } else {
+ char *cbuf = new char[ 2*( len - rnum ) ]; // for paranoids: overflow possible
+ while ( !dev->atEnd() && rnum < len ) {
+ uint rlen = 2 * ( len-rnum );
+ if ( ungetHack != EOF ) {
+ rlen = 1+dev->readBlock( cbuf+1, rlen-1 );
+ cbuf[0] = (char)ungetHack;
+ ungetHack = EOF;
+ } else {
+ rlen = dev->readBlock( cbuf, rlen );
+ }
+ // We can't use an odd number of bytes, so put it back. But
+ // do it only if we are capable of reading more -- normally
+ // there should not be an odd number, but the file might be
+ // truncated or not in UTF-16...
+ if ( (rlen & 1) == 1 )
+ if ( !dev->atEnd() )
+ dev->ungetch( cbuf[--rlen] );
+ uint i = 0;
+ if ( isNetworkOrder() ) {
+ while( i < rlen ) {
+ buf[rnum++] = QChar( cbuf[i+1], cbuf[i] );
+ i+=2;
+ }
+ } else {
+ while( i < rlen ) {
+ buf[rnum++] = QChar( cbuf[i], cbuf[i+1] );
+ i+=2;
+ }
+ }
+ }
+ delete[] cbuf;
+ }
+ }
+ return rnum;
+}
+
+
+/*!
+ Puts one character to the stream.
+*/
+void QTextStream::ts_putc( QChar c )
+{
+#ifndef QT_NO_TEXTCODEC
+ if ( mapper ) {
+ int len = 1;
+ QString s = c;
+ QCString block = mapper->fromUnicode( s, len );
+ dev->writeBlock( block, len );
+ } else
+#endif
+ if ( latin1 ) {
+ if( c.row() )
+ dev->putch( '?' ); //######unknown character???
+ else
+ dev->putch( c.cell() );
+ } else {
+ if ( doUnicodeHeader ) {
+ doUnicodeHeader = FALSE;
+ ts_putc( QChar::byteOrderMark );
+ }
+ if ( internalOrder ) {
+ dev->writeBlock( (char*)&c, sizeof(QChar) );
+ } else if ( isNetworkOrder() ) {
+ dev->putch(c.row());
+ dev->putch(c.cell());
+ } else {
+ dev->putch(c.cell());
+ dev->putch(c.row());
+ }
+ }
+}
+
+/*!
+ Puts one character to the stream.
+*/
+void QTextStream::ts_putc(int ch)
+{
+ ts_putc(QChar((ushort)ch));
+}
+
+bool QTextStream::ts_isdigit(QChar c)
+{
+ return c.isDigit();
+}
+
+bool QTextStream::ts_isspace( QChar c )
+{
+ return c.isSpace();
+}
+
+void QTextStream::ts_ungetc( QChar c )
+{
+ if ( c.unicode() == 0xffff )
+ return;
+
+ d->ungetcBuf.prepend( c );
+}
+
+
+
+/*!
+ Reads \e len bytes from the stream into \e e s and returns a reference to
+ the stream.
+
+ The buffer \e s must be preallocated.
+
+ Note that no encoding is done by this function.
+
+ \warning The behaviour of this function is undefined unless the
+ stream's encoding is set to Unicode or Latin1.
+
+ \sa QIODevice::readBlock()
+*/
+
+QTextStream &QTextStream::readRawBytes( char *s, uint len )
+{
+ dev->readBlock( s, len );
+ return *this;
+}
+
+/*!
+ Writes the \e len bytes from \e s to the stream and returns a reference to
+ the stream.
+
+ Note that no encoding is done by this function.
+
+ \sa QIODevice::writeBlock()
+*/
+
+QTextStream &QTextStream::writeRawBytes( const char* s, uint len )
+{
+ dev->writeBlock( s, len );
+ return *this;
+}
+
+
+QTextStream &QTextStream::writeBlock( const char* p, uint len )
+{
+ if ( doUnicodeHeader ) {
+ doUnicodeHeader = FALSE;
+ if ( !mapper && !latin1 )
+ ts_putc( QChar::byteOrderMark );
+ }
+ //All QCStrings and const char* are defined to be in Latin1
+ if ( !mapper && latin1 ) {
+ dev->writeBlock( p, len );
+ } else if ( !mapper && internalOrder ) {
+ QChar *u = new QChar[len];
+ for (uint i=0; i<len; i++)
+ u[i] = p[i];
+ dev->writeBlock( (char*)u, len*sizeof(QChar) );
+ delete [] u;
+ } else {
+ for (uint i=0; i<len; i++)
+ ts_putc( (uchar)p[i] );
+ }
+ return *this;
+}
+
+QTextStream &QTextStream::writeBlock( const QChar* p, uint len )
+{
+ if ( !mapper && !latin1 && internalOrder ) {
+ if ( doUnicodeHeader ) {
+ doUnicodeHeader = FALSE;
+ ts_putc( QChar::byteOrderMark );
+ }
+ dev->writeBlock( (char*)p, sizeof(QChar)*len );
+ } else {
+ for (uint i=0; i<len; i++)
+ ts_putc( p[i] );
+ }
+ return *this;
+}
+
+
+
+/*!
+ Resets the text stream.
+
+ <ul>
+ <li> All flags are set to 0.
+ <li> The field width is set to 0.
+ <li> The fill character is set to ' ' (space).
+ <li> The precision is set to 6.
+ </ul>
+
+ \sa setf(), width(), fill(), precision()
+*/
+
+void QTextStream::reset()
+{
+ fflags = 0;
+ fwidth = 0;
+ fillchar = ' ';
+ fprec = 6;
+}
+
+
+/*!
+ \fn QIODevice *QTextStream::device() const
+ Returns the IO device currently set.
+ \sa setDevice(), unsetDevice()
+*/
+
+/*!
+ Sets the IO device to \a iod.
+ \sa device(), unsetDevice()
+*/
+
+void QTextStream::setDevice( QIODevice *iod )
+{
+ if ( owndev ) {
+ delete dev;
+ owndev = FALSE;
+ }
+ dev = iod;
+ d->sourceType = QTextStreamPrivate::IODevice;
+}
+
+/*!
+ Unsets the IO device. Equivalent to setDevice( 0 ).
+ \sa device(), setDevice()
+*/
+
+void QTextStream::unsetDevice()
+{
+ setDevice( 0 );
+ d->sourceType = QTextStreamPrivate::NotSet;
+}
+
+/*!
+ \fn bool QTextStream::atEnd() const
+ Returns TRUE if the IO device has reached the end position (end of
+ stream or file) or if there is no IO device set.
+
+ Returns FALSE if the current position of the read/write head of the IO
+ device is somewhere before the end position.
+
+ \sa QIODevice::atEnd()
+*/
+
+/*!\fn bool QTextStream::eof() const
+
+ \obsolete
+
+ This function has been renamed to atEnd().
+
+ \sa QIODevice::atEnd()
+*/
+
+/*****************************************************************************
+ QTextStream read functions
+ *****************************************************************************/
+
+
+/*!
+ Reads a \c char from the stream and returns a reference to the stream.
+ Note that whitespace is skipped.
+*/
+
+QTextStream &QTextStream::operator>>( char &c )
+{
+ CHECK_STREAM_PRECOND
+ c = eat_ws();
+ return *this;
+}
+
+/*!
+ Reads a \c char from the stream and returns a reference to the stream.
+ Note that whitespace is \e not skipped.
+*/
+
+QTextStream &QTextStream::operator>>( QChar &c )
+{
+ CHECK_STREAM_PRECOND
+ c = ts_getc();
+ return *this;
+}
+
+
+ulong QTextStream::input_bin()
+{
+ ulong val = 0;
+ QChar ch = eat_ws();
+ int dv = ch.digitValue();
+ while ( dv == 0 || dv == 1 ) {
+ val = ( val << 1 ) + dv;
+ ch = ts_getc();
+ dv = ch.digitValue();
+ }
+ if ( ch != QEOF )
+ ts_ungetc( ch );
+ return val;
+}
+
+ulong QTextStream::input_oct()
+{
+ ulong val = 0;
+ QChar ch = eat_ws();
+ int dv = ch.digitValue();
+ while ( dv >= 0 && dv <= 7 ) {
+ val = ( val << 3 ) + dv;
+ ch = ts_getc();
+ dv = ch.digitValue();
+ }
+ if ( dv == 8 || dv == 9 ) {
+ while ( ts_isdigit(ch) )
+ ch = ts_getc();
+ }
+ if ( ch != QEOF )
+ ts_ungetc( ch );
+ return val;
+}
+
+ulong QTextStream::input_dec()
+{
+ ulong val = 0;
+ QChar ch = eat_ws();
+ int dv = ch.digitValue();
+ while ( ts_isdigit(ch) ) {
+ val = val * 10 + dv;
+ ch = ts_getc();
+ dv = ch.digitValue();
+ }
+ if ( ch != QEOF )
+ ts_ungetc( ch );
+ return val;
+}
+
+ulong QTextStream::input_hex()
+{
+ ulong val = 0;
+ QChar ch = eat_ws();
+ char c = ch;
+ while ( isxdigit(c) ) {
+ val <<= 4;
+ if ( ts_isdigit(c) )
+ val += c - '0';
+ else
+ val += 10 + tolower(c) - 'a';
+ c = ch = ts_getc();
+ }
+ if ( ch != QEOF )
+ ts_ungetc( ch );
+ return val;
+}
+
+long QTextStream::input_int()
+{
+ long val;
+ QChar ch;
+ char c;
+ switch ( flags() & basefield ) {
+ case bin:
+ val = (long)input_bin();
+ break;
+ case oct:
+ val = (long)input_oct();
+ break;
+ case dec:
+ c = ch = eat_ws();
+ if ( ch == QEOF ) {
+ val = 0;
+ } else {
+ if ( !(c == '-' || c == '+') )
+ ts_ungetc( ch );
+ if ( c == '-' ) {
+ ulong v = input_dec();
+ if ( v ) { // ensure that LONG_MIN can be read
+ v--;
+ val = -((long)v) - 1;
+ } else {
+ val = 0;
+ }
+ } else {
+ val = (long)input_dec();
+ }
+ }
+ break;
+ case hex:
+ val = (long)input_hex();
+ break;
+ default:
+ val = 0;
+ c = ch = eat_ws();
+ if ( c == '0' ) { // bin, oct or hex
+ c = ch = ts_getc();
+ if ( tolower(c) == 'x' )
+ val = (long)input_hex();
+ else if ( tolower(c) == 'b' )
+ val = (long)input_bin();
+ else { // octal
+ ts_ungetc( ch );
+ if ( c >= '0' && c <= '7' ) {
+ val = (long)input_oct();
+ } else {
+ val = 0;
+ }
+ }
+ } else if ( ts_isdigit(ch) ) {
+ ts_ungetc( ch );
+ val = (long)input_dec();
+ } else if ( c == '-' || c == '+' ) {
+ ulong v = input_dec();
+ if ( c == '-' ) {
+ if ( v ) { // ensure that LONG_MIN can be read
+ v--;
+ val = -((long)v) - 1;
+ } else {
+ val = 0;
+ }
+ } else {
+ val = (long)v;
+ }
+ }
+ }
+ return val;
+}
+
+//
+// We use a table-driven FSM to parse floating point numbers
+// strtod() cannot be used directly since we're reading from a QIODevice
+//
+
+double QTextStream::input_double()
+{
+ const int Init = 0; // states
+ const int Sign = 1;
+ const int Mantissa = 2;
+ const int Dot = 3;
+ const int Abscissa = 4;
+ const int ExpMark = 5;
+ const int ExpSign = 6;
+ const int Exponent = 7;
+ const int Done = 8;
+
+ const int InputSign = 1; // input tokens
+ const int InputDigit = 2;
+ const int InputDot = 3;
+ const int InputExp = 4;
+
+ static uchar table[8][5] = {
+ /* None InputSign InputDigit InputDot InputExp */
+ { 0, Sign, Mantissa, Dot, 0, }, // Init
+ { 0, 0, Mantissa, Dot, 0, }, // Sign
+ { Done, Done, Mantissa, Dot, ExpMark,}, // Mantissa
+ { 0, 0, Abscissa, 0, 0, }, // Dot
+ { Done, Done, Abscissa, Done, ExpMark,}, // Abscissa
+ { 0, ExpSign, Exponent, 0, 0, }, // ExpMark
+ { 0, 0, Exponent, 0, 0, }, // ExpSign
+ { Done, Done, Exponent, Done, Done } // Exponent
+ };
+
+ int state = Init; // parse state
+ int input; // input token
+
+ char buf[256];
+ int i = 0;
+ QChar c = eat_ws();
+
+ while ( TRUE ) {
+
+ switch ( c ) {
+ case '+':
+ case '-':
+ input = InputSign;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ input = InputDigit;
+ break;
+ case '.':
+ input = InputDot;
+ break;
+ case 'e':
+ case 'E':
+ input = InputExp;
+ break;
+ default:
+ input = 0;
+ break;
+ }
+
+ state = table[state][input];
+
+ if ( state == 0 || state == Done || i > 250 ) {
+ if ( i > 250 ) { // ignore rest of digits
+ do { c = ts_getc(); } while ( c != QEOF && ts_isdigit(c) );
+ }
+ if ( c != QEOF )
+ ts_ungetc( c );
+ buf[i] = '\0';
+ char *end;
+ return strtod( buf, &end );
+ }
+
+ buf[i++] = c;
+ c = ts_getc();
+ }
+
+#if !defined(_CC_EGG_)
+ return 0.0;
+#endif
+}
+
+
+/*!
+ Reads a signed \c short integer from the stream and returns a reference to
+ the stream. See flags() for an explanation of expected input format.
+*/
+
+QTextStream &QTextStream::operator>>( signed short &i )
+{
+ CHECK_STREAM_PRECOND
+ i = (signed short)input_int();
+ return *this;
+}
+
+
+/*!
+ Reads an unsigned \c short integer from the stream and returns a reference to
+ the stream. See flags() for an explanation of expected input format.
+*/
+
+QTextStream &QTextStream::operator>>( unsigned short &i )
+{
+ CHECK_STREAM_PRECOND
+ i = (unsigned short)input_int();
+ return *this;
+}
+
+
+/*!
+ Reads a signed \c int from the stream and returns a reference to the
+ stream. See flags() for an explanation of expected input format.
+*/
+
+QTextStream &QTextStream::operator>>( signed int &i )
+{
+ CHECK_STREAM_PRECOND
+ i = (signed int)input_int();
+ return *this;
+}
+
+
+/*!
+ Reads an unsigned \c int from the stream and returns a reference to the
+ stream. See flags() for an explanation of expected input format.
+*/
+
+QTextStream &QTextStream::operator>>( unsigned int &i )
+{
+ CHECK_STREAM_PRECOND
+ i = (unsigned int)input_int();
+ return *this;
+}
+
+
+/*!
+ Reads a signed \c long int from the stream and returns a reference to the
+ stream. See flags() for an explanation of expected input format.
+*/
+
+QTextStream &QTextStream::operator>>( signed long &i )
+{
+ CHECK_STREAM_PRECOND
+ i = (signed long)input_int();
+ return *this;
+}
+
+
+/*!
+ Reads an unsigned \c long int from the stream and returns a reference to the
+ stream. See flags() for an explanation of expected input format.
+*/
+
+QTextStream &QTextStream::operator>>( unsigned long &i )
+{
+ CHECK_STREAM_PRECOND
+ i = (unsigned long)input_int();
+ return *this;
+}
+
+
+/*!
+ Reads a \c float from the stream and returns a reference to the stream.
+ See flags() for an explanation of expected input format.
+*/
+
+QTextStream &QTextStream::operator>>( float &f )
+{
+ CHECK_STREAM_PRECOND
+ f = (float)input_double();
+ return *this;
+}
+
+
+/*!
+ Reads a \c double from the stream and returns a reference to the stream.
+ See flags() for an explanation of expected input format.
+*/
+
+QTextStream &QTextStream::operator>>( double &f )
+{
+ CHECK_STREAM_PRECOND
+ f = input_double();
+ return *this;
+}
+
+
+/*!
+ Reads a word from the stream and returns a reference to the stream.
+*/
+
+QTextStream &QTextStream::operator>>( char *s )
+{
+ CHECK_STREAM_PRECOND
+ int maxlen = width( 0 );
+ QChar c = eat_ws();
+ if ( !maxlen )
+ maxlen = -1;
+ while ( c != QEOF ) {
+ if ( ts_isspace(c) || maxlen-- == 0 ) {
+ ts_ungetc( c );
+ break;
+ }
+ *s++ = c;
+ c = ts_getc();
+ }
+
+ *s = '\0';
+ return *this;
+}
+
+/*!
+ Reads a word from the stream and returns a reference to the stream.
+*/
+
+QTextStream &QTextStream::operator>>( QString &str )
+{
+ CHECK_STREAM_PRECOND
+ str=QString::fromLatin1("");
+ QChar c = eat_ws();
+
+ while ( c != QEOF ) {
+ if ( ts_isspace(c) ) {
+ ts_ungetc( c );
+ break;
+ }
+ str += c;
+ c = ts_getc();
+ }
+ return *this;
+}
+
+/*!
+ Reads a word from the stream and returns a reference to the stream.
+*/
+
+QTextStream &QTextStream::operator>>( QCString &str )
+{
+ CHECK_STREAM_PRECOND
+ QCString *dynbuf = 0;
+ const int buflen = 256;
+ char buffer[buflen];
+ char *s = buffer;
+ int i = 0;
+ QChar c = eat_ws();
+
+ while ( c != QEOF ) {
+ if ( ts_isspace(c) ) {
+ ts_ungetc( c );
+ break;
+ }
+ if ( i >= buflen-1 ) {
+ if ( !dynbuf ) { // create dynamic buffer
+ dynbuf = new QCString(buflen*2);
+ memcpy( dynbuf->data(), s, i ); // copy old data
+ } else if ( i >= (int)dynbuf->size()-1 ) {
+ dynbuf->resize( dynbuf->size()*2 );
+ }
+ s = dynbuf->data();
+ }
+ s[i++] = c;
+ c = ts_getc();
+ }
+ str.resize( i+1 );
+ memcpy( str.data(), s, i );
+ delete dynbuf;
+ return *this;
+}
+
+
+/*!
+ Reads a line from the stream and returns a string containing the text.
+
+ The returned string does not contain any trailing newline or carriage
+ return. Note that this is different from QIODevice::readLine(), which
+ does not strip the newline at the end of the line.
+
+ On EOF you will get a QString that is null. On reading an empty line the
+ returned QString is empty but not null.
+
+ \sa QIODevice::readLine()
+*/
+
+QString QTextStream::readLine()
+{
+#if defined(CHECK_STATE)
+ if ( !dev ) {
+ qWarning( "QTextStream::readLine: No device" );
+ return QString::null;
+ }
+#endif
+ QString result( "" );
+ const int buf_size = 256;
+ QChar c[buf_size];
+ int pos = 0;
+
+ c[pos] = ts_getc();
+ if ( c[pos] == QEOF )
+ return QString::null;
+
+ while ( c[pos] != QEOF && c[pos] != '\n' ) {
+ pos++;
+ if ( pos >= buf_size ) {
+ result += QString( c, pos );
+ pos = 0;
+ }
+ c[pos] = ts_getc();
+ }
+ result += QString( c, pos );
+
+ int len = (int)result.length();
+ if ( len && result[len-1] == '\r' )
+ result.truncate(len-1); // (if there are two \r, let one stay)
+
+ return result;
+}
+
+
+/*!
+ Reads the entire stream and returns a string containing the text.
+
+ \sa QIODevice::readLine()
+*/
+
+QString QTextStream::read()
+{
+#if defined(CHECK_STATE)
+ if ( !dev ) {
+ qWarning( "QTextStream::read: No device" );
+ return QString::null;
+ }
+#endif
+ QString result;
+ const uint bufsize = 512;
+ QChar buf[bufsize];
+ uint i, num, start;
+ bool skipped_cr = FALSE;
+
+ while ( 1 ) {
+ num = ts_getbuf(buf,bufsize);
+ // do a s/\r\n/\n
+ start = 0;
+ for ( i=0; i<num; i++ ) {
+ if ( buf[i] == '\r' ) {
+ // Only skip single cr's preceding lf's
+ if ( skipped_cr ) {
+ result += buf[i];
+ start++;
+ } else {
+ result += QString( &buf[start], i-start );
+ start = i+1;
+ skipped_cr = TRUE;
+ }
+ } else {
+ if ( skipped_cr ) {
+ if ( buf[i] != '\n' ) {
+ // Should not have skipped it
+ result += '\r';
+ }
+ skipped_cr = FALSE;
+ }
+ }
+ }
+ if ( start < num )
+ result += QString( &buf[start], i-start );
+ if ( num != bufsize ) // if ( EOF )
+ break;
+ }
+ return result;
+}
+
+
+
+/*****************************************************************************
+ QTextStream write functions
+ *****************************************************************************/
+
+/*!
+ Writes a \c char to the stream and returns a reference to the stream.
+
+ The character \a c is assumed to be Latin1 encoded independent of the Encoding set
+ for the QTextStream.
+*/
+QTextStream &QTextStream::operator<<( QChar c )
+{
+ CHECK_STREAM_PRECOND
+ ts_putc( c );
+ return *this;
+}
+
+/*!
+ Writes a \c char to the stream and returns a reference to the stream.
+*/
+QTextStream &QTextStream::operator<<( char c )
+{
+ CHECK_STREAM_PRECOND
+ unsigned char uc = (unsigned char) c;
+ ts_putc( uc );
+ return *this;
+}
+
+QTextStream &QTextStream::output_int( int format, ulong n, bool neg )
+{
+ static char hexdigits_lower[] = "0123456789abcdef";
+ static char hexdigits_upper[] = "0123456789ABCDEF";
+ CHECK_STREAM_PRECOND
+ char buf[76];
+ register char *p;
+ int len;
+ char *hexdigits;
+
+ switch ( flags() & I_BASE_MASK ) {
+
+ case I_BASE_2: // output binary number
+ switch ( format & I_TYPE_MASK ) {
+ case I_SHORT: len=16; break;
+ case I_INT: len=sizeof(int)*8; break;
+ case I_LONG: len=32; break;
+ default: len = 0;
+ }
+ p = &buf[74]; // go reverse order
+ *p = '\0';
+ while ( len-- ) {
+ *--p = (char)(n&1) + '0';
+ n >>= 1;
+ if ( !n )
+ break;
+ }
+ if ( flags() & showbase ) { // show base
+ *--p = (flags() & uppercase) ? 'B' : 'b';
+ *--p = '0';
+ }
+ break;
+
+ case I_BASE_8: // output octal number
+ p = &buf[74];
+ *p = '\0';
+ do {
+ *--p = (char)(n&7) + '0';
+ n >>= 3;
+ } while ( n );
+ if ( flags() & showbase )
+ *--p = '0';
+ break;
+
+ case I_BASE_16: // output hexadecimal number
+ p = &buf[74];
+ *p = '\0';
+ hexdigits = (flags() & uppercase) ?
+ hexdigits_upper : hexdigits_lower;
+ do {
+ *--p = hexdigits[(int)n&0xf];
+ n >>= 4;
+ } while ( n );
+ if ( flags() & showbase ) {
+ *--p = (flags() & uppercase) ? 'X' : 'x';
+ *--p = '0';
+ }
+ break;
+
+ default: // decimal base is default
+ p = &buf[74];
+ *p = '\0';
+ if ( neg )
+ n = (ulong)(-(long)n);
+ do {
+ *--p = ((int)(n%10)) + '0';
+ n /= 10;
+ } while ( n );
+ if ( neg )
+ *--p = '-';
+ else if ( flags() & showpos )
+ *--p = '+';
+ if ( (flags() & internal) && fwidth && !ts_isdigit(*p) ) {
+ ts_putc( *p ); // special case for internal
+ ++p; // padding
+ fwidth--;
+ return *this << (const char*)p;
+ }
+ }
+ if ( fwidth ) { // adjustment required
+ if ( !(flags() & left) ) { // but NOT left adjustment
+ len = qstrlen(p);
+ int padlen = fwidth - len;
+ if ( padlen <= 0 ) { // no padding required
+ writeBlock( p, len );
+ } else if ( padlen < (int)(p-buf) ) { // speeds up padding
+ memset( p-padlen, (char)fillchar, padlen );
+ writeBlock( p-padlen, padlen+len );
+ }
+ else // standard padding
+ *this << (const char*)p;
+ }
+ else
+ *this << (const char*)p;
+ fwidth = 0; // reset field width
+ }
+ else
+ writeBlock( p, qstrlen(p) );
+ return *this;
+}
+
+
+/*!
+ Writes a \c short integer to the stream and returns a reference to
+ the stream.
+*/
+
+QTextStream &QTextStream::operator<<( signed short i )
+{
+ return output_int( I_SHORT | I_SIGNED, i, i < 0 );
+}
+
+
+/*!
+ Writes an \c unsigned \c short integer to the stream and returns a reference
+ to the stream.
+*/
+
+QTextStream &QTextStream::operator<<( unsigned short i )
+{
+ return output_int( I_SHORT | I_UNSIGNED, i, FALSE );
+}
+
+
+/*!
+ Writes an \c int to the stream and returns a reference to
+ the stream.
+*/
+
+QTextStream &QTextStream::operator<<( signed int i )
+{
+ return output_int( I_INT | I_SIGNED, i, i < 0 );
+}
+
+
+/*!
+ Writes an \c unsigned \c int to the stream and returns a reference to
+ the stream.
+*/
+
+QTextStream &QTextStream::operator<<( unsigned int i )
+{
+ return output_int( I_INT | I_UNSIGNED, i, FALSE );
+}
+
+
+/*!
+ Writes a \c long \c int to the stream and returns a reference to
+ the stream.
+*/
+
+QTextStream &QTextStream::operator<<( signed long i )
+{
+ return output_int( I_LONG | I_SIGNED, i, i < 0 );
+}
+
+
+/*!
+ Writes an \c unsigned \c long \c int to the stream and returns a reference to
+ the stream.
+*/
+
+QTextStream &QTextStream::operator<<( unsigned long i )
+{
+ return output_int( I_LONG | I_UNSIGNED, i, FALSE );
+}
+
+
+/*!
+ Writes a \c float to the stream and returns a reference to the stream.
+*/
+
+QTextStream &QTextStream::operator<<( float f )
+{
+ return *this << (double)f;
+}
+
+
+/*!
+ Writes a \c double to the stream and returns a reference to the stream.
+*/
+
+QTextStream &QTextStream::operator<<( double f )
+{
+ CHECK_STREAM_PRECOND
+ char buf[64];
+ char f_char;
+ char format[16];
+ if ( (flags()&floatfield) == fixed )
+ f_char = 'f';
+ else if ( (flags()&floatfield) == scientific )
+ f_char = (flags() & uppercase) ? 'E' : 'e';
+ else
+ f_char = (flags() & uppercase) ? 'G' : 'g';
+ register char *fs = format; // generate format string
+ *fs++ = '%'; // "%.<prec>l<f_char>"
+ *fs++ = '.';
+ int prec = precision();
+ if ( prec > 99 )
+ prec = 99;
+ if ( prec >= 10 ) {
+ *fs++ = prec / 10 + '0';
+ *fs++ = prec % 10 + '0';
+ } else {
+ *fs++ = prec + '0';
+ }
+ *fs++ = 'l';
+ *fs++ = f_char;
+ *fs = '\0';
+ sprintf( buf, format, f ); // convert to text
+ if ( fwidth ) // padding
+ *this << (const char*)buf;
+ else // just write it
+ writeBlock( buf, qstrlen(buf) );
+ return *this;
+}
+
+
+/*!
+ Writes a string to the stream and returns a reference to the stream.
+
+ The string \a s is assumed to be Latin1 encoded independent of the Encoding set
+ for the QTextStream.
+*/
+
+QTextStream &QTextStream::operator<<( const char* s )
+{
+ CHECK_STREAM_PRECOND
+ char padbuf[48];
+ uint len = qstrlen( s ); // don't write null terminator
+ if ( fwidth ) { // field width set
+ int padlen = fwidth - len;
+ fwidth = 0; // reset width
+ if ( padlen > 0 ) {
+ char *ppad;
+ if ( padlen > 46 ) { // create extra big fill buffer
+ ppad = new char[padlen];
+ CHECK_PTR( ppad );
+ } else {
+ ppad = padbuf;
+ }
+ memset( ppad, (char)fillchar, padlen ); // fill with fillchar
+ if ( !(flags() & left) ) {
+ writeBlock( ppad, padlen );
+ padlen = 0;
+ }
+ writeBlock( s, len );
+ if ( padlen )
+ writeBlock( ppad, padlen );
+ if ( ppad != padbuf ) // delete extra big fill buf
+ delete[] ppad;
+ return *this;
+ }
+ }
+ writeBlock( s, len );
+ return *this;
+}
+
+/*!
+ Writes \a s to the stream and returns a reference to the stream.
+
+ The string \a s is assumed to be Latin1 encoded independent of the Encoding set
+ for the QTextStream.
+*/
+
+QTextStream &QTextStream::operator<<( const QCString & s )
+{
+ return operator<<(s.data());
+}
+
+/*!
+ Writes \a s to the stream and returns a reference to the stream.
+*/
+
+QTextStream &QTextStream::operator<<( const QString& s )
+{
+ CHECK_STREAM_PRECOND
+ uint len = s.length();
+ QString s1 = s;
+ if ( fwidth ) { // field width set
+ if ( !(flags() & left) ) {
+ s1 = s.rightJustify(fwidth, (char)fillchar);
+ } else {
+ s1 = s.leftJustify(fwidth, (char)fillchar);
+ }
+ fwidth = 0; // reset width
+ }
+ writeBlock( s1.unicode(), len );
+ return *this;
+}
+
+
+/*!
+ Writes a pointer to the stream and returns a reference to the stream.
+
+ The \e ptr is output as an unsigned long hexadecimal integer.
+*/
+
+QTextStream &QTextStream::operator<<( void *ptr )
+{
+ int f = flags();
+ setf( hex, basefield );
+ setf( showbase );
+ unsetf( uppercase );
+ output_int( I_LONG | I_UNSIGNED, (ulong)ptr, FALSE );
+ flags( f );
+ return *this;
+}
+
+
+/*!
+ \fn int QTextStream::flags() const
+ Returns the current stream flags. The default value is 0.
+
+ The meaning of the flags are:
+ <ul>
+ <li> \e skipws - Not currently used - whitespace always skipped
+ <li> \e left - Numeric fields are left-aligned
+ <li> \e right - Not currently used (by default numerics are right aligned)
+ <li> \e internal - Put any padding spaces between +/- and value
+ <li> \e bin - Output \e and input only in binary
+ <li> \e oct - Output \e and input only in octal
+ <li> \e dec - Output \e and input only in decimal
+ <li> \e hex - Output \e and input only in hexadecimal
+ <li> \e showbase - Annotate numeric outputs with 0b, 0, or 0x if in
+ \e bin, \e oct, or \e hex format
+ <li> \e showpoint - Not currently used
+ <li> \e uppercase - Use 0B and 0X rather than 0b and 0x
+ <li> \e showpos - Show + for positive numeric values
+ <li> \e scientific - Use scientific notation for floating point values
+ <li> \e fixed - Use fixed-point notation for floating point values
+ </ul>
+
+ Note that unless \e bin, \e oct, \e dec, or \e hex is set, the input base is
+ octal if the value starts with 0, hexadecimal if it starts with 0x, binary
+ if the value starts with 0b, and decimal otherwise.
+
+ \sa setf(), unsetf()
+*/
+
+/*!
+ \fn int QTextStream::flags( int f )
+ Sets the stream flags to \e f.
+ Returns the previous stream flags.
+
+ \sa setf(), unsetf(), flags()
+*/
+
+/*!
+ \fn int QTextStream::setf( int bits )
+ Sets the stream flag bits \e bits.
+ Returns the previous stream flags.
+
+ Equivalent to <code>flags( flags() | bits )</code>.
+
+ \sa setf(), unsetf()
+*/
+
+/*!
+ \fn int QTextStream::setf( int bits, int mask )
+ Sets the stream flag bits \e bits with a bit mask \e mask.
+ Returns the previous stream flags.
+
+ Equivalent to <code>flags( (flags() & ~mask) | (bits & mask) )</code>.
+
+ \sa setf(), unsetf()
+*/
+
+/*!
+ \fn int QTextStream::unsetf( int bits )
+ Clears the stream flag bits \e bits.
+ Returns the previous stream flags.
+
+ Equivalent to <code>flags( flags() & ~mask )</code>.
+
+ \sa setf()
+*/
+
+/*!
+ \fn int QTextStream::width() const
+ Returns the field width. The default value is 0.
+*/
+
+/*!
+ \fn int QTextStream::width( int w )
+ Sets the field width to \e w. Returns the previous field width.
+*/
+
+/*!
+ \fn int QTextStream::fill() const
+ Returns the fill character. The default value is ' ' (space).
+*/
+
+/*!
+ \fn int QTextStream::fill( int f )
+ Sets the fill character to \e f. Returns the previous fill character.
+*/
+
+/*!
+ \fn int QTextStream::precision() const
+ Returns the precision. The default value is 6.
+*/
+
+/*!
+ \fn int QTextStream::precision( int p )
+ Sets the precision to \e p. Returns the previous precision setting.
+*/
+
+
+ /*****************************************************************************
+ QTextStream manipulators
+ *****************************************************************************/
+
+QTextStream &bin( QTextStream &s )
+{
+ s.setf(QTS::bin,QTS::basefield);
+ return s;
+}
+
+QTextStream &oct( QTextStream &s )
+{
+ s.setf(QTS::oct,QTS::basefield);
+ return s;
+}
+
+QTextStream &dec( QTextStream &s )
+{
+ s.setf(QTS::dec,QTS::basefield);
+ return s;
+}
+
+QTextStream &hex( QTextStream &s )
+{
+ s.setf(QTS::hex,QTS::basefield);
+ return s;
+}
+
+QTextStream &endl( QTextStream &s )
+{
+ return s << '\n';
+}
+
+QTextStream &flush( QTextStream &s )
+{
+ if ( s.device() )
+ s.device()->flush();
+ return s;
+}
+
+QTextStream &ws( QTextStream &s )
+{
+ s.skipWhiteSpace();
+ return s;
+}
+
+QTextStream &reset( QTextStream &s )
+{
+ s.reset();
+ return s;
+}
+
+
+/*!
+ \class QTextIStream qtextstream.h
+ \brief A convenience class for input streams.
+
+ For simple tasks, code should be simple. Hence this
+ class is a shorthand to avoid passing the \e mode argument
+ to the normal QTextStream constructors.
+
+ This makes it easy for example, to write things like this:
+\code
+ QString data = "123 456";
+ int a, b;
+ QTextIStream(&data) >> a >> b;
+\endcode
+
+ \sa QTextOStream
+*/
+
+/*!
+ \fn QTextIStream::QTextIStream( QString *s )
+
+ Constructs a stream to read from string \a s.
+*/
+/*!
+ \fn QTextIStream::QTextIStream( QByteArray ba )
+
+ Constructs a stream to read from the array \a ba.
+*/
+/*!
+ \fn QTextIStream::QTextIStream( FILE *f )
+
+ Constructs a stream to read from the file \a f.
+*/
+
+
+/*!
+ \class QTextOStream qtextstream.h
+ \brief A convenience class for output streams.
+
+ For simple tasks, code should be simple. Hence this
+ class is a shorthand to avoid passing the \e mode argument
+ to the normal QTextStream constructors.
+
+ This makes it easy for example, to write things like this:
+\code
+ QString result;
+ QTextOStream(&result) << "pi = " << 3.14;
+\endcode
+*/
+
+/*!
+ \fn QTextOStream::QTextOStream( QString *s )
+
+ Constructs a stream to write to string \a s.
+*/
+/*!
+ \fn QTextOStream::QTextOStream( QByteArray ba )
+
+ Constructs a stream to write to the array \a ba.
+*/
+/*!
+ \fn QTextOStream::QTextOStream( FILE *f )
+
+ Constructs a stream to write to the file \a f.
+*/
+
+
+
+/*!
+ Sets the encoding of this stream to \a e, where \a e is one of:
+ <ul>
+ <li> \c Locale Using local file format (Latin1 if locale is not
+ set), but autodetecting Unicode(utf16) on input.
+ <li> \c Unicode Using Unicode(utf16) for input and output. Output
+ will be written in the order most efficient for the current platform
+ (i.e. the order used internally in QString).
+ <li> \c UnicodeUTF8 Using Unicode(utf8) for input and output. If you use it
+ for input it will autodetect utf16 and use it instead of utf8.
+ <li> \c Latin1 ISO-8859-1. Will not autodetect utf16.
+ <li> \c UnicodeNetworkOrder Using network order Unicode(utf16) for
+ input and output. Useful when reading Unicode data that does not
+ start with the byte order marker.
+ <li> \c UnicodeReverse Using reverse network order Unicode(utf16)
+ for input and output. Useful when reading Unicode data that does not
+ start with the byte order marker, or writing data that should be
+ read by buggy Windows applications.
+ <li> \c RawUnicode Like Unicode, but does not write the byte order
+ marker, nor does it autodetect the byte order. Only useful when
+ writing to non-persistent storage used by a single process.
+ </ul>
+
+ \c Locale and all Unicode encodings, except \c RawUnicode, will look at
+ the first two bytes in a input stream to determine the byte order. The
+ initial byte order marker will be stripped off before data is read.
+
+ Note that this function should be called before any data is read
+ to/written from the stream.
+ \sa setCodec()
+*/
+
+void QTextStream::setEncoding( Encoding e )
+{
+ if ( d->sourceType == QTextStreamPrivate::String )
+ return; // QString does not need any encoding
+ switch ( e ) {
+ case Unicode:
+ mapper = 0;
+ latin1 = FALSE;
+ doUnicodeHeader = TRUE;
+ internalOrder = TRUE;
+ break;
+ case UnicodeUTF8:
+#ifndef QT_NO_CODECS
+ mapper = QTextCodec::codecForMib( 106 );
+ latin1 = FALSE;
+ doUnicodeHeader = TRUE;
+ internalOrder = TRUE;
+#else
+ mapper = 0;
+ latin1 = TRUE;
+ doUnicodeHeader = TRUE;
+#endif
+ break;
+ case UnicodeNetworkOrder:
+ mapper = 0;
+ latin1 = FALSE;
+ doUnicodeHeader = TRUE;
+ internalOrder = QChar::networkOrdered();
+ break;
+ case UnicodeReverse:
+ mapper = 0;
+ latin1 = FALSE;
+ doUnicodeHeader = TRUE;
+ internalOrder = !QChar::networkOrdered(); //reverse network ordered
+ break;
+ case RawUnicode:
+ mapper = 0;
+ latin1 = FALSE;
+ doUnicodeHeader = FALSE;
+ internalOrder = TRUE;
+ break;
+ case Locale:
+ latin1 = TRUE; // fallback to Latin 1
+#ifndef QT_NO_TEXTCODEC
+ mapper = QTextCodec::codecForLocale();
+#if defined(_OS_WIN32_)
+ if ( GetACP() == 1252 )
+ mapper = 0; // Optimized latin1 processing
+#endif
+ if ( mapper && mapper->mibEnum() == 4 )
+#endif
+ mapper = 0; // Optimized latin1 processing
+ doUnicodeHeader = TRUE; // If it reads as Unicode, accept it
+ break;
+ case Latin1:
+ mapper = 0;
+ doUnicodeHeader = FALSE;
+ latin1 = TRUE;
+ break;
+ }
+}
+
+
+#ifndef QT_NO_TEXTCODEC
+/*! Sets the codec for this stream to \a codec. Will not try to
+ autodetect Unicode.
+
+ Note that this function should be called before any data is read
+ to/written from the stream.
+
+ \sa setEncoding()
+*/
+
+void QTextStream::setCodec( QTextCodec *codec )
+{
+ if ( d->sourceType == QTextStreamPrivate::String )
+ return; // QString does not need any codec
+ mapper = codec;
+ doUnicodeHeader = FALSE;
+}
+#endif
+
+#endif // QT_NO_TEXTSTREAM
diff --git a/qtools/qtextstream.h b/qtools/qtextstream.h
new file mode 100644
index 0000000..c5f5ba1
--- /dev/null
+++ b/qtools/qtextstream.h
@@ -0,0 +1,351 @@
+/****************************************************************************
+**
+**
+** Definition of QTextStream class
+**
+** Created : 940922
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QTEXTSTREAM_H
+#define QTEXTSTREAM_H
+
+#ifndef QT_H
+#include "qiodevice.h"
+#include "qstring.h"
+#include <stdio.h>
+#endif // QT_H
+
+#ifndef QT_NO_TEXTSTREAM
+class QTextCodec;
+class QTextDecoder;
+
+class QTextStreamPrivate;
+
+class Q_EXPORT QTextStream // text stream class
+{
+public:
+ enum Encoding { Locale, Latin1, Unicode, UnicodeNetworkOrder,
+ UnicodeReverse, RawUnicode, UnicodeUTF8 };
+
+ void setEncoding( Encoding );
+#ifndef QT_NO_TEXTCODEC
+ void setCodec( QTextCodec* );
+#endif
+
+ // Encoding encoding() const { return cmode; }
+
+ QTextStream();
+ QTextStream( QIODevice * );
+ QTextStream( QString*, int mode );
+ QTextStream( QString&, int mode ); // obsolete
+ QTextStream( QByteArray, int mode );
+ QTextStream( FILE *, int mode );
+ virtual ~QTextStream();
+
+ QIODevice *device() const;
+ void setDevice( QIODevice * );
+ void unsetDevice();
+
+ bool atEnd() const;
+ bool eof() const;
+
+ QTextStream &operator>>( QChar & );
+ QTextStream &operator>>( char & );
+ QTextStream &operator>>( signed short & );
+ QTextStream &operator>>( unsigned short & );
+ QTextStream &operator>>( signed int & );
+ QTextStream &operator>>( unsigned int & );
+ QTextStream &operator>>( signed long & );
+ QTextStream &operator>>( unsigned long & );
+ QTextStream &operator>>( float & );
+ QTextStream &operator>>( double & );
+ QTextStream &operator>>( char * );
+ QTextStream &operator>>( QString & );
+ QTextStream &operator>>( QCString & );
+
+ QTextStream &operator<<( QChar );
+ QTextStream &operator<<( char );
+ QTextStream &operator<<( signed short );
+ QTextStream &operator<<( unsigned short );
+ QTextStream &operator<<( signed int );
+ QTextStream &operator<<( unsigned int );
+ QTextStream &operator<<( signed long );
+ QTextStream &operator<<( unsigned long );
+ QTextStream &operator<<( float );
+ QTextStream &operator<<( double );
+ QTextStream &operator<<( const char* );
+ QTextStream &operator<<( const QString & );
+ QTextStream &operator<<( const QCString & );
+ QTextStream &operator<<( void * ); // any pointer
+
+ QTextStream &readRawBytes( char *, uint len );
+ QTextStream &writeRawBytes( const char* , uint len );
+
+ QString readLine();
+ QString read();
+ void skipWhiteSpace();
+
+ enum {
+ skipws = 0x0001, // skip whitespace on input
+ left = 0x0002, // left-adjust output
+ right = 0x0004, // right-adjust output
+ internal = 0x0008, // pad after sign
+ bin = 0x0010, // binary format integer
+ oct = 0x0020, // octal format integer
+ dec = 0x0040, // decimal format integer
+ hex = 0x0080, // hex format integer
+ showbase = 0x0100, // show base indicator
+ showpoint = 0x0200, // force decimal point (float)
+ uppercase = 0x0400, // upper-case hex output
+ showpos = 0x0800, // add '+' to positive integers
+ scientific= 0x1000, // scientific float output
+ fixed = 0x2000 // fixed float output
+ };
+
+ static const int basefield; // bin | oct | dec | hex
+ static const int adjustfield; // left | right | internal
+ static const int floatfield; // scientific | fixed
+
+ int flags() const;
+ int flags( int f );
+ int setf( int bits );
+ int setf( int bits, int mask );
+ int unsetf( int bits );
+
+ void reset();
+
+ int width() const;
+ int width( int );
+ int fill() const;
+ int fill( int );
+ int precision() const;
+ int precision( int );
+
+private:
+ long input_int();
+ void init();
+ QTextStream &output_int( int, ulong, bool );
+ QIODevice *dev;
+ bool isNetworkOrder() { return internalOrder == QChar::networkOrdered(); }
+
+ int fflags;
+ int fwidth;
+ int fillchar;
+ int fprec;
+ bool fstrm;
+ bool owndev;
+ QTextCodec *mapper;
+ QTextStreamPrivate * d;
+ QChar ungetcBuf;
+ bool latin1;
+ bool internalOrder;
+ bool doUnicodeHeader;
+ void *reserved_ptr;
+
+ QChar eat_ws();
+ void ts_ungetc( QChar );
+ QChar ts_getc();
+ uint ts_getbuf( QChar*, uint );
+ void ts_putc(int);
+ void ts_putc(QChar);
+ bool ts_isspace(QChar);
+ bool ts_isdigit(QChar);
+ ulong input_bin();
+ ulong input_oct();
+ ulong input_dec();
+ ulong input_hex();
+ double input_double();
+ QTextStream &writeBlock( const char* p, uint len );
+ QTextStream &writeBlock( const QChar* p, uint len );
+
+private: // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+ QTextStream( const QTextStream & );
+ QTextStream &operator=( const QTextStream & );
+#endif
+};
+
+typedef QTextStream QTS;
+
+class Q_EXPORT QTextIStream : public QTextStream {
+public:
+ QTextIStream( QString* s ) :
+ QTextStream(s,IO_ReadOnly) { }
+ QTextIStream( QByteArray ba ) :
+ QTextStream(ba,IO_ReadOnly) { }
+ QTextIStream( FILE *f ) :
+ QTextStream(f,IO_ReadOnly) { }
+};
+
+class Q_EXPORT QTextOStream : public QTextStream {
+public:
+ QTextOStream( QString* s ) :
+ QTextStream(s,IO_WriteOnly) { }
+ QTextOStream( QByteArray ba ) :
+ QTextStream(ba,IO_WriteOnly) { }
+ QTextOStream( FILE *f ) :
+ QTextStream(f,IO_WriteOnly) { }
+};
+
+/*****************************************************************************
+ QTextStream inline functions
+ *****************************************************************************/
+
+inline QIODevice *QTextStream::device() const
+{ return dev; }
+
+inline bool QTextStream::atEnd() const
+{ return dev ? dev->atEnd() : FALSE; }
+
+inline bool QTextStream::eof() const
+{ return atEnd(); }
+
+inline int QTextStream::flags() const
+{ return fflags; }
+
+inline int QTextStream::flags( int f )
+{ int oldf = fflags; fflags = f; return oldf; }
+
+inline int QTextStream::setf( int bits )
+{ int oldf = fflags; fflags |= bits; return oldf; }
+
+inline int QTextStream::setf( int bits, int mask )
+{ int oldf = fflags; fflags = (fflags & ~mask) | (bits & mask); return oldf; }
+
+inline int QTextStream::unsetf( int bits )
+{ int oldf = fflags; fflags &= ~bits; return oldf; }
+
+inline int QTextStream::width() const
+{ return fwidth; }
+
+inline int QTextStream::width( int w )
+{ int oldw = fwidth; fwidth = w; return oldw; }
+
+inline int QTextStream::fill() const
+{ return fillchar; }
+
+inline int QTextStream::fill( int f )
+{ int oldc = fillchar; fillchar = f; return oldc; }
+
+inline int QTextStream::precision() const
+{ return fprec; }
+
+inline int QTextStream::precision( int p )
+{ int oldp = fprec; fprec = p; return oldp; }
+
+/*!
+ Returns one character from the stream, or EOF.
+*/
+inline QChar QTextStream::ts_getc()
+{ QChar r; return ( ts_getbuf( &r,1 ) == 1 ? r : QChar((ushort)0xffff) ); }
+
+/*****************************************************************************
+ QTextStream manipulators
+ *****************************************************************************/
+
+typedef QTextStream & (*QTSFUNC)(QTextStream &);// manipulator function
+typedef int (QTextStream::*QTSMFI)(int); // manipulator w/int argument
+
+class Q_EXPORT QTSManip { // text stream manipulator
+public:
+ QTSManip( QTSMFI m, int a ) { mf=m; arg=a; }
+ void exec( QTextStream &s ) { (s.*mf)(arg); }
+private:
+ QTSMFI mf; // QTextStream member function
+ int arg; // member function argument
+};
+
+Q_EXPORT inline QTextStream &operator>>( QTextStream &s, QTSFUNC f )
+{ return (*f)( s ); }
+
+Q_EXPORT inline QTextStream &operator<<( QTextStream &s, QTSFUNC f )
+{ return (*f)( s ); }
+
+Q_EXPORT inline QTextStream &operator<<( QTextStream &s, QTSManip m )
+{ m.exec(s); return s; }
+
+Q_EXPORT QTextStream &bin( QTextStream &s ); // set bin notation
+Q_EXPORT QTextStream &oct( QTextStream &s ); // set oct notation
+Q_EXPORT QTextStream &dec( QTextStream &s ); // set dec notation
+Q_EXPORT QTextStream &hex( QTextStream &s ); // set hex notation
+Q_EXPORT QTextStream &endl( QTextStream &s ); // insert EOL ('\n')
+Q_EXPORT QTextStream &flush( QTextStream &s ); // flush output
+Q_EXPORT QTextStream &ws( QTextStream &s ); // eat whitespace on input
+Q_EXPORT QTextStream &reset( QTextStream &s ); // set default flags
+
+Q_EXPORT inline QTSManip qSetW( int w )
+{
+ QTSMFI func = &QTextStream::width;
+ return QTSManip(func,w);
+}
+
+Q_EXPORT inline QTSManip qSetFill( int f )
+{
+ QTSMFI func = &QTextStream::fill;
+ return QTSManip(func,f);
+}
+
+Q_EXPORT inline QTSManip qSetPrecision( int p )
+{
+ QTSMFI func = &QTextStream::precision;
+ return QTSManip(func,p);
+}
+
+
+#ifndef QT_ALTERNATE_QTSMANIP
+
+// These will go away in Qt 3.0, as they conflict with std libs
+//
+// If you get conflicts now, #define QT_ALTERNATE_QTSMANIP before
+// including this file.
+
+Q_EXPORT inline QTSManip setw( int w )
+{
+ QTSMFI func = &QTextStream::width;
+ return QTSManip(func,w);
+}
+
+Q_EXPORT inline QTSManip setfill( int f )
+{
+ QTSMFI func = &QTextStream::fill;
+ return QTSManip(func,f);
+}
+
+Q_EXPORT inline QTSManip setprecision( int p )
+{
+ QTSMFI func = &QTextStream::precision;
+ return QTSManip(func,p);
+}
+#endif
+
+#endif // QT_NO_TEXTSTREAM
+#endif // QTEXTSTREAM_H
diff --git a/qtools/qthread.cpp b/qtools/qthread.cpp
new file mode 100644
index 0000000..db2a0de
--- /dev/null
+++ b/qtools/qthread.cpp
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qthread.h"
+#include "qthread_p.h"
+
+QThread::QThread()
+ : d(new QThreadPrivate)
+{
+}
+
+QThread::~QThread()
+{
+ QMutexLocker locker(&d->mutex);
+ if (d->running && !d->finished)
+ qWarning("QThread: Destroyed while thread is still running");
+}
+
+bool QThread::isFinished() const
+{
+ QMutexLocker locker(&d->mutex);
+ return d->finished;
+}
+
+bool QThread::isRunning() const
+{
+ QMutexLocker locker(&d->mutex);
+ return d->running;
+}
+
+void QThread::setStackSize(unsigned int stackSize)
+{
+ QMutexLocker locker(&d->mutex);
+ if (d->running)
+ {
+ qWarning("QThread: Cannot change stack size while thread is running!");
+ return;
+ }
+ d->stackSize = stackSize;
+}
+
+unsigned int QThread::stackSize() const
+{
+ QMutexLocker locker(&d->mutex);
+ return d->stackSize;
+}
+
diff --git a/qtools/qthread.h b/qtools/qthread.h
new file mode 100644
index 0000000..81868bd
--- /dev/null
+++ b/qtools/qthread.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTHREAD_H
+#define QTHREAD_H
+
+class QThreadPrivate;
+
+class QThread
+{
+ public:
+ explicit QThread();
+ virtual ~QThread();
+
+ bool isFinished() const;
+ bool isRunning() const;
+
+ void start();
+ void terminate();
+ void wait();
+ void setStackSize(unsigned int stackSize);
+ unsigned int stackSize() const;
+ static int idealThreadCount();
+
+protected:
+ // events
+ virtual void started() {}
+ virtual void finished() {}
+ virtual void terminated() {}
+
+ // main loop
+ virtual void run() {}
+
+private:
+ QThreadPrivate *d;
+ friend class QThreadPrivate;
+};
+
+#endif // QTHREAD_H
diff --git a/qtools/qthread_p.h b/qtools/qthread_p.h
new file mode 100644
index 0000000..87692aa
--- /dev/null
+++ b/qtools/qthread_p.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTHREAD_P_H
+#define QTHREAD_P_H
+
+#include "qglobal.h"
+
+#if defined(_OS_UNIX_) || defined(_OS_MAC_)
+#include <pthread.h>
+#elif defined(_OS_WIN32_)
+#include <windows.h>
+#endif
+
+#include "qthread.h"
+#include "qmutex.h"
+#include "qwaitcondition.h"
+
+class QThreadPrivate
+{
+public:
+ QThreadPrivate();
+ ~QThreadPrivate();
+
+ mutable QMutex mutex;
+
+ bool running;
+ bool finished;
+ bool terminated;
+ uint stackSize;
+
+#if defined(_OS_UNIX_) || defined(_OS_MAC_)
+ pthread_t thread_id;
+ QWaitCondition thread_done;
+ static void *start(void *arg);
+ static void finish(void *arg);
+#elif defined(_OS_WIN32_)
+ HANDLE handle;
+ static unsigned int __stdcall start(void *);
+ static void finish(void *,bool lockAnyway=TRUE);
+ int waiters;
+#else
+#error "unsupported platform!"
+#endif
+};
+
+#endif // QTHREAD_P_H
diff --git a/qtools/qthread_unix.cpp b/qtools/qthread_unix.cpp
new file mode 100644
index 0000000..53242cc
--- /dev/null
+++ b/qtools/qthread_unix.cpp
@@ -0,0 +1,218 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qglobal.h"
+
+#if defined(_OS_HPUX_)
+#include <sys/pstat.h>
+#elif defined(_OS_MAC_)
+#undef DEBUG
+#include <CoreServices/CoreServices.h>
+#elif defined(_OS_BSDI_)
+#include <mach/mach_types.h>
+#include <sys/systm.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+#include <unistd.h>
+
+#include "qthread.h"
+#include "qthread_p.h"
+
+
+/**************************************************************************
+ ** QThreadPrivate
+ *************************************************************************/
+
+QThreadPrivate::QThreadPrivate() :
+ running(FALSE), finished(FALSE), terminated(FALSE), stackSize(0)
+{
+ thread_id = 0;
+}
+
+QThreadPrivate::~QThreadPrivate()
+{
+}
+
+void *QThreadPrivate::start(void *arg)
+{
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
+ pthread_cleanup_push(QThreadPrivate::finish, arg);
+
+ QThread *thr = reinterpret_cast<QThread *>(arg);
+
+ thr->started();
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+ pthread_testcancel();
+ thr->run();
+
+ pthread_cleanup_pop(1);
+ return 0;
+}
+
+void QThreadPrivate::finish(void *arg)
+{
+ QThread *thr = reinterpret_cast<QThread *>(arg);
+ QThreadPrivate *d = thr->d;
+ QMutexLocker locker(&d->mutex);
+
+ d->running = FALSE;
+ d->finished = TRUE;
+ if (d->terminated)
+ thr->terminated();
+ d->terminated = FALSE;
+ thr->finished();
+
+ d->thread_id = 0;
+ d->thread_done.wakeAll();
+}
+
+
+
+
+/**************************************************************************
+ ** QThread
+ *************************************************************************/
+
+void QThread::start()
+{
+ QMutexLocker locker(&d->mutex);
+ if (d->running) return;
+
+ d->running = TRUE;
+ d->finished = FALSE;
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
+ pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
+ if (d->stackSize>0)
+ {
+#if defined(_POSIX_THREAD_ATTR_STACKSIZE) && (_POSIX_THREAD_ATTR_STACKSIZE-0>0)
+ pthread_attr_setstacksize(&attr,d->stackSize);
+#endif
+ }
+ int code = pthread_create(&d->thread_id, &attr, QThreadPrivate::start, this);
+ pthread_attr_destroy(&attr);
+
+ if (code)
+ {
+ qWarning("QThread::start: Thread creation error: %d", code);
+
+ d->running = FALSE;
+ d->finished = FALSE;
+ d->thread_id = 0;
+ }
+}
+
+void QThread::terminate()
+{
+ QMutexLocker locker(&d->mutex);
+
+ if (!d->thread_id) return;
+
+ int code = pthread_cancel(d->thread_id);
+ if (code)
+ {
+ qWarning("QThread::start: Thread termination error: %d", code);
+ }
+ else
+ {
+ d->terminated = TRUE;
+ }
+}
+
+void QThread::wait()
+{
+ QMutexLocker locker(&d->mutex);
+ if (d->finished || !d->running) return;
+
+ while (d->running)
+ {
+ d->thread_done.wait(locker.mutex());
+ }
+}
+
+#if defined(QT_LINUXBASE) && !defined(_SC_NPROCESSORS_ONLN)
+// LSB doesn't define _SC_NPROCESSORS_ONLN.
+# define _SC_NPROCESSORS_ONLN 84
+#endif
+
+int QThread::idealThreadCount()
+{
+ int cores = -1;
+#if defined(_OS_MAC_)
+ // Mac OS X
+ cores = MPProcessorsScheduled();
+#elif defined(_OS_HPUX_)
+ // HP-UX
+ struct pst_dynamic psd;
+ if (pstat_getdynamic(&psd, sizeof(psd), 1, 0) == -1)
+ {
+ perror("pstat_getdynamic");
+ cores = -1;
+ }
+ else
+ {
+ cores = (int)psd.psd_proc_cnt;
+ }
+#elif defined(_OS_BSDI_)
+ // FreeBSD, OpenBSD, NetBSD, BSD/OS
+ size_t len = sizeof(cores);
+ int mib[2];
+ mib[0] = CTL_HW;
+ mib[1] = HW_NCPU;
+
+ if (sysctl(mib, 2, &cores, &len, NULL, 0) != 0)
+ {
+ perror("sysctl");
+ cores = -1;
+ }
+#elif defined(_OS_IRIX_)
+ // IRIX
+ cores = (int)sysconf(_SC_NPROC_ONLN);
+#else
+ // the rest: Linux, Solaris, AIX, Tru64
+ cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
+#endif
+ return cores;
+}
+
diff --git a/qtools/qthread_win32.cpp b/qtools/qthread_win32.cpp
new file mode 100644
index 0000000..2c62e93
--- /dev/null
+++ b/qtools/qthread_win32.cpp
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qthread.h"
+#include "qthread_p.h"
+
+/**************************************************************************
+ ** QThreadPrivate
+ *************************************************************************/
+
+QThreadPrivate::QThreadPrivate() :
+ running(FALSE), finished(FALSE), terminated(FALSE), stackSize(0)
+{
+ handle = NULL;
+ waiters = 0;
+}
+
+QThreadPrivate::~QThreadPrivate()
+{
+}
+
+unsigned int __stdcall QThreadPrivate::start(void *arg)
+{
+ QThread *thr = reinterpret_cast<QThread *>(arg);
+ thr->started();
+ thr->run();
+ finish(arg);
+ return 0;
+}
+
+void QThreadPrivate::finish(void *arg,bool lockAnyway)
+{
+ QThread *thr = reinterpret_cast<QThread *>(arg);
+ QThreadPrivate *d = thr->d;
+
+ if (lockAnyway) d->mutex.lock();
+
+ d->running = FALSE;
+ d->finished = TRUE;
+ if (d->terminated) thr->terminated();
+ d->terminated = FALSE;
+ thr->finished();
+
+ if (!d->waiters)
+ {
+ CloseHandle(d->handle);
+ d->handle = 0;
+ }
+
+ if (lockAnyway) d->mutex.unlock();
+}
+
+/**************************************************************************
+ ** QThread
+ *************************************************************************/
+
+void QThread::start()
+{
+ QMutexLocker locker(&d->mutex);
+
+ if (d->running) return;
+
+ d->running = TRUE;
+ d->finished = FALSE;
+ d->terminated = FALSE;
+
+ d->handle = CreateThread(NULL,d->stackSize,
+ (LPTHREAD_START_ROUTINE)QThreadPrivate::start,this,0,NULL);
+
+ if (!d->handle)
+ {
+ qWarning("QThread::start: Failed to create thread: errno=%d",errno);
+ d->running = FALSE;
+ d->finished = TRUE;
+ return;
+ }
+}
+
+void QThread::terminate()
+{
+ QMutexLocker locker(&d->mutex);
+ if (!d->running) return;
+ TerminateThread(d->handle, 0);
+ d->terminated = TRUE;
+ QThreadPrivate::finish(this);
+}
+
+void QThread::wait()
+{
+ QMutexLocker locker(&d->mutex);
+ if (d->finished || !d->running) return;
+
+ ++d->waiters;
+ locker.mutex()->unlock();
+
+ WaitForSingleObject(d->handle,INFINITE);
+
+ locker.mutex()->lock();
+ --d->waiters;
+ if (!d->finished) // thread was terminated by someone else
+ {
+ d->terminated = TRUE;
+ QThreadPrivate::finish(this);
+ }
+
+ if (d->finished && d->waiters)
+ {
+ CloseHandle(d->handle);
+ d->handle = 0;
+ }
+}
+
+int QThread::idealThreadCount()
+{
+ SYSTEM_INFO sysinfo;
+ GetSystemInfo(&sysinfo);
+ return sysinfo.dwNumberOfProcessors;
+}
+
+
diff --git a/qtools/qtl.doc b/qtools/qtl.doc
new file mode 100644
index 0000000..db5b994
--- /dev/null
+++ b/qtools/qtl.doc
@@ -0,0 +1,249 @@
+/****************************************************************************
+**
+**
+** Qt template library classes documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+/*!
+\page qtl.html
+
+\title Qt Template library
+
+Thq Qt Template Library is a set of templates within Qt dealing with
+containers of objects. It provides a list of objects, a stack of
+objects, a map (or dictionary) from one type to another, and
+associated iterators and algorithms.
+
+Qt also contains similar classes that deal with pointers to objects;
+\l QValueList vs. \l QList, etc. Compared to the pointer-based
+templates, the QTL offers easy copying of the container, real support
+for classes that e.g. require constructors, expand to much more object
+code, can often be a bit faster, require that the objects stored can
+be copied, and finally, have a worse record of compiler problems.
+
+Compared to the STL, the QTL contains only the most important features
+of the STL, has more regular function naming, has no platform
+differences, is often a little slower and often expands to less object
+code.
+
+
+If you can not make copies of the objects you want to store you are
+better off with QCollection and friends. They were designed to handle
+exactly that kind of pointer semantics. This applies for example to
+all classes derived from \l QObject. A QObject does not have a copy
+constructor, so using it as value is impossible. You may choose be
+store pointers to QObjects in a QValueList, but using QList directly
+seems to be the better choice for this kind of application
+domain. QList, like all other QCollection based containers, provides
+far more sanity checking than a speed-optimized value
+based container.
+
+If you have objects that implement value semantics, use the Qt
+template library. Value semantics require at least
+<ul>
+<li>a copy constructor,
+<li>an assignment operator and
+<li> a default constructor, i.e. a constructor that does not take
+any arguments.
+</ul>
+Note that a fast copy constructor is absolutely crucial for a good
+overall performance of the container, since many copy operations are
+going to happen.
+
+Examples for value based classes are QRect, QPoint, QSize and all
+simple C++ types like int, bool or double.
+
+The Qt template library is designed for speed. Especially iterators
+are extremely fast. On the drawback side, less error checking is done
+than in the QCollection based containers. A template library container
+for example does not track associated iterators. This makes certain
+validity checks, like on removing items, impossible to perform
+automatically.
+
+<h2> Iterators </h2>
+
+The Qt template library deals with value objects, not with pointers.
+For that reason, there is no other way of iterating over containers
+than using iterators. This is no disadvantage as the size of an
+iterator matches the size of a normal pointer - 32 or 64 bits
+depending on your CPU architecture.
+
+To iterate over a container, use a loop like this:
+
+\code
+ typedef QValueList<int> List;
+ List l;
+ for( List::Iterator it = l.begin(); it != l.end(); ++it )
+ printf("Number is %i\n",*it);
+\endcode
+
+begin() returns the iterator pointing at the first element, while
+end() returns an iterator that points \e after the last
+element. end() marks an invalid position, it can never be
+dereferenced. It's the break condition in any iteration, may it be
+from begin() or fromLast(). For maximum speed, use increment or
+decrement iterators with the prefix operator (++it, --it) instead of the the
+postfix one (it++, it--), since the former is slightly faster.
+
+The same concept applies to the other container classes:
+
+\code
+ typedef QMap<QString,QString> Map;
+ Map map;
+ for( Map::Iterator it = map.begin(); it != map.end(); ++it )
+ printf("Key=%s Data=%s\n", it.key().ascii(), it.data().ascii() );
+
+ typedef QArray<int> Array;
+ Array array;
+ for( Array::Iterator it = array.begin(); it != array.end(); ++it )
+ printf("Data=%i\n", *it );
+\endcode
+
+There are two kind of iterators, the volatile iterator shown in the
+examples above and a version that returns a const reference to its
+current object, the ConstIterator. Const iterators are required
+whenever the container itself is const, such as a member variable
+inside a const function. Assigning a ConstIterator to a normal
+Iterator is not allowed as it would violate const semantics.
+
+<h2> Algorithms </h2>
+
+The template library defines a number of algorithms that operate on
+its containers: qHeapSort(), qBubbleSort(), qSwap() and
+qCopy(). These algorithms are implemented as template functions.
+
+qHeapSort() and qBubbleSort() provide the well known sorting
+algorithms. You can use them like this:
+
+\code
+ typedef QValueList<int> List;
+ List l;
+ l << 42 << 100 << 1234 << 12 << 8;
+ qHeapSort( l );
+
+ List l2;
+ l2 << 42 << 100 << 1234 << 12 << 8;
+ List::Iterator b = l2.find( 100 );
+ List::Iterator e = l2.find( 8 );
+ qHeapSort( b, e );
+
+ double arr[] = { 3.2, 5.6, 8.9 };
+ qHeapSort( arr, arr + 3 );
+\endcode
+
+The first example sorts the entire list. The second one sorts all
+elements enclosed in the two iterators, namely 100, 1234 and 12. The
+third example shows that iterators act like pointers and can be
+treated as such.
+
+Naturally, the sorting templates won't work with const iterators.
+
+Another utility is qSwap(). It exchanges the values of two variables:
+
+\code
+ QString second( "Einstein" );
+ QString name( "Albert" );
+ qSwap( second, name );
+\endcode
+
+Another template function is qCopy(). It copies a container or a slice
+of it to an OutputIterator, in this case a QTextOStreamIterator:
+
+\code
+ typedef QValueList<int> List;
+ List l;
+ l << 100 << 200 << 300;
+ QTextOStream str( stdout );
+ qCopy( l, QTextOStreamIterator( str ) );
+\endcode
+
+In addition, you can use any Qt template library iterator as the
+OutputIterator. Just make sure that the right hand of the iterator has
+as many elements present as you want to insert. The following example
+illustrates this:
+
+\code
+ QStringList l1, l2;
+ l1 << "Weis" << "Ettrich" << "Arnt" << "Sue";
+ l2 << "Torben" << "Matthias";
+ qCopy( l2, l1.begin();
+\endcode
+
+At the end of this code fragment, the List l1 contains "Torben",
+"Matthias", "Arnt" and "Sue", with the prior contents being
+overwritten. Another flavor of qCopy() takes three arguments to make
+it possible to copy a slice of a container:
+
+\code
+ typedef QValueList<int> List;
+ List l;
+ l << 42 << 100 << 1234 << 12 << 8;
+ List::Iterator b = l.find( 100 );
+ List::Iterator e = l.find( 8 );
+ QTextOStream str( stdout );
+ qCopy( b, e, QTextOStreamIterator( str ) );
+\endcode
+
+If you write new algorithms, consider writing them as template
+functions in order to make them usable with as many containers
+possible. In the above example, you could just as easily print out a
+standard C++ array with qCopy():
+
+\code
+ int arr[] = { 100, 200, 300 };
+ QTextOStream str( stdout );
+ qCopy( arr, arr + 3, QTextOStreamIterator( str ) );
+\endcode
+
+
+<h2> Streaming </h2>
+
+All mentioned containers can be serialized with the respective
+streaming operators. Here is an example.
+
+\code
+ QDataStream str(...);
+ QValueList<QRect> l;
+ // ... fill the list here
+ str << l;
+\endcode
+
+The container can be read in again with:
+
+\code
+ QValueList<QRect> l;
+ str >> l;
+\endcode
+
+The same applies to QStringList, QValueStack and QMap.
+
+*/
diff --git a/qtools/qtl.h b/qtools/qtl.h
new file mode 100644
index 0000000..bd72e7d
--- /dev/null
+++ b/qtools/qtl.h
@@ -0,0 +1,223 @@
+/****************************************************************************
+**
+**
+** Definition of Qt template library classes
+**
+** Created : 990128
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+#ifndef QTL_H
+#define QTL_H
+
+#ifndef QT_H
+#include "qtextstream.h"
+#include "qstring.h"
+#endif // QT_H
+
+#ifndef QT_NO_TEXTSTREAM
+template <class T>
+class QTextOStreamIterator
+{
+protected:
+ QTextOStream& stream;
+ QString separator;
+
+public:
+ QTextOStreamIterator( QTextOStream& s) : stream( s ) {}
+ QTextOStreamIterator( QTextOStream& s, const QString& sep )
+ : stream( s ), separator( sep ) {}
+ QTextOStreamIterator<T>& operator= ( const T& x ) {
+ stream << x;
+ if ( !separator.isEmpty() )
+ stream << separator;
+ return *this;
+ }
+ QTextOStreamIterator<T>& operator*() { return *this; }
+ QTextOStreamIterator<T>& operator++() { return *this; }
+ QTextOStreamIterator<T>& operator++(int) { return *this; }
+};
+#endif //QT_NO_TEXTSTREAM
+
+template <class InputIterator, class OutputIterator>
+inline OutputIterator qCopy( InputIterator _begin, InputIterator _end,
+ OutputIterator _dest )
+{
+ while( _begin != _end )
+ *_dest++ = *_begin++;
+ return _dest;
+}
+
+
+template <class T>
+inline void qSwap( T& _value1, T& _value2 )
+{
+ T tmp = _value1;
+ _value1 = _value2;
+ _value2 = tmp;
+}
+
+
+template <class InputIterator>
+inline void qBubbleSort( InputIterator b, InputIterator e )
+{
+ // Goto last element;
+ InputIterator last = e;
+ --last;
+ // only one element or no elements ?
+ if ( last == b )
+ return;
+
+ // So we have at least two elements in here
+ while( b != last ) {
+ bool swapped = FALSE;
+ InputIterator swap_pos = b;
+ InputIterator x = e;
+ InputIterator y = x;
+ y--;
+ do {
+ --x;
+ --y;
+ if ( *x < *y ) {
+ swapped = TRUE;
+ qSwap( *x, *y );
+ swap_pos = y;
+ }
+ } while( y != b );
+ if ( !swapped )
+ return;
+ b = swap_pos;
+ b++;
+ }
+}
+
+
+template <class Container>
+inline void qBubbleSort( Container &c )
+{
+ qBubbleSort( c.begin(), c.end() );
+}
+
+
+template <class Value>
+inline void qHeapSortPushDown( Value* heap, int first, int last )
+{
+ int r = first;
+ while( r <= last/2 ) {
+ // Node r has only one child ?
+ if ( last == 2*r ) {
+ // Need for swapping ?
+ if ( heap[r] > heap[ 2*r ] )
+ qSwap( heap[r], heap[ 2*r ] );
+ // That's it ...
+ r = last;
+ } else { // Node has two children
+ if ( heap[r] > heap[ 2*r ] && heap[ 2*r ] <= heap[ 2*r+1 ] ) {
+ // Swap with left child
+ qSwap( heap[r], heap[ 2*r ] );
+ r *= 2;
+ } else if ( heap[r] > heap[ 2*r+1 ] &&
+ heap[ 2*r+1 ] < heap[ 2*r ] ) {
+ // Swap with right child
+ qSwap( heap[r], heap[ 2*r+1 ] );
+ r = 2*r+1;
+ } else {
+ // We are done
+ r = last;
+ }
+ }
+ }
+}
+
+
+template <class InputIterator, class Value>
+inline void qHeapSortHelper( InputIterator b, InputIterator e, Value, uint n )
+{
+ // Create the heap
+ InputIterator insert = b;
+ Value* realheap = new Value[ n ];
+ // Wow, what a fake. But I want the heap to be indexed as 1...n
+ Value* heap = realheap - 1;
+ int size = 0;
+ for( ; insert != e; ++insert ) {
+ heap[++size] = *insert;
+ int i = size;
+ while( i > 1 && heap[i] < heap[ i / 2 ] ) {
+ qSwap( heap[i], heap[ i / 2 ] );
+ i /= 2;
+ }
+ }
+
+ // Now do the sorting
+ for( uint i = n; i > 0; i-- ) {
+ *b++ = heap[1];
+ if ( i > 1 ) {
+ heap[1] = heap[i];
+ qHeapSortPushDown( heap, 1, (int)i - 1 );
+ }
+ }
+
+ delete[] realheap;
+}
+
+
+template <class InputIterator>
+inline void qHeapSort( InputIterator b, InputIterator e )
+{
+ // Empty ?
+ if ( b == e )
+ return;
+
+ // How many entries have to be sorted ?
+ InputIterator it = b;
+ uint n = 0;
+ while ( it != e ) {
+ ++n;
+ ++it;
+ }
+
+ // The second last parameter is a hack to retrieve the value type
+ // Do the real sorting here
+ qHeapSortHelper( b, e, *b, n );
+}
+
+
+template <class Container>
+inline void qHeapSort( Container &c )
+{
+ if ( c.isEmpty() )
+ return;
+
+ // The second last parameter is a hack to retrieve the value type
+ // Do the real sorting here
+ qHeapSortHelper( c.begin(), c.end(), *(c.begin()), c.count() );
+}
+
+#endif
diff --git a/qtools/qtools.pro b/qtools/qtools.pro
new file mode 100644
index 0000000..82cd65a
--- /dev/null
+++ b/qtools/qtools.pro
@@ -0,0 +1,107 @@
+#
+# This file was generated from qtools.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+TEMPLATE = lib
+CONFIG = warn_on staticlib debug
+HEADERS = qarray.h \
+ qbuffer.h \
+ qcache.h \
+ qgcache.h \
+ qcollection.h \
+ qconfig.h \
+ qcstring.h \
+ scstring.h \
+ qdatastream.h \
+ qdatetime.h \
+ qdict.h \
+ qdir.h \
+ qfeatures.h \
+ qfile.h \
+ qfiledefs_p.h \
+ qfileinfo.h \
+ qgarray.h \
+ qfeatures.h \
+ qgdict.h \
+ qgeneric.h \
+ qglist.h \
+ qglobal.h \
+ qgstring.h \
+ qgvector.h \
+ qintdict.h \
+ qiodevice.h \
+ qlist.h \
+ qptrdict.h \
+ qqueue.h \
+ qregexp.h \
+ qshared.h \
+ qsortedlist.h \
+ qstack.h \
+ qstring.h \
+ qstringlist.h \
+ qstrlist.h \
+ qstrvec.h \
+ qtextstream.h \
+ qtl.h \
+ qvaluelist.h \
+ qvector.h \
+ qxml.h \
+ qvaluestack.h \
+ qmap.h \
+ qmodules.h \
+ qthread.h \
+ qthread_p.h \
+ qmutex.h \
+ qmutex_p.h \
+ qutfcodec.h \
+ qwaitcondition.h
+
+SOURCES = qbuffer.cpp \
+ qcollection.cpp \
+ scstring.cpp \
+ qdatastream.cpp \
+ qdatetime.cpp \
+ qdir.cpp \
+ qfile.cpp \
+ qfileinfo.cpp \
+ qgarray.cpp \
+ qgcache.cpp \
+ qgdict.cpp \
+ qglist.cpp \
+ qglobal.cpp \
+ qgstring.cpp \
+ qgvector.cpp \
+ qiodevice.cpp \
+ qregexp.cpp \
+ qstring.cpp \
+ qtextstream.cpp \
+ qtextcodec.cpp \
+ qstringlist.cpp \
+ qxml.cpp \
+ qmap.cpp \
+ qthread.cpp \
+ qmutex.cpp \
+ qutfcodec.cpp
+
+unix:SOURCES += qfile_unix.cpp \
+ qdir_unix.cpp \
+ qfileinfo_unix.cpp \
+ qthread_unix.cpp \
+ qmutex_unix.cpp \
+ qwaitcondition_unix.cpp
+
+win32:SOURCES += qfile_win32.cpp \
+ qdir_win32.cpp \
+ qfileinfo_win32.cpp \
+ qthread_win32.cpp \
+ qmutex_win32.cpp \
+ qwaitcondition_win32.cpp
+
+INCLUDEPATH = .
+#TMAKE_CXXFLAGS += -DQT_NO_CODECS -DQT_LITE_UNICODE
+TMAKE_CXXFLAGS += -DQT_LITE_UNICODE
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+win32-g++:TMAKE_CXXFLAGS += -D__CYGWIN__ -DALL_STATIC
+OBJECTS_DIR = ../objects
+DESTDIR = ../lib
+TMAKE_MOC = /usr/bin/moc
diff --git a/qtools/qtools.pro.in b/qtools/qtools.pro.in
new file mode 100644
index 0000000..3eabed9
--- /dev/null
+++ b/qtools/qtools.pro.in
@@ -0,0 +1,102 @@
+TEMPLATE = lib
+CONFIG = warn_on staticlib $extraopts
+HEADERS = qarray.h \
+ qbuffer.h \
+ qcache.h \
+ qgcache.h \
+ qcollection.h \
+ qconfig.h \
+ qcstring.h \
+ scstring.h \
+ qdatastream.h \
+ qdatetime.h \
+ qdict.h \
+ qdir.h \
+ qfeatures.h \
+ qfile.h \
+ qfiledefs_p.h \
+ qfileinfo.h \
+ qgarray.h \
+ qfeatures.h \
+ qgdict.h \
+ qgeneric.h \
+ qglist.h \
+ qglobal.h \
+ qgstring.h \
+ qgvector.h \
+ qintdict.h \
+ qiodevice.h \
+ qlist.h \
+ qptrdict.h \
+ qqueue.h \
+ qregexp.h \
+ qshared.h \
+ qsortedlist.h \
+ qstack.h \
+ qstring.h \
+ qstringlist.h \
+ qstrlist.h \
+ qstrvec.h \
+ qtextstream.h \
+ qtl.h \
+ qvaluelist.h \
+ qvector.h \
+ qxml.h \
+ qvaluestack.h \
+ qmap.h \
+ qmodules.h \
+ qthread.h \
+ qthread_p.h \
+ qmutex.h \
+ qmutex_p.h \
+ qutfcodec.h \
+ qwaitcondition.h
+
+SOURCES = qbuffer.cpp \
+ qcollection.cpp \
+ scstring.cpp \
+ qdatastream.cpp \
+ qdatetime.cpp \
+ qdir.cpp \
+ qfile.cpp \
+ qfileinfo.cpp \
+ qgarray.cpp \
+ qgcache.cpp \
+ qgdict.cpp \
+ qglist.cpp \
+ qglobal.cpp \
+ qgstring.cpp \
+ qgvector.cpp \
+ qiodevice.cpp \
+ qregexp.cpp \
+ qstring.cpp \
+ qtextstream.cpp \
+ qtextcodec.cpp \
+ qstringlist.cpp \
+ qxml.cpp \
+ qmap.cpp \
+ qthread.cpp \
+ qmutex.cpp \
+ qutfcodec.cpp
+
+unix:SOURCES += qfile_unix.cpp \
+ qdir_unix.cpp \
+ qfileinfo_unix.cpp \
+ qthread_unix.cpp \
+ qmutex_unix.cpp \
+ qwaitcondition_unix.cpp
+
+win32:SOURCES += qfile_win32.cpp \
+ qdir_win32.cpp \
+ qfileinfo_win32.cpp \
+ qthread_win32.cpp \
+ qmutex_win32.cpp \
+ qwaitcondition_win32.cpp
+
+INCLUDEPATH = .
+#TMAKE_CXXFLAGS += -DQT_NO_CODECS -DQT_LITE_UNICODE
+TMAKE_CXXFLAGS += -DQT_LITE_UNICODE
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+win32-g++:TMAKE_CXXFLAGS += -D__CYGWIN__ -DALL_STATIC
+OBJECTS_DIR = ../objects
+DESTDIR = ../lib
diff --git a/qtools/qutfcodec.cpp b/qtools/qutfcodec.cpp
new file mode 100644
index 0000000..239c092
--- /dev/null
+++ b/qtools/qutfcodec.cpp
@@ -0,0 +1,276 @@
+/****************************************************************************
+** $Id: qt/src/tools/qutfcodec.cpp 2.3.2 edited 2001-01-26 $
+**
+** Implementation of QEucCodec class
+**
+** Created : 981015
+**
+** Copyright (C)1998-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "qutfcodec.h"
+
+#ifndef QT_NO_TEXTCODEC
+
+int QUtf8Codec::mibEnum() const
+{
+ return 106;
+}
+
+QCString QUtf8Codec::fromUnicode(const QString& uc, int& len_in_out) const
+{
+ int l = QMIN((int)uc.length(),len_in_out);
+ int rlen = l*3+1;
+ QCString rstr(rlen);
+ uchar* cursor = (uchar*)rstr.data();
+ for (int i=0; i<l; i++) {
+ QChar ch = uc[i];
+ if ( !ch.row() && ch.cell() < 0x80 ) {
+ *cursor++ = ch.cell();
+ } else {
+ uchar b = (ch.row() << 2) | (ch.cell() >> 6);
+ if ( ch.row() < 0x08 ) {
+ *cursor++ = 0xc0 | b;
+ } else {
+ *cursor++ = 0xe0 | (ch.row() >> 4);
+ *cursor++ = 0x80 | (b&0x3f);
+ }
+ *cursor++ = 0x80 | (ch.cell()&0x3f);
+ }
+ }
+ len_in_out = cursor - (uchar*)rstr.data();
+ rstr.truncate(len_in_out);
+ return rstr;
+}
+
+const char* QUtf8Codec::name() const
+{
+ return "UTF-8";
+}
+
+int QUtf8Codec::heuristicContentMatch(const char* chars, int len) const
+{
+ int score = 0;
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ // No nulls allowed.
+ if ( !ch )
+ return -1;
+ if ( ch < 128 ) {
+ // Inconclusive
+ score++;
+ } else if ( (ch&0xe0) == 0xc0 ) {
+ if ( i < len-1 ) {
+ uchar c2 = chars[++i];
+ if ( (c2&0xc0) != 0x80 )
+ return -1;
+ score+=3;
+ }
+ } else if ( (ch&0xf0) == 0xe0 ) {
+ if ( i < len-1 ) {
+ uchar c2 = chars[++i];
+ if ( (c2&0xc0) != 0x80 ) {
+ return -1;
+#if 0
+ if ( i < len-1 ) {
+ uchar c3 = chars[++i];
+ if ( (c3&0xc0) != 0x80 )
+ return -1;
+ score+=3;
+ }
+#endif
+ }
+ score+=2;
+ }
+ }
+ }
+ return score;
+}
+
+
+
+
+class QUtf8Decoder : public QTextDecoder {
+ ushort uc;
+ int need;
+public:
+ QUtf8Decoder() : need(0)
+ {
+ }
+
+ QString toUnicode(const char* chars, int len)
+ {
+ QString result;
+ for (int i=0; i<len; i++) {
+ uchar ch = chars[i];
+ if (need) {
+ if ( (ch&0xc0) == 0x80 ) {
+ uc = (uc << 6) | (ch & 0x3f);
+ need--;
+ if ( !need ) {
+ result += QChar(uc);
+ }
+ } else {
+ // error
+ result += QChar::replacement;
+ need = 0;
+ }
+ } else {
+ if ( ch < 128 ) {
+ result += QChar(ch);
+ } else if ( (ch&0xe0) == 0xc0 ) {
+ uc = ch &0x1f;
+ need = 1;
+ } else if ( (ch&0xf0) == 0xe0 ) {
+ uc = ch &0x0f;
+ need = 2;
+ }
+ }
+ }
+ return result;
+ }
+};
+
+QTextDecoder* QUtf8Codec::makeDecoder() const
+{
+ return new QUtf8Decoder;
+}
+
+
+
+
+
+
+int QUtf16Codec::mibEnum() const
+{
+ return 1000;
+}
+
+const char* QUtf16Codec::name() const
+{
+ return "ISO-10646-UCS-2";
+}
+
+int QUtf16Codec::heuristicContentMatch(const char* chars, int len) const
+{
+ uchar* uchars = (uchar*)chars;
+ if ( len >= 2 && ((uchars[0] == 0xff && uchars[1] == 0xfe) ||
+ (uchars[1] == 0xff && uchars[0] == 0xfe)) )
+ return len;
+ else
+ return 0;
+}
+
+
+
+
+class QUtf16Encoder : public QTextEncoder {
+ bool headerdone;
+public:
+ QUtf16Encoder() : headerdone(FALSE)
+ {
+ }
+
+ QCString fromUnicode(const QString& uc, int& len_in_out)
+ {
+ if ( headerdone ) {
+ len_in_out = uc.length()*sizeof(QChar);
+ QCString d(len_in_out);
+ memcpy(d.data(),uc.unicode(),len_in_out);
+ return d;
+ } else {
+ headerdone = TRUE;
+ len_in_out = (1+uc.length())*sizeof(QChar);
+ QCString d(len_in_out);
+ memcpy(d.data(),&QChar::byteOrderMark,sizeof(QChar));
+ memcpy(d.data()+sizeof(QChar),uc.unicode(),uc.length()*sizeof(QChar));
+ return d;
+ }
+ }
+};
+
+class QUtf16Decoder : public QTextDecoder {
+ uchar buf;
+ bool half;
+ bool swap;
+ bool headerdone;
+
+public:
+ QUtf16Decoder() : half(FALSE), swap(FALSE), headerdone(FALSE)
+ {
+ }
+
+ QString toUnicode(const char* chars, int len)
+ {
+ QString r;
+
+ while ( len-- ) {
+ if ( half ) {
+ QChar ch;
+ if ( swap ) {
+ ch.row() = *chars++;
+ ch.cell() = buf;
+ } else {
+ ch.row() = buf;
+ ch.cell() = *chars++;
+ }
+ if ( !headerdone ) {
+ if ( ch == QChar::byteOrderSwapped ) {
+ swap = !swap;
+ } else if ( ch == QChar::byteOrderMark ) {
+ // Ignore ZWNBSP
+ } else {
+ r += ch;
+ }
+ headerdone = TRUE;
+ } else
+ r += ch;
+ half = FALSE;
+ } else {
+ buf = *chars++;
+ half = TRUE;
+ }
+ }
+
+ return r;
+ }
+};
+
+QTextDecoder* QUtf16Codec::makeDecoder() const
+{
+ return new QUtf16Decoder;
+}
+
+QTextEncoder* QUtf16Codec::makeEncoder() const
+{
+ return new QUtf16Encoder;
+}
+
+#endif // QT_NO_TEXTCODEC
diff --git a/qtools/qutfcodec.h b/qtools/qutfcodec.h
new file mode 100644
index 0000000..83fab12
--- /dev/null
+++ b/qtools/qutfcodec.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+** $Id: qt/src/tools/qutfcodec.h 2.3.2 edited 2001-01-26 $
+**
+** Definition of QEucCodec class
+**
+** Created : 981015
+**
+** Copyright (C) 1998-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QUTFCODEC_H
+#define QUTFCODEC_H
+
+#ifndef QT_H
+#include "qtextcodec.h"
+#endif // QT_H
+
+#ifndef QT_NO_TEXTCODEC
+
+class Q_EXPORT QUtf8Codec : public QTextCodec {
+public:
+ virtual int mibEnum() const;
+ const char* name() const;
+
+ QTextDecoder* makeDecoder() const;
+
+ QCString fromUnicode(const QString& uc, int& len_in_out) const;
+
+ int heuristicContentMatch(const char* chars, int len) const;
+};
+
+class Q_EXPORT QUtf16Codec : public QTextCodec {
+public:
+ virtual int mibEnum() const;
+ const char* name() const;
+
+ QTextDecoder* makeDecoder() const;
+ QTextEncoder* makeEncoder() const;
+
+ int heuristicContentMatch(const char* chars, int len) const;
+};
+
+#endif //QT_NO_TEXTCODEC
+#endif // QUTFCODEC_H
diff --git a/qtools/qvaluelist.doc b/qtools/qvaluelist.doc
new file mode 100644
index 0000000..e4621d5
--- /dev/null
+++ b/qtools/qvaluelist.doc
@@ -0,0 +1,772 @@
+/****************************************************************************
+**
+**
+** QValueList and QValueListIterator class documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+
+/*****************************************************************************
+ QValueList documentation
+ *****************************************************************************/
+
+/*!
+ \class QValueList qvaluelist.h
+ \brief The QValueList class is a value based template class that provides doubly linked lists.
+
+ \ingroup qtl
+ \ingroup tools
+ \ingroup shared
+
+ Define a template instance QValueList\<X\> to create a list of values which all
+ have the class X. Please notice that QValueList does not store pointers to the
+ members of the list. It holds a copy of every member. That is the reason why this
+ kind of classes are called "value based" while QList and QDict are "reference based".
+
+ Some classes can not be used within a QValueList, for example everything
+ derived from QObject and thus all classes that implement widgets.
+ Only values can be used in a QValueList. To qualify as a value, the class
+ must provide
+ <ul>
+ <li>a copy constructor,
+ <li>an assignment operator and
+ <li> a default constructor, i.e. a constructor that does not take any arguments.
+ </ul>
+
+ Note that C++ defaults to field-by-field assignment operators and
+ copy constructors if no explicit version is supplied. In many cases,
+ this is sufficient.
+
+ Example:
+ \code
+ #include <qvaluelist.h>
+ #include <qstring.h>
+ #include <stdio.h>
+
+ class Employee
+ {
+ public:
+ Employee(): s(0) {}
+ Employee( const QString& name, int salary )
+ : n(name), s(salary)
+ {}
+
+ QString name() const { return n; }
+ int salary() const { return s; }
+ void setSalary( int salary ) { s = salary; }
+ private:
+ QString n;
+ int s;
+ };
+
+ void main()
+ {
+ typedef QValueList<Employee> EmployeeList;
+ EmployeeList list; // list of Employee
+
+ list.append( Employee("Bill", 50000) );
+ list.append( Employee("Steve",80000) );
+ list.append( Employee("Ron", 60000) );
+
+ Employee joe( "Joe", 50000 );
+ list.append( joe );
+ joe.setSalary( 4000 );
+
+ EmployeeList::Iterator it;
+ for( it = list.begin(); it != list.end(); ++it )
+ printf( "%s earns %d\n", (*it).name().latin1(), (*it).salary().latin1() );
+ }
+ \endcode
+
+ Program output:
+ \code
+ Bill earns 50000
+ Steve earns 80000
+ Ron earns 60000
+ Joe earns 50000
+ \endcode
+
+ As you can see, the latest changes to Joes salary did not affect the value
+ in the list because the list created a copy of Joes entry.
+
+ There are three ways of finding items in the list. The first one is by using
+ the at() function. It returns an iterator. The advantages of
+ getting an iterator is that you can now move forward or backward from this
+ position by incrementing/decrementing the iterator. To get the amount of
+ items in the list call count(). Valid indices are 0..count().
+
+ The second way of accessing a list is with operator[]. That means you can address
+ it like an array. The return value is a reference to the value stored in the list.
+ There exist two versions of this operator. The first one is const and returns a
+ const reference to the value. The second on is non const and returns a non const
+ reference to the value. It is up to your compiler to choose the correct one.
+
+ The third method is to use the functions begin() and end().
+ With a simple for loop as shown in the example you can iterate over the complete list.
+ It is save to have multiple iterators at the same time. If some member of the list is
+ removed then only iterators pointing to the removed member become invalid. Inserting in
+ the list does not invalidate any iterator. For convenience the function last() returns
+ an iterator for the last and first() for the first element in the list.
+
+ In addition you can search items in the list with the find() function. It exists in a const
+ and a non const version. It starts searching from the beginning of the list, but another
+ flavor of the find() function allows you to specify where searching should start.
+ If you just want to know wether a certain item is at least once in the list, then you
+ can use the contains() function.
+
+ Since QValueList is value based there is no need to care about deleting elements in the
+ list. The list holds its own copies and will free them if the corresponding member or
+ the list itself is deleted. You can force the list to free all of its item with clear().
+
+ QValueList is implicitly shared. That means you can just make copies of the list
+ in time O(1). If multiple QValueList instances share the same data and one
+ is doing a modification of the lists data then this modifying instance makes a copy
+ and modifies its private copy. So it does not affect the other instances.
+ From a developers point of view you can think that a QValueList and a copy of this
+ list have nothing to do with each other. Developers may only notice that copying is
+ very fast. People known to a CPUs MMU architecture will know this pattern as "copy on write".
+
+ There exist three functions to insert items in the list. append()
+ inserts an item at the end, prepend() inserts at the beginning
+ and insert() inserts in front of the position given by an iterator.
+
+ Items can be removed from the list in two ways. The first is to pass an iterator to
+ the remove(). The other possibility is to pass a value to remove() which will
+ delete all members which match this value.
+
+ Lists can be sorted with the algorithms provided by the <a
+ href="qtl.html">Qt Template Library</a>, for example with
+ qHeapSort():
+
+ Example:
+ \code
+ QValueList l;
+ l.append( 5 );
+ l.append( 8 );
+ l.append( 3 );
+ l.append( 4 );
+ qHeapSort( l );
+ \endcode
+
+ \sa QValueListIterator
+*/
+
+
+/*!
+ \fn QValueList::QValueList()
+ Constructs an empty list.
+*/
+
+/*!
+ \fn QValueList::QValueList( const QValueList<T>& l )
+ Constructs a copy of \e l.
+
+ This operation costs O(1) time since QValueList is implicit shared.
+ The first instance applying modifications to a shared list will create
+ a copy which takes in turn O(n) time. However returning a QValueList from
+ a function is very fast.
+*/
+
+/*!
+ \fn QValueList::~QValueList()
+ Destroys the list. References to the values in the list and all iterators
+ of this list become invalidated. Since QValueList is highly tuned for performance
+ you wont see warnings if you use invalid iterators,
+ because it is impossible for
+ an iterator to check wether it is valid or not.
+*/
+
+/*!
+ \fn QValueList<T>& QValueList::operator= ( const QValueList<T>& l )
+ Assigns \e l to this list and returns a reference to this list.
+
+ All iterators of the current list become invalidated by this operation.
+ The cost of such an assignment is O(1) since QValueList is implicitly shared.
+*/
+
+/*!
+ \fn QValueList<T> QValueList::operator+ ( const QValueList<T>& l ) const
+ Creates a new list and fills it with the elements of this list. Then the
+ elements of \e l are appended.
+
+ Returns the new list.
+*/
+
+/*!
+ \fn QValueList<T>& QValueList::operator+= ( const QValueList<T>& l )
+ Adds \e list to this list.
+
+ Returns a reference to this list.
+*/
+
+/*!
+ \fn bool QValueList::operator== ( const QValueList<T>& l ) const
+ Compares both lists.
+
+ Returns TRUE if both list are equal.
+*/
+
+/*!
+ \fn bool QValueList::operator!= ( const QValueList<T>& l ) const
+ Compares both lists.
+
+ Returns TRUE if both list are unequal.
+*/
+
+/*!
+ \fn QValueList<T>& QValueList::operator+= ( const T& x )
+ Adds the value \e x to the end of the list.
+
+ Returns a reference to the list.
+*/
+
+/*!
+ \fn QValueList<T>& QValueList::operator<< ( const T& x )
+ Adds the value \e x to the end of the list.
+
+ Returns a reference to the list.
+*/
+
+/*!
+ \fn const T& QValueList::operator[] ( uint i ) const
+ Returns a const reference to the item with index \e i in the list.
+ It is up to you to check wether this item really exists. You can do that easily
+ with the count() function. However this operator does not check wether \e i
+ is in range and will deliver undefined results if it does not exist.
+*/
+
+/*!
+ \fn T& QValueList::operator[] ( uint i )
+ Returns a reference to the item with index \e i in the list.
+ It is up to you to check wether this item really exists. You can do that easily
+ with the count() function. However this operator does not check wether \e i
+ is in range and will deliver undefined results if it does not exist.
+ In contrast to the const operator[] you may manipulate the value returned by this
+ operator.
+*/
+
+/*!
+ \fn uint QValueList::count() const
+ Returns the number of items in the list.
+ \sa isEmpty()
+*/
+
+/*!
+ \fn bool QValueList::isEmpty() const
+ Returns TRUE if the list is empty, i.e. count() == 0. Returns FALSE
+ otherwise.
+ \sa count()
+*/
+
+/*!
+ \fn Iterator QValueList::insert( Iterator it, const T& x )
+ Inserts the value \e x in front of the iterator \e it.
+
+ Returns an iterator pointing at the inserted item.
+
+ \sa append(), prepend()
+*/
+
+/*!
+ \fn Iterator QValueList::append( const T& x )
+ Inserts the value \e x at the end of the list.
+
+ Returns an iterator pointing at the inserted item.
+
+ \sa insert(), prepend()
+*/
+
+/*!
+ \fn Iterator QValueList::prepend( const T& x )
+ Inserts the value \e x at the beginning of the list.
+
+ Returns an iterator pointing at the inserted item.
+
+ \sa insert(), append()
+*/
+
+/*!
+ \fn Iterator QValueList::remove( Iterator it )
+ Removes the item at position \e it in the list.
+
+ Returns an iterator pointing to the item following the
+ removed on or end() if the last item was deleted.
+
+ \sa clear()
+*/
+
+/*!
+ \fn void QValueList::remove( const T& x )
+ Removes all items which have the value \e x.
+
+ \sa clear()
+*/
+
+/*!
+ \fn void QValueList::clear()
+ Removes all items from the list.
+
+ \sa remove()
+*/
+
+/*!
+ \fn Iterator QValueList::find( const T& x )
+ Finds the first occurrence of \e x in the list.
+
+ Returns end() if no item did match.
+*/
+
+/*!
+ \fn ConstIterator QValueList::find( const T& x ) const
+ Finds the first occurrence of \e x in the list.
+
+ Returns end() if no item did match.
+*/
+
+/*!
+ \fn Iterator QValueList::find( Iterator it, const T& x )
+ Finds the first occurrence of \e x in the list starting at
+ the position given by \e it.
+
+ Returns end() if no item did match.
+*/
+
+/*!
+ \fn ConstIterator QValueList::find( ConstIterator it, const T& x ) const
+ Finds the first occurrence of \e x in the list starting at
+ the position given by \e it.
+
+ Returns end() if no item did match.
+*/
+
+/*!
+ \fn uint QValueList::contains( const T& x ) const
+ Counts and returns the number of occurrences of the value \e x in the list.
+*/
+
+/*!
+ \fn int QValueList::findIndex( const T& x ) const
+ Returns the first index of the value \e x in the list or -1 if no such value
+ can be found in the list.
+*/
+
+/*!
+ \fn Iterator QValueList::at( uint i )
+ Returns an iterator pointing to the item at position \e i in the list, or
+ end() if the index is out of range.
+*/
+
+/*!
+ \fn ConstIterator QValueList::at( uint i ) const
+ Returns an iterator pointing to the item at position \e i in the list, or
+ end() if the index is out of range.
+*/
+
+/*!
+ \fn T& QValueList::first()
+ Returns a reference to the first item in the list or the item
+ referenced by end()
+ if no such items exists. Please note that you may not change
+ the value the end() Iterator is pointing to.
+
+ \sa begin(), last()
+*/
+
+/*!
+ \fn const T& QValueList::first() const
+ Returns a reference to the first item in the list or the item
+ referenced by end() if
+ no such items exists.
+
+ \sa begin(), last()
+*/
+
+/*!
+ \fn Iterator QValueList::fromLast()
+ Returns an iterator pointing to the last element in the list or
+ end() if no such item exists.
+
+ \sa last()
+*/
+
+/*!
+ \fn ConstIterator QValueList::fromLast() const
+ Returns an iterator pointing to the last element in the list or
+ end() if no such item exists.
+
+ \sa last()
+*/
+
+/*!
+ \fn T& QValueList::last()
+ Returns a reference to the last item in the list or the item
+ referenced by end() if no
+ such item exists. Please note that you may not change
+ the value the end() Iterator is pointing to.
+
+ \sa end(), first(), fromLast()
+*/
+
+/*!
+ \fn const T& QValueList::last() const
+ Returns a reference to the last item in the list or the item
+ referenced by end() if no such item exists.
+
+ \sa end(), first(), fromLast()
+*/
+
+/*!
+ \fn Iterator QValueList::begin()
+ Returns an iterator pointing to the first element in the list. This
+ iterator equals end() if the list is empty;
+ \sa first(), end()
+*/
+
+/*!
+ \fn ConstIterator QValueList::begin() const
+ Returns an iterator pointing to the first element in the list. This
+ iterator equals end() if the list is empty;
+ \sa first(), end()
+*/
+
+/*!
+ \fn Iterator QValueList::end()
+ Returns an iterator pointing behind the last element in the list. This
+ iterator equals begin() if the list is empty.
+
+ \sa last(), begin()
+*/
+
+/*!
+ \fn ConstIterator QValueList::end() const
+ Returns an iterator pointing behind the last element in the list. This
+ iterator equals begin() if the list is empty.
+
+ \sa last(), begin()
+*/
+
+/*!
+ \fn void QValueList::detach()
+ If the list does not share its data with another QValueList instance, then nothing
+ happens, otherwise the function creates a new copy of this data and detaches
+ from the shared one. This function is called whenever the list is modified.
+ The implicit sharing mechanism is implemented this way.
+*/
+
+/*!
+ \fn QDataStream& operator>>( QDataStream& s, QValueList<T>& l )
+ \relates QValueList
+ Reads a list from the stream. The type \e T stored in the list must implement
+ the streaming operator, too.
+*/
+
+/*!
+ \fn QDataStream& operator<<( QDataStream& s, const QValueList<T>& l )
+ \relates QValueList
+ Writes a list to the stream. The type \e T stored in the list must implement
+ the streaming operator, too.
+*/
+
+/*****************************************************************************
+ QValueListIterator documentation
+ *****************************************************************************/
+
+/*!
+ \class QValueListIterator qvaluelist.h
+ \brief The QValueListIterator class provides an iterator for QValueList.
+
+ \ingroup qtl
+ \ingroup tools
+
+ You can not create an iterator by yourself. Instead you have to
+ ask a list to give you one. An iterator has only the size of a pointer.
+ On 32 bit machines that means 4 bytes otherwise 8 bytes. That makes them
+ very fast. In fact they resemble the semantics of pointers as good as possible
+ and they are almost as fast as usual pointers.
+
+ Example:
+ \code
+ #include <qvaluelist.h>
+ #include <qstring.h>
+ #include <stdio.h>
+
+ class Employee
+ {
+ public:
+ Employee(): s(0) {}
+ Employee( const QString& name, int salary )
+ : n(name), s(salary)
+ {}
+
+ QString name() const { return n; }
+ int salary() const { return s; }
+ void setSalary( int salary ) { s = salary; }
+ private:
+ QString n;
+ int s;
+ };
+
+ void main()
+ {
+ typedef QValueList<Employee> EmployeeList;
+ EmployeeList list; // list of Employee
+
+ list.append( Employee("Bill", 50000) );
+ list.append( Employee("Steve",80000) );
+ list.append( Employee("Ron", 60000) );
+
+ Employee joe( "Joe", 50000 );
+ list.append( joe );
+ joe.setSalary( 4000 );
+
+ EmployeeList::Iterator it;
+ for( it = list.begin(); it != list.end(); ++it )
+ printf( "%s earns %d\n", (*it).name().latin1(), (*it).salary() );
+ }
+ \endcode
+
+ Program output:
+ \code
+ Bill earns 50000
+ Steve earns 80000
+ Ron earns 60000
+ Joe earns 50000
+ \endcode
+
+ In contrast to QList there are no built in functions in QValueList to
+ traverse the list. The only way to do this is to use iterators.
+ QValueList is highly optimized for performance and memory usage.
+ On the other hand that means that you have to be a bit more careful
+ by what you are doing. QValueList does not know about all its iterators
+ and the iterators dont even know to which list they belong. That makes
+ things fast and slim but a bit dangerous because it is up to you to make
+ sure that iterators you are using are still valid. QListIterator will be able
+ to give warnings while QValueListIterator may end up in an undefined state.
+
+ For every Iterator there is a ConstIterator. When accessing a QValueList
+ in a const environment or if the reference or pointer to the list is itself
+ const, then you have to use the ConstIterator. Its semantics are the same,
+ but it returns only const references to the item it points to.
+
+ \sa QValueList, QValueListConstIterator
+*/
+
+/*!
+ \fn QValueListIterator::QValueListIterator()
+ Creates un uninitialized iterator.
+*/
+
+/*!
+ \fn QValueListIterator::QValueListIterator( NodePtr p )
+ Internal function.
+*/
+
+/*!
+ \fn QValueListIterator::QValueListIterator( const QValueListIterator<T>& it )
+ Constructs a copy of the iterator \e it.
+*/
+
+/*!
+ \fn QValueListIterator::~QValueListIterator()
+ Destroys the iterator.
+*/
+
+/* Unfortunately not with MSVC
+ \fn T *QValueListIterator::operator->()
+ Pointer operator. Returns a pointer to the current iterator item.
+ The great advantage of this operator is that you can treat the
+ iterator like a pointer.
+
+ Example:
+ \code
+ QValueList<int>::Iterator it = list.begin();
+ for( ; it != end(); ++it )
+ it->show();
+ \endcode
+*/
+
+/*!
+ \fn T& QValueListIterator::operator*()
+ Asterix operator. Returns a reference to the current iterator item.
+*/
+
+/*!
+ \fn const T& QValueListIterator::operator*() const
+ Asterix operator. Returns a reference to the current iterator item.
+*/
+
+/*!
+ \fn QValueListIterator<T>& QValueListIterator::operator++()
+ Prefix ++ makes the succeeding item current and returns
+ an iterator pointing to the new current item.
+ The iterator can not check wether it reached the end of the list. Incrementing
+ the iterator as returned by end() causes undefined results.
+*/
+
+/*!
+ \fn QValueListIterator<T> QValueListIterator::operator++(int)
+ Postfix ++ makes the succeeding item current and returns
+ an iterator pointing to the new current item.
+ The iterator can not check wether it reached the end of the list. Incrementing
+ the iterator as returned by end() causes undefined results.
+*/
+
+/*!
+ \fn QValueListIterator<T>& QValueListIterator::operator--()
+ Prefix -- makes the previous item current and returns
+ an iterator pointing to the new current item.
+ The iterator can not check wether it reached the beginning of the list. Decrementing
+ the iterator as returned by begin() causes undefined results.
+*/
+
+/*!
+ \fn QValueListIterator<T> QValueListIterator::operator--(int)
+ Postfix -- makes the previous item current and returns
+ an iterator pointing to the new current item.
+ The iterator can not check wether it reached the beginning of the list. Decrementing
+ the iterator as returned by begin() causes undefined results.
+*/
+
+/*!
+ \fn bool QValueListIterator::operator==( const QValueListIterator<T>& it ) const
+ Compares both iterators and returns TRUE if they point to the same item.
+*/
+
+/*!
+ \fn bool QValueListIterator::operator!=( const QValueListIterator<T>& it ) const
+ Compares both iterators and returns TRUE if they point to different items.
+*/
+
+/*****************************************************************************
+ QValueListConstIterator documentation
+ *****************************************************************************/
+
+/*!
+ \class QValueListConstIterator qvaluelist.h
+ \brief The QValueListConstIterator class provides an iterator for QValueList.
+
+ \ingroup qtl
+ \ingroup tools
+
+ In contrast to QValueListIterator this class is used to iterate over a const
+ list. It does not allow to modify the values of the list since this would
+ break the const semantics.
+
+ For more informations on QValueList iterators see QValueListIterator.
+
+ \sa QValueListIterator, QValueList
+*/
+
+/*!
+ \fn QValueListConstIterator::QValueListConstIterator()
+ Creates un uninitialized iterator.
+*/
+
+/*!
+ \fn QValueListConstIterator::QValueListConstIterator( NodePtr p )
+ Internal function.
+*/
+
+/*!
+ \fn QValueListConstIterator::QValueListConstIterator( const QValueListConstIterator<T>& it )
+ Constructs a copy of the iterator \e it.
+*/
+
+/*!
+ \fn QValueListConstIterator::QValueListConstIterator( const QValueListIterator<T>& it )
+ Constructs a copy of the iterator \e it.
+*/
+
+/*!
+ \fn QValueListConstIterator::~QValueListConstIterator()
+ Destroys the iterator.
+*/
+
+/* Unfortunately not with MSVC
+ \fn const T *QValueListConstIterator::operator->()
+ Pointer operator. Returns a pointer to the current iterator item.
+ The great advantage of this operator is that you can treat the
+ iterator like a pointer.
+
+ Example:
+ \code
+ QValueList<int>::Iterator it = list.begin();
+ for( ; it != end(); ++it )
+ it->show();
+ \endcode
+*/
+
+/*!
+ \fn const T& QValueListConstIterator::operator*() const
+ Asterix operator. Returns a reference to the current iterator item.
+*/
+
+/*!
+ \fn QValueListConstIterator<T>& QValueListConstIterator::operator++()
+ Prefix ++ makes the succeeding item current and returns
+ an iterator pointing to the new current item.
+ The iterator can not check wether it reached the end of the list. Incrementing
+ the iterator as returned by end() causes undefined results.
+*/
+
+/*!
+ \fn QValueListConstIterator<T> QValueListConstIterator::operator++(int)
+ Postfix ++ makes the succeeding item current and returns
+ an iterator pointing to the new current item.
+ The iterator can not check wether it reached the end of the list. Incrementing
+ the iterator as returned by end() causes undefined results.
+*/
+
+/*!
+ \fn QValueListConstIterator<T>& QValueListConstIterator::operator--()
+ Prefix -- makes the previous item current and returns
+ an iterator pointing to the new current item.
+ The iterator can not check wether it reached the beginning of the list. Decrementing
+ the iterator as returned by begin() causes undefined results.
+*/
+
+/*!
+ \fn QValueListConstIterator<T> QValueListConstIterator::operator--(int)
+ Postfix -- makes the previous item current and returns
+ an iterator pointing to the new current item.
+ The iterator can not check wether it reached the beginning of the list. Decrementing
+ the iterator as returned by begin() causes undefined results.
+*/
+
+/*!
+ \fn bool QValueListConstIterator::operator==( const QValueListConstIterator<T>& it ) const
+ Compares both iterators and returns TRUE if they point to the same item.
+*/
+
+/*!
+ \fn bool QValueListConstIterator::operator!=( const QValueListConstIterator<T>& it ) const
+ Compares both iterators and returns TRUE if they point to different items.
+*/
diff --git a/qtools/qvaluelist.h b/qtools/qvaluelist.h
new file mode 100644
index 0000000..a1014ed
--- /dev/null
+++ b/qtools/qvaluelist.h
@@ -0,0 +1,449 @@
+/****************************************************************************
+**
+**
+** Definition of QValueList class
+**
+** Created : 990406
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QVALUELIST_H
+#define QVALUELIST_H
+
+#ifndef QT_H
+#include "qshared.h"
+#include "qdatastream.h"
+#endif // QT_H
+
+#if defined(_CC_MSVC_)
+#pragma warning(disable:4284) // "return type for operator -> is not a UDT"
+#endif
+
+template <class T>
+class Q_EXPORT QValueListNode
+{
+public:
+ QValueListNode( const T& t ) : data( t ) { }
+ QValueListNode() { }
+#if defined(Q_TEMPLATEDLL)
+ // Workaround MS bug in memory de/allocation in DLL vs. EXE
+ virtual ~QValueListNode() { }
+#endif
+
+ QValueListNode<T>* next;
+ QValueListNode<T>* prev;
+ T data;
+};
+
+template<class T>
+class Q_EXPORT QValueListIterator
+{
+ public:
+ /**
+ * Typedefs
+ */
+ typedef QValueListNode<T>* NodePtr;
+
+ /**
+ * Variables
+ */
+ NodePtr node;
+
+ /**
+ * Functions
+ */
+ QValueListIterator() : node( 0 ) {}
+ QValueListIterator( NodePtr p ) : node( p ) {}
+ QValueListIterator( const QValueListIterator<T>& it ) : node( it.node ) {}
+
+ bool operator==( const QValueListIterator<T>& it ) const { return node == it.node; }
+ bool operator!=( const QValueListIterator<T>& it ) const { return node != it.node; }
+ const T& operator*() const { return node->data; }
+ T& operator*() { return node->data; }
+
+ // Compilers are too dumb to understand this for QValueList<int>
+ //T* operator->() const { return &(node->data); }
+
+ QValueListIterator<T>& operator++() {
+ node = node->next;
+ return *this;
+ }
+
+ QValueListIterator<T> operator++(int) {
+ QValueListIterator<T> tmp = *this;
+ node = node->next;
+ return tmp;
+ }
+
+ QValueListIterator<T>& operator--() {
+ node = node->prev;
+ return *this;
+ }
+
+ QValueListIterator<T> operator--(int) {
+ QValueListIterator<T> tmp = *this;
+ node = node->prev;
+ return tmp;
+ }
+};
+
+template<class T>
+class Q_EXPORT QValueListConstIterator
+{
+ public:
+ /**
+ * Typedefs
+ */
+ typedef QValueListNode<T>* NodePtr;
+
+ /**
+ * Variables
+ */
+ NodePtr node;
+
+ /**
+ * Functions
+ */
+ QValueListConstIterator() : node( 0 ) {}
+ QValueListConstIterator( NodePtr p ) : node( p ) {}
+ QValueListConstIterator( const QValueListConstIterator<T>& it ) : node( it.node ) {}
+ QValueListConstIterator( const QValueListIterator<T>& it ) : node( it.node ) {}
+
+ bool operator==( const QValueListConstIterator<T>& it ) const { return node == it.node; }
+ bool operator!=( const QValueListConstIterator<T>& it ) const { return node != it.node; }
+ const T& operator*() const { return node->data; }
+
+ // Compilers are too dumb to understand this for QValueList<int>
+ //const T* operator->() const { return &(node->data); }
+
+ QValueListConstIterator<T>& operator++() {
+ node = node->next;
+ return *this;
+ }
+
+ QValueListConstIterator<T> operator++(int) {
+ QValueListConstIterator<T> tmp = *this;
+ node = node->next;
+ return tmp;
+ }
+
+ QValueListConstIterator<T>& operator--() {
+ node = node->prev;
+ return *this;
+ }
+
+ QValueListConstIterator<T> operator--(int) {
+ QValueListConstIterator<T> tmp = *this;
+ node = node->prev;
+ return tmp;
+ }
+};
+
+template <class T>
+class Q_EXPORT QValueListPrivate : public QShared
+{
+public:
+ /**
+ * Typedefs
+ */
+ typedef QValueListIterator<T> Iterator;
+ typedef QValueListConstIterator<T> ConstIterator;
+ typedef QValueListNode<T> Node;
+ typedef QValueListNode<T>* NodePtr;
+
+ /**
+ * Functions
+ */
+ QValueListPrivate() { node = new Node; node->next = node->prev = node; nodes = 0; }
+ QValueListPrivate( const QValueListPrivate<T>& _p ) : QShared() {
+ node = new Node; node->next = node->prev = node; nodes = 0;
+ Iterator b( _p.node->next );
+ Iterator e( _p.node );
+ Iterator i( node );
+ while( b != e )
+ insert( i, *b++ );
+ }
+
+ void derefAndDelete() // ### hack to get around hp-cc brain damage
+ {
+ if ( deref() )
+ delete this;
+ }
+
+#if defined(Q_TEMPLATEDLL)
+ // Workaround MS bug in memory de/allocation in DLL vs. EXE
+ virtual
+#endif
+ ~QValueListPrivate() {
+ NodePtr p = node->next;
+ while( p != node ) {
+ NodePtr x = p->next;
+ delete p;
+ p = x;
+ }
+ delete node;
+ }
+
+ Iterator insert( Iterator it, const T& x ) {
+ NodePtr p = new Node( x );
+ p->next = it.node;
+ p->prev = it.node->prev;
+ it.node->prev->next = p;
+ it.node->prev = p;
+ nodes++;
+ return p;
+ }
+
+ Iterator remove( Iterator it ) {
+ ASSERT ( it.node != node );
+ NodePtr next = it.node->next;
+ NodePtr prev = it.node->prev;
+ prev->next = next;
+ next->prev = prev;
+ delete it.node;
+ nodes--;
+ return Iterator( next );
+ }
+
+ NodePtr find( NodePtr start, const T& x ) const {
+ ConstIterator first( start );
+ ConstIterator last( node );
+ while( first != last) {
+ if ( *first == x )
+ return first.node;
+ ++first;
+ }
+ return last.node;
+ }
+
+ int findIndex( NodePtr start, const T& x ) const {
+ ConstIterator first( start );
+ ConstIterator last( node );
+ int pos = 0;
+ while( first != last) {
+ if ( *first == x )
+ return pos;
+ ++first;
+ ++pos;
+ }
+ return -1;
+ }
+
+ uint contains( const T& x ) const {
+ uint result = 0;
+ Iterator first = Iterator( node->next );
+ Iterator last = Iterator( node );
+ while( first != last) {
+ if ( *first == x )
+ ++result;
+ ++first;
+ }
+ return result;
+ }
+
+ void remove( const T& x ) {
+ Iterator first = Iterator( node->next );
+ Iterator last = Iterator( node );
+ while( first != last) {
+ if ( *first == x )
+ first = remove( first );
+ else
+ ++first;
+ }
+ }
+
+ NodePtr at( uint i ) const {
+ ASSERT( i <= nodes );
+ NodePtr p = node->next;
+ for( uint x = 0; x < i; ++x )
+ p = p->next;
+ return p;
+ }
+
+ void clear() {
+ nodes = 0;
+ NodePtr p = node->next;
+ while( p != node ) {
+ NodePtr next = p->next;
+ delete p;
+ p = next;
+ }
+ node->next = node->prev = node;
+ }
+
+ NodePtr node;
+ uint nodes;
+};
+
+template <class T>
+class Q_EXPORT QValueList
+{
+public:
+ /**
+ * Typedefs
+ */
+ typedef QValueListIterator<T> Iterator;
+ typedef QValueListConstIterator<T> ConstIterator;
+ typedef T ValueType;
+
+ /**
+ * API
+ */
+ QValueList() { sh = new QValueListPrivate<T>; }
+ QValueList( const QValueList<T>& l ) { sh = l.sh; sh->ref(); }
+ ~QValueList() { sh->derefAndDelete(); }
+
+ QValueList<T>& operator= ( const QValueList<T>& l )
+ {
+ l.sh->ref();
+ sh->derefAndDelete();
+ sh = l.sh;
+ return *this;
+ }
+
+ QValueList<T> operator+ ( const QValueList<T>& l ) const
+ {
+ QValueList<T> l2( *this );
+ for( ConstIterator it = l.begin(); it != l.end(); ++it )
+ l2.append( *it );
+ return l2;
+ }
+
+ QValueList<T>& operator+= ( const QValueList<T>& l )
+ {
+ for( ConstIterator it = l.begin(); it != l.end(); ++it )
+ append( *it );
+ return *this;
+ }
+
+ bool operator== ( const QValueList<T>& l ) const
+ {
+ if ( count() != l.count() )
+ return FALSE;
+ ConstIterator it2 = begin();
+ ConstIterator it = l.begin();
+ for( ; it != l.end(); ++it, ++it2 )
+ if ( !( *it == *it2 ) )
+ return FALSE;
+ return TRUE;
+ }
+
+ bool operator!= ( const QValueList<T>& l ) const { return !( *this == l ); }
+
+ Iterator begin() { detach(); return Iterator( sh->node->next ); }
+ ConstIterator begin() const { return ConstIterator( sh->node->next ); }
+ Iterator end() { detach(); return Iterator( sh->node ); }
+ ConstIterator end() const { return ConstIterator( sh->node ); }
+ Iterator fromLast() { detach(); return Iterator( sh->node->prev ); }
+ ConstIterator fromLast() const { return ConstIterator( sh->node->prev ); }
+
+ bool isEmpty() const { return ( sh->nodes == 0 ); }
+
+ Iterator insert( Iterator it, const T& x ) { detach(); return sh->insert( it, x ); }
+
+ Iterator append( const T& x ) { detach(); return sh->insert( end(), x ); }
+ Iterator prepend( const T& x ) { detach(); return sh->insert( begin(), x ); }
+
+ Iterator remove( Iterator it ) { detach(); return sh->remove( it ); }
+ void remove( const T& x ) { detach(); sh->remove( x ); }
+
+ T& first() { detach(); return sh->node->next->data; }
+ const T& first() const { return sh->node->next->data; }
+ T& last() { detach(); return sh->node->prev->data; }
+ const T& last() const { return sh->node->prev->data; }
+
+ T& operator[] ( uint i ) { detach(); return sh->at(i)->data; }
+ const T& operator[] ( uint i ) const { return sh->at(i)->data; }
+ Iterator at( uint i ) { detach(); return Iterator( sh->at(i) ); }
+ ConstIterator at( uint i ) const { return ConstIterator( sh->at(i) ); }
+ Iterator find ( const T& x ) { detach(); return Iterator( sh->find( sh->node->next, x) ); }
+ ConstIterator find ( const T& x ) const { return ConstIterator( sh->find( sh->node->next, x) ); }
+ Iterator find ( Iterator it, const T& x ) { detach(); return Iterator( sh->find( it.node, x ) ); }
+ ConstIterator find ( ConstIterator it, const T& x ) const { return ConstIterator( sh->find( it.node, x ) ); }
+ int findIndex( const T& x ) const { return sh->findIndex( sh->node->next, x) ; }
+ uint contains( const T& x ) const { return sh->contains( x ); }
+
+ uint count() const { return sh->nodes; }
+
+ void clear() { if ( sh->count == 1 ) sh->clear(); else { sh->deref(); sh = new QValueListPrivate<T>; } }
+
+
+ QValueList<T>& operator+= ( const T& x )
+ {
+ append( x );
+ return *this;
+ }
+ QValueList<T>& operator<< ( const T& x )
+ {
+ append( x );
+ return *this;
+ }
+
+
+protected:
+ /**
+ * Helpers
+ */
+ void detach() { if ( sh->count > 1 ) { sh->deref(); sh = new QValueListPrivate<T>( *sh ); } }
+
+ /**
+ * Variables
+ */
+ QValueListPrivate<T>* sh;
+};
+
+#ifndef QT_NO_DATASTREAM
+template<class T>
+inline QDataStream& operator>>( QDataStream& s, QValueList<T>& l )
+{
+ l.clear();
+ Q_UINT32 c;
+ s >> c;
+ for( Q_UINT32 i = 0; i < c; ++i )
+ {
+ T t;
+ s >> t;
+ l.append( t );
+ }
+ return s;
+}
+
+template<class T>
+inline QDataStream& operator<<( QDataStream& s, const QValueList<T>& l )
+{
+ s << (Q_UINT32)l.count();
+ QValueListConstIterator<T> it = l.begin();
+ for( ; it != l.end(); ++it )
+ s << *it;
+ return s;
+}
+#endif // QT_NO_DATASTREAM
+#endif // QVALUELIST_H
diff --git a/qtools/qvaluestack.h b/qtools/qvaluestack.h
new file mode 100644
index 0000000..fe4462a
--- /dev/null
+++ b/qtools/qvaluestack.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+**
+** Definition of QValueStack class
+**
+** Created : 990925
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QVALUESTACK_H
+#define QVALUESTACK_H
+
+#ifndef QT_H
+#include "qvaluelist.h"
+#endif // QT_H
+
+
+template<class T>
+class Q_EXPORT QValueStack : public QValueList<T>
+{
+public:
+ QValueStack() {}
+ ~QValueStack() {}
+ void push( const T& d ) { QValueList<T>::append(d); }
+ T pop()
+ {
+ T elem( this->last() );
+ if ( !this->isEmpty() )
+ this->remove( this->fromLast() );
+ return elem;
+ }
+ T& top() { return this->last(); }
+ const T& top() const { return this->last(); }
+};
+
+#endif
diff --git a/qtools/qvector.doc b/qtools/qvector.doc
new file mode 100644
index 0000000..2acf567
--- /dev/null
+++ b/qtools/qvector.doc
@@ -0,0 +1,344 @@
+/****************************************************************************
+**
+**
+** QVector class documentation
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+
+/*****************************************************************************
+ QVector documentation
+ *****************************************************************************/
+
+// BEING REVISED: ettrich
+/*!
+ \class QVector qvector.h
+
+ \brief The QVector class is a template collection class that
+ provides a vector (array).
+
+ \ingroup tools
+
+ QVector is implemented as a template class. Define a template
+ instance QVector\<X\> to create a vector that contains pointers to
+ X, or X*.
+
+ A vector is the same as an array. The main difference between
+ QVector and QArray is that QVector stores pointers to the elements,
+ while QArray stores the elements themselves (i.e. QArray is
+ value-based).
+
+ Unless where otherwise stated, all functions that remove items from
+ the vector will also delete the element pointed to if auto-deletion
+ is enabled - see setAutoDelete(). By default, auto-deletion is
+ disabled. This behaviour can be changed in a subclass by
+ reimplementing the virtual method deleteItem().
+
+ Functions that compares items, e.g. find() and sort(), will do so
+ using the virtual function compareItems(). The default
+ implementation of this function will only compare the absolute
+ pointer values. Reimplement compareItems() in a subclass to get
+ searching and sorting based on the item contents.
+
+ \sa \link collection.html Collection Classes\endlink, QArray
+*/
+
+/*!
+ \fn QVector::QVector()
+
+ Constructs a null vector.
+
+ \sa isNull()
+*/
+
+/*!
+ \fn QVector::QVector( uint size )
+
+ Constructs an vector with room for \a size items. Makes a null
+ vector if \a size == 0.
+
+ All \a size positions in the vector are initialized to 0.
+
+ \sa size(), resize(), isNull()
+*/
+
+/*!
+ \fn QVector::QVector( const QVector<type> &v )
+
+ Constructs a copy of \a v. Only the pointers are copied (i.e. shallow copy).
+*/
+
+/*!
+ \fn QVector::~QVector()
+
+ Removes all items from the vector, and destroys the vector itself.
+
+ \sa clear()
+*/
+
+/*!
+ \fn QVector<type> &QVector::operator=( const QVector<type> &v )
+
+ Assigns \a v to this vector and returns a reference to this vector.
+
+ This vector is first cleared, then all the items from \a v is copied
+ into this vector. Only the pointers are copied (i.e. shallow copy).
+
+ \sa clear()
+*/
+
+/*!
+ \fn type **QVector::data() const
+ Returns a pointer to the actual vector data, which is an array of type*.
+
+ The vector is a null vector if data() == 0 (null pointer).
+
+ \sa isNull()
+*/
+
+/*!
+ \fn uint QVector::size() const
+
+ Returns the size of the vector, i.e. the number of vector
+ positions. This is also the maximum number of items the vector can
+ hold.
+
+ The vector is a null vector if size() == 0.
+
+ \sa isNull(), resize(), count()
+*/
+
+/*!
+ \fn uint QVector::count() const
+
+ Returns the number of items in the vector. The vector is empty if
+ count() == 0.
+
+ \sa isEmpty(), size()
+*/
+
+/*!
+ \fn bool QVector::isEmpty() const
+
+ Returns TRUE if the vector is empty, i.e. count() == 0, otherwise FALSE.
+
+ \sa count()
+*/
+
+/*!
+ \fn bool QVector::isNull() const
+
+ Returns TRUE if the vector is null, otherwise FALSE.
+
+ A null vector has size() == 0 and data() == 0.
+
+ \sa size()
+*/
+
+/*!
+ \fn bool QVector::resize( uint size )
+ Resizes (expands or shrinks) the vector to \a size elements. The array
+ becomes a null array if \a size == 0.
+
+ Any items in position \a size or beyond in the vector are removed.
+ New positions are initialized 0.
+
+ Returns TRUE if successful, or FALSE if the memory cannot be allocated.
+
+ \sa size(), isNull()
+*/
+
+/*!
+ \fn bool QVector::insert( uint i, const type *d )
+
+ Sets position \a i in the vector to contain the item \a d. \a i must
+ be less than size(). Any previous element in position \a i is removed.
+
+ \sa at()
+*/
+
+/*!
+ \fn bool QVector::remove( uint i )
+
+ Removes the item at position \a i in the vector, if there is one.
+ \a i must be less than size().
+
+ Returns TRUE unless \a i is out of range.
+
+ \sa take(), at()
+*/
+
+/*!
+ \fn type* QVector::take( uint i )
+
+ Returns the item at position \a i in the vector, and removes that
+ item from the vector. \a i must be less than size(). If there is no
+ item at position \a i, 0 is returned.
+
+ In contrast to remove(), this function does \e not call deleteItem()
+ for the removed item.
+
+ \sa remove(), at()
+*/
+
+/*!
+ \fn void QVector::clear()
+
+ Removes all items from the vector, and destroys the vector
+ itself.
+
+ The vector becomes a null vector.
+
+ \sa isNull()
+*/
+
+/*!
+ \fn bool QVector::fill( const type *d, int size )
+
+ Inserts item \a d in all positions in the vector. Any existing items
+ are removed. If \a d is 0, the vector becomes empty.
+
+ If \a size >= 0, the vector is first resized to \a size. By default,
+ \a size is -1.
+
+ Returns TRUE if successful, or FALSE if the memory cannot be allocated
+ (only if a resize has been requested).
+
+ \sa resize(), insert(), isEmpty()
+*/
+
+/*!
+ \fn void QVector::sort()
+
+ Sorts the items in ascending order. Any empty positions will be put
+ last.
+
+ Compares items using the virtual function compareItems().
+
+ \sa bsearch()
+*/
+
+/*!
+ \fn int QVector::bsearch( const type* d ) const
+
+ In a sorted array, finds the first occurrence of \a d using binary
+ search. For a sorted array, this is generally much faster than
+ find(), which does a linear search.
+
+ Returns the position of \a d, or -1 if \a d could not be found. \a d
+ may not be 0.
+
+ Compares items using the virtual function compareItems().
+
+ \sa sort(), find()
+*/
+
+
+/*!
+ \fn int QVector::findRef( const type *d, uint i ) const
+
+ Finds the first occurrence of the item pointer \a d in the vector,
+ using linear search. The search starts at position \a i, which must
+ be less than size(). \a i is by default 0; i.e. the search starts at
+ the start of the vector.
+
+ Returns the position of \a d, or -1 if \a d could not be found.
+
+ This function does \e not use compareItems() to compare items.
+
+ \sa find(), bsearch()
+*/
+
+/*!
+ \fn int QVector::find( const type *d, uint i ) const
+
+ Finds the first occurrence of item \a d in the vector, using linear
+ search. The search starts at position \a i, which must be less than
+ size(). \a i is by default 0; i.e. the search starts at the start of
+ the vector.
+
+ Returns the position of \e v, or -1 if \e v could not be found.
+
+ Compares items using the virtual function compareItems().
+
+ \sa findRef(), bsearch()
+*/
+
+
+/*!
+ \fn uint QVector::containsRef( const type *d ) const
+
+ Returns the number of occurrences of the item pointer \a d in the
+ vector.
+
+ This function does \e not use compareItems() to compare items.
+
+ \sa findRef()
+*/
+
+/*!
+ \fn uint QVector::contains( const type *d ) const
+
+ Returns the number of occurrences of item \a d in the vector.
+
+ Compares items using the virtual function compareItems().
+
+ \sa containsRef()
+*/
+
+/*!
+ \fn type *QVector::operator[]( int i ) const
+
+ Returns the item at position \a i, or 0 if there is no item at
+ that position. \a i must be less than size().
+
+ Equivalent to at( \a i ).
+
+ \sa at()
+*/
+
+/*!
+ \fn type *QVector::at( uint i ) const
+
+ Returns the item at position \a i, or 0 if there is no item at
+ that position. \a i must be less than size().
+*/
+
+
+/*!
+ \fn void QVector::toList( QGList *list ) const
+
+ Copies all items in this vector to the list \a list. First, \a list
+ is cleared, then all items are appended to \a list.
+
+ \sa QList, QStack, QQueue
+*/
+
diff --git a/qtools/qvector.h b/qtools/qvector.h
new file mode 100644
index 0000000..36f0be7
--- /dev/null
+++ b/qtools/qvector.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+**
+** Definition of QVector template/macro class
+**
+** Created : 930907
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QVECTOR_H
+#define QVECTOR_H
+
+#ifndef QT_H
+#include "qgvector.h"
+#endif // QT_H
+
+
+template<class type> class QVector : public QGVector
+{
+public:
+ QVector() {}
+ QVector( uint size ) : QGVector(size) {}
+ QVector( const QVector<type> &v ) : QGVector(v) {}
+ ~QVector() { clear(); }
+ QVector<type> &operator=(const QVector<type> &v)
+ { return (QVector<type>&)QGVector::operator=(v); }
+ type **data() const { return (type **)QGVector::data(); }
+ uint size() const { return QGVector::size(); }
+ uint count() const { return QGVector::count(); }
+ bool isEmpty() const { return QGVector::count() == 0; }
+ bool isNull() const { return QGVector::size() == 0; }
+ bool resize( uint size ) { return QGVector::resize(size); }
+ bool insert( uint i, const type *d){ return QGVector::insert(i,(Item)d); }
+ bool remove( uint i ) { return QGVector::remove(i); }
+ type *take( uint i ) { return (type *)QGVector::take(i); }
+ void clear() { QGVector::clear(); }
+ bool fill( const type *d, int size=-1 )
+ { return QGVector::fill((Item)d,size);}
+ void sort() { QGVector::sort(); }
+ int bsearch( const type *d ) const{ return QGVector::bsearch((Item)d); }
+ int findRef( const type *d, uint i=0 ) const
+ { return QGVector::findRef((Item)d,i);}
+ int find( const type *d, uint i= 0 ) const
+ { return QGVector::find((Item)d,i); }
+ uint containsRef( const type *d ) const
+ { return QGVector::containsRef((Item)d); }
+ uint contains( const type *d ) const
+ { return QGVector::contains((Item)d); }
+ type *operator[]( int i ) const { return (type *)QGVector::at(i); }
+ type *at( uint i ) const { return (type *)QGVector::at(i); }
+ void toList( QGList *list ) const { QGVector::toList(list); }
+private:
+ void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
+};
+
+
+#endif // QVECTOR_H
diff --git a/qtools/qwaitcondition.h b/qtools/qwaitcondition.h
new file mode 100644
index 0000000..4d5b3bd
--- /dev/null
+++ b/qtools/qwaitcondition.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QWAITCONDITION_H
+#define QWAITCONDITION_H
+
+#include "qglobal.h"
+
+class QWaitConditionPrivate;
+class QMutex;
+
+class QWaitCondition
+{
+public:
+ QWaitCondition();
+ ~QWaitCondition();
+
+ void wait(QMutex *mutex);
+
+ void wakeOne();
+ void wakeAll();
+
+private:
+ QWaitCondition(const QWaitCondition &);
+ QWaitCondition &operator=(const QWaitCondition &);
+
+ QWaitConditionPrivate * d;
+};
+
+#endif // QWAITCONDITION_H
diff --git a/qtools/qwaitcondition_unix.cpp b/qtools/qwaitcondition_unix.cpp
new file mode 100644
index 0000000..aa22a4b
--- /dev/null
+++ b/qtools/qwaitcondition_unix.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qwaitcondition.h"
+#include "qmutex.h"
+#include <pthread.h>
+
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+static void report_error(int code, const char *where, const char *what)
+{
+ if (code != 0)
+ qWarning("%s: %s failure: %d", where, what, code);
+}
+
+struct QWaitConditionPrivate
+{
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ int waiters;
+ int wakeups;
+
+ void wait()
+ {
+ int code;
+ for (;;)
+ {
+ code = pthread_cond_wait(&cond, &mutex);
+ if (code == 0 && wakeups == 0)
+ {
+ // many vendors warn of spurios wakeups from
+ // pthread_cond_wait(), especially after signal delivery,
+ // even though POSIX doesn't allow for it... sigh
+ continue;
+ }
+ break;
+ }
+
+ --waiters;
+ if (code == 0)
+ {
+ --wakeups;
+ }
+ else
+ {
+ report_error(code, "QWaitCondition::wait()", "cv wait");
+ }
+ report_error(pthread_mutex_unlock(&mutex), "QWaitCondition::wait()", "mutex unlock");
+ }
+};
+
+
+QWaitCondition::QWaitCondition()
+{
+ d = new QWaitConditionPrivate;
+ report_error(pthread_mutex_init(&d->mutex, NULL), "QWaitCondition", "mutex init");
+ report_error(pthread_cond_init(&d->cond, NULL), "QWaitCondition", "cv init");
+ d->waiters = d->wakeups = 0;
+}
+
+
+QWaitCondition::~QWaitCondition()
+{
+ report_error(pthread_cond_destroy(&d->cond), "QWaitCondition", "cv destroy");
+ report_error(pthread_mutex_destroy(&d->mutex), "QWaitCondition", "mutex destroy");
+ delete d;
+}
+
+void QWaitCondition::wakeOne()
+{
+ report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeOne()", "mutex lock");
+ d->wakeups = MIN(d->wakeups + 1, d->waiters);
+ report_error(pthread_cond_signal(&d->cond), "QWaitCondition::wakeOne()", "cv signal");
+ report_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeOne()", "mutex unlock");
+}
+
+void QWaitCondition::wakeAll()
+{
+ report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wakeAll()", "mutex lock");
+ d->wakeups = d->waiters;
+ report_error(pthread_cond_broadcast(&d->cond), "QWaitCondition::wakeAll()", "cv broadcast");
+ report_error(pthread_mutex_unlock(&d->mutex), "QWaitCondition::wakeAll()", "mutex unlock");
+}
+
+void QWaitCondition::wait(QMutex *mutex)
+{
+ if (!mutex) return;
+
+ report_error(pthread_mutex_lock(&d->mutex), "QWaitCondition::wait()", "mutex lock");
+ ++d->waiters;
+ mutex->unlock();
+ d->wait();
+ mutex->lock();
+}
+
diff --git a/qtools/qwaitcondition_win32.cpp b/qtools/qwaitcondition_win32.cpp
new file mode 100644
index 0000000..77eb039
--- /dev/null
+++ b/qtools/qwaitcondition_win32.cpp
@@ -0,0 +1,186 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <windows.h>
+#include "qwaitcondition.h"
+#include "qmutex.h"
+#include "qlist.h"
+
+//***********************************************************************
+// QWaitConditionPrivate
+// **********************************************************************
+
+class QWaitConditionEvent
+{
+public:
+ QWaitConditionEvent() : priority(0), wokenUp(false)
+ {
+ event = CreateEvent(NULL, TRUE, FALSE, NULL);
+ }
+ ~QWaitConditionEvent() { CloseHandle(event); }
+ int priority;
+ bool wokenUp;
+ HANDLE event;
+};
+
+class EventQueue : public QList<QWaitConditionEvent>
+{
+ public:
+ EventQueue() { setAutoDelete(TRUE); }
+ ~EventQueue() {}
+};
+
+class QWaitConditionPrivate
+{
+public:
+ QMutex mtx;
+ EventQueue queue;
+ EventQueue freeQueue;
+
+ QWaitConditionEvent *pre();
+ void wait(QWaitConditionEvent *wce);
+ void post(QWaitConditionEvent *wce);
+};
+
+QWaitConditionEvent *QWaitConditionPrivate::pre()
+{
+ mtx.lock();
+ QWaitConditionEvent *wce =
+ freeQueue.isEmpty() ? new QWaitConditionEvent : freeQueue.take(0);
+ wce->priority = GetThreadPriority(GetCurrentThread());
+ wce->wokenUp = FALSE;
+
+ // insert 'wce' into the queue (sorted by priority)
+ uint index = 0;
+ for (; index < queue.count(); ++index)
+ {
+ QWaitConditionEvent *current = queue.at(index);
+ if (current->priority < wce->priority)
+ break;
+ }
+ queue.insert(index, wce);
+ mtx.unlock();
+
+ return wce;
+}
+
+void QWaitConditionPrivate::wait(QWaitConditionEvent *wce)
+{
+ WaitForSingleObject(wce->event, INFINITE);
+}
+
+void QWaitConditionPrivate::post(QWaitConditionEvent *wce)
+{
+ mtx.lock();
+
+ // remove 'wce' from the queue
+ int idx = queue.find(wce);
+ ASSERT(idx!=-1);
+ queue.take(idx);
+ ResetEvent(wce->event);
+ freeQueue.append(wce);
+
+ // wakeups delivered after the timeout should be forwarded to the next waiter
+ if (wce->wokenUp && !queue.isEmpty())
+ {
+ QWaitConditionEvent *other = queue.getFirst();
+ SetEvent(other->event);
+ other->wokenUp = TRUE;
+ }
+
+ mtx.unlock();
+}
+
+//***********************************************************************
+// QWaitCondition implementation
+//***********************************************************************
+
+QWaitCondition::QWaitCondition()
+{
+ d = new QWaitConditionPrivate;
+}
+
+QWaitCondition::~QWaitCondition()
+{
+ if (!d->queue.isEmpty())
+ {
+ qWarning("QWaitCondition: Destroyed while threads are still waiting");
+ }
+ delete d;
+}
+
+void QWaitCondition::wait(QMutex *mutex)
+{
+ if (!mutex) return;
+
+ QWaitConditionEvent *wce = d->pre();
+ mutex->unlock();
+ d->wait(wce);
+ mutex->lock();
+ d->post(wce);
+}
+
+void QWaitCondition::wakeOne()
+{
+ // wake up the first waiting thread in the queue
+ QMutexLocker locker(&d->mtx);
+ for (uint i = 0; i < d->queue.count(); ++i)
+ {
+ QWaitConditionEvent *current = d->queue.at(i);
+ if (current->wokenUp) continue;
+ SetEvent(current->event);
+ current->wokenUp = TRUE;
+ break;
+ }
+}
+
+void QWaitCondition::wakeAll()
+{
+ // wake up the all threads in the queue
+ QMutexLocker locker(&d->mtx);
+ for (uint i = 0; i < d->queue.count(); ++i)
+ {
+ QWaitConditionEvent *current = d->queue.at(i);
+ SetEvent(current->event);
+ current->wokenUp = TRUE;
+ }
+}
+
diff --git a/qtools/qxml.cpp b/qtools/qxml.cpp
new file mode 100644
index 0000000..9a24c1b
--- /dev/null
+++ b/qtools/qxml.cpp
@@ -0,0 +1,6046 @@
+/****************************************************************************
+**
+**
+** Implementation of QXmlSimpleReader and related classes.
+**
+** Created : 000518
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the XML module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition licenses may use this
+** file in accordance with the Qt Commercial License Agreement provided
+** with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#define QT_XML_CPP
+#include "qxml.h"
+#include "qtextcodec.h"
+#include "qbuffer.h"
+
+#ifndef QT_NO_XML
+// NOT REVISED
+
+// Error strings for the XML reader
+#define XMLERR_OK "no error occured"
+#define XMLERR_TAGMISMATCH "tag mismatch"
+#define XMLERR_UNEXPECTEDEOF "unexpected end of file"
+#define XMLERR_FINISHEDPARSINGWHILENOTEOF "parsing is finished but end of file is not reached"
+#define XMLERR_LETTEREXPECTED "letter is expected"
+#define XMLERR_ERRORPARSINGELEMENT "error while parsing element"
+#define XMLERR_ERRORPARSINGPROLOG "error while parsing prolog"
+#define XMLERR_ERRORPARSINGMAINELEMENT "error while parsing main element"
+#define XMLERR_ERRORPARSINGCONTENT "error while parsing content"
+#define XMLERR_ERRORPARSINGNAME "error while parsing name"
+#define XMLERR_ERRORPARSINGNMTOKEN "error while parsing Nmtoken"
+#define XMLERR_ERRORPARSINGATTRIBUTE "error while parsing attribute"
+#define XMLERR_ERRORPARSINGMISC "error while parsing misc"
+#define XMLERR_ERRORPARSINGCHOICE "error while parsing choice or seq"
+#define XMLERR_ERRORBYCONSUMER "error triggered by consumer"
+#define XMLERR_UNEXPECTEDCHARACTER "unexpected character"
+#define XMLERR_EQUALSIGNEXPECTED "expected '=' but not found"
+#define XMLERR_QUOTATIONEXPECTED "expected \" or ' but not found"
+#define XMLERR_ERRORPARSINGREFERENCE "error while parsing reference"
+#define XMLERR_ERRORPARSINGPI "error while parsing processing instruction"
+#define XMLERR_ERRORPARSINGATTLISTDECL "error while parsing attribute list declaration"
+#define XMLERR_ERRORPARSINGATTTYPE "error while parsing attribute type declaration"
+#define XMLERR_ERRORPARSINGATTVALUE "error while parsing attribute value declaration"
+#define XMLERR_ERRORPARSINGELEMENTDECL "error while parsing element declaration"
+#define XMLERR_ERRORPARSINGENTITYDECL "error while parsing entity declaration"
+#define XMLERR_ERRORPARSINGNOTATIONDECL "error while parsing notation declaration"
+#define XMLERR_ERRORPARSINGEXTERNALID "error while parsing external id"
+#define XMLERR_ERRORPARSINGCOMMENT "error while parsing comment"
+#define XMLERR_ERRORPARSINGENTITYVALUE "error while parsing entity value declaration"
+#define XMLERR_CDSECTHEADEREXPECTED "expected the header for a cdata section"
+#define XMLERR_MORETHANONEDOCTYPE "more than one document type definition"
+#define XMLERR_ERRORPARSINGDOCTYPE "error while parsing document type definition"
+#define XMLERR_INVALIDNAMEFORPI "invalid name for processing instruction"
+#define XMLERR_VERSIONEXPECTED "version expected while reading the XML declaration"
+#define XMLERR_EDECLORSDDECLEXPECTED "EDecl or SDDecl expected while reading the XML declaration"
+#define XMLERR_SDDECLEXPECTED "SDDecl expected while reading the XML declaration"
+#define XMLERR_WRONGVALUEFORSDECL "wrong value for standalone declaration"
+#define XMLERR_UNPARSEDENTITYREFERENCE "unparsed entity reference in wrong context"
+#define XMLERR_INTERNALGENERALENTITYINDTD "internal general entity reference not allowed in DTD"
+#define XMLERR_EXTERNALGENERALENTITYINDTD "external parsed general entity reference not allowed in DTD"
+#define XMLERR_EXTERNALGENERALENTITYINAV "external parsed general entity reference not allowed in attribute value"
+
+
+// the constants for the lookup table
+static const signed char cltWS = 0; // white space
+static const signed char cltPer = 1; // %
+static const signed char cltAmp = 2; // &
+static const signed char cltGt = 3; // >
+static const signed char cltLt = 4; // <
+static const signed char cltSlash = 5; // /
+static const signed char cltQm = 6; // ?
+static const signed char cltEm = 7; // !
+static const signed char cltDash = 8; // -
+static const signed char cltCB = 9; // ]
+static const signed char cltOB = 10; // [
+static const signed char cltEq = 11; // =
+static const signed char cltDq = 12; // "
+static const signed char cltSq = 13; // '
+static const signed char cltUnknown = 14;
+
+// character lookup table
+static const signed char charLookupTable[256]={
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x00 - 0x07
+ cltUnknown, // 0x08
+ cltWS, // 0x09 \t
+ cltWS, // 0x0A \n
+ cltUnknown, // 0x0B
+ cltUnknown, // 0x0C
+ cltWS, // 0x0D \r
+ cltUnknown, // 0x0E
+ cltUnknown, // 0x0F
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x17 - 0x16
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x18 - 0x1F
+ cltWS, // 0x20 Space
+ cltEm, // 0x21 !
+ cltDq, // 0x22 "
+ cltUnknown, // 0x23
+ cltUnknown, // 0x24
+ cltPer, // 0x25 %
+ cltAmp, // 0x26 &
+ cltSq, // 0x27 '
+ cltUnknown, // 0x28
+ cltUnknown, // 0x29
+ cltUnknown, // 0x2A
+ cltUnknown, // 0x2B
+ cltUnknown, // 0x2C
+ cltDash, // 0x2D -
+ cltUnknown, // 0x2E
+ cltSlash, // 0x2F /
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x30 - 0x37
+ cltUnknown, // 0x38
+ cltUnknown, // 0x39
+ cltUnknown, // 0x3A
+ cltUnknown, // 0x3B
+ cltLt, // 0x3C <
+ cltEq, // 0x3D =
+ cltGt, // 0x3E >
+ cltQm, // 0x3F ?
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x40 - 0x47
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x48 - 0x4F
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x50 - 0x57
+ cltUnknown, // 0x58
+ cltUnknown, // 0x59
+ cltUnknown, // 0x5A
+ cltOB, // 0x5B [
+ cltUnknown, // 0x5C
+ cltCB, // 0x5D ]
+ cltUnknown, // 0x5E
+ cltUnknown, // 0x5F
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x60 - 0x67
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x68 - 0x6F
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x70 - 0x77
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x78 - 0x7F
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x80 - 0x87
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x88 - 0x8F
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x90 - 0x97
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x98 - 0x9F
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xA0 - 0xA7
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xA8 - 0xAF
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xB0 - 0xB7
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xB8 - 0xBF
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xC0 - 0xC7
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xC8 - 0xCF
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xD0 - 0xD7
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xD8 - 0xDF
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xE0 - 0xE7
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xE8 - 0xEF
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xF0 - 0xF7
+ cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown // 0xF8 - 0xFF
+};
+
+
+class QXmlNamespaceSupportPrivate
+{
+};
+class QXmlAttributesPrivate
+{
+};
+class QXmlInputSourcePrivate
+{
+};
+class QXmlParseExceptionPrivate
+{
+};
+class QXmlLocatorPrivate
+{
+};
+class QXmlDefaultHandlerPrivate
+{
+};
+
+#if defined(Q_FULL_TEMPLATE_INSTANTIATION)
+bool operator==( const QMap<QString, QString>, const QMap<QString, QString> )
+{
+ return FALSE;
+}
+#endif
+
+/*!
+ \class QXmlParseException qxml.h
+ \brief The QXmlParseException class is used to report errors with the
+ QXmlErrorHandler interface.
+
+ \module XML
+
+ \sa QXmlErrorHandler
+*/
+/*!
+ \fn QXmlParseException::QXmlParseException( const QString& name, int c, int l, const QString& p, const QString& s )
+
+ Constructs a parse exception with the error string \a name in the column
+ \a c and line \a l for the public identifier \a p and the system identifier
+ \a s.
+*/
+/*!
+ Returns the error message.
+*/
+QString QXmlParseException::message() const
+{
+ return msg;
+}
+/*!
+ Returns the column number the error occured.
+*/
+int QXmlParseException::columnNumber() const
+{
+ return column;
+}
+/*!
+ Returns the line number the error occured.
+*/
+int QXmlParseException::lineNumber() const
+{
+ return line;
+}
+/*!
+ Returns the public identifier the error occured.
+*/
+QString QXmlParseException::publicId() const
+{
+ return pub;
+}
+/*!
+ Returns the system identifier the error occured.
+*/
+QString QXmlParseException::systemId() const
+{
+ return sys;
+}
+
+
+/*!
+ \class QXmlLocator qxml.h
+ \brief The QXmlLocator class provides the XML handler classes with
+ information about the actual parsing position.
+
+ \module XML
+
+ The reader reports a QXmlLocator to the content handler before he starts to
+ parse the document. This is done with the
+ QXmlContentHandler::setDocumentLocator() function. The handler classes can
+ now use this locator to get the actual position the reader is at.
+*/
+/*!
+ \fn QXmlLocator::QXmlLocator( QXmlSimpleReader* parent )
+
+ Constructor.
+*/
+/*!
+ \fn QXmlLocator::~QXmlLocator()
+
+ Destructor.
+*/
+/*!
+ Gets the column number (starting with 1) or -1 if there is no column number
+ available.
+*/
+int QXmlLocator::columnNumber()
+{
+ return ( reader->columnNr == -1 ? -1 : reader->columnNr + 1 );
+}
+/*!
+ Gets the line number (starting with 1) or -1 if there is no line number
+ available.
+*/
+int QXmlLocator::lineNumber()
+{
+ return ( reader->lineNr == -1 ? -1 : reader->lineNr + 1 );
+}
+
+
+/*********************************************
+ *
+ * QXmlNamespaceSupport
+ *
+ *********************************************/
+
+/*!
+ \class QXmlNamespaceSupport qxml.h
+ \brief The QXmlNamespaceSupport class is a helper class for XML readers which
+ want to include namespace support.
+
+ \module XML
+
+ It provides some functions that makes it easy to handle namespaces. Its main
+ use is for subclasses of QXmlReader which want to provide namespace
+ support.
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+*/
+
+/*!
+ Constructs a QXmlNamespaceSupport.
+*/
+QXmlNamespaceSupport::QXmlNamespaceSupport()
+{
+ reset();
+}
+
+/*!
+ Destructs a QXmlNamespaceSupport.
+*/
+QXmlNamespaceSupport::~QXmlNamespaceSupport()
+{
+}
+
+/*!
+ This function declares a prefix in the current namespace context; the prefix
+ will remain in force until this context is popped, unless it is shadowed in a
+ descendant context.
+
+ Note that there is an asymmetry in this library: while prefix() will not
+ return the default "" prefix, even if you have declared one; to check for a
+ default prefix, you have to look it up explicitly using uri(). This
+ asymmetry exists to make it easier to look up prefixes for attribute names,
+ where the default prefix is not allowed.
+*/
+void QXmlNamespaceSupport::setPrefix( const QString& pre, const QString& uri )
+{
+ if( pre.isNull() ) {
+ ns.insert( "", uri );
+ } else {
+ ns.insert( pre, uri );
+ }
+}
+
+/*!
+ Returns one of the prefixes mapped to a namespace URI.
+
+ If more than one prefix is currently mapped to the same URI, this function
+ will make an arbitrary selection; if you want all of the prefixes, use the
+ prefixes() function instead.
+
+ Note: this will never return the empty (default) prefix; to check for a
+ default prefix, use the uri() function with an argument of "".
+*/
+QString QXmlNamespaceSupport::prefix( const QString& uri ) const
+{
+ QMap<QString, QString>::ConstIterator itc, it = ns.begin();
+ while ( (itc=it) != ns.end() ) {
+ ++it;
+ if ( itc.data() == uri && !itc.key().isEmpty() )
+ return itc.key();
+ }
+ return "";
+}
+
+/*!
+ Looks up a prefix in the current context and returns the currently-mapped
+ namespace URI. Use the empty string ("") for the default namespace.
+*/
+QString QXmlNamespaceSupport::uri( const QString& prefix ) const
+{
+ const QString& returi = ns[ prefix ];
+ return returi;
+}
+
+/*!
+ Splits the name at the ':' and returns the prefix and the local name.
+*/
+void QXmlNamespaceSupport::splitName( const QString& qname,
+ QString& prefix, QString& localname ) const
+{
+ uint pos;
+ // search the ':'
+ for( pos=0; pos<qname.length(); pos++ ) {
+ if ( qname.at(pos) == ':' )
+ break;
+ }
+ // and split
+ prefix = qname.left( pos );
+ localname = qname.mid( pos+1 );
+}
+
+/*!
+ Processes a raw XML 1.0 name in the current context by removing the prefix
+ and looking it up among the prefixes currently declared.
+
+ First parameter is the raw XML 1.0 name to be processed. The second parameter
+ is a flag wheter the name is the name of an attribute (TRUE) or not (FALSE).
+
+ The return values will be stored in the last two parameters as follows:
+ <ul>
+ <li> The namespace URI, or an empty string if none is in use.
+ <li> The local name (without prefix).
+ </ul>
+
+ If the raw name has a prefix that has not been declared, then the return
+ value will be empty.
+
+ Note that attribute names are processed differently than element names: an
+ unprefixed element name will received the default namespace (if any), while
+ an unprefixed element name will not
+*/
+void QXmlNamespaceSupport::processName( const QString& qname,
+ bool isAttribute,
+ QString& nsuri, QString& localname ) const
+{
+ uint pos;
+ // search the ':'
+ for( pos=0; pos<qname.length(); pos++ ) {
+ if ( qname.at(pos) == ':' )
+ break;
+ }
+ if ( pos < qname.length() ) {
+ // there was a ':'
+ nsuri = uri( qname.left( pos ) );
+ localname = qname.mid( pos+1 );
+ } else {
+ // there was no ':'
+ if ( isAttribute ) {
+ nsuri = ""; // attributes don't take default namespace
+ } else {
+ nsuri = uri( "" ); // get default namespace
+ }
+ localname = qname;
+ }
+}
+
+/*!
+ Returns an enumeration of all prefixes currently declared.
+
+ Note: if there is a default prefix, it will not be returned in this
+ enumeration; check for the default prefix using uri() with an argument
+ of "".
+*/
+QStringList QXmlNamespaceSupport::prefixes() const
+{
+ QStringList list;
+
+ QMap<QString, QString>::ConstIterator itc, it = ns.begin();
+ while ( (itc=it) != ns.end() ) {
+ ++it;
+ if ( !itc.key().isEmpty() )
+ list.append( itc.key() );
+ }
+ return list;
+}
+
+/*!
+ Returns a list of all prefixes currently declared for a URI.
+
+ The xml: prefix will be included. If you want only one prefix that's
+ mapped to the namespace URI, and you don't care which one you get, use the
+ prefix() function instead.
+
+ Note: the empty (default) prefix is never included in this enumeration; to
+ check for the presence of a default namespace, use uri() with an
+ argument of "".
+*/
+QStringList QXmlNamespaceSupport::prefixes( const QString& uri ) const
+{
+ QStringList list;
+
+ QMap<QString, QString>::ConstIterator itc, it = ns.begin();
+ while ( (itc=it) != ns.end() ) {
+ ++it;
+ if ( itc.data() == uri && !itc.key().isEmpty() )
+ list.append( itc.key() );
+ }
+ return list;
+}
+
+/*!
+ Starts a new namespace context.
+
+ Normally, you should push a new context at the beginning of each XML element:
+ the new context will automatically inherit the declarations of its parent
+ context, but it will also keep track of which declarations were made within
+ this context.
+*/
+void QXmlNamespaceSupport::pushContext()
+{
+ nsStack.push( ns );
+}
+
+/*!
+ Reverts to the previous namespace context.
+
+ Normally, you should pop the context at the end of each XML element. After
+ popping the context, all namespace prefix mappings that were previously in
+ force are restored.
+*/
+void QXmlNamespaceSupport::popContext()
+{
+ if( !nsStack.isEmpty() )
+ ns = nsStack.pop();
+}
+
+/*!
+ Resets this namespace support object for reuse.
+*/
+void QXmlNamespaceSupport::reset()
+{
+ nsStack.clear();
+ ns.clear();
+ ns.insert( "xml", "http://www.w3.org/XML/1998/namespace" ); // the XML namespace
+}
+
+
+
+/*********************************************
+ *
+ * QXmlAttributes
+ *
+ *********************************************/
+
+/*!
+ \class QXmlAttributes qxml.h
+ \brief The QXmlAttributes class provides XML attributes.
+
+ \module XML
+
+ If attributes are reported by QXmlContentHandler::startElement() this
+ class is used to pass the attribute values. It provides you with different
+ functions to access the attribute names and values.
+*/
+/*!
+ \fn QXmlAttributes::QXmlAttributes()
+
+ Constructs an empty attribute list.
+*/
+/*!
+ \fn QXmlAttributes::~QXmlAttributes()
+
+ Destructs attributes.
+*/
+
+/*!
+ Look up the index of an attribute by an XML 1.0 qualified name.
+
+ Returns the index of the attribute (starting with 0) or -1 if it wasn't
+ found.
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+*/
+int QXmlAttributes::index( const QString& qName ) const
+{
+ return qnameList.findIndex( qName );
+}
+
+/*!
+ Looks up the index of an attribute by a namespace name.
+
+ \a uri specifies the namespace URI, or the empty string if the name has no
+ namespace URI. \a localPart specifies the attribute's local name.
+
+ Returns the index of the attribute (starting with 0) or -1 if it wasn't
+ found.
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+*/
+int QXmlAttributes::index( const QString& uri, const QString& localPart ) const
+{
+ uint count = uriList.count();
+ for ( uint i=0; i<count; i++ ) {
+ if ( uriList[i] == uri && localnameList[i] == localPart )
+ return i;
+ }
+ return -1;
+}
+
+/*!
+ Returns the number of attributes in the list.
+*/
+int QXmlAttributes::length() const
+{
+ return valueList.count();
+}
+
+/*!
+ Looks up an attribute's local name by index (starting with 0).
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+*/
+QString QXmlAttributes::localName( int index ) const
+{
+ return localnameList[index];
+}
+
+/*!
+ Looks up an attribute's XML 1.0 qualified name by index (starting with 0).
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+*/
+QString QXmlAttributes::qName( int index ) const
+{
+ return qnameList[index];
+}
+
+/*!
+ Looks up an attribute's namespace URI by index (starting with 0).
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+*/
+QString QXmlAttributes::uri( int index ) const
+{
+ return uriList[index];
+}
+
+/*!
+ Looks up an attribute's type by index (starting with 0).
+
+ At the moment only 'CDATA' is returned.
+*/
+QString QXmlAttributes::type( int ) const
+{
+ return "CDATA";
+}
+
+/*!
+ Looks up an attribute's type by XML 1.0 qualified name.
+
+ At the moment only 'CDATA' is returned.
+*/
+QString QXmlAttributes::type( const QString& ) const
+{
+ return "CDATA";
+}
+
+/*!
+ Looks up an attribute's type by namespace name.
+
+ The first parameter specifies the namespace URI, or the empty string if
+ the name has no namespace URI. The second parameter specifies the
+ attribute's local name.
+
+ At the moment only 'CDATA' is returned.
+*/
+QString QXmlAttributes::type( const QString&, const QString& ) const
+{
+ return "CDATA";
+}
+
+/*!
+ Looks up an attribute's value by index (starting with 0).
+*/
+QString QXmlAttributes::value( int index ) const
+{
+ return valueList[index];
+}
+
+/*!
+ Looks up an attribute's value by XML 1.0 qualified name.
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+*/
+QString QXmlAttributes::value( const QString& qName ) const
+{
+ int i = index( qName );
+ if ( i == -1 )
+ return QString::null;
+ return valueList[ i ];
+}
+
+/*!
+ Looks up an attribute's value by namespace name.
+
+ \a uri specifies the namespace URI, or the empty string if the name has no
+ namespace URI. \a localName specifies the attribute's local name.
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+*/
+QString QXmlAttributes::value( const QString& uri, const QString& localName ) const
+{
+ int i = index( uri, localName );
+ if ( i == -1 )
+ return QString::null;
+ return valueList[ i ];
+}
+
+
+/*********************************************
+ *
+ * QXmlInputSource
+ *
+ *********************************************/
+
+/*!
+ \class QXmlInputSource qxml.h
+ \brief The QXmlInputSource class is the source where XML data is read from.
+
+ \module XML
+
+ All subclasses of QXmlReader read the input from this class.
+*/
+
+/*!
+ Returns all the data this input source contains.
+*/
+const QString& QXmlInputSource::data() const
+{
+ return input;
+}
+
+/*!
+ Constructs a input source which contains no data.
+*/
+QXmlInputSource::QXmlInputSource( )
+{
+ input = "";
+}
+
+/*!
+ Constructs a input source and get the data from the text stream.
+*/
+QXmlInputSource::QXmlInputSource( QTextStream& stream )
+{
+ QByteArray rawData;
+ if ( stream.device()->isDirectAccess() ) {
+ rawData = stream.device()->readAll();
+ } else {
+ int nread = 0;
+ const int bufsize = 512;
+ while ( !stream.device()->atEnd() ) {
+ rawData.resize( nread + bufsize );
+ nread += stream.device()->readBlock( rawData.data()+nread, bufsize );
+ }
+ rawData.resize( nread );
+ }
+ readInput( rawData );
+}
+
+/*!
+ Constructs a input source and get the data from a file. If the file cannot be
+ read the input source is empty.
+*/
+QXmlInputSource::QXmlInputSource( QFile& file )
+{
+ if ( !file.open(IO_ReadOnly) ) {
+ input = "";
+ return;
+ }
+ QByteArray rawData = file.readAll();
+ readInput( rawData );
+ file.close();
+}
+
+/*!
+ Destructor.
+*/
+QXmlInputSource::~QXmlInputSource()
+{
+}
+
+/*!
+ Sets the data of the input source to \a dat.
+*/
+void QXmlInputSource::setData( const QString& dat )
+{
+ input = dat;
+}
+
+/*!
+ Read the XML file from the byte array; try to recoginize the encoding.
+*/
+// ### The input source should not do the encoding detection!
+void QXmlInputSource::readInput( QByteArray& rawData )
+{
+ QBuffer buf( rawData );
+ buf.open( IO_ReadOnly );
+ QTextStream *stream = new QTextStream( &buf );
+ QChar tmp;
+ // assume UTF8 or UTF16 at first
+ stream->setEncoding( QTextStream::UnicodeUTF8 );
+ input = "";
+ // read the first 5 characters
+ for ( int i=0; i<5; i++ ) {
+ *stream >> tmp;
+ input += tmp;
+ }
+ // starts the document with an XML declaration?
+ if ( input == "<?xml" ) {
+ // read the whole XML declaration
+ do {
+ *stream >> tmp;
+ input += tmp;
+ } while( tmp != '>' );
+ // and try to find out if there is an encoding
+ int pos = input.find( "encoding" );
+ if ( pos != -1 ) {
+ QString encoding;
+ do {
+ pos++;
+ if ( pos > (int)input.length() )
+ goto finished;
+ } while( input[pos] != '"' && input[pos] != '\'' );
+ pos++;
+ while( input[pos] != '"' && input[pos] != '\'' ) {
+ encoding += input[pos];
+ pos++;
+ if ( pos > (int)input.length() )
+ goto finished;
+ }
+ delete stream;
+ stream = new QTextStream( &buf );
+ stream->setCodec( QTextCodec::codecForName( encoding ) );
+ buf.reset();
+ input = "";
+ }
+ }
+finished:
+ input += stream->read();
+ delete stream;
+ buf.close();
+}
+
+
+/*********************************************
+ *
+ * QXmlDefaultHandler
+ *
+ *********************************************/
+
+/*!
+ \class QXmlContentHandler qxml.h
+ \brief The QXmlContentHandler class provides an interface to report logical
+ content of XML data.
+
+ \module XML
+
+ If the application needs to be informed of basic parsing events, it
+ implements this interface and sets it with QXmlReader::setContentHandler().
+ The reader reports basic document-related events like the start and end of
+ elements and character data through this interface.
+
+ The order of events in this interface is very important, and mirrors the
+ order of information in the document itself. For example, all of an element's
+ content (character data, processing instructions, and/or subelements) will
+ appear, in order, between the startElement() event and the corresponding
+ endElement() event.
+
+ The class QXmlDefaultHandler gives a default implementation for this
+ interface; subclassing from this class is very convenient if you want only be
+ informed of some parsing events.
+
+ See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
+
+ \sa QXmlDTDHandler QXmlDeclHandler QXmlEntityResolver QXmlErrorHandler
+ QXmlLexicalHandler
+*/
+/*!
+ \fn void QXmlContentHandler::setDocumentLocator( QXmlLocator* locator )
+
+ The reader calls this function before he starts parsing the document. The
+ argument \a locator is a pointer to a QXmlLocator which allows the
+ application to get the actual position of the parsing in the document.
+
+ Do not destroy the \a locator; it is destroyed when the reader is destroyed
+ (do not use the \a locator after the reader got destroyed).
+*/
+/*!
+ \fn bool QXmlContentHandler::startDocument()
+
+ The reader calls this function when he starts parsing the document.
+ The reader will call this function only once before any other functions in
+ this class or in the QXmlDTDHandler class are called (except
+ QXmlContentHandler::setDocumentLocator()).
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ \sa endDocument()
+*/
+/*!
+ \fn bool QXmlContentHandler::endDocument()
+
+ The reader calls this function after he has finished the parsing. It
+ is only called once. It is the last function of all handler functions that is
+ called. It is called after the reader has read all input or has abandoned
+ parsing because of a fatal error.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ \sa startDocument()
+*/
+/*!
+ \fn bool QXmlContentHandler::startPrefixMapping( const QString& prefix, const QString& uri )
+
+ The reader calls this function to signal the begin of a prefix-URI
+ namespace mapping scope. This information is not necessary for normal
+ namespace processing since the reader automatically replaces prefixes for
+ element and attribute names.
+
+ Note that startPrefixMapping and endPrefixMapping calls are not guaranteed to
+ be properly nested relative to each-other: all startPrefixMapping events will
+ occur before the corresponding startElement event, and all endPrefixMapping
+ events will occur after the corresponding endElement event, but their order
+ is not otherwise guaranteed.
+
+ The argument \a prefix is the namespace prefix being declared and the
+ argument \a uri is the namespace URI the prefix is mapped to.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+
+ \sa endPrefixMapping()
+*/
+/*!
+ \fn bool QXmlContentHandler::endPrefixMapping( const QString& prefix )
+
+ The reader calls this function to signal the end of a prefix mapping.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+
+ \sa startPrefixMapping()
+*/
+/*!
+ \fn bool QXmlContentHandler::startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts )
+
+ The reader calls this function when he has parsed a start element tag.
+
+ There will be a corresponding endElement() call when the corresponding end
+ element tag was read. The startElement() and endElement() calls are always
+ nested correctly. Empty element tags (e.g. &lt;a/&gt;) are reported by
+ startElement() directly followed by a call to endElement().
+
+ The attribute list provided will contain only attributes with explicit
+ values. The attribute list will contain attributes used for namespace
+ declaration (i.e. attributes starting with xmlns) only if the
+ namespace-prefix property of the reader is TRUE.
+
+ The argument \a uri is the namespace URI, or the empty string if the element
+ has no namespace URI or if namespace processing is not being performed, \a
+ localName is the local name (without prefix), or the empty string if
+ namespace processing is not being performed, \a qName is the qualified name
+ (with prefix), or the empty string if qualified names are not available and
+ \a atts are the attributes attached to the element. If there are no
+ attributes, \a atts is an empty attributes object
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+
+ \sa endElement()
+*/
+/*!
+ \fn bool QXmlContentHandler::endElement( const QString& namespaceURI, const QString& localName, const QString& qName )
+
+ The reader calls this function when he has parsed an end element tag.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ See also the <a href="xml-sax.html#namespaces">namespace description</a>.
+
+ \sa startElement()
+*/
+/*!
+ \fn bool QXmlContentHandler::characters( const QString& ch )
+
+ The reader calls this function when he has parsed a chunk of character
+ data (either normal character data or character data inside a CDATA section;
+ if you have to distinguish between those two types you have to use
+ QXmlLexicalHandler::startCDATA() and QXmlLexicalHandler::endCDATA() in
+ addition).
+
+ Some readers will report whitespace in element content using the
+ ignorableWhitespace() function rather than this one (QXmlSimpleReader will
+ do it not though).
+
+ A reader is allowed to report the character data of an element in more than
+ one chunk; e.g. a reader might want to report "a &amp;lt; b" in three
+ characters() events ("a ", "<" and " b").
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn bool QXmlContentHandler::ignorableWhitespace( const QString& ch )
+
+ Some readers may use this function to report each chunk of whitespace in
+ element content (QXmlSimpleReader does not though).
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn bool QXmlContentHandler::processingInstruction( const QString& target, const QString& data )
+
+ The reader calls this function when he has parsed a processing
+ instruction.
+
+ \a target is the target name of the processing instruction and \a data is the
+ data of the processing instruction.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn bool QXmlContentHandler::skippedEntity( const QString& name )
+
+ Some readers may skip entities if they have not seen the declarations (e.g.
+ because they are in an external DTD). If they do so they will report it by
+ calling this function.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn QString QXmlContentHandler::errorString()
+
+ The reader calls this function to get an error string if any of the handler
+ functions returns FALSE to him.
+*/
+
+
+/*!
+ \class QXmlErrorHandler qxml.h
+ \brief The QXmlErrorHandler class provides an interface to report errors in
+ XML data.
+
+ \module XML
+
+ If the application is interested in reporting errors to the user or any other
+ customized error handling, you should subclass this class.
+
+ You can set the error handler with QXmlReader::setErrorHandler().
+
+ See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
+
+ \sa QXmlDTDHandler QXmlDeclHandler QXmlContentHandler QXmlEntityResolver
+ QXmlLexicalHandler
+*/
+/*!
+ \fn bool QXmlErrorHandler::warning( const QXmlParseException& exception )
+
+ A reader might use this function to report a warning. Warnings are conditions
+ that are not errors or fatal errors as defined by the XML 1.0 specification.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn bool QXmlErrorHandler::error( const QXmlParseException& exception )
+
+ A reader might use this function to report a recoverable error. A recoverable
+ error corresponds to the definiton of "error" in section 1.2 of the XML 1.0
+ specification.
+
+ The reader must continue to provide normal parsing events after invoking this
+ function.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn bool QXmlErrorHandler::fatalError( const QXmlParseException& exception )
+
+ A reader must use this function to report a non-recoverable error.
+
+ If this function returns TRUE the reader might try to go on parsing and
+ reporting further errors; but no regular parsing events are reported.
+*/
+/*!
+ \fn QString QXmlErrorHandler::errorString()
+
+ The reader calls this function to get an error string if any of the handler
+ functions returns FALSE to him.
+*/
+
+
+/*!
+ \class QXmlDTDHandler qxml.h
+ \brief The QXmlDTDHandler class provides an interface to report DTD content
+ of XML data.
+
+ \module XML
+
+ If an application needs information about notations and unparsed entities,
+ then the application implements this interface and registers an instance with
+ QXmlReader::setDTDHandler().
+
+ Note that this interface includes only those DTD events that the XML
+ recommendation requires processors to report: notation and unparsed entity
+ declarations.
+
+ See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
+
+ \sa QXmlDeclHandler QXmlContentHandler QXmlEntityResolver QXmlErrorHandler
+ QXmlLexicalHandler
+*/
+/*!
+ \fn bool QXmlDTDHandler::notationDecl( const QString& name, const QString& publicId, const QString& systemId )
+
+ The reader calls this function when he has parsed a notation
+ declaration.
+
+ The argument \a name is the notation name, \a publicId is the notations's
+ public identifier and \a systemId is the notations's system identifier.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn bool QXmlDTDHandler::unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName )
+
+ The reader calls this function when he finds an unparsed entity declaration.
+
+ The argument \a name is the unparsed entity's name, \a publicId is the
+ entity's public identifier, \a systemId is the entity's system identifier and
+ \a notation is the name of the associated notation.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn QString QXmlDTDHandler::errorString()
+
+ The reader calls this function to get an error string if any of the handler
+ functions returns FALSE to him.
+*/
+
+
+/*!
+ \class QXmlEntityResolver qxml.h
+ \brief The QXmlEntityResolver class provides an interface to resolve extern
+ entities contained in XML data.
+
+ \module XML
+
+ If an application needs to implement customized handling for external
+ entities, it must implement this interface and register it with
+ QXmlReader::setEntityResolver().
+
+ See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
+
+ \sa QXmlDTDHandler QXmlDeclHandler QXmlContentHandler QXmlErrorHandler
+ QXmlLexicalHandler
+*/
+/*!
+ \fn bool QXmlEntityResolver::resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource* ret )
+
+ The reader will call this function before he opens any external entity,
+ except the top-level document entity. The application may request the reader
+ to resolve the entity itself (\a ret is 0) or to use an entirely different
+ input source (\a ret points to the input source).
+
+ The reader will delete the input source \a ret when he no longer needs it. So
+ you should allocate it on the heap with \c new.
+
+ The argument \a publicId is the public identifier of the external entity, \a
+ systemId is the system identifier of the external entity and \a ret is the
+ return value of this function: if it is 0 the reader should resolve the
+ entity itself, if it is non-zero it must point to an input source which the
+ reader will use instead.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn QString QXmlEntityResolver::errorString()
+
+ The reader calls this function to get an error string if any of the handler
+ functions returns FALSE to him.
+*/
+
+
+/*!
+ \class QXmlLexicalHandler qxml.h
+ \brief The QXmlLexicalHandler class provides an interface to report lexical
+ content of XML data.
+
+ \module XML
+
+ The events in the lexical handler apply to the entire document, not just to
+ the document element, and all lexical handler events appear between the
+ content handler's startDocument and endDocument events.
+
+ You can set the lexical handler with QXmlReader::setLexicalHandler().
+
+ This interface is designed after the SAX2 extension LexicalHandler. The
+ functions startEntity() and endEntity() are not included though.
+
+ See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
+
+ \sa QXmlDTDHandler QXmlDeclHandler QXmlContentHandler QXmlEntityResolver
+ QXmlErrorHandler
+*/
+/*!
+ \fn bool QXmlLexicalHandler::startDTD( const QString& name, const QString& publicId, const QString& systemId )
+
+ The reader calls this function to report the start of a DTD declaration, if
+ any.
+
+ All declarations reported through QXmlDTDHandler or QXmlDeclHandler appear
+ between the startDTD() and endDTD() calls.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ \sa endDTD()
+*/
+/*!
+ \fn bool QXmlLexicalHandler::endDTD()
+
+ The reader calls this function to report the end of a DTD declaration, if
+ any.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ \sa startDTD()
+*/
+/*!
+ \fn bool QXmlLexicalHandler::startCDATA()
+
+ The reader calls this function to report the start of a CDATA section. The
+ content of the CDATA section will be reported through the regular
+ QXmlContentHandler::characters(). This function is intended only to report
+ the boundary.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ \sa endCDATA()
+*/
+/*!
+ \fn bool QXmlLexicalHandler::endCDATA()
+
+ The reader calls this function to report the end of a CDATA section.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+
+ \sa startCDATA()
+*/
+/*!
+ \fn bool QXmlLexicalHandler::comment( const QString& ch )
+
+ The reader calls this function to report an XML comment anywhere in the
+ document.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn QString QXmlLexicalHandler::errorString()
+
+ The reader calls this function to get an error string if any of the handler
+ functions returns FALSE to him.
+*/
+
+
+/*!
+ \class QXmlDeclHandler qxml.h
+ \brief The QXmlDeclHandler class provides an interface to report declaration
+ content of XML data.
+
+ \module XML
+
+ You can set the declaration handler with QXmlReader::setDeclHandler().
+
+ This interface is designed after the SAX2 extension DeclHandler.
+
+ See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
+
+ \sa QXmlDTDHandler QXmlContentHandler QXmlEntityResolver QXmlErrorHandler
+ QXmlLexicalHandler
+*/
+/*!
+ \fn bool QXmlDeclHandler::attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value )
+
+ The reader calls this function to report an attribute type declaration. Only
+ the effective (first) declaration for an attribute will be reported.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn bool QXmlDeclHandler::internalEntityDecl( const QString& name, const QString& value )
+
+ The reader calls this function to report an internal entity declaration. Only
+ the effective (first) declaration will be reported.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn bool QXmlDeclHandler::externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId )
+
+ The reader calls this function to report a parsed external entity
+ declaration. Only the effective (first) declaration for each entity will be
+ reported.
+
+ If this function returns FALSE the reader will stop parsing and will report
+ an error. The reader will use the function errorString() to get the error
+ message that will be used for reporting the error.
+*/
+/*!
+ \fn QString QXmlDeclHandler::errorString()
+
+ The reader calls this function to get an error string if any of the handler
+ functions returns FALSE to him.
+*/
+
+
+/*!
+ \class QXmlDefaultHandler qxml.h
+ \brief The QXmlDefaultHandler class provides a default implementation of all
+ XML handler classes.
+
+ \module XML
+
+ Very often you are only interested in parts of the things that that the
+ reader reports to you. This class simply implements a default behaviour of
+ the handler classes (most of the time: do nothing). Normally this is the
+ class you subclass for implementing your customized handler.
+
+ See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
+
+ \sa QXmlDTDHandler QXmlDeclHandler QXmlContentHandler QXmlEntityResolver
+ QXmlErrorHandler QXmlLexicalHandler
+*/
+/*!
+ \fn QXmlDefaultHandler::QXmlDefaultHandler()
+
+ Constructor.
+*/
+/*!
+ \fn QXmlDefaultHandler::~QXmlDefaultHandler()
+
+ Destructor.
+*/
+
+/*!
+ Does nothing.
+*/
+void QXmlDefaultHandler::setDocumentLocator( QXmlLocator* )
+{
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::startDocument()
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::endDocument()
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::startPrefixMapping( const QString&, const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::endPrefixMapping( const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::startElement( const QString&, const QString&,
+ const QString&, const QXmlAttributes& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::endElement( const QString&, const QString&,
+ const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::characters( const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::ignorableWhitespace( const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::processingInstruction( const QString&,
+ const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::skippedEntity( const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::warning( const QXmlParseException& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::error( const QXmlParseException& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::fatalError( const QXmlParseException& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::notationDecl( const QString&, const QString&,
+ const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::unparsedEntityDecl( const QString&, const QString&,
+ const QString&, const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Always sets \a ret to 0, so that the reader will use the system identifier
+ provided in the XML document.
+*/
+bool QXmlDefaultHandler::resolveEntity( const QString&, const QString&,
+ QXmlInputSource* ret )
+{
+ ret = 0;
+ return TRUE;
+}
+
+/*!
+ Returns the default error string.
+*/
+QString QXmlDefaultHandler::errorString()
+{
+ return QString( XMLERR_ERRORBYCONSUMER );
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::startDTD( const QString&, const QString&, const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::endDTD()
+{
+ return TRUE;
+}
+
+#if 0
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::startEntity( const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::endEntity( const QString& )
+{
+ return TRUE;
+}
+#endif
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::startCDATA()
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::endCDATA()
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::comment( const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::attributeDecl( const QString&, const QString&, const QString&, const QString&, const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::internalEntityDecl( const QString&, const QString& )
+{
+ return TRUE;
+}
+
+/*!
+ Does nothing.
+*/
+bool QXmlDefaultHandler::externalEntityDecl( const QString&, const QString&, const QString& )
+{
+ return TRUE;
+}
+
+
+/*********************************************
+ *
+ * QXmlSimpleReaderPrivate
+ *
+ *********************************************/
+
+class QXmlSimpleReaderPrivate
+{
+private:
+ // constructor
+ QXmlSimpleReaderPrivate()
+ { }
+
+
+ // used for entity declarations
+ struct ExternParameterEntity
+ {
+ ExternParameterEntity( ) {}
+ ExternParameterEntity( const QString &p, const QString &s )
+ : publicId(p), systemId(s) {}
+ QString publicId;
+ QString systemId;
+ };
+ struct ExternEntity
+ {
+ ExternEntity( ) {}
+ ExternEntity( const QString &p, const QString &s, const QString &n )
+ : publicId(p), systemId(s), notation(n) {}
+ QString publicId;
+ QString systemId;
+ QString notation;
+ };
+ QMap<QString,ExternParameterEntity> externParameterEntities;
+ QMap<QString,QString> parameterEntities;
+ QMap<QString,ExternEntity> externEntities;
+ QMap<QString,QString> entities;
+
+ // used for standalone declaration
+ enum Standalone { Yes, No, Unknown };
+
+ QString doctype; // only used for the doctype
+ QString xmlVersion; // only used to store the version information
+ QString encoding; // only used to store the encoding
+ Standalone standalone; // used to store the value of the standalone declaration
+
+ QString publicId; // used by parseExternalID() to store the public ID
+ QString systemId; // used by parseExternalID() to store the system ID
+ QString attDeclEName; // use by parseAttlistDecl()
+ QString attDeclAName; // use by parseAttlistDecl()
+
+ // flags for some features support
+ bool useNamespaces;
+ bool useNamespacePrefixes;
+ bool reportWhitespaceCharData;
+
+ // used to build the attribute list
+ QXmlAttributes attList;
+
+ // helper classes
+ QXmlLocator *locator;
+ QXmlNamespaceSupport namespaceSupport;
+
+ // error string
+ QString error;
+
+ // friend declarations
+ friend class QXmlSimpleReader;
+};
+
+
+/*********************************************
+ *
+ * QXmlSimpleReader
+ *
+ *********************************************/
+
+/*!
+ \class QXmlReader qxml.h
+ \brief The QXmlReader class provides an interface for XML readers (i.e.
+ parsers).
+
+ \module XML
+
+ This abstract class describes an interface for all XML readers in Qt. At the
+ moment there is only one implementation of a reader included in the XML
+ module of Qt (QXmlSimpleReader). In future releases there might be more
+ readers with different properties available (e.g. a validating parser).
+
+ The design of the XML classes follow the
+ <a href="http://www.megginson.com/SAX/">SAX2 java interface</a>.
+ It was adopted to fit into the Qt naming conventions; so it should be very
+ easy for anybody who has worked with SAX2 to get started with the Qt XML
+ classes.
+
+ All readers use the class QXmlInputSource to read the input document from.
+ Since you are normally interested in certain contents of the XML document,
+ the reader reports those contents through special handler classes
+ (QXmlDTDHandler, QXmlDeclHandler, QXmlContentHandler, QXmlEntityResolver,
+ QXmlErrorHandler and QXmlLexicalHandler).
+
+ You have to subclass these classes. Since the handler classes describe only
+ interfaces you must implement all functions; there is a class
+ (QXmlDefaultHandler) to make this easier; it implements a default behaviour
+ (do nothing) for all functions.
+
+ For getting started see also the
+ <a href="xml-sax.html#quickStart">Quick start</a>.
+
+ \sa QXmlSimpleReader
+*/
+/*!
+ \fn bool QXmlReader::feature( const QString& name, bool *ok ) const
+
+ If the reader has the feature \a name, this function returns the value of the
+ feature.
+
+ If the reader has not the feature \a name, the return value may be anything.
+
+ If \a ok is not 0, then \a ok is set to TRUE if the reader has the feature
+ \a name, otherwise \a ok is set to FALSE.
+
+ \sa setFeature() hasFeature()
+*/
+/*!
+ \fn void QXmlReader::setFeature( const QString& name, bool value )
+
+ Sets the feature \a name to \a value. If the reader has not the feature \a
+ name, this value is ignored.
+
+ \sa feature() hasFeature()
+*/
+/*!
+ \fn bool QXmlReader::hasFeature( const QString& name ) const
+
+ Returns \c TRUE if the reader has the feature \a name, otherwise FALSE.
+
+ \sa feature() setFeature()
+*/
+/*!
+ \fn void* QXmlReader::property( const QString& name, bool *ok ) const
+
+ If the reader has the property \a name, this function returns the value of
+ the property.
+
+ If the reader has not the property \a name, the return value is 0.
+
+ If \a ok is not 0, then \a ok is set to TRUE if the reader has the property
+ \a name, otherwise \a ok is set to FALSE.
+
+ \sa setProperty() hasProperty()
+*/
+/*!
+ \fn void QXmlReader::setProperty( const QString& name, void* value )
+
+ Sets the property \a name to \a value. If the reader has not the property \a
+ name, this value is ignored.
+
+ \sa property() hasProperty()
+*/
+/*!
+ \fn bool QXmlReader::hasProperty( const QString& name ) const
+
+ Returns TRUE if the reader has the property \a name, otherwise FALSE.
+
+ \sa property() setProperty()
+*/
+/*!
+ \fn void QXmlReader::setEntityResolver( QXmlEntityResolver* handler )
+
+ Sets the entity resolver to \a handler.
+
+ \sa entityResolver()
+*/
+/*!
+ \fn QXmlEntityResolver* QXmlReader::entityResolver() const
+
+ Returns the entity resolver or 0 if none was set.
+
+ \sa setEntityResolver()
+*/
+/*!
+ \fn void QXmlReader::setDTDHandler( QXmlDTDHandler* handler )
+
+ Sets the DTD handler to \a handler.
+
+ \sa DTDHandler()
+*/
+/*!
+ \fn QXmlDTDHandler* QXmlReader::DTDHandler() const
+
+ Returns the DTD handler or 0 if none was set.
+
+ \sa setDTDHandler()
+*/
+/*!
+ \fn void QXmlReader::setContentHandler( QXmlContentHandler* handler )
+
+ Sets the content handler to \a handler.
+
+ \sa contentHandler()
+*/
+/*!
+ \fn QXmlContentHandler* QXmlReader::contentHandler() const
+
+ Returns the content handler or 0 if none was set.
+
+ \sa setContentHandler()
+*/
+/*!
+ \fn void QXmlReader::setErrorHandler( QXmlErrorHandler* handler )
+
+ Sets the error handler to \a handler.
+
+ \sa errorHandler()
+*/
+/*!
+ \fn QXmlErrorHandler* QXmlReader::errorHandler() const
+
+ Returns the error handler or 0 if none was set
+
+ \sa setErrorHandler()
+*/
+/*!
+ \fn void QXmlReader::setLexicalHandler( QXmlLexicalHandler* handler )
+
+ Sets the lexical handler to \a handler.
+
+ \sa lexicalHandler()
+*/
+/*!
+ \fn QXmlLexicalHandler* QXmlReader::lexicalHandler() const
+
+ Returns the lexical handler or 0 if none was set.
+
+ \sa setLexicalHandler()
+*/
+/*!
+ \fn void QXmlReader::setDeclHandler( QXmlDeclHandler* handler )
+
+ Sets the declaration handler to \a handler.
+
+ \sa declHandler()
+*/
+/*!
+ \fn QXmlDeclHandler* QXmlReader::declHandler() const
+
+ Returns the declaration handler or 0 if none was set.
+
+ \sa setDeclHandler()
+*/
+/*!
+ \fn bool QXmlReader::parse( const QXmlInputSource& input )
+
+ Parses the XML document \a input. Returns TRUE if the parsing was successful,
+ otherwise FALSE.
+*/
+/*!
+ \fn bool QXmlReader::parse( const QString& systemId )
+
+ Parses the XML document at the location \a systemId. Returns TRUE if the
+ parsing was successful, otherwise FALSE.
+*/
+
+
+/*!
+ \class QXmlSimpleReader qxml.h
+ \brief The QXmlSimpleReader class provides an implementation of a simple XML
+ reader (i.e. parser).
+
+ \module XML
+
+ This XML reader is sufficient for simple parsing tasks. Here is a short list
+ of the properties of this reader:
+ <ul>
+ <li> well-formed parser
+ <li> does not parse any external entities
+ <li> can do namespace processing
+ </ul>
+
+ For getting started see also the
+ <a href="xml-sax.html#quickStart">Quick start</a>.
+*/
+
+//guaranteed not to be a characater
+const QChar QXmlSimpleReader::QEOF = QChar((ushort)0xffff);
+
+/*!
+ Constructs a simple XML reader.
+*/
+QXmlSimpleReader::QXmlSimpleReader()
+{
+ d = new QXmlSimpleReaderPrivate();
+ d->locator = new QXmlLocator( this );
+
+ entityRes = 0;
+ dtdHnd = 0;
+ contentHnd = 0;
+ errorHnd = 0;
+ lexicalHnd = 0;
+ declHnd = 0;
+
+ // default feature settings
+ d->useNamespaces = TRUE;
+ d->useNamespacePrefixes = FALSE;
+ d->reportWhitespaceCharData = TRUE;
+}
+
+/*!
+ Destroys a simple XML reader.
+*/
+QXmlSimpleReader::~QXmlSimpleReader()
+{
+ delete d->locator;
+ delete d;
+}
+
+/*!
+ Gets the state of a feature.
+
+ \sa setFeature() hasFeature()
+*/
+bool QXmlSimpleReader::feature( const QString& name, bool *ok ) const
+{
+ if ( ok != 0 )
+ *ok = TRUE;
+ if ( name == "http://xml.org/sax/features/namespaces" ) {
+ return d->useNamespaces;
+ } else if ( name == "http://xml.org/sax/features/namespace-prefixes" ) {
+ return d->useNamespacePrefixes;
+ } else if ( name == "http://trolltech.com/xml/features/report-whitespace-only-CharData" ) {
+ return d->reportWhitespaceCharData;
+ } else {
+ qWarning( "Unknown feature %s", name.ascii() );
+ if ( ok != 0 )
+ *ok = FALSE;
+ }
+ return FALSE;
+}
+
+/*!
+ Sets the state of a feature.
+
+ Supported features are:
+ <ul>
+ <li> http://xml.org/sax/features/namespaces:
+ if this feature is TRUE, namespace processing is performed
+ <li> http://xml.org/sax/features/namespace-prefixes:
+ if this feature is TRUE, the the original prefixed names and attributes
+ used for namespace declarations are reported
+ <li> http://trolltech.com/xml/features/report-whitespace-only-CharData:
+ if this feature is TRUE, CharData that consists only of whitespace (and
+ no other characters) is not reported via
+ QXmlContentHandler::characters()
+ </ul>
+
+ \sa feature() hasFeature()
+*/
+void QXmlSimpleReader::setFeature( const QString& name, bool value )
+{
+ if ( name == "http://xml.org/sax/features/namespaces" ) {
+ d->useNamespaces = value;
+ } else if ( name == "http://xml.org/sax/features/namespace-prefixes" ) {
+ d->useNamespacePrefixes = value;
+ } else if ( name == "http://trolltech.com/xml/features/report-whitespace-only-CharData" ) {
+ d->reportWhitespaceCharData = value;
+ } else {
+ qWarning( "Unknown feature %s", name.ascii() );
+ }
+}
+
+/*!
+ Returns TRUE if the class has a feature named \a feature, otherwise FALSE.
+
+ \sa setFeature() feature()
+*/
+bool QXmlSimpleReader::hasFeature( const QString& name ) const
+{
+ if ( name == "http://xml.org/sax/features/namespaces" ||
+ name == "http://xml.org/sax/features/namespace-prefixes" ||
+ name == "http://trolltech.com/xml/features/report-whitespace-only-CharData" ) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+/*!
+ Returns 0 since this class does not support any properties.
+*/
+void* QXmlSimpleReader::property( const QString&, bool *ok ) const
+{
+ if ( ok != 0 )
+ *ok = FALSE;
+ return 0;
+}
+
+/*!
+ Does nothing since this class does not support any properties.
+*/
+void QXmlSimpleReader::setProperty( const QString&, void* )
+{
+}
+
+/*!
+ Returns FALSE since this class does not support any properties.
+*/
+bool QXmlSimpleReader::hasProperty( const QString& ) const
+{
+ return FALSE;
+}
+
+/*! \reimp */
+void QXmlSimpleReader::setEntityResolver( QXmlEntityResolver* handler )
+{ entityRes = handler; }
+
+/*! \reimp */
+QXmlEntityResolver* QXmlSimpleReader::entityResolver() const
+{ return entityRes; }
+
+/*! \reimp */
+void QXmlSimpleReader::setDTDHandler( QXmlDTDHandler* handler )
+{ dtdHnd = handler; }
+
+/*! \reimp */
+QXmlDTDHandler* QXmlSimpleReader::DTDHandler() const
+{ return dtdHnd; }
+
+/*! \reimp */
+void QXmlSimpleReader::setContentHandler( QXmlContentHandler* handler )
+{ contentHnd = handler; }
+
+/*! \reimp */
+QXmlContentHandler* QXmlSimpleReader::contentHandler() const
+{ return contentHnd; }
+
+/*! \reimp */
+void QXmlSimpleReader::setErrorHandler( QXmlErrorHandler* handler )
+{ errorHnd = handler; }
+
+/*! \reimp */
+QXmlErrorHandler* QXmlSimpleReader::errorHandler() const
+{ return errorHnd; }
+
+/*! \reimp */
+void QXmlSimpleReader::setLexicalHandler( QXmlLexicalHandler* handler )
+{ lexicalHnd = handler; }
+
+/*! \reimp */
+QXmlLexicalHandler* QXmlSimpleReader::lexicalHandler() const
+{ return lexicalHnd; }
+
+/*! \reimp */
+void QXmlSimpleReader::setDeclHandler( QXmlDeclHandler* handler )
+{ declHnd = handler; }
+
+/*! \reimp */
+QXmlDeclHandler* QXmlSimpleReader::declHandler() const
+{ return declHnd; }
+
+
+
+/*! \reimp */
+bool QXmlSimpleReader::parse( const QXmlInputSource& input )
+{
+ init( input );
+ // call the handler
+ if ( contentHnd ) {
+ contentHnd->setDocumentLocator( d->locator );
+ if ( !contentHnd->startDocument() ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ // parse prolog
+ if ( !parseProlog() ) {
+ d->error = XMLERR_ERRORPARSINGPROLOG;
+ goto parseError;
+ }
+ // parse element
+ if ( !parseElement() ) {
+ d->error = XMLERR_ERRORPARSINGMAINELEMENT;
+ goto parseError;
+ }
+ // parse Misc*
+ while ( !atEnd() ) {
+ if ( !parseMisc() ) {
+ d->error = XMLERR_ERRORPARSINGMISC;
+ goto parseError;
+ }
+ }
+ // is stack empty?
+ if ( !tags.isEmpty() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ // call the handler
+ if ( contentHnd ) {
+ if ( !contentHnd->endDocument() ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+
+ return TRUE;
+
+ // error handling
+
+parseError:
+ reportParseError();
+ tags.clear();
+ return FALSE;
+}
+
+/*!
+ Parses the prolog [22].
+*/
+bool QXmlSimpleReader::parseProlog()
+{
+ bool xmldecl_possible = TRUE;
+ bool doctype_read = FALSE;
+
+ const signed char Init = 0;
+ const signed char EatWS = 1; // eat white spaces
+ const signed char Lt = 2; // '<' read
+ const signed char Em = 3; // '!' read
+ const signed char DocType = 4; // read doctype
+ const signed char Comment = 5; // read comment
+ const signed char PI = 6; // read PI
+ const signed char Done = 7;
+
+ const signed char InpWs = 0;
+ const signed char InpLt = 1; // <
+ const signed char InpQm = 2; // ?
+ const signed char InpEm = 3; // !
+ const signed char InpD = 4; // D
+ const signed char InpDash = 5; // -
+ const signed char InpUnknown = 6;
+
+ // use some kind of state machine for parsing
+ static signed char table[7][7] = {
+ /* InpWs InpLt InpQm InpEm InpD InpDash InpUnknown */
+ { EatWS, Lt, -1, -1, -1, -1, -1 }, // Init
+ { -1, Lt, -1, -1, -1, -1, -1 }, // EatWS
+ { -1, -1, PI, Em, Done, -1, Done }, // Lt
+ { -1, -1, -1, -1, DocType, Comment, -1 }, // Em
+ { EatWS, Lt, -1, -1, -1, -1, -1 }, // DocType
+ { EatWS, Lt, -1, -1, -1, -1, -1 }, // Comment
+ { EatWS, Lt, -1, -1, -1, -1, -1 } // PI
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // read input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == '<' ) {
+ input = InpLt;
+ } else if ( c == '?' ) {
+ input = InpQm;
+ } else if ( c == '!' ) {
+ input = InpEm;
+ } else if ( c == 'D' ) {
+ input = InpD;
+ } else if ( c == '-' ) {
+ input = InpDash;
+ } else {
+ input = InpUnknown;
+ }
+ // get new state
+ state = table[state][input];
+
+ // in some cases do special actions depending on state
+ switch ( state ) {
+ case EatWS:
+ // XML declaration only on first position possible
+ xmldecl_possible = FALSE;
+ // eat white spaces
+ eat_ws();
+ break;
+ case Lt:
+ // next character
+ next();
+ break;
+ case Em:
+ // XML declaration only on first position possible
+ xmldecl_possible = FALSE;
+ // next character
+ next();
+ break;
+ case DocType:
+ parseOk = parseDoctype();
+ break;
+ case Comment:
+ parseOk = parseComment();
+ break;
+ case PI:
+ parseOk = parsePI( xmldecl_possible );
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case DocType:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGPROLOG;
+ goto parseError;
+ }
+ if ( doctype_read ) {
+ d->error = XMLERR_MORETHANONEDOCTYPE;
+ goto parseError;
+ } else {
+ doctype_read = FALSE;
+ }
+ break;
+ case Comment:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGPROLOG;
+ goto parseError;
+ }
+ if ( lexicalHnd ) {
+ if ( !lexicalHnd->comment( string() ) ) {
+ d->error = lexicalHnd->errorString();
+ goto parseError;
+ }
+ }
+ break;
+ case PI:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGPROLOG;
+ goto parseError;
+ }
+ // call the handler
+ if ( contentHnd ) {
+ if ( xmldecl_possible && !d->xmlVersion.isEmpty() ) {
+ QString value( "version = '" );
+ value += d->xmlVersion;
+ value += "'";
+ if ( !d->encoding.isEmpty() ) {
+ value += " encoding = '";
+ value += d->encoding;
+ value += "'";
+ }
+ if ( d->standalone == QXmlSimpleReaderPrivate::Yes ) {
+ value += " standalone = 'yes'";
+ } else if ( d->standalone == QXmlSimpleReaderPrivate::No ) {
+ value += " standalone = 'no'";
+ }
+ if ( !contentHnd->processingInstruction( "xml", value ) ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ } else {
+ if ( !contentHnd->processingInstruction( name(), string() ) ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ }
+ // XML declaration only on first position possible
+ xmldecl_possible = FALSE;
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ d->error = XMLERR_ERRORPARSINGELEMENT;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse an element [39].
+
+ Precondition: the opening '<' is already read.
+*/
+bool QXmlSimpleReader::parseElement()
+{
+ static QString uri, lname, prefix;
+ static bool t;
+
+ const signed char Init = 0;
+ const signed char ReadName = 1;
+ const signed char Ws1 = 2;
+ const signed char STagEnd = 3;
+ const signed char STagEnd2 = 4;
+ const signed char ETagBegin = 5;
+ const signed char ETagBegin2 = 6;
+ const signed char Ws2 = 7;
+ const signed char EmptyTag = 8;
+ const signed char Attribute = 9;
+ const signed char Ws3 = 10;
+ const signed char Done = 11;
+
+ const signed char InpWs = 0; // whitespace
+ const signed char InpNameBe = 1; // is_NameBeginning()
+ const signed char InpGt = 2; // >
+ const signed char InpSlash = 3; // /
+ const signed char InpUnknown = 4;
+
+ // use some kind of state machine for parsing
+ static signed char table[11][5] = {
+ /* InpWs InpNameBe InpGt InpSlash InpUnknown */
+ { -1, ReadName, -1, -1, -1 }, // Init
+ { Ws1, Attribute, STagEnd, EmptyTag, -1 }, // ReadName
+ { -1, Attribute, STagEnd, EmptyTag, -1 }, // Ws1
+ { STagEnd2, STagEnd2, STagEnd2, STagEnd2, STagEnd2 }, // STagEnd
+ { -1, -1, -1, ETagBegin, -1 }, // STagEnd2
+ { -1, ETagBegin2, -1, -1, -1 }, // ETagBegin
+ { Ws2, -1, Done, -1, -1 }, // ETagBegin2
+ { -1, -1, Done, -1, -1 }, // Ws2
+ { -1, -1, Done, -1, -1 }, // EmptyTag
+ { Ws3, Attribute, STagEnd, EmptyTag, -1 }, // Attribute
+ { -1, Attribute, STagEnd, EmptyTag, -1 } // Ws3
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // read input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( is_NameBeginning(c) ) {
+ input = InpNameBe;
+ } else if ( c == '>' ) {
+ input = InpGt;
+ } else if ( c == '/' ) {
+ input = InpSlash;
+ } else {
+ input = InpUnknown;
+ }
+ // get new state
+//qDebug( "%d -%d(%c)-> %d", state, input, c.latin1(), table[state][input] );
+ state = table[state][input];
+
+ // in some cases do special actions depending on state
+ switch ( state ) {
+ case ReadName:
+ parseOk = parseName();
+ break;
+ case Ws1:
+ case Ws2:
+ case Ws3:
+ eat_ws();
+ break;
+ case STagEnd:
+ // call the handler
+ if ( contentHnd ) {
+ if ( d->useNamespaces ) {
+ d->namespaceSupport.processName( tags.top(), FALSE, uri, lname );
+ t = contentHnd->startElement( uri, lname, tags.top(), d->attList );
+ } else {
+ t = contentHnd->startElement( "", "", tags.top(), d->attList );
+ }
+ if ( !t ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ next();
+ break;
+ case STagEnd2:
+ parseOk = parseContent();
+ break;
+ case ETagBegin:
+ next();
+ break;
+ case ETagBegin2:
+ // get the name of the tag
+ parseOk = parseName();
+ break;
+ case EmptyTag:
+ if ( tags.isEmpty() ) {
+ d->error = XMLERR_TAGMISMATCH;
+ goto parseError;
+ }
+ if ( !parseElementEmptyTag( t, uri, lname ) )
+ goto parseError;
+ // next character
+ next();
+ break;
+ case Attribute:
+ // get name and value of attribute
+ parseOk = parseAttribute();
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case ReadName:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ // store it on the stack
+ tags.push( name() );
+ // empty the attributes
+ d->attList.qnameList.clear();
+ d->attList.uriList.clear();
+ d->attList.localnameList.clear();
+ d->attList.valueList.clear();
+ // namespace support?
+ if ( d->useNamespaces ) {
+ d->namespaceSupport.pushContext();
+ }
+ break;
+ case STagEnd2:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGCONTENT;
+ goto parseError;
+ }
+ break;
+ case ETagBegin2:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ if ( !parseElementETagBegin2() )
+ goto parseError;
+ break;
+ case Attribute:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGATTRIBUTE;
+ goto parseError;
+ }
+ if ( !parseElementAttribute( prefix, uri, lname ) )
+ goto parseError;
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ d->error = XMLERR_ERRORPARSINGELEMENT;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+/*!
+ Helper to break down the size of the code in the case statement.
+ Return FALSE on error, otherwise TRUE.
+*/
+bool QXmlSimpleReader::parseElementEmptyTag( bool &t, QString &uri, QString &lname )
+{
+ // pop the stack and call the handler
+ if ( contentHnd ) {
+ // report startElement first...
+ if ( d->useNamespaces ) {
+ d->namespaceSupport.processName( tags.top(), FALSE, uri, lname );
+ t = contentHnd->startElement( uri, lname, tags.top(), d->attList );
+ } else {
+ t = contentHnd->startElement( "", "", tags.top(), d->attList );
+ }
+ if ( !t ) {
+ d->error = contentHnd->errorString();
+ return FALSE;
+ }
+ // ... followed by endElement
+ // ### missing namespace support!
+ if ( !contentHnd->endElement( "","",tags.pop() ) ) {
+ d->error = contentHnd->errorString();
+ return FALSE;
+ }
+ // namespace support?
+ if ( d->useNamespaces ) {
+ QStringList prefixesBefore, prefixesAfter;
+ if ( contentHnd ) {
+ prefixesBefore = d->namespaceSupport.prefixes();
+ }
+ d->namespaceSupport.popContext();
+ // call the handler for prefix mapping
+ if ( contentHnd ) {
+ prefixesAfter = d->namespaceSupport.prefixes();
+ for ( QStringList::Iterator it = prefixesBefore.begin(); it != prefixesBefore.end(); ++it ) {
+ if ( prefixesAfter.contains(*it) == 0 ) {
+ if ( !contentHnd->endPrefixMapping( *it ) ) {
+ d->error = contentHnd->errorString();
+ return FALSE;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ tags.pop();
+ }
+ return TRUE;
+}
+/*!
+ Helper to break down the size of the code in the case statement.
+ Return FALSE on error, otherwise TRUE.
+*/
+bool QXmlSimpleReader::parseElementETagBegin2()
+{
+
+ // pop the stack and compare it with the name
+ if ( tags.pop() != name() ) {
+ d->error = XMLERR_TAGMISMATCH;
+ return FALSE;
+ }
+ // call the handler
+ // ### missing namespace support!
+ if ( contentHnd ) {
+ if ( !contentHnd->endElement("","",name()) ) {
+ d->error = contentHnd->errorString();
+ return FALSE;
+ }
+ }
+ // namespace support?
+ if ( d->useNamespaces ) {
+ QStringList prefixesBefore, prefixesAfter;
+ if ( contentHnd ) {
+ prefixesBefore = d->namespaceSupport.prefixes();
+ }
+ d->namespaceSupport.popContext();
+ // call the handler for prefix mapping
+ if ( contentHnd ) {
+ prefixesAfter = d->namespaceSupport.prefixes();
+ for ( QStringList::Iterator it = prefixesBefore.begin(); it != prefixesBefore.end(); ++it ) {
+ if ( prefixesAfter.contains(*it) == 0 ) {
+ if ( !contentHnd->endPrefixMapping( *it ) ) {
+ d->error = contentHnd->errorString();
+ return FALSE;
+ }
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+/*!
+ Helper to break down the size of the code in the case statement.
+ Return FALSE on error, otherwise TRUE.
+*/
+bool QXmlSimpleReader::parseElementAttribute( QString &prefix, QString &uri, QString &lname )
+{
+ // add the attribute to the list
+ if ( d->useNamespaces ) {
+ // is it a namespace declaration?
+ d->namespaceSupport.splitName( name(), prefix, lname );
+ if ( prefix == "xmlns" ) {
+ // namespace declaration
+ d->namespaceSupport.setPrefix( lname, string() );
+ if ( d->useNamespacePrefixes ) {
+ d->attList.qnameList.append( name() );
+ d->attList.uriList.append( "" );
+ d->attList.localnameList.append( "" );
+ d->attList.valueList.append( string() );
+ }
+ // call the handler for prefix mapping
+ if ( contentHnd ) {
+ if ( !contentHnd->startPrefixMapping( lname, string() ) ) {
+ d->error = contentHnd->errorString();
+ return FALSE;
+ }
+ }
+ } else {
+ // no namespace delcaration
+ d->namespaceSupport.processName( name(), TRUE, uri, lname );
+ d->attList.qnameList.append( name() );
+ d->attList.uriList.append( uri );
+ d->attList.localnameList.append( lname );
+ d->attList.valueList.append( string() );
+ }
+ } else {
+ // no namespace support
+ d->attList.qnameList.append( name() );
+ d->attList.uriList.append( "" );
+ d->attList.localnameList.append( "" );
+ d->attList.valueList.append( string() );
+ }
+ return TRUE;
+}
+
+/*!
+ Parse a content [43].
+
+ A content is only used between tags. If a end tag is found the < is already
+ read and the head stand on the '/' of the end tag '</name>'.
+*/
+bool QXmlSimpleReader::parseContent()
+{
+ bool charDataRead = FALSE;
+
+ const signed char Init = 0;
+ const signed char ChD = 1; // CharData
+ const signed char ChD1 = 2; // CharData help state
+ const signed char ChD2 = 3; // CharData help state
+ const signed char Ref = 4; // Reference
+ const signed char Lt = 5; // '<' read
+ const signed char PI = 6; // PI
+ const signed char Elem = 7; // Element
+ const signed char Em = 8; // '!' read
+ const signed char Com = 9; // Comment
+ const signed char CDS = 10; // CDSect
+ const signed char CDS1 = 11; // read a CDSect
+ const signed char CDS2 = 12; // read a CDSect (help state)
+ const signed char CDS3 = 13; // read a CDSect (help state)
+ const signed char Done = 14; // finished reading content
+
+ const signed char InpLt = 0; // <
+ const signed char InpGt = 1; // >
+ const signed char InpSlash = 2; // /
+ const signed char InpQMark = 3; // ?
+ const signed char InpEMark = 4; // !
+ const signed char InpAmp = 5; // &
+ const signed char InpDash = 6; // -
+ const signed char InpOpenB = 7; // [
+ const signed char InpCloseB = 8; // ]
+ const signed char InpUnknown = 9;
+
+ static signed char mapCLT2FSMChar[] = {
+ InpUnknown, // white space
+ InpUnknown, // %
+ InpAmp, // &
+ InpGt, // >
+ InpLt, // <
+ InpSlash, // /
+ InpQMark, // ?
+ InpEMark, // !
+ InpDash, // -
+ InpCloseB, // ]
+ InpOpenB, // [
+ InpUnknown, // =
+ InpUnknown, // "
+ InpUnknown, // '
+ InpUnknown // unknown
+ };
+
+ // use some kind of state machine for parsing
+ static signed char const table[14][10] = {
+ /* InpLt InpGt InpSlash InpQMark InpEMark InpAmp InpDash InpOpenB InpCloseB InpUnknown */
+ { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD1, ChD }, // Init
+ { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD1, ChD }, // ChD
+ { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD2, ChD }, // ChD1
+ { Lt, -1, ChD, ChD, ChD, Ref, ChD, ChD, ChD2, ChD }, // ChD2
+ { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Ref (same as Init)
+ { -1, -1, Done, PI, Em, -1, -1, -1, -1, Elem }, // Lt
+ { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // PI (same as Init)
+ { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Elem (same as Init)
+ { -1, -1, -1, -1, -1, -1, Com, CDS, -1, -1 }, // Em
+ { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Com (same as Init)
+ { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS2, CDS1 }, // CDS
+ { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS2, CDS1 }, // CDS1
+ { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS3, CDS1 }, // CDS2
+ { CDS1, Init, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS3, CDS1 } // CDS3
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input (use lookup-table instead of nested ifs for performance
+ // reasons)
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( c.row() ) {
+ input = InpUnknown;
+ } else {
+ input = mapCLT2FSMChar[ charLookupTable[ c.cell() ] ];
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Init:
+ // next character
+ next();
+ break;
+ case ChD:
+ // on first call: clear string
+ if ( !charDataRead ) {
+ charDataRead = TRUE;
+ stringClear();
+ }
+ stringAddC();
+ next();
+ break;
+ case ChD1:
+ // on first call: clear string
+ if ( !charDataRead ) {
+ charDataRead = TRUE;
+ stringClear();
+ }
+ stringAddC();
+ next();
+ break;
+ case ChD2:
+ stringAddC();
+ next();
+ break;
+ case Ref:
+ if ( !charDataRead) {
+ // reference may be CharData; so clear string to be safe
+ stringClear();
+ parseOk = parseReference( charDataRead, InContent );
+ } else {
+ bool tmp;
+ parseOk = parseReference( tmp, InContent );
+ }
+ break;
+ case Lt:
+ // call the handler for CharData
+ if ( contentHnd ) {
+ if ( charDataRead ) {
+ if ( d->reportWhitespaceCharData || !string().simplifyWhiteSpace().isEmpty() ) {
+ if ( !contentHnd->characters( string() ) ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ }
+ }
+ charDataRead = FALSE;
+ // next character
+ next();
+ break;
+ case PI:
+ parseOk = parsePI();
+ break;
+ case Elem:
+ parseOk = parseElement();
+ break;
+ case Em:
+ // next character
+ next();
+ break;
+ case Com:
+ parseOk = parseComment();
+ break;
+ case CDS:
+ parseOk = parseString( "[CDATA[" );
+ break;
+ case CDS1:
+ // read one character and add it
+ stringAddC();
+ next();
+ break;
+ case CDS2:
+ // skip ']'
+ next();
+ break;
+ case CDS3:
+ // skip ']'...
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Ref:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGREFERENCE;
+ goto parseError;
+ }
+ break;
+ case PI:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGPI;
+ goto parseError;
+ }
+ // call the handler
+ if ( contentHnd ) {
+ if ( !contentHnd->processingInstruction(name(),string()) ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ break;
+ case Elem:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGELEMENT;
+ goto parseError;
+ }
+ break;
+ case Com:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGCOMMENT;
+ goto parseError;
+ }
+ if ( lexicalHnd ) {
+ if ( !lexicalHnd->comment( string() ) ) {
+ d->error = lexicalHnd->errorString();
+ goto parseError;
+ }
+ }
+ break;
+ case CDS:
+ if( !parseOk ) {
+ d->error = XMLERR_CDSECTHEADEREXPECTED;
+ goto parseError;
+ }
+ // empty string
+ stringClear();
+ break;
+ case CDS2:
+ if (c != ']') {
+ stringAddC( ']' );
+ }
+ break;
+ case CDS3:
+ // test if this skipping was legal
+ if ( c == '>' ) {
+ // the end of the CDSect
+ if ( lexicalHnd ) {
+ if ( !lexicalHnd->startCDATA() ) {
+ d->error = lexicalHnd->errorString();
+ goto parseError;
+ }
+ }
+ if ( contentHnd ) {
+ if ( !contentHnd->characters( string() ) ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ if ( lexicalHnd ) {
+ if ( !lexicalHnd->endCDATA() ) {
+ d->error = lexicalHnd->errorString();
+ goto parseError;
+ }
+ }
+ } else if (c == ']') {
+ // three or more ']'
+ stringAddC( ']' );
+ } else {
+ // after ']]' comes another character
+ stringAddC( ']' );
+ stringAddC( ']' );
+ }
+ break;
+ case Done:
+ // call the handler for CharData
+ if ( contentHnd ) {
+ if ( charDataRead ) {
+ if ( d->reportWhitespaceCharData || !string().simplifyWhiteSpace().isEmpty() ) {
+ if ( !contentHnd->characters( string() ) ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ }
+ }
+ // Done
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_ERRORPARSINGCONTENT;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse Misc [27].
+*/
+bool QXmlSimpleReader::parseMisc()
+{
+ const signed char Init = 0;
+ const signed char Lt = 1; // '<' was read
+ const signed char Comment = 2; // read comment
+ const signed char eatWS = 3; // eat whitespaces
+ const signed char PI = 4; // read PI
+ const signed char Comment2 = 5; // read comment
+
+ const signed char InpWs = 0; // S
+ const signed char InpLt = 1; // <
+ const signed char InpQm = 2; // ?
+ const signed char InpEm = 3; // !
+ const signed char InpUnknown = 4;
+
+ // use some kind of state machine for parsing
+ static signed char table[3][5] = {
+ /* InpWs InpLt InpQm InpEm InpUnknown */
+ { eatWS, Lt, -1, -1, -1 }, // Init
+ { -1, -1, PI, Comment, -1 }, // Lt
+ { -1, -1, -1, -1, Comment2 } // Comment
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == '<' ) {
+ input = InpLt;
+ } else if ( c == '?' ) {
+ input = InpQm;
+ } else if ( c == '!' ) {
+ input = InpEm;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case eatWS:
+ eat_ws();
+ break;
+ case Lt:
+ next();
+ break;
+ case PI:
+ parseOk = parsePI();
+ break;
+ case Comment:
+ next();
+ break;
+ case Comment2:
+ parseOk = parseComment();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case eatWS:
+ return TRUE;
+ case PI:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGPI;
+ goto parseError;
+ }
+ if ( contentHnd ) {
+ if ( !contentHnd->processingInstruction(name(),string()) ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ return TRUE;
+ case Comment2:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGCOMMENT;
+ goto parseError;
+ }
+ if ( lexicalHnd ) {
+ if ( !lexicalHnd->comment( string() ) ) {
+ d->error = lexicalHnd->errorString();
+ goto parseError;
+ }
+ }
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a processing instruction [16].
+
+ If xmldec is TRUE, it tries to parse a PI or a XML declaration [23].
+
+ Precondition: the beginning '<' of the PI is already read and the head stand
+ on the '?' of '<?'.
+
+ If this funktion was successful, the head-position is on the first
+ character after the PI.
+*/
+bool QXmlSimpleReader::parsePI( bool xmldecl )
+{
+ const signed char Init = 0;
+ const signed char QmI = 1; // ? was read
+ const signed char Name = 2; // read Name
+ const signed char XMLDecl = 3; // read XMLDecl
+ const signed char Ws1 = 4; // eat ws after "xml" of XMLDecl
+ const signed char PI = 5; // read PI
+ const signed char Ws2 = 6; // eat ws after Name of PI
+ const signed char Version = 7; // read versionInfo
+ const signed char Ws3 = 8; // eat ws after versionInfo
+ const signed char EorSD = 9; // read EDecl or SDDecl
+ const signed char Ws4 = 10; // eat ws after EDecl or SDDecl
+ const signed char SD = 11; // read SDDecl
+ const signed char Ws5 = 12; // eat ws after SDDecl
+ const signed char ADone = 13; // almost done
+ const signed char Char = 14; // Char was read
+ const signed char Qm = 15; // Qm was read
+ const signed char Done = 16; // finished reading content
+
+ const signed char InpWs = 0; // whitespace
+ const signed char InpNameBe = 1; // is_nameBeginning()
+ const signed char InpGt = 2; // >
+ const signed char InpQm = 3; // ?
+ const signed char InpUnknown = 4;
+
+ // use some kind of state machine for parsing
+ static signed char table[16][5] = {
+ /* InpWs, InpNameBe InpGt InpQm InpUnknown */
+ { -1, -1, -1, QmI, -1 }, // Init
+ { -1, Name, -1, -1, -1 }, // QmI
+ { -1, -1, -1, -1, -1 }, // Name (this state is left not through input)
+ { Ws1, -1, -1, -1, -1 }, // XMLDecl
+ { -1, Version, -1, -1, -1 }, // Ws1
+ { Ws2, -1, -1, Qm, -1 }, // PI
+ { Char, Char, Char, Qm, Char }, // Ws2
+ { Ws3, -1, -1, ADone, -1 }, // Version
+ { -1, EorSD, -1, ADone, -1 }, // Ws3
+ { Ws4, -1, -1, ADone, -1 }, // EorSD
+ { -1, SD, -1, ADone, -1 }, // Ws4
+ { Ws5, -1, -1, ADone, -1 }, // SD
+ { -1, -1, -1, ADone, -1 }, // Ws5
+ { -1, -1, Done, -1, -1 }, // ADone
+ { Char, Char, Char, Qm, Char }, // Char
+ { Char, Char, Done, Qm, Char }, // Qm
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( is_NameBeginning(c) ) {
+ input = InpNameBe;
+ } else if ( c == '>' ) {
+ input = InpGt;
+ } else if ( c == '?' ) {
+ input = InpQm;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case QmI:
+ next();
+ break;
+ case Name:
+ parseOk = parseName();
+ break;
+ case Ws1:
+ case Ws2:
+ case Ws3:
+ case Ws4:
+ case Ws5:
+ eat_ws();
+ break;
+ case Version:
+ parseOk = parseAttribute();
+ break;
+ case EorSD:
+ parseOk = parseAttribute();
+ break;
+ case SD:
+ // get the SDDecl (syntax like an attribute)
+ if ( d->standalone != QXmlSimpleReaderPrivate::Unknown ) {
+ // already parsed the standalone declaration
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ parseOk = parseAttribute();
+ break;
+ case ADone:
+ next();
+ break;
+ case Char:
+ stringAddC();
+ next();
+ break;
+ case Qm:
+ // skip the '?'
+ next();
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Name:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ // test what name was read and determine the next state
+ // (not very beautiful, I admit)
+ if ( name().lower() == "xml" ) {
+ if ( xmldecl && name()=="xml" ) {
+ state = XMLDecl;
+ } else {
+ d->error = XMLERR_INVALIDNAMEFORPI;
+ goto parseError;
+ }
+ } else {
+ state = PI;
+ stringClear();
+ }
+ break;
+ case Version:
+ // get version (syntax like an attribute)
+ if ( !parseOk ) {
+ d->error = XMLERR_VERSIONEXPECTED;
+ goto parseError;
+ }
+ if ( name() != "version" ) {
+ d->error = XMLERR_VERSIONEXPECTED;
+ goto parseError;
+ }
+ d->xmlVersion = string();
+ break;
+ case EorSD:
+ // get the EDecl or SDDecl (syntax like an attribute)
+ if ( !parseOk ) {
+ d->error = XMLERR_EDECLORSDDECLEXPECTED;
+ goto parseError;
+ }
+ if ( name() == "standalone" ) {
+ if ( string()=="yes" ) {
+ d->standalone = QXmlSimpleReaderPrivate::Yes;
+ } else if ( string()=="no" ) {
+ d->standalone = QXmlSimpleReaderPrivate::No;
+ } else {
+ d->error = XMLERR_WRONGVALUEFORSDECL;
+ goto parseError;
+ }
+ } else if ( name() == "encoding" ) {
+ d->encoding = string();
+ } else {
+ d->error = XMLERR_EDECLORSDDECLEXPECTED;
+ goto parseError;
+ }
+ break;
+ case SD:
+ if ( !parseOk ) {
+ d->error = XMLERR_SDDECLEXPECTED;
+ goto parseError;
+ }
+ if ( name() != "standalone" ) {
+ d->error = XMLERR_SDDECLEXPECTED;
+ goto parseError;
+ }
+ if ( string()=="yes" ) {
+ d->standalone = QXmlSimpleReaderPrivate::Yes;
+ } else if ( string()=="no" ) {
+ d->standalone = QXmlSimpleReaderPrivate::No;
+ } else {
+ d->error = XMLERR_WRONGVALUEFORSDECL;
+ goto parseError;
+ }
+ break;
+ case Qm:
+ // test if the skipping was legal
+ if ( c != '>' ) {
+ stringAddC( '?' );
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a document type definition (doctypedecl [28]).
+
+ Precondition: the beginning '<!' of the doctype is already read the head
+ stands on the 'D' of '<!DOCTYPE'.
+
+ If this funktion was successful, the head-position is on the first
+ character after the document type definition.
+*/
+bool QXmlSimpleReader::parseDoctype()
+{
+ // some init-stuff
+ d->systemId = QString::null;
+ d->publicId = QString::null;
+
+ const signed char Init = 0;
+ const signed char Doctype = 1; // read the doctype
+ const signed char Ws1 = 2; // eat_ws
+ const signed char Doctype2 = 3; // read the doctype, part 2
+ const signed char Ws2 = 4; // eat_ws
+ const signed char Sys = 5; // read SYSTEM
+ const signed char Ws3 = 6; // eat_ws
+ const signed char MP = 7; // markupdecl or PEReference
+ const signed char PER = 8; // PERReference
+ const signed char Mup = 9; // markupdecl
+ const signed char Ws4 = 10; // eat_ws
+ const signed char MPE = 11; // end of markupdecl or PEReference
+ const signed char Done = 12;
+
+ const signed char InpWs = 0;
+ const signed char InpD = 1; // 'D'
+ const signed char InpS = 2; // 'S' or 'P'
+ const signed char InpOB = 3; // [
+ const signed char InpCB = 4; // ]
+ const signed char InpPer = 5; // %
+ const signed char InpGt = 6; // >
+ const signed char InpUnknown = 7;
+
+ // use some kind of state machine for parsing
+ static signed char table[12][8] = {
+ /* InpWs, InpD InpS InpOB InpCB InpPer InpGt InpUnknown */
+ { -1, Doctype, -1, -1, -1, -1, -1, -1 }, // Init
+ { Ws1, Doctype2, Doctype2, -1, -1, -1, -1, Doctype2 }, // Doctype
+ { -1, Doctype2, Doctype2, -1, -1, -1, -1, Doctype2 }, // Ws1
+ { Ws2, -1, Sys, MP, -1, -1, Done, -1 }, // Doctype2
+ { -1, -1, Sys, MP, -1, -1, Done, -1 }, // Ws2
+ { Ws3, -1, -1, MP, -1, -1, Done, -1 }, // Sys
+ { -1, -1, -1, MP, -1, -1, Done, -1 }, // Ws3
+ { -1, -1, -1, -1, MPE, PER, -1, Mup }, // MP
+ { Ws4, -1, -1, -1, MPE, PER, -1, Mup }, // PER
+ { Ws4, -1, -1, -1, MPE, PER, -1, Mup }, // Mup
+ { -1, -1, -1, -1, MPE, PER, -1, Mup }, // Ws4
+ { -1, -1, -1, -1, -1, -1, Done, -1 } // MPE
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == 'D' ) {
+ input = InpD;
+ } else if ( c == 'S' ) {
+ input = InpS;
+ } else if ( c == 'P' ) {
+ input = InpS;
+ } else if ( c == '[' ) {
+ input = InpOB;
+ } else if ( c == ']' ) {
+ input = InpCB;
+ } else if ( c == '%' ) {
+ input = InpPer;
+ } else if ( c == '>' ) {
+ input = InpGt;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Doctype:
+ parseOk = parseString( "DOCTYPE" );
+ break;
+ case Ws1:
+ case Ws2:
+ case Ws3:
+ case Ws4:
+ eat_ws();
+ break;
+ case Doctype2:
+ parseName();
+ break;
+ case Sys:
+ parseOk = parseExternalID();
+ break;
+ case MP:
+ next_eat_ws();
+ break;
+ case PER:
+ parseOk = parsePEReference( InDTD );
+ break;
+ case Mup:
+ parseOk = parseMarkupdecl();
+ break;
+ case MPE:
+ next_eat_ws();
+ break;
+ case Done:
+ if ( lexicalHnd ) {
+ if ( !lexicalHnd->endDTD() ) {
+ d->error = lexicalHnd->errorString();
+ goto parseError;
+ }
+ }
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Doctype:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGDOCTYPE;
+ goto parseError;
+ }
+ if ( !is_S(c) ) {
+ d->error = XMLERR_ERRORPARSINGDOCTYPE;
+ goto parseError;
+ }
+ break;
+ case Doctype2:
+ d->doctype = name();
+ if ( lexicalHnd ) {
+ if ( !lexicalHnd->startDTD( d->doctype, d->publicId, d->systemId ) ) {
+ d->error = lexicalHnd->errorString();
+ goto parseError;
+ }
+ }
+ break;
+ case Sys:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGDOCTYPE;
+ goto parseError;
+ }
+ break;
+ case PER:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGDOCTYPE;
+ goto parseError;
+ }
+ break;
+ case Mup:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGDOCTYPE;
+ goto parseError;
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_ERRORPARSINGDOCTYPE;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a ExternalID [75].
+
+ If allowPublicID is TRUE parse ExternalID [75] or PublicID [83].
+*/
+bool QXmlSimpleReader::parseExternalID( bool allowPublicID )
+{
+ // some init-stuff
+ d->systemId = QString::null;
+ d->publicId = QString::null;
+
+ const signed char Init = 0;
+ const signed char Sys = 1; // parse 'SYSTEM'
+ const signed char SysWS = 2; // parse the whitespace after 'SYSTEM'
+ const signed char SysSQ = 3; // parse SystemLiteral with '
+ const signed char SysSQ2 = 4; // parse SystemLiteral with '
+ const signed char SysDQ = 5; // parse SystemLiteral with "
+ const signed char SysDQ2 = 6; // parse SystemLiteral with "
+ const signed char Pub = 7; // parse 'PUBLIC'
+ const signed char PubWS = 8; // parse the whitespace after 'PUBLIC'
+ const signed char PubSQ = 9; // parse PubidLiteral with '
+ const signed char PubSQ2 = 10; // parse PubidLiteral with '
+ const signed char PubDQ = 11; // parse PubidLiteral with "
+ const signed char PubDQ2 = 12; // parse PubidLiteral with "
+ const signed char PubE = 13; // finished parsing the PubidLiteral
+ const signed char PubWS2 = 14; // parse the whitespace after the PubidLiteral
+ const signed char PDone = 15; // done if allowPublicID is TRUE
+ const signed char Done = 16;
+
+ const signed char InpSQ = 0; // '
+ const signed char InpDQ = 1; // "
+ const signed char InpS = 2; // S
+ const signed char InpP = 3; // P
+ const signed char InpWs = 4; // white space
+ const signed char InpUnknown = 5;
+
+ // use some kind of state machine for parsing
+ static signed char table[15][6] = {
+ /* InpSQ InpDQ InpS InpP InpWs InpUnknown */
+ { -1, -1, Sys, Pub, -1, -1 }, // Init
+ { -1, -1, -1, -1, SysWS, -1 }, // Sys
+ { SysSQ, SysDQ, -1, -1, -1, -1 }, // SysWS
+ { Done, SysSQ2, SysSQ2, SysSQ2, SysSQ2, SysSQ2 }, // SysSQ
+ { Done, SysSQ2, SysSQ2, SysSQ2, SysSQ2, SysSQ2 }, // SysSQ2
+ { SysDQ2, Done, SysDQ2, SysDQ2, SysDQ2, SysDQ2 }, // SysDQ
+ { SysDQ2, Done, SysDQ2, SysDQ2, SysDQ2, SysDQ2 }, // SysDQ2
+ { -1, -1, -1, -1, PubWS, -1 }, // Pub
+ { PubSQ, PubDQ, -1, -1, -1, -1 }, // PubWS
+ { PubE, -1, PubSQ2, PubSQ2, PubSQ2, PubSQ2 }, // PubSQ
+ { PubE, -1, PubSQ2, PubSQ2, PubSQ2, PubSQ2 }, // PubSQ2
+ { -1, PubE, PubDQ2, PubDQ2, PubDQ2, PubDQ2 }, // PubDQ
+ { -1, PubE, PubDQ2, PubDQ2, PubDQ2, PubDQ2 }, // PubDQ2
+ { PDone, PDone, PDone, PDone, PubWS2, PDone }, // PubE
+ { SysSQ, SysDQ, PDone, PDone, PDone, PDone } // PubWS2
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == '\'' ) {
+ input = InpSQ;
+ } else if ( c == '"' ) {
+ input = InpDQ;
+ } else if ( c == 'S' ) {
+ input = InpS;
+ } else if ( c == 'P' ) {
+ input = InpP;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Sys:
+ parseOk = parseString( "SYSTEM" );
+ break;
+ case SysWS:
+ eat_ws();
+ break;
+ case SysSQ:
+ case SysDQ:
+ stringClear();
+ next();
+ break;
+ case SysSQ2:
+ case SysDQ2:
+ stringAddC();
+ next();
+ break;
+ case Pub:
+ parseOk = parseString( "PUBLIC" );
+ break;
+ case PubWS:
+ eat_ws();
+ break;
+ case PubSQ:
+ case PubDQ:
+ stringClear();
+ next();
+ break;
+ case PubSQ2:
+ case PubDQ2:
+ stringAddC();
+ next();
+ break;
+ case PubE:
+ next();
+ break;
+ case PubWS2:
+ d->publicId = string();
+ eat_ws();
+ break;
+ case Done:
+ d->systemId = string();
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Sys:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case Pub:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case PDone:
+ if ( allowPublicID ) {
+ d->publicId = string();
+ return TRUE;
+ } else {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a markupdecl [29].
+*/
+bool QXmlSimpleReader::parseMarkupdecl()
+{
+ const signed char Init = 0;
+ const signed char Lt = 1; // < was read
+ const signed char Em = 2; // ! was read
+ const signed char CE = 3; // E was read
+ const signed char Qm = 4; // ? was read
+ const signed char Dash = 5; // - was read
+ const signed char CA = 6; // A was read
+ const signed char CEL = 7; // EL was read
+ const signed char CEN = 8; // EN was read
+ const signed char CN = 9; // N was read
+ const signed char Done = 10;
+
+ const signed char InpLt = 0; // <
+ const signed char InpQm = 1; // ?
+ const signed char InpEm = 2; // !
+ const signed char InpDash = 3; // -
+ const signed char InpA = 4; // A
+ const signed char InpE = 5; // E
+ const signed char InpL = 6; // L
+ const signed char InpN = 7; // N
+ const signed char InpUnknown = 8;
+
+ // use some kind of state machine for parsing
+ static signed char table[4][9] = {
+ /* InpLt InpQm InpEm InpDash InpA InpE InpL InpN InpUnknown */
+ { Lt, -1, -1, -1, -1, -1, -1, -1, -1 }, // Init
+ { -1, Qm, Em, -1, -1, -1, -1, -1, -1 }, // Lt
+ { -1, -1, -1, Dash, CA, CE, -1, CN, -1 }, // Em
+ { -1, -1, -1, -1, -1, -1, CEL, CEN, -1 } // CE
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( c == '<' ) {
+ input = InpLt;
+ } else if ( c == '?' ) {
+ input = InpQm;
+ } else if ( c == '!' ) {
+ input = InpEm;
+ } else if ( c == '-' ) {
+ input = InpDash;
+ } else if ( c == 'A' ) {
+ input = InpA;
+ } else if ( c == 'E' ) {
+ input = InpE;
+ } else if ( c == 'L' ) {
+ input = InpL;
+ } else if ( c == 'N' ) {
+ input = InpN;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Lt:
+ next();
+ break;
+ case Em:
+ next();
+ break;
+ case CE:
+ next();
+ break;
+ case Qm:
+ parseOk = parsePI();
+ break;
+ case Dash:
+ parseOk = parseComment();
+ break;
+ case CA:
+ parseOk = parseAttlistDecl();
+ break;
+ case CEL:
+ parseOk = parseElementDecl();
+ break;
+ case CEN:
+ parseOk = parseEntityDecl();
+ break;
+ case CN:
+ parseOk = parseNotationDecl();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Qm:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGPI;
+ goto parseError;
+ }
+ if ( contentHnd ) {
+ if ( !contentHnd->processingInstruction(name(),string()) ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ return TRUE;
+ case Dash:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGCOMMENT;
+ goto parseError;
+ }
+ if ( lexicalHnd ) {
+ if ( !lexicalHnd->comment( string() ) ) {
+ d->error = lexicalHnd->errorString();
+ goto parseError;
+ }
+ }
+ return TRUE;
+ case CA:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGATTLISTDECL;
+ goto parseError;
+ }
+ return TRUE;
+ case CEL:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGELEMENTDECL;
+ goto parseError;
+ }
+ return TRUE;
+ case CEN:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGENTITYDECL;
+ goto parseError;
+ }
+ return TRUE;
+ case CN:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNOTATIONDECL;
+ goto parseError;
+ }
+ return TRUE;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_LETTEREXPECTED;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a PEReference [69]
+*/
+bool QXmlSimpleReader::parsePEReference( EntityRecognitionContext context )
+{
+ const signed char Init = 0;
+ const signed char Next = 1;
+ const signed char Name = 2;
+ const signed char Done = 3;
+
+ const signed char InpSemi = 0; // ;
+ const signed char InpPer = 1; // %
+ const signed char InpUnknown = 2;
+
+ // use some kind of state machine for parsing
+ static signed char table[3][3] = {
+ /* InpSemi InpPer InpUnknown */
+ { -1, Next, -1 }, // Init
+ { -1, -1, Name }, // Next
+ { Done, -1, -1 } // Name
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( c == ';' ) {
+ input = InpSemi;
+ } else if ( c == '%' ) {
+ input = InpPer;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Next:
+ next();
+ break;
+ case Name:
+ parseOk = parseName( TRUE );
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Name:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ if ( d->parameterEntities.find( ref() ) == d->parameterEntities.end() ) {
+ // ### skip it???
+ if ( contentHnd ) {
+ if ( !contentHnd->skippedEntity( QString("%") + ref() ) ) {
+ d->error = contentHnd->errorString();
+ goto parseError;
+ }
+ }
+ } else {
+ if ( context == InEntityValue ) {
+ // Included in literal
+ xmlRef = d->parameterEntities.find( ref() )
+ .data().replace( QRegExp("\""), "&quot;" ).replace( QRegExp("'"), "&apos;" )
+ + xmlRef;
+ } else if ( context == InDTD ) {
+ // Included as PE
+ xmlRef = QString(" ") +
+ d->parameterEntities.find( ref() ).data() +
+ QString(" ") + xmlRef;
+ }
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_LETTEREXPECTED;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a AttlistDecl [52].
+
+ Precondition: the beginning '<!' is already read and the head
+ stands on the 'A' of '<!ATTLIST'
+*/
+bool QXmlSimpleReader::parseAttlistDecl()
+{
+ const signed char Init = 0;
+ const signed char Attlist = 1; // parse the string "ATTLIST"
+ const signed char Ws = 2; // whitespace read
+ const signed char Name = 3; // parse name
+ const signed char Ws1 = 4; // whitespace read
+ const signed char Attdef = 5; // parse the AttDef
+ const signed char Ws2 = 6; // whitespace read
+ const signed char Atttype = 7; // parse the AttType
+ const signed char Ws3 = 8; // whitespace read
+ const signed char DDecH = 9; // DefaultDecl with #
+ const signed char DefReq = 10; // parse the string "REQUIRED"
+ const signed char DefImp = 11; // parse the string "IMPLIED"
+ const signed char DefFix = 12; // parse the string "FIXED"
+ const signed char Attval = 13; // parse the AttValue
+ const signed char Ws4 = 14; // whitespace read
+ const signed char Done = 15;
+
+ const signed char InpWs = 0; // white space
+ const signed char InpGt = 1; // >
+ const signed char InpHash = 2; // #
+ const signed char InpA = 3; // A
+ const signed char InpI = 4; // I
+ const signed char InpF = 5; // F
+ const signed char InpR = 6; // R
+ const signed char InpUnknown = 7;
+
+ // use some kind of state machine for parsing
+ static signed char table[15][8] = {
+ /* InpWs InpGt InpHash InpA InpI InpF InpR InpUnknown */
+ { -1, -1, -1, Attlist, -1, -1, -1, -1 }, // Init
+ { Ws, -1, -1, -1, -1, -1, -1, -1 }, // Attlist
+ { -1, -1, -1, Name, Name, Name, Name, Name }, // Ws
+ { Ws1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef }, // Name
+ { -1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef }, // Ws1
+ { Ws2, -1, -1, -1, -1, -1, -1, -1 }, // Attdef
+ { -1, Atttype, Atttype, Atttype, Atttype, Atttype, Atttype, Atttype }, // Ws2
+ { Ws3, -1, -1, -1, -1, -1, -1, -1 }, // Attype
+ { -1, Attval, DDecH, Attval, Attval, Attval, Attval, Attval }, // Ws3
+ { -1, -1, -1, -1, DefImp, DefFix, DefReq, -1 }, // DDecH
+ { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // DefReq
+ { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // DefImp
+ { Ws3, -1, -1, -1, -1, -1, -1, -1 }, // DefFix
+ { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // Attval
+ { -1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef } // Ws4
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == '>' ) {
+ input = InpGt;
+ } else if ( c == '#' ) {
+ input = InpHash;
+ } else if ( c == 'A' ) {
+ input = InpA;
+ } else if ( c == 'I' ) {
+ input = InpI;
+ } else if ( c == 'F' ) {
+ input = InpF;
+ } else if ( c == 'R' ) {
+ input = InpR;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Attlist:
+ parseOk = parseString( "ATTLIST" );
+ break;
+ case Ws:
+ case Ws1:
+ case Ws2:
+ case Ws3:
+ eat_ws();
+ break;
+ case Name:
+ parseOk = parseName();
+ break;
+ case Attdef:
+ parseOk = parseName();
+ break;
+ case Atttype:
+ parseOk = parseAttType();
+ break;
+ case DDecH:
+ next();
+ break;
+ case DefReq:
+ parseOk = parseString( "REQUIRED" );
+ break;
+ case DefImp:
+ parseOk = parseString( "IMPLIED" );
+ break;
+ case DefFix:
+ parseOk = parseString( "FIXED" );
+ break;
+ case Attval:
+ parseOk = parseAttValue();
+ break;
+ case Ws4:
+ if ( declHnd ) {
+ // TODO: not all values are computed yet...
+ if ( !declHnd->attributeDecl( d->attDeclEName, d->attDeclAName, "", "", "" ) ) {
+ d->error = declHnd->errorString();
+ goto parseError;
+ }
+ }
+ eat_ws();
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Attlist:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case Name:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ d->attDeclEName = name();
+ break;
+ case Attdef:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ d->attDeclAName = name();
+ break;
+ case Atttype:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGATTTYPE;
+ goto parseError;
+ }
+ break;
+ case DefReq:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case DefImp:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case DefFix:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case Attval:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGATTVALUE;
+ goto parseError;
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_LETTEREXPECTED;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a AttType [54]
+*/
+bool QXmlSimpleReader::parseAttType()
+{
+ const signed char Init = 0;
+ const signed char ST = 1; // StringType
+ const signed char TTI = 2; // TokenizedType starting with 'I'
+ const signed char TTI2 = 3; // TokenizedType helpstate
+ const signed char TTI3 = 4; // TokenizedType helpstate
+ const signed char TTE = 5; // TokenizedType starting with 'E'
+ const signed char TTEY = 6; // TokenizedType starting with 'ENTITY'
+ const signed char TTEI = 7; // TokenizedType starting with 'ENTITI'
+ const signed char N = 8; // N read (TokenizedType or Notation)
+ const signed char TTNM = 9; // TokenizedType starting with 'NM'
+ const signed char TTNM2 = 10; // TokenizedType helpstate
+ const signed char NO = 11; // Notation
+ const signed char NO2 = 12; // Notation helpstate
+ const signed char NO3 = 13; // Notation helpstate
+ const signed char NOName = 14; // Notation, read name
+ const signed char NO4 = 15; // Notation helpstate
+ const signed char EN = 16; // Enumeration
+ const signed char ENNmt = 17; // Enumeration, read Nmtoken
+ const signed char EN2 = 18; // Enumeration helpstate
+ const signed char ADone = 19; // almost done (make next and accept)
+ const signed char Done = 20;
+
+ const signed char InpWs = 0; // whitespace
+ const signed char InpOp = 1; // (
+ const signed char InpCp = 2; // )
+ const signed char InpPipe = 3; // |
+ const signed char InpC = 4; // C
+ const signed char InpE = 5; // E
+ const signed char InpI = 6; // I
+ const signed char InpM = 7; // M
+ const signed char InpN = 8; // N
+ const signed char InpO = 9; // O
+ const signed char InpR = 10; // R
+ const signed char InpS = 11; // S
+ const signed char InpY = 12; // Y
+ const signed char InpUnknown = 13;
+
+ // use some kind of state machine for parsing
+ static signed char table[19][14] = {
+ /* InpWs InpOp InpCp InpPipe InpC InpE InpI InpM InpN InpO InpR InpS InpY InpUnknown */
+ { -1, EN, -1, -1, ST, TTE, TTI, -1, N, -1, -1, -1, -1, -1 }, // Init
+ { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // ST
+ { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTI2, Done, Done, Done }, // TTI
+ { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTI3, Done, Done }, // TTI2
+ { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTI3
+ { -1, -1, -1, -1, -1, -1, TTEI, -1, -1, -1, -1, -1, TTEY, -1 }, // TTE
+ { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTEY
+ { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTEI
+ { -1, -1, -1, -1, -1, -1, -1, TTNM, -1, NO, -1, -1, -1, -1 }, // N
+ { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTNM2, Done, Done }, // TTNM
+ { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTNM2
+ { NO2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO
+ { -1, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO2
+ { NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName }, // NO3
+ { NO4, -1, ADone, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NOName
+ { -1, -1, ADone, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO4
+ { -1, -1, ENNmt, -1, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt }, // EN
+ { EN2, -1, ADone, EN, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // ENNmt
+ { -1, -1, ADone, EN, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } // EN2
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == '(' ) {
+ input = InpOp;
+ } else if ( c == ')' ) {
+ input = InpCp;
+ } else if ( c == '|' ) {
+ input = InpPipe;
+ } else if ( c == 'C' ) {
+ input = InpC;
+ } else if ( c == 'E' ) {
+ input = InpE;
+ } else if ( c == 'I' ) {
+ input = InpI;
+ } else if ( c == 'M' ) {
+ input = InpM;
+ } else if ( c == 'N' ) {
+ input = InpN;
+ } else if ( c == 'O' ) {
+ input = InpO;
+ } else if ( c == 'R' ) {
+ input = InpR;
+ } else if ( c == 'S' ) {
+ input = InpS;
+ } else if ( c == 'Y' ) {
+ input = InpY;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case ST:
+ parseOk = parseString( "CDATA" );
+ break;
+ case TTI:
+ parseOk = parseString( "ID" );
+ break;
+ case TTI2:
+ parseOk = parseString( "REF" );
+ break;
+ case TTI3:
+ next(); // S
+ break;
+ case TTE:
+ parseOk = parseString( "ENTIT" );
+ break;
+ case TTEY:
+ next(); // Y
+ break;
+ case TTEI:
+ parseOk = parseString( "IES" );
+ break;
+ case N:
+ next(); // N
+ break;
+ case TTNM:
+ parseOk = parseString( "MTOKEN" );
+ break;
+ case TTNM2:
+ next(); // S
+ break;
+ case NO:
+ parseOk = parseString( "OTATION" );
+ break;
+ case NO2:
+ eat_ws();
+ break;
+ case NO3:
+ next_eat_ws();
+ break;
+ case NOName:
+ parseOk = parseName();
+ break;
+ case NO4:
+ eat_ws();
+ break;
+ case EN:
+ next_eat_ws();
+ break;
+ case ENNmt:
+ parseOk = parseNmtoken();
+ break;
+ case EN2:
+ eat_ws();
+ break;
+ case ADone:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case ST:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case TTI:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case TTI2:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case TTE:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case TTEI:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case TTNM:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case NO:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case NOName:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ break;
+ case ENNmt:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNMTOKEN;
+ goto parseError;
+ }
+ break;
+ case ADone:
+ return TRUE;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_LETTEREXPECTED;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a AttValue [10]
+
+ Precondition: the head stands on the beginning " or '
+
+ If this function was successful, the head stands on the first
+ character after the closing " or ' and the value of the attribute
+ is in string().
+*/
+bool QXmlSimpleReader::parseAttValue()
+{
+ bool tmp;
+
+ const signed char Init = 0;
+ const signed char Dq = 1; // double quotes were read
+ const signed char DqRef = 2; // read references in double quotes
+ const signed char DqC = 3; // signed character read in double quotes
+ const signed char Sq = 4; // single quotes were read
+ const signed char SqRef = 5; // read references in single quotes
+ const signed char SqC = 6; // signed character read in single quotes
+ const signed char Done = 7;
+
+ const signed char InpDq = 0; // "
+ const signed char InpSq = 1; // '
+ const signed char InpAmp = 2; // &
+ const signed char InpLt = 3; // <
+ const signed char InpUnknown = 4;
+
+ // use some kind of state machine for parsing
+ static signed char table[7][5] = {
+ /* InpDq InpSq InpAmp InpLt InpUnknown */
+ { Dq, Sq, -1, -1, -1 }, // Init
+ { Done, DqC, DqRef, -1, DqC }, // Dq
+ { Done, DqC, DqRef, -1, DqC }, // DqRef
+ { Done, DqC, DqRef, -1, DqC }, // DqC
+ { SqC, Done, SqRef, -1, SqC }, // Sq
+ { SqC, Done, SqRef, -1, SqC }, // SqRef
+ { SqC, Done, SqRef, -1, SqC } // SqRef
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( c == '"' ) {
+ input = InpDq;
+ } else if ( c == '\'' ) {
+ input = InpSq;
+ } else if ( c == '&' ) {
+ input = InpAmp;
+ } else if ( c == '<' ) {
+ input = InpLt;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Dq:
+ case Sq:
+ stringClear();
+ next();
+ break;
+ case DqRef:
+ case SqRef:
+ parseOk = parseReference( tmp, InAttributeValue );
+ break;
+ case DqC:
+ case SqC:
+ stringAddC();
+ next();
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case DqRef:
+ case SqRef:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGREFERENCE;
+ goto parseError;
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a elementdecl [45].
+
+ Precondition: the beginning '<!E' is already read and the head
+ stands on the 'L' of '<!ELEMENT'
+*/
+bool QXmlSimpleReader::parseElementDecl()
+{
+ const signed char Init = 0;
+ const signed char Elem = 1; // parse the beginning string
+ const signed char Ws1 = 2; // whitespace required
+ const signed char Nam = 3; // parse Name
+ const signed char Ws2 = 4; // whitespace required
+ const signed char Empty = 5; // read EMPTY
+ const signed char Any = 6; // read ANY
+ const signed char Cont = 7; // read contentspec (except ANY or EMPTY)
+ const signed char Mix = 8; // read Mixed
+ const signed char Mix2 = 9; //
+ const signed char Mix3 = 10; //
+ const signed char MixN1 = 11; //
+ const signed char MixN2 = 12; //
+ const signed char MixN3 = 13; //
+ const signed char MixN4 = 14; //
+ const signed char Cp = 15; // parse cp
+ const signed char Cp2 = 16; //
+ const signed char WsD = 17; // eat whitespace before Done
+ const signed char Done = 18;
+
+ const signed char InpWs = 0;
+ const signed char InpGt = 1; // >
+ const signed char InpPipe = 2; // |
+ const signed char InpOp = 3; // (
+ const signed char InpCp = 4; // )
+ const signed char InpHash = 5; // #
+ const signed char InpQm = 6; // ?
+ const signed char InpAst = 7; // *
+ const signed char InpPlus = 8; // +
+ const signed char InpA = 9; // A
+ const signed char InpE = 10; // E
+ const signed char InpL = 11; // L
+ const signed char InpUnknown = 12;
+
+ // use some kind of state machine for parsing
+ static signed char table[18][13] = {
+ /* InpWs InpGt InpPipe InpOp InpCp InpHash InpQm InpAst InpPlus InpA InpE InpL InpUnknown */
+ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Elem, -1 }, // Init
+ { Ws1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Elem
+ { -1, -1, -1, -1, -1, -1, -1, -1, -1, Nam, Nam, Nam, Nam }, // Ws1
+ { Ws2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Nam
+ { -1, -1, -1, Cont, -1, -1, -1, -1, -1, Any, Empty, -1, -1 }, // Ws2
+ { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Empty
+ { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Any
+ { -1, -1, -1, Cp, Cp, Mix, -1, -1, -1, Cp, Cp, Cp, Cp }, // Cont
+ { Mix2, -1, MixN1, -1, Mix3, -1, -1, -1, -1, -1, -1, -1, -1 }, // Mix
+ { -1, -1, MixN1, -1, Mix3, -1, -1, -1, -1, -1, -1, -1, -1 }, // Mix2
+ { WsD, Done, -1, -1, -1, -1, -1, WsD, -1, -1, -1, -1, -1 }, // Mix3
+ { -1, -1, -1, -1, -1, -1, -1, -1, -1, MixN2, MixN2, MixN2, MixN2 }, // MixN1
+ { MixN3, -1, MixN1, -1, MixN4, -1, -1, -1, -1, -1, -1, -1, -1 }, // MixN2
+ { -1, -1, MixN1, -1, MixN4, -1, -1, -1, -1, -1, -1, -1, -1 }, // MixN3
+ { -1, -1, -1, -1, -1, -1, -1, WsD, -1, -1, -1, -1, -1 }, // MixN4
+ { WsD, Done, -1, -1, -1, -1, Cp2, Cp2, Cp2, -1, -1, -1, -1 }, // Cp
+ { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Cp2
+ { -1, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } // WsD
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // read input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == '>' ) {
+ input = InpGt;
+ } else if ( c == '|' ) {
+ input = InpPipe;
+ } else if ( c == '(' ) {
+ input = InpOp;
+ } else if ( c == ')' ) {
+ input = InpCp;
+ } else if ( c == '#' ) {
+ input = InpHash;
+ } else if ( c == '?' ) {
+ input = InpQm;
+ } else if ( c == '*' ) {
+ input = InpAst;
+ } else if ( c == '+' ) {
+ input = InpPlus;
+ } else if ( c == 'A' ) {
+ input = InpA;
+ } else if ( c == 'E' ) {
+ input = InpE;
+ } else if ( c == 'L' ) {
+ input = InpL;
+ } else {
+ input = InpUnknown;
+ }
+ // get new state
+//qDebug( "%d -%d(%c)-> %d", state, input, c.latin1(), table[state][input] );
+ state = table[state][input];
+
+ // in some cases do special actions depending on state
+ switch ( state ) {
+ case Elem:
+ parseOk = parseString( "LEMENT" );
+ break;
+ case Ws1:
+ eat_ws();
+ break;
+ case Nam:
+ parseOk = parseName();
+ break;
+ case Ws2:
+ eat_ws();
+ break;
+ case Empty:
+ parseOk = parseString( "EMPTY" );
+ break;
+ case Any:
+ parseOk = parseString( "ANY" );
+ break;
+ case Cont:
+ next_eat_ws();
+ break;
+ case Mix:
+ parseOk = parseString( "#PCDATA" );
+ break;
+ case Mix2:
+ eat_ws();
+ break;
+ case Mix3:
+ next();
+ break;
+ case MixN1:
+ next_eat_ws();
+ break;
+ case MixN2:
+ parseOk = parseName();
+ break;
+ case MixN3:
+ eat_ws();
+ break;
+ case MixN4:
+ next();
+ break;
+ case Cp:
+ parseOk = parseChoiceSeq();
+ break;
+ case Cp2:
+ next();
+ break;
+ case WsD:
+ next_eat_ws();
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Elem:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case Nam:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ break;
+ case Empty:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case Any:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case Mix:
+ if( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case MixN2:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ break;
+ case Cp:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGCHOICE;
+ goto parseError;
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a NotationDecl [82].
+
+ Precondition: the beginning '<!' is already read and the head
+ stands on the 'N' of '<!NOTATION'
+*/
+bool QXmlSimpleReader::parseNotationDecl()
+{
+ const signed char Init = 0;
+ const signed char Not = 1; // read NOTATION
+ const signed char Ws1 = 2; // eat whitespaces
+ const signed char Nam = 3; // read Name
+ const signed char Ws2 = 4; // eat whitespaces
+ const signed char ExtID = 5; // parse ExternalID
+ const signed char Ws3 = 6; // eat whitespaces
+ const signed char Done = 7;
+
+ const signed char InpWs = 0;
+ const signed char InpGt = 1; // >
+ const signed char InpN = 2; // N
+ const signed char InpUnknown = 3;
+
+ // use some kind of state machine for parsing
+ static signed char table[7][4] = {
+ /* InpWs InpGt InpN InpUnknown */
+ { -1, -1, Not, -1 }, // Init
+ { Ws1, -1, -1, -1 }, // Not
+ { -1, -1, Nam, Nam }, // Ws1
+ { Ws2, Done, -1, -1 }, // Nam
+ { -1, Done, ExtID, ExtID }, // Ws2
+ { Ws3, Done, -1, -1 }, // ExtID
+ { -1, Done, -1, -1 } // Ws3
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == '>' ) {
+ input = InpGt;
+ } else if ( c == 'N' ) {
+ input = InpN;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Not:
+ parseOk = parseString( "NOTATION" );
+ break;
+ case Ws1:
+ eat_ws();
+ break;
+ case Nam:
+ parseOk = parseName();
+ break;
+ case Ws2:
+ eat_ws();
+ break;
+ case ExtID:
+ parseOk = parseExternalID( TRUE );
+ break;
+ case Ws3:
+ eat_ws();
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Not:
+ if ( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case Nam:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ break;
+ case ExtID:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGEXTERNALID;
+ goto parseError;
+ }
+ // call the handler
+ if ( dtdHnd ) {
+ if ( !dtdHnd->notationDecl( name(), d->publicId, d->systemId ) ) {
+ d->error = dtdHnd->errorString();
+ goto parseError;
+ }
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse choice [49] or seq [50].
+
+ Precondition: the beginning '('S? is already read and the head
+ stands on the first non-whitespace character after it.
+*/
+bool QXmlSimpleReader::parseChoiceSeq()
+{
+ const signed char Init = 0;
+ const signed char Ws1 = 1; // eat whitespace
+ const signed char CS_ = 2; // choice or set
+ const signed char Ws2 = 3; // eat whitespace
+ const signed char More = 4; // more cp to read
+ const signed char Name = 5; // read name
+ const signed char Done = 6; //
+
+ const signed char InpWs = 0; // S
+ const signed char InpOp = 1; // (
+ const signed char InpCp = 2; // )
+ const signed char InpQm = 3; // ?
+ const signed char InpAst = 4; // *
+ const signed char InpPlus = 5; // +
+ const signed char InpPipe = 6; // |
+ const signed char InpComm = 7; // ,
+ const signed char InpUnknown = 8;
+
+ // use some kind of state machine for parsing
+ static signed char table[6][9] = {
+ /* InpWs InpOp InpCp InpQm InpAst InpPlus InpPipe InpComm InpUnknown */
+ { -1, Ws1, -1, -1, -1, -1, -1, -1, Name }, // Init
+ { -1, CS_, -1, -1, -1, -1, -1, -1, CS_ }, // Ws1
+ { Ws2, -1, Done, Ws2, Ws2, Ws2, More, More, -1 }, // CS_
+ { -1, -1, Done, -1, -1, -1, More, More, -1 }, // Ws2
+ { -1, Ws1, -1, -1, -1, -1, -1, -1, Name }, // More (same as Init)
+ { Ws2, -1, Done, Ws2, Ws2, Ws2, More, More, -1 } // Name (same as CS_)
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == '(' ) {
+ input = InpOp;
+ } else if ( c == ')' ) {
+ input = InpCp;
+ } else if ( c == '?' ) {
+ input = InpQm;
+ } else if ( c == '*' ) {
+ input = InpAst;
+ } else if ( c == '+' ) {
+ input = InpPlus;
+ } else if ( c == '|' ) {
+ input = InpPipe;
+ } else if ( c == ',' ) {
+ input = InpComm;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Ws1:
+ next_eat_ws();
+ break;
+ case CS_:
+ parseOk = parseChoiceSeq();
+ break;
+ case Ws2:
+ next_eat_ws();
+ break;
+ case More:
+ next_eat_ws();
+ break;
+ case Name:
+ parseOk = parseName();
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case CS_:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGCHOICE;
+ goto parseError;
+ }
+ break;
+ case Name:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a EntityDecl [70].
+
+ Precondition: the beginning '<!E' is already read and the head
+ stand on the 'N' of '<!ENTITY'
+*/
+bool QXmlSimpleReader::parseEntityDecl()
+{
+ const signed char Init = 0;
+ const signed char Ent = 1; // parse "ENTITY"
+ const signed char Ws1 = 2; // white space read
+ const signed char Name = 3; // parse name
+ const signed char Ws2 = 4; // white space read
+ const signed char EValue = 5; // parse entity value
+ const signed char ExtID = 6; // parse ExternalID
+ const signed char Ws3 = 7; // white space read
+ const signed char Ndata = 8; // parse "NDATA"
+ const signed char Ws4 = 9; // white space read
+ const signed char NNam = 10; // parse name
+ const signed char PEDec = 11; // parse PEDecl
+ const signed char Ws6 = 12; // white space read
+ const signed char PENam = 13; // parse name
+ const signed char Ws7 = 14; // white space read
+ const signed char PEVal = 15; // parse entity value
+ const signed char PEEID = 16; // parse ExternalID
+ const signed char WsE = 17; // white space read
+ const signed char EDDone = 19; // done, but also report an external, unparsed entity decl
+ const signed char Done = 18;
+
+ const signed char InpWs = 0; // white space
+ const signed char InpPer = 1; // %
+ const signed char InpQuot = 2; // " or '
+ const signed char InpGt = 3; // >
+ const signed char InpN = 4; // N
+ const signed char InpUnknown = 5;
+
+ // use some kind of state machine for parsing
+ static signed char table[18][6] = {
+ /* InpWs InpPer InpQuot InpGt InpN InpUnknown */
+ { -1, -1, -1, -1, Ent, -1 }, // Init
+ { Ws1, -1, -1, -1, -1, -1 }, // Ent
+ { -1, PEDec, -1, -1, Name, Name }, // Ws1
+ { Ws2, -1, -1, -1, -1, -1 }, // Name
+ { -1, -1, EValue, -1, -1, ExtID }, // Ws2
+ { WsE, -1, -1, Done, -1, -1 }, // EValue
+ { Ws3, -1, -1, EDDone,-1, -1 }, // ExtID
+ { -1, -1, -1, EDDone,Ndata, -1 }, // Ws3
+ { Ws4, -1, -1, -1, -1, -1 }, // Ndata
+ { -1, -1, -1, -1, NNam, NNam }, // Ws4
+ { WsE, -1, -1, Done, -1, -1 }, // NNam
+ { Ws6, -1, -1, -1, -1, -1 }, // PEDec
+ { -1, -1, -1, -1, PENam, PENam }, // Ws6
+ { Ws7, -1, -1, -1, -1, -1 }, // PENam
+ { -1, -1, PEVal, -1, -1, PEEID }, // Ws7
+ { WsE, -1, -1, Done, -1, -1 }, // PEVal
+ { WsE, -1, -1, Done, -1, -1 }, // PEEID
+ { -1, -1, -1, Done, -1, -1 } // WsE
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_S(c) ) {
+ input = InpWs;
+ } else if ( c == '%' ) {
+ input = InpPer;
+ } else if ( c == '"' || c == '\'' ) {
+ input = InpQuot;
+ } else if ( c == '>' ) {
+ input = InpGt;
+ } else if ( c == 'N' ) {
+ input = InpN;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Ent:
+ parseOk = parseString( "NTITY" );
+ break;
+ case Ws1:
+ eat_ws();
+ break;
+ case Name:
+ parseOk = parseName();
+ break;
+ case Ws2:
+ eat_ws();
+ break;
+ case EValue:
+ parseOk = parseEntityValue();
+ break;
+ case ExtID:
+ parseOk = parseExternalID();
+ break;
+ case Ws3:
+ eat_ws();
+ break;
+ case Ndata:
+ parseOk = parseString( "NDATA" );
+ break;
+ case Ws4:
+ eat_ws();
+ break;
+ case NNam:
+ parseOk = parseName( TRUE );
+ break;
+ case PEDec:
+ next();
+ break;
+ case Ws6:
+ eat_ws();
+ break;
+ case PENam:
+ parseOk = parseName();
+ break;
+ case Ws7:
+ eat_ws();
+ break;
+ case PEVal:
+ parseOk = parseEntityValue();
+ break;
+ case PEEID:
+ parseOk = parseExternalID();
+ break;
+ case WsE:
+ eat_ws();
+ break;
+ case EDDone:
+ next();
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Ent:
+ if ( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case Name:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ break;
+ case EValue:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGENTITYVALUE;
+ goto parseError;
+ }
+ if ( !entityExist( name() ) ) {
+ d->entities.insert( name(), string() );
+ if ( declHnd ) {
+ if ( !declHnd->internalEntityDecl( name(), string() ) ) {
+ d->error = declHnd->errorString();
+ goto parseError;
+ }
+ }
+ }
+ break;
+ case ExtID:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGEXTERNALID;
+ goto parseError;
+ }
+ break;
+ case Ndata:
+ if ( !parseOk ) {
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+ break;
+ case NNam:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ if ( !entityExist( name() ) ) {
+ d->externEntities.insert( name(), QXmlSimpleReaderPrivate::ExternEntity( d->publicId, d->systemId, ref() ) );
+ if ( dtdHnd ) {
+ if ( !dtdHnd->unparsedEntityDecl( name(), d->publicId, d->systemId, ref() ) ) {
+ d->error = declHnd->errorString();
+ goto parseError;
+ }
+ }
+ }
+ break;
+ case PENam:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ break;
+ case PEVal:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGENTITYVALUE;
+ goto parseError;
+ }
+ if ( !entityExist( name() ) ) {
+ d->parameterEntities.insert( name(), string() );
+ if ( declHnd ) {
+ if ( !declHnd->internalEntityDecl( QString("%")+name(), string() ) ) {
+ d->error = declHnd->errorString();
+ goto parseError;
+ }
+ }
+ }
+ break;
+ case PEEID:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGEXTERNALID;
+ goto parseError;
+ }
+ if ( !entityExist( name() ) ) {
+ d->externParameterEntities.insert( name(), QXmlSimpleReaderPrivate::ExternParameterEntity( d->publicId, d->systemId ) );
+ if ( declHnd ) {
+ if ( !declHnd->externalEntityDecl( QString("%")+name(), d->publicId, d->systemId ) ) {
+ d->error = declHnd->errorString();
+ goto parseError;
+ }
+ }
+ }
+ break;
+ case EDDone:
+ if ( !entityExist( name() ) ) {
+ d->externEntities.insert( name(), QXmlSimpleReaderPrivate::ExternEntity( d->publicId, d->systemId, QString::null ) );
+ if ( declHnd ) {
+ if ( !declHnd->externalEntityDecl( name(), d->publicId, d->systemId ) ) {
+ d->error = declHnd->errorString();
+ goto parseError;
+ }
+ }
+ }
+ return TRUE;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_LETTEREXPECTED;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a EntityValue [9]
+*/
+bool QXmlSimpleReader::parseEntityValue()
+{
+ bool tmp;
+
+ const signed char Init = 0;
+ const signed char Dq = 1; // EntityValue is double quoted
+ const signed char DqC = 2; // signed character
+ const signed char DqPER = 3; // PERefence
+ const signed char DqRef = 4; // Reference
+ const signed char Sq = 5; // EntityValue is double quoted
+ const signed char SqC = 6; // signed character
+ const signed char SqPER = 7; // PERefence
+ const signed char SqRef = 8; // Reference
+ const signed char Done = 9;
+
+ const signed char InpDq = 0; // "
+ const signed char InpSq = 1; // '
+ const signed char InpAmp = 2; // &
+ const signed char InpPer = 3; // %
+ const signed char InpUnknown = 4;
+
+ // use some kind of state machine for parsing
+ static signed char table[9][5] = {
+ /* InpDq InpSq InpAmp InpPer InpUnknown */
+ { Dq, Sq, -1, -1, -1 }, // Init
+ { Done, DqC, DqRef, DqPER, DqC }, // Dq
+ { Done, DqC, DqRef, DqPER, DqC }, // DqC
+ { Done, DqC, DqRef, DqPER, DqC }, // DqPER
+ { Done, DqC, DqRef, DqPER, DqC }, // DqRef
+ { SqC, Done, SqRef, SqPER, SqC }, // Sq
+ { SqC, Done, SqRef, SqPER, SqC }, // SqC
+ { SqC, Done, SqRef, SqPER, SqC }, // SqPER
+ { SqC, Done, SqRef, SqPER, SqC } // SqRef
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( c == '"' ) {
+ input = InpDq;
+ } else if ( c == '\'' ) {
+ input = InpSq;
+ } else if ( c == '&' ) {
+ input = InpAmp;
+ } else if ( c == '%' ) {
+ input = InpPer;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Dq:
+ case Sq:
+ stringClear();
+ next();
+ break;
+ case DqC:
+ case SqC:
+ stringAddC();
+ next();
+ break;
+ case DqPER:
+ case SqPER:
+ parseOk = parsePEReference( InEntityValue );
+ break;
+ case DqRef:
+ case SqRef:
+ parseOk = parseReference( tmp, InEntityValue );
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case DqPER:
+ case SqPER:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGDOCTYPE;
+ goto parseError;
+ }
+ break;
+ case DqRef:
+ case SqRef:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGREFERENCE;
+ goto parseError;
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_LETTEREXPECTED;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a comment [15].
+
+ Precondition: the beginning '<!' of the comment is already read and the head
+ stands on the first '-' of '<!--'.
+
+ If this funktion was successful, the head-position is on the first
+ character after the comment.
+*/
+bool QXmlSimpleReader::parseComment()
+{
+ const signed char Init = 0;
+ const signed char Dash1 = 1; // the first dash was read
+ const signed char Dash2 = 2; // the second dash was read
+ const signed char Com = 3; // read comment
+ const signed char Com2 = 4; // read comment (help state)
+ const signed char ComE = 5; // finished reading comment
+ const signed char Done = 6;
+
+ const signed char InpDash = 0; // -
+ const signed char InpGt = 1; // >
+ const signed char InpUnknown = 2;
+
+ // use some kind of state machine for parsing
+ static signed char table[6][3] = {
+ /* InpDash InpGt InpUnknown */
+ { Dash1, -1, -1 }, // Init
+ { Dash2, -1, -1 }, // Dash1
+ { Com2, Com, Com }, // Dash2
+ { Com2, Com, Com }, // Com
+ { ComE, Com, Com }, // Com2
+ { -1, Done, -1 } // ComE
+ };
+ signed char state = Init;
+ signed char input;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( c == '-' ) {
+ input = InpDash;
+ } else if ( c == '>' ) {
+ input = InpGt;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Dash1:
+ next();
+ break;
+ case Dash2:
+ next();
+ break;
+ case Com:
+ stringAddC();
+ next();
+ break;
+ case Com2:
+ next();
+ break;
+ case ComE:
+ next();
+ break;
+ case Done:
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Dash2:
+ stringClear();
+ break;
+ case Com2:
+ // if next character is not a dash than don't skip it
+ if ( c != '-' ) {
+ stringAddC( '-' );
+ }
+ break;
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_ERRORPARSINGCOMMENT;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a Attribute [41].
+
+ Precondition: the head stands on the first character of the name of the
+ attribute (i.e. all whitespaces are already parsed).
+
+ The head stand on the next character after the end quotes. The variable name
+ contains the name of the attribute and the variable string contains the value
+ of the attribute.
+*/
+bool QXmlSimpleReader::parseAttribute()
+{
+ const signed char Init = 0;
+ const signed char PName = 1; // parse name
+ const signed char Ws = 2; // eat ws
+ const signed char Eq = 3; // the '=' was read
+ const signed char Quotes = 4; // " or ' were read
+
+ const signed char InpNameBe = 0;
+ const signed char InpEq = 1; // =
+ const signed char InpDq = 2; // "
+ const signed char InpSq = 3; // '
+ const signed char InpUnknown = 4;
+
+ // use some kind of state machine for parsing
+ static signed char table[4][5] = {
+ /* InpNameBe InpEq InpDq InpSq InpUnknown */
+ { PName, -1, -1, -1, -1 }, // Init
+ { -1, Eq, -1, -1, Ws }, // PName
+ { -1, Eq, -1, -1, -1 }, // Ws
+ { -1, -1, Quotes, Quotes, -1 } // Eq
+ };
+ signed char state = Init;
+ signed char input;
+ bool parseOk = TRUE;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_NameBeginning(c) ) {
+ input = InpNameBe;
+ } else if ( c == '=' ) {
+ input = InpEq;
+ } else if ( c == '"' ) {
+ input = InpDq;
+ } else if ( c == '\'' ) {
+ input = InpSq;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case PName:
+ parseOk = parseName();
+ break;
+ case Ws:
+ eat_ws();
+ break;
+ case Eq:
+ next_eat_ws();
+ break;
+ case Quotes:
+ parseOk = parseAttValue();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case PName:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGNAME;
+ goto parseError;
+ }
+ break;
+ case Quotes:
+ if ( !parseOk ) {
+ d->error = XMLERR_ERRORPARSINGATTVALUE;
+ goto parseError;
+ }
+ // Done
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a Name [5] and store the name in name or ref (if useRef is TRUE).
+*/
+bool QXmlSimpleReader::parseName( bool useRef )
+{
+ const signed char Init = 0;
+ const signed char Name1 = 1; // parse first signed character of the name
+ const signed char Name = 2; // parse name
+ const signed char Done = 3;
+
+ const signed char InpNameBe = 0; // name beginning signed characters
+ const signed char InpNameCh = 1; // NameChar without InpNameBe
+ const signed char InpUnknown = 2;
+
+ // use some kind of state machine for parsing
+ static signed char table[3][3] = {
+ /* InpNameBe InpNameCh InpUnknown */
+ { Name1, -1, -1 }, // Init
+ { Name, Name, Done }, // Name1
+ { Name, Name, Done } // Name
+ };
+ signed char state = Init;
+ signed char input;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_NameBeginning(c) ) {
+ input = InpNameBe;
+ } else if ( is_NameChar(c) ) {
+ input = InpNameCh;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case Name1:
+ if ( useRef ) {
+ refClear();
+ refAddC();
+ } else {
+ nameClear();
+ nameAddC();
+ }
+ next();
+ break;
+ case Name:
+ if ( useRef ) {
+ refAddC();
+ } else {
+ nameAddC();
+ }
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_LETTEREXPECTED;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a Nmtoken [7] and store the name in name.
+*/
+bool QXmlSimpleReader::parseNmtoken()
+{
+ const signed char Init = 0;
+ const signed char NameF = 1;
+ const signed char Name = 2;
+ const signed char Done = 3;
+
+ const signed char InpNameCh = 0; // NameChar without InpNameBe
+ const signed char InpUnknown = 1;
+
+ // use some kind of state machine for parsing
+ static signed char table[3][2] = {
+ /* InpNameCh InpUnknown */
+ { NameF, -1 }, // Init
+ { Name, Done }, // NameF
+ { Name, Done } // Name
+ };
+ signed char state = Init;
+ signed char input;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( is_NameChar(c) ) {
+ input = InpNameCh;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case NameF:
+ nameClear();
+ nameAddC();
+ next();
+ break;
+ case Name:
+ nameAddC();
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case Done:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_LETTEREXPECTED;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Parse a Reference [67].
+
+ charDataRead is set to TRUE if the reference must not be parsed. The
+ character(s) which the reference mapped to are appended to string. The
+ head stands on the first character after the reference.
+
+ charDataRead is set to FALSE if the reference must be parsed. The
+ charachter(s) which the reference mapped to are inserted at the reference
+ position. The head stands on the first character of the replacement).
+*/
+bool QXmlSimpleReader::parseReference( bool &charDataRead, EntityRecognitionContext context )
+{
+ // temporary variables
+ uint tmp;
+ bool ok;
+
+ const signed char Init = 0;
+ const signed char SRef = 1; // start of a reference
+ const signed char ChRef = 2; // parse CharRef
+ const signed char ChDec = 3; // parse CharRef decimal
+ const signed char ChHexS = 4; // start CharRef hexadecimal
+ const signed char ChHex = 5; // parse CharRef hexadecimal
+ const signed char Name = 6; // parse name
+ const signed char DoneD = 7; // done CharRef decimal
+ const signed char DoneH = 8; // done CharRef hexadecimal
+ const signed char DoneN = 9; // done EntityRef
+
+ const signed char InpAmp = 0; // &
+ const signed char InpSemi = 1; // ;
+ const signed char InpHash = 2; // #
+ const signed char InpX = 3; // x
+ const signed char InpNum = 4; // 0-9
+ const signed char InpHex = 5; // a-f A-F
+ const signed char InpUnknown = 6;
+
+ // use some kind of state machine for parsing
+ static signed char table[8][7] = {
+ /* InpAmp InpSemi InpHash InpX InpNum InpHex InpUnknown */
+ { SRef, -1, -1, -1, -1, -1, -1 }, // Init
+ { -1, -1, ChRef, Name, Name, Name, Name }, // SRef
+ { -1, -1, -1, ChHexS, ChDec, -1, -1 }, // ChRef
+ { -1, DoneD, -1, -1, ChDec, -1, -1 }, // ChDec
+ { -1, -1, -1, -1, ChHex, ChHex, -1 }, // ChHexS
+ { -1, DoneH, -1, -1, ChHex, ChHex, -1 }, // ChHex
+ { -1, DoneN, -1, -1, -1, -1, -1 } // Name
+ };
+ signed char state = Init;
+ signed char input;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( c.row() ) {
+ input = InpUnknown;
+ } else if ( c.cell() == '&' ) {
+ input = InpAmp;
+ } else if ( c.cell() == ';' ) {
+ input = InpSemi;
+ } else if ( c.cell() == '#' ) {
+ input = InpHash;
+ } else if ( c.cell() == 'x' ) {
+ input = InpX;
+ } else if ( '0' <= c.cell() && c.cell() <= '9' ) {
+ input = InpNum;
+ } else if ( 'a' <= c.cell() && c.cell() <= 'f' ) {
+ input = InpHex;
+ } else if ( 'A' <= c.cell() && c.cell() <= 'F' ) {
+ input = InpHex;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ state = table[state][input];
+
+ // do some actions according to state
+ switch ( state ) {
+ case SRef:
+ refClear();
+ next();
+ break;
+ case ChRef:
+ next();
+ break;
+ case ChDec:
+ refAddC();
+ next();
+ break;
+ case ChHexS:
+ next();
+ break;
+ case ChHex:
+ refAddC();
+ next();
+ break;
+ case Name:
+ // read the name into the ref
+ parseName( TRUE );
+ break;
+ case DoneD:
+ tmp = ref().toUInt( &ok, 10 );
+ if ( ok ) {
+ stringAddC( QChar(tmp) );
+ } else {
+ d->error = XMLERR_ERRORPARSINGREFERENCE;
+ goto parseError;
+ }
+ charDataRead = TRUE;
+ next();
+ break;
+ case DoneH:
+ tmp = ref().toUInt( &ok, 16 );
+ if ( ok ) {
+ stringAddC( QChar(tmp) );
+ } else {
+ d->error = XMLERR_ERRORPARSINGREFERENCE;
+ goto parseError;
+ }
+ charDataRead = TRUE;
+ next();
+ break;
+ case DoneN:
+ if ( !processReference( charDataRead, context ) )
+ goto parseError;
+ next();
+ break;
+ }
+ // no input is read after this
+ switch ( state ) {
+ case DoneD:
+ return TRUE;
+ case DoneH:
+ return TRUE;
+ case DoneN:
+ return TRUE;
+ case -1:
+ // Error
+ d->error = XMLERR_ERRORPARSINGREFERENCE;
+ goto parseError;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+/*!
+ Helper function for parseReference()
+*/
+bool QXmlSimpleReader::processReference( bool &charDataRead, EntityRecognitionContext context )
+{
+ QString reference = ref();
+ if ( reference == "amp" ) {
+ if ( context == InEntityValue ) {
+ // Bypassed
+ stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'm' ); stringAddC( 'p' ); stringAddC( ';' );
+ } else {
+ // Included or Included in literal
+ stringAddC( '&' );
+ }
+ charDataRead = TRUE;
+ } else if ( reference == "lt" ) {
+ if ( context == InEntityValue ) {
+ // Bypassed
+ stringAddC( '&' ); stringAddC( 'l' ); stringAddC( 't' ); stringAddC( ';' );
+ } else {
+ // Included or Included in literal
+ stringAddC( '<' );
+ }
+ charDataRead = TRUE;
+ } else if ( reference == "gt" ) {
+ if ( context == InEntityValue ) {
+ // Bypassed
+ stringAddC( '&' ); stringAddC( 'g' ); stringAddC( 't' ); stringAddC( ';' );
+ } else {
+ // Included or Included in literal
+ stringAddC( '>' );
+ }
+ charDataRead = TRUE;
+ } else if ( reference == "apos" ) {
+ if ( context == InEntityValue ) {
+ // Bypassed
+ stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'p' ); stringAddC( 'o' ); stringAddC( 's' ); stringAddC( ';' );
+ } else {
+ // Included or Included in literal
+ stringAddC( '\'' );
+ }
+ charDataRead = TRUE;
+ } else if ( reference == "quot" ) {
+ if ( context == InEntityValue ) {
+ // Bypassed
+ stringAddC( '&' ); stringAddC( 'q' ); stringAddC( 'u' ); stringAddC( 'o' ); stringAddC( 't' ); stringAddC( ';' );
+ } else {
+ // Included or Included in literal
+ stringAddC( '"' );
+ }
+ charDataRead = TRUE;
+ } else {
+ QMap<QString,QString>::Iterator it;
+ it = d->entities.find( reference );
+ if ( it != d->entities.end() ) {
+ // "Internal General"
+ switch ( context ) {
+ case InContent:
+ // Included
+ xmlRef = it.data() + xmlRef;
+ charDataRead = FALSE;
+ break;
+ case InAttributeValue:
+ // Included in literal
+ xmlRef = it.data().replace( QRegExp("\""), "&quot;" ).replace( QRegExp("'"), "&apos;" )
+ + xmlRef;
+ charDataRead = FALSE;
+ break;
+ case InEntityValue:
+ {
+ // Bypassed
+ stringAddC( '&' );
+ for ( int i=0; i<(int)reference.length(); i++ ) {
+ stringAddC( reference[i] );
+ }
+ stringAddC( ';');
+ charDataRead = TRUE;
+ }
+ break;
+ case InDTD:
+ // Forbidden
+ d->error = XMLERR_INTERNALGENERALENTITYINDTD;
+ charDataRead = FALSE;
+ break;
+ }
+ } else {
+ QMap<QString,QXmlSimpleReaderPrivate::ExternEntity>::Iterator itExtern;
+ itExtern = d->externEntities.find( reference );
+ if ( itExtern == d->externEntities.end() ) {
+ // entity not declared
+ // ### check this case for conformance
+ if ( context == InEntityValue ) {
+ // Bypassed
+ stringAddC( '&' );
+ for ( int i=0; i<(int)reference.length(); i++ ) {
+ stringAddC( reference[i] );
+ }
+ stringAddC( ';');
+ charDataRead = TRUE;
+ } else {
+ if ( contentHnd ) {
+ if ( !contentHnd->skippedEntity( reference ) ) {
+ d->error = contentHnd->errorString();
+ return FALSE; // error
+ }
+ }
+ }
+ } else if ( (*itExtern).notation.isNull() ) {
+ // "External Parsed General"
+ switch ( context ) {
+ case InContent:
+ // Included if validating
+ if ( contentHnd ) {
+ if ( !contentHnd->skippedEntity( reference ) ) {
+ d->error = contentHnd->errorString();
+ return FALSE; // error
+ }
+ }
+ charDataRead = FALSE;
+ break;
+ case InAttributeValue:
+ // Forbidden
+ d->error = XMLERR_EXTERNALGENERALENTITYINAV;
+ charDataRead = FALSE;
+ break;
+ case InEntityValue:
+ {
+ // Bypassed
+ stringAddC( '&' );
+ for ( int i=0; i<(int)reference.length(); i++ ) {
+ stringAddC( reference[i] );
+ }
+ stringAddC( ';');
+ charDataRead = TRUE;
+ }
+ break;
+ case InDTD:
+ // Forbidden
+ d->error = XMLERR_EXTERNALGENERALENTITYINDTD;
+ charDataRead = FALSE;
+ break;
+ }
+ } else {
+ // "Unparsed"
+ // ### notify for "Occurs as Attribute Value" missing (but this is no refence, anyway)
+ // Forbidden
+ d->error = XMLERR_UNPARSEDENTITYREFERENCE;
+ charDataRead = FALSE;
+ return FALSE; // error
+ }
+ }
+ }
+ return TRUE; // no error
+}
+
+
+/*!
+ Parse over a simple string.
+
+ After the string was successfully parsed, the head is on the first
+ character after the string.
+*/
+bool QXmlSimpleReader::parseString( const QString& s )
+{
+ signed char Done = s.length();
+
+ const signed char InpCharExpected = 0; // the character that was expected
+ const signed char InpUnknown = 1;
+
+ signed char state = 0; // state in this function is the position in the string s
+ signed char input;
+
+ while ( TRUE ) {
+
+ // get input
+ if ( atEnd() ) {
+ d->error = XMLERR_UNEXPECTEDEOF;
+ goto parseError;
+ }
+ if ( c == s[(int)state] ) {
+ input = InpCharExpected;
+ } else {
+ input = InpUnknown;
+ }
+
+ // set state according to input
+ if ( input == InpCharExpected ) {
+ state++;
+ } else {
+ // Error
+ d->error = XMLERR_UNEXPECTEDCHARACTER;
+ goto parseError;
+ }
+
+ // do some actions according to state
+ next();
+ // no input is read after this
+ if ( state == Done ) {
+ return TRUE;
+ }
+
+ }
+
+ return TRUE;
+
+parseError:
+ reportParseError();
+ return FALSE;
+}
+
+
+/*!
+ Inits the data values.
+*/
+void QXmlSimpleReader::init( const QXmlInputSource& i )
+{
+ xml = i.data();
+ xmlLength = xml.length();
+ xmlRef = "";
+
+ d->externParameterEntities.clear();
+ d->parameterEntities.clear();
+ d->externEntities.clear();
+ d->entities.clear();
+
+ tags.clear();
+
+ d->doctype = "";
+ d->xmlVersion = "";
+ d->encoding = "";
+ d->standalone = QXmlSimpleReaderPrivate::Unknown;
+
+ lineNr = 0;
+ columnNr = -1;
+ pos = 0;
+ next();
+ d->error = XMLERR_OK;
+}
+
+/*!
+ Returns TRUE if a entity with the name \a e exists,
+ otherwise returns FALSE.
+*/
+bool QXmlSimpleReader::entityExist( const QString& e ) const
+{
+ if ( d->parameterEntities.find(e) == d->parameterEntities.end() &&
+ d->externParameterEntities.find(e) == d->externParameterEntities.end() ) {
+ return FALSE;
+ } else {
+ return TRUE;
+ }
+}
+
+void QXmlSimpleReader::reportParseError()
+{
+ if ( errorHnd )
+ errorHnd->fatalError( QXmlParseException( d->error, columnNr+1, lineNr+1 ) );
+}
+
+#endif //QT_NO_XML
diff --git a/qtools/qxml.h b/qtools/qxml.h
new file mode 100644
index 0000000..2f7567d
--- /dev/null
+++ b/qtools/qxml.h
@@ -0,0 +1,671 @@
+/****************************************************************************
+**
+**
+** Definition of QXmlSimpleReader and related classes.
+**
+** Created : 000518
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file is part of the XML module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition licenses may use this
+** file in accordance with the Qt Commercial License Agreement provided
+** with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QXML_H
+#define QXML_H
+
+#include <qmodules.h>
+
+#if !defined(QT_MODULE_XML)
+#define QM_EXPORT
+#else
+#define QM_EXPORT Q_EXPORT
+#endif
+
+#ifndef QT_H
+#include <qtextstream.h>
+#include <qfile.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qvaluestack.h>
+#include <qmap.h>
+#endif // QT_H
+
+#ifndef QT_NO_XML
+
+class QXmlNamespaceSupport;
+class QXmlAttributes;
+class QXmlContentHandler;
+class QXmlDefaultHandler;
+class QXmlDTDHandler;
+class QXmlEntityResolver;
+class QXmlErrorHandler;
+class QXmlLexicalHandler;
+class QXmlDeclHandler;
+class QXmlInputSource;
+class QXmlLocator;
+class QXmlNamespaceSupport;
+class QXmlParseException;
+
+class QXmlReader;
+class QXmlSimpleReader;
+
+class QXmlSimpleReaderPrivate;
+class QXmlNamespaceSupportPrivate;
+class QXmlAttributesPrivate;
+class QXmlInputSourcePrivate;
+class QXmlParseExceptionPrivate;
+class QXmlLocatorPrivate;
+class QXmlDefaultHandlerPrivate;
+
+
+//
+// SAX Namespace Support
+//
+
+#if defined(Q_TEMPLATEDLL)
+// MOC_SKIP_BEGIN
+template class QM_EXPORT QMap<QString, QString>;
+template class QM_EXPORT QValueStack<QMap<QString, QString> >;
+template class QM_EXPORT QValueStack<QString>;
+// MOC_SKIP_END
+#endif
+
+class QM_EXPORT QXmlNamespaceSupport
+{
+public:
+ QXmlNamespaceSupport();
+ ~QXmlNamespaceSupport();
+
+ void setPrefix( const QString&, const QString& );
+
+ QString prefix( const QString& ) const;
+ QString uri( const QString& ) const;
+ void splitName( const QString&, QString&, QString& ) const;
+ void processName( const QString&, bool, QString&, QString& ) const;
+ QStringList prefixes() const;
+ QStringList prefixes( const QString& ) const;
+
+ void pushContext();
+ void popContext();
+ void reset();
+private:
+ QValueStack<QMap<QString, QString> > nsStack;
+ QMap<QString, QString> ns;
+
+ QXmlNamespaceSupportPrivate *d;
+};
+
+
+//
+// SAX Attributes
+//
+
+class QM_EXPORT QXmlAttributes
+{
+public:
+ QXmlAttributes() {}
+ virtual ~QXmlAttributes() {}
+
+ int index( const QString& qName ) const;
+ int index( const QString& uri, const QString& localPart ) const;
+ int length() const;
+ QString localName( int index ) const;
+ QString qName( int index ) const;
+ QString uri( int index ) const;
+ QString type( int index ) const;
+ QString type( const QString& qName ) const;
+ QString type( const QString& uri, const QString& localName ) const;
+ QString value( int index ) const;
+ QString value( const QString& qName ) const;
+ QString value( const QString& uri, const QString& localName ) const;
+
+private:
+ QStringList qnameList;
+ QStringList uriList;
+ QStringList localnameList;
+ QStringList valueList;
+
+ QXmlAttributesPrivate *d;
+
+ friend class QXmlSimpleReader;
+};
+
+//
+// SAX Input Source
+//
+
+class QM_EXPORT QXmlInputSource
+{
+public:
+ QXmlInputSource();
+ QXmlInputSource( QTextStream& stream );
+ QXmlInputSource( QFile& file );
+ virtual ~QXmlInputSource();
+
+ virtual const QString& data() const;
+ virtual void setData( const QString& d );
+
+private:
+ void readInput( QByteArray& rawData );
+
+ QString input;
+
+ QXmlInputSourcePrivate *d;
+};
+
+//
+// SAX Exception Classes
+//
+
+class QM_EXPORT QXmlParseException
+{
+public:
+ QXmlParseException( const QString& name="", int c=-1, int l=-1, const QString& p="", const QString& s="" )
+ : msg( name ), column( c ), line( l ), pub( p ), sys( s )
+ { }
+
+ int columnNumber() const;
+ int lineNumber() const;
+ QString publicId() const;
+ QString systemId() const;
+ QString message() const;
+
+private:
+ QString msg;
+ int column;
+ int line;
+ QString pub;
+ QString sys;
+
+ QXmlParseExceptionPrivate *d;
+};
+
+
+//
+// XML Reader
+//
+
+class QM_EXPORT QXmlReader
+{
+public:
+ virtual ~QXmlReader() {}
+ virtual bool feature( const QString& name, bool *ok = 0 ) const = 0;
+ virtual void setFeature( const QString& name, bool value ) = 0;
+ virtual bool hasFeature( const QString& name ) const = 0;
+ virtual void* property( const QString& name, bool *ok = 0 ) const = 0;
+ virtual void setProperty( const QString& name, void* value ) = 0;
+ virtual bool hasProperty( const QString& name ) const = 0;
+ virtual void setEntityResolver( QXmlEntityResolver* handler ) = 0;
+ virtual QXmlEntityResolver* entityResolver() const = 0;
+ virtual void setDTDHandler( QXmlDTDHandler* handler ) = 0;
+ virtual QXmlDTDHandler* DTDHandler() const = 0;
+ virtual void setContentHandler( QXmlContentHandler* handler ) = 0;
+ virtual QXmlContentHandler* contentHandler() const = 0;
+ virtual void setErrorHandler( QXmlErrorHandler* handler ) = 0;
+ virtual QXmlErrorHandler* errorHandler() const = 0;
+ virtual void setLexicalHandler( QXmlLexicalHandler* handler ) = 0;
+ virtual QXmlLexicalHandler* lexicalHandler() const = 0;
+ virtual void setDeclHandler( QXmlDeclHandler* handler ) = 0;
+ virtual QXmlDeclHandler* declHandler() const = 0;
+ virtual bool parse( const QXmlInputSource& input ) = 0;
+};
+
+class QM_EXPORT QXmlSimpleReader : public QXmlReader
+{
+public:
+ QXmlSimpleReader();
+ virtual ~QXmlSimpleReader();
+
+ bool feature( const QString& name, bool *ok = 0 ) const;
+ void setFeature( const QString& name, bool value );
+ bool hasFeature( const QString& name ) const;
+
+ void* property( const QString& name, bool *ok = 0 ) const;
+ void setProperty( const QString& name, void* value );
+ bool hasProperty( const QString& name ) const;
+
+ void setEntityResolver( QXmlEntityResolver* handler );
+ QXmlEntityResolver* entityResolver() const;
+ void setDTDHandler( QXmlDTDHandler* handler );
+ QXmlDTDHandler* DTDHandler() const;
+ void setContentHandler( QXmlContentHandler* handler );
+ QXmlContentHandler* contentHandler() const;
+ void setErrorHandler( QXmlErrorHandler* handler );
+ QXmlErrorHandler* errorHandler() const;
+ void setLexicalHandler( QXmlLexicalHandler* handler );
+ QXmlLexicalHandler* lexicalHandler() const;
+ void setDeclHandler( QXmlDeclHandler* handler );
+ QXmlDeclHandler* declHandler() const;
+
+ bool parse( const QXmlInputSource& input );
+
+private:
+ // variables
+ QXmlContentHandler* contentHnd;
+ QXmlErrorHandler* errorHnd;
+ QXmlDTDHandler* dtdHnd;
+ QXmlEntityResolver* entityRes;
+ QXmlLexicalHandler* lexicalHnd;
+ QXmlDeclHandler* declHnd;
+
+ QChar c; // the character at reading position
+ int lineNr; // number of line
+ int columnNr; // position in line
+ int pos; // position in string
+
+ int namePos;
+ QChar nameArray[256]; // only used for names
+ QString nameValue; // only used for names
+ int refPos;
+ QChar refArray[256]; // only used for references
+ QString refValue; // only used for references
+ int stringPos;
+ QChar stringArray[256]; // used for any other strings that are parsed
+ QString stringValue; // used for any other strings that are parsed
+
+ QString xml;
+ int xmlLength;
+ QString xmlRef; // used for parsing of entity references
+
+ QValueStack<QString> tags;
+
+ QXmlSimpleReaderPrivate* d;
+
+ static const QChar QEOF;
+
+ // inlines
+ virtual bool is_S( const QChar& );
+ virtual bool is_Letter( const QChar& );
+ virtual bool is_NameBeginning( const QChar& );
+ virtual bool is_Digit( const QChar& );
+ virtual bool is_CombiningChar( const QChar& );
+ virtual bool is_Extender( const QChar& );
+ virtual bool is_NameChar( const QChar& );
+
+ QString& string();
+ void stringClear();
+ void stringAddC();
+ void stringAddC(const QChar&);
+ QString& name();
+ void nameClear();
+ void nameAddC();
+ void nameAddC(const QChar&);
+ QString& ref();
+ void refClear();
+ void refAddC();
+ void refAddC(const QChar&);
+
+ // used by parseReference() and parsePEReference()
+ enum EntityRecognitionContext { InContent, InAttributeValue, InEntityValue, InDTD };
+
+ // private functions
+ void eat_ws();
+ void next_eat_ws();
+
+ void next();
+ bool atEnd();
+
+ void init( const QXmlInputSource& i );
+
+ bool entityExist( const QString& ) const;
+
+ bool parseProlog();
+ bool parseElement();
+ bool parseElementEmptyTag( bool &t, QString &uri, QString &lname );
+ bool parseElementETagBegin2();
+ bool parseElementAttribute( QString &prefix, QString &uri, QString &lname );
+ bool parseMisc();
+ bool parseContent();
+
+ bool parsePI(bool xmldecl=FALSE);
+ bool parseDoctype();
+ bool parseComment();
+
+ bool parseName( bool useRef=FALSE );
+ bool parseNmtoken();
+ bool parseAttribute();
+ bool parseReference( bool &charDataRead, EntityRecognitionContext context );
+ bool processReference( bool &charDataRead, EntityRecognitionContext context );
+
+ bool parseExternalID( bool allowPublicID = FALSE );
+ bool parsePEReference( EntityRecognitionContext context );
+ bool parseMarkupdecl();
+ bool parseAttlistDecl();
+ bool parseAttType();
+ bool parseAttValue();
+ bool parseElementDecl();
+ bool parseNotationDecl();
+ bool parseChoiceSeq();
+ bool parseEntityDecl();
+ bool parseEntityValue();
+
+ bool parseString( const QString& s );
+
+ void reportParseError();
+
+ friend class QXmlSimpleReaderPrivate;
+ friend class QXmlLocator;
+};
+
+//
+// SAX Locator
+//
+
+class QM_EXPORT QXmlLocator
+{
+public:
+ QXmlLocator( QXmlSimpleReader* parent )
+ { reader = parent; }
+ ~QXmlLocator()
+ { }
+
+ int columnNumber();
+ int lineNumber();
+// QString getPublicId()
+// QString getSystemId()
+
+private:
+ QXmlSimpleReader* reader;
+
+ QXmlLocatorPrivate *d;
+};
+
+//
+// SAX handler classes
+//
+
+class QM_EXPORT QXmlContentHandler
+{
+public:
+ virtual ~QXmlContentHandler() {}
+ virtual void setDocumentLocator( QXmlLocator* locator ) = 0;
+ virtual bool startDocument() = 0;
+ virtual bool endDocument() = 0;
+ virtual bool startPrefixMapping( const QString& prefix, const QString& uri ) = 0;
+ virtual bool endPrefixMapping( const QString& prefix ) = 0;
+ virtual bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts ) = 0;
+ virtual bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName ) = 0;
+ virtual bool characters( const QString& ch ) = 0;
+ virtual bool ignorableWhitespace( const QString& ch ) = 0;
+ virtual bool processingInstruction( const QString& target, const QString& data ) = 0;
+ virtual bool skippedEntity( const QString& name ) = 0;
+ virtual QString errorString() = 0;
+};
+
+class QM_EXPORT QXmlErrorHandler
+{
+public:
+ virtual ~QXmlErrorHandler() {}
+ virtual bool warning( const QXmlParseException& exception ) = 0;
+ virtual bool error( const QXmlParseException& exception ) = 0;
+ virtual bool fatalError( const QXmlParseException& exception ) = 0;
+ virtual QString errorString() = 0;
+};
+
+class QM_EXPORT QXmlDTDHandler
+{
+public:
+ virtual ~QXmlDTDHandler() {}
+ virtual bool notationDecl( const QString& name, const QString& publicId, const QString& systemId ) = 0;
+ virtual bool unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName ) = 0;
+ virtual QString errorString() = 0;
+};
+
+class QM_EXPORT QXmlEntityResolver
+{
+public:
+ virtual ~QXmlEntityResolver() {}
+ virtual bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource* ret ) = 0;
+ virtual QString errorString() = 0;
+};
+
+class QM_EXPORT QXmlLexicalHandler
+{
+public:
+ virtual ~QXmlLexicalHandler() {}
+ virtual bool startDTD( const QString& name, const QString& publicId, const QString& systemId ) = 0;
+ virtual bool endDTD() = 0;
+// virtual bool startEntity( const QString& name ) = 0;
+// virtual bool endEntity( const QString& name ) = 0;
+ virtual bool startCDATA() = 0;
+ virtual bool endCDATA() = 0;
+ virtual bool comment( const QString& ch ) = 0;
+ virtual QString errorString() = 0;
+};
+
+class QM_EXPORT QXmlDeclHandler
+{
+public:
+ virtual ~QXmlDeclHandler() {}
+ virtual bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value ) = 0;
+ virtual bool internalEntityDecl( const QString& name, const QString& value ) = 0;
+ virtual bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId ) = 0;
+ virtual QString errorString() = 0;
+};
+
+
+class QM_EXPORT QXmlDefaultHandler : public QXmlContentHandler, public QXmlErrorHandler, public QXmlDTDHandler, public QXmlEntityResolver, public QXmlLexicalHandler, public QXmlDeclHandler
+{
+public:
+ QXmlDefaultHandler() { }
+ virtual ~QXmlDefaultHandler() { }
+
+ void setDocumentLocator( QXmlLocator* locator );
+ bool startDocument();
+ bool endDocument();
+ bool startPrefixMapping( const QString& prefix, const QString& uri );
+ bool endPrefixMapping( const QString& prefix );
+ bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts );
+ bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName );
+ bool characters( const QString& ch );
+ bool ignorableWhitespace( const QString& ch );
+ bool processingInstruction( const QString& target, const QString& data );
+ bool skippedEntity( const QString& name );
+
+ bool warning( const QXmlParseException& exception );
+ bool error( const QXmlParseException& exception );
+ bool fatalError( const QXmlParseException& exception );
+
+ bool notationDecl( const QString& name, const QString& publicId, const QString& systemId );
+ bool unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName );
+
+ bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource* ret );
+
+ bool startDTD( const QString& name, const QString& publicId, const QString& systemId );
+ bool endDTD();
+// bool startEntity( const QString& name );
+// bool endEntity( const QString& name );
+ bool startCDATA();
+ bool endCDATA();
+ bool comment( const QString& ch );
+
+ bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value );
+ bool internalEntityDecl( const QString& name, const QString& value );
+ bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId );
+
+ QString errorString();
+
+private:
+ QXmlDefaultHandlerPrivate *d;
+};
+
+#ifdef _WS_QWS_
+#ifdef QT_XML_CPP
+#define inline
+#else
+#define QT_NO_XML_INLINE
+#endif
+#endif
+
+#ifndef QT_NO_XML_INLINE
+//
+// inlines
+//
+
+inline bool QXmlSimpleReader::is_S(const QChar& ch)
+{ return ch==' ' || ch=='\t' || ch=='\n' || ch=='\r'; }
+
+inline bool QXmlSimpleReader::is_Letter( const QChar& ch )
+{ return ch.isLetter(); }
+
+inline bool QXmlSimpleReader::is_NameBeginning( const QChar& ch )
+{ return ch=='_' || ch==':' || ch.isLetter(); }
+
+inline bool QXmlSimpleReader::is_Digit( const QChar& ch )
+{ return ch.isDigit(); }
+
+inline bool QXmlSimpleReader::is_CombiningChar( const QChar& )
+{ return FALSE; }
+
+inline bool QXmlSimpleReader::is_Extender( const QChar& )
+{ return FALSE; }
+
+inline bool QXmlSimpleReader::is_NameChar( const QChar& ch )
+{
+ return ch=='.' || ch=='-' || ch=='_' || ch==':' ||
+ is_Letter(ch) || is_Digit(ch) ||
+ is_CombiningChar(ch) || is_Extender(ch);
+}
+
+inline void QXmlSimpleReader::next()
+{
+ if ( !xmlRef.isEmpty() ) {
+ c = xmlRef[0];
+ xmlRef.remove( 0, 1 );
+ } else {
+ if ( c=='\n' || c=='\r' ) {
+ lineNr++;
+ columnNr = -1;
+ }
+ if ( pos >= xmlLength ) {
+ c = QEOF;
+ } else {
+ c = xml[pos];
+ columnNr++;
+ pos++;
+ }
+ }
+}
+
+inline bool QXmlSimpleReader::atEnd()
+{ return c == QEOF; }
+
+inline void QXmlSimpleReader::eat_ws()
+{ while ( !atEnd() && is_S(c) ) next(); }
+
+inline void QXmlSimpleReader::next_eat_ws()
+{ next(); eat_ws(); }
+
+
+// use buffers instead of QString::operator+= when single characters are read
+inline QString& QXmlSimpleReader::string()
+{
+ stringValue += QString( stringArray, stringPos );
+ stringPos = 0;
+ return stringValue;
+}
+inline QString& QXmlSimpleReader::name()
+{
+ nameValue += QString( nameArray, namePos );
+ namePos = 0;
+ return nameValue;
+}
+inline QString& QXmlSimpleReader::ref()
+{
+ refValue += QString( refArray, refPos );
+ refPos = 0;
+ return refValue;
+}
+
+inline void QXmlSimpleReader::stringClear()
+{ stringValue = ""; stringPos = 0; }
+inline void QXmlSimpleReader::nameClear()
+{ nameValue = ""; namePos = 0; }
+inline void QXmlSimpleReader::refClear()
+{ refValue = ""; refPos = 0; }
+
+inline void QXmlSimpleReader::stringAddC()
+{
+ if ( stringPos >= 256 ) {
+ stringValue += QString( stringArray, stringPos );
+ stringPos = 0;
+ }
+ stringArray[stringPos++] = c;
+}
+inline void QXmlSimpleReader::nameAddC()
+{
+ if ( namePos >= 256 ) {
+ nameValue += QString( nameArray, namePos );
+ namePos = 0;
+ }
+ nameArray[namePos++] = c;
+}
+inline void QXmlSimpleReader::refAddC()
+{
+ if ( refPos >= 256 ) {
+ refValue += QString( refArray, refPos );
+ refPos = 0;
+ }
+ refArray[refPos++] = c;
+}
+
+inline void QXmlSimpleReader::stringAddC(const QChar& ch)
+{
+ if ( stringPos >= 256 ) {
+ stringValue += QString( stringArray, stringPos );
+ stringPos = 0;
+ }
+ stringArray[stringPos++] = ch;
+}
+inline void QXmlSimpleReader::nameAddC(const QChar& ch)
+{
+ if ( namePos >= 256 ) {
+ nameValue += QString( nameArray, namePos );
+ namePos = 0;
+ }
+ nameArray[namePos++] = ch;
+}
+inline void QXmlSimpleReader::refAddC(const QChar& ch)
+{
+ if ( refPos >= 256 ) {
+ refValue += QString( refArray, refPos );
+ refPos = 0;
+ }
+ refArray[refPos++] = ch;
+}
+#endif
+
+#ifdef _WS_QWS_
+#ifdef QT_XML_CPP
+#undef inline
+#endif
+#endif
+
+#endif //QT_NO_XML
+
+#endif
diff --git a/qtools/scstring.cpp b/qtools/scstring.cpp
new file mode 100644
index 0000000..26d3a52
--- /dev/null
+++ b/qtools/scstring.cpp
@@ -0,0 +1,798 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2004 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+// with this switch you can choose between the original qcstring implementation,
+// which implicitly shares data so copying is faster, but requires at least 12 bytes, and
+// the new implementation in this file, which has a smaller footprint (only 4 bytes for
+// an empty string), but always copies strings.
+#define SMALLSTRING
+
+#include "qcstring.h"
+#ifndef SMALLSTRING
+#include "qcstring.cpp"
+#else
+#define SCString QCString
+
+#include <qstring.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <qregexp.h>
+#include <qdatastream.h>
+
+
+SCString::SCString(int size)
+{
+ if (size>0)
+ {
+ m_data = (char *)malloc(size);
+ if (m_data)
+ {
+ if (size>1) memset(m_data,' ',size-1);
+ m_data[size-1]='\0';
+ }
+ }
+ else
+ {
+ m_data=0;
+ }
+}
+
+SCString::SCString( const SCString &s )
+{
+ duplicate(s);
+}
+
+SCString::SCString( const char *str )
+{
+ duplicate(str);
+}
+
+SCString::SCString( const char *str, uint maxlen )
+{
+ uint l;
+ if (str && ( l = QMIN(qstrlen(str),maxlen) ))
+ {
+ m_data=(char *)malloc(l+1);
+ strncpy(m_data,str,l+1);
+ m_data[l]='\0';
+ }
+ else
+ {
+ m_data=0;
+ }
+}
+
+SCString::~SCString()
+{
+ if (m_data) free(m_data);
+ m_data=0;
+}
+
+SCString &SCString::assign( const char *str )
+{
+ if (m_data==str) return *this;
+ if (m_data) free(m_data);
+ duplicate(str);
+ return *this;
+}
+
+bool SCString::resize( uint newlen )
+{
+ if (newlen==0)
+ {
+ if (m_data) { free(m_data); m_data=0; }
+ return TRUE;
+ }
+ if (m_data==0) // newlen>0
+ {
+ m_data = (char *)malloc(newlen);
+ }
+ else
+ {
+ m_data = (char *)realloc(m_data,newlen);
+ }
+ if (m_data==0) return FALSE;
+ m_data[newlen-1]='\0';
+ return TRUE;
+}
+
+bool SCString::fill( char c, int len )
+{
+ uint l=length();
+ if (len<0) len=l;
+ if ((uint)len!=l)
+ {
+ if (m_data) free(m_data);
+ if (len>0)
+ {
+ m_data=(char *)malloc(len+1);
+ if (m_data==0) return FALSE;
+ m_data[len]='\0';
+ }
+ else
+ {
+ m_data=0;
+ }
+ }
+ if (len>0)
+ {
+ uint i;
+ for (i=0;i<(uint)len;i++) m_data[i]=c;
+ }
+ return TRUE;
+}
+
+SCString &SCString::sprintf( const char *format, ... )
+{
+ va_list ap;
+ va_start( ap, format );
+ uint l = length();
+ const uint minlen=4095;
+ if (l<minlen)
+ {
+ if (m_data)
+ m_data = (char *)realloc(m_data,minlen+1);
+ else
+ m_data = (char *)malloc(minlen+1);
+ m_data[minlen]='\0';
+ }
+ vsnprintf( m_data, minlen, format, ap );
+ resize( qstrlen(m_data) + 1 ); // truncate
+ va_end( ap );
+ return *this;
+}
+
+
+int SCString::find( char c, int index, bool cs ) const
+{
+ uint len = length();
+ if ( m_data==0 || (uint)index>len ) // index outside string
+ return -1;
+ register const char *d;
+ if ( cs ) // case sensitive
+ {
+ d = strchr( m_data+index, c );
+ }
+ else
+ {
+ d = m_data+index;
+ c = tolower( (uchar) c );
+ while ( *d && tolower((uchar) *d) != c )
+ d++;
+ if ( !*d && c ) // not found
+ d = 0;
+ }
+ return d ? (int)(d - m_data) : -1;
+}
+
+int SCString::find( const char *str, int index, bool cs ) const
+{
+ uint l = length();
+ if ( m_data==0 || (uint)index > l ) // index outside string
+ return -1;
+ if ( !str ) // no search string
+ return -1;
+ if ( !*str ) // zero-length search string
+ return index;
+ register const char *d;
+ if ( cs ) // case sensitive
+ {
+ d = strstr( m_data+index, str );
+ }
+ else // case insensitive
+ {
+ d = m_data+index;
+ int len = qstrlen( str );
+ while ( *d )
+ {
+ if ( qstrnicmp(d, str, len) == 0 )
+ break;
+ d++;
+ }
+ if ( !*d ) // not found
+ d = 0;
+ }
+ return d ? (int)(d - m_data) : -1;
+}
+
+int SCString::find( const QCString &str, int index, bool cs ) const
+{
+ return find(str.data(),index,cs);
+}
+
+int SCString::find( const QRegExp &rx, int index ) const
+{
+ QString d = QString::fromLatin1( m_data );
+ return d.find( rx, index );
+}
+
+int SCString::findRev( char c, int index, bool cs) const
+{
+ const char *b = m_data;
+ const char *d;
+ uint len = length();
+ if ( b == 0 ) return -1; // empty string
+ if ( index < 0 ) // neg index ==> start from end
+ {
+ if ( len == 0 ) return -1;
+ if ( cs )
+ {
+ d = strrchr( b, c );
+ return d ? (int)(d - b) : -1;
+ }
+ index = len;
+ }
+ else if ( (uint)index > len ) // bad index
+ {
+ return -1;
+ }
+ d = b+index;
+ if ( cs ) // case sensitive
+ {
+ while ( d >= b && *d != c )
+ d--;
+ }
+ else // case insensitive
+ {
+ c = tolower( (uchar) c );
+ while ( d >= b && tolower((uchar) *d) != c )
+ d--;
+ }
+ return d >= b ? (int)(d - b) : -1;
+}
+
+int SCString::findRev( const char *str, int index, bool cs) const
+{
+ int slen = qstrlen(str);
+ uint len = length();
+ if ( index < 0 ) // neg index ==> start from end
+ index = len-slen;
+ else if ( (uint)index > len ) // bad index
+ return -1;
+ else if ( (uint)(index + slen) > len ) // str would be too long
+ index = len - slen;
+ if ( index < 0 )
+ return -1;
+
+ register char *d = m_data + index;
+ if ( cs ) // case sensitive
+ {
+ for ( int i=index; i>=0; i-- )
+ if ( qstrncmp(d--,str,slen)==0 )
+ return i;
+ }
+ else // case insensitive
+ {
+ for ( int i=index; i>=0; i-- )
+ if ( qstrnicmp(d--,str,slen)==0 )
+ return i;
+ }
+ return -1;
+
+}
+
+int SCString::findRev( const QRegExp &rx, int index ) const
+{
+ QString d = QString::fromLatin1( m_data );
+ return d.findRev( rx, index );
+}
+
+int SCString::contains( char c, bool cs ) const
+{
+ int count = 0;
+ char *d = m_data;
+ if ( !d )
+ return 0;
+ if ( cs ) // case sensitive
+ {
+ while ( *d )
+ if ( *d++ == c )
+ count++;
+ }
+ else // case insensitive
+ {
+ c = tolower( (uchar) c );
+ while ( *d ) {
+ if ( tolower((uchar) *d) == c )
+ count++;
+ d++;
+ }
+ }
+ return count;
+}
+
+int SCString::contains( const char *str, bool cs ) const
+{
+ int count = 0;
+ char *d = data();
+ if ( !d )
+ return 0;
+ int len = qstrlen( str );
+ while ( *d ) // counts overlapping strings
+ {
+ if ( cs )
+ {
+ if ( qstrncmp( d, str, len ) == 0 )
+ count++;
+ }
+ else
+ {
+ if ( qstrnicmp(d, str, len) == 0 )
+ count++;
+ }
+ d++;
+ }
+ return count;
+}
+
+int SCString::contains( const QRegExp &rx ) const
+{
+ QString d = QString::fromLatin1( m_data );
+ return d.contains( rx );
+}
+
+SCString SCString::left( uint len ) const
+{
+ if ( isEmpty() )
+ {
+ return SCString();
+ }
+ else if ( len >= length() )
+ {
+ return *this;
+ }
+ else
+ {
+ SCString s( len+1 );
+ strncpy( s.data(), m_data, len );
+ *(s.data()+len) = '\0';
+ return s;
+ }
+}
+
+SCString SCString::right( uint len ) const
+{
+ if ( isEmpty() )
+ {
+ return SCString();
+ }
+ else
+ {
+ uint l = length();
+ if ( len > l ) len = l;
+ char *p = m_data + (l - len);
+ return SCString( p );
+ }
+}
+
+SCString SCString::mid( uint index, uint len) const
+{
+ uint slen = length();
+ if ( len == 0xffffffff ) len = slen-index;
+ if ( isEmpty() || index >= slen )
+ {
+ return SCString();
+ }
+ else
+ {
+ register char *p = data()+index;
+ SCString s( len+1 );
+ strncpy( s.data(), p, len );
+ *(s.data()+len) = '\0';
+ return s;
+ }
+}
+
+SCString SCString::lower() const
+{
+ SCString s( m_data );
+ register char *p = s.data();
+ if ( p )
+ {
+ while ( *p )
+ {
+ *p = tolower((uchar) *p);
+ p++;
+ }
+ }
+ return s;
+}
+
+SCString SCString::upper() const
+{
+ SCString s( m_data );
+ register char *p = s.data();
+ if ( p ) {
+ while ( *p ) {
+ *p = toupper((uchar)*p);
+ p++;
+ }
+ }
+ return s;
+}
+
+SCString SCString::stripWhiteSpace() const
+{
+ if ( isEmpty() ) // nothing to do
+ return *this;
+
+ register char *s = m_data;
+ int reslen = length();
+ if ( !isspace((uchar) s[0]) && !isspace((uchar) s[reslen-1]) )
+ return *this; // returns a copy
+
+ SCString result(s);
+ s = result.data();
+ int start = 0;
+ int end = reslen - 1;
+ while ( isspace((uchar) s[start]) ) // skip white space from start
+ start++;
+ if ( s[start] == '\0' )
+ { // only white space
+ return SCString();
+ }
+ while ( end && isspace((uchar) s[end]) ) // skip white space from end
+ end--;
+ end -= start - 1;
+ memmove( result.data(), &s[start], end );
+ result.resize( end + 1 );
+ return result;
+}
+
+SCString SCString::simplifyWhiteSpace() const
+{
+ if ( isEmpty() ) // nothing to do
+ return *this;
+
+ SCString result( length()+1 );
+ char *from = data();
+ char *to = result.data();
+ char *first = to;
+ while ( TRUE )
+ {
+ while ( *from && isspace((uchar) *from) )
+ from++;
+ while ( *from && !isspace((uchar)*from) )
+ *to++ = *from++;
+ if ( *from )
+ *to++ = 0x20; // ' '
+ else
+ break;
+ }
+ if ( to > first && *(to-1) == 0x20 )
+ to--;
+ *to = '\0';
+ result.resize( (int)((long)to - (long)result.data()) + 1 );
+ return result;
+}
+
+SCString &SCString::insert( uint index, const char *s )
+{
+ int len = qstrlen(s);
+ if ( len == 0 )
+ return *this;
+ uint olen = length();
+ int nlen = olen + len;
+ if ( index >= olen ) // insert after end of string
+ {
+ m_data = (char *)realloc(m_data,nlen+index-olen+1);
+ if ( m_data )
+ {
+ memset( m_data+olen, ' ', index-olen );
+ memcpy( m_data+index, s, len+1 );
+ }
+ }
+ else if ( (m_data = (char *)realloc(m_data,nlen+1)) ) // normal insert
+ {
+ memmove( m_data+index+len, m_data+index, olen-index+1 );
+ memcpy( m_data+index, s, len );
+ }
+ return *this;
+}
+
+SCString &SCString::insert( uint index, char c ) // insert char
+{
+ char buf[2];
+ buf[0] = c;
+ buf[1] = '\0';
+ return insert( index, buf );
+}
+
+SCString& SCString::operator+=( const char *str )
+{
+ if ( !str ) return *this; // nothing to append
+ uint len1 = length();
+ uint len2 = qstrlen(str);
+ char *newData = (char *)realloc( m_data, len1 + len2 + 1 );
+ if (newData)
+ {
+ m_data = newData;
+ memcpy( m_data + len1, str, len2 + 1 );
+ }
+ return *this;
+}
+
+SCString &SCString::operator+=( char c )
+{
+ uint len = length();
+ char *newData = (char *)realloc( m_data, length()+2 );
+ if (newData)
+ {
+ m_data = newData;
+ m_data[len] = c;
+ m_data[len+1] = '\0';
+ }
+ return *this;
+}
+
+SCString &SCString::remove( uint index, uint len )
+{
+ uint olen = length();
+ if ( index + len >= olen ) // range problems
+ {
+ if ( index < olen ) // index ok
+ {
+ resize( index+1 );
+ }
+ }
+ else if ( len != 0 )
+ {
+ memmove( m_data+index, m_data+index+len, olen-index-len+1 );
+ resize( olen-len+1 );
+ }
+ return *this;
+}
+
+SCString &SCString::replace( uint index, uint len, const char *s )
+{
+ remove( index, len );
+ insert( index, s );
+ return *this;
+}
+
+SCString &SCString::replace( const QRegExp &rx, const char *str )
+{
+ QString d = QString::fromLatin1( m_data );
+ QString r = QString::fromLatin1( str );
+ d.replace( rx, r );
+ return assign(d.ascii());
+}
+
+long SCString::toLong( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toLong(ok);
+}
+
+ulong SCString::toULong( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toULong(ok);
+}
+
+short SCString::toShort( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toShort(ok);
+}
+
+ushort SCString::toUShort( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toUShort(ok);
+}
+
+int SCString::toInt( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toInt(ok);
+}
+
+uint SCString::toUInt( bool *ok ) const
+{
+ QString s(m_data);
+ return s.toUInt(ok);
+}
+
+SCString &SCString::setNum( long n )
+{
+ char buf[20];
+ register char *p = &buf[19];
+ bool neg;
+ if ( n < 0 )
+ {
+ neg = TRUE;
+ n = -n;
+ }
+ else
+ {
+ neg = FALSE;
+ }
+ *p = '\0';
+ do
+ {
+ *--p = ((int)(n%10)) + '0';
+ n /= 10;
+ } while ( n );
+ if ( neg ) *--p = '-';
+ operator=( p );
+ return *this;
+}
+
+SCString &SCString::setNum( ulong n )
+{
+ char buf[20];
+ register char *p = &buf[19];
+ *p = '\0';
+ do
+ {
+ *--p = ((int)(n%10)) + '0';
+ n /= 10;
+ } while ( n );
+ operator=( p );
+ return *this;
+}
+
+void SCString::msg_index( uint index )
+{
+#if defined(CHECK_RANGE)
+ qWarning( "SCString::at: Absolute index %d out of range", index );
+#else
+ Q_UNUSED( index )
+#endif
+}
+
+bool SCString::stripPrefix(const char *prefix)
+{
+ if (prefix==0) return FALSE;
+ uint plen = qstrlen(prefix);
+ if (m_data && qstrncmp(prefix,m_data,plen)==0) // prefix matches
+ {
+ uint len = qstrlen(m_data);
+ uint newlen = len-plen+1;
+ qmemmove(m_data,m_data+plen,newlen);
+ resize(newlen);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//---------------------------------------------------------------------------
+
+void *qmemmove( void *dst, const void *src, uint len )
+{
+ register char *d;
+ register char *s;
+ if ( dst > src ) {
+ d = (char *)dst + len - 1;
+ s = (char *)src + len - 1;
+ while ( len-- )
+ *d-- = *s--;
+ } else if ( dst < src ) {
+ d = (char *)dst;
+ s = (char *)src;
+ while ( len-- )
+ *d++ = *s++;
+ }
+ return dst;
+}
+
+char *qstrdup( const char *str )
+{
+ if ( !str )
+ return 0;
+ char *dst = new char[strlen(str)+1];
+ CHECK_PTR( dst );
+ return strcpy( dst, str );
+}
+
+char *qstrncpy( char *dst, const char *src, uint len )
+{
+ if ( !src )
+ return 0;
+ strncpy( dst, src, len );
+ if ( len > 0 )
+ dst[len-1] = '\0';
+ return dst;
+}
+
+int qstricmp( const char *str1, const char *str2 )
+{
+ register const uchar *s1 = (const uchar *)str1;
+ register const uchar *s2 = (const uchar *)str2;
+ int res;
+ uchar c;
+ if ( !s1 || !s2 )
+ return s1 == s2 ? 0 : (int)((long)s2 - (long)s1);
+ for ( ; !(res = (c=tolower(*s1)) - tolower(*s2)); s1++, s2++ )
+ if ( !c ) // strings are equal
+ break;
+ return res;
+}
+
+int qstrnicmp( const char *str1, const char *str2, uint len )
+{
+ register const uchar *s1 = (const uchar *)str1;
+ register const uchar *s2 = (const uchar *)str2;
+ int res;
+ uchar c;
+ if ( !s1 || !s2 )
+ return (int)((long)s2 - (long)s1);
+ for ( ; len--; s1++, s2++ ) {
+ if ( (res = (c=tolower(*s1)) - tolower(*s2)) )
+ return res;
+ if ( !c ) // strings are equal
+ break;
+ }
+ return 0;
+}
+
+#ifndef QT_NO_DATASTREAM
+
+QDataStream &operator<<( QDataStream &s, const QByteArray &a )
+{
+ return s.writeBytes( a.data(), a.size() );
+}
+
+QDataStream &operator>>( QDataStream &s, QByteArray &a )
+{
+ Q_UINT32 len;
+ s >> len; // read size of array
+ if ( len == 0 || s.eof() ) { // end of file reached
+ a.resize( 0 );
+ return s;
+ }
+ if ( !a.resize( (uint)len ) ) { // resize array
+#if defined(CHECK_NULL)
+ qWarning( "QDataStream: Not enough memory to read QByteArray" );
+#endif
+ len = 0;
+ }
+ if ( len > 0 ) // not null array
+ s.readRawBytes( a.data(), (uint)len );
+ return s;
+}
+
+QDataStream &operator<<( QDataStream &s, const SCString &str )
+{
+ return s.writeBytes( str.data(), str.size() );
+}
+
+QDataStream &operator>>( QDataStream &s, SCString &str )
+{
+ Q_UINT32 len;
+ s >> len; // read size of string
+ if ( len == 0 || s.eof() ) { // end of file reached
+ str.resize( 0 );
+ return s;
+ }
+ if ( !str.resize( (uint)len )) {// resize string
+#if defined(CHECK_NULL)
+ qWarning( "QDataStream: Not enough memory to read QCString" );
+#endif
+ len = 0;
+ }
+ if ( len > 0 ) // not null array
+ s.readRawBytes( str.data(), (uint)len );
+ return s;
+}
+
+#endif //QT_NO_DATASTREAM
+
+
+
+#endif
diff --git a/qtools/scstring.h b/qtools/scstring.h
new file mode 100644
index 0000000..a9b462c
--- /dev/null
+++ b/qtools/scstring.h
@@ -0,0 +1,155 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2004 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SCSTRING_H
+#define SCSTRING_H
+
+#include <stdlib.h>
+
+class QRegExp;
+
+/** This is an alternative implementation of QCString. It provides basically
+ * the same functions but uses less memory for administration. This class
+ * is just a wrapper around a plain C string requiring only 4 bytes "overhead".
+ * QCString features sharing of data and stores the string length, but
+ * requires 4 + 12 bytes for this (even for the empty string). As doxygen
+ * uses a LOT of string during a run it saves a lot of memory to use a
+ * more memory efficient implementation at the cost of relatively low
+ * runtime overhead.
+ */
+class SCString
+{
+public:
+ SCString() : m_data(0) {} // make null string
+ SCString( const SCString &s );
+ SCString( int size );
+ SCString( const char *str );
+ SCString( const char *str, uint maxlen );
+ ~SCString();
+
+ SCString &operator=( const SCString &s );// deep copy
+ SCString &operator=( const char *str ); // deep copy
+
+ bool isNull() const;
+ bool isEmpty() const;
+ uint length() const;
+ uint size() const { return m_data ? length()+1 : 0; }
+ char * data() const { return m_data; }
+ bool resize( uint newlen );
+ bool truncate( uint pos );
+ bool fill( char c, int len = -1 );
+
+ SCString copy() const;
+
+ SCString &sprintf( const char *format, ... );
+
+ int find( char c, int index=0, bool cs=TRUE ) const;
+ int find( const char *str, int index=0, bool cs=TRUE ) const;
+ int find( const QRegExp &, int index=0 ) const;
+ int find( const QCString &str, int index, bool cs ) const;
+ int findRev( char c, int index=-1, bool cs=TRUE) const;
+ int findRev( const char *str, int index=-1, bool cs=TRUE) const;
+ int findRev( const QRegExp &, int index=-1 ) const;
+ int contains( char c, bool cs=TRUE ) const;
+ int contains( const char *str, bool cs=TRUE ) const;
+ int contains( const QRegExp & ) const;
+ bool stripPrefix(const char *prefix);
+
+ SCString left( uint len ) const;
+ SCString right( uint len ) const;
+ SCString mid( uint index, uint len=0xffffffff) const;
+
+ SCString lower() const;
+ SCString upper() const;
+
+ SCString stripWhiteSpace() const;
+ SCString simplifyWhiteSpace() const;
+
+ SCString &assign( const char *str );
+ SCString &insert( uint index, const char * );
+ SCString &insert( uint index, char );
+ SCString &append( const char *s );
+ SCString &prepend( const char *s );
+ SCString &remove( uint index, uint len );
+ SCString &replace( uint index, uint len, const char * );
+ SCString &replace( const QRegExp &, const char * );
+
+ short toShort( bool *ok=0 ) const;
+ ushort toUShort( bool *ok=0 ) const;
+ int toInt( bool *ok=0 ) const;
+ uint toUInt( bool *ok=0 ) const;
+ long toLong( bool *ok=0 ) const;
+ ulong toULong( bool *ok=0 ) const;
+
+ SCString &setNum( short );
+ SCString &setNum( ushort );
+ SCString &setNum( int );
+ SCString &setNum( uint );
+ SCString &setNum( long );
+ SCString &setNum( ulong );
+ QCString &setNum( float, char f='g', int prec=6 );
+ QCString &setNum( double, char f='g', int prec=6 );
+
+ operator const char *() const;
+ SCString &operator+=( const char *str );
+ SCString &operator+=( char c );
+ char &at( uint index ) const;
+ char &operator[]( int i ) const { return at(i); }
+
+ private:
+ static void msg_index( uint );
+ void duplicate( const SCString &s );
+ void duplicate( const char *str);
+ SCString &duplicate( const char *str, int);
+
+ char * m_data;
+};
+
+inline char &SCString::at( uint index ) const
+{
+ return m_data[index];
+}
+
+inline void SCString::duplicate( const SCString &s )
+{
+ if (!s.isEmpty())
+ {
+ uint l = strlen(s.data());
+ m_data = (char *)malloc(l+1);
+ if (m_data) memcpy(m_data,s.data(),l+1);
+ }
+ else
+ m_data=0;
+}
+inline void SCString::duplicate( const char *str)
+{
+ if (str && str[0]!='\0')
+ {
+ uint l = strlen(str);
+ m_data = (char *)malloc(l+1);
+ if (m_data) memcpy(m_data,str,l+1);
+ }
+ else
+ m_data=0;
+}
+inline SCString &SCString::duplicate( const char *str, int)
+{
+ if (m_data) free(m_data);
+ duplicate(str);
+ return *this;
+}
+
+#endif
+
diff --git a/src/Makefile b/src/Makefile
new file mode 100644
index 0000000..bd2fef7
--- /dev/null
+++ b/src/Makefile
@@ -0,0 +1,74 @@
+#
+# This file was generated from Makefile.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+DOXYGEN = /Users/dimitri/doxygen
+TMAKEPATH = /Users/dimitri/doxygen/tmake/lib/macosx-c++
+ENV = env TMAKEPATH=$(TMAKEPATH)
+TMAKE = /Users/dimitri/doxygen/tmake/bin/tmake
+MAKE = /opt/local/bin/gmake
+PERL = /opt/local/bin/perl
+RM = rm -f
+CP = cp
+VERSION = 1.7.3
+INSTALL = /usr/local
+INSTTOOL = /opt/local/bin/ginstall
+DOXYDOCS = ..
+DOCDIR = $(INSTALL)/share/doc/packages/doxygen
+QTDIR = /usr
+HAVE_DOT = /usr/local/bin/dot
+MKSPECS = -spec macx-g++
+
+#
+# $Id: Makefile.in,v 1.4 2001/03/19 19:27:39 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+
+all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag Makefile
+ $(MAKE) -f Makefile.libdoxycfg PERL=$(PERL) $@
+ $(MAKE) -f Makefile.libdoxygen PERL=$(PERL) $@
+ $(MAKE) -f Makefile.doxygen PERL=$(PERL) $@
+ $(MAKE) -f Makefile.doxytag PERL=$(PERL) $@
+
+Makefile.libdoxygen: libdoxygen.pro libdoxygen.t
+ $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
+
+Makefile.libdoxycfg: libdoxycfg.pro libdoxycfg.t
+ $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
+
+Makefile.doxygen: doxygen.pro
+ $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
+
+Makefile.doxytag: doxytag.pro doxytag.t
+ $(ENV) $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
+ $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
+ $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
+ $(ENV) $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag
+
+clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag
+ $(MAKE) -f Makefile.libdoxygen clean
+ $(MAKE) -f Makefile.libdoxycfg clean
+ $(MAKE) -f Makefile.doxygen clean
+ $(MAKE) -f Makefile.doxytag clean
+
+distclean: clean
+ -$(RM) scanner.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \
+ ce_parse.cpp ce_parse.h doxytag.cpp tag.cpp commentscan.cpp \
+ declinfo.cpp defargs.cpp commentcnv.cpp doctokenizer.cpp \
+ pycode.cpp pyscanner.cpp fortrancode.cpp fortranscanner.cpp \
+ vhdlscanner.cpp vhdlcode.cpp
+
+FORCE:
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..77ce664
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,54 @@
+
+#
+# $Id: Makefile.in,v 1.4 2001/03/19 19:27:39 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+
+all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag Makefile
+ $(MAKE) -f Makefile.libdoxycfg PERL=$(PERL) $@
+ $(MAKE) -f Makefile.libdoxygen PERL=$(PERL) $@
+ $(MAKE) -f Makefile.doxygen PERL=$(PERL) $@
+ $(MAKE) -f Makefile.doxytag PERL=$(PERL) $@
+
+Makefile.libdoxygen: libdoxygen.pro libdoxygen.t
+ $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
+
+Makefile.libdoxycfg: libdoxycfg.pro libdoxycfg.t
+ $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
+
+Makefile.doxygen: doxygen.pro
+ $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
+
+Makefile.doxytag: doxytag.pro doxytag.t
+ $(ENV) $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag
+
+tmake:
+ $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
+ $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
+ $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
+ $(ENV) $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag
+
+clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag
+ $(MAKE) -f Makefile.libdoxygen clean
+ $(MAKE) -f Makefile.libdoxycfg clean
+ $(MAKE) -f Makefile.doxygen clean
+ $(MAKE) -f Makefile.doxytag clean
+
+distclean: clean
+ -$(RM) scanner.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \
+ ce_parse.cpp ce_parse.h doxytag.cpp tag.cpp commentscan.cpp \
+ declinfo.cpp defargs.cpp commentcnv.cpp doctokenizer.cpp \
+ pycode.cpp pyscanner.cpp fortrancode.cpp fortranscanner.cpp \
+ vhdlscanner.cpp vhdlcode.cpp
+
+FORCE:
diff --git a/src/Makefile.libdoxycfg b/src/Makefile.libdoxycfg
new file mode 100644
index 0000000..f0cb073
--- /dev/null
+++ b/src/Makefile.libdoxycfg
@@ -0,0 +1,147 @@
+#
+# $Id: libdoxycfg.t,v 1.1 2001/03/19 19:27:41 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#############################################################################
+# Makefile for building ../lib/libdoxycfg.a
+# Generated by tmake at 15:10, 2011/03/28
+# Project: libdoxycfg
+# Template: libdoxycfg.t
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cc
+CXX = c++
+CFLAGS = -pipe -Wall -W -g -fstack-protector
+CXXFLAGS= -pipe -D__FreeBSD__=6 -Wall -W -g -fstack-protector
+INCPATH = -I../qtools
+AR = ar cq
+RANLIB = ranlib
+MOC = /usr/bin/moc
+
+TAR = tar -cf
+GZIP = gzip -9f
+
+####### Files
+
+HEADERS = config.h \
+ configoptions.h \
+ portable.h
+SOURCES = config.cpp \
+ configoptions.cpp \
+ portable.cpp \
+ portable_c.c
+OBJECTS = ../objects/config.o \
+ ../objects/configoptions.o \
+ ../objects/portable.o \
+ ../objects/portable_c.o
+SRCMOC =
+OBJMOC =
+DIST =
+TARGET = ../lib/libdoxycfg.a
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .C .c
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+####### Build rules
+
+all: $(TARGET)
+
+staticlib: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(OBJMOC)
+ -rm -f $(TARGET)
+ $(AR) $(TARGET) $(OBJECTS) $(OBJMOC)
+ ranlib $(TARGET)
+
+moc: $(SRCMOC)
+
+tmake:
+ tmake libdoxycfg.pro
+
+dist:
+ $(TAR) libdoxycfg.tar libdoxycfg.pro $(SOURCES) $(HEADERS) $(DIST)
+ $(GZIP) libdoxycfg.tar
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
+ -rm -f *~ core
+
+####### Compile
+
+../objects/config.o: config.cpp \
+ config.h \
+ qtbc.h \
+ ftextstream.h \
+ version.h \
+ portable.h \
+ util.h \
+ sortdict.h \
+ lang_cfg.h \
+ configoptions.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/config.o config.cpp
+
+../objects/configoptions.o: configoptions.cpp \
+ configoptions.h \
+ config.h \
+ qtbc.h \
+ ftextstream.h \
+ portable.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/configoptions.o configoptions.cpp
+
+../objects/portable.o: portable.cpp \
+ portable.h \
+ debug.h
+ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ../objects/portable.o portable.cpp
+
+../objects/portable_c.o: portable_c.c
+ $(CC) -c $(CFLAGS) $(INCPATH) -o ../objects/portable_c.o portable_c.c
+
+
+LEX = flex
+YACC = bison
+
+
+####################
+
+config.cpp: config.l \
+ config.h \
+ qtbc.h \
+ ftextstream.h \
+ version.h \
+ portable.h \
+ util.h \
+ sortdict.h \
+ lang_cfg.h \
+ configoptions.h
+ $(LEX) -PconfigYY -t config.l >config.cpp
+
+configoptions.cpp: config.xml
+ python configgen.py config.xml >configoptions.cpp
+
diff --git a/src/bufstr.h b/src/bufstr.h
new file mode 100644
index 0000000..76f31b9
--- /dev/null
+++ b/src/bufstr.h
@@ -0,0 +1,118 @@
+/******************************************************************************
+ *
+ * $Id: bufstr.h,v 1.85 2000/11/18 12:58:19 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#ifndef _BUFSTR_H
+#define _BUFSTR_H
+
+#include "qtbc.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+/*! @brief Buffer used to store strings
+ *
+ * This buffer is used append characters and strings. It will automatically
+ * resize itself, yet provide efficient random access to the content.
+ */
+class BufStr
+{
+ public:
+ BufStr(int size)
+ : m_size(size), m_writeOffset(0), m_spareRoom(10240), m_buf(0)
+ {
+ m_buf = (char *)malloc(size);
+ }
+ ~BufStr()
+ {
+ free(m_buf);
+ }
+ void addChar(char c)
+ {
+ makeRoomFor(1);
+ m_buf[m_writeOffset++]=c;
+ }
+ void addArray(const char *a,int len)
+ {
+ makeRoomFor(len);
+ memcpy(m_buf+m_writeOffset,a,len);
+ m_writeOffset+=len;
+ }
+ void skip(uint s)
+ {
+ makeRoomFor(s);
+ m_writeOffset+=s;
+ }
+ void shrink( uint newlen )
+ {
+ m_writeOffset=newlen;
+ resize(newlen);
+ }
+ void resize( uint newlen )
+ {
+ m_size=newlen;
+ if (m_writeOffset>=m_size) // offset out of range -> enlarge
+ {
+ m_size=m_writeOffset+m_spareRoom;
+ }
+ m_buf = (char *)realloc(m_buf,m_size);
+ }
+ int size() const
+ {
+ return m_size;
+ }
+ char *data() const
+ {
+ return m_buf;
+ }
+ char &at(uint i) const
+ {
+ return m_buf[i];
+ }
+ bool isEmpty() const
+ {
+ return m_writeOffset==0;
+ }
+ operator const char *() const
+ {
+ return m_buf;
+ }
+ uint curPos() const
+ {
+ return m_writeOffset;
+ }
+ void dropFromStart(uint bytes)
+ {
+ if (bytes>m_size) bytes=m_size;
+ if (bytes>0) qmemmove(m_buf,m_buf+bytes,m_size-bytes);
+ m_size-=bytes;
+ m_writeOffset-=bytes;
+ }
+ private:
+ void makeRoomFor(uint size)
+ {
+ if (m_writeOffset+size>=m_size)
+ {
+ resize(m_size+size+m_spareRoom);
+ }
+ }
+ uint m_size;
+ uint m_writeOffset;
+ const int m_spareRoom; // 10Kb extra room to avoid frequent resizing
+ char *m_buf;
+};
+
+
+#endif
diff --git a/src/ce_lex.cpp b/src/ce_lex.cpp
new file mode 100644
index 0000000..3e39ab7
--- /dev/null
+++ b/src/ce_lex.cpp
@@ -0,0 +1,2005 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer cppExpYY_create_buffer
+#define yy_delete_buffer cppExpYY_delete_buffer
+#define yy_flex_debug cppExpYY_flex_debug
+#define yy_init_buffer cppExpYY_init_buffer
+#define yy_flush_buffer cppExpYY_flush_buffer
+#define yy_load_buffer_state cppExpYY_load_buffer_state
+#define yy_switch_to_buffer cppExpYY_switch_to_buffer
+#define yyin cppExpYYin
+#define yyleng cppExpYYleng
+#define yylex cppExpYYlex
+#define yylineno cppExpYYlineno
+#define yyout cppExpYYout
+#define yyrestart cppExpYYrestart
+#define yytext cppExpYYtext
+#define yywrap cppExpYYwrap
+#define yyalloc cppExpYYalloc
+#define yyrealloc cppExpYYrealloc
+#define yyfree cppExpYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE cppExpYYrestart(cppExpYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t cppExpYYleng;
+
+extern FILE *cppExpYYin, *cppExpYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up cppExpYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up cppExpYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via cppExpYYrestart()), so that the user can continue scanning by
+ * just pointing cppExpYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when cppExpYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t cppExpYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow cppExpYYwrap()'s to do buffer switches
+ * instead of setting up a fresh cppExpYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void cppExpYYrestart (FILE *input_file );
+void cppExpYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE cppExpYY_create_buffer (FILE *file,int size );
+void cppExpYY_delete_buffer (YY_BUFFER_STATE b );
+void cppExpYY_flush_buffer (YY_BUFFER_STATE b );
+void cppExpYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void cppExpYYpop_buffer_state (void );
+
+static void cppExpYYensure_buffer_stack (void );
+static void cppExpYY_load_buffer_state (void );
+static void cppExpYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER cppExpYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE cppExpYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE cppExpYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE cppExpYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *cppExpYYalloc (yy_size_t );
+void *cppExpYYrealloc (void *,yy_size_t );
+void cppExpYYfree (void * );
+
+#define yy_new_buffer cppExpYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ cppExpYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ cppExpYY_create_buffer(cppExpYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ cppExpYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ cppExpYY_create_buffer(cppExpYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+typedef unsigned char YY_CHAR;
+
+FILE *cppExpYYin = (FILE *) 0, *cppExpYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int cppExpYYlineno;
+
+int cppExpYYlineno = 1;
+
+extern char *cppExpYYtext;
+#define yytext_ptr cppExpYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up cppExpYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ cppExpYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 33
+#define YY_END_OF_BUFFER 34
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_accept[77] =
+ { 0,
+ 0, 0, 34, 31, 32, 22, 20, 7, 31, 23,
+ 24, 18, 16, 17, 31, 19, 26, 27, 2, 10,
+ 31, 11, 1, 6, 5, 21, 8, 4, 0, 0,
+ 29, 29, 26, 0, 0, 26, 26, 0, 27, 27,
+ 27, 14, 12, 9, 13, 15, 3, 25, 0, 0,
+ 0, 0, 29, 29, 0, 30, 26, 26, 26, 28,
+ 27, 27, 27, 0, 0, 29, 30, 26, 28, 28,
+ 27, 28, 28, 28, 28, 0
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ 1, 1, 3, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 4, 5, 1, 1, 6, 7, 8, 9,
+ 10, 11, 12, 1, 13, 14, 15, 16, 17, 17,
+ 17, 17, 17, 17, 17, 18, 18, 19, 1, 20,
+ 21, 22, 23, 1, 24, 24, 24, 24, 25, 26,
+ 1, 1, 1, 1, 1, 27, 1, 1, 1, 1,
+ 1, 1, 1, 1, 28, 1, 1, 29, 1, 1,
+ 1, 30, 1, 31, 1, 1, 32, 32, 24, 24,
+
+ 25, 33, 1, 1, 1, 1, 1, 27, 1, 5,
+ 1, 1, 1, 5, 1, 5, 28, 5, 1, 34,
+ 1, 1, 1, 35, 1, 36, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[37] =
+ { 0,
+ 1, 2, 2, 1, 1, 1, 1, 2, 1, 1,
+ 1, 1, 1, 1, 1, 3, 3, 3, 1, 1,
+ 1, 1, 1, 3, 3, 3, 1, 1, 1, 1,
+ 1, 3, 3, 1, 1, 1
+ } ;
+
+static yyconst flex_int16_t yy_base[80] =
+ { 0,
+ 0, 0, 145, 163, 163, 119, 163, 132, 108, 163,
+ 163, 163, 163, 163, 21, 163, 26, 47, 163, 25,
+ 116, 26, 163, 163, 101, 163, 163, 163, 41, 71,
+ 90, 40, 33, 52, 68, 55, 106, 0, 0, 63,
+ 105, 163, 163, 163, 163, 163, 163, 163, 123, 94,
+ 0, 80, 163, 0, 102, 108, 102, 163, 82, 86,
+ 71, 163, 68, 70, 111, 126, 163, 163, 94, 46,
+ 163, 31, 163, 25, 163, 163, 159, 47, 38
+ } ;
+
+static yyconst flex_int16_t yy_def[80] =
+ { 0,
+ 76, 1, 76, 76, 76, 76, 76, 76, 77, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 77, 76,
+ 76, 31, 17, 76, 76, 76, 76, 78, 18, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+ 79, 76, 76, 32, 76, 76, 76, 76, 76, 78,
+ 76, 76, 76, 79, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 0, 76, 76, 76
+ } ;
+
+static yyconst flex_int16_t yy_nxt[200] =
+ { 0,
+ 4, 5, 4, 6, 4, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 18, 19, 20,
+ 21, 22, 23, 4, 4, 4, 4, 4, 4, 4,
+ 24, 4, 4, 4, 25, 26, 31, 31, 31, 32,
+ 64, 33, 33, 34, 42, 43, 45, 46, 48, 60,
+ 35, 75, 36, 37, 38, 54, 54, 54, 73, 38,
+ 32, 76, 39, 39, 39, 32, 76, 34, 34, 34,
+ 76, 35, 74, 40, 41, 49, 35, 48, 49, 55,
+ 55, 57, 58, 56, 56, 56, 50, 50, 50, 61,
+ 62, 65, 65, 49, 71, 66, 66, 66, 62, 51,
+
+ 49, 48, 49, 49, 51, 31, 31, 31, 68, 50,
+ 50, 50, 69, 70, 52, 53, 53, 56, 56, 56,
+ 72, 73, 53, 56, 56, 56, 66, 66, 66, 58,
+ 48, 63, 59, 67, 67, 47, 44, 30, 28, 27,
+ 67, 66, 66, 66, 76, 76, 76, 76, 76, 76,
+ 76, 53, 53, 76, 76, 76, 76, 76, 53, 29,
+ 76, 29, 3, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76
+
+ } ;
+
+static yyconst flex_int16_t yy_chk[200] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 15, 15, 15, 17,
+ 79, 17, 17, 17, 20, 20, 22, 22, 29, 78,
+ 17, 74, 17, 17, 17, 32, 32, 32, 72, 17,
+ 18, 33, 18, 18, 18, 34, 33, 34, 34, 34,
+ 29, 18, 70, 18, 18, 30, 34, 64, 30, 35,
+ 35, 36, 36, 35, 35, 35, 30, 30, 30, 40,
+ 40, 52, 52, 30, 63, 52, 52, 52, 61, 30,
+
+ 30, 50, 30, 30, 30, 31, 31, 31, 59, 50,
+ 50, 50, 60, 60, 31, 31, 31, 55, 55, 55,
+ 69, 69, 31, 56, 56, 56, 65, 65, 65, 57,
+ 49, 41, 37, 56, 56, 25, 21, 9, 8, 6,
+ 56, 66, 66, 66, 3, 0, 0, 0, 0, 0,
+ 0, 66, 66, 0, 0, 0, 0, 0, 66, 77,
+ 0, 77, 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76, 76
+
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int cppExpYY_flex_debug;
+int cppExpYY_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *cppExpYYtext;
+#line 1 "constexp.l"
+/******************************************************************************
+ *
+ * $Id: constexp.l,v 1.11 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#line 20 "constexp.l"
+
+#include "constexp.h"
+#include "cppvalue.h"
+#include "ce_parse.h" // generated header file
+
+#define YY_NEVER_INTERACTIVE 1
+
+QCString g_strToken;
+CPPValue g_resultValue;
+int g_constExpLineNr;
+QCString g_constExpFileName;
+
+static const char *g_inputString;
+static int g_inputPosition;
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+#line 581 "<stdout>"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int cppExpYYlex_destroy (void );
+
+int cppExpYYget_debug (void );
+
+void cppExpYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE cppExpYYget_extra (void );
+
+void cppExpYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *cppExpYYget_in (void );
+
+void cppExpYYset_in (FILE * in_str );
+
+FILE *cppExpYYget_out (void );
+
+void cppExpYYset_out (FILE * out_str );
+
+yy_size_t cppExpYYget_leng (void );
+
+char *cppExpYYget_text (void );
+
+int cppExpYYget_lineno (void );
+
+void cppExpYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int cppExpYYwrap (void );
+#else
+extern int cppExpYYwrap (void );
+#endif
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( cppExpYYtext, cppExpYYleng, 1, cppExpYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( cppExpYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( cppExpYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, cppExpYYin))==0 && ferror(cppExpYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(cppExpYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int cppExpYYlex (void);
+
+#define YY_DECL int cppExpYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after cppExpYYtext and cppExpYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 55 "constexp.l"
+
+
+#line 764 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! cppExpYYin )
+ cppExpYYin = stdin;
+
+ if ( ! cppExpYYout )
+ cppExpYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ cppExpYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ cppExpYY_create_buffer(cppExpYYin,YY_BUF_SIZE );
+ }
+
+ cppExpYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of cppExpYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 77 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 163 );
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+ if ( yy_act == 0 )
+ { /* have to back up */
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ yy_act = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 57 "constexp.l"
+{ return TOK_QUESTIONMARK; }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 58 "constexp.l"
+{ return TOK_COLON; }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 59 "constexp.l"
+{ return TOK_OR; }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 60 "constexp.l"
+{ return TOK_AND; }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 61 "constexp.l"
+{ return TOK_BITWISEOR; }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 62 "constexp.l"
+{ return TOK_BITWISEXOR; }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 63 "constexp.l"
+{ return TOK_AMPERSAND; }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 64 "constexp.l"
+{ return TOK_NOTEQUAL; }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 65 "constexp.l"
+{ return TOK_EQUAL; }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 66 "constexp.l"
+{ return TOK_LESSTHAN; }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 67 "constexp.l"
+{ return TOK_GREATERTHAN; }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 68 "constexp.l"
+{ return TOK_LESSTHANOREQUALTO; }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 69 "constexp.l"
+{ return TOK_GREATERTHANOREQUALTO; }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 70 "constexp.l"
+{ return TOK_SHIFTLEFT; }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 71 "constexp.l"
+{ return TOK_SHIFTRIGHT; }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 72 "constexp.l"
+{ return TOK_PLUS; }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 73 "constexp.l"
+{ return TOK_MINUS; }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 74 "constexp.l"
+{ return TOK_STAR; }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 75 "constexp.l"
+{ return TOK_DIVIDE; }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 76 "constexp.l"
+{ return TOK_MOD; }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 77 "constexp.l"
+{ return TOK_TILDE; }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 78 "constexp.l"
+{ return TOK_NOT; }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 79 "constexp.l"
+{ return TOK_LPAREN; }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 80 "constexp.l"
+{ return TOK_RPAREN; }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 81 "constexp.l"
+{
+ g_strToken=cppExpYYtext;
+ return TOK_CHARACTER;
+ }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 85 "constexp.l"
+{ g_strToken=cppExpYYtext;
+ return TOK_OCTALINT;
+ }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 88 "constexp.l"
+{ g_strToken=cppExpYYtext;
+ return TOK_DECIMALINT;
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 91 "constexp.l"
+{ g_strToken=cppExpYYtext+2;
+ return TOK_HEXADECIMALINT;
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 94 "constexp.l"
+{
+ g_strToken=cppExpYYtext; return TOK_FLOAT;
+ }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 97 "constexp.l"
+{
+ g_strToken=cppExpYYtext; return TOK_FLOAT;
+ }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 100 "constexp.l"
+
+ YY_BREAK
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 101 "constexp.l"
+
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 103 "constexp.l"
+ECHO;
+ YY_BREAK
+#line 1026 "<stdout>"
+case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed cppExpYYin at a new source and called
+ * cppExpYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = cppExpYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( cppExpYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * cppExpYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of cppExpYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ yy_size_t new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ cppExpYYrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ cppExpYYrestart(cppExpYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) cppExpYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 77 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+ register char *yy_cp = (yy_c_buf_p);
+
+ register YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 77 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 76);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ cppExpYYrestart(cppExpYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( cppExpYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve cppExpYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void cppExpYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ cppExpYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ cppExpYY_create_buffer(cppExpYYin,YY_BUF_SIZE );
+ }
+
+ cppExpYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ cppExpYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void cppExpYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * cppExpYYpop_buffer_state();
+ * cppExpYYpush_buffer_state(new_buffer);
+ */
+ cppExpYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ cppExpYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (cppExpYYwrap()) processing, but the only time this flag
+ * is looked at is after cppExpYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void cppExpYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ cppExpYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE cppExpYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) cppExpYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in cppExpYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) cppExpYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in cppExpYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ cppExpYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with cppExpYY_create_buffer()
+ *
+ */
+ void cppExpYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ cppExpYYfree((void *) b->yy_ch_buf );
+
+ cppExpYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a cppExpYYrestart() or at EOF.
+ */
+ static void cppExpYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ cppExpYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then cppExpYY_init_buffer was _probably_
+ * called from cppExpYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void cppExpYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ cppExpYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void cppExpYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ cppExpYYensure_buffer_stack();
+
+ /* This block is copied from cppExpYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from cppExpYY_switch_to_buffer. */
+ cppExpYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void cppExpYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ cppExpYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ cppExpYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void cppExpYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)cppExpYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in cppExpYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)cppExpYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in cppExpYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE cppExpYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) cppExpYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in cppExpYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ cppExpYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to cppExpYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * cppExpYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE cppExpYY_scan_string (yyconst char * yystr )
+{
+
+ return cppExpYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to cppExpYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE cppExpYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) cppExpYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in cppExpYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = cppExpYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in cppExpYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up cppExpYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ cppExpYYtext[cppExpYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = cppExpYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ cppExpYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int cppExpYYget_lineno (void)
+{
+
+ return cppExpYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *cppExpYYget_in (void)
+{
+ return cppExpYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *cppExpYYget_out (void)
+{
+ return cppExpYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t cppExpYYget_leng (void)
+{
+ return cppExpYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *cppExpYYget_text (void)
+{
+ return cppExpYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void cppExpYYset_lineno (int line_number )
+{
+
+ cppExpYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see cppExpYY_switch_to_buffer
+ */
+void cppExpYYset_in (FILE * in_str )
+{
+ cppExpYYin = in_str ;
+}
+
+void cppExpYYset_out (FILE * out_str )
+{
+ cppExpYYout = out_str ;
+}
+
+int cppExpYYget_debug (void)
+{
+ return cppExpYY_flex_debug;
+}
+
+void cppExpYYset_debug (int bdebug )
+{
+ cppExpYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from cppExpYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ cppExpYYin = stdin;
+ cppExpYYout = stdout;
+#else
+ cppExpYYin = (FILE *) 0;
+ cppExpYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * cppExpYYlex_init()
+ */
+ return 0;
+}
+
+/* cppExpYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int cppExpYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ cppExpYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ cppExpYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ cppExpYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * cppExpYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *cppExpYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *cppExpYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void cppExpYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see cppExpYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 103 "constexp.l"
+
+
+
+bool parseCppExpression(const char *fileName,int lineNr,const QCString &s)
+{
+ //printf("Expression: `%s'\n",s.data());
+ g_constExpFileName = fileName;
+ g_constExpLineNr = lineNr;
+ g_inputString = s;
+ g_inputPosition = 0;
+ cppExpYYrestart( cppExpYYin );
+ cppExpYYparse();
+ //printf("Result: %ld\n",(long)g_resultValue);
+ return (long)g_resultValue!=0;
+}
+
+extern "C" {
+ int cppExpYYwrap() { return 1; }
+}
+
diff --git a/src/ce_parse.cpp b/src/ce_parse.cpp
new file mode 100644
index 0000000..cb39675
--- /dev/null
+++ b/src/ce_parse.cpp
@@ -0,0 +1,1972 @@
+/* A Bison parser, made by GNU Bison 2.3. */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+ Free Software Foundation, Inc.
+
+ 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, 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, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Bison version. */
+#define YYBISON_VERSION "2.3"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names. */
+#define yyparse cppExpYYparse
+#define yylex cppExpYYlex
+#define yyerror cppExpYYerror
+#define yylval cppExpYYlval
+#define yychar cppExpYYchar
+#define yydebug cppExpYYdebug
+#define yynerrs cppExpYYnerrs
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ TOK_QUESTIONMARK = 258,
+ TOK_COLON = 259,
+ TOK_OR = 260,
+ TOK_AND = 261,
+ TOK_BITWISEOR = 262,
+ TOK_BITWISEXOR = 263,
+ TOK_AMPERSAND = 264,
+ TOK_NOTEQUAL = 265,
+ TOK_EQUAL = 266,
+ TOK_LESSTHAN = 267,
+ TOK_GREATERTHAN = 268,
+ TOK_LESSTHANOREQUALTO = 269,
+ TOK_GREATERTHANOREQUALTO = 270,
+ TOK_SHIFTLEFT = 271,
+ TOK_SHIFTRIGHT = 272,
+ TOK_PLUS = 273,
+ TOK_MINUS = 274,
+ TOK_STAR = 275,
+ TOK_DIVIDE = 276,
+ TOK_MOD = 277,
+ TOK_TILDE = 278,
+ TOK_NOT = 279,
+ TOK_LPAREN = 280,
+ TOK_RPAREN = 281,
+ TOK_OCTALINT = 282,
+ TOK_DECIMALINT = 283,
+ TOK_HEXADECIMALINT = 284,
+ TOK_CHARACTER = 285,
+ TOK_FLOAT = 286
+ };
+#endif
+/* Tokens. */
+#define TOK_QUESTIONMARK 258
+#define TOK_COLON 259
+#define TOK_OR 260
+#define TOK_AND 261
+#define TOK_BITWISEOR 262
+#define TOK_BITWISEXOR 263
+#define TOK_AMPERSAND 264
+#define TOK_NOTEQUAL 265
+#define TOK_EQUAL 266
+#define TOK_LESSTHAN 267
+#define TOK_GREATERTHAN 268
+#define TOK_LESSTHANOREQUALTO 269
+#define TOK_GREATERTHANOREQUALTO 270
+#define TOK_SHIFTLEFT 271
+#define TOK_SHIFTRIGHT 272
+#define TOK_PLUS 273
+#define TOK_MINUS 274
+#define TOK_STAR 275
+#define TOK_DIVIDE 276
+#define TOK_MOD 277
+#define TOK_TILDE 278
+#define TOK_NOT 279
+#define TOK_LPAREN 280
+#define TOK_RPAREN 281
+#define TOK_OCTALINT 282
+#define TOK_DECIMALINT 283
+#define TOK_HEXADECIMALINT 284
+#define TOK_CHARACTER 285
+#define TOK_FLOAT 286
+
+
+
+
+/* Copy the first part of user declarations. */
+
+
+
+#include "cppvalue.h"
+#include "constexp.h"
+#include "message.h"
+
+#if defined(_MSC_VER)
+#define MSDOS
+#endif
+
+#define YYSTYPE CPPValue
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int cppExpYYerror(const char *s)
+{
+ warn(g_constExpFileName,g_constExpLineNr,
+ "warning: preprocessing issue while doing constant expression evaluation: %s",s);
+ return 0;
+}
+
+int cppExpYYlex();
+
+
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table. */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef int YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations. */
+
+
+/* Line 216 of yacc.c. */
+
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(msgid) dgettext ("bison-runtime", msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions. */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int i)
+#else
+static int
+YYID (i)
+ int i;
+#endif
+{
+ return i;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef _STDLIB_H
+# define _STDLIB_H 1
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined _STDLIB_H \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef _STDLIB_H
+# define _STDLIB_H 1
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yytype_int16 yyss;
+ YYSTYPE yyvs;
+ };
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (YYID (0))
+# endif
+# endif
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack, Stack, yysize); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 31
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 63
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 32
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 16
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 44
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 73
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 286
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const yytype_uint8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const yytype_uint8 yyprhs[] =
+{
+ 0, 0, 3, 5, 7, 13, 15, 19, 21, 25,
+ 27, 31, 33, 37, 39, 43, 45, 49, 53, 55,
+ 59, 63, 67, 71, 73, 77, 81, 83, 87, 91,
+ 93, 97, 101, 105, 107, 110, 113, 116, 119, 121,
+ 125, 127, 129, 131, 133
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yytype_int8 yyrhs[] =
+{
+ 33, 0, -1, 34, -1, 35, -1, 35, 3, 35,
+ 4, 35, -1, 36, -1, 35, 5, 36, -1, 37,
+ -1, 36, 6, 37, -1, 38, -1, 37, 7, 38,
+ -1, 39, -1, 38, 8, 39, -1, 40, -1, 39,
+ 9, 40, -1, 41, -1, 40, 11, 41, -1, 40,
+ 10, 41, -1, 42, -1, 41, 12, 42, -1, 41,
+ 13, 42, -1, 41, 14, 42, -1, 41, 15, 42,
+ -1, 43, -1, 42, 16, 43, -1, 42, 17, 43,
+ -1, 44, -1, 43, 18, 44, -1, 43, 19, 44,
+ -1, 45, -1, 44, 20, 45, -1, 44, 21, 45,
+ -1, 44, 22, 45, -1, 46, -1, 18, 45, -1,
+ 19, 45, -1, 23, 45, -1, 24, 45, -1, 47,
+ -1, 25, 34, 26, -1, 27, -1, 28, -1, 29,
+ -1, 30, -1, 31, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const yytype_uint16 yyrline[] =
+{
+ 0, 77, 77, 81, 83, 92, 94, 100, 102, 108,
+ 110, 117, 119, 125, 127, 133, 135, 139, 145, 147,
+ 151, 155, 160, 167, 169, 173, 179, 181, 192, 205,
+ 207, 218, 231, 239, 241, 243, 250, 254, 260, 262,
+ 266, 268, 270, 272, 274
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "TOK_QUESTIONMARK", "TOK_COLON",
+ "TOK_OR", "TOK_AND", "TOK_BITWISEOR", "TOK_BITWISEXOR", "TOK_AMPERSAND",
+ "TOK_NOTEQUAL", "TOK_EQUAL", "TOK_LESSTHAN", "TOK_GREATERTHAN",
+ "TOK_LESSTHANOREQUALTO", "TOK_GREATERTHANOREQUALTO", "TOK_SHIFTLEFT",
+ "TOK_SHIFTRIGHT", "TOK_PLUS", "TOK_MINUS", "TOK_STAR", "TOK_DIVIDE",
+ "TOK_MOD", "TOK_TILDE", "TOK_NOT", "TOK_LPAREN", "TOK_RPAREN",
+ "TOK_OCTALINT", "TOK_DECIMALINT", "TOK_HEXADECIMALINT", "TOK_CHARACTER",
+ "TOK_FLOAT", "$accept", "start", "constant_expression",
+ "logical_or_expression", "logical_and_expression",
+ "inclusive_or_expression", "exclusive_or_expression", "and_expression",
+ "equality_expression", "relational_expression", "shift_expression",
+ "additive_expression", "multiplicative_expression", "unary_expression",
+ "primary_expression", "constant", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const yytype_uint16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_uint8 yyr1[] =
+{
+ 0, 32, 33, 34, 34, 35, 35, 36, 36, 37,
+ 37, 38, 38, 39, 39, 40, 40, 40, 41, 41,
+ 41, 41, 41, 42, 42, 42, 43, 43, 43, 44,
+ 44, 44, 44, 45, 45, 45, 45, 45, 46, 46,
+ 47, 47, 47, 47, 47
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const yytype_uint8 yyr2[] =
+{
+ 0, 2, 1, 1, 5, 1, 3, 1, 3, 1,
+ 3, 1, 3, 1, 3, 1, 3, 3, 1, 3,
+ 3, 3, 3, 1, 3, 3, 1, 3, 3, 1,
+ 3, 3, 3, 1, 2, 2, 2, 2, 1, 3,
+ 1, 1, 1, 1, 1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const yytype_uint8 yydefact[] =
+{
+ 0, 0, 0, 0, 0, 0, 40, 41, 42, 43,
+ 44, 0, 2, 3, 5, 7, 9, 11, 13, 15,
+ 18, 23, 26, 29, 33, 38, 34, 35, 36, 37,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 39, 0, 6, 8, 10, 12, 14, 17, 16,
+ 19, 20, 21, 22, 24, 25, 27, 28, 30, 31,
+ 32, 0, 4
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int8 yydefgoto[] =
+{
+ -1, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -29
+static const yytype_int8 yypact[] =
+{
+ -13, -13, -13, -13, -13, -13, -29, -29, -29, -29,
+ -29, 13, -29, 4, 29, 1, 19, 33, 21, 7,
+ 17, 18, 8, -29, -29, -29, -29, -29, -29, -29,
+ 20, -29, -13, -13, -13, -13, -13, -13, -13, -13,
+ -13, -13, -13, -13, -13, -13, -13, -13, -13, -13,
+ -13, -29, 34, 29, 1, 19, 33, 21, 7, 7,
+ 17, 17, 17, 17, 18, 18, 8, 8, -29, -29,
+ -29, -13, 45
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -29, -29, 48, -28, 22, 23, 24, 25, 26, 2,
+ -17, 0, 5, -1, -29, -29
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -1
+static const yytype_uint8 yytable[] =
+{
+ 26, 27, 28, 29, 52, 1, 2, 32, 35, 33,
+ 3, 4, 5, 31, 6, 7, 8, 9, 10, 40,
+ 41, 42, 43, 60, 61, 62, 63, 36, 48, 49,
+ 50, 38, 39, 44, 45, 34, 46, 47, 71, 33,
+ 58, 59, 37, 72, 64, 65, 51, 68, 69, 70,
+ 33, 66, 67, 30, 0, 53, 0, 54, 0, 55,
+ 0, 56, 0, 57
+};
+
+static const yytype_int8 yycheck[] =
+{
+ 1, 2, 3, 4, 32, 18, 19, 3, 7, 5,
+ 23, 24, 25, 0, 27, 28, 29, 30, 31, 12,
+ 13, 14, 15, 40, 41, 42, 43, 8, 20, 21,
+ 22, 10, 11, 16, 17, 6, 18, 19, 4, 5,
+ 38, 39, 9, 71, 44, 45, 26, 48, 49, 50,
+ 5, 46, 47, 5, -1, 33, -1, 34, -1, 35,
+ -1, 36, -1, 37
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_uint8 yystos[] =
+{
+ 0, 18, 19, 23, 24, 25, 27, 28, 29, 30,
+ 31, 33, 34, 35, 36, 37, 38, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 45, 45, 45, 45,
+ 34, 0, 3, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 26, 35, 36, 37, 38, 39, 40, 41, 41,
+ 42, 42, 42, 42, 43, 43, 44, 44, 45, 45,
+ 45, 4, 35
+};
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+
+#define YYFAIL goto yyerrlab
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yytoken = YYTRANSLATE (yychar); \
+ YYPOPSTACK (1); \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+while (YYID (0))
+
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+ If N is 0, then set CURRENT to the empty location which ends
+ the previous symbol: RHS[0] (always defined). */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (YYID (N)) \
+ { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ } \
+ else \
+ { \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ } \
+ while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+ This macro was not mandated originally: define only if we know
+ we won't break user code: when these are the locations we know. */
+
+#ifndef YY_LOCATION_PRINT
+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
+# define YY_LOCATION_PRINT(File, Loc) \
+ fprintf (File, "%d.%d-%d.%d", \
+ (Loc).first_line, (Loc).first_column, \
+ (Loc).last_line, (Loc).last_column)
+# else
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Type, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+#endif
+{
+ if (!yyvaluep)
+ return;
+# ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+ YYUSE (yyoutput);
+# endif
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE const * const yyvaluep;
+#endif
+{
+ if (yytype < YYNTOKENS)
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+ yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+ YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
+#else
+static void
+yy_stack_print (bottom, top)
+ yytype_int16 *bottom;
+ yytype_int16 *top;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; bottom <= top; ++bottom)
+ YYFPRINTF (stderr, " %d", *bottom);
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule)
+ YYSTYPE *yyvsp;
+ int yyrule;
+#endif
+{
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ unsigned long int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ fprintf (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+ &(yyvsp[(yyi + 1) - (yynrhs)])
+ );
+ fprintf (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined __GLIBC__ && defined _STRING_H
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+ const char *yystr;
+#endif
+{
+ YYSIZE_T yylen;
+ for (yylen = 0; yystr[yylen]; yylen++)
+ continue;
+ return yylen;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+#endif
+{
+ char *yyd = yydest;
+ const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+ quotes and backslashes, so that it's suitable for yyerror. The
+ heuristic is that double-quoting is unnecessary unless the string
+ contains an apostrophe, a comma, or backslash (other than
+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
+ null, do not copy; instead, return the length of what the result
+ would have been. */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+ if (*yystr == '"')
+ {
+ YYSIZE_T yyn = 0;
+ char const *yyp = yystr;
+
+ for (;;)
+ switch (*++yyp)
+ {
+ case '\'':
+ case ',':
+ goto do_not_strip_quotes;
+
+ case '\\':
+ if (*++yyp != '\\')
+ goto do_not_strip_quotes;
+ /* Fall through. */
+ default:
+ if (yyres)
+ yyres[yyn] = *yyp;
+ yyn++;
+ break;
+
+ case '"':
+ if (yyres)
+ yyres[yyn] = '\0';
+ return yyn;
+ }
+ do_not_strip_quotes: ;
+ }
+
+ if (! yyres)
+ return yystrlen (yystr);
+
+ return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+ YYCHAR while in state YYSTATE. Return the number of bytes copied,
+ including the terminating null byte. If YYRESULT is null, do not
+ copy anything; just return the number of bytes that would be
+ copied. As a special case, return 0 if an ordinary "syntax error"
+ message will do. Return YYSIZE_MAXIMUM if overflow occurs during
+ size calculation. */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+ int yyn = yypact[yystate];
+
+ if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+ return 0;
+ else
+ {
+ int yytype = YYTRANSLATE (yychar);
+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+ YYSIZE_T yysize = yysize0;
+ YYSIZE_T yysize1;
+ int yysize_overflow = 0;
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ int yyx;
+
+# if 0
+ /* This is so xgettext sees the translatable formats that are
+ constructed on the fly. */
+ YY_("syntax error, unexpected %s");
+ YY_("syntax error, unexpected %s, expecting %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+ char *yyfmt;
+ char const *yyf;
+ static char const yyunexpected[] = "syntax error, unexpected %s";
+ static char const yyexpecting[] = ", expecting %s";
+ static char const yyor[] = " or %s";
+ char yyformat[sizeof yyunexpected
+ + sizeof yyexpecting - 1
+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+ * (sizeof yyor - 1))];
+ char const *yyprefix = yyexpecting;
+
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn + 1;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yycount = 1;
+
+ yyarg[0] = yytname[yytype];
+ yyfmt = yystpcpy (yyformat, yyunexpected);
+
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+ {
+ yycount = 1;
+ yysize = yysize0;
+ yyformat[sizeof yyunexpected - 1] = '\0';
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+ yysize_overflow |= (yysize1 < yysize);
+ yysize = yysize1;
+ yyfmt = yystpcpy (yyfmt, yyprefix);
+ yyprefix = yyor;
+ }
+
+ yyf = YY_(yyformat);
+ yysize1 = yysize + yystrlen (yyf);
+ yysize_overflow |= (yysize1 < yysize);
+ yysize = yysize1;
+
+ if (yysize_overflow)
+ return YYSIZE_MAXIMUM;
+
+ if (yyresult)
+ {
+ /* Avoid sprintf, as that infringes on the user's name space.
+ Don't have undefined behavior even if the translation
+ produced a string with the wrong number of "%s"s. */
+ char *yyp = yyresult;
+ int yyi = 0;
+ while ((*yyp = *yyf) != '\0')
+ {
+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+ {
+ yyp += yytnamerr (yyp, yyarg[yyi++]);
+ yyf += 2;
+ }
+ else
+ {
+ yyp++;
+ yyf++;
+ }
+ }
+ }
+ return yysize;
+ }
+}
+#endif /* YYERROR_VERBOSE */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+ const char *yymsg;
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
+{
+ YYUSE (yyvaluep);
+
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes. */
+
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The look-ahead symbol. */
+int yychar;
+
+/* The semantic value of the look-ahead symbol. */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+ || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+ int yystate;
+ int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Look-ahead token as an internal (translated) token number. */
+ int yytoken = 0;
+#if YYERROR_VERBOSE
+ /* Buffer for error messages, and its allocated size. */
+ char yymsgbuf[128];
+ char *yymsg = yymsgbuf;
+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ yytype_int16 yyssa[YYINITDEPTH];
+ yytype_int16 *yyss = yyssa;
+ yytype_int16 *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ yytype_int16 *yyss1 = yyss;
+
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yytype_int16 *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss);
+ YYSTACK_RELOCATE (yyvs);
+
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+ /* Do appropriate processing given the current state. Read a
+ look-ahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to look-ahead token. */
+ yyn = yypact[yystate];
+ if (yyn == YYPACT_NINF)
+ goto yydefault;
+
+ /* Not known => get a look-ahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yyn == 0 || yyn == YYTABLE_NINF)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the look-ahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+ /* Discard the shifted token unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ yystate = yyn;
+ *++yyvsp = yylval;
+
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2:
+
+ { g_resultValue = (yyvsp[(1) - (1)]); return 0; ;}
+ break;
+
+ case 3:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 4:
+
+ {
+ bool c = ((yyvsp[(1) - (5)]).isInt() ? ((long)(yyvsp[(1) - (5)]) != 0) : ((double)(yyvsp[(1) - (5)]) != 0.0));
+ (yyval) = c ? (yyvsp[(3) - (5)]) : (yyvsp[(5) - (5)]);
+ ;}
+ break;
+
+ case 5:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 6:
+
+ {
+ (yyval) = CPPValue( (long)((long)(yyvsp[(1) - (3)]) || (long)(yyvsp[(3) - (3)])) );
+ ;}
+ break;
+
+ case 7:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 8:
+
+ {
+ (yyval) = CPPValue( (long)((long)(yyvsp[(1) - (3)]) && (long)(yyvsp[(3) - (3)])) );
+ ;}
+ break;
+
+ case 9:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 10:
+
+ {
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) | (long)(yyvsp[(3) - (3)]) );
+ ;}
+ break;
+
+ case 11:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 12:
+
+ {
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) ^ (long)(yyvsp[(3) - (3)]) );
+ ;}
+ break;
+
+ case 13:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 14:
+
+ {
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) & (long)(yyvsp[(3) - (3)]) );
+ ;}
+ break;
+
+ case 15:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 16:
+
+ {
+ (yyval) = CPPValue( (long)((double)(yyvsp[(1) - (3)]) == (double)(yyvsp[(3) - (3)])) );
+ ;}
+ break;
+
+ case 17:
+
+ {
+ (yyval) = CPPValue( (long)((double)(yyvsp[(1) - (3)]) != (double)(yyvsp[(3) - (3)])) );
+ ;}
+ break;
+
+ case 18:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 19:
+
+ {
+ (yyval) = CPPValue( (long)((double)(yyvsp[(1) - (3)]) < (double)(yyvsp[(3) - (3)])) );
+ ;}
+ break;
+
+ case 20:
+
+ {
+ (yyval) = CPPValue( (long)((double)(yyvsp[(1) - (3)]) > (double)(yyvsp[(3) - (3)])) );
+ ;}
+ break;
+
+ case 21:
+
+ {
+ (yyval) = CPPValue( (long)((double)(yyvsp[(1) - (3)]) <= (double)(yyvsp[(3) - (3)])) );
+ ;}
+ break;
+
+ case 22:
+
+ {
+ (yyval) = CPPValue( (long)((double)(yyvsp[(1) - (3)]) >= (double)(yyvsp[(3) - (3)])) );
+ ;}
+ break;
+
+ case 23:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 24:
+
+ {
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) << (long)(yyvsp[(3) - (3)]) );
+ ;}
+ break;
+
+ case 25:
+
+ {
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) >> (long)(yyvsp[(3) - (3)]) );
+ ;}
+ break;
+
+ case 26:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 27:
+
+ {
+ if (!(yyvsp[(1) - (3)]).isInt() || !(yyvsp[(3) - (3)]).isInt())
+ {
+ (yyval) = CPPValue( (double)(yyvsp[(1) - (3)]) + (double)(yyvsp[(3) - (3)]) );
+ }
+ else
+ {
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) + (long)(yyvsp[(3) - (3)]) );
+ }
+ ;}
+ break;
+
+ case 28:
+
+ {
+ if (!(yyvsp[(1) - (3)]).isInt() || !(yyvsp[(3) - (3)]).isInt())
+ {
+ (yyval) = CPPValue( (double)(yyvsp[(1) - (3)]) - (double)(yyvsp[(3) - (3)]) );
+ }
+ else
+ {
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) - (long)(yyvsp[(3) - (3)]) );
+ }
+ ;}
+ break;
+
+ case 29:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 30:
+
+ {
+ if (!(yyvsp[(1) - (3)]).isInt() || !(yyvsp[(3) - (3)]).isInt())
+ {
+ (yyval) = CPPValue( (double)(yyvsp[(1) - (3)]) * (double)(yyvsp[(3) - (3)]) );
+ }
+ else
+ {
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) * (long)(yyvsp[(3) - (3)]) );
+ }
+ ;}
+ break;
+
+ case 31:
+
+ {
+ if (!(yyvsp[(1) - (3)]).isInt() || !(yyvsp[(3) - (3)]).isInt())
+ {
+ (yyval) = CPPValue( (double)(yyvsp[(1) - (3)]) / (double)(yyvsp[(3) - (3)]) );
+ }
+ else
+ {
+ long value = (yyvsp[(3) - (3)]);
+ if (value==0) value=1;
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) / value );
+ }
+ ;}
+ break;
+
+ case 32:
+
+ {
+ long value = (yyvsp[(3) - (3)]);
+ if (value==0) value=1;
+ (yyval) = CPPValue( (long)(yyvsp[(1) - (3)]) % value );
+ ;}
+ break;
+
+ case 33:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 34:
+
+ { (yyval) = (yyvsp[(1) - (2)]); ;}
+ break;
+
+ case 35:
+
+ {
+ if ((yyvsp[(2) - (2)]).isInt())
+ (yyval) = CPPValue(-(long)(yyvsp[(2) - (2)]));
+ else
+ (yyval) = CPPValue(-(double)(yyvsp[(2) - (2)]));
+ ;}
+ break;
+
+ case 36:
+
+ {
+ (yyval) = CPPValue(~(long)(yyvsp[(2) - (2)]));
+ ;}
+ break;
+
+ case 37:
+
+ {
+ (yyval) = CPPValue((long)!(long)(yyvsp[(2) - (2)]));
+ ;}
+ break;
+
+ case 38:
+
+ { (yyval) = (yyvsp[(1) - (1)]); ;}
+ break;
+
+ case 39:
+
+ { (yyval) = (yyvsp[(2) - (3)]); ;}
+ break;
+
+ case 40:
+
+ { (yyval) = parseOctal(); ;}
+ break;
+
+ case 41:
+
+ { (yyval) = parseDecimal(); ;}
+ break;
+
+ case 42:
+
+ { (yyval) = parseHexadecimal(); ;}
+ break;
+
+ case 43:
+
+ { (yyval) = parseCharacter(); ;}
+ break;
+
+ case 44:
+
+ { (yyval) = parseFloat(); ;}
+ break;
+
+
+/* Line 1267 of yacc.c. */
+
+ default: break;
+ }
+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if ! YYERROR_VERBOSE
+ yyerror (YY_("syntax error"));
+#else
+ {
+ YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+ if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+ {
+ YYSIZE_T yyalloc = 2 * yysize;
+ if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+ yyalloc = YYSTACK_ALLOC_MAXIMUM;
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+ if (yymsg)
+ yymsg_alloc = yyalloc;
+ else
+ {
+ yymsg = yymsgbuf;
+ yymsg_alloc = sizeof yymsgbuf;
+ }
+ }
+
+ if (0 < yysize && yysize <= yymsg_alloc)
+ {
+ (void) yysyntax_error (yymsg, yystate, yychar);
+ yyerror (yymsg);
+ }
+ else
+ {
+ yyerror (YY_("syntax error"));
+ if (yysize != 0)
+ goto yyexhaustedlab;
+ }
+ }
+#endif
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse look-ahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse look-ahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+ /* Pacify compilers like GCC when the user code never invokes
+ YYERROR and the label yyerrorlab therefore never appears in user
+ code. */
+ if (/*CONSTCOND*/ 0)
+ goto yyerrorlab;
+
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (yyn != YYPACT_NINF)
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ yystos[yystate], yyvsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ *++yyvsp = yylval;
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#ifndef yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+ if (yychar != YYEOF && yychar != YYEMPTY)
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ /* Do not reclaim the symbols of the rule which action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ yystos[*yyssp], yyvsp);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+#endif
+ /* Make sure YYID is used. */
+ return YYID (yyresult);
+}
+
+
+
+
+
diff --git a/src/ce_parse.h b/src/ce_parse.h
new file mode 100644
index 0000000..2fff6bc
--- /dev/null
+++ b/src/ce_parse.h
@@ -0,0 +1,115 @@
+/* A Bison parser, made by GNU Bison 2.3. */
+
+/* Skeleton interface for Bison's Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+ Free Software Foundation, Inc.
+
+ 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, 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, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ TOK_QUESTIONMARK = 258,
+ TOK_COLON = 259,
+ TOK_OR = 260,
+ TOK_AND = 261,
+ TOK_BITWISEOR = 262,
+ TOK_BITWISEXOR = 263,
+ TOK_AMPERSAND = 264,
+ TOK_NOTEQUAL = 265,
+ TOK_EQUAL = 266,
+ TOK_LESSTHAN = 267,
+ TOK_GREATERTHAN = 268,
+ TOK_LESSTHANOREQUALTO = 269,
+ TOK_GREATERTHANOREQUALTO = 270,
+ TOK_SHIFTLEFT = 271,
+ TOK_SHIFTRIGHT = 272,
+ TOK_PLUS = 273,
+ TOK_MINUS = 274,
+ TOK_STAR = 275,
+ TOK_DIVIDE = 276,
+ TOK_MOD = 277,
+ TOK_TILDE = 278,
+ TOK_NOT = 279,
+ TOK_LPAREN = 280,
+ TOK_RPAREN = 281,
+ TOK_OCTALINT = 282,
+ TOK_DECIMALINT = 283,
+ TOK_HEXADECIMALINT = 284,
+ TOK_CHARACTER = 285,
+ TOK_FLOAT = 286
+ };
+#endif
+/* Tokens. */
+#define TOK_QUESTIONMARK 258
+#define TOK_COLON 259
+#define TOK_OR 260
+#define TOK_AND 261
+#define TOK_BITWISEOR 262
+#define TOK_BITWISEXOR 263
+#define TOK_AMPERSAND 264
+#define TOK_NOTEQUAL 265
+#define TOK_EQUAL 266
+#define TOK_LESSTHAN 267
+#define TOK_GREATERTHAN 268
+#define TOK_LESSTHANOREQUALTO 269
+#define TOK_GREATERTHANOREQUALTO 270
+#define TOK_SHIFTLEFT 271
+#define TOK_SHIFTRIGHT 272
+#define TOK_PLUS 273
+#define TOK_MINUS 274
+#define TOK_STAR 275
+#define TOK_DIVIDE 276
+#define TOK_MOD 277
+#define TOK_TILDE 278
+#define TOK_NOT 279
+#define TOK_LPAREN 280
+#define TOK_RPAREN 281
+#define TOK_OCTALINT 282
+#define TOK_DECIMALINT 283
+#define TOK_HEXADECIMALINT 284
+#define TOK_CHARACTER 285
+#define TOK_FLOAT 286
+
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef int YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+extern YYSTYPE cppExpYYlval;
+
diff --git a/src/classdef.cpp b/src/classdef.cpp
new file mode 100644
index 0000000..f6fee2d
--- /dev/null
+++ b/src/classdef.cpp
@@ -0,0 +1,3904 @@
+/******************************************************************************
+ *
+ * $Id: classdef.cpp,v 1.54 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdio.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include "classdef.h"
+#include "classlist.h"
+#include "entry.h"
+#include "doxygen.h"
+#include "membername.h"
+#include "message.h"
+#include "config.h"
+#include "util.h"
+#include "diagram.h"
+#include "language.h"
+#include "htmlhelp.h"
+#include "example.h"
+#include "outputlist.h"
+#include "dot.h"
+#include "defargs.h"
+#include "debug.h"
+#include "docparser.h"
+#include "searchindex.h"
+#include "vhdldocgen.h"
+#include "layout.h"
+
+//-----------------------------------------------------------------------------
+
+//static inline MemberList *createNewMemberList(MemberList::ListType lt)
+//{
+// MemberList *result = new MemberList(lt);
+// return result;
+//}
+
+class ClassDefImpl
+{
+ public:
+ ClassDefImpl();
+ ~ClassDefImpl();
+ void init(const char *defFileName, const char *name,
+ const QCString &ctStr, const char *fName);
+
+ /*! file name that forms the base for the output file containing the
+ * class documentation. For compatibility with Qt (e.g. links via tag
+ * files) this name cannot be derived from the class name directly.
+ */
+ QCString fileName;
+
+ /*! Include information about the header file should be included
+ * in the documentation. 0 by default, set by setIncludeFile().
+ */
+ IncludeInfo *incInfo;
+
+ /*! List of base class (or super-classes) from which this class derives
+ * directly.
+ */
+ BaseClassList *inherits;
+
+ /*! List of sub-classes that directly derive from this class
+ */
+ BaseClassList *inheritedBy;
+
+ /*! Namespace this class is part of
+ * (this is the inner most namespace in case of nested namespaces)
+ */
+ NamespaceDef *nspace;
+
+ /*! File this class is defined in */
+ FileDef *fileDef;
+
+ /*! List of all members (including inherited members) */
+ MemberNameInfoSDict *allMemberNameInfoSDict;
+
+ /*! Template arguments of this class */
+ ArgumentList *tempArgs;
+
+ /*! Type constraints for template parameters */
+ ArgumentList *typeConstraints;
+
+ /*! Files that were used for generating the class documentation. */
+ QStrList files;
+
+ /*! Examples that use this class */
+ ExampleSDict *exampleSDict;
+
+ /*! Holds the kind of "class" this is. */
+ ClassDef::CompoundType compType;
+
+ /*! The protection level in which this class was found.
+ * Typically Public, but for nested classes this can also be Protected
+ * or Private.
+ */
+ Protection prot;
+
+ /*! The inner classes contained in this class. Will be 0 if there are
+ * no inner classes.
+ */
+ ClassSDict *innerClasses;
+
+ /* classes for the collaboration diagram */
+ UsesClassDict *usesImplClassDict;
+ UsesClassDict *usedByImplClassDict;
+ UsesClassDict *usesIntfClassDict;
+
+ /*! Template instances that exists of this class, the key in the
+ * dictionary is the template argument list.
+ */
+ QDict<ClassDef> *templateInstances;
+
+ /*! Template instances that exists of this class, as defined by variables.
+ * We do NOT want to document these individually. The key in the
+ * dictionary is the template argument list.
+ */
+ QDict<ClassDef> *variableInstances;
+
+ QDict<int> *templBaseClassNames;
+
+ /*! The class this class is an instance of. */
+ ClassDef *templateMaster;
+
+ /*! local class name which could be a typedef'ed alias name. */
+ QCString className;
+
+ /*! If this class is a Objective-C category, then this points to the
+ * class which is extended.
+ */
+ ClassDef *categoryOf;
+
+ QList<MemberList> memberLists;
+
+ /* user defined member groups */
+ MemberGroupSDict *memberGroupSDict;
+
+ /*! Is this an abstact class? */
+ bool isAbstract;
+
+ /*! Is the class part of an unnamed namespace? */
+ bool isStatic;
+
+ /*! Language used for this class */
+ SrcLangExt lang;
+
+ /*! TRUE if classes members are merged with those of the base classes. */
+ bool membersMerged;
+
+ /*! TRUE if the class is defined in a source file rather than a header file. */
+ bool isLocal;
+
+ bool isTemplArg;
+
+ /*! Does this class group its user-grouped members
+ * as a sub-section of the normal (public/protected/..)
+ * groups?
+ */
+ bool subGrouping;
+
+ /** Reason of existance is a "use" relation */
+ bool usedOnly;
+
+ /** List of titles to use for the summary */
+ SDict<QCString> vhdlSummaryTitles;
+};
+
+void ClassDefImpl::init(const char *defFileName, const char *name,
+ const QCString &ctStr, const char *fName)
+{
+ if (fName)
+ {
+ fileName=stripExtension(fName);
+ }
+ else
+ {
+ fileName=ctStr+name;
+ }
+ exampleSDict = 0;
+ inherits = 0;
+ inheritedBy = 0;
+ allMemberNameInfoSDict = 0;
+ incInfo=0;
+ tempArgs=0;
+ typeConstraints=0;
+ prot=Public;
+ nspace=0;
+ fileDef=0;
+ usesImplClassDict=0;
+ usedByImplClassDict=0;
+ usesIntfClassDict=0;
+ memberGroupSDict = 0;
+ innerClasses = 0;
+ subGrouping=Config_getBool("SUBGROUPING");
+ templateInstances = 0;
+ variableInstances = 0;
+ templateMaster =0;
+ templBaseClassNames = 0;
+ isAbstract = FALSE;
+ isStatic = FALSE;
+ isTemplArg = FALSE;
+ membersMerged = FALSE;
+ categoryOf = 0;
+ usedOnly = FALSE;
+ //QCString ns;
+ //extractNamespaceName(name,className,ns);
+ //printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data());
+
+ if (getLanguageFromFileName(defFileName)!=SrcLangExt_Java &&
+ guessSection(defFileName)==Entry::SOURCE_SEC)
+ {
+ isLocal=TRUE;
+ }
+ else
+ {
+ isLocal=FALSE;
+ }
+}
+
+ClassDefImpl::ClassDefImpl() : vhdlSummaryTitles(17)
+{
+ vhdlSummaryTitles.setAutoDelete(TRUE);
+}
+
+ClassDefImpl::~ClassDefImpl()
+{
+ delete inherits;
+ delete inheritedBy;
+ delete allMemberNameInfoSDict;
+ delete exampleSDict;
+ delete usesImplClassDict;
+ delete usedByImplClassDict;
+ delete usesIntfClassDict;
+ delete incInfo;
+ delete memberGroupSDict;
+ delete innerClasses;
+ delete templateInstances;
+ delete variableInstances;
+ delete templBaseClassNames;
+ delete tempArgs;
+ delete typeConstraints;
+}
+
+// constructs a new class definition
+ClassDef::ClassDef(
+ const char *defFileName,int defLine,
+ const char *nm,CompoundType ct,
+ const char *lref,const char *fName,
+ bool isSymbol)
+ : Definition(defFileName,defLine,removeRedundantWhiteSpace(nm),0,0,isSymbol)
+{
+ visited=FALSE;
+ setReference(lref);
+ m_impl = new ClassDefImpl;
+ m_impl->compType = ct;
+ m_impl->lang = SrcLangExt_Unknown;
+ m_impl->init(defFileName,name(),compoundTypeString(),fName);
+
+}
+
+// destroy the class definition
+ClassDef::~ClassDef()
+{
+ delete m_impl;
+}
+
+QCString ClassDef::getMemberListFileName() const
+{
+ return convertNameToFile(compoundTypeString()+name()+"-members");
+}
+
+QCString ClassDef::displayName() const
+{
+ static bool optimizeOutputForJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ QCString n;
+ if (vhdlOpt)
+ {
+ n = VhdlDocGen::getClassName(this);
+ }
+ else
+ {
+ n=qualifiedNameWithTemplateParameters();
+ }
+ if (optimizeOutputForJava)
+ {
+ n=substitute(n,"::",".");
+ }
+ if (m_impl->compType==ClassDef::Protocol && n.right(2)=="-p")
+ {
+ n="<"+n.left(n.length()-2)+">";
+ }
+ //printf("ClassDef::displayName()=%s\n",n.data());
+ return n;
+}
+
+// inserts a base class in the inheritance list
+void ClassDef::insertBaseClass(ClassDef *cd,const char *n,Protection p,
+ Specifier s,const char *t)
+{
+ //printf("*** insert base class %s into %s\n",cd->name().data(),name().data());
+ //inherits->inSort(new BaseClassDef(cd,p,s,t));
+ if (m_impl->inherits==0)
+ {
+ m_impl->inherits = new BaseClassList;
+ m_impl->inherits->setAutoDelete(TRUE);
+ }
+ m_impl->inherits->append(new BaseClassDef(cd,n,p,s,t));
+}
+
+// inserts a sub class in the inherited list
+void ClassDef::insertSubClass(ClassDef *cd,Protection p,
+ Specifier s,const char *t)
+{
+ //printf("*** insert sub class %s into %s\n",cd->name().data(),name().data());
+ if (m_impl->inheritedBy==0)
+ {
+ m_impl->inheritedBy = new BaseClassList;
+ m_impl->inheritedBy->setAutoDelete(TRUE);
+ }
+ m_impl->inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t));
+}
+
+void ClassDef::addMembersToMemberGroup()
+{
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberList::detailedLists)==0)
+ {
+ ::addMembersToMemberGroup(ml,&m_impl->memberGroupSDict,this);
+ }
+ }
+
+ // add members inside sections to their groups
+ if (m_impl->memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ if (mg->allMembersInSameSection() && m_impl->subGrouping)
+ {
+ //printf("addToDeclarationSection(%s)\n",mg->header().data());
+ mg->addToDeclarationSection();
+ }
+ }
+ }
+}
+
+// adds new member definition to the class
+void ClassDef::internalInsertMember(MemberDef *md,
+ Protection prot,
+ bool addToAllList
+ )
+{
+ //printf("insertInternalMember(%s) isHidden()=%d\n",md->name().data(),md->isHidden());
+ if (md->isHidden()) return;
+
+ static bool optVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ if (optVhdl)
+ {
+ QCString title=VhdlDocGen::trVhdlType(md->getMemberSpecifiers(),FALSE);
+ if (!m_impl->vhdlSummaryTitles.find(title))
+ {
+ m_impl->vhdlSummaryTitles.append(title,new QCString(title));
+ }
+ }
+
+ if (!isReference())
+ {
+ static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
+
+ /********************************************/
+ /* insert member in the declaration section */
+ /********************************************/
+ if (md->isRelated() && (extractPrivate || prot!=Private))
+ {
+ addMemberToList(MemberList::related,md,TRUE);
+ }
+ else if (md->isFriend())
+ {
+ addMemberToList(MemberList::friends,md,TRUE);
+ }
+ else
+ {
+ switch (md->memberType())
+ {
+ case MemberDef::Signal: // Qt specific
+ addMemberToList(MemberList::signals,md,TRUE);
+ break;
+ case MemberDef::DCOP: // KDE2 specific
+ addMemberToList(MemberList::dcopMethods,md,TRUE);
+ break;
+ case MemberDef::Property:
+ addMemberToList(MemberList::properties,md,TRUE);
+ break;
+ case MemberDef::Event:
+ addMemberToList(MemberList::events,md,TRUE);
+ break;
+ case MemberDef::Slot: // Qt specific
+ switch (prot)
+ {
+ case Protected:
+ case Package: // slots in packages are not possible!
+ addMemberToList(MemberList::proSlots,md,TRUE);
+ break;
+ case Public:
+ addMemberToList(MemberList::pubSlots,md,TRUE);
+ break;
+ case Private:
+ addMemberToList(MemberList::priSlots,md,TRUE);
+ break;
+ }
+ break;
+ default: // any of the other members
+ if (md->isStatic())
+ {
+ if (md->isVariable())
+ {
+ switch (prot)
+ {
+ case Protected:
+ addMemberToList(MemberList::proStaticAttribs,md,TRUE);
+ break;
+ case Package:
+ addMemberToList(MemberList::pacStaticAttribs,md,TRUE);
+ break;
+ case Public:
+ addMemberToList(MemberList::pubStaticAttribs,md,TRUE);
+ break;
+ case Private:
+ addMemberToList(MemberList::priStaticAttribs,md,TRUE);
+ break;
+ }
+ }
+ else // function
+ {
+ switch (prot)
+ {
+ case Protected:
+ addMemberToList(MemberList::proStaticMethods,md,TRUE);
+ break;
+ case Package:
+ addMemberToList(MemberList::pacStaticMethods,md,TRUE);
+ break;
+ case Public:
+ addMemberToList(MemberList::pubStaticMethods,md,TRUE);
+ break;
+ case Private:
+ addMemberToList(MemberList::priStaticMethods,md,TRUE);
+ break;
+ }
+ }
+ }
+ else // not static
+ {
+ if (md->isVariable())
+ {
+ switch (prot)
+ {
+ case Protected:
+ addMemberToList(MemberList::proAttribs,md,TRUE);
+ break;
+ case Package:
+ addMemberToList(MemberList::pacAttribs,md,TRUE);
+ break;
+ case Public:
+ addMemberToList(MemberList::pubAttribs,md,TRUE);
+ break;
+ case Private:
+ addMemberToList(MemberList::priAttribs,md,TRUE);
+ break;
+ }
+ }
+ else if (md->isTypedef() || md->isEnumerate() || md->isEnumValue())
+ {
+ switch (prot)
+ {
+ case Protected:
+ addMemberToList(MemberList::proTypes,md,TRUE);
+ break;
+ case Package:
+ addMemberToList(MemberList::pacTypes,md,TRUE);
+ break;
+ case Public:
+ addMemberToList(MemberList::pubTypes,md,TRUE);
+ break;
+ case Private:
+ addMemberToList(MemberList::priTypes,md,TRUE);
+ break;
+ }
+ }
+ else // member function
+ {
+ switch (prot)
+ {
+ case Protected:
+ addMemberToList(MemberList::proMethods,md,TRUE);
+ break;
+ case Package:
+ addMemberToList(MemberList::pacMethods,md,TRUE);
+ break;
+ case Public:
+ addMemberToList(MemberList::pubMethods,md,TRUE);
+ break;
+ case Private:
+ addMemberToList(MemberList::priMethods,md,TRUE);
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ /*******************************************************/
+ /* insert member in the detailed documentation section */
+ /*******************************************************/
+ if ((md->isRelated() && (extractPrivate || prot!=Private)) || md->isFriend())
+ {
+ addMemberToList(MemberList::relatedMembers,md,FALSE);
+ }
+ else
+ {
+ switch (md->memberType())
+ {
+ case MemberDef::Property:
+ addMemberToList(MemberList::propertyMembers,md,FALSE);
+ break;
+ case MemberDef::Event:
+ addMemberToList(MemberList::eventMembers,md,FALSE);
+ break;
+ case MemberDef::Signal: // fall through
+ case MemberDef::DCOP:
+ addMemberToList(MemberList::functionMembers,md,FALSE);
+ break;
+ case MemberDef::Slot:
+ switch (prot)
+ {
+ case Protected:
+ case Package:
+ case Public:
+ addMemberToList(MemberList::functionMembers,md,FALSE);
+ break;
+ case Private:
+ if (extractPrivate)
+ {
+ addMemberToList(MemberList::functionMembers,md,FALSE);
+ }
+ break;
+ }
+ break;
+ default: // any of the other members
+ if (prot!=Private || extractPrivate)
+ {
+ switch (md->memberType())
+ {
+ case MemberDef::Typedef:
+ addMemberToList(MemberList::typedefMembers,md,FALSE);
+ break;
+ case MemberDef::Enumeration:
+ addMemberToList(MemberList::enumMembers,md,FALSE);
+ break;
+ case MemberDef::EnumValue:
+ addMemberToList(MemberList::enumValMembers,md,FALSE);
+ break;
+ case MemberDef::Function:
+ if (md->isConstructor() || md->isDestructor())
+ {
+ MemberList *ml = createMemberList(MemberList::constructors);
+ ml->append(md);
+ }
+ else
+ {
+ addMemberToList(MemberList::functionMembers,md,FALSE);
+ }
+ break;
+ case MemberDef::Variable:
+ addMemberToList(MemberList::variableMembers,md,FALSE);
+ break;
+ default:
+ err("Unexpected member type %d found!\n",md->memberType());
+ }
+ }
+ break;
+ }
+ }
+
+ /*************************************************/
+ /* insert member in the appropriate member group */
+ /*************************************************/
+ // Note: this must be done AFTER inserting the member in the
+ // regular groups
+ //addMemberToGroup(md,groupId);
+
+ }
+
+ if (md->virtualness()==Pure)
+ {
+ m_impl->isAbstract=TRUE;
+ }
+
+ //::addClassMemberNameToIndex(md);
+ if (addToAllList &&
+ !(Config_getBool("HIDE_FRIEND_COMPOUNDS") &&
+ md->isFriend() &&
+ (QCString(md->typeString())=="friend class" ||
+ QCString(md->typeString())=="friend struct" ||
+ QCString(md->typeString())=="friend union")))
+ {
+ //printf("=======> adding member %s to class %s\n",md->name().data(),name().data());
+ MemberInfo *mi = new MemberInfo((MemberDef *)md,
+ prot,md->virtualness(),FALSE);
+ MemberNameInfo *mni=0;
+ if (m_impl->allMemberNameInfoSDict==0)
+ {
+ m_impl->allMemberNameInfoSDict = new MemberNameInfoSDict(17);
+ m_impl->allMemberNameInfoSDict->setAutoDelete(TRUE);
+ }
+ if ((mni=m_impl->allMemberNameInfoSDict->find(md->name())))
+ {
+ mni->append(mi);
+ }
+ else
+ {
+ mni = new MemberNameInfo(md->name());
+ mni->append(mi);
+ m_impl->allMemberNameInfoSDict->append(mni->memberName(),mni);
+ }
+ }
+}
+
+void ClassDef::insertMember(MemberDef *md)
+{
+ internalInsertMember(md,md->protection(),TRUE);
+}
+
+// compute the anchors for all members
+void ClassDef::computeAnchors()
+{
+ ClassDef *context = Config_getBool("INLINE_INHERITED_MEMB") ? this : 0;
+ const char *letters = "abcdefghijklmnopqrstuvwxyz0123456789";
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ int index = 0;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberList::detailedLists)==0)
+ {
+ setAnchors(context,letters[index++],ml);
+ }
+ }
+
+ if (m_impl->memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->setAnchors(context);
+ }
+ }
+}
+
+void ClassDef::distributeMemberGroupDocumentation()
+{
+ if (m_impl->memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->distributeMemberGroupDocumentation();
+ }
+ }
+}
+
+void ClassDef::findSectionsInDocumentation()
+{
+ docFindSections(documentation(),this,0,docFile());
+ if (m_impl->memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->findSectionsInDocumentation();
+ }
+ }
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberList::detailedLists)==0)
+ {
+ ml->findSectionsInDocumentation();
+ }
+ }
+}
+
+
+// add a file name to the used files set
+void ClassDef::insertUsedFile(const char *f)
+{
+ if (m_impl->files.find(f)==-1) m_impl->files.append(f);
+ if (m_impl->templateInstances)
+ {
+ QDictIterator<ClassDef> qdi(*m_impl->templateInstances);
+ ClassDef *cd;
+ for (qdi.toFirst();(cd=qdi.current());++qdi)
+ {
+ cd->insertUsedFile(f);
+ }
+ }
+}
+
+static void writeInheritanceSpecifier(OutputList &ol,BaseClassDef *bcd)
+{
+ if (bcd->prot!=Public || bcd->virt!=Normal)
+ {
+ ol.startTypewriter();
+ ol.docify(" [");
+ QStrList sl;
+ if (bcd->prot==Protected) sl.append("protected");
+ else if (bcd->prot==Private) sl.append("private");
+ if (bcd->virt==Virtual) sl.append("virtual");
+ const char *s=sl.first();
+ while (s)
+ {
+ ol.docify(s);
+ s=sl.next();
+ if (s) ol.docify(", ");
+ }
+ ol.docify("]");
+ ol.endTypewriter();
+ }
+}
+
+void ClassDef::setIncludeFile(FileDef *fd,
+ const char *includeName,bool local, bool force)
+{
+ //printf("ClassDef::setIncludeFile(%p,%s,%d,%d)\n",fd,includeName,local,force);
+ if (!m_impl->incInfo) m_impl->incInfo=new IncludeInfo;
+ if ((includeName && m_impl->incInfo->includeName.isEmpty()) ||
+ (fd!=0 && m_impl->incInfo->fileDef==0)
+ )
+ {
+ //printf("Setting file info\n");
+ m_impl->incInfo->fileDef = fd;
+ m_impl->incInfo->includeName = includeName;
+ m_impl->incInfo->local = local;
+ }
+ if (force && includeName) m_impl->incInfo->includeName = includeName;
+}
+
+// TODO: fix this: a nested template class can have multiple outer templates
+//ArgumentList *ClassDef::outerTemplateArguments() const
+//{
+// int ti;
+// ClassDef *pcd=0;
+// int pi=0;
+// if (m_impl->tempArgs) return m_impl->tempArgs;
+// // find the outer most class scope
+// while ((ti=name().find("::",pi))!=-1 &&
+// (pcd=getClass(name().left(ti)))==0
+// ) pi=ti+2;
+// if (pcd)
+// {
+// return pcd->templateArguments();
+// }
+// return 0;
+//}
+
+static void searchTemplateSpecs(/*in*/ Definition *d,
+ /*out*/ QList<ArgumentList> &result,
+ /*out*/ QCString &name)
+{
+ if (d->definitionType()==Definition::TypeClass)
+ {
+ if (d->getOuterScope())
+ {
+ searchTemplateSpecs(d->getOuterScope(),result,name);
+ }
+ ClassDef *cd=(ClassDef *)d;
+ if (!name.isEmpty()) name+="::";
+ QCString clName = d->localName();
+ if (clName.right(2)=="-g" || clName.right(2)=="-p")
+ {
+ clName = clName.left(clName.length()-2);
+ }
+ name+=clName;
+ bool isSpecialization = d->localName().find('<')!=-1;
+ if (cd->templateArguments())
+ {
+ result.append(cd->templateArguments());
+ if (!isSpecialization)
+ {
+ name+=tempArgListToString(cd->templateArguments());
+ }
+ }
+ }
+ else
+ {
+ name+=d->qualifiedName();
+ }
+}
+
+static void writeTemplateSpec(OutputList &ol,Definition *d,
+ const QCString &type)
+{
+ QList<ArgumentList> specs;
+ QCString name;
+ searchTemplateSpecs(d,specs,name);
+ if (specs.count()>0) // class has template scope specifiers
+ {
+ ol.startSubsubsection();
+ QListIterator<ArgumentList> spi(specs);
+ ArgumentList *al;
+ for (spi.toFirst();(al=spi.current());++spi)
+ {
+ ol.docify("template<");
+ Argument *a=al->first();
+ while (a)
+ {
+ ol.docify(a->type);
+ if (!a->name.isEmpty())
+ {
+ ol.docify(" ");
+ ol.docify(a->name);
+ }
+ if (a->defval.length()!=0)
+ {
+ ol.docify(" = ");
+ ol.docify(a->defval);
+ }
+ a=al->next();
+ if (a) ol.docify(", ");
+ }
+ ol.docify(">");
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.lineBreak();
+ ol.popGeneratorState();
+ }
+ ol.docify(type.lower()+" "+name);
+ ol.endSubsubsection();
+ ol.writeString("\n");
+ }
+}
+
+void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag)
+{
+ if (!briefDescription().isEmpty())
+ {
+ ol.startParagraph();
+ ol.parseDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.writeString(" \n");
+ ol.enable(OutputGenerator::RTF);
+ ol.popGeneratorState();
+
+ if (Config_getBool("REPEAT_BRIEF") ||
+ !documentation().isEmpty() ||
+ exampleFlag
+ )
+ {
+ writeMoreLink(ol,anchor());
+ }
+
+ //ol.pushGeneratorState();
+ //ol.disable(OutputGenerator::RTF);
+ //ol.newParagraph(); // FIXME:PARA
+ //ol.popGeneratorState();
+ ol.endParagraph();
+ }
+ ol.writeSynopsis();
+}
+
+void ClassDef::writeDetailedDocumentationBody(OutputList &ol)
+{
+ static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
+
+ ol.startTextBlock();
+
+ writeTemplateSpec(ol,this,compoundTypeString());
+
+ // repeat brief description
+ if (!briefDescription().isEmpty() && repeatBrief)
+ {
+ ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ }
+ if (!briefDescription().isEmpty() && repeatBrief &&
+ !documentation().isEmpty())
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ ol.writeString("\n\n");
+ ol.popGeneratorState();
+ }
+ // write documentation
+ if (!documentation().isEmpty())
+ {
+ ol.parseDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE);
+ }
+ // write type constraints
+ writeTypeConstraints(ol,this,m_impl->typeConstraints);
+
+ // write examples
+ if (hasExamples() && m_impl->exampleSDict)
+ {
+ ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": ");
+ ol.startDescForItem();
+ ol.startParagraph();
+ writeExample(ol,m_impl->exampleSDict);
+ ol.endParagraph();
+ ol.endDescForItem();
+ ol.endSimpleSect();
+ }
+ //ol.newParagraph();
+ writeSourceDef(ol,name());
+ ol.endTextBlock();
+}
+
+// write the detailed description for this class
+void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType, bool exampleFlag,
+ const QCString &title,const QCString &anchor)
+{
+ if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
+ !documentation().isEmpty() ||
+ (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef()) ||
+ exampleFlag)
+ {
+ ol.writeRuler();
+
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeAnchor(0,anchor.isEmpty() ? QCString("details") : anchor);
+ ol.popGeneratorState();
+
+ if (!anchor.isEmpty())
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ ol.disable(OutputGenerator::Man);
+ ol.writeAnchor(getOutputFileBase(),anchor);
+ ol.popGeneratorState();
+ }
+
+ ol.startGroupHeader();
+ ol.parseText(title);
+ ol.endGroupHeader();
+
+ writeDetailedDocumentationBody(ol);
+
+ }
+ else
+ {
+ writeTemplateSpec(ol,this,pageType);
+ }
+}
+
+void ClassDef::showUsedFiles(OutputList &ol)
+{
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+
+ ol.writeRuler();
+ if (fortranOpt)
+ {
+ ol.parseText(theTranslator->trGeneratedFromFilesFortran(
+ m_impl->lang==SrcLangExt_ObjC && m_impl->compType==Interface ? Class : m_impl->compType,
+ m_impl->files.count()==1));
+ }
+ else
+ {
+ ol.parseText(theTranslator->trGeneratedFromFiles(
+ m_impl->lang==SrcLangExt_ObjC && m_impl->compType==Interface ? Class : m_impl->compType,
+ m_impl->files.count()==1));
+ }
+
+
+ bool first=TRUE;
+ const char *file = m_impl->files.first();
+ while (file)
+ {
+ bool ambig;
+ FileDef *fd=findFileDef(Doxygen::inputNameDict,file,ambig);
+ if (fd)
+ {
+ if (first)
+ {
+ first=FALSE;
+ ol.startItemList();
+ }
+
+ ol.startItemListItem();
+ QCString path=fd->getPath();
+ if (Config_getBool("FULL_PATH_NAMES"))
+ {
+ ol.docify(stripFromPath(path));
+ }
+
+ QCString fname = fd->name();
+ if (!fd->getVersion().isEmpty()) // append version if available
+ {
+ fname += " (" + fd->getVersion() + ")";
+ }
+
+ // for HTML
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ if (fd->generateSourceFile())
+ {
+ ol.writeObjectLink(0,fd->getSourceFileBase(),0,fname);
+ }
+ else if (fd->isLinkable())
+ {
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,
+ fname);
+ }
+ else
+ {
+ ol.docify(fname);
+ }
+ ol.popGeneratorState();
+
+ // for other output formats
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ if (fd->isLinkable())
+ {
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,
+ fname);
+ }
+ else
+ {
+ ol.docify(fname);
+ }
+ ol.popGeneratorState();
+
+ ol.endItemListItem();
+ }
+ file=m_impl->files.next();
+ }
+ if (!first) ol.endItemList();
+
+ ol.popGeneratorState();
+}
+
+
+void ClassDef::writeInheritanceGraph(OutputList &ol)
+{
+ // count direct inheritance relations
+ int count=0;
+ BaseClassDef *ibcd;
+ if (m_impl->inheritedBy)
+ {
+ ibcd=m_impl->inheritedBy->first();
+ while (ibcd)
+ {
+ ClassDef *icd=ibcd->classDef;
+ if ( icd->isVisibleInHierarchy()) count++;
+ ibcd=m_impl->inheritedBy->next();
+ }
+ }
+ if (m_impl->inherits)
+ {
+ ibcd=m_impl->inherits->first();
+ while (ibcd)
+ {
+ ClassDef *icd=ibcd->classDef;
+ if ( icd->isVisibleInHierarchy()) count++;
+ ibcd=m_impl->inherits->next();
+ }
+ }
+
+
+ bool renderDiagram = FALSE;
+ if (Config_getBool("HAVE_DOT") &&
+ (Config_getBool("CLASS_DIAGRAMS") || Config_getBool("CLASS_GRAPH")))
+ // write class diagram using dot
+ {
+ DotClassGraph inheritanceGraph(this,DotNode::Inheritance);
+ if (!inheritanceGraph.isTrivial() && !inheritanceGraph.isTooBig())
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.startDotGraph();
+ ol.parseText(theTranslator->trClassDiagram(displayName()));
+ ol.endDotGraph(inheritanceGraph);
+ ol.popGeneratorState();
+ renderDiagram = TRUE;
+ }
+ }
+ else if (Config_getBool("CLASS_DIAGRAMS") && count>0)
+ // write class diagram using build-in generator
+ {
+ ClassDiagram diagram(this); // create a diagram of this class.
+ ol.startClassDiagram();
+ ol.disable(OutputGenerator::Man);
+ ol.parseText(theTranslator->trClassDiagram(displayName()));
+ ol.enable(OutputGenerator::Man);
+ ol.endClassDiagram(diagram,getOutputFileBase(),displayName());
+ renderDiagram = TRUE;
+ }
+
+ if (renderDiagram) // if we already show the inheritance relations graphically,
+ // then hide the text version
+ {
+ ol.disableAllBut(OutputGenerator::Man);
+ }
+
+ if (m_impl->inherits && (count=m_impl->inherits->count())>0)
+ {
+ ol.startParagraph();
+ //parseText(ol,theTranslator->trInherits()+" ");
+
+ QCString inheritLine = theTranslator->trInheritsList(m_impl->inherits->count());
+ QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in inheritLine with links to the classes
+ while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1)
+ {
+ ol.parseText(inheritLine.mid(index,newIndex-index));
+ bool ok;
+ uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ BaseClassDef *bcd=m_impl->inherits->at(entryIndex);
+ if (ok && bcd)
+ {
+ ClassDef *cd=bcd->classDef;
+
+ // use the class name but with the template arguments as given
+ // in the inheritance relation
+ QCString displayName = insertTemplateSpecifierInScope(
+ cd->displayName(),bcd->templSpecifiers);
+
+ if (cd->isLinkable())
+ {
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <base";
+ if (bcd->prot==Protected)
+ {
+ Doxygen::tagFile << " protection=\"protected\"";
+ }
+ else if (bcd->prot==Private)
+ {
+ Doxygen::tagFile << " protection=\"private\"";
+ }
+ if (bcd->virt==Virtual)
+ {
+ Doxygen::tagFile << " virtualness=\"virtual\"";
+ }
+ Doxygen::tagFile << ">" << convertToXML(cd->name())
+ << "</base>" << endl;
+ }
+ ol.writeObjectLink(cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ displayName);
+ }
+ else
+ {
+ ol.docify(displayName);
+ }
+ }
+ else
+ {
+ err("error: invalid marker %d in inherits list!\n",entryIndex);
+ }
+ index=newIndex+matchLen;
+ }
+ ol.parseText(inheritLine.right(inheritLine.length()-index));
+ ol.endParagraph();
+ }
+
+ // write subclasses
+ if (m_impl->inheritedBy && (count=m_impl->inheritedBy->count())>0)
+ {
+ ol.startParagraph();
+ QCString inheritLine = theTranslator->trInheritedByList(m_impl->inheritedBy->count());
+ QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in inheritLine with links to the classes
+ while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1)
+ {
+ ol.parseText(inheritLine.mid(index,newIndex-index));
+ bool ok;
+ uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ BaseClassDef *bcd=m_impl->inheritedBy->at(entryIndex);
+ if (ok && bcd)
+ {
+ ClassDef *cd=bcd->classDef;
+ if (cd->isLinkable())
+ {
+ ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),cd->anchor(),cd->displayName());
+ }
+ else
+ {
+ ol.docify(cd->displayName());
+ }
+ writeInheritanceSpecifier(ol,bcd);
+ }
+ index=newIndex+matchLen;
+ }
+ ol.parseText(inheritLine.right(inheritLine.length()-index));
+ ol.endParagraph();
+ }
+
+ if (renderDiagram)
+ {
+ ol.enableAll();
+ }
+}
+
+void ClassDef::writeCollaborationGraph(OutputList &ol)
+{
+ if (Config_getBool("HAVE_DOT") /*&& Config_getBool("COLLABORATION_GRAPH")*/)
+ {
+ DotClassGraph usageImplGraph(this,DotNode::Collaboration);
+ if (!usageImplGraph.isTrivial())
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.startDotGraph();
+ ol.parseText(theTranslator->trCollaborationDiagram(displayName()));
+ ol.endDotGraph(usageImplGraph);
+ ol.popGeneratorState();
+ }
+ }
+}
+
+void ClassDef::writeIncludeFiles(OutputList &ol)
+{
+ if (m_impl->incInfo /*&& Config_getBool("SHOW_INCLUDE_FILES")*/)
+ {
+ QCString nm=m_impl->incInfo->includeName.isEmpty() ?
+ (m_impl->incInfo->fileDef ?
+ m_impl->incInfo->fileDef->docName().data() : ""
+ ) :
+ m_impl->incInfo->includeName.data();
+ if (!nm.isEmpty())
+ {
+ ol.startParagraph();
+ ol.startTypewriter();
+ SrcLangExt lang = getLanguageFromFileName(nm);
+ bool isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java;
+ if (isIDLorJava)
+ {
+ ol.docify("import ");
+ }
+ else if (isObjectiveC())
+ {
+ ol.docify("#import ");
+ }
+ else
+ {
+ ol.docify("#include ");
+ }
+ if (m_impl->incInfo->local || isIDLorJava)
+ ol.docify("\"");
+ else
+ ol.docify("<");
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ ol.docify(nm);
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.enable(OutputGenerator::Html);
+ if (m_impl->incInfo->fileDef)
+ {
+ ol.writeObjectLink(0,m_impl->incInfo->fileDef->includeName(),0,nm);
+ }
+ else
+ {
+ ol.docify(nm);
+ }
+ ol.popGeneratorState();
+ if (m_impl->incInfo->local || isIDLorJava)
+ ol.docify("\"");
+ else
+ ol.docify(">");
+ if (isIDLorJava)
+ ol.docify(";");
+ ol.endTypewriter();
+ ol.endParagraph();
+ }
+ }
+}
+
+void ClassDef::writeAllMembersLink(OutputList &ol)
+{
+ // write link to list of all members (HTML only)
+ if (m_impl->allMemberNameInfoSDict &&
+ !Config_getBool("OPTIMIZE_OUTPUT_FOR_C")
+ )
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startParagraph();
+ ol.startTextLink(getMemberListFileName(),0);
+ ol.parseText(theTranslator->trListOfAllMembers());
+ ol.endTextLink();
+ ol.endParagraph();
+ ol.enableAll();
+ ol.popGeneratorState();
+ }
+}
+
+void ClassDef::writeMemberGroups(OutputList &ol,bool showInline)
+{
+ // write user defined member groups
+ if (m_impl->memberGroupSDict)
+ {
+ m_impl->memberGroupSDict->sort();
+ MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ if (!mg->allMembersInSameSection() || !m_impl->subGrouping) // group is in its own section
+ {
+ mg->writeDeclarations(ol,this,0,0,0,showInline);
+ }
+ else // add this group to the corresponding member section
+ {
+ //printf("addToDeclarationSection(%s)\n",mg->header().data());
+ //mg->addToDeclarationSection();
+ }
+ }
+ }
+}
+
+void ClassDef::writeNestedClasses(OutputList &ol,const QCString &title)
+{
+ // nested classes
+ if (m_impl->innerClasses)
+ {
+ m_impl->innerClasses->writeDeclaration(ol,0,title,TRUE);
+ }
+}
+
+void ClassDef::startMemberDocumentation(OutputList &ol)
+{
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ ol.disable(OutputGenerator::Html);
+ Doxygen::suppressDocWarnings = TRUE;
+ }
+}
+
+void ClassDef::endMemberDocumentation(OutputList &ol)
+{
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ ol.enable(OutputGenerator::Html);
+ Doxygen::suppressDocWarnings = FALSE;
+ }
+}
+
+void ClassDef::startMemberDeclarations(OutputList &ol)
+{
+ ol.startMemberSections();
+}
+
+void ClassDef::endMemberDeclarations(OutputList &ol)
+{
+ ol.endMemberSections();
+}
+
+void ClassDef::writeAuthorSection(OutputList &ol)
+{
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.writeString("\n");
+ ol.startGroupHeader();
+ ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
+ ol.endGroupHeader();
+ ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
+ ol.popGeneratorState();
+}
+
+
+void ClassDef::writeSummaryLinks(OutputList &ol)
+{
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::Class));
+ LayoutDocEntry *lde;
+ bool first=TRUE;
+
+ if (!vhdlOpt)
+ {
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ if (lde->kind()==LayoutDocEntry::ClassNestedClasses &&
+ m_impl->innerClasses &&
+ m_impl->innerClasses->declVisible()
+ )
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeSummaryLink(ol,"nested-classes",ls->title,first);
+ }
+ else if (lde->kind()== LayoutDocEntry::MemberDecl)
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ MemberList * ml = getMemberList(lmd->type);
+ if (ml && ml->declVisible())
+ {
+ writeSummaryLink(ol,ml->listTypeAsString(),lmd->title,first);
+ }
+ }
+ }
+ }
+ else // VDHL only
+ {
+ SDict<QCString>::Iterator li(m_impl->vhdlSummaryTitles);
+ for (li.toFirst();li.current();++li)
+ {
+ writeSummaryLink(ol,li.current()->data(),li.current()->data(),first);
+ }
+ }
+ if (!first)
+ {
+ ol.writeString(" </div>\n");
+ }
+ ol.popGeneratorState();
+}
+
+void ClassDef::writeTagFileMarker(OutputList &ol)
+{
+ // write markers for tag file processing to the output
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeString("<!-- doxytag: class=\"");
+ ol.docify(name());
+ ol.writeString("\" -->");
+ if (m_impl->inherits && m_impl->inherits->count()>0)
+ {
+ BaseClassListIterator bli(*m_impl->inherits);
+ ol.writeString("<!-- doxytag: inherits=\"");
+ BaseClassDef *bcd=0;
+ bool first=TRUE;
+ for (bli.toFirst();(bcd=bli.current());++bli)
+ {
+ if (!first) ol.writeString(",");
+ ol.docify(bcd->classDef->name());
+ first=FALSE;
+ }
+ ol.writeString("\" -->");
+ }
+ ol.popGeneratorState();
+
+ // write section to the tag file
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <compound kind=\"" << compoundTypeString();
+ Doxygen::tagFile << "\"";
+ if (isObjectiveC()) { Doxygen::tagFile << " objc=\"yes\""; }
+ Doxygen::tagFile << ">" << endl;
+ Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
+ Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
+ if (!anchor().isEmpty())
+ {
+ Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
+ }
+ if (m_impl->tempArgs)
+ {
+ ArgumentListIterator ali(*m_impl->tempArgs);
+ Argument *a;
+ for (;(a=ali.current());++ali)
+ {
+ Doxygen::tagFile << " <templarg>" << convertToXML(a->name) << "</templarg>" << endl;
+ }
+ }
+ }
+}
+
+#if 0
+void ClassDef::writeInlineDeclaration(OutputList &ol,bool first)
+{
+ //printf("ClassDef::writeInlineDeclaration for %s\n",name().data());
+ bool exampleFlag=hasExamples();
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::Class));
+ LayoutDocEntry *lde;
+ ol.startMemberHeader(first ? "nested-classes" : 0);
+ //ol.parseText(name()+" "+theTranslator->trClassDocumentation());
+ QCString s = compoundTypeString();
+ if (s.length()>0 && isId(s.at(0))) s[0]=toupper(s[0]);
+ s+=" "+name();
+ ol.parseText(s);
+ ol.endMemberHeader();
+ ol.writeAnchor(getOutputFileBase(),anchor());
+ ol.startInlineDescription();
+ writeBriefDescription(ol,exampleFlag);
+ ol.endInlineDescription();
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ if (lde->kind()==LayoutDocEntry::MemberDecl)
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ writeMemberDeclarations(ol,lmd->type,lmd->title,lmd->subscript,TRUE);
+ }
+ else if (lde->kind()==LayoutDocEntry::MemberGroups)
+ {
+ writeMemberGroups(ol,TRUE);
+ }
+ }
+}
+#endif
+
+/** Write class documentation inside another container (i.e. a group) */
+void ClassDef::writeInlineDocumentation(OutputList &ol)
+{
+ ol.addIndexItem(name(),0);
+ //printf("ClassDef::writeInlineDocumentation(%s)\n",name().data());
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::Class));
+ LayoutDocEntry *lde;
+
+ // part 1: anchor and title
+ QCString s = compoundTypeString()+" "+name();
+
+ // part 1a
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ { // only HTML only
+ ol.writeAnchor(0,anchor());
+ ol.startMemberDoc(0,0,0,0,FALSE);
+ ol.startMemberDocName(FALSE);
+ ol.parseText(s);
+ ol.endMemberDocName();
+ ol.endMemberDoc(FALSE);
+ ol.startIndent();
+ }
+ ol.popGeneratorState();
+
+ // part 1b
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ ol.disable(OutputGenerator::Man);
+ { // for LaTeX/RTF only
+ ol.writeAnchor(getOutputFileBase(),anchor());
+ }
+ ol.popGeneratorState();
+
+ // part 1c
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ {
+ // for LaTeX/RTF/Man
+ ol.startGroupHeader(1);
+ ol.parseText(s);
+ ol.endGroupHeader(1);
+ }
+ ol.popGeneratorState();
+
+ // part 2: the header and detailed description
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ switch (lde->kind())
+ {
+ case LayoutDocEntry::BriefDesc:
+ {
+ // since we already shown the brief description in the
+ // declaration part of the container, so we use this to
+ // show the details on top.
+ writeDetailedDocumentationBody(ol);
+ }
+ break;
+ case LayoutDocEntry::ClassInheritanceGraph:
+ writeInheritanceGraph(ol);
+ break;
+ case LayoutDocEntry::ClassCollaborationGraph:
+ writeCollaborationGraph(ol);
+ break;
+ case LayoutDocEntry::MemberDeclStart:
+ startMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::MemberDecl:
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ writeMemberDeclarations(ol,lmd->type,lmd->title,lmd->subscript,TRUE);
+ }
+ break;
+ case LayoutDocEntry::MemberGroups:
+ {
+ writeMemberGroups(ol,TRUE);
+ }
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
+ endMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::MemberDefStart:
+ startMemberDocumentation(ol);
+ break;
+ case LayoutDocEntry::MemberDef:
+ {
+ LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+ writeMemberDocumentation(ol,lmd->type,lmd->title,TRUE);
+ }
+ break;
+ case LayoutDocEntry::MemberDefEnd:
+ endMemberDocumentation(ol);
+ break;
+ default:
+ break;
+ }
+ }
+
+ // part 3: close the block
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ { // HTML only
+ ol.endIndent();
+ }
+ ol.popGeneratorState();
+
+ // part 4: write tag file information
+ writeTagFileMarker(ol);
+}
+
+void ClassDef::writeMoreLink(OutputList &ol,const QCString &anchor)
+{
+ // TODO: clean up this mess by moving it to
+ // the output generators...
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool rtfHyperlinks = Config_getBool("RTF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+
+ // HTML only
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.docify(" ");
+ ol.startTextLink(getOutputFileBase(),
+ anchor.isEmpty() ? QCString("details") : anchor);
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ ol.popGeneratorState();
+
+ if (!anchor.isEmpty())
+ {
+ ol.pushGeneratorState();
+ // LaTeX + RTF
+ ol.disable(OutputGenerator::Html);
+ ol.disable(OutputGenerator::Man);
+ if (!(usePDFLatex && pdfHyperlinks))
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ if (!rtfHyperlinks)
+ {
+ ol.disable(OutputGenerator::RTF);
+ }
+ ol.docify(" ");
+ ol.startTextLink(getOutputFileBase(), anchor);
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ // RTF only
+ ol.disable(OutputGenerator::Latex);
+ ol.writeString("\\par");
+ ol.popGeneratorState();
+ }
+}
+
+
+void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *header,bool localNames)
+{
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES");
+ static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES");
+ bool isLink = isLinkable();
+ if (isLink ||
+ (!hideUndocClasses &&
+ (!isLocal() || extractLocalClasses)
+ )
+ )
+ {
+ if (!found) // first class
+ {
+ ol.startMemberHeader("nested-classes");
+ if (header)
+ {
+ ol.parseText(header);
+ }
+ else if (vhdlOpt)
+ {
+ ol.parseText(VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE));
+ }
+ else
+ {
+ ol.parseText(fortranOpt ? theTranslator->trDataTypes() :
+ theTranslator->trCompounds());
+ }
+ ol.endMemberHeader();
+ ol.startMemberList();
+ found=TRUE;
+ }
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty() &&
+ !isReference()) // skip classes found in tag files
+ {
+ Doxygen::tagFile << " <class kind=\"" << compoundTypeString()
+ << "\">" << convertToXML(name()) << "</class>" << endl;
+ }
+ ol.startMemberItem(FALSE);
+ QCString ctype = compoundTypeString();
+ QCString cname;
+ if (localNames)
+ {
+ cname = localName();
+ if (cname.right(2)=="-p" || cname.right(2)=="-g")
+ {
+ cname = cname.left(cname.length()-2);
+ }
+ }
+ else
+ {
+ cname = displayName();
+ }
+
+ if (!vhdlOpt) // for VHDL we swap the name and the type
+ {
+ ol.writeString(ctype);
+ ol.writeString(" ");
+ ol.insertMemberAlign();
+ }
+ if (isLink)
+ {
+ ol.writeObjectLink(getReference(),
+ getOutputFileBase(),
+ anchor(),
+ cname
+ );
+ }
+ else
+ {
+ ol.startBold();
+ ol.docify(cname);
+ ol.endBold();
+ }
+ if (vhdlOpt) // now write the type
+ {
+ ol.writeString(" ");
+ ol.insertMemberAlign();
+ VhdlDocGen::writeClassType(this,ol,cname);
+ }
+ ol.endMemberItem();
+
+ // add the brief description if available
+ if (!briefDescription().isEmpty())
+ {
+ ol.startMemberDescription();
+ ol.parseDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+ if (isLinkableInProject())
+ {
+ writeMoreLink(ol,anchor());
+ }
+ ol.endMemberDescription();
+ }
+ }
+}
+
+void ClassDef::writeDocumentationContents(OutputList &ol,const QCString &pageTitle)
+{
+ ol.startContents();
+
+ QCString pageType = " ";
+ pageType += compoundTypeString();
+ toupper(pageType.at(1));
+
+ writeTagFileMarker(ol);
+
+ Doxygen::indexList.addIndexItem(this,0);
+
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase(),anchor());
+ Doxygen::searchIndex->addWord(localName(),TRUE);
+ }
+ bool exampleFlag=hasExamples();
+
+ //---------------------------------------- start flexible part -------------------------------
+
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::Class));
+ LayoutDocEntry *lde;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ switch (lde->kind())
+ {
+ case LayoutDocEntry::BriefDesc:
+ writeBriefDescription(ol,exampleFlag);
+ break;
+ case LayoutDocEntry::ClassIncludes:
+ writeIncludeFiles(ol);
+ break;
+ case LayoutDocEntry::ClassInheritanceGraph:
+ writeInheritanceGraph(ol);
+ break;
+ case LayoutDocEntry::ClassCollaborationGraph:
+ writeCollaborationGraph(ol);
+ break;
+ case LayoutDocEntry::ClassAllMembersLink:
+ writeAllMembersLink(ol);
+ break;
+ case LayoutDocEntry::MemberDeclStart:
+ startMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::MemberGroups:
+ writeMemberGroups(ol);
+ break;
+ case LayoutDocEntry::MemberDecl:
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ writeMemberDeclarations(ol,lmd->type,lmd->title,lmd->subscript);
+ }
+ break;
+ case LayoutDocEntry::ClassNestedClasses:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeNestedClasses(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
+ endMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::DetailedDesc:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeDetailedDescription(ol,pageType,exampleFlag,ls->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDefStart:
+ startMemberDocumentation(ol);
+ break;
+ case LayoutDocEntry::MemberDef:
+ {
+ LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+ writeMemberDocumentation(ol,lmd->type,lmd->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDefEnd:
+ endMemberDocumentation(ol);
+ break;
+ case LayoutDocEntry::ClassUsedFiles:
+ showUsedFiles(ol);
+ break;
+ case LayoutDocEntry::AuthorSection:
+ writeAuthorSection(ol);
+ break;
+ case LayoutDocEntry::NamespaceNestedNamespaces:
+ case LayoutDocEntry::NamespaceClasses:
+ case LayoutDocEntry::FileClasses:
+ case LayoutDocEntry::FileNamespaces:
+ case LayoutDocEntry::FileIncludes:
+ case LayoutDocEntry::FileIncludeGraph:
+ case LayoutDocEntry::FileIncludedByGraph:
+ case LayoutDocEntry::FileSourceLink:
+ case LayoutDocEntry::GroupClasses:
+ case LayoutDocEntry::GroupInlineClasses:
+ case LayoutDocEntry::GroupNamespaces:
+ case LayoutDocEntry::GroupDirs:
+ case LayoutDocEntry::GroupNestedGroups:
+ case LayoutDocEntry::GroupFiles:
+ case LayoutDocEntry::GroupGraph:
+ case LayoutDocEntry::GroupPageDocs:
+ case LayoutDocEntry::DirSubDirs:
+ case LayoutDocEntry::DirFiles:
+ case LayoutDocEntry::DirGraph:
+ err("Internal inconsistency: member %d should not be part of "
+ "LayoutDocManager::Class entry list\n",lde->kind());
+ break;
+ }
+ }
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ writeDocAnchorsToTagFile();
+ Doxygen::tagFile << " </compound>" << endl;
+ }
+ ol.endContents();
+}
+
+// write all documentation for this class
+void ClassDef::writeDocumentation(OutputList &ol)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ QCString pageTitle;
+
+ if (fortranOpt)
+ {
+ pageTitle = theTranslator->trCompoundReferenceFortran(displayName(),
+ m_impl->compType,
+ m_impl->tempArgs != 0);
+ }
+ else if (vhdlOpt)
+ {
+ // TODO: translate
+ pageTitle = VhdlDocGen::getClassTitle(this)+" Reference";
+ }
+ else
+ {
+ pageTitle = theTranslator->trCompoundReference(displayName(),
+ m_impl->compType == Interface && m_impl->lang==SrcLangExt_ObjC ? Class : m_impl->compType,
+ m_impl->tempArgs != 0);
+ }
+
+ startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_ClassVisible,!generateTreeView);
+ if (!generateTreeView)
+ {
+ if (getOuterScope()!=Doxygen::globalScope)
+ {
+ writeNavigationPath(ol);
+ }
+ ol.endQuickIndices();
+ }
+
+ startTitle(ol,getOutputFileBase(),this);
+ ol.parseText(pageTitle);
+ addGroupListToTitle(ol,this);
+ endTitle(ol,getOutputFileBase(),name());
+ writeDocumentationContents(ol,pageTitle);
+
+ if (generateTreeView)
+ {
+ writeNavigationPath(ol);
+ }
+
+ endFile(ol,TRUE);
+
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ writeMemberPages(ol);
+ }
+}
+
+void ClassDef::writeMemberPages(OutputList &ol)
+{
+ ///////////////////////////////////////////////////////////////////////////
+ //// Member definitions on separate pages
+ ///////////////////////////////////////////////////////////////////////////
+
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::detailedLists)
+ {
+ ml->writeDocumentationPage(ol,name(),this);
+ }
+ }
+
+ ol.popGeneratorState();
+}
+
+void ClassDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
+{
+ static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
+
+ ol.writeString(" <div class=\"navtab\">\n");
+ ol.writeString(" <table>\n");
+
+ if (m_impl->allMemberNameInfoSDict)
+ {
+ MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoSDict);
+ MemberNameInfo *mni;
+ for (;(mni=mnili.current());++mnili)
+ {
+ MemberNameInfoIterator mnii(*mni);
+ MemberInfo *mi;
+ for (mnii.toFirst();(mi=mnii.current());++mnii)
+ {
+ MemberDef *md=mi->memberDef;
+ if (md->getClassDef()==this && md->isLinkable())
+ {
+ ol.writeString(" <tr><td class=\"navtab\">");
+ if (md->isLinkableInProject())
+ {
+ if (md==currentMd) // selected item => highlight
+ {
+ ol.writeString("<a class=\"qindexHL\" ");
+ }
+ else
+ {
+ ol.writeString("<a class=\"qindex\" ");
+ }
+ ol.writeString("href=\"");
+ if (createSubDirs) ol.writeString("../../");
+ ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
+ ol.writeString("\">");
+ ol.writeString(md->name());
+ ol.writeString("</a>");
+ }
+ ol.writeString("</td></tr>\n");
+ }
+ }
+ }
+ }
+
+ ol.writeString(" </table>\n");
+ ol.writeString(" </div>\n");
+}
+
+
+
+void ClassDef::writeDocumentationForInnerClasses(OutputList &ol)
+{
+ // write inner classes after the parent, so the tag files contain
+ // the definition in proper order!
+ if (m_impl->innerClasses)
+ {
+ ClassSDict::Iterator cli(*m_impl->innerClasses);
+ ClassDef *innerCd;
+ for (cli.toFirst();(innerCd=cli.current());++cli)
+ {
+ if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
+ (innerCd->protection()!=Private || Config_getBool("EXTRACT_PRIVATE"))
+ )
+ {
+ msg("Generating docs for nested compound %s...\n",qPrint(innerCd->name()));
+ innerCd->writeDocumentation(ol);
+ innerCd->writeMemberList(ol);
+ }
+ innerCd->writeDocumentationForInnerClasses(ol);
+ }
+ }
+}
+
+// write the list of all (inherited) members for this class
+void ClassDef::writeMemberList(OutputList &ol)
+{
+ static bool cOpt = Config_getBool("OPTIMIZE_OUTPUT_FOR_C");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ if (m_impl->allMemberNameInfoSDict==0 || cOpt) return;
+ // only for HTML
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QCString memListFile = getMemberListFileName();
+ startFile(ol,memListFile,memListFile,theTranslator->trMemberList(),
+ HLI_ClassVisible,!generateTreeView,getOutputFileBase());
+ if (!generateTreeView)
+ {
+ if (getOuterScope()!=Doxygen::globalScope)
+ {
+ writeNavigationPath(ol);
+ }
+ ol.endQuickIndices();
+ }
+ startTitle(ol,0);
+ ol.parseText(displayName()+" "+theTranslator->trMemberList());
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.parseText(theTranslator->trThisIsTheListOfAllMembers());
+ ol.writeObjectLink(getReference(),getOutputFileBase(),anchor(),displayName());
+ ol.parseText(theTranslator->trIncludingInheritedMembers());
+
+ //ol.startItemList();
+ ol.writeString("<table>\n");
+
+ //MemberNameInfo *mni=m_impl->allMemberNameInfoList->first();
+ MemberNameInfoSDict::Iterator mnii(*m_impl->allMemberNameInfoSDict);
+ MemberNameInfo *mni;
+ for (mnii.toFirst();(mni=mnii.current());++mnii)
+ {
+ MemberInfo *mi=mni->first();
+ while (mi)
+ {
+ MemberDef *md=mi->memberDef;
+ ClassDef *cd=md->getClassDef();
+ Protection prot = mi->prot;
+ Specifier virt=md->virtualness();
+
+ //printf("%s: Member %s of class %s md->protection()=%d mi->prot=%d prot=%d inherited=%d\n",
+ // name().data(),md->name().data(),cd->name().data(),md->protection(),mi->prot,prot,mi->inherited);
+
+
+ if (cd && !md->name().isEmpty() && md->name()[0]!='@')
+ {
+ bool memberWritten=FALSE;
+ if (cd->isLinkable() && md->isLinkable())
+ // create a link to the documentation
+ {
+ QCString name=mi->ambiguityResolutionScope+md->name();
+ //ol.writeListItem();
+ ol.writeString(" <tr class=\"memlist\"><td>");
+ if (cd->isObjectiveC())
+ {
+ if (md->isObjCMethod())
+ {
+ if (md->isStatic())
+ ol.writeString("+&#160;</td><td>");
+ else
+ ol.writeString("-&#160;</td><td>");
+ }
+ else
+ ol.writeString("</td><td>");
+ }
+ if (md->isObjCMethod())
+ {
+ ol.writeObjectLink(md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),md->name());
+ }
+ else
+ {
+ //Definition *bd = md->getGroupDef();
+ //if (bd==0) bd=cd;
+ ol.writeObjectLink(md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),name);
+
+ if ( md->isFunction() || md->isSignal() || md->isSlot() ||
+ (md->isFriend() && md->argsString()))
+ ol.docify(md->argsString());
+ else if (md->isEnumerate())
+ ol.parseText(" "+theTranslator->trEnumName());
+ else if (md->isEnumValue())
+ ol.parseText(" "+theTranslator->trEnumValue());
+ else if (md->isTypedef())
+ ol.docify(" typedef");
+ else if (md->isFriend() && !strcmp(md->typeString(),"friend class"))
+ ol.docify(" class");
+ //ol.writeString("\n");
+ }
+ ol.writeString("</td>");
+ memberWritten=TRUE;
+ }
+ else if (!Config_getBool("HIDE_UNDOC_MEMBERS") &&
+ (md->protection()!=Private || Config_getBool("EXTRACT_PRIVATE") || md->isFriend())
+ ) // no documentation,
+ // generate link to the class instead.
+ {
+ //ol.writeListItem();
+ ol.writeString(" <tr bgcolor=\"#f0f0f0\"><td>");
+ if (cd->isObjectiveC())
+ {
+ if (md->isObjCMethod())
+ {
+ if (md->isStatic())
+ ol.writeString("+&#160;</td><td>");
+ else
+ ol.writeString("-&#160;</td><td>");
+ }
+ else
+ ol.writeString("</td><td>");
+ }
+ ol.startBold();
+ ol.docify(md->name());
+ ol.endBold();
+ if (!md->isObjCMethod())
+ {
+ if ( md->isFunction() || md->isSignal() || md->isSlot() )
+ ol.docify(md->argsString());
+ else if (md->isEnumerate())
+ ol.parseText(" "+theTranslator->trEnumName());
+ else if (md->isEnumValue())
+ ol.parseText(" "+theTranslator->trEnumValue());
+ else if (md->isTypedef())
+ ol.docify(" typedef");
+ }
+ ol.writeString(" (");
+ ol.parseText(theTranslator->trDefinedIn()+" ");
+ if (cd->isLinkable())
+ {
+ ol.writeObjectLink(
+ cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ cd->displayName());
+ }
+ else
+ {
+ ol.startBold();
+ ol.docify(cd->displayName());
+ ol.endBold();
+ }
+ ol.writeString(")");
+ ol.writeString("</td>");
+ memberWritten=TRUE;
+ }
+ if (memberWritten)
+ {
+ ol.writeString("<td>");
+ ol.writeObjectLink(cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ md->category() ?
+ md->category()->displayName() :
+ cd->displayName());
+ ol.writeString("</td>");
+ ol.writeString("<td>");
+ }
+ if (
+ (prot!=Public || (virt!=Normal && m_impl->lang!=SrcLangExt_ObjC) ||
+ md->isFriend() || md->isRelated() || md->isExplicit() ||
+ md->isMutable() || (md->isInline() && Config_getBool("INLINE_INFO")) ||
+ md->isSignal() || md->isSlot() ||
+ md->isStatic() || vhdlOpt
+ )
+ && memberWritten)
+ {
+ ol.startTypewriter();
+ ol.docify(" [");
+ QStrList sl;
+ if (vhdlOpt) sl.append(VhdlDocGen::trVhdlType(
+ md->getMemberSpecifiers())); //append vhdl type
+ else if (md->isFriend()) sl.append("friend");
+ else if (md->isRelated()) sl.append("related");
+ else
+ {
+ if (Config_getBool("INLINE_INFO") && md->isInline())
+ sl.append("inline");
+ if (md->isExplicit()) sl.append("explicit");
+ if (md->isMutable()) sl.append("mutable");
+ if (prot==Protected) sl.append("protected");
+ else if (prot==Private) sl.append("private");
+ else if (prot==Package) sl.append("package");
+ if (virt==Virtual &&
+ m_impl->lang!=SrcLangExt_ObjC) sl.append("virtual");
+ else if (virt==Pure) sl.append("pure virtual");
+ if (md->isStatic()) sl.append("static");
+ if (md->isSignal()) sl.append("signal");
+ if (md->isSlot()) sl.append("slot");
+ }
+ const char *s=sl.first();
+ while (s)
+ {
+ ol.docify(s);
+ s=sl.next();
+ if (s) ol.docify(", ");
+ }
+ ol.docify("]");
+ ol.endTypewriter();
+ }
+ if (memberWritten)
+ {
+ ol.writeString("</td>");
+ ol.writeString("</tr>\n");
+ }
+ }
+ mi=mni->next();
+ }
+ }
+ //ol.endItemList();
+
+ ol.writeString("</table>");
+
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+
+// add a reference to an example
+bool ClassDef::addExample(const char *anchor,const char *nameStr,
+ const char *file)
+{
+ if (m_impl->exampleSDict==0)
+ {
+ m_impl->exampleSDict = new ExampleSDict;
+ m_impl->exampleSDict->setAutoDelete(TRUE);
+ }
+ if (!m_impl->exampleSDict->find(nameStr))
+ {
+ Example *e=new Example;
+ e->anchor=anchor;
+ e->name=nameStr;
+ e->file=file;
+ m_impl->exampleSDict->inSort(nameStr,e);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+// returns TRUE if this class is used in an example
+bool ClassDef::hasExamples()
+{
+ if (m_impl->exampleSDict==0)
+ return FALSE;
+ else
+ return m_impl->exampleSDict->count()>0;
+}
+
+
+void ClassDef::setTemplateArguments(ArgumentList *al)
+{
+ if (al==0) return;
+ if (!m_impl->tempArgs) delete m_impl->tempArgs; // delete old list if needed
+ m_impl->tempArgs=new ArgumentList;
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (;(a=ali.current());++ali)
+ {
+ m_impl->tempArgs->append(new Argument(*a));
+ }
+}
+
+void ClassDef::setTypeConstraints(ArgumentList *al)
+{
+ if (al==0) return;
+ if (!m_impl->typeConstraints) delete m_impl->typeConstraints;
+ m_impl->typeConstraints = new ArgumentList;
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (;(a=ali.current());++ali)
+ {
+ m_impl->typeConstraints->append(new Argument(*a));
+ }
+}
+
+/*! Returns \c TRUE iff this class or a class inheriting from this class
+ * is \e not defined in an external tag file.
+ */
+bool ClassDef::hasNonReferenceSuperClass()
+{
+ bool found=!isReference() && isLinkableInProject() && !isHidden();
+ if (found)
+ {
+ return TRUE; // we're done if this class is not a reference
+ }
+ if (m_impl->inheritedBy)
+ {
+ BaseClassListIterator bcli(*m_impl->inheritedBy);
+ for ( ; bcli.current() && !found ; ++bcli ) // for each super class
+ {
+ ClassDef *bcd=bcli.current()->classDef;
+ // recurse into the super class branch
+ found = found || bcd->hasNonReferenceSuperClass();
+ if (!found)
+ {
+ // look for template instances that might have non-reference super classes
+ QDict<ClassDef> *cil = bcd->getTemplateInstances();
+ if (cil)
+ {
+ QDictIterator<ClassDef> tidi(*cil);
+ for ( ; tidi.current() && !found ; ++tidi) // for each template instance
+ {
+ // recurse into the template instance branch
+ found = found || tidi.current()->hasNonReferenceSuperClass();
+ }
+ }
+ }
+ }
+ }
+ return found;
+}
+
+/*! called from MemberDef::writeDeclaration() to (recusively) write the
+ * definition of an anonymous struct, union or class.
+ */
+void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
+{
+ //ol.insertMemberAlign();
+ //printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup);
+
+ //if (inGroup && md && md->getClassDef()==this) return;
+
+ ol.docify(compoundTypeString());
+ int ri=name().findRev("::");
+ if (ri==-1) ri=name().length();
+ QCString cn=name().right(name().length()-ri-2);
+ if (!cn.isEmpty() && cn.at(0)!='@' && md)
+ {
+ if (cn.right(2)=="-p" || cn.right(2)=="-g")
+ {
+ cn = cn.left(cn.length()-2);
+ }
+ ol.docify(" ");
+ if (isLinkable())
+ {
+ ol.writeObjectLink(0,0,md->anchor(),cn);
+ }
+ else
+ {
+ ol.startBold();
+ ol.docify(cn);
+ ol.endBold();
+ }
+ }
+ ol.docify(" {");
+ ol.endMemberItem();
+
+ // write user defined member groups
+ if (m_impl->memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->setInGroup(inGroup);
+ mg->writePlainDeclarations(ol,this,0,0,0);
+ }
+ }
+
+ writePlainMemberDeclaration(ol,MemberList::pubTypes,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pubMethods,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pubAttribs,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pubSlots,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::signals,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::dcopMethods,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::properties,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::events,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pubStaticMethods,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pubStaticAttribs,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::proTypes,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::proMethods,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::proAttribs,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::proSlots,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::proStaticMethods,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::proStaticAttribs,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pacTypes,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pacMethods,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pacAttribs,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pacStaticMethods,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::pacStaticAttribs,inGroup);
+ if (Config_getBool("EXTRACT_PRIVATE"))
+ {
+ writePlainMemberDeclaration(ol,MemberList::priTypes,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::priMethods,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::priAttribs,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::priSlots,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::priStaticMethods,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::priStaticAttribs,inGroup);
+ }
+ writePlainMemberDeclaration(ol,MemberList::friends,inGroup);
+ writePlainMemberDeclaration(ol,MemberList::related,inGroup);
+}
+
+/*! a link to this class is possible within this project */
+bool ClassDef::isLinkableInProject() const
+{
+ static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
+ static bool extractLocal = Config_getBool("EXTRACT_LOCAL_CLASSES");
+ static bool extractStatic = Config_getBool("EXTRACT_STATIC");
+ static bool hideUndoc = Config_getBool("HIDE_UNDOC_CLASSES");
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->isLinkableInProject();
+ }
+ else
+ {
+ return !name().isEmpty() && /* has a name */
+ !isArtificial() && !isHidden() && /* not hidden */
+ name().find('@')==-1 && /* not anonymous */
+ (m_impl->prot!=Private || extractPrivate) && /* private */
+ (!m_impl->isLocal || extractLocal) && /* local */
+ (hasDocumentation() || !hideUndoc) && /* documented */
+ (!m_impl->isStatic || extractStatic) && /* static */
+ !isReference(); /* not an external reference */
+ }
+}
+
+bool ClassDef::isLinkable() const
+{
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->isLinkable();
+ }
+ else
+ {
+ return isLinkableInProject() || isReference();
+ }
+}
+
+
+/*! the class is visible in a class diagram, or class hierarchy */
+bool ClassDef::isVisibleInHierarchy()
+{
+ static bool allExternals = Config_getBool("ALLEXTERNALS");
+ static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
+ static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES");
+ static bool extractStatic = Config_getBool("EXTRACT_STATIC");
+
+ return // show all classes or a subclass is visible
+ (allExternals || hasNonReferenceSuperClass()) &&
+ // and not an anonymous compound
+ name().find('@')==-1 &&
+ // not an artificially introduced class
+ !isArtificial() &&
+ // and not privately inherited
+ (m_impl->prot!=Private || extractPrivate) &&
+ // documented or shown anyway or documentation is external
+ (hasDocumentation() ||
+ !hideUndocClasses ||
+ (m_impl->templateMaster && m_impl->templateMaster->hasDocumentation()) ||
+ isReference()
+ ) &&
+ // is not part of an unnamed namespace or shown anyway
+ (!m_impl->isStatic || extractStatic);
+}
+
+bool ClassDef::hasDocumentation() const
+{
+ return Definition::hasDocumentation();
+}
+
+//----------------------------------------------------------------------
+// recursive function:
+// returns TRUE iff class definition `bcd' represents an (in)direct base
+// class of class definition `cd'.
+
+bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level)
+{
+ bool found=FALSE;
+ //printf("isBaseClass(cd=%s) looking for %s\n",name().data(),bcd->name().data());
+ if (level>256)
+ {
+ err("Possible recursive class relation while inside %s and looking for %s\n",qPrint(name()),qPrint(bcd->name()));
+ abort();
+ return FALSE;
+ }
+ if (baseClasses())
+ {
+ // Beware: trying to optimise the iterator away using ->first() & ->next()
+ // causes bug 625531
+ BaseClassListIterator bcli(*baseClasses());
+ for ( ; bcli.current() && !found ; ++bcli)
+ {
+ ClassDef *ccd=bcli.current()->classDef;
+ if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster();
+ //printf("isBaseClass() baseclass %s\n",ccd->name().data());
+ if (ccd==bcd)
+ found=TRUE;
+ else
+ found=ccd->isBaseClass(bcd,followInstances,level+1);
+ }
+ }
+ return found;
+}
+
+//----------------------------------------------------------------------------
+
+static bool isStandardFunc(MemberDef *md)
+{
+ return md->name()=="operator=" || // assignment operator
+ md->isConstructor() || // constructor
+ md->isDestructor(); // destructor
+}
+
+/*!
+ * recusively merges the `all members' lists of a class base
+ * with that of this class. Must only be called for classes without
+ * subclasses!
+ */
+void ClassDef::mergeMembers()
+{
+ if (m_impl->membersMerged) return;
+
+ static bool optimizeOutputForJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ QCString sep="::";
+ if (optimizeOutputForJava || vhdlOpt) sep=".";
+ int sepLen = sep.length();
+
+ m_impl->membersMerged=TRUE;
+ //printf(" mergeMembers for %s\n",name().data());
+ bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB" );
+ if (baseClasses())
+ {
+ //printf(" => has base classes!\n");
+ BaseClassListIterator bcli(*baseClasses());
+ BaseClassDef *bcd;
+ for ( ; (bcd=bcli.current()) ; ++bcli )
+ {
+ ClassDef *bClass=bcd->classDef;
+
+ // merge the members in the base class of this inheritance branch first
+ bClass->mergeMembers();
+
+ MemberNameInfoSDict *srcMnd = bClass->memberNameInfoSDict();
+ MemberNameInfoSDict *dstMnd = m_impl->allMemberNameInfoSDict;
+
+ if (srcMnd)
+ {
+ MemberNameInfoSDict::Iterator srcMnili(*srcMnd);
+ MemberNameInfo *srcMni;
+ for ( ; (srcMni=srcMnili.current()) ; ++srcMnili)
+ {
+ //printf(" Base member name %s\n",srcMni->memberName());
+ MemberNameInfo *dstMni;
+ if (dstMnd!=0 && (dstMni=dstMnd->find(srcMni->memberName())))
+ // a member with that name is already in the class.
+ // the member may hide or reimplement the one in the sub class
+ // or there may be another path to the base class that is already
+ // visited via another branch in the class hierarchy.
+ {
+ MemberNameInfoIterator srcMnii(*srcMni);
+ MemberInfo *srcMi;
+ for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
+ {
+ MemberDef *srcMd = srcMi->memberDef;
+ bool found=FALSE;
+ bool ambigue=FALSE;
+ bool hidden=FALSE;
+ MemberNameInfoIterator dstMnii(*dstMni);
+ MemberInfo *dstMi;
+ ClassDef *srcCd = srcMd->getClassDef();
+ for ( ; (dstMi=dstMnii.current()) && !found; ++dstMnii )
+ {
+ MemberDef *dstMd = dstMi->memberDef;
+ if (srcMd!=dstMd) // different members
+ {
+ ClassDef *dstCd = dstMd->getClassDef();
+ //printf(" Is %s a base class of %s?\n",srcCd->name().data(),dstCd->name().data());
+ if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE))
+ // member is in the same or a base class
+ {
+ LockingPtr<ArgumentList> srcAl = srcMd->argumentList();
+ LockingPtr<ArgumentList> dstAl = dstMd->argumentList();
+ found=matchArguments2(
+ srcMd->getOuterScope(),srcMd->getFileDef(),srcAl.pointer(),
+ dstMd->getOuterScope(),dstMd->getFileDef(),dstAl.pointer(),
+ TRUE
+ );
+ //printf(" Yes, matching (%s<->%s): %d\n",
+ // argListToString(srcMd->argumentList()).data(),
+ // argListToString(dstMd->argumentList()).data(),
+ // found);
+ hidden = hidden || !found;
+ }
+ else // member is in a non base class => multiple inheritance
+ // using the same base class.
+ {
+ //printf("$$ Existing member %s %s add scope %s\n",
+ // dstMi->ambiguityResolutionScope.data(),
+ // dstMd->name().data(),
+ // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
+
+ QCString scope=dstMi->scopePath.left(dstMi->scopePath.find(sep)+sepLen);
+ if (scope!=dstMi->ambiguityResolutionScope.left(scope.length()))
+ dstMi->ambiguityResolutionScope.prepend(scope);
+ ambigue=TRUE;
+ }
+ }
+ else // same members
+ {
+ // do not add if base class is virtual or
+ // if scope paths are equal or
+ // if base class is an interface (and thus implicitly virtual).
+ //printf("same member found srcMi->virt=%d dstMi->virt=%d\n",srcMi->virt,dstMi->virt);
+ if ((srcMi->virt!=Normal && dstMi->virt!=Normal) ||
+ bClass->name()+sep+srcMi->scopePath == dstMi->scopePath ||
+ dstMd->getClassDef()->compoundType()==Interface
+ )
+ {
+ found=TRUE;
+ }
+ else // member can be reached via multiple paths in the
+ // inheritance tree
+ {
+ //printf("$$ Existing member %s %s add scope %s\n",
+ // dstMi->ambiguityResolutionScope.data(),
+ // dstMd->name().data(),
+ // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data());
+
+ QCString scope=dstMi->scopePath.left(dstMi->scopePath.find(sep)+sepLen);
+ if (scope!=dstMi->ambiguityResolutionScope.left(scope.length()))
+ {
+ dstMi->ambiguityResolutionScope.prepend(scope);
+ }
+ ambigue=TRUE;
+ }
+ }
+ }
+ //printf("member %s::%s hidden %d ambigue %d srcMi->ambigClass=%p\n",
+ // srcCd->name().data(),srcMd->name().data(),hidden,ambigue,srcMi->ambigClass);
+
+ // TODO: fix the case where a member is hidden by inheritance
+ // of a member with the same name but with another prototype,
+ // while there is more than one path to the member in the
+ // base class due to multiple inheritance. In this case
+ // it seems that the member is not reachable by prefixing a
+ // scope name either (according to my compiler). Currently,
+ // this case is shown anyway.
+ if (!found && srcMd->protection()!=Private)
+ {
+ Protection prot=srcMd->protection();
+ if (bcd->prot==Protected && prot==Public) prot=bcd->prot;
+ else if (bcd->prot==Private) prot=bcd->prot;
+
+ if (inlineInheritedMembers)
+ {
+ if (!isStandardFunc(srcMd))
+ {
+ //printf(" insertMember `%s'\n",srcMd->name().data());
+ internalInsertMember(srcMd,prot,FALSE);
+ }
+ }
+
+ Specifier virt=srcMi->virt;
+ if (srcMi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
+
+ MemberInfo *newMi = new MemberInfo(srcMd,prot,virt,TRUE);
+ newMi->scopePath=bClass->name()+sep+srcMi->scopePath;
+ if (ambigue)
+ {
+ //printf("$$ New member %s %s add scope %s::\n",
+ // srcMi->ambiguityResolutionScope.data(),
+ // srcMd->name().data(),
+ // bClass->name().data());
+
+ QCString scope=bClass->name()+sep;
+ if (scope!=srcMi->ambiguityResolutionScope.left(scope.length()))
+ {
+ newMi->ambiguityResolutionScope=
+ scope+srcMi->ambiguityResolutionScope.copy();
+ }
+ }
+ if (hidden)
+ {
+ if (srcMi->ambigClass==0)
+ {
+ newMi->ambigClass=bClass;
+ newMi->ambiguityResolutionScope=bClass->name()+sep;
+ }
+ else
+ {
+ newMi->ambigClass=srcMi->ambigClass;
+ newMi->ambiguityResolutionScope=srcMi->ambigClass->name()+sep;
+ }
+ }
+ dstMni->append(newMi);
+ }
+ }
+ }
+ else // base class has a member that is not in the sub class => copy
+ {
+ // create a deep copy of the list (only the MemberInfo's will be
+ // copied, not the actual MemberDef's)
+ MemberNameInfo *newMni = 0;
+ newMni = new MemberNameInfo(srcMni->memberName());
+
+ // copy the member(s) from the base to the sub class
+ MemberNameInfoIterator mnii(*srcMni);
+ MemberInfo *mi;
+ for (;(mi=mnii.current());++mnii)
+ {
+ Protection prot = mi->prot;
+ if (bcd->prot==Protected)
+ {
+ if (prot==Public) prot=Protected;
+ }
+ else if (bcd->prot==Private)
+ {
+ prot=Private;
+ }
+ //printf("%s::%s: prot=%d bcd->prot=%d result=%d\n",
+ // name().data(),mi->memberDef->name().data(),mi->prot,
+ // bcd->prot,prot);
+
+ if (mi->prot!=Private)
+ {
+ Specifier virt=mi->virt;
+ if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
+
+ if (inlineInheritedMembers)
+ {
+ if (!isStandardFunc(mi->memberDef))
+ {
+ //printf(" insertMember `%s'\n",mi->memberDef->name().data());
+ internalInsertMember(mi->memberDef,prot,FALSE);
+ }
+ }
+ //printf("Adding!\n");
+ MemberInfo *newMi=new MemberInfo(mi->memberDef,prot,virt,TRUE);
+ newMi->scopePath=bClass->name()+sep+mi->scopePath;
+ newMi->ambigClass=mi->ambigClass;
+ newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope.copy();
+ newMni->append(newMi);
+ }
+ }
+
+ if (dstMnd==0)
+ {
+ m_impl->allMemberNameInfoSDict = new MemberNameInfoSDict(17);
+ m_impl->allMemberNameInfoSDict->setAutoDelete(TRUE);
+ dstMnd = m_impl->allMemberNameInfoSDict;
+ }
+ // add it to the dictionary
+ dstMnd->append(newMni->memberName(),newMni);
+ }
+ }
+ }
+ }
+ }
+ //printf(" end mergeMembers\n");
+}
+
+//----------------------------------------------------------------------------
+
+/*! Merges the members of a Objective-C category into this class.
+ */
+void ClassDef::mergeCategory(ClassDef *category)
+{
+ category->setCategoryOf(this);
+ category->setArtificial(TRUE);
+
+ MemberNameInfoSDict *srcMnd = category->memberNameInfoSDict();
+ MemberNameInfoSDict *dstMnd = m_impl->allMemberNameInfoSDict;
+
+ if (srcMnd && dstMnd)
+ {
+ MemberNameInfoSDict::Iterator srcMnili(*srcMnd);
+ MemberNameInfo *srcMni;
+ for ( ; (srcMni=srcMnili.current()) ; ++srcMnili)
+ {
+ MemberNameInfo *dstMni=dstMnd->find(srcMni->memberName());
+ if (dstMni) // method is already defined in the class
+ {
+ // TODO: we should remove the other member and insert this one.
+ }
+ else // new method name
+ {
+ // create a deep copy of the list
+ MemberNameInfo *newMni = 0;
+ newMni = new MemberNameInfo(srcMni->memberName());
+
+ // copy the member(s) from the category to this class
+ MemberNameInfoIterator mnii(*srcMni);
+ MemberInfo *mi;
+ for (;(mi=mnii.current());++mnii)
+ {
+ //printf("Adding '%s'\n",mi->memberDef->name().data());
+ MemberInfo *newMi=new MemberInfo(mi->memberDef,mi->prot,mi->virt,mi->inherited);
+ newMi->scopePath=mi->scopePath;
+ newMi->ambigClass=mi->ambigClass;
+ newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope;
+ newMni->append(newMi);
+ mi->memberDef->moveTo(this);
+ mi->memberDef->setCategory(category);
+ internalInsertMember(mi->memberDef,mi->prot,FALSE);
+ }
+
+ // add it to the dictionary
+ dstMnd->append(newMni->memberName(),newMni);
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void ClassDef::addUsedClass(ClassDef *cd,const char *accessName)
+{
+ //printf("%s::addUsedClass(%s,%s)\n",name().data(),cd->name().data(),accessName);
+ if (m_impl->usesImplClassDict==0)
+ {
+ m_impl->usesImplClassDict = new UsesClassDict(17);
+ m_impl->usesImplClassDict->setAutoDelete(TRUE);
+ }
+ UsesClassDef *ucd=m_impl->usesImplClassDict->find(cd->name());
+ if (ucd==0)
+ {
+ ucd = new UsesClassDef(cd);
+ m_impl->usesImplClassDict->insert(cd->name(),ucd);
+ //printf("Adding used class %s to class %s via accessor %s\n",
+ // cd->name().data(),name().data(),accessName);
+ }
+ ucd->addAccessor(accessName);
+}
+
+void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName)
+{
+ //printf("%s::addUsedByClass(%s,%s)\n",name().data(),cd->name().data(),accessName);
+ if (m_impl->usedByImplClassDict==0)
+ {
+ m_impl->usedByImplClassDict = new UsesClassDict(17);
+ m_impl->usedByImplClassDict->setAutoDelete(TRUE);
+ }
+ UsesClassDef *ucd=m_impl->usedByImplClassDict->find(cd->name());
+ if (ucd==0)
+ {
+ ucd = new UsesClassDef(cd);
+ m_impl->usedByImplClassDict->insert(cd->name(),ucd);
+ //printf("Adding used by class %s to class %s\n",
+ // cd->name().data(),name().data());
+ }
+ ucd->addAccessor(accessName);
+}
+
+
+#if 0
+/*! Builds up a dictionary of all classes that are used by the state of this
+ * class (the "implementation").
+ * Must be called before mergeMembers() is called!
+ */
+
+void ClassDef::determineImplUsageRelation()
+{
+ MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoSDict);
+ MemberNameInfo *mni;
+ for (;(mni=mnili.current());++mnili)
+ {
+ MemberNameInfoIterator mnii(*mni);
+ MemberInfo *mi;
+ for (mnii.toFirst();(mi=mnii.current());++mnii)
+ {
+ MemberDef *md=mi->memberDef;
+ if (md->isVariable()) // for each member variable in this class
+ {
+ QCString type=removeRedundantWhiteSpace(md->typeString());
+ //printf("in class %s found var type=`%s' name=`%s'\n",
+ // name().data(),type.data(),md->name().data());
+ int pos=0;
+ QCString usedClassName;
+ QCString templSpec;
+ bool found=FALSE;
+ while (extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1 && !found)
+ {
+ //printf("usedClassName=`%s' templSpec=%s\n",usedClassName.data(),templSpec.data());
+ // check if usedClassName is a template argument of its class
+ ClassDef *cd=md->getClassDef();
+ if (cd && cd->templateArguments())
+ {
+ ArgumentListIterator ali(*cd->templateArguments());
+ Argument *arg;
+ int count=0;
+ for (ali.toFirst();(arg=ali.current());++ali,++count)
+ {
+ if (arg->name==usedClassName) // type is a template argument
+ {
+ found=TRUE;
+ if (m_impl->usesImplClassDict==0) m_impl->usesImplClassDict = new UsesClassDict(257);
+ cd = new ClassDef(cd->getDefFileName(),cd->getDefLine(),
+ usedClassName,ClassDef::Class);
+ cd->setIsTemplateBaseClass(count);
+ UsesClassDef *ucd = new UsesClassDef(cd);
+ m_impl->usesImplClassDict->insert(cd->name(),ucd);
+ ucd->templSpecifiers = templSpec;
+ ucd->addAccessor(md->name());
+ Doxygen::hiddenClasses.append(cd);
+ //printf("Adding used template argument %s to class %s\n",
+ // cd->name().data(),name().data());
+ //printf("Adding accessor %s to class %s\n",
+ // md->name().data(),ucd->classDef->name().data());
+ }
+ }
+ }
+
+ if (!found)
+ {
+ cd=0;
+ if (getNamespaceDef()!=0)
+ {
+ cd=getResolvedClass(getNamespaceDef()->name()+"::"+usedClassName,0,&templSpec);
+ }
+ if (cd==0) cd=getResolvedClass(name()+"::"+usedClassName,0,&templSpec);
+ if (cd==0) cd=getResolvedClass(usedClassName,0,&templSpec); // TODO: also try inbetween scopes!
+ //printf("Search for class %s result=%p\n",usedClassName.data(),cd);
+ if (cd) // class exists
+ {
+ found=TRUE;
+ if (m_impl->usesImplClassDict==0)
+ {
+ m_impl->usesImplClassDict = new UsesClassDict(257);
+ m_impl->usesImplClassDict->setAutoDelete(TRUE);
+ }
+ UsesClassDef *ucd=m_impl->usesImplClassDict->find(cd->name());
+ if (ucd==0 || ucd->templSpecifiers!=templSpec)
+ {
+ ucd = new UsesClassDef(cd);
+ m_impl->usesImplClassDict->insert(cd->name(),ucd);
+ ucd->templSpecifiers = templSpec;
+ //printf("Adding used class %s to class %s\n",
+ // cd->name().data(),name().data());
+ }
+ ucd->addAccessor(md->name());
+ //printf("Adding accessor %s to class %s\n",
+ // md->name().data(),ucd->classDef->name().data());
+ }
+ }
+ }
+ }
+ }
+ }
+#ifdef DUMP
+ if (m_impl->usesClassDict)
+ {
+ msg("Class %s uses the following classes:\n",name().data());
+ UsesClassDictIterator ucdi(*m_impl->usesClassDict);
+ UsesClassDef *ucd;
+ for (;(ucd=ucdi.current());++ucdi)
+ {
+ msg(" %s via ",ucd->classDef->name().data());
+ QDictIterator<void> dvi(*ucd->accessors);
+ const char *s;
+ for (;(s=dvi.currentKey());++dvi)
+ {
+ msg("%s ",s);
+ }
+ msg("\n");
+ }
+ }
+#endif
+}
+
+//----------------------------------------------------------------------------
+
+// I have disabled this code because the graphs it renders quickly become
+// too large to be of practical use.
+
+void ClassDef::addUsedInterfaceClasses(MemberDef *md,const char *typeStr)
+{
+ QCString type = typeStr;
+ static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
+ int p=0,i,l;
+ while ((i=re.match(type,p,&l))!=-1) // for each class name in the type
+ {
+ ClassDef *cd=getClass(name()+"::"+type.mid(i,l));
+ if (cd==0) cd=getClass(type.mid(i,l)); // TODO: also try inbetween scopes!
+ if (cd && cd!=this && !isBaseClass(cd))
+ {
+ if (m_impl->usesIntfClassDict==0)
+ {
+ m_impl->usesIntfClassDict = new UsesClassDict(257);
+ }
+ UsesClassDef *ucd=m_impl->usesIntfClassDict->find(cd->name());
+ if (ucd==0)
+ {
+ ucd = new UsesClassDef(cd);
+ m_impl->usesIntfClassDict->insert(cd->name(),ucd);
+ //printf("in class `%s' adding used intf class `%s'\n",
+ // name().data(),cd->name().data());
+ }
+ ucd->addAccessor(md->name());
+ //printf("in class `%s' adding accessor `%s' to class `%s'\n",
+ // name().data(),md->name().data(),ucd->classDef->name().data());
+ }
+ p=i+l;
+ }
+}
+
+void ClassDef::determineIntfUsageRelation()
+{
+ MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoList);
+ MemberNameInfo *mni;
+ for (;(mni=mnili.current());++mnili)
+ {
+ MemberNameInfoIterator mnii(*mni);
+ MemberInfo *mi;
+ for (mnii.toFirst();(mi=mnii.current());++mnii)
+ {
+ MemberDef *md=mi->memberDef;
+
+ // compute the protection level for this member
+ Protection protect=md->protection();
+ if (mi->prot==Protected) // inherited protection
+ {
+ if (protect==Public) protect=Protected;
+ else if (protect==Protected) protect=Private;
+ }
+
+ if (!md->name().isEmpty() && md->name()[0]!='@' &&
+ (mi->prot!=Private && protect!=Private)
+ )
+ {
+ // add classes found in the return type
+ addUsedInterfaceClasses(md,md->typeString());
+ ArgumentList *al = md->argumentList();
+ if (al) // member has arguments
+ {
+ // add classes found in the types of the argument list
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (;(a=ali.current());++ali)
+ {
+ if (!a->type.isEmpty() && a->type.at(0)!='@')
+ {
+ addUsedInterfaceClasses(md,a->type);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+#endif
+
+QCString ClassDef::compoundTypeString() const
+{
+ if (m_impl->compType==Interface && m_impl->lang==SrcLangExt_ObjC) return "class";
+ if (Config_getBool("OPTIMIZE_FOR_FORTRAN"))
+ {
+ switch (m_impl->compType)
+ {
+ case Class: return "module";
+ case Struct: return "type";
+ case Union: return "union";
+ case Interface: return "interface";
+ case Protocol: return "protocol";
+ case Category: return "category";
+ case Exception: return "exception";
+ default: return "unknown";
+ }
+ }
+ else
+ {
+ switch (m_impl->compType)
+ {
+ case Class: return "class";
+ case Struct: return "struct";
+ case Union: return "union";
+ case Interface: return "interface";
+ case Protocol: return "protocol";
+ case Category: return "category";
+ case Exception: return "exception";
+ default: return "unknown";
+ }
+ }
+}
+
+QCString ClassDef::getXmlOutputFileBase() const
+{
+ if (m_impl->templateMaster)
+ {
+ // point to the template of which this class is an instance
+ return m_impl->templateMaster->getOutputFileBase();
+ }
+ else if (isReference())
+ {
+ // point to the external location
+ return m_impl->fileName;
+ }
+ else
+ {
+ // normal locally defined class
+ return convertNameToFile(m_impl->fileName);
+ }
+}
+
+QCString ClassDef::getOutputFileBase() const
+{
+ static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ if (inlineGroupedClasses && partOfGroups()!=0)
+ {
+ // point to the group that embeds this class
+ return partOfGroups()->at(0)->getOutputFileBase();
+ }
+ else
+ {
+ return getXmlOutputFileBase();
+ }
+}
+
+QCString ClassDef::getInstanceOutputFileBase() const
+{
+ if (isReference())
+ {
+ return m_impl->fileName;
+ }
+ else
+ {
+ return convertNameToFile(m_impl->fileName);
+ }
+}
+
+QCString ClassDef::getFileBase() const
+{
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->getFileBase();
+ }
+ else
+ {
+ return m_impl->fileName;
+ }
+}
+
+QCString ClassDef::getSourceFileBase() const
+{
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->getSourceFileBase();
+ }
+ else
+ {
+ return convertNameToFile(m_impl->fileName)+"_source";
+ }
+}
+
+void ClassDef::setGroupDefForAllMembers(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs)
+{
+ gd->addClass(this);
+ //printf("ClassDef::setGroupDefForAllMembers(%s)\n",gd->name().data());
+ if (m_impl->allMemberNameInfoSDict==0) return;
+ MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoSDict);
+ MemberNameInfo *mni;
+ for (;(mni=mnili.current());++mnili)
+ {
+ MemberNameInfoIterator mnii(*mni);
+ MemberInfo *mi;
+ for (mnii.toFirst();(mi=mnii.current());++mnii)
+ {
+ MemberDef *md=mi->memberDef;
+ md->setGroupDef(gd,pri,fileName,startLine,hasDocs);
+ gd->insertMember(md,TRUE);
+ ClassDef *innerClass = md->getClassDefOfAnonymousType();
+ if (innerClass) innerClass->setGroupDefForAllMembers(gd,pri,fileName,startLine,hasDocs);
+ }
+ }
+}
+
+void ClassDef::addInnerCompound(Definition *d)
+{
+ //printf("**** %s::addInnerCompound(%s)\n",name().data(),d->name().data());
+ if (d->definitionType()==Definition::TypeClass) // only classes can be
+ // nested in classes.
+ {
+ if (m_impl->innerClasses==0)
+ {
+ m_impl->innerClasses = new ClassSDict(17);
+ }
+ m_impl->innerClasses->inSort(d->localName(),(ClassDef *)d);
+ }
+}
+
+Definition *ClassDef::findInnerCompound(const char *name)
+{
+ Definition *result=0;
+ if (name==0) return 0;
+ if (m_impl->innerClasses)
+ {
+ result = m_impl->innerClasses->find(name);
+ }
+ return result;
+}
+
+//void ClassDef::initTemplateMapping()
+//{
+// m_impl->templateMapping->clear();
+// ArgumentList *al = templateArguments();
+// if (al)
+// {
+// ArgumentListIterator ali(*al);
+// Argument *arg;
+// for (ali.toFirst();(arg=ali.current());++ali)
+// {
+// setTemplateArgumentMapping(arg->name,arg->defval);
+// }
+// }
+//}
+//void ClassDef::setTemplateArgumentMapping(const char *formal,const char *actual)
+//{
+// //printf("ClassDef::setTemplateArgumentMapping(%s,%s)\n",formal,actual);
+// if (m_impl->templateMapping && formal)
+// {
+// if (m_impl->templateMapping->find(formal))
+// {
+// m_impl->templateMapping->remove(formal);
+// }
+// m_impl->templateMapping->insert(formal,new QCString(actual));
+// }
+//}
+//
+//QCString ClassDef::getTemplateArgumentMapping(const char *formal) const
+//{
+// if (m_impl->templateMapping && formal)
+// {
+// QCString *s = m_impl->templateMapping->find(formal);
+// if (s)
+// {
+// return *s;
+// }
+// }
+// return "";
+//}
+
+ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName,
+ int startLine, const QCString &templSpec,bool &freshInstance)
+{
+ freshInstance = FALSE;
+ if (m_impl->templateInstances==0)
+ {
+ m_impl->templateInstances = new QDict<ClassDef>(17);
+ }
+ ClassDef *templateClass=m_impl->templateInstances->find(templSpec);
+ if (templateClass==0)
+ {
+ Debug::print(Debug::Classes,0," New template instance class `%s'`%s'\n",name().data(),templSpec.data());
+ templateClass = new ClassDef(
+ fileName,startLine,localName()+templSpec,ClassDef::Class);
+ templateClass->setTemplateMaster(this);
+ templateClass->setOuterScope(getOuterScope());
+ templateClass->setHidden(isHidden());
+ m_impl->templateInstances->insert(templSpec,templateClass);
+ freshInstance=TRUE;
+ }
+ return templateClass;
+}
+
+ClassDef *ClassDef::getVariableInstance(const char *templSpec)
+{
+ if (m_impl->variableInstances==0)
+ {
+ m_impl->variableInstances = new QDict<ClassDef>(17);
+ m_impl->variableInstances->setAutoDelete(TRUE);
+ }
+ ClassDef *templateClass=m_impl->variableInstances->find(templSpec);
+ if (templateClass==0)
+ {
+ Debug::print(Debug::Classes,0," New template variable instance class `%s'`%s'\n",qPrint(name()),qPrint(templSpec));
+ templateClass = new ClassDef("<code>",1,name()+templSpec,
+ ClassDef::Class,0,0,FALSE);
+ templateClass->addMembersToTemplateInstance( this, templSpec );
+ templateClass->setTemplateMaster(this);
+ m_impl->variableInstances->insert(templSpec,templateClass);
+ }
+ return templateClass;
+}
+
+void ClassDef::setTemplateBaseClassNames(QDict<int> *templateNames)
+{
+ if (templateNames==0) return;
+ if (m_impl->templBaseClassNames==0)
+ {
+ m_impl->templBaseClassNames = new QDict<int>(17);
+ m_impl->templBaseClassNames->setAutoDelete(TRUE);
+ }
+ // make a deep copy of the dictionary.
+ QDictIterator<int> qdi(*templateNames);
+ for (;qdi.current();++qdi)
+ {
+ if (m_impl->templBaseClassNames->find(qdi.currentKey())==0)
+ {
+ m_impl->templBaseClassNames->insert(qdi.currentKey(),new int(*qdi.current()));
+ }
+ }
+}
+
+QDict<int> *ClassDef::getTemplateBaseClassNames() const
+{
+ return m_impl->templBaseClassNames;
+}
+
+void ClassDef::addMembersToTemplateInstance(ClassDef *cd,const char *templSpec)
+{
+ //printf("%s::addMembersToTemplateInstance(%s,%s)\n",name().data(),cd->name().data(),templSpec);
+ if (cd->memberNameInfoSDict()==0) return;
+ MemberNameInfoSDict::Iterator mnili(*cd->memberNameInfoSDict());
+ MemberNameInfo *mni;
+ for (;(mni=mnili.current());++mnili)
+ {
+ MemberNameInfoIterator mnii(*mni);
+ MemberInfo *mi;
+ for (mnii.toFirst();(mi=mnii.current());++mnii)
+ {
+ ArgumentList *actualArguments = new ArgumentList;
+ stringToArgumentList(templSpec,actualArguments);
+ MemberDef *md = mi->memberDef;
+ MemberDef *imd = md->createTemplateInstanceMember(
+ cd->templateArguments(),actualArguments);
+ delete actualArguments;
+ //printf("%s->setMemberClass(%p)\n",imd->name().data(),this);
+ imd->setMemberClass(this);
+ imd->setTemplateMaster(md);
+ imd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
+ imd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
+ imd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
+ imd->setMemberSpecifiers(md->getMemberSpecifiers());
+ imd->setMemberGroupId(md->getMemberGroupId());
+ insertMember(imd);
+ //printf("Adding member=%s %s%s to class %s templSpec %s\n",
+ // imd->typeString(),imd->name().data(),imd->argsString(),
+ // imd->getClassDef()->name().data(),templSpec);
+ // insert imd in the list of all members
+ //printf("Adding member=%s class=%s\n",imd->name().data(),name().data());
+ MemberName *mn = Doxygen::memberNameSDict->find(imd->name());
+ if (mn==0)
+ {
+ mn = new MemberName(imd->name());
+ Doxygen::memberNameSDict->append(imd->name(),mn);
+ }
+ mn->append(imd);
+ }
+ }
+}
+
+QCString ClassDef::getReference() const
+{
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->getReference();
+ }
+ else
+ {
+ return Definition::getReference();
+ }
+}
+
+bool ClassDef::isReference() const
+{
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->isReference();
+ }
+ else
+ {
+ return Definition::isReference();
+ }
+}
+
+void ClassDef::getTemplateParameterLists(QList<ArgumentList> &lists) const
+{
+ Definition *d=getOuterScope();
+ if (d)
+ {
+ if (d->definitionType()==Definition::TypeClass)
+ {
+ ClassDef *cd=(ClassDef *)d;
+ cd->getTemplateParameterLists(lists);
+ }
+ }
+ if (templateArguments())
+ {
+ lists.append(templateArguments());
+ }
+}
+
+QCString ClassDef::qualifiedNameWithTemplateParameters(
+ QList<ArgumentList> *actualParams) const
+{
+ static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
+ //printf("qualifiedNameWithTemplateParameters() localName=%s\n",localName().data());
+ QCString scName;
+ Definition *d=getOuterScope();
+ if (d)
+ {
+ if (d->definitionType()==Definition::TypeClass)
+ {
+ ClassDef *cd=(ClassDef *)d;
+ scName = cd->qualifiedNameWithTemplateParameters(actualParams);
+ }
+ else if (!hideScopeNames)
+ {
+ scName = d->qualifiedName();
+ }
+ }
+
+ QCString scopeSeparator;
+ if (optimizeOutputJava)
+ scopeSeparator=".";
+ else
+ scopeSeparator="::";
+
+ if (!scName.isEmpty()) scName+=scopeSeparator;
+
+ bool isSpecialization = localName().find('<')!=-1;
+ bool isGeneric = m_impl->lang==SrcLangExt_CSharp;
+
+ QCString clName = className();
+ if (isGeneric && clName.right(2)=="-g")
+ {
+ clName = clName.left(clName.length()-2);
+ }
+ //printf("m_impl->lang=%d clName=%s\n",m_impl->lang,clName.data());
+ scName+=clName;
+ ArgumentList *al=0;
+ if (templateArguments())
+ {
+ if (actualParams && (al=actualParams->current()))
+ {
+ if (!isSpecialization)
+ {
+ scName+=tempArgListToString(al);
+ }
+ actualParams->next();
+ }
+ else
+ {
+ if (!isSpecialization)
+ {
+ scName+=tempArgListToString(templateArguments());
+ }
+ }
+ }
+ //printf("qualifiedNameWithTemplateParameters: scope=%s qualifiedName=%s\n",name().data(),scName.data());
+ return scName;
+}
+
+QCString ClassDef::className() const
+{
+ if (m_impl->className.isEmpty())
+ {
+ return localName();
+ }
+ else
+ {
+ return m_impl->className;
+ }
+};
+
+void ClassDef::setClassName(const char *name)
+{
+ m_impl->className = name;
+}
+
+void ClassDef::addListReferences()
+{
+ bool fortranOpt=Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ if (!isLinkableInProject()) return;
+ //printf("ClassDef(%s)::addListReferences()\n",name().data());
+ {
+ LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
+ addRefItem(xrefItems.pointer(),
+ qualifiedName(),
+ fortranOpt?theTranslator->trType(TRUE,TRUE):
+ theTranslator->trClass(TRUE,TRUE),
+ getOutputFileBase(),
+ displayName(),
+ 0
+ );
+ }
+ if (m_impl->memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->addListReferences(this);
+ }
+ }
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::detailedLists)
+ {
+ ml->addListReferences(this);
+ }
+ }
+}
+
+MemberDef *ClassDef::getMemberByName(const QCString &name) const
+{
+ MemberDef *xmd = 0;
+ if (m_impl->allMemberNameInfoSDict)
+ {
+ MemberNameInfo *mni = m_impl->allMemberNameInfoSDict->find(name);
+ if (mni)
+ {
+ const int maxInheritanceDepth = 100000;
+ int mdist=maxInheritanceDepth;
+ MemberNameInfoIterator mnii(*mni);
+ MemberInfo *mi;
+ for (mnii.toFirst();(mi=mnii.current());++mnii)
+ {
+ ClassDef *mcd=mi->memberDef->getClassDef();
+ int m=minClassDistance(this,mcd);
+ //printf("found member in %s linkable=%d m=%d\n",
+ // mcd->name().data(),mcd->isLinkable(),m);
+ if (m<mdist && mcd->isLinkable())
+ {
+ mdist=m;
+ xmd=mi->memberDef;
+ }
+ }
+ }
+ }
+ //printf("getMemberByName(%s)=%p\n",name.data(),xmd);
+ return xmd;
+}
+
+bool ClassDef::isAccessibleMember(MemberDef *md)
+{
+ return md->getClassDef() && isBaseClass(md->getClassDef(),TRUE);
+}
+
+MemberList *ClassDef::createMemberList(MemberList::ListType lt)
+{
+ m_impl->memberLists.setAutoDelete(TRUE);
+ QListIterator<MemberList> mli(m_impl->memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()==lt)
+ {
+ return ml;
+ }
+ }
+ // not found, create a new member list
+ ml = new MemberList(lt);
+ m_impl->memberLists.append(ml);
+ return ml;
+}
+
+MemberList *ClassDef::getMemberList(MemberList::ListType lt)
+{
+ MemberList *ml = m_impl->memberLists.first();
+ while (ml)
+ {
+ if (ml->listType()==lt)
+ {
+ return ml;
+ }
+ ml = m_impl->memberLists.next();
+ }
+ return 0;
+}
+
+void ClassDef::addMemberToList(MemberList::ListType lt,MemberDef *md,bool isBrief)
+{
+ static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
+ static bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");
+ MemberList *ml = createMemberList(lt);
+ ml->setNeedsSorting((isBrief && sortBriefDocs) || (!isBrief && sortMemberDocs));
+ ml->append(md);
+
+ // for members in the declaration lists we set the section, needed for member grouping
+ if ((ml->listType()&MemberList::detailedLists)==0) md->setSectionList(this,ml);
+}
+
+void ClassDef::sortMemberLists()
+{
+ MemberList *ml = m_impl->memberLists.first();
+ while (ml)
+ {
+ if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
+ ml = m_impl->memberLists.next();
+ }
+}
+
+void ClassDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title,
+ const char *subTitle,bool showInline)
+{
+ static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ MemberList * ml = getMemberList(lt);
+ if (ml)
+ {
+ if (optimizeVhdl) // use specific declarations function
+ {
+ VhdlDocGen::writeVhdlDeclarations(ml,ol,0,this,0);
+ }
+ else // use generic declaration function
+ {
+ ml->writeDeclarations(ol,this,0,0,0,title,subTitle,FALSE,showInline);
+ }
+ }
+}
+
+void ClassDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title,bool showInline)
+{
+ MemberList * ml = getMemberList(lt);
+ if (ml) ml->writeDocumentation(ol,name(),this,title,FALSE,showInline);
+}
+
+void ClassDef::writePlainMemberDeclaration(OutputList &ol,MemberList::ListType lt,bool inGroup)
+{
+ MemberList * ml = getMemberList(lt);
+ if (ml)
+ {
+ ml->setInGroup(inGroup);
+ ml->writePlainDeclarations(ol,this,0,0,0);
+ }
+}
+
+bool ClassDef::isLocal() const
+{
+ return m_impl->isLocal;
+}
+
+ClassSDict *ClassDef::getInnerClasses()
+{
+ return m_impl->innerClasses;
+}
+
+ClassDef::CompoundType ClassDef::compoundType() const
+{
+ return m_impl->compType;
+}
+
+BaseClassList *ClassDef::baseClasses() const
+{
+ return m_impl->inherits;
+}
+
+BaseClassList *ClassDef::subClasses() const
+{
+ return m_impl->inheritedBy;
+}
+
+MemberNameInfoSDict *ClassDef::memberNameInfoSDict() const
+{
+ return m_impl->allMemberNameInfoSDict;
+}
+
+Protection ClassDef::protection() const
+{
+ return m_impl->prot;
+}
+
+ArgumentList *ClassDef::templateArguments() const
+{
+ return m_impl->tempArgs;
+}
+
+NamespaceDef *ClassDef::getNamespaceDef() const
+{
+ return m_impl->nspace;
+}
+
+FileDef *ClassDef::getFileDef() const
+{
+ return m_impl->fileDef;
+}
+
+QDict<ClassDef> *ClassDef::getTemplateInstances() const
+{
+ return m_impl->templateInstances;
+}
+
+ClassDef *ClassDef::templateMaster() const
+{
+ return m_impl->templateMaster;
+}
+
+bool ClassDef::isTemplate() const
+{
+ return m_impl->tempArgs!=0;
+}
+
+IncludeInfo *ClassDef::includeInfo() const
+{
+ return m_impl->incInfo;
+}
+
+UsesClassDict *ClassDef::usedImplementationClasses() const
+{
+ return m_impl->usesImplClassDict;
+}
+
+UsesClassDict *ClassDef::usedByImplementationClasses() const
+{
+ return m_impl->usedByImplClassDict;
+}
+
+UsesClassDict *ClassDef::usedInterfaceClasses() const
+{
+ return m_impl->usesIntfClassDict;
+}
+
+bool ClassDef::isTemplateArgument() const
+{
+ return m_impl->isTemplArg;
+}
+
+bool ClassDef::isAbstract() const
+{
+ return m_impl->isAbstract;
+}
+
+bool ClassDef::isObjectiveC() const
+{
+ return m_impl->lang==SrcLangExt_ObjC;
+}
+
+bool ClassDef::isCSharp() const
+{
+ return m_impl->lang==SrcLangExt_CSharp;
+}
+
+ClassDef *ClassDef::categoryOf() const
+{
+ return m_impl->categoryOf;
+}
+
+const QList<MemberList> &ClassDef::getMemberLists() const
+{
+ return m_impl->memberLists;
+}
+
+MemberGroupSDict *ClassDef::getMemberGroupSDict() const
+{
+ return m_impl->memberGroupSDict;
+}
+
+void ClassDef::setNamespace(NamespaceDef *nd)
+{
+ m_impl->nspace = nd;
+}
+
+void ClassDef::setFileDef(FileDef *fd)
+{
+ m_impl->fileDef=fd;
+}
+
+void ClassDef::setSubGrouping(bool enabled)
+{
+ m_impl->subGrouping = enabled;
+}
+
+void ClassDef::setProtection(Protection p)
+{
+ m_impl->prot=p;
+}
+
+void ClassDef::setIsStatic(bool b)
+{
+ m_impl->isStatic=b;
+}
+
+void ClassDef::setLanguage(SrcLangExt lang)
+{
+ m_impl->lang=lang;
+}
+
+void ClassDef::setCompoundType(CompoundType t)
+{
+ m_impl->compType = t;
+}
+
+void ClassDef::setTemplateMaster(ClassDef *tm)
+{
+ m_impl->templateMaster=tm;
+}
+
+void ClassDef::makeTemplateArgument(bool b)
+{
+ m_impl->isTemplArg = b;
+}
+
+void ClassDef::setCategoryOf(ClassDef *cd)
+{
+ m_impl->categoryOf = cd;
+}
+
+void ClassDef::setUsedOnly(bool b)
+{
+ m_impl->usedOnly = b;
+}
+
+bool ClassDef::isUsedOnly() const
+{
+ return m_impl->usedOnly;
+}
+
+void ClassDef::reclassifyMember(MemberDef *md,MemberDef::MemberType t)
+{
+ md->setMemberType(t);
+ MemberList *ml = m_impl->memberLists.first();
+ while (ml)
+ {
+ ml->remove(md);
+ ml = m_impl->memberLists.next();
+ }
+ insertMember(md);
+}
+
+QCString ClassDef::anchor() const
+{
+ QCString anc;
+ if (isEmbeddedInGroupDocs())
+ {
+ if (m_impl->templateMaster)
+ {
+ // point to the template of which this class is an instance
+ anc = m_impl->templateMaster->getOutputFileBase();
+ }
+ else if (isReference())
+ {
+ // point to the external location
+ anc = m_impl->fileName;
+ }
+ else
+ {
+ // normal locally defined class
+ anc = convertNameToFile(m_impl->fileName);
+ }
+ }
+ return anc;
+}
+
+bool ClassDef::isEmbeddedInGroupDocs() const
+{
+ static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ return (inlineGroupedClasses && partOfGroups()!=0);
+}
+
+
diff --git a/src/classdef.h b/src/classdef.h
new file mode 100644
index 0000000..9b6ad11
--- /dev/null
+++ b/src/classdef.h
@@ -0,0 +1,479 @@
+/******************************************************************************
+ *
+ * $Id: classdef.h,v 1.39 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef CLASSDEF_H
+#define CLASSDEF_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qdict.h>
+#include <qstrlist.h>
+
+#include "util.h"
+#include "memberlist.h"
+#include "definition.h"
+#include "sortdict.h"
+
+class MemberDict;
+class ClassList;
+class ClassSDict;
+class OutputList;
+class FileDef;
+class BaseClassList;
+class NamespaceDef;
+class MemberDef;
+class ExampleSDict;
+class MemberNameInfoSDict;
+class UsesClassDict;
+class MemberGroupSDict;
+class QTextStream;
+class PackageDef;
+class GroupDef;
+class StringDict;
+struct IncludeInfo;
+class ClassDefImpl;
+
+/*! \brief This class contains all information about a compound.
+ *
+ * A compound can be a class, struct, union, interface, or exception.
+ * \note This class should be renamed to CompoundDef
+ */
+class ClassDef : public Definition
+{
+ public:
+ /*! The various compound types */
+ enum CompoundType { Class, //=Entry::CLASS_SEC,
+ Struct, //=Entry::STRUCT_SEC,
+ Union, //=Entry::UNION_SEC,
+ Interface, //=Entry::INTERFACE_SEC,
+ Protocol, //=Entry::PROTOCOL_SEC,
+ Category, //=Entry::CATEGORY_SEC,
+ Exception //=Entry::EXCEPTION_SEC
+ };
+
+ /*! Creates a new compound definition.
+ * \param fileName full path and file name in which this compound was
+ * found.
+ * \param startLine line number where the definition of this compound
+ * starts.
+ * \param name the name of this compound (including scope)
+ * \param ct the kind of Compound
+ * \param ref the tag file from which this compound is extracted
+ * or 0 if the compound doesn't come from a tag file
+ * \param fName the file name as found in the tag file.
+ * This overwrites the file that doxygen normally
+ * generates based on the compound type & name.
+ * \param isSymbol If TRUE this class name is added as a publicly
+ * visible (and referencable) symbol.
+ */
+ ClassDef(const char *fileName,int startLine,
+ const char *name,CompoundType ct,
+ const char *ref=0,const char *fName=0,
+ bool isSymbol=TRUE);
+ /*! Destroys a compound definition. */
+ ~ClassDef();
+
+ //-----------------------------------------------------------------------------------
+ // --- getters
+ //-----------------------------------------------------------------------------------
+
+ /*! Used for RTTI, this is a class */
+ DefType definitionType() const { return TypeClass; }
+
+ /*! Returns the unique base name (without extension) of the class's file on disk */
+ QCString getOutputFileBase() const;
+ QCString getXmlOutputFileBase() const;
+ QCString getInstanceOutputFileBase() const;
+ QCString getFileBase() const;
+
+ /*! Returns the base name for the source code file */
+ QCString getSourceFileBase() const;
+
+ /*! If this class originated from a tagfile, this will return the tag file reference */
+ QCString getReference() const;
+
+ /*! Returns TRUE if this class is imported via a tag file */
+ bool isReference() const;
+
+ /*! Returns TRUE if this is a local class definition, see EXTRACT_LOCAL_CLASSES */
+ bool isLocal() const;
+
+ /*! returns the classes nested into this class */
+ ClassSDict *getInnerClasses();
+
+ /*! returns TRUE if this class has documentation */
+ bool hasDocumentation() const;
+
+ /*! Returns the name as it is appears in the documentation */
+ QCString displayName() const;
+
+ /*! Returns the type of compound this is, i.e. class/struct/union/.. */
+ CompoundType compoundType() const;
+
+ /*! Returns the type of compound as a string */
+ QCString compoundTypeString() const;
+
+ /*! Returns the list of base classes from which this class directly
+ * inherits.
+ */
+ BaseClassList *baseClasses() const;
+
+ /*! Returns the list of sub classes that directly derive from this class
+ */
+ BaseClassList *subClasses() const;
+
+ /*! Returns a dictionary of all members. This includes any inherited
+ * members. Members are sorted alphabetically.
+ */
+ MemberNameInfoSDict *memberNameInfoSDict() const;
+
+ /*! Return the protection level (Public,Protected,Private) in which
+ * this compound was found.
+ */
+ Protection protection() const;
+
+ /*! returns TRUE iff a link is possible to this item within this project.
+ */
+ bool isLinkableInProject() const;
+
+ /*! return TRUE iff a link to this class is possible (either within
+ * this project, or as a cross-reference to another project).
+ */
+ bool isLinkable() const;
+
+ /*! the class is visible in a class diagram, or class hierarchy */
+ bool isVisibleInHierarchy();
+
+ /*! Returns the template arguments of this class
+ * Will return 0 if not applicable.
+ */
+ ArgumentList *templateArguments() const;
+
+ /*! Returns the namespace this compound is in, or 0 if it has a global
+ * scope.
+ */
+ NamespaceDef *getNamespaceDef() const;
+
+ /*! Returns the file in which this compound's definition can be found.
+ * Should not return 0 (but it might be a good idea to check anyway).
+ */
+ FileDef *getFileDef() const;
+
+ /*! Returns the Java package this class is in or 0 if not applicable.
+ */
+
+ MemberDef *getMemberByName(const QCString &) const;
+
+ /*! Returns TRUE iff \a bcd is a direct or indirect base class of this
+ * class. This function will recusively traverse all branches of the
+ * inheritance tree.
+ */
+ bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0);
+
+ /*! returns TRUE iff \a md is a member of this class or of the
+ * the public/protected members of a base class
+ */
+ bool isAccessibleMember(MemberDef *md);
+
+ /*! Returns a sorted dictionary with all template instances found for
+ * this template class. Returns 0 if not a template or no instances.
+ */
+ QDict<ClassDef> *getTemplateInstances() const;
+
+ /*! Returns the template master of which this class is an instance.
+ * Returns 0 if not applicable.
+ */
+ ClassDef *templateMaster() const;
+
+ /*! Returns TRUE if this class is a template */
+ bool isTemplate() const;
+
+ IncludeInfo *includeInfo() const;
+
+ UsesClassDict *usedImplementationClasses() const;
+
+ UsesClassDict *usedByImplementationClasses() const;
+
+ UsesClassDict *usedInterfaceClasses() const;
+
+ bool isTemplateArgument() const;
+
+ /*! Returns the definition of a nested compound if
+ * available, or 0 otherwise.
+ * @param name The name of the nested compound
+ */
+ virtual Definition *findInnerCompound(const char *name);
+
+ /*! Returns the template parameter lists that form the template
+ * declaration of this class.
+ *
+ * Example: <code>template<class T> class TC {};</code>
+ * will return a list with one ArgumentList containing one argument
+ * with type="class" and name="T".
+ */
+ void getTemplateParameterLists(QList<ArgumentList> &lists) const;
+
+ QCString qualifiedNameWithTemplateParameters(
+ QList<ArgumentList> *actualParams=0) const;
+
+ /*! Returns TRUE if there is at least one pure virtual member in this
+ * class.
+ */
+ bool isAbstract() const;
+
+ /*! Returns TRUE if this class is implemented in Objective-C */
+ bool isObjectiveC() const;
+
+ /*! Returns TRUE if this class is implemented in C# */
+ bool isCSharp() const;
+
+ /*! Returns the class of which this is a category (Objective-C only) */
+ ClassDef *categoryOf() const;
+
+ /*! Returns the name of the class including outer classes, but not
+ * including namespaces.
+ */
+ QCString className() const;
+
+ /*! Returns the members in the list identified by \a lt */
+ MemberList *getMemberList(MemberList::ListType lt);
+
+ /*! Returns the list containing the list of members sorted per type */
+ const QList<MemberList> &getMemberLists() const;
+
+ /*! Returns the member groups defined for this class */
+ MemberGroupSDict *getMemberGroupSDict() const;
+
+ QDict<int> *getTemplateBaseClassNames() const;
+
+ ClassDef *getVariableInstance(const char *templSpec);
+
+ bool isUsedOnly() const;
+
+ QCString anchor() const;
+ bool isEmbeddedInGroupDocs() const;
+
+ //-----------------------------------------------------------------------------------
+ // --- setters ----
+ //-----------------------------------------------------------------------------------
+
+ void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0);
+ void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0);
+ void setIncludeFile(FileDef *fd,const char *incName,bool local,bool force);
+ void insertMember(MemberDef *);
+ void insertUsedFile(const char *);
+ bool addExample(const char *anchor,const char *name, const char *file);
+ void mergeCategory(ClassDef *category);
+ void setNamespace(NamespaceDef *nd);
+ void setFileDef(FileDef *fd);
+ void setSubGrouping(bool enabled);
+ void setProtection(Protection p);
+ void setGroupDefForAllMembers(GroupDef *g,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
+ void addInnerCompound(Definition *d);
+ ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,
+ const QCString &templSpec,bool &freshInstance);
+ void addUsedClass(ClassDef *cd,const char *accessName);
+ void addUsedByClass(ClassDef *cd,const char *accessName);
+ void setIsStatic(bool b);
+ void setLanguage(SrcLangExt lang);
+ void setCompoundType(CompoundType t);
+ void setClassName(const char *name);
+
+ void setTemplateArguments(ArgumentList *al);
+ void setTemplateBaseClassNames(QDict<int> *templateNames);
+ void setTemplateMaster(ClassDef *tm);
+ void setTypeConstraints(ArgumentList *al);
+ void addMembersToTemplateInstance(ClassDef *cd,const char *templSpec);
+ void makeTemplateArgument(bool b=TRUE);
+ void setCategoryOf(ClassDef *cd);
+ void setUsedOnly(bool b);
+
+ //-----------------------------------------------------------------------------------
+ // --- actions ----
+ //-----------------------------------------------------------------------------------
+
+ void findSectionsInDocumentation();
+ void addMembersToMemberGroup();
+ void addListReferences();
+ void computeAnchors();
+ void mergeMembers();
+ void sortMemberLists();
+ void distributeMemberGroupDocumentation();
+ void writeDocumentation(OutputList &ol);
+ void writeDocumentationForInnerClasses(OutputList &ol);
+ void writeMemberPages(OutputList &ol);
+ void writeMemberList(OutputList &ol);
+ void writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup);
+ void writeQuickMemberLinks(OutputList &ol,MemberDef *md) const;
+ void writeSummaryLinks(OutputList &ol);
+ void reclassifyMember(MemberDef *md,MemberDef::MemberType t);
+ void writeInlineDocumentation(OutputList &ol);
+ void writeDeclarationLink(OutputList &ol,bool &found,
+ const char *header,bool localNames);
+
+ bool visited;
+
+ protected:
+ void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
+ bool hasExamples();
+ bool hasNonReferenceSuperClass();
+ void showUsedFiles(OutputList &ol);
+
+ private:
+ void writeTagFileMarker(OutputList &ol);
+ void writeDocumentationContents(OutputList &ol,const QCString &pageTitle);
+ void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList);
+ QCString getMemberListFileName() const;
+ void addMemberToList(MemberList::ListType lt,MemberDef *md,bool isBrief);
+ MemberList *createMemberList(MemberList::ListType lt);
+ void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title,
+ const char *subTitle=0,bool showInline=FALSE);
+ void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title,bool showInline=FALSE);
+ void writePlainMemberDeclaration(OutputList &ol,MemberList::ListType lt,bool inGroup);
+ void writeBriefDescription(OutputList &ol,bool exampleFlag);
+ void writeDetailedDescription(OutputList &ol,const QCString &pageType,bool exampleFlag,
+ const QCString &title,const QCString &anchor=QCString());
+ void writeIncludeFiles(OutputList &ol);
+ void writeAllMembersLink(OutputList &ol);
+ void writeInheritanceGraph(OutputList &ol);
+ void writeCollaborationGraph(OutputList &ol);
+ void writeMemberGroups(OutputList &ol,bool showInline=FALSE);
+ void writeNestedClasses(OutputList &ol,const QCString &title);
+ void startMemberDeclarations(OutputList &ol);
+ void endMemberDeclarations(OutputList &ol);
+ void startMemberDocumentation(OutputList &ol);
+ void endMemberDocumentation(OutputList &ol);
+ void writeAuthorSection(OutputList &ol);
+ void writeMoreLink(OutputList &ol,const QCString &anchor);
+ void writeDetailedDocumentationBody(OutputList &ol);
+
+ ClassDefImpl *m_impl;
+
+};
+
+/*! \brief Class that contains information about a usage relation.
+ */
+struct UsesClassDef
+{
+ UsesClassDef(ClassDef *cd) : classDef(cd)
+ {
+ accessors = new QDict<void>(17);
+ containment = TRUE;
+ }
+ ~UsesClassDef()
+ {
+ delete accessors;
+ }
+ void addAccessor(const char *s)
+ {
+ if (accessors->find(s)==0)
+ {
+ accessors->insert(s,(void *)666);
+ }
+ }
+ /*! Class definition that this relation uses. */
+ ClassDef *classDef;
+
+ /*! Dictionary of member variable names that form the edge labels of the
+ * usage relation.
+ */
+ QDict<void> *accessors;
+
+ /*! Template arguments used for the base class */
+ QCString templSpecifiers;
+
+ bool containment;
+};
+
+/*! \brief Dictionary of usage relations.
+ */
+class UsesClassDict : public QDict<UsesClassDef>
+{
+ public:
+ UsesClassDict(int size) : QDict<UsesClassDef>(size) {}
+ ~UsesClassDict() {}
+};
+
+/*! \brief Iterator class to iterate over a dictionary of usage relations.
+ */
+class UsesClassDictIterator : public QDictIterator<UsesClassDef>
+{
+ public:
+ UsesClassDictIterator(const QDict<UsesClassDef> &d)
+ : QDictIterator<UsesClassDef>(d) {}
+ ~UsesClassDictIterator() {}
+};
+
+/*! \brief Class that contains information about an inheritance relation.
+ */
+struct BaseClassDef
+{
+ BaseClassDef(ClassDef *cd,const char *n,Protection p,
+ Specifier v,const char *t) :
+ classDef(cd), usedName(n), prot(p), virt(v), templSpecifiers(t) {}
+
+ /*! Class definition that this relation inherits from. */
+ ClassDef *classDef;
+
+ /*! name used in the inheritance list
+ * (may be a typedef name instead of the class name)
+ */
+ QCString usedName;
+
+ /*! Protection level of the inheritance relation:
+ * Public, Protected, or Private
+ */
+ Protection prot;
+
+ /*! Virtualness of the inheritance relation:
+ * Normal, or Virtual
+ */
+ Specifier virt;
+
+ /*! Template arguments used for the base class */
+ QCString templSpecifiers;
+};
+
+/*! \brief list of base classes
+ *
+ * The classes are alphabetically sorted on name if inSort() is used.
+ */
+class BaseClassList : public QList<BaseClassDef>
+{
+ public:
+ ~BaseClassList() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ ClassDef *c1=((BaseClassDef *)item1)->classDef;
+ ClassDef *c2=((BaseClassDef *)item2)->classDef;
+ if (c1==0 || c2==0)
+ return FALSE;
+ else
+ return stricmp(c1->name(),c2->name());
+ }
+};
+
+/*! \brief Iterator for a list of base classes
+ */
+class BaseClassListIterator : public QListIterator<BaseClassDef>
+{
+ public:
+ BaseClassListIterator(const BaseClassList &bcl) :
+ QListIterator<BaseClassDef>(bcl) {}
+};
+
+#endif
diff --git a/src/classlist.cpp b/src/classlist.cpp
new file mode 100644
index 0000000..be9e4cd
--- /dev/null
+++ b/src/classlist.cpp
@@ -0,0 +1,157 @@
+/******************************************************************************
+ *
+ * $Id: classlist.cpp,v 1.14 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "classlist.h"
+#include "config.h"
+#include "util.h"
+#include "outputlist.h"
+#include "language.h"
+#include "doxygen.h"
+#include "vhdldocgen.h"
+
+ClassList::ClassList() : QList<ClassDef>()
+{
+}
+
+ClassList::~ClassList()
+{
+}
+
+static int compItems(void *item1,void *item2)
+{
+ ClassDef *c1=(ClassDef *)item1;
+ ClassDef *c2=(ClassDef *)item2;
+ static bool b = Config_getBool("SORT_BY_SCOPE_NAME");
+ //printf("compItems: %d %s<->%s\n",b,c1->qualifiedName().data(),c2->qualifiedName().data());
+ if (b)
+ {
+ return stricmp(c1->name(),
+ c2->name());
+ }
+ else
+ {
+ return stricmp(c1->className(),
+ c2->className());
+ }
+}
+
+int ClassList::compareItems(GCI item1, GCI item2)
+{
+ return compItems(item1,item2);
+}
+
+int ClassSDict::compareItems(GCI item1, GCI item2)
+{
+ return compItems(item1,item2);
+}
+
+ClassListIterator::ClassListIterator(const ClassList &cllist) :
+ QListIterator<ClassDef>(cllist)
+{
+}
+
+bool ClassSDict::declVisible(const ClassDef::CompoundType *filter) const
+{
+ static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES");
+ static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES");
+ if (count()>0)
+ {
+ ClassSDict::Iterator sdi(*this);
+ ClassDef *cd=0;
+ for (sdi.toFirst();(cd=sdi.current());++sdi)
+ {
+ if (cd->name().find('@')==-1 &&
+ (filter==0 || *filter==cd->compoundType())
+ )
+ {
+ bool isLink = cd->isLinkable();
+ if (isLink ||
+ (!hideUndocClasses &&
+ (!cd->isLocal() || extractLocalClasses)
+ )
+ )
+ {
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,
+ const char *header,bool localNames)
+{
+// static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+// bool first=TRUE;
+ if (count()>0)
+ {
+ ClassSDict::Iterator sdi(*this);
+ ClassDef *cd=0;
+ bool found=FALSE;
+ for (sdi.toFirst();(cd=sdi.current());++sdi)
+ {
+ //printf(" ClassSDict::writeDeclaration for %s\n",cd->name().data());
+ if (cd->name().find('@')==-1 &&
+ (filter==0 || *filter==cd->compoundType())
+ )
+ {
+// //bool isLink = cd->isLinkable();
+// if (inlineGroupedClasses && cd->partOfGroups()->count()>0)
+// {
+// cd->writeInlineDeclaration(ol,first);
+// first=FALSE;
+// }
+// else // show link's only
+// {
+ cd->writeDeclarationLink(ol,found,header,localNames);
+// }
+ }
+ }
+ if (found) ol.endMemberList();
+ }
+}
+
+void ClassSDict::writeDocumentation(OutputList &ol)
+{
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+
+ static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ if (!inlineGroupedClasses) return;
+
+ if (count()>0)
+ {
+ ol.writeRuler();
+ ol.startGroupHeader();
+ ol.parseText(fortranOpt?theTranslator->trTypeDocumentation():
+ theTranslator->trClassDocumentation());
+ ol.endGroupHeader();
+
+ ClassSDict::Iterator sdi(*this);
+ ClassDef *cd=0;
+ for (sdi.toFirst();(cd=sdi.current());++sdi)
+ {
+ if (cd->name().find('@')==-1 &&
+ cd->partOfGroups()->count()==1
+ )
+ {
+ cd->writeInlineDocumentation(ol);
+ }
+ }
+ }
+}
+
diff --git a/src/classlist.h b/src/classlist.h
new file mode 100644
index 0000000..a82641b
--- /dev/null
+++ b/src/classlist.h
@@ -0,0 +1,61 @@
+/******************************************************************************
+ *
+ * $Id: classlist.h,v 1.8 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef CLASSLIST_H
+#define CLASSLIST_H
+
+#include <qlist.h>
+#include <qdict.h>
+
+#include "classdef.h"
+#include "sortdict.h"
+
+class ClassList : public QList<ClassDef>
+{
+ public:
+ ClassList();
+ ~ClassList();
+
+ int compareItems(GCI item1,GCI item2);
+};
+
+class ClassListIterator : public QListIterator<ClassDef>
+{
+ public:
+ ClassListIterator(const ClassList &list);
+};
+
+class ClassDict : public QDict<ClassDef>
+{
+ public:
+ ClassDict(int size) : QDict<ClassDef>(size) {}
+ ~ClassDict() {}
+};
+
+class ClassSDict : public SDict<ClassDef>
+{
+ public:
+ ClassSDict(int size=17) : SDict<ClassDef>(size) {}
+ ~ClassSDict() {}
+ int compareItems(GCI item1,GCI item2);
+ void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
+ const char *header=0,bool localNames=FALSE);
+ void writeDocumentation(OutputList &ol);
+ bool declVisible(const ClassDef::CompoundType *filter=0) const;
+};
+
+#endif
diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp
new file mode 100644
index 0000000..c06d33e
--- /dev/null
+++ b/src/cmdmapper.cpp
@@ -0,0 +1,199 @@
+/******************************************************************************
+ *
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "cmdmapper.h"
+
+CommandMap cmdMap[] =
+{
+ { "a", CMD_EMPHASIS },
+ { "addindex", CMD_ADDINDEX },
+ { "anchor", CMD_ANCHOR },
+ { "arg", CMD_LI },
+ { "attention", CMD_ATTENTION },
+ { "author", CMD_AUTHOR },
+ { "authors", CMD_AUTHORS },
+ { "b", CMD_BOLD },
+ { "c", CMD_CODE },
+ { "code", CMD_STARTCODE },
+ { "copydoc", CMD_COPYDOC },
+ { "copybrief", CMD_COPYBRIEF },
+ { "copydetails", CMD_COPYDETAILS },
+ { "date", CMD_DATE },
+ { "dontinclude", CMD_DONTINCLUDE },
+ { "dotfile", CMD_DOTFILE },
+ { "e", CMD_EMPHASIS },
+ { "em", CMD_EMPHASIS },
+ { "endcode", CMD_ENDCODE },
+ { "endhtmlonly", CMD_ENDHTMLONLY },
+ { "endlatexonly", CMD_ENDLATEXONLY },
+ { "endlink", CMD_ENDLINK },
+ { "endsecreflist", CMD_ENDSECREFLIST },
+ { "endverbatim", CMD_ENDVERBATIM },
+ { "endxmlonly", CMD_ENDXMLONLY },
+ { "exception", CMD_EXCEPTION },
+ { "form", CMD_FORMULA },
+ { "htmlinclude", CMD_HTMLINCLUDE },
+ { "htmlonly", CMD_HTMLONLY },
+ { "image", CMD_IMAGE },
+ { "include", CMD_INCLUDE },
+ { "internal", CMD_INTERNAL },
+ { "invariant", CMD_INVARIANT },
+ { "javalink", CMD_JAVALINK },
+ { "latexonly", CMD_LATEXONLY },
+ { "li", CMD_LI },
+ { "line", CMD_LINE },
+ { "link", CMD_LINK },
+ { "n", CMD_LINEBREAK },
+ { "note", CMD_NOTE },
+ { "p", CMD_CODE },
+ { "par", CMD_PAR },
+ { "param", CMD_PARAM },
+ { "post", CMD_POST },
+ { "pre", CMD_PRE },
+ { "ref", CMD_REF },
+ { "refitem", CMD_SECREFITEM },
+ { "remark", CMD_REMARK },
+ { "remarks", CMD_REMARK },
+ { "result", CMD_RETURN },
+ { "return", CMD_RETURN },
+ { "returns", CMD_RETURN },
+ { "retval", CMD_RETVAL },
+ { "sa", CMD_SA },
+ { "secreflist", CMD_SECREFLIST },
+ { "section", CMD_SECTION },
+ { "subpage", CMD_SUBPAGE },
+ { "subsection", CMD_SUBSECTION },
+ { "subsubsection", CMD_SUBSUBSECTION },
+ { "paragraph", CMD_PARAGRAPH },
+ { "see", CMD_SA },
+ { "since", CMD_SINCE },
+ { "skip", CMD_SKIP },
+ { "skipline", CMD_SKIPLINE },
+ { "xmlonly", CMD_XMLONLY },
+ { "xrefitem", CMD_XREFITEM },
+ { "throw", CMD_EXCEPTION },
+ { "until", CMD_UNTIL },
+ { "verbatim", CMD_VERBATIM },
+ { "verbinclude", CMD_VERBINCLUDE },
+ { "version", CMD_VERSION },
+ { "warning", CMD_WARNING },
+ { "throws", CMD_EXCEPTION },
+ { "tparam", CMD_TPARAM },
+ { "\\", CMD_BSLASH },
+ { "@", CMD_AT },
+ { "<", CMD_LESS },
+ { ">", CMD_GREATER },
+ { "&", CMD_AMP },
+ { "$", CMD_DOLLAR },
+ { "#", CMD_HASH },
+ { "%", CMD_PERCENT },
+ { "::", CMD_DCOLON },
+ { "\"", CMD_QUOTE },
+ { "_internalref", CMD_INTERNALREF },
+ { "dot", CMD_DOT },
+ { "msc", CMD_MSC },
+ { "enddot", CMD_ENDDOT },
+ { "endmsc", CMD_ENDMSC },
+ { "manonly", CMD_MANONLY },
+ { "endmanonly", CMD_ENDMANONLY },
+ { "includelineno", CMD_INCWITHLINES },
+ { "inheritdoc", CMD_INHERITDOC },
+ { "mscfile", CMD_MSCFILE },
+ { 0, 0 },
+};
+
+//----------------------------------------------------------------------------
+
+CommandMap htmlTagMap[] =
+{
+ { "strong", HTML_BOLD },
+ { "center", HTML_CENTER },
+ { "table", HTML_TABLE },
+ { "caption", HTML_CAPTION },
+ { "small", HTML_SMALL },
+ { "code", HTML_CODE },
+ { "dfn", HTML_CODE },
+ { "var", HTML_EMPHASIS },
+ { "img", HTML_IMG },
+ { "pre", HTML_PRE },
+ { "sub", HTML_SUB },
+ { "sup", HTML_SUP },
+ { "tr", HTML_TR },
+ { "td", HTML_TD },
+ { "th", HTML_TH },
+ { "ol", HTML_OL },
+ { "ul", HTML_UL },
+ { "li", HTML_LI },
+ { "tt", XML_C /*HTML_CODE*/ },
+ { "kbd", XML_C /*HTML_CODE*/ },
+ { "em", HTML_EMPHASIS },
+ { "hr", HTML_HR },
+ { "dl", HTML_DL },
+ { "dt", HTML_DT },
+ { "dd", HTML_DD },
+ { "br", HTML_BR },
+ { "i", HTML_EMPHASIS },
+ { "a", HTML_A },
+ { "b", HTML_BOLD },
+ { "p", HTML_P },
+ { "h1", HTML_H1 },
+ { "h2", HTML_H2 },
+ { "h3", HTML_H3 },
+ { "h4", HTML_H4 },
+ { "h5", HTML_H5 },
+ { "h6", HTML_H6 },
+ { "span", HTML_SPAN },
+ { "div", HTML_DIV },
+
+ { "c", XML_C },
+ // { "code", XML_CODE }, <= ambiguous <code> is also a HTML tag
+ { "description", XML_DESCRIPTION },
+ { "example", XML_EXAMPLE },
+ { "exception", XML_EXCEPTION },
+ { "include", XML_INCLUDE },
+ { "item", XML_ITEM },
+ { "list", XML_LIST }, // type="table|bullet|number"
+ { "listheader", XML_LISTHEADER },
+ { "para", XML_PARA },
+ { "param", XML_PARAM },
+ { "paramref", XML_PARAMREF },
+ { "typeparam", XML_TYPEPARAM },
+ { "typeparamref", XML_TYPEPARAMREF },
+ { "permission", XML_PERMISSION },
+ { "remarks", XML_REMARKS },
+ { "returns", XML_RETURNS },
+ { "see", XML_SEE },
+ { "seealso", XML_SEEALSO },
+ { "summary", XML_SUMMARY },
+ { "term", XML_TERM },
+ { "value", XML_VALUE },
+ { 0, 0 }
+};
+
+//----------------------------------------------------------------------------
+
+Mapper *Mappers::cmdMapper = new Mapper(cmdMap,TRUE);
+Mapper *Mappers::htmlTagMapper = new Mapper(htmlTagMap,FALSE);
+
+void Mappers::freeMappers()
+{
+ delete cmdMapper; cmdMapper = 0;
+ delete htmlTagMapper; htmlTagMapper = 0;
+}
+
+
diff --git a/src/cmdmapper.h b/src/cmdmapper.h
new file mode 100644
index 0000000..3b01030
--- /dev/null
+++ b/src/cmdmapper.h
@@ -0,0 +1,217 @@
+/******************************************************************************
+ *
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _CMDMAPPER_H
+#define _CMDMAPPER_H
+
+#include <qdict.h>
+
+struct CommandMap
+{
+ const char *cmdName;
+ int cmdId;
+};
+
+const int SIMPLESECT_BIT = 0x1000;
+
+enum CommandType
+{
+ CMD_UNKNOWN = 0,
+ CMD_ADDINDEX = 1,
+ CMD_AMP = 2,
+ CMD_ANCHOR = 3,
+ CMD_AT = 4,
+ CMD_ATTENTION = 5 | SIMPLESECT_BIT,
+ CMD_AUTHOR = 6 | SIMPLESECT_BIT,
+ CMD_AUTHORS = 7 | SIMPLESECT_BIT,
+ CMD_BOLD = 8,
+ CMD_BSLASH = 9,
+ CMD_CODE = 10,
+ CMD_COPYDOC = 11,
+ CMD_DATE = 12 | SIMPLESECT_BIT,
+ CMD_DOLLAR = 13,
+ CMD_DONTINCLUDE = 14,
+ CMD_DOTFILE = 15,
+ CMD_EMPHASIS = 16,
+ CMD_ENDCODE = 17,
+ CMD_ENDHTMLONLY = 18,
+ CMD_ENDLATEXONLY = 19,
+ CMD_ENDLINK = 20,
+ CMD_ENDSECREFLIST= 21,
+ CMD_ENDVERBATIM = 22,
+ CMD_ENDXMLONLY = 23,
+ CMD_EXCEPTION = 24 | SIMPLESECT_BIT,
+ CMD_FORMULA = 25,
+ CMD_GREATER = 26,
+ CMD_HASH = 27,
+ CMD_HTMLINCLUDE = 28,
+ CMD_HTMLONLY = 29,
+ CMD_IMAGE = 30,
+ CMD_INCLUDE = 31,
+ CMD_INTERNAL = 32,
+ CMD_INTERNALREF = 33,
+ CMD_INVARIANT = 34 | SIMPLESECT_BIT ,
+ CMD_LATEXONLY = 35,
+ CMD_LESS = 36,
+ CMD_LI = 37,
+ CMD_LINE = 38,
+ CMD_LINEBREAK = 39,
+ CMD_LINK = 40,
+ CMD_NOTE = 41 | SIMPLESECT_BIT,
+ CMD_PAR = 42 | SIMPLESECT_BIT,
+ CMD_PARAM = 43 | SIMPLESECT_BIT,
+ CMD_PERCENT = 44,
+ CMD_POST = 45 | SIMPLESECT_BIT,
+ CMD_PRE = 46 | SIMPLESECT_BIT ,
+ CMD_REF = 47,
+ CMD_SECREFITEM = 48,
+ CMD_REMARK = 49 | SIMPLESECT_BIT ,
+ CMD_RETURN = 50 | SIMPLESECT_BIT ,
+ CMD_RETVAL = 51 | SIMPLESECT_BIT,
+ CMD_SA = 52 | SIMPLESECT_BIT ,
+ CMD_SECREFLIST = 53,
+ CMD_SECTION = 54,
+ CMD_SUBPAGE = 55,
+ CMD_SUBSECTION = 56,
+ CMD_SUBSUBSECTION= 57,
+ CMD_PARAGRAPH = 58,
+ CMD_SINCE = 59 | SIMPLESECT_BIT,
+ CMD_SKIP = 60,
+ CMD_SKIPLINE = 61,
+ CMD_STARTCODE = 62,
+ CMD_JAVALINK = 63,
+ CMD_UNTIL = 64,
+ CMD_VERBATIM = 65,
+ CMD_VERBINCLUDE = 66,
+ CMD_VERSION = 67 | SIMPLESECT_BIT,
+ CMD_WARNING = 68 | SIMPLESECT_BIT,
+ CMD_XREFITEM = 69 | SIMPLESECT_BIT,
+ CMD_XMLONLY = 70,
+ CMD_DOT = 71,
+ CMD_ENDDOT = 72,
+ CMD_MSC = 73,
+ CMD_ENDMSC = 74,
+ CMD_MANONLY = 75,
+ CMD_ENDMANONLY = 76,
+ CMD_INCWITHLINES = 77,
+ CMD_INHERITDOC = 78,
+ CMD_TPARAM = 79 | SIMPLESECT_BIT,
+ CMD_COPYBRIEF = 80,
+ CMD_COPYDETAILS = 81,
+ CMD_QUOTE = 82,
+ CMD_MSCFILE = 83,
+ CMD_DCOLON = 84
+};
+
+enum HtmlTagType
+{
+ HTML_UNKNOWN = 0,
+ HTML_CENTER = 1,
+ HTML_TABLE = 2,
+ HTML_CAPTION = 3,
+ HTML_SMALL = 4,
+ HTML_CODE = 5,
+ HTML_IMG = 6,
+ HTML_PRE = 7,
+ HTML_SUB = 8,
+ HTML_SUP = 9,
+ HTML_TR = 10,
+ HTML_TD = 11,
+ HTML_TH = 12,
+ HTML_OL = 13,
+ HTML_UL = 14,
+ HTML_LI = 15,
+ HTML_EMPHASIS = 16,
+ HTML_HR = 17,
+ HTML_DL = 18,
+ HTML_DT = 19,
+ HTML_DD = 20,
+ HTML_BR = 21,
+ HTML_A = 22,
+ HTML_BOLD = 23,
+ HTML_P = 24,
+ HTML_H1 = 25,
+ HTML_H2 = 26,
+ HTML_H3 = 27,
+ HTML_H4 = 28,
+ HTML_H5 = 29,
+ HTML_H6 = 30,
+ HTML_SPAN = 31,
+ HTML_DIV = 32,
+
+ XML_CmdMask = 0x100,
+
+ XML_C = XML_CmdMask + 0,
+ XML_CODE = XML_CmdMask + 1,
+ XML_DESCRIPTION = XML_CmdMask + 2,
+ XML_EXAMPLE = XML_CmdMask + 3,
+ XML_EXCEPTION = XML_CmdMask + 4,
+ XML_INCLUDE = XML_CmdMask + 5,
+ XML_ITEM = XML_CmdMask + 6,
+ XML_LIST = XML_CmdMask + 7,
+ XML_LISTHEADER = XML_CmdMask + 8,
+ XML_PARA = XML_CmdMask + 9,
+ XML_PARAM = XML_CmdMask + 10,
+ XML_PARAMREF = XML_CmdMask + 11,
+ XML_PERMISSION = XML_CmdMask + 12,
+ XML_REMARKS = XML_CmdMask + 13,
+ XML_RETURNS = XML_CmdMask + 14,
+ XML_SEE = XML_CmdMask + 15,
+ XML_SEEALSO = XML_CmdMask + 16,
+ XML_SUMMARY = XML_CmdMask + 17,
+ XML_TERM = XML_CmdMask + 18,
+ XML_TYPEPARAM = XML_CmdMask + 19,
+ XML_TYPEPARAMREF = XML_CmdMask + 20,
+ XML_VALUE = XML_CmdMask + 21
+};
+
+class Mapper
+{
+ public:
+ int map(const char *n)
+ {
+ QCString name=n;
+ if (!m_cs) name=name.lower();
+ int *result;
+ return !name.isEmpty() && (result=m_map.find(name)) ? *result: 0;
+ }
+
+ Mapper(const CommandMap *cm,bool caseSensitive) : m_map(89), m_cs(caseSensitive)
+ {
+ m_map.setAutoDelete(TRUE);
+ const CommandMap *p = cm;
+ while (p->cmdName)
+ {
+ m_map.insert(p->cmdName,new int(p->cmdId));
+ p++;
+ }
+ }
+ private:
+ QDict<int> m_map;
+ bool m_cs;
+};
+
+struct Mappers
+{
+ static void freeMappers();
+ static Mapper *cmdMapper;
+ static Mapper *htmlTagMapper;
+};
+
+
+#endif
diff --git a/src/code.cpp b/src/code.cpp
new file mode 100644
index 0000000..90fb15c
--- /dev/null
+++ b/src/code.cpp
@@ -0,0 +1,14003 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer codeYY_create_buffer
+#define yy_delete_buffer codeYY_delete_buffer
+#define yy_flex_debug codeYY_flex_debug
+#define yy_init_buffer codeYY_init_buffer
+#define yy_flush_buffer codeYY_flush_buffer
+#define yy_load_buffer_state codeYY_load_buffer_state
+#define yy_switch_to_buffer codeYY_switch_to_buffer
+#define yyin codeYYin
+#define yyleng codeYYleng
+#define yylex codeYYlex
+#define yylineno codeYYlineno
+#define yyout codeYYout
+#define yyrestart codeYYrestart
+#define yytext codeYYtext
+#define yywrap codeYYwrap
+#define yyalloc codeYYalloc
+#define yyrealloc codeYYrealloc
+#define yyfree codeYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE codeYYrestart(codeYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t codeYYleng;
+
+extern FILE *codeYYin, *codeYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up codeYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up codeYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via codeYYrestart()), so that the user can continue scanning by
+ * just pointing codeYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when codeYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t codeYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow codeYYwrap()'s to do buffer switches
+ * instead of setting up a fresh codeYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void codeYYrestart (FILE *input_file );
+void codeYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE codeYY_create_buffer (FILE *file,int size );
+void codeYY_delete_buffer (YY_BUFFER_STATE b );
+void codeYY_flush_buffer (YY_BUFFER_STATE b );
+void codeYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void codeYYpop_buffer_state (void );
+
+static void codeYYensure_buffer_stack (void );
+static void codeYY_load_buffer_state (void );
+static void codeYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER codeYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE codeYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE codeYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE codeYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *codeYYalloc (yy_size_t );
+void *codeYYrealloc (void *,yy_size_t );
+void codeYYfree (void * );
+
+#define yy_new_buffer codeYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ codeYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ codeYY_create_buffer(codeYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ codeYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ codeYY_create_buffer(codeYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define codeYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *codeYYin = (FILE *) 0, *codeYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int codeYYlineno;
+
+int codeYYlineno = 1;
+
+extern char *codeYYtext;
+#define yytext_ptr codeYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up codeYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ codeYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 189
+#define YY_END_OF_BUFFER 190
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[6086] =
+ { 0,
+ 86, 86, 87, 87, 77, 77, 134, 134, 110, 110,
+ 190, 188, 189, 187, 189, 1, 188, 189, 185, 188,
+ 189, 186, 188, 189, 188, 189, 188, 189, 188, 189,
+ 188, 189, 86, 188, 189, 89, 188, 189, 86, 185,
+ 188, 189, 86, 186, 188, 189, 86, 188, 189, 86,
+ 188, 189, 188, 189, 86, 188, 189, 86, 188, 189,
+ 87, 188, 189, 90, 188, 189, 87, 185, 188, 189,
+ 87, 186, 188, 189, 87, 188, 189, 87, 188, 189,
+ 87, 188, 189, 87, 188, 189, 92, 95, 188, 189,
+ 96, 187, 189, 1, 92, 95, 188, 189, 94, 95,
+
+ 188, 189, 92, 95, 185, 188, 189, 92, 95, 186,
+ 188, 189, 92, 95, 188, 189, 92, 95, 188, 189,
+ 92, 95, 188, 189, 92, 95, 188, 189, 23, 24,
+ 188, 189, 187, 189, 1, 23, 24, 188, 189, 23,
+ 24, 185, 188, 189, 23, 24, 186, 188, 189, 23,
+ 188, 189, 23, 24, 188, 189, 23, 188, 189, 23,
+ 24, 188, 189, 23, 188, 189, 155, 188, 189, 155,
+ 188, 189, 1, 155, 188, 189, 155, 185, 188, 189,
+ 155, 186, 188, 189, 188, 189, 188, 189, 155, 188,
+ 189, 155, 188, 189, 188, 189, 158, 161, 188, 189,
+
+ 160, 187, 189, 1, 159, 161, 188, 189, 158, 161,
+ 185, 188, 189, 158, 161, 186, 188, 189, 158, 161,
+ 188, 189, 158, 161, 188, 189, 158, 161, 188, 189,
+ 158, 161, 188, 189, 158, 161, 188, 189, 165, 168,
+ 188, 189, 167, 187, 189, 1, 165, 168, 188, 189,
+ 165, 168, 185, 188, 189, 165, 168, 186, 188, 189,
+ 168, 188, 189, 165, 168, 188, 189, 165, 168, 188,
+ 189, 165, 168, 188, 189, 165, 168, 188, 189, 188,
+ 189, 187, 189, 1, 188, 189, 67, 188, 189, 84,
+ 188, 189, 188, 189, 85, 188, 189, 185, 188, 189,
+
+ 67, 186, 188, 189, 9, 67, 188, 189, 104, 188,
+ 189, 9, 67, 188, 189, 101, 188, 189, 67, 188,
+ 189, 123, 188, 189, 97, 188, 189, 98, 188, 189,
+ 99, 188, 189, 188, 189, 8273, 188, 189,16464,16465,
+ 16467, 8273, 188, 189,16464,16465,16467, 8273, 188, 189,
+ 16464,16465,16467, 104, 185, 188, 189, 122, 186, 188,
+ 189, 8273, 188, 189,16464,16465,16467, 8273, 188, 189,
+ 16464,16465,16467, 8273, 188, 189,16464,16465,16467, 8273,
+ 188, 189,16464,16465,16467, 8273, 188, 189,16464,16465,
+ 16467, 8273, 188, 189,16464,16465,16467, 8273, 188, 189,
+
+ 16464,16465,16467, 8273, 188, 189,16464,16465,16467, 8273,
+ 188, 189,16464,16465,16467, 8273, 188, 189,16464,16465,
+ 16467, 8273, 188, 189,16464,16465,16467, 8273, 188, 189,
+ 16464,16465,16467, 8273, 188, 189,16464,16465,16467, 8273,
+ 188, 189,16464,16465,16467, 8273, 188, 189,16464,16465,
+ 16467, 8273, 188, 189,16464,16465,16467, 8273, 188, 189,
+ 16464,16465,16467, 8273, 188, 189,16464,16465,16467, 8273,
+ 188, 189,16464,16465,16467, 8273, 188, 189,16464,16465,
+ 16467, 27, 188, 189, 28, 188, 189, 67, 188, 189,
+ 188, 189, 22, 188, 189, 67, 188, 189, 132, 188,
+
+ 189, 188, 189, 132, 188, 189, 132, 188, 189, 131,
+ 185, 188, 189, 133, 186, 188, 189, 132, 188, 189,
+ 132, 188, 189, 130, 188, 189, 132, 188, 189, 132,
+ 188, 189, 129, 188, 189, 132, 188, 189, 132, 188,
+ 189, 132, 188, 189, 188, 189, 128, 188, 189,16532,
+ 128, 188, 189,16532, 132, 188, 189, 128, 188, 189,
+ 16532, 128, 188, 189,16532, 128, 188, 189,16532, 128,
+ 188, 189,16532, 128, 188, 189,16532, 128, 188, 189,
+ 16532, 128, 188, 189,16532, 128, 188, 189,16532, 128,
+ 188, 189,16532, 128, 188, 189,16532, 128, 188, 189,
+
+ 16532, 128, 188, 189,16532, 128, 188, 189,16532, 128,
+ 188, 189,16532, 128, 188, 189,16532, 128, 188, 189,
+ 16532, 128, 188, 189,16532, 128, 188, 189,16532, 128,
+ 188, 189,16532, 128, 188, 189,16532, 132, 188, 189,
+ 132, 188, 189, 132, 188, 189, 169, 188, 189, 169,
+ 188, 189, 187, 189, 1, 169, 188, 189, 84, 169,
+ 188, 189, 169, 188, 189, 85, 169, 188, 189, 133,
+ 169, 186, 188, 189, 169, 188, 189, 169, 188, 189,
+ 169, 188, 189, 8295, 188, 189,16486,16487, 169, 185,
+ 188, 189, 169, 186, 188, 189, 28, 169, 188, 189,
+
+ 169, 188, 189, 8295, 169, 188, 189,16486,16487, 169,
+ 188, 189, 169, 188, 189, 188, 189, 132, 188, 189,
+ 152, 188, 189, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 128, 188, 189,16534,16535, 128, 188,
+ 189,16534,16535, 188, 189, 85, 188, 189, 144, 188,
+ 189, 146, 188, 189, 145, 188, 189, 188, 189, 188,
+ 189, 31, 188, 189, 39, 188, 189, 30, 188, 189,
+ 33, 188, 189, 33, 188, 189, 41, 188, 189, 188,
+ 189, 188, 189, 188, 189, 40, 188, 189, 34, 188,
+ 189, 188, 189, 8, 187, 189, 188, 189, 9, 188,
+ 189, 35, 188, 189, 188, 189, 38, 188, 189, 38,
+
+ 188, 189, 38, 188, 189, 38, 188, 189, 38, 188,
+ 189, 188, 189, 188, 189, 48, 185, 188, 189, 51,
+ 188, 189, 44, 188, 189, 45, 188, 189, 188, 189,
+ 43, 188, 189, 43, 188, 189, 43, 188, 189, 188,
+ 189, 22, 188, 189, 49, 185, 188, 189, 50, 186,
+ 188, 189, 46, 188, 189, 47, 188, 189, 188, 189,
+ 16405, 1, 188, 189,16405, 185, 188, 189,16405, 186,
+ 188, 189,16405, 188, 189,16405, 188, 189,16405, 188,
+ 189,16405, 188, 189,16405, 72, 188, 189, 73, 188,
+ 189, 188, 189, 188, 189, 188, 189, 188, 189, 188,
+
+ 189, 188, 189, 188, 189, 188, 189, 188, 189, 188,
+ 189, 188, 189, 188, 189, 188, 189, 188, 189, 188,
+ 189, 187, 189, 1, 188, 189, 188, 189, 77, 188,
+ 189, 188, 189, 74, 188, 189, 75, 188, 189, 75,
+ 188, 189, 75, 188, 189, 75, 188, 189, 75, 188,
+ 189, 75, 188, 189, 75, 188, 189, 75, 188, 189,
+ 75, 188, 189, 75, 188, 189, 75, 188, 189, 75,
+ 188, 189, 75, 188, 189, 188, 189, 188, 189, 143,
+ 188, 189, 134, 143, 188, 189, 134, 187, 189, 1,
+ 143, 188, 189, 142, 143, 188, 189, 143, 188, 189,
+
+ 143, 185, 188, 189, 143, 186, 188, 189, 143, 188,
+ 189, 135, 143, 188, 189, 143, 188, 189, 139, 143,
+ 188, 189, 139, 143, 188, 189, 139, 143, 188, 189,
+ 139, 143, 188, 189, 139, 143, 188, 189, 139, 143,
+ 188, 189, 137, 143, 188, 189, 134, 143, 188, 189,
+ 143, 188, 189, 19, 188, 189, 20, 187, 189, 1,
+ 19, 188, 189, 19, 188, 189, 19, 185, 188, 189,
+ 19, 186, 188, 189, 19, 188, 189, 10, 19, 188,
+ 189, 12, 19, 188, 189, 19, 188, 189, 18, 19,
+ 188, 189, 18, 19, 188, 189, 18, 19, 188, 189,
+
+ 18, 19, 188, 189, 18, 19, 188, 189, 18, 19,
+ 188, 189, 18, 19, 188, 189, 18, 19, 188, 189,
+ 18, 19, 188, 189, 18, 19, 188, 189, 18, 19,
+ 188, 189, 18, 19, 188, 189, 18, 19, 188, 189,
+ 19, 188, 189, 19, 188, 189, 19, 188, 189, 11,
+ 19, 185, 188, 189, 17, 18, 19, 188, 189, 19,
+ 188, 189, 16, 19, 186, 188, 189, 15, 18, 19,
+ 188, 189, 15, 18, 19, 188, 189, 15, 18, 19,
+ 188, 189, 15, 18, 19, 188, 189, 15, 18, 19,
+ 188, 189, 15, 18, 19, 188, 189, 15, 18, 19,
+
+ 188, 189, 15, 18, 19, 188, 189, 15, 18, 19,
+ 188, 189, 15, 18, 19, 188, 189, 15, 18, 19,
+ 188, 189, 15, 18, 19, 188, 189, 15, 18, 19,
+ 188, 189, 120, 188, 189, 121, 187, 189, 1, 120,
+ 188, 189, 114, 120, 188, 189, 115, 120, 188, 189,
+ 120, 188, 189, 116, 120, 185, 188, 189, 117, 120,
+ 186, 188, 189, 120, 188, 189, 120, 188, 189, 107,
+ 119, 120, 188, 189, 105, 120, 185, 188, 189, 106,
+ 120, 186, 188, 189, 120, 188, 189, 120, 188, 189,
+ 115, 120, 188, 189, 119, 120, 188, 189,16492,16493,
+
+ 110, 120, 188, 189, 1, 110, 120, 188, 189, 112,
+ 120, 188, 189, 115, 120, 188, 189, 110, 120, 185,
+ 188, 189, 110, 120, 186, 188, 189, 110, 120, 188,
+ 189, 110, 120, 188, 189, 110, 119, 120, 188, 189,
+ 120, 188, 189, 110, 120, 188, 189, 110, 120, 188,
+ 189, 188, 189, 187, 189, 1, 188, 189, 142, 188,
+ 189, 188, 189, 141, 188, 189, 140, 188, 189, 140,
+ 188, 189, 140, 188, 189, 140, 188, 189, 140, 188,
+ 189, 140, 188, 189, 140, 188, 189, 140, 188, 189,
+ 140, 188, 189, 140, 188, 189, 140, 188, 189, 140,
+
+ 188, 189, 140, 188, 189, 137, 188, 189, 188, 189,
+ 58, 188, 189, 57, 187, 189, 1, 58, 188, 189,
+ 58, 188, 189, 58, 185, 188, 189, 58, 186, 188,
+ 189, 58, 188, 189, 58, 188, 189, 56, 58, 188,
+ 189, 58, 188, 189, 58, 188, 189, 182, 184, 183,
+ 182, 184, 86, 86, 88, 182, 86, 88, 184, 89,
+ 183, 91, 86, 86, 86, 88, 182, 86, 88, 184,
+ 87, 87, 88, 182, 87, 88, 184, 87, 183, 87,
+ 87, 87, 88, 182, 87, 88, 184, 92, 93, 92,
+ 182, 92, 184, 92, 92, 92, 182, 92, 184, 24,
+
+ 171, 26, 184, 24, 183, 25, 24, 26, 184, 155,
+ 155, 156, 154, 182, 154, 184, 155, 183, 155, 154,
+ 182, 154, 184, 158, 158, 158, 182, 158, 184, 158,
+ 183, 157, 158, 158, 158, 182, 158, 184, 165, 164,
+ 166, 182, 165, 166, 184, 165, 183, 165, 165, 166,
+ 182, 165, 166, 184, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 101, 123, 8273, 8275, 8272, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8258, 8273,16448,16450,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8260, 8273,16452,16464,16465,16467, 8258, 8273,
+ 16448,16450,16464,16465,16467, 8273,16464,16465,16467, 8273,
+
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 22, 132, 128,16532, 128,16532, 132, 132, 132,
+ 132, 147, 8340, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+
+ 16532, 63, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 8295,16486,16487, 8295, 8294, 8295,16486,16487,
+ 8295,16486,16487, 128,16534,16535, 152, 8342, 8343, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 146, 146, 39, 41, 33, 31, 39,
+ 33, 33, 41, 40, 34, 34, 38, 38, 38, 38,
+ 38, 38, 43, 43, 43, 43, 43, 22,16405, 8213,
+ 182,16405, 184,16405, 8213, 183,16405,16405, 182,16405,
+ 184,16405, 8260,16452, 75, 77, 75, 75, 75, 75,
+
+ 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 134, 137, 134, 139, 139, 139, 139,
+ 139, 139, 139, 134, 18, 18, 18, 18, 18, 18,
+ 18, 18, 8260,16452, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 17, 18, 17, 18, 13, 15, 18,
+ 15, 18, 15, 18, 15, 18, 15, 18, 15, 18,
+ 15, 18, 14, 15, 18, 15, 18, 15, 18, 15,
+ 18, 15, 18, 15, 18, 15, 18, 15, 18, 15,
+ 18, 15, 18, 107, 119, 114, 183, 107, 119, 119,
+ 16492,16493, 119,16492,16493, 8301, 8300, 110, 119, 110,
+
+ 182, 110, 184, 118, 183, 110, 119, 111, 110, 110,
+ 110, 182, 110, 184, 140, 140, 140, 140, 140, 140,
+ 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+ 140, 140, 140, 140, 56, 56, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 163, 165, 165, 165,
+ 165, 8273,16464,16465, 8273,16464,16465,16467, 8273,16464,
+ 16465, 100, 100, 8274,16466, 124, 8271,16463, 8273,16464,
+
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8253, 8273,16445,16446,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 65, 65, 8258, 8273, 65, 8256, 65, 8275, 65,
+ 8272, 65, 65, 8273,16464,16465,16467, 65, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8258, 8273,
+ 16448,16450,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8260, 8273, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8260, 8273,16452,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 8273,16464,16465,16467, 128,16532,16533, 128, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 127, 127, 127, 147,
+ 127, 127, 8340, 127, 127, 128,16532, 127, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+
+ 128,16532, 128,16532, 128,16532, 128,16532, 126, 126,
+ 126, 147, 126, 126, 8340, 126, 126, 126, 128,16532,
+ 128,16532, 63, 63, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+
+ 128,16532, 128,16532, 8295,16487, 8295,16487, 8295, 8295,
+ 16486,16487, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 127, 127, 127, 8342, 127, 127,
+ 8343, 128,16534,16535, 127, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+
+ 16535, 128,16534,16535, 128,16534,16535, 126, 126, 126,
+ 8342, 126, 126, 8343, 126, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 33, 34,
+ 38, 38, 38, 38, 43, 43, 43, 43,16405,16405,
+ 16405,16405,16405,16405,16405,16405,16405,16405, 8260, 8271,
+ 16463, 75, 75, 75, 75, 75, 126, 126, 126, 126,
+ 75, 126, 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 139, 139, 139, 138, 139, 139, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+
+ 18, 15, 18, 15, 18, 15, 18, 15, 18, 15,
+ 18, 15, 18, 15, 18, 15, 18, 15, 18, 15,
+ 18, 15, 18, 15, 18, 15, 18, 113, 119, 110,
+ 110, 110, 110, 110, 110, 110, 110, 110, 110, 140,
+ 140, 140, 140, 140, 126, 140, 140, 140, 140, 140,
+ 140, 140, 140, 140, 140, 140, 140, 140, 180, 181,
+ 177, 179, 180, 175, 176, 177, 86, 180, 86, 86,
+ 181, 86, 86, 86, 86, 179, 180, 86, 175, 86,
+ 86, 87, 180, 87, 87, 181, 87, 87, 87, 87,
+ 179, 180, 87, 175, 87, 87, 92, 180, 92, 92,
+
+ 181, 92, 92, 92, 92, 179, 180, 92, 175, 92,
+ 92, 153, 181, 158, 180, 158, 158, 180, 158, 181,
+ 158, 158, 158, 158, 158, 179, 180, 158, 179, 180,
+ 158, 175, 158, 158, 158, 163, 165, 165, 165, 165,
+ 8273, 8273,16464,16465, 8273,16464,16465,16467, 8273, 8273,
+ 16464,16465, 8274, 29, 8253,16445,16446, 8258,16448,16450,
+ 8273,16464,16465,16467, 8271, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 60, 60, 8253, 8273, 60, 60, 8254, 8275, 60,
+ 8272, 60, 60, 60, 8273,16464,16465,16467, 8260, 8273,
+
+ 16452,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8258, 8273, 8256, 8275, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8253, 8273,16445,16446,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 65, 8258, 8273, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8253,
+ 8273,16445,16446,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 128,16532,16533, 8341, 128, 128,16532, 128,16532, 128,
+ 16532, 125, 125, 125, 147, 125, 125, 8340, 125, 125,
+ 125, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 127, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+
+ 128,16532, 128,16532, 128,16532, 128,16532, 128,16532,
+ 8295, 8295,16487, 8295, 8295,16487, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 125, 125, 125, 8342, 125,
+ 125, 8343, 125, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 127, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+
+ 16534,16535, 33, 33, 34, 29, 38, 38, 38, 38,
+ 43, 43, 43, 43, 180,16405, 8213, 180,16405, 181,
+ 16405,16405, 8213,16405,16405, 179, 180,16405, 8213, 179,
+ 180, 175,16405,16405, 8213,16405, 8260,16452, 75, 8271,
+ 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 139, 139, 139, 139, 18, 8260,16452, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 14, 15,
+ 18, 15, 18, 15, 18, 15, 18, 15, 18, 15,
+ 18, 15, 18, 15, 18, 15, 18, 15, 18, 113,
+ 110, 180, 110, 110, 181, 110, 110, 110, 110, 179,
+
+ 180, 110, 175, 110, 110, 140, 140, 140, 140, 140,
+ 140, 140, 140, 140, 140, 140, 140, 140, 140, 56,
+ 178, 173, 170, 179, 176, 174, 86, 179, 86, 86,
+ 87, 179, 87, 87, 92, 179, 92, 92, 178, 171,
+ 178, 173, 170, 171, 157, 177, 158, 179, 158, 179,
+ 158, 158, 157, 176, 177, 158, 158, 165, 165, 8273,
+ 16464,16465,16467, 60, 8253, 60, 60, 8254, 65, 8258,
+ 65, 8256, 65, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8253, 8273, 8254, 8275, 8273,16464,16465,
+
+ 16467, 8253, 8273,16445,16446,16464,16465,16467, 8253, 8273,
+ 16445,16446,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 60, 8253, 8273, 8197, 8273,
+ 16389,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8253, 8273,16445,16446,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 60, 59, 60, 8258, 8273,16448,16450,16464,16465,
+
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8253, 8273,16445,16446,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 128,16532, 128, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 125,
+ 59, 125, 8340, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 33, 33,
+
+ 38, 38, 38, 38, 43, 43, 43, 43, 179,16405,
+ 8213, 179,16405, 8213,16405, 8213, 71, 75, 75, 75,
+ 76, 75, 75, 75, 75, 75, 75, 75, 75, 139,
+ 16520, 139, 139, 139, 18, 18, 18, 18, 18, 18,
+ 18, 18, 15, 18, 15, 18, 15, 18, 15, 18,
+ 15, 18, 15, 18, 15, 18, 15, 18, 110, 179,
+ 110, 110, 140, 140, 140, 140, 140, 140, 140, 140,
+ 140, 140, 140, 140, 56, 172, 171, 172, 157, 176,
+ 157, 174, 59, 8253,16445,16446, 8253, 8254, 8258, 8256,
+ 8273,16464,16465,16467, 8271,16463,16467, 8271,16463,16467,
+
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 6, 60, 8253, 8273, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8253, 8273, 8197, 8273, 8197, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8253, 8273,16445,16446,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8253, 8273,
+ 16445,16446,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 60,
+ 8253, 8273, 60, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 59, 8340, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532,16486, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 33, 38, 38, 38, 38,16421, 43, 43, 42,
+ 43, 43, 8271,16463, 75, 76, 75, 75, 75, 8328,
+ 139, 139, 139, 139, 139, 139, 139, 18, 18, 18,
+ 15, 18, 15, 18, 15, 18, 140, 140, 140, 140,
+ 140, 140, 140, 140, 140, 162, 8273,16464,16465,16467,
+ 16467,16467, 8271, 8271,16463,16467, 8271,16463,16467,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+
+ 16465,16467, 6, 8253, 8273, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8253, 8273,16445,16446,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 60, 8253, 8273, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467, 8273,16464,16465,16467, 8253,
+
+ 8273, 8273,16464,16465,16467, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532,16486,16486, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 128,16534,16535, 128,16534,
+ 16535, 128,16534,16535, 128,16534,16535, 128,16534,16535,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 128,16534,16535, 33, 38, 36, 38, 38,
+
+ 8229, 42, 43, 8271,16463, 75, 75, 139, 139, 139,
+ 139, 139, 139, 139, 18, 15, 18, 140, 140, 140,
+ 140, 163, 8273,16464,16465,16467,16467,16467, 8271,16463,
+ 16467,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 54, 60, 54, 60, 8253, 8273,
+ 54, 60, 54, 60, 8254, 8275, 54, 60, 8272, 54,
+ 60, 54, 60, 54, 8273,16464,16465,16467, 54, 60,
+ 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,16464,
+ 16465,16467, 8253, 8273,16445,16446,16464,16465,16467, 7,
+ 8273, 7, 8273, 8273,16464,16465,16467, 8253, 8273, 8273,
+
+ 16464,16465,16467, 8273,16464,16465,16467, 8273,16464,16465,
+ 16467, 8253, 8273,16445,16446,16464,16465,16467, 8273,16464,
+ 16465,16467, 2, 128,16532, 128,16532, 128,16532, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532,16486,
+ 128,16534,16535, 128,16534,16535, 128,16534,16535, 128,
+ 16534,16535, 33, 38, 43, 54, 139, 139, 139, 139,
+ 139, 8253,16445,16446, 8273,16464,16465,16467,16467, 8271,
+ 16463,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8253, 8273, 69, 8271,16463, 60,
+ 60, 8253, 8273, 60, 60, 8254, 8275, 60, 8272, 8273,
+
+ 16464,16465,16467, 60, 60, 60, 8273,16464,16465,16467,
+ 4, 8273,16464,16465,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 54, 60, 8253, 8273, 54, 60, 128,
+ 16532, 128,16532, 128,16532, 128,16532, 128,16532, 128,
+ 16534,16535, 33, 38, 139, 139, 139, 139, 139, 3,
+ 60, 8253, 3, 60, 8273,16464,16465,16467,16467, 8271,
+ 16463,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 69, 8271,16463, 69, 8271, 53,
+ 8253, 8273, 53, 8254, 8275, 8272, 53, 8254, 8275, 8273,
+ 53, 8275, 53, 8271,16463, 8273,16464,16465,16467, 8273,
+
+ 16464,16465,16467, 8273,16464,16465,16467, 8253, 8273, 70,
+ 8271,16463, 128,16532, 128,16532, 128,16532, 128,16532,
+ 128,16532, 128,16534,16535, 33, 139, 139, 139, 139,
+ 139, 3, 8253, 3, 8273,16464,16465,16467,16467, 8271,
+ 16463,16467, 8273,16464,16465,16467, 78, 8273,16464,16465,
+ 16467, 69, 8271, 8271,16463, 52, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 8271, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 70, 8271,16463, 70, 8271, 78, 128,
+ 16532, 128,16532, 128,16532, 128,16534,16535,16520, 139,
+ 139, 8273, 8275,16467, 8271,16463,16467, 8273,16464,16465,
+
+ 16467, 8271, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 8273,16464,16465,16467, 70, 8271, 128,16532, 139, 139,
+ 53, 8275,16467, 8271,16463,16467, 8273,16464,16465,16467,
+ 8273,16464,16465, 8273,16464,16465,16467, 8273, 8273,16464,
+ 16465,16467, 8271,16463,16467, 8271,16463,16467, 8273,16464,
+ 16465,16467, 128,16532, 32,16467, 8271, 8271,16463,16467,
+ 8273,16464,16465,16467, 8271,16463, 8273, 8273,16464,16465,
+ 8273,16464,16465, 8273,16464,16465,16467,16467,16467, 8271,
+ 8271,16463,16467,16467, 6, 8273,16464,16465,16467, 128,
+ 16532,16467, 8273,16464,16465,16467, 8271,16463, 8273, 8273,
+
+ 16464,16465, 8273,16464,16465,16467,16467, 8271,16463,16467,
+ 16467, 8273,16464,16465,16467, 128,16532, 8273,16464,16465,
+ 16467, 8273,16464,16465,16467,16467, 8271,16463,16467, 55,
+ 8273,16464,16465,16467, 8273,16464,16465,16467,16467, 8271,
+ 16463,16467, 8273,16464,16465,16467, 8273,16464,16465,16467,
+ 16467, 8271,16463,16467, 8273,16464,16465,16467,16467, 8271,
+ 16463,16467, 8273,16464,16465,16467,16467, 8271,16463,16467,
+ 8273,16464,16465,16467,16467, 8273,16464,16465,16467, 8273,
+ 16464,16465,16467, 6, 8273
+ } ;
+
+static yyconst flex_int16_t yy_accept[3160] =
+ { 0,
+ 1, 1, 1, 2, 3, 4, 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, 5,
+ 5, 5, 5, 5, 5, 6, 7, 8, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 10,
+ 11, 11, 11, 11, 11, 12, 14, 16, 19, 22,
+ 25, 27, 29, 31, 33, 36, 39, 43, 47, 50,
+ 53, 55, 58, 61, 64, 67, 71, 75, 78, 81,
+ 84, 87, 91, 94, 99, 103, 108, 113, 117, 121,
+
+ 125, 129, 133, 135, 140, 145, 150, 153, 157, 160,
+ 164, 167, 170, 173, 177, 181, 185, 187, 189, 192,
+ 195, 197, 201, 204, 209, 214, 219, 223, 227, 231,
+ 235, 239, 243, 246, 251, 256, 261, 264, 268, 272,
+ 276, 280, 282, 284, 287, 290, 293, 295, 298, 301,
+ 305, 309, 312, 316, 319, 322, 325, 328, 331, 334,
+ 336, 342, 348, 354, 358, 362, 368, 374, 380, 386,
+ 392, 398, 404, 410, 416, 422, 428, 434, 440, 446,
+ 452, 458, 464, 470, 476, 482, 485, 488, 491, 493,
+ 496, 499, 502, 504, 507, 510, 514, 518, 521, 524,
+
+ 527, 530, 533, 536, 539, 542, 545, 547, 551, 555,
+ 558, 562, 566, 570, 574, 578, 582, 586, 590, 594,
+ 598, 602, 606, 610, 614, 618, 622, 626, 630, 634,
+ 638, 641, 644, 647, 650, 653, 655, 659, 663, 666,
+ 670, 675, 678, 681, 684, 689, 693, 697, 701, 704,
+ 710, 713, 716, 718, 721, 724, 729, 734, 739, 744,
+ 749, 754, 759, 764, 769, 774, 779, 784, 789, 794,
+ 799, 804, 809, 814, 819, 824, 829, 834, 836, 839,
+ 842, 845, 848, 850, 852, 855, 858, 861, 864, 867,
+ 870, 872, 874, 876, 879, 882, 884, 887, 889, 892,
+
+ 895, 897, 900, 903, 906, 909, 912, 914, 916, 920,
+ 923, 926, 929, 931, 934, 937, 940, 942, 945, 949,
+ 953, 956, 959, 962, 966, 970, 974, 977, 980, 983,
+ 986, 989, 992, 994, 996, 998, 1000, 1002, 1004, 1006,
+ 1008, 1010, 1012, 1014, 1016, 1018, 1020, 1022, 1024, 1027,
+ 1029, 1032, 1034, 1037, 1040, 1043, 1046, 1049, 1052, 1055,
+ 1058, 1061, 1064, 1067, 1070, 1073, 1076, 1078, 1080, 1083,
+ 1087, 1090, 1094, 1098, 1101, 1105, 1109, 1112, 1116, 1119,
+ 1123, 1127, 1131, 1135, 1139, 1143, 1147, 1151, 1154, 1157,
+ 1160, 1164, 1167, 1171, 1175, 1178, 1182, 1186, 1189, 1193,
+
+ 1197, 1201, 1205, 1209, 1213, 1217, 1221, 1225, 1229, 1233,
+ 1237, 1241, 1244, 1247, 1250, 1255, 1260, 1263, 1268, 1273,
+ 1278, 1283, 1288, 1293, 1298, 1303, 1308, 1313, 1318, 1323,
+ 1328, 1333, 1336, 1339, 1343, 1347, 1351, 1354, 1359, 1364,
+ 1367, 1370, 1375, 1380, 1385, 1388, 1391, 1395, 1401, 1405,
+ 1410, 1414, 1418, 1423, 1428, 1432, 1436, 1441, 1444, 1448,
+ 1452, 1454, 1456, 1459, 1462, 1464, 1467, 1470, 1473, 1476,
+ 1479, 1482, 1485, 1488, 1491, 1494, 1497, 1500, 1503, 1506,
+ 1509, 1511, 1514, 1517, 1521, 1524, 1528, 1532, 1535, 1538,
+ 1542, 1545, 1548, 1548, 1548, 1549, 1550, 1551, 1551, 1551,
+
+ 1552, 1553, 1554, 1557, 1560, 1562, 1563, 1564, 1565, 1568,
+ 1571, 1572, 1575, 1578, 1580, 1581, 1582, 1585, 1588, 1589,
+ 1590, 1592, 1594, 1595, 1596, 1598, 1600, 1601, 1601, 1601,
+ 1602, 1602, 1604, 1606, 1607, 1607, 1608, 1610, 1611, 1612,
+ 1612, 1613, 1615, 1617, 1619, 1620, 1622, 1624, 1625, 1626,
+ 1628, 1630, 1632, 1633, 1633, 1634, 1635, 1637, 1639, 1640,
+ 1641, 1643, 1646, 1648, 1649, 1650, 1652, 1655, 1655, 1655,
+ 1655, 1655, 1659, 1663, 1663, 1663, 1663, 1663, 1663, 1664,
+ 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665,
+ 1665, 1665, 1666, 1666, 1667, 1668, 1672, 1672, 1672, 1676,
+
+ 1680, 1684, 1688, 1692, 1696, 1700, 1704, 1708, 1712, 1716,
+ 1720, 1724, 1731, 1735, 1739, 1743, 1747, 1751, 1755, 1759,
+ 1763, 1767, 1771, 1775, 1779, 1783, 1789, 1796, 1800, 1804,
+ 1808, 1812, 1816, 1820, 1824, 1828, 1832, 1836, 1840, 1844,
+ 1848, 1852, 1856, 1860, 1864, 1868, 1872, 1876, 1880, 1884,
+ 1888, 1892, 1896, 1900, 1904, 1908, 1912, 1916, 1920, 1924,
+ 1928, 1928, 1928, 1932, 1932, 1933, 1933, 1933, 1934, 1936,
+ 1938, 1939, 1939, 1939, 1940, 1941, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1943, 1943, 1944,
+ 1946, 1946, 1946, 1948, 1950, 1952, 1954, 1956, 1958, 1960,
+
+ 1962, 1964, 1966, 1968, 1970, 1972, 1974, 1976, 1978, 1980,
+ 1982, 1984, 1986, 1988, 1990, 1992, 1994, 1996, 1998, 2000,
+ 2002, 2005, 2007, 2009, 2011, 2013, 2015, 2017, 2019, 2021,
+ 2023, 2025, 2027, 2029, 2031, 2033, 2035, 2037, 2039, 2041,
+ 2043, 2045, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061,
+ 2063, 2063, 2063, 2063, 2063, 2066, 2066, 2066, 2067, 2067,
+ 2068, 2071, 2071, 2071, 2071, 2071, 2074, 2074, 2077, 2078,
+ 2078, 2078, 2079, 2079, 2080, 2083, 2086, 2089, 2092, 2095,
+ 2098, 2101, 2104, 2107, 2110, 2113, 2116, 2119, 2122, 2125,
+ 2128, 2131, 2134, 2137, 2140, 2143, 2146, 2149, 2152, 2155,
+
+ 2158, 2161, 2164, 2167, 2170, 2173, 2176, 2179, 2182, 2185,
+ 2188, 2191, 2194, 2197, 2200, 2203, 2206, 2209, 2212, 2215,
+ 2218, 2221, 2224, 2227, 2230, 2233, 2236, 2239, 2242, 2245,
+ 2248, 2251, 2254, 2255, 2256, 2256, 2257, 2258, 2259, 2260,
+ 2261, 2262, 2262, 2263, 2264, 2264, 2264, 2265, 2266, 2266,
+ 2267, 2267, 2268, 2268, 2269, 2270, 2271, 2272, 2273, 2273,
+ 2274, 2274, 2275, 2276, 2277, 2278, 2278, 2279, 2280, 2281,
+ 2283, 2285, 2287, 2288, 2289, 2291, 2293, 2293, 2293, 2293,
+ 2293, 2293, 2293, 2293, 2295, 2295, 2295, 2295, 2295, 2295,
+ 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295,
+
+ 2296, 2296, 2297, 2297, 2297, 2298, 2298, 2298, 2299, 2300,
+ 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310,
+ 2311, 2312, 2313, 2314, 2314, 2314, 2314, 2314, 2315, 2315,
+ 2315, 2315, 2315, 2315, 2316, 2317, 2318, 2319, 2320, 2321,
+ 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331,
+ 2332, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343,
+ 2344, 2346, 2346, 2348, 2349, 2351, 2353, 2355, 2357, 2359,
+ 2361, 2363, 2366, 2368, 2370, 2372, 2374, 2376, 2378, 2380,
+ 2382, 2384, 2386, 2386, 2386, 2388, 2390, 2393, 2393, 2396,
+ 2397, 2398, 2399, 2400, 2402, 2404, 2406, 2408, 2409, 2410,
+
+ 2411, 2413, 2415, 2415, 2416, 2417, 2418, 2419, 2420, 2421,
+ 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431,
+ 2432, 2433, 2434, 2435, 2435, 2436, 2437, 2437, 2437, 2437,
+ 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437,
+ 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447,
+ 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457,
+ 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467,
+ 2467, 2467, 2467, 2467, 2467, 2467, 2468, 2469, 2470, 2471,
+ 2472, 2473, 2474, 2475, 2476, 2477, 2477, 2478, 2479, 2480,
+ 2481, 2482, 2485, 2489, 2489, 2489, 2492, 2493, 2494, 2494,
+
+ 2494, 2494, 2494, 2496, 2496, 2496, 2496, 2497, 2497, 2497,
+ 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
+ 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2499, 2503, 2507,
+ 2511, 2515, 2522, 2526, 2530, 2534, 2538, 2542, 2546, 2550,
+ 2554, 2558, 2562, 2563, 2566, 2567, 2570, 2572, 2573, 2574,
+ 2578, 2583, 2587, 2591, 2595, 2599, 2603, 2607, 2611, 2615,
+ 2619, 2626, 2630, 2634, 2638, 2642, 2646, 2648, 2652, 2656,
+ 2662, 2666, 2670, 2674, 2678, 2682, 2686, 2690, 2694, 2698,
+ 2702, 2706, 2710, 2714, 2718, 2722, 2726, 2730, 2734, 2738,
+ 2742, 2746, 2750, 2754, 2758, 2762, 2766, 2770, 2774, 2778,
+
+ 2782, 2786, 2790, 2794, 2798, 2802, 2806, 2810, 2814, 2818,
+ 2822, 2826, 2830, 2831, 2831, 2835, 2835, 2835, 2837, 2837,
+ 2837, 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2838,
+ 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2839,
+ 2841, 2843, 2845, 2847, 2849, 2851, 2853, 2855, 2857, 2859,
+ 2861, 2863, 2865, 2867, 2868, 2869, 2871, 2872, 2874, 2875,
+ 2876, 2878, 2881, 2883, 2885, 2887, 2889, 2891, 2893, 2895,
+ 2897, 2899, 2901, 2903, 2905, 2907, 2909, 2910, 2911, 2913,
+ 2914, 2916, 2917, 2918, 2921, 2923, 2924, 2925, 2927, 2929,
+ 2931, 2933, 2935, 2937, 2939, 2941, 2943, 2945, 2947, 2949,
+
+ 2951, 2953, 2955, 2957, 2959, 2961, 2963, 2965, 2967, 2969,
+ 2971, 2973, 2975, 2977, 2979, 2981, 2983, 2985, 2987, 2989,
+ 2991, 2993, 2995, 2997, 2999, 3001, 3003, 3005, 3007, 3007,
+ 3007, 3009, 3009, 3009, 3009, 3009, 3010, 3010, 3013, 3016,
+ 3019, 3022, 3025, 3028, 3031, 3034, 3037, 3040, 3043, 3046,
+ 3049, 3052, 3055, 3056, 3057, 3059, 3060, 3062, 3065, 3069,
+ 3072, 3075, 3078, 3081, 3084, 3087, 3090, 3093, 3096, 3099,
+ 3102, 3105, 3108, 3109, 3110, 3112, 3113, 3115, 3119, 3122,
+ 3125, 3128, 3131, 3134, 3137, 3140, 3143, 3146, 3149, 3152,
+ 3155, 3158, 3161, 3164, 3167, 3170, 3173, 3176, 3179, 3182,
+
+ 3185, 3188, 3191, 3194, 3197, 3200, 3203, 3206, 3209, 3212,
+ 3215, 3218, 3221, 3224, 3227, 3230, 3233, 3236, 3239, 3239,
+ 3240, 3240, 3241, 3241, 3242, 3243, 3244, 3245, 3245, 3245,
+ 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255,
+ 3256, 3257, 3258, 3259, 3259, 3259, 3259, 3259, 3259, 3259,
+ 3260, 3260, 3260, 3260, 3260, 3260, 3260, 3260, 3260, 3260,
+ 3260, 3260, 3260, 3260, 3260, 3262, 3263, 3264, 3265, 3266,
+ 3267, 3268, 3269, 3270, 3271, 3273, 3274, 3275, 3276, 3277,
+ 3278, 3279, 3280, 3281, 3282, 3283, 3283, 3283, 3283, 3283,
+ 3283, 3283, 3284, 3285, 3286, 3288, 3289, 3290, 3291, 3292,
+
+ 3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301, 3302,
+ 3304, 3306, 3308, 3310, 3312, 3314, 3316, 3318, 3320, 3322,
+ 3324, 3326, 3328, 3328, 3329, 3329, 3329, 3330, 3331, 3332,
+ 3333, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342,
+ 3343, 3344, 3345, 3347, 3348, 3349, 3350, 3351, 3352, 3353,
+ 3354, 3355, 3356, 3357, 3358, 3359, 3359, 3359, 3359, 3359,
+ 3359, 3360, 3360, 3361, 3361, 3362, 3362, 3362, 3364, 3365,
+ 3365, 3367, 3367, 3369, 3370, 3372, 3373, 3374, 3375, 3378,
+ 3380, 3381, 3382, 3384, 3385, 3387, 3388, 3389, 3390, 3393,
+ 3395, 3396, 3397, 3399, 3400, 3402, 3403, 3404, 3405, 3408,
+
+ 3410, 3411, 3412, 3412, 3412, 3412, 3412, 3412, 3414, 3416,
+ 3417, 3419, 3421, 3422, 3423, 3424, 3425, 3428, 3431, 3433,
+ 3434, 3435, 3436, 3436, 3437, 3437, 3438, 3439, 3440, 3441,
+ 3442, 3442, 3445, 3449, 3450, 3450, 3453, 3453, 3453, 3454,
+ 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3458,
+ 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458,
+ 3458, 3461, 3461, 3461, 3465, 3465, 3465, 3466, 3466, 3466,
+ 3470, 3474, 3478, 3482, 3483, 3486, 3487, 3490, 3492, 3493,
+ 3494, 3499, 3505, 3509, 3513, 3517, 3521, 3525, 3529, 3533,
+ 3535, 3535, 3537, 3541, 3545, 3552, 3556, 3560, 3564, 3568,
+
+ 3572, 3576, 3579, 3583, 3587, 3591, 3595, 3599, 3603, 3607,
+ 3611, 3615, 3619, 3623, 3627, 3631, 3635, 3639, 3643, 3647,
+ 3651, 3655, 3659, 3663, 3667, 3668, 3672, 3676, 3680, 3684,
+ 3688, 3692, 3696, 3700, 3704, 3708, 3712, 3716, 3720, 3727,
+ 3731, 3735, 3739, 3743, 3747, 3751, 3755, 3759, 3763, 3767,
+ 3771, 3771, 3771, 3773, 3774, 3774, 3775, 3775, 3775, 3775,
+ 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775,
+ 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3776, 3778, 3780,
+ 3782, 3783, 3784, 3786, 3787, 3789, 3790, 3791, 3794, 3796,
+ 3798, 3800, 3802, 3804, 3806, 3808, 3810, 3812, 3814, 3816,
+
+ 3818, 3820, 3822, 3824, 3825, 3827, 3829, 3831, 3833, 3835,
+ 3837, 3839, 3841, 3843, 3845, 3847, 3849, 3851, 3853, 3855,
+ 3857, 3859, 3861, 3863, 3865, 3867, 3869, 3871, 3873, 3875,
+ 3877, 3879, 3881, 3883, 3885, 3887, 3889, 3891, 3893, 3895,
+ 3897, 3899, 3901, 3903, 3905, 3907, 3909, 3911, 3912, 3914,
+ 3915, 3917, 3917, 3917, 3917, 3917, 3917, 3920, 3923, 3926,
+ 3927, 3928, 3930, 3931, 3933, 3937, 3940, 3943, 3946, 3949,
+ 3952, 3955, 3958, 3961, 3964, 3967, 3970, 3973, 3976, 3979,
+ 3980, 3983, 3986, 3989, 3992, 3995, 3998, 4001, 4004, 4007,
+ 4010, 4013, 4016, 4019, 4022, 4025, 4028, 4031, 4034, 4037,
+
+ 4040, 4043, 4046, 4049, 4052, 4055, 4058, 4061, 4064, 4067,
+ 4070, 4073, 4076, 4079, 4082, 4085, 4088, 4091, 4094, 4097,
+ 4100, 4103, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110,
+ 4111, 4111, 4111, 4111, 4112, 4113, 4114, 4115, 4117, 4119,
+ 4120, 4122, 4123, 4124, 4125, 4126, 4129, 4132, 4134, 4135,
+ 4136, 4137, 4139, 4139, 4139, 4139, 4139, 4139, 4139, 4139,
+ 4139, 4139, 4139, 4139, 4139, 4139, 4139, 4139, 4140, 4141,
+ 4141, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150,
+ 4151, 4152, 4153, 4153, 4153, 4153, 4153, 4154, 4155, 4156,
+ 4157, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168,
+
+ 4169, 4172, 4174, 4176, 4178, 4180, 4182, 4184, 4186, 4188,
+ 4190, 4190, 4191, 4191, 4193, 4194, 4196, 4197, 4198, 4199,
+ 4202, 4204, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4212,
+ 4213, 4214, 4215, 4216, 4217, 4218, 4219, 4220, 4220, 4221,
+ 4222, 4223, 4223, 4224, 4224, 4225, 4225, 4226, 4226, 4227,
+ 4229, 4230, 4231, 4233, 4234, 4235, 4237, 4238, 4239, 4240,
+ 4242, 4243, 4243, 4245, 4245, 4247, 4247, 4249, 4251, 4252,
+ 4253, 4256, 4256, 4257, 4258, 4258, 4258, 4259, 4260, 4264,
+ 4264, 4264, 4264, 4264, 4264, 4266, 4267, 4269, 4269, 4269,
+ 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269,
+
+ 4271, 4272, 4274, 4278, 4278, 4278, 4282, 4286, 4290, 4294,
+ 4296, 4296, 4298, 4302, 4309, 4316, 4320, 4324, 4328, 4332,
+ 4336, 4339, 4345, 4349, 4353, 4360, 4360, 4364, 4368, 4372,
+ 4376, 4380, 4384, 4388, 4392, 4396, 4400, 4404, 4408, 4412,
+ 4416, 4420, 4424, 4428, 4432, 4436, 4440, 4440, 4440, 4444,
+ 4448, 4452, 4456, 4460, 4464, 4468, 4472, 4476, 4480, 4484,
+ 4488, 4492, 4493, 4495, 4502, 4506, 4510, 4514, 4518, 4522,
+ 4529, 4533, 4537, 4541, 4541, 4541, 4543, 4543, 4543, 4543,
+ 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543, 4543,
+ 4543, 4544, 4546, 4548, 4550, 4552, 4554, 4556, 4558, 4560,
+
+ 4562, 4564, 4566, 4568, 4570, 4570, 4572, 4574, 4576, 4578,
+ 4580, 4582, 4584, 4586, 4588, 4590, 4592, 4594, 4596, 4598,
+ 4600, 4602, 4604, 4606, 4608, 4610, 4612, 4614, 4616, 4618,
+ 4620, 4622, 4624, 4626, 4628, 4630, 4631, 4634, 4636, 4638,
+ 4640, 4642, 4644, 4646, 4648, 4650, 4652, 4652, 4655, 4658,
+ 4661, 4664, 4667, 4670, 4673, 4676, 4679, 4682, 4685, 4688,
+ 4691, 4694, 4697, 4700, 4703, 4706, 4709, 4712, 4715, 4718,
+ 4721, 4724, 4727, 4730, 4733, 4736, 4739, 4742, 4745, 4748,
+ 4751, 4754, 4757, 4760, 4763, 4766, 4769, 4772, 4775, 4778,
+ 4781, 4784, 4787, 4790, 4793, 4796, 4799, 4800, 4801, 4802,
+
+ 4803, 4804, 4805, 4805, 4805, 4805, 4806, 4807, 4808, 4809,
+ 4811, 4813, 4814, 4815, 4816, 4817, 4817, 4818, 4818, 4818,
+ 4818, 4818, 4818, 4818, 4818, 4818, 4818, 4818, 4819, 4819,
+ 4820, 4822, 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4830,
+ 4830, 4830, 4830, 4830, 4832, 4833, 4834, 4835, 4836, 4837,
+ 4838, 4839, 4840, 4841, 4842, 4843, 4845, 4847, 4849, 4851,
+ 4853, 4855, 4857, 4859, 4859, 4859, 4861, 4862, 4863, 4864,
+ 4865, 4866, 4867, 4868, 4869, 4870, 4871, 4872, 4873, 4874,
+ 4875, 4876, 4876, 4876, 4876, 4877, 4877, 4879, 4881, 4881,
+ 4883, 4883, 4883, 4883, 4883, 4883, 4884, 4887, 4888, 4888,
+
+ 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889,
+ 4889, 4889, 4889, 4890, 4890, 4891, 4895, 4895, 4895, 4895,
+ 4898, 4901, 4901, 4905, 4909, 4913, 4917, 4921, 4925, 4929,
+ 4933, 4937, 4941, 4943, 4945, 4946, 4950, 4954, 4954, 4958,
+ 4962, 4966, 4970, 4974, 4978, 4982, 4986, 4990, 4994, 4998,
+ 5002, 5006, 5010, 5014, 5021, 5021, 5021, 5025, 5029, 5036,
+ 5040, 5044, 5048, 5052, 5056, 5060, 5063, 5064, 5068, 5072,
+ 5076, 5076, 5076, 5076, 5078, 5078, 5078, 5078, 5078, 5078,
+ 5078, 5078, 5078, 5078, 5078, 5078, 5078, 5080, 5082, 5084,
+ 5086, 5088, 5090, 5092, 5094, 5096, 5098, 5098, 5100, 5102,
+
+ 5104, 5106, 5108, 5110, 5112, 5114, 5116, 5118, 5120, 5122,
+ 5124, 5126, 5128, 5130, 5132, 5134, 5136, 5138, 5140, 5142,
+ 5144, 5144, 5144, 5145, 5145, 5148, 5151, 5154, 5157, 5160,
+ 5163, 5166, 5169, 5172, 5175, 5178, 5181, 5184, 5187, 5190,
+ 5193, 5196, 5199, 5202, 5205, 5208, 5211, 5214, 5217, 5220,
+ 5223, 5226, 5229, 5232, 5233, 5234, 5235, 5236, 5238, 5238,
+ 5238, 5238, 5239, 5240, 5242, 5243, 5243, 5243, 5243, 5243,
+ 5243, 5243, 5243, 5245, 5246, 5247, 5248, 5249, 5250, 5250,
+ 5250, 5250, 5250, 5250, 5251, 5252, 5253, 5254, 5255, 5256,
+ 5257, 5258, 5259, 5260, 5261, 5263, 5265, 5267, 5268, 5269,
+
+ 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5276, 5277, 5277,
+ 5277, 5277, 5277, 5277, 5277, 5277, 5277, 5277, 5277, 5277,
+ 5277, 5277, 5281, 5281, 5282, 5283, 5284, 5284, 5287, 5287,
+ 5290, 5290, 5290, 5291, 5295, 5299, 5303, 5306, 5310, 5314,
+ 5318, 5322, 5322, 5329, 5333, 5337, 5341, 5345, 5349, 5353,
+ 5357, 5361, 5365, 5368, 5368, 5368, 5372, 5376, 5380, 5384,
+ 5388, 5392, 5396, 5400, 5402, 5402, 5402, 5406, 5406, 5406,
+ 5406, 5406, 5406, 5406, 5406, 5406, 5406, 5406, 5406, 5406,
+ 5406, 5408, 5410, 5412, 5414, 5416, 5418, 5418, 5420, 5422,
+ 5424, 5426, 5428, 5430, 5432, 5434, 5436, 5438, 5440, 5442,
+
+ 5444, 5446, 5446, 5447, 5447, 5447, 5448, 5451, 5454, 5457,
+ 5460, 5463, 5466, 5469, 5472, 5475, 5478, 5481, 5484, 5487,
+ 5490, 5493, 5496, 5497, 5498, 5500, 5501, 5501, 5502, 5502,
+ 5502, 5503, 5504, 5504, 5504, 5504, 5504, 5506, 5507, 5508,
+ 5508, 5508, 5508, 5508, 5508, 5508, 5508, 5509, 5510, 5511,
+ 5512, 5513, 5514, 5515, 5516, 5518, 5519, 5520, 5521, 5522,
+ 5522, 5522, 5523, 5523, 5523, 5523, 5523, 5523, 5523, 5523,
+ 5523, 5523, 5527, 5528, 5529, 5532, 5532, 5533, 5537, 5541,
+ 5545, 5547, 5551, 5553, 5557, 5560, 5562, 5564, 5569, 5575,
+ 5579, 5583, 5590, 5592, 5593, 5594, 5598, 5600, 5600, 5600,
+
+ 5600, 5600, 5600, 5600, 5604, 5608, 5612, 5619, 5623, 5623,
+ 5623, 5624, 5624, 5624, 5624, 5624, 5624, 5624, 5624, 5624,
+ 5624, 5626, 5628, 5630, 5632, 5634, 5636, 5638, 5640, 5641,
+ 5644, 5647, 5650, 5653, 5654, 5655, 5655, 5656, 5657, 5657,
+ 5657, 5657, 5657, 5657, 5657, 5657, 5658, 5659, 5660, 5661,
+ 5662, 5662, 5662, 5662, 5662, 5662, 5665, 5665, 5669, 5670,
+ 5673, 5677, 5681, 5685, 5687, 5687, 5687, 5687, 5690, 5691,
+ 5694, 5695, 5698, 5700, 5704, 5705, 5706, 5711, 5711, 5711,
+ 5711, 5711, 5711, 5712, 5712, 5716, 5720, 5724, 5728, 5730,
+ 5730, 5730, 5730, 5730, 5730, 5732, 5734, 5736, 5738, 5740,
+
+ 5743, 5744, 5745, 5745, 5745, 5745, 5745, 5745, 5745, 5746,
+ 5747, 5748, 5749, 5750, 5750, 5750, 5753, 5755, 5755, 5759,
+ 5760, 5763, 5767, 5771, 5775, 5778, 5780, 5780, 5781, 5783,
+ 5783, 5786, 5787, 5787, 5787, 5790, 5790, 5791, 5791, 5793,
+ 5793, 5793, 5793, 5794, 5794, 5794, 5796, 5796, 5796, 5796,
+ 5796, 5796, 5800, 5804, 5808, 5810, 5810, 5810, 5810, 5813,
+ 5813, 5813, 5813, 5815, 5817, 5819, 5821, 5823, 5826, 5827,
+ 5827, 5827, 5827, 5827, 5827, 5828, 5829, 5830, 5831, 5832,
+ 5832, 5834, 5835, 5839, 5840, 5843, 5847, 5848, 5852, 5854,
+ 5856, 5856, 5857, 5857, 5857, 5857, 5861, 5865, 5865, 5865,
+
+ 5866, 5866, 5866, 5866, 5866, 5866, 5866, 5870, 5874, 5877,
+ 5879, 5879, 5879, 5880, 5882, 5884, 5886, 5889, 5889, 5889,
+ 5890, 5890, 5890, 5890, 5890, 5891, 5891, 5892, 5892, 5893,
+ 5894, 5895, 5898, 5902, 5903, 5903, 5903, 5907, 5907, 5907,
+ 5911, 5911, 5911, 5911, 5911, 5915, 5917, 5917, 5917, 5919,
+ 5919, 5919, 5919, 5919, 5919, 5920, 5921, 5921, 5923, 5924,
+ 5927, 5931, 5931, 5931, 5931, 5934, 5934, 5938, 5939, 5939,
+ 5943, 5943, 5943, 5943, 5946, 5949, 5949, 5949, 5949, 5953,
+ 5953, 5953, 5955, 5955, 5956, 5956, 5956, 5956, 5956, 5957,
+ 5958, 5958, 5961, 5961, 5965, 5965, 5967, 5968, 5968, 5971,
+
+ 5971, 5971, 5974, 5978, 5978, 5979, 5980, 5981, 5984, 5984,
+ 5984, 5985, 5986, 5986, 5990, 5990, 5990, 5992, 5992, 5993,
+ 5997, 5999, 6000, 6000, 6003, 6007, 6008, 6011, 6011, 6012,
+ 6012, 6016, 6016, 6018, 6022, 6026, 6027, 6030, 6031, 6035,
+ 6039, 6040, 6043, 6047, 6051, 6052, 6055, 6059, 6060, 6063,
+ 6067, 6068, 6071, 6075, 6076, 6080, 6084, 6086, 6086
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 22,
+ 22, 22, 22, 22, 22, 23, 23, 24, 25, 26,
+ 27, 28, 1, 29, 30, 31, 32, 33, 34, 31,
+ 35, 35, 36, 35, 37, 38, 35, 35, 39, 40,
+ 35, 41, 42, 43, 35, 35, 44, 45, 46, 35,
+ 47, 48, 49, 50, 51, 1, 52, 53, 54, 55,
+
+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
+ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
+ 76, 77, 78, 79, 80, 81, 1, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82
+ } ;
+
+static yyconst flex_int32_t yy_meta[83] =
+ { 0,
+ 1, 2, 3, 4, 5, 1, 6, 1, 7, 1,
+ 1, 8, 9, 10, 11, 1, 12, 13, 14, 15,
+ 16, 16, 16, 17, 18, 19, 20, 1, 1, 21,
+ 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 23, 24, 25, 1,
+ 26, 21, 21, 21, 21, 21, 21, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 27, 1, 28,
+ 29, 30
+ } ;
+
+static yyconst flex_int16_t yy_base[3549] =
+ { 0,
+ 0, 3, 8, 31, 55, 69, 92, 106, 111, 143,
+ 164, 183, 196, 233, 236, 255, 274, 287, 336, 22,
+ 418, 41, 500, 131, 582, 132, 664, 160, 746, 169,
+ 828, 199, 910, 200, 991, 1004, 1082, 213, 1028, 1032,
+ 1162, 1190, 1237, 221, 1311, 222, 1393, 259, 1475, 291,
+ 1557, 293, 1639, 304, 1721, 310, 1803, 312, 1885, 996,
+ 1967, 1024, 2049, 1045,11526,27527, 1165,27527,27527,27527,
+ 11,11518, 1166, 33, 0,27527, 0, 0, 50,11514,
+ 0, 1176, 70, 0,27527, 0, 0, 71,11513, 1178,
+ 72, 0, 1182, 0,11512, 0, 0, 73,11505, 1203,
+
+ 107, 0, 1210, 0, 0, 0, 108,11504, 6, 1212,
+ 123, 0, 61, 0, 0, 0,11489, 129,11492, 1223,
+ 155,11450, 1222,27527,11442,11441, 251, 94, 204, 1224,
+ 982, 0, 1229, 0, 0, 0,11468, 161,11479, 1250,
+ 202, 1243, 1256, 2130,27527,27527, 2134,11430, 92,27527,
+ 27527,27527,11446,27527, 214, 2119,11439,27527,27527, 2141,
+ 2142, 2214,11427,27527,27527, 180, 1201, 95, 1222, 252,
+ 1005, 2117, 2116, 1009, 66, 5, 2137, 2123, 2154, 220,
+ 2186, 2165, 240, 2170, 1228,27527,27527, 2247, 2262, 2173,
+ 305,11433,11388,11431, 14, 998,27527,11422, 167,27527,
+
+ 155, 1278,27527, 300,11420, 994, 2218, 2278, 2288,11418,
+ 2306, 2315, 2324, 2347, 2288, 2304, 2323, 2342, 2352, 2195,
+ 2325, 2367, 2368, 2377, 2392, 2400, 2409, 2418, 2427, 2437,
+ 127,27527, 2217,27527, 2502, 2507, 2511,27527, 2515,11394,
+ 27527, 999,11417,11425, 2538,27527,27527,27527, 2543, 2552,
+ 2564, 1047, 0, 1161,27527, 2568, 2580, 2598, 2607, 2616,
+ 2643, 2591, 2600, 2621, 2637, 2653, 2470, 2592, 2668, 2662,
+ 2678, 2680, 2693, 2699, 2711, 2719, 2471, 0,27527,27527,
+ 0,27527, 2376, 0, 2150, 317,27527,11407, 204, 1172,
+ 2702, 2274, 0,27527,11411, 2290, 2182, 0,27527,27527,
+
+ 241, 0,11371,11348,11356,11363, 2298, 0,27527,27527,
+ 27527,27527, 266, 0, 1164,11358, 2752,27527,27527,27527,
+ 27527,27527, 12, 1048, 1192, 1193, 2608, 1194, 2781, 2777,
+ 27527,27527,11383,11344, 204,11342,11322,11327, 994,11315,
+ 11326, 1218, 74,11309,11306,11315, 2556, 2791, 2814, 2818,
+ 1157,11342,27527, 2829, 2841, 2845, 2854, 2858, 2883, 2888,
+ 2892, 2899, 2924, 2931, 2935, 2961, 2965, 2973,27527, 2977,
+ 2986, 3000,27527, 0,27527,27527, 1249,27527,11358, 0,
+ 11298,11285,11296,11278,11277,27527, 3006, 1281,27527, 2311,
+ 27527, 0,27527,27527, 1284,27527,27527,11335, 0,11307,
+
+ 11262,11263,11255,11252, 1151,11242,11252, 2103,11236,11233,
+ 11241, 2316, 2253, 0,27527, 2356, 0,27527, 0,11250,
+ 11216,11211,11198,11200, 2148,11196,11208, 2343,11194,11192,
+ 11203,27527, 2333,27527,27527, 0,11197,27527,27527, 2427,
+ 11237, 0,27527,27527, 2462, 2430, 0, 3014, 0, 0,
+ 27527, 0, 0, 0, 2442,11236, 3084, 0, 2570, 2477,
+ 3078, 3115, 3121,27527, 0,27527, 0,11204,11168, 1209,
+ 11163,11165, 2188,11072, 2100, 2612,11070,11068,11077,27527,
+ 3135,27527, 2805,27527, 0,27527,27527, 2479,11104,11071,
+ 2834, 2529, 2940, 2559, 1057, 2249,27527, 2942, 2582, 2624,
+
+ 2668, 0, 2340, 2303,27527,27527, 3019, 2593, 2783, 2672,
+ 0, 2626, 2339, 0, 3025, 2679, 2784, 2808, 0,27527,
+ 2727, 2418, 3031, 2746, 2902, 2993, 0,11082, 3125,27527,
+ 2788, 2557, 0,27527,11077, 3141, 2994, 0, 2493,10968,
+ 27527, 2820, 2585, 0, 3152, 3019, 3029,10933, 2873, 2858,
+ 3026,10931,27527,10972, 3148, 3101, 3168, 3178, 0, 3039,
+ 2864, 2767, 0, 3175, 2809, 3062, 3153, 3207,10936, 3215,
+ 0, 3219, 3245, 3225,10944, 2860, 2917, 3251,27527, 3251,
+ 0, 3274, 947,10888,10888, 2437,10877, 2080,10887, 2356,
+ 2212, 3286, 3303,27527,27527,10883,10916, 3267, 966, 2239,
+
+ 3077, 2122, 2841, 2303, 2414, 2366, 2781, 2469, 2897, 270,
+ 2743, 3355, 2120, 2235, 2639, 2494, 2927, 964, 2170, 3003,
+ 2568, 2912, 3002, 3181, 2536, 3198,10865, 2807, 2994, 2473,
+ 2839, 2948, 2809, 1243, 3, 2895, 3120, 3228, 2611, 3255,
+ 3034, 2969, 3265, 3107, 3048, 3083, 3250, 3046, 3093, 3178,
+ 3271, 3334, 3147, 3274, 3204, 3127, 2654, 3278,10872, 3233,
+ 3385, 3409, 3426, 3418, 3337, 3341, 3284,27527, 3442, 3452,
+ 27527, 3236, 3444,27527,10903,10886, 2878,10847,10844, 3286,
+ 10836, 3323,10841, 3320, 3133, 3443,27527,10861,27527, 3472,
+ 10860,10855, 3481, 3490, 3499, 3508, 3526, 3535, 3544, 3562,
+
+ 3572, 3590, 3602, 3617, 3680, 3645, 3713, 3731, 3751, 3761,
+ 3771, 3635, 3786, 3814, 3824, 3839, 3849, 3920,10809, 3883,
+ 3953, 3971, 3893, 3991, 4001, 4016, 4026, 4041, 4059, 4086,
+ 4090, 4115, 4119, 4147, 3602, 3518, 3567, 3742, 3653, 3683,
+ 3707, 3812, 4010, 3789, 3820, 3757, 3923, 4084, 4042, 4065,
+ 3718,10854, 3958, 0, 4159, 3608, 4172, 4184, 4188,27527,
+ 4211,10846,10838, 4217, 4225, 4236, 4240, 4249,27527, 4253,
+ 4278,27527,10837,27527, 4282, 4300, 4309, 4318, 4327, 4345,
+ 4354, 4363, 4381, 4408, 4412, 4437, 4463, 4526, 4488, 4492,
+ 4564, 4576, 4608, 4635, 4639, 4664, 4673, 4691, 4709, 4780,
+
+ 10784, 4734, 4752, 4819, 4831, 4851, 4863, 4888, 4892, 4917,
+ 4921, 4952, 4956, 4981, 4985, 5018, 5022, 5047, 5051, 5078,
+ 5098, 5116, 5136, 5148, 5166, 5186, 5211, 5231, 5243, 5261,
+ 5270, 5290, 0, 0, 3714, 3414, 3477,10830, 3903, 3479,
+ 10821,10820, 3330, 3528, 4006, 3533,27527,10821,10830,10819,
+ 3650, 0,10772, 0,10757,10747,10750,10761, 3600, 0,
+ 3577, 0, 3201,10759,10731, 4284,27527, 3197,27527, 4041,
+ 3371,27527, 3859, 4139, 4442, 4203,10759,10728,10737,10736,
+ 10715,10717,10716, 3674,10709,10711,10710,10703, 2915,10699,
+ 10703,10694,10690,10695,10676, 4399,10710, 4815, 0, 5217,
+
+ 4470, 3303, 5173, 5296, 5302,10708,10697, 5328, 5332, 5336,
+ 5341, 5366, 5370, 5438, 5397, 5405, 5411, 5471, 5475, 5479,
+ 5487, 5504, 5519, 4582, 4613, 3949, 5103, 5536, 5551,10657,
+ 10645,10657,10641,27527, 5557, 0, 0,10630,10635,10637,
+ 10612,10624, 5566, 0, 0,10644,10604,10600,10575,10580,
+ 3791,10573,10577,10579,10573, 3340,10560,10558,10564,10563,
+ 3796, 3892, 3983,27527, 0, 0,10583,10545,10558,10526,
+ 10525, 0,10515,10518,10518,10512, 3429,10508,10493,10492,
+ 10491, 0,10537, 3386,27527, 0, 5191, 5379, 5570,27527,
+ 27527, 0, 0, 3394, 3444,27527, 5644,27527, 4091, 3473,
+
+ 3514, 4051, 5672, 0, 0,10507,10470,10478,10464,10441,
+ 10442, 5750,10432,10436,10439,10443,10445,10423, 3464,10416,
+ 10414, 3771,10420, 5781,10454,10452,10451, 3550, 4174,10457,
+ 3482,10465, 3871, 4230,10447, 3551, 3634,10448, 3729, 5543,
+ 5577, 4389, 4259, 4241, 5592, 5680, 3745, 4405, 3791, 4295,
+ 4545, 4455, 4310, 4463, 5686, 5693, 3825, 4474, 3863, 4115,
+ 4426, 3544, 4494, 4479, 4594, 4640, 3971, 3580, 4104, 4692,
+ 4700,10435, 3579,10434, 3603, 5064, 5095, 4154, 4719, 4720,
+ 5183, 5699, 4198, 4440, 4571, 4372, 4669, 3298, 4541, 3521,
+ 4120, 5788, 5836, 4741, 4770, 5819,27527,10434, 5759, 5862,
+
+ 5223, 5878, 4036,10421, 5886, 4869, 0, 5707,10368,10374,
+ 10367,10356,10352,10335,10323, 3396,10335,10319,10322,10317,
+ 10307,10298, 5870, 4978,10344,10323, 5901, 5909, 2845, 3562,
+ 3585, 5967, 3397, 3942, 3380, 3595, 3371, 2384, 3445, 4019,
+ 3428, 3601,27527, 5914, 5995,27527,27527,10316, 6008, 3624,
+ 10292, 4014, 3690, 3529, 3707, 3969, 4063, 3738, 4126, 4173,
+ 6088, 4213, 4238, 3659, 4341, 3908, 6026, 4032, 3770, 4894,
+ 3801, 4265, 4362, 4297, 4391, 3968, 4326, 3724, 3871, 3071,
+ 4096, 4454, 4452, 3838, 4618, 4512, 3915, 4087, 4524, 4460,
+ 4555, 4029, 4515, 4162, 4658, 4219, 3691, 2328, 3921, 4418,
+
+ 4290, 4536, 4589, 4559, 4568, 4380, 4592, 4585, 3791, 4346,
+ 4635, 4637, 6060, 6116, 6146,10264,10268, 6121, 5024, 5574,
+ 4944, 5943,10243,10261,10252,10241,10237,10230,10224, 4362,
+ 10241,10222,10225,10218,10205,10187, 4714,10233, 5510, 6172,
+ 6181, 6199, 6270, 6225, 6243, 6303, 6321, 6341, 6356, 6366,
+ 6381, 6391, 6409,27527, 5713,27527,10229,27527,10232,10227,
+ 6421, 6436, 6451, 6466, 6476, 6486, 6506, 6515, 6524, 6542,
+ 6594, 6533, 6627, 6551, 6666, 6675,27527, 5801,27527,10222,
+ 27527,10225,10213, 6684, 6693, 5999, 4808, 6702, 6762, 6725,
+ 6795, 6729, 6832, 6844, 6859, 6879, 6888, 6897, 6906, 6931,
+
+ 6940, 6949, 6967, 6977, 6987, 7010, 7020, 7045, 7055, 7073,
+ 7082, 7100, 7110, 7133, 7143, 7161, 7170, 7188, 7197, 7179,
+ 7206, 7215, 7224, 7244, 7259, 7274, 7284, 6030, 5010, 5415,
+ 4347, 6152, 6211,10208, 6054, 5374, 5805, 6066, 7304, 7316,
+ 7336, 7407, 7363, 7367, 7440, 7458, 7478, 7498, 7507, 7516,
+ 7536, 7545, 7571, 5730,27527,10204,27527, 7580, 7589, 7616,
+ 7625, 7634, 7643, 7652, 7661, 7688, 7740, 7706, 7773, 7812,
+ 7821, 7830, 7839, 6569,27527,10203,27527, 7848, 7857, 7866,
+ 7926, 7898, 7959, 7996, 7886, 8014, 8023, 8032, 8058, 8062,
+ 8092, 8101, 8110, 8119, 8128, 8148, 8157, 8182, 8200, 8220,
+
+ 8229, 8254, 8266, 8284, 8293, 8322, 8331, 8340, 8360, 8369,
+ 8396, 8405, 8425, 8434, 8454, 8474, 8494, 8512,10218, 4707,
+ 0,10199,10156,10139,10146,10135,10130, 4453,10138,10116,
+ 10117,10105,10095, 5934, 6219, 4677, 6182, 5405, 6409, 6632,
+ 4901, 4839, 5129,10095,10088,10086,10099,10098,10089, 4759,
+ 10077,10077,10061,10064,10067,10060,10052,10043,10038,10037,
+ 10039, 6307, 6654, 6850, 5090, 6802, 6791, 7713, 7446, 7679,
+ 7016, 6333,10065,10054, 7769, 7955, 7965, 7777, 8480, 8365,
+ 8530, 8537, 8186, 8546, 8555, 4878, 4883,10016,10024,10006,
+ 9993, 9983, 9976, 9981, 0, 9991, 9966, 9946, 9954, 9954,
+
+ 9947, 9944, 9904, 9907, 9910, 9903, 9898, 9898, 9898, 9883,
+ 9872, 9886, 9884, 9874, 9872, 9854, 9854, 9861, 9850, 9844,
+ 9845, 9847, 9881,27527, 9870, 4804, 0, 7046, 7073, 4918,
+ 4927, 5581, 7602, 7899, 4590, 5275, 4820, 9816, 9801, 9798,
+ 9813, 9811, 0, 9804, 9797, 9783, 9788, 9776, 9775, 9782,
+ 9771, 9770, 9774, 9755, 9754, 9796, 0, 4915, 9794, 4930,
+ 27527, 9775,27527, 9787,27527, 0, 9783,27527,27527, 9782,
+ 27527, 9779, 0, 9745, 0, 4844, 8189, 5083, 0, 0,
+ 5382, 5630, 0, 9741, 0, 5307, 6923, 5345, 0, 0,
+ 6254, 6256, 0, 9739, 0, 4192, 5344, 4643, 0, 0,
+
+ 4910, 4925, 5117, 5085, 9752, 5180, 9733,27527, 9701, 4665,
+ 5122, 9695, 5423, 5456, 6398, 5638, 9694, 5769, 9691, 5853,
+ 5894, 5957, 5524, 5927, 4952, 4799, 4837, 4945, 4949, 8563,
+ 8589, 8606, 8622, 8639, 8655, 8672, 7292, 0, 4764, 8519,
+ 8581, 8691, 8714, 6078, 6622, 8737, 9679, 9662, 6820, 9670,
+ 9656, 9662, 9656, 9639, 4918, 9647, 9637, 9646, 9626, 9630,
+ 7128, 8745, 8761, 8773, 6827, 7354, 7503, 7541, 9670, 4764,
+ 4992, 9623, 4961,27527, 8779, 8810,27527,27527, 9662, 7974,
+ 9617, 6005, 5097, 4692, 5078, 4976, 3832, 5134, 4984, 8841,
+ 8847,27527, 4994, 5201, 8896, 5007, 4819, 5077, 3966, 5089,
+
+ 5219, 8924, 5250, 5248, 5106, 4060, 5258, 5294, 5330, 5427,
+ 4965, 5465, 9605, 4877, 5458, 5431, 5499, 5172, 9602, 5533,
+ 5203, 5286, 5482, 5324, 8979, 5546, 5537, 5555, 5584, 5576,
+ 5526, 5614, 5571, 5662, 5612, 5650, 5402, 5673, 6323, 5720,
+ 5548, 6164, 5679, 4674, 5005, 5632, 5531, 5744, 5779, 5796,
+ 9601, 9602, 8989, 6401, 9636,27527, 6173, 7322, 8871, 9600,
+ 9583, 0, 9600, 9586, 9587, 9582, 9566, 5749, 9569, 9557,
+ 9567, 9551, 9553, 0, 6122, 6123, 6456, 8993, 8934, 9016,
+ 27527, 6734,27527, 9590,27527, 9592, 9584, 9034, 9085, 9118,
+ 9049, 9155, 9170, 9180, 9190, 9200, 9210, 9225, 9237, 9262,
+
+ 9272, 9282, 9297, 7249, 9317, 9335, 9347, 9362, 9372, 9390,
+ 9399, 9424, 9434, 9444, 9464, 9473, 9493, 9502, 9511, 9520,
+ 9538, 9550, 9577, 9587, 9602, 9612, 9622, 9632, 9642, 9657,
+ 9669, 9687, 9702, 9712, 9722, 9745, 9808, 9765, 9774, 9841,
+ 9859, 9879, 9889, 9907, 9916, 9925, 9943, 7576, 7803, 5680,
+ 5853, 8962, 9871, 7392, 8153, 9585, 9952, 9972, 9990, 9999,
+ 8302,27527, 9580,27527,10008,10059,10028,10092,10129,10141,
+ 10159,10168,10177,10202,10211,10220,10240,10249,10267,10279,
+ 10297,10306,10315,10324,10342,10351,10360,10378,10390,10410,
+ 10435,10439,10464,10468,10493,10502,10520,10529,10538,10556,
+
+ 10582,10594,10612,10630,10648,10666,10691,10703,10728,10740,
+ 10760,10772,10790,10802,10829,10856,10874,10883,10903,10915,
+ 10933, 0, 9578, 1229, 9579,27527, 9528, 9528, 9527, 9525,
+ 9502, 9502, 9504, 9514, 9509, 9501, 9488, 5195,27527, 6369,
+ 5269, 6359, 9556, 7140, 6469, 5486,27527, 5871, 6551, 9550,
+ 6627, 6376, 9472, 9478, 9465, 9465, 9478, 9452, 9462, 9459,
+ 9444, 9445, 9438, 9442, 9427, 8705, 0, 8805, 5919, 9470,
+ 10989, 9430, 9020, 9770, 9122, 9845, 9114,10098,10746, 8930,
+ 11070, 9675, 9409, 9405, 9408, 9415, 9394, 9392, 9399, 9380,
+ 6386, 6177, 6496, 6201, 6513, 6581, 6141, 6298, 6660, 6504,
+
+ 9388, 9377, 9367, 9377, 9356, 9368, 9364, 9348, 9349, 9333,
+ 9382,27527, 5934, 0, 9369, 0, 7396, 8059, 7685, 0,
+ 0, 8050, 8251,11141, 9316, 9319, 9305, 9318, 9301, 9307,
+ 9280, 9294, 9295, 9279, 9284, 9267, 9265, 0, 9303,27527,
+ 27527, 9322, 6511, 9302,27527, 9301,27527, 9300,27527, 0,
+ 6872, 8438, 0, 7004, 7174, 0, 6034, 6035, 9291,27527,
+ 9290, 9289, 6662, 9280,27527, 9279, 9224, 6063, 6588, 6666,
+ 27527, 9267, 6753, 7329, 6235, 9236, 6003, 6107,11222,10033,
+ 11228,11251, 9195, 9183, 7348, 8326,27527, 9174, 9179, 9164,
+ 9166, 9179, 9166, 5366, 9161, 9160, 9163, 9152, 9136, 8834,
+
+ 9067,27527,11331, 9183, 9243, 5828, 5770, 9145, 6106,11074,
+ 11264,27527, 6128,11387, 6797, 5665, 5733, 9144, 9141, 6172,
+ 11468, 6884, 5934, 6108, 6368, 9138, 5957, 4507, 6137, 6388,
+ 6165, 9131, 6667, 5997, 6086, 6181, 6259, 6465, 6403, 6207,
+ 6431, 6507, 6509, 5651, 6696, 6813, 9121, 9107, 6577, 9121,
+ 9115, 6288, 4946, 6610, 5195, 6817, 6824, 6669, 6437, 6245,
+ 6471, 9141,27527,11538, 6631, 9091, 5349, 6644, 6365, 7435,
+ 6653, 6673, 5864, 9076, 9071,10817, 9080, 9060, 9066, 9059,
+ 9013, 9012, 2, 139, 6342, 271, 1011, 1119, 2200, 2253,
+ 7046,11274,11084,11278,11301,11620,11305,11358,11420,11478,
+
+ 11349,11482,11438, 6530, 2417,11505,11587,11659,11671,11691,
+ 11701,11578,11716,11734,11746,11764,11773,11800,11810,11828,
+ 11837,11846,11864,11884,11893,11902,11920,11929,11952,11961,
+ 11979,11988,12006,12015,12038, 2561,27527,12090,12053,12123,
+ 12162,12171,12180,12189,12207,11088, 8466,12216,12225,12234,
+ 12252,12261,12287,12296,12305,12314,12340,12405,12372,12438,
+ 12368,12456,12476,12494,12506,12533,12551,12560,12580,12589,
+ 12598,12623,12635,12660,12664,12697,12706,12724,12733,12751,
+ 12777,12781,12806,12818,12836,12848,12866,12918,12951,12988,
+ 13000,13027,12875,13045,13054,13072, 2614, 5070, 2634, 2693,
+
+ 2740, 2786, 2968, 2981, 3015, 3100, 3161, 3230, 3293, 6048,
+ 27527, 6906, 3470, 6953, 3552, 3620,27527, 3646, 3680, 3710,
+ 3784, 3952, 3995, 4152, 4196, 4228, 4303,10847, 4445,10921,
+ 10959,11655,11511,11424,12129,12119,12955,13079,11335, 4409,
+ 4455, 4574, 4706,13084,10563,11450,12445, 4789, 4807, 4832,
+ 4913, 5140, 5219, 5253, 5451, 5479, 5509, 5555, 5612, 5724,
+ 5761, 5778, 5819, 5932, 5938, 0, 8274, 8387, 5937,13090,
+ 5968, 6013, 6092, 6147, 6154, 6175, 6196, 6228, 6247, 6262,
+ 6300, 6982, 6312, 6353,27527, 6361,27527,27527, 6369,27527,
+ 6447, 0, 6816, 6883, 6429,27527, 9148, 9255, 9545,27527,
+
+ 6403, 6403, 6416, 6421, 6436, 6445, 6491, 6536, 6561, 6547,
+ 6557, 6582,10123,10274,27527,13116,11741,11871, 0,12352,
+ 13122, 7807,13167, 6728, 6751, 6683, 6680,13173, 6943, 6794,
+ 6858, 6945,13221,13204,13237, 6914, 6889, 6595, 6955, 6950,
+ 6783, 6885, 6998, 6965, 6770, 7032, 7052, 7071, 6993, 7008,
+ 7081, 6991, 7012,13291, 6602, 6592, 7083, 7084, 7250, 7092,
+ 7176, 7117, 6884, 7076, 7162,13263,13319, 7057, 7225, 7198,
+ 6675, 6699, 6770,27527, 6775, 6840, 6889, 6887, 6956, 6961,
+ 6981, 6983, 7042, 7034, 7051, 7093,13329,13361,13373,13393,
+ 13402,12715,13420,13429,13447,13462, 7111,13474,13492,13501,
+
+ 13510,13530,13539,13557,13566,13575,13593,13611,13629,13638,
+ 13707,13671,13675,13746,13758,13788,13792,13815,13819,13842,
+ 9582,10600,13860, 8613,13872,13890,13899,13919,13928,13937,
+ 13955,13964,13973,13993,14011,14020,14040,14049,14067,14076,
+ 14085,14103,14121,14139,14148,14175,14184,14202,14229,14247,
+ 14259,14286,14295, 7212, 7116, 7106, 7126, 8679, 7120, 7150,
+ 7184, 7184, 7185, 0, 7196, 7195, 7211, 7196, 7207, 7218,
+ 7210, 0, 7551,14313,11569,13357,12947,13255, 7724, 7224,
+ 7235, 7231,14321,27527, 7228, 7223, 7256, 7257, 7254, 7270,
+ 7283, 7283, 7307, 7293, 7306, 7317, 7304, 7314, 7317, 7311,
+
+ 7334, 7326, 7343, 7344, 7339, 7333, 7459,27527, 7391, 7621,
+ 7352, 7385, 7394, 7395, 7396, 7391, 7396, 7402, 7413, 7407,
+ 7404, 7442,10655,14327,14331,10568,10963,14356, 7450,14360,
+ 8879, 9309,10698, 7462, 7495, 7465,14398, 7579, 7640, 7519,
+ 7490, 7431,14447, 7587, 7533, 7644, 7599, 7667, 7892, 7961,
+ 7583, 7705,14528, 7423, 7443, 7701, 7653, 7730, 7671, 7744,
+ 7822, 7853, 7504,14475,14533, 7478, 7865, 8238, 7501, 7492,
+ 7516, 7551, 7558, 7558, 7554, 7604, 7629, 7646, 7644, 7651,
+ 14211,14412,14416,14546,14561,14581, 7676,14590,14608,14617,
+ 14637,14646,14655,14664,14682,14692,14702,14720,14730,14748,
+
+ 14757,11113,14775, 9353, 9979,10967,14791,14803,14830,14839,
+ 14857,14875,14866,14893,14913,14938,14958,14970,14990,15015,
+ 15019,15044, 7761, 7723, 0, 7733,11574,27527, 7748, 7742,
+ 27527, 7781, 0, 7808, 7817, 7825, 8067,14942,15049, 7827,
+ 7830, 7841, 7840, 7859, 7859, 7854, 7883, 7909, 7919, 7911,
+ 7921, 7930, 7934, 7940, 7941, 7934, 7944, 7948, 7954, 7992,
+ 8041, 8088, 7953, 7969, 7961, 7953, 7974, 7968, 7984, 7979,
+ 7995, 8069,15056,15082,15086,11079,11117, 8067, 8056, 8063,
+ 27527,15111,15116,27527,27527, 8049, 9365, 8045, 8050, 8109,
+ 8115,15165,15246,15251,15277, 8166, 0, 8020, 8022, 8083,
+
+ 8092, 8079, 8114, 8183, 8145, 8202, 8349, 8136, 8109, 8378,
+ 27527, 8117, 8132, 8135, 8135, 8159, 8154, 8172, 8159, 8169,
+ 15291,15303,15323,15332,15341,15350,15370,15379,11791,15388,
+ 15413,15422,15440, 8226, 8159, 8180, 8194,27527, 8205, 8207,
+ 8201, 8214, 8222, 8206, 8225, 8221, 8224, 8231, 8235, 8257,
+ 8461, 8298, 8245, 8262, 8268,11956, 8255, 8367,15452,15467,
+ 8373, 8348, 8422,15481, 8319, 9392, 8324,10673, 8343,15499,
+ 15529, 8347, 8363,15578, 8437,14495, 0, 8314, 8330, 8332,
+ 8354, 8349,27527, 8346, 8455, 8421, 8431,15606,11298, 8370,
+ 8361, 8378, 8385, 8369,15542,15616,15648,15660,15675,15687,
+
+ 8465, 8378, 8439, 8425, 8432, 8439, 8437, 8458, 8445, 8458,
+ 8473, 8463, 8473, 8547, 8500,12065,12433, 8499, 8568,15705,
+ 15712, 8531, 8543, 8549, 8597,11651, 8560,27527,15730,15746,
+ 8560, 8565, 8616,10156,27527, 8649,15763,15789,27527,15544,
+ 15838,15914, 8568,10339, 9319,12524, 8552, 8564, 8577, 8647,
+ 8562, 8628, 8630, 8612,15933, 8622,11694, 8638,12154, 8597,
+ 8618, 8617,15802,15943,15947,15972,15982,16002, 8720, 8607,
+ 8610, 8629, 8613, 8619,13776, 8631, 8647,12630, 8646, 8640,
+ 12813,12843, 8766,16020,16027, 8694,12008, 8691, 8750, 9575,
+ 8789,27527, 0,13663, 8719, 0, 8653,16093,13737,14166,
+
+ 14277, 8721, 8660, 8684, 9500, 8700, 8755, 8734, 8851,12537,
+ 8706, 8703, 8752,16174,16037,16178,16203, 8828, 9036,13600,
+ 8740, 8746,12900, 8756, 8762,12981, 8756, 8760,16235, 8807,
+ 16210,16251, 8824, 8957, 8850,16320, 8769, 0,10046,16402,
+ 8855,16484, 8762, 8791, 8837, 8884, 8817, 8817,16261, 9072,
+ 9153, 8985, 8823, 8824, 8839, 8861, 8852, 8905,16565,16634,
+ 8936,16716, 0,14404,16798,16880, 8861,15524,16569, 0,
+ 16962, 0,12045, 9417, 9732,17044, 8995, 8879, 8909, 8886,
+ 8885,16574, 9264,27527, 9315, 8899, 8901, 8898,17126,14787,
+ 14821, 9471,12321, 8976, 8959,17208,17289,17294, 0, 0,
+
+ 10396,17343, 8927,12906, 9749, 9775,14900, 9984, 0,10735,
+ 17425, 9059, 8931, 8956, 8954, 8949,17506,15140, 9755, 8983,
+ 0,17524,17531, 0, 8949,10204,10405,13097, 0, 8974,
+ 9051, 9799,17541, 9046, 8965,10422,10195,10428, 9022, 8963,
+ 10660, 9909, 9126,10091,10522,10614, 9023,10632,11771, 9004,
+ 11798, 9035, 9088, 9044, 9073, 9274,17579,27527,17628,17658,
+ 17688,17718,17748,17778,17808,17838,17868,17898,17928,17958,
+ 17988,18018,18048,18078,18108,18138,18167,18197,18226,18255,
+ 9459,18284,18313,18342,18371, 9938,18400, 9998,18415,10091,
+ 18430,10434,18447,10488,18462,10698,18477,18507,18536,18565,
+
+ 18594,10780,18609,10803,18624,10842,18653,10869,18668,10889,
+ 18698,18713,10928,18742,18772,10956,18802,18832,11083,18847,
+ 11103,18862,18892,18922,18952,18982,19012,19042,19072,19102,
+ 11106,19131,19160,19190,19219, 9133,19249,19278,19307,19336,
+ 19365,19395,11264,19424,19453,19483,19512,19541,19570,19585,
+ 19600,19617,19641,19656,19671,19701,11702,19730,19759,19789,
+ 19818,19833,19848,19877,19892,19907,19937,19967,19996,20026,
+ 20041,20071,20086,20101,20131,20161,20191,20221,20251,20281,
+ 20311,20341,20371,20401,20431,20461,20491,20521,20551,20581,
+ 20611,20641,20671,20701,20731,20761,20791,20821,20851,20881,
+
+ 20911,20941,20970,20999,21028,21057,21086,21115,21144, 9170,
+ 21173,21202,21232,21262,21292,21321,21350,21379,21408,21437,
+ 21467,21496,21525,21554,21583,21612,21642,21671,21700,21724,
+ 21739,11759,21756,21771,21786,21816,21846,21876,21906,21936,
+ 21965,21994,22023,22052,22082,22111,22126,22141,22156,22186,
+ 22201,22231,22261,22291,22321,22351,22366,22390,22420,22450,
+ 22480,22510,22540,22570,22600,22630,22660,22690,22720,22750,
+ 22780,22810,22840,22870,22900,22930,22960,22990,23020,23050,
+ 23080,23110,23140,23170,23200,23230,23260,23290,23320,23350,
+ 23380,23410,23440,23470,23500,23530,23559,23588,23617,12059,
+
+ 23646,23675,23704,23734,23764,23793,23822,23852,23881,23910,
+ 23940,23970,23999,24028,24058,24087,24116,24145,24174,24203,
+ 12247,24218,24233,24250,24265,24280,24310,24340,24370,24400,
+ 24430,24460,24490,24520,24549,12358,24578,24607,24622,24651,
+ 24666,24696,24726,24756,24786,24816,24846,24876,24891,12546,
+ 24906,24936,24966,24996,25026,25056,25086,25116,25146,25176,
+ 25206,25236,25266,25296,25326,25356,25386,25416,25446,25476,
+ 25506,25536,25566,25596,25625,25654,25683,25712,25741,25770,
+ 25799,25828,25857,25872,25887,25902,25917,25947,25977,26007,
+ 26037,26067,26096,26120,26149,26178,26193,26208,26238,26268,
+
+ 26298,26313,26328,26358,26388,26418,26448,26477,26506,12650,
+ 26535,26564,26593,26622,26651,26680,26709,26724,26739,26754,
+ 12671,26783,26812,26827,26842,26857,26872,26901,26931,26960,
+ 26989,27018,27048,27078,27108,27138,27168,27198,27228,27258,
+ 27288,27318,27348,27378,27408,27437,27466,27496
+ } ;
+
+static yyconst flex_int16_t yy_def[3549] =
+ { 0,
+ 3159, 3159, 3160, 3160, 3161, 3161, 3162, 3162, 3163, 3163,
+ 3164, 3164, 3165, 3165, 3166, 3166, 3159, 3159, 3158, 19,
+ 3158, 21, 3158, 23, 3158, 25, 3158, 27, 3158, 29,
+ 3158, 31, 3158, 33, 3159, 3159, 3158, 37, 3159, 3159,
+ 3167, 3167, 3159, 43, 3158, 45, 3158, 47, 3158, 49,
+ 3158, 51, 3158, 53, 3158, 55, 3158, 57, 3158, 59,
+ 3158, 61, 3158, 63, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3168, 3158, 3168, 3168, 3168, 3168,
+ 3169, 3168, 3168, 3170, 3158, 3170, 3170, 3170, 3170, 3170,
+ 3170, 3171, 3158, 3171, 3158, 3171, 3171, 3171, 3171, 3171,
+
+ 3171, 3172, 3173, 3172, 3172, 3172, 3158, 3172, 3158, 3172,
+ 3158, 3174, 3174, 3174, 3174, 3174, 3158, 3158, 3174, 3174,
+ 3158, 3175, 3158, 3158, 3175, 3175, 3175, 3175, 3175, 3175,
+ 3175, 3176, 3158, 3176, 3176, 3176, 3158, 3176, 3176, 3176,
+ 3176, 3158, 3158, 3158, 3158, 3158, 3177, 3178, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3179, 3179, 162, 3158, 3158, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 3158, 3158, 3180, 3158, 3158,
+ 3158, 3158, 3181, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3182, 3182, 3158,
+ 3182, 3182, 3182, 3182, 214, 214, 214, 214, 214, 214,
+ 214, 214, 214, 214, 214, 214, 214, 214, 214, 214,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3183, 3178,
+ 3158, 3158, 3158, 3158, 3184, 3158, 3158, 3158, 3185, 3184,
+ 3158, 3158, 3186, 3158, 3158, 3187, 3187, 3187, 3187, 3187,
+ 3187, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 3188, 3158, 3158,
+ 3189, 3158, 3158, 3190, 3158, 3158, 3158, 3191, 3191, 3158,
+ 3158, 3158, 3192, 3158, 3193, 3158, 3158, 3194, 3158, 3158,
+
+ 3158, 3195, 3195, 3195, 3195, 3195, 3158, 3196, 3158, 3158,
+ 3158, 3158, 3158, 3197, 3197, 3197, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3198, 3198, 3198, 3198, 3198, 3198, 3198, 3198,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3199,
+ 3158, 3158, 3158, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3201, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3202, 3158, 3158, 3158, 3158, 3158, 3203,
+ 3203, 3203, 3203, 3203, 3203, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3204, 3158, 3158, 3158, 3158, 3158, 3158, 3205, 3205,
+
+ 3205, 3205, 3205, 3205, 3205, 3205, 3205, 3205, 3205, 3205,
+ 3205, 3158, 3158, 3206, 3158, 3207, 3208, 3158, 3209, 3209,
+ 3209, 3209, 3209, 3209, 3209, 3209, 3209, 3209, 3209, 3209,
+ 3209, 3158, 3158, 3158, 3158, 3210, 3211, 3158, 3158, 3158,
+ 3158, 3212, 3158, 3158, 3158, 3158, 3213, 3214, 3215, 3215,
+ 3158, 3216, 3215, 3215, 3215, 3215, 3217, 3218, 3215, 3215,
+ 3158, 3158, 3158, 3158, 3219, 3158, 3220, 3220, 3220, 3220,
+ 3220, 3220, 3220, 3220, 3220, 3220, 3220, 3220, 3220, 3158,
+ 3158, 3158, 3158, 3158, 3221, 3158, 3158, 3158, 3158, 3222,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3223, 3223, 3223, 3158, 3158, 3223, 3223, 3223, 3223,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3225, 3158,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3226, 3227, 3227, 3158,
+ 3227, 3158, 3226, 3158, 3158, 3226, 3158, 3228, 3228, 3158,
+ 3158, 3158, 3158, 3228, 3228, 3158, 3158, 3229, 3229, 3229,
+ 3229, 3229, 3158, 3158, 3229, 3229, 3229, 3229, 3230, 3158,
+ 3158, 3230, 3230, 3230, 3230, 3158, 3230, 3158, 3158, 3158,
+ 3231, 3232, 3232, 3233, 3158, 3234, 3158, 3235, 3158, 3158,
+ 3236, 3231, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 573, 3158, 3237, 573, 573,
+
+ 573, 573, 573, 573, 573, 573, 573, 573, 573, 573,
+ 573, 3232, 573, 573, 573, 573, 573, 573, 573, 573,
+ 573, 573, 573, 573, 573, 573, 612, 573, 573, 573,
+ 573, 573, 573, 573, 573, 573, 573, 573, 573, 573,
+ 573, 573, 573, 573, 573, 573, 573, 573, 573, 573,
+ 573, 573, 573, 573, 573, 573, 573, 573, 573, 573,
+ 3238, 3238, 3239, 3158, 3158, 3158, 3158, 3158, 3240, 3240,
+ 3158, 3158, 3241, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3240,
+ 3158, 3242, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240,
+
+ 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240,
+ 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 705, 3240,
+ 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240,
+ 3240, 3240, 3240, 3240, 734, 734, 734, 734, 734, 734,
+ 734, 734, 734, 734, 734, 734, 734, 734, 734, 734,
+ 3158, 3158, 3158, 3243, 3244, 3245, 3243, 3158, 3158, 3158,
+ 3244, 3158, 3246, 3247, 3247, 3248, 3158, 3249, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3249, 3249, 3249, 3249, 3249, 3249,
+ 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249,
+ 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249,
+
+ 788, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249,
+ 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249,
+ 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249, 3249,
+ 3249, 3249, 3250, 3250, 3158, 3158, 3158, 3251, 3158, 3158,
+ 3251, 3158, 3251, 3158, 3158, 3158, 3158, 3252, 3253, 3252,
+ 3158, 3254, 3158, 3254, 3254, 3254, 3254, 3254, 3158, 3255,
+ 3158, 3255, 3255, 3255, 3255, 3158, 3158, 3256, 3158, 3256,
+ 3256, 3158, 3256, 3256, 3256, 3256, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3257, 3258,
+
+ 3259, 3158, 3257, 3158, 3258, 3158, 3260, 3258, 3258, 3258,
+ 3258, 3258, 3258, 3258, 3258, 3258, 3258, 3258, 3258, 3258,
+ 3258, 3258, 3258, 3259, 3259, 3261, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3262, 3262, 3262, 3262, 3262,
+ 3262, 3262, 3158, 3263, 3263, 3263, 3263, 3263, 3263, 3263,
+ 3263, 3263, 3263, 3263, 3263, 3263, 3263, 3263, 3263, 3263,
+ 3264, 3158, 3264, 3158, 3265, 3265, 3265, 3265, 3265, 3265,
+ 3265, 3265, 3265, 3265, 3265, 3265, 3265, 3265, 3265, 3265,
+ 3265, 3266, 3267, 3268, 3158, 3266, 3269, 3158, 3269, 3158,
+ 3158, 3270, 3271, 3270, 3270, 3158, 3272, 3158, 3270, 3270,
+
+ 3270, 3270, 3158, 3273, 3273, 3273, 3273, 3273, 3273, 3273,
+ 3273, 3273, 3273, 3273, 3273, 3273, 3273, 3273, 3273, 3273,
+ 3273, 3273, 3273, 3158, 3274, 3274, 3158, 3158, 3158, 3275,
+ 3275, 3276, 3158, 3158, 3277, 3277, 3158, 3278, 3158, 3279,
+ 3279, 3280, 3281, 3281, 3282, 3282, 3281, 3283, 3281, 3284,
+ 3284, 3285, 3286, 3286, 3287, 3287, 3286, 3288, 3286, 3289,
+ 3289, 3290, 3291, 3291, 3292, 3292, 3291, 3293, 3291, 3294,
+ 3294, 3275, 3275, 3277, 3277, 3295, 3295, 3296, 3297, 3297,
+ 3298, 3298, 3297, 3299, 3297, 3158, 3158, 3300, 3301, 3302,
+ 3301, 3303, 3304, 3305, 3305, 3306, 3158, 3158, 3158, 3307,
+
+ 3158, 3307, 3158, 3158, 3308, 3309, 3310, 3311, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3312, 3313, 3314, 3315, 3158, 3304, 1128, 1128,
+ 1128, 3304, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 3158, 3158, 3158, 3158, 3158, 3158, 3313, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 3304, 1128, 1128, 1128, 1128, 1128, 3158, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 3158, 3158, 3316, 3158, 3158, 3317, 3318, 3318,
+ 3158, 3319, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3320, 3321, 3158, 3317,
+ 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317,
+ 3317, 3317, 3317, 3158, 3158, 3158, 3158, 3158, 3158, 3321,
+ 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317,
+ 3317, 3317, 3317, 3317, 3317, 3317, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3321, 3317, 3317, 3158, 3158, 3317, 3317, 3317,
+ 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317,
+
+ 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317,
+ 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317,
+ 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3322, 3323, 3323,
+ 3324, 3325, 3326, 3327, 3158, 3158, 3158, 3328, 3329, 3329,
+ 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329,
+ 3329, 3329, 3158, 3158, 3158, 3158, 3158, 3329, 3329, 3329,
+ 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329,
+ 3329, 3329, 3158, 3158, 3158, 3158, 3158, 3329, 3329, 3329,
+ 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329,
+ 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329,
+
+ 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329,
+ 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3330, 3331,
+ 3332, 3333, 3158, 3334, 3334, 3334, 3334, 3158, 3158, 3335,
+ 3335, 3335, 3335, 3336, 3336, 3337, 3338, 3338, 3339, 3339,
+ 3338, 3340, 3338, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3341, 3342, 3343, 3158, 3344, 3344, 3344, 3344, 3344,
+ 3158, 3158, 3158, 3345, 3344, 3344, 3344, 3344, 3344, 3344,
+ 3344, 3344, 3344, 3344, 3344, 3158, 3346, 3158, 3158, 3158,
+ 3158, 3347, 3347, 3347, 3347, 3347, 3348, 3348, 3348, 3348,
+
+ 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3349,
+ 3349, 3349, 3349, 3349, 3349, 3349, 3349, 3349, 3349, 3349,
+ 3349, 3349, 3350, 3158, 3158, 3158, 3351, 3352, 3352, 3353,
+ 3354, 3354, 3355, 3355, 3354, 3356, 3354, 3357, 3357, 3357,
+ 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357,
+ 3357, 3357, 3357, 3357, 3357, 3358, 3359, 3158, 3360, 3158,
+ 3158, 3158, 3158, 3361, 3158, 3362, 3363, 3158, 3158, 3364,
+ 3158, 3365, 3366, 3366, 3366, 3367, 3368, 3369, 3366, 3366,
+ 3370, 3371, 3372, 3372, 3372, 3373, 3374, 3375, 3372, 3372,
+ 3376, 3377, 3378, 3378, 3378, 3379, 3380, 3381, 3378, 3378,
+
+ 3382, 3383, 3384, 3385, 3386, 3385, 3158, 3158, 3387, 3387,
+ 3387, 3387, 3388, 3388, 3389, 3390, 3387, 3387, 3387, 3391,
+ 3391, 3392, 3158, 3158, 3158, 3393, 3394, 3395, 3396, 3158,
+ 3158, 3397, 3398, 3158, 3158, 3399, 3158, 3400, 3158, 3400,
+ 3158, 3401, 3401, 3402, 3402, 3403, 3158, 3158, 3404, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3405, 3406, 3406, 3398, 3407, 3158, 3158, 3158, 3158, 1664,
+ 1664, 1664, 1664, 3158, 3158, 3158, 3158, 3158, 3158, 3408,
+ 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 3158,
+ 3158, 3158, 1664, 1664, 3398, 1664, 1664, 1664, 1664, 1664,
+
+ 1664, 3158, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664,
+ 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664,
+ 1664, 1664, 1664, 1664, 3158, 1664, 1664, 1664, 1664, 1664,
+ 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1695, 1664,
+ 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664,
+ 3158, 3158, 3409, 3158, 3158, 3158, 3158, 3410, 3410, 3158,
+ 3158, 3411, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3412, 3413, 3413, 3414, 3409, 3409, 3409,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3415, 3409, 3409, 3409,
+ 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409,
+
+ 3409, 3409, 3409, 3158, 3409, 3409, 3409, 3409, 3409, 3409,
+ 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409,
+ 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409,
+ 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3409,
+ 3409, 3409, 3409, 3409, 3409, 3409, 3409, 3158, 3416, 3158,
+ 3417, 3418, 3418, 3419, 3158, 3158, 3420, 3420, 3420, 3158,
+ 3158, 3158, 3158, 3158, 3420, 3420, 3420, 3420, 3420, 3420,
+ 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3158,
+ 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420,
+ 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420,
+
+ 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420,
+ 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420,
+ 3420, 3421, 3422, 3423, 3424, 3158, 3425, 3425, 3425, 3425,
+ 3158, 3158, 3158, 3426, 3426, 3426, 3426, 3427, 3158, 3427,
+ 3427, 3428, 3429, 3430, 3431, 3427, 3158, 3427, 3432, 3433,
+ 3434, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3435, 3436, 3437, 3158, 3158,
+ 3158, 3438, 3438, 3438, 3438, 3438, 3438, 3438, 3438, 3438,
+ 3438, 3438, 3158, 3158, 3158, 3158, 3439, 3439, 3439, 3439,
+ 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440,
+
+ 3441, 3441, 3441, 3441, 3441, 3441, 3441, 3441, 3441, 3441,
+ 3442, 3158, 3158, 3443, 3443, 3443, 3444, 3445, 3446, 3443,
+ 3443, 3447, 3448, 3158, 3449, 3449, 3449, 3449, 3449, 3449,
+ 3449, 3449, 3449, 3449, 3449, 3449, 3449, 3450, 3451, 3158,
+ 3158, 3452, 3158, 3453, 3158, 3454, 3158, 3455, 3158, 3456,
+ 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3158,
+ 3465, 3466, 3158, 3467, 3158, 3468, 3469, 3469, 3470, 3470,
+ 3158, 3471, 3472, 3472, 3158, 3158, 3473, 3474, 3475, 3476,
+ 3477, 3478, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 3475, 3158, 3479, 2103, 2103, 2103, 2103, 3158,
+ 3158, 3158, 2103, 3475, 2114, 2103, 2103, 2103, 2103, 2103,
+ 3158, 2103, 2103, 2103, 2114, 3158, 2103, 2103, 2103, 2103,
+ 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
+ 2103, 2103, 2103, 2103, 2103, 2103, 3158, 3158, 2103, 2103,
+ 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
+ 2103, 3158, 3158, 2114, 2103, 2103, 2103, 2103, 2103, 2114,
+ 2103, 2103, 2103, 3158, 3158, 3480, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3481, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480,
+
+ 3480, 3480, 3480, 2196, 3158, 3480, 3480, 3480, 3480, 3480,
+ 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480,
+ 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480,
+ 3480, 3480, 3480, 3480, 3480, 3158, 3158, 3480, 3480, 3480,
+ 3480, 3480, 3480, 3480, 3480, 3480, 3482, 3483, 3483, 3483,
+ 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+ 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+ 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+ 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+ 3483, 3483, 3483, 3483, 3483, 3483, 3484, 3485, 3486, 3486,
+
+ 3486, 3486, 3158, 3158, 3158, 3487, 3487, 3487, 3487, 3488,
+ 3158, 3489, 3490, 3491, 3492, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3493, 3494, 3495,
+ 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3158,
+ 3158, 3158, 3158, 3496, 3496, 3496, 3496, 3497, 3497, 3497,
+ 3497, 3497, 3497, 3497, 3497, 3498, 3498, 3498, 3498, 3498,
+ 3498, 3498, 3498, 3158, 3158, 3499, 3500, 3501, 3502, 3502,
+ 3502, 3502, 3502, 3502, 3502, 3502, 3502, 3502, 3502, 3502,
+ 3503, 3158, 3158, 3504, 3158, 3505, 3158, 3158, 3490, 3158,
+ 3492, 3506, 3158, 3158, 3158, 3158, 3507, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3508, 3509, 3509, 3510, 3511,
+ 3511, 3512, 3508, 2423, 2423, 2423, 2423, 3158, 2423, 2423,
+ 2423, 2423, 3158, 3158, 3158, 2423, 2423, 3158, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 3508, 3158, 3158, 2423, 2423, 2454, 2423,
+ 2423, 2423, 2423, 2423, 2423, 3158, 3158, 2423, 2423, 2423,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3513, 3513, 3513, 3513,
+ 3513, 3513, 3513, 3513, 3513, 3513, 3158, 3513, 3513, 3513,
+
+ 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513,
+ 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513,
+ 3514, 3514, 3515, 3516, 3517, 3517, 3517, 3517, 3517, 3517,
+ 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517,
+ 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517,
+ 3517, 3517, 3517, 3518, 3519, 3519, 3519, 3519, 3158, 3158,
+ 3158, 3520, 3520, 3520, 3520, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3521, 3522, 3523, 3158, 3523, 3523, 3523, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3524, 3524, 3524, 3524, 3524, 3524,
+ 3524, 3525, 3525, 3525, 3526, 3526, 3526, 3527, 3527, 3527,
+
+ 3527, 3527, 3527, 3527, 3527, 3527, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 2423, 3509, 3528, 3528, 3158, 3158, 3511, 3529, 3511,
+ 3530, 3530, 3531, 2423, 2423, 2423, 3158, 2423, 2423, 2423,
+ 2423, 3158, 2454, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 3158, 3158, 3158, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 3158, 3158, 3158, 2423, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3513, 3513, 3513, 3513, 3513, 3513, 3158, 3513, 3513, 3513,
+ 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513,
+
+ 3513, 3158, 3515, 3516, 3516, 3532, 3517, 3517, 3517, 3517,
+ 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517,
+ 3517, 3517, 3518, 3519, 3519, 3519, 3158, 3158, 3158, 3158,
+ 3158, 3520, 3533, 3158, 3158, 3158, 3522, 3523, 3523, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3524, 3524, 3524, 3524,
+ 3524, 3524, 3524, 3525, 3526, 3527, 3527, 3527, 3527, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 2423, 3528, 3528, 3511, 3158, 3531, 2423, 2423, 2423,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3534, 2423, 2423, 2423,
+ 2423, 3158, 3158, 3158, 3158, 2423, 2653, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 2423, 2423, 2423, 2643, 2423, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3532, 3517,
+ 3517, 3517, 3517, 3518, 3519, 3158, 3520, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3524, 3524, 3524, 3524, 3524,
+ 3158, 3158, 3158, 3158, 3158, 3535, 3158, 2423, 3528, 3511,
+ 2423, 2423, 2423, 3158, 3536, 3534, 3536, 3158, 3537, 3537,
+ 3537, 3158, 3537, 2792, 3537, 3538, 2874, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 2423, 2423, 2423, 3158, 3539, 3158,
+ 3158, 3158, 3158, 3158, 3513, 3513, 3513, 3513, 3513, 3517,
+
+ 3518, 3519, 3158, 3158, 3158, 3158, 3158, 3158, 3524, 3524,
+ 3524, 3524, 3524, 3158, 3158, 3158, 3158, 3158, 2423, 3528,
+ 3511, 2423, 2423, 2423, 3158, 3158, 3537, 3158, 3537, 3537,
+ 3158, 3537, 3537, 3540, 3158, 3158, 3537, 3537, 3158, 3538,
+ 3158, 3538, 3541, 3540, 3542, 3537, 3158, 3158, 3158, 3158,
+ 3158, 2423, 2423, 2423, 3158, 3543, 3539, 3543, 3158, 3158,
+ 3158, 3158, 3513, 3513, 3513, 3513, 3513, 3517, 3518, 3158,
+ 3158, 3158, 3158, 3158, 3524, 3524, 3524, 3524, 3524, 3158,
+ 3158, 3158, 2874, 3528, 3511, 2423, 3544, 2423, 3158, 3537,
+ 3158, 3158, 2941, 2941, 3537, 2874, 2874, 3158, 3537, 3537,
+
+ 3537, 3537, 3158, 3158, 3158, 3158, 2423, 2423, 3158, 3158,
+ 3158, 3158, 3545, 3513, 3513, 3513, 3517, 3158, 3546, 3158,
+ 3158, 3158, 3158, 3158, 3524, 3158, 3524, 3158, 3537, 3158,
+ 3528, 3511, 2423, 3537, 3537, 3158, 2874, 2998, 2998, 3158,
+ 3537, 3158, 3158, 3158, 2423, 3158, 3158, 3158, 3513, 3546,
+ 3546, 3547, 3158, 3158, 3524, 3524, 3158, 3158, 3528, 3158,
+ 2423, 3158, 3036, 3036, 3158, 3158, 2874, 3537, 3537, 3040,
+ 3158, 3071, 3042, 3060, 3060, 3158, 3158, 3158, 2423, 3158,
+ 3158, 3513, 3158, 3158, 3547, 3158, 3158, 3158, 3158, 3537,
+ 3537, 3060, 3548, 2423, 3062, 3158, 3537, 3537, 3065, 3066,
+
+ 3066, 3158, 2874, 3071, 3089, 3089, 3537, 3060, 3076, 3076,
+ 3158, 3158, 3158, 2423, 3158, 3158, 3513, 3537, 3089, 2423,
+ 3096, 3537, 3537, 3102, 2874, 3089, 3060, 3537, 3111, 3158,
+ 2423, 3158, 3513, 2423, 2874, 3089, 3060, 3158, 2423, 2874,
+ 3089, 3060, 2423, 2874, 3089, 3060, 2423, 3089, 3060, 2423,
+ 3089, 3060, 2423, 3089, 2423, 2423, 3158, 0, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158
+ } ;
+
+static yyconst flex_int16_t yy_nxt[27610] =
+ { 0,
+ 3158, 3158, 67, 68, 73, 67, 68, 73, 534, 535,
+ 67, 68, 69, 70, 76, 69, 70, 3158, 869, 71,
+ 77, 78, 74, 189, 668, 495, 189, 79, 72, 190,
+ 496, 72, 82, 67, 68, 82, 80, 76, 596, 869,
+ 671, 191, 73, 77, 78, 73, 69, 500, 70, 69,
+ 83, 70, 501, 2479, 77, 81, 78, 67, 68, 80,
+ 233, 596, 539, 1175, 503, 539, 85, 86, 87, 504,
+ 90, 67, 68, 90, 88, 540, 631, 77, 81, 78,
+ 85, 86, 87, 89, 509, 512, 517, 521, 91, 510,
+ 513, 518, 522, 577, 93, 94, 577, 89, 95, 596,
+
+ 552, 86, 81, 87, 96, 97, 578, 100, 93, 94,
+ 100, 98, 95, 103, 104, 86, 81, 87, 96, 97,
+ 99, 525, 495, 105, 106, 101, 526, 532, 596, 891,
+ 107, 630, 251, 73, 99, 251, 73, 500, 96, 108,
+ 97, 549, 537, 542, 110, 103, 104, 110, 543, 892,
+ 252, 233, 96, 671, 97, 105, 106, 105, 109, 106,
+ 605, 73, 111, 606, 73, 113, 67, 114, 113, 546,
+ 291, 108, 674, 291, 547, 561, 115, 116, 117, 74,
+ 562, 671, 674, 118, 120, 67, 114, 120, 74, 105,
+ 109, 106, 119, 671, 2480, 115, 116, 117, 123, 124,
+
+ 296, 291, 121, 296, 291, 668, 553, 554, 125, 126,
+ 115, 119, 116, 596, 317, 127, 566, 317, 74, 74,
+ 318, 567, 73, 368, 128, 73, 368, 842, 495, 115,
+ 601, 116, 74, 496, 130, 123, 124, 130, 133, 134,
+ 74, 74, 125, 129, 126, 125, 126, 497, 135, 136,
+ 137, 549, 131, 596, 843, 138, 140, 133, 134, 140,
+ 387, 128, 879, 387, 139, 550, 880, 135, 136, 137,
+ 551, 642, 497, 596, 141, 643, 67, 68, 388, 125,
+ 129, 126, 135, 139, 136, 596, 69, 70, 73, 67,
+ 68, 73, 412, 71, 412, 412, 853, 412, 549, 69,
+
+ 70, 135, 72, 136, 654, 412, 74, 611, 412, 655,
+ 413, 445, 413, 445, 445, 72, 445, 612, 840, 500,
+ 69, 840, 70, 413, 501, 675, 668, 613, 596, 446,
+ 2483, 446, 861, 69, 1140, 70, 66, 142, 143, 144,
+ 142, 145, 146, 66, 147, 145, 66, 148, 149, 150,
+ 66, 151, 152, 153, 154, 155, 156, 156, 156, 157,
+ 152, 158, 152, 159, 160, 161, 161, 161, 161, 161,
+ 161, 161, 162, 161, 161, 161, 161, 163, 161, 161,
+ 161, 161, 164, 145, 165, 66, 166, 167, 168, 169,
+ 170, 171, 172, 173, 161, 174, 161, 161, 175, 176,
+
+ 177, 178, 179, 161, 180, 181, 182, 183, 184, 185,
+ 161, 161, 161, 186, 145, 187, 188, 161, 66, 66,
+ 67, 68, 66, 192, 146, 66, 193, 194, 195, 148,
+ 196, 197, 198, 199, 200, 201, 66, 202, 66, 66,
+ 66, 66, 203, 204, 205, 206, 207, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 209,
+ 208, 208, 208, 208, 69, 66, 70, 210, 211, 212,
+ 213, 214, 215, 216, 217, 218, 208, 219, 208, 208,
+ 220, 221, 222, 223, 224, 208, 225, 226, 227, 228,
+ 229, 230, 208, 208, 208, 186, 231, 66, 232, 208,
+
+ 234, 235, 236, 237, 235, 234, 238, 234, 239, 234,
+ 234, 240, 69, 241, 234, 234, 234, 234, 234, 242,
+ 66, 66, 66, 243, 234, 234, 234, 234, 244, 245,
+ 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+ 245, 245, 245, 245, 245, 245, 246, 234, 247, 234,
+ 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+ 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+ 245, 245, 245, 245, 245, 245, 245, 234, 234, 248,
+ 249, 250, 66, 66, 67, 68, 66, 192, 146, 66,
+ 253, 194, 195, 148, 196, 197, 198, 199, 200, 254,
+
+ 255, 202, 66, 66, 66, 66, 66, 204, 205, 206,
+ 207, 256, 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 257, 256, 256, 256, 256, 69, 66,
+ 70, 210, 258, 259, 260, 261, 262, 263, 264, 265,
+ 256, 266, 256, 256, 267, 268, 269, 270, 271, 256,
+ 272, 273, 274, 275, 276, 277, 256, 256, 256, 66,
+ 231, 187, 232, 256, 66, 66, 67, 68, 66, 66,
+ 146, 66, 278, 66, 66, 279, 69, 70, 66, 66,
+ 66, 66, 66, 71, 66, 66, 66, 66, 280, 66,
+ 66, 66, 72, 281, 281, 281, 281, 281, 281, 281,
+
+ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ 69, 66, 70, 66, 281, 281, 281, 281, 281, 281,
+ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ 281, 282, 66, 66, 66, 281, 66, 283, 67, 68,
+ 283, 66, 66, 66, 284, 285, 285, 66, 69, 70,
+ 285, 66, 66, 66, 66, 71, 66, 66, 66, 286,
+ 287, 66, 66, 66, 72, 288, 288, 288, 288, 288,
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 288, 288, 69, 66, 70, 285, 289, 288, 288, 288,
+
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 288, 288, 288, 290, 66, 66, 66, 288, 66, 292,
+ 67, 68, 292, 66, 66, 66, 293, 66, 66, 66,
+ 69, 70, 66, 66, 66, 66, 66, 71, 66, 66,
+ 66, 66, 294, 66, 66, 66, 72, 295, 295, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295, 295, 69, 66, 70, 66, 295, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+
+ 295, 295, 295, 295, 295, 66, 66, 66, 66, 295,
+ 66, 283, 297, 68, 283, 66, 66, 66, 298, 285,
+ 285, 66, 69, 70, 285, 299, 66, 299, 66, 71,
+ 66, 66, 66, 286, 287, 66, 300, 66, 301, 302,
+ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+ 302, 302, 302, 302, 302, 302, 69, 66, 70, 285,
+ 302, 303, 302, 302, 302, 304, 302, 302, 302, 305,
+ 302, 302, 302, 302, 302, 302, 302, 302, 302, 306,
+ 302, 302, 302, 302, 302, 302, 302, 290, 66, 66,
+ 66, 302, 283, 67, 68, 283, 557, 459, 1109, 672,
+
+ 459, 558, 672, 69, 70, 291, 67, 68, 291, 1110,
+ 71, 1128, 673, 495, 286, 460, 69, 70, 496, 72,
+ 668, 676, 596, 74, 596, 481, 1158, 286, 481, 549,
+ 67, 68, 72, 73, 67, 68, 73, 69, 596, 70,
+ 319, 320, 596, 74, 319, 320, 491, 71, 884, 491,
+ 69, 74, 70, 321, 869, 322, 72, 321, 885, 322,
+ 72, 500, 1030, 626, 492, 627, 501, 614, 290, 615,
+ 2484, 1031, 628, 629, 69, 869, 70, 616, 69, 617,
+ 70, 290, 66, 307, 67, 68, 307, 66, 66, 66,
+ 308, 66, 66, 66, 309, 70, 66, 299, 310, 299,
+
+ 66, 71, 66, 66, 66, 66, 66, 311, 66, 312,
+ 313, 314, 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314, 69, 66,
+ 70, 66, 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314, 315, 314,
+ 314, 314, 314, 314, 316, 314, 314, 314, 314, 290,
+ 66, 66, 66, 314, 67, 324, 493, 498, 66, 493,
+ 498, 902, 2485, 844, 325, 326, 844, 507, 674, 515,
+ 507, 327, 515, 493, 494, 499, 493, 671, 769, 66,
+ 328, 329, 67, 324, 329, 508, 66, 516, 869, 869,
+
+ 872, 494, 325, 326, 523, 951, 902, 523, 325, 330,
+ 326, 529, 530, 536, 529, 952, 536, 66, 328, 869,
+ 869, 869, 524, 493, 545, 555, 493, 545, 555, 531,
+ 493, 499, 863, 493, 596, 864, 325, 540, 326, 67,
+ 68, 494, 499, 556, 568, 568, 568, 568, 494, 69,
+ 70, 564, 842, 602, 564, 596, 71, 570, 568, 568,
+ 570, 596, 331, 495, 332, 72, 569, 1008, 496, 565,
+ 603, 549, 604, 607, 1009, 494, 888, 889, 333, 569,
+ 608, 659, 2298, 69, 609, 70, 660, 610, 890, 334,
+ 335, 336, 495, 337, 338, 500, 339, 496, 495, 340,
+
+ 501, 596, 341, 496, 671, 1174, 342, 343, 344, 345,
+ 346, 66, 347, 348, 349, 347, 66, 66, 66, 350,
+ 66, 66, 66, 69, 70, 351, 66, 66, 66, 66,
+ 71, 66, 66, 66, 352, 66, 66, 66, 353, 72,
+ 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 355, 354, 354, 354, 354, 69, 66, 70,
+ 351, 354, 354, 356, 357, 358, 354, 359, 354, 354,
+ 360, 354, 354, 361, 354, 354, 362, 354, 354, 354,
+ 363, 354, 364, 365, 366, 354, 354, 354, 66, 66,
+ 66, 367, 354, 369, 370, 371, 372, 370, 369, 369,
+
+ 373, 374, 369, 369, 369, 375, 376, 369, 369, 369,
+ 369, 369, 377, 369, 369, 369, 378, 378, 369, 369,
+ 369, 379, 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380, 380, 375,
+ 369, 376, 369, 380, 380, 380, 381, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380, 382, 380,
+ 380, 380, 383, 384, 380, 385, 380, 380, 380, 380,
+ 386, 369, 369, 369, 380, 389, 389, 390, 391, 389,
+ 389, 389, 389, 392, 389, 389, 389, 393, 394, 389,
+ 389, 389, 389, 389, 395, 389, 389, 389, 396, 397,
+
+ 389, 389, 389, 398, 399, 399, 399, 399, 399, 399,
+ 399, 399, 399, 399, 399, 399, 400, 399, 399, 399,
+ 399, 393, 389, 394, 389, 399, 399, 401, 402, 403,
+ 399, 404, 399, 399, 405, 399, 399, 406, 399, 399,
+ 407, 399, 399, 399, 408, 399, 409, 410, 411, 399,
+ 399, 399, 397, 389, 389, 389, 399, 389, 389, 390,
+ 391, 389, 389, 389, 389, 414, 389, 389, 389, 415,
+ 394, 389, 389, 389, 389, 389, 395, 389, 389, 389,
+ 389, 397, 389, 389, 389, 398, 416, 416, 416, 416,
+ 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+
+ 416, 416, 416, 393, 389, 394, 389, 416, 416, 416,
+ 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+ 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+ 416, 416, 416, 416, 397, 389, 389, 389, 416, 389,
+ 389, 390, 391, 389, 389, 389, 389, 417, 389, 389,
+ 389, 393, 418, 389, 389, 389, 389, 389, 395, 389,
+ 389, 389, 389, 389, 389, 389, 389, 398, 419, 419,
+ 419, 419, 419, 419, 419, 419, 419, 419, 419, 419,
+ 420, 419, 419, 419, 419, 393, 389, 394, 389, 419,
+ 419, 421, 422, 423, 419, 424, 419, 419, 425, 419,
+
+ 419, 426, 419, 419, 427, 419, 419, 419, 428, 419,
+ 429, 430, 431, 419, 419, 419, 389, 389, 389, 389,
+ 419, 432, 432, 433, 434, 432, 432, 435, 432, 436,
+ 432, 432, 437, 438, 439, 432, 432, 432, 432, 432,
+ 440, 432, 432, 432, 432, 432, 432, 432, 432, 441,
+ 442, 442, 442, 442, 442, 442, 442, 442, 442, 442,
+ 442, 442, 442, 442, 442, 442, 442, 443, 432, 444,
+ 432, 442, 442, 442, 442, 442, 442, 442, 442, 442,
+ 442, 442, 442, 442, 442, 442, 442, 442, 442, 442,
+ 442, 442, 442, 442, 442, 442, 442, 442, 432, 432,
+
+ 432, 432, 442, 432, 432, 433, 434, 432, 432, 435,
+ 432, 447, 432, 432, 437, 438, 439, 432, 432, 432,
+ 432, 432, 440, 432, 432, 432, 432, 432, 432, 432,
+ 432, 441, 448, 448, 448, 448, 448, 448, 448, 448,
+ 448, 448, 448, 448, 448, 448, 448, 448, 448, 443,
+ 432, 444, 432, 448, 448, 448, 448, 448, 448, 448,
+ 448, 448, 448, 448, 448, 448, 448, 448, 448, 448,
+ 448, 448, 448, 448, 448, 448, 448, 448, 448, 448,
+ 432, 432, 432, 432, 448, 449, 449, 433, 450, 449,
+ 449, 451, 449, 452, 449, 449, 449, 453, 454, 449,
+
+ 449, 449, 449, 449, 455, 449, 449, 449, 449, 449,
+ 449, 449, 449, 456, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 453, 458, 454, 449, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 449, 449, 449, 449, 457, 66, 461, 462,
+ 463, 461, 66, 66, 464, 465, 66, 66, 66, 69,
+ 70, 66, 66, 466, 66, 66, 71, 66, 66, 66,
+ 66, 466, 66, 66, 66, 72, 467, 467, 467, 467,
+
+ 467, 467, 467, 467, 467, 467, 467, 467, 468, 467,
+ 467, 467, 467, 69, 66, 70, 66, 467, 467, 469,
+ 470, 471, 467, 472, 467, 467, 473, 467, 467, 474,
+ 467, 467, 475, 467, 467, 467, 476, 467, 477, 478,
+ 479, 467, 467, 467, 480, 66, 66, 66, 467, 482,
+ 482, 483, 484, 482, 482, 482, 482, 485, 482, 482,
+ 482, 486, 487, 482, 482, 482, 482, 482, 488, 482,
+ 482, 482, 482, 482, 482, 482, 482, 489, 490, 490,
+ 490, 490, 490, 490, 490, 490, 490, 490, 490, 490,
+ 490, 490, 490, 490, 490, 486, 482, 487, 482, 490,
+
+ 490, 490, 490, 490, 490, 490, 490, 490, 490, 490,
+ 490, 490, 490, 490, 490, 490, 490, 490, 490, 490,
+ 490, 490, 490, 490, 490, 490, 482, 482, 482, 482,
+ 490, 568, 568, 568, 568, 568, 568, 568, 568, 580,
+ 580, 580, 571, 592, 593, 593, 592, 497, 1116, 596,
+ 596, 1117, 1015, 569, 594, 595, 596, 569, 595, 839,
+ 839, 955, 956, 581, 839, 597, 595, 598, 618, 623,
+ 596, 624, 1016, 957, 666, 635, 619, 666, 596, 620,
+ 596, 625, 621, 493, 1152, 622, 493, 596, 632, 636,
+ 595, 1131, 633, 581, 583, 637, 584, 585, 596, 839,
+
+ 586, 494, 972, 596, 573, 638, 587, 588, 634, 589,
+ 590, 591, 973, 639, 574, 592, 593, 593, 592, 596,
+ 650, 656, 640, 651, 497, 641, 594, 595, 596, 657,
+ 595, 500, 667, 652, 1159, 658, 501, 597, 595, 598,
+ 653, 644, 1012, 671, 645, 646, 690, 599, 661, 661,
+ 661, 661, 1013, 690, 1032, 662, 647, 690, 2486, 648,
+ 722, 649, 595, 664, 568, 568, 664, 500, 1032, 665,
+ 1121, 677, 501, 678, 679, 846, 626, 680, 846, 686,
+ 1122, 499, 686, 681, 682, 569, 683, 684, 685, 686,
+ 687, 851, 686, 596, 851, 688, 689, 596, 847, 859,
+
+ 687, 691, 859, 692, 1153, 688, 689, 686, 1042, 499,
+ 686, 691, 493, 692, 847, 493, 686, 498, 687, 686,
+ 498, 693, 1042, 688, 689, 686, 1762, 687, 686, 691,
+ 494, 692, 688, 689, 493, 499, 687, 493, 691, 690,
+ 692, 688, 689, 704, 1052, 1040, 690, 691, 686, 692,
+ 690, 686, 494, 705, 1041, 690, 694, 962, 1052, 687,
+ 962, 596, 690, 706, 688, 689, 707, 695, 708, 690,
+ 691, 596, 692, 1133, 710, 837, 690, 835, 709, 964,
+ 835, 690, 711, 690, 696, 712, 697, 690, 713, 698,
+ 690, 714, 699, 690, 1738, 715, 723, 716, 700, 836,
+
+ 690, 976, 977, 690, 690, 701, 718, 717, 719, 702,
+ 690, 1119, 703, 978, 690, 720, 721, 690, 724, 690,
+ 727, 1135, 725, 1062, 596, 690, 690, 596, 690, 690,
+ 690, 1120, 690, 690, 728, 690, 730, 1062, 726, 690,
+ 729, 495, 690, 733, 500, 731, 496, 734, 732, 501,
+ 690, 690, 626, 837, 690, 735, 994, 690, 736, 737,
+ 690, 995, 690, 498, 741, 690, 498, 742, 2497, 690,
+ 738, 690, 596, 739, 690, 740, 690, 743, 690, 1134,
+ 690, 499, 745, 690, 744, 690, 747, 746, 690, 690,
+ 749, 1001, 748, 495, 539, 750, 1002, 539, 496, 690,
+
+ 1113, 1114, 690, 751, 751, 751, 751, 540, 753, 751,
+ 751, 753, 751, 751, 751, 751, 751, 751, 751, 751,
+ 1138, 775, 775, 754, 831, 752, 494, 596, 775, 832,
+ 752, 596, 775, 775, 752, 804, 775, 1171, 752, 758,
+ 759, 759, 758, 500, 764, 764, 764, 764, 501, 1155,
+ 760, 765, 596, 758, 759, 759, 758, 896, 896, 896,
+ 896, 762, 1032, 763, 760, 767, 751, 751, 767, 770,
+ 771, 999, 770, 1028, 999, 762, 1032, 763, 1029, 897,
+ 772, 770, 771, 499, 770, 773, 774, 752, 2474, 1000,
+ 1032, 691, 772, 692, 596, 756, 1033, 773, 774, 770,
+
+ 771, 1034, 770, 691, 1032, 692, 1166, 1043, 770, 771,
+ 772, 770, 1044, 776, 869, 773, 774, 770, 771, 772,
+ 770, 691, 870, 692, 773, 774, 596, 871, 772, 1035,
+ 691, 1050, 692, 773, 774, 869, 1161, 842, 1036, 691,
+ 1051, 692, 775, 775, 770, 771, 787, 770, 777, 775,
+ 775, 775, 1037, 775, 775, 772, 788, 775, 775, 778,
+ 773, 774, 789, 805, 790, 775, 691, 1017, 692, 596,
+ 1018, 1019, 792, 1038, 791, 1180, 779, 1048, 780, 775,
+ 793, 781, 1020, 794, 782, 2555, 795, 1038, 775, 796,
+ 797, 1048, 798, 1053, 783, 775, 1039, 596, 1054, 775,
+
+ 1049, 784, 799, 845, 775, 785, 845, 800, 786, 801,
+ 1154, 775, 596, 775, 809, 775, 802, 803, 775, 806,
+ 775, 499, 1208, 807, 775, 836, 775, 775, 810, 775,
+ 775, 815, 1060, 775, 811, 816, 775, 812, 775, 808,
+ 775, 1061, 775, 775, 775, 775, 813, 2556, 817, 814,
+ 775, 818, 819, 866, 823, 775, 866, 824, 775, 867,
+ 1063, 775, 775, 820, 775, 1064, 821, 825, 822, 775,
+ 775, 499, 1088, 775, 826, 827, 775, 775, 829, 837,
+ 828, 775, 873, 869, 830, 873, 1088, 869, 1045, 1055,
+ 530, 875, 898, 896, 896, 898, 876, 1046, 1056, 1141,
+
+ 874, 596, 1070, 2557, 869, 1142, 493, 1071, 869, 493,
+ 494, 1047, 1057, 1058, 897, 896, 896, 896, 896, 896,
+ 896, 896, 896, 1033, 494, 1072, 899, 1058, 1089, 837,
+ 904, 896, 896, 904, 1073, 498, 1059, 897, 498, 596,
+ 2558, 897, 904, 896, 896, 904, 904, 896, 896, 904,
+ 1136, 1137, 906, 499, 907, 904, 896, 896, 904, 904,
+ 896, 896, 904, 1076, 906, 596, 907, 596, 906, 1030,
+ 907, 1098, 1077, 1168, 908, 553, 554, 906, 1031, 907,
+ 1099, 906, 1132, 907, 904, 896, 896, 904, 596, 904,
+ 896, 896, 904, 904, 896, 896, 904, 596, 901, 596,
+
+ 904, 896, 896, 904, 1132, 549, 906, 1065, 907, 1172,
+ 909, 906, 910, 907, 1671, 906, 1066, 907, 577, 911,
+ 549, 577, 906, 912, 907, 904, 896, 896, 904, 1223,
+ 1067, 578, 904, 896, 896, 904, 904, 896, 896, 904,
+ 1224, 493, 914, 498, 493, 913, 498, 906, 1139, 907,
+ 1176, 917, 915, 596, 906, 596, 907, 916, 906, 494,
+ 907, 499, 904, 896, 896, 904, 924, 924, 924, 924,
+ 596, 1162, 1454, 925, 927, 896, 896, 927, 928, 928,
+ 929, 928, 918, 919, 906, 596, 907, 935, 928, 929,
+ 935, 1455, 499, 1156, 920, 921, 897, 1157, 1068, 1038,
+
+ 922, 929, 929, 929, 929, 494, 596, 943, 928, 929,
+ 943, 1173, 1068, 1038, 923, 988, 988, 988, 988, 2559,
+ 507, 1069, 1039, 507, 1074, 499, 515, 596, 1184, 515,
+ 930, 1078, 523, 1075, 1038, 523, 2560, 990, 508, 930,
+ 1086, 1087, 931, 1086, 516, 1078, 932, 1037, 1038, 933,
+ 524, 931, 596, 930, 934, 932, 1169, 1039, 933, 930,
+ 596, 596, 991, 934, 1170, 931, 1163, 1035, 1160, 932,
+ 1164, 931, 933, 549, 2561, 932, 1036, 934, 933, 929,
+ 929, 929, 929, 934, 992, 992, 1183, 992, 992, 992,
+ 1037, 992, 596, 992, 992, 992, 992, 992, 992, 992,
+
+ 992, 992, 992, 992, 596, 1196, 596, 992, 992, 992,
+ 992, 992, 992, 1191, 596, 1079, 1003, 929, 929, 1003,
+ 1080, 1719, 929, 929, 929, 929, 529, 530, 1129, 529,
+ 992, 930, 992, 992, 494, 596, 1024, 929, 929, 1024,
+ 1192, 596, 536, 931, 531, 536, 1130, 932, 549, 555,
+ 933, 596, 555, 545, 499, 934, 545, 1197, 1090, 1193,
+ 499, 992, 992, 992, 992, 596, 540, 556, 930, 1190,
+ 2562, 499, 1090, 1081, 930, 1177, 564, 1132, 596, 564,
+ 931, 1091, 1082, 1084, 932, 596, 931, 933, 930, 1207,
+ 932, 1235, 934, 933, 565, 549, 1083, 1084, 934, 1167,
+
+ 931, 1236, 1167, 869, 932, 596, 1085, 933, 568, 568,
+ 568, 568, 934, 1203, 2563, 549, 570, 568, 568, 570,
+ 592, 593, 593, 592, 869, 549, 1094, 1094, 1094, 1094,
+ 569, 594, 595, 1095, 494, 595, 596, 672, 569, 596,
+ 672, 1198, 597, 595, 598, 1165, 592, 593, 593, 592,
+ 673, 1132, 1100, 1101, 1101, 1100, 596, 594, 595, 1102,
+ 1430, 595, 596, 1206, 1103, 578, 1431, 595, 597, 595,
+ 598, 580, 580, 580, 1104, 1108, 1108, 1108, 1108, 1125,
+ 1125, 1178, 571, 2564, 1126, 1126, 596, 592, 593, 593,
+ 592, 596, 1212, 595, 1127, 581, 1179, 569, 594, 595,
+
+ 1565, 1194, 595, 1093, 593, 593, 593, 593, 596, 597,
+ 595, 907, 1564, 596, 1181, 594, 595, 902, 1195, 595,
+ 1182, 1185, 1186, 596, 1187, 581, 597, 595, 1188, 596,
+ 1199, 1106, 596, 1204, 595, 1189, 596, 1209, 666, 1200,
+ 1210, 666, 666, 1205, 2565, 666, 1125, 1216, 1217, 1227,
+ 1228, 595, 902, 842, 574, 1143, 1144, 1145, 1145, 1144,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1146, 1147, 1143,
+ 1143, 1147, 1143, 1143, 1143, 1233, 1436, 869, 1148, 1147,
+ 1149, 1143, 1143, 1143, 1420, 1201, 661, 661, 661, 661,
+ 1436, 1230, 596, 662, 1231, 1234, 667, 1504, 869, 1528,
+
+ 667, 1143, 1143, 1147, 1143, 1202, 1526, 1526, 1529, 627,
+ 3158, 3158, 3158, 3158, 596, 840, 1505, 3158, 840, 664,
+ 568, 568, 664, 596, 1684, 665, 1150, 1213, 1214, 1214,
+ 1213, 1683, 1143, 1143, 1143, 1143, 1151, 499, 594, 595,
+ 596, 569, 595, 686, 686, 1219, 686, 686, 1219, 1530,
+ 595, 907, 1220, 686, 687, 1654, 686, 1221, 673, 688,
+ 689, 1655, 1132, 1530, 687, 691, 691, 692, 692, 688,
+ 689, 596, 2047, 686, 595, 691, 686, 692, 844, 1688,
+ 840, 844, 686, 840, 687, 686, 1517, 1531, 596, 688,
+ 689, 686, 1532, 687, 686, 691, 3158, 692, 688, 689,
+
+ 686, 1563, 687, 686, 691, 1518, 692, 688, 689, 686,
+ 1218, 687, 686, 691, 1685, 692, 688, 689, 718, 1533,
+ 687, 1549, 691, 1571, 692, 688, 689, 686, 1534, 844,
+ 686, 691, 844, 692, 846, 1570, 686, 846, 687, 686,
+ 1550, 1240, 1535, 688, 689, 686, 1565, 687, 686, 691,
+ 1564, 692, 688, 689, 2049, 1557, 687, 847, 691, 1241,
+ 692, 688, 689, 686, 1557, 3158, 686, 691, 1242, 692,
+ 1563, 1243, 596, 686, 687, 690, 686, 690, 1558, 688,
+ 689, 690, 1571, 1307, 687, 691, 1570, 692, 690, 688,
+ 689, 686, 1695, 3158, 686, 691, 1244, 692, 1608, 1246,
+
+ 1245, 859, 687, 686, 859, 596, 686, 688, 689, 1329,
+ 1329, 1329, 1329, 691, 687, 692, 1330, 3158, 686, 688,
+ 689, 686, 1608, 1249, 1308, 691, 690, 692, 596, 687,
+ 690, 1247, 1248, 1672, 688, 689, 686, 690, 596, 686,
+ 691, 1250, 692, 1309, 596, 1428, 686, 687, 1429, 686,
+ 627, 851, 688, 689, 851, 1673, 1689, 687, 691, 690,
+ 692, 690, 688, 689, 1306, 690, 1251, 596, 691, 499,
+ 692, 2566, 1243, 1252, 847, 1450, 1693, 837, 1450, 1253,
+ 1254, 1255, 1254, 1254, 1255, 1254, 1254, 1254, 1254, 1254,
+ 1254, 1254, 1256, 1254, 1254, 1254, 1254, 1257, 1258, 1254,
+
+ 1270, 884, 596, 1259, 1254, 1260, 1254, 1254, 1254, 1263,
+ 690, 1569, 1312, 1569, 686, 835, 690, 686, 835, 751,
+ 751, 751, 751, 690, 1706, 687, 1254, 1254, 1254, 1254,
+ 688, 689, 686, 596, 596, 686, 691, 836, 692, 2567,
+ 690, 752, 690, 687, 1737, 627, 690, 1313, 688, 689,
+ 596, 1261, 686, 690, 691, 686, 692, 1254, 1254, 1254,
+ 1254, 1262, 686, 687, 690, 686, 690, 596, 688, 689,
+ 1314, 1696, 686, 687, 691, 686, 692, 690, 688, 689,
+ 884, 596, 1264, 687, 691, 1717, 692, 686, 688, 689,
+ 686, 837, 1450, 1310, 691, 1450, 692, 962, 687, 690,
+
+ 962, 690, 1265, 688, 689, 690, 1572, 1699, 1572, 691,
+ 1311, 692, 690, 596, 690, 686, 1322, 1266, 686, 964,
+ 690, 1267, 1580, 1268, 1580, 686, 687, 690, 686, 1709,
+ 1553, 688, 689, 1554, 596, 1269, 687, 691, 884, 692,
+ 686, 688, 689, 686, 596, 626, 690, 691, 690, 692,
+ 686, 687, 690, 686, 1271, 1319, 688, 689, 626, 690,
+ 873, 687, 691, 873, 692, 869, 688, 689, 1582, 690,
+ 1582, 1315, 691, 1272, 692, 690, 1566, 690, 874, 1320,
+ 1316, 596, 690, 690, 686, 1566, 869, 686, 1273, 1321,
+ 690, 2116, 1274, 962, 686, 687, 962, 686, 596, 1037,
+
+ 688, 689, 1590, 1275, 1590, 687, 691, 1724, 692, 1243,
+ 688, 689, 839, 839, 596, 964, 691, 839, 692, 1276,
+ 1277, 1278, 1277, 1277, 1278, 1277, 1277, 1277, 1277, 1277,
+ 1277, 1277, 1279, 1277, 1277, 1277, 1277, 1280, 1281, 1277,
+ 1592, 1718, 1592, 1282, 1277, 1283, 1277, 1277, 1277, 1285,
+ 1486, 596, 839, 1486, 1286, 1287, 1287, 1286, 596, 753,
+ 751, 751, 753, 1291, 596, 687, 1277, 1277, 1277, 1277,
+ 688, 689, 686, 627, 907, 686, 691, 494, 692, 1727,
+ 690, 752, 690, 687, 962, 596, 690, 962, 688, 689,
+ 1739, 1323, 686, 690, 691, 686, 692, 1277, 1277, 1277,
+
+ 1277, 1284, 686, 687, 1682, 686, 964, 845, 688, 689,
+ 845, 596, 596, 687, 691, 1288, 692, 686, 688, 689,
+ 686, 1132, 884, 1289, 691, 499, 692, 686, 687, 836,
+ 686, 1697, 596, 688, 689, 1290, 1715, 1639, 687, 691,
+ 1639, 692, 686, 688, 689, 686, 1434, 869, 1600, 691,
+ 1600, 692, 884, 687, 1292, 1435, 1536, 596, 688, 689,
+ 686, 1317, 596, 686, 691, 1694, 692, 690, 869, 690,
+ 1536, 687, 596, 690, 1243, 596, 688, 689, 1293, 1537,
+ 690, 1318, 691, 837, 692, 719, 1294, 686, 1686, 1687,
+ 686, 686, 999, 1731, 686, 999, 1295, 1708, 687, 690,
+
+ 1326, 690, 687, 688, 689, 690, 596, 688, 689, 691,
+ 1000, 692, 690, 691, 1296, 692, 686, 1561, 1698, 686,
+ 686, 1561, 690, 686, 1327, 2129, 596, 687, 690, 1594,
+ 596, 687, 688, 689, 519, 690, 688, 689, 691, 596,
+ 692, 690, 691, 1324, 692, 869, 1325, 690, 686, 1298,
+ 1297, 686, 1728, 1437, 690, 1299, 1565, 1564, 1438, 687,
+ 758, 759, 759, 758, 688, 689, 869, 1300, 1720, 596,
+ 691, 760, 692, 1332, 1332, 1332, 1332, 1700, 1301, 1559,
+ 754, 1602, 762, 1602, 763, 758, 759, 759, 758, 759,
+ 759, 759, 759, 1559, 1565, 752, 760, 1629, 1564, 1629,
+
+ 760, 1614, 1560, 2568, 1302, 596, 1303, 762, 1442, 869,
+ 1304, 762, 758, 759, 759, 758, 596, 1305, 764, 764,
+ 764, 764, 1442, 760, 1701, 765, 3158, 3158, 3158, 3158,
+ 869, 1443, 1733, 3158, 762, 1567, 763, 1336, 1337, 1337,
+ 1336, 767, 751, 751, 767, 549, 1578, 2569, 760, 1567,
+ 770, 771, 756, 770, 770, 771, 596, 770, 1039, 499,
+ 1578, 772, 596, 752, 1577, 772, 773, 774, 1704, 1049,
+ 773, 774, 691, 1577, 692, 1619, 691, 1619, 692, 771,
+ 771, 596, 771, 770, 771, 866, 770, 1047, 866, 1736,
+ 772, 867, 2570, 1705, 772, 773, 774, 1561, 1561, 773,
+
+ 774, 770, 771, 499, 770, 691, 1561, 692, 596, 1584,
+ 770, 771, 772, 770, 511, 1587, 1711, 773, 774, 770,
+ 771, 772, 770, 691, 1587, 692, 773, 774, 770, 771,
+ 772, 770, 691, 596, 692, 773, 774, 800, 1057, 772,
+ 596, 691, 1561, 692, 773, 774, 770, 771, 1850, 770,
+ 691, 1850, 692, 2571, 1741, 770, 771, 772, 770, 1713,
+ 1339, 837, 773, 774, 770, 771, 772, 770, 691, 596,
+ 692, 773, 774, 1086, 1087, 772, 1086, 691, 1340, 692,
+ 773, 774, 770, 771, 596, 770, 691, 1341, 692, 596,
+ 1342, 1565, 1564, 772, 1716, 1564, 1707, 1748, 773, 774,
+
+ 896, 896, 896, 896, 691, 596, 692, 1571, 1570, 770,
+ 771, 1570, 770, 770, 771, 1343, 770, 1712, 1345, 1344,
+ 772, 1767, 897, 596, 772, 773, 774, 1768, 1561, 773,
+ 774, 691, 1561, 692, 596, 691, 1564, 692, 770, 771,
+ 519, 770, 1571, 1570, 1745, 1595, 1714, 1439, 869, 772,
+ 1346, 1347, 1570, 2572, 773, 774, 1440, 1565, 1564, 1348,
+ 691, 596, 692, 1349, 770, 771, 1564, 770, 1588, 869,
+ 1441, 924, 924, 924, 924, 772, 1571, 1570, 925, 2579,
+ 773, 774, 1588, 1740, 1598, 1570, 691, 1621, 692, 770,
+ 771, 1059, 770, 770, 771, 596, 770, 596, 1598, 1597,
+
+ 772, 1350, 1564, 596, 772, 773, 774, 1069, 1597, 773,
+ 774, 691, 1931, 692, 1723, 691, 1132, 692, 1932, 1351,
+ 1721, 1570, 1067, 2580, 1722, 1352, 1254, 1353, 1354, 1254,
+ 1353, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1355, 1254,
+ 1254, 1254, 1254, 1356, 1357, 1254, 1627, 1561, 1561, 1259,
+ 1254, 1260, 1254, 1254, 1254, 596, 1561, 1360, 596, 511,
+ 1627, 1132, 596, 1361, 1585, 770, 771, 596, 770, 1091,
+ 1732, 1726, 1254, 1254, 1254, 1254, 772, 770, 771, 596,
+ 770, 773, 774, 924, 924, 924, 924, 691, 772, 692,
+ 925, 1132, 1561, 773, 774, 1729, 1568, 1358, 596, 691,
+
+ 1568, 692, 596, 1254, 1254, 1254, 1254, 1359, 1594, 770,
+ 771, 596, 770, 519, 3158, 3158, 3158, 3158, 549, 1725,
+ 772, 3158, 1725, 1730, 1743, 773, 774, 1744, 596, 2581,
+ 1362, 691, 596, 692, 1363, 596, 770, 771, 1364, 770,
+ 770, 771, 1568, 770, 1742, 2047, 1568, 772, 1622, 2046,
+ 1622, 772, 773, 774, 519, 1747, 773, 774, 691, 1595,
+ 692, 596, 691, 1746, 692, 770, 771, 2021, 770, 2021,
+ 1623, 1624, 1365, 1623, 770, 771, 772, 770, 596, 1565,
+ 596, 773, 774, 1943, 1612, 772, 1749, 691, 1625, 692,
+ 773, 774, 770, 771, 530, 770, 691, 1603, 692, 1750,
+
+ 1366, 596, 530, 772, 1943, 1605, 1603, 1367, 773, 774,
+ 770, 771, 549, 770, 691, 1775, 692, 1734, 1775, 1605,
+ 1604, 772, 1776, 1368, 1615, 1616, 773, 774, 1606, 1735,
+ 842, 2169, 691, 1615, 692, 770, 771, 1369, 770, 1616,
+ 596, 1370, 1094, 1094, 1094, 1094, 772, 1083, 1085, 1095,
+ 627, 773, 774, 770, 771, 1371, 770, 691, 596, 692,
+ 1450, 1342, 1924, 1450, 772, 1639, 549, 549, 1639, 773,
+ 774, 3158, 3158, 3158, 3158, 691, 2582, 692, 3158, 1372,
+ 1277, 1373, 1374, 1277, 1373, 1277, 1277, 1277, 1277, 1277,
+ 1277, 1277, 1375, 1277, 1277, 1277, 1277, 1376, 1377, 1277,
+
+ 1379, 1565, 2106, 1282, 1277, 1283, 1277, 1277, 1277, 1287,
+ 1287, 1287, 1287, 1564, 1380, 2012, 898, 896, 896, 898,
+ 770, 771, 1381, 770, 2013, 2013, 1277, 1277, 1277, 1277,
+ 596, 772, 770, 771, 494, 770, 773, 774, 897, 2047,
+ 2592, 1571, 691, 772, 692, 1950, 1565, 1564, 773, 774,
+ 1564, 2046, 770, 771, 691, 770, 692, 1277, 1277, 1277,
+ 1277, 1378, 951, 772, 770, 771, 1950, 770, 773, 774,
+ 1644, 1644, 1644, 1644, 691, 772, 692, 1645, 2123, 1486,
+ 773, 774, 1486, 1382, 1486, 596, 691, 1486, 692, 770,
+ 771, 1564, 770, 770, 771, 1167, 770, 2023, 1167, 2023,
+
+ 772, 1383, 951, 907, 772, 773, 774, 869, 907, 773,
+ 774, 691, 1571, 692, 1384, 691, 1570, 692, 770, 771,
+ 1565, 770, 770, 771, 1564, 770, 1564, 2049, 869, 772,
+ 2137, 2048, 2018, 772, 773, 774, 1342, 596, 773, 774,
+ 691, 2018, 692, 596, 691, 1754, 692, 1571, 1754, 1710,
+ 1385, 2049, 1386, 770, 771, 1535, 770, 770, 771, 1570,
+ 770, 1755, 1756, 2048, 772, 1564, 2075, 951, 772, 773,
+ 774, 2076, 1387, 773, 774, 691, 1388, 692, 1948, 691,
+ 1948, 692, 770, 771, 2093, 770, 770, 771, 2094, 770,
+ 1125, 1125, 2041, 772, 2041, 1126, 1126, 772, 773, 774,
+
+ 626, 596, 773, 774, 691, 1127, 692, 2044, 691, 2044,
+ 692, 1329, 1329, 1329, 1329, 1390, 1389, 2134, 1330, 770,
+ 771, 1391, 770, 770, 771, 1219, 770, 596, 1219, 2109,
+ 772, 596, 1220, 1392, 772, 773, 774, 1221, 673, 773,
+ 774, 691, 596, 692, 1393, 691, 2115, 692, 770, 771,
+ 596, 770, 770, 771, 2118, 770, 2119, 1125, 596, 772,
+ 596, 2107, 2170, 772, 773, 774, 1561, 1561, 773, 774,
+ 691, 596, 692, 596, 691, 1394, 692, 2122, 1610, 770,
+ 771, 1395, 770, 548, 1397, 2047, 2046, 530, 1396, 2046,
+ 772, 1969, 1342, 842, 1969, 773, 774, 1561, 1561, 770,
+
+ 771, 691, 770, 692, 927, 896, 896, 927, 1399, 548,
+ 772, 1611, 1398, 1970, 1612, 773, 774, 770, 771, 2060,
+ 770, 691, 499, 692, 553, 554, 897, 1400, 772, 1401,
+ 2046, 528, 2554, 773, 774, 869, 528, 770, 771, 691,
+ 770, 692, 1611, 596, 596, 2124, 1402, 2114, 772, 770,
+ 771, 2125, 770, 773, 774, 596, 869, 1403, 627, 691,
+ 772, 692, 2061, 596, 2061, 773, 774, 770, 771, 549,
+ 770, 691, 596, 692, 1463, 1463, 1463, 1463, 772, 1132,
+ 1404, 899, 530, 773, 774, 1568, 1568, 770, 771, 691,
+ 770, 692, 988, 988, 988, 988, 897, 1610, 772, 1405,
+
+ 596, 869, 548, 773, 774, 2117, 1951, 1406, 1951, 691,
+ 951, 692, 770, 771, 990, 770, 1407, 1408, 904, 896,
+ 896, 904, 869, 772, 1101, 1101, 1101, 1101, 773, 774,
+ 1618, 2141, 770, 771, 691, 770, 692, 1409, 596, 991,
+ 906, 801, 907, 772, 770, 771, 1104, 770, 773, 774,
+ 596, 1132, 1410, 901, 691, 772, 692, 2064, 2144, 2064,
+ 773, 774, 770, 771, 2120, 770, 691, 596, 692, 596,
+ 1411, 770, 771, 772, 770, 869, 951, 1571, 773, 774,
+ 1412, 1570, 772, 1570, 691, 596, 692, 773, 774, 626,
+ 1413, 770, 771, 691, 770, 692, 869, 904, 896, 896,
+
+ 904, 2127, 772, 904, 896, 896, 904, 773, 774, 1565,
+ 1564, 1414, 2128, 691, 596, 692, 596, 2593, 1564, 897,
+ 1415, 907, 1570, 1416, 596, 906, 2130, 907, 1417, 904,
+ 896, 896, 904, 904, 896, 896, 904, 904, 896, 896,
+ 904, 2145, 904, 896, 896, 904, 2045, 2047, 2046, 1418,
+ 2045, 906, 596, 907, 1564, 906, 2046, 907, 519, 906,
+ 596, 907, 2131, 519, 906, 914, 907, 904, 896, 896,
+ 904, 904, 896, 896, 904, 1336, 1337, 1337, 1336, 1132,
+ 988, 988, 988, 988, 1571, 1570, 760, 1467, 1570, 906,
+ 596, 907, 2046, 906, 2132, 907, 596, 1466, 904, 896,
+
+ 896, 904, 990, 1132, 596, 1468, 904, 896, 896, 904,
+ 1945, 869, 904, 896, 896, 904, 3158, 3158, 3158, 3158,
+ 906, 2407, 907, 3158, 1945, 1565, 1564, 991, 906, 1570,
+ 907, 2408, 869, 1443, 906, 1470, 907, 1469, 1277, 1471,
+ 1472, 1472, 1471, 1277, 1277, 1277, 1277, 1277, 1277, 1277,
+ 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 2065, 2066,
+ 2160, 1473, 1277, 1474, 1277, 1277, 1277, 914, 596, 1476,
+ 1614, 1477, 904, 896, 896, 904, 904, 896, 896, 904,
+ 904, 896, 896, 904, 1277, 1277, 1277, 1277, 904, 896,
+ 896, 904, 869, 596, 906, 2133, 907, 596, 906, 2139,
+
+ 907, 2594, 906, 1614, 907, 904, 896, 896, 904, 2138,
+ 906, 686, 907, 869, 686, 1277, 1277, 1277, 1277, 1475,
+ 904, 896, 896, 904, 596, 1623, 1624, 906, 1623, 907,
+ 2595, 596, 1479, 691, 2135, 692, 1478, 928, 928, 929,
+ 928, 2146, 906, 1625, 907, 1561, 1561, 1481, 596, 1561,
+ 2140, 1480, 929, 929, 929, 929, 1482, 1574, 935, 928,
+ 929, 935, 502, 1483, 972, 596, 1484, 943, 928, 929,
+ 943, 988, 988, 988, 988, 3158, 494, 1485, 3158, 1561,
+ 1561, 2153, 3158, 1561, 2143, 499, 2019, 3158, 3158, 930,
+ 1561, 502, 596, 990, 1568, 1568, 1575, 596, 1568, 596,
+
+ 2019, 931, 2171, 596, 930, 932, 1574, 2150, 933, 1537,
+ 930, 502, 596, 934, 596, 2149, 931, 2165, 991, 930,
+ 932, 596, 931, 933, 1561, 972, 932, 2151, 934, 933,
+ 2156, 931, 2049, 2048, 934, 932, 2048, 596, 933, 1568,
+ 2047, 2046, 596, 934, 992, 992, 626, 992, 992, 992,
+ 596, 992, 2152, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 2154, 2158, 972, 992, 992, 992,
+ 992, 992, 992, 1003, 929, 929, 1003, 2048, 596, 2155,
+ 596, 1850, 1568, 1568, 1850, 2070, 1568, 1185, 1568, 1568,
+ 992, 494, 992, 992, 502, 1568, 1568, 1568, 596, 1575,
+
+ 1584, 1568, 1568, 2159, 1568, 511, 596, 511, 1108, 1108,
+ 1108, 1108, 1585, 548, 686, 571, 596, 686, 1612, 2452,
+ 596, 992, 992, 992, 992, 930, 2157, 1568, 596, 2430,
+ 569, 771, 771, 1568, 771, 2161, 691, 931, 692, 596,
+ 1568, 932, 772, 2114, 933, 596, 1618, 773, 774, 934,
+ 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277,
+ 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277,
+ 1097, 553, 554, 1277, 1277, 1277, 1277, 1277, 1277, 1637,
+ 1637, 1637, 1024, 929, 929, 1024, 596, 574, 596, 1630,
+ 1631, 1631, 1630, 2164, 972, 2431, 1277, 1277, 1277, 1277,
+
+ 499, 595, 686, 1637, 595, 686, 1337, 1337, 1337, 1337,
+ 596, 569, 595, 907, 2172, 2184, 549, 760, 972, 2185,
+ 1634, 1635, 1635, 1634, 691, 596, 692, 1277, 1277, 1277,
+ 1277, 1543, 595, 1637, 930, 595, 595, 592, 593, 593,
+ 592, 2424, 2596, 595, 907, 596, 931, 2173, 594, 595,
+ 932, 627, 595, 933, 1850, 1571, 1570, 1850, 934, 597,
+ 595, 598, 596, 1100, 1101, 1101, 1100, 595, 2423, 2597,
+ 1102, 1662, 1662, 1662, 1662, 1103, 578, 869, 1663, 1101,
+ 1101, 1101, 1101, 596, 595, 1104, 1638, 1641, 1101, 1101,
+ 1641, 3158, 3158, 569, 1102, 1633, 2071, 2072, 869, 1103,
+
+ 1621, 1104, 1667, 1668, 1668, 1667, 1642, 1642, 1642, 1104,
+ 592, 593, 593, 592, 2470, 1690, 1691, 1691, 1690, 596,
+ 1969, 594, 595, 1969, 1669, 595, 1692, 595, 1623, 1624,
+ 595, 1623, 597, 595, 598, 1664, 1561, 597, 595, 907,
+ 1939, 1621, 1106, 1524, 1757, 1524, 1625, 1757, 1940, 1524,
+ 1665, 1220, 1670, 868, 2365, 2365, 1221, 595, 1106, 2049,
+ 2048, 1939, 595, 1758, 1758, 1758, 1106, 1674, 1675, 1676,
+ 1676, 1675, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1677,
+ 1678, 1674, 1674, 1678, 1674, 1674, 1674, 2436, 2598, 596,
+ 1679, 1678, 1680, 1674, 1674, 1674, 1691, 1691, 1691, 1691,
+
+ 1286, 1287, 1287, 1286, 2074, 2047, 1167, 1692, 595, 1167,
+ 2439, 595, 596, 1674, 1674, 1678, 1674, 2046, 597, 595,
+ 1125, 1125, 691, 1012, 692, 1126, 1126, 1167, 593, 593,
+ 1167, 1848, 751, 751, 1848, 1127, 2047, 2049, 594, 595,
+ 2046, 2048, 595, 595, 1674, 1674, 1674, 1674, 1681, 597,
+ 595, 907, 596, 752, 869, 1855, 1855, 1855, 1855, 2443,
+ 2113, 1213, 1214, 1214, 1213, 553, 554, 1336, 1337, 1337,
+ 1336, 596, 594, 595, 595, 869, 595, 1856, 760, 1644,
+ 1644, 1644, 1644, 1012, 595, 907, 1645, 1125, 1143, 1144,
+ 1145, 1145, 1702, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+
+ 1146, 1147, 1143, 1143, 1147, 1143, 1143, 1143, 595, 2049,
+ 549, 1148, 1147, 1149, 1143, 1143, 1143, 1214, 1214, 1214,
+ 1214, 2048, 686, 1775, 3158, 686, 1775, 3158, 594, 595,
+ 1776, 3158, 595, 687, 1143, 1143, 1147, 1143, 688, 689,
+ 595, 596, 3158, 1703, 691, 3158, 692, 1213, 1214, 1214,
+ 1213, 2603, 2444, 1332, 1332, 1332, 1332, 2426, 594, 595,
+ 754, 596, 595, 596, 595, 1143, 1143, 1143, 1143, 1151,
+ 595, 907, 1132, 686, 1757, 752, 686, 1757, 3158, 2427,
+ 1753, 3158, 686, 596, 687, 686, 1221, 1944, 869, 688,
+ 689, 2352, 596, 687, 595, 691, 1944, 692, 688, 689,
+
+ 686, 2370, 3158, 686, 691, 3158, 692, 1132, 1012, 869,
+ 1441, 687, 1852, 1852, 1852, 1852, 688, 689, 2166, 1853,
+ 596, 1561, 691, 2167, 692, 1939, 686, 596, 2168, 686,
+ 596, 2432, 756, 868, 752, 1132, 596, 687, 1941, 2349,
+ 2392, 1778, 688, 689, 686, 1012, 1939, 686, 691, 2392,
+ 692, 2445, 1779, 1012, 2350, 687, 1571, 1570, 2049, 2048,
+ 688, 689, 596, 2393, 2448, 1570, 691, 2048, 692, 1780,
+ 1781, 1782, 1781, 1781, 1782, 1781, 1781, 1781, 1781, 1781,
+ 1781, 1781, 1783, 1781, 1781, 1781, 1781, 1784, 1785, 1781,
+ 1243, 1854, 2604, 1786, 1781, 1787, 1781, 1781, 1781, 3158,
+
+ 596, 1570, 3158, 2048, 686, 1789, 2605, 686, 904, 896,
+ 896, 904, 2606, 2460, 596, 687, 1781, 1781, 1781, 1781,
+ 688, 689, 686, 1027, 1675, 686, 691, 1675, 692, 626,
+ 897, 2607, 907, 687, 896, 896, 896, 896, 688, 689,
+ 2162, 2163, 686, 596, 691, 686, 692, 1781, 1781, 1781,
+ 1781, 1788, 627, 687, 1790, 2385, 897, 686, 688, 689,
+ 686, 1565, 2353, 2387, 691, 1943, 692, 686, 687, 1675,
+ 686, 2388, 1675, 688, 689, 869, 719, 1450, 687, 691,
+ 1450, 692, 686, 688, 689, 686, 1943, 1450, 1941, 691,
+ 1450, 692, 686, 687, 1791, 686, 869, 2481, 688, 689,
+
+ 2045, 2045, 1754, 687, 691, 1754, 692, 2482, 688, 689,
+ 686, 1568, 548, 686, 691, 1947, 692, 548, 1755, 1756,
+ 596, 687, 686, 1940, 718, 686, 688, 689, 868, 2465,
+ 2437, 2316, 691, 687, 692, 1792, 1947, 686, 688, 689,
+ 686, 2348, 1795, 596, 691, 2068, 692, 2440, 687, 2390,
+ 1793, 1794, 686, 688, 689, 686, 2396, 686, 596, 691,
+ 686, 692, 2447, 687, 1796, 2611, 2612, 686, 688, 689,
+ 686, 2047, 2613, 1797, 691, 2313, 692, 686, 687, 691,
+ 686, 692, 2449, 688, 689, 2614, 596, 686, 687, 691,
+ 686, 692, 596, 688, 689, 627, 2313, 3158, 687, 691,
+
+ 3158, 692, 1798, 688, 689, 3158, 2615, 686, 3158, 691,
+ 686, 692, 2382, 2616, 3158, 2382, 686, 3158, 687, 686,
+ 596, 719, 2461, 688, 689, 686, 596, 687, 686, 691,
+ 2383, 692, 688, 689, 686, 2446, 687, 686, 691, 1243,
+ 692, 688, 689, 686, 2617, 687, 686, 691, 1799, 692,
+ 688, 689, 686, 1571, 687, 686, 691, 1950, 692, 688,
+ 689, 1800, 596, 687, 596, 691, 951, 692, 688, 689,
+ 771, 771, 2355, 771, 691, 1802, 692, 2450, 1950, 2451,
+ 690, 772, 3158, 951, 1801, 3158, 773, 774, 1806, 2618,
+ 2047, 2046, 2496, 1803, 1254, 1255, 1254, 1254, 1804, 1254,
+
+ 1254, 1254, 1254, 1254, 1254, 1254, 1256, 1254, 1254, 1254,
+ 1254, 1257, 1258, 1254, 2397, 2619, 1808, 1259, 1254, 1260,
+ 1254, 1254, 1254, 3158, 3158, 3158, 3158, 2620, 686, 2049,
+ 3158, 686, 596, 2315, 1568, 2070, 2351, 2621, 1947, 687,
+ 1254, 1254, 1254, 1254, 688, 689, 868, 2457, 2642, 1805,
+ 691, 1941, 692, 2654, 2315, 1463, 1463, 1463, 1463, 1947,
+ 2655, 3158, 899, 2382, 3158, 596, 2382, 686, 2388, 2389,
+ 686, 1254, 1254, 1254, 1254, 1262, 686, 897, 687, 686,
+ 626, 2383, 1807, 688, 689, 686, 596, 687, 686, 691,
+ 2462, 692, 688, 689, 686, 2464, 687, 686, 691, 596,
+
+ 692, 688, 689, 686, 2468, 687, 686, 691, 596, 692,
+ 688, 689, 596, 2070, 687, 596, 691, 2354, 692, 688,
+ 689, 1809, 596, 2441, 596, 691, 686, 692, 596, 686,
+ 686, 2442, 2469, 686, 901, 686, 2636, 687, 686, 2114,
+ 719, 687, 688, 689, 626, 2668, 688, 689, 691, 2453,
+ 692, 596, 691, 2669, 692, 2049, 2048, 691, 1810, 692,
+ 596, 1811, 1277, 1278, 1277, 1277, 1278, 1277, 1277, 1277,
+ 1277, 1277, 1277, 1277, 1279, 1277, 1277, 1277, 1277, 1280,
+ 1281, 1277, 718, 596, 1814, 1282, 1277, 1283, 1277, 1277,
+ 1277, 2635, 904, 896, 896, 904, 686, 2474, 1675, 686,
+
+ 2074, 1675, 596, 904, 896, 896, 904, 687, 1277, 1277,
+ 1277, 1277, 688, 689, 906, 596, 907, 1812, 691, 1132,
+ 692, 2085, 2086, 2086, 2085, 906, 596, 907, 661, 661,
+ 661, 661, 2087, 686, 2644, 662, 686, 2670, 1132, 1277,
+ 1277, 1277, 1277, 1284, 687, 686, 1813, 2429, 686, 688,
+ 689, 1463, 1463, 1463, 1463, 691, 687, 692, 1967, 914,
+ 686, 688, 689, 686, 1971, 2639, 2454, 691, 596, 692,
+ 2459, 687, 596, 897, 2047, 2046, 688, 689, 2046, 596,
+ 686, 626, 691, 686, 692, 2434, 2435, 2435, 2434, 686,
+ 596, 687, 686, 2609, 1815, 2609, 688, 689, 686, 1816,
+
+ 687, 686, 691, 2671, 692, 688, 689, 686, 2047, 687,
+ 686, 691, 2313, 692, 688, 689, 596, 596, 687, 2046,
+ 691, 596, 692, 688, 689, 2045, 2045, 1817, 627, 691,
+ 901, 692, 686, 2313, 2045, 686, 2645, 511, 1819, 596,
+ 1132, 686, 511, 687, 686, 2672, 596, 1818, 688, 689,
+ 686, 2673, 687, 686, 691, 2049, 692, 688, 689, 2315,
+ 2610, 687, 2610, 691, 627, 692, 688, 689, 686, 1820,
+ 2045, 686, 691, 2641, 692, 596, 1821, 596, 686, 687,
+ 2315, 686, 596, 2382, 688, 689, 2382, 596, 686, 687,
+ 691, 686, 692, 1822, 688, 689, 2638, 596, 2640, 687,
+
+ 691, 2383, 692, 2643, 688, 689, 2047, 2046, 1824, 1823,
+ 691, 686, 692, 627, 686, 2046, 2646, 904, 896, 896,
+ 904, 686, 687, 596, 686, 596, 2674, 688, 689, 2675,
+ 596, 1825, 687, 691, 2676, 692, 2677, 688, 689, 897,
+ 596, 907, 1826, 691, 596, 692, 686, 686, 1561, 686,
+ 686, 2046, 1561, 1132, 1561, 2650, 686, 687, 1827, 686,
+ 2015, 2651, 688, 689, 596, 992, 1243, 687, 691, 691,
+ 692, 692, 688, 689, 686, 1561, 1132, 686, 691, 1561,
+ 692, 1561, 2652, 686, 596, 687, 686, 992, 1828, 596,
+ 688, 689, 2016, 1561, 687, 1762, 691, 2647, 692, 688,
+
+ 689, 686, 2678, 596, 686, 691, 2648, 692, 596, 1829,
+ 1830, 686, 687, 596, 686, 596, 596, 688, 689, 1132,
+ 1561, 2679, 687, 691, 596, 692, 2649, 688, 689, 2100,
+ 2101, 2101, 2100, 691, 686, 692, 2454, 686, 2656, 2662,
+ 2102, 1832, 2045, 1831, 686, 687, 2311, 686, 2680, 596,
+ 688, 689, 2657, 1833, 868, 687, 691, 2659, 692, 868,
+ 688, 689, 686, 1835, 2687, 686, 691, 2311, 692, 2724,
+ 1834, 686, 2661, 687, 686, 2725, 2049, 2048, 688, 689,
+ 686, 2726, 687, 686, 691, 2048, 692, 688, 689, 686,
+ 2729, 687, 686, 691, 596, 692, 688, 689, 686, 1836,
+
+ 687, 686, 691, 2730, 692, 688, 689, 686, 596, 687,
+ 686, 691, 1837, 692, 688, 689, 686, 2663, 687, 686,
+ 691, 2048, 692, 688, 689, 686, 1838, 687, 686, 691,
+ 596, 692, 688, 689, 1839, 842, 687, 2731, 691, 2564,
+ 692, 688, 689, 1243, 1841, 686, 2660, 691, 686, 692,
+ 686, 1675, 1840, 686, 1675, 2732, 687, 596, 2564, 884,
+ 686, 688, 689, 686, 2733, 1842, 2734, 691, 626, 692,
+ 2735, 687, 691, 2736, 692, 686, 688, 689, 686, 1843,
+ 884, 2723, 691, 2740, 692, 686, 687, 2667, 686, 2579,
+ 2741, 688, 689, 2747, 1844, 2748, 687, 691, 718, 692,
+
+ 2658, 688, 689, 1097, 2205, 770, 771, 691, 770, 692,
+ 1845, 2749, 1637, 1637, 1637, 2750, 772, 770, 771, 2751,
+ 770, 773, 774, 1757, 2752, 1846, 1757, 691, 772, 692,
+ 1220, 2390, 2391, 773, 774, 1221, 1637, 770, 771, 691,
+ 770, 692, 1758, 1758, 1758, 2753, 1847, 951, 772, 2398,
+ 2399, 2399, 2398, 773, 774, 1668, 1668, 1668, 1668, 691,
+ 2400, 692, 2754, 951, 770, 771, 1637, 770, 770, 771,
+ 972, 770, 2755, 1857, 972, 772, 2074, 2104, 1012, 772,
+ 773, 774, 1009, 1016, 773, 774, 691, 1858, 692, 1017,
+ 691, 2756, 692, 764, 764, 764, 764, 2757, 1565, 2758,
+
+ 765, 2759, 1564, 1012, 1564, 2760, 1859, 1781, 1860, 1861,
+ 1781, 1860, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1862,
+ 1781, 1781, 1781, 1781, 1863, 1864, 1781, 1661, 1342, 1866,
+ 1786, 1781, 1787, 1781, 1781, 1781, 2466, 2467, 2467, 2466,
+ 2763, 770, 771, 1564, 770, 2764, 2765, 904, 896, 896,
+ 904, 2397, 772, 1781, 1781, 1781, 1781, 773, 774, 770,
+ 771, 2766, 770, 691, 1559, 692, 2767, 2768, 2769, 906,
+ 772, 907, 2770, 2771, 596, 773, 774, 1666, 1559, 770,
+ 771, 691, 770, 692, 1781, 1781, 1781, 1781, 1865, 1661,
+ 772, 1867, 2802, 2772, 596, 773, 774, 596, 1973, 770,
+
+ 771, 691, 770, 692, 1667, 1668, 1668, 1667, 770, 771,
+ 772, 770, 2778, 801, 2803, 773, 774, 770, 771, 772,
+ 770, 691, 596, 692, 773, 774, 2104, 596, 772, 2809,
+ 691, 1868, 692, 773, 774, 1132, 596, 770, 771, 691,
+ 770, 692, 1668, 1668, 1668, 1668, 770, 771, 772, 770,
+ 1132, 596, 1969, 773, 774, 1969, 2668, 772, 626, 691,
+ 1132, 692, 773, 774, 2104, 596, 800, 1774, 691, 2780,
+ 692, 2812, 770, 771, 1970, 770, 1869, 1848, 751, 751,
+ 1848, 770, 771, 772, 770, 1870, 1871, 1872, 773, 774,
+ 770, 771, 772, 770, 691, 1132, 692, 773, 774, 752,
+
+ 1873, 772, 2813, 691, 1568, 692, 773, 774, 1568, 2814,
+ 1568, 596, 691, 1762, 692, 596, 2015, 770, 771, 596,
+ 770, 992, 2761, 2762, 2815, 2761, 770, 771, 772, 770,
+ 2779, 596, 1874, 773, 774, 770, 771, 772, 770, 691,
+ 2790, 692, 773, 774, 770, 771, 772, 770, 691, 1568,
+ 692, 773, 774, 770, 771, 772, 770, 691, 2122, 692,
+ 773, 774, 770, 771, 772, 770, 691, 2792, 692, 773,
+ 774, 801, 596, 772, 2816, 691, 596, 692, 773, 774,
+ 904, 896, 896, 904, 691, 596, 692, 2047, 1342, 770,
+ 771, 2046, 770, 2046, 2817, 627, 1875, 2791, 1876, 596,
+
+ 772, 2818, 906, 596, 907, 773, 774, 770, 771, 2819,
+ 770, 691, 1878, 692, 904, 896, 896, 904, 772, 2804,
+ 2820, 1877, 1132, 773, 774, 929, 929, 929, 929, 691,
+ 1974, 692, 2046, 596, 1774, 2806, 906, 596, 907, 1879,
+ 1254, 1353, 1354, 1254, 1880, 1254, 1254, 1254, 1254, 1254,
+ 1254, 1254, 1355, 1254, 1254, 1254, 1254, 1356, 1357, 1254,
+ 2796, 1882, 596, 1259, 1254, 1260, 1254, 1254, 1254, 1132,
+ 904, 896, 896, 904, 770, 771, 596, 770, 904, 896,
+ 896, 904, 1972, 2805, 842, 772, 1254, 1254, 1254, 1254,
+ 773, 774, 906, 2558, 907, 1881, 691, 2835, 692, 2807,
+
+ 906, 934, 907, 2731, 1848, 751, 751, 1848, 2631, 2631,
+ 2631, 2631, 2836, 770, 771, 2632, 770, 1254, 1254, 1254,
+ 1254, 1359, 770, 771, 772, 770, 752, 2834, 1883, 773,
+ 774, 770, 771, 772, 770, 691, 2837, 692, 773, 774,
+ 770, 771, 772, 770, 691, 1976, 692, 773, 774, 770,
+ 771, 772, 770, 691, 596, 692, 773, 774, 770, 771,
+ 772, 770, 691, 2733, 692, 773, 774, 770, 771, 772,
+ 770, 691, 2317, 692, 773, 774, 1885, 1884, 772, 884,
+ 691, 2839, 692, 773, 774, 596, 2808, 770, 771, 691,
+ 770, 692, 2840, 2793, 2794, 801, 2793, 596, 772, 770,
+
+ 771, 1568, 770, 773, 774, 1568, 2841, 1568, 1132, 691,
+ 772, 692, 2842, 992, 2843, 773, 774, 2844, 2016, 2845,
+ 1132, 691, 1886, 692, 596, 1887, 1277, 1373, 1374, 1277,
+ 1373, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1375, 1277,
+ 1277, 1277, 1277, 1376, 1377, 1277, 1568, 2846, 1891, 1282,
+ 1277, 1283, 1277, 1277, 1277, 800, 904, 896, 896, 904,
+ 770, 771, 2795, 770, 2847, 2795, 904, 896, 896, 904,
+ 2848, 772, 1277, 1277, 1277, 1277, 773, 774, 906, 2849,
+ 907, 1888, 691, 2850, 692, 2344, 1125, 1125, 906, 2344,
+ 907, 1126, 1126, 596, 951, 972, 1554, 770, 771, 2370,
+
+ 770, 1127, 1012, 1277, 1277, 1277, 1277, 1378, 772, 2370,
+ 1889, 2610, 914, 773, 774, 770, 771, 2853, 770, 691,
+ 1975, 692, 2854, 2397, 770, 771, 772, 770, 2397, 2855,
+ 2856, 773, 774, 770, 771, 772, 770, 691, 2397, 692,
+ 773, 774, 2761, 2762, 772, 2761, 691, 2397, 692, 773,
+ 774, 1890, 1571, 1125, 2857, 691, 1570, 692, 1570, 770,
+ 771, 2045, 770, 770, 771, 2045, 770, 2045, 1969, 1892,
+ 772, 1969, 1123, 992, 772, 773, 774, 596, 992, 773,
+ 774, 691, 596, 692, 2879, 691, 2880, 692, 596, 2851,
+ 1970, 1893, 2851, 770, 771, 596, 770, 1570, 2861, 596,
+
+ 1894, 596, 770, 771, 772, 770, 2045, 2852, 1895, 773,
+ 774, 770, 771, 772, 770, 691, 2863, 692, 773, 774,
+ 770, 771, 772, 770, 691, 2862, 692, 773, 774, 770,
+ 771, 772, 770, 691, 1896, 692, 773, 774, 2881, 2858,
+ 772, 596, 691, 2882, 692, 773, 774, 596, 2883, 770,
+ 771, 691, 770, 692, 1855, 1855, 1855, 1855, 770, 771,
+ 772, 770, 1897, 1898, 1185, 773, 774, 2884, 596, 772,
+ 2114, 691, 2890, 692, 773, 774, 1856, 596, 1900, 1899,
+ 691, 2891, 692, 770, 771, 2892, 770, 904, 896, 896,
+ 904, 2045, 2045, 1901, 772, 2045, 2886, 1762, 596, 773,
+
+ 774, 770, 771, 502, 770, 691, 1132, 692, 502, 906,
+ 1762, 907, 772, 1342, 2893, 596, 1762, 773, 774, 1902,
+ 1132, 770, 771, 691, 770, 692, 1762, 1762, 2894, 2902,
+ 770, 771, 772, 770, 596, 2903, 2045, 773, 774, 2810,
+ 914, 772, 2810, 691, 2811, 692, 773, 774, 2564, 842,
+ 1903, 2885, 691, 2049, 692, 770, 771, 2048, 770, 2048,
+ 2579, 2887, 2579, 2811, 1904, 2904, 772, 770, 771, 2905,
+ 770, 773, 774, 2906, 2907, 1905, 2047, 691, 772, 692,
+ 2046, 2901, 2046, 773, 774, 770, 771, 2908, 770, 691,
+ 2909, 692, 2910, 2911, 770, 771, 772, 770, 2048, 1906,
+
+ 2912, 773, 774, 771, 771, 772, 771, 691, 2913, 692,
+ 773, 774, 2914, 1907, 772, 2915, 691, 2856, 692, 773,
+ 774, 2046, 2397, 770, 771, 1908, 770, 2399, 2399, 2399,
+ 2399, 2918, 770, 771, 772, 770, 1909, 1910, 2400, 773,
+ 774, 770, 771, 772, 770, 691, 2925, 692, 773, 774,
+ 2888, 2925, 772, 2888, 691, 2928, 692, 773, 774, 1911,
+ 2936, 770, 771, 691, 770, 692, 904, 896, 896, 904,
+ 770, 771, 772, 770, 2889, 2928, 2947, 773, 774, 2810,
+ 596, 772, 2810, 691, 2811, 692, 773, 774, 906, 2049,
+ 907, 1342, 691, 2048, 692, 2048, 1912, 770, 771, 596,
+
+ 770, 2948, 2949, 2811, 1913, 596, 770, 771, 772, 770,
+ 2950, 2951, 2922, 773, 774, 1342, 2883, 772, 2923, 691,
+ 1978, 692, 773, 774, 1914, 2960, 770, 771, 691, 770,
+ 692, 2961, 2919, 1762, 2048, 770, 771, 772, 770, 1762,
+ 2049, 2048, 773, 774, 2048, 2962, 772, 2725, 691, 2928,
+ 692, 773, 774, 596, 596, 770, 771, 691, 770, 692,
+ 2941, 1915, 2851, 596, 1916, 2851, 772, 2521, 2521, 2521,
+ 2521, 773, 774, 2924, 2522, 770, 771, 691, 770, 692,
+ 2852, 904, 896, 896, 904, 2048, 772, 596, 842, 1917,
+ 2953, 773, 774, 2731, 2970, 770, 771, 691, 770, 692,
+
+ 2971, 2972, 2973, 906, 1918, 907, 772, 2954, 800, 2974,
+ 2952, 773, 774, 770, 771, 2975, 770, 691, 2969, 692,
+ 2080, 2080, 2080, 2080, 772, 1919, 2976, 1638, 2977, 773,
+ 774, 904, 896, 896, 904, 691, 2978, 692, 904, 896,
+ 896, 904, 1104, 2979, 1977, 1920, 2524, 904, 896, 896,
+ 904, 2980, 2392, 906, 2397, 907, 904, 896, 896, 904,
+ 906, 2392, 907, 596, 1630, 1631, 1631, 1630, 2987, 906,
+ 2986, 907, 2928, 2936, 1921, 596, 595, 2928, 906, 595,
+ 907, 596, 1641, 1101, 1101, 1641, 569, 595, 907, 1979,
+ 1631, 1631, 1631, 1631, 1103, 1465, 1980, 1981, 2989, 1106,
+
+ 596, 2989, 595, 3003, 1104, 595, 1982, 1630, 1631, 1631,
+ 1630, 595, 569, 595, 2704, 2704, 2704, 2704, 2988, 595,
+ 1970, 2705, 595, 592, 593, 593, 592, 2950, 2928, 569,
+ 595, 907, 3004, 3006, 594, 595, 2983, 595, 595, 2941,
+ 1634, 1635, 1635, 1634, 596, 597, 595, 598, 3005, 3009,
+ 2991, 3005, 595, 2991, 595, 595, 1635, 1635, 1635, 1635,
+ 596, 2992, 596, 595, 907, 3009, 3011, 3008, 595, 3012,
+ 595, 595, 1762, 1634, 1635, 1635, 1634, 3020, 3021, 595,
+ 2727, 2727, 2727, 2727, 3022, 595, 3023, 595, 595, 3024,
+ 3025, 2079, 1641, 1101, 1101, 1641, 595, 907, 3007, 1102,
+
+ 2923, 2975, 2728, 595, 1103, 3027, 904, 896, 896, 904,
+ 3028, 1642, 1642, 1642, 1104, 1641, 1101, 1101, 1641, 3037,
+ 595, 3018, 1102, 596, 3018, 3033, 596, 1103, 897, 3043,
+ 907, 2928, 3019, 2928, 1642, 1642, 1642, 1104, 1641, 1101,
+ 1101, 1641, 3036, 842, 3042, 1102, 1662, 1662, 1662, 1662,
+ 1103, 2989, 3044, 1663, 2989, 2950, 2728, 2081, 2081, 2081,
+ 1104, 2923, 3158, 3158, 3158, 3158, 596, 3029, 569, 3158,
+ 3029, 1106, 3047, 3048, 592, 593, 593, 592, 3030, 1239,
+ 2110, 2111, 2111, 2110, 3158, 594, 595, 596, 1132, 595,
+ 2991, 2112, 595, 2991, 1106, 595, 597, 595, 598, 3053,
+
+ 3020, 2992, 597, 595, 907, 3045, 904, 896, 896, 904,
+ 1664, 2111, 2111, 2111, 2111, 3054, 3055, 1106, 3056, 3057,
+ 2936, 595, 2112, 595, 3067, 1665, 595, 595, 906, 3018,
+ 907, 3077, 3018, 597, 595, 2413, 2414, 2414, 2413, 2103,
+ 3019, 3158, 1690, 1691, 1691, 1690, 2415, 3078, 1691, 1691,
+ 1691, 1691, 3046, 1692, 595, 3046, 596, 595, 595, 1692,
+ 595, 3061, 2928, 595, 597, 595, 907, 2928, 3080, 596,
+ 597, 595, 1757, 3062, 1970, 1757, 3081, 3086, 3071, 1220,
+ 2631, 2631, 2631, 2631, 1221, 3046, 3087, 2632, 3046, 595,
+ 3079, 1758, 1758, 1758, 2975, 595, 1674, 2121, 1676, 1676,
+
+ 2121, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1677, 1678,
+ 1674, 1674, 1678, 1674, 1674, 1674, 2975, 3088, 2936, 1679,
+ 1678, 1680, 1674, 1674, 1674, 1690, 1691, 1691, 1690, 3103,
+ 3113, 904, 896, 896, 904, 686, 1692, 595, 686, 3115,
+ 595, 596, 1674, 1674, 1678, 1674, 687, 597, 595, 907,
+ 3116, 688, 689, 906, 3020, 907, 3020, 691, 3034, 692,
+ 3114, 3034, 2856, 1852, 1852, 1852, 1852, 2927, 596, 2928,
+ 1853, 3094, 595, 1674, 1674, 1674, 1674, 1681, 3125, 2126,
+ 1725, 593, 593, 1725, 3130, 752, 3083, 2337, 596, 3083,
+ 686, 594, 595, 686, 686, 595, 3112, 686, 3084, 3112,
+
+ 2193, 687, 597, 595, 907, 687, 688, 689, 596, 3132,
+ 688, 689, 691, 1762, 692, 3134, 691, 686, 692, 3135,
+ 686, 904, 896, 896, 904, 3131, 3120, 595, 687, 2950,
+ 3140, 3144, 2147, 688, 689, 686, 596, 3050, 686, 691,
+ 3050, 692, 1854, 906, 3051, 907, 687, 3058, 2148, 3153,
+ 686, 688, 689, 686, 596, 596, 3058, 691, 2176, 692,
+ 3112, 687, 2192, 3112, 3143, 3150, 688, 689, 2414, 2414,
+ 2414, 2414, 691, 3050, 692, 3139, 3050, 2478, 596, 2415,
+ 3051, 2477, 2332, 596, 2194, 1277, 1278, 1277, 1277, 1278,
+ 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1279, 1277, 1277,
+
+ 1277, 1277, 1280, 1281, 1277, 596, 3156, 719, 1282, 1277,
+ 1283, 1277, 1277, 1277, 2476, 904, 896, 896, 904, 686,
+ 596, 2923, 686, 904, 896, 896, 904, 3155, 2475, 1762,
+ 687, 1277, 1277, 1277, 1277, 688, 689, 906, 1774, 907,
+ 2195, 691, 2472, 692, 2471, 906, 2463, 907, 1107, 2085,
+ 2086, 2086, 2085, 1107, 3158, 3147, 686, 3158, 596, 686,
+ 2087, 3158, 1277, 1277, 1277, 1277, 1284, 687, 2396, 2334,
+ 1132, 686, 688, 689, 686, 2333, 2458, 2456, 691, 719,
+ 692, 686, 687, 2455, 686, 1107, 1132, 688, 689, 2438,
+ 1107, 686, 687, 691, 686, 692, 626, 688, 689, 1132,
+
+ 2425, 686, 687, 691, 686, 692, 2417, 688, 689, 2397,
+ 2412, 686, 687, 691, 686, 692, 2411, 688, 689, 2410,
+ 2409, 2406, 687, 691, 1243, 692, 686, 688, 689, 686,
+ 2405, 2404, 2403, 691, 2402, 692, 2401, 687, 686, 2197,
+ 2196, 686, 688, 689, 2418, 2418, 2418, 2418, 691, 687,
+ 692, 2419, 2397, 1661, 688, 689, 2398, 2399, 2399, 2398,
+ 691, 2198, 692, 686, 2394, 3083, 686, 2400, 3083, 2071,
+ 2199, 549, 2200, 686, 687, 3157, 686, 3084, 3157, 688,
+ 689, 2065, 2387, 686, 687, 691, 686, 692, 2201, 688,
+ 689, 2063, 530, 530, 687, 691, 2202, 692, 686, 688,
+
+ 689, 686, 2049, 2047, 2385, 691, 596, 692, 2421, 687,
+ 3158, 3158, 3158, 3158, 688, 689, 3083, 3158, 686, 3083,
+ 691, 686, 692, 2422, 2043, 2927, 1027, 1243, 3084, 687,
+ 2203, 2928, 2927, 2380, 688, 689, 686, 2379, 2927, 686,
+ 691, 2378, 692, 2377, 2204, 2376, 2999, 687, 686, 2375,
+ 1012, 686, 688, 689, 2704, 2704, 2704, 2704, 691, 687,
+ 692, 2705, 2374, 686, 688, 689, 686, 718, 2206, 2373,
+ 691, 2372, 692, 686, 687, 1012, 686, 2867, 2867, 688,
+ 689, 2371, 1126, 1126, 687, 691, 2370, 692, 2016, 688,
+ 689, 686, 2868, 1524, 686, 691, 2927, 692, 2927, 2207,
+
+ 686, 2363, 687, 686, 2867, 2867, 2362, 688, 689, 1126,
+ 1126, 687, 2361, 691, 2360, 692, 688, 689, 3107, 2868,
+ 1243, 3107, 691, 2359, 692, 686, 972, 2208, 686, 2939,
+ 2358, 904, 896, 896, 904, 686, 687, 972, 686, 2357,
+ 2209, 688, 689, 2356, 2867, 686, 687, 691, 686, 692,
+ 2347, 688, 689, 906, 2346, 907, 687, 691, 2210, 692,
+ 2345, 688, 689, 2211, 2344, 686, 2343, 691, 686, 692,
+ 2342, 2867, 3107, 2341, 686, 3107, 687, 686, 2340, 669,
+ 669, 688, 689, 2939, 669, 687, 2213, 691, 669, 692,
+ 688, 689, 2212, 2329, 686, 2327, 691, 686, 692, 2326,
+
+ 2331, 3005, 2325, 686, 3005, 687, 686, 2324, 2323, 2322,
+ 688, 689, 686, 2214, 687, 686, 691, 2321, 692, 688,
+ 689, 686, 884, 687, 686, 691, 2216, 692, 688, 689,
+ 2215, 2320, 687, 2319, 691, 884, 692, 688, 689, 686,
+ 2318, 2317, 686, 691, 2217, 692, 2399, 2399, 2399, 2399,
+ 687, 686, 1571, 2147, 686, 688, 689, 2400, 1565, 2309,
+ 2308, 691, 687, 692, 2307, 2306, 2305, 688, 689, 2148,
+ 2218, 2220, 2304, 691, 2303, 692, 3034, 2219, 686, 3034,
+ 2302, 686, 2301, 2521, 2521, 2521, 2521, 2928, 686, 687,
+ 2522, 686, 2300, 2221, 688, 689, 2299, 849, 3035, 687,
+
+ 691, 842, 692, 686, 688, 689, 686, 774, 2247, 2222,
+ 691, 1239, 692, 686, 687, 1237, 686, 689, 2190, 688,
+ 689, 2189, 2188, 686, 687, 691, 686, 692, 2187, 688,
+ 689, 2186, 1243, 686, 687, 691, 686, 692, 2183, 688,
+ 689, 2182, 2181, 686, 687, 691, 686, 692, 2180, 688,
+ 689, 2179, 2178, 2177, 687, 691, 2223, 692, 686, 688,
+ 689, 686, 2524, 1756, 2175, 691, 2174, 692, 2142, 687,
+ 686, 2136, 2224, 686, 688, 689, 904, 896, 896, 904,
+ 691, 687, 692, 596, 2225, 1123, 688, 689, 686, 2108,
+ 2226, 686, 691, 2105, 692, 2099, 2098, 2227, 906, 687,
+
+ 907, 2097, 718, 686, 688, 689, 686, 2228, 2096, 2095,
+ 691, 2092, 692, 686, 687, 2091, 686, 2090, 2089, 688,
+ 689, 2088, 2229, 686, 687, 691, 686, 692, 2230, 688,
+ 689, 2084, 2083, 3107, 687, 691, 3107, 692, 549, 688,
+ 689, 549, 549, 2339, 2939, 691, 686, 692, 549, 686,
+ 3091, 2231, 1608, 3091, 2063, 2232, 3091, 687, 1595, 3091,
+ 1585, 2939, 688, 689, 1575, 2233, 686, 2939, 691, 686,
+ 692, 904, 896, 896, 904, 686, 3091, 687, 686, 3091,
+ 2234, 2049, 688, 689, 1571, 2047, 687, 2939, 691, 1565,
+ 692, 688, 689, 906, 1563, 907, 2043, 691, 3108, 692,
+
+ 3138, 3138, 3138, 3138, 2038, 2037, 2036, 2235, 1781, 1782,
+ 1781, 1781, 1782, 1781, 1781, 1781, 1781, 1781, 1781, 1781,
+ 1783, 1781, 1781, 1781, 1781, 2236, 2237, 1781, 1012, 2035,
+ 2034, 1786, 1781, 1787, 1781, 1781, 1781, 2033, 2238, 2032,
+ 914, 3126, 686, 2239, 2031, 686, 904, 896, 896, 904,
+ 2030, 2029, 2028, 687, 1781, 1781, 1781, 1781, 688, 689,
+ 686, 1012, 2027, 686, 691, 2026, 692, 2025, 906, 1012,
+ 907, 687, 3158, 3158, 3158, 3158, 688, 689, 2024, 3158,
+ 686, 1524, 691, 686, 692, 1781, 1781, 1781, 1781, 1788,
+ 686, 687, 1524, 686, 3158, 2240, 688, 689, 2010, 972,
+
+ 2241, 687, 691, 2009, 692, 2242, 688, 689, 686, 2008,
+ 3107, 686, 691, 3107, 692, 914, 2007, 686, 2006, 687,
+ 686, 2939, 2005, 1243, 688, 689, 686, 2004, 687, 686,
+ 691, 972, 692, 688, 689, 2003, 2243, 687, 2002, 691,
+ 972, 692, 688, 689, 686, 2001, 1243, 686, 691, 2000,
+ 692, 3158, 951, 770, 771, 687, 770, 1999, 768, 768,
+ 688, 689, 1998, 768, 772, 1997, 691, 768, 692, 773,
+ 774, 1996, 1995, 770, 771, 691, 770, 692, 2244, 3146,
+ 3158, 3158, 3158, 3158, 772, 3107, 2245, 3158, 3107, 773,
+ 774, 770, 771, 2246, 770, 691, 2939, 692, 719, 1994,
+
+ 770, 771, 772, 770, 951, 1993, 1992, 773, 774, 770,
+ 771, 772, 770, 691, 951, 692, 773, 774, 833, 833,
+ 772, 2248, 691, 833, 692, 773, 774, 833, 1991, 770,
+ 771, 691, 770, 692, 2080, 2080, 2080, 2080, 2249, 3127,
+ 772, 1638, 1990, 1989, 1988, 773, 774, 2927, 3158, 2927,
+ 2927, 691, 1987, 692, 2927, 1986, 1104, 1985, 2250, 1277,
+ 1373, 1374, 1277, 1373, 1277, 1277, 1277, 1277, 1277, 1277,
+ 1277, 1375, 1277, 1277, 1277, 1277, 1376, 1377, 1277, 1984,
+ 1983, 1465, 1282, 1277, 1283, 1277, 1277, 1277, 1464, 801,
+ 1965, 884, 3029, 770, 771, 3029, 770, 1964, 1963, 904,
+
+ 896, 896, 904, 3058, 772, 1277, 1277, 1277, 1277, 773,
+ 774, 838, 838, 1106, 2251, 691, 838, 692, 1962, 1961,
+ 838, 906, 1960, 907, 2413, 2414, 2414, 2413, 1959, 1958,
+ 770, 771, 1957, 770, 884, 2415, 1277, 1277, 1277, 1277,
+ 1378, 772, 770, 771, 1956, 770, 773, 774, 2335, 1955,
+ 801, 1954, 691, 772, 692, 1953, 884, 1952, 773, 774,
+ 770, 771, 2927, 770, 691, 1937, 692, 1936, 2943, 770,
+ 771, 772, 770, 2927, 2927, 2927, 773, 774, 770, 771,
+ 772, 770, 691, 2990, 692, 773, 774, 1935, 1934, 772,
+ 1933, 691, 1930, 692, 773, 774, 3107, 1929, 1342, 3107,
+
+ 691, 1928, 692, 770, 771, 3091, 770, 2939, 3091, 1927,
+ 1926, 1342, 770, 771, 772, 770, 2939, 849, 2252, 773,
+ 774, 770, 771, 772, 770, 691, 1922, 692, 773, 774,
+ 774, 774, 772, 2927, 691, 1335, 692, 773, 774, 2253,
+ 1239, 770, 771, 691, 770, 692, 3142, 2254, 1237, 689,
+ 770, 771, 772, 770, 1239, 1237, 689, 773, 774, 3136,
+ 1239, 772, 1774, 691, 2255, 692, 773, 774, 770, 771,
+ 2256, 770, 691, 1773, 692, 2414, 2414, 2414, 2414, 772,
+ 770, 771, 1772, 770, 773, 774, 2415, 1771, 2257, 1770,
+ 691, 772, 692, 1769, 1766, 1342, 773, 774, 770, 771,
+
+ 1765, 770, 691, 1764, 692, 1763, 1762, 770, 771, 772,
+ 770, 2258, 1761, 1760, 773, 774, 770, 771, 772, 770,
+ 691, 1752, 692, 773, 774, 770, 771, 772, 770, 691,
+ 1751, 692, 773, 774, 2205, 596, 772, 800, 691, 1123,
+ 692, 773, 774, 770, 771, 2927, 770, 691, 2259, 692,
+ 1666, 2943, 770, 771, 772, 770, 2927, 2927, 2927, 773,
+ 774, 770, 771, 772, 770, 691, 2990, 692, 773, 774,
+ 2260, 1465, 772, 1661, 691, 1660, 692, 773, 774, 770,
+ 771, 1659, 770, 691, 1658, 692, 1657, 1656, 1342, 2261,
+ 772, 770, 771, 1653, 770, 773, 774, 2927, 3158, 2927,
+
+ 2927, 691, 772, 692, 2927, 1652, 3107, 773, 774, 3107,
+ 2262, 770, 771, 691, 770, 692, 2927, 2939, 1651, 2263,
+ 1650, 1649, 772, 3091, 2264, 1648, 3091, 773, 774, 3138,
+ 3138, 3138, 3138, 691, 2939, 692, 770, 771, 1647, 770,
+ 770, 771, 2266, 770, 1640, 1097, 2265, 772, 1607, 1607,
+ 1571, 772, 773, 774, 848, 848, 773, 774, 691, 848,
+ 692, 1562, 691, 848, 692, 770, 771, 1565, 770, 770,
+ 771, 1562, 770, 3137, 1556, 1027, 772, 1027, 1555, 2267,
+ 772, 773, 774, 1552, 1551, 773, 774, 691, 1548, 692,
+ 3141, 691, 2269, 692, 770, 771, 1547, 770, 1546, 1545,
+
+ 1544, 2268, 1012, 770, 771, 772, 770, 1542, 852, 852,
+ 773, 774, 1541, 852, 772, 2270, 691, 852, 692, 773,
+ 774, 770, 771, 3091, 770, 691, 3091, 692, 1540, 1539,
+ 770, 771, 772, 770, 2939, 1538, 2271, 773, 774, 770,
+ 771, 772, 770, 691, 1012, 692, 773, 774, 1524, 1522,
+ 772, 1521, 691, 2273, 692, 773, 774, 770, 771, 2272,
+ 770, 691, 1520, 692, 3158, 3158, 3158, 3158, 772, 2626,
+ 2627, 2627, 2626, 773, 774, 2274, 1519, 1516, 1515, 691,
+ 594, 692, 1514, 770, 771, 972, 770, 3158, 2275, 3158,
+ 1513, 2104, 3148, 1342, 772, 770, 771, 1512, 770, 773,
+
+ 774, 3158, 3158, 3158, 3158, 691, 772, 692, 3158, 1511,
+ 1510, 773, 774, 770, 771, 3107, 770, 691, 3107, 692,
+ 972, 1509, 2590, 1508, 772, 2276, 2939, 1507, 1506, 773,
+ 774, 770, 771, 3091, 770, 691, 3091, 692, 1503, 1502,
+ 3158, 1501, 772, 951, 2939, 1500, 1499, 773, 774, 770,
+ 771, 1498, 770, 691, 2277, 692, 3158, 3158, 3158, 3158,
+ 772, 3091, 2278, 3158, 3091, 773, 774, 770, 771, 1497,
+ 770, 691, 2939, 692, 2926, 1668, 1668, 2926, 772, 3149,
+ 3158, 951, 800, 773, 774, 2279, 1496, 1495, 1494, 691,
+ 1493, 692, 770, 771, 1492, 770, 1669, 3151, 2280, 2776,
+
+ 2776, 2776, 2776, 772, 770, 771, 1491, 770, 773, 774,
+ 594, 3145, 1490, 2281, 691, 772, 692, 1489, 860, 860,
+ 773, 774, 1488, 860, 1465, 2282, 691, 860, 692, 770,
+ 771, 1464, 770, 903, 1461, 3158, 2927, 3158, 2927, 2927,
+ 772, 770, 771, 2927, 770, 773, 774, 904, 896, 896,
+ 904, 691, 772, 692, 1460, 2283, 2284, 773, 774, 1459,
+ 1458, 770, 771, 691, 770, 692, 1457, 1456, 1453, 906,
+ 1452, 907, 772, 770, 771, 1451, 770, 773, 774, 884,
+ 1449, 2285, 1448, 691, 772, 692, 1447, 1446, 1445, 773,
+ 774, 770, 771, 1444, 770, 691, 884, 692, 2286, 1433,
+
+ 936, 936, 772, 770, 771, 936, 770, 773, 774, 936,
+ 2336, 1432, 1427, 691, 772, 692, 1426, 1425, 686, 773,
+ 774, 686, 2287, 944, 944, 691, 1424, 692, 944, 687,
+ 770, 771, 944, 770, 2473, 2474, 1423, 849, 1421, 849,
+ 691, 772, 692, 1419, 842, 2288, 773, 774, 904, 896,
+ 896, 904, 691, 842, 692, 775, 2290, 770, 771, 2289,
+ 770, 2291, 961, 961, 774, 1335, 2292, 961, 772, 1333,
+ 906, 961, 907, 773, 774, 770, 771, 757, 770, 691,
+ 690, 692, 1239, 1237, 770, 771, 772, 770, 689, 965,
+ 965, 773, 774, 1342, 965, 772, 1232, 691, 965, 692,
+
+ 773, 774, 1229, 1226, 770, 771, 691, 770, 692, 982,
+ 982, 1225, 671, 2293, 982, 772, 770, 771, 982, 770,
+ 773, 774, 904, 896, 896, 904, 691, 772, 692, 671,
+ 1211, 1342, 773, 774, 770, 771, 596, 770, 691, 1123,
+ 692, 596, 1118, 1115, 906, 772, 907, 1112, 987, 987,
+ 773, 774, 1111, 987, 2294, 1097, 691, 987, 692, 582,
+ 2575, 896, 896, 2575, 2627, 2627, 2627, 2627, 1337, 1337,
+ 1337, 1337, 2574, 2295, 553, 594, 993, 993, 549, 760,
+ 549, 993, 906, 2296, 907, 993, 2104, 541, 801, 1277,
+ 1471, 1472, 1472, 1471, 1277, 1277, 1277, 1277, 1277, 1277,
+
+ 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 905,
+ 905, 905, 1473, 1277, 1474, 1277, 1277, 1277, 905, 905,
+ 905, 905, 905, 905, 905, 905, 905, 905, 905, 905,
+ 905, 905, 905, 905, 905, 1277, 1277, 1277, 1277, 905,
+ 905, 905, 905, 905, 2330, 905, 905, 905, 905, 905,
+ 905, 905, 905, 905, 905, 905, 905, 905, 905, 905,
+ 905, 905, 905, 905, 905, 905, 1277, 1277, 1277, 1277,
+ 1475, 904, 896, 896, 904, 2110, 2111, 2111, 2110, 534,
+ 2776, 2776, 2776, 2776, 530, 686, 2112, 595, 686, 686,
+ 595, 594, 686, 906, 1027, 907, 687, 597, 595, 907,
+
+ 687, 688, 689, 1004, 1004, 688, 689, 691, 1004, 692,
+ 497, 691, 1004, 692, 2702, 2702, 2702, 2702, 2776, 2776,
+ 2776, 2776, 595, 1025, 1025, 760, 1092, 1092, 1025, 594,
+ 1023, 1092, 1025, 1022, 1021, 1092, 1856, 1014, 2520, 2488,
+ 2338, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277,
+ 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277,
+ 1277, 1005, 1005, 1005, 1277, 1277, 1277, 1277, 1277, 1277,
+ 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
+ 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1277, 1277, 1277,
+ 1277, 1005, 1005, 1005, 1005, 1005, 2369, 1005, 1005, 1005,
+
+ 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005,
+ 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1277, 1277,
+ 1277, 1277, 1543, 592, 593, 593, 592, 1011, 1010, 1641,
+ 1101, 1101, 1641, 1007, 594, 595, 1102, 1006, 595, 2395,
+ 2396, 1103, 996, 985, 984, 597, 595, 598, 2081, 2081,
+ 2081, 1104, 1641, 1101, 1101, 1641, 981, 980, 979, 1102,
+ 975, 974, 971, 970, 1103, 2111, 2111, 2111, 2111, 969,
+ 595, 1642, 1642, 1642, 1104, 686, 2112, 595, 686, 686,
+ 595, 968, 686, 967, 1328, 1328, 687, 597, 595, 1328,
+ 687, 688, 689, 1328, 960, 688, 689, 691, 959, 692,
+
+ 958, 691, 686, 692, 954, 686, 686, 953, 1106, 686,
+ 2958, 2958, 595, 687, 950, 1126, 1126, 687, 688, 689,
+ 949, 948, 688, 689, 691, 2959, 692, 947, 691, 2489,
+ 692, 1106, 592, 593, 593, 592, 904, 896, 896, 904,
+ 946, 497, 942, 594, 595, 2487, 941, 595, 3158, 3158,
+ 686, 940, 2490, 686, 597, 595, 598, 939, 906, 686,
+ 907, 687, 686, 938, 497, 903, 688, 689, 895, 2492,
+ 687, 894, 691, 893, 692, 688, 689, 2958, 887, 595,
+ 886, 691, 883, 692, 882, 2578, 2416, 1674, 2428, 1676,
+ 1676, 2428, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1677,
+
+ 1678, 1674, 1674, 1678, 1674, 1674, 1674, 881, 2494, 878,
+ 1679, 1678, 1680, 1674, 1674, 1674, 877, 865, 858, 857,
+ 2493, 686, 856, 855, 686, 904, 896, 896, 904, 849,
+ 842, 497, 687, 1674, 1674, 1678, 1674, 688, 689, 686,
+ 757, 576, 686, 691, 671, 692, 668, 906, 671, 907,
+ 687, 3158, 3158, 3158, 3158, 688, 689, 671, 670, 668,
+ 600, 691, 582, 692, 1674, 1674, 1674, 1674, 1681, 2433,
+ 2111, 2111, 2433, 579, 3158, 1243, 3158, 576, 914, 686,
+ 2112, 595, 686, 686, 595, 563, 686, 560, 549, 549,
+ 687, 597, 595, 907, 687, 688, 689, 549, 544, 688,
+
+ 689, 691, 1243, 692, 2344, 691, 686, 692, 541, 686,
+ 533, 497, 904, 896, 896, 904, 595, 687, 520, 514,
+ 505, 2147, 688, 689, 497, 3158, 3158, 3158, 691, 3158,
+ 692, 3158, 3158, 718, 906, 2495, 907, 2148, 1143, 1144,
+ 1145, 1145, 1144, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1146, 1147, 1143, 1143, 1147, 1143, 1143, 1143, 2498, 3158,
+ 3158, 1148, 1147, 1149, 1143, 1143, 1143, 3158, 3158, 3158,
+ 2575, 896, 896, 2575, 3158, 2727, 2727, 2727, 2727, 686,
+ 3158, 914, 686, 3158, 1143, 1143, 1147, 1143, 686, 3158,
+ 687, 686, 897, 3158, 907, 688, 689, 2728, 3158, 687,
+
+ 3158, 691, 3158, 692, 688, 689, 3158, 627, 3158, 3158,
+ 691, 3158, 692, 3158, 3158, 1143, 1143, 1143, 1143, 1151,
+ 1781, 1782, 1781, 1781, 1782, 1781, 1781, 1781, 1781, 1781,
+ 1781, 1781, 1783, 1781, 1781, 1781, 1781, 1784, 1785, 1781,
+ 3158, 1243, 2500, 1786, 1781, 1787, 1781, 1781, 1781, 3158,
+ 3158, 2728, 2926, 1668, 1668, 2926, 904, 896, 896, 904,
+ 686, 3158, 3158, 686, 3158, 3158, 1781, 1781, 1781, 1781,
+ 2491, 687, 686, 3158, 2104, 686, 688, 689, 906, 3158,
+ 907, 3158, 691, 687, 692, 3158, 3158, 3158, 688, 689,
+ 3158, 3158, 686, 3158, 691, 686, 692, 1781, 1781, 1781,
+
+ 1781, 1788, 686, 687, 3158, 686, 2958, 2958, 688, 689,
+ 914, 1126, 1126, 687, 691, 3158, 692, 686, 688, 689,
+ 686, 2959, 1462, 1462, 691, 3158, 692, 1462, 687, 1243,
+ 2499, 1462, 3158, 688, 689, 686, 3158, 3158, 686, 691,
+ 3158, 692, 2418, 2418, 2418, 2418, 687, 686, 3158, 2623,
+ 686, 688, 689, 3158, 3158, 3158, 1243, 691, 687, 692,
+ 3158, 1243, 3158, 688, 689, 686, 3158, 3158, 686, 691,
+ 3158, 692, 3107, 2958, 686, 3107, 687, 686, 2501, 1422,
+ 1422, 688, 689, 2939, 1422, 687, 3158, 691, 1422, 692,
+ 688, 689, 1337, 1337, 1337, 1337, 691, 3158, 692, 3091,
+
+ 2502, 686, 3091, 760, 686, 3158, 2625, 3158, 3158, 3158,
+ 2939, 686, 687, 3158, 686, 3158, 2503, 688, 689, 3158,
+ 3158, 2422, 687, 691, 3158, 692, 3158, 688, 689, 686,
+ 3158, 3158, 686, 691, 718, 692, 3158, 3158, 686, 3152,
+ 687, 686, 3158, 2504, 3158, 688, 689, 686, 3158, 687,
+ 686, 691, 3158, 692, 688, 689, 3158, 3158, 687, 2505,
+ 691, 3158, 692, 688, 689, 686, 3154, 3158, 686, 691,
+ 3158, 692, 2418, 2418, 2418, 2418, 687, 3158, 3158, 2623,
+ 2506, 688, 689, 3158, 3158, 686, 3158, 691, 686, 692,
+ 2508, 3158, 3158, 3158, 686, 3158, 687, 686, 2507, 1243,
+
+ 3158, 688, 689, 686, 3158, 687, 686, 691, 3158, 692,
+ 688, 689, 3158, 3158, 687, 3158, 691, 3158, 692, 688,
+ 689, 686, 3158, 3158, 686, 691, 3158, 692, 3158, 3158,
+ 686, 3158, 687, 686, 2509, 3158, 2625, 688, 689, 2510,
+ 3158, 687, 3158, 691, 3158, 692, 688, 689, 1243, 3158,
+ 3158, 2422, 691, 686, 692, 3158, 686, 2916, 2917, 2086,
+ 2916, 3158, 686, 3158, 687, 686, 719, 3158, 2087, 688,
+ 689, 3158, 3158, 687, 718, 691, 3158, 692, 688, 689,
+ 686, 3158, 3158, 686, 691, 3158, 692, 3158, 3158, 686,
+ 3158, 687, 686, 3158, 3158, 3158, 688, 689, 3158, 718,
+
+ 687, 3158, 691, 3158, 692, 688, 689, 686, 1243, 3158,
+ 686, 691, 3158, 692, 2511, 3158, 686, 3158, 687, 686,
+ 1125, 1125, 3158, 688, 689, 1126, 1126, 687, 3158, 691,
+ 3158, 692, 688, 689, 3158, 1127, 718, 3158, 691, 686,
+ 692, 3158, 686, 3158, 3158, 3158, 2927, 3158, 2927, 2927,
+ 687, 3158, 3158, 2927, 686, 688, 689, 686, 1243, 3158,
+ 3158, 691, 3158, 692, 719, 687, 2981, 2982, 2399, 2981,
+ 688, 689, 3158, 3158, 3158, 3158, 691, 2400, 692, 1105,
+ 1105, 3158, 3158, 2512, 1105, 3158, 3158, 1125, 1105, 2513,
+ 1254, 1255, 1254, 1254, 1255, 1254, 1254, 1254, 1254, 1254,
+
+ 1254, 1254, 1256, 1254, 1254, 1254, 1254, 1257, 1258, 1254,
+ 3074, 3158, 2514, 1259, 1254, 1260, 1254, 1254, 1254, 3158,
+ 904, 896, 896, 904, 686, 2927, 3158, 686, 3158, 3158,
+ 904, 896, 896, 904, 3158, 687, 1254, 1254, 1254, 1254,
+ 688, 689, 906, 3158, 907, 3158, 691, 3158, 692, 3158,
+ 3158, 3158, 906, 3158, 907, 3010, 1668, 1668, 3010, 719,
+ 3158, 3158, 3158, 686, 3158, 3158, 686, 1254, 1254, 1254,
+ 1254, 1262, 686, 3158, 687, 686, 914, 1669, 2515, 688,
+ 689, 686, 3158, 687, 686, 691, 3158, 692, 688, 689,
+ 686, 3158, 687, 686, 691, 3158, 692, 688, 689, 914,
+
+ 3158, 687, 3158, 691, 3158, 692, 688, 689, 686, 3158,
+ 3158, 686, 691, 3158, 692, 3158, 1243, 770, 771, 687,
+ 770, 3158, 2516, 3158, 688, 689, 770, 771, 772, 770,
+ 691, 3158, 692, 773, 774, 770, 771, 772, 770, 691,
+ 2518, 692, 773, 774, 2517, 3158, 772, 3158, 691, 3158,
+ 692, 773, 774, 770, 771, 3158, 770, 691, 3158, 692,
+ 3158, 3158, 770, 771, 772, 770, 2519, 1923, 1923, 773,
+ 774, 3158, 1923, 772, 3158, 691, 1923, 692, 773, 774,
+ 2526, 3158, 3158, 3158, 691, 2527, 692, 2525, 770, 771,
+ 3158, 770, 3158, 3158, 3158, 3158, 3158, 770, 771, 772,
+
+ 770, 3158, 3158, 2528, 773, 774, 770, 771, 772, 770,
+ 691, 3158, 692, 773, 774, 770, 771, 772, 770, 691,
+ 3158, 692, 773, 774, 3158, 2529, 772, 2927, 691, 3158,
+ 692, 773, 774, 2928, 2927, 3158, 3158, 691, 3158, 692,
+ 2927, 770, 771, 3158, 770, 3158, 3158, 3158, 2999, 2530,
+ 3158, 1342, 772, 2626, 2627, 2627, 2626, 773, 774, 3158,
+ 800, 3158, 3158, 691, 594, 692, 3158, 2531, 3158, 770,
+ 771, 3158, 770, 770, 771, 1669, 770, 2629, 1968, 1968,
+ 772, 3158, 3158, 1968, 772, 773, 774, 1968, 3158, 773,
+ 774, 691, 3158, 692, 3158, 691, 3158, 692, 2927, 3158,
+
+ 2927, 3158, 3158, 3158, 1342, 1781, 1860, 1861, 1781, 1860,
+ 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1862, 1781, 1781,
+ 1781, 1781, 1863, 1864, 1781, 2533, 3158, 3158, 1786, 1781,
+ 1787, 1781, 1781, 1781, 2982, 2982, 2399, 2982, 1342, 770,
+ 771, 3158, 770, 3158, 3158, 2400, 3158, 3158, 3158, 3158,
+ 772, 1781, 1781, 1781, 1781, 773, 774, 770, 771, 3158,
+ 770, 691, 3158, 692, 3158, 3158, 3158, 2532, 772, 3158,
+ 3158, 3158, 3158, 773, 774, 3158, 3158, 770, 771, 691,
+ 770, 692, 1781, 1781, 1781, 1781, 1865, 3158, 772, 3158,
+ 3158, 3158, 1342, 773, 774, 770, 771, 3158, 770, 691,
+
+ 3158, 692, 3158, 3158, 2591, 3158, 772, 770, 771, 3158,
+ 770, 773, 774, 3158, 3158, 2534, 3158, 691, 772, 692,
+ 3158, 3158, 3158, 773, 774, 3000, 1668, 3001, 3000, 691,
+ 3158, 692, 3158, 3158, 770, 771, 2928, 770, 3010, 1668,
+ 1668, 3010, 3158, 3158, 3158, 772, 1342, 3002, 3158, 1342,
+ 773, 774, 770, 771, 3158, 770, 691, 3158, 692, 3158,
+ 2104, 770, 771, 772, 770, 3158, 2039, 2039, 773, 774,
+ 2535, 2039, 772, 3158, 691, 2039, 692, 773, 774, 3158,
+ 3158, 770, 771, 691, 770, 692, 3158, 3158, 3158, 3158,
+ 770, 771, 772, 770, 3158, 2536, 3158, 773, 774, 770,
+
+ 771, 772, 770, 691, 3158, 692, 773, 774, 3158, 3158,
+ 772, 3158, 691, 3158, 692, 773, 774, 2537, 3158, 3158,
+ 3158, 691, 3158, 692, 770, 771, 3158, 770, 3158, 3158,
+ 2538, 3026, 3026, 3026, 3026, 772, 770, 771, 3158, 770,
+ 773, 774, 2584, 3158, 3158, 3158, 691, 772, 692, 3158,
+ 800, 3158, 773, 774, 3158, 3158, 3158, 2540, 691, 2539,
+ 692, 770, 771, 3158, 770, 770, 771, 3158, 770, 3158,
+ 2420, 2420, 772, 3158, 3158, 2420, 772, 773, 774, 2420,
+ 3158, 773, 774, 691, 3158, 692, 3158, 691, 3158, 692,
+ 3158, 2573, 2573, 2541, 3158, 3158, 2573, 3158, 770, 771,
+
+ 2573, 770, 3158, 3158, 3158, 2542, 3158, 770, 771, 772,
+ 770, 3158, 3158, 2543, 773, 774, 686, 1342, 772, 686,
+ 691, 3158, 692, 773, 774, 770, 771, 687, 770, 691,
+ 3158, 692, 688, 689, 770, 771, 772, 770, 691, 3158,
+ 692, 773, 774, 3158, 3158, 772, 3158, 691, 3158, 692,
+ 773, 774, 770, 771, 3158, 770, 691, 3158, 692, 3158,
+ 3158, 1342, 3158, 772, 3158, 3158, 3158, 2544, 773, 774,
+ 3158, 3158, 3158, 3158, 691, 3158, 692, 3158, 770, 771,
+ 3158, 770, 770, 771, 3158, 770, 2684, 800, 801, 772,
+ 3158, 3158, 3158, 772, 773, 774, 3158, 3158, 773, 774,
+
+ 691, 3158, 692, 3158, 691, 3158, 692, 770, 771, 3158,
+ 770, 3158, 3158, 3158, 2981, 2982, 2399, 2981, 772, 770,
+ 771, 800, 770, 773, 774, 2400, 3158, 3158, 3158, 691,
+ 772, 692, 3158, 1342, 1342, 773, 774, 770, 771, 3158,
+ 770, 691, 3158, 692, 2982, 2982, 2399, 2982, 772, 770,
+ 771, 3158, 770, 773, 774, 2400, 3158, 3158, 3158, 691,
+ 772, 692, 3158, 800, 3158, 773, 774, 770, 771, 3158,
+ 770, 691, 3158, 692, 3158, 3158, 770, 771, 772, 770,
+ 3158, 3158, 3158, 773, 774, 3158, 3158, 772, 1342, 691,
+ 3158, 692, 773, 774, 801, 3158, 3158, 3158, 691, 3158,
+
+ 692, 3026, 3026, 3026, 3026, 3158, 3158, 2927, 3158, 2927,
+ 2927, 3158, 2584, 3158, 2927, 3158, 2545, 2546, 1254, 1353,
+ 1354, 1254, 1353, 1254, 1254, 1254, 1254, 1254, 1254, 1254,
+ 1355, 1254, 1254, 1254, 1254, 1356, 1357, 1254, 3158, 2550,
+ 3158, 1259, 1254, 1260, 1254, 1254, 1254, 3158, 904, 896,
+ 896, 904, 770, 771, 3158, 770, 904, 896, 896, 904,
+ 3158, 3158, 3158, 772, 1254, 1254, 1254, 1254, 773, 774,
+ 906, 3105, 907, 3158, 691, 3158, 692, 3158, 906, 3158,
+ 907, 3158, 3026, 3026, 3026, 3026, 2927, 801, 3158, 770,
+ 771, 3158, 770, 2584, 3158, 1254, 1254, 1254, 1254, 1359,
+
+ 772, 770, 771, 3158, 770, 773, 774, 3158, 3158, 2739,
+ 2547, 691, 772, 692, 3158, 3158, 3158, 773, 774, 2576,
+ 3158, 3158, 3158, 691, 3158, 692, 3158, 3158, 770, 771,
+ 3158, 770, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 772,
+ 3158, 3158, 3158, 2548, 773, 774, 770, 771, 3158, 770,
+ 691, 3158, 692, 3158, 1342, 770, 771, 772, 770, 3158,
+ 3158, 3158, 773, 774, 3158, 3158, 772, 3158, 691, 3158,
+ 692, 773, 774, 770, 771, 3158, 770, 691, 2549, 692,
+ 904, 896, 896, 904, 772, 2583, 2583, 2583, 2583, 773,
+ 774, 929, 929, 929, 929, 691, 2551, 692, 3128, 2776,
+
+ 3128, 3128, 906, 3158, 907, 3158, 3158, 3158, 2584, 2939,
+ 2584, 3158, 3158, 2552, 3158, 3158, 3158, 592, 593, 593,
+ 592, 3158, 2553, 2626, 2627, 2627, 2626, 3158, 594, 595,
+ 3158, 3158, 595, 3158, 594, 3158, 3158, 2585, 2577, 597,
+ 595, 598, 3158, 2599, 3158, 1669, 3158, 2629, 3158, 2586,
+ 3158, 3158, 3158, 2587, 2588, 2600, 2589, 3158, 3158, 2601,
+ 3158, 934, 2602, 3158, 595, 3158, 3158, 934, 592, 593,
+ 593, 592, 3158, 3158, 2637, 2111, 2111, 2637, 3158, 594,
+ 595, 3158, 3158, 595, 2622, 2112, 595, 3158, 2630, 595,
+ 597, 595, 598, 3158, 3158, 3158, 597, 595, 907, 2634,
+
+ 3158, 3158, 3158, 3158, 3158, 2434, 2435, 2435, 2434, 3158,
+ 3158, 3158, 3158, 3158, 3158, 595, 594, 595, 3158, 3158,
+ 595, 595, 2433, 2111, 2111, 2433, 3158, 597, 595, 907,
+ 3158, 3158, 3158, 2112, 595, 3158, 3158, 595, 2435, 2435,
+ 2435, 2435, 3158, 3158, 597, 595, 907, 3158, 3158, 594,
+ 595, 3158, 595, 595, 3158, 3158, 904, 896, 896, 904,
+ 597, 595, 3158, 3158, 2664, 2665, 2665, 2664, 3158, 595,
+ 3158, 3158, 3158, 3158, 2147, 2112, 595, 3158, 906, 595,
+ 907, 3158, 3158, 3158, 3158, 595, 597, 595, 907, 3158,
+ 2148, 1674, 2653, 1676, 1676, 2653, 1674, 1674, 1674, 1674,
+
+ 1674, 1674, 1674, 1677, 1678, 1674, 1674, 1678, 1674, 1674,
+ 1674, 595, 3158, 3158, 1679, 1678, 1680, 1674, 1674, 1674,
+ 2665, 2665, 2665, 2665, 3158, 914, 3158, 2666, 3158, 3158,
+ 686, 2112, 595, 686, 3158, 595, 3158, 1674, 1674, 1678,
+ 1674, 687, 597, 595, 3158, 3158, 688, 689, 3158, 3158,
+ 3158, 3158, 691, 3158, 692, 3158, 3158, 3158, 904, 896,
+ 896, 904, 686, 3158, 3158, 686, 3158, 595, 1674, 1674,
+ 1674, 1674, 1681, 687, 686, 3158, 3158, 686, 688, 689,
+ 906, 3158, 907, 2666, 691, 687, 692, 3158, 3158, 3158,
+ 688, 689, 2681, 3158, 686, 3158, 691, 686, 692, 3158,
+
+ 3158, 3158, 3158, 686, 3158, 687, 686, 3158, 3158, 3158,
+ 688, 689, 2738, 3158, 687, 3158, 691, 3158, 692, 688,
+ 689, 686, 3158, 3158, 686, 691, 2682, 692, 3158, 1243,
+ 686, 3158, 687, 686, 3158, 3158, 3158, 688, 689, 3158,
+ 3158, 687, 3158, 691, 3158, 692, 688, 689, 686, 3158,
+ 3158, 686, 691, 3158, 692, 2683, 3158, 718, 3158, 687,
+ 3158, 3158, 3158, 686, 688, 689, 686, 3158, 3158, 3158,
+ 691, 3158, 692, 3158, 687, 686, 3158, 3158, 686, 688,
+ 689, 3158, 2685, 3158, 3158, 691, 687, 692, 3158, 3158,
+ 719, 688, 689, 686, 3158, 3158, 686, 691, 3158, 692,
+
+ 3158, 3158, 686, 3158, 687, 686, 2686, 3158, 3158, 688,
+ 689, 686, 3158, 687, 686, 691, 3158, 692, 688, 689,
+ 3158, 3158, 687, 3158, 691, 3158, 692, 688, 689, 3158,
+ 3158, 686, 719, 691, 686, 692, 3158, 719, 3158, 3158,
+ 686, 3158, 687, 686, 3158, 1243, 3158, 688, 689, 3158,
+ 3158, 687, 2688, 691, 3158, 692, 688, 689, 686, 3158,
+ 3158, 686, 691, 3158, 692, 1243, 3158, 686, 3158, 687,
+ 686, 3158, 3158, 3158, 688, 689, 686, 3158, 687, 686,
+ 691, 2689, 692, 688, 689, 3158, 3158, 687, 3158, 691,
+ 3158, 692, 688, 689, 686, 3158, 3158, 686, 691, 3158,
+
+ 692, 2583, 2583, 2583, 2583, 687, 3158, 1243, 3158, 3158,
+ 688, 689, 686, 3158, 3158, 686, 691, 3158, 692, 3158,
+ 2691, 3158, 2690, 687, 2584, 3158, 2584, 3158, 688, 689,
+ 686, 3158, 3158, 686, 691, 3158, 692, 3158, 3158, 686,
+ 3158, 687, 686, 1243, 3158, 3158, 688, 689, 1243, 3158,
+ 687, 3158, 691, 3158, 692, 688, 689, 3158, 3158, 3158,
+ 3158, 691, 3158, 692, 2927, 3158, 2927, 2927, 3158, 3158,
+ 2745, 2927, 686, 3158, 3158, 686, 686, 934, 3158, 686,
+ 3158, 2692, 3158, 687, 2693, 3158, 2927, 687, 688, 689,
+ 3158, 3158, 688, 689, 691, 3158, 692, 3158, 691, 3158,
+
+ 692, 3158, 3158, 3158, 3158, 3158, 2694, 1781, 1782, 1781,
+ 1781, 1782, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1783,
+ 1781, 1781, 1781, 1781, 1784, 1785, 1781, 3158, 2996, 3158,
+ 1786, 1781, 1787, 1781, 1781, 1781, 2696, 3158, 3001, 1668,
+ 3001, 3001, 3158, 2927, 3158, 2697, 3158, 686, 3158, 2928,
+ 686, 3158, 3158, 1781, 1781, 1781, 1781, 2695, 687, 686,
+ 3041, 3158, 686, 688, 689, 3158, 3158, 3158, 3158, 691,
+ 687, 692, 3158, 3158, 3158, 688, 689, 929, 929, 929,
+ 929, 691, 3158, 692, 1781, 1781, 1781, 1781, 1788, 686,
+ 3158, 3158, 686, 686, 3158, 3158, 686, 3158, 3158, 3158,
+
+ 687, 2698, 3158, 3158, 687, 688, 689, 3158, 3158, 688,
+ 689, 691, 3158, 692, 1243, 691, 686, 692, 3158, 686,
+ 686, 3158, 3158, 686, 3158, 3158, 3158, 687, 3158, 2585,
+ 3158, 687, 688, 689, 3158, 3158, 688, 689, 691, 3158,
+ 692, 2586, 691, 686, 692, 2587, 686, 2700, 2589, 3158,
+ 3158, 2699, 3158, 934, 687, 3158, 3158, 3158, 3158, 688,
+ 689, 2702, 2702, 2702, 2702, 691, 3158, 692, 3158, 3158,
+ 3158, 3158, 760, 770, 771, 3158, 770, 1243, 3158, 3158,
+ 3158, 2701, 3158, 1856, 772, 763, 3158, 3158, 3158, 773,
+ 774, 770, 771, 3158, 770, 691, 3158, 692, 3158, 3158,
+
+ 770, 771, 772, 770, 3158, 3158, 3158, 773, 774, 3158,
+ 3158, 772, 718, 691, 3158, 692, 773, 774, 3158, 3158,
+ 770, 771, 691, 770, 692, 3158, 3158, 3158, 3158, 770,
+ 771, 772, 770, 3158, 3158, 2707, 773, 774, 770, 771,
+ 772, 770, 691, 3158, 692, 773, 774, 3158, 3158, 772,
+ 3158, 691, 2708, 692, 773, 774, 770, 771, 1342, 770,
+ 691, 3158, 692, 3158, 3158, 770, 771, 772, 770, 3158,
+ 3158, 3158, 773, 774, 770, 771, 772, 770, 691, 3158,
+ 692, 773, 774, 800, 3158, 772, 3158, 691, 3158, 692,
+ 773, 774, 3158, 3158, 770, 771, 691, 770, 692, 2709,
+
+ 3158, 3158, 3158, 3158, 3158, 772, 3158, 801, 3158, 3158,
+ 773, 774, 770, 771, 2710, 770, 691, 3158, 692, 3158,
+ 3158, 770, 771, 772, 770, 3158, 3158, 3158, 773, 774,
+ 3158, 801, 772, 3158, 691, 3158, 692, 773, 774, 801,
+ 3158, 770, 771, 691, 770, 692, 1342, 3158, 3158, 3158,
+ 770, 771, 772, 770, 3158, 3158, 3158, 773, 774, 3158,
+ 3158, 772, 2711, 691, 3158, 692, 773, 774, 770, 771,
+ 3158, 770, 691, 3158, 692, 1342, 3158, 770, 771, 772,
+ 770, 3158, 3158, 3158, 773, 774, 770, 771, 772, 770,
+ 691, 2712, 692, 773, 774, 3158, 3158, 772, 3158, 691,
+
+ 3158, 692, 773, 774, 770, 771, 3158, 770, 691, 3158,
+ 692, 3158, 3158, 3158, 3158, 772, 3158, 1342, 3158, 3158,
+ 773, 774, 770, 771, 3158, 770, 691, 3158, 692, 3158,
+ 2714, 3158, 2713, 772, 3158, 3158, 3158, 3158, 773, 774,
+ 770, 771, 3158, 770, 691, 3158, 692, 3158, 3158, 770,
+ 771, 772, 770, 1342, 3158, 3158, 773, 774, 1342, 3158,
+ 772, 3158, 691, 3158, 692, 773, 774, 3000, 1668, 3001,
+ 3000, 691, 3158, 692, 3158, 3158, 770, 771, 2928, 770,
+ 3158, 3158, 3158, 3158, 3158, 770, 771, 772, 770, 3041,
+ 3158, 2715, 773, 774, 2716, 3158, 772, 3158, 691, 3158,
+
+ 692, 773, 774, 770, 771, 3158, 770, 691, 3158, 692,
+ 3158, 3158, 686, 2717, 772, 686, 3158, 3158, 3158, 773,
+ 774, 3158, 3158, 687, 3158, 691, 3158, 692, 688, 689,
+ 770, 771, 3158, 770, 691, 3158, 692, 3158, 3158, 2719,
+ 3158, 772, 3158, 3158, 3158, 2718, 773, 774, 770, 771,
+ 3158, 770, 691, 3158, 692, 3158, 3158, 3158, 1342, 772,
+ 770, 771, 3158, 770, 773, 774, 1243, 3158, 3158, 3158,
+ 691, 772, 692, 3158, 3158, 3158, 773, 774, 3001, 1668,
+ 3001, 3001, 691, 3158, 692, 3158, 3158, 770, 771, 2928,
+ 770, 3158, 2720, 3158, 3158, 3158, 770, 771, 772, 770,
+
+ 3041, 3158, 2721, 773, 774, 3158, 3158, 772, 3158, 691,
+ 3158, 692, 773, 774, 904, 896, 896, 904, 691, 3158,
+ 692, 1342, 2583, 2583, 2583, 2583, 3158, 3158, 2627, 2627,
+ 2627, 2627, 2627, 2627, 2627, 2627, 906, 3158, 907, 594,
+ 3158, 3158, 3158, 594, 3158, 2584, 3158, 2584, 2722, 3158,
+ 2104, 3158, 2629, 3158, 2104, 3158, 2629, 2626, 2627, 2627,
+ 2626, 2626, 2627, 2627, 2626, 800, 3158, 3158, 594, 3158,
+ 3158, 3158, 594, 3158, 2742, 3158, 3158, 914, 3158, 1669,
+ 3158, 2629, 3158, 1669, 3158, 2629, 2743, 3158, 3158, 3158,
+ 2744, 2745, 3158, 2746, 3158, 3158, 3158, 2774, 934, 2637,
+
+ 2111, 2111, 2637, 3158, 3158, 2927, 3158, 2927, 2927, 3158,
+ 2112, 595, 2927, 686, 595, 2775, 686, 686, 3158, 3158,
+ 686, 597, 595, 907, 687, 3158, 3158, 2927, 687, 688,
+ 689, 3158, 3158, 688, 689, 691, 3158, 692, 3158, 691,
+ 3158, 692, 3158, 3158, 3158, 3158, 595, 2781, 2782, 2783,
+ 2783, 2782, 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2784,
+ 2785, 2781, 2781, 2785, 2781, 2781, 2781, 2821, 3158, 3158,
+ 2786, 2785, 2787, 2781, 2781, 2781, 2664, 2665, 2665, 2664,
+ 3158, 3158, 1243, 3158, 2927, 3158, 3158, 2112, 595, 3158,
+ 3158, 595, 3158, 2781, 2781, 2785, 2781, 2788, 597, 595,
+
+ 907, 2927, 3158, 3158, 3158, 3158, 3158, 2943, 2944, 3158,
+ 3158, 3158, 2945, 2945, 2927, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 2946, 595, 2781, 2781, 2781, 2781, 2789, 2797,
+ 2111, 2111, 2797, 3158, 2665, 2665, 2665, 2665, 3158, 2666,
+ 2112, 595, 3158, 3158, 595, 2112, 595, 686, 3158, 595,
+ 686, 597, 595, 907, 3158, 3158, 597, 595, 687, 3158,
+ 3158, 3158, 686, 688, 689, 686, 3158, 3158, 3158, 691,
+ 3158, 692, 2927, 687, 2944, 3158, 595, 3158, 688, 689,
+ 3158, 595, 686, 2798, 691, 686, 692, 2799, 3158, 3158,
+ 3158, 686, 3158, 687, 686, 3158, 2800, 2666, 688, 689,
+
+ 2801, 719, 687, 3158, 691, 3158, 692, 688, 689, 686,
+ 3158, 2822, 686, 691, 3158, 692, 3158, 3158, 686, 3158,
+ 687, 686, 3158, 3158, 3158, 688, 689, 3158, 3158, 687,
+ 3158, 691, 3158, 692, 688, 689, 3158, 3158, 686, 3158,
+ 691, 686, 692, 3158, 3158, 3158, 3158, 686, 3158, 687,
+ 686, 1243, 1243, 3158, 688, 689, 686, 3158, 687, 686,
+ 691, 2823, 692, 688, 689, 686, 3158, 687, 686, 691,
+ 3158, 692, 688, 689, 3158, 3158, 687, 3158, 691, 3158,
+ 692, 688, 689, 686, 3158, 1243, 686, 691, 3158, 692,
+ 3158, 3158, 1243, 686, 687, 3158, 686, 3158, 3158, 688,
+
+ 689, 2824, 3158, 686, 687, 691, 686, 692, 3158, 688,
+ 689, 3158, 3158, 3158, 687, 691, 3158, 692, 3158, 688,
+ 689, 686, 3158, 1243, 686, 691, 3158, 692, 3158, 3158,
+ 2825, 686, 687, 3158, 686, 2826, 3158, 688, 689, 3158,
+ 3158, 3158, 687, 691, 3158, 692, 3158, 688, 689, 686,
+ 3158, 3158, 686, 691, 3158, 692, 2827, 1243, 686, 3158,
+ 687, 686, 3158, 3158, 3158, 688, 689, 3158, 3158, 687,
+ 3158, 691, 3158, 692, 688, 689, 2702, 2702, 2702, 2702,
+ 691, 3158, 692, 3158, 2828, 1243, 3158, 760, 3090, 2627,
+ 3091, 3090, 770, 771, 3158, 770, 3158, 3158, 1856, 3058,
+
+ 763, 3158, 718, 772, 770, 771, 3158, 770, 773, 774,
+ 3041, 3158, 1243, 3158, 691, 772, 692, 3158, 3158, 3158,
+ 773, 774, 3091, 2627, 3091, 3091, 691, 3158, 692, 3158,
+ 3158, 770, 771, 2939, 770, 3158, 3158, 3158, 3158, 3158,
+ 770, 771, 772, 770, 3041, 3158, 1342, 773, 774, 3158,
+ 3158, 772, 3158, 691, 3158, 692, 773, 774, 770, 771,
+ 3158, 770, 691, 3158, 692, 3158, 3158, 770, 771, 772,
+ 770, 3158, 3158, 1342, 773, 774, 770, 771, 772, 770,
+ 691, 3158, 692, 773, 774, 801, 3158, 772, 3158, 691,
+ 3158, 692, 773, 774, 770, 771, 3158, 770, 691, 3158,
+
+ 692, 3107, 2627, 3091, 3107, 772, 3158, 3158, 3158, 1342,
+ 773, 774, 2939, 3158, 770, 771, 691, 770, 692, 1342,
+ 3158, 3158, 3158, 3041, 3158, 772, 3158, 3158, 2830, 3158,
+ 773, 774, 3158, 3158, 1342, 3158, 691, 3158, 692, 770,
+ 771, 3158, 770, 904, 896, 896, 904, 3158, 1342, 3158,
+ 772, 3158, 3158, 3158, 3158, 773, 774, 3158, 3158, 770,
+ 771, 691, 770, 692, 3158, 906, 3158, 907, 2831, 3158,
+ 772, 770, 771, 3158, 770, 773, 774, 3158, 3158, 3158,
+ 3158, 691, 772, 692, 3158, 3158, 3158, 773, 774, 3158,
+ 3158, 770, 771, 691, 770, 692, 914, 3158, 3158, 3158,
+
+ 3158, 3158, 772, 3158, 3158, 3158, 1342, 773, 774, 3158,
+ 3158, 3158, 3158, 691, 3158, 692, 770, 771, 3158, 770,
+ 770, 771, 2832, 770, 3158, 1342, 3158, 772, 3158, 3158,
+ 3158, 772, 773, 774, 3158, 3158, 773, 774, 691, 3158,
+ 692, 3158, 691, 3158, 692, 770, 771, 3158, 770, 3158,
+ 904, 896, 896, 904, 2833, 3158, 772, 2627, 2627, 2627,
+ 2627, 773, 774, 3158, 3158, 3158, 3158, 691, 594, 692,
+ 1342, 3158, 906, 800, 907, 3158, 3158, 3158, 3158, 2104,
+ 3158, 2629, 3158, 2627, 2627, 2627, 2627, 2626, 2627, 2627,
+ 2626, 3158, 3158, 3158, 594, 3158, 3158, 3158, 594, 1342,
+
+ 3158, 3158, 3158, 3158, 2331, 2104, 3158, 2629, 3158, 1669,
+ 3158, 2629, 2864, 2111, 2111, 2864, 3158, 2111, 2111, 2111,
+ 2111, 3158, 3158, 2112, 595, 3158, 3158, 595, 2112, 595,
+ 3158, 3158, 595, 3158, 597, 595, 2865, 2859, 3158, 597,
+ 595, 3118, 2627, 3091, 3118, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3058, 3158, 2860, 3158, 3158, 3158, 3158, 595,
+ 3158, 3158, 3158, 3041, 595, 2869, 2870, 1676, 2871, 2870,
+ 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2872, 2873, 2869,
+ 2869, 2873, 2869, 2869, 2869, 2874, 2874, 2874, 2875, 2873,
+ 2876, 2869, 2869, 2869, 2874, 2874, 2874, 2874, 2874, 2874,
+
+ 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874,
+ 2874, 2869, 2869, 2873, 2869, 2874, 2874, 2874, 2874, 2874,
+ 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874,
+ 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874,
+ 2874, 2874, 2869, 2869, 2869, 2869, 2877, 2793, 2794, 593,
+ 2793, 3158, 2794, 2794, 593, 2794, 3158, 3158, 594, 595,
+ 3158, 3158, 595, 594, 595, 3158, 3158, 595, 3158, 597,
+ 595, 907, 3158, 3158, 597, 595, 3158, 3158, 2795, 593,
+ 593, 2795, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 594,
+ 595, 3158, 686, 595, 595, 686, 3158, 3158, 3158, 595,
+
+ 597, 595, 907, 687, 686, 3158, 3158, 686, 688, 689,
+ 3158, 3158, 3158, 3158, 691, 687, 692, 3158, 3158, 3158,
+ 688, 689, 3158, 3158, 686, 595, 691, 686, 692, 3158,
+ 2878, 3158, 3158, 686, 3158, 687, 686, 3158, 3158, 3158,
+ 688, 689, 686, 3158, 687, 686, 691, 3158, 692, 688,
+ 689, 686, 3158, 687, 686, 691, 2896, 692, 688, 689,
+ 2895, 3158, 687, 3158, 691, 3158, 692, 688, 689, 3158,
+ 3158, 686, 3158, 691, 686, 692, 3158, 3158, 1243, 3158,
+ 686, 3158, 687, 686, 3158, 3158, 1243, 688, 689, 770,
+ 771, 687, 770, 691, 3158, 692, 688, 689, 3158, 3158,
+
+ 772, 2898, 691, 3158, 692, 773, 774, 3158, 3158, 2897,
+ 3158, 691, 3158, 692, 770, 771, 3158, 770, 3158, 3158,
+ 3158, 3158, 3158, 770, 771, 772, 770, 3158, 3158, 2899,
+ 773, 774, 3158, 3158, 772, 3158, 691, 3158, 692, 773,
+ 774, 770, 771, 1342, 770, 691, 3158, 692, 3158, 1243,
+ 3158, 3158, 772, 2627, 2627, 2627, 2627, 773, 774, 3158,
+ 3158, 3158, 3158, 691, 594, 692, 3158, 1342, 2626, 2627,
+ 2627, 2626, 3158, 3158, 3158, 2104, 3158, 2629, 3158, 594,
+ 3158, 2900, 2864, 2111, 2111, 2864, 3158, 3158, 3158, 3158,
+ 1669, 3158, 2629, 2112, 595, 3158, 3158, 595, 3158, 3158,
+
+ 2929, 2111, 2930, 2929, 597, 595, 2865, 3158, 3158, 3158,
+ 1342, 2931, 2932, 3158, 3158, 2932, 3158, 3158, 2921, 3158,
+ 2920, 3158, 2933, 2932, 2934, 3068, 1214, 3069, 3068, 595,
+ 2930, 2111, 2930, 2930, 3158, 3158, 2939, 2932, 3158, 3158,
+ 2932, 2935, 2932, 686, 3158, 2932, 686, 2932, 2932, 2934,
+ 2927, 3158, 2933, 2932, 687, 3158, 2943, 2944, 3158, 688,
+ 689, 2945, 2945, 2927, 3158, 691, 3158, 692, 3158, 3158,
+ 3158, 2946, 2932, 3158, 3158, 3158, 3158, 2932, 2927, 2937,
+ 593, 2938, 2937, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2939, 2932, 2927, 2927, 2932, 2927, 2927, 2927, 3158, 3158,
+
+ 3158, 2933, 2932, 2940, 2927, 2927, 2927, 2955, 2111, 2111,
+ 2955, 3158, 2963, 3158, 3158, 3158, 3158, 686, 2112, 595,
+ 686, 2927, 595, 2944, 2927, 2927, 2932, 2927, 687, 597,
+ 595, 2956, 3158, 688, 689, 3158, 3158, 3158, 3158, 691,
+ 3158, 692, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 686,
+ 3158, 3158, 686, 3158, 595, 2927, 2927, 2927, 2927, 2874,
+ 687, 686, 3158, 3158, 686, 688, 689, 2964, 3158, 3158,
+ 3158, 691, 687, 692, 3158, 3158, 686, 688, 689, 686,
+ 3158, 3158, 3158, 691, 3158, 692, 3158, 687, 770, 771,
+ 3158, 770, 688, 689, 3158, 3158, 3158, 3158, 691, 772,
+
+ 692, 3158, 3158, 2965, 773, 774, 2627, 2627, 2627, 2627,
+ 691, 3158, 692, 2626, 2627, 2627, 2626, 594, 3158, 3158,
+ 3158, 3158, 3158, 3158, 594, 3158, 3158, 3158, 2104, 2966,
+ 2629, 2929, 2111, 2930, 2929, 1669, 3158, 2629, 3158, 3158,
+ 3158, 3158, 2931, 2932, 3158, 3158, 2932, 2930, 2111, 2930,
+ 2930, 2967, 3158, 2933, 2932, 2934, 2984, 3158, 2935, 2932,
+ 3158, 3158, 2932, 2968, 2937, 593, 2938, 2937, 3158, 2933,
+ 2932, 3158, 3158, 3158, 3158, 2939, 2932, 3158, 2932, 2932,
+ 3158, 3158, 2985, 3158, 3158, 3158, 2933, 2932, 2934, 3158,
+ 2938, 593, 2938, 2938, 2932, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 2939, 2932, 686, 3158, 2932, 686, 3158, 3158, 3158,
+ 3158, 2932, 2933, 2932, 687, 3158, 3158, 3158, 3158, 688,
+ 689, 3158, 3158, 3158, 3158, 691, 3158, 3013, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 2932, 2927, 2993,
+ 1662, 2993, 2993, 2927, 2927, 2927, 2994, 2927, 2927, 2927,
+ 2928, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2995, 2927, 2927, 2927, 2927, 2927, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2927, 2927, 2927, 2927, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+
+ 2996, 2996, 2996, 2997, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2927, 2927, 2927, 2998, 2996,
+ 2927, 3158, 3158, 3158, 3158, 3158, 2943, 2944, 3158, 3158,
+ 3158, 2945, 2945, 2927, 2955, 2111, 2111, 2955, 3158, 3158,
+ 3158, 2946, 3158, 3158, 686, 2112, 595, 686, 686, 595,
+ 3158, 686, 3158, 3158, 3158, 687, 597, 595, 2956, 687,
+ 688, 689, 3158, 3158, 688, 689, 691, 3158, 692, 3158,
+ 691, 3158, 692, 686, 3158, 3158, 686, 3158, 3158, 3158,
+ 3158, 595, 3158, 686, 687, 3158, 686, 3158, 3158, 688,
+ 689, 2927, 3158, 2944, 687, 691, 3158, 692, 3158, 688,
+
+ 689, 3158, 3158, 770, 771, 691, 770, 692, 3158, 3158,
+ 3158, 3158, 3014, 3158, 772, 3158, 3158, 3015, 3158, 773,
+ 774, 2627, 2627, 2627, 2627, 691, 3158, 692, 2626, 2627,
+ 2627, 2626, 594, 3158, 3158, 3158, 3158, 3016, 686, 594,
+ 3158, 686, 2963, 2104, 3158, 2629, 3158, 3158, 3158, 687,
+ 1669, 3158, 2629, 3158, 688, 689, 3158, 3017, 3158, 3158,
+ 691, 3158, 692, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3049, 3158, 3158,
+ 3031, 3158, 3032, 2927, 3038, 661, 3038, 3038, 2927, 2927,
+
+ 2927, 3039, 2927, 2927, 2927, 2928, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 2927,
+ 2927, 2927, 2927, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 2927, 2927, 2927, 2927, 3040, 686, 3158, 3158, 686, 686,
+ 3158, 3158, 686, 3158, 3158, 3158, 687, 3158, 3158, 3158,
+ 687, 688, 689, 3158, 3158, 688, 689, 691, 3158, 692,
+
+ 3158, 691, 3158, 692, 770, 771, 3158, 770, 3158, 3158,
+ 3158, 2627, 2627, 2627, 2627, 772, 3158, 3158, 3158, 3158,
+ 773, 774, 594, 3158, 3158, 3158, 691, 3158, 692, 3158,
+ 3158, 3158, 1243, 2104, 3158, 2629, 3029, 593, 2938, 3029,
+ 3158, 3158, 3158, 3158, 2963, 3158, 3158, 3058, 2932, 3158,
+ 3158, 2932, 2626, 2627, 2627, 2626, 3158, 1342, 2933, 2932,
+ 2934, 3158, 686, 594, 3158, 686, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 687, 1669, 3059, 2629, 3158, 688, 689,
+ 3158, 3158, 3158, 2932, 691, 3158, 692, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3082, 3158, 3158, 3158, 3158, 3060,
+ 2927, 3063, 1108, 3063, 3063, 2927, 2927, 2927, 3064, 2927,
+ 2927, 2927, 2928, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2995, 2927, 2927, 2927, 2927, 2927, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 2927, 2927, 2927, 2927,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 2927, 2927, 2927,
+
+ 3066, 3065, 2927, 3068, 1214, 3069, 3068, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2927, 2939, 2932, 2927, 2927, 2932, 2927,
+ 2927, 2927, 3070, 3070, 3070, 2927, 2932, 2934, 2927, 2927,
+ 2927, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070,
+ 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 2927, 2927,
+ 2932, 2927, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070,
+ 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070,
+ 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 2927,
+ 2927, 2927, 2927, 3070, 2927, 3072, 2418, 3072, 3072, 2927,
+ 2927, 2927, 3073, 2927, 2927, 2927, 2928, 2927, 2927, 2927,
+
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2927, 3074, 3074, 3074, 3074, 3074, 3074, 3074,
+ 3074, 3074, 3074, 3074, 3074, 3074, 3074, 3074, 3074, 3074,
+ 2927, 2927, 2927, 2927, 3074, 3074, 3074, 3074, 3074, 3074,
+ 3074, 3074, 3074, 3074, 3074, 3074, 3074, 3074, 3074, 3075,
+ 3074, 3074, 3074, 3074, 3074, 3074, 3074, 3074, 3074, 3074,
+ 3074, 2927, 2927, 2927, 3076, 3074, 2627, 2627, 2627, 2627,
+ 3069, 1214, 3069, 3069, 3158, 686, 3158, 594, 686, 3158,
+ 3158, 2939, 2932, 3158, 3158, 2932, 687, 3158, 2104, 3158,
+ 2629, 688, 689, 2932, 3158, 3158, 3158, 691, 3158, 692,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 2932, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3117, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3089, 2927, 3090, 2627, 3091, 3090, 2927,
+ 2927, 2927, 2927, 2927, 2927, 2927, 3030, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2927, 3092, 3092, 3092, 3002, 2927, 3093,
+ 2927, 2927, 2927, 3092, 3092, 3092, 3092, 3092, 3092, 3092,
+ 3092, 3092, 3092, 3092, 3092, 3092, 3092, 3092, 3092, 3092,
+ 2927, 2927, 2927, 2927, 3092, 3092, 3092, 3092, 3092, 3092,
+ 3092, 3092, 3092, 3092, 3092, 3092, 3092, 3092, 3092, 3092,
+
+ 3092, 3092, 3092, 3092, 3092, 3092, 3092, 3092, 3092, 3092,
+ 3092, 2927, 2927, 2927, 2927, 3092, 2927, 2927, 3158, 2927,
+ 2927, 2927, 2927, 2927, 3095, 2927, 2927, 2927, 2928, 2927,
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2927, 2927, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 2927, 2927, 2927, 2927, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 2927, 2927, 2927, 2927, 3096, 2927, 3097,
+
+ 1631, 3098, 3097, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2928, 2932, 2927, 2927, 2932, 2927, 2927, 2927, 3099, 3099,
+ 3099, 2995, 2932, 2934, 2927, 2927, 2927, 3099, 3099, 3099,
+ 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099,
+ 3099, 3099, 3099, 3099, 2927, 2927, 2932, 2927, 3099, 3099,
+ 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099,
+ 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099,
+ 3099, 3099, 3099, 3099, 3099, 2927, 2927, 2927, 2927, 3099,
+ 2927, 3100, 1094, 3100, 3100, 2927, 2927, 2927, 3101, 2927,
+ 2927, 2927, 2928, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 2927, 2927, 2927, 2927,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 2927, 2927, 2927,
+ 2927, 3102, 2927, 3072, 2418, 3072, 3072, 2927, 2927, 2927,
+ 3104, 2927, 2927, 2927, 2928, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105,
+
+ 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105, 2927, 2927,
+ 2927, 2927, 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105,
+ 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3106, 3105, 3105,
+ 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105, 2927,
+ 2927, 2927, 3076, 3105, 2927, 3109, 2631, 3109, 3109, 2927,
+ 2927, 2927, 3110, 2927, 2927, 2927, 2928, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2927, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 2927, 2927, 2927, 2927, 3111, 3111, 3111, 3111, 3111, 3111,
+
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 2927, 2927, 2927, 2927, 3111, 2927, 3118, 2627, 3091,
+ 3118, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 3030, 2927,
+ 2927, 2927, 2927, 2927, 2927, 2927, 3119, 3119, 3119, 3041,
+ 2927, 3093, 2927, 2927, 2927, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 2927, 2927, 2927, 2927, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+
+ 3119, 3119, 3119, 2927, 2927, 2927, 2927, 3119, 2927, 3034,
+ 3158, 2927, 3034, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2928, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 3121, 3121,
+ 3121, 3035, 2927, 2927, 2927, 2927, 2927, 3121, 3121, 3121,
+ 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121,
+ 3121, 3121, 3121, 3121, 2927, 2927, 2927, 2927, 3121, 3121,
+ 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121,
+ 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121,
+ 3121, 3121, 3121, 3121, 3121, 2927, 2927, 2927, 2927, 3121,
+ 3097, 1631, 3098, 3097, 3158, 3098, 1631, 3098, 3098, 3158,
+
+ 3158, 2928, 2932, 3158, 3158, 2932, 2928, 2932, 3158, 3158,
+ 2932, 3158, 2995, 2932, 2934, 3158, 3158, 2995, 2932, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 2932, 3158, 3158,
+ 3158, 3158, 2932, 2927, 3122, 1635, 3123, 3122, 2927, 2927,
+ 2927, 2927, 2927, 2927, 2927, 2928, 2932, 2927, 2927, 2932,
+ 2927, 2927, 2927, 3124, 3124, 3124, 2927, 2932, 2934, 2927,
+ 2927, 2927, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 2927,
+ 2927, 2932, 2927, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+
+ 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124,
+ 2927, 2927, 2927, 2927, 3124, 2927, 3128, 2776, 3128, 3128,
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2939, 2927, 2927,
+ 2927, 2927, 2927, 2927, 2927, 3129, 3129, 3129, 2927, 2927,
+ 2927, 2927, 2927, 2927, 3129, 3129, 3129, 3129, 3129, 3129,
+ 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129,
+ 3129, 2927, 2927, 2927, 2927, 3129, 3129, 3129, 3129, 3129,
+ 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129,
+ 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129,
+
+ 3129, 3129, 2927, 2927, 2927, 2927, 3129, 686, 3158, 3158,
+ 686, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 687, 3158,
+ 3158, 3158, 3158, 688, 689, 3122, 1635, 3123, 3122, 691,
+ 3158, 692, 3123, 1635, 3123, 3123, 2928, 2932, 3158, 3158,
+ 2932, 3158, 686, 2928, 2932, 686, 3158, 2932, 2932, 2934,
+ 3158, 3158, 3158, 687, 3158, 2932, 3158, 3158, 688, 689,
+ 3158, 3158, 3158, 3158, 691, 3158, 692, 3158, 3158, 3158,
+ 3158, 3158, 2932, 3158, 3158, 3133, 3158, 3158, 3158, 2932,
+ 3157, 593, 593, 3157, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 594, 595, 3158, 3158, 595, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 597, 595, 907, 3158, 3158, 3158, 3158, 3158,
+ 3158, 2963, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 595, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102, 112, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+
+ 112, 112, 112, 112, 112, 112, 112, 112, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 132, 132,
+ 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+ 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+ 132, 132, 132, 132, 132, 132, 132, 132, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 502, 502,
+
+ 3158, 3158, 502, 3158, 502, 502, 502, 502, 502, 502,
+ 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
+ 502, 3158, 502, 502, 502, 502, 502, 502, 506, 506,
+ 3158, 506, 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506, 511, 511,
+ 3158, 3158, 511, 511, 511, 3158, 511, 511, 511, 511,
+ 511, 511, 511, 511, 511, 511, 511, 511, 511, 511,
+ 511, 3158, 511, 511, 511, 511, 511, 511, 519, 519,
+ 3158, 519, 519, 3158, 519, 519, 519, 519, 519, 519,
+
+ 519, 519, 519, 519, 519, 519, 519, 519, 519, 519,
+ 519, 519, 519, 519, 519, 519, 519, 519, 527, 527,
+ 3158, 527, 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 3158, 527, 527, 527, 527, 527, 527, 527,
+ 527, 3158, 527, 527, 527, 527, 527, 527, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 538, 538,
+ 3158, 538, 538, 538, 538, 538, 538, 538, 3158, 538,
+ 538, 538, 3158, 538, 538, 538, 538, 538, 538, 538,
+
+ 538, 538, 538, 538, 538, 538, 538, 538, 548, 548,
+ 3158, 3158, 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548, 559, 559,
+ 3158, 559, 559, 559, 559, 559, 559, 559, 3158, 559,
+ 559, 559, 559, 559, 559, 559, 559, 559, 559, 559,
+ 559, 559, 559, 559, 559, 559, 559, 559, 572, 572,
+ 572, 572, 3158, 572, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 572, 3158, 3158, 3158, 572, 572, 3158,
+ 3158, 3158, 572, 3158, 3158, 572, 572, 575, 575, 3158,
+
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 596, 596, 596,
+ 596, 3158, 3158, 3158, 596, 596, 3158, 596, 3158, 3158,
+ 3158, 596, 596, 596, 596, 3158, 596, 596, 3158, 3158,
+ 596, 596, 3158, 3158, 3158, 596, 663, 663, 663, 663,
+ 3158, 663, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 663, 663, 3158, 3158, 3158,
+ 663, 3158, 3158, 3158, 663, 690, 3158, 3158, 690, 3158,
+ 3158, 3158, 690, 3158, 3158, 3158, 690, 690, 3158, 690,
+
+ 690, 3158, 690, 3158, 690, 690, 3158, 3158, 3158, 690,
+ 3158, 3158, 3158, 690, 755, 755, 755, 755, 3158, 755,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 755,
+ 3158, 3158, 3158, 755, 755, 3158, 3158, 3158, 755, 3158,
+ 3158, 755, 755, 761, 761, 761, 761, 3158, 3158, 3158,
+ 761, 3158, 3158, 3158, 3158, 3158, 3158, 761, 761, 3158,
+ 761, 3158, 761, 761, 3158, 3158, 3158, 761, 3158, 3158,
+ 3158, 761, 766, 766, 766, 766, 3158, 766, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 766, 766, 3158, 3158, 3158, 766, 3158, 3158, 3158,
+
+ 766, 775, 775, 3158, 775, 3158, 3158, 3158, 775, 3158,
+ 3158, 3158, 775, 775, 3158, 775, 775, 3158, 775, 3158,
+ 775, 775, 3158, 3158, 3158, 775, 3158, 3158, 3158, 775,
+ 834, 3158, 3158, 3158, 3158, 834, 834, 3158, 3158, 3158,
+ 834, 3158, 3158, 3158, 834, 841, 841, 3158, 3158, 3158,
+ 841, 841, 3158, 3158, 3158, 841, 3158, 3158, 3158, 841,
+ 850, 3158, 850, 3158, 3158, 3158, 3158, 850, 850, 3158,
+ 3158, 3158, 850, 3158, 3158, 3158, 850, 854, 3158, 3158,
+ 3158, 3158, 854, 854, 3158, 3158, 3158, 854, 3158, 3158,
+ 3158, 854, 862, 3158, 3158, 3158, 3158, 862, 862, 3158,
+
+ 3158, 3158, 862, 3158, 3158, 3158, 862, 868, 868, 3158,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 900, 900, 900,
+ 900, 3158, 900, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 900, 3158, 3158, 3158, 900, 900, 3158, 3158,
+ 3158, 900, 3158, 3158, 900, 900, 905, 905, 905, 905,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 905, 905, 3158, 905, 3158, 905, 905, 3158, 3158, 3158,
+ 905, 3158, 3158, 3158, 905, 926, 926, 926, 926, 3158,
+
+ 926, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 926, 926, 3158, 3158, 3158, 926,
+ 3158, 3158, 3158, 926, 937, 3158, 3158, 3158, 3158, 937,
+ 937, 3158, 3158, 3158, 937, 3158, 3158, 3158, 937, 945,
+ 3158, 3158, 3158, 3158, 945, 945, 3158, 3158, 3158, 945,
+ 3158, 3158, 3158, 945, 963, 3158, 3158, 963, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 963, 963,
+ 3158, 3158, 3158, 963, 963, 3158, 3158, 3158, 963, 3158,
+ 3158, 3158, 963, 966, 3158, 3158, 3158, 3158, 966, 966,
+ 3158, 3158, 3158, 966, 3158, 3158, 3158, 966, 983, 983,
+
+ 3158, 983, 3158, 983, 983, 3158, 983, 983, 983, 983,
+ 983, 983, 983, 983, 983, 983, 983, 983, 983, 983,
+ 983, 983, 983, 983, 983, 983, 983, 983, 986, 3158,
+ 3158, 3158, 3158, 986, 986, 3158, 3158, 3158, 986, 3158,
+ 3158, 3158, 986, 989, 989, 989, 989, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 989, 989, 3158,
+ 3158, 3158, 989, 989, 3158, 3158, 989, 989, 3158, 3158,
+ 3158, 989, 992, 992, 3158, 992, 992, 3158, 3158, 992,
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 992, 3158, 992, 992, 992, 992,
+
+ 992, 992, 997, 997, 3158, 997, 997, 3158, 3158, 997,
+ 997, 997, 997, 997, 997, 997, 997, 997, 997, 997,
+ 997, 997, 997, 997, 997, 3158, 997, 997, 997, 997,
+ 997, 997, 998, 998, 3158, 998, 998, 998, 998, 998,
+ 998, 998, 998, 998, 998, 998, 998, 998, 998, 998,
+ 998, 998, 998, 998, 998, 998, 998, 998, 998, 998,
+ 998, 998, 1005, 3158, 3158, 3158, 3158, 1005, 1005, 3158,
+ 3158, 3158, 1005, 3158, 3158, 3158, 1005, 1026, 1026, 3158,
+ 3158, 3158, 1026, 1026, 3158, 3158, 3158, 1026, 3158, 3158,
+ 3158, 1026, 502, 502, 3158, 3158, 502, 3158, 502, 502,
+
+ 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
+ 502, 502, 502, 502, 502, 3158, 502, 502, 502, 502,
+ 502, 502, 511, 511, 3158, 3158, 511, 511, 511, 3158,
+ 511, 511, 511, 511, 511, 511, 511, 511, 511, 511,
+ 511, 511, 511, 511, 511, 3158, 511, 511, 511, 511,
+ 511, 511, 519, 519, 3158, 519, 519, 3158, 519, 519,
+ 519, 519, 519, 519, 519, 519, 519, 519, 519, 519,
+ 519, 519, 519, 519, 519, 519, 519, 519, 519, 519,
+ 519, 519, 527, 527, 3158, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 3158, 527, 527, 527,
+
+ 527, 527, 527, 527, 527, 3158, 527, 527, 527, 527,
+ 527, 527, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 538, 538, 3158, 538, 538, 538, 538, 538,
+ 538, 538, 3158, 538, 538, 538, 3158, 538, 538, 538,
+ 538, 538, 538, 538, 538, 538, 538, 538, 538, 538,
+ 538, 538, 548, 548, 3158, 3158, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548,
+
+ 548, 548, 559, 559, 3158, 559, 559, 559, 559, 559,
+ 559, 559, 3158, 559, 559, 559, 559, 559, 559, 559,
+ 559, 559, 559, 559, 559, 559, 559, 559, 559, 559,
+ 559, 559, 596, 596, 596, 596, 3158, 3158, 3158, 596,
+ 596, 3158, 596, 3158, 3158, 3158, 596, 596, 596, 596,
+ 3158, 596, 596, 3158, 3158, 596, 596, 3158, 3158, 3158,
+ 596, 1096, 1096, 1096, 1096, 3158, 1096, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 1096, 1096, 3158, 3158, 3158, 1096, 3158, 3158, 3158, 1096,
+ 575, 575, 3158, 575, 575, 575, 575, 575, 575, 575,
+
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 1105, 1105, 1105, 1105, 3158, 1105, 3158, 3158, 1105, 1105,
+ 3158, 3158, 3158, 3158, 3158, 1105, 3158, 3158, 3158, 1105,
+ 1105, 3158, 3158, 3158, 1105, 3158, 3158, 1105, 1105, 1124,
+ 1124, 3158, 1124, 1124, 3158, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 3158, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 3158, 1124, 1124, 1124, 663,
+ 663, 663, 663, 3158, 663, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 663, 663,
+
+ 3158, 3158, 3158, 663, 3158, 3158, 3158, 663, 1215, 1215,
+ 1215, 1215, 3158, 3158, 3158, 1215, 1215, 3158, 1215, 3158,
+ 3158, 3158, 1215, 3158, 1215, 1215, 3158, 1215, 1215, 3158,
+ 3158, 1215, 1215, 3158, 3158, 3158, 1215, 690, 3158, 3158,
+ 690, 3158, 3158, 3158, 690, 3158, 3158, 3158, 690, 690,
+ 3158, 690, 690, 3158, 690, 3158, 690, 690, 3158, 3158,
+ 3158, 690, 3158, 3158, 3158, 690, 1222, 3158, 3158, 1222,
+ 3158, 1222, 3158, 3158, 1222, 1222, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 1222, 1222, 3158, 3158, 3158,
+ 1222, 3158, 3158, 3158, 1222, 1238, 1238, 3158, 1238, 1238,
+
+ 1238, 1238, 1238, 3158, 3158, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 3158, 1238, 1238, 1238, 3158, 1238, 3158,
+ 1238, 3158, 3158, 1238, 1238, 761, 761, 761, 761, 3158,
+ 3158, 3158, 761, 3158, 3158, 3158, 3158, 3158, 3158, 761,
+ 761, 3158, 761, 3158, 761, 761, 3158, 3158, 3158, 761,
+ 3158, 3158, 3158, 761, 1331, 1331, 1331, 1331, 3158, 1331,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 1331, 1331, 3158, 3158, 3158, 1331, 3158,
+ 3158, 3158, 1331, 1334, 1334, 3158, 1334, 1334, 3158, 1334,
+ 1334, 3158, 3158, 1334, 1334, 1334, 1334, 3158, 1334, 1334,
+
+ 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 3158,
+ 3158, 1334, 1334, 766, 766, 766, 766, 3158, 766, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 766, 766, 3158, 3158, 3158, 766, 3158, 3158,
+ 3158, 766, 1338, 1338, 1338, 1338, 3158, 3158, 3158, 1338,
+ 3158, 3158, 3158, 3158, 3158, 3158, 1338, 3158, 3158, 3158,
+ 3158, 1338, 1338, 3158, 3158, 3158, 1338, 3158, 3158, 3158,
+ 1338, 775, 775, 3158, 775, 3158, 3158, 3158, 775, 3158,
+ 3158, 3158, 775, 775, 3158, 775, 775, 3158, 775, 3158,
+ 775, 775, 3158, 3158, 3158, 775, 3158, 3158, 3158, 775,
+
+ 834, 3158, 3158, 3158, 3158, 834, 834, 3158, 3158, 3158,
+ 834, 3158, 3158, 3158, 834, 841, 841, 3158, 3158, 3158,
+ 841, 841, 3158, 3158, 3158, 841, 3158, 3158, 3158, 841,
+ 850, 3158, 850, 3158, 3158, 3158, 3158, 850, 850, 3158,
+ 3158, 3158, 850, 3158, 3158, 3158, 850, 1422, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 1422, 1422, 3158, 3158, 3158, 1422, 3158, 3158, 3158,
+ 1422, 854, 3158, 3158, 3158, 3158, 854, 854, 3158, 3158,
+ 3158, 854, 3158, 3158, 3158, 854, 862, 3158, 3158, 3158,
+ 3158, 862, 862, 3158, 3158, 3158, 862, 3158, 3158, 3158,
+
+ 862, 868, 868, 3158, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 905, 905, 905, 905, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 905, 905, 3158, 905, 3158,
+ 905, 905, 3158, 3158, 3158, 905, 3158, 3158, 3158, 905,
+ 926, 926, 926, 926, 3158, 926, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 926,
+ 926, 3158, 3158, 3158, 926, 3158, 3158, 3158, 926, 1125,
+ 1125, 3158, 1125, 1125, 3158, 1125, 1125, 1125, 1125, 1125,
+
+ 1125, 3158, 3158, 3158, 1125, 1125, 1125, 1125, 1125, 1125,
+ 1125, 1125, 1125, 1125, 1125, 3158, 1125, 1125, 1125, 1487,
+ 3158, 3158, 1487, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 1487, 3158, 3158, 1487, 3158, 1487, 1487,
+ 3158, 3158, 3158, 1487, 3158, 3158, 3158, 1487, 937, 3158,
+ 3158, 3158, 3158, 937, 937, 3158, 3158, 3158, 937, 3158,
+ 3158, 3158, 937, 945, 3158, 3158, 3158, 3158, 945, 945,
+ 3158, 3158, 3158, 945, 3158, 3158, 3158, 945, 963, 3158,
+ 3158, 963, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 963, 963, 3158, 3158, 3158, 963, 963, 3158,
+
+ 3158, 3158, 963, 3158, 3158, 3158, 963, 966, 3158, 3158,
+ 3158, 3158, 966, 966, 3158, 3158, 3158, 966, 3158, 3158,
+ 3158, 966, 986, 3158, 3158, 3158, 3158, 986, 986, 3158,
+ 3158, 3158, 986, 3158, 3158, 3158, 986, 1523, 1523, 3158,
+ 1523, 3158, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
+ 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
+ 3158, 1523, 1523, 1523, 1523, 1523, 1523, 1525, 1525, 3158,
+ 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525,
+ 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525,
+ 1525, 1525, 1525, 1525, 1525, 1525, 1525, 989, 989, 989,
+
+ 989, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 989, 989, 3158, 3158, 3158, 989, 989, 3158, 3158,
+ 989, 989, 3158, 3158, 3158, 989, 992, 992, 3158, 992,
+ 992, 3158, 3158, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 3158,
+ 992, 992, 992, 992, 992, 992, 1527, 3158, 3158, 3158,
+ 3158, 1527, 1527, 3158, 3158, 3158, 1527, 3158, 3158, 3158,
+ 1527, 997, 997, 3158, 997, 997, 3158, 3158, 997, 997,
+ 997, 997, 997, 997, 997, 997, 997, 997, 997, 997,
+ 997, 997, 997, 997, 3158, 997, 997, 997, 997, 997,
+
+ 997, 1005, 3158, 3158, 3158, 3158, 1005, 1005, 3158, 3158,
+ 3158, 1005, 3158, 3158, 3158, 1005, 1026, 1026, 3158, 3158,
+ 3158, 1026, 1026, 3158, 3158, 3158, 1026, 3158, 3158, 3158,
+ 1026, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561,
+ 1561, 1561, 1561, 1561, 1561, 3158, 1561, 1561, 1561, 1561,
+ 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561,
+ 1561, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+ 1564, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568,
+
+ 1568, 1568, 1568, 1568, 1568, 3158, 1568, 1568, 1568, 1568,
+ 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568,
+ 1568, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+ 1570, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573,
+ 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573,
+ 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573,
+ 1573, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576,
+ 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576,
+
+ 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576,
+ 1576, 502, 502, 3158, 3158, 502, 3158, 502, 502, 502,
+ 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
+ 502, 502, 502, 502, 3158, 502, 502, 502, 502, 502,
+ 502, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
+ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
+ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
+ 1579, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
+ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
+ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
+
+ 1581, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583,
+ 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583,
+ 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583,
+ 1583, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 511, 511, 3158, 3158, 511, 511, 511, 3158, 511,
+ 511, 511, 511, 511, 511, 511, 511, 511, 511, 511,
+ 511, 511, 511, 511, 3158, 511, 511, 511, 511, 511,
+ 511, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589,
+
+ 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589,
+ 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589,
+ 1589, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 519, 519, 3158, 519, 519, 3158, 519, 519, 519,
+ 519, 519, 519, 519, 519, 519, 519, 519, 519, 519,
+ 519, 519, 519, 519, 519, 519, 519, 519, 519, 519,
+ 519, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599,
+ 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599,
+ 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599,
+ 1599, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
+ 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
+ 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
+
+ 1601, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609,
+ 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609,
+ 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609,
+ 1609, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 548, 548, 3158, 3158, 548, 548, 548, 548, 548,
+
+ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617,
+ 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617,
+ 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617,
+ 1617, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
+ 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
+ 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
+ 1620, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626,
+ 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626,
+
+ 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626,
+ 1626, 559, 559, 3158, 559, 559, 559, 559, 559, 559,
+ 559, 3158, 559, 559, 559, 559, 559, 559, 559, 559,
+ 559, 559, 559, 559, 559, 559, 559, 559, 559, 559,
+ 559, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1632, 1632, 1632, 1632, 3158, 3158, 3158, 3158, 1632,
+ 3158, 1632, 3158, 3158, 3158, 1632, 1632, 1632, 1632, 3158,
+ 1632, 1632, 3158, 3158, 1632, 1632, 3158, 3158, 3158, 1632,
+
+ 596, 596, 596, 596, 3158, 3158, 3158, 596, 596, 3158,
+ 596, 3158, 3158, 3158, 596, 596, 596, 596, 3158, 596,
+ 596, 3158, 3158, 596, 596, 3158, 3158, 3158, 596, 1096,
+ 1096, 1096, 1096, 3158, 1096, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 1096, 1096,
+ 3158, 3158, 3158, 1096, 3158, 3158, 3158, 1096, 1636, 1636,
+ 1636, 1636, 3158, 3158, 3158, 3158, 1636, 3158, 1636, 3158,
+ 3158, 3158, 1636, 3158, 1636, 1636, 3158, 1636, 1636, 3158,
+ 3158, 1636, 1636, 3158, 3158, 3158, 1636, 1105, 1105, 1105,
+ 1105, 3158, 1105, 3158, 3158, 1105, 1105, 3158, 3158, 3158,
+
+ 3158, 3158, 1105, 3158, 3158, 3158, 1105, 1105, 3158, 3158,
+ 3158, 1105, 3158, 3158, 1105, 1105, 1643, 1643, 1643, 1643,
+ 3158, 1643, 3158, 3158, 1643, 3158, 3158, 3158, 3158, 3158,
+ 1643, 1643, 3158, 3158, 3158, 1643, 1643, 3158, 3158, 3158,
+ 1643, 3158, 3158, 1643, 1643, 1646, 1646, 1646, 1646, 3158,
+ 1646, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 1646, 1646, 3158, 3158, 3158, 1646,
+ 3158, 3158, 3158, 1646, 1092, 1092, 1092, 1092, 3158, 1092,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 1092,
+ 3158, 3158, 3158, 1092, 1092, 3158, 3158, 3158, 1092, 3158,
+
+ 3158, 1092, 1092, 572, 572, 572, 572, 3158, 572, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 572, 3158,
+ 3158, 3158, 572, 572, 3158, 3158, 3158, 572, 3158, 3158,
+ 572, 572, 1124, 1124, 3158, 1124, 1124, 3158, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 3158, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 3158, 1124,
+ 1124, 1124, 1125, 1125, 3158, 1125, 1125, 3158, 1125, 1125,
+ 1125, 1125, 1125, 1125, 3158, 3158, 3158, 1125, 1125, 1125,
+ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 3158, 1125,
+ 1125, 1125, 1126, 1126, 3158, 1126, 1126, 3158, 1126, 1126,
+
+ 3158, 3158, 1126, 1126, 1126, 1126, 3158, 1126, 1126, 1126,
+ 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 3158, 3158,
+ 1126, 1126, 1215, 1215, 1215, 1215, 3158, 3158, 3158, 1215,
+ 1215, 3158, 1215, 3158, 3158, 3158, 1215, 3158, 1215, 1215,
+ 3158, 1215, 1215, 3158, 3158, 1215, 1215, 3158, 3158, 3158,
+ 1215, 690, 3158, 3158, 690, 3158, 3158, 3158, 690, 3158,
+ 3158, 3158, 690, 690, 3158, 690, 690, 3158, 690, 3158,
+ 690, 690, 3158, 3158, 3158, 690, 3158, 3158, 3158, 690,
+ 1222, 3158, 3158, 1222, 3158, 1222, 3158, 3158, 1222, 1222,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 1222,
+
+ 1222, 3158, 3158, 3158, 1222, 3158, 3158, 3158, 1222, 1759,
+ 3158, 3158, 1759, 3158, 1759, 3158, 3158, 1759, 3158, 3158,
+ 3158, 3158, 3158, 1759, 3158, 3158, 3158, 3158, 1759, 1759,
+ 3158, 3158, 3158, 1759, 3158, 3158, 3158, 1759, 1777, 3158,
+ 3158, 1777, 3158, 1777, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 1777, 1777, 3158,
+ 3158, 3158, 1777, 3158, 3158, 3158, 1777, 1238, 1238, 3158,
+ 1238, 1238, 1238, 1238, 1238, 3158, 3158, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 3158, 1238, 1238, 1238, 3158,
+ 1238, 3158, 1238, 3158, 3158, 1238, 1238, 1849, 1849, 1849,
+
+ 1849, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 1849, 1849, 3158, 3158, 3158, 1849, 1849, 3158, 3158,
+ 3158, 1849, 3158, 3158, 3158, 1849, 1331, 1331, 1331, 1331,
+ 3158, 1331, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 1331, 1331, 3158, 3158, 3158,
+ 1331, 3158, 3158, 3158, 1331, 1851, 3158, 3158, 1851, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 1851,
+ 3158, 3158, 3158, 3158, 1851, 1851, 3158, 3158, 3158, 1851,
+ 3158, 3158, 3158, 1851, 1328, 1328, 1328, 1328, 3158, 1328,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 1328,
+
+ 3158, 3158, 3158, 1328, 1328, 3158, 3158, 3158, 1328, 3158,
+ 3158, 1328, 1328, 755, 755, 755, 755, 3158, 755, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 755, 3158,
+ 3158, 3158, 755, 755, 3158, 3158, 3158, 755, 3158, 3158,
+ 755, 755, 1334, 1334, 3158, 1334, 1334, 3158, 1334, 1334,
+ 3158, 3158, 1334, 1334, 1334, 1334, 3158, 1334, 1334, 1334,
+ 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 3158, 3158,
+ 1334, 1334, 1338, 1338, 1338, 1338, 3158, 3158, 3158, 1338,
+ 3158, 3158, 3158, 3158, 3158, 3158, 1338, 3158, 3158, 3158,
+ 3158, 1338, 1338, 3158, 3158, 3158, 1338, 3158, 3158, 3158,
+
+ 1338, 775, 775, 3158, 775, 3158, 3158, 3158, 775, 3158,
+ 3158, 3158, 775, 775, 3158, 775, 775, 3158, 775, 3158,
+ 775, 775, 3158, 3158, 3158, 775, 3158, 3158, 3158, 775,
+ 1923, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 1923, 1923, 3158, 3158, 3158, 1923,
+ 3158, 3158, 3158, 1923, 841, 841, 3158, 3158, 3158, 841,
+ 841, 3158, 3158, 3158, 841, 3158, 3158, 3158, 841, 1925,
+ 3158, 1925, 3158, 3158, 3158, 3158, 1925, 1925, 3158, 3158,
+ 3158, 1925, 3158, 3158, 3158, 1925, 854, 3158, 3158, 3158,
+ 3158, 854, 854, 3158, 3158, 3158, 854, 3158, 3158, 3158,
+
+ 854, 862, 3158, 3158, 3158, 3158, 862, 862, 3158, 3158,
+ 3158, 862, 3158, 3158, 3158, 862, 1938, 1938, 1938, 1938,
+ 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938,
+ 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938,
+ 1938, 1938, 1938, 1938, 1938, 1938, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 868, 868, 3158, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+
+ 868, 868, 868, 868, 868, 868, 1946, 1946, 1946, 1946,
+ 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946,
+ 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946,
+ 1946, 1946, 1946, 1946, 1946, 1946, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1966, 1966, 1966, 1966,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 1966, 1966, 3158, 1966, 3158, 1966, 1966, 3158, 3158, 3158,
+ 1966, 3158, 3158, 3158, 1966, 1462, 1462, 1462, 1462, 3158,
+
+ 1462, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 1462, 3158, 3158, 3158, 1462, 1462, 3158, 3158, 3158, 1462,
+ 3158, 3158, 1462, 1462, 1968, 1968, 1968, 1968, 3158, 1968,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 1968,
+ 3158, 3158, 3158, 1968, 1968, 3158, 3158, 3158, 1968, 3158,
+ 3158, 1968, 1968, 905, 905, 905, 905, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 905, 905, 3158,
+ 905, 3158, 905, 905, 3158, 3158, 3158, 905, 3158, 3158,
+ 3158, 905, 1125, 1125, 3158, 1125, 1125, 3158, 1125, 1125,
+ 1125, 1125, 1125, 1125, 3158, 3158, 3158, 1125, 1125, 1125,
+
+ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 3158, 1125,
+ 1125, 1125, 1487, 3158, 3158, 1487, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 1487, 3158, 3158, 1487,
+ 3158, 1487, 1487, 3158, 3158, 3158, 1487, 3158, 3158, 3158,
+ 1487, 937, 3158, 3158, 3158, 3158, 937, 937, 3158, 3158,
+ 3158, 937, 3158, 3158, 3158, 937, 945, 3158, 3158, 3158,
+ 3158, 945, 945, 3158, 3158, 3158, 945, 3158, 3158, 3158,
+ 945, 966, 3158, 3158, 3158, 3158, 966, 966, 3158, 3158,
+ 3158, 966, 3158, 3158, 3158, 966, 2011, 2011, 3158, 2011,
+ 3158, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011,
+
+ 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 3158,
+ 2011, 2011, 2011, 2011, 2011, 2011, 1527, 3158, 3158, 3158,
+ 3158, 1527, 1527, 3158, 3158, 3158, 1527, 3158, 3158, 3158,
+ 1527, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014,
+ 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014,
+ 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014,
+ 2014, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 992, 992, 3158, 992, 992, 3158, 3158, 992, 992,
+
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 3158, 992, 992, 992, 992, 992,
+ 992, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
+ 2020, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 1005, 3158, 3158, 3158, 3158, 1005, 1005, 3158, 3158,
+ 3158, 1005, 3158, 3158, 3158, 1005, 2039, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 2039, 2039, 3158, 3158, 3158, 2039, 3158, 3158, 3158, 2039,
+ 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040,
+ 3158, 2040, 2040, 2040, 3158, 2040, 2040, 2040, 2040, 2040,
+ 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+ 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045,
+ 3158, 2045, 2045, 2045, 3158, 2045, 2045, 2045, 2045, 2045,
+ 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 502, 502, 3158, 3158, 502, 3158, 502, 502, 502, 502,
+ 502, 502, 502, 502, 502, 502, 502, 502, 502, 502,
+ 502, 502, 502, 3158, 502, 502, 502, 502, 502, 502,
+ 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576,
+ 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576,
+ 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576,
+ 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050,
+
+ 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050,
+ 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050,
+ 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051,
+ 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051,
+ 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051,
+ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
+ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
+ 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
+ 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
+ 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
+
+ 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
+ 511, 511, 3158, 3158, 511, 511, 511, 3158, 511, 511,
+ 511, 511, 511, 511, 511, 511, 511, 511, 511, 511,
+ 511, 511, 511, 3158, 511, 511, 511, 511, 511, 511,
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053,
+ 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053,
+ 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053,
+
+ 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054,
+ 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054,
+ 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055,
+ 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055,
+ 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055,
+ 519, 519, 3158, 519, 519, 3158, 519, 519, 519, 519,
+
+ 519, 519, 519, 519, 519, 519, 519, 519, 519, 519,
+ 519, 519, 519, 519, 519, 519, 519, 519, 519, 519,
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
+ 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
+ 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
+ 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057,
+ 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057,
+
+ 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057,
+ 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
+ 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
+ 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
+ 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062,
+ 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062,
+ 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062,
+ 548, 548, 3158, 3158, 548, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
+ 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
+ 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
+ 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
+ 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069,
+ 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069,
+ 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069,
+ 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
+ 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
+
+ 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
+ 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
+ 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
+ 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
+ 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626,
+ 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626,
+ 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626,
+ 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077,
+ 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077,
+ 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077,
+
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078,
+ 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078,
+ 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078,
+ 1632, 1632, 1632, 1632, 3158, 3158, 3158, 3158, 1632, 3158,
+ 1632, 3158, 3158, 3158, 1632, 1632, 1632, 1632, 3158, 1632,
+ 1632, 3158, 3158, 1632, 1632, 3158, 3158, 3158, 1632, 596,
+ 596, 596, 596, 3158, 3158, 3158, 596, 596, 3158, 596,
+
+ 3158, 3158, 3158, 596, 596, 596, 596, 3158, 596, 596,
+ 3158, 3158, 596, 596, 3158, 3158, 3158, 596, 1636, 1636,
+ 1636, 1636, 3158, 3158, 3158, 3158, 1636, 3158, 1636, 3158,
+ 3158, 3158, 1636, 3158, 1636, 1636, 3158, 1636, 1636, 3158,
+ 3158, 1636, 1636, 3158, 3158, 3158, 1636, 1643, 1643, 1643,
+ 1643, 3158, 1643, 3158, 3158, 1643, 3158, 3158, 3158, 3158,
+ 3158, 1643, 1643, 3158, 3158, 3158, 1643, 1643, 3158, 3158,
+ 3158, 1643, 3158, 3158, 1643, 1643, 1646, 1646, 1646, 1646,
+ 3158, 1646, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 1646, 1646, 3158, 3158, 3158,
+
+ 1646, 3158, 3158, 3158, 1646, 2082, 2082, 2082, 2082, 3158,
+ 2082, 3158, 3158, 2082, 3158, 3158, 3158, 3158, 3158, 2082,
+ 2082, 3158, 3158, 3158, 2082, 2082, 3158, 3158, 3158, 2082,
+ 3158, 3158, 2082, 2082, 1674, 1674, 1674, 1674, 1674, 1674,
+ 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 3158,
+ 1674, 1674, 1674, 1674, 3158, 3158, 1674, 1674, 1674, 3158,
+ 1674, 1674, 1674, 1674, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 3158,
+ 1143, 1143, 1143, 1143, 3158, 3158, 1143, 1143, 1143, 3158,
+ 1143, 1143, 1143, 1143, 572, 572, 572, 572, 3158, 572,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 572,
+ 3158, 3158, 3158, 572, 572, 3158, 3158, 3158, 572, 3158,
+ 3158, 572, 572, 663, 663, 663, 663, 3158, 663, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 663, 663, 3158, 3158, 3158, 663, 3158, 3158,
+ 3158, 663, 1124, 1124, 3158, 1124, 1124, 3158, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 3158, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 3158, 1124,
+ 1124, 1124, 690, 3158, 3158, 690, 3158, 3158, 3158, 690,
+ 3158, 3158, 3158, 690, 690, 3158, 690, 690, 3158, 690,
+
+ 3158, 690, 690, 3158, 3158, 3158, 690, 3158, 3158, 3158,
+ 690, 1759, 3158, 3158, 1759, 3158, 1759, 3158, 3158, 1759,
+ 3158, 3158, 3158, 3158, 3158, 1759, 3158, 3158, 3158, 3158,
+ 1759, 1759, 3158, 3158, 3158, 1759, 3158, 3158, 3158, 1759,
+ 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781,
+ 1781, 1781, 1781, 1781, 1781, 3158, 1781, 1781, 1781, 1781,
+ 3158, 3158, 1781, 1781, 1781, 3158, 1781, 1781, 1781, 1781,
+ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254,
+ 1254, 1254, 1254, 1254, 1254, 3158, 1254, 1254, 1254, 1254,
+ 3158, 3158, 1254, 1254, 1254, 3158, 1254, 1254, 1254, 1254,
+
+ 1777, 3158, 3158, 1777, 3158, 1777, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 1777,
+ 1777, 3158, 3158, 3158, 1777, 3158, 3158, 3158, 1777, 2191,
+ 3158, 3158, 2191, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 2191, 2191, 3158, 2191, 3158, 2191, 2191,
+ 3158, 3158, 3158, 2191, 3158, 3158, 3158, 2191, 1238, 1238,
+ 3158, 1238, 1238, 1238, 1238, 1238, 3158, 3158, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 3158, 1238, 1238, 1238,
+ 3158, 1238, 3158, 1238, 3158, 3158, 1238, 1238, 1849, 1849,
+ 1849, 1849, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 1849, 1849, 3158, 3158, 3158, 1849, 1849, 3158,
+ 3158, 3158, 1849, 3158, 3158, 3158, 1849, 1851, 3158, 3158,
+ 1851, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 1851, 3158, 3158, 3158, 3158, 1851, 1851, 3158, 3158,
+ 3158, 1851, 3158, 3158, 3158, 1851, 755, 755, 755, 755,
+ 3158, 755, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 755, 3158, 3158, 3158, 755, 755, 3158, 3158, 3158,
+ 755, 3158, 3158, 755, 755, 766, 766, 766, 766, 3158,
+ 766, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 766, 766, 3158, 3158, 3158, 766,
+
+ 3158, 3158, 3158, 766, 775, 775, 3158, 775, 3158, 3158,
+ 3158, 775, 3158, 3158, 3158, 775, 775, 3158, 775, 775,
+ 3158, 775, 3158, 775, 775, 3158, 3158, 3158, 775, 3158,
+ 3158, 3158, 775, 2297, 2297, 3158, 3158, 3158, 2297, 2297,
+ 3158, 3158, 3158, 2297, 3158, 3158, 3158, 2297, 841, 841,
+ 3158, 3158, 3158, 841, 841, 3158, 3158, 3158, 841, 3158,
+ 3158, 3158, 841, 1925, 3158, 1925, 3158, 3158, 3158, 3158,
+ 1925, 1925, 3158, 3158, 3158, 1925, 3158, 3158, 3158, 1925,
+ 854, 3158, 3158, 3158, 3158, 854, 854, 3158, 3158, 3158,
+ 854, 3158, 3158, 3158, 854, 862, 3158, 3158, 3158, 3158,
+
+ 862, 862, 3158, 3158, 3158, 862, 3158, 3158, 3158, 862,
+ 868, 868, 3158, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+
+ 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310,
+ 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310,
+ 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310, 2310,
+ 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312,
+ 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312,
+ 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 1966, 1966, 1966, 1966, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 1966, 1966, 3158, 1966, 3158, 1966,
+ 1966, 3158, 3158, 3158, 1966, 3158, 3158, 3158, 1966, 2328,
+ 2328, 2328, 2328, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 2328, 2328, 3158, 2328, 3158, 2328, 2328,
+
+ 3158, 3158, 3158, 2328, 3158, 3158, 3158, 2328, 905, 905,
+ 905, 905, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 905, 905, 3158, 905, 3158, 905, 905, 3158,
+ 3158, 3158, 905, 3158, 3158, 3158, 905, 937, 3158, 3158,
+ 3158, 3158, 937, 937, 3158, 3158, 3158, 937, 3158, 3158,
+ 3158, 937, 945, 3158, 3158, 945, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 945, 3158, 3158, 3158,
+ 3158, 945, 945, 3158, 3158, 3158, 945, 3158, 3158, 3158,
+ 945, 966, 3158, 3158, 3158, 3158, 966, 966, 3158, 3158,
+ 3158, 966, 3158, 3158, 3158, 966, 2364, 2364, 3158, 2364,
+
+ 3158, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 3158,
+ 2364, 2364, 2364, 2364, 2364, 2364, 992, 992, 3158, 992,
+ 992, 3158, 3158, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 3158,
+ 992, 992, 992, 992, 992, 992, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2367, 2367, 2367, 2367, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+
+ 2368, 2368, 2368, 2368, 2368, 2368, 1005, 3158, 3158, 3158,
+ 3158, 1005, 1005, 3158, 3158, 3158, 1005, 3158, 3158, 3158,
+ 1005, 2381, 2381, 3158, 3158, 3158, 2381, 2381, 3158, 3158,
+ 3158, 2381, 3158, 3158, 3158, 2381, 2042, 2042, 2042, 2042,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2384, 2384, 2384, 2384,
+ 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384,
+ 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384,
+ 2384, 2384, 2384, 2384, 2384, 2384, 2046, 2046, 2046, 2046,
+
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 502, 502, 3158, 3158,
+ 502, 3158, 502, 502, 502, 502, 502, 502, 502, 502,
+ 502, 502, 502, 502, 502, 502, 502, 502, 502, 3158,
+ 502, 502, 502, 502, 502, 502, 2051, 2051, 2051, 2051,
+ 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051,
+
+ 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051,
+ 2051, 2051, 2051, 2051, 2051, 2051, 2052, 2052, 2052, 2052,
+ 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
+ 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
+ 2052, 2052, 2052, 2052, 2052, 2052, 511, 511, 3158, 3158,
+ 511, 511, 511, 3158, 511, 511, 511, 511, 511, 511,
+ 511, 511, 511, 511, 511, 511, 511, 511, 511, 3158,
+ 511, 511, 511, 511, 511, 511, 2054, 2054, 2054, 2054,
+ 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054,
+ 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054,
+
+ 2054, 2054, 2054, 2054, 2054, 2054, 2055, 2055, 2055, 2055,
+ 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055,
+ 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055,
+ 2055, 2055, 2055, 2055, 2055, 2055, 519, 519, 3158, 519,
+ 519, 3158, 519, 519, 519, 519, 519, 519, 519, 519,
+ 519, 519, 519, 519, 519, 519, 519, 519, 519, 519,
+ 519, 519, 519, 519, 519, 519, 2057, 2057, 2057, 2057,
+ 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057,
+ 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057,
+ 2057, 2057, 2057, 2057, 2057, 2057, 2058, 2058, 2058, 2058,
+
+ 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2058, 2058, 2058, 2058, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 2062, 2062, 2062, 2062,
+ 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062,
+ 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062,
+ 2062, 2062, 2062, 2062, 2062, 2062, 2386, 2386, 2386, 2386,
+ 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
+
+ 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
+ 2386, 2386, 2386, 2386, 2386, 2386, 1564, 1564, 1564, 1564,
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
+ 1564, 1564, 1564, 1564, 1564, 1564, 548, 548, 3158, 3158,
+ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 548, 548, 548, 548,
+ 548, 548, 548, 548, 548, 548, 2069, 2069, 2069, 2069,
+ 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069,
+ 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069,
+
+ 2069, 2069, 2069, 2069, 2069, 2069, 1570, 1570, 1570, 1570,
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+ 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570,
+ 1570, 1570, 1570, 1570, 1570, 1570, 2073, 2073, 2073, 2073,
+ 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
+ 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
+ 2073, 2073, 2073, 2073, 2073, 2073, 2077, 2077, 2077, 2077,
+ 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077,
+ 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077,
+ 2077, 2077, 2077, 2077, 2077, 2077, 2078, 2078, 2078, 2078,
+
+ 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078,
+ 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078,
+ 2078, 2078, 2078, 2078, 2078, 2078, 596, 596, 596, 596,
+ 3158, 3158, 3158, 596, 596, 3158, 596, 596, 596, 3158,
+ 596, 596, 596, 596, 3158, 596, 596, 3158, 3158, 596,
+ 596, 3158, 3158, 3158, 596, 1105, 1105, 1105, 1105, 3158,
+ 1105, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 1105, 3158, 3158, 3158, 1105, 1105, 3158, 3158, 3158, 1105,
+ 3158, 3158, 1105, 1105, 2082, 2082, 2082, 2082, 3158, 2082,
+ 3158, 3158, 2082, 3158, 3158, 3158, 3158, 3158, 2082, 2082,
+
+ 3158, 3158, 3158, 2082, 2082, 3158, 3158, 3158, 2082, 3158,
+ 3158, 2082, 2082, 1643, 1643, 1643, 1643, 3158, 1643, 3158,
+ 3158, 1643, 3158, 3158, 3158, 3158, 3158, 1643, 1643, 3158,
+ 3158, 3158, 1643, 1643, 3158, 3158, 3158, 1643, 3158, 3158,
+ 1643, 1643, 2420, 2420, 2420, 2420, 3158, 2420, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 2420, 2420, 3158, 3158, 3158, 2420, 3158, 3158, 2420,
+ 2420, 690, 3158, 3158, 690, 3158, 3158, 3158, 690, 3158,
+ 3158, 3158, 690, 690, 3158, 690, 690, 3158, 690, 3158,
+ 690, 690, 3158, 3158, 3158, 690, 3158, 3158, 3158, 690,
+
+ 2191, 3158, 3158, 2191, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 2191, 2191, 3158, 2191, 3158, 2191,
+ 2191, 3158, 3158, 3158, 2191, 3158, 3158, 3158, 2191, 2523,
+ 2523, 2523, 2523, 3158, 2523, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 2523, 2523,
+ 3158, 3158, 3158, 2523, 3158, 3158, 2523, 2523, 775, 775,
+ 3158, 775, 3158, 3158, 3158, 775, 3158, 3158, 3158, 775,
+ 775, 3158, 775, 775, 3158, 775, 3158, 775, 775, 3158,
+ 3158, 3158, 775, 3158, 3158, 3158, 775, 2297, 2297, 3158,
+ 3158, 3158, 2297, 2297, 3158, 3158, 3158, 2297, 3158, 3158,
+
+ 3158, 2297, 841, 841, 3158, 3158, 3158, 841, 841, 3158,
+ 3158, 3158, 841, 3158, 3158, 3158, 841, 854, 3158, 3158,
+ 3158, 3158, 854, 854, 3158, 3158, 3158, 854, 3158, 3158,
+ 3158, 854, 862, 3158, 3158, 3158, 3158, 862, 862, 3158,
+ 3158, 3158, 862, 3158, 3158, 3158, 862, 868, 868, 3158,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 2312, 2312, 2312,
+ 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312,
+ 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312,
+
+ 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2046, 2046, 2046,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2328, 2328, 2328,
+
+ 2328, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 2328, 2328, 3158, 2328, 3158, 2328, 2328, 3158, 3158,
+ 3158, 2328, 3158, 3158, 3158, 2328, 2573, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 2573, 2573, 3158, 3158, 3158, 2573, 3158, 3158, 3158, 2573,
+ 905, 905, 905, 905, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 905, 905, 3158, 905, 3158, 905,
+ 905, 3158, 3158, 3158, 905, 3158, 3158, 3158, 905, 937,
+ 937, 937, 937, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 937, 3158, 937, 3158, 937, 937, 937,
+
+ 3158, 3158, 3158, 937, 937, 3158, 3158, 937, 945, 3158,
+ 3158, 3158, 3158, 945, 945, 3158, 3158, 3158, 945, 3158,
+ 3158, 3158, 945, 966, 3158, 3158, 3158, 3158, 966, 966,
+ 3158, 3158, 3158, 966, 3158, 3158, 3158, 966, 992, 992,
+ 3158, 992, 992, 3158, 3158, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ 992, 3158, 992, 992, 992, 992, 992, 992, 2367, 2367,
+ 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2368, 2368,
+
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368, 1005, 3158,
+ 3158, 3158, 3158, 1005, 1005, 3158, 3158, 3158, 1005, 3158,
+ 3158, 3158, 1005, 2381, 2381, 3158, 3158, 3158, 2381, 2381,
+ 3158, 3158, 3158, 2381, 3158, 3158, 3158, 2381, 2384, 2384,
+ 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384,
+ 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384,
+ 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2386, 2386,
+ 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
+
+ 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
+ 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608, 3158, 2608,
+ 2608, 2608, 3158, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608, 1674, 1674,
+ 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674,
+ 1674, 1674, 1674, 3158, 1674, 1674, 1674, 1674, 3158, 3158,
+ 1674, 1674, 1674, 3158, 1674, 1674, 1674, 1674, 596, 596,
+ 596, 596, 3158, 3158, 3158, 596, 596, 3158, 596, 3158,
+ 3158, 3158, 596, 596, 596, 596, 3158, 596, 596, 3158,
+
+ 3158, 596, 596, 3158, 3158, 3158, 596, 2624, 2624, 2624,
+ 2624, 3158, 2624, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 2624, 2624, 3158, 3158,
+ 3158, 2624, 3158, 3158, 2624, 2624, 2628, 2628, 2628, 2628,
+ 3158, 3158, 3158, 2628, 3158, 3158, 3158, 3158, 3158, 3158,
+ 2628, 2628, 3158, 2628, 3158, 2628, 2628, 3158, 3158, 3158,
+ 2628, 3158, 3158, 3158, 2628, 2633, 2633, 2633, 2633, 3158,
+ 2633, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 2633, 2633, 3158, 3158, 3158, 2633,
+ 3158, 3158, 3158, 2633, 690, 3158, 3158, 690, 3158, 3158,
+
+ 3158, 690, 3158, 3158, 3158, 690, 690, 3158, 690, 690,
+ 3158, 690, 3158, 690, 690, 3158, 3158, 3158, 690, 3158,
+ 3158, 3158, 690, 2523, 2523, 2523, 2523, 3158, 2523, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 2523, 2523, 3158, 3158, 3158, 2523, 3158, 3158,
+ 2523, 2523, 2703, 2703, 2703, 2703, 3158, 3158, 3158, 2703,
+ 3158, 3158, 3158, 3158, 3158, 3158, 2703, 2703, 3158, 2703,
+ 3158, 2703, 2703, 3158, 3158, 3158, 2703, 3158, 3158, 3158,
+ 2703, 2706, 2706, 2706, 2706, 3158, 2706, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 2706, 2706, 3158, 3158, 3158, 2706, 3158, 3158, 3158, 2706,
+ 775, 775, 3158, 775, 3158, 3158, 3158, 775, 3158, 3158,
+ 3158, 775, 775, 3158, 775, 775, 3158, 775, 3158, 775,
+ 775, 3158, 3158, 3158, 775, 3158, 3158, 3158, 775, 841,
+ 841, 3158, 3158, 3158, 841, 841, 3158, 3158, 3158, 841,
+ 3158, 3158, 3158, 841, 854, 3158, 3158, 3158, 3158, 854,
+ 854, 3158, 3158, 3158, 854, 3158, 3158, 3158, 854, 862,
+ 3158, 3158, 3158, 3158, 862, 862, 3158, 3158, 3158, 862,
+ 3158, 3158, 3158, 862, 2737, 3158, 3158, 2737, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 2737, 2737,
+
+ 3158, 3158, 3158, 2737, 2737, 3158, 3158, 3158, 2737, 3158,
+ 3158, 3158, 2737, 905, 905, 905, 905, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 905, 905, 3158,
+ 905, 3158, 905, 905, 3158, 3158, 3158, 905, 3158, 3158,
+ 3158, 905, 937, 3158, 3158, 3158, 3158, 937, 937, 3158,
+ 3158, 3158, 937, 3158, 3158, 3158, 937, 945, 3158, 3158,
+ 3158, 3158, 945, 945, 3158, 3158, 3158, 945, 3158, 3158,
+ 3158, 945, 966, 3158, 3158, 3158, 3158, 966, 966, 3158,
+ 3158, 3158, 966, 3158, 3158, 3158, 966, 1005, 3158, 3158,
+ 3158, 3158, 1005, 1005, 3158, 3158, 3158, 1005, 3158, 3158,
+
+ 3158, 1005, 2773, 2773, 2773, 2773, 3158, 3158, 3158, 2773,
+ 3158, 3158, 3158, 3158, 3158, 3158, 2773, 2773, 3158, 2773,
+ 3158, 2773, 2773, 3158, 3158, 3158, 2773, 3158, 3158, 3158,
+ 2773, 1126, 1126, 3158, 1126, 1126, 3158, 1126, 1126, 3158,
+ 3158, 1126, 1126, 1126, 1126, 3158, 1126, 1126, 1126, 1126,
+ 1126, 1126, 1126, 1126, 1126, 1126, 1126, 3158, 3158, 1126,
+ 1126, 2633, 2633, 2633, 2633, 3158, 2633, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 2633, 2633, 3158, 3158, 3158, 2633, 3158, 3158, 3158, 2633,
+ 2777, 2777, 2777, 2777, 3158, 3158, 3158, 2777, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 2777, 3158, 3158, 3158, 3158, 2777,
+ 2777, 3158, 3158, 3158, 2777, 3158, 3158, 3158, 2777, 2829,
+ 2829, 2829, 2829, 3158, 3158, 3158, 2829, 3158, 3158, 3158,
+ 3158, 3158, 3158, 2829, 3158, 3158, 3158, 3158, 2829, 2829,
+ 3158, 3158, 3158, 2829, 3158, 3158, 3158, 2829, 2838, 2838,
+ 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2838,
+ 2838, 2838, 2838, 3158, 2838, 2838, 2838, 2838, 3158, 3158,
+ 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2838, 2866, 2866,
+ 3158, 2866, 2866, 3158, 2866, 2866, 2866, 2866, 2866, 2866,
+ 2866, 2866, 3158, 2866, 2866, 2866, 2866, 2866, 2866, 2866,
+
+ 2866, 2866, 2866, 2866, 3158, 2866, 2866, 2866, 1674, 1674,
+ 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674,
+ 1674, 1674, 1674, 3158, 1674, 1674, 1674, 1674, 3158, 3158,
+ 1674, 1674, 1674, 3158, 1674, 1674, 1674, 1674, 2867, 2867,
+ 3158, 2867, 2867, 3158, 2867, 2867, 2867, 2867, 2867, 2867,
+ 3158, 3158, 3158, 2867, 2867, 2867, 2867, 2867, 2867, 2867,
+ 2867, 2867, 2867, 2867, 3158, 2867, 2867, 2867, 2927, 2927,
+ 3158, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2942, 2942,
+
+ 3158, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2957, 2957,
+ 3158, 2957, 2957, 3158, 2957, 2957, 2957, 2957, 2957, 2957,
+ 2957, 2957, 3158, 2957, 2957, 2957, 2957, 2957, 2957, 2957,
+ 2957, 2957, 2957, 2957, 3158, 2957, 2957, 2957, 2944, 2944,
+ 3158, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944,
+ 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944,
+ 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 1125, 1125,
+ 3158, 1125, 1125, 3158, 1125, 1125, 1125, 1125, 1125, 1125,
+
+ 3158, 3158, 3158, 1125, 1125, 1125, 1125, 1125, 1125, 1125,
+ 1125, 1125, 1125, 1125, 3158, 1125, 1125, 1125, 2945, 2945,
+ 3158, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2958, 2958,
+ 3158, 2958, 2958, 3158, 2958, 2958, 2958, 2958, 2958, 2958,
+ 3158, 3158, 3158, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 3158, 2958, 2958, 2958, 1124, 1124,
+ 3158, 1124, 1124, 3158, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 3158, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+
+ 1124, 1124, 1124, 1124, 3158, 1124, 1124, 1124, 1238, 1238,
+ 3158, 1238, 1238, 1238, 1238, 1238, 3158, 3158, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 3158, 1238, 1238, 1238,
+ 3158, 1238, 3158, 1238, 3158, 3158, 1238, 1238, 3052, 3158,
+ 3158, 3052, 3158, 3052, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3052, 3052, 3158,
+ 3158, 3158, 3052, 3158, 3158, 3158, 3052, 3085, 3158, 3158,
+ 3085, 3158, 3158, 3158, 3158, 3085, 3158, 3158, 3158, 3158,
+ 3158, 3085, 3158, 3158, 3158, 3158, 3085, 3085, 3158, 3158,
+ 3158, 3085, 3158, 3158, 3158, 3085, 2945, 2945, 3158, 2945,
+
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 65, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158
+ } ;
+
+static yyconst flex_int16_t yy_chk[27610] =
+ { 0,
+ 0, 0, 1, 1, 2, 2, 2, 2, 109, 109,
+ 3, 3, 1, 1, 3, 2, 2, 0, 323, 1,
+ 3, 3, 2, 20, 195, 71, 20, 3, 1, 20,
+ 71, 2, 4, 4, 4, 4, 3, 4, 176, 323,
+ 195, 20, 22, 4, 4, 22, 1, 74, 1, 2,
+ 4, 2, 74, 2183, 3, 3, 3, 5, 5, 4,
+ 22, 635, 113, 635, 79, 113, 5, 5, 5, 79,
+ 6, 6, 6, 6, 5, 113, 176, 4, 4, 4,
+ 6, 6, 6, 5, 83, 88, 91, 98, 6, 83,
+ 88, 91, 98, 149, 7, 7, 149, 6, 7, 175,
+
+ 128, 5, 5, 5, 7, 7, 149, 8, 8, 8,
+ 8, 7, 8, 9, 9, 6, 6, 6, 8, 8,
+ 7, 101, 107, 9, 9, 8, 101, 107, 168, 343,
+ 9, 175, 24, 26, 8, 24, 26, 111, 7, 9,
+ 7, 128, 111, 118, 10, 10, 10, 10, 118, 343,
+ 24, 26, 8, 231, 8, 10, 10, 9, 9, 9,
+ 168, 28, 10, 168, 28, 11, 11, 11, 11, 121,
+ 30, 10, 201, 30, 121, 138, 11, 11, 11, 28,
+ 138, 201, 199, 11, 12, 12, 12, 12, 30, 10,
+ 10, 10, 11, 199, 2184, 12, 12, 12, 13, 13,
+
+ 32, 34, 12, 32, 34, 231, 129, 129, 13, 13,
+ 11, 12, 11, 166, 38, 13, 141, 38, 32, 34,
+ 38, 141, 44, 46, 13, 44, 46, 289, 155, 12,
+ 166, 12, 38, 155, 14, 14, 14, 14, 15, 15,
+ 44, 46, 13, 13, 13, 14, 14, 301, 15, 15,
+ 15, 129, 14, 180, 289, 15, 16, 16, 16, 16,
+ 48, 14, 335, 48, 15, 127, 335, 16, 16, 16,
+ 127, 180, 313, 183, 16, 180, 17, 17, 48, 14,
+ 14, 14, 15, 16, 15, 170, 17, 17, 18, 18,
+ 18, 18, 50, 17, 52, 50, 301, 52, 127, 18,
+
+ 18, 16, 17, 16, 183, 54, 18, 170, 54, 183,
+ 50, 56, 52, 58, 56, 18, 58, 170, 286, 191,
+ 17, 286, 17, 54, 191, 204, 204, 170, 610, 56,
+ 2186, 58, 313, 18, 610, 18, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 35, 35, 35, 35, 131, 60, 583, 196,
+
+ 60, 131, 196, 35, 35, 36, 36, 36, 36, 583,
+ 35, 599, 196, 242, 35, 60, 36, 36, 242, 35,
+ 206, 206, 618, 36, 599, 62, 618, 36, 62, 131,
+ 39, 39, 36, 40, 40, 40, 40, 35, 171, 35,
+ 39, 39, 174, 62, 40, 40, 64, 39, 339, 64,
+ 36, 40, 36, 39, 324, 39, 39, 40, 339, 40,
+ 40, 252, 495, 174, 64, 174, 252, 171, 35, 171,
+ 2187, 495, 174, 174, 39, 324, 39, 171, 40, 171,
+ 40, 36, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 41, 41, 67, 73, 41, 67,
+ 73, 351, 2188, 290, 41, 41, 290, 82, 254, 90,
+ 82, 41, 90, 93, 67, 73, 93, 254, 254, 41,
+ 41, 42, 42, 42, 42, 82, 42, 90, 325, 326,
+
+ 328, 93, 42, 42, 100, 405, 351, 100, 41, 42,
+ 41, 103, 103, 110, 103, 405, 110, 42, 42, 325,
+ 326, 328, 100, 123, 120, 130, 123, 120, 130, 103,
+ 133, 110, 315, 133, 167, 315, 42, 120, 42, 43,
+ 43, 123, 120, 130, 142, 142, 142, 142, 133, 43,
+ 43, 140, 1924, 167, 140, 169, 43, 143, 143, 143,
+ 143, 185, 43, 377, 43, 43, 142, 470, 377, 140,
+ 167, 130, 167, 169, 470, 143, 342, 342, 43, 143,
+ 169, 185, 1924, 43, 169, 43, 185, 169, 342, 43,
+ 43, 43, 202, 43, 43, 388, 43, 202, 395, 43,
+
+ 388, 634, 43, 395, 202, 634, 43, 43, 43, 43,
+ 43, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 47, 47, 47, 47, 47, 47, 47,
+
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+
+ 55, 55, 55, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 144, 144, 144, 144, 147, 147, 147, 147, 156,
+ 156, 156, 147, 161, 161, 161, 161, 160, 588, 173,
+ 172, 588, 475, 144, 161, 161, 178, 147, 161, 285,
+ 285, 408, 408, 156, 285, 161, 161, 161, 172, 173,
+ 177, 173, 475, 408, 190, 178, 172, 190, 613, 172,
+ 602, 173, 172, 297, 613, 172, 297, 179, 177, 178,
+ 161, 602, 177, 156, 160, 178, 160, 160, 182, 285,
+
+ 160, 297, 425, 184, 147, 179, 160, 160, 177, 160,
+ 160, 160, 425, 179, 147, 162, 162, 162, 162, 181,
+ 182, 184, 179, 182, 207, 179, 162, 162, 619, 184,
+ 162, 233, 190, 182, 619, 184, 233, 162, 162, 162,
+ 182, 181, 473, 233, 181, 181, 220, 162, 188, 188,
+ 188, 188, 473, 220, 496, 188, 181, 220, 2189, 181,
+ 220, 181, 162, 189, 189, 189, 189, 413, 496, 189,
+ 591, 207, 413, 207, 207, 292, 600, 207, 292, 208,
+ 591, 189, 208, 207, 207, 189, 207, 207, 207, 209,
+ 208, 296, 209, 614, 296, 208, 208, 600, 292, 307,
+
+ 209, 208, 307, 208, 614, 209, 209, 211, 504, 296,
+ 211, 209, 390, 209, 296, 390, 212, 412, 211, 212,
+ 412, 209, 504, 211, 211, 213, 2190, 212, 213, 211,
+ 390, 211, 212, 212, 433, 412, 213, 433, 212, 215,
+ 212, 213, 213, 215, 513, 503, 215, 213, 214, 213,
+ 215, 214, 433, 215, 503, 216, 211, 416, 513, 214,
+ 416, 604, 216, 215, 214, 214, 216, 212, 216, 216,
+ 214, 1198, 214, 604, 217, 307, 221, 283, 216, 416,
+ 283, 217, 217, 221, 212, 217, 212, 221, 217, 213,
+ 221, 217, 213, 218, 1198, 218, 221, 218, 214, 283,
+
+ 218, 428, 428, 219, 218, 214, 219, 218, 219, 214,
+ 219, 590, 214, 428, 219, 219, 219, 219, 222, 223,
+ 223, 606, 222, 522, 606, 222, 223, 1138, 224, 222,
+ 223, 590, 222, 223, 223, 224, 224, 522, 222, 224,
+ 223, 440, 224, 225, 446, 224, 440, 225, 224, 446,
+ 225, 226, 1138, 283, 225, 226, 455, 225, 226, 226,
+ 227, 455, 226, 445, 227, 226, 445, 227, 2205, 228,
+ 226, 227, 605, 226, 227, 226, 228, 227, 229, 605,
+ 228, 445, 228, 228, 227, 229, 229, 228, 230, 229,
+ 230, 460, 229, 488, 539, 230, 460, 539, 488, 230,
+
+ 586, 586, 230, 235, 235, 235, 235, 539, 236, 236,
+ 236, 236, 237, 237, 237, 237, 239, 239, 239, 239,
+ 608, 267, 277, 239, 277, 235, 236, 608, 267, 277,
+ 236, 630, 267, 277, 237, 267, 277, 630, 239, 245,
+ 245, 245, 245, 492, 249, 249, 249, 249, 492, 616,
+ 245, 249, 616, 250, 250, 250, 250, 347, 347, 347,
+ 347, 245, 532, 245, 250, 251, 251, 251, 251, 256,
+ 256, 459, 256, 494, 459, 250, 532, 250, 494, 347,
+ 256, 257, 257, 251, 257, 256, 256, 251, 2236, 459,
+ 543, 256, 257, 256, 625, 239, 499, 257, 257, 258,
+
+ 258, 499, 258, 257, 543, 257, 625, 508, 259, 259,
+ 258, 259, 508, 257, 327, 258, 258, 260, 260, 259,
+ 260, 258, 327, 258, 259, 259, 621, 327, 260, 500,
+ 259, 512, 259, 260, 260, 327, 621, 2297, 500, 260,
+ 512, 260, 262, 268, 261, 261, 262, 261, 258, 262,
+ 268, 263, 500, 262, 268, 261, 262, 268, 263, 259,
+ 261, 261, 263, 268, 263, 263, 261, 476, 261, 639,
+ 476, 476, 264, 501, 263, 639, 259, 510, 259, 264,
+ 264, 260, 476, 264, 260, 2299, 264, 501, 265, 264,
+ 265, 510, 265, 516, 261, 265, 501, 615, 516, 265,
+
+ 510, 261, 265, 291, 266, 261, 291, 266, 261, 266,
+ 615, 266, 657, 270, 270, 266, 266, 266, 266, 269,
+ 270, 291, 657, 269, 270, 291, 269, 270, 270, 271,
+ 269, 272, 521, 269, 270, 272, 271, 271, 272, 269,
+ 271, 521, 272, 271, 273, 272, 271, 2300, 273, 271,
+ 274, 273, 273, 317, 274, 273, 317, 274, 273, 317,
+ 524, 274, 275, 273, 274, 524, 273, 274, 273, 275,
+ 276, 317, 562, 275, 274, 275, 275, 276, 276, 291,
+ 275, 276, 329, 330, 276, 329, 562, 329, 509, 517,
+ 531, 330, 348, 348, 348, 348, 330, 509, 517, 611,
+
+ 329, 611, 531, 2301, 330, 611, 483, 531, 329, 483,
+ 348, 509, 517, 518, 348, 349, 349, 349, 349, 350,
+ 350, 350, 350, 565, 483, 542, 350, 518, 565, 317,
+ 354, 354, 354, 354, 542, 491, 518, 349, 491, 607,
+ 2302, 350, 355, 355, 355, 355, 356, 356, 356, 356,
+ 607, 607, 354, 491, 354, 357, 357, 357, 357, 358,
+ 358, 358, 358, 550, 355, 628, 355, 633, 356, 561,
+ 356, 576, 550, 628, 355, 549, 549, 357, 561, 357,
+ 576, 358, 633, 358, 359, 359, 359, 359, 1129, 360,
+ 360, 360, 360, 361, 361, 361, 361, 631, 350, 603,
+
+ 362, 362, 362, 362, 603, 550, 359, 525, 359, 631,
+ 356, 360, 357, 360, 1129, 361, 525, 361, 577, 357,
+ 549, 577, 362, 358, 362, 363, 363, 363, 363, 677,
+ 525, 577, 364, 364, 364, 364, 365, 365, 365, 365,
+ 677, 493, 360, 498, 493, 359, 498, 363, 609, 363,
+ 636, 362, 360, 636, 364, 609, 364, 361, 365, 493,
+ 365, 498, 366, 366, 366, 366, 367, 367, 367, 367,
+ 622, 622, 889, 367, 368, 368, 368, 368, 370, 370,
+ 370, 370, 363, 363, 366, 617, 366, 371, 371, 371,
+ 371, 889, 368, 617, 363, 364, 368, 617, 526, 537,
+
+ 365, 372, 372, 372, 372, 371, 632, 387, 387, 387,
+ 387, 632, 526, 537, 366, 448, 448, 448, 448, 2303,
+ 507, 526, 537, 507, 546, 387, 515, 642, 642, 515,
+ 370, 551, 523, 546, 547, 523, 2304, 448, 507, 371,
+ 560, 560, 370, 560, 515, 551, 370, 546, 547, 370,
+ 523, 371, 629, 372, 370, 371, 629, 547, 371, 387,
+ 623, 620, 448, 371, 629, 372, 623, 566, 620, 372,
+ 623, 387, 372, 551, 2305, 387, 566, 372, 387, 461,
+ 461, 461, 461, 387, 457, 457, 641, 457, 457, 457,
+ 566, 457, 641, 457, 457, 457, 457, 457, 457, 457,
+
+ 457, 457, 457, 457, 648, 648, 645, 457, 457, 457,
+ 457, 457, 457, 645, 1180, 556, 462, 462, 462, 462,
+ 556, 1180, 463, 463, 463, 463, 529, 529, 601, 529,
+ 457, 461, 457, 457, 462, 601, 481, 481, 481, 481,
+ 646, 646, 536, 461, 529, 536, 601, 461, 556, 555,
+ 461, 649, 555, 545, 481, 461, 545, 649, 567, 646,
+ 536, 457, 457, 457, 457, 644, 545, 555, 462, 644,
+ 2306, 545, 567, 557, 463, 637, 564, 644, 637, 564,
+ 462, 567, 557, 558, 462, 656, 463, 462, 481, 656,
+ 463, 685, 462, 463, 564, 555, 557, 558, 463, 626,
+
+ 481, 685, 626, 868, 481, 653, 558, 481, 568, 568,
+ 568, 568, 481, 653, 2307, 557, 570, 570, 570, 570,
+ 572, 572, 572, 572, 868, 558, 574, 574, 574, 574,
+ 568, 572, 572, 574, 570, 572, 650, 672, 570, 624,
+ 672, 650, 572, 572, 572, 624, 573, 573, 573, 573,
+ 672, 624, 578, 578, 578, 578, 626, 573, 573, 578,
+ 863, 573, 655, 655, 578, 578, 863, 572, 573, 573,
+ 573, 580, 580, 580, 578, 582, 582, 582, 582, 598,
+ 598, 638, 582, 2308, 598, 598, 638, 592, 592, 592,
+ 592, 660, 660, 573, 598, 580, 638, 582, 592, 592,
+
+ 1088, 647, 592, 573, 593, 593, 593, 593, 647, 592,
+ 592, 592, 1088, 640, 640, 593, 593, 902, 647, 593,
+ 640, 643, 643, 643, 643, 580, 593, 593, 643, 651,
+ 651, 578, 654, 654, 592, 643, 658, 658, 665, 651,
+ 658, 665, 666, 654, 2309, 666, 598, 667, 667, 680,
+ 680, 593, 902, 843, 582, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 684, 871, 871, 612, 612,
+ 612, 612, 612, 612, 843, 652, 661, 661, 661, 661,
+ 871, 682, 652, 661, 682, 684, 665, 956, 871, 994,
+
+ 666, 612, 612, 612, 612, 652, 984, 984, 994, 652,
+ 662, 662, 662, 662, 1137, 836, 956, 662, 836, 664,
+ 664, 664, 664, 1135, 1137, 664, 612, 663, 663, 663,
+ 663, 1135, 612, 612, 612, 612, 612, 664, 663, 663,
+ 1133, 664, 663, 669, 686, 673, 669, 686, 673, 995,
+ 663, 663, 673, 670, 669, 1116, 670, 673, 673, 669,
+ 669, 1116, 1133, 995, 670, 669, 686, 669, 686, 670,
+ 670, 1141, 2313, 690, 663, 670, 690, 670, 837, 1141,
+ 840, 837, 693, 840, 690, 693, 977, 1000, 1139, 690,
+ 690, 694, 1000, 693, 694, 690, 1031, 690, 693, 693,
+
+ 695, 1031, 694, 695, 693, 977, 693, 694, 694, 696,
+ 670, 695, 696, 694, 1139, 694, 695, 695, 693, 1001,
+ 696, 1019, 695, 1090, 695, 696, 696, 697, 1001, 844,
+ 697, 696, 844, 696, 846, 1090, 698, 846, 697, 698,
+ 1019, 694, 1001, 697, 697, 699, 1062, 698, 699, 697,
+ 1062, 697, 698, 698, 2315, 1028, 699, 846, 698, 694,
+ 698, 699, 699, 700, 1028, 1036, 700, 699, 695, 699,
+ 1036, 696, 1154, 701, 700, 736, 701, 736, 1028, 700,
+ 700, 736, 1068, 736, 701, 700, 1068, 700, 736, 701,
+ 701, 702, 1154, 1073, 702, 701, 697, 701, 1073, 699,
+
+ 698, 859, 702, 703, 859, 1130, 703, 702, 702, 756,
+ 756, 756, 756, 702, 703, 702, 756, 1075, 704, 703,
+ 703, 704, 1075, 701, 737, 703, 737, 703, 1131, 704,
+ 737, 700, 700, 1130, 704, 704, 712, 737, 1136, 712,
+ 704, 702, 704, 737, 1142, 861, 706, 712, 861, 706,
+ 1136, 851, 712, 712, 851, 1131, 1142, 706, 712, 735,
+ 712, 735, 706, 706, 735, 735, 703, 1150, 706, 851,
+ 706, 2316, 735, 704, 851, 884, 1150, 859, 884, 704,
+ 705, 705, 705, 705, 705, 705, 705, 705, 705, 705,
+ 705, 705, 705, 705, 705, 705, 705, 705, 705, 705,
+
+ 712, 2318, 1164, 705, 705, 705, 705, 705, 705, 706,
+ 739, 1037, 739, 1037, 707, 835, 739, 707, 835, 751,
+ 751, 751, 751, 739, 1164, 707, 705, 705, 705, 705,
+ 707, 707, 708, 1153, 1197, 708, 707, 835, 707, 2319,
+ 740, 751, 740, 708, 1197, 1153, 740, 740, 708, 708,
+ 1155, 705, 709, 740, 708, 709, 708, 705, 705, 705,
+ 705, 705, 710, 709, 741, 710, 741, 1178, 709, 709,
+ 741, 1155, 711, 710, 709, 711, 709, 741, 710, 710,
+ 2320, 1158, 707, 711, 710, 1178, 710, 713, 711, 711,
+ 713, 835, 951, 738, 711, 951, 711, 961, 713, 738,
+
+ 961, 738, 708, 713, 713, 738, 1039, 1158, 1039, 713,
+ 738, 713, 738, 1169, 746, 714, 746, 709, 714, 961,
+ 746, 709, 1047, 710, 1047, 715, 714, 746, 715, 1169,
+ 1022, 714, 714, 1022, 1209, 711, 715, 714, 2321, 714,
+ 716, 715, 715, 716, 1171, 1209, 744, 715, 744, 715,
+ 717, 716, 744, 717, 713, 744, 716, 716, 1171, 744,
+ 873, 717, 716, 873, 716, 873, 717, 717, 1049, 742,
+ 1049, 742, 717, 714, 717, 742, 1033, 745, 873, 745,
+ 742, 1184, 742, 745, 720, 1033, 873, 720, 715, 745,
+ 745, 1687, 715, 962, 723, 720, 962, 723, 1687, 1033,
+
+ 720, 720, 1057, 716, 1057, 723, 720, 1184, 720, 716,
+ 723, 723, 839, 839, 1179, 962, 723, 839, 723, 717,
+ 718, 718, 718, 718, 718, 718, 718, 718, 718, 718,
+ 718, 718, 718, 718, 718, 718, 718, 718, 718, 718,
+ 1059, 1179, 1059, 718, 718, 718, 718, 718, 718, 720,
+ 926, 1166, 839, 926, 721, 721, 721, 721, 1187, 753,
+ 753, 753, 753, 723, 1199, 721, 718, 718, 718, 718,
+ 721, 721, 722, 1166, 926, 722, 721, 753, 721, 1187,
+ 747, 753, 747, 722, 963, 1134, 747, 963, 722, 722,
+ 1199, 747, 724, 747, 722, 724, 722, 718, 718, 718,
+
+ 718, 718, 725, 724, 1134, 725, 963, 845, 724, 724,
+ 845, 1176, 1156, 725, 724, 721, 724, 726, 725, 725,
+ 726, 1699, 2322, 721, 725, 845, 725, 727, 726, 845,
+ 727, 1156, 1699, 726, 726, 722, 1176, 1103, 727, 726,
+ 1103, 726, 728, 727, 727, 728, 870, 870, 1067, 727,
+ 1067, 727, 2323, 728, 724, 870, 1002, 1152, 728, 728,
+ 729, 743, 1140, 729, 728, 1152, 728, 743, 870, 743,
+ 1002, 729, 1192, 743, 725, 1168, 729, 729, 726, 1002,
+ 743, 743, 729, 845, 729, 743, 727, 730, 1140, 1140,
+ 730, 731, 999, 1192, 731, 999, 728, 1168, 730, 749,
+
+ 749, 749, 731, 730, 730, 749, 1157, 731, 731, 730,
+ 999, 730, 749, 731, 729, 731, 732, 1060, 1157, 732,
+ 733, 1060, 750, 733, 750, 1706, 1706, 732, 750, 1060,
+ 1188, 733, 732, 732, 1060, 750, 733, 733, 732, 1181,
+ 732, 748, 733, 748, 733, 874, 748, 748, 734, 731,
+ 730, 734, 1188, 874, 748, 731, 1078, 1078, 874, 734,
+ 755, 755, 755, 755, 734, 734, 874, 732, 1181, 1159,
+ 734, 755, 734, 757, 757, 757, 757, 1159, 733, 1029,
+ 757, 1069, 755, 1069, 755, 758, 758, 758, 758, 759,
+ 759, 759, 759, 1029, 1596, 757, 758, 1091, 1596, 1091,
+
+ 759, 1078, 1029, 2324, 734, 1194, 734, 758, 876, 876,
+ 734, 759, 761, 761, 761, 761, 1160, 734, 764, 764,
+ 764, 764, 876, 761, 1160, 764, 765, 765, 765, 765,
+ 876, 876, 1194, 765, 761, 1034, 761, 766, 766, 766,
+ 766, 767, 767, 767, 767, 1083, 1044, 2325, 766, 1034,
+ 768, 768, 757, 768, 770, 770, 1162, 770, 1034, 767,
+ 1044, 768, 1196, 767, 1043, 770, 768, 768, 1162, 1044,
+ 770, 770, 768, 1043, 768, 1083, 770, 1083, 770, 771,
+ 771, 1163, 771, 775, 775, 866, 775, 1043, 866, 1196,
+ 771, 866, 2326, 1163, 775, 771, 771, 1050, 1050, 775,
+
+ 775, 776, 776, 866, 776, 775, 1050, 775, 1172, 1050,
+ 777, 777, 776, 777, 1050, 1053, 1172, 776, 776, 778,
+ 778, 777, 778, 776, 1053, 776, 777, 777, 779, 779,
+ 778, 779, 777, 1201, 777, 778, 778, 776, 1053, 779,
+ 1174, 778, 1050, 778, 779, 779, 780, 780, 1331, 780,
+ 779, 1331, 779, 2327, 1201, 781, 781, 780, 781, 1174,
+ 777, 866, 780, 780, 782, 782, 781, 782, 780, 1177,
+ 780, 781, 781, 1086, 1086, 782, 1086, 781, 777, 781,
+ 782, 782, 783, 783, 1165, 783, 782, 778, 782, 1210,
+ 779, 1042, 1042, 783, 1177, 1042, 1165, 1210, 783, 783,
+
+ 896, 896, 896, 896, 783, 1173, 783, 1048, 1048, 784,
+ 784, 1048, 784, 785, 785, 780, 785, 1173, 782, 781,
+ 784, 1230, 896, 1206, 785, 784, 784, 1230, 1061, 785,
+ 785, 784, 1061, 784, 1175, 785, 1042, 785, 786, 786,
+ 1061, 786, 1084, 1084, 1206, 1061, 1175, 875, 875, 786,
+ 783, 783, 1048, 2329, 786, 786, 875, 1052, 1052, 784,
+ 786, 1200, 786, 785, 787, 787, 1052, 787, 1054, 875,
+ 875, 901, 901, 901, 901, 787, 1058, 1058, 901, 2340,
+ 787, 787, 1054, 1200, 1064, 1058, 787, 1084, 787, 789,
+ 789, 1054, 789, 790, 790, 1183, 790, 1182, 1064, 1063,
+
+ 789, 786, 1052, 1190, 790, 789, 789, 1064, 1063, 790,
+ 790, 789, 1428, 789, 1183, 790, 1190, 790, 1428, 787,
+ 1182, 1058, 1063, 2341, 1182, 787, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 1089, 1051, 1051, 788,
+ 788, 788, 788, 788, 788, 1186, 1051, 789, 1193, 1051,
+ 1089, 2128, 2128, 790, 1051, 791, 791, 1189, 791, 1089,
+ 1193, 1186, 788, 788, 788, 788, 791, 792, 792, 1202,
+ 792, 791, 791, 924, 924, 924, 924, 791, 792, 791,
+ 924, 1202, 1051, 792, 792, 1189, 1065, 788, 1191, 792,
+
+ 1065, 792, 1204, 788, 788, 788, 788, 788, 1065, 793,
+ 793, 1205, 793, 1065, 925, 925, 925, 925, 1085, 1185,
+ 793, 925, 1185, 1191, 1204, 793, 793, 1205, 1208, 2342,
+ 791, 793, 1203, 793, 791, 1207, 794, 794, 792, 794,
+ 795, 795, 1066, 795, 1203, 1598, 1066, 794, 1085, 1598,
+ 1085, 795, 794, 794, 1066, 1208, 795, 795, 794, 1066,
+ 794, 1185, 795, 1207, 795, 796, 796, 1535, 796, 1535,
+ 1087, 1087, 793, 1087, 797, 797, 796, 797, 1211, 1436,
+ 1212, 796, 796, 1436, 1610, 797, 1211, 796, 1087, 796,
+ 797, 797, 798, 798, 1070, 798, 797, 1070, 797, 1212,
+
+ 794, 1195, 1071, 798, 1436, 1071, 1070, 795, 798, 798,
+ 799, 799, 1610, 799, 798, 1237, 798, 1195, 1237, 1071,
+ 1070, 799, 1237, 796, 1079, 1080, 799, 799, 1071, 1195,
+ 1420, 1744, 799, 1079, 799, 802, 802, 797, 802, 1080,
+ 1744, 797, 1094, 1094, 1094, 1094, 802, 1079, 1080, 1094,
+ 1684, 802, 802, 803, 803, 798, 803, 802, 1684, 802,
+ 1450, 798, 1420, 1450, 803, 1639, 1079, 1080, 1639, 803,
+ 803, 1095, 1095, 1095, 1095, 803, 2343, 803, 1095, 799,
+ 800, 800, 800, 800, 800, 800, 800, 800, 800, 800,
+ 800, 800, 800, 800, 800, 800, 800, 800, 800, 800,
+
+ 802, 1626, 1670, 800, 800, 800, 800, 800, 800, 1287,
+ 1287, 1287, 1287, 1626, 803, 1526, 898, 898, 898, 898,
+ 804, 804, 803, 804, 1526, 1526, 800, 800, 800, 800,
+ 1670, 804, 805, 805, 898, 805, 804, 804, 898, 1627,
+ 2348, 1442, 804, 805, 804, 1442, 1576, 1576, 805, 805,
+ 1576, 1627, 806, 806, 805, 806, 805, 800, 800, 800,
+ 800, 800, 2349, 806, 807, 807, 1442, 807, 806, 806,
+ 1106, 1106, 1106, 1106, 806, 807, 806, 1106, 1697, 1486,
+ 807, 807, 1486, 804, 1487, 1697, 807, 1487, 807, 808,
+ 808, 1576, 808, 809, 809, 1170, 809, 1537, 1170, 1537,
+
+ 808, 805, 2350, 1486, 809, 808, 808, 1441, 1487, 809,
+ 809, 808, 1601, 808, 806, 809, 1601, 809, 810, 810,
+ 1530, 810, 811, 811, 1530, 811, 1530, 1602, 1441, 810,
+ 1714, 1602, 1531, 811, 810, 810, 807, 1170, 811, 811,
+ 810, 1531, 810, 1714, 811, 1221, 811, 1628, 1221, 1170,
+ 808, 1629, 809, 812, 812, 1531, 812, 813, 813, 1628,
+ 813, 1221, 1221, 1629, 812, 1530, 1625, 2351, 813, 812,
+ 812, 1625, 810, 813, 813, 812, 811, 812, 1441, 813,
+ 1441, 813, 814, 814, 1655, 814, 815, 815, 1655, 815,
+ 1124, 1124, 1558, 814, 1558, 1124, 1124, 815, 814, 814,
+
+ 2153, 2153, 815, 815, 814, 1124, 814, 1560, 815, 1560,
+ 815, 1329, 1329, 1329, 1329, 813, 812, 1711, 1329, 816,
+ 816, 813, 816, 817, 817, 1219, 817, 1673, 1219, 1673,
+ 816, 1711, 1219, 814, 817, 816, 816, 1219, 1219, 817,
+ 817, 816, 1686, 816, 815, 817, 1686, 817, 818, 818,
+ 1689, 818, 819, 819, 1689, 819, 1693, 1124, 1671, 818,
+ 1693, 1671, 1745, 819, 818, 818, 1076, 1076, 819, 819,
+ 818, 1745, 818, 1696, 819, 816, 819, 1696, 1076, 820,
+ 820, 816, 820, 1076, 817, 1578, 1578, 1604, 816, 1578,
+ 820, 1465, 817, 2298, 1465, 820, 820, 1077, 1077, 821,
+
+ 821, 820, 821, 820, 927, 927, 927, 927, 819, 1077,
+ 821, 1076, 818, 1465, 1077, 821, 821, 822, 822, 1603,
+ 822, 821, 927, 821, 1611, 1611, 927, 819, 822, 820,
+ 1578, 1603, 2298, 822, 822, 1443, 1603, 823, 823, 822,
+ 823, 822, 1077, 1698, 1685, 1698, 820, 1685, 823, 824,
+ 824, 1700, 824, 823, 823, 1700, 1443, 821, 1683, 823,
+ 824, 823, 1604, 1683, 1604, 824, 824, 825, 825, 1611,
+ 825, 824, 1705, 824, 903, 903, 903, 903, 825, 1705,
+ 822, 903, 1606, 825, 825, 1081, 1081, 826, 826, 825,
+ 826, 825, 987, 987, 987, 987, 903, 1081, 826, 823,
+
+ 1688, 1938, 1081, 826, 826, 1688, 1443, 824, 1443, 826,
+ 2352, 826, 827, 827, 987, 827, 824, 825, 900, 900,
+ 900, 900, 1938, 827, 1101, 1101, 1101, 1101, 827, 827,
+ 1081, 1718, 828, 828, 827, 828, 827, 825, 1718, 987,
+ 900, 825, 900, 828, 829, 829, 1101, 829, 828, 828,
+ 2155, 2155, 826, 903, 828, 829, 828, 1606, 1721, 1606,
+ 829, 829, 830, 830, 1694, 830, 829, 1694, 829, 1721,
+ 827, 831, 831, 830, 831, 1941, 2353, 1536, 830, 830,
+ 827, 1536, 831, 1536, 830, 1701, 830, 831, 831, 1701,
+ 828, 832, 832, 831, 832, 831, 1941, 904, 904, 904,
+
+ 904, 1703, 832, 905, 905, 905, 905, 832, 832, 1586,
+ 1586, 829, 1704, 832, 1704, 832, 1703, 2354, 1586, 904,
+ 830, 904, 1536, 830, 1707, 905, 1707, 905, 831, 908,
+ 908, 908, 908, 909, 909, 909, 909, 910, 910, 910,
+ 910, 1722, 911, 911, 911, 911, 1597, 1588, 1588, 832,
+ 1597, 908, 1722, 908, 1586, 909, 1588, 909, 1597, 910,
+ 1708, 910, 1708, 1597, 911, 908, 911, 912, 912, 912,
+ 912, 913, 913, 913, 913, 1336, 1336, 1336, 1336, 1724,
+ 988, 988, 988, 988, 1581, 1581, 1336, 910, 1581, 912,
+ 1724, 912, 1588, 913, 1709, 913, 1709, 909, 915, 915,
+
+ 915, 915, 988, 2167, 2167, 911, 916, 916, 916, 916,
+ 1438, 1438, 917, 917, 917, 917, 1330, 1330, 1330, 1330,
+ 915, 2094, 915, 1330, 1438, 1613, 1613, 988, 916, 1581,
+ 916, 2094, 1438, 1438, 917, 913, 917, 912, 914, 914,
+ 914, 914, 914, 914, 914, 914, 914, 914, 914, 914,
+ 914, 914, 914, 914, 914, 914, 914, 914, 1614, 1614,
+ 1737, 914, 914, 914, 914, 914, 914, 915, 1737, 916,
+ 1613, 917, 918, 918, 918, 918, 919, 919, 919, 919,
+ 920, 920, 920, 920, 914, 914, 914, 914, 921, 921,
+ 921, 921, 1946, 1710, 918, 1710, 918, 1716, 919, 1716,
+
+ 919, 2355, 920, 1614, 920, 922, 922, 922, 922, 1715,
+ 921, 1239, 921, 1946, 1239, 914, 914, 914, 914, 914,
+ 923, 923, 923, 923, 1715, 1623, 1623, 922, 1623, 922,
+ 2356, 1712, 919, 1239, 1712, 1239, 918, 928, 928, 928,
+ 928, 1723, 923, 1623, 923, 1040, 1040, 920, 1723, 1040,
+ 1717, 919, 929, 929, 929, 929, 921, 1040, 935, 935,
+ 935, 935, 1040, 922, 2357, 1717, 922, 943, 943, 943,
+ 943, 989, 989, 989, 989, 1220, 935, 923, 1220, 1041,
+ 1041, 1731, 1220, 1041, 1720, 943, 1532, 1220, 1220, 928,
+ 1040, 1041, 1731, 989, 1045, 1045, 1041, 1747, 1045, 1720,
+
+ 1532, 928, 1747, 1727, 929, 928, 1045, 1727, 928, 1532,
+ 935, 1045, 1726, 928, 1741, 1726, 929, 1741, 989, 943,
+ 929, 1728, 935, 929, 1041, 2358, 935, 1728, 929, 935,
+ 1733, 943, 1582, 1582, 935, 943, 1582, 1733, 943, 1045,
+ 1616, 1616, 1730, 943, 997, 997, 1730, 997, 997, 997,
+ 1729, 997, 1729, 997, 997, 997, 997, 997, 997, 997,
+ 997, 997, 997, 997, 1732, 1735, 2359, 997, 997, 997,
+ 997, 997, 997, 1003, 1003, 1003, 1003, 1582, 1735, 1732,
+ 1732, 1850, 1046, 1046, 1850, 1616, 1046, 1746, 1055, 1055,
+ 997, 1003, 997, 997, 1046, 1056, 1056, 1055, 1746, 1046,
+
+ 1055, 1082, 1082, 1736, 1056, 1055, 2144, 1056, 1108, 1108,
+ 1108, 1108, 1056, 1082, 1255, 1108, 1736, 1255, 1082, 2144,
+ 2116, 997, 997, 997, 997, 1003, 1734, 1046, 1734, 2116,
+ 1108, 1354, 1354, 1055, 1354, 1738, 1255, 1003, 1255, 1738,
+ 1056, 1003, 1354, 1743, 1003, 1743, 1082, 1354, 1354, 1003,
+ 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012,
+ 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012,
+ 1099, 1618, 1618, 1012, 1012, 1012, 1012, 1012, 1012, 1099,
+ 1099, 1099, 1024, 1024, 1024, 1024, 1740, 1108, 2117, 1092,
+ 1092, 1092, 1092, 1740, 2360, 2117, 1012, 1012, 1012, 1012,
+
+ 1024, 1092, 1278, 1099, 1092, 1278, 1337, 1337, 1337, 1337,
+ 1748, 1092, 1092, 1092, 1748, 1768, 1618, 1337, 2361, 1768,
+ 1096, 1096, 1096, 1096, 1278, 2107, 1278, 1012, 1012, 1012,
+ 1012, 1012, 1096, 1099, 1024, 1096, 1092, 1093, 1093, 1093,
+ 1093, 2107, 2362, 1096, 1096, 1749, 1024, 1749, 1093, 1093,
+ 1024, 1750, 1093, 1024, 1851, 1620, 1620, 1851, 1024, 1093,
+ 1093, 1093, 1750, 1100, 1100, 1100, 1100, 1096, 2106, 2363,
+ 1100, 1123, 1123, 1123, 1123, 1100, 1100, 1948, 1123, 1102,
+ 1102, 1102, 1102, 2106, 1093, 1100, 1102, 1105, 1105, 1105,
+ 1105, 1102, 1102, 1123, 1105, 1093, 1621, 1621, 1948, 1105,
+
+ 1620, 1102, 1127, 1127, 1127, 1127, 1105, 1105, 1105, 1105,
+ 1128, 1128, 1128, 1128, 2173, 1144, 1144, 1144, 1144, 2173,
+ 1969, 1128, 1128, 1969, 1127, 1128, 1144, 1144, 1624, 1624,
+ 1144, 1624, 1128, 1128, 1128, 1123, 1434, 1144, 1144, 1144,
+ 1434, 1621, 1100, 2364, 1222, 2013, 1624, 1222, 1434, 2365,
+ 1123, 1222, 1128, 1434, 2013, 2013, 1222, 1128, 1102, 1622,
+ 1622, 1434, 1144, 1222, 1222, 1222, 1105, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 2123, 2369, 2123,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1145, 1145, 1145, 1145,
+
+ 1286, 1286, 1286, 1286, 1622, 2077, 1682, 1145, 1145, 1682,
+ 2127, 1145, 2127, 1132, 1132, 1132, 1132, 2077, 1145, 1145,
+ 1149, 1149, 1286, 2371, 1286, 1149, 1149, 1167, 1167, 1167,
+ 1167, 1328, 1328, 1328, 1328, 1149, 2057, 2058, 1167, 1167,
+ 2057, 2058, 1167, 1145, 1132, 1132, 1132, 1132, 1132, 1167,
+ 1167, 1167, 2134, 1328, 2310, 1335, 1335, 1335, 1335, 2134,
+ 1682, 1213, 1213, 1213, 1213, 2068, 2068, 1338, 1338, 1338,
+ 1338, 1682, 1213, 1213, 1167, 2310, 1213, 1335, 1338, 1644,
+ 1644, 1644, 1644, 2372, 1213, 1213, 1644, 1149, 1161, 1161,
+ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161,
+
+ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1213, 2078,
+ 2068, 1161, 1161, 1161, 1161, 1161, 1161, 1214, 1214, 1214,
+ 1214, 2078, 1218, 1775, 1776, 1218, 1775, 1776, 1214, 1214,
+ 1775, 1776, 1214, 1218, 1161, 1161, 1161, 1161, 1218, 1218,
+ 1214, 2135, 1997, 1161, 1218, 1997, 1218, 1215, 1215, 1215,
+ 1215, 2373, 2135, 1332, 1332, 1332, 1332, 2109, 1215, 1215,
+ 1332, 2109, 1215, 2124, 1214, 1161, 1161, 1161, 1161, 1161,
+ 1215, 1215, 2124, 1240, 1757, 1332, 1240, 1757, 1992, 2113,
+ 1218, 1992, 1241, 2113, 1240, 1241, 1757, 1437, 1437, 1240,
+ 1240, 1997, 2129, 1241, 1215, 1240, 1437, 1240, 1241, 1241,
+
+ 1242, 2374, 1994, 1242, 1241, 1994, 1241, 2129, 2375, 1437,
+ 1437, 1242, 1333, 1333, 1333, 1333, 1242, 1242, 1742, 1333,
+ 2131, 1435, 1242, 1742, 1242, 1435, 1244, 2120, 1742, 1244,
+ 1742, 2120, 1332, 1435, 1333, 2131, 2136, 1244, 1435, 1992,
+ 2075, 1240, 1244, 1244, 1245, 2376, 1435, 1245, 1244, 2075,
+ 1244, 2136, 1241, 2377, 1994, 1245, 1591, 1591, 1592, 1592,
+ 1245, 1245, 2140, 2075, 2140, 1591, 1245, 1592, 1245, 1242,
+ 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243,
+ 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243,
+ 1244, 1333, 2378, 1243, 1243, 1243, 1243, 1243, 1243, 1998,
+
+ 2160, 1591, 1998, 1592, 1246, 1245, 2379, 1246, 1462, 1462,
+ 1462, 1462, 2380, 2160, 2137, 1246, 1243, 1243, 1243, 1243,
+ 1246, 1246, 1247, 2381, 1739, 1247, 1246, 1739, 1246, 2137,
+ 1462, 2383, 1462, 1247, 1472, 1472, 1472, 1472, 1247, 1247,
+ 1739, 1739, 1248, 2152, 1247, 1248, 1247, 1243, 1243, 1243,
+ 1243, 1243, 2152, 1248, 1246, 2384, 1472, 1249, 1248, 1248,
+ 1249, 1942, 1998, 2386, 1248, 1942, 1248, 1250, 1249, 2125,
+ 1250, 2389, 2125, 1249, 1249, 1940, 1247, 1952, 1250, 1249,
+ 1952, 1249, 1251, 1250, 1250, 1251, 1942, 1991, 1940, 1250,
+ 1991, 1250, 1252, 1251, 1248, 1252, 1940, 2185, 1251, 1251,
+
+ 1615, 1615, 1754, 1252, 1251, 1754, 1251, 2185, 1252, 1252,
+ 1253, 1439, 1615, 1253, 1252, 1439, 1252, 1615, 1754, 1754,
+ 2169, 1253, 1261, 1439, 1249, 1261, 1253, 1253, 1439, 2169,
+ 2125, 1952, 1253, 1261, 1253, 1250, 1439, 1262, 1261, 1261,
+ 1262, 1991, 1252, 2130, 1261, 1615, 1261, 2130, 1262, 2391,
+ 1251, 1251, 1263, 1262, 1262, 1263, 2395, 1777, 2139, 1262,
+ 1777, 1262, 2139, 1263, 1253, 2401, 2402, 1264, 1263, 1263,
+ 1264, 1945, 2403, 1261, 1263, 1945, 1263, 1265, 1264, 1777,
+ 1265, 1777, 2141, 1264, 1264, 2404, 2141, 1266, 1265, 1264,
+ 1266, 1264, 2159, 1265, 1265, 2159, 1945, 1993, 1266, 1265,
+
+ 1993, 1265, 1263, 1266, 1266, 2000, 2405, 1267, 2000, 1266,
+ 1267, 1266, 2043, 2406, 1995, 2043, 1268, 1995, 1267, 1268,
+ 2138, 1264, 2161, 1267, 1267, 1269, 2161, 1268, 1269, 1267,
+ 2043, 1267, 1268, 1268, 1272, 2138, 1269, 1272, 1268, 1265,
+ 1268, 1269, 1269, 1270, 2407, 1272, 1270, 1269, 1266, 1269,
+ 1272, 1272, 1274, 1949, 1270, 1274, 1272, 1949, 1272, 1270,
+ 1270, 1267, 2142, 1274, 2143, 1270, 1993, 1270, 1274, 1274,
+ 1374, 1374, 2000, 1374, 1274, 1269, 1274, 2142, 1949, 2143,
+ 2204, 1374, 1996, 1995, 1268, 1996, 1374, 1374, 1272, 2408,
+ 2069, 2069, 2204, 1270, 1271, 1271, 1271, 1271, 1271, 1271,
+
+ 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
+ 1271, 1271, 1271, 1271, 2409, 2410, 1274, 1271, 1271, 1271,
+ 1271, 1271, 1271, 1645, 1645, 1645, 1645, 2411, 1273, 1951,
+ 1645, 1273, 2149, 1951, 1440, 2069, 1996, 2412, 1440, 1273,
+ 1271, 1271, 1271, 1271, 1273, 1273, 1440, 2149, 2438, 1271,
+ 1273, 1440, 1273, 2455, 1951, 1463, 1463, 1463, 1463, 1440,
+ 2456, 1999, 1463, 2063, 1999, 2154, 2063, 1275, 2070, 2070,
+ 1275, 1271, 1271, 1271, 1271, 1271, 1276, 1463, 1275, 1276,
+ 2154, 2063, 1273, 1275, 1275, 1284, 2165, 1276, 1284, 1275,
+ 2165, 1275, 1276, 1276, 1285, 2168, 1284, 1285, 1276, 2168,
+
+ 1276, 1284, 1284, 1288, 2171, 1285, 1288, 1284, 2171, 1284,
+ 1285, 1285, 2427, 2070, 1288, 2426, 1285, 1999, 1285, 1288,
+ 1288, 1275, 2133, 2133, 2158, 1288, 1290, 1288, 2172, 1290,
+ 1292, 2133, 2172, 1292, 1463, 1782, 2426, 1290, 1782, 2158,
+ 1276, 1292, 1290, 1290, 2427, 2471, 1292, 1292, 1290, 2145,
+ 1290, 2145, 1292, 2472, 1292, 2073, 2073, 1782, 1285, 1782,
+ 2424, 1288, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289,
+ 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289,
+ 1289, 1289, 1290, 2425, 1292, 1289, 1289, 1289, 1289, 1289,
+ 1289, 2424, 1467, 1467, 1467, 1467, 1291, 2473, 2115, 1291,
+
+ 2073, 2115, 2445, 1466, 1466, 1466, 1466, 1291, 1289, 1289,
+ 1289, 1289, 1291, 1291, 1467, 2441, 1467, 1289, 1291, 2425,
+ 1291, 1649, 1649, 1649, 1649, 1466, 2430, 1466, 1665, 1665,
+ 1665, 1665, 1649, 1293, 2441, 1665, 1293, 2475, 2445, 1289,
+ 1289, 1289, 1289, 1289, 1293, 1294, 1291, 2115, 1294, 1293,
+ 1293, 1464, 1464, 1464, 1464, 1293, 1294, 1293, 1464, 1467,
+ 1295, 1294, 1294, 1295, 1466, 2430, 2146, 1294, 2146, 1294,
+ 2156, 1295, 2156, 1464, 2051, 2051, 1295, 1295, 2051, 2157,
+ 1296, 2157, 1295, 1296, 1295, 2122, 2122, 2122, 2122, 1297,
+ 2431, 1296, 1297, 2393, 1293, 2393, 1296, 1296, 1298, 1294,
+
+ 1297, 1298, 1296, 2476, 1296, 1297, 1297, 1299, 2312, 1298,
+ 1299, 1297, 2312, 1297, 1298, 1298, 2463, 2442, 1299, 2051,
+ 1298, 2437, 1298, 1299, 1299, 1587, 1587, 1295, 2431, 1299,
+ 1464, 1299, 1300, 2312, 1587, 1300, 2442, 1587, 1297, 2122,
+ 2463, 1301, 1587, 1300, 1301, 2477, 2436, 1296, 1300, 1300,
+ 1302, 2478, 1301, 1302, 1300, 2314, 1300, 1301, 1301, 2314,
+ 2394, 1302, 2394, 1301, 2437, 1301, 1302, 1302, 1303, 1298,
+ 1587, 1303, 1302, 2436, 1302, 2429, 1299, 2432, 1304, 1303,
+ 2314, 1304, 2440, 2382, 1303, 1303, 2382, 2439, 1305, 1304,
+ 1303, 1305, 1303, 1300, 1304, 1304, 2429, 2444, 2432, 1305,
+
+ 1304, 2382, 1304, 2440, 1305, 1305, 2054, 2054, 1302, 1301,
+ 1305, 1306, 1305, 2439, 1306, 2054, 2444, 1471, 1471, 1471,
+ 1471, 1307, 1306, 2452, 1307, 2449, 2479, 1306, 1306, 2480,
+ 2443, 1303, 1307, 1306, 2481, 1306, 2482, 1307, 1307, 1471,
+ 2450, 1471, 1304, 1307, 2453, 1307, 1308, 2191, 1528, 1308,
+ 2191, 2054, 1528, 2443, 1528, 2449, 1309, 1308, 1305, 1309,
+ 1528, 2452, 1308, 1308, 2446, 1528, 1306, 1309, 1308, 2191,
+ 1308, 2191, 1309, 1309, 1310, 1529, 2450, 1310, 1309, 1529,
+ 1309, 1529, 2453, 1311, 2447, 1310, 1311, 1529, 1307, 2468,
+ 1310, 1310, 1529, 1528, 1311, 2483, 1310, 2446, 1310, 1311,
+
+ 1311, 1312, 2484, 2448, 1312, 1311, 2447, 1311, 2464, 1308,
+ 1309, 1313, 1312, 2451, 1313, 2457, 2458, 1312, 1312, 2468,
+ 1529, 2485, 1313, 1312, 2460, 1312, 2448, 1313, 1313, 1661,
+ 1661, 1661, 1661, 1313, 1314, 1313, 2451, 1314, 2457, 2464,
+ 1661, 1311, 1944, 1310, 1315, 1314, 1944, 1315, 2486, 2462,
+ 1314, 1314, 2458, 1311, 1944, 1315, 1314, 2460, 1314, 1944,
+ 1315, 1315, 1316, 1313, 2497, 1316, 1315, 1944, 1315, 2555,
+ 1312, 1317, 2462, 1316, 1317, 2556, 2055, 2055, 1316, 1316,
+ 1320, 2557, 1317, 1320, 1316, 2055, 1316, 1317, 1317, 1318,
+ 2559, 1320, 1318, 1317, 2465, 1317, 1320, 1320, 1319, 1314,
+
+ 1318, 1319, 1320, 2560, 1320, 1318, 1318, 1321, 2461, 1319,
+ 1321, 1318, 1315, 1318, 1319, 1319, 1322, 2465, 1321, 1322,
+ 1319, 2055, 1319, 1321, 1321, 1323, 1316, 1322, 1323, 1321,
+ 2470, 1321, 1322, 1322, 1317, 2554, 1323, 2561, 1322, 2562,
+ 1322, 1323, 1323, 1318, 1320, 1324, 2461, 1323, 1324, 1323,
+ 1804, 2459, 1319, 1804, 2459, 2563, 1324, 2469, 2565, 2566,
+ 1325, 1324, 1324, 1325, 2567, 1321, 2568, 1324, 2470, 1324,
+ 2569, 1325, 1804, 2570, 1804, 1326, 1325, 1325, 1326, 1322,
+ 2571, 2554, 1325, 2580, 1325, 1327, 1326, 2469, 1327, 2581,
+ 2582, 1326, 1326, 2585, 1323, 2586, 1327, 1326, 1324, 1326,
+
+ 2459, 1327, 1327, 1637, 1804, 1339, 1339, 1327, 1339, 1327,
+ 1325, 2587, 1637, 1637, 1637, 2588, 1339, 1340, 1340, 2589,
+ 1340, 1339, 1339, 1758, 2590, 1326, 1758, 1339, 1340, 1339,
+ 1758, 2074, 2074, 1340, 1340, 1758, 1637, 1341, 1341, 1340,
+ 1341, 1340, 1758, 1758, 1758, 2591, 1327, 2592, 1341, 2085,
+ 2085, 2085, 2085, 1341, 1341, 1666, 1666, 1666, 1666, 1341,
+ 2085, 1341, 2593, 2594, 1343, 1343, 1637, 1343, 1344, 1344,
+ 2595, 1344, 2596, 1339, 2597, 1343, 2074, 1666, 2598, 1344,
+ 1343, 1343, 2599, 2600, 1344, 1344, 1343, 1340, 1343, 2601,
+ 1344, 2602, 1344, 1854, 1854, 1854, 1854, 2603, 2017, 2604,
+
+ 1854, 2605, 2017, 2606, 2017, 2609, 1341, 1342, 1342, 1342,
+ 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342,
+ 1342, 1342, 1342, 1342, 1342, 1342, 1342, 2611, 1343, 1344,
+ 1342, 1342, 1342, 1342, 1342, 1342, 2170, 2170, 2170, 2170,
+ 2612, 1345, 1345, 2017, 1345, 2613, 2614, 1469, 1469, 1469,
+ 1469, 2615, 1345, 1342, 1342, 1342, 1342, 1345, 1345, 1346,
+ 1346, 2616, 1346, 1345, 2607, 1345, 2617, 2618, 2619, 1469,
+ 1346, 1469, 2620, 2621, 2622, 1346, 1346, 2629, 2607, 1347,
+ 1347, 1346, 1347, 1346, 1342, 1342, 1342, 1342, 1342, 2642,
+ 1347, 1345, 2654, 2622, 2634, 1347, 1347, 2636, 1469, 1348,
+
+ 1348, 1347, 1348, 1347, 1667, 1667, 1667, 1667, 1349, 1349,
+ 1348, 1349, 2634, 1346, 2655, 1348, 1348, 1350, 1350, 1349,
+ 1350, 1348, 2641, 1348, 1349, 1349, 1667, 2635, 1350, 2666,
+ 1349, 1347, 1349, 1350, 1350, 2636, 2663, 1351, 1351, 1350,
+ 1351, 1350, 1668, 1668, 1668, 1668, 1352, 1352, 1351, 1352,
+ 2635, 2640, 2573, 1351, 1351, 2573, 2669, 1352, 2663, 1351,
+ 2641, 1351, 1352, 1352, 1668, 2645, 1348, 2670, 1352, 2640,
+ 1352, 2671, 1353, 1353, 2573, 1353, 1349, 1848, 1848, 1848,
+ 1848, 1358, 1358, 1353, 1358, 1350, 1350, 1351, 1353, 1353,
+ 1359, 1359, 1358, 1359, 1353, 2645, 1353, 1358, 1358, 1848,
+
+ 1352, 1359, 2672, 1358, 1533, 1358, 1359, 1359, 1533, 2673,
+ 1533, 2638, 1359, 2674, 1359, 2651, 1533, 1360, 1360, 2644,
+ 1360, 1533, 2610, 2610, 2675, 2610, 1361, 1361, 1360, 1361,
+ 2638, 2647, 1358, 1360, 1360, 1362, 1362, 1361, 1362, 1360,
+ 2644, 1360, 1361, 1361, 1363, 1363, 1362, 1363, 1361, 1533,
+ 1361, 1362, 1362, 1364, 1364, 1363, 1364, 1362, 2651, 1362,
+ 1363, 1363, 1365, 1365, 1364, 1365, 1363, 2647, 1363, 1364,
+ 1364, 1360, 2639, 1365, 2676, 1364, 2646, 1364, 1365, 1365,
+ 1470, 1470, 1470, 1470, 1365, 2657, 1365, 2019, 1361, 1366,
+ 1366, 2019, 1366, 2019, 2677, 2639, 1362, 2646, 1363, 2648,
+
+ 1366, 2678, 1470, 2659, 1470, 1366, 1366, 1368, 1368, 2679,
+ 1368, 1366, 1365, 1366, 1468, 1468, 1468, 1468, 1368, 2657,
+ 2680, 1364, 2648, 1368, 1368, 2579, 2579, 2579, 2579, 1368,
+ 1470, 1368, 2019, 2656, 2687, 2659, 1468, 2652, 1468, 1366,
+ 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367,
+ 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367,
+ 2652, 1368, 2658, 1367, 1367, 1367, 1367, 1367, 1367, 2656,
+ 1475, 1475, 1475, 1475, 1369, 1369, 2660, 1369, 1478, 1478,
+ 1478, 1478, 1468, 2658, 2723, 1369, 1367, 1367, 1367, 1367,
+ 1369, 1369, 1475, 2724, 1475, 1367, 1369, 2726, 1369, 2660,
+
+ 1478, 2579, 1478, 2729, 1849, 1849, 1849, 1849, 2422, 2422,
+ 2422, 2422, 2730, 1370, 1370, 2422, 1370, 1367, 1367, 1367,
+ 1367, 1367, 1371, 1371, 1370, 1371, 1849, 2723, 1369, 1370,
+ 1370, 1372, 1372, 1371, 1372, 1370, 2732, 1370, 1371, 1371,
+ 1373, 1373, 1372, 1373, 1371, 1478, 1371, 1372, 1372, 1378,
+ 1378, 1373, 1378, 1372, 2661, 1372, 1373, 1373, 1379, 1379,
+ 1378, 1379, 1373, 2734, 1373, 1378, 1378, 1380, 1380, 1379,
+ 1380, 1378, 2735, 1378, 1379, 1379, 1371, 1370, 1380, 2736,
+ 1379, 2740, 1379, 1380, 1380, 2662, 2661, 1385, 1385, 1380,
+ 1385, 1380, 2741, 2649, 2649, 1372, 2649, 2667, 1385, 1382,
+
+ 1382, 1534, 1382, 1385, 1385, 1534, 2742, 1534, 2662, 1385,
+ 1382, 1385, 2743, 1534, 2744, 1382, 1382, 2745, 1534, 2746,
+ 2667, 1382, 1379, 1382, 2649, 1380, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1534, 2747, 1385, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1382, 1476, 1476, 1476, 1476,
+ 1383, 1383, 2650, 1383, 2748, 2650, 1477, 1477, 1477, 1477,
+ 2749, 1383, 1381, 1381, 1381, 1381, 1383, 1383, 1476, 2750,
+ 1476, 1381, 1383, 2751, 1383, 2752, 1680, 1680, 1477, 2753,
+ 1477, 1680, 1680, 2650, 2754, 2755, 2756, 1384, 1384, 2757,
+
+ 1384, 1680, 2758, 1381, 1381, 1381, 1381, 1381, 1384, 2759,
+ 1383, 2760, 1476, 1384, 1384, 1386, 1386, 2763, 1386, 1384,
+ 1477, 1384, 2764, 2765, 1387, 1387, 1386, 1387, 2766, 2767,
+ 2768, 1386, 1386, 1388, 1388, 1387, 1388, 1386, 2769, 1386,
+ 1387, 1387, 2761, 2761, 1388, 2761, 1387, 2770, 1387, 1388,
+ 1388, 1384, 2022, 1680, 2771, 1388, 2022, 1388, 2022, 1389,
+ 1389, 2018, 1389, 1390, 1390, 2018, 1390, 2018, 2737, 1386,
+ 1389, 2737, 2786, 2018, 1390, 1389, 1389, 2788, 2018, 1390,
+ 1390, 1389, 2789, 1389, 2798, 1390, 2799, 1390, 2779, 2762,
+ 2737, 1387, 2762, 1391, 1391, 2780, 1391, 2022, 2778, 2778,
+
+ 1388, 2772, 1392, 1392, 1391, 1392, 2018, 2762, 1389, 1391,
+ 1391, 1393, 1393, 1392, 1393, 1391, 2780, 1391, 1392, 1392,
+ 1394, 1394, 1393, 1394, 1392, 2779, 1392, 1393, 1393, 1395,
+ 1395, 1394, 1395, 1393, 1390, 1393, 1394, 1394, 2800, 2772,
+ 1395, 2790, 1394, 2801, 1394, 1395, 1395, 2791, 2802, 1396,
+ 1396, 1395, 1396, 1395, 1855, 1855, 1855, 1855, 1397, 1397,
+ 1396, 1397, 1391, 1392, 2790, 1396, 1396, 2803, 2808, 1397,
+ 2791, 1396, 2809, 1396, 1397, 1397, 1855, 2805, 1394, 1393,
+ 1397, 2812, 1397, 1398, 1398, 2813, 1398, 1483, 1483, 1483,
+ 1483, 1577, 1577, 1395, 1398, 1577, 2805, 2814, 2796, 1398,
+
+ 1398, 1399, 1399, 1577, 1399, 1398, 2808, 1398, 1577, 1483,
+ 2815, 1483, 1399, 1397, 2816, 2804, 2817, 1399, 1399, 1396,
+ 2796, 1400, 1400, 1399, 1400, 1399, 2818, 2819, 2820, 2835,
+ 1401, 1401, 1400, 1401, 2806, 2836, 1577, 1400, 1400, 2668,
+ 1483, 1401, 2668, 1400, 2668, 1400, 1401, 1401, 2837, 2834,
+ 1398, 2804, 1401, 2023, 1401, 1402, 1402, 2023, 1402, 2023,
+ 2839, 2806, 2840, 2668, 1399, 2841, 1402, 1403, 1403, 2842,
+ 1403, 1402, 1402, 2843, 2844, 1400, 2367, 1402, 1403, 1402,
+ 2367, 2834, 2367, 1403, 1403, 1404, 1404, 2845, 1404, 1403,
+ 2846, 1403, 2847, 2848, 1405, 1405, 1404, 1405, 2023, 1401,
+
+ 2849, 1404, 1404, 1861, 1861, 1405, 1861, 1404, 2850, 1404,
+ 1405, 1405, 2852, 1402, 1861, 2853, 1405, 2854, 1405, 1861,
+ 1861, 2367, 2855, 1406, 1406, 1402, 1406, 2086, 2086, 2086,
+ 2086, 2857, 1407, 1407, 1406, 1407, 1403, 1404, 2086, 1406,
+ 1406, 1408, 1408, 1407, 1408, 1406, 2865, 1406, 1407, 1407,
+ 2807, 2867, 1408, 2807, 1407, 2869, 1407, 1408, 1408, 1405,
+ 2872, 1409, 1409, 1408, 1409, 1408, 1480, 1480, 1480, 1480,
+ 1410, 1410, 1409, 1410, 2807, 2873, 2878, 1409, 1409, 2810,
+ 2862, 1410, 2810, 1409, 2810, 1409, 1410, 1410, 1480, 2368,
+ 1480, 1406, 1410, 2368, 1410, 2368, 1407, 1411, 1411, 2858,
+
+ 1411, 2879, 2880, 2810, 1408, 2861, 1412, 1412, 1411, 1412,
+ 2881, 2882, 2861, 1411, 1411, 1409, 2884, 1412, 2862, 1411,
+ 1480, 1411, 1412, 1412, 1410, 2890, 1413, 1413, 1412, 1413,
+ 1412, 2891, 2858, 2892, 2368, 1414, 1414, 1413, 1414, 2893,
+ 2052, 2052, 1413, 1413, 2052, 2894, 1414, 2902, 1413, 2875,
+ 1413, 1414, 1414, 2886, 2863, 1415, 1415, 1414, 1415, 1414,
+ 2875, 1411, 2851, 2887, 1412, 2851, 1415, 2247, 2247, 2247,
+ 2247, 1415, 1415, 2863, 2247, 1416, 1416, 1415, 1416, 1415,
+ 2851, 1479, 1479, 1479, 1479, 2052, 1416, 2885, 2901, 1413,
+ 2886, 1416, 1416, 2903, 2904, 1417, 1417, 1416, 1417, 1416,
+
+ 2905, 2906, 2907, 1479, 1414, 1479, 1417, 2887, 1415, 2908,
+ 2885, 1417, 1417, 1418, 1418, 2909, 1418, 1417, 2901, 1417,
+ 1640, 1640, 1640, 1640, 1418, 1416, 2910, 1640, 2911, 1418,
+ 1418, 1481, 1481, 1481, 1481, 1418, 2912, 1418, 1482, 1482,
+ 1482, 1482, 1640, 2913, 1479, 1417, 2247, 1484, 1484, 1484,
+ 1484, 2915, 2914, 1481, 2918, 1481, 1485, 1485, 1485, 1485,
+ 1482, 2914, 1482, 2922, 1630, 1630, 1630, 1630, 2923, 1484,
+ 2922, 1484, 2927, 2931, 1418, 2923, 1630, 2932, 1485, 1630,
+ 1485, 2924, 1641, 1641, 1641, 1641, 1630, 1630, 1630, 1481,
+ 1631, 1631, 1631, 1631, 1641, 2943, 1482, 1484, 2925, 1640,
+
+ 2919, 2925, 1631, 2947, 1641, 1631, 1485, 1632, 1632, 1632,
+ 1632, 1630, 1631, 1631, 2524, 2524, 2524, 2524, 2924, 1632,
+ 2925, 2524, 1632, 1633, 1633, 1633, 1633, 2948, 2933, 1632,
+ 1632, 1632, 2949, 2951, 1633, 1633, 2919, 1631, 1633, 2933,
+ 1634, 1634, 1634, 1634, 2954, 1633, 1633, 1633, 2950, 2956,
+ 2936, 2950, 1634, 2936, 1632, 1634, 1635, 1635, 1635, 1635,
+ 2952, 2936, 2953, 1634, 1634, 2958, 2960, 2954, 1635, 2961,
+ 1633, 1635, 2962, 1636, 1636, 1636, 1636, 2970, 2971, 1635,
+ 2558, 2558, 2558, 2558, 2972, 1636, 2973, 1634, 1636, 2974,
+ 2976, 1633, 1642, 1642, 1642, 1642, 1636, 1636, 2952, 1642,
+
+ 2953, 2977, 2558, 1635, 1642, 2979, 1966, 1966, 1966, 1966,
+ 2980, 1642, 1642, 1642, 1642, 1643, 1643, 1643, 1643, 2997,
+ 1636, 2969, 1643, 2988, 2969, 2986, 2986, 1643, 1966, 3003,
+ 1966, 2995, 2969, 3002, 1643, 1643, 1643, 1643, 1646, 1646,
+ 1646, 1646, 2995, 2969, 3002, 1646, 1662, 1662, 1662, 1662,
+ 1646, 2989, 3004, 1662, 2989, 3006, 2558, 1646, 1646, 1646,
+ 1646, 2988, 1663, 1663, 1663, 1663, 3008, 2983, 1662, 1663,
+ 2983, 1642, 3011, 3012, 1664, 1664, 1664, 1664, 2983, 3013,
+ 1675, 1675, 1675, 1675, 1663, 1664, 1664, 3007, 3008, 1664,
+ 2991, 1675, 1675, 2991, 1643, 1675, 1664, 1664, 1664, 3021,
+
+ 3022, 2991, 1675, 1675, 1675, 3007, 1968, 1968, 1968, 1968,
+ 1662, 1676, 1676, 1676, 1676, 3024, 3025, 1646, 3027, 3028,
+ 3030, 1664, 1676, 1676, 3037, 1662, 1676, 1675, 1968, 3018,
+ 1968, 3043, 3018, 1676, 1676, 2100, 2100, 2100, 2100, 1664,
+ 3018, 1663, 1690, 1690, 1690, 1690, 2100, 3044, 1691, 1691,
+ 1691, 1691, 3009, 1690, 1690, 3009, 3033, 1690, 1676, 1691,
+ 1691, 3033, 3035, 1691, 1690, 1690, 1690, 3041, 3047, 3045,
+ 1691, 1691, 1759, 3035, 3009, 1759, 3048, 3053, 3041, 1759,
+ 2631, 2631, 2631, 2631, 1759, 3046, 3054, 2631, 3046, 1690,
+ 3045, 1759, 1759, 1759, 3055, 1691, 1695, 1695, 1695, 1695,
+
+ 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695,
+ 1695, 1695, 1695, 1695, 1695, 1695, 3056, 3057, 3058, 1695,
+ 1695, 1695, 1695, 1695, 1695, 1702, 1702, 1702, 1702, 3067,
+ 3078, 1980, 1980, 1980, 1980, 1779, 1702, 1702, 1779, 3080,
+ 1702, 3079, 1695, 1695, 1695, 1695, 1779, 1702, 1702, 1702,
+ 3081, 1779, 1779, 1980, 3086, 1980, 3087, 1779, 3034, 1779,
+ 3079, 3034, 3088, 1852, 1852, 1852, 1852, 3095, 3061, 3034,
+ 1852, 3061, 1702, 1695, 1695, 1695, 1695, 1695, 3103, 1702,
+ 1725, 1725, 1725, 1725, 3113, 1852, 3052, 1980, 3114, 3052,
+ 1753, 1725, 1725, 1753, 1778, 1725, 3077, 1778, 3052, 3077,
+
+ 1779, 1753, 1725, 1725, 1725, 1778, 1753, 1753, 3094, 3115,
+ 1778, 1778, 1753, 3116, 1753, 3120, 1778, 1780, 1778, 3125,
+ 1780, 1973, 1973, 1973, 1973, 3114, 3094, 1725, 1780, 3130,
+ 3135, 3140, 1725, 1780, 1780, 1788, 3150, 3019, 1788, 1780,
+ 3019, 1780, 1852, 1973, 3019, 1973, 1788, 3152, 1725, 3150,
+ 1791, 1788, 1788, 1791, 3139, 3147, 3154, 1788, 1753, 1788,
+ 3112, 1791, 1778, 3112, 3139, 3147, 1791, 1791, 2101, 2101,
+ 2101, 2101, 1791, 3050, 1791, 3134, 3050, 2182, 3134, 2101,
+ 3050, 2181, 1973, 3131, 1780, 1789, 1789, 1789, 1789, 1789,
+ 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
+
+ 1789, 1789, 1789, 1789, 1789, 3155, 3155, 1791, 1789, 1789,
+ 1789, 1789, 1789, 1789, 2180, 1977, 1977, 1977, 1977, 1790,
+ 3153, 3131, 1790, 1975, 1975, 1975, 1975, 3153, 2179, 2178,
+ 1790, 1789, 1789, 1789, 1789, 1790, 1790, 1977, 2177, 1977,
+ 1789, 1790, 2175, 1790, 2174, 1975, 2166, 1975, 3236, 2397,
+ 2397, 2397, 2397, 3236, 3051, 3143, 1792, 3051, 3143, 1792,
+ 2397, 3051, 1789, 1789, 1789, 1789, 1789, 1792, 2162, 1977,
+ 2151, 1793, 1792, 1792, 1793, 1975, 2150, 2148, 1792, 1790,
+ 1792, 1794, 1793, 2147, 1794, 3310, 2132, 1793, 1793, 2126,
+ 3310, 1795, 1794, 1793, 1795, 1793, 2119, 1794, 1794, 2118,
+
+ 2108, 1796, 1795, 1794, 1796, 1794, 2104, 1795, 1795, 2099,
+ 2098, 1797, 1796, 1795, 1797, 1795, 2097, 1796, 1796, 2096,
+ 2095, 2093, 1797, 1796, 1792, 1796, 1798, 1797, 1797, 1798,
+ 2092, 2091, 2090, 1797, 2089, 1797, 2088, 1798, 1799, 1794,
+ 1793, 1799, 1798, 1798, 2105, 2105, 2105, 2105, 1798, 1799,
+ 1798, 2105, 2084, 2083, 1799, 1799, 2398, 2398, 2398, 2398,
+ 1799, 1795, 1799, 1800, 2076, 3083, 1800, 2398, 3083, 2072,
+ 1796, 2067, 1797, 1801, 1800, 3156, 1801, 3083, 3156, 1800,
+ 1800, 2066, 2064, 1802, 1801, 1800, 1802, 1800, 1798, 1801,
+ 1801, 2062, 2061, 2059, 1802, 1801, 1799, 1801, 1803, 1802,
+
+ 1802, 1803, 2048, 2046, 2044, 1802, 3156, 1802, 2105, 1803,
+ 2632, 2632, 2632, 2632, 1803, 1803, 3085, 2632, 1805, 3085,
+ 1803, 1805, 1803, 2105, 2042, 2945, 2039, 1801, 3085, 1805,
+ 1800, 2945, 2945, 2037, 1805, 1805, 1806, 2036, 2945, 1806,
+ 1805, 2035, 1805, 2034, 1802, 2033, 2945, 1806, 1807, 2032,
+ 2031, 1807, 1806, 1806, 2704, 2704, 2704, 2704, 1806, 1807,
+ 1806, 2704, 2030, 1808, 1807, 1807, 1808, 1803, 1805, 2029,
+ 1807, 2028, 1807, 1809, 1808, 2027, 1809, 2787, 2787, 1808,
+ 1808, 2026, 2787, 2787, 1809, 1808, 2025, 1808, 2015, 1809,
+ 1809, 1810, 2787, 2011, 1810, 1809, 2945, 1809, 2945, 1806,
+
+ 1811, 2010, 1810, 1811, 2866, 2866, 2009, 1810, 1810, 2866,
+ 2866, 1811, 2008, 1810, 2007, 1810, 1811, 1811, 3074, 2866,
+ 1807, 3074, 1811, 2006, 1811, 1812, 2005, 1808, 1812, 3074,
+ 2004, 1972, 1972, 1972, 1972, 1813, 1812, 2003, 1813, 2002,
+ 1809, 1812, 1812, 2001, 2787, 1814, 1813, 1812, 1814, 1812,
+ 1990, 1813, 1813, 1972, 1989, 1972, 1814, 1813, 1810, 1813,
+ 1988, 1814, 1814, 1811, 1987, 1815, 1986, 1814, 1815, 1814,
+ 1985, 2866, 3092, 1984, 1816, 3092, 1815, 1816, 1983, 3181,
+ 3181, 1815, 1815, 3092, 3181, 1816, 1813, 1815, 3181, 1815,
+ 1816, 1816, 1812, 1970, 1817, 1965, 1816, 1817, 1816, 1964,
+
+ 1972, 3005, 1963, 1818, 3005, 1817, 1818, 1962, 1961, 1960,
+ 1817, 1817, 1819, 1814, 1818, 1819, 1817, 1959, 1817, 1818,
+ 1818, 1820, 1958, 1819, 1820, 1818, 1816, 1818, 1819, 1819,
+ 1815, 1957, 1820, 1956, 1819, 1955, 1819, 1820, 1820, 1821,
+ 1954, 1953, 1821, 1820, 1817, 1820, 2399, 2399, 2399, 2399,
+ 1821, 1822, 1950, 3005, 1822, 1821, 1821, 2399, 1943, 1937,
+ 1936, 1821, 1822, 1821, 1935, 1934, 1933, 1822, 1822, 3005,
+ 1818, 1820, 1932, 1822, 1931, 1822, 2990, 1819, 1823, 2990,
+ 1930, 1823, 1929, 2521, 2521, 2521, 2521, 2990, 1824, 1823,
+ 2521, 1824, 1928, 1821, 1823, 1823, 1927, 1925, 2990, 1824,
+
+ 1823, 1923, 1823, 1825, 1824, 1824, 1825, 1863, 1856, 1822,
+ 1824, 1787, 1824, 1826, 1825, 1786, 1826, 1784, 1773, 1825,
+ 1825, 1772, 1771, 1827, 1826, 1825, 1827, 1825, 1770, 1826,
+ 1826, 1769, 1823, 1828, 1827, 1826, 1828, 1826, 1767, 1827,
+ 1827, 1766, 1765, 1829, 1828, 1827, 1829, 1827, 1764, 1828,
+ 1828, 1763, 1761, 1760, 1829, 1828, 1824, 1828, 1830, 1829,
+ 1829, 1830, 2521, 1755, 1752, 1829, 1751, 1829, 1719, 1830,
+ 1831, 1713, 1825, 1831, 1830, 1830, 1982, 1982, 1982, 1982,
+ 1830, 1831, 1830, 1681, 1826, 1679, 1831, 1831, 1832, 1672,
+ 1827, 1832, 1831, 1669, 1831, 1660, 1659, 1829, 1982, 1832,
+
+ 1982, 1658, 1828, 1833, 1832, 1832, 1833, 1830, 1657, 1656,
+ 1832, 1654, 1832, 1834, 1833, 1653, 1834, 1652, 1651, 1833,
+ 1833, 1650, 1830, 1835, 1834, 1833, 1835, 1833, 1831, 1834,
+ 1834, 1648, 1647, 3075, 1835, 1834, 3075, 1834, 1619, 1835,
+ 1835, 1617, 1612, 1982, 3075, 1835, 1836, 1835, 1609, 1836,
+ 3105, 1832, 1607, 3105, 1605, 1833, 3119, 1836, 1594, 3119,
+ 1584, 3105, 1836, 1836, 1574, 1834, 1838, 3119, 1836, 1838,
+ 1836, 1974, 1974, 1974, 1974, 1839, 3106, 1838, 1839, 3106,
+ 1835, 1572, 1838, 1838, 1570, 1567, 1839, 3106, 1838, 1564,
+ 1838, 1839, 1839, 1974, 1562, 1974, 1559, 1839, 3075, 1839,
+
+ 3132, 3132, 3132, 3132, 1556, 1555, 1554, 1836, 1837, 1837,
+ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
+ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1553, 1552,
+ 1551, 1837, 1837, 1837, 1837, 1837, 1837, 1550, 1838, 1549,
+ 1974, 3106, 1840, 1839, 1548, 1840, 1976, 1976, 1976, 1976,
+ 1547, 1546, 1545, 1840, 1837, 1837, 1837, 1837, 1840, 1840,
+ 1841, 1544, 1542, 1841, 1840, 1541, 1840, 1540, 1976, 1539,
+ 1976, 1841, 1853, 1853, 1853, 1853, 1841, 1841, 1538, 1853,
+ 1842, 1525, 1841, 1842, 1841, 1837, 1837, 1837, 1837, 1837,
+ 1843, 1842, 1523, 1843, 1853, 1840, 1842, 1842, 1522, 1521,
+
+ 1840, 1843, 1842, 1520, 1842, 1840, 1843, 1843, 1844, 1519,
+ 3142, 1844, 1843, 3142, 1843, 1976, 1518, 1845, 1517, 1844,
+ 1845, 3142, 1516, 1841, 1844, 1844, 1846, 1515, 1845, 1846,
+ 1844, 1514, 1844, 1845, 1845, 1513, 1842, 1846, 1512, 1845,
+ 1511, 1845, 1846, 1846, 1847, 1510, 1843, 1847, 1846, 1509,
+ 1846, 1853, 1508, 1857, 1857, 1847, 1857, 1507, 3186, 3186,
+ 1847, 1847, 1506, 3186, 1857, 1505, 1847, 3186, 1847, 1857,
+ 1857, 1504, 1503, 1858, 1858, 1857, 1858, 1857, 1844, 3142,
+ 2705, 2705, 2705, 2705, 1858, 3108, 1845, 2705, 3108, 1858,
+ 1858, 1859, 1859, 1846, 1859, 1858, 3108, 1858, 1847, 1502,
+
+ 1860, 1860, 1859, 1860, 1501, 1500, 1499, 1859, 1859, 1865,
+ 1865, 1860, 1865, 1859, 1498, 1859, 1860, 1860, 3188, 3188,
+ 1865, 1857, 1860, 3188, 1860, 1865, 1865, 3188, 1497, 1867,
+ 1867, 1865, 1867, 1865, 2080, 2080, 2080, 2080, 1858, 3108,
+ 1867, 2080, 1496, 1494, 1493, 1867, 1867, 3039, 3039, 3039,
+ 3039, 1867, 1492, 1867, 3039, 1491, 2080, 1490, 1859, 1866,
+ 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866,
+ 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1489,
+ 1488, 1474, 1866, 1866, 1866, 1866, 1866, 1866, 1473, 1867,
+ 1461, 1460, 3144, 1868, 1868, 3144, 1868, 1459, 1458, 1978,
+
+ 1978, 1978, 1978, 3144, 1868, 1866, 1866, 1866, 1866, 1868,
+ 1868, 3190, 3190, 2080, 1866, 1868, 3190, 1868, 1457, 1456,
+ 3190, 1978, 1455, 1978, 2413, 2413, 2413, 2413, 1454, 1453,
+ 1869, 1869, 1452, 1869, 1451, 2413, 1866, 1866, 1866, 1866,
+ 1866, 1869, 1870, 1870, 1449, 1870, 1869, 1869, 1978, 1448,
+ 1868, 1447, 1869, 1870, 1869, 1446, 1445, 1444, 1870, 1870,
+ 1871, 1871, 2934, 1871, 1870, 1433, 1870, 1432, 2934, 1872,
+ 1872, 1871, 1872, 2934, 2934, 2934, 1871, 1871, 1873, 1873,
+ 1872, 1873, 1871, 2934, 1871, 1872, 1872, 1431, 1430, 1873,
+ 1429, 1872, 1427, 1872, 1873, 1873, 3137, 1426, 1869, 3137,
+
+ 1873, 1425, 1873, 1874, 1874, 3126, 1874, 3137, 3126, 1424,
+ 1423, 1870, 1875, 1875, 1874, 1875, 3126, 1422, 1871, 1874,
+ 1874, 1876, 1876, 1875, 1876, 1874, 1419, 1874, 1875, 1875,
+ 1376, 1356, 1876, 2934, 1875, 1334, 1875, 1876, 1876, 1872,
+ 1283, 1877, 1877, 1876, 1877, 1876, 3137, 1873, 1282, 1280,
+ 1878, 1878, 1877, 1878, 1260, 1259, 1257, 1877, 1877, 3126,
+ 1238, 1878, 1236, 1877, 1874, 1877, 1878, 1878, 1879, 1879,
+ 1875, 1879, 1878, 1235, 1878, 2414, 2414, 2414, 2414, 1879,
+ 1880, 1880, 1234, 1880, 1879, 1879, 2414, 1233, 1876, 1232,
+ 1879, 1880, 1879, 1231, 1229, 1877, 1880, 1880, 1881, 1881,
+
+ 1228, 1881, 1880, 1227, 1880, 1226, 1225, 1882, 1882, 1881,
+ 1882, 1878, 1224, 1223, 1881, 1881, 1883, 1883, 1882, 1883,
+ 1881, 1217, 1881, 1882, 1882, 1884, 1884, 1883, 1884, 1882,
+ 1216, 1882, 1883, 1883, 1880, 1151, 1884, 1879, 1883, 1148,
+ 1883, 1884, 1884, 1885, 1885, 2944, 1885, 1884, 1881, 1884,
+ 1126, 2944, 1886, 1886, 1885, 1886, 2944, 2944, 2944, 1885,
+ 1885, 1887, 1887, 1886, 1887, 1885, 2944, 1885, 1886, 1886,
+ 1882, 1125, 1887, 1122, 1886, 1121, 1886, 1887, 1887, 1888,
+ 1888, 1120, 1888, 1887, 1119, 1887, 1118, 1117, 1883, 1884,
+ 1888, 1889, 1889, 1115, 1889, 1888, 1888, 3101, 3101, 3101,
+
+ 3101, 1888, 1889, 1888, 3101, 1114, 3127, 1889, 1889, 3127,
+ 1885, 1890, 1890, 1889, 1890, 1889, 2944, 3127, 1113, 1886,
+ 1112, 1111, 1890, 3136, 1887, 1110, 3136, 1890, 1890, 3138,
+ 3138, 3138, 3138, 1890, 3136, 1890, 1891, 1891, 1109, 1891,
+ 1892, 1892, 1889, 1892, 1104, 1098, 1888, 1891, 1074, 1072,
+ 1038, 1892, 1891, 1891, 3192, 3192, 1892, 1892, 1891, 3192,
+ 1891, 1035, 1892, 3192, 1892, 1893, 1893, 1032, 1893, 1894,
+ 1894, 1030, 1894, 3127, 1027, 1026, 1893, 1025, 1023, 1890,
+ 1894, 1893, 1893, 1021, 1020, 1894, 1894, 1893, 1018, 1893,
+ 3136, 1894, 1892, 1894, 1895, 1895, 1017, 1895, 1016, 1015,
+
+ 1014, 1891, 1013, 1896, 1896, 1895, 1896, 1011, 3194, 3194,
+ 1895, 1895, 1010, 3194, 1896, 1893, 1895, 3194, 1895, 1896,
+ 1896, 1897, 1897, 3145, 1897, 1896, 3145, 1896, 1009, 1008,
+ 1898, 1898, 1897, 1898, 3145, 1007, 1894, 1897, 1897, 1899,
+ 1899, 1898, 1899, 1897, 1006, 1897, 1898, 1898, 983, 981,
+ 1899, 980, 1898, 1896, 1898, 1899, 1899, 1900, 1900, 1895,
+ 1900, 1899, 979, 1899, 2345, 2345, 2345, 2345, 1900, 2626,
+ 2626, 2626, 2626, 1900, 1900, 1897, 978, 976, 975, 1900,
+ 2626, 1900, 974, 1901, 1901, 973, 1901, 2345, 1898, 2345,
+ 971, 2626, 3145, 1899, 1901, 1902, 1902, 970, 1902, 1901,
+
+ 1901, 2522, 2522, 2522, 2522, 1901, 1902, 1901, 2522, 969,
+ 968, 1902, 1902, 1903, 1903, 3146, 1903, 1902, 3146, 1902,
+ 967, 960, 2345, 959, 1903, 1900, 3146, 958, 957, 1903,
+ 1903, 1904, 1904, 3148, 1904, 1903, 3148, 1903, 955, 954,
+ 2345, 953, 1904, 952, 3148, 950, 949, 1904, 1904, 1905,
+ 1905, 948, 1905, 1904, 1901, 1904, 2623, 2623, 2623, 2623,
+ 1905, 3141, 1902, 2623, 3141, 1905, 1905, 1906, 1906, 947,
+ 1906, 1905, 3141, 1905, 2868, 2868, 2868, 2868, 1906, 3146,
+ 2522, 946, 1903, 1906, 1906, 1904, 942, 941, 940, 1906,
+ 939, 1906, 1907, 1907, 938, 1907, 2868, 3148, 1905, 2633,
+
+ 2633, 2633, 2633, 1907, 1908, 1908, 933, 1908, 1907, 1907,
+ 2633, 3141, 932, 1905, 1907, 1908, 1907, 931, 3196, 3196,
+ 1908, 1908, 930, 3196, 907, 1906, 1908, 3196, 1908, 1909,
+ 1909, 906, 1909, 897, 895, 2623, 3110, 3110, 3110, 3110,
+ 1909, 1910, 1910, 3110, 1910, 1909, 1909, 1979, 1979, 1979,
+ 1979, 1909, 1910, 1909, 894, 1907, 1908, 1910, 1910, 893,
+ 892, 1911, 1911, 1910, 1911, 1910, 891, 890, 888, 1979,
+ 887, 1979, 1911, 1912, 1912, 886, 1912, 1911, 1911, 885,
+ 883, 1909, 882, 1911, 1912, 1911, 881, 880, 879, 1912,
+ 1912, 1913, 1913, 878, 1913, 1912, 877, 1912, 1910, 865,
+
+ 3202, 3202, 1913, 1914, 1914, 3202, 1914, 1913, 1913, 3202,
+ 1979, 864, 858, 1913, 1914, 1913, 857, 856, 2176, 1914,
+ 1914, 2176, 1911, 3204, 3204, 1914, 855, 1914, 3204, 2176,
+ 1915, 1915, 3204, 1915, 2176, 2176, 853, 850, 849, 848,
+ 2176, 1915, 2176, 842, 841, 1912, 1915, 1915, 2328, 2328,
+ 2328, 2328, 1915, 838, 1915, 801, 1914, 1916, 1916, 1913,
+ 1916, 1914, 3206, 3206, 773, 763, 1914, 3206, 1916, 762,
+ 2328, 3206, 2328, 1916, 1916, 1917, 1917, 752, 1917, 1916,
+ 719, 1916, 692, 691, 1918, 1918, 1917, 1918, 688, 3208,
+ 3208, 1917, 1917, 1915, 3208, 1918, 683, 1917, 3208, 1917,
+
+ 1918, 1918, 681, 679, 1919, 1919, 1918, 1919, 1918, 3210,
+ 3210, 678, 676, 1916, 3210, 1919, 1920, 1920, 3210, 1920,
+ 1919, 1919, 2330, 2330, 2330, 2330, 1919, 1920, 1919, 675,
+ 659, 1917, 1920, 1920, 1921, 1921, 627, 1921, 1920, 597,
+ 1920, 596, 589, 587, 2330, 1921, 2330, 585, 3213, 3213,
+ 1921, 1921, 584, 3213, 1918, 575, 1921, 3213, 1921, 569,
+ 2331, 2331, 2331, 2331, 2627, 2627, 2627, 2627, 2706, 2706,
+ 2706, 2706, 2330, 1919, 554, 2627, 3216, 3216, 552, 2706,
+ 548, 3216, 2331, 1920, 2331, 3216, 2627, 540, 1921, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1981, 1981, 1981, 1981, 2110, 2110, 2110, 2110, 535,
+ 2776, 2776, 2776, 2776, 528, 2193, 2110, 2110, 2193, 2246,
+ 2110, 2776, 2246, 1981, 490, 1981, 2193, 2110, 2110, 2110,
+
+ 2246, 2193, 2193, 3219, 3219, 2246, 2246, 2193, 3219, 2193,
+ 489, 2246, 3219, 2246, 2702, 2702, 2702, 2702, 2777, 2777,
+ 2777, 2777, 2110, 3221, 3221, 2702, 3231, 3231, 3221, 2777,
+ 479, 3231, 3221, 478, 477, 3231, 2702, 474, 2246, 2193,
+ 1981, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2079, 2079, 2079, 2079, 472, 471, 2081,
+ 2081, 2081, 2081, 469, 2079, 2079, 2081, 468, 2079, 2079,
+ 2079, 2081, 456, 441, 437, 2079, 2079, 2079, 2081, 2081,
+ 2081, 2081, 2082, 2082, 2082, 2082, 431, 430, 429, 2082,
+ 427, 426, 424, 423, 2082, 2111, 2111, 2111, 2111, 422,
+ 2079, 2082, 2082, 2082, 2082, 2192, 2111, 2111, 2192, 2194,
+ 2111, 421, 2194, 420, 3243, 3243, 2192, 2111, 2111, 3243,
+ 2194, 2192, 2192, 3243, 411, 2194, 2194, 2192, 410, 2192,
+
+ 409, 2194, 2195, 2194, 407, 2195, 2197, 406, 2081, 2197,
+ 2889, 2889, 2111, 2195, 404, 2889, 2889, 2197, 2195, 2195,
+ 403, 402, 2197, 2197, 2195, 2889, 2195, 401, 2197, 2194,
+ 2197, 2082, 2103, 2103, 2103, 2103, 2339, 2339, 2339, 2339,
+ 400, 398, 385, 2103, 2103, 2192, 384, 2103, 2103, 2103,
+ 2201, 383, 2195, 2201, 2103, 2103, 2103, 382, 2339, 2198,
+ 2339, 2201, 2198, 381, 379, 352, 2201, 2201, 346, 2197,
+ 2198, 345, 2201, 344, 2201, 2198, 2198, 2889, 341, 2103,
+ 340, 2198, 338, 2198, 337, 2339, 2103, 2114, 2114, 2114,
+ 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114,
+
+ 2114, 2114, 2114, 2114, 2114, 2114, 2114, 336, 2201, 334,
+ 2114, 2114, 2114, 2114, 2114, 2114, 333, 316, 306, 305,
+ 2198, 2199, 304, 303, 2199, 2334, 2334, 2334, 2334, 295,
+ 288, 244, 2199, 2114, 2114, 2114, 2114, 2199, 2199, 2203,
+ 243, 240, 2203, 2199, 210, 2199, 205, 2334, 198, 2334,
+ 2203, 2346, 2346, 2346, 2346, 2203, 2203, 194, 193, 192,
+ 163, 2203, 157, 2203, 2114, 2114, 2114, 2114, 2114, 2121,
+ 2121, 2121, 2121, 153, 2346, 2199, 2346, 148, 2334, 2200,
+ 2121, 2121, 2200, 2202, 2121, 139, 2202, 137, 126, 125,
+ 2200, 2121, 2121, 2121, 2202, 2200, 2200, 122, 119, 2202,
+
+ 2202, 2200, 2203, 2200, 2346, 2202, 2206, 2202, 117, 2206,
+ 108, 99, 2333, 2333, 2333, 2333, 2121, 2206, 95, 89,
+ 80, 2121, 2206, 2206, 72, 65, 0, 2346, 2206, 0,
+ 2206, 0, 0, 2200, 2333, 2202, 2333, 2121, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2206, 0,
+ 0, 2164, 2164, 2164, 2164, 2164, 2164, 0, 0, 0,
+ 2575, 2575, 2575, 2575, 0, 2727, 2727, 2727, 2727, 2212,
+ 0, 2333, 2212, 0, 2164, 2164, 2164, 2164, 2207, 0,
+ 2212, 2207, 2575, 0, 2575, 2212, 2212, 2727, 0, 2207,
+
+ 0, 2212, 0, 2212, 2207, 2207, 0, 2164, 0, 0,
+ 2207, 0, 2207, 0, 0, 2164, 2164, 2164, 2164, 2164,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 0, 2207, 2212, 2196, 2196, 2196, 2196, 2196, 2196, 0,
+ 0, 2727, 2926, 2926, 2926, 2926, 2332, 2332, 2332, 2332,
+ 2208, 0, 0, 2208, 0, 0, 2196, 2196, 2196, 2196,
+ 2196, 2208, 2209, 0, 2926, 2209, 2208, 2208, 2332, 0,
+ 2332, 0, 2208, 2209, 2208, 0, 0, 0, 2209, 2209,
+ 0, 0, 2210, 0, 2209, 2210, 2209, 2196, 2196, 2196,
+
+ 2196, 2196, 2211, 2210, 0, 2211, 2957, 2957, 2210, 2210,
+ 2332, 2957, 2957, 2211, 2210, 0, 2210, 2213, 2211, 2211,
+ 2213, 2957, 3257, 3257, 2211, 0, 2211, 3257, 2213, 2208,
+ 2209, 3257, 0, 2213, 2213, 2214, 0, 0, 2214, 2213,
+ 0, 2213, 2417, 2417, 2417, 2417, 2214, 2215, 0, 2417,
+ 2215, 2214, 2214, 0, 0, 0, 2211, 2214, 2215, 2214,
+ 0, 2210, 0, 2215, 2215, 2216, 0, 0, 2216, 2215,
+ 0, 2215, 3149, 2957, 2217, 3149, 2216, 2217, 2213, 3332,
+ 3332, 2216, 2216, 3149, 3332, 2217, 0, 2216, 3332, 2216,
+ 2217, 2217, 2829, 2829, 2829, 2829, 2217, 0, 2217, 3151,
+
+ 2214, 2218, 3151, 2829, 2218, 0, 2417, 0, 0, 0,
+ 3151, 2219, 2218, 0, 2219, 0, 2215, 2218, 2218, 0,
+ 0, 2417, 2219, 2218, 0, 2218, 0, 2219, 2219, 2220,
+ 0, 0, 2220, 2219, 2216, 2219, 0, 0, 2221, 3149,
+ 2220, 2221, 0, 2217, 0, 2220, 2220, 2222, 0, 2221,
+ 2222, 2220, 0, 2220, 2221, 2221, 0, 0, 2222, 2218,
+ 2221, 0, 2221, 2222, 2222, 2223, 3151, 0, 2223, 2222,
+ 0, 2222, 2418, 2418, 2418, 2418, 2223, 0, 0, 2418,
+ 2219, 2223, 2223, 0, 0, 2224, 0, 2223, 2224, 2223,
+ 2221, 0, 0, 0, 2225, 0, 2224, 2225, 2220, 2222,
+
+ 0, 2224, 2224, 2226, 0, 2225, 2226, 2224, 0, 2224,
+ 2225, 2225, 0, 0, 2226, 0, 2225, 0, 2225, 2226,
+ 2226, 2227, 0, 0, 2227, 2226, 0, 2226, 0, 0,
+ 2228, 0, 2227, 2228, 2223, 0, 2418, 2227, 2227, 2224,
+ 0, 2228, 0, 2227, 0, 2227, 2228, 2228, 2225, 0,
+ 0, 2418, 2228, 2229, 2228, 0, 2229, 2856, 2856, 2856,
+ 2856, 0, 2230, 0, 2229, 2230, 2226, 0, 2856, 2229,
+ 2229, 0, 0, 2230, 2227, 2229, 0, 2229, 2230, 2230,
+ 2231, 0, 0, 2231, 2230, 0, 2230, 0, 0, 2232,
+ 0, 2231, 2232, 0, 0, 0, 2231, 2231, 0, 2228,
+
+ 2232, 0, 2231, 0, 2231, 2232, 2232, 2233, 2229, 0,
+ 2233, 2232, 0, 2232, 2230, 0, 2234, 0, 2233, 2234,
+ 2987, 2987, 0, 2233, 2233, 2987, 2987, 2234, 0, 2233,
+ 0, 2233, 2234, 2234, 0, 2987, 2231, 0, 2234, 2235,
+ 2234, 0, 2235, 0, 0, 0, 3073, 3073, 3073, 3073,
+ 2235, 0, 0, 3073, 2239, 2235, 2235, 2239, 2232, 0,
+ 0, 2235, 0, 2235, 2233, 2239, 2916, 2916, 2916, 2916,
+ 2239, 2239, 0, 0, 0, 0, 2239, 2916, 2239, 3400,
+ 3400, 0, 0, 2234, 3400, 0, 0, 2987, 3400, 2235,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 3073, 0, 2239, 2238, 2238, 2238, 2238, 2238, 2238, 0,
+ 2336, 2336, 2336, 2336, 2240, 3073, 0, 2240, 0, 0,
+ 2335, 2335, 2335, 2335, 0, 2240, 2238, 2238, 2238, 2238,
+ 2240, 2240, 2336, 0, 2336, 0, 2240, 0, 2240, 0,
+ 0, 0, 2335, 0, 2335, 2959, 2959, 2959, 2959, 2238,
+ 0, 0, 0, 2241, 0, 0, 2241, 2238, 2238, 2238,
+ 2238, 2238, 2242, 0, 2241, 2242, 2336, 2959, 2240, 2241,
+ 2241, 2243, 0, 2242, 2243, 2241, 0, 2241, 2242, 2242,
+ 2244, 0, 2243, 2244, 2242, 0, 2242, 2243, 2243, 2335,
+
+ 0, 2244, 0, 2243, 0, 2243, 2244, 2244, 2245, 0,
+ 0, 2245, 2244, 0, 2244, 0, 2241, 2248, 2248, 2245,
+ 2248, 0, 2242, 0, 2245, 2245, 2249, 2249, 2248, 2249,
+ 2245, 0, 2245, 2248, 2248, 2250, 2250, 2249, 2250, 2248,
+ 2244, 2248, 2249, 2249, 2243, 0, 2250, 0, 2249, 0,
+ 2249, 2250, 2250, 2251, 2251, 0, 2251, 2250, 0, 2250,
+ 0, 0, 2252, 2252, 2251, 2252, 2245, 3421, 3421, 2251,
+ 2251, 0, 3421, 2252, 0, 2251, 3421, 2251, 2252, 2252,
+ 2249, 0, 0, 0, 2252, 2250, 2252, 2248, 2253, 2253,
+ 0, 2253, 0, 0, 0, 0, 0, 2254, 2254, 2253,
+
+ 2254, 0, 0, 2251, 2253, 2253, 2255, 2255, 2254, 2255,
+ 2253, 0, 2253, 2254, 2254, 2256, 2256, 2255, 2256, 2254,
+ 0, 2254, 2255, 2255, 0, 2252, 2256, 3093, 2255, 0,
+ 2255, 2256, 2256, 3093, 3093, 0, 0, 2256, 0, 2256,
+ 3093, 2257, 2257, 0, 2257, 0, 0, 0, 3093, 2253,
+ 0, 2254, 2257, 2420, 2420, 2420, 2420, 2257, 2257, 0,
+ 2255, 0, 0, 2257, 2420, 2257, 0, 2256, 0, 2261,
+ 2261, 0, 2261, 2259, 2259, 2420, 2259, 2420, 3436, 3436,
+ 2261, 0, 0, 3436, 2259, 2261, 2261, 3436, 0, 2259,
+ 2259, 2261, 0, 2261, 0, 2259, 0, 2259, 3093, 0,
+
+ 3093, 0, 0, 0, 2257, 2258, 2258, 2258, 2258, 2258,
+ 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258,
+ 2258, 2258, 2258, 2258, 2258, 2259, 0, 0, 2258, 2258,
+ 2258, 2258, 2258, 2258, 2917, 2917, 2917, 2917, 2261, 2260,
+ 2260, 0, 2260, 0, 0, 2917, 2347, 2347, 2347, 2347,
+ 2260, 2258, 2258, 2258, 2258, 2260, 2260, 2262, 2262, 0,
+ 2262, 2260, 0, 2260, 0, 0, 0, 2258, 2262, 2347,
+ 0, 2347, 0, 2262, 2262, 0, 0, 2263, 2263, 2262,
+ 2263, 2262, 2258, 2258, 2258, 2258, 2258, 0, 2263, 0,
+ 0, 0, 2260, 2263, 2263, 2264, 2264, 0, 2264, 2263,
+
+ 0, 2263, 0, 0, 2347, 0, 2264, 2265, 2265, 0,
+ 2265, 2264, 2264, 0, 0, 2262, 0, 2264, 2265, 2264,
+ 0, 0, 2347, 2265, 2265, 2946, 2946, 2946, 2946, 2265,
+ 0, 2265, 0, 0, 2266, 2266, 2946, 2266, 3010, 3010,
+ 3010, 3010, 0, 0, 0, 2266, 2263, 2946, 0, 2264,
+ 2266, 2266, 2267, 2267, 0, 2267, 2266, 0, 2266, 0,
+ 3010, 2268, 2268, 2267, 2268, 0, 3450, 3450, 2267, 2267,
+ 2265, 3450, 2268, 0, 2267, 3450, 2267, 2268, 2268, 0,
+ 0, 2269, 2269, 2268, 2269, 2268, 0, 0, 0, 0,
+ 2270, 2270, 2269, 2270, 0, 2266, 0, 2269, 2269, 2271,
+
+ 2271, 2270, 2271, 2269, 0, 2269, 2270, 2270, 0, 0,
+ 2271, 0, 2270, 0, 2270, 2271, 2271, 2267, 0, 0,
+ 0, 2271, 0, 2271, 2272, 2272, 0, 2272, 0, 0,
+ 2268, 2978, 2978, 2978, 2978, 2272, 2273, 2273, 0, 2273,
+ 2272, 2272, 2978, 0, 0, 0, 2272, 2273, 2272, 0,
+ 2269, 0, 2273, 2273, 0, 0, 0, 2271, 2273, 2270,
+ 2273, 2274, 2274, 0, 2274, 2275, 2275, 0, 2275, 0,
+ 3510, 3510, 2274, 0, 0, 3510, 2275, 2274, 2274, 3510,
+ 0, 2275, 2275, 2274, 0, 2274, 0, 2275, 0, 2275,
+ 0, 3521, 3521, 2272, 0, 0, 3521, 0, 2276, 2276,
+
+ 3521, 2276, 0, 0, 0, 2273, 0, 2277, 2277, 2276,
+ 2277, 0, 0, 2274, 2276, 2276, 2492, 2275, 2277, 2492,
+ 2276, 0, 2276, 2277, 2277, 2278, 2278, 2492, 2278, 2277,
+ 0, 2277, 2492, 2492, 2279, 2279, 2278, 2279, 2492, 0,
+ 2492, 2278, 2278, 0, 0, 2279, 0, 2278, 0, 2278,
+ 2279, 2279, 2280, 2280, 0, 2280, 2279, 0, 2279, 0,
+ 0, 2277, 0, 2280, 0, 0, 0, 2276, 2280, 2280,
+ 0, 0, 0, 0, 2280, 0, 2280, 0, 2281, 2281,
+ 0, 2281, 2282, 2282, 0, 2282, 2492, 2279, 2278, 2281,
+ 0, 0, 0, 2282, 2281, 2281, 0, 0, 2282, 2282,
+
+ 2281, 0, 2281, 0, 2282, 0, 2282, 2283, 2283, 0,
+ 2283, 0, 0, 0, 2981, 2981, 2981, 2981, 2283, 2284,
+ 2284, 2280, 2284, 2283, 2283, 2981, 0, 0, 0, 2283,
+ 2284, 2283, 0, 2281, 2282, 2284, 2284, 2285, 2285, 0,
+ 2285, 2284, 0, 2284, 2982, 2982, 2982, 2982, 2285, 2286,
+ 2286, 0, 2286, 2285, 2285, 2982, 0, 0, 0, 2285,
+ 2286, 2285, 0, 2283, 0, 2286, 2286, 2287, 2287, 0,
+ 2287, 2286, 0, 2286, 0, 0, 2293, 2293, 2287, 2293,
+ 0, 0, 0, 2287, 2287, 0, 0, 2293, 2284, 2287,
+ 0, 2287, 2293, 2293, 2285, 0, 0, 0, 2293, 0,
+
+ 2293, 3023, 3023, 3023, 3023, 0, 0, 3104, 3104, 3104,
+ 3104, 0, 3023, 0, 3104, 0, 2286, 2287, 2288, 2288,
+ 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288,
+ 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 0, 2293,
+ 0, 2288, 2288, 2288, 2288, 2288, 2288, 0, 2577, 2577,
+ 2577, 2577, 2289, 2289, 0, 2289, 2337, 2337, 2337, 2337,
+ 0, 0, 0, 2289, 2288, 2288, 2288, 2288, 2289, 2289,
+ 2577, 3104, 2577, 0, 2289, 0, 2289, 0, 2337, 0,
+ 2337, 0, 3026, 3026, 3026, 3026, 3104, 2288, 0, 2290,
+ 2290, 0, 2290, 3026, 0, 2288, 2288, 2288, 2288, 2288,
+
+ 2290, 2291, 2291, 0, 2291, 2290, 2290, 0, 0, 2577,
+ 2289, 2290, 2291, 2290, 0, 0, 0, 2291, 2291, 2337,
+ 0, 0, 0, 2291, 0, 2291, 0, 0, 2292, 2292,
+ 0, 2292, 0, 0, 0, 0, 0, 0, 0, 2292,
+ 0, 0, 0, 2290, 2292, 2292, 2294, 2294, 0, 2294,
+ 2292, 0, 2292, 0, 2291, 2295, 2295, 2294, 2295, 0,
+ 0, 0, 2294, 2294, 0, 0, 2295, 0, 2294, 0,
+ 2294, 2295, 2295, 2296, 2296, 0, 2296, 2295, 2292, 2295,
+ 2338, 2338, 2338, 2338, 2296, 2344, 2344, 2344, 2344, 2296,
+ 2296, 2370, 2370, 2370, 2370, 2296, 2294, 2296, 3128, 3128,
+
+ 3128, 3128, 2338, 0, 2338, 0, 0, 0, 2344, 3128,
+ 2344, 0, 0, 2295, 0, 0, 0, 2416, 2416, 2416,
+ 2416, 0, 2296, 2421, 2421, 2421, 2421, 0, 2416, 2416,
+ 0, 0, 2416, 0, 2421, 0, 0, 2344, 2338, 2416,
+ 2416, 2416, 0, 2370, 0, 2421, 0, 2421, 0, 2344,
+ 0, 0, 0, 2344, 2344, 2370, 2344, 0, 0, 2370,
+ 0, 2344, 2370, 0, 2416, 0, 0, 2370, 2423, 2423,
+ 2423, 2423, 0, 0, 2428, 2428, 2428, 2428, 0, 2423,
+ 2423, 0, 0, 2423, 2416, 2428, 2428, 0, 2421, 2428,
+ 2423, 2423, 2423, 0, 0, 0, 2428, 2428, 2428, 2423,
+
+ 0, 0, 0, 0, 0, 2434, 2434, 2434, 2434, 0,
+ 0, 0, 0, 0, 0, 2423, 2434, 2434, 0, 0,
+ 2434, 2428, 2433, 2433, 2433, 2433, 0, 2434, 2434, 2434,
+ 0, 0, 0, 2433, 2433, 0, 0, 2433, 2435, 2435,
+ 2435, 2435, 0, 0, 2433, 2433, 2433, 0, 0, 2435,
+ 2435, 0, 2434, 2435, 0, 0, 2578, 2578, 2578, 2578,
+ 2435, 2435, 0, 0, 2466, 2466, 2466, 2466, 0, 2433,
+ 0, 0, 0, 0, 2433, 2466, 2466, 0, 2578, 2466,
+ 2578, 0, 0, 0, 0, 2435, 2466, 2466, 2466, 0,
+ 2433, 2454, 2454, 2454, 2454, 2454, 2454, 2454, 2454, 2454,
+
+ 2454, 2454, 2454, 2454, 2454, 2454, 2454, 2454, 2454, 2454,
+ 2454, 2466, 0, 0, 2454, 2454, 2454, 2454, 2454, 2454,
+ 2467, 2467, 2467, 2467, 0, 2578, 0, 2466, 0, 0,
+ 2487, 2467, 2467, 2487, 0, 2467, 0, 2454, 2454, 2454,
+ 2454, 2487, 2467, 2467, 0, 0, 2487, 2487, 0, 0,
+ 0, 0, 2487, 0, 2487, 0, 0, 0, 2576, 2576,
+ 2576, 2576, 2488, 0, 0, 2488, 0, 2467, 2454, 2454,
+ 2454, 2454, 2454, 2488, 2489, 0, 0, 2489, 2488, 2488,
+ 2576, 0, 2576, 2467, 2488, 2489, 2488, 0, 0, 0,
+ 2489, 2489, 2487, 0, 2490, 0, 2489, 2490, 2489, 0,
+
+ 0, 0, 0, 2491, 0, 2490, 2491, 0, 0, 0,
+ 2490, 2490, 2576, 0, 2491, 0, 2490, 0, 2490, 2491,
+ 2491, 2493, 0, 0, 2493, 2491, 2489, 2491, 0, 2488,
+ 2494, 0, 2493, 2494, 0, 0, 0, 2493, 2493, 0,
+ 0, 2494, 0, 2493, 0, 2493, 2494, 2494, 2495, 0,
+ 0, 2495, 2494, 0, 2494, 2491, 0, 2490, 0, 2495,
+ 0, 0, 0, 2496, 2495, 2495, 2496, 0, 0, 0,
+ 2495, 0, 2495, 0, 2496, 2498, 0, 0, 2498, 2496,
+ 2496, 0, 2494, 0, 0, 2496, 2498, 2496, 0, 0,
+ 2493, 2498, 2498, 2499, 0, 0, 2499, 2498, 0, 2498,
+
+ 0, 0, 2500, 0, 2499, 2500, 2495, 0, 0, 2499,
+ 2499, 2501, 0, 2500, 2501, 2499, 0, 2499, 2500, 2500,
+ 0, 0, 2501, 0, 2500, 0, 2500, 2501, 2501, 0,
+ 0, 2502, 2498, 2501, 2502, 2501, 0, 2496, 0, 0,
+ 2503, 0, 2502, 2503, 0, 2499, 0, 2502, 2502, 0,
+ 0, 2503, 2500, 2502, 0, 2502, 2503, 2503, 2504, 0,
+ 0, 2504, 2503, 0, 2503, 2501, 0, 2505, 0, 2504,
+ 2505, 0, 0, 0, 2504, 2504, 2506, 0, 2505, 2506,
+ 2504, 2502, 2504, 2505, 2505, 0, 0, 2506, 0, 2505,
+ 0, 2505, 2506, 2506, 2507, 0, 0, 2507, 2506, 0,
+
+ 2506, 3020, 3020, 3020, 3020, 2507, 0, 2503, 0, 0,
+ 2507, 2507, 2508, 0, 0, 2508, 2507, 0, 2507, 0,
+ 2505, 0, 2504, 2508, 3020, 0, 3020, 0, 2508, 2508,
+ 2509, 0, 0, 2509, 2508, 0, 2508, 0, 0, 2510,
+ 0, 2509, 2510, 2506, 0, 0, 2509, 2509, 2507, 0,
+ 2510, 0, 2509, 0, 2509, 2510, 2510, 0, 0, 0,
+ 0, 2510, 0, 2510, 2994, 2994, 2994, 2994, 0, 0,
+ 3020, 2994, 2512, 0, 0, 2512, 2513, 3020, 0, 2513,
+ 0, 2508, 0, 2512, 2509, 0, 2994, 2513, 2512, 2512,
+ 0, 0, 2513, 2513, 2512, 0, 2512, 0, 2513, 0,
+
+ 2513, 0, 0, 0, 0, 0, 2510, 2511, 2511, 2511,
+ 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511,
+ 2511, 2511, 2511, 2511, 2511, 2511, 2511, 0, 2994, 0,
+ 2511, 2511, 2511, 2511, 2511, 2511, 2512, 0, 2999, 2999,
+ 2999, 2999, 0, 2994, 0, 2513, 0, 2514, 0, 2999,
+ 2514, 0, 0, 2511, 2511, 2511, 2511, 2511, 2514, 2515,
+ 2999, 0, 2515, 2514, 2514, 0, 0, 0, 0, 2514,
+ 2515, 2514, 0, 0, 0, 2515, 2515, 2975, 2975, 2975,
+ 2975, 2515, 0, 2515, 2511, 2511, 2511, 2511, 2511, 2516,
+ 0, 0, 2516, 2517, 0, 0, 2517, 0, 0, 0,
+
+ 2516, 2514, 0, 0, 2517, 2516, 2516, 0, 0, 2517,
+ 2517, 2516, 0, 2516, 2515, 2517, 2518, 2517, 0, 2518,
+ 2519, 0, 0, 2519, 0, 0, 0, 2518, 0, 2975,
+ 0, 2519, 2518, 2518, 0, 0, 2519, 2519, 2518, 0,
+ 2518, 2975, 2519, 2520, 2519, 2975, 2520, 2517, 2975, 0,
+ 0, 2516, 0, 2975, 2520, 0, 0, 0, 0, 2520,
+ 2520, 2523, 2523, 2523, 2523, 2520, 0, 2520, 0, 0,
+ 0, 0, 2523, 2525, 2525, 0, 2525, 2518, 0, 0,
+ 0, 2519, 0, 2523, 2525, 2523, 0, 0, 0, 2525,
+ 2525, 2526, 2526, 0, 2526, 2525, 0, 2525, 0, 0,
+
+ 2527, 2527, 2526, 2527, 0, 0, 0, 2526, 2526, 0,
+ 0, 2527, 2520, 2526, 0, 2526, 2527, 2527, 0, 0,
+ 2528, 2528, 2527, 2528, 2527, 0, 0, 0, 0, 2529,
+ 2529, 2528, 2529, 0, 0, 2525, 2528, 2528, 2530, 2530,
+ 2529, 2530, 2528, 0, 2528, 2529, 2529, 0, 0, 2530,
+ 0, 2529, 2527, 2529, 2530, 2530, 2531, 2531, 2526, 2531,
+ 2530, 0, 2530, 0, 0, 2532, 2532, 2531, 2532, 0,
+ 0, 0, 2531, 2531, 2533, 2533, 2532, 2533, 2531, 0,
+ 2531, 2532, 2532, 2528, 0, 2533, 0, 2532, 0, 2532,
+ 2533, 2533, 0, 0, 2534, 2534, 2533, 2534, 2533, 2529,
+
+ 0, 0, 0, 0, 0, 2534, 0, 2530, 0, 0,
+ 2534, 2534, 2535, 2535, 2531, 2535, 2534, 0, 2534, 0,
+ 0, 2536, 2536, 2535, 2536, 0, 0, 0, 2535, 2535,
+ 0, 2533, 2536, 0, 2535, 0, 2535, 2536, 2536, 2532,
+ 0, 2537, 2537, 2536, 2537, 2536, 2534, 0, 0, 0,
+ 2538, 2538, 2537, 2538, 0, 0, 0, 2537, 2537, 0,
+ 0, 2538, 2535, 2537, 0, 2537, 2538, 2538, 2539, 2539,
+ 0, 2539, 2538, 0, 2538, 2536, 0, 2540, 2540, 2539,
+ 2540, 0, 0, 0, 2539, 2539, 2541, 2541, 2540, 2541,
+ 2539, 2537, 2539, 2540, 2540, 0, 0, 2541, 0, 2540,
+
+ 0, 2540, 2541, 2541, 2542, 2542, 0, 2542, 2541, 0,
+ 2541, 0, 0, 0, 0, 2542, 0, 2538, 0, 0,
+ 2542, 2542, 2543, 2543, 0, 2543, 2542, 0, 2542, 0,
+ 2540, 0, 2539, 2543, 0, 0, 0, 0, 2543, 2543,
+ 2544, 2544, 0, 2544, 2543, 0, 2543, 0, 0, 2545,
+ 2545, 2544, 2545, 2541, 0, 0, 2544, 2544, 2542, 0,
+ 2545, 0, 2544, 0, 2544, 2545, 2545, 3000, 3000, 3000,
+ 3000, 2545, 0, 2545, 0, 0, 2546, 2546, 3000, 2546,
+ 0, 0, 0, 0, 0, 2547, 2547, 2546, 2547, 3000,
+ 0, 2543, 2546, 2546, 2544, 0, 2547, 0, 2546, 0,
+
+ 2546, 2547, 2547, 2548, 2548, 0, 2548, 2547, 0, 2547,
+ 0, 0, 2681, 2545, 2548, 2681, 0, 0, 0, 2548,
+ 2548, 0, 0, 2681, 0, 2548, 0, 2548, 2681, 2681,
+ 2549, 2549, 0, 2549, 2681, 0, 2681, 0, 0, 2547,
+ 0, 2549, 0, 0, 0, 2546, 2549, 2549, 2550, 2550,
+ 0, 2550, 2549, 0, 2549, 0, 0, 0, 2548, 2550,
+ 2551, 2551, 0, 2551, 2550, 2550, 2681, 0, 0, 0,
+ 2550, 2551, 2550, 0, 0, 0, 2551, 2551, 3001, 3001,
+ 3001, 3001, 2551, 0, 2551, 0, 0, 2552, 2552, 3001,
+ 2552, 0, 2549, 0, 0, 0, 2553, 2553, 2552, 2553,
+
+ 3001, 0, 2550, 2552, 2552, 0, 0, 2553, 0, 2552,
+ 0, 2552, 2553, 2553, 2574, 2574, 2574, 2574, 2553, 0,
+ 2553, 2551, 2583, 2583, 2583, 2583, 0, 0, 2624, 2624,
+ 2624, 2624, 2625, 2625, 2625, 2625, 2574, 0, 2574, 2624,
+ 0, 0, 0, 2625, 0, 2583, 0, 2583, 2552, 0,
+ 2624, 0, 2624, 0, 2625, 0, 2625, 2628, 2628, 2628,
+ 2628, 2630, 2630, 2630, 2630, 2553, 0, 0, 2628, 0,
+ 0, 0, 2630, 0, 2583, 0, 0, 2574, 0, 2628,
+ 0, 2628, 0, 2630, 0, 2630, 2583, 0, 0, 0,
+ 2583, 2583, 0, 2583, 0, 0, 0, 2625, 2583, 2637,
+
+ 2637, 2637, 2637, 0, 0, 3064, 3064, 3064, 3064, 0,
+ 2637, 2637, 3064, 2682, 2637, 2630, 2682, 2683, 0, 0,
+ 2683, 2637, 2637, 2637, 2682, 0, 0, 3064, 2683, 2682,
+ 2682, 0, 0, 2683, 2683, 2682, 0, 2682, 0, 2683,
+ 0, 2683, 0, 0, 0, 0, 2637, 2643, 2643, 2643,
+ 2643, 2643, 2643, 2643, 2643, 2643, 2643, 2643, 2643, 2643,
+ 2643, 2643, 2643, 2643, 2643, 2643, 2643, 2683, 0, 0,
+ 2643, 2643, 2643, 2643, 2643, 2643, 2664, 2664, 2664, 2664,
+ 0, 0, 2682, 0, 3064, 0, 0, 2664, 2664, 0,
+ 0, 2664, 0, 2643, 2643, 2643, 2643, 2643, 2664, 2664,
+
+ 2664, 2876, 0, 0, 0, 0, 0, 2876, 2876, 0,
+ 0, 0, 2876, 2876, 2876, 0, 0, 0, 0, 0,
+ 0, 0, 2876, 2664, 2643, 2643, 2643, 2643, 2643, 2653,
+ 2653, 2653, 2653, 0, 2665, 2665, 2665, 2665, 0, 2664,
+ 2653, 2653, 0, 0, 2653, 2665, 2665, 2684, 0, 2665,
+ 2684, 2653, 2653, 2653, 0, 0, 2665, 2665, 2684, 0,
+ 0, 0, 2685, 2684, 2684, 2685, 0, 0, 0, 2684,
+ 0, 2684, 2876, 2685, 2876, 0, 2653, 0, 2685, 2685,
+ 0, 2665, 2686, 2653, 2685, 2686, 2685, 2653, 0, 0,
+ 0, 2688, 0, 2686, 2688, 0, 2653, 2665, 2686, 2686,
+
+ 2653, 2684, 2688, 0, 2686, 0, 2686, 2688, 2688, 2689,
+ 0, 2685, 2689, 2688, 0, 2688, 0, 0, 2690, 0,
+ 2689, 2690, 0, 0, 0, 2689, 2689, 0, 0, 2690,
+ 0, 2689, 0, 2689, 2690, 2690, 0, 0, 2691, 0,
+ 2690, 2691, 2690, 0, 0, 0, 0, 2692, 0, 2691,
+ 2692, 2686, 2688, 0, 2691, 2691, 2693, 0, 2692, 2693,
+ 2691, 2689, 2691, 2692, 2692, 2694, 0, 2693, 2694, 2692,
+ 0, 2692, 2693, 2693, 0, 0, 2694, 0, 2693, 0,
+ 2693, 2694, 2694, 2695, 0, 2690, 2695, 2694, 0, 2694,
+ 0, 0, 2691, 2696, 2695, 0, 2696, 0, 0, 2695,
+
+ 2695, 2692, 0, 2697, 2696, 2695, 2697, 2695, 0, 2696,
+ 2696, 0, 0, 0, 2697, 2696, 0, 2696, 0, 2697,
+ 2697, 2698, 0, 2693, 2698, 2697, 0, 2697, 0, 0,
+ 2694, 2699, 2698, 0, 2699, 2695, 0, 2698, 2698, 0,
+ 0, 0, 2699, 2698, 0, 2698, 0, 2699, 2699, 2700,
+ 0, 0, 2700, 2699, 0, 2699, 2696, 2697, 2701, 0,
+ 2700, 2701, 0, 0, 0, 2700, 2700, 0, 0, 2701,
+ 0, 2700, 0, 2700, 2701, 2701, 2703, 2703, 2703, 2703,
+ 2701, 0, 2701, 0, 2698, 2699, 0, 2703, 3090, 3090,
+ 3090, 3090, 2707, 2707, 0, 2707, 0, 0, 2703, 3090,
+
+ 2703, 0, 2700, 2707, 2708, 2708, 0, 2708, 2707, 2707,
+ 3090, 0, 2701, 0, 2707, 2708, 2707, 0, 0, 0,
+ 2708, 2708, 3091, 3091, 3091, 3091, 2708, 0, 2708, 0,
+ 0, 2709, 2709, 3091, 2709, 0, 0, 0, 0, 0,
+ 2710, 2710, 2709, 2710, 3091, 0, 2707, 2709, 2709, 0,
+ 0, 2710, 0, 2709, 0, 2709, 2710, 2710, 2711, 2711,
+ 0, 2711, 2710, 0, 2710, 0, 0, 2713, 2713, 2711,
+ 2713, 0, 0, 2708, 2711, 2711, 2712, 2712, 2713, 2712,
+ 2711, 0, 2711, 2713, 2713, 2709, 0, 2712, 0, 2713,
+ 0, 2713, 2712, 2712, 2714, 2714, 0, 2714, 2712, 0,
+
+ 2712, 3107, 3107, 3107, 3107, 2714, 0, 0, 0, 2710,
+ 2714, 2714, 3107, 0, 2715, 2715, 2714, 2715, 2714, 2711,
+ 0, 0, 0, 3107, 0, 2715, 0, 0, 2712, 0,
+ 2715, 2715, 0, 0, 2713, 0, 2715, 0, 2715, 2716,
+ 2716, 0, 2716, 2738, 2738, 2738, 2738, 0, 2714, 0,
+ 2716, 0, 0, 0, 0, 2716, 2716, 0, 0, 2717,
+ 2717, 2716, 2717, 2716, 0, 2738, 0, 2738, 2715, 0,
+ 2717, 2718, 2718, 0, 2718, 2717, 2717, 0, 0, 0,
+ 0, 2717, 2718, 2717, 0, 0, 0, 2718, 2718, 0,
+ 0, 2719, 2719, 2718, 2719, 2718, 2738, 0, 0, 0,
+
+ 0, 0, 2719, 0, 0, 0, 2716, 2719, 2719, 0,
+ 0, 0, 0, 2719, 0, 2719, 2720, 2720, 0, 2720,
+ 2721, 2721, 2717, 2721, 0, 2718, 0, 2720, 0, 0,
+ 0, 2721, 2720, 2720, 0, 0, 2721, 2721, 2720, 0,
+ 2720, 0, 2721, 0, 2721, 2722, 2722, 0, 2722, 0,
+ 2739, 2739, 2739, 2739, 2719, 0, 2722, 2773, 2773, 2773,
+ 2773, 2722, 2722, 0, 0, 0, 0, 2722, 2773, 2722,
+ 2720, 0, 2739, 2721, 2739, 0, 0, 0, 0, 2773,
+ 0, 2773, 0, 2774, 2774, 2774, 2774, 2775, 2775, 2775,
+ 2775, 0, 0, 0, 2774, 0, 0, 0, 2775, 2722,
+
+ 0, 0, 0, 0, 2739, 2774, 0, 2774, 0, 2775,
+ 0, 2775, 2782, 2782, 2782, 2782, 0, 2783, 2783, 2783,
+ 2783, 0, 0, 2782, 2782, 0, 0, 2782, 2783, 2783,
+ 0, 0, 2783, 0, 2782, 2782, 2782, 2774, 0, 2783,
+ 2783, 3118, 3118, 3118, 3118, 0, 0, 0, 0, 0,
+ 0, 0, 3118, 0, 2775, 0, 0, 0, 0, 2782,
+ 0, 0, 0, 3118, 2783, 2792, 2792, 2792, 2792, 2792,
+ 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792,
+ 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792,
+ 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792,
+
+ 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792,
+ 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792,
+ 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792,
+ 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792,
+ 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2793, 2793, 2793,
+ 2793, 0, 2794, 2794, 2794, 2794, 0, 0, 2793, 2793,
+ 0, 0, 2793, 2794, 2794, 0, 0, 2794, 0, 2793,
+ 2793, 2793, 0, 0, 2794, 2794, 0, 0, 2795, 2795,
+ 2795, 2795, 0, 0, 0, 0, 0, 0, 0, 2795,
+ 2795, 0, 2821, 2795, 2793, 2821, 0, 0, 0, 2794,
+
+ 2795, 2795, 2795, 2821, 2822, 0, 0, 2822, 2821, 2821,
+ 0, 0, 0, 0, 2821, 2822, 2821, 0, 0, 0,
+ 2822, 2822, 0, 0, 2823, 2795, 2822, 2823, 2822, 0,
+ 2795, 0, 0, 2824, 0, 2823, 2824, 0, 0, 0,
+ 2823, 2823, 2825, 0, 2824, 2825, 2823, 0, 2823, 2824,
+ 2824, 2826, 0, 2825, 2826, 2824, 2822, 2824, 2825, 2825,
+ 2821, 0, 2826, 0, 2825, 0, 2825, 2826, 2826, 0,
+ 0, 2827, 0, 2826, 2827, 2826, 0, 0, 2823, 0,
+ 2828, 0, 2827, 2828, 0, 0, 2824, 2827, 2827, 2830,
+ 2830, 2828, 2830, 2827, 0, 2827, 2828, 2828, 0, 0,
+
+ 2830, 2826, 2828, 0, 2828, 2830, 2830, 0, 0, 2825,
+ 0, 2830, 0, 2830, 2831, 2831, 0, 2831, 0, 0,
+ 0, 0, 0, 2832, 2832, 2831, 2832, 0, 0, 2827,
+ 2831, 2831, 0, 0, 2832, 0, 2831, 0, 2831, 2832,
+ 2832, 2833, 2833, 2830, 2833, 2832, 0, 2832, 0, 2828,
+ 0, 0, 2833, 2859, 2859, 2859, 2859, 2833, 2833, 0,
+ 0, 0, 0, 2833, 2859, 2833, 0, 2831, 2860, 2860,
+ 2860, 2860, 0, 0, 0, 2859, 0, 2859, 0, 2860,
+ 0, 2832, 2864, 2864, 2864, 2864, 0, 0, 0, 0,
+ 2860, 0, 2860, 2864, 2864, 0, 0, 2864, 0, 0,
+
+ 2870, 2870, 2870, 2870, 2864, 2864, 2864, 0, 0, 0,
+ 2833, 2870, 2870, 0, 0, 2870, 0, 0, 2860, 0,
+ 2859, 0, 2870, 2870, 2870, 3068, 3068, 3068, 3068, 2864,
+ 2871, 2871, 2871, 2871, 0, 0, 3068, 3068, 0, 0,
+ 3068, 2871, 2871, 2895, 0, 2871, 2895, 2870, 3068, 3068,
+ 2940, 0, 2871, 2871, 2895, 0, 2940, 2940, 0, 2895,
+ 2895, 2940, 2940, 2940, 0, 2895, 0, 2895, 0, 0,
+ 0, 2940, 3068, 0, 0, 0, 0, 2871, 2874, 2874,
+ 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874,
+ 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 0, 0,
+
+ 0, 2874, 2874, 2874, 2874, 2874, 2874, 2888, 2888, 2888,
+ 2888, 0, 2895, 0, 0, 0, 0, 2896, 2888, 2888,
+ 2896, 2940, 2888, 2940, 2874, 2874, 2874, 2874, 2896, 2888,
+ 2888, 2888, 0, 2896, 2896, 0, 0, 0, 0, 2896,
+ 0, 2896, 0, 0, 0, 0, 0, 0, 0, 2897,
+ 0, 0, 2897, 0, 2888, 2874, 2874, 2874, 2874, 2874,
+ 2897, 2898, 0, 0, 2898, 2897, 2897, 2896, 0, 0,
+ 0, 2897, 2898, 2897, 0, 0, 2899, 2898, 2898, 2899,
+ 0, 0, 0, 2898, 0, 2898, 0, 2899, 2900, 2900,
+ 0, 2900, 2899, 2899, 0, 0, 0, 0, 2899, 2900,
+
+ 2899, 0, 0, 2897, 2900, 2900, 2920, 2920, 2920, 2920,
+ 2900, 0, 2900, 2921, 2921, 2921, 2921, 2920, 0, 0,
+ 0, 0, 0, 0, 2921, 0, 0, 0, 2920, 2898,
+ 2920, 2929, 2929, 2929, 2929, 2921, 0, 2921, 0, 0,
+ 0, 0, 2929, 2929, 0, 0, 2929, 2930, 2930, 2930,
+ 2930, 2899, 0, 2929, 2929, 2929, 2920, 0, 2930, 2930,
+ 0, 0, 2930, 2900, 2937, 2937, 2937, 2937, 0, 2930,
+ 2930, 0, 0, 0, 0, 2937, 2937, 0, 2929, 2937,
+ 0, 0, 2921, 0, 0, 0, 2937, 2937, 2937, 0,
+ 2938, 2938, 2938, 2938, 2930, 0, 0, 0, 0, 0,
+
+ 0, 2938, 2938, 2963, 0, 2938, 2963, 0, 0, 0,
+ 0, 2937, 2938, 2938, 2963, 0, 0, 0, 0, 2963,
+ 2963, 0, 0, 0, 0, 2963, 0, 2963, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2938, 2941, 2941,
+ 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941,
+ 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941,
+ 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941,
+ 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941,
+ 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941,
+ 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941,
+
+ 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941,
+ 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2941,
+ 2942, 0, 0, 0, 0, 0, 2942, 2942, 0, 0,
+ 0, 2942, 2942, 2942, 2955, 2955, 2955, 2955, 0, 0,
+ 0, 2942, 0, 0, 2964, 2955, 2955, 2964, 2965, 2955,
+ 0, 2965, 0, 0, 0, 2964, 2955, 2955, 2955, 2965,
+ 2964, 2964, 0, 0, 2965, 2965, 2964, 0, 2964, 0,
+ 2965, 0, 2965, 2966, 0, 0, 2966, 0, 0, 0,
+ 0, 2955, 0, 2967, 2966, 0, 2967, 0, 0, 2966,
+ 2966, 2942, 0, 2942, 2967, 2966, 0, 2966, 0, 2967,
+
+ 2967, 0, 0, 2968, 2968, 2967, 2968, 2967, 0, 0,
+ 0, 0, 2964, 0, 2968, 0, 0, 2965, 0, 2968,
+ 2968, 2984, 2984, 2984, 2984, 2968, 0, 2968, 2985, 2985,
+ 2985, 2985, 2984, 0, 0, 0, 0, 2967, 3015, 2985,
+ 0, 3015, 2966, 2984, 0, 2984, 0, 0, 0, 3015,
+ 2985, 0, 2985, 0, 3015, 3015, 0, 2968, 0, 0,
+ 3015, 0, 3015, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3015, 0, 0,
+ 2984, 0, 2985, 2998, 2998, 2998, 2998, 2998, 2998, 2998,
+
+ 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998,
+ 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998,
+ 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998,
+ 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998,
+ 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998,
+ 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998,
+ 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998,
+ 2998, 2998, 2998, 2998, 2998, 3014, 0, 0, 3014, 3016,
+ 0, 0, 3016, 0, 0, 0, 3014, 0, 0, 0,
+ 3016, 3014, 3014, 0, 0, 3016, 3016, 3014, 0, 3014,
+
+ 0, 3016, 0, 3016, 3017, 3017, 0, 3017, 0, 0,
+ 0, 3031, 3031, 3031, 3031, 3017, 0, 0, 0, 0,
+ 3017, 3017, 3031, 0, 0, 0, 3017, 0, 3017, 0,
+ 0, 0, 3016, 3031, 0, 3031, 3029, 3029, 3029, 3029,
+ 0, 0, 0, 0, 3014, 0, 0, 3029, 3029, 0,
+ 0, 3029, 3032, 3032, 3032, 3032, 0, 3017, 3029, 3029,
+ 3029, 0, 3049, 3032, 0, 3049, 0, 0, 0, 0,
+ 0, 0, 0, 3049, 3032, 3031, 3032, 0, 3049, 3049,
+ 0, 0, 0, 3029, 3049, 0, 3049, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3049, 0, 0, 0, 0, 3032,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+
+ 3036, 3036, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3059, 3059, 3059, 3059,
+ 3069, 3069, 3069, 3069, 0, 3082, 0, 3059, 3082, 0,
+ 0, 3069, 3069, 0, 0, 3069, 3082, 0, 3059, 0,
+ 3059, 3082, 3082, 3069, 0, 0, 0, 3082, 0, 3082,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3069, 0, 0,
+ 0, 0, 0, 0, 0, 3082, 0, 0, 0, 0,
+ 0, 0, 0, 3059, 3060, 3060, 3060, 3060, 3060, 3060,
+ 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060,
+ 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060,
+ 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060,
+ 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060,
+ 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060,
+ 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060,
+
+ 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060,
+ 3060, 3060, 3060, 3060, 3060, 3060, 3062, 3062, 0, 3062,
+ 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062,
+ 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062,
+ 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062,
+ 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062,
+ 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062,
+ 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062,
+ 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062,
+ 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3062, 3065, 3065,
+
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066,
+ 3066, 3066, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071,
+ 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071,
+ 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071,
+ 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071,
+
+ 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071,
+ 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071,
+ 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071,
+ 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071,
+ 3071, 3071, 3071, 3071, 3076, 3076, 3076, 3076, 3076, 3076,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076,
+
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3096, 3096,
+ 0, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096,
+ 3097, 3097, 3097, 3097, 0, 3098, 3098, 3098, 3098, 0,
+
+ 0, 3097, 3097, 0, 0, 3097, 3098, 3098, 0, 0,
+ 3098, 0, 3097, 3097, 3097, 0, 0, 3098, 3098, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3097, 0, 0,
+ 0, 0, 3098, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3102, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+
+ 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3117, 0, 0,
+ 3117, 0, 0, 0, 0, 0, 0, 0, 3117, 0,
+ 0, 0, 0, 3117, 3117, 3122, 3122, 3122, 3122, 3117,
+ 0, 3117, 3123, 3123, 3123, 3123, 3122, 3122, 0, 0,
+ 3122, 0, 3133, 3123, 3123, 3133, 0, 3123, 3122, 3122,
+ 0, 0, 0, 3133, 0, 3123, 0, 0, 3133, 3133,
+ 0, 0, 0, 0, 3133, 0, 3133, 0, 0, 0,
+ 0, 0, 3122, 0, 0, 3117, 0, 0, 0, 3123,
+ 3157, 3157, 3157, 3157, 0, 0, 0, 0, 0, 0,
+ 0, 3157, 3157, 0, 0, 3157, 0, 0, 0, 0,
+
+ 0, 0, 3157, 3157, 3157, 0, 0, 0, 0, 0,
+ 0, 3133, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3157, 3159, 3159,
+ 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159,
+ 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159,
+ 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3160, 3160,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3161, 3161,
+ 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161,
+
+ 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161,
+ 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3162, 3162,
+ 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162,
+ 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162,
+ 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3163, 3163,
+ 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163,
+ 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163,
+ 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3164, 3164,
+ 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3164,
+ 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3164,
+
+ 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3165, 3165,
+ 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165,
+ 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165,
+ 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3166, 3166,
+ 3166, 3166, 3166, 3166, 3166, 3166, 3166, 3166, 3166, 3166,
+ 3166, 3166, 3166, 3166, 3166, 3166, 3166, 3166, 3166, 3166,
+ 3166, 3166, 3166, 3166, 3166, 3166, 3166, 3166, 3167, 3167,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167,
+ 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3168, 3168,
+
+ 0, 0, 3168, 0, 3168, 3168, 3168, 3168, 3168, 3168,
+ 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168,
+ 3168, 0, 3168, 3168, 3168, 3168, 3168, 3168, 3169, 3169,
+ 0, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169,
+ 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169,
+ 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3170, 3170,
+ 0, 0, 3170, 3170, 3170, 0, 3170, 3170, 3170, 3170,
+ 3170, 3170, 3170, 3170, 3170, 3170, 3170, 3170, 3170, 3170,
+ 3170, 0, 3170, 3170, 3170, 3170, 3170, 3170, 3171, 3171,
+ 0, 3171, 3171, 0, 3171, 3171, 3171, 3171, 3171, 3171,
+
+ 3171, 3171, 3171, 3171, 3171, 3171, 3171, 3171, 3171, 3171,
+ 3171, 3171, 3171, 3171, 3171, 3171, 3171, 3171, 3172, 3172,
+ 0, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172,
+ 3172, 3172, 0, 3172, 3172, 3172, 3172, 3172, 3172, 3172,
+ 3172, 0, 3172, 3172, 3172, 3172, 3172, 3172, 3173, 3173,
+ 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173,
+ 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173,
+ 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3174, 3174,
+ 0, 3174, 3174, 3174, 3174, 3174, 3174, 3174, 0, 3174,
+ 3174, 3174, 0, 3174, 3174, 3174, 3174, 3174, 3174, 3174,
+
+ 3174, 3174, 3174, 3174, 3174, 3174, 3174, 3174, 3175, 3175,
+ 0, 0, 3175, 3175, 3175, 3175, 3175, 3175, 3175, 3175,
+ 3175, 3175, 3175, 3175, 3175, 3175, 3175, 3175, 3175, 3175,
+ 3175, 3175, 3175, 3175, 3175, 3175, 3175, 3175, 3176, 3176,
+ 0, 3176, 3176, 3176, 3176, 3176, 3176, 3176, 0, 3176,
+ 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176,
+ 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3177, 3177,
+ 3177, 3177, 0, 3177, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3177, 0, 0, 0, 3177, 3177, 0,
+ 0, 0, 3177, 0, 0, 3177, 3177, 3178, 3178, 0,
+
+ 3178, 3178, 3178, 3178, 3178, 3178, 3178, 3178, 3178, 3178,
+ 3178, 3178, 3178, 3178, 3178, 3178, 3178, 3178, 3178, 3178,
+ 3178, 3178, 3178, 3178, 3178, 3178, 3178, 3179, 3179, 3179,
+ 3179, 0, 0, 0, 3179, 3179, 0, 3179, 0, 0,
+ 0, 3179, 3179, 3179, 3179, 0, 3179, 3179, 0, 0,
+ 3179, 3179, 0, 0, 0, 3179, 3180, 3180, 3180, 3180,
+ 0, 3180, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3180, 3180, 0, 0, 0,
+ 3180, 0, 0, 0, 3180, 3182, 0, 0, 3182, 0,
+ 0, 0, 3182, 0, 0, 0, 3182, 3182, 0, 3182,
+
+ 3182, 0, 3182, 0, 3182, 3182, 0, 0, 0, 3182,
+ 0, 0, 0, 3182, 3183, 3183, 3183, 3183, 0, 3183,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3183,
+ 0, 0, 0, 3183, 3183, 0, 0, 0, 3183, 0,
+ 0, 3183, 3183, 3184, 3184, 3184, 3184, 0, 0, 0,
+ 3184, 0, 0, 0, 0, 0, 0, 3184, 3184, 0,
+ 3184, 0, 3184, 3184, 0, 0, 0, 3184, 0, 0,
+ 0, 3184, 3185, 3185, 3185, 3185, 0, 3185, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3185, 3185, 0, 0, 0, 3185, 0, 0, 0,
+
+ 3185, 3187, 3187, 0, 3187, 0, 0, 0, 3187, 0,
+ 0, 0, 3187, 3187, 0, 3187, 3187, 0, 3187, 0,
+ 3187, 3187, 0, 0, 0, 3187, 0, 0, 0, 3187,
+ 3189, 0, 0, 0, 0, 3189, 3189, 0, 0, 0,
+ 3189, 0, 0, 0, 3189, 3191, 3191, 0, 0, 0,
+ 3191, 3191, 0, 0, 0, 3191, 0, 0, 0, 3191,
+ 3193, 0, 3193, 0, 0, 0, 0, 3193, 3193, 0,
+ 0, 0, 3193, 0, 0, 0, 3193, 3195, 0, 0,
+ 0, 0, 3195, 3195, 0, 0, 0, 3195, 0, 0,
+ 0, 3195, 3197, 0, 0, 0, 0, 3197, 3197, 0,
+
+ 0, 0, 3197, 0, 0, 0, 3197, 3198, 3198, 0,
+ 3198, 3198, 3198, 3198, 3198, 3198, 3198, 3198, 3198, 3198,
+ 3198, 3198, 3198, 3198, 3198, 3198, 3198, 3198, 3198, 3198,
+ 3198, 3198, 3198, 3198, 3198, 3198, 3198, 3199, 3199, 3199,
+ 3199, 0, 3199, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3199, 0, 0, 0, 3199, 3199, 0, 0,
+ 0, 3199, 0, 0, 3199, 3199, 3200, 3200, 3200, 3200,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3200, 3200, 0, 3200, 0, 3200, 3200, 0, 0, 0,
+ 3200, 0, 0, 0, 3200, 3201, 3201, 3201, 3201, 0,
+
+ 3201, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3201, 3201, 0, 0, 0, 3201,
+ 0, 0, 0, 3201, 3203, 0, 0, 0, 0, 3203,
+ 3203, 0, 0, 0, 3203, 0, 0, 0, 3203, 3205,
+ 0, 0, 0, 0, 3205, 3205, 0, 0, 0, 3205,
+ 0, 0, 0, 3205, 3207, 0, 0, 3207, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3207, 3207,
+ 0, 0, 0, 3207, 3207, 0, 0, 0, 3207, 0,
+ 0, 0, 3207, 3209, 0, 0, 0, 0, 3209, 3209,
+ 0, 0, 0, 3209, 0, 0, 0, 3209, 3211, 3211,
+
+ 0, 3211, 0, 3211, 3211, 0, 3211, 3211, 3211, 3211,
+ 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211,
+ 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3212, 0,
+ 0, 0, 0, 3212, 3212, 0, 0, 0, 3212, 0,
+ 0, 0, 3212, 3214, 3214, 3214, 3214, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3214, 3214, 0,
+ 0, 0, 3214, 3214, 0, 0, 3214, 3214, 0, 0,
+ 0, 3214, 3215, 3215, 0, 3215, 3215, 0, 0, 3215,
+ 3215, 3215, 3215, 3215, 3215, 3215, 3215, 3215, 3215, 3215,
+ 3215, 3215, 3215, 3215, 3215, 0, 3215, 3215, 3215, 3215,
+
+ 3215, 3215, 3217, 3217, 0, 3217, 3217, 0, 0, 3217,
+ 3217, 3217, 3217, 3217, 3217, 3217, 3217, 3217, 3217, 3217,
+ 3217, 3217, 3217, 3217, 3217, 0, 3217, 3217, 3217, 3217,
+ 3217, 3217, 3218, 3218, 0, 3218, 3218, 3218, 3218, 3218,
+ 3218, 3218, 3218, 3218, 3218, 3218, 3218, 3218, 3218, 3218,
+ 3218, 3218, 3218, 3218, 3218, 3218, 3218, 3218, 3218, 3218,
+ 3218, 3218, 3220, 0, 0, 0, 0, 3220, 3220, 0,
+ 0, 0, 3220, 0, 0, 0, 3220, 3222, 3222, 0,
+ 0, 0, 3222, 3222, 0, 0, 0, 3222, 0, 0,
+ 0, 3222, 3223, 3223, 0, 0, 3223, 0, 3223, 3223,
+
+ 3223, 3223, 3223, 3223, 3223, 3223, 3223, 3223, 3223, 3223,
+ 3223, 3223, 3223, 3223, 3223, 0, 3223, 3223, 3223, 3223,
+ 3223, 3223, 3224, 3224, 0, 0, 3224, 3224, 3224, 0,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 0, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3225, 3225, 0, 3225, 3225, 0, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3226, 3226, 0, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3226, 3226, 3226, 0, 3226, 3226, 3226,
+
+ 3226, 3226, 3226, 3226, 3226, 0, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3228, 3228, 0, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 0, 3228, 3228, 3228, 0, 3228, 3228, 3228,
+ 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228, 3228,
+ 3228, 3228, 3229, 3229, 0, 0, 3229, 3229, 3229, 3229,
+ 3229, 3229, 3229, 3229, 3229, 3229, 3229, 3229, 3229, 3229,
+ 3229, 3229, 3229, 3229, 3229, 3229, 3229, 3229, 3229, 3229,
+
+ 3229, 3229, 3230, 3230, 0, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 0, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3232, 3232, 3232, 3232, 0, 0, 0, 3232,
+ 3232, 0, 3232, 0, 0, 0, 3232, 3232, 3232, 3232,
+ 0, 3232, 3232, 0, 0, 3232, 3232, 0, 0, 0,
+ 3232, 3233, 3233, 3233, 3233, 0, 3233, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3233, 3233, 0, 0, 0, 3233, 0, 0, 0, 3233,
+ 3234, 3234, 0, 3234, 3234, 3234, 3234, 3234, 3234, 3234,
+
+ 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234,
+ 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234,
+ 3235, 3235, 3235, 3235, 0, 3235, 0, 0, 3235, 3235,
+ 0, 0, 0, 0, 0, 3235, 0, 0, 0, 3235,
+ 3235, 0, 0, 0, 3235, 0, 0, 3235, 3235, 3237,
+ 3237, 0, 3237, 3237, 0, 3237, 3237, 3237, 3237, 3237,
+ 3237, 3237, 3237, 0, 3237, 3237, 3237, 3237, 3237, 3237,
+ 3237, 3237, 3237, 3237, 3237, 0, 3237, 3237, 3237, 3238,
+ 3238, 3238, 3238, 0, 3238, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3238, 3238,
+
+ 0, 0, 0, 3238, 0, 0, 0, 3238, 3239, 3239,
+ 3239, 3239, 0, 0, 0, 3239, 3239, 0, 3239, 0,
+ 0, 0, 3239, 0, 3239, 3239, 0, 3239, 3239, 0,
+ 0, 3239, 3239, 0, 0, 0, 3239, 3240, 0, 0,
+ 3240, 0, 0, 0, 3240, 0, 0, 0, 3240, 3240,
+ 0, 3240, 3240, 0, 3240, 0, 3240, 3240, 0, 0,
+ 0, 3240, 0, 0, 0, 3240, 3241, 0, 0, 3241,
+ 0, 3241, 0, 0, 3241, 3241, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3241, 3241, 0, 0, 0,
+ 3241, 0, 0, 0, 3241, 3242, 3242, 0, 3242, 3242,
+
+ 3242, 3242, 3242, 0, 0, 3242, 3242, 3242, 3242, 3242,
+ 3242, 3242, 3242, 0, 3242, 3242, 3242, 0, 3242, 0,
+ 3242, 0, 0, 3242, 3242, 3244, 3244, 3244, 3244, 0,
+ 0, 0, 3244, 0, 0, 0, 0, 0, 0, 3244,
+ 3244, 0, 3244, 0, 3244, 3244, 0, 0, 0, 3244,
+ 0, 0, 0, 3244, 3245, 3245, 3245, 3245, 0, 3245,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3245, 3245, 0, 0, 0, 3245, 0,
+ 0, 0, 3245, 3246, 3246, 0, 3246, 3246, 0, 3246,
+ 3246, 0, 0, 3246, 3246, 3246, 3246, 0, 3246, 3246,
+
+ 3246, 3246, 3246, 3246, 3246, 3246, 3246, 3246, 3246, 0,
+ 0, 3246, 3246, 3247, 3247, 3247, 3247, 0, 3247, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3247, 3247, 0, 0, 0, 3247, 0, 0,
+ 0, 3247, 3248, 3248, 3248, 3248, 0, 0, 0, 3248,
+ 0, 0, 0, 0, 0, 0, 3248, 0, 0, 0,
+ 0, 3248, 3248, 0, 0, 0, 3248, 0, 0, 0,
+ 3248, 3249, 3249, 0, 3249, 0, 0, 0, 3249, 0,
+ 0, 0, 3249, 3249, 0, 3249, 3249, 0, 3249, 0,
+ 3249, 3249, 0, 0, 0, 3249, 0, 0, 0, 3249,
+
+ 3250, 0, 0, 0, 0, 3250, 3250, 0, 0, 0,
+ 3250, 0, 0, 0, 3250, 3251, 3251, 0, 0, 0,
+ 3251, 3251, 0, 0, 0, 3251, 0, 0, 0, 3251,
+ 3252, 0, 3252, 0, 0, 0, 0, 3252, 3252, 0,
+ 0, 0, 3252, 0, 0, 0, 3252, 3253, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3253, 3253, 0, 0, 0, 3253, 0, 0, 0,
+ 3253, 3254, 0, 0, 0, 0, 3254, 3254, 0, 0,
+ 0, 3254, 0, 0, 0, 3254, 3255, 0, 0, 0,
+ 0, 3255, 3255, 0, 0, 0, 3255, 0, 0, 0,
+
+ 3255, 3256, 3256, 0, 3256, 3256, 3256, 3256, 3256, 3256,
+ 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256,
+ 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256,
+ 3256, 3258, 3258, 3258, 3258, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3258, 3258, 0, 3258, 0,
+ 3258, 3258, 0, 0, 0, 3258, 0, 0, 0, 3258,
+ 3259, 3259, 3259, 3259, 0, 3259, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3259,
+ 3259, 0, 0, 0, 3259, 0, 0, 0, 3259, 3260,
+ 3260, 0, 3260, 3260, 0, 3260, 3260, 3260, 3260, 3260,
+
+ 3260, 0, 0, 0, 3260, 3260, 3260, 3260, 3260, 3260,
+ 3260, 3260, 3260, 3260, 3260, 0, 3260, 3260, 3260, 3261,
+ 0, 0, 3261, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3261, 0, 0, 3261, 0, 3261, 3261,
+ 0, 0, 0, 3261, 0, 0, 0, 3261, 3262, 0,
+ 0, 0, 0, 3262, 3262, 0, 0, 0, 3262, 0,
+ 0, 0, 3262, 3263, 0, 0, 0, 0, 3263, 3263,
+ 0, 0, 0, 3263, 0, 0, 0, 3263, 3264, 0,
+ 0, 3264, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3264, 3264, 0, 0, 0, 3264, 3264, 0,
+
+ 0, 0, 3264, 0, 0, 0, 3264, 3265, 0, 0,
+ 0, 0, 3265, 3265, 0, 0, 0, 3265, 0, 0,
+ 0, 3265, 3266, 0, 0, 0, 0, 3266, 3266, 0,
+ 0, 0, 3266, 0, 0, 0, 3266, 3267, 3267, 0,
+ 3267, 0, 3267, 3267, 3267, 3267, 3267, 3267, 3267, 3267,
+ 3267, 3267, 3267, 3267, 3267, 3267, 3267, 3267, 3267, 3267,
+ 0, 3267, 3267, 3267, 3267, 3267, 3267, 3268, 3268, 0,
+ 3268, 3268, 3268, 3268, 3268, 3268, 3268, 3268, 3268, 3268,
+ 3268, 3268, 3268, 3268, 3268, 3268, 3268, 3268, 3268, 3268,
+ 3268, 3268, 3268, 3268, 3268, 3268, 3268, 3269, 3269, 3269,
+
+ 3269, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3269, 3269, 0, 0, 0, 3269, 3269, 0, 0,
+ 3269, 3269, 0, 0, 0, 3269, 3270, 3270, 0, 3270,
+ 3270, 0, 0, 3270, 3270, 3270, 3270, 3270, 3270, 3270,
+ 3270, 3270, 3270, 3270, 3270, 3270, 3270, 3270, 3270, 0,
+ 3270, 3270, 3270, 3270, 3270, 3270, 3271, 0, 0, 0,
+ 0, 3271, 3271, 0, 0, 0, 3271, 0, 0, 0,
+ 3271, 3272, 3272, 0, 3272, 3272, 0, 0, 3272, 3272,
+ 3272, 3272, 3272, 3272, 3272, 3272, 3272, 3272, 3272, 3272,
+ 3272, 3272, 3272, 3272, 0, 3272, 3272, 3272, 3272, 3272,
+
+ 3272, 3273, 0, 0, 0, 0, 3273, 3273, 0, 0,
+ 0, 3273, 0, 0, 0, 3273, 3274, 3274, 0, 0,
+ 0, 3274, 3274, 0, 0, 0, 3274, 0, 0, 0,
+ 3274, 3275, 3275, 3275, 3275, 3275, 3275, 3275, 3275, 3275,
+ 3275, 3275, 3275, 3275, 3275, 0, 3275, 3275, 3275, 3275,
+ 3275, 3275, 3275, 3275, 3275, 3275, 3275, 3275, 3275, 3275,
+ 3275, 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276,
+ 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276,
+ 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276,
+ 3276, 3277, 3277, 3277, 3277, 3277, 3277, 3277, 3277, 3277,
+
+ 3277, 3277, 3277, 3277, 3277, 0, 3277, 3277, 3277, 3277,
+ 3277, 3277, 3277, 3277, 3277, 3277, 3277, 3277, 3277, 3277,
+ 3277, 3278, 3278, 3278, 3278, 3278, 3278, 3278, 3278, 3278,
+ 3278, 3278, 3278, 3278, 3278, 3278, 3278, 3278, 3278, 3278,
+ 3278, 3278, 3278, 3278, 3278, 3278, 3278, 3278, 3278, 3278,
+ 3278, 3279, 3279, 3279, 3279, 3279, 3279, 3279, 3279, 3279,
+ 3279, 3279, 3279, 3279, 3279, 3279, 3279, 3279, 3279, 3279,
+ 3279, 3279, 3279, 3279, 3279, 3279, 3279, 3279, 3279, 3279,
+ 3279, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280,
+ 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280,
+
+ 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280,
+ 3280, 3281, 3281, 0, 0, 3281, 0, 3281, 3281, 3281,
+ 3281, 3281, 3281, 3281, 3281, 3281, 3281, 3281, 3281, 3281,
+ 3281, 3281, 3281, 3281, 0, 3281, 3281, 3281, 3281, 3281,
+ 3281, 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282,
+ 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282,
+ 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282,
+ 3282, 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3283,
+ 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3283,
+ 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3283,
+
+ 3283, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284,
+ 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284,
+ 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284,
+ 3284, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+ 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+ 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+ 3285, 3286, 3286, 0, 0, 3286, 3286, 3286, 0, 3286,
+ 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3286,
+ 3286, 3286, 3286, 3286, 0, 3286, 3286, 3286, 3286, 3286,
+ 3286, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287,
+
+ 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287,
+ 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287,
+ 3287, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
+ 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
+ 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
+ 3288, 3289, 3289, 3289, 3289, 3289, 3289, 3289, 3289, 3289,
+ 3289, 3289, 3289, 3289, 3289, 3289, 3289, 3289, 3289, 3289,
+ 3289, 3289, 3289, 3289, 3289, 3289, 3289, 3289, 3289, 3289,
+ 3289, 3290, 3290, 3290, 3290, 3290, 3290, 3290, 3290, 3290,
+ 3290, 3290, 3290, 3290, 3290, 3290, 3290, 3290, 3290, 3290,
+
+ 3290, 3290, 3290, 3290, 3290, 3290, 3290, 3290, 3290, 3290,
+ 3290, 3291, 3291, 0, 3291, 3291, 0, 3291, 3291, 3291,
+ 3291, 3291, 3291, 3291, 3291, 3291, 3291, 3291, 3291, 3291,
+ 3291, 3291, 3291, 3291, 3291, 3291, 3291, 3291, 3291, 3291,
+ 3291, 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292,
+ 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292,
+ 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3292,
+ 3292, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293,
+ 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293,
+ 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293,
+
+ 3293, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294,
+ 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294,
+ 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294,
+ 3294, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295,
+ 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295,
+ 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295,
+ 3295, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296,
+ 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296,
+ 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296,
+ 3296, 3297, 3297, 0, 0, 3297, 3297, 3297, 3297, 3297,
+
+ 3297, 3297, 3297, 3297, 3297, 3297, 3297, 3297, 3297, 3297,
+ 3297, 3297, 3297, 3297, 3297, 3297, 3297, 3297, 3297, 3297,
+ 3297, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298,
+ 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298,
+ 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298,
+ 3298, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299,
+ 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299,
+ 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299,
+ 3299, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300,
+ 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300,
+
+ 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300,
+ 3300, 3301, 3301, 0, 3301, 3301, 3301, 3301, 3301, 3301,
+ 3301, 0, 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3301,
+ 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3301,
+ 3301, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302,
+ 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302,
+ 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302,
+ 3302, 3303, 3303, 3303, 3303, 0, 0, 0, 0, 3303,
+ 0, 3303, 0, 0, 0, 3303, 3303, 3303, 3303, 0,
+ 3303, 3303, 0, 0, 3303, 3303, 0, 0, 0, 3303,
+
+ 3304, 3304, 3304, 3304, 0, 0, 0, 3304, 3304, 0,
+ 3304, 0, 0, 0, 3304, 3304, 3304, 3304, 0, 3304,
+ 3304, 0, 0, 3304, 3304, 0, 0, 0, 3304, 3305,
+ 3305, 3305, 3305, 0, 3305, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3305, 3305,
+ 0, 0, 0, 3305, 0, 0, 0, 3305, 3306, 3306,
+ 3306, 3306, 0, 0, 0, 0, 3306, 0, 3306, 0,
+ 0, 0, 3306, 0, 3306, 3306, 0, 3306, 3306, 0,
+ 0, 3306, 3306, 0, 0, 0, 3306, 3307, 3307, 3307,
+ 3307, 0, 3307, 0, 0, 3307, 3307, 0, 0, 0,
+
+ 0, 0, 3307, 0, 0, 0, 3307, 3307, 0, 0,
+ 0, 3307, 0, 0, 3307, 3307, 3308, 3308, 3308, 3308,
+ 0, 3308, 0, 0, 3308, 0, 0, 0, 0, 0,
+ 3308, 3308, 0, 0, 0, 3308, 3308, 0, 0, 0,
+ 3308, 0, 0, 3308, 3308, 3309, 3309, 3309, 3309, 0,
+ 3309, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3309, 3309, 0, 0, 0, 3309,
+ 0, 0, 0, 3309, 3311, 3311, 3311, 3311, 0, 3311,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3311,
+ 0, 0, 0, 3311, 3311, 0, 0, 0, 3311, 0,
+
+ 0, 3311, 3311, 3312, 3312, 3312, 3312, 0, 3312, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3312, 0,
+ 0, 0, 3312, 3312, 0, 0, 0, 3312, 0, 0,
+ 3312, 3312, 3313, 3313, 0, 3313, 3313, 0, 3313, 3313,
+ 3313, 3313, 3313, 3313, 3313, 3313, 0, 3313, 3313, 3313,
+ 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3313, 0, 3313,
+ 3313, 3313, 3314, 3314, 0, 3314, 3314, 0, 3314, 3314,
+ 3314, 3314, 3314, 3314, 0, 0, 0, 3314, 3314, 3314,
+ 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 0, 3314,
+ 3314, 3314, 3315, 3315, 0, 3315, 3315, 0, 3315, 3315,
+
+ 0, 0, 3315, 3315, 3315, 3315, 0, 3315, 3315, 3315,
+ 3315, 3315, 3315, 3315, 3315, 3315, 3315, 3315, 0, 0,
+ 3315, 3315, 3316, 3316, 3316, 3316, 0, 0, 0, 3316,
+ 3316, 0, 3316, 0, 0, 0, 3316, 0, 3316, 3316,
+ 0, 3316, 3316, 0, 0, 3316, 3316, 0, 0, 0,
+ 3316, 3317, 0, 0, 3317, 0, 0, 0, 3317, 0,
+ 0, 0, 3317, 3317, 0, 3317, 3317, 0, 3317, 0,
+ 3317, 3317, 0, 0, 0, 3317, 0, 0, 0, 3317,
+ 3318, 0, 0, 3318, 0, 3318, 0, 0, 3318, 3318,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3318,
+
+ 3318, 0, 0, 0, 3318, 0, 0, 0, 3318, 3319,
+ 0, 0, 3319, 0, 3319, 0, 0, 3319, 0, 0,
+ 0, 0, 0, 3319, 0, 0, 0, 0, 3319, 3319,
+ 0, 0, 0, 3319, 0, 0, 0, 3319, 3320, 0,
+ 0, 3320, 0, 3320, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3320, 3320, 0,
+ 0, 0, 3320, 0, 0, 0, 3320, 3321, 3321, 0,
+ 3321, 3321, 3321, 3321, 3321, 0, 0, 3321, 3321, 3321,
+ 3321, 3321, 3321, 3321, 3321, 0, 3321, 3321, 3321, 0,
+ 3321, 0, 3321, 0, 0, 3321, 3321, 3322, 3322, 3322,
+
+ 3322, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3322, 3322, 0, 0, 0, 3322, 3322, 0, 0,
+ 0, 3322, 0, 0, 0, 3322, 3323, 3323, 3323, 3323,
+ 0, 3323, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3323, 3323, 0, 0, 0,
+ 3323, 0, 0, 0, 3323, 3324, 0, 0, 3324, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3324,
+ 0, 0, 0, 0, 3324, 3324, 0, 0, 0, 3324,
+ 0, 0, 0, 3324, 3325, 3325, 3325, 3325, 0, 3325,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3325,
+
+ 0, 0, 0, 3325, 3325, 0, 0, 0, 3325, 0,
+ 0, 3325, 3325, 3326, 3326, 3326, 3326, 0, 3326, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3326, 0,
+ 0, 0, 3326, 3326, 0, 0, 0, 3326, 0, 0,
+ 3326, 3326, 3327, 3327, 0, 3327, 3327, 0, 3327, 3327,
+ 0, 0, 3327, 3327, 3327, 3327, 0, 3327, 3327, 3327,
+ 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3327, 0, 0,
+ 3327, 3327, 3328, 3328, 3328, 3328, 0, 0, 0, 3328,
+ 0, 0, 0, 0, 0, 0, 3328, 0, 0, 0,
+ 0, 3328, 3328, 0, 0, 0, 3328, 0, 0, 0,
+
+ 3328, 3329, 3329, 0, 3329, 0, 0, 0, 3329, 0,
+ 0, 0, 3329, 3329, 0, 3329, 3329, 0, 3329, 0,
+ 3329, 3329, 0, 0, 0, 3329, 0, 0, 0, 3329,
+ 3330, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3330, 3330, 0, 0, 0, 3330,
+ 0, 0, 0, 3330, 3331, 3331, 0, 0, 0, 3331,
+ 3331, 0, 0, 0, 3331, 0, 0, 0, 3331, 3333,
+ 0, 3333, 0, 0, 0, 0, 3333, 3333, 0, 0,
+ 0, 3333, 0, 0, 0, 3333, 3334, 0, 0, 0,
+ 0, 3334, 3334, 0, 0, 0, 3334, 0, 0, 0,
+
+ 3334, 3335, 0, 0, 0, 0, 3335, 3335, 0, 0,
+ 0, 3335, 0, 0, 0, 3335, 3336, 3336, 3336, 3336,
+ 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336,
+ 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336,
+ 3336, 3336, 3336, 3336, 3336, 3336, 3337, 3337, 3337, 3337,
+ 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337,
+ 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337,
+ 3337, 3337, 3337, 3337, 3337, 3337, 3338, 3338, 0, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+
+ 3338, 3338, 3338, 3338, 3338, 3338, 3339, 3339, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3340, 3340, 3340, 3340,
+ 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340,
+ 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340,
+ 3340, 3340, 3340, 3340, 3340, 3340, 3341, 3341, 3341, 3341,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3341, 3341, 0, 3341, 0, 3341, 3341, 0, 0, 0,
+ 3341, 0, 0, 0, 3341, 3342, 3342, 3342, 3342, 0,
+
+ 3342, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3342, 0, 0, 0, 3342, 3342, 0, 0, 0, 3342,
+ 0, 0, 3342, 3342, 3343, 3343, 3343, 3343, 0, 3343,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3343,
+ 0, 0, 0, 3343, 3343, 0, 0, 0, 3343, 0,
+ 0, 3343, 3343, 3344, 3344, 3344, 3344, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3344, 3344, 0,
+ 3344, 0, 3344, 3344, 0, 0, 0, 3344, 0, 0,
+ 0, 3344, 3345, 3345, 0, 3345, 3345, 0, 3345, 3345,
+ 3345, 3345, 3345, 3345, 0, 0, 0, 3345, 3345, 3345,
+
+ 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 0, 3345,
+ 3345, 3345, 3346, 0, 0, 3346, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3346, 0, 0, 3346,
+ 0, 3346, 3346, 0, 0, 0, 3346, 0, 0, 0,
+ 3346, 3347, 0, 0, 0, 0, 3347, 3347, 0, 0,
+ 0, 3347, 0, 0, 0, 3347, 3348, 0, 0, 0,
+ 0, 3348, 3348, 0, 0, 0, 3348, 0, 0, 0,
+ 3348, 3349, 0, 0, 0, 0, 3349, 3349, 0, 0,
+ 0, 3349, 0, 0, 0, 3349, 3350, 3350, 0, 3350,
+ 0, 3350, 3350, 3350, 3350, 3350, 3350, 3350, 3350, 3350,
+
+ 3350, 3350, 3350, 3350, 3350, 3350, 3350, 3350, 3350, 0,
+ 3350, 3350, 3350, 3350, 3350, 3350, 3351, 0, 0, 0,
+ 0, 3351, 3351, 0, 0, 0, 3351, 0, 0, 0,
+ 3351, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352,
+ 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352,
+ 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352,
+ 3352, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
+ 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
+ 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
+ 3353, 3354, 3354, 0, 3354, 3354, 0, 0, 3354, 3354,
+
+ 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3354,
+ 3354, 3354, 3354, 3354, 0, 3354, 3354, 3354, 3354, 3354,
+ 3354, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355,
+ 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355,
+ 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355,
+ 3355, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356,
+ 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356,
+ 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356,
+ 3356, 3357, 0, 0, 0, 0, 3357, 3357, 0, 0,
+ 0, 3357, 0, 0, 0, 3357, 3358, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3358, 3358, 0, 0, 0, 3358, 0, 0, 0, 3358,
+ 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359,
+ 0, 3359, 3359, 3359, 0, 3359, 3359, 3359, 3359, 3359,
+ 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359,
+ 3360, 3360, 3360, 3360, 3360, 3360, 3360, 3360, 3360, 3360,
+ 3360, 3360, 3360, 3360, 3360, 3360, 3360, 3360, 3360, 3360,
+ 3360, 3360, 3360, 3360, 3360, 3360, 3360, 3360, 3360, 3360,
+ 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
+ 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
+
+ 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
+ 3362, 3362, 3362, 3362, 3362, 3362, 3362, 3362, 3362, 3362,
+ 0, 3362, 3362, 3362, 0, 3362, 3362, 3362, 3362, 3362,
+ 3362, 3362, 3362, 3362, 3362, 3362, 3362, 3362, 3362, 3362,
+ 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363,
+ 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363,
+ 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363,
+ 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+
+ 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365,
+ 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365,
+ 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365,
+ 3366, 3366, 0, 0, 3366, 0, 3366, 3366, 3366, 3366,
+ 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366,
+ 3366, 3366, 3366, 0, 3366, 3366, 3366, 3366, 3366, 3366,
+ 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367,
+ 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367,
+ 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367,
+ 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368,
+
+ 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368,
+ 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368,
+ 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3369,
+ 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3369,
+ 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3369,
+ 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3370,
+ 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3370,
+ 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3370,
+ 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371,
+ 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371,
+
+ 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371,
+ 3372, 3372, 0, 0, 3372, 3372, 3372, 0, 3372, 3372,
+ 3372, 3372, 3372, 3372, 3372, 3372, 3372, 3372, 3372, 3372,
+ 3372, 3372, 3372, 0, 3372, 3372, 3372, 3372, 3372, 3372,
+ 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373,
+ 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373,
+ 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373,
+ 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374,
+ 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374,
+ 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374,
+
+ 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375,
+ 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375,
+ 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375,
+ 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376,
+ 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376,
+ 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376,
+ 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377,
+ 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377,
+ 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377,
+ 3378, 3378, 0, 3378, 3378, 0, 3378, 3378, 3378, 3378,
+
+ 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378,
+ 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378,
+ 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3379,
+ 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3379,
+ 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3379,
+ 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380,
+ 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380,
+ 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380,
+ 3381, 3381, 3381, 3381, 3381, 3381, 3381, 3381, 3381, 3381,
+ 3381, 3381, 3381, 3381, 3381, 3381, 3381, 3381, 3381, 3381,
+
+ 3381, 3381, 3381, 3381, 3381, 3381, 3381, 3381, 3381, 3381,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
+ 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383,
+ 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383,
+ 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383,
+ 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384,
+ 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384,
+ 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384,
+
+ 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385,
+ 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385,
+ 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385,
+ 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386,
+ 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386,
+ 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386,
+ 3387, 3387, 0, 0, 3387, 3387, 3387, 3387, 3387, 3387,
+ 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387,
+ 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387,
+ 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388,
+
+ 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388,
+ 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388,
+ 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389,
+ 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389,
+ 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389,
+ 3390, 3390, 3390, 3390, 3390, 3390, 3390, 3390, 3390, 3390,
+ 3390, 3390, 3390, 3390, 3390, 3390, 3390, 3390, 3390, 3390,
+ 3390, 3390, 3390, 3390, 3390, 3390, 3390, 3390, 3390, 3390,
+ 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391,
+ 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391,
+
+ 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391,
+ 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392,
+ 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392,
+ 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392,
+ 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393,
+ 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393,
+ 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393,
+ 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394,
+ 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394,
+ 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394,
+
+ 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395,
+ 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395,
+ 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395,
+ 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396,
+ 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396,
+ 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396,
+ 3397, 3397, 3397, 3397, 0, 0, 0, 0, 3397, 0,
+ 3397, 0, 0, 0, 3397, 3397, 3397, 3397, 0, 3397,
+ 3397, 0, 0, 3397, 3397, 0, 0, 0, 3397, 3398,
+ 3398, 3398, 3398, 0, 0, 0, 3398, 3398, 0, 3398,
+
+ 0, 0, 0, 3398, 3398, 3398, 3398, 0, 3398, 3398,
+ 0, 0, 3398, 3398, 0, 0, 0, 3398, 3399, 3399,
+ 3399, 3399, 0, 0, 0, 0, 3399, 0, 3399, 0,
+ 0, 0, 3399, 0, 3399, 3399, 0, 3399, 3399, 0,
+ 0, 3399, 3399, 0, 0, 0, 3399, 3401, 3401, 3401,
+ 3401, 0, 3401, 0, 0, 3401, 0, 0, 0, 0,
+ 0, 3401, 3401, 0, 0, 0, 3401, 3401, 0, 0,
+ 0, 3401, 0, 0, 3401, 3401, 3402, 3402, 3402, 3402,
+ 0, 3402, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3402, 3402, 0, 0, 0,
+
+ 3402, 0, 0, 0, 3402, 3403, 3403, 3403, 3403, 0,
+ 3403, 0, 0, 3403, 0, 0, 0, 0, 0, 3403,
+ 3403, 0, 0, 0, 3403, 3403, 0, 0, 0, 3403,
+ 0, 0, 3403, 3403, 3404, 3404, 3404, 3404, 3404, 3404,
+ 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, 0,
+ 3404, 3404, 3404, 3404, 0, 0, 3404, 3404, 3404, 0,
+ 3404, 3404, 3404, 3404, 3405, 3405, 3405, 3405, 3405, 3405,
+ 3405, 3405, 3405, 3405, 3405, 3405, 3405, 3405, 3405, 0,
+ 3405, 3405, 3405, 3405, 0, 0, 3405, 3405, 3405, 0,
+ 3405, 3405, 3405, 3405, 3406, 3406, 3406, 3406, 0, 3406,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3406,
+ 0, 0, 0, 3406, 3406, 0, 0, 0, 3406, 0,
+ 0, 3406, 3406, 3407, 3407, 3407, 3407, 0, 3407, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3407, 3407, 0, 0, 0, 3407, 0, 0,
+ 0, 3407, 3408, 3408, 0, 3408, 3408, 0, 3408, 3408,
+ 3408, 3408, 3408, 3408, 3408, 3408, 0, 3408, 3408, 3408,
+ 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 0, 3408,
+ 3408, 3408, 3409, 0, 0, 3409, 0, 0, 0, 3409,
+ 0, 0, 0, 3409, 3409, 0, 3409, 3409, 0, 3409,
+
+ 0, 3409, 3409, 0, 0, 0, 3409, 0, 0, 0,
+ 3409, 3410, 0, 0, 3410, 0, 3410, 0, 0, 3410,
+ 0, 0, 0, 0, 0, 3410, 0, 0, 0, 0,
+ 3410, 3410, 0, 0, 0, 3410, 0, 0, 0, 3410,
+ 3411, 3411, 3411, 3411, 3411, 3411, 3411, 3411, 3411, 3411,
+ 3411, 3411, 3411, 3411, 3411, 0, 3411, 3411, 3411, 3411,
+ 0, 0, 3411, 3411, 3411, 0, 3411, 3411, 3411, 3411,
+ 3412, 3412, 3412, 3412, 3412, 3412, 3412, 3412, 3412, 3412,
+ 3412, 3412, 3412, 3412, 3412, 0, 3412, 3412, 3412, 3412,
+ 0, 0, 3412, 3412, 3412, 0, 3412, 3412, 3412, 3412,
+
+ 3413, 0, 0, 3413, 0, 3413, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3413,
+ 3413, 0, 0, 0, 3413, 0, 0, 0, 3413, 3414,
+ 0, 0, 3414, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3414, 3414, 0, 3414, 0, 3414, 3414,
+ 0, 0, 0, 3414, 0, 0, 0, 3414, 3415, 3415,
+ 0, 3415, 3415, 3415, 3415, 3415, 0, 0, 3415, 3415,
+ 3415, 3415, 3415, 3415, 3415, 3415, 0, 3415, 3415, 3415,
+ 0, 3415, 0, 3415, 0, 0, 3415, 3415, 3416, 3416,
+ 3416, 3416, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 3416, 3416, 0, 0, 0, 3416, 3416, 0,
+ 0, 0, 3416, 0, 0, 0, 3416, 3417, 0, 0,
+ 3417, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3417, 0, 0, 0, 0, 3417, 3417, 0, 0,
+ 0, 3417, 0, 0, 0, 3417, 3418, 3418, 3418, 3418,
+ 0, 3418, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3418, 0, 0, 0, 3418, 3418, 0, 0, 0,
+ 3418, 0, 0, 3418, 3418, 3419, 3419, 3419, 3419, 0,
+ 3419, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3419, 3419, 0, 0, 0, 3419,
+
+ 0, 0, 0, 3419, 3420, 3420, 0, 3420, 0, 0,
+ 0, 3420, 0, 0, 0, 3420, 3420, 0, 3420, 3420,
+ 0, 3420, 0, 3420, 3420, 0, 0, 0, 3420, 0,
+ 0, 0, 3420, 3422, 3422, 0, 0, 0, 3422, 3422,
+ 0, 0, 0, 3422, 0, 0, 0, 3422, 3423, 3423,
+ 0, 0, 0, 3423, 3423, 0, 0, 0, 3423, 0,
+ 0, 0, 3423, 3424, 0, 3424, 0, 0, 0, 0,
+ 3424, 3424, 0, 0, 0, 3424, 0, 0, 0, 3424,
+ 3425, 0, 0, 0, 0, 3425, 3425, 0, 0, 0,
+ 3425, 0, 0, 0, 3425, 3426, 0, 0, 0, 0,
+
+ 3426, 3426, 0, 0, 0, 3426, 0, 0, 0, 3426,
+ 3427, 3427, 0, 3427, 3427, 3427, 3427, 3427, 3427, 3427,
+ 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427,
+ 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427,
+ 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428,
+ 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428,
+ 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428,
+ 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429,
+ 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429,
+ 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429,
+
+ 3430, 3430, 3430, 3430, 3430, 3430, 3430, 3430, 3430, 3430,
+ 3430, 3430, 3430, 3430, 3430, 3430, 3430, 3430, 3430, 3430,
+ 3430, 3430, 3430, 3430, 3430, 3430, 3430, 3430, 3430, 3430,
+ 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431,
+ 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431,
+ 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431,
+ 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432,
+ 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432,
+ 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3432,
+ 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433,
+
+ 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433,
+ 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433,
+ 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434,
+ 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434,
+ 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434,
+ 3435, 3435, 3435, 3435, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3435, 3435, 0, 3435, 0, 3435,
+ 3435, 0, 0, 0, 3435, 0, 0, 0, 3435, 3437,
+ 3437, 3437, 3437, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3437, 3437, 0, 3437, 0, 3437, 3437,
+
+ 0, 0, 0, 3437, 0, 0, 0, 3437, 3438, 3438,
+ 3438, 3438, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3438, 3438, 0, 3438, 0, 3438, 3438, 0,
+ 0, 0, 3438, 0, 0, 0, 3438, 3439, 0, 0,
+ 0, 0, 3439, 3439, 0, 0, 0, 3439, 0, 0,
+ 0, 3439, 3440, 0, 0, 3440, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3440, 0, 0, 0,
+ 0, 3440, 3440, 0, 0, 0, 3440, 0, 0, 0,
+ 3440, 3441, 0, 0, 0, 0, 3441, 3441, 0, 0,
+ 0, 3441, 0, 0, 0, 3441, 3442, 3442, 0, 3442,
+
+ 0, 3442, 3442, 3442, 3442, 3442, 3442, 3442, 3442, 3442,
+ 3442, 3442, 3442, 3442, 3442, 3442, 3442, 3442, 3442, 0,
+ 3442, 3442, 3442, 3442, 3442, 3442, 3443, 3443, 0, 3443,
+ 3443, 0, 0, 3443, 3443, 3443, 3443, 3443, 3443, 3443,
+ 3443, 3443, 3443, 3443, 3443, 3443, 3443, 3443, 3443, 0,
+ 3443, 3443, 3443, 3443, 3443, 3443, 3444, 3444, 3444, 3444,
+ 3444, 3444, 3444, 3444, 3444, 3444, 3444, 3444, 3444, 3444,
+ 3444, 3444, 3444, 3444, 3444, 3444, 3444, 3444, 3444, 3444,
+ 3444, 3444, 3444, 3444, 3444, 3444, 3445, 3445, 3445, 3445,
+ 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445,
+
+ 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445,
+ 3445, 3445, 3445, 3445, 3445, 3445, 3446, 3446, 3446, 3446,
+ 3446, 3446, 3446, 3446, 3446, 3446, 3446, 3446, 3446, 3446,
+ 3446, 3446, 3446, 3446, 3446, 3446, 3446, 3446, 3446, 3446,
+ 3446, 3446, 3446, 3446, 3446, 3446, 3447, 3447, 3447, 3447,
+ 3447, 3447, 3447, 3447, 3447, 3447, 3447, 3447, 3447, 3447,
+ 3447, 3447, 3447, 3447, 3447, 3447, 3447, 3447, 3447, 3447,
+ 3447, 3447, 3447, 3447, 3447, 3447, 3448, 3448, 3448, 3448,
+ 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+
+ 3448, 3448, 3448, 3448, 3448, 3448, 3449, 0, 0, 0,
+ 0, 3449, 3449, 0, 0, 0, 3449, 0, 0, 0,
+ 3449, 3451, 3451, 0, 0, 0, 3451, 3451, 0, 0,
+ 0, 3451, 0, 0, 0, 3451, 3452, 3452, 3452, 3452,
+ 3452, 3452, 3452, 3452, 3452, 3452, 3452, 3452, 3452, 3452,
+ 3452, 3452, 3452, 3452, 3452, 3452, 3452, 3452, 3452, 3452,
+ 3452, 3452, 3452, 3452, 3452, 3452, 3453, 3453, 3453, 3453,
+ 3453, 3453, 3453, 3453, 3453, 3453, 3453, 3453, 3453, 3453,
+ 3453, 3453, 3453, 3453, 3453, 3453, 3453, 3453, 3453, 3453,
+ 3453, 3453, 3453, 3453, 3453, 3453, 3454, 3454, 3454, 3454,
+
+ 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454,
+ 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454,
+ 3454, 3454, 3454, 3454, 3454, 3454, 3455, 3455, 3455, 3455,
+ 3455, 3455, 3455, 3455, 3455, 3455, 3455, 3455, 3455, 3455,
+ 3455, 3455, 3455, 3455, 3455, 3455, 3455, 3455, 3455, 3455,
+ 3455, 3455, 3455, 3455, 3455, 3455, 3456, 3456, 0, 0,
+ 3456, 0, 3456, 3456, 3456, 3456, 3456, 3456, 3456, 3456,
+ 3456, 3456, 3456, 3456, 3456, 3456, 3456, 3456, 3456, 0,
+ 3456, 3456, 3456, 3456, 3456, 3456, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3458, 3458, 3458, 3458,
+ 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458,
+ 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458,
+ 3458, 3458, 3458, 3458, 3458, 3458, 3459, 3459, 0, 0,
+ 3459, 3459, 3459, 0, 3459, 3459, 3459, 3459, 3459, 3459,
+ 3459, 3459, 3459, 3459, 3459, 3459, 3459, 3459, 3459, 0,
+ 3459, 3459, 3459, 3459, 3459, 3459, 3460, 3460, 3460, 3460,
+ 3460, 3460, 3460, 3460, 3460, 3460, 3460, 3460, 3460, 3460,
+ 3460, 3460, 3460, 3460, 3460, 3460, 3460, 3460, 3460, 3460,
+
+ 3460, 3460, 3460, 3460, 3460, 3460, 3461, 3461, 3461, 3461,
+ 3461, 3461, 3461, 3461, 3461, 3461, 3461, 3461, 3461, 3461,
+ 3461, 3461, 3461, 3461, 3461, 3461, 3461, 3461, 3461, 3461,
+ 3461, 3461, 3461, 3461, 3461, 3461, 3462, 3462, 0, 3462,
+ 3462, 0, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462,
+ 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462,
+ 3462, 3462, 3462, 3462, 3462, 3462, 3463, 3463, 3463, 3463,
+ 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463,
+ 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463,
+ 3463, 3463, 3463, 3463, 3463, 3463, 3464, 3464, 3464, 3464,
+
+ 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464,
+ 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464,
+ 3464, 3464, 3464, 3464, 3464, 3464, 3465, 3465, 3465, 3465,
+ 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465,
+ 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465,
+ 3465, 3465, 3465, 3465, 3465, 3465, 3466, 3466, 3466, 3466,
+ 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466,
+ 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466,
+ 3466, 3466, 3466, 3466, 3466, 3466, 3467, 3467, 3467, 3467,
+ 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467,
+
+ 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467,
+ 3467, 3467, 3467, 3467, 3467, 3467, 3468, 3468, 3468, 3468,
+ 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+ 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+ 3468, 3468, 3468, 3468, 3468, 3468, 3469, 3469, 0, 0,
+ 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3469,
+ 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3469,
+ 3469, 3469, 3469, 3469, 3469, 3469, 3470, 3470, 3470, 3470,
+ 3470, 3470, 3470, 3470, 3470, 3470, 3470, 3470, 3470, 3470,
+ 3470, 3470, 3470, 3470, 3470, 3470, 3470, 3470, 3470, 3470,
+
+ 3470, 3470, 3470, 3470, 3470, 3470, 3471, 3471, 3471, 3471,
+ 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471,
+ 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471,
+ 3471, 3471, 3471, 3471, 3471, 3471, 3472, 3472, 3472, 3472,
+ 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472,
+ 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472,
+ 3472, 3472, 3472, 3472, 3472, 3472, 3473, 3473, 3473, 3473,
+ 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473,
+ 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473,
+ 3473, 3473, 3473, 3473, 3473, 3473, 3474, 3474, 3474, 3474,
+
+ 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474,
+ 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474,
+ 3474, 3474, 3474, 3474, 3474, 3474, 3475, 3475, 3475, 3475,
+ 0, 0, 0, 3475, 3475, 0, 3475, 3475, 3475, 0,
+ 3475, 3475, 3475, 3475, 0, 3475, 3475, 0, 0, 3475,
+ 3475, 0, 0, 0, 3475, 3476, 3476, 3476, 3476, 0,
+ 3476, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3476, 0, 0, 0, 3476, 3476, 0, 0, 0, 3476,
+ 0, 0, 3476, 3476, 3477, 3477, 3477, 3477, 0, 3477,
+ 0, 0, 3477, 0, 0, 0, 0, 0, 3477, 3477,
+
+ 0, 0, 0, 3477, 3477, 0, 0, 0, 3477, 0,
+ 0, 3477, 3477, 3478, 3478, 3478, 3478, 0, 3478, 0,
+ 0, 3478, 0, 0, 0, 0, 0, 3478, 3478, 0,
+ 0, 0, 3478, 3478, 0, 0, 0, 3478, 0, 0,
+ 3478, 3478, 3479, 3479, 3479, 3479, 0, 3479, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3479, 3479, 0, 0, 0, 3479, 0, 0, 3479,
+ 3479, 3480, 0, 0, 3480, 0, 0, 0, 3480, 0,
+ 0, 0, 3480, 3480, 0, 3480, 3480, 0, 3480, 0,
+ 3480, 3480, 0, 0, 0, 3480, 0, 0, 0, 3480,
+
+ 3481, 0, 0, 3481, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3481, 3481, 0, 3481, 0, 3481,
+ 3481, 0, 0, 0, 3481, 0, 0, 0, 3481, 3482,
+ 3482, 3482, 3482, 0, 3482, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3482, 3482,
+ 0, 0, 0, 3482, 0, 0, 3482, 3482, 3483, 3483,
+ 0, 3483, 0, 0, 0, 3483, 0, 0, 0, 3483,
+ 3483, 0, 3483, 3483, 0, 3483, 0, 3483, 3483, 0,
+ 0, 0, 3483, 0, 0, 0, 3483, 3484, 3484, 0,
+ 0, 0, 3484, 3484, 0, 0, 0, 3484, 0, 0,
+
+ 0, 3484, 3485, 3485, 0, 0, 0, 3485, 3485, 0,
+ 0, 0, 3485, 0, 0, 0, 3485, 3486, 0, 0,
+ 0, 0, 3486, 3486, 0, 0, 0, 3486, 0, 0,
+ 0, 3486, 3487, 0, 0, 0, 0, 3487, 3487, 0,
+ 0, 0, 3487, 0, 0, 0, 3487, 3488, 3488, 0,
+ 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488,
+ 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488,
+ 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3489, 3489, 3489,
+ 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3489,
+ 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3489,
+
+ 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3490, 3490, 3490,
+ 3490, 3490, 3490, 3490, 3490, 3490, 3490, 3490, 3490, 3490,
+ 3490, 3490, 3490, 3490, 3490, 3490, 3490, 3490, 3490, 3490,
+ 3490, 3490, 3490, 3490, 3490, 3490, 3490, 3491, 3491, 3491,
+ 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+ 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+ 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3492, 3492, 3492,
+ 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492,
+ 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492,
+ 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3493, 3493, 3493,
+
+ 3493, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3493, 3493, 0, 3493, 0, 3493, 3493, 0, 0,
+ 0, 3493, 0, 0, 0, 3493, 3494, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3494, 3494, 0, 0, 0, 3494, 0, 0, 0, 3494,
+ 3495, 3495, 3495, 3495, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3495, 3495, 0, 3495, 0, 3495,
+ 3495, 0, 0, 0, 3495, 0, 0, 0, 3495, 3496,
+ 3496, 3496, 3496, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3496, 0, 3496, 0, 3496, 3496, 3496,
+
+ 0, 0, 0, 3496, 3496, 0, 0, 3496, 3497, 0,
+ 0, 0, 0, 3497, 3497, 0, 0, 0, 3497, 0,
+ 0, 0, 3497, 3498, 0, 0, 0, 0, 3498, 3498,
+ 0, 0, 0, 3498, 0, 0, 0, 3498, 3499, 3499,
+ 0, 3499, 3499, 0, 0, 3499, 3499, 3499, 3499, 3499,
+ 3499, 3499, 3499, 3499, 3499, 3499, 3499, 3499, 3499, 3499,
+ 3499, 0, 3499, 3499, 3499, 3499, 3499, 3499, 3500, 3500,
+ 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500,
+ 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500,
+ 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3501, 3501,
+
+ 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3501,
+ 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3501,
+ 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3502, 0,
+ 0, 0, 0, 3502, 3502, 0, 0, 0, 3502, 0,
+ 0, 0, 3502, 3503, 3503, 0, 0, 0, 3503, 3503,
+ 0, 0, 0, 3503, 0, 0, 0, 3503, 3504, 3504,
+ 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504,
+ 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504,
+ 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3505, 3505,
+ 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505,
+
+ 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505,
+ 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3506, 3506,
+ 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 0, 3506,
+ 3506, 3506, 0, 3506, 3506, 3506, 3506, 3506, 3506, 3506,
+ 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3507, 3507,
+ 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507,
+ 3507, 3507, 3507, 0, 3507, 3507, 3507, 3507, 0, 0,
+ 3507, 3507, 3507, 0, 3507, 3507, 3507, 3507, 3508, 3508,
+ 3508, 3508, 0, 0, 0, 3508, 3508, 0, 3508, 0,
+ 0, 0, 3508, 3508, 3508, 3508, 0, 3508, 3508, 0,
+
+ 0, 3508, 3508, 0, 0, 0, 3508, 3509, 3509, 3509,
+ 3509, 0, 3509, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3509, 3509, 0, 0,
+ 0, 3509, 0, 0, 3509, 3509, 3511, 3511, 3511, 3511,
+ 0, 0, 0, 3511, 0, 0, 0, 0, 0, 0,
+ 3511, 3511, 0, 3511, 0, 3511, 3511, 0, 0, 0,
+ 3511, 0, 0, 0, 3511, 3512, 3512, 3512, 3512, 0,
+ 3512, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3512, 3512, 0, 0, 0, 3512,
+ 0, 0, 0, 3512, 3513, 0, 0, 3513, 0, 0,
+
+ 0, 3513, 0, 0, 0, 3513, 3513, 0, 3513, 3513,
+ 0, 3513, 0, 3513, 3513, 0, 0, 0, 3513, 0,
+ 0, 0, 3513, 3514, 3514, 3514, 3514, 0, 3514, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3514, 3514, 0, 0, 0, 3514, 0, 0,
+ 3514, 3514, 3515, 3515, 3515, 3515, 0, 0, 0, 3515,
+ 0, 0, 0, 0, 0, 0, 3515, 3515, 0, 3515,
+ 0, 3515, 3515, 0, 0, 0, 3515, 0, 0, 0,
+ 3515, 3516, 3516, 3516, 3516, 0, 3516, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 3516, 3516, 0, 0, 0, 3516, 0, 0, 0, 3516,
+ 3517, 3517, 0, 3517, 0, 0, 0, 3517, 0, 0,
+ 0, 3517, 3517, 0, 3517, 3517, 0, 3517, 0, 3517,
+ 3517, 0, 0, 0, 3517, 0, 0, 0, 3517, 3518,
+ 3518, 0, 0, 0, 3518, 3518, 0, 0, 0, 3518,
+ 0, 0, 0, 3518, 3519, 0, 0, 0, 0, 3519,
+ 3519, 0, 0, 0, 3519, 0, 0, 0, 3519, 3520,
+ 0, 0, 0, 0, 3520, 3520, 0, 0, 0, 3520,
+ 0, 0, 0, 3520, 3522, 0, 0, 3522, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3522, 3522,
+
+ 0, 0, 0, 3522, 3522, 0, 0, 0, 3522, 0,
+ 0, 0, 3522, 3523, 3523, 3523, 3523, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3523, 3523, 0,
+ 3523, 0, 3523, 3523, 0, 0, 0, 3523, 0, 0,
+ 0, 3523, 3524, 0, 0, 0, 0, 3524, 3524, 0,
+ 0, 0, 3524, 0, 0, 0, 3524, 3525, 0, 0,
+ 0, 0, 3525, 3525, 0, 0, 0, 3525, 0, 0,
+ 0, 3525, 3526, 0, 0, 0, 0, 3526, 3526, 0,
+ 0, 0, 3526, 0, 0, 0, 3526, 3527, 0, 0,
+ 0, 0, 3527, 3527, 0, 0, 0, 3527, 0, 0,
+
+ 0, 3527, 3528, 3528, 3528, 3528, 0, 0, 0, 3528,
+ 0, 0, 0, 0, 0, 0, 3528, 3528, 0, 3528,
+ 0, 3528, 3528, 0, 0, 0, 3528, 0, 0, 0,
+ 3528, 3529, 3529, 0, 3529, 3529, 0, 3529, 3529, 0,
+ 0, 3529, 3529, 3529, 3529, 0, 3529, 3529, 3529, 3529,
+ 3529, 3529, 3529, 3529, 3529, 3529, 3529, 0, 0, 3529,
+ 3529, 3530, 3530, 3530, 3530, 0, 3530, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3530, 3530, 0, 0, 0, 3530, 0, 0, 0, 3530,
+ 3531, 3531, 3531, 3531, 0, 0, 0, 3531, 0, 0,
+
+ 0, 0, 0, 0, 3531, 0, 0, 0, 0, 3531,
+ 3531, 0, 0, 0, 3531, 0, 0, 0, 3531, 3532,
+ 3532, 3532, 3532, 0, 0, 0, 3532, 0, 0, 0,
+ 0, 0, 0, 3532, 0, 0, 0, 0, 3532, 3532,
+ 0, 0, 0, 3532, 0, 0, 0, 3532, 3533, 3533,
+ 3533, 3533, 3533, 3533, 3533, 3533, 3533, 3533, 3533, 3533,
+ 3533, 3533, 3533, 0, 3533, 3533, 3533, 3533, 0, 0,
+ 3533, 3533, 3533, 3533, 3533, 3533, 3533, 3533, 3534, 3534,
+ 0, 3534, 3534, 0, 3534, 3534, 3534, 3534, 3534, 3534,
+ 3534, 3534, 0, 3534, 3534, 3534, 3534, 3534, 3534, 3534,
+
+ 3534, 3534, 3534, 3534, 0, 3534, 3534, 3534, 3535, 3535,
+ 3535, 3535, 3535, 3535, 3535, 3535, 3535, 3535, 3535, 3535,
+ 3535, 3535, 3535, 0, 3535, 3535, 3535, 3535, 0, 0,
+ 3535, 3535, 3535, 0, 3535, 3535, 3535, 3535, 3536, 3536,
+ 0, 3536, 3536, 0, 3536, 3536, 3536, 3536, 3536, 3536,
+ 0, 0, 0, 3536, 3536, 3536, 3536, 3536, 3536, 3536,
+ 3536, 3536, 3536, 3536, 0, 3536, 3536, 3536, 3537, 3537,
+ 0, 3537, 3537, 3537, 3537, 3537, 3537, 3537, 3537, 3537,
+ 3537, 3537, 3537, 3537, 3537, 3537, 3537, 3537, 3537, 3537,
+ 3537, 3537, 3537, 3537, 3537, 3537, 3537, 3537, 3538, 3538,
+
+ 0, 3538, 3538, 3538, 3538, 3538, 3538, 3538, 3538, 3538,
+ 3538, 3538, 3538, 3538, 3538, 3538, 3538, 3538, 3538, 3538,
+ 3538, 3538, 3538, 3538, 3538, 3538, 3538, 3538, 3539, 3539,
+ 0, 3539, 3539, 0, 3539, 3539, 3539, 3539, 3539, 3539,
+ 3539, 3539, 0, 3539, 3539, 3539, 3539, 3539, 3539, 3539,
+ 3539, 3539, 3539, 3539, 0, 3539, 3539, 3539, 3540, 3540,
+ 0, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540,
+ 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540,
+ 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3540, 3541, 3541,
+ 0, 3541, 3541, 0, 3541, 3541, 3541, 3541, 3541, 3541,
+
+ 0, 0, 0, 3541, 3541, 3541, 3541, 3541, 3541, 3541,
+ 3541, 3541, 3541, 3541, 0, 3541, 3541, 3541, 3542, 3542,
+ 0, 3542, 3542, 3542, 3542, 3542, 3542, 3542, 3542, 3542,
+ 3542, 3542, 3542, 3542, 3542, 3542, 3542, 3542, 3542, 3542,
+ 3542, 3542, 3542, 3542, 3542, 3542, 3542, 3542, 3543, 3543,
+ 0, 3543, 3543, 0, 3543, 3543, 3543, 3543, 3543, 3543,
+ 0, 0, 0, 3543, 3543, 3543, 3543, 3543, 3543, 3543,
+ 3543, 3543, 3543, 3543, 0, 3543, 3543, 3543, 3544, 3544,
+ 0, 3544, 3544, 0, 3544, 3544, 3544, 3544, 3544, 3544,
+ 3544, 3544, 0, 3544, 3544, 3544, 3544, 3544, 3544, 3544,
+
+ 3544, 3544, 3544, 3544, 0, 3544, 3544, 3544, 3545, 3545,
+ 0, 3545, 3545, 3545, 3545, 3545, 0, 0, 3545, 3545,
+ 3545, 3545, 3545, 3545, 3545, 3545, 0, 3545, 3545, 3545,
+ 0, 3545, 0, 3545, 0, 0, 3545, 3545, 3546, 0,
+ 0, 3546, 0, 3546, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3546, 3546, 0,
+ 0, 0, 3546, 0, 0, 0, 3546, 3547, 0, 0,
+ 3547, 0, 0, 0, 0, 3547, 0, 0, 0, 0,
+ 0, 3547, 0, 0, 0, 0, 3547, 3547, 0, 0,
+ 0, 3547, 0, 0, 0, 3547, 3548, 3548, 0, 3548,
+
+ 3548, 3548, 3548, 3548, 3548, 3548, 3548, 3548, 3548, 3548,
+ 3548, 3548, 3548, 3548, 3548, 3548, 3548, 3548, 3548, 3548,
+ 3548, 3548, 3548, 3548, 3548, 3548, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158,
+
+ 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158, 3158
+ } ;
+
+extern int codeYY_flex_debug;
+int codeYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *codeYYtext;
+#line 1 "code.l"
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#line 19 "code.l"
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <qregexp.h>
+#include <qdir.h>
+
+#include "qtbc.h"
+#include "entry.h"
+#include "doxygen.h"
+#include "message.h"
+#include "outputlist.h"
+#include "util.h"
+#include "membername.h"
+#include "searchindex.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
+#define CLASSBLOCK (int *)4
+#define SCOPEBLOCK (int *)8
+#define INNERBLOCK (int *)12
+
+/* -----------------------------------------------------------------
+ * statics
+ */
+
+static CodeOutputInterface * g_code;
+
+static ClassSDict *g_codeClassSDict = 0;
+static QCString g_curClassName;
+static QStrList g_curClassBases;
+
+static QCString g_parmType;
+static QCString g_parmName;
+
+static const char * g_inputString; //!< the code fragment as text
+static int g_inputPosition; //!< read offset during parsing
+static int g_inputLines; //!< number of line in the code fragment
+static int g_yyLineNr; //!< current line number
+static bool g_needsTermination;
+
+static bool g_exampleBlock;
+static QCString g_exampleName;
+static QCString g_exampleFile;
+
+static bool g_insideTemplate = FALSE;
+static QCString g_type;
+static QCString g_name;
+static QCString g_args;
+static QCString g_classScope;
+static QCString g_realScope;
+static QStack<int> g_scopeStack; //!< 1 if bracket starts a scope,
+ // 2 for internal blocks
+static int g_anchorCount;
+static FileDef * g_sourceFileDef;
+static bool g_lineNumbers;
+static Definition * g_currentDefinition;
+static MemberDef * g_currentMemberDef;
+static bool g_includeCodeFragment;
+static const char * g_currentFontClass;
+static bool g_searchingForBody;
+static bool g_insideBody;
+static int g_bodyCurlyCount;
+static QCString g_saveName;
+static QCString g_saveType;
+
+static int g_bracketCount = 0;
+static int g_curlyCount = 0;
+static int g_sharpCount = 0;
+static bool g_inFunctionTryBlock = FALSE;
+static bool g_inForEachExpression = FALSE;
+
+static int g_lastTemplCastContext;
+static int g_lastSpecialCContext;
+static int g_lastStringContext;
+static int g_lastSkipCppContext;
+static int g_lastVerbStringContext;
+static int g_memCallContext;
+static int g_lastCContext;
+
+static bool g_insideObjC;
+static bool g_insideProtocolList;
+
+static bool g_lexInit = FALSE;
+
+static QStack<int> g_classScopeLengthStack;
+
+// context for an Objective-C method call
+struct ObjCCallCtx
+{
+ int id;
+ QCString methodName;
+ QCString objectTypeOrName;
+ ClassDef *objectType;
+ MemberDef *objectVar;
+ MemberDef *method;
+ QCString format;
+ int lexState;
+ int braceCount;
+};
+
+// globals for objective-C method calls
+static ObjCCallCtx *g_currentCtx=0;
+static int g_currentCtxId=0;
+static int g_currentNameId=0;
+static int g_currentObjId=0;
+static int g_currentWordId=0;
+static QStack<ObjCCallCtx> g_contextStack;
+static QIntDict<ObjCCallCtx> g_contextDict;
+static QIntDict<QCString> g_nameDict;
+static QIntDict<QCString> g_objectDict;
+static QIntDict<QCString> g_wordDict;
+static int g_braceCount=0;
+
+static void saveObjCContext();
+static void restoreObjCContext();
+
+
+
+//-------------------------------------------------------------------
+
+/*! Represents a stack of variable to class mappings as found in the
+ * code. Each scope is enclosed in pushScope() and popScope() calls.
+ * Variables are added by calling addVariables() and one can search
+ * for variable using findVariable().
+ */
+class VariableContext
+{
+ public:
+ static const ClassDef *dummyContext;
+
+ class Scope : public SDict<ClassDef>
+ {
+ public:
+ Scope() : SDict<ClassDef>(17) {}
+ };
+
+ VariableContext()
+ {
+ m_scopes.setAutoDelete(TRUE);
+ }
+ virtual ~VariableContext()
+ {
+ }
+
+ void pushScope()
+ {
+ m_scopes.append(new Scope);
+ DBG_CTX((stderr,"** Push var context %d\n",m_scopes.count()));
+ }
+
+ void popScope()
+ {
+ if (m_scopes.count()>0)
+ {
+ DBG_CTX((stderr,"** Pop var context %d\n",m_scopes.count()));
+ m_scopes.remove(m_scopes.count()-1);
+ }
+ else
+ {
+ DBG_CTX((stderr,"** ILLEGAL: Pop var context\n"));
+ }
+ }
+
+ void clear()
+ {
+ m_scopes.clear();
+ m_globalScope.clear();
+ }
+
+ void clearExceptGlobal()
+ {
+ DBG_CTX((stderr,"** Clear var context\n"));
+ m_scopes.clear();
+ }
+
+ void addVariable(const QCString &type,const QCString &name);
+ ClassDef *findVariable(const QCString &name);
+
+ int count() const { return m_scopes.count(); }
+
+ private:
+ Scope m_globalScope;
+ QList<Scope> m_scopes;
+};
+
+void VariableContext::addVariable(const QCString &type,const QCString &name)
+{
+ //printf("VariableContext::addVariable(%s,%s)\n",type.data(),name.data());
+ QCString ltype = type.simplifyWhiteSpace();
+ QCString lname = name.simplifyWhiteSpace();
+ if (ltype.left(7)=="struct ")
+ {
+ ltype = ltype.right(ltype.length()-7);
+ }
+ else if (ltype.left(6)=="union ")
+ {
+ ltype = ltype.right(ltype.length()-6);
+ }
+ if (ltype.isEmpty() || lname.isEmpty()) return;
+ DBG_CTX((stderr,"** addVariable trying: type='%s' name='%s' g_currentDefinition=%s\n",
+ ltype.data(),lname.data(),g_currentDefinition?g_currentDefinition->name().data():"<none>"));
+ Scope *scope = m_scopes.count()==0 ? &m_globalScope : m_scopes.getLast();
+ ClassDef *varType;
+ int i=0;
+ if (
+ (varType=g_codeClassSDict->find(ltype)) || // look for class definitions inside the code block
+ (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,ltype)) // look for global class definitions
+ )
+ {
+ DBG_CTX((stderr,"** addVariable type='%s' name='%s'\n",ltype.data(),lname.data()));
+ scope->append(lname,varType); // add it to a list
+ }
+ else if ((i=ltype.find('<'))!=-1)
+ {
+ // probably a template class
+ QCString typeName(ltype.left(i));
+ ClassDef* newDef = 0;
+ QCString templateArgs(ltype.right(ltype.length() - i));
+ if (
+ ( // look for class definitions inside the code block
+ (varType=g_codeClassSDict->find(typeName)) ||
+ // otherwise look for global class definitions
+ (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,typeName))
+ ) && // and it must be a template
+ varType->templateArguments())
+ {
+ newDef = varType->getVariableInstance( templateArgs );
+ }
+ if (newDef)
+ {
+ DBG_CTX((stderr,"** addVariable type='%s' templ='%s' name='%s'\n",typeName.data(),templateArgs.data(),lname.data()));
+ scope->append(lname, newDef);
+ }
+ else
+ {
+ // Doesn't seem to be a template. Try just the base name.
+ addVariable(typeName,name);
+ }
+ }
+ else
+ {
+ if (m_scopes.count()>0) // for local variables add a dummy entry so the name
+ // is hidden to avoid false links to global variables with the same name
+ // TODO: make this work for namespaces as well!
+ {
+ DBG_CTX((stderr,"** addVariable: dummy context for '%s'\n",lname.data()));
+ scope->append(lname,dummyContext);
+ }
+ else
+ {
+ DBG_CTX((stderr,"** addVariable: not adding variable!\n"));
+ }
+ }
+}
+
+ClassDef *VariableContext::findVariable(const QCString &name)
+{
+ if (name.isEmpty()) return 0;
+ ClassDef *result = 0;
+ //QListIterator<Scope> sli(m_scopes);
+ Scope *scope;
+ QCString key = name;
+ // search from inner to outer scope
+ scope = m_scopes.last();
+ //for (sli.toLast();(scope=sli.current());--sli)
+ while (scope)
+ {
+ result = scope->find(key);
+ if (result)
+ {
+ DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
+ return result;
+ }
+ scope = m_scopes.prev();
+ }
+ // nothing found -> also try the global scope
+ result=m_globalScope.find(name);
+ DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
+ return result;
+}
+
+static VariableContext g_theVarContext;
+const ClassDef *VariableContext::dummyContext = (ClassDef*)0x8;
+
+//-------------------------------------------------------------------
+
+class CallContext
+{
+ public:
+ struct Ctx
+ {
+ Ctx() : name(g_name), type(g_type), cd(0) {}
+ QCString name;
+ QCString type;
+ ClassDef *cd;
+ };
+
+ CallContext()
+ {
+ m_classList.append(new Ctx);
+ m_classList.setAutoDelete(TRUE);
+ }
+ virtual ~CallContext() {}
+ void setClass(ClassDef *cd)
+ {
+ Ctx *ctx = m_classList.getLast();
+ if (ctx)
+ {
+ DBG_CTX((stderr,"** Set call context %s (%p)\n",cd==0 ? "<null>" : cd->name().data(),cd));
+ ctx->cd=cd;
+ }
+ }
+ void pushScope()
+ {
+ m_classList.append(new Ctx);
+ DBG_CTX((stderr,"** Push call context %d\n",m_classList.count()));
+ }
+ void popScope()
+ {
+ if (m_classList.count()>1)
+ {
+ DBG_CTX((stderr,"** Pop call context %d\n",m_classList.count()));
+ Ctx *ctx = m_classList.getLast();
+ if (ctx)
+ {
+ g_name = ctx->name;
+ g_type = ctx->type;
+ }
+ m_classList.removeLast();
+ }
+ else
+ {
+ DBG_CTX((stderr,"** ILLEGAL: Pop call context\n"));
+ }
+ }
+ void clear()
+ {
+ DBG_CTX((stderr,"** Clear call context\n"));
+ m_classList.clear();
+ m_classList.append(new Ctx);
+ }
+ ClassDef *getClass() const
+ {
+ Ctx *ctx = m_classList.getLast();
+ if (ctx) return ctx->cd; else return 0;
+ }
+
+ private:
+ QList<Ctx> m_classList;
+};
+
+static CallContext g_theCallContext;
+
+//-------------------------------------------------------------------
+
+/*! add class/namespace name s to the scope */
+static void pushScope(const char *s)
+{
+ g_classScopeLengthStack.push(new int(g_classScope.length()));
+ if (g_classScope.isEmpty())
+ {
+ g_classScope = s;
+ }
+ else
+ {
+ g_classScope += "::";
+ g_classScope += s;
+ }
+ //printf("pushScope(%s) result: `%s'\n",s,g_classScope.data());
+}
+
+/*! remove the top class/namespace name from the scope */
+static void popScope()
+{
+ if (!g_classScopeLengthStack.isEmpty())
+ {
+ int *pLength = g_classScopeLengthStack.pop();
+ g_classScope.truncate(*pLength);
+ delete pLength;
+ }
+ else
+ {
+ //err("Error: Too many end of scopes found!\n");
+ }
+ //printf("popScope() result: `%s'\n",g_classScope.data());
+}
+
+static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
+ }
+}
+
+static void addToSearchIndex(const char *text)
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->addWord(text,FALSE);
+ }
+}
+
+static void setClassScope(const QCString &name)
+{
+ //printf("setClassScope(%s)\n",name.data());
+ QCString n=name;
+ n=n.simplifyWhiteSpace();
+ int ts=n.find('<'); // start of template
+ int te=n.findRev('>'); // end of template
+ //printf("ts=%d te=%d\n",ts,te);
+ if (ts!=-1 && te!=-1 && te>ts)
+ {
+ // remove template from scope
+ n=n.left(ts)+n.right(n.length()-te-1);
+ }
+ while (!g_classScopeLengthStack.isEmpty())
+ {
+ popScope();
+ }
+ g_classScope.resize(0);
+ int i;
+ while ((i=n.find("::"))!=-1)
+ {
+ pushScope(n.left(i));
+ n = n.mid(i+2);
+ }
+ pushScope(n);
+ //printf("--->New class scope `%s'\n",g_classScope.data());
+}
+
+/*! start a new line of code, inserting a line number if g_sourceFileDef
+ * is TRUE. If a definition starts at the current line, then the line
+ * number is linked to the documentation of that definition.
+ */
+static void startCodeLine()
+{
+ //if (g_currentFontClass) { g_code->endFontClass(); }
+ if (g_sourceFileDef && g_lineNumbers)
+ {
+ //QCString lineNumber,lineAnchor;
+ //lineNumber.sprintf("%05d",g_yyLineNr);
+ //lineAnchor.sprintf("l%05d",g_yyLineNr);
+
+ Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
+ //printf("%s:startCodeLine(%d)=%p\n",g_sourceFileDef->name().data(),g_yyLineNr,d);
+ if (!g_includeCodeFragment && d)
+ {
+ g_currentDefinition = d;
+ g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
+ //printf("->startCodeLine(%s)=%p\n",d->name().data(),g_currentMemberDef);
+ g_insideBody = FALSE;
+ g_searchingForBody = TRUE;
+ g_realScope = d->name().copy();
+ g_type.resize(0);
+ g_name.resize(0);
+ g_args.resize(0);
+ g_parmType.resize(0);
+ g_parmName.resize(0);
+ //printf("Real scope: `%s'\n",g_realScope.data());
+ g_bodyCurlyCount = 0;
+ QCString lineAnchor;
+ lineAnchor.sprintf("l%05d",g_yyLineNr);
+ if (g_currentMemberDef)
+ {
+ g_code->writeLineNumber(g_currentMemberDef->getReference(),
+ g_currentMemberDef->getOutputFileBase(),
+ g_currentMemberDef->anchor(),g_yyLineNr);
+ setCurrentDoc(
+ g_currentMemberDef->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ else if (d->isLinkableInProject())
+ {
+ g_code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,g_yyLineNr);
+ setCurrentDoc(
+ d->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ }
+ else
+ {
+ g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ }
+ }
+ g_code->startCodeLine();
+ if (g_currentFontClass)
+ {
+ g_code->startFontClass(g_currentFontClass);
+ }
+}
+
+
+static void endFontClass();
+static void startFontClass(const char *s);
+
+static void endCodeLine()
+{
+ endFontClass();
+ g_code->endCodeLine();
+}
+
+static void nextCodeLine()
+{
+ const char * fc = g_currentFontClass;
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ g_currentFontClass = fc;
+ startCodeLine();
+ }
+}
+
+/*! write a code fragment `text' that may span multiple lines, inserting
+ * line numbers for each line.
+ */
+static void codifyLines(char *text)
+{
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ g_code->codify(sp);
+ nextCodeLine();
+ }
+ else
+ {
+ g_code->codify(sp);
+ done=TRUE;
+ }
+ }
+}
+
+/*! writes a link to a fragment \a text that may span multiple lines, inserting
+ * line numbers for each line. If \a text contains newlines, the link will be
+ * split into multiple links with the same destination, one for each line.
+ */
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const char *ref,const char *file,
+ const char *anchor,const char *text,
+ const char *tooltip)
+{
+ bool done=FALSE;
+ char *p=(char *)text;
+ while (!done)
+ {
+ char *sp=p;
+ char c;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ nextCodeLine();
+ }
+ else
+ {
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ done=TRUE;
+ }
+ }
+}
+
+static void addType()
+{
+ if (g_name=="const") { g_name.resize(0); return; }
+ if (!g_type.isEmpty()) g_type += ' ' ;
+ g_type += g_name ;
+ g_name.resize(0) ;
+ if (!g_type.isEmpty()) g_type += ' ' ;
+ g_type += g_args ;
+ g_args.resize(0) ;
+}
+
+static void addParmType()
+{
+ if (g_parmName=="const") { g_parmName.resize(0); return; }
+ if (!g_parmType.isEmpty()) g_parmType += ' ' ;
+ g_parmType += g_parmName ;
+ g_parmName.resize(0) ;
+}
+
+static void addUsingDirective(const char *name)
+{
+ if (g_sourceFileDef && name)
+ {
+ NamespaceDef *nd = Doxygen::namespaceSDict->find(name);
+ if (nd)
+ {
+ g_sourceFileDef->addUsingDirective(nd);
+ }
+ }
+}
+
+static void setParameterList(MemberDef *md)
+{
+ g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
+ LockingPtr<ArgumentList> al = md->argumentList();
+ if (al==0) return;
+ Argument *a = al->first();
+ while (a)
+ {
+ g_parmName = a->name.copy();
+ g_parmType = a->type.copy();
+ int i = g_parmType.find('*');
+ if (i!=-1) g_parmType = g_parmType.left(i);
+ i = g_parmType.find('&');
+ if (i!=-1) g_parmType = g_parmType.left(i);
+ g_parmType.stripPrefix("const ");
+ g_parmType=g_parmType.stripWhiteSpace();
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ a = al->next();
+ }
+}
+
+static ClassDef *stripClassName(const char *s)
+{
+ int pos=0;
+ QCString type = s;
+ QCString className;
+ QCString templSpec;
+ while (extractClassNameFromType(type,pos,className,templSpec)!=-1)
+ {
+ QCString clName=className+templSpec;
+ ClassDef *cd=0;
+ if (!g_classScope.isEmpty())
+ {
+ cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope+"::"+clName);
+ }
+ if (cd==0)
+ {
+ cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,clName);
+ }
+ //printf("stripClass trying `%s' = %p\n",clName.data(),cd);
+ if (cd)
+ {
+ return cd;
+ }
+ }
+
+ return 0;
+}
+
+static MemberDef *setCallContextForVar(const QCString &name)
+{
+ if (name.isEmpty()) return 0;
+ //fprintf(stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data());
+
+ int scopeEnd = name.findRev("::");
+ if (scopeEnd!=-1) // name with explicit scope
+ {
+ QCString scope = name.left(scopeEnd);
+ QCString locName = name.right(name.length()-scopeEnd-2);
+ //printf("explicit scope: name=%s scope=%s\n",locName.data(),scope.data());
+ ClassDef *mcd = getClass(scope);
+ if (mcd && !locName.isEmpty())
+ {
+ MemberDef *md=mcd->getMemberByName(locName);
+ if (md)
+ {
+ //printf("name=%s scope=%s\n",locName.data(),scope.data());
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ return md;
+ }
+ }
+ else // check namespace as well
+ {
+ NamespaceDef *mnd = getResolvedNamespace(scope);
+ if (mnd && !locName.isEmpty())
+ {
+ MemberDef *md=mnd->getMemberByName(locName);
+ if (md)
+ {
+ //printf("name=%s scope=%s\n",locName.data(),scope.data());
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ return md;
+ }
+ }
+ }
+ }
+
+ MemberName *mn;
+ ClassDef *mcd = g_theVarContext.findVariable(name);
+ if (mcd) // local variable
+ {
+ //fprintf(stderr,"local variable\n");
+ if (mcd!=VariableContext::dummyContext)
+ {
+ //fprintf(stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data());
+ g_theCallContext.setClass(mcd);
+ }
+ }
+ else
+ {
+ // look for a class member
+ mcd = getClass(g_classScope);
+ if (mcd)
+ {
+ //fprintf(stderr,"Inside class %s\n",mcd->name().data());
+ MemberDef *md=mcd->getMemberByName(name);
+ if (md)
+ {
+ //fprintf(stderr,"Found member %s\n",md->name().data());
+ if (g_scopeStack.top()!=CLASSBLOCK)
+ {
+ //fprintf(stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data());
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ }
+ return md;
+ }
+ }
+ }
+
+ // look for a global member
+ if ((mn=Doxygen::functionNameSDict->find(name)))
+ {
+ //printf("global var `%s'\n",name.data());
+ if (mn->count()==1) // global defined only once
+ {
+ MemberDef *md=mn->getFirst();
+ if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef)
+ {
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ return md;
+ }
+ return 0;
+ }
+ else if (mn->count()>1) // global defined more than once
+ {
+ MemberDef *md=mn->first();
+ while (md)
+ {
+ //printf("mn=%p md=%p md->getBodyDef()=%p g_sourceFileDef=%p\n",
+ // mn,md,
+ // md->getBodyDef(),g_sourceFileDef);
+
+ // in case there are multiple members we could link to, we
+ // only link to members if defined in the same file or
+ // defined as external.
+ if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef)
+ {
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ //printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data());
+ return md;
+ }
+ md=mn->next();
+ }
+ return 0;
+ }
+ }
+ return 0;
+}
+
+static void addDocCrossReference(MemberDef *src,MemberDef *dst)
+{
+ static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION");
+ static bool referencesRelation = Config_getBool("REFERENCES_RELATION");
+ static bool callerGraph = Config_getBool("CALLER_GRAPH");
+ static bool callGraph = Config_getBool("CALL_GRAPH");
+
+ //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+ if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+ if ((referencedByRelation || callerGraph || dst->hasCallerGraph()) &&
+ (src->isFunction() || src->isSlot())
+ )
+ {
+ dst->addSourceReferencedBy(src);
+ MemberDef *mdDef = dst->memberDefinition();
+ if (mdDef)
+ {
+ mdDef->addSourceReferencedBy(src);
+ }
+ MemberDef *mdDecl = dst->memberDeclaration();
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferencedBy(src);
+ }
+ }
+ if ((referencesRelation || callGraph || src->hasCallGraph()) &&
+ (src->isFunction() || src->isSlot())
+ )
+ {
+ src->addSourceReferences(dst);
+ MemberDef *mdDef = src->memberDefinition();
+ if (mdDef)
+ {
+ mdDef->addSourceReferences(dst);
+ }
+ MemberDef *mdDecl = src->memberDeclaration();
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferences(dst);
+ }
+ }
+
+}
+
+static bool getLinkInScope(const QCString &c, // scope
+ const QCString &m, // member
+ const char *memberText, // exact text
+ CodeOutputInterface &ol,
+ const char *text,
+ bool varOnly=FALSE
+ )
+{
+ MemberDef *md;
+ ClassDef *cd;
+ FileDef *fd;
+ NamespaceDef *nd;
+ GroupDef *gd;
+ //fprintf(stderr,"getLinkInScope: trying `%s'::`%s' varOnly=%d\n",c.data(),m.data(),varOnly);
+ if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
+ md->isLinkable() && (!varOnly || md->isVariable()))
+ {
+ if (g_exampleBlock)
+ {
+ QCString anchor;
+ anchor.sprintf("a%d",g_anchorCount);
+ //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
+ // g_exampleFile.data());
+ if (md->addExample(anchor,g_exampleName,g_exampleFile))
+ {
+ ol.writeCodeAnchor(anchor);
+ g_anchorCount++;
+ }
+ }
+
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ //fprintf(stderr,"d=%p linkable=%d\n",d,d?d->isLinkable():0);
+ if (d && d->isLinkable())
+ {
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ //printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n",
+ // g_currentDefinition,g_currentMemberDef,g_insideBody);
+
+ if (g_currentDefinition && g_currentMemberDef &&
+ md!=g_currentMemberDef && g_insideBody)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ //printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
+
+ ol.linkableSymbol(g_yyLineNr,md->name(),md,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ text ? text : memberText,
+ md->briefDescriptionAsTooltip());
+ addToSearchIndex(text ? text : memberText);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool getLink(const char *className,
+ const char *memberName,
+ CodeOutputInterface &ol,
+ const char *text=0,
+ bool varOnly=FALSE)
+{
+ //printf("getLink(%s,%s) g_curClassName=%s\n",className,memberName,g_curClassName.data());
+ QCString m=removeRedundantWhiteSpace(memberName);
+ QCString c=className;
+ if (!getLinkInScope(c,m,memberName,ol,text,varOnly))
+ {
+ if (!g_curClassName.isEmpty())
+ {
+ if (!c.isEmpty()) c.prepend("::");
+ c.prepend(g_curClassName);
+ return getLinkInScope(c,m,memberName,ol,text,varOnly);
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
+ bool typeOnly=FALSE,bool varOnly=FALSE)
+{
+ int i=0;
+ if (*clName=='~') // correct for matching negated values i.s.o. destructors.
+ {
+ g_code->codify("~");
+ clName++;
+ }
+ QCString className=clName;
+ if (className.isEmpty()) return;
+ if (g_insideProtocolList) // for Obj-C
+ {
+ className+="-p";
+ }
+ ClassDef *cd=0,*lcd=0;
+ MemberDef *md=0;
+ bool isLocal=FALSE;
+
+ //printf("generateClassOrGlobalLink(className=%s)\n",className.data());
+ if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable
+ {
+ Definition *d = g_currentDefinition;
+ //printf("d=%p g_sourceFileDef=%p\n",d,g_currentDefinition);
+ cd = getResolvedClass(d,g_sourceFileDef,className,&md);
+ //fprintf(stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n",
+ // className.data(),g_theVarContext.count(),cd?cd->name().data():"<none>",
+ // md?md->name().data():"<none>");
+ if (cd==0 && md==0 && (i=className.find('<'))!=-1)
+ {
+ QCString bareName = className.left(i); //stripTemplateSpecifiersFromScope(className);
+ //fprintf(stderr,"bareName=%s\n",bareName.data());
+ if (bareName!=className)
+ {
+ cd=getResolvedClass(d,g_sourceFileDef,bareName,&md); // try unspecialized version
+ }
+ }
+ //printf("md=%s\n",md?md->name().data():"<none>");
+ //fprintf(stderr,"is found as a type %s\n",cd?cd->name().data():"<null>");
+ if (cd==0 && md==0) // also see if it is variable or enum or enum value
+ {
+ if (getLink(g_classScope,clName,ol,clName,varOnly))
+ {
+ return;
+ }
+ }
+ }
+ else
+ {
+ //printf("local variable!\n");
+ if (lcd!=VariableContext::dummyContext)
+ {
+ //printf("non-dummy context lcd=%s!\n",lcd->name().data());
+ g_theCallContext.setClass(lcd);
+
+ // to following is needed for links to a global variable, but is
+ // no good for a link to a local variable that is also a global symbol.
+
+ //if (getLink(g_classScope,clName,ol,clName))
+ //{
+ //return;
+ //}
+ }
+ isLocal=TRUE;
+ //fprintf(stderr,"is a local variable cd=%p!\n",cd);
+ }
+ if (cd && cd->isLinkable()) // is it a linkable class
+ {
+ //fprintf(stderr,"is linkable class %s\n",clName);
+ if (g_exampleBlock)
+ {
+ QCString anchor;
+ anchor.sprintf("_a%d",g_anchorCount);
+ //printf("addExampleClass(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
+ // g_exampleFile.data());
+ if (cd->addExample(anchor,g_exampleName,g_exampleFile))
+ {
+ ol.writeCodeAnchor(anchor);
+ g_anchorCount++;
+ }
+ }
+ ol.linkableSymbol(g_yyLineNr,cd->name(),cd,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),clName,cd->briefDescriptionAsTooltip());
+ addToSearchIndex(className);
+ g_theCallContext.setClass(cd);
+ if (md)
+ {
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ }
+ }
+ else // not a class, maybe a global member
+ {
+ //fprintf(stderr,"class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly);
+ if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
+ {
+ if (md==0) // not found as a typedef
+ {
+ md = setCallContextForVar(clName);
+ //printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
+ if (md && g_currentDefinition)
+ {
+ //fprintf(stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
+ // md->name().data(),g_currentDefinition->name().data(),
+ // isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
+ // md->getOuterScope()->name().data());
+ }
+
+ if (md && g_currentDefinition &&
+ isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
+ {
+ md=0; // variable not accessible
+ }
+ }
+ if (md && (!varOnly || md->isVariable()))
+ {
+ //fprintf(stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable());
+ if (md->isLinkable())
+ {
+ ol.linkableSymbol(g_yyLineNr,md->name(),md,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName,md->briefDescriptionAsTooltip());
+ addToSearchIndex(clName);
+ if (g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ return;
+ }
+ }
+ }
+
+ // nothing found, just write out the word
+ //fprintf(stderr,"not found!\n");
+ ol.linkableSymbol(g_yyLineNr,clName,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(clName);
+ addToSearchIndex(clName);
+ }
+}
+
+static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const char *memName)
+{
+ // extract class definition of the return type in order to resolve
+ // a->b()->c() like call chains
+
+ //printf("type=`%s' args=`%s' class=%s\n",
+ // xmd->typeString(),xmd->argsString(),
+ // xmd->getClassDef()->name().data());
+
+ if (g_exampleBlock)
+ {
+ QCString anchor;
+ anchor.sprintf("a%d",g_anchorCount);
+ //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
+ // g_exampleFile.data());
+ if (xmd->addExample(anchor,g_exampleName,g_exampleFile))
+ {
+ ol.writeCodeAnchor(anchor);
+ g_anchorCount++;
+ }
+ }
+
+ ClassDef *typeClass = stripClassName(removeAnonymousScopes(xmd->typeString()));
+ //fprintf(stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass);
+ g_theCallContext.setClass(typeClass);
+
+ Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ?
+ xmd->getBodyDef() : xmd->getOuterScope();
+ if (xmd->getGroupDef()) xd = xmd->getGroupDef();
+ if (xd && xd->isLinkable())
+ {
+
+ //printf("g_currentDefiniton=%p g_currentMemberDef=%p xmd=%p g_insideBody=%d\n",g_currentDefinition,g_currentMemberDef,xmd,g_insideBody);
+
+ if (xmd->templateMaster()) xmd = xmd->templateMaster();
+
+ if (xmd->isLinkable())
+ {
+ // add usage reference
+ if (g_currentDefinition && g_currentMemberDef &&
+ /*xmd!=g_currentMemberDef &&*/ g_insideBody)
+ {
+ addDocCrossReference(g_currentMemberDef,xmd);
+ }
+
+ // write the actual link
+ ol.linkableSymbol(g_yyLineNr,xmd->name(),xmd,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,xmd->getReference(),
+ xmd->getOutputFileBase(),xmd->anchor(),memName,xmd->briefDescriptionAsTooltip());
+ addToSearchIndex(memName);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool generateClassMemberLink(CodeOutputInterface &ol,ClassDef *mcd,const char *memName)
+{
+ if (mcd)
+ {
+ MemberDef *xmd = mcd->getMemberByName(memName);
+ //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",mcd->name().data(),memName,xmd);
+ if (xmd)
+ {
+ return generateClassMemberLink(ol,xmd,memName);
+ }
+ }
+
+ return FALSE;
+}
+
+static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName,
+ char *memName)
+{
+ //printf("generateMemberLink(object=%s,mem=%s) classScope=%s\n",
+ // varName.data(),memName,g_classScope.data());
+
+ if (varName.isEmpty()) return;
+
+ // look for the variable in the current context
+ ClassDef *vcd = g_theVarContext.findVariable(varName);
+ if (vcd)
+ {
+ if (vcd!=VariableContext::dummyContext)
+ {
+ //printf("Class found!\n");
+ if (getLink(vcd->name(),memName,ol))
+ {
+ //printf("Found result!\n");
+ return;
+ }
+ if (vcd->baseClasses())
+ {
+ BaseClassListIterator bcli(*vcd->baseClasses());
+ for ( ; bcli.current() ; ++bcli)
+ {
+ if (getLink(bcli.current()->classDef->name(),memName,ol))
+ {
+ //printf("Found result!\n");
+ return;
+ }
+ }
+ }
+ }
+ }
+ else // variable not in current context, maybe it is in a parent context
+ {
+ vcd = getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope);
+ if (vcd && vcd->isLinkable())
+ {
+ //printf("Found class %s for variable `%s'\n",g_classScope.data(),varName.data());
+ MemberName *vmn=Doxygen::memberNameSDict->find(varName);
+ if (vmn==0)
+ {
+ int vi;
+ QCString vn=varName;
+ QCString scope;
+ if ((vi=vn.findRev("::"))!=-1 || (vi=vn.findRev('.'))!=-1) // explicit scope A::b(), probably static member
+ {
+ ClassDef *jcd = getClass(vn.left(vi));
+ vn=vn.right(vn.length()-vi-2);
+ vmn=Doxygen::memberNameSDict->find(vn);
+ //printf("Trying name `%s' scope=%s\n",vn.data(),scope.data());
+ if (vmn)
+ {
+ MemberNameIterator vmni(*vmn);
+ MemberDef *vmd;
+ for (;(vmd=vmni.current());++vmni)
+ {
+ if (/*(vmd->isVariable() || vmd->isFunction()) && */
+ vmd->getClassDef()==jcd)
+ {
+ //printf("Found variable type=%s\n",vmd->typeString());
+ ClassDef *mcd=stripClassName(vmd->typeString());
+ if (mcd && mcd->isLinkable())
+ {
+ if (generateClassMemberLink(ol,mcd,memName)) return;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (vmn)
+ {
+ //printf("There is a variable with name `%s'\n",varName);
+ MemberNameIterator vmni(*vmn);
+ MemberDef *vmd;
+ for (;(vmd=vmni.current());++vmni)
+ {
+ if (/*(vmd->isVariable() || vmd->isFunction()) && */
+ vmd->getClassDef()==vcd)
+ {
+ //printf("Found variable type=%s\n",vmd->typeString());
+ ClassDef *mcd=stripClassName(vmd->typeString());
+ if (mcd && mcd->isLinkable())
+ {
+ if (generateClassMemberLink(ol,mcd,memName)) return;
+ }
+ }
+ }
+ }
+ }
+ }
+ // nothing found -> write result as is
+ ol.linkableSymbol(g_yyLineNr,memName,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(memName);
+ addToSearchIndex(memName);
+ return;
+}
+
+static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
+{
+ if (g_currentMemberDef && g_currentMemberDef->getClassDef() &&
+ funcName==g_currentMemberDef->localName() &&
+ g_currentMemberDef->getDefLine()==g_yyLineNr &&
+ generateClassMemberLink(ol,g_currentMemberDef,funcName)
+ )
+ {
+ // special case where funcName is the name of a method that is also
+ // defined on this line. In this case we can directly link to
+ // g_currentMemberDef, which is not only faster, but
+ // in case of overloaded methods, this will make sure that we link to
+ // the correct method, and thereby get the correct reimplemented relations.
+ // See also bug 549022.
+ return;
+ }
+ //CodeClassDef *ccd=0;
+ ClassDef *ccd=0;
+ QCString locScope=g_classScope;
+ QCString locFunc=removeRedundantWhiteSpace(funcName);
+ //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
+ int len=2;
+ int i=locFunc.findRev("::");
+ if (i==-1) i=locFunc.findRev("."),len=1;
+ if (i>0)
+ {
+ if (locScope.isEmpty())
+ {
+ locScope=locFunc.left(i);
+ }
+ else
+ {
+ locScope+="::"+locFunc.left(i);
+ }
+ locFunc=locFunc.right(locFunc.length()-i-len).stripWhiteSpace();
+ int ts=locScope.find('<'); // start of template
+ int te=locScope.findRev('>'); // end of template
+ //printf("ts=%d te=%d\n",ts,te);
+ if (ts!=-1 && te!=-1 && te>ts)
+ {
+ // remove template from scope
+ locScope=locScope.left(ts)+locScope.right(locScope.length()-te-1);
+ }
+ }
+ //printf("generateFunctionLink(%s) classScope=`%s'\n",locFunc.data(),locScope.data());
+ if (!locScope.isEmpty() && (ccd=g_codeClassSDict->find(locScope)))
+ {
+ //printf("using classScope %s\n",g_classScope.data());
+ if (ccd->baseClasses())
+ {
+ BaseClassListIterator bcli(*ccd->baseClasses());
+ for ( ; bcli.current() ; ++bcli)
+ {
+ if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName))
+ {
+ return;
+ }
+ }
+ }
+ }
+ if (!getLink(locScope,locFunc,ol,funcName))
+ {
+ generateClassOrGlobalLink(ol,funcName);
+ }
+ return;
+}
+
+/*! counts the number of lines in the input */
+static int countLines()
+{
+ const char *p=g_inputString;
+ char c;
+ int count=1;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
+ }
+ if (p>g_inputString && *(p-1)!='\n')
+ { // last line does not end with a \n, so we add an extra
+ // line and explicitly terminate the line after parsing.
+ count++,
+ g_needsTermination=TRUE;
+ }
+ return count;
+}
+
+static void endFontClass()
+{
+ if (g_currentFontClass)
+ {
+ g_code->endFontClass();
+ g_currentFontClass=0;
+ }
+}
+
+static void startFontClass(const char *s)
+{
+ endFontClass();
+ g_code->startFontClass(s);
+ g_currentFontClass=s;
+}
+
+//----------------------------------------------------------------------------
+
+// recursively writes a linkified Objective-C method call
+static void writeObjCMethodCall(ObjCCallCtx *ctx)
+{
+ if (ctx==0) return;
+ char c;
+ const char *p = ctx->format.data();
+ if (!ctx->methodName.isEmpty())
+ {
+ //printf("writeObjCMethodCall(%s) obj=%s method=%s\n",
+ // ctx->format.data(),ctx->objectTypeOrName.data(),ctx->methodName.data());
+ if (!ctx->objectTypeOrName.isEmpty() && ctx->objectTypeOrName.at(0)!='$')
+ {
+ //printf("Looking for object=%s method=%s\n",ctx->objectTypeOrName.data(),
+ // ctx->methodName.data());
+ ClassDef *cd = g_theVarContext.findVariable(ctx->objectTypeOrName);
+ if (cd==0) // not a local variable
+ {
+ if (ctx->objectTypeOrName=="self")
+ {
+ if (g_currentDefinition &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ctx->objectType = (ClassDef *)g_currentDefinition;
+ }
+ }
+ else
+ {
+ ctx->objectType = getResolvedClass(
+ g_currentDefinition,
+ g_sourceFileDef,
+ ctx->objectTypeOrName,
+ &ctx->method);
+ }
+ //printf(" object is class? %p\n",ctx->objectType);
+ if (ctx->objectType) // found class
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ //printf(" yes->method=%s\n",ctx->method?ctx->method->name().data():"<none>");
+ }
+ else if (ctx->method==0) // search for class variable with the same name
+ {
+ //printf(" no\n");
+ //printf("g_currentDefinition=%p\n",g_currentDefinition);
+ if (g_currentDefinition &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ctx->objectVar = ((ClassDef *)g_currentDefinition)->getMemberByName(ctx->objectTypeOrName);
+ //printf(" ctx->objectVar=%p\n",ctx->objectVar);
+ if (ctx->objectVar)
+ {
+ ctx->objectType = stripClassName(ctx->objectVar->typeString());
+ //printf(" ctx->objectType=%p\n",ctx->objectType);
+ if (ctx->objectType)
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ //printf(" ctx->method=%p\n",ctx->method);
+ }
+ }
+ }
+ }
+ }
+ else // local variable
+ {
+ //printf(" object is local variable\n");
+ if (cd!=VariableContext::dummyContext)
+ {
+ ctx->method = cd->getMemberByName(ctx->methodName);
+ //printf(" class=%p method=%p\n",cd,ctx->method);
+ }
+ }
+ }
+ }
+
+ //printf("[");
+ while ((c=*p++)) // for each character in ctx->format
+ {
+ if (c=='$')
+ {
+ char nc=*p++;
+ if (nc=='$') // escaped $
+ {
+ g_code->codify("$");
+ }
+ else // name fragment or reference to a nested call
+ {
+ if (nc=='n') // name fragment
+ {
+ nc=*p++;
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ QCString *pName = g_nameDict.find(refId);
+ if (pName)
+ {
+ if (ctx->method && ctx->method->isLinkable())
+ {
+ g_code->linkableSymbol(g_yyLineNr,ctx->method->name(),ctx->method,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(*g_code,
+ ctx->method->getReference(),
+ ctx->method->getOutputFileBase(),
+ ctx->method->anchor(),
+ pName->data(),
+ ctx->method->briefDescriptionAsTooltip());
+ if (g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,ctx->method);
+ }
+ }
+ else
+ {
+ g_code->linkableSymbol(g_yyLineNr,pName->data(),0,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ codifyLines(pName->data());
+ }
+ }
+ else
+ {
+ //printf("Invalid name: id=%d\n",refId);
+ }
+ }
+ else if (nc=='o') // reference to potential object name
+ {
+ nc=*p++;
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ QCString *pObject = g_objectDict.find(refId);
+ if (pObject)
+ {
+ if (*pObject=="self")
+ {
+ if (g_currentDefinition &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ctx->objectType = (ClassDef *)g_currentDefinition;
+ if (ctx->objectType->categoryOf())
+ {
+ ctx->objectType = ctx->objectType->categoryOf();
+ }
+ if (ctx->objectType)
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ }
+ }
+ startFontClass("keyword");
+ codifyLines(pObject->data());
+ endFontClass();
+ }
+ else if (*pObject=="super")
+ {
+ if (g_currentDefinition &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ClassDef *cd = (ClassDef *)g_currentDefinition;
+ if (cd->categoryOf())
+ {
+ cd = cd->categoryOf();
+ }
+ BaseClassList *bcd = cd->baseClasses();
+ if (bcd) // get direct base class (there should be only one)
+ {
+ BaseClassListIterator bli(*bcd);
+ BaseClassDef *bclass;
+ for (bli.toFirst();(bclass=bli.current());++bli)
+ {
+ if (bclass->classDef->compoundType()!=ClassDef::Protocol)
+ {
+ ctx->objectType = bclass->classDef;
+ if (ctx->objectType)
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ }
+ }
+ }
+ }
+ }
+ startFontClass("keyword");
+ codifyLines(pObject->data());
+ endFontClass();
+ }
+ else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
+ {
+ g_code->linkableSymbol(g_yyLineNr,ctx->objectVar->name(),ctx->objectVar,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(*g_code,
+ ctx->objectVar->getReference(),
+ ctx->objectVar->getOutputFileBase(),
+ ctx->objectVar->anchor(),
+ pObject->data(),
+ ctx->objectVar->briefDescriptionAsTooltip());
+ if (g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,ctx->objectVar);
+ }
+ }
+ else if (ctx->objectType &&
+ ctx->objectType!=VariableContext::dummyContext &&
+ ctx->objectType->isLinkable()
+ ) // object is class name
+ {
+ ClassDef *cd = ctx->objectType;
+ g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(*g_code,
+ cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ pObject->data(),
+ cd->briefDescriptionAsTooltip());
+ }
+ else // object still needs to be resolved
+ {
+ ClassDef *cd = getResolvedClass(g_currentDefinition,
+ g_sourceFileDef, *pObject);
+ if (cd && cd->isLinkable())
+ {
+ if (ctx->objectType==0) ctx->objectType=cd;
+ g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(*g_code,
+ cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ pObject->data(),
+ cd->briefDescriptionAsTooltip());
+ }
+ else
+ {
+ g_code->linkableSymbol(g_yyLineNr,pObject->data(),0,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ codifyLines(pObject->data());
+ }
+ }
+ }
+ else
+ {
+ //printf("Invalid object: id=%d\n",refId);
+ }
+ }
+ else if (nc=='c') // reference to nested call
+ {
+ nc=*p++;
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ ObjCCallCtx *ictx = g_contextDict.find(refId);
+ if (ictx) // recurse into nested call
+ {
+ writeObjCMethodCall(ictx);
+ if (ictx->method) // link to nested call successfully
+ {
+ // get the ClassDef representing the method's return type
+ if (QCString(ictx->method->typeString())=="id")
+ {
+ // see if the method name is unique, if so we link to it
+ MemberName *mn=Doxygen::memberNameSDict->find(ctx->methodName);
+ //printf("mn->count=%d ictx->method=%s ctx->methodName=%s\n",
+ // mn==0?-1:(int)mn->count(),
+ // ictx->method->name().data(),
+ // ctx->methodName.data());
+ if (mn && mn->count()==1) // member name unique
+ {
+ ctx->method = mn->getFirst();
+ }
+ }
+ else
+ {
+ ctx->objectType = stripClassName(ictx->method->typeString());
+ if (ctx->objectType)
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ }
+ }
+ //printf(" ***** method=%s -> object=%p\n",ictx->method->name().data(),ctx->objectType);
+ }
+ }
+ else
+ {
+ //printf("Invalid context: id=%d\n",refId);
+ }
+ }
+ else if (nc=='w') // some word
+ {
+ nc=*p++;
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ QCString *pWord = g_wordDict.find(refId);
+ if (pWord)
+ {
+ g_code->linkableSymbol(g_yyLineNr,pWord->data(),0,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ codifyLines(pWord->data());
+ }
+ }
+ else // illegal marker
+ {
+ ASSERT(!"invalid escape sequence");
+ }
+ }
+ }
+ else // normal non-marker character
+ {
+ char s[2];
+ s[0]=c;s[1]=0;
+ codifyLines(s);
+ }
+ }
+ //printf("%s %s]\n",ctx->objectTypeOrName.data(),ctx->methodName.data());
+ //printf("}=(type='%s',name='%s')",
+ // ctx->objectTypeOrName.data(),
+ // ctx->methodName.data());
+}
+
+// Replaces an Objective-C method name fragment s by a marker of the form
+// $n12, the number (12) can later be used as a key for obtaining the name
+// fragment, from g_nameDict
+static QCString escapeName(const char *s)
+{
+ QCString result;
+ result.sprintf("$n%d",g_currentNameId);
+ g_nameDict.insert(g_currentNameId,new QCString(s));
+ g_currentNameId++;
+ return result;
+}
+
+static QCString escapeObject(const char *s)
+{
+ QCString result;
+ result.sprintf("$o%d",g_currentObjId);
+ g_objectDict.insert(g_currentObjId,new QCString(s));
+ g_currentObjId++;
+ return result;
+}
+
+static QCString escapeWord(const char *s)
+{
+ QCString result;
+ result.sprintf("$w%d",g_currentWordId);
+ g_wordDict.insert(g_currentWordId,new QCString(s));
+ g_currentWordId++;
+ return result;
+}
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 10102 "<stdout>"
+
+#define INITIAL 0
+#define SkipString 1
+#define SkipStringS 2
+#define SkipVerbString 3
+#define SkipCPP 4
+#define SkipComment 5
+#define SkipCxxComment 6
+#define RemoveSpecialCComment 7
+#define StripSpecialCComment 8
+#define Body 9
+#define FuncCall 10
+#define MemberCall 11
+#define MemberCall2 12
+#define SkipInits 13
+#define ClassName 14
+#define PackageName 15
+#define ClassVar 16
+#define CppCliTypeModifierFollowup 17
+#define Bases 18
+#define SkipSharp 19
+#define ReadInclude 20
+#define TemplDecl 21
+#define TemplCast 22
+#define CallEnd 23
+#define ObjCMethod 24
+#define ObjCParams 25
+#define ObjCParamType 26
+#define ObjCCall 27
+#define ObjCMName 28
+#define ObjCSkipStr 29
+#define OldStyleArgs 30
+#define UsingName 31
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int codeYYlex_destroy (void );
+
+int codeYYget_debug (void );
+
+void codeYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE codeYYget_extra (void );
+
+void codeYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *codeYYget_in (void );
+
+void codeYYset_in (FILE * in_str );
+
+FILE *codeYYget_out (void );
+
+void codeYYset_out (FILE * out_str );
+
+yy_size_t codeYYget_leng (void );
+
+char *codeYYget_text (void );
+
+int codeYYget_lineno (void );
+
+void codeYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int codeYYwrap (void );
+#else
+extern int codeYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( codeYYtext, codeYYleng, 1, codeYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( codeYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( codeYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, codeYYin))==0 && ferror(codeYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(codeYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int codeYYlex (void);
+
+#define YY_DECL int codeYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after codeYYtext and codeYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( codeYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (codeYYtext[codeYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 1767 "code.l"
+
+
+#line 10321 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)codeYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in codeYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! codeYYin )
+ codeYYin = stdin;
+
+ if ( ! codeYYout )
+ codeYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ codeYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ codeYY_create_buffer(codeYYin,YY_BUF_SIZE );
+ }
+
+ codeYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of codeYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 3159 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 27527 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 1769 "code.l"
+
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 1770 "code.l"
+{
+ startFontClass("preprocessor");
+ g_code->codify(codeYYtext);
+ BEGIN( ReadInclude );
+ }
+ YY_BREAK
+case 3:
+/* rule 3 can match eol */
+YY_RULE_SETUP
+#line 1775 "code.l"
+{
+ g_insideObjC=TRUE;
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ if (!g_insideTemplate)
+ BEGIN( ClassName );
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 1783 "code.l"
+{
+ if (g_insideTemplate) REJECT;
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ BEGIN( ClassName );
+ }
+ YY_BREAK
+case 5:
+/* rule 5 can match eol */
+YY_RULE_SETUP
+#line 1790 "code.l"
+{
+ if (g_insideTemplate) REJECT;
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 1796 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ if (!g_insideTemplate)
+ BEGIN( ClassName );
+ }
+ YY_BREAK
+case 7:
+/* rule 7 can match eol */
+YY_RULE_SETUP
+#line 1803 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ BEGIN( PackageName );
+ }
+ YY_BREAK
+case 8:
+/* rule 8 can match eol */
+YY_RULE_SETUP
+#line 1809 "code.l"
+{
+ if (!g_insideObjC) REJECT;
+ codifyLines(codeYYtext);
+ BEGIN(Body);
+ }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 1814 "code.l"
+{
+ if (!g_insideObjC || g_insideBody)
+ {
+ g_code->codify(codeYYtext);
+ }
+ else // Start of Objective-C method
+ {
+ //printf("Method!\n");
+ g_code->codify(codeYYtext);
+ BEGIN(ObjCMethod);
+ }
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 1826 "code.l"
+{
+ g_code->codify(codeYYtext);
+ BEGIN(ObjCParams);
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 1830 "code.l"
+{
+ g_code->codify(codeYYtext);
+ BEGIN(ObjCParamType);
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 1834 "code.l"
+{
+ g_code->codify(codeYYtext);
+ if (*codeYYtext=='{')
+ {
+ g_curlyCount++;
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ if (g_insideBody) g_bodyCurlyCount++;
+ if (!g_curClassName.isEmpty()) // valid class name
+ {
+ pushScope(g_curClassName);
+ DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
+ g_scopeStack.push(SCOPEBLOCK);
+ }
+ }
+ g_type.resize(0);
+ g_name.resize(0);
+ BEGIN(Body);
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 1856 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 1859 "code.l"
+{
+ startFontClass("keywordtype");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ g_parmType=codeYYtext;
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 1865 "code.l"
+{
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ g_parmType=codeYYtext;
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 1869 "code.l"
+{
+ g_code->codify(codeYYtext);
+ BEGIN(ObjCParams);
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 1873 "code.l"
+{
+ g_code->linkableSymbol(g_yyLineNr,codeYYtext,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ g_code->codify(codeYYtext);
+ g_parmName=codeYYtext;
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ g_parmType.resize(0);g_parmName.resize(0);
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 1881 "code.l"
+{
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 1884 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 20:
+/* rule 20 can match eol */
+YY_RULE_SETUP
+#line 1887 "code.l"
+{
+ codifyLines(codeYYtext);
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 1890 "code.l"
+{
+ //FileInfo *f;
+ bool ambig;
+ bool found=FALSE;
+ //QCString absPath = codeYYtext;
+ //if (g_sourceFileDef && QDir::isRelativePath(absPath))
+ //{
+ // absPath = QDir::cleanDirPath(g_sourceFileDef->getPath()+"/"+absPath);
+ //}
+
+ FileDef *fd=findFileDef(Doxygen::inputNameDict,codeYYtext,ambig);
+ //printf("looking for include %s -> %s fd=%p\n",codeYYtext,absPath.data(),fd);
+ if (fd && fd->isLinkable())
+ {
+ if (ambig) // multiple input files match the name
+ {
+ //printf("===== yes %s is ambiguous\n",codeYYtext);
+ QCString name = convertToQCString(QDir::cleanDirPath(codeYYtext));
+ if (!name.isEmpty() && g_sourceFileDef)
+ {
+ FileName *fn = Doxygen::inputNameDict->find(name);
+ if (fn)
+ {
+ FileNameIterator fni(*fn);
+ // for each include name
+ for (fni.toFirst();!found && (fd=fni.current());++fni)
+ {
+ // see if this source file actually includes the file
+ found = g_sourceFileDef->isIncluded(fd->absFilePath());
+ //printf(" include file %s found=%d\n",fd->absFilePath().data(),found);
+ }
+ }
+ }
+ }
+ else // not ambiguous
+ {
+ found = TRUE;
+ }
+ }
+ //printf(" include file %s found=%d\n",fd ? fd->absFilePath().data() : "<none>",found);
+ if (found)
+ {
+ g_code->writeCodeLink(fd->getReference(),fd->getOutputFileBase(),0,codeYYtext,fd->briefDescriptionAsTooltip());
+ }
+ else
+ {
+ g_code->codify(codeYYtext);
+ }
+ char c=yyinput();
+ QCString text;
+ text+=c;
+ g_code->codify(text);
+ endFontClass();
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 1945 "code.l"
+{
+ startFontClass("preprocessor");
+ g_lastSkipCppContext = YY_START;
+ g_code->codify(codeYYtext);
+ BEGIN( SkipCPP ) ;
+ }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 1951 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 1954 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 1957 "code.l"
+{
+ codifyLines(codeYYtext);
+ }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 1960 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 1963 "code.l"
+{
+ g_theVarContext.pushScope();
+
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ g_scopeStack.push(INNERBLOCK);
+
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ g_code->codify(codeYYtext);
+ g_curlyCount++;
+ if (g_insideBody)
+ {
+ g_bodyCurlyCount++;
+ }
+ g_type.resize(0);
+ g_name.resize(0);
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 1984 "code.l"
+{
+ g_theVarContext.popScope();
+ g_type.resize(0);
+ g_name.resize(0);
+
+ int *scope = g_scopeStack.pop();
+ DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
+ if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
+ {
+ popScope();
+ }
+
+ g_code->codify(codeYYtext);
+
+ //fprintf(stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount);
+ if (--g_bodyCurlyCount<=0)
+ {
+ g_insideBody=FALSE;
+ g_currentMemberDef=0;
+ if (g_currentDefinition)
+ g_currentDefinition=g_currentDefinition->getOuterScope();
+ }
+ BEGIN(Body);
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 2008 "code.l"
+{
+ //printf("End of objc scope fd=%s\n",g_sourceFileDef->name().data());
+ if (g_sourceFileDef)
+ {
+ FileDef *fd=g_sourceFileDef;
+ g_insideObjC = fd->name().lower().right(2)==".m" ||
+ fd->name().lower().right(3)==".mm";
+ //printf("insideObjC=%d\n",g_insideObjC);
+ }
+ else
+ {
+ g_insideObjC = FALSE;
+ }
+ if (g_insideBody)
+ {
+ g_theVarContext.popScope();
+
+ int *scope = g_scopeStack.pop();
+ DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
+ if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
+ {
+ popScope();
+ }
+ g_insideBody=FALSE;
+ }
+
+ startFontClass("keyword");
+ g_code->codify(codeYYtext);
+ endFontClass();
+
+ g_currentMemberDef=0;
+ if (g_currentDefinition)
+ g_currentDefinition=g_currentDefinition->getOuterScope();
+ BEGIN(Body);
+ }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 2043 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_searchingForBody=FALSE;
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 2048 "code.l"
+{
+ g_type=g_curClassName.copy();
+ g_name.resize(0);
+ g_code->codify(codeYYtext);
+ BEGIN( Body ); // variable of type struct *
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 2054 "code.l"
+{
+ startFontClass("keyword");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 2059 "code.l"
+{
+ g_curClassName=codeYYtext;
+ addType();
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ BEGIN( ClassVar );
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 2065 "code.l"
+{
+ g_curClassName=codeYYtext;
+ g_curClassName=substitute(g_curClassName,".","::");
+ //printf("found package: %s\n",g_curClassName.data());
+ addType();
+ codifyLines(codeYYtext);
+ }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 2072 "code.l"
+{
+ unput(*codeYYtext);
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 2076 "code.l"
+{ // Java
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ g_curClassBases.clear();
+ BEGIN( Bases );
+ }
+ YY_BREAK
+case 37:
+/* rule 37 can match eol */
+YY_RULE_SETUP
+#line 2083 "code.l"
+{
+ //fprintf(stderr,"***** C++/CLI modifier %s on g_curClassName=%s\n",codeYYtext,g_curClassName.data());
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ BEGIN( CppCliTypeModifierFollowup );
+ }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 2090 "code.l"
+{
+ g_type = g_curClassName.copy();
+ g_name = codeYYtext;
+ if (g_insideBody)
+ {
+ g_theVarContext.addVariable(g_type,g_name);
+ }
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 2099 "code.l"
+{
+ codifyLines(codeYYtext);
+ g_curClassBases.clear();
+ BEGIN( Bases );
+ }
+ YY_BREAK
+case 40:
+#line 2105 "code.l"
+case 41:
+YY_RULE_SETUP
+#line 2105 "code.l"
+{
+ g_theVarContext.pushScope();
+ g_code->codify(codeYYtext);
+ g_curlyCount++;
+ if (YY_START==ClassVar && g_curClassName.isEmpty())
+ {
+ g_curClassName = g_name.copy();
+ }
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ if (g_insideBody) g_bodyCurlyCount++;
+ if (!g_curClassName.isEmpty()) // valid class name
+ {
+ DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
+ g_scopeStack.push(CLASSBLOCK);
+ pushScope(g_curClassName);
+ //fprintf(stderr,"***** g_curClassName=%s\n",g_curClassName.data());
+ if (getResolvedClass(g_currentDefinition,g_sourceFileDef,g_curClassName)==0)
+ {
+ //printf("Adding new class %s\n",g_curClassName.data());
+ ClassDef *ncd=new ClassDef("<code>",1,
+ g_curClassName,ClassDef::Class,0,0,FALSE);
+ g_codeClassSDict->append(g_curClassName,ncd);
+ // insert base classes.
+ char *s=g_curClassBases.first();
+ while (s)
+ {
+ ClassDef *bcd;
+ bcd=g_codeClassSDict->find(s);
+ if (bcd==0) bcd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
+ if (bcd && bcd!=ncd)
+ {
+ ncd->insertBaseClass(bcd,s,Public,Normal);
+ }
+ s=g_curClassBases.next();
+ }
+ }
+ //printf("g_codeClassList.count()=%d\n",g_codeClassList.count());
+ }
+ else // not a class name -> assume inner block
+ {
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ g_scopeStack.push(INNERBLOCK);
+ }
+ g_curClassName.resize(0);
+ g_curClassBases.clear();
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 2156 "code.l"
+{
+ startFontClass("keyword");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 2161 "code.l"
+{
+ //printf("%s:addBase(%s)\n",g_ccd.name.data(),codeYYtext);
+ g_curClassBases.inSort(codeYYtext);
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 2166 "code.l"
+{
+ g_code->codify(codeYYtext);
+ if (!g_insideObjC)
+ {
+ g_sharpCount=1;
+ BEGIN ( SkipSharp );
+ }
+ else
+ {
+ g_insideProtocolList=TRUE;
+ }
+ }
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 2178 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_insideProtocolList=FALSE;
+ }
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 2182 "code.l"
+{
+ g_code->codify(codeYYtext);
+ ++g_sharpCount;
+ }
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 2186 "code.l"
+{
+ g_code->codify(codeYYtext);
+ if (--g_sharpCount<=0)
+ BEGIN ( Bases );
+ }
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 2191 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_sharpCount=1;
+ BEGIN ( SkipSharp );
+ }
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 2196 "code.l"
+{
+ g_code->codify(codeYYtext);
+ ++g_sharpCount;
+ }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 2200 "code.l"
+{
+ g_code->codify(codeYYtext);
+ if (--g_sharpCount<=0)
+ BEGIN ( Bases );
+ }
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 2207 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 52:
+/* rule 52 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2212 "code.l"
+{
+ addType();
+ generateFunctionLink(*g_code,codeYYtext);
+ g_bracketCount=0;
+ g_args.resize(0);
+ g_name+=codeYYtext;
+ BEGIN( FuncCall );
+ }
+ YY_BREAK
+case 53:
+/* rule 53 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2220 "code.l"
+{
+ addType();
+ generateFunctionLink(*g_code,codeYYtext);
+ g_bracketCount=0;
+ g_args.resize(0);
+ g_name+=codeYYtext;
+ BEGIN( FuncCall );
+ }
+ YY_BREAK
+case 54:
+/* rule 54 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2228 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ g_insideTemplate=TRUE;
+ g_sharpCount=0;
+ }
+ YY_BREAK
+case 55:
+/* rule 55 can match eol */
+YY_RULE_SETUP
+#line 2235 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ BEGIN(UsingName);
+ }
+ YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 2241 "code.l"
+{ addUsingDirective(codeYYtext);
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
+ g_scopeStack.push(CLASSBLOCK);
+ pushScope(codeYYtext);
+ BEGIN(Body);
+ }
+ YY_BREAK
+case 57:
+/* rule 57 can match eol */
+YY_RULE_SETUP
+#line 2248 "code.l"
+{ codifyLines(codeYYtext); BEGIN(Body); }
+ YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 2249 "code.l"
+{ codifyLines(codeYYtext); BEGIN(Body); }
+ YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 2250 "code.l"
+{ g_code->codify(codeYYtext); // this-> for C++, this. for C#
+ }
+ YY_BREAK
+case 60:
+/* rule 60 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2252 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ if (QCString(codeYYtext)=="typedef")
+ {
+ addType();
+ g_name+=codeYYtext;
+ }
+ endFontClass();
+ }
+ YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 2262 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 62:
+/* rule 62 can match eol */
+YY_RULE_SETUP
+#line 2267 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ g_name.resize(0);g_type.resize(0);
+ }
+ YY_BREAK
+case 63:
+/* rule 63 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2273 "code.l"
+{
+ if (!g_inForEachExpression) REJECT;
+ startFontClass("keywordflow");
+ codifyLines(codeYYtext);
+ endFontClass();
+ // insert the variable in the parent scope, see bug 546158
+ g_theVarContext.popScope();
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ g_theVarContext.pushScope();
+ g_name.resize(0);g_type.resize(0);
+ }
+ YY_BREAK
+case 64:
+/* rule 64 can match eol */
+YY_RULE_SETUP
+#line 2284 "code.l"
+{
+ startFontClass("keywordflow");
+ codifyLines(codeYYtext);
+ endFontClass();
+ g_name.resize(0);g_type.resize(0);
+ g_inForEachExpression = (strcmp(codeYYtext,"for each")==0 || strcmp(codeYYtext, "foreach")==0);
+ BEGIN(FuncCall);
+ }
+ YY_BREAK
+case 65:
+/* rule 65 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2292 "code.l"
+{
+ startFontClass("keywordflow");
+ codifyLines(codeYYtext);
+ endFontClass();
+ if (g_inFunctionTryBlock && (strcmp(codeYYtext,"catch")==0 || strcmp(codeYYtext,"finally")==0))
+ {
+ g_inFunctionTryBlock=FALSE;
+ }
+ }
+ YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 2301 "code.l"
+{
+ startFontClass("keywordflow");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 2306 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_name.resize(0);g_type.resize(0);
+ if (*codeYYtext==')')
+ {
+ g_theCallContext.popScope();
+ g_bracketCount--;
+ BEGIN(FuncCall);
+ }
+ }
+ YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 2316 "code.l"
+{
+ startFontClass("keywordtype");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ addType();
+ g_name+=codeYYtext;
+ }
+ YY_BREAK
+case 69:
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 7;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2323 "code.l"
+{
+ startFontClass("keyword");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ g_sharpCount=0;
+ BEGIN(TemplDecl);
+ }
+ YY_BREAK
+case 70:
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 8;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2330 "code.l"
+{ // template<...>
+ startFontClass("keyword");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ g_sharpCount=0;
+ BEGIN(TemplDecl);
+ }
+ YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 2337 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 2342 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_sharpCount++;
+ }
+ YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 2346 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_sharpCount--;
+ if (g_sharpCount<=0)
+ {
+ BEGIN(Body);
+ }
+ }
+ YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 2354 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ BEGIN( g_lastTemplCastContext );
+ }
+ YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 2360 "code.l"
+{
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ }
+ YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 2363 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 2368 "code.l"
+{
+ codifyLines(codeYYtext);
+ }
+ YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 2371 "code.l"
+{ // static_cast<T>(
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ g_lastTemplCastContext = YY_START;
+ BEGIN(TemplCast);
+ }
+ YY_BREAK
+case 79:
+/* rule 79 can match eol */
+YY_RULE_SETUP
+#line 2378 "code.l"
+{ // A<T> *pt;
+ int i=QCString(codeYYtext).find('<');
+ QCString kw = QCString(codeYYtext).left(i).stripWhiteSpace();
+ if (kw.right(5)=="_cast" && YY_START==Body)
+ {
+ REJECT;
+ }
+ addType();
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ g_name+=codeYYtext;
+ }
+ YY_BREAK
+case 80:
+/* rule 80 can match eol */
+YY_RULE_SETUP
+#line 2389 "code.l"
+{ // "int var;" or "var, var2" or "debug(f) macro"
+ addType();
+ // changed this to generateFunctionLink, see bug 624514
+ //generateClassOrGlobalLink(*g_code,codeYYtext,FALSE,TRUE);
+ generateFunctionLink(*g_code,codeYYtext);
+ g_name+=codeYYtext;
+ }
+ YY_BREAK
+case 81:
+/* rule 81 can match eol */
+YY_RULE_SETUP
+#line 2396 "code.l"
+{ // p->func()
+ addType();
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ g_name+=codeYYtext;
+ }
+ YY_BREAK
+case 82:
+/* rule 82 can match eol */
+YY_RULE_SETUP
+#line 2401 "code.l"
+{ // (*p)->func() but not "if (p) ..."
+ g_code->codify(codeYYtext);
+ int s=0;while (s<(int)codeYYleng && !isId(codeYYtext[s])) s++;
+ int e=(int)codeYYleng-1;while (e>=0 && !isId(codeYYtext[e])) e--;
+ QCString varname = ((QCString)codeYYtext).mid(s,e-s+1);
+ addType();
+ g_name=varname;
+ }
+ YY_BREAK
+case 83:
+/* rule 83 can match eol */
+YY_RULE_SETUP
+#line 2409 "code.l"
+{ // a() or c::a() or t<A,B>::a()
+ addType();
+ generateFunctionLink(*g_code,codeYYtext);
+ //printf("---> g_classScope=%s\n",g_classScope.data());
+ //g_theVarContext.addVariable(g_type,codeYYtext);
+ g_bracketCount=0;
+ g_args.resize(0);
+ g_name+=codeYYtext;
+ BEGIN( FuncCall );
+ }
+ YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 2419 "code.l"
+{
+ startFontClass("stringliteral");
+ g_code->codify(codeYYtext);
+ g_lastStringContext=YY_START;
+ g_inForEachExpression = FALSE;
+ BEGIN( SkipString );
+ }
+ YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 2426 "code.l"
+{
+ startFontClass("stringliteral");
+ g_code->codify(codeYYtext);
+ g_lastStringContext=YY_START;
+ g_inForEachExpression = FALSE;
+ BEGIN( SkipStringS );
+ }
+ YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 2433 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 2436 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 2439 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 2442 "code.l"
+{
+ g_code->codify(codeYYtext);
+ endFontClass();
+ BEGIN( g_lastStringContext );
+ }
+ YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 2447 "code.l"
+{
+ g_code->codify(codeYYtext);
+ endFontClass();
+ BEGIN( g_lastStringContext );
+ }
+ YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 2452 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 2455 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 2458 "code.l"
+{ // escaped quote
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 2461 "code.l"
+{ // end of string
+ g_code->codify(codeYYtext);
+ endFontClass();
+ BEGIN( g_lastVerbStringContext );
+ }
+ YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 2466 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 96:
+/* rule 96 can match eol */
+YY_RULE_SETUP
+#line 2469 "code.l"
+{
+ codifyLines(codeYYtext);
+ }
+ YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 2472 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_name.resize(0);g_type.resize(0);
+ }
+ YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 2476 "code.l"
+{
+ if (g_insideTemplate)
+ {
+ g_sharpCount++;
+ }
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 99:
+YY_RULE_SETUP
+#line 2483 "code.l"
+{
+ if (g_insideTemplate)
+ {
+ if (--g_sharpCount<=0)
+ {
+ g_insideTemplate=FALSE;
+ }
+ }
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 2493 "code.l"
+{
+ startFontClass("charliteral");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 101:
+YY_RULE_SETUP
+#line 2498 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_memCallContext = YY_START;
+ BEGIN( MemberCall );
+ }
+ YY_BREAK
+case 102:
+/* rule 102 can match eol */
+YY_RULE_SETUP
+#line 2503 "code.l"
+{
+ if (g_theCallContext.getClass())
+ {
+ if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),codeYYtext))
+ {
+ g_code->linkableSymbol(g_yyLineNr,codeYYtext,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ g_code->codify(codeYYtext);
+ addToSearchIndex(codeYYtext);
+ }
+ g_name.resize(0);
+ }
+ else
+ {
+ g_code->linkableSymbol(g_yyLineNr,codeYYtext,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ g_code->codify(codeYYtext);
+ addToSearchIndex(codeYYtext);
+ g_name.resize(0);
+ }
+ g_type.resize(0);
+ g_bracketCount=0;
+ if (g_memCallContext==Body)
+ {
+ BEGIN(FuncCall);
+ }
+ else
+ {
+ BEGIN(g_memCallContext);
+ }
+ }
+ YY_BREAK
+case 103:
+/* rule 103 can match eol */
+YY_RULE_SETUP
+#line 2534 "code.l"
+{
+ if (g_theCallContext.getClass())
+ {
+ //fprintf(stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass());
+ if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),codeYYtext))
+ {
+ g_code->linkableSymbol(g_yyLineNr,codeYYtext,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ g_code->codify(codeYYtext);
+ addToSearchIndex(codeYYtext);
+ }
+ g_name.resize(0);
+ }
+ else
+ {
+ //fprintf(stderr,"no class context!\n");
+ g_code->codify(codeYYtext);
+ addToSearchIndex(codeYYtext);
+ g_name.resize(0);
+ }
+ g_type.resize(0);
+ BEGIN(g_memCallContext);
+ }
+ YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 2557 "code.l"
+{
+ if (g_insideObjC && *codeYYtext=='[')
+ {
+ //printf("Found start of ObjC call!\n");
+ // start of a method call
+ g_contextDict.setAutoDelete(TRUE);
+ g_nameDict.setAutoDelete(TRUE);
+ g_objectDict.setAutoDelete(TRUE);
+ g_wordDict.setAutoDelete(TRUE);
+ g_contextDict.clear();
+ g_nameDict.clear();
+ g_objectDict.clear();
+ g_wordDict.clear();
+ g_currentCtxId = 0;
+ g_currentNameId = 0;
+ g_currentObjId = 0;
+ g_currentCtx = 0;
+ g_braceCount = 0;
+ unput('[');
+ BEGIN(ObjCCall);
+ }
+ else
+ {
+ g_code->codify(codeYYtext);
+ g_saveName = g_name.copy();
+ g_saveType = g_type.copy();
+ if (*codeYYtext!='[' && !g_type.isEmpty())
+ {
+ //printf("g_scopeStack.bottom()=%p\n",g_scopeStack.bottom());
+ if (g_scopeStack.top()!=CLASSBLOCK)
+ {
+ //printf("AddVariable: '%s' '%s' context=%d\n",
+ // g_type.data(),g_name.data(),g_theVarContext.count());
+ g_theVarContext.addVariable(g_type,g_name);
+ }
+ g_name.resize(0);
+ }
+ if (*codeYYtext==';' || *codeYYtext=='=')
+ {
+ g_type.resize(0);
+ g_name.resize(0);
+ }
+ else if (*codeYYtext=='[')
+ {
+ g_theCallContext.pushScope();
+ }
+ g_args.resize(0);
+ g_parmType.resize(0);
+ g_parmName.resize(0);
+ }
+ }
+ YY_BREAK
+/*
+<ObjCMemberCall>{ID} {
+ if (strcmp(codeYYtext,"self")==0 || strcmp(codeYYtext,"super")==0)
+ {
+ // TODO: get proper base class for "super"
+ g_theCallContext.setClass(getClass(g_curClassName));
+ startFontClass("keyword");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ }
+ else
+ {
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ }
+ g_name.resize(0);
+ BEGIN(ObjCMemberCall2);
+ }
+<ObjCMemberCall>"[" {
+ g_code->codify(codeYYtext);
+ g_theCallContext.pushScope();
+ }
+<ObjCMemberCall2>{ID}":"? {
+ g_name+=codeYYtext;
+ if (g_theCallContext.getClass())
+ {
+ //printf("Calling method %s\n",g_name.data());
+ if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),g_name))
+ {
+ g_code->codify(codeYYtext);
+ addToSearchIndex(g_name);
+ }
+ }
+ else
+ {
+ g_code->codify(codeYYtext);
+ addToSearchIndex(g_name);
+ }
+ g_name.resize(0);
+ BEGIN(ObjCMemberCall3);
+ }
+<ObjCMemberCall2,ObjCMemberCall3>"]" {
+ g_theCallContext.popScope();
+ g_code->codify(codeYYtext);
+ BEGIN(Body);
+ }
+ */
+case 105:
+YY_RULE_SETUP
+#line 2654 "code.l"
+{
+ saveObjCContext();
+ g_currentCtx->format+=*codeYYtext;
+ BEGIN(ObjCCall);
+ //printf("open\n");
+ }
+ YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 2660 "code.l"
+{
+ g_currentCtx->format+=*codeYYtext;
+ restoreObjCContext();
+ BEGIN(ObjCMName);
+ if (g_currentCtx==0)
+ {
+ // end of call
+ writeObjCMethodCall(g_contextDict.find(0));
+ BEGIN(Body);
+ }
+ //printf("close\n");
+ }
+ YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 2672 "code.l"
+{
+ g_currentCtx->format+=escapeObject(codeYYtext);
+ if (g_braceCount==0)
+ {
+ g_currentCtx->objectTypeOrName=codeYYtext;
+ //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
+ BEGIN(ObjCMName);
+ }
+ }
+ YY_BREAK
+case 108:
+/* rule 108 can match eol */
+YY_RULE_SETUP
+#line 2681 "code.l"
+{
+ if (g_braceCount==0 &&
+ g_currentCtx->methodName.isEmpty())
+ {
+ g_currentCtx->methodName=codeYYtext;
+ g_currentCtx->format+=escapeName(codeYYtext);
+ }
+ else
+ {
+ g_currentCtx->format+=escapeWord(codeYYtext);
+ }
+ }
+ YY_BREAK
+case 109:
+/* rule 109 can match eol */
+YY_RULE_SETUP
+#line 2693 "code.l"
+{
+ if (g_braceCount==0)
+ {
+ g_currentCtx->methodName+=codeYYtext;
+ g_currentCtx->methodName+=":";
+ }
+ g_currentCtx->format+=escapeName(codeYYtext);
+ }
+ YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 2701 "code.l"
+{ g_currentCtx->format+=codeYYtext; }
+ YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 2702 "code.l"
+{ g_currentCtx->format+=codeYYtext; }
+ YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 2703 "code.l"
+{ g_currentCtx->format+=codeYYtext;
+ BEGIN(g_lastStringContext);
+ }
+ YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 2706 "code.l"
+{ g_currentCtx->format+=codeYYtext; }
+ YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 2707 "code.l"
+{ g_currentCtx->format+=codeYYtext;
+ g_lastStringContext=YY_START;
+ BEGIN(ObjCSkipStr);
+ }
+ YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 2711 "code.l"
+{ g_currentCtx->format+="$$"; }
+ YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 2712 "code.l"
+{ g_currentCtx->format+=*codeYYtext; g_braceCount++; }
+ YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 2713 "code.l"
+{ g_currentCtx->format+=*codeYYtext; g_braceCount--; }
+ YY_BREAK
+case 118:
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2714 "code.l"
+{ // needed to prevent matching the global rule (for C#)
+ g_currentCtx->format+=codeYYtext;
+ }
+ YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 2717 "code.l"
+{ g_currentCtx->format+=escapeWord(codeYYtext); }
+ YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 2718 "code.l"
+{ g_currentCtx->format+=*codeYYtext; }
+ YY_BREAK
+case 121:
+/* rule 121 can match eol */
+YY_RULE_SETUP
+#line 2719 "code.l"
+{ g_currentCtx->format+=*codeYYtext; }
+ YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 2721 "code.l"
+{
+ g_theCallContext.popScope();
+ g_code->codify(codeYYtext);
+ // TODO: nested arrays like: a[b[0]->func()]->func()
+ g_name = g_saveName.copy();
+ g_type = g_saveType.copy();
+ }
+ YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 2728 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 2731 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 125:
+/* rule 125 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2734 "code.l"
+{
+ //addParmType();
+ //g_parmName=codeYYtext;
+ startFontClass("keyword");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 126:
+/* rule 126 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2741 "code.l"
+{
+ addParmType();
+ g_parmName=codeYYtext;
+ startFontClass("keywordtype");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 127:
+/* rule 127 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2748 "code.l"
+{
+ addParmType();
+ g_parmName=codeYYtext;
+ startFontClass("keywordflow");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 128:
+YY_RULE_SETUP
+#line 2755 "code.l"
+{
+ addParmType();
+ g_parmName=codeYYtext;
+ generateClassOrGlobalLink(*g_code,codeYYtext,!g_insideBody);
+ }
+ YY_BREAK
+case 129:
+YY_RULE_SETUP
+#line 2760 "code.l"
+{ // probably a cast, not a function call
+ g_code->codify(codeYYtext);
+ g_inForEachExpression = FALSE;
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 2765 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ g_parmType.resize(0);g_parmName.resize(0);
+ }
+ YY_BREAK
+case 131:
+YY_RULE_SETUP
+#line 2770 "code.l"
+{
+ g_parmType.resize(0);g_parmName.resize(0);
+ g_code->codify(codeYYtext);
+ g_bracketCount++;
+ g_theCallContext.pushScope();
+ if (YY_START==FuncCall && !g_insideBody)
+ {
+ g_theVarContext.pushScope();
+ }
+ }
+ YY_BREAK
+case 132:
+YY_RULE_SETUP
+#line 2780 "code.l"
+{ // operator
+ if (strcmp(codeYYtext,"*") &&
+ strcmp(codeYYtext,"&") &&
+ strcmp(codeYYtext,"^") &&
+ strcmp(codeYYtext,"%")) // typically a pointer or reference
+ {
+ // not a * or &, or C++/CLI's ^ or %
+ g_parmType.resize(0);g_parmName.resize(0);
+ }
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 2791 "code.l"
+{
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ g_theCallContext.popScope();
+ g_inForEachExpression = FALSE;
+ //g_theCallContext.setClass(0); // commented out, otherwise a()->b() does not work for b().
+ g_code->codify(codeYYtext);
+ if (--g_bracketCount<=0)
+ {
+ if (g_name.isEmpty())
+ {
+ BEGIN( Body );
+ }
+ else
+ {
+ BEGIN( CallEnd );
+ }
+ }
+ }
+ YY_BREAK
+case 134:
+/* rule 134 can match eol */
+YY_RULE_SETUP
+#line 2809 "code.l"
+{ codifyLines(codeYYtext); }
+ YY_BREAK
+/*
+<MemberCall2,FuncCall>")"[ \t\n]*[;:] {
+ */
+case 135:
+YY_RULE_SETUP
+#line 2813 "code.l"
+{
+ codifyLines(codeYYtext);
+ g_bracketCount=0;
+ if (*codeYYtext==';') g_searchingForBody=FALSE;
+ if (!g_type.isEmpty())
+ {
+ //fprintf(stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data());
+ g_theVarContext.addVariable(g_type,g_name);
+ }
+ g_parmType.resize(0);g_parmName.resize(0);
+ g_theCallContext.setClass(0);
+ if (*codeYYtext==';' || g_insideBody)
+ {
+ if (!g_insideBody)
+ {
+ g_theVarContext.popScope();
+ }
+ g_name.resize(0);g_type.resize(0);
+ BEGIN( Body );
+ }
+ else
+ {
+ g_bracketCount=0;
+ BEGIN( SkipInits );
+ }
+ }
+ YY_BREAK
+case 136:
+/* rule 136 can match eol */
+YY_RULE_SETUP
+#line 2839 "code.l"
+{
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 137:
+/* rule 137 can match eol */
+YY_RULE_SETUP
+#line 2844 "code.l"
+{
+ if (g_insideBody)
+ {
+ g_theVarContext.pushScope();
+ }
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ //g_theCallContext.popScope();
+ g_parmType.resize(0);g_parmName.resize(0);
+ int index = g_name.findRev("::");
+ if (index!=-1)
+ {
+ QCString scope = g_name.left(index);
+ if (!g_classScope.isEmpty()) scope.prepend(g_classScope+"::");
+ ClassDef *cd=getResolvedClass(Doxygen::globalScope,g_sourceFileDef,scope);
+ if (cd)
+ {
+ setClassScope(cd->name());
+ g_scopeStack.push(SCOPEBLOCK);
+ DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
+ }
+ else
+ {
+ //setClassScope(g_realScope);
+ g_scopeStack.push(INNERBLOCK);
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ }
+ }
+ else
+ {
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ g_scopeStack.push(INNERBLOCK);
+ }
+ codeYYtext[codeYYleng-1]='\0';
+ QCString cv(codeYYtext);
+ if (!cv.stripWhiteSpace().isEmpty())
+ {
+ startFontClass("keyword");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ else // just whitespace
+ {
+ codifyLines(codeYYtext);
+ }
+ g_code->codify("{");
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ if (g_insideBody) g_bodyCurlyCount++;
+ g_curlyCount++;
+ g_type.resize(0); g_name.resize(0);
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 2899 "code.l"
+{ // function-try-block
+ startFontClass("keyword");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ g_inFunctionTryBlock=TRUE;
+ }
+ YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 2905 "code.l"
+{
+ if (g_insideBody || !g_parmType.isEmpty())
+ {
+ REJECT;
+ }
+ // could be K&R style definition
+ addParmType();
+ g_parmName=codeYYtext;
+ generateClassOrGlobalLink(*g_code,codeYYtext,!g_insideBody);
+ BEGIN(OldStyleArgs);
+ }
+ YY_BREAK
+case 140:
+YY_RULE_SETUP
+#line 2916 "code.l"
+{
+ addParmType();
+ g_parmName=codeYYtext;
+ generateClassOrGlobalLink(*g_code,codeYYtext,!g_insideBody);
+ }
+ YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 2921 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ if (*codeYYtext==';') g_parmType.resize(0);
+ g_parmName.resize(0);
+ }
+ YY_BREAK
+case 142:
+YY_RULE_SETUP
+#line 2927 "code.l"
+{
+ startFontClass("preprocessor");
+ g_lastSkipCppContext = Body;
+ g_code->codify(codeYYtext);
+ BEGIN( SkipCPP );
+ }
+ YY_BREAK
+case 143:
+YY_RULE_SETUP
+#line 2933 "code.l"
+{
+ unput(*codeYYtext);
+ if (!g_insideBody)
+ {
+ g_theVarContext.popScope();
+ }
+ g_name.resize(0);g_args.resize(0);
+ g_parmType.resize(0);g_parmName.resize(0);
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 144:
+YY_RULE_SETUP
+#line 2943 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_type.resize(0); g_name.resize(0);
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 145:
+YY_RULE_SETUP
+#line 2948 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_curlyCount++;
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ if (g_insideBody) g_bodyCurlyCount++;
+ if (g_name.find("::")!=-1)
+ {
+ DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
+ g_scopeStack.push(SCOPEBLOCK);
+ setClassScope(g_realScope);
+ }
+ else
+ {
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ g_scopeStack.push(INNERBLOCK);
+ }
+ g_type.resize(0); g_name.resize(0);
+ BEGIN( Body );
+ }
+ YY_BREAK
+case 146:
+YY_RULE_SETUP
+#line 2971 "code.l"
+{
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ }
+ YY_BREAK
+case 147:
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 2974 "code.l"
+{
+ generateFunctionLink(*g_code,codeYYtext);
+ }
+ YY_BREAK
+case 148:
+YY_RULE_SETUP
+#line 2977 "code.l"
+{
+ g_name=codeYYtext;
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ BEGIN( MemberCall2 );
+ }
+ YY_BREAK
+case 149:
+YY_RULE_SETUP
+#line 2982 "code.l"
+{
+ g_code->codify(codeYYtext);
+ int s=0;while (!isId(codeYYtext[s])) s++;
+ int e=codeYYleng-1;while (!isId(codeYYtext[e])) e--;
+ g_name=((QCString)codeYYtext).mid(s,e-s+1);
+ BEGIN( MemberCall2 );
+ }
+ YY_BREAK
+case 150:
+/* rule 150 can match eol */
+YY_RULE_SETUP
+#line 2989 "code.l"
+{
+ if (!g_args.isEmpty())
+ generateMemberLink(*g_code,g_args,codeYYtext);
+ else
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ g_args.resize(0);
+ BEGIN( FuncCall );
+ }
+ YY_BREAK
+case 151:
+/* rule 151 can match eol */
+YY_RULE_SETUP
+#line 2997 "code.l"
+{
+ //g_code->codify(codeYYtext);
+ g_name=codeYYtext;
+ generateClassOrGlobalLink(*g_code,codeYYtext);
+ BEGIN( MemberCall2 );
+ }
+ YY_BREAK
+case 152:
+YY_RULE_SETUP
+#line 3003 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_memCallContext = YY_START;
+ BEGIN( MemberCall );
+ }
+ YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 3008 "code.l"
+{
+ g_code->codify(codeYYtext);
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+ YY_BREAK
+case 154:
+YY_RULE_SETUP
+#line 3013 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 155:
+YY_RULE_SETUP
+#line 3016 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 156:
+YY_RULE_SETUP
+#line 3019 "code.l"
+{
+ g_code->codify(codeYYtext);
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+ YY_BREAK
+case 157:
+/* rule 157 can match eol */
+YY_RULE_SETUP
+#line 3024 "code.l"
+{ // line continuation
+ codifyLines(codeYYtext);
+ }
+ YY_BREAK
+case 158:
+YY_RULE_SETUP
+#line 3027 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 159:
+YY_RULE_SETUP
+#line 3030 "code.l"
+
+ YY_BREAK
+case 160:
+/* rule 160 can match eol */
+YY_RULE_SETUP
+#line 3031 "code.l"
+{
+ unput('\n');
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+ YY_BREAK
+case 161:
+YY_RULE_SETUP
+#line 3036 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+case 162:
+/* rule 162 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 3039 "code.l"
+{
+ g_yyLineNr+=QCString(codeYYtext).contains('\n');
+ }
+ YY_BREAK
+case 163:
+/* rule 163 can match eol */
+YY_RULE_SETUP
+#line 3042 "code.l"
+{
+ g_yyLineNr+=QCString(codeYYtext).contains('\n');
+ nextCodeLine();
+ if (g_lastSpecialCContext==SkipCxxComment)
+ { // force end of C++ comment here
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+ else
+ {
+ BEGIN(g_lastSpecialCContext);
+ }
+ }
+ YY_BREAK
+case 164:
+YY_RULE_SETUP
+#line 3055 "code.l"
+{
+ BEGIN(g_lastSpecialCContext);
+ }
+ YY_BREAK
+case 165:
+YY_RULE_SETUP
+#line 3058 "code.l"
+
+ YY_BREAK
+case 166:
+YY_RULE_SETUP
+#line 3059 "code.l"
+
+ YY_BREAK
+case 167:
+/* rule 167 can match eol */
+YY_RULE_SETUP
+#line 3060 "code.l"
+{ g_yyLineNr++; }
+ YY_BREAK
+case 168:
+YY_RULE_SETUP
+#line 3061 "code.l"
+
+ YY_BREAK
+case 169:
+YY_RULE_SETUP
+#line 3062 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_type.resize(0);
+ g_name.resize(0);
+ BEGIN(g_memCallContext);
+ }
+ YY_BREAK
+case 170:
+/* rule 170 can match eol */
+YY_RULE_SETUP
+#line 3068 "code.l"
+{ // remove special one-line comment
+ if (YY_START==SkipCPP) REJECT;
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr+=((QCString)codeYYtext).contains('\n');
+ nextCodeLine();
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ if (YY_START==SkipCxxComment)
+ {
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+ }
+ YY_BREAK
+case 171:
+/* rule 171 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 3087 "code.l"
+{
+ codifyLines(codeYYtext);
+ endFontClass();
+ BEGIN( g_lastSkipCppContext ) ;
+ }
+ YY_BREAK
+case 172:
+/* rule 172 can match eol */
+YY_RULE_SETUP
+#line 3092 "code.l"
+{ // remove one-line group marker
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr+=2;
+ nextCodeLine();
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ if (YY_START==SkipCxxComment)
+ {
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+ }
+ YY_BREAK
+case 173:
+/* rule 173 can match eol */
+YY_RULE_SETUP
+#line 3110 "code.l"
+{ // remove one-line group marker
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ g_yyLineNr++;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ codifyLines(codeYYtext);
+ BEGIN(SkipComment);
+ }
+ }
+ YY_BREAK
+case 174:
+/* rule 174 can match eol */
+YY_RULE_SETUP
+#line 3129 "code.l"
+{ // remove one-line group marker
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr++;
+ nextCodeLine();
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ }
+ YY_BREAK
+case 175:
+YY_RULE_SETUP
+#line 3142 "code.l"
+{ // remove multi-line group marker
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ g_code->codify(codeYYtext);
+ BEGIN(SkipComment);
+ }
+ }
+ YY_BREAK
+case 176:
+/* rule 176 can match eol */
+YY_RULE_SETUP
+#line 3160 "code.l"
+{ // remove special one-line comment
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr++;
+ nextCodeLine();
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ }
+ YY_BREAK
+case 177:
+/* rule 177 can match eol */
+YY_RULE_SETUP
+#line 3173 "code.l"
+{ // strip special one-line comment
+ if (YY_START==SkipComment || YY_START==SkipString || YY_START==SkipCPP) REJECT;
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ char c[2]; c[0]='\n'; c[1]=0;
+ codifyLines(c);
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(codeYYtext);
+ endFontClass();
+ }
+ }
+ YY_BREAK
+case 178:
+/* rule 178 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 3187 "code.l"
+{
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ g_yyLineNr++;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ codifyLines(codeYYtext);
+ BEGIN(SkipComment);
+ }
+ }
+ YY_BREAK
+case 179:
+/* rule 179 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 3206 "code.l"
+{ // special C comment block at a new line
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ g_code->codify(codeYYtext);
+ BEGIN(SkipComment);
+ }
+ }
+ YY_BREAK
+case 180:
+/* rule 180 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up codeYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 3;
+YY_DO_BEFORE_ACTION; /* set up codeYYtext again */
+YY_RULE_SETUP
+#line 3224 "code.l"
+{ // special C comment block half way a line
+ if (YY_START==SkipString) REJECT;
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ g_code->codify(codeYYtext);
+ BEGIN(SkipComment);
+ }
+ }
+ YY_BREAK
+case 181:
+YY_RULE_SETUP
+#line 3243 "code.l"
+{
+ if (YY_START==SkipString) REJECT;
+ if (!Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ startFontClass("comment");
+ g_code->codify(codeYYtext);
+ endFontClass();
+ }
+ }
+ YY_BREAK
+case 182:
+YY_RULE_SETUP
+#line 3252 "code.l"
+{
+ startFontClass("comment");
+ g_code->codify(codeYYtext);
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ BEGIN( SkipComment ) ;
+ }
+ YY_BREAK
+case 183:
+YY_RULE_SETUP
+#line 3262 "code.l"
+{ // C# verbatim string
+ startFontClass("stringliteral");
+ g_code->codify(codeYYtext);
+ g_lastVerbStringContext=YY_START;
+ BEGIN(SkipVerbString);
+ }
+ YY_BREAK
+case 184:
+YY_RULE_SETUP
+#line 3268 "code.l"
+{
+ startFontClass("comment");
+ g_code->codify(codeYYtext);
+ g_lastCContext = YY_START ;
+ BEGIN( SkipCxxComment ) ;
+ }
+ YY_BREAK
+case 185:
+YY_RULE_SETUP
+#line 3274 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_theCallContext.pushScope();
+ }
+ YY_BREAK
+case 186:
+YY_RULE_SETUP
+#line 3278 "code.l"
+{
+ g_code->codify(codeYYtext);
+ g_theCallContext.popScope();
+ }
+ YY_BREAK
+case 187:
+/* rule 187 can match eol */
+YY_RULE_SETUP
+#line 3282 "code.l"
+{
+ codifyLines(codeYYtext);
+ }
+ YY_BREAK
+case 188:
+YY_RULE_SETUP
+#line 3285 "code.l"
+{
+ g_code->codify(codeYYtext);
+ }
+ YY_BREAK
+/*
+<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines
+ //QCString sepLine=codeYYtext;
+ //g_code->codify("\n\n");
+ //g_yyLineNr+=sepLine.contains('\n');
+ //char sepLine[3]="\n\n";
+ codifyLines(codeYYtext);
+ }
+ */
+case 189:
+YY_RULE_SETUP
+#line 3298 "code.l"
+ECHO;
+ YY_BREAK
+#line 12821 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(SkipString):
+ case YY_STATE_EOF(SkipStringS):
+ case YY_STATE_EOF(SkipVerbString):
+ case YY_STATE_EOF(SkipCPP):
+ case YY_STATE_EOF(SkipComment):
+ case YY_STATE_EOF(SkipCxxComment):
+ case YY_STATE_EOF(RemoveSpecialCComment):
+ case YY_STATE_EOF(StripSpecialCComment):
+ case YY_STATE_EOF(Body):
+ case YY_STATE_EOF(FuncCall):
+ case YY_STATE_EOF(MemberCall):
+ case YY_STATE_EOF(MemberCall2):
+ case YY_STATE_EOF(SkipInits):
+ case YY_STATE_EOF(ClassName):
+ case YY_STATE_EOF(PackageName):
+ case YY_STATE_EOF(ClassVar):
+ case YY_STATE_EOF(CppCliTypeModifierFollowup):
+ case YY_STATE_EOF(Bases):
+ case YY_STATE_EOF(SkipSharp):
+ case YY_STATE_EOF(ReadInclude):
+ case YY_STATE_EOF(TemplDecl):
+ case YY_STATE_EOF(TemplCast):
+ case YY_STATE_EOF(CallEnd):
+ case YY_STATE_EOF(ObjCMethod):
+ case YY_STATE_EOF(ObjCParams):
+ case YY_STATE_EOF(ObjCParamType):
+ case YY_STATE_EOF(ObjCCall):
+ case YY_STATE_EOF(ObjCMName):
+ case YY_STATE_EOF(ObjCSkipStr):
+ case YY_STATE_EOF(OldStyleArgs):
+ case YY_STATE_EOF(UsingName):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed codeYYin at a new source and called
+ * codeYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = codeYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( codeYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * codeYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of codeYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ codeYYrestart(codeYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) codeYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 3159 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 3159 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 3158);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up codeYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ codeYYrestart(codeYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( codeYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve codeYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void codeYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ codeYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ codeYY_create_buffer(codeYYin,YY_BUF_SIZE );
+ }
+
+ codeYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ codeYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void codeYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * codeYYpop_buffer_state();
+ * codeYYpush_buffer_state(new_buffer);
+ */
+ codeYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ codeYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (codeYYwrap()) processing, but the only time this flag
+ * is looked at is after codeYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void codeYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ codeYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE codeYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) codeYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in codeYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) codeYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in codeYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ codeYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with codeYY_create_buffer()
+ *
+ */
+ void codeYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ codeYYfree((void *) b->yy_ch_buf );
+
+ codeYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a codeYYrestart() or at EOF.
+ */
+ static void codeYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ codeYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then codeYY_init_buffer was _probably_
+ * called from codeYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void codeYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ codeYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void codeYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ codeYYensure_buffer_stack();
+
+ /* This block is copied from codeYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from codeYY_switch_to_buffer. */
+ codeYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void codeYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ codeYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ codeYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void codeYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)codeYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in codeYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)codeYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in codeYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE codeYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) codeYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in codeYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ codeYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to codeYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * codeYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE codeYY_scan_string (yyconst char * yystr )
+{
+
+ return codeYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to codeYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE codeYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) codeYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in codeYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = codeYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in codeYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up codeYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ codeYYtext[codeYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = codeYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ codeYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int codeYYget_lineno (void)
+{
+
+ return codeYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *codeYYget_in (void)
+{
+ return codeYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *codeYYget_out (void)
+{
+ return codeYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t codeYYget_leng (void)
+{
+ return codeYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *codeYYget_text (void)
+{
+ return codeYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void codeYYset_lineno (int line_number )
+{
+
+ codeYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see codeYY_switch_to_buffer
+ */
+void codeYYset_in (FILE * in_str )
+{
+ codeYYin = in_str ;
+}
+
+void codeYYset_out (FILE * out_str )
+{
+ codeYYout = out_str ;
+}
+
+int codeYYget_debug (void)
+{
+ return codeYY_flex_debug;
+}
+
+void codeYYset_debug (int bdebug )
+{
+ codeYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from codeYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ codeYYin = stdin;
+ codeYYout = stdout;
+#else
+ codeYYin = (FILE *) 0;
+ codeYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * codeYYlex_init()
+ */
+ return 0;
+}
+
+/* codeYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int codeYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ codeYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ codeYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ codeYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ codeYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * codeYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *codeYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *codeYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void codeYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see codeYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 3298 "code.l"
+
+
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+static void saveObjCContext()
+{
+ if (g_currentCtx)
+ {
+ g_currentCtx->format+=QCString().sprintf("$c%d",g_currentCtxId);
+ if (g_braceCount==0 && YY_START==ObjCCall)
+ {
+ g_currentCtx->objectTypeOrName=g_currentCtx->format.mid(1);
+ //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
+ }
+ g_contextStack.push(g_currentCtx);
+ }
+ else
+ {
+ //printf("Trying to save NULL context!\n");
+ }
+ ObjCCallCtx *newCtx = new ObjCCallCtx;
+ newCtx->id = g_currentCtxId;
+ newCtx->lexState = YY_START;
+ newCtx->braceCount = g_braceCount;
+ newCtx->objectType = 0;
+ newCtx->objectVar = 0;
+ newCtx->method = 0;
+ //printf("save state=%d\n",YY_START);
+ g_contextDict.insert(g_currentCtxId,newCtx);
+ g_currentCtx = newCtx;
+ g_braceCount = 0;
+ g_currentCtxId++;
+}
+
+static void restoreObjCContext()
+{
+ //printf("restore state=%d->%d\n",YY_START,g_currentCtx->lexState);
+ BEGIN(g_currentCtx->lexState);
+ g_braceCount = g_currentCtx->braceCount;
+ if (!g_contextStack.isEmpty())
+ {
+ g_currentCtx = g_contextStack.pop();
+ }
+ else
+ {
+ g_currentCtx = 0;
+ //printf("Trying to pop context while g_contextStack is empty!\n");
+ }
+}
+
+void resetCCodeParserState()
+{
+ //printf("***initParseCodeContext()\n");
+ g_theVarContext.clear();
+ g_classScopeLengthStack.setAutoDelete(TRUE);
+ g_classScopeLengthStack.clear();
+ delete g_codeClassSDict;
+ g_codeClassSDict = new ClassSDict(17);
+ g_codeClassSDict->setAutoDelete(TRUE);
+ g_codeClassSDict->clear();
+ g_curClassBases.clear();
+ g_anchorCount = 0;
+}
+
+void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
+ bool exBlock, const char *exName,FileDef *fd,
+ int startLine,int endLine,bool inlineFragment,
+ MemberDef *memberDef,bool showLineNumbers)
+{
+ //printf("***parseCode() exBlock=%d exName=%s fd=%p className=%s\n",
+ // exBlock,exName,fd,className);
+ if (s.isEmpty()) return;
+ if (g_codeClassSDict==0)
+ {
+ resetCCodeParserState();
+ }
+ g_code = &od;
+ g_inputString = s;
+ g_inputPosition = 0;
+ g_currentFontClass = 0;
+ g_needsTermination = FALSE;
+ g_inFunctionTryBlock = FALSE;
+ if (endLine!=-1)
+ g_inputLines = endLine+1;
+ else
+ g_inputLines = countLines();
+
+ if (startLine!=-1)
+ g_yyLineNr = startLine;
+ else
+ g_yyLineNr = 1;
+
+ g_curlyCount = 0;
+ g_bodyCurlyCount = 0;
+ g_bracketCount = 0;
+ g_sharpCount = 0;
+ g_insideTemplate = FALSE;
+ g_theCallContext.clear();
+ g_scopeStack.clear();
+ g_classScope = className;
+ //printf("parseCCode %s\n",className);
+ g_exampleBlock = exBlock;
+ g_exampleName = exName;
+ g_sourceFileDef = fd;
+ g_lineNumbers = fd!=0 && showLineNumbers;
+ bool cleanupSourceDef = FALSE;
+ if (/* exBlock */ fd==0)
+ {
+ // create a dummy filedef for the example
+ g_sourceFileDef = new FileDef("",(exName?exName:"generated"));
+ cleanupSourceDef = TRUE;
+ }
+ if (g_sourceFileDef)
+ {
+ setCurrentDoc(g_sourceFileDef->name(),g_sourceFileDef->getSourceFileBase());
+ g_insideObjC = g_sourceFileDef->name().lower().right(2)==".m" ||
+ g_sourceFileDef->name().lower().right(3)==".mm";
+ }
+ g_currentDefinition = 0;
+ g_currentMemberDef = 0;
+ g_searchingForBody = exBlock;
+ g_insideBody = FALSE;
+ g_bracketCount = 0;
+ if (!g_exampleName.isEmpty())
+ {
+ g_exampleFile = convertNameToFile(g_exampleName+"-example",FALSE,TRUE);
+ //printf("g_exampleFile=%s\n",g_exampleFile.data());
+ }
+ g_includeCodeFragment = inlineFragment;
+ //printf("** exBlock=%d exName=%s include=%d\n",exBlock,exName,inlineFragment);
+ startCodeLine();
+ g_type.resize(0);
+ g_name.resize(0);
+ g_args.resize(0);
+ g_parmName.resize(0);
+ g_parmType.resize(0);
+ if (memberDef) setParameterList(memberDef);
+ codeYYrestart( codeYYin );
+ BEGIN( Body );
+ codeYYlex();
+ g_lexInit=TRUE;
+ if (g_needsTermination)
+ {
+ endFontClass();
+ g_code->endCodeLine();
+ }
+ if (cleanupSourceDef)
+ {
+ // delete the temporary file definition used for this example
+ delete g_sourceFileDef;
+ g_sourceFileDef=0;
+ }
+ return;
+}
+
+void codeFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ codeYYlex_destroy();
+ }
+#endif
+}
+
+
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void codeYYdummy() { yy_flex_realloc(0,0); }
+}
+#elif YY_FLEX_SUBMINOR_VERSION<33
+#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
+#endif
+
+
diff --git a/src/code.h b/src/code.h
new file mode 100644
index 0000000..6dbce28
--- /dev/null
+++ b/src/code.h
@@ -0,0 +1,35 @@
+/******************************************************************************
+ *
+ * $Id: code.h,v 1.9 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef CODE_H
+#define CODE_H
+
+#include "qtbc.h"
+#include <stdio.h>
+
+class CodeOutputInterface;
+class FileDef;
+class MemberDef;
+
+void parseCCode(CodeOutputInterface &,const char *,const QCString &,
+ bool ,const char *,FileDef *fd=0,
+ int startLine=-1,int endLine=-1,bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,bool showLineNumbers=TRUE);
+void resetCCodeParserState();
+void codeFreeScanner();
+
+#endif
diff --git a/src/code.l b/src/code.l
new file mode 100644
index 0000000..55045ea
--- /dev/null
+++ b/src/code.l
@@ -0,0 +1,3473 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <qregexp.h>
+#include <qdir.h>
+
+#include "qtbc.h"
+#include "entry.h"
+#include "doxygen.h"
+#include "message.h"
+#include "outputlist.h"
+#include "util.h"
+#include "membername.h"
+#include "searchindex.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
+#define CLASSBLOCK (int *)4
+#define SCOPEBLOCK (int *)8
+#define INNERBLOCK (int *)12
+
+/* -----------------------------------------------------------------
+ * statics
+ */
+
+static CodeOutputInterface * g_code;
+
+static ClassSDict *g_codeClassSDict = 0;
+static QCString g_curClassName;
+static QStrList g_curClassBases;
+
+static QCString g_parmType;
+static QCString g_parmName;
+
+static const char * g_inputString; //!< the code fragment as text
+static int g_inputPosition; //!< read offset during parsing
+static int g_inputLines; //!< number of line in the code fragment
+static int g_yyLineNr; //!< current line number
+static bool g_needsTermination;
+
+static bool g_exampleBlock;
+static QCString g_exampleName;
+static QCString g_exampleFile;
+
+static bool g_insideTemplate = FALSE;
+static QCString g_type;
+static QCString g_name;
+static QCString g_args;
+static QCString g_classScope;
+static QCString g_realScope;
+static QStack<int> g_scopeStack; //!< 1 if bracket starts a scope,
+ // 2 for internal blocks
+static int g_anchorCount;
+static FileDef * g_sourceFileDef;
+static bool g_lineNumbers;
+static Definition * g_currentDefinition;
+static MemberDef * g_currentMemberDef;
+static bool g_includeCodeFragment;
+static const char * g_currentFontClass;
+static bool g_searchingForBody;
+static bool g_insideBody;
+static int g_bodyCurlyCount;
+static QCString g_saveName;
+static QCString g_saveType;
+
+static int g_bracketCount = 0;
+static int g_curlyCount = 0;
+static int g_sharpCount = 0;
+static bool g_inFunctionTryBlock = FALSE;
+static bool g_inForEachExpression = FALSE;
+
+static int g_lastTemplCastContext;
+static int g_lastSpecialCContext;
+static int g_lastStringContext;
+static int g_lastSkipCppContext;
+static int g_lastVerbStringContext;
+static int g_memCallContext;
+static int g_lastCContext;
+
+static bool g_insideObjC;
+static bool g_insideProtocolList;
+
+static bool g_lexInit = FALSE;
+
+static QStack<int> g_classScopeLengthStack;
+
+// context for an Objective-C method call
+struct ObjCCallCtx
+{
+ int id;
+ QCString methodName;
+ QCString objectTypeOrName;
+ ClassDef *objectType;
+ MemberDef *objectVar;
+ MemberDef *method;
+ QCString format;
+ int lexState;
+ int braceCount;
+};
+
+// globals for objective-C method calls
+static ObjCCallCtx *g_currentCtx=0;
+static int g_currentCtxId=0;
+static int g_currentNameId=0;
+static int g_currentObjId=0;
+static int g_currentWordId=0;
+static QStack<ObjCCallCtx> g_contextStack;
+static QIntDict<ObjCCallCtx> g_contextDict;
+static QIntDict<QCString> g_nameDict;
+static QIntDict<QCString> g_objectDict;
+static QIntDict<QCString> g_wordDict;
+static int g_braceCount=0;
+
+static void saveObjCContext();
+static void restoreObjCContext();
+
+
+
+//-------------------------------------------------------------------
+
+/*! Represents a stack of variable to class mappings as found in the
+ * code. Each scope is enclosed in pushScope() and popScope() calls.
+ * Variables are added by calling addVariables() and one can search
+ * for variable using findVariable().
+ */
+class VariableContext
+{
+ public:
+ static const ClassDef *dummyContext;
+
+ class Scope : public SDict<ClassDef>
+ {
+ public:
+ Scope() : SDict<ClassDef>(17) {}
+ };
+
+ VariableContext()
+ {
+ m_scopes.setAutoDelete(TRUE);
+ }
+ virtual ~VariableContext()
+ {
+ }
+
+ void pushScope()
+ {
+ m_scopes.append(new Scope);
+ DBG_CTX((stderr,"** Push var context %d\n",m_scopes.count()));
+ }
+
+ void popScope()
+ {
+ if (m_scopes.count()>0)
+ {
+ DBG_CTX((stderr,"** Pop var context %d\n",m_scopes.count()));
+ m_scopes.remove(m_scopes.count()-1);
+ }
+ else
+ {
+ DBG_CTX((stderr,"** ILLEGAL: Pop var context\n"));
+ }
+ }
+
+ void clear()
+ {
+ m_scopes.clear();
+ m_globalScope.clear();
+ }
+
+ void clearExceptGlobal()
+ {
+ DBG_CTX((stderr,"** Clear var context\n"));
+ m_scopes.clear();
+ }
+
+ void addVariable(const QCString &type,const QCString &name);
+ ClassDef *findVariable(const QCString &name);
+
+ int count() const { return m_scopes.count(); }
+
+ private:
+ Scope m_globalScope;
+ QList<Scope> m_scopes;
+};
+
+void VariableContext::addVariable(const QCString &type,const QCString &name)
+{
+ //printf("VariableContext::addVariable(%s,%s)\n",type.data(),name.data());
+ QCString ltype = type.simplifyWhiteSpace();
+ QCString lname = name.simplifyWhiteSpace();
+ if (ltype.left(7)=="struct ")
+ {
+ ltype = ltype.right(ltype.length()-7);
+ }
+ else if (ltype.left(6)=="union ")
+ {
+ ltype = ltype.right(ltype.length()-6);
+ }
+ if (ltype.isEmpty() || lname.isEmpty()) return;
+ DBG_CTX((stderr,"** addVariable trying: type='%s' name='%s' g_currentDefinition=%s\n",
+ ltype.data(),lname.data(),g_currentDefinition?g_currentDefinition->name().data():"<none>"));
+ Scope *scope = m_scopes.count()==0 ? &m_globalScope : m_scopes.getLast();
+ ClassDef *varType;
+ int i=0;
+ if (
+ (varType=g_codeClassSDict->find(ltype)) || // look for class definitions inside the code block
+ (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,ltype)) // look for global class definitions
+ )
+ {
+ DBG_CTX((stderr,"** addVariable type='%s' name='%s'\n",ltype.data(),lname.data()));
+ scope->append(lname,varType); // add it to a list
+ }
+ else if ((i=ltype.find('<'))!=-1)
+ {
+ // probably a template class
+ QCString typeName(ltype.left(i));
+ ClassDef* newDef = 0;
+ QCString templateArgs(ltype.right(ltype.length() - i));
+ if (
+ ( // look for class definitions inside the code block
+ (varType=g_codeClassSDict->find(typeName)) ||
+ // otherwise look for global class definitions
+ (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,typeName))
+ ) && // and it must be a template
+ varType->templateArguments())
+ {
+ newDef = varType->getVariableInstance( templateArgs );
+ }
+ if (newDef)
+ {
+ DBG_CTX((stderr,"** addVariable type='%s' templ='%s' name='%s'\n",typeName.data(),templateArgs.data(),lname.data()));
+ scope->append(lname, newDef);
+ }
+ else
+ {
+ // Doesn't seem to be a template. Try just the base name.
+ addVariable(typeName,name);
+ }
+ }
+ else
+ {
+ if (m_scopes.count()>0) // for local variables add a dummy entry so the name
+ // is hidden to avoid false links to global variables with the same name
+ // TODO: make this work for namespaces as well!
+ {
+ DBG_CTX((stderr,"** addVariable: dummy context for '%s'\n",lname.data()));
+ scope->append(lname,dummyContext);
+ }
+ else
+ {
+ DBG_CTX((stderr,"** addVariable: not adding variable!\n"));
+ }
+ }
+}
+
+ClassDef *VariableContext::findVariable(const QCString &name)
+{
+ if (name.isEmpty()) return 0;
+ ClassDef *result = 0;
+ //QListIterator<Scope> sli(m_scopes);
+ Scope *scope;
+ QCString key = name;
+ // search from inner to outer scope
+ scope = m_scopes.last();
+ //for (sli.toLast();(scope=sli.current());--sli)
+ while (scope)
+ {
+ result = scope->find(key);
+ if (result)
+ {
+ DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
+ return result;
+ }
+ scope = m_scopes.prev();
+ }
+ // nothing found -> also try the global scope
+ result=m_globalScope.find(name);
+ DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
+ return result;
+}
+
+static VariableContext g_theVarContext;
+const ClassDef *VariableContext::dummyContext = (ClassDef*)0x8;
+
+//-------------------------------------------------------------------
+
+class CallContext
+{
+ public:
+ struct Ctx
+ {
+ Ctx() : name(g_name), type(g_type), cd(0) {}
+ QCString name;
+ QCString type;
+ ClassDef *cd;
+ };
+
+ CallContext()
+ {
+ m_classList.append(new Ctx);
+ m_classList.setAutoDelete(TRUE);
+ }
+ virtual ~CallContext() {}
+ void setClass(ClassDef *cd)
+ {
+ Ctx *ctx = m_classList.getLast();
+ if (ctx)
+ {
+ DBG_CTX((stderr,"** Set call context %s (%p)\n",cd==0 ? "<null>" : cd->name().data(),cd));
+ ctx->cd=cd;
+ }
+ }
+ void pushScope()
+ {
+ m_classList.append(new Ctx);
+ DBG_CTX((stderr,"** Push call context %d\n",m_classList.count()));
+ }
+ void popScope()
+ {
+ if (m_classList.count()>1)
+ {
+ DBG_CTX((stderr,"** Pop call context %d\n",m_classList.count()));
+ Ctx *ctx = m_classList.getLast();
+ if (ctx)
+ {
+ g_name = ctx->name;
+ g_type = ctx->type;
+ }
+ m_classList.removeLast();
+ }
+ else
+ {
+ DBG_CTX((stderr,"** ILLEGAL: Pop call context\n"));
+ }
+ }
+ void clear()
+ {
+ DBG_CTX((stderr,"** Clear call context\n"));
+ m_classList.clear();
+ m_classList.append(new Ctx);
+ }
+ ClassDef *getClass() const
+ {
+ Ctx *ctx = m_classList.getLast();
+ if (ctx) return ctx->cd; else return 0;
+ }
+
+ private:
+ QList<Ctx> m_classList;
+};
+
+static CallContext g_theCallContext;
+
+//-------------------------------------------------------------------
+
+/*! add class/namespace name s to the scope */
+static void pushScope(const char *s)
+{
+ g_classScopeLengthStack.push(new int(g_classScope.length()));
+ if (g_classScope.isEmpty())
+ {
+ g_classScope = s;
+ }
+ else
+ {
+ g_classScope += "::";
+ g_classScope += s;
+ }
+ //printf("pushScope(%s) result: `%s'\n",s,g_classScope.data());
+}
+
+/*! remove the top class/namespace name from the scope */
+static void popScope()
+{
+ if (!g_classScopeLengthStack.isEmpty())
+ {
+ int *pLength = g_classScopeLengthStack.pop();
+ g_classScope.truncate(*pLength);
+ delete pLength;
+ }
+ else
+ {
+ //err("Error: Too many end of scopes found!\n");
+ }
+ //printf("popScope() result: `%s'\n",g_classScope.data());
+}
+
+static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
+ }
+}
+
+static void addToSearchIndex(const char *text)
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->addWord(text,FALSE);
+ }
+}
+
+static void setClassScope(const QCString &name)
+{
+ //printf("setClassScope(%s)\n",name.data());
+ QCString n=name;
+ n=n.simplifyWhiteSpace();
+ int ts=n.find('<'); // start of template
+ int te=n.findRev('>'); // end of template
+ //printf("ts=%d te=%d\n",ts,te);
+ if (ts!=-1 && te!=-1 && te>ts)
+ {
+ // remove template from scope
+ n=n.left(ts)+n.right(n.length()-te-1);
+ }
+ while (!g_classScopeLengthStack.isEmpty())
+ {
+ popScope();
+ }
+ g_classScope.resize(0);
+ int i;
+ while ((i=n.find("::"))!=-1)
+ {
+ pushScope(n.left(i));
+ n = n.mid(i+2);
+ }
+ pushScope(n);
+ //printf("--->New class scope `%s'\n",g_classScope.data());
+}
+
+/*! start a new line of code, inserting a line number if g_sourceFileDef
+ * is TRUE. If a definition starts at the current line, then the line
+ * number is linked to the documentation of that definition.
+ */
+static void startCodeLine()
+{
+ //if (g_currentFontClass) { g_code->endFontClass(); }
+ if (g_sourceFileDef && g_lineNumbers)
+ {
+ //QCString lineNumber,lineAnchor;
+ //lineNumber.sprintf("%05d",g_yyLineNr);
+ //lineAnchor.sprintf("l%05d",g_yyLineNr);
+
+ Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
+ //printf("%s:startCodeLine(%d)=%p\n",g_sourceFileDef->name().data(),g_yyLineNr,d);
+ if (!g_includeCodeFragment && d)
+ {
+ g_currentDefinition = d;
+ g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
+ //printf("->startCodeLine(%s)=%p\n",d->name().data(),g_currentMemberDef);
+ g_insideBody = FALSE;
+ g_searchingForBody = TRUE;
+ g_realScope = d->name().copy();
+ g_type.resize(0);
+ g_name.resize(0);
+ g_args.resize(0);
+ g_parmType.resize(0);
+ g_parmName.resize(0);
+ //printf("Real scope: `%s'\n",g_realScope.data());
+ g_bodyCurlyCount = 0;
+ QCString lineAnchor;
+ lineAnchor.sprintf("l%05d",g_yyLineNr);
+ if (g_currentMemberDef)
+ {
+ g_code->writeLineNumber(g_currentMemberDef->getReference(),
+ g_currentMemberDef->getOutputFileBase(),
+ g_currentMemberDef->anchor(),g_yyLineNr);
+ setCurrentDoc(
+ g_currentMemberDef->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ else if (d->isLinkableInProject())
+ {
+ g_code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,g_yyLineNr);
+ setCurrentDoc(
+ d->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ }
+ else
+ {
+ g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ }
+ }
+ g_code->startCodeLine();
+ if (g_currentFontClass)
+ {
+ g_code->startFontClass(g_currentFontClass);
+ }
+}
+
+
+static void endFontClass();
+static void startFontClass(const char *s);
+
+static void endCodeLine()
+{
+ endFontClass();
+ g_code->endCodeLine();
+}
+
+static void nextCodeLine()
+{
+ const char * fc = g_currentFontClass;
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ g_currentFontClass = fc;
+ startCodeLine();
+ }
+}
+
+/*! write a code fragment `text' that may span multiple lines, inserting
+ * line numbers for each line.
+ */
+static void codifyLines(char *text)
+{
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ g_code->codify(sp);
+ nextCodeLine();
+ }
+ else
+ {
+ g_code->codify(sp);
+ done=TRUE;
+ }
+ }
+}
+
+/*! writes a link to a fragment \a text that may span multiple lines, inserting
+ * line numbers for each line. If \a text contains newlines, the link will be
+ * split into multiple links with the same destination, one for each line.
+ */
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const char *ref,const char *file,
+ const char *anchor,const char *text,
+ const char *tooltip)
+{
+ bool done=FALSE;
+ char *p=(char *)text;
+ while (!done)
+ {
+ char *sp=p;
+ char c;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ nextCodeLine();
+ }
+ else
+ {
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ done=TRUE;
+ }
+ }
+}
+
+static void addType()
+{
+ if (g_name=="const") { g_name.resize(0); return; }
+ if (!g_type.isEmpty()) g_type += ' ' ;
+ g_type += g_name ;
+ g_name.resize(0) ;
+ if (!g_type.isEmpty()) g_type += ' ' ;
+ g_type += g_args ;
+ g_args.resize(0) ;
+}
+
+static void addParmType()
+{
+ if (g_parmName=="const") { g_parmName.resize(0); return; }
+ if (!g_parmType.isEmpty()) g_parmType += ' ' ;
+ g_parmType += g_parmName ;
+ g_parmName.resize(0) ;
+}
+
+static void addUsingDirective(const char *name)
+{
+ if (g_sourceFileDef && name)
+ {
+ NamespaceDef *nd = Doxygen::namespaceSDict->find(name);
+ if (nd)
+ {
+ g_sourceFileDef->addUsingDirective(nd);
+ }
+ }
+}
+
+static void setParameterList(MemberDef *md)
+{
+ g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
+ LockingPtr<ArgumentList> al = md->argumentList();
+ if (al==0) return;
+ Argument *a = al->first();
+ while (a)
+ {
+ g_parmName = a->name.copy();
+ g_parmType = a->type.copy();
+ int i = g_parmType.find('*');
+ if (i!=-1) g_parmType = g_parmType.left(i);
+ i = g_parmType.find('&');
+ if (i!=-1) g_parmType = g_parmType.left(i);
+ g_parmType.stripPrefix("const ");
+ g_parmType=g_parmType.stripWhiteSpace();
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ a = al->next();
+ }
+}
+
+static ClassDef *stripClassName(const char *s)
+{
+ int pos=0;
+ QCString type = s;
+ QCString className;
+ QCString templSpec;
+ while (extractClassNameFromType(type,pos,className,templSpec)!=-1)
+ {
+ QCString clName=className+templSpec;
+ ClassDef *cd=0;
+ if (!g_classScope.isEmpty())
+ {
+ cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope+"::"+clName);
+ }
+ if (cd==0)
+ {
+ cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,clName);
+ }
+ //printf("stripClass trying `%s' = %p\n",clName.data(),cd);
+ if (cd)
+ {
+ return cd;
+ }
+ }
+
+ return 0;
+}
+
+static MemberDef *setCallContextForVar(const QCString &name)
+{
+ if (name.isEmpty()) return 0;
+ //fprintf(stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data());
+
+ int scopeEnd = name.findRev("::");
+ if (scopeEnd!=-1) // name with explicit scope
+ {
+ QCString scope = name.left(scopeEnd);
+ QCString locName = name.right(name.length()-scopeEnd-2);
+ //printf("explicit scope: name=%s scope=%s\n",locName.data(),scope.data());
+ ClassDef *mcd = getClass(scope);
+ if (mcd && !locName.isEmpty())
+ {
+ MemberDef *md=mcd->getMemberByName(locName);
+ if (md)
+ {
+ //printf("name=%s scope=%s\n",locName.data(),scope.data());
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ return md;
+ }
+ }
+ else // check namespace as well
+ {
+ NamespaceDef *mnd = getResolvedNamespace(scope);
+ if (mnd && !locName.isEmpty())
+ {
+ MemberDef *md=mnd->getMemberByName(locName);
+ if (md)
+ {
+ //printf("name=%s scope=%s\n",locName.data(),scope.data());
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ return md;
+ }
+ }
+ }
+ }
+
+ MemberName *mn;
+ ClassDef *mcd = g_theVarContext.findVariable(name);
+ if (mcd) // local variable
+ {
+ //fprintf(stderr,"local variable\n");
+ if (mcd!=VariableContext::dummyContext)
+ {
+ //fprintf(stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data());
+ g_theCallContext.setClass(mcd);
+ }
+ }
+ else
+ {
+ // look for a class member
+ mcd = getClass(g_classScope);
+ if (mcd)
+ {
+ //fprintf(stderr,"Inside class %s\n",mcd->name().data());
+ MemberDef *md=mcd->getMemberByName(name);
+ if (md)
+ {
+ //fprintf(stderr,"Found member %s\n",md->name().data());
+ if (g_scopeStack.top()!=CLASSBLOCK)
+ {
+ //fprintf(stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data());
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ }
+ return md;
+ }
+ }
+ }
+
+ // look for a global member
+ if ((mn=Doxygen::functionNameSDict->find(name)))
+ {
+ //printf("global var `%s'\n",name.data());
+ if (mn->count()==1) // global defined only once
+ {
+ MemberDef *md=mn->getFirst();
+ if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef)
+ {
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ return md;
+ }
+ return 0;
+ }
+ else if (mn->count()>1) // global defined more than once
+ {
+ MemberDef *md=mn->first();
+ while (md)
+ {
+ //printf("mn=%p md=%p md->getBodyDef()=%p g_sourceFileDef=%p\n",
+ // mn,md,
+ // md->getBodyDef(),g_sourceFileDef);
+
+ // in case there are multiple members we could link to, we
+ // only link to members if defined in the same file or
+ // defined as external.
+ if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef)
+ {
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ //printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data());
+ return md;
+ }
+ md=mn->next();
+ }
+ return 0;
+ }
+ }
+ return 0;
+}
+
+static void addDocCrossReference(MemberDef *src,MemberDef *dst)
+{
+ static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION");
+ static bool referencesRelation = Config_getBool("REFERENCES_RELATION");
+ static bool callerGraph = Config_getBool("CALLER_GRAPH");
+ static bool callGraph = Config_getBool("CALL_GRAPH");
+
+ //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+ if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+ if ((referencedByRelation || callerGraph || dst->hasCallerGraph()) &&
+ (src->isFunction() || src->isSlot())
+ )
+ {
+ dst->addSourceReferencedBy(src);
+ MemberDef *mdDef = dst->memberDefinition();
+ if (mdDef)
+ {
+ mdDef->addSourceReferencedBy(src);
+ }
+ MemberDef *mdDecl = dst->memberDeclaration();
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferencedBy(src);
+ }
+ }
+ if ((referencesRelation || callGraph || src->hasCallGraph()) &&
+ (src->isFunction() || src->isSlot())
+ )
+ {
+ src->addSourceReferences(dst);
+ MemberDef *mdDef = src->memberDefinition();
+ if (mdDef)
+ {
+ mdDef->addSourceReferences(dst);
+ }
+ MemberDef *mdDecl = src->memberDeclaration();
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferences(dst);
+ }
+ }
+
+}
+
+static bool getLinkInScope(const QCString &c, // scope
+ const QCString &m, // member
+ const char *memberText, // exact text
+ CodeOutputInterface &ol,
+ const char *text,
+ bool varOnly=FALSE
+ )
+{
+ MemberDef *md;
+ ClassDef *cd;
+ FileDef *fd;
+ NamespaceDef *nd;
+ GroupDef *gd;
+ //fprintf(stderr,"getLinkInScope: trying `%s'::`%s' varOnly=%d\n",c.data(),m.data(),varOnly);
+ if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
+ md->isLinkable() && (!varOnly || md->isVariable()))
+ {
+ if (g_exampleBlock)
+ {
+ QCString anchor;
+ anchor.sprintf("a%d",g_anchorCount);
+ //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
+ // g_exampleFile.data());
+ if (md->addExample(anchor,g_exampleName,g_exampleFile))
+ {
+ ol.writeCodeAnchor(anchor);
+ g_anchorCount++;
+ }
+ }
+
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ //fprintf(stderr,"d=%p linkable=%d\n",d,d?d->isLinkable():0);
+ if (d && d->isLinkable())
+ {
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ //printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n",
+ // g_currentDefinition,g_currentMemberDef,g_insideBody);
+
+ if (g_currentDefinition && g_currentMemberDef &&
+ md!=g_currentMemberDef && g_insideBody)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ //printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
+
+ ol.linkableSymbol(g_yyLineNr,md->name(),md,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ text ? text : memberText,
+ md->briefDescriptionAsTooltip());
+ addToSearchIndex(text ? text : memberText);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool getLink(const char *className,
+ const char *memberName,
+ CodeOutputInterface &ol,
+ const char *text=0,
+ bool varOnly=FALSE)
+{
+ //printf("getLink(%s,%s) g_curClassName=%s\n",className,memberName,g_curClassName.data());
+ QCString m=removeRedundantWhiteSpace(memberName);
+ QCString c=className;
+ if (!getLinkInScope(c,m,memberName,ol,text,varOnly))
+ {
+ if (!g_curClassName.isEmpty())
+ {
+ if (!c.isEmpty()) c.prepend("::");
+ c.prepend(g_curClassName);
+ return getLinkInScope(c,m,memberName,ol,text,varOnly);
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
+ bool typeOnly=FALSE,bool varOnly=FALSE)
+{
+ int i=0;
+ if (*clName=='~') // correct for matching negated values i.s.o. destructors.
+ {
+ g_code->codify("~");
+ clName++;
+ }
+ QCString className=clName;
+ if (className.isEmpty()) return;
+ if (g_insideProtocolList) // for Obj-C
+ {
+ className+="-p";
+ }
+ ClassDef *cd=0,*lcd=0;
+ MemberDef *md=0;
+ bool isLocal=FALSE;
+
+ //printf("generateClassOrGlobalLink(className=%s)\n",className.data());
+ if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable
+ {
+ Definition *d = g_currentDefinition;
+ //printf("d=%p g_sourceFileDef=%p\n",d,g_currentDefinition);
+ cd = getResolvedClass(d,g_sourceFileDef,className,&md);
+ //fprintf(stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n",
+ // className.data(),g_theVarContext.count(),cd?cd->name().data():"<none>",
+ // md?md->name().data():"<none>");
+ if (cd==0 && md==0 && (i=className.find('<'))!=-1)
+ {
+ QCString bareName = className.left(i); //stripTemplateSpecifiersFromScope(className);
+ //fprintf(stderr,"bareName=%s\n",bareName.data());
+ if (bareName!=className)
+ {
+ cd=getResolvedClass(d,g_sourceFileDef,bareName,&md); // try unspecialized version
+ }
+ }
+ //printf("md=%s\n",md?md->name().data():"<none>");
+ //fprintf(stderr,"is found as a type %s\n",cd?cd->name().data():"<null>");
+ if (cd==0 && md==0) // also see if it is variable or enum or enum value
+ {
+ if (getLink(g_classScope,clName,ol,clName,varOnly))
+ {
+ return;
+ }
+ }
+ }
+ else
+ {
+ //printf("local variable!\n");
+ if (lcd!=VariableContext::dummyContext)
+ {
+ //printf("non-dummy context lcd=%s!\n",lcd->name().data());
+ g_theCallContext.setClass(lcd);
+
+ // to following is needed for links to a global variable, but is
+ // no good for a link to a local variable that is also a global symbol.
+
+ //if (getLink(g_classScope,clName,ol,clName))
+ //{
+ //return;
+ //}
+ }
+ isLocal=TRUE;
+ //fprintf(stderr,"is a local variable cd=%p!\n",cd);
+ }
+ if (cd && cd->isLinkable()) // is it a linkable class
+ {
+ //fprintf(stderr,"is linkable class %s\n",clName);
+ if (g_exampleBlock)
+ {
+ QCString anchor;
+ anchor.sprintf("_a%d",g_anchorCount);
+ //printf("addExampleClass(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
+ // g_exampleFile.data());
+ if (cd->addExample(anchor,g_exampleName,g_exampleFile))
+ {
+ ol.writeCodeAnchor(anchor);
+ g_anchorCount++;
+ }
+ }
+ ol.linkableSymbol(g_yyLineNr,cd->name(),cd,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),clName,cd->briefDescriptionAsTooltip());
+ addToSearchIndex(className);
+ g_theCallContext.setClass(cd);
+ if (md)
+ {
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ }
+ }
+ else // not a class, maybe a global member
+ {
+ //fprintf(stderr,"class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly);
+ if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
+ {
+ if (md==0) // not found as a typedef
+ {
+ md = setCallContextForVar(clName);
+ //printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
+ if (md && g_currentDefinition)
+ {
+ //fprintf(stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
+ // md->name().data(),g_currentDefinition->name().data(),
+ // isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
+ // md->getOuterScope()->name().data());
+ }
+
+ if (md && g_currentDefinition &&
+ isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
+ {
+ md=0; // variable not accessible
+ }
+ }
+ if (md && (!varOnly || md->isVariable()))
+ {
+ //fprintf(stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable());
+ if (md->isLinkable())
+ {
+ ol.linkableSymbol(g_yyLineNr,md->name(),md,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName,md->briefDescriptionAsTooltip());
+ addToSearchIndex(clName);
+ if (g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ return;
+ }
+ }
+ }
+
+ // nothing found, just write out the word
+ //fprintf(stderr,"not found!\n");
+ ol.linkableSymbol(g_yyLineNr,clName,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(clName);
+ addToSearchIndex(clName);
+ }
+}
+
+static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const char *memName)
+{
+ // extract class definition of the return type in order to resolve
+ // a->b()->c() like call chains
+
+ //printf("type=`%s' args=`%s' class=%s\n",
+ // xmd->typeString(),xmd->argsString(),
+ // xmd->getClassDef()->name().data());
+
+ if (g_exampleBlock)
+ {
+ QCString anchor;
+ anchor.sprintf("a%d",g_anchorCount);
+ //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
+ // g_exampleFile.data());
+ if (xmd->addExample(anchor,g_exampleName,g_exampleFile))
+ {
+ ol.writeCodeAnchor(anchor);
+ g_anchorCount++;
+ }
+ }
+
+ ClassDef *typeClass = stripClassName(removeAnonymousScopes(xmd->typeString()));
+ //fprintf(stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass);
+ g_theCallContext.setClass(typeClass);
+
+ Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ?
+ xmd->getBodyDef() : xmd->getOuterScope();
+ if (xmd->getGroupDef()) xd = xmd->getGroupDef();
+ if (xd && xd->isLinkable())
+ {
+
+ //printf("g_currentDefiniton=%p g_currentMemberDef=%p xmd=%p g_insideBody=%d\n",g_currentDefinition,g_currentMemberDef,xmd,g_insideBody);
+
+ if (xmd->templateMaster()) xmd = xmd->templateMaster();
+
+ if (xmd->isLinkable())
+ {
+ // add usage reference
+ if (g_currentDefinition && g_currentMemberDef &&
+ /*xmd!=g_currentMemberDef &&*/ g_insideBody)
+ {
+ addDocCrossReference(g_currentMemberDef,xmd);
+ }
+
+ // write the actual link
+ ol.linkableSymbol(g_yyLineNr,xmd->name(),xmd,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,xmd->getReference(),
+ xmd->getOutputFileBase(),xmd->anchor(),memName,xmd->briefDescriptionAsTooltip());
+ addToSearchIndex(memName);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool generateClassMemberLink(CodeOutputInterface &ol,ClassDef *mcd,const char *memName)
+{
+ if (mcd)
+ {
+ MemberDef *xmd = mcd->getMemberByName(memName);
+ //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",mcd->name().data(),memName,xmd);
+ if (xmd)
+ {
+ return generateClassMemberLink(ol,xmd,memName);
+ }
+ }
+
+ return FALSE;
+}
+
+static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName,
+ char *memName)
+{
+ //printf("generateMemberLink(object=%s,mem=%s) classScope=%s\n",
+ // varName.data(),memName,g_classScope.data());
+
+ if (varName.isEmpty()) return;
+
+ // look for the variable in the current context
+ ClassDef *vcd = g_theVarContext.findVariable(varName);
+ if (vcd)
+ {
+ if (vcd!=VariableContext::dummyContext)
+ {
+ //printf("Class found!\n");
+ if (getLink(vcd->name(),memName,ol))
+ {
+ //printf("Found result!\n");
+ return;
+ }
+ if (vcd->baseClasses())
+ {
+ BaseClassListIterator bcli(*vcd->baseClasses());
+ for ( ; bcli.current() ; ++bcli)
+ {
+ if (getLink(bcli.current()->classDef->name(),memName,ol))
+ {
+ //printf("Found result!\n");
+ return;
+ }
+ }
+ }
+ }
+ }
+ else // variable not in current context, maybe it is in a parent context
+ {
+ vcd = getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope);
+ if (vcd && vcd->isLinkable())
+ {
+ //printf("Found class %s for variable `%s'\n",g_classScope.data(),varName.data());
+ MemberName *vmn=Doxygen::memberNameSDict->find(varName);
+ if (vmn==0)
+ {
+ int vi;
+ QCString vn=varName;
+ QCString scope;
+ if ((vi=vn.findRev("::"))!=-1 || (vi=vn.findRev('.'))!=-1) // explicit scope A::b(), probably static member
+ {
+ ClassDef *jcd = getClass(vn.left(vi));
+ vn=vn.right(vn.length()-vi-2);
+ vmn=Doxygen::memberNameSDict->find(vn);
+ //printf("Trying name `%s' scope=%s\n",vn.data(),scope.data());
+ if (vmn)
+ {
+ MemberNameIterator vmni(*vmn);
+ MemberDef *vmd;
+ for (;(vmd=vmni.current());++vmni)
+ {
+ if (/*(vmd->isVariable() || vmd->isFunction()) && */
+ vmd->getClassDef()==jcd)
+ {
+ //printf("Found variable type=%s\n",vmd->typeString());
+ ClassDef *mcd=stripClassName(vmd->typeString());
+ if (mcd && mcd->isLinkable())
+ {
+ if (generateClassMemberLink(ol,mcd,memName)) return;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (vmn)
+ {
+ //printf("There is a variable with name `%s'\n",varName);
+ MemberNameIterator vmni(*vmn);
+ MemberDef *vmd;
+ for (;(vmd=vmni.current());++vmni)
+ {
+ if (/*(vmd->isVariable() || vmd->isFunction()) && */
+ vmd->getClassDef()==vcd)
+ {
+ //printf("Found variable type=%s\n",vmd->typeString());
+ ClassDef *mcd=stripClassName(vmd->typeString());
+ if (mcd && mcd->isLinkable())
+ {
+ if (generateClassMemberLink(ol,mcd,memName)) return;
+ }
+ }
+ }
+ }
+ }
+ }
+ // nothing found -> write result as is
+ ol.linkableSymbol(g_yyLineNr,memName,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(memName);
+ addToSearchIndex(memName);
+ return;
+}
+
+static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
+{
+ if (g_currentMemberDef && g_currentMemberDef->getClassDef() &&
+ funcName==g_currentMemberDef->localName() &&
+ g_currentMemberDef->getDefLine()==g_yyLineNr &&
+ generateClassMemberLink(ol,g_currentMemberDef,funcName)
+ )
+ {
+ // special case where funcName is the name of a method that is also
+ // defined on this line. In this case we can directly link to
+ // g_currentMemberDef, which is not only faster, but
+ // in case of overloaded methods, this will make sure that we link to
+ // the correct method, and thereby get the correct reimplemented relations.
+ // See also bug 549022.
+ return;
+ }
+ //CodeClassDef *ccd=0;
+ ClassDef *ccd=0;
+ QCString locScope=g_classScope;
+ QCString locFunc=removeRedundantWhiteSpace(funcName);
+ //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
+ int len=2;
+ int i=locFunc.findRev("::");
+ if (i==-1) i=locFunc.findRev("."),len=1;
+ if (i>0)
+ {
+ if (locScope.isEmpty())
+ {
+ locScope=locFunc.left(i);
+ }
+ else
+ {
+ locScope+="::"+locFunc.left(i);
+ }
+ locFunc=locFunc.right(locFunc.length()-i-len).stripWhiteSpace();
+ int ts=locScope.find('<'); // start of template
+ int te=locScope.findRev('>'); // end of template
+ //printf("ts=%d te=%d\n",ts,te);
+ if (ts!=-1 && te!=-1 && te>ts)
+ {
+ // remove template from scope
+ locScope=locScope.left(ts)+locScope.right(locScope.length()-te-1);
+ }
+ }
+ //printf("generateFunctionLink(%s) classScope=`%s'\n",locFunc.data(),locScope.data());
+ if (!locScope.isEmpty() && (ccd=g_codeClassSDict->find(locScope)))
+ {
+ //printf("using classScope %s\n",g_classScope.data());
+ if (ccd->baseClasses())
+ {
+ BaseClassListIterator bcli(*ccd->baseClasses());
+ for ( ; bcli.current() ; ++bcli)
+ {
+ if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName))
+ {
+ return;
+ }
+ }
+ }
+ }
+ if (!getLink(locScope,locFunc,ol,funcName))
+ {
+ generateClassOrGlobalLink(ol,funcName);
+ }
+ return;
+}
+
+/*! counts the number of lines in the input */
+static int countLines()
+{
+ const char *p=g_inputString;
+ char c;
+ int count=1;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
+ }
+ if (p>g_inputString && *(p-1)!='\n')
+ { // last line does not end with a \n, so we add an extra
+ // line and explicitly terminate the line after parsing.
+ count++,
+ g_needsTermination=TRUE;
+ }
+ return count;
+}
+
+static void endFontClass()
+{
+ if (g_currentFontClass)
+ {
+ g_code->endFontClass();
+ g_currentFontClass=0;
+ }
+}
+
+static void startFontClass(const char *s)
+{
+ endFontClass();
+ g_code->startFontClass(s);
+ g_currentFontClass=s;
+}
+
+//----------------------------------------------------------------------------
+
+// recursively writes a linkified Objective-C method call
+static void writeObjCMethodCall(ObjCCallCtx *ctx)
+{
+ if (ctx==0) return;
+ char c;
+ const char *p = ctx->format.data();
+ if (!ctx->methodName.isEmpty())
+ {
+ //printf("writeObjCMethodCall(%s) obj=%s method=%s\n",
+ // ctx->format.data(),ctx->objectTypeOrName.data(),ctx->methodName.data());
+ if (!ctx->objectTypeOrName.isEmpty() && ctx->objectTypeOrName.at(0)!='$')
+ {
+ //printf("Looking for object=%s method=%s\n",ctx->objectTypeOrName.data(),
+ // ctx->methodName.data());
+ ClassDef *cd = g_theVarContext.findVariable(ctx->objectTypeOrName);
+ if (cd==0) // not a local variable
+ {
+ if (ctx->objectTypeOrName=="self")
+ {
+ if (g_currentDefinition &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ctx->objectType = (ClassDef *)g_currentDefinition;
+ }
+ }
+ else
+ {
+ ctx->objectType = getResolvedClass(
+ g_currentDefinition,
+ g_sourceFileDef,
+ ctx->objectTypeOrName,
+ &ctx->method);
+ }
+ //printf(" object is class? %p\n",ctx->objectType);
+ if (ctx->objectType) // found class
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ //printf(" yes->method=%s\n",ctx->method?ctx->method->name().data():"<none>");
+ }
+ else if (ctx->method==0) // search for class variable with the same name
+ {
+ //printf(" no\n");
+ //printf("g_currentDefinition=%p\n",g_currentDefinition);
+ if (g_currentDefinition &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ctx->objectVar = ((ClassDef *)g_currentDefinition)->getMemberByName(ctx->objectTypeOrName);
+ //printf(" ctx->objectVar=%p\n",ctx->objectVar);
+ if (ctx->objectVar)
+ {
+ ctx->objectType = stripClassName(ctx->objectVar->typeString());
+ //printf(" ctx->objectType=%p\n",ctx->objectType);
+ if (ctx->objectType)
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ //printf(" ctx->method=%p\n",ctx->method);
+ }
+ }
+ }
+ }
+ }
+ else // local variable
+ {
+ //printf(" object is local variable\n");
+ if (cd!=VariableContext::dummyContext)
+ {
+ ctx->method = cd->getMemberByName(ctx->methodName);
+ //printf(" class=%p method=%p\n",cd,ctx->method);
+ }
+ }
+ }
+ }
+
+ //printf("[");
+ while ((c=*p++)) // for each character in ctx->format
+ {
+ if (c=='$')
+ {
+ char nc=*p++;
+ if (nc=='$') // escaped $
+ {
+ g_code->codify("$");
+ }
+ else // name fragment or reference to a nested call
+ {
+ if (nc=='n') // name fragment
+ {
+ nc=*p++;
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ QCString *pName = g_nameDict.find(refId);
+ if (pName)
+ {
+ if (ctx->method && ctx->method->isLinkable())
+ {
+ g_code->linkableSymbol(g_yyLineNr,ctx->method->name(),ctx->method,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(*g_code,
+ ctx->method->getReference(),
+ ctx->method->getOutputFileBase(),
+ ctx->method->anchor(),
+ pName->data(),
+ ctx->method->briefDescriptionAsTooltip());
+ if (g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,ctx->method);
+ }
+ }
+ else
+ {
+ g_code->linkableSymbol(g_yyLineNr,pName->data(),0,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ codifyLines(pName->data());
+ }
+ }
+ else
+ {
+ //printf("Invalid name: id=%d\n",refId);
+ }
+ }
+ else if (nc=='o') // reference to potential object name
+ {
+ nc=*p++;
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ QCString *pObject = g_objectDict.find(refId);
+ if (pObject)
+ {
+ if (*pObject=="self")
+ {
+ if (g_currentDefinition &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ctx->objectType = (ClassDef *)g_currentDefinition;
+ if (ctx->objectType->categoryOf())
+ {
+ ctx->objectType = ctx->objectType->categoryOf();
+ }
+ if (ctx->objectType)
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ }
+ }
+ startFontClass("keyword");
+ codifyLines(pObject->data());
+ endFontClass();
+ }
+ else if (*pObject=="super")
+ {
+ if (g_currentDefinition &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ClassDef *cd = (ClassDef *)g_currentDefinition;
+ if (cd->categoryOf())
+ {
+ cd = cd->categoryOf();
+ }
+ BaseClassList *bcd = cd->baseClasses();
+ if (bcd) // get direct base class (there should be only one)
+ {
+ BaseClassListIterator bli(*bcd);
+ BaseClassDef *bclass;
+ for (bli.toFirst();(bclass=bli.current());++bli)
+ {
+ if (bclass->classDef->compoundType()!=ClassDef::Protocol)
+ {
+ ctx->objectType = bclass->classDef;
+ if (ctx->objectType)
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ }
+ }
+ }
+ }
+ }
+ startFontClass("keyword");
+ codifyLines(pObject->data());
+ endFontClass();
+ }
+ else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
+ {
+ g_code->linkableSymbol(g_yyLineNr,ctx->objectVar->name(),ctx->objectVar,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(*g_code,
+ ctx->objectVar->getReference(),
+ ctx->objectVar->getOutputFileBase(),
+ ctx->objectVar->anchor(),
+ pObject->data(),
+ ctx->objectVar->briefDescriptionAsTooltip());
+ if (g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,ctx->objectVar);
+ }
+ }
+ else if (ctx->objectType &&
+ ctx->objectType!=VariableContext::dummyContext &&
+ ctx->objectType->isLinkable()
+ ) // object is class name
+ {
+ ClassDef *cd = ctx->objectType;
+ g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(*g_code,
+ cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ pObject->data(),
+ cd->briefDescriptionAsTooltip());
+ }
+ else // object still needs to be resolved
+ {
+ ClassDef *cd = getResolvedClass(g_currentDefinition,
+ g_sourceFileDef, *pObject);
+ if (cd && cd->isLinkable())
+ {
+ if (ctx->objectType==0) ctx->objectType=cd;
+ g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(*g_code,
+ cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ pObject->data(),
+ cd->briefDescriptionAsTooltip());
+ }
+ else
+ {
+ g_code->linkableSymbol(g_yyLineNr,pObject->data(),0,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ codifyLines(pObject->data());
+ }
+ }
+ }
+ else
+ {
+ //printf("Invalid object: id=%d\n",refId);
+ }
+ }
+ else if (nc=='c') // reference to nested call
+ {
+ nc=*p++;
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ ObjCCallCtx *ictx = g_contextDict.find(refId);
+ if (ictx) // recurse into nested call
+ {
+ writeObjCMethodCall(ictx);
+ if (ictx->method) // link to nested call successfully
+ {
+ // get the ClassDef representing the method's return type
+ if (QCString(ictx->method->typeString())=="id")
+ {
+ // see if the method name is unique, if so we link to it
+ MemberName *mn=Doxygen::memberNameSDict->find(ctx->methodName);
+ //printf("mn->count=%d ictx->method=%s ctx->methodName=%s\n",
+ // mn==0?-1:(int)mn->count(),
+ // ictx->method->name().data(),
+ // ctx->methodName.data());
+ if (mn && mn->count()==1) // member name unique
+ {
+ ctx->method = mn->getFirst();
+ }
+ }
+ else
+ {
+ ctx->objectType = stripClassName(ictx->method->typeString());
+ if (ctx->objectType)
+ {
+ ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
+ }
+ }
+ //printf(" ***** method=%s -> object=%p\n",ictx->method->name().data(),ctx->objectType);
+ }
+ }
+ else
+ {
+ //printf("Invalid context: id=%d\n",refId);
+ }
+ }
+ else if (nc=='w') // some word
+ {
+ nc=*p++;
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ QCString *pWord = g_wordDict.find(refId);
+ if (pWord)
+ {
+ g_code->linkableSymbol(g_yyLineNr,pWord->data(),0,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ codifyLines(pWord->data());
+ }
+ }
+ else // illegal marker
+ {
+ ASSERT(!"invalid escape sequence");
+ }
+ }
+ }
+ else // normal non-marker character
+ {
+ char s[2];
+ s[0]=c;s[1]=0;
+ codifyLines(s);
+ }
+ }
+ //printf("%s %s]\n",ctx->objectTypeOrName.data(),ctx->methodName.data());
+ //printf("}=(type='%s',name='%s')",
+ // ctx->objectTypeOrName.data(),
+ // ctx->methodName.data());
+}
+
+// Replaces an Objective-C method name fragment s by a marker of the form
+// $n12, the number (12) can later be used as a key for obtaining the name
+// fragment, from g_nameDict
+static QCString escapeName(const char *s)
+{
+ QCString result;
+ result.sprintf("$n%d",g_currentNameId);
+ g_nameDict.insert(g_currentNameId,new QCString(s));
+ g_currentNameId++;
+ return result;
+}
+
+static QCString escapeObject(const char *s)
+{
+ QCString result;
+ result.sprintf("$o%d",g_currentObjId);
+ g_objectDict.insert(g_currentObjId,new QCString(s));
+ g_currentObjId++;
+ return result;
+}
+
+static QCString escapeWord(const char *s)
+{
+ QCString result;
+ result.sprintf("$w%d",g_currentWordId);
+ g_wordDict.insert(g_currentWordId,new QCString(s));
+ g_currentWordId++;
+ return result;
+}
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+%}
+
+B [ \t]
+BN [ \t\n\r]
+ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
+SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
+TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
+SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})
+SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+
+KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property")
+KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"set"|"sizeof"|"static"|"struct"|"__super"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|{KEYWORD_OBJC})
+FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"for"|"foreach"|"for each"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while"|"@try"|"@catch"|"@finally")
+TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string")
+CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast")
+CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
+ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++"
+ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
+LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
+BITOP "&"|"|"|"^"|"<<"|">>"|"~"
+OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
+%option noyywrap
+
+%x SkipString
+%x SkipStringS
+%x SkipVerbString
+%x SkipCPP
+%x SkipComment
+%x SkipCxxComment
+%x RemoveSpecialCComment
+%x StripSpecialCComment
+%x Body
+%x FuncCall
+%x MemberCall
+%x MemberCall2
+%x SkipInits
+%x ClassName
+%x PackageName
+%x ClassVar
+%x CppCliTypeModifierFollowup
+%x Bases
+%x SkipSharp
+%x ReadInclude
+%x TemplDecl
+%x TemplCast
+%x CallEnd
+%x ObjCMethod
+%x ObjCParams
+%x ObjCParamType
+%x ObjCCall
+%x ObjCMName
+%x ObjCSkipStr
+%x OldStyleArgs
+%x UsingName
+
+%%
+
+<*>\x0d
+<Body>^([ \t]*"#"[ \t]*("include"|"import")[ \t]*)("<"|"\"") {
+ startFontClass("preprocessor");
+ g_code->codify(yytext);
+ BEGIN( ReadInclude );
+ }
+<Body>("@interface"|"@implementation"|"@protocol")[ \t\n]+ {
+ g_insideObjC=TRUE;
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ if (!g_insideTemplate)
+ BEGIN( ClassName );
+ }
+<Body>(("public"|"private"){B}+)?("ref"|"value"|"interface"|"enum"){B}+("class"|"struct") {
+ if (g_insideTemplate) REJECT;
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ BEGIN( ClassName );
+ }
+<Body>"property"|"event"/{BN}* {
+ if (g_insideTemplate) REJECT;
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+<Body>(KEYWORD_CPPCLI_DATATYPE|("partial"{B}+)?"class"|"struct"|"union"|"namespace"){B}+ {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ if (!g_insideTemplate)
+ BEGIN( ClassName );
+ }
+<Body>("package")[ \t\n]+ {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ BEGIN( PackageName );
+ }
+<ClassVar>\n {
+ if (!g_insideObjC) REJECT;
+ codifyLines(yytext);
+ BEGIN(Body);
+ }
+<Body,ClassVar,Bases>"-"|"+" {
+ if (!g_insideObjC || g_insideBody)
+ {
+ g_code->codify(yytext);
+ }
+ else // Start of Objective-C method
+ {
+ //printf("Method!\n");
+ g_code->codify(yytext);
+ BEGIN(ObjCMethod);
+ }
+ }
+<ObjCMethod>":" {
+ g_code->codify(yytext);
+ BEGIN(ObjCParams);
+ }
+<ObjCParams>"(" {
+ g_code->codify(yytext);
+ BEGIN(ObjCParamType);
+ }
+<ObjCParams,ObjCMethod>";"|"{" {
+ g_code->codify(yytext);
+ if (*yytext=='{')
+ {
+ g_curlyCount++;
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ if (g_insideBody) g_bodyCurlyCount++;
+ if (!g_curClassName.isEmpty()) // valid class name
+ {
+ pushScope(g_curClassName);
+ DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
+ g_scopeStack.push(SCOPEBLOCK);
+ }
+ }
+ g_type.resize(0);
+ g_name.resize(0);
+ BEGIN(Body);
+ }
+<ObjCParams>{ID}{B}*":" {
+ g_code->codify(yytext);
+ }
+<ObjCParamType>{TYPEKW} {
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ g_parmType=yytext;
+ }
+<ObjCParamType>{ID} {
+ generateClassOrGlobalLink(*g_code,yytext);
+ g_parmType=yytext;
+ }
+<ObjCParamType>")" {
+ g_code->codify(yytext);
+ BEGIN(ObjCParams);
+ }
+<ObjCParams>{ID} {
+ g_code->linkableSymbol(g_yyLineNr,yytext,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ g_code->codify(yytext);
+ g_parmName=yytext;
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ g_parmType.resize(0);g_parmName.resize(0);
+ }
+<ObjCMethod,ObjCParams,ObjCParamType>{ID} {
+ generateClassOrGlobalLink(*g_code,yytext);
+ }
+<ObjCMethod,ObjCParams,ObjCParamType>. {
+ g_code->codify(yytext);
+ }
+<ObjCMethod,ObjCParams,ObjCParamType>\n {
+ codifyLines(yytext);
+ }
+<ReadInclude>[^\n\"\>]+/(">"|"\"") {
+ //FileInfo *f;
+ bool ambig;
+ bool found=FALSE;
+ //QCString absPath = yytext;
+ //if (g_sourceFileDef && QDir::isRelativePath(absPath))
+ //{
+ // absPath = QDir::cleanDirPath(g_sourceFileDef->getPath()+"/"+absPath);
+ //}
+
+ FileDef *fd=findFileDef(Doxygen::inputNameDict,yytext,ambig);
+ //printf("looking for include %s -> %s fd=%p\n",yytext,absPath.data(),fd);
+ if (fd && fd->isLinkable())
+ {
+ if (ambig) // multiple input files match the name
+ {
+ //printf("===== yes %s is ambiguous\n",yytext);
+ QCString name = convertToQCString(QDir::cleanDirPath(yytext));
+ if (!name.isEmpty() && g_sourceFileDef)
+ {
+ FileName *fn = Doxygen::inputNameDict->find(name);
+ if (fn)
+ {
+ FileNameIterator fni(*fn);
+ // for each include name
+ for (fni.toFirst();!found && (fd=fni.current());++fni)
+ {
+ // see if this source file actually includes the file
+ found = g_sourceFileDef->isIncluded(fd->absFilePath());
+ //printf(" include file %s found=%d\n",fd->absFilePath().data(),found);
+ }
+ }
+ }
+ }
+ else // not ambiguous
+ {
+ found = TRUE;
+ }
+ }
+ //printf(" include file %s found=%d\n",fd ? fd->absFilePath().data() : "<none>",found);
+ if (found)
+ {
+ g_code->writeCodeLink(fd->getReference(),fd->getOutputFileBase(),0,yytext,fd->briefDescriptionAsTooltip());
+ }
+ else
+ {
+ g_code->codify(yytext);
+ }
+ char c=yyinput();
+ QCString text;
+ text+=c;
+ g_code->codify(text);
+ endFontClass();
+ BEGIN( Body );
+ }
+<Body,Bases>^[ \t]*"#" {
+ startFontClass("preprocessor");
+ g_lastSkipCppContext = YY_START;
+ g_code->codify(yytext);
+ BEGIN( SkipCPP ) ;
+ }
+<SkipCPP>. {
+ g_code->codify(yytext);
+ }
+<SkipCPP>[^\n\/\\]+ {
+ g_code->codify(yytext);
+ }
+<SkipCPP>\\[\r]?\n {
+ codifyLines(yytext);
+ }
+<SkipCPP>"//" {
+ g_code->codify(yytext);
+ }
+<Body,FuncCall>"{" {
+ g_theVarContext.pushScope();
+
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ g_scopeStack.push(INNERBLOCK);
+
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ g_code->codify(yytext);
+ g_curlyCount++;
+ if (g_insideBody)
+ {
+ g_bodyCurlyCount++;
+ }
+ g_type.resize(0);
+ g_name.resize(0);
+ BEGIN( Body );
+ }
+<Body,MemberCall,MemberCall2>"}" {
+ g_theVarContext.popScope();
+ g_type.resize(0);
+ g_name.resize(0);
+
+ int *scope = g_scopeStack.pop();
+ DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
+ if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
+ {
+ popScope();
+ }
+
+ g_code->codify(yytext);
+
+ //fprintf(stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount);
+ if (--g_bodyCurlyCount<=0)
+ {
+ g_insideBody=FALSE;
+ g_currentMemberDef=0;
+ if (g_currentDefinition)
+ g_currentDefinition=g_currentDefinition->getOuterScope();
+ }
+ BEGIN(Body);
+ }
+<Body,ClassVar>"@end" {
+ //printf("End of objc scope fd=%s\n",g_sourceFileDef->name().data());
+ if (g_sourceFileDef)
+ {
+ FileDef *fd=g_sourceFileDef;
+ g_insideObjC = fd->name().lower().right(2)==".m" ||
+ fd->name().lower().right(3)==".mm";
+ //printf("insideObjC=%d\n",g_insideObjC);
+ }
+ else
+ {
+ g_insideObjC = FALSE;
+ }
+ if (g_insideBody)
+ {
+ g_theVarContext.popScope();
+
+ int *scope = g_scopeStack.pop();
+ DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
+ if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
+ {
+ popScope();
+ }
+ g_insideBody=FALSE;
+ }
+
+ startFontClass("keyword");
+ g_code->codify(yytext);
+ endFontClass();
+
+ g_currentMemberDef=0;
+ if (g_currentDefinition)
+ g_currentDefinition=g_currentDefinition->getOuterScope();
+ BEGIN(Body);
+ }
+<ClassName,ClassVar>";" {
+ g_code->codify(yytext);
+ g_searchingForBody=FALSE;
+ BEGIN( Body );
+ }
+<ClassName,ClassVar>[*&^%]+ {
+ g_type=g_curClassName.copy();
+ g_name.resize(0);
+ g_code->codify(yytext);
+ BEGIN( Body ); // variable of type struct *
+ }
+<ClassName>"__declspec"{B}*"("{B}*{ID}{B}*")" {
+ startFontClass("keyword");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<ClassName>{ID}("::"{ID})* {
+ g_curClassName=yytext;
+ addType();
+ generateClassOrGlobalLink(*g_code,yytext);
+ BEGIN( ClassVar );
+ }
+<PackageName>{ID}("."{ID})* {
+ g_curClassName=yytext;
+ g_curClassName=substitute(g_curClassName,".","::");
+ //printf("found package: %s\n",g_curClassName.data());
+ addType();
+ codifyLines(yytext);
+ }
+<ClassVar>"=" {
+ unput(*yytext);
+ BEGIN( Body );
+ }
+<ClassVar>("extends"|"implements") { // Java
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ g_curClassBases.clear();
+ BEGIN( Bases );
+ }
+<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") {
+ //fprintf(stderr,"***** C++/CLI modifier %s on g_curClassName=%s\n",yytext,g_curClassName.data());
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ BEGIN( CppCliTypeModifierFollowup );
+ }
+<ClassVar>{ID} {
+ g_type = g_curClassName.copy();
+ g_name = yytext;
+ if (g_insideBody)
+ {
+ g_theVarContext.addVariable(g_type,g_name);
+ }
+ generateClassOrGlobalLink(*g_code,yytext);
+ }
+<ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*":"{B}* {
+ codifyLines(yytext);
+ g_curClassBases.clear();
+ BEGIN( Bases );
+ }
+<PackageName>[ \t]*";" |
+<Bases,ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*"{"{B}* {
+ g_theVarContext.pushScope();
+ g_code->codify(yytext);
+ g_curlyCount++;
+ if (YY_START==ClassVar && g_curClassName.isEmpty())
+ {
+ g_curClassName = g_name.copy();
+ }
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ if (g_insideBody) g_bodyCurlyCount++;
+ if (!g_curClassName.isEmpty()) // valid class name
+ {
+ DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
+ g_scopeStack.push(CLASSBLOCK);
+ pushScope(g_curClassName);
+ //fprintf(stderr,"***** g_curClassName=%s\n",g_curClassName.data());
+ if (getResolvedClass(g_currentDefinition,g_sourceFileDef,g_curClassName)==0)
+ {
+ //printf("Adding new class %s\n",g_curClassName.data());
+ ClassDef *ncd=new ClassDef("<code>",1,
+ g_curClassName,ClassDef::Class,0,0,FALSE);
+ g_codeClassSDict->append(g_curClassName,ncd);
+ // insert base classes.
+ char *s=g_curClassBases.first();
+ while (s)
+ {
+ ClassDef *bcd;
+ bcd=g_codeClassSDict->find(s);
+ if (bcd==0) bcd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
+ if (bcd && bcd!=ncd)
+ {
+ ncd->insertBaseClass(bcd,s,Public,Normal);
+ }
+ s=g_curClassBases.next();
+ }
+ }
+ //printf("g_codeClassList.count()=%d\n",g_codeClassList.count());
+ }
+ else // not a class name -> assume inner block
+ {
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ g_scopeStack.push(INNERBLOCK);
+ }
+ g_curClassName.resize(0);
+ g_curClassBases.clear();
+ BEGIN( Body );
+ }
+<Bases>"virtual"|"public"|"protected"|"private"|"@public"|"@private"|"@protected" {
+ startFontClass("keyword");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<Bases>{ID} {
+ //printf("%s:addBase(%s)\n",g_ccd.name.data(),yytext);
+ g_curClassBases.inSort(yytext);
+ generateClassOrGlobalLink(*g_code,yytext);
+ }
+<Bases>"<" {
+ g_code->codify(yytext);
+ if (!g_insideObjC)
+ {
+ g_sharpCount=1;
+ BEGIN ( SkipSharp );
+ }
+ else
+ {
+ g_insideProtocolList=TRUE;
+ }
+ }
+<Bases>">" {
+ g_code->codify(yytext);
+ g_insideProtocolList=FALSE;
+ }
+<SkipSharp>"<" {
+ g_code->codify(yytext);
+ ++g_sharpCount;
+ }
+<SkipSharp>">" {
+ g_code->codify(yytext);
+ if (--g_sharpCount<=0)
+ BEGIN ( Bases );
+ }
+<Bases>"(" {
+ g_code->codify(yytext);
+ g_sharpCount=1;
+ BEGIN ( SkipSharp );
+ }
+<SkipSharp>"(" {
+ g_code->codify(yytext);
+ ++g_sharpCount;
+ }
+<SkipSharp>")" {
+ g_code->codify(yytext);
+ if (--g_sharpCount<=0)
+ BEGIN ( Bases );
+ }
+
+
+<Bases>"," {
+ g_code->codify(yytext);
+ }
+
+
+<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" {
+ addType();
+ generateFunctionLink(*g_code,yytext);
+ g_bracketCount=0;
+ g_args.resize(0);
+ g_name+=yytext;
+ BEGIN( FuncCall );
+ }
+<Body>{SCOPEPREFIX}?"operator"{B}*[^\(\n]+/"(" {
+ addType();
+ generateFunctionLink(*g_code,yytext);
+ g_bracketCount=0;
+ g_args.resize(0);
+ g_name+=yytext;
+ BEGIN( FuncCall );
+ }
+<Body,TemplDecl>("template"|"generic")/([^a-zA-Z0-9]) {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ g_insideTemplate=TRUE;
+ g_sharpCount=0;
+ }
+<Body>"using"{BN}+"namespace"{BN}+ {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ BEGIN(UsingName);
+ }
+<UsingName>{ID}("::"{ID})* { addUsingDirective(yytext);
+ generateClassOrGlobalLink(*g_code,yytext);
+ DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
+ g_scopeStack.push(CLASSBLOCK);
+ pushScope(yytext);
+ BEGIN(Body);
+ }
+<UsingName>\n { codifyLines(yytext); BEGIN(Body); }
+<UsingName>. { codifyLines(yytext); BEGIN(Body); }
+<Body,FuncCall>"$"?"this"("->"|".") { g_code->codify(yytext); // this-> for C++, this. for C#
+ }
+<Body>{KEYWORD}/([^a-z_A-Z0-9]) {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ if (QCString(yytext)=="typedef")
+ {
+ addType();
+ g_name+=yytext;
+ }
+ endFontClass();
+ }
+<Body>{KEYWORD}/{B}* {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+<Body>{KEYWORD}/{BN}*"(" {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ g_name.resize(0);g_type.resize(0);
+ }
+<FuncCall>"in"/{BN}* {
+ if (!g_inForEachExpression) REJECT;
+ startFontClass("keywordflow");
+ codifyLines(yytext);
+ endFontClass();
+ // insert the variable in the parent scope, see bug 546158
+ g_theVarContext.popScope();
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ g_theVarContext.pushScope();
+ g_name.resize(0);g_type.resize(0);
+ }
+<Body>{FLOWKW}/{BN}*"(" {
+ startFontClass("keywordflow");
+ codifyLines(yytext);
+ endFontClass();
+ g_name.resize(0);g_type.resize(0);
+ g_inForEachExpression = (strcmp(yytext,"for each")==0 || strcmp(yytext, "foreach")==0);
+ BEGIN(FuncCall);
+ }
+<Body>{FLOWKW}/([^a-z_A-Z0-9]) {
+ startFontClass("keywordflow");
+ codifyLines(yytext);
+ endFontClass();
+ if (g_inFunctionTryBlock && (strcmp(yytext,"catch")==0 || strcmp(yytext,"finally")==0))
+ {
+ g_inFunctionTryBlock=FALSE;
+ }
+ }
+<Body>{FLOWKW}/{B}* {
+ startFontClass("keywordflow");
+ codifyLines(yytext);
+ endFontClass();
+ }
+<Body>[\\|\)\+\-\/\%\~\!] {
+ g_code->codify(yytext);
+ g_name.resize(0);g_type.resize(0);
+ if (*yytext==')')
+ {
+ g_theCallContext.popScope();
+ g_bracketCount--;
+ BEGIN(FuncCall);
+ }
+ }
+<Body,TemplDecl,ObjCMethod>{TYPEKW}/{B}* {
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ addType();
+ g_name+=yytext;
+ }
+<Body>"generic"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* {
+ startFontClass("keyword");
+ g_code->codify(yytext);
+ endFontClass();
+ g_sharpCount=0;
+ BEGIN(TemplDecl);
+ }
+<Body>"template"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { // template<...>
+ startFontClass("keyword");
+ g_code->codify(yytext);
+ endFontClass();
+ g_sharpCount=0;
+ BEGIN(TemplDecl);
+ }
+<TemplDecl>"class"|"typename" {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+<TemplDecl>"<" {
+ g_code->codify(yytext);
+ g_sharpCount++;
+ }
+<TemplDecl>">" {
+ g_code->codify(yytext);
+ g_sharpCount--;
+ if (g_sharpCount<=0)
+ {
+ BEGIN(Body);
+ }
+ }
+<TemplCast>">" {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ BEGIN( g_lastTemplCastContext );
+ }
+<TemplCast>{ID}("::"{ID})* {
+ generateClassOrGlobalLink(*g_code,yytext);
+ }
+<TemplCast>("const"|"volatile"){B}* {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+<TemplCast>[*^]* {
+ codifyLines(yytext);
+ }
+<Body,FuncCall>{CASTKW}"<" { // static_cast<T>(
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ g_lastTemplCastContext = YY_START;
+ BEGIN(TemplCast);
+ }
+<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"("::"{ID})*/{B}* { // A<T> *pt;
+ int i=QCString(yytext).find('<');
+ QCString kw = QCString(yytext).left(i).stripWhiteSpace();
+ if (kw.right(5)=="_cast" && YY_START==Body)
+ {
+ REJECT;
+ }
+ addType();
+ generateClassOrGlobalLink(*g_code,yytext);
+ g_name+=yytext;
+ }
+<Body>{SCOPENAME}/{BN}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro"
+ addType();
+ // changed this to generateFunctionLink, see bug 624514
+ //generateClassOrGlobalLink(*g_code,yytext,FALSE,TRUE);
+ generateFunctionLink(*g_code,yytext);
+ g_name+=yytext;
+ }
+<Body>{SCOPENAME}/{B}* { // p->func()
+ addType();
+ generateClassOrGlobalLink(*g_code,yytext);
+ g_name+=yytext;
+ }
+<Body>"("{B}*("*"{B}*)+{SCOPENAME}*{B}*")"/{B}* { // (*p)->func() but not "if (p) ..."
+ g_code->codify(yytext);
+ int s=0;while (s<(int)yyleng && !isId(yytext[s])) s++;
+ int e=(int)yyleng-1;while (e>=0 && !isId(yytext[e])) e--;
+ QCString varname = ((QCString)yytext).mid(s,e-s+1);
+ addType();
+ g_name=varname;
+ }
+<Body>{SCOPETNAME}/{BN}*"(" { // a() or c::a() or t<A,B>::a()
+ addType();
+ generateFunctionLink(*g_code,yytext);
+ //printf("---> g_classScope=%s\n",g_classScope.data());
+ //g_theVarContext.addVariable(g_type,yytext);
+ g_bracketCount=0;
+ g_args.resize(0);
+ g_name+=yytext;
+ BEGIN( FuncCall );
+ }
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits>\" {
+ startFontClass("stringliteral");
+ g_code->codify(yytext);
+ g_lastStringContext=YY_START;
+ g_inForEachExpression = FALSE;
+ BEGIN( SkipString );
+ }
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits>\' {
+ startFontClass("stringliteral");
+ g_code->codify(yytext);
+ g_lastStringContext=YY_START;
+ g_inForEachExpression = FALSE;
+ BEGIN( SkipStringS );
+ }
+<SkipString>[^\"\\\r\n]* {
+ g_code->codify(yytext);
+ }
+<SkipStringS>[^\'\\\r\n]* {
+ g_code->codify(yytext);
+ }
+<SkipString,SkipStringS>"//"|"/*" {
+ g_code->codify(yytext);
+ }
+<SkipString>@?\" {
+ g_code->codify(yytext);
+ endFontClass();
+ BEGIN( g_lastStringContext );
+ }
+<SkipStringS>\' {
+ g_code->codify(yytext);
+ endFontClass();
+ BEGIN( g_lastStringContext );
+ }
+<SkipString,SkipStringS>\\. {
+ g_code->codify(yytext);
+ }
+<SkipVerbString>[^"\n]+ {
+ g_code->codify(yytext);
+ }
+<SkipVerbString>\"\" { // escaped quote
+ g_code->codify(yytext);
+ }
+<SkipVerbString>\" { // end of string
+ g_code->codify(yytext);
+ endFontClass();
+ BEGIN( g_lastVerbStringContext );
+ }
+<SkipVerbString>. {
+ g_code->codify(yytext);
+ }
+<SkipVerbString>\n {
+ codifyLines(yytext);
+ }
+<Body>":" {
+ g_code->codify(yytext);
+ g_name.resize(0);g_type.resize(0);
+ }
+<Body>"<" {
+ if (g_insideTemplate)
+ {
+ g_sharpCount++;
+ }
+ g_code->codify(yytext);
+ }
+<Body>">" {
+ if (g_insideTemplate)
+ {
+ if (--g_sharpCount<=0)
+ {
+ g_insideTemplate=FALSE;
+ }
+ }
+ g_code->codify(yytext);
+ }
+<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" {
+ startFontClass("charliteral");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<Body>"."|"->" {
+ g_code->codify(yytext);
+ g_memCallContext = YY_START;
+ BEGIN( MemberCall );
+ }
+<MemberCall>{SCOPETNAME}/{BN}*"(" {
+ if (g_theCallContext.getClass())
+ {
+ if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
+ {
+ g_code->linkableSymbol(g_yyLineNr,yytext,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ g_code->codify(yytext);
+ addToSearchIndex(yytext);
+ }
+ g_name.resize(0);
+ }
+ else
+ {
+ g_code->linkableSymbol(g_yyLineNr,yytext,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ g_code->codify(yytext);
+ addToSearchIndex(yytext);
+ g_name.resize(0);
+ }
+ g_type.resize(0);
+ g_bracketCount=0;
+ if (g_memCallContext==Body)
+ {
+ BEGIN(FuncCall);
+ }
+ else
+ {
+ BEGIN(g_memCallContext);
+ }
+ }
+<MemberCall>{SCOPENAME}/{B}* {
+ if (g_theCallContext.getClass())
+ {
+ //fprintf(stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass());
+ if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
+ {
+ g_code->linkableSymbol(g_yyLineNr,yytext,0,
+ g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ g_code->codify(yytext);
+ addToSearchIndex(yytext);
+ }
+ g_name.resize(0);
+ }
+ else
+ {
+ //fprintf(stderr,"no class context!\n");
+ g_code->codify(yytext);
+ addToSearchIndex(yytext);
+ g_name.resize(0);
+ }
+ g_type.resize(0);
+ BEGIN(g_memCallContext);
+ }
+<Body>[,=;\[] {
+ if (g_insideObjC && *yytext=='[')
+ {
+ //printf("Found start of ObjC call!\n");
+ // start of a method call
+ g_contextDict.setAutoDelete(TRUE);
+ g_nameDict.setAutoDelete(TRUE);
+ g_objectDict.setAutoDelete(TRUE);
+ g_wordDict.setAutoDelete(TRUE);
+ g_contextDict.clear();
+ g_nameDict.clear();
+ g_objectDict.clear();
+ g_wordDict.clear();
+ g_currentCtxId = 0;
+ g_currentNameId = 0;
+ g_currentObjId = 0;
+ g_currentCtx = 0;
+ g_braceCount = 0;
+ unput('[');
+ BEGIN(ObjCCall);
+ }
+ else
+ {
+ g_code->codify(yytext);
+ g_saveName = g_name.copy();
+ g_saveType = g_type.copy();
+ if (*yytext!='[' && !g_type.isEmpty())
+ {
+ //printf("g_scopeStack.bottom()=%p\n",g_scopeStack.bottom());
+ if (g_scopeStack.top()!=CLASSBLOCK)
+ {
+ //printf("AddVariable: '%s' '%s' context=%d\n",
+ // g_type.data(),g_name.data(),g_theVarContext.count());
+ g_theVarContext.addVariable(g_type,g_name);
+ }
+ g_name.resize(0);
+ }
+ if (*yytext==';' || *yytext=='=')
+ {
+ g_type.resize(0);
+ g_name.resize(0);
+ }
+ else if (*yytext=='[')
+ {
+ g_theCallContext.pushScope();
+ }
+ g_args.resize(0);
+ g_parmType.resize(0);
+ g_parmName.resize(0);
+ }
+ }
+ /*
+<ObjCMemberCall>{ID} {
+ if (strcmp(yytext,"self")==0 || strcmp(yytext,"super")==0)
+ {
+ // TODO: get proper base class for "super"
+ g_theCallContext.setClass(getClass(g_curClassName));
+ startFontClass("keyword");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+ else
+ {
+ generateClassOrGlobalLink(*g_code,yytext);
+ }
+ g_name.resize(0);
+ BEGIN(ObjCMemberCall2);
+ }
+<ObjCMemberCall>"[" {
+ g_code->codify(yytext);
+ g_theCallContext.pushScope();
+ }
+<ObjCMemberCall2>{ID}":"? {
+ g_name+=yytext;
+ if (g_theCallContext.getClass())
+ {
+ //printf("Calling method %s\n",g_name.data());
+ if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),g_name))
+ {
+ g_code->codify(yytext);
+ addToSearchIndex(g_name);
+ }
+ }
+ else
+ {
+ g_code->codify(yytext);
+ addToSearchIndex(g_name);
+ }
+ g_name.resize(0);
+ BEGIN(ObjCMemberCall3);
+ }
+<ObjCMemberCall2,ObjCMemberCall3>"]" {
+ g_theCallContext.popScope();
+ g_code->codify(yytext);
+ BEGIN(Body);
+ }
+ */
+<ObjCCall,ObjCMName>"[" {
+ saveObjCContext();
+ g_currentCtx->format+=*yytext;
+ BEGIN(ObjCCall);
+ //printf("open\n");
+ }
+<ObjCCall,ObjCMName>"]" {
+ g_currentCtx->format+=*yytext;
+ restoreObjCContext();
+ BEGIN(ObjCMName);
+ if (g_currentCtx==0)
+ {
+ // end of call
+ writeObjCMethodCall(g_contextDict.find(0));
+ BEGIN(Body);
+ }
+ //printf("close\n");
+ }
+<ObjCCall>{ID} {
+ g_currentCtx->format+=escapeObject(yytext);
+ if (g_braceCount==0)
+ {
+ g_currentCtx->objectTypeOrName=yytext;
+ //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
+ BEGIN(ObjCMName);
+ }
+ }
+<ObjCMName>{ID}/{BN}*"]" {
+ if (g_braceCount==0 &&
+ g_currentCtx->methodName.isEmpty())
+ {
+ g_currentCtx->methodName=yytext;
+ g_currentCtx->format+=escapeName(yytext);
+ }
+ else
+ {
+ g_currentCtx->format+=escapeWord(yytext);
+ }
+ }
+<ObjCMName>{ID}/{BN}*":" {
+ if (g_braceCount==0)
+ {
+ g_currentCtx->methodName+=yytext;
+ g_currentCtx->methodName+=":";
+ }
+ g_currentCtx->format+=escapeName(yytext);
+ }
+<ObjCSkipStr>[^\n\"$\\]* { g_currentCtx->format+=yytext; }
+<ObjCSkipStr>\\. { g_currentCtx->format+=yytext; }
+<ObjCSkipStr>"\"" { g_currentCtx->format+=yytext;
+ BEGIN(g_lastStringContext);
+ }
+<ObjCCall,ObjCMName>{CHARLIT} { g_currentCtx->format+=yytext; }
+<ObjCCall,ObjCMName>"@"?"\"" { g_currentCtx->format+=yytext;
+ g_lastStringContext=YY_START;
+ BEGIN(ObjCSkipStr);
+ }
+<ObjCCall,ObjCMName,ObjCSkipStr>"$" { g_currentCtx->format+="$$"; }
+<ObjCCall,ObjCMName>"(" { g_currentCtx->format+=*yytext; g_braceCount++; }
+<ObjCCall,ObjCMName>")" { g_currentCtx->format+=*yytext; g_braceCount--; }
+<ObjCSkipStr>"@"/"\"" { // needed to prevent matching the global rule (for C#)
+ g_currentCtx->format+=yytext;
+ }
+<ObjCCall,ObjCMName,ObjCSkipStr>{ID} { g_currentCtx->format+=escapeWord(yytext); }
+<ObjCCall,ObjCMName,ObjCSkipStr>. { g_currentCtx->format+=*yytext; }
+<ObjCCall,ObjCMName,ObjCSkipStr>\n { g_currentCtx->format+=*yytext; }
+
+<Body>"]" {
+ g_theCallContext.popScope();
+ g_code->codify(yytext);
+ // TODO: nested arrays like: a[b[0]->func()]->func()
+ g_name = g_saveName.copy();
+ g_type = g_saveType.copy();
+ }
+<Body>[0-9]+ {
+ g_code->codify(yytext);
+ }
+<Body>[0-9]+[xX][0-9A-Fa-f]+ {
+ g_code->codify(yytext);
+ }
+<MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) {
+ //addParmType();
+ //g_parmName=yytext;
+ startFontClass("keyword");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKW}/([^a-z_A-Z0-9]) {
+ addParmType();
+ g_parmName=yytext;
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<MemberCall2,FuncCall>{FLOWKW}/([^a-z_A-Z0-9]) {
+ addParmType();
+ g_parmName=yytext;
+ startFontClass("keywordflow");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<MemberCall2,FuncCall>{ID}(({B}*"<"[^\n\[\](){}<>]*">")?({B}*"::"{B}*{ID})?)* {
+ addParmType();
+ g_parmName=yytext;
+ generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
+ }
+<FuncCall>";" { // probably a cast, not a function call
+ g_code->codify(yytext);
+ g_inForEachExpression = FALSE;
+ BEGIN( Body );
+ }
+<MemberCall2,FuncCall>, {
+ g_code->codify(yytext);
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ g_parmType.resize(0);g_parmName.resize(0);
+ }
+<MemberCall2,FuncCall>"(" {
+ g_parmType.resize(0);g_parmName.resize(0);
+ g_code->codify(yytext);
+ g_bracketCount++;
+ g_theCallContext.pushScope();
+ if (YY_START==FuncCall && !g_insideBody)
+ {
+ g_theVarContext.pushScope();
+ }
+ }
+<MemberCall2,FuncCall>{OPERATOR} { // operator
+ if (strcmp(yytext,"*") &&
+ strcmp(yytext,"&") &&
+ strcmp(yytext,"^") &&
+ strcmp(yytext,"%")) // typically a pointer or reference
+ {
+ // not a * or &, or C++/CLI's ^ or %
+ g_parmType.resize(0);g_parmName.resize(0);
+ }
+ g_code->codify(yytext);
+ }
+<MemberCall,MemberCall2,FuncCall>")" {
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ g_theCallContext.popScope();
+ g_inForEachExpression = FALSE;
+ //g_theCallContext.setClass(0); // commented out, otherwise a()->b() does not work for b().
+ g_code->codify(yytext);
+ if (--g_bracketCount<=0)
+ {
+ if (g_name.isEmpty())
+ {
+ BEGIN( Body );
+ }
+ else
+ {
+ BEGIN( CallEnd );
+ }
+ }
+ }
+<CallEnd>[ \t\n]* { codifyLines(yytext); }
+ /*
+<MemberCall2,FuncCall>")"[ \t\n]*[;:] {
+ */
+<CallEnd>[;:] {
+ codifyLines(yytext);
+ g_bracketCount=0;
+ if (*yytext==';') g_searchingForBody=FALSE;
+ if (!g_type.isEmpty())
+ {
+ //fprintf(stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data());
+ g_theVarContext.addVariable(g_type,g_name);
+ }
+ g_parmType.resize(0);g_parmName.resize(0);
+ g_theCallContext.setClass(0);
+ if (*yytext==';' || g_insideBody)
+ {
+ if (!g_insideBody)
+ {
+ g_theVarContext.popScope();
+ }
+ g_name.resize(0);g_type.resize(0);
+ BEGIN( Body );
+ }
+ else
+ {
+ g_bracketCount=0;
+ BEGIN( SkipInits );
+ }
+ }
+<CallEnd>("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"sealed"|"override"))*/{BN}*(";"|"="|"throw"{BN}*"(") {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+<CallEnd,OldStyleArgs>("const"|"volatile"|"sealed"|"override")*({BN}+("const"|"volatile"|"sealed"|"override"))*{BN}*"{" {
+ if (g_insideBody)
+ {
+ g_theVarContext.pushScope();
+ }
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ //g_theCallContext.popScope();
+ g_parmType.resize(0);g_parmName.resize(0);
+ int index = g_name.findRev("::");
+ if (index!=-1)
+ {
+ QCString scope = g_name.left(index);
+ if (!g_classScope.isEmpty()) scope.prepend(g_classScope+"::");
+ ClassDef *cd=getResolvedClass(Doxygen::globalScope,g_sourceFileDef,scope);
+ if (cd)
+ {
+ setClassScope(cd->name());
+ g_scopeStack.push(SCOPEBLOCK);
+ DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
+ }
+ else
+ {
+ //setClassScope(g_realScope);
+ g_scopeStack.push(INNERBLOCK);
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ }
+ }
+ else
+ {
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ g_scopeStack.push(INNERBLOCK);
+ }
+ yytext[yyleng-1]='\0';
+ QCString cv(yytext);
+ if (!cv.stripWhiteSpace().isEmpty())
+ {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+ else // just whitespace
+ {
+ codifyLines(yytext);
+ }
+ g_code->codify("{");
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ if (g_insideBody) g_bodyCurlyCount++;
+ g_curlyCount++;
+ g_type.resize(0); g_name.resize(0);
+ BEGIN( Body );
+ }
+<CallEnd>"try" { // function-try-block
+ startFontClass("keyword");
+ g_code->codify(yytext);
+ endFontClass();
+ g_inFunctionTryBlock=TRUE;
+ }
+<CallEnd>{ID} {
+ if (g_insideBody || !g_parmType.isEmpty())
+ {
+ REJECT;
+ }
+ // could be K&R style definition
+ addParmType();
+ g_parmName=yytext;
+ generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
+ BEGIN(OldStyleArgs);
+ }
+<OldStyleArgs>{ID} {
+ addParmType();
+ g_parmName=yytext;
+ generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
+ }
+<OldStyleArgs>[,;] {
+ g_code->codify(yytext);
+ g_theVarContext.addVariable(g_parmType,g_parmName);
+ if (*yytext==';') g_parmType.resize(0);
+ g_parmName.resize(0);
+ }
+<CallEnd,OldStyleArgs>"#" {
+ startFontClass("preprocessor");
+ g_lastSkipCppContext = Body;
+ g_code->codify(yytext);
+ BEGIN( SkipCPP );
+ }
+<CallEnd>. {
+ unput(*yytext);
+ if (!g_insideBody)
+ {
+ g_theVarContext.popScope();
+ }
+ g_name.resize(0);g_args.resize(0);
+ g_parmType.resize(0);g_parmName.resize(0);
+ BEGIN( Body );
+ }
+<SkipInits>";" {
+ g_code->codify(yytext);
+ g_type.resize(0); g_name.resize(0);
+ BEGIN( Body );
+ }
+<SkipInits>"{" {
+ g_code->codify(yytext);
+ g_curlyCount++;
+ if (g_searchingForBody)
+ {
+ g_searchingForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ if (g_insideBody) g_bodyCurlyCount++;
+ if (g_name.find("::")!=-1)
+ {
+ DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
+ g_scopeStack.push(SCOPEBLOCK);
+ setClassScope(g_realScope);
+ }
+ else
+ {
+ DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
+ g_scopeStack.push(INNERBLOCK);
+ }
+ g_type.resize(0); g_name.resize(0);
+ BEGIN( Body );
+ }
+<SkipInits>{ID} {
+ generateClassOrGlobalLink(*g_code,yytext);
+ }
+<FuncCall>{ID}/"(" {
+ generateFunctionLink(*g_code,yytext);
+ }
+<FuncCall>{ID}/("."|"->") {
+ g_name=yytext;
+ generateClassOrGlobalLink(*g_code,yytext);
+ BEGIN( MemberCall2 );
+ }
+<FuncCall,MemberCall2>("("{B}*("*"{B}*)+{ID}*{B}*")"{B}*)/("."|"->") {
+ g_code->codify(yytext);
+ int s=0;while (!isId(yytext[s])) s++;
+ int e=yyleng-1;while (!isId(yytext[e])) e--;
+ g_name=((QCString)yytext).mid(s,e-s+1);
+ BEGIN( MemberCall2 );
+ }
+<MemberCall2>{ID}/([ \t\n]*"(") {
+ if (!g_args.isEmpty())
+ generateMemberLink(*g_code,g_args,yytext);
+ else
+ generateClassOrGlobalLink(*g_code,yytext);
+ g_args.resize(0);
+ BEGIN( FuncCall );
+ }
+<MemberCall2>{ID}/([ \t\n]*("."|"->")) {
+ //g_code->codify(yytext);
+ g_name=yytext;
+ generateClassOrGlobalLink(*g_code,yytext);
+ BEGIN( MemberCall2 );
+ }
+<MemberCall2>"->"|"." {
+ g_code->codify(yytext);
+ g_memCallContext = YY_START;
+ BEGIN( MemberCall );
+ }
+<SkipComment>"/*"("!"?)"*/" {
+ g_code->codify(yytext);
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+<SkipComment>"//"|"/*" {
+ g_code->codify(yytext);
+ }
+<SkipComment>[^*/\n]+ {
+ g_code->codify(yytext);
+ }
+<SkipComment>[ \t]*"*/" {
+ g_code->codify(yytext);
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+<SkipCxxComment>[^\r\n]*"\\"[\r]?\n { // line continuation
+ codifyLines(yytext);
+ }
+<SkipCxxComment>[^\r\n]+ {
+ g_code->codify(yytext);
+ }
+<SkipCxxComment>\r
+<SkipCxxComment>\n {
+ unput('\n');
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+<SkipCxxComment>. {
+ g_code->codify(yytext);
+ }
+<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)?{B}*"/*"[*!]/[^/*] {
+ g_yyLineNr+=QCString(yytext).contains('\n');
+ }
+<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)? {
+ g_yyLineNr+=QCString(yytext).contains('\n');
+ nextCodeLine();
+ if (g_lastSpecialCContext==SkipCxxComment)
+ { // force end of C++ comment here
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+ else
+ {
+ BEGIN(g_lastSpecialCContext);
+ }
+ }
+<RemoveSpecialCComment>"*/" {
+ BEGIN(g_lastSpecialCContext);
+ }
+<RemoveSpecialCComment>[^*\n]+
+<RemoveSpecialCComment>"//"|"/*"
+<RemoveSpecialCComment>\n { g_yyLineNr++; }
+<RemoveSpecialCComment>.
+<MemberCall>[^a-z_A-Z0-9(\n] {
+ g_code->codify(yytext);
+ g_type.resize(0);
+ g_name.resize(0);
+ BEGIN(g_memCallContext);
+ }
+<*>\n({B}*"//"[!/][^\n]*\n)+ { // remove special one-line comment
+ if (YY_START==SkipCPP) REJECT;
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr+=((QCString)yytext).contains('\n');
+ nextCodeLine();
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(yytext);
+ endFontClass();
+ }
+ if (YY_START==SkipCxxComment)
+ {
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+ }
+<SkipCPP>\n/.*\n {
+ codifyLines(yytext);
+ endFontClass();
+ BEGIN( g_lastSkipCppContext ) ;
+ }
+<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr+=2;
+ nextCodeLine();
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(yytext);
+ endFontClass();
+ }
+ if (YY_START==SkipCxxComment)
+ {
+ endFontClass();
+ BEGIN( g_lastCContext ) ;
+ }
+ }
+<*>\n{B}*"/*@"[{}] { // remove one-line group marker
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ g_yyLineNr++;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ codifyLines(yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>^{B}*"//@"[{}].*\n { // remove one-line group marker
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr++;
+ nextCodeLine();
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(yytext);
+ endFontClass();
+ }
+ }
+<*>^{B}*"/*@"[{}] { // remove multi-line group marker
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ g_code->codify(yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr++;
+ nextCodeLine();
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(yytext);
+ endFontClass();
+ }
+ }
+<*>"//"[!/][^\n]*\n { // strip special one-line comment
+ if (YY_START==SkipComment || YY_START==SkipString || YY_START==SkipCPP) REJECT;
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ char c[2]; c[0]='\n'; c[1]=0;
+ codifyLines(c);
+ }
+ else
+ {
+ startFontClass("comment");
+ codifyLines(yytext);
+ endFontClass();
+ }
+ }
+<*>\n{B}*"/*"[!*]/[^/*] {
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ g_yyLineNr++;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ codifyLines(yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>^{B}*"/*"[!*]/[^/*] { // special C comment block at a new line
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ g_code->codify(yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>"/*"[!*]/[^/*] { // special C comment block half way a line
+ if (YY_START==SkipString) REJECT;
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_lastSpecialCContext = YY_START;
+ BEGIN(RemoveSpecialCComment);
+ }
+ else
+ {
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ startFontClass("comment");
+ g_code->codify(yytext);
+ BEGIN(SkipComment);
+ }
+ }
+<*>"/*"("!"?)"*/" {
+ if (YY_START==SkipString) REJECT;
+ if (!Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ startFontClass("comment");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+ }
+<*>"/*" {
+ startFontClass("comment");
+ g_code->codify(yytext);
+ // check is to prevent getting stuck in skipping C++ comments
+ if (YY_START != SkipCxxComment)
+ {
+ g_lastCContext = YY_START ;
+ }
+ BEGIN( SkipComment ) ;
+ }
+<*>@\" { // C# verbatim string
+ startFontClass("stringliteral");
+ g_code->codify(yytext);
+ g_lastVerbStringContext=YY_START;
+ BEGIN(SkipVerbString);
+ }
+<*>"//" {
+ startFontClass("comment");
+ g_code->codify(yytext);
+ g_lastCContext = YY_START ;
+ BEGIN( SkipCxxComment ) ;
+ }
+<*>"("|"[" {
+ g_code->codify(yytext);
+ g_theCallContext.pushScope();
+ }
+<*>")"|"]" {
+ g_code->codify(yytext);
+ g_theCallContext.popScope();
+ }
+<*>\n {
+ codifyLines(yytext);
+ }
+<*>. {
+ g_code->codify(yytext);
+ }
+ /*
+<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines
+ //QCString sepLine=yytext;
+ //g_code->codify("\n\n");
+ //g_yyLineNr+=sepLine.contains('\n');
+ //char sepLine[3]="\n\n";
+ codifyLines(yytext);
+ }
+ */
+
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+static void saveObjCContext()
+{
+ if (g_currentCtx)
+ {
+ g_currentCtx->format+=QCString().sprintf("$c%d",g_currentCtxId);
+ if (g_braceCount==0 && YY_START==ObjCCall)
+ {
+ g_currentCtx->objectTypeOrName=g_currentCtx->format.mid(1);
+ //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
+ }
+ g_contextStack.push(g_currentCtx);
+ }
+ else
+ {
+ //printf("Trying to save NULL context!\n");
+ }
+ ObjCCallCtx *newCtx = new ObjCCallCtx;
+ newCtx->id = g_currentCtxId;
+ newCtx->lexState = YY_START;
+ newCtx->braceCount = g_braceCount;
+ newCtx->objectType = 0;
+ newCtx->objectVar = 0;
+ newCtx->method = 0;
+ //printf("save state=%d\n",YY_START);
+ g_contextDict.insert(g_currentCtxId,newCtx);
+ g_currentCtx = newCtx;
+ g_braceCount = 0;
+ g_currentCtxId++;
+}
+
+static void restoreObjCContext()
+{
+ //printf("restore state=%d->%d\n",YY_START,g_currentCtx->lexState);
+ BEGIN(g_currentCtx->lexState);
+ g_braceCount = g_currentCtx->braceCount;
+ if (!g_contextStack.isEmpty())
+ {
+ g_currentCtx = g_contextStack.pop();
+ }
+ else
+ {
+ g_currentCtx = 0;
+ //printf("Trying to pop context while g_contextStack is empty!\n");
+ }
+}
+
+void resetCCodeParserState()
+{
+ //printf("***initParseCodeContext()\n");
+ g_theVarContext.clear();
+ g_classScopeLengthStack.setAutoDelete(TRUE);
+ g_classScopeLengthStack.clear();
+ delete g_codeClassSDict;
+ g_codeClassSDict = new ClassSDict(17);
+ g_codeClassSDict->setAutoDelete(TRUE);
+ g_codeClassSDict->clear();
+ g_curClassBases.clear();
+ g_anchorCount = 0;
+}
+
+void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
+ bool exBlock, const char *exName,FileDef *fd,
+ int startLine,int endLine,bool inlineFragment,
+ MemberDef *memberDef,bool showLineNumbers)
+{
+ //printf("***parseCode() exBlock=%d exName=%s fd=%p className=%s\n",
+ // exBlock,exName,fd,className);
+ if (s.isEmpty()) return;
+ if (g_codeClassSDict==0)
+ {
+ resetCCodeParserState();
+ }
+ g_code = &od;
+ g_inputString = s;
+ g_inputPosition = 0;
+ g_currentFontClass = 0;
+ g_needsTermination = FALSE;
+ g_inFunctionTryBlock = FALSE;
+ if (endLine!=-1)
+ g_inputLines = endLine+1;
+ else
+ g_inputLines = countLines();
+
+ if (startLine!=-1)
+ g_yyLineNr = startLine;
+ else
+ g_yyLineNr = 1;
+
+ g_curlyCount = 0;
+ g_bodyCurlyCount = 0;
+ g_bracketCount = 0;
+ g_sharpCount = 0;
+ g_insideTemplate = FALSE;
+ g_theCallContext.clear();
+ g_scopeStack.clear();
+ g_classScope = className;
+ //printf("parseCCode %s\n",className);
+ g_exampleBlock = exBlock;
+ g_exampleName = exName;
+ g_sourceFileDef = fd;
+ g_lineNumbers = fd!=0 && showLineNumbers;
+ bool cleanupSourceDef = FALSE;
+ if (/* exBlock */ fd==0)
+ {
+ // create a dummy filedef for the example
+ g_sourceFileDef = new FileDef("",(exName?exName:"generated"));
+ cleanupSourceDef = TRUE;
+ }
+ if (g_sourceFileDef)
+ {
+ setCurrentDoc(g_sourceFileDef->name(),g_sourceFileDef->getSourceFileBase());
+ g_insideObjC = g_sourceFileDef->name().lower().right(2)==".m" ||
+ g_sourceFileDef->name().lower().right(3)==".mm";
+ }
+ g_currentDefinition = 0;
+ g_currentMemberDef = 0;
+ g_searchingForBody = exBlock;
+ g_insideBody = FALSE;
+ g_bracketCount = 0;
+ if (!g_exampleName.isEmpty())
+ {
+ g_exampleFile = convertNameToFile(g_exampleName+"-example",FALSE,TRUE);
+ //printf("g_exampleFile=%s\n",g_exampleFile.data());
+ }
+ g_includeCodeFragment = inlineFragment;
+ //printf("** exBlock=%d exName=%s include=%d\n",exBlock,exName,inlineFragment);
+ startCodeLine();
+ g_type.resize(0);
+ g_name.resize(0);
+ g_args.resize(0);
+ g_parmName.resize(0);
+ g_parmType.resize(0);
+ if (memberDef) setParameterList(memberDef);
+ codeYYrestart( codeYYin );
+ BEGIN( Body );
+ codeYYlex();
+ g_lexInit=TRUE;
+ if (g_needsTermination)
+ {
+ endFontClass();
+ g_code->endCodeLine();
+ }
+ if (cleanupSourceDef)
+ {
+ // delete the temporary file definition used for this example
+ delete g_sourceFileDef;
+ g_sourceFileDef=0;
+ }
+ return;
+}
+
+void codeFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ codeYYlex_destroy();
+ }
+#endif
+}
+
+
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void codeYYdummy() { yy_flex_realloc(0,0); }
+}
+#elif YY_FLEX_SUBMINOR_VERSION<33
+#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
+#endif
+
diff --git a/src/commentcnv.cpp b/src/commentcnv.cpp
new file mode 100644
index 0000000..878d686
--- /dev/null
+++ b/src/commentcnv.cpp
@@ -0,0 +1,3396 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer commentcnvYY_create_buffer
+#define yy_delete_buffer commentcnvYY_delete_buffer
+#define yy_flex_debug commentcnvYY_flex_debug
+#define yy_init_buffer commentcnvYY_init_buffer
+#define yy_flush_buffer commentcnvYY_flush_buffer
+#define yy_load_buffer_state commentcnvYY_load_buffer_state
+#define yy_switch_to_buffer commentcnvYY_switch_to_buffer
+#define yyin commentcnvYYin
+#define yyleng commentcnvYYleng
+#define yylex commentcnvYYlex
+#define yylineno commentcnvYYlineno
+#define yyout commentcnvYYout
+#define yyrestart commentcnvYYrestart
+#define yytext commentcnvYYtext
+#define yywrap commentcnvYYwrap
+#define yyalloc commentcnvYYalloc
+#define yyrealloc commentcnvYYrealloc
+#define yyfree commentcnvYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE commentcnvYYrestart(commentcnvYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t commentcnvYYleng;
+
+extern FILE *commentcnvYYin, *commentcnvYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up commentcnvYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via commentcnvYYrestart()), so that the user can continue scanning by
+ * just pointing commentcnvYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when commentcnvYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t commentcnvYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow commentcnvYYwrap()'s to do buffer switches
+ * instead of setting up a fresh commentcnvYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void commentcnvYYrestart (FILE *input_file );
+void commentcnvYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE commentcnvYY_create_buffer (FILE *file,int size );
+void commentcnvYY_delete_buffer (YY_BUFFER_STATE b );
+void commentcnvYY_flush_buffer (YY_BUFFER_STATE b );
+void commentcnvYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void commentcnvYYpop_buffer_state (void );
+
+static void commentcnvYYensure_buffer_stack (void );
+static void commentcnvYY_load_buffer_state (void );
+static void commentcnvYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER commentcnvYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE commentcnvYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE commentcnvYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE commentcnvYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *commentcnvYYalloc (yy_size_t );
+void *commentcnvYYrealloc (void *,yy_size_t );
+void commentcnvYYfree (void * );
+
+#define yy_new_buffer commentcnvYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ commentcnvYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ commentcnvYY_create_buffer(commentcnvYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ commentcnvYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ commentcnvYY_create_buffer(commentcnvYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define commentcnvYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *commentcnvYYin = (FILE *) 0, *commentcnvYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int commentcnvYYlineno;
+
+int commentcnvYYlineno = 1;
+
+extern char *commentcnvYYtext;
+#define yytext_ptr commentcnvYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up commentcnvYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ commentcnvYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 76
+#define YY_END_OF_BUFFER 77
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[295] =
+ { 0,
+ 1, 1, 36, 36, 24, 24, 24, 24, 63, 63,
+ 77, 76, 1, 18, 76, 6, 76, 18, 76, 4,
+ 18, 76, 11, 18, 76, 5, 18, 76, 18, 76,
+ 18, 76, 18, 76, 30, 76, 31, 76, 29, 30,
+ 76, 30, 76, 34, 76, 35, 76, 33, 34, 76,
+ 34, 76, 57, 76, 76, 76, 36, 44, 76, 39,
+ 76, 44, 76, 36, 44, 76, 37, 44, 76, 44,
+ 76, 44, 76, 24, 27, 76, 25, 76, 27, 76,
+ 27, 76, 24, 27, 76, 27, 76, 27, 76, 20,
+ 27, 76, 21, 27, 76, 24, 27, 76, 27, 76,
+
+ 75, 76, 58, 76, 75, 76, 65, 76, 63, 65,
+ 76, 62, 65, 76, 69, 74, 76, 71, 76, 74,
+ 76, 70, 74, 76, 72, 74, 76, 73, 74, 76,
+ 69, 74, 76, 69, 74, 76, 1, 3, 13, 11,
+ 10, 28, 32, 36, 41, 42, 43, 41, 42, 43,
+ 41, 42, 42, 43, 41, 43, 36, 37, 37, 40,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 24, 24, 24, 23, 58, 63, 62, 69, 69,
+ 69, 69, 12, 10, 9,16391, 49, 36, 38, 59,
+ 66, 67, 66, 66, 66, 16, 16, 67, 66, 66,
+
+ 66, 66, 66, 66, 66, 19, 26, 23, 23, 26,
+ 69,16452, 2,16391, 9, 52,16435,16434,16439,16431,
+ 45, 59, 59, 66, 66, 66, 66, 16, 66, 66,
+ 66, 66, 66, 66, 8260, 69, 8260,16438,16437,16440,
+ 16432, 46, 8243, 8242, 8247, 8239, 66, 15, 15, 67,
+ 66, 66, 66, 66, 66, 66, 66, 8246, 8245, 8248,
+ 8240, 60, 64, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 14, 22, 8199,
+ 66, 66, 66, 66, 66, 61, 61, 67, 66, 17,
+ 17, 67, 8, 9
+
+ } ;
+
+static yyconst flex_int16_t yy_accept[330] =
+ { 0,
+ 1, 1, 1, 2, 3, 3, 3, 3, 3, 3,
+ 3, 4, 5, 6, 7, 8, 9, 9, 9, 10,
+ 11, 11, 11, 12, 13, 16, 18, 20, 23, 26,
+ 29, 31, 33, 35, 37, 39, 42, 44, 46, 48,
+ 51, 53, 55, 56, 57, 60, 62, 64, 67, 70,
+ 72, 74, 77, 79, 81, 83, 86, 88, 90, 93,
+ 96, 99, 101, 103, 105, 107, 109, 112, 115, 118,
+ 120, 122, 125, 128, 131, 134, 137, 138, 140, 140,
+ 141, 141, 142, 142, 143, 144, 144, 144, 144, 144,
+ 144, 145, 148, 151, 153, 155, 157, 158, 159, 160,
+
+ 161, 161, 162, 163, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 172, 173, 173, 173, 174, 174, 174,
+ 174, 175, 175, 176, 176, 177, 178, 179, 180, 181,
+ 182, 183, 183, 184, 185, 185, 186, 187, 187, 187,
+ 188, 188, 188, 190, 191, 192, 193, 194, 195, 196,
+ 197, 199, 200, 201, 202, 203, 204, 205, 206, 206,
+ 206, 207, 208, 208, 209, 211, 213, 214, 215, 216,
+ 216, 217, 217, 217, 218, 219, 220, 221, 222, 222,
+ 223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
+ 233, 234, 235, 235, 235, 235, 237, 238, 238, 238,
+
+ 238, 239, 240, 241, 242, 243, 243, 243, 244, 244,
+ 245, 245, 246, 246, 247, 248, 249, 251, 252, 253,
+ 254, 255, 256, 257, 258, 258, 258, 258, 258, 258,
+ 258, 258, 258, 258, 258, 258, 258, 258, 259, 259,
+ 260, 260, 261, 261, 262, 263, 264, 264, 265, 266,
+ 267, 268, 269, 270, 271, 271, 271, 271, 271, 271,
+ 271, 271, 271, 271, 271, 271, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 279, 279, 279, 279, 279,
+ 279, 279, 280, 281, 281, 282, 283, 284, 285, 286,
+ 286, 286, 286, 286, 286, 286, 286, 287, 289, 290,
+
+ 291, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 295, 295
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 5, 6, 7, 8, 1, 1, 9, 1,
+ 1, 10, 1, 1, 11, 12, 13, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 1, 1, 15,
+ 1, 16, 1, 17, 18, 18, 18, 19, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 20, 21, 22, 1, 18, 1, 23, 24, 25, 26,
+
+ 27, 28, 29, 30, 31, 29, 29, 32, 33, 34,
+ 35, 29, 29, 36, 37, 38, 39, 40, 29, 41,
+ 42, 29, 43, 1, 44, 45, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[46] =
+ { 0,
+ 1, 2, 3, 1, 4, 5, 5, 1, 5, 6,
+ 7, 8, 9, 10, 1, 1, 11, 12, 12, 1,
+ 13, 1, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 15, 16, 17
+ } ;
+
+static yyconst flex_int16_t yy_base[369] =
+ { 0,
+ 0, 0, 0, 19, 12, 13, 14, 28, 1153, 39,
+ 50, 91, 26, 133, 33, 176, 41, 42, 220, 0,
+ 62, 264, 1155, 1157, 0, 1157, 1138, 1147, 1145, 1157,
+ 1140, 38, 1157, 1157, 1157, 1157, 0, 1157, 1157, 1157,
+ 0, 25, 55, 1137, 0, 73, 1157, 1143, 51, 292,
+ 1131, 0, 1157, 1157, 46, 77, 1134, 1119, 1157, 1157,
+ 79, 1132, 1141, 1157, 0, 1157, 1141, 0, 0, 1157,
+ 1157, 1157, 1157, 1157, 85, 1129, 0, 1157, 1135, 1157,
+ 1135, 81, 7, 1157, 1157, 86, 1126, 87, 1125, 97,
+ 0, 1157, 109, 1157, 1157, 1157, 1131, 72, 105, 1157,
+
+ 0, 1093, 60, 74, 79, 99, 83, 100, 101, 87,
+ 102, 94, 1110, 0, 1100, 125, 126, 1120, 1119, 1097,
+ 138, 1117, 136, 1126, 1157, 1126, 0, 0, 146, 1114,
+ 147, 1121, 1157, 1157, 1122, 1157, 1121, 1, 148, 1108,
+ 1090, 153, 0, 1004, 861, 1157, 131, 120, 138, 1157,
+ 0, 129, 130, 137, 142, 147, 148, 151, 852, 857,
+ 1157, 1157, 855, 1157, 1157, 258, 1157, 876, 185, 167,
+ 863, 870, 179, 873, 872, 871, 870, 1157, 192, 816,
+ 814, 161, 170, 334, 174, 0, 168, 175, 166, 171,
+ 245, 172, 787, 240, 257, 338, 0, 273, 799, 268,
+
+ 807, 787, 786, 784, 1157, 281, 777, 1157, 774, 1157,
+ 770, 1157, 768, 1157, 358, 1157, 1157, 173, 252, 169,
+ 255, 257, 269, 262, 742, 724, 737, 725, 709, 718,
+ 710, 706, 700, 691, 301, 349, 723, 1157, 715, 1157,
+ 693, 1157, 691, 1157, 361, 1157, 364, 337, 341, 348,
+ 261, 326, 347, 344, 129, 659, 649, 651, 656, 631,
+ 618, 617, 601, 612, 0, 350, 360, 356, 359, 330,
+ 352, 361, 354, 1157, 603, 607, 598, 456, 466, 454,
+ 460, 1157, 1157, 367, 404, 380, 386, 449, 394, 451,
+ 444, 450, 449, 459, 447, 436, 1157, 1157, 388, 1157,
+
+ 1157, 446, 444, 446, 445, 437, 414, 433, 411, 407,
+ 398, 393, 403, 390, 395, 386, 325, 266, 465, 255,
+ 435, 441, 439, 442, 275, 200, 1157, 1157, 494, 511,
+ 528, 545, 562, 579, 596, 613, 630, 647, 664, 681,
+ 698, 715, 732, 749, 760, 774, 791, 797, 805, 820,
+ 837, 854, 870, 52, 884, 901, 918, 935, 952, 969,
+ 986, 1003, 1020, 1037, 1054, 1071, 1088, 1105
+ } ;
+
+static yyconst flex_int16_t yy_def[369] =
+ { 0,
+ 329, 329, 330, 330, 331, 331, 332, 332, 329, 329,
+ 333, 333, 334, 334, 334, 334, 335, 335, 328, 19,
+ 336, 336, 328, 328, 337, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 338, 328, 328, 328,
+ 339, 328, 328, 328, 340, 341, 328, 340, 342, 328,
+ 328, 343, 328, 328, 328, 343, 328, 328, 328, 328,
+ 343, 328, 344, 328, 50, 328, 328, 345, 346, 328,
+ 328, 328, 328, 328, 346, 346, 337, 328, 328, 328,
+ 328, 328, 347, 328, 328, 328, 328, 328, 328, 328,
+ 340, 328, 341, 328, 328, 328, 340, 342, 342, 328,
+
+ 348, 349, 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 328, 343, 328, 328, 343, 328, 328, 328,
+ 343, 328, 328, 344, 328, 328, 345, 346, 346, 346,
+ 346, 328, 328, 328, 347, 328, 350, 347, 328, 351,
+ 328, 352, 340, 353, 349, 328, 349, 349, 349, 328,
+ 354, 349, 349, 349, 349, 349, 349, 349, 328, 328,
+ 328, 328, 328, 328, 328, 355, 328, 350, 328, 347,
+ 356, 328, 357, 358, 359, 360, 361, 328, 328, 328,
+ 353, 349, 349, 349, 349, 354, 349, 349, 349, 349,
+ 349, 349, 328, 328, 328, 355, 362, 328, 328, 347,
+
+ 363, 364, 365, 366, 328, 328, 358, 328, 359, 328,
+ 360, 328, 361, 328, 349, 328, 328, 349, 349, 349,
+ 349, 349, 349, 349, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 347, 363, 328, 364, 328,
+ 365, 328, 366, 328, 328, 328, 328, 349, 349, 349,
+ 349, 349, 349, 349, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 367, 347, 349, 349, 349, 349,
+ 349, 349, 349, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 347, 349, 349, 349, 349, 349, 328,
+ 328, 328, 328, 328, 328, 347, 328, 328, 349, 328,
+
+ 328, 328, 328, 328, 328, 328, 328, 347, 328, 328,
+ 328, 328, 328, 328, 347, 328, 328, 328, 347, 328,
+ 347, 347, 347, 347, 368, 368, 328, 0, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328
+ } ;
+
+static yyconst flex_int16_t yy_nxt[1203] =
+ { 0,
+ 328, 328, 26, 136, 27, 28, 29, 170, 30, 136,
+ 31, 137, 32, 138, 35, 35, 39, 36, 36, 137,
+ 33, 26, 40, 27, 28, 29, 86, 30, 53, 31,
+ 39, 32, 37, 37, 41, 53, 40, 87, 54, 33,
+ 43, 42, 55, 64, 64, 54, 55, 82, 41, 58,
+ 83, 44, 46, 58, 47, 48, 88, 65, 65, 49,
+ 99, 65, 65, 100, 70, 186, 50, 89, 54, 54,
+ 50, 71, 115, 116, 93, 59, 60, 94, 117, 95,
+ 121, 328, 72, 96, 328, 134, 129, 86, 88, 118,
+ 134, 122, 51, 46, 147, 47, 48, 130, 87, 89,
+
+ 49, 140, 146, 141, 73, 74, 150, 50, 148, 142,
+ 93, 50, 149, 94, 99, 95, 146, 100, 150, 96,
+ 152, 146, 153, 154, 156, 146, 158, 117, 157, 146,
+ 274, 274, 161, 51, 56, 53, 146, 155, 118, 121,
+ 164, 151, 146, 146, 146, 57, 161, 129, 165, 55,
+ 122, 166, 171, 55, 172, 178, 182, 184, 130, 166,
+ 173, 187, 146, 185, 183, 179, 184, 188, 161, 136,
+ 189, 146, 146, 146, 190, 54, 54, 61, 53, 146,
+ 146, 205, 192, 191, 146, 200, 198, 184, 62, 146,
+ 146, 206, 58, 146, 178, 215, 58, 199, 218, 219,
+
+ 221, 220, 327, 146, 179, 222, 224, 248, 146, 250,
+ 146, 146, 146, 146, 146, 146, 146, 146, 59, 60,
+ 66, 67, 24, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 68, 68, 66,
+ 66, 66, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 66, 66, 66, 75, 70, 197, 223, 226,
+ 136, 227, 228, 71, 198, 229, 76, 327, 197, 230,
+ 231, 232, 233, 205, 72, 199, 249, 146, 251, 234,
+ 252, 253, 270, 206, 146, 254, 161, 146, 161, 146,
+
+ 197, 197, 236, 146, 146, 265, 73, 74, 101, 102,
+ 102, 146, 101, 265, 102, 102, 103, 104, 105, 106,
+ 102, 107, 102, 108, 109, 102, 102, 110, 102, 102,
+ 102, 111, 112, 102, 216, 216, 216, 216, 216, 216,
+ 216, 216, 216, 216, 216, 216, 216, 197, 216, 216,
+ 216, 136, 136, 216, 216, 216, 320, 271, 197, 245,
+ 246, 247, 245, 246, 247, 247, 246, 247, 146, 136,
+ 267, 288, 146, 266, 268, 273, 217, 216, 216, 146,
+ 197, 197, 269, 146, 272, 285, 146, 286, 284, 146,
+ 146, 289, 287, 288, 146, 288, 146, 136, 146, 296,
+
+ 146, 146, 146, 146, 297, 297, 297, 297, 297, 297,
+ 297, 297, 297, 297, 297, 297, 297, 299, 297, 297,
+ 297, 288, 146, 297, 297, 297, 288, 161, 146, 288,
+ 146, 161, 319, 318, 161, 136, 146, 136, 136, 161,
+ 317, 136, 316, 136, 136, 314, 298, 297, 297, 300,
+ 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
+ 300, 300, 308, 300, 300, 300, 315, 136, 300, 300,
+ 300, 323, 322, 324, 313, 325, 312, 311, 310, 309,
+ 307, 306, 305, 304, 303, 302, 282, 321, 295, 294,
+ 293, 301, 300, 300, 24, 24, 24, 24, 24, 24,
+
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 63, 63, 63, 63,
+
+ 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 77, 77, 292, 291, 290, 77, 282, 77, 282, 77,
+ 77, 77, 281, 77, 77, 77, 77, 84, 84, 280,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 85, 85, 279, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 91, 91, 278, 277, 91, 276, 91, 91, 91,
+ 91, 275, 91, 244, 91, 242, 91, 91, 92, 92,
+
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 98, 98, 240, 98, 98,
+ 98, 98, 98, 98, 98, 238, 98, 264, 98, 98,
+ 98, 98, 114, 114, 263, 114, 114, 114, 114, 114,
+ 262, 114, 261, 114, 260, 114, 259, 258, 114, 124,
+ 124, 124, 124, 124, 124, 124, 124, 124, 124, 257,
+ 124, 256, 124, 124, 124, 124, 127, 127, 255, 127,
+ 214, 127, 212, 127, 128, 128, 210, 128, 128, 208,
+ 128, 128, 128, 128, 128, 128, 244, 128, 242, 240,
+ 128, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+
+ 135, 135, 135, 135, 135, 135, 135, 135, 144, 238,
+ 144, 235, 225, 144, 145, 180, 145, 180, 145, 145,
+ 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 177, 177, 177, 177, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+ 177, 181, 214, 212, 210, 208, 203, 202, 169, 181,
+ 195, 181, 194, 181, 196, 196, 193, 196, 196, 196,
+ 196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+
+ 196, 201, 201, 146, 201, 201, 201, 201, 201, 201,
+ 201, 201, 201, 201, 201, 201, 201, 201, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 207, 207, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+ 207, 207, 209, 209, 209, 209, 209, 209, 209, 209,
+ 209, 209, 209, 209, 209, 209, 209, 209, 209, 211,
+ 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+ 211, 211, 211, 211, 211, 211, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+
+ 213, 213, 213, 197, 197, 180, 197, 197, 197, 197,
+ 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
+ 237, 237, 237, 237, 237, 237, 237, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 243, 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243, 283, 283,
+ 283, 283, 283, 283, 283, 283, 176, 283, 283, 283,
+
+ 283, 283, 283, 283, 283, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 175, 169, 136, 167, 131, 126, 125, 123,
+ 163, 162, 119, 160, 159, 146, 143, 90, 139, 133,
+ 132, 131, 126, 125, 123, 120, 119, 113, 97, 90,
+ 81, 80, 79, 78, 328, 42, 23, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+
+ 328, 328
+ } ;
+
+static yyconst flex_int16_t yy_chk[1203] =
+ { 0,
+ 0, 0, 3, 138, 3, 3, 3, 138, 3, 83,
+ 3, 83, 3, 83, 5, 6, 7, 5, 6, 83,
+ 3, 4, 7, 4, 4, 4, 42, 4, 13, 4,
+ 8, 4, 5, 6, 7, 15, 8, 42, 13, 4,
+ 10, 10, 13, 17, 18, 15, 13, 32, 8, 15,
+ 32, 10, 11, 15, 11, 11, 43, 17, 18, 11,
+ 49, 17, 18, 49, 21, 354, 11, 43, 13, 13,
+ 11, 21, 55, 55, 46, 15, 15, 46, 56, 46,
+ 61, 98, 21, 46, 98, 82, 75, 86, 88, 56,
+ 82, 61, 11, 12, 103, 12, 12, 75, 86, 88,
+
+ 12, 90, 103, 90, 21, 21, 106, 12, 104, 90,
+ 93, 12, 105, 93, 99, 93, 104, 99, 106, 93,
+ 107, 105, 108, 109, 110, 107, 112, 117, 111, 110,
+ 255, 255, 116, 12, 14, 14, 112, 109, 117, 121,
+ 123, 106, 108, 109, 111, 14, 116, 129, 123, 14,
+ 121, 131, 139, 14, 139, 142, 147, 148, 129, 131,
+ 139, 152, 148, 149, 147, 142, 155, 153, 116, 170,
+ 154, 152, 153, 147, 156, 14, 14, 16, 16, 154,
+ 149, 173, 158, 157, 155, 170, 169, 182, 16, 156,
+ 157, 173, 16, 158, 179, 183, 16, 169, 185, 187,
+
+ 189, 188, 326, 182, 179, 190, 192, 218, 189, 220,
+ 187, 220, 183, 190, 192, 218, 185, 188, 16, 16,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 22, 22, 166, 191, 194,
+ 200, 194, 194, 22, 198, 194, 22, 325, 166, 194,
+ 194, 195, 195, 206, 22, 198, 219, 191, 221, 195,
+ 222, 223, 251, 206, 219, 224, 320, 221, 318, 222,
+
+ 166, 166, 200, 251, 224, 235, 22, 22, 50, 50,
+ 50, 223, 50, 235, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 184, 184, 184, 184, 184, 184,
+ 184, 184, 184, 184, 184, 184, 184, 196, 184, 184,
+ 184, 236, 266, 184, 184, 184, 317, 252, 196, 215,
+ 215, 215, 245, 245, 245, 247, 247, 247, 252, 284,
+ 248, 270, 270, 236, 249, 254, 184, 184, 184, 248,
+ 196, 196, 250, 249, 253, 267, 254, 268, 266, 253,
+ 250, 272, 269, 271, 271, 273, 273, 315, 268, 284,
+
+ 215, 269, 267, 272, 285, 285, 285, 285, 285, 285,
+ 285, 285, 285, 285, 285, 285, 285, 287, 285, 285,
+ 285, 286, 286, 285, 285, 285, 289, 316, 287, 299,
+ 299, 314, 315, 313, 312, 308, 289, 321, 296, 311,
+ 310, 323, 309, 322, 324, 307, 285, 285, 285, 288,
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 288, 288, 296, 288, 288, 288, 308, 319, 288, 288,
+ 288, 322, 321, 323, 306, 324, 305, 304, 303, 302,
+ 295, 294, 293, 292, 291, 290, 281, 319, 280, 279,
+ 278, 288, 288, 288, 329, 329, 329, 329, 329, 329,
+
+ 329, 329, 329, 329, 329, 329, 329, 329, 329, 329,
+ 329, 330, 330, 330, 330, 330, 330, 330, 330, 330,
+ 330, 330, 330, 330, 330, 330, 330, 330, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 332, 332, 332, 332, 332,
+ 332, 332, 332, 332, 332, 332, 332, 332, 332, 332,
+ 332, 332, 333, 333, 333, 333, 333, 333, 333, 333,
+ 333, 333, 333, 333, 333, 333, 333, 333, 333, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 335, 335, 335, 335,
+
+ 335, 335, 335, 335, 335, 335, 335, 335, 335, 335,
+ 335, 335, 335, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
+ 337, 337, 277, 276, 275, 337, 264, 337, 263, 337,
+ 337, 337, 262, 337, 337, 337, 337, 338, 338, 261,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 339, 339, 260, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 339, 339, 339, 339,
+ 339, 340, 340, 259, 258, 340, 257, 340, 340, 340,
+ 340, 256, 340, 243, 340, 241, 340, 340, 341, 341,
+
+ 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
+ 341, 341, 341, 341, 341, 342, 342, 239, 342, 342,
+ 342, 342, 342, 342, 342, 237, 342, 234, 342, 342,
+ 342, 342, 343, 343, 233, 343, 343, 343, 343, 343,
+ 232, 343, 231, 343, 230, 343, 229, 228, 343, 344,
+ 344, 344, 344, 344, 344, 344, 344, 344, 344, 227,
+ 344, 226, 344, 344, 344, 344, 345, 345, 225, 345,
+ 213, 345, 211, 345, 346, 346, 209, 346, 346, 207,
+ 346, 346, 346, 346, 346, 346, 204, 346, 203, 202,
+ 346, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+
+ 347, 347, 347, 347, 347, 347, 347, 347, 348, 201,
+ 348, 199, 193, 348, 349, 181, 349, 180, 349, 349,
+ 350, 350, 350, 350, 350, 350, 350, 350, 350, 350,
+ 350, 350, 350, 350, 350, 350, 350, 351, 351, 351,
+ 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
+ 351, 351, 351, 351, 352, 352, 352, 352, 352, 352,
+ 352, 352, 352, 352, 352, 352, 352, 352, 352, 352,
+ 352, 353, 177, 176, 175, 174, 172, 171, 168, 353,
+ 163, 353, 160, 353, 355, 355, 159, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+
+ 355, 356, 356, 145, 356, 356, 356, 356, 356, 356,
+ 356, 356, 356, 356, 356, 356, 356, 356, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 359, 359, 359, 359, 359, 360,
+ 360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
+ 360, 360, 360, 360, 360, 360, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
+
+ 361, 361, 361, 362, 362, 144, 362, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+ 363, 363, 363, 363, 363, 363, 363, 363, 363, 363,
+ 363, 363, 363, 363, 363, 363, 363, 364, 364, 364,
+ 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+ 364, 364, 364, 364, 365, 365, 365, 365, 365, 365,
+ 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
+ 365, 366, 366, 366, 366, 366, 366, 366, 366, 366,
+ 366, 366, 366, 366, 366, 366, 366, 366, 367, 367,
+ 367, 367, 367, 367, 367, 367, 141, 367, 367, 367,
+
+ 367, 367, 367, 367, 367, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 140, 137, 135, 132, 130, 126, 124, 122,
+ 120, 119, 118, 115, 113, 102, 97, 89, 87, 81,
+ 79, 76, 67, 63, 62, 58, 57, 51, 48, 44,
+ 31, 29, 28, 27, 23, 9, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328, 328, 328,
+
+ 328, 328
+ } ;
+
+extern int commentcnvYY_flex_debug;
+int commentcnvYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *commentcnvYYtext;
+#line 1 "commentcnv.l"
+/*****************************************************************************
+ *
+ * $Id: commentcnv.l,v 1.80 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#line 19 "commentcnv.l"
+
+#define YY_NEVER_INTERACTIVE 1
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <qstack.h>
+#include <qregexp.h>
+#include <qtextstream.h>
+#include <qglobal.h>
+
+#include "bufstr.h"
+#include "debug.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+
+#include <assert.h>
+
+#define ADDCHAR(c) g_outBuf->addChar(c)
+#define ADDARRAY(a,s) g_outBuf->addArray(a,s)
+
+struct CondCtx
+{
+ CondCtx(int line,QCString id,bool b)
+ : lineNr(line),sectionId(id), skip(b) {}
+ int lineNr;
+ QCString sectionId;
+ bool skip;
+};
+
+static BufStr * g_inBuf;
+static BufStr * g_outBuf;
+static int g_inBufPos;
+static int g_col;
+static int g_blockHeadCol;
+static bool g_mlBrief;
+static int g_readLineCtx;
+static bool g_skip;
+static QCString g_fileName;
+static int g_lineNr;
+static int g_condCtx;
+static QStack<CondCtx> g_condStack;
+static QCString g_blockName;
+static int g_lastCommentContext;
+static bool g_inSpecialComment;
+static bool g_inRoseComment;
+static int g_javaBlock;
+static bool g_specialComment;
+
+static QCString g_aliasString;
+static int g_blockCount;
+static bool g_lastEscaped;
+static int g_lastBlockContext;
+static bool g_pythonDocString;
+
+
+static SrcLangExt g_lang;
+
+static void replaceCommentMarker(const char *s,int len)
+{
+ const char *p=s;
+ char c;
+ // copy blanks
+ while ((c=*p) && (c==' ' || c=='\t' || c=='\n'))
+ {
+ ADDCHAR(c);
+ g_lineNr += c=='\n';
+ p++;
+ }
+ // replace start of comment marker by spaces
+ while ((c=*p) && (c=='/' || c=='!' || c=='#'))
+ {
+ ADDCHAR(' ');
+ p++;
+ if (*p=='<') // comment-after-item marker
+ {
+ ADDCHAR(' ');
+ p++;
+ }
+ if (c=='!') // end after first !
+ {
+ break;
+ }
+ }
+ // copy comment line to output
+ ADDARRAY(p,len-(p-s));
+}
+
+static inline int computeIndent(const char *s)
+{
+ int col=0;
+ static int tabSize=Config_getInt("TAB_SIZE");
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ if (c==' ') col++;
+ else if (c=='\t') col+=tabSize-(col%tabSize);
+ else break;
+ }
+ return col;
+}
+
+static inline void copyToOutput(const char *s,int len)
+{
+ int i;
+ if (g_skip) // only add newlines.
+ {
+ for (i=0;i<len;i++)
+ {
+ if (s[i]=='\n')
+ {
+ ADDCHAR('\n');
+ //fprintf(stderr,"---> skip %d\n",g_lineNr);
+ g_lineNr++;
+ }
+ }
+ }
+ else if (len>0)
+ {
+ ADDARRAY(s,len);
+ static int tabSize=Config_getInt("TAB_SIZE");
+ for (i=0;i<len;i++)
+ {
+ switch (s[i])
+ {
+ case '\n': g_col=0;
+ //fprintf(stderr,"---> copy %d\n",g_lineNr);
+ g_lineNr++; break;
+ case '\t': g_col+=tabSize-(g_col%tabSize); break;
+ default: g_col++; break;
+ }
+ }
+ }
+}
+
+static void startCondSection(const char *sectId)
+{
+ g_condStack.push(new CondCtx(g_lineNr,sectId,g_skip));
+ if (Config_getList("ENABLED_SECTIONS").find(sectId)!=-1)
+ {
+ //printf("*** Section is enabled!\n");
+ }
+ else
+ {
+ //printf("*** Section is disabled!\n");
+ g_skip=TRUE;
+ }
+}
+
+static void endCondSection()
+{
+ if (g_condStack.isEmpty())
+ {
+ warn(g_fileName,g_lineNr,"Found \\endcond command without matching \\cond");
+ g_skip=FALSE;
+ }
+ else
+ {
+ CondCtx *ctx = g_condStack.pop();
+ g_skip=ctx->skip;
+ }
+}
+
+#if 0
+/** remove and executes cond and endcond commands in \a s */
+static QCString handleCondCmdInAliases(const QCString &s)
+{
+ QCString result;
+ //printf("handleCondCmdInAliases(%s)\n",s.data());
+ static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*");
+ int p=0,i,l;
+ while ((i=cmdPat.match(s,p,&l))!=-1)
+ {
+ result+=s.mid(p,i-p);
+ QCString cmd = s.mid(i+1,l-1);
+ //printf("Found command %s\n",cmd.data());
+ if (cmd=="cond")
+ {
+ int sp=i+l,ep;
+ const char *arg=s.data()+sp;
+ char c;
+ // skip spaces
+ while ((c=*arg) && (c==' ' || c=='\t')) arg++,sp++;
+ // read argument
+ if (*arg=='\n') // no arg
+ {
+ startCondSection(" ");
+ ep=sp;
+ }
+ else // get argument
+ {
+ ep=sp;
+ while ((c=*arg) && isId(c)) arg++,ep++;
+ if (ep>sp)
+ {
+ QCString id = s.mid(sp,ep-sp);
+ //printf("Found conditional section id %s\n",id.data());
+ startCondSection(id);
+ }
+ else // invalid identifier
+ {
+ }
+ }
+ p=ep;
+ }
+ else if (cmd=="endcond")
+ {
+ endCondSection();
+ p=i+l;
+ }
+ else
+ {
+ result+=s.mid(i,l);
+ p=i+l;
+ }
+ }
+ result+=s.right(s.length()-p);
+ return result;
+}
+#endif
+
+/** copies string \a s with length \a len to the output, while
+ * replacing any alias commands found in the string.
+ */
+static void replaceAliases(const char *s)
+{
+ QCString result = resolveAliasCmd(s);
+ //printf("replaceAliases(%s)->'%s'\n",s,result.data());
+ copyToOutput(result,result.length());
+}
+
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int bytesInBuf = g_inBuf->curPos()-g_inBufPos;
+ int bytesToCopy = QMIN(max_size,bytesInBuf);
+ memcpy(buf,g_inBuf->data()+g_inBufPos,bytesToCopy);
+ g_inBufPos+=bytesToCopy;
+ return bytesToCopy;
+}
+
+void replaceComment(int offset);
+
+
+
+
+
+
+
+
+
+
+
+#line 1177 "<stdout>"
+
+#define INITIAL 0
+#define Scan 1
+#define SkipString 2
+#define SkipChar 3
+#define SComment 4
+#define CComment 5
+#define Verbatim 6
+#define VerbatimCode 7
+#define ReadLine 8
+#define CondLine 9
+#define ReadAliasArgs 10
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int commentcnvYYlex_destroy (void );
+
+int commentcnvYYget_debug (void );
+
+void commentcnvYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE commentcnvYYget_extra (void );
+
+void commentcnvYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *commentcnvYYget_in (void );
+
+void commentcnvYYset_in (FILE * in_str );
+
+FILE *commentcnvYYget_out (void );
+
+void commentcnvYYset_out (FILE * out_str );
+
+yy_size_t commentcnvYYget_leng (void );
+
+char *commentcnvYYget_text (void );
+
+int commentcnvYYget_lineno (void );
+
+void commentcnvYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int commentcnvYYwrap (void );
+#else
+extern int commentcnvYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( commentcnvYYtext, commentcnvYYleng, 1, commentcnvYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( commentcnvYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( commentcnvYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, commentcnvYYin))==0 && ferror(commentcnvYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(commentcnvYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int commentcnvYYlex (void);
+
+#define YY_DECL int commentcnvYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after commentcnvYYtext and commentcnvYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( commentcnvYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (commentcnvYYtext[commentcnvYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 283 "commentcnv.l"
+
+
+#line 1375 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)commentcnvYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in commentcnvYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! commentcnvYYin )
+ commentcnvYYin = stdin;
+
+ if ( ! commentcnvYYout )
+ commentcnvYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ commentcnvYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ commentcnvYY_create_buffer(commentcnvYYin,YY_BUF_SIZE );
+ }
+
+ commentcnvYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of commentcnvYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 329 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 1157 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 285 "commentcnv.l"
+{ /* eat anything that is not " / or \n */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 288 "commentcnv.l"
+{ /* start of python long comment */
+ if (g_lang!=SrcLangExt_Python)
+ {
+ REJECT;
+ }
+ else
+ {
+ g_pythonDocString = TRUE;
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(CComment);
+ }
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 300 "commentcnv.l"
+{
+ if (g_lang!=SrcLangExt_F90)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(CComment);
+ }
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 311 "commentcnv.l"
+{ /* start of a string */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(SkipString);
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 315 "commentcnv.l"
+{
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(SkipChar);
+ }
+ YY_BREAK
+case 6:
+/* rule 6 can match eol */
+YY_RULE_SETUP
+#line 319 "commentcnv.l"
+{ /* new line */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 7:
+/* rule 7 can match eol */
+YY_RULE_SETUP
+#line 322 "commentcnv.l"
+{ /* start C++ style special comment block */
+ if (g_mlBrief)
+ {
+ REJECT; // bail out if we do not need to convert
+ }
+ else
+ {
+ int i=3;
+ if (commentcnvYYtext[2]=='/')
+ {
+ while (i<(int)commentcnvYYleng && commentcnvYYtext[i]=='/') i++;
+ }
+ g_blockHeadCol=g_col;
+ copyToOutput("/**",3);
+ replaceAliases(commentcnvYYtext+i);
+ g_inSpecialComment=TRUE;
+ BEGIN(SComment);
+ }
+ }
+ YY_BREAK
+case 8:
+/* rule 8 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 341 "commentcnv.l"
+{ /* Start of Rational Rose ANSI C++ comment block */
+ if (g_mlBrief) REJECT;
+ int i=17; //=strlen("//##Documentation");
+ g_blockHeadCol=g_col;
+ copyToOutput("/**",3);
+ replaceAliases(commentcnvYYtext+i);
+ g_inRoseComment=TRUE;
+ BEGIN(SComment);
+ }
+ YY_BREAK
+case 9:
+/* rule 9 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 350 "commentcnv.l"
+{ /* one line C++ comment */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 355 "commentcnv.l"
+{ /* start of a C comment */
+ g_specialComment=commentcnvYYleng==3;
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(CComment);
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 360 "commentcnv.l"
+{
+ if (g_lang!=SrcLangExt_Python)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(CComment);
+ }
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 371 "commentcnv.l"
+{
+ if (g_lang!=SrcLangExt_VHDL)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(CComment);
+ }
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 382 "commentcnv.l"
+{
+ if (g_lang!=SrcLangExt_F90)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(CComment);
+ }
+ }
+ YY_BREAK
+case 14:
+/* rule 14 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 6;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 393 "commentcnv.l"
+{
+ copyToOutput("@code",5);
+ g_lastCommentContext = YY_START;
+ g_javaBlock=1;
+ g_blockName=&commentcnvYYtext[1];
+ BEGIN(VerbatimCode);
+ }
+ YY_BREAK
+case 15:
+/* rule 15 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 400 "commentcnv.l"
+{ /* start of a verbatim block */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ g_lastCommentContext = YY_START;
+ g_javaBlock=0;
+ g_blockName=&commentcnvYYtext[1];
+ BEGIN(VerbatimCode);
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 407 "commentcnv.l"
+{
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ g_blockName=&commentcnvYYtext[1];
+ if (g_blockName.at(1)=='[')
+ {
+ g_blockName.at(1)=']';
+ }
+ else if (g_blockName.at(1)=='{')
+ {
+ g_blockName.at(1)='}';
+ }
+ g_lastCommentContext = YY_START;
+ BEGIN(Verbatim);
+ }
+ YY_BREAK
+case 17:
+/* rule 17 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 421 "commentcnv.l"
+{ /* start of a verbatim block */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ g_blockName=&commentcnvYYtext[1];
+ g_lastCommentContext = YY_START;
+ BEGIN(Verbatim);
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 427 "commentcnv.l"
+{ /* any other character */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 430 "commentcnv.l"
+{ /* end of verbatim block */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ if (commentcnvYYtext[1]=='f') // end of formula
+ {
+ BEGIN(g_lastCommentContext);
+ }
+ else if (&commentcnvYYtext[4]==g_blockName)
+ {
+ BEGIN(g_lastCommentContext);
+ }
+ }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 441 "commentcnv.l"
+{
+ if (g_javaBlock==0)
+ {
+ REJECT;
+ }
+ else
+ {
+ g_javaBlock++;
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 452 "commentcnv.l"
+{
+ if (g_javaBlock==0)
+ {
+ REJECT;
+ }
+ else
+ {
+ g_javaBlock--;
+ if (g_javaBlock==0)
+ {
+ copyToOutput(" @endcode ",10);
+ BEGIN(g_lastCommentContext);
+ }
+ else
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ }
+ }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 471 "commentcnv.l"
+{ /* end of verbatim block */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ if (&commentcnvYYtext[4]==g_blockName)
+ {
+ BEGIN(g_lastCommentContext);
+ }
+ }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 478 "commentcnv.l"
+{ /* skip leading comments */
+ if (!g_inSpecialComment)
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 484 "commentcnv.l"
+{ /* any character not a backslash or new line or } */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 487 "commentcnv.l"
+{ /* new line in verbatim block */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 490 "commentcnv.l"
+{
+ if (g_blockName=="dot" || g_blockName=="msc" || g_blockName.at(0)=='f')
+ {
+ // see bug 487871, strip /// from dot images and formulas.
+ copyToOutput(" ",3);
+ }
+ else // even slashes are verbatim (e.g. \verbatim, \code)
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 501 "commentcnv.l"
+{ /* any other character */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 504 "commentcnv.l"
+{ /* escaped character in string */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 507 "commentcnv.l"
+{ /* end of string */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(Scan);
+ }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 511 "commentcnv.l"
+{ /* any other string character */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+#line 514 "commentcnv.l"
+{ /* new line inside string (illegal for some compilers) */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 517 "commentcnv.l"
+{ /* escaped character */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 520 "commentcnv.l"
+{ /* end of character literal */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(Scan);
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 524 "commentcnv.l"
+{ /* any other string character */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 35:
+/* rule 35 can match eol */
+YY_RULE_SETUP
+#line 527 "commentcnv.l"
+{ /* new line character */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 531 "commentcnv.l"
+{ /* anything that is not a '*' or command */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 534 "commentcnv.l"
+{ /* stars without slashes */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 537 "commentcnv.l"
+{ /* end of Python docstring */
+ if (g_lang!=SrcLangExt_Python)
+ {
+ REJECT;
+ }
+ else
+ {
+ g_pythonDocString = FALSE;
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(Scan);
+ }
+ }
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 549 "commentcnv.l"
+{ /* new line in comment */
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 552 "commentcnv.l"
+{ /* end of C comment */
+ if (g_lang==SrcLangExt_Python)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(Scan);
+ }
+ }
+ YY_BREAK
+case 41:
+/* rule 41 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 563 "commentcnv.l"
+{ /* end of Python comment */
+ if (g_lang!=SrcLangExt_Python || g_pythonDocString)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(Scan);
+ }
+ }
+ YY_BREAK
+case 42:
+/* rule 42 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 574 "commentcnv.l"
+{ /* end of VHDL comment */
+ if (g_lang!=SrcLangExt_VHDL)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(Scan);
+ }
+ }
+ YY_BREAK
+case 43:
+/* rule 43 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 585 "commentcnv.l"
+{ /* end of Fortran comment */
+ if (g_lang!=SrcLangExt_F90)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(Scan);
+ }
+ }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 596 "commentcnv.l"
+{
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 45:
+/* rule 45 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 599 "commentcnv.l"
+{
+ replaceComment(0);
+ }
+ YY_BREAK
+case 46:
+/* rule 46 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 602 "commentcnv.l"
+{
+ replaceComment(1);
+ }
+ YY_BREAK
+case 47:
+/* rule 47 can match eol */
+YY_RULE_SETUP
+#line 605 "commentcnv.l"
+{
+ replaceComment(0);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+ YY_BREAK
+case 48:
+/* rule 48 can match eol */
+YY_RULE_SETUP
+#line 610 "commentcnv.l"
+{
+ replaceComment(1);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+ YY_BREAK
+case 49:
+#line 616 "commentcnv.l"
+case 50:
+/* rule 50 can match eol */
+#line 617 "commentcnv.l"
+case 51:
+/* rule 51 can match eol */
+YY_RULE_SETUP
+#line 617 "commentcnv.l"
+{ // or //!something
+ replaceComment(0);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+ YY_BREAK
+case 52:
+/* rule 52 can match eol */
+#line 623 "commentcnv.l"
+case 53:
+/* rule 53 can match eol */
+#line 624 "commentcnv.l"
+case 54:
+/* rule 54 can match eol */
+YY_RULE_SETUP
+#line 624 "commentcnv.l"
+{
+ replaceComment(1);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+ YY_BREAK
+case 55:
+/* rule 55 can match eol */
+YY_RULE_SETUP
+#line 629 "commentcnv.l"
+{
+ if (!g_inRoseComment)
+ {
+ REJECT;
+ }
+ else
+ {
+ replaceComment(0);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+ }
+ YY_BREAK
+case 56:
+/* rule 56 can match eol */
+YY_RULE_SETUP
+#line 641 "commentcnv.l"
+{
+ if (!g_inRoseComment)
+ {
+ REJECT;
+ }
+ else
+ {
+ replaceComment(1);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+ }
+ YY_BREAK
+case 57:
+/* rule 57 can match eol */
+YY_RULE_SETUP
+#line 653 "commentcnv.l"
+{ /* end of special comment */
+ copyToOutput(" */",3);
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ g_inSpecialComment=FALSE;
+ g_inRoseComment=FALSE;
+ BEGIN(Scan);
+ }
+ YY_BREAK
+case 58:
+/* rule 58 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 660 "commentcnv.l"
+{
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ BEGIN(g_readLineCtx);
+ }
+ YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 664 "commentcnv.l"
+{ // escaped command
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 60:
+YY_RULE_SETUP
+#line 667 "commentcnv.l"
+{ // conditional section
+ g_condCtx = YY_START;
+ BEGIN(CondLine);
+ }
+ YY_BREAK
+case 61:
+/* rule 61 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 8;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+YY_RULE_SETUP
+#line 671 "commentcnv.l"
+{ // end of conditional section
+ bool oldSkip=g_skip;
+ endCondSection();
+ if (YY_START==CComment && oldSkip && !g_skip)
+ {
+ //printf("** Adding start of comment!\n");
+ if (g_lang!=SrcLangExt_Python &&
+ g_lang!=SrcLangExt_VHDL &&
+ g_lang!=SrcLangExt_F90)
+ {
+ ADDCHAR('/');
+ ADDCHAR('*');
+ if (g_specialComment)
+ {
+ ADDCHAR('*');
+ }
+ }
+ }
+ }
+ YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 690 "commentcnv.l"
+{
+ bool oldSkip=g_skip;
+ startCondSection(commentcnvYYtext);
+ if (g_condCtx==CComment && !oldSkip && g_skip)
+ {
+ //printf("** Adding terminator for comment!\n");
+ if (g_lang!=SrcLangExt_Python &&
+ g_lang!=SrcLangExt_VHDL &&
+ g_lang!=SrcLangExt_F90)
+ {
+ ADDCHAR('*');
+ ADDCHAR('/');
+ }
+ }
+ BEGIN(g_condCtx);
+ }
+ YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 706 "commentcnv.l"
+
+ YY_BREAK
+case 64:
+/* rule 64 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentcnvYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentcnvYYtext again */
+#line 708 "commentcnv.l"
+case 65:
+/* rule 65 can match eol */
+YY_RULE_SETUP
+#line 708 "commentcnv.l"
+{ // forgot section id?
+ if (YY_START!=CondLine) g_condCtx=YY_START;
+ bool oldSkip=g_skip;
+ startCondSection(" "); // fake section id causing the section to be hidden unconditionally
+ if (g_condCtx==CComment && !oldSkip && g_skip)
+ {
+ //printf("** Adding terminator for comment!\n");
+ if (g_lang!=SrcLangExt_Python &&
+ g_lang!=SrcLangExt_VHDL)
+ {
+ ADDCHAR('*');
+ ADDCHAR('/');
+ }
+ }
+ if (*commentcnvYYtext=='\n') g_lineNr++;
+ BEGIN(g_condCtx);
+ }
+ YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 725 "commentcnv.l"
+{ // expand alias without arguments
+ replaceAliases(commentcnvYYtext);
+ }
+ YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 728 "commentcnv.l"
+{ // expand alias with arguments
+ g_lastBlockContext=YY_START;
+ g_blockCount=1;
+ g_aliasString=commentcnvYYtext;
+ g_lastEscaped=0;
+ BEGIN( ReadAliasArgs );
+ }
+ YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 735 "commentcnv.l"
+{ // skip leading special comments (see bug 618079)
+ }
+ YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 737 "commentcnv.l"
+{
+ g_aliasString+=commentcnvYYtext;
+ g_lastEscaped=FALSE;
+ }
+ YY_BREAK
+case 70:
+YY_RULE_SETUP
+#line 741 "commentcnv.l"
+{
+ if (g_lastEscaped) g_lastEscaped=FALSE;
+ else g_lastEscaped=TRUE;
+ g_aliasString+=commentcnvYYtext;
+ }
+ YY_BREAK
+case 71:
+/* rule 71 can match eol */
+YY_RULE_SETUP
+#line 746 "commentcnv.l"
+{
+ g_aliasString+=commentcnvYYtext;
+ g_lineNr++;
+ g_lastEscaped=FALSE;
+ }
+ YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 751 "commentcnv.l"
+{
+ g_aliasString+=commentcnvYYtext;
+ if (!g_lastEscaped) g_blockCount++;
+ g_lastEscaped=FALSE;
+ }
+ YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 756 "commentcnv.l"
+{
+ g_aliasString+=commentcnvYYtext;
+ if (!g_lastEscaped) g_blockCount--;
+ if (g_blockCount==0)
+ {
+ replaceAliases(g_aliasString);
+ BEGIN( g_lastBlockContext );
+ }
+ g_lastEscaped=FALSE;
+ }
+ YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 766 "commentcnv.l"
+{
+ g_aliasString+=commentcnvYYtext;
+ g_lastEscaped=FALSE;
+ }
+ YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 770 "commentcnv.l"
+{
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 774 "commentcnv.l"
+ECHO;
+ YY_BREAK
+#line 2339 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(Scan):
+ case YY_STATE_EOF(SkipString):
+ case YY_STATE_EOF(SkipChar):
+ case YY_STATE_EOF(SComment):
+ case YY_STATE_EOF(CComment):
+ case YY_STATE_EOF(Verbatim):
+ case YY_STATE_EOF(VerbatimCode):
+ case YY_STATE_EOF(ReadLine):
+ case YY_STATE_EOF(CondLine):
+ case YY_STATE_EOF(ReadAliasArgs):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed commentcnvYYin at a new source and called
+ * commentcnvYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = commentcnvYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( commentcnvYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * commentcnvYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of commentcnvYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ commentcnvYYrestart(commentcnvYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) commentcnvYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 329 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 329 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 328);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up commentcnvYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ commentcnvYYrestart(commentcnvYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( commentcnvYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve commentcnvYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void commentcnvYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ commentcnvYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ commentcnvYY_create_buffer(commentcnvYYin,YY_BUF_SIZE );
+ }
+
+ commentcnvYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ commentcnvYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void commentcnvYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * commentcnvYYpop_buffer_state();
+ * commentcnvYYpush_buffer_state(new_buffer);
+ */
+ commentcnvYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ commentcnvYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (commentcnvYYwrap()) processing, but the only time this flag
+ * is looked at is after commentcnvYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void commentcnvYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ commentcnvYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE commentcnvYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) commentcnvYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in commentcnvYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) commentcnvYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in commentcnvYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ commentcnvYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with commentcnvYY_create_buffer()
+ *
+ */
+ void commentcnvYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ commentcnvYYfree((void *) b->yy_ch_buf );
+
+ commentcnvYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a commentcnvYYrestart() or at EOF.
+ */
+ static void commentcnvYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ commentcnvYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then commentcnvYY_init_buffer was _probably_
+ * called from commentcnvYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void commentcnvYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ commentcnvYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void commentcnvYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ commentcnvYYensure_buffer_stack();
+
+ /* This block is copied from commentcnvYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from commentcnvYY_switch_to_buffer. */
+ commentcnvYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void commentcnvYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ commentcnvYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ commentcnvYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void commentcnvYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)commentcnvYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in commentcnvYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)commentcnvYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in commentcnvYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE commentcnvYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) commentcnvYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in commentcnvYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ commentcnvYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to commentcnvYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * commentcnvYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE commentcnvYY_scan_string (yyconst char * yystr )
+{
+
+ return commentcnvYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to commentcnvYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE commentcnvYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) commentcnvYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in commentcnvYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = commentcnvYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in commentcnvYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up commentcnvYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ commentcnvYYtext[commentcnvYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = commentcnvYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ commentcnvYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int commentcnvYYget_lineno (void)
+{
+
+ return commentcnvYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *commentcnvYYget_in (void)
+{
+ return commentcnvYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *commentcnvYYget_out (void)
+{
+ return commentcnvYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t commentcnvYYget_leng (void)
+{
+ return commentcnvYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *commentcnvYYget_text (void)
+{
+ return commentcnvYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void commentcnvYYset_lineno (int line_number )
+{
+
+ commentcnvYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see commentcnvYY_switch_to_buffer
+ */
+void commentcnvYYset_in (FILE * in_str )
+{
+ commentcnvYYin = in_str ;
+}
+
+void commentcnvYYset_out (FILE * out_str )
+{
+ commentcnvYYout = out_str ;
+}
+
+int commentcnvYYget_debug (void)
+{
+ return commentcnvYY_flex_debug;
+}
+
+void commentcnvYYset_debug (int bdebug )
+{
+ commentcnvYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from commentcnvYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ commentcnvYYin = stdin;
+ commentcnvYYout = stdout;
+#else
+ commentcnvYYin = (FILE *) 0;
+ commentcnvYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * commentcnvYYlex_init()
+ */
+ return 0;
+}
+
+/* commentcnvYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int commentcnvYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ commentcnvYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ commentcnvYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ commentcnvYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ commentcnvYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * commentcnvYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *commentcnvYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *commentcnvYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void commentcnvYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see commentcnvYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 774 "commentcnv.l"
+
+
+
+void replaceComment(int offset)
+{
+ if (g_mlBrief)
+ {
+ copyToOutput(commentcnvYYtext,commentcnvYYleng);
+ }
+ else
+ {
+ //printf("replaceComment(%s)\n",commentcnvYYtext);
+ int i=computeIndent(&commentcnvYYtext[offset]);
+ if (i==g_blockHeadCol)
+ {
+ replaceCommentMarker(commentcnvYYtext,commentcnvYYleng);
+ }
+ else
+ {
+ copyToOutput(" */",3);
+ int i;for (i=commentcnvYYleng-1;i>=0;i--) unput(commentcnvYYtext[i]);
+ g_inSpecialComment=FALSE;
+ BEGIN(Scan);
+ }
+ }
+}
+
+/*! This function does three things:
+ * -# It converts multi-line C++ style comment blocks (that are aligned)
+ * to C style comment blocks (if MULTILINE_CPP_IS_BRIEF is set to NO).
+ * -# It replaces aliases with their definition (see ALIASES)
+ * -# It handles conditional sections (cond...endcond blocks)
+ */
+void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
+{
+ //printf("convertCppComments(%s)\n",fileName);
+ g_inBuf = inBuf;
+ g_outBuf = outBuf;
+ g_inBufPos = 0;
+ g_col = 0;
+ g_mlBrief = Config_getBool("MULTILINE_CPP_IS_BRIEF");
+ g_skip = FALSE;
+ g_fileName = fileName;
+ g_lang = getLanguageFromFileName(fileName);
+ g_pythonDocString = FALSE;
+ g_lineNr = 1;
+ g_condStack.clear();
+ g_condStack.setAutoDelete(TRUE);
+ BEGIN(Scan);
+ commentcnvYYlex();
+ while (!g_condStack.isEmpty())
+ {
+ CondCtx *ctx = g_condStack.pop();
+ QCString sectionInfo = " ";
+ if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label %s ",ctx->sectionId.data());
+ warn(g_fileName,ctx->lineNr,"Conditional section%sdoes not have "
+ "a corresponding \\endcond command within this file.",sectionInfo.data());
+ }
+ if (Debug::isFlagSet(Debug::CommentCnv))
+ {
+ g_outBuf->at(g_outBuf->curPos())='\0';
+ msg("-------------\n%s\n-------------\n",g_outBuf->data());
+ }
+}
+
+
+//----------------------------------------------------------------------------
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void commentcnvYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
+
diff --git a/src/commentcnv.h b/src/commentcnv.h
new file mode 100644
index 0000000..974aba1
--- /dev/null
+++ b/src/commentcnv.h
@@ -0,0 +1,27 @@
+/*****************************************************************************
+ *
+ * $Id: commentcnv.l,v 1.80 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _COMMENTCNV_H
+#define _COMMNETCNV_H
+
+class BufStr;
+
+extern void convertCppComments(BufStr *inBuf,BufStr *outBuf,
+ const char *fileName);
+
+#endif
+
diff --git a/src/commentcnv.l b/src/commentcnv.l
new file mode 100644
index 0000000..2ae0cc8
--- /dev/null
+++ b/src/commentcnv.l
@@ -0,0 +1,845 @@
+/*****************************************************************************
+ *
+ * $Id: commentcnv.l,v 1.80 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+
+#define YY_NEVER_INTERACTIVE 1
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <qstack.h>
+#include <qregexp.h>
+#include <qtextstream.h>
+#include <qglobal.h>
+
+#include "bufstr.h"
+#include "debug.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+
+#include <assert.h>
+
+#define ADDCHAR(c) g_outBuf->addChar(c)
+#define ADDARRAY(a,s) g_outBuf->addArray(a,s)
+
+struct CondCtx
+{
+ CondCtx(int line,QCString id,bool b)
+ : lineNr(line),sectionId(id), skip(b) {}
+ int lineNr;
+ QCString sectionId;
+ bool skip;
+};
+
+static BufStr * g_inBuf;
+static BufStr * g_outBuf;
+static int g_inBufPos;
+static int g_col;
+static int g_blockHeadCol;
+static bool g_mlBrief;
+static int g_readLineCtx;
+static bool g_skip;
+static QCString g_fileName;
+static int g_lineNr;
+static int g_condCtx;
+static QStack<CondCtx> g_condStack;
+static QCString g_blockName;
+static int g_lastCommentContext;
+static bool g_inSpecialComment;
+static bool g_inRoseComment;
+static int g_javaBlock;
+static bool g_specialComment;
+
+static QCString g_aliasString;
+static int g_blockCount;
+static bool g_lastEscaped;
+static int g_lastBlockContext;
+static bool g_pythonDocString;
+
+
+static SrcLangExt g_lang;
+
+static void replaceCommentMarker(const char *s,int len)
+{
+ const char *p=s;
+ char c;
+ // copy blanks
+ while ((c=*p) && (c==' ' || c=='\t' || c=='\n'))
+ {
+ ADDCHAR(c);
+ g_lineNr += c=='\n';
+ p++;
+ }
+ // replace start of comment marker by spaces
+ while ((c=*p) && (c=='/' || c=='!' || c=='#'))
+ {
+ ADDCHAR(' ');
+ p++;
+ if (*p=='<') // comment-after-item marker
+ {
+ ADDCHAR(' ');
+ p++;
+ }
+ if (c=='!') // end after first !
+ {
+ break;
+ }
+ }
+ // copy comment line to output
+ ADDARRAY(p,len-(p-s));
+}
+
+static inline int computeIndent(const char *s)
+{
+ int col=0;
+ static int tabSize=Config_getInt("TAB_SIZE");
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ if (c==' ') col++;
+ else if (c=='\t') col+=tabSize-(col%tabSize);
+ else break;
+ }
+ return col;
+}
+
+static inline void copyToOutput(const char *s,int len)
+{
+ int i;
+ if (g_skip) // only add newlines.
+ {
+ for (i=0;i<len;i++)
+ {
+ if (s[i]=='\n')
+ {
+ ADDCHAR('\n');
+ //fprintf(stderr,"---> skip %d\n",g_lineNr);
+ g_lineNr++;
+ }
+ }
+ }
+ else if (len>0)
+ {
+ ADDARRAY(s,len);
+ static int tabSize=Config_getInt("TAB_SIZE");
+ for (i=0;i<len;i++)
+ {
+ switch (s[i])
+ {
+ case '\n': g_col=0;
+ //fprintf(stderr,"---> copy %d\n",g_lineNr);
+ g_lineNr++; break;
+ case '\t': g_col+=tabSize-(g_col%tabSize); break;
+ default: g_col++; break;
+ }
+ }
+ }
+}
+
+static void startCondSection(const char *sectId)
+{
+ g_condStack.push(new CondCtx(g_lineNr,sectId,g_skip));
+ if (Config_getList("ENABLED_SECTIONS").find(sectId)!=-1)
+ {
+ //printf("*** Section is enabled!\n");
+ }
+ else
+ {
+ //printf("*** Section is disabled!\n");
+ g_skip=TRUE;
+ }
+}
+
+static void endCondSection()
+{
+ if (g_condStack.isEmpty())
+ {
+ warn(g_fileName,g_lineNr,"Found \\endcond command without matching \\cond");
+ g_skip=FALSE;
+ }
+ else
+ {
+ CondCtx *ctx = g_condStack.pop();
+ g_skip=ctx->skip;
+ }
+}
+
+#if 0
+/** remove and executes cond and endcond commands in \a s */
+static QCString handleCondCmdInAliases(const QCString &s)
+{
+ QCString result;
+ //printf("handleCondCmdInAliases(%s)\n",s.data());
+ static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*");
+ int p=0,i,l;
+ while ((i=cmdPat.match(s,p,&l))!=-1)
+ {
+ result+=s.mid(p,i-p);
+ QCString cmd = s.mid(i+1,l-1);
+ //printf("Found command %s\n",cmd.data());
+ if (cmd=="cond")
+ {
+ int sp=i+l,ep;
+ const char *arg=s.data()+sp;
+ char c;
+ // skip spaces
+ while ((c=*arg) && (c==' ' || c=='\t')) arg++,sp++;
+ // read argument
+ if (*arg=='\n') // no arg
+ {
+ startCondSection(" ");
+ ep=sp;
+ }
+ else // get argument
+ {
+ ep=sp;
+ while ((c=*arg) && isId(c)) arg++,ep++;
+ if (ep>sp)
+ {
+ QCString id = s.mid(sp,ep-sp);
+ //printf("Found conditional section id %s\n",id.data());
+ startCondSection(id);
+ }
+ else // invalid identifier
+ {
+ }
+ }
+ p=ep;
+ }
+ else if (cmd=="endcond")
+ {
+ endCondSection();
+ p=i+l;
+ }
+ else
+ {
+ result+=s.mid(i,l);
+ p=i+l;
+ }
+ }
+ result+=s.right(s.length()-p);
+ return result;
+}
+#endif
+
+/** copies string \a s with length \a len to the output, while
+ * replacing any alias commands found in the string.
+ */
+static void replaceAliases(const char *s)
+{
+ QCString result = resolveAliasCmd(s);
+ //printf("replaceAliases(%s)->'%s'\n",s,result.data());
+ copyToOutput(result,result.length());
+}
+
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int bytesInBuf = g_inBuf->curPos()-g_inBufPos;
+ int bytesToCopy = QMIN(max_size,bytesInBuf);
+ memcpy(buf,g_inBuf->data()+g_inBufPos,bytesToCopy);
+ g_inBufPos+=bytesToCopy;
+ return bytesToCopy;
+}
+
+void replaceComment(int offset);
+
+%}
+
+%option noyywrap
+
+%x Scan
+%x SkipString
+%x SkipChar
+%x SComment
+%x CComment
+%x Verbatim
+%x VerbatimCode
+%x ReadLine
+%x CondLine
+%x ReadAliasArgs
+
+%%
+
+<Scan>[^"'!\/\n\\#\\-]* { /* eat anything that is not " / or \n */
+ copyToOutput(yytext,yyleng);
+ }
+<Scan>"\"\"\""! { /* start of python long comment */
+ if (g_lang!=SrcLangExt_Python)
+ {
+ REJECT;
+ }
+ else
+ {
+ g_pythonDocString = TRUE;
+ copyToOutput(yytext,yyleng);
+ BEGIN(CComment);
+ }
+ }
+<Scan>"!>" {
+ if (g_lang!=SrcLangExt_F90)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yytext,yyleng);
+ BEGIN(CComment);
+ }
+ }
+<Scan>"\"" { /* start of a string */
+ copyToOutput(yytext,yyleng);
+ BEGIN(SkipString);
+ }
+<Scan>' {
+ copyToOutput(yytext,yyleng);
+ BEGIN(SkipChar);
+ }
+<Scan>\n { /* new line */
+ copyToOutput(yytext,yyleng);
+ }
+<Scan>("//!"|"///").*/\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */
+ if (g_mlBrief)
+ {
+ REJECT; // bail out if we do not need to convert
+ }
+ else
+ {
+ int i=3;
+ if (yytext[2]=='/')
+ {
+ while (i<(int)yyleng && yytext[i]=='/') i++;
+ }
+ g_blockHeadCol=g_col;
+ copyToOutput("/**",3);
+ replaceAliases(yytext+i);
+ g_inSpecialComment=TRUE;
+ BEGIN(SComment);
+ }
+ }
+<Scan>"//##Documentation".*/\n { /* Start of Rational Rose ANSI C++ comment block */
+ if (g_mlBrief) REJECT;
+ int i=17; //=strlen("//##Documentation");
+ g_blockHeadCol=g_col;
+ copyToOutput("/**",3);
+ replaceAliases(yytext+i);
+ g_inRoseComment=TRUE;
+ BEGIN(SComment);
+ }
+<Scan>"//"/.*\n { /* one line C++ comment */
+ copyToOutput(yytext,yyleng);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+<Scan>"/*"[*!]? { /* start of a C comment */
+ g_specialComment=yyleng==3;
+ copyToOutput(yytext,yyleng);
+ BEGIN(CComment);
+ }
+<Scan>"#"("#")? {
+ if (g_lang!=SrcLangExt_Python)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yytext,yyleng);
+ BEGIN(CComment);
+ }
+ }
+<Scan>"--!" {
+ if (g_lang!=SrcLangExt_VHDL)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yytext,yyleng);
+ BEGIN(CComment);
+ }
+ }
+<Scan>"!>" {
+ if (g_lang!=SrcLangExt_F90)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yytext,yyleng);
+ BEGIN(CComment);
+ }
+ }
+<CComment>"{@code"/[ \t\n] {
+ copyToOutput("@code",5);
+ g_lastCommentContext = YY_START;
+ g_javaBlock=1;
+ g_blockName=&yytext[1];
+ BEGIN(VerbatimCode);
+ }
+<CComment,ReadLine>[\\@]("dot"|"code"|"msc")/[^a-z_A-Z0-9] { /* start of a verbatim block */
+ copyToOutput(yytext,yyleng);
+ g_lastCommentContext = YY_START;
+ g_javaBlock=0;
+ g_blockName=&yytext[1];
+ BEGIN(VerbatimCode);
+ }
+<CComment,ReadLine>[\\@]("f$"|"f["|"f{"[a-z]*) {
+ copyToOutput(yytext,yyleng);
+ g_blockName=&yytext[1];
+ if (g_blockName.at(1)=='[')
+ {
+ g_blockName.at(1)=']';
+ }
+ else if (g_blockName.at(1)=='{')
+ {
+ g_blockName.at(1)='}';
+ }
+ g_lastCommentContext = YY_START;
+ BEGIN(Verbatim);
+ }
+<CComment,ReadLine>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly")/[^a-z_A-Z0-9] { /* start of a verbatim block */
+ copyToOutput(yytext,yyleng);
+ g_blockName=&yytext[1];
+ g_lastCommentContext = YY_START;
+ BEGIN(Verbatim);
+ }
+<Scan>. { /* any other character */
+ copyToOutput(yytext,yyleng);
+ }
+<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"f$"|"f]"|"f}") { /* end of verbatim block */
+ copyToOutput(yytext,yyleng);
+ if (yytext[1]=='f') // end of formula
+ {
+ BEGIN(g_lastCommentContext);
+ }
+ else if (&yytext[4]==g_blockName)
+ {
+ BEGIN(g_lastCommentContext);
+ }
+ }
+<VerbatimCode>"{" {
+ if (g_javaBlock==0)
+ {
+ REJECT;
+ }
+ else
+ {
+ g_javaBlock++;
+ copyToOutput(yytext,yyleng);
+ }
+ }
+<VerbatimCode>"}" {
+ if (g_javaBlock==0)
+ {
+ REJECT;
+ }
+ else
+ {
+ g_javaBlock--;
+ if (g_javaBlock==0)
+ {
+ copyToOutput(" @endcode ",10);
+ BEGIN(g_lastCommentContext);
+ }
+ else
+ {
+ copyToOutput(yytext,yyleng);
+ }
+ }
+ }
+<VerbatimCode>[\\@]("enddot"|"endcode"|"endmsc") { /* end of verbatim block */
+ copyToOutput(yytext,yyleng);
+ if (&yytext[4]==g_blockName)
+ {
+ BEGIN(g_lastCommentContext);
+ }
+ }
+<VerbatimCode>^[ \t]*"//"[\!\/]? { /* skip leading comments */
+ if (!g_inSpecialComment)
+ {
+ copyToOutput(yytext,yyleng);
+ }
+ }
+<Verbatim,VerbatimCode>[^@\/\\\n{}]* { /* any character not a backslash or new line or } */
+ copyToOutput(yytext,yyleng);
+ }
+<Verbatim,VerbatimCode>\n { /* new line in verbatim block */
+ copyToOutput(yytext,yyleng);
+ }
+<Verbatim,VerbatimCode>^[ \t]*"///" {
+ if (g_blockName=="dot" || g_blockName=="msc" || g_blockName.at(0)=='f')
+ {
+ // see bug 487871, strip /// from dot images and formulas.
+ copyToOutput(" ",3);
+ }
+ else // even slashes are verbatim (e.g. \verbatim, \code)
+ {
+ REJECT;
+ }
+ }
+<Verbatim,VerbatimCode>. { /* any other character */
+ copyToOutput(yytext,yyleng);
+ }
+<SkipString>\\. { /* escaped character in string */
+ copyToOutput(yytext,yyleng);
+ }
+<SkipString>"\"" { /* end of string */
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+<SkipString>. { /* any other string character */
+ copyToOutput(yytext,yyleng);
+ }
+<SkipString>\n { /* new line inside string (illegal for some compilers) */
+ copyToOutput(yytext,yyleng);
+ }
+<SkipChar>\\. { /* escaped character */
+ copyToOutput(yytext,yyleng);
+ }
+<SkipChar>' { /* end of character literal */
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+<SkipChar>. { /* any other string character */
+ copyToOutput(yytext,yyleng);
+ }
+<SkipChar>\n { /* new line character */
+ copyToOutput(yytext,yyleng);
+ }
+
+<CComment>[^\\!@*\n{]* { /* anything that is not a '*' or command */
+ copyToOutput(yytext,yyleng);
+ }
+<CComment>"*"+[^*/\\@\n]* { /* stars without slashes */
+ copyToOutput(yytext,yyleng);
+ }
+<CComment>"\"\"\"" { /* end of Python docstring */
+ if (g_lang!=SrcLangExt_Python)
+ {
+ REJECT;
+ }
+ else
+ {
+ g_pythonDocString = FALSE;
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+ }
+<CComment>\n { /* new line in comment */
+ copyToOutput(yytext,yyleng);
+ }
+<CComment>"*"+"/" { /* end of C comment */
+ if (g_lang==SrcLangExt_Python)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+ }
+<CComment>"\n"/[ \t]*[^#] { /* end of Python comment */
+ if (g_lang!=SrcLangExt_Python || g_pythonDocString)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+ }
+<CComment>"\n"/[ \t]*[^\-] { /* end of VHDL comment */
+ if (g_lang!=SrcLangExt_VHDL)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+ }
+<CComment>"\n"/[ \t]*[^!] { /* end of Fortran comment */
+ if (g_lang!=SrcLangExt_F90)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yytext,yyleng);
+ BEGIN(Scan);
+ }
+ }
+<CComment>. {
+ copyToOutput(yytext,yyleng);
+ }
+<SComment>^[ \t]*"///"[\/]*/\n {
+ replaceComment(0);
+ }
+<SComment>\n[ \t]*"///"[\/]*/\n {
+ replaceComment(1);
+ }
+<SComment>^[ \t]*"///"[^\/\n]/.*\n {
+ replaceComment(0);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+<SComment>\n[ \t]*"///"[^\/\n]/.*\n {
+ replaceComment(1);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+<SComment>^[ \t]*"//!" | // just //!
+<SComment>^[ \t]*"//!<"/.*\n | // or //!< something
+<SComment>^[ \t]*"//!"[^<]/.*\n { // or //!something
+ replaceComment(0);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+<SComment>\n[ \t]*"//!" |
+<SComment>\n[ \t]*"//!<"/.*\n |
+<SComment>\n[ \t]*"//!"[^<\n]/.*\n {
+ replaceComment(1);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+<SComment>^[ \t]*"//##"/.*\n {
+ if (!g_inRoseComment)
+ {
+ REJECT;
+ }
+ else
+ {
+ replaceComment(0);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+ }
+<SComment>\n[ \t]*"//##"/.*\n {
+ if (!g_inRoseComment)
+ {
+ REJECT;
+ }
+ else
+ {
+ replaceComment(1);
+ g_readLineCtx=YY_START;
+ BEGIN(ReadLine);
+ }
+ }
+<SComment>\n { /* end of special comment */
+ copyToOutput(" */",3);
+ copyToOutput(yytext,yyleng);
+ g_inSpecialComment=FALSE;
+ g_inRoseComment=FALSE;
+ BEGIN(Scan);
+ }
+<ReadLine>[^\\@\n]*/\n {
+ copyToOutput(yytext,yyleng);
+ BEGIN(g_readLineCtx);
+ }
+<CComment,ReadLine>[\\@][\\@][~a-z_A-Z][a-z_A-Z0-9]*[ \t]* { // escaped command
+ copyToOutput(yytext,yyleng);
+ }
+<CComment,ReadLine>[\\@]"cond"[ \t]+ { // conditional section
+ g_condCtx = YY_START;
+ BEGIN(CondLine);
+ }
+<CComment,ReadLine>[\\@]"endcond"/[^a-z_A-Z0-9] { // end of conditional section
+ bool oldSkip=g_skip;
+ endCondSection();
+ if (YY_START==CComment && oldSkip && !g_skip)
+ {
+ //printf("** Adding start of comment!\n");
+ if (g_lang!=SrcLangExt_Python &&
+ g_lang!=SrcLangExt_VHDL &&
+ g_lang!=SrcLangExt_F90)
+ {
+ ADDCHAR('/');
+ ADDCHAR('*');
+ if (g_specialComment)
+ {
+ ADDCHAR('*');
+ }
+ }
+ }
+ }
+<CondLine>[a-z_A-Z][a-z_A-Z0-9.\-]* {
+ bool oldSkip=g_skip;
+ startCondSection(yytext);
+ if (g_condCtx==CComment && !oldSkip && g_skip)
+ {
+ //printf("** Adding terminator for comment!\n");
+ if (g_lang!=SrcLangExt_Python &&
+ g_lang!=SrcLangExt_VHDL &&
+ g_lang!=SrcLangExt_F90)
+ {
+ ADDCHAR('*');
+ ADDCHAR('/');
+ }
+ }
+ BEGIN(g_condCtx);
+ }
+<CondLine>[ \t]*
+<CComment,ReadLine>[\\@]"cond"[ \t\r]*/\n |
+<CondLine>. { // forgot section id?
+ if (YY_START!=CondLine) g_condCtx=YY_START;
+ bool oldSkip=g_skip;
+ startCondSection(" "); // fake section id causing the section to be hidden unconditionally
+ if (g_condCtx==CComment && !oldSkip && g_skip)
+ {
+ //printf("** Adding terminator for comment!\n");
+ if (g_lang!=SrcLangExt_Python &&
+ g_lang!=SrcLangExt_VHDL)
+ {
+ ADDCHAR('*');
+ ADDCHAR('/');
+ }
+ }
+ if (*yytext=='\n') g_lineNr++;
+ BEGIN(g_condCtx);
+ }
+<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]* { // expand alias without arguments
+ replaceAliases(yytext);
+ }
+<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]*"{" { // expand alias with arguments
+ g_lastBlockContext=YY_START;
+ g_blockCount=1;
+ g_aliasString=yytext;
+ g_lastEscaped=0;
+ BEGIN( ReadAliasArgs );
+ }
+<ReadAliasArgs>^[ \t]*"//"[/!]/[^\n]+ { // skip leading special comments (see bug 618079)
+ }
+<ReadAliasArgs>[^{}\n\\\*]+ {
+ g_aliasString+=yytext;
+ g_lastEscaped=FALSE;
+ }
+<ReadAliasArgs>"\\" {
+ if (g_lastEscaped) g_lastEscaped=FALSE;
+ else g_lastEscaped=TRUE;
+ g_aliasString+=yytext;
+ }
+<ReadAliasArgs>\n {
+ g_aliasString+=yytext;
+ g_lineNr++;
+ g_lastEscaped=FALSE;
+ }
+<ReadAliasArgs>"{" {
+ g_aliasString+=yytext;
+ if (!g_lastEscaped) g_blockCount++;
+ g_lastEscaped=FALSE;
+ }
+<ReadAliasArgs>"}" {
+ g_aliasString+=yytext;
+ if (!g_lastEscaped) g_blockCount--;
+ if (g_blockCount==0)
+ {
+ replaceAliases(g_aliasString);
+ BEGIN( g_lastBlockContext );
+ }
+ g_lastEscaped=FALSE;
+ }
+<ReadAliasArgs>. {
+ g_aliasString+=yytext;
+ g_lastEscaped=FALSE;
+ }
+<ReadLine>. {
+ copyToOutput(yytext,yyleng);
+ }
+
+%%
+
+void replaceComment(int offset)
+{
+ if (g_mlBrief)
+ {
+ copyToOutput(yytext,yyleng);
+ }
+ else
+ {
+ //printf("replaceComment(%s)\n",yytext);
+ int i=computeIndent(&yytext[offset]);
+ if (i==g_blockHeadCol)
+ {
+ replaceCommentMarker(yytext,yyleng);
+ }
+ else
+ {
+ copyToOutput(" */",3);
+ int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]);
+ g_inSpecialComment=FALSE;
+ BEGIN(Scan);
+ }
+ }
+}
+
+/*! This function does three things:
+ * -# It converts multi-line C++ style comment blocks (that are aligned)
+ * to C style comment blocks (if MULTILINE_CPP_IS_BRIEF is set to NO).
+ * -# It replaces aliases with their definition (see ALIASES)
+ * -# It handles conditional sections (cond...endcond blocks)
+ */
+void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
+{
+ //printf("convertCppComments(%s)\n",fileName);
+ g_inBuf = inBuf;
+ g_outBuf = outBuf;
+ g_inBufPos = 0;
+ g_col = 0;
+ g_mlBrief = Config_getBool("MULTILINE_CPP_IS_BRIEF");
+ g_skip = FALSE;
+ g_fileName = fileName;
+ g_lang = getLanguageFromFileName(fileName);
+ g_pythonDocString = FALSE;
+ g_lineNr = 1;
+ g_condStack.clear();
+ g_condStack.setAutoDelete(TRUE);
+ BEGIN(Scan);
+ yylex();
+ while (!g_condStack.isEmpty())
+ {
+ CondCtx *ctx = g_condStack.pop();
+ QCString sectionInfo = " ";
+ if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label %s ",ctx->sectionId.data());
+ warn(g_fileName,ctx->lineNr,"Conditional section%sdoes not have "
+ "a corresponding \\endcond command within this file.",sectionInfo.data());
+ }
+ if (Debug::isFlagSet(Debug::CommentCnv))
+ {
+ g_outBuf->at(g_outBuf->curPos())='\0';
+ msg("-------------\n%s\n-------------\n",g_outBuf->data());
+ }
+}
+
+
+//----------------------------------------------------------------------------
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void commentcnvYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
diff --git a/src/commentscan.cpp b/src/commentscan.cpp
new file mode 100644
index 0000000..f21c0a8
--- /dev/null
+++ b/src/commentscan.cpp
@@ -0,0 +1,7471 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer commentScanYY_create_buffer
+#define yy_delete_buffer commentScanYY_delete_buffer
+#define yy_flex_debug commentScanYY_flex_debug
+#define yy_init_buffer commentScanYY_init_buffer
+#define yy_flush_buffer commentScanYY_flush_buffer
+#define yy_load_buffer_state commentScanYY_load_buffer_state
+#define yy_switch_to_buffer commentScanYY_switch_to_buffer
+#define yyin commentScanYYin
+#define yyleng commentScanYYleng
+#define yylex commentScanYYlex
+#define yylineno commentScanYYlineno
+#define yyout commentScanYYout
+#define yyrestart commentScanYYrestart
+#define yytext commentScanYYtext
+#define yywrap commentScanYYwrap
+#define yyalloc commentScanYYalloc
+#define yyrealloc commentScanYYrealloc
+#define yyfree commentScanYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE commentScanYYrestart(commentScanYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t commentScanYYleng;
+
+extern FILE *commentScanYYin, *commentScanYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up commentScanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via commentScanYYrestart()), so that the user can continue scanning by
+ * just pointing commentScanYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when commentScanYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t commentScanYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow commentScanYYwrap()'s to do buffer switches
+ * instead of setting up a fresh commentScanYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void commentScanYYrestart (FILE *input_file );
+void commentScanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE commentScanYY_create_buffer (FILE *file,int size );
+void commentScanYY_delete_buffer (YY_BUFFER_STATE b );
+void commentScanYY_flush_buffer (YY_BUFFER_STATE b );
+void commentScanYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void commentScanYYpop_buffer_state (void );
+
+static void commentScanYYensure_buffer_stack (void );
+static void commentScanYY_load_buffer_state (void );
+static void commentScanYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER commentScanYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE commentScanYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE commentScanYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE commentScanYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *commentScanYYalloc (yy_size_t );
+void *commentScanYYrealloc (void *,yy_size_t );
+void commentScanYYfree (void * );
+
+#define yy_new_buffer commentScanYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ commentScanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ commentScanYY_create_buffer(commentScanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ commentScanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ commentScanYY_create_buffer(commentScanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define commentScanYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *commentScanYYin = (FILE *) 0, *commentScanYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int commentScanYYlineno;
+
+int commentScanYYlineno = 1;
+
+extern char *commentScanYYtext;
+#define yytext_ptr commentScanYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up commentScanYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ commentScanYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 180
+#define YY_END_OF_BUFFER 181
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[743] =
+ { 0,
+ 66, 66, 110, 110, 123, 123, 133, 133, 177, 177,
+ 181, 180, 34, 180, 34, 180, 33, 180, 34, 180,
+ 34, 180, 34, 180, 32, 34, 180, 34, 180, 34,
+ 180, 23, 34, 180, 34, 180, 34, 180, 25, 34,
+ 180, 32, 34, 180, 79, 180, 78, 180, 79, 180,
+ 76, 79, 180, 79, 180, 79, 180, 180, 80, 180,
+ 100, 180, 99, 180, 100, 180, 97, 100, 180, 100,
+ 180, 61, 180, 61, 180, 60, 180, 61, 180, 61,
+ 180, 61, 180, 57, 61, 180, 61, 180, 61, 180,
+ 65, 180, 64, 180, 65, 180, 62, 65, 180, 65,
+
+ 180, 65, 180, 65, 180, 69, 180, 68, 180, 69,
+ 180, 66, 69, 180, 69, 180, 66, 69, 180, 66,
+ 69, 180, 69, 180, 61, 180, 60, 180, 61, 180,
+ 61, 180, 61, 180, 61, 180, 61, 180, 88, 180,
+ 87, 180, 85, 88, 180, 88, 180, 92, 180, 91,
+ 180, 92, 180, 92, 180, 96, 180, 95, 180, 96,
+ 180, 96, 180, 84, 180, 81, 180, 84, 180, 82,
+ 84, 180, 84, 180, 84, 180, 48, 180, 47, 180,
+ 48, 180, 45, 48, 180, 48, 180, 52, 180, 52,
+ 180, 51, 180, 52, 180, 52, 180, 52, 180, 49,
+
+ 52, 180, 52, 180, 52, 180, 56, 180, 55, 180,
+ 56, 180, 53, 56, 180, 56, 180, 72, 180, 70,
+ 180, 180, 74, 180, 75, 180, 180, 106, 180, 105,
+ 180, 104, 106, 180, 106, 180, 110, 113, 180, 107,
+ 180, 110, 113, 180, 113, 180, 113, 180, 115, 180,
+ 114, 180, 180, 118, 180, 118, 180, 116, 180, 118,
+ 180, 118, 180, 123, 127, 180, 124, 180, 127, 180,
+ 127, 180, 127, 180, 127, 180, 127, 180, 103, 180,
+ 101, 180, 103, 180, 131, 180, 129, 180, 128, 131,
+ 180, 131, 180, 134, 180, 133, 134, 180, 132, 180,
+
+ 134, 180, 141, 142, 180, 140, 180, 142, 180, 142,
+ 180, 142, 180, 152, 153, 180, 143, 180, 153, 180,
+ 153, 180, 153, 180, 156, 180, 154, 180, 156, 180,
+ 160, 180, 158, 180, 157, 160, 180, 160, 180, 163,
+ 166, 180, 161, 180, 164, 166, 180, 165, 166, 180,
+ 166, 180, 166, 180, 169, 180, 167, 180, 169, 180,
+ 172, 180, 171, 180, 172, 180, 170, 172, 180, 172,
+ 180, 175, 180, 174, 180, 175, 180, 173, 175, 180,
+ 175, 180, 42, 44, 180, 43, 180, 44, 180, 44,
+ 180, 121, 180, 120, 180, 119, 121, 180, 121, 180,
+
+ 37, 38, 180, 36, 180, 38, 180, 38, 180, 177,
+ 179, 180, 178, 180, 179, 180, 179, 180, 179, 180,
+ 31, 4, 26, 28, 26, 22, 22, 14, 22, 14,
+ 14, 14, 14, 14, 14, 20, 21, 16, 22, 23,
+ 14, 14, 14, 14, 14, 14, 14, 14, 25, 24,
+ 76, 76, 77, 76, 80, 97, 97, 98, 57, 57,
+ 59, 57, 62, 62, 63, 62, 66, 66, 66, 67,
+ 66, 85, 86, 89, 90, 94, 93, 94, 82, 82,
+ 83, 82, 45, 45, 45, 46, 49, 49, 50, 49,
+ 53, 53, 54, 70, 71, 74, 73, 104, 110, 107,
+
+ 110, 112, 112, 109, 114, 117, 123, 126, 125, 102,
+ 128, 130, 133, 132, 141, 152, 155, 157, 159, 163,
+ 162, 168, 170, 170, 173, 173, 42, 119, 37, 177,
+ 176, 22, 30, 26, 30, 30, 30, 26, 30, 30,
+ 27, 7, 1, 1, 2, 14, 14, 14, 14, 18,
+ 19, 14, 14, 14, 16, 5, 14, 14, 14, 14,
+ 14, 14, 14, 76, 76, 57, 62, 62, 66, 66,
+ 82, 82, 45, 45, 45, 45, 49, 53, 111, 39,
+ 40, 41, 35, 176, 30, 30, 12, 1, 15, 2,
+ 8198, 14,16390, 14, 14, 14, 14, 14, 14, 8198,
+
+ 14,16390, 14, 14, 14, 14, 14, 76, 62, 66,
+ 58, 82, 45, 45, 45, 53, 111, 136, 144, 35,
+ 11, 29, 8198, 8198, 14, 14, 14, 17, 14, 14,
+ 5, 8198, 14, 14, 14, 76, 62, 66, 82, 3,
+ 14, 14, 17, 14, 14, 14, 14, 14, 76, 62,
+ 66, 82, 70, 138, 146, 14, 14, 14, 14, 14,
+ 14, 14, 76, 62, 66, 82, 137, 135, 145, 14,
+ 14, 14, 14, 14, 14, 14, 76, 78, 99, 60,
+ 62, 64, 66, 68, 87, 91, 95, 81, 82, 47,
+ 51, 55, 72, 75, 105, 108, 115, 116, 122, 124,
+
+ 101, 129, 139, 140, 143, 154, 158, 161, 167, 171,
+ 174, 120, 36, 178, 9, 8, 14, 14, 14, 5,
+ 14, 14, 147, 10, 14, 14, 14, 14, 14, 14,
+ 150, 13, 14, 13, 14, 151, 148, 13, 14, 151,
+ 149, 31
+ } ;
+
+static yyconst flex_int16_t yy_accept[1055] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 4,
+ 5, 5, 5, 5, 5, 6, 7, 7, 7, 7,
+ 7, 8, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 10, 11, 12,
+ 13, 15, 17, 19, 21, 23, 25, 28, 30, 32,
+ 35, 37, 39, 42, 45, 47, 49, 51, 54, 56,
+
+ 58, 59, 61, 63, 65, 67, 70, 72, 74, 76,
+ 78, 80, 82, 84, 87, 89, 91, 93, 95, 97,
+ 100, 102, 104, 106, 108, 110, 112, 115, 117, 120,
+ 123, 125, 127, 129, 131, 133, 135, 137, 139, 141,
+ 143, 146, 148, 150, 152, 154, 156, 158, 160, 162,
+ 164, 166, 168, 170, 173, 175, 177, 179, 181, 183,
+ 186, 188, 190, 192, 194, 196, 198, 200, 203, 205,
+ 207, 209, 211, 213, 216, 218, 220, 222, 223, 225,
+ 227, 228, 230, 232, 235, 237, 240, 242, 245, 247,
+ 249, 251, 253, 254, 256, 258, 260, 262, 264, 267,
+
+ 269, 271, 273, 275, 277, 279, 281, 283, 285, 287,
+ 289, 292, 294, 296, 299, 301, 303, 306, 308, 310,
+ 312, 314, 317, 319, 321, 323, 325, 327, 329, 331,
+ 333, 335, 338, 340, 343, 345, 348, 351, 353, 355,
+ 357, 359, 361, 363, 365, 367, 370, 372, 374, 376,
+ 378, 381, 383, 386, 388, 390, 392, 394, 396, 399,
+ 401, 404, 406, 408, 410, 413, 415, 417, 419, 421,
+ 421, 421, 421, 421, 422, 422, 422, 423, 423, 423,
+ 423, 423, 424, 425, 425, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426, 427, 428,
+
+ 429, 430, 431, 432, 433, 434, 435, 436, 437, 438,
+ 440, 441, 442, 443, 444, 445, 446, 447, 448, 449,
+ 449, 450, 450, 450, 451, 451, 452, 453, 453, 453,
+ 453, 454, 455, 455, 456, 457, 457, 458, 458, 458,
+ 459, 459, 459, 459, 459, 459, 460, 460, 460, 461,
+ 461, 462, 462, 462, 462, 463, 463, 464, 465, 465,
+ 465, 465, 466, 467, 467, 468, 469, 469, 469, 470,
+ 470, 470, 471, 472, 472, 472, 472, 472, 472, 472,
+ 472, 472, 472, 472, 472, 472, 472, 473, 473, 474,
+ 474, 474, 475, 475, 477, 477, 477, 478, 478, 479,
+
+ 479, 479, 480, 481, 481, 481, 481, 482, 483, 484,
+ 484, 484, 485, 485, 486, 486, 487, 487, 487, 487,
+ 487, 487, 488, 488, 488, 489, 489, 490, 490, 490,
+ 490, 491, 492, 492, 493, 493, 494, 494, 495, 495,
+ 495, 496, 496, 497, 497, 498, 498, 499, 499, 500,
+ 501, 502, 502, 503, 504, 504, 505, 505, 506, 506,
+ 506, 506, 506, 507, 507, 508, 509, 510, 510, 510,
+ 510, 511, 511, 512, 512, 513, 513, 514, 515, 515,
+ 515, 516, 516, 516, 516, 517, 517, 517, 517, 517,
+ 517, 517, 518, 518, 519, 519, 520, 520, 521, 521,
+
+ 522, 522, 522, 523, 523, 524, 524, 525, 525, 525,
+ 526, 526, 527, 527, 527, 528, 528, 528, 529, 529,
+ 530, 530, 530, 531, 532, 532, 533, 533, 533, 533,
+ 533, 534, 536, 537, 538, 540, 541, 542, 542, 542,
+ 542, 542, 542, 542, 543, 543, 543, 543, 543, 544,
+ 545, 546, 547, 548, 549, 550, 551, 552, 552, 553,
+ 554, 555, 556, 557, 558, 559, 560, 561, 562, 563,
+ 564, 565, 565, 566, 566, 566, 566, 567, 568, 568,
+ 569, 570, 570, 571, 571, 571, 571, 571, 571, 571,
+ 572, 572, 573, 574, 575, 576, 577, 577, 577, 578,
+
+ 578, 579, 579, 579, 579, 579, 579, 579, 580, 580,
+ 580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
+ 580, 580, 580, 580, 580, 580, 580, 580, 580, 580,
+ 580, 580, 580, 580, 580, 581, 582, 583, 583, 583,
+ 584, 584, 585, 585, 585, 585, 585, 585, 586, 587,
+ 588, 588, 588, 588, 588, 588, 588, 588, 589, 590,
+ 591, 594, 595, 596, 596, 597, 598, 599, 599, 600,
+ 603, 604, 605, 606, 607, 608, 609, 609, 609, 610,
+ 611, 612, 612, 612, 612, 613, 613, 614, 615, 616,
+ 616, 616, 617, 617, 617, 617, 617, 617, 618, 618,
+
+ 618, 618, 618, 618, 618, 618, 618, 618, 618, 619,
+ 619, 619, 619, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 621, 621, 621, 621,
+ 622, 622, 622, 623, 623, 623, 623, 623, 623, 624,
+ 626, 627, 628, 629, 630, 631, 633, 634, 635, 636,
+ 637, 637, 637, 638, 639, 639, 639, 639, 640, 640,
+ 640, 640, 640, 640, 640, 640, 640, 640, 640, 640,
+ 640, 640, 640, 640, 640, 640, 640, 640, 640, 640,
+ 640, 640, 640, 640, 640, 640, 640, 640, 640, 640,
+ 640, 640, 640, 640, 640, 640, 640, 640, 640, 640,
+
+ 640, 640, 641, 641, 641, 641, 641, 642, 643, 644,
+ 645, 646, 647, 648, 649, 650, 650, 650, 651, 652,
+ 652, 652, 652, 653, 653, 653, 653, 653, 653, 654,
+ 654, 654, 654, 654, 654, 654, 654, 654, 654, 654,
+ 654, 654, 654, 654, 654, 654, 654, 654, 654, 655,
+ 655, 655, 655, 655, 656, 656, 656, 656, 656, 656,
+ 656, 656, 656, 656, 656, 656, 656, 656, 656, 656,
+ 656, 656, 656, 656, 656, 656, 657, 658, 659, 660,
+ 661, 662, 663, 664, 664, 664, 665, 666, 666, 666,
+ 666, 667, 667, 667, 667, 667, 667, 667, 667, 667,
+
+ 667, 667, 667, 667, 667, 667, 667, 667, 667, 667,
+ 667, 667, 667, 667, 668, 669, 669, 669, 670, 670,
+ 670, 670, 670, 670, 670, 670, 670, 670, 670, 670,
+ 670, 670, 670, 670, 670, 670, 670, 670, 671, 672,
+ 673, 674, 675, 676, 677, 679, 680, 681, 683, 685,
+ 686, 687, 688, 690, 691, 692, 693, 694, 695, 696,
+ 697, 698, 699, 700, 700, 700, 700, 700, 700, 700,
+ 701, 702, 703, 704, 705, 705, 705, 705, 705, 705,
+ 706, 707, 708, 709, 710, 711, 712, 713, 714, 715,
+ 715, 715, 716, 717, 718, 719, 720, 721, 722, 723,
+
+ 723, 723, 723, 723, 723, 723, 723, 723, 724, 724,
+ 724, 725, 726, 727, 727, 728, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 730, 730, 731,
+ 731, 731, 731, 731, 732, 732, 732, 734, 734, 736,
+ 736, 737, 738, 738, 740, 740, 741, 741, 741, 741,
+ 741, 742, 743, 743
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 5, 6, 7, 8, 9, 8, 8, 1, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 19,
+ 19, 19, 19, 19, 18, 18, 18, 20, 1, 21,
+ 1, 22, 1, 23, 24, 25, 26, 27, 28, 26,
+ 29, 30, 31, 26, 26, 32, 33, 26, 34, 35,
+ 26, 36, 26, 37, 38, 26, 26, 26, 26, 26,
+ 39, 40, 41, 1, 42, 1, 43, 44, 45, 46,
+
+ 47, 48, 49, 50, 51, 26, 52, 53, 54, 55,
+ 56, 57, 26, 58, 59, 60, 61, 62, 26, 63,
+ 64, 26, 65, 1, 66, 67, 1, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68
+ } ;
+
+static yyconst flex_int32_t yy_meta[69] =
+ { 0,
+ 1, 2, 3, 4, 5, 1, 1, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 16, 17,
+ 6, 18, 19, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 1, 21,
+ 1, 22, 20, 20, 20, 20, 20, 20, 20, 20,
+ 23, 20, 20, 20, 24, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 6, 25, 26, 27
+ } ;
+
+static yyconst flex_int16_t yy_base[1259] =
+ { 0,
+ 0, 0, 0, 67, 83, 150, 4487, 4481, 217, 0,
+ 285, 0, 353, 420, 487, 554, 621, 0, 689, 0,
+ 67, 68, 70, 73, 757, 824, 891, 0, 959, 0,
+ 1027, 0, 1095, 0, 99, 106, 1163, 0, 162, 165,
+ 1231, 0, 123, 129, 374, 393, 75, 76, 1299, 0,
+ 135, 139, 173, 377, 441, 442, 93, 95, 1367, 0,
+ 460, 502, 140, 142, 1435, 0, 1503, 0, 412, 435,
+ 499, 508, 1571, 0, 363, 368, 511, 566, 4483, 7500,
+ 7500, 527, 399, 4470, 4442, 4401, 568, 1634, 1688, 185,
+ 1748, 770, 4374, 846, 7500, 7500, 4386, 167, 433, 797,
+
+ 4389, 7500, 7500, 7500, 0, 101, 464, 7500, 190, 452,
+ 785, 1639, 4368, 583, 474, 515, 7500, 7500, 4379, 775,
+ 838, 4363, 1684, 7500, 7500, 4377, 1630, 1659, 1698, 7500,
+ 1742, 868, 1763, 1771, 1796, 4362, 1815, 607, 7500, 7500,
+ 0, 538, 7500, 7500, 4374, 779, 7500, 7500, 4371, 801,
+ 7500, 7500, 4370, 1637, 1723, 1824, 7500, 7500, 0, 1849,
+ 1747, 7500, 1845, 1868, 1873, 1892, 4353, 1900, 1801, 872,
+ 7500, 7500, 0, 4355, 1857, 7500, 4354, 1904, 0, 7500,
+ 1908, 7500, 7500, 0, 4327, 369, 7500, 4328, 1909, 1975,
+ 7500, 0, 4325, 7500, 207, 7500, 4359, 4323, 0, 7500,
+
+ 7500, 4347, 4351, 4315, 72, 7500, 7500, 1919, 7500, 7500,
+ 0, 1923, 7500, 533, 7500, 4319, 0, 7500, 7500, 337,
+ 348, 0, 7500, 7500, 545, 1666, 7500, 7500, 1931, 7500,
+ 7500, 0, 1939, 0, 7500, 7500, 7500, 7500, 1949, 7500,
+ 7500, 1953, 7500, 7500, 0, 369, 4318, 7500, 7500, 0,
+ 391, 4316, 0, 7500, 4304, 4303, 7500, 7500, 0, 4305,
+ 0, 7500, 4330, 4302, 0, 7500, 7500, 4274, 144, 1805,
+ 2035, 2095, 1834, 1961, 4297, 4331, 7500, 0, 4317, 4313,
+ 0, 7500, 7500, 2162, 4312, 446, 4318, 354, 565, 1630,
+ 833, 1630, 1966, 77, 1650, 4285, 4264, 7500, 320, 2229,
+
+ 4254, 4258, 4271, 4261, 803, 474, 4257, 7500, 7500, 0,
+ 1990, 1658, 1967, 1985, 1987, 2009, 2014, 2030, 2026, 2036,
+ 7500, 542, 612, 7500, 4306, 7500, 2020, 1702, 2045, 806,
+ 7500, 2052, 4309, 7500, 458, 4302, 464, 4290, 877, 7500,
+ 4256, 2091, 2120, 4288, 2128, 2188, 2110, 2216, 2194, 1728,
+ 7500, 4253, 2147, 2237, 0, 4293, 7500, 2195, 2070, 2227,
+ 1819, 7500, 2237, 4292, 4271, 2239, 2169, 2246, 7500, 4279,
+ 1878, 7500, 2258, 2268, 2297, 4240, 2305, 2324, 2328, 2343,
+ 2351, 0, 2371, 2375, 2390, 1776, 0, 2045, 7500, 4203,
+ 4248, 7500, 2086, 7500, 4196, 4241, 7500, 2136, 7500, 4189,
+
+ 4209, 7500, 2265, 2272, 2299, 2152, 7500, 2349, 2402, 2410,
+ 0, 2414, 4192, 2422, 2162, 7500, 4158, 2433, 2441, 4187,
+ 2460, 2468, 2487, 2495, 2514, 2221, 7500, 4152, 2519, 2533,
+ 0, 4188, 4194, 4186, 2333, 7500, 4148, 4184, 4149, 2355,
+ 7500, 4145, 0, 2380, 7500, 4144, 0, 4143, 1790, 7500,
+ 4155, 4152, 7500, 4183, 2395, 7500, 4133, 0, 4132, 1885,
+ 4174, 4172, 7500, 4125, 0, 7500, 7500, 4120, 4120, 2449,
+ 7500, 4119, 0, 2453, 7500, 4118, 2472, 7500, 4128, 4116,
+ 0, 74, 4120, 4114, 0, 4111, 4111, 4112, 806, 4100,
+ 2476, 7500, 4099, 0, 2480, 7500, 4097, 0, 2500, 7500,
+
+ 4096, 2504, 7500, 4094, 517, 4137, 585, 4125, 4091, 800,
+ 4134, 1658, 4122, 4087, 0, 4125, 1661, 0, 4080, 0,
+ 175, 4076, 0, 0, 4074, 4078, 4070, 4100, 0, 4103,
+ 7500, 7500, 4092, 2562, 4062, 4068, 7500, 4063, 4030, 4010,
+ 1977, 1692, 2076, 7500, 1795, 1854, 3991, 3979, 544, 1965,
+ 0, 1933, 2024, 1943, 2508, 7500, 7500, 0, 2069, 2541,
+ 2016, 0, 0, 2546, 2550, 2524, 2548, 2555, 2591, 2602,
+ 2592, 2599, 2601, 0, 3981, 3980, 0, 2606, 2618, 2627,
+ 2634, 2643, 2653, 4019, 2539, 2643, 3978, 3977, 3976, 2660,
+ 2665, 2670, 2693, 2713, 2721, 2733, 3975, 3974, 0, 0,
+
+ 4008, 3967, 3955, 3963, 3961, 3958, 0, 0, 3947, 3946,
+ 3945, 3949, 3943, 3939, 3929, 3928, 3918, 3926, 3912, 3913,
+ 3917, 1955, 3903, 3913, 3911, 3903, 3899, 3897, 3896, 3893,
+ 0, 3892, 0, 3887, 7500, 7500, 7500, 3860, 3291, 2104,
+ 3256, 0, 3254, 1707, 3253, 3294, 0, 2732, 2211, 7500,
+ 3241, 3238, 3268, 2243, 1802, 3245, 3232, 2318, 7500, 0,
+ 2755, 2608, 2554, 3218, 2631, 2822, 2659, 3241, 2824, 2879,
+ 2863, 2823, 2864, 2870, 2666, 2815, 3225, 3219, 2821, 2895,
+ 7500, 3215, 3199, 3198, 2911, 0, 2840, 2934, 2953, 3186,
+ 3180, 3202, 3162, 3155, 3150, 3145, 3143, 0, 3139, 3127,
+
+ 3107, 2914, 3106, 3100, 3099, 3098, 3100, 3095, 7500, 3089,
+ 3086, 3081, 7500, 3070, 3072, 3048, 3048, 3048, 3044, 3043,
+ 3034, 3019, 3018, 3014, 3013, 2556, 3009, 2968, 2959, 7500,
+ 2980, 2967, 7500, 2942, 2925, 1872, 2912, 2922, 0, 2587,
+ 2687, 2851, 2898, 2920, 2979, 3026, 3010, 3015, 3011, 2971,
+ 2914, 2902, 3036, 3055, 2901, 2895, 2894, 3064, 2990, 2893,
+ 2887, 2876, 2861, 2861, 2860, 2824, 2820, 2815, 2810, 2796,
+ 2792, 2786, 2797, 1718, 2774, 2707, 2696, 2697, 2680, 2673,
+ 2672, 2658, 2660, 2643, 2654, 552, 2639, 2645, 2637, 1785,
+ 2637, 2632, 2625, 2615, 2610, 2608, 2593, 2578, 2577, 2573,
+
+ 2564, 2590, 2542, 2555, 2539, 2522, 2828, 2845, 7500, 2849,
+ 3019, 3056, 3077, 3083, 3070, 2523, 2521, 3089, 3096, 2503,
+ 2501, 2496, 3104, 3147, 3155, 2495, 2489, 2488, 7500, 2487,
+ 2481, 2476, 2470, 2457, 2451, 2448, 2433, 2433, 2426, 2413,
+ 2422, 2418, 2402, 2406, 2404, 2403, 2395, 2385, 7500, 2380,
+ 0, 0, 2365, 7500, 2348, 2726, 2345, 2345, 2351, 2346,
+ 2344, 2342, 2326, 2324, 2318, 2307, 2306, 2305, 2299, 2298,
+ 2297, 2272, 2264, 2259, 2240, 2834, 2927, 2928, 3020, 3095,
+ 3123, 3129, 3161, 2245, 2239, 3163, 3168, 2235, 2233, 2229,
+ 3175, 2218, 2206, 2202, 2200, 2191, 2175, 2164, 2159, 2149,
+
+ 2159, 0, 2152, 2153, 2138, 2132, 2137, 2124, 2101, 2100,
+ 2095, 2089, 0, 7500, 7500, 2088, 2098, 7500, 2091, 2072,
+ 2066, 2062, 2062, 2050, 2041, 2039, 2022, 2009, 1997, 1987,
+ 1981, 1975, 1964, 1953, 1930, 1963, 1953, 3137, 2911, 3000,
+ 3184, 3191, 3197, 3166, 3194, 7500, 7500, 3196, 3222, 7500,
+ 7500, 7500, 3212, 7500, 7500, 7500, 7500, 7500, 7500, 7500,
+ 7500, 7500, 7500, 1906, 1890, 1892, 1888, 1896, 1882, 7500,
+ 7500, 7500, 7500, 7500, 1871, 1858, 2727, 1863, 1844, 7500,
+ 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 7500, 1864,
+ 1863, 7500, 7500, 3125, 3202, 3220, 843, 3225, 3238, 1802,
+
+ 1800, 1780, 1756, 1737, 1732, 1705, 1687, 7500, 1673, 1667,
+ 7500, 3243, 3244, 730, 3245, 3254, 1654, 1618, 1603, 1594,
+ 1605, 1581, 813, 2744, 795, 759, 3256, 767, 3261, 712,
+ 462, 408, 353, 7500, 2984, 148, 2995, 558, 3262, 83,
+ 2996, 7500, 56, 3001, 1946, 3002, 26, 1883, 3117, 532,
+ 7500, 3266, 7500, 3314, 3341, 3368, 3395, 3422, 3449, 3476,
+ 3503, 3530, 3557, 3584, 3611, 3638, 3665, 3692, 3719, 3746,
+ 3773, 3800, 3827, 3854, 3881, 3908, 3929, 3946, 3962, 3981,
+ 3997, 4016, 4042, 4059, 4086, 4094, 4108, 4134, 4160, 4186,
+ 4213, 4230, 4257, 4274, 4300, 4326, 4352, 4367, 4394, 4421,
+
+ 4448, 4465, 4473, 4499, 4525, 4551, 4577, 4585, 4599, 4614,
+ 4641, 4656, 4683, 4710, 4725, 4752, 4779, 4794, 4821, 4848,
+ 4863, 4890, 4898, 4912, 4920, 4934, 4961, 4976, 5003, 5030,
+ 5052, 5078, 5086, 5098, 5115, 5127, 5151, 5159, 3253, 5175,
+ 5198, 5222, 5239, 5256, 5283, 5297, 5318, 5344, 5370, 5396,
+ 5408, 5435, 5452, 5469, 5496, 5513, 5530, 5556, 5582, 5608,
+ 5635, 5661, 5676, 5703, 5730, 5757, 5774, 5791, 5817, 5825,
+ 5851, 5877, 5903, 5929, 5941, 5955, 5976, 5991, 6018, 6033,
+ 6060, 6087, 6108, 6123, 6150, 6177, 6192, 6219, 6246, 6261,
+ 6288, 6302, 6323, 6337, 6358, 6385, 6400, 6427, 6454, 3259,
+
+ 6466, 6493, 6508, 6522, 6546, 6573, 6599, 3276, 6622, 6646,
+ 3288, 3917, 6672, 6686, 6703, 6711, 6723, 6740, 6757, 6774,
+ 6791, 6818, 6844, 6861, 6878, 6904, 6930, 6956, 6968, 6976,
+ 6990, 6998, 7010, 7037, 7045, 7053, 3922, 7080, 7095, 7111,
+ 7135, 3969, 7161, 7185, 7193, 7216, 7230, 7247, 7264, 7272,
+ 7287, 7311, 7337, 7364, 7391, 7418, 7445, 7472
+ } ;
+
+static yyconst flex_int16_t yy_def[1259] =
+ { 0,
+ 1054, 1054, 1053, 3, 1055, 1055, 1056, 1056, 1053, 9,
+ 1053, 11, 1057, 1057, 1058, 1058, 1053, 17, 1053, 19,
+ 1059, 1059, 1060, 1060, 1061, 1061, 1053, 27, 1053, 29,
+ 1053, 31, 1053, 33, 1062, 1062, 1053, 37, 1063, 1063,
+ 1053, 41, 1064, 1064, 1065, 1065, 1066, 1066, 1053, 49,
+ 1067, 1067, 1068, 1068, 1069, 1069, 1070, 1070, 1053, 59,
+ 1071, 1071, 1072, 1072, 1053, 65, 1053, 67, 1073, 1073,
+ 1073, 1073, 1053, 73, 1074, 1074, 1075, 1075, 1053, 1053,
+ 1053, 1053, 1053, 1076, 1077, 1078, 1079, 1053, 1080, 1081,
+ 1082, 1053, 1078, 1079, 1053, 1053, 1083, 1084, 1084, 1084,
+
+ 1085, 1053, 1053, 1053, 1086, 1087, 1053, 1053, 1053, 1053,
+ 1088, 1088, 1053, 1089, 1053, 1090, 1053, 1053, 1091, 1092,
+ 1092, 1053, 1092, 1053, 1053, 1093, 1094, 1094, 1094, 1053,
+ 1094, 1053, 1053, 1095, 1095, 1053, 1096, 1097, 1053, 1053,
+ 1098, 1053, 1053, 1053, 1099, 1053, 1053, 1053, 1100, 1053,
+ 1053, 1053, 1101, 1102, 1102, 1102, 1053, 1053, 1103, 1104,
+ 1053, 1053, 1053, 1053, 1105, 1105, 1053, 1106, 1053, 1107,
+ 1053, 1053, 1108, 1109, 1053, 1053, 1110, 1053, 1111, 1053,
+ 1053, 1053, 1053, 1112, 1053, 1113, 1053, 1114, 1053, 1053,
+ 1053, 1115, 1053, 1053, 1053, 1053, 1116, 1053, 1117, 1053,
+
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1118, 1053, 1053, 1053, 1053, 1053, 1119, 1053, 1053, 1053,
+ 1053, 1120, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1121, 1053, 1122, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1123, 1124, 1053, 1053, 1053, 1125,
+ 1126, 1053, 1127, 1053, 1053, 1053, 1053, 1053, 1128, 1053,
+ 1129, 1053, 1053, 1053, 1130, 1053, 1053, 1053, 1053, 1053,
+ 1131, 1131, 1053, 1053, 1053, 1132, 1053, 1133, 1134, 1135,
+ 1136, 1053, 1053, 1137, 1135, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1138, 1131,
+
+ 1138, 300, 300, 300, 300, 300, 300, 1053, 1053, 1139,
+ 1140, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1053,
+ 1053, 1053, 1053, 1053, 1142, 1053, 1143, 1144, 1143, 1053,
+ 1053, 1143, 1145, 1053, 1146, 1147, 1146, 1053, 1053, 1053,
+ 1053, 1053, 1148, 1053, 1148, 1149, 1150, 1148, 1149, 1053,
+ 1053, 1053, 1150, 1150, 1151, 1152, 1053, 1153, 1154, 1153,
+ 1053, 1053, 1153, 1155, 1053, 1156, 1157, 1156, 1053, 1155,
+ 1053, 1053, 1156, 1053, 1158, 1053, 1158, 1159, 1160, 1158,
+ 1053, 1161, 1159, 1160, 1160, 1162, 1163, 1053, 1053, 1053,
+ 1164, 1053, 1053, 1053, 1053, 1165, 1053, 1053, 1053, 1053,
+
+ 1166, 1053, 1167, 1168, 1167, 1053, 1053, 1167, 1169, 1053,
+ 1170, 1169, 1053, 1171, 1053, 1053, 1053, 1053, 1172, 1053,
+ 1172, 1173, 1174, 1172, 1173, 1053, 1053, 1053, 1174, 1174,
+ 1175, 1176, 1177, 1176, 1053, 1053, 1053, 1178, 1053, 1053,
+ 1053, 1053, 1179, 1053, 1053, 1053, 1180, 1053, 1181, 1053,
+ 1182, 1053, 1053, 1183, 1053, 1053, 1053, 1184, 1053, 1053,
+ 1185, 1185, 1053, 1053, 1186, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1187, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1188, 1053, 1053, 1053, 1189, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1190, 1053, 1053, 1053, 1191, 1053, 1053,
+
+ 1053, 1053, 1053, 1053, 1192, 1193, 1192, 1053, 1053, 1194,
+ 1195, 1194, 1053, 1053, 1196, 1053, 1053, 1197, 1053, 1198,
+ 1053, 1053, 1199, 1200, 1053, 1053, 1053, 1201, 1202, 1203,
+ 1053, 1053, 1204, 1205, 1204, 1203, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1206, 1053, 1053, 1053, 1053, 1053, 1207, 1207,
+ 1208, 1053, 1209, 1209, 1209, 1053, 1053, 1210, 1209, 1209,
+ 1209, 1211, 1212, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1214, 1214, 1215, 1216, 1053, 1053, 1217, 1218, 1218, 1219,
+ 1220, 1220, 1221, 1222, 1053, 1223, 1053, 1053, 1053, 1224,
+ 1224, 1225, 1226, 1227, 1228, 1228, 1053, 1053, 1229, 1230,
+
+ 1231, 1053, 1053, 1053, 1053, 1053, 1232, 1233, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1234, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1235, 1053, 1236, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1237, 1053, 1053, 1053, 1238, 1239, 1240, 1053, 1053,
+ 1053, 1053, 1241, 1241, 1053, 1053, 1053, 1053, 1053, 1242,
+ 1053, 1243, 1243, 1244, 1243, 1243, 1243, 1245, 1246, 1246,
+ 1246, 1246, 1246, 1246, 1246, 1247, 1053, 1053, 1248, 1249,
+ 1053, 1053, 1053, 1053, 1225, 1250, 1226, 1226, 1227, 1053,
+ 1053, 1231, 1053, 1053, 1053, 1053, 1053, 1233, 1053, 1053,
+
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1251, 1240, 1053, 1053, 1053, 1053, 1053, 1053, 1252, 1252,
+ 1243, 1243, 1053, 1243, 1246, 1245, 1246, 1246, 1246, 1247,
+ 1053, 1053, 1248, 1249, 1053, 1053, 1053, 1225, 1253, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1254, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+
+ 1053, 1251, 1053, 1053, 1053, 1053, 1243, 1243, 1053, 1243,
+ 1246, 1246, 1246, 1246, 1247, 1053, 1053, 1248, 1249, 1053,
+ 1053, 1053, 1225, 1253, 1253, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1255, 1256, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1243, 1243, 1243, 1246, 1246,
+ 1246, 1246, 1247, 1053, 1053, 1248, 1249, 1053, 1053, 1053,
+ 1225, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+
+ 1053, 1257, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1258, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1243, 1243, 1243,
+ 1246, 1246, 1246, 1246, 1247, 1053, 1053, 1248, 1249, 1053,
+ 1053, 1053, 1225, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1243, 1243, 1053, 1245, 1246, 1246, 1053,
+
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1243, 1243, 1245, 1246, 1246, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1243, 1245, 1246, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1243, 1245, 1246, 1053,
+ 1053, 1053, 1053, 1053, 1245, 1053, 1053, 1245, 1053, 1245,
+ 1053, 1245, 0, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053
+ } ;
+
+static yyconst flex_int16_t yy_nxt[7569] =
+ { 0,
+ 81, 82, 83, 81, 82, 81, 84, 81, 85, 81,
+ 81, 81, 86, 81, 86, 87, 81, 86, 86, 81,
+ 88, 81, 89, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 81, 91,
+ 81, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 81, 81, 81, 81, 92, 144,
+ 144, 92, 148, 145, 145, 148, 149, 207, 207, 149,
+ 1049, 93, 94, 95, 95, 96, 95, 95, 95, 97,
+ 95, 95, 95, 95, 95, 228, 95, 228, 95, 99,
+
+ 546, 180, 99, 95, 95, 95, 146, 146, 180, 150,
+ 80, 1047, 150, 469, 208, 208, 336, 80, 468, 546,
+ 338, 95, 100, 95, 195, 196, 617, 195, 618, 197,
+ 195, 196, 229, 195, 229, 197, 214, 215, 181, 214,
+ 214, 215, 241, 214, 241, 181, 902, 95, 95, 95,
+ 95, 95, 96, 95, 95, 95, 97, 95, 95, 95,
+ 95, 95, 198, 95, 187, 95, 99, 187, 198, 99,
+ 95, 95, 95, 188, 216, 218, 188, 219, 216, 242,
+ 639, 242, 328, 329, 189, 525, 329, 189, 95, 100,
+ 95, 342, 342, 342, 342, 220, 640, 280, 1043, 280,
+
+ 280, 190, 280, 280, 190, 343, 329, 281, 460, 344,
+ 524, 460, 221, 461, 95, 95, 95, 103, 103, 104,
+ 103, 103, 103, 103, 103, 105, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 106, 106, 106, 106, 103, 107, 103, 106, 106,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 103, 103, 103, 106, 108, 109, 110, 109, 109,
+ 108, 108, 108, 111, 108, 108, 108, 108, 108, 108,
+
+ 112, 108, 108, 108, 113, 108, 108, 108, 114, 114,
+ 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+ 114, 114, 114, 108, 115, 108, 114, 114, 114, 114,
+ 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+ 114, 114, 114, 114, 114, 114, 114, 114, 114, 108,
+ 108, 116, 114, 117, 117, 118, 117, 117, 117, 119,
+ 117, 117, 117, 117, 117, 262, 117, 550, 117, 121,
+ 262, 450, 121, 122, 117, 117, 200, 263, 201, 218,
+ 451, 219, 263, 482, 506, 202, 551, 483, 508, 484,
+ 203, 117, 123, 117, 482, 200, 204, 201, 483, 220,
+
+ 273, 274, 264, 273, 202, 1041, 511, 264, 452, 203,
+ 513, 539, 540, 205, 254, 204, 221, 117, 117, 117,
+ 117, 117, 118, 117, 117, 117, 119, 117, 117, 117,
+ 117, 117, 205, 117, 255, 117, 121, 254, 275, 121,
+ 122, 117, 117, 223, 223, 224, 224, 537, 1053, 329,
+ 537, 255, 329, 342, 342, 342, 342, 255, 117, 123,
+ 117, 902, 235, 225, 225, 339, 340, 343, 339, 236,
+ 237, 344, 329, 336, 255, 350, 351, 338, 350, 336,
+ 226, 226, 238, 338, 117, 117, 117, 124, 124, 125,
+ 124, 124, 124, 126, 124, 124, 124, 124, 124, 239,
+
+ 124, 254, 124, 128, 235, 341, 128, 129, 130, 124,
+ 254, 236, 237, 266, 1040, 352, 353, 353, 353, 353,
+ 559, 256, 267, 354, 238, 124, 131, 124, 270, 560,
+ 256, 270, 506, 268, 477, 478, 508, 477, 256, 388,
+ 389, 239, 388, 323, 324, 658, 323, 256, 658, 271,
+ 269, 124, 124, 124, 124, 124, 125, 124, 124, 124,
+ 126, 124, 124, 124, 124, 124, 272, 124, 266, 124,
+ 128, 563, 479, 128, 129, 130, 124, 267, 282, 390,
+ 280, 283, 280, 284, 342, 342, 342, 342, 268, 1052,
+ 281, 486, 124, 131, 124, 487, 541, 563, 343, 854,
+
+ 506, 488, 344, 489, 508, 269, 855, 286, 384, 384,
+ 384, 384, 1045, 323, 324, 385, 323, 541, 124, 124,
+ 124, 108, 132, 133, 132, 132, 108, 108, 108, 134,
+ 108, 108, 108, 108, 108, 108, 135, 108, 108, 108,
+ 136, 108, 108, 108, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 108,
+ 115, 108, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 108, 108, 138, 137, 139,
+ 139, 140, 139, 139, 139, 139, 139, 139, 139, 139,
+
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 139, 142, 139,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 139, 139, 139, 141, 151, 151, 152,
+ 151, 151, 151, 153, 151, 151, 151, 151, 151, 563,
+ 151, 320, 151, 155, 320, 902, 155, 151, 151, 151,
+ 393, 394, 1028, 393, 321, 322, 342, 342, 342, 342,
+ 359, 360, 271, 345, 360, 151, 156, 151, 330, 331,
+
+ 343, 330, 398, 399, 344, 398, 563, 330, 331, 272,
+ 330, 556, 1053, 329, 360, 511, 329, 1038, 1036, 513,
+ 395, 151, 151, 151, 151, 151, 152, 151, 151, 151,
+ 153, 151, 151, 151, 151, 151, 329, 151, 332, 151,
+ 155, 557, 400, 155, 151, 151, 151, 323, 324, 1035,
+ 323, 347, 624, 1053, 360, 1033, 282, 360, 280, 283,
+ 280, 284, 151, 156, 151, 542, 625, 558, 281, 374,
+ 374, 374, 374, 429, 429, 429, 429, 360, 339, 340,
+ 430, 339, 1053, 375, 1014, 286, 542, 376, 151, 151,
+ 151, 157, 157, 158, 157, 157, 157, 157, 157, 159,
+
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 160, 160, 160, 160, 160, 160,
+ 160, 160, 160, 160, 160, 160, 160, 160, 160, 157,
+ 161, 157, 160, 160, 160, 160, 160, 160, 160, 160,
+ 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+ 160, 160, 160, 160, 160, 157, 157, 157, 160, 162,
+ 163, 164, 163, 163, 162, 162, 162, 165, 162, 162,
+ 162, 162, 162, 162, 166, 162, 162, 162, 167, 162,
+ 162, 162, 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 162, 169, 162,
+
+ 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 162, 162, 170, 168, 171, 171, 172,
+ 171, 171, 171, 171, 171, 173, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 171, 175, 171, 174, 174,
+ 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
+ 174, 171, 171, 171, 174, 80, 80, 176, 80, 80,
+
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+ 177, 177, 177, 80, 178, 80, 177, 177, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 177, 177, 80,
+ 80, 80, 177, 182, 182, 183, 182, 182, 182, 182,
+ 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+ 182, 182, 182, 182, 182, 182, 184, 184, 184, 184,
+ 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+
+ 184, 182, 185, 182, 184, 184, 184, 184, 184, 184,
+ 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+ 184, 184, 184, 184, 184, 184, 184, 182, 182, 182,
+ 184, 80, 80, 191, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 80,
+ 193, 80, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 80, 80, 80, 192, 209,
+
+ 209, 210, 209, 209, 209, 209, 209, 209, 209, 209,
+ 209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
+ 209, 209, 211, 211, 211, 211, 211, 211, 211, 211,
+ 211, 211, 211, 211, 211, 211, 211, 209, 212, 209,
+ 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+ 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+ 211, 211, 211, 209, 209, 209, 211, 230, 230, 231,
+ 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+
+ 232, 232, 232, 232, 232, 230, 233, 230, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 230, 230, 230, 232, 243, 243, 244, 243, 243,
+ 243, 243, 243, 245, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243, 246, 246,
+ 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+ 246, 246, 246, 243, 247, 243, 246, 246, 246, 246,
+ 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+ 246, 246, 246, 246, 246, 246, 246, 246, 246, 243,
+
+ 243, 243, 246, 248, 248, 249, 248, 248, 248, 248,
+ 248, 250, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 251, 251, 251, 251,
+ 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+ 251, 248, 252, 248, 251, 251, 251, 251, 251, 251,
+ 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+ 251, 251, 251, 251, 251, 251, 251, 248, 248, 248,
+ 251, 257, 257, 258, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 259, 259, 259, 259, 259, 259,
+
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 257,
+ 260, 257, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 257, 257, 257, 259, 287,
+ 348, 348, 348, 348, 902, 367, 368, 345, 541, 368,
+ 288, 369, 404, 405, 343, 1032, 405, 902, 344, 552,
+ 289, 541, 552, 290, 291, 541, 902, 292, 293, 368,
+ 294, 295, 1031, 511, 1053, 368, 405, 513, 368, 289,
+ 1053, 541, 541, 290, 291, 361, 362, 541, 361, 292,
+ 293, 296, 297, 294, 295, 298, 298, 563, 368, 1053,
+
+ 360, 636, 541, 360, 370, 347, 1030, 490, 298, 298,
+ 299, 1026, 486, 1053, 368, 659, 487, 368, 572, 369,
+ 541, 572, 488, 360, 489, 363, 637, 301, 1025, 350,
+ 351, 302, 350, 303, 304, 305, 1024, 368, 1053, 405,
+ 541, 572, 405, 371, 372, 659, 371, 306, 415, 416,
+ 307, 415, 308, 309, 310, 298, 298, 1053, 368, 1023,
+ 840, 368, 405, 1053, 374, 374, 374, 374, 298, 298,
+ 301, 659, 374, 374, 374, 374, 841, 585, 375, 377,
+ 585, 368, 376, 373, 1022, 382, 375, 299, 417, 313,
+ 376, 314, 450, 315, 316, 317, 1021, 380, 380, 380,
+
+ 380, 451, 426, 427, 377, 426, 270, 318, 1020, 270,
+ 319, 375, 308, 309, 310, 376, 381, 374, 374, 381,
+ 361, 362, 541, 361, 382, 406, 407, 271, 406, 452,
+ 375, 859, 1019, 736, 376, 273, 274, 379, 273, 1053,
+ 405, 541, 428, 405, 272, 860, 418, 418, 418, 418,
+ 410, 410, 410, 410, 736, 1018, 1017, 411, 435, 436,
+ 419, 435, 379, 405, 420, 408, 412, 412, 413, 418,
+ 418, 418, 418, 275, 418, 418, 418, 418, 655, 371,
+ 372, 421, 371, 419, 992, 1011, 460, 420, 419, 460,
+ 1010, 461, 420, 424, 424, 424, 424, 655, 437, 541,
+
+ 421, 418, 418, 418, 418, 440, 441, 419, 440, 444,
+ 445, 420, 444, 1009, 1007, 419, 453, 453, 541, 420,
+ 470, 471, 563, 470, 474, 475, 1050, 474, 1006, 453,
+ 453, 454, 491, 492, 552, 491, 1005, 552, 1004, 423,
+ 495, 496, 1003, 495, 552, 442, 1002, 552, 453, 446,
+ 499, 500, 1001, 499, 502, 503, 713, 502, 423, 713,
+ 472, 1000, 273, 274, 476, 273, 658, 543, 552, 658,
+ 543, 552, 493, 659, 993, 453, 455, 456, 543, 455,
+ 497, 543, 453, 453, 992, 563, 552, 544, 552, 552,
+ 501, 552, 1048, 991, 504, 453, 453, 453, 544, 662,
+
+ 275, 545, 280, 659, 280, 280, 563, 280, 280, 714,
+ 552, 990, 281, 552, 454, 552, 457, 552, 552, 564,
+ 552, 274, 556, 545, 563, 552, 563, 552, 552, 659,
+ 552, 552, 989, 566, 552, 328, 329, 320, 988, 329,
+ 320, 453, 298, 298, 987, 565, 388, 389, 563, 388,
+ 321, 322, 557, 563, 986, 298, 298, 526, 271, 329,
+ 1053, 329, 667, 567, 329, 563, 985, 328, 329, 563,
+ 552, 329, 661, 552, 298, 272, 568, 654, 558, 984,
+ 654, 304, 305, 570, 329, 569, 579, 393, 394, 579,
+ 393, 329, 342, 342, 342, 342, 983, 544, 982, 308,
+
+ 309, 310, 298, 298, 573, 726, 343, 981, 726, 579,
+ 344, 353, 353, 353, 353, 298, 298, 298, 354, 980,
+ 979, 348, 348, 348, 348, 978, 977, 665, 345, 1053,
+ 1053, 1053, 1053, 976, 526, 343, 1053, 398, 399, 344,
+ 398, 304, 305, 1053, 975, 974, 478, 1053, 353, 353,
+ 353, 353, 972, 406, 407, 354, 406, 971, 970, 308,
+ 309, 310, 531, 415, 416, 531, 415, 531, 531, 531,
+ 531, 531, 532, 531, 533, 531, 533, 534, 531, 969,
+ 968, 531, 531, 531, 536, 582, 347, 967, 582, 342,
+ 342, 342, 342, 966, 1053, 342, 342, 342, 342, 965,
+
+ 531, 531, 531, 343, 964, 902, 962, 344, 582, 343,
+ 359, 360, 733, 344, 360, 733, 961, 348, 348, 348,
+ 348, 960, 426, 427, 345, 426, 531, 531, 531, 531,
+ 552, 343, 959, 552, 360, 344, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 360, 654, 1053, 360, 654, 958, 1053,
+ 1053, 1053, 359, 360, 367, 368, 360, 957, 368, 956,
+ 369, 1053, 368, 955, 544, 368, 360, 1053, 1053, 374,
+ 374, 374, 374, 367, 368, 954, 360, 368, 368, 369,
+ 404, 405, 347, 375, 405, 368, 952, 376, 591, 580,
+ 951, 591, 950, 1053, 1053, 1053, 947, 368, 380, 380,
+
+ 380, 380, 946, 937, 405, 377, 1053, 1053, 1053, 1053,
+ 583, 591, 375, 1053, 1053, 405, 376, 936, 405, 658,
+ 1053, 935, 658, 934, 1053, 381, 374, 374, 381, 384,
+ 384, 384, 384, 382, 435, 436, 385, 435, 405, 375,
+ 933, 932, 931, 376, 380, 380, 380, 380, 930, 929,
+ 928, 377, 381, 374, 374, 381, 440, 441, 375, 440,
+ 382, 927, 376, 379, 404, 405, 375, 926, 405, 925,
+ 376, 1053, 381, 374, 374, 381, 384, 384, 384, 384,
+ 382, 444, 445, 385, 444, 924, 375, 923, 405, 922,
+ 376, 1053, 1053, 1053, 1053, 921, 455, 456, 1053, 455,
+
+ 920, 592, 919, 410, 410, 410, 410, 917, 916, 379,
+ 411, 410, 410, 410, 410, 410, 410, 410, 410, 412,
+ 412, 413, 411, 410, 410, 410, 410, 913, 912, 413,
+ 411, 412, 412, 413, 418, 418, 418, 418, 911, 595,
+ 595, 413, 424, 424, 424, 424, 910, 909, 419, 421,
+ 470, 471, 420, 470, 474, 475, 419, 474, 908, 907,
+ 420, 1053, 1053, 1053, 1053, 906, 902, 905, 1053, 418,
+ 418, 418, 418, 477, 478, 1053, 477, 491, 492, 1053,
+ 491, 495, 496, 419, 495, 904, 903, 420, 429, 429,
+ 429, 429, 902, 901, 900, 430, 424, 424, 424, 424,
+
+ 899, 499, 500, 421, 499, 502, 503, 423, 502, 552,
+ 419, 479, 552, 898, 420, 418, 418, 418, 418, 897,
+ 429, 429, 429, 429, 896, 552, 1053, 430, 552, 419,
+ 895, 894, 893, 420, 1053, 1053, 1053, 1053, 892, 890,
+ 585, 1053, 552, 585, 889, 552, 888, 552, 382, 552,
+ 552, 552, 552, 663, 552, 552, 552, 726, 552, 552,
+ 726, 423, 531, 563, 885, 531, 884, 531, 531, 531,
+ 531, 531, 532, 531, 533, 531, 533, 648, 531, 875,
+ 671, 531, 531, 531, 536, 563, 666, 563, 740, 563,
+ 874, 740, 552, 672, 563, 552, 669, 873, 670, 872,
+
+ 531, 649, 531, 552, 742, 647, 552, 328, 572, 552,
+ 871, 572, 552, 673, 1053, 572, 328, 329, 572, 870,
+ 329, 359, 579, 869, 868, 579, 531, 531, 531, 531,
+ 563, 572, 552, 1053, 579, 552, 674, 579, 572, 867,
+ 329, 563, 359, 360, 585, 579, 360, 585, 675, 367,
+ 582, 676, 382, 582, 866, 369, 865, 579, 1053, 582,
+ 552, 864, 582, 552, 1053, 741, 360, 552, 367, 368,
+ 552, 863, 368, 582, 369, 404, 591, 679, 862, 591,
+ 1053, 591, 582, 861, 591, 404, 405, 858, 552, 405,
+ 661, 552, 368, 857, 410, 410, 410, 410, 856, 591,
+
+ 853, 686, 852, 680, 591, 563, 744, 851, 850, 405,
+ 687, 687, 413, 749, 689, 689, 689, 689, 848, 847,
+ 685, 411, 410, 410, 410, 410, 846, 918, 1008, 411,
+ 918, 1008, 413, 807, 410, 410, 410, 410, 595, 595,
+ 413, 411, 282, 845, 280, 1034, 280, 732, 1034, 844,
+ 595, 595, 413, 843, 281, 739, 740, 739, 739, 740,
+ 739, 739, 739, 739, 739, 739, 739, 739, 739, 739,
+ 739, 739, 739, 739, 739, 739, 739, 739, 300, 300,
+ 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
+ 300, 300, 300, 739, 739, 739, 300, 300, 300, 300,
+
+ 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
+ 300, 300, 300, 300, 300, 300, 300, 300, 300, 739,
+ 739, 739, 739, 552, 552, 552, 552, 552, 552, 552,
+ 328, 329, 552, 842, 329, 552, 359, 360, 552, 839,
+ 360, 410, 410, 410, 410, 838, 552, 837, 686, 552,
+ 552, 836, 552, 552, 329, 552, 835, 687, 687, 413,
+ 360, 834, 563, 563, 552, 552, 833, 552, 552, 750,
+ 832, 552, 876, 748, 552, 753, 938, 661, 745, 739,
+ 740, 739, 739, 740, 739, 739, 739, 739, 739, 739,
+ 739, 739, 739, 739, 739, 739, 739, 739, 739, 739,
+
+ 739, 739, 563, 563, 877, 808, 831, 830, 878, 563,
+ 367, 368, 552, 829, 368, 552, 369, 739, 746, 739,
+ 747, 552, 828, 670, 552, 670, 404, 405, 552, 552,
+ 405, 552, 552, 827, 368, 410, 410, 410, 410, 826,
+ 822, 821, 686, 739, 739, 739, 739, 820, 817, 754,
+ 405, 687, 687, 413, 689, 689, 689, 689, 770, 771,
+ 816, 411, 809, 772, 806, 758, 773, 774, 995, 805,
+ 810, 775, 413, 939, 940, 776, 777, 282, 804, 280,
+ 552, 280, 732, 552, 803, 1042, 328, 329, 1042, 281,
+ 329, 410, 410, 410, 410, 647, 1044, 1046, 686, 1044,
+
+ 1046, 552, 1044, 1046, 552, 1044, 1046, 824, 824, 413,
+ 329, 552, 552, 801, 552, 552, 552, 815, 563, 552,
+ 552, 552, 800, 552, 552, 811, 739, 739, 739, 739,
+ 739, 739, 739, 739, 739, 739, 739, 739, 739, 739,
+ 739, 739, 739, 739, 739, 739, 739, 739, 739, 563,
+ 563, 359, 360, 661, 563, 360, 812, 552, 563, 563,
+ 552, 814, 879, 799, 739, 739, 739, 798, 797, 813,
+ 367, 368, 796, 795, 368, 360, 369, 941, 552, 404,
+ 405, 552, 818, 405, 552, 328, 329, 552, 794, 329,
+ 739, 739, 739, 739, 368, 563, 552, 793, 792, 552,
+
+ 880, 819, 791, 405, 359, 360, 790, 789, 360, 329,
+ 823, 367, 368, 883, 788, 368, 563, 369, 1051, 404,
+ 405, 1051, 563, 405, 552, 787, 552, 552, 360, 552,
+ 552, 786, 886, 552, 563, 368, 881, 942, 552, 887,
+ 785, 552, 882, 405, 784, 783, 782, 891, 410, 410,
+ 410, 410, 781, 780, 779, 686, 410, 410, 410, 410,
+ 778, 769, 563, 686, 824, 824, 413, 552, 563, 943,
+ 552, 1012, 824, 824, 413, 944, 328, 329, 359, 360,
+ 329, 768, 360, 367, 368, 996, 274, 368, 996, 369,
+ 404, 405, 552, 767, 405, 552, 994, 766, 552, 765,
+
+ 329, 552, 360, 552, 764, 563, 552, 368, 763, 328,
+ 329, 359, 360, 329, 405, 360, 762, 433, 945, 670,
+ 948, 996, 274, 997, 996, 949, 552, 404, 405, 552,
+ 563, 405, 953, 329, 761, 360, 563, 367, 368, 552,
+ 760, 368, 552, 369, 552, 552, 552, 552, 552, 552,
+ 998, 405, 757, 756, 999, 552, 1013, 552, 552, 275,
+ 552, 368, 552, 1044, 563, 552, 1044, 273, 274, 755,
+ 273, 1015, 562, 752, 562, 562, 562, 563, 642, 751,
+ 563, 642, 642, 743, 563, 738, 1027, 737, 661, 544,
+ 670, 735, 1016, 563, 734, 660, 1029, 660, 660, 660,
+
+ 563, 563, 730, 729, 728, 997, 727, 562, 1037, 562,
+ 562, 562, 640, 1039, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 98, 98, 98, 98, 98, 98, 98, 98, 98,
+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
+ 98, 98, 98, 98, 98, 98, 98, 98, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 120, 120, 120, 120, 120,
+
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+
+ 147, 147, 147, 154, 154, 154, 154, 154, 154, 154,
+ 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+ 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
+ 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
+ 179, 179, 179, 179, 179, 179, 179, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 194, 194, 194, 194, 194, 194,
+ 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+
+ 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+ 194, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+ 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+ 199, 199, 199, 199, 199, 199, 199, 199, 206, 206,
+ 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
+ 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
+ 206, 206, 206, 206, 206, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 217, 217, 217, 217, 217, 217, 217, 217,
+
+ 217, 217, 217, 217, 217, 217, 217, 217, 217, 217,
+ 217, 217, 217, 217, 217, 217, 217, 217, 217, 222,
+ 222, 222, 222, 222, 222, 222, 222, 222, 222, 222,
+ 222, 222, 222, 222, 222, 222, 222, 222, 222, 222,
+ 222, 222, 222, 222, 222, 222, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 234, 234, 234, 234, 234, 234, 234,
+ 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+ 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
+ 240, 240, 240, 240, 240, 240, 240, 253, 253, 253,
+ 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+ 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+ 253, 253, 253, 253, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 265, 265, 265, 265, 265, 265, 265, 265, 265,
+ 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
+
+ 265, 265, 265, 265, 265, 265, 265, 265, 276, 276,
+ 725, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 279, 668, 724, 668, 668,
+ 668, 642, 723, 722, 642, 642, 721, 720, 279, 719,
+ 279, 279, 279, 718, 717, 279, 280, 716, 280, 280,
+ 715, 280, 712, 711, 280, 280, 710, 280, 280, 280,
+ 285, 708, 285, 285, 285, 285, 707, 285, 706, 705,
+ 285, 285, 285, 285, 285, 285, 300, 300, 660, 704,
+ 660, 660, 660, 703, 702, 701, 700, 699, 300, 300,
+
+ 300, 300, 300, 300, 300, 300, 300, 311, 697, 311,
+ 311, 696, 311, 695, 694, 311, 311, 693, 311, 311,
+ 311, 312, 312, 433, 691, 690, 684, 683, 682, 681,
+ 678, 677, 657, 312, 312, 312, 312, 312, 312, 312,
+ 312, 312, 325, 325, 656, 325, 325, 325, 325, 325,
+ 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+ 325, 325, 325, 325, 325, 325, 325, 325, 325, 327,
+ 652, 327, 327, 327, 327, 327, 651, 650, 327, 327,
+ 327, 327, 327, 1053, 281, 327, 333, 333, 333, 333,
+ 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
+
+ 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
+ 333, 333, 333, 335, 281, 335, 335, 335, 647, 529,
+ 335, 337, 645, 337, 337, 644, 643, 337, 641, 337,
+ 337, 337, 638, 635, 337, 346, 346, 346, 346, 634,
+ 346, 511, 633, 632, 506, 631, 630, 346, 629, 628,
+ 346, 627, 626, 346, 623, 346, 346, 346, 622, 346,
+ 346, 349, 349, 349, 349, 621, 620, 619, 616, 480,
+ 615, 614, 613, 349, 612, 349, 349, 611, 463, 349,
+ 463, 349, 349, 349, 610, 609, 349, 355, 355, 355,
+ 355, 607, 355, 457, 452, 606, 605, 604, 603, 439,
+
+ 602, 433, 600, 433, 598, 355, 419, 355, 355, 355,
+ 597, 594, 355, 356, 356, 402, 356, 356, 356, 356,
+ 356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
+ 356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
+ 358, 589, 358, 358, 358, 358, 358, 397, 588, 358,
+ 358, 358, 358, 358, 392, 587, 358, 364, 364, 375,
+ 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+ 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+ 364, 364, 364, 364, 366, 365, 366, 366, 366, 366,
+ 366, 366, 369, 366, 366, 366, 366, 366, 365, 357,
+
+ 366, 378, 378, 378, 378, 576, 378, 343, 575, 336,
+ 574, 334, 326, 378, 561, 555, 378, 554, 553, 378,
+ 551, 378, 378, 378, 548, 378, 378, 383, 383, 383,
+ 383, 547, 538, 383, 281, 281, 529, 277, 527, 383,
+ 524, 383, 383, 522, 521, 383, 519, 383, 383, 383,
+ 517, 516, 383, 386, 386, 386, 386, 514, 386, 509,
+ 480, 468, 467, 466, 464, 463, 459, 452, 448, 439,
+ 433, 386, 419, 386, 386, 386, 402, 397, 386, 387,
+ 392, 375, 387, 365, 357, 357, 387, 343, 387, 387,
+ 387, 334, 326, 387, 391, 391, 281, 391, 391, 391,
+
+ 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 396, 396, 281, 396, 396, 396, 396, 396, 396,
+ 396, 396, 396, 396, 396, 396, 396, 396, 396, 396,
+ 396, 396, 396, 396, 396, 396, 396, 396, 401, 401,
+ 278, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 403, 277, 403, 403, 403,
+ 403, 403, 1053, 102, 403, 403, 403, 403, 403, 102,
+ 1053, 403, 409, 1053, 409, 409, 409, 1053, 1053, 409,
+
+ 414, 414, 414, 414, 1053, 414, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 414, 414, 1053, 1053, 414, 1053,
+ 414, 414, 414, 1053, 1053, 414, 422, 422, 422, 422,
+ 1053, 422, 1053, 1053, 1053, 1053, 1053, 1053, 422, 1053,
+ 1053, 422, 1053, 1053, 422, 1053, 422, 422, 422, 1053,
+ 422, 422, 425, 425, 425, 425, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 425, 1053, 425, 425, 1053, 1053,
+ 425, 1053, 425, 425, 425, 1053, 1053, 425, 431, 431,
+ 431, 431, 1053, 431, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 431, 1053, 431, 431,
+
+ 431, 1053, 1053, 431, 432, 1053, 432, 432, 432, 1053,
+ 1053, 432, 434, 1053, 434, 1053, 1053, 1053, 434, 1053,
+ 434, 434, 434, 1053, 1053, 434, 438, 438, 1053, 438,
+ 1053, 1053, 1053, 438, 1053, 438, 438, 438, 1053, 1053,
+ 438, 443, 443, 1053, 443, 443, 443, 443, 443, 443,
+ 1053, 443, 443, 443, 443, 443, 443, 443, 443, 443,
+ 443, 1053, 443, 443, 443, 443, 443, 443, 447, 1053,
+ 1053, 447, 1053, 1053, 1053, 447, 1053, 447, 447, 447,
+ 1053, 1053, 447, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449, 449, 449,
+
+ 449, 1053, 449, 449, 449, 449, 449, 449, 449, 449,
+ 451, 451, 1053, 451, 451, 451, 451, 451, 451, 451,
+ 451, 451, 451, 451, 451, 451, 451, 451, 1053, 451,
+ 451, 451, 451, 451, 451, 451, 451, 458, 1053, 1053,
+ 458, 1053, 1053, 1053, 458, 1053, 458, 458, 458, 1053,
+ 1053, 458, 462, 462, 1053, 462, 462, 462, 462, 462,
+ 462, 462, 462, 462, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 462, 462, 462, 462, 462, 462, 465,
+ 465, 1053, 465, 1053, 465, 465, 465, 465, 1053, 465,
+ 465, 465, 465, 1053, 465, 465, 465, 1053, 465, 1053,
+
+ 465, 465, 465, 465, 465, 465, 473, 1053, 1053, 473,
+ 1053, 1053, 1053, 473, 1053, 473, 473, 473, 1053, 1053,
+ 473, 481, 481, 1053, 481, 1053, 481, 481, 481, 481,
+ 481, 481, 481, 481, 481, 481, 481, 481, 481, 1053,
+ 481, 1053, 481, 481, 481, 481, 481, 481, 485, 485,
+ 1053, 485, 1053, 485, 485, 485, 485, 485, 485, 485,
+ 485, 485, 485, 485, 485, 485, 1053, 485, 1053, 485,
+ 485, 485, 485, 485, 485, 494, 1053, 1053, 494, 1053,
+ 1053, 1053, 494, 1053, 494, 494, 494, 1053, 1053, 494,
+ 498, 498, 1053, 498, 498, 498, 498, 1053, 1053, 498,
+
+ 498, 498, 498, 498, 498, 498, 498, 498, 1053, 498,
+ 1053, 498, 498, 498, 498, 498, 498, 505, 1053, 505,
+ 505, 505, 1053, 1053, 505, 507, 1053, 507, 507, 1053,
+ 1053, 507, 1053, 507, 507, 507, 1053, 1053, 507, 510,
+ 1053, 510, 510, 510, 1053, 1053, 510, 512, 1053, 512,
+ 512, 1053, 1053, 512, 1053, 512, 512, 512, 1053, 1053,
+ 512, 515, 515, 1053, 515, 515, 515, 515, 515, 515,
+ 515, 515, 515, 515, 515, 515, 515, 515, 515, 1053,
+ 515, 1053, 515, 515, 515, 515, 515, 515, 518, 1053,
+ 1053, 518, 1053, 1053, 1053, 518, 1053, 518, 518, 518,
+
+ 1053, 1053, 518, 520, 520, 1053, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 1053, 520, 520, 520, 520,
+ 520, 520, 520, 1053, 520, 520, 520, 520, 520, 520,
+ 523, 523, 1053, 523, 523, 523, 523, 523, 523, 1053,
+ 523, 523, 523, 523, 523, 523, 523, 523, 1053, 523,
+ 1053, 523, 523, 523, 523, 523, 523, 300, 300, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 300,
+ 300, 300, 300, 300, 300, 300, 300, 300, 276, 276,
+ 1053, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 279, 1053, 279, 279, 279,
+ 1053, 1053, 279, 528, 528, 1053, 1053, 528, 1053, 528,
+ 528, 528, 1053, 1053, 528, 280, 1053, 280, 280, 1053,
+ 280, 1053, 1053, 280, 280, 1053, 280, 280, 280, 530,
+ 1053, 1053, 530, 1053, 1053, 1053, 530, 1053, 530, 530,
+ 530, 535, 1053, 1053, 535, 1053, 535, 535, 535, 535,
+ 535, 535, 535, 535, 535, 535, 535, 535, 535, 535,
+ 535, 535, 535, 535, 535, 535, 535, 535, 549, 1053,
+ 549, 549, 549, 1053, 549, 311, 1053, 311, 311, 1053,
+ 311, 1053, 1053, 311, 311, 1053, 311, 311, 311, 312,
+
+ 1053, 1053, 312, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 312, 312, 312,
+ 312, 312, 325, 325, 1053, 325, 325, 325, 325, 325,
+ 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+ 325, 325, 325, 325, 325, 325, 325, 325, 325, 327,
+ 1053, 327, 327, 327, 327, 327, 1053, 1053, 327, 327,
+ 327, 327, 327, 1053, 1053, 327, 571, 1053, 571, 1053,
+ 571, 571, 571, 1053, 1053, 571, 571, 571, 571, 571,
+ 1053, 1053, 571, 333, 333, 333, 333, 333, 333, 333,
+ 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
+
+ 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
+ 337, 1053, 337, 337, 1053, 1053, 337, 1053, 337, 337,
+ 337, 1053, 1053, 337, 335, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 335, 1053, 335,
+ 335, 335, 1053, 1053, 335, 346, 346, 346, 346, 1053,
+ 346, 1053, 1053, 1053, 1053, 1053, 1053, 346, 1053, 1053,
+ 346, 1053, 1053, 346, 1053, 346, 346, 346, 1053, 346,
+ 346, 349, 349, 349, 349, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 349, 1053, 349, 349, 1053, 1053, 349,
+ 1053, 349, 349, 349, 1053, 1053, 349, 355, 355, 355,
+
+ 355, 1053, 355, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 355, 1053, 355, 355, 355,
+ 1053, 1053, 355, 577, 1053, 1053, 1053, 577, 1053, 577,
+ 577, 577, 1053, 1053, 577, 356, 356, 1053, 356, 356,
+ 356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
+ 356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
+ 356, 356, 358, 1053, 358, 358, 358, 358, 358, 1053,
+ 1053, 358, 358, 358, 358, 358, 1053, 1053, 358, 578,
+ 1053, 578, 1053, 578, 578, 578, 1053, 1053, 578, 578,
+ 578, 578, 578, 1053, 1053, 578, 364, 364, 1053, 364,
+
+ 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+ 364, 364, 364, 364, 364, 364, 364, 364, 364, 364,
+ 364, 364, 364, 366, 1053, 366, 366, 366, 366, 366,
+ 366, 1053, 366, 366, 366, 366, 366, 1053, 1053, 366,
+ 581, 1053, 581, 1053, 581, 581, 581, 1053, 1053, 581,
+ 581, 581, 581, 581, 1053, 1053, 581, 378, 378, 378,
+ 378, 1053, 378, 1053, 1053, 1053, 1053, 1053, 1053, 378,
+ 1053, 1053, 378, 1053, 1053, 378, 1053, 378, 378, 378,
+ 1053, 378, 378, 383, 383, 383, 383, 1053, 1053, 383,
+ 1053, 1053, 1053, 1053, 1053, 383, 1053, 383, 383, 1053,
+
+ 1053, 383, 1053, 383, 383, 383, 1053, 1053, 383, 386,
+ 386, 386, 386, 1053, 386, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 386, 1053, 386,
+ 386, 386, 1053, 1053, 386, 584, 584, 584, 584, 584,
+ 584, 584, 584, 1053, 584, 584, 584, 584, 584, 584,
+ 584, 584, 584, 584, 584, 584, 584, 584, 584, 584,
+ 584, 584, 586, 1053, 1053, 586, 1053, 1053, 586, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 586, 1053, 1053, 1053,
+ 586, 1053, 586, 586, 586, 1053, 1053, 586, 387, 1053,
+ 1053, 387, 1053, 1053, 1053, 387, 1053, 387, 387, 387,
+
+ 1053, 1053, 387, 391, 391, 1053, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391, 391, 391,
+ 396, 396, 1053, 396, 396, 396, 396, 396, 396, 396,
+ 396, 396, 396, 396, 396, 396, 396, 396, 396, 396,
+ 396, 396, 396, 396, 396, 396, 396, 401, 401, 1053,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 403, 1053, 403, 403, 403, 403,
+ 403, 1053, 1053, 403, 403, 403, 403, 403, 1053, 1053,
+
+ 403, 590, 1053, 590, 1053, 590, 590, 590, 1053, 1053,
+ 590, 590, 590, 590, 590, 1053, 1053, 590, 414, 414,
+ 414, 414, 1053, 414, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 414, 414, 1053, 1053, 414, 1053, 414, 414,
+ 414, 1053, 1053, 414, 593, 1053, 593, 593, 593, 1053,
+ 1053, 593, 596, 596, 596, 596, 1053, 596, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 596, 596, 1053, 1053,
+ 596, 1053, 596, 596, 596, 1053, 1053, 596, 422, 422,
+ 422, 422, 1053, 422, 1053, 1053, 1053, 1053, 1053, 1053,
+ 422, 1053, 1053, 422, 1053, 1053, 422, 1053, 422, 422,
+
+ 422, 1053, 422, 422, 425, 425, 425, 425, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 425, 1053, 425, 425,
+ 1053, 1053, 425, 1053, 425, 425, 425, 1053, 1053, 425,
+ 431, 431, 431, 431, 1053, 431, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 431, 1053,
+ 431, 431, 431, 1053, 1053, 431, 599, 1053, 1053, 1053,
+ 599, 1053, 599, 599, 599, 1053, 1053, 599, 434, 1053,
+ 434, 1053, 1053, 1053, 434, 1053, 434, 434, 434, 1053,
+ 1053, 434, 601, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 601, 1053, 601, 601, 601,
+
+ 1053, 1053, 601, 438, 438, 1053, 438, 1053, 1053, 1053,
+ 438, 1053, 438, 438, 438, 1053, 1053, 438, 443, 443,
+ 1053, 443, 443, 443, 443, 443, 443, 1053, 443, 443,
+ 443, 443, 443, 443, 443, 443, 443, 443, 1053, 443,
+ 443, 443, 443, 443, 443, 447, 1053, 1053, 447, 1053,
+ 1053, 1053, 447, 1053, 447, 447, 447, 1053, 1053, 447,
+ 449, 449, 449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449, 1053, 449,
+ 449, 449, 449, 449, 449, 449, 449, 451, 451, 1053,
+ 451, 451, 451, 451, 451, 451, 451, 451, 451, 451,
+
+ 451, 451, 451, 451, 451, 1053, 451, 451, 451, 451,
+ 451, 451, 451, 451, 608, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 608, 1053, 608,
+ 608, 608, 1053, 1053, 608, 458, 1053, 1053, 458, 1053,
+ 1053, 1053, 458, 1053, 458, 458, 458, 1053, 1053, 458,
+ 462, 462, 1053, 462, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 462, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 462, 462, 462, 462, 465, 465, 1053,
+ 465, 1053, 465, 465, 465, 465, 1053, 465, 465, 465,
+ 465, 1053, 465, 465, 465, 1053, 465, 1053, 465, 465,
+
+ 465, 465, 465, 465, 473, 1053, 1053, 473, 1053, 1053,
+ 1053, 473, 1053, 473, 473, 473, 1053, 1053, 473, 481,
+ 481, 1053, 481, 1053, 481, 481, 481, 481, 481, 481,
+ 481, 481, 481, 481, 481, 481, 481, 1053, 481, 1053,
+ 481, 481, 481, 481, 481, 481, 485, 485, 1053, 485,
+ 1053, 485, 485, 485, 485, 485, 485, 485, 485, 485,
+ 485, 485, 485, 485, 1053, 485, 1053, 485, 485, 485,
+ 485, 485, 485, 494, 1053, 1053, 494, 1053, 1053, 1053,
+ 494, 1053, 494, 494, 494, 1053, 1053, 494, 498, 498,
+ 1053, 498, 498, 498, 498, 1053, 1053, 498, 498, 498,
+
+ 498, 498, 498, 498, 498, 498, 1053, 498, 1053, 498,
+ 498, 498, 498, 498, 498, 507, 1053, 507, 507, 1053,
+ 1053, 507, 1053, 507, 507, 507, 1053, 1053, 507, 505,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 505, 1053, 505, 505, 505, 1053, 1053, 505,
+ 512, 1053, 512, 512, 1053, 1053, 512, 1053, 512, 512,
+ 512, 1053, 1053, 512, 510, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 510, 1053, 510,
+ 510, 510, 1053, 1053, 510, 515, 515, 1053, 515, 515,
+ 515, 515, 515, 515, 515, 515, 515, 515, 515, 515,
+
+ 515, 515, 515, 1053, 515, 1053, 515, 515, 515, 515,
+ 515, 515, 518, 1053, 1053, 518, 1053, 1053, 1053, 518,
+ 1053, 518, 518, 518, 1053, 1053, 518, 520, 520, 1053,
+ 520, 520, 520, 520, 520, 520, 520, 520, 520, 1053,
+ 520, 520, 520, 520, 520, 520, 520, 1053, 520, 520,
+ 520, 520, 520, 520, 523, 523, 1053, 523, 523, 523,
+ 523, 523, 523, 1053, 523, 523, 523, 523, 523, 523,
+ 523, 523, 1053, 523, 1053, 523, 523, 523, 523, 523,
+ 523, 528, 528, 1053, 1053, 528, 1053, 528, 528, 528,
+ 1053, 1053, 528, 646, 646, 1053, 646, 646, 646, 1053,
+
+ 646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+ 530, 530, 1053, 530, 1053, 1053, 1053, 530, 1053, 530,
+ 530, 530, 280, 1053, 280, 280, 1053, 280, 1053, 1053,
+ 280, 280, 1053, 280, 280, 280, 535, 1053, 1053, 535,
+ 1053, 535, 535, 535, 535, 535, 535, 535, 535, 535,
+ 535, 535, 535, 535, 535, 535, 535, 535, 535, 535,
+ 535, 535, 535, 653, 653, 1053, 653, 653, 653, 653,
+ 653, 653, 653, 653, 653, 653, 653, 653, 653, 653,
+ 653, 653, 653, 653, 653, 653, 653, 653, 653, 653,
+
+ 549, 1053, 1053, 549, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 549, 1053,
+ 549, 549, 549, 300, 1053, 1053, 300, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 300, 1053, 300, 300, 300, 664, 664, 1053, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664, 664, 664,
+ 1053, 664, 664, 312, 1053, 1053, 312, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 312, 312, 312, 312, 312, 571, 1053, 571, 571,
+
+ 571, 571, 571, 1053, 1053, 571, 571, 571, 571, 571,
+ 1053, 1053, 571, 327, 1053, 327, 327, 327, 327, 327,
+ 1053, 1053, 327, 327, 327, 327, 327, 1053, 1053, 327,
+ 335, 1053, 335, 335, 335, 1053, 1053, 335, 577, 1053,
+ 1053, 1053, 577, 1053, 577, 577, 577, 1053, 1053, 577,
+ 578, 1053, 578, 578, 578, 578, 578, 1053, 1053, 578,
+ 578, 578, 578, 578, 1053, 1053, 578, 358, 1053, 358,
+ 358, 358, 358, 358, 1053, 1053, 358, 358, 358, 358,
+ 358, 1053, 1053, 358, 581, 1053, 581, 581, 581, 581,
+ 581, 581, 1053, 581, 581, 581, 581, 581, 1053, 1053,
+
+ 581, 366, 1053, 366, 366, 366, 366, 366, 366, 1053,
+ 366, 366, 366, 366, 366, 1053, 1053, 366, 584, 584,
+ 584, 584, 584, 584, 584, 584, 584, 584, 584, 584,
+ 584, 584, 584, 584, 584, 584, 584, 584, 584, 584,
+ 584, 584, 584, 584, 584, 586, 1053, 1053, 586, 1053,
+ 1053, 586, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 586,
+ 1053, 1053, 1053, 586, 1053, 586, 586, 586, 1053, 1053,
+ 586, 590, 1053, 590, 590, 590, 590, 590, 1053, 1053,
+ 590, 590, 590, 590, 590, 1053, 1053, 590, 403, 1053,
+ 403, 403, 403, 403, 403, 1053, 1053, 403, 403, 403,
+
+ 403, 403, 1053, 1053, 403, 688, 688, 688, 688, 1053,
+ 688, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 688,
+ 688, 1053, 1053, 688, 1053, 688, 688, 688, 1053, 1053,
+ 688, 593, 593, 593, 593, 1053, 593, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 593, 1053, 1053, 593,
+ 1053, 593, 593, 593, 1053, 1053, 593, 596, 596, 596,
+ 596, 1053, 596, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 596, 596, 1053, 1053, 596, 1053, 596, 596, 596,
+ 1053, 1053, 596, 599, 1053, 1053, 1053, 599, 1053, 599,
+ 599, 599, 1053, 1053, 599, 601, 1053, 601, 601, 601,
+
+ 1053, 1053, 601, 692, 1053, 692, 1053, 1053, 1053, 692,
+ 1053, 692, 692, 692, 1053, 1053, 692, 608, 1053, 608,
+ 608, 608, 1053, 1053, 608, 698, 1053, 1053, 1053, 698,
+ 1053, 698, 698, 698, 1053, 1053, 698, 709, 709, 709,
+ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
+ 709, 709, 1053, 709, 709, 709, 1053, 709, 1053, 1053,
+ 709, 709, 709, 709, 505, 1053, 505, 505, 505, 1053,
+ 1053, 505, 510, 1053, 510, 510, 510, 1053, 1053, 510,
+ 646, 646, 1053, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+
+ 646, 646, 646, 646, 646, 646, 646, 731, 1053, 1053,
+ 731, 1053, 1053, 1053, 731, 1053, 731, 731, 731, 285,
+ 1053, 285, 1053, 285, 285, 1053, 285, 1053, 1053, 285,
+ 285, 1053, 285, 285, 285, 653, 653, 1053, 653, 653,
+ 653, 653, 653, 653, 653, 653, 653, 653, 653, 653,
+ 653, 653, 653, 653, 653, 653, 653, 653, 653, 653,
+ 653, 653, 300, 1053, 1053, 300, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 300, 1053, 300, 300, 300, 664, 664, 1053, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664, 664, 664,
+
+ 664, 664, 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 668, 668, 668, 668, 668, 312, 1053, 1053,
+ 312, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 312, 312, 312, 312, 312,
+ 327, 1053, 327, 327, 327, 327, 327, 1053, 1053, 327,
+ 327, 327, 327, 327, 1053, 1053, 327, 358, 1053, 358,
+ 358, 358, 358, 358, 1053, 1053, 358, 358, 358, 358,
+ 358, 1053, 1053, 358, 366, 1053, 366, 366, 366, 366,
+ 366, 366, 1053, 366, 366, 366, 366, 366, 1053, 1053,
+ 366, 759, 1053, 759, 759, 759, 1053, 1053, 759, 802,
+
+ 802, 1053, 802, 1053, 1053, 1053, 802, 1053, 802, 802,
+ 802, 739, 739, 739, 739, 739, 739, 739, 739, 739,
+ 739, 739, 739, 739, 739, 739, 739, 739, 739, 739,
+ 1053, 739, 1053, 1053, 1053, 739, 739, 739, 825, 825,
+ 825, 825, 1053, 825, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 825, 825, 1053, 1053, 825, 1053, 825, 825,
+ 825, 1053, 1053, 825, 849, 849, 849, 849, 849, 849,
+ 849, 849, 849, 849, 849, 849, 849, 849, 849, 1053,
+ 849, 849, 849, 1053, 849, 1053, 849, 1053, 849, 849,
+ 849, 914, 914, 914, 914, 914, 914, 914, 914, 914,
+
+ 914, 914, 914, 914, 914, 914, 1053, 914, 914, 914,
+ 1053, 914, 1053, 1053, 1053, 914, 914, 914, 915, 915,
+ 915, 915, 915, 915, 915, 915, 915, 915, 915, 915,
+ 915, 915, 915, 1053, 915, 915, 915, 1053, 915, 1053,
+ 1053, 1053, 915, 915, 915, 963, 963, 963, 963, 963,
+ 963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
+ 1053, 963, 963, 963, 1053, 963, 1053, 1053, 1053, 963,
+ 963, 963, 973, 973, 973, 973, 973, 973, 973, 973,
+ 973, 973, 973, 973, 973, 973, 973, 1053, 973, 973,
+ 973, 1053, 973, 1053, 1053, 1053, 973, 973, 973, 79,
+
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053
+ } ;
+
+static yyconst flex_int16_t yy_chk[7569] =
+ { 0,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 4, 21,
+ 22, 4, 23, 21, 22, 24, 23, 47, 48, 24,
+ 1047, 4, 4, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 57, 5, 58, 5, 5,
+
+ 294, 35, 5, 5, 5, 5, 21, 22, 36, 23,
+ 35, 1043, 24, 205, 47, 48, 106, 36, 205, 294,
+ 106, 5, 5, 5, 43, 43, 482, 43, 482, 43,
+ 44, 44, 57, 44, 58, 44, 51, 51, 35, 51,
+ 52, 52, 63, 52, 64, 36, 1040, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 43, 6, 39, 6, 6, 40, 44, 6,
+ 6, 6, 6, 39, 51, 53, 40, 53, 52, 63,
+ 521, 64, 98, 98, 39, 269, 98, 40, 6, 6,
+ 6, 109, 109, 109, 109, 53, 521, 90, 1036, 90,
+
+ 90, 39, 90, 90, 40, 109, 98, 90, 195, 109,
+ 269, 195, 53, 195, 6, 6, 6, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 75, 13, 299, 13, 13,
+ 76, 186, 13, 13, 13, 13, 45, 75, 45, 54,
+ 186, 54, 76, 220, 246, 45, 299, 220, 246, 221,
+ 45, 13, 13, 13, 221, 46, 45, 46, 221, 54,
+
+ 83, 83, 75, 83, 46, 1033, 251, 76, 186, 46,
+ 251, 288, 288, 45, 69, 46, 54, 13, 13, 13,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 46, 14, 69, 14, 14, 70, 83, 14,
+ 14, 14, 14, 55, 56, 55, 56, 286, 99, 99,
+ 286, 69, 99, 110, 110, 110, 110, 70, 14, 14,
+ 14, 1032, 61, 55, 56, 107, 107, 110, 107, 61,
+ 61, 110, 99, 335, 70, 115, 115, 335, 115, 337,
+ 55, 56, 61, 337, 14, 14, 14, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 61,
+
+ 15, 71, 15, 15, 62, 107, 15, 15, 15, 15,
+ 72, 62, 62, 77, 1031, 115, 116, 116, 116, 116,
+ 306, 71, 77, 116, 62, 15, 15, 15, 82, 306,
+ 72, 82, 505, 77, 214, 214, 505, 214, 71, 142,
+ 142, 62, 142, 322, 322, 549, 322, 72, 549, 82,
+ 77, 15, 15, 15, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 82, 16, 78, 16,
+ 16, 1050, 214, 16, 16, 16, 16, 78, 87, 142,
+ 87, 87, 87, 87, 114, 114, 114, 114, 78, 1050,
+ 87, 225, 16, 16, 16, 225, 289, 1038, 114, 786,
+
+ 507, 225, 114, 225, 507, 78, 786, 87, 138, 138,
+ 138, 138, 1038, 323, 323, 138, 323, 289, 16, 16,
+ 16, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 1014,
+ 25, 92, 25, 25, 92, 1030, 25, 25, 25, 25,
+ 146, 146, 1014, 146, 92, 92, 111, 111, 111, 111,
+ 120, 120, 92, 111, 120, 25, 25, 25, 100, 100,
+
+ 111, 100, 150, 150, 111, 150, 1028, 330, 330, 92,
+ 330, 305, 100, 100, 120, 510, 100, 1028, 1026, 510,
+ 146, 25, 25, 25, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 100, 26, 100, 26,
+ 26, 305, 150, 26, 26, 26, 26, 94, 94, 1025,
+ 94, 111, 489, 121, 121, 1023, 94, 121, 94, 94,
+ 94, 94, 26, 26, 26, 291, 489, 305, 94, 132,
+ 132, 132, 132, 170, 170, 170, 170, 121, 339, 339,
+ 170, 339, 997, 132, 997, 94, 291, 132, 26, 26,
+ 26, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 33, 33, 33, 33, 33,
+
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 49,
+
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+
+ 65, 65, 65, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 88,
+ 112, 112, 112, 112, 1022, 127, 127, 112, 290, 127,
+ 88, 127, 154, 154, 112, 1021, 154, 1020, 112, 312,
+ 88, 292, 312, 88, 88, 290, 1019, 88, 88, 127,
+ 88, 88, 1018, 512, 128, 128, 154, 512, 128, 88,
+ 128, 295, 292, 88, 88, 123, 123, 290, 123, 88,
+ 88, 88, 88, 88, 88, 89, 89, 312, 128, 123,
+
+ 123, 517, 295, 123, 129, 112, 1017, 226, 89, 89,
+ 89, 1010, 226, 129, 129, 644, 226, 129, 328, 129,
+ 542, 328, 226, 123, 226, 123, 517, 89, 1009, 350,
+ 350, 89, 350, 89, 89, 89, 1007, 129, 155, 155,
+ 542, 328, 155, 131, 131, 644, 131, 89, 161, 161,
+ 89, 161, 89, 89, 89, 91, 91, 131, 131, 1006,
+ 774, 131, 155, 131, 133, 133, 133, 133, 91, 91,
+ 91, 644, 134, 134, 134, 134, 774, 386, 133, 134,
+ 386, 131, 133, 131, 1005, 386, 134, 91, 161, 91,
+ 134, 91, 449, 91, 91, 91, 1004, 135, 135, 135,
+
+ 135, 449, 169, 169, 135, 169, 270, 91, 1003, 270,
+ 91, 135, 91, 91, 91, 135, 137, 137, 137, 137,
+ 361, 361, 545, 361, 137, 156, 156, 270, 156, 449,
+ 137, 790, 1002, 655, 137, 273, 273, 134, 273, 156,
+ 156, 545, 169, 156, 270, 790, 163, 163, 163, 163,
+ 160, 160, 160, 160, 655, 1001, 1000, 160, 175, 175,
+ 163, 175, 135, 156, 163, 156, 160, 160, 160, 164,
+ 164, 164, 164, 273, 165, 165, 165, 165, 546, 371,
+ 371, 165, 371, 164, 991, 990, 460, 164, 165, 460,
+ 979, 460, 165, 166, 166, 166, 166, 546, 175, 736,
+
+ 166, 168, 168, 168, 168, 178, 178, 166, 178, 181,
+ 181, 166, 181, 978, 976, 168, 189, 189, 736, 168,
+ 208, 208, 1048, 208, 212, 212, 1048, 212, 975, 189,
+ 189, 189, 229, 229, 552, 229, 969, 552, 968, 165,
+ 233, 233, 967, 233, 554, 178, 966, 554, 189, 181,
+ 239, 239, 965, 239, 242, 242, 622, 242, 166, 622,
+ 208, 964, 274, 274, 212, 274, 550, 293, 313, 550,
+ 293, 313, 229, 550, 937, 189, 190, 190, 541, 190,
+ 233, 541, 190, 190, 936, 1045, 314, 293, 315, 314,
+ 239, 315, 1045, 935, 242, 190, 190, 190, 541, 554,
+
+ 274, 293, 311, 550, 311, 311, 313, 311, 311, 622,
+ 316, 934, 311, 316, 190, 317, 190, 561, 317, 313,
+ 561, 933, 317, 293, 314, 553, 315, 319, 553, 550,
+ 319, 318, 932, 315, 318, 327, 327, 320, 931, 327,
+ 320, 190, 271, 271, 930, 314, 388, 388, 316, 388,
+ 320, 320, 317, 317, 929, 271, 271, 271, 320, 327,
+ 329, 329, 561, 316, 329, 319, 928, 332, 332, 318,
+ 559, 332, 553, 559, 271, 320, 318, 543, 317, 927,
+ 543, 271, 271, 319, 329, 318, 359, 393, 393, 359,
+ 393, 332, 342, 342, 342, 342, 926, 543, 925, 271,
+
+ 271, 271, 272, 272, 332, 640, 342, 924, 640, 359,
+ 342, 347, 347, 347, 347, 272, 272, 272, 347, 923,
+ 922, 343, 343, 343, 343, 921, 920, 559, 343, 345,
+ 345, 345, 345, 919, 272, 343, 345, 398, 398, 343,
+ 398, 272, 272, 345, 917, 916, 912, 345, 353, 353,
+ 353, 353, 911, 406, 406, 353, 406, 910, 909, 272,
+ 272, 272, 284, 415, 415, 284, 415, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284, 284, 908,
+ 907, 284, 284, 284, 284, 367, 343, 906, 367, 346,
+ 346, 346, 346, 905, 345, 349, 349, 349, 349, 904,
+
+ 284, 284, 284, 346, 903, 901, 900, 346, 367, 349,
+ 358, 358, 649, 349, 358, 649, 899, 348, 348, 348,
+ 348, 898, 426, 426, 348, 426, 284, 284, 284, 284,
+ 300, 348, 897, 300, 358, 348, 300, 300, 354, 354,
+ 354, 354, 360, 360, 654, 354, 360, 654, 896, 300,
+ 300, 300, 363, 363, 366, 366, 363, 895, 366, 894,
+ 366, 368, 368, 893, 654, 368, 360, 368, 300, 374,
+ 374, 374, 374, 373, 373, 892, 363, 373, 366, 373,
+ 403, 403, 348, 374, 403, 368, 890, 374, 404, 363,
+ 889, 404, 888, 300, 300, 300, 885, 373, 375, 375,
+
+ 375, 375, 884, 875, 403, 375, 377, 377, 377, 377,
+ 373, 404, 375, 377, 405, 405, 375, 874, 405, 658,
+ 377, 873, 658, 872, 377, 378, 378, 378, 378, 379,
+ 379, 379, 379, 378, 435, 435, 379, 435, 405, 378,
+ 871, 870, 869, 378, 380, 380, 380, 380, 868, 867,
+ 866, 380, 381, 381, 381, 381, 440, 440, 380, 440,
+ 381, 865, 380, 375, 408, 408, 381, 864, 408, 863,
+ 381, 377, 383, 383, 383, 383, 384, 384, 384, 384,
+ 383, 444, 444, 384, 444, 862, 383, 861, 408, 860,
+ 383, 385, 385, 385, 385, 859, 455, 455, 385, 455,
+
+ 858, 408, 857, 409, 409, 409, 409, 855, 853, 380,
+ 409, 410, 410, 410, 410, 412, 412, 412, 412, 409,
+ 409, 409, 412, 414, 414, 414, 414, 850, 848, 410,
+ 414, 412, 412, 412, 418, 418, 418, 418, 847, 414,
+ 414, 414, 419, 419, 419, 419, 846, 845, 418, 419,
+ 470, 470, 418, 470, 474, 474, 419, 474, 844, 843,
+ 419, 421, 421, 421, 421, 842, 841, 840, 421, 422,
+ 422, 422, 422, 477, 477, 421, 477, 491, 491, 421,
+ 491, 495, 495, 422, 495, 839, 838, 422, 423, 423,
+ 423, 423, 837, 836, 835, 423, 424, 424, 424, 424,
+
+ 834, 499, 499, 424, 499, 502, 502, 419, 502, 555,
+ 424, 477, 555, 833, 424, 425, 425, 425, 425, 832,
+ 429, 429, 429, 429, 831, 566, 421, 429, 566, 425,
+ 830, 828, 827, 425, 430, 430, 430, 430, 826, 822,
+ 585, 430, 560, 585, 821, 560, 820, 564, 585, 567,
+ 564, 565, 567, 555, 565, 663, 568, 726, 663, 568,
+ 726, 424, 534, 566, 817, 534, 816, 534, 534, 534,
+ 534, 534, 534, 534, 534, 534, 534, 534, 534, 806,
+ 566, 534, 534, 534, 534, 564, 560, 567, 740, 565,
+ 805, 740, 569, 567, 568, 569, 564, 804, 565, 803,
+
+ 534, 534, 534, 570, 663, 802, 570, 571, 571, 662,
+ 801, 571, 662, 568, 572, 572, 573, 573, 572, 800,
+ 573, 578, 578, 799, 798, 578, 534, 534, 534, 534,
+ 569, 571, 665, 579, 579, 665, 569, 579, 572, 797,
+ 573, 570, 580, 580, 586, 578, 580, 586, 570, 581,
+ 581, 573, 586, 581, 796, 581, 795, 579, 582, 582,
+ 667, 794, 582, 667, 582, 662, 580, 675, 583, 583,
+ 675, 793, 583, 581, 583, 590, 590, 580, 792, 590,
+ 591, 591, 582, 791, 591, 592, 592, 789, 741, 592,
+ 665, 741, 583, 788, 593, 593, 593, 593, 787, 590,
+
+ 785, 593, 784, 583, 591, 675, 667, 783, 782, 592,
+ 593, 593, 593, 675, 594, 594, 594, 594, 781, 780,
+ 592, 594, 595, 595, 595, 595, 779, 856, 977, 595,
+ 856, 977, 594, 741, 596, 596, 596, 596, 595, 595,
+ 595, 596, 648, 778, 648, 1024, 648, 648, 1024, 777,
+ 596, 596, 596, 776, 648, 661, 661, 661, 661, 661,
+ 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+ 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+ 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+ 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+
+ 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+ 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+ 661, 661, 661, 666, 672, 669, 666, 672, 669, 807,
+ 676, 676, 807, 775, 676, 876, 679, 679, 876, 773,
+ 679, 687, 687, 687, 687, 772, 808, 771, 687, 808,
+ 810, 770, 742, 810, 676, 742, 769, 687, 687, 687,
+ 679, 768, 672, 669, 671, 673, 767, 671, 673, 676,
+ 766, 674, 807, 672, 674, 679, 876, 666, 669, 670,
+ 670, 670, 670, 670, 670, 670, 670, 670, 670, 670,
+ 670, 670, 670, 670, 670, 670, 670, 670, 670, 670,
+
+ 670, 670, 671, 673, 808, 742, 765, 764, 810, 674,
+ 680, 680, 939, 763, 680, 939, 680, 670, 670, 670,
+ 671, 744, 762, 673, 744, 674, 685, 685, 877, 878,
+ 685, 877, 878, 761, 680, 688, 688, 688, 688, 760,
+ 757, 756, 688, 670, 670, 670, 670, 755, 752, 680,
+ 685, 688, 688, 688, 689, 689, 689, 689, 702, 702,
+ 751, 689, 743, 702, 738, 685, 702, 702, 939, 737,
+ 744, 702, 689, 877, 878, 702, 702, 732, 735, 732,
+ 745, 732, 732, 745, 734, 1035, 750, 750, 1035, 732,
+ 750, 759, 759, 759, 759, 731, 1037, 1041, 759, 1037,
+
+ 1041, 940, 1044, 1046, 940, 1044, 1046, 759, 759, 759,
+ 750, 747, 749, 729, 747, 749, 748, 750, 745, 748,
+ 811, 879, 728, 811, 879, 745, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746, 746, 747,
+ 749, 753, 753, 940, 748, 753, 747, 812, 811, 879,
+ 812, 749, 811, 727, 746, 746, 746, 725, 724, 748,
+ 754, 754, 723, 722, 754, 753, 754, 879, 813, 758,
+ 758, 813, 753, 758, 814, 815, 815, 814, 721, 815,
+ 746, 746, 746, 746, 754, 812, 880, 720, 719, 880,
+
+ 812, 754, 718, 758, 818, 818, 717, 716, 818, 815,
+ 758, 819, 819, 815, 715, 819, 813, 819, 1049, 823,
+ 823, 1049, 814, 823, 881, 714, 994, 881, 818, 994,
+ 882, 712, 818, 882, 880, 819, 813, 880, 938, 819,
+ 711, 938, 814, 823, 710, 708, 707, 823, 824, 824,
+ 824, 824, 706, 705, 704, 824, 825, 825, 825, 825,
+ 703, 701, 881, 825, 824, 824, 824, 944, 882, 881,
+ 944, 994, 825, 825, 825, 882, 883, 883, 886, 886,
+ 883, 700, 886, 887, 887, 941, 941, 887, 941, 887,
+ 891, 891, 942, 699, 891, 942, 938, 697, 943, 696,
+
+ 883, 943, 886, 995, 695, 944, 995, 887, 694, 945,
+ 945, 948, 948, 945, 891, 948, 693, 692, 883, 944,
+ 886, 996, 996, 941, 996, 887, 998, 953, 953, 998,
+ 942, 953, 891, 945, 691, 948, 943, 949, 949, 999,
+ 690, 949, 999, 949, 1012, 1013, 1015, 1012, 1013, 1015,
+ 942, 953, 684, 683, 943, 1016, 995, 1027, 1016, 996,
+ 1027, 949, 1029, 1039, 998, 1029, 1039, 1052, 1052, 682,
+ 1052, 998, 1139, 678, 1139, 1139, 1139, 999, 1200, 677,
+ 668, 1200, 1200, 664, 1015, 657, 1013, 656, 1012, 653,
+ 1015, 652, 999, 1016, 651, 1208, 1016, 1208, 1208, 1208,
+
+ 1029, 1039, 646, 645, 643, 1052, 641, 1211, 1027, 1211,
+ 1211, 1211, 639, 1029, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055,
+ 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055,
+ 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1056, 1056,
+ 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056,
+ 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056,
+ 1056, 1056, 1056, 1056, 1056, 1057, 1057, 1057, 1057, 1057,
+
+ 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057,
+ 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057,
+ 1057, 1057, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058,
+ 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058,
+ 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1059,
+ 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059,
+ 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059,
+ 1059, 1059, 1059, 1059, 1059, 1059, 1060, 1060, 1060, 1060,
+ 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060,
+ 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060,
+
+ 1060, 1060, 1060, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1063, 1063, 1063,
+ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
+ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
+ 1063, 1063, 1063, 1063, 1064, 1064, 1064, 1064, 1064, 1064,
+ 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064,
+
+ 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064,
+ 1064, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
+ 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
+ 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1066, 1066,
+ 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066,
+ 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066,
+ 1066, 1066, 1066, 1066, 1066, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
+
+ 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
+ 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1069,
+ 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069,
+ 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069,
+ 1069, 1069, 1069, 1069, 1069, 1069, 1070, 1070, 1070, 1070,
+ 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070,
+ 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070,
+ 1070, 1070, 1070, 1071, 1071, 1071, 1071, 1071, 1071, 1071,
+ 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071,
+ 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071,
+
+ 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072,
+ 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072,
+ 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1073, 1073, 1073,
+ 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073,
+ 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073,
+ 1073, 1073, 1073, 1073, 1074, 1074, 1074, 1074, 1074, 1074,
+ 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074,
+ 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074,
+ 1074, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075,
+ 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075,
+
+ 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1076, 1076,
+ 638, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076,
+ 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076,
+ 1076, 1076, 1076, 1076, 1076, 1077, 1212, 634, 1212, 1212,
+ 1212, 1237, 632, 630, 1237, 1237, 629, 628, 1077, 627,
+ 1077, 1077, 1077, 626, 625, 1077, 1078, 624, 1078, 1078,
+ 623, 1078, 621, 620, 1078, 1078, 619, 1078, 1078, 1078,
+ 1079, 618, 1079, 1079, 1079, 1079, 617, 1079, 616, 615,
+ 1079, 1079, 1079, 1079, 1079, 1079, 1080, 1080, 1242, 614,
+ 1242, 1242, 1242, 613, 612, 611, 610, 609, 1080, 1080,
+
+ 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1081, 606, 1081,
+ 1081, 605, 1081, 604, 603, 1081, 1081, 602, 1081, 1081,
+ 1081, 1082, 1082, 601, 598, 597, 589, 588, 587, 584,
+ 576, 575, 548, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1083, 1083, 547, 1083, 1083, 1083, 1083, 1083,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1084,
+ 540, 1084, 1084, 1084, 1084, 1084, 539, 538, 1084, 1084,
+ 1084, 1084, 1084, 536, 535, 1084, 1085, 1085, 1085, 1085,
+ 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085,
+
+ 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085,
+ 1085, 1085, 1085, 1086, 533, 1086, 1086, 1086, 530, 528,
+ 1086, 1087, 527, 1087, 1087, 526, 525, 1087, 522, 1087,
+ 1087, 1087, 519, 516, 1087, 1088, 1088, 1088, 1088, 514,
+ 1088, 513, 511, 509, 508, 506, 504, 1088, 501, 497,
+ 1088, 493, 490, 1088, 488, 1088, 1088, 1088, 487, 1088,
+ 1088, 1089, 1089, 1089, 1089, 486, 484, 483, 480, 479,
+ 476, 472, 469, 1089, 468, 1089, 1089, 464, 462, 1089,
+ 461, 1089, 1089, 1089, 459, 457, 1089, 1090, 1090, 1090,
+ 1090, 454, 1090, 452, 451, 448, 446, 442, 439, 438,
+
+ 437, 434, 433, 432, 428, 1090, 420, 1090, 1090, 1090,
+ 417, 413, 1090, 1091, 1091, 401, 1091, 1091, 1091, 1091,
+ 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091,
+ 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091,
+ 1092, 400, 1092, 1092, 1092, 1092, 1092, 396, 395, 1092,
+ 1092, 1092, 1092, 1092, 391, 390, 1092, 1093, 1093, 376,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1094, 370, 1094, 1094, 1094, 1094,
+ 1094, 1094, 365, 1094, 1094, 1094, 1094, 1094, 364, 356,
+
+ 1094, 1095, 1095, 1095, 1095, 352, 1095, 344, 341, 338,
+ 336, 333, 325, 1095, 307, 304, 1095, 303, 302, 1095,
+ 301, 1095, 1095, 1095, 297, 1095, 1095, 1096, 1096, 1096,
+ 1096, 296, 287, 1096, 285, 280, 279, 276, 275, 1096,
+ 268, 1096, 1096, 264, 263, 1096, 260, 1096, 1096, 1096,
+ 256, 255, 1096, 1097, 1097, 1097, 1097, 252, 1097, 247,
+ 216, 204, 203, 202, 198, 197, 193, 188, 185, 177,
+ 174, 1097, 167, 1097, 1097, 1097, 153, 149, 1097, 1098,
+ 145, 136, 1098, 126, 122, 119, 1098, 113, 1098, 1098,
+ 1098, 101, 97, 1098, 1099, 1099, 93, 1099, 1099, 1099,
+
+ 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099,
+ 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099,
+ 1099, 1100, 1100, 86, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1101, 1101,
+ 85, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,
+ 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,
+ 1101, 1101, 1101, 1101, 1101, 1102, 84, 1102, 1102, 1102,
+ 1102, 1102, 79, 8, 1102, 1102, 1102, 1102, 1102, 7,
+ 0, 1102, 1103, 0, 1103, 1103, 1103, 0, 0, 1103,
+
+ 1104, 1104, 1104, 1104, 0, 1104, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1104, 1104, 0, 0, 1104, 0,
+ 1104, 1104, 1104, 0, 0, 1104, 1105, 1105, 1105, 1105,
+ 0, 1105, 0, 0, 0, 0, 0, 0, 1105, 0,
+ 0, 1105, 0, 0, 1105, 0, 1105, 1105, 1105, 0,
+ 1105, 1105, 1106, 1106, 1106, 1106, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1106, 0, 1106, 1106, 0, 0,
+ 1106, 0, 1106, 1106, 1106, 0, 0, 1106, 1107, 1107,
+ 1107, 1107, 0, 1107, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1107, 0, 1107, 1107,
+
+ 1107, 0, 0, 1107, 1108, 0, 1108, 1108, 1108, 0,
+ 0, 1108, 1109, 0, 1109, 0, 0, 0, 1109, 0,
+ 1109, 1109, 1109, 0, 0, 1109, 1110, 1110, 0, 1110,
+ 0, 0, 0, 1110, 0, 1110, 1110, 1110, 0, 0,
+ 1110, 1111, 1111, 0, 1111, 1111, 1111, 1111, 1111, 1111,
+ 0, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111,
+ 1111, 0, 1111, 1111, 1111, 1111, 1111, 1111, 1112, 0,
+ 0, 1112, 0, 0, 0, 1112, 0, 1112, 1112, 1112,
+ 0, 0, 1112, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+
+ 1113, 0, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1114, 1114, 0, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 0, 1114,
+ 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1115, 0, 0,
+ 1115, 0, 0, 0, 1115, 0, 1115, 1115, 1115, 0,
+ 0, 1115, 1116, 1116, 0, 1116, 1116, 1116, 1116, 1116,
+ 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116,
+ 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1117,
+ 1117, 0, 1117, 0, 1117, 1117, 1117, 1117, 0, 1117,
+ 1117, 1117, 1117, 0, 1117, 1117, 1117, 0, 1117, 0,
+
+ 1117, 1117, 1117, 1117, 1117, 1117, 1118, 0, 0, 1118,
+ 0, 0, 0, 1118, 0, 1118, 1118, 1118, 0, 0,
+ 1118, 1119, 1119, 0, 1119, 0, 1119, 1119, 1119, 1119,
+ 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 0,
+ 1119, 0, 1119, 1119, 1119, 1119, 1119, 1119, 1120, 1120,
+ 0, 1120, 0, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 0, 1120, 0, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1121, 0, 0, 1121, 0,
+ 0, 0, 1121, 0, 1121, 1121, 1121, 0, 0, 1121,
+ 1122, 1122, 0, 1122, 1122, 1122, 1122, 0, 0, 1122,
+
+ 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 0, 1122,
+ 0, 1122, 1122, 1122, 1122, 1122, 1122, 1123, 0, 1123,
+ 1123, 1123, 0, 0, 1123, 1124, 0, 1124, 1124, 0,
+ 0, 1124, 0, 1124, 1124, 1124, 0, 0, 1124, 1125,
+ 0, 1125, 1125, 1125, 0, 0, 1125, 1126, 0, 1126,
+ 1126, 0, 0, 1126, 0, 1126, 1126, 1126, 0, 0,
+ 1126, 1127, 1127, 0, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 0,
+ 1127, 0, 1127, 1127, 1127, 1127, 1127, 1127, 1128, 0,
+ 0, 1128, 0, 0, 0, 1128, 0, 1128, 1128, 1128,
+
+ 0, 0, 1128, 1129, 1129, 0, 1129, 1129, 1129, 1129,
+ 1129, 1129, 1129, 1129, 1129, 0, 1129, 1129, 1129, 1129,
+ 1129, 1129, 1129, 0, 1129, 1129, 1129, 1129, 1129, 1129,
+ 1130, 1130, 0, 1130, 1130, 1130, 1130, 1130, 1130, 0,
+ 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 0, 1130,
+ 0, 1130, 1130, 1130, 1130, 1130, 1130, 1131, 1131, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1131,
+ 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1132, 1132,
+ 0, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+
+ 1132, 1132, 1132, 1132, 1132, 1133, 0, 1133, 1133, 1133,
+ 0, 0, 1133, 1134, 1134, 0, 0, 1134, 0, 1134,
+ 1134, 1134, 0, 0, 1134, 1135, 0, 1135, 1135, 0,
+ 1135, 0, 0, 1135, 1135, 0, 1135, 1135, 1135, 1136,
+ 0, 0, 1136, 0, 0, 0, 1136, 0, 1136, 1136,
+ 1136, 1137, 0, 0, 1137, 0, 1137, 1137, 1137, 1137,
+ 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137,
+ 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1138, 0,
+ 1138, 1138, 1138, 0, 1138, 1140, 0, 1140, 1140, 0,
+ 1140, 0, 0, 1140, 1140, 0, 1140, 1140, 1140, 1141,
+
+ 0, 0, 1141, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1141, 1141, 1141,
+ 1141, 1141, 1142, 1142, 0, 1142, 1142, 1142, 1142, 1142,
+ 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142,
+ 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1143,
+ 0, 1143, 1143, 1143, 1143, 1143, 0, 0, 1143, 1143,
+ 1143, 1143, 1143, 0, 0, 1143, 1144, 0, 1144, 0,
+ 1144, 1144, 1144, 0, 0, 1144, 1144, 1144, 1144, 1144,
+ 0, 0, 1144, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+
+ 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1146, 0, 1146, 1146, 0, 0, 1146, 0, 1146, 1146,
+ 1146, 0, 0, 1146, 1147, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1147, 0, 1147,
+ 1147, 1147, 0, 0, 1147, 1148, 1148, 1148, 1148, 0,
+ 1148, 0, 0, 0, 0, 0, 0, 1148, 0, 0,
+ 1148, 0, 0, 1148, 0, 1148, 1148, 1148, 0, 1148,
+ 1148, 1149, 1149, 1149, 1149, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1149, 0, 1149, 1149, 0, 0, 1149,
+ 0, 1149, 1149, 1149, 0, 0, 1149, 1150, 1150, 1150,
+
+ 1150, 0, 1150, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1150, 0, 1150, 1150, 1150,
+ 0, 0, 1150, 1151, 0, 0, 0, 1151, 0, 1151,
+ 1151, 1151, 0, 0, 1151, 1152, 1152, 0, 1152, 1152,
+ 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152,
+ 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152,
+ 1152, 1152, 1153, 0, 1153, 1153, 1153, 1153, 1153, 0,
+ 0, 1153, 1153, 1153, 1153, 1153, 0, 0, 1153, 1154,
+ 0, 1154, 0, 1154, 1154, 1154, 0, 0, 1154, 1154,
+ 1154, 1154, 1154, 0, 0, 1154, 1155, 1155, 0, 1155,
+
+ 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155,
+ 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155,
+ 1155, 1155, 1155, 1156, 0, 1156, 1156, 1156, 1156, 1156,
+ 1156, 0, 1156, 1156, 1156, 1156, 1156, 0, 0, 1156,
+ 1157, 0, 1157, 0, 1157, 1157, 1157, 0, 0, 1157,
+ 1157, 1157, 1157, 1157, 0, 0, 1157, 1158, 1158, 1158,
+ 1158, 0, 1158, 0, 0, 0, 0, 0, 0, 1158,
+ 0, 0, 1158, 0, 0, 1158, 0, 1158, 1158, 1158,
+ 0, 1158, 1158, 1159, 1159, 1159, 1159, 0, 0, 1159,
+ 0, 0, 0, 0, 0, 1159, 0, 1159, 1159, 0,
+
+ 0, 1159, 0, 1159, 1159, 1159, 0, 0, 1159, 1160,
+ 1160, 1160, 1160, 0, 1160, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1160, 0, 1160,
+ 1160, 1160, 0, 0, 1160, 1161, 1161, 1161, 1161, 1161,
+ 1161, 1161, 1161, 0, 1161, 1161, 1161, 1161, 1161, 1161,
+ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161,
+ 1161, 1161, 1162, 0, 0, 1162, 0, 0, 1162, 0,
+ 0, 0, 0, 0, 0, 0, 1162, 0, 0, 0,
+ 1162, 0, 1162, 1162, 1162, 0, 0, 1162, 1163, 0,
+ 0, 1163, 0, 0, 0, 1163, 0, 1163, 1163, 1163,
+
+ 0, 0, 1163, 1164, 1164, 0, 1164, 1164, 1164, 1164,
+ 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
+ 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
+ 1165, 1165, 0, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
+ 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
+ 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1166, 1166, 0,
+ 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166,
+ 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166,
+ 1166, 1166, 1166, 1166, 1167, 0, 1167, 1167, 1167, 1167,
+ 1167, 0, 0, 1167, 1167, 1167, 1167, 1167, 0, 0,
+
+ 1167, 1168, 0, 1168, 0, 1168, 1168, 1168, 0, 0,
+ 1168, 1168, 1168, 1168, 1168, 0, 0, 1168, 1169, 1169,
+ 1169, 1169, 0, 1169, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1169, 1169, 0, 0, 1169, 0, 1169, 1169,
+ 1169, 0, 0, 1169, 1170, 0, 1170, 1170, 1170, 0,
+ 0, 1170, 1171, 1171, 1171, 1171, 0, 1171, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1171, 1171, 0, 0,
+ 1171, 0, 1171, 1171, 1171, 0, 0, 1171, 1172, 1172,
+ 1172, 1172, 0, 1172, 0, 0, 0, 0, 0, 0,
+ 1172, 0, 0, 1172, 0, 0, 1172, 0, 1172, 1172,
+
+ 1172, 0, 1172, 1172, 1173, 1173, 1173, 1173, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1173, 0, 1173, 1173,
+ 0, 0, 1173, 0, 1173, 1173, 1173, 0, 0, 1173,
+ 1174, 1174, 1174, 1174, 0, 1174, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1174, 0,
+ 1174, 1174, 1174, 0, 0, 1174, 1175, 0, 0, 0,
+ 1175, 0, 1175, 1175, 1175, 0, 0, 1175, 1176, 0,
+ 1176, 0, 0, 0, 1176, 0, 1176, 1176, 1176, 0,
+ 0, 1176, 1177, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1177, 0, 1177, 1177, 1177,
+
+ 0, 0, 1177, 1178, 1178, 0, 1178, 0, 0, 0,
+ 1178, 0, 1178, 1178, 1178, 0, 0, 1178, 1179, 1179,
+ 0, 1179, 1179, 1179, 1179, 1179, 1179, 0, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 0, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1180, 0, 0, 1180, 0,
+ 0, 0, 1180, 0, 1180, 1180, 1180, 0, 0, 1180,
+ 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181,
+ 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 0, 1181,
+ 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1182, 1182, 0,
+ 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+
+ 1182, 1182, 1182, 1182, 1182, 0, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1183, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1183, 0, 1183,
+ 1183, 1183, 0, 0, 1183, 1184, 0, 0, 1184, 0,
+ 0, 0, 1184, 0, 1184, 1184, 1184, 0, 0, 1184,
+ 1185, 1185, 0, 1185, 1185, 1185, 1185, 1185, 1185, 1185,
+ 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185,
+ 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1186, 1186, 0,
+ 1186, 0, 1186, 1186, 1186, 1186, 0, 1186, 1186, 1186,
+ 1186, 0, 1186, 1186, 1186, 0, 1186, 0, 1186, 1186,
+
+ 1186, 1186, 1186, 1186, 1187, 0, 0, 1187, 0, 0,
+ 0, 1187, 0, 1187, 1187, 1187, 0, 0, 1187, 1188,
+ 1188, 0, 1188, 0, 1188, 1188, 1188, 1188, 1188, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 0, 1188, 0,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1189, 1189, 0, 1189,
+ 0, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189,
+ 1189, 1189, 1189, 1189, 0, 1189, 0, 1189, 1189, 1189,
+ 1189, 1189, 1189, 1190, 0, 0, 1190, 0, 0, 0,
+ 1190, 0, 1190, 1190, 1190, 0, 0, 1190, 1191, 1191,
+ 0, 1191, 1191, 1191, 1191, 0, 0, 1191, 1191, 1191,
+
+ 1191, 1191, 1191, 1191, 1191, 1191, 0, 1191, 0, 1191,
+ 1191, 1191, 1191, 1191, 1191, 1192, 0, 1192, 1192, 0,
+ 0, 1192, 0, 1192, 1192, 1192, 0, 0, 1192, 1193,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1193, 0, 1193, 1193, 1193, 0, 0, 1193,
+ 1194, 0, 1194, 1194, 0, 0, 1194, 0, 1194, 1194,
+ 1194, 0, 0, 1194, 1195, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1195, 0, 1195,
+ 1195, 1195, 0, 0, 1195, 1196, 1196, 0, 1196, 1196,
+ 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196,
+
+ 1196, 1196, 1196, 0, 1196, 0, 1196, 1196, 1196, 1196,
+ 1196, 1196, 1197, 0, 0, 1197, 0, 0, 0, 1197,
+ 0, 1197, 1197, 1197, 0, 0, 1197, 1198, 1198, 0,
+ 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 0,
+ 1198, 1198, 1198, 1198, 1198, 1198, 1198, 0, 1198, 1198,
+ 1198, 1198, 1198, 1198, 1199, 1199, 0, 1199, 1199, 1199,
+ 1199, 1199, 1199, 0, 1199, 1199, 1199, 1199, 1199, 1199,
+ 1199, 1199, 0, 1199, 0, 1199, 1199, 1199, 1199, 1199,
+ 1199, 1201, 1201, 0, 0, 1201, 0, 1201, 1201, 1201,
+ 0, 0, 1201, 1202, 1202, 0, 1202, 1202, 1202, 0,
+
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1203, 1203, 0, 1203, 0, 0, 0, 1203, 0, 1203,
+ 1203, 1203, 1204, 0, 1204, 1204, 0, 1204, 0, 0,
+ 1204, 1204, 0, 1204, 1204, 1204, 1205, 0, 0, 1205,
+ 0, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205,
+ 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205,
+ 1205, 1205, 1205, 1206, 1206, 0, 1206, 1206, 1206, 1206,
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+
+ 1207, 0, 0, 1207, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1207, 0,
+ 1207, 1207, 1207, 1209, 0, 0, 1209, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1209, 0, 1209, 1209, 1209, 1210, 1210, 0, 1210,
+ 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210,
+ 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210,
+ 0, 1210, 1210, 1213, 0, 0, 1213, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1213, 1213, 1213, 1213, 1213, 1214, 0, 1214, 1214,
+
+ 1214, 1214, 1214, 0, 0, 1214, 1214, 1214, 1214, 1214,
+ 0, 0, 1214, 1215, 0, 1215, 1215, 1215, 1215, 1215,
+ 0, 0, 1215, 1215, 1215, 1215, 1215, 0, 0, 1215,
+ 1216, 0, 1216, 1216, 1216, 0, 0, 1216, 1217, 0,
+ 0, 0, 1217, 0, 1217, 1217, 1217, 0, 0, 1217,
+ 1218, 0, 1218, 1218, 1218, 1218, 1218, 0, 0, 1218,
+ 1218, 1218, 1218, 1218, 0, 0, 1218, 1219, 0, 1219,
+ 1219, 1219, 1219, 1219, 0, 0, 1219, 1219, 1219, 1219,
+ 1219, 0, 0, 1219, 1220, 0, 1220, 1220, 1220, 1220,
+ 1220, 1220, 0, 1220, 1220, 1220, 1220, 1220, 0, 0,
+
+ 1220, 1221, 0, 1221, 1221, 1221, 1221, 1221, 1221, 0,
+ 1221, 1221, 1221, 1221, 1221, 0, 0, 1221, 1222, 1222,
+ 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222,
+ 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222,
+ 1222, 1222, 1222, 1222, 1222, 1223, 0, 0, 1223, 0,
+ 0, 1223, 0, 0, 0, 0, 0, 0, 0, 1223,
+ 0, 0, 0, 1223, 0, 1223, 1223, 1223, 0, 0,
+ 1223, 1224, 0, 1224, 1224, 1224, 1224, 1224, 0, 0,
+ 1224, 1224, 1224, 1224, 1224, 0, 0, 1224, 1225, 0,
+ 1225, 1225, 1225, 1225, 1225, 0, 0, 1225, 1225, 1225,
+
+ 1225, 1225, 0, 0, 1225, 1226, 1226, 1226, 1226, 0,
+ 1226, 0, 0, 0, 0, 0, 0, 0, 0, 1226,
+ 1226, 0, 0, 1226, 0, 1226, 1226, 1226, 0, 0,
+ 1226, 1227, 1227, 1227, 1227, 0, 1227, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1227, 0, 0, 1227,
+ 0, 1227, 1227, 1227, 0, 0, 1227, 1228, 1228, 1228,
+ 1228, 0, 1228, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1228, 1228, 0, 0, 1228, 0, 1228, 1228, 1228,
+ 0, 0, 1228, 1229, 0, 0, 0, 1229, 0, 1229,
+ 1229, 1229, 0, 0, 1229, 1230, 0, 1230, 1230, 1230,
+
+ 0, 0, 1230, 1231, 0, 1231, 0, 0, 0, 1231,
+ 0, 1231, 1231, 1231, 0, 0, 1231, 1232, 0, 1232,
+ 1232, 1232, 0, 0, 1232, 1233, 0, 0, 0, 1233,
+ 0, 1233, 1233, 1233, 0, 0, 1233, 1234, 1234, 1234,
+ 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234,
+ 1234, 1234, 0, 1234, 1234, 1234, 0, 1234, 0, 0,
+ 1234, 1234, 1234, 1234, 1235, 0, 1235, 1235, 1235, 0,
+ 0, 1235, 1236, 0, 1236, 1236, 1236, 0, 0, 1236,
+ 1238, 1238, 0, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1239, 0, 0,
+ 1239, 0, 0, 0, 1239, 0, 1239, 1239, 1239, 1240,
+ 0, 1240, 0, 1240, 1240, 0, 1240, 0, 0, 1240,
+ 1240, 0, 1240, 1240, 1240, 1241, 1241, 0, 1241, 1241,
+ 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241,
+ 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241,
+ 1241, 1241, 1243, 0, 0, 1243, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1243, 0, 1243, 1243, 1243, 1244, 1244, 0, 1244, 1244,
+ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244,
+
+ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244,
+ 1244, 1244, 1245, 1245, 1245, 1245, 1245, 1246, 0, 0,
+ 1246, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1246, 1246, 1246, 1246, 1246,
+ 1247, 0, 1247, 1247, 1247, 1247, 1247, 0, 0, 1247,
+ 1247, 1247, 1247, 1247, 0, 0, 1247, 1248, 0, 1248,
+ 1248, 1248, 1248, 1248, 0, 0, 1248, 1248, 1248, 1248,
+ 1248, 0, 0, 1248, 1249, 0, 1249, 1249, 1249, 1249,
+ 1249, 1249, 0, 1249, 1249, 1249, 1249, 1249, 0, 0,
+ 1249, 1250, 0, 1250, 1250, 1250, 0, 0, 1250, 1251,
+
+ 1251, 0, 1251, 0, 0, 0, 1251, 0, 1251, 1251,
+ 1251, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252,
+ 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252,
+ 0, 1252, 0, 0, 0, 1252, 1252, 1252, 1253, 1253,
+ 1253, 1253, 0, 1253, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1253, 1253, 0, 0, 1253, 0, 1253, 1253,
+ 1253, 0, 0, 1253, 1254, 1254, 1254, 1254, 1254, 1254,
+ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 0,
+ 1254, 1254, 1254, 0, 1254, 0, 1254, 0, 1254, 1254,
+ 1254, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255,
+
+ 1255, 1255, 1255, 1255, 1255, 1255, 0, 1255, 1255, 1255,
+ 0, 1255, 0, 0, 0, 1255, 1255, 1255, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 0, 1256, 1256, 1256, 0, 1256, 0,
+ 0, 0, 1256, 1256, 1256, 1257, 1257, 1257, 1257, 1257,
+ 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257,
+ 0, 1257, 1257, 1257, 0, 1257, 0, 0, 0, 1257,
+ 1257, 1257, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258,
+ 1258, 1258, 1258, 1258, 1258, 1258, 1258, 0, 1258, 1258,
+ 1258, 0, 1258, 0, 0, 0, 1258, 1258, 1258, 1053,
+
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053,
+ 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053
+ } ;
+
+extern int commentScanYY_flex_debug;
+int commentScanYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *commentScanYYtext;
+#line 1 "commentscan.l"
+/*****************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#line 17 "commentscan.l"
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qregexp.h>
+#include <unistd.h>
+#include <qfile.h>
+
+#include "scanner.h"
+#include "entry.h"
+#include "doxygen.h"
+#include "message.h"
+#include "config.h"
+#include "util.h"
+#include "index.h"
+#include "defargs.h"
+#include "language.h"
+#include "outputlist.h"
+#include "membergroup.h"
+#include "reflist.h"
+#include "debug.h"
+#include "parserintf.h"
+
+// forward declarations
+static bool handleBrief(const QCString &);
+static bool handleFn(const QCString &);
+static bool handleDef(const QCString &);
+static bool handleOverload(const QCString &);
+static bool handleEnum(const QCString &);
+static bool handleDefGroup(const QCString &);
+static bool handleAddToGroup(const QCString &);
+static bool handleWeakGroup(const QCString &);
+static bool handleNamespace(const QCString &);
+static bool handlePackage(const QCString &);
+static bool handleClass(const QCString &);
+static bool handleHeaderFile(const QCString &);
+static bool handleProtocol(const QCString &);
+static bool handleCategory(const QCString &);
+static bool handleUnion(const QCString &);
+static bool handleStruct(const QCString &);
+static bool handleInterface(const QCString &);
+static bool handleIdlException(const QCString &);
+static bool handlePage(const QCString &);
+static bool handleMainpage(const QCString &);
+static bool handleFile(const QCString &);
+static bool handleDir(const QCString &);
+static bool handleExample(const QCString &);
+static bool handleDetails(const QCString &);
+static bool handleName(const QCString &);
+static bool handleTodo(const QCString &);
+static bool handleTest(const QCString &);
+static bool handleBug(const QCString &);
+static bool handleSubpage(const QCString &s);
+static bool handleDeprecated(const QCString &);
+static bool handleXRefItem(const QCString &);
+static bool handleRelated(const QCString &);
+static bool handleRelatedAlso(const QCString &);
+static bool handleMemberOf(const QCString &);
+static bool handleRefItem(const QCString &);
+static bool handleSection(const QCString &);
+static bool handleAnchor(const QCString &);
+static bool handleFormatBlock(const QCString &);
+static bool handleAddIndex(const QCString &);
+static bool handleIf(const QCString &);
+static bool handleIfNot(const QCString &);
+static bool handleElseIf(const QCString &);
+static bool handleElse(const QCString &);
+static bool handleEndIf(const QCString &);
+static bool handleIngroup(const QCString &);
+static bool handleNoSubGrouping(const QCString &);
+static bool handleShowInitializer(const QCString &);
+static bool handleHideInitializer(const QCString &);
+static bool handleCallgraph(const QCString &);
+static bool handleCallergraph(const QCString &);
+static bool handleInternal(const QCString &);
+static bool handleLineBr(const QCString &);
+static bool handleStatic(const QCString &);
+static bool handlePure(const QCString &);
+static bool handlePrivate(const QCString &);
+static bool handlePrivateSection(const QCString &);
+static bool handleProtected(const QCString &);
+static bool handleProtectedSection(const QCString &);
+static bool handlePublic(const QCString &s);
+static bool handlePublicSection(const QCString &s);
+static bool handleInherit(const QCString &);
+static bool handleExtends(const QCString &);
+
+typedef bool (*DocCmdFunc)(const QCString &name);
+
+struct DocCmdMap
+{
+ const char *cmdName;
+ DocCmdFunc handler;
+ bool endsBrief;
+};
+
+// map of command to handler function
+static DocCmdMap docCmdMap[] =
+{
+ // command name handler function ends brief description
+ { "brief", &handleBrief, FALSE },
+ { "short", &handleBrief, FALSE },
+ { "fn", &handleFn, FALSE },
+ { "var", &handleFn, FALSE },
+ { "typedef", &handleFn, FALSE },
+ { "property", &handleFn, FALSE },
+ { "def", &handleDef, FALSE },
+ { "overload", &handleOverload, FALSE },
+ { "enum", &handleEnum, FALSE },
+ { "defgroup", &handleDefGroup, FALSE },
+ { "addtogroup", &handleAddToGroup, FALSE },
+ { "weakgroup", &handleWeakGroup, FALSE },
+ { "namespace", &handleNamespace, FALSE },
+ { "package", &handlePackage, FALSE },
+ { "class", &handleClass, FALSE },
+ { "headerfile", &handleHeaderFile, FALSE },
+ { "protocol", &handleProtocol, FALSE },
+ { "category", &handleCategory, FALSE },
+ { "union", &handleUnion, FALSE },
+ { "struct", &handleStruct, FALSE },
+ { "interface", &handleInterface, FALSE },
+ { "idlexcept", &handleIdlException, FALSE },
+ { "page", &handlePage, FALSE },
+ { "mainpage", &handleMainpage, FALSE },
+ { "file", &handleFile, FALSE },
+ { "dir", &handleDir, FALSE },
+ { "example", &handleExample, FALSE },
+ { "details", &handleDetails, TRUE },
+ { "name", &handleName, FALSE },
+ { "todo", &handleTodo, FALSE }, // end brief will be done differently
+ { "test", &handleTest, FALSE }, // end brief will be done differently
+ { "bug", &handleBug, FALSE }, // end brief will be done differently
+ { "deprecated", &handleDeprecated, FALSE }, // end brief will be done differently
+ { "xrefitem", &handleXRefItem, FALSE }, // end brief will be done differently
+ { "related", &handleRelated, TRUE },
+ { "relates", &handleRelated, TRUE },
+ { "relatedalso", &handleRelatedAlso, TRUE },
+ { "relatesalso", &handleRelatedAlso, TRUE },
+ { "refitem", &handleRefItem, TRUE },
+ { "subpage", &handleSubpage, TRUE },
+ { "section", &handleSection, TRUE },
+ { "subsection", &handleSection, TRUE },
+ { "subsubsection", &handleSection, TRUE },
+ { "paragraph", &handleSection, TRUE },
+ { "anchor", &handleAnchor, TRUE },
+ { "verbatim", &handleFormatBlock, TRUE },
+ { "latexonly", &handleFormatBlock, FALSE },
+ { "htmlonly", &handleFormatBlock, FALSE },
+ { "xmlonly", &handleFormatBlock, FALSE },
+ { "rtfonly", &handleFormatBlock, FALSE },
+ { "manonly", &handleFormatBlock, FALSE },
+ { "dot", &handleFormatBlock, TRUE },
+ { "msc", &handleFormatBlock, TRUE },
+ { "code", &handleFormatBlock, TRUE },
+ { "addindex", &handleAddIndex, FALSE },
+ { "if", &handleIf, FALSE },
+ { "ifnot", &handleIfNot, FALSE },
+ { "elseif", &handleElseIf, FALSE },
+ { "else", &handleElse, FALSE },
+ { "endif", &handleEndIf, FALSE },
+ { "ingroup", &handleIngroup, FALSE },
+ { "nosubgrouping", &handleNoSubGrouping, FALSE },
+ { "showinitializer", &handleShowInitializer, FALSE },
+ { "hideinitializer", &handleHideInitializer, FALSE },
+ { "callgraph", &handleCallgraph, FALSE },
+ { "callergraph", &handleCallergraph, FALSE },
+ { "internal", &handleInternal, TRUE },
+ { "_linebr", &handleLineBr, FALSE },
+ { "static", &handleStatic, FALSE },
+ { "pure", &handlePure, FALSE },
+ { "private", &handlePrivate, FALSE },
+ { "privatesection", &handlePrivateSection, FALSE },
+ { "protected", &handleProtected, FALSE },
+ { "protectedsection",&handleProtectedSection, FALSE },
+ { "public", &handlePublic, FALSE },
+ { "publicsection", &handlePublicSection, FALSE },
+ { "inherit", &handleInherit, TRUE },
+ { "extends", &handleExtends, TRUE },
+ { "implements", &handleExtends, TRUE },
+ { "memberof", &handleMemberOf, TRUE },
+ { "arg", 0, TRUE },
+ { "attention", 0, TRUE },
+ { "author", 0, TRUE },
+ { "authors", 0, TRUE },
+ { "copydoc", 0, TRUE },
+ { "copybrief", 0, FALSE },
+ { "copydetails", 0, TRUE },
+ { "date", 0, TRUE },
+ { "dotfile", 0, TRUE },
+ { "htmlinclude", 0, FALSE },
+ { "image", 0, TRUE },
+ { "include", 0, TRUE },
+ { "includelineno", 0, TRUE },
+ { "invariant", 0, TRUE },
+ { "li", 0, TRUE },
+ { "line", 0, TRUE },
+ { "note", 0, TRUE },
+ { "par", 0, TRUE },
+ { "param", 0, TRUE },
+ { "tparam", 0, TRUE },
+ { "post", 0, TRUE },
+ { "pre", 0, TRUE },
+ { "remark", 0, TRUE },
+ { "remarks", 0, TRUE },
+ { "result", 0, TRUE },
+ { "return", 0, TRUE },
+ { "returns", 0, TRUE },
+ { "retval", 0, TRUE },
+ { "sa", 0, TRUE },
+ { "see", 0, TRUE },
+ { "since", 0, TRUE },
+ { "throw", 0, TRUE },
+ { "throws", 0, TRUE },
+ { "until", 0, TRUE },
+ { "verbinclude", 0, FALSE },
+ { "version", 0, TRUE },
+ { "warning", 0, TRUE },
+ { 0, 0, FALSE }
+};
+
+/** @brief Command mapper.
+ *
+ * Maps a command name (as found in a comment block) onto a
+ * specific handler function.
+ */
+class DocCmdMapper
+{
+ public:
+ struct Cmd
+ {
+ DocCmdFunc func;
+ bool endsBrief;
+ };
+
+ /** maps a command name to a handler function */
+ static Cmd *map(const char *name)
+ {
+ return instance()->find(name);
+ }
+
+ /** release the singleton */
+ static void freeInstance()
+ {
+ delete s_instance; s_instance=0;
+ }
+
+ private:
+ static DocCmdMapper *instance()
+ {
+ if (s_instance==0) s_instance = new DocCmdMapper;
+ return s_instance;
+ }
+
+ DocCmdMapper() : m_map(113)
+ {
+ m_map.setAutoDelete(TRUE);
+ DocCmdMap *p = docCmdMap;
+ while (p->cmdName)
+ {
+ if (m_map.find(p->cmdName)!=0)
+ {
+ printf("Error: DocCmdMapper: command %s already added\n",p->cmdName);
+ exit(1);
+ }
+ Cmd *cmd = new Cmd;
+ cmd->func = p->handler;
+ cmd->endsBrief = p->endsBrief;
+ m_map.insert(p->cmdName,cmd);
+ p++;
+ }
+ }
+
+ Cmd *find(const char *name)
+ {
+ return m_map.find(name);
+ }
+ QDict<Cmd> m_map;
+ static DocCmdMapper *s_instance;
+};
+
+DocCmdMapper *DocCmdMapper::s_instance=0;
+
+
+#define YY_NEVER_INTERACTIVE 1
+
+enum XRefKind
+{
+ XRef_Item,
+ XRef_Todo,
+ XRef_Test,
+ XRef_Bug,
+ XRef_Deprecated,
+ XRef_None
+};
+
+enum OutputContext
+{
+ OutputDoc,
+ OutputBrief,
+ OutputXRef,
+ OutputInbody
+};
+
+enum GuardType
+{
+ Guard_If,
+ Guard_IfNot,
+ Guard_Skip
+};
+
+class GuardedSection
+{
+ public:
+ GuardedSection(bool enabled,bool parentVisible)
+ : m_enabled(enabled),m_parentVisible(parentVisible) {}
+ bool isEnabled() const { return m_enabled; }
+ bool parentVisible() const { return m_parentVisible; }
+
+ private:
+ bool m_enabled;
+ bool m_parentVisible;
+};
+
+void openGroup(Entry *e,const char *file,int line);
+void closeGroup(Entry *e,const char *file,int line,bool foundInline=FALSE);
+void initGroupInfo(Entry *e);
+static void groupAddDocs(Entry *e,const char *fileName);
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+
+static ParserInterface *langParser; // the language parser that is calling us
+static QCString inputString; // input string
+static int inputPosition; // read pointer
+static QCString yyFileName; // file name that is read from
+static int yyLineNr; // line number in the input
+static bool inBody; // was the comment found inside the body of a function?
+static OutputContext inContext; // are we inside the brief, details or xref part
+static bool briefEndsAtDot; // does the brief description stop at a dot?
+static QCString formulaText; // Running text of a formula
+static QCString formulaEnv; // environment name
+static int formulaNewLines; // amount of new lines in the formula
+static QCString *pOutputString; // pointer to string to which the output is appended.
+static QCString outputXRef; // temp argument of todo/test/../xrefitem commands
+static QCString blockName; // preformatted block name (e.g. verbatim, latexonly,...)
+static XRefKind xrefKind; // kind of cross-reference command
+static XRefKind newXRefKind; //
+static GuardType guardType; // kind of guard for conditional section
+static bool enabledSectionFound;
+static QCString functionProto; // function prototype
+static QStack<GuardedSection> guards; // tracks nested conditional sections (if,ifnot,..)
+static Entry* current = 0 ; // working entry
+//static Entry* current_root = 0 ; // parent of working entry
+
+
+//static Entry* previous = 0 ; // TODO: remove need for this
+static bool needNewEntry;
+
+static QCString sectionLabel;
+static QCString sectionTitle;
+static QCString xrefItemKey;
+static QCString newXRefItemKey;
+static QCString xrefItemTitle;
+static QCString xrefListTitle;
+static Protection protection;
+
+static bool xrefAppendFlag;
+static bool inGroupParamFound;
+static int braceCount;
+static bool insidePre;
+static bool parseMore;
+static int g_condCount;
+static int g_sectionLevel;
+
+static int g_commentCount;
+
+//-----------------------------------------------------------------------------
+
+static QStack<Grouping> g_autoGroupStack;
+static int g_memberGroupId = DOX_NOGROUP;
+static QCString g_memberGroupHeader;
+static QCString g_memberGroupDocs;
+static QCString g_memberGroupRelates;
+static QCString g_compoundName;
+
+//-----------------------------------------------------------------------------
+
+static void initParser()
+{
+ sectionLabel.resize(0);
+ sectionTitle.resize(0);
+ g_memberGroupHeader.resize(0);
+}
+
+//-----------------------------------------------------------------------------
+
+static QCString getDocSectionName(int s)
+{
+ switch(s)
+ {
+ case Entry::CLASSDOC_SEC: return "\\class";
+ case Entry::STRUCTDOC_SEC: return "\\struct";
+ case Entry::UNIONDOC_SEC: return "\\union";
+ case Entry::EXCEPTIONDOC_SEC: return "\\exception";
+ case Entry::NAMESPACEDOC_SEC: return "\\namespace";
+ case Entry::PROTOCOLDOC_SEC: return "\\protocol";
+ case Entry::CATEGORYDOC_SEC: return "\\category";
+ case Entry::ENUMDOC_SEC: return "\\enum";
+ case Entry::PAGEDOC_SEC: return "\\page";
+ case Entry::VARIABLEDOC_SEC: return "\\var";
+ case Entry::MEMBERDOC_SEC: return "\\fn";
+ case Entry::OVERLOADDOC_SEC: return "\\overload";
+ case Entry::FILEDOC_SEC: return "\\file";
+ case Entry::DEFINEDOC_SEC: return "\\def";
+ case Entry::GROUPDOC_SEC: return "\\defgroup";
+ case Entry::MAINPAGEDOC_SEC: return "\\mainpage";
+ case Entry::PACKAGEDOC_SEC: return "\\package";
+ case Entry::DIRDOC_SEC: return "\\dir";
+ case Entry::EXAMPLE_SEC: return "\\example";
+ case Entry::MEMBERGRP_SEC: return "\\name";
+ default: return "";
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+static bool makeStructuralIndicator(Entry::Sections s)
+{
+ //printf("current->section=%x\n",current->section);
+ if (!getDocSectionName(current->section).isEmpty())
+ {
+ return TRUE;
+ }
+ else
+ {
+ needNewEntry = TRUE;
+ current->section = s;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ return FALSE;
+ }
+}
+
+static void lineCount()
+{
+ for( const char* c = commentScanYYtext ; *c ; ++c )
+ yyLineNr += (*c == '\n') ;
+}
+
+
+static QCString stripQuotes(const char *s)
+{
+ QCString name;
+ if (s==0 || *s==0) return name;
+ name=s;
+ if (name.at(0)=='"' && name.at(name.length()-1)=='"')
+ {
+ name=name.mid(1,name.length()-2);
+ }
+ return name;
+}
+
+//-----------------------------------------------------------------
+
+static void addXRefItem(const char *listName,const char *itemTitle,
+ const char *listTitle,bool append)
+{
+ Entry *docEntry = current; // inBody && previous ? previous : current;
+ if (listName==0) return;
+ //printf("addXRefItem(%s,%s,%s,%d)\n",listName,itemTitle,listTitle,append);
+
+ ListItemInfo *lii=0;
+ RefList *refList = Doxygen::xrefLists->find(listName);
+ if (refList==0) // new list
+ {
+ refList = new RefList(listName,listTitle,itemTitle);
+ Doxygen::xrefLists->insert(listName,refList);
+ //printf("new list!\n");
+ }
+ if (docEntry->sli)
+ {
+ QListIterator<ListItemInfo> slii(*docEntry->sli);
+ for (slii.toFirst();(lii=slii.current());++slii)
+ {
+ if (strcmp(lii->type,listName)==0)
+ {
+ //printf("found %s lii->type=%s\n",listName,lii->type);
+ break;
+ }
+ }
+ }
+ if (lii && append) // already found item of same type just before this one
+ {
+ //printf("listName=%s item id = %d existing\n",listName,lii->itemId);
+ RefItem *item = refList->getRefItem(lii->itemId);
+ ASSERT(item!=0);
+ item->text += " <p>";
+ item->text += outputXRef;
+ //printf("%s: text +=%s\n",listName,item->text.data());
+ }
+ else // new item
+ {
+ int itemId = refList->addRefItem();
+ //printf("listName=%s item id = %d new current=%p\n",listName,itemId,current);
+
+ // if we have already an item from the same list type (e.g. a second @todo)
+ // in the same Entry (i.e. lii!=0) then we reuse its link anchor.
+ char anchorLabel[1024];
+ //sprintf(anchorLabel,"_%s%06d",listName,lii ? lii->itemId : itemId);
+ sprintf(anchorLabel,"_%s%06d",listName,itemId);
+ RefItem *item = refList->getRefItem(itemId);
+ ASSERT(item!=0);
+ item->text = outputXRef;
+ item->listAnchor = anchorLabel;
+ docEntry->addSpecialListItem(listName,itemId);
+ QCString cmdString;
+ cmdString.sprintf("\\xrefitem %s %d.",listName,itemId);
+ if (inBody)
+ {
+ docEntry->inbodyDocs += cmdString;
+ }
+ else
+ {
+ docEntry->doc += cmdString;
+ }
+ SectionInfo *si=new SectionInfo(listName,anchorLabel,
+ sectionTitle,SectionInfo::Anchor);
+ Doxygen::sectionDict.insert(anchorLabel,si);
+ docEntry->anchors->append(si);
+ }
+ outputXRef.resize(0);
+}
+
+//-----------------------------------------------------------------------------
+
+// Adds a formula text to the list/dictionary of formulas if it was
+// not already added. Returns the label of the formula.
+static QCString addFormula()
+{
+ QCString formLabel;
+ QCString fText=formulaText.simplifyWhiteSpace();
+ Formula *f=0;
+ if ((f=Doxygen::formulaDict[fText])==0)
+ {
+ f = new Formula(fText);
+ Doxygen::formulaList.append(f);
+ Doxygen::formulaDict.insert(fText,f);
+ formLabel.sprintf("\\form#%d",f->getId());
+ Doxygen::formulaNameDict.insert(formLabel,f);
+ }
+ else
+ {
+ formLabel.sprintf("\\form#%d",f->getId());
+ }
+ int i;
+ for (i=0;i<formulaNewLines;i++) formLabel+="\\_fakenl"; // add fake newlines to
+ // keep the warnings
+ // correctly aligned.
+ return formLabel;
+}
+
+//-----------------------------------------------------------------------------
+
+static void checkFormula();
+//-----------------------------------------------------------------------------
+
+static void addSection()
+{
+ sectionTitle+=commentScanYYtext;
+ sectionTitle=sectionTitle.stripWhiteSpace();
+ //printf("Adding new section file=%s label=%s title=%s\n",yyFileName,sectionLabel.data(),sectionTitle.data());
+ SectionInfo *si = new SectionInfo(yyFileName,sectionLabel,sectionTitle,SectionInfo::Anchor);
+ current->anchors->append(si);
+ Doxygen::sectionDict.insert(commentScanYYtext,si);
+}
+
+//-----------------------------------------------------------------------------
+
+// strip trailing whitespace (excluding newlines) from string s
+static void stripTrailingWhiteSpace(QCString &s)
+{
+ uint len = s.length();
+ int i = (int)len-1;
+ char c;
+ while (i>=0 && ((c = s.at(i))==' ' || c=='\t' || c=='\r')) i--;
+ if (i!=(int)len-1)
+ {
+ s.resize(i+2); // string upto and including char at pos i and \0 terminator
+ }
+}
+
+// selects the output to write to
+static inline void setOutput(OutputContext ctx)
+{
+ bool xrefAppendToPrev = xrefAppendFlag;
+ // determine append flag for the next item (i.e. the end of this item)
+ xrefAppendFlag = !inBody &&
+ inContext==OutputXRef && ctx==OutputXRef && // two consecutive xref items
+ newXRefKind==xrefKind && // of the same kind
+ (xrefKind!=XRef_Item ||
+ newXRefItemKey==xrefItemKey); // with the same key if \xrefitem
+ //printf("%d && %d && %d && (%d || %d)\n",
+ // inContext==OutputXRef,
+ // ctx==OutputXRef,
+ // newXRefKind==xrefKind,
+ // xrefKind!=XRef_Item,
+ // newXRefItemKey==xrefItemKey);
+
+ //printf("refKind=%d newXRefKind=%d xrefAppendToPrev=%d xrefAppendFlag=%d\n",
+ // xrefKind,newXRefKind,xrefAppendToPrev,xrefAppendFlag);
+
+ //printf("setOutput(inContext=%d ctx=%d)\n",inContext,ctx);
+ if (inContext==OutputXRef) // end of XRef section => add the item
+ {
+ // See if we can append this new xref item to the previous one.
+ // We know this at the start of the next item of the same
+ // type and need to remember this until the end of that item.
+ switch(xrefKind)
+ {
+ case XRef_Todo:
+ addXRefItem("todo",
+ theTranslator->trTodo(),
+ theTranslator->trTodoList(),
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_Test:
+ addXRefItem("test",
+ theTranslator->trTest(),
+ theTranslator->trTestList(),
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_Bug:
+ addXRefItem("bug",
+ theTranslator->trBug(),
+ theTranslator->trBugList(),
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_Deprecated:
+ addXRefItem("deprecated",
+ theTranslator->trDeprecated(),
+ theTranslator->trDeprecatedList(),
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_Item: // user defined list
+ addXRefItem(xrefItemKey,
+ xrefItemTitle,
+ xrefListTitle,
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_None:
+ ASSERT(0);
+ break;
+ }
+ }
+ xrefItemKey = newXRefItemKey;
+
+ int oldContext = inContext;
+ inContext = ctx;
+ if (inContext!=OutputXRef && inBody) inContext=OutputInbody;
+ switch(inContext)
+ {
+ case OutputDoc:
+ if (oldContext!=inContext)
+ {
+ stripTrailingWhiteSpace(current->doc);
+ if (current->docFile.isEmpty())
+ {
+ current->docFile = yyFileName;
+ current->docLine = yyLineNr;
+ }
+ }
+ pOutputString = &current->doc;
+ break;
+ case OutputBrief:
+ if (oldContext!=inContext)
+ {
+ if (current->briefFile.isEmpty())
+ {
+ current->briefFile = yyFileName;
+ current->briefLine = yyLineNr;
+ }
+ }
+ if (current->brief.stripWhiteSpace().isEmpty()) // we only want one brief
+ // description even if multiple
+ // are given...
+ {
+ pOutputString = &current->brief;
+ }
+ else
+ {
+ pOutputString = &current->doc;
+ inContext = OutputDoc; // need to switch to detailed docs, see bug 631380
+ }
+ break;
+ case OutputXRef:
+ pOutputString = &outputXRef;
+ // first item found, so can't append to previous
+ //xrefAppendFlag = FALSE;
+ break;
+ case OutputInbody:
+ pOutputString = &current->inbodyDocs;
+ break;
+ }
+}
+
+// add a string to the output
+static inline void addOutput(const char *s)
+{
+ *pOutputString+=s;
+}
+
+// add a character to the output
+static inline void addOutput(char c)
+{
+ *pOutputString+=c;
+}
+
+static void endBrief(bool addToOutput=TRUE)
+{
+ if (!current->brief.stripWhiteSpace().isEmpty())
+ { // only go to the detailed description if we have
+ // found some brief description and not just whitespace
+ briefEndsAtDot=FALSE;
+ setOutput(OutputDoc);
+ if (addToOutput) addOutput(commentScanYYtext);
+ }
+}
+
+/* ----------------------------------------------------------------- */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int prevPosition=0;
+
+static int yyread(char *buf,int max_size)
+{
+ prevPosition=inputPosition;
+ int c=0;
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ //printf("%d (%c)\n",*buf,*buf);
+ c++; buf++;
+ }
+ return c;
+}
+
+/* start command character */
+/* comment parsing states. */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 3443 "<stdout>"
+
+#define INITIAL 0
+#define Comment 1
+#define PageDocArg1 2
+#define PageDocArg2 3
+#define RelatesParam1 4
+#define ClassDocArg1 5
+#define ClassDocArg2 6
+#define ClassDocArg3 7
+#define CategoryDocArg1 8
+#define XRefItemParam1 9
+#define XRefItemParam2 10
+#define XRefItemParam3 11
+#define FileDocArg1 12
+#define EnumDocArg1 13
+#define NameSpaceDocArg1 14
+#define PackageDocArg1 15
+#define GroupDocArg1 16
+#define GroupDocArg2 17
+#define SectionLabel 18
+#define SectionTitle 19
+#define SubpageLabel 20
+#define SubpageTitle 21
+#define FormatBlock 22
+#define LineParam 23
+#define GuardParam 24
+#define GuardParamEnd 25
+#define SkipGuardedSection 26
+#define SkipInternal 27
+#define NameParam 28
+#define InGroupParam 29
+#define FnParam 30
+#define OverloadParam 31
+#define InheritParam 32
+#define ExtendsParam 33
+#define ReadFormulaShort 34
+#define ReadFormulaLong 35
+#define AnchorLabel 36
+#define HtmlComment 37
+#define SkipLang 38
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int commentScanYYlex_destroy (void );
+
+int commentScanYYget_debug (void );
+
+void commentScanYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE commentScanYYget_extra (void );
+
+void commentScanYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *commentScanYYget_in (void );
+
+void commentScanYYset_in (FILE * in_str );
+
+FILE *commentScanYYget_out (void );
+
+void commentScanYYset_out (FILE * out_str );
+
+yy_size_t commentScanYYget_leng (void );
+
+char *commentScanYYget_text (void );
+
+int commentScanYYget_lineno (void );
+
+void commentScanYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int commentScanYYwrap (void );
+#else
+extern int commentScanYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( commentScanYYtext, commentScanYYleng, 1, commentScanYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( commentScanYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( commentScanYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, commentScanYYin))==0 && ferror(commentScanYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(commentScanYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int commentScanYYlex (void);
+
+#define YY_DECL int commentScanYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after commentScanYYtext and commentScanYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( commentScanYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (commentScanYYtext[commentScanYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 865 "commentscan.l"
+
+
+ /* What can happen in while parsing a comment block:
+ * commands (e.g. @page, or \page)
+ * escaped commands (e.g. @@page or \\page).
+ * formulas (e.g. \f$ \f[ \f{..)
+ * directories (e.g. \doxygen\src\)
+ * autolist end. (e.g. a dot on an otherwise empty line)
+ * newlines.
+ * end of brief description due to blank line.
+ * end of brief description due to some command (@command, or <command>).
+ * words and whitespace and other characters (#,?!, etc).
+ * grouping commands (e.g. @{ and @})
+ * language switch (e.g. \~english or \~).
+ * mail adress (e.g. dimitri@stack.nl).
+ * quoted text, such as "foo@bar"
+ * XML commands, <summary></summary><remarks></remarks>
+ */
+
+#line 3686 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)commentScanYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in commentScanYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! commentScanYYin )
+ commentScanYYin = stdin;
+
+ if ( ! commentScanYYout )
+ commentScanYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ commentScanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ commentScanYY_create_buffer(commentScanYYin,YY_BUF_SIZE );
+ }
+
+ commentScanYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of commentScanYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1054 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 7500 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 884 "commentscan.l"
+{ // escaped command
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 887 "commentscan.l"
+{ // escaped command
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 890 "commentscan.l"
+{ // mail adress
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 893 "commentscan.l"
+{ // quoted text
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 896 "commentscan.l"
+{ // directory (or chain of commands!)
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 6:
+/* rule 6 can match eol */
+YY_RULE_SETUP
+#line 899 "commentscan.l"
+{ // xref command
+ if (inContext!=OutputXRef)
+ {
+ briefEndsAtDot=FALSE;
+ setOutput(OutputDoc);
+ }
+ // continue with the same input
+ REJECT;
+ }
+ YY_BREAK
+/*
+<Comment>{DETAILEDCMD}/[^a-z_A-Z]* { // command that can end a brief description
+ briefEndsAtDot=FALSE;
+ setOutput(OutputDoc);
+ // continue with the same input
+ REJECT;
+ }
+ */
+case 7:
+YY_RULE_SETUP
+#line 916 "commentscan.l"
+{ // HTML command that ends a brief description
+ setOutput(OutputDoc);
+ // continue with the same input
+ REJECT;
+ }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 921 "commentscan.l"
+{ // start of a .NET XML style brief description
+ setOutput(OutputBrief);
+ }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 924 "commentscan.l"
+{ // start of a .NET XML style detailed description
+ setOutput(OutputDoc);
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 927 "commentscan.l"
+{ // end of a brief or detailed description
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 929 "commentscan.l"
+{ // RCS tag which end a brief description
+ setOutput(OutputDoc);
+ REJECT;
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 933 "commentscan.l"
+{
+ BEGIN(HtmlComment);
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 936 "commentscan.l"
+{
+ warn(yyFileName,yyLineNr,
+ "warning: found \\endinternal without matching \\internal"
+ );
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 941 "commentscan.l"
+{ // potentially interesting command
+ // the {B}* in the front was added for bug620924
+ QCString cmdName = QCString(commentScanYYtext).stripWhiteSpace().data()+1;
+ DocCmdMapper::Cmd *cmdPtr = DocCmdMapper::map(cmdName);
+ if (cmdPtr) // special action is required
+ {
+ if (cmdPtr->endsBrief)
+ {
+ briefEndsAtDot=FALSE;
+ // this command forces the end of brief description
+ setOutput(OutputDoc);
+ }
+ if (cmdPtr->func && cmdPtr->func(cmdName))
+ {
+ // implicit split of the comment block into two
+ // entries. Restart the next block at the start
+ // of this command.
+ parseMore=TRUE;
+
+ // yuk, this is probably not very portable across lex implementations,
+ // but we need to know the position in the input buffer where this
+ // rule matched.
+ // for flex 2.5.33+ we should use YY_CURRENT_BUFFER_LVALUE
+#if YY_FLEX_MINOR_VERSION>=5 && YY_FLEX_SUBMINOR_VERSION>=33
+ inputPosition=prevPosition + yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+#else
+ inputPosition=prevPosition + yy_bp - yy_current_buffer->yy_ch_buf;
+#endif
+ yyterminate();
+ }
+ else if (cmdPtr->func==0)
+ {
+ // command without handler, to be processed
+ // later by parsedoc.cpp
+ addOutput(commentScanYYtext);
+ }
+ }
+ else // command not relevant
+ {
+ addOutput(commentScanYYtext);
+ }
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 983 "commentscan.l"
+{ // escaped formula command
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 986 "commentscan.l"
+{ // language switch command
+ QCString langId = QString(commentScanYYtext).stripWhiteSpace().data()+2;
+ if (!langId.isEmpty() &&
+ stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0)
+ { // enable language specific section
+ BEGIN(SkipLang);
+ }
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 994 "commentscan.l"
+{ // start of a formula with custom environment
+ formulaText="\\begin";
+ formulaEnv=QString(commentScanYYtext).stripWhiteSpace().data()+2;
+ if (formulaEnv.at(formulaEnv.length()-1)=='{')
+ {
+ // remove trailing open brace
+ formulaEnv=formulaEnv.left(formulaEnv.length()-1);
+ }
+ formulaText+=formulaEnv;
+ formulaNewLines=0;
+ BEGIN(ReadFormulaLong);
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 1006 "commentscan.l"
+{ // start of a inline formula
+ formulaText="$";
+ formulaNewLines=0;
+ BEGIN(ReadFormulaShort);
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 1011 "commentscan.l"
+{ // start of a block formula
+ formulaText="\\[";
+ formulaNewLines=0;
+ BEGIN(ReadFormulaLong);
+ }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 1016 "commentscan.l"
+{ // begin of a group
+ //langParser->handleGroupStartCommand(g_memberGroupHeader);
+ openGroup(current,yyFileName,yyLineNr);
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 1020 "commentscan.l"
+{ // end of a group
+ //langParser->handleGroupEndCommand();
+ closeGroup(current,yyFileName,yyLineNr,TRUE);
+ g_memberGroupHeader.resize(0);
+ parseMore=TRUE;
+ needNewEntry = TRUE;
+#if YY_FLEX_MINOR_VERSION>=5 && YY_FLEX_SUBMINOR_VERSION>=33
+ inputPosition=prevPosition + yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + strlen(commentScanYYtext);
+#else
+ inputPosition=prevPosition + yy_bp - yy_current_buffer->yy_ch_buf + strlen(commentScanYYtext);
+#endif
+ yyterminate();
+ }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 1033 "commentscan.l"
+{ // escaped character
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 1036 "commentscan.l"
+{ // normal word
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 24:
+/* rule 24 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1039 "commentscan.l"
+{ // explicit end autolist: e.g " ."
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 1042 "commentscan.l"
+{ // start of autolist
+ setOutput(OutputDoc);
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 1046 "commentscan.l"
+{ // . at start or in the middle of a word, or ellipsis
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 1049 "commentscan.l"
+{ // . with escaped space.
+ addOutput(commentScanYYtext[0]);
+ addOutput(commentScanYYtext[2]);
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 1053 "commentscan.l"
+{ // . with comma such as "e.g.,"
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 1056 "commentscan.l"
+{ // ellipsis with escaped space.
+ addOutput("... ");
+ }
+ YY_BREAK
+case 30:
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1059 "commentscan.l"
+{ // internal ellipsis
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+#line 1062 "commentscan.l"
+{ // at least one blank line (or blank line command)
+ if (inContext==OutputXRef)
+ {
+ // see bug 613024, we need to put the newlines after ending the XRef section.
+ setOutput(OutputDoc);
+ addOutput("\n\n");
+ }
+ else if (inContext!=OutputBrief)
+ {
+ addOutput("\n\n");
+ setOutput(OutputDoc);
+ }
+ else // inContext==OutputBrief
+ { // only go to the detailed description if we have
+ // found some brief description and not just whitespace
+ endBrief(FALSE);
+ }
+ lineCount();
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 1081 "commentscan.l"
+{ // potential end of a JavaDoc style comment
+ addOutput(*commentScanYYtext);
+ if (briefEndsAtDot)
+ {
+ setOutput(OutputDoc);
+ briefEndsAtDot=FALSE;
+ }
+ }
+ YY_BREAK
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+#line 1089 "commentscan.l"
+{ // newline
+ addOutput(*commentScanYYtext);
+ yyLineNr++;
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 1093 "commentscan.l"
+{ // catch-all for anything else
+ addOutput(*commentScanYYtext);
+ }
+ YY_BREAK
+/* -------------- Rules for handling HTML comments ----------- */
+case 35:
+YY_RULE_SETUP
+#line 1100 "commentscan.l"
+{ BEGIN( Comment ); }
+ YY_BREAK
+case 36:
+/* rule 36 can match eol */
+YY_RULE_SETUP
+#line 1101 "commentscan.l"
+{
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 1104 "commentscan.l"
+{ // ignore unimportant characters
+ }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 1106 "commentscan.l"
+{ // ignore every else
+ }
+ YY_BREAK
+/* -------------- Rules for handling formulas ---------------- */
+case 39:
+YY_RULE_SETUP
+#line 1111 "commentscan.l"
+{ // end of inline formula
+ formulaText+="$";
+ addOutput(" "+addFormula());
+ BEGIN(Comment);
+ }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 1116 "commentscan.l"
+{ // end of block formula
+ formulaText+="\\]";
+ addOutput(" "+addFormula());
+ BEGIN(Comment);
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 1121 "commentscan.l"
+{ // end of custom env formula
+ formulaText+="\\end";
+ formulaText+=formulaEnv;
+ addOutput(" "+addFormula());
+ BEGIN(Comment);
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 1127 "commentscan.l"
+{ // any non-special character
+ formulaText+=commentScanYYtext;
+ }
+ YY_BREAK
+case 43:
+/* rule 43 can match eol */
+YY_RULE_SETUP
+#line 1130 "commentscan.l"
+{ // new line
+ formulaNewLines++;
+ formulaText+=*commentScanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 1135 "commentscan.l"
+{ // any othe character
+ formulaText+=*commentScanYYtext;
+ }
+ YY_BREAK
+/* ------------ handle argument of enum command --------------- */
+case 45:
+/* rule 45 can match eol */
+YY_RULE_SETUP
+#line 1141 "commentscan.l"
+{ // handle argument
+ current->name = commentScanYYtext;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 46:
+/* rule 46 can match eol */
+YY_RULE_SETUP
+#line 1145 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 47:
+/* rule 47 can match eol */
+YY_RULE_SETUP
+#line 1149 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after \\enum."
+ );
+ addOutput('\n');
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 1157 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+/* ------------ handle argument of namespace command --------------- */
+case 49:
+/* rule 49 can match eol */
+YY_RULE_SETUP
+#line 1162 "commentscan.l"
+{ // handle argument
+ current->name = substitute(commentScanYYtext,".","::");
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 50:
+/* rule 50 can match eol */
+YY_RULE_SETUP
+#line 1166 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 51:
+/* rule 51 can match eol */
+YY_RULE_SETUP
+#line 1170 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after "
+ "\\namespace."
+ );
+ addOutput('\n');
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 1179 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+/* ------------ handle argument of package command --------------- */
+case 53:
+YY_RULE_SETUP
+#line 1184 "commentscan.l"
+{ // handle argument
+ current->name = commentScanYYtext;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 54:
+/* rule 54 can match eol */
+YY_RULE_SETUP
+#line 1188 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 55:
+/* rule 55 can match eol */
+YY_RULE_SETUP
+#line 1192 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after "
+ "\\package."
+ );
+ addOutput('\n');
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 1201 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+/* ------ handle argument of class/struct/union command --------------- */
+case 57:
+/* rule 57 can match eol */
+YY_RULE_SETUP
+#line 1206 "commentscan.l"
+{ // first argument
+ current->name = substitute(commentScanYYtext,".","::");
+ if (current->section==Entry::PROTOCOLDOC_SEC)
+ {
+ current->name+="-p";
+ }
+ // prepend outer scope name
+ BEGIN( ClassDocArg2 );
+ }
+ YY_BREAK
+case 58:
+/* rule 58 can match eol */
+YY_RULE_SETUP
+#line 1215 "commentscan.l"
+{
+ current->name = substitute(commentScanYYtext,".","::");
+ BEGIN( ClassDocArg2 );
+ }
+ YY_BREAK
+case 59:
+/* rule 59 can match eol */
+YY_RULE_SETUP
+#line 1219 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 60:
+/* rule 60 can match eol */
+YY_RULE_SETUP
+#line 1223 "commentscan.l"
+{
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after "
+ "\\%s.",YY_START==ClassDocArg1?"class":"category"
+ );
+ addOutput('\n');
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 1232 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 1235 "commentscan.l"
+{ // second argument; include file
+ current->includeFile = commentScanYYtext;
+ BEGIN( ClassDocArg3 );
+ }
+ YY_BREAK
+case 63:
+/* rule 63 can match eol */
+YY_RULE_SETUP
+#line 1239 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 64:
+/* rule 64 can match eol */
+YY_RULE_SETUP
+#line 1243 "commentscan.l"
+{
+ addOutput('\n');
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 1248 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 1251 "commentscan.l"
+{ // third argument; include file name
+ current->includeName = commentScanYYtext;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 67:
+/* rule 67 can match eol */
+YY_RULE_SETUP
+#line 1255 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 68:
+/* rule 68 can match eol */
+YY_RULE_SETUP
+#line 1259 "commentscan.l"
+{
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 1263 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+/* --------- handle arguments of {def,add,weak}group commands --------- */
+case 70:
+YY_RULE_SETUP
+#line 1268 "commentscan.l"
+{ // group name
+ current->name = commentScanYYtext;
+ //lastDefGroup.groupname = commentScanYYtext;
+ //lastDefGroup.pri = current->groupingPri();
+ // the .html stuff is for Qt compatibility
+ if (current->name.right(5)==".html")
+ {
+ current->name=current->name.left(current->name.length()-5);
+ }
+ current->type.resize(0);
+ BEGIN(GroupDocArg2);
+ }
+ YY_BREAK
+case 71:
+/* rule 71 can match eol */
+YY_RULE_SETUP
+#line 1280 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 72:
+/* rule 72 can match eol */
+YY_RULE_SETUP
+#line 1284 "commentscan.l"
+{ // missing argument!
+ warn(yyFileName,yyLineNr,
+ "warning: missing group name after %s",
+ current->groupDocCmd()
+ );
+ addOutput('\n');
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 73:
+/* rule 73 can match eol */
+YY_RULE_SETUP
+#line 1293 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 1297 "commentscan.l"
+{ // title (stored in type)
+ current->type += commentScanYYtext;
+ current->type = current->type.stripWhiteSpace();
+ }
+ YY_BREAK
+case 75:
+/* rule 75 can match eol */
+YY_RULE_SETUP
+#line 1301 "commentscan.l"
+{
+ if ( current->groupDocType==Entry::GROUPDOC_NORMAL &&
+ current->type.isEmpty()
+ ) // defgroup requires second argument
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: missing title after "
+ "\\defgroup %s", current->name.data()
+ );
+ }
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+/* --------- handle arguments of page/mainpage command ------------------- */
+case 76:
+YY_RULE_SETUP
+#line 1318 "commentscan.l"
+{ // first argument; page name
+ current->name = stripQuotes(commentScanYYtext);
+ BEGIN( PageDocArg2 );
+ }
+ YY_BREAK
+case 77:
+/* rule 77 can match eol */
+YY_RULE_SETUP
+#line 1322 "commentscan.l"
+{ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 78:
+/* rule 78 can match eol */
+YY_RULE_SETUP
+#line 1325 "commentscan.l"
+{
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after "
+ "\\page."
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 1334 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+case 80:
+/* rule 80 can match eol */
+YY_RULE_SETUP
+#line 1336 "commentscan.l"
+{ // second argument; page title
+ yyLineNr++;
+ current->args = commentScanYYtext;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+/* --------- handle arguments of the file/dir/example command ------------ */
+case 81:
+/* rule 81 can match eol */
+YY_RULE_SETUP
+#line 1345 "commentscan.l"
+{ // no file name specfied
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 1350 "commentscan.l"
+{ // first argument; name
+ current->name = stripQuotes(commentScanYYtext);
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 83:
+/* rule 83 can match eol */
+YY_RULE_SETUP
+#line 1354 "commentscan.l"
+{ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 1357 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+/* --------- handle arguments of the xrefitem command ------------ */
+case 85:
+YY_RULE_SETUP
+#line 1362 "commentscan.l"
+{ // first argument
+ newXRefItemKey=commentScanYYtext;
+ setOutput(OutputXRef);
+ BEGIN(XRefItemParam2);
+ }
+ YY_BREAK
+case 86:
+/* rule 86 can match eol */
+YY_RULE_SETUP
+#line 1367 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 87:
+/* rule 87 can match eol */
+YY_RULE_SETUP
+#line 1371 "commentscan.l"
+{ // missing arguments
+ warn(yyFileName,yyLineNr,
+ "warning: Missing first argument of \\xrefitem"
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ inContext = OutputDoc;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 1380 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 1383 "commentscan.l"
+{ // second argument
+ xrefItemTitle = stripQuotes(commentScanYYtext);
+ BEGIN(XRefItemParam3);
+ }
+ YY_BREAK
+case 90:
+/* rule 90 can match eol */
+YY_RULE_SETUP
+#line 1387 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 91:
+/* rule 91 can match eol */
+YY_RULE_SETUP
+#line 1391 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: Missing second argument of \\xrefitem"
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ inContext = OutputDoc;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 1400 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 1403 "commentscan.l"
+{ // third argument
+ xrefListTitle = stripQuotes(commentScanYYtext);
+ xrefKind = XRef_Item;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 94:
+/* rule 94 can match eol */
+YY_RULE_SETUP
+#line 1408 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 95:
+/* rule 95 can match eol */
+YY_RULE_SETUP
+#line 1412 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: Missing third argument of \\xrefitem"
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ inContext = OutputDoc;
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 1421 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+/* ----- handle arguments of the relates(also)/memberof command ------- */
+case 97:
+YY_RULE_SETUP
+#line 1427 "commentscan.l"
+{ // argument
+ current->relates = commentScanYYtext;
+ //if (current->mGrpId!=DOX_NOGROUP)
+ //{
+ // memberGroupRelates = commentScanYYtext;
+ //}
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 98:
+/* rule 98 can match eol */
+YY_RULE_SETUP
+#line 1435 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 99:
+/* rule 99 can match eol */
+YY_RULE_SETUP
+#line 1439 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: Missing argument of \\relates or \\memberof command"
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 1447 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+/* ----- handle arguments of the relates(also)/addindex commands ----- */
+case 101:
+/* rule 101 can match eol */
+YY_RULE_SETUP
+#line 1453 "commentscan.l"
+{ // end of argument
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 102:
+/* rule 102 can match eol */
+YY_RULE_SETUP
+#line 1458 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 1462 "commentscan.l"
+{ // ignore other stuff
+ addOutput(*commentScanYYtext);
+ }
+ YY_BREAK
+/* ----- handle arguments of the section/subsection/.. commands ------- */
+case 104:
+YY_RULE_SETUP
+#line 1468 "commentscan.l"
+{ // first argyment
+ sectionLabel=commentScanYYtext;
+ addOutput(commentScanYYtext);
+ sectionTitle.resize(0);
+ BEGIN(SectionTitle);
+ }
+ YY_BREAK
+case 105:
+/* rule 105 can match eol */
+YY_RULE_SETUP
+#line 1474 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\section command has no label"
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 1482 "commentscan.l"
+{ // invalid character for section label
+ warn(yyFileName,yyLineNr,
+ "warning: Invalid or missing section label"
+ );
+ BEGIN(Comment);
+ }
+ YY_BREAK
+case 107:
+/* rule 107 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1489 "commentscan.l"
+{ // end of section title
+ addSection();
+ addOutput(commentScanYYtext);
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 108:
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 8;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1494 "commentscan.l"
+{ // end of section title
+ addSection();
+ addOutput(commentScanYYtext);
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 109:
+/* rule 109 can match eol */
+YY_RULE_SETUP
+#line 1499 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 1503 "commentscan.l"
+{ // any character without special meaning
+ sectionTitle+=commentScanYYtext;
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 1507 "commentscan.l"
+{ // unescape escaped command
+ sectionTitle+=&commentScanYYtext[1];
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 1511 "commentscan.l"
+{ // unescape escaped character
+ sectionTitle+=commentScanYYtext[1];
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 1515 "commentscan.l"
+{ // anything else
+ sectionTitle+=commentScanYYtext;
+ addOutput(*commentScanYYtext);
+ }
+ YY_BREAK
+/* ----- handle arguments of the subpage command ------- */
+case 114:
+YY_RULE_SETUP
+#line 1522 "commentscan.l"
+{ // first argument
+ addOutput(commentScanYYtext);
+ // we add subpage labels as a kind of "inheritance" relation to prevent
+ // needing to add another list to the Entry class.
+ current->extends->append(new BaseInfo(commentScanYYtext,Public,Normal));
+ BEGIN(SubpageTitle);
+ }
+ YY_BREAK
+case 115:
+/* rule 115 can match eol */
+YY_RULE_SETUP
+#line 1529 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\subpage command has no label"
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 116:
+/* rule 116 can match eol */
+YY_RULE_SETUP
+#line 1537 "commentscan.l"
+{ // no title, end command
+ addOutput(commentScanYYtext);
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 1541 "commentscan.l"
+{ // add title, end of command
+ addOutput(commentScanYYtext);
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 1545 "commentscan.l"
+{ // no title, end of command
+ unput(*commentScanYYtext);
+ BEGIN( Comment );
+ }
+ YY_BREAK
+/* ----- handle arguments of the anchor command ------- */
+case 119:
+YY_RULE_SETUP
+#line 1552 "commentscan.l"
+{ // found argument
+ SectionInfo *si = new SectionInfo(yyFileName,commentScanYYtext,0,SectionInfo::Anchor);
+ Doxygen::sectionDict.insert(commentScanYYtext,si);
+ current->anchors->append(si);
+ addOutput(commentScanYYtext);
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 120:
+/* rule 120 can match eol */
+YY_RULE_SETUP
+#line 1559 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\anchor command has no label"
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 1567 "commentscan.l"
+{ // invalid character for anchor label
+ warn(yyFileName,yyLineNr,
+ "warning: Invalid or missing anchor label"
+ );
+ BEGIN(Comment);
+ }
+ YY_BREAK
+/* ----- handle arguments of the preformatted block commands ------- */
+case 122:
+/* rule 122 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1577 "commentscan.l"
+{ // possible ends
+ addOutput(commentScanYYtext);
+ if (&commentScanYYtext[4]==blockName) // found end of the block
+ {
+ BEGIN(Comment);
+ }
+ }
+ YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 1584 "commentscan.l"
+{ // some word
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 124:
+/* rule 124 can match eol */
+YY_RULE_SETUP
+#line 1587 "commentscan.l"
+{ // new line
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 125:
+YY_RULE_SETUP
+#line 1591 "commentscan.l"
+{ // start of a C-comment
+ g_commentCount++;
+ addOutput(commentScanYYtext);
+ }
+ YY_BREAK
+case 126:
+YY_RULE_SETUP
+#line 1595 "commentscan.l"
+{ // end of a C-comment
+ addOutput(commentScanYYtext);
+ g_commentCount--;
+ if (g_commentCount<0 && blockName!="verbatim")
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data());
+ }
+ }
+ YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 1604 "commentscan.l"
+{
+ addOutput(*commentScanYYtext);
+ }
+ YY_BREAK
+case YY_STATE_EOF(FormatBlock):
+#line 1607 "commentscan.l"
+{
+ warn(yyFileName,yyLineNr,
+ "warning: reached end of comment while inside a @%s block; check for missing @end%s tag!",
+ blockName.data(),blockName.data()
+ );
+ yyterminate();
+ }
+ YY_BREAK
+/* ----- handle arguments of if/ifnot commands ------- */
+case 128:
+YY_RULE_SETUP
+#line 1617 "commentscan.l"
+{ // parameter of if/ifnot guard
+ bool sectionEnabled = Config_getList("ENABLED_SECTIONS").find(commentScanYYtext)!=-1;
+ bool parentEnabled = TRUE;
+ if (!guards.isEmpty()) parentEnabled = guards.top()->isEnabled();
+ if (parentEnabled)
+ {
+ if (
+ (sectionEnabled && guardType==Guard_If) ||
+ (!sectionEnabled && guardType==Guard_IfNot)
+ ) // section is visible
+ {
+ guards.push(new GuardedSection(TRUE,TRUE));
+ enabledSectionFound=TRUE;
+ BEGIN( GuardParamEnd );
+ }
+ else // section is invisible
+ {
+ if (guardType!=Guard_Skip)
+ {
+ guards.push(new GuardedSection(FALSE,TRUE));
+ }
+ BEGIN( SkipGuardedSection );
+ }
+ }
+ else // invisible because of parent
+ {
+ guards.push(new GuardedSection(FALSE,FALSE));
+ BEGIN( SkipGuardedSection );
+ }
+ }
+ YY_BREAK
+case 129:
+/* rule 129 can match eol */
+YY_RULE_SETUP
+#line 1647 "commentscan.l"
+{ // end of argument
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ //next line is commented out due to bug620924
+ //addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 130:
+/* rule 130 can match eol */
+YY_RULE_SETUP
+#line 1653 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 131:
+YY_RULE_SETUP
+#line 1657 "commentscan.l"
+{ // ignore other stuff
+ addOutput(*commentScanYYtext);
+ }
+ YY_BREAK
+case 132:
+/* rule 132 can match eol */
+YY_RULE_SETUP
+#line 1660 "commentscan.l"
+{
+ BEGIN(Comment);
+ }
+ YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 1663 "commentscan.l"
+{
+ BEGIN(Comment);
+ }
+ YY_BREAK
+case 134:
+YY_RULE_SETUP
+#line 1666 "commentscan.l"
+{
+ unput(*commentScanYYtext);
+ BEGIN(Comment);
+ }
+ YY_BREAK
+/* ----- handle skipping of conditional sections ------- */
+case 135:
+/* rule 135 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1673 "commentscan.l"
+{
+ guardType = Guard_IfNot;
+ BEGIN( GuardParam );
+ }
+ YY_BREAK
+case 136:
+/* rule 136 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1677 "commentscan.l"
+{
+ guardType = Guard_If;
+ BEGIN( GuardParam );
+ }
+ YY_BREAK
+case 137:
+/* rule 137 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1681 "commentscan.l"
+{
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found @endif without matching start command");
+ }
+ else
+ {
+ delete guards.pop();
+ BEGIN( GuardParamEnd );
+ }
+ }
+ YY_BREAK
+case 138:
+/* rule 138 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1693 "commentscan.l"
+{
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found @else without matching start command");
+ }
+ else
+ {
+ if (!enabledSectionFound && guards.top()->parentVisible())
+ {
+ delete guards.pop();
+ guards.push(new GuardedSection(TRUE,TRUE));
+ enabledSectionFound=TRUE;
+ BEGIN( GuardParamEnd );
+ }
+ }
+ }
+ YY_BREAK
+case 139:
+/* rule 139 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1710 "commentscan.l"
+{
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found @elseif without matching start command");
+ }
+ else
+ {
+ if (!enabledSectionFound && guards.top()->parentVisible())
+ {
+ delete guards.pop();
+ BEGIN( GuardParam );
+ }
+ }
+ }
+ YY_BREAK
+case 140:
+/* rule 140 can match eol */
+YY_RULE_SETUP
+#line 1725 "commentscan.l"
+{ // skip line
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ //addOutput('\n');
+ }
+ YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 1729 "commentscan.l"
+{ // skip non-special characters
+ }
+ YY_BREAK
+case 142:
+YY_RULE_SETUP
+#line 1731 "commentscan.l"
+{ // any other character
+ }
+ YY_BREAK
+/* ----- handle skipping of internal section ------- */
+case 143:
+/* rule 143 can match eol */
+YY_RULE_SETUP
+#line 1737 "commentscan.l"
+{ // skip line
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 144:
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 3;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1741 "commentscan.l"
+{
+ g_condCount++;
+ }
+ YY_BREAK
+case 145:
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 6;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1744 "commentscan.l"
+{
+ g_condCount++;
+ }
+ YY_BREAK
+case 146:
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1747 "commentscan.l"
+{
+ g_condCount--;
+ if (g_condCount<0) // handle conditional section around of \internal, see bug607743
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+ YY_BREAK
+case 147:
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1755 "commentscan.l"
+{
+ if (g_sectionLevel>0)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+ YY_BREAK
+case 148:
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1762 "commentscan.l"
+{
+ if (g_sectionLevel>1)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+ YY_BREAK
+case 149:
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1769 "commentscan.l"
+{
+ if (g_sectionLevel>2)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+ YY_BREAK
+case 150:
+*yy_cp = (yy_hold_char); /* undo effects of setting up commentScanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up commentScanYYtext again */
+YY_RULE_SETUP
+#line 1776 "commentscan.l"
+{
+ if (g_sectionLevel>3)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+ YY_BREAK
+case 151:
+YY_RULE_SETUP
+#line 1783 "commentscan.l"
+{
+ BEGIN(Comment);
+ }
+ YY_BREAK
+case 152:
+YY_RULE_SETUP
+#line 1786 "commentscan.l"
+{ // skip non-special characters
+ }
+ YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 1788 "commentscan.l"
+{ // any other character
+ }
+ YY_BREAK
+/* ----- handle argument of name command ------- */
+case 154:
+/* rule 154 can match eol */
+YY_RULE_SETUP
+#line 1794 "commentscan.l"
+{ // end of argument
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 155:
+/* rule 155 can match eol */
+YY_RULE_SETUP
+#line 1799 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ g_memberGroupHeader+=' ';
+ }
+ YY_BREAK
+case 156:
+YY_RULE_SETUP
+#line 1804 "commentscan.l"
+{ // ignore other stuff
+ g_memberGroupHeader+=*commentScanYYtext;
+ current->name+=*commentScanYYtext;
+ }
+ YY_BREAK
+/* ----- handle argument of ingroup command ------- */
+case 157:
+YY_RULE_SETUP
+#line 1811 "commentscan.l"
+{ // group id
+ current->groups->append(
+ new Grouping(commentScanYYtext, Grouping::GROUPING_INGROUP)
+ );
+ inGroupParamFound=TRUE;
+ }
+ YY_BREAK
+case 158:
+/* rule 158 can match eol */
+YY_RULE_SETUP
+#line 1817 "commentscan.l"
+{ // missing argument
+ if (!inGroupParamFound)
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: Missing group name for \\ingroup command"
+ );
+ }
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 159:
+/* rule 159 can match eol */
+YY_RULE_SETUP
+#line 1828 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+ YY_BREAK
+case 160:
+YY_RULE_SETUP
+#line 1832 "commentscan.l"
+{ // ignore other stuff
+ addOutput(*commentScanYYtext);
+ }
+ YY_BREAK
+/* ----- handle argument of fn command ------- */
+case 161:
+/* rule 161 can match eol */
+YY_RULE_SETUP
+#line 1838 "commentscan.l"
+{ // end of argument
+ if (braceCount==0)
+ {
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ langParser->parsePrototype(functionProto);
+ BEGIN( Comment );
+ }
+ }
+ YY_BREAK
+case 162:
+/* rule 162 can match eol */
+YY_RULE_SETUP
+#line 1847 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ functionProto+=' ';
+ }
+ YY_BREAK
+case 163:
+YY_RULE_SETUP
+#line 1851 "commentscan.l"
+{ // non-special characters
+ functionProto+=commentScanYYtext;
+ }
+ YY_BREAK
+case 164:
+YY_RULE_SETUP
+#line 1854 "commentscan.l"
+{
+ functionProto+=commentScanYYtext;
+ braceCount++;
+ }
+ YY_BREAK
+case 165:
+YY_RULE_SETUP
+#line 1858 "commentscan.l"
+{
+ functionProto+=commentScanYYtext;
+ braceCount--;
+ }
+ YY_BREAK
+case 166:
+YY_RULE_SETUP
+#line 1862 "commentscan.l"
+{ // add other stuff
+ functionProto+=*commentScanYYtext;
+ }
+ YY_BREAK
+/* ----- handle argument of overload command ------- */
+case 167:
+/* rule 167 can match eol */
+YY_RULE_SETUP
+#line 1870 "commentscan.l"
+{ // end of argument
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ if (functionProto.stripWhiteSpace().isEmpty())
+ { // plain overload command
+ addOutput(getOverloadDocs());
+ }
+ else // overload declaration
+ {
+ makeStructuralIndicator(Entry::OVERLOADDOC_SEC);
+ langParser->parsePrototype(functionProto);
+ }
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 168:
+/* rule 168 can match eol */
+YY_RULE_SETUP
+#line 1884 "commentscan.l"
+{ // line continuation
+ yyLineNr++;
+ functionProto+=' ';
+ }
+ YY_BREAK
+case 169:
+YY_RULE_SETUP
+#line 1888 "commentscan.l"
+{ // add other stuff
+ functionProto+=*commentScanYYtext;
+ }
+ YY_BREAK
+/* ----- handle argument of inherit command ------- */
+case 170:
+YY_RULE_SETUP
+#line 1894 "commentscan.l"
+{ // found argument
+ current->extends->append(
+ new BaseInfo(removeRedundantWhiteSpace(commentScanYYtext),Public,Normal)
+ );
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 171:
+/* rule 171 can match eol */
+YY_RULE_SETUP
+#line 1900 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\inherit command has no argument"
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 172:
+YY_RULE_SETUP
+#line 1908 "commentscan.l"
+{ // invalid character for anchor label
+ warn(yyFileName,yyLineNr,
+ "warning: Invalid or missing name for \\inherit command"
+ );
+ BEGIN(Comment);
+ }
+ YY_BREAK
+/* ----- handle argument of extends and implements commands ------- */
+case 173:
+YY_RULE_SETUP
+#line 1917 "commentscan.l"
+{ // found argument
+ current->extends->append(
+ new BaseInfo(removeRedundantWhiteSpace(commentScanYYtext),Public,Normal)
+ );
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 174:
+/* rule 174 can match eol */
+YY_RULE_SETUP
+#line 1923 "commentscan.l"
+{ // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\extends or \\implements command has no argument"
+ );
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+ YY_BREAK
+case 175:
+YY_RULE_SETUP
+#line 1931 "commentscan.l"
+{ // ignore other stuff
+ }
+ YY_BREAK
+/* ----- handle language specific sections ------- */
+case 176:
+YY_RULE_SETUP
+#line 1936 "commentscan.l"
+{ /* language switch */
+ QCString langId = &commentScanYYtext[2];
+ if (langId.isEmpty() ||
+ stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0)
+ { // enable language specific section
+ BEGIN(Comment);
+ }
+ }
+ YY_BREAK
+case 177:
+YY_RULE_SETUP
+#line 1944 "commentscan.l"
+{ /* any character not a *, @, backslash or new line */
+ }
+ YY_BREAK
+case 178:
+/* rule 178 can match eol */
+YY_RULE_SETUP
+#line 1946 "commentscan.l"
+{ /* new line in verbatim block */
+ if (*commentScanYYtext=='\n') yyLineNr++;
+ }
+ YY_BREAK
+case 179:
+YY_RULE_SETUP
+#line 1949 "commentscan.l"
+{ /* any other character */
+ }
+ YY_BREAK
+case 180:
+YY_RULE_SETUP
+#line 1953 "commentscan.l"
+ECHO;
+ YY_BREAK
+#line 5650 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(Comment):
+ case YY_STATE_EOF(PageDocArg1):
+ case YY_STATE_EOF(PageDocArg2):
+ case YY_STATE_EOF(RelatesParam1):
+ case YY_STATE_EOF(ClassDocArg1):
+ case YY_STATE_EOF(ClassDocArg2):
+ case YY_STATE_EOF(ClassDocArg3):
+ case YY_STATE_EOF(CategoryDocArg1):
+ case YY_STATE_EOF(XRefItemParam1):
+ case YY_STATE_EOF(XRefItemParam2):
+ case YY_STATE_EOF(XRefItemParam3):
+ case YY_STATE_EOF(FileDocArg1):
+ case YY_STATE_EOF(EnumDocArg1):
+ case YY_STATE_EOF(NameSpaceDocArg1):
+ case YY_STATE_EOF(PackageDocArg1):
+ case YY_STATE_EOF(GroupDocArg1):
+ case YY_STATE_EOF(GroupDocArg2):
+ case YY_STATE_EOF(SectionLabel):
+ case YY_STATE_EOF(SectionTitle):
+ case YY_STATE_EOF(SubpageLabel):
+ case YY_STATE_EOF(SubpageTitle):
+ case YY_STATE_EOF(LineParam):
+ case YY_STATE_EOF(GuardParam):
+ case YY_STATE_EOF(GuardParamEnd):
+ case YY_STATE_EOF(SkipGuardedSection):
+ case YY_STATE_EOF(SkipInternal):
+ case YY_STATE_EOF(NameParam):
+ case YY_STATE_EOF(InGroupParam):
+ case YY_STATE_EOF(FnParam):
+ case YY_STATE_EOF(OverloadParam):
+ case YY_STATE_EOF(InheritParam):
+ case YY_STATE_EOF(ExtendsParam):
+ case YY_STATE_EOF(ReadFormulaShort):
+ case YY_STATE_EOF(ReadFormulaLong):
+ case YY_STATE_EOF(AnchorLabel):
+ case YY_STATE_EOF(HtmlComment):
+ case YY_STATE_EOF(SkipLang):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed commentScanYYin at a new source and called
+ * commentScanYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = commentScanYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( commentScanYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * commentScanYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of commentScanYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ commentScanYYrestart(commentScanYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) commentScanYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1054 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1054 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 1053);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up commentScanYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ commentScanYYrestart(commentScanYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( commentScanYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve commentScanYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void commentScanYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ commentScanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ commentScanYY_create_buffer(commentScanYYin,YY_BUF_SIZE );
+ }
+
+ commentScanYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ commentScanYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void commentScanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * commentScanYYpop_buffer_state();
+ * commentScanYYpush_buffer_state(new_buffer);
+ */
+ commentScanYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ commentScanYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (commentScanYYwrap()) processing, but the only time this flag
+ * is looked at is after commentScanYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void commentScanYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ commentScanYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE commentScanYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) commentScanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in commentScanYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) commentScanYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in commentScanYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ commentScanYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with commentScanYY_create_buffer()
+ *
+ */
+ void commentScanYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ commentScanYYfree((void *) b->yy_ch_buf );
+
+ commentScanYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a commentScanYYrestart() or at EOF.
+ */
+ static void commentScanYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ commentScanYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then commentScanYY_init_buffer was _probably_
+ * called from commentScanYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void commentScanYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ commentScanYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void commentScanYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ commentScanYYensure_buffer_stack();
+
+ /* This block is copied from commentScanYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from commentScanYY_switch_to_buffer. */
+ commentScanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void commentScanYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ commentScanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ commentScanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void commentScanYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)commentScanYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in commentScanYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)commentScanYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in commentScanYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE commentScanYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) commentScanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in commentScanYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ commentScanYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to commentScanYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * commentScanYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE commentScanYY_scan_string (yyconst char * yystr )
+{
+
+ return commentScanYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to commentScanYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE commentScanYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) commentScanYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in commentScanYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = commentScanYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in commentScanYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up commentScanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ commentScanYYtext[commentScanYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = commentScanYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ commentScanYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int commentScanYYget_lineno (void)
+{
+
+ return commentScanYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *commentScanYYget_in (void)
+{
+ return commentScanYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *commentScanYYget_out (void)
+{
+ return commentScanYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t commentScanYYget_leng (void)
+{
+ return commentScanYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *commentScanYYget_text (void)
+{
+ return commentScanYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void commentScanYYset_lineno (int line_number )
+{
+
+ commentScanYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see commentScanYY_switch_to_buffer
+ */
+void commentScanYYset_in (FILE * in_str )
+{
+ commentScanYYin = in_str ;
+}
+
+void commentScanYYset_out (FILE * out_str )
+{
+ commentScanYYout = out_str ;
+}
+
+int commentScanYYget_debug (void)
+{
+ return commentScanYY_flex_debug;
+}
+
+void commentScanYYset_debug (int bdebug )
+{
+ commentScanYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from commentScanYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ commentScanYYin = stdin;
+ commentScanYYout = stdout;
+#else
+ commentScanYYin = (FILE *) 0;
+ commentScanYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * commentScanYYlex_init()
+ */
+ return 0;
+}
+
+/* commentScanYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int commentScanYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ commentScanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ commentScanYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ commentScanYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ commentScanYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * commentScanYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *commentScanYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *commentScanYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void commentScanYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see commentScanYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 1953 "commentscan.l"
+
+
+
+//----------------------------------------------------------------------------
+
+static bool handleBrief(const QCString &)
+{
+ //printf("handleBrief\n");
+ setOutput(OutputBrief);
+ return FALSE;
+}
+
+static bool handleFn(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::MEMBERDOC_SEC);
+ functionProto.resize(0);
+ braceCount=0;
+ BEGIN(FnParam);
+ return stop;
+}
+
+static bool handleDef(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::DEFINEDOC_SEC);
+ functionProto.resize(0);
+ BEGIN(FnParam);
+ return stop;
+}
+
+static bool handleOverload(const QCString &)
+{
+ functionProto.resize(0);
+ BEGIN(OverloadParam);
+ return FALSE;
+}
+
+static bool handleEnum(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::ENUMDOC_SEC);
+ BEGIN(EnumDocArg1);
+ return stop;
+}
+
+static bool handleDefGroup(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC);
+ current->groupDocType = Entry::GROUPDOC_NORMAL;
+ BEGIN( GroupDocArg1 );
+ return stop;
+}
+
+static bool handleAddToGroup(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC);
+ current->groupDocType = Entry::GROUPDOC_ADD;
+ BEGIN( GroupDocArg1 );
+ return stop;
+}
+
+static bool handleWeakGroup(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC);
+ current->groupDocType = Entry::GROUPDOC_WEAK;
+ BEGIN( GroupDocArg1 );
+ return stop;
+}
+
+static bool handleNamespace(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::NAMESPACEDOC_SEC);
+ BEGIN( NameSpaceDocArg1 );
+ return stop;
+}
+
+static bool handlePackage(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::PACKAGEDOC_SEC);
+ BEGIN( PackageDocArg1 );
+ return stop;
+}
+
+static bool handleClass(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::CLASSDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleHeaderFile(const QCString &)
+{
+ BEGIN( ClassDocArg2 );
+ return FALSE;
+}
+
+static bool handleProtocol(const QCString &)
+{ // Obj-C protocol
+ bool stop=makeStructuralIndicator(Entry::PROTOCOLDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleCategory(const QCString &)
+{ // Obj-C category
+ bool stop=makeStructuralIndicator(Entry::CATEGORYDOC_SEC);
+ BEGIN( CategoryDocArg1 );
+ return stop;
+}
+
+static bool handleUnion(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::UNIONDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleStruct(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::STRUCTDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleInterface(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::INTERFACEDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleIdlException(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::EXCEPTIONDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handlePage(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::PAGEDOC_SEC);
+ BEGIN( PageDocArg1 );
+ return stop;
+}
+
+static bool handleMainpage(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::MAINPAGEDOC_SEC);
+ if (!stop)
+ {
+ current->name = "mainpage";
+ }
+ BEGIN( PageDocArg2 );
+ return stop;
+}
+
+static bool handleFile(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::FILEDOC_SEC);
+ if (!stop)
+ {
+ current->name = yyFileName;
+ }
+ BEGIN( FileDocArg1 );
+ return stop;
+}
+
+static bool handleDir(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::DIRDOC_SEC);
+ if (!stop) current->name = yyFileName;
+ BEGIN( FileDocArg1 );
+ return stop;
+}
+
+static bool handleExample(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::EXAMPLE_SEC);
+ if (!stop) current->name = yyFileName;
+ BEGIN( FileDocArg1 );
+ return stop;
+}
+
+static bool handleDetails(const QCString &)
+{
+ if (inContext!=OutputBrief)
+ {
+ addOutput("\n\n"); // treat @details outside brief description
+ // as a new paragraph
+ }
+ setOutput(OutputDoc);
+ return FALSE;
+}
+
+static bool handleName(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::MEMBERGRP_SEC);
+ if (!stop)
+ {
+ g_memberGroupHeader.resize(0);
+ BEGIN( NameParam );
+ if (g_memberGroupId!=DOX_NOGROUP) // end of previous member group
+ {
+ closeGroup(current,yyFileName,yyLineNr,TRUE);
+ }
+ }
+ return stop;
+}
+
+static bool handleTodo(const QCString &)
+{
+ newXRefKind = XRef_Todo;
+ setOutput(OutputXRef);
+ xrefKind = XRef_Todo;
+ return FALSE;
+}
+
+static bool handleTest(const QCString &)
+{
+ newXRefKind = XRef_Test;
+ setOutput(OutputXRef);
+ xrefKind = XRef_Test;
+ return FALSE;
+}
+
+static bool handleBug(const QCString &)
+{
+ newXRefKind = XRef_Bug;
+ setOutput(OutputXRef);
+ xrefKind = XRef_Bug;
+ return FALSE;
+}
+
+static bool handleDeprecated(const QCString &)
+{
+ newXRefKind = XRef_Deprecated;
+ setOutput(OutputXRef);
+ xrefKind = XRef_Deprecated;
+ return FALSE;
+}
+
+static bool handleXRefItem(const QCString &)
+{
+ BEGIN(XRefItemParam1);
+ return FALSE;
+}
+
+static bool handleRelated(const QCString &)
+{
+ BEGIN(RelatesParam1);
+ return FALSE;
+}
+
+static bool handleRelatedAlso(const QCString &)
+{
+ current->relatesType = Duplicate;
+ BEGIN(RelatesParam1);
+ return FALSE;
+}
+
+static bool handleMemberOf(const QCString &)
+{
+ current->relatesType = MemberOf;
+ BEGIN(RelatesParam1);
+ return FALSE;
+}
+
+static bool handleRefItem(const QCString &)
+{
+ addOutput(" @refitem ");
+ BEGIN(LineParam);
+ return FALSE;
+}
+
+static bool handleSection(const QCString &s)
+{
+ setOutput(OutputDoc);
+ addOutput(" @"+s+" ");
+ BEGIN(SectionLabel);
+ if (s=="section") g_sectionLevel=1;
+ else if (s=="subsection") g_sectionLevel=2;
+ else if (s=="subsubsection") g_sectionLevel=3;
+ else if (s=="paragraph") g_sectionLevel=4;
+ return FALSE;
+}
+
+static bool handleSubpage(const QCString &s)
+{
+ if (current->section!=Entry::EMPTY_SEC &&
+ current->section!=Entry::PAGEDOC_SEC &&
+ current->section!=Entry::MAINPAGEDOC_SEC
+ )
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found \\subpage command in a comment block that is not marked as a page!");
+ }
+ addOutput(" @"+s+" ");
+ BEGIN(SubpageLabel);
+ return FALSE;
+}
+
+static bool handleAnchor(const QCString &s)
+{
+ addOutput(" @"+s+" ");
+ BEGIN(AnchorLabel);
+ return FALSE;
+}
+
+static bool handleFormatBlock(const QCString &s)
+{
+ addOutput(" @"+s+" ");
+ //printf("handleFormatBlock(%s)\n",s.data());
+ blockName=s;
+ g_commentCount=0;
+ BEGIN(FormatBlock);
+ return FALSE;
+}
+
+static bool handleAddIndex(const QCString &)
+{
+ addOutput(" @addindex ");
+ BEGIN(LineParam);
+ return FALSE;
+}
+
+static bool handleIf(const QCString &)
+{
+ enabledSectionFound=FALSE;
+ guardType = Guard_If;
+ BEGIN(GuardParam);
+ return FALSE;
+}
+
+static bool handleIfNot(const QCString &)
+{
+ enabledSectionFound=FALSE;
+ guardType = Guard_IfNot;
+ BEGIN(GuardParam);
+ return FALSE;
+}
+
+static bool handleElseIf(const QCString &)
+{
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found \\else without matching start command");
+ }
+ else
+ {
+ guardType = enabledSectionFound ? Guard_Skip : Guard_If;
+ BEGIN(GuardParam);
+ }
+ return FALSE;
+}
+
+static bool handleElse(const QCString &)
+{
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found \\else without matching start command");
+ }
+ else
+ {
+ BEGIN( SkipGuardedSection );
+ }
+ return FALSE;
+}
+
+static bool handleEndIf(const QCString &)
+{
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found \\endif without matching start command");
+ }
+ else
+ {
+ delete guards.pop();
+ }
+ enabledSectionFound=FALSE;
+ BEGIN( GuardParamEnd );
+ return FALSE;
+}
+
+static bool handleIngroup(const QCString &)
+{
+ inGroupParamFound=FALSE;
+ BEGIN( InGroupParam );
+ return FALSE;
+}
+
+static bool handleNoSubGrouping(const QCString &)
+{
+ current->subGrouping = FALSE;
+ return FALSE;
+}
+
+static bool handleShowInitializer(const QCString &)
+{
+ current->initLines = 100000; // ON
+ return FALSE;
+}
+
+static bool handleHideInitializer(const QCString &)
+{
+ current->initLines = 0; // OFF
+ return FALSE;
+}
+
+static bool handleCallgraph(const QCString &)
+{
+ current->callGraph = TRUE; // ON
+ return FALSE;
+}
+
+static bool handleCallergraph(const QCString &)
+{
+ current->callerGraph = TRUE; // ON
+ return FALSE;
+}
+
+static bool handleInternal(const QCString &)
+{
+ if (!Config_getBool("INTERNAL_DOCS"))
+ {
+ // make sure some whitespace before a \internal command
+ // is not treated as "documentation"
+ if (current->doc.stripWhiteSpace().isEmpty())
+ {
+ current->doc.resize(0);
+ }
+ g_condCount=0;
+ BEGIN( SkipInternal );
+ }
+ else
+ {
+ // re-enabled for bug640828
+ addOutput("\\internal ");
+ }
+ return FALSE;
+}
+
+static bool handleLineBr(const QCString &)
+{
+ addOutput('\n');
+ return FALSE;
+}
+
+static bool handleStatic(const QCString &)
+{
+ endBrief();
+ current->stat = TRUE;
+ return FALSE;
+}
+
+static bool handlePure(const QCString &)
+{
+ endBrief();
+ current->virt = Pure;
+ return FALSE;
+}
+
+static bool handlePrivate(const QCString &)
+{
+ current->protection = Private;
+ return FALSE;
+}
+
+static bool handlePrivateSection(const QCString &)
+{
+ current->protection = protection = Private;
+ return FALSE;
+}
+
+static bool handleProtected(const QCString &)
+{
+ current->protection = Protected;
+ return FALSE;
+}
+
+static bool handleProtectedSection(const QCString &)
+{
+ current->protection = protection = Protected ;
+ return FALSE;
+}
+
+static bool handlePublic(const QCString &)
+{
+ current->protection = Public;
+ return FALSE;
+}
+
+static bool handlePublicSection(const QCString &)
+{
+ current->protection = protection = Public;
+ return FALSE;
+}
+
+static bool handleInherit(const QCString &)
+{
+ BEGIN(InheritParam);
+ return FALSE;
+}
+
+static bool handleExtends(const QCString &)
+{
+ BEGIN(ExtendsParam);
+ return FALSE;
+}
+
+//----------------------------------------------------------------------------
+
+static void checkFormula()
+{
+ if (YY_START==ReadFormulaShort || YY_START==ReadFormulaLong)
+ {
+ warn(yyFileName,yyLineNr,"warning: End of comment block while inside formula.");
+ }
+}
+
+//----------------------------------------------------------------------------
+
+bool parseCommentBlock(/* in */ ParserInterface *parser,
+ /* in */ Entry *curEntry,
+ /* in */ const QCString &comment,
+ /* in */ const QCString &fileName,
+ /* in,out */ int &lineNr,
+ /* in */ bool isBrief,
+ /* in */ bool isAutoBriefOn,
+ /* in */ bool isInbody,
+ /* in,out */ Protection &prot,
+ /* in,out */ int &position,
+ /* out */ bool &newEntryNeeded
+ )
+{
+ //printf("parseCommentBlock() isBrief=%d isAutoBriefOn=%d lineNr=%d\n",
+ // isBrief,isAutoBriefOn,lineNr);
+
+ initParser();
+ guards.setAutoDelete(TRUE);
+ guards.clear();
+ langParser = parser;
+ current = curEntry;
+ if (comment.isEmpty()) return FALSE; // avoid empty strings
+ inputString = comment;
+ inputString.append(" ");
+ inputPosition = position;
+ yyLineNr = lineNr;
+ yyFileName = fileName;
+ protection = prot;
+ needNewEntry = FALSE;
+ xrefKind = XRef_None;
+ xrefAppendFlag = FALSE;
+ insidePre = FALSE;
+ parseMore = FALSE;
+ inBody = isInbody;
+ outputXRef.resize(0);
+ setOutput( isBrief || isAutoBriefOn ? OutputBrief : OutputDoc );
+ briefEndsAtDot = isAutoBriefOn;
+ g_condCount = 0;
+ g_sectionLevel = 0;
+
+ if (!current->inbodyDocs.isEmpty() && isInbody) // separate in body fragments
+ {
+ current->inbodyDocs+="\n\n";
+ }
+
+ Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\n"
+ "input=[%s]\n",fileName.data(),lineNr,comment.data()
+ );
+
+ commentScanYYrestart( commentScanYYin );
+ BEGIN( Comment );
+ commentScanYYlex();
+ setOutput( OutputDoc );
+
+ if (YY_START==OverloadParam) // comment ended with \overload
+ {
+ addOutput(getOverloadDocs());
+ }
+
+ if (!guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
+ }
+
+ current->doc=stripLeadingAndTrailingEmptyLines(current->doc);
+
+ if (current->section==Entry::FILEDOC_SEC && current->doc.isEmpty())
+ {
+ // to allow a comment block with just a @file command.
+ current->doc="\n\n";
+ }
+
+ if (current->section==Entry::MEMBERGRP_SEC &&
+ g_memberGroupId==DOX_NOGROUP) // @name section but no group started yet
+ {
+ openGroup(current,yyFileName,yyLineNr);
+ }
+
+ Debug::print(Debug::CommentScan,0,
+ "brief=[%s]\ndocs=[%s]\ninbody=[%s]\n===========\n",
+ current->brief.data(),current->doc.data(),current->inbodyDocs.data()
+ );
+
+ checkFormula();
+ prot = protection;
+
+ groupAddDocs(curEntry,fileName);
+
+ newEntryNeeded = needNewEntry;
+
+ // if we did not proceed during this call, it does not make
+ // sense to continue, since we get stuck. See bug 567346 for situations
+ // were this happens
+ if (parseMore && position==inputPosition) parseMore=FALSE;
+
+ if (parseMore) position=inputPosition; else position=0;
+
+ lineNr = yyLineNr;
+ //printf("position=%d parseMore=%d\n",position,parseMore);
+
+ return parseMore;
+}
+
+//---------------------------------------------------------------------------
+
+void groupEnterFile(const char *fileName,int)
+{
+ g_autoGroupStack.setAutoDelete(TRUE);
+ g_autoGroupStack.clear();
+ g_memberGroupId = DOX_NOGROUP;
+ g_memberGroupDocs.resize(0);
+ g_memberGroupRelates.resize(0);
+ g_compoundName=fileName;
+}
+
+void groupLeaveFile(const char *fileName,int line)
+{
+ //if (g_memberGroupId!=DOX_NOGROUP)
+ //{
+ // warn(fileName,line,"warning: end of file while inside a member group\n");
+ //}
+ g_memberGroupId=DOX_NOGROUP;
+ g_memberGroupRelates.resize(0);
+ g_memberGroupDocs.resize(0);
+ if (!g_autoGroupStack.isEmpty())
+ {
+ warn(fileName,line,"warning: end of file while inside a group\n");
+ }
+}
+
+void groupEnterCompound(const char *fileName,int line,const char *name)
+{
+ if (g_memberGroupId!=DOX_NOGROUP)
+ {
+ warn(fileName,line,"warning: try to put compound %s inside a member group\n",name);
+ }
+ g_memberGroupId=DOX_NOGROUP;
+ g_memberGroupRelates.resize(0);
+ g_memberGroupDocs.resize(0);
+ g_compoundName = name;
+ int i = g_compoundName.find('(');
+ if (i!=-1)
+ {
+ g_compoundName=g_compoundName.left(i); // strip category (Obj-C)
+ }
+ if (g_compoundName.isEmpty())
+ {
+ g_compoundName=fileName;
+ }
+ //printf("groupEnterCompound(%s)\n",name);
+}
+
+void groupLeaveCompound(const char *,int,const char * /*name*/)
+{
+ //printf("groupLeaveCompound(%s)\n",name);
+ //if (g_memberGroupId!=DOX_NOGROUP)
+ //{
+ // warn(fileName,line,"warning: end of compound %s while inside a member group\n",name);
+ //}
+ g_memberGroupId=DOX_NOGROUP;
+ g_memberGroupRelates.resize(0);
+ g_memberGroupDocs.resize(0);
+ g_compoundName.resize(0);
+}
+
+static int findExistingGroup(int &groupId,const MemberGroupInfo *info)
+{
+ //printf("findExistingGroup %s:%s\n",info->header.data(),info->compoundName.data());
+ QIntDictIterator<MemberGroupInfo> di(Doxygen::memGrpInfoDict);
+ MemberGroupInfo *mi;
+ for (di.toFirst();(mi=di.current());++di)
+ {
+ if (g_compoundName==mi->compoundName && // same file or scope
+ !mi->header.isEmpty() && // not a nameless group
+ stricmp(mi->header,info->header)==0 // same header name
+ )
+ {
+ //printf("Found it!\n");
+ return di.currentKey(); // put the item in this group
+ }
+ }
+ groupId++; // start new group
+ return groupId;
+}
+
+void openGroup(Entry *e,const char *,int)
+{
+ //printf("==> openGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
+ // e->name.data(),e->section,g_autoGroupStack.count());
+ if (e->section==Entry::GROUPDOC_SEC) // auto group
+ {
+ g_autoGroupStack.push(new Grouping(e->name,e->groupingPri()));
+ }
+ else // start of a member group
+ {
+ //printf(" membergroup id=%d %s\n",g_memberGroupId,g_memberGroupHeader.data());
+ if (g_memberGroupId==DOX_NOGROUP) // no group started yet
+ {
+ static int curGroupId=0;
+
+ MemberGroupInfo *info = new MemberGroupInfo;
+ info->header = g_memberGroupHeader.stripWhiteSpace();
+ info->compoundName = g_compoundName;
+ g_memberGroupId = findExistingGroup(curGroupId,info);
+ //printf(" use membergroup %d\n",g_memberGroupId);
+ Doxygen::memGrpInfoDict.insert(g_memberGroupId,info);
+
+ g_memberGroupRelates = e->relates;
+ e->mGrpId = g_memberGroupId;
+ }
+ }
+}
+
+void closeGroup(Entry *e,const char *fileName,int,bool foundInline)
+{
+ //printf("==> closeGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
+ // e->name.data(),e->section,g_autoGroupStack.count());
+ if (g_memberGroupId!=DOX_NOGROUP) // end of member group
+ {
+ MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
+ if (info) // known group
+ {
+ info->doc = g_memberGroupDocs;
+ info->docFile = fileName;
+ }
+ g_memberGroupId=DOX_NOGROUP;
+ g_memberGroupRelates.resize(0);
+ g_memberGroupDocs.resize(0);
+ e->mGrpId=DOX_NOGROUP;
+ //printf("new group id=%d\n",g_memberGroupId);
+ }
+ else if (!g_autoGroupStack.isEmpty()) // end of auto group
+ {
+ Grouping *grp = g_autoGroupStack.pop();
+ // see bug577005: we should not remove the last group for e
+ if (!foundInline) e->groups->removeLast();
+ //printf("Removing %s e=%p\n",grp->groupname.data(),e);
+ delete grp;
+ if (!foundInline) initGroupInfo(e);
+ }
+}
+
+void initGroupInfo(Entry *e)
+{
+ //printf("==> initGroup(id=%d,related=%s,e=%p)\n",g_memberGroupId,
+ // g_memberGroupRelates.data(),e);
+ e->mGrpId = g_memberGroupId;
+ e->relates = g_memberGroupRelates;
+ if (!g_autoGroupStack.isEmpty())
+ {
+ //printf("Appending group %s to %s: count=%d entry=%p\n",
+ // g_autoGroupStack.top()->groupname.data(),
+ // e->name.data(),e->groups->count(),e);
+ e->groups->append(new Grouping(*g_autoGroupStack.top()));
+ }
+}
+
+static void groupAddDocs(Entry *e,const char *fileName)
+{
+ if (e->section==Entry::MEMBERGRP_SEC)
+ {
+ g_memberGroupDocs=e->brief.stripWhiteSpace();
+ e->doc = stripLeadingAndTrailingEmptyLines(e->doc);
+ if (!g_memberGroupDocs.isEmpty() && !e->doc.isEmpty())
+ {
+ g_memberGroupDocs+="\n\n";
+ }
+ g_memberGroupDocs+=e->doc;
+ MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
+ if (info)
+ {
+ info->doc = g_memberGroupDocs;
+ info->docFile = fileName;
+ info->setRefItems(e->sli);
+ }
+ e->doc.resize(0);
+ e->brief.resize(0);
+ }
+}
+
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void commentScanYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
+
diff --git a/src/commentscan.h b/src/commentscan.h
new file mode 100644
index 0000000..a34dfc7
--- /dev/null
+++ b/src/commentscan.h
@@ -0,0 +1,84 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef COMMENTSCAN_H
+#define COMMENTSCAN_H
+
+#include "qtbc.h"
+#include "entry.h"
+
+class ParserInterface;
+
+/** @file
+ * @brief Interface for the comment block parser */
+
+/** Invokes the comment block parser with the request to parse a
+ * single comment block.
+ * @param[in] parser The language parse that invoked this function.
+ * The comment block parse may invoke
+ * ParserInterface::parsePrototype() in order to parse
+ * the argument of a @@fn command.
+ * @param[in] curEntry The Entry to which the comment block belongs.
+ * Any information (like documentation) that is found in
+ * the comment block will be stored in this entry.
+ * @param[in] comment A string representing the actual comment block.
+ * Note that leading *'s are already stripped from the comment block.
+ * @param[in] fileName The name of the file in which the comment is found.
+ * Mainly used for producing warnings.
+ * @param[in,out] lineNr The line number at which the comment block was found.
+ * When the function returns it will be set to the last line parsed.
+ * @param[in] isBrief TRUE iff this comment block represents a brief description.
+ * @param[in] isJavaDocStyle TRUE iff this comment block is in "JavaDoc" style.
+ * This means that it starts as a brief description until the end of
+ * the sentences is found and then proceeds as a detailed description.
+ * @param[in] isInbody TRUE iff this comment block is located in the body of
+ * a function.
+ * @param[in,out] prot The protection level in which this comment block was
+ * found. Commands in the comment block may override this.
+ * @param[in,out] position The character position within \a comment where the
+ * comment block starts. Typically used in case the comment block
+ * contains multiple structural commands.
+ * @param[out] newEntryNeeded Boolean that is TRUE if the comment block parser
+ * finds that a the comment block finishes the entry and a new one
+ * needs to be started.
+ * @returns TRUE if the comment requires further processing. The
+ * parameter \a newEntryNeeded will typically be true in this case and
+ * \a position will indicate the offset inside the \a comment string
+ * where to proceed parsing. FALSE indicates no further processing is
+ * needed.
+ */
+bool parseCommentBlock(ParserInterface *parser,
+ Entry *curEntry,
+ const QCString &comment,
+ const QCString &fileName,
+ int &lineNr,
+ bool isBrief,
+ bool isJavaDocStyle,
+ bool isInbody,
+ Protection &prot,
+ int &position,
+ bool &newEntryNeeded
+ );
+
+void groupEnterFile(const char *file,int line);
+void groupLeaveFile(const char *file,int line);
+void groupLeaveCompound(const char *file,int line,const char *name);
+void groupEnterCompound(const char *file,int line,const char *name);
+void openGroup(Entry *e,const char *file,int line);
+void closeGroup(Entry *,const char *file,int line,bool foundInline=FALSE);
+void initGroupInfo(Entry *e);
+
+
+#endif
diff --git a/src/commentscan.l b/src/commentscan.l
new file mode 100644
index 0000000..b95ae7c
--- /dev/null
+++ b/src/commentscan.l
@@ -0,0 +1,2761 @@
+/*****************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qregexp.h>
+#include <unistd.h>
+#include <qfile.h>
+
+#include "scanner.h"
+#include "entry.h"
+#include "doxygen.h"
+#include "message.h"
+#include "config.h"
+#include "util.h"
+#include "index.h"
+#include "defargs.h"
+#include "language.h"
+#include "outputlist.h"
+#include "membergroup.h"
+#include "reflist.h"
+#include "debug.h"
+#include "parserintf.h"
+
+// forward declarations
+static bool handleBrief(const QCString &);
+static bool handleFn(const QCString &);
+static bool handleDef(const QCString &);
+static bool handleOverload(const QCString &);
+static bool handleEnum(const QCString &);
+static bool handleDefGroup(const QCString &);
+static bool handleAddToGroup(const QCString &);
+static bool handleWeakGroup(const QCString &);
+static bool handleNamespace(const QCString &);
+static bool handlePackage(const QCString &);
+static bool handleClass(const QCString &);
+static bool handleHeaderFile(const QCString &);
+static bool handleProtocol(const QCString &);
+static bool handleCategory(const QCString &);
+static bool handleUnion(const QCString &);
+static bool handleStruct(const QCString &);
+static bool handleInterface(const QCString &);
+static bool handleIdlException(const QCString &);
+static bool handlePage(const QCString &);
+static bool handleMainpage(const QCString &);
+static bool handleFile(const QCString &);
+static bool handleDir(const QCString &);
+static bool handleExample(const QCString &);
+static bool handleDetails(const QCString &);
+static bool handleName(const QCString &);
+static bool handleTodo(const QCString &);
+static bool handleTest(const QCString &);
+static bool handleBug(const QCString &);
+static bool handleSubpage(const QCString &s);
+static bool handleDeprecated(const QCString &);
+static bool handleXRefItem(const QCString &);
+static bool handleRelated(const QCString &);
+static bool handleRelatedAlso(const QCString &);
+static bool handleMemberOf(const QCString &);
+static bool handleRefItem(const QCString &);
+static bool handleSection(const QCString &);
+static bool handleAnchor(const QCString &);
+static bool handleFormatBlock(const QCString &);
+static bool handleAddIndex(const QCString &);
+static bool handleIf(const QCString &);
+static bool handleIfNot(const QCString &);
+static bool handleElseIf(const QCString &);
+static bool handleElse(const QCString &);
+static bool handleEndIf(const QCString &);
+static bool handleIngroup(const QCString &);
+static bool handleNoSubGrouping(const QCString &);
+static bool handleShowInitializer(const QCString &);
+static bool handleHideInitializer(const QCString &);
+static bool handleCallgraph(const QCString &);
+static bool handleCallergraph(const QCString &);
+static bool handleInternal(const QCString &);
+static bool handleLineBr(const QCString &);
+static bool handleStatic(const QCString &);
+static bool handlePure(const QCString &);
+static bool handlePrivate(const QCString &);
+static bool handlePrivateSection(const QCString &);
+static bool handleProtected(const QCString &);
+static bool handleProtectedSection(const QCString &);
+static bool handlePublic(const QCString &s);
+static bool handlePublicSection(const QCString &s);
+static bool handleInherit(const QCString &);
+static bool handleExtends(const QCString &);
+
+typedef bool (*DocCmdFunc)(const QCString &name);
+
+struct DocCmdMap
+{
+ const char *cmdName;
+ DocCmdFunc handler;
+ bool endsBrief;
+};
+
+// map of command to handler function
+static DocCmdMap docCmdMap[] =
+{
+ // command name handler function ends brief description
+ { "brief", &handleBrief, FALSE },
+ { "short", &handleBrief, FALSE },
+ { "fn", &handleFn, FALSE },
+ { "var", &handleFn, FALSE },
+ { "typedef", &handleFn, FALSE },
+ { "property", &handleFn, FALSE },
+ { "def", &handleDef, FALSE },
+ { "overload", &handleOverload, FALSE },
+ { "enum", &handleEnum, FALSE },
+ { "defgroup", &handleDefGroup, FALSE },
+ { "addtogroup", &handleAddToGroup, FALSE },
+ { "weakgroup", &handleWeakGroup, FALSE },
+ { "namespace", &handleNamespace, FALSE },
+ { "package", &handlePackage, FALSE },
+ { "class", &handleClass, FALSE },
+ { "headerfile", &handleHeaderFile, FALSE },
+ { "protocol", &handleProtocol, FALSE },
+ { "category", &handleCategory, FALSE },
+ { "union", &handleUnion, FALSE },
+ { "struct", &handleStruct, FALSE },
+ { "interface", &handleInterface, FALSE },
+ { "idlexcept", &handleIdlException, FALSE },
+ { "page", &handlePage, FALSE },
+ { "mainpage", &handleMainpage, FALSE },
+ { "file", &handleFile, FALSE },
+ { "dir", &handleDir, FALSE },
+ { "example", &handleExample, FALSE },
+ { "details", &handleDetails, TRUE },
+ { "name", &handleName, FALSE },
+ { "todo", &handleTodo, FALSE }, // end brief will be done differently
+ { "test", &handleTest, FALSE }, // end brief will be done differently
+ { "bug", &handleBug, FALSE }, // end brief will be done differently
+ { "deprecated", &handleDeprecated, FALSE }, // end brief will be done differently
+ { "xrefitem", &handleXRefItem, FALSE }, // end brief will be done differently
+ { "related", &handleRelated, TRUE },
+ { "relates", &handleRelated, TRUE },
+ { "relatedalso", &handleRelatedAlso, TRUE },
+ { "relatesalso", &handleRelatedAlso, TRUE },
+ { "refitem", &handleRefItem, TRUE },
+ { "subpage", &handleSubpage, TRUE },
+ { "section", &handleSection, TRUE },
+ { "subsection", &handleSection, TRUE },
+ { "subsubsection", &handleSection, TRUE },
+ { "paragraph", &handleSection, TRUE },
+ { "anchor", &handleAnchor, TRUE },
+ { "verbatim", &handleFormatBlock, TRUE },
+ { "latexonly", &handleFormatBlock, FALSE },
+ { "htmlonly", &handleFormatBlock, FALSE },
+ { "xmlonly", &handleFormatBlock, FALSE },
+ { "rtfonly", &handleFormatBlock, FALSE },
+ { "manonly", &handleFormatBlock, FALSE },
+ { "dot", &handleFormatBlock, TRUE },
+ { "msc", &handleFormatBlock, TRUE },
+ { "code", &handleFormatBlock, TRUE },
+ { "addindex", &handleAddIndex, FALSE },
+ { "if", &handleIf, FALSE },
+ { "ifnot", &handleIfNot, FALSE },
+ { "elseif", &handleElseIf, FALSE },
+ { "else", &handleElse, FALSE },
+ { "endif", &handleEndIf, FALSE },
+ { "ingroup", &handleIngroup, FALSE },
+ { "nosubgrouping", &handleNoSubGrouping, FALSE },
+ { "showinitializer", &handleShowInitializer, FALSE },
+ { "hideinitializer", &handleHideInitializer, FALSE },
+ { "callgraph", &handleCallgraph, FALSE },
+ { "callergraph", &handleCallergraph, FALSE },
+ { "internal", &handleInternal, TRUE },
+ { "_linebr", &handleLineBr, FALSE },
+ { "static", &handleStatic, FALSE },
+ { "pure", &handlePure, FALSE },
+ { "private", &handlePrivate, FALSE },
+ { "privatesection", &handlePrivateSection, FALSE },
+ { "protected", &handleProtected, FALSE },
+ { "protectedsection",&handleProtectedSection, FALSE },
+ { "public", &handlePublic, FALSE },
+ { "publicsection", &handlePublicSection, FALSE },
+ { "inherit", &handleInherit, TRUE },
+ { "extends", &handleExtends, TRUE },
+ { "implements", &handleExtends, TRUE },
+ { "memberof", &handleMemberOf, TRUE },
+ { "arg", 0, TRUE },
+ { "attention", 0, TRUE },
+ { "author", 0, TRUE },
+ { "authors", 0, TRUE },
+ { "copydoc", 0, TRUE },
+ { "copybrief", 0, FALSE },
+ { "copydetails", 0, TRUE },
+ { "date", 0, TRUE },
+ { "dotfile", 0, TRUE },
+ { "htmlinclude", 0, FALSE },
+ { "image", 0, TRUE },
+ { "include", 0, TRUE },
+ { "includelineno", 0, TRUE },
+ { "invariant", 0, TRUE },
+ { "li", 0, TRUE },
+ { "line", 0, TRUE },
+ { "note", 0, TRUE },
+ { "par", 0, TRUE },
+ { "param", 0, TRUE },
+ { "tparam", 0, TRUE },
+ { "post", 0, TRUE },
+ { "pre", 0, TRUE },
+ { "remark", 0, TRUE },
+ { "remarks", 0, TRUE },
+ { "result", 0, TRUE },
+ { "return", 0, TRUE },
+ { "returns", 0, TRUE },
+ { "retval", 0, TRUE },
+ { "sa", 0, TRUE },
+ { "see", 0, TRUE },
+ { "since", 0, TRUE },
+ { "throw", 0, TRUE },
+ { "throws", 0, TRUE },
+ { "until", 0, TRUE },
+ { "verbinclude", 0, FALSE },
+ { "version", 0, TRUE },
+ { "warning", 0, TRUE },
+ { 0, 0, FALSE }
+};
+
+/** @brief Command mapper.
+ *
+ * Maps a command name (as found in a comment block) onto a
+ * specific handler function.
+ */
+class DocCmdMapper
+{
+ public:
+ struct Cmd
+ {
+ DocCmdFunc func;
+ bool endsBrief;
+ };
+
+ /** maps a command name to a handler function */
+ static Cmd *map(const char *name)
+ {
+ return instance()->find(name);
+ }
+
+ /** release the singleton */
+ static void freeInstance()
+ {
+ delete s_instance; s_instance=0;
+ }
+
+ private:
+ static DocCmdMapper *instance()
+ {
+ if (s_instance==0) s_instance = new DocCmdMapper;
+ return s_instance;
+ }
+
+ DocCmdMapper() : m_map(113)
+ {
+ m_map.setAutoDelete(TRUE);
+ DocCmdMap *p = docCmdMap;
+ while (p->cmdName)
+ {
+ if (m_map.find(p->cmdName)!=0)
+ {
+ printf("Error: DocCmdMapper: command %s already added\n",p->cmdName);
+ exit(1);
+ }
+ Cmd *cmd = new Cmd;
+ cmd->func = p->handler;
+ cmd->endsBrief = p->endsBrief;
+ m_map.insert(p->cmdName,cmd);
+ p++;
+ }
+ }
+
+ Cmd *find(const char *name)
+ {
+ return m_map.find(name);
+ }
+ QDict<Cmd> m_map;
+ static DocCmdMapper *s_instance;
+};
+
+DocCmdMapper *DocCmdMapper::s_instance=0;
+
+
+#define YY_NEVER_INTERACTIVE 1
+
+enum XRefKind
+{
+ XRef_Item,
+ XRef_Todo,
+ XRef_Test,
+ XRef_Bug,
+ XRef_Deprecated,
+ XRef_None
+};
+
+enum OutputContext
+{
+ OutputDoc,
+ OutputBrief,
+ OutputXRef,
+ OutputInbody
+};
+
+enum GuardType
+{
+ Guard_If,
+ Guard_IfNot,
+ Guard_Skip
+};
+
+class GuardedSection
+{
+ public:
+ GuardedSection(bool enabled,bool parentVisible)
+ : m_enabled(enabled),m_parentVisible(parentVisible) {}
+ bool isEnabled() const { return m_enabled; }
+ bool parentVisible() const { return m_parentVisible; }
+
+ private:
+ bool m_enabled;
+ bool m_parentVisible;
+};
+
+void openGroup(Entry *e,const char *file,int line);
+void closeGroup(Entry *e,const char *file,int line,bool foundInline=FALSE);
+void initGroupInfo(Entry *e);
+static void groupAddDocs(Entry *e,const char *fileName);
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+
+static ParserInterface *langParser; // the language parser that is calling us
+static QCString inputString; // input string
+static int inputPosition; // read pointer
+static QCString yyFileName; // file name that is read from
+static int yyLineNr; // line number in the input
+static bool inBody; // was the comment found inside the body of a function?
+static OutputContext inContext; // are we inside the brief, details or xref part
+static bool briefEndsAtDot; // does the brief description stop at a dot?
+static QCString formulaText; // Running text of a formula
+static QCString formulaEnv; // environment name
+static int formulaNewLines; // amount of new lines in the formula
+static QCString *pOutputString; // pointer to string to which the output is appended.
+static QCString outputXRef; // temp argument of todo/test/../xrefitem commands
+static QCString blockName; // preformatted block name (e.g. verbatim, latexonly,...)
+static XRefKind xrefKind; // kind of cross-reference command
+static XRefKind newXRefKind; //
+static GuardType guardType; // kind of guard for conditional section
+static bool enabledSectionFound;
+static QCString functionProto; // function prototype
+static QStack<GuardedSection> guards; // tracks nested conditional sections (if,ifnot,..)
+static Entry* current = 0 ; // working entry
+//static Entry* current_root = 0 ; // parent of working entry
+
+
+//static Entry* previous = 0 ; // TODO: remove need for this
+static bool needNewEntry;
+
+static QCString sectionLabel;
+static QCString sectionTitle;
+static QCString xrefItemKey;
+static QCString newXRefItemKey;
+static QCString xrefItemTitle;
+static QCString xrefListTitle;
+static Protection protection;
+
+static bool xrefAppendFlag;
+static bool inGroupParamFound;
+static int braceCount;
+static bool insidePre;
+static bool parseMore;
+static int g_condCount;
+static int g_sectionLevel;
+
+static int g_commentCount;
+
+//-----------------------------------------------------------------------------
+
+static QStack<Grouping> g_autoGroupStack;
+static int g_memberGroupId = DOX_NOGROUP;
+static QCString g_memberGroupHeader;
+static QCString g_memberGroupDocs;
+static QCString g_memberGroupRelates;
+static QCString g_compoundName;
+
+//-----------------------------------------------------------------------------
+
+static void initParser()
+{
+ sectionLabel.resize(0);
+ sectionTitle.resize(0);
+ g_memberGroupHeader.resize(0);
+}
+
+//-----------------------------------------------------------------------------
+
+static QCString getDocSectionName(int s)
+{
+ switch(s)
+ {
+ case Entry::CLASSDOC_SEC: return "\\class";
+ case Entry::STRUCTDOC_SEC: return "\\struct";
+ case Entry::UNIONDOC_SEC: return "\\union";
+ case Entry::EXCEPTIONDOC_SEC: return "\\exception";
+ case Entry::NAMESPACEDOC_SEC: return "\\namespace";
+ case Entry::PROTOCOLDOC_SEC: return "\\protocol";
+ case Entry::CATEGORYDOC_SEC: return "\\category";
+ case Entry::ENUMDOC_SEC: return "\\enum";
+ case Entry::PAGEDOC_SEC: return "\\page";
+ case Entry::VARIABLEDOC_SEC: return "\\var";
+ case Entry::MEMBERDOC_SEC: return "\\fn";
+ case Entry::OVERLOADDOC_SEC: return "\\overload";
+ case Entry::FILEDOC_SEC: return "\\file";
+ case Entry::DEFINEDOC_SEC: return "\\def";
+ case Entry::GROUPDOC_SEC: return "\\defgroup";
+ case Entry::MAINPAGEDOC_SEC: return "\\mainpage";
+ case Entry::PACKAGEDOC_SEC: return "\\package";
+ case Entry::DIRDOC_SEC: return "\\dir";
+ case Entry::EXAMPLE_SEC: return "\\example";
+ case Entry::MEMBERGRP_SEC: return "\\name";
+ default: return "";
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+static bool makeStructuralIndicator(Entry::Sections s)
+{
+ //printf("current->section=%x\n",current->section);
+ if (!getDocSectionName(current->section).isEmpty())
+ {
+ return TRUE;
+ }
+ else
+ {
+ needNewEntry = TRUE;
+ current->section = s;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ return FALSE;
+ }
+}
+
+static void lineCount()
+{
+ for( const char* c = yytext ; *c ; ++c )
+ yyLineNr += (*c == '\n') ;
+}
+
+
+static QCString stripQuotes(const char *s)
+{
+ QCString name;
+ if (s==0 || *s==0) return name;
+ name=s;
+ if (name.at(0)=='"' && name.at(name.length()-1)=='"')
+ {
+ name=name.mid(1,name.length()-2);
+ }
+ return name;
+}
+
+//-----------------------------------------------------------------
+
+static void addXRefItem(const char *listName,const char *itemTitle,
+ const char *listTitle,bool append)
+{
+ Entry *docEntry = current; // inBody && previous ? previous : current;
+ if (listName==0) return;
+ //printf("addXRefItem(%s,%s,%s,%d)\n",listName,itemTitle,listTitle,append);
+
+ ListItemInfo *lii=0;
+ RefList *refList = Doxygen::xrefLists->find(listName);
+ if (refList==0) // new list
+ {
+ refList = new RefList(listName,listTitle,itemTitle);
+ Doxygen::xrefLists->insert(listName,refList);
+ //printf("new list!\n");
+ }
+ if (docEntry->sli)
+ {
+ QListIterator<ListItemInfo> slii(*docEntry->sli);
+ for (slii.toFirst();(lii=slii.current());++slii)
+ {
+ if (strcmp(lii->type,listName)==0)
+ {
+ //printf("found %s lii->type=%s\n",listName,lii->type);
+ break;
+ }
+ }
+ }
+ if (lii && append) // already found item of same type just before this one
+ {
+ //printf("listName=%s item id = %d existing\n",listName,lii->itemId);
+ RefItem *item = refList->getRefItem(lii->itemId);
+ ASSERT(item!=0);
+ item->text += " <p>";
+ item->text += outputXRef;
+ //printf("%s: text +=%s\n",listName,item->text.data());
+ }
+ else // new item
+ {
+ int itemId = refList->addRefItem();
+ //printf("listName=%s item id = %d new current=%p\n",listName,itemId,current);
+
+ // if we have already an item from the same list type (e.g. a second @todo)
+ // in the same Entry (i.e. lii!=0) then we reuse its link anchor.
+ char anchorLabel[1024];
+ //sprintf(anchorLabel,"_%s%06d",listName,lii ? lii->itemId : itemId);
+ sprintf(anchorLabel,"_%s%06d",listName,itemId);
+ RefItem *item = refList->getRefItem(itemId);
+ ASSERT(item!=0);
+ item->text = outputXRef;
+ item->listAnchor = anchorLabel;
+ docEntry->addSpecialListItem(listName,itemId);
+ QCString cmdString;
+ cmdString.sprintf("\\xrefitem %s %d.",listName,itemId);
+ if (inBody)
+ {
+ docEntry->inbodyDocs += cmdString;
+ }
+ else
+ {
+ docEntry->doc += cmdString;
+ }
+ SectionInfo *si=new SectionInfo(listName,anchorLabel,
+ sectionTitle,SectionInfo::Anchor);
+ Doxygen::sectionDict.insert(anchorLabel,si);
+ docEntry->anchors->append(si);
+ }
+ outputXRef.resize(0);
+}
+
+//-----------------------------------------------------------------------------
+
+// Adds a formula text to the list/dictionary of formulas if it was
+// not already added. Returns the label of the formula.
+static QCString addFormula()
+{
+ QCString formLabel;
+ QCString fText=formulaText.simplifyWhiteSpace();
+ Formula *f=0;
+ if ((f=Doxygen::formulaDict[fText])==0)
+ {
+ f = new Formula(fText);
+ Doxygen::formulaList.append(f);
+ Doxygen::formulaDict.insert(fText,f);
+ formLabel.sprintf("\\form#%d",f->getId());
+ Doxygen::formulaNameDict.insert(formLabel,f);
+ }
+ else
+ {
+ formLabel.sprintf("\\form#%d",f->getId());
+ }
+ int i;
+ for (i=0;i<formulaNewLines;i++) formLabel+="\\_fakenl"; // add fake newlines to
+ // keep the warnings
+ // correctly aligned.
+ return formLabel;
+}
+
+//-----------------------------------------------------------------------------
+
+static void checkFormula();
+//-----------------------------------------------------------------------------
+
+static void addSection()
+{
+ sectionTitle+=yytext;
+ sectionTitle=sectionTitle.stripWhiteSpace();
+ //printf("Adding new section file=%s label=%s title=%s\n",yyFileName,sectionLabel.data(),sectionTitle.data());
+ SectionInfo *si = new SectionInfo(yyFileName,sectionLabel,sectionTitle,SectionInfo::Anchor);
+ current->anchors->append(si);
+ Doxygen::sectionDict.insert(yytext,si);
+}
+
+//-----------------------------------------------------------------------------
+
+// strip trailing whitespace (excluding newlines) from string s
+static void stripTrailingWhiteSpace(QCString &s)
+{
+ uint len = s.length();
+ int i = (int)len-1;
+ char c;
+ while (i>=0 && ((c = s.at(i))==' ' || c=='\t' || c=='\r')) i--;
+ if (i!=(int)len-1)
+ {
+ s.resize(i+2); // string upto and including char at pos i and \0 terminator
+ }
+}
+
+// selects the output to write to
+static inline void setOutput(OutputContext ctx)
+{
+ bool xrefAppendToPrev = xrefAppendFlag;
+ // determine append flag for the next item (i.e. the end of this item)
+ xrefAppendFlag = !inBody &&
+ inContext==OutputXRef && ctx==OutputXRef && // two consecutive xref items
+ newXRefKind==xrefKind && // of the same kind
+ (xrefKind!=XRef_Item ||
+ newXRefItemKey==xrefItemKey); // with the same key if \xrefitem
+ //printf("%d && %d && %d && (%d || %d)\n",
+ // inContext==OutputXRef,
+ // ctx==OutputXRef,
+ // newXRefKind==xrefKind,
+ // xrefKind!=XRef_Item,
+ // newXRefItemKey==xrefItemKey);
+
+ //printf("refKind=%d newXRefKind=%d xrefAppendToPrev=%d xrefAppendFlag=%d\n",
+ // xrefKind,newXRefKind,xrefAppendToPrev,xrefAppendFlag);
+
+ //printf("setOutput(inContext=%d ctx=%d)\n",inContext,ctx);
+ if (inContext==OutputXRef) // end of XRef section => add the item
+ {
+ // See if we can append this new xref item to the previous one.
+ // We know this at the start of the next item of the same
+ // type and need to remember this until the end of that item.
+ switch(xrefKind)
+ {
+ case XRef_Todo:
+ addXRefItem("todo",
+ theTranslator->trTodo(),
+ theTranslator->trTodoList(),
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_Test:
+ addXRefItem("test",
+ theTranslator->trTest(),
+ theTranslator->trTestList(),
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_Bug:
+ addXRefItem("bug",
+ theTranslator->trBug(),
+ theTranslator->trBugList(),
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_Deprecated:
+ addXRefItem("deprecated",
+ theTranslator->trDeprecated(),
+ theTranslator->trDeprecatedList(),
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_Item: // user defined list
+ addXRefItem(xrefItemKey,
+ xrefItemTitle,
+ xrefListTitle,
+ xrefAppendToPrev
+ );
+ break;
+ case XRef_None:
+ ASSERT(0);
+ break;
+ }
+ }
+ xrefItemKey = newXRefItemKey;
+
+ int oldContext = inContext;
+ inContext = ctx;
+ if (inContext!=OutputXRef && inBody) inContext=OutputInbody;
+ switch(inContext)
+ {
+ case OutputDoc:
+ if (oldContext!=inContext)
+ {
+ stripTrailingWhiteSpace(current->doc);
+ if (current->docFile.isEmpty())
+ {
+ current->docFile = yyFileName;
+ current->docLine = yyLineNr;
+ }
+ }
+ pOutputString = &current->doc;
+ break;
+ case OutputBrief:
+ if (oldContext!=inContext)
+ {
+ if (current->briefFile.isEmpty())
+ {
+ current->briefFile = yyFileName;
+ current->briefLine = yyLineNr;
+ }
+ }
+ if (current->brief.stripWhiteSpace().isEmpty()) // we only want one brief
+ // description even if multiple
+ // are given...
+ {
+ pOutputString = &current->brief;
+ }
+ else
+ {
+ pOutputString = &current->doc;
+ inContext = OutputDoc; // need to switch to detailed docs, see bug 631380
+ }
+ break;
+ case OutputXRef:
+ pOutputString = &outputXRef;
+ // first item found, so can't append to previous
+ //xrefAppendFlag = FALSE;
+ break;
+ case OutputInbody:
+ pOutputString = &current->inbodyDocs;
+ break;
+ }
+}
+
+// add a string to the output
+static inline void addOutput(const char *s)
+{
+ *pOutputString+=s;
+}
+
+// add a character to the output
+static inline void addOutput(char c)
+{
+ *pOutputString+=c;
+}
+
+static void endBrief(bool addToOutput=TRUE)
+{
+ if (!current->brief.stripWhiteSpace().isEmpty())
+ { // only go to the detailed description if we have
+ // found some brief description and not just whitespace
+ briefEndsAtDot=FALSE;
+ setOutput(OutputDoc);
+ if (addToOutput) addOutput(yytext);
+ }
+}
+
+/* ----------------------------------------------------------------- */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int prevPosition=0;
+
+static int yyread(char *buf,int max_size)
+{
+ prevPosition=inputPosition;
+ int c=0;
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ //printf("%d (%c)\n",*buf,*buf);
+ c++; buf++;
+ }
+ return c;
+}
+
+%}
+
+ /* start command character */
+CMD ("\\"|"@")
+DCMD1 ("arg"|"attention"|"author"|"code")
+DCMD2 ("date"|"dot"|"msc"|"dotfile"|"example")
+DCMD3 ("htmlinclude"|"htmlonly"|"image"|"include")
+DCMD4 ("includelineno"|"internal"|"invariant")
+DCMD5 ("latexonly"|"li"|"line"|"manonly"|"name")
+DCMD6 ("note"|"par"|"paragraph"|"param"|"post")
+DCMD7 ("pre"|"remarks"|(("relate"[sd])("also")?))
+DCMD8 ("remarks"|("return"[s]?)|"retval"|"sa"|"section")
+DCMD9 ("see"|"since"|"subsection"|"subsubsection")
+DCMD10 ("throw"|"until"|"verbatim")
+DCMD11 ("verbinclude"|"version"|"warning")
+DETAILEDCMD {CMD}({DCMD1}|{DCMD2}|{DCMD3}|{DCMD4}|{DCMD5}|{DCMD6}|{DCMD7}|{DCMD8}|{DCMD9}|{DCMD10}|{DCMD11})
+XREFCMD {CMD}("bug"|"deprecated"|"test"|"todo"|"xrefitem")
+PRE [pP][rR][eE]
+TABLE [tT][aA][bB][lL][eE]
+P [pP]
+UL [uU][lL]
+OL [oO][lL]
+DL [dD][lL]
+IMG [iI][mM][gG]
+HR [hH][rR]
+DETAILEDHTML {PRE}|{UL}|{TABLE}|{OL}|{DL}|{P}|[Hh][1-6]|{IMG}|{HR}
+BN [ \t\n\r]
+BL [ \t\r]*"\n"
+B [ \t]
+BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
+ATTR ({B}+[^>\n]*)?
+DOCNL "\n"|"\\_linebr"
+LC "\\"{B}*"\n"
+NW [^a-z_A-Z0-9]
+FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+]
+FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+]
+FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"")
+ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
+LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
+SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
+SCOPENAME "$"?(({ID}?{BN}*("::"|"."){BN}*)*)((~{BN}*)?{ID})
+MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
+RCSTAG "$"{ID}":"[^\n$]+"$"
+
+%option noyywrap
+
+ /* comment parsing states. */
+%x Comment
+%x PageDocArg1
+%x PageDocArg2
+%x RelatesParam1
+%x ClassDocArg1
+%x ClassDocArg2
+%x ClassDocArg3
+%x CategoryDocArg1
+%x XRefItemParam1
+%x XRefItemParam2
+%x XRefItemParam3
+%x FileDocArg1
+%x EnumDocArg1
+%x NameSpaceDocArg1
+%x PackageDocArg1
+%x GroupDocArg1
+%x GroupDocArg2
+%x SectionLabel
+%x SectionTitle
+%x SubpageLabel
+%x SubpageTitle
+%x FormatBlock
+%x LineParam
+%x GuardParam
+%x GuardParamEnd
+%x SkipGuardedSection
+%x SkipInternal
+%x NameParam
+%x InGroupParam
+%x FnParam
+%x OverloadParam
+%x InheritParam
+%x ExtendsParam
+%x ReadFormulaShort
+%x ReadFormulaLong
+%x AnchorLabel
+%x HtmlComment
+%x SkipLang
+
+%%
+
+ /* What can happen in while parsing a comment block:
+ * commands (e.g. @page, or \page)
+ * escaped commands (e.g. @@page or \\page).
+ * formulas (e.g. \f$ \f[ \f{..)
+ * directories (e.g. \doxygen\src\)
+ * autolist end. (e.g. a dot on an otherwise empty line)
+ * newlines.
+ * end of brief description due to blank line.
+ * end of brief description due to some command (@command, or <command>).
+ * words and whitespace and other characters (#,?!, etc).
+ * grouping commands (e.g. @{ and @})
+ * language switch (e.g. \~english or \~).
+ * mail adress (e.g. dimitri@stack.nl).
+ * quoted text, such as "foo@bar"
+ * XML commands, <summary></summary><remarks></remarks>
+ */
+
+<Comment>{CMD}{CMD}[a-z_A-Z]+{B}* { // escaped command
+ addOutput(yytext);
+ }
+<Comment>{CMD}{CMD}"~"[a-z_A-Z]* { // escaped command
+ addOutput(yytext);
+ }
+<Comment>{MAILADR} { // mail adress
+ addOutput(yytext);
+ }
+<Comment>"\""[^"\n]*"\"" { // quoted text
+ addOutput(yytext);
+ }
+<Comment>("\\"[a-z_A-Z]+)+"\\" { // directory (or chain of commands!)
+ addOutput(yytext);
+ }
+<Comment>{XREFCMD}/[^a-z_A-Z]* { // xref command
+ if (inContext!=OutputXRef)
+ {
+ briefEndsAtDot=FALSE;
+ setOutput(OutputDoc);
+ }
+ // continue with the same input
+ REJECT;
+ }
+ /*
+<Comment>{DETAILEDCMD}/[^a-z_A-Z]* { // command that can end a brief description
+ briefEndsAtDot=FALSE;
+ setOutput(OutputDoc);
+ // continue with the same input
+ REJECT;
+ }
+ */
+<Comment>"<"{DETAILEDHTML}{ATTR}">" { // HTML command that ends a brief description
+ setOutput(OutputDoc);
+ // continue with the same input
+ REJECT;
+ }
+<Comment>"<summary>" { // start of a .NET XML style brief description
+ setOutput(OutputBrief);
+ }
+<Comment>"<remarks>"|"</summary>" { // start of a .NET XML style detailed description
+ setOutput(OutputDoc);
+ }
+<Comment>"</remarks>" { // end of a brief or detailed description
+ }
+<Comment>{RCSTAG} { // RCS tag which end a brief description
+ setOutput(OutputDoc);
+ REJECT;
+ }
+<Comment>"<!--" {
+ BEGIN(HtmlComment);
+ }
+<Comment>{B}*{CMD}"endinternal"{B}* {
+ warn(yyFileName,yyLineNr,
+ "warning: found \\endinternal without matching \\internal"
+ );
+ }
+<Comment>{B}*{CMD}[a-z_A-Z]+{B}* { // potentially interesting command
+ // the {B}* in the front was added for bug620924
+ QCString cmdName = QCString(yytext).stripWhiteSpace().data()+1;
+ DocCmdMapper::Cmd *cmdPtr = DocCmdMapper::map(cmdName);
+ if (cmdPtr) // special action is required
+ {
+ if (cmdPtr->endsBrief)
+ {
+ briefEndsAtDot=FALSE;
+ // this command forces the end of brief description
+ setOutput(OutputDoc);
+ }
+ if (cmdPtr->func && cmdPtr->func(cmdName))
+ {
+ // implicit split of the comment block into two
+ // entries. Restart the next block at the start
+ // of this command.
+ parseMore=TRUE;
+
+ // yuk, this is probably not very portable across lex implementations,
+ // but we need to know the position in the input buffer where this
+ // rule matched.
+ // for flex 2.5.33+ we should use YY_CURRENT_BUFFER_LVALUE
+#if YY_FLEX_MINOR_VERSION>=5 && YY_FLEX_SUBMINOR_VERSION>=33
+ inputPosition=prevPosition + yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+#else
+ inputPosition=prevPosition + yy_bp - yy_current_buffer->yy_ch_buf;
+#endif
+ yyterminate();
+ }
+ else if (cmdPtr->func==0)
+ {
+ // command without handler, to be processed
+ // later by parsedoc.cpp
+ addOutput(yytext);
+ }
+ }
+ else // command not relevant
+ {
+ addOutput(yytext);
+ }
+ }
+<Comment>{B}*("\\\\"|"@@")"f"[$\[{] { // escaped formula command
+ addOutput(yytext);
+ }
+<Comment>{B}*{CMD}"~"[a-z_A-Z]* { // language switch command
+ QCString langId = QString(yytext).stripWhiteSpace().data()+2;
+ if (!langId.isEmpty() &&
+ stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0)
+ { // enable language specific section
+ BEGIN(SkipLang);
+ }
+ }
+<Comment>{B}*{CMD}"f{"[^}\n]+"}"("{"?) { // start of a formula with custom environment
+ formulaText="\\begin";
+ formulaEnv=QString(yytext).stripWhiteSpace().data()+2;
+ if (formulaEnv.at(formulaEnv.length()-1)=='{')
+ {
+ // remove trailing open brace
+ formulaEnv=formulaEnv.left(formulaEnv.length()-1);
+ }
+ formulaText+=formulaEnv;
+ formulaNewLines=0;
+ BEGIN(ReadFormulaLong);
+ }
+<Comment>{B}*{CMD}"f$" { // start of a inline formula
+ formulaText="$";
+ formulaNewLines=0;
+ BEGIN(ReadFormulaShort);
+ }
+<Comment>{B}*{CMD}"f[" { // start of a block formula
+ formulaText="\\[";
+ formulaNewLines=0;
+ BEGIN(ReadFormulaLong);
+ }
+<Comment>{B}*{CMD}"{" { // begin of a group
+ //langParser->handleGroupStartCommand(g_memberGroupHeader);
+ openGroup(current,yyFileName,yyLineNr);
+ }
+<Comment>{B}*{CMD}"}" { // end of a group
+ //langParser->handleGroupEndCommand();
+ closeGroup(current,yyFileName,yyLineNr,TRUE);
+ g_memberGroupHeader.resize(0);
+ parseMore=TRUE;
+ needNewEntry = TRUE;
+#if YY_FLEX_MINOR_VERSION>=5 && YY_FLEX_SUBMINOR_VERSION>=33
+ inputPosition=prevPosition + yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + strlen(yytext);
+#else
+ inputPosition=prevPosition + yy_bp - yy_current_buffer->yy_ch_buf + strlen(yytext);
+#endif
+ yyterminate();
+ }
+<Comment>{B}*{CMD}[$@\\&~<>#%] { // escaped character
+ addOutput(yytext);
+ }
+<Comment>[a-z_A-Z]+ { // normal word
+ addOutput(yytext);
+ }
+<Comment>^{B}*"."{B}*/\n { // explicit end autolist: e.g " ."
+ addOutput(yytext);
+ }
+<Comment>^{B}*"-" { // start of autolist
+ setOutput(OutputDoc);
+ addOutput(yytext);
+ }
+<Comment>("."+)[a-z_A-Z0-9\)] { // . at start or in the middle of a word, or ellipsis
+ addOutput(yytext);
+ }
+<Comment>".\\"[ \t] { // . with escaped space.
+ addOutput(yytext[0]);
+ addOutput(yytext[2]);
+ }
+<Comment>".," { // . with comma such as "e.g.,"
+ addOutput(yytext);
+ }
+<Comment>"...\\"[ \t] { // ellipsis with escaped space.
+ addOutput("... ");
+ }
+<Comment>".."[\.]?/[^ \t\n] { // internal ellipsis
+ addOutput(yytext);
+ }
+<Comment>(\n|\\_linebr)({B}*(\n|\\_linebr))+ { // at least one blank line (or blank line command)
+ if (inContext==OutputXRef)
+ {
+ // see bug 613024, we need to put the newlines after ending the XRef section.
+ setOutput(OutputDoc);
+ addOutput("\n\n");
+ }
+ else if (inContext!=OutputBrief)
+ {
+ addOutput("\n\n");
+ setOutput(OutputDoc);
+ }
+ else // inContext==OutputBrief
+ { // only go to the detailed description if we have
+ // found some brief description and not just whitespace
+ endBrief(FALSE);
+ }
+ lineCount();
+ }
+<Comment>"." { // potential end of a JavaDoc style comment
+ addOutput(*yytext);
+ if (briefEndsAtDot)
+ {
+ setOutput(OutputDoc);
+ briefEndsAtDot=FALSE;
+ }
+ }
+<Comment>\n { // newline
+ addOutput(*yytext);
+ yyLineNr++;
+ }
+<Comment>. { // catch-all for anything else
+ addOutput(*yytext);
+ }
+
+
+ /* -------------- Rules for handling HTML comments ----------- */
+
+<HtmlComment>"--"[!]?">"{B}* { BEGIN( Comment ); }
+<HtmlComment>{DOCNL} {
+ if (*yytext=='\n') yyLineNr++;
+ }
+<HtmlComment>[^\\\n\-]+ { // ignore unimportant characters
+ }
+<HtmlComment>. { // ignore every else
+ }
+
+ /* -------------- Rules for handling formulas ---------------- */
+
+<ReadFormulaShort>{CMD}"f$" { // end of inline formula
+ formulaText+="$";
+ addOutput(" "+addFormula());
+ BEGIN(Comment);
+ }
+<ReadFormulaLong>{CMD}"f]" { // end of block formula
+ formulaText+="\\]";
+ addOutput(" "+addFormula());
+ BEGIN(Comment);
+ }
+<ReadFormulaLong>{CMD}"f}" { // end of custom env formula
+ formulaText+="\\end";
+ formulaText+=formulaEnv;
+ addOutput(" "+addFormula());
+ BEGIN(Comment);
+ }
+<ReadFormulaLong,ReadFormulaShort>[^\\@\n]+ { // any non-special character
+ formulaText+=yytext;
+ }
+<ReadFormulaLong,ReadFormulaShort>\n { // new line
+ formulaNewLines++;
+ formulaText+=*yytext;
+ yyLineNr++;
+ }
+<ReadFormulaLong,ReadFormulaShort>. { // any othe character
+ formulaText+=*yytext;
+ }
+
+ /* ------------ handle argument of enum command --------------- */
+
+<EnumDocArg1>{SCOPEID} { // handle argument
+ current->name = yytext;
+ BEGIN( Comment );
+ }
+<EnumDocArg1>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<EnumDocArg1>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after \\enum."
+ );
+ addOutput('\n');
+ if (*yytext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+<EnumDocArg1>. { // ignore other stuff
+ }
+
+ /* ------------ handle argument of namespace command --------------- */
+
+<NameSpaceDocArg1>{SCOPENAME} { // handle argument
+ current->name = substitute(yytext,".","::");
+ BEGIN( Comment );
+ }
+<NameSpaceDocArg1>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<NameSpaceDocArg1>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after "
+ "\\namespace."
+ );
+ addOutput('\n');
+ if (*yytext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+<NameSpaceDocArg1>. { // ignore other stuff
+ }
+
+ /* ------------ handle argument of package command --------------- */
+
+<PackageDocArg1>{ID}("."{ID})* { // handle argument
+ current->name = yytext;
+ BEGIN( Comment );
+ }
+<PackageDocArg1>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<PackageDocArg1>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after "
+ "\\package."
+ );
+ addOutput('\n');
+ if (*yytext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+<PackageDocArg1>. { // ignore other stuff
+ }
+
+ /* ------ handle argument of class/struct/union command --------------- */
+
+<ClassDocArg1>{SCOPENAME} { // first argument
+ current->name = substitute(yytext,".","::");
+ if (current->section==Entry::PROTOCOLDOC_SEC)
+ {
+ current->name+="-p";
+ }
+ // prepend outer scope name
+ BEGIN( ClassDocArg2 );
+ }
+<CategoryDocArg1>{SCOPENAME}{B}*"("[^\)]+")" {
+ current->name = substitute(yytext,".","::");
+ BEGIN( ClassDocArg2 );
+ }
+<ClassDocArg1,CategoryDocArg1>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<ClassDocArg1,CategoryDocArg1>{DOCNL} {
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after "
+ "\\%s.",YY_START==ClassDocArg1?"class":"category"
+ );
+ addOutput('\n');
+ if (*yytext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+<ClassDocArg1,CategoryDocArg1>. { // ignore other stuff
+ }
+
+<ClassDocArg2>{FILE}|"<>" { // second argument; include file
+ current->includeFile = yytext;
+ BEGIN( ClassDocArg3 );
+ }
+<ClassDocArg2>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<ClassDocArg2>{DOCNL} {
+ addOutput('\n');
+ if (*yytext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+<ClassDocArg2>. { // ignore other stuff
+ }
+
+<ClassDocArg3>[<]?{FILE}?[>]? { // third argument; include file name
+ current->includeName = yytext;
+ BEGIN( Comment );
+ }
+<ClassDocArg3>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<ClassDocArg3>{DOCNL} {
+ if (*yytext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+<ClassDocArg3>. { // ignore other stuff
+ }
+
+ /* --------- handle arguments of {def,add,weak}group commands --------- */
+
+<GroupDocArg1>{LABELID}(".html"?) { // group name
+ current->name = yytext;
+ //lastDefGroup.groupname = yytext;
+ //lastDefGroup.pri = current->groupingPri();
+ // the .html stuff is for Qt compatibility
+ if (current->name.right(5)==".html")
+ {
+ current->name=current->name.left(current->name.length()-5);
+ }
+ current->type.resize(0);
+ BEGIN(GroupDocArg2);
+ }
+<GroupDocArg1>"\\"{B}*"\n" { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<GroupDocArg1>{DOCNL} { // missing argument!
+ warn(yyFileName,yyLineNr,
+ "warning: missing group name after %s",
+ current->groupDocCmd()
+ );
+ addOutput('\n');
+ if (*yytext=='\n') yyLineNr++;
+ BEGIN( Comment );
+ }
+<GroupDocArg2>"\\"{B}*"\n" { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<GroupDocArg2>[^\n\\\*]+ { // title (stored in type)
+ current->type += yytext;
+ current->type = current->type.stripWhiteSpace();
+ }
+<GroupDocArg2>{DOCNL} {
+ if ( current->groupDocType==Entry::GROUPDOC_NORMAL &&
+ current->type.isEmpty()
+ ) // defgroup requires second argument
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: missing title after "
+ "\\defgroup %s", current->name.data()
+ );
+ }
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+
+ /* --------- handle arguments of page/mainpage command ------------------- */
+
+<PageDocArg1>{FILE} { // first argument; page name
+ current->name = stripQuotes(yytext);
+ BEGIN( PageDocArg2 );
+ }
+<PageDocArg1>{LC} { yyLineNr++;
+ addOutput('\n');
+ }
+<PageDocArg1>{DOCNL} {
+ warn(yyFileName,yyLineNr,
+ "warning: missing argument after "
+ "\\page."
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<PageDocArg1>. { // ignore other stuff
+ }
+<PageDocArg2>.*"\n" { // second argument; page title
+ yyLineNr++;
+ current->args = yytext;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+
+ /* --------- handle arguments of the file/dir/example command ------------ */
+
+<FileDocArg1>{DOCNL} { // no file name specfied
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<FileDocArg1>{FILE} { // first argument; name
+ current->name = stripQuotes(yytext);
+ BEGIN( Comment );
+ }
+<FileDocArg1>{LC} { yyLineNr++;
+ addOutput('\n');
+ }
+<FileDocArg1>. { // ignore other stuff
+ }
+
+ /* --------- handle arguments of the xrefitem command ------------ */
+
+<XRefItemParam1>{LABELID} { // first argument
+ newXRefItemKey=yytext;
+ setOutput(OutputXRef);
+ BEGIN(XRefItemParam2);
+ }
+<XRefItemParam1>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<XRefItemParam1>{DOCNL} { // missing arguments
+ warn(yyFileName,yyLineNr,
+ "warning: Missing first argument of \\xrefitem"
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ inContext = OutputDoc;
+ BEGIN( Comment );
+ }
+<XRefItemParam1>. { // ignore other stuff
+ }
+
+<XRefItemParam2>"\""[^\n\"]*"\"" { // second argument
+ xrefItemTitle = stripQuotes(yytext);
+ BEGIN(XRefItemParam3);
+ }
+<XRefItemParam2>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<XRefItemParam2>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: Missing second argument of \\xrefitem"
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ inContext = OutputDoc;
+ BEGIN( Comment );
+ }
+<XRefItemParam2>. { // ignore other stuff
+ }
+
+<XRefItemParam3>"\""[^\n\"]*"\"" { // third argument
+ xrefListTitle = stripQuotes(yytext);
+ xrefKind = XRef_Item;
+ BEGIN( Comment );
+ }
+<XRefItemParam2,XRefItemParam3>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<XRefItemParam3>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: Missing third argument of \\xrefitem"
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ inContext = OutputDoc;
+ BEGIN( Comment );
+ }
+<XRefItemParam3>. { // ignore other stuff
+ }
+
+
+ /* ----- handle arguments of the relates(also)/memberof command ------- */
+
+<RelatesParam1>({ID}("::"|"."))*{ID} { // argument
+ current->relates = yytext;
+ //if (current->mGrpId!=DOX_NOGROUP)
+ //{
+ // memberGroupRelates = yytext;
+ //}
+ BEGIN( Comment );
+ }
+<RelatesParam1>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<RelatesParam1>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: Missing argument of \\relates or \\memberof command"
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<RelatesParam1>. { // ignore other stuff
+ }
+
+
+ /* ----- handle arguments of the relates(also)/addindex commands ----- */
+
+<LineParam>{DOCNL} { // end of argument
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<LineParam>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<LineParam>. { // ignore other stuff
+ addOutput(*yytext);
+ }
+
+ /* ----- handle arguments of the section/subsection/.. commands ------- */
+
+<SectionLabel>{LABELID} { // first argyment
+ sectionLabel=yytext;
+ addOutput(yytext);
+ sectionTitle.resize(0);
+ BEGIN(SectionTitle);
+ }
+<SectionLabel>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\section command has no label"
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<SectionLabel>. { // invalid character for section label
+ warn(yyFileName,yyLineNr,
+ "warning: Invalid or missing section label"
+ );
+ BEGIN(Comment);
+ }
+
+<SectionTitle>[^\n@\\*]*/"\n" { // end of section title
+ addSection();
+ addOutput(yytext);
+ BEGIN( Comment );
+ }
+<SectionTitle>[^\n@\\]*/"\\_linebr" { // end of section title
+ addSection();
+ addOutput(yytext);
+ BEGIN( Comment );
+ }
+<SectionTitle>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<SectionTitle>[^\n@\\]* { // any character without special meaning
+ sectionTitle+=yytext;
+ addOutput(yytext);
+ }
+<SectionTitle>("\\\\"|"@@"){ID} { // unescape escaped command
+ sectionTitle+=&yytext[1];
+ addOutput(yytext);
+ }
+<SectionTitle>{CMD}[$@\\&~<>#%] { // unescape escaped character
+ sectionTitle+=yytext[1];
+ addOutput(yytext);
+ }
+<SectionTitle>. { // anything else
+ sectionTitle+=yytext;
+ addOutput(*yytext);
+ }
+
+ /* ----- handle arguments of the subpage command ------- */
+
+<SubpageLabel>{LABELID} { // first argument
+ addOutput(yytext);
+ // we add subpage labels as a kind of "inheritance" relation to prevent
+ // needing to add another list to the Entry class.
+ current->extends->append(new BaseInfo(yytext,Public,Normal));
+ BEGIN(SubpageTitle);
+ }
+<SubpageLabel>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\subpage command has no label"
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<SubpageTitle>{DOCNL} { // no title, end command
+ addOutput(yytext);
+ BEGIN( Comment );
+ }
+<SubpageTitle>[ \t]*"\""[^\"\n]*"\"" { // add title, end of command
+ addOutput(yytext);
+ BEGIN( Comment );
+ }
+<SubpageTitle>. { // no title, end of command
+ unput(*yytext);
+ BEGIN( Comment );
+ }
+
+ /* ----- handle arguments of the anchor command ------- */
+
+<AnchorLabel>{LABELID} { // found argument
+ SectionInfo *si = new SectionInfo(yyFileName,yytext,0,SectionInfo::Anchor);
+ Doxygen::sectionDict.insert(yytext,si);
+ current->anchors->append(si);
+ addOutput(yytext);
+ BEGIN( Comment );
+ }
+<AnchorLabel>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\anchor command has no label"
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<AnchorLabel>. { // invalid character for anchor label
+ warn(yyFileName,yyLineNr,
+ "warning: Invalid or missing anchor label"
+ );
+ BEGIN(Comment);
+ }
+
+
+ /* ----- handle arguments of the preformatted block commands ------- */
+
+<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endmsc")/{NW} { // possible ends
+ addOutput(yytext);
+ if (&yytext[4]==blockName) // found end of the block
+ {
+ BEGIN(Comment);
+ }
+ }
+<FormatBlock>[^ \@\*\/\\\n]* { // some word
+ addOutput(yytext);
+ }
+<FormatBlock>{DOCNL} { // new line
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ }
+<FormatBlock>"/*" { // start of a C-comment
+ g_commentCount++;
+ addOutput(yytext);
+ }
+<FormatBlock>"*/" { // end of a C-comment
+ addOutput(yytext);
+ g_commentCount--;
+ if (g_commentCount<0 && blockName!="verbatim")
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data());
+ }
+ }
+<FormatBlock>. {
+ addOutput(*yytext);
+ }
+<FormatBlock><<EOF>> {
+ warn(yyFileName,yyLineNr,
+ "warning: reached end of comment while inside a @%s block; check for missing @end%s tag!",
+ blockName.data(),blockName.data()
+ );
+ yyterminate();
+ }
+
+ /* ----- handle arguments of if/ifnot commands ------- */
+
+<GuardParam>{LABELID} { // parameter of if/ifnot guard
+ bool sectionEnabled = Config_getList("ENABLED_SECTIONS").find(yytext)!=-1;
+ bool parentEnabled = TRUE;
+ if (!guards.isEmpty()) parentEnabled = guards.top()->isEnabled();
+ if (parentEnabled)
+ {
+ if (
+ (sectionEnabled && guardType==Guard_If) ||
+ (!sectionEnabled && guardType==Guard_IfNot)
+ ) // section is visible
+ {
+ guards.push(new GuardedSection(TRUE,TRUE));
+ enabledSectionFound=TRUE;
+ BEGIN( GuardParamEnd );
+ }
+ else // section is invisible
+ {
+ if (guardType!=Guard_Skip)
+ {
+ guards.push(new GuardedSection(FALSE,TRUE));
+ }
+ BEGIN( SkipGuardedSection );
+ }
+ }
+ else // invisible because of parent
+ {
+ guards.push(new GuardedSection(FALSE,FALSE));
+ BEGIN( SkipGuardedSection );
+ }
+ }
+<GuardParam>{DOCNL} { // end of argument
+ if (*yytext=='\n') yyLineNr++;
+ //next line is commented out due to bug620924
+ //addOutput('\n');
+ BEGIN( Comment );
+ }
+<GuardParam>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<GuardParam>. { // ignore other stuff
+ addOutput(*yytext);
+ }
+<GuardParamEnd>{B}*{DOCNL} {
+ BEGIN(Comment);
+ }
+<GuardParamEnd>{B}* {
+ BEGIN(Comment);
+ }
+<GuardParamEnd>. {
+ unput(*yytext);
+ BEGIN(Comment);
+ }
+
+ /* ----- handle skipping of conditional sections ------- */
+
+<SkipGuardedSection>{CMD}"ifnot"/{NW} {
+ guardType = Guard_IfNot;
+ BEGIN( GuardParam );
+ }
+<SkipGuardedSection>{CMD}"if"/{NW} {
+ guardType = Guard_If;
+ BEGIN( GuardParam );
+ }
+<SkipGuardedSection>{CMD}"endif"/{NW} {
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found @endif without matching start command");
+ }
+ else
+ {
+ delete guards.pop();
+ BEGIN( GuardParamEnd );
+ }
+ }
+<SkipGuardedSection>{CMD}"else"/{NW} {
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found @else without matching start command");
+ }
+ else
+ {
+ if (!enabledSectionFound && guards.top()->parentVisible())
+ {
+ delete guards.pop();
+ guards.push(new GuardedSection(TRUE,TRUE));
+ enabledSectionFound=TRUE;
+ BEGIN( GuardParamEnd );
+ }
+ }
+ }
+<SkipGuardedSection>{CMD}"elseif"/{NW} {
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found @elseif without matching start command");
+ }
+ else
+ {
+ if (!enabledSectionFound && guards.top()->parentVisible())
+ {
+ delete guards.pop();
+ BEGIN( GuardParam );
+ }
+ }
+ }
+<SkipGuardedSection>{DOCNL} { // skip line
+ if (*yytext=='\n') yyLineNr++;
+ //addOutput('\n');
+ }
+<SkipGuardedSection>[^ \\@\n]+ { // skip non-special characters
+ }
+<SkipGuardedSection>. { // any other character
+ }
+
+
+ /* ----- handle skipping of internal section ------- */
+
+<SkipInternal>{DOCNL} { // skip line
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ }
+<SkipInternal>[@\\]"if"/[ \t] {
+ g_condCount++;
+ }
+<SkipInternal>[@\\]"ifnot"/[ \t] {
+ g_condCount++;
+ }
+<SkipInternal>[@\\]/"endif" {
+ g_condCount--;
+ if (g_condCount<0) // handle conditional section around of \internal, see bug607743
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+<SkipInternal>[@\\]/"section"[ \t] {
+ if (g_sectionLevel>0)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+<SkipInternal>[@\\]/"subsection"[ \t] {
+ if (g_sectionLevel>1)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+<SkipInternal>[@\\]/"subsubsection"[ \t] {
+ if (g_sectionLevel>2)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+<SkipInternal>[@\\]/"paragraph"[ \t] {
+ if (g_sectionLevel>3)
+ {
+ unput('\\');
+ BEGIN(Comment);
+ }
+ }
+<SkipInternal>[@\\]"endinternal"[ \t]* {
+ BEGIN(Comment);
+ }
+<SkipInternal>[^ \\@\n]+ { // skip non-special characters
+ }
+<SkipInternal>. { // any other character
+ }
+
+
+ /* ----- handle argument of name command ------- */
+
+<NameParam>{DOCNL} { // end of argument
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<NameParam>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ g_memberGroupHeader+=' ';
+ }
+<NameParam>. { // ignore other stuff
+ g_memberGroupHeader+=*yytext;
+ current->name+=*yytext;
+ }
+
+ /* ----- handle argument of ingroup command ------- */
+
+<InGroupParam>{LABELID} { // group id
+ current->groups->append(
+ new Grouping(yytext, Grouping::GROUPING_INGROUP)
+ );
+ inGroupParamFound=TRUE;
+ }
+<InGroupParam>{DOCNL} { // missing argument
+ if (!inGroupParamFound)
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: Missing group name for \\ingroup command"
+ );
+ }
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<InGroupParam>{LC} { // line continuation
+ yyLineNr++;
+ addOutput('\n');
+ }
+<InGroupParam>. { // ignore other stuff
+ addOutput(*yytext);
+ }
+
+ /* ----- handle argument of fn command ------- */
+
+<FnParam>{DOCNL} { // end of argument
+ if (braceCount==0)
+ {
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ langParser->parsePrototype(functionProto);
+ BEGIN( Comment );
+ }
+ }
+<FnParam>{LC} { // line continuation
+ yyLineNr++;
+ functionProto+=' ';
+ }
+<FnParam>[^@\\\n()]+ { // non-special characters
+ functionProto+=yytext;
+ }
+<FnParam>"(" {
+ functionProto+=yytext;
+ braceCount++;
+ }
+<FnParam>")" {
+ functionProto+=yytext;
+ braceCount--;
+ }
+<FnParam>. { // add other stuff
+ functionProto+=*yytext;
+ }
+
+
+ /* ----- handle argument of overload command ------- */
+
+
+<OverloadParam>{DOCNL} { // end of argument
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ if (functionProto.stripWhiteSpace().isEmpty())
+ { // plain overload command
+ addOutput(getOverloadDocs());
+ }
+ else // overload declaration
+ {
+ makeStructuralIndicator(Entry::OVERLOADDOC_SEC);
+ langParser->parsePrototype(functionProto);
+ }
+ BEGIN( Comment );
+ }
+<OverloadParam>{LC} { // line continuation
+ yyLineNr++;
+ functionProto+=' ';
+ }
+<OverloadParam>. { // add other stuff
+ functionProto+=*yytext;
+ }
+
+ /* ----- handle argument of inherit command ------- */
+
+<InheritParam>({ID}("::"|"."))*{ID} { // found argument
+ current->extends->append(
+ new BaseInfo(removeRedundantWhiteSpace(yytext),Public,Normal)
+ );
+ BEGIN( Comment );
+ }
+<InheritParam>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\inherit command has no argument"
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<InheritParam>. { // invalid character for anchor label
+ warn(yyFileName,yyLineNr,
+ "warning: Invalid or missing name for \\inherit command"
+ );
+ BEGIN(Comment);
+ }
+
+ /* ----- handle argument of extends and implements commands ------- */
+
+<ExtendsParam>({ID}("::"|"."))*{ID} { // found argument
+ current->extends->append(
+ new BaseInfo(removeRedundantWhiteSpace(yytext),Public,Normal)
+ );
+ BEGIN( Comment );
+ }
+<ExtendsParam>{DOCNL} { // missing argument
+ warn(yyFileName,yyLineNr,
+ "warning: \\extends or \\implements command has no argument"
+ );
+ if (*yytext=='\n') yyLineNr++;
+ addOutput('\n');
+ BEGIN( Comment );
+ }
+<ExtendsParam>. { // ignore other stuff
+ }
+
+ /* ----- handle language specific sections ------- */
+
+<SkipLang>[\\@]"~"[a-zA-Z]* { /* language switch */
+ QCString langId = &yytext[2];
+ if (langId.isEmpty() ||
+ stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0)
+ { // enable language specific section
+ BEGIN(Comment);
+ }
+ }
+<SkipLang>[^*@\\\n]* { /* any character not a *, @, backslash or new line */
+ }
+<SkipLang>{DOCNL} { /* new line in verbatim block */
+ if (*yytext=='\n') yyLineNr++;
+ }
+<SkipLang>. { /* any other character */
+ }
+
+
+%%
+
+//----------------------------------------------------------------------------
+
+static bool handleBrief(const QCString &)
+{
+ //printf("handleBrief\n");
+ setOutput(OutputBrief);
+ return FALSE;
+}
+
+static bool handleFn(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::MEMBERDOC_SEC);
+ functionProto.resize(0);
+ braceCount=0;
+ BEGIN(FnParam);
+ return stop;
+}
+
+static bool handleDef(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::DEFINEDOC_SEC);
+ functionProto.resize(0);
+ BEGIN(FnParam);
+ return stop;
+}
+
+static bool handleOverload(const QCString &)
+{
+ functionProto.resize(0);
+ BEGIN(OverloadParam);
+ return FALSE;
+}
+
+static bool handleEnum(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::ENUMDOC_SEC);
+ BEGIN(EnumDocArg1);
+ return stop;
+}
+
+static bool handleDefGroup(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC);
+ current->groupDocType = Entry::GROUPDOC_NORMAL;
+ BEGIN( GroupDocArg1 );
+ return stop;
+}
+
+static bool handleAddToGroup(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC);
+ current->groupDocType = Entry::GROUPDOC_ADD;
+ BEGIN( GroupDocArg1 );
+ return stop;
+}
+
+static bool handleWeakGroup(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC);
+ current->groupDocType = Entry::GROUPDOC_WEAK;
+ BEGIN( GroupDocArg1 );
+ return stop;
+}
+
+static bool handleNamespace(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::NAMESPACEDOC_SEC);
+ BEGIN( NameSpaceDocArg1 );
+ return stop;
+}
+
+static bool handlePackage(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::PACKAGEDOC_SEC);
+ BEGIN( PackageDocArg1 );
+ return stop;
+}
+
+static bool handleClass(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::CLASSDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleHeaderFile(const QCString &)
+{
+ BEGIN( ClassDocArg2 );
+ return FALSE;
+}
+
+static bool handleProtocol(const QCString &)
+{ // Obj-C protocol
+ bool stop=makeStructuralIndicator(Entry::PROTOCOLDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleCategory(const QCString &)
+{ // Obj-C category
+ bool stop=makeStructuralIndicator(Entry::CATEGORYDOC_SEC);
+ BEGIN( CategoryDocArg1 );
+ return stop;
+}
+
+static bool handleUnion(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::UNIONDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleStruct(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::STRUCTDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleInterface(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::INTERFACEDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handleIdlException(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::EXCEPTIONDOC_SEC);
+ BEGIN( ClassDocArg1 );
+ return stop;
+}
+
+static bool handlePage(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::PAGEDOC_SEC);
+ BEGIN( PageDocArg1 );
+ return stop;
+}
+
+static bool handleMainpage(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::MAINPAGEDOC_SEC);
+ if (!stop)
+ {
+ current->name = "mainpage";
+ }
+ BEGIN( PageDocArg2 );
+ return stop;
+}
+
+static bool handleFile(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::FILEDOC_SEC);
+ if (!stop)
+ {
+ current->name = yyFileName;
+ }
+ BEGIN( FileDocArg1 );
+ return stop;
+}
+
+static bool handleDir(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::DIRDOC_SEC);
+ if (!stop) current->name = yyFileName;
+ BEGIN( FileDocArg1 );
+ return stop;
+}
+
+static bool handleExample(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::EXAMPLE_SEC);
+ if (!stop) current->name = yyFileName;
+ BEGIN( FileDocArg1 );
+ return stop;
+}
+
+static bool handleDetails(const QCString &)
+{
+ if (inContext!=OutputBrief)
+ {
+ addOutput("\n\n"); // treat @details outside brief description
+ // as a new paragraph
+ }
+ setOutput(OutputDoc);
+ return FALSE;
+}
+
+static bool handleName(const QCString &)
+{
+ bool stop=makeStructuralIndicator(Entry::MEMBERGRP_SEC);
+ if (!stop)
+ {
+ g_memberGroupHeader.resize(0);
+ BEGIN( NameParam );
+ if (g_memberGroupId!=DOX_NOGROUP) // end of previous member group
+ {
+ closeGroup(current,yyFileName,yyLineNr,TRUE);
+ }
+ }
+ return stop;
+}
+
+static bool handleTodo(const QCString &)
+{
+ newXRefKind = XRef_Todo;
+ setOutput(OutputXRef);
+ xrefKind = XRef_Todo;
+ return FALSE;
+}
+
+static bool handleTest(const QCString &)
+{
+ newXRefKind = XRef_Test;
+ setOutput(OutputXRef);
+ xrefKind = XRef_Test;
+ return FALSE;
+}
+
+static bool handleBug(const QCString &)
+{
+ newXRefKind = XRef_Bug;
+ setOutput(OutputXRef);
+ xrefKind = XRef_Bug;
+ return FALSE;
+}
+
+static bool handleDeprecated(const QCString &)
+{
+ newXRefKind = XRef_Deprecated;
+ setOutput(OutputXRef);
+ xrefKind = XRef_Deprecated;
+ return FALSE;
+}
+
+static bool handleXRefItem(const QCString &)
+{
+ BEGIN(XRefItemParam1);
+ return FALSE;
+}
+
+static bool handleRelated(const QCString &)
+{
+ BEGIN(RelatesParam1);
+ return FALSE;
+}
+
+static bool handleRelatedAlso(const QCString &)
+{
+ current->relatesType = Duplicate;
+ BEGIN(RelatesParam1);
+ return FALSE;
+}
+
+static bool handleMemberOf(const QCString &)
+{
+ current->relatesType = MemberOf;
+ BEGIN(RelatesParam1);
+ return FALSE;
+}
+
+static bool handleRefItem(const QCString &)
+{
+ addOutput(" @refitem ");
+ BEGIN(LineParam);
+ return FALSE;
+}
+
+static bool handleSection(const QCString &s)
+{
+ setOutput(OutputDoc);
+ addOutput(" @"+s+" ");
+ BEGIN(SectionLabel);
+ if (s=="section") g_sectionLevel=1;
+ else if (s=="subsection") g_sectionLevel=2;
+ else if (s=="subsubsection") g_sectionLevel=3;
+ else if (s=="paragraph") g_sectionLevel=4;
+ return FALSE;
+}
+
+static bool handleSubpage(const QCString &s)
+{
+ if (current->section!=Entry::EMPTY_SEC &&
+ current->section!=Entry::PAGEDOC_SEC &&
+ current->section!=Entry::MAINPAGEDOC_SEC
+ )
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found \\subpage command in a comment block that is not marked as a page!");
+ }
+ addOutput(" @"+s+" ");
+ BEGIN(SubpageLabel);
+ return FALSE;
+}
+
+static bool handleAnchor(const QCString &s)
+{
+ addOutput(" @"+s+" ");
+ BEGIN(AnchorLabel);
+ return FALSE;
+}
+
+static bool handleFormatBlock(const QCString &s)
+{
+ addOutput(" @"+s+" ");
+ //printf("handleFormatBlock(%s)\n",s.data());
+ blockName=s;
+ g_commentCount=0;
+ BEGIN(FormatBlock);
+ return FALSE;
+}
+
+static bool handleAddIndex(const QCString &)
+{
+ addOutput(" @addindex ");
+ BEGIN(LineParam);
+ return FALSE;
+}
+
+static bool handleIf(const QCString &)
+{
+ enabledSectionFound=FALSE;
+ guardType = Guard_If;
+ BEGIN(GuardParam);
+ return FALSE;
+}
+
+static bool handleIfNot(const QCString &)
+{
+ enabledSectionFound=FALSE;
+ guardType = Guard_IfNot;
+ BEGIN(GuardParam);
+ return FALSE;
+}
+
+static bool handleElseIf(const QCString &)
+{
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found \\else without matching start command");
+ }
+ else
+ {
+ guardType = enabledSectionFound ? Guard_Skip : Guard_If;
+ BEGIN(GuardParam);
+ }
+ return FALSE;
+}
+
+static bool handleElse(const QCString &)
+{
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found \\else without matching start command");
+ }
+ else
+ {
+ BEGIN( SkipGuardedSection );
+ }
+ return FALSE;
+}
+
+static bool handleEndIf(const QCString &)
+{
+ if (guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,
+ "warning: found \\endif without matching start command");
+ }
+ else
+ {
+ delete guards.pop();
+ }
+ enabledSectionFound=FALSE;
+ BEGIN( GuardParamEnd );
+ return FALSE;
+}
+
+static bool handleIngroup(const QCString &)
+{
+ inGroupParamFound=FALSE;
+ BEGIN( InGroupParam );
+ return FALSE;
+}
+
+static bool handleNoSubGrouping(const QCString &)
+{
+ current->subGrouping = FALSE;
+ return FALSE;
+}
+
+static bool handleShowInitializer(const QCString &)
+{
+ current->initLines = 100000; // ON
+ return FALSE;
+}
+
+static bool handleHideInitializer(const QCString &)
+{
+ current->initLines = 0; // OFF
+ return FALSE;
+}
+
+static bool handleCallgraph(const QCString &)
+{
+ current->callGraph = TRUE; // ON
+ return FALSE;
+}
+
+static bool handleCallergraph(const QCString &)
+{
+ current->callerGraph = TRUE; // ON
+ return FALSE;
+}
+
+static bool handleInternal(const QCString &)
+{
+ if (!Config_getBool("INTERNAL_DOCS"))
+ {
+ // make sure some whitespace before a \internal command
+ // is not treated as "documentation"
+ if (current->doc.stripWhiteSpace().isEmpty())
+ {
+ current->doc.resize(0);
+ }
+ g_condCount=0;
+ BEGIN( SkipInternal );
+ }
+ else
+ {
+ // re-enabled for bug640828
+ addOutput("\\internal ");
+ }
+ return FALSE;
+}
+
+static bool handleLineBr(const QCString &)
+{
+ addOutput('\n');
+ return FALSE;
+}
+
+static bool handleStatic(const QCString &)
+{
+ endBrief();
+ current->stat = TRUE;
+ return FALSE;
+}
+
+static bool handlePure(const QCString &)
+{
+ endBrief();
+ current->virt = Pure;
+ return FALSE;
+}
+
+static bool handlePrivate(const QCString &)
+{
+ current->protection = Private;
+ return FALSE;
+}
+
+static bool handlePrivateSection(const QCString &)
+{
+ current->protection = protection = Private;
+ return FALSE;
+}
+
+static bool handleProtected(const QCString &)
+{
+ current->protection = Protected;
+ return FALSE;
+}
+
+static bool handleProtectedSection(const QCString &)
+{
+ current->protection = protection = Protected ;
+ return FALSE;
+}
+
+static bool handlePublic(const QCString &)
+{
+ current->protection = Public;
+ return FALSE;
+}
+
+static bool handlePublicSection(const QCString &)
+{
+ current->protection = protection = Public;
+ return FALSE;
+}
+
+static bool handleInherit(const QCString &)
+{
+ BEGIN(InheritParam);
+ return FALSE;
+}
+
+static bool handleExtends(const QCString &)
+{
+ BEGIN(ExtendsParam);
+ return FALSE;
+}
+
+//----------------------------------------------------------------------------
+
+static void checkFormula()
+{
+ if (YY_START==ReadFormulaShort || YY_START==ReadFormulaLong)
+ {
+ warn(yyFileName,yyLineNr,"warning: End of comment block while inside formula.");
+ }
+}
+
+//----------------------------------------------------------------------------
+
+bool parseCommentBlock(/* in */ ParserInterface *parser,
+ /* in */ Entry *curEntry,
+ /* in */ const QCString &comment,
+ /* in */ const QCString &fileName,
+ /* in,out */ int &lineNr,
+ /* in */ bool isBrief,
+ /* in */ bool isAutoBriefOn,
+ /* in */ bool isInbody,
+ /* in,out */ Protection &prot,
+ /* in,out */ int &position,
+ /* out */ bool &newEntryNeeded
+ )
+{
+ //printf("parseCommentBlock() isBrief=%d isAutoBriefOn=%d lineNr=%d\n",
+ // isBrief,isAutoBriefOn,lineNr);
+
+ initParser();
+ guards.setAutoDelete(TRUE);
+ guards.clear();
+ langParser = parser;
+ current = curEntry;
+ if (comment.isEmpty()) return FALSE; // avoid empty strings
+ inputString = comment;
+ inputString.append(" ");
+ inputPosition = position;
+ yyLineNr = lineNr;
+ yyFileName = fileName;
+ protection = prot;
+ needNewEntry = FALSE;
+ xrefKind = XRef_None;
+ xrefAppendFlag = FALSE;
+ insidePre = FALSE;
+ parseMore = FALSE;
+ inBody = isInbody;
+ outputXRef.resize(0);
+ setOutput( isBrief || isAutoBriefOn ? OutputBrief : OutputDoc );
+ briefEndsAtDot = isAutoBriefOn;
+ g_condCount = 0;
+ g_sectionLevel = 0;
+
+ if (!current->inbodyDocs.isEmpty() && isInbody) // separate in body fragments
+ {
+ current->inbodyDocs+="\n\n";
+ }
+
+ Debug::print(Debug::CommentScan,0,"-----------\nCommentScanner: %s:%d\n"
+ "input=[%s]\n",fileName.data(),lineNr,comment.data()
+ );
+
+ commentScanYYrestart( commentScanYYin );
+ BEGIN( Comment );
+ commentScanYYlex();
+ setOutput( OutputDoc );
+
+ if (YY_START==OverloadParam) // comment ended with \overload
+ {
+ addOutput(getOverloadDocs());
+ }
+
+ if (!guards.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
+ }
+
+ current->doc=stripLeadingAndTrailingEmptyLines(current->doc);
+
+ if (current->section==Entry::FILEDOC_SEC && current->doc.isEmpty())
+ {
+ // to allow a comment block with just a @file command.
+ current->doc="\n\n";
+ }
+
+ if (current->section==Entry::MEMBERGRP_SEC &&
+ g_memberGroupId==DOX_NOGROUP) // @name section but no group started yet
+ {
+ openGroup(current,yyFileName,yyLineNr);
+ }
+
+ Debug::print(Debug::CommentScan,0,
+ "brief=[%s]\ndocs=[%s]\ninbody=[%s]\n===========\n",
+ current->brief.data(),current->doc.data(),current->inbodyDocs.data()
+ );
+
+ checkFormula();
+ prot = protection;
+
+ groupAddDocs(curEntry,fileName);
+
+ newEntryNeeded = needNewEntry;
+
+ // if we did not proceed during this call, it does not make
+ // sense to continue, since we get stuck. See bug 567346 for situations
+ // were this happens
+ if (parseMore && position==inputPosition) parseMore=FALSE;
+
+ if (parseMore) position=inputPosition; else position=0;
+
+ lineNr = yyLineNr;
+ //printf("position=%d parseMore=%d\n",position,parseMore);
+
+ return parseMore;
+}
+
+//---------------------------------------------------------------------------
+
+void groupEnterFile(const char *fileName,int)
+{
+ g_autoGroupStack.setAutoDelete(TRUE);
+ g_autoGroupStack.clear();
+ g_memberGroupId = DOX_NOGROUP;
+ g_memberGroupDocs.resize(0);
+ g_memberGroupRelates.resize(0);
+ g_compoundName=fileName;
+}
+
+void groupLeaveFile(const char *fileName,int line)
+{
+ //if (g_memberGroupId!=DOX_NOGROUP)
+ //{
+ // warn(fileName,line,"warning: end of file while inside a member group\n");
+ //}
+ g_memberGroupId=DOX_NOGROUP;
+ g_memberGroupRelates.resize(0);
+ g_memberGroupDocs.resize(0);
+ if (!g_autoGroupStack.isEmpty())
+ {
+ warn(fileName,line,"warning: end of file while inside a group\n");
+ }
+}
+
+void groupEnterCompound(const char *fileName,int line,const char *name)
+{
+ if (g_memberGroupId!=DOX_NOGROUP)
+ {
+ warn(fileName,line,"warning: try to put compound %s inside a member group\n",name);
+ }
+ g_memberGroupId=DOX_NOGROUP;
+ g_memberGroupRelates.resize(0);
+ g_memberGroupDocs.resize(0);
+ g_compoundName = name;
+ int i = g_compoundName.find('(');
+ if (i!=-1)
+ {
+ g_compoundName=g_compoundName.left(i); // strip category (Obj-C)
+ }
+ if (g_compoundName.isEmpty())
+ {
+ g_compoundName=fileName;
+ }
+ //printf("groupEnterCompound(%s)\n",name);
+}
+
+void groupLeaveCompound(const char *,int,const char * /*name*/)
+{
+ //printf("groupLeaveCompound(%s)\n",name);
+ //if (g_memberGroupId!=DOX_NOGROUP)
+ //{
+ // warn(fileName,line,"warning: end of compound %s while inside a member group\n",name);
+ //}
+ g_memberGroupId=DOX_NOGROUP;
+ g_memberGroupRelates.resize(0);
+ g_memberGroupDocs.resize(0);
+ g_compoundName.resize(0);
+}
+
+static int findExistingGroup(int &groupId,const MemberGroupInfo *info)
+{
+ //printf("findExistingGroup %s:%s\n",info->header.data(),info->compoundName.data());
+ QIntDictIterator<MemberGroupInfo> di(Doxygen::memGrpInfoDict);
+ MemberGroupInfo *mi;
+ for (di.toFirst();(mi=di.current());++di)
+ {
+ if (g_compoundName==mi->compoundName && // same file or scope
+ !mi->header.isEmpty() && // not a nameless group
+ stricmp(mi->header,info->header)==0 // same header name
+ )
+ {
+ //printf("Found it!\n");
+ return di.currentKey(); // put the item in this group
+ }
+ }
+ groupId++; // start new group
+ return groupId;
+}
+
+void openGroup(Entry *e,const char *,int)
+{
+ //printf("==> openGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
+ // e->name.data(),e->section,g_autoGroupStack.count());
+ if (e->section==Entry::GROUPDOC_SEC) // auto group
+ {
+ g_autoGroupStack.push(new Grouping(e->name,e->groupingPri()));
+ }
+ else // start of a member group
+ {
+ //printf(" membergroup id=%d %s\n",g_memberGroupId,g_memberGroupHeader.data());
+ if (g_memberGroupId==DOX_NOGROUP) // no group started yet
+ {
+ static int curGroupId=0;
+
+ MemberGroupInfo *info = new MemberGroupInfo;
+ info->header = g_memberGroupHeader.stripWhiteSpace();
+ info->compoundName = g_compoundName;
+ g_memberGroupId = findExistingGroup(curGroupId,info);
+ //printf(" use membergroup %d\n",g_memberGroupId);
+ Doxygen::memGrpInfoDict.insert(g_memberGroupId,info);
+
+ g_memberGroupRelates = e->relates;
+ e->mGrpId = g_memberGroupId;
+ }
+ }
+}
+
+void closeGroup(Entry *e,const char *fileName,int,bool foundInline)
+{
+ //printf("==> closeGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
+ // e->name.data(),e->section,g_autoGroupStack.count());
+ if (g_memberGroupId!=DOX_NOGROUP) // end of member group
+ {
+ MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
+ if (info) // known group
+ {
+ info->doc = g_memberGroupDocs;
+ info->docFile = fileName;
+ }
+ g_memberGroupId=DOX_NOGROUP;
+ g_memberGroupRelates.resize(0);
+ g_memberGroupDocs.resize(0);
+ e->mGrpId=DOX_NOGROUP;
+ //printf("new group id=%d\n",g_memberGroupId);
+ }
+ else if (!g_autoGroupStack.isEmpty()) // end of auto group
+ {
+ Grouping *grp = g_autoGroupStack.pop();
+ // see bug577005: we should not remove the last group for e
+ if (!foundInline) e->groups->removeLast();
+ //printf("Removing %s e=%p\n",grp->groupname.data(),e);
+ delete grp;
+ if (!foundInline) initGroupInfo(e);
+ }
+}
+
+void initGroupInfo(Entry *e)
+{
+ //printf("==> initGroup(id=%d,related=%s,e=%p)\n",g_memberGroupId,
+ // g_memberGroupRelates.data(),e);
+ e->mGrpId = g_memberGroupId;
+ e->relates = g_memberGroupRelates;
+ if (!g_autoGroupStack.isEmpty())
+ {
+ //printf("Appending group %s to %s: count=%d entry=%p\n",
+ // g_autoGroupStack.top()->groupname.data(),
+ // e->name.data(),e->groups->count(),e);
+ e->groups->append(new Grouping(*g_autoGroupStack.top()));
+ }
+}
+
+static void groupAddDocs(Entry *e,const char *fileName)
+{
+ if (e->section==Entry::MEMBERGRP_SEC)
+ {
+ g_memberGroupDocs=e->brief.stripWhiteSpace();
+ e->doc = stripLeadingAndTrailingEmptyLines(e->doc);
+ if (!g_memberGroupDocs.isEmpty() && !e->doc.isEmpty())
+ {
+ g_memberGroupDocs+="\n\n";
+ }
+ g_memberGroupDocs+=e->doc;
+ MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
+ if (info)
+ {
+ info->doc = g_memberGroupDocs;
+ info->docFile = fileName;
+ info->setRefItems(e->sli);
+ }
+ e->doc.resize(0);
+ e->brief.resize(0);
+ }
+}
+
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void commentScanYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
diff --git a/src/compound.xsd b/src/compound.xsd
new file mode 100644
index 0000000..65fc0bf
--- /dev/null
+++ b/src/compound.xsd
@@ -0,0 +1,821 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:element name="doxygen" type="DoxygenType"/>
+
+ <!-- Complex types -->
+
+ <xsd:complexType name="DoxygenType">
+ <xsd:sequence maxOccurs="unbounded">
+ <xsd:element name="compounddef" type="compounddefType" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="version" type="DoxVersionNumber" use="required" />
+ </xsd:complexType>
+
+ <xsd:complexType name="compounddefType">
+ <xsd:sequence>
+ <xsd:element name="compoundname" type="xsd:string"/>
+ <xsd:element name="title" type="xsd:string" minOccurs="0" />
+ <xsd:element name="basecompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="derivedcompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="includes" type="incType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="includedby" type="incType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="incdepgraph" type="graphType" minOccurs="0" />
+ <xsd:element name="invincdepgraph" type="graphType" minOccurs="0" />
+ <xsd:element name="innerdir" type="refType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="innerfile" type="refType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="innerclass" type="refType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="innernamespace" type="refType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="innerpage" type="refType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="innergroup" type="refType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
+ <xsd:element name="sectiondef" type="sectiondefType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+ <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
+ <xsd:element name="inheritancegraph" type="graphType" minOccurs="0" />
+ <xsd:element name="collaborationgraph" type="graphType" minOccurs="0" />
+ <xsd:element name="programlisting" type="listingType" minOccurs="0" />
+ <xsd:element name="location" type="locationType" minOccurs="0" />
+ <xsd:element name="listofallmembers" type="listofallmembersType" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="id" type="xsd:string" />
+ <xsd:attribute name="kind" type="DoxCompoundKind" />
+ <xsd:attribute name="prot" type="DoxProtectionKind" />
+ </xsd:complexType>
+
+ <xsd:complexType name="listofallmembersType">
+ <xsd:sequence>
+ <xsd:element name="member" type="memberRefType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="memberRefType">
+ <xsd:sequence>
+ <xsd:element name="scope" />
+ <xsd:element name="name" />
+ </xsd:sequence>
+ <xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="prot" type="DoxProtectionKind" />
+ <xsd:attribute name="virt" type="DoxVirtualKind" />
+ <xsd:attribute name="ambiguityscope" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="compoundRefType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="refid" type="xsd:string" use="optional" />
+ <xsd:attribute name="prot" type="DoxProtectionKind" />
+ <xsd:attribute name="virt" type="DoxVirtualKind" />
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="reimplementType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="refid" type="xsd:string" />
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="incType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="local" type="DoxBool" />
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="refType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="prot" type="DoxProtectionKind" use="optional"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="refTextType">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="kindref" type="DoxRefKind" />
+ <xsd:attribute name="external" type="xsd:string" use="optional"/>
+ <xsd:attribute name="tooltip" type="xsd:string" use="optional"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="sectiondefType">
+ <xsd:sequence>
+ <xsd:element name="header" type="xsd:string" minOccurs="0" />
+ <xsd:element name="description" type="descriptionType" minOccurs="0" />
+ <xsd:element name="memberdef" type="memberdefType" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="kind" type="DoxSectionKind" />
+ </xsd:complexType>
+
+ <xsd:complexType name="memberdefType">
+ <xsd:sequence>
+ <xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
+ <xsd:element name="type" type="linkedTextType" minOccurs="0" />
+ <xsd:element name="definition" minOccurs="0" />
+ <xsd:element name="argsstring" minOccurs="0" />
+ <xsd:element name="name" />
+ <xsd:element name="read" minOccurs="0" />
+ <xsd:element name="write" minOccurs="0" />
+ <xsd:element name="bitfield" minOccurs="0" />
+ <xsd:element name="reimplements" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="reimplementedby" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="enumvalue" type="enumvalueType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
+ <xsd:element name="exceptions" type="linkedTextType" minOccurs="0" />
+ <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+ <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
+ <xsd:element name="inbodydescription" type="descriptionType" minOccurs="0" />
+ <xsd:element name="location" type="locationType" />
+ <xsd:element name="references" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="referencedby" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="kind" type="DoxMemberKind" />
+ <xsd:attribute name="id" type="xsd:string" />
+ <xsd:attribute name="prot" type="DoxProtectionKind" />
+ <xsd:attribute name="static" type="DoxBool" />
+ <xsd:attribute name="const" type="DoxBool" />
+ <xsd:attribute name="explicit" type="DoxBool" />
+ <xsd:attribute name="inline" type="DoxBool" />
+ <xsd:attribute name="virt" type="DoxVirtualKind" />
+ <xsd:attribute name="volatile" type="DoxBool" />
+ <xsd:attribute name="mutable" type="DoxBool" />
+ <!-- Qt property -->
+ <xsd:attribute name="readable" type="DoxBool" use="optional"/>
+ <xsd:attribute name="writable" type="DoxBool" use="optional"/>
+ <!-- C++/CLI variable -->
+ <xsd:attribute name="initonly" type="DoxBool" use="optional"/>
+ <!-- C++/CLI and C# property -->
+ <xsd:attribute name="settable" type="DoxBool" use="optional"/>
+ <xsd:attribute name="gettable" type="DoxBool" use="optional"/>
+ <!-- C++/CLI function -->
+ <xsd:attribute name="final" type="DoxBool" use="optional"/>
+ <xsd:attribute name="sealed" type="DoxBool" use="optional"/>
+ <xsd:attribute name="new" type="DoxBool" use="optional"/>
+ <!-- C++/CLI event -->
+ <xsd:attribute name="add" type="DoxBool" use="optional"/>
+ <xsd:attribute name="remove" type="DoxBool" use="optional"/>
+ <xsd:attribute name="raise" type="DoxBool" use="optional"/>
+ <!-- Objective-C 2.0 protocol method -->
+ <xsd:attribute name="optional" type="DoxBool" use="optional"/>
+ <xsd:attribute name="required" type="DoxBool" use="optional"/>
+ <!-- Objective-C 2.0 property accessor -->
+ <xsd:attribute name="accessor" type="DoxAccessor" use="optional"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="descriptionType" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="title" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="internal" type="docInternalType" minOccurs="0" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="enumvalueType" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="name" />
+ <xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
+ <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+ <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="id" type="xsd:string" />
+ <xsd:attribute name="prot" type="DoxProtectionKind" />
+ </xsd:complexType>
+
+ <xsd:complexType name="templateparamlistType">
+ <xsd:sequence>
+ <xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="paramType">
+ <xsd:sequence>
+ <xsd:element name="type" type="linkedTextType" minOccurs="0" />
+ <xsd:element name="declname" minOccurs="0" />
+ <xsd:element name="defname" minOccurs="0" />
+ <xsd:element name="array" minOccurs="0" />
+ <xsd:element name="defval" type="linkedTextType" minOccurs="0" />
+ <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="linkedTextType" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="graphType">
+ <xsd:sequence>
+ <xsd:element name="node" type="nodeType" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="nodeType">
+ <xsd:sequence>
+ <xsd:element name="label" />
+ <xsd:element name="link" type="linkType" minOccurs="0" />
+ <xsd:element name="childnode" type="childnodeType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="id" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="childnodeType">
+ <xsd:sequence>
+ <xsd:element name="edgelabel" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="relation" type="DoxGraphRelation" />
+ </xsd:complexType>
+
+ <xsd:complexType name="linkType">
+ <xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="external" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="listingType">
+ <xsd:sequence>
+ <xsd:element name="codeline" type="codelineType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="codelineType">
+ <xsd:sequence>
+ <xsd:element name="highlight" type="highlightType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="lineno" type="xsd:integer" />
+ <xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="refkind" type="DoxRefKind" />
+ <xsd:attribute name="external" type="DoxBool" />
+ </xsd:complexType>
+
+ <xsd:complexType name="highlightType" mixed="true">
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element name="sp" />
+ <xsd:element name="ref" type="refTextType" />
+ </xsd:choice>
+ <xsd:attribute name="class" type="DoxHighlightClass" />
+ </xsd:complexType>
+
+ <xsd:complexType name="referenceType" mixed="true">
+ <xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="compoundref" type="xsd:string" use="optional" />
+ <xsd:attribute name="startline" type="xsd:integer" />
+ <xsd:attribute name="endline" type="xsd:integer" />
+ </xsd:complexType>
+
+ <xsd:complexType name="locationType">
+ <xsd:attribute name="file" type="xsd:string" />
+ <xsd:attribute name="line" type="xsd:integer" />
+ <xsd:attribute name="bodyfile" type="xsd:string" />
+ <xsd:attribute name="bodystart" type="xsd:integer" />
+ <xsd:attribute name="bodyend" type="xsd:integer" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docSect1Type" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="title" type="xsd:string" />
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="internal" type="docInternalS1Type" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="id" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docSect2Type" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="title" type="xsd:string" />
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="internal" type="docInternalS2Type" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="id" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docSect3Type" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="title" type="xsd:string" />
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="sect4" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="internal" type="docInternalS3Type" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="id" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docSect4Type" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="title" type="xsd:string" />
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="internal" type="docInternalS4Type" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="id" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docInternalType" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docInternalS1Type" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docInternalS2Type" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docInternalS3Type" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="sect3" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docInternalS4Type" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:group name="docTitleCmdGroup">
+ <xsd:choice>
+ <xsd:element name="ulink" type="docURLLink" />
+ <xsd:element name="bold" type="docMarkupType" />
+ <xsd:element name="emphasis" type="docMarkupType" />
+ <xsd:element name="computeroutput" type="docMarkupType" />
+ <xsd:element name="subscript" type="docMarkupType" />
+ <xsd:element name="superscript" type="docMarkupType" />
+ <xsd:element name="center" type="docMarkupType" />
+ <xsd:element name="small" type="docMarkupType" />
+ <xsd:element name="htmlonly" type="xsd:string" />
+ <xsd:element name="latexonly" type="xsd:string" />
+ <xsd:element name="dot" type="xsd:string" />
+ <xsd:element name="anchor" type="docAnchorType" />
+ <xsd:element name="formula" type="docFormulaType" />
+ <xsd:element name="ref" type="docRefTextType" />
+ <xsd:element name="copy" type="docEmptyType" />
+ <xsd:element name="trademark" type="docEmptyType" />
+ <xsd:element name="registered" type="docEmptyType" />
+ <xsd:element name="lsquo" type="docEmptyType" />
+ <xsd:element name="rsquo" type="docEmptyType" />
+ <xsd:element name="ldquo" type="docEmptyType" />
+ <xsd:element name="rdquo" type="docEmptyType" />
+ <xsd:element name="ndash" type="docEmptyType" />
+ <xsd:element name="mdash" type="docEmptyType" />
+ <xsd:element name="umlaut" type="docCharType" />
+ <xsd:element name="acute" type="docCharType" />
+ <xsd:element name="grave" type="docCharType" />
+ <xsd:element name="circ" type="docCharType" />
+ <xsd:element name="slash" type="docCharType" />
+ <xsd:element name="tilde" type="docCharType" />
+ <xsd:element name="cedil" type="docCharType" />
+ <xsd:element name="ring" type="docCharType" />
+ <xsd:element name="szlig" type="docEmptyType" />
+ <xsd:element name="nonbreakablespace" type="docEmptyType" />
+ </xsd:choice>
+ </xsd:group>
+
+ <xsd:complexType name="docTitleType" mixed="true">
+ <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:complexType>
+
+ <xsd:group name="docCmdGroup">
+ <xsd:choice>
+ <xsd:group ref="docTitleCmdGroup"/>
+ <xsd:element name="linebreak" type="docEmptyType" />
+ <xsd:element name="hruler" type="docEmptyType" />
+ <xsd:element name="preformatted" type="docMarkupType" />
+ <xsd:element name="programlisting" type="listingType" />
+ <xsd:element name="verbatim" type="xsd:string" />
+ <xsd:element name="indexentry" type="docIndexEntryType" />
+ <xsd:element name="orderedlist" type="docListType" />
+ <xsd:element name="itemizedlist" type="docListType" />
+ <xsd:element name="simplesect" type="docSimpleSectType" />
+ <xsd:element name="title" type="docTitleType" />
+ <xsd:element name="variablelist" type="docVariableListType" />
+ <xsd:element name="table" type="docTableType" />
+ <xsd:element name="heading" type="docHeadingType" />
+ <xsd:element name="image" type="docImageType" />
+ <xsd:element name="dotfile" type="docDotFileType" />
+ <xsd:element name="toclist" type="docTocListType" />
+ <xsd:element name="language" type="docLanguageType" />
+ <xsd:element name="parameterlist" type="docParamListType" />
+ <xsd:element name="xrefsect" type="docXRefSectType" />
+ <xsd:element name="copydoc" type="docCopyType" />
+ </xsd:choice>
+ </xsd:group>
+
+ <xsd:complexType name="docParaType" mixed="true">
+ <xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docMarkupType" mixed="true">
+ <xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docURLLink" mixed="true">
+ <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:attribute name="url" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docAnchorType" mixed="true">
+ <xsd:attribute name="id" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docFormulaType" mixed="true">
+ <xsd:attribute name="id" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docIndexEntryType">
+ <xsd:sequence>
+ <xsd:element name="primaryie" type="xsd:string" />
+ <xsd:element name="secondaryie" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docListType">
+ <xsd:sequence>
+ <xsd:element name="listitem" type="docListItemType" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docListItemType">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docSimpleSectType">
+ <xsd:sequence>
+ <xsd:element name="title" type="docTitleType" minOccurs="0" />
+ <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+ <xsd:element name="para" type="docParaType" minOccurs="1" maxOccurs="unbounded" />
+ <xsd:element name="simplesectsep" type="docEmptyType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:sequence>
+ <xsd:attribute name="kind" type="DoxSimpleSectKind" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docVarListEntryType">
+ <xsd:sequence>
+ <xsd:element name="term" type="docTitleType" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:group name="docVariableListGroup">
+ <xsd:sequence>
+ <xsd:element name="varlistentry" type="docVarListEntryType" />
+ <xsd:element name="listitem" type="docListItemType" />
+ </xsd:sequence>
+ </xsd:group>
+
+ <xsd:complexType name="docVariableListType">
+ <xsd:sequence>
+ <xsd:group ref="docVariableListGroup" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docRefTextType" mixed="true">
+ <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:attribute name="refid" type="xsd:string" />
+ <xsd:attribute name="kindref" type="DoxRefKind" />
+ <xsd:attribute name="external" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docTableType">
+ <xsd:sequence>
+ <xsd:element name="row" type="docRowType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="caption" type="docCaptionType" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="rows" type="xsd:integer" />
+ <xsd:attribute name="cols" type="xsd:integer" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docRowType">
+ <xsd:sequence>
+ <xsd:element name="entry" type="docEntryType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docEntryType">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="thead" type="DoxBool" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docCaptionType" mixed="true">
+ <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docHeadingType" mixed="true">
+ <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:attribute name="level" type="xsd:integer" /> <!-- todo: range 1-6 -->
+ </xsd:complexType>
+
+ <xsd:complexType name="docImageType" mixed="true">
+ <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:attribute name="type" type="DoxImageKind" />
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="width" type="xsd:string" />
+ <xsd:attribute name="height" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docDotFileType" mixed="true">
+ <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docTocItemType" mixed="true">
+ <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:attribute name="id" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docTocListType">
+ <xsd:sequence>
+ <xsd:element name="tocitem" type="docTocItemType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docLanguageType">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="langid" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docParamListType">
+ <xsd:sequence>
+ <xsd:element name="parameteritem" type="docParamListItem" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="kind" type="DoxParamListKind" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docParamListItem">
+ <xsd:sequence>
+ <xsd:element name="parameternamelist" type="docParamNameList" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="parameterdescription" type="descriptionType" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docParamNameList">
+ <xsd:sequence>
+ <xsd:element name="parametertype" type="docParamType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="parametername" type="docParamName" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docParamType" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" />
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="docParamName" mixed="true">
+ <xsd:sequence>
+ <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" />
+ </xsd:sequence>
+ <xsd:attribute name="direction" type="DoxParamDir" use="optional" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docXRefSectType">
+ <xsd:sequence>
+ <xsd:element name="xreftitle" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="xrefdescription" type="descriptionType" />
+ </xsd:sequence>
+ <xsd:attribute name="id" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docCopyType">
+ <xsd:sequence>
+ <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element name="internal" type="docInternalType" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="link" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="docCharType">
+ <xsd:attribute name="char" type="DoxCharRange"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="docEmptyType"/>
+
+ <!-- Simple types -->
+
+ <xsd:simpleType name="DoxBool">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="yes" />
+ <xsd:enumeration value="no" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxGraphRelation">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="include" />
+ <xsd:enumeration value="usage" />
+ <xsd:enumeration value="template-instance" />
+ <xsd:enumeration value="public-inheritance" />
+ <xsd:enumeration value="protected-inheritance" />
+ <xsd:enumeration value="private-inheritance" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxRefKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="compound" />
+ <xsd:enumeration value="member" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxMemberKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="define" />
+ <xsd:enumeration value="property" />
+ <xsd:enumeration value="event" />
+ <xsd:enumeration value="variable" />
+ <xsd:enumeration value="typedef" />
+ <xsd:enumeration value="enum" />
+ <xsd:enumeration value="function" />
+ <xsd:enumeration value="signal" />
+ <xsd:enumeration value="prototype" />
+ <xsd:enumeration value="friend" />
+ <xsd:enumeration value="dcop" />
+ <xsd:enumeration value="slot" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxProtectionKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="public" />
+ <xsd:enumeration value="protected" />
+ <xsd:enumeration value="private" />
+ <xsd:enumeration value="package" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxVirtualKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="non-virtual" />
+ <xsd:enumeration value="virtual" />
+ <xsd:enumeration value="pure-virtual" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxCompoundKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="class" />
+ <xsd:enumeration value="struct" />
+ <xsd:enumeration value="union" />
+ <xsd:enumeration value="interface" />
+ <xsd:enumeration value="protocol" />
+ <xsd:enumeration value="category" />
+ <xsd:enumeration value="exception" />
+ <xsd:enumeration value="file" />
+ <xsd:enumeration value="namespace" />
+ <xsd:enumeration value="group" />
+ <xsd:enumeration value="page" />
+ <xsd:enumeration value="example" />
+ <xsd:enumeration value="dir" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxSectionKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="user-defined" />
+ <xsd:enumeration value="public-type" />
+ <xsd:enumeration value="public-func" />
+ <xsd:enumeration value="public-attrib" />
+ <xsd:enumeration value="public-slot" />
+ <xsd:enumeration value="signal" />
+ <xsd:enumeration value="dcop-func" />
+ <xsd:enumeration value="property" />
+ <xsd:enumeration value="event" />
+ <xsd:enumeration value="public-static-func" />
+ <xsd:enumeration value="public-static-attrib" />
+ <xsd:enumeration value="protected-type" />
+ <xsd:enumeration value="protected-func" />
+ <xsd:enumeration value="protected-attrib" />
+ <xsd:enumeration value="protected-slot" />
+ <xsd:enumeration value="protected-static-func" />
+ <xsd:enumeration value="protected-static-attrib" />
+ <xsd:enumeration value="package-type" />
+ <xsd:enumeration value="package-func" />
+ <xsd:enumeration value="package-attrib" />
+ <xsd:enumeration value="package-static-func" />
+ <xsd:enumeration value="package-static-attrib" />
+ <xsd:enumeration value="private-type" />
+ <xsd:enumeration value="private-func" />
+ <xsd:enumeration value="private-attrib" />
+ <xsd:enumeration value="private-slot" />
+ <xsd:enumeration value="private-static-func" />
+ <xsd:enumeration value="private-static-attrib" />
+ <xsd:enumeration value="friend" />
+ <xsd:enumeration value="related" />
+ <xsd:enumeration value="define" />
+ <xsd:enumeration value="prototype" />
+ <xsd:enumeration value="typedef" />
+ <xsd:enumeration value="enum" />
+ <xsd:enumeration value="func" />
+ <xsd:enumeration value="var" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxHighlightClass">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="comment" />
+ <xsd:enumeration value="normal" />
+ <xsd:enumeration value="preprocessor" />
+ <xsd:enumeration value="keyword" />
+ <xsd:enumeration value="keywordtype" />
+ <xsd:enumeration value="keywordflow" />
+ <xsd:enumeration value="stringliteral" />
+ <xsd:enumeration value="charliteral" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxSimpleSectKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="see" />
+ <xsd:enumeration value="return" />
+ <xsd:enumeration value="author" />
+ <xsd:enumeration value="authors" />
+ <xsd:enumeration value="version" />
+ <xsd:enumeration value="since" />
+ <xsd:enumeration value="date" />
+ <xsd:enumeration value="note" />
+ <xsd:enumeration value="warning" />
+ <xsd:enumeration value="pre" />
+ <xsd:enumeration value="post" />
+ <xsd:enumeration value="invariant" />
+ <xsd:enumeration value="remark" />
+ <xsd:enumeration value="attention" />
+ <xsd:enumeration value="par" />
+ <xsd:enumeration value="rcs" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxVersionNumber">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="\d+\.\d+.*" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxImageKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="html" />
+ <xsd:enumeration value="latex" />
+ <xsd:enumeration value="rtf" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxParamListKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="param" />
+ <xsd:enumeration value="retval" />
+ <xsd:enumeration value="exception" />
+ <xsd:enumeration value="templateparam" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxCharRange">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[aeiouncAEIOUNC]" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxParamDir">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="in"/>
+ <xsd:enumeration value="out"/>
+ <xsd:enumeration value="inout"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DoxAccessor">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="retain"/>
+ <xsd:enumeration value="copy"/>
+ <xsd:enumeration value="assign"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+</xsd:schema>
+
diff --git a/src/compound_xsd.h b/src/compound_xsd.h
new file mode 100644
index 0000000..c157054
--- /dev/null
+++ b/src/compound_xsd.h
@@ -0,0 +1,821 @@
+"<?xml version='1.0' encoding='utf-8' ?>\n"
+"<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n"
+" <xsd:element name=\"doxygen\" type=\"DoxygenType\"/>\n"
+"\n"
+" <!-- Complex types -->\n"
+"\n"
+" <xsd:complexType name=\"DoxygenType\">\n"
+" <xsd:sequence maxOccurs=\"unbounded\">\n"
+" <xsd:element name=\"compounddef\" type=\"compounddefType\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"version\" type=\"DoxVersionNumber\" use=\"required\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"compounddefType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"compoundname\" type=\"xsd:string\"/>\n"
+" <xsd:element name=\"title\" type=\"xsd:string\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"basecompoundref\" type=\"compoundRefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"derivedcompoundref\" type=\"compoundRefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"includes\" type=\"incType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"includedby\" type=\"incType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"incdepgraph\" type=\"graphType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"invincdepgraph\" type=\"graphType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"innerdir\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"innerfile\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"innerclass\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"innernamespace\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"innerpage\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"innergroup\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"templateparamlist\" type=\"templateparamlistType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"sectiondef\" type=\"sectiondefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"detaileddescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"inheritancegraph\" type=\"graphType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"collaborationgraph\" type=\"graphType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"programlisting\" type=\"listingType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"location\" type=\"locationType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"listofallmembers\" type=\"listofallmembersType\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"kind\" type=\"DoxCompoundKind\" />\n"
+" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"listofallmembersType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"member\" type=\"memberRefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"memberRefType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"scope\" />\n"
+" <xsd:element name=\"name\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
+" <xsd:attribute name=\"virt\" type=\"DoxVirtualKind\" />\n"
+" <xsd:attribute name=\"ambiguityscope\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"compoundRefType\">\n"
+" <xsd:simpleContent>\n"
+" <xsd:extension base=\"xsd:string\">\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"optional\" />\n"
+" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
+" <xsd:attribute name=\"virt\" type=\"DoxVirtualKind\" />\n"
+" </xsd:extension>\n"
+" </xsd:simpleContent>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"reimplementType\">\n"
+" <xsd:simpleContent>\n"
+" <xsd:extension base=\"xsd:string\">\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" </xsd:extension>\n"
+" </xsd:simpleContent>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"incType\">\n"
+" <xsd:simpleContent>\n"
+" <xsd:extension base=\"xsd:string\">\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"local\" type=\"DoxBool\" />\n"
+" </xsd:extension>\n"
+" </xsd:simpleContent>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"refType\">\n"
+" <xsd:simpleContent>\n"
+" <xsd:extension base=\"xsd:string\">\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" use=\"optional\"/>\n"
+" </xsd:extension>\n"
+" </xsd:simpleContent>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"refTextType\">\n"
+" <xsd:simpleContent>\n"
+" <xsd:extension base=\"xsd:string\">\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"kindref\" type=\"DoxRefKind\" />\n"
+" <xsd:attribute name=\"external\" type=\"xsd:string\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"tooltip\" type=\"xsd:string\" use=\"optional\"/>\n"
+" </xsd:extension>\n"
+" </xsd:simpleContent>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"sectiondefType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"header\" type=\"xsd:string\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"description\" type=\"descriptionType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"memberdef\" type=\"memberdefType\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"kind\" type=\"DoxSectionKind\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"memberdefType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"templateparamlist\" type=\"templateparamlistType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"type\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"definition\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"argsstring\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"name\" />\n"
+" <xsd:element name=\"read\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"write\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"bitfield\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"reimplements\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"reimplementedby\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"param\" type=\"paramType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"enumvalue\" type=\"enumvalueType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"initializer\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"exceptions\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"detaileddescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"inbodydescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"location\" type=\"locationType\" />\n"
+" <xsd:element name=\"references\" type=\"referenceType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"referencedby\" type=\"referenceType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"kind\" type=\"DoxMemberKind\" />\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
+" <xsd:attribute name=\"static\" type=\"DoxBool\" />\n"
+" <xsd:attribute name=\"const\" type=\"DoxBool\" />\n"
+" <xsd:attribute name=\"explicit\" type=\"DoxBool\" />\n"
+" <xsd:attribute name=\"inline\" type=\"DoxBool\" />\n"
+" <xsd:attribute name=\"virt\" type=\"DoxVirtualKind\" />\n"
+" <xsd:attribute name=\"volatile\" type=\"DoxBool\" />\n"
+" <xsd:attribute name=\"mutable\" type=\"DoxBool\" />\n"
+" <!-- Qt property -->\n"
+" <xsd:attribute name=\"readable\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"writable\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <!-- C++/CLI variable -->\n"
+" <xsd:attribute name=\"initonly\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <!-- C++/CLI and C# property -->\n"
+" <xsd:attribute name=\"settable\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"gettable\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <!-- C++/CLI function -->\n"
+" <xsd:attribute name=\"final\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"sealed\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"new\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <!-- C++/CLI event -->\n"
+" <xsd:attribute name=\"add\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"remove\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"raise\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <!-- Objective-C 2.0 protocol method -->\n"
+" <xsd:attribute name=\"optional\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"required\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <!-- Objective-C 2.0 property accessor -->\n"
+" <xsd:attribute name=\"accessor\" type=\"DoxAccessor\" use=\"optional\"/>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"descriptionType\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"title\" type=\"xsd:string\" minOccurs=\"0\"/> \n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"internal\" type=\"docInternalType\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"enumvalueType\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"name\" />\n"
+" <xsd:element name=\"initializer\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"detaileddescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"templateparamlistType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"param\" type=\"paramType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"paramType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"type\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"declname\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"defname\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"array\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"defval\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"linkedTextType\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"graphType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"node\" type=\"nodeType\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"nodeType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"label\" />\n"
+" <xsd:element name=\"link\" type=\"linkType\" minOccurs=\"0\" />\n"
+" <xsd:element name=\"childnode\" type=\"childnodeType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"childnodeType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"edgelabel\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"relation\" type=\"DoxGraphRelation\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"linkType\">\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"external\" type=\"xsd:string\" use=\"optional\"/>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"listingType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"codeline\" type=\"codelineType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"codelineType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"highlight\" type=\"highlightType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"lineno\" type=\"xsd:integer\" />\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"refkind\" type=\"DoxRefKind\" />\n"
+" <xsd:attribute name=\"external\" type=\"DoxBool\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"highlightType\" mixed=\"true\">\n"
+" <xsd:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n"
+" <xsd:element name=\"sp\" />\n"
+" <xsd:element name=\"ref\" type=\"refTextType\" />\n"
+" </xsd:choice>\n"
+" <xsd:attribute name=\"class\" type=\"DoxHighlightClass\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"referenceType\" mixed=\"true\">\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"compoundref\" type=\"xsd:string\" use=\"optional\" />\n"
+" <xsd:attribute name=\"startline\" type=\"xsd:integer\" />\n"
+" <xsd:attribute name=\"endline\" type=\"xsd:integer\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"locationType\">\n"
+" <xsd:attribute name=\"file\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"line\" type=\"xsd:integer\" />\n"
+" <xsd:attribute name=\"bodyfile\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"bodystart\" type=\"xsd:integer\" />\n"
+" <xsd:attribute name=\"bodyend\" type=\"xsd:integer\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docSect1Type\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"title\" type=\"xsd:string\" /> \n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"sect2\" type=\"docSect2Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"internal\" type=\"docInternalS1Type\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docSect2Type\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"title\" type=\"xsd:string\" /> \n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"sect3\" type=\"docSect3Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"internal\" type=\"docInternalS2Type\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docSect3Type\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"title\" type=\"xsd:string\" /> \n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"sect4\" type=\"docSect4Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"internal\" type=\"docInternalS3Type\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docSect4Type\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"title\" type=\"xsd:string\" /> \n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"internal\" type=\"docInternalS4Type\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docInternalType\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docInternalS1Type\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"sect2\" type=\"docSect2Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docInternalS2Type\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"sect3\" type=\"docSect3Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docInternalS3Type\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"sect3\" type=\"docSect4Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docInternalS4Type\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+" \n"
+" <xsd:group name=\"docTitleCmdGroup\">\n"
+" <xsd:choice>\n"
+" <xsd:element name=\"ulink\" type=\"docURLLink\" />\n"
+" <xsd:element name=\"bold\" type=\"docMarkupType\" />\n"
+" <xsd:element name=\"emphasis\" type=\"docMarkupType\" />\n"
+" <xsd:element name=\"computeroutput\" type=\"docMarkupType\" />\n"
+" <xsd:element name=\"subscript\" type=\"docMarkupType\" />\n"
+" <xsd:element name=\"superscript\" type=\"docMarkupType\" />\n"
+" <xsd:element name=\"center\" type=\"docMarkupType\" />\n"
+" <xsd:element name=\"small\" type=\"docMarkupType\" />\n"
+" <xsd:element name=\"htmlonly\" type=\"xsd:string\" />\n"
+" <xsd:element name=\"latexonly\" type=\"xsd:string\" />\n"
+" <xsd:element name=\"dot\" type=\"xsd:string\" />\n"
+" <xsd:element name=\"anchor\" type=\"docAnchorType\" />\n"
+" <xsd:element name=\"formula\" type=\"docFormulaType\" />\n"
+" <xsd:element name=\"ref\" type=\"docRefTextType\" />\n"
+" <xsd:element name=\"copy\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"trademark\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"registered\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"lsquo\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"rsquo\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"ldquo\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"rdquo\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"ndash\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"mdash\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"umlaut\" type=\"docCharType\" />\n"
+" <xsd:element name=\"acute\" type=\"docCharType\" />\n"
+" <xsd:element name=\"grave\" type=\"docCharType\" />\n"
+" <xsd:element name=\"circ\" type=\"docCharType\" />\n"
+" <xsd:element name=\"slash\" type=\"docCharType\" />\n"
+" <xsd:element name=\"tilde\" type=\"docCharType\" />\n"
+" <xsd:element name=\"cedil\" type=\"docCharType\" />\n"
+" <xsd:element name=\"ring\" type=\"docCharType\" />\n"
+" <xsd:element name=\"szlig\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"nonbreakablespace\" type=\"docEmptyType\" />\n"
+" </xsd:choice>\n"
+" </xsd:group>\n"
+"\n"
+" <xsd:complexType name=\"docTitleType\" mixed=\"true\">\n"
+" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:group name=\"docCmdGroup\">\n"
+" <xsd:choice>\n"
+" <xsd:group ref=\"docTitleCmdGroup\"/>\n"
+" <xsd:element name=\"linebreak\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"hruler\" type=\"docEmptyType\" />\n"
+" <xsd:element name=\"preformatted\" type=\"docMarkupType\" />\n"
+" <xsd:element name=\"programlisting\" type=\"listingType\" />\n"
+" <xsd:element name=\"verbatim\" type=\"xsd:string\" />\n"
+" <xsd:element name=\"indexentry\" type=\"docIndexEntryType\" />\n"
+" <xsd:element name=\"orderedlist\" type=\"docListType\" />\n"
+" <xsd:element name=\"itemizedlist\" type=\"docListType\" />\n"
+" <xsd:element name=\"simplesect\" type=\"docSimpleSectType\" />\n"
+" <xsd:element name=\"title\" type=\"docTitleType\" />\n"
+" <xsd:element name=\"variablelist\" type=\"docVariableListType\" />\n"
+" <xsd:element name=\"table\" type=\"docTableType\" />\n"
+" <xsd:element name=\"heading\" type=\"docHeadingType\" />\n"
+" <xsd:element name=\"image\" type=\"docImageType\" />\n"
+" <xsd:element name=\"dotfile\" type=\"docDotFileType\" />\n"
+" <xsd:element name=\"toclist\" type=\"docTocListType\" />\n"
+" <xsd:element name=\"language\" type=\"docLanguageType\" />\n"
+" <xsd:element name=\"parameterlist\" type=\"docParamListType\" />\n"
+" <xsd:element name=\"xrefsect\" type=\"docXRefSectType\" />\n"
+" <xsd:element name=\"copydoc\" type=\"docCopyType\" />\n"
+" </xsd:choice>\n"
+" </xsd:group>\n"
+"\n"
+" <xsd:complexType name=\"docParaType\" mixed=\"true\">\n"
+" <xsd:group ref=\"docCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docMarkupType\" mixed=\"true\">\n"
+" <xsd:group ref=\"docCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docURLLink\" mixed=\"true\">\n"
+" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:attribute name=\"url\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docAnchorType\" mixed=\"true\">\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docFormulaType\" mixed=\"true\">\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docIndexEntryType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"primaryie\" type=\"xsd:string\" />\n"
+" <xsd:element name=\"secondaryie\" type=\"xsd:string\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docListType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"listitem\" type=\"docListItemType\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docListItemType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docSimpleSectType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"title\" type=\"docTitleType\" minOccurs=\"0\" />\n"
+" <xsd:sequence minOccurs=\"0\" maxOccurs=\"unbounded\">\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"1\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"simplesectsep\" type=\"docEmptyType\" minOccurs=\"0\"/>\n"
+" </xsd:sequence>\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"kind\" type=\"DoxSimpleSectKind\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docVarListEntryType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"term\" type=\"docTitleType\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:group name=\"docVariableListGroup\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"varlistentry\" type=\"docVarListEntryType\" />\n"
+" <xsd:element name=\"listitem\" type=\"docListItemType\" />\n"
+" </xsd:sequence>\n"
+" </xsd:group>\n"
+"\n"
+" <xsd:complexType name=\"docVariableListType\">\n"
+" <xsd:sequence>\n"
+" <xsd:group ref=\"docVariableListGroup\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docRefTextType\" mixed=\"true\">\n"
+" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
+" <xsd:attribute name=\"kindref\" type=\"DoxRefKind\" />\n"
+" <xsd:attribute name=\"external\" type=\"xsd:string\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docTableType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"row\" type=\"docRowType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"caption\" type=\"docCaptionType\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"rows\" type=\"xsd:integer\" />\n"
+" <xsd:attribute name=\"cols\" type=\"xsd:integer\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docRowType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"entry\" type=\"docEntryType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docEntryType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"thead\" type=\"DoxBool\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docCaptionType\" mixed=\"true\">\n"
+" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docHeadingType\" mixed=\"true\">\n"
+" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:attribute name=\"level\" type=\"xsd:integer\" /> <!-- todo: range 1-6 -->\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docImageType\" mixed=\"true\">\n"
+" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:attribute name=\"type\" type=\"DoxImageKind\" /> \n"
+" <xsd:attribute name=\"name\" type=\"xsd:string\" /> \n"
+" <xsd:attribute name=\"width\" type=\"xsd:string\" /> \n"
+" <xsd:attribute name=\"height\" type=\"xsd:string\" /> \n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docDotFileType\" mixed=\"true\">\n"
+" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:attribute name=\"name\" type=\"xsd:string\" /> \n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docTocItemType\" mixed=\"true\">\n"
+" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" /> \n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docTocListType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"tocitem\" type=\"docTocItemType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docLanguageType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"langid\" type=\"xsd:string\" /> \n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docParamListType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"parameteritem\" type=\"docParamListItem\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"kind\" type=\"DoxParamListKind\" /> \n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docParamListItem\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"parameternamelist\" type=\"docParamNameList\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"parameterdescription\" type=\"descriptionType\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docParamNameList\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"parametertype\" type=\"docParamType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"parametername\" type=\"docParamName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docParamType\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"1\" />\n"
+" </xsd:sequence>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docParamName\" mixed=\"true\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"1\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"direction\" type=\"DoxParamDir\" use=\"optional\" />\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docXRefSectType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"xreftitle\" type=\"xsd:string\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"xrefdescription\" type=\"descriptionType\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"id\" type=\"xsd:string\" /> \n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docCopyType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
+" <xsd:element name=\"internal\" type=\"docInternalType\" minOccurs=\"0\" />\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"link\" type=\"xsd:string\" /> \n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docCharType\">\n"
+" <xsd:attribute name=\"char\" type=\"DoxCharRange\"/> \n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"docEmptyType\"/>\n"
+"\n"
+" <!-- Simple types -->\n"
+"\n"
+" <xsd:simpleType name=\"DoxBool\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"yes\" />\n"
+" <xsd:enumeration value=\"no\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxGraphRelation\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"include\" />\n"
+" <xsd:enumeration value=\"usage\" />\n"
+" <xsd:enumeration value=\"template-instance\" />\n"
+" <xsd:enumeration value=\"public-inheritance\" />\n"
+" <xsd:enumeration value=\"protected-inheritance\" />\n"
+" <xsd:enumeration value=\"private-inheritance\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxRefKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"compound\" />\n"
+" <xsd:enumeration value=\"member\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxMemberKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"define\" />\n"
+" <xsd:enumeration value=\"property\" />\n"
+" <xsd:enumeration value=\"event\" />\n"
+" <xsd:enumeration value=\"variable\" />\n"
+" <xsd:enumeration value=\"typedef\" />\n"
+" <xsd:enumeration value=\"enum\" />\n"
+" <xsd:enumeration value=\"function\" />\n"
+" <xsd:enumeration value=\"signal\" />\n"
+" <xsd:enumeration value=\"prototype\" />\n"
+" <xsd:enumeration value=\"friend\" />\n"
+" <xsd:enumeration value=\"dcop\" />\n"
+" <xsd:enumeration value=\"slot\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxProtectionKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"public\" />\n"
+" <xsd:enumeration value=\"protected\" />\n"
+" <xsd:enumeration value=\"private\" />\n"
+" <xsd:enumeration value=\"package\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxVirtualKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"non-virtual\" />\n"
+" <xsd:enumeration value=\"virtual\" />\n"
+" <xsd:enumeration value=\"pure-virtual\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxCompoundKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"class\" />\n"
+" <xsd:enumeration value=\"struct\" />\n"
+" <xsd:enumeration value=\"union\" />\n"
+" <xsd:enumeration value=\"interface\" />\n"
+" <xsd:enumeration value=\"protocol\" />\n"
+" <xsd:enumeration value=\"category\" />\n"
+" <xsd:enumeration value=\"exception\" />\n"
+" <xsd:enumeration value=\"file\" />\n"
+" <xsd:enumeration value=\"namespace\" />\n"
+" <xsd:enumeration value=\"group\" />\n"
+" <xsd:enumeration value=\"page\" />\n"
+" <xsd:enumeration value=\"example\" />\n"
+" <xsd:enumeration value=\"dir\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxSectionKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"user-defined\" />\n"
+" <xsd:enumeration value=\"public-type\" />\n"
+" <xsd:enumeration value=\"public-func\" />\n"
+" <xsd:enumeration value=\"public-attrib\" />\n"
+" <xsd:enumeration value=\"public-slot\" />\n"
+" <xsd:enumeration value=\"signal\" />\n"
+" <xsd:enumeration value=\"dcop-func\" />\n"
+" <xsd:enumeration value=\"property\" />\n"
+" <xsd:enumeration value=\"event\" />\n"
+" <xsd:enumeration value=\"public-static-func\" />\n"
+" <xsd:enumeration value=\"public-static-attrib\" />\n"
+" <xsd:enumeration value=\"protected-type\" />\n"
+" <xsd:enumeration value=\"protected-func\" />\n"
+" <xsd:enumeration value=\"protected-attrib\" />\n"
+" <xsd:enumeration value=\"protected-slot\" />\n"
+" <xsd:enumeration value=\"protected-static-func\" />\n"
+" <xsd:enumeration value=\"protected-static-attrib\" />\n"
+" <xsd:enumeration value=\"package-type\" />\n"
+" <xsd:enumeration value=\"package-func\" />\n"
+" <xsd:enumeration value=\"package-attrib\" />\n"
+" <xsd:enumeration value=\"package-static-func\" />\n"
+" <xsd:enumeration value=\"package-static-attrib\" />\n"
+" <xsd:enumeration value=\"private-type\" />\n"
+" <xsd:enumeration value=\"private-func\" />\n"
+" <xsd:enumeration value=\"private-attrib\" />\n"
+" <xsd:enumeration value=\"private-slot\" />\n"
+" <xsd:enumeration value=\"private-static-func\" />\n"
+" <xsd:enumeration value=\"private-static-attrib\" />\n"
+" <xsd:enumeration value=\"friend\" />\n"
+" <xsd:enumeration value=\"related\" />\n"
+" <xsd:enumeration value=\"define\" />\n"
+" <xsd:enumeration value=\"prototype\" />\n"
+" <xsd:enumeration value=\"typedef\" />\n"
+" <xsd:enumeration value=\"enum\" />\n"
+" <xsd:enumeration value=\"func\" />\n"
+" <xsd:enumeration value=\"var\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxHighlightClass\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"comment\" />\n"
+" <xsd:enumeration value=\"normal\" />\n"
+" <xsd:enumeration value=\"preprocessor\" />\n"
+" <xsd:enumeration value=\"keyword\" />\n"
+" <xsd:enumeration value=\"keywordtype\" />\n"
+" <xsd:enumeration value=\"keywordflow\" />\n"
+" <xsd:enumeration value=\"stringliteral\" />\n"
+" <xsd:enumeration value=\"charliteral\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxSimpleSectKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"see\" />\n"
+" <xsd:enumeration value=\"return\" />\n"
+" <xsd:enumeration value=\"author\" />\n"
+" <xsd:enumeration value=\"authors\" />\n"
+" <xsd:enumeration value=\"version\" />\n"
+" <xsd:enumeration value=\"since\" />\n"
+" <xsd:enumeration value=\"date\" />\n"
+" <xsd:enumeration value=\"note\" />\n"
+" <xsd:enumeration value=\"warning\" />\n"
+" <xsd:enumeration value=\"pre\" />\n"
+" <xsd:enumeration value=\"post\" />\n"
+" <xsd:enumeration value=\"invariant\" />\n"
+" <xsd:enumeration value=\"remark\" />\n"
+" <xsd:enumeration value=\"attention\" />\n"
+" <xsd:enumeration value=\"par\" />\n"
+" <xsd:enumeration value=\"rcs\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxVersionNumber\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:pattern value=\"\\d+\\.\\d+.*\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxImageKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"html\" />\n"
+" <xsd:enumeration value=\"latex\" />\n"
+" <xsd:enumeration value=\"rtf\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxParamListKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"param\" />\n"
+" <xsd:enumeration value=\"retval\" />\n"
+" <xsd:enumeration value=\"exception\" />\n"
+" <xsd:enumeration value=\"templateparam\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxCharRange\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:pattern value=\"[aeiouncAEIOUNC]\" />\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxParamDir\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"in\"/>\n"
+" <xsd:enumeration value=\"out\"/>\n"
+" <xsd:enumeration value=\"inout\"/>\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"DoxAccessor\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"retain\"/>\n"
+" <xsd:enumeration value=\"copy\"/>\n"
+" <xsd:enumeration value=\"assign\"/>\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+"</xsd:schema>\n"
+"\n"
diff --git a/src/config.cpp b/src/config.cpp
new file mode 100644
index 0000000..32b36a5
--- /dev/null
+++ b/src/config.cpp
@@ -0,0 +1,3528 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer configYY_create_buffer
+#define yy_delete_buffer configYY_delete_buffer
+#define yy_flex_debug configYY_flex_debug
+#define yy_init_buffer configYY_init_buffer
+#define yy_flush_buffer configYY_flush_buffer
+#define yy_load_buffer_state configYY_load_buffer_state
+#define yy_switch_to_buffer configYY_switch_to_buffer
+#define yyin configYYin
+#define yyleng configYYleng
+#define yylex configYYlex
+#define yylineno configYYlineno
+#define yyout configYYout
+#define yyrestart configYYrestart
+#define yytext configYYtext
+#define yywrap configYYwrap
+#define yyalloc configYYalloc
+#define yyrealloc configYYrealloc
+#define yyfree configYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE configYYrestart(configYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t configYYleng;
+
+extern FILE *configYYin, *configYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up configYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up configYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via configYYrestart()), so that the user can continue scanning by
+ * just pointing configYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when configYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t configYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow configYYwrap()'s to do buffer switches
+ * instead of setting up a fresh configYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void configYYrestart (FILE *input_file );
+void configYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE configYY_create_buffer (FILE *file,int size );
+void configYY_delete_buffer (YY_BUFFER_STATE b );
+void configYY_flush_buffer (YY_BUFFER_STATE b );
+void configYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void configYYpop_buffer_state (void );
+
+static void configYYensure_buffer_stack (void );
+static void configYY_load_buffer_state (void );
+static void configYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER configYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE configYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE configYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE configYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *configYYalloc (yy_size_t );
+void *configYYrealloc (void *,yy_size_t );
+void configYYfree (void * );
+
+#define yy_new_buffer configYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ configYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ configYY_create_buffer(configYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ configYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ configYY_create_buffer(configYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define configYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *configYYin = (FILE *) 0, *configYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int configYYlineno;
+
+int configYYlineno = 1;
+
+extern char *configYYtext;
+#define yytext_ptr configYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up configYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ configYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 24
+#define YY_END_OF_BUFFER 25
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_accept[100] =
+ { 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 25, 22, 23, 22, 22, 2, 8, 22, 8, 19,
+ 22, 9, 13, 12, 2, 12, 12, 17, 18, 11,
+ 10, 18, 18, 16, 14, 14, 16, 16, 7, 22,
+ 7, 7, 0, 21, 0, 8, 0, 0, 0, 8,
+ 3, 0, 20, 12, 12, 17, 18, 11, 18, 15,
+ 7, 0, 7, 0, 0, 4, 12, 18, 7, 7,
+ 1, 0, 1, 1, 1, 0, 0, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 0, 5, 0
+
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 5, 6, 1, 1, 1, 1, 1,
+ 1, 1, 7, 1, 1, 1, 1, 8, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 1, 1, 1,
+ 10, 1, 1, 11, 12, 13, 14, 15, 16, 13,
+ 13, 17, 18, 13, 13, 19, 13, 20, 13, 21,
+ 13, 13, 13, 22, 23, 13, 13, 13, 13, 13,
+ 1, 24, 1, 1, 25, 1, 13, 13, 13, 26,
+
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 27,
+ 13, 13, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[29] =
+ { 0,
+ 1, 2, 3, 4, 3, 5, 6, 7, 7, 6,
+ 1, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 1, 7, 8, 8, 1
+ } ;
+
+static yyconst flex_int16_t yy_base[112] =
+ { 0,
+ 0, 1, 29, 0, 55, 56, 82, 108, 135, 162,
+ 190, 0, 217, 244, 58, 65, 66, 68, 271, 298,
+ 145, 408, 408, 3, 117, 408, 0, 125, 6, 408,
+ 7, 408, 408, 0, 0, 15, 115, 0, 0, 133,
+ 408, 18, 107, 408, 408, 408, 62, 106, 0, 0,
+ 70, 104, 73, 408, 122, 0, 109, 93, 118, 95,
+ 408, 105, 408, 0, 118, 0, 0, 123, 116, 408,
+ 0, 117, 113, 94, 105, 408, 92, 91, 408, 90,
+ 408, 82, 0, 0, 0, 75, 66, 62, 102, 13,
+ 408, 41, 48, 5, 9, 89, 113, 408, 408, 326,
+
+ 334, 342, 350, 358, 360, 367, 375, 4, 383, 391,
+ 399
+ } ;
+
+static yyconst flex_int16_t yy_def[112] =
+ { 0,
+ 100, 100, 99, 3, 100, 100, 100, 100, 101, 101,
+ 99, 11, 102, 102, 103, 103, 100, 100, 104, 104,
+ 99, 99, 99, 99, 99, 99, 105, 99, 106, 99,
+ 99, 99, 99, 107, 107, 107, 107, 108, 109, 99,
+ 99, 109, 109, 99, 99, 99, 99, 99, 110, 111,
+ 110, 110, 99, 99, 99, 105, 99, 99, 99, 106,
+ 99, 99, 99, 107, 107, 108, 109, 99, 109, 99,
+ 110, 111, 110, 99, 99, 99, 107, 109, 99, 110,
+ 99, 99, 107, 109, 110, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 0, 99,
+
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99
+ } ;
+
+static yyconst flex_int16_t yy_nxt[437] =
+ { 0,
+ 99, 99, 23, 23, 53, 54, 53, 58, 62, 63,
+ 62, 66, 59, 99, 90, 61, 53, 54, 53, 53,
+ 54, 53, 91, 24, 24, 96, 95, 25, 25, 22,
+ 22, 23, 22, 22, 26, 22, 27, 27, 22, 28,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 24, 29, 29, 29, 25, 30, 30, 94,
+ 45, 93, 46, 53, 54, 53, 70, 45, 23, 46,
+ 23, 53, 54, 53, 53, 54, 53, 89, 31, 31,
+ 88, 47, 25, 25, 32, 48, 33, 26, 47, 24,
+ 97, 24, 48, 25, 58, 25, 58, 87, 98, 59,
+
+ 86, 59, 61, 90, 61, 24, 62, 63, 62, 25,
+ 32, 91, 33, 26, 97, 85, 84, 83, 82, 81,
+ 80, 79, 98, 78, 68, 77, 92, 76, 75, 74,
+ 73, 24, 55, 69, 68, 25, 22, 32, 22, 33,
+ 35, 65, 57, 55, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 36, 99,
+ 99, 99, 37, 22, 32, 22, 33, 35, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 36, 99, 99, 99, 37,
+ 22, 22, 32, 22, 22, 26, 22, 22, 22, 22,
+
+ 22, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 24, 22, 38, 38, 25, 40, 41,
+ 22, 33, 26, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 42, 99, 99, 99, 43, 40, 41, 22, 33, 26,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 42, 99, 99,
+ 99, 43, 22, 23, 22, 50, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 51, 99, 99, 99, 52, 22,
+
+ 23, 22, 50, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 51, 99, 99, 99, 52, 22, 22, 22, 22,
+ 22, 22, 22, 22, 34, 34, 34, 34, 34, 34,
+ 34, 34, 39, 39, 39, 39, 39, 39, 39, 39,
+ 44, 44, 44, 44, 44, 44, 44, 44, 49, 49,
+ 49, 49, 49, 49, 49, 49, 56, 56, 60, 99,
+ 99, 99, 60, 60, 60, 64, 99, 99, 99, 64,
+ 64, 64, 64, 67, 99, 99, 99, 99, 67, 67,
+ 67, 71, 99, 99, 99, 71, 71, 71, 71, 72,
+
+ 72, 99, 72, 72, 72, 72, 72, 21, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99
+ } ;
+
+static yyconst flex_int16_t yy_chk[437] =
+ { 0,
+ 0, 0, 1, 2, 24, 24, 24, 29, 31, 31,
+ 31, 108, 29, 0, 90, 29, 36, 36, 36, 42,
+ 42, 42, 90, 1, 2, 95, 94, 1, 2, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 5, 6, 93,
+ 15, 92, 15, 47, 47, 47, 47, 16, 17, 16,
+ 18, 51, 51, 51, 53, 53, 53, 88, 5, 6,
+ 87, 15, 5, 6, 7, 15, 7, 7, 16, 17,
+ 96, 18, 16, 17, 58, 18, 60, 86, 96, 58,
+
+ 82, 60, 58, 89, 60, 7, 62, 62, 62, 7,
+ 8, 89, 8, 8, 97, 80, 78, 77, 75, 74,
+ 73, 72, 97, 69, 68, 65, 89, 59, 57, 55,
+ 52, 8, 48, 43, 40, 8, 9, 9, 9, 9,
+ 9, 37, 28, 25, 21, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 0,
+ 0, 0, 9, 10, 10, 10, 10, 10, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 10, 0, 0, 0, 10,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 13, 13,
+ 13, 13, 13, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 13, 0, 0, 0, 13, 14, 14, 14, 14, 14,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 14, 0, 0,
+ 0, 14, 19, 19, 19, 19, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 19, 0, 0, 0, 19, 20,
+
+ 20, 20, 20, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 20, 0, 0, 0, 20, 100, 100, 100, 100,
+ 100, 100, 100, 100, 101, 101, 101, 101, 101, 101,
+ 101, 101, 102, 102, 102, 102, 102, 102, 102, 102,
+ 103, 103, 103, 103, 103, 103, 103, 103, 104, 104,
+ 104, 104, 104, 104, 104, 104, 105, 105, 106, 0,
+ 0, 0, 106, 106, 106, 107, 0, 0, 0, 107,
+ 107, 107, 107, 109, 0, 0, 0, 0, 109, 109,
+ 109, 110, 0, 0, 0, 110, 110, 110, 110, 111,
+
+ 111, 0, 111, 111, 111, 111, 111, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int configYY_flex_debug;
+int configYY_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *configYYtext;
+#line 1 "config.l"
+/******************************************************************************
+ *
+ * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+#line 16 "config.l"
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <errno.h>
+
+#include <qfileinfo.h>
+#include <qdir.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+#include <qstack.h>
+#include <qglobal.h>
+
+#include "config.h"
+#include "version.h"
+#include "portable.h"
+#include "util.h"
+
+#include "lang_cfg.h"
+#include "configoptions.h"
+
+#undef Config_getString
+#undef Config_getInt
+#undef Config_getList
+#undef Config_getEnum
+#undef Config_getBool
+
+// use in-class definitions
+#define Config_getString(val) getString(__FILE__,__LINE__,val)
+#define Config_getInt(val) getInt(__FILE__,__LINE__,val)
+#define Config_getList(val) getList(__FILE__,__LINE__,val)
+#define Config_getEnum(val) getEnum(__FILE__,__LINE__,val)
+#define Config_getBool(val) getBool(__FILE__,__LINE__,val)
+
+void config_err(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
+void config_warn(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
+
+static QCString configStringRecode(
+ const QCString &str,
+ const char *fromEncoding,
+ const char *toEncoding);
+
+#define MAX_INCLUDE_DEPTH 10
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ */
+QCString ConfigOption::convertToComment(const QCString &s)
+{
+ QCString result;
+ if (s.isEmpty()) return result;
+ else
+ {
+ QCString tmp=s.stripWhiteSpace();
+ char *p=tmp.data();
+ char c;
+ result+="#";
+ if (*p && *p!='\n')
+ result+=" ";
+ while ((c=*p++))
+ {
+ if (c=='\n')
+ {
+ result+="\n#";
+ if (*p && *p!='\n')
+ result+=" ";
+ }
+ else result+=c;
+ }
+ result+='\n';
+ }
+ return result;
+}
+
+void ConfigOption::writeBoolValue(FTextStream &t,bool v)
+{
+ t << " ";
+ if (v) t << "YES"; else t << "NO";
+}
+
+void ConfigOption::writeIntValue(FTextStream &t,int i)
+{
+ t << " " << i;
+}
+
+void ConfigOption::writeStringValue(FTextStream &t,QCString &s)
+{
+ char c;
+ bool needsEscaping=FALSE;
+ // convert the string back to it original encoding
+ QCString se = configStringRecode(s,"UTF-8",m_encoding);
+ const char *p=se.data();
+ if (p)
+ {
+ t << " ";
+ while ((c=*p++)!=0 && !needsEscaping)
+ needsEscaping = (c==' ' || c=='\n' || c=='\t' || c=='"' || c=='#');
+ if (needsEscaping)
+ {
+ t << "\"";
+ p=se.data();
+ while (*p)
+ {
+ if (*p==' ' && *(p+1)=='\0') break; // skip inserted space at the end
+ if (*p=='"') t << "\\"; // escape quotes
+ t << *p++;
+ }
+ t << "\"";
+ }
+ else
+ {
+ t << se;
+ }
+ }
+}
+
+void ConfigOption::writeStringList(FTextStream &t,QStrList &l)
+{
+ const char *p = l.first();
+ bool first=TRUE;
+ while (p)
+ {
+ QCString s=p;
+ if (!first)
+ t << " ";
+ first=FALSE;
+ writeStringValue(t,s);
+ p = l.next();
+ if (p) t << " \\" << endl;
+ }
+}
+
+/* -----------------------------------------------------------------
+ */
+
+Config *Config::m_instance = 0;
+
+void ConfigInt::convertStrToVal()
+{
+ if (!m_valueString.isEmpty())
+ {
+ bool ok;
+ int val = m_valueString.toInt(&ok);
+ if (!ok || val<m_minVal || val>m_maxVal)
+ {
+ config_warn("warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
+ "Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value);
+ }
+ m_value=val;
+ }
+}
+
+void ConfigBool::convertStrToVal()
+{
+ QCString val = m_valueString.stripWhiteSpace().lower();
+ if (!val.isEmpty())
+ {
+ if (val=="yes" || val=="true" || val=="1" || val=="all")
+ {
+ m_value=TRUE;
+ }
+ else if (val=="no" || val=="false" || val=="0" || val=="none")
+ {
+ m_value=FALSE;
+ }
+ else
+ {
+ config_warn("warning: argument `%s' for option %s is not a valid boolean value\n"
+ "Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO");
+ }
+ }
+}
+
+QCString &Config::getString(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_String)
+ {
+ config_err("%s<%d>: Internal error: Requested option %s not of string type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigString *)opt)->valueRef();
+}
+
+QStrList &Config::getList(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_List)
+ {
+ config_err("%d<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigList *)opt)->valueRef();
+}
+
+QCString &Config::getEnum(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_Enum)
+ {
+ config_err("%s<%d>: Internal error: Requested option %s not of enum type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigEnum *)opt)->valueRef();
+}
+
+int &Config::getInt(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_Int)
+ {
+ config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigInt *)opt)->valueRef();
+}
+
+bool &Config::getBool(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_Bool)
+ {
+ config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigBool *)opt)->valueRef();
+}
+
+/* -----------------------------------------------------------------
+ */
+
+void ConfigInt::writeXML(FTextStream& t)
+{
+ t << " <option type='int' "
+ "id='" << convertToXML(name()) << "' "
+ "docs='\n" << convertToXML(docs()) << "' "
+ "minval='" << m_minVal << "' "
+ "maxval='" << m_maxVal << "' "
+ "defval='" << m_defValue << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << "/>" << endl;
+}
+
+void ConfigBool::writeXML(FTextStream& t)
+{
+ t << " <option type='bool' "
+ "id='" << convertToXML(name()) << "' "
+ "docs='\n" << convertToXML(docs()) << "' "
+ "defval='" << m_defValue << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << "/>" << endl;
+}
+
+void ConfigString::writeXML(FTextStream& t)
+{
+ QString format;
+ switch (m_widgetType)
+ {
+ case String: format="string"; break;
+ case File: format="file"; break;
+ case Dir: format="dir"; break;
+ }
+ t << " <option type='string' "
+ "id='" << convertToXML(name()) << "' "
+ "format='" << format << "' "
+ "docs='\n" << convertToXML(docs()) << "' "
+ "defval='" << convertToXML(m_defValue) << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << "/>" << endl;
+}
+
+void ConfigEnum::writeXML(FTextStream &t)
+{
+ t << " <option type='enum' "
+ "id='" << convertToXML(name()) << "' "
+ "defval='" << convertToXML(m_defValue) << "' "
+ "docs='\n" << convertToXML(docs()) << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << ">" << endl;
+
+ char *enumVal = m_valueRange.first();
+ while (enumVal)
+ {
+ t << " <value name='" << convertToXML(enumVal) << "'/>" << endl;
+ enumVal = m_valueRange.next();
+ }
+
+ t << " </option>" << endl;
+}
+
+void ConfigList::writeXML(FTextStream &t)
+{
+ QString format;
+ switch (m_widgetType)
+ {
+ case String: format="string"; break;
+ case File: format="file"; break;
+ case Dir: format="dir"; break;
+ case FileAndDir: format="filedir"; break;
+ }
+ t << " <option type='list' "
+ "id='" << convertToXML(name()) << "' "
+ "format='" << format << "' "
+ "docs='\n" << convertToXML(docs()) << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << ">" << endl;
+ char *enumVal = m_value.first();
+ while (enumVal)
+ {
+ t << " <value name='" << convertToXML(enumVal) << "'/>" << endl;
+ enumVal = m_value.next();
+ }
+
+ t << " </option>" << endl;
+}
+
+void ConfigObsolete::writeXML(FTextStream &t)
+{
+ t << " <option type='obsolete' "
+ "id='" << convertToXML(name()) << "'/>" << endl;
+}
+
+
+/* -----------------------------------------------------------------
+ *
+ * static variables
+ */
+
+struct ConfigFileState
+{
+ int lineNr;
+ FILE *filePtr;
+ YY_BUFFER_STATE oldState;
+ YY_BUFFER_STATE newState;
+ QCString fileName;
+};
+
+static const char *inputString;
+static int inputPosition;
+static int yyLineNr;
+static QCString yyFileName;
+static QCString tmpString;
+static QCString *s=0;
+static bool *b=0;
+static QStrList *l=0;
+static int lastState;
+static QCString elemStr;
+static QCString includeName;
+static QStrList includePathList;
+static QStack<ConfigFileState> includeStack;
+static int includeDepth;
+
+static QCString tabSizeString;
+static QCString maxInitLinesString;
+static QCString colsInAlphaIndexString;
+static QCString enumValuesPerLineString;
+static QCString treeViewWidthString;
+static QCString maxDotGraphWidthString;
+static QCString maxDotGraphHeightString;
+static QCString encoding;
+
+static Config *config;
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ // no file included
+ if (includeStack.isEmpty())
+ {
+ int c=0;
+ if (inputString==0) return c;
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+ }
+ else
+ {
+ //assert(includeStack.current()->newState==YY_CURRENT_BUFFER);
+ return (int)fread(buf,1,max_size,includeStack.current()->filePtr);
+ }
+}
+
+
+static QCString configStringRecode(
+ const QCString &str,
+ const char *fromEncoding,
+ const char *toEncoding)
+{
+ QCString inputEncoding = fromEncoding;
+ QCString outputEncoding = toEncoding;
+ if (inputEncoding.isEmpty() || outputEncoding.isEmpty() || inputEncoding==outputEncoding) return str;
+ int inputSize=str.length();
+ size_t outputSize=inputSize*4+1;
+ QCString output(outputSize);
+ void *cd = portable_iconv_open(outputEncoding,inputEncoding);
+ if (cd==(void *)(-1))
+ {
+ fprintf(stderr,"error: unsupported character conversion: '%s'->'%s'\n",
+ inputEncoding.data(),outputEncoding.data());
+ exit(1);
+ }
+ size_t iLeft=inputSize;
+ size_t oLeft=outputSize;
+ const char *inputPtr = str.data();
+ char *outputPtr = output.data();
+ if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft))
+ {
+ outputSize-=oLeft;
+ output.resize(outputSize+1);
+ output.at(outputSize)='\0';
+ //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data());
+ }
+ else
+ {
+ fprintf(stderr,"error: failed to translate characters from %s to %s: %s\n",
+ inputEncoding.data(),outputEncoding.data(),strerror(errno));
+ exit(1);
+ }
+ portable_iconv_close(cd);
+ return output;
+}
+
+static void checkEncoding()
+{
+ ConfigString *option = (ConfigString*)config->get("DOXYFILE_ENCODING");
+ encoding = *option->valueRef();
+}
+
+static FILE *tryPath(const char *path,const char *fileName)
+{
+ QCString absName=(path ? (QCString)path+"/"+fileName : (QCString)fileName);
+ QFileInfo fi(absName);
+ if (fi.exists() && fi.isFile())
+ {
+ FILE *f=portable_fopen(absName,"r");
+ if (!f) config_err("error: could not open file %s for reading\n",absName.data());
+ return f;
+ }
+ return 0;
+}
+
+static void substEnvVarsInStrList(QStrList &sl);
+static void substEnvVarsInString(QCString &s);
+
+static bool isAbsolute(const char * fileName)
+{
+# ifdef _WIN32
+ if (isalpha (fileName [0]) && fileName[1] == ':')
+ fileName += 2;
+# endif
+ char const fst = fileName [0];
+ if (fst == '/') {
+ return true;
+ }
+# ifdef _WIN32
+ if (fst == '\\')
+ return true;
+# endif
+ return false;
+}
+
+static FILE *findFile(const char *fileName)
+{
+ if(isAbsolute(fileName))
+ return tryPath(NULL, fileName);
+ substEnvVarsInStrList(includePathList);
+ char *s=includePathList.first();
+ while (s) // try each of the include paths
+ {
+ FILE *f = tryPath(s,fileName);
+ if (f) return f;
+ s=includePathList.next();
+ }
+ // try cwd if includePathList fails
+ return tryPath(".",fileName);
+}
+
+static void readIncludeFile(const char *incName)
+{
+ if (includeDepth==MAX_INCLUDE_DEPTH) {
+ config_err("error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
+ MAX_INCLUDE_DEPTH,incName);
+ exit(1);
+ }
+
+ QCString inc = incName;
+ substEnvVarsInString(inc);
+ inc = inc.stripWhiteSpace();
+ uint incLen = inc.length();
+ if (inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
+ {
+ inc=inc.mid(1,incLen-2);
+ }
+
+ FILE *f;
+
+ if ((f=findFile(inc))) // see if the include file can be found
+ {
+ // For debugging
+#if SHOW_INCLUDES
+ for (i=0;i<includeStack.count();i++) msg(" ");
+ msg("@INCLUDE = %s: parsing...\n",inc.data());
+#endif
+
+ // store the state of the old file
+ ConfigFileState *fs=new ConfigFileState;
+ fs->oldState=YY_CURRENT_BUFFER;
+ fs->lineNr=yyLineNr;
+ fs->fileName=yyFileName;
+ fs->filePtr=f;
+ // push the state on the stack
+ includeStack.push(fs);
+ // set the scanner to the include file
+ configYY_switch_to_buffer(configYY_create_buffer(f,YY_BUF_SIZE));
+ fs->newState=YY_CURRENT_BUFFER;
+ yyFileName=inc;
+ includeDepth++;
+ }
+ else
+ {
+ config_err("error: @INCLUDE = %s: not found!\n",inc.data());
+ exit(1);
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+#line 1199 "<stdout>"
+
+#define INITIAL 0
+#define Start 1
+#define SkipComment 2
+#define SkipInvalid 3
+#define GetString 4
+#define GetBool 5
+#define GetStrList 6
+#define GetQuotedString 7
+#define GetEnvVar 8
+#define Include 9
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int configYYlex_destroy (void );
+
+int configYYget_debug (void );
+
+void configYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE configYYget_extra (void );
+
+void configYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *configYYget_in (void );
+
+void configYYset_in (FILE * in_str );
+
+FILE *configYYget_out (void );
+
+void configYYset_out (FILE * out_str );
+
+yy_size_t configYYget_leng (void );
+
+char *configYYget_text (void );
+
+int configYYget_lineno (void );
+
+void configYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int configYYwrap (void );
+#else
+extern int configYYwrap (void );
+#endif
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( configYYtext, configYYleng, 1, configYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( configYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( configYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, configYYin))==0 && ferror(configYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(configYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int configYYlex (void);
+
+#define YY_DECL int configYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after configYYtext and configYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 606 "config.l"
+
+
+#line 1391 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! configYYin )
+ configYYin = stdin;
+
+ if ( ! configYYout )
+ configYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ configYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ configYY_create_buffer(configYYin,YY_BUF_SIZE );
+ }
+
+ configYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of configYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 100 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 408 );
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+ if ( yy_act == 0 )
+ { /* have to back up */
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ yy_act = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 608 "config.l"
+
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 609 "config.l"
+{ BEGIN(SkipComment); }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 610 "config.l"
+{ QCString cmd=configYYtext;
+ cmd=cmd.left(cmd.length()-1).stripWhiteSpace();
+ ConfigOption *option = config->get(cmd);
+ if (option==0) // oops not known
+ {
+ config_err("warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+ configYYtext,yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ }
+ else // known tag
+ {
+ option->setEncoding(encoding);
+ switch(option->kind())
+ {
+ case ConfigOption::O_Info:
+ // shouldn't get here!
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_List:
+ l = ((ConfigList *)option)->valueRef();
+ l->clear();
+ elemStr="";
+ BEGIN(GetStrList);
+ break;
+ case ConfigOption::O_Enum:
+ s = ((ConfigEnum *)option)->valueRef();
+ s->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_String:
+ s = ((ConfigString *)option)->valueRef();
+ s->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_Int:
+ s = ((ConfigInt *)option)->valueStringRef();
+ s->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_Bool:
+ s = ((ConfigBool *)option)->valueStringRef();
+ s->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_Obsolete:
+ config_err("warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+ "To avoid this warning please update your configuration "
+ "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
+ }
+ }
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 663 "config.l"
+{ QCString cmd=configYYtext;
+ cmd=cmd.left(cmd.length()-2).stripWhiteSpace();
+ ConfigOption *option = config->get(cmd);
+ if (option==0) // oops not known
+ {
+ config_err("warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+ configYYtext,yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ }
+ else // known tag
+ {
+ switch(option->kind())
+ {
+ case ConfigOption::O_Info:
+ // shouldn't get here!
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_List:
+ l = ((ConfigList *)option)->valueRef();
+ elemStr="";
+ BEGIN(GetStrList);
+ break;
+ case ConfigOption::O_Enum:
+ case ConfigOption::O_String:
+ case ConfigOption::O_Int:
+ case ConfigOption::O_Bool:
+ config_err("warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
+ configYYtext,yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_Obsolete:
+ config_err("warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+ "To avoid this warning please update your configuration "
+ "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
+ }
+ }
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 702 "config.l"
+{ BEGIN(GetStrList); l=&includePathList; l->clear(); elemStr=""; }
+ YY_BREAK
+/* include a config file */
+case 6:
+YY_RULE_SETUP
+#line 704 "config.l"
+{ BEGIN(Include);}
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 705 "config.l"
+{
+ readIncludeFile(configStringRecode(configYYtext,encoding,"UTF-8"));
+ BEGIN(Start);
+ }
+ YY_BREAK
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(Start):
+case YY_STATE_EOF(SkipComment):
+case YY_STATE_EOF(SkipInvalid):
+case YY_STATE_EOF(GetString):
+case YY_STATE_EOF(GetBool):
+case YY_STATE_EOF(GetStrList):
+case YY_STATE_EOF(GetQuotedString):
+case YY_STATE_EOF(GetEnvVar):
+case YY_STATE_EOF(Include):
+#line 709 "config.l"
+{
+ //printf("End of include file\n");
+ //printf("Include stack depth=%d\n",g_includeStack.count());
+ if (includeStack.isEmpty())
+ {
+ //printf("Terminating scanner!\n");
+ yyterminate();
+ }
+ else
+ {
+ ConfigFileState *fs=includeStack.pop();
+ fclose(fs->filePtr);
+ YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
+ configYY_switch_to_buffer(fs->oldState );
+ configYY_delete_buffer(oldBuf );
+ yyLineNr=fs->lineNr;
+ yyFileName=fs->fileName;
+ delete fs; fs=0;
+ includeDepth--;
+ }
+ }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 731 "config.l"
+{ config_err("warning: ignoring unknown tag `%s' at line %d, file %s\n",configYYtext,yyLineNr,yyFileName.data()); }
+ YY_BREAK
+case 9:
+/* rule 9 can match eol */
+YY_RULE_SETUP
+#line 732 "config.l"
+{ yyLineNr++; BEGIN(Start); }
+ YY_BREAK
+case 10:
+/* rule 10 can match eol */
+YY_RULE_SETUP
+#line 733 "config.l"
+{
+ yyLineNr++;
+ if (!elemStr.isEmpty())
+ {
+ //printf("elemStr1=`%s'\n",elemStr.data());
+ l->append(elemStr);
+ }
+ BEGIN(Start);
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 742 "config.l"
+{
+ if (!elemStr.isEmpty())
+ {
+ //printf("elemStr2=`%s'\n",elemStr.data());
+ l->append(elemStr);
+ }
+ elemStr.resize(0);
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 750 "config.l"
+{ (*s)+=configStringRecode(configYYtext,encoding,"UTF-8");
+ checkEncoding();
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 753 "config.l"
+{ lastState=YY_START;
+ BEGIN(GetQuotedString);
+ tmpString.resize(0);
+ }
+ YY_BREAK
+case 14:
+/* rule 14 can match eol */
+YY_RULE_SETUP
+#line 757 "config.l"
+{
+ // we add a bogus space to signal that the string was quoted. This space will be stripped later on.
+ tmpString+=" ";
+ //printf("Quoted String = `%s'\n",tmpString.data());
+ if (lastState==GetString)
+ {
+ (*s)+=configStringRecode(tmpString,encoding,"UTF-8");
+ checkEncoding();
+ }
+ else
+ {
+ elemStr+=configStringRecode(tmpString,encoding,"UTF-8");
+ }
+ if (*configYYtext=='\n')
+ {
+ config_err("warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
+ yyLineNr++;
+ }
+ BEGIN(lastState);
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 777 "config.l"
+{
+ tmpString+='"';
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 780 "config.l"
+{ tmpString+=*configYYtext; }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 781 "config.l"
+{
+ QCString bs=configYYtext;
+ bs=bs.upper();
+ if (bs=="YES" || bs=="1")
+ *b=TRUE;
+ else if (bs=="NO" || bs=="0")
+ *b=FALSE;
+ else
+ {
+ *b=FALSE;
+ config_warn("warning: Invalid value `%s' for "
+ "boolean tag in line %d, file %s; use YES or NO\n",
+ bs.data(),yyLineNr,yyFileName.data());
+ }
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 796 "config.l"
+{
+ elemStr+=configStringRecode(configYYtext,encoding,"UTF-8");
+ }
+ YY_BREAK
+case 19:
+/* rule 19 can match eol */
+YY_RULE_SETUP
+#line 799 "config.l"
+{ yyLineNr++; BEGIN(Start); }
+ YY_BREAK
+case 20:
+/* rule 20 can match eol */
+YY_RULE_SETUP
+#line 800 "config.l"
+{ yyLineNr++; BEGIN(Start); }
+ YY_BREAK
+case 21:
+/* rule 21 can match eol */
+YY_RULE_SETUP
+#line 801 "config.l"
+{ yyLineNr++; }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 802 "config.l"
+
+ YY_BREAK
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+#line 803 "config.l"
+{ yyLineNr++ ; }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 805 "config.l"
+ECHO;
+ YY_BREAK
+#line 1785 "<stdout>"
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed configYYin at a new source and called
+ * configYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = configYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( configYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * configYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of configYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ yy_size_t new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ configYYrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ configYYrestart(configYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) configYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 28);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 100 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+ register char *yy_cp = (yy_c_buf_p);
+
+ register YY_CHAR yy_c = 28;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 100 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 99);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ configYYrestart(configYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( configYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve configYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void configYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ configYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ configYY_create_buffer(configYYin,YY_BUF_SIZE );
+ }
+
+ configYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ configYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void configYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * configYYpop_buffer_state();
+ * configYYpush_buffer_state(new_buffer);
+ */
+ configYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ configYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (configYYwrap()) processing, but the only time this flag
+ * is looked at is after configYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void configYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ configYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE configYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) configYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in configYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) configYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in configYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ configYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with configYY_create_buffer()
+ *
+ */
+ void configYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ configYYfree((void *) b->yy_ch_buf );
+
+ configYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a configYYrestart() or at EOF.
+ */
+ static void configYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ configYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then configYY_init_buffer was _probably_
+ * called from configYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void configYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ configYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void configYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ configYYensure_buffer_stack();
+
+ /* This block is copied from configYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from configYY_switch_to_buffer. */
+ configYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void configYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ configYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ configYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void configYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)configYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in configYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)configYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in configYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE configYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) configYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in configYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ configYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to configYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * configYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE configYY_scan_string (yyconst char * yystr )
+{
+
+ return configYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to configYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE configYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) configYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in configYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = configYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in configYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up configYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ configYYtext[configYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = configYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ configYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int configYYget_lineno (void)
+{
+
+ return configYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *configYYget_in (void)
+{
+ return configYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *configYYget_out (void)
+{
+ return configYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t configYYget_leng (void)
+{
+ return configYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *configYYget_text (void)
+{
+ return configYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void configYYset_lineno (int line_number )
+{
+
+ configYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see configYY_switch_to_buffer
+ */
+void configYYset_in (FILE * in_str )
+{
+ configYYin = in_str ;
+}
+
+void configYYset_out (FILE * out_str )
+{
+ configYYout = out_str ;
+}
+
+int configYYget_debug (void)
+{
+ return configYY_flex_debug;
+}
+
+void configYYset_debug (int bdebug )
+{
+ configYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from configYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ configYYin = stdin;
+ configYYout = stdout;
+#else
+ configYYin = (FILE *) 0;
+ configYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * configYYlex_init()
+ */
+ return 0;
+}
+
+/* configYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int configYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ configYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ configYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ configYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * configYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *configYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *configYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void configYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see configYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 805 "config.l"
+
+
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
+{
+ t << "# Doxyfile " << versionString << endl << endl;
+ if (!sl)
+ {
+ t << "# This file describes the settings to be used by the documentation system\n";
+ t << "# doxygen (www.doxygen.org) for a project.\n";
+ t << "#\n";
+ t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
+ t << "# The format is:\n";
+ t << "# TAG = value [value, ...]\n";
+ t << "# For lists items can also be appended using:\n";
+ t << "# TAG += value [value, ...]\n";
+ t << "# Values that contain spaces should be placed between quotes (\" \").\n";
+ }
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ option->writeTemplate(t,sl,upd);
+ option = m_options->next();
+ }
+}
+
+void Config::writeXML(FTextStream &t)
+{
+ t << "<doxygenconfig>" << endl;
+ bool first=TRUE;
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ if (option->kind()==ConfigOption::O_Info)
+ {
+ if (!first) t << " </group>" << endl;
+ t << " <group name='" << option->name() << "' "
+ "docs='" << option->docs() << "'>" << endl;
+ first=FALSE;
+ }
+ else
+ {
+ option->writeXML(t);
+ }
+ option = m_options->next();
+ }
+ option = m_obsolete->first();
+ while (option)
+ {
+ option->writeXML(t);
+ option = m_obsolete->next();
+ }
+ if (!first) t << " </group>" << endl;
+ t << "</doxygenconfig>" << endl;
+}
+
+void Config::convertStrToVal()
+{
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ option->convertStrToVal();
+ option = m_options->next();
+ }
+}
+
+static void substEnvVarsInString(QCString &s)
+{
+ static QRegExp re("\\$\\([a-z_A-Z0-9]+\\)");
+ if (s.isEmpty()) return;
+ int p=0;
+ int i,l;
+ //printf("substEnvVarInString(%s) start\n",s.data());
+ while ((i=re.match(s,p,&l))!=-1)
+ {
+ //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).data());
+ QCString env=portable_getenv(s.mid(i+2,l-3));
+ substEnvVarsInString(env); // recursively expand variables if needed.
+ s = s.left(i)+env+s.right(s.length()-i-l);
+ p=i+env.length(); // next time start at the end of the expanded string
+ }
+ s=s.stripWhiteSpace(); // to strip the bogus space that was added when an argument
+ // has quotes
+ //printf("substEnvVarInString(%s) end\n",s.data());
+}
+
+static void substEnvVarsInStrList(QStrList &sl)
+{
+ char *s = sl.first();
+ while (s)
+ {
+ QCString result(s);
+ // an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
+ bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
+ // here we strip the quote again
+ substEnvVarsInString(result);
+
+ //printf("Result %s was quoted=%d\n",result.data(),wasQuoted);
+
+ if (!wasQuoted) /* as a result of the expansion, a single string
+ may have expanded into a list, which we'll
+ add to sl. If the orginal string already
+ contained multiple elements no further
+ splitting is done to allow quoted items with spaces! */
+ {
+ int l=result.length();
+ int i,p=0;
+ // skip spaces
+ // search for a "word"
+ for (i=0;i<l;i++)
+ {
+ char c=0;
+ // skip until start of new word
+ while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
+ p=i; // p marks the start index of the word
+ // skip until end of a word
+ while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
+ if (i<l) // not at the end of the string
+ {
+ if (c=='"') // word within quotes
+ {
+ p=i+1;
+ for (i++;i<l;i++)
+ {
+ c=result.at(i);
+ if (c=='"') // end quote
+ {
+ // replace the string in the list and go to the next item.
+ sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
+ sl.next(); // current item is now the old item
+ p=i+1;
+ break;
+ }
+ else if (c=='\\') // skip escaped stuff
+ {
+ i++;
+ }
+ }
+ }
+ else if (c==' ' || c=='\t') // separator
+ {
+ // replace the string in the list and go to the next item.
+ sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
+ sl.next(); // current item is now the old item
+ p=i+1;
+ }
+ }
+ }
+ if (p!=l) // add the leftover as a string
+ {
+ // replace the string in the list and go to the next item.
+ sl.insert(sl.at(),result.right(l-p)); // insert new item before current item.
+ sl.next(); // current item is now the old item
+ }
+ }
+ else // just goto the next element in the list
+ {
+ sl.insert(sl.at(),result);
+ sl.next();
+ }
+ // remove the old unexpanded string from the list
+ int i=sl.at();
+ sl.remove(); // current item index changes if the last element is removed.
+ if (sl.at()==i) // not last item
+ s = sl.current();
+ else // just removed last item
+ s = 0;
+ }
+}
+
+void ConfigString::substEnvVars()
+{
+ substEnvVarsInString(m_value);
+}
+
+void ConfigList::substEnvVars()
+{
+ substEnvVarsInStrList(m_value);
+}
+
+void ConfigBool::substEnvVars()
+{
+ substEnvVarsInString(m_valueString);
+}
+
+void ConfigInt::substEnvVars()
+{
+ substEnvVarsInString(m_valueString);
+}
+
+void ConfigEnum::substEnvVars()
+{
+ substEnvVarsInString(m_value);
+}
+
+void Config::substituteEnvironmentVars()
+{
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ option->substEnvVars();
+ option = m_options->next();
+ }
+}
+
+static void cleanUpPaths(QStrList &str)
+{
+ char *sfp = str.first();
+ while (sfp)
+ {
+ register char *p = sfp;
+ if (p)
+ {
+ char c;
+ while ((c=*p))
+ {
+ if (c=='\\') *p='/';
+ p++;
+ }
+ }
+ QCString path = sfp;
+ if ((path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':')) ||
+ path.at(path.length()-1)!='/'
+ )
+ {
+ QFileInfo fi(path);
+ if (fi.exists() && fi.isDir())
+ {
+ int i = str.at();
+ str.remove();
+ if (str.at()==i) // did not remove last item
+ str.insert(i,fi.absFilePath()+"/");
+ else
+ str.append(fi.absFilePath()+"/");
+ }
+ }
+ sfp = str.next();
+ }
+}
+
+void Config::check()
+{
+ //if (!projectName.isEmpty())
+ //{
+ // projectName[0]=toupper(projectName[0]);
+ //}
+
+ QCString &warnFormat = Config_getString("WARN_FORMAT");
+ if (warnFormat.stripWhiteSpace().isEmpty())
+ {
+ warnFormat="$file:$line $text";
+ }
+ else
+ {
+ if (warnFormat.find("$file")==-1)
+ {
+ config_err("warning: warning format does not contain a $file tag!\n");
+ }
+ if (warnFormat.find("$line")==-1)
+ {
+ config_err("warning: warning format does not contain a $line tag!\n");
+ }
+ if (warnFormat.find("$text")==-1)
+ {
+ config_err("warning: warning format foes not contain a $text tag!\n");
+ }
+ }
+
+ QCString &manExtension = Config_getString("MAN_EXTENSION");
+
+ // set default man page extension if non is given by the user
+ if (manExtension.isEmpty())
+ {
+ manExtension=".3";
+ }
+
+ QCString &paperType = Config_getEnum("PAPER_TYPE");
+ paperType=paperType.lower().stripWhiteSpace();
+ if (paperType.isEmpty())
+ {
+ paperType = "a4";
+ }
+ if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" &&
+ paperType!="legal" && paperType!="executive")
+ {
+ config_err("error: Unknown page type specified");
+ }
+
+ QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
+ outputLanguage=outputLanguage.stripWhiteSpace();
+ if (outputLanguage.isEmpty())
+ {
+ outputLanguage = "English";
+ }
+
+ QCString &htmlFileExtension=Config_getString("HTML_FILE_EXTENSION");
+ htmlFileExtension=htmlFileExtension.stripWhiteSpace();
+ if (htmlFileExtension.isEmpty())
+ {
+ htmlFileExtension = ".html";
+ }
+
+ // expand the relative stripFromPath values
+ QStrList &stripFromPath = Config_getList("STRIP_FROM_PATH");
+ char *sfp = stripFromPath.first();
+ if (sfp==0) // by default use the current path
+ {
+ stripFromPath.append(QDir::currentDirPath()+"/");
+ }
+ else
+ {
+ cleanUpPaths(stripFromPath);
+ }
+
+ // expand the relative stripFromPath values
+ QStrList &stripFromIncPath = Config_getList("STRIP_FROM_INC_PATH");
+ cleanUpPaths(stripFromIncPath);
+
+ // Test to see if HTML header is valid
+ QCString &headerFile = Config_getString("HTML_HEADER");
+ if (!headerFile.isEmpty())
+ {
+ QFileInfo fi(headerFile);
+ if (!fi.exists())
+ {
+ config_err("error: tag HTML_HEADER: header file `%s' "
+ "does not exist\n",headerFile.data());
+ exit(1);
+ }
+ }
+ // Test to see if HTML footer is valid
+ QCString &footerFile = Config_getString("HTML_FOOTER");
+ if (!footerFile.isEmpty())
+ {
+ QFileInfo fi(footerFile);
+ if (!fi.exists())
+ {
+ config_err("error: tag HTML_FOOTER: footer file `%s' "
+ "does not exist\n",footerFile.data());
+ exit(1);
+ }
+ }
+ // Test to see if LaTeX header is valid
+ QCString &latexHeaderFile = Config_getString("LATEX_HEADER");
+ if (!latexHeaderFile.isEmpty())
+ {
+ QFileInfo fi(latexHeaderFile);
+ if (!fi.exists())
+ {
+ config_err("error: tag LATEX_HEADER: header file `%s' "
+ "does not exist\n",latexHeaderFile.data());
+ exit(1);
+ }
+ }
+ // check include path
+ QStrList &includePath = Config_getList("INCLUDE_PATH");
+ char *s=includePath.first();
+ while (s)
+ {
+ QFileInfo fi(s);
+ if (!fi.exists()) config_err("warning: tag INCLUDE_PATH: include path `%s' "
+ "does not exist\n",s);
+ s=includePath.next();
+ }
+
+ // check aliases
+ QStrList &aliasList = Config_getList("ALIASES");
+ s=aliasList.first();
+ while (s)
+ {
+ QRegExp re1("[a-z_A-Z][a-z_A-Z0-9]*[ \t]*="); // alias without argument
+ QRegExp re2("[a-z_A-Z][a-z_A-Z0-9]*{[0-9]*}[ \t]*="); // alias with argument
+ QCString alias=s;
+ alias=alias.stripWhiteSpace();
+ if (alias.find(re1)!=0 && alias.find(re2)!=0)
+ {
+ config_err("Illegal alias format `%s'. Use \"name=value\" or \"name(n)=value\", where n is the number of arguments\n",
+ alias.data());
+ }
+ s=aliasList.next();
+ }
+
+ // check if GENERATE_TREEVIEW and GENERATE_HTMLHELP are both enabled
+ if (Config_getBool("GENERATE_TREEVIEW") && Config_getBool("GENERATE_HTMLHELP"))
+ {
+ config_err("When enabling GENERATE_HTMLHELP the tree view (GENERATE_TREEVIEW) should be disabled. I'll do it for you.\n");
+ Config_getBool("GENERATE_TREEVIEW")=FALSE;
+ }
+ if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTMLHELP"))
+ {
+ config_err("When enabling GENERATE_HTMLHELP the search engine (SEARCHENGINE) should be disabled. I'll do it for you.\n");
+ Config_getBool("SEARCHENGINE")=FALSE;
+ }
+
+ // check if SEPARATE_MEMBER_PAGES and INLINE_GROUPED_CLASSES are both enabled
+ if (Config_getBool("SEPARATE_MEMBER_PAGES") && Config_getBool("INLINE_GROUPED_CLASSES"))
+ {
+ config_err("When enabling INLINE_GROUPED_CLASSES the SEPARATE_MEMBER_PAGES option should be disabled. I'll do it for you.\n");
+ Config_getBool("SEPARATE_MEMBER_PAGES")=FALSE;
+ }
+
+ // check dot image format
+ QCString &dotImageFormat=Config_getEnum("DOT_IMAGE_FORMAT");
+ dotImageFormat=dotImageFormat.stripWhiteSpace();
+ if (dotImageFormat.isEmpty())
+ {
+ dotImageFormat = "png";
+ }
+ //else if (dotImageFormat!="gif" && dotImageFormat!="png" && dotImageFormat!="jpg")
+ //{
+ // config_err("Invalid value for DOT_IMAGE_FORMAT: `%s'. Using the default.\n",dotImageFormat.data());
+ // dotImageFormat = "png";
+ //}
+
+
+ // check dot path
+ QCString &dotPath = Config_getString("DOT_PATH");
+ if (!dotPath.isEmpty())
+ {
+ QFileInfo dp(dotPath+"/dot"+portable_commandExtension());
+ if (!dp.exists() || !dp.isFile())
+ {
+ config_err("warning: the dot tool could not be found at %s\n",dotPath.data());
+ dotPath="";
+ }
+ else
+ {
+ dotPath=dp.dirPath(TRUE)+"/";
+#if defined(_WIN32) // convert slashes
+ uint i=0,l=dotPath.length();
+ for (i=0;i<l;i++) if (dotPath.at(i)=='/') dotPath.at(i)='\\';
+#endif
+ }
+ }
+ else // make sure the string is empty but not null!
+ {
+ dotPath="";
+ }
+
+ // check mscgen path
+ QCString &mscgenPath = Config_getString("MSCGEN_PATH");
+ if (!mscgenPath.isEmpty())
+ {
+ QFileInfo dp(mscgenPath+"/mscgen"+portable_commandExtension());
+ if (!dp.exists() || !dp.isFile())
+ {
+ config_err("warning: the mscgen tool could not be found at %s\n",mscgenPath.data());
+ mscgenPath="";
+ }
+ else
+ {
+ mscgenPath=dp.dirPath(TRUE)+"/";
+#if defined(_WIN32) // convert slashes
+ uint i=0,l=mscgenPath.length();
+ for (i=0;i<l;i++) if (mscgenPath.at(i)=='/') mscgenPath.at(i)='\\';
+#endif
+ }
+ }
+ else // make sure the string is empty but not null!
+ {
+ mscgenPath="";
+ }
+
+
+ // check input
+ QStrList &inputSources=Config_getList("INPUT");
+ if (inputSources.count()==0)
+ {
+ // use current dir as the default
+ inputSources.append(QDir::currentDirPath());
+ }
+ else
+ {
+ s=inputSources.first();
+ while (s)
+ {
+ QFileInfo fi(s);
+ if (!fi.exists())
+ {
+ config_err("warning: tag INPUT: input source `%s' does not exist\n",s);
+ }
+ s=inputSources.next();
+ }
+ }
+
+ // add default pattern if needed
+ QStrList &filePatternList = Config_getList("FILE_PATTERNS");
+ if (filePatternList.isEmpty())
+ {
+ filePatternList.append("*.c");
+ filePatternList.append("*.cc");
+ filePatternList.append("*.cxx");
+ filePatternList.append("*.cpp");
+ filePatternList.append("*.c++");
+ filePatternList.append("*.d");
+ filePatternList.append("*.java");
+ filePatternList.append("*.ii");
+ filePatternList.append("*.ixx");
+ filePatternList.append("*.ipp");
+ filePatternList.append("*.i++");
+ filePatternList.append("*.inl");
+ filePatternList.append("*.h");
+ filePatternList.append("*.hh");
+ filePatternList.append("*.hxx");
+ filePatternList.append("*.hpp");
+ filePatternList.append("*.h++");
+ filePatternList.append("*.idl");
+ filePatternList.append("*.odl");
+ filePatternList.append("*.cs");
+ filePatternList.append("*.php");
+ filePatternList.append("*.php3");
+ filePatternList.append("*.inc");
+ filePatternList.append("*.m");
+ filePatternList.append("*.mm");
+ filePatternList.append("*.dox");
+ filePatternList.append("*.py");
+ filePatternList.append("*.f90");
+ filePatternList.append("*.f");
+ filePatternList.append("*.for");
+ filePatternList.append("*.vhd");
+ filePatternList.append("*.vhdl");
+ if (portable_fileSystemIsCaseSensitive())
+ {
+ // unix => case sensitive match => also include useful uppercase versions
+ filePatternList.append("*.C");
+ filePatternList.append("*.CC");
+ filePatternList.append("*.C++");
+ filePatternList.append("*.II");
+ filePatternList.append("*.I++");
+ filePatternList.append("*.H");
+ filePatternList.append("*.HH");
+ filePatternList.append("*.H++");
+ filePatternList.append("*.CS");
+ filePatternList.append("*.PHP");
+ filePatternList.append("*.PHP3");
+ filePatternList.append("*.M");
+ filePatternList.append("*.MM");
+ filePatternList.append("*.PY");
+ filePatternList.append("*.F90");
+ filePatternList.append("*.F");
+ filePatternList.append("*.VHD");
+ filePatternList.append("*.VHDL");
+ }
+ }
+
+ // add default pattern if needed
+ QStrList &examplePatternList = Config_getList("EXAMPLE_PATTERNS");
+ if (examplePatternList.isEmpty())
+ {
+ examplePatternList.append("*");
+ }
+
+ // if no output format is enabled, warn the user
+ if (!Config_getBool("GENERATE_HTML") &&
+ !Config_getBool("GENERATE_LATEX") &&
+ !Config_getBool("GENERATE_MAN") &&
+ !Config_getBool("GENERATE_RTF") &&
+ !Config_getBool("GENERATE_XML") &&
+ !Config_getBool("GENERATE_PERLMOD") &&
+ !Config_getBool("GENERATE_RTF") &&
+ !Config_getBool("GENERATE_AUTOGEN_DEF") &&
+ Config_getString("GENERATE_TAGFILE").isEmpty()
+ )
+ {
+ config_err("warning: No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
+ }
+
+ // check HTMLHELP creation requirements
+ if (!Config_getBool("GENERATE_HTML") &&
+ Config_getBool("GENERATE_HTMLHELP"))
+ {
+ config_err("warning: GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
+ }
+
+ // check QHP creation requirements
+ if (Config_getBool("GENERATE_QHP"))
+ {
+ if (Config_getString("QHP_NAMESPACE").isEmpty())
+ {
+ config_err("error: GENERATE_QHP=YES requires QHP_NAMESPACE to be set. Using 'org.doxygen.doc' as default!.\n");
+ Config_getString("QHP_NAMESPACE")="org.doxygen.doc";
+ }
+
+ if (Config_getString("QHP_VIRTUAL_FOLDER").isEmpty())
+ {
+ config_err("error: GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set. Using 'doc' as default!\n");
+ Config_getString("QHP_VIRTUAL_FOLDER")="doc";
+ }
+ }
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA") && Config_getBool("INLINE_INFO"))
+ {
+ // don't show inline info for Java output, since Java has no inline
+ // concept.
+ Config_getBool("INLINE_INFO")=FALSE;
+ }
+
+ int &depth = Config_getInt("MAX_DOT_GRAPH_DEPTH");
+ if (depth==0)
+ {
+ depth=1000;
+ }
+
+ int &hue = Config_getInt("HTML_COLORSTYLE_HUE");
+ if (hue<0)
+ {
+ hue=0;
+ }
+ else if (hue>=360)
+ {
+ hue=hue%360;
+ }
+
+ int &sat = Config_getInt("HTML_COLORSTYLE_SAT");
+ if (sat<0)
+ {
+ sat=0;
+ }
+ else if (sat>255)
+ {
+ sat=255;
+ }
+ int &gamma = Config_getInt("HTML_COLORSTYLE_GAMMA");
+ if (gamma<40)
+ {
+ gamma=40;
+ }
+ else if (gamma>240)
+ {
+ gamma=240;
+ }
+
+
+ // add default words if needed
+ QStrList &annotationFromBrief = Config_getList("ABBREVIATE_BRIEF");
+ if (annotationFromBrief.isEmpty())
+ {
+ annotationFromBrief.append("The $name class");
+ annotationFromBrief.append("The $name widget");
+ annotationFromBrief.append("The $name file");
+ annotationFromBrief.append("is");
+ annotationFromBrief.append("provides");
+ annotationFromBrief.append("specifies");
+ annotationFromBrief.append("contains");
+ annotationFromBrief.append("represents");
+ annotationFromBrief.append("a");
+ annotationFromBrief.append("an");
+ annotationFromBrief.append("the");
+ }
+
+ // some default settings for vhdl
+ if (Config_getBool("OPTIMIZE_OUTPUT_VHDL") &&
+ (Config_getBool("INLINE_INHERITED_MEMB") ||
+ Config_getBool("INHERIT_DOCS") ||
+ !Config_getBool("HIDE_SCOPE_NAMES") ||
+ !Config_getBool("EXTRACT_PRIVATE")
+ )
+ )
+ {
+ bool b1 = Config_getBool("INLINE_INHERITED_MEMB");
+ bool b2 = Config_getBool("INHERIT_DOCS");
+ bool b3 = Config_getBool("HIDE_SCOPE_NAMES");
+ bool b4 = Config_getBool("EXTRACT_PRIVATE");
+ const char *s1,*s2,*s3,*s4;
+ if (b1) s1=" INLINDE_INHERITED_MEMB = NO (was YES)\n"; else s1="";
+ if (b2) s2=" INHERIT_DOCS = NO (was YES)\n"; else s2="";
+ if (!b3) s3=" HIDE_SCOPE_NAMES = YES (was NO)\n"; else s3="";
+ if (!b4) s4=" EXTRACT_PRIVATE = YES (was NO)\n"; else s4="";
+
+ config_err("warning: enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n"
+ "%s%s%s%s",s1,s2,s3,s4
+ );
+
+ Config_getBool("INLINE_INHERITED_MEMB") = FALSE;
+ Config_getBool("INHERIT_DOCS") = FALSE;
+ Config_getBool("HIDE_SCOPE_NAMES") = TRUE;
+ Config_getBool("EXTRACT_PRIVATE") = TRUE;
+ }
+
+}
+
+void Config::init()
+{
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ option->init();
+ option = m_options->next();
+ }
+}
+
+void Config::create()
+{
+ if (m_initialized) return;
+ m_initialized = TRUE;
+ addConfigOptions(this);
+}
+
+static QCString configFileToString(const char *name)
+{
+ if (name==0 || name[0]==0) return 0;
+ QFile f;
+
+ bool fileOpened=FALSE;
+ if (name[0]=='-' && name[1]==0) // read from stdin
+ {
+ fileOpened=f.open(IO_ReadOnly,stdin);
+ if (fileOpened)
+ {
+ const int bSize=4096;
+ QCString contents(bSize);
+ int totalSize=0;
+ int size;
+ while ((size=f.readBlock(contents.data()+totalSize,bSize))==bSize)
+ {
+ totalSize+=bSize;
+ contents.resize(totalSize+bSize);
+ }
+ totalSize+=size+2;
+ contents.resize(totalSize);
+ contents.at(totalSize-2)='\n'; // to help the scanner
+ contents.at(totalSize-1)='\0';
+ return contents;
+ }
+ }
+ else // read from file
+ {
+ QFileInfo fi(name);
+ if (!fi.exists() || !fi.isFile())
+ {
+ config_err("error: file `%s' not found\n",name);
+ return "";
+ }
+ f.setName(name);
+ fileOpened=f.open(IO_ReadOnly);
+ if (fileOpened)
+ {
+ int fsize=f.size();
+ QCString contents(fsize+2);
+ f.readBlock(contents.data(),fsize);
+ f.close();
+ if (fsize==0 || contents[fsize-1]=='\n')
+ contents[fsize]='\0';
+ else
+ contents[fsize]='\n'; // to help the scanner
+ contents[fsize+1]='\0';
+ return contents;
+ }
+ }
+ if (!fileOpened)
+ {
+ config_err("error: cannot open file `%s' for reading\n",name);
+ }
+ return "";
+}
+
+bool Config::parseString(const char *fn,const char *str)
+{
+ config = Config::instance();
+ inputString = str;
+ inputPosition = 0;
+ yyFileName = fn;
+ yyLineNr = 1;
+ includeStack.setAutoDelete(TRUE);
+ includeStack.clear();
+ includeDepth = 0;
+ configYYrestart( configYYin );
+ BEGIN( Start );
+ configYYlex();
+ inputString = 0;
+ return TRUE;
+}
+
+bool Config::parse(const char *fn)
+{
+ encoding = "UTF-8";
+ return parseString(fn,configFileToString(fn));
+}
+
+extern "C" { // some bogus code to keep the compiler happy
+ //int configYYwrap() { return 1 ; }
+}
+
diff --git a/src/config.h b/src/config.h
new file mode 100644
index 0000000..31f2d55
--- /dev/null
+++ b/src/config.h
@@ -0,0 +1,610 @@
+/******************************************************************************
+ *
+ * $Id: config.h,v 1.39 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "qtbc.h"
+#include <qstrlist.h>
+#include <qfile.h>
+#include <qdict.h>
+#include <qlist.h>
+#include "ftextstream.h"
+
+
+/*! \brief Abstract base class for any configuration option.
+ *
+ */
+class ConfigOption
+{
+ friend class Config;
+
+ public:
+
+ /*! The type of option */
+ enum OptionType
+ {
+ O_Info, //<! A section header
+ O_List, //<! A list of items
+ O_Enum, //<! A fixed set of items
+ O_String, //<! A single item
+ O_Int, //<! An integer value
+ O_Bool, //<! A boolean value
+ O_Obsolete //<! An obsolete option
+ };
+ enum
+ {
+ /*! Maximum length of an option in the config file. Used for
+ * alignment purposes.
+ */
+ MAX_OPTION_LENGTH = 23
+ };
+ ConfigOption(OptionType t) : m_kind(t)
+ {
+ m_spaces.fill(' ',40);
+ }
+ virtual ~ConfigOption()
+ {
+ }
+
+ /*! returns the kind of option this is. */
+ OptionType kind() const { return m_kind; }
+ QCString name() const { return m_name; }
+ QCString docs() const { return m_doc; }
+
+ QCString dependsOn() const { return m_dependency; }
+ void addDependency(const char *dep) { m_dependency = dep; }
+ void setEncoding(const QCString &e) { m_encoding = e; }
+
+ protected:
+ virtual void writeTemplate(FTextStream &t,bool sl,bool upd) = 0;
+ virtual void convertStrToVal() {}
+ virtual void substEnvVars() = 0;
+ virtual void writeXML(FTextStream&) {}
+ virtual void init() {}
+
+ QCString convertToComment(const QCString &s);
+ void writeBoolValue(FTextStream &t,bool v);
+ void writeIntValue(FTextStream &t,int i);
+ void writeStringValue(FTextStream &t,QCString &s);
+ void writeStringList(FTextStream &t,QStrList &l);
+
+ QCString m_spaces;
+ QCString m_name;
+ QCString m_doc;
+ QCString m_dependency;
+ QCString m_encoding;
+ OptionType m_kind;
+};
+
+/*! \brief Section marker for grouping the configuration options
+ *
+ */
+class ConfigInfo : public ConfigOption
+{
+ public:
+ ConfigInfo(const char *name,const char *doc)
+ : ConfigOption(O_Info)
+ {
+ m_name = name;
+ m_doc = doc;
+ }
+ void writeTemplate(FTextStream &t, bool sl,bool)
+ {
+ if (!sl)
+ {
+ t << "\n";
+ }
+ t << "#---------------------------------------------------------------------------\n";
+ t << "# " << m_doc << endl;
+ t << "#---------------------------------------------------------------------------\n";
+ }
+ void substEnvVars() {}
+};
+
+/*! \brief Option of the list type.
+ *
+ */
+class ConfigList : public ConfigOption
+{
+ public:
+ enum WidgetType { String, File, Dir, FileAndDir };
+ ConfigList(const char *name,const char *doc)
+ : ConfigOption(O_List)
+ {
+ m_name = name;
+ m_doc = doc;
+ m_widgetType = String;
+ }
+ void addValue(const char *v) { m_value.append(v); }
+ void setWidgetType(WidgetType w) { m_widgetType = w; }
+ WidgetType widgetType() const { return m_widgetType; }
+ QStrList *valueRef() { return &m_value; }
+ void writeTemplate(FTextStream &t,bool sl,bool)
+ {
+ if (!sl)
+ {
+ t << endl;
+ t << convertToComment(m_doc);
+ t << endl;
+ }
+ t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
+ writeStringList(t,m_value);
+ t << "\n";
+ }
+ void substEnvVars();
+ void writeXML(FTextStream&);
+ void init() { m_value.clear(); }
+ private:
+ QStrList m_value;
+ WidgetType m_widgetType;
+};
+
+/*! \brief Option of the enum type.
+ *
+ */
+class ConfigEnum : public ConfigOption
+{
+ public:
+ ConfigEnum(const char *name,const char *doc,const char *defVal)
+ : ConfigOption(O_Enum)
+ {
+ m_name = name;
+ m_doc = doc;
+ m_value = defVal;
+ m_defValue = defVal;
+ }
+ void addValue(const char *v) { m_valueRange.append(v); }
+ QStrListIterator iterator()
+ {
+ return QStrListIterator(m_valueRange);
+ }
+ QCString *valueRef() { return &m_value; }
+ void substEnvVars();
+ void writeTemplate(FTextStream &t,bool sl,bool)
+ {
+ if (!sl)
+ {
+ t << endl;
+ t << convertToComment(m_doc);
+ t << endl;
+ }
+ t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
+ writeStringValue(t,m_value);
+ t << "\n";
+ }
+ void writeXML(FTextStream&);
+ void init() { m_value = m_defValue.copy(); }
+
+ private:
+ QStrList m_valueRange;
+ QCString m_value;
+ QCString m_defValue;
+};
+
+/*! \brief Option of the string type.
+ *
+ */
+class ConfigString : public ConfigOption
+{
+ public:
+ enum WidgetType { String, File, Dir };
+ ConfigString(const char *name,const char *doc)
+ : ConfigOption(O_String)
+ {
+ m_name = name;
+ m_doc = doc;
+ m_widgetType = String;
+ }
+ ~ConfigString()
+ {
+ }
+ void setWidgetType(WidgetType w) { m_widgetType = w; }
+ WidgetType widgetType() const { return m_widgetType; }
+ void setDefaultValue(const char *v) { m_defValue = v; }
+ QCString *valueRef() { return &m_value; }
+ void writeTemplate(FTextStream &t,bool sl,bool)
+ {
+ if (!sl)
+ {
+ t << endl;
+ t << convertToComment(m_doc);
+ t << endl;
+ }
+ t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
+ writeStringValue(t,m_value);
+ t << "\n";
+ }
+ void substEnvVars();
+ void writeXML(FTextStream&);
+ void init() { m_value = m_defValue.copy(); }
+
+ private:
+ QCString m_value;
+ QCString m_defValue;
+ WidgetType m_widgetType;
+};
+
+/*! \brief Option of the integer type.
+ *
+ */
+class ConfigInt : public ConfigOption
+{
+ public:
+ ConfigInt(const char *name,const char *doc,int minVal,int maxVal,int defVal)
+ : ConfigOption(O_Int)
+ {
+ m_name = name;
+ m_doc = doc;
+ m_value = defVal;
+ m_defValue = defVal;
+ m_minVal = minVal;
+ m_maxVal = maxVal;
+ }
+ QCString *valueStringRef() { return &m_valueString; }
+ int *valueRef() { return &m_value; }
+ int minVal() const { return m_minVal; }
+ int maxVal() const { return m_maxVal; }
+ void convertStrToVal();
+ void substEnvVars();
+ void writeTemplate(FTextStream &t,bool sl,bool upd)
+ {
+ if (!sl)
+ {
+ t << endl;
+ t << convertToComment(m_doc);
+ t << endl;
+ }
+ t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
+ if (upd && !m_valueString.isEmpty())
+ {
+ writeStringValue(t,m_valueString);
+ }
+ else
+ {
+ writeIntValue(t,m_value);
+ }
+ t << "\n";
+ }
+ void writeXML(FTextStream&);
+ void init() { m_value = m_defValue; }
+ private:
+ int m_value;
+ int m_defValue;
+ int m_minVal;
+ int m_maxVal;
+ QCString m_valueString;
+};
+
+/*! \brief Option of the boolean type.
+ *
+ */
+class ConfigBool : public ConfigOption
+{
+ public:
+ ConfigBool(const char *name,const char *doc,bool defVal)
+ : ConfigOption(O_Bool)
+ {
+ m_name = name;
+ m_doc = doc;
+ m_value = defVal;
+ m_defValue = defVal;
+ }
+ QCString *valueStringRef() { return &m_valueString; }
+ bool *valueRef() { return &m_value; }
+ void convertStrToVal();
+ void substEnvVars();
+ void setValueString(const QCString &v) { m_valueString = v; }
+ void writeTemplate(FTextStream &t,bool sl,bool upd)
+ {
+ if (!sl)
+ {
+ t << endl;
+ t << convertToComment(m_doc);
+ t << endl;
+ }
+ t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
+ if (upd && !m_valueString.isEmpty())
+ {
+ writeStringValue(t,m_valueString);
+ }
+ else
+ {
+ writeBoolValue(t,m_value);
+ }
+ t << "\n";
+ }
+ void writeXML(FTextStream&);
+ void init() { m_value = m_defValue; }
+ private:
+ bool m_value;
+ bool m_defValue;
+ QCString m_valueString;
+};
+
+/*! \brief Section marker for obsolete options
+ *
+ */
+class ConfigObsolete : public ConfigOption
+{
+ public:
+ ConfigObsolete(const char *name,OptionType t) : ConfigOption(t)
+ { m_name = name; }
+ void writeTemplate(FTextStream &,bool,bool) {}
+ void substEnvVars() {}
+ void writeXML(FTextStream&);
+};
+
+
+// some convenience macros
+#define Config_getString(val) Config::instance()->getString(__FILE__,__LINE__,val)
+#define Config_getInt(val) Config::instance()->getInt(__FILE__,__LINE__,val)
+#define Config_getList(val) Config::instance()->getList(__FILE__,__LINE__,val)
+#define Config_getEnum(val) Config::instance()->getEnum(__FILE__,__LINE__,val)
+#define Config_getBool(val) Config::instance()->getBool(__FILE__,__LINE__,val)
+
+/*! \brief Singleton for configuration variables.
+ *
+ * This object holds the global static variables
+ * read from a user-supplied configuration file.
+ * The static member instance() can be used to get
+ * a pointer to the one and only instance.
+ *
+ * Set all variables to their default values by
+ * calling Config::instance()->init()
+ *
+ */
+class Config
+{
+ public:
+ /////////////////////////////
+ // public API
+ /////////////////////////////
+
+ /*! Returns the one and only instance of this class */
+ static Config *instance()
+ {
+ if (m_instance==0) m_instance = new Config;
+ return m_instance;
+ }
+ /*! Delete the instance */
+ static void deleteInstance()
+ {
+ delete m_instance;
+ m_instance=0;
+ }
+
+ /*! Returns an iterator that can by used to iterate over the
+ * configuration options.
+ */
+ QListIterator<ConfigOption> iterator()
+ {
+ return QListIterator<ConfigOption>(*m_options);
+ }
+
+ /*!
+ * @name Getting configuration values.
+ * @{
+ */
+
+ /*! Returns the value of the string option with name \a fileName.
+ * The arguments \a num and \a name are for debugging purposes only.
+ * There is a convenience function Config_getString() for this.
+ */
+ QCString &getString(const char *fileName,int num,const char *name) const;
+
+ /*! Returns the value of the list option with name \a fileName.
+ * The arguments \a num and \a name are for debugging purposes only.
+ * There is a convenience function Config_getList() for this.
+ */
+ QStrList &getList(const char *fileName,int num,const char *name) const;
+
+ /*! Returns the value of the enum option with name \a fileName.
+ * The arguments \a num and \a name are for debugging purposes only.
+ * There is a convenience function Config_getEnum() for this.
+ */
+ QCString &getEnum(const char *fileName,int num,const char *name) const;
+
+ /*! Returns the value of the integer option with name \a fileName.
+ * The arguments \a num and \a name are for debugging purposes only.
+ * There is a convenience function Config_getInt() for this.
+ */
+ int &getInt(const char *fileName,int num,const char *name) const;
+
+ /*! Returns the value of the boolean option with name \a fileName.
+ * The arguments \a num and \a name are for debugging purposes only.
+ * There is a convenience function Config_getBool() for this.
+ */
+ bool &getBool(const char *fileName,int num,const char *name) const;
+
+ /*! Returns the ConfigOption corresponding with \a name or 0 if
+ * the option is not supported.
+ */
+ ConfigOption *get(const char *name) const
+ {
+ return m_dict->find(name);
+ }
+ /* @} */
+
+ /*!
+ * @name Adding configuration options.
+ * @{
+ */
+
+ /*! Starts a new configuration section with \a name and description \a doc.
+ * \returns An object representing the option.
+ */
+ ConfigInfo *addInfo(const char *name,const char *doc)
+ {
+ ConfigInfo *result = new ConfigInfo(name,doc);
+ m_options->append(result);
+ return result;
+ }
+
+ /*! Adds a new string option with \a name and documentation \a doc.
+ * \returns An object representing the option.
+ */
+ ConfigString *addString(const char *name,
+ const char *doc)
+ {
+ ConfigString *result = new ConfigString(name,doc);
+ m_options->append(result);
+ m_dict->insert(name,result);
+ return result;
+ }
+
+ /*! Adds a new enumeration option with \a name and documentation \a doc
+ * and initial value \a defVal.
+ * \returns An object representing the option.
+ */
+ ConfigEnum *addEnum(const char *name,
+ const char *doc,
+ const char *defVal)
+ {
+ ConfigEnum *result = new ConfigEnum(name,doc,defVal);
+ m_options->append(result);
+ m_dict->insert(name,result);
+ return result;
+ }
+
+ /*! Adds a new string option with \a name and documentation \a doc.
+ * \returns An object representing the option.
+ */
+ ConfigList *addList(const char *name,
+ const char *doc)
+ {
+ ConfigList *result = new ConfigList(name,doc);
+ m_options->append(result);
+ m_dict->insert(name,result);
+ return result;
+ }
+
+ /*! Adds a new integer option with \a name and documentation \a doc.
+ * The integer has a range between \a minVal and \a maxVal and a
+ * default value of \a defVal.
+ * \returns An object representing the option.
+ */
+ ConfigInt *addInt(const char *name,
+ const char *doc,
+ int minVal,int maxVal,int defVal)
+ {
+ ConfigInt *result = new ConfigInt(name,doc,minVal,maxVal,defVal);
+ m_options->append(result);
+ m_dict->insert(name,result);
+ return result;
+ }
+
+ /*! Adds a new boolean option with \a name and documentation \a doc.
+ * The boolean has a default value of \a defVal.
+ * \returns An object representing the option.
+ */
+ ConfigBool *addBool(const char *name,
+ const char *doc,
+ bool defVal)
+ {
+ ConfigBool *result = new ConfigBool(name,doc,defVal);
+ m_options->append(result);
+ m_dict->insert(name,result);
+ return result;
+ }
+ /*! Adds an option that has become obsolete. */
+ ConfigOption *addObsolete(const char *name)
+ {
+ ConfigObsolete *option = new ConfigObsolete(name,ConfigOption::O_Obsolete);
+ m_dict->insert(name,option);
+ m_obsolete->append(option);
+ return option;
+ }
+ /*! @} */
+
+ /*! Writes a template configuration to stream \a t. If \a shortIndex
+ * is \c TRUE the description of each configuration option will
+ * be omitted.
+ */
+ void writeTemplate(FTextStream &t,bool shortIndex,bool updateOnly);
+
+ /** Write XML representation of the config file */
+ void writeXML(FTextStream &t);
+
+ /////////////////////////////
+ // internal API
+ /////////////////////////////
+
+ /*! Converts the string values read from the configuration file
+ * to real values for non-string type options (like int, and bools)
+ */
+ void convertStrToVal();
+
+ /*! Replaces references to environment variable by the actual value
+ * of the environment variable.
+ */
+ void substituteEnvironmentVars();
+
+ /*! Checks if the values of the variable are correct, adjusts them
+ * if needed, and report any errors.
+ */
+ void check();
+
+ /*! Initialize config variables to their default value */
+ void init();
+
+ /*! Parse a configuration data in string \a str.
+ * \returns TRUE if successful, or FALSE if the string could not be
+ * parsed.
+ */
+ bool parseString(const char *fn,const char *str);
+
+ /*! Parse a configuration file with name \a fn.
+ * \returns TRUE if successful, FALSE if the file could not be
+ * opened or read.
+ */
+ bool parse(const char *fn);
+
+ /*! Called from the constructor, will add doxygen's default options
+ * to the configuration object
+ */
+ void create();
+
+ protected:
+
+ Config()
+ {
+ m_options = new QList<ConfigOption>;
+ m_obsolete = new QList<ConfigOption>;
+ m_dict = new QDict<ConfigOption>(257);
+ m_options->setAutoDelete(TRUE);
+ m_obsolete->setAutoDelete(TRUE);
+ m_initialized = FALSE;
+ create();
+ }
+ ~Config()
+ {
+ delete m_options;
+ delete m_obsolete;
+ delete m_dict;
+ }
+
+ private:
+ QList<ConfigOption> *m_options;
+ QList<ConfigOption> *m_obsolete;
+ QDict<ConfigOption> *m_dict;
+ static Config *m_instance;
+ bool m_initialized;
+};
+
+#endif
diff --git a/src/config.l b/src/config.l
new file mode 100644
index 0000000..17e8a1d
--- /dev/null
+++ b/src/config.l
@@ -0,0 +1,1588 @@
+/******************************************************************************
+ *
+ * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+%{
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <errno.h>
+
+#include <qfileinfo.h>
+#include <qdir.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+#include <qstack.h>
+#include <qglobal.h>
+
+#include "config.h"
+#include "version.h"
+#include "portable.h"
+#include "util.h"
+
+#include "lang_cfg.h"
+#include "configoptions.h"
+
+#undef Config_getString
+#undef Config_getInt
+#undef Config_getList
+#undef Config_getEnum
+#undef Config_getBool
+
+// use in-class definitions
+#define Config_getString(val) getString(__FILE__,__LINE__,val)
+#define Config_getInt(val) getInt(__FILE__,__LINE__,val)
+#define Config_getList(val) getList(__FILE__,__LINE__,val)
+#define Config_getEnum(val) getEnum(__FILE__,__LINE__,val)
+#define Config_getBool(val) getBool(__FILE__,__LINE__,val)
+
+void config_err(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
+void config_warn(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
+
+static QCString configStringRecode(
+ const QCString &str,
+ const char *fromEncoding,
+ const char *toEncoding);
+
+#define MAX_INCLUDE_DEPTH 10
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ */
+QCString ConfigOption::convertToComment(const QCString &s)
+{
+ QCString result;
+ if (s.isEmpty()) return result;
+ else
+ {
+ QCString tmp=s.stripWhiteSpace();
+ char *p=tmp.data();
+ char c;
+ result+="#";
+ if (*p && *p!='\n')
+ result+=" ";
+ while ((c=*p++))
+ {
+ if (c=='\n')
+ {
+ result+="\n#";
+ if (*p && *p!='\n')
+ result+=" ";
+ }
+ else result+=c;
+ }
+ result+='\n';
+ }
+ return result;
+}
+
+void ConfigOption::writeBoolValue(FTextStream &t,bool v)
+{
+ t << " ";
+ if (v) t << "YES"; else t << "NO";
+}
+
+void ConfigOption::writeIntValue(FTextStream &t,int i)
+{
+ t << " " << i;
+}
+
+void ConfigOption::writeStringValue(FTextStream &t,QCString &s)
+{
+ char c;
+ bool needsEscaping=FALSE;
+ // convert the string back to it original encoding
+ QCString se = configStringRecode(s,"UTF-8",m_encoding);
+ const char *p=se.data();
+ if (p)
+ {
+ t << " ";
+ while ((c=*p++)!=0 && !needsEscaping)
+ needsEscaping = (c==' ' || c=='\n' || c=='\t' || c=='"' || c=='#');
+ if (needsEscaping)
+ {
+ t << "\"";
+ p=se.data();
+ while (*p)
+ {
+ if (*p==' ' && *(p+1)=='\0') break; // skip inserted space at the end
+ if (*p=='"') t << "\\"; // escape quotes
+ t << *p++;
+ }
+ t << "\"";
+ }
+ else
+ {
+ t << se;
+ }
+ }
+}
+
+void ConfigOption::writeStringList(FTextStream &t,QStrList &l)
+{
+ const char *p = l.first();
+ bool first=TRUE;
+ while (p)
+ {
+ QCString s=p;
+ if (!first)
+ t << " ";
+ first=FALSE;
+ writeStringValue(t,s);
+ p = l.next();
+ if (p) t << " \\" << endl;
+ }
+}
+
+/* -----------------------------------------------------------------
+ */
+
+Config *Config::m_instance = 0;
+
+void ConfigInt::convertStrToVal()
+{
+ if (!m_valueString.isEmpty())
+ {
+ bool ok;
+ int val = m_valueString.toInt(&ok);
+ if (!ok || val<m_minVal || val>m_maxVal)
+ {
+ config_warn("warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
+ "Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value);
+ }
+ m_value=val;
+ }
+}
+
+void ConfigBool::convertStrToVal()
+{
+ QCString val = m_valueString.stripWhiteSpace().lower();
+ if (!val.isEmpty())
+ {
+ if (val=="yes" || val=="true" || val=="1" || val=="all")
+ {
+ m_value=TRUE;
+ }
+ else if (val=="no" || val=="false" || val=="0" || val=="none")
+ {
+ m_value=FALSE;
+ }
+ else
+ {
+ config_warn("warning: argument `%s' for option %s is not a valid boolean value\n"
+ "Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO");
+ }
+ }
+}
+
+QCString &Config::getString(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_String)
+ {
+ config_err("%s<%d>: Internal error: Requested option %s not of string type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigString *)opt)->valueRef();
+}
+
+QStrList &Config::getList(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_List)
+ {
+ config_err("%d<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigList *)opt)->valueRef();
+}
+
+QCString &Config::getEnum(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_Enum)
+ {
+ config_err("%s<%d>: Internal error: Requested option %s not of enum type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigEnum *)opt)->valueRef();
+}
+
+int &Config::getInt(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_Int)
+ {
+ config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigInt *)opt)->valueRef();
+}
+
+bool &Config::getBool(const char *fileName,int num,const char *name) const
+{
+ ConfigOption *opt = m_dict->find(name);
+ if (opt==0)
+ {
+ config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
+ exit(1);
+ }
+ else if (opt->kind()!=ConfigOption::O_Bool)
+ {
+ config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
+ exit(1);
+ }
+ return *((ConfigBool *)opt)->valueRef();
+}
+
+/* -----------------------------------------------------------------
+ */
+
+void ConfigInt::writeXML(FTextStream& t)
+{
+ t << " <option type='int' "
+ "id='" << convertToXML(name()) << "' "
+ "docs='\n" << convertToXML(docs()) << "' "
+ "minval='" << m_minVal << "' "
+ "maxval='" << m_maxVal << "' "
+ "defval='" << m_defValue << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << "/>" << endl;
+}
+
+void ConfigBool::writeXML(FTextStream& t)
+{
+ t << " <option type='bool' "
+ "id='" << convertToXML(name()) << "' "
+ "docs='\n" << convertToXML(docs()) << "' "
+ "defval='" << m_defValue << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << "/>" << endl;
+}
+
+void ConfigString::writeXML(FTextStream& t)
+{
+ QString format;
+ switch (m_widgetType)
+ {
+ case String: format="string"; break;
+ case File: format="file"; break;
+ case Dir: format="dir"; break;
+ }
+ t << " <option type='string' "
+ "id='" << convertToXML(name()) << "' "
+ "format='" << format << "' "
+ "docs='\n" << convertToXML(docs()) << "' "
+ "defval='" << convertToXML(m_defValue) << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << "/>" << endl;
+}
+
+void ConfigEnum::writeXML(FTextStream &t)
+{
+ t << " <option type='enum' "
+ "id='" << convertToXML(name()) << "' "
+ "defval='" << convertToXML(m_defValue) << "' "
+ "docs='\n" << convertToXML(docs()) << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << ">" << endl;
+
+ char *enumVal = m_valueRange.first();
+ while (enumVal)
+ {
+ t << " <value name='" << convertToXML(enumVal) << "'/>" << endl;
+ enumVal = m_valueRange.next();
+ }
+
+ t << " </option>" << endl;
+}
+
+void ConfigList::writeXML(FTextStream &t)
+{
+ QString format;
+ switch (m_widgetType)
+ {
+ case String: format="string"; break;
+ case File: format="file"; break;
+ case Dir: format="dir"; break;
+ case FileAndDir: format="filedir"; break;
+ }
+ t << " <option type='list' "
+ "id='" << convertToXML(name()) << "' "
+ "format='" << format << "' "
+ "docs='\n" << convertToXML(docs()) << "'";
+ if (!m_dependency.isEmpty()) t << " depends='" << m_dependency << "'";
+ t << ">" << endl;
+ char *enumVal = m_value.first();
+ while (enumVal)
+ {
+ t << " <value name='" << convertToXML(enumVal) << "'/>" << endl;
+ enumVal = m_value.next();
+ }
+
+ t << " </option>" << endl;
+}
+
+void ConfigObsolete::writeXML(FTextStream &t)
+{
+ t << " <option type='obsolete' "
+ "id='" << convertToXML(name()) << "'/>" << endl;
+}
+
+
+/* -----------------------------------------------------------------
+ *
+ * static variables
+ */
+
+struct ConfigFileState
+{
+ int lineNr;
+ FILE *filePtr;
+ YY_BUFFER_STATE oldState;
+ YY_BUFFER_STATE newState;
+ QCString fileName;
+};
+
+static const char *inputString;
+static int inputPosition;
+static int yyLineNr;
+static QCString yyFileName;
+static QCString tmpString;
+static QCString *s=0;
+static bool *b=0;
+static QStrList *l=0;
+static int lastState;
+static QCString elemStr;
+static QCString includeName;
+static QStrList includePathList;
+static QStack<ConfigFileState> includeStack;
+static int includeDepth;
+
+static QCString tabSizeString;
+static QCString maxInitLinesString;
+static QCString colsInAlphaIndexString;
+static QCString enumValuesPerLineString;
+static QCString treeViewWidthString;
+static QCString maxDotGraphWidthString;
+static QCString maxDotGraphHeightString;
+static QCString encoding;
+
+static Config *config;
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ // no file included
+ if (includeStack.isEmpty())
+ {
+ int c=0;
+ if (inputString==0) return c;
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+ }
+ else
+ {
+ //assert(includeStack.current()->newState==YY_CURRENT_BUFFER);
+ return (int)fread(buf,1,max_size,includeStack.current()->filePtr);
+ }
+}
+
+
+static QCString configStringRecode(
+ const QCString &str,
+ const char *fromEncoding,
+ const char *toEncoding)
+{
+ QCString inputEncoding = fromEncoding;
+ QCString outputEncoding = toEncoding;
+ if (inputEncoding.isEmpty() || outputEncoding.isEmpty() || inputEncoding==outputEncoding) return str;
+ int inputSize=str.length();
+ size_t outputSize=inputSize*4+1;
+ QCString output(outputSize);
+ void *cd = portable_iconv_open(outputEncoding,inputEncoding);
+ if (cd==(void *)(-1))
+ {
+ fprintf(stderr,"error: unsupported character conversion: '%s'->'%s'\n",
+ inputEncoding.data(),outputEncoding.data());
+ exit(1);
+ }
+ size_t iLeft=inputSize;
+ size_t oLeft=outputSize;
+ const char *inputPtr = str.data();
+ char *outputPtr = output.data();
+ if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft))
+ {
+ outputSize-=oLeft;
+ output.resize(outputSize+1);
+ output.at(outputSize)='\0';
+ //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data());
+ }
+ else
+ {
+ fprintf(stderr,"error: failed to translate characters from %s to %s: %s\n",
+ inputEncoding.data(),outputEncoding.data(),strerror(errno));
+ exit(1);
+ }
+ portable_iconv_close(cd);
+ return output;
+}
+
+static void checkEncoding()
+{
+ ConfigString *option = (ConfigString*)config->get("DOXYFILE_ENCODING");
+ encoding = *option->valueRef();
+}
+
+static FILE *tryPath(const char *path,const char *fileName)
+{
+ QCString absName=(path ? (QCString)path+"/"+fileName : (QCString)fileName);
+ QFileInfo fi(absName);
+ if (fi.exists() && fi.isFile())
+ {
+ FILE *f=portable_fopen(absName,"r");
+ if (!f) config_err("error: could not open file %s for reading\n",absName.data());
+ return f;
+ }
+ return 0;
+}
+
+static void substEnvVarsInStrList(QStrList &sl);
+static void substEnvVarsInString(QCString &s);
+
+static bool isAbsolute(const char * fileName)
+{
+# ifdef _WIN32
+ if (isalpha (fileName [0]) && fileName[1] == ':')
+ fileName += 2;
+# endif
+ char const fst = fileName [0];
+ if (fst == '/') {
+ return true;
+ }
+# ifdef _WIN32
+ if (fst == '\\')
+ return true;
+# endif
+ return false;
+}
+
+static FILE *findFile(const char *fileName)
+{
+ if(isAbsolute(fileName))
+ return tryPath(NULL, fileName);
+ substEnvVarsInStrList(includePathList);
+ char *s=includePathList.first();
+ while (s) // try each of the include paths
+ {
+ FILE *f = tryPath(s,fileName);
+ if (f) return f;
+ s=includePathList.next();
+ }
+ // try cwd if includePathList fails
+ return tryPath(".",fileName);
+}
+
+static void readIncludeFile(const char *incName)
+{
+ if (includeDepth==MAX_INCLUDE_DEPTH) {
+ config_err("error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
+ MAX_INCLUDE_DEPTH,incName);
+ exit(1);
+ }
+
+ QCString inc = incName;
+ substEnvVarsInString(inc);
+ inc = inc.stripWhiteSpace();
+ uint incLen = inc.length();
+ if (inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
+ {
+ inc=inc.mid(1,incLen-2);
+ }
+
+ FILE *f;
+
+ if ((f=findFile(inc))) // see if the include file can be found
+ {
+ // For debugging
+#if SHOW_INCLUDES
+ for (i=0;i<includeStack.count();i++) msg(" ");
+ msg("@INCLUDE = %s: parsing...\n",inc.data());
+#endif
+
+ // store the state of the old file
+ ConfigFileState *fs=new ConfigFileState;
+ fs->oldState=YY_CURRENT_BUFFER;
+ fs->lineNr=yyLineNr;
+ fs->fileName=yyFileName;
+ fs->filePtr=f;
+ // push the state on the stack
+ includeStack.push(fs);
+ // set the scanner to the include file
+ yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
+ fs->newState=YY_CURRENT_BUFFER;
+ yyFileName=inc;
+ includeDepth++;
+ }
+ else
+ {
+ config_err("error: @INCLUDE = %s: not found!\n",inc.data());
+ exit(1);
+ }
+}
+
+
+%}
+
+%option nounput
+%option noyywrap
+
+%x Start
+%x SkipComment
+%x SkipInvalid
+%x GetString
+%x GetBool
+%x GetStrList
+%x GetQuotedString
+%x GetEnvVar
+%x Include
+
+%%
+
+<*>\0x0d
+<Start,GetString,GetStrList,GetBool,SkipInvalid>"#" { BEGIN(SkipComment); }
+<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { QCString cmd=yytext;
+ cmd=cmd.left(cmd.length()-1).stripWhiteSpace();
+ ConfigOption *option = config->get(cmd);
+ if (option==0) // oops not known
+ {
+ config_err("warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+ yytext,yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ }
+ else // known tag
+ {
+ option->setEncoding(encoding);
+ switch(option->kind())
+ {
+ case ConfigOption::O_Info:
+ // shouldn't get here!
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_List:
+ l = ((ConfigList *)option)->valueRef();
+ l->clear();
+ elemStr="";
+ BEGIN(GetStrList);
+ break;
+ case ConfigOption::O_Enum:
+ s = ((ConfigEnum *)option)->valueRef();
+ s->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_String:
+ s = ((ConfigString *)option)->valueRef();
+ s->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_Int:
+ s = ((ConfigInt *)option)->valueStringRef();
+ s->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_Bool:
+ s = ((ConfigBool *)option)->valueStringRef();
+ s->resize(0);
+ BEGIN(GetString);
+ break;
+ case ConfigOption::O_Obsolete:
+ config_err("warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+ "To avoid this warning please update your configuration "
+ "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
+ }
+ }
+ }
+<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" { QCString cmd=yytext;
+ cmd=cmd.left(cmd.length()-2).stripWhiteSpace();
+ ConfigOption *option = config->get(cmd);
+ if (option==0) // oops not known
+ {
+ config_err("warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+ yytext,yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ }
+ else // known tag
+ {
+ switch(option->kind())
+ {
+ case ConfigOption::O_Info:
+ // shouldn't get here!
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_List:
+ l = ((ConfigList *)option)->valueRef();
+ elemStr="";
+ BEGIN(GetStrList);
+ break;
+ case ConfigOption::O_Enum:
+ case ConfigOption::O_String:
+ case ConfigOption::O_Int:
+ case ConfigOption::O_Bool:
+ config_err("warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
+ yytext,yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
+ case ConfigOption::O_Obsolete:
+ config_err("warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+ "To avoid this warning please update your configuration "
+ "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
+ }
+ }
+ }
+<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&includePathList; l->clear(); elemStr=""; }
+ /* include a config file */
+<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);}
+<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
+ readIncludeFile(configStringRecode(yytext,encoding,"UTF-8"));
+ BEGIN(Start);
+ }
+<<EOF>> {
+ //printf("End of include file\n");
+ //printf("Include stack depth=%d\n",g_includeStack.count());
+ if (includeStack.isEmpty())
+ {
+ //printf("Terminating scanner!\n");
+ yyterminate();
+ }
+ else
+ {
+ ConfigFileState *fs=includeStack.pop();
+ fclose(fs->filePtr);
+ YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer( fs->oldState );
+ yy_delete_buffer( oldBuf );
+ yyLineNr=fs->lineNr;
+ yyFileName=fs->fileName;
+ delete fs; fs=0;
+ includeDepth--;
+ }
+ }
+
+<Start>[a-z_A-Z0-9]+ { config_err("warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
+<GetString,GetBool,SkipInvalid>\n { yyLineNr++; BEGIN(Start); }
+<GetStrList>\n {
+ yyLineNr++;
+ if (!elemStr.isEmpty())
+ {
+ //printf("elemStr1=`%s'\n",elemStr.data());
+ l->append(elemStr);
+ }
+ BEGIN(Start);
+ }
+<GetStrList>[ \t]+ {
+ if (!elemStr.isEmpty())
+ {
+ //printf("elemStr2=`%s'\n",elemStr.data());
+ l->append(elemStr);
+ }
+ elemStr.resize(0);
+ }
+<GetString>[^ \"\t\r\n]+ { (*s)+=configStringRecode(yytext,encoding,"UTF-8");
+ checkEncoding();
+ }
+<GetString,GetStrList,SkipInvalid>"\"" { lastState=YY_START;
+ BEGIN(GetQuotedString);
+ tmpString.resize(0);
+ }
+<GetQuotedString>"\""|"\n" {
+ // we add a bogus space to signal that the string was quoted. This space will be stripped later on.
+ tmpString+=" ";
+ //printf("Quoted String = `%s'\n",tmpString.data());
+ if (lastState==GetString)
+ {
+ (*s)+=configStringRecode(tmpString,encoding,"UTF-8");
+ checkEncoding();
+ }
+ else
+ {
+ elemStr+=configStringRecode(tmpString,encoding,"UTF-8");
+ }
+ if (*yytext=='\n')
+ {
+ config_err("warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
+ yyLineNr++;
+ }
+ BEGIN(lastState);
+ }
+<GetQuotedString>"\\\"" {
+ tmpString+='"';
+ }
+<GetQuotedString>. { tmpString+=*yytext; }
+<GetBool>[a-zA-Z]+ {
+ QCString bs=yytext;
+ bs=bs.upper();
+ if (bs=="YES" || bs=="1")
+ *b=TRUE;
+ else if (bs=="NO" || bs=="0")
+ *b=FALSE;
+ else
+ {
+ *b=FALSE;
+ config_warn("warning: Invalid value `%s' for "
+ "boolean tag in line %d, file %s; use YES or NO\n",
+ bs.data(),yyLineNr,yyFileName.data());
+ }
+ }
+<GetStrList>[^ \#\"\t\r\n]+ {
+ elemStr+=configStringRecode(yytext,encoding,"UTF-8");
+ }
+<SkipComment>\n { yyLineNr++; BEGIN(Start); }
+<SkipComment>\\[ \r\t]*\n { yyLineNr++; BEGIN(Start); }
+<*>\\[ \r\t]*\n { yyLineNr++; }
+<*>.
+<*>\n { yyLineNr++ ; }
+
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
+{
+ t << "# Doxyfile " << versionString << endl << endl;
+ if (!sl)
+ {
+ t << "# This file describes the settings to be used by the documentation system\n";
+ t << "# doxygen (www.doxygen.org) for a project.\n";
+ t << "#\n";
+ t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
+ t << "# The format is:\n";
+ t << "# TAG = value [value, ...]\n";
+ t << "# For lists items can also be appended using:\n";
+ t << "# TAG += value [value, ...]\n";
+ t << "# Values that contain spaces should be placed between quotes (\" \").\n";
+ }
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ option->writeTemplate(t,sl,upd);
+ option = m_options->next();
+ }
+}
+
+void Config::writeXML(FTextStream &t)
+{
+ t << "<doxygenconfig>" << endl;
+ bool first=TRUE;
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ if (option->kind()==ConfigOption::O_Info)
+ {
+ if (!first) t << " </group>" << endl;
+ t << " <group name='" << option->name() << "' "
+ "docs='" << option->docs() << "'>" << endl;
+ first=FALSE;
+ }
+ else
+ {
+ option->writeXML(t);
+ }
+ option = m_options->next();
+ }
+ option = m_obsolete->first();
+ while (option)
+ {
+ option->writeXML(t);
+ option = m_obsolete->next();
+ }
+ if (!first) t << " </group>" << endl;
+ t << "</doxygenconfig>" << endl;
+}
+
+void Config::convertStrToVal()
+{
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ option->convertStrToVal();
+ option = m_options->next();
+ }
+}
+
+static void substEnvVarsInString(QCString &s)
+{
+ static QRegExp re("\\$\\([a-z_A-Z0-9]+\\)");
+ if (s.isEmpty()) return;
+ int p=0;
+ int i,l;
+ //printf("substEnvVarInString(%s) start\n",s.data());
+ while ((i=re.match(s,p,&l))!=-1)
+ {
+ //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).data());
+ QCString env=portable_getenv(s.mid(i+2,l-3));
+ substEnvVarsInString(env); // recursively expand variables if needed.
+ s = s.left(i)+env+s.right(s.length()-i-l);
+ p=i+env.length(); // next time start at the end of the expanded string
+ }
+ s=s.stripWhiteSpace(); // to strip the bogus space that was added when an argument
+ // has quotes
+ //printf("substEnvVarInString(%s) end\n",s.data());
+}
+
+static void substEnvVarsInStrList(QStrList &sl)
+{
+ char *s = sl.first();
+ while (s)
+ {
+ QCString result(s);
+ // an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
+ bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
+ // here we strip the quote again
+ substEnvVarsInString(result);
+
+ //printf("Result %s was quoted=%d\n",result.data(),wasQuoted);
+
+ if (!wasQuoted) /* as a result of the expansion, a single string
+ may have expanded into a list, which we'll
+ add to sl. If the orginal string already
+ contained multiple elements no further
+ splitting is done to allow quoted items with spaces! */
+ {
+ int l=result.length();
+ int i,p=0;
+ // skip spaces
+ // search for a "word"
+ for (i=0;i<l;i++)
+ {
+ char c=0;
+ // skip until start of new word
+ while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
+ p=i; // p marks the start index of the word
+ // skip until end of a word
+ while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
+ if (i<l) // not at the end of the string
+ {
+ if (c=='"') // word within quotes
+ {
+ p=i+1;
+ for (i++;i<l;i++)
+ {
+ c=result.at(i);
+ if (c=='"') // end quote
+ {
+ // replace the string in the list and go to the next item.
+ sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
+ sl.next(); // current item is now the old item
+ p=i+1;
+ break;
+ }
+ else if (c=='\\') // skip escaped stuff
+ {
+ i++;
+ }
+ }
+ }
+ else if (c==' ' || c=='\t') // separator
+ {
+ // replace the string in the list and go to the next item.
+ sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item.
+ sl.next(); // current item is now the old item
+ p=i+1;
+ }
+ }
+ }
+ if (p!=l) // add the leftover as a string
+ {
+ // replace the string in the list and go to the next item.
+ sl.insert(sl.at(),result.right(l-p)); // insert new item before current item.
+ sl.next(); // current item is now the old item
+ }
+ }
+ else // just goto the next element in the list
+ {
+ sl.insert(sl.at(),result);
+ sl.next();
+ }
+ // remove the old unexpanded string from the list
+ int i=sl.at();
+ sl.remove(); // current item index changes if the last element is removed.
+ if (sl.at()==i) // not last item
+ s = sl.current();
+ else // just removed last item
+ s = 0;
+ }
+}
+
+void ConfigString::substEnvVars()
+{
+ substEnvVarsInString(m_value);
+}
+
+void ConfigList::substEnvVars()
+{
+ substEnvVarsInStrList(m_value);
+}
+
+void ConfigBool::substEnvVars()
+{
+ substEnvVarsInString(m_valueString);
+}
+
+void ConfigInt::substEnvVars()
+{
+ substEnvVarsInString(m_valueString);
+}
+
+void ConfigEnum::substEnvVars()
+{
+ substEnvVarsInString(m_value);
+}
+
+void Config::substituteEnvironmentVars()
+{
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ option->substEnvVars();
+ option = m_options->next();
+ }
+}
+
+static void cleanUpPaths(QStrList &str)
+{
+ char *sfp = str.first();
+ while (sfp)
+ {
+ register char *p = sfp;
+ if (p)
+ {
+ char c;
+ while ((c=*p))
+ {
+ if (c=='\\') *p='/';
+ p++;
+ }
+ }
+ QCString path = sfp;
+ if ((path.at(0)!='/' && (path.length()<=2 || path.at(1)!=':')) ||
+ path.at(path.length()-1)!='/'
+ )
+ {
+ QFileInfo fi(path);
+ if (fi.exists() && fi.isDir())
+ {
+ int i = str.at();
+ str.remove();
+ if (str.at()==i) // did not remove last item
+ str.insert(i,fi.absFilePath()+"/");
+ else
+ str.append(fi.absFilePath()+"/");
+ }
+ }
+ sfp = str.next();
+ }
+}
+
+void Config::check()
+{
+ //if (!projectName.isEmpty())
+ //{
+ // projectName[0]=toupper(projectName[0]);
+ //}
+
+ QCString &warnFormat = Config_getString("WARN_FORMAT");
+ if (warnFormat.stripWhiteSpace().isEmpty())
+ {
+ warnFormat="$file:$line $text";
+ }
+ else
+ {
+ if (warnFormat.find("$file")==-1)
+ {
+ config_err("warning: warning format does not contain a $file tag!\n");
+ }
+ if (warnFormat.find("$line")==-1)
+ {
+ config_err("warning: warning format does not contain a $line tag!\n");
+ }
+ if (warnFormat.find("$text")==-1)
+ {
+ config_err("warning: warning format foes not contain a $text tag!\n");
+ }
+ }
+
+ QCString &manExtension = Config_getString("MAN_EXTENSION");
+
+ // set default man page extension if non is given by the user
+ if (manExtension.isEmpty())
+ {
+ manExtension=".3";
+ }
+
+ QCString &paperType = Config_getEnum("PAPER_TYPE");
+ paperType=paperType.lower().stripWhiteSpace();
+ if (paperType.isEmpty())
+ {
+ paperType = "a4";
+ }
+ if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" &&
+ paperType!="legal" && paperType!="executive")
+ {
+ config_err("error: Unknown page type specified");
+ }
+
+ QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
+ outputLanguage=outputLanguage.stripWhiteSpace();
+ if (outputLanguage.isEmpty())
+ {
+ outputLanguage = "English";
+ }
+
+ QCString &htmlFileExtension=Config_getString("HTML_FILE_EXTENSION");
+ htmlFileExtension=htmlFileExtension.stripWhiteSpace();
+ if (htmlFileExtension.isEmpty())
+ {
+ htmlFileExtension = ".html";
+ }
+
+ // expand the relative stripFromPath values
+ QStrList &stripFromPath = Config_getList("STRIP_FROM_PATH");
+ char *sfp = stripFromPath.first();
+ if (sfp==0) // by default use the current path
+ {
+ stripFromPath.append(QDir::currentDirPath()+"/");
+ }
+ else
+ {
+ cleanUpPaths(stripFromPath);
+ }
+
+ // expand the relative stripFromPath values
+ QStrList &stripFromIncPath = Config_getList("STRIP_FROM_INC_PATH");
+ cleanUpPaths(stripFromIncPath);
+
+ // Test to see if HTML header is valid
+ QCString &headerFile = Config_getString("HTML_HEADER");
+ if (!headerFile.isEmpty())
+ {
+ QFileInfo fi(headerFile);
+ if (!fi.exists())
+ {
+ config_err("error: tag HTML_HEADER: header file `%s' "
+ "does not exist\n",headerFile.data());
+ exit(1);
+ }
+ }
+ // Test to see if HTML footer is valid
+ QCString &footerFile = Config_getString("HTML_FOOTER");
+ if (!footerFile.isEmpty())
+ {
+ QFileInfo fi(footerFile);
+ if (!fi.exists())
+ {
+ config_err("error: tag HTML_FOOTER: footer file `%s' "
+ "does not exist\n",footerFile.data());
+ exit(1);
+ }
+ }
+ // Test to see if LaTeX header is valid
+ QCString &latexHeaderFile = Config_getString("LATEX_HEADER");
+ if (!latexHeaderFile.isEmpty())
+ {
+ QFileInfo fi(latexHeaderFile);
+ if (!fi.exists())
+ {
+ config_err("error: tag LATEX_HEADER: header file `%s' "
+ "does not exist\n",latexHeaderFile.data());
+ exit(1);
+ }
+ }
+ // check include path
+ QStrList &includePath = Config_getList("INCLUDE_PATH");
+ char *s=includePath.first();
+ while (s)
+ {
+ QFileInfo fi(s);
+ if (!fi.exists()) config_err("warning: tag INCLUDE_PATH: include path `%s' "
+ "does not exist\n",s);
+ s=includePath.next();
+ }
+
+ // check aliases
+ QStrList &aliasList = Config_getList("ALIASES");
+ s=aliasList.first();
+ while (s)
+ {
+ QRegExp re1("[a-z_A-Z][a-z_A-Z0-9]*[ \t]*="); // alias without argument
+ QRegExp re2("[a-z_A-Z][a-z_A-Z0-9]*{[0-9]*}[ \t]*="); // alias with argument
+ QCString alias=s;
+ alias=alias.stripWhiteSpace();
+ if (alias.find(re1)!=0 && alias.find(re2)!=0)
+ {
+ config_err("Illegal alias format `%s'. Use \"name=value\" or \"name(n)=value\", where n is the number of arguments\n",
+ alias.data());
+ }
+ s=aliasList.next();
+ }
+
+ // check if GENERATE_TREEVIEW and GENERATE_HTMLHELP are both enabled
+ if (Config_getBool("GENERATE_TREEVIEW") && Config_getBool("GENERATE_HTMLHELP"))
+ {
+ config_err("When enabling GENERATE_HTMLHELP the tree view (GENERATE_TREEVIEW) should be disabled. I'll do it for you.\n");
+ Config_getBool("GENERATE_TREEVIEW")=FALSE;
+ }
+ if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTMLHELP"))
+ {
+ config_err("When enabling GENERATE_HTMLHELP the search engine (SEARCHENGINE) should be disabled. I'll do it for you.\n");
+ Config_getBool("SEARCHENGINE")=FALSE;
+ }
+
+ // check if SEPARATE_MEMBER_PAGES and INLINE_GROUPED_CLASSES are both enabled
+ if (Config_getBool("SEPARATE_MEMBER_PAGES") && Config_getBool("INLINE_GROUPED_CLASSES"))
+ {
+ config_err("When enabling INLINE_GROUPED_CLASSES the SEPARATE_MEMBER_PAGES option should be disabled. I'll do it for you.\n");
+ Config_getBool("SEPARATE_MEMBER_PAGES")=FALSE;
+ }
+
+ // check dot image format
+ QCString &dotImageFormat=Config_getEnum("DOT_IMAGE_FORMAT");
+ dotImageFormat=dotImageFormat.stripWhiteSpace();
+ if (dotImageFormat.isEmpty())
+ {
+ dotImageFormat = "png";
+ }
+ //else if (dotImageFormat!="gif" && dotImageFormat!="png" && dotImageFormat!="jpg")
+ //{
+ // config_err("Invalid value for DOT_IMAGE_FORMAT: `%s'. Using the default.\n",dotImageFormat.data());
+ // dotImageFormat = "png";
+ //}
+
+
+ // check dot path
+ QCString &dotPath = Config_getString("DOT_PATH");
+ if (!dotPath.isEmpty())
+ {
+ QFileInfo dp(dotPath+"/dot"+portable_commandExtension());
+ if (!dp.exists() || !dp.isFile())
+ {
+ config_err("warning: the dot tool could not be found at %s\n",dotPath.data());
+ dotPath="";
+ }
+ else
+ {
+ dotPath=dp.dirPath(TRUE)+"/";
+#if defined(_WIN32) // convert slashes
+ uint i=0,l=dotPath.length();
+ for (i=0;i<l;i++) if (dotPath.at(i)=='/') dotPath.at(i)='\\';
+#endif
+ }
+ }
+ else // make sure the string is empty but not null!
+ {
+ dotPath="";
+ }
+
+ // check mscgen path
+ QCString &mscgenPath = Config_getString("MSCGEN_PATH");
+ if (!mscgenPath.isEmpty())
+ {
+ QFileInfo dp(mscgenPath+"/mscgen"+portable_commandExtension());
+ if (!dp.exists() || !dp.isFile())
+ {
+ config_err("warning: the mscgen tool could not be found at %s\n",mscgenPath.data());
+ mscgenPath="";
+ }
+ else
+ {
+ mscgenPath=dp.dirPath(TRUE)+"/";
+#if defined(_WIN32) // convert slashes
+ uint i=0,l=mscgenPath.length();
+ for (i=0;i<l;i++) if (mscgenPath.at(i)=='/') mscgenPath.at(i)='\\';
+#endif
+ }
+ }
+ else // make sure the string is empty but not null!
+ {
+ mscgenPath="";
+ }
+
+
+ // check input
+ QStrList &inputSources=Config_getList("INPUT");
+ if (inputSources.count()==0)
+ {
+ // use current dir as the default
+ inputSources.append(QDir::currentDirPath());
+ }
+ else
+ {
+ s=inputSources.first();
+ while (s)
+ {
+ QFileInfo fi(s);
+ if (!fi.exists())
+ {
+ config_err("warning: tag INPUT: input source `%s' does not exist\n",s);
+ }
+ s=inputSources.next();
+ }
+ }
+
+ // add default pattern if needed
+ QStrList &filePatternList = Config_getList("FILE_PATTERNS");
+ if (filePatternList.isEmpty())
+ {
+ filePatternList.append("*.c");
+ filePatternList.append("*.cc");
+ filePatternList.append("*.cxx");
+ filePatternList.append("*.cpp");
+ filePatternList.append("*.c++");
+ filePatternList.append("*.d");
+ filePatternList.append("*.java");
+ filePatternList.append("*.ii");
+ filePatternList.append("*.ixx");
+ filePatternList.append("*.ipp");
+ filePatternList.append("*.i++");
+ filePatternList.append("*.inl");
+ filePatternList.append("*.h");
+ filePatternList.append("*.hh");
+ filePatternList.append("*.hxx");
+ filePatternList.append("*.hpp");
+ filePatternList.append("*.h++");
+ filePatternList.append("*.idl");
+ filePatternList.append("*.odl");
+ filePatternList.append("*.cs");
+ filePatternList.append("*.php");
+ filePatternList.append("*.php3");
+ filePatternList.append("*.inc");
+ filePatternList.append("*.m");
+ filePatternList.append("*.mm");
+ filePatternList.append("*.dox");
+ filePatternList.append("*.py");
+ filePatternList.append("*.f90");
+ filePatternList.append("*.f");
+ filePatternList.append("*.for");
+ filePatternList.append("*.vhd");
+ filePatternList.append("*.vhdl");
+ if (portable_fileSystemIsCaseSensitive())
+ {
+ // unix => case sensitive match => also include useful uppercase versions
+ filePatternList.append("*.C");
+ filePatternList.append("*.CC");
+ filePatternList.append("*.C++");
+ filePatternList.append("*.II");
+ filePatternList.append("*.I++");
+ filePatternList.append("*.H");
+ filePatternList.append("*.HH");
+ filePatternList.append("*.H++");
+ filePatternList.append("*.CS");
+ filePatternList.append("*.PHP");
+ filePatternList.append("*.PHP3");
+ filePatternList.append("*.M");
+ filePatternList.append("*.MM");
+ filePatternList.append("*.PY");
+ filePatternList.append("*.F90");
+ filePatternList.append("*.F");
+ filePatternList.append("*.VHD");
+ filePatternList.append("*.VHDL");
+ }
+ }
+
+ // add default pattern if needed
+ QStrList &examplePatternList = Config_getList("EXAMPLE_PATTERNS");
+ if (examplePatternList.isEmpty())
+ {
+ examplePatternList.append("*");
+ }
+
+ // if no output format is enabled, warn the user
+ if (!Config_getBool("GENERATE_HTML") &&
+ !Config_getBool("GENERATE_LATEX") &&
+ !Config_getBool("GENERATE_MAN") &&
+ !Config_getBool("GENERATE_RTF") &&
+ !Config_getBool("GENERATE_XML") &&
+ !Config_getBool("GENERATE_PERLMOD") &&
+ !Config_getBool("GENERATE_RTF") &&
+ !Config_getBool("GENERATE_AUTOGEN_DEF") &&
+ Config_getString("GENERATE_TAGFILE").isEmpty()
+ )
+ {
+ config_err("warning: No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
+ }
+
+ // check HTMLHELP creation requirements
+ if (!Config_getBool("GENERATE_HTML") &&
+ Config_getBool("GENERATE_HTMLHELP"))
+ {
+ config_err("warning: GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
+ }
+
+ // check QHP creation requirements
+ if (Config_getBool("GENERATE_QHP"))
+ {
+ if (Config_getString("QHP_NAMESPACE").isEmpty())
+ {
+ config_err("error: GENERATE_QHP=YES requires QHP_NAMESPACE to be set. Using 'org.doxygen.doc' as default!.\n");
+ Config_getString("QHP_NAMESPACE")="org.doxygen.doc";
+ }
+
+ if (Config_getString("QHP_VIRTUAL_FOLDER").isEmpty())
+ {
+ config_err("error: GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set. Using 'doc' as default!\n");
+ Config_getString("QHP_VIRTUAL_FOLDER")="doc";
+ }
+ }
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA") && Config_getBool("INLINE_INFO"))
+ {
+ // don't show inline info for Java output, since Java has no inline
+ // concept.
+ Config_getBool("INLINE_INFO")=FALSE;
+ }
+
+ int &depth = Config_getInt("MAX_DOT_GRAPH_DEPTH");
+ if (depth==0)
+ {
+ depth=1000;
+ }
+
+ int &hue = Config_getInt("HTML_COLORSTYLE_HUE");
+ if (hue<0)
+ {
+ hue=0;
+ }
+ else if (hue>=360)
+ {
+ hue=hue%360;
+ }
+
+ int &sat = Config_getInt("HTML_COLORSTYLE_SAT");
+ if (sat<0)
+ {
+ sat=0;
+ }
+ else if (sat>255)
+ {
+ sat=255;
+ }
+ int &gamma = Config_getInt("HTML_COLORSTYLE_GAMMA");
+ if (gamma<40)
+ {
+ gamma=40;
+ }
+ else if (gamma>240)
+ {
+ gamma=240;
+ }
+
+
+ // add default words if needed
+ QStrList &annotationFromBrief = Config_getList("ABBREVIATE_BRIEF");
+ if (annotationFromBrief.isEmpty())
+ {
+ annotationFromBrief.append("The $name class");
+ annotationFromBrief.append("The $name widget");
+ annotationFromBrief.append("The $name file");
+ annotationFromBrief.append("is");
+ annotationFromBrief.append("provides");
+ annotationFromBrief.append("specifies");
+ annotationFromBrief.append("contains");
+ annotationFromBrief.append("represents");
+ annotationFromBrief.append("a");
+ annotationFromBrief.append("an");
+ annotationFromBrief.append("the");
+ }
+
+ // some default settings for vhdl
+ if (Config_getBool("OPTIMIZE_OUTPUT_VHDL") &&
+ (Config_getBool("INLINE_INHERITED_MEMB") ||
+ Config_getBool("INHERIT_DOCS") ||
+ !Config_getBool("HIDE_SCOPE_NAMES") ||
+ !Config_getBool("EXTRACT_PRIVATE")
+ )
+ )
+ {
+ bool b1 = Config_getBool("INLINE_INHERITED_MEMB");
+ bool b2 = Config_getBool("INHERIT_DOCS");
+ bool b3 = Config_getBool("HIDE_SCOPE_NAMES");
+ bool b4 = Config_getBool("EXTRACT_PRIVATE");
+ const char *s1,*s2,*s3,*s4;
+ if (b1) s1=" INLINDE_INHERITED_MEMB = NO (was YES)\n"; else s1="";
+ if (b2) s2=" INHERIT_DOCS = NO (was YES)\n"; else s2="";
+ if (!b3) s3=" HIDE_SCOPE_NAMES = YES (was NO)\n"; else s3="";
+ if (!b4) s4=" EXTRACT_PRIVATE = YES (was NO)\n"; else s4="";
+
+ config_err("warning: enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n"
+ "%s%s%s%s",s1,s2,s3,s4
+ );
+
+ Config_getBool("INLINE_INHERITED_MEMB") = FALSE;
+ Config_getBool("INHERIT_DOCS") = FALSE;
+ Config_getBool("HIDE_SCOPE_NAMES") = TRUE;
+ Config_getBool("EXTRACT_PRIVATE") = TRUE;
+ }
+
+}
+
+void Config::init()
+{
+ ConfigOption *option = m_options->first();
+ while (option)
+ {
+ option->init();
+ option = m_options->next();
+ }
+}
+
+void Config::create()
+{
+ if (m_initialized) return;
+ m_initialized = TRUE;
+ addConfigOptions(this);
+}
+
+static QCString configFileToString(const char *name)
+{
+ if (name==0 || name[0]==0) return 0;
+ QFile f;
+
+ bool fileOpened=FALSE;
+ if (name[0]=='-' && name[1]==0) // read from stdin
+ {
+ fileOpened=f.open(IO_ReadOnly,stdin);
+ if (fileOpened)
+ {
+ const int bSize=4096;
+ QCString contents(bSize);
+ int totalSize=0;
+ int size;
+ while ((size=f.readBlock(contents.data()+totalSize,bSize))==bSize)
+ {
+ totalSize+=bSize;
+ contents.resize(totalSize+bSize);
+ }
+ totalSize+=size+2;
+ contents.resize(totalSize);
+ contents.at(totalSize-2)='\n'; // to help the scanner
+ contents.at(totalSize-1)='\0';
+ return contents;
+ }
+ }
+ else // read from file
+ {
+ QFileInfo fi(name);
+ if (!fi.exists() || !fi.isFile())
+ {
+ config_err("error: file `%s' not found\n",name);
+ return "";
+ }
+ f.setName(name);
+ fileOpened=f.open(IO_ReadOnly);
+ if (fileOpened)
+ {
+ int fsize=f.size();
+ QCString contents(fsize+2);
+ f.readBlock(contents.data(),fsize);
+ f.close();
+ if (fsize==0 || contents[fsize-1]=='\n')
+ contents[fsize]='\0';
+ else
+ contents[fsize]='\n'; // to help the scanner
+ contents[fsize+1]='\0';
+ return contents;
+ }
+ }
+ if (!fileOpened)
+ {
+ config_err("error: cannot open file `%s' for reading\n",name);
+ }
+ return "";
+}
+
+bool Config::parseString(const char *fn,const char *str)
+{
+ config = Config::instance();
+ inputString = str;
+ inputPosition = 0;
+ yyFileName = fn;
+ yyLineNr = 1;
+ includeStack.setAutoDelete(TRUE);
+ includeStack.clear();
+ includeDepth = 0;
+ configYYrestart( configYYin );
+ BEGIN( Start );
+ configYYlex();
+ inputString = 0;
+ return TRUE;
+}
+
+bool Config::parse(const char *fn)
+{
+ encoding = "UTF-8";
+ return parseString(fn,configFileToString(fn));
+}
+
+extern "C" { // some bogus code to keep the compiler happy
+ //int configYYwrap() { return 1 ; }
+}
diff --git a/src/config.xml b/src/config.xml
new file mode 100644
index 0000000..2883b83
--- /dev/null
+++ b/src/config.xml
@@ -0,0 +1,1567 @@
+<doxygenconfig>
+ <group name='Project' docs='Project related configuration options'>
+ <option type='string' id='DOXYFILE_ENCODING' format='string' docs='
+This tag specifies the encoding used for all characters in the config file
+that follow. The default is UTF-8 which is also the encoding used for all
+text before the first occurrence of this tag. Doxygen uses libiconv (or the
+iconv built into libc) for the transcoding. See
+http://www.gnu.org/software/libiconv for the list of possible encodings.
+' defval='UTF-8'/>
+ <option type='string' id='PROJECT_NAME' format='string' docs='
+The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+by quotes) that should identify the project. ' defval=''/>
+ <option type='string' id='PROJECT_NUMBER' format='string' docs='
+The PROJECT_NUMBER tag can be used to enter a project or revision number.
+This could be handy for archiving the generated documentation or
+if some version control system is used.
+' defval=''/>
+ <option type='string' id='PROJECT_BRIEF' format='string' docs='
+Using the PROJECT_BRIEF tag one can provide an optional one line description
+for a project that appears at the top of each page and should give viewer
+a quick idea about the purpose of the project. Keep the description short.
+' defval=''/>
+ <option type='string' id='PROJECT_LOGO' format='file' docs='
+With the PROJECT_LOGO tag one can specify an logo or icon that is
+included in the documentation. The maximum height of the logo should not
+exceed 55 pixels and the maximum width should not exceed 200 pixels.
+Doxygen will copy the logo to the output directory.
+' defval=''/>
+ <option type='string' id='OUTPUT_DIRECTORY' format='dir' docs='
+The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+base path where the generated documentation will be put.
+If a relative path is entered, it will be relative to the location
+where doxygen was started. If left blank the current directory will be used.
+' defval=''/>
+ <option type='bool' id='CREATE_SUBDIRS' docs='
+If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+4096 sub-directories (in 2 levels) under the output directory of each output
+format and will distribute the generated files over these directories.
+Enabling this option can be useful when feeding doxygen a huge amount of
+source files, where putting all generated files in the same directory would
+otherwise cause performance problems for the file system.
+' defval='0'/>
+ <option type='enum' id='OUTPUT_LANGUAGE' defval='English' docs='
+The OUTPUT_LANGUAGE tag is used to specify the language in which all
+documentation generated by doxygen is written. Doxygen will use this
+information to generate all constant output in the proper language.
+The default language is English, other supported languages are:
+Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+'>
+ <value name='Afrikaans'/>
+ <value name='Arabic'/>
+ <value name='Brazilian'/>
+ <value name='Catalan'/>
+ <value name='Chinese'/>
+ <value name='Chinese-Traditional'/>
+ <value name='Croatian'/>
+ <value name='Czech'/>
+ <value name='Danish'/>
+ <value name='Dutch'/>
+ <value name='English'/>
+ <value name='Esperanto'/>
+ <value name='Farsi'/>
+ <value name='Finnish'/>
+ <value name='French'/>
+ <value name='German'/>
+ <value name='Greek'/>
+ <value name='Hungarian'/>
+ <value name='Italian'/>
+ <value name='Japanese'/>
+ <value name='Japanese-en'/>
+ <value name='Korean'/>
+ <value name='Korean-en'/>
+ <value name='Norwegian'/>
+ <value name='Macedonian'/>
+ <value name='Persian'/>
+ <value name='Polish'/>
+ <value name='Portuguese'/>
+ <value name='Romanian'/>
+ <value name='Russian'/>
+ <value name='Serbian'/>
+ <value name='Slovak'/>
+ <value name='Slovene'/>
+ <value name='Spanish'/>
+ <value name='Swedish'/>
+ <value name='Turkish'/>
+ <value name='Ukrainian'/>
+ <value name='Vietnamese'/>
+ </option>
+ <option type='bool' id='BRIEF_MEMBER_DESC' docs='
+If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+include brief member descriptions after the members that are listed in
+the file and class documentation (similar to JavaDoc).
+Set to NO to disable this.
+' defval='1'/>
+ <option type='bool' id='REPEAT_BRIEF' docs='
+If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+the brief description of a member or function before the detailed description.
+Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+brief descriptions will be completely suppressed.
+' defval='1'/>
+ <option type='list' id='ABBREVIATE_BRIEF' format='string' docs='
+This tag implements a quasi-intelligent brief description abbreviator
+that is used to form the text in various listings. Each string
+in this list, if found as the leading text of the brief description, will be
+stripped from the text and the result after processing the whole list, is
+used as the annotated text. Otherwise, the brief description is used as-is.
+If left blank, the following values are used (&quot;$name&quot; is automatically
+replaced with the name of the entity): &quot;The $name class&quot; &quot;The $name widget&quot;
+&quot;The $name file&quot; &quot;is&quot; &quot;provides&quot; &quot;specifies&quot; &quot;contains&quot;
+&quot;represents&quot; &quot;a&quot; &quot;an&quot; &quot;the&quot;
+'>
+ <value name='The $name class'/>
+ <value name='The $name widget'/>
+ <value name='The $name file'/>
+ <value name='is'/>
+ <value name='provides'/>
+ <value name='specifies'/>
+ <value name='contains'/>
+ <value name='represents'/>
+ <value name='a'/>
+ <value name='an'/>
+ <value name='the'/>
+ </option>
+ <option type='bool' id='ALWAYS_DETAILED_SEC' docs='
+If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+Doxygen will generate a detailed section even if there is only a brief
+description.
+' defval='0'/>
+ <option type='bool' id='INLINE_INHERITED_MEMB' docs='
+If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+inherited members of a class in the documentation of that class as if those
+members were ordinary class members. Constructors, destructors and assignment
+operators of the base classes will not be shown.
+' defval='0'/>
+ <option type='bool' id='FULL_PATH_NAMES' docs='
+If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+path before files name in the file list and in the header files. If set
+to NO the shortest path that makes the file name unique will be used.
+' defval='1'/>
+ <option type='list' id='STRIP_FROM_PATH' format='string' docs='
+If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+can be used to strip a user-defined part of the path. Stripping is
+only done if one of the specified strings matches the left-hand part of
+the path. The tag can be used to show relative paths in the file list.
+If left blank the directory from which doxygen is run is used as the
+path to strip.
+' depends='FULL_PATH_NAMES'>
+ <value name=''/>
+ </option>
+ <option type='list' id='STRIP_FROM_INC_PATH' format='string' docs='
+The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+the path mentioned in the documentation of a class, which tells
+the reader which header file to include in order to use a class.
+If left blank only the name of the header file containing the class
+definition is used. Otherwise one should specify the include paths that
+are normally passed to the compiler using the -I flag.
+'>
+ </option>
+ <option type='bool' id='SHORT_NAMES' docs='
+If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+(but less readable) file names. This can be useful if your file system
+doesn&apos;t support long names like on DOS, Mac, or CD-ROM.
+' defval='0'/>
+ <option type='bool' id='JAVADOC_AUTOBRIEF' docs='
+If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+will interpret the first line (until the first dot) of a JavaDoc-style
+comment as the brief description. If set to NO, the JavaDoc
+comments will behave just like regular Qt-style comments
+(thus requiring an explicit @brief command for a brief description.)
+' defval='0'/>
+ <option type='bool' id='QT_AUTOBRIEF' docs='
+If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+interpret the first line (until the first dot) of a Qt-style
+comment as the brief description. If set to NO, the comments
+will behave just like regular Qt-style comments (thus requiring
+an explicit \brief command for a brief description.)
+' defval='0'/>
+ <option type='bool' id='MULTILINE_CPP_IS_BRIEF' docs='
+The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+treat a multi-line C++ special comment block (i.e. a block of //! or ///
+comments) as a brief description. This used to be the default behaviour.
+The new default is to treat a multi-line C++ comment block as a detailed
+description. Set this tag to YES if you prefer the old behaviour instead.
+' defval='0'/>
+ <option type='bool' id='INHERIT_DOCS' docs='
+If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+member inherits the documentation from any documented member that it
+re-implements.
+' defval='1'/>
+ <option type='bool' id='SEPARATE_MEMBER_PAGES' docs='
+If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+a new page for each member. If set to NO, the documentation of a member will
+be part of the file/class/namespace that contains it.
+' defval='0'/>
+ <option type='int' id='TAB_SIZE' docs='
+The TAB_SIZE tag can be used to set the number of spaces in a tab.
+Doxygen uses this value to replace tabs by spaces in code fragments.
+' minval='1' maxval='16' defval='8'/>
+ <option type='list' id='ALIASES' format='string' docs='
+This tag can be used to specify a number of aliases that acts
+as commands in the documentation. An alias has the form &quot;name=value&quot;.
+For example adding &quot;sideeffect=\par Side Effects:\n&quot; will allow you to
+put the command \sideeffect (or @sideeffect) in the documentation, which
+will result in a user-defined paragraph with heading &quot;Side Effects:&quot;.
+You can put \n&apos;s in the value part of an alias to insert newlines.
+'>
+ </option>
+ <option type='bool' id='OPTIMIZE_OUTPUT_FOR_C' docs='
+Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+sources only. Doxygen will then generate output that is more tailored for C.
+For instance, some of the names that are used will be different. The list
+of all members will be omitted, etc.
+' defval='0'/>
+ <option type='bool' id='OPTIMIZE_OUTPUT_JAVA' docs='
+Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+sources only. Doxygen will then generate output that is more tailored for
+Java. For instance, namespaces will be presented as packages, qualified
+scopes will look different, etc.
+' defval='0'/>
+ <option type='bool' id='OPTIMIZE_FOR_FORTRAN' docs='
+Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+sources only. Doxygen will then generate output that is more tailored for
+Fortran.
+' defval='0'/>
+ <option type='bool' id='OPTIMIZE_OUTPUT_VHDL' docs='
+Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+sources. Doxygen will then generate output that is tailored for
+VHDL.
+' defval='0'/>
+ <option type='list' id='EXTENSION_MAPPING' format='string' docs='
+Doxygen selects the parser to use depending on the extension of the files it
+parses. With this tag you can assign which parser to use for a given extension.
+Doxygen has a built-in mapping, but you can override or extend it using this
+tag. The format is ext=language, where ext is a file extension, and language
+is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+(default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+'>
+ </option>
+ <option type='bool' id='BUILTIN_STL_SUPPORT' docs='
+If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+to include (a tag file for) the STL sources as input, then you should
+set this tag to YES in order to let doxygen match functions declarations and
+definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+func(std::string) {}). This also makes the inheritance and collaboration
+diagrams that involve STL classes more complete and accurate.
+' defval='0'/>
+ <option type='bool' id='CPP_CLI_SUPPORT' docs='
+If you use Microsoft&apos;s C++/CLI language, you should set this option to YES to
+enable parsing support.
+' defval='0'/>
+ <option type='bool' id='SIP_SUPPORT' docs='
+Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+Doxygen will parse them like normal C++ but will assume all classes use public
+instead of private inheritance when no explicit protection keyword is present.
+' defval='0'/>
+ <option type='bool' id='IDL_PROPERTY_SUPPORT' docs='
+For Microsoft&apos;s IDL there are propget and propput attributes to indicate getter
+and setter methods for a property. Setting this option to YES (the default)
+will make doxygen replace the get and set methods by a property in the
+documentation. This will only work if the methods are indeed getting or
+setting a simple type. If this is not the case, or you want to show the
+methods anyway, you should set this option to NO.
+' defval='1'/>
+ <option type='bool' id='DISTRIBUTE_GROUP_DOC' docs='
+If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+tag is set to YES, then doxygen will reuse the documentation of the first
+member in the group (if any) for the other members of the group. By default
+all members of a group must be documented explicitly.
+' defval='0'/>
+ <option type='bool' id='SUBGROUPING' docs='
+Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+the same type (for instance a group of public functions) to be put as a
+subgroup of that type (e.g. under the Public Functions section). Set it to
+NO to prevent subgrouping. Alternatively, this can be done per class using
+the \nosubgrouping command.
+' defval='1'/>
+ <option type='bool' id='INLINE_GROUPED_CLASSES' docs='
+When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+unions are shown inside the group in which they are included (e.g. using
+@ingroup) instead of on a separate page (for HTML and Man pages) or
+section (for LaTeX and RTF).
+' defval='0'/>
+ <option type='bool' id='TYPEDEF_HIDES_STRUCT' docs='
+When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+is documented as struct, union, or enum with the name of the typedef. So
+typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+with name TypeT. When disabled the typedef will appear as a member of a file,
+namespace, or class. And the struct will be named TypeS. This can typically
+be useful for C code in case the coding convention dictates that all compound
+types are typedef&apos;ed and only the typedef is referenced, never the tag name.
+' defval='0'/>
+ <option type='int' id='SYMBOL_CACHE_SIZE' docs='
+The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+determine which symbols to keep in memory and which to flush to disk.
+When the cache is full, less often used symbols will be written to disk.
+For small to medium size projects (&lt;1000 input files) the default value is
+probably good enough. For larger projects a too small cache size can cause
+doxygen to be busy swapping symbols to and from disk most of the time
+causing a significant performance penalty.
+If the system has enough physical memory increasing the cache will improve the
+performance by keeping more symbols in memory. Note that the value works on
+a logarithmic scale so increasing the size by one will roughly double the
+memory usage. The cache size is given by this formula:
+2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+corresponding to a cache size of 2^16 = 65536 symbols
+' minval='0' maxval='9' defval='0'/>
+ </group>
+ <group name='Build' docs='Build related configuration options'>
+ <option type='bool' id='EXTRACT_ALL' docs='
+If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+documentation are documented, even if no documentation was available.
+Private class members and static file members will be hidden unless
+the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+' defval='0'/>
+ <option type='bool' id='EXTRACT_PRIVATE' docs='
+If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+will be included in the documentation.
+' defval='0'/>
+ <option type='bool' id='EXTRACT_STATIC' docs='
+If the EXTRACT_STATIC tag is set to YES all static members of a file
+will be included in the documentation.
+' defval='0'/>
+ <option type='bool' id='EXTRACT_LOCAL_CLASSES' docs='
+If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+defined locally in source files will be included in the documentation.
+If set to NO only classes defined in header files are included.
+' defval='1'/>
+ <option type='bool' id='EXTRACT_LOCAL_METHODS' docs='
+This flag is only useful for Objective-C code. When set to YES local
+methods, which are defined in the implementation section but not in
+the interface are included in the documentation.
+If set to NO (the default) only methods in the interface are included.
+' defval='0'/>
+ <option type='bool' id='EXTRACT_ANON_NSPACES' docs='
+If this flag is set to YES, the members of anonymous namespaces will be
+extracted and appear in the documentation as a namespace called
+&apos;anonymous_namespace{file}&apos;, where file will be replaced with the base
+name of the file that contains the anonymous namespace. By default
+anonymous namespaces are hidden.
+' defval='0'/>
+ <option type='bool' id='HIDE_UNDOC_MEMBERS' docs='
+If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+undocumented members of documented classes, files or namespaces.
+If set to NO (the default) these members will be included in the
+various overviews, but no documentation section is generated.
+This option has no effect if EXTRACT_ALL is enabled.
+' defval='0'/>
+ <option type='bool' id='HIDE_UNDOC_CLASSES' docs='
+If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+undocumented classes that are normally visible in the class hierarchy.
+If set to NO (the default) these classes will be included in the various
+overviews. This option has no effect if EXTRACT_ALL is enabled.
+' defval='0'/>
+ <option type='bool' id='HIDE_FRIEND_COMPOUNDS' docs='
+If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+friend (class|struct|union) declarations.
+If set to NO (the default) these declarations will be included in the
+documentation.
+' defval='0'/>
+ <option type='bool' id='HIDE_IN_BODY_DOCS' docs='
+If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+documentation blocks found inside the body of a function.
+If set to NO (the default) these blocks will be appended to the
+function&apos;s detailed documentation block.
+' defval='0'/>
+ <option type='bool' id='INTERNAL_DOCS' docs='
+The INTERNAL_DOCS tag determines if documentation
+that is typed after a \internal command is included. If the tag is set
+to NO (the default) then the documentation will be excluded.
+Set it to YES to include the internal documentation.
+' defval='0'/>
+ <option type='bool' id='CASE_SENSE_NAMES' docs='
+If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+file names in lower-case letters. If set to YES upper-case letters are also
+allowed. This is useful if you have classes or files whose names only differ
+in case and if your file system supports case sensitive file names. Windows
+and Mac users are advised to set this option to NO.
+' defval='0' altdefval='portable_fileSystemIsCaseSensitive()'/>
+ <option type='bool' id='HIDE_SCOPE_NAMES' docs='
+If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+will show members with their full class and namespace scopes in the
+documentation. If set to YES the scope will be hidden.
+' defval='0'/>
+ <option type='bool' id='SHOW_INCLUDE_FILES' docs='
+If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+will put a list of the files that are included by a file in the documentation
+of that file.
+' defval='1'/>
+ <option type='bool' id='FORCE_LOCAL_INCLUDES' docs='
+If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+will list include files with double quotes in the documentation
+rather than with sharp brackets.
+' defval='0'/>
+ <option type='bool' id='INLINE_INFO' docs='
+If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+is inserted in the documentation for inline members.
+' defval='1'/>
+ <option type='bool' id='SORT_MEMBER_DOCS' docs='
+If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+will sort the (detailed) documentation of file and class members
+alphabetically by member name. If set to NO the members will appear in
+declaration order.
+' defval='1'/>
+ <option type='bool' id='SORT_BRIEF_DOCS' docs='
+If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+brief documentation of file, namespace and class members alphabetically
+by member name. If set to NO (the default) the members will appear in
+declaration order.
+' defval='0'/>
+ <option type='bool' id='SORT_MEMBERS_CTORS_1ST' docs='
+If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+will sort the (brief and detailed) documentation of class members so that
+constructors and destructors are listed first. If set to NO (the default)
+the constructors will appear in the respective orders defined by
+SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.' defval='0'/>
+ <option type='bool' id='SORT_GROUP_NAMES' docs='
+If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+hierarchy of group names into alphabetical order. If set to NO (the default)
+the group names will appear in their defined order.
+' defval='0'/>
+ <option type='bool' id='SORT_BY_SCOPE_NAME' docs='
+If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+sorted by fully-qualified names, including namespaces. If set to
+NO (the default), the class list will be sorted only by class name,
+not including the namespace part.
+Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+Note: This option applies only to the class list, not to the
+alphabetical list.
+' defval='0'/>
+ <option type='bool' id='STRICT_PROTO_MATCHING' docs='
+If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+do proper type resolution of all parameters of a function it will reject a
+match between the prototype and the implementation of a member function even
+if there is only one candidate or it is obvious which candidate to choose
+by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+will still accept a match between prototype and implementation in such cases.
+' defval='0'/>
+ <option type='bool' id='GENERATE_TODOLIST' docs='
+The GENERATE_TODOLIST tag can be used to enable (YES) or
+disable (NO) the todo list. This list is created by putting \todo
+commands in the documentation.
+' defval='1'/>
+ <option type='bool' id='GENERATE_TESTLIST' docs='
+The GENERATE_TESTLIST tag can be used to enable (YES) or
+disable (NO) the test list. This list is created by putting \test
+commands in the documentation.
+' defval='1'/>
+ <option type='bool' id='GENERATE_BUGLIST' docs='
+The GENERATE_BUGLIST tag can be used to enable (YES) or
+disable (NO) the bug list. This list is created by putting \bug
+commands in the documentation.
+' defval='1'/>
+ <option type='bool' id='GENERATE_DEPRECATEDLIST' docs='
+The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+disable (NO) the deprecated list. This list is created by putting
+\deprecated commands in the documentation.
+' defval='1'/>
+ <option type='list' id='ENABLED_SECTIONS' format='string' docs='
+The ENABLED_SECTIONS tag can be used to enable conditional
+documentation sections, marked by \if sectionname ... \endif.
+'>
+ </option>
+ <option type='int' id='MAX_INITIALIZER_LINES' docs='
+The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+the initial value of a variable or macro consists of for it to appear in
+the documentation. If the initializer consists of more lines than specified
+here it will be hidden. Use a value of 0 to hide initializers completely.
+The appearance of the initializer of individual variables and macros in the
+documentation can be controlled using \showinitializer or \hideinitializer
+command in the documentation regardless of this setting.
+' minval='0' maxval='10000' defval='30'/>
+ <option type='bool' id='SHOW_USED_FILES' docs='
+Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+at the bottom of the documentation of classes and structs. If set to YES the
+list will mention the files that were used to generate the documentation.
+' defval='1'/>
+ <option type='bool' id='SHOW_DIRECTORIES' docs='
+If the sources in your project are distributed over multiple directories
+then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+in the documentation. The default is NO.
+' defval='0'/>
+ <option type='bool' id='SHOW_FILES' docs='
+Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+This will remove the Files entry from the Quick Index and from the
+Folder Tree View (if specified). The default is YES.
+' defval='1'/>
+ <option type='bool' id='SHOW_NAMESPACES' docs='
+Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+Namespaces page. This will remove the Namespaces entry from the Quick Index
+and from the Folder Tree View (if specified). The default is YES.
+' defval='1'/>
+ <option type='string' id='FILE_VERSION_FILTER' format='file' docs='
+The FILE_VERSION_FILTER tag can be used to specify a program or script that
+doxygen should invoke to get the current version for each file (typically from
+the version control system). Doxygen will invoke the program by executing (via
+popen()) the command &lt;command&gt; &lt;input-file&gt;, where &lt;command&gt; is the value of
+the FILE_VERSION_FILTER tag, and &lt;input-file&gt; is the name of an input file
+provided by doxygen. Whatever the program writes to standard output
+is used as the file version. See the manual for examples.
+' defval=''/>
+ <option type='string' id='LAYOUT_FILE' format='file' docs='
+The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+by doxygen. The layout file controls the global structure of the generated
+output files in an output format independent way. The create the layout file
+that represents doxygen&apos;s defaults, run doxygen with the -l option.
+You can optionally specify a file name after the option, if omitted
+DoxygenLayout.xml will be used as the name of the layout file.
+' defval=''/>
+ </group>
+ <group name='Messages' docs='configuration options related to warning and progress messages'>
+ <option type='bool' id='QUIET' docs='
+The QUIET tag can be used to turn on/off the messages that are generated
+by doxygen. Possible values are YES and NO. If left blank NO is used.
+' defval='0'/>
+ <option type='bool' id='WARNINGS' docs='
+The WARNINGS tag can be used to turn on/off the warning messages that are
+generated by doxygen. Possible values are YES and NO. If left blank
+NO is used.
+' defval='1'/>
+ <option type='bool' id='WARN_IF_UNDOCUMENTED' docs='
+If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+automatically be disabled.
+' defval='1'/>
+ <option type='bool' id='WARN_IF_DOC_ERROR' docs='
+If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+potential errors in the documentation, such as not documenting some
+parameters in a documented function, or documenting parameters that
+don&apos;t exist or using markup commands wrongly.
+' defval='1'/>
+ <option type='bool' id='WARN_NO_PARAMDOC' docs='
+The WARN_NO_PARAMDOC option can be enabled to get warnings for
+functions that are documented, but have no documentation for their parameters
+or return value. If set to NO (the default) doxygen will only warn about
+wrong or incomplete parameter documentation, but not about the absence of
+documentation.
+' defval='0'/>
+ <option type='string' id='WARN_FORMAT' format='string' docs='
+The WARN_FORMAT tag determines the format of the warning messages that
+doxygen can produce. The string should contain the $file, $line, and $text
+tags, which will be replaced by the file and line number from which the
+warning originated and the warning text. Optionally the format may contain
+$version, which will be replaced by the version of the file (if it could
+be obtained via FILE_VERSION_FILTER)
+' defval='$file:$line: $text'/>
+ <option type='string' id='WARN_LOGFILE' format='file' docs='
+The WARN_LOGFILE tag can be used to specify a file to which warning
+and error messages should be written. If left blank the output is written
+to stderr.
+' defval=''/>
+ </group>
+ <group name='Input' docs='configuration options related to the input files'>
+ <option type='list' id='INPUT' format='filedir' docs='
+The INPUT tag can be used to specify the files and/or directories that contain
+documented source files. You may enter file names like &quot;myfile.cpp&quot; or
+directories like &quot;/usr/src/myproject&quot;. Separate the files or directories
+with spaces.
+'>
+ <value name=''/>
+ </option>
+ <option type='string' id='INPUT_ENCODING' format='string' docs='
+This tag can be used to specify the character encoding of the source files
+that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+also the default input encoding. Doxygen uses libiconv (or the iconv built
+into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+the list of possible encodings.
+' defval='UTF-8'/>
+ <option type='list' id='FILE_PATTERNS' format='string' docs='
+If the value of the INPUT tag contains directories, you can use the
+FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+and *.h) to filter out the source-files in the directories. If left
+blank the following patterns are tested:
+*.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+*.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+*.f90 *.f *.for *.vhd *.vhdl
+'>
+ <value name='*.c'/>
+ <value name='*.cc'/>
+ <value name='*.cxx'/>
+ <value name='*.cpp'/>
+ <value name='*.c++'/>
+ <value name='*.d'/>
+ <value name='*.java'/>
+ <value name='*.ii'/>
+ <value name='*.ixx'/>
+ <value name='*.ipp'/>
+ <value name='*.i++'/>
+ <value name='*.inl'/>
+ <value name='*.h'/>
+ <value name='*.hh'/>
+ <value name='*.hxx'/>
+ <value name='*.hpp'/>
+ <value name='*.h++'/>
+ <value name='*.idl'/>
+ <value name='*.odl'/>
+ <value name='*.cs'/>
+ <value name='*.php'/>
+ <value name='*.php3'/>
+ <value name='*.inc'/>
+ <value name='*.m'/>
+ <value name='*.mm'/>
+ <value name='*.dox'/>
+ <value name='*.py'/>
+ <value name='*.f90'/>
+ <value name='*.f'/>
+ <value name='*.for'/>
+ <value name='*.vhd'/>
+ <value name='*.vhdl'/>
+ </option>
+ <option type='bool' id='RECURSIVE' docs='
+The RECURSIVE tag can be used to turn specify whether or not subdirectories
+should be searched for input files as well. Possible values are YES and NO.
+If left blank NO is used.
+' defval='0'/>
+ <option type='list' id='EXCLUDE' format='filedir' docs='
+The EXCLUDE tag can be used to specify files and/or directories that should
+excluded from the INPUT source files. This way you can easily exclude a
+subdirectory from a directory tree whose root is specified with the INPUT tag.
+'>
+ </option>
+ <option type='bool' id='EXCLUDE_SYMLINKS' docs='
+The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+directories that are symbolic links (a Unix file system feature) are excluded
+from the input.
+' defval='0'/>
+ <option type='list' id='EXCLUDE_PATTERNS' format='string' docs='
+If the value of the INPUT tag contains directories, you can use the
+EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+certain files from those directories. Note that the wildcards are matched
+against the file with absolute path, so to exclude all test directories
+for example use the pattern */test/*
+'>
+ </option>
+ <option type='list' id='EXCLUDE_SYMBOLS' format='string' docs='
+The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+(namespaces, classes, functions, etc.) that should be excluded from the
+output. The symbol name can be a fully qualified name, a word, or if the
+wildcard * is used, a substring. Examples: ANamespace, AClass,
+AClass::ANamespace, ANamespace::*Test
+'>
+ </option>
+ <option type='list' id='EXAMPLE_PATH' format='dir' docs='
+The EXAMPLE_PATH tag can be used to specify one or more files or
+directories that contain example code fragments that are included (see
+the \include command).
+'>
+ </option>
+ <option type='list' id='EXAMPLE_PATTERNS' format='string' docs='
+If the value of the EXAMPLE_PATH tag contains directories, you can use the
+EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+and *.h) to filter out the source-files in the directories. If left
+blank all files are included.
+'>
+ <value name='*'/>
+ </option>
+ <option type='bool' id='EXAMPLE_RECURSIVE' docs='
+If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+searched for input files to be used with the \include or \dontinclude
+commands irrespective of the value of the RECURSIVE tag.
+Possible values are YES and NO. If left blank NO is used.
+' defval='0'/>
+ <option type='list' id='IMAGE_PATH' format='dir' docs='
+The IMAGE_PATH tag can be used to specify one or more files or
+directories that contain image that are included in the documentation (see
+the \image command).
+'>
+ </option>
+ <option type='string' id='INPUT_FILTER' format='file' docs='
+The INPUT_FILTER tag can be used to specify a program that doxygen should
+invoke to filter for each input file. Doxygen will invoke the filter program
+by executing (via popen()) the command &lt;filter&gt; &lt;input-file&gt;, where &lt;filter&gt;
+is the value of the INPUT_FILTER tag, and &lt;input-file&gt; is the name of an
+input file. Doxygen will then use the output that the filter program writes
+to standard output. If FILTER_PATTERNS is specified, this tag will be
+ignored.
+' defval=''/>
+ <option type='list' id='FILTER_PATTERNS' format='string' docs='
+The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+basis. Doxygen will compare the file name with each pattern and apply the
+filter if there is a match. The filters are a list of the form:
+pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+info on how filters are used. If FILTER_PATTERNS is empty or if
+non of the patterns match the file name, INPUT_FILTER is applied.
+'>
+ </option>
+ <option type='bool' id='FILTER_SOURCE_FILES' docs='
+If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+INPUT_FILTER) will be used to filter the input files when producing source
+files to browse (i.e. when SOURCE_BROWSER is set to YES).
+' defval='0'/>
+ <option type='list' id='FILTER_SOURCE_PATTERNS' format='string' docs='
+The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+and it is also possible to disable source filtering for a specific pattern
+using *.ext= (so without naming a filter). This option only has effect when
+FILTER_SOURCE_FILES is enabled.
+' depends='FILTER_SOURCE_FILES'/>
+ </group>
+ <group name='Source Browser' docs='configuration options related to source browsing'>
+ <option type='bool' id='SOURCE_BROWSER' docs='
+If the SOURCE_BROWSER tag is set to YES then a list of source files will
+be generated. Documented entities will be cross-referenced with these sources.
+Note: To get rid of all source code in the generated output, make sure also
+VERBATIM_HEADERS is set to NO.
+' defval='0'/>
+ <option type='bool' id='INLINE_SOURCES' docs='
+Setting the INLINE_SOURCES tag to YES will include the body
+of functions and classes directly in the documentation.
+' defval='0'/>
+ <option type='bool' id='STRIP_CODE_COMMENTS' docs='
+Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+doxygen to hide any special comment blocks from generated source code
+fragments. Normal C and C++ comments will always remain visible.
+' defval='1'/>
+ <option type='bool' id='REFERENCED_BY_RELATION' docs='
+If the REFERENCED_BY_RELATION tag is set to YES
+then for each documented function all documented
+functions referencing it will be listed.
+' defval='0'/>
+ <option type='bool' id='REFERENCES_RELATION' docs='
+If the REFERENCES_RELATION tag is set to YES
+then for each documented function all documented entities
+called/used by that function will be listed.
+' defval='0'/>
+ <option type='bool' id='REFERENCES_LINK_SOURCE' docs='
+If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+link to the source code. Otherwise they will link to the documentation.
+' defval='1'/>
+ <option type='bool' id='USE_HTAGS' docs='
+If the USE_HTAGS tag is set to YES then the references to source code
+will point to the HTML generated by the htags(1) tool instead of doxygen
+built-in source browser. The htags tool is part of GNU&apos;s global source
+tagging system (see http://www.gnu.org/software/global/global.html). You
+will need version 4.8.6 or higher.
+' defval='0' depends='SOURCE_BROWSER'/>
+ <option type='bool' id='VERBATIM_HEADERS' docs='
+If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+will generate a verbatim copy of the header file for each class for
+which an include is specified. Set to NO to disable this.
+' defval='1'/>
+ </group>
+ <group name='Index' docs='configuration options related to the alphabetical class index'>
+ <option type='bool' id='ALPHABETICAL_INDEX' docs='
+If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+of all compounds will be generated. Enable this if the project
+contains a lot of classes, structs, unions or interfaces.
+' defval='1'/>
+ <option type='int' id='COLS_IN_ALPHA_INDEX' docs='
+If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+in which this list will be split (can be a number in the range [1..20])
+' minval='1' maxval='20' defval='5'/>
+ <option type='list' id='IGNORE_PREFIX' format='string' docs='
+In case all classes in a project start with a common prefix, all
+classes will be put under the same header in the alphabetical index.
+The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+should be ignored while generating the index headers.
+'>
+ </option>
+ </group>
+ <group name='HTML' docs='configuration options related to the HTML output'>
+ <option type='bool' id='GENERATE_HTML' docs='
+If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+generate HTML output.
+' defval='1'/>
+ <option type='string' id='HTML_OUTPUT' format='dir' docs='
+The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+If a relative path is entered the value of OUTPUT_DIRECTORY will be
+put in front of it. If left blank `html&apos; will be used as the default path.
+' defval='html' depends='GENERATE_HTML'/>
+ <option type='string' id='HTML_FILE_EXTENSION' format='string' docs='
+The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+doxygen will generate files with .html extension.
+' defval='.html' depends='GENERATE_HTML'/>
+ <option type='string' id='HTML_HEADER' format='file' docs='
+The HTML_HEADER tag can be used to specify a personal HTML header for
+each generated HTML page. If it is left blank doxygen will generate a
+standard header. Note that when using a custom header you are responsible
+for the proper inclusion of any scripts and style sheets that doxygen
+needs, which is dependent on the configuration options used.
+It is adviced to generate a default header using "doxygen -w html
+header.html footer.html stylesheet.css YourConfigFile" and then modify
+that header. Note that the header is subject to change so you typically
+have to redo this when upgrading to a newer version of doxygen or when
+changing the value of configuration settings such as GENERATE_TREEVIEW!
+' defval='' depends='GENERATE_HTML'/>
+ <option type='string' id='HTML_FOOTER' format='file' docs='
+The HTML_FOOTER tag can be used to specify a personal HTML footer for
+each generated HTML page. If it is left blank doxygen will generate a
+standard footer.
+' defval='' depends='GENERATE_HTML'/>
+ <option type='string' id='HTML_STYLESHEET' format='file' docs='
+The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+style sheet that is used by each HTML page. It can be used to
+fine-tune the look of the HTML output. If the tag is left blank doxygen
+will generate a default style sheet. Note that doxygen will try to copy
+the style sheet file to the HTML output directory, so don&apos;t put your own
+stylesheet in the HTML output directory as well, or it will be erased!
+' defval='' depends='GENERATE_HTML'/>
+ <option type='list' id='HTML_EXTRA_FILES' format='file' docs='
+The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+other source files which should be copied to the HTML output directory. Note
+that these files will be copied to the base HTML output directory. Use the
+$relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+files. In the HTML_STYLESHEET file, use the file name only. Also note that
+the files will be copied as-is; there are no commands or markers available.
+' depends='GENERATE_HTML'/>
+ <option type='int' id='HTML_COLORSTYLE_HUE' docs='
+The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+Doxygen will adjust the colors in the stylesheet and background images
+according to this color. Hue is specified as an angle on a colorwheel,
+see http://en.wikipedia.org/wiki/Hue for more information.
+For instance the value 0 represents red, 60 is yellow, 120 is green,
+180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+The allowed range is 0 to 359.
+' minval='0' maxval='359' defval='220' depends='GENERATE_HTML'/>
+ <option type='int' id='HTML_COLORSTYLE_SAT' docs='
+The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+the colors in the HTML output. For a value of 0 the output will use
+grayscales only. A value of 255 will produce the most vivid colors.
+' minval='0' maxval='255' defval='100' depends='GENERATE_HTML'/>
+ <option type='int' id='HTML_COLORSTYLE_GAMMA' docs='
+The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+the luminance component of the colors in the HTML output. Values below
+100 gradually make the output lighter, whereas values above 100 make
+the output darker. The value divided by 100 is the actual gamma applied,
+so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+and 100 does not change the gamma.
+' minval='40' maxval='240' defval='80'/>
+ <option type='bool' id='HTML_TIMESTAMP' docs='
+If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+page will contain the date and time when the page was generated. Setting
+this to NO can help when comparing the output of multiple runs.
+' defval='1' depends='GENERATE_HTML'/>
+ <option type='bool' id='HTML_ALIGN_MEMBERS' docs='
+If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+files or namespaces will be aligned in HTML using tables. If set to
+NO a bullet list will be used.
+' defval='1' depends='GENERATE_HTML'/>
+ <option type='bool' id='HTML_DYNAMIC_SECTIONS' docs='
+If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+documentation will contain sections that can be hidden and shown after the
+page has loaded. For this to work a browser that supports
+JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+' defval='0' depends='GENERATE_HTML'/>
+ <option type='bool' id='GENERATE_DOCSET' docs='
+If the GENERATE_DOCSET tag is set to YES, additional index files
+will be generated that can be used as input for Apple&apos;s Xcode 3
+integrated development environment, introduced with OSX 10.5 (Leopard).
+To create a documentation set, doxygen will generate a Makefile in the
+HTML output directory. Running make will produce the docset in that
+directory and running &quot;make install&quot; will install the docset in
+~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+it at startup.
+See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+for more information.
+' defval='0' depends='GENERATE_HTML'/>
+ <option type='string' id='DOCSET_FEEDNAME' format='string' docs='
+When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+feed. A documentation feed provides an umbrella under which multiple
+documentation sets from a single provider (such as a company or product suite)
+can be grouped.
+' defval='Doxygen generated docs' depends='GENERATE_DOCSET'/>
+ <option type='string' id='DOCSET_BUNDLE_ID' format='string' docs='
+When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+should uniquely identify the documentation set bundle. This should be a
+reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+will append .docset to the name.
+' defval='org.doxygen.Project' depends='GENERATE_DOCSET'/>
+ <option type='string' id='DOCSET_PUBLISHER_ID' format='string' docs='
+When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+the documentation publisher. This should be a reverse domain-name style
+string, e.g. com.mycompany.MyDocSet.documentation.
+' defval='org.doxygen.Publisher' depends='GENERATE_DOCSET'/>
+ <option type='string' id='DOCSET_PUBLISHER_NAME' format='string' docs='
+The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+' defval='Publisher' depends='GENERATE_DOCSET'/>
+ <option type='bool' id='GENERATE_HTMLHELP' docs='
+If the GENERATE_HTMLHELP tag is set to YES, additional index files
+will be generated that can be used as input for tools like the
+Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+of the generated HTML documentation.
+' defval='0' depends='GENERATE_HTML'/>
+ <option type='string' id='CHM_FILE' format='file' docs='
+If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+be used to specify the file name of the resulting .chm file. You
+can add a path in front of the file if the result should not be
+written to the html output directory.
+' defval='' depends='GENERATE_HTMLHELP'/>
+ <option type='string' id='HHC_LOCATION' format='file' docs='
+If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+be used to specify the location (absolute path including file name) of
+the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+the HTML help compiler on the generated index.hhp.
+' defval='' depends='GENERATE_HTMLHELP' abspath='1'/>
+ <option type='bool' id='GENERATE_CHI' docs='
+If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+controls if a separate .chi index file is generated (YES) or that
+it should be included in the master .chm file (NO).
+' defval='0' depends='GENERATE_HTMLHELP'/>
+ <option type='string' id='CHM_INDEX_ENCODING' format='string' docs='
+If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+is used to encode HtmlHelp index (hhk), content (hhc) and project file
+content.
+' defval='' depends='GENERATE_HTMLHELP'/>
+ <option type='bool' id='BINARY_TOC' docs='
+If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+controls whether a binary table of contents is generated (YES) or a
+normal table of contents (NO) in the .chm file.
+' defval='0' depends='GENERATE_HTMLHELP'/>
+ <option type='bool' id='TOC_EXPAND' docs='
+The TOC_EXPAND flag can be set to YES to add extra items for group members
+to the contents of the HTML help documentation and to the tree view.
+' defval='0' depends='GENERATE_HTMLHELP'/>
+ <option type='bool' id='GENERATE_QHP' docs='
+If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+that can be used as input for Qt&apos;s qhelpgenerator to generate a
+Qt Compressed Help (.qch) of the generated HTML documentation.
+' defval='0' depends='GENERATE_HTML'/>
+ <option type='string' id='QCH_FILE' format='file' docs='
+If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+be used to specify the file name of the resulting .qch file.
+The path specified is relative to the HTML output folder.
+' defval='' depends='GENERATE_QHP'/>
+ <option type='string' id='QHP_NAMESPACE' format='string' docs='
+The QHP_NAMESPACE tag specifies the namespace to use when generating
+Qt Help Project output. For more information please see
+http://doc.trolltech.com/qthelpproject.html#namespace
+' defval='org.doxygen.Project' depends='GENERATE_QHP'/>
+ <option type='string' id='QHP_VIRTUAL_FOLDER' format='string' docs='
+The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+Qt Help Project output. For more information please see
+http://doc.trolltech.com/qthelpproject.html#virtual-folders
+' defval='doc' depends='GENERATE_QHP'/>
+ <option type='string' id='QHP_CUST_FILTER_NAME' format='string' docs='
+If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+add. For more information please see
+http://doc.trolltech.com/qthelpproject.html#custom-filters
+' defval='' depends='GENERATE_QHP'/>
+ <option type='string' id='QHP_CUST_FILTER_ATTRS' format='string' docs='
+The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+custom filter to add. For more information please see
+&lt;a href=&quot;http://doc.trolltech.com/qthelpproject.html#custom-filters&quot;&gt;
+Qt Help Project / Custom Filters&lt;/a&gt;.
+' defval='' depends='GENERATE_QHP'/>
+ <option type='string' id='QHP_SECT_FILTER_ATTRS' format='string' docs='
+The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+project&apos;s
+filter section matches.
+&lt;a href=&quot;http://doc.trolltech.com/qthelpproject.html#filter-attributes&quot;&gt;
+Qt Help Project / Filter Attributes&lt;/a&gt;.
+' defval='' depends='GENERATE_QHP'/>
+ <option type='string' id='QHG_LOCATION' format='file' docs='
+If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+be used to specify the location of Qt&apos;s qhelpgenerator.
+If non-empty doxygen will try to run qhelpgenerator on the generated
+.qhp file.
+' defval='' depends='GENERATE_QHP'/>
+ <option type='bool' id='GENERATE_ECLIPSEHELP' docs='
+If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+will be generated, which together with the HTML files, form an Eclipse help
+plugin. To install this plugin and make it available under the help contents
+menu in Eclipse, the contents of the directory containing the HTML and XML
+files needs to be copied into the plugins directory of eclipse. The name of
+the directory within the plugins directory should be the same as
+the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+the help appears.
+' defval='0' depends='GENERATE_HTML'/>
+ <option type='string' id='ECLIPSE_DOC_ID' docs='
+A unique identifier for the eclipse help plugin. When installing the plugin
+the directory name containing the HTML and XML files should also have
+this name.
+' defval='org.doxygen.Project' depends='GENERATE_ECLIPSEHELP'/>
+ <option type='bool' id='DISABLE_INDEX' docs='
+The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+top of each HTML page. The value NO (the default) enables the index and
+the value YES disables it.
+' defval='0' depends='GENERATE_HTML'/>
+ <option type='int' id='ENUM_VALUES_PER_LINE' docs='
+The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+(range [0,1..20]) that doxygen will group on one line in the generated HTML
+documentation. Note that a value of 0 will completely suppress the enum
+values from appearing in the overview section.
+' minval='0' maxval='20' defval='4' depends='GENERATE_HTML'/>
+ <option type='bool' id='GENERATE_TREEVIEW' defval='0' docs='
+The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+structure should be generated to display hierarchical information.
+If the tag value is set to YES, a side panel will be generated
+containing a tree-like index structure (just like the one that
+is generated for HTML Help). For this to work a browser that supports
+JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+Windows users are probably better off using the HTML help feature.
+' depends='GENERATE_HTML'/>
+ <option type='bool' id='USE_INLINE_TREES' defval='0' docs='
+By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+and Class Hierarchy pages using a tree view instead of an ordered list.
+' depends='GENERATE_HTML'/>
+ <option type='int' id='TREEVIEW_WIDTH' docs='
+If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+used to set the initial width (in pixels) of the frame in which the tree
+is shown.
+' minval='0' maxval='1500' defval='250' depends='GENERATE_HTML'/>
+ <option type='bool' id='EXT_LINKS_IN_WINDOW' defval='0' docs='
+When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+links to external symbols imported via tag files in a separate window.
+' depends='GENERATE_HTML'/>
+ <option type='int' id='FORMULA_FONTSIZE' docs='
+Use this tag to change the font size of Latex formulas included
+as images in the HTML documentation. The default is 10. Note that
+when you change the font size after a successful doxygen run you need
+to manually remove any form_*.png images from the HTML output directory
+to force them to be regenerated.
+' minval='8' maxval='50' defval='10' depends='GENERATE_HTML'/>
+ <option type='bool' id='FORMULA_TRANSPARENT' docs='
+Use the FORMULA_TRANPARENT tag to determine whether or not the images
+generated for formulas are transparent PNGs. Transparent PNGs are
+not supported properly for IE 6.0, but are supported on all modern browsers.
+Note that when changing this option you need to delete any form_*.png files
+in the HTML output before the changes have effect.
+' defval='1' depends='GENERATE_HTML'/>
+ <option type='bool' id='USE_MATHJAX' docs='
+Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+(see http://www.mathjax.org) which uses client side Javascript for the
+rendering instead of using prerendered bitmaps. Use this if you do not
+have LaTeX installed or if you want to formulas look prettier in the HTML
+output. When enabled you also need to install MathJax separately and
+configure the path to it using the MATHJAX_RELPATH option.
+' defval='0'/>
+ <option type='string' id='MATHJAX_RELPATH' docs='
+When MathJax is enabled you need to specify the location relative to the
+HTML output directory using the MATHJAX_RELPATH option. The destination
+directory should contain the MathJax.js script. For instance, if the mathjax
+directory is located at the same level as the HTML output directory, then
+MATHJAX_RELPATH should be ../mathjax. The default value points to the
+mathjax.org site, so you can quickly see the result without installing
+MathJax, but it is strongly recommended to install a local copy of MathJax
+before deployment.
+' defval='http://www.mathjax.org/mathjax'/>
+ <option type='bool' id='SEARCHENGINE' docs='
+When the SEARCHENGINE tag is enabled doxygen will generate a search box
+for the HTML output. The underlying search engine uses javascript
+and DHTML and should work on any modern browser. Note that when using
+HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+(GENERATE_DOCSET) there is already a search function so this one should
+typically be disabled. For large projects the javascript based search engine
+can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+' defval='1' depends='GENERATE_HTML'/>
+ <option type='bool' id='SERVER_BASED_SEARCH' docs='
+When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+implemented using a PHP enabled web server instead of at the web client
+using Javascript. Doxygen will generate the search PHP script and index
+file to put on the web server. The advantage of the server
+based approach is that it scales better to large projects and allows
+full text search. The disadvantages are that it is more difficult to setup
+and does not have live searching capabilities.
+' defval='0' depends='SEARCHENGINE'/>
+ </group>
+ <group name='LaTeX' docs='configuration options related to the LaTeX output'>
+ <option type='bool' id='GENERATE_LATEX' docs='
+If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+generate Latex output.
+' defval='1'/>
+ <option type='string' id='LATEX_OUTPUT' format='dir' docs='
+The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+If a relative path is entered the value of OUTPUT_DIRECTORY will be
+put in front of it. If left blank `latex&apos; will be used as the default path.
+' defval='latex' depends='GENERATE_LATEX'/>
+ <option type='string' id='LATEX_CMD_NAME' format='file' docs='
+The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+invoked. If left blank `latex&apos; will be used as the default command name.
+Note that when enabling USE_PDFLATEX this option is only used for
+generating bitmaps for formulas in the HTML output, but not in the
+Makefile that is written to the output directory.
+' defval='latex' depends='GENERATE_LATEX'/>
+ <option type='string' id='MAKEINDEX_CMD_NAME' format='file' docs='
+The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+generate index for LaTeX. If left blank `makeindex&apos; will be used as the
+default command name.
+' defval='makeindex' depends='GENERATE_LATEX'/>
+ <option type='bool' id='COMPACT_LATEX' docs='
+If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+LaTeX documents. This may be useful for small projects and may help to
+save some trees in general.
+' defval='0' depends='GENERATE_LATEX'/>
+ <option type='enum' id='PAPER_TYPE' defval='a4' docs='
+The PAPER_TYPE tag can be used to set the paper type that is used
+by the printer. Possible values are: a4, letter, legal and
+executive. If left blank a4wide will be used.
+' depends='GENERATE_LATEX'>
+ <value name='a4'/>
+ <value name='a4wide'/>
+ <value name='letter'/>
+ <value name='legal'/>
+ <value name='executive'/>
+ </option>
+ <option type='list' id='EXTRA_PACKAGES' format='string' docs='
+The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+packages that should be included in the LaTeX output.
+' depends='GENERATE_LATEX'>
+ </option>
+ <option type='string' id='LATEX_HEADER' format='file' docs='
+The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+the generated latex document. The header should contain everything until
+the first chapter. If it is left blank doxygen will generate a
+standard header. Notice: only use this tag if you know what you are doing!
+' defval='' depends='GENERATE_LATEX'/>
+ <option type='string' id='LATEX_FOOTER' format='file' docs='
+The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+the generated latex document. The footer should contain everything after
+the last chapter. If it is left blank doxygen will generate a
+standard footer. Notice: only use this tag if you know what you are doing!
+' defval='' depends='GENERATE_LATEX'/>
+ <option type='bool' id='PDF_HYPERLINKS' docs='
+If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+is prepared for conversion to pdf (using ps2pdf). The pdf file will
+contain links (just like the HTML output) instead of page references
+This makes the output suitable for online browsing using a pdf viewer.
+' defval='1' depends='GENERATE_LATEX'/>
+ <option type='bool' id='USE_PDFLATEX' docs='
+If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+plain latex in the generated Makefile. Set this option to YES to get a
+higher quality PDF documentation.
+' defval='1' depends='GENERATE_LATEX'/>
+ <option type='bool' id='LATEX_BATCHMODE' docs='
+If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+command to the generated LaTeX files. This will instruct LaTeX to keep
+running if errors occur, instead of asking the user for help.
+This option is also used when generating formulas in HTML.
+' defval='0' depends='GENERATE_LATEX'/>
+ <option type='bool' id='LATEX_HIDE_INDICES' docs='
+If LATEX_HIDE_INDICES is set to YES then doxygen will not
+include the index chapters (such as File Index, Compound Index, etc.)
+in the output.
+' defval='0' depends='GENERATE_LATEX'/>
+ <option type='bool' id='LATEX_SOURCE_CODE' docs='
+If LATEX_SOURCE_CODE is set to YES then doxygen will include
+source code with syntax highlighting in the LaTeX output.
+Note that which sources are shown also depends on other settings
+such as SOURCE_BROWSER.
+' defval='0' depends='GENERATE_LATEX'/>
+ </group>
+ <group name='RTF' docs='configuration options related to the RTF output'>
+ <option type='bool' id='GENERATE_RTF' docs='
+If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+The RTF output is optimized for Word 97 and may not look very pretty with
+other RTF readers or editors.
+' defval='0'/>
+ <option type='string' id='RTF_OUTPUT' format='dir' docs='
+The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+If a relative path is entered the value of OUTPUT_DIRECTORY will be
+put in front of it. If left blank `rtf&apos; will be used as the default path.
+' defval='rtf' depends='GENERATE_RTF'/>
+ <option type='bool' id='COMPACT_RTF' docs='
+If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+RTF documents. This may be useful for small projects and may help to
+save some trees in general.
+' defval='0' depends='GENERATE_RTF'/>
+ <option type='bool' id='RTF_HYPERLINKS' docs='
+If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+will contain hyperlink fields. The RTF file will
+contain links (just like the HTML output) instead of page references.
+This makes the output suitable for online browsing using WORD or other
+programs which support those fields.
+Note: wordpad (write) and others do not support links.
+' defval='0' depends='GENERATE_RTF'/>
+ <option type='string' id='RTF_STYLESHEET_FILE' format='file' docs='
+Load stylesheet definitions from file. Syntax is similar to doxygen&apos;s
+config file, i.e. a series of assignments. You only have to provide
+replacements, missing definitions are set to their default value.
+' defval='' depends='GENERATE_RTF'/>
+ <option type='string' id='RTF_EXTENSIONS_FILE' format='file' docs='
+Set optional variables used in the generation of an rtf document.
+Syntax is similar to doxygen&apos;s config file.
+' defval='' depends='GENERATE_RTF'/>
+ </group>
+ <group name='Man' docs='configuration options related to the man page output'>
+ <option type='bool' id='GENERATE_MAN' docs='
+If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+generate man pages
+' defval='0'/>
+ <option type='string' id='MAN_OUTPUT' format='dir' docs='
+The MAN_OUTPUT tag is used to specify where the man pages will be put.
+If a relative path is entered the value of OUTPUT_DIRECTORY will be
+put in front of it. If left blank `man&apos; will be used as the default path.
+' defval='man' depends='GENERATE_MAN'/>
+ <option type='string' id='MAN_EXTENSION' format='string' docs='
+The MAN_EXTENSION tag determines the extension that is added to
+the generated man pages (default is the subroutine&apos;s section .3)
+' defval='.3' depends='GENERATE_MAN'/>
+ <option type='bool' id='MAN_LINKS' docs='
+If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+then it will generate one additional man file for each entity
+documented in the real man page(s). These additional files
+only source the real man page, but without them the man command
+would be unable to find the correct page. The default is NO.
+' defval='0' depends='GENERATE_MAN'/>
+ </group>
+ <group name='XML' docs='configuration options related to the XML output'>
+ <option type='bool' id='GENERATE_XML' docs='
+If the GENERATE_XML tag is set to YES Doxygen will
+generate an XML file that captures the structure of
+the code including all documentation.
+' defval='0'/>
+ <option type='string' id='XML_OUTPUT' format='dir' docs='
+The XML_OUTPUT tag is used to specify where the XML pages will be put.
+If a relative path is entered the value of OUTPUT_DIRECTORY will be
+put in front of it. If left blank `xml&apos; will be used as the default path.
+' defval='xml' depends='GENERATE_XML'/>
+ <option type='string' id='XML_SCHEMA' format='string' docs='
+The XML_SCHEMA tag can be used to specify an XML schema,
+which can be used by a validating XML parser to check the
+syntax of the XML files.
+' defval='' depends='GENERATE_XML'/>
+ <option type='string' id='XML_DTD' format='string' docs='
+The XML_DTD tag can be used to specify an XML DTD,
+which can be used by a validating XML parser to check the
+syntax of the XML files.
+' defval='' depends='GENERATE_XML'/>
+ <option type='bool' id='XML_PROGRAMLISTING' docs='
+If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+dump the program listings (including syntax highlighting
+and cross-referencing information) to the XML output. Note that
+enabling this will significantly increase the size of the XML output.
+' defval='1' depends='GENERATE_XML'/>
+ </group>
+ <group name='DEF' docs='configuration options for the AutoGen Definitions output'>
+ <option type='bool' id='GENERATE_AUTOGEN_DEF' docs='
+If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+generate an AutoGen Definitions (see autogen.sf.net) file
+that captures the structure of the code including all
+documentation. Note that this feature is still experimental
+and incomplete at the moment.
+' defval='0'/>
+ </group>
+ <group name='PerlMod' docs='configuration options related to the Perl module output'>
+ <option type='bool' id='GENERATE_PERLMOD' docs='
+If the GENERATE_PERLMOD tag is set to YES Doxygen will
+generate a Perl module file that captures the structure of
+the code including all documentation. Note that this
+feature is still experimental and incomplete at the
+moment.
+' defval='0'/>
+ <option type='bool' id='PERLMOD_LATEX' docs='
+If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+the necessary Makefile rules, Perl scripts and LaTeX code to be able
+to generate PDF and DVI output from the Perl module output.
+' defval='0' depends='GENERATE_PERLMOD'/>
+ <option type='bool' id='PERLMOD_PRETTY' docs='
+If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+nicely formatted so it can be parsed by a human reader. This is useful
+if you want to understand what is going on. On the other hand, if this
+tag is set to NO the size of the Perl module output will be much smaller
+and Perl will parse it just the same.
+' defval='1' depends='GENERATE_PERLMOD'/>
+ <option type='string' id='PERLMOD_MAKEVAR_PREFIX' format='string' docs='
+The names of the make variables in the generated doxyrules.make file
+are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+This is useful so different doxyrules.make files included by the same
+Makefile don&apos;t overwrite each other&apos;s variables.' defval='' depends='GENERATE_PERLMOD'/>
+ </group>
+ <group name='Preprocessor' docs='Configuration options related to the preprocessor'>
+ <option type='bool' id='ENABLE_PREPROCESSING' docs='
+If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+evaluate all C-preprocessor directives found in the sources and include
+files.
+' defval='1'/>
+ <option type='bool' id='MACRO_EXPANSION' docs='
+If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+names in the source code. If set to NO (the default) only conditional
+compilation will be performed. Macro expansion can be done in a controlled
+way by setting EXPAND_ONLY_PREDEF to YES.
+' defval='0' depends='ENABLE_PREPROCESSING'/>
+ <option type='bool' id='EXPAND_ONLY_PREDEF' docs='
+If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+then the macro expansion is limited to the macros specified with the
+PREDEFINED and EXPAND_AS_DEFINED tags.
+' defval='0' depends='ENABLE_PREPROCESSING'/>
+ <option type='bool' id='SEARCH_INCLUDES' docs='
+If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+pointed to by INCLUDE_PATH will be searched when a #include is found.
+' defval='1' depends='ENABLE_PREPROCESSING'/>
+ <option type='list' id='INCLUDE_PATH' format='dir' docs='
+The INCLUDE_PATH tag can be used to specify one or more directories that
+contain include files that are not input files but should be processed by
+the preprocessor.
+' depends='ENABLE_PREPROCESSING'>
+ </option>
+ <option type='list' id='INCLUDE_FILE_PATTERNS' format='string' docs='
+You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+patterns (like *.h and *.hpp) to filter out the header-files in the
+directories. If left blank, the patterns specified with FILE_PATTERNS will
+be used.
+' depends='ENABLE_PREPROCESSING'>
+ </option>
+ <option type='list' id='PREDEFINED' format='string' docs='
+The PREDEFINED tag can be used to specify one or more macro names that
+are defined before the preprocessor is started (similar to the -D option of
+gcc). The argument of the tag is a list of macros of the form: name
+or name=definition (no spaces). If the definition and the = are
+omitted =1 is assumed. To prevent a macro definition from being
+undefined via #undef or recursively expanded use the := operator
+instead of the = operator.
+' depends='ENABLE_PREPROCESSING'>
+ </option>
+ <option type='list' id='EXPAND_AS_DEFINED' format='string' docs='
+If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+this tag can be used to specify a list of macro names that should be expanded.
+The macro definition that is found in the sources will be used.
+Use the PREDEFINED tag if you want to use a different macro definition that
+overrules the definition found in the source code.
+' depends='ENABLE_PREPROCESSING'>
+ </option>
+ <option type='bool' id='SKIP_FUNCTION_MACROS' docs='
+If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+doxygen&apos;s preprocessor will remove all references to function-like macros
+that are alone on a line, have an all uppercase name, and do not end with a
+semicolon, because these will confuse the parser if not removed.
+' defval='1' depends='ENABLE_PREPROCESSING'/>
+ </group>
+ <group name='External' docs='Configuration::additions related to external references'>
+ <option type='list' id='TAGFILES' format='file' docs='
+The TAGFILES option can be used to specify one or more tagfiles.
+Optionally an initial location of the external documentation
+can be added for each tagfile. The format of a tag file without
+this location is as follows:
+ TAGFILES = file1 file2 ...
+Adding location for the tag files is done as follows:
+ TAGFILES = file1=loc1 &quot;file2 = loc2&quot; ...
+where &quot;loc1&quot; and &quot;loc2&quot; can be relative or absolute paths or
+URLs. If a location is present for each tag, the installdox tool
+does not have to be run to correct the links.
+Note that each tag file must have a unique name
+(where the name does NOT include the path)
+If a tag file is not located in the directory in which doxygen
+is run, you must also specify the path to the tagfile here.
+'>
+ </option>
+ <option type='string' id='GENERATE_TAGFILE' format='file' docs='
+When a file name is specified after GENERATE_TAGFILE, doxygen will create
+a tag file that is based on the input files it reads.
+' defval=''/>
+ <option type='bool' id='ALLEXTERNALS' docs='
+If the ALLEXTERNALS tag is set to YES all external classes will be listed
+in the class index. If set to NO only the inherited external classes
+will be listed.
+' defval='0'/>
+ <option type='bool' id='EXTERNAL_GROUPS' docs='
+If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+in the modules index. If set to NO, only the current project&apos;s groups will
+be listed.
+' defval='1'/>
+ <option type='string' id='PERL_PATH' format='dir' docs='
+The PERL_PATH should be the absolute path and name of the perl script
+interpreter (i.e. the result of `which perl&apos;).
+' defval='/usr/bin/perl'/>
+ </group>
+ <group name='Dot' docs='Configuration options related to the dot tool'>
+ <option type='bool' id='CLASS_DIAGRAMS' docs='
+If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+or super classes. Setting the tag to NO turns the diagrams off. Note that
+this option also works with HAVE_DOT disabled, but it is recommended to
+install and use dot, since it yields more powerful graphs.
+' defval='1'/>
+ <option type='string' id='MSCGEN_PATH' format='string' docs='
+You can define message sequence charts within doxygen comments using the \msc
+command. Doxygen will then run the mscgen tool (see
+http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+documentation. The MSCGEN_PATH tag allows you to specify the directory where
+the mscgen tool resides. If left empty the tool is assumed to be found in the
+default search path.
+' defval=''/>
+ <option type='bool' id='HIDE_UNDOC_RELATIONS' docs='
+If set to YES, the inheritance and collaboration graphs will hide
+inheritance and usage relations if the target is undocumented
+or is not a class.
+' defval='1'/>
+ <option type='bool' id='HAVE_DOT' docs='
+If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+available from the path. This tool is part of Graphviz, a graph visualization
+toolkit from AT&amp;T and Lucent Bell Labs. The other options in this section
+have no effect if this option is set to NO (the default)
+' defval='0'/>
+ <option type='int' id='DOT_NUM_THREADS' docs='
+The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+allowed to run in parallel. When set to 0 (the default) doxygen will
+base this on the number of processors available in the system. You can set it
+explicitly to a value larger than 0 to get control over the balance
+between CPU load and processing speed.
+' defval='0' minval='0' maxval='32'/>
+ <option type='string' id='DOT_FONTNAME' format='string' docs='
+By default doxygen will write a font called Helvetica to the output
+directory and reference it in all dot files that doxygen generates.
+When you want a differently looking font you can specify the font name
+using DOT_FONTNAME. You need to make sure dot is able to find the font,
+which can be done by putting it in a standard location or by setting the
+DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+containing the font.
+' defval='Helvetica' depends='HAVE_DOT'/>
+ <option type='int' id='DOT_FONTSIZE' docs='
+The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+The default size is 10pt.
+' minval='4' maxval='24' defval='10' depends='HAVE_DOT'/>
+ <option type='string' id='DOT_FONTPATH' format='string' docs='
+By default doxygen will tell dot to use the output directory to look for the
+FreeSans.ttf font (which doxygen will put there itself). If you specify a
+different font using DOT_FONTNAME you can set the path where dot
+can find it using this tag.
+' defval='' depends='HAVE_DOT'/>
+ <option type='bool' id='CLASS_GRAPH' docs='
+If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+will generate a graph for each documented class showing the direct and
+indirect inheritance relations. Setting this tag to YES will force the
+the CLASS_DIAGRAMS tag to NO.
+' defval='1' depends='HAVE_DOT'/>
+ <option type='bool' id='COLLABORATION_GRAPH' docs='
+If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+will generate a graph for each documented class showing the direct and
+indirect implementation dependencies (inheritance, containment, and
+class references variables) of the class with other documented classes.
+' defval='1' depends='HAVE_DOT'/>
+ <option type='bool' id='GROUP_GRAPHS' docs='
+If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+will generate a graph for groups, showing the direct groups dependencies
+' defval='1' depends='HAVE_DOT'/>
+ <option type='bool' id='UML_LOOK' docs='
+If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+collaboration diagrams in a style similar to the OMG&apos;s Unified Modeling
+Language.
+' defval='0' depends='HAVE_DOT'/>
+ <option type='bool' id='TEMPLATE_RELATIONS' docs='
+If set to YES, the inheritance and collaboration graphs will show the
+relations between templates and their instances.
+' defval='0' depends='HAVE_DOT'/>
+ <option type='bool' id='INCLUDE_GRAPH' docs='
+If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+tags are set to YES then doxygen will generate a graph for each documented
+file showing the direct and indirect include dependencies of the file with
+other documented files.
+' defval='1' depends='HAVE_DOT'/>
+ <option type='bool' id='INCLUDED_BY_GRAPH' docs='
+If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+documented header file showing the documented files that directly or
+indirectly include this file.
+' defval='1' depends='HAVE_DOT'/>
+ <option type='bool' id='CALL_GRAPH' docs='
+If the CALL_GRAPH and HAVE_DOT options are set to YES then
+doxygen will generate a call dependency graph for every global function
+or class method. Note that enabling this option will significantly increase
+the time of a run. So in most cases it will be better to enable call graphs
+for selected functions only using the \callgraph command.
+' defval='0' depends='HAVE_DOT'/>
+ <option type='bool' id='CALLER_GRAPH' docs='
+If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+doxygen will generate a caller dependency graph for every global function
+or class method. Note that enabling this option will significantly increase
+the time of a run. So in most cases it will be better to enable caller
+graphs for selected functions only using the \callergraph command.
+' defval='0' depends='HAVE_DOT'/>
+ <option type='bool' id='GRAPHICAL_HIERARCHY' docs='
+If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+will generate a graphical hierarchy of all classes instead of a textual one.
+' defval='1' depends='HAVE_DOT'/>
+ <option type='bool' id='DIRECTORY_GRAPH' docs='
+If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+then doxygen will show the dependencies a directory has on other directories
+in a graphical way. The dependency relations are determined by the #include
+relations between the files in the directories.
+' defval='1' depends='HAVE_DOT'/>
+ <option type='enum' id='DOT_IMAGE_FORMAT' defval='png' docs='
+The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+generated by dot. Possible values are svg, png, jpg, or gif.
+If left blank png will be used.
+' depends='HAVE_DOT'>
+ <value name='png'/>
+ <value name='jpg'/>
+ <value name='gif'/>
+ <value name='svg'/>
+ </option>
+ <option type='string' id='DOT_PATH' format='dir' docs='
+The tag DOT_PATH can be used to specify the path where the dot tool can be
+found. If left blank, it is assumed the dot tool can be found in the path.
+' defval='' depends='HAVE_DOT'/>
+ <option type='list' id='DOTFILE_DIRS' format='dir' docs='
+The DOTFILE_DIRS tag can be used to specify one or more directories that
+contain dot files that are included in the documentation (see the
+\dotfile command).
+' depends='HAVE_DOT'>
+ </option>
+ <option type='list' id='MSCFILE_DIRS' format='dir' docs='
+The MSCFILE_DIRS tag can be used to specify one or more directories that
+contain msc files that are included in the documentation (see the
+\mscfile command).
+' >
+ </option>
+ <option type='int' id='DOT_GRAPH_MAX_NODES' docs='
+The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+nodes that will be shown in the graph. If the number of nodes in a graph
+becomes larger than this value, doxygen will truncate the graph, which is
+visualized by representing a node as a red box. Note that doxygen if the
+number of direct children of the root node in a graph is already larger than
+DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+' minval='0' maxval='10000' defval='50' depends='HAVE_DOT'/>
+ <option type='int' id='MAX_DOT_GRAPH_DEPTH' docs='
+The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+graphs generated by dot. A depth value of 3 means that only nodes reachable
+from the root by following a path via at most 3 edges will be shown. Nodes
+that lay further from the root node will be omitted. Note that setting this
+option to 1 or 2 may greatly reduce the computation time needed for large
+code bases. Also note that the size of a graph can be further restricted by
+DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+' minval='0' maxval='1000' defval='0' depends='HAVE_DOT'/>
+ <option type='bool' id='DOT_TRANSPARENT' docs='
+Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+background. This is disabled by default, because dot on Windows does not
+seem to support this out of the box. Warning: Depending on the platform used,
+enabling this option may lead to badly anti-aliased labels on the edges of
+a graph (i.e. they become hard to read).
+' defval='0' depends='HAVE_DOT'/>
+ <option type='bool' id='DOT_MULTI_TARGETS' docs='
+Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+files in one run (i.e. multiple -o and -T options on the command line). This
+makes dot run faster, but since only newer versions of dot (&gt;1.8.10)
+support this, this feature is disabled by default.
+' defval='0' depends='HAVE_DOT'/>
+ <option type='bool' id='GENERATE_LEGEND' docs='
+If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+generate a legend page explaining the meaning of the various boxes and
+arrows in the dot generated graphs.
+' defval='1' depends='HAVE_DOT'/>
+ <option type='bool' id='DOT_CLEANUP' docs='
+If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+remove the intermediate dot files that are used to generate
+the various graphs.
+' defval='1' depends='HAVE_DOT'/>
+ <option type='obsolete' id='USE_WINDOWS_ENCODING'/>
+ <option type='obsolete' id='DETAILS_AT_TOP'/>
+ <option type='obsolete' id='QTHELP_FILE'/>
+ <option type='obsolete' id='QTHELP_CONFIG'/>
+ <option type='obsolete' id='DOXYGEN2QTHELP_LOC'/>
+ <option type='obsolete' id='MAX_DOT_GRAPH_WIDTH'/>
+ <option type='obsolete' id='MAX_DOT_GRAPH_HEIGHT'/>
+ <option type='obsolete' id='CGI_NAME'/>
+ <option type='obsolete' id='CGI_URL'/>
+ <option type='obsolete' id='DOC_URL'/>
+ <option type='obsolete' id='DOC_ABSPATH'/>
+ <option type='obsolete' id='BIN_ABSPATH'/>
+ <option type='obsolete' id='EXT_DOC_PATHS'/>
+ </group>
+</doxygenconfig>
diff --git a/src/configgen.py b/src/configgen.py
new file mode 100755
index 0000000..f567127
--- /dev/null
+++ b/src/configgen.py
@@ -0,0 +1,137 @@
+# python script to generate configoptions.cpp from config.xml
+#
+# Copyright (C) 1997-2008 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+import xml.dom.minidom
+from xml.dom import minidom, Node
+
+def addValues(var,node):
+ for n in node.childNodes:
+ if n.nodeType == Node.ELEMENT_NODE:
+ name = n.getAttribute('name');
+ print " %s->addValue(\"%s\");" % (var,name)
+
+def parseOption(node):
+ name = node.getAttribute('id')
+ type = node.getAttribute('type')
+ format = node.getAttribute('format')
+ doc = node.getAttribute('docs')
+ defval = node.getAttribute('defval')
+ adefval = node.getAttribute('altdefval')
+ depends = node.getAttribute('depends')
+ # replace \ by \\, replace " by \", and ' ' by a newline with end string and start string at next line
+ docC = doc.strip().replace('\\','\\\\').replace('"','\\"').replace(' ','\\n"\n "')
+ print " //----"
+ if type=='bool':
+ if len(adefval)>0:
+ enabled = adefval
+ else:
+ enabled = "TRUE" if defval=='1' else "FALSE"
+ print " cb = cfg->addBool("
+ print " \"%s\"," % (name)
+ print " \"%s\"," % (docC)
+ print " %s" % (enabled)
+ print " );"
+ if depends!='':
+ print " cb->addDependency(\"%s\");" % (depends)
+ elif type=='string':
+ print " cs = cfg->addString("
+ print " \"%s\"," % (name)
+ print " \"%s\"" % (docC)
+ print " );"
+ if defval!='':
+ print " cs->setDefaultValue(\"%s\");" % (defval)
+ if format=='file':
+ print " cs->setWidgetType(ConfigString::File);"
+ elif format=='dir':
+ print " cs->setWidgetType(ConfigString::Dir);"
+ if depends!='':
+ print " cs->addDependency(\"%s\");" % (depends)
+ elif type=='enum':
+ print " ce = cfg->addEnum("
+ print " \"%s\"," % (name)
+ print " \"%s\"," % (docC)
+ print " \"%s\"" % (defval)
+ print " );"
+ addValues("ce",node)
+ if depends!='':
+ print " ce->addDependency(\"%s\");" % (depends)
+ elif type=='int':
+ minval = node.getAttribute('minval')
+ maxval = node.getAttribute('maxval')
+ print " ci = cfg->addInt("
+ print " \"%s\"," % (name)
+ print " \"%s\"," % (docC)
+ print " %s,%s,%s" % (minval,maxval,defval)
+ print " );"
+ if depends!='':
+ print " ci->addDependency(\"%s\");" % (depends)
+ elif type=='list':
+ print " cl = cfg->addList("
+ print " \"%s\"," % (name)
+ print " \"%s\"" % (docC)
+ print " );"
+ addValues("cl",node)
+ if depends!='':
+ print " cl->addDependency(\"%s\");" % (depends)
+ if format=='file':
+ print " cl->setWidgetType(ConfigList::File);"
+ elif format=='dir':
+ print " cl->setWidgetType(ConfigList::Dir);"
+ elif format=='filedir':
+ print " cl->setWidgetType(ConfigList::FileAndDir);"
+ elif type=='obsolete':
+ print " cfg->addObsolete(\"%s\");" % (name)
+
+
+
+
+def parseGroups(node):
+ name = node.getAttribute('name')
+ doc = node.getAttribute('docs')
+ print " //---------------------------------------------------------------------------";
+ print " cfg->addInfo(\"%s\",\"%s\");" % (name,doc)
+ print " //---------------------------------------------------------------------------";
+ print
+ for n in node.childNodes:
+ if n.nodeType == Node.ELEMENT_NODE:
+ parseOption(n)
+
+
+def main():
+ doc = xml.dom.minidom.parse("config.xml")
+ elem = doc.documentElement
+ print "/* WARNING: This file is generated!"
+ print " * Do not edit this file, but edit config.xml instead and run"
+ print " * python configgen.py to regenerate this file!"
+ print " */"
+ print ""
+ print "#include \"configoptions.h\""
+ print "#include \"config.h\""
+ print "#include \"portable.h\""
+ print ""
+ print "void addConfigOptions(Config *cfg)"
+ print "{"
+ print " ConfigString *cs;"
+ print " ConfigEnum *ce;"
+ print " ConfigList *cl;"
+ print " ConfigInt *ci;"
+ print " ConfigBool *cb;"
+ print ""
+ for n in elem.childNodes:
+ if n.nodeType == Node.ELEMENT_NODE:
+ parseGroups(n)
+ print "}"
+
+if __name__ == '__main__':
+ main()
+
diff --git a/src/configoptions.cpp b/src/configoptions.cpp
new file mode 100644
index 0000000..15c6424
--- /dev/null
+++ b/src/configoptions.cpp
@@ -0,0 +1,2386 @@
+/* WARNING: This file is generated!
+ * Do not edit this file, but edit config.xml instead and run
+ * python configgen.py to regenerate this file!
+ */
+
+#include "configoptions.h"
+#include "config.h"
+#include "portable.h"
+
+void addConfigOptions(Config *cfg)
+{
+ ConfigString *cs;
+ ConfigEnum *ce;
+ ConfigList *cl;
+ ConfigInt *ci;
+ ConfigBool *cb;
+
+ //---------------------------------------------------------------------------
+ cfg->addInfo("Project","Project related configuration options");
+ //---------------------------------------------------------------------------
+
+ //----
+ cs = cfg->addString(
+ "DOXYFILE_ENCODING",
+ "This tag specifies the encoding used for all characters in the config file\n"
+ "that follow. The default is UTF-8 which is also the encoding used for all\n"
+ "text before the first occurrence of this tag. Doxygen uses libiconv (or the\n"
+ "iconv built into libc) for the transcoding. See\n"
+ "http://www.gnu.org/software/libiconv for the list of possible encodings."
+ );
+ cs->setDefaultValue("UTF-8");
+ //----
+ cs = cfg->addString(
+ "PROJECT_NAME",
+ "The PROJECT_NAME tag is a single word (or a sequence of words surrounded\n"
+ "by quotes) that should identify the project."
+ );
+ //----
+ cs = cfg->addString(
+ "PROJECT_NUMBER",
+ "The PROJECT_NUMBER tag can be used to enter a project or revision number.\n"
+ "This could be handy for archiving the generated documentation or\n"
+ "if some version control system is used."
+ );
+ //----
+ cs = cfg->addString(
+ "PROJECT_BRIEF",
+ "Using the PROJECT_BRIEF tag one can provide an optional one line description\n"
+ "for a project that appears at the top of each page and should give viewer\n"
+ "a quick idea about the purpose of the project. Keep the description short."
+ );
+ //----
+ cs = cfg->addString(
+ "PROJECT_LOGO",
+ "With the PROJECT_LOGO tag one can specify an logo or icon that is\n"
+ "included in the documentation. The maximum height of the logo should not\n"
+ "exceed 55 pixels and the maximum width should not exceed 200 pixels.\n"
+ "Doxygen will copy the logo to the output directory."
+ );
+ cs->setWidgetType(ConfigString::File);
+ //----
+ cs = cfg->addString(
+ "OUTPUT_DIRECTORY",
+ "The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\n"
+ "base path where the generated documentation will be put.\n"
+ "If a relative path is entered, it will be relative to the location\n"
+ "where doxygen was started. If left blank the current directory will be used."
+ );
+ cs->setWidgetType(ConfigString::Dir);
+ //----
+ cb = cfg->addBool(
+ "CREATE_SUBDIRS",
+ "If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\n"
+ "4096 sub-directories (in 2 levels) under the output directory of each output\n"
+ "format and will distribute the generated files over these directories.\n"
+ "Enabling this option can be useful when feeding doxygen a huge amount of\n"
+ "source files, where putting all generated files in the same directory would\n"
+ "otherwise cause performance problems for the file system.",
+ FALSE
+ );
+ //----
+ ce = cfg->addEnum(
+ "OUTPUT_LANGUAGE",
+ "The OUTPUT_LANGUAGE tag is used to specify the language in which all\n"
+ "documentation generated by doxygen is written. Doxygen will use this\n"
+ "information to generate all constant output in the proper language.\n"
+ "The default language is English, other supported languages are:\n"
+ "Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n"
+ "Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n"
+ "Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n"
+ "messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n"
+ "Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n"
+ "Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.",
+ "English"
+ );
+ ce->addValue("Afrikaans");
+ ce->addValue("Arabic");
+ ce->addValue("Brazilian");
+ ce->addValue("Catalan");
+ ce->addValue("Chinese");
+ ce->addValue("Chinese-Traditional");
+ ce->addValue("Croatian");
+ ce->addValue("Czech");
+ ce->addValue("Danish");
+ ce->addValue("Dutch");
+ ce->addValue("English");
+ ce->addValue("Esperanto");
+ ce->addValue("Farsi");
+ ce->addValue("Finnish");
+ ce->addValue("French");
+ ce->addValue("German");
+ ce->addValue("Greek");
+ ce->addValue("Hungarian");
+ ce->addValue("Italian");
+ ce->addValue("Japanese");
+ ce->addValue("Japanese-en");
+ ce->addValue("Korean");
+ ce->addValue("Korean-en");
+ ce->addValue("Norwegian");
+ ce->addValue("Macedonian");
+ ce->addValue("Persian");
+ ce->addValue("Polish");
+ ce->addValue("Portuguese");
+ ce->addValue("Romanian");
+ ce->addValue("Russian");
+ ce->addValue("Serbian");
+ ce->addValue("Slovak");
+ ce->addValue("Slovene");
+ ce->addValue("Spanish");
+ ce->addValue("Swedish");
+ ce->addValue("Turkish");
+ ce->addValue("Ukrainian");
+ ce->addValue("Vietnamese");
+ //----
+ cb = cfg->addBool(
+ "BRIEF_MEMBER_DESC",
+ "If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n"
+ "include brief member descriptions after the members that are listed in\n"
+ "the file and class documentation (similar to JavaDoc).\n"
+ "Set to NO to disable this.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "REPEAT_BRIEF",
+ "If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n"
+ "the brief description of a member or function before the detailed description.\n"
+ "Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n"
+ "brief descriptions will be completely suppressed.",
+ TRUE
+ );
+ //----
+ cl = cfg->addList(
+ "ABBREVIATE_BRIEF",
+ "This tag implements a quasi-intelligent brief description abbreviator\n"
+ "that is used to form the text in various listings. Each string\n"
+ "in this list, if found as the leading text of the brief description, will be\n"
+ "stripped from the text and the result after processing the whole list, is\n"
+ "used as the annotated text. Otherwise, the brief description is used as-is.\n"
+ "If left blank, the following values are used (\"$name\" is automatically\n"
+ "replaced with the name of the entity): \"The $name class\" \"The $name widget\"\n"
+ "\"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\"\n"
+ "\"represents\" \"a\" \"an\" \"the\""
+ );
+ cl->addValue("The $name class");
+ cl->addValue("The $name widget");
+ cl->addValue("The $name file");
+ cl->addValue("is");
+ cl->addValue("provides");
+ cl->addValue("specifies");
+ cl->addValue("contains");
+ cl->addValue("represents");
+ cl->addValue("a");
+ cl->addValue("an");
+ cl->addValue("the");
+ //----
+ cb = cfg->addBool(
+ "ALWAYS_DETAILED_SEC",
+ "If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n"
+ "Doxygen will generate a detailed section even if there is only a brief\n"
+ "description.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "INLINE_INHERITED_MEMB",
+ "If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n"
+ "inherited members of a class in the documentation of that class as if those\n"
+ "members were ordinary class members. Constructors, destructors and assignment\n"
+ "operators of the base classes will not be shown.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "FULL_PATH_NAMES",
+ "If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n"
+ "path before files name in the file list and in the header files. If set\n"
+ "to NO the shortest path that makes the file name unique will be used.",
+ TRUE
+ );
+ //----
+ cl = cfg->addList(
+ "STRIP_FROM_PATH",
+ "If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n"
+ "can be used to strip a user-defined part of the path. Stripping is\n"
+ "only done if one of the specified strings matches the left-hand part of\n"
+ "the path. The tag can be used to show relative paths in the file list.\n"
+ "If left blank the directory from which doxygen is run is used as the\n"
+ "path to strip."
+ );
+ cl->addValue("");
+ cl->addDependency("FULL_PATH_NAMES");
+ //----
+ cl = cfg->addList(
+ "STRIP_FROM_INC_PATH",
+ "The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\n"
+ "the path mentioned in the documentation of a class, which tells\n"
+ "the reader which header file to include in order to use a class.\n"
+ "If left blank only the name of the header file containing the class\n"
+ "definition is used. Otherwise one should specify the include paths that\n"
+ "are normally passed to the compiler using the -I flag."
+ );
+ //----
+ cb = cfg->addBool(
+ "SHORT_NAMES",
+ "If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n"
+ "(but less readable) file names. This can be useful if your file system\n"
+ "doesn't support long names like on DOS, Mac, or CD-ROM.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "JAVADOC_AUTOBRIEF",
+ "If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n"
+ "will interpret the first line (until the first dot) of a JavaDoc-style\n"
+ "comment as the brief description. If set to NO, the JavaDoc\n"
+ "comments will behave just like regular Qt-style comments\n"
+ "(thus requiring an explicit @brief command for a brief description.)",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "QT_AUTOBRIEF",
+ "If the QT_AUTOBRIEF tag is set to YES then Doxygen will\n"
+ "interpret the first line (until the first dot) of a Qt-style\n"
+ "comment as the brief description. If set to NO, the comments\n"
+ "will behave just like regular Qt-style comments (thus requiring\n"
+ "an explicit \\brief command for a brief description.)",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "MULTILINE_CPP_IS_BRIEF",
+ "The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\n"
+ "treat a multi-line C++ special comment block (i.e. a block of //! or ///\n"
+ "comments) as a brief description. This used to be the default behaviour.\n"
+ "The new default is to treat a multi-line C++ comment block as a detailed\n"
+ "description. Set this tag to YES if you prefer the old behaviour instead.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "INHERIT_DOCS",
+ "If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n"
+ "member inherits the documentation from any documented member that it\n"
+ "re-implements.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "SEPARATE_MEMBER_PAGES",
+ "If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\n"
+ "a new page for each member. If set to NO, the documentation of a member will\n"
+ "be part of the file/class/namespace that contains it.",
+ FALSE
+ );
+ //----
+ ci = cfg->addInt(
+ "TAB_SIZE",
+ "The TAB_SIZE tag can be used to set the number of spaces in a tab.\n"
+ "Doxygen uses this value to replace tabs by spaces in code fragments.",
+ 1,16,8
+ );
+ //----
+ cl = cfg->addList(
+ "ALIASES",
+ "This tag can be used to specify a number of aliases that acts\n"
+ "as commands in the documentation. An alias has the form \"name=value\".\n"
+ "For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n"
+ "put the command \\sideeffect (or @sideeffect) in the documentation, which\n"
+ "will result in a user-defined paragraph with heading \"Side Effects:\".\n"
+ "You can put \\n's in the value part of an alias to insert newlines."
+ );
+ //----
+ cb = cfg->addBool(
+ "OPTIMIZE_OUTPUT_FOR_C",
+ "Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\n"
+ "sources only. Doxygen will then generate output that is more tailored for C.\n"
+ "For instance, some of the names that are used will be different. The list\n"
+ "of all members will be omitted, etc.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "OPTIMIZE_OUTPUT_JAVA",
+ "Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\n"
+ "sources only. Doxygen will then generate output that is more tailored for\n"
+ "Java. For instance, namespaces will be presented as packages, qualified\n"
+ "scopes will look different, etc.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "OPTIMIZE_FOR_FORTRAN",
+ "Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n"
+ "sources only. Doxygen will then generate output that is more tailored for\n"
+ "Fortran.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "OPTIMIZE_OUTPUT_VHDL",
+ "Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n"
+ "sources. Doxygen will then generate output that is tailored for\n"
+ "VHDL.",
+ FALSE
+ );
+ //----
+ cl = cfg->addList(
+ "EXTENSION_MAPPING",
+ "Doxygen selects the parser to use depending on the extension of the files it\n"
+ "parses. With this tag you can assign which parser to use for a given extension.\n"
+ "Doxygen has a built-in mapping, but you can override or extend it using this\n"
+ "tag. The format is ext=language, where ext is a file extension, and language\n"
+ "is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,\n"
+ "C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make\n"
+ "doxygen treat .inc files as Fortran files (default is PHP), and .f files as C\n"
+ "(default is Fortran), use: inc=Fortran f=C. Note that for custom extensions\n"
+ "you also need to set FILE_PATTERNS otherwise the files are not read by doxygen."
+ );
+ //----
+ cb = cfg->addBool(
+ "BUILTIN_STL_SUPPORT",
+ "If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n"
+ "to include (a tag file for) the STL sources as input, then you should\n"
+ "set this tag to YES in order to let doxygen match functions declarations and\n"
+ "definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n"
+ "func(std::string) {}). This also makes the inheritance and collaboration\n"
+ "diagrams that involve STL classes more complete and accurate.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "CPP_CLI_SUPPORT",
+ "If you use Microsoft's C++/CLI language, you should set this option to YES to\n"
+ "enable parsing support.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "SIP_SUPPORT",
+ "Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\n"
+ "Doxygen will parse them like normal C++ but will assume all classes use public\n"
+ "instead of private inheritance when no explicit protection keyword is present.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "IDL_PROPERTY_SUPPORT",
+ "For Microsoft's IDL there are propget and propput attributes to indicate getter\n"
+ "and setter methods for a property. Setting this option to YES (the default)\n"
+ "will make doxygen replace the get and set methods by a property in the\n"
+ "documentation. This will only work if the methods are indeed getting or\n"
+ "setting a simple type. If this is not the case, or you want to show the\n"
+ "methods anyway, you should set this option to NO.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "DISTRIBUTE_GROUP_DOC",
+ "If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n"
+ "tag is set to YES, then doxygen will reuse the documentation of the first\n"
+ "member in the group (if any) for the other members of the group. By default\n"
+ "all members of a group must be documented explicitly.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "SUBGROUPING",
+ "Set the SUBGROUPING tag to YES (the default) to allow class member groups of\n"
+ "the same type (for instance a group of public functions) to be put as a\n"
+ "subgroup of that type (e.g. under the Public Functions section). Set it to\n"
+ "NO to prevent subgrouping. Alternatively, this can be done per class using\n"
+ "the \\nosubgrouping command.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "INLINE_GROUPED_CLASSES",
+ "When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\n"
+ "unions are shown inside the group in which they are included (e.g. using\n"
+ "@ingroup) instead of on a separate page (for HTML and Man pages) or\n"
+ "section (for LaTeX and RTF).",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "TYPEDEF_HIDES_STRUCT",
+ "When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n"
+ "is documented as struct, union, or enum with the name of the typedef. So\n"
+ "typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n"
+ "with name TypeT. When disabled the typedef will appear as a member of a file,\n"
+ "namespace, or class. And the struct will be named TypeS. This can typically\n"
+ "be useful for C code in case the coding convention dictates that all compound\n"
+ "types are typedef'ed and only the typedef is referenced, never the tag name.",
+ FALSE
+ );
+ //----
+ ci = cfg->addInt(
+ "SYMBOL_CACHE_SIZE",
+ "The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\n"
+ "determine which symbols to keep in memory and which to flush to disk.\n"
+ "When the cache is full, less often used symbols will be written to disk.\n"
+ "For small to medium size projects (<1000 input files) the default value is\n"
+ "probably good enough. For larger projects a too small cache size can cause\n"
+ "doxygen to be busy swapping symbols to and from disk most of the time\n"
+ "causing a significant performance penalty.\n"
+ "If the system has enough physical memory increasing the cache will improve the\n"
+ "performance by keeping more symbols in memory. Note that the value works on\n"
+ "a logarithmic scale so increasing the size by one will roughly double the\n"
+ "memory usage. The cache size is given by this formula:\n"
+ "2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\n"
+ "corresponding to a cache size of 2^16 = 65536 symbols",
+ 0,9,0
+ );
+ //---------------------------------------------------------------------------
+ cfg->addInfo("Build","Build related configuration options");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "EXTRACT_ALL",
+ "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n"
+ "documentation are documented, even if no documentation was available.\n"
+ "Private class members and static file members will be hidden unless\n"
+ "the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "EXTRACT_PRIVATE",
+ "If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n"
+ "will be included in the documentation.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "EXTRACT_STATIC",
+ "If the EXTRACT_STATIC tag is set to YES all static members of a file\n"
+ "will be included in the documentation.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "EXTRACT_LOCAL_CLASSES",
+ "If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\n"
+ "defined locally in source files will be included in the documentation.\n"
+ "If set to NO only classes defined in header files are included.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "EXTRACT_LOCAL_METHODS",
+ "This flag is only useful for Objective-C code. When set to YES local\n"
+ "methods, which are defined in the implementation section but not in\n"
+ "the interface are included in the documentation.\n"
+ "If set to NO (the default) only methods in the interface are included.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "EXTRACT_ANON_NSPACES",
+ "If this flag is set to YES, the members of anonymous namespaces will be\n"
+ "extracted and appear in the documentation as a namespace called\n"
+ "'anonymous_namespace{file}', where file will be replaced with the base\n"
+ "name of the file that contains the anonymous namespace. By default\n"
+ "anonymous namespaces are hidden.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "HIDE_UNDOC_MEMBERS",
+ "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n"
+ "undocumented members of documented classes, files or namespaces.\n"
+ "If set to NO (the default) these members will be included in the\n"
+ "various overviews, but no documentation section is generated.\n"
+ "This option has no effect if EXTRACT_ALL is enabled.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "HIDE_UNDOC_CLASSES",
+ "If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n"
+ "undocumented classes that are normally visible in the class hierarchy.\n"
+ "If set to NO (the default) these classes will be included in the various\n"
+ "overviews. This option has no effect if EXTRACT_ALL is enabled.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "HIDE_FRIEND_COMPOUNDS",
+ "If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\n"
+ "friend (class|struct|union) declarations.\n"
+ "If set to NO (the default) these declarations will be included in the\n"
+ "documentation.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "HIDE_IN_BODY_DOCS",
+ "If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\n"
+ "documentation blocks found inside the body of a function.\n"
+ "If set to NO (the default) these blocks will be appended to the\n"
+ "function's detailed documentation block.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "INTERNAL_DOCS",
+ "The INTERNAL_DOCS tag determines if documentation\n"
+ "that is typed after a \\internal command is included. If the tag is set\n"
+ "to NO (the default) then the documentation will be excluded.\n"
+ "Set it to YES to include the internal documentation.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "CASE_SENSE_NAMES",
+ "If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n"
+ "file names in lower-case letters. If set to YES upper-case letters are also\n"
+ "allowed. This is useful if you have classes or files whose names only differ\n"
+ "in case and if your file system supports case sensitive file names. Windows\n"
+ "and Mac users are advised to set this option to NO.",
+ portable_fileSystemIsCaseSensitive()
+ );
+ //----
+ cb = cfg->addBool(
+ "HIDE_SCOPE_NAMES",
+ "If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n"
+ "will show members with their full class and namespace scopes in the\n"
+ "documentation. If set to YES the scope will be hidden.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "SHOW_INCLUDE_FILES",
+ "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n"
+ "will put a list of the files that are included by a file in the documentation\n"
+ "of that file.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "FORCE_LOCAL_INCLUDES",
+ "If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\n"
+ "will list include files with double quotes in the documentation\n"
+ "rather than with sharp brackets.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "INLINE_INFO",
+ "If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n"
+ "is inserted in the documentation for inline members.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "SORT_MEMBER_DOCS",
+ "If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n"
+ "will sort the (detailed) documentation of file and class members\n"
+ "alphabetically by member name. If set to NO the members will appear in\n"
+ "declaration order.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "SORT_BRIEF_DOCS",
+ "If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\n"
+ "brief documentation of file, namespace and class members alphabetically\n"
+ "by member name. If set to NO (the default) the members will appear in\n"
+ "declaration order.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "SORT_MEMBERS_CTORS_1ST",
+ "If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\n"
+ "will sort the (brief and detailed) documentation of class members so that\n"
+ "constructors and destructors are listed first. If set to NO (the default)\n"
+ "the constructors will appear in the respective orders defined by\n"
+ "SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\n"
+ "This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\n"
+ "and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "SORT_GROUP_NAMES",
+ "If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\n"
+ "hierarchy of group names into alphabetical order. If set to NO (the default)\n"
+ "the group names will appear in their defined order.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "SORT_BY_SCOPE_NAME",
+ "If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\n"
+ "sorted by fully-qualified names, including namespaces. If set to\n"
+ "NO (the default), the class list will be sorted only by class name,\n"
+ "not including the namespace part.\n"
+ "Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n"
+ "Note: This option applies only to the class list, not to the\n"
+ "alphabetical list.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "STRICT_PROTO_MATCHING",
+ "If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\n"
+ "do proper type resolution of all parameters of a function it will reject a\n"
+ "match between the prototype and the implementation of a member function even\n"
+ "if there is only one candidate or it is obvious which candidate to choose\n"
+ "by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n"
+ "will still accept a match between prototype and implementation in such cases.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "GENERATE_TODOLIST",
+ "The GENERATE_TODOLIST tag can be used to enable (YES) or\n"
+ "disable (NO) the todo list. This list is created by putting \\todo\n"
+ "commands in the documentation.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "GENERATE_TESTLIST",
+ "The GENERATE_TESTLIST tag can be used to enable (YES) or\n"
+ "disable (NO) the test list. This list is created by putting \\test\n"
+ "commands in the documentation.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "GENERATE_BUGLIST",
+ "The GENERATE_BUGLIST tag can be used to enable (YES) or\n"
+ "disable (NO) the bug list. This list is created by putting \\bug\n"
+ "commands in the documentation.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "GENERATE_DEPRECATEDLIST",
+ "The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\n"
+ "disable (NO) the deprecated list. This list is created by putting\n"
+ "\\deprecated commands in the documentation.",
+ TRUE
+ );
+ //----
+ cl = cfg->addList(
+ "ENABLED_SECTIONS",
+ "The ENABLED_SECTIONS tag can be used to enable conditional\n"
+ "documentation sections, marked by \\if sectionname ... \\endif."
+ );
+ //----
+ ci = cfg->addInt(
+ "MAX_INITIALIZER_LINES",
+ "The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n"
+ "the initial value of a variable or macro consists of for it to appear in\n"
+ "the documentation. If the initializer consists of more lines than specified\n"
+ "here it will be hidden. Use a value of 0 to hide initializers completely.\n"
+ "The appearance of the initializer of individual variables and macros in the\n"
+ "documentation can be controlled using \\showinitializer or \\hideinitializer\n"
+ "command in the documentation regardless of this setting.",
+ 0,10000,30
+ );
+ //----
+ cb = cfg->addBool(
+ "SHOW_USED_FILES",
+ "Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n"
+ "at the bottom of the documentation of classes and structs. If set to YES the\n"
+ "list will mention the files that were used to generate the documentation.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "SHOW_DIRECTORIES",
+ "If the sources in your project are distributed over multiple directories\n"
+ "then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy\n"
+ "in the documentation. The default is NO.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "SHOW_FILES",
+ "Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n"
+ "This will remove the Files entry from the Quick Index and from the\n"
+ "Folder Tree View (if specified). The default is YES.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "SHOW_NAMESPACES",
+ "Set the SHOW_NAMESPACES tag to NO to disable the generation of the\n"
+ "Namespaces page.\n"
+ "This will remove the Namespaces entry from the Quick Index\n"
+ "and from the Folder Tree View (if specified). The default is YES.",
+ TRUE
+ );
+ //----
+ cs = cfg->addString(
+ "FILE_VERSION_FILTER",
+ "The FILE_VERSION_FILTER tag can be used to specify a program or script that\n"
+ "doxygen should invoke to get the current version for each file (typically from\n"
+ "the version control system). Doxygen will invoke the program by executing (via\n"
+ "popen()) the command <command> <input-file>, where <command> is the value of\n"
+ "the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\n"
+ "provided by doxygen. Whatever the program writes to standard output\n"
+ "is used as the file version. See the manual for examples."
+ );
+ cs->setWidgetType(ConfigString::File);
+ //----
+ cs = cfg->addString(
+ "LAYOUT_FILE",
+ "The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n"
+ "by doxygen. The layout file controls the global structure of the generated\n"
+ "output files in an output format independent way. The create the layout file\n"
+ "that represents doxygen's defaults, run doxygen with the -l option.\n"
+ "You can optionally specify a file name after the option, if omitted\n"
+ "DoxygenLayout.xml will be used as the name of the layout file."
+ );
+ cs->setWidgetType(ConfigString::File);
+ //---------------------------------------------------------------------------
+ cfg->addInfo("Messages","configuration options related to warning and progress messages");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "QUIET",
+ "The QUIET tag can be used to turn on/off the messages that are generated\n"
+ "by doxygen. Possible values are YES and NO. If left blank NO is used.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "WARNINGS",
+ "The WARNINGS tag can be used to turn on/off the warning messages that are\n"
+ "generated by doxygen. Possible values are YES and NO. If left blank\n"
+ "NO is used.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "WARN_IF_UNDOCUMENTED",
+ "If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n"
+ "for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n"
+ "automatically be disabled.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "WARN_IF_DOC_ERROR",
+ "If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\n"
+ "potential errors in the documentation, such as not documenting some\n"
+ "parameters in a documented function, or documenting parameters that\n"
+ "don't exist or using markup commands wrongly.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "WARN_NO_PARAMDOC",
+ "The WARN_NO_PARAMDOC option can be enabled to get warnings for\n"
+ "functions that are documented, but have no documentation for their parameters\n"
+ "or return value. If set to NO (the default) doxygen will only warn about\n"
+ "wrong or incomplete parameter documentation, but not about the absence of\n"
+ "documentation.",
+ FALSE
+ );
+ //----
+ cs = cfg->addString(
+ "WARN_FORMAT",
+ "The WARN_FORMAT tag determines the format of the warning messages that\n"
+ "doxygen can produce. The string should contain the $file, $line, and $text\n"
+ "tags, which will be replaced by the file and line number from which the\n"
+ "warning originated and the warning text. Optionally the format may contain\n"
+ "$version, which will be replaced by the version of the file (if it could\n"
+ "be obtained via FILE_VERSION_FILTER)"
+ );
+ cs->setDefaultValue("$file:$line: $text");
+ //----
+ cs = cfg->addString(
+ "WARN_LOGFILE",
+ "The WARN_LOGFILE tag can be used to specify a file to which warning\n"
+ "and error messages should be written. If left blank the output is written\n"
+ "to stderr."
+ );
+ cs->setWidgetType(ConfigString::File);
+ //---------------------------------------------------------------------------
+ cfg->addInfo("Input","configuration options related to the input files");
+ //---------------------------------------------------------------------------
+
+ //----
+ cl = cfg->addList(
+ "INPUT",
+ "The INPUT tag can be used to specify the files and/or directories that contain\n"
+ "documented source files. You may enter file names like \"myfile.cpp\" or\n"
+ "directories like \"/usr/src/myproject\". Separate the files or directories\n"
+ "with spaces."
+ );
+ cl->addValue("");
+ cl->setWidgetType(ConfigList::FileAndDir);
+ //----
+ cs = cfg->addString(
+ "INPUT_ENCODING",
+ "This tag can be used to specify the character encoding of the source files\n"
+ "that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\n"
+ "also the default input encoding. Doxygen uses libiconv (or the iconv built\n"
+ "into libc) for the transcoding. See http://www.gnu.org/software/libiconv for\n"
+ "the list of possible encodings."
+ );
+ cs->setDefaultValue("UTF-8");
+ //----
+ cl = cfg->addList(
+ "FILE_PATTERNS",
+ "If the value of the INPUT tag contains directories, you can use the\n"
+ "FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n"
+ "and *.h) to filter out the source-files in the directories. If left\n"
+ "blank the following patterns are tested:\n"
+ "*.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\n"
+ "*.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\n"
+ "*.f90 *.f *.for *.vhd *.vhdl"
+ );
+ cl->addValue("*.c");
+ cl->addValue("*.cc");
+ cl->addValue("*.cxx");
+ cl->addValue("*.cpp");
+ cl->addValue("*.c++");
+ cl->addValue("*.d");
+ cl->addValue("*.java");
+ cl->addValue("*.ii");
+ cl->addValue("*.ixx");
+ cl->addValue("*.ipp");
+ cl->addValue("*.i++");
+ cl->addValue("*.inl");
+ cl->addValue("*.h");
+ cl->addValue("*.hh");
+ cl->addValue("*.hxx");
+ cl->addValue("*.hpp");
+ cl->addValue("*.h++");
+ cl->addValue("*.idl");
+ cl->addValue("*.odl");
+ cl->addValue("*.cs");
+ cl->addValue("*.php");
+ cl->addValue("*.php3");
+ cl->addValue("*.inc");
+ cl->addValue("*.m");
+ cl->addValue("*.mm");
+ cl->addValue("*.dox");
+ cl->addValue("*.py");
+ cl->addValue("*.f90");
+ cl->addValue("*.f");
+ cl->addValue("*.for");
+ cl->addValue("*.vhd");
+ cl->addValue("*.vhdl");
+ //----
+ cb = cfg->addBool(
+ "RECURSIVE",
+ "The RECURSIVE tag can be used to turn specify whether or not subdirectories\n"
+ "should be searched for input files as well. Possible values are YES and NO.\n"
+ "If left blank NO is used.",
+ FALSE
+ );
+ //----
+ cl = cfg->addList(
+ "EXCLUDE",
+ "The EXCLUDE tag can be used to specify files and/or directories that should\n"
+ "excluded from the INPUT source files. This way you can easily exclude a\n"
+ "subdirectory from a directory tree whose root is specified with the INPUT tag."
+ );
+ cl->setWidgetType(ConfigList::FileAndDir);
+ //----
+ cb = cfg->addBool(
+ "EXCLUDE_SYMLINKS",
+ "The EXCLUDE_SYMLINKS tag can be used select whether or not files or\n"
+ "directories that are symbolic links (a Unix file system feature) are excluded\n"
+ "from the input.",
+ FALSE
+ );
+ //----
+ cl = cfg->addList(
+ "EXCLUDE_PATTERNS",
+ "If the value of the INPUT tag contains directories, you can use the\n"
+ "EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n"
+ "certain files from those directories. Note that the wildcards are matched\n"
+ "against the file with absolute path, so to exclude all test directories\n"
+ "for example use the pattern */test/*"
+ );
+ //----
+ cl = cfg->addList(
+ "EXCLUDE_SYMBOLS",
+ "The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n"
+ "(namespaces, classes, functions, etc.) that should be excluded from the\n"
+ "output. The symbol name can be a fully qualified name, a word, or if the\n"
+ "wildcard * is used, a substring. Examples: ANamespace, AClass,\n"
+ "AClass::ANamespace, ANamespace::*Test"
+ );
+ //----
+ cl = cfg->addList(
+ "EXAMPLE_PATH",
+ "The EXAMPLE_PATH tag can be used to specify one or more files or\n"
+ "directories that contain example code fragments that are included (see\n"
+ "the \\include command)."
+ );
+ cl->setWidgetType(ConfigList::Dir);
+ //----
+ cl = cfg->addList(
+ "EXAMPLE_PATTERNS",
+ "If the value of the EXAMPLE_PATH tag contains directories, you can use the\n"
+ "EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n"
+ "and *.h) to filter out the source-files in the directories. If left\n"
+ "blank all files are included."
+ );
+ cl->addValue("*");
+ //----
+ cb = cfg->addBool(
+ "EXAMPLE_RECURSIVE",
+ "If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n"
+ "searched for input files to be used with the \\include or \\dontinclude\n"
+ "commands irrespective of the value of the RECURSIVE tag.\n"
+ "Possible values are YES and NO. If left blank NO is used.",
+ FALSE
+ );
+ //----
+ cl = cfg->addList(
+ "IMAGE_PATH",
+ "The IMAGE_PATH tag can be used to specify one or more files or\n"
+ "directories that contain image that are included in the documentation (see\n"
+ "the \\image command)."
+ );
+ cl->setWidgetType(ConfigList::Dir);
+ //----
+ cs = cfg->addString(
+ "INPUT_FILTER",
+ "The INPUT_FILTER tag can be used to specify a program that doxygen should\n"
+ "invoke to filter for each input file. Doxygen will invoke the filter program\n"
+ "by executing (via popen()) the command <filter> <input-file>, where <filter>\n"
+ "is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n"
+ "input file. Doxygen will then use the output that the filter program writes\n"
+ "to standard output.\n"
+ "If FILTER_PATTERNS is specified, this tag will be\n"
+ "ignored."
+ );
+ cs->setWidgetType(ConfigString::File);
+ //----
+ cl = cfg->addList(
+ "FILTER_PATTERNS",
+ "The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n"
+ "basis.\n"
+ "Doxygen will compare the file name with each pattern and apply the\n"
+ "filter if there is a match.\n"
+ "The filters are a list of the form:\n"
+ "pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n"
+ "info on how filters are used. If FILTER_PATTERNS is empty or if\n"
+ "non of the patterns match the file name, INPUT_FILTER is applied."
+ );
+ //----
+ cb = cfg->addBool(
+ "FILTER_SOURCE_FILES",
+ "If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n"
+ "INPUT_FILTER) will be used to filter the input files when producing source\n"
+ "files to browse (i.e. when SOURCE_BROWSER is set to YES).",
+ FALSE
+ );
+ //----
+ cl = cfg->addList(
+ "FILTER_SOURCE_PATTERNS",
+ "The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n"
+ "pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n"
+ "and it is also possible to disable source filtering for a specific pattern\n"
+ "using *.ext= (so without naming a filter). This option only has effect when\n"
+ "FILTER_SOURCE_FILES is enabled."
+ );
+ cl->addDependency("FILTER_SOURCE_FILES");
+ //---------------------------------------------------------------------------
+ cfg->addInfo("Source Browser","configuration options related to source browsing");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "SOURCE_BROWSER",
+ "If the SOURCE_BROWSER tag is set to YES then a list of source files will\n"
+ "be generated. Documented entities will be cross-referenced with these sources.\n"
+ "Note: To get rid of all source code in the generated output, make sure also\n"
+ "VERBATIM_HEADERS is set to NO.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "INLINE_SOURCES",
+ "Setting the INLINE_SOURCES tag to YES will include the body\n"
+ "of functions and classes directly in the documentation.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "STRIP_CODE_COMMENTS",
+ "Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n"
+ "doxygen to hide any special comment blocks from generated source code\n"
+ "fragments. Normal C and C++ comments will always remain visible.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "REFERENCED_BY_RELATION",
+ "If the REFERENCED_BY_RELATION tag is set to YES\n"
+ "then for each documented function all documented\n"
+ "functions referencing it will be listed.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "REFERENCES_RELATION",
+ "If the REFERENCES_RELATION tag is set to YES\n"
+ "then for each documented function all documented entities\n"
+ "called/used by that function will be listed.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "REFERENCES_LINK_SOURCE",
+ "If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n"
+ "and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n"
+ "functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n"
+ "link to the source code.\n"
+ "Otherwise they will link to the documentation.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "USE_HTAGS",
+ "If the USE_HTAGS tag is set to YES then the references to source code\n"
+ "will point to the HTML generated by the htags(1) tool instead of doxygen\n"
+ "built-in source browser. The htags tool is part of GNU's global source\n"
+ "tagging system (see http://www.gnu.org/software/global/global.html). You\n"
+ "will need version 4.8.6 or higher.",
+ FALSE
+ );
+ cb->addDependency("SOURCE_BROWSER");
+ //----
+ cb = cfg->addBool(
+ "VERBATIM_HEADERS",
+ "If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n"
+ "will generate a verbatim copy of the header file for each class for\n"
+ "which an include is specified. Set to NO to disable this.",
+ TRUE
+ );
+ //---------------------------------------------------------------------------
+ cfg->addInfo("Index","configuration options related to the alphabetical class index");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "ALPHABETICAL_INDEX",
+ "If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n"
+ "of all compounds will be generated. Enable this if the project\n"
+ "contains a lot of classes, structs, unions or interfaces.",
+ TRUE
+ );
+ //----
+ ci = cfg->addInt(
+ "COLS_IN_ALPHA_INDEX",
+ "If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n"
+ "the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n"
+ "in which this list will be split (can be a number in the range [1..20])",
+ 1,20,5
+ );
+ //----
+ cl = cfg->addList(
+ "IGNORE_PREFIX",
+ "In case all classes in a project start with a common prefix, all\n"
+ "classes will be put under the same header in the alphabetical index.\n"
+ "The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n"
+ "should be ignored while generating the index headers."
+ );
+ //---------------------------------------------------------------------------
+ cfg->addInfo("HTML","configuration options related to the HTML output");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "GENERATE_HTML",
+ "If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n"
+ "generate HTML output.",
+ TRUE
+ );
+ //----
+ cs = cfg->addString(
+ "HTML_OUTPUT",
+ "The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n"
+ "If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"
+ "put in front of it. If left blank `html' will be used as the default path."
+ );
+ cs->setDefaultValue("html");
+ cs->setWidgetType(ConfigString::Dir);
+ cs->addDependency("GENERATE_HTML");
+ //----
+ cs = cfg->addString(
+ "HTML_FILE_EXTENSION",
+ "The HTML_FILE_EXTENSION tag can be used to specify the file extension for\n"
+ "each generated HTML page (for example: .htm,.php,.asp). If it is left blank\n"
+ "doxygen will generate files with .html extension."
+ );
+ cs->setDefaultValue(".html");
+ cs->addDependency("GENERATE_HTML");
+ //----
+ cs = cfg->addString(
+ "HTML_HEADER",
+ "The HTML_HEADER tag can be used to specify a personal HTML header for\n"
+ "each generated HTML page. If it is left blank doxygen will generate a\n"
+ "standard header. Note that when using a custom header you are responsible\n"
+ "for the proper inclusion of any scripts and style sheets that doxygen\n"
+ "needs, which is dependent on the configuration options used.\n"
+ "It is adviced to generate a default header using \"doxygen -w html\n"
+ "header.html footer.html stylesheet.css YourConfigFile\" and then modify\n"
+ "that header. Note that the header is subject to change so you typically\n"
+ "have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW!"
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_HTML");
+ //----
+ cs = cfg->addString(
+ "HTML_FOOTER",
+ "The HTML_FOOTER tag can be used to specify a personal HTML footer for\n"
+ "each generated HTML page. If it is left blank doxygen will generate a\n"
+ "standard footer."
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_HTML");
+ //----
+ cs = cfg->addString(
+ "HTML_STYLESHEET",
+ "The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n"
+ "style sheet that is used by each HTML page. It can be used to\n"
+ "fine-tune the look of the HTML output. If the tag is left blank doxygen\n"
+ "will generate a default style sheet. Note that doxygen will try to copy\n"
+ "the style sheet file to the HTML output directory, so don't put your own\n"
+ "stylesheet in the HTML output directory as well, or it will be erased!"
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_HTML");
+ //----
+ cl = cfg->addList(
+ "HTML_EXTRA_FILES",
+ "The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n"
+ "other source files which should be copied to the HTML output directory. Note\n"
+ "that these files will be copied to the base HTML output directory. Use the\n"
+ "$relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n"
+ "files. In the HTML_STYLESHEET file, use the file name only. Also note that\n"
+ "the files will be copied as-is; there are no commands or markers available."
+ );
+ cl->addDependency("GENERATE_HTML");
+ cl->setWidgetType(ConfigList::File);
+ //----
+ ci = cfg->addInt(
+ "HTML_COLORSTYLE_HUE",
+ "The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\n"
+ "Doxygen will adjust the colors in the stylesheet and background images\n"
+ "according to this color. Hue is specified as an angle on a colorwheel,\n"
+ "see http://en.wikipedia.org/wiki/Hue for more information.\n"
+ "For instance the value 0 represents red, 60 is yellow, 120 is green,\n"
+ "180 is cyan, 240 is blue, 300 purple, and 360 is red again.\n"
+ "The allowed range is 0 to 359.",
+ 0,359,220
+ );
+ ci->addDependency("GENERATE_HTML");
+ //----
+ ci = cfg->addInt(
+ "HTML_COLORSTYLE_SAT",
+ "The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\n"
+ "the colors in the HTML output. For a value of 0 the output will use\n"
+ "grayscales only. A value of 255 will produce the most vivid colors.",
+ 0,255,100
+ );
+ ci->addDependency("GENERATE_HTML");
+ //----
+ ci = cfg->addInt(
+ "HTML_COLORSTYLE_GAMMA",
+ "The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\n"
+ "the luminance component of the colors in the HTML output. Values below\n"
+ "100 gradually make the output lighter, whereas values above 100 make\n"
+ "the output darker. The value divided by 100 is the actual gamma applied,\n"
+ "so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\n"
+ "and 100 does not change the gamma.",
+ 40,240,80
+ );
+ //----
+ cb = cfg->addBool(
+ "HTML_TIMESTAMP",
+ "If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n"
+ "page will contain the date and time when the page was generated. Setting\n"
+ "this to NO can help when comparing the output of multiple runs.",
+ TRUE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cb = cfg->addBool(
+ "HTML_ALIGN_MEMBERS",
+ "If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,\n"
+ "files or namespaces will be aligned in HTML using tables. If set to\n"
+ "NO a bullet list will be used.",
+ TRUE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cb = cfg->addBool(
+ "HTML_DYNAMIC_SECTIONS",
+ "If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n"
+ "documentation will contain sections that can be hidden and shown after the\n"
+ "page has loaded. For this to work a browser that supports\n"
+ "JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox\n"
+ "Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cb = cfg->addBool(
+ "GENERATE_DOCSET",
+ "If the GENERATE_DOCSET tag is set to YES, additional index files\n"
+ "will be generated that can be used as input for Apple's Xcode 3\n"
+ "integrated development environment, introduced with OSX 10.5 (Leopard).\n"
+ "To create a documentation set, doxygen will generate a Makefile in the\n"
+ "HTML output directory. Running make will produce the docset in that\n"
+ "directory and running \"make install\" will install the docset in\n"
+ "~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\n"
+ "it at startup.\n"
+ "See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n"
+ "for more information.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cs = cfg->addString(
+ "DOCSET_FEEDNAME",
+ "When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\n"
+ "feed. A documentation feed provides an umbrella under which multiple\n"
+ "documentation sets from a single provider (such as a company or product suite)\n"
+ "can be grouped."
+ );
+ cs->setDefaultValue("Doxygen generated docs");
+ cs->addDependency("GENERATE_DOCSET");
+ //----
+ cs = cfg->addString(
+ "DOCSET_BUNDLE_ID",
+ "When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\n"
+ "should uniquely identify the documentation set bundle. This should be a\n"
+ "reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\n"
+ "will append .docset to the name."
+ );
+ cs->setDefaultValue("org.doxygen.Project");
+ cs->addDependency("GENERATE_DOCSET");
+ //----
+ cs = cfg->addString(
+ "DOCSET_PUBLISHER_ID",
+ "When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify\n"
+ "the documentation publisher. This should be a reverse domain-name style\n"
+ "string, e.g. com.mycompany.MyDocSet.documentation."
+ );
+ cs->setDefaultValue("org.doxygen.Publisher");
+ cs->addDependency("GENERATE_DOCSET");
+ //----
+ cs = cfg->addString(
+ "DOCSET_PUBLISHER_NAME",
+ "The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher."
+ );
+ cs->setDefaultValue("Publisher");
+ cs->addDependency("GENERATE_DOCSET");
+ //----
+ cb = cfg->addBool(
+ "GENERATE_HTMLHELP",
+ "If the GENERATE_HTMLHELP tag is set to YES, additional index files\n"
+ "will be generated that can be used as input for tools like the\n"
+ "Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\n"
+ "of the generated HTML documentation.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cs = cfg->addString(
+ "CHM_FILE",
+ "If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\n"
+ "be used to specify the file name of the resulting .chm file. You\n"
+ "can add a path in front of the file if the result should not be\n"
+ "written to the html output directory."
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_HTMLHELP");
+ //----
+ cs = cfg->addString(
+ "HHC_LOCATION",
+ "If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\n"
+ "be used to specify the location (absolute path including file name) of\n"
+ "the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\n"
+ "the HTML help compiler on the generated index.hhp."
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_HTMLHELP");
+ //----
+ cb = cfg->addBool(
+ "GENERATE_CHI",
+ "If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n"
+ "controls if a separate .chi index file is generated (YES) or that\n"
+ "it should be included in the master .chm file (NO).",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTMLHELP");
+ //----
+ cs = cfg->addString(
+ "CHM_INDEX_ENCODING",
+ "If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n"
+ "is used to encode HtmlHelp index (hhk), content (hhc) and project file\n"
+ "content."
+ );
+ cs->addDependency("GENERATE_HTMLHELP");
+ //----
+ cb = cfg->addBool(
+ "BINARY_TOC",
+ "If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n"
+ "controls whether a binary table of contents is generated (YES) or a\n"
+ "normal table of contents (NO) in the .chm file.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTMLHELP");
+ //----
+ cb = cfg->addBool(
+ "TOC_EXPAND",
+ "The TOC_EXPAND flag can be set to YES to add extra items for group members\n"
+ "to the contents of the HTML help documentation and to the tree view.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTMLHELP");
+ //----
+ cb = cfg->addBool(
+ "GENERATE_QHP",
+ "If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n"
+ "QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\n"
+ "that can be used as input for Qt's qhelpgenerator to generate a\n"
+ "Qt Compressed Help (.qch) of the generated HTML documentation.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cs = cfg->addString(
+ "QCH_FILE",
+ "If the QHG_LOCATION tag is specified, the QCH_FILE tag can\n"
+ "be used to specify the file name of the resulting .qch file.\n"
+ "The path specified is relative to the HTML output folder."
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_QHP");
+ //----
+ cs = cfg->addString(
+ "QHP_NAMESPACE",
+ "The QHP_NAMESPACE tag specifies the namespace to use when generating\n"
+ "Qt Help Project output. For more information please see\n"
+ "http://doc.trolltech.com/qthelpproject.html#namespace"
+ );
+ cs->setDefaultValue("org.doxygen.Project");
+ cs->addDependency("GENERATE_QHP");
+ //----
+ cs = cfg->addString(
+ "QHP_VIRTUAL_FOLDER",
+ "The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\n"
+ "Qt Help Project output. For more information please see\n"
+ "http://doc.trolltech.com/qthelpproject.html#virtual-folders"
+ );
+ cs->setDefaultValue("doc");
+ cs->addDependency("GENERATE_QHP");
+ //----
+ cs = cfg->addString(
+ "QHP_CUST_FILTER_NAME",
+ "If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\n"
+ "add. For more information please see\n"
+ "http://doc.trolltech.com/qthelpproject.html#custom-filters"
+ );
+ cs->addDependency("GENERATE_QHP");
+ //----
+ cs = cfg->addString(
+ "QHP_CUST_FILTER_ATTRS",
+ "The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\n"
+ "custom filter to add. For more information please see\n"
+ "<a href=\"http://doc.trolltech.com/qthelpproject.html#custom-filters\">\n"
+ "Qt Help Project / Custom Filters</a>."
+ );
+ cs->addDependency("GENERATE_QHP");
+ //----
+ cs = cfg->addString(
+ "QHP_SECT_FILTER_ATTRS",
+ "The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n"
+ "project's\n"
+ "filter section matches.\n"
+ "<a href=\"http://doc.trolltech.com/qthelpproject.html#filter-attributes\">\n"
+ "Qt Help Project / Filter Attributes</a>."
+ );
+ cs->addDependency("GENERATE_QHP");
+ //----
+ cs = cfg->addString(
+ "QHG_LOCATION",
+ "If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\n"
+ "be used to specify the location of Qt's qhelpgenerator.\n"
+ "If non-empty doxygen will try to run qhelpgenerator on the generated\n"
+ ".qhp file."
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_QHP");
+ //----
+ cb = cfg->addBool(
+ "GENERATE_ECLIPSEHELP",
+ "If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\n"
+ " will be generated, which together with the HTML files, form an Eclipse help\n"
+ "plugin. To install this plugin and make it available under the help contents\n"
+ "menu in Eclipse, the contents of the directory containing the HTML and XML\n"
+ "files needs to be copied into the plugins directory of eclipse. The name of\n"
+ "the directory within the plugins directory should be the same as\n"
+ "the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\n"
+ "the help appears.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cs = cfg->addString(
+ "ECLIPSE_DOC_ID",
+ "A unique identifier for the eclipse help plugin. When installing the plugin\n"
+ "the directory name containing the HTML and XML files should also have\n"
+ "this name."
+ );
+ cs->setDefaultValue("org.doxygen.Project");
+ cs->addDependency("GENERATE_ECLIPSEHELP");
+ //----
+ cb = cfg->addBool(
+ "DISABLE_INDEX",
+ "The DISABLE_INDEX tag can be used to turn on/off the condensed index at\n"
+ "top of each HTML page. The value NO (the default) enables the index and\n"
+ "the value YES disables it.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ ci = cfg->addInt(
+ "ENUM_VALUES_PER_LINE",
+ "The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\n"
+ "(range [0,1..20]) that doxygen will group on one line in the generated HTML\n"
+ "documentation. Note that a value of 0 will completely suppress the enum\n"
+ "values from appearing in the overview section.",
+ 0,20,4
+ );
+ ci->addDependency("GENERATE_HTML");
+ //----
+ cb = cfg->addBool(
+ "GENERATE_TREEVIEW",
+ "The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n"
+ "structure should be generated to display hierarchical information.\n"
+ "If the tag value is set to YES, a side panel will be generated\n"
+ "containing a tree-like index structure (just like the one that\n"
+ "is generated for HTML Help). For this to work a browser that supports\n"
+ "JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n"
+ "Windows users are probably better off using the HTML help feature.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cb = cfg->addBool(
+ "USE_INLINE_TREES",
+ "By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,\n"
+ "and Class Hierarchy pages using a tree view instead of an ordered list.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ ci = cfg->addInt(
+ "TREEVIEW_WIDTH",
+ "If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n"
+ "used to set the initial width (in pixels) of the frame in which the tree\n"
+ "is shown.",
+ 0,1500,250
+ );
+ ci->addDependency("GENERATE_HTML");
+ //----
+ cb = cfg->addBool(
+ "EXT_LINKS_IN_WINDOW",
+ "When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n"
+ "links to external symbols imported via tag files in a separate window.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ ci = cfg->addInt(
+ "FORMULA_FONTSIZE",
+ "Use this tag to change the font size of Latex formulas included\n"
+ "as images in the HTML documentation. The default is 10. Note that\n"
+ "when you change the font size after a successful doxygen run you need\n"
+ "to manually remove any form_*.png images from the HTML output directory\n"
+ "to force them to be regenerated.",
+ 8,50,10
+ );
+ ci->addDependency("GENERATE_HTML");
+ //----
+ cb = cfg->addBool(
+ "FORMULA_TRANSPARENT",
+ "Use the FORMULA_TRANPARENT tag to determine whether or not the images\n"
+ "generated for formulas are transparent PNGs. Transparent PNGs are\n"
+ "not supported properly for IE 6.0, but are supported on all modern browsers.\n"
+ "Note that when changing this option you need to delete any form_*.png files\n"
+ "in the HTML output before the changes have effect.",
+ TRUE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cb = cfg->addBool(
+ "USE_MATHJAX",
+ "Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\n"
+ "(see http://www.mathjax.org) which uses client side Javascript for the\n"
+ "rendering instead of using prerendered bitmaps. Use this if you do not\n"
+ "have LaTeX installed or if you want to formulas look prettier in the HTML\n"
+ "output. When enabled you also need to install MathJax separately and\n"
+ "configure the path to it using the MATHJAX_RELPATH option.",
+ FALSE
+ );
+ //----
+ cs = cfg->addString(
+ "MATHJAX_RELPATH",
+ "When MathJax is enabled you need to specify the location relative to the\n"
+ "HTML output directory using the MATHJAX_RELPATH option. The destination\n"
+ "directory should contain the MathJax.js script. For instance, if the mathjax\n"
+ "directory is located at the same level as the HTML output directory, then\n"
+ "MATHJAX_RELPATH should be ../mathjax. The default value points to the\n"
+ "mathjax.org site, so you can quickly see the result without installing\n"
+ "MathJax, but it is strongly recommended to install a local copy of MathJax\n"
+ "before deployment."
+ );
+ cs->setDefaultValue("http://www.mathjax.org/mathjax");
+ //----
+ cb = cfg->addBool(
+ "SEARCHENGINE",
+ "When the SEARCHENGINE tag is enabled doxygen will generate a search box\n"
+ "for the HTML output. The underlying search engine uses javascript\n"
+ "and DHTML and should work on any modern browser. Note that when using\n"
+ "HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\n"
+ "(GENERATE_DOCSET) there is already a search function so this one should\n"
+ "typically be disabled. For large projects the javascript based search engine\n"
+ "can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.",
+ TRUE
+ );
+ cb->addDependency("GENERATE_HTML");
+ //----
+ cb = cfg->addBool(
+ "SERVER_BASED_SEARCH",
+ "When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n"
+ "implemented using a PHP enabled web server instead of at the web client\n"
+ "using Javascript. Doxygen will generate the search PHP script and index\n"
+ "file to put on the web server. The advantage of the server\n"
+ "based approach is that it scales better to large projects and allows\n"
+ "full text search. The disadvantages are that it is more difficult to setup\n"
+ "and does not have live searching capabilities.",
+ FALSE
+ );
+ cb->addDependency("SEARCHENGINE");
+ //---------------------------------------------------------------------------
+ cfg->addInfo("LaTeX","configuration options related to the LaTeX output");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "GENERATE_LATEX",
+ "If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n"
+ "generate Latex output.",
+ TRUE
+ );
+ //----
+ cs = cfg->addString(
+ "LATEX_OUTPUT",
+ "The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n"
+ "If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"
+ "put in front of it. If left blank `latex' will be used as the default path."
+ );
+ cs->setDefaultValue("latex");
+ cs->setWidgetType(ConfigString::Dir);
+ cs->addDependency("GENERATE_LATEX");
+ //----
+ cs = cfg->addString(
+ "LATEX_CMD_NAME",
+ "The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n"
+ "invoked. If left blank `latex' will be used as the default command name.\n"
+ "Note that when enabling USE_PDFLATEX this option is only used for\n"
+ "generating bitmaps for formulas in the HTML output, but not in the\n"
+ "Makefile that is written to the output directory."
+ );
+ cs->setDefaultValue("latex");
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_LATEX");
+ //----
+ cs = cfg->addString(
+ "MAKEINDEX_CMD_NAME",
+ "The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\n"
+ "generate index for LaTeX. If left blank `makeindex' will be used as the\n"
+ "default command name."
+ );
+ cs->setDefaultValue("makeindex");
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_LATEX");
+ //----
+ cb = cfg->addBool(
+ "COMPACT_LATEX",
+ "If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n"
+ "LaTeX documents. This may be useful for small projects and may help to\n"
+ "save some trees in general.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_LATEX");
+ //----
+ ce = cfg->addEnum(
+ "PAPER_TYPE",
+ "The PAPER_TYPE tag can be used to set the paper type that is used\n"
+ "by the printer. Possible values are: a4, letter, legal and\n"
+ "executive. If left blank a4wide will be used.",
+ "a4"
+ );
+ ce->addValue("a4");
+ ce->addValue("a4wide");
+ ce->addValue("letter");
+ ce->addValue("legal");
+ ce->addValue("executive");
+ ce->addDependency("GENERATE_LATEX");
+ //----
+ cl = cfg->addList(
+ "EXTRA_PACKAGES",
+ "The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n"
+ "packages that should be included in the LaTeX output."
+ );
+ cl->addDependency("GENERATE_LATEX");
+ //----
+ cs = cfg->addString(
+ "LATEX_HEADER",
+ "The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n"
+ "the generated latex document. The header should contain everything until\n"
+ "the first chapter. If it is left blank doxygen will generate a\n"
+ "standard header. Notice: only use this tag if you know what you are doing!"
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_LATEX");
+ //----
+ cs = cfg->addString(
+ "LATEX_FOOTER",
+ "The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\n"
+ "the generated latex document. The footer should contain everything after\n"
+ "the last chapter. If it is left blank doxygen will generate a\n"
+ "standard footer. Notice: only use this tag if you know what you are doing!"
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_LATEX");
+ //----
+ cb = cfg->addBool(
+ "PDF_HYPERLINKS",
+ "If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n"
+ "is prepared for conversion to pdf (using ps2pdf). The pdf file will\n"
+ "contain links (just like the HTML output) instead of page references\n"
+ "This makes the output suitable for online browsing using a pdf viewer.",
+ TRUE
+ );
+ cb->addDependency("GENERATE_LATEX");
+ //----
+ cb = cfg->addBool(
+ "USE_PDFLATEX",
+ "If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n"
+ "plain latex in the generated Makefile. Set this option to YES to get a\n"
+ "higher quality PDF documentation.",
+ TRUE
+ );
+ cb->addDependency("GENERATE_LATEX");
+ //----
+ cb = cfg->addBool(
+ "LATEX_BATCHMODE",
+ "If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n"
+ "command to the generated LaTeX files. This will instruct LaTeX to keep\n"
+ "running if errors occur, instead of asking the user for help.\n"
+ "This option is also used when generating formulas in HTML.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_LATEX");
+ //----
+ cb = cfg->addBool(
+ "LATEX_HIDE_INDICES",
+ "If LATEX_HIDE_INDICES is set to YES then doxygen will not\n"
+ "include the index chapters (such as File Index, Compound Index, etc.)\n"
+ "in the output.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_LATEX");
+ //----
+ cb = cfg->addBool(
+ "LATEX_SOURCE_CODE",
+ "If LATEX_SOURCE_CODE is set to YES then doxygen will include\n"
+ "source code with syntax highlighting in the LaTeX output.\n"
+ "Note that which sources are shown also depends on other settings\n"
+ "such as SOURCE_BROWSER.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_LATEX");
+ //---------------------------------------------------------------------------
+ cfg->addInfo("RTF","configuration options related to the RTF output");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "GENERATE_RTF",
+ "If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n"
+ "The RTF output is optimized for Word 97 and may not look very pretty with\n"
+ "other RTF readers or editors.",
+ FALSE
+ );
+ //----
+ cs = cfg->addString(
+ "RTF_OUTPUT",
+ "The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n"
+ "If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"
+ "put in front of it. If left blank `rtf' will be used as the default path."
+ );
+ cs->setDefaultValue("rtf");
+ cs->setWidgetType(ConfigString::Dir);
+ cs->addDependency("GENERATE_RTF");
+ //----
+ cb = cfg->addBool(
+ "COMPACT_RTF",
+ "If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n"
+ "RTF documents. This may be useful for small projects and may help to\n"
+ "save some trees in general.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_RTF");
+ //----
+ cb = cfg->addBool(
+ "RTF_HYPERLINKS",
+ "If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n"
+ "will contain hyperlink fields. The RTF file will\n"
+ "contain links (just like the HTML output) instead of page references.\n"
+ "This makes the output suitable for online browsing using WORD or other\n"
+ "programs which support those fields.\n"
+ "Note: wordpad (write) and others do not support links.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_RTF");
+ //----
+ cs = cfg->addString(
+ "RTF_STYLESHEET_FILE",
+ "Load stylesheet definitions from file. Syntax is similar to doxygen's\n"
+ "config file, i.e. a series of assignments. You only have to provide\n"
+ "replacements, missing definitions are set to their default value."
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_RTF");
+ //----
+ cs = cfg->addString(
+ "RTF_EXTENSIONS_FILE",
+ "Set optional variables used in the generation of an rtf document.\n"
+ "Syntax is similar to doxygen's config file."
+ );
+ cs->setWidgetType(ConfigString::File);
+ cs->addDependency("GENERATE_RTF");
+ //---------------------------------------------------------------------------
+ cfg->addInfo("Man","configuration options related to the man page output");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "GENERATE_MAN",
+ "If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n"
+ "generate man pages",
+ FALSE
+ );
+ //----
+ cs = cfg->addString(
+ "MAN_OUTPUT",
+ "The MAN_OUTPUT tag is used to specify where the man pages will be put.\n"
+ "If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"
+ "put in front of it. If left blank `man' will be used as the default path."
+ );
+ cs->setDefaultValue("man");
+ cs->setWidgetType(ConfigString::Dir);
+ cs->addDependency("GENERATE_MAN");
+ //----
+ cs = cfg->addString(
+ "MAN_EXTENSION",
+ "The MAN_EXTENSION tag determines the extension that is added to\n"
+ "the generated man pages (default is the subroutine's section .3)"
+ );
+ cs->setDefaultValue(".3");
+ cs->addDependency("GENERATE_MAN");
+ //----
+ cb = cfg->addBool(
+ "MAN_LINKS",
+ "If the MAN_LINKS tag is set to YES and Doxygen generates man output,\n"
+ "then it will generate one additional man file for each entity\n"
+ "documented in the real man page(s). These additional files\n"
+ "only source the real man page, but without them the man command\n"
+ "would be unable to find the correct page. The default is NO.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_MAN");
+ //---------------------------------------------------------------------------
+ cfg->addInfo("XML","configuration options related to the XML output");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "GENERATE_XML",
+ "If the GENERATE_XML tag is set to YES Doxygen will\n"
+ "generate an XML file that captures the structure of\n"
+ "the code including all documentation.",
+ FALSE
+ );
+ //----
+ cs = cfg->addString(
+ "XML_OUTPUT",
+ "The XML_OUTPUT tag is used to specify where the XML pages will be put.\n"
+ "If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"
+ "put in front of it. If left blank `xml' will be used as the default path."
+ );
+ cs->setDefaultValue("xml");
+ cs->setWidgetType(ConfigString::Dir);
+ cs->addDependency("GENERATE_XML");
+ //----
+ cs = cfg->addString(
+ "XML_SCHEMA",
+ "The XML_SCHEMA tag can be used to specify an XML schema,\n"
+ "which can be used by a validating XML parser to check the\n"
+ "syntax of the XML files."
+ );
+ cs->addDependency("GENERATE_XML");
+ //----
+ cs = cfg->addString(
+ "XML_DTD",
+ "The XML_DTD tag can be used to specify an XML DTD,\n"
+ "which can be used by a validating XML parser to check the\n"
+ "syntax of the XML files."
+ );
+ cs->addDependency("GENERATE_XML");
+ //----
+ cb = cfg->addBool(
+ "XML_PROGRAMLISTING",
+ "If the XML_PROGRAMLISTING tag is set to YES Doxygen will\n"
+ "dump the program listings (including syntax highlighting\n"
+ "and cross-referencing information) to the XML output. Note that\n"
+ "enabling this will significantly increase the size of the XML output.",
+ TRUE
+ );
+ cb->addDependency("GENERATE_XML");
+ //---------------------------------------------------------------------------
+ cfg->addInfo("DEF","configuration options for the AutoGen Definitions output");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "GENERATE_AUTOGEN_DEF",
+ "If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\n"
+ "generate an AutoGen Definitions (see autogen.sf.net) file\n"
+ "that captures the structure of the code including all\n"
+ "documentation. Note that this feature is still experimental\n"
+ "and incomplete at the moment.",
+ FALSE
+ );
+ //---------------------------------------------------------------------------
+ cfg->addInfo("PerlMod","configuration options related to the Perl module output");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "GENERATE_PERLMOD",
+ "If the GENERATE_PERLMOD tag is set to YES Doxygen will\n"
+ "generate a Perl module file that captures the structure of\n"
+ "the code including all documentation. Note that this\n"
+ "feature is still experimental and incomplete at the\n"
+ "moment.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "PERLMOD_LATEX",
+ "If the PERLMOD_LATEX tag is set to YES Doxygen will generate\n"
+ "the necessary Makefile rules, Perl scripts and LaTeX code to be able\n"
+ "to generate PDF and DVI output from the Perl module output.",
+ FALSE
+ );
+ cb->addDependency("GENERATE_PERLMOD");
+ //----
+ cb = cfg->addBool(
+ "PERLMOD_PRETTY",
+ "If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\n"
+ "nicely formatted so it can be parsed by a human reader.\n"
+ "This is useful\n"
+ "if you want to understand what is going on.\n"
+ "On the other hand, if this\n"
+ "tag is set to NO the size of the Perl module output will be much smaller\n"
+ "and Perl will parse it just the same.",
+ TRUE
+ );
+ cb->addDependency("GENERATE_PERLMOD");
+ //----
+ cs = cfg->addString(
+ "PERLMOD_MAKEVAR_PREFIX",
+ "The names of the make variables in the generated doxyrules.make file\n"
+ "are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\n"
+ "This is useful so different doxyrules.make files included by the same\n"
+ "Makefile don't overwrite each other's variables."
+ );
+ cs->addDependency("GENERATE_PERLMOD");
+ //---------------------------------------------------------------------------
+ cfg->addInfo("Preprocessor","Configuration options related to the preprocessor");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "ENABLE_PREPROCESSING",
+ "If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n"
+ "evaluate all C-preprocessor directives found in the sources and include\n"
+ "files.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "MACRO_EXPANSION",
+ "If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n"
+ "names in the source code. If set to NO (the default) only conditional\n"
+ "compilation will be performed. Macro expansion can be done in a controlled\n"
+ "way by setting EXPAND_ONLY_PREDEF to YES.",
+ FALSE
+ );
+ cb->addDependency("ENABLE_PREPROCESSING");
+ //----
+ cb = cfg->addBool(
+ "EXPAND_ONLY_PREDEF",
+ "If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n"
+ "then the macro expansion is limited to the macros specified with the\n"
+ "PREDEFINED and EXPAND_AS_DEFINED tags.",
+ FALSE
+ );
+ cb->addDependency("ENABLE_PREPROCESSING");
+ //----
+ cb = cfg->addBool(
+ "SEARCH_INCLUDES",
+ "If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n"
+ "pointed to by INCLUDE_PATH will be searched when a #include is found.",
+ TRUE
+ );
+ cb->addDependency("ENABLE_PREPROCESSING");
+ //----
+ cl = cfg->addList(
+ "INCLUDE_PATH",
+ "The INCLUDE_PATH tag can be used to specify one or more directories that\n"
+ "contain include files that are not input files but should be processed by\n"
+ "the preprocessor."
+ );
+ cl->addDependency("ENABLE_PREPROCESSING");
+ cl->setWidgetType(ConfigList::Dir);
+ //----
+ cl = cfg->addList(
+ "INCLUDE_FILE_PATTERNS",
+ "You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n"
+ "patterns (like *.h and *.hpp) to filter out the header-files in the\n"
+ "directories. If left blank, the patterns specified with FILE_PATTERNS will\n"
+ "be used."
+ );
+ cl->addDependency("ENABLE_PREPROCESSING");
+ //----
+ cl = cfg->addList(
+ "PREDEFINED",
+ "The PREDEFINED tag can be used to specify one or more macro names that\n"
+ "are defined before the preprocessor is started (similar to the -D option of\n"
+ "gcc). The argument of the tag is a list of macros of the form: name\n"
+ "or name=definition (no spaces). If the definition and the = are\n"
+ "omitted =1 is assumed. To prevent a macro definition from being\n"
+ "undefined via #undef or recursively expanded use the := operator\n"
+ "instead of the = operator."
+ );
+ cl->addDependency("ENABLE_PREPROCESSING");
+ //----
+ cl = cfg->addList(
+ "EXPAND_AS_DEFINED",
+ "If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\n"
+ "this tag can be used to specify a list of macro names that should be expanded.\n"
+ "The macro definition that is found in the sources will be used.\n"
+ "Use the PREDEFINED tag if you want to use a different macro definition that\n"
+ "overrules the definition found in the source code."
+ );
+ cl->addDependency("ENABLE_PREPROCESSING");
+ //----
+ cb = cfg->addBool(
+ "SKIP_FUNCTION_MACROS",
+ "If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\n"
+ "doxygen's preprocessor will remove all references to function-like macros\n"
+ "that are alone on a line, have an all uppercase name, and do not end with a\n"
+ "semicolon, because these will confuse the parser if not removed.",
+ TRUE
+ );
+ cb->addDependency("ENABLE_PREPROCESSING");
+ //---------------------------------------------------------------------------
+ cfg->addInfo("External","Configuration::additions related to external references");
+ //---------------------------------------------------------------------------
+
+ //----
+ cl = cfg->addList(
+ "TAGFILES",
+ "The TAGFILES option can be used to specify one or more tagfiles.\n"
+ "Optionally an initial location of the external documentation\n"
+ "can be added for each tagfile. The format of a tag file without\n"
+ "this location is as follows:\n"
+ "\n"
+ "TAGFILES = file1 file2 ...\n"
+ "Adding location for the tag files is done as follows:\n"
+ "\n"
+ "TAGFILES = file1=loc1 \"file2 = loc2\" ...\n"
+ "where \"loc1\" and \"loc2\" can be relative or absolute paths or\n"
+ "URLs. If a location is present for each tag, the installdox tool\n"
+ "does not have to be run to correct the links.\n"
+ "Note that each tag file must have a unique name\n"
+ "(where the name does NOT include the path)\n"
+ "If a tag file is not located in the directory in which doxygen\n"
+ "is run, you must also specify the path to the tagfile here."
+ );
+ cl->setWidgetType(ConfigList::File);
+ //----
+ cs = cfg->addString(
+ "GENERATE_TAGFILE",
+ "When a file name is specified after GENERATE_TAGFILE, doxygen will create\n"
+ "a tag file that is based on the input files it reads."
+ );
+ cs->setWidgetType(ConfigString::File);
+ //----
+ cb = cfg->addBool(
+ "ALLEXTERNALS",
+ "If the ALLEXTERNALS tag is set to YES all external classes will be listed\n"
+ "in the class index. If set to NO only the inherited external classes\n"
+ "will be listed.",
+ FALSE
+ );
+ //----
+ cb = cfg->addBool(
+ "EXTERNAL_GROUPS",
+ "If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\n"
+ "in the modules index. If set to NO, only the current project's groups will\n"
+ "be listed.",
+ TRUE
+ );
+ //----
+ cs = cfg->addString(
+ "PERL_PATH",
+ "The PERL_PATH should be the absolute path and name of the perl script\n"
+ "interpreter (i.e. the result of `which perl')."
+ );
+ cs->setDefaultValue("/usr/bin/perl");
+ cs->setWidgetType(ConfigString::Dir);
+ //---------------------------------------------------------------------------
+ cfg->addInfo("Dot","Configuration options related to the dot tool");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "CLASS_DIAGRAMS",
+ "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n"
+ "generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n"
+ "or super classes. Setting the tag to NO turns the diagrams off. Note that\n"
+ "this option also works with HAVE_DOT disabled, but it is recommended to\n"
+ "install and use dot, since it yields more powerful graphs.",
+ TRUE
+ );
+ //----
+ cs = cfg->addString(
+ "MSCGEN_PATH",
+ "You can define message sequence charts within doxygen comments using the \\msc\n"
+ "command. Doxygen will then run the mscgen tool (see\n"
+ "http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\n"
+ "documentation. The MSCGEN_PATH tag allows you to specify the directory where\n"
+ "the mscgen tool resides. If left empty the tool is assumed to be found in the\n"
+ "default search path."
+ );
+ //----
+ cb = cfg->addBool(
+ "HIDE_UNDOC_RELATIONS",
+ "If set to YES, the inheritance and collaboration graphs will hide\n"
+ "inheritance and usage relations if the target is undocumented\n"
+ "or is not a class.",
+ TRUE
+ );
+ //----
+ cb = cfg->addBool(
+ "HAVE_DOT",
+ "If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n"
+ "available from the path. This tool is part of Graphviz, a graph visualization\n"
+ "toolkit from AT&T and Lucent Bell Labs. The other options in this section\n"
+ "have no effect if this option is set to NO (the default)",
+ FALSE
+ );
+ //----
+ ci = cfg->addInt(
+ "DOT_NUM_THREADS",
+ "The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n"
+ "allowed to run in parallel. When set to 0 (the default) doxygen will\n"
+ "base this on the number of processors available in the system. You can set it\n"
+ "explicitly to a value larger than 0 to get control over the balance\n"
+ "between CPU load and processing speed.",
+ 0,32,0
+ );
+ //----
+ cs = cfg->addString(
+ "DOT_FONTNAME",
+ "By default doxygen will write a font called Helvetica to the output\n"
+ "directory and reference it in all dot files that doxygen generates.\n"
+ "When you want a differently looking font you can specify the font name\n"
+ "using DOT_FONTNAME. You need to make sure dot is able to find the font,\n"
+ "which can be done by putting it in a standard location or by setting the\n"
+ "DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory\n"
+ "containing the font."
+ );
+ cs->setDefaultValue("Helvetica");
+ cs->addDependency("HAVE_DOT");
+ //----
+ ci = cfg->addInt(
+ "DOT_FONTSIZE",
+ "The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\n"
+ "The default size is 10pt.",
+ 4,24,10
+ );
+ ci->addDependency("HAVE_DOT");
+ //----
+ cs = cfg->addString(
+ "DOT_FONTPATH",
+ "By default doxygen will tell dot to use the output directory to look for the\n"
+ "FreeSans.ttf font (which doxygen will put there itself). If you specify a\n"
+ "different font using DOT_FONTNAME you can set the path where dot\n"
+ "can find it using this tag."
+ );
+ cs->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "CLASS_GRAPH",
+ "If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n"
+ "will generate a graph for each documented class showing the direct and\n"
+ "indirect inheritance relations. Setting this tag to YES will force the\n"
+ "the CLASS_DIAGRAMS tag to NO.",
+ TRUE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "COLLABORATION_GRAPH",
+ "If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n"
+ "will generate a graph for each documented class showing the direct and\n"
+ "indirect implementation dependencies (inheritance, containment, and\n"
+ "class references variables) of the class with other documented classes.",
+ TRUE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "GROUP_GRAPHS",
+ "If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\n"
+ "will generate a graph for groups, showing the direct groups dependencies",
+ TRUE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "UML_LOOK",
+ "If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n"
+ "collaboration diagrams in a style similar to the OMG's Unified Modeling\n"
+ "Language.",
+ FALSE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "TEMPLATE_RELATIONS",
+ "If set to YES, the inheritance and collaboration graphs will show the\n"
+ "relations between templates and their instances.",
+ FALSE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "INCLUDE_GRAPH",
+ "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\n"
+ "tags are set to YES then doxygen will generate a graph for each documented\n"
+ "file showing the direct and indirect include dependencies of the file with\n"
+ "other documented files.",
+ TRUE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "INCLUDED_BY_GRAPH",
+ "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\n"
+ "HAVE_DOT tags are set to YES then doxygen will generate a graph for each\n"
+ "documented header file showing the documented files that directly or\n"
+ "indirectly include this file.",
+ TRUE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "CALL_GRAPH",
+ "If the CALL_GRAPH and HAVE_DOT options are set to YES then\n"
+ "doxygen will generate a call dependency graph for every global function\n"
+ "or class method. Note that enabling this option will significantly increase\n"
+ "the time of a run. So in most cases it will be better to enable call graphs\n"
+ "for selected functions only using the \\callgraph command.",
+ FALSE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "CALLER_GRAPH",
+ "If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\n"
+ "doxygen will generate a caller dependency graph for every global function\n"
+ "or class method. Note that enabling this option will significantly increase\n"
+ "the time of a run. So in most cases it will be better to enable caller\n"
+ "graphs for selected functions only using the \\callergraph command.",
+ FALSE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "GRAPHICAL_HIERARCHY",
+ "If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n"
+ "will generate a graphical hierarchy of all classes instead of a textual one.",
+ TRUE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "DIRECTORY_GRAPH",
+ "If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES\n"
+ "then doxygen will show the dependencies a directory has on other directories\n"
+ "in a graphical way. The dependency relations are determined by the #include\n"
+ "relations between the files in the directories.",
+ TRUE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ ce = cfg->addEnum(
+ "DOT_IMAGE_FORMAT",
+ "The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n"
+ "generated by dot. Possible values are svg, png, jpg, or gif.\n"
+ "If left blank png will be used.",
+ "png"
+ );
+ ce->addValue("png");
+ ce->addValue("jpg");
+ ce->addValue("gif");
+ ce->addValue("svg");
+ ce->addDependency("HAVE_DOT");
+ //----
+ cs = cfg->addString(
+ "DOT_PATH",
+ "The tag DOT_PATH can be used to specify the path where the dot tool can be\n"
+ "found. If left blank, it is assumed the dot tool can be found in the path."
+ );
+ cs->setWidgetType(ConfigString::Dir);
+ cs->addDependency("HAVE_DOT");
+ //----
+ cl = cfg->addList(
+ "DOTFILE_DIRS",
+ "The DOTFILE_DIRS tag can be used to specify one or more directories that\n"
+ "contain dot files that are included in the documentation (see the\n"
+ "\\dotfile command)."
+ );
+ cl->addDependency("HAVE_DOT");
+ cl->setWidgetType(ConfigList::Dir);
+ //----
+ cl = cfg->addList(
+ "MSCFILE_DIRS",
+ "The MSCFILE_DIRS tag can be used to specify one or more directories that\n"
+ "contain msc files that are included in the documentation (see the\n"
+ "\\mscfile command)."
+ );
+ cl->setWidgetType(ConfigList::Dir);
+ //----
+ ci = cfg->addInt(
+ "DOT_GRAPH_MAX_NODES",
+ "The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n"
+ "nodes that will be shown in the graph. If the number of nodes in a graph\n"
+ "becomes larger than this value, doxygen will truncate the graph, which is\n"
+ "visualized by representing a node as a red box. Note that doxygen if the\n"
+ "number of direct children of the root node in a graph is already larger than\n"
+ "DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\n"
+ "that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.",
+ 0,10000,50
+ );
+ ci->addDependency("HAVE_DOT");
+ //----
+ ci = cfg->addInt(
+ "MAX_DOT_GRAPH_DEPTH",
+ "The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\n"
+ "graphs generated by dot. A depth value of 3 means that only nodes reachable\n"
+ "from the root by following a path via at most 3 edges will be shown. Nodes\n"
+ "that lay further from the root node will be omitted. Note that setting this\n"
+ "option to 1 or 2 may greatly reduce the computation time needed for large\n"
+ "code bases. Also note that the size of a graph can be further restricted by\n"
+ "DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.",
+ 0,1000,0
+ );
+ ci->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "DOT_TRANSPARENT",
+ "Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n"
+ "background. This is disabled by default, because dot on Windows does not\n"
+ "seem to support this out of the box. Warning: Depending on the platform used,\n"
+ "enabling this option may lead to badly anti-aliased labels on the edges of\n"
+ "a graph (i.e. they become hard to read).",
+ FALSE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "DOT_MULTI_TARGETS",
+ "Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n"
+ "files in one run (i.e. multiple -o and -T options on the command line). This\n"
+ "makes dot run faster, but since only newer versions of dot (>1.8.10)\n"
+ "support this, this feature is disabled by default.",
+ FALSE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "GENERATE_LEGEND",
+ "If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n"
+ "generate a legend page explaining the meaning of the various boxes and\n"
+ "arrows in the dot generated graphs.",
+ TRUE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cb = cfg->addBool(
+ "DOT_CLEANUP",
+ "If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n"
+ "remove the intermediate dot files that are used to generate\n"
+ "the various graphs.",
+ TRUE
+ );
+ cb->addDependency("HAVE_DOT");
+ //----
+ cfg->addObsolete("USE_WINDOWS_ENCODING");
+ //----
+ cfg->addObsolete("DETAILS_AT_TOP");
+ //----
+ cfg->addObsolete("QTHELP_FILE");
+ //----
+ cfg->addObsolete("QTHELP_CONFIG");
+ //----
+ cfg->addObsolete("DOXYGEN2QTHELP_LOC");
+ //----
+ cfg->addObsolete("MAX_DOT_GRAPH_WIDTH");
+ //----
+ cfg->addObsolete("MAX_DOT_GRAPH_HEIGHT");
+ //----
+ cfg->addObsolete("CGI_NAME");
+ //----
+ cfg->addObsolete("CGI_URL");
+ //----
+ cfg->addObsolete("DOC_URL");
+ //----
+ cfg->addObsolete("DOC_ABSPATH");
+ //----
+ cfg->addObsolete("BIN_ABSPATH");
+ //----
+ cfg->addObsolete("EXT_DOC_PATHS");
+}
diff --git a/src/configoptions.h b/src/configoptions.h
new file mode 100644
index 0000000..abc37dd
--- /dev/null
+++ b/src/configoptions.h
@@ -0,0 +1,26 @@
+/******************************************************************************
+ *
+ * $Id: configoptions.h,v 1.39 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef CONFIGOPTIONS
+#define CONFIGOPTIONS
+
+class Config;
+
+void addConfigOptions(Config *cfg);
+
+#endif
diff --git a/src/constexp.h b/src/constexp.h
new file mode 100644
index 0000000..43b9501
--- /dev/null
+++ b/src/constexp.h
@@ -0,0 +1,33 @@
+/******************************************************************************
+ *
+ * $Id: constexp.h,v 1.6 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _CONSTEXP_H
+#define _CONSTEXP_H
+
+#include "qtbc.h"
+#include "cppvalue.h"
+
+extern bool parseCppExpression(const char *fileName,int line,const QCString &s);
+extern int cppExpYYparse();
+extern int cppExpYYdebug;
+extern QCString g_strToken;
+extern CPPValue g_resultValue;
+extern QCString g_constExpFileName;
+extern int g_constExpLineNr;
+
+#endif
diff --git a/src/constexp.l b/src/constexp.l
new file mode 100644
index 0000000..873d5eb
--- /dev/null
+++ b/src/constexp.l
@@ -0,0 +1,120 @@
+/******************************************************************************
+ *
+ * $Id: constexp.l,v 1.11 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+
+#include "constexp.h"
+#include "cppvalue.h"
+#include "ce_parse.h" // generated header file
+
+#define YY_NEVER_INTERACTIVE 1
+
+QCString g_strToken;
+CPPValue g_resultValue;
+int g_constExpLineNr;
+QCString g_constExpFileName;
+
+static const char *g_inputString;
+static int g_inputPosition;
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+%}
+
+CONSTSUFFIX ([uU][lL]?[lL]?)|([lL][lL]?[uU]?)
+
+%option nounput
+
+%%
+
+"?" { return TOK_QUESTIONMARK; }
+":" { return TOK_COLON; }
+"||" { return TOK_OR; }
+"&&" { return TOK_AND; }
+"|" { return TOK_BITWISEOR; }
+"^" { return TOK_BITWISEXOR; }
+"&" { return TOK_AMPERSAND; }
+"!=" { return TOK_NOTEQUAL; }
+"==" { return TOK_EQUAL; }
+"<" { return TOK_LESSTHAN; }
+">" { return TOK_GREATERTHAN; }
+"<=" { return TOK_LESSTHANOREQUALTO; }
+">=" { return TOK_GREATERTHANOREQUALTO; }
+"<<" { return TOK_SHIFTLEFT; }
+">>" { return TOK_SHIFTRIGHT; }
+"+" { return TOK_PLUS; }
+"-" { return TOK_MINUS; }
+"*" { return TOK_STAR; }
+"/" { return TOK_DIVIDE; }
+"%" { return TOK_MOD; }
+"~" { return TOK_TILDE; }
+"!" { return TOK_NOT; }
+"(" { return TOK_LPAREN; }
+")" { return TOK_RPAREN; }
+"'"(([^\'\n\r\\]+)|(\\(([ntvbrfa\\?'\"])|([0-9]+)|([xX][0-9a-fA-F]+))))"'" {
+ g_strToken=yytext;
+ return TOK_CHARACTER;
+ }
+0[0-7]*{CONSTSUFFIX}? { g_strToken=yytext;
+ return TOK_OCTALINT;
+ }
+[1-9][0-9]*{CONSTSUFFIX}? { g_strToken=yytext;
+ return TOK_DECIMALINT;
+ }
+(0x|0X)[0-9a-fA-F]+{CONSTSUFFIX}? { g_strToken=yytext+2;
+ return TOK_HEXADECIMALINT;
+ }
+(([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))([eE]([\-\+])?[0-9]+)?([fFlL])? {
+ g_strToken=yytext; return TOK_FLOAT;
+ }
+([0-9]+[eE])([\-\+])?[0-9]+([fFlL])? {
+ g_strToken=yytext; return TOK_FLOAT;
+ }
+.
+\n
+
+%%
+
+bool parseCppExpression(const char *fileName,int lineNr,const QCString &s)
+{
+ //printf("Expression: `%s'\n",s.data());
+ g_constExpFileName = fileName;
+ g_constExpLineNr = lineNr;
+ g_inputString = s;
+ g_inputPosition = 0;
+ cppExpYYrestart( cppExpYYin );
+ cppExpYYparse();
+ //printf("Result: %ld\n",(long)g_resultValue);
+ return (long)g_resultValue!=0;
+}
+
+extern "C" {
+ int cppExpYYwrap() { return 1; }
+}
diff --git a/src/constexp.y b/src/constexp.y
new file mode 100644
index 0000000..a07b023
--- /dev/null
+++ b/src/constexp.y
@@ -0,0 +1,278 @@
+/******************************************************************************
+ *
+ * $Id: constexp.y,v 1.6 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+
+#include "cppvalue.h"
+#include "constexp.h"
+#include "message.h"
+
+#if defined(_MSC_VER)
+#define MSDOS
+#endif
+
+#define YYSTYPE CPPValue
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int cppExpYYerror(const char *s)
+{
+ warn(g_constExpFileName,g_constExpLineNr,
+ "warning: preprocessing issue while doing constant expression evaluation: %s",s);
+ return 0;
+}
+
+int cppExpYYlex();
+
+%}
+
+%token TOK_QUESTIONMARK
+%token TOK_COLON
+%token TOK_OR
+%token TOK_AND
+%token TOK_BITWISEOR
+%token TOK_BITWISEXOR
+%token TOK_AMPERSAND
+%token TOK_NOTEQUAL
+%token TOK_EQUAL
+%token TOK_LESSTHAN
+%token TOK_GREATERTHAN
+%token TOK_LESSTHANOREQUALTO
+%token TOK_GREATERTHANOREQUALTO
+%token TOK_SHIFTLEFT
+%token TOK_SHIFTRIGHT
+%token TOK_PLUS
+%token TOK_MINUS
+%token TOK_STAR
+%token TOK_DIVIDE
+%token TOK_MOD
+%token TOK_TILDE
+%token TOK_NOT
+%token TOK_LPAREN
+%token TOK_RPAREN
+%token TOK_OCTALINT
+%token TOK_DECIMALINT
+%token TOK_HEXADECIMALINT
+%token TOK_CHARACTER
+%token TOK_FLOAT
+
+%%
+
+start: constant_expression
+ { g_resultValue = $1; return 0; }
+;
+
+constant_expression: logical_or_expression
+ { $$ = $1; }
+ | logical_or_expression
+ TOK_QUESTIONMARK logical_or_expression
+ TOK_COLON logical_or_expression
+ {
+ bool c = ($1.isInt() ? ((long)$1 != 0) : ((double)$1 != 0.0));
+ $$ = c ? $3 : $5;
+ }
+;
+
+logical_or_expression: logical_and_expression
+ { $$ = $1; }
+ | logical_or_expression TOK_OR logical_and_expression
+ {
+ $$ = CPPValue( (long)((long)$1 || (long)$3) );
+ }
+;
+
+logical_and_expression: inclusive_or_expression
+ { $$ = $1; }
+ | logical_and_expression TOK_AND inclusive_or_expression
+ {
+ $$ = CPPValue( (long)((long)$1 && (long)$3) );
+ }
+;
+
+inclusive_or_expression: exclusive_or_expression
+ { $$ = $1; }
+ | inclusive_or_expression TOK_BITWISEOR
+ exclusive_or_expression
+ {
+ $$ = CPPValue( (long)$1 | (long)$3 );
+ }
+;
+
+exclusive_or_expression: and_expression
+ { $$ = $1; }
+ | exclusive_or_expression TOK_BITWISEXOR and_expression
+ {
+ $$ = CPPValue( (long)$1 ^ (long)$3 );
+ }
+;
+
+and_expression: equality_expression
+ { $$ = $1; }
+ | and_expression TOK_AMPERSAND equality_expression
+ {
+ $$ = CPPValue( (long)$1 & (long)$3 );
+ }
+;
+
+equality_expression: relational_expression
+ { $$ = $1; }
+ | equality_expression TOK_EQUAL relational_expression
+ {
+ $$ = CPPValue( (long)((double)$1 == (double)$3) );
+ }
+ | equality_expression TOK_NOTEQUAL relational_expression
+ {
+ $$ = CPPValue( (long)((double)$1 != (double)$3) );
+ }
+;
+
+relational_expression: shift_expression
+ { $$ = $1; }
+ | relational_expression TOK_LESSTHAN shift_expression
+ {
+ $$ = CPPValue( (long)((double)$1 < (double)$3) );
+ }
+ | relational_expression TOK_GREATERTHAN shift_expression
+ {
+ $$ = CPPValue( (long)((double)$1 > (double)$3) );
+ }
+ | relational_expression TOK_LESSTHANOREQUALTO
+ shift_expression
+ {
+ $$ = CPPValue( (long)((double)$1 <= (double)$3) );
+ }
+ | relational_expression TOK_GREATERTHANOREQUALTO
+ shift_expression
+ {
+ $$ = CPPValue( (long)((double)$1 >= (double)$3) );
+ }
+;
+
+shift_expression: additive_expression
+ { $$ = $1; }
+ | shift_expression TOK_SHIFTLEFT additive_expression
+ {
+ $$ = CPPValue( (long)$1 << (long)$3 );
+ }
+ | shift_expression TOK_SHIFTRIGHT additive_expression
+ {
+ $$ = CPPValue( (long)$1 >> (long)$3 );
+ }
+;
+
+additive_expression: multiplicative_expression
+ { $$ = $1; }
+ | additive_expression TOK_PLUS multiplicative_expression
+ {
+ if (!$1.isInt() || !$3.isInt())
+ {
+ $$ = CPPValue( (double)$1 + (double)$3 );
+ }
+ else
+ {
+ $$ = CPPValue( (long)$1 + (long)$3 );
+ }
+ }
+ | additive_expression TOK_MINUS multiplicative_expression
+ {
+ if (!$1.isInt() || !$3.isInt())
+ {
+ $$ = CPPValue( (double)$1 - (double)$3 );
+ }
+ else
+ {
+ $$ = CPPValue( (long)$1 - (long)$3 );
+ }
+ }
+;
+
+multiplicative_expression: unary_expression
+ { $$ = $1; }
+ | multiplicative_expression TOK_STAR unary_expression
+ {
+ if (!$1.isInt() || !$3.isInt())
+ {
+ $$ = CPPValue( (double)$1 * (double)$3 );
+ }
+ else
+ {
+ $$ = CPPValue( (long)$1 * (long)$3 );
+ }
+ }
+ | multiplicative_expression TOK_DIVIDE unary_expression
+ {
+ if (!$1.isInt() || !$3.isInt())
+ {
+ $$ = CPPValue( (double)$1 / (double)$3 );
+ }
+ else
+ {
+ long value = $3;
+ if (value==0) value=1;
+ $$ = CPPValue( (long)$1 / value );
+ }
+ }
+ | multiplicative_expression TOK_MOD unary_expression
+ {
+ long value = $3;
+ if (value==0) value=1;
+ $$ = CPPValue( (long)$1 % value );
+ }
+;
+
+unary_expression: primary_expression
+ { $$ = $1; }
+ | TOK_PLUS unary_expression
+ { $$ = $1; }
+ | TOK_MINUS unary_expression
+ {
+ if ($2.isInt())
+ $$ = CPPValue(-(long)$2);
+ else
+ $$ = CPPValue(-(double)$2);
+ }
+ | TOK_TILDE unary_expression
+ {
+ $$ = CPPValue(~(long)$2);
+ }
+ | TOK_NOT unary_expression
+ {
+ $$ = CPPValue((long)!(long)$2);
+ }
+;
+
+primary_expression: constant
+ { $$ = $1; }
+ | TOK_LPAREN constant_expression TOK_RPAREN
+ { $$ = $2; }
+;
+
+constant: TOK_OCTALINT
+ { $$ = parseOctal(); }
+ | TOK_DECIMALINT
+ { $$ = parseDecimal(); }
+ | TOK_HEXADECIMALINT
+ { $$ = parseHexadecimal(); }
+ | TOK_CHARACTER
+ { $$ = parseCharacter(); }
+ | TOK_FLOAT
+ { $$ = parseFloat(); }
+;
+
+%%
diff --git a/src/cppvalue.cpp b/src/cppvalue.cpp
new file mode 100644
index 0000000..a7bacf6
--- /dev/null
+++ b/src/cppvalue.cpp
@@ -0,0 +1,95 @@
+/******************************************************************************
+ *
+ * $Id: cppvalue.cpp,v 1.6 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "cppvalue.h"
+#include "constexp.h"
+
+CPPValue parseOctal()
+{
+ long val = 0;
+ for (const char *p = g_strToken.data(); *p != 0; p++)
+ {
+ if (*p >= '0' && *p <= '7') val = val * 8 + *p - '0';
+ }
+ return CPPValue(val);
+}
+
+CPPValue parseDecimal()
+{
+ long val = 0;
+ for (const char *p = g_strToken.data(); *p != 0; p++)
+ {
+ if (*p >= '0' && *p <= '9') val = val * 10 + *p - '0';
+ }
+ return CPPValue(val);
+}
+
+CPPValue parseHexadecimal()
+{
+ long val = 0;
+ for (const char *p = g_strToken.data(); *p != 0; p++)
+ {
+ if (*p >= '0' && *p <= '9') val = val * 16 + *p - '0';
+ else if (*p >= 'a' && *p <= 'f') val = val * 16 + *p - 'a' + 10;
+ else if (*p >= 'A' && *p <= 'F') val = val * 16 + *p - 'A' + 10;
+ }
+ //printf("parseHexadecimal %s->%x\n",g_strToken.data(),val);
+ return CPPValue(val);
+}
+
+CPPValue parseCharacter() // does not work for '\n' and the alike
+{
+ if (g_strToken[1]=='\\')
+ {
+ switch(g_strToken[2])
+ {
+ case 'n': return CPPValue((long)'\n');
+ case 't': return CPPValue((long)'\t');
+ case 'v': return CPPValue((long)'\v');
+ case 'b': return CPPValue((long)'\b');
+ case 'r': return CPPValue((long)'\r');
+ case 'f': return CPPValue((long)'\f');
+ case 'a': return CPPValue((long)'\a');
+ case '\\': return CPPValue((long)'\\');
+ case '?': return CPPValue((long)'\?');
+ case '\'': return CPPValue((long)'\'');
+ case '"': return CPPValue((long)'"');
+ case '0': // fall through
+ case '1': // fall through
+ case '2': // fall through
+ case '3': // fall through
+ case '4': // fall through
+ case '5': // fall through
+ case '6': // fall through
+ case '7': // fall through
+ return parseOctal();
+ case 'x':
+ case 'X': return parseHexadecimal();
+ default: printf("Invalid escape sequence %s found!\n",g_strToken.data());
+ return CPPValue(0L);
+ }
+ }
+ return CPPValue((long)g_strToken[1]);
+}
+
+CPPValue parseFloat()
+{
+ return CPPValue(atof(g_strToken));
+}
diff --git a/src/cppvalue.h b/src/cppvalue.h
new file mode 100644
index 0000000..f0d5f8b
--- /dev/null
+++ b/src/cppvalue.h
@@ -0,0 +1,62 @@
+/******************************************************************************
+ *
+ * $Id: cppvalue.h,v 1.7 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _CPPVALUE_H
+#define _CPPVALUE_H
+
+#include <stdio.h>
+#include <qglobal.h>
+
+class CPPValue
+{
+ public:
+
+
+ enum Type { Int, Float };
+
+ CPPValue(long val=0) : type(Int) { v.l = val; }
+ CPPValue(double val) : type(Float) { v.d = val; }
+
+ operator double () const { return type==Int ? (double)v.l : v.d; }
+ operator long () const { return type==Int ? v.l : (long)v.d; }
+
+ bool isInt() const { return type == Int; }
+
+ void print() const
+ {
+ if (type==Int)
+ printf("(%ld)\n",v.l);
+ else
+ printf("(%f)\n",v.d);
+ }
+
+ private:
+ Type type;
+ union {
+ double d;
+ long l;
+ } v;
+};
+
+extern CPPValue parseOctal();
+extern CPPValue parseDecimal();
+extern CPPValue parseHexadecimal();
+extern CPPValue parseCharacter();
+extern CPPValue parseFloat();
+
+#endif
diff --git a/src/dbusxmlscanner.cpp b/src/dbusxmlscanner.cpp
new file mode 100644
index 0000000..2239f85
--- /dev/null
+++ b/src/dbusxmlscanner.cpp
@@ -0,0 +1,891 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 2009 by Tobias Hunger <tobias@aquazul.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "dbusxmlscanner.h"
+
+#include "commentscan.h"
+#include "entry.h"
+
+#include <qfile.h>
+#include <qxml.h>
+#include <qstring.h>
+
+#include "message.h"
+#include "util.h"
+
+// -----------------------------------------------------------------------
+// Convenience defines:
+// -----------------------------------------------------------------------
+
+#define CONDITION(cond, msg) \
+ do {\
+ if (cond)\
+ {\
+ if (m_errorString.isEmpty()) { m_errorString = msg; }\
+ return false;\
+ }\
+ }\
+ while (0)
+
+#define DOC_ERROR(msg) \
+ warn_doc_error(m_fileName.utf8().data(), lineNumber(), msg.utf8().data())
+
+#define COND_DOC_ERROR(cond, msg) \
+ do {\
+ if (cond)\
+ {\
+ DOC_ERROR(msg);\
+ return true;\
+ }\
+ }\
+ while (0)
+
+#define DBUS(name) isDBusElement(namespaceURI, localName, qName, name)
+#define EXTENSION(name) isExtensionElement(namespaceURI, localName, qName, name)
+
+// -----------------------------------------------------------------------
+// DBusXMLHandler class
+// -----------------------------------------------------------------------
+
+const QString EXTENSION_URI("http://psiamp.org/dtd/doxygen_dbusxml.dtd");
+
+class DBusXMLHandler : public QXmlDefaultHandler
+{
+public:
+ DBusXMLHandler(ParserInterface * parser,
+ QXmlSimpleReader * reader,
+ const char * file_name,
+ Entry * root) :
+ m_parser(parser),
+ m_locator(reader),
+ m_currentEntry(0),
+ m_currentInterface(0),
+ m_currentMethod(0),
+ m_currentArgument(0),
+ m_currentProperty(0),
+ m_currentEnum(0),
+ m_fileName(file_name),
+ m_currentComment(0)
+ {
+ setDocumentLocator(&m_locator);
+
+ m_scopeCount = 0;
+
+ // Set up stack cleanup:
+ m_structStack.setAutoDelete(TRUE);
+ m_elementStack.setAutoDelete(TRUE);
+ m_scopeStack.setAutoDelete(TRUE);
+
+ openScopes(root);
+ }
+
+ ~DBusXMLHandler()
+ { closeScopes(); }
+
+ QString errorString()
+ { return m_errorString; }
+
+ bool startElement(const QString &namespaceURI,
+ const QString &localName,
+ const QString &qName,
+ const QXmlAttributes &attributes)
+ {
+ // add to elements stack:
+ m_elementStack.append(new ElementData(qName));
+
+ // First we need a node.
+ if (DBUS("node"))
+ {
+ CONDITION(!m_currentNode.isEmpty(), "Node inside a node.");
+
+ const int idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(idx < 0, QString("Anonymous node found."));
+
+ m_currentNode = attributes.value(idx);
+ // A node is actually of little interest, so do nothing here.
+ return true;
+ }
+
+ // Then we need an interface.
+ if (DBUS("interface"))
+ {
+ // We need a nodeName for interfaces:
+ CONDITION(m_currentNode.isEmpty(), "Interface without a node.");
+ CONDITION(m_currentInterface, "Interface within another interface.");
+
+ const int idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(idx < 0, QString("Interface without a name found."));
+
+ // A interface is roughly equivalent to a class:
+ m_currentInterface = createEntry();
+
+ m_currentInterface->section = Entry::CLASS_SEC;
+ m_currentInterface->spec |= Entry::Interface;
+ m_currentInterface->type = "Interface";
+ m_currentInterface->name = substitute(attributes.value(idx), ".", "::");
+
+ openScopes(m_currentInterface);
+
+ return true;
+ }
+
+ if (DBUS("method") || DBUS("signal"))
+ {
+ // We need a interfaceName for methods and signals:
+ CONDITION(!m_currentInterface, "Method or signal found outside a interface.");
+ CONDITION(m_currentMethod, "Method or signal found inside another method or signal.");
+ CONDITION(m_currentProperty, "Methor or signal found inside a property.");
+ CONDITION(!m_structStack.isEmpty(), "Method or signal found inside a struct.");
+ CONDITION(m_currentEnum, "Methor or signal found inside a enum.");
+
+ const int idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(idx < 0, QString("Method or signal without a name found."));
+
+ m_currentMethod = createEntry();
+
+ m_currentMethod->section = Entry::FUNCTION_SEC;
+ m_currentMethod->name = attributes.value(idx);
+ m_currentMethod->mtype = Method;
+ m_currentMethod->type = "void";
+
+ if (DBUS("signal"))
+ { m_currentMethod->mtype = Signal; }
+ }
+
+ if (DBUS("arg"))
+ {
+ // We need a method for arguments:
+ CONDITION(!m_currentMethod, "Argument found outside a method or signal.");
+ CONDITION(m_currentArgument, "Argument found inside another argument.");
+
+ const int name_idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(name_idx < 0, QString("Argument without a name found."));
+ COND_DOC_ERROR(!hasType(attributes), QString("Argument without a type found."));
+
+ const int direction_idx(indexOf(attributes, "direction"));
+
+ if ((m_currentMethod->mtype == Signal &&
+ direction_idx >= 0 &&
+ attributes.value(direction_idx) != "in") ||
+ (m_currentMethod->mtype == Method &&
+ direction_idx >= 0 &&
+ attributes.value(direction_idx) != "in" &&
+ attributes.value(direction_idx) != "out"))
+ {
+ m_errorString = "Invalid direction found.";
+ return false;
+ }
+
+ m_currentArgument = new Argument;
+ m_currentArgument->type = getType(attributes);
+ m_currentArgument->name = attributes.value(name_idx);
+ if (direction_idx >= 0)
+ { m_currentArgument->attrib = attributes.value(direction_idx); }
+ else
+ {
+ if (m_currentMethod->mtype == Signal)
+ { m_currentArgument->attrib = "in"; }
+ else
+ { m_currentArgument->attrib = "out"; }
+ }
+ }
+
+ if (DBUS("property"))
+ {
+ CONDITION(m_currentMethod, "Property found inside a method or signal.");
+ CONDITION(!m_currentInterface, "Property found outside an interface.");
+ CONDITION(m_currentProperty, "Property found inside another property.");
+ CONDITION(!m_structStack.isEmpty(), "Property found inside a struct.");
+ CONDITION(m_currentEnum, "Property found inside a enum.");
+
+ const int name_idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(name_idx < 0, QString("Anonymous property found."));
+ COND_DOC_ERROR(!hasType(attributes), QString("Property without a type found."));
+
+ const int access_idx(indexOf(attributes, "access"));
+ COND_DOC_ERROR(access_idx < 0, QString("Property without a access attribute found."));
+ COND_DOC_ERROR(attributes.value(access_idx) != "read" &&
+ attributes.value(access_idx) != "write" &&
+ attributes.value(access_idx) != "readwrite",
+ QString("Property with invalid access attribute \"%1\" found.").
+ arg(attributes.value(access_idx)));
+
+ m_currentProperty = createEntry();
+
+ m_currentProperty->section = Entry::FUNCTION_SEC;
+
+ if (attributes.value(access_idx) == "read" ||
+ attributes.value(access_idx) == "readwrite")
+ { m_currentProperty->spec |= Entry::Readable; }
+
+ if (attributes.value(access_idx) == "write" ||
+ attributes.value(access_idx) == "readwrite")
+ { m_currentProperty->spec |= Entry::Writable; }
+
+ m_currentProperty->name = attributes.value(name_idx);
+ m_currentProperty->mtype = Property;
+ m_currentProperty->type = getType(attributes);
+ }
+
+ if (EXTENSION("namespace"))
+ {
+ CONDITION(m_currentNode.isEmpty(), "Namespace found outside a node.");
+ CONDITION(m_currentInterface, "Namespace found inside an interface.");
+
+ const int idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(idx < 0, QString("Anonymous namespace found."));
+
+ m_namespaceStack.append(openNamespace(attributes.value(idx)));
+ openScopes(m_namespaceStack.last());
+ }
+
+ if (EXTENSION("struct"))
+ {
+ CONDITION(m_currentMethod, "Struct found inside a method or signal.");
+ CONDITION(m_currentProperty, "Struct found inside a property.");
+ CONDITION(m_currentEnum, "Struct found inside an enum.");
+
+ const int idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(idx < 0, QString("Anonymous struct found."));
+
+ Entry * current_struct = createEntry();
+ current_struct->section = Entry::CLASS_SEC;
+ current_struct->spec = Entry::Struct;
+ current_struct->name = attributes.value(idx);
+
+ openScopes(current_struct);
+
+ current_struct->type = current_struct->name + " struct";
+
+ m_structStack.append(new StructData(current_struct));
+ }
+
+ if (EXTENSION("member"))
+ {
+ CONDITION(m_structStack.isEmpty(), "Member found outside of struct.");
+
+ const int name_idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(name_idx < 0, QString("Anonymous member found."));
+ COND_DOC_ERROR(!hasType(attributes), QString("Member without a type found."));
+
+ createEntry();
+
+ m_currentEntry->section = Entry::VARIABLE_SEC;
+ m_currentEntry->name = attributes.value(name_idx);
+ m_currentEntry->type = getType(attributes);
+
+ QString type(getDBusType(m_currentEntry->type));
+ m_structStack.last()->type.append(type);
+ }
+
+ if (EXTENSION("enum") || EXTENSION("flagset"))
+ {
+ CONDITION(m_currentMethod, "Enum found inside a method or signal.");
+ CONDITION(m_currentProperty, "Enum found inside a property.");
+
+ const int name_idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(name_idx < 0, QString("Anonymous enum found."));
+
+ const int type_idx(indexOf(attributes, "type"));
+ QString type = "u";
+ if (type_idx >= 0)
+ { type = attributes.value(type_idx); }
+ if (type != "y" && type != "q" && type != "u" && type != "t")
+ { DOC_ERROR(QString("Invalid enum type \"%1\" found.").arg(type)); }
+
+ m_currentEnum = createEntry();
+ m_currentEnum->section = Entry::ENUM_SEC;
+ m_currentEnum->name = attributes.value(name_idx);
+
+ openScopes(m_currentEnum);
+
+ m_currentEnum->type = m_currentEntry->name + " enum";
+
+ addNamedType(type);
+ }
+
+ if (EXTENSION("value"))
+ {
+ CONDITION(!m_currentEnum, "Value found outside an enum.");
+
+ const int name_idx(indexOf(attributes, "name"));
+ COND_DOC_ERROR(name_idx < 0, QString("Anonymous value found."));
+
+ const int value_idx(indexOf(attributes, "value"));
+
+ createEntry();
+
+ m_currentEntry->section = Entry::VARIABLE_SEC;
+ m_currentEntry->name = attributes.value(name_idx);
+ m_currentEntry->type = m_currentEnum->name; // "@"; // enum marker!
+ if (value_idx >= 0)
+ { m_currentEntry->initializer = attributes.value(value_idx); }
+ }
+
+ return true;
+ }
+
+ bool endElement(const QString &namespaceURI,
+ const QString &localName,
+ const QString &qName)
+ {
+ // Clean up elements stack:
+ // Since we made sure to get the elements in the proper order when
+ // adding we do not need to do so again here.
+ COND_DOC_ERROR(m_elementStack.last()->element != qName,
+ QString("Malformed XML: Unexpected closing element found.").
+ arg(m_elementStack.last()->element));
+ m_elementStack.removeLast();
+
+ // Interface:
+ if (DBUS("interface"))
+ {
+ CONDITION(m_currentInterface, "end of interface found without start.");
+ m_currentInterface->endBodyLine = lineNumber();
+ closeScopes();
+ m_currentInterface = 0;
+ }
+
+ if (DBUS("method") || DBUS("signal"))
+ {
+ CONDITION(m_currentMethod, "end of method found without start.");
+ CONDITION(m_currentInterface, "end of method found outside interface.");
+ m_currentMethod->endBodyLine = lineNumber();
+ m_currentInterface->addSubEntry(m_currentMethod);
+ m_currentMethod = 0;
+ }
+
+ if (DBUS("property"))
+ {
+ CONDITION(m_currentMethod, "end of property found without start.");
+ CONDITION(m_currentInterface, "end of property found outside interface.");
+ m_currentProperty->endBodyLine = lineNumber();
+ m_currentInterface->addSubEntry(m_currentProperty);
+ m_currentProperty = 0;
+ }
+
+ if (DBUS("arg"))
+ {
+ CONDITION(m_currentMethod, "end of arg found outside method.");
+ m_currentMethod->argList->append(m_currentArgument);
+ m_currentArgument = 0;
+ }
+
+ if (EXTENSION("namespace"))
+ {
+ Entry * current = m_namespaceStack.last();
+ CONDITION(current, "end of namespace without start.");
+ m_namespaceStack.removeLast();
+
+ current->endBodyLine = lineNumber();
+ closeScopes();
+ }
+
+ if (EXTENSION("struct"))
+ {
+ StructData * data = m_structStack.last();
+ CONDITION(data, "end of struct without start.");
+
+ data->entry->endBodyLine = lineNumber();
+
+ QString current_type;
+ current_type.append(QString("("));
+ current_type.append(data->type);
+ current_type.append(QString(")"));
+
+ addNamedType(current_type);
+
+ closeScopes();
+
+ m_structStack.removeLast();
+ }
+
+ if (EXTENSION("member"))
+ {
+ StructData * data = m_structStack.last();
+ CONDITION(data, "end of struct without start");
+ data->entry->addSubEntry(m_currentEntry);
+ }
+
+ if (EXTENSION("enum") || EXTENSION("flagset"))
+ {
+ CONDITION(m_currentEnum, "end of enum without start");
+ m_currentEnum->endBodyLine = lineNumber();
+ closeScopes();
+
+ m_currentEnum = 0;
+ }
+
+ if (EXTENSION("value"))
+ {
+ CONDITION(m_currentEntry, "end of value without start");
+ m_currentEntry->endBodyLine = lineNumber();
+
+ m_currentEnum->addSubEntry(m_currentEntry);
+ }
+
+ return true;
+ }
+
+ bool characters(const QString & /*chars*/)
+ { return true; }
+
+ bool comment(const QString & comment_)
+ {
+ if (m_currentComment)
+ { handleComment(); }
+
+ m_currentComment = new CommentData(m_fileName, lineNumber(), comment_);
+
+ if (!m_currentComment->shouldIgnore)
+ {
+ delete m_currentComment;
+ m_currentComment = 0;
+ return true;
+ }
+
+ if (m_currentComment->associateWithPrevious)
+ { handleComment(); }
+
+ return true;
+ }
+
+ void handleComment()
+ {
+ if (m_currentComment == 0 || m_currentEntry == 0)
+ { return; }
+
+ QCString text(m_currentComment->text);
+
+ m_currentEntry->docFile = m_currentComment->fileName;
+ m_currentEntry->docLine = m_currentComment->line;
+
+ int position(0);
+ bool needs_entry(false);
+ bool brief(false);
+ Protection prot(Public);
+ int lineNr = lineNumber();
+
+ while (parseCommentBlock(m_parser,
+ m_currentEntry,
+ text, m_fileName.utf8().data(),
+ lineNr,
+ brief, m_currentComment->isJavaStyle,
+ false,
+ prot,
+ position,
+ needs_entry))
+ {
+ if (needs_entry) { createEntry(); }
+ }
+ if (needs_entry) { createEntry(); }
+
+ delete m_currentComment;
+ m_currentComment = 0;
+ }
+
+ QXmlLocator * locator()
+ { return &m_locator; }
+
+ int lineNumber()
+ { return m_locator.lineNumber(); }
+
+ void setSection()
+ {
+ Entry * current = createEntry();
+ current->reset();
+
+ current->name = m_fileName.utf8();
+ current->section = Entry::SOURCE_SEC;
+
+ // Open/Close the scope to do the bookkeeping:
+ openScopes(current);
+ closeScopes();
+ }
+
+private:
+ bool isDBusElement(const QString & namespaceURI,
+ const QString & localName,
+ const QString & qName,
+ const QString & element)
+ {
+ return (namespaceURI.isEmpty() && localName == element && qName == element) ||
+ (namespaceURI.isEmpty() && localName.isEmpty() && qName == element);
+ }
+
+ bool isExtensionElement(const QString & namespaceURI,
+ const QString & localName,
+ const QString & qName,
+ const QString & element)
+ {
+ // isNull happens in startelement if no URI is used.
+ if (namespaceURI.isNull())
+ { return false; }
+
+ // We are in a endElement: URI is always empty there:-(
+ if (namespaceURI.isEmpty())
+ { return qName == m_scopeStack.last()->extensionPrefix + element; }
+
+ // startElemennt: We need to save the qName prefix
+ // since endElement will forget about the namespaceURi:-(
+ if (namespaceURI == EXTENSION_URI)
+ {
+ int pos = qName.find(':');
+ m_scopeStack.last()->extensionPrefix = qName.left(pos + 1);
+ }
+
+ return namespaceURI == EXTENSION_URI && localName == element;
+ }
+
+ bool hasType(const QXmlAttributes & attributes)
+ {
+ const int type_idx(indexOf(attributes, "type"));
+ const int named_type_idx(indexOf(attributes, "named-type"));
+
+ return named_type_idx >= 0 || type_idx >= 0;
+ }
+
+ QString getType(const QXmlAttributes & attributes)
+ {
+ const int type_idx(indexOf(attributes, "type"));
+ const int named_type_idx(indexOf(attributes, "named-type"));
+
+ QString type;
+
+ if (named_type_idx >= 0)
+ {
+ type = attributes.value(named_type_idx);
+ if (!type.startsWith("::"))
+ { type = getCurrentScope(attributes.value(named_type_idx)); }
+ else
+ { type = type.mid(2); }
+ if (m_namedTypeMap.contains(type))
+ {
+ if (type_idx >= 0)
+ {
+ const QString dbus_type(attributes.value(type_idx));
+ if (dbus_type != m_namedTypeMap[type])
+ {
+ DOC_ERROR(QString("Type \"%1\" does not match up with "
+ "previous definition of named type \"%2\" (which was \"%3\".").
+ arg(dbus_type).
+ arg(type).
+ arg(m_namedTypeMap[type]));
+ }
+ }
+ return type;
+ }
+
+ DOC_ERROR(QString("Undefined named type \"%1\" used.").arg(type));
+ }
+
+ if (type_idx >= 0)
+ {
+ type = attributes.value(type_idx);
+
+ QRegExp reg_exp(QCString("(a?[ybnqiuxdtsogv]|a[{]sv[}])"));
+ if (reg_exp.match(type.data()))
+ { return type; }
+
+ DOC_ERROR(QString("Unnamed complex D-Bus type \"%1\" found.").arg(type));
+ }
+
+ return QString();
+ }
+
+ QString getDBusType(const QString & type)
+ {
+ QString scoped_type = type;
+ if (!scoped_type.contains("::"))
+ { scoped_type = getCurrentScope(type); }
+
+ if (m_namedTypeMap.contains(scoped_type))
+ { return m_namedTypeMap[scoped_type]; }
+ else
+ { return type; }
+ }
+
+ void addNamedType(const QString type)
+ {
+ QString scoped_name(getCurrentScope());
+
+ if (m_namedTypeMap.contains(scoped_name))
+ {
+ DOC_ERROR(QString("Named type \"%1\" is already defined.").arg(scoped_name));
+ return;
+ }
+
+ m_namedTypeMap.insert(scoped_name, type);
+ }
+
+ QString getCurrentScope(const QString & type = QString())
+ {
+ QString scoped_name;
+ if (!m_scopeStack.isEmpty())
+ {
+ scoped_name = m_scopeStack.last()->scope->name;
+ scoped_name.append("::");
+ }
+ if (!type.isEmpty())
+ { scoped_name.append(type); }
+ else
+ { scoped_name = scoped_name.left(scoped_name.length() - 2); }
+
+ return scoped_name;
+ }
+
+ int indexOf(const QXmlAttributes & attributes, const QString & name,
+ const QString & type = "CDATA", const bool mandatory = true)
+ {
+ const int idx(attributes.index(name));
+ if (idx < 0 || idx > attributes.length()) { return -1; }
+ if (attributes.type(idx) != type) { return -1; }
+ if (mandatory && attributes.value(idx).isEmpty()) { return -1; }
+
+ return idx;
+ }
+
+ Entry * createEntry()
+ {
+ Entry * entry = new Entry();
+
+ entry->protection = Public ;
+ entry->virt = Normal;
+ entry->stat = false;
+ entry->lang = SrcLangExt_XML;
+ entry->spec = 0;
+
+ entry->fileName = m_fileName;
+ entry->startLine = lineNumber();
+ entry->bodyLine = lineNumber();
+
+ entry->callGraph = false;
+ entry->callerGraph = false;
+
+ initGroupInfo(entry);
+
+ m_currentEntry = entry;
+
+ handleComment();
+
+ return entry;
+ }
+
+ void openScopes(Entry * object)
+ {
+ int cur_scope_separator_pos = 0;
+ int last_scope_separator_pos = 0;
+ while (0 <= (cur_scope_separator_pos = object->name.find("::", last_scope_separator_pos)))
+ {
+ QString scope = object->name.mid(last_scope_separator_pos,
+ cur_scope_separator_pos - last_scope_separator_pos);
+ last_scope_separator_pos = cur_scope_separator_pos + 2;
+
+ Entry * current_namespace = openNamespace(scope);
+
+ if (!m_scopeStack.isEmpty())
+ { m_scopeStack.last()->scope->addSubEntry(current_namespace); }
+
+ m_scopeStack.append(new ScopeData(current_namespace, m_scopeCount));
+ }
+
+ QString scoped_name(getCurrentScope());
+ if (!scoped_name.isEmpty())
+ { scoped_name.append("::"); }
+ scoped_name.append(object->name.mid(last_scope_separator_pos));
+
+ object->name = scoped_name;
+
+ if (!m_scopeStack.isEmpty())
+ { m_scopeStack.last()->scope->addSubEntry(object); }
+ m_scopeStack.append(new ScopeData(object, m_scopeCount));
+
+ ++m_scopeCount;
+ }
+
+ Entry * openNamespace(const QString & name)
+ {
+ Entry * current_namespace = createEntry();
+ QString scoped_name(getCurrentScope());
+ if (!scoped_name.isEmpty())
+ { scoped_name.append("::"); }
+ scoped_name.append(name);
+ current_namespace->name = scoped_name;
+ current_namespace->section = Entry::NAMESPACE_SEC;
+ current_namespace->type = "namespace" ;
+
+ return current_namespace;
+ }
+
+ void closeScopes()
+ {
+ const int current_scope_count(m_scopeStack.last()->count);
+
+ // Do not close the root scope.
+ if (current_scope_count == 0)
+ { return; }
+
+ while (current_scope_count == m_scopeStack.last()->count)
+ { m_scopeStack.removeLast(); }
+ }
+
+ ParserInterface * m_parser;
+
+ QXmlLocator m_locator;
+ QString m_currentNode; // Nodes can not be nested, no entry necessary.
+
+ struct ElementData
+ {
+ ElementData(const QString & e) :
+ element(e)
+ { }
+ ~ElementData() { }
+
+ QString element; //*< The element name
+ QString extensionPrefix; //*< The prefix used for our extension.
+ QString text; //*< The actual xml code.
+ };
+ QList<ElementData> m_elementStack;
+
+ Entry * m_currentEntry; // The currently open entry.
+
+ Entry * m_currentInterface; // Interfaces can not be nested.
+ Entry * m_currentMethod; // Methods can not be nested.
+ Argument * m_currentArgument; // Arguments can not be nested.
+ Entry * m_currentProperty; // Properties can not be nested.
+ Entry * m_currentEnum; // Enums can not be nested.
+ QList<Entry> m_namespaceStack;
+
+ struct StructData
+ {
+ StructData(Entry * e) : entry(e) { }
+ ~StructData() { }
+
+ QString type;
+ Entry * entry;
+ };
+ QList<StructData> m_structStack; // Structs can be nested.
+
+ struct ScopeData
+ {
+ ScopeData(Entry * s, int c) :
+ scope(s),
+ count(c)
+ { }
+ ~ScopeData() { }
+
+ Entry * scope;
+ QString extensionPrefix;
+ int count;
+ };
+ QList<ScopeData> m_scopeStack; // Scopes are nested.
+
+ QString m_fileName;
+
+ struct CommentData
+ {
+ CommentData(const QString & f, const int l, const QString & t) :
+ isJavaStyle(false),
+ isQtStyle(false),
+ line(l),
+ fileName(f)
+ {
+ isJavaStyle = t.startsWith(QChar('*'));
+ isQtStyle = t.startsWith(QChar('!'));
+ shouldIgnore = (!isJavaStyle && !isQtStyle);
+ associateWithPrevious = (t.at(1) == QChar('<'));
+ if (associateWithPrevious)
+ { text = t.mid(2); }
+ else
+ { text = t.mid(1); }
+ }
+ ~CommentData() { }
+
+ QString text;
+ bool isJavaStyle;
+ bool isQtStyle;
+ bool shouldIgnore;
+ bool associateWithPrevious;
+ int line;
+ QString fileName;
+ };
+ CommentData * m_currentComment;
+
+ int m_scopeCount; //*< unique scope id.
+
+ QString m_errorString;
+
+ QMap<QString, QString> m_namedTypeMap;
+};
+
+// -----------------------------------------------------------------------
+// DBusXMLScanner
+// -----------------------------------------------------------------------
+
+DBusXMLScanner::DBusXMLScanner()
+{ }
+
+DBusXMLScanner::~DBusXMLScanner()
+{ }
+
+void DBusXMLScanner::parseInput(const char * fileName,
+ const char * /* fileBuf */,
+ Entry * root)
+{
+ err("Note that the dbusxml parser seems to be broken :-(\nPlease help me to fix it!\n");
+ QFile inputFile(fileName);
+
+ QXmlInputSource inputSource(inputFile);
+ QXmlSimpleReader reader;
+
+ DBusXMLHandler handler(this, &reader, fileName, root);
+ reader.setContentHandler(&handler);
+ reader.setErrorHandler(&handler);
+ reader.setLexicalHandler(&handler);
+
+ groupEnterFile(fileName, 1);
+ handler.setSection();
+ reader.parse(inputSource);
+
+ if (handler.errorString())
+ { err("DBus XML Parser: Error at line %d: %s\n",
+ handler.locator()->lineNumber(),handler.errorString().utf8().data()); }
+
+ groupLeaveFile(fileName, 1);
+}
+
+bool DBusXMLScanner::needsPreprocessing(const QCString & /* extension */)
+{ return (false); }
+
+void DBusXMLScanner::parseCode(CodeOutputInterface & /* codeOutIntf */,
+ const char * /* scopeName */,
+ const QCString & /* input */,
+ bool /* isExampleBlock */,
+ const char * /* exampleName */,
+ FileDef * /* fileDef */,
+ int /* startLine */,
+ int /* endLine */,
+ bool /* inlineFragment */,
+ MemberDef * /* memberDef */,
+ bool /*showLineNumbers*/)
+{ }
+
+void DBusXMLScanner::resetCodeParserState()
+{ }
+
+void DBusXMLScanner::parsePrototype(const char * /* text */)
+{ }
diff --git a/src/dbusxmlscanner.h b/src/dbusxmlscanner.h
new file mode 100644
index 0000000..fd48cbc
--- /dev/null
+++ b/src/dbusxmlscanner.h
@@ -0,0 +1,58 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 2009 by Tobias Hunger <tobias@aquazul.com>
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SCANNER_DBUSXML_H
+#define SCANNER_DBUSXML_H
+
+#include "parserintf.h"
+
+/** \brief D-Bus XML parser.
+ *
+ * This is the D-Bus XML parser for doxygen.
+ */
+class DBusXMLScanner : public ParserInterface
+{
+public:
+ DBusXMLScanner();
+ virtual ~DBusXMLScanner();
+ void parseInput(const char *fileName,
+ const char *fileBuf,
+ Entry *root);
+
+ bool needsPreprocessing(const QCString &extension);
+
+ void parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName=0,
+ FileDef *fileDef=0,
+ int startLine=-1,
+ int endLine=-1,
+ bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,
+ bool showLineNumbers=TRUE
+ );
+
+ void resetCodeParserState();
+
+ void parsePrototype(const char *text);
+
+private:
+};
+
+#endif
diff --git a/src/debug.cpp b/src/debug.cpp
new file mode 100644
index 0000000..9e5d7ca
--- /dev/null
+++ b/src/debug.cpp
@@ -0,0 +1,116 @@
+/******************************************************************************
+ *
+ * $Id: debug.cpp,v 1.7 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include <qdict.h>
+
+#include "qtbc.h"
+#include "debug.h"
+
+//------------------------------------------------------------------------
+
+struct LabelMap
+{
+ const char *name;
+ Debug::DebugMask event;
+};
+
+static LabelMap s_labels[] =
+{
+ { "findmembers", Debug::FindMembers },
+ { "functions", Debug::Functions },
+ { "variables", Debug::Variables },
+ { "preprocessor", Debug::Preprocessor },
+ { "classes", Debug::Classes },
+ { "commentcnv", Debug::CommentCnv },
+ { "commentscan", Debug::CommentScan },
+ { "validate", Debug::Validate },
+ { "printtree", Debug::PrintTree },
+ { "time", Debug::Time },
+ { "extcmd", Debug::ExtCmd },
+ { 0, (Debug::DebugMask)0 }
+};
+
+class LabelMapper
+{
+ public:
+ LabelMapper() : m_map(17)
+ {
+ m_map.setAutoDelete(TRUE);
+ LabelMap *p = s_labels;
+ while (p->name)
+ {
+ m_map.insert(p->name,new Debug::DebugMask(p->event));
+ p++;
+ }
+ }
+ Debug::DebugMask *find(const char *s) const
+ {
+ if (s==0) return 0;
+ return m_map.find(s);
+ }
+ private:
+ QDict<Debug::DebugMask> m_map;
+};
+
+static LabelMapper g_labelMapper;
+
+//------------------------------------------------------------------------
+
+Debug::DebugMask Debug::curMask = Debug::Quiet;
+int Debug::curPrio = 0;
+
+void Debug::print(DebugMask mask,int prio,const char *fmt,...)
+{
+ if ((curMask&mask) && prio<=curPrio)
+ {
+ va_list args;
+ va_start(args,fmt);
+ vfprintf(stdout, fmt, args);
+ va_end(args);
+ }
+}
+
+static int labelToEnumValue(const char *l)
+{
+ QCString label=l;
+ Debug::DebugMask *event = g_labelMapper.find(label.lower());
+ if (event) return *event; else return 0;
+}
+
+void Debug::setFlag(const char *lab)
+{
+ curMask = (DebugMask)(curMask | labelToEnumValue(lab));
+}
+
+void Debug::clearFlag(const char *lab)
+{
+ curMask = (DebugMask)(curMask & ~labelToEnumValue(lab));
+}
+
+void Debug::setPriority(int p)
+{
+ curPrio = p;
+}
+
+bool Debug::isFlagSet(DebugMask mask)
+{
+ return (curMask & mask)!=0;
+}
+
diff --git a/src/debug.h b/src/debug.h
new file mode 100644
index 0000000..5512111
--- /dev/null
+++ b/src/debug.h
@@ -0,0 +1,49 @@
+/******************************************************************************
+ *
+ * $Id: debug.h,v 1.6 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _DEBUG_H
+#define _DEBUG_H
+
+class Debug
+{
+ public:
+ enum DebugMask { Quiet = 0x00000000,
+ FindMembers = 0x00000001,
+ Functions = 0x00000002,
+ Variables = 0x00000004,
+ Preprocessor = 0x00000008,
+ Classes = 0x00000010,
+ CommentCnv = 0x00000020,
+ CommentScan = 0x00000040,
+ Validate = 0x00000080,
+ PrintTree = 0x00000100,
+ Time = 0x00000200,
+ ExtCmd = 0x00000400
+ };
+ static void print(DebugMask mask,int prio,const char *fmt,...);
+ static void setFlag(const char *label);
+ static void clearFlag(const char *label);
+ static bool isFlagSet(DebugMask mask);
+ static void setPriority(int p);
+
+ private:
+ static DebugMask curMask;
+ static int curPrio;
+};
+
+#endif
diff --git a/src/declinfo.cpp b/src/declinfo.cpp
new file mode 100644
index 0000000..15f7e6b
--- /dev/null
+++ b/src/declinfo.cpp
@@ -0,0 +1,2343 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer declinfoYY_create_buffer
+#define yy_delete_buffer declinfoYY_delete_buffer
+#define yy_flex_debug declinfoYY_flex_debug
+#define yy_init_buffer declinfoYY_init_buffer
+#define yy_flush_buffer declinfoYY_flush_buffer
+#define yy_load_buffer_state declinfoYY_load_buffer_state
+#define yy_switch_to_buffer declinfoYY_switch_to_buffer
+#define yyin declinfoYYin
+#define yyleng declinfoYYleng
+#define yylex declinfoYYlex
+#define yylineno declinfoYYlineno
+#define yyout declinfoYYout
+#define yyrestart declinfoYYrestart
+#define yytext declinfoYYtext
+#define yywrap declinfoYYwrap
+#define yyalloc declinfoYYalloc
+#define yyrealloc declinfoYYrealloc
+#define yyfree declinfoYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE declinfoYYrestart(declinfoYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t declinfoYYleng;
+
+extern FILE *declinfoYYin, *declinfoYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up declinfoYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up declinfoYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via declinfoYYrestart()), so that the user can continue scanning by
+ * just pointing declinfoYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when declinfoYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t declinfoYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow declinfoYYwrap()'s to do buffer switches
+ * instead of setting up a fresh declinfoYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void declinfoYYrestart (FILE *input_file );
+void declinfoYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE declinfoYY_create_buffer (FILE *file,int size );
+void declinfoYY_delete_buffer (YY_BUFFER_STATE b );
+void declinfoYY_flush_buffer (YY_BUFFER_STATE b );
+void declinfoYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void declinfoYYpop_buffer_state (void );
+
+static void declinfoYYensure_buffer_stack (void );
+static void declinfoYY_load_buffer_state (void );
+static void declinfoYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER declinfoYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE declinfoYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE declinfoYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE declinfoYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *declinfoYYalloc (yy_size_t );
+void *declinfoYYrealloc (void *,yy_size_t );
+void declinfoYYfree (void * );
+
+#define yy_new_buffer declinfoYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ declinfoYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ declinfoYY_create_buffer(declinfoYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ declinfoYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ declinfoYY_create_buffer(declinfoYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define declinfoYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *declinfoYYin = (FILE *) 0, *declinfoYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int declinfoYYlineno;
+
+int declinfoYYlineno = 1;
+
+extern char *declinfoYYtext;
+#define yytext_ptr declinfoYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up declinfoYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ declinfoYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 26
+#define YY_END_OF_BUFFER 27
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[121] =
+ { 0,
+ 27, 24, 26, 25, 26, 7, 24, 26, 24, 26,
+ 24, 26, 6, 24, 26, 10, 24, 26, 9, 24,
+ 26, 5, 24, 26, 12, 24, 26, 24, 26, 8195,
+ 24, 26,16387, 11, 24, 26, 8195, 24, 26,16387,
+ 17, 24, 26, 15, 17, 24, 26, 16, 17, 24,
+ 26, 22, 24, 26, 22, 24, 26, 24, 26, 24,
+ 26, 25, 26, 20, 24, 26, 24, 26, 23, 24,
+ 26, 7, 10, 9, 5, 12, 11, 8195,16387, 8195,
+ 16387, 6, 8, 4, 8195,16387, 8195,16387, 8195,16387,
+ 13, 14, 20, 20, 8195,16387, 8195,16387, 4, 8195,
+
+ 8195,16387, 19, 2, 8195,16387, 8195,16387, 18, 8195,
+ 16387, 21, 8195,16387, 8, 1, 8195,16387, 1, 8195
+ } ;
+
+static yyconst flex_int16_t yy_accept[140] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 4, 6, 9, 11, 13, 16, 19, 22,
+ 25, 28, 30, 34, 37, 41, 44, 48, 52, 55,
+ 58, 60, 62, 64, 67, 69, 72, 73, 74, 75,
+ 76, 77, 78, 78, 78, 78, 80, 82, 83, 83,
+ 83, 84, 84, 84, 85, 87, 87, 87, 89, 89,
+ 91, 92, 93, 93, 93, 93, 94, 94, 94, 95,
+ 95, 95, 95, 97, 97, 99, 99, 99, 99, 99,
+ 99, 99, 100, 100, 100, 100, 100, 100, 101, 103,
+
+ 103, 103, 104, 104, 104, 104, 104, 104, 104, 104,
+ 105, 105, 107, 107, 107, 107, 107, 109, 109, 109,
+ 110, 110, 110, 112, 112, 113, 113, 113, 115, 116,
+ 116, 119, 119, 119, 119, 119, 121, 121, 121
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 4, 1, 1, 5, 1, 6, 1, 7,
+ 8, 6, 1, 1, 1, 1, 1, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 10, 1, 11,
+ 1, 12, 1, 13, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 15, 1, 16, 1, 14, 1, 17, 14, 18, 14,
+
+ 19, 14, 14, 20, 21, 14, 14, 22, 14, 23,
+ 24, 25, 14, 26, 27, 28, 14, 29, 30, 14,
+ 14, 14, 1, 1, 1, 4, 1, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14
+ } ;
+
+static yyconst flex_int32_t yy_meta[31] =
+ { 0,
+ 1, 2, 1, 1, 3, 4, 5, 6, 7, 8,
+ 1, 1, 3, 9, 10, 1, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+ } ;
+
+static yyconst flex_int16_t yy_base[153] =
+ { 0,
+ 342, 341, 0, 0, 28, 30, 29, 31, 41, 43,
+ 340, 339, 338, 336, 333, 332, 331, 328, 327, 326,
+ 328, 346, 346, 58, 51, 0, 321, 65, 346, 309,
+ 346, 308, 70, 346, 72, 346, 305, 303, 346, 294,
+ 73, 79, 81, 47, 87, 346, 0, 98, 346, 290,
+ 346, 346, 100, 104, 289, 36, 271, 289, 56, 110,
+ 89, 283, 281, 288, 112, 118, 124, 264, 45, 57,
+ 346, 346, 258, 128, 129, 346, 136, 139, 93, 120,
+ 142, 149, 143, 140, 152, 155, 259, 258, 26, 271,
+ 270, 224, 157, 159, 216, 161, 94, 163, 149, 199,
+
+ 169, 346, 207, 175, 193, 193, 0, 179, 177, 346,
+ 181, 107, 184, 188, 186, 195, 166, 190, 191, 346,
+ 180, 140, 175, 194, 346, 164, 113, 177, 106, 71,
+ 202, 44, 203, 204, 205, 207, 209, 346, 227, 237,
+ 247, 257, 267, 276, 28, 284, 292, 302, 311, 315,
+ 323, 331
+ } ;
+
+static yyconst flex_int16_t yy_def[153] =
+ { 0,
+ 139, 139, 138, 3, 140, 140, 141, 141, 142, 142,
+ 139, 139, 139, 139, 139, 139, 139, 139, 143, 143,
+ 138, 138, 138, 138, 144, 145, 138, 146, 138, 138,
+ 138, 138, 147, 138, 147, 138, 138, 138, 138, 138,
+ 148, 148, 148, 138, 148, 138, 24, 146, 138, 138,
+ 138, 138, 144, 144, 138, 149, 35, 138, 138, 146,
+ 138, 138, 150, 138, 138, 138, 151, 35, 138, 35,
+ 138, 138, 138, 148, 148, 138, 148, 148, 138, 138,
+ 138, 148, 138, 138, 149, 138, 138, 138, 138, 150,
+ 138, 138, 151, 151, 138, 152, 138, 138, 35, 138,
+
+ 138, 138, 138, 148, 138, 138, 48, 138, 138, 138,
+ 152, 35, 138, 138, 138, 138, 35, 138, 138, 138,
+ 138, 138, 35, 138, 138, 138, 138, 35, 138, 138,
+ 35, 138, 138, 138, 138, 138, 138, 0, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138
+ } ;
+
+static yyconst flex_int16_t yy_nxt[377] =
+ { 0,
+ 22, 24, 23, 25, 26, 27, 28, 29, 22, 30,
+ 31, 22, 32, 33, 34, 22, 33, 33, 33, 33,
+ 33, 33, 33, 35, 33, 33, 33, 33, 33, 33,
+ 23, 23, 23, 23, 89, 91, 57, 84, 37, 38,
+ 37, 38, 42, 43, 42, 43, 97, 44, 80, 44,
+ 69, 45, 53, 45, 81, 54, 40, 59, 40, 47,
+ 98, 61, 126, 55, 48, 49, 59, 50, 51, 60,
+ 61, 66, 52, 66, 75, 99, 67, 62, 67, 76,
+ 78, 68, 75, 77, 69, 79, 69, 76, 75, 77,
+ 86, 77, 132, 76, 80, 97, 70, 77, 82, 59,
+
+ 81, 53, 60, 61, 54, 138, 87, 129, 138, 98,
+ 62, 138, 55, 66, 138, 138, 138, 88, 67, 66,
+ 65, 80, 138, 117, 67, 93, 69, 81, 94, 75,
+ 75, 68, 69, 130, 76, 76, 95, 75, 77, 77,
+ 78, 84, 76, 101, 84, 79, 77, 82, 102, 77,
+ 104, 83, 103, 84, 69, 76, 86, 69, 93, 77,
+ 138, 94, 109, 138, 84, 129, 69, 127, 110, 95,
+ 101, 138, 87, 68, 112, 102, 104, 69, 109, 103,
+ 109, 76, 109, 88, 110, 77, 110, 108, 110, 119,
+ 68, 124, 119, 123, 120, 124, 125, 120, 128, 68,
+
+ 125, 68, 131, 133, 133, 135, 135, 126, 137, 67,
+ 137, 122, 121, 118, 116, 115, 134, 134, 114, 136,
+ 136, 134, 113, 134, 108, 92, 68, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 56, 56, 107,
+ 91, 106, 105, 100, 56, 63, 63, 63, 68, 92,
+ 91, 89, 63, 68, 58, 68, 68, 83, 68, 64,
+
+ 68, 68, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 85, 73, 72, 71, 65, 85, 64, 85,
+ 85, 90, 90, 90, 96, 96, 58, 138, 23, 23,
+ 23, 96, 111, 23, 23, 23, 111, 111, 23, 111,
+ 23, 23, 23, 23, 23, 21, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138
+ } ;
+
+static yyconst flex_int16_t yy_chk[377] =
+ { 0,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 5, 7, 6, 8, 89, 89, 145, 56, 5, 5,
+ 6, 6, 9, 9, 10, 10, 69, 9, 44, 10,
+ 56, 9, 25, 10, 44, 25, 7, 59, 8, 24,
+ 69, 59, 132, 25, 24, 24, 28, 24, 24, 28,
+ 28, 33, 24, 35, 41, 70, 33, 28, 35, 41,
+ 42, 70, 43, 41, 33, 42, 35, 43, 45, 42,
+ 61, 43, 130, 45, 79, 97, 35, 45, 45, 48,
+
+ 79, 53, 48, 48, 53, 54, 61, 129, 54, 97,
+ 48, 60, 53, 65, 60, 60, 54, 61, 65, 66,
+ 65, 80, 60, 112, 66, 67, 65, 80, 67, 74,
+ 75, 112, 66, 127, 74, 75, 67, 77, 74, 75,
+ 78, 84, 77, 81, 83, 78, 77, 77, 81, 78,
+ 82, 83, 81, 85, 84, 82, 86, 83, 93, 82,
+ 94, 93, 96, 94, 98, 126, 85, 122, 96, 93,
+ 101, 94, 86, 99, 99, 101, 104, 98, 109, 101,
+ 108, 104, 111, 86, 109, 104, 108, 108, 111, 114,
+ 117, 118, 119, 117, 114, 124, 118, 119, 123, 123,
+
+ 124, 128, 128, 131, 133, 134, 135, 121, 136, 133,
+ 137, 116, 115, 113, 106, 105, 131, 133, 103, 134,
+ 135, 136, 100, 137, 95, 92, 131, 139, 139, 139,
+ 139, 139, 139, 139, 139, 139, 139, 140, 140, 140,
+ 140, 140, 140, 140, 140, 140, 140, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 142, 142, 142,
+ 142, 142, 142, 142, 142, 142, 142, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 144, 144, 91,
+ 90, 88, 87, 73, 144, 146, 146, 146, 68, 64,
+ 63, 62, 146, 147, 58, 57, 147, 55, 147, 50,
+
+ 147, 147, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 148, 149, 40, 38, 37, 32, 149, 30, 149,
+ 149, 150, 150, 150, 151, 151, 27, 21, 20, 19,
+ 18, 151, 152, 17, 16, 15, 152, 152, 14, 152,
+ 13, 12, 11, 2, 1, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 138, 138
+ } ;
+
+extern int declinfoYY_flex_debug;
+int declinfoYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up declinfoYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *declinfoYYtext;
+#line 1 "declinfo.l"
+/******************************************************************************
+ *
+ * $Id: declinfo.l,v 1.26 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#line 19 "declinfo.l"
+
+/*
+ * includes
+ */
+#include <stdio.h>
+//#include <iostream.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "declinfo.h"
+#include "util.h"
+#include "message.h"
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+
+static const char * inputString;
+static int inputPosition;
+static QCString scope;
+static QCString className;
+static QCString classTempList;
+static QCString funcTempList;
+static QCString type;
+static QCString name;
+static QCString args;
+static QCString tmpType;
+static int sharpCount;
+static bool classTempListFound;
+static bool funcTempListFound;
+static QCString exceptionString;
+static bool insideObjC;
+
+static void addType()
+{
+ //printf("addType() type=`%s' scope=`%s' name=`%s'\n",
+ // type.data(),scope.data(),name.data());
+ if (name.isEmpty() && scope.isEmpty()) return;
+ if (!type.isEmpty()) type+=" ";
+ if (!scope.isEmpty()) type+=scope+"::";
+ type+=name;
+ scope.resize(0);
+ name.resize(0);
+}
+
+static void addTypeName()
+{
+ //printf("addTypeName() type=`%s' scope=`%s' name=`%s'\n",
+ // type.data(),scope.data(),name.data());
+ if (name.isEmpty() ||
+ name.at(name.length()-1)==':') // end of Objective-C keyword => append to name not type
+ {
+ return;
+ }
+ if (!type.isEmpty()) type+=' ';
+ type+=name;
+ name.resize(0);
+}
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+
+
+
+
+
+
+
+
+
+#line 732 "<stdout>"
+
+#define INITIAL 0
+#define Start 1
+#define Template 2
+#define ReadArgs 3
+#define Operator 4
+#define FuncPtr 5
+#define EndTemplate 6
+#define StripTempArgs 7
+#define SkipSharp 8
+#define ReadExceptions 9
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int declinfoYYlex_destroy (void );
+
+int declinfoYYget_debug (void );
+
+void declinfoYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE declinfoYYget_extra (void );
+
+void declinfoYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *declinfoYYget_in (void );
+
+void declinfoYYset_in (FILE * in_str );
+
+FILE *declinfoYYget_out (void );
+
+void declinfoYYset_out (FILE * out_str );
+
+yy_size_t declinfoYYget_leng (void );
+
+char *declinfoYYget_text (void );
+
+int declinfoYYget_lineno (void );
+
+void declinfoYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int declinfoYYwrap (void );
+#else
+extern int declinfoYYwrap (void );
+#endif
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( declinfoYYtext, declinfoYYleng, 1, declinfoYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( declinfoYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( declinfoYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, declinfoYYin))==0 && ferror(declinfoYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(declinfoYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int declinfoYYlex (void);
+
+#define YY_DECL int declinfoYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after declinfoYYtext and declinfoYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 115 "declinfo.l"
+
+
+#line 924 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)declinfoYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in declinfoYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! declinfoYYin )
+ declinfoYYin = stdin;
+
+ if ( ! declinfoYYout )
+ declinfoYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ declinfoYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ declinfoYY_create_buffer(declinfoYYin,YY_BUF_SIZE );
+ }
+
+ declinfoYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of declinfoYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 139 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 346 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+*yy_cp = (yy_hold_char); /* undo effects of setting up declinfoYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 8;
+YY_DO_BEFORE_ACTION; /* set up declinfoYYtext again */
+YY_RULE_SETUP
+#line 117 "declinfo.l"
+{ // operator rule must be before {ID} rule
+ name += declinfoYYtext;
+ BEGIN(Operator);
+ }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 121 "declinfo.l"
+{ // Objective-C class categories
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ name += declinfoYYtext;
+ }
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 131 "declinfo.l"
+{ // the []'s are for Java,
+ // the / was add to deal with multi-
+ // dimensional C++ arrays like A[][15]
+ // the leading ~ is for a destructor
+ // the leading ! is for a C++/CLI finalizer (see bug 456475 and 635198)
+ addTypeName();
+ name += declinfoYYtext;
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 139 "declinfo.l"
+{ // found a scope specifier
+ if (!scope.isEmpty())
+ {
+ scope+="::"+name; // add name to scope
+ }
+ else
+ {
+ scope = name.copy(); // scope becomes name
+ }
+ name.resize(0);
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 150 "declinfo.l"
+{ // Objective-C argument separator
+ name+=declinfoYYtext;
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 153 "declinfo.l"
+{
+ addType();
+ type+=declinfoYYtext;
+ }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 157 "declinfo.l"
+{
+ addType();
+ }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 160 "declinfo.l"
+{
+ addType();
+ QCString text=declinfoYYtext;
+ type+=text.stripWhiteSpace();
+ }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 165 "declinfo.l"
+{
+ type+=")";
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 168 "declinfo.l"
+{ // TODO: function pointers
+ args+="(";
+ BEGIN(ReadArgs);
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 172 "declinfo.l"
+{
+ args+="[";
+ BEGIN(ReadArgs);
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 176 "declinfo.l"
+{
+ name+="<";
+ sharpCount=0;
+ BEGIN(Template);
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 181 "declinfo.l"
+{ name+="<<"; }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 182 "declinfo.l"
+{ name+=">>"; }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 183 "declinfo.l"
+{
+ name+="<";
+ sharpCount++;
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 187 "declinfo.l"
+{
+ name+=">";
+ if (sharpCount)
+ --sharpCount;
+ else
+ {
+ BEGIN(Start);
+ }
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 196 "declinfo.l"
+{
+ name+=*declinfoYYtext;
+ }
+ YY_BREAK
+case 18:
+*yy_cp = (yy_hold_char); /* undo effects of setting up declinfoYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up declinfoYYtext again */
+YY_RULE_SETUP
+#line 199 "declinfo.l"
+{
+ name+="() <>";
+ BEGIN(ReadArgs);
+ }
+ YY_BREAK
+case 19:
+*yy_cp = (yy_hold_char); /* undo effects of setting up declinfoYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up declinfoYYtext again */
+YY_RULE_SETUP
+#line 203 "declinfo.l"
+{
+ name+="()";
+ BEGIN(ReadArgs);
+ }
+ YY_BREAK
+case 20:
+/* rule 20 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up declinfoYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up declinfoYYtext again */
+YY_RULE_SETUP
+#line 207 "declinfo.l"
+{
+ name+=declinfoYYtext;
+ BEGIN(ReadArgs);
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 211 "declinfo.l"
+{
+ exceptionString="throw(";
+ BEGIN(ReadExceptions);
+ }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 215 "declinfo.l"
+{
+ args+=*declinfoYYtext;
+ }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 218 "declinfo.l"
+{
+ exceptionString+=*declinfoYYtext;
+ }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 221 "declinfo.l"
+
+ YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 222 "declinfo.l"
+
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 224 "declinfo.l"
+ECHO;
+ YY_BREAK
+#line 1265 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(Start):
+ case YY_STATE_EOF(Template):
+ case YY_STATE_EOF(ReadArgs):
+ case YY_STATE_EOF(Operator):
+ case YY_STATE_EOF(FuncPtr):
+ case YY_STATE_EOF(EndTemplate):
+ case YY_STATE_EOF(StripTempArgs):
+ case YY_STATE_EOF(SkipSharp):
+ case YY_STATE_EOF(ReadExceptions):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed declinfoYYin at a new source and called
+ * declinfoYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = declinfoYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( declinfoYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * declinfoYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of declinfoYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ declinfoYYrestart(declinfoYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) declinfoYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 139 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 139 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 138);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ declinfoYYrestart(declinfoYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( declinfoYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve declinfoYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void declinfoYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ declinfoYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ declinfoYY_create_buffer(declinfoYYin,YY_BUF_SIZE );
+ }
+
+ declinfoYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ declinfoYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void declinfoYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * declinfoYYpop_buffer_state();
+ * declinfoYYpush_buffer_state(new_buffer);
+ */
+ declinfoYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ declinfoYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (declinfoYYwrap()) processing, but the only time this flag
+ * is looked at is after declinfoYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void declinfoYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ declinfoYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE declinfoYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) declinfoYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in declinfoYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) declinfoYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in declinfoYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ declinfoYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with declinfoYY_create_buffer()
+ *
+ */
+ void declinfoYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ declinfoYYfree((void *) b->yy_ch_buf );
+
+ declinfoYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a declinfoYYrestart() or at EOF.
+ */
+ static void declinfoYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ declinfoYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then declinfoYY_init_buffer was _probably_
+ * called from declinfoYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void declinfoYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ declinfoYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void declinfoYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ declinfoYYensure_buffer_stack();
+
+ /* This block is copied from declinfoYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from declinfoYY_switch_to_buffer. */
+ declinfoYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void declinfoYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ declinfoYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ declinfoYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void declinfoYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)declinfoYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in declinfoYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)declinfoYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in declinfoYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE declinfoYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) declinfoYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in declinfoYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ declinfoYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to declinfoYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * declinfoYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE declinfoYY_scan_string (yyconst char * yystr )
+{
+
+ return declinfoYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to declinfoYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE declinfoYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) declinfoYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in declinfoYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = declinfoYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in declinfoYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up declinfoYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ declinfoYYtext[declinfoYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = declinfoYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ declinfoYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int declinfoYYget_lineno (void)
+{
+
+ return declinfoYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *declinfoYYget_in (void)
+{
+ return declinfoYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *declinfoYYget_out (void)
+{
+ return declinfoYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t declinfoYYget_leng (void)
+{
+ return declinfoYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *declinfoYYget_text (void)
+{
+ return declinfoYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void declinfoYYset_lineno (int line_number )
+{
+
+ declinfoYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see declinfoYY_switch_to_buffer
+ */
+void declinfoYYset_in (FILE * in_str )
+{
+ declinfoYYin = in_str ;
+}
+
+void declinfoYYset_out (FILE * out_str )
+{
+ declinfoYYout = out_str ;
+}
+
+int declinfoYYget_debug (void)
+{
+ return declinfoYY_flex_debug;
+}
+
+void declinfoYYset_debug (int bdebug )
+{
+ declinfoYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from declinfoYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ declinfoYYin = stdin;
+ declinfoYYout = stdout;
+#else
+ declinfoYYin = (FILE *) 0;
+ declinfoYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * declinfoYYlex_init()
+ */
+ return 0;
+}
+
+/* declinfoYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int declinfoYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ declinfoYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ declinfoYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ declinfoYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ declinfoYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * declinfoYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *declinfoYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *declinfoYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void declinfoYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see declinfoYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 224 "declinfo.l"
+
+
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+void parseFuncDecl(const QCString &decl,bool objC,QCString &cl,QCString &t,
+ QCString &n,QCString &a,QCString &ftl,QCString &exc)
+{
+ inputString = decl;
+ //printf("Input=`%s'\n",inputString);
+ if (inputString==0) return;
+ inputPosition = 0;
+ classTempListFound = FALSE;
+ funcTempListFound = FALSE;
+ insideObjC = objC;
+ scope.resize(0);
+ className.resize(0);
+ classTempList.resize(0);
+ funcTempList.resize(0);
+ name.resize(0);
+ type.resize(0);
+ args.resize(0);
+ exceptionString.resize(0);
+ // first we try to find the type, scope, name and arguments
+ declinfoYYrestart( declinfoYYin );
+ BEGIN( Start );
+ declinfoYYlex();
+
+ //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n",
+ // type.data(),scope.data(),name.data(),args.data());
+
+ int nb = name.findRev('[');
+ if (nb!=-1 && args.isEmpty()) // correct for [] in name ambigity (due to Java return type allowing [])
+ {
+ args.prepend(name.right(name.length()-nb));
+ name=name.left(nb);
+ }
+
+#if 0
+ {
+ int l=scope.length();
+ int i=0;
+ int skipCount=0;
+ cl.resize(0);
+ ctl.resize(0);
+ for (i=0;i<l;i++)
+ {
+ char c=scope.at(i);
+ if (c=='<')
+ skipCount++;
+ else if (c=='>')
+ skipCount--;
+ else if (skipCount==0)
+ cl+=c;
+ }
+ }
+ cl=stripTemplateSpecifiersFromScope(removeRedundantWhiteSpace(scope),FALSE);
+ ctl.resize(0);
+#endif
+
+ cl=scope;
+ n=removeRedundantWhiteSpace(name);
+ int il,ir;
+ if ((il=n.find('<'))!=-1 && (ir=n.findRev('>'))!=-1)
+ // TODO: handle cases like where n="operator<< <T>"
+ {
+ ftl=removeRedundantWhiteSpace(n.right(n.length()-il));
+ n=n.left(il);
+ }
+
+ //ctl=classTempList.copy();
+ //ftl=funcTempList.copy();
+ t=removeRedundantWhiteSpace(type);
+ a=removeRedundantWhiteSpace(args);
+ exc=removeRedundantWhiteSpace(exceptionString);
+
+ if (!t.isEmpty() && t.at(t.length()-1)==')') // for function pointers
+ {
+ a.prepend(")");
+ t=t.left(t.length()-1);
+ }
+ //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n",
+ // t.data(),cl.data(),n.data(),a.data());
+
+ return;
+
+
+}
+
+//extern "C" { // some bogus code to keep the compiler happy
+// int declinfoYYwrap() { return 1 ; }
+// void declinfoYYdummy() { yy_flex_realloc(0,0); }
+//}
+
+#if 0
+void dumpDecl(const char *s)
+{
+ QCString className;
+ QCString classTNames;
+ QCString type;
+ QCString name;
+ QCString args;
+ QCString funcTNames;
+ msg("-----------------------------------------\n");
+ parseFuncDecl(s,className,classTNames,type,name,args,funcTNames);
+ msg("type=`%s' class=`%s' classTempl=`%s' name=`%s' "
+ "funcTemplateNames=`%s' args=`%s'\n",
+ type.data(),className.data(),classTNames.data(),
+ name.data(),funcTNames.data(),args.data()
+ );
+}
+
+// some test code
+int main()
+{
+ dumpDecl("A < T > :: Value * A < T > :: getValue < S > ( const A < T > & a )");
+ dumpDecl("const A<T>::Value* A<T>::getValue<S>(const A<T>&a)");
+ dumpDecl("func()");
+ dumpDecl("friend void bla<>()");
+ dumpDecl("name< T > :: operator () (int bla)");
+ dumpDecl("name< T > :: operator << (int bla)");
+ dumpDecl("name< T > :: operator << <> (int bla)");
+ dumpDecl("className::func()");
+ dumpDecl("void ( * Name < T > :: bla ) ( int, char * )");
+}
+#endif
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void declinfoYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
+
diff --git a/src/declinfo.h b/src/declinfo.h
new file mode 100644
index 0000000..016d0be
--- /dev/null
+++ b/src/declinfo.h
@@ -0,0 +1,33 @@
+/******************************************************************************
+ *
+ * $Id: declinfo.h,v 1.8 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DECLINFO_H
+#define DECLINFO_H
+
+#include "qtbc.h"
+#include <stdio.h>
+
+extern void parseFuncDecl(const QCString &decl,
+ bool objC,
+ QCString &clName,
+ QCString &type,
+ QCString &name,
+ QCString &args,
+ QCString &funcTempList,
+ QCString &exceptions
+ );
+#endif
diff --git a/src/declinfo.l b/src/declinfo.l
new file mode 100644
index 0000000..5f3567f
--- /dev/null
+++ b/src/declinfo.l
@@ -0,0 +1,357 @@
+/******************************************************************************
+ *
+ * $Id: declinfo.l,v 1.26 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+
+/*
+ * includes
+ */
+#include <stdio.h>
+//#include <iostream.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "declinfo.h"
+#include "util.h"
+#include "message.h"
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+
+static const char * inputString;
+static int inputPosition;
+static QCString scope;
+static QCString className;
+static QCString classTempList;
+static QCString funcTempList;
+static QCString type;
+static QCString name;
+static QCString args;
+static QCString tmpType;
+static int sharpCount;
+static bool classTempListFound;
+static bool funcTempListFound;
+static QCString exceptionString;
+static bool insideObjC;
+
+static void addType()
+{
+ //printf("addType() type=`%s' scope=`%s' name=`%s'\n",
+ // type.data(),scope.data(),name.data());
+ if (name.isEmpty() && scope.isEmpty()) return;
+ if (!type.isEmpty()) type+=" ";
+ if (!scope.isEmpty()) type+=scope+"::";
+ type+=name;
+ scope.resize(0);
+ name.resize(0);
+}
+
+static void addTypeName()
+{
+ //printf("addTypeName() type=`%s' scope=`%s' name=`%s'\n",
+ // type.data(),scope.data(),name.data());
+ if (name.isEmpty() ||
+ name.at(name.length()-1)==':') // end of Objective-C keyword => append to name not type
+ {
+ return;
+ }
+ if (!type.isEmpty()) type+=' ';
+ type+=name;
+ name.resize(0);
+}
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+%}
+
+B [ \t]
+ID "$"?([a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*)|(@[0-9]+)
+
+%option nounput
+%option noyywrap
+
+%x Start
+%x Template
+%x ReadArgs
+%x Operator
+%x FuncPtr
+%x EndTemplate
+%x StripTempArgs
+%x SkipSharp
+%x ReadExceptions
+
+%%
+
+<Start>"operator"/({B}*"["{B}*"]")* { // operator rule must be before {ID} rule
+ name += yytext;
+ BEGIN(Operator);
+ }
+<Start>{ID}{B}*"("{B}*{ID}{B}*")" { // Objective-C class categories
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ name += yytext;
+ }
+ }
+<Start>([~!]{B}*)?{ID}/({B}*"["{B}*"]")* { // the []'s are for Java,
+ // the / was add to deal with multi-
+ // dimensional C++ arrays like A[][15]
+ // the leading ~ is for a destructor
+ // the leading ! is for a C++/CLI finalizer (see bug 456475 and 635198)
+ addTypeName();
+ name += yytext;
+ }
+<Start>{B}*"::"{B}* { // found a scope specifier
+ if (!scope.isEmpty())
+ {
+ scope+="::"+name; // add name to scope
+ }
+ else
+ {
+ scope = name.copy(); // scope becomes name
+ }
+ name.resize(0);
+ }
+<Start>{B}*":" { // Objective-C argument separator
+ name+=yytext;
+ }
+<Start>[*&]+ {
+ addType();
+ type+=yytext;
+ }
+<Start>{B}+ {
+ addType();
+ }
+<Start>{B}*"("({ID}"::")*{B}*[&*]({B}*("const"|"volatile"){B}+)? {
+ addType();
+ QCString text=yytext;
+ type+=text.stripWhiteSpace();
+ }
+<Start>{B}*")" {
+ type+=")";
+ }
+<Start>{B}*"(" { // TODO: function pointers
+ args+="(";
+ BEGIN(ReadArgs);
+ }
+<Start>{B}*"[" {
+ args+="[";
+ BEGIN(ReadArgs);
+ }
+<Start>{B}*"<" {
+ name+="<";
+ sharpCount=0;
+ BEGIN(Template);
+ }
+<Template>"<<" { name+="<<"; }
+<Template>">>" { name+=">>"; }
+<Template>"<" {
+ name+="<";
+ sharpCount++;
+ }
+<Template>">" {
+ name+=">";
+ if (sharpCount)
+ --sharpCount;
+ else
+ {
+ BEGIN(Start);
+ }
+ }
+<Template>. {
+ name+=*yytext;
+ }
+<Operator>{B}*"("{B}*")"{B}*"<>"{B}*/"(" {
+ name+="() <>";
+ BEGIN(ReadArgs);
+ }
+<Operator>{B}*"("{B}*")"{B}*/"(" {
+ name+="()";
+ BEGIN(ReadArgs);
+ }
+<Operator>[^(]*{B}*("<>"{B}*)?/"(" {
+ name+=yytext;
+ BEGIN(ReadArgs);
+ }
+<ReadArgs>"throw"{B}*"(" {
+ exceptionString="throw(";
+ BEGIN(ReadExceptions);
+ }
+<ReadArgs>. {
+ args+=*yytext;
+ }
+<ReadExceptions>. {
+ exceptionString+=*yytext;
+ }
+<*>.
+<*>\n
+
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+void parseFuncDecl(const QCString &decl,bool objC,QCString &cl,QCString &t,
+ QCString &n,QCString &a,QCString &ftl,QCString &exc)
+{
+ inputString = decl;
+ //printf("Input=`%s'\n",inputString);
+ if (inputString==0) return;
+ inputPosition = 0;
+ classTempListFound = FALSE;
+ funcTempListFound = FALSE;
+ insideObjC = objC;
+ scope.resize(0);
+ className.resize(0);
+ classTempList.resize(0);
+ funcTempList.resize(0);
+ name.resize(0);
+ type.resize(0);
+ args.resize(0);
+ exceptionString.resize(0);
+ // first we try to find the type, scope, name and arguments
+ declinfoYYrestart( declinfoYYin );
+ BEGIN( Start );
+ declinfoYYlex();
+
+ //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n",
+ // type.data(),scope.data(),name.data(),args.data());
+
+ int nb = name.findRev('[');
+ if (nb!=-1 && args.isEmpty()) // correct for [] in name ambigity (due to Java return type allowing [])
+ {
+ args.prepend(name.right(name.length()-nb));
+ name=name.left(nb);
+ }
+
+#if 0
+ {
+ int l=scope.length();
+ int i=0;
+ int skipCount=0;
+ cl.resize(0);
+ ctl.resize(0);
+ for (i=0;i<l;i++)
+ {
+ char c=scope.at(i);
+ if (c=='<')
+ skipCount++;
+ else if (c=='>')
+ skipCount--;
+ else if (skipCount==0)
+ cl+=c;
+ }
+ }
+ cl=stripTemplateSpecifiersFromScope(removeRedundantWhiteSpace(scope),FALSE);
+ ctl.resize(0);
+#endif
+
+ cl=scope;
+ n=removeRedundantWhiteSpace(name);
+ int il,ir;
+ if ((il=n.find('<'))!=-1 && (ir=n.findRev('>'))!=-1)
+ // TODO: handle cases like where n="operator<< <T>"
+ {
+ ftl=removeRedundantWhiteSpace(n.right(n.length()-il));
+ n=n.left(il);
+ }
+
+ //ctl=classTempList.copy();
+ //ftl=funcTempList.copy();
+ t=removeRedundantWhiteSpace(type);
+ a=removeRedundantWhiteSpace(args);
+ exc=removeRedundantWhiteSpace(exceptionString);
+
+ if (!t.isEmpty() && t.at(t.length()-1)==')') // for function pointers
+ {
+ a.prepend(")");
+ t=t.left(t.length()-1);
+ }
+ //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n",
+ // t.data(),cl.data(),n.data(),a.data());
+
+ return;
+
+
+}
+
+//extern "C" { // some bogus code to keep the compiler happy
+// int declinfoYYwrap() { return 1 ; }
+// void declinfoYYdummy() { yy_flex_realloc(0,0); }
+//}
+
+#if 0
+void dumpDecl(const char *s)
+{
+ QCString className;
+ QCString classTNames;
+ QCString type;
+ QCString name;
+ QCString args;
+ QCString funcTNames;
+ msg("-----------------------------------------\n");
+ parseFuncDecl(s,className,classTNames,type,name,args,funcTNames);
+ msg("type=`%s' class=`%s' classTempl=`%s' name=`%s' "
+ "funcTemplateNames=`%s' args=`%s'\n",
+ type.data(),className.data(),classTNames.data(),
+ name.data(),funcTNames.data(),args.data()
+ );
+}
+
+// some test code
+int main()
+{
+ dumpDecl("A < T > :: Value * A < T > :: getValue < S > ( const A < T > & a )");
+ dumpDecl("const A<T>::Value* A<T>::getValue<S>(const A<T>&a)");
+ dumpDecl("func()");
+ dumpDecl("friend void bla<>()");
+ dumpDecl("name< T > :: operator () (int bla)");
+ dumpDecl("name< T > :: operator << (int bla)");
+ dumpDecl("name< T > :: operator << <> (int bla)");
+ dumpDecl("className::func()");
+ dumpDecl("void ( * Name < T > :: bla ) ( int, char * )");
+}
+#endif
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void declinfoYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
diff --git a/src/defargs.cpp b/src/defargs.cpp
new file mode 100644
index 0000000..4b729c6
--- /dev/null
+++ b/src/defargs.cpp
@@ -0,0 +1,2629 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer defargsYY_create_buffer
+#define yy_delete_buffer defargsYY_delete_buffer
+#define yy_flex_debug defargsYY_flex_debug
+#define yy_init_buffer defargsYY_init_buffer
+#define yy_flush_buffer defargsYY_flush_buffer
+#define yy_load_buffer_state defargsYY_load_buffer_state
+#define yy_switch_to_buffer defargsYY_switch_to_buffer
+#define yyin defargsYYin
+#define yyleng defargsYYleng
+#define yylex defargsYYlex
+#define yylineno defargsYYlineno
+#define yyout defargsYYout
+#define yyrestart defargsYYrestart
+#define yytext defargsYYtext
+#define yywrap defargsYYwrap
+#define yyalloc defargsYYalloc
+#define yyrealloc defargsYYrealloc
+#define yyfree defargsYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE defargsYYrestart(defargsYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t defargsYYleng;
+
+extern FILE *defargsYYin, *defargsYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up defargsYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up defargsYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via defargsYYrestart()), so that the user can continue scanning by
+ * just pointing defargsYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when defargsYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t defargsYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow defargsYYwrap()'s to do buffer switches
+ * instead of setting up a fresh defargsYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void defargsYYrestart (FILE *input_file );
+void defargsYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE defargsYY_create_buffer (FILE *file,int size );
+void defargsYY_delete_buffer (YY_BUFFER_STATE b );
+void defargsYY_flush_buffer (YY_BUFFER_STATE b );
+void defargsYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void defargsYYpop_buffer_state (void );
+
+static void defargsYYensure_buffer_stack (void );
+static void defargsYY_load_buffer_state (void );
+static void defargsYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER defargsYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE defargsYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE defargsYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE defargsYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *defargsYYalloc (yy_size_t );
+void *defargsYYrealloc (void *,yy_size_t );
+void defargsYYfree (void * );
+
+#define yy_new_buffer defargsYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ defargsYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ defargsYY_create_buffer(defargsYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ defargsYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ defargsYY_create_buffer(defargsYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define defargsYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *defargsYYin = (FILE *) 0, *defargsYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int defargsYYlineno;
+
+int defargsYYlineno = 1;
+
+extern char *defargsYYtext;
+#define yytext_ptr defargsYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up defargsYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ defargsYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 45
+#define YY_END_OF_BUFFER 46
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[214] =
+ { 0,
+ 2, 2, 46, 44, 45, 43, 45, 44, 45, 1,
+ 44, 45, 29, 44, 45, 22, 29, 44, 45, 29,
+ 44, 45, 29, 44, 45, 29, 44, 45, 29, 44,
+ 45, 31, 44, 45, 15, 31, 44, 45, 16, 31,
+ 44, 45, 31, 44, 45, 30, 31, 44, 45, 17,
+ 31, 44, 45, 18, 31, 44, 45, 20, 31, 44,
+ 45, 19, 31, 44, 45, 27, 44, 45, 2, 27,
+ 44, 45, 14, 27, 44, 45, 25, 27, 44, 45,
+ 27, 44, 45, 27, 44, 45, 14, 27, 44, 45,
+ 23, 27, 44, 45, 25, 27, 44, 45, 26, 27,
+
+ 44, 45, 27, 44, 45, 14, 27, 44, 45, 7,
+ 29, 44, 45, 29, 44, 45, 14, 29, 44, 45,
+ 25, 29, 44, 45, 25, 29, 44, 45, 12, 27,
+ 44, 45, 9, 26, 27, 44, 45, 44, 45, 44,
+ 45, 44, 45, 44, 45, 36, 41, 44, 45, 40,
+ 43, 45, 41, 44, 45, 36, 41, 44, 45, 37,
+ 44, 45, 39, 43, 45, 37, 44, 45, 28, 21,
+ 16, 30, 2,16392, 13, 26, 3, 10, 11, 9,
+ 26, 34, 36, 38, 36, 37, 37, 37, 42, 16,
+ 16,16392, 8200, 6, 6, 35, 36, 42, 37, 42,
+
+ 42, 8200, 5, 4, 5, 36, 42, 37, 42, 24,
+ 4, 32, 33
+ } ;
+
+static yyconst flex_int16_t yy_accept[153] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 4, 6, 8,
+ 10, 13, 16, 20, 23, 26, 29, 32, 35, 39,
+ 43, 46, 50, 54, 58, 62, 66, 69, 73, 77,
+ 81, 84, 87, 91, 95, 99, 103, 106, 110, 114,
+ 117, 121, 125, 129, 133, 138, 140, 142, 144, 146,
+ 150, 153, 156, 160, 163, 166, 169, 169, 169, 170,
+ 171, 171, 172, 173, 174, 174, 174, 175, 175, 175,
+ 176, 177, 177, 178, 178, 178, 178, 179, 180, 182,
+
+ 182, 182, 182, 183, 183, 183, 184, 185, 186, 187,
+ 188, 189, 190, 191, 192, 192, 192, 192, 193, 194,
+ 194, 194, 195, 195, 196, 196, 196, 197, 197, 197,
+ 199, 201, 202, 202, 203, 203, 204, 206, 206, 206,
+ 206, 208, 210, 211, 212, 212, 213, 213, 213, 213,
+ 214, 214
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 4, 5, 1, 1, 1, 6, 7, 8,
+ 9, 10, 1, 11, 12, 1, 13, 14, 15, 15,
+ 15, 15, 15, 15, 15, 16, 16, 17, 1, 18,
+ 19, 20, 1, 1, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 22, 23, 24, 6, 21, 1, 25, 21, 26, 21,
+
+ 27, 21, 21, 21, 28, 21, 21, 29, 21, 30,
+ 31, 21, 21, 21, 32, 33, 21, 34, 21, 21,
+ 21, 21, 35, 1, 36, 1, 1, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21
+ } ;
+
+static yyconst flex_int32_t yy_meta[37] =
+ { 0,
+ 1, 2, 3, 1, 1, 1, 1, 1, 4, 5,
+ 1, 1, 1, 6, 6, 6, 4, 1, 1, 1,
+ 7, 1, 1, 1, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 1, 1
+ } ;
+
+static yyconst flex_int16_t yy_base[170] =
+ { 0,
+ 0, 1, 2, 3, 19, 40, 63, 0, 0, 0,
+ 10, 18, 0, 92, 127, 0, 161, 0, 194, 226,
+ 258, 290, 31, 37, 4, 20, 302, 500, 500, 38,
+ 500, 500, 500, 281, 45, 37, 0, 500, 500, 298,
+ 49, 0, 500, 500, 500, 500, 500, 296, 100, 101,
+ 277, 94, 90, 500, 103, 0, 272, 500, 500, 272,
+ 500, 111, 163, 169, 0, 27, 23, 263, 260, 0,
+ 500, 277, 102, 0, 500, 107, 115, 171, 500, 500,
+ 287, 178, 0, 286, 109, 196, 323, 165, 108, 500,
+ 0, 263, 500, 279, 194, 208, 500, 500, 0, 183,
+
+ 261, 185, 500, 253, 253, 0, 500, 182, 0, 207,
+ 227, 263, 230, 0, 187, 263, 231, 208, 356, 232,
+ 230, 500, 272, 271, 255, 252, 500, 243, 240, 245,
+ 232, 500, 262, 0, 231, 500, 500, 259, 205, 179,
+ 0, 0, 500, 500, 193, 500, 162, 159, 34, 500,
+ 500, 390, 397, 404, 411, 418, 425, 431, 433, 440,
+ 442, 449, 456, 458, 465, 472, 478, 485, 492
+ } ;
+
+static yyconst flex_int16_t yy_def[170] =
+ { 0,
+ 152, 152, 152, 152, 153, 153, 151, 7, 7, 7,
+ 7, 7, 7, 7, 151, 15, 153, 17, 154, 154,
+ 152, 152, 155, 155, 156, 156, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 157, 151, 151, 158,
+ 151, 159, 151, 151, 151, 151, 151, 151, 160, 151,
+ 151, 151, 151, 151, 151, 161, 162, 151, 151, 163,
+ 151, 151, 151, 151, 164, 151, 151, 151, 151, 165,
+ 151, 151, 165, 166, 151, 166, 151, 151, 151, 151,
+ 158, 167, 159, 151, 160, 160, 160, 151, 151, 151,
+ 161, 162, 151, 151, 168, 151, 151, 151, 164, 151,
+
+ 169, 151, 151, 151, 151, 165, 151, 165, 166, 166,
+ 166, 151, 167, 113, 160, 151, 160, 87, 160, 151,
+ 151, 151, 151, 151, 151, 169, 151, 151, 151, 165,
+ 166, 151, 160, 119, 151, 151, 151, 151, 151, 151,
+ 165, 166, 151, 151, 151, 151, 151, 151, 151, 151,
+ 0, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151
+ } ;
+
+static yyconst flex_int16_t yy_nxt[537] =
+ { 0,
+ 151, 151, 29, 29, 29, 29, 75, 38, 38, 31,
+ 31, 151, 30, 30, 30, 30, 76, 38, 38, 31,
+ 31, 29, 75, 33, 102, 38, 38, 43, 100, 44,
+ 34, 35, 76, 71, 46, 43, 103, 44, 36, 71,
+ 72, 37, 29, 73, 33, 45, 72, 77, 101, 73,
+ 78, 34, 35, 45, 77, 79, 79, 78, 77, 36,
+ 150, 78, 37, 38, 38, 29, 38, 38, 38, 38,
+ 39, 40, 38, 38, 38, 41, 38, 38, 38, 38,
+ 38, 38, 38, 42, 38, 38, 38, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 38, 38, 38,
+
+ 38, 86, 88, 77, 88, 87, 78, 90, 90, 87,
+ 115, 77, 88, 89, 108, 89, 110, 120, 112, 111,
+ 121, 90, 90, 89, 112, 116, 46, 47, 48, 29,
+ 47, 47, 47, 47, 49, 50, 47, 50, 51, 52,
+ 47, 47, 47, 47, 53, 54, 55, 56, 57, 47,
+ 47, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 58, 47, 29, 88, 59, 88, 60, 61, 62,
+ 96, 62, 34, 35, 112, 89, 97, 89, 61, 81,
+ 63, 79, 79, 112, 100, 130, 102, 149, 115, 148,
+ 98, 113, 113, 113, 130, 61, 29, 117, 103, 144,
+
+ 124, 87, 64, 116, 101, 87, 52, 125, 125, 96,
+ 131, 147, 116, 85, 65, 97, 131, 85, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 29, 98,
+ 131, 81, 117, 135, 64, 135, 87, 146, 52, 131,
+ 87, 135, 135, 113, 113, 113, 65, 116, 143, 142,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 29, 137, 141, 86, 140, 144, 66, 87, 138, 138,
+ 30, 87, 145, 145, 139, 127, 67, 136, 136, 133,
+ 132, 129, 128, 68, 127, 122, 93, 84, 81, 107,
+ 105, 69, 29, 104, 95, 93, 90, 84, 66, 81,
+
+ 79, 151, 30, 151, 151, 151, 151, 151, 67, 151,
+ 151, 151, 151, 151, 151, 68, 151, 151, 151, 151,
+ 151, 151, 151, 69, 118, 151, 151, 151, 87, 151,
+ 151, 151, 87, 151, 151, 151, 151, 151, 151, 116,
+ 151, 151, 151, 119, 151, 151, 151, 119, 119, 119,
+ 119, 119, 119, 119, 119, 119, 119, 115, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 134,
+ 134, 134, 116, 151, 151, 151, 134, 151, 151, 151,
+ 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+ 28, 28, 28, 28, 28, 28, 28, 32, 32, 32,
+
+ 32, 32, 32, 32, 47, 47, 47, 47, 47, 47,
+ 47, 70, 70, 70, 70, 70, 70, 70, 74, 74,
+ 74, 74, 74, 74, 74, 80, 80, 151, 80, 80,
+ 80, 80, 82, 151, 151, 151, 151, 82, 83, 83,
+ 85, 85, 85, 151, 85, 85, 85, 91, 91, 92,
+ 92, 92, 92, 92, 92, 92, 94, 94, 151, 94,
+ 94, 94, 94, 99, 99, 106, 106, 151, 106, 151,
+ 106, 106, 109, 109, 151, 109, 109, 109, 109, 114,
+ 151, 151, 151, 114, 114, 123, 123, 151, 123, 123,
+ 123, 123, 126, 126, 126, 126, 126, 126, 126, 27,
+
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151
+ } ;
+
+static yyconst flex_int16_t yy_chk[537] =
+ { 0,
+ 0, 0, 1, 2, 3, 4, 25, 13, 13, 3,
+ 4, 0, 1, 2, 3, 4, 25, 11, 11, 3,
+ 4, 5, 26, 5, 67, 12, 12, 11, 66, 11,
+ 5, 5, 26, 23, 13, 12, 67, 12, 5, 24,
+ 23, 5, 6, 23, 6, 11, 24, 30, 66, 24,
+ 30, 6, 6, 12, 35, 36, 36, 35, 41, 6,
+ 149, 41, 6, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 14,
+
+ 14, 49, 50, 52, 55, 49, 52, 53, 53, 49,
+ 85, 73, 62, 50, 73, 55, 76, 89, 77, 76,
+ 89, 55, 55, 62, 77, 85, 14, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 17, 63, 17, 88, 17, 17, 17,
+ 64, 17, 17, 17, 78, 63, 64, 88, 17, 82,
+ 17, 63, 63, 78, 100, 108, 102, 148, 115, 147,
+ 64, 82, 82, 82, 108, 17, 19, 86, 102, 145,
+
+ 95, 86, 19, 115, 100, 86, 19, 95, 95, 96,
+ 110, 140, 86, 118, 19, 96, 110, 118, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 20, 96,
+ 111, 113, 117, 121, 20, 120, 117, 139, 20, 111,
+ 117, 120, 121, 113, 113, 113, 20, 117, 135, 131,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 21, 125, 130, 133, 129, 138, 21, 133, 125, 125,
+ 21, 133, 138, 138, 128, 126, 21, 124, 123, 116,
+ 112, 105, 104, 21, 101, 94, 92, 84, 81, 72,
+ 69, 21, 22, 68, 60, 57, 51, 48, 22, 40,
+
+ 34, 27, 22, 0, 0, 0, 0, 0, 22, 0,
+ 0, 0, 0, 0, 0, 22, 0, 0, 0, 0,
+ 0, 0, 0, 22, 87, 0, 0, 0, 87, 0,
+ 0, 0, 87, 0, 0, 0, 0, 0, 0, 87,
+ 0, 0, 0, 87, 0, 0, 0, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 119, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 119,
+ 119, 119, 119, 0, 0, 0, 119, 0, 0, 0,
+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+ 152, 152, 152, 152, 152, 152, 152, 153, 153, 153,
+
+ 153, 153, 153, 153, 154, 154, 154, 154, 154, 154,
+ 154, 155, 155, 155, 155, 155, 155, 155, 156, 156,
+ 156, 156, 156, 156, 156, 157, 157, 0, 157, 157,
+ 157, 157, 158, 0, 0, 0, 0, 158, 159, 159,
+ 160, 160, 160, 0, 160, 160, 160, 161, 161, 162,
+ 162, 162, 162, 162, 162, 162, 163, 163, 0, 163,
+ 163, 163, 163, 164, 164, 165, 165, 0, 165, 0,
+ 165, 165, 166, 166, 0, 166, 166, 166, 166, 167,
+ 0, 0, 0, 167, 167, 168, 168, 0, 168, 168,
+ 168, 168, 169, 169, 169, 169, 169, 169, 169, 151,
+
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151
+ } ;
+
+extern int defargsYY_flex_debug;
+int defargsYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up defargsYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *defargsYYtext;
+#line 1 "defargs.l"
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \file
+ * This scanner is used to convert a string into a list of function or
+ * template arguments. Each parsed argument results in a Argument struct,
+ * that is put into an ArgumentList in declaration order.
+ * Comment blocks for arguments can also be included in the string.
+ * The argument string does not contain new-lines (except inside any
+ * comment blocks).
+ * An Argument consists of the string fields:
+ * type,name,default value, and documentation
+ * The Argument list as a whole can be pure, constant or volatile.
+ *
+ * Examples of input strings are:
+ * \code
+ * "(int a,int b) const"
+ * "(const char *s="hello world",int=5) = 0"
+ * "<class T,class N>"
+ * "(char c,const char)"
+ * \endcode
+ *
+ * Note: It is not always possible to distinguish between the name and
+ * type of an argument. In case of doubt the name is added to the
+ * type, and the matchArgumentList in util.cpp is be used to
+ * further determine the correct separation.
+ */
+#line 44 "defargs.l"
+
+/*
+ * includes
+ */
+#include "qtbc.h"
+#include <stdio.h>
+//#include <iostream.h>
+#include <assert.h>
+#include <ctype.h>
+#include <qregexp.h>
+
+#include "defargs.h"
+#include "entry.h"
+#include "util.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ * state variables
+ */
+static const char *g_inputString;
+static int g_inputPosition;
+static ArgumentList *g_argList;
+static QCString *g_copyArgValue;
+static QCString g_curArgTypeName;
+static QCString g_curArgDefValue;
+static QCString g_curArgName;
+static QCString g_curArgDocs;
+static QCString g_curArgAttrib;
+static QCString g_curArgArray;
+static QCString g_extraTypeChars;
+static int g_argRoundCount;
+static int g_argSharpCount;
+static int g_argCurlyCount;
+static int g_readArgContext;
+static int g_lastDocContext;
+static int g_lastDocChar;
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 787 "<stdout>"
+
+#define INITIAL 0
+#define Start 1
+#define CopyArgString 2
+#define CopyArgRound 3
+#define CopyArgRound2 4
+#define CopyArgSharp 5
+#define CopyArgCurly 6
+#define ReadFuncArgType 7
+#define ReadFuncArgDef 8
+#define ReadFuncArgPtr 9
+#define FuncQual 10
+#define ReadDocBlock 11
+#define ReadDocLine 12
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int defargsYYlex_destroy (void );
+
+int defargsYYget_debug (void );
+
+void defargsYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE defargsYYget_extra (void );
+
+void defargsYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *defargsYYget_in (void );
+
+void defargsYYset_in (FILE * in_str );
+
+FILE *defargsYYget_out (void );
+
+void defargsYYset_out (FILE * out_str );
+
+yy_size_t defargsYYget_leng (void );
+
+char *defargsYYget_text (void );
+
+int defargsYYget_lineno (void );
+
+void defargsYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int defargsYYwrap (void );
+#else
+extern int defargsYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( defargsYYtext, defargsYYleng, 1, defargsYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( defargsYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( defargsYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, defargsYYin))==0 && ferror(defargsYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(defargsYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int defargsYYlex (void);
+
+#define YY_DECL int defargsYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after defargsYYtext and defargsYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 119 "defargs.l"
+
+
+#line 984 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)defargsYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in defargsYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! defargsYYin )
+ defargsYYin = stdin;
+
+ if ( ! defargsYYout )
+ defargsYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ defargsYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ defargsYY_create_buffer(defargsYYin,YY_BUF_SIZE );
+ }
+
+ defargsYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of defargsYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 152 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 500 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 121 "defargs.l"
+{ BEGIN(ReadFuncArgType); }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 123 "defargs.l"
+{
+ g_curArgTypeName+=" ";
+ }
+ YY_BREAK
+case 3:
+/* rule 3 can match eol */
+YY_RULE_SETUP
+#line 126 "defargs.l"
+{
+ if (g_curArgTypeName.stripWhiteSpace().isEmpty())
+ {
+ g_curArgAttrib=defargsYYtext; // for M$-IDL
+ }
+ else // array type
+ {
+ g_curArgArray+=defargsYYtext;
+ }
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 136 "defargs.l"
+{ g_curArgDefValue+=defargsYYtext; }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 137 "defargs.l"
+{ g_curArgDefValue+=defargsYYtext; }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 138 "defargs.l"
+{ g_curArgDefValue+=defargsYYtext; }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 139 "defargs.l"
+{
+ g_curArgDefValue+=*defargsYYtext;
+ BEGIN( CopyArgString );
+ }
+ YY_BREAK
+case 8:
+/* rule 8 can match eol */
+YY_RULE_SETUP
+#line 143 "defargs.l"
+{
+ // function pointer as argument
+ g_curArgTypeName+=defargsYYtext;
+ //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
+ BEGIN( ReadFuncArgPtr );
+ }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 149 "defargs.l"
+{
+ g_curArgName=defargsYYtext;
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 152 "defargs.l"
+{ // function pointer
+ g_curArgTypeName+=defargsYYtext;
+ //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
+ g_readArgContext = ReadFuncArgType;
+ g_copyArgValue=&g_curArgTypeName;
+ g_argRoundCount=0;
+ BEGIN( CopyArgRound2 );
+ }
+ YY_BREAK
+case 11:
+*yy_cp = (yy_hold_char); /* undo effects of setting up defargsYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up defargsYYtext again */
+YY_RULE_SETUP
+#line 160 "defargs.l"
+{ // pointer to fixed size array
+ g_curArgTypeName+=defargsYYtext;
+ g_curArgTypeName+=g_curArgName;
+ //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
+ BEGIN( ReadFuncArgType );
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 166 "defargs.l"
+{ // redundant braces detected / remove them
+ int i=g_curArgTypeName.findRev('('),l=g_curArgTypeName.length();
+ if (i!=-1)
+ g_curArgTypeName=g_curArgTypeName.left(i)+
+ g_curArgTypeName.right(l-i-1);
+ g_curArgTypeName+=g_curArgName;
+ BEGIN( ReadFuncArgType );
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 174 "defargs.l"
+{ // handle operators in defargs
+ g_curArgTypeName+=defargsYYtext;
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 177 "defargs.l"
+{
+ if (YY_START==ReadFuncArgType)
+ {
+ g_curArgTypeName+=*defargsYYtext;
+ g_copyArgValue=&g_curArgTypeName;
+ }
+ else // YY_START==ReadFuncArgDef
+ {
+ g_curArgDefValue+=*defargsYYtext;
+ g_copyArgValue=&g_curArgDefValue;
+ }
+ g_readArgContext = YY_START;
+ if (*defargsYYtext=='(')
+ {
+ g_argRoundCount=0;
+ BEGIN( CopyArgRound );
+ }
+ else if (*defargsYYtext=='{')
+ {
+ g_argCurlyCount=0;
+ BEGIN( CopyArgCurly );
+ }
+ else // defargsYYtext=='<'
+ {
+ g_argSharpCount=0;
+ BEGIN( CopyArgSharp );
+ }
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 205 "defargs.l"
+{
+ g_argRoundCount++;
+ *g_copyArgValue += *defargsYYtext;
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 209 "defargs.l"
+{
+ *g_copyArgValue += defargsYYtext;
+ if (g_argRoundCount>0)
+ {
+ g_argRoundCount--;
+ }
+ else
+ {
+ if (YY_START==CopyArgRound2)
+ {
+ *g_copyArgValue+=" "+g_curArgName;
+ }
+ BEGIN( g_readArgContext );
+ }
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 224 "defargs.l"
+{
+ g_argSharpCount++;
+ *g_copyArgValue += *defargsYYtext;
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 228 "defargs.l"
+{
+ *g_copyArgValue += *defargsYYtext;
+ if (g_argSharpCount>0) g_argSharpCount--;
+ else BEGIN( g_readArgContext );
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 233 "defargs.l"
+{
+ g_argCurlyCount++;
+ *g_copyArgValue += *defargsYYtext;
+ }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 237 "defargs.l"
+{
+ *g_copyArgValue += *defargsYYtext;
+ if (g_argCurlyCount>0) g_argCurlyCount--;
+ else BEGIN( g_readArgContext );
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 242 "defargs.l"
+{
+ g_curArgDefValue+=defargsYYtext;
+ }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 245 "defargs.l"
+{
+ g_curArgDefValue+=*defargsYYtext;
+ BEGIN( ReadFuncArgDef );
+ }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 249 "defargs.l"
+{
+ BEGIN( ReadFuncArgDef );
+ }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 252 "defargs.l"
+{
+ g_lastDocContext=YY_START;
+ g_lastDocChar=*defargsYYtext;
+ QCString text=defargsYYtext;
+ if (text.find("//")!=-1)
+ BEGIN( ReadDocLine );
+ else
+ BEGIN( ReadDocBlock );
+ }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 261 "defargs.l"
+{
+ if (*defargsYYtext==')' && g_curArgTypeName.stripWhiteSpace().isEmpty())
+ {
+ g_curArgTypeName+=*defargsYYtext;
+ BEGIN(FuncQual);
+ }
+ else
+ {
+ g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);
+ g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();
+ //printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data());
+ int l=g_curArgTypeName.length();
+ if (l>0)
+ {
+ int i=l-1;
+ while (i>=0 && (isspace((uchar)g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--;
+ while (i>=0 && isId(g_curArgTypeName.at(i))) i--;
+ Argument *a = new Argument;
+ a->attrib = g_curArgAttrib.copy();
+ //printf("a->type=%s a->name=%s i=%d l=%d\n",
+ // a->type.data(),a->name.data(),i,l);
+ a->array.resize(0);
+ if (i==l-1 && g_curArgTypeName.at(i)==')') // function argument
+ {
+ int bi=g_curArgTypeName.find('(');
+ int fi=bi-1;
+ //printf("func arg fi=%d\n",fi);
+ while (fi>=0 && isId(g_curArgTypeName.at(fi))) fi--;
+ if (fi>=0)
+ {
+ a->type = g_curArgTypeName.left(fi+1);
+ a->name = g_curArgTypeName.mid(fi+1,bi-fi-1).stripWhiteSpace();
+ a->array = g_curArgTypeName.right(l-bi);
+ }
+ else
+ {
+ a->type = g_curArgTypeName;
+ }
+ }
+ else if (i>=0 && g_curArgTypeName.at(i)!=':')
+ { // type contains a name
+ a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1)).stripWhiteSpace();
+ a->name = g_curArgTypeName.right(l-i-1).stripWhiteSpace();
+
+ // if the type becomes a type specifier only then we make a mistake
+ // and need to correct it to avoid seeing a nameless parameter
+ // "struct A" as a parameter with type "struct" and name "A".
+ int sv=0;
+ if (a->type.left(6)=="const ") sv=6;
+ else if (a->type.left(9)=="volatile ") sv=9;
+
+ if (a->type.mid(sv)=="struct" ||
+ a->type.mid(sv)=="union" ||
+ a->type.mid(sv)=="class" ||
+ a->type.mid(sv)=="typename" ||
+ a->type=="const" ||
+ a->type=="volatile"
+ )
+ {
+ a->type = a->type + " " + a->name;
+ a->name.resize(0);
+ }
+ //printf(" --> a->type='%s'\n",a->type.data());
+ }
+ else // assume only the type was specified, try to determine name later
+ {
+ a->type = removeRedundantWhiteSpace(g_curArgTypeName);
+ }
+ a->array += removeRedundantWhiteSpace(g_curArgArray);
+ //printf("array=%s\n",a->array.data());
+ int alen = a->array.length();
+ if (alen>2 && a->array.at(0)=='(' &&
+ a->array.at(alen-1)==')') // fix-up for int *(a[10])
+ {
+ int i=a->array.find('[')-1;
+ a->array = a->array.mid(1,alen-2);
+ if (i>0 && a->name.isEmpty())
+ {
+ a->name = a->array.left(i).stripWhiteSpace();
+ a->array = a->array.mid(i);
+ }
+ }
+ a->defval = g_curArgDefValue.copy();
+ //printf("a->type=%s a->name=%s a->defval=\"%s\"\n",a->type.data(),a->name.data(),a->defval.data());
+ a->docs = g_curArgDocs.stripWhiteSpace();
+ //printf("Argument `%s' `%s' adding docs=`%s'\n",a->type.data(),a->name.data(),a->docs.data());
+ g_argList->append(a);
+ }
+ g_curArgAttrib.resize(0);
+ g_curArgTypeName.resize(0);
+ g_curArgDefValue.resize(0);
+ g_curArgArray.resize(0);
+ g_curArgDocs.resize(0);
+ if (*defargsYYtext==')')
+ {
+ BEGIN(FuncQual);
+ //printf(">>> end of argument list\n");
+ }
+ else
+ {
+ BEGIN( ReadFuncArgType );
+ }
+ }
+ }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 365 "defargs.l"
+{
+ QCString name=defargsYYtext; //resolveDefines(defargsYYtext);
+ if (YY_START==ReadFuncArgType && g_curArgArray=="[]") // Java style array
+ {
+ g_curArgTypeName+=" []";
+ g_curArgArray.resize(0);
+ }
+ //printf("resolveName `%s'->`%s'\n",defargsYYtext,name.data());
+ g_curArgTypeName+=name;
+ }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 375 "defargs.l"
+{
+ g_curArgTypeName+=*defargsYYtext;
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 379 "defargs.l"
+{
+ g_curArgDefValue+=defargsYYtext;
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 382 "defargs.l"
+{
+ g_curArgDefValue+=*defargsYYtext;
+ }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 385 "defargs.l"
+{
+ QCString name=defargsYYtext; //resolveDefines(defargsYYtext);
+ *g_copyArgValue+=name;
+ }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 389 "defargs.l"
+{
+ *g_copyArgValue += *defargsYYtext;
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 392 "defargs.l"
+{
+ g_argList->constSpecifier=TRUE;
+ }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 395 "defargs.l"
+{
+ g_argList->volatileSpecifier=TRUE;
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 398 "defargs.l"
+{
+ g_argList->pureSpecifier=TRUE;
+ }
+ YY_BREAK
+case 35:
+/* rule 35 can match eol */
+YY_RULE_SETUP
+#line 401 "defargs.l"
+{ // for functions returning a pointer to an array,
+ // i.e. ")[]" in "int (*f(int))[4]" with argsString="(int))[4]"
+ g_extraTypeChars=defargsYYtext;
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 405 "defargs.l"
+{
+ g_curArgDocs+=defargsYYtext;
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 408 "defargs.l"
+{
+ g_curArgDocs+=defargsYYtext;
+ }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 411 "defargs.l"
+{
+ if (g_lastDocChar!=0)
+ unput(g_lastDocChar);
+ BEGIN(g_lastDocContext);
+ }
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 416 "defargs.l"
+{
+ if (g_lastDocChar!=0)
+ unput(g_lastDocChar);
+ BEGIN(g_lastDocContext);
+ }
+ YY_BREAK
+case 40:
+/* rule 40 can match eol */
+YY_RULE_SETUP
+#line 421 "defargs.l"
+{
+ g_curArgDocs+=*defargsYYtext;
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 424 "defargs.l"
+{
+ g_curArgDocs+=*defargsYYtext;
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 427 "defargs.l"
+{
+ g_lastDocContext=YY_START;
+ g_lastDocChar=0;
+ if (defargsYYtext[1]=='/')
+ BEGIN( ReadDocLine );
+ else
+ BEGIN( ReadDocBlock );
+ }
+ YY_BREAK
+case 43:
+/* rule 43 can match eol */
+YY_RULE_SETUP
+#line 435 "defargs.l"
+
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 436 "defargs.l"
+
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 438 "defargs.l"
+ECHO;
+ YY_BREAK
+#line 1601 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(Start):
+ case YY_STATE_EOF(CopyArgString):
+ case YY_STATE_EOF(CopyArgRound):
+ case YY_STATE_EOF(CopyArgRound2):
+ case YY_STATE_EOF(CopyArgSharp):
+ case YY_STATE_EOF(CopyArgCurly):
+ case YY_STATE_EOF(ReadFuncArgType):
+ case YY_STATE_EOF(ReadFuncArgDef):
+ case YY_STATE_EOF(ReadFuncArgPtr):
+ case YY_STATE_EOF(FuncQual):
+ case YY_STATE_EOF(ReadDocBlock):
+ case YY_STATE_EOF(ReadDocLine):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed defargsYYin at a new source and called
+ * defargsYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = defargsYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( defargsYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * defargsYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of defargsYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ defargsYYrestart(defargsYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) defargsYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 152 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 152 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 151);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up defargsYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ defargsYYrestart(defargsYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( defargsYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve defargsYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void defargsYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ defargsYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ defargsYY_create_buffer(defargsYYin,YY_BUF_SIZE );
+ }
+
+ defargsYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ defargsYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void defargsYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * defargsYYpop_buffer_state();
+ * defargsYYpush_buffer_state(new_buffer);
+ */
+ defargsYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ defargsYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (defargsYYwrap()) processing, but the only time this flag
+ * is looked at is after defargsYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void defargsYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ defargsYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE defargsYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) defargsYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in defargsYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) defargsYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in defargsYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ defargsYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with defargsYY_create_buffer()
+ *
+ */
+ void defargsYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ defargsYYfree((void *) b->yy_ch_buf );
+
+ defargsYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a defargsYYrestart() or at EOF.
+ */
+ static void defargsYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ defargsYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then defargsYY_init_buffer was _probably_
+ * called from defargsYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void defargsYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ defargsYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void defargsYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ defargsYYensure_buffer_stack();
+
+ /* This block is copied from defargsYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from defargsYY_switch_to_buffer. */
+ defargsYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void defargsYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ defargsYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ defargsYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void defargsYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)defargsYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in defargsYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)defargsYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in defargsYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE defargsYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) defargsYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in defargsYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ defargsYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to defargsYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * defargsYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE defargsYY_scan_string (yyconst char * yystr )
+{
+
+ return defargsYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to defargsYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE defargsYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) defargsYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in defargsYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = defargsYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in defargsYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up defargsYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ defargsYYtext[defargsYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = defargsYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ defargsYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int defargsYYget_lineno (void)
+{
+
+ return defargsYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *defargsYYget_in (void)
+{
+ return defargsYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *defargsYYget_out (void)
+{
+ return defargsYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t defargsYYget_leng (void)
+{
+ return defargsYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *defargsYYget_text (void)
+{
+ return defargsYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void defargsYYset_lineno (int line_number )
+{
+
+ defargsYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see defargsYY_switch_to_buffer
+ */
+void defargsYYset_in (FILE * in_str )
+{
+ defargsYYin = in_str ;
+}
+
+void defargsYYset_out (FILE * out_str )
+{
+ defargsYYout = out_str ;
+}
+
+int defargsYYget_debug (void)
+{
+ return defargsYY_flex_debug;
+}
+
+void defargsYYset_debug (int bdebug )
+{
+ defargsYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from defargsYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ defargsYYin = stdin;
+ defargsYYout = stdout;
+#else
+ defargsYYin = (FILE *) 0;
+ defargsYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * defargsYYlex_init()
+ */
+ return 0;
+}
+
+/* defargsYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int defargsYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ defargsYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ defargsYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ defargsYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ defargsYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * defargsYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *defargsYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *defargsYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void defargsYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see defargsYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 438 "defargs.l"
+
+
+
+/* ----------------------------------------------------------------------------
+ */
+
+/*! Converts an argument string into an ArgumentList.
+ * \param argsString the list of Arguments.
+ * \param al a reference to resulting argument list pointer.
+ */
+
+void stringToArgumentList(const char *argsString,ArgumentList* al,QCString *extraTypeChars)
+{
+ if (al==0) return;
+ if (argsString==0) return;
+
+ g_copyArgValue=0;
+ g_curArgDocs.resize(0);
+ g_curArgAttrib.resize(0);
+ g_curArgArray.resize(0);
+ g_extraTypeChars.resize(0);
+ g_argRoundCount = 0;
+ g_argSharpCount = 0;
+ g_argCurlyCount = 0;
+ g_lastDocChar = 0;
+
+ g_inputString = argsString;
+ g_inputPosition = 0;
+ g_curArgTypeName.resize(0);
+ g_curArgDefValue.resize(0);
+ g_curArgName.resize(0);
+ g_argList = al;
+ defargsYYrestart( defargsYYin );
+ BEGIN( Start );
+ defargsYYlex();
+ if (extraTypeChars) *extraTypeChars=g_extraTypeChars;
+ //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data());
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void defargsYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
+
diff --git a/src/defargs.h b/src/defargs.h
new file mode 100644
index 0000000..6567aba
--- /dev/null
+++ b/src/defargs.h
@@ -0,0 +1,29 @@
+/******************************************************************************
+ *
+ * $Id: declinfo.h,v 1.1 1998/09/09 21:32:19 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DEFARGS_H
+#define DEFARGS_H
+
+#include "qtbc.h"
+#include <stdio.h>
+
+class ArgumentList;
+
+extern void stringToArgumentList(const char *argsString,ArgumentList* argList,
+ QCString *extraTypeChars=0);
+
+#endif
diff --git a/src/defargs.l b/src/defargs.l
new file mode 100644
index 0000000..86f6484
--- /dev/null
+++ b/src/defargs.l
@@ -0,0 +1,481 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/*! \file
+ * This scanner is used to convert a string into a list of function or
+ * template arguments. Each parsed argument results in a Argument struct,
+ * that is put into an ArgumentList in declaration order.
+ * Comment blocks for arguments can also be included in the string.
+ * The argument string does not contain new-lines (except inside any
+ * comment blocks).
+ * An Argument consists of the string fields:
+ * type,name,default value, and documentation
+ * The Argument list as a whole can be pure, constant or volatile.
+ *
+ * Examples of input strings are:
+ * \code
+ * "(int a,int b) const"
+ * "(const char *s="hello world",int=5) = 0"
+ * "<class T,class N>"
+ * "(char c,const char)"
+ * \endcode
+ *
+ * Note: It is not always possible to distinguish between the name and
+ * type of an argument. In case of doubt the name is added to the
+ * type, and the matchArgumentList in util.cpp is be used to
+ * further determine the correct separation.
+ */
+
+%{
+
+/*
+ * includes
+ */
+#include "qtbc.h"
+#include <stdio.h>
+//#include <iostream.h>
+#include <assert.h>
+#include <ctype.h>
+#include <qregexp.h>
+
+#include "defargs.h"
+#include "entry.h"
+#include "util.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ * state variables
+ */
+static const char *g_inputString;
+static int g_inputPosition;
+static ArgumentList *g_argList;
+static QCString *g_copyArgValue;
+static QCString g_curArgTypeName;
+static QCString g_curArgDefValue;
+static QCString g_curArgName;
+static QCString g_curArgDocs;
+static QCString g_curArgAttrib;
+static QCString g_curArgArray;
+static QCString g_extraTypeChars;
+static int g_argRoundCount;
+static int g_argSharpCount;
+static int g_argCurlyCount;
+static int g_readArgContext;
+static int g_lastDocContext;
+static int g_lastDocChar;
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+%}
+
+B [ \t]
+ID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
+
+%option noyywrap
+
+%x Start
+%x CopyArgString
+%x CopyArgRound
+%x CopyArgRound2
+%x CopyArgSharp
+%x CopyArgCurly
+%x ReadFuncArgType
+%x ReadFuncArgDef
+%x ReadFuncArgPtr
+%x FuncQual
+%x ReadDocBlock
+%x ReadDocLine
+
+
+%%
+
+<Start>[<(] { BEGIN(ReadFuncArgType); }
+
+<ReadFuncArgType>{B}* {
+ g_curArgTypeName+=" ";
+ }
+<ReadFuncArgType>"["[^\]]*"]" {
+ if (g_curArgTypeName.stripWhiteSpace().isEmpty())
+ {
+ g_curArgAttrib=yytext; // for M$-IDL
+ }
+ else // array type
+ {
+ g_curArgArray+=yytext;
+ }
+ }
+<ReadFuncArgDef>"'"\\[0-7]{1,3}"'" { g_curArgDefValue+=yytext; }
+<ReadFuncArgDef>"'"\\."'" { g_curArgDefValue+=yytext; }
+<ReadFuncArgDef>"'"."'" { g_curArgDefValue+=yytext; }
+<ReadFuncArgDef>\" {
+ g_curArgDefValue+=*yytext;
+ BEGIN( CopyArgString );
+ }
+<ReadFuncArgType>"("([^:)]+{B}*"::")*{B}*[&*\^]+{B}*/{ID} {
+ // function pointer as argument
+ g_curArgTypeName+=yytext;
+ //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
+ BEGIN( ReadFuncArgPtr );
+ }
+<ReadFuncArgPtr>{ID} {
+ g_curArgName=yytext;
+ }
+<ReadFuncArgPtr>")"{B}*"(" { // function pointer
+ g_curArgTypeName+=yytext;
+ //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
+ g_readArgContext = ReadFuncArgType;
+ g_copyArgValue=&g_curArgTypeName;
+ g_argRoundCount=0;
+ BEGIN( CopyArgRound2 );
+ }
+<ReadFuncArgPtr>")"/{B}*"[" { // pointer to fixed size array
+ g_curArgTypeName+=yytext;
+ g_curArgTypeName+=g_curArgName;
+ //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
+ BEGIN( ReadFuncArgType );
+ }
+<ReadFuncArgPtr>")" { // redundant braces detected / remove them
+ int i=g_curArgTypeName.findRev('('),l=g_curArgTypeName.length();
+ if (i!=-1)
+ g_curArgTypeName=g_curArgTypeName.left(i)+
+ g_curArgTypeName.right(l-i-1);
+ g_curArgTypeName+=g_curArgName;
+ BEGIN( ReadFuncArgType );
+ }
+<ReadFuncArgType>"<="|">="|"->"|">>"|"<<" { // handle operators in defargs
+ g_curArgTypeName+=yytext;
+ }
+<ReadFuncArgType,ReadFuncArgDef>[({<] {
+ if (YY_START==ReadFuncArgType)
+ {
+ g_curArgTypeName+=*yytext;
+ g_copyArgValue=&g_curArgTypeName;
+ }
+ else // YY_START==ReadFuncArgDef
+ {
+ g_curArgDefValue+=*yytext;
+ g_copyArgValue=&g_curArgDefValue;
+ }
+ g_readArgContext = YY_START;
+ if (*yytext=='(')
+ {
+ g_argRoundCount=0;
+ BEGIN( CopyArgRound );
+ }
+ else if (*yytext=='{')
+ {
+ g_argCurlyCount=0;
+ BEGIN( CopyArgCurly );
+ }
+ else // yytext=='<'
+ {
+ g_argSharpCount=0;
+ BEGIN( CopyArgSharp );
+ }
+ }
+<CopyArgRound,CopyArgRound2>"(" {
+ g_argRoundCount++;
+ *g_copyArgValue += *yytext;
+ }
+<CopyArgRound,CopyArgRound2>")"({B}*{ID})* {
+ *g_copyArgValue += yytext;
+ if (g_argRoundCount>0)
+ {
+ g_argRoundCount--;
+ }
+ else
+ {
+ if (YY_START==CopyArgRound2)
+ {
+ *g_copyArgValue+=" "+g_curArgName;
+ }
+ BEGIN( g_readArgContext );
+ }
+ }
+<CopyArgSharp>"<" {
+ g_argSharpCount++;
+ *g_copyArgValue += *yytext;
+ }
+<CopyArgSharp>">" {
+ *g_copyArgValue += *yytext;
+ if (g_argSharpCount>0) g_argSharpCount--;
+ else BEGIN( g_readArgContext );
+ }
+<CopyArgCurly>"{" {
+ g_argCurlyCount++;
+ *g_copyArgValue += *yytext;
+ }
+<CopyArgSharp>"}" {
+ *g_copyArgValue += *yytext;
+ if (g_argCurlyCount>0) g_argCurlyCount--;
+ else BEGIN( g_readArgContext );
+ }
+<CopyArgString>\\. {
+ g_curArgDefValue+=yytext;
+ }
+<CopyArgString>\" {
+ g_curArgDefValue+=*yytext;
+ BEGIN( ReadFuncArgDef );
+ }
+<ReadFuncArgType>"=" {
+ BEGIN( ReadFuncArgDef );
+ }
+<ReadFuncArgType,ReadFuncArgDef>[,)>]{B}*("/*"[*!]|"//"[/!])"<" {
+ g_lastDocContext=YY_START;
+ g_lastDocChar=*yytext;
+ QCString text=yytext;
+ if (text.find("//")!=-1)
+ BEGIN( ReadDocLine );
+ else
+ BEGIN( ReadDocBlock );
+ }
+<ReadFuncArgType,ReadFuncArgDef>[,)>] {
+ if (*yytext==')' && g_curArgTypeName.stripWhiteSpace().isEmpty())
+ {
+ g_curArgTypeName+=*yytext;
+ BEGIN(FuncQual);
+ }
+ else
+ {
+ g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);
+ g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();
+ //printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data());
+ int l=g_curArgTypeName.length();
+ if (l>0)
+ {
+ int i=l-1;
+ while (i>=0 && (isspace((uchar)g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--;
+ while (i>=0 && isId(g_curArgTypeName.at(i))) i--;
+ Argument *a = new Argument;
+ a->attrib = g_curArgAttrib.copy();
+ //printf("a->type=%s a->name=%s i=%d l=%d\n",
+ // a->type.data(),a->name.data(),i,l);
+ a->array.resize(0);
+ if (i==l-1 && g_curArgTypeName.at(i)==')') // function argument
+ {
+ int bi=g_curArgTypeName.find('(');
+ int fi=bi-1;
+ //printf("func arg fi=%d\n",fi);
+ while (fi>=0 && isId(g_curArgTypeName.at(fi))) fi--;
+ if (fi>=0)
+ {
+ a->type = g_curArgTypeName.left(fi+1);
+ a->name = g_curArgTypeName.mid(fi+1,bi-fi-1).stripWhiteSpace();
+ a->array = g_curArgTypeName.right(l-bi);
+ }
+ else
+ {
+ a->type = g_curArgTypeName;
+ }
+ }
+ else if (i>=0 && g_curArgTypeName.at(i)!=':')
+ { // type contains a name
+ a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1)).stripWhiteSpace();
+ a->name = g_curArgTypeName.right(l-i-1).stripWhiteSpace();
+
+ // if the type becomes a type specifier only then we make a mistake
+ // and need to correct it to avoid seeing a nameless parameter
+ // "struct A" as a parameter with type "struct" and name "A".
+ int sv=0;
+ if (a->type.left(6)=="const ") sv=6;
+ else if (a->type.left(9)=="volatile ") sv=9;
+
+ if (a->type.mid(sv)=="struct" ||
+ a->type.mid(sv)=="union" ||
+ a->type.mid(sv)=="class" ||
+ a->type.mid(sv)=="typename" ||
+ a->type=="const" ||
+ a->type=="volatile"
+ )
+ {
+ a->type = a->type + " " + a->name;
+ a->name.resize(0);
+ }
+ //printf(" --> a->type='%s'\n",a->type.data());
+ }
+ else // assume only the type was specified, try to determine name later
+ {
+ a->type = removeRedundantWhiteSpace(g_curArgTypeName);
+ }
+ a->array += removeRedundantWhiteSpace(g_curArgArray);
+ //printf("array=%s\n",a->array.data());
+ int alen = a->array.length();
+ if (alen>2 && a->array.at(0)=='(' &&
+ a->array.at(alen-1)==')') // fix-up for int *(a[10])
+ {
+ int i=a->array.find('[')-1;
+ a->array = a->array.mid(1,alen-2);
+ if (i>0 && a->name.isEmpty())
+ {
+ a->name = a->array.left(i).stripWhiteSpace();
+ a->array = a->array.mid(i);
+ }
+ }
+ a->defval = g_curArgDefValue.copy();
+ //printf("a->type=%s a->name=%s a->defval=\"%s\"\n",a->type.data(),a->name.data(),a->defval.data());
+ a->docs = g_curArgDocs.stripWhiteSpace();
+ //printf("Argument `%s' `%s' adding docs=`%s'\n",a->type.data(),a->name.data(),a->docs.data());
+ g_argList->append(a);
+ }
+ g_curArgAttrib.resize(0);
+ g_curArgTypeName.resize(0);
+ g_curArgDefValue.resize(0);
+ g_curArgArray.resize(0);
+ g_curArgDocs.resize(0);
+ if (*yytext==')')
+ {
+ BEGIN(FuncQual);
+ //printf(">>> end of argument list\n");
+ }
+ else
+ {
+ BEGIN( ReadFuncArgType );
+ }
+ }
+ }
+<ReadFuncArgType,ReadFuncArgPtr>{ID} {
+ QCString name=yytext; //resolveDefines(yytext);
+ if (YY_START==ReadFuncArgType && g_curArgArray=="[]") // Java style array
+ {
+ g_curArgTypeName+=" []";
+ g_curArgArray.resize(0);
+ }
+ //printf("resolveName `%s'->`%s'\n",yytext,name.data());
+ g_curArgTypeName+=name;
+ }
+<ReadFuncArgType,ReadFuncArgPtr>. {
+ g_curArgTypeName+=*yytext;
+ }
+
+<ReadFuncArgDef,CopyArgString>"->"|">="|">>" {
+ g_curArgDefValue+=yytext;
+ }
+<ReadFuncArgDef,CopyArgString>. {
+ g_curArgDefValue+=*yytext;
+ }
+<CopyArgRound,CopyArgRound2,CopyArgSharp,CopyArgCurly>{ID} {
+ QCString name=yytext; //resolveDefines(yytext);
+ *g_copyArgValue+=name;
+ }
+<CopyArgRound,CopyArgRound2,CopyArgSharp,CopyArgCurly>. {
+ *g_copyArgValue += *yytext;
+ }
+<FuncQual>"const" {
+ g_argList->constSpecifier=TRUE;
+ }
+<FuncQual>"volatile" {
+ g_argList->volatileSpecifier=TRUE;
+ }
+<FuncQual>"="{B}*"0" {
+ g_argList->pureSpecifier=TRUE;
+ }
+<FuncQual>")"{B}*"["[^]]*"]" { // for functions returning a pointer to an array,
+ // i.e. ")[]" in "int (*f(int))[4]" with argsString="(int))[4]"
+ g_extraTypeChars=yytext;
+ }
+<ReadDocBlock>[^\*\n]+ {
+ g_curArgDocs+=yytext;
+ }
+<ReadDocLine>[^\n]+ {
+ g_curArgDocs+=yytext;
+ }
+<ReadDocBlock>"*/" {
+ if (g_lastDocChar!=0)
+ unput(g_lastDocChar);
+ BEGIN(g_lastDocContext);
+ }
+<ReadDocLine>\n {
+ if (g_lastDocChar!=0)
+ unput(g_lastDocChar);
+ BEGIN(g_lastDocContext);
+ }
+<ReadDocBlock>\n {
+ g_curArgDocs+=*yytext;
+ }
+<ReadDocBlock>. {
+ g_curArgDocs+=*yytext;
+ }
+<*>("/*"[*!]|"//"[/!])("<"?) {
+ g_lastDocContext=YY_START;
+ g_lastDocChar=0;
+ if (yytext[1]=='/')
+ BEGIN( ReadDocLine );
+ else
+ BEGIN( ReadDocBlock );
+ }
+<*>\n
+<*>.
+
+%%
+
+/* ----------------------------------------------------------------------------
+ */
+
+/*! Converts an argument string into an ArgumentList.
+ * \param argsString the list of Arguments.
+ * \param al a reference to resulting argument list pointer.
+ */
+
+void stringToArgumentList(const char *argsString,ArgumentList* al,QCString *extraTypeChars)
+{
+ if (al==0) return;
+ if (argsString==0) return;
+
+ g_copyArgValue=0;
+ g_curArgDocs.resize(0);
+ g_curArgAttrib.resize(0);
+ g_curArgArray.resize(0);
+ g_extraTypeChars.resize(0);
+ g_argRoundCount = 0;
+ g_argSharpCount = 0;
+ g_argCurlyCount = 0;
+ g_lastDocChar = 0;
+
+ g_inputString = argsString;
+ g_inputPosition = 0;
+ g_curArgTypeName.resize(0);
+ g_curArgDefValue.resize(0);
+ g_curArgName.resize(0);
+ g_argList = al;
+ defargsYYrestart( defargsYYin );
+ BEGIN( Start );
+ defargsYYlex();
+ if (extraTypeChars) *extraTypeChars=g_extraTypeChars;
+ //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data());
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void defargsYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
diff --git a/src/defgen.cpp b/src/defgen.cpp
new file mode 100644
index 0000000..9d796fd
--- /dev/null
+++ b/src/defgen.cpp
@@ -0,0 +1,630 @@
+/******************************************************************************
+ *
+ * $Id: def.cpp,v 1.2 2001/01/01 10:15:18 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "qtbc.h"
+#include "defgen.h"
+#include "doxygen.h"
+#include "message.h"
+#include "config.h"
+#include "classlist.h"
+#include "util.h"
+#include "defargs.h"
+#include "outputgen.h"
+#include "dot.h"
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qtextstream.h>
+
+#define DEF_DB(x)
+
+inline void writeDEFString(FTextStream &t,const char *s)
+{
+ const char* p=s;
+ char c;
+
+ t << '\'';
+ while ((c = *(p++)))
+ {
+ if (c == '\'')
+ t << '\\';
+ t << c;
+ }
+ t << '\'';
+}
+
+void generateDEFForMember(MemberDef *md,
+ FTextStream &t,
+ Definition *def,
+ const char* Prefix)
+{
+ QCString memPrefix;
+
+ // + declaration
+ // - reimplements
+ // - reimplementedBy
+ // - exceptions
+ // - const/volatile specifiers
+ // - examples
+ // + source definition
+ // - source references
+ // - source referenced by
+ // - include code
+
+ if (md->memberType()==MemberDef::EnumValue) return;
+
+ QCString scopeName;
+ if (md->getClassDef())
+ scopeName=md->getClassDef()->name();
+ else if (md->getNamespaceDef())
+ scopeName=md->getNamespaceDef()->name();
+
+ t << " " << Prefix << "-member = {" << endl;
+ memPrefix = " ";
+ memPrefix.append( Prefix );
+ memPrefix.append( "-mem-" );
+
+ QCString memType;
+ bool isFunc=FALSE;
+ switch (md->memberType())
+ {
+ case MemberDef::Define: memType="define"; break;
+ case MemberDef::EnumValue: ASSERT(0); break;
+ case MemberDef::Property: memType="property"; break;
+ case MemberDef::Event: memType="event"; break;
+ case MemberDef::Variable: memType="variable"; break;
+ case MemberDef::Typedef: memType="typedef"; break;
+ case MemberDef::Enumeration: memType="enum"; break;
+ case MemberDef::Function: memType="function"; isFunc=TRUE; break;
+ case MemberDef::Signal: memType="signal"; isFunc=TRUE; break;
+ case MemberDef::Friend: memType="friend"; isFunc=TRUE; break;
+ case MemberDef::DCOP: memType="dcop"; isFunc=TRUE; break;
+ case MemberDef::Slot: memType="slot"; isFunc=TRUE; break;
+ }
+
+ t << memPrefix << "kind = '" << memType << "';" << endl;
+ t << memPrefix << "id = '"
+ << md->getOutputFileBase() << "_1" << md->anchor()
+ << "';" << endl;
+
+ t << memPrefix << "virt = ";
+ switch (md->virtualness())
+ {
+ case Normal: t << "normal;" << endl; break;
+ case Virtual: t << "virtual;" << endl; break;
+ case Pure: t << "pure-virtual;" << endl; break;
+ default: ASSERT(0);
+ }
+
+ t << memPrefix << "prot = ";
+ switch(md->protection())
+ {
+ case Public: t << "public;" << endl; break;
+ case Protected: t << "protected;" << endl; break;
+ case Private: t << "private;" << endl; break;
+ case Package: t << "package;" << endl; break;
+ }
+
+ if (md->memberType()!=MemberDef::Define &&
+ md->memberType()!=MemberDef::Enumeration
+ )
+ {
+ QCString typeStr = replaceAnonymousScopes(md->typeString());
+ t << memPrefix << "type = <<_EnD_oF_dEf_TeXt_" << endl << typeStr << endl
+ << "_EnD_oF_dEf_TeXt_;" << endl;
+ }
+
+ t << memPrefix << "name = '" << md->name() << "';" << endl;
+
+ if (isFunc) //function
+ {
+ ArgumentList *declAl = new ArgumentList;
+ LockingPtr<ArgumentList> defAl = md->argumentList();
+ stringToArgumentList(md->argsString(),declAl);
+ QCString fcnPrefix = " " + memPrefix + "param-";
+
+ if (declAl->count()>0)
+ {
+ ArgumentListIterator declAli(*declAl);
+ ArgumentListIterator defAli(*defAl);
+ Argument *a;
+ for (declAli.toFirst();(a=declAli.current());++declAli)
+ {
+ Argument *defArg = defAli.current();
+ t << memPrefix << "param = {" << endl;
+ if (!a->attrib.isEmpty())
+ {
+ t << fcnPrefix << "attributes = ";
+ writeDEFString(t,a->attrib);
+ t << ';' << endl;
+ }
+ if (!a->type.isEmpty())
+ {
+ t << fcnPrefix << "type = <<_EnD_oF_dEf_TeXt_" << endl
+ << a->type << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+ }
+ if (!a->name.isEmpty())
+ {
+ t << fcnPrefix << "declname = ";
+ writeDEFString(t,a->name);
+ t << ';' << endl;
+ }
+ if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
+ {
+ t << fcnPrefix << "defname = ";
+ writeDEFString(t,defArg->name);
+ t << ';' << endl;
+ }
+ if (!a->array.isEmpty())
+ {
+ t << fcnPrefix << "array = ";
+ writeDEFString(t,a->array);
+ t << ';' << endl;
+ }
+ if (!a->defval.isEmpty())
+ {
+ t << fcnPrefix << "defval = <<_EnD_oF_dEf_TeXt_" << endl
+ << a->defval << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+ }
+ if (defArg) ++defAli;
+ t << " }; /*" << fcnPrefix << "-param */" << endl;
+ }
+ }
+ delete declAl;
+ }
+ else if ( md->memberType()==MemberDef::Define
+ && md->argsString()!=0)
+ {
+ ArgumentListIterator ali(*md->argumentList());
+ Argument *a;
+ QCString defPrefix = " " + memPrefix + "def-";
+
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ t << memPrefix << "param = {" << endl;
+ t << defPrefix << "name = '" << a->type << "';" << endl;
+ t << " }; /*" << defPrefix << "-param */" << endl;
+ }
+ }
+
+ if (!md->initializer().isEmpty())
+ {
+ t << memPrefix << "initializer = <<_EnD_oF_dEf_TeXt_" << endl
+ << md->initializer() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+ }
+ // TODO: exceptions, const volatile
+ if (md->memberType()==MemberDef::Enumeration) // enum
+ {
+ LockingPtr<MemberList> enumList = md->enumFieldList();
+ if (enumList!=0)
+ {
+ MemberListIterator emli(*enumList);
+ MemberDef *emd;
+ for (emli.toFirst();(emd=emli.current());++emli)
+ {
+ t << memPrefix << "enum = { enum-name = " << emd->name() << ';';
+ if (!emd->initializer().isEmpty())
+ {
+ t << " enum-value = ";
+ writeDEFString(t,emd->initializer());
+ t << ';';
+ }
+ t << " };" << endl;
+ }
+ }
+ }
+
+ t << memPrefix << "desc-file = '" << md->getDefFileName() << "';" << endl;
+ t << memPrefix << "desc-line = '" << md->getDefLine() << "';" << endl;
+ t << memPrefix << "briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
+ << md->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+ t << memPrefix << "documentation = <<_EnD_oF_dEf_TeXt_" << endl
+ << md->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+
+ //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
+
+ LockingPtr<MemberSDict> mdict = md->getReferencesMembers();
+ if (!mdict.isNull())
+ {
+ MemberSDict::Iterator mdi(*mdict);
+ MemberDef *rmd;
+ QCString refPrefix = " " + memPrefix + "ref-";
+
+ for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ {
+ if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
+ {
+ t << memPrefix << "referenceto = {" << endl;
+ t << refPrefix << "id = '"
+ << rmd->getBodyDef()->getOutputFileBase()
+ << "_1" // encoded `:' character (see util.cpp:convertNameToFile)
+ << rmd->anchor() << "';" << endl;
+
+ t << refPrefix << "line = '"
+ << rmd->getStartBodyLine() << "';" << endl;
+
+ QCString scope = rmd->getScopeString();
+ QCString name = rmd->name();
+ if (!scope.isEmpty() && scope!=def->name())
+ {
+ name.prepend(scope+"::");
+ }
+
+ t << refPrefix << "name = ";
+ writeDEFString(t,name);
+ t << ';' << endl << " };" << endl;
+ }
+ } /* for (mdi.toFirst...) */
+ }
+ mdict = md->getReferencedByMembers();
+ if (!mdict.isNull())
+ {
+ MemberSDict::Iterator mdi(*mdict);
+ MemberDef *rmd;
+ QCString refPrefix = " " + memPrefix + "ref-";
+
+ for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ {
+ if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
+ {
+ t << memPrefix << "referenceby = {" << endl;
+ t << refPrefix << "id = '"
+ << rmd->getBodyDef()->getOutputFileBase()
+ << "_1" // encoded `:' character (see util.cpp:convertNameToFile)
+ << rmd->anchor() << "';" << endl;
+
+ t << refPrefix << "line = '"
+ << rmd->getStartBodyLine() << "';" << endl;
+
+ QCString scope = rmd->getScopeString();
+ QCString name = rmd->name();
+ if (!scope.isEmpty() && scope!=def->name())
+ {
+ name.prepend(scope+"::");
+ }
+
+ t << refPrefix << "name = ";
+ writeDEFString(t,name);
+ t << ';' << endl << " };" << endl;
+ }
+ } /* for (mdi.toFirst...) */
+ }
+
+ t << " }; /* " << Prefix << "-member */" << endl;
+}
+
+
+void generateDEFClassSection(ClassDef *cd,
+ FTextStream &t,
+ MemberList *ml,
+ const char *kind)
+{
+ if (cd && ml && ml->count()>0)
+ {
+ t << " cp-section = {" << endl;
+ t << " sec-kind = '" << kind << "';" << endl;
+
+ MemberListIterator mli(*ml);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ generateDEFForMember(md,t,cd,"sec");
+ }
+ t << " }; /* cp-section */" << endl;
+ }
+}
+
+void generateDEFForClass(ClassDef *cd,FTextStream &t)
+{
+ // + brief description
+ // + detailed description
+ // - template arguments
+ // - include files
+ // + inheritance diagram
+ // + list of direct super classes
+ // + list of direct sub classes
+ // + collaboration diagram
+ // - list of all members
+ // + user defined member sections
+ // + standard member sections
+ // + detailed member documentation
+ // - examples
+
+ if (cd->isReference()) return; // skip external references.
+ if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
+ if (cd->templateMaster()!=0) return; // skip generated template instances.
+
+ t << cd->compoundTypeString() << " = {" << endl;
+ t << " cp-id = '" << cd->getOutputFileBase() << "';" << endl;
+ t << " cp-name = '" << cd->name() << "';" << endl;
+
+ if (cd->baseClasses())
+ {
+ BaseClassListIterator bcli(*cd->baseClasses());
+ BaseClassDef *bcd;
+ for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ {
+ t << " cp-ref = {" << endl << " ref-type = base;" << endl;
+ t << " ref-id = '"
+ << bcd->classDef->getOutputFileBase() << "';" << endl;
+ t << " ref-prot = ";
+ switch (bcd->prot)
+ {
+ case Public: t << "public;" << endl; break;
+ case Package: // package scope is not possible
+ case Protected: t << "protected;" << endl; break;
+ case Private: t << "private;" << endl; break;
+ }
+ t << " ref-virt = ";
+ switch(bcd->virt)
+ {
+ case Normal: t << "non-virtual;"; break;
+ case Virtual: t << "virtual;"; break;
+ case Pure: t << "pure-virtual;"; break;
+ }
+ t << endl << " };" << endl;
+ }
+ }
+
+ if (cd->subClasses())
+ {
+ BaseClassListIterator bcli(*cd->subClasses());
+ BaseClassDef *bcd;
+ for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ {
+ t << " cp-ref = {" << endl << " ref-type = derived;" << endl;
+ t << " ref-id = '"
+ << bcd->classDef->getOutputFileBase() << "';" << endl;
+ t << " ref-prot = ";
+ switch (bcd->prot)
+ {
+ case Public: t << "public;" << endl; break;
+ case Package: // packet scope is not possible!
+ case Protected: t << "protected;" << endl; break;
+ case Private: t << "private;" << endl; break;
+ }
+ t << " ref-virt = ";
+ switch(bcd->virt)
+ {
+ case Normal: t << "non-virtual;"; break;
+ case Virtual: t << "virtual;"; break;
+ case Pure: t << "pure-virtual;"; break;
+ }
+ t << endl << " };" << endl;
+ }
+ }
+
+ int numMembers = 0;
+ QListIterator<MemberList> mli(cd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberList::detailedLists)==0)
+ {
+ numMembers+=ml->count();
+ }
+ }
+ if (numMembers>0)
+ {
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubTypes),"public-type");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubMethods),"public-func");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubAttribs),"public-attrib");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubSlots),"public-slot");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::signals),"signal");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::dcopMethods),"dcop-func");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::properties),"property");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubStaticMethods),"public-static-func");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubStaticAttribs),"public-static-attrib");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proTypes),"protected-type");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proMethods),"protected-func");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proAttribs),"protected-attrib");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proSlots),"protected-slot");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proStaticMethods),"protected-static-func");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proStaticAttribs),"protected-static-attrib");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priTypes),"private-type");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priMethods),"private-func");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priAttribs),"private-attrib");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priSlots),"private-slot");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priStaticMethods),"private-static-func");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priStaticAttribs),"private-static-attrib");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::friends),"signal");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberList::related),"related");
+ }
+
+ t << " cp-filename = '" << cd->getDefFileName() << "';" << endl;
+ t << " cp-fileline = '" << cd->getDefLine() << "';" << endl;
+ t << " cp-briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
+ << cd->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+
+ t << " cp-documentation = <<_EnD_oF_dEf_TeXt_" << endl
+ << cd->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+
+ DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
+ if (!inheritanceGraph.isTrivial())
+ {
+ t << " cp-inheritancegraph = <<_EnD_oF_dEf_TeXt_" << endl;
+ inheritanceGraph.writeDEF(t);
+ t << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+ }
+ DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
+ if (!collaborationGraph.isTrivial())
+ {
+ t << " cp-collaborationgraph = <<_EnD_oF_dEf_TeXt_" << endl;
+ collaborationGraph.writeDEF(t);
+ t << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+ }
+ t << "}; /* " << cd->compoundTypeString() << " */" << endl;
+}
+
+void generateDEFSection(Definition *d,
+ FTextStream &t,
+ MemberList *ml,
+ const char *kind)
+{
+ if (ml && ml->count()>0)
+ {
+ t << " " << kind << " = {" << endl;
+ MemberListIterator mli(*ml);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ generateDEFForMember(md,t,d,kind);
+ }
+ t << " };" << endl;
+ }
+}
+
+void generateDEFForNamespace(NamespaceDef *nd,FTextStream &t)
+{
+ if (nd->isReference()) return; // skip external references
+ t << " namespace = {" << endl;
+ t << " ns-id = '" << nd->getOutputFileBase() << "';" << endl;
+ t << " ns-name = ";
+ writeDEFString(t,nd->name());
+ t << ';' << endl;
+
+ generateDEFSection(nd,t,nd->getMemberList(MemberList::decDefineMembers),"define");
+ generateDEFSection(nd,t,nd->getMemberList(MemberList::decProtoMembers),"prototype");
+ generateDEFSection(nd,t,nd->getMemberList(MemberList::decTypedefMembers),"typedef");
+ generateDEFSection(nd,t,nd->getMemberList(MemberList::decEnumMembers),"enum");
+ generateDEFSection(nd,t,nd->getMemberList(MemberList::decFuncMembers),"func");
+ generateDEFSection(nd,t,nd->getMemberList(MemberList::decVarMembers),"var");
+
+ t << " ns-filename = '" << nd->getDefFileName() << "';" << endl;
+ t << " ns-fileline = '" << nd->getDefLine() << "';" << endl;
+ t << " ns-briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
+ << nd->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+
+ t << " ns-documentation = <<_EnD_oF_dEf_TeXt_" << endl
+ << nd->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+ t << " };" << endl;
+}
+
+void generateDEFForFile(FileDef *fd,FTextStream &t)
+{
+ if (fd->isReference()) return; // skip external references
+
+ t << "file = {" << endl;
+ t << " file-id = '" << fd->getOutputFileBase() << "';" << endl;
+ t << " file-name = ";
+ writeDEFString(t,fd->name());
+ t << ';' << endl;
+
+ generateDEFSection(fd,t,fd->getMemberList(MemberList::decDefineMembers),"define");
+ generateDEFSection(fd,t,fd->getMemberList(MemberList::decProtoMembers),"prototype");
+ generateDEFSection(fd,t,fd->getMemberList(MemberList::decTypedefMembers),"typedef");
+ generateDEFSection(fd,t,fd->getMemberList(MemberList::decEnumMembers),"enum");
+ generateDEFSection(fd,t,fd->getMemberList(MemberList::decFuncMembers),"func");
+ generateDEFSection(fd,t,fd->getMemberList(MemberList::decVarMembers),"var");
+
+ t << " file-full-name = '" << fd->getDefFileName() << "';" << endl;
+ t << " file-first-line = '" << fd->getDefLine() << "';" << endl;
+
+ t << " file-briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
+ << fd->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+
+ t << " file-documentation = <<_EnD_oF_dEf_TeXt_" << endl
+ << fd->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
+
+ t << "}; /* file */" << endl;
+}
+
+
+void generateDEF()
+{
+ QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
+ if (outputDirectory.isEmpty())
+ {
+ outputDirectory=QDir::currentDirPath();
+ }
+ else
+ {
+ QDir dir(outputDirectory);
+ if (!dir.exists())
+ {
+ dir.setPath(QDir::currentDirPath());
+ if (!dir.mkdir(outputDirectory))
+ {
+ err("error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
+ "exist and cannot be created\n",outputDirectory.data());
+ exit(1);
+ }
+ else if (!Config_getBool("QUIET"))
+ {
+ err("notice: Output directory `%s' does not exist. "
+ "I have created it for you.\n", outputDirectory.data());
+ }
+ dir.cd(outputDirectory);
+ }
+ outputDirectory=dir.absPath();
+ }
+
+ QDir dir(outputDirectory);
+ if (!dir.exists())
+ {
+ dir.setPath(QDir::currentDirPath());
+ if (!dir.mkdir(outputDirectory))
+ {
+ err("Cannot create directory %s\n",outputDirectory.data());
+ return;
+ }
+ }
+ QDir defDir(outputDirectory+"/def");
+ if (!defDir.exists() && !defDir.mkdir(outputDirectory+"/def"))
+ {
+ err("Could not create def directory in %s\n",outputDirectory.data());
+ return;
+ }
+
+ QCString fileName=outputDirectory+"/def/doxygen.def";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ t << "AutoGen Definitions dummy;" << endl;
+
+ if (Doxygen::classSDict->count()+Doxygen::inputNameList->count()>0)
+ {
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ generateDEFForClass(cd,t);
+ }
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ generateDEFForFile(fd,t);
+ }
+ }
+ }
+ else
+ {
+ t << "dummy_value = true;" << endl;
+ }
+}
diff --git a/src/defgen.h b/src/defgen.h
new file mode 100644
index 0000000..120e8b9
--- /dev/null
+++ b/src/defgen.h
@@ -0,0 +1,20 @@
+/******************************************************************************
+ *
+ * $Id: defgen.h,v 1.2 2001/01/01 10:15:18 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef DEFGEN_H
+#define DEFGEN_H
+
+void generateDEF();
+
+#endif
diff --git a/src/define.cpp b/src/define.cpp
new file mode 100644
index 0000000..3c51d5d
--- /dev/null
+++ b/src/define.cpp
@@ -0,0 +1,52 @@
+/******************************************************************************
+ *
+ * $Id: define.cpp,v 1.7 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "define.h"
+#include "config.h"
+
+Define::Define()
+{
+ fileDef=0;
+ lineNr=1;
+ nargs=-1;
+ undef=FALSE;
+ varArgs=FALSE;
+ isPredefined=FALSE;
+ nonRecursive=FALSE;
+}
+
+Define::Define(const Define &d)
+ : name(d.name),definition(d.definition),fileName(d.fileName)
+{
+ //name=d.name; definition=d.definition; fileName=d.fileName;
+ lineNr=d.lineNr;
+ nargs=d.nargs;
+ undef=d.undef;
+ varArgs=d.varArgs;
+ isPredefined=d.isPredefined;
+ nonRecursive=d.nonRecursive;
+ fileDef=0;
+}
+
+Define::~Define()
+{
+}
+
+bool Define::hasDocumentation()
+{
+ return definition && (doc || Config_getBool("EXTRACT_ALL"));
+}
diff --git a/src/define.h b/src/define.h
new file mode 100644
index 0000000..0c80e96
--- /dev/null
+++ b/src/define.h
@@ -0,0 +1,91 @@
+/******************************************************************************
+ *
+ * $Id: define.h,v 1.21 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DEFINE_H
+#define DEFINE_H
+
+#include "qtbc.h"
+#include <qdict.h>
+#include <qlist.h>
+
+class FileDef;
+
+class Define
+{
+ public:
+ Define();
+ Define(const Define &d);
+ ~Define();
+ bool hasDocumentation();
+ QCString name;
+ QCString definition;
+ QCString fileName;
+ QCString doc;
+ QCString brief;
+ QCString args;
+ QCString anchor;
+ FileDef *fileDef;
+ int lineNr;
+ int nargs;
+ bool undef;
+ bool varArgs;
+ bool isPredefined;
+ bool nonRecursive;
+};
+
+class DefineList : public QList<Define>
+{
+ public:
+ DefineList() : QList<Define>() {}
+ ~DefineList() {}
+ int compareItems(GCI i1,GCI i2)
+ {
+ return stricmp(((Define *)i1)->name,((Define *)i2)->name);
+ }
+};
+
+class DefineName : public QList<Define>
+{
+ public:
+ DefineName(const char *n) : QList<Define>() { name=n; }
+ ~DefineName() {}
+ const char *nameString() const { return name; }
+ int compareItems(GCI i1,GCI i2)
+ {
+ return stricmp(((Define *)i1)->name,((Define *)i2)->name);
+ }
+
+ private:
+ QCString name;
+};
+
+class DefineNameList : public QList<DefineName>
+{
+ public:
+ DefineNameList() : QList<DefineName>() {}
+ ~DefineNameList() {}
+ int compareItems(GCI i1,GCI i2)
+ {
+ return stricmp(((DefineName *)i1)->nameString(),
+ ((DefineName *)i2)->nameString());
+ }
+};
+
+typedef QDict<Define> DefineDict;
+typedef QDict<DefineName> DefineNameDict;
+
+#endif
diff --git a/src/definition.cpp b/src/definition.cpp
new file mode 100644
index 0000000..f60405e
--- /dev/null
+++ b/src/definition.cpp
@@ -0,0 +1,1655 @@
+/******************************************************************************
+ *
+ * $Id: index.cpp,v 1.30 1999/03/06 22:15:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include <ctype.h>
+#include <qregexp.h>
+#include "md5.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "config.h"
+#include "definition.h"
+#include "doxygen.h"
+#include "language.h"
+#include "message.h"
+#include "outputlist.h"
+#include "code.h"
+#include "util.h"
+#include "groupdef.h"
+#include "pagedef.h"
+#include "section.h"
+#include "htags.h"
+#include "parserintf.h"
+#include "marshal.h"
+#include "debug.h"
+
+#define START_MARKER 0x4445465B // DEF[
+#define END_MARKER 0x4445465D // DEF]
+
+//-----------------------------------------------------------------------------------------
+
+class DefinitionImpl
+{
+ public:
+ DefinitionImpl();
+ ~DefinitionImpl();
+ void init(const char *df,int dl,
+ const char *n);
+
+ SectionDict *sectionDict; // dictionary of all sections, not accessible
+
+ MemberSDict *sourceRefByDict;
+ MemberSDict *sourceRefsDict;
+ QList<ListItemInfo> *xrefListItems;
+ GroupList *partOfGroups;
+
+ DocInfo *details; // not exported
+ DocInfo *inbodyDocs; // not exported
+ BriefInfo *brief; // not exported
+ BodyInfo *body; // not exported
+ QCString docSignatures;
+
+ QCString localName; // local (unqualified) name of the definition
+ // in the future m_name should become m_localName
+ QCString qualifiedName;
+ QCString ref; // reference to external documentation
+
+ bool hidden;
+ bool isArtificial;
+
+ Definition *outerScope; // not owner
+
+ // where the item was found
+ QCString defFileName;
+ int defLine;
+ QCString defFileExt;
+};
+
+DefinitionImpl::DefinitionImpl()
+ : sectionDict(0), sourceRefByDict(0), sourceRefsDict(0),
+ xrefListItems(0), partOfGroups(0),
+ details(0), inbodyDocs(0), brief(0), body(0),
+ outerScope(0)
+{
+}
+
+DefinitionImpl::~DefinitionImpl()
+{
+ delete sectionDict;
+ delete sourceRefByDict;
+ delete sourceRefsDict;
+ delete partOfGroups;
+ delete xrefListItems;
+ delete brief;
+ delete details;
+ delete body;
+ delete inbodyDocs;
+}
+
+void DefinitionImpl::init(const char *df,int dl,
+ const char *n)
+{
+ defFileName = df;
+ int lastDot = defFileName.findRev('.');
+ if (lastDot!=-1)
+ {
+ defFileExt = defFileName.mid(lastDot);
+ }
+ defLine = dl;
+ QCString name = n;
+ if (name!="<globalScope>")
+ {
+ //extractNamespaceName(m_name,m_localName,ns);
+ localName=stripScope(n);
+ }
+ else
+ {
+ localName=n;
+ }
+ //printf("m_localName=%s\n",m_localName.data());
+
+ brief = 0;
+ details = 0;
+ body = 0;
+ inbodyDocs = 0;
+ sourceRefByDict = 0;
+ sourceRefsDict = 0;
+ sectionDict = 0,
+ outerScope = Doxygen::globalScope;
+ partOfGroups = 0;
+ xrefListItems = 0;
+ hidden = FALSE;
+ isArtificial = FALSE;
+}
+
+//-----------------------------------------------------------------------------------------
+
+static bool matchExcludedSymbols(const char *name)
+{
+ static QStrList &exclSyms = Config_getList("EXCLUDE_SYMBOLS");
+ if (exclSyms.count()==0) return FALSE; // nothing specified
+ const char *pat = exclSyms.first();
+ QCString symName = name;
+ while (pat)
+ {
+ QCString pattern = pat;
+ bool forceStart=FALSE;
+ bool forceEnd=FALSE;
+ if (pattern.at(0)=='^')
+ pattern=pattern.mid(1),forceStart=TRUE;
+ if (pattern.at(pattern.length()-1)=='$')
+ pattern=pattern.left(pattern.length()-1),forceEnd=TRUE;
+ if (pattern.find('*')!=-1) // wildcard mode
+ {
+ QRegExp re(substitute(pattern,"*",".*"),TRUE);
+ int i,pl;
+ i = re.match(symName,0,&pl);
+ //printf(" %d = re.match(%s) pattern=%s\n",i,symName.data(),pattern.data());
+ if (i!=-1) // wildcard match
+ {
+ int sl=symName.length();
+ // check if it is a whole word match
+ if ((i==0 || pattern.at(0)=='*' || (!isId(symName.at(i-1)) && !forceStart)) &&
+ (i+pl==sl || pattern.at(i+pl)=='*' || (!isId(symName.at(i+pl)) && !forceEnd))
+ )
+ {
+ //printf("--> name=%s pattern=%s match at %d\n",symName.data(),pattern.data(),i);
+ return TRUE;
+ }
+ }
+ }
+ else if (!pattern.isEmpty()) // match words
+ {
+ int i = symName.find(pattern);
+ if (i!=-1) // we have a match!
+ {
+ int pl=pattern.length();
+ int sl=symName.length();
+ // check if it is a whole word match
+ if ((i==0 || (!isId(symName.at(i-1)) && !forceStart)) &&
+ (i+pl==sl || (!isId(symName.at(i+pl)) && !forceEnd))
+ )
+ {
+ //printf("--> name=%s pattern=%s match at %d\n",symName.data(),pattern.data(),i);
+ return TRUE;
+ }
+ }
+ }
+ pat = exclSyms.next();
+ }
+ //printf("--> name=%s: no match\n",name);
+ return FALSE;
+}
+
+void Definition::addToMap(const char *name,Definition *d)
+{
+ bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ QCString symbolName = name;
+ int index=computeQualifiedIndex(symbolName);
+ if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
+ if (!symbolName.isEmpty())
+ {
+ //printf("******* adding symbol `%s' (%p)\n",symbolName.data(),d);
+ DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
+ //printf(" addToMap(%p): looking for symbol %s: %p\n",d,symbolName.data(),di);
+ if (di==0) // new Symbol
+ {
+ //printf(" new symbol!\n");
+ Doxygen::symbolMap->insert(symbolName,d);
+ }
+ else // existing symbol
+ {
+ //printf(" existing symbol: ");
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList) // already multiple symbols
+ {
+ //printf("adding to exiting list\n");
+ DefinitionList *dl = (DefinitionList*)di;
+ dl->append(d);
+ }
+ else // going from one to two symbols
+ {
+ Doxygen::symbolMap->take(symbolName);
+ DefinitionList *dl = new DefinitionList;
+ //printf("replacing symbol by list %p with elements %p and %p\n",dl,di,d);
+ dl->append((Definition*)di);
+ dl->append(d);
+ Doxygen::symbolMap->insert(symbolName,dl);
+ }
+ }
+
+ // auto resize if needed
+ static int sizeIndex=9;
+ if (Doxygen::symbolMap->size()>SDict_primes[sizeIndex])
+ {
+ Doxygen::symbolMap->resize(SDict_primes[++sizeIndex]);
+ }
+
+ d->_setSymbolName(symbolName);
+ }
+}
+
+void Definition::removeFromMap(Definition *d)
+{
+ QString symbolName = d->m_symbolName;
+ if (!symbolName.isEmpty())
+ {
+ //printf("******* removing symbol `%s' (%p)\n",symbolName.data(),d);
+ DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
+ if (di)
+ {
+ if (di!=d) // symbolName not unique
+ {
+ //printf(" removing from list: %p!\n",di);
+ DefinitionList *dl = (DefinitionList*)di;
+ bool b = dl->removeRef(d);
+ ASSERT(b==TRUE);
+ if (dl->isEmpty())
+ {
+ Doxygen::symbolMap->take(symbolName);
+ }
+ }
+ else // symbolName unique
+ {
+ //printf(" removing symbol %p\n",di);
+ Doxygen::symbolMap->take(symbolName);
+ }
+ }
+ }
+}
+
+Definition::Definition(const char *df,int dl,
+ const char *name,const char *b,
+ const char *d,bool isSymbol)
+{
+ m_name = name;
+ m_impl = new DefinitionImpl;
+ m_impl->init(df,dl,name);
+ m_isSymbol = isSymbol;
+ if (isSymbol) addToMap(name,this);
+ _setBriefDescription(b,df,dl);
+ _setDocumentation(d,df,dl,TRUE,FALSE);
+ if (matchExcludedSymbols(name))
+ {
+ m_impl->hidden = TRUE;
+ }
+}
+
+Definition::~Definition()
+{
+ if (m_isSymbol)
+ {
+ removeFromMap(this);
+ }
+ if (m_impl)
+ {
+ delete m_impl;
+ m_impl=0;
+ }
+}
+
+void Definition::setName(const char *name)
+{
+ if (name==0) return;
+ m_name = name;
+}
+
+void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
+{
+ if (!anchorList) return;
+ makeResident();
+ //printf("%s: addSectionsToDefinition(%d)\n",name().data(),anchorList->count());
+ SectionInfo *si=anchorList->first();
+ while (si)
+ {
+ //printf("Add section `%s' to definition `%s'\n",
+ // si->label.data(),name().data());
+ SectionInfo *gsi=Doxygen::sectionDict.find(si->label);
+ if (gsi==0)
+ {
+ gsi = new SectionInfo(*si);
+ Doxygen::sectionDict.insert(si->label,gsi);
+ }
+ if (m_impl->sectionDict==0)
+ {
+ m_impl->sectionDict = new SectionDict(17);
+ }
+ if (m_impl->sectionDict->find(gsi->label)==0)
+ {
+ m_impl->sectionDict->insert(gsi->label,gsi);
+ gsi->definition = this;
+ }
+ si=anchorList->next();
+ }
+}
+
+void Definition::writeDocAnchorsToTagFile()
+{
+ makeResident();
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty() && m_impl->sectionDict)
+ {
+ //printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_sectionDict->count());
+ QDictIterator<SectionInfo> sdi(*m_impl->sectionDict);
+ SectionInfo *si;
+ for (;(si=sdi.current());++sdi)
+ {
+ if (!si->generated)
+ {
+ //printf("write an entry!\n");
+ if (definitionType()==TypeMember) Doxygen::tagFile << " ";
+ Doxygen::tagFile << " <docanchor file=\""
+ << si->fileName << "\">" << si->label
+ << "</docanchor>" << endl;
+ }
+ }
+ }
+}
+
+bool Definition::_docsAlreadyAdded(const QCString &doc)
+{
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ // to avoid mismatches due to differences in indenting, we first remove
+ // double whitespaces...
+ QCString docStr = doc.simplifyWhiteSpace();
+ MD5Buffer((const unsigned char *)docStr.data(),docStr.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ if (m_impl->docSignatures.find(sigStr)==-1) // new docs, add signature to prevent re-adding it
+ {
+ m_impl->docSignatures+=":"+sigStr;
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+void Definition::_setDocumentation(const char *d,const char *docFile,int docLine,
+ bool stripWhiteSpace,bool atTop)
+{
+ if (d==0) return;
+ //printf("Definition::setDocumentation(%s,%s,%d,%d)\n",d,docFile,docLine,stripWhiteSpace);
+ QCString doc = d;
+ if (stripWhiteSpace)
+ {
+ doc = stripLeadingAndTrailingEmptyLines(doc);
+ }
+ else // don't strip whitespace
+ {
+ doc=d;
+ }
+ if (!_docsAlreadyAdded(doc))
+ {
+ //printf("setting docs for %s: `%s'\n",name().data(),m_doc.data());
+ if (m_impl->details==0)
+ {
+ m_impl->details = new DocInfo;
+ }
+ if (m_impl->details->doc.isEmpty()) // fresh detailed description
+ {
+ m_impl->details->doc = doc;
+ }
+ else if (atTop) // another detailed description, append it to the start
+ {
+ m_impl->details->doc = doc+"\n\n"+m_impl->details->doc;
+ }
+ else // another detailed description, append it to the end
+ {
+ m_impl->details->doc += "\n\n"+doc;
+ }
+ if (docLine!=-1) // store location if valid
+ {
+ m_impl->details->file = docFile;
+ m_impl->details->line = docLine;
+ }
+ else
+ {
+ m_impl->details->file = docFile;
+ m_impl->details->line = 1;
+ }
+ }
+}
+
+void Definition::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
+{
+ if (d==0) return;
+ makeResident();
+ _setDocumentation(d,docFile,docLine,stripWhiteSpace,FALSE);
+}
+
+#define uni_isupper(c) (QChar(c).category()==QChar::Letter_Uppercase)
+
+// do a UTF-8 aware search for the last real character and return TRUE
+// if that is a multibyte one.
+static bool lastCharIsMultibyte(const QCString &s)
+{
+ int l = s.length();
+ int p = 0;
+ int pp = -1;
+ while ((p=nextUtf8CharPosition(s,l,p))<l) pp=p;
+ if (pp==-1 || ((uchar)s[pp])<0x80) return FALSE;
+ return TRUE;
+}
+
+void Definition::_setBriefDescription(const char *b,const char *briefFile,int briefLine)
+{
+ static QCString outputLanguage = Config_getEnum("OUTPUT_LANGUAGE");
+ static bool needsDot = outputLanguage!="Japanese" &&
+ outputLanguage!="Chinese" &&
+ outputLanguage!="Korean";
+ QCString brief = b;
+ brief = brief.stripWhiteSpace();
+ if (brief.isEmpty()) return;
+ int bl = brief.length();
+ if (bl>0 && needsDot) // add punctuation if needed
+ {
+ int c = brief.at(bl-1);
+ switch(c)
+ {
+ case '.': case '!': case '?': case '>': case ':': case ')': break;
+ default:
+ if (uni_isupper(brief.at(0)) && !lastCharIsMultibyte(brief)) brief+='.';
+ break;
+ }
+ }
+
+ if (m_impl->brief && !m_impl->brief->doc.isEmpty())
+ {
+ //printf("adding to details\n");
+ _setDocumentation(brief,briefFile,briefLine,FALSE,TRUE);
+ }
+ else if (!_docsAlreadyAdded(brief))
+ {
+ //fprintf(stderr,"Definition::setBriefDescription(%s,%s,%d)\n",b,briefFile,briefLine);
+ if (m_impl->brief==0)
+ {
+ m_impl->brief = new BriefInfo;
+ }
+ m_impl->brief->doc=brief;
+ if (briefLine!=-1)
+ {
+ m_impl->brief->file = briefFile;
+ m_impl->brief->line = briefLine;
+ }
+ else
+ {
+ m_impl->brief->file = briefFile;
+ m_impl->brief->line = 1;
+ }
+ }
+}
+
+void Definition::setBriefDescription(const char *b,const char *briefFile,int briefLine)
+{
+ if (b==0) return;
+ makeResident();
+ _setBriefDescription(b,briefFile,briefLine);
+}
+
+void Definition::_setInbodyDocumentation(const char *doc,const char *inbodyFile,int inbodyLine)
+{
+ if (m_impl->inbodyDocs==0)
+ {
+ m_impl->inbodyDocs = new DocInfo;
+ }
+ if (m_impl->inbodyDocs->doc.isEmpty()) // fresh inbody docs
+ {
+ m_impl->inbodyDocs->doc = doc;
+ m_impl->inbodyDocs->file = inbodyFile;
+ m_impl->inbodyDocs->line = inbodyLine;
+ }
+ else // another inbody documentation fragment, append this to the end
+ {
+ m_impl->inbodyDocs->doc += QCString("\n\n")+doc;
+ }
+}
+
+void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
+{
+ if (d==0) return;
+ makeResident();
+ _setInbodyDocumentation(d,inbodyFile,inbodyLine);
+}
+
+/*! Reads a fragment of code from file \a fileName starting at
+ * line \a startLine and ending at line \a endLine (inclusive). The fragment is
+ * stored in \a result. If FALSE is returned the code fragment could not be
+ * found.
+ *
+ * The file is scanned for a opening bracket ('{') from \a startLine onward
+ * The line actually containing the bracket is returned via startLine.
+ * The file is scanned for a closing bracket ('}') from \a endLine backward.
+ * The line actually containing the bracket is returned via endLine.
+ * Note that for VHDL code the bracket search is not done.
+ */
+static bool readCodeFragment(const char *fileName,
+ int &startLine,int &endLine,QCString &result)
+{
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
+ //printf("readCodeFragment(%s,%d,%d)\n",fileName,startLine,endLine);
+ if (fileName==0 || fileName[0]==0) return FALSE; // not a valid file name
+ QCString filter = getFileFilter(fileName,TRUE);
+ FILE *f=0;
+ bool usePipe = !filter.isEmpty() && filterSourceFiles;
+ if (!usePipe) // no filter given or wanted
+ {
+ f = portable_fopen(fileName,"r");
+ }
+ else // use filter
+ {
+ QCString cmd=filter+" \""+fileName+"\"";
+ Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",cmd.data());
+ f = portable_popen(cmd,"r");
+ }
+ bool found=vhdlOpt; // for VHDL no bracket search is possible
+ if (f)
+ {
+ int c=0;
+ int col=0;
+ int lineNr=1;
+ // skip until the startLine has reached
+ while (lineNr<startLine && !feof(f))
+ {
+ while ((c=fgetc(f))!='\n' && c!=EOF) /* skip */;
+ lineNr++;
+ }
+ if (!feof(f))
+ {
+ // skip until the opening bracket or lonely : is found
+ char cn=0;
+ while (lineNr<=endLine && !feof(f) && !found)
+ {
+ int pc=0;
+ while ((c=fgetc(f))!='{' && c!=':' && c!=EOF)
+ {
+ //printf("parsing char `%c'\n",c);
+ if (c=='\n')
+ {
+ lineNr++,col=0;
+ }
+ else if (c=='\t')
+ {
+ col+=Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
+ }
+ else if (pc=='/' && c=='/') // skip single line comment
+ {
+ while ((c=fgetc(f))!='\n' && c!=EOF) pc=c;
+ if (c=='\n') lineNr++,col=0;
+ }
+ else if (pc=='/' && c=='*') // skip C style comment
+ {
+ while (((c=fgetc(f))!='/' || pc!='*') && c!=EOF)
+ {
+ if (c=='\n') lineNr++,col=0;
+ pc=c;
+ }
+ }
+ else
+ {
+ col++;
+ }
+ pc = c;
+ }
+ if (c==':')
+ {
+ cn=fgetc(f);
+ if (cn!=':') found=TRUE;
+ }
+ else if (c=='{')
+ {
+ found=TRUE;
+ }
+ }
+ //printf(" -> readCodeFragment(%s,%d,%d) lineNr=%d\n",fileName,startLine,endLine,lineNr);
+ if (found)
+ {
+ // For code with more than one line,
+ // fill the line with spaces until we are at the right column
+ // so that the opening brace lines up with the closing brace
+ if (endLine!=startLine)
+ {
+ QCString spaces;
+ spaces.fill(' ',col);
+ result+=spaces;
+ }
+ // copy until end of line
+ result+=c;
+ if (c==':')
+ {
+ result+=cn;
+ if (cn=='\n') lineNr++;
+ }
+ startLine=lineNr;
+ const int maxLineLength=4096;
+ char lineStr[maxLineLength];
+ do
+ {
+ //printf("reading line %d in range %d-%d\n",lineNr,startLine,endLine);
+ int size_read;
+ do
+ {
+ // read up to maxLineLength-1 bytes, the last byte being zero
+ char *p = fgets(lineStr, maxLineLength,f);
+ //printf(" read %s",p);
+ if (p)
+ {
+ size_read=qstrlen(p);
+ }
+ else // nothing read
+ {
+ size_read=-1;
+ lineStr[0]='\0';
+ }
+ result+=lineStr;
+ } while (size_read == (maxLineLength-1));
+
+ lineNr++;
+ } while (lineNr<=endLine && !feof(f));
+
+ // strip stuff after closing bracket
+ int newLineIndex = result.findRev('\n');
+ int braceIndex = result.findRev('}');
+ if (braceIndex > newLineIndex)
+ {
+ result.truncate(braceIndex+1);
+ }
+ endLine=lineNr-1;
+ }
+ }
+ if (usePipe)
+ {
+ portable_pclose(f);
+ }
+ else
+ {
+ fclose(f);
+ }
+ }
+ result = transcodeCharacterStringToUTF8(result);
+ return found;
+}
+
+/*! Write a reference to the source code defining this definition */
+void Definition::writeSourceDef(OutputList &ol,const char *)
+{
+ static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
+ static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
+ makeResident();
+ ol.pushGeneratorState();
+ //printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef);
+ if (sourceBrowser &&
+ m_impl->body && m_impl->body->startLine!=-1 && m_impl->body->fileDef)
+ {
+ QCString refText = theTranslator->trDefinedAtLineInSourceFile();
+ int lineMarkerPos = refText.find("@0");
+ int fileMarkerPos = refText.find("@1");
+ if (lineMarkerPos!=-1 && fileMarkerPos!=-1) // should always pass this.
+ {
+ QCString lineStr,anchorStr;
+ lineStr.sprintf("%d",m_impl->body->startLine);
+ anchorStr.sprintf(Htags::useHtags ? "L%d" : "l%05d",m_impl->body->startLine);
+ ol.startParagraph();
+ if (lineMarkerPos<fileMarkerPos) // line marker before file marker
+ {
+ // write text left from linePos marker
+ ol.parseText(refText.left(lineMarkerPos));
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Man);
+ if (!latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ // write line link (HTML, LaTeX optionally)
+ ol.writeObjectLink(0,m_impl->body->fileDef->getSourceFileBase(),
+ anchorStr,lineStr);
+ ol.enableAll();
+ ol.disable(OutputGenerator::Html);
+ if (latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ // write normal text (Man/RTF, Latex optionally)
+ ol.docify(lineStr);
+ ol.popGeneratorState();
+
+ // write text between markers
+ ol.parseText(refText.mid(lineMarkerPos+2,
+ fileMarkerPos-lineMarkerPos-2));
+
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Man);
+ if (!latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ // write line link (HTML, LaTeX optionally)
+ ol.writeObjectLink(0,m_impl->body->fileDef->getSourceFileBase(),
+ 0,m_impl->body->fileDef->name());
+ ol.enableAll();
+ ol.disable(OutputGenerator::Html);
+ if (latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ // write normal text (Man/RTF, Latex optionally)
+ ol.docify(m_impl->body->fileDef->name());
+ ol.popGeneratorState();
+
+ // write text right from file marker
+ ol.parseText(refText.right(
+ refText.length()-fileMarkerPos-2));
+ }
+ else // file marker before line marker
+ {
+ // write text left from file marker
+ ol.parseText(refText.left(fileMarkerPos));
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Man);
+ if (!latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ // write file link (HTML only)
+ ol.writeObjectLink(0,m_impl->body->fileDef->getSourceFileBase(),
+ 0,m_impl->body->fileDef->name());
+ ol.enableAll();
+ ol.disable(OutputGenerator::Html);
+ if (latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ // write normal text (Latex/Man only)
+ ol.docify(m_impl->body->fileDef->name());
+ ol.popGeneratorState();
+
+ // write text between markers
+ ol.parseText(refText.mid(fileMarkerPos+2,
+ lineMarkerPos-fileMarkerPos-2));
+
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Man);
+ if (!latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ ol.disableAllBut(OutputGenerator::Html);
+ // write line link (HTML only)
+ ol.writeObjectLink(0,m_impl->body->fileDef->getSourceFileBase(),
+ anchorStr,lineStr);
+ ol.enableAll();
+ ol.disable(OutputGenerator::Html);
+ if (latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ // write normal text (Latex/Man only)
+ ol.docify(lineStr);
+ ol.popGeneratorState();
+
+ // write text right from linePos marker
+ ol.parseText(refText.right(
+ refText.length()-lineMarkerPos-2));
+ }
+ ol.endParagraph();
+ }
+ else
+ {
+ err("error: translation error: invalid markers in trDefinedInSourceFile()\n");
+ }
+ }
+ ol.popGeneratorState();
+}
+
+void Definition::setBodySegment(int bls,int ble)
+{
+ //printf("setBodySegment(%d,%d) for %s\n",bls,ble,name().data());
+ makeResident();
+ if (m_impl->body==0) m_impl->body = new BodyInfo;
+ m_impl->body->startLine=bls;
+ m_impl->body->endLine=ble;
+}
+
+void Definition::setBodyDef(FileDef *fd)
+{
+ makeResident();
+ if (m_impl->body==0) m_impl->body = new BodyInfo;
+ m_impl->body->fileDef=fd;
+}
+
+/*! Write code of this definition into the documentation */
+void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
+{
+ makeResident();
+ ol.pushGeneratorState();
+ //printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(),
+ // m_startBodyLine,m_endBodyLine,m_bodyDef);
+ if (Config_getBool("INLINE_SOURCES") &&
+ m_impl->body && m_impl->body->startLine!=-1 &&
+ m_impl->body->endLine>=m_impl->body->startLine && m_impl->body->fileDef)
+ {
+ QCString codeFragment;
+ int actualStart=m_impl->body->startLine,actualEnd=m_impl->body->endLine;
+ if (readCodeFragment(m_impl->body->fileDef->absFilePath(),
+ actualStart,actualEnd,codeFragment)
+ )
+ {
+ //printf("Adding code fragement '%s' ext='%s'\n",
+ // codeFragment.data(),m_impl->defFileExt.data());
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(m_impl->defFileExt);
+ pIntf->resetCodeParserState();
+ //printf("Read:\n`%s'\n\n",codeFragment.data());
+ MemberDef *thisMd = 0;
+ if (definitionType()==TypeMember) thisMd = (MemberDef *)this;
+ ol.startCodeFragment();
+ pIntf->parseCode(ol, // codeOutIntf
+ scopeName, // scope
+ codeFragment, // input
+ FALSE, // isExample
+ 0, // exampleName
+ m_impl->body->fileDef, // fileDef
+ actualStart, // startLine
+ actualEnd, // endLine
+ TRUE, // inlineFragment
+ thisMd, // memberDef
+ FALSE // show line numbers
+ );
+ ol.endCodeFragment();
+ }
+ }
+ ol.popGeneratorState();
+}
+
+/*! Write a reference to the source code fragments in which this
+ * definition is used.
+ */
+void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
+ const QCString &text,MemberSDict *members,bool /*funcOnly*/)
+{
+ static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
+ static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
+ static bool refLinkSource = Config_getBool("REFERENCES_LINK_SOURCE");
+ ol.pushGeneratorState();
+ if (members)
+ {
+ ol.startParagraph();
+ ol.parseText(text);
+ ol.docify(" ");
+
+ QCString ldefLine=theTranslator->trWriteList(members->count());
+
+ QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in inheritLine with links to the classes
+ while ((newIndex=marker.match(ldefLine,index,&matchLen))!=-1)
+ {
+ bool ok;
+ ol.parseText(ldefLine.mid(index,newIndex-index));
+ uint entryIndex = ldefLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ MemberDef *md=members->at(entryIndex);
+ if (ok && md)
+ {
+ QCString scope=md->getScopeString();
+ QCString name=md->name();
+ //printf("class=%p scope=%s scopeName=%s\n",md->getClassDef(),scope.data(),scopeName);
+ if (!scope.isEmpty() && scope!=scopeName)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ name.prepend(scope+".");
+ }
+ else
+ {
+ name.prepend(scope+"::");
+ }
+ }
+ if (!md->isObjCMethod() &&
+ (md->isFunction() || md->isSlot() ||
+ md->isPrototype() || md->isSignal()
+ )
+ )
+ {
+ name+="()";
+ }
+ //Definition *d = md->getOutputFileBase();
+ //if (d==Doxygen::globalScope) d=md->getBodyDef();
+ if (sourceBrowser &&
+ !(md->isLinkable() && !refLinkSource) &&
+ md->getStartBodyLine()!=-1 &&
+ md->getBodyDef()
+ )
+ {
+ //printf("md->getBodyDef()=%p global=%p\n",md->getBodyDef(),Doxygen::globalScope);
+ // for HTML write a real link
+ ol.pushGeneratorState();
+ //ol.disableAllBut(OutputGenerator::Html);
+
+ ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Man);
+ if (!latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ QCString lineStr,anchorStr;
+ anchorStr.sprintf("l%05d",md->getStartBodyLine());
+ //printf("Write object link to %s\n",md->getBodyDef()->getSourceFileBase().data());
+ ol.writeObjectLink(0,md->getBodyDef()->getSourceFileBase(),anchorStr,name);
+ ol.popGeneratorState();
+
+ // for the other output formats just mention the name
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ if (latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ ol.docify(name);
+ ol.popGeneratorState();
+ }
+ else if (md->isLinkable() /*&& d && d->isLinkable()*/)
+ {
+ // for HTML write a real link
+ ol.pushGeneratorState();
+ //ol.disableAllBut(OutputGenerator::Html);
+ ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Man);
+ if (!latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+
+ ol.writeObjectLink(md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),name);
+ ol.popGeneratorState();
+
+ // for the other output formats just mention the name
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ if (latexSourceCode)
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+ ol.docify(name);
+ ol.popGeneratorState();
+ }
+ else
+ {
+ ol.docify(name);
+ }
+ }
+ index=newIndex+matchLen;
+ }
+ ol.parseText(ldefLine.right(ldefLine.length()-index));
+ ol.writeString(".");
+ ol.endParagraph();
+ }
+ ol.popGeneratorState();
+}
+
+void Definition::writeSourceReffedBy(OutputList &ol,const char *scopeName)
+{
+ makeResident();
+ if (Config_getBool("REFERENCED_BY_RELATION"))
+ {
+ _writeSourceRefList(ol,scopeName,theTranslator->trReferencedBy(),m_impl->sourceRefByDict,FALSE);
+ }
+}
+
+void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
+{
+ makeResident();
+ if (Config_getBool("REFERENCES_RELATION"))
+ {
+ _writeSourceRefList(ol,scopeName,theTranslator->trReferences(),m_impl->sourceRefsDict,TRUE);
+ }
+}
+
+bool Definition::hasDocumentation() const
+{
+ static bool extractAll = Config_getBool("EXTRACT_ALL");
+ //static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
+ makeResident();
+ bool hasDocs =
+ (m_impl->details && !m_impl->details->doc.isEmpty()) || // has detailed docs
+ (m_impl->brief && !m_impl->brief->doc.isEmpty()) || // has brief description
+ (m_impl->inbodyDocs && !m_impl->inbodyDocs->doc.isEmpty()) || // has inbody docs
+ extractAll //|| // extract everything
+ // (sourceBrowser && m_impl->body &&
+ // m_impl->body->startLine!=-1 && m_impl->body->fileDef)
+ ; // link to definition
+ return hasDocs;
+}
+
+bool Definition::hasUserDocumentation() const
+{
+ makeResident();
+ bool hasDocs =
+ (m_impl->details && !m_impl->details->doc.isEmpty()) ||
+ (m_impl->brief && !m_impl->brief->doc.isEmpty()) ||
+ (m_impl->inbodyDocs && !m_impl->inbodyDocs->doc.isEmpty());
+ return hasDocs;
+}
+
+void Definition::addSourceReferencedBy(MemberDef *md)
+{
+ if (md)
+ {
+ makeResident();
+ QCString name = md->name();
+ QCString scope = md->getScopeString();
+
+ if (!scope.isEmpty())
+ {
+ name.prepend(scope+"::");
+ }
+
+ if (m_impl->sourceRefByDict==0)
+ {
+ m_impl->sourceRefByDict = new MemberSDict;
+ }
+ if (m_impl->sourceRefByDict->find(name)==0)
+ {
+ m_impl->sourceRefByDict->inSort(name,md);
+ }
+ }
+}
+
+void Definition::addSourceReferences(MemberDef *md)
+{
+ if (md)
+ {
+ QCString name = md->name();
+ QCString scope = md->getScopeString();
+ makeResident();
+
+ if (!scope.isEmpty())
+ {
+ name.prepend(scope+"::");
+ }
+
+ if (m_impl->sourceRefsDict==0)
+ {
+ m_impl->sourceRefsDict = new MemberSDict;
+ }
+ if (m_impl->sourceRefsDict->find(name)==0)
+ {
+ m_impl->sourceRefsDict->inSort(name,md);
+ }
+ }
+}
+
+Definition *Definition::findInnerCompound(const char *)
+{
+ return 0;
+}
+
+void Definition::addInnerCompound(Definition *)
+{
+ err("error: Definition::addInnerCompound() called\n");
+}
+
+QCString Definition::qualifiedName() const
+{
+ static int count=0;
+ count++;
+ makeResident();
+ if (!m_impl->qualifiedName.isEmpty())
+ {
+ count--;
+ return m_impl->qualifiedName;
+ }
+#if 0
+ if (count>20)
+ {
+ printf("Definition::qualifiedName() Infinite recursion detected! Type=%d\n",definitionType());
+ printf("Trace:\n");
+ Definition *d = (Definition *)this;
+ for (int i=0;d && i<20;i++)
+ {
+ printf(" %s\n",d->name().data());
+ d = d->getOuterScope();
+ }
+ }
+#endif
+
+ //printf("start %s::qualifiedName() localName=%s\n",name().data(),m_impl->localName.data());
+ if (m_impl->outerScope==0)
+ {
+ if (m_impl->localName=="<globalScope>")
+ {
+ count--;
+ return "";
+ }
+ else
+ {
+ count--;
+ return m_impl->localName;
+ }
+ }
+
+ if (m_impl->outerScope->name()=="<globalScope>")
+ {
+ m_impl->qualifiedName = m_impl->localName;
+ }
+ else
+ {
+ m_impl->qualifiedName = m_impl->outerScope->qualifiedName()+"::"+m_impl->localName;
+ }
+ //printf("end %s::qualifiedName()=%s\n",name().data(),m_impl->qualifiedName.data());
+ count--;
+ return m_impl->qualifiedName;
+};
+
+void Definition::setOuterScope(Definition *d)
+{
+ makeResident();
+ if (m_impl->outerScope!=d)
+ {
+ m_impl->qualifiedName.resize(0); // flush cached scope name
+ m_impl->outerScope = d;
+ }
+ m_impl->hidden = m_impl->hidden || d->isHidden();
+}
+
+QCString Definition::localName() const
+{
+ makeResident();
+ return m_impl->localName;
+}
+
+void Definition::makePartOfGroup(GroupDef *gd)
+{
+ makeResident();
+ if (m_impl->partOfGroups==0) m_impl->partOfGroups = new GroupList;
+ m_impl->partOfGroups->append(gd);
+}
+
+void Definition::setRefItems(const QList<ListItemInfo> *sli)
+{
+ //printf("%s::setRefItems()\n",name().data());
+ if (sli)
+ {
+ makeResident();
+ // deep copy the list
+ if (m_impl->xrefListItems==0)
+ {
+ m_impl->xrefListItems=new QList<ListItemInfo>;
+ m_impl->xrefListItems->setAutoDelete(TRUE);
+ }
+ QListIterator<ListItemInfo> slii(*sli);
+ ListItemInfo *lii;
+ for (slii.toFirst();(lii=slii.current());++slii)
+ {
+ m_impl->xrefListItems->append(new ListItemInfo(*lii));
+ }
+ }
+}
+
+void Definition::mergeRefItems(Definition *d)
+{
+ //printf("%s::mergeRefItems()\n",name().data());
+ LockingPtr< QList<ListItemInfo> > xrefList = d->xrefListItems();
+ if (xrefList!=0)
+ {
+ makeResident();
+ // deep copy the list
+ if (m_impl->xrefListItems==0)
+ {
+ m_impl->xrefListItems=new QList<ListItemInfo>;
+ m_impl->xrefListItems->setAutoDelete(TRUE);
+ }
+ QListIterator<ListItemInfo> slii(*xrefList);
+ ListItemInfo *lii;
+ for (slii.toFirst();(lii=slii.current());++slii)
+ {
+ if (_getXRefListId(lii->type)==-1)
+ {
+ m_impl->xrefListItems->append(new ListItemInfo(*lii));
+ }
+ }
+ }
+}
+
+int Definition::_getXRefListId(const char *listName) const
+{
+ makeResident();
+ if (m_impl->xrefListItems)
+ {
+ QListIterator<ListItemInfo> slii(*m_impl->xrefListItems);
+ ListItemInfo *lii;
+ for (slii.toFirst();(lii=slii.current());++slii)
+ {
+ if (strcmp(lii->type,listName)==0)
+ {
+ return lii->itemId;
+ }
+ }
+ }
+ return -1;
+}
+
+LockingPtr< QList<ListItemInfo> > Definition::xrefListItems() const
+{
+ makeResident();
+ return LockingPtr< QList<ListItemInfo> >(this,m_impl->xrefListItems);
+}
+
+
+QCString Definition::convertNameToFile(const char *name,bool allowDots) const
+{
+ makeResident();
+ if (!m_impl->ref.isEmpty())
+ {
+ return name;
+ }
+ else
+ {
+ return ::convertNameToFile(name,allowDots);
+ }
+}
+
+QCString Definition::pathFragment() const
+{
+ makeResident();
+ QCString result;
+ if (m_impl->outerScope && m_impl->outerScope!=Doxygen::globalScope)
+ {
+ result = m_impl->outerScope->pathFragment();
+ }
+ if (isLinkable())
+ {
+ if (!result.isEmpty()) result+="/";
+ if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle())
+ {
+ result+=((const GroupDef*)this)->groupTitle();
+ }
+ else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty())
+ {
+ result+=((const PageDef*)this)->title();
+ }
+ else
+ {
+ result+=m_impl->localName;
+ }
+ }
+ else
+ {
+ result+=m_impl->localName;
+ }
+ return result;
+}
+
+void Definition::writePathFragment(OutputList &ol) const
+{
+ makeResident();
+ if (m_impl->outerScope && m_impl->outerScope!=Doxygen::globalScope)
+ {
+ m_impl->outerScope->writePathFragment(ol);
+ }
+ ol.writeString(" <li class=\"navelem\">");
+ if (isLinkable())
+ {
+ if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle())
+ {
+ ol.writeObjectLink(getReference(),getOutputFileBase(),0,((const GroupDef*)this)->groupTitle());
+ }
+ else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty())
+ {
+ ol.writeObjectLink(getReference(),getOutputFileBase(),0,((const PageDef*)this)->title());
+ }
+ else if (definitionType()==Definition::TypeClass)
+ {
+ QCString name = m_impl->localName;
+ if (name.right(2)=="-p" || name.right(2)=="-g")
+ {
+ name = name.left(name.length()-2);
+ }
+ ol.writeObjectLink(getReference(),getOutputFileBase(),0,name);
+ }
+ else
+ {
+ ol.writeObjectLink(getReference(),getOutputFileBase(),0,m_impl->localName);
+ }
+ }
+ else
+ {
+ ol.startBold();
+ ol.docify(m_impl->localName);
+ ol.endBold();
+ }
+ ol.writeString(" </li>\n");
+}
+
+void Definition::writeNavigationPath(OutputList &ol) const
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool hasCustomFooter = !Config_getString("HTML_FOOTER").isEmpty();
+
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ if (generateTreeView)
+ {
+ ol.writeString("</div>\n");
+ }
+
+ ol.writeString(" <div id=\"nav-path\" class=\"navpath\">\n");
+ ol.writeString(" <ul>\n");
+ writePathFragment(ol);
+ if (!hasCustomFooter && generateTreeView) // write the doxygen logo as part of the navigation bar
+ {
+ ol.writeString(" <li class=\"footer\">");
+ ol.writeLogo();
+ ol.writeString("</li>\n");
+ }
+ if (!hasCustomFooter || !generateTreeView)
+ {
+ ol.writeString(" </ul>\n");
+ ol.writeString(" </div>\n");
+ }
+
+ ol.popGeneratorState();
+}
+
+QCString Definition::symbolName() const
+{
+ return m_symbolName;
+}
+
+//----------------------
+
+QCString Definition::documentation() const
+{
+ makeResident();
+ return m_impl->details ? m_impl->details->doc : QCString("");
+}
+
+int Definition::docLine() const
+{
+ makeResident();
+ return m_impl->details ? m_impl->details->line : 1;
+}
+
+QCString Definition::docFile() const
+{
+ makeResident();
+ return m_impl->details ? m_impl->details->file : QCString("<"+m_name+">");
+}
+
+//----------------------
+
+QCString Definition::briefDescription() const
+{
+ makeResident();
+ return m_impl->brief ? m_impl->brief->doc : QCString("");
+}
+
+QCString Definition::briefDescriptionAsTooltip() const
+{
+ makeResident();
+ if (m_impl->brief)
+ {
+ if (m_impl->brief->tooltip.isEmpty() && !m_impl->brief->doc.isEmpty())
+ {
+ static bool reentering=FALSE;
+ if (!reentering)
+ {
+ MemberDef *md = definitionType()==TypeMember ? (MemberDef*)this : 0;
+ const Definition *scope = definitionType()==TypeMember ? getOuterScope() : this;
+ reentering=TRUE; // prevent requests for tooltips while parsing a tooltip
+ m_impl->brief->tooltip = parseCommentAsText(
+ scope,md,
+ m_impl->brief->doc,
+ m_impl->brief->file,
+ m_impl->brief->line);
+ reentering=FALSE;
+ }
+ }
+ return m_impl->brief->tooltip;
+ }
+ return QCString("");
+}
+
+int Definition::briefLine() const
+{
+ makeResident();
+ return m_impl->brief ? m_impl->brief->line : 1;
+}
+
+QCString Definition::briefFile() const
+{
+ makeResident();
+ return m_impl->brief ? m_impl->brief->file : QCString("<"+m_name+">");
+}
+
+//----------------------
+
+QCString Definition::inbodyDocumentation() const
+{
+ makeResident();
+ return m_impl->inbodyDocs ? m_impl->inbodyDocs->doc : QCString("");
+}
+
+int Definition::inbodyLine() const
+{
+ makeResident();
+ return m_impl->inbodyDocs ? m_impl->inbodyDocs->line : 1;
+}
+
+QCString Definition::inbodyFile() const
+{
+ makeResident();
+ return m_impl->inbodyDocs ? m_impl->inbodyDocs->file : QCString("<"+m_name+">");
+}
+
+
+//----------------------
+
+QCString Definition::getDefFileName() const
+{
+ makeResident();
+ return m_impl->defFileName;
+}
+
+QCString Definition::getDefFileExtension() const
+{
+ makeResident();
+ return m_impl->defFileExt;
+}
+
+int Definition::getDefLine() const
+{
+ makeResident();
+ return m_impl->defLine;
+}
+
+bool Definition::isHidden() const
+{
+ makeResident();
+ return m_impl->hidden;
+}
+
+bool Definition::isVisibleInProject() const
+{
+ return isLinkableInProject() && !m_impl->hidden;
+}
+
+bool Definition::isVisible() const
+{
+ return isLinkable() && !m_impl->hidden;
+}
+
+bool Definition::isArtificial() const
+{
+ return m_impl->isArtificial;
+}
+
+QCString Definition::getReference() const
+{
+ makeResident();
+ return m_impl->ref;
+}
+
+bool Definition::isReference() const
+{
+ makeResident();
+ return !m_impl->ref.isEmpty();
+}
+
+int Definition::getStartBodyLine() const
+{
+ makeResident();
+ return m_impl->body ? m_impl->body->startLine : -1;
+}
+
+int Definition::getEndBodyLine() const
+{
+ makeResident();
+ return m_impl->body ? m_impl->body->endLine : -1;
+}
+
+FileDef *Definition::getBodyDef()
+{
+ makeResident();
+ return m_impl->body ? m_impl->body->fileDef : 0;
+}
+
+LockingPtr<GroupList> Definition::partOfGroups() const
+{
+ makeResident();
+ return LockingPtr<GroupList>(this,m_impl->partOfGroups);
+}
+
+Definition *Definition::getOuterScope() const
+{
+ makeResident();
+ return m_impl->outerScope;
+}
+
+LockingPtr<MemberSDict> Definition::getReferencesMembers() const
+{
+ makeResident();
+ return LockingPtr<MemberSDict>(this,m_impl->sourceRefsDict);
+}
+
+LockingPtr<MemberSDict> Definition::getReferencedByMembers() const
+{
+ makeResident();
+ return LockingPtr<MemberSDict>(this,m_impl->sourceRefByDict);
+}
+
+void Definition::setReference(const char *r)
+{
+ makeResident();
+ m_impl->ref=r;
+}
+
+void Definition::_setSymbolName(const QCString &name)
+{
+ m_symbolName=name;
+}
+
+void Definition::setHidden(bool b)
+{
+ makeResident();
+ m_impl->hidden = m_impl->hidden || b;
+}
+
+void Definition::setArtificial(bool b)
+{
+ makeResident();
+ m_impl->isArtificial = b;
+}
+
+void Definition::setLocalName(const QCString name)
+{
+ makeResident();
+ m_impl->localName=name;
+}
+
+void Definition::makeResident() const
+{
+}
+
+
+void Definition::flushToDisk() const
+{
+ //printf("%p: Definition::flushToDisk()\n",this);
+ Definition *that = (Definition *)this;
+ //printf("Definition::flushToDisk(): pos=%d\n",(int)m_storagePos);
+ marshalUInt(Doxygen::symbolStorage,START_MARKER);
+ marshalSectionDict (Doxygen::symbolStorage,m_impl->sectionDict);
+ marshalMemberSDict (Doxygen::symbolStorage,m_impl->sourceRefByDict);
+ marshalMemberSDict (Doxygen::symbolStorage,m_impl->sourceRefsDict);
+ marshalItemInfoList (Doxygen::symbolStorage,m_impl->xrefListItems);
+ marshalGroupList (Doxygen::symbolStorage,m_impl->partOfGroups);
+ marshalDocInfo (Doxygen::symbolStorage,m_impl->details);
+ marshalDocInfo (Doxygen::symbolStorage,m_impl->inbodyDocs);
+ marshalBriefInfo (Doxygen::symbolStorage,m_impl->brief);
+ marshalBodyInfo (Doxygen::symbolStorage,m_impl->body);
+ marshalQCString (Doxygen::symbolStorage,m_impl->docSignatures);
+ marshalQCString (Doxygen::symbolStorage,m_impl->localName);
+ marshalQCString (Doxygen::symbolStorage,m_impl->qualifiedName);
+ marshalQCString (Doxygen::symbolStorage,m_impl->ref);
+ marshalBool (Doxygen::symbolStorage,m_impl->hidden);
+ marshalBool (Doxygen::symbolStorage,m_impl->isArtificial);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->outerScope);
+ marshalQCString (Doxygen::symbolStorage,m_impl->defFileName);
+ marshalInt (Doxygen::symbolStorage,m_impl->defLine);
+ marshalQCString (Doxygen::symbolStorage,m_impl->defFileExt);
+ marshalUInt(Doxygen::symbolStorage,END_MARKER);
+ delete that->m_impl;
+ that->m_impl = 0;
+}
+
+void Definition::loadFromDisk() const
+{
+ //printf("%p: Definition::loadFromDisk()\n",this);
+ Definition *that = (Definition *)this;
+ assert(m_impl==0);
+ that->m_impl = new DefinitionImpl;
+ uint marker = unmarshalUInt(Doxygen::symbolStorage);
+ assert(marker==START_MARKER);
+ m_impl->sectionDict = unmarshalSectionDict (Doxygen::symbolStorage);
+ m_impl->sourceRefByDict = unmarshalMemberSDict (Doxygen::symbolStorage);
+ m_impl->sourceRefsDict = unmarshalMemberSDict (Doxygen::symbolStorage);
+ m_impl->xrefListItems = unmarshalItemInfoList (Doxygen::symbolStorage);
+ m_impl->partOfGroups = unmarshalGroupList (Doxygen::symbolStorage);
+ m_impl->details = unmarshalDocInfo (Doxygen::symbolStorage);
+ m_impl->inbodyDocs = unmarshalDocInfo (Doxygen::symbolStorage);
+ m_impl->brief = unmarshalBriefInfo (Doxygen::symbolStorage);
+ m_impl->body = unmarshalBodyInfo (Doxygen::symbolStorage);
+ m_impl->docSignatures = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->localName = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->qualifiedName = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->ref = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->hidden = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->isArtificial = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->outerScope = (Definition *)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->defFileName = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->defLine = unmarshalInt (Doxygen::symbolStorage);
+ m_impl->defFileExt = unmarshalQCString (Doxygen::symbolStorage);
+ marker = unmarshalUInt(Doxygen::symbolStorage);
+ assert(marker==END_MARKER);
+}
+
diff --git a/src/definition.h b/src/definition.h
new file mode 100644
index 0000000..73eaecd
--- /dev/null
+++ b/src/definition.h
@@ -0,0 +1,370 @@
+/******************************************************************************
+ *
+ * $Id: definition.h,v 1.21 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DEFINITION_H
+#define DEFINITION_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qdict.h>
+#include <sys/types.h>
+
+#include "lockingptr.h"
+
+class FileDef;
+class OutputList;
+class SectionDict;
+class MemberSDict;
+class MemberDef;
+class GroupDef;
+class GroupList;
+struct ListItemInfo;
+struct SectionInfo;
+class Definition;
+class DefinitionImpl;
+
+#if 0
+struct ReachableDefinition
+{
+ ReachableDefinition(Definition *d,int dist) : def(d), distance(dist) {}
+ Definition *def;
+ int distance;
+};
+#endif
+
+struct DocInfo
+{
+ QCString doc;
+ int line;
+ QCString file;
+};
+
+struct BriefInfo
+{
+ QCString doc;
+ QCString tooltip;
+ int line;
+ QCString file;
+};
+
+struct BodyInfo
+{
+ int startLine; // line number of the start of the definition
+ int endLine; // line number of the end of the definition
+ FileDef *fileDef; // file definition containing the function body
+};
+
+/*! Abstract interface for a Definition or DefinitionList */
+class DefinitionIntf
+{
+ public:
+ DefinitionIntf() {}
+ virtual ~DefinitionIntf() {}
+ /*! Types of derived classes */
+ enum DefType
+ {
+ TypeClass = 0,
+ TypeFile = 1,
+ TypeNamespace = 2,
+ TypeMember = 3,
+ TypeGroup = 4,
+ TypePackage = 5,
+ TypePage = 6,
+ TypeDir = 7,
+ TypeSymbolList = 8
+ };
+ /*! Use this for dynamic inspection of the type of the derived class */
+ virtual DefType definitionType() const = 0;
+};
+
+/*! The common base class of all entity definitions found in the sources.
+ * This can be a class or a member function, or a file, or a namespace, etc.
+ * Use definitionType() to find which type of definition this is.
+ */
+class Definition : public DefinitionIntf, public LockableObj
+{
+ public:
+
+ /*! Create a new definition */
+ Definition(
+ const char *defFileName,int defLine,
+ const char *name,const char *b=0,const char *d=0,
+ bool isSymbol=TRUE);
+
+ /*! Destroys the definition */
+ virtual ~Definition();
+
+ //-----------------------------------------------------------------------------------
+ // ---- getters -----
+ //-----------------------------------------------------------------------------------
+
+ /*! Returns the name of the definition */
+ const QCString& name() const { return m_name; }
+
+ /*! Returns the local name without any scope qualifiers. */
+ QCString localName() const;
+
+ /*! Returns the fully qualified name of this definition
+ */
+ virtual QCString qualifiedName() const;
+
+ /*! Returns the name of this definition as it appears in the symbol map.
+ */
+ QCString symbolName() const;
+
+ /*! Returns the base file name (without extension) of this definition.
+ * as it is referenced to/written to disk.
+ */
+ virtual QCString getOutputFileBase() const = 0;
+
+ /*! Returns the name of the source listing of this file. */
+ virtual QCString getSourceFileBase() const { ASSERT(0); return "NULL"; }
+
+ /*! Returns the detailed description of this definition */
+ QCString documentation() const;
+
+ /*! Returns the line number at which the detailed documentation was found. */
+ int docLine() const;
+
+ /*! Returns the file in which the detailed documentation block was found.
+ * This can differ from getDefFileName().
+ */
+ QCString docFile() const;
+
+ /*! Returns the brief description of this definition. This can include commands. */
+ QCString briefDescription() const;
+
+ /*! Returns a plain text version of the brief description suitable for use
+ * as a tool tip.
+ */
+ QCString briefDescriptionAsTooltip() const;
+
+ /*! Returns the line number at which the brief description was found. */
+ int briefLine() const;
+
+ /*! Returns the documentation found inside the body of a member */
+ QCString inbodyDocumentation() const;
+
+ /*! Returns the file in which the in body documentation was found */
+ QCString inbodyFile() const;
+
+ /*! Returns the line at which the first in body documentation
+ part was found */
+ int inbodyLine() const;
+
+ /*! Returns the file in which the brief description was found.
+ * This can differ from getDefFileName().
+ */
+ QCString briefFile() const;
+
+ /*! returns the file in which this definition was found */
+ QCString getDefFileName() const;
+
+ /*! returns the extension of the file in which this definition was found */
+ QCString getDefFileExtension() const;
+
+ /*! returns the line number at which the definition was found */
+ int getDefLine() const;
+
+ /*! Returns TRUE iff the definition is documented
+ * (which could be generated documentation)
+ * @see hasUserDocumentation()
+ */
+ virtual bool hasDocumentation() const;
+
+ /*! Returns TRUE iff the definition is documented by the user. */
+ virtual bool hasUserDocumentation() const;
+
+ /*! Returns TRUE iff it is possible to link to this item within this
+ * project.
+ */
+ virtual bool isLinkableInProject() const = 0;
+
+ /*! Returns TRUE iff it is possible to link to this item. This can
+ * be a link to another project imported via a tag file.
+ */
+ virtual bool isLinkable() const = 0;
+
+ /*! Returns TRUE iff the name is part of this project and
+ * may appear in the output
+ */
+ virtual bool isVisibleInProject() const;
+
+ /*! Returns TRUE iff the name may appear in the output */
+ virtual bool isVisible() const;
+
+ /*! Returns TRUE iff this item is supposed to be hidden from the output. */
+ bool isHidden() const;
+
+ /*! returns TRUE if this entity was artificially introduced, for
+ * instance because it is used to show a template instantiation relation.
+ */
+ bool isArtificial() const;
+
+ /*! If this definition was imported via a tag file, this function
+ * returns the tagfile for the external project. This can be
+ * translated into an external link target via
+ * Doxygen::tagDestinationDict
+ */
+ virtual QCString getReference() const;
+
+ /*! Returns TRUE if this definition is imported via a tag file. */
+ virtual bool isReference() const;
+
+ /*! Returns the first line of the body of this item (applicable to classes and
+ * functions).
+ */
+ int getStartBodyLine() const;
+
+ /*! Returns the last line of the body of this item (applicable to classes and
+ * functions).
+ */
+ int getEndBodyLine() const;
+
+ /*! Returns the file in which the body of this item is located or 0 if no
+ * body is available.
+ */
+ FileDef *getBodyDef();
+
+ LockingPtr<GroupList> partOfGroups() const;
+
+ LockingPtr< QList<ListItemInfo> > xrefListItems() const;
+
+ virtual Definition *findInnerCompound(const char *name);
+ virtual Definition *getOuterScope() const;
+
+ LockingPtr<MemberSDict> getReferencesMembers() const;
+ LockingPtr<MemberSDict> getReferencedByMembers() const;
+
+ //-----------------------------------------------------------------------------------
+ // ---- setters -----
+ //-----------------------------------------------------------------------------------
+
+ /*! Sets a new \a name for the definition */
+ void setName(const char *name);
+
+ /*! Sets the documentation of this definition to \a d. */
+ virtual void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE);
+
+ /*! Sets the brief description of this definition to \a b.
+ * A dot is added to the sentence if not available.
+ */
+ virtual void setBriefDescription(const char *b,const char *briefFile,int briefLine);
+
+ /*! Set the documentation that was found inside the body of an item.
+ * If there was already some documentation set, the new documentation
+ * will be appended.
+ */
+ virtual void setInbodyDocumentation(const char *d,const char *docFile,int docLine);
+
+ /*! Sets the tag file id via which this definition was imported. */
+ void setReference(const char *r);
+
+ /*! Add the list of anchors that mark the sections that are found in the
+ * documentation.
+ */
+ void addSectionsToDefinition(QList<SectionInfo> *anchorList);
+
+ // source references
+ void setBodySegment(int bls,int ble);
+ void setBodyDef(FileDef *fd);
+ void addSourceReferencedBy(MemberDef *d);
+ void addSourceReferences(MemberDef *d);
+
+ void setRefItems(const QList<ListItemInfo> *sli);
+ void mergeRefItems(Definition *d);
+ virtual void addInnerCompound(Definition *d);
+ virtual void setOuterScope(Definition *d);
+
+ void setHidden(bool b);
+
+ void setArtificial(bool b);
+
+ //-----------------------------------------------------------------------------------
+ // --- actions ----
+ //-----------------------------------------------------------------------------------
+
+ QCString convertNameToFile(const char *name,bool allowDots=FALSE) const;
+ void writeSourceDef(OutputList &ol,const char *scopeName);
+ void writeInlineCode(OutputList &ol,const char *scopeName);
+ void writeSourceRefs(OutputList &ol,const char *scopeName);
+ void writeSourceReffedBy(OutputList &ol,const char *scopeName);
+ void makePartOfGroup(GroupDef *gd);
+ void writePathFragment(OutputList &ol) const;
+ void writeNavigationPath(OutputList &ol) const;
+ virtual void writeQuickMemberLinks(OutputList &,MemberDef *) const {}
+ virtual void writeSummaryLinks(OutputList &) {}
+ QCString pathFragment() const;
+
+ /*! Writes the documentation anchors of the definition to
+ * the Doxygen::tagFile stream.
+ */
+ void writeDocAnchorsToTagFile();
+
+ protected:
+ void setLocalName(const QCString name);
+
+ virtual void flushToDisk() const;
+ virtual void loadFromDisk() const;
+ virtual void makeResident() const;
+ void lock() const {}
+ void unlock() const {}
+
+ private:
+
+ static void addToMap(const char *name,Definition *d);
+ static void removeFromMap(Definition *d);
+
+ void _setSymbolName(const QCString &name);
+
+ int _getXRefListId(const char *listName) const;
+ void _writeSourceRefList(OutputList &ol,const char *scopeName,
+ const QCString &text,MemberSDict *members,bool);
+ void _setBriefDescription(const char *b,const char *briefFile,int briefLine);
+ void _setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace,bool atTop);
+ void _setInbodyDocumentation(const char *d,const char *docFile,int docLine);
+ bool _docsAlreadyAdded(const QCString &doc);
+ DefinitionImpl *m_impl; // internal structure holding all private data
+ QCString m_name;
+ bool m_isSymbol;
+ QCString m_symbolName;
+
+};
+
+class DefinitionList : public QList<Definition>, public DefinitionIntf
+{
+ public:
+ ~DefinitionList() {}
+ DefType definitionType() const { return TypeSymbolList; }
+ int compareItems(GCI item1,GCI item2)
+ {
+ return stricmp(((Definition *)item1)->name(),
+ ((Definition *)item2)->name()
+ );
+ }
+
+};
+
+class DefinitionListIterator : public QListIterator<Definition>
+{
+ public:
+ DefinitionListIterator(const DefinitionList &l) :
+ QListIterator<Definition>(l) {}
+ ~DefinitionListIterator() {}
+};
+
+#endif
diff --git a/src/diagram.cpp b/src/diagram.cpp
new file mode 100644
index 0000000..3c7daa0
--- /dev/null
+++ b/src/diagram.cpp
@@ -0,0 +1,1301 @@
+/******************************************************************************
+ *
+ * $Id: diagram.cpp,v 1.30 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <qlist.h>
+#include <qarray.h>
+#include "ftextstream.h"
+#include <qfile.h>
+
+#include "diagram.h"
+#include "image.h"
+#include "classdef.h"
+#include "config.h"
+#include "message.h"
+#include "util.h"
+#include "doxygen.h"
+#include "portable.h"
+#include "index.h"
+
+//-----------------------------------------------------------------------------
+
+const uint maxTreeWidth = 8;
+const int gridWidth = 100;
+const int gridHeight = 100;
+
+const uint labelHorSpacing = 10; // horizontal distance between labels
+const uint labelVertSpacing = 32; // vertical distance between labels
+const uint labelHorMargin = 6; // horiz. spacing between label and box
+const uint fontHeight = 12; // height of a character
+
+//static QCString escapeLatex(const char *s)
+//{
+// QCString result;
+// char c;
+// while ((c=*s++))
+// {
+// if (c=='_') result+="\\_";
+// else result+=c;
+// }
+// return result;
+//}
+
+static uint protToMask(Protection p)
+{
+ switch(p)
+ {
+ case Public: return 0xffffffff;
+ case Package: // package is not possible!
+ case Protected: return 0xcccccccc;
+ case Private: return 0xaaaaaaaa;
+ }
+ return 0;
+}
+
+static uint protToColor(Protection p)
+{
+ switch(p)
+ {
+ case Public: return 6;
+ case Package: // package is not possible!
+ case Protected: return 5;
+ case Private: return 4;
+ }
+ return 0;
+}
+
+static QCString protToString(Protection p)
+{
+ switch(p)
+ {
+ case Public: return "solid";
+ case Package: // package is not possible!
+ case Protected: return "dashed";
+ case Private: return "dotted";
+ }
+ return 0;
+}
+
+static uint virtToMask(Specifier p)
+{
+ switch(p)
+ {
+ case Normal: return 0xffffffff;
+ case Virtual: return 0xf0f0f0f0;
+ default: return 0;
+ }
+ return 0;
+}
+
+// pre: dil is not empty
+static Protection getMinProtectionLevel(DiagramItemList *dil)
+{
+ DiagramItem *di=dil->first();
+ Protection result=di->protection();
+ di=dil->next();
+ while (di)
+ {
+ Protection p=di->protection();
+ if (p!=result)
+ {
+ if (result==Protected && p==Public) result=p;
+ else if (result==Private) result=p;
+ }
+ di=dil->next();
+ }
+ return result;
+}
+
+static void writeBitmapBox(DiagramItem *di,Image *image,
+ int x,int y,int w,int h,bool firstRow,
+ bool hasDocs,bool children=FALSE)
+{
+ int colFill = hasDocs ? (firstRow ? 0 : 2) : 7;
+ int colBorder = (firstRow || !hasDocs) ? 1 : 3;
+ int l = Image::stringLength(di->label());
+ uint mask=virtToMask(di->virtualness());
+ image->fillRect(x+1,y+1,w-2,h-2,colFill,mask);
+ image->drawRect(x,y,w,h,colBorder,mask);
+ image->writeString(x+(w-l)/2, y+(h-fontHeight)/2, di->label(),1);
+ if (children)
+ {
+ int i;
+ for (i=0;i<5;i++)
+ image->drawHorzLine(y+h+i-6,x+w-2-i,x+w-2,firstRow?1:3,0xffffffff);
+ }
+}
+
+static void writeVectorBox(FTextStream &t,DiagramItem *di,
+ float x,float y,bool children=FALSE)
+{
+ if (di->virtualness()==Virtual) t << "dashed\n";
+ t << " (" << di->label() << ") " << x << " " << y << " box\n";
+ if (children) t << x << " " << y << " mark\n";
+ if (di->virtualness()==Virtual) t << "solid\n";
+}
+
+static void writeMapArea(FTextStream &t,ClassDef *cd,QCString relPath,
+ int x,int y,int w,int h)
+{
+ if (cd->isLinkable())
+ {
+ QCString ref=cd->getReference();
+ t << "<area ";
+ if (!ref.isEmpty())
+ {
+ t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
+ }
+ t << "href=\"";
+ t << externalRef(relPath,ref,TRUE);
+ t << cd->getOutputFileBase() << Doxygen::htmlFileExtension;
+ if (!cd->anchor().isEmpty())
+ {
+ t << "#" << cd->anchor();
+ }
+ t << "\" ";
+ QCString tooltip = cd->briefDescriptionAsTooltip();
+ if (!tooltip.isEmpty())
+ {
+ t << "title=\"" << tooltip << "\" ";
+ }
+ t << "alt=\"" << convertToXML(cd->displayName());
+ t << "\" shape=\"rect\" coords=\"" << x << "," << y << ",";
+ t << (x+w) << "," << (y+h) << "\"/>" << endl;
+ }
+}
+//-----------------------------------------------------------------------------
+
+DiagramItem::DiagramItem(DiagramItem *p,int number,ClassDef *cd,
+ Protection pr,Specifier vi,const char *ts)
+{
+ parent=p;
+ x=y=0;
+ //name=n;
+ num=number;
+ children = new DiagramItemList;
+ prot=pr;
+ virt=vi;
+ inList=FALSE;
+ classDef=cd;
+ templSpec=ts;
+}
+
+DiagramItem::~DiagramItem()
+{
+ delete children;
+}
+
+QCString DiagramItem::label() const
+{
+ QCString result;
+ if (!templSpec.isEmpty())
+ {
+ // we use classDef->name() here and not diplayName() in order
+ // to get the name used in the inheritance relation.
+ result=insertTemplateSpecifierInScope(classDef->name(),templSpec);
+ }
+ else
+ {
+ result=classDef->displayName();
+ }
+ if (Config_getBool("HIDE_SCOPE_NAMES")) result=stripScope(result);
+ return result;
+}
+
+QCString DiagramItem::fileName() const
+{
+ return classDef->getOutputFileBase();
+}
+
+int DiagramItem::avgChildPos() const
+{
+ DiagramItem *di;
+ int c=children->count();
+ if (c==0) // no children -> don't move
+ return xPos();
+ if ((di=children->getFirst())->isInList()) // children should be in a list
+ return di->xPos();
+ if (c&1) // odd number of children -> get pos of middle child
+ return children->at(c/2)->xPos();
+ else // even number of children -> get middle of most middle children
+ return (children->at(c/2-1)->xPos()+children->at(c/2)->xPos())/2;
+}
+
+int DiagramItem::numChildren() const
+{
+ return children->count();
+}
+
+void DiagramItem::addChild(DiagramItem *di)
+{
+ children->append(di);
+}
+
+void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
+ Protection prot,Specifier virt,const char *ts)
+{
+ //if (cd->visited) return; // the visit check does not work in case of
+ // multiple inheritance of the same class!
+ DiagramItem *di=new DiagramItem(parent, diagram->at(level)->count(),
+ cd,prot,virt,ts);
+ //cd->visited=TRUE;
+ if (parent) parent->addChild(di);
+ di->move(count()*gridWidth,level*gridHeight);
+ append(di);
+ BaseClassList *bcl=doBases ? cd->baseClasses() : cd->subClasses();
+ int count=0;
+ if (bcl)
+ {
+ /* there are base/sub classes */
+ BaseClassDef *bcd=bcl->first();
+ while (bcd)
+ {
+ ClassDef *ccd=bcd->classDef;
+ if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/) count++;
+ bcd=bcl->next();
+ }
+ }
+ if (count>0 && (prot!=Private || !doBases))
+ {
+ DiagramRow *row=0;
+ if (diagram->count()<=level+1) /* add new row */
+ {
+ row = new DiagramRow(diagram,level+1);
+ diagram->append(row);
+ }
+ else /* get next row */
+ {
+ row=diagram->at(level+1);
+ }
+ /* insert base classes in the next row */
+ BaseClassDef *bcd=bcl->first();
+ while (bcd)
+ {
+ ClassDef *ccd=bcd->classDef;
+ if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/)
+ {
+ row->insertClass(di,ccd,doBases,bcd->prot,
+ doBases?bcd->virt:Normal,
+ doBases?bcd->templSpecifiers.data():"");
+ }
+ bcd=bcl->next();
+ }
+ }
+}
+
+TreeDiagram::TreeDiagram(ClassDef *root,bool doBases)
+{
+ setAutoDelete(TRUE);
+ DiagramRow *row=new DiagramRow(this,0);
+ append(row);
+ row->insertClass(0,root,doBases,Public,Normal,0);
+}
+
+TreeDiagram::~TreeDiagram()
+{
+}
+
+
+void TreeDiagram::moveChildren(DiagramItem *root,int dx)
+{
+ DiagramItemList *dil=root->getChildren();
+ DiagramItem *di=dil->first();
+ while (di)
+ {
+ di->move(dx,0);
+ moveChildren(di,dx);
+ di=dil->next();
+ }
+}
+
+bool TreeDiagram::layoutTree(DiagramItem *root,int r)
+{
+ bool moved=FALSE;
+ //printf("layoutTree(%s,%d)\n",root->label().data(),r);
+
+ DiagramItemList *dil=root->getChildren();
+ if (dil->count()>0)
+ {
+ uint k;
+ int pPos=root->xPos();
+ int cPos=root->avgChildPos();
+ if (pPos>cPos) // move children
+ {
+ DiagramRow *row=at(r+1);
+ //printf("Moving children %d-%d in row %d\n",
+ // dil->getFirst()->number(),row->count()-1,r+1);
+ for (k=dil->getFirst()->number();k<row->count();k++)
+ row->at(k)->move(pPos-cPos,0);
+ moved=TRUE;
+ }
+ else if (pPos<cPos) // move parent
+ {
+ DiagramRow *row=at(r);
+ //printf("Moving parents %d-%d in row %d\n",
+ // root->number(),row->count()-1,r);
+ for (k=root->number();k<row->count();k++)
+ row->at(k)->move(cPos-pPos,0);
+ moved=TRUE;
+ }
+
+ // recurse to children
+ DiagramItem *di=dil->first();
+ while (di && !moved && !di->isInList())
+ {
+ moved = layoutTree(di,r+1);
+ di=dil->next();
+ }
+ }
+ return moved;
+}
+
+void TreeDiagram::computeLayout()
+{
+ DiagramRow *row=first();
+ while (row && row->count()<maxTreeWidth) row=next();
+ if (row)
+ {
+ //printf("computeLayout() list row at %d\n",row->number());
+ DiagramItem *di=row->first();
+ DiagramItem *opi=0;
+ int delta=0;
+ bool first=TRUE;
+ while (di)
+ {
+ DiagramItem *pi=di->parentItem();
+ if (pi==opi && !first) { delta-=gridWidth; }
+ first = pi!=opi;
+ opi=pi;
+ di->move(delta,0); // collapse all items in the same
+ // list (except the first)
+ di->putInList();
+ di=row->next();
+ }
+ }
+
+ // re-organize the diagram items
+ DiagramItem *root=getFirst()->getFirst();
+ while (layoutTree(root,0)) { }
+
+ // move first items of the lists
+ if (row)
+ {
+ DiagramItem *di=row->first();
+ while (di)
+ {
+ DiagramItem *pi=di->parentItem();
+ if (pi->getChildren()->count()>1)
+ {
+ di->move(gridWidth,0);
+ while (di && di->parentItem()==pi) di=row->next();
+ }
+ else
+ {
+ di=row->next();
+ }
+ }
+ }
+}
+
+uint TreeDiagram::computeRows()
+{
+ //printf("TreeDiagram::computeRows()=%d\n",count());
+ int count=0;
+ DiagramRow *row=first();
+ while (row && !row->getFirst()->isInList())
+ {
+ count++;
+ row=next();
+ }
+ //printf("count=%d row=%p\n",count,row);
+ if (row)
+ {
+ int maxListLen=0;
+ int curListLen=0;
+ DiagramItem *di=row->first(),*opi=0;
+ while (di)
+ {
+ if (di->parentItem()!=opi) curListLen=1; else curListLen++;
+ if (curListLen>maxListLen) maxListLen=curListLen;
+ opi=di->parentItem();
+ di=row->next();
+ }
+ //printf("maxListLen=%d\n",maxListLen);
+ count+=maxListLen;
+ }
+ return count;
+}
+
+#if 0
+uint TreeDiagram::computeCols()
+{
+ uint count=0;
+ DiagramRow *row=first();
+ while (row && !row->getFirst()->isInList())
+ {
+ if (row->count()>count) count=row->count();
+ row=next();
+ }
+ if (row)
+ {
+ row=prev();
+ uint cols=row->count();
+ if (row->getLast()->getChildren()->count()>1) cols++;
+ if (cols>count) count=cols;
+ }
+ return count;
+};
+#endif
+
+void TreeDiagram::computeExtremes(uint *maxLabelLen,uint *maxXPos)
+{
+ uint ml=0,mx=0;
+ DiagramRow *dr=first();
+ bool done=FALSE;
+ while (dr && !done)
+ {
+ DiagramItem *di=dr->first();
+ while (di)
+ {
+ if (di->isInList()) done=TRUE;
+ if (maxXPos) mx=QMAX(mx,(uint)di->xPos());
+ if (maxLabelLen) ml=QMAX(ml,Image::stringLength(di->label()));
+ di=dr->next();
+ }
+ dr=next();
+ }
+ if (maxLabelLen) *maxLabelLen=ml;
+ if (maxXPos) *maxXPos=mx;
+}
+
+void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
+ bool doBase,bool bitmap,
+ uint baseRows,uint superRows,
+ uint cellWidth,uint cellHeight,
+ QCString relPath,
+ bool generateMap)
+{
+ DiagramRow *dr=first();
+ if (!doBase) dr=next();
+ bool done=FALSE;
+ bool firstRow = doBase;
+ while (dr && !done)
+ {
+ int x=0,y=0;
+ float xf=0.0,yf=0.0;
+ DiagramItem *di=dr->first();
+ if (di->isInList()) // put boxes in a list
+ {
+ DiagramItem *opi=0;
+ if (doBase) di=dr->last();
+ while (di)
+ {
+ if (di->parentItem()==opi)
+ {
+ if (bitmap)
+ {
+ if (doBase) y -= cellHeight+labelVertSpacing;
+ else y += cellHeight+labelVertSpacing;
+ }
+ else
+ {
+ if (doBase) yf += 1.0;
+ else yf -= 1.0;
+ }
+ }
+ else
+ {
+ if (bitmap)
+ {
+ x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth;
+ if (doBase)
+ {
+ y = image->getHeight()-
+ superRows*cellHeight-
+ (superRows-1)*labelVertSpacing-
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ }
+ else
+ {
+ y = (baseRows-1)*(cellHeight+labelVertSpacing)+
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ }
+ }
+ else
+ {
+ xf = di->xPos()/(float)gridWidth;
+ if (doBase)
+ {
+ yf = di->yPos()/(float)gridHeight+superRows-1;
+ }
+ else
+ {
+ yf = superRows-1-di->yPos()/(float)gridHeight;
+ }
+ }
+ }
+ opi=di->parentItem();
+
+ if (bitmap)
+ {
+ bool hasDocs=di->getClassDef()->isLinkable();
+ writeBitmapBox(di,image,x,y,cellWidth,cellHeight,firstRow,
+ hasDocs,di->getChildren()->count()>0);
+ if (!firstRow && generateMap)
+ writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
+ }
+ else
+ {
+ writeVectorBox(t,di,xf,yf,di->getChildren()->count()>0);
+ }
+
+ if (doBase) di=dr->prev(); else di=dr->next();
+ }
+ done=TRUE;
+ }
+ else // draw a tree of boxes
+ {
+ while (di)
+ {
+ if (bitmap)
+ {
+ x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth;
+ if (doBase)
+ {
+ y = image->getHeight()-
+ superRows*cellHeight-
+ (superRows-1)*labelVertSpacing-
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ }
+ else
+ {
+ y = (baseRows-1)*(cellHeight+labelVertSpacing)+
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ }
+ bool hasDocs=di->getClassDef()->isLinkable();
+ writeBitmapBox(di,image,x,y,cellWidth,cellHeight,firstRow,hasDocs);
+ if (!firstRow && generateMap)
+ writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
+ }
+ else
+ {
+ xf=di->xPos()/(float)gridWidth;
+ if (doBase)
+ {
+ yf = di->yPos()/(float)gridHeight+superRows-1;
+ }
+ else
+ {
+ yf = superRows-1-di->yPos()/(float)gridHeight;
+ }
+ writeVectorBox(t,di,xf,yf);
+ }
+
+ di=dr->next();
+ }
+ }
+ dr=next();
+ firstRow=FALSE;
+ }
+}
+
+void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
+ bool doBase,bool bitmap,
+ uint baseRows,uint superRows,
+ uint cellWidth,uint cellHeight)
+{
+ DiagramRow *dr=first();
+ bool done=FALSE;
+ while (dr && !done) // for each row
+ {
+ DiagramItem *di=dr->first();
+ if (di->isInList()) // row consists of list connectors
+ {
+ int x=0,y=0,ys=0;
+ float xf=0.0,yf=0.0,ysf=0.0;
+ while (di)
+ {
+ DiagramItem *pi=di->parentItem();
+ DiagramItemList *dil=pi->getChildren();
+ DiagramItem *last=dil->getLast();
+ if (di==last) // single child
+ {
+ if (bitmap) // draw pixels
+ {
+ x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
+ if (doBase) // base classes
+ {
+ y = image->getHeight()-
+ (superRows-1)*(cellHeight+labelVertSpacing)-
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ image->drawVertArrow(x,y,y+labelVertSpacing/2,
+ protToColor(di->protection()),
+ protToMask(di->protection()));
+ }
+ else // super classes
+ {
+ y = (baseRows-1)*(cellHeight+labelVertSpacing)-
+ labelVertSpacing/2+
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ image->drawVertLine(x,y,y+labelVertSpacing/2,
+ protToColor(di->protection()),
+ protToMask(di->protection()));
+ }
+ }
+ else // draw vectors
+ {
+ t << protToString(di->protection()) << endl;
+ if (doBase)
+ {
+ t << "1 " << (di->xPos()/(float)gridWidth) << " "
+ << (di->yPos()/(float)gridHeight+superRows-1) << " in\n";
+ }
+ else
+ {
+ t << "0 " << (di->xPos()/(float)gridWidth) << " "
+ << ((float)superRows-0.25-di->yPos()/(float)gridHeight)
+ << " in\n";
+ }
+ }
+ }
+ else // multiple children, put them in a vertical list
+ {
+ if (bitmap)
+ {
+ x = di->parentItem()->xPos()*
+ (cellWidth+labelHorSpacing)/gridWidth+cellWidth/2;
+ if (doBase) // base classes
+ {
+ ys = image->getHeight()-
+ (superRows-1)*(cellHeight+labelVertSpacing)-
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ y = ys - cellHeight/2;
+ }
+ else // super classes
+ {
+ ys = (baseRows-1)*(cellHeight+labelVertSpacing)+
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ y = ys + cellHeight/2;
+ }
+ }
+ else
+ {
+ xf = di->parentItem()->xPos()/(float)gridWidth;
+ if (doBase)
+ {
+ ysf = di->yPos()/(float)gridHeight+superRows-1;
+ yf = ysf + 0.5;
+ }
+ else
+ {
+ ysf = (float)superRows-0.25-di->yPos()/(float)gridHeight;
+ yf = ysf - 0.25;
+ }
+ }
+ while (di!=last) // more children to add
+ {
+ if (bitmap)
+ {
+ if (doBase) // base classes
+ {
+ image->drawHorzArrow(y,x,x+cellWidth/2+labelHorSpacing,
+ protToColor(di->protection()),
+ protToMask(di->protection()));
+ y -= cellHeight+labelVertSpacing;
+ }
+ else // super classes
+ {
+ image->drawHorzLine(y,x,x+cellWidth/2+labelHorSpacing,
+ protToColor(di->protection()),
+ protToMask(di->protection()));
+ y += cellHeight+labelVertSpacing;
+ }
+ }
+ else
+ {
+ t << protToString(di->protection()) << endl;
+ if (doBase)
+ {
+ t << "1 " << xf << " " << yf << " hedge\n";
+ yf += 1.0;
+ }
+ else
+ {
+ t << "0 " << xf << " " << yf << " hedge\n";
+ yf -= 1.0;
+ }
+ }
+ di=dr->next();
+ }
+ // add last horizonal line and a vertical connection line
+ if (bitmap)
+ {
+ if (doBase) // base classes
+ {
+ image->drawHorzArrow(y,x,x+cellWidth/2+labelHorSpacing,
+ protToColor(di->protection()),
+ protToMask(di->protection()));
+ image->drawVertLine(x,y,ys+labelVertSpacing/2,
+ protToColor(getMinProtectionLevel(dil)),
+ protToMask(getMinProtectionLevel(dil)));
+ }
+ else // super classes
+ {
+ image->drawHorzLine(y,x,x+cellWidth/2+labelHorSpacing,
+ protToColor(di->protection()),
+ protToMask(di->protection()));
+ image->drawVertLine(x,ys-labelVertSpacing/2,y,
+ protToColor(getMinProtectionLevel(dil)),
+ protToMask(getMinProtectionLevel(dil)));
+ }
+ }
+ else
+ {
+ t << protToString(di->protection()) << endl;
+ if (doBase)
+ {
+ t << "1 " << xf << " " << yf << " hedge\n";
+ }
+ else
+ {
+ t << "0 " << xf << " " << yf << " hedge\n";
+ }
+ t << protToString(getMinProtectionLevel(dil)) << endl;
+ if (doBase)
+ {
+ t << xf << " " << ysf << " " << yf << " vedge\n";
+ }
+ else
+ {
+ t << xf << " " << (ysf + 0.25) << " " << yf << " vedge\n";
+ }
+ }
+ }
+ di=dr->next();
+ }
+ done=TRUE; // the tree is drawn now
+ }
+ else // normal tree connector
+ {
+ while (di)
+ {
+ int x=0,y=0;
+ DiagramItemList *dil = di->getChildren();
+ DiagramItem *parent = di->parentItem();
+ if (parent) // item has a parent -> connect to it
+ {
+ if (bitmap) // draw pixels
+ {
+ x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
+ if (doBase) // base classes
+ {
+ y = image->getHeight()-
+ (superRows-1)*(cellHeight+labelVertSpacing)-
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ /* write input line */
+ image->drawVertArrow(x,y,y+labelVertSpacing/2,
+ protToColor(di->protection()),
+ protToMask(di->protection()));
+ }
+ else // super classes
+ {
+ y = (baseRows-1)*(cellHeight+labelVertSpacing)-
+ labelVertSpacing/2+
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ /* write output line */
+ image->drawVertLine(x,y,y+labelVertSpacing/2,
+ protToColor(di->protection()),
+ protToMask(di->protection()));
+ }
+ }
+ else // draw pixels
+ {
+ t << protToString(di->protection()) << endl;
+ if (doBase)
+ {
+ t << "1 " << di->xPos()/(float)gridWidth << " "
+ << (di->yPos()/(float)gridHeight+superRows-1) << " in\n";
+ }
+ else
+ {
+ t << "0 " << di->xPos()/(float)gridWidth << " "
+ << ((float)superRows-0.25-di->yPos()/(float)gridHeight)
+ << " in\n";
+ }
+ }
+ }
+ if (dil->count()>0)
+ {
+ Protection p=getMinProtectionLevel(dil);
+ uint mask=protToMask(p);
+ uint col=protToColor(p);
+ if (bitmap)
+ {
+ x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
+ if (doBase) // base classes
+ {
+ y = image->getHeight()-
+ (superRows-1)*(cellHeight+labelVertSpacing)-
+ cellHeight-labelVertSpacing/2-
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ image->drawVertLine(x,y,y+labelVertSpacing/2-1,col,mask);
+ }
+ else // super classes
+ {
+ y = (baseRows-1)*(cellHeight+labelVertSpacing)+
+ cellHeight+
+ di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
+ image->drawVertArrow(x,y,y+labelVertSpacing/2-1,col,mask);
+ }
+ }
+ else
+ {
+ t << protToString(p) << endl;
+ if (doBase)
+ {
+ t << "0 " << di->xPos()/(float)gridWidth << " "
+ << (di->yPos()/(float)gridHeight+superRows-1) << " out\n";
+ }
+ else
+ {
+ t << "1 " << di->xPos()/(float)gridWidth << " "
+ << ((float)superRows-1.75-di->yPos()/(float)gridHeight)
+ << " out\n";
+ }
+ }
+ /* write input line */
+ DiagramItem *first = dil->first();
+ DiagramItem *last = dil->last();
+ if (first!=last && !first->isInList()) /* connect with all base classes */
+ {
+ if (bitmap)
+ {
+ int xs = first->xPos()*(cellWidth+labelHorSpacing)/gridWidth
+ + cellWidth/2;
+ int xe = last->xPos()*(cellWidth+labelHorSpacing)/gridWidth
+ + cellWidth/2;
+ if (doBase) // base classes
+ {
+ image->drawHorzLine(y,xs,xe,col,mask);
+ }
+ else // super classes
+ {
+ image->drawHorzLine(y+labelVertSpacing/2,xs,xe,col,mask);
+ }
+ }
+ else
+ {
+ t << protToString(p) << endl;
+ if (doBase)
+ {
+ t << first->xPos()/(float)gridWidth << " "
+ << last->xPos()/(float)gridWidth << " "
+ << (first->yPos()/(float)gridHeight+superRows-1)
+ << " conn\n";
+ }
+ else
+ {
+ t << first->xPos()/(float)gridWidth << " "
+ << last->xPos()/(float)gridWidth << " "
+ << ((float)superRows-first->yPos()/(float)gridHeight)
+ << " conn\n";
+ }
+ }
+ }
+ }
+ di=dr->next();
+ }
+ dr=next();
+ }
+ }
+}
+
+
+void clearVisitFlags()
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for (;(cd=cli.current());++cli)
+ {
+ cd->visited=FALSE;
+ }
+}
+
+ClassDiagram::ClassDiagram(ClassDef *root)
+{
+ clearVisitFlags();
+ base = new TreeDiagram(root,TRUE);
+ base->computeLayout();
+ clearVisitFlags();
+ super = new TreeDiagram(root,FALSE);
+ super->computeLayout();
+ DiagramItem *baseItem = base->first()->first();
+ DiagramItem *superItem = super->first()->first();
+ int xbase = baseItem->xPos();
+ int xsuper = superItem->xPos();
+ if (xbase>xsuper)
+ {
+ superItem->move(xbase-xsuper,0);
+ super->moveChildren(superItem,xbase-xsuper);
+ }
+ else if (xbase<xsuper)
+ {
+ baseItem->move(xsuper-xbase,0);
+ base->moveChildren(baseItem,xsuper-xbase);
+ }
+}
+
+ClassDiagram::~ClassDiagram()
+{
+ delete base;
+ delete super;
+}
+
+void ClassDiagram::writeFigure(FTextStream &output,const char *path,
+ const char *fileName) const
+{
+ uint baseRows=base->computeRows();
+ uint superRows=super->computeRows();
+ uint baseMaxX, baseMaxLabelWidth, superMaxX, superMaxLabelWidth;
+ base->computeExtremes(&baseMaxLabelWidth,&baseMaxX);
+ super->computeExtremes(&superMaxLabelWidth,&superMaxX);
+
+ uint rows=baseRows+superRows-1;
+ uint cols=(QMAX(baseMaxX,superMaxX)+gridWidth*2-1)/gridWidth;
+
+ // Estimate the image aspect width and height in pixels.
+ uint estHeight = rows*40;
+ uint estWidth = cols*(20+QMAX(baseMaxLabelWidth,superMaxLabelWidth));
+ //printf("Estimated size %d x %d\n",estWidth,estHeight);
+
+ const float pageWidth = 14.0; // estimated page width in cm.
+ // Somewhat lower to deal with estimation
+ // errors.
+
+ // compute the image height in centimeters based on the estimates
+ float realHeight = QMIN(rows,12); // real height in cm
+ float realWidth = realHeight * estWidth/(float)estHeight;
+ if (realWidth>pageWidth) // assume that the page width is about 15 cm
+ {
+ realHeight*=pageWidth/realWidth;
+ realWidth=pageWidth;
+ }
+
+ //output << "}\n";
+ output << "\\begin{figure}[H]\n"
+ "\\begin{center}\n"
+ "\\leavevmode\n";
+ output << "\\includegraphics[height=" << realHeight << "cm]{"
+ << fileName << "}" << endl;
+ output << "\\end{center}\n"
+ "\\end{figure}\n";
+
+ //printf("writeFigure rows=%d cols=%d\n",rows,cols);
+
+ QCString epsBaseName=(QCString)path+"/"+fileName;
+ QCString epsName=epsBaseName+".eps";
+ QFile f1;
+ f1.setName(epsName.data());
+ if (!f1.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",convertToQCString(f1.name()).data());
+ exit(1);
+ }
+ FTextStream t(&f1);
+
+ //printf("writeEPS() rows=%d cols=%d\n",rows,cols);
+
+ // generate EPS header and postscript variables and procedures
+
+ t << "%!PS-Adobe-2.0 EPSF-2.0\n";
+ t << "%%Title: ClassName\n";
+ t << "%%Creator: Doxygen\n";
+ t << "%%CreationDate: Time\n";
+ t << "%%For: \n";
+ t << "%Magnification: 1.00\n";
+ t << "%%Orientation: Portrait\n";
+ t << "%%BoundingBox: 0 0 500 " << estHeight*500.0/(float)estWidth << "\n";
+ t << "%%Pages: 0\n";
+ t << "%%BeginSetup\n";
+ t << "%%EndSetup\n";
+ t << "%%EndComments\n";
+ t << "\n";
+ t << "% ----- variables -----\n";
+ t << "\n";
+ t << "/boxwidth 0 def\n";
+ t << "/boxheight 40 def\n";
+ t << "/fontheight 24 def\n";
+ t << "/marginwidth 10 def\n";
+ t << "/distx 20 def\n";
+ t << "/disty 40 def\n";
+ t << "/boundaspect " << estWidth/(float)estHeight << " def % aspect ratio of the BoundingBox (width/height)\n";
+ t << "/boundx 500 def\n";
+ t << "/boundy boundx boundaspect div def\n";
+ t << "/xspacing 0 def\n";
+ t << "/yspacing 0 def\n";
+ t << "/rows " << rows << " def\n";
+ t << "/cols " << cols << " def\n";
+ t << "/scalefactor 0 def\n";
+ t << "/boxfont /Times-Roman findfont fontheight scalefont def\n";
+ t << "\n";
+ t << "% ----- procedures -----\n";
+ t << "\n";
+ t << "/dotted { [1 4] 0 setdash } def\n";
+ t << "/dashed { [5] 0 setdash } def\n";
+ t << "/solid { [] 0 setdash } def\n";
+ t << "\n";
+ t << "/max % result = MAX(arg1,arg2)\n";
+ t << "{\n";
+ t << " /a exch def\n";
+ t << " /b exch def\n";
+ t << " a b gt {a} {b} ifelse\n";
+ t << "} def\n";
+ t << "\n";
+ t << "/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)\n";
+ t << "{\n";
+ t << " 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max\n";
+ t << "} def\n";
+ t << "\n";
+ t << "/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))\n";
+ t << "{\n";
+ t << " /str exch def\n";
+ t << " /boxwidth boxwidth str stringwidth pop max def\n";
+ t << "} def\n";
+ t << "\n";
+ t << "/box % draws a box with text `arg1' at grid pos (arg2,arg3)\n";
+ t << "{ gsave\n";
+ t << " 2 setlinewidth\n";
+ t << " newpath\n";
+ t << " exch xspacing mul xoffset add\n";
+ t << " exch yspacing mul\n";
+ t << " moveto\n";
+ t << " boxwidth 0 rlineto \n";
+ t << " 0 boxheight rlineto \n";
+ t << " boxwidth neg 0 rlineto \n";
+ t << " 0 boxheight neg rlineto \n";
+ t << " closepath\n";
+ t << " dup stringwidth pop neg boxwidth add 2 div\n";
+ t << " boxheight fontheight 2 div sub 2 div\n";
+ t << " rmoveto show stroke\n";
+ t << " grestore\n";
+ t << "} def \n";
+ t << "\n";
+ t << "/mark\n";
+ t << "{ newpath\n";
+ t << " exch xspacing mul xoffset add boxwidth add\n";
+ t << " exch yspacing mul\n";
+ t << " moveto\n";
+ t << " 0 boxheight 4 div rlineto\n";
+ t << " boxheight neg 4 div boxheight neg 4 div rlineto\n";
+ t << " closepath\n";
+ t << " eofill\n";
+ t << " stroke\n";
+ t << "} def\n";
+ t << "\n";
+ t << "/arrow\n";
+ t << "{ newpath\n";
+ t << " moveto\n";
+ t << " 3 -8 rlineto\n";
+ t << " -6 0 rlineto\n";
+ t << " 3 8 rlineto\n";
+ t << " closepath\n";
+ t << " eofill\n";
+ t << " stroke\n";
+ t << "} def\n";
+ t << "\n";
+ t << "/out % draws an output connector for the block at (arg1,arg2)\n";
+ t << "{\n";
+ t << " newpath\n";
+ t << " exch xspacing mul xoffset add boxwidth 2 div add\n";
+ t << " exch yspacing mul boxheight add\n";
+ t << " /y exch def\n";
+ t << " /x exch def\n";
+ t << " x y moveto\n";
+ t << " 0 disty 2 div rlineto \n";
+ t << " stroke\n";
+ t << " 1 eq { x y disty 2 div add arrow } if\n";
+ t << "} def\n";
+ t << "\n";
+ t << "/in % draws an input connector for the block at (arg1,arg2)\n";
+ t << "{\n";
+ t << " newpath\n";
+ t << " exch xspacing mul xoffset add boxwidth 2 div add\n";
+ t << " exch yspacing mul disty 2 div sub\n";
+ t << " /y exch def\n";
+ t << " /x exch def\n";
+ t << " x y moveto\n";
+ t << " 0 disty 2 div rlineto\n";
+ t << " stroke\n";
+ t << " 1 eq { x y disty 2 div add arrow } if\n";
+ t << "} def\n";
+ t << "\n";
+ t << "/hedge\n";
+ t << "{\n";
+ t << " exch xspacing mul xoffset add boxwidth 2 div add\n";
+ t << " exch yspacing mul boxheight 2 div sub\n";
+ t << " /y exch def\n";
+ t << " /x exch def\n";
+ t << " newpath\n";
+ t << " x y moveto\n";
+ t << " boxwidth 2 div distx add 0 rlineto\n";
+ t << " stroke\n";
+ t << " 1 eq\n";
+ t << " { newpath x boxwidth 2 div distx add add y moveto\n";
+ t << " -8 3 rlineto\n";
+ t << " 0 -6 rlineto\n";
+ t << " 8 3 rlineto\n";
+ t << " closepath\n";
+ t << " eofill\n";
+ t << " stroke\n";
+ t << " } if\n";
+ t << "} def\n";
+ t << "\n";
+ t << "/vedge\n";
+ t << "{\n";
+ t << " /ye exch def\n";
+ t << " /ys exch def\n";
+ t << " /xs exch def\n";
+ t << " newpath\n";
+ t << " xs xspacing mul xoffset add boxwidth 2 div add dup\n";
+ t << " ys yspacing mul boxheight 2 div sub\n";
+ t << " moveto\n";
+ t << " ye yspacing mul boxheight 2 div sub\n";
+ t << " lineto\n";
+ t << " stroke\n";
+ t << "} def\n";
+ t << "\n";
+ t << "/conn % connections the blocks from col `arg1' to `arg2' of row `arg3'\n";
+ t << "{\n";
+ t << " /ys exch def\n";
+ t << " /xe exch def\n";
+ t << " /xs exch def\n";
+ t << " newpath\n";
+ t << " xs xspacing mul xoffset add boxwidth 2 div add\n";
+ t << " ys yspacing mul disty 2 div sub\n";
+ t << " moveto\n";
+ t << " xspacing xe xs sub mul 0\n";
+ t << " rlineto\n";
+ t << " stroke\n";
+ t << "} def\n";
+ t << "\n";
+ t << "% ----- main ------\n";
+ t << "\n";
+ t << "boxfont setfont\n";
+ t << "1 boundaspect scale\n";
+
+
+ bool done=FALSE;
+ DiagramRow *dr=base->first();
+ while (dr && !done)
+ {
+ DiagramItem *di=dr->first();
+ while (di)
+ {
+ done=di->isInList();
+ t << "(" << di->label() << ") cw\n";
+ di=dr->next();
+ }
+ dr=base->next();
+ }
+ dr=super->first();
+ dr=super->next();
+ done=FALSE;
+ while (dr && !done)
+ {
+ DiagramItem *di=dr->first();
+ while (di)
+ {
+ done=di->isInList();
+ t << "(" << di->label() << ") cw\n";
+ di=dr->next();
+ }
+ dr=super->next();
+ }
+
+ t << "/boxwidth boxwidth marginwidth 2 mul add def\n"
+ << "/xspacing boxwidth distx add def\n"
+ << "/yspacing boxheight disty add def\n"
+ << "/scalefactor \n"
+ << " boxwidth cols mul distx cols 1 sub mul add\n"
+ << " boxheight rows mul disty rows 1 sub mul add boundaspect mul \n"
+ << " max def\n"
+ << "boundx scalefactor div boundy scalefactor div scale\n";
+
+ t << "\n% ----- classes -----\n\n";
+ base->drawBoxes(t,0,TRUE,FALSE,baseRows,superRows,0,0);
+ super->drawBoxes(t,0,FALSE,FALSE,baseRows,superRows,0,0);
+
+ t << "\n% ----- relations -----\n\n";
+ base->drawConnectors(t,0,TRUE,FALSE,baseRows,superRows,0,0);
+ super->drawConnectors(t,0,FALSE,FALSE,baseRows,superRows,0,0);
+
+ f1.close();
+ if (Config_getBool("USE_PDFLATEX"))
+ {
+ QCString epstopdfArgs(4096);
+ epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
+ epsBaseName.data(),epsBaseName.data());
+ //printf("Converting eps using `%s'\n",epstopdfCmd.data());
+ portable_sysTimerStart();
+ if (portable_system("epstopdf",epstopdfArgs)!=0)
+ {
+ err("error: Problems running epstopdf. Check your TeX installation!\n");
+ portable_sysTimerStop();
+ return;
+ }
+ portable_sysTimerStop();
+ }
+}
+
+
+void ClassDiagram::writeImage(FTextStream &t,const char *path,
+ const char *relPath,const char *fileName,
+ bool generateMap) const
+{
+ uint baseRows=base->computeRows();
+ uint superRows=super->computeRows();
+ uint rows=baseRows+superRows-1;
+
+ uint lb,ls,xb,xs;
+ base->computeExtremes(&lb,&xb);
+ super->computeExtremes(&ls,&xs);
+
+ uint cellWidth = QMAX(lb,ls)+labelHorMargin*2;
+ uint maxXPos = QMAX(xb,xs);
+ uint labelVertMargin = 6; //QMAX(6,(cellWidth-fontHeight)/6); // aspect at least 1:3
+ uint cellHeight = labelVertMargin*2+fontHeight;
+ uint imageWidth = (maxXPos+gridWidth)*cellWidth/gridWidth+
+ (maxXPos*labelHorSpacing)/gridWidth;
+ uint imageHeight = rows*cellHeight+(rows-1)*labelVertSpacing;
+
+ Image image(imageWidth,imageHeight);
+
+ base->drawBoxes(t,&image,TRUE,TRUE,baseRows,superRows,cellWidth,cellHeight,relPath,generateMap);
+ super->drawBoxes(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight,relPath,generateMap);
+ base->drawConnectors(t,&image,TRUE,TRUE,baseRows,superRows,cellWidth,cellHeight);
+ super->drawConnectors(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight);
+
+#define IMAGE_EXT ".png"
+ image.save((QCString)path+"/"+fileName+IMAGE_EXT);
+ Doxygen::indexList.addImageFile(QCString(fileName)+IMAGE_EXT);
+
+ if (generateMap) t << "</map>" << endl;
+}
+
diff --git a/src/diagram.h b/src/diagram.h
new file mode 100644
index 0000000..f920081
--- /dev/null
+++ b/src/diagram.h
@@ -0,0 +1,133 @@
+/******************************************************************************
+ *
+ * $Id: diagram.h,v 1.11 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include "entry.h"
+
+class ClassDef;
+class DiagramRow;
+class TreeDiagram;
+class ClassDiagram;
+class DiagramItemList;
+class Image;
+class FTextStream;
+
+class DiagramItem
+{
+ public:
+ DiagramItem(DiagramItem *p,int number,ClassDef *cd,
+ Protection prot,Specifier virt,const char *ts);
+ ~DiagramItem();
+ QCString label() const;
+ QCString fileName() const;
+ DiagramItem *parentItem() { return parent; }
+ DiagramItemList *getChildren() { return children; }
+ void move(int dx,int dy) { x+=dx; y+=dy; }
+ int xPos() const { return x; }
+ int yPos() const { return y; }
+ int avgChildPos() const;
+ int numChildren() const;
+ void addChild(DiagramItem *di);
+ int number() const { return num; }
+ Protection protection() const { return prot; }
+ Specifier virtualness() const { return virt; }
+ void putInList() { inList=TRUE; }
+ bool isInList() const { return inList; }
+ ClassDef *getClassDef() const { return classDef; }
+ private:
+ DiagramItemList *children;
+ DiagramItem *parent;
+ int x,y;
+ int num;
+ Protection prot;
+ Specifier virt;
+ QCString templSpec;
+ bool inList;
+ ClassDef *classDef;
+};
+
+class DiagramItemList : public QList<DiagramItem>
+{
+ public:
+ DiagramItemList() : QList<DiagramItem>() {}
+ ~DiagramItemList() {}
+};
+
+class DiagramRow : public QList<DiagramItem>
+{
+ public:
+ DiagramRow(TreeDiagram *d,int l) : QList<DiagramItem>()
+ {
+ diagram=d;
+ level=l;
+ setAutoDelete(TRUE);
+ }
+ void insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
+ Protection prot,Specifier virt,const char *ts);
+ uint number() { return level; }
+ private:
+ TreeDiagram *diagram;
+ uint level;
+};
+
+class DiagramRowIterator : public QListIterator<DiagramRow>
+{
+ public:
+ DiagramRowIterator(const QList<DiagramRow> &d)
+ : QListIterator<DiagramRow>(d) {}
+};
+
+class TreeDiagram : public QList<DiagramRow>
+{
+ public:
+ TreeDiagram(ClassDef *root,bool doBases);
+ ~TreeDiagram();
+ void computeLayout();
+ uint computeRows();
+ //uint computeCols();
+ void moveChildren(DiagramItem *root,int dx);
+ void computeExtremes(uint *labelWidth,uint *xpos);
+ void drawBoxes(FTextStream &t,Image *image,
+ bool doBase,bool bitmap,
+ uint baseRows,uint superRows,
+ uint cellWidth,uint cellHeight,
+ QCString relPath="",
+ bool generateMap=TRUE);
+ void drawConnectors(FTextStream &t,Image *image,
+ bool doBase,bool bitmap,
+ uint baseRows,uint superRows,
+ uint cellWidth,uint cellheight);
+ private:
+ bool layoutTree(DiagramItem *root,int row);
+ TreeDiagram &operator=(const TreeDiagram &);
+ TreeDiagram(const TreeDiagram &);
+};
+
+class ClassDiagram
+{
+ public:
+ ClassDiagram(ClassDef *root);
+ ~ClassDiagram();
+ void writeFigure(FTextStream &t,const char *path,
+ const char *file) const;
+ void writeImage(FTextStream &t,const char *path,const char *relPath,
+ const char *file,bool generateMap=TRUE) const;
+ private:
+ TreeDiagram *base;
+ TreeDiagram *super;
+};
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
new file mode 100644
index 0000000..2d15f54
--- /dev/null
+++ b/src/dirdef.cpp
@@ -0,0 +1,911 @@
+#include "md5.h"
+
+#include "dirdef.h"
+#include "filename.h"
+#include "doxygen.h"
+#include "util.h"
+#include "outputlist.h"
+#include "language.h"
+#include "message.h"
+#include "dot.h"
+#include "layout.h"
+#include "ftextstream.h"
+
+//----------------------------------------------------------------------
+// method implementation
+
+static int g_dirCount=0;
+
+DirDef::DirDef(const char *path) : Definition(path,1,path)
+{
+ // get display name (stipping the paths mentioned in STRIP_FROM_PATH)
+ m_dispName = stripFromPath(path);
+ // get short name (last part of path)
+ m_shortName = path;
+ if (m_shortName.at(m_shortName.length()-1)=='/')
+ { // strip trailing /
+ m_shortName = m_shortName.left(m_shortName.length()-1);
+ }
+ int pi=m_shortName.findRev('/');
+ if (pi!=-1)
+ { // remove everything till the last /
+ m_shortName = m_shortName.mid(pi+1);
+ }
+ setLocalName(m_shortName);
+
+ m_fileList = new FileList;
+ m_usedDirs = new QDict<UsedDir>(257);
+ m_usedDirs->setAutoDelete(TRUE);
+ m_dirCount = g_dirCount++;
+ m_level=-1;
+ m_parent=0;
+}
+
+DirDef::~DirDef()
+{
+ delete m_fileList;
+ delete m_usedDirs;
+}
+
+bool DirDef::isLinkableInProject() const
+{
+ return !isReference() && Config_getBool("SHOW_DIRECTORIES");
+}
+
+bool DirDef::isLinkable() const
+{
+ return isReference() || isLinkableInProject();
+}
+
+void DirDef::addSubDir(DirDef *subdir)
+{
+ m_subdirs.inSort(subdir);
+ subdir->setOuterScope(this);
+ subdir->m_parent=this;
+}
+
+void DirDef::addFile(FileDef *fd)
+{
+ m_fileList->inSort(fd);
+ fd->setDirDef(this);
+}
+
+static QCString encodeDirName(const QCString &anchor)
+{
+ QCString result;
+
+ // convert to md5 hash
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)anchor.data(),anchor.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ return sigStr;
+
+ // old algorithm
+
+// int l = anchor.length(),i;
+// for (i=0;i<l;i++)
+// {
+// char c = anchor.at(i);
+// if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))
+// {
+// result+=c;
+// }
+// else
+// {
+// static char hexStr[]="0123456789ABCDEF";
+// char escChar[]={ '_', 0, 0, 0 };
+// escChar[1]=hexStr[c>>4];
+// escChar[2]=hexStr[c&0xf];
+// result+=escChar;
+// }
+// }
+// return result;
+}
+
+QCString DirDef::getOutputFileBase() const
+{
+ return "dir_"+encodeDirName(name());
+ //return QCString().sprintf("dir_%06d",m_dirCount);
+}
+
+void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
+{
+ if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
+ !documentation().isEmpty())
+ {
+ ol.writeRuler();
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeAnchor(0,"details");
+ ol.popGeneratorState();
+ ol.startGroupHeader();
+ ol.parseText(title);
+ ol.endGroupHeader();
+
+ // repeat brief description
+ if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
+ {
+ ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ }
+ // separator between brief and details
+ if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
+ !documentation().isEmpty())
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::RTF);
+ // ol.newParagraph(); // FIXME:PARA
+ ol.enableAll();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.writeString("\n\n");
+ ol.popGeneratorState();
+ }
+
+ // write documentation
+ if (!documentation().isEmpty())
+ {
+ ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ }
+ }
+}
+
+void DirDef::writeBriefDescription(OutputList &ol)
+{
+ if (!briefDescription().isEmpty())
+ {
+ ol.startParagraph();
+ ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.writeString(" \n");
+ ol.enable(OutputGenerator::RTF);
+
+ if (Config_getBool("REPEAT_BRIEF") ||
+ !documentation().isEmpty()
+ )
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startTextLink(0,"details");
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ }
+ ol.popGeneratorState();
+
+ //ol.pushGeneratorState();
+ //ol.disable(OutputGenerator::RTF);
+ //ol.newParagraph();
+ //ol.popGeneratorState();
+ ol.endParagraph();
+ }
+ ol.writeSynopsis();
+}
+
+void DirDef::writeDirectoryGraph(OutputList &ol)
+{
+ // write graph dependency graph
+ if (/*Config_getBool("DIRECTORY_GRAPH") &&*/ Config_getBool("HAVE_DOT"))
+ {
+ DotDirDeps dirDep(this);
+ if (!dirDep.isTrivial())
+ {
+ msg("Generating dependency graph for directory %s\n",displayName().data());
+ ol.disable(OutputGenerator::Man);
+ //ol.startParagraph();
+ ol.startDirDepGraph();
+ //TODO: ol.parseText(theTranslator->trDirDepGraph());
+ ol.parseText((QCString)"Directory dependency graph for "+displayName()+":");
+ ol.endDirDepGraph(dirDep);
+ //ol.endParagraph();
+ ol.enableAll();
+ }
+ }
+}
+
+void DirDef::writeSubDirList(OutputList &ol)
+{
+ // write subdir list
+ if (m_subdirs.count()>0)
+ {
+ ol.startMemberHeader("subdirs");
+ ol.parseText(theTranslator->trDir(TRUE,FALSE));
+ ol.endMemberHeader();
+ ol.startMemberList();
+ DirDef *dd=m_subdirs.first();
+ while (dd)
+ {
+ ol.startMemberItem(0);
+ ol.parseText(theTranslator->trDir(FALSE,TRUE)+" ");
+ ol.insertMemberAlign();
+ ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName());
+ ol.endMemberItem();
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
+ }
+ if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+ {
+ ol.startParagraph();
+ ol.startMemberDescription();
+ ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),
+ FALSE, // indexWords
+ FALSE, // isExample
+ 0, // exampleName
+ FALSE, // single line
+ TRUE // link from index
+ );
+ ol.endMemberDescription();
+ ol.endParagraph();
+ }
+ dd=m_subdirs.next();
+ }
+
+ ol.endMemberList();
+ }
+}
+
+void DirDef::writeFileList(OutputList &ol)
+{
+ // write file list
+ if (m_fileList->count()>0)
+ {
+ ol.startMemberHeader("files");
+ ol.parseText(theTranslator->trFile(TRUE,FALSE));
+ ol.endMemberHeader();
+ ol.startMemberList();
+ FileDef *fd=m_fileList->first();
+ while (fd)
+ {
+ ol.startMemberItem(0);
+ ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
+ ol.insertMemberAlign();
+ if (fd->isLinkable())
+ {
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
+ }
+ else
+ {
+ ol.startBold();
+ ol.docify(fd->name());
+ ol.endBold();
+ }
+ if (fd->generateSourceFile())
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.docify(" ");
+ ol.startTextLink(fd->includeName(),0);
+ ol.docify("[");
+ ol.parseText(theTranslator->trCode());
+ ol.docify("]");
+ ol.endTextLink();
+ ol.popGeneratorState();
+ }
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl;
+ }
+ ol.endMemberItem();
+ if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+ {
+ ol.startParagraph();
+ ol.startMemberDescription();
+ ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),
+ FALSE, // indexWords
+ FALSE, // isExample
+ 0, // exampleName
+ FALSE, // single line
+ TRUE // link from index
+ );
+ ol.endMemberDescription();
+ ol.endParagraph();
+ }
+ fd=m_fileList->next();
+ }
+ ol.endMemberList();
+ }
+}
+
+void DirDef::startMemberDeclarations(OutputList &ol)
+{
+ ol.startMemberSections();
+}
+
+void DirDef::endMemberDeclarations(OutputList &ol)
+{
+ ol.endMemberSections();
+}
+
+void DirDef::writeDocumentation(OutputList &ol)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ ol.pushGeneratorState();
+
+ QCString shortTitle=theTranslator->trDirReference(m_shortName);
+ QCString title=theTranslator->trDirReference(m_dispName);
+ startFile(ol,getOutputFileBase(),name(),title,HLI_None,!generateTreeView);
+
+ if (!generateTreeView)
+ {
+ // write navigation path
+ writeNavigationPath(ol);
+ ol.endQuickIndices();
+ }
+
+ startTitle(ol,getOutputFileBase());
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.parseText(shortTitle);
+ ol.enableAll();
+ ol.disable(OutputGenerator::Html);
+ ol.parseText(title);
+ ol.popGeneratorState();
+ endTitle(ol,getOutputFileBase(),title);
+ ol.startContents();
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <compound kind=\"dir\">" << endl;
+ Doxygen::tagFile << " <name>" << convertToXML(displayName()) << "</name>" << endl;
+ Doxygen::tagFile << " <path>" << convertToXML(name()) << "</path>" << endl;
+ Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
+ }
+
+ //---------------------------------------- start flexible part -------------------------------
+
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::Directory));
+ LayoutDocEntry *lde;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ switch (lde->kind())
+ {
+ case LayoutDocEntry::BriefDesc:
+ writeBriefDescription(ol);
+ break;
+ case LayoutDocEntry::DirGraph:
+ writeDirectoryGraph(ol);
+ break;
+ case LayoutDocEntry::MemberDeclStart:
+ startMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::DirSubDirs:
+ writeSubDirList(ol);
+ break;
+ case LayoutDocEntry::DirFiles:
+ writeFileList(ol);
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
+ endMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::DetailedDesc:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeDetailedDescription(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::ClassIncludes:
+ case LayoutDocEntry::ClassInheritanceGraph:
+ case LayoutDocEntry::ClassNestedClasses:
+ case LayoutDocEntry::ClassCollaborationGraph:
+ case LayoutDocEntry::ClassAllMembersLink:
+ case LayoutDocEntry::ClassUsedFiles:
+ case LayoutDocEntry::NamespaceNestedNamespaces:
+ case LayoutDocEntry::NamespaceClasses:
+ case LayoutDocEntry::FileClasses:
+ case LayoutDocEntry::FileNamespaces:
+ case LayoutDocEntry::FileIncludes:
+ case LayoutDocEntry::FileIncludeGraph:
+ case LayoutDocEntry::FileIncludedByGraph:
+ case LayoutDocEntry::FileSourceLink:
+ case LayoutDocEntry::GroupClasses:
+ case LayoutDocEntry::GroupInlineClasses:
+ case LayoutDocEntry::GroupNamespaces:
+ case LayoutDocEntry::GroupDirs:
+ case LayoutDocEntry::GroupNestedGroups:
+ case LayoutDocEntry::GroupFiles:
+ case LayoutDocEntry::GroupGraph:
+ case LayoutDocEntry::GroupPageDocs:
+ case LayoutDocEntry::AuthorSection:
+ case LayoutDocEntry::MemberGroups:
+ case LayoutDocEntry::MemberDecl:
+ case LayoutDocEntry::MemberDef:
+ case LayoutDocEntry::MemberDefStart:
+ case LayoutDocEntry::MemberDefEnd:
+ err("Internal inconsistency: member %d should not be part of "
+ "LayoutDocManager::Directory entry list\n",lde->kind());
+ break;
+ }
+ }
+
+ //---------------------------------------- end flexible part -------------------------------
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ writeDocAnchorsToTagFile();
+ Doxygen::tagFile << " </compound>" << endl;
+ }
+
+ ol.endContents();
+
+ if (generateTreeView)
+ {
+ writeNavigationPath(ol);
+ }
+
+ endFile(ol,TRUE);
+ ol.popGeneratorState();
+
+
+}
+
+void DirDef::setLevel()
+{
+ if (m_level==-1) // level not set before
+ {
+ DirDef *p = parent();
+ if (p)
+ {
+ p->setLevel();
+ m_level = p->level()+1;
+ }
+ else
+ {
+ m_level = 0;
+ }
+ }
+}
+
+/** Add as "uses" dependency between \a this dir and \a dir,
+ * that was caused by a dependency on file \a fd.
+ */
+void DirDef::addUsesDependency(DirDef *dir,FileDef *srcFd,
+ FileDef *dstFd,bool inherited)
+{
+ if (this==dir) return; // do not add self-dependencies
+ //static int count=0;
+ //printf(" %d add dependency %s->%s due to %s->%s\n",
+ // count++,shortName().data(),
+ // dir->shortName().data(),
+ // srcFd->name().data(),
+ // dstFd->name().data());
+
+ // levels match => add direct dependency
+ bool added=FALSE;
+ UsedDir *usedDir = m_usedDirs->find(dir->getOutputFileBase());
+ if (usedDir) // dir dependency already present
+ {
+ FilePair *usedPair = usedDir->findFilePair(
+ srcFd->getOutputFileBase()+dstFd->getOutputFileBase());
+ if (usedPair==0) // new file dependency
+ {
+ //printf(" => new file\n");
+ usedDir->addFileDep(srcFd,dstFd);
+ added=TRUE;
+ }
+ else
+ {
+ // dir & file dependency already added
+ }
+ }
+ else // new directory dependency
+ {
+ //printf(" => new file\n");
+ usedDir = new UsedDir(dir,inherited);
+ usedDir->addFileDep(srcFd,dstFd);
+ m_usedDirs->insert(dir->getOutputFileBase(),usedDir);
+ added=TRUE;
+ }
+ if (added)
+ {
+ if (dir->parent())
+ {
+ // add relation to parent of used dir
+ addUsesDependency(dir->parent(),srcFd,dstFd,inherited);
+ }
+ if (parent())
+ {
+ // add relation for the parent of this dir as well
+ parent()->addUsesDependency(dir,srcFd,dstFd,TRUE);
+ }
+ }
+}
+
+/** Computes the dependencies between directories
+ */
+void DirDef::computeDependencies()
+{
+ FileList *fl = m_fileList;
+ if (fl)
+ {
+ QListIterator<FileDef> fli(*fl);
+ FileDef *fd;
+ for (fli.toFirst();(fd=fli.current());++fli) // foreach file in dir dd
+ {
+ //printf(" File %s\n",fd->name().data());
+ //printf("** dir=%s file=%s\n",shortName().data(),fd->name().data());
+ QList<IncludeInfo> *ifl = fd->includeFileList();
+ if (ifl)
+ {
+ QListIterator<IncludeInfo> ifli(*ifl);
+ IncludeInfo *ii;
+ for (ifli.toFirst();(ii=ifli.current());++ifli) // foreach include file
+ {
+ //printf(" > %s\n",ii->includeName.data());
+ //printf(" #include %s\n",ii->includeName.data());
+ if (ii->fileDef && ii->fileDef->isLinkable()) // linkable file
+ {
+ DirDef *usedDir = ii->fileDef->getDirDef();
+ if (usedDir)
+ {
+ // add dependency: thisDir->usedDir
+ //static int count=0;
+ //printf(" %d: add dependency %s->%s\n",count++,name().data(),usedDir->name().data());
+ addUsesDependency(usedDir,fd,ii->fileDef,FALSE);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+bool DirDef::isParentOf(DirDef *dir) const
+{
+ if (dir->parent()==this) // this is a parent of dir
+ return TRUE;
+ else if (dir->parent()) // repeat for the parent of dir
+ return isParentOf(dir->parent());
+ else
+ return FALSE;
+}
+
+bool DirDef::depGraphIsTrivial() const
+{
+ return FALSE;
+}
+
+//----------------------------------------------------------------------
+
+int FilePairDict::compareItems(GCI item1,GCI item2)
+{
+ FilePair *left = (FilePair*)item1;
+ FilePair *right = (FilePair*)item2;
+ int orderHi = stricmp(left->source()->name(),right->source()->name());
+ int orderLo = stricmp(left->destination()->name(),right->destination()->name());
+ return orderHi==0 ? orderLo : orderHi;
+}
+
+//----------------------------------------------------------------------
+
+UsedDir::UsedDir(DirDef *dir,bool inherited) :
+ m_dir(dir), m_filePairs(7), m_inherited(inherited)
+{
+ m_filePairs.setAutoDelete(TRUE);
+}
+
+UsedDir::~UsedDir()
+{
+}
+
+
+void UsedDir::addFileDep(FileDef *srcFd,FileDef *dstFd)
+{
+ m_filePairs.inSort(srcFd->getOutputFileBase()+dstFd->getOutputFileBase(),
+ new FilePair(srcFd,dstFd));
+}
+
+FilePair *UsedDir::findFilePair(const char *name)
+{
+ QCString n=name;
+ return n.isEmpty() ? 0 : m_filePairs.find(n);
+}
+
+DirDef *DirDef::createNewDir(const char *path)
+{
+ ASSERT(path!=0);
+ DirDef *dir = Doxygen::directories->find(path);
+ if (dir==0) // new dir
+ {
+ //printf("Adding new dir %s\n",path);
+ dir = new DirDef(path);
+ //printf("createNewDir %s short=%s\n",path,dir->shortName().data());
+ Doxygen::directories->inSort(path,dir);
+ }
+ return dir;
+}
+
+bool DirDef::matchPath(const QCString &path,QStrList &l)
+{
+ const char *s=l.first();
+ while (s)
+ {
+ QCString prefix = s;
+ if (stricmp(prefix.left(path.length()),path)==0) // case insensitive compare
+ {
+ return TRUE;
+ }
+ s = l.next();
+ }
+ return FALSE;
+}
+
+/*! strip part of \a path if it matches
+ * one of the paths in the Config_getList("STRIP_FROM_PATH") list
+ */
+DirDef *DirDef::mergeDirectoryInTree(const QCString &path)
+{
+ //printf("DirDef::mergeDirectoryInTree(%s)\n",path.data());
+ int p=0,i=0;
+ DirDef *dir=0;
+ while ((i=path.find('/',p))!=-1)
+ {
+ QCString part=path.left(i+1);
+ if (!matchPath(part,Config_getList("STRIP_FROM_PATH")) && part!="/")
+ {
+ dir=createNewDir(part);
+ }
+ p=i+1;
+ }
+ return dir;
+}
+
+void DirDef::writeDepGraph(FTextStream &t)
+{
+ writeDotDirDepGraph(t,this);
+}
+
+//----------------------------------------------------------------------
+
+static void writePartialDirPath(OutputList &ol,const DirDef *root,const DirDef *target)
+{
+ if (target->parent()!=root)
+ {
+ writePartialDirPath(ol,root,target->parent());
+ ol.writeString("&#160;/&#160;");
+ }
+ ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),0,target->shortName());
+}
+
+static void writePartialFilePath(OutputList &ol,const DirDef *root,const FileDef *fd)
+{
+ if (fd->getDirDef() && fd->getDirDef()!=root)
+ {
+ writePartialDirPath(ol,root,fd->getDirDef());
+ ol.writeString("&#160;/&#160;");
+ }
+ if (fd->isLinkable())
+ {
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
+ }
+ else
+ {
+ ol.startBold();
+ ol.docify(fd->name());
+ ol.endBold();
+ }
+}
+
+void DirRelation::writeDocumentation(OutputList &ol)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QCString shortTitle=theTranslator->trDirRelation(
+ m_src->shortName()+" &rarr; "+
+ m_dst->dir()->shortName());
+ QCString title=theTranslator->trDirRelation(
+ m_src->displayName()+" -> "+
+ m_dst->dir()->shortName());
+ startFile(ol,getOutputFileBase(),getOutputFileBase(),
+ title,HLI_None,!generateTreeView,m_src->getOutputFileBase());
+
+ if (!generateTreeView)
+ {
+ // write navigation path
+ m_src->writeNavigationPath(ol);
+ ol.endQuickIndices();
+ }
+ ol.startContents();
+
+ ol.writeString("<h3>"+shortTitle+"</h3>");
+ ol.writeString("<table class=\"dirtab\">");
+ ol.writeString("<tr class=\"dirtab\">");
+ ol.writeString("<th class=\"dirtab\">");
+ ol.parseText(theTranslator->trFileIn(m_src->pathFragment()));
+ ol.writeString("</th>");
+ ol.writeString("<th class=\"dirtab\">");
+ ol.parseText(theTranslator->trIncludesFileIn(m_dst->dir()->pathFragment()));
+ ol.writeString("</th>");
+ ol.writeString("</tr>");
+
+ SDict<FilePair>::Iterator fpi(m_dst->filePairs());
+ FilePair *fp;
+ for (fpi.toFirst();(fp=fpi.current());++fpi)
+ {
+ ol.writeString("<tr class=\"dirtab\">");
+ ol.writeString("<td class=\"dirtab\">");
+ writePartialFilePath(ol,m_src,fp->source());
+ ol.writeString("</td>");
+ ol.writeString("<td class=\"dirtab\">");
+ writePartialFilePath(ol,m_dst->dir(),fp->destination());
+ ol.writeString("</td>");
+ ol.writeString("</tr>");
+ }
+ ol.writeString("</table>");
+
+ ol.endContents();
+
+ if (generateTreeView)
+ {
+ m_src->writeNavigationPath(ol);
+ }
+
+ endFile(ol,TRUE);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------
+// external functions
+
+void buildDirectories()
+{
+ // for each input file
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ //printf("buildDirectories %s\n",fd->name().data());
+ if (fd->getReference().isEmpty() && !fd->isDocumentationFile())
+ {
+ DirDef *dir;
+ if ((dir=Doxygen::directories->find(fd->getPath()))==0) // new directory
+ {
+ dir = DirDef::mergeDirectoryInTree(fd->getPath());
+ }
+ if (dir) dir->addFile(fd);
+ }
+ else
+ {
+ // do something for file imported via tag files.
+ }
+ }
+ }
+
+ //DirDef *root = new DirDef("root:");
+ // compute relations between directories => introduce container dirs.
+ DirDef *dir;
+ DirSDict::Iterator sdi(*Doxygen::directories);
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ //printf("New dir %s\n",dir->displayName().data());
+ QCString name = dir->name();
+ int i=name.findRev('/',name.length()-2);
+ if (i>0)
+ {
+ DirDef *parent = Doxygen::directories->find(name.left(i+1));
+ //if (parent==0) parent=root;
+ if (parent)
+ {
+ parent->addSubDir(dir);
+ //printf("DirDef::addSubdir(): Adding subdir\n%s to\n%s\n",
+ // dir->displayName().data(), parent->displayName().data());
+ }
+ }
+ }
+}
+
+void computeDirDependencies()
+{
+ DirDef *dir;
+ DirSDict::Iterator sdi(*Doxygen::directories);
+ // compute nesting level for each directory
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ dir->setLevel();
+ }
+ // compute uses dependencies between directories
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ //printf("computeDependencies for %s: #dirs=%d\n",dir->name().data(),Doxygen::directories.count());
+ dir->computeDependencies();
+ }
+
+#if 0
+ printf("-------------------------------------------------------------\n");
+ // print dependencies (for debugging)
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ if (dir->usedDirs())
+ {
+ QDictIterator<UsedDir> udi(*dir->usedDirs());
+ UsedDir *usedDir;
+ for (udi.toFirst();(usedDir=udi.current());++udi)
+ {
+ printf("%s depends on %s due to ",
+ dir->shortName().data(),usedDir->dir()->shortName().data());
+ QDictIterator<FileDef> fdi(usedDir->files());
+ FileDef *fd;
+ for (fdi.toFirst();(fd=fdi.current());++fdi)
+ {
+ printf("%s ",fd->name().data());
+ }
+ printf("\n");
+ }
+ }
+ }
+ printf("^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^\n");
+#endif
+}
+
+#if 0
+void writeDirDependencyGraph(const char *dirName)
+{
+ QString path;
+ DirDef *dir;
+ DirSDict::Iterator sdi(*Doxygen::directories);
+ QFile htmlPage(QCString(dirName)+"/dirdeps.html");
+ if (htmlPage.open(IO_WriteOnly))
+ {
+ QTextStream out(&htmlPage);
+ out << "<html><body>";
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ path=dirName;
+ path+="/";
+ path+=dir->getOutputFileBase();
+ path+="_dep.dot";
+ out << "<h4>" << dir->displayName() << "</h4>" << endl;
+ out << "<img src=\"" << dir->getOutputFileBase() << "_dep.gif\">" << endl;
+ QFile f(path);
+ if (f.open(IO_WriteOnly))
+ {
+ QTextStream t(&f);
+ dir->writeDepGraph(t);
+ }
+ f.close();
+
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString outFile = QCString(dirName)+"/"+
+ dir->getOutputFileBase()+"_dep."+imgExt;
+ DotRunner dotRun(path);
+ dotRun.addJob(imgExt,outFile);
+ dotRun.run();
+
+ //QCString dotArgs(4096);
+ //dotArgs.sprintf("%s -Tgif -o %s",path.data(),outFile.data());
+ //if (portable_system(Config_getString("DOT_PATH")+"dot",dotArgs,FALSE)!=0)
+ //{
+ // err("Problems running dot. Check your installation!\n");
+ //}
+ }
+ out << "</body></html>";
+ }
+ htmlPage.close();
+}
+#endif
+
+void generateDirDocs(OutputList &ol)
+{
+ DirDef *dir;
+ DirSDict::Iterator sdi(*Doxygen::directories);
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ dir->writeDocumentation(ol);
+ }
+ if (Config_getBool("DIRECTORY_GRAPH"))
+ {
+ SDict<DirRelation>::Iterator rdi(Doxygen::dirRelations);
+ DirRelation *dr;
+ for (rdi.toFirst();(dr=rdi.current());++rdi)
+ {
+ dr->writeDocumentation(ol);
+ }
+ }
+}
+
diff --git a/src/dirdef.h b/src/dirdef.h
new file mode 100644
index 0000000..d0730e6
--- /dev/null
+++ b/src/dirdef.h
@@ -0,0 +1,179 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DIRDEF_H
+#define DIRDEF_H
+
+#include "qtbc.h"
+#include "sortdict.h"
+#include "definition.h"
+
+#include <qlist.h>
+
+class FileList;
+class ClassSDict;
+class QStrList;
+class FileDef;
+class OutputList;
+class UsedDir;
+class FTextStream;
+
+class DirDef;
+
+/** A list of directories */
+class DirList : public QList<DirDef>
+{
+ public:
+ int compareItems(GCI item1,GCI item2);
+};
+
+/** A directory */
+class DirDef : public Definition
+{
+ public:
+ DirDef(const char *path);
+ virtual ~DirDef();
+
+ // accessors
+ virtual DefType definitionType() const { return TypeDir; }
+ virtual QCString getOutputFileBase() const;
+ virtual bool isLinkableInProject() const;
+ virtual bool isLinkable() const;
+ QCString displayName() const { return m_dispName; }
+ QCString shortName() const { return m_shortName; }
+ void addSubDir(DirDef *subdir);
+ FileList * getFiles() const { return m_fileList; }
+ void addFile(FileDef *fd);
+ const DirList &subDirs() const { return m_subdirs; }
+ bool isCluster() const { return m_subdirs.count()>0; }
+ int level() const { return m_level; }
+ DirDef *parent() const { return m_parent; }
+ int dirCount() const { return m_dirCount; }
+ const QDict<UsedDir> *usedDirs() const { return m_usedDirs; }
+ bool isParentOf(DirDef *dir) const;
+ bool depGraphIsTrivial() const;
+
+ // generate output
+ void writeDocumentation(OutputList &ol);
+ void writeDepGraph(FTextStream &t);
+
+ static DirDef *mergeDirectoryInTree(const QCString &path);
+ bool visited;
+
+ private:
+ friend void computeDirDependencies();
+
+ void writeDetailedDescription(OutputList &ol,const QCString &title);
+ void writeBriefDescription(OutputList &ol);
+ void writeDirectoryGraph(OutputList &ol);
+ void writeSubDirList(OutputList &ol);
+ void writeFileList(OutputList &ol);
+ void startMemberDeclarations(OutputList &ol);
+ void endMemberDeclarations(OutputList &ol);
+
+ void setLevel();
+ static DirDef *createNewDir(const char *path);
+ static bool matchPath(const QCString &path,QStrList &l);
+ void addUsesDependency(DirDef *usedDir,FileDef *srcFd,
+ FileDef *dstFd,bool inherited);
+ void computeDependencies();
+
+ DirList m_subdirs;
+ QCString m_dispName;
+ QCString m_shortName;
+ FileList *m_fileList; // list of files in the group
+ int m_dirCount;
+ int m_level;
+ DirDef *m_parent;
+ QDict<UsedDir> *m_usedDirs;
+};
+
+class FilePair
+{
+ public:
+ FilePair(FileDef *src,FileDef *dst) : m_src(src), m_dst(dst) {}
+ const FileDef *source() const { return m_src; }
+ const FileDef *destination() const { return m_dst; }
+ private:
+ FileDef *m_src;
+ FileDef *m_dst;
+};
+
+class FilePairDict : public SDict<FilePair>
+{
+ public:
+ FilePairDict(int size) : SDict<FilePair>(size) {}
+ int compareItems(GCI item1,GCI item2);
+};
+
+/** Usage information of a directory . */
+class UsedDir
+{
+ public:
+ UsedDir(DirDef *dir,bool inherited);
+ virtual ~UsedDir();
+ void addFileDep(FileDef *srcFd,FileDef *dstFd);
+ FilePair *findFilePair(const char *name);
+ const FilePairDict &filePairs() const { return m_filePairs; }
+ const DirDef *dir() const { return m_dir; }
+ bool inherited() const { return m_inherited; }
+
+ private:
+ DirDef *m_dir;
+ FilePairDict m_filePairs;
+ bool m_inherited;
+};
+
+/** A usage relation between two direction. */
+class DirRelation
+{
+ public:
+ DirRelation(const QCString &name,DirDef *src,UsedDir *dst)
+ : m_name(name), m_src(src), m_dst(dst) {}
+ DirDef *source() const { return m_src; }
+ UsedDir *destination() const { return m_dst; }
+ void writeDocumentation(OutputList &ol);
+ QCString getOutputFileBase() const { return m_name; }
+
+ private:
+ QCString m_name;
+ DirDef *m_src;
+ UsedDir *m_dst;
+};
+
+inline int DirList::compareItems(GCI item1,GCI item2)
+{
+ return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+}
+
+class DirSDict : public SDict<DirDef>
+{
+ public:
+ DirSDict(int size) : SDict<DirDef>(size) {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+ }
+};
+
+
+void buildDirectories();
+void generateDirDocs(OutputList &ol);
+void computeDirDependencies();
+void writeDirDependencyGraph(const char *file);
+
+#endif
diff --git a/src/docparser.cpp b/src/docparser.cpp
new file mode 100644
index 0000000..5028c90
--- /dev/null
+++ b/src/docparser.cpp
@@ -0,0 +1,6590 @@
+/******************************************************************************
+ *
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qcstring.h>
+#include <qstack.h>
+#include <qdict.h>
+#include <qregexp.h>
+#include <ctype.h>
+
+#include "doxygen.h"
+#include "debug.h"
+#include "util.h"
+#include "pagedef.h"
+
+#include "docparser.h"
+#include "doctokenizer.h"
+#include "cmdmapper.h"
+#include "printdocvisitor.h"
+#include "message.h"
+#include "section.h"
+#include "searchindex.h"
+#include "language.h"
+#include "portable.h"
+
+// debug off
+#define DBG(x) do {} while(0)
+
+// debug to stdout
+//#define DBG(x) printf x
+
+// debug to stderr
+//#define myprintf(x...) fprintf(stderr,x)
+//#define DBG(x) myprintf x
+
+#define INTERNAL_ASSERT(x) do {} while(0)
+//#define INTERNAL_ASSERT(x) if (!(x)) DBG(("INTERNAL_ASSERT(%s) failed retval=0x%x: file=%s line=%d\n",#x,retval,__FILE__,__LINE__));
+
+//---------------------------------------------------------------------------
+
+static const char *sectionLevelToName[] =
+{
+ "page",
+ "section",
+ "subsection",
+ "subsubsection",
+ "paragraph"
+};
+
+//---------------------------------------------------------------------------
+
+// Parser state: global variables during a call to validatingParseDoc
+static Definition * g_scope;
+static QCString g_context;
+static bool g_inSeeBlock;
+static bool g_insideHtmlLink;
+static QStack<DocNode> g_nodeStack;
+static QStack<DocStyleChange> g_styleStack;
+static QStack<DocStyleChange> g_initialStyleStack;
+static QList<Definition> g_copyStack;
+static QCString g_fileName;
+static QCString g_relPath;
+
+static bool g_hasParamCommand;
+static bool g_hasReturnCommand;
+static QDict<void> g_paramsFound;
+static MemberDef * g_memberDef;
+static bool g_isExample;
+static QCString g_exampleName;
+static SectionDict * g_sectionDict;
+static QCString g_searchUrl;
+
+static QCString g_includeFileText;
+static uint g_includeFileOffset;
+static uint g_includeFileLength;
+
+// parser's context to store all global variables
+struct DocParserContext
+{
+ Definition *scope;
+ QCString context;
+ bool inSeeBlock;
+ bool insideHtmlLink;
+ QStack<DocNode> nodeStack;
+ QStack<DocStyleChange> styleStack;
+ QStack<DocStyleChange> initialStyleStack;
+ QList<Definition> copyStack;
+ QCString fileName;
+ QCString relPath;
+
+ bool hasParamCommand;
+ bool hasReturnCommand;
+ MemberDef * memberDef;
+ QDict<void> paramsFound;
+ bool isExample;
+ QCString exampleName;
+ SectionDict *sectionDict;
+ QCString searchUrl;
+
+ QCString includeFileText;
+ uint includeFileOffset;
+ uint includeFileLength;
+
+ TokenInfo *token;
+};
+
+static QStack<DocParserContext> g_parserStack;
+
+//---------------------------------------------------------------------------
+
+static void docParserPushContext(bool saveParamInfo=TRUE)
+{
+ //QCString indent;
+ //indent.fill(' ',g_parserStack.count()*2+2);
+ //printf("%sdocParserPushContext() count=%d\n",indent.data(),g_nodeStack.count());
+
+ doctokenizerYYpushContext();
+ DocParserContext *ctx = new DocParserContext;
+ ctx->scope = g_scope;
+ ctx->context = g_context;
+ ctx->inSeeBlock = g_inSeeBlock;
+ ctx->insideHtmlLink = g_insideHtmlLink;
+ ctx->nodeStack = g_nodeStack;
+ ctx->styleStack = g_styleStack;
+ ctx->initialStyleStack = g_initialStyleStack;
+ ctx->copyStack = g_copyStack;
+ ctx->fileName = g_fileName;
+ ctx->relPath = g_relPath;
+
+ if (saveParamInfo)
+ {
+ ctx->hasParamCommand = g_hasParamCommand;
+ ctx->hasReturnCommand = g_hasReturnCommand;
+ ctx->paramsFound = g_paramsFound;
+ }
+
+ ctx->memberDef = g_memberDef;
+ ctx->isExample = g_isExample;
+ ctx->exampleName = g_exampleName;
+ ctx->sectionDict = g_sectionDict;
+ ctx->searchUrl = g_searchUrl;
+
+ ctx->includeFileText = g_includeFileText;
+ ctx->includeFileOffset = g_includeFileOffset;
+ ctx->includeFileLength = g_includeFileLength;
+
+ ctx->token = g_token;
+ g_token = new TokenInfo;
+
+ g_parserStack.push(ctx);
+}
+
+static void docParserPopContext(bool keepParamInfo=FALSE)
+{
+ DocParserContext *ctx = g_parserStack.pop();
+ g_scope = ctx->scope;
+ g_context = ctx->context;
+ g_inSeeBlock = ctx->inSeeBlock;
+ g_insideHtmlLink = ctx->insideHtmlLink;
+ g_nodeStack = ctx->nodeStack;
+ g_styleStack = ctx->styleStack;
+ g_initialStyleStack = ctx->initialStyleStack;
+ g_copyStack = ctx->copyStack;
+ g_fileName = ctx->fileName;
+ g_relPath = ctx->relPath;
+
+ if (!keepParamInfo)
+ {
+ g_hasParamCommand = ctx->hasParamCommand;
+ g_hasReturnCommand = ctx->hasReturnCommand;
+ g_paramsFound = ctx->paramsFound;
+ }
+ g_memberDef = ctx->memberDef;
+ g_isExample = ctx->isExample;
+ g_exampleName = ctx->exampleName;
+ g_sectionDict = ctx->sectionDict;
+ g_searchUrl = ctx->searchUrl;
+
+ g_includeFileText = ctx->includeFileText;
+ g_includeFileOffset = ctx->includeFileOffset;
+ g_includeFileLength = ctx->includeFileLength;
+
+ delete g_token;
+ g_token = ctx->token;
+
+ delete ctx;
+ doctokenizerYYpopContext();
+
+ //QCString indent;
+ //indent.fill(' ',g_parserStack.count()*2+2);
+ //printf("%sdocParserPopContext() count=%d\n",indent.data(),g_nodeStack.count());
+}
+
+//---------------------------------------------------------------------------
+
+/*! search for an image in the imageNameDict and if found
+ * copies the image to the output directory (which depends on the \a type
+ * parameter).
+ */
+static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
+{
+ QCString result;
+ bool ambig;
+ FileDef *fd;
+ //printf("Search for %s\n",fileName);
+ if ((fd=findFileDef(Doxygen::imageNameDict,fileName,ambig)))
+ {
+ QCString inputFile = fd->absFilePath();
+ QFile inImage(inputFile);
+ if (inImage.open(IO_ReadOnly))
+ {
+ result = fileName;
+ int i;
+ if ((i=result.findRev('/'))!=-1 || (i=result.findRev('\\'))!=-1)
+ {
+ result = result.right(result.length()-i-1);
+ }
+ //printf("fileName=%s result=%s\n",fileName,result.data());
+ QCString outputDir;
+ switch(type)
+ {
+ case DocImage::Html:
+ if (!Config_getBool("GENERATE_HTML")) return result;
+ outputDir = Config_getString("HTML_OUTPUT");
+ break;
+ case DocImage::Latex:
+ if (!Config_getBool("GENERATE_LATEX")) return result;
+ outputDir = Config_getString("LATEX_OUTPUT");
+ break;
+ case DocImage::Rtf:
+ if (!Config_getBool("GENERATE_RTF")) return result;
+ outputDir = Config_getString("RTF_OUTPUT");
+ break;
+ }
+ QCString outputFile = outputDir+"/"+result;
+ if (outputFile!=inputFile) // prevent copying to ourself
+ {
+ QFile outImage(outputFile.data());
+ if (outImage.open(IO_WriteOnly)) // copy the image
+ {
+ char *buffer = new char[inImage.size()];
+ inImage.readBlock(buffer,inImage.size());
+ outImage.writeBlock(buffer,inImage.size());
+ outImage.flush();
+ delete[] buffer;
+ if (type==DocImage::Html) Doxygen::indexList.addImageFile(result);
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,
+ "warning: could not write output image %s",qPrint(outputFile));
+ }
+ }
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,
+ "warning: could not open image %s",qPrint(fileName));
+ }
+
+ if (type==DocImage::Latex && Config_getBool("USE_PDFLATEX") &&
+ fd->name().right(4)==".eps"
+ )
+ { // we have an .eps image in pdflatex mode => convert it to a pdf.
+ QCString outputDir = Config_getString("LATEX_OUTPUT");
+ QCString baseName = fd->name().left(fd->name().length()-4);
+ QCString epstopdfArgs(4096);
+ epstopdfArgs.sprintf("\"%s/%s.eps\" --outfile=\"%s/%s.pdf\"",
+ outputDir.data(), baseName.data(),
+ outputDir.data(), baseName.data());
+ portable_sysTimerStart();
+ if (portable_system("epstopdf",epstopdfArgs)!=0)
+ {
+ err("error: Problems running epstopdf. Check your TeX installation!\n");
+ }
+ portable_sysTimerStop();
+ return baseName;
+ }
+ }
+ else if (ambig)
+ {
+ QCString text;
+ text.sprintf("warning: image file name %s is ambiguous.\n",qPrint(fileName));
+ text+="Possible candidates:\n";
+ text+=showFileDefMatches(Doxygen::imageNameDict,fileName);
+ warn_doc_error(g_fileName,doctokenizerYYlineno,text);
+ }
+ else
+ {
+ result=fileName;
+ if (result.left(5)!="http:" && result.left(6)!="https:")
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,
+ "warning: image file %s is not found in IMAGE_PATH: "
+ "assuming external image.",qPrint(fileName)
+ );
+ }
+ }
+ return result;
+}
+
+/*! Collects the parameters found with \@param or \@retval commands
+ * in a global list g_paramsFound. If \a isParam is set to TRUE
+ * and the parameter is not an actual parameter of the current
+ * member g_memberDef, then a warning is raised (unless warnings
+ * are disabled altogether).
+ */
+static void checkArgumentName(const QCString &name,bool isParam)
+{
+ if (!Config_getBool("WARN_IF_DOC_ERROR")) return;
+ if (g_memberDef==0) return; // not a member
+ LockingPtr<ArgumentList> al=g_memberDef->isDocsForDefinition() ?
+ g_memberDef->argumentList() :
+ g_memberDef->declArgumentList();
+ //printf("isDocsForDefinition()=%d\n",g_memberDef->isDocsForDefinition());
+ if (al==0) return; // no argument list
+
+ static QRegExp re("[a-zA-Z0-9_\\x80-\\xFF]+\\.*");
+ int p=0,i=0,l;
+ while ((i=re.match(name,p,&l))!=-1) // to handle @param x,y
+ {
+ QCString aName=name.mid(i,l);
+ //printf("aName=`%s'\n",aName.data());
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ bool found=FALSE;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ QCString argName = g_memberDef->isDefine() ? a->type : a->name;
+ argName=argName.stripWhiteSpace();
+ //printf("argName=`%s'\n",argName.data());
+ if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
+ if (aName==argName)
+ {
+ //printf("adding `%s'\n",aName.data());
+ g_paramsFound.insert(aName,(void *)(0x8));
+ found=TRUE;
+ break;
+ }
+ }
+ if (!found && isParam)
+ {
+ //printf("member type=%d\n",memberDef->memberType());
+ QCString scope=g_memberDef->getScopeString();
+ if (!scope.isEmpty()) scope+="::"; else scope="";
+ QCString inheritedFrom = "";
+ QCString docFile = g_memberDef->docFile();
+ int docLine = g_memberDef->docLine();
+ MemberDef *inheritedMd = g_memberDef->inheritsDocsFrom();
+ if (inheritedMd) // documentation was inherited
+ {
+ inheritedFrom.sprintf(" inherited from member %s at line "
+ "%d in file %s",qPrint(inheritedMd->name()),
+ inheritedMd->docLine(),qPrint(inheritedMd->docFile()));
+ docFile = g_memberDef->getDefFileName();
+ docLine = g_memberDef->getDefLine();
+
+ }
+ QCString alStr = argListToString(al.pointer());
+ warn_doc_error(docFile,docLine,
+ "warning: argument '%s' of command @param "
+ "is not found in the argument list of %s%s%s%s",
+ qPrint(aName), qPrint(scope), qPrint(g_memberDef->name()),
+ qPrint(alStr), qPrint(inheritedFrom));
+ }
+ p=i+l;
+ }
+}
+
+/*! Checks if the parameters that have been specified using \@param are
+ * indeed all paramters.
+ * Must be called after checkArgumentName() has been called for each
+ * argument.
+ */
+static void checkUndocumentedParams()
+{
+ if (g_memberDef && g_hasParamCommand && Config_getBool("WARN_IF_DOC_ERROR"))
+ {
+ LockingPtr<ArgumentList> al=g_memberDef->isDocsForDefinition() ?
+ g_memberDef->argumentList() :
+ g_memberDef->declArgumentList();
+ if (al!=0)
+ {
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ bool found=FALSE;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ QCString argName = g_memberDef->isDefine() ? a->type : a->name;
+ argName=argName.stripWhiteSpace();
+ if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
+ if (getLanguageFromFileName(g_memberDef->getDefFileName())==SrcLangExt_Python && argName=="self")
+ {
+ // allow undocumented self parameter for Python
+ }
+ else if (!argName.isEmpty() && g_paramsFound.find(argName)==0 && a->docs.isEmpty())
+ {
+ found = TRUE;
+ break;
+ }
+ }
+ if (found)
+ {
+ bool first=TRUE;
+ QCString errMsg=
+ "warning: The following parameters of "+
+ QCString(g_memberDef->qualifiedName()) +
+ QCString(argListToString(al.pointer())) +
+ " are not documented:\n";
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ QCString argName = g_memberDef->isDefine() ? a->type : a->name;
+ argName=argName.stripWhiteSpace();
+ if (getLanguageFromFileName(g_memberDef->getDefFileName())==SrcLangExt_Python && argName=="self")
+ {
+ // allow undocumented self parameter for Python
+ }
+ else if (!argName.isEmpty() && g_paramsFound.find(argName)==0)
+ {
+ if (!first)
+ {
+ errMsg+="\n";
+ }
+ else
+ {
+ first=FALSE;
+ }
+ errMsg+=" parameter '"+argName+"'";
+ }
+ }
+ if (g_memberDef->inheritsDocsFrom())
+ {
+ warn_doc_error(g_memberDef->getDefFileName(),
+ g_memberDef->getDefLine(),
+ substitute(errMsg,"%","%%"));
+ }
+ else
+ {
+ warn_doc_error(g_memberDef->docFile(),
+ g_memberDef->docLine(),
+ substitute(errMsg,"%","%%"));
+ }
+ }
+ }
+ }
+}
+
+/*! Check if a member has documentation for its parameter and or return
+ * type, if applicable. If found this will be stored in the member, this
+ * is needed as a member can have brief and detailed documentation, while
+ * only one of these needs to document the parameters.
+ */
+static void detectNoDocumentedParams()
+{
+ if (g_memberDef && Config_getBool("WARN_NO_PARAMDOC"))
+ {
+ LockingPtr<ArgumentList> al = g_memberDef->argumentList();
+ LockingPtr<ArgumentList> declAl = g_memberDef->declArgumentList();
+ QCString returnType = g_memberDef->typeString();
+ bool isPython = getLanguageFromFileName(g_memberDef->getDefFileName())==SrcLangExt_Python;
+
+ if (!g_memberDef->hasDocumentedParams() &&
+ g_hasParamCommand)
+ {
+ //printf("%s->setHasDocumentedParams(TRUE);\n",g_memberDef->name().data());
+ g_memberDef->setHasDocumentedParams(TRUE);
+ }
+ else if (!g_memberDef->hasDocumentedParams())
+ {
+ bool allDoc=TRUE; // no paramater => all parameters are documented
+ if ( // member has parameters
+ al!=0 && // but the member has a parameter list
+ al->count()>0 // with at least one parameter (that is not void)
+ )
+ {
+ ArgumentListIterator ali(*al);
+ Argument *a;
+
+ // see if all parameters have documentation
+ for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
+ {
+ if (!a->name.isEmpty() && a->type!="void" &&
+ !(isPython && a->name=="self")
+ )
+ {
+ allDoc = !a->docs.isEmpty();
+ }
+ //printf("a->type=%s a->name=%s doc=%s\n",
+ // a->type.data(),a->name.data(),a->docs.data());
+ }
+ if (!allDoc && declAl!=0) // try declaration arguments as well
+ {
+ allDoc=TRUE;
+ ArgumentListIterator ali(*declAl);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
+ {
+ if (!a->name.isEmpty() && a->type!="void" &&
+ !(isPython && a->name=="self")
+ )
+ {
+ allDoc = !a->docs.isEmpty();
+ }
+ //printf("a->name=%s doc=%s\n",a->name.data(),a->docs.data());
+ }
+ }
+ }
+ if (allDoc)
+ {
+ //printf("%s->setHasDocumentedParams(TRUE);\n",g_memberDef->name().data());
+ g_memberDef->setHasDocumentedParams(TRUE);
+ }
+ }
+ //printf("Member %s hasReturnCommand=%d\n",g_memberDef->name().data(),g_hasReturnCommand);
+ if (!g_memberDef->hasDocumentedReturnType() && // docs not yet found
+ g_hasReturnCommand)
+ {
+ g_memberDef->setHasDocumentedReturnType(TRUE);
+ }
+ else if ( // see if return needs to documented
+ g_memberDef->hasDocumentedReturnType() ||
+ returnType.isEmpty() || // empty return type
+ returnType.find("void")!=-1 || // void return type
+ returnType.find("subroutine")!=-1 || // fortran subroutine
+ g_memberDef->isConstructor() || // a constructor
+ g_memberDef->isDestructor() // or destructor
+ )
+ {
+ g_memberDef->setHasDocumentedReturnType(TRUE);
+ }
+
+ }
+}
+
+
+//---------------------------------------------------------------------------
+
+/*! Strips known html and tex extensions from \a text. */
+static QCString stripKnownExtensions(const char *text)
+{
+ QCString result=text;
+ if (result.right(4)==".tex")
+ {
+ result=result.left(result.length()-4);
+ }
+ else if (result.right(Doxygen::htmlFileExtension.length())==
+ QCString(Doxygen::htmlFileExtension))
+ {
+ result=result.left(result.length()-Doxygen::htmlFileExtension.length());
+ }
+ return result;
+}
+
+
+//---------------------------------------------------------------------------
+
+/*! Returns TRUE iff node n is a child of a preformatted node */
+static bool insidePRE(DocNode *n)
+{
+ while (n)
+ {
+ if (n->isPreformatted()) return TRUE;
+ n=n->parent();
+ }
+ return FALSE;
+}
+
+//---------------------------------------------------------------------------
+
+/*! Returns TRUE iff node n is a child of a html list item node */
+static bool insideLI(DocNode *n)
+{
+ while (n)
+ {
+ if (n->kind()==DocNode::Kind_HtmlListItem) return TRUE;
+ n=n->parent();
+ }
+ return FALSE;
+}
+
+//---------------------------------------------------------------------------
+
+/*! Returns TRUE iff node n is a child of a unordered html list node */
+static bool insideUL(DocNode *n)
+{
+ while (n)
+ {
+ if (n->kind()==DocNode::Kind_HtmlList &&
+ ((DocHtmlList *)n)->type()==DocHtmlList::Unordered) return TRUE;
+ n=n->parent();
+ }
+ return FALSE;
+}
+
+//---------------------------------------------------------------------------
+
+/*! Returns TRUE iff node n is a child of a ordered html list node */
+static bool insideOL(DocNode *n)
+{
+ while (n)
+ {
+ if (n->kind()==DocNode::Kind_HtmlList &&
+ ((DocHtmlList *)n)->type()==DocHtmlList::Ordered) return TRUE;
+ n=n->parent();
+ }
+ return FALSE;
+}
+
+//---------------------------------------------------------------------------
+
+static bool insideTable(DocNode *n)
+{
+ while (n)
+ {
+ if (n->kind()==DocNode::Kind_HtmlTable) return TRUE;
+ n=n->parent();
+ }
+ return FALSE;
+}
+
+//---------------------------------------------------------------------------
+
+///*! Returns TRUE iff node n is a child of a language node */
+//static bool insideLang(DocNode *n)
+//{
+// while (n)
+// {
+// if (n->kind()==DocNode::Kind_Language) return TRUE;
+// n=n->parent();
+// }
+// return FALSE;
+//}
+
+
+//---------------------------------------------------------------------------
+
+/*! Looks for a documentation block with name commandName in the current
+ * context (g_context). The resulting documentation string is
+ * put in pDoc, the definition in which the documentation was found is
+ * put in pDef.
+ * @retval TRUE if name was found.
+ * @retval FALSE if name was not found.
+ */
+static bool findDocsForMemberOrCompound(const char *commandName,
+ QCString *pDoc,
+ QCString *pBrief,
+ Definition **pDef)
+{
+ //printf("findDocsForMemberOrCompound(%s)\n",commandName);
+ *pDoc="";
+ *pBrief="";
+ *pDef=0;
+ QCString cmdArg=substitute(commandName,"#","::");
+ int l=cmdArg.length();
+ if (l==0) return FALSE;
+
+ int funcStart=cmdArg.find('(');
+ if (funcStart==-1)
+ {
+ funcStart=l;
+ }
+ else
+ {
+ // Check for the case of operator() and the like.
+ // beware of scenarios like operator()((foo)bar)
+ int secondParen = cmdArg.find('(', funcStart+1);
+ int leftParen = cmdArg.find(')', funcStart+1);
+ if (leftParen!=-1 && secondParen!=-1)
+ {
+ if (leftParen<secondParen)
+ {
+ funcStart=secondParen;
+ }
+ }
+ }
+
+ QCString name=removeRedundantWhiteSpace(cmdArg.left(funcStart));
+ QCString args=cmdArg.right(l-funcStart);
+
+ // try if the link is to a member
+ MemberDef *md=0;
+ ClassDef *cd=0;
+ FileDef *fd=0;
+ NamespaceDef *nd=0;
+ GroupDef *gd=0;
+ PageDef *pd=0;
+ bool found = getDefs(
+ g_context.find('.')==-1?g_context.data():"", // `find('.') is a hack to detect files
+ name,
+ args.isEmpty()?0:args.data(),
+ md,cd,fd,nd,gd,FALSE,0,TRUE);
+ //printf("found=%d context=%s name=%s\n",found,g_context.data(),name.data());
+ if (found && md)
+ {
+ *pDoc=md->documentation();
+ *pBrief=md->briefDescription();
+ *pDef=md;
+ return TRUE;
+ }
+
+
+ int scopeOffset=g_context.length();
+ do // for each scope
+ {
+ QCString fullName=cmdArg;
+ if (scopeOffset>0)
+ {
+ fullName.prepend(g_context.left(scopeOffset)+"::");
+ }
+ //printf("Trying fullName=`%s'\n",fullName.data());
+
+ // try class, namespace, group, page, file reference
+ cd = Doxygen::classSDict->find(fullName);
+ if (cd) // class
+ {
+ *pDoc=cd->documentation();
+ *pBrief=cd->briefDescription();
+ *pDef=cd;
+ return TRUE;
+ }
+ nd = Doxygen::namespaceSDict->find(fullName);
+ if (nd) // namespace
+ {
+ *pDoc=nd->documentation();
+ *pBrief=nd->briefDescription();
+ *pDef=nd;
+ return TRUE;
+ }
+ gd = Doxygen::groupSDict->find(cmdArg);
+ if (gd) // group
+ {
+ *pDoc=gd->documentation();
+ *pBrief=gd->briefDescription();
+ *pDef=gd;
+ return TRUE;
+ }
+ pd = Doxygen::pageSDict->find(cmdArg);
+ if (pd) // page
+ {
+ *pDoc=pd->documentation();
+ *pBrief=pd->briefDescription();
+ *pDef=pd;
+ return TRUE;
+ }
+ bool ambig;
+ fd = findFileDef(Doxygen::inputNameDict,cmdArg,ambig);
+ if (fd && !ambig) // file
+ {
+ *pDoc=fd->documentation();
+ *pBrief=fd->briefDescription();
+ *pDef=fd;
+ return TRUE;
+ }
+
+ if (scopeOffset==0)
+ {
+ scopeOffset=-1;
+ }
+ else
+ {
+ scopeOffset = g_context.findRev("::",scopeOffset-1);
+ if (scopeOffset==-1) scopeOffset=0;
+ }
+ } while (scopeOffset>=0);
+
+
+ return FALSE;
+}
+//---------------------------------------------------------------------------
+
+// forward declaration
+static bool defaultHandleToken(DocNode *parent,int tok,
+ QList<DocNode> &children,bool
+ handleWord=TRUE);
+
+
+static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
+ const QCString &cmdName)
+{
+ DBG(("handleStyleArgument(%s)\n",qPrint(cmdName)));
+ QCString tokenName = g_token->name;
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return tok;
+ }
+ while ((tok=doctokenizerYYlex()) &&
+ tok!=TK_WHITESPACE &&
+ tok!=TK_NEWPARA &&
+ tok!=TK_LISTITEM &&
+ tok!=TK_ENDLIST
+ )
+ {
+ static QRegExp specialChar("[.,|()\\[\\]:;\\?]");
+ if (tok==TK_WORD && g_token->name.length()==1 &&
+ g_token->name.find(specialChar)!=-1)
+ {
+ // special character that ends the markup command
+ return tok;
+ }
+ if (!defaultHandleToken(parent,tok,children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command \\%s as the argument of a \\%s command",
+ qPrint(g_token->name),qPrint(cmdName));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found while handling command %s",
+ qPrint(g_token->name),qPrint(cmdName));
+ break;
+ case TK_HTMLTAG:
+ if (insideLI(parent) && Mappers::htmlTagMapper->map(g_token->name) && g_token->endTag)
+ { // ignore </li> as the end of a style command
+ continue;
+ }
+ return tok;
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s while handling command %s",
+ tokToString(tok),qPrint(cmdName));
+ break;
+ }
+ break;
+ }
+ }
+ DBG(("handleStyleArgument(%s) end tok=%x\n",qPrint(cmdName),tok));
+ return (tok==TK_NEWPARA || tok==TK_LISTITEM || tok==TK_ENDLIST
+ ) ? tok : RetVal_OK;
+}
+
+/*! Called when a style change starts. For instance a \<b\> command is
+ * encountered.
+ */
+static void handleStyleEnter(DocNode *parent,QList<DocNode> &children,
+ DocStyleChange::Style s,const HtmlAttribList *attribs)
+{
+ DBG(("HandleStyleEnter\n"));
+ DocStyleChange *sc= new DocStyleChange(parent,g_nodeStack.count(),s,TRUE,attribs);
+ children.append(sc);
+ g_styleStack.push(sc);
+}
+
+/*! Called when a style change ends. For instance a \</b\> command is
+ * encountered.
+ */
+static void handleStyleLeave(DocNode *parent,QList<DocNode> &children,
+ DocStyleChange::Style s,const char *tagName)
+{
+ DBG(("HandleStyleLeave\n"));
+ if (g_styleStack.isEmpty() || // no style change
+ g_styleStack.top()->style()!=s || // wrong style change
+ g_styleStack.top()->position()!=g_nodeStack.count() // wrong position
+ )
+ {
+ if (g_styleStack.isEmpty())
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </%s> tag without matching <%s>",
+ qPrint(tagName),qPrint(tagName));
+ }
+ else if (g_styleStack.top()->style()!=s)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </%s> tag while expecting </%s>",
+ qPrint(tagName),qPrint(g_styleStack.top()->styleString()));
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </%s> at different nesting level (%d) than expected (%d)",
+ qPrint(tagName),g_nodeStack.count(),g_styleStack.top()->position());
+ }
+ }
+ else // end the section
+ {
+ DocStyleChange *sc= new DocStyleChange(parent,g_nodeStack.count(),s,FALSE);
+ children.append(sc);
+ g_styleStack.pop();
+ }
+}
+
+/*! Called at the end of a paragraph to close all open style changes
+ * (e.g. a <b> without a </b>). The closed styles are pushed onto a stack
+ * and entered again at the start of a new paragraph.
+ */
+static void handlePendingStyleCommands(DocNode *parent,QList<DocNode> &children)
+{
+ if (!g_styleStack.isEmpty())
+ {
+ DocStyleChange *sc = g_styleStack.top();
+ while (sc && sc->position()>=g_nodeStack.count())
+ { // there are unclosed style modifiers in the paragraph
+ children.append(new DocStyleChange(parent,g_nodeStack.count(),sc->style(),FALSE));
+ g_initialStyleStack.push(sc);
+ g_styleStack.pop();
+ sc = g_styleStack.top();
+ }
+ }
+}
+
+static void handleInitialStyleCommands(DocPara *parent,QList<DocNode> &children)
+{
+ DocStyleChange *sc;
+ while ((sc=g_initialStyleStack.pop()))
+ {
+ handleStyleEnter(parent,children,sc->style(),&sc->attribs());
+ }
+}
+
+static int handleAHref(DocNode *parent,QList<DocNode> &children,const HtmlAttribList &tagHtmlAttribs)
+{
+ HtmlAttribListIterator li(tagHtmlAttribs);
+ HtmlAttrib *opt;
+ int index=0;
+ int retval = RetVal_OK;
+ for (li.toFirst();(opt=li.current());++li,++index)
+ {
+ if (opt->name=="name") // <a name=label> tag
+ {
+ if (!opt->value.isEmpty())
+ {
+ DocAnchor *anc = new DocAnchor(parent,opt->value,TRUE);
+ children.append(anc);
+ break; // stop looking for other tag attribs
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found <a> tag with name option but without value!");
+ }
+ }
+ else if (opt->name=="href") // <a href=url>..</a> tag
+ {
+ // copy attributes
+ HtmlAttribList attrList = tagHtmlAttribs;
+ // and remove the href attribute
+ bool result = attrList.remove(index);
+ ASSERT(result);
+ DocHRef *href = new DocHRef(parent,attrList,opt->value);
+ children.append(href);
+ g_insideHtmlLink=TRUE;
+ retval = href->parse();
+ g_insideHtmlLink=FALSE;
+ break;
+ }
+ else // unsupported option for tag a
+ {
+ }
+ }
+ return retval;
+}
+
+const char *DocStyleChange::styleString() const
+{
+ switch (m_style)
+ {
+ case DocStyleChange::Bold: return "b";
+ case DocStyleChange::Italic: return "em";
+ case DocStyleChange::Code: return "code";
+ case DocStyleChange::Center: return "center";
+ case DocStyleChange::Small: return "small";
+ case DocStyleChange::Subscript: return "subscript";
+ case DocStyleChange::Superscript: return "superscript";
+ case DocStyleChange::Preformatted: return "pre";
+ case DocStyleChange::Div: return "div";
+ case DocStyleChange::Span: return "span";
+ }
+ return "<invalid>";
+}
+
+static void handleUnclosedStyleCommands()
+{
+ if (!g_initialStyleStack.isEmpty())
+ {
+ DocStyleChange *sc = g_initialStyleStack.top();
+ g_initialStyleStack.pop();
+ handleUnclosedStyleCommands();
+ warn_doc_error(g_fileName,doctokenizerYYlineno,
+ "warning: end of comment block while expecting "
+ "command </%s>",qPrint(sc->styleString()));
+ }
+}
+
+static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
+{
+ Definition *compound=0;
+ MemberDef *member=0;
+ QCString name = linkToText(g_token->name,TRUE);
+ int len = g_token->name.length();
+ ClassDef *cd=0;
+ bool ambig;
+ FileDef *fd = findFileDef(Doxygen::inputNameDict,g_fileName,ambig);
+ //printf("handleLinkedWord(%s) g_context=%s\n",g_token->name.data(),g_context.data());
+ if (!g_insideHtmlLink &&
+ (resolveRef(g_context,g_token->name,g_inSeeBlock,&compound,&member,TRUE,fd,TRUE)
+ || (!g_context.isEmpty() && // also try with global scope
+ resolveRef("",g_token->name,g_inSeeBlock,&compound,&member,FALSE,0,TRUE))
+ )
+ )
+ {
+ //printf("resolveRef %s = %p (linkable?=%d)\n",qPrint(g_token->name),member,member ? member->isLinkable() : FALSE);
+ if (member && member->isLinkable()) // member link
+ {
+ if (member->isObjCMethod())
+ {
+ bool localLink = g_memberDef ? member->getClassDef()==g_memberDef->getClassDef() : FALSE;
+ name = member->objCMethodName(localLink,g_inSeeBlock);
+ }
+ children.append(new
+ DocLinkedWord(parent,name,
+ member->getReference(),
+ member->getOutputFileBase(),
+ member->anchor(),
+ member->briefDescriptionAsTooltip()
+ )
+ );
+ }
+ else if (compound->isLinkable()) // compound link
+ {
+ QCString anchor;
+ if (compound->definitionType()==Definition::TypeFile)
+ {
+ name=g_token->name;
+ }
+ else if (compound->definitionType()==Definition::TypeGroup)
+ {
+ name=((GroupDef*)compound)->groupTitle();
+ }
+ else if (compound->definitionType()==Definition::TypeClass)
+ {
+ anchor=((ClassDef*)compound)->anchor();
+ }
+ children.append(new
+ DocLinkedWord(parent,name,
+ compound->getReference(),
+ compound->getOutputFileBase(),
+ anchor,
+ compound->briefDescriptionAsTooltip()
+ )
+ );
+ }
+ else if (compound->definitionType()==Definition::TypeFile &&
+ ((FileDef*)compound)->generateSourceFile()
+ ) // undocumented file that has source code we can link to
+ {
+ children.append(new
+ DocLinkedWord(parent,g_token->name,
+ compound->getReference(),
+ compound->getSourceFileBase(),
+ "",
+ compound->briefDescriptionAsTooltip()
+ )
+ );
+ }
+ else // not linkable
+ {
+ children.append(new DocWord(parent,name));
+ }
+ }
+ else if (!g_insideHtmlLink && len>1 && g_token->name.at(len-1)==':')
+ {
+ // special case, where matching Foo: fails to be an Obj-C reference,
+ // but Foo itself might be linkable.
+ g_token->name=g_token->name.left(len-1);
+ handleLinkedWord(parent,children);
+ children.append(new DocWord(parent,":"));
+ }
+ else if (!g_insideHtmlLink && (cd=getClass(g_token->name+"-p")))
+ {
+ // special case 2, where the token name is not a class, but could
+ // be a Obj-C protocol
+ children.append(new
+ DocLinkedWord(parent,name,
+ cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ cd->briefDescriptionAsTooltip()
+ ));
+ }
+ else if (!g_insideHtmlLink && (cd=getClass(g_token->name+"-g")))
+ {
+ // special case 3, where the token name is not a class, but could
+ // be a C# generic
+ children.append(new
+ DocLinkedWord(parent,name,
+ cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ cd->briefDescriptionAsTooltip()
+ ));
+ }
+ else // normal non-linkable word
+ {
+ if (g_token->name.left(1)=="#" || g_token->name.left(2)=="::")
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: explicit link request to '%s' could not be resolved",qPrint(name));
+ children.append(new DocWord(parent,g_token->name));
+ }
+ else
+ {
+ children.append(new DocWord(parent,name));
+ }
+ }
+}
+
+static void handleParameterType(DocNode *parent,QList<DocNode> &children,const QCString &paramTypes)
+{
+ QCString name = g_token->name;
+ int p=0,i;
+ QCString type;
+ while ((i=paramTypes.find('|',p))!=-1)
+ {
+ g_token->name = paramTypes.mid(p,i-p);
+ handleLinkedWord(parent,children);
+ p=i+1;
+ }
+ g_token->name = paramTypes.mid(p);
+ handleLinkedWord(parent,children);
+ g_token->name = name;
+}
+
+
+/* Helper function that deals with the most common tokens allowed in
+ * title like sections.
+ * @param parent Parent node, owner of the children list passed as
+ * the third argument.
+ * @param tok The token to process.
+ * @param children The list of child nodes to which the node representing
+ * the token can be added.
+ * @param handleWord Indicates if word token should be processed
+ * @retval TRUE The token was handled.
+ * @retval FALSE The token was not handled.
+ */
+static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children,bool
+ handleWord)
+{
+ DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno));
+ if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
+ tok==TK_COMMAND || tok==TK_HTMLTAG
+ )
+ {
+ DBG((" name=%s",qPrint(g_token->name)));
+ }
+ DBG(("\n"));
+reparsetoken:
+ QCString tokenName = g_token->name;
+ switch (tok)
+ {
+ case TK_COMMAND:
+ switch (Mappers::cmdMapper->map(tokenName))
+ {
+ case CMD_BSLASH:
+ children.append(new DocSymbol(parent,DocSymbol::BSlash));
+ break;
+ case CMD_AT:
+ children.append(new DocSymbol(parent,DocSymbol::At));
+ break;
+ case CMD_LESS:
+ children.append(new DocSymbol(parent,DocSymbol::Less));
+ break;
+ case CMD_GREATER:
+ children.append(new DocSymbol(parent,DocSymbol::Greater));
+ break;
+ case CMD_AMP:
+ children.append(new DocSymbol(parent,DocSymbol::Amp));
+ break;
+ case CMD_DOLLAR:
+ children.append(new DocSymbol(parent,DocSymbol::Dollar));
+ break;
+ case CMD_HASH:
+ children.append(new DocSymbol(parent,DocSymbol::Hash));
+ break;
+ case CMD_DCOLON:
+ children.append(new DocSymbol(parent,DocSymbol::DoubleColon));
+ break;
+ case CMD_PERCENT:
+ children.append(new DocSymbol(parent,DocSymbol::Percent));
+ break;
+ case CMD_QUOTE:
+ children.append(new DocSymbol(parent,DocSymbol::Quot));
+ break;
+ case CMD_EMPHASIS:
+ {
+ children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
+ tok=handleStyleArgument(parent,children,tokenName);
+ children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Italic,FALSE));
+ if (tok!=TK_WORD) children.append(new DocWhiteSpace(parent," "));
+ if (tok==TK_NEWPARA) goto handlepara;
+ else if (tok==TK_WORD || tok==TK_HTMLTAG)
+ {
+ DBG(("CMD_EMPHASIS: reparsing command %s\n",qPrint(g_token->name)));
+ goto reparsetoken;
+ }
+ }
+ break;
+ case CMD_BOLD:
+ {
+ children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Bold,TRUE));
+ tok=handleStyleArgument(parent,children,tokenName);
+ children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Bold,FALSE));
+ if (tok!=TK_WORD) children.append(new DocWhiteSpace(parent," "));
+ if (tok==TK_NEWPARA) goto handlepara;
+ else if (tok==TK_WORD || tok==TK_HTMLTAG)
+ {
+ DBG(("CMD_BOLD: reparsing command %s\n",qPrint(g_token->name)));
+ goto reparsetoken;
+ }
+ }
+ break;
+ case CMD_CODE:
+ {
+ children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Code,TRUE));
+ tok=handleStyleArgument(parent,children,tokenName);
+ children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Code,FALSE));
+ if (tok!=TK_WORD) children.append(new DocWhiteSpace(parent," "));
+ if (tok==TK_NEWPARA) goto handlepara;
+ else if (tok==TK_WORD || tok==TK_HTMLTAG)
+ {
+ DBG(("CMD_CODE: reparsing command %s\n",qPrint(g_token->name)));
+ goto reparsetoken;
+ }
+ }
+ break;
+ case CMD_HTMLONLY:
+ {
+ doctokenizerYYsetStateHtmlOnly();
+ tok = doctokenizerYYlex();
+ children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: htmlonly section ended without end marker");
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_MANONLY:
+ {
+ doctokenizerYYsetStateManOnly();
+ tok = doctokenizerYYlex();
+ children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::ManOnly,g_isExample,g_exampleName));
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: manonly section ended without end marker");
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_LATEXONLY:
+ {
+ doctokenizerYYsetStateLatexOnly();
+ tok = doctokenizerYYlex();
+ children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::LatexOnly,g_isExample,g_exampleName));
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: latexonly section ended without end marker",doctokenizerYYlineno);
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_XMLONLY:
+ {
+ doctokenizerYYsetStateXmlOnly();
+ tok = doctokenizerYYlex();
+ children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName));
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: xmlonly section ended without end marker",doctokenizerYYlineno);
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_FORMULA:
+ {
+ DocFormula *form=new DocFormula(parent,g_token->id);
+ children.append(form);
+ }
+ break;
+ case CMD_ANCHOR:
+ {
+ tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(tokenName));
+ break;
+ }
+ tok=doctokenizerYYlex();
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ "argument of command %s",qPrint(tokenName));
+ break;
+ }
+ else if (tok!=TK_WORD && tok!=TK_LNKWORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(tokenName));
+ break;
+ }
+ DocAnchor *anchor = new DocAnchor(parent,g_token->name,FALSE);
+ children.append(anchor);
+ }
+ break;
+ case CMD_INTERNALREF:
+ {
+ tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(tokenName));
+ break;
+ }
+ doctokenizerYYsetStateInternalRef();
+ tok=doctokenizerYYlex(); // get the reference id
+ DocInternalRef *ref=0;
+ if (tok!=TK_WORD && tok!=TK_LNKWORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(tokenName));
+ doctokenizerYYsetStatePara();
+ break;
+ }
+ ref = new DocInternalRef(parent,g_token->name);
+ children.append(ref);
+ ref->parse();
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ default:
+ return FALSE;
+ }
+ break;
+ case TK_HTMLTAG:
+ {
+ switch (Mappers::htmlTagMapper->map(tokenName))
+ {
+ case HTML_DIV:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found <div> tag in heading\n");
+ break;
+ case HTML_PRE:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found <pre> tag in heading\n");
+ break;
+ case HTML_BOLD:
+ if (!g_token->endTag)
+ {
+ handleStyleEnter(parent,children,DocStyleChange::Bold,&g_token->attribs);
+ }
+ else
+ {
+ handleStyleLeave(parent,children,DocStyleChange::Bold,tokenName);
+ }
+ break;
+ case HTML_CODE:
+ case XML_C:
+ if (!g_token->endTag)
+ {
+ handleStyleEnter(parent,children,DocStyleChange::Code,&g_token->attribs);
+ }
+ else
+ {
+ handleStyleLeave(parent,children,DocStyleChange::Code,tokenName);
+ }
+ break;
+ case HTML_EMPHASIS:
+ if (!g_token->endTag)
+ {
+ handleStyleEnter(parent,children,DocStyleChange::Italic,&g_token->attribs);
+ }
+ else
+ {
+ handleStyleLeave(parent,children,DocStyleChange::Italic,tokenName);
+ }
+ break;
+ case HTML_SUB:
+ if (!g_token->endTag)
+ {
+ handleStyleEnter(parent,children,DocStyleChange::Subscript,&g_token->attribs);
+ }
+ else
+ {
+ handleStyleLeave(parent,children,DocStyleChange::Subscript,tokenName);
+ }
+ break;
+ case HTML_SUP:
+ if (!g_token->endTag)
+ {
+ handleStyleEnter(parent,children,DocStyleChange::Superscript,&g_token->attribs);
+ }
+ else
+ {
+ handleStyleLeave(parent,children,DocStyleChange::Superscript,tokenName);
+ }
+ break;
+ case HTML_CENTER:
+ if (!g_token->endTag)
+ {
+ handleStyleEnter(parent,children,DocStyleChange::Center,&g_token->attribs);
+ }
+ else
+ {
+ handleStyleLeave(parent,children,DocStyleChange::Center,tokenName);
+ }
+ break;
+ case HTML_SMALL:
+ if (!g_token->endTag)
+ {
+ handleStyleEnter(parent,children,DocStyleChange::Small,&g_token->attribs);
+ }
+ else
+ {
+ handleStyleLeave(parent,children,DocStyleChange::Small,tokenName);
+ }
+ break;
+ default:
+ return FALSE;
+ break;
+ }
+ }
+ break;
+ case TK_SYMBOL:
+ {
+ char letter='\0';
+ DocSymbol::SymType s = DocSymbol::decodeSymbol(tokenName,&letter);
+ if (s!=DocSymbol::Unknown)
+ {
+ children.append(new DocSymbol(parent,s,letter));
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+ break;
+ case TK_WHITESPACE:
+ case TK_NEWPARA:
+handlepara:
+ if (insidePRE(parent) || !children.isEmpty())
+ {
+ children.append(new DocWhiteSpace(parent,g_token->chars));
+ }
+ break;
+ case TK_LNKWORD:
+ if (handleWord)
+ {
+ handleLinkedWord(parent,children);
+ }
+ else
+ return FALSE;
+ break;
+ case TK_WORD:
+ if (handleWord)
+ {
+ children.append(new DocWord(parent,g_token->name));
+ }
+ else
+ return FALSE;
+ break;
+ case TK_URL:
+ if (g_insideHtmlLink)
+ {
+ children.append(new DocWord(parent,g_token->name));
+ }
+ else
+ {
+ children.append(new DocURL(parent,g_token->name,g_token->isEMailAddr));
+ }
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+//---------------------------------------------------------------------------
+
+DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName,char *letter)
+{
+ int l=symName.length();
+ DBG(("decodeSymbol(%s) l=%d\n",qPrint(symName),l));
+ if (symName=="&copy;") return DocSymbol::Copy;
+ else if (symName=="&trade;") return DocSymbol::Tm;
+ else if (symName=="&tm;") return DocSymbol::Tm; // alias for &trade;
+ else if (symName=="&reg;") return DocSymbol::Reg;
+ else if (symName=="&lt;") return DocSymbol::Less;
+ else if (symName=="&gt;") return DocSymbol::Greater;
+ else if (symName=="&amp;") return DocSymbol::Amp;
+ else if (symName=="&apos;") return DocSymbol::Apos;
+ else if (symName=="&quot;") return DocSymbol::Quot;
+ else if (symName=="&lsquo;") return DocSymbol::Lsquo;
+ else if (symName=="&rsquo;") return DocSymbol::Rsquo;
+ else if (symName=="&ldquo;") return DocSymbol::Ldquo;
+ else if (symName=="&rdquo;") return DocSymbol::Rdquo;
+ else if (symName=="&ndash;") return DocSymbol::Ndash;
+ else if (symName=="&mdash;") return DocSymbol::Mdash;
+ else if (symName=="&szlig;") return DocSymbol::Szlig;
+ else if (symName=="&nbsp;") return DocSymbol::Nbsp;
+ else if (symName=="&AElig;") return DocSymbol::AElig;
+ else if (symName=="&aelig;") return DocSymbol::Aelig;
+ else if (l==6 && symName.right(4)=="uml;")
+ {
+ *letter=symName.at(1);
+ return DocSymbol::Uml;
+ }
+ else if (l==8 && symName.right(6)=="acute;")
+ {
+ *letter=symName.at(1);
+ return DocSymbol::Acute;
+ }
+ else if (l==8 && symName.right(6)=="grave;")
+ {
+ *letter=symName.at(1);
+ return DocSymbol::Grave;
+ }
+ else if (l==7 && symName.right(5)=="circ;")
+ {
+ *letter=symName.at(1);
+ return DocSymbol::Circ;
+ }
+ else if (l==8 && symName.right(6)=="tilde;")
+ {
+ *letter=symName.at(1);
+ return DocSymbol::Tilde;
+ }
+ else if (l==8 && symName.right(6)=="cedil;")
+ {
+ *letter=symName.at(1);
+ return DocSymbol::Cedil;
+ }
+ else if (l==7 && symName.right(5)=="ring;")
+ {
+ *letter=symName.at(1);
+ return DocSymbol::Ring;
+ }
+ else if (l==8 && symName.right(6)=="slash;")
+ {
+ *letter=symName.at(1);
+ return DocSymbol::Slash;
+ }
+ return DocSymbol::Unknown;
+}
+
+//---------------------------------------------------------------------------
+
+static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
+ const QCString &doc)
+{
+ int retval = RetVal_OK;
+
+ if (doc.isEmpty()) return retval;
+
+ doctokenizerYYinit(doc,g_fileName);
+
+ // first parse any number of paragraphs
+ bool isFirst=TRUE;
+ DocPara *lastPar=0;
+ if (!children.isEmpty() && children.last()->kind()==DocNode::Kind_Para)
+ { // last child item was a paragraph
+ lastPar = (DocPara*)children.last();
+ isFirst=FALSE;
+ }
+ do
+ {
+ DocPara *par = new DocPara(parent);
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ retval=par->parse();
+ if (!par->isEmpty())
+ {
+ children.append(par);
+ if (lastPar) lastPar->markLast(FALSE);
+ lastPar=par;
+ }
+ else
+ {
+ delete par;
+ }
+ } while (retval==TK_NEWPARA);
+ if (lastPar) lastPar->markLast();
+
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+static void readTextFileByName(const QCString &file,QCString &text)
+{
+ QStrList &examplePathList = Config_getList("EXAMPLE_PATH");
+ char *s=examplePathList.first();
+ while (s)
+ {
+ QCString absFileName = QCString(s)+portable_pathSeparator()+file;
+ QFileInfo fi(absFileName);
+ if (fi.exists())
+ {
+ text = fileToString(absFileName,Config_getBool("FILTER_SOURCE_FILES"));
+ return;
+ }
+ s=examplePathList.next();
+ }
+
+ // as a fallback we also look in the exampleNameDict
+ bool ambig;
+ FileDef *fd;
+ if ((fd=findFileDef(Doxygen::exampleNameDict,file,ambig)))
+ {
+ text = fileToString(fd->absFilePath(),Config_getBool("FILTER_SOURCE_FILES"));
+ }
+ else if (ambig)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included file name %s is ambiguous"
+ "Possible candidates:\n%s",qPrint(file),
+ qPrint(showFileDefMatches(Doxygen::exampleNameDict,file))
+ );
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included file %s is not found. "
+ "Check your EXAMPLE_PATH",qPrint(file));
+ }
+}
+
+//---------------------------------------------------------------------------
+
+DocWord::DocWord(DocNode *parent,const QCString &word) :
+ m_word(word)
+{
+ m_parent = parent;
+ //printf("new word %s url=%s\n",word.data(),g_searchUrl.data());
+ if (Doxygen::searchIndex && !g_searchUrl.isEmpty())
+ {
+ Doxygen::searchIndex->addWord(word,FALSE);
+ }
+}
+
+//---------------------------------------------------------------------------
+
+DocLinkedWord::DocLinkedWord(DocNode *parent,const QCString &word,
+ const QCString &ref,const QCString &file,
+ const QCString &anchor,const QCString &tooltip) :
+ m_word(word), m_ref(ref),
+ m_file(file), m_relPath(g_relPath), m_anchor(anchor),
+ m_tooltip(tooltip)
+{
+ m_parent = parent;
+ //printf("DocLinkedWord: new word %s url=%s tooltip='%s'\n",
+ // word.data(),g_searchUrl.data(),tooltip.data());
+ if (Doxygen::searchIndex && !g_searchUrl.isEmpty())
+ {
+ Doxygen::searchIndex->addWord(word,FALSE);
+ }
+}
+
+//---------------------------------------------------------------------------
+
+DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
+{
+ m_parent = parent;
+ if (id.isEmpty())
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Empty anchor label");
+ }
+ if (newAnchor) // found <a name="label">
+ {
+ m_anchor = id;
+ }
+ else // found \anchor label
+ {
+ SectionInfo *sec = Doxygen::sectionDict[id];
+ if (sec)
+ {
+ //printf("Found anchor %s\n",id.data());
+ m_file = sec->fileName;
+ m_anchor = sec->label;
+ if (g_sectionDict && g_sectionDict->find(id)==0)
+ {
+ //printf("Inserting in dictionary!\n");
+ g_sectionDict->insert(id,sec);
+ }
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid anchor id `%s'",qPrint(id));
+ m_anchor = "invalid";
+ m_file = "invalid";
+ }
+ }
+}
+
+//---------------------------------------------------------------------------
+
+DocVerbatim::DocVerbatim(DocNode *parent,const QCString &context,
+ const QCString &text, Type t,bool isExample,
+ const QCString &exampleFile)
+ : m_context(context), m_text(text), m_type(t),
+ m_isExample(isExample), m_exampleFile(exampleFile), m_relPath(g_relPath)
+{
+ m_parent = parent;
+}
+
+
+//---------------------------------------------------------------------------
+
+void DocInclude::parse()
+{
+ DBG(("DocInclude::parse(file=%s,text=%s)\n",qPrint(m_file),qPrint(m_text)));
+ switch(m_type)
+ {
+ case IncWithLines:
+ // fall through
+ case Include:
+ // fall through
+ case DontInclude:
+ readTextFileByName(m_file,m_text);
+ g_includeFileText = m_text;
+ g_includeFileOffset = 0;
+ g_includeFileLength = m_text.length();
+ //printf("g_includeFile=<<%s>>\n",g_includeFileText.data());
+ break;
+ case VerbInclude:
+ // fall through
+ case HtmlInclude:
+ readTextFileByName(m_file,m_text);
+ break;
+ }
+}
+
+//---------------------------------------------------------------------------
+
+void DocIncOperator::parse()
+{
+ const char *p = g_includeFileText;
+ uint l = g_includeFileLength;
+ uint o = g_includeFileOffset;
+ DBG(("DocIncOperator::parse() text=%s off=%d len=%d\n",qPrint(p),o,l));
+ uint so = o,bo;
+ bool nonEmpty = FALSE;
+ switch(type())
+ {
+ case Line:
+ while (o<l)
+ {
+ char c = p[o];
+ if (c=='\n')
+ {
+ if (nonEmpty) break; // we have a pattern to match
+ so=o+1; // no pattern, skip empty line
+ }
+ else if (!isspace((uchar)c)) // no white space char
+ {
+ nonEmpty=TRUE;
+ }
+ o++;
+ }
+ if (g_includeFileText.mid(so,o-so).find(m_pattern)!=-1)
+ {
+ m_text = g_includeFileText.mid(so,o-so);
+ DBG(("DocIncOperator::parse() Line: %s\n",qPrint(m_text)));
+ }
+ g_includeFileOffset = QMIN(l,o+1); // set pointer to start of new line
+ break;
+ case SkipLine:
+ while (o<l)
+ {
+ so=o;
+ while (o<l)
+ {
+ char c = p[o];
+ if (c=='\n')
+ {
+ if (nonEmpty) break; // we have a pattern to match
+ so=o+1; // no pattern, skip empty line
+ }
+ else if (!isspace((uchar)c)) // no white space char
+ {
+ nonEmpty=TRUE;
+ }
+ o++;
+ }
+ if (g_includeFileText.mid(so,o-so).find(m_pattern)!=-1)
+ {
+ m_text = g_includeFileText.mid(so,o-so);
+ DBG(("DocIncOperator::parse() SkipLine: %s\n",qPrint(m_text)));
+ break;
+ }
+ o++; // skip new line
+ }
+ g_includeFileOffset = QMIN(l,o+1); // set pointer to start of new line
+ break;
+ case Skip:
+ while (o<l)
+ {
+ so=o;
+ while (o<l)
+ {
+ char c = p[o];
+ if (c=='\n')
+ {
+ if (nonEmpty) break; // we have a pattern to match
+ so=o+1; // no pattern, skip empty line
+ }
+ else if (!isspace((uchar)c)) // no white space char
+ {
+ nonEmpty=TRUE;
+ }
+ o++;
+ }
+ if (g_includeFileText.mid(so,o-so).find(m_pattern)!=-1)
+ {
+ break;
+ }
+ o++; // skip new line
+ }
+ g_includeFileOffset = so; // set pointer to start of new line
+ break;
+ case Until:
+ bo=o;
+ while (o<l)
+ {
+ so=o;
+ while (o<l)
+ {
+ char c = p[o];
+ if (c=='\n')
+ {
+ if (nonEmpty) break; // we have a pattern to match
+ so=o+1; // no pattern, skip empty line
+ }
+ else if (!isspace((uchar)c)) // no white space char
+ {
+ nonEmpty=TRUE;
+ }
+ o++;
+ }
+ if (g_includeFileText.mid(so,o-so).find(m_pattern)!=-1)
+ {
+ m_text = g_includeFileText.mid(bo,o-bo);
+ DBG(("DocIncOperator::parse() Until: %s\n",qPrint(m_text)));
+ break;
+ }
+ o++; // skip new line
+ }
+ g_includeFileOffset = QMIN(l,o+1); // set pointer to start of new line
+ break;
+ }
+}
+
+//---------------------------------------------------------------------------
+
+void DocCopy::parse()
+{
+ QCString doc,brief;
+ Definition *def;
+ if (findDocsForMemberOrCompound(m_link,&doc,&brief,&def))
+ {
+ if (g_copyStack.findRef(def)==-1) // definition not parsed earlier
+ {
+ bool hasParamCommand = g_hasParamCommand;
+ bool hasReturnCommand = g_hasReturnCommand;
+ QDict<void> paramsFound = g_paramsFound;
+ //printf("..1 hasParamCommand=%d hasReturnCommand=%d paramsFound=%d\n",
+ // g_hasParamCommand,g_hasReturnCommand,g_paramsFound.count());
+
+ docParserPushContext(FALSE);
+ g_scope = def;
+ if (def->definitionType()==Definition::TypeMember && def->getOuterScope())
+ {
+ if (def->getOuterScope()!=Doxygen::globalScope)
+ {
+ g_context=def->getOuterScope()->name();
+ }
+ }
+ else if (def!=Doxygen::globalScope)
+ {
+ g_context=def->name();
+ }
+ g_styleStack.clear();
+ g_nodeStack.clear();
+ g_paramsFound.clear();
+ g_copyStack.append(def);
+ // make sure the descriptions end with a newline, so the parser will correctly
+ // handle them in all cases.
+ //printf("doc='%s'\n",doc.data());
+ //printf("brief='%s'\n",brief.data());
+ if (m_copyBrief)
+ {
+ brief+='\n';
+ internalValidatingParseDoc(this,m_children,brief);
+
+ //printf("..2 hasParamCommand=%d hasReturnCommand=%d paramsFound=%d\n",
+ // g_hasParamCommand,g_hasReturnCommand,g_paramsFound.count());
+ hasParamCommand = hasParamCommand || g_hasParamCommand;
+ hasReturnCommand = hasReturnCommand || g_hasReturnCommand;
+ QDictIterator<void> it(g_paramsFound);
+ void *item;
+ for (;(item=it.current());++it)
+ {
+ paramsFound.insert(it.currentKey(),it.current());
+ }
+ }
+ if (m_copyDetails)
+ {
+ doc+='\n';
+ internalValidatingParseDoc(this,m_children,doc);
+
+ //printf("..3 hasParamCommand=%d hasReturnCommand=%d paramsFound=%d\n",
+ // g_hasParamCommand,g_hasReturnCommand,g_paramsFound.count());
+ hasParamCommand = hasParamCommand || g_hasParamCommand;
+ hasReturnCommand = hasReturnCommand || g_hasReturnCommand;
+ QDictIterator<void> it(g_paramsFound);
+ void *item;
+ for (;(item=it.current());++it)
+ {
+ paramsFound.insert(it.currentKey(),it.current());
+ }
+ }
+ g_copyStack.remove(def);
+ ASSERT(g_styleStack.isEmpty());
+ ASSERT(g_nodeStack.isEmpty());
+ docParserPopContext(TRUE);
+
+ g_hasParamCommand = hasParamCommand;
+ g_hasReturnCommand = hasReturnCommand;
+ g_paramsFound = paramsFound;
+
+ //printf("..4 hasParamCommand=%d hasReturnCommand=%d paramsFound=%d\n",
+ // g_hasParamCommand,g_hasReturnCommand,g_paramsFound.count());
+ }
+ else // oops, recursion
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: recursive call chain of \\copydoc commands detected at %d\n",
+ doctokenizerYYlineno);
+ }
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: target %s of \\copydoc command not found",
+ qPrint(m_link));
+ }
+}
+
+//---------------------------------------------------------------------------
+
+DocXRefItem::DocXRefItem(DocNode *parent,int id,const char *key) :
+ m_id(id), m_key(key), m_relPath(g_relPath)
+{
+ m_parent = parent;
+}
+
+bool DocXRefItem::parse()
+{
+ QCString listName;
+ RefList *refList = Doxygen::xrefLists->find(m_key);
+ if (refList &&
+ (
+ // either not a built-in list or the list is enabled
+ (m_key!="todo" || Config_getBool("GENERATE_TODOLIST")) &&
+ (m_key!="test" || Config_getBool("GENERATE_TESTLIST")) &&
+ (m_key!="bug" || Config_getBool("GENERATE_BUGLIST")) &&
+ (m_key!="deprecated" || Config_getBool("GENERATE_DEPRECATEDLIST"))
+ )
+ )
+ {
+ RefItem *item = refList->getRefItem(m_id);
+ ASSERT(item!=0);
+ if (item)
+ {
+ if (g_memberDef && g_memberDef->name().at(0)=='@')
+ {
+ m_file = "@"; // can't cross reference anonymous enum
+ m_anchor = "@";
+ }
+ else
+ {
+ m_file = convertNameToFile(refList->listName(),FALSE,TRUE);
+ m_anchor = item->listAnchor;
+ }
+ m_title = refList->sectionTitle();
+ //printf("DocXRefItem: file=%s anchor=%s title=%s\n",
+ // m_file.data(),m_anchor.data(),m_title.data());
+
+ if (!item->text.isEmpty())
+ {
+ docParserPushContext();
+ internalValidatingParseDoc(this,m_children,item->text);
+ docParserPopContext();
+ }
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//---------------------------------------------------------------------------
+
+DocFormula::DocFormula(DocNode *parent,int id) :
+ m_relPath(g_relPath)
+{
+ m_parent = parent;
+ QCString formCmd;
+ formCmd.sprintf("\\form#%d",id);
+ Formula *formula=Doxygen::formulaNameDict[formCmd];
+ if (formula)
+ {
+ m_id = formula->getId();
+ m_name.sprintf("form_%d",m_id);
+ m_text = formula->getFormulaText();
+ }
+}
+
+//---------------------------------------------------------------------------
+
+//int DocLanguage::parse()
+//{
+// int retval;
+// DBG(("DocLanguage::parse() start\n"));
+// g_nodeStack.push(this);
+//
+// // parse one or more paragraphs
+// bool isFirst=TRUE;
+// DocPara *par=0;
+// do
+// {
+// par = new DocPara(this);
+// if (isFirst) { par->markFirst(); isFirst=FALSE; }
+// m_children.append(par);
+// retval=par->parse();
+// }
+// while (retval==TK_NEWPARA);
+// if (par) par->markLast();
+//
+// DBG(("DocLanguage::parse() end\n"));
+// DocNode *n = g_nodeStack.pop();
+// ASSERT(n==this);
+// return retval;
+//}
+
+//---------------------------------------------------------------------------
+
+void DocSecRefItem::parse()
+{
+ DBG(("DocSecRefItem::parse() start\n"));
+ g_nodeStack.push(this);
+
+ doctokenizerYYsetStateTitle();
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\refitem",
+ qPrint(g_token->name));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+ doctokenizerYYsetStatePara();
+ handlePendingStyleCommands(this,m_children);
+
+ SectionInfo *sec=0;
+ if (!m_target.isEmpty())
+ {
+ sec=Doxygen::sectionDict[m_target];
+ if (sec)
+ {
+ m_file = sec->fileName;
+ m_anchor = sec->label;
+ if (g_sectionDict && g_sectionDict->find(m_target)==0)
+ {
+ g_sectionDict->insert(m_target,sec);
+ }
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: reference to unknown section %s",
+ qPrint(m_target));
+ }
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: reference to empty target");
+ }
+
+ DBG(("DocSecRefItem::parse() end\n"));
+ DocNode *n = g_nodeStack.pop();
+ ASSERT(n==this);
+}
+
+//---------------------------------------------------------------------------
+
+void DocSecRefList::parse()
+{
+ DBG(("DocSecRefList::parse() start\n"));
+ g_nodeStack.push(this);
+
+ int tok=doctokenizerYYlex();
+ // skip white space
+ while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
+ // handle items
+ while (tok)
+ {
+ if (tok==TK_COMMAND)
+ {
+ switch (Mappers::cmdMapper->map(g_token->name))
+ {
+ case CMD_SECREFITEM:
+ {
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after \\refitem command");
+ break;
+ }
+ tok=doctokenizerYYlex();
+ if (tok!=TK_WORD && tok!=TK_LNKWORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of \\refitem",
+ tokToString(tok));
+ break;
+ }
+
+ DocSecRefItem *item = new DocSecRefItem(this,g_token->name);
+ m_children.append(item);
+ item->parse();
+ }
+ break;
+ case CMD_ENDSECREFLIST:
+ goto endsecreflist;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\secreflist",
+ qPrint(g_token->name));
+ goto endsecreflist;
+ }
+ }
+ else if (tok==TK_WHITESPACE)
+ {
+ // ignore whitespace
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s inside section reference list",
+ tokToString(tok));
+ goto endsecreflist;
+ }
+ tok=doctokenizerYYlex();
+ }
+
+endsecreflist:
+ DBG(("DocSecRefList::parse() end\n"));
+ DocNode *n = g_nodeStack.pop();
+ ASSERT(n==this);
+}
+
+//---------------------------------------------------------------------------
+
+DocInternalRef::DocInternalRef(DocNode *parent,const QCString &ref)
+ : m_relPath(g_relPath)
+{
+ m_parent = parent;
+ int i=ref.find('#');
+ if (i!=-1)
+ {
+ m_anchor = ref.right(ref.length()-i-1);
+ m_file = ref.left(i);
+ }
+ else
+ {
+ m_file = ref;
+ }
+}
+
+void DocInternalRef::parse()
+{
+ g_nodeStack.push(this);
+ DBG(("DocInternalRef::parse() start\n"));
+
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\ref",
+ qPrint(g_token->name));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+
+ handlePendingStyleCommands(this,m_children);
+ DBG(("DocInternalRef::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+}
+
+//---------------------------------------------------------------------------
+
+DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
+ m_refToSection(FALSE), m_refToAnchor(FALSE)
+{
+ m_parent = parent;
+ Definition *compound = 0;
+ QCString anchor;
+ //printf("DocRef::DocRef(target=%s,context=%s\n",target.data(),context.data());
+ ASSERT(!target.isEmpty());
+ m_relPath = g_relPath;
+ SectionInfo *sec = Doxygen::sectionDict[target];
+ if (sec) // ref to section or anchor
+ {
+ m_text = sec->title;
+ if (m_text.isEmpty()) m_text = sec->label;
+
+ m_ref = sec->ref;
+ m_file = stripKnownExtensions(sec->fileName);
+ if (sec->type!=SectionInfo::Page) m_anchor = sec->label;
+ m_refToAnchor = sec->type==SectionInfo::Anchor;
+ m_refToSection = sec->type!=SectionInfo::Anchor;
+ //printf("m_text=%s,m_ref=%s,m_file=%s,m_refToAnchor=%d type=%d\n",
+ // m_text.data(),m_ref.data(),m_file.data(),m_refToAnchor,sec->type);
+ return;
+ }
+ else if (resolveLink(context,target,TRUE,&compound,anchor))
+ {
+ bool isFile = compound ?
+ (compound->definitionType()==Definition::TypeFile ? TRUE : FALSE) :
+ FALSE;
+ m_text = linkToText(target,isFile);
+ m_anchor = anchor;
+ if (compound && compound->isLinkable()) // ref to compound
+ {
+ if (anchor.isEmpty() && /* compound link */
+ compound->definitionType()==Definition::TypeGroup && /* is group */
+ ((GroupDef *)compound)->groupTitle() /* with title */
+ )
+ {
+ m_text=((GroupDef *)compound)->groupTitle(); // use group's title as link
+ }
+ else if (compound->definitionType()==Definition::TypeMember &&
+ ((MemberDef*)compound)->isObjCMethod())
+ {
+ // Objective C Method
+ MemberDef *member = (MemberDef*)compound;
+ bool localLink = g_memberDef ? member->getClassDef()==g_memberDef->getClassDef() : FALSE;
+ m_text = member->objCMethodName(localLink,g_inSeeBlock);
+ }
+
+ m_file = compound->getOutputFileBase();
+ m_ref = compound->getReference();
+ return;
+ }
+ else if (compound->definitionType()==Definition::TypeFile &&
+ ((FileDef*)compound)->generateSourceFile()
+ ) // undocumented file that has source code we can link to
+ {
+ m_file = compound->getSourceFileBase();
+ m_ref = compound->getReference();
+ return;
+ }
+ }
+ m_text = linkToText(target,FALSE);
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unable to resolve reference to `%s' for \\ref command",
+ qPrint(target));
+}
+
+static void flattenParagraphs(DocNode *root,QList<DocNode> &children)
+{
+ QListIterator<DocNode> li(children);
+ QList<DocNode> newChildren;
+ DocNode *dn;
+ for (li.toFirst();(dn=li.current());++li)
+ {
+ if (dn->kind()==DocNode::Kind_Para)
+ {
+ DocPara *para = (DocPara*)dn;
+ QList<DocNode> &paraChildren = para->children();
+ paraChildren.setAutoDelete(FALSE); // unlink children from paragraph node
+ QListIterator<DocNode> li2(paraChildren);
+ DocNode *dn2;
+ for (li2.toFirst();(dn2=li2.current());++li2)
+ {
+ newChildren.append(dn2); // add them to new node
+ }
+ }
+ }
+ children.clear();
+ QListIterator<DocNode> li3(newChildren);
+ for (li3.toFirst();(dn=li3.current());++li3)
+ {
+ children.append(dn);
+ dn->setParent(root);
+ }
+}
+
+void DocRef::parse()
+{
+ g_nodeStack.push(this);
+ DBG(("DocRef::parse() start\n"));
+
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\ref",
+ qPrint(g_token->name));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ case TK_HTMLTAG:
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+
+ if (m_children.isEmpty() && !m_text.isEmpty())
+ {
+ g_insideHtmlLink=TRUE;
+ docParserPushContext();
+ internalValidatingParseDoc(this,m_children,m_text);
+ docParserPopContext();
+ g_insideHtmlLink=FALSE;
+ flattenParagraphs(this,m_children);
+ }
+
+ handlePendingStyleCommands(this,m_children);
+
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+}
+
+//---------------------------------------------------------------------------
+
+DocLink::DocLink(DocNode *parent,const QCString &target)
+{
+ m_parent = parent;
+ Definition *compound;
+ //PageInfo *page;
+ QCString anchor;
+ m_refText = target;
+ m_relPath = g_relPath;
+ if (!m_refText.isEmpty() && m_refText.at(0)=='#')
+ {
+ m_refText = m_refText.right(m_refText.length()-1);
+ }
+ if (resolveLink(g_context,stripKnownExtensions(target),g_inSeeBlock,
+ &compound,anchor))
+ {
+ m_anchor = anchor;
+ if (compound && compound->isLinkable())
+ {
+ m_file = compound->getOutputFileBase();
+ m_ref = compound->getReference();
+ }
+ else if (compound->definitionType()==Definition::TypeFile &&
+ ((FileDef*)compound)->generateSourceFile()
+ ) // undocumented file that has source code we can link to
+ {
+ m_file = compound->getSourceFileBase();
+ m_ref = compound->getReference();
+ }
+ return;
+ }
+
+ // bogus link target
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unable to resolve link to `%s' for \\link command",
+ qPrint(target));
+}
+
+
+QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
+{
+ QCString result;
+ g_nodeStack.push(this);
+ DBG(("DocLink::parse() start\n"));
+
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children,FALSE))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ switch (Mappers::cmdMapper->map(g_token->name))
+ {
+ case CMD_ENDLINK:
+ if (isJavaLink)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: {@link.. ended with @endlink command");
+ }
+ goto endlink;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\link",
+ qPrint(g_token->name));
+ break;
+ }
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ case TK_HTMLTAG:
+ if (g_token->name!="see" || !isXmlLink)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected xml/html command %s found",
+ qPrint(g_token->name));
+ }
+ goto endlink;
+ case TK_LNKWORD:
+ case TK_WORD:
+ if (isJavaLink) // special case to detect closing }
+ {
+ QCString w = g_token->name;
+ int p;
+ if (w=="}")
+ {
+ goto endlink;
+ }
+ else if ((p=w.find('}'))!=-1)
+ {
+ uint l=w.length();
+ m_children.append(new DocWord(this,w.left(p)));
+ if ((uint)p<l-1) // something left after the } (for instance a .)
+ {
+ result=w.right(l-p-1);
+ }
+ goto endlink;
+ }
+ }
+ m_children.append(new DocWord(this,g_token->name));
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ " link command\n");
+ }
+endlink:
+
+ if (m_children.isEmpty()) // no link text
+ {
+ m_children.append(new DocWord(this,m_refText));
+ }
+
+ handlePendingStyleCommands(this,m_children);
+ DBG(("DocLink::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return result;
+}
+
+
+//---------------------------------------------------------------------------
+
+DocDotFile::DocDotFile(DocNode *parent,const QCString &name,const QCString &context) :
+ m_name(name), m_relPath(g_relPath), m_context(context)
+{
+ m_parent = parent;
+}
+
+void DocDotFile::parse()
+{
+ g_nodeStack.push(this);
+ DBG(("DocDotFile::parse() start\n"));
+
+ doctokenizerYYsetStateTitle();
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\dotfile",
+ qPrint(g_token->name));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+ tok=doctokenizerYYlex();
+ while (tok==TK_WORD) // there are values following the title
+ {
+ if (g_token->name=="width")
+ {
+ m_width=g_token->chars;
+ }
+ else if (g_token->name=="height")
+ {
+ m_height=g_token->chars;
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title",
+ qPrint(g_token->name));
+ }
+ tok=doctokenizerYYlex();
+ }
+ ASSERT(tok==0);
+ doctokenizerYYsetStatePara();
+ handlePendingStyleCommands(this,m_children);
+
+ bool ambig;
+ FileDef *fd = findFileDef(Doxygen::dotFileNameDict,m_name,ambig);
+ if (fd==0 && m_name.right(4)!=".dot") // try with .dot extension as well
+ {
+ fd = findFileDef(Doxygen::dotFileNameDict,m_name+".dot",ambig);
+ }
+ if (fd)
+ {
+ m_file = fd->absFilePath();
+ }
+ else if (ambig)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included dot file name %s is ambiguous.\n"
+ "Possible candidates:\n%s",qPrint(m_name),
+ qPrint(showFileDefMatches(Doxygen::exampleNameDict,m_name))
+ );
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included dot file %s is not found "
+ "in any of the paths specified via DOTFILE_DIRS!",qPrint(m_name));
+ }
+
+ DBG(("DocDotFile::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+}
+
+DocMscFile::DocMscFile(DocNode *parent,const QCString &name,const QCString &context) :
+ m_name(name), m_relPath(g_relPath), m_context(context)
+{
+ m_parent = parent;
+}
+
+void DocMscFile::parse()
+{
+ g_nodeStack.push(this);
+ DBG(("DocMscFile::parse() start\n"));
+
+ doctokenizerYYsetStateTitle();
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\mscfile",
+ qPrint(g_token->name));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+ tok=doctokenizerYYlex();
+ while (tok==TK_WORD) // there are values following the title
+ {
+ if (g_token->name=="width")
+ {
+ m_width=g_token->chars;
+ }
+ else if (g_token->name=="height")
+ {
+ m_height=g_token->chars;
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title",
+ qPrint(g_token->name));
+ }
+ tok=doctokenizerYYlex();
+ }
+ ASSERT(tok==0);
+ doctokenizerYYsetStatePara();
+ handlePendingStyleCommands(this,m_children);
+
+ bool ambig;
+ FileDef *fd = findFileDef(Doxygen::mscFileNameDict,m_name,ambig);
+ if (fd==0 && m_name.right(4)!=".msc") // try with .msc extension as well
+ {
+ fd = findFileDef(Doxygen::mscFileNameDict,m_name+".msc",ambig);
+ }
+ if (fd)
+ {
+ m_file = fd->absFilePath();
+ }
+ else if (ambig)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included msc file name %s is ambiguous.\n"
+ "Possible candidates:\n%s",qPrint(m_name),
+ qPrint(showFileDefMatches(Doxygen::exampleNameDict,m_name))
+ );
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included msc file %s is not found "
+ "in any of the paths specified via MSCFILE_DIRS!",qPrint(m_name));
+ }
+
+ DBG(("DocMscFile::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+}
+
+
+
+//---------------------------------------------------------------------------
+
+DocImage::DocImage(DocNode *parent,const HtmlAttribList &attribs,const QCString &name,Type t) :
+ m_attribs(attribs), m_name(name),
+ m_type(t), m_relPath(g_relPath)
+{
+ m_parent = parent;
+}
+
+void DocImage::parse()
+{
+ g_nodeStack.push(this);
+ DBG(("DocImage::parse() start\n"));
+
+ // parse title
+ doctokenizerYYsetStateTitle();
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (tok==TK_WORD && (g_token->name=="width=" || g_token->name=="height="))
+ {
+ // special case: no title, but we do have a size indicator
+ doctokenizerYYsetStateTitleAttrValue();
+ // strip =
+ g_token->name=g_token->name.left(g_token->name.length()-1);
+ break;
+ }
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\image",
+ qPrint(g_token->name));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+ // parse size attributes
+ tok=doctokenizerYYlex();
+ while (tok==TK_WORD) // there are values following the title
+ {
+ if (g_token->name=="width")
+ {
+ m_width=g_token->chars;
+ }
+ else if (g_token->name=="height")
+ {
+ m_height=g_token->chars;
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title",
+ qPrint(g_token->name));
+ }
+ tok=doctokenizerYYlex();
+ }
+ doctokenizerYYsetStatePara();
+
+ handlePendingStyleCommands(this,m_children);
+ DBG(("DocImage::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+}
+
+
+//---------------------------------------------------------------------------
+
+int DocHtmlHeader::parse()
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlHeader::parse() start\n"));
+
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <h%d> tag",
+ qPrint(g_token->name),m_level);
+ break;
+ case TK_HTMLTAG:
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==HTML_H1 && g_token->endTag) // found </h1> tag
+ {
+ if (m_level!=1)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h1>",
+ m_level);
+ }
+ goto endheader;
+ }
+ else if (tagId==HTML_H2 && g_token->endTag) // found </h2> tag
+ {
+ if (m_level!=2)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h2>",
+ m_level);
+ }
+ goto endheader;
+ }
+ else if (tagId==HTML_H3 && g_token->endTag) // found </h3> tag
+ {
+ if (m_level!=3)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h3>",
+ m_level);
+ }
+ goto endheader;
+ }
+ else if (tagId==HTML_H4 && g_token->endTag) // found </h4> tag
+ {
+ if (m_level!=4)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h4>",
+ m_level);
+ }
+ goto endheader;
+ }
+ else if (tagId==HTML_H5 && g_token->endTag) // found </h5> tag
+ {
+ if (m_level!=5)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h5>",
+ m_level);
+ }
+ goto endheader;
+ }
+ else if (tagId==HTML_H6 && g_token->endTag) // found </h6> tag
+ {
+ if (m_level!=6)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h6>",
+ m_level);
+ }
+ goto endheader;
+ }
+ else if (tagId==HTML_A)
+ {
+ if (!g_token->endTag)
+ {
+ handleAHref(this,m_children,g_token->attribs);
+ }
+ }
+ else if (tagId==HTML_BR)
+ {
+ DocLineBreak *lb = new DocLineBreak(this);
+ m_children.append(lb);
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <h%d> context",
+ g_token->endTag?"/":"",qPrint(g_token->name),m_level);
+ }
+
+ }
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ " <h%d> tag\n",m_level);
+ }
+endheader:
+ handlePendingStyleCommands(this,m_children);
+ DBG(("DocHtmlHeader::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocHRef::parse()
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocHRef::parse() start\n"));
+
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <a>..</a> block",
+ qPrint(g_token->name));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ case TK_HTMLTAG:
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==HTML_A && g_token->endTag) // found </a> tag
+ {
+ goto endhref;
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <a href=...> context",
+ g_token->endTag?"/":"",qPrint(g_token->name),doctokenizerYYlineno);
+ }
+ }
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok),doctokenizerYYlineno);
+ break;
+ }
+ }
+ }
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ " <a href=...> tag",doctokenizerYYlineno);
+ }
+endhref:
+ handlePendingStyleCommands(this,m_children);
+ DBG(("DocHRef::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocInternal::parse(int level)
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocInternal::parse() start\n"));
+
+ // first parse any number of paragraphs
+ bool isFirst=TRUE;
+ DocPara *lastPar=0;
+ do
+ {
+ DocPara *par = new DocPara(this);
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ retval=par->parse();
+ if (!par->isEmpty())
+ {
+ m_children.append(par);
+ lastPar=par;
+ }
+ else
+ {
+ delete par;
+ }
+ if (retval==TK_LISTITEM)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found",doctokenizerYYlineno);
+ }
+ } while (retval!=0 &&
+ retval!=RetVal_Section &&
+ retval!=RetVal_Subsection &&
+ retval!=RetVal_Subsubsection &&
+ retval!=RetVal_Paragraph
+ );
+ if (lastPar) lastPar->markLast();
+
+ // then parse any number of level-n sections
+ while ((level==1 && retval==RetVal_Section) ||
+ (level==2 && retval==RetVal_Subsection) ||
+ (level==3 && retval==RetVal_Subsubsection) ||
+ (level==4 && retval==RetVal_Paragraph)
+ )
+ {
+ DocSection *s=new DocSection(this,
+ QMIN(level+Doxygen::subpageNestingLevel,5),g_token->sectionId);
+ m_children.append(s);
+ retval = s->parse();
+ }
+
+ if (retval==RetVal_Internal)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: \\internal command found inside internal section");
+ }
+
+ DBG(("DocInternal::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocIndexEntry::parse()
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocIndexEntry::parse() start\n"));
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after \\addindex command");
+ goto endindexentry;
+ }
+ doctokenizerYYsetStateTitle();
+ m_entry="";
+ while ((tok=doctokenizerYYlex()))
+ {
+ switch (tok)
+ {
+ case TK_WHITESPACE:
+ m_entry+=" ";
+ break;
+ case TK_WORD:
+ case TK_LNKWORD:
+ m_entry+=g_token->name;
+ break;
+ case TK_SYMBOL:
+ {
+ char letter='\0';
+ DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
+ switch (s)
+ {
+ case DocSymbol::BSlash: m_entry+='\\'; break;
+ case DocSymbol::At: m_entry+='@'; break;
+ case DocSymbol::Less: m_entry+='<'; break;
+ case DocSymbol::Greater: m_entry+='>'; break;
+ case DocSymbol::Amp: m_entry+='&'; break;
+ case DocSymbol::Dollar: m_entry+='$'; break;
+ case DocSymbol::Hash: m_entry+='#'; break;
+ case DocSymbol::Percent: m_entry+='%'; break;
+ case DocSymbol::Apos: m_entry+='\''; break;
+ case DocSymbol::Quot: m_entry+='"'; break;
+ case DocSymbol::Lsquo: m_entry+='`'; break;
+ case DocSymbol::Rsquo: m_entry+='\''; break;
+ case DocSymbol::Ldquo: m_entry+="``"; break;
+ case DocSymbol::Rdquo: m_entry+="''"; break;
+ case DocSymbol::Ndash: m_entry+="--"; break;
+ case DocSymbol::Mdash: m_entry+="---"; break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected symbol found as argument of \\addindex");
+ break;
+ }
+ }
+ break;
+ case TK_COMMAND:
+ switch (Mappers::cmdMapper->map(g_token->name))
+ {
+ case CMD_BSLASH: m_entry+='\\'; break;
+ case CMD_AT: m_entry+='@'; break;
+ case CMD_LESS: m_entry+='<'; break;
+ case CMD_GREATER: m_entry+='>'; break;
+ case CMD_AMP: m_entry+='&'; break;
+ case CMD_DOLLAR: m_entry+='$'; break;
+ case CMD_HASH: m_entry+='#'; break;
+ case CMD_DCOLON: m_entry+="::"; break;
+ case CMD_PERCENT: m_entry+='%'; break;
+ case CMD_QUOTE: m_entry+='"'; break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected command %s found as argument of \\addindex",
+ qPrint(g_token->name));
+ break;
+ }
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ if (tok!=0) retval=tok;
+ doctokenizerYYsetStatePara();
+ m_entry = m_entry.stripWhiteSpace();
+endindexentry:
+ DBG(("DocIndexEntry::parse() end retval=%x\n",retval));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocHtmlCaption::parse()
+{
+ int retval=0;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlCaption::parse() start\n"));
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <caption> tag",
+ qPrint(g_token->name));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ case TK_HTMLTAG:
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==HTML_CAPTION && g_token->endTag) // found </caption> tag
+ {
+ retval = RetVal_OK;
+ goto endcaption;
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <caption> context",
+ g_token->endTag?"/":"",qPrint(g_token->name));
+ }
+ }
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ " <caption> tag",doctokenizerYYlineno);
+ }
+endcaption:
+ handlePendingStyleCommands(this,m_children);
+ DBG(("DocHtmlCaption::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocHtmlCell::parse()
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlCell::parse() start\n"));
+
+ // parse one or more paragraphs
+ bool isFirst=TRUE;
+ DocPara *par=0;
+ do
+ {
+ par = new DocPara(this);
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ m_children.append(par);
+ retval=par->parse();
+ if (retval==TK_HTMLTAG)
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==HTML_TD && g_token->endTag) // found </dt> tag
+ {
+ retval=TK_NEWPARA; // ignore the tag
+ }
+ else if (tagId==HTML_TH && g_token->endTag) // found </th> tag
+ {
+ retval=TK_NEWPARA; // ignore the tag
+ }
+ }
+ }
+ while (retval==TK_NEWPARA);
+ if (par) par->markLast();
+
+ DBG(("DocHtmlCell::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+int DocHtmlCell::parseXml()
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlCell::parseXml() start\n"));
+
+ // parse one or more paragraphs
+ bool isFirst=TRUE;
+ DocPara *par=0;
+ do
+ {
+ par = new DocPara(this);
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ m_children.append(par);
+ retval=par->parse();
+ if (retval==TK_HTMLTAG)
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==XML_ITEM && g_token->endTag) // found </item> tag
+ {
+ retval=TK_NEWPARA; // ignore the tag
+ }
+ else if (tagId==XML_DESCRIPTION && g_token->endTag) // found </description> tag
+ {
+ retval=TK_NEWPARA; // ignore the tag
+ }
+ }
+ }
+ while (retval==TK_NEWPARA);
+ if (par) par->markLast();
+
+ DBG(("DocHtmlCell::parseXml() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocHtmlRow::parse()
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlRow::parse() start\n"));
+
+ bool isHeading=FALSE;
+ bool isFirst=TRUE;
+ DocHtmlCell *cell=0;
+
+ // get next token
+ int tok=doctokenizerYYlex();
+ // skip whitespace
+ while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
+ // should find a html tag now
+ if (tok==TK_HTMLTAG)
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==HTML_TD && !g_token->endTag) // found <td> tag
+ {
+ }
+ else if (tagId==HTML_TH && !g_token->endTag) // found <th> tag
+ {
+ isHeading=TRUE;
+ }
+ else // found some other tag
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <td> or <th> tag but "
+ "found <%s> instead!",qPrint(g_token->name));
+ doctokenizerYYpushBackHtmlTag(g_token->name);
+ goto endrow;
+ }
+ }
+ else if (tok==0) // premature end of comment
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ " for a html description title");
+ goto endrow;
+ }
+ else // token other than html token
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <td> or <th> tag but found %s token instead!",
+ tokToString(tok));
+ goto endrow;
+ }
+
+ // parse one or more cells
+ do
+ {
+ cell=new DocHtmlCell(this,g_token->attribs,isHeading);
+ cell->markFirst(isFirst);
+ isFirst=FALSE;
+ m_children.append(cell);
+ retval=cell->parse();
+ isHeading = retval==RetVal_TableHCell;
+ }
+ while (retval==RetVal_TableCell || retval==RetVal_TableHCell);
+ if (cell) cell->markLast(TRUE);
+
+endrow:
+ DBG(("DocHtmlRow::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+int DocHtmlRow::parseXml(bool isHeading)
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlRow::parseXml() start\n"));
+
+ bool isFirst=TRUE;
+ DocHtmlCell *cell=0;
+
+ // get next token
+ int tok=doctokenizerYYlex();
+ // skip whitespace
+ while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
+ // should find a html tag now
+ if (tok==TK_HTMLTAG)
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==XML_TERM && !g_token->endTag) // found <term> tag
+ {
+ }
+ else if (tagId==XML_DESCRIPTION && !g_token->endTag) // found <description> tag
+ {
+ }
+ else // found some other tag
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <term> or <description> tag but "
+ "found <%s> instead!",qPrint(g_token->name));
+ doctokenizerYYpushBackHtmlTag(g_token->name);
+ goto endrow;
+ }
+ }
+ else if (tok==0) // premature end of comment
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ " for a html description title");
+ goto endrow;
+ }
+ else // token other than html token
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <td> or <th> tag but found %s token instead!",
+ tokToString(tok));
+ goto endrow;
+ }
+
+ do
+ {
+ cell=new DocHtmlCell(this,g_token->attribs,isHeading);
+ cell->markFirst(isFirst);
+ isFirst=FALSE;
+ m_children.append(cell);
+ retval=cell->parseXml();
+ }
+ while (retval==RetVal_TableCell || retval==RetVal_TableHCell);
+ if (cell) cell->markLast(TRUE);
+
+endrow:
+ DBG(("DocHtmlRow::parseXml() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocHtmlTable::parse()
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlTable::parse() start\n"));
+
+getrow:
+ // get next token
+ int tok=doctokenizerYYlex();
+ // skip whitespace
+ while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
+ // should find a html tag now
+ if (tok==TK_HTMLTAG)
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==HTML_TR && !g_token->endTag) // found <tr> tag
+ {
+ // no caption, just rows
+ retval=RetVal_TableRow;
+ }
+ else if (tagId==HTML_CAPTION && !g_token->endTag) // found <caption> tag
+ {
+ if (m_caption)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: table already has a caption, found another one");
+ }
+ else
+ {
+ m_caption = new DocHtmlCaption(this,g_token->attribs);
+ retval=m_caption->parse();
+
+ if (retval==RetVal_OK) // caption was parsed ok
+ {
+ goto getrow;
+ }
+ }
+ }
+ else // found wrong token
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <tr> or <caption> tag but "
+ "found <%s%s> instead!", g_token->endTag ? "/" : "", qPrint(g_token->name));
+ }
+ }
+ else if (tok==0) // premature end of comment
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ " for a <tr> or <caption> tag");
+ }
+ else // token other than html token
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <tr> tag but found %s token instead!",
+ tokToString(tok));
+ }
+
+ // parse one or more rows
+ while (retval==RetVal_TableRow)
+ {
+ DocHtmlRow *tr=new DocHtmlRow(this,g_token->attribs);
+ m_children.append(tr);
+ retval=tr->parse();
+ }
+
+ DBG(("DocHtmlTable::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval==RetVal_EndTable ? RetVal_OK : retval;
+}
+
+int DocHtmlTable::parseXml()
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlTable::parseXml() start\n"));
+
+ // get next token
+ int tok=doctokenizerYYlex();
+ // skip whitespace
+ while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
+ // should find a html tag now
+ int tagId=0;
+ bool isHeader=FALSE;
+ if (tok==TK_HTMLTAG)
+ {
+ tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==XML_ITEM && !g_token->endTag) // found <item> tag
+ {
+ retval=RetVal_TableRow;
+ }
+ if (tagId==XML_LISTHEADER && !g_token->endTag) // found <listheader> tag
+ {
+ retval=RetVal_TableRow;
+ isHeader=TRUE;
+ }
+ }
+
+ // parse one or more rows
+ while (retval==RetVal_TableRow)
+ {
+ DocHtmlRow *tr=new DocHtmlRow(this,g_token->attribs);
+ m_children.append(tr);
+ retval=tr->parseXml(isHeader);
+ isHeader=FALSE;
+ }
+
+ DBG(("DocHtmlTable::parseXml() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval==RetVal_EndTable ? RetVal_OK : retval;
+}
+
+uint DocHtmlTable::numCols() const
+{
+ uint cols=0;
+ QListIterator<DocNode> cli(m_children);
+ DocNode *n;
+ for (cli.toFirst();(n=cli.current());++cli)
+ {
+ ASSERT(n->kind()==DocNode::Kind_HtmlRow);
+ cols=QMAX(cols,((DocHtmlRow *)n)->numCells());
+ }
+ return cols;
+}
+
+void DocHtmlTable::accept(DocVisitor *v)
+{
+ v->visitPre(this);
+ // for HTML output we put the caption first
+ if (m_caption && v->id()==DocVisitor_Html) m_caption->accept(v);
+ QListIterator<DocNode> cli(m_children);
+ DocNode *n;
+ for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
+ // for other output formats we put the caption last
+ if (m_caption && v->id()!=DocVisitor_Html) m_caption->accept(v);
+ v->visitPost(this);
+}
+
+//---------------------------------------------------------------------------
+
+int DocHtmlDescTitle::parse()
+{
+ int retval=0;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlDescTitle::parse() start\n"));
+
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ {
+ QCString cmdName=g_token->name;
+ bool isJavaLink=FALSE;
+ switch (Mappers::cmdMapper->map(cmdName))
+ {
+ case CMD_REF:
+ {
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(g_token->name));
+ }
+ else
+ {
+ doctokenizerYYsetStateRef();
+ tok=doctokenizerYYlex(); // get the reference id
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ }
+ else
+ {
+ DocRef *ref = new DocRef(this,g_token->name,g_context);
+ m_children.append(ref);
+ ref->parse();
+ }
+ doctokenizerYYsetStatePara();
+ }
+ }
+ break;
+ case CMD_JAVALINK:
+ isJavaLink=TRUE;
+ // fall through
+ case CMD_LINK:
+ {
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ }
+ else
+ {
+ doctokenizerYYsetStateLink();
+ tok=doctokenizerYYlex();
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ }
+ else
+ {
+ doctokenizerYYsetStatePara();
+ DocLink *lnk = new DocLink(this,g_token->name);
+ m_children.append(lnk);
+ QCString leftOver = lnk->parse(isJavaLink);
+ if (!leftOver.isEmpty())
+ {
+ m_children.append(new DocWord(this,leftOver));
+ }
+ }
+ }
+ }
+
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <dt> tag",
+ qPrint(g_token->name));
+ }
+ }
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ case TK_HTMLTAG:
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==HTML_DD && !g_token->endTag) // found <dd> tag
+ {
+ retval = RetVal_DescData;
+ goto endtitle;
+ }
+ else if (tagId==HTML_DT && g_token->endTag)
+ {
+ // ignore </dt> tag.
+ }
+ else if (tagId==HTML_DT)
+ {
+ // missing <dt> tag.
+ retval = RetVal_DescTitle;
+ goto endtitle;
+ }
+ else if (tagId==HTML_DL && g_token->endTag)
+ {
+ retval=RetVal_EndDesc;
+ goto endtitle;
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <dt> context",
+ g_token->endTag?"/":"",qPrint(g_token->name));
+ }
+ }
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ " <dt> tag");
+ }
+endtitle:
+ handlePendingStyleCommands(this,m_children);
+ DBG(("DocHtmlDescTitle::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocHtmlDescData::parse()
+{
+ m_attribs = g_token->attribs;
+ int retval=0;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlDescData::parse() start\n"));
+
+ bool isFirst=TRUE;
+ DocPara *par=0;
+ do
+ {
+ par = new DocPara(this);
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ m_children.append(par);
+ retval=par->parse();
+ }
+ while (retval==TK_NEWPARA);
+ if (par) par->markLast();
+
+ DBG(("DocHtmlDescData::parse() end\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocHtmlDescList::parse()
+{
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+ DBG(("DocHtmlDescList::parse() start\n"));
+
+ // get next token
+ int tok=doctokenizerYYlex();
+ // skip whitespace
+ while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
+ // should find a html tag now
+ if (tok==TK_HTMLTAG)
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==HTML_DT && !g_token->endTag) // found <dt> tag
+ {
+ // continue
+ }
+ else // found some other tag
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <dt> tag but "
+ "found <%s> instead!",qPrint(g_token->name));
+ doctokenizerYYpushBackHtmlTag(g_token->name);
+ goto enddesclist;
+ }
+ }
+ else if (tok==0) // premature end of comment
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ " for a html description title");
+ goto enddesclist;
+ }
+ else // token other than html token
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <dt> tag but found %s token instead!",
+ tokToString(tok));
+ goto enddesclist;
+ }
+
+ do
+ {
+ DocHtmlDescTitle *dt=new DocHtmlDescTitle(this,g_token->attribs);
+ m_children.append(dt);
+ DocHtmlDescData *dd=new DocHtmlDescData(this);
+ m_children.append(dd);
+ retval=dt->parse();
+ if (retval==RetVal_DescData)
+ {
+ retval=dd->parse();
+ }
+ else if (retval!=RetVal_DescTitle)
+ {
+ // error
+ break;
+ }
+ } while (retval==RetVal_DescTitle);
+
+ if (retval==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while inside <dl> block");
+ }
+
+enddesclist:
+
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ DBG(("DocHtmlDescList::parse() end\n"));
+ return retval==RetVal_EndDesc ? RetVal_OK : retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocHtmlListItem::parse()
+{
+ DBG(("DocHtmlListItem::parse() start\n"));
+ int retval=0;
+ g_nodeStack.push(this);
+
+ // parse one or more paragraphs
+ bool isFirst=TRUE;
+ DocPara *par=0;
+ do
+ {
+ par = new DocPara(this);
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ m_children.append(par);
+ retval=par->parse();
+ }
+ while (retval==TK_NEWPARA);
+ if (par) par->markLast();
+
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ DBG(("DocHtmlListItem::parse() end retval=%x\n",retval));
+ return retval;
+}
+
+int DocHtmlListItem::parseXml()
+{
+ DBG(("DocHtmlListItem::parseXml() start\n"));
+ int retval=0;
+ g_nodeStack.push(this);
+
+ // parse one or more paragraphs
+ bool isFirst=TRUE;
+ DocPara *par=0;
+ do
+ {
+ par = new DocPara(this);
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ m_children.append(par);
+ retval=par->parse();
+ if (retval==0) break;
+
+ //printf("new item: retval=%x g_token->name=%s g_token->endTag=%d\n",
+ // retval,qPrint(g_token->name),g_token->endTag);
+ if (retval==RetVal_ListItem)
+ {
+ break;
+ }
+ }
+ while (retval!=RetVal_CloseXml);
+
+ if (par) par->markLast();
+
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ DBG(("DocHtmlListItem::parseXml() end retval=%x\n",retval));
+ return retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocHtmlList::parse()
+{
+ DBG(("DocHtmlList::parse() start\n"));
+ int retval=RetVal_OK;
+ int num=1;
+ g_nodeStack.push(this);
+
+ // get next token
+ int tok=doctokenizerYYlex();
+ // skip whitespace and paragraph breaks
+ while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
+ // should find a html tag now
+ if (tok==TK_HTMLTAG)
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ if (tagId==HTML_LI && !g_token->endTag) // found <li> tag
+ {
+ // ok, we can go on.
+ }
+ else // found some other tag
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <li> tag but "
+ "found <%s> instead!",qPrint(g_token->name));
+ doctokenizerYYpushBackHtmlTag(g_token->name);
+ goto endlist;
+ }
+ }
+ else if (tok==0) // premature end of comment
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ " for a html list item");
+ goto endlist;
+ }
+ else // token other than html token
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <li> tag but found %s token instead!",
+ tokToString(tok));
+ goto endlist;
+ }
+
+ do
+ {
+ DocHtmlListItem *li=new DocHtmlListItem(this,g_token->attribs,num++);
+ m_children.append(li);
+ retval=li->parse();
+ } while (retval==RetVal_ListItem);
+
+ if (retval==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while inside <%cl> block",
+ m_type==Unordered ? 'u' : 'o');
+ }
+
+endlist:
+ DBG(("DocHtmlList::parse() end retval=%x\n",retval));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval==RetVal_EndList ? RetVal_OK : retval;
+}
+
+int DocHtmlList::parseXml()
+{
+ DBG(("DocHtmlList::parseXml() start\n"));
+ int retval=RetVal_OK;
+ int num=1;
+ g_nodeStack.push(this);
+
+ // get next token
+ int tok=doctokenizerYYlex();
+ // skip whitespace and paragraph breaks
+ while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
+ // should find a html tag now
+ if (tok==TK_HTMLTAG)
+ {
+ int tagId=Mappers::htmlTagMapper->map(g_token->name);
+ //printf("g_token->name=%s g_token->endTag=%d\n",qPrint(g_token->name),g_token->endTag);
+ if (tagId==XML_ITEM && !g_token->endTag) // found <item> tag
+ {
+ // ok, we can go on.
+ }
+ else // found some other tag
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <item> tag but "
+ "found <%s> instead!",qPrint(g_token->name));
+ doctokenizerYYpushBackHtmlTag(g_token->name);
+ goto endlist;
+ }
+ }
+ else if (tok==0) // premature end of comment
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ " for a html list item");
+ goto endlist;
+ }
+ else // token other than html token
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <item> tag but found %s token instead!",
+ tokToString(tok));
+ goto endlist;
+ }
+
+ do
+ {
+ DocHtmlListItem *li=new DocHtmlListItem(this,g_token->attribs,num++);
+ m_children.append(li);
+ retval=li->parseXml();
+ if (retval==0) break;
+ //printf("retval=%x g_token->name=%s\n",retval,qPrint(g_token->name));
+ } while (retval==RetVal_ListItem);
+
+ if (retval==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while inside <list type=\"%s\"> block",
+ m_type==Unordered ? "bullet" : "number");
+ }
+
+endlist:
+ DBG(("DocHtmlList::parseXml() end retval=%x\n",retval));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval==RetVal_EndList ||
+ (retval==RetVal_CloseXml || g_token->name=="list") ?
+ RetVal_OK : retval;
+}
+
+//---------------------------------------------------------------------------
+
+int DocSimpleListItem::parse()
+{
+ g_nodeStack.push(this);
+ int rv=m_paragraph->parse();
+ m_paragraph->markFirst();
+ m_paragraph->markLast();
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return rv;
+}
+
+//--------------------------------------------------------------------------
+
+int DocSimpleList::parse()
+{
+ g_nodeStack.push(this);
+ int rv;
+ do
+ {
+ DocSimpleListItem *li=new DocSimpleListItem(this);
+ m_children.append(li);
+ rv=li->parse();
+ } while (rv==RetVal_ListItem);
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return (rv!=TK_NEWPARA) ? rv : RetVal_OK;
+}
+
+//--------------------------------------------------------------------------
+
+int DocAutoListItem::parse()
+{
+ int retval = RetVal_OK;
+ g_nodeStack.push(this);
+ retval=m_paragraph->parse();
+ m_paragraph->markFirst();
+ m_paragraph->markLast();
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//--------------------------------------------------------------------------
+
+int DocAutoList::parse()
+{
+ int retval = RetVal_OK;
+ int num=1;
+ g_nodeStack.push(this);
+ // first item or sub list => create new list
+ do
+ {
+ DocAutoListItem *li = new DocAutoListItem(this,num++);
+ m_children.append(li);
+ retval=li->parse();
+ }
+ while (retval==TK_LISTITEM && // new list item
+ m_indent==g_token->indent && // at same indent level
+ m_isEnumList==g_token->isEnumList // of the same kind
+ );
+
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//--------------------------------------------------------------------------
+
+void DocTitle::parse()
+{
+ DBG(("DocTitle::parse() start\n"));
+ g_nodeStack.push(this);
+ doctokenizerYYsetStateTitle();
+ int tok;
+ while ((tok=doctokenizerYYlex()))
+ {
+ if (!defaultHandleToken(this,tok,m_children))
+ {
+ switch (tok)
+ {
+ case TK_COMMAND:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a title section",
+ qPrint(g_token->name));
+ break;
+ case TK_SYMBOL:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+ }
+ doctokenizerYYsetStatePara();
+ handlePendingStyleCommands(this,m_children);
+ DBG(("DocTitle::parse() end\n"));
+ DocNode *n = g_nodeStack.pop();
+ ASSERT(n==this);
+}
+
+void DocTitle::parseFromString(const QCString &text)
+{
+ m_children.append(new DocWord(this,text));
+}
+
+//--------------------------------------------------------------------------
+
+DocSimpleSect::DocSimpleSect(DocNode *parent,Type t) :
+ m_type(t)
+{
+ m_parent = parent;
+ m_title=0;
+}
+
+DocSimpleSect::~DocSimpleSect()
+{
+ delete m_title;
+}
+
+void DocSimpleSect::accept(DocVisitor *v)
+{
+ v->visitPre(this);
+ if (m_title) m_title->accept(v);
+ QListIterator<DocNode> cli(m_children);
+ DocNode *n;
+ for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
+ v->visitPost(this);
+}
+
+int DocSimpleSect::parse(bool userTitle,bool needsSeparator)
+{
+ DBG(("DocSimpleSect::parse() start\n"));
+ g_nodeStack.push(this);
+
+ // handle case for user defined title
+ if (userTitle)
+ {
+ m_title = new DocTitle(this);
+ m_title->parse();
+ }
+
+ // add new paragraph as child
+ DocPara *par = new DocPara(this);
+ if (m_children.isEmpty())
+ {
+ par->markFirst();
+ }
+ else
+ {
+ ASSERT(m_children.last()->kind()==DocNode::Kind_Para);
+ ((DocPara *)m_children.last())->markLast(FALSE);
+ }
+ par->markLast();
+ if (needsSeparator) m_children.append(new DocSimpleSectSep(this));
+ m_children.append(par);
+
+ // parse the contents of the paragraph
+ int retval = par->parse();
+
+ DBG(("DocSimpleSect::parse() end retval=%d\n",retval));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval; // 0==EOF, TK_NEWPARA, TK_LISTITEM, TK_ENDLIST, RetVal_SimpleSec
+}
+
+int DocSimpleSect::parseRcs()
+{
+ DBG(("DocSimpleSect::parseRcs() start\n"));
+ g_nodeStack.push(this);
+
+ m_title = new DocTitle(this);
+ m_title->parseFromString(g_token->name);
+
+ QCString text = g_token->text;
+ docParserPushContext(); // this will create a new g_token
+ internalValidatingParseDoc(this,m_children,text);
+ docParserPopContext(); // this will restore the old g_token
+
+ DBG(("DocSimpleSect::parseRcs()\n"));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return RetVal_OK;
+}
+
+int DocSimpleSect::parseXml()
+{
+ DBG(("DocSimpleSect::parse() start\n"));
+ g_nodeStack.push(this);
+
+ int retval = RetVal_OK;
+ for (;;)
+ {
+ // add new paragraph as child
+ DocPara *par = new DocPara(this);
+ if (m_children.isEmpty())
+ {
+ par->markFirst();
+ }
+ else
+ {
+ ASSERT(m_children.last()->kind()==DocNode::Kind_Para);
+ ((DocPara *)m_children.last())->markLast(FALSE);
+ }
+ par->markLast();
+ m_children.append(par);
+
+ // parse the contents of the paragraph
+ retval = par->parse();
+ if (retval == 0) break;
+ if (retval == RetVal_CloseXml)
+ {
+ retval = RetVal_OK;
+ break;
+ }
+ }
+
+ DBG(("DocSimpleSect::parseXml() end retval=%d\n",retval));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+void DocSimpleSect::appendLinkWord(const QCString &word)
+{
+ DocPara *p;
+ if (m_children.isEmpty() || m_children.last()->kind()!=DocNode::Kind_Para)
+ {
+ p = new DocPara(this);
+ m_children.append(p);
+ }
+ else
+ {
+ p = (DocPara *)m_children.last();
+
+ // Comma-seperate <seealso> links.
+ p->injectToken(TK_WORD,",");
+ p->injectToken(TK_WHITESPACE," ");
+ }
+
+ g_inSeeBlock=TRUE;
+ p->injectToken(TK_LNKWORD,word);
+ g_inSeeBlock=FALSE;
+}
+
+QCString DocSimpleSect::typeString() const
+{
+ switch (m_type)
+ {
+ case Unknown: break;
+ case See: return "see";
+ case Return: return "return";
+ case Author: // fall through
+ case Authors: return "author";
+ case Version: return "version";
+ case Since: return "since";
+ case Date: return "date";
+ case Note: return "note";
+ case Warning: return "warning";
+ case Pre: return "pre";
+ case Post: return "post";
+ case Invar: return "invariant";
+ case Remark: return "remark";
+ case Attention: return "attention";
+ case User: return "user";
+ case Rcs: return "rcs";
+ }
+ return "unknown";
+}
+
+//--------------------------------------------------------------------------
+
+int DocParamList::parse(const QCString &cmdName)
+{
+ int retval=RetVal_OK;
+ DBG(("DocParamList::parse() start\n"));
+ g_nodeStack.push(this);
+ DocPara *par=0;
+
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ }
+ doctokenizerYYsetStateParam();
+ tok=doctokenizerYYlex();
+ while (tok==TK_WORD) /* there is a parameter name */
+ {
+ if (m_type==DocParamSect::Param)
+ {
+ int typeSeparator = g_token->name.find('#'); // explicit type position
+ if (typeSeparator!=-1)
+ {
+ handleParameterType(this,m_paramTypes,g_token->name.left(typeSeparator));
+ g_token->name = g_token->name.mid(typeSeparator+1);
+ g_hasParamCommand=TRUE;
+ checkArgumentName(g_token->name,TRUE);
+ ((DocParamSect*)parent())->m_hasTypeSpecifier=TRUE;
+ }
+ else
+ {
+ g_hasParamCommand=TRUE;
+ checkArgumentName(g_token->name,TRUE);
+ }
+ }
+ else if (m_type==DocParamSect::RetVal)
+ {
+ g_hasReturnCommand=TRUE;
+ checkArgumentName(g_token->name,FALSE);
+ }
+ //m_params.append(g_token->name);
+ handleLinkedWord(this,m_params);
+ tok=doctokenizerYYlex();
+ }
+ doctokenizerYYsetStatePara();
+ if (tok==0) /* premature end of comment block */
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ "argument of command %s",qPrint(cmdName));
+ retval=0;
+ goto endparamlist;
+ }
+ ASSERT(tok==TK_WHITESPACE);
+
+ par = new DocPara(this);
+ m_paragraphs.append(par);
+ retval = par->parse();
+ par->markFirst();
+ par->markLast();
+
+endparamlist:
+ DBG(("DocParamList::parse() end retval=%d\n",retval));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+int DocParamList::parseXml(const QCString &paramName)
+{
+ int retval=RetVal_OK;
+ DBG(("DocParamList::parseXml() start\n"));
+ g_nodeStack.push(this);
+
+ g_token->name = paramName;
+ if (m_type==DocParamSect::Param)
+ {
+ g_hasParamCommand=TRUE;
+ checkArgumentName(g_token->name,TRUE);
+ }
+ else if (m_type==DocParamSect::RetVal)
+ {
+ g_hasReturnCommand=TRUE;
+ checkArgumentName(g_token->name,FALSE);
+ }
+
+ handleLinkedWord(this,m_params);
+
+ do
+ {
+ DocPara *par = new DocPara(this);
+ retval = par->parse();
+ if (par->isEmpty()) // avoid adding an empty paragraph for the whitespace
+ // after </para> and before </param>
+ {
+ delete par;
+ break;
+ }
+ else // append the paragraph to the list
+ {
+ if (m_paragraphs.isEmpty())
+ {
+ par->markFirst();
+ }
+ else
+ {
+ m_paragraphs.last()->markLast(FALSE);
+ }
+ par->markLast();
+ m_paragraphs.append(par);
+ }
+
+ if (retval == 0) break;
+
+ } while (retval==RetVal_CloseXml &&
+ Mappers::htmlTagMapper->map(g_token->name)!=XML_PARAM &&
+ Mappers::htmlTagMapper->map(g_token->name)!=XML_TYPEPARAM &&
+ Mappers::htmlTagMapper->map(g_token->name)!=XML_EXCEPTION);
+
+
+ if (retval==0) /* premature end of comment block */
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unterminated param or exception tag");
+ }
+ else
+ {
+ retval=RetVal_OK;
+ }
+
+
+ DBG(("DocParamList::parse() end retval=%d\n",retval));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//--------------------------------------------------------------------------
+
+int DocParamSect::parse(const QCString &cmdName,bool xmlContext, Direction d)
+{
+ int retval=RetVal_OK;
+ DBG(("DocParamSect::parse() start\n"));
+ g_nodeStack.push(this);
+
+ if (d!=Unspecified)
+ {
+ m_hasInOutSpecifier=TRUE;
+ }
+
+ DocParamList *pl = new DocParamList(this,m_type,d);
+ if (m_children.isEmpty())
+ {
+ pl->markFirst();
+ pl->markLast();
+ }
+ else
+ {
+ ASSERT(m_children.last()->kind()==DocNode::Kind_ParamList);
+ ((DocParamList *)m_children.last())->markLast(FALSE);
+ pl->markLast();
+ }
+ m_children.append(pl);
+ if (xmlContext)
+ {
+ retval = pl->parseXml(cmdName);
+ }
+ else
+ {
+ retval = pl->parse(cmdName);
+ }
+
+ DBG(("DocParamSect::parse() end retval=%d\n",retval));
+ DocNode *n=g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//--------------------------------------------------------------------------
+
+int DocPara::handleSimpleSection(DocSimpleSect::Type t, bool xmlContext)
+{
+ DocSimpleSect *ss=0;
+ bool needsSeparator = FALSE;
+ if (!m_children.isEmpty() && // previous element
+ m_children.last()->kind()==Kind_SimpleSect && // was a simple sect
+ ((DocSimpleSect *)m_children.last())->type()==t && // of same type
+ t!=DocSimpleSect::User) // but not user defined
+ {
+ // append to previous section
+ ss=(DocSimpleSect *)m_children.last();
+ needsSeparator = TRUE;
+ }
+ else // start new section
+ {
+ ss=new DocSimpleSect(this,t);
+ m_children.append(ss);
+ }
+ int rv = RetVal_OK;
+ if (xmlContext)
+ {
+ return ss->parseXml();
+ }
+ else
+ {
+ rv = ss->parse(t==DocSimpleSect::User,needsSeparator);
+ }
+ return (rv!=TK_NEWPARA) ? rv : RetVal_OK;
+}
+
+int DocPara::handleParamSection(const QCString &cmdName,
+ DocParamSect::Type t,
+ bool xmlContext=FALSE,
+ int direction=DocParamSect::Unspecified)
+{
+ DocParamSect *ps=0;
+ if (!m_children.isEmpty() && // previous element
+ m_children.last()->kind()==Kind_ParamSect && // was a param sect
+ ((DocParamSect *)m_children.last())->type()==t) // of same type
+ {
+ // append to previous section
+ ps=(DocParamSect *)m_children.last();
+ }
+ else // start new section
+ {
+ ps=new DocParamSect(this,t);
+ m_children.append(ps);
+ }
+ int rv=ps->parse(cmdName,xmlContext,(DocParamSect::Direction)direction);
+ return (rv!=TK_NEWPARA) ? rv : RetVal_OK;
+}
+
+int DocPara::handleXRefItem()
+{
+ int retval=doctokenizerYYlex();
+ ASSERT(retval==TK_WHITESPACE);
+ doctokenizerYYsetStateXRefItem();
+ retval=doctokenizerYYlex();
+ if (retval==RetVal_OK)
+ {
+ DocXRefItem *ref = new DocXRefItem(this,g_token->id,g_token->name);
+ if (ref->parse())
+ {
+ m_children.append(ref);
+ }
+ else
+ {
+ delete ref;
+ }
+ }
+ doctokenizerYYsetStatePara();
+ return retval;
+}
+
+void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type t)
+{
+ DBG(("handleIncludeOperator(%s)\n",qPrint(cmdName)));
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return;
+ }
+ doctokenizerYYsetStatePattern();
+ tok=doctokenizerYYlex();
+ doctokenizerYYsetStatePara();
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ "argument of command %s", qPrint(cmdName));
+ return;
+ }
+ else if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ return;
+ }
+ DocIncOperator *op = new DocIncOperator(this,t,g_token->name,g_context,g_isExample,g_exampleName);
+ DocNode *n1 = m_children.last();
+ DocNode *n2 = n1!=0 ? m_children.prev() : 0;
+ bool isFirst = n1==0 || // no last node
+ (n1->kind()!=DocNode::Kind_IncOperator &&
+ n1->kind()!=DocNode::Kind_WhiteSpace
+ ) || // last node is not operator or whitespace
+ (n1->kind()==DocNode::Kind_WhiteSpace &&
+ n2!=0 && n2->kind()!=DocNode::Kind_IncOperator
+ ); // previous not is not operator
+ op->markFirst(isFirst);
+ op->markLast(TRUE);
+ if (n1!=0 && n1->kind()==DocNode::Kind_IncOperator)
+ {
+ ((DocIncOperator *)n1)->markLast(FALSE);
+ }
+ else if (n1!=0 && n1->kind()==DocNode::Kind_WhiteSpace &&
+ n2!=0 && n2->kind()==DocNode::Kind_IncOperator
+ )
+ {
+ ((DocIncOperator *)n2)->markLast(FALSE);
+ }
+ m_children.append(op);
+ op->parse();
+}
+
+void DocPara::handleImage(const QCString &cmdName)
+{
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return;
+ }
+ tok=doctokenizerYYlex();
+ if (tok!=TK_WORD && tok!=TK_LNKWORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ return;
+ }
+ tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return;
+ }
+ DocImage::Type t;
+ QCString imgType = g_token->name.lower();
+ if (imgType=="html") t=DocImage::Html;
+ else if (imgType=="latex") t=DocImage::Latex;
+ else if (imgType=="rtf") t=DocImage::Rtf;
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: image type %s specified as the first argument of "
+ "%s is not valid",
+ qPrint(imgType),qPrint(cmdName));
+ return;
+ }
+ doctokenizerYYsetStateFile();
+ tok=doctokenizerYYlex();
+ doctokenizerYYsetStatePara();
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ return;
+ }
+ HtmlAttribList attrList;
+ DocImage *img = new DocImage(this,attrList,findAndCopyImage(g_token->name,t),t);
+ m_children.append(img);
+ img->parse();
+}
+
+void DocPara::handleDotFile(const QCString &cmdName)
+{
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return;
+ }
+ doctokenizerYYsetStateFile();
+ tok=doctokenizerYYlex();
+ doctokenizerYYsetStatePara();
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ return;
+ }
+ QCString name = g_token->name;
+ DocDotFile *df = new DocDotFile(this,name,g_context);
+ m_children.append(df);
+ df->parse();
+}
+
+void DocPara::handleMscFile(const QCString &cmdName)
+{
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return;
+ }
+ doctokenizerYYsetStateFile();
+ tok=doctokenizerYYlex();
+ doctokenizerYYsetStatePara();
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ return;
+ }
+ QCString name = g_token->name;
+ DocMscFile *df = new DocMscFile(this,name,g_context);
+ m_children.append(df);
+ df->parse();
+}
+
+void DocPara::handleLink(const QCString &cmdName,bool isJavaLink)
+{
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return;
+ }
+ doctokenizerYYsetStateLink();
+ tok=doctokenizerYYlex();
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ return;
+ }
+ doctokenizerYYsetStatePara();
+ DocLink *lnk = new DocLink(this,g_token->name);
+ m_children.append(lnk);
+ QCString leftOver = lnk->parse(isJavaLink);
+ if (!leftOver.isEmpty())
+ {
+ m_children.append(new DocWord(this,leftOver));
+ }
+}
+
+void DocPara::handleRef(const QCString &cmdName)
+{
+ DBG(("handleRef(%s)\n",qPrint(cmdName)));
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return;
+ }
+ doctokenizerYYsetStateRef();
+ tok=doctokenizerYYlex(); // get the reference id
+ DocRef *ref=0;
+ if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ goto endref;
+ }
+ ref = new DocRef(this,g_token->name,g_context);
+ m_children.append(ref);
+ ref->parse();
+endref:
+ doctokenizerYYsetStatePara();
+}
+
+
+void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
+{
+ DBG(("handleInclude(%s)\n",qPrint(cmdName)));
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return;
+ }
+ doctokenizerYYsetStateFile();
+ tok=doctokenizerYYlex();
+ doctokenizerYYsetStatePara();
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ "argument of command %s",qPrint(cmdName));
+ return;
+ }
+ else if (tok!=TK_WORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ return;
+ }
+ DocInclude *inc = new DocInclude(this,g_token->name,g_context,t,g_isExample,g_exampleName);
+ m_children.append(inc);
+ inc->parse();
+}
+
+void DocPara::handleSection(const QCString &cmdName)
+{
+ // get the argument of the section command.
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ return;
+ }
+ tok=doctokenizerYYlex();
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ "argument of command %s\n", qPrint(cmdName));
+ return;
+ }
+ else if (tok!=TK_WORD && tok!=TK_LNKWORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ return;
+ }
+ g_token->sectionId = g_token->name;
+ doctokenizerYYsetStateSkipTitle();
+ doctokenizerYYlex();
+ doctokenizerYYsetStatePara();
+}
+
+int DocPara::handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level)
+{
+ DocHtmlHeader *header = new DocHtmlHeader(this,tagHtmlAttribs,level);
+ m_children.append(header);
+ int retval = header->parse();
+ return (retval==RetVal_OK) ? TK_NEWPARA : retval;
+}
+
+// For XML tags whose content is stored in attributes rather than
+// contained within the element, we need a way to inject the attribute
+// text into the current paragraph.
+bool DocPara::injectToken(int tok,const QCString &tokText)
+{
+ g_token->name = tokText;
+ return defaultHandleToken(this,tok,m_children);
+}
+
+int DocPara::handleStartCode()
+{
+ int retval = doctokenizerYYlex();
+ // search for the first non-whitespace line, index is stored in li
+ int i=0,li=0,l=g_token->verb.length();
+ while (i<l && (g_token->verb.at(i)==' ' || g_token->verb.at(i)=='\n'))
+ {
+ if (g_token->verb.at(i)=='\n') li=i+1;
+ i++;
+ }
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb.mid(li),DocVerbatim::Code,g_isExample,g_exampleName));
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: code section ended without end marker");
+ doctokenizerYYsetStatePara();
+ return retval;
+}
+
+void DocPara::handleInheritDoc()
+{
+ if (g_memberDef) // inheriting docs from a member
+ {
+ MemberDef *reMd = g_memberDef->reimplements();
+ if (reMd) // member from which was inherited.
+ {
+ MemberDef *thisMd = g_memberDef;
+ //printf("{InheritDocs:%s=>%s}\n",g_memberDef->qualifiedName().data(),reMd->qualifiedName().data());
+ docParserPushContext();
+ g_scope=reMd->getOuterScope();
+ if (g_scope!=Doxygen::globalScope)
+ {
+ g_context=g_scope->name();
+ }
+ g_memberDef=reMd;
+ g_styleStack.clear();
+ g_nodeStack.clear();
+ g_copyStack.append(reMd);
+ internalValidatingParseDoc(this,m_children,reMd->briefDescription());
+ internalValidatingParseDoc(this,m_children,reMd->documentation());
+ g_copyStack.remove(reMd);
+ docParserPopContext(TRUE);
+ g_memberDef = thisMd;
+ }
+ }
+}
+
+
+int DocPara::handleCommand(const QCString &cmdName)
+{
+ DBG(("handleCommand(%s)\n",qPrint(cmdName)));
+ int retval = RetVal_OK;
+ int cmdId = Mappers::cmdMapper->map(cmdName);
+ switch (cmdId)
+ {
+ case CMD_UNKNOWN:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Found unknown command `\\%s'",qPrint(cmdName));
+ break;
+ case CMD_EMPHASIS:
+ m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
+ retval=handleStyleArgument(this,m_children,cmdName);
+ m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,FALSE));
+ if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
+ break;
+ case CMD_BOLD:
+ m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,TRUE));
+ retval=handleStyleArgument(this,m_children,cmdName);
+ m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,FALSE));
+ if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
+ break;
+ case CMD_CODE:
+ m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Code,TRUE));
+ retval=handleStyleArgument(this,m_children,cmdName);
+ m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Code,FALSE));
+ if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
+ break;
+ case CMD_BSLASH:
+ m_children.append(new DocSymbol(this,DocSymbol::BSlash));
+ break;
+ case CMD_AT:
+ m_children.append(new DocSymbol(this,DocSymbol::At));
+ break;
+ case CMD_LESS:
+ m_children.append(new DocSymbol(this,DocSymbol::Less));
+ break;
+ case CMD_GREATER:
+ m_children.append(new DocSymbol(this,DocSymbol::Greater));
+ break;
+ case CMD_AMP:
+ m_children.append(new DocSymbol(this,DocSymbol::Amp));
+ break;
+ case CMD_DOLLAR:
+ m_children.append(new DocSymbol(this,DocSymbol::Dollar));
+ break;
+ case CMD_HASH:
+ m_children.append(new DocSymbol(this,DocSymbol::Hash));
+ break;
+ case CMD_DCOLON:
+ m_children.append(new DocSymbol(this,DocSymbol::DoubleColon));
+ break;
+ case CMD_PERCENT:
+ m_children.append(new DocSymbol(this,DocSymbol::Percent));
+ break;
+ case CMD_QUOTE:
+ m_children.append(new DocSymbol(this,DocSymbol::Quot));
+ break;
+ case CMD_SA:
+ g_inSeeBlock=TRUE;
+ retval = handleSimpleSection(DocSimpleSect::See);
+ g_inSeeBlock=FALSE;
+ break;
+ case CMD_RETURN:
+ retval = handleSimpleSection(DocSimpleSect::Return);
+ g_hasReturnCommand=TRUE;
+ break;
+ case CMD_AUTHOR:
+ retval = handleSimpleSection(DocSimpleSect::Author);
+ break;
+ case CMD_AUTHORS:
+ retval = handleSimpleSection(DocSimpleSect::Authors);
+ break;
+ case CMD_VERSION:
+ retval = handleSimpleSection(DocSimpleSect::Version);
+ break;
+ case CMD_SINCE:
+ retval = handleSimpleSection(DocSimpleSect::Since);
+ break;
+ case CMD_DATE:
+ retval = handleSimpleSection(DocSimpleSect::Date);
+ break;
+ case CMD_NOTE:
+ retval = handleSimpleSection(DocSimpleSect::Note);
+ break;
+ case CMD_WARNING:
+ retval = handleSimpleSection(DocSimpleSect::Warning);
+ break;
+ case CMD_PRE:
+ retval = handleSimpleSection(DocSimpleSect::Pre);
+ break;
+ case CMD_POST:
+ retval = handleSimpleSection(DocSimpleSect::Post);
+ break;
+ case CMD_INVARIANT:
+ retval = handleSimpleSection(DocSimpleSect::Invar);
+ break;
+ case CMD_REMARK:
+ retval = handleSimpleSection(DocSimpleSect::Remark);
+ break;
+ case CMD_ATTENTION:
+ retval = handleSimpleSection(DocSimpleSect::Attention);
+ break;
+ case CMD_PAR:
+ retval = handleSimpleSection(DocSimpleSect::User);
+ break;
+ case CMD_LI:
+ {
+ DocSimpleList *sl=new DocSimpleList(this);
+ m_children.append(sl);
+ retval = sl->parse();
+ }
+ break;
+ case CMD_SECTION:
+ {
+ handleSection(cmdName);
+ retval = RetVal_Section;
+ }
+ break;
+ case CMD_SUBSECTION:
+ {
+ handleSection(cmdName);
+ retval = RetVal_Subsection;
+ }
+ break;
+ case CMD_SUBSUBSECTION:
+ {
+ handleSection(cmdName);
+ retval = RetVal_Subsubsection;
+ }
+ break;
+ case CMD_PARAGRAPH:
+ {
+ handleSection(cmdName);
+ retval = RetVal_Paragraph;
+ }
+ break;
+ case CMD_STARTCODE:
+ {
+ doctokenizerYYsetStateCode();
+ retval = handleStartCode();
+ }
+ break;
+ case CMD_HTMLONLY:
+ {
+ doctokenizerYYsetStateHtmlOnly();
+ retval = doctokenizerYYlex();
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: htmlonly section ended without end marker");
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_MANONLY:
+ {
+ doctokenizerYYsetStateManOnly();
+ retval = doctokenizerYYlex();
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::ManOnly,g_isExample,g_exampleName));
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: manonly section ended without end marker");
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_LATEXONLY:
+ {
+ doctokenizerYYsetStateLatexOnly();
+ retval = doctokenizerYYlex();
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::LatexOnly,g_isExample,g_exampleName));
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: latexonly section ended without end marker");
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_XMLONLY:
+ {
+ doctokenizerYYsetStateXmlOnly();
+ retval = doctokenizerYYlex();
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName));
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: xmlonly section ended without end marker");
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_VERBATIM:
+ {
+ doctokenizerYYsetStateVerbatim();
+ retval = doctokenizerYYlex();
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Verbatim,g_isExample,g_exampleName));
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: verbatim section ended without end marker");
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_DOT:
+ {
+ doctokenizerYYsetStateDot();
+ retval = doctokenizerYYlex();
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Dot,g_isExample,g_exampleName));
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: dot section ended without end marker");
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_MSC:
+ {
+ doctokenizerYYsetStateMsc();
+ retval = doctokenizerYYlex();
+ m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName));
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: msc section ended without end marker");
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_ENDCODE:
+ case CMD_ENDHTMLONLY:
+ case CMD_ENDMANONLY:
+ case CMD_ENDLATEXONLY:
+ case CMD_ENDXMLONLY:
+ case CMD_ENDLINK:
+ case CMD_ENDVERBATIM:
+ case CMD_ENDDOT:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+ break;
+ case CMD_ENDMSC:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+ break;
+ case CMD_PARAM:
+ retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,g_token->paramDir);
+ break;
+ case CMD_TPARAM:
+ retval = handleParamSection(cmdName,DocParamSect::TemplateParam,FALSE,g_token->paramDir);
+ break;
+ case CMD_RETVAL:
+ retval = handleParamSection(cmdName,DocParamSect::RetVal);
+ break;
+ case CMD_EXCEPTION:
+ retval = handleParamSection(cmdName,DocParamSect::Exception);
+ break;
+ case CMD_XREFITEM:
+ retval = handleXRefItem();
+ break;
+ case CMD_LINEBREAK:
+ {
+ DocLineBreak *lb = new DocLineBreak(this);
+ m_children.append(lb);
+ }
+ break;
+ case CMD_ANCHOR:
+ {
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ break;
+ }
+ tok=doctokenizerYYlex();
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ "argument of command %s",qPrint(cmdName));
+ break;
+ }
+ else if (tok!=TK_WORD && tok!=TK_LNKWORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ break;
+ }
+ DocAnchor *anchor = new DocAnchor(this,g_token->name,FALSE);
+ m_children.append(anchor);
+ }
+ break;
+ case CMD_ADDINDEX:
+ {
+ DocIndexEntry *ie = new DocIndexEntry(this,
+ g_scope!=Doxygen::globalScope?g_scope:0,
+ g_memberDef);
+ m_children.append(ie);
+ retval = ie->parse();
+ }
+ break;
+ case CMD_INTERNAL:
+ retval = RetVal_Internal;
+ break;
+ case CMD_COPYDOC: // fall through
+ case CMD_COPYBRIEF: // fall through
+ case CMD_COPYDETAILS:
+ {
+ int tok=doctokenizerYYlex();
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ qPrint(cmdName));
+ break;
+ }
+ tok=doctokenizerYYlex();
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ "argument of command %s\n", qPrint(cmdName));
+ break;
+ }
+ else if (tok!=TK_WORD && tok!=TK_LNKWORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(cmdName));
+ break;
+ }
+ DocCopy *cpy = new DocCopy(this,g_token->name,
+ cmdId==CMD_COPYDOC || cmdId==CMD_COPYBRIEF,
+ cmdId==CMD_COPYDOC || cmdId==CMD_COPYDETAILS);
+ m_children.append(cpy);
+ cpy->parse();
+ }
+ break;
+ case CMD_INCLUDE:
+ handleInclude(cmdName,DocInclude::Include);
+ break;
+ case CMD_INCWITHLINES:
+ handleInclude(cmdName,DocInclude::IncWithLines);
+ break;
+ case CMD_DONTINCLUDE:
+ handleInclude(cmdName,DocInclude::DontInclude);
+ break;
+ case CMD_HTMLINCLUDE:
+ handleInclude(cmdName,DocInclude::HtmlInclude);
+ break;
+ case CMD_VERBINCLUDE:
+ handleInclude(cmdName,DocInclude::VerbInclude);
+ break;
+ case CMD_SKIP:
+ handleIncludeOperator(cmdName,DocIncOperator::Skip);
+ break;
+ case CMD_UNTIL:
+ handleIncludeOperator(cmdName,DocIncOperator::Until);
+ break;
+ case CMD_SKIPLINE:
+ handleIncludeOperator(cmdName,DocIncOperator::SkipLine);
+ break;
+ case CMD_LINE:
+ handleIncludeOperator(cmdName,DocIncOperator::Line);
+ break;
+ case CMD_IMAGE:
+ handleImage(cmdName);
+ break;
+ case CMD_DOTFILE:
+ handleDotFile(cmdName);
+ break;
+ case CMD_MSCFILE:
+ handleMscFile(cmdName);
+ break;
+ case CMD_LINK:
+ handleLink(cmdName,FALSE);
+ break;
+ case CMD_JAVALINK:
+ handleLink(cmdName,TRUE);
+ break;
+ case CMD_REF: // fall through
+ case CMD_SUBPAGE:
+ handleRef(cmdName);
+ break;
+ case CMD_SECREFLIST:
+ {
+ DocSecRefList *list = new DocSecRefList(this);
+ m_children.append(list);
+ list->parse();
+ }
+ break;
+ case CMD_SECREFITEM:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+ break;
+ case CMD_ENDSECREFLIST:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+ break;
+ case CMD_FORMULA:
+ {
+ DocFormula *form=new DocFormula(this,g_token->id);
+ m_children.append(form);
+ }
+ break;
+ //case CMD_LANGSWITCH:
+ // retval = handleLanguageSwitch();
+ // break;
+ case CMD_INTERNALREF:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+ break;
+ case CMD_INHERITDOC:
+ handleInheritDoc();
+ break;
+ default:
+ // we should not get here!
+ ASSERT(0);
+ break;
+ }
+ INTERNAL_ASSERT(retval==0 || retval==RetVal_OK || retval==RetVal_SimpleSec ||
+ retval==TK_LISTITEM || retval==TK_ENDLIST || retval==TK_NEWPARA ||
+ retval==RetVal_Section || retval==RetVal_EndList ||
+ retval==RetVal_Internal || retval==RetVal_SwitchLang
+ );
+ DBG(("handleCommand(%s) end retval=%x\n",qPrint(cmdName),retval));
+ return retval;
+}
+
+static bool findAttribute(const HtmlAttribList &tagHtmlAttribs,
+ const char *attrName,
+ QCString *result)
+{
+
+ HtmlAttribListIterator li(tagHtmlAttribs);
+ HtmlAttrib *opt;
+ for (li.toFirst();(opt=li.current());++li)
+ {
+ if (opt->name==attrName)
+ {
+ *result = opt->value;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &tagHtmlAttribs)
+{
+ DBG(("handleHtmlStartTag(%s,%d)\n",qPrint(tagName),tagHtmlAttribs.count()));
+ int retval=RetVal_OK;
+ int tagId = Mappers::htmlTagMapper->map(tagName);
+ if (g_token->emptyTag && !(tagId&XML_CmdMask) &&
+ tagId!=HTML_UNKNOWN && tagId!=HTML_IMG && tagId!=HTML_BR)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: HTML tags may not use the 'empty tag' XHTML syntax.");
+ }
+ switch (tagId)
+ {
+ case HTML_UL:
+ {
+ DocHtmlList *list = new DocHtmlList(this,tagHtmlAttribs,DocHtmlList::Unordered);
+ m_children.append(list);
+ retval=list->parse();
+ }
+ break;
+ case HTML_OL:
+ {
+ DocHtmlList *list = new DocHtmlList(this,tagHtmlAttribs,DocHtmlList::Ordered);
+ m_children.append(list);
+ retval=list->parse();
+ }
+ break;
+ case HTML_LI:
+ if (!insideUL(this) && !insideOL(this))
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: lonely <li> tag found");
+ }
+ else
+ {
+ retval=RetVal_ListItem;
+ }
+ break;
+ case HTML_BOLD:
+ handleStyleEnter(this,m_children,DocStyleChange::Bold,&g_token->attribs);
+ break;
+ case HTML_CODE:
+ if (getLanguageFromFileName(g_fileName)==SrcLangExt_CSharp)
+ // for C# code we treat <code> as an XML tag
+ {
+ doctokenizerYYsetStateXmlCode();
+ retval = handleStartCode();
+ }
+ else // normal HTML markup
+ {
+ handleStyleEnter(this,m_children,DocStyleChange::Code,&g_token->attribs);
+ }
+ break;
+ case HTML_EMPHASIS:
+ handleStyleEnter(this,m_children,DocStyleChange::Italic,&g_token->attribs);
+ break;
+ case HTML_DIV:
+ handleStyleEnter(this,m_children,DocStyleChange::Div,&g_token->attribs);
+ break;
+ case HTML_SPAN:
+ handleStyleEnter(this,m_children,DocStyleChange::Span,&g_token->attribs);
+ break;
+ case HTML_SUB:
+ handleStyleEnter(this,m_children,DocStyleChange::Subscript,&g_token->attribs);
+ break;
+ case HTML_SUP:
+ handleStyleEnter(this,m_children,DocStyleChange::Superscript,&g_token->attribs);
+ break;
+ case HTML_CENTER:
+ handleStyleEnter(this,m_children,DocStyleChange::Center,&g_token->attribs);
+ break;
+ case HTML_SMALL:
+ handleStyleEnter(this,m_children,DocStyleChange::Small,&g_token->attribs);
+ break;
+ case HTML_PRE:
+ handleStyleEnter(this,m_children,DocStyleChange::Preformatted,&g_token->attribs);
+ setInsidePreformatted(TRUE);
+ //doctokenizerYYsetInsidePre(TRUE);
+ break;
+ case HTML_P:
+ retval=TK_NEWPARA;
+ break;
+ case HTML_DL:
+ {
+ DocHtmlDescList *list = new DocHtmlDescList(this,tagHtmlAttribs);
+ m_children.append(list);
+ retval=list->parse();
+ }
+ break;
+ case HTML_DT:
+ retval = RetVal_DescTitle;
+ break;
+ case HTML_DD:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag <dd> found");
+ break;
+ case HTML_TABLE:
+ {
+ DocHtmlTable *table = new DocHtmlTable(this,tagHtmlAttribs);
+ m_children.append(table);
+ retval=table->parse();
+ }
+ break;
+ case HTML_TR:
+ retval = RetVal_TableRow;
+ break;
+ case HTML_TD:
+ retval = RetVal_TableCell;
+ break;
+ case HTML_TH:
+ retval = RetVal_TableHCell;
+ break;
+ case HTML_CAPTION:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag <caption> found");
+ break;
+ case HTML_BR:
+ {
+ DocLineBreak *lb = new DocLineBreak(this);
+ m_children.append(lb);
+ }
+ break;
+ case HTML_HR:
+ {
+ DocHorRuler *hr = new DocHorRuler(this);
+ m_children.append(hr);
+ }
+ break;
+ case HTML_A:
+ retval=handleAHref(this,m_children,tagHtmlAttribs);
+ break;
+ case HTML_H1:
+ retval=handleHtmlHeader(tagHtmlAttribs,1);
+ break;
+ case HTML_H2:
+ retval=handleHtmlHeader(tagHtmlAttribs,2);
+ break;
+ case HTML_H3:
+ retval=handleHtmlHeader(tagHtmlAttribs,3);
+ break;
+ case HTML_H4:
+ retval=handleHtmlHeader(tagHtmlAttribs,4);
+ break;
+ case HTML_H5:
+ retval=handleHtmlHeader(tagHtmlAttribs,5);
+ break;
+ case HTML_H6:
+ retval=handleHtmlHeader(tagHtmlAttribs,6);
+ break;
+ case HTML_IMG:
+ {
+ HtmlAttribListIterator li(tagHtmlAttribs);
+ HtmlAttrib *opt;
+ bool found=FALSE;
+ int index=0;
+ for (li.toFirst();(opt=li.current());++li,++index)
+ {
+ //printf("option name=%s value=%s\n",opt->name.data(),opt->value.data());
+ if (opt->name=="src" && !opt->value.isEmpty())
+ {
+ // copy attributes
+ HtmlAttribList attrList = tagHtmlAttribs;
+ // and remove the src attribute
+ bool result = attrList.remove(index);
+ ASSERT(result);
+ DocImage *img = new DocImage(this,attrList,opt->value,DocImage::Html);
+ m_children.append(img);
+ found = TRUE;
+ }
+ }
+ if (!found)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: IMG tag does not have a SRC attribute!\n");
+ }
+ }
+ break;
+
+ case XML_SUMMARY:
+ case XML_REMARKS:
+ case XML_VALUE:
+ case XML_PARA:
+ if (!m_children.isEmpty())
+ {
+ retval = TK_NEWPARA;
+ }
+ break;
+ case XML_EXAMPLE:
+ case XML_DESCRIPTION:
+ if (insideTable(this))
+ {
+ retval=RetVal_TableCell;
+ }
+ break;
+ case XML_C:
+ handleStyleEnter(this,m_children,DocStyleChange::Code,&g_token->attribs);
+ break;
+ case XML_PARAM:
+ case XML_TYPEPARAM:
+ {
+ QCString paramName;
+ if (findAttribute(tagHtmlAttribs,"name",&paramName))
+ {
+ if (paramName.isEmpty())
+ {
+ if (Config_getBool("WARN_NO_PARAMDOC"))
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: empty 'name' attribute for <param> tag.");
+ }
+ }
+ else
+ {
+ retval = handleParamSection(paramName,
+ tagId==XML_PARAM ? DocParamSect::Param : DocParamSect::TemplateParam,
+ TRUE);
+ }
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'name' attribute from <param> tag.");
+ }
+ }
+ break;
+ case XML_PARAMREF:
+ case XML_TYPEPARAMREF:
+ {
+ QCString paramName;
+ if (findAttribute(tagHtmlAttribs,"name",&paramName))
+ {
+ //printf("paramName=%s\n",paramName.data());
+ m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
+ m_children.append(new DocWord(this,paramName));
+ m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,FALSE));
+ if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'name' attribute from <param%sref> tag.",tagId==XML_PARAMREF?"":"type");
+ }
+ }
+ break;
+ case XML_EXCEPTION:
+ {
+ QCString exceptName;
+ if (findAttribute(tagHtmlAttribs,"cref",&exceptName))
+ {
+ retval = handleParamSection(exceptName,DocParamSect::Exception,TRUE);
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'name' attribute from <exception> tag.");
+ }
+ }
+ break;
+ case XML_ITEM:
+ case XML_LISTHEADER:
+ if (insideTable(this))
+ {
+ retval=RetVal_TableRow;
+ }
+ else if (insideUL(this) || insideOL(this))
+ {
+ retval=RetVal_ListItem;
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: lonely <item> tag found");
+ }
+ break;
+ case XML_RETURNS:
+ retval = handleSimpleSection(DocSimpleSect::Return,TRUE);
+ g_hasReturnCommand=TRUE;
+ break;
+ case XML_TERM:
+ //m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,TRUE));
+ if (insideTable(this))
+ {
+ retval=RetVal_TableCell;
+ }
+ break;
+ case XML_SEE:
+ // I'm not sure if <see> is the same as <seealso> or if it
+ // should you link a member without producing a section. The
+ // C# specification is extremely vague about this (but what else
+ // can we expect from Microsoft...)
+ {
+ QCString cref;
+ //printf("XML_SEE: empty tag=%d\n",g_token->emptyTag);
+ if (findAttribute(tagHtmlAttribs,"cref",&cref))
+ {
+ if (g_token->emptyTag) // <see cref="..."/> style
+ {
+ bool inSeeBlock = g_inSeeBlock;
+ g_token->name = cref;
+ g_inSeeBlock = TRUE;
+ handleLinkedWord(this,m_children);
+ g_inSeeBlock = inSeeBlock;
+ }
+ else // <see cref="...">...</see> style
+ {
+ //DocRef *ref = new DocRef(this,cref);
+ //m_children.append(ref);
+ //ref->parse();
+ doctokenizerYYsetStatePara();
+ DocLink *lnk = new DocLink(this,cref);
+ m_children.append(lnk);
+ QCString leftOver = lnk->parse(FALSE,TRUE);
+ if (!leftOver.isEmpty())
+ {
+ m_children.append(new DocWord(this,leftOver));
+ }
+ }
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'cref' attribute from <see> tag.");
+ }
+ }
+ break;
+ case XML_SEEALSO:
+ {
+ QCString cref;
+ if (findAttribute(tagHtmlAttribs,"cref",&cref))
+ {
+ // Look for an existing "see" section
+ DocSimpleSect *ss=0;
+ QListIterator<DocNode> cli(m_children);
+ DocNode *n;
+ for (cli.toFirst();(n=cli.current());++cli)
+ {
+ if (n->kind()==Kind_SimpleSect && ((DocSimpleSect *)n)->type()==DocSimpleSect::See)
+ {
+ ss = (DocSimpleSect *)n;
+ }
+ }
+
+ if (!ss) // start new section
+ {
+ ss=new DocSimpleSect(this,DocSimpleSect::See);
+ m_children.append(ss);
+ }
+
+ ss->appendLinkWord(cref);
+ retval = RetVal_OK;
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'cref' attribute from <seealso> tag.");
+ }
+ }
+ break;
+ case XML_LIST:
+ {
+ QCString type;
+ findAttribute(tagHtmlAttribs,"type",&type);
+ DocHtmlList::Type listType = DocHtmlList::Unordered;
+ HtmlAttribList emptyList;
+ if (type=="number")
+ {
+ listType=DocHtmlList::Ordered;
+ }
+ if (type=="table")
+ {
+ DocHtmlTable *table = new DocHtmlTable(this,emptyList);
+ m_children.append(table);
+ retval=table->parseXml();
+ }
+ else
+ {
+ DocHtmlList *list = new DocHtmlList(this,emptyList,listType);
+ m_children.append(list);
+ retval=list->parseXml();
+ }
+ }
+ break;
+ case XML_INCLUDE:
+ case XML_PERMISSION:
+ // These tags are defined in .Net but are currently unsupported
+ break;
+ case HTML_UNKNOWN:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported xml/html tag <%s> found", qPrint(tagName));
+ m_children.append(new DocWord(this, "<"+tagName+tagHtmlAttribs.toString()+">"));
+ break;
+ default:
+ // we should not get here!
+ ASSERT(0);
+ break;
+ }
+ return retval;
+}
+
+int DocPara::handleHtmlEndTag(const QCString &tagName)
+{
+ DBG(("handleHtmlEndTag(%s)\n",qPrint(tagName)));
+ int tagId = Mappers::htmlTagMapper->map(tagName);
+ int retval=RetVal_OK;
+ switch (tagId)
+ {
+ case HTML_UL:
+ if (!insideUL(this))
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </ul> tag without matching <ul>");
+ }
+ else
+ {
+ retval=RetVal_EndList;
+ }
+ break;
+ case HTML_OL:
+ if (!insideOL(this))
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </ol> tag without matching <ol>");
+ }
+ else
+ {
+ retval=RetVal_EndList;
+ }
+ break;
+ case HTML_LI:
+ if (!insideLI(this))
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </li> tag without matching <li>");
+ }
+ else
+ {
+ // ignore </li> tags
+ }
+ break;
+ //case HTML_PRE:
+ // if (!insidePRE(this))
+ // {
+ // warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </pre> tag without matching <pre>");
+ // }
+ // else
+ // {
+ // retval=RetVal_EndPre;
+ // }
+ // break;
+ case HTML_BOLD:
+ handleStyleLeave(this,m_children,DocStyleChange::Bold,"b");
+ break;
+ case HTML_CODE:
+ handleStyleLeave(this,m_children,DocStyleChange::Code,"code");
+ break;
+ case HTML_EMPHASIS:
+ handleStyleLeave(this,m_children,DocStyleChange::Italic,"em");
+ break;
+ case HTML_DIV:
+ handleStyleLeave(this,m_children,DocStyleChange::Div,"div");
+ break;
+ case HTML_SPAN:
+ handleStyleLeave(this,m_children,DocStyleChange::Span,"span");
+ break;
+ case HTML_SUB:
+ handleStyleLeave(this,m_children,DocStyleChange::Subscript,"sub");
+ break;
+ case HTML_SUP:
+ handleStyleLeave(this,m_children,DocStyleChange::Superscript,"sup");
+ break;
+ case HTML_CENTER:
+ handleStyleLeave(this,m_children,DocStyleChange::Center,"center");
+ break;
+ case HTML_SMALL:
+ handleStyleLeave(this,m_children,DocStyleChange::Small,"small");
+ break;
+ case HTML_PRE:
+ handleStyleLeave(this,m_children,DocStyleChange::Preformatted,"pre");
+ setInsidePreformatted(FALSE);
+ //doctokenizerYYsetInsidePre(FALSE);
+ break;
+ case HTML_P:
+ // ignore </p> tag
+ break;
+ case HTML_DL:
+ retval=RetVal_EndDesc;
+ break;
+ case HTML_DT:
+ // ignore </dt> tag
+ break;
+ case HTML_DD:
+ // ignore </dd> tag
+ break;
+ case HTML_TABLE:
+ retval=RetVal_EndTable;
+ break;
+ case HTML_TR:
+ // ignore </tr> tag
+ break;
+ case HTML_TD:
+ // ignore </td> tag
+ break;
+ case HTML_TH:
+ // ignore </th> tag
+ break;
+ case HTML_CAPTION:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </caption> found");
+ break;
+ case HTML_BR:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal </br> tag found\n");
+ break;
+ case HTML_H1:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </h1> found");
+ break;
+ case HTML_H2:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </h2> found");
+ break;
+ case HTML_H3:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </h3> found");
+ break;
+ case HTML_IMG:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </img> found");
+ break;
+ case HTML_HR:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </hr> found");
+ break;
+ case HTML_A:
+ //warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </a> found");
+ // ignore </a> tag (can be part of <a name=...></a>
+ break;
+
+ case XML_TERM:
+ //m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,FALSE));
+ break;
+ case XML_SUMMARY:
+ case XML_REMARKS:
+ case XML_PARA:
+ case XML_VALUE:
+ case XML_LIST:
+ case XML_EXAMPLE:
+ case XML_PARAM:
+ case XML_TYPEPARAM:
+ case XML_RETURNS:
+ case XML_SEE:
+ case XML_SEEALSO:
+ case XML_EXCEPTION:
+ retval = RetVal_CloseXml;
+ break;
+ case XML_C:
+ handleStyleLeave(this,m_children,DocStyleChange::Code,"c");
+ break;
+ case XML_ITEM:
+ case XML_LISTHEADER:
+ case XML_INCLUDE:
+ case XML_PERMISSION:
+ case XML_DESCRIPTION:
+ case XML_PARAMREF:
+ case XML_TYPEPARAMREF:
+ // These tags are defined in .Net but are currently unsupported
+ break;
+ case HTML_UNKNOWN:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported xml/html tag </%s> found", qPrint(tagName));
+ m_children.append(new DocWord(this,"</"+tagName+">"));
+ break;
+ default:
+ // we should not get here!
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end tag %s\n",qPrint(tagName));
+ ASSERT(0);
+ break;
+ }
+ return retval;
+}
+
+int DocPara::parse()
+{
+ DBG(("DocPara::parse() start\n"));
+ g_nodeStack.push(this);
+ // handle style commands "inherited" from the previous paragraph
+ handleInitialStyleCommands(this,m_children);
+ int tok;
+ int retval=0;
+ while ((tok=doctokenizerYYlex())) // get the next token
+ {
+reparsetoken:
+ DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno));
+ if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
+ tok==TK_COMMAND || tok==TK_HTMLTAG
+ )
+ {
+ DBG((" name=%s",qPrint(g_token->name)));
+ }
+ DBG(("\n"));
+ switch(tok)
+ {
+ case TK_WORD:
+ m_children.append(new DocWord(this,g_token->name));
+ break;
+ case TK_LNKWORD:
+ handleLinkedWord(this,m_children);
+ break;
+ case TK_URL:
+ m_children.append(new DocURL(this,g_token->name,g_token->isEMailAddr));
+ break;
+ case TK_WHITESPACE:
+ {
+ // prevent leading whitespace and collapse multiple whitespace areas
+ DocNode::Kind k;
+ if (insidePRE(this) || // all whitespace is relevant
+ (
+ // remove leading whitespace
+ !m_children.isEmpty() &&
+ // and whitespace after certain constructs
+ (k=m_children.last()->kind())!=DocNode::Kind_HtmlDescList &&
+ k!=DocNode::Kind_HtmlTable &&
+ k!=DocNode::Kind_HtmlList &&
+ k!=DocNode::Kind_SimpleSect &&
+ k!=DocNode::Kind_AutoList &&
+ k!=DocNode::Kind_SimpleList &&
+ /*k!=DocNode::Kind_Verbatim &&*/
+ k!=DocNode::Kind_HtmlHeader &&
+ k!=DocNode::Kind_ParamSect &&
+ k!=DocNode::Kind_XRefItem
+ )
+ )
+ {
+ m_children.append(new DocWhiteSpace(this,g_token->chars));
+ }
+ }
+ break;
+ case TK_LISTITEM:
+ {
+ DBG(("found list item at %d parent=%d\n",g_token->indent,parent()->kind()));
+ DocNode *n=parent();
+ while (n && n->kind()!=DocNode::Kind_AutoList) n=n->parent();
+ if (n) // we found an auto list up in the hierarchy
+ {
+ DocAutoList *al = (DocAutoList *)n;
+ DBG(("previous list item at %d\n",al->indent()));
+ if (al->indent()>=g_token->indent)
+ // new item at the same or lower indent level
+ {
+ retval=TK_LISTITEM;
+ goto endparagraph;
+ }
+ }
+
+ // determine list depth
+ int depth = 0;
+ n=parent();
+ while(n)
+ {
+ if(n->kind() == DocNode::Kind_AutoList) ++depth;
+ n=n->parent();
+ }
+
+ // first item or sub list => create new list
+ DocAutoList *al=0;
+ do
+ {
+ al = new DocAutoList(this,g_token->indent,g_token->isEnumList,
+ depth);
+ m_children.append(al);
+ retval = al->parse();
+ } while (retval==TK_LISTITEM && // new list
+ al->indent()==g_token->indent // at same indent level
+ );
+
+ // check the return value
+ if (retval==RetVal_SimpleSec) // auto list ended due to simple section command
+ {
+ // Reparse the token that ended the section at this level,
+ // so a new simple section will be started at this level.
+ // This is the same as unputting the last read token and continuing.
+ g_token->name = g_token->simpleSectName;
+ if (g_token->name.left(4)=="rcs:") // RCS section
+ {
+ g_token->name = g_token->name.mid(4);
+ g_token->text = g_token->simpleSectText;
+ tok = TK_RCSTAG;
+ }
+ else // other section
+ {
+ tok = TK_COMMAND;
+ }
+ DBG(("reparsing command %s\n",qPrint(g_token->name)));
+ goto reparsetoken;
+ }
+ else if (retval==TK_ENDLIST)
+ {
+ if (al->indent()>g_token->indent) // end list
+ {
+ goto endparagraph;
+ }
+ else // continue with current paragraph
+ {
+ }
+ }
+ else // paragraph ended due to TK_NEWPARA, TK_LISTITEM, or EOF
+ {
+ goto endparagraph;
+ }
+ }
+ break;
+ case TK_ENDLIST:
+ DBG(("Found end of list inside of paragraph at line %d\n",doctokenizerYYlineno));
+ if (parent()->kind()==DocNode::Kind_AutoListItem)
+ {
+ ASSERT(parent()->parent()->kind()==DocNode::Kind_AutoList);
+ DocAutoList *al = (DocAutoList *)parent()->parent();
+ if (al->indent()>=g_token->indent)
+ {
+ // end of list marker ends this paragraph
+ retval=TK_ENDLIST;
+ goto endparagraph;
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: End of list marker found "
+ "has invalid indent level");
+ }
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: End of list marker found without any preceding "
+ "list items");
+ }
+ break;
+ case TK_COMMAND:
+ {
+ // see if we have to start a simple section
+ int cmd = Mappers::cmdMapper->map(g_token->name);
+ DocNode *n=parent();
+ while (n &&
+ n->kind()!=DocNode::Kind_SimpleSect &&
+ n->kind()!=DocNode::Kind_ParamSect
+ )
+ {
+ n=n->parent();
+ }
+ if (cmd&SIMPLESECT_BIT)
+ {
+ if (n) // already in a simple section
+ {
+ // simple section cannot start in this paragraph, need
+ // to unwind the stack and remember the command.
+ g_token->simpleSectName = g_token->name.copy();
+ retval=RetVal_SimpleSec;
+ goto endparagraph;
+ }
+ }
+ // see if we are in a simple list
+ n=parent();
+ while (n && n->kind()!=DocNode::Kind_SimpleListItem) n=n->parent();
+ if (n)
+ {
+ if (cmd==CMD_LI)
+ {
+ retval=RetVal_ListItem;
+ goto endparagraph;
+ }
+ }
+
+ // handle the command
+ retval=handleCommand(g_token->name.copy());
+ DBG(("handleCommand returns %x\n",retval));
+
+ // check the return value
+ if (retval==RetVal_SimpleSec)
+ {
+ // Reparse the token that ended the section at this level,
+ // so a new simple section will be started at this level.
+ // This is the same as unputting the last read token and continuing.
+ g_token->name = g_token->simpleSectName;
+ if (g_token->name.left(4)=="rcs:") // RCS section
+ {
+ g_token->name = g_token->name.mid(4);
+ g_token->text = g_token->simpleSectText;
+ tok = TK_RCSTAG;
+ }
+ else // other section
+ {
+ tok = TK_COMMAND;
+ }
+ DBG(("reparsing command %s\n",qPrint(g_token->name)));
+ goto reparsetoken;
+ }
+ else if (retval==RetVal_OK)
+ {
+ // the command ended normally, keep scanning for new tokens.
+ retval = 0;
+ }
+ else if (retval>0 && retval<RetVal_OK)
+ {
+ // the command ended with a new command, reparse this token
+ tok = retval;
+ goto reparsetoken;
+ }
+ else // end of file, end of paragraph, start or end of section
+ // or some auto list marker
+ {
+ goto endparagraph;
+ }
+ }
+ break;
+ case TK_HTMLTAG:
+ {
+ if (!g_token->endTag) // found a start tag
+ {
+ retval = handleHtmlStartTag(g_token->name,g_token->attribs);
+ }
+ else // found an end tag
+ {
+ retval = handleHtmlEndTag(g_token->name);
+ }
+ if (retval==RetVal_OK)
+ {
+ // the command ended normally, keep scanner for new tokens.
+ retval = 0;
+ }
+ else
+ {
+ goto endparagraph;
+ }
+ }
+ break;
+ case TK_SYMBOL:
+ {
+ char letter='\0';
+ DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
+ if (s!=DocSymbol::Unknown)
+ {
+ m_children.append(new DocSymbol(this,s,letter));
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ }
+ break;
+ }
+ case TK_NEWPARA:
+ retval=TK_NEWPARA;
+ goto endparagraph;
+ case TK_RCSTAG:
+ {
+ DocNode *n=parent();
+ while (n &&
+ n->kind()!=DocNode::Kind_SimpleSect &&
+ n->kind()!=DocNode::Kind_ParamSect
+ )
+ {
+ n=n->parent();
+ }
+ if (n) // already in a simple section
+ {
+ // simple section cannot start in this paragraph, need
+ // to unwind the stack and remember the command.
+ g_token->simpleSectName = "rcs:"+g_token->name;
+ g_token->simpleSectText = g_token->text;
+ retval=RetVal_SimpleSec;
+ goto endparagraph;
+ }
+
+ // see if we are in a simple list
+ DocSimpleSect *ss=new DocSimpleSect(this,DocSimpleSect::Rcs);
+ m_children.append(ss);
+ ss->parseRcs();
+ }
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,
+ "warning: Found unexpected token (id=%x)\n",tok);
+ break;
+ }
+ }
+ retval=0;
+endparagraph:
+ handlePendingStyleCommands(this,m_children);
+ DocNode *n = g_nodeStack.pop();
+ ASSERT(n==this);
+ DBG(("DocPara::parse() end retval=%x\n",retval));
+ INTERNAL_ASSERT(retval==0 || retval==TK_NEWPARA || retval==TK_LISTITEM ||
+ retval==TK_ENDLIST || retval>RetVal_OK
+ );
+
+ return retval;
+}
+
+//--------------------------------------------------------------------------
+
+int DocSection::parse()
+{
+ DBG(("DocSection::parse() start %s level=%d\n",qPrint(g_token->sectionId),m_level));
+ int retval=RetVal_OK;
+ g_nodeStack.push(this);
+
+ SectionInfo *sec;
+ if (!m_id.isEmpty())
+ {
+ sec=Doxygen::sectionDict[m_id];
+ if (sec)
+ {
+ m_file = sec->fileName;
+ m_anchor = sec->label;
+ m_title = sec->title;
+ if (m_title.isEmpty()) m_title = sec->label;
+ if (g_sectionDict && g_sectionDict->find(m_id)==0)
+ {
+ g_sectionDict->insert(m_id,sec);
+ }
+ }
+ }
+
+ // first parse any number of paragraphs
+ bool isFirst=TRUE;
+ DocPara *lastPar=0;
+ do
+ {
+ DocPara *par = new DocPara(this);
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ retval=par->parse();
+ if (!par->isEmpty())
+ {
+ m_children.append(par);
+ lastPar=par;
+ }
+ else
+ {
+ delete par;
+ }
+ if (retval==TK_LISTITEM)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found");
+ }
+ } while (retval!=0 &&
+ retval!=RetVal_Internal &&
+ retval!=RetVal_Section &&
+ retval!=RetVal_Subsection &&
+ retval!=RetVal_Subsubsection &&
+ retval!=RetVal_Paragraph
+ );
+
+ if (lastPar) lastPar->markLast();
+
+ //printf("m_level=%d <-> %d\n",m_level,Doxygen::subpageNestingLevel);
+
+ if (retval==RetVal_Subsection && m_level==Doxygen::subpageNestingLevel+1)
+ {
+ // then parse any number of nested sections
+ while (retval==RetVal_Subsection) // more sections follow
+ {
+ //SectionInfo *sec=Doxygen::sectionDict[g_token->sectionId];
+ DocSection *s=new DocSection(this,
+ QMIN(2+Doxygen::subpageNestingLevel,5),g_token->sectionId);
+ m_children.append(s);
+ retval = s->parse();
+ }
+ }
+ else if (retval==RetVal_Subsubsection && m_level==Doxygen::subpageNestingLevel+2)
+ {
+ // then parse any number of nested sections
+ while (retval==RetVal_Subsubsection) // more sections follow
+ {
+ //SectionInfo *sec=Doxygen::sectionDict[g_token->sectionId];
+ DocSection *s=new DocSection(this,
+ QMIN(3+Doxygen::subpageNestingLevel,5),g_token->sectionId);
+ m_children.append(s);
+ retval = s->parse();
+ }
+ }
+ else if (retval==RetVal_Paragraph && m_level==QMIN(5,Doxygen::subpageNestingLevel+3))
+ {
+ // then parse any number of nested sections
+ while (retval==RetVal_Paragraph) // more sections follow
+ {
+ //SectionInfo *sec=Doxygen::sectionDict[g_token->sectionId];
+ DocSection *s=new DocSection(this,
+ QMIN(4+Doxygen::subpageNestingLevel,5),g_token->sectionId);
+ m_children.append(s);
+ retval = s->parse();
+ }
+ }
+ else if ((m_level<=1+Doxygen::subpageNestingLevel && retval==RetVal_Subsubsection) ||
+ (m_level<=2+Doxygen::subpageNestingLevel && retval==RetVal_Paragraph)
+ )
+ {
+ int level;
+ if (retval==RetVal_Subsection) level=2;
+ else if (retval==RetVal_Subsubsection) level=3;
+ else level=4;
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected %s "
+ "command found inside %s!",
+ sectionLevelToName[level],sectionLevelToName[m_level]);
+ retval=0; // stop parsing
+
+ }
+ else if (retval==RetVal_Internal)
+ {
+ DocInternal *in = new DocInternal(this);
+ m_children.append(in);
+ retval = in->parse(m_level+1);
+ }
+ else
+ {
+ }
+
+ INTERNAL_ASSERT(retval==0 ||
+ retval==RetVal_Section ||
+ retval==RetVal_Subsection ||
+ retval==RetVal_Subsubsection ||
+ retval==RetVal_Paragraph ||
+ retval==RetVal_Internal
+ );
+
+ DBG(("DocSection::parse() end\n"));
+ DocNode *n = g_nodeStack.pop();
+ ASSERT(n==this);
+ return retval;
+}
+
+//--------------------------------------------------------------------------
+
+void DocText::parse()
+{
+ DBG(("DocText::parse() start\n"));
+ g_nodeStack.push(this);
+ doctokenizerYYsetStateText();
+
+ int tok;
+ while ((tok=doctokenizerYYlex())) // get the next token
+ {
+ switch(tok)
+ {
+ case TK_WORD:
+ m_children.append(new DocWord(this,g_token->name));
+ break;
+ case TK_WHITESPACE:
+ m_children.append(new DocWhiteSpace(this,g_token->chars));
+ break;
+ case TK_SYMBOL:
+ {
+ char letter='\0';
+ DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
+ if (s!=DocSymbol::Unknown)
+ {
+ m_children.append(new DocSymbol(this,s,letter));
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ qPrint(g_token->name));
+ }
+ }
+ break;
+ case TK_COMMAND:
+ switch (Mappers::cmdMapper->map(g_token->name))
+ {
+ case CMD_BSLASH:
+ m_children.append(new DocSymbol(this,DocSymbol::BSlash));
+ break;
+ case CMD_AT:
+ m_children.append(new DocSymbol(this,DocSymbol::At));
+ break;
+ case CMD_LESS:
+ m_children.append(new DocSymbol(this,DocSymbol::Less));
+ break;
+ case CMD_GREATER:
+ m_children.append(new DocSymbol(this,DocSymbol::Greater));
+ break;
+ case CMD_AMP:
+ m_children.append(new DocSymbol(this,DocSymbol::Amp));
+ break;
+ case CMD_DOLLAR:
+ m_children.append(new DocSymbol(this,DocSymbol::Dollar));
+ break;
+ case CMD_HASH:
+ m_children.append(new DocSymbol(this,DocSymbol::Hash));
+ break;
+ case CMD_DCOLON:
+ m_children.append(new DocSymbol(this,DocSymbol::DoubleColon));
+ break;
+ case CMD_PERCENT:
+ m_children.append(new DocSymbol(this,DocSymbol::Percent));
+ break;
+ case CMD_QUOTE:
+ m_children.append(new DocSymbol(this,DocSymbol::Quot));
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected command `%s' found",
+ qPrint(g_token->name));
+ break;
+ }
+ break;
+ default:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ tokToString(tok));
+ break;
+ }
+ }
+
+ handleUnclosedStyleCommands();
+
+ DocNode *n = g_nodeStack.pop();
+ ASSERT(n==this);
+ DBG(("DocText::parse() end\n"));
+}
+
+
+//--------------------------------------------------------------------------
+
+void DocRoot::parse()
+{
+ DBG(("DocRoot::parse() start\n"));
+ g_nodeStack.push(this);
+ doctokenizerYYsetStatePara();
+ int retval=0;
+
+ // first parse any number of paragraphs
+ bool isFirst=TRUE;
+ DocPara *lastPar=0;
+ do
+ {
+ DocPara *par = new DocPara(this);
+ if (isFirst) { par->markFirst(); isFirst=FALSE; }
+ retval=par->parse();
+ if (!par->isEmpty())
+ {
+ m_children.append(par);
+ lastPar=par;
+ }
+ else
+ {
+ delete par;
+ }
+ if (retval==TK_LISTITEM)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found");
+ }
+ else if (retval==RetVal_Subsection)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found subsection command outside of section context!");
+ }
+ else if (retval==RetVal_Subsubsection)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found subsubsection command outside of subsection context!");
+ }
+ else if (retval==RetVal_Paragraph)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found paragraph command outside of subsubsection context!");
+ }
+ } while (retval!=0 && retval!=RetVal_Section && retval!=RetVal_Internal);
+ if (lastPar) lastPar->markLast();
+
+ //printf("DocRoot::parse() retval=%d %d\n",retval,RetVal_Section);
+ // then parse any number of level1 sections
+ while (retval==RetVal_Section)
+ {
+ SectionInfo *sec=Doxygen::sectionDict[g_token->sectionId];
+ if (sec)
+ {
+ DocSection *s=new DocSection(this,
+ QMIN(1+Doxygen::subpageNestingLevel,5),g_token->sectionId);
+ m_children.append(s);
+ retval = s->parse();
+ }
+ else
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid section id `%s'; ignoring section",qPrint(g_token->sectionId));
+ retval = 0;
+ }
+ }
+
+ if (retval==RetVal_Internal)
+ {
+ DocInternal *in = new DocInternal(this);
+ m_children.append(in);
+ retval = in->parse(1);
+ }
+
+
+ handleUnclosedStyleCommands();
+
+ DocNode *n = g_nodeStack.pop();
+ ASSERT(n==this);
+ DBG(("DocRoot::parse() end\n"));
+}
+
+//--------------------------------------------------------------------------
+
+DocNode *validatingParseDoc(const char *fileName,int startLine,
+ Definition *ctx,MemberDef *md,
+ const char *input,bool indexWords,
+ bool isExample, const char *exampleName,
+ bool singleLine, bool linkFromIndex)
+{
+ //printf("validatingParseDoc(%s,%s)=[%s]\n",ctx?ctx->name().data():"<none>",
+ // md?md->name().data():"<none>",
+ // input);
+ //printf("========== validating %s at line %d\n",fileName,startLine);
+ //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",input);
+ //g_token = new TokenInfo;
+
+ // store parser state so we can re-enter this function if needed
+ bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ docParserPushContext();
+
+ if (ctx && ctx!=Doxygen::globalScope &&
+ (ctx->definitionType()==Definition::TypeClass ||
+ ctx->definitionType()==Definition::TypeNamespace
+ )
+ )
+ {
+ g_context = ctx->name();
+ }
+ else if (ctx && ctx->definitionType()==Definition::TypePage)
+ {
+ Definition *scope = ((PageDef*)ctx)->getPageScope();
+ if (scope && scope!=Doxygen::globalScope) g_context = scope->name();
+ }
+ else if (ctx && ctx->definitionType()==Definition::TypeGroup)
+ {
+ Definition *scope = ((GroupDef*)ctx)->getGroupScope();
+ if (scope && scope!=Doxygen::globalScope) g_context = scope->name();
+ }
+ else
+ {
+ g_context = "";
+ }
+ g_scope = ctx;
+
+ if (indexWords && md && Doxygen::searchIndex)
+ {
+ g_searchUrl=md->getOutputFileBase();
+ Doxygen::searchIndex->setCurrentDoc(
+ (fortranOpt?theTranslator->trSubprogram(TRUE,TRUE):theTranslator->trMember(TRUE,TRUE))+" "+md->qualifiedName(),
+ g_searchUrl,
+ md->anchor());
+ }
+ else if (indexWords && ctx && Doxygen::searchIndex)
+ {
+ g_searchUrl=ctx->getOutputFileBase();
+ QCString name = ctx->qualifiedName();
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ name = substitute(name,"::",".");
+ }
+ switch (ctx->definitionType())
+ {
+ case Definition::TypePage:
+ {
+ PageDef *pd = (PageDef *)ctx;
+ if (!pd->title().isEmpty())
+ {
+ name = theTranslator->trPage(TRUE,TRUE)+" "+pd->title();
+ }
+ else
+ {
+ name = theTranslator->trPage(TRUE,TRUE)+" "+pd->name();
+ }
+ }
+ break;
+ case Definition::TypeClass:
+ {
+ ClassDef *cd = (ClassDef *)ctx;
+ name.prepend(cd->compoundTypeString()+" ");
+ }
+ break;
+ case Definition::TypeNamespace:
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ name = theTranslator->trPackage(name);
+ }
+ else if(fortranOpt)
+ {
+ name.prepend(theTranslator->trModule(TRUE,TRUE)+" ");
+ }
+ else
+ {
+ name.prepend(theTranslator->trNamespace(TRUE,TRUE)+" ");
+ }
+ }
+ break;
+ case Definition::TypeGroup:
+ {
+ GroupDef *gd = (GroupDef *)ctx;
+ if (gd->groupTitle())
+ {
+ name = theTranslator->trGroup(TRUE,TRUE)+" "+gd->groupTitle();
+ }
+ else
+ {
+ name.prepend(theTranslator->trGroup(TRUE,TRUE)+" ");
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ Doxygen::searchIndex->setCurrentDoc(name,g_searchUrl);
+ }
+ else
+ {
+ g_searchUrl="";
+ }
+
+ g_fileName = fileName;
+ g_relPath = (!linkFromIndex && ctx) ?
+ QCString(relativePathToRoot(ctx->getOutputFileBase())) :
+ QCString("");
+ //printf("ctx->name=%s relPath=%s\n",ctx->name().data(),g_relPath.data());
+ g_memberDef = md;
+ g_nodeStack.clear();
+ g_styleStack.clear();
+ g_initialStyleStack.clear();
+ g_inSeeBlock = FALSE;
+ g_insideHtmlLink = FALSE;
+ g_includeFileText = "";
+ g_includeFileOffset = 0;
+ g_includeFileLength = 0;
+ g_isExample = isExample;
+ g_exampleName = exampleName;
+ g_hasParamCommand = FALSE;
+ g_hasReturnCommand = FALSE;
+ g_paramsFound.setAutoDelete(FALSE);
+ g_paramsFound.clear();
+ g_sectionDict = 0; //sections;
+
+ //printf("Starting comment block at %s:%d\n",g_fileName.data(),startLine);
+ doctokenizerYYlineno=startLine;
+ doctokenizerYYinit(input,g_fileName);
+
+
+ // build abstract syntax tree
+ DocRoot *root = new DocRoot(md!=0,singleLine);
+ root->parse();
+
+
+ if (Debug::isFlagSet(Debug::PrintTree))
+ {
+ // pretty print the result
+ PrintDocVisitor *v = new PrintDocVisitor;
+ root->accept(v);
+ delete v;
+ }
+
+
+ checkUndocumentedParams();
+ detectNoDocumentedParams();
+
+ // TODO: These should be called at the end of the program.
+ //doctokenizerYYcleanup();
+ //Mappers::cmdMapper->freeInstance();
+ //Mappers::htmlTagMapper->freeInstance();
+
+ // restore original parser state
+ docParserPopContext();
+
+ //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?ctx->name().data():"<none>",
+ // md?md->name().data():"<none>");
+
+ return root;
+}
+
+DocNode *validatingParseText(const char *input)
+{
+ // store parser state so we can re-enter this function if needed
+ docParserPushContext();
+
+ //printf("------------ input ---------\n%s\n"
+ // "------------ end input -----\n",input);
+ //g_token = new TokenInfo;
+ g_context = "";
+ g_fileName = "<parseText>";
+ g_relPath = "";
+ g_memberDef = 0;
+ g_nodeStack.clear();
+ g_styleStack.clear();
+ g_initialStyleStack.clear();
+ g_inSeeBlock = FALSE;
+ g_insideHtmlLink = FALSE;
+ g_includeFileText = "";
+ g_includeFileOffset = 0;
+ g_includeFileLength = 0;
+ g_isExample = FALSE;
+ g_exampleName = "";
+ g_hasParamCommand = FALSE;
+ g_hasReturnCommand = FALSE;
+ g_paramsFound.setAutoDelete(FALSE);
+ g_paramsFound.clear();
+ g_searchUrl="";
+
+ DocText *txt = new DocText;
+
+ if (input)
+ {
+ doctokenizerYYlineno=1;
+ doctokenizerYYinit(input,g_fileName);
+
+ // build abstract syntax tree
+ txt->parse();
+
+ if (Debug::isFlagSet(Debug::PrintTree))
+ {
+ // pretty print the result
+ PrintDocVisitor *v = new PrintDocVisitor;
+ txt->accept(v);
+ delete v;
+ }
+ }
+
+ // restore original parser state
+ docParserPopContext();
+ return txt;
+}
+
+void docFindSections(const char *input,
+ Definition *d,
+ MemberGroup *mg,
+ const char *fileName)
+{
+ doctokenizerYYFindSections(input,d,mg,fileName);
+}
+
+void initDocParser()
+{
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
+ if (searchEngine && serverBasedSearch)
+ {
+ Doxygen::searchIndex = new SearchIndex;
+ }
+ else // no search engine or pure javascript based search function
+ {
+ Doxygen::searchIndex = 0;
+ }
+}
+
+void finializeDocParser()
+{
+ delete Doxygen::searchIndex;
+}
+
diff --git a/src/docparser.h b/src/docparser.h
new file mode 100644
index 0000000..c1c52dc
--- /dev/null
+++ b/src/docparser.h
@@ -0,0 +1,1221 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _DOCPARSER_H
+#define _DOCPARSER_H
+
+#include <stdio.h>
+
+#include <qlist.h>
+#include <qcstring.h>
+
+#include "docvisitor.h"
+#include "htmlattrib.h"
+
+class DocNode;
+class MemberDef;
+class Definition;
+class MemberGroup;
+class SectionDict;
+
+//---------------------------------------------------------------------------
+
+/*! Initialize the documentation parser */
+void initDocParser();
+/*! Cleanup the documentation parser */
+void finializeDocParser();
+
+/*! Main entry point for the documentation parser.
+ * @param fileName File in which the documentation block is found (or the
+ * name of the example file in case isExample is TRUE).
+ * @param startLine Line at which the documentation block is found.
+ * @param context Class or namespace to which this block belongs.
+ * @param md Member definition to which the documentation belongs.
+ * Can be 0.
+ * @param input String representation of the documentation block.
+ * @param indexWords Indicates whether or not words should be put in the
+ * search index.
+ * @param isExample TRUE if the documentation belongs to an example.
+ * @param exampleName Base name of the example file (0 if isExample is FALSE).
+ * @param singleLine Output should be presented on a single line, so without
+ * starting a new paragraph at the end.
+ * @param linkFromIndex TRUE if the documentation is generated from an
+ * index page. In this case context is not used to determine
+ * the relative path when making a link.
+ * @returns Root node of the abstract syntax tree. Ownership of the
+ * pointer is handed over to the caller.
+ */
+DocNode *validatingParseDoc(const char *fileName,int startLine,
+ Definition *context, MemberDef *md,
+ const char *input,bool indexWords,
+ bool isExample,const char *exampleName=0,
+ bool singleLine=FALSE,bool linkFromIndex=FALSE);
+
+/*! Main entry point for parsing simple text fragments. These
+ * fragments are limited to words, whitespace and symbols.
+ */
+DocNode *validatingParseText(const char *input);
+
+/*! Searches for section and anchor commands in the input */
+void docFindSections(const char *input,
+ Definition *d,
+ MemberGroup *m,
+ const char *fileName);
+
+//---------------------------------------------------------------------------
+
+/*! @brief Abstract node interface with type information. */
+class DocNode
+{
+ public:
+ /*! Available node types. */
+ enum Kind { Kind_Root = 0,
+ Kind_Word = 1,
+ Kind_WhiteSpace = 2,
+ Kind_Para = 3,
+ Kind_AutoList = 4,
+ Kind_AutoListItem = 5,
+ Kind_Symbol = 6,
+ Kind_URL = 7,
+ Kind_StyleChange = 8,
+ Kind_SimpleSect = 9,
+ Kind_Title = 10,
+ Kind_SimpleList = 11,
+ Kind_SimpleListItem = 12,
+ Kind_Section = 13,
+ Kind_Verbatim = 14,
+ Kind_XRefItem = 15,
+ Kind_HtmlList = 16,
+ Kind_HtmlListItem = 17,
+ Kind_HtmlDescList = 18,
+ Kind_HtmlDescData = 19,
+ Kind_HtmlDescTitle = 20,
+ Kind_HtmlTable = 21,
+ Kind_HtmlRow = 22,
+ Kind_HtmlCell = 23,
+ Kind_HtmlCaption = 24,
+ Kind_LineBreak = 25,
+ Kind_HorRuler = 26,
+ Kind_Anchor = 27,
+ Kind_IndexEntry = 28,
+ Kind_Internal = 29,
+ Kind_HRef = 30,
+ Kind_Include = 31,
+ Kind_IncOperator = 32,
+ Kind_HtmlHeader = 33,
+ Kind_Image = 34,
+ Kind_DotFile = 35,
+ Kind_Link = 36,
+ Kind_Ref = 37,
+ Kind_Formula = 38,
+ Kind_SecRefItem = 39,
+ Kind_SecRefList = 40,
+ Kind_SimpleSectSep = 41,
+ Kind_LinkedWord = 42,
+ Kind_ParamSect = 43,
+ Kind_ParamList = 44,
+ Kind_InternalRef = 45,
+ Kind_Copy = 46,
+ Kind_Text = 47,
+ Kind_MscFile = 48
+ };
+ /*! Creates a new node */
+ DocNode() : m_parent(0), m_insidePre(FALSE) {}
+
+ /*! Destroys a node. */
+ virtual ~DocNode() {}
+
+ /*! Returns the kind of node. Provides runtime type information */
+ virtual Kind kind() const = 0;
+
+ /*! Returns the parent of this node or 0 for the root node. */
+ DocNode *parent() const { return m_parent; }
+
+ /*! Sets a new parent for this node. */
+ void setParent(DocNode *parent) { m_parent = parent; }
+
+ /*! Acceptor function for node visitors. Part of the visitor pattern.
+ * @param v Abstract visitor.
+ */
+ virtual void accept(DocVisitor *v) = 0;
+
+ /*! Returns TRUE iff this node is inside a preformatted section */
+ bool isPreformatted() const { return m_insidePre; }
+
+ protected:
+ /*! Sets whether or not this item is inside a preformatted section */
+ void setInsidePreformatted(bool p) { m_insidePre = p; }
+ DocNode *m_parent;
+ private:
+
+ bool m_insidePre;
+};
+
+/*! @brief Default accept implementation for compound nodes in the abstract
+ * syntax tree.
+ */
+template<class T> class CompAccept
+{
+ public:
+ CompAccept() { m_children.setAutoDelete(TRUE); }
+ virtual ~CompAccept() {}
+ void accept(T *obj, DocVisitor *v)
+ {
+ v->visitPre(obj);
+ QListIterator<DocNode> cli(m_children);
+ DocNode *n;
+ for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
+ v->visitPost(obj);
+ }
+
+ protected:
+ QList<DocNode> m_children;
+};
+
+
+/*! @brief Node representing a word
+ */
+class DocWord : public DocNode
+{
+ public:
+ DocWord(DocNode *parent,const QCString &word);
+ QCString word() const { return m_word; }
+ Kind kind() const { return Kind_Word; }
+ void accept(DocVisitor *v) { v->visit(this); }
+
+ private:
+ QCString m_word;
+};
+
+/*! @brief Node representing a word that can be linked to something
+ */
+class DocLinkedWord : public DocNode
+{
+ public:
+ DocLinkedWord(DocNode *parent,const QCString &word,
+ const QCString &ref,const QCString &file,
+ const QCString &anchor,const QCString &tooltip);
+ QCString word() const { return m_word; }
+ Kind kind() const { return Kind_LinkedWord; }
+ QCString file() const { return m_file; }
+ QCString relPath() const { return m_relPath; }
+ QCString ref() const { return m_ref; }
+ QCString anchor() const { return m_anchor; }
+ QCString tooltip() const { return m_tooltip; }
+ void accept(DocVisitor *v) { v->visit(this); }
+
+ private:
+ QCString m_word;
+ QCString m_ref;
+ QCString m_file;
+ QCString m_relPath;
+ QCString m_anchor;
+ QCString m_tooltip;
+};
+
+/*! @brief Node representing an URL (or email address) */
+class DocURL : public DocNode
+{
+ public:
+ DocURL(DocNode *parent,const QCString &url,bool isEmail) :
+ m_url(url), m_isEmail(isEmail) { m_parent=parent; }
+ QCString url() const { return m_url; }
+ Kind kind() const { return Kind_URL; }
+ void accept(DocVisitor *v) { v->visit(this); }
+ bool isEmail() const { return m_isEmail; }
+
+ private:
+ QCString m_url;
+ bool m_isEmail;
+};
+
+/*! @brief Node representing a line break */
+class DocLineBreak : public DocNode
+{
+ public:
+ DocLineBreak(DocNode *parent) { m_parent=parent; }
+ Kind kind() const { return Kind_LineBreak; }
+ void accept(DocVisitor *v) { v->visit(this); }
+
+ private:
+};
+
+/*! @brief Node representing a horizonal ruler */
+class DocHorRuler : public DocNode
+{
+ public:
+ DocHorRuler(DocNode *parent) { m_parent = parent; }
+ Kind kind() const { return Kind_HorRuler; }
+ void accept(DocVisitor *v) { v->visit(this); }
+
+ private:
+};
+
+/*! @brief Node representing an anchor */
+class DocAnchor : public DocNode
+{
+ public:
+ DocAnchor(DocNode *parent,const QCString &id,bool newAnchor);
+ Kind kind() const { return Kind_Anchor; }
+ QCString anchor() const { return m_anchor; }
+ QCString file() const { return m_file; }
+ void accept(DocVisitor *v) { v->visit(this); }
+
+ private:
+ QCString m_anchor;
+ QCString m_file;
+};
+
+/*! @brief Node representing a style change */
+class DocStyleChange : public DocNode
+{
+ public:
+ enum Style { Bold, Italic, Code, Center, Small,
+ Subscript, Superscript, Preformatted,
+ Span, Div
+ };
+ DocStyleChange(DocNode *parent,uint position,Style s,bool enable,
+ const HtmlAttribList *attribs=0) :
+ m_position(position), m_style(s), m_enable(enable)
+ { m_parent = parent; if (attribs) m_attribs=*attribs; }
+ Kind kind() const { return Kind_StyleChange; }
+ Style style() const { return m_style; }
+ const char *styleString() const;
+ bool enable() const { return m_enable; }
+ uint position() const { return m_position; }
+ void accept(DocVisitor *v) { v->visit(this); }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+
+ private:
+ uint m_position;
+ Style m_style;
+ bool m_enable;
+ HtmlAttribList m_attribs;
+};
+
+/*! @brief Node representing a special symbol */
+class DocSymbol : public DocNode
+{
+ public:
+ enum SymType { Unknown=0, BSlash, At, Less, Greater, Amp, Dollar, Hash,
+ DoubleColon, Percent, Copy, Tm, Reg, Apos, Quot, Uml, Acute,
+ Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Slash,
+ Lsquo, Rsquo, Ldquo, Rdquo, Ndash, Mdash, Aelig, AElig
+ };
+ DocSymbol(DocNode *parent,SymType s,char letter='\0') :
+ m_symbol(s), m_letter(letter) { m_parent = parent; }
+ SymType symbol() const { return m_symbol; }
+ char letter() const { return m_letter; }
+ Kind kind() const { return Kind_Symbol; }
+ void accept(DocVisitor *v) { v->visit(this); }
+ static SymType decodeSymbol(const QCString &symName,char *letter);
+
+ private:
+ SymType m_symbol;
+ char m_letter;
+};
+
+/*! @brief Node representing some amount of white space */
+class DocWhiteSpace : public DocNode
+{
+ public:
+ DocWhiteSpace(DocNode *parent,const QCString &chars) :
+ m_chars(chars) { m_parent = parent; }
+ Kind kind() const { return Kind_WhiteSpace; }
+ QCString chars() const { return m_chars; }
+ void accept(DocVisitor *v) { v->visit(this); }
+ private:
+ QCString m_chars;
+};
+
+/*! @brief Node representing a verbatim, unparsed text fragment */
+class DocVerbatim : public DocNode
+{
+ public:
+ enum Type { Code, HtmlOnly, ManOnly, LatexOnly, XmlOnly, Verbatim, Dot, Msc };
+ DocVerbatim(DocNode *parent,const QCString &context,
+ const QCString &text, Type t,bool isExample,
+ const QCString &exampleFile);
+ Kind kind() const { return Kind_Verbatim; }
+ Type type() const { return m_type; }
+ QCString text() const { return m_text; }
+ QCString context() const { return m_context; }
+ void accept(DocVisitor *v) { v->visit(this); }
+ bool isExample() const { return m_isExample; }
+ QCString exampleFile() const { return m_exampleFile; }
+ QCString relPath() const { return m_relPath; }
+
+ private:
+ QCString m_context;
+ QCString m_text;
+ Type m_type;
+ bool m_isExample;
+ QCString m_exampleFile;
+ QCString m_relPath;
+};
+
+
+/*! @brief Node representing an included text block from file */
+class DocInclude : public DocNode
+{
+ public:
+ enum Type { Include, DontInclude, VerbInclude, HtmlInclude, IncWithLines };
+ DocInclude(DocNode *parent,const QCString &file,
+ const QCString context, Type t,
+ bool isExample,const QCString exampleFile) :
+ m_file(file), m_context(context), m_type(t),
+ m_isExample(isExample), m_exampleFile(exampleFile) { m_parent = parent; }
+ Kind kind() const { return Kind_Include; }
+ QCString file() const { return m_file; }
+ QCString extension() const { int i=m_file.findRev('.');
+ if (i!=-1)
+ return m_file.right(m_file.length()-i);
+ else
+ return "";
+ }
+ Type type() const { return m_type; }
+ QCString text() const { return m_text; }
+ QCString context() const { return m_context; }
+ bool isExample() const { return m_isExample; }
+ QCString exampleFile() const { return m_exampleFile; }
+ void accept(DocVisitor *v) { v->visit(this); }
+ void parse();
+
+ private:
+ QCString m_file;
+ QCString m_context;
+ QCString m_text;
+ Type m_type;
+ bool m_isExample;
+ QCString m_exampleFile;
+};
+
+/*! @brief Node representing a include/dontinclude operator block */
+class DocIncOperator : public DocNode
+{
+ public:
+ enum Type { Line, SkipLine, Skip, Until };
+ DocIncOperator(DocNode *parent,Type t,const QCString &pat,
+ const QCString &context,bool isExample,const QCString &exampleFile) :
+ m_type(t), m_pattern(pat), m_context(context),
+ m_isFirst(FALSE), m_isLast(FALSE),
+ m_isExample(isExample), m_exampleFile(exampleFile) { m_parent = parent; }
+ Kind kind() const { return Kind_IncOperator; }
+ Type type() const { return m_type; }
+ QCString text() const { return m_text; }
+ QCString pattern() const { return m_pattern; }
+ QCString context() const { return m_context; }
+ void accept(DocVisitor *v) { v->visit(this); }
+ bool isFirst() const { return m_isFirst; }
+ bool isLast() const { return m_isLast; }
+ void markFirst(bool v=TRUE) { m_isFirst = v; }
+ void markLast(bool v=TRUE) { m_isLast = v; }
+ bool isExample() const { return m_isExample; }
+ QCString exampleFile() const { return m_exampleFile; }
+ void parse();
+
+ private:
+ Type m_type;
+ QCString m_text;
+ QCString m_pattern;
+ QCString m_context;
+ bool m_isFirst;
+ bool m_isLast;
+ bool m_isExample;
+ QCString m_exampleFile;
+};
+
+/*! @brief Node representing an item of a cross-referenced list */
+class DocFormula : public DocNode
+{
+ public:
+ DocFormula(DocNode *parent,int id);
+ Kind kind() const { return Kind_Formula; }
+ QCString name() const { return m_name; }
+ QCString text() const { return m_text; }
+ QCString relPath() const { return m_relPath; }
+ int id() const { return m_id; }
+ void accept(DocVisitor *v) { v->visit(this); }
+ bool isInline() { return m_text.length()>0 ? m_text.at(0)!='\\' : TRUE; }
+
+ private:
+ QCString m_name;
+ QCString m_text;
+ QCString m_relPath;
+ int m_id;
+};
+
+/*! @brief Node representing an entry in the index. */
+class DocIndexEntry : public DocNode
+{
+ public:
+ DocIndexEntry(DocNode *parent,Definition *scope,MemberDef *md)
+ : m_scope(scope), m_member(md) { m_parent = parent; }
+ Kind kind() const { return Kind_IndexEntry; }
+ int parse();
+ Definition *scope() const { return m_scope; }
+ MemberDef *member() const { return m_member; }
+ QCString entry() const { return m_entry; }
+ void accept(DocVisitor *v) { v->visit(this); }
+
+ private:
+ QCString m_entry;
+ Definition *m_scope;
+ MemberDef *m_member;
+};
+
+//-----------------------------------------------------------------------
+
+/*! @brief Node representing a copy of documentation block. */
+class DocCopy : public CompAccept<DocCopy>, public DocNode
+{
+ public:
+ DocCopy(DocNode *parent,const QCString &link,bool copyBrief,bool copyDetails)
+ : m_link(link),
+ m_copyBrief(copyBrief), m_copyDetails(copyDetails) { m_parent = parent; }
+ Kind kind() const { return Kind_Copy; }
+ QCString link() const { return m_link; }
+ void accept(DocVisitor *v) { CompAccept<DocCopy>::accept(this,v); }
+ void parse();
+
+ private:
+ QCString m_link;
+ bool m_copyBrief;
+ bool m_copyDetails;
+};
+
+/*! @brief Node representing an auto List */
+class DocAutoList : public CompAccept<DocAutoList>, public DocNode
+{
+ public:
+ DocAutoList(DocNode *parent,int indent,bool isEnumList,
+ int depth) :
+ m_indent(indent), m_isEnumList(isEnumList),
+ m_depth(depth) { m_parent = parent; }
+ Kind kind() const { return Kind_AutoList; }
+ bool isEnumList() const { return m_isEnumList; }
+ int indent() const { return m_indent; }
+ int depth() const { return m_depth; }
+ void accept(DocVisitor *v) { CompAccept<DocAutoList>::accept(this,v); }
+ int parse();
+
+ private:
+ int m_indent;
+ bool m_isEnumList;
+ int m_depth;
+};
+
+
+/*! @brief Node representing a simple section title */
+class DocTitle : public CompAccept<DocTitle>, public DocNode
+{
+ public:
+ DocTitle(DocNode *parent) { m_parent = parent; }
+ void parse();
+ void parseFromString(const QCString &title);
+ Kind kind() const { return Kind_Title; }
+ void accept(DocVisitor *v) { CompAccept<DocTitle>::accept(this,v); }
+
+ private:
+};
+
+/*! @brief Node representing an item of a cross-referenced list */
+class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode
+{
+ public:
+ //enum Type { Bug, Test, Todo, Deprecated };
+ DocXRefItem(DocNode *parent,int id,const char *key);
+ Kind kind() const { return Kind_XRefItem; }
+ QCString file() const { return m_file; }
+ QCString anchor() const { return m_anchor; }
+ QCString title() const { return m_title; }
+ QCString relPath() const { return m_relPath; }
+ QCString key() const { return m_key; }
+ void accept(DocVisitor *v) { CompAccept<DocXRefItem>::accept(this,v); }
+ bool parse();
+ const QList<DocNode> &children() const { return m_children; }
+
+ private:
+ int m_id;
+ QCString m_key;
+ QCString m_file;
+ QCString m_anchor;
+ QCString m_title;
+ QCString m_relPath;
+};
+
+/*! @brief Node representing an image */
+class DocImage : public CompAccept<DocImage>, public DocNode
+{
+ public:
+ enum Type { Html, Latex, Rtf };
+ DocImage(DocNode *parent,const HtmlAttribList &attribs,const QCString &name,Type t);
+ Kind kind() const { return Kind_Image; }
+ Type type() const { return m_type; }
+ QCString name() const { return m_name; }
+ bool hasCaption() const { return !m_children.isEmpty(); }
+ QCString width() const { return m_width; }
+ QCString height() const { return m_height; }
+ QCString relPath() const { return m_relPath; }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ void accept(DocVisitor *v) { CompAccept<DocImage>::accept(this,v); }
+ void parse();
+
+ private:
+ HtmlAttribList m_attribs;
+ QCString m_name;
+ Type m_type;
+ QCString m_width;
+ QCString m_height;
+ QCString m_relPath;
+};
+
+/*! @brief Node representing a dot file */
+class DocDotFile : public CompAccept<DocDotFile>, public DocNode
+{
+ public:
+ DocDotFile(DocNode *parent,const QCString &name,const QCString &context);
+ void parse();
+ Kind kind() const { return Kind_DotFile; }
+ QCString name() const { return m_name; }
+ QCString file() const { return m_file; }
+ QCString relPath() const { return m_relPath; }
+ bool hasCaption() const { return !m_children.isEmpty(); }
+ QCString width() const { return m_width; }
+ QCString height() const { return m_height; }
+ QCString context() const { return m_context; }
+ void accept(DocVisitor *v) { CompAccept<DocDotFile>::accept(this,v); }
+ private:
+ QCString m_name;
+ QCString m_file;
+ QCString m_relPath;
+ QCString m_width;
+ QCString m_height;
+ QCString m_context;
+};
+
+/*! @brief Node representing a msc file */
+class DocMscFile : public CompAccept<DocMscFile>, public DocNode
+{
+ public:
+ DocMscFile(DocNode *parent,const QCString &name,const QCString &context);
+ void parse();
+ Kind kind() const { return Kind_MscFile; }
+ QCString name() const { return m_name; }
+ QCString file() const { return m_file; }
+ QCString relPath() const { return m_relPath; }
+ bool hasCaption() const { return !m_children.isEmpty(); }
+ QCString width() const { return m_width; }
+ QCString height() const { return m_height; }
+ QCString context() const { return m_context; }
+ void accept(DocVisitor *v) { CompAccept<DocMscFile>::accept(this,v); }
+ private:
+ QCString m_name;
+ QCString m_file;
+ QCString m_relPath;
+ QCString m_width;
+ QCString m_height;
+ QCString m_context;
+};
+
+
+/*! @brief Node representing a link to some item */
+class DocLink : public CompAccept<DocLink>, public DocNode
+{
+ public:
+ DocLink(DocNode *parent,const QCString &target);
+ QCString parse(bool,bool isXmlLink=FALSE);
+ Kind kind() const { return Kind_Link; }
+ QCString file() const { return m_file; }
+ QCString relPath() const { return m_relPath; }
+ QCString ref() const { return m_ref; }
+ QCString anchor() const { return m_anchor; }
+ void accept(DocVisitor *v) { CompAccept<DocLink>::accept(this,v); }
+
+ private:
+ QCString m_file;
+ QCString m_relPath;
+ QCString m_ref;
+ QCString m_anchor;
+ QCString m_refText;
+};
+
+/*! @brief Node representing a reference to some item */
+class DocRef : public CompAccept<DocRef>, public DocNode
+{
+ public:
+ DocRef(DocNode *parent,const QCString &target,const QCString &context);
+ void parse();
+ Kind kind() const { return Kind_Ref; }
+ QCString file() const { return m_file; }
+ QCString relPath() const { return m_relPath; }
+ QCString ref() const { return m_ref; }
+ QCString anchor() const { return m_anchor; }
+ QCString targetTitle() const { return m_text; }
+ bool hasLinkText() const { return !m_children.isEmpty(); }
+ bool refToAnchor() const { return m_refToAnchor; }
+ bool refToSection() const { return m_refToSection; }
+ void accept(DocVisitor *v) { CompAccept<DocRef>::accept(this,v); }
+
+ private:
+ bool m_refToSection;
+ bool m_refToAnchor;
+ QCString m_file;
+ QCString m_relPath;
+ QCString m_ref;
+ QCString m_anchor;
+ QCString m_text;
+};
+
+/*! @brief Node representing an internal reference to some item */
+class DocInternalRef : public CompAccept<DocInternalRef>, public DocNode
+{
+ public:
+ DocInternalRef(DocNode *parent,const QCString &target);
+ void parse();
+ Kind kind() const { return Kind_Ref; }
+ QCString file() const { return m_file; }
+ QCString relPath() const { return m_relPath; }
+ QCString anchor() const { return m_anchor; }
+ void accept(DocVisitor *v) { CompAccept<DocInternalRef>::accept(this,v); }
+
+ private:
+ QCString m_file;
+ QCString m_relPath;
+ QCString m_anchor;
+};
+
+/*! @brief Node representing a Language specific section */
+//class DocLanguage : public CompAccept<DocLanguage>, public DocNode
+//{
+// public:
+// DocLanguage(DocNode *parent,const QCString &id) :
+// m_parent(parent), m_id(id) {}
+// QCString id() const { return m_id; }
+// Kind kind() const { return Kind_Language; }
+// DocNode *parent() const { return m_parent; }
+// void accept(DocVisitor *v) { CompAccept<DocLanguage>::accept(this,v); }
+// int parse();
+//
+// private:
+// DocNode * m_parent;
+// QCString m_id;
+//};
+
+/*! @brief Node representing a Hypertext reference */
+class DocHRef : public CompAccept<DocHRef>, public DocNode
+{
+ public:
+ DocHRef(DocNode *parent,const HtmlAttribList &attribs,const QCString &url) :
+ m_attribs(attribs), m_url(url) { m_parent = parent; }
+ int parse();
+ QCString url() const { return m_url; }
+ Kind kind() const { return Kind_HRef; }
+ void accept(DocVisitor *v) { CompAccept<DocHRef>::accept(this,v); }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+
+ private:
+ HtmlAttribList m_attribs;
+ QCString m_url;
+};
+
+/*! @brief Node Html heading */
+class DocHtmlHeader : public CompAccept<DocHtmlHeader>, public DocNode
+{
+ public:
+ DocHtmlHeader(DocNode *parent,const HtmlAttribList &attribs,int level) :
+ m_level(level), m_attribs(attribs) { m_parent = parent; }
+ int level() const { return m_level; }
+ Kind kind() const { return Kind_HtmlHeader; }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ void accept(DocVisitor *v) { CompAccept<DocHtmlHeader>::accept(this,v); }
+ int parse();
+
+ private:
+ int m_level;
+ HtmlAttribList m_attribs;
+};
+
+/*! @brief Node representing a Html description item */
+class DocHtmlDescTitle : public CompAccept<DocHtmlDescTitle>, public DocNode
+{
+ public:
+ DocHtmlDescTitle(DocNode *parent,const HtmlAttribList &attribs) :
+ m_attribs(attribs) { m_parent = parent; }
+ Kind kind() const { return Kind_HtmlDescTitle; }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ void accept(DocVisitor *v) { CompAccept<DocHtmlDescTitle>::accept(this,v); }
+ int parse();
+
+ private:
+ HtmlAttribList m_attribs;
+};
+
+/*! @brief Node representing a Html description list */
+class DocHtmlDescList : public CompAccept<DocHtmlDescList>, public DocNode
+{
+ public:
+ DocHtmlDescList(DocNode *parent,const HtmlAttribList &attribs) :
+ m_attribs(attribs) { m_parent = parent; }
+ Kind kind() const { return Kind_HtmlDescList; }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ void accept(DocVisitor *v) { CompAccept<DocHtmlDescList>::accept(this,v); }
+ int parse();
+
+ private:
+ HtmlAttribList m_attribs;
+};
+
+/*! @brief Node representing a normal section */
+class DocSection : public CompAccept<DocSection>, public DocNode
+{
+ public:
+ DocSection(DocNode *parent,int level,const QCString &id) :
+ m_level(level), m_id(id) { m_parent = parent; }
+ Kind kind() const { return Kind_Section; }
+ int level() const { return m_level; }
+ QCString title() const { return m_title; }
+ QCString anchor() const { return m_anchor; }
+ QCString id() const { return m_id; }
+ QCString file() const { return m_file; }
+ void accept(DocVisitor *v) { CompAccept<DocSection>::accept(this,v); }
+ int parse();
+
+ private:
+ int m_level;
+ QCString m_id;
+ QCString m_title;
+ QCString m_anchor;
+ QCString m_file;
+};
+
+/*! @brief Node representing a reference to a section */
+class DocSecRefItem : public CompAccept<DocSecRefItem>, public DocNode
+{
+ public:
+ DocSecRefItem(DocNode *parent,const QCString &target) :
+ m_target(target) { m_parent = parent; }
+ Kind kind() const { return Kind_SecRefItem; }
+ QCString target() const { return m_target; }
+ QCString file() const { return m_file; }
+ QCString anchor() const { return m_anchor; }
+ void accept(DocVisitor *v) { CompAccept<DocSecRefItem>::accept(this,v); }
+ void parse();
+ const QList<DocNode> &children() const { return m_children; }
+
+ private:
+ QCString m_target;
+ QCString m_file;
+ QCString m_anchor;
+};
+
+/*! @brief Node representing a list of section references */
+class DocSecRefList : public CompAccept<DocSecRefList>, public DocNode
+{
+ public:
+ DocSecRefList(DocNode *parent) { m_parent = parent; }
+ void parse();
+ Kind kind() const { return Kind_SecRefList; }
+ void accept(DocVisitor *v) { CompAccept<DocSecRefList>::accept(this,v); }
+
+ private:
+};
+
+/*! @brief Node representing an internal section of documentation */
+class DocInternal : public CompAccept<DocInternal>, public DocNode
+{
+ public:
+ DocInternal(DocNode *parent) { m_parent = parent; }
+ int parse(int);
+ Kind kind() const { return Kind_Internal; }
+ void accept(DocVisitor *v) { CompAccept<DocInternal>::accept(this,v); }
+
+ private:
+};
+
+/*! @brief Node representing a simple list */
+class DocSimpleList : public CompAccept<DocSimpleList>, public DocNode
+{
+ public:
+ DocSimpleList(DocNode *parent) { m_parent = parent; }
+ Kind kind() const { return Kind_SimpleList; }
+ void accept(DocVisitor *v) { CompAccept<DocSimpleList>::accept(this,v); }
+ int parse();
+
+ private:
+};
+
+/*! @brief Node representing a Html list */
+class DocHtmlList : public CompAccept<DocHtmlList>, public DocNode
+{
+ public:
+ enum Type { Unordered, Ordered };
+ DocHtmlList(DocNode *parent,const HtmlAttribList &attribs,Type t) :
+ m_type(t), m_attribs(attribs) { m_parent = parent; }
+ Kind kind() const { return Kind_HtmlList; }
+ Type type() const { return m_type; }
+ void accept(DocVisitor *v) { CompAccept<DocHtmlList>::accept(this,v); }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ int parse();
+ int parseXml();
+
+ private:
+ Type m_type;
+ HtmlAttribList m_attribs;
+};
+
+/*! Node representing a simple section */
+class DocSimpleSect : public CompAccept<DocSimpleSect>, public DocNode
+{
+ public:
+ enum Type
+ {
+ Unknown, See, Return, Author, Authors, Version, Since, Date,
+ Note, Warning, Pre, Post, Invar, Remark, Attention, User, Rcs
+ };
+ DocSimpleSect(DocNode *parent,Type t);
+ virtual ~DocSimpleSect();
+ Kind kind() const { return Kind_SimpleSect; }
+ Type type() const { return m_type; }
+ QCString typeString() const;
+ void accept(DocVisitor *v);
+ int parse(bool userTitle,bool needsSeparator);
+ int parseRcs();
+ int parseXml();
+ void appendLinkWord(const QCString &word);
+ const QList<DocNode> &children() const { return m_children; }
+
+ private:
+ Type m_type;
+ DocTitle * m_title;
+};
+
+/*! Node representing a separator between two simple sections of the
+ * same type.
+ */
+class DocSimpleSectSep : public DocNode
+{
+ public:
+ DocSimpleSectSep(DocNode *parent) { m_parent = parent; }
+ Kind kind() const { return Kind_SimpleSectSep; }
+ void accept(DocVisitor *v) { v->visit(this); }
+
+ private:
+};
+
+/*! Node representing a parameter section */
+class DocParamSect : public CompAccept<DocParamSect>, public DocNode
+{
+ friend class DocParamList;
+ public:
+ enum Type
+ {
+ Unknown, Param, RetVal, Exception, TemplateParam
+ };
+ enum Direction
+ {
+ In=1, Out=2, InOut=3, Unspecified=0
+ };
+ DocParamSect(DocNode *parent,Type t)
+ : m_type(t), m_dir(Unspecified),
+ m_hasInOutSpecifier(FALSE), m_hasTypeSpecifier(FALSE)
+ { m_parent = parent; }
+ int parse(const QCString &cmdName,bool xmlContext,Direction d);
+ Kind kind() const { return Kind_ParamSect; }
+ Type type() const { return m_type; }
+ void accept(DocVisitor *v) { CompAccept<DocParamSect>::accept(this,v); }
+ bool hasInOutSpecifier() const { return m_hasInOutSpecifier; }
+ bool hasTypeSpecifier() const { return m_hasTypeSpecifier; }
+
+ private:
+ Type m_type;
+ Direction m_dir;
+ bool m_hasInOutSpecifier;
+ bool m_hasTypeSpecifier;
+};
+
+/*! Node representing a paragraph in the documentation tree */
+class DocPara : public CompAccept<DocPara>, public DocNode
+{
+ public:
+ DocPara(DocNode *parent) :
+ m_isFirst(FALSE), m_isLast(FALSE) { m_parent = parent; }
+ int parse();
+ Kind kind() const { return Kind_Para; }
+ bool isEmpty() const { return m_children.isEmpty(); }
+ void accept(DocVisitor *v) { CompAccept<DocPara>::accept(this,v); }
+ void markFirst(bool v=TRUE) { m_isFirst=v; }
+ void markLast(bool v=TRUE) { m_isLast=v; }
+ bool isFirst() const { return m_isFirst; }
+ bool isLast() const { return m_isLast; }
+ const QList<DocNode> &children() const { return m_children; }
+ QList<DocNode> &children() { return m_children; }
+
+ int handleCommand(const QCString &cmdName);
+ int handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &tagHtmlAttribs);
+ int handleHtmlEndTag(const QCString &tagName);
+ int handleSimpleSection(DocSimpleSect::Type t,bool xmlContext=FALSE);
+ int handleXRefItem();
+ int handleParamSection(const QCString &cmdName,DocParamSect::Type t,
+ bool xmlContext,
+ int direction);
+ void handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type t);
+ void handleImage(const QCString &cmdName);
+ void handleDotFile(const QCString &cmdName);
+ void handleMscFile(const QCString &cmdName);
+ void handleInclude(const QCString &cmdName,DocInclude::Type t);
+ void handleLink(const QCString &cmdName,bool isJavaLink);
+ void handleRef(const QCString &cmdName);
+ void handleSection(const QCString &cmdName);
+ void handleInheritDoc();
+ int handleStartCode();
+ int handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level);
+ bool injectToken(int tok,const QCString &tokText);
+
+ private:
+ QCString m_sectionId;
+ bool m_isFirst;
+ bool m_isLast;
+};
+
+/*! @brief Node representing a parameter list. */
+class DocParamList : public DocNode
+{
+ public:
+ DocParamList(DocNode *parent,DocParamSect::Type t,DocParamSect::Direction d)
+ : m_type(t), m_dir(d), m_isFirst(TRUE), m_isLast(TRUE)
+ { m_paragraphs.setAutoDelete(TRUE);
+ m_params.setAutoDelete(TRUE);
+ m_paramTypes.setAutoDelete(TRUE);
+ m_parent = parent;
+ }
+ virtual ~DocParamList() { }
+ Kind kind() const { return Kind_ParamList; }
+ const QList<DocNode> &parameters() { return m_params; }
+ const QList<DocNode> &paramTypes() { return m_paramTypes; }
+ DocParamSect::Type type() const { return m_type; }
+ DocParamSect::Direction direction() const { return m_dir; }
+ void markFirst(bool b=TRUE) { m_isFirst=b; }
+ void markLast(bool b=TRUE) { m_isLast=b; }
+ bool isFirst() const { return m_isFirst; }
+ bool isLast() const { return m_isLast; }
+ void accept(DocVisitor *v)
+ {
+ v->visitPre(this);
+ QListIterator<DocPara> cli(m_paragraphs);
+ DocNode *n;
+ for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
+ v->visitPost(this);
+ }
+ int parse(const QCString &cmdName);
+ int parseXml(const QCString &paramName);
+
+ private:
+ QList<DocPara> m_paragraphs;
+ QList<DocNode> m_params;
+ QList<DocNode> m_paramTypes;
+ DocParamSect::Type m_type;
+ DocParamSect::Direction m_dir;
+ bool m_isFirst;
+ bool m_isLast;
+};
+
+/*! @brief Node representing an item of a auto list */
+class DocAutoListItem : public DocNode
+{
+ public:
+ DocAutoListItem(DocNode *parent,int num) : m_itemNum(num)
+ { m_paragraph=new DocPara(this); m_parent = parent; }
+ virtual ~DocAutoListItem() { delete m_paragraph; }
+ Kind kind() const { return Kind_AutoListItem; }
+ int itemNumber() const { return m_itemNum; }
+ void accept(DocVisitor *v)
+ {
+ v->visitPre(this);
+ m_paragraph->accept(v);
+ v->visitPost(this);
+ }
+ int parse();
+
+ private:
+ DocPara *m_paragraph;
+ int m_itemNum;
+};
+
+/*! @brief Node representing a simple list item */
+class DocSimpleListItem : public DocNode
+{
+ public:
+ DocSimpleListItem(DocNode *parent)
+ { m_paragraph=new DocPara(this); m_parent = parent; }
+ int parse();
+ virtual ~DocSimpleListItem() { delete m_paragraph; }
+ Kind kind() const { return Kind_SimpleListItem; }
+ void accept(DocVisitor *v)
+ {
+ v->visitPre(this);
+ m_paragraph->accept(v);
+ v->visitPost(this);
+ }
+
+ private:
+ DocPara *m_paragraph;
+};
+
+/*! @brief Node representing a HTML list item */
+class DocHtmlListItem : public CompAccept<DocHtmlListItem>, public DocNode
+{
+ public:
+ DocHtmlListItem(DocNode *parent,const HtmlAttribList &attribs,int num) :
+ m_attribs(attribs), m_itemNum(num) { m_parent = parent; }
+ Kind kind() const { return Kind_HtmlListItem; }
+ int itemNumber() const { return m_itemNum; }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ void accept(DocVisitor *v) { CompAccept<DocHtmlListItem>::accept(this,v); }
+ int parse();
+ int parseXml();
+ const QList<DocNode> &children() const { return m_children; }
+
+ private:
+ HtmlAttribList m_attribs;
+ int m_itemNum;
+};
+
+/*! @brief Node representing a HTML description data */
+class DocHtmlDescData : public CompAccept<DocHtmlDescData>, public DocNode
+{
+ public:
+ DocHtmlDescData(DocNode *parent) { m_parent = parent; }
+ Kind kind() const { return Kind_HtmlDescData; }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ void accept(DocVisitor *v) { CompAccept<DocHtmlDescData>::accept(this,v); }
+ int parse();
+ const QList<DocNode> &children() const { return m_children; }
+
+ private:
+ HtmlAttribList m_attribs;
+};
+
+/*! @brief Node representing a HTML table cell */
+class DocHtmlCell : public CompAccept<DocHtmlCell>, public DocNode
+{
+ public:
+ DocHtmlCell(DocNode *parent,const HtmlAttribList &attribs,bool isHeading) :
+ m_isHeading(isHeading),
+ m_isFirst(FALSE), m_isLast(FALSE), m_attribs(attribs) { m_parent = parent; }
+ bool isHeading() const { return m_isHeading; }
+ bool isFirst() const { return m_isFirst; }
+ bool isLast() const { return m_isLast; }
+ Kind kind() const { return Kind_HtmlCell; }
+ void accept(DocVisitor *v) { CompAccept<DocHtmlCell>::accept(this,v); }
+ void markFirst(bool v=TRUE) { m_isFirst=v; }
+ void markLast(bool v=TRUE) { m_isLast=v; }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ const QList<DocNode> &children() const { return m_children; }
+ int parse();
+ int parseXml();
+
+ private:
+ bool m_isHeading;
+ bool m_isFirst;
+ bool m_isLast;
+ HtmlAttribList m_attribs;
+};
+
+/*! @brief Node representing a HTML table caption */
+class DocHtmlCaption : public CompAccept<DocHtmlCaption>, public DocNode
+{
+ public:
+ DocHtmlCaption(DocNode *parent,const HtmlAttribList &attribs) :
+ m_attribs(attribs) { m_parent = parent; }
+ Kind kind() const { return Kind_HtmlCaption; }
+ void accept(DocVisitor *v) { CompAccept<DocHtmlCaption>::accept(this,v); }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ int parse();
+
+ private:
+ HtmlAttribList m_attribs;
+ bool m_atTop;
+};
+
+/*! @brief Node representing a HTML table row */
+class DocHtmlRow : public CompAccept<DocHtmlRow>, public DocNode
+{
+ public:
+ DocHtmlRow(DocNode *parent,const HtmlAttribList &attribs) :
+ m_attribs(attribs) { m_parent = parent; }
+ Kind kind() const { return Kind_HtmlRow; }
+ uint numCells() const { return m_children.count(); }
+ void accept(DocVisitor *v) { CompAccept<DocHtmlRow>::accept(this,v); }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ int parse();
+ int parseXml(bool header);
+
+ private:
+ HtmlAttribList m_attribs;
+};
+
+/*! @brief Node representing a HTML table */
+class DocHtmlTable : public CompAccept<DocHtmlTable>, public DocNode
+{
+ public:
+ DocHtmlTable(DocNode *parent,const HtmlAttribList &attribs)
+ : m_attribs(attribs) { m_caption=0; m_parent = parent; }
+ ~DocHtmlTable() { delete m_caption; }
+ Kind kind() const { return Kind_HtmlTable; }
+ uint numRows() const { return m_children.count(); }
+ bool hasCaption() { return m_caption!=0; }
+ const HtmlAttribList &attribs() const { return m_attribs; }
+ int parse();
+ int parseXml();
+ uint numCols() const;
+ void accept(DocVisitor *v);
+
+ private:
+ DocHtmlCaption *m_caption;
+ HtmlAttribList m_attribs;
+};
+
+/*! @brief Root node of a text fragment */
+class DocText : public CompAccept<DocText>, public DocNode
+{
+ public:
+ DocText() {}
+ Kind kind() const { return Kind_Text; }
+ void accept(DocVisitor *v) { CompAccept<DocText>::accept(this,v); }
+ void parse();
+};
+
+/*! @brief Root node of documentation tree */
+class DocRoot : public CompAccept<DocRoot>, public DocNode
+{
+ public:
+ DocRoot(bool indent,bool sl) : m_indent(indent), m_singleLine(sl) {}
+ Kind kind() const { return Kind_Root; }
+ void accept(DocVisitor *v) { CompAccept<DocRoot>::accept(this,v); }
+ void parse();
+ bool indent() const { return m_indent; }
+ bool singleLine() const { return m_singleLine; }
+
+ private:
+ bool m_indent;
+ bool m_singleLine;
+};
+
+
+#endif
diff --git a/src/docsets.cpp b/src/docsets.cpp
new file mode 100644
index 0000000..1c0b55d
--- /dev/null
+++ b/src/docsets.cpp
@@ -0,0 +1,471 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "docsets.h"
+#include "config.h"
+#include "message.h"
+#include "doxygen.h"
+#include <qfile.h>
+
+
+DocSets::DocSets() : m_nodes(17), m_scopes(17)
+{
+ m_nf = 0;
+ m_tf = 0;
+ m_dc = 0;
+ m_id = 0;
+ m_nodes.setAutoDelete(TRUE);
+}
+
+DocSets::~DocSets()
+{
+ delete m_nf;
+ delete m_tf;
+}
+
+void DocSets::initialize()
+{
+ // -- get config options
+ QCString projectName = Config_getString("PROJECT_NAME");
+ if (projectName.isEmpty()) projectName="root";
+ QCString bundleId = Config_getString("DOCSET_BUNDLE_ID");
+ if (bundleId.isEmpty()) bundleId="org.doxygen.Project";
+ QCString feedName = Config_getString("DOCSET_FEEDNAME");
+ if (feedName.isEmpty()) feedName="FeedName";
+ QCString publisherId = Config_getString("DOCSET_PUBLISHER_ID");
+ if (publisherId.isEmpty()) publisherId="PublisherId";
+ QCString publisherName = Config_getString("DOCSET_PUBLISHER_NAME");
+ if (publisherName.isEmpty()) publisherName="PublisherName";
+
+ // -- write Makefile
+ {
+ QCString mfName = Config_getString("HTML_OUTPUT") + "/Makefile";
+ QFile makefile(mfName);
+ if (!makefile.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",mfName.data());
+ exit(1);
+ }
+ FTextStream ts(&makefile);
+
+ ts << "DOCSET_NAME=" << bundleId << ".docset\n"
+ "DOCSET_CONTENTS=$(DOCSET_NAME)/Contents\n"
+ "DOCSET_RESOURCES=$(DOCSET_CONTENTS)/Resources\n"
+ "DOCSET_DOCUMENTS=$(DOCSET_RESOURCES)/Documents\n"
+ "DESTDIR=~/Library/Developer/Shared/Documentation/DocSets\n"
+ "XCODE_INSTALL=$(shell xcode-select -print-path)\n"
+ "\n"
+ "all: docset\n"
+ "\n"
+ "docset:\n"
+ "\tmkdir -p $(DOCSET_DOCUMENTS)\n"
+ "\tcp Nodes.xml $(DOCSET_RESOURCES)\n"
+ "\tcp Tokens.xml $(DOCSET_RESOURCES)\n"
+ "\tcp Info.plist $(DOCSET_CONTENTS)\n"
+ "\ttar --exclude $(DOCSET_NAME) \\\n"
+ "\t --exclude Nodes.xml \\\n"
+ "\t --exclude Tokens.xml \\\n"
+ "\t --exclude Info.plist \\\n"
+ "\t --exclude Makefile -c -f - . \\\n"
+ "\t | (cd $(DOCSET_DOCUMENTS); tar xvf -)\n"
+ "\t$(XCODE_INSTALL)/usr/bin/docsetutil index $(DOCSET_NAME)\n"
+ "\trm -f $(DOCSET_DOCUMENTS)/Nodes.xml\n"
+ "\trm -f $(DOCSET_DOCUMENTS)/Info.plist\n"
+ "\trm -f $(DOCSET_DOCUMENTS)/Makefile\n"
+ "\trm -f $(DOCSET_RESOURCES)/Nodes.xml\n"
+ "\trm -f $(DOCSET_RESOURCES)/Tokens.xml\n"
+ "\n"
+ "install: docset\n"
+ "\tmkdir -p $(DESTDIR)\n"
+ "\tcp -R $(DOCSET_NAME) $(DESTDIR)\n"
+ "\n"
+ "uninstall:\n"
+ "\trm -rf $(DESTDIR)/$(DOCSET_NAME)\n"
+ "\n"
+ "always:\n";
+ }
+
+ // -- write Info.plist
+ {
+ QCString plName = Config_getString("HTML_OUTPUT") + "/Info.plist";
+ QFile plist(plName);
+ if (!plist.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",plName.data());
+ exit(1);
+ }
+ FTextStream ts(&plist);
+
+ ts << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\"\n"
+ "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
+ "<plist version=\"1.0\">\n"
+ "<dict>\n"
+ " <key>CFBundleName</key>\n"
+ " <string>" << projectName << "</string>\n"
+ " <key>CFBundleIdentifier</key>\n"
+ " <string>" << bundleId << ".docset</string>\n"
+ " <key>DocSetFeedName</key>\n"
+ " <string>" << feedName << "</string>\n"
+ " <key>DocSetPublisherIdentifier</key>\n"
+ " <string>" << publisherId << "</string>\n"
+ " <key>DocSetPublisherName</key>\n"
+ " <string>" << publisherName << "</string>\n"
+ "</dict>\n"
+ "</plist>\n";
+ }
+
+ // -- start Nodes.xml
+ QCString notes = Config_getString("HTML_OUTPUT") + "/Nodes.xml";
+ m_nf = new QFile(notes);
+ if (!m_nf->open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",notes.data());
+ exit(1);
+ }
+ QCString indexName=Config_getBool("GENERATE_TREEVIEW")?"main":"index";
+ m_nts.setDevice(m_nf);
+ m_nts << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
+ m_nts << "<DocSetNodes version=\"1.0\">" << endl;
+ m_nts << " <TOC>" << endl;
+ m_nts << " <Node>" << endl;
+ m_nts << " <Name>Root</Name>" << endl;
+ m_nts << " <Path>" << indexName << Doxygen::htmlFileExtension << "</Path>" << endl;
+ m_nts << " <Subnodes>" << endl;
+ m_dc = 1;
+ m_firstNode.resize(m_dc);
+ m_firstNode.at(0)=TRUE;
+
+ QCString tokens = Config_getString("HTML_OUTPUT") + "/Tokens.xml";
+ m_tf = new QFile(tokens);
+ if (!m_tf->open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",tokens.data());
+ exit(1);
+ }
+ m_tts.setDevice(m_tf);
+ m_tts << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
+ m_tts << "<Tokens version=\"1.0\">" << endl;
+}
+
+void DocSets::finalize()
+{
+ m_nts << indent() << " </Node>" << endl;
+ m_dc--;
+ m_nts << " </Subnodes>" << endl;
+ m_nts << " </Node>" << endl;
+ m_nts << " </TOC>" << endl;
+ m_nts << "</DocSetNodes>" << endl;
+ m_nf->close();
+ delete m_nf;
+ m_nf=0;
+
+ m_tts << "</Tokens>" << endl;
+ m_tf->close();
+ delete m_tf;
+ m_tf=0;
+}
+
+QCString DocSets::indent()
+{
+ QCString result;
+ result.fill(' ',(m_dc+2)*2);
+ return result;
+}
+
+void DocSets::incContentsDepth()
+{
+ ++m_dc;
+ m_nts << indent() << "<Subnodes>" << endl;
+ m_firstNode.resize(m_dc);
+ if (m_dc>0)
+ {
+ m_firstNode.at(m_dc-1)=TRUE;
+ }
+}
+
+void DocSets::decContentsDepth()
+{
+ if (!m_firstNode.at(m_dc-1))
+ {
+ m_nts << indent() << " </Node>" << endl;
+ }
+ m_nts << indent() << "</Subnodes>" << endl;
+ --m_dc;
+}
+
+void DocSets::addContentsItem(bool isDir,
+ const char *name,
+ const char *ref,
+ const char *file,
+ const char *anchor)
+{
+ (void)isDir;
+ if (file && ref==0)
+ {
+ if (!m_firstNode.at(m_dc-1))
+ {
+ m_nts << indent() << " </Node>" << endl;
+ }
+ m_firstNode.at(m_dc-1)=FALSE;
+ m_nts << indent() << " <Node>" << endl;
+ m_nts << indent() << " <Name>" << convertToXML(name) << "</Name>" << endl;
+ m_nts << indent() << " <Path>" << file << Doxygen::htmlFileExtension << "</Path>" << endl;
+ if (anchor)
+ {
+ m_nts << indent() << " <Anchor>" << anchor << "</Anchor>" << endl;
+ }
+ }
+}
+
+void DocSets::addIndexItem(Definition *context,MemberDef *md,const char *)
+{
+ if (md==0 && context==0) return;
+
+ FileDef *fd = 0;
+ ClassDef *cd = 0;
+ NamespaceDef *nd = 0;
+
+ if (md)
+ {
+ fd = md->getFileDef();
+ cd = md->getClassDef();
+ nd = md->getNamespaceDef();
+ if (!md->isLinkable()) return; // internal symbol
+ }
+
+ QCString scope;
+ QCString type;
+ QCString decl;
+
+ // determine language
+ QCString lang;
+ SrcLangExt langExt = SrcLangExt_Cpp;
+ if (fd) langExt = getLanguageFromFileName(fd->name());
+ switch (langExt)
+ {
+ case SrcLangExt_Cpp:
+ case SrcLangExt_ObjC:
+ {
+ if (md && (md->isObjCMethod() || md->isObjCProperty()))
+ lang="occ"; // Objective C/C++
+ else if (fd && fd->name().right(2).lower()==".c")
+ lang="c"; // Plain C
+ else if (cd==0 && nd==0)
+ lang="c"; // Plain C symbol outside any class or namespace
+ else
+ lang="cpp"; // C++
+ }
+ break;
+ case SrcLangExt_IDL: lang="idl"; break; // IDL
+ case SrcLangExt_CSharp: lang="csharp"; break; // C#
+ case SrcLangExt_PHP: lang="php"; break; // PHP4/5
+ case SrcLangExt_D: lang="d"; break; // D
+ case SrcLangExt_Java: lang="java"; break; // Java
+ case SrcLangExt_JS: lang="javascript"; break; // Javascript
+ case SrcLangExt_Python: lang="python"; break; // Python
+ case SrcLangExt_F90: lang="fortran"; break; // Fortran
+ case SrcLangExt_VHDL: lang="vhdl"; break; // VHDL
+ case SrcLangExt_XML: lang="xml"; break; // DBUS XML
+ case SrcLangExt_Unknown: lang="unknown"; break; // should not happen!
+ }
+
+ if (md)
+ {
+ if (context==0)
+ {
+ if (md->getGroupDef())
+ context = md->getGroupDef();
+ else if (md->getFileDef())
+ context = md->getFileDef();
+ }
+ if (context==0) return; // should not happen
+
+ switch (md->memberType())
+ {
+ case MemberDef::Define:
+ type="macro"; break;
+ case MemberDef::Function:
+ if (cd && (cd->compoundType()==ClassDef::Interface ||
+ cd->compoundType()==ClassDef::Class))
+ {
+ if (md->isStatic())
+ type="clm"; // class member
+ else
+ type="instm"; // instance member
+ }
+ else if (cd && cd->compoundType()==ClassDef::Protocol)
+ {
+ if (md->isStatic())
+ type="intfcm"; // interface class member
+ else
+ type="intfm"; // interface member
+ }
+ else
+ type="func";
+ break;
+ case MemberDef::Variable:
+ type="data"; break;
+ case MemberDef::Typedef:
+ type="tdef"; break;
+ case MemberDef::Enumeration:
+ type="enum"; break;
+ case MemberDef::EnumValue:
+ type="econst"; break;
+ //case MemberDef::Prototype:
+ // type="prototype"; break;
+ case MemberDef::Signal:
+ type="signal"; break;
+ case MemberDef::Slot:
+ type="slot"; break;
+ case MemberDef::Friend:
+ type="ffunc"; break;
+ case MemberDef::DCOP:
+ type="dcop"; break;
+ case MemberDef::Property:
+ if (cd && cd->compoundType()==ClassDef::Protocol)
+ type="intfp"; // interface property
+ else
+ type="instp"; // instance property
+ break;
+ case MemberDef::Event:
+ type="event"; break;
+ }
+ cd = md->getClassDef();
+ nd = md->getNamespaceDef();
+ if (cd)
+ {
+ scope = cd->qualifiedName();
+ }
+ else if (nd)
+ {
+ scope = nd->name();
+ }
+ writeToken(m_tts,md,type,lang,scope,md->anchor());
+ }
+ else if (context && context->isLinkable())
+ {
+ if (fd==0 && context->definitionType()==Definition::TypeFile)
+ {
+ fd = (FileDef*)context;
+ }
+ if (cd==0 && context->definitionType()==Definition::TypeClass)
+ {
+ cd = (ClassDef*)context;
+ }
+ if (nd==0 && context->definitionType()==Definition::TypeNamespace)
+ {
+ nd = (NamespaceDef*)context;
+ }
+ if (fd)
+ {
+ type="file";
+ }
+ else if (cd)
+ {
+ scope = cd->qualifiedName();
+ if (cd->isTemplate())
+ {
+ type="tmplt";
+ }
+ else if (cd->compoundType()==ClassDef::Protocol)
+ {
+ type="intf";
+ if (scope.right(2)=="-p") scope=scope.left(scope.length()-2);
+ }
+ else if (cd->compoundType()==ClassDef::Interface)
+ {
+ type="cl";
+ }
+ else if (cd->compoundType()==ClassDef::Category)
+ {
+ type="cat";
+ }
+ else
+ {
+ type = "cl";
+ }
+ IncludeInfo *ii = cd->includeInfo();
+ if (ii)
+ {
+ decl=ii->includeName;
+ if (decl.isEmpty())
+ {
+ decl=ii->local;
+ }
+ }
+ }
+ else if (nd)
+ {
+ scope = nd->name();
+ type = "ns";
+ }
+ if (m_scopes.find(context->getOutputFileBase())==0)
+ {
+ writeToken(m_tts,context,type,lang,scope,0,decl);
+ m_scopes.append(context->getOutputFileBase(),(void*)0x8);
+ }
+ }
+}
+
+void DocSets::writeToken(FTextStream &t,
+ const Definition *d,
+ const QCString &type,
+ const QCString &lang,
+ const char *scope,
+ const char *anchor,
+ const char *decl)
+{
+ t << " <Token>" << endl;
+ t << " <TokenIdentifier>" << endl;
+ QString name = d->name();
+ if (name.right(2)=="-p") name=name.left(name.length()-2);
+ t << " <Name>" << convertToXML(name) << "</Name>" << endl;
+ if (!lang.isEmpty())
+ {
+ t << " <APILanguage>" << lang << "</APILanguage>" << endl;
+ }
+ if (!type.isEmpty())
+ {
+ t << " <Type>" << type << "</Type>" << endl;
+ }
+ if (scope)
+ {
+ t << " <Scope>" << convertToXML(scope) << "</Scope>" << endl;
+ }
+ t << " </TokenIdentifier>" << endl;
+ t << " <Path>" << d->getOutputFileBase()
+ << Doxygen::htmlFileExtension << "</Path>" << endl;
+ if (anchor)
+ {
+ t << " <Anchor>" << anchor << "</Anchor>" << endl;
+ }
+ QCString tooltip = d->briefDescriptionAsTooltip();
+ if (!tooltip.isEmpty())
+ {
+ t << " <Abstract>" << convertToXML(tooltip) << "</Abstract>" << endl;
+ }
+ if (decl)
+ {
+ t << " <DeclaredIn>" << convertToXML(decl) << "</DeclaredIn>" << endl;
+ }
+ t << " </Token>" << endl;
+}
+
+void DocSets::addIndexFile(const char *name)
+{
+ (void)name;
+}
+
diff --git a/src/docsets.h b/src/docsets.h
new file mode 100644
index 0000000..0b6e9af
--- /dev/null
+++ b/src/docsets.h
@@ -0,0 +1,83 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DOCSETS_H
+#define DOCSETS_H
+
+#include "qtbc.h"
+#include <qstrlist.h>
+#include "sortdict.h"
+#include "ftextstream.h"
+#include "index.h"
+
+class QFile;
+class Definition;
+
+/*! A class that generates docset files.
+ * These files can be used to create context help
+ * for use within Apple's Xcode 3.0 development environment
+ */
+class DocSets : public IndexIntf
+{
+
+ public:
+ DocSets();
+ ~DocSets();
+ void initialize();
+ void finalize();
+ void incContentsDepth();
+ void decContentsDepth();
+ void addContentsItem(bool isDir,
+ const char *name,
+ const char *ref = 0,
+ const char *file = 0,
+ const char *anchor = 0
+ );
+ void addIndexItem(Definition *context,MemberDef *md,const char *title);
+ void addIndexFile(const char *name);
+ void addImageFile(const char *) {}
+ void addStyleSheetFile(const char *) {}
+
+ private:
+ void writeToken(FTextStream &t, const Definition *d,
+ const QCString &type, const QCString &lang,
+ const char *scope=0, const char *anchor=0,
+ const char *decl=0);
+ struct NodeDef
+ {
+ NodeDef(bool d,const QCString &n,const QCString &r,
+ const QCString &f,const QCString &a,int i) :
+ isDir(d), name(n), ref(r), file(f), anchor(a),id(i) {}
+ bool isDir;
+ QCString name;
+ QCString ref;
+ QCString file;
+ QCString anchor;
+ int id;
+ };
+ QCString indent();
+ QFile *m_nf;
+ QFile *m_tf;
+ FTextStream m_nts;
+ FTextStream m_tts;
+ int m_dc;
+ int m_id;
+ QArray<bool> m_firstNode;
+ SDict<NodeDef> m_nodes;
+ SDict<void> m_scopes;
+};
+
+#endif /* DOCSETS_H */
+
diff --git a/src/doctokenizer.cpp b/src/doctokenizer.cpp
new file mode 100644
index 0000000..d45d269
--- /dev/null
+++ b/src/doctokenizer.cpp
@@ -0,0 +1,12645 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer doctokenizerYY_create_buffer
+#define yy_delete_buffer doctokenizerYY_delete_buffer
+#define yy_flex_debug doctokenizerYY_flex_debug
+#define yy_init_buffer doctokenizerYY_init_buffer
+#define yy_flush_buffer doctokenizerYY_flush_buffer
+#define yy_load_buffer_state doctokenizerYY_load_buffer_state
+#define yy_switch_to_buffer doctokenizerYY_switch_to_buffer
+#define yyin doctokenizerYYin
+#define yyleng doctokenizerYYleng
+#define yylex doctokenizerYYlex
+#define yylineno doctokenizerYYlineno
+#define yyout doctokenizerYYout
+#define yyrestart doctokenizerYYrestart
+#define yytext doctokenizerYYtext
+#define yywrap doctokenizerYYwrap
+#define yyalloc doctokenizerYYalloc
+#define yyrealloc doctokenizerYYrealloc
+#define yyfree doctokenizerYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE doctokenizerYYrestart(doctokenizerYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t doctokenizerYYleng;
+
+extern FILE *doctokenizerYYin, *doctokenizerYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+ * access to the local variable yy_act. Since yyless() is a macro, it would break
+ * existing scanners that call yyless() from OUTSIDE doctokenizerYYlex.
+ * One obvious solution it to make yy_act a global. I tried that, and saw
+ * a 5% performance hit in a non-doctokenizerYYlineno scanner, because yy_act is
+ * normally declared as a register variable-- so it is not worth it.
+ */
+ #define YY_LESS_LINENO(n) \
+ do { \
+ int yyl;\
+ for ( yyl = n; yyl < doctokenizerYYleng; ++yyl )\
+ if ( doctokenizerYYtext[yyl] == '\n' )\
+ --doctokenizerYYlineno;\
+ }while(0)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up doctokenizerYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via doctokenizerYYrestart()), so that the user can continue scanning by
+ * just pointing doctokenizerYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when doctokenizerYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t doctokenizerYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow doctokenizerYYwrap()'s to do buffer switches
+ * instead of setting up a fresh doctokenizerYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void doctokenizerYYrestart (FILE *input_file );
+void doctokenizerYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE doctokenizerYY_create_buffer (FILE *file,int size );
+void doctokenizerYY_delete_buffer (YY_BUFFER_STATE b );
+void doctokenizerYY_flush_buffer (YY_BUFFER_STATE b );
+void doctokenizerYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void doctokenizerYYpop_buffer_state (void );
+
+static void doctokenizerYYensure_buffer_stack (void );
+static void doctokenizerYY_load_buffer_state (void );
+static void doctokenizerYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER doctokenizerYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE doctokenizerYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE doctokenizerYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE doctokenizerYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *doctokenizerYYalloc (yy_size_t );
+void *doctokenizerYYrealloc (void *,yy_size_t );
+void doctokenizerYYfree (void * );
+
+#define yy_new_buffer doctokenizerYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ doctokenizerYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ doctokenizerYY_create_buffer(doctokenizerYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ doctokenizerYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ doctokenizerYY_create_buffer(doctokenizerYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define doctokenizerYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *doctokenizerYYin = (FILE *) 0, *doctokenizerYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int doctokenizerYYlineno;
+
+int doctokenizerYYlineno = 1;
+
+extern char *doctokenizerYYtext;
+#define yytext_ptr doctokenizerYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up doctokenizerYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ doctokenizerYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 154
+#define YY_END_OF_BUFFER 155
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[1686] =
+ { 0,
+ 114, 114, 155, 153, 154, 151, 154, 152, 153, 154,
+ 27, 153, 154, 30, 153, 154, 31, 151, 154, 1,
+ 30, 153, 154, 152, 153, 154, 152, 153, 154, 152,
+ 153, 154, 152, 153, 154, 152, 153, 154, 27, 153,
+ 154, 28, 153, 154, 27, 153, 154, 27, 153, 154,
+ 28, 153, 154, 28, 153, 154, 152, 153, 154, 152,
+ 153, 154, 22, 27, 153, 154,16404, 152, 153, 154,
+ 22, 27, 153, 154,16404, 22, 27, 153, 154,16404,
+ 22, 27, 153, 154,16404, 22, 27, 153, 154,16404,
+ 27, 153, 154, 27, 153, 154, 27, 152, 153, 154,
+
+ 22, 27, 153, 154,16404, 30, 153, 154, 1, 30,
+ 153, 154, 27, 153, 154, 27, 153, 154, 28, 153,
+ 154, 27, 153, 154, 119, 120, 153, 154, 119, 120,
+ 152, 153, 154, 120, 153, 154, 69, 153, 154, 68,
+ 69, 153, 154, 70, 151, 154, 67, 69, 152, 153,
+ 154, 69, 152, 153, 154, 69, 152, 153, 154, 75,
+ 153, 154, 77, 153, 154, 78, 151, 154, 152, 153,
+ 154, 152, 153, 154, 152, 153, 154, 75, 153, 154,
+ 76, 153, 154, 152, 153, 154, 152, 153, 154, 75,
+ 153, 154, 75, 152, 153, 154, 82, 153, 154, 84,
+
+ 153, 154, 86, 151, 154, 85, 152, 153, 154, 152,
+ 153, 154, 152, 153, 154, 83, 153, 154, 152, 153,
+ 154, 82, 152, 153, 154, 89, 153, 154, 89, 153,
+ 154, 90, 151, 154, 89, 152, 153, 154, 89, 152,
+ 153, 154, 89, 153, 154, 88, 89, 153, 154, 88,
+ 89, 152, 153, 154, 36, 38, 153, 154, 36, 38,
+ 153, 154, 37, 151, 154, 36, 38, 152, 153, 154,
+ 38, 152, 153, 154, 38, 152, 153, 154, 36, 38,
+ 153, 154, 37, 151, 154, 38, 152, 153, 154, 40,
+ 42, 153, 154, 41, 151, 154, 40, 42, 152, 153,
+
+ 154, 42, 152, 153, 154, 42, 152, 153, 154, 44,
+ 46, 153, 154, 45, 151, 154, 44, 46, 152, 153,
+ 154, 46, 152, 153, 154, 46, 152, 153, 154, 48,
+ 50, 153, 154, 49, 151, 154, 48, 50, 152, 153,
+ 154, 50, 152, 153, 154, 52, 54, 153, 154, 53,
+ 151, 154, 52, 54, 152, 153, 154, 54, 152, 153,
+ 154, 56, 58, 153, 154, 57, 151, 154, 56, 58,
+ 152, 153, 154, 58, 152, 153, 154, 60, 62, 153,
+ 154, 61, 151, 154, 60, 62, 152, 153, 154, 62,
+ 152, 153, 154, 64, 66, 153, 154, 65, 151, 154,
+
+ 64, 66, 152, 153, 154, 66, 152, 153, 154, 111,
+ 153, 154, 113, 153, 154, 113, 151, 154, 111, 113,
+ 153, 154, 111, 152, 153, 154, 111, 152, 153, 154,
+ 112, 153, 154, 111, 153, 154, 106, 153, 154, 105,
+ 153, 154, 153, 154, 152, 153, 154, 114, 153, 154,
+ 153, 154, 153, 154, 152, 153, 154, 116, 153, 154,
+ 116, 152, 153, 154, 117, 153, 154, 117, 152, 153,
+ 154, 117, 152, 153, 154, 152, 153, 154, 117, 153,
+ 154, 117, 153, 154, 95, 153, 154, 92, 95, 153,
+ 154, 94, 151, 154, 95, 152, 153, 154, 95, 152,
+
+ 153, 154, 95, 152, 153, 154, 95, 153, 154, 91,
+ 95, 153, 154, 101, 153, 154, 103, 153, 154, 104,
+ 151, 154, 104, 152, 153, 154, 152, 153, 154, 152,
+ 153, 154, 102, 153, 154, 152, 153, 154, 152, 153,
+ 154, 101, 152, 153, 154, 153, 154, 96, 152, 153,
+ 154, 96, 153, 154, 30, 153, 154, 31, 151, 154,
+ 32, 152, 153, 154, 32, 152, 153, 154, 32, 152,
+ 153, 154, 27, 153, 154, 27, 32, 152, 153, 154,
+ 121, 153, 154, 122, 151, 154, 121, 152, 153, 154,
+ 123, 143, 153, 154, 144, 151, 154, 123, 143, 152,
+
+ 153, 154, 123, 143, 152, 153, 154, 143, 152, 153,
+ 154, 143, 152, 153, 154, 150, 153, 154, 150, 152,
+ 153, 154, 145, 150, 153, 154, 147, 150, 153, 154,
+ 148, 150, 153, 154, 149, 151, 154, 148, 150, 152,
+ 153, 154, 140, 141, 153, 154, 140, 142, 151, 154,
+ 140, 141, 152, 153, 154, 141, 153, 154, 141, 153,
+ 154, 141, 152, 153, 154, 27, 30, 31, 31, 33,
+ 27, 22, 22, 22,16404, 27, 27, 27, 27, 11,
+ 10, 10, 10, 10, 22, 27,16404, 22, 22, 27,
+ 16404, 10, 22, 27,16404, 22, 27,16404, 22, 27,
+
+ 16404, 22, 27,16404, 22, 27,16404, 22, 27, 30,
+ 27, 27, 2, 4, 27, 119, 68, 75, 77, 75,
+ 75, 74, 73, 73, 82, 84, 82, 81, 80, 80,
+ 87, 88, 36, 36, 36, 40, 44, 48, 52, 56,
+ 60, 64, 111, 112, 111, 111, 112, 111, 111, 111,
+ 105, 107, 114, 114, 116, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 93, 91, 91, 91, 91, 91, 101, 103, 101,
+ 100, 99, 99, 97, 96, 30, 31, 31, 27, 123,
+ 123, 124, 145, 146, 147, 148, 149, 140, 138, 3,
+
+ 5, 22, 22, 22, 22, 22,16404, 22, 27, 19,
+ 25, 27, 18, 12, 10, 10, 10, 10, 22, 22,
+ 23, 22, 25, 22, 25, 22, 10, 22, 27,16404,
+ 22, 27,16404, 22, 27,16404, 22, 27,16404, 22,
+ 27,16404, 22, 27, 118, 75, 71, 72, 73, 73,
+ 82, 79, 80, 80, 87, 109, 111, 109, 111, 111,
+ 111, 115, 114, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 93, 91, 91, 91, 91, 91, 91, 91,
+
+ 101, 98, 99, 99, 27, 123, 139, 138, 22, 22,
+ 22, 22, 22, 17, 27, 108, 10, 10, 10, 22,
+ 22, 22, 22, 25, 22, 25, 22, 8212, 22, 10,
+ 22, 27,16404, 14, 22, 22, 27,16404, 22, 27,
+ 16404, 22, 27,16404, 22, 75, 73, 82, 80, 110,
+ 110, 111, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 91, 91, 91, 101, 99, 27, 123,
+ 137, 22, 22, 22, 22, 16, 23, 16, 22, 22,
+
+ 22, 27, 25, 10, 10, 10, 22, 22, 22, 22,
+ 22, 25, 22, 25, 22, 25, 8212, 21, 22, 10,
+ 14, 14, 14, 14, 22, 27,16404, 22, 27,16404,
+ 75, 73, 82, 80, 110, 110, 111, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 101, 99, 27,
+ 131, 132, 22, 22, 22, 22, 21, 22, 22, 22,
+ 22, 22, 16, 22, 16, 15, 10, 10, 22, 22,
+ 22, 22, 25, 22, 25, 22, 25, 21, 10, 14,
+ 14, 22, 14, 22, 14, 14, 14, 22, 22, 27,
+
+ 16404, 6, 21, 22, 73, 80, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 99, 27, 136, 22, 22, 22,
+ 22, 16, 22, 22, 22, 22, 22, 21, 9, 10,
+ 22, 21, 22, 22, 22, 25, 22, 25, 10, 14,
+ 14, 14, 22, 14, 22, 14, 22, 14, 14, 22,
+ 22, 27,16404, 73, 80, 35, 59, 63, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 99, 27, 22, 21, 22, 22,
+ 22, 22, 22, 22, 22, 10, 22, 22, 22, 25,
+
+ 22, 25, 8, 10, 14, 14, 22, 14, 22, 14,
+ 23, 14, 22, 14, 22, 22, 27,16404, 73, 80,
+ 34, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 99, 27, 125, 22, 22,
+ 22, 22, 21, 22, 22, 10, 22, 22, 26, 23,
+ 26, 22, 25, 22, 25, 14, 22, 14, 14, 22,
+ 14, 14, 14, 22, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 73, 80, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 91, 99, 126, 135, 22, 22,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+
+ 24, 24, 24, 22, 22, 21, 22, 13, 10, 22,
+ 22, 22, 25, 22, 25, 14, 22, 14, 14, 14,
+ 22, 23, 27, 27, 73, 80, 117, 117, 117, 117,
+ 99, 133, 130, 22, 22, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 23, 24,
+ 24, 24, 24, 26, 23, 26, 16, 26, 22, 22,
+ 22, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 22, 25, 24, 24, 14, 22,
+ 14, 14, 14, 22, 24, 22, 29, 8212, 22, 29,
+ 43, 51, 29, 134, 129, 22, 24, 24, 24, 24,
+
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 22, 22, 22, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 23, 24, 24, 24, 24, 22, 25, 24, 14, 22,
+ 14, 14, 14, 22, 8212, 21, 22, 29, 39, 55,
+ 127, 22, 24, 24, 24, 24, 24, 22, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 14, 22,
+ 14, 14, 14, 22, 7, 47, 22, 24, 16, 24,
+
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 23, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 14, 22, 14, 26, 26, 14, 14, 24, 14,
+ 24, 14, 24, 14, 24, 14, 24, 14, 24, 14,
+ 24, 14, 24, 24, 24, 16, 24, 16, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 14, 22, 14, 14, 14, 14,
+ 23, 24, 128, 24, 24, 24, 23, 24, 24, 24,
+ 24, 24, 24, 24, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 24, 14, 14, 14, 14, 24, 24,
+
+ 24, 24, 24, 24, 14, 23, 14, 14, 14, 14,
+ 14, 14, 24, 24, 24, 24, 24, 24, 24, 24,
+ 14, 24, 14, 14, 14, 14, 14, 14, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 14, 14,
+ 14, 14, 14, 24, 14, 14, 14, 24, 24, 24,
+ 24, 14, 14, 14, 14, 14, 14, 24, 14, 24,
+ 24, 24, 24, 14, 14, 14, 24, 14, 14, 14,
+ 24, 24, 24, 24, 14, 14, 14, 14, 24, 14,
+ 24, 14, 14, 14, 14
+ } ;
+
+static yyconst flex_int16_t yy_accept[2327] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 4, 6, 8,
+ 11, 14, 17, 20, 24, 27, 30, 33, 36, 39,
+ 42, 45, 48, 51, 54, 57, 60, 63, 68, 71,
+ 76, 81, 86, 91, 94, 97, 101, 106, 109, 113,
+
+ 116, 119, 122, 125, 129, 134, 137, 140, 144, 147,
+ 152, 156, 160, 163, 166, 169, 172, 175, 178, 181,
+ 184, 187, 190, 193, 197, 200, 203, 206, 210, 213,
+ 216, 219, 222, 226, 229, 232, 235, 239, 243, 246,
+ 250, 255, 259, 263, 266, 271, 275, 279, 283, 286,
+ 290, 294, 297, 302, 306, 310, 314, 317, 322, 326,
+ 330, 334, 337, 342, 346, 350, 353, 358, 362, 366,
+ 369, 374, 378, 382, 385, 390, 394, 398, 401, 406,
+ 410, 413, 416, 419, 423, 427, 431, 434, 437, 440,
+ 443, 445, 448, 451, 453, 455, 458, 461, 465, 468,
+
+ 472, 476, 479, 482, 485, 488, 492, 495, 499, 503,
+ 507, 510, 514, 517, 520, 523, 527, 530, 533, 536,
+ 539, 542, 546, 548, 552, 555, 558, 561, 565, 569,
+ 573, 576, 581, 584, 587, 591, 595, 598, 603, 608,
+ 612, 616, 619, 623, 627, 631, 635, 638, 643, 647,
+ 651, 656, 659, 662, 666, 667, 668, 669, 670, 671,
+ 671, 671, 671, 671, 671, 671, 672, 672, 673, 674,
+ 674, 674, 674, 676, 676, 677, 677, 677, 677, 678,
+ 678, 678, 679, 679, 680, 680, 680, 680, 680, 680,
+ 680, 681, 681, 682, 683, 684, 685, 685, 685, 685,
+
+ 688, 689, 689, 692, 693, 696, 699, 702, 705, 708,
+ 708, 708, 708, 710, 711, 711, 711, 711, 711, 711,
+ 712, 713, 714, 714, 714, 715, 716, 717, 717, 718,
+ 719, 720, 720, 720, 721, 721, 722, 722, 722, 722,
+ 722, 722, 722, 723, 724, 725, 726, 727, 727, 728,
+ 728, 728, 729, 730, 731, 731, 731, 731, 731, 731,
+ 732, 733, 734, 735, 735, 735, 735, 736, 736, 736,
+ 736, 737, 737, 738, 738, 739, 739, 740, 740, 741,
+ 741, 742, 742, 743, 743, 744, 744, 745, 746, 747,
+ 747, 748, 748, 749, 750, 751, 752, 753, 753, 753,
+
+ 754, 754, 754, 755, 755, 756, 757, 757, 758, 759,
+ 760, 760, 761, 762, 763, 764, 765, 766, 767, 768,
+ 769, 770, 770, 771, 772, 772, 773, 773, 774, 775,
+ 775, 775, 775, 776, 777, 778, 778, 779, 780, 780,
+ 781, 781, 781, 782, 783, 784, 784, 785, 786, 787,
+ 788, 789, 790, 791, 792, 793, 793, 793, 793, 793,
+ 793, 793, 793, 793, 793, 793, 794, 795, 796, 797,
+ 798, 799, 799, 799, 800, 800, 800, 801, 801, 801,
+ 802, 802, 802, 802, 803, 804, 804, 805, 806, 806,
+ 806, 806, 808, 809, 809, 810, 810, 810, 811, 811,
+
+ 812, 813, 813, 813, 813, 813, 813, 814, 815, 816,
+ 817, 818, 819, 819, 820, 821, 821, 822, 824, 826,
+ 826, 826, 826, 826, 827, 827, 827, 827, 827, 827,
+ 827, 827, 827, 827, 827, 827, 827, 827, 827, 827,
+ 827, 827, 827, 827, 827, 827, 827, 827, 827, 827,
+ 827, 827, 827, 827, 827, 828, 831, 834, 837, 840,
+ 843, 843, 843, 845, 845, 845, 845, 846, 846, 846,
+ 847, 847, 847, 848, 848, 848, 848, 849, 850, 851,
+ 851, 852, 852, 852, 853, 854, 855, 856, 856, 856,
+ 856, 856, 856, 856, 856, 856, 856, 858, 859, 859,
+
+ 859, 860, 861, 862, 863, 864, 864, 864, 864, 864,
+ 865, 865, 865, 866, 867, 868, 869, 870, 871, 872,
+ 873, 874, 875, 876, 877, 878, 878, 878, 879, 880,
+ 880, 880, 881, 882, 883, 884, 885, 886, 887, 888,
+ 888, 889, 890, 891, 891, 891, 892, 893, 894, 895,
+ 896, 897, 897, 898, 899, 900, 900, 901, 901, 901,
+ 901, 902, 902, 902, 903, 904, 905, 906, 907, 907,
+ 907, 907, 907, 907, 907, 907, 907, 907, 907, 907,
+ 908, 909, 909, 909, 910, 911, 911, 912, 912, 913,
+ 914, 914, 914, 915, 915, 915, 915, 915, 915, 915,
+
+ 915, 916, 916, 916, 917, 917, 917, 918, 919, 920,
+ 920, 921, 922, 922, 923, 923, 923, 923, 923, 925,
+ 927, 927, 927, 928, 928, 930, 930, 930, 930, 930,
+ 930, 930, 930, 930, 930, 930, 930, 930, 930, 930,
+ 930, 930, 930, 930, 930, 930, 930, 930, 930, 930,
+ 930, 931, 934, 936, 939, 942, 945, 945, 945, 945,
+ 946, 946, 946, 947, 947, 947, 948, 948, 949, 950,
+ 950, 950, 950, 950, 950, 950, 950, 950, 950, 951,
+ 953, 953, 953, 954, 954, 954, 955, 956, 957, 958,
+ 959, 960, 961, 962, 962, 963, 964, 965, 965, 965,
+
+ 965, 966, 967, 968, 969, 970, 971, 972, 973, 974,
+ 975, 976, 977, 978, 979, 980, 981, 982, 982, 983,
+ 984, 984, 984, 984, 985, 986, 987, 987, 987, 988,
+ 989, 990, 992, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 992, 993, 994, 994, 995, 995,
+ 995, 996, 997, 997, 998, 999, 1000, 1001, 1001, 1001,
+ 1001, 1002, 1003, 1003, 1004, 1004, 1004, 1004, 1005, 1006,
+ 1007, 1007, 1008, 1009, 1009, 1010, 1010, 1011, 1011, 1011,
+ 1013, 1015, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1021, 1022, 1023,
+
+ 1024, 1025, 1028, 1031, 1031, 1031, 1031, 1032, 1032, 1032,
+ 1032, 1033, 1034, 1035, 1035, 1035, 1035, 1035, 1035, 1035,
+ 1035, 1035, 1035, 1036, 1038, 1038, 1038, 1038, 1038, 1039,
+ 1040, 1041, 1042, 1043, 1044, 1044, 1044, 1044, 1045, 1046,
+ 1046, 1046, 1046, 1046, 1047, 1048, 1049, 1050, 1051, 1052,
+ 1053, 1054, 1055, 1056, 1057, 1058, 1058, 1058, 1059, 1060,
+ 1061, 1061, 1061, 1062, 1062, 1062, 1063, 1063, 1063, 1063,
+ 1063, 1063, 1063, 1064, 1065, 1065, 1066, 1066, 1067, 1069,
+ 1070, 1070, 1070, 1070, 1070, 1071, 1072, 1072, 1073, 1074,
+ 1075, 1075, 1076, 1077, 1077, 1077, 1077, 1077, 1077, 1078,
+
+ 1079, 1080, 1080, 1081, 1081, 1082, 1082, 1082, 1084, 1086,
+ 1088, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089,
+ 1089, 1089, 1090, 1090, 1091, 1093, 1095, 1096, 1097, 1099,
+ 1102, 1102, 1103, 1105, 1105, 1105, 1105, 1105, 1106, 1107,
+ 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107,
+ 1107, 1107, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1114, 1115, 1116, 1117, 1118,
+ 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1125, 1125, 1126,
+ 1127, 1127, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1129, 1129, 1130, 1130, 1131, 1132, 1132, 1132, 1133,
+
+ 1134, 1135, 1135, 1136, 1136, 1137, 1138, 1138, 1139, 1139,
+ 1139, 1139, 1139, 1140, 1140, 1140, 1141, 1142, 1144, 1145,
+ 1145, 1145, 1147, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
+ 1150, 1150, 1151, 1152, 1152, 1154, 1156, 1158, 1159, 1161,
+ 1164, 1164, 1164, 1164, 1164, 1164, 1165, 1166, 1166, 1167,
+ 1167, 1167, 1167, 1167, 1167, 1168, 1169, 1169, 1169, 1169,
+ 1169, 1170, 1171, 1172, 1173, 1174, 1174, 1174, 1174, 1174,
+ 1174, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182,
+ 1183, 1184, 1185, 1185, 1185, 1186, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1188, 1190, 1191, 1192,
+
+ 1192, 1192, 1193, 1193, 1194, 1194, 1195, 1195, 1196, 1196,
+ 1196, 1196, 1196, 1197, 1198, 1199, 1199, 1199, 1201, 1203,
+ 1203, 1203, 1205, 1206, 1208, 1210, 1210, 1212, 1214, 1216,
+ 1219, 1219, 1220, 1221, 1222, 1222, 1222, 1222, 1222, 1222,
+ 1223, 1223, 1223, 1223, 1224, 1225, 1226, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1228, 1229, 1230, 1231, 1232, 1233,
+ 1234, 1235, 1236, 1236, 1236, 1237, 1238, 1239, 1239, 1239,
+ 1239, 1239, 1239, 1239, 1239, 1239, 1240, 1241, 1242, 1242,
+ 1242, 1243, 1245, 1246, 1246, 1246, 1246, 1247, 1248, 1249,
+ 1250, 1252, 1252, 1254, 1256, 1258, 1259, 1261, 1262, 1263,
+
+ 1265, 1265, 1266, 1266, 1266, 1266, 1267, 1268, 1268, 1269,
+ 1270, 1270, 1271, 1271, 1271, 1272, 1273, 1274, 1274, 1275,
+ 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1277, 1277, 1278,
+ 1278, 1278, 1278, 1278, 1279, 1279, 1280, 1281, 1282, 1283,
+ 1284, 1285, 1286, 1286, 1287, 1287, 1287, 1287, 1287, 1287,
+ 1288, 1288, 1288, 1288, 1289, 1290, 1291, 1291, 1292, 1293,
+ 1294, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302,
+ 1302, 1303, 1304, 1304, 1304, 1305, 1306, 1308, 1308, 1308,
+ 1309, 1309, 1310, 1311, 1312, 1312, 1312, 1312, 1312, 1314,
+ 1316, 1318, 1319, 1320, 1322, 1322, 1322, 1322, 1322, 1322,
+
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1323, 1324,
+ 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325,
+ 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325,
+ 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325,
+ 1325, 1325, 1325, 1325, 1325, 1325, 1326, 1327, 1327, 1327,
+ 1327, 1327, 1327, 1327, 1328, 1328, 1329, 1329, 1329, 1330,
+ 1331, 1331, 1332, 1332, 1333, 1333, 1333, 1333, 1333, 1334,
+ 1335, 1336, 1336, 1336, 1337, 1338, 1339, 1339, 1340, 1341,
+ 1342, 1343, 1344, 1345, 1346, 1346, 1347, 1347, 1347, 1348,
+ 1349, 1349, 1349, 1349, 1349, 1351, 1352, 1352, 1353, 1353,
+
+ 1353, 1354, 1355, 1357, 1359, 1359, 1360, 1361, 1361, 1361,
+ 1361, 1361, 1362, 1362, 1363, 1364, 1365, 1365, 1366, 1367,
+ 1368, 1369, 1370, 1371, 1372, 1373, 1373, 1374, 1375, 1375,
+ 1375, 1377, 1378, 1379, 1381, 1382, 1383, 1385, 1385, 1385,
+ 1385, 1386, 1388, 1391, 1391, 1391, 1391, 1391, 1391, 1391,
+ 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391,
+ 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391,
+ 1391, 1392, 1392, 1393, 1393, 1393, 1393, 1394, 1395, 1396,
+ 1396, 1396, 1397, 1398, 1398, 1398, 1398, 1398, 1399, 1400,
+ 1401, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1408,
+
+ 1409, 1409, 1409, 1410, 1411, 1411, 1411, 1412, 1412, 1412,
+ 1413, 1414, 1414, 1414, 1414, 1415, 1415, 1415, 1415, 1415,
+ 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1416, 1417, 1417,
+ 1417, 1417, 1418, 1418, 1418, 1419, 1420, 1421, 1421, 1422,
+ 1423, 1424, 1425, 1426, 1427, 1428, 1428, 1429, 1429, 1429,
+ 1430, 1431, 1431, 1433, 1434, 1434, 1435, 1435, 1435, 1436,
+ 1436, 1436, 1438, 1439, 1439, 1439, 1441, 1442, 1443, 1445,
+ 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445,
+ 1445, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1450,
+ 1450, 1451, 1452, 1452, 1453, 1453, 1453, 1453, 1453, 1454,
+
+ 1455, 1456, 1456, 1457, 1457, 1457, 1457, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1459,
+ 1459, 1460, 1461, 1462, 1462, 1463, 1464, 1465, 1466, 1467,
+ 1468, 1469, 1470, 1470, 1471, 1472, 1472, 1472, 1472, 1472,
+ 1472, 1472, 1472, 1473, 1474, 1475, 1475, 1476, 1477, 1478,
+ 1479, 1480, 1481, 1482, 1482, 1483, 1483, 1483, 1484, 1485,
+ 1485, 1485, 1486, 1486, 1486, 1487, 1488, 1488, 1488, 1488,
+ 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1491,
+ 1492, 1493, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495,
+ 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1496,
+
+ 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497,
+ 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497,
+ 1497, 1497, 1497, 1497, 1497, 1497, 1498, 1498, 1498, 1499,
+ 1500, 1501, 1502, 1502, 1503, 1504, 1505, 1506, 1507, 1508,
+ 1509, 1509, 1510, 1510, 1510, 1511, 1512, 1512, 1512, 1512,
+ 1512, 1514, 1515, 1515, 1516, 1516, 1516, 1517, 1517, 1517,
+ 1517, 1518, 1519, 1520, 1520, 1521, 1521, 1521, 1521, 1522,
+ 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
+ 1524, 1526, 1527, 1528, 1530, 1532, 1534, 1534, 1536, 1538,
+ 1540, 1542, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1545, 1545, 1545, 1545, 1546,
+ 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
+ 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
+ 1547, 1547, 1547, 1547, 1548, 1549, 1550, 1551, 1551, 1552,
+ 1553, 1554, 1555, 1556, 1557, 1558, 1558, 1559, 1559, 1559,
+ 1560, 1561, 1561, 1561, 1562, 1562, 1562, 1563, 1564, 1564,
+ 1564, 1564, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1567,
+
+ 1568, 1568, 1569, 1570, 1573, 1573, 1573, 1573, 1573, 1573,
+ 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1575, 1575, 1576,
+ 1576, 1576, 1576, 1577, 1577, 1577, 1577, 1577, 1577, 1577,
+ 1577, 1577, 1577, 1578, 1578, 1578, 1578, 1578, 1579, 1580,
+ 1581, 1581, 1582, 1582, 1582, 1582, 1583, 1583, 1583, 1583,
+ 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583,
+ 1583, 1583, 1583, 1583, 1583, 1583, 1584, 1584, 1584, 1585,
+ 1585, 1586, 1587, 1588, 1588, 1589, 1590, 1591, 1592, 1593,
+ 1593, 1595, 1596, 1597, 1598, 1599, 1599, 1599, 1600, 1600,
+ 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
+
+ 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1603,
+ 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603,
+ 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603,
+ 1603, 1603, 1603, 1603, 1604, 1604, 1605, 1605, 1605, 1605,
+ 1605, 1605, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1613,
+ 1614, 1614, 1614, 1615, 1615, 1616, 1616, 1616, 1616, 1617,
+ 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618,
+ 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1619,
+ 1619, 1619, 1619, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
+ 1620, 1620, 1620, 1621, 1621, 1621, 1621, 1621, 1623, 1624,
+
+ 1625, 1626, 1627, 1628, 1629, 1629, 1629, 1630, 1630, 1631,
+ 1631, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632,
+ 1632, 1632, 1633, 1633, 1634, 1634, 1634, 1634, 1635, 1635,
+ 1635, 1636, 1636, 1637, 1637, 1637, 1637, 1638, 1639, 1639,
+ 1640, 1641, 1642, 1643, 1645, 1646, 1647, 1648, 1648, 1648,
+ 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648,
+ 1648, 1649, 1649, 1649, 1649, 1649, 1650, 1650, 1651, 1651,
+ 1652, 1652, 1653, 1654, 1655, 1656, 1657, 1659, 1660, 1660,
+ 1660, 1660, 1661, 1661, 1662, 1662, 1662, 1662, 1663, 1664,
+ 1664, 1664, 1664, 1664, 1665, 1666, 1668, 1669, 1670, 1671,
+
+ 1671, 1671, 1672, 1672, 1673, 1673, 1674, 1674, 1675, 1675,
+ 1676, 1677, 1678, 1679, 1679, 1680, 1680, 1680, 1680, 1682,
+ 1683, 1684, 1684, 1685, 1686, 1686
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 20, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 38, 45, 46, 47, 48, 49, 38, 38, 38, 38,
+ 50, 51, 52, 53, 54, 1, 55, 56, 57, 58,
+
+ 59, 60, 61, 62, 63, 38, 64, 65, 66, 67,
+ 68, 69, 38, 70, 71, 72, 73, 74, 75, 76,
+ 77, 38, 78, 79, 80, 81, 1, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82
+ } ;
+
+static yyconst flex_int32_t yy_meta[83] =
+ { 0,
+ 1, 2, 3, 4, 2, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 29,
+ 30, 31, 32, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 33, 32, 34,
+ 35, 36
+ } ;
+
+static yyconst flex_int32_t yy_base[2905] =
+ { 0,
+ 0, 9, 90, 25, 170, 182, 262, 342, 422, 502,
+ 582, 662, 743, 0, 824, 904, 984, 1064, 1144, 1224,
+ 194, 204, 228, 250, 284, 295, 330, 377, 389, 457,
+ 537, 617, 835, 846, 1305, 0, 1387, 0, 870, 915,
+ 1469, 0, 949, 995, 1551, 0, 1633, 0, 1714, 1794,
+ 1875, 1957, 2038, 2118, 939, 1029, 1053, 1075, 2199, 0,
+ 2281, 0, 1109, 1133, 2363, 0,11100,36494,36494,36494,
+ 0, 44, 50, 54, 18, 4, 23,11089,11084,11078,
+ 36494, 1163, 2445,11048,11051, 55, 2521, 2602, 2678, 2759,
+ 4, 14, 11, 221,36494, 2841, 2922, 359, 473, 518,
+
+ 3003, 238,11052, 0, 0,11044,36494, 0,36494,36494,
+ 36494,11055, 0, 29,36494, 35,11045,11044,11042,36494,
+ 30, 549,36494, 0, 0, 61,36494,36494,11039,11036,
+ 36494, 629, 0,36494, 313,36494,36494, 323, 295, 0,
+ 0, 0, 279, 566, 0,36494,10957, 493, 611,10995,
+ 0,36494, 0,11000,10953, 0,36494, 0,36494,10952,
+ 0,36494, 0,10950, 0,36494, 0,10944, 0,36494,
+ 0,10942, 0,36494, 0,10939, 0,36494, 0,10931,
+ 0, 404, 452, 644, 309, 0, 689, 3085,36494, 0,
+ 63, 0, 197, 351, 400, 467, 0, 0, 863, 888,
+
+ 3167, 0, 1196, 3249,36494, 697, 704,36494,10980, 0,
+ 10949, 707, 0, 181,36494,36494,10957,10951,36494,10944,
+ 1195, 0, 574, 0, 0, 714, 242,36494,10930,10929,
+ 10865, 0,36494,36494,36494, 0,36494, 0,10926, 1223,
+ 1705,36494,36494, 0, 355,10926,36494,10925, 0, 0,
+ 0,10899,36494,10907, 0, 719, 1253, 1821, 730, 1009,
+ 880, 734,10894, 192,10892,36494, 0, 1083, 1731,10887,
+ 0,10885, 1087,10884, 165,10876,10838,10843, 1836,10826,
+ 0, 3330, 443, 1918, 0, 481,10821, 0,10827, 1234,
+ 36494,10808, 0,10750,10760,10753, 530,10797, 1841, 3412,
+
+ 542, 3493, 3570,10748, 3651, 325, 6, 14, 117, 654,
+ 164, 0, 3733, 1892, 1029, 966, 976,10777, 1120, 1161,
+ 1830,36494, 1013, 1047,36494, 1192, 0,10770, 275, 0,
+ 367, 388,10777,36494, 0, 460, 0,10759,10758, 0,
+ 10754, 1786,36494, 0,10701, 0, 529, 0, 513, 0,
+ 10735,36494, 0,10693, 929, 1257, 617, 835, 1125, 898,
+ 0, 0, 1863, 1942,10690,10679, 1744, 1974,10721,10683,
+ 0,10668, 0,10653, 0,10641, 0,10636, 0,10617,
+ 0,10614, 0,10612, 0, 1826, 1298, 1984, 1752,10651,
+ 1780, 2009, 2019, 3814, 3896, 0,36494, 315,10647, 632,
+
+ 392, 1245, 1710, 1758, 0, 2079, 2001, 3977, 2091, 2098,
+ 0, 4057, 4138,10574, 2163, 4219, 0, 4301, 4383, 4465,
+ 4546,10518, 4628,10466, 2065, 1937, 0, 2171, 2458,10498,
+ 10496,10477, 1153, 2466, 665,10448, 0, 864, 0, 942,
+ 0,10448,36494, 0,10331, 2027,36494, 0, 1946, 1282,
+ 1927,10249, 0,10208,36494,10154,10151,10124,10097,10095,
+ 10068,10082, 316,10051,10021, 0, 1990, 2069,10080,36494,
+ 0,10042, 0, 0, 2074, 2145,36494, 2105, 2110,36494,
+ 2487,10050, 563, 2491, 2130, 541, 2495, 429,10033, 0,
+ 10014, 2499, 4709, 9977, 1003, 9952, 9946,36494, 9946, 2431,
+
+ 4791, 523, 9936, 2531, 9926, 2556,36494,36494, 0, 9877,
+ 9870, 9868, 0, 2531, 2556, 9917, 2566, 2623, 2630, 2445,
+ 9873, 9905, 9899, 2575, 9888, 303, 2468, 2553, 183, 392,
+ 341, 454, 426, 501, 651, 1978, 2560, 914, 1000, 9879,
+ 671, 2602, 2606, 821, 825, 838, 815, 384, 224, 971,
+ 2490, 2607, 918, 946, 9837, 4873, 4955, 19, 333, 580,
+ 9820, 9822, 5037, 863, 2692, 2712,36494, 9876, 9872, 1023,
+ 9856, 9839,36494, 2716, 9833, 2787,36494, 0, 9787, 9839,
+ 1075, 9802, 9785,36494, 0, 9736, 2156, 9745, 9731, 9723,
+ 9721, 9717, 9711, 9706, 9701, 9690, 0,36494, 0, 9718,
+
+ 5118, 9717, 5200,36494, 1886, 2034, 2526, 9655, 9653, 5281,
+ 2741, 9700, 5360, 2749, 5439, 5518, 2791, 2795, 2715, 5598,
+ 2814, 5679, 9644, 107, 1063, 9701, 9693, 2855, 1164, 5760,
+ 5842, 2824, 5924, 6006, 9637, 6088, 6169, 6250, 9635, 1282,
+ 6331, 6412, 9622, 9661, 2079, 6493, 434, 2670, 2877, 1,
+ 2892, 9672, 2830, 0, 2935, 0, 9661, 9655, 2864, 9663,
+ 1170, 9644, 9617,36494, 0, 9567, 9565, 9610, 9562, 9551,
+ 9536, 9541, 9534, 9529, 9510, 9514, 9508, 9487, 9481,36494,
+ 0, 2947, 0, 2905, 2948, 9513, 2955, 1017, 2963, 886,
+ 9501, 0,36494, 9504, 9499, 6575, 6657, 6, 6739, 0,
+
+ 1193, 0, 0,36494, 0, 3022, 9424, 9430, 9427, 1149,
+ 2970, 2459, 1033, 2978, 2994, 9388, 9365, 3270, 3292, 3351,
+ 9344, 9386, 2700, 9379, 3021, 298, 1028, 236, 1072, 577,
+ 804, 1187, 1214, 1087, 1155, 832, 1196, 9369, 1221, 909,
+ 1694, 1141, 669, 1700, 357, 1717, 1223, 2469, 1067, 1749,
+ 9326, 6821, 6898, 6980, 9306, 1792, 9312, 9306, 9346, 1250,
+ 1784, 0, 1260, 0, 3055, 9311, 0, 1851, 9304, 9299,
+ 9289, 9284, 9275, 9263, 9245, 9245, 9260, 9250, 0, 7062,
+ 9239, 9230, 3280, 1759, 1907, 7142, 7221, 3291, 3330, 3054,
+ 1891, 7301, 1680, 9276, 3320, 9262, 3384, 7383, 7465, 3388,
+
+ 3393, 3403, 7547, 7629, 7711, 7792, 7873, 7954, 9204, 1719,
+ 2026, 8035, 8116, 8198, 9201, 1785, 2109, 9245, 8279, 1865,
+ 3398, 9197, 9195, 3456, 9230, 9234, 9202, 0, 2156, 9141,
+ 9140, 0, 9122, 9112, 0, 9103, 9105, 0, 9104, 9081,
+ 9070, 9076, 9051, 2484, 3022, 2867, 1832, 3430, 9091, 9084,
+ 3583,36494, 8361, 3442, 0, 8443, 9038, 8525, 1926, 8607,
+ 8689, 2175, 9070, 9055, 3481, 3595, 3606, 9065, 2051, 2008,
+ 0, 3042, 3609, 9043, 3617, 1947, 3621, 8997, 8995, 3677,
+ 3695, 3984, 9032, 1251, 2141, 2147, 2098, 2001, 2422, 3634,
+ 2079, 2437, 2461, 1926, 2474, 2541, 999, 9, 8766, 8843,
+
+ 8920, 9002, 9084, 8979, 8964, 8987, 2433, 3758, 3767, 3724,
+ 8939, 2434, 8928, 8909, 8911, 8885, 8886, 8868, 8852, 8858,
+ 8844, 8824, 0, 9166, 8822, 8834, 915, 2068, 9246, 9325,
+ 3739, 4028, 9405, 8804, 3570, 8805, 8804, 8836, 8837, 8777,
+ 8774, 9487, 9569, 4034, 4111, 9651, 9733, 9815, 9896, 9977,
+ 2558,10059, 2564,10141, 8769, 8772, 8764, 2579, 8771, 8752,
+ 8742, 0,36494, 8735, 8723,36494, 8735, 8727, 2609, 8718,
+ 8625, 0, 3664, 3991, 8584, 3766, 2496, 4018, 3781, 4098,
+ 4123, 1215, 1725,10223,10305,10387,10469, 8469, 0,10551,
+ 2565, 0, 8427, 3991, 4017, 8428, 8421, 8386, 2759, 4791,
+
+ 4159, 8376, 4314, 8338, 4192, 8288, 8302, 4329, 4796, 4488,
+ 36494, 2547, 2578, 2650, 2608, 2583, 2630, 2633, 2675, 2641,
+ 2689, 3313, 1107,10628,10705,10782,10859,10936,11013,11095,
+ 8260,36494, 2667, 4092, 4360, 8275, 8263, 8199, 8198, 8210,
+ 8238, 8192, 8169, 8157, 8162, 8156, 8135, 8139, 8095, 8068,
+ 536, 2689,11176,11255, 4825, 4843,11335,11416, 8046, 8047,
+ 8034, 8032,11497,11579, 4847, 4907,11661,11743,11825,11906,
+ 11987, 8024,12069, 8011,12151,12232, 8008, 8018, 8000, 7998,
+ 7989,36494, 7977, 7970, 7964, 7964, 7968, 7965, 7947, 7951,
+ 4174, 7977, 4649, 7966, 4322, 4489, 2125, 429, 0,12313,
+
+ 7921,12395, 4347,12477,12559,12641,12723, 7979, 4656, 7978,
+ 4686, 7971, 7942, 2764, 3276, 7888, 4813, 4191, 4906, 7878,
+ 7869, 4921, 4974, 2715, 2618, 2747, 2762, 2700, 2634, 7874,
+ 2461, 0,12800,12881,12957,13034,13111,13188,13265,13347,
+ 7843, 4797, 7898, 4864, 7892, 7840, 7831, 7810,36494, 7798,
+ 7779, 7776, 7762, 7769,36494,36494, 2841, 7761, 2684, 2772,
+ 13428,13507, 4931, 5007,13587, 7730, 7740, 7713, 7728,13669,
+ 13751, 5011, 5017,13833,13915,13997,14078,14159,14240,14321,
+ 14402,14483, 7705, 7702, 7709, 7695, 2904, 7697, 7682, 7689,
+ 7675, 7668, 7649, 7651, 7602, 5280, 4501, 5020, 5288, 225,
+
+ 2748,14565, 1993, 7614,14647,14729,14811, 2908,14893, 3516,
+ 7596, 7546, 7550, 5058, 5295, 3008, 7542, 5305, 5312, 2759,
+ 2750, 0,14970,15047,15124,15205, 5021,15281,15358,15440,
+ 7522, 7523, 7522,36494, 7519, 7506, 7486, 7475, 7486, 3034,
+ 7475, 3498, 2788, 5027,15521, 5339,15601, 7449, 7436, 7426,
+ 7408,15683,15765, 5344, 5373, 5043,15847,15929,16010,16091,
+ 16173,16255, 3417, 7413, 7394, 3716, 3477, 7381, 7390, 7385,
+ 3541, 7390, 7390, 7367, 0, 5080, 5397,16336, 2830, 2861,
+ 16417, 4518,16499,16581, 4942, 7358, 3599, 5384, 5401,36494,
+ 5424, 7355, 5456, 5469,16658, 2971,16735, 2912, 3001,16812,
+
+ 16893, 4662, 2808, 3052, 7405, 5490,16974, 7401,17056, 5548,
+ 17137, 5531, 3635, 7355, 5629, 5633, 4903, 7354, 3705, 3720,
+ 7314, 7314, 7242, 7235, 7209, 7208, 3733, 2850,17213, 3771,
+ 7202, 3793, 7195,17293,17375, 5500, 5575,17457,17539,17620,
+ 17702,36494, 7177, 3797, 4044, 0, 0, 7161, 7174, 3802,
+ 7153, 7153, 0,36494, 5438, 5651,17783, 5663, 5720, 5738,
+ 7175, 5802, 5820, 5816, 5884, 5902, 6856, 5966, 6042, 7134,
+ 5984, 6123,17864,17946,18028,18110, 3008, 5507, 4946,36494,
+ 5894, 4048, 5722,18191, 5752, 7114, 7099, 7080, 6053,18271,
+ 18348, 3290, 2880,18425, 2842, 7112, 2894, 3296, 4108, 2956,
+
+ 3316, 3245, 3294, 7032, 7020, 3347, 7031, 5980,18507,18589,
+ 3232, 4519, 3353, 5952, 6034, 6198, 6279, 4058, 4139, 4799,
+ 5336, 5436, 3367, 5544, 5752, 5069, 3603, 5518, 5776, 6086,
+ 5832, 6327, 6097, 6167, 6178, 6248, 5676, 6125, 6339, 6328,
+ 6412, 6206, 5679, 3371, 6962, 4690, 4695, 6956, 6940, 6943,
+ 6908, 6920, 1857,36494, 6901, 4699, 6818,18671, 6060,18753,
+ 6804, 4857, 6836,36494, 0, 4995, 6790, 6784,36494, 6301,
+ 18833, 6839,18913, 6871, 6927, 6933, 6810, 6937, 6952, 7023,
+ 7042, 7104, 7120, 7155, 2879, 7170, 3274, 3358, 7183, 6886,
+ 6149, 6728, 6577, 6576, 6965, 7202, 6821, 7413, 4019, 4133,
+
+ 7443, 6630, 7091,36494, 2740,18994,19076, 5377, 6560, 6391,
+ 5349, 5895,19157, 7507, 7525, 7607, 6609, 7665, 7672, 7439,
+ 8793, 7746, 8878, 7753, 7827, 6561, 7857, 7908, 6543, 6479,
+ 7916, 7989, 8812,19233, 3603, 3205,19310, 6437, 6421, 6475,
+ 7116, 5942, 6142, 6446, 6575, 6603, 7226, 6625, 6833, 7249,
+ 7268, 7383, 7484, 7420, 7730, 7575, 7591, 7998, 7765, 8361,
+ 7811, 8069, 8217, 8252, 8879, 8956, 8380, 8964, 6426, 6401,
+ 36494, 6408,36494, 6384, 6390, 6339,36494,36494, 5065, 5071,
+ 6313, 6434, 9037, 6359, 6341, 6327,19391, 8818, 8949, 9041,
+ 6320, 8991, 9031, 9126, 9066, 9197, 9201, 9207, 3363, 9236,
+
+ 3429, 3446, 9283, 7521, 7863, 6313, 7944, 2781, 3279, 8800,
+ 9287, 2923, 3281, 6307, 7784, 6175, 6171, 8025, 6167, 6161,
+ 3444, 3431, 8911, 3564, 3578, 3011, 2752,19471, 6145, 5876,
+ 6138,19551, 6165,19631, 9517, 9547, 9769, 6116, 9611, 9693,
+ 10662, 9711, 9850, 9931,10669, 3416,10687, 3567, 3606,10746,
+ 9141, 6109, 9156, 9543, 9278,10760, 4854, 4927,10764, 6038,
+ 6015,19711, 9309, 6866, 6969,19788, 4421, 4929,19865, 5937,
+ 6602, 9274, 5885, 5850, 9251, 9353, 8394, 9376, 9588, 9487,
+ 6624, 9761,10811, 9834, 9915,10830,10886, 5658,36494, 5835,
+ 36494, 5092, 5837,19946,10900, 6923, 7511, 5887, 9297, 9625,
+
+ 10905, 5878, 9527, 3601, 2951, 3641, 9796, 9637, 5815, 5803,
+ 5732, 5746, 5729, 5726, 4052, 4839, 2986, 3288, 3610,20026,
+ 10918,10982,10995,20107,11042,11055, 9886,11061,11079,20189,
+ 11129,11157, 1981,11204,11217, 5990,20270, 7079, 5776, 5657,
+ 5632,20350,11230,11306,11319, 5553,11370,11445,11527,11400,
+ 11557,11639,11703, 3440,11721, 3976, 3985,11779,11189,11312,
+ 5548,11406, 3314, 3674,11473,11786, 3685, 3348, 5529, 9787,
+ 5280, 4143, 5469, 5468, 8065,10498, 9120, 6959,20426,20508,
+ 3702,20589, 5458, 6228, 5414, 5372, 5368,11236, 9940,11275,
+ 11598,11190,11283,11844,11869,11883,11925, 5880,36494,36494,
+
+ 5275, 6378, 7106,10681, 5258, 5248,10700, 5232, 5230, 3426,
+ 3642, 4014,11561,10774, 4122, 5230, 5226, 5145, 5049, 5008,
+ 4999, 4335, 4824, 3535, 4094,20670, 5418,20750,12425, 4972,
+ 12828,12846, 2148,12921,12939,13003,13069,12186,13088,13146,
+ 7145,13222, 6462, 7642,13240,12449,11073,20831, 4121, 4465,
+ 11480,11805, 5570,12757,13162,13300,12782, 6849, 4659, 4958,
+ 10931,11643,11941, 4943,11122, 3699, 3743, 4116,12213,11163,
+ 4847, 4766, 5285, 4934, 0, 4759, 7010, 7030, 8233, 3624,
+ 3313, 3675, 4561,12467,12914,13177,20912,13304,12218,13379,
+ 13329,13386, 4754, 4737, 574,12989,12847,13074,12766,13241,
+
+ 13429, 5106, 8808, 7971, 638, 663, 850, 919, 4463, 4525,
+ 4257, 957, 1037, 1138,36494, 1682, 1743, 1821, 3483, 4850,
+ 3759, 4322,20992, 3568, 4862, 5382,21073, 5512, 5819, 3182,
+ 7414, 5572,13467, 5665, 5974, 2802, 5746, 6236, 7683, 2067,
+ 21155, 7898,21236,13699, 2073,13958,14841,21317,14039,14945,
+ 15004,15022,15081,15099,15161, 9507,15179, 8085, 8946,15239,
+ 13723,13805,21399,13887, 9860,10902,14132,15257,10963, 9063,
+ 21481,12875, 4110, 3745,13336, 4785, 4789,13471,15331,11553,
+ 2088, 2469,11621, 2544, 2569, 4305, 3970, 4792,13741,12459,
+ 4291, 2683, 2715, 5014, 5428, 2760,12181,12752,21562, 5326,
+
+ 21642, 5322, 5411,13823, 7052, 2806, 2831,12520,13472, 5639,
+ 8874, 8884, 2855, 2884, 2879, 2905, 2960, 3039,13977, 3011,
+ 3098, 3113, 5713, 3189, 5522,21723, 4234, 3971, 6274, 3603,
+ 4290,21805,14068, 4194, 6133, 6297, 3263,13404,14113,15315,
+ 21887,13495, 9867,11789,10495,15341,13729, 4901, 4949, 4095,
+ 4323, 4452, 4628,15472,15482, 3223, 3248, 3389, 3401, 4963,
+ 4991, 4473, 3421, 3442, 3462, 3680, 5482, 3565, 7914, 9073,
+ 5493, 6234, 7125,21968, 6873, 4450, 7597, 6398, 7098,22048,
+ 13951, 5045, 5324, 5769, 5785, 7014, 3729, 6048, 3719, 7478,
+ 7680, 3719, 3737, 3826, 3827, 4076,14221,13983, 4611, 6287,
+
+ 3838, 3854, 3919, 5061, 4640, 5042, 4827,22129,13791,13873,
+ 5390, 5433,14194, 5525, 5598, 9524,10840,10659,15397,14226,
+ 10810, 4810, 5050, 4894, 4914, 4956, 4494,15743,16616, 3916,
+ 3952, 3938, 3959, 4003, 4997,14302, 3946, 4021, 5635,13156,
+ 22210,14275, 5960, 6130, 6215, 6069, 5569, 6376, 4179,13709,
+ 4129, 9619, 6483, 4139, 6607, 4155, 4618, 4170,14307,14213,
+ 4165, 4264, 5313, 5440, 8240,14356, 5660, 5848, 5278, 5507,
+ 5647, 5544,11309,11702,12781, 4932, 5557, 5406, 4325, 5718,
+ 5610, 5796,16693,16708, 4268, 4278, 4287, 4296, 5302,14383,
+ 14387, 5696, 6617, 4307, 5771,13021,22290,14874, 6962, 6911,
+
+ 5949, 6019, 6560, 7114, 4315,11510,14217, 4403,14294, 4429,
+ 14437, 4436, 5963, 7196, 5698, 5981, 5810, 5581, 6067, 5743,
+ 6097, 8243,10964,15890, 5971, 6207, 5936, 6826, 6069,16785,
+ 6862, 4435, 7048, 4437, 6226, 4453,14867,14375, 4464, 6329,
+ 6819, 6942, 7124, 6377, 7206, 7178, 7220, 4597, 4606, 6307,
+ 6140, 6308, 6225, 6343, 6361, 6368,12857,15971,14879,12183,
+ 7209, 6397, 6319, 6074,16864,14851, 4604,14963, 4605,15415,
+ 4615, 7085, 7029, 7572, 7590, 7226,22371, 7211,11147, 6562,
+ 6569, 7834, 6587, 7846, 6896,13506, 5822,15496,15040, 6299,
+ 6321, 4620, 4639, 7594, 7274, 9687, 7444, 7234, 7756, 9112,
+
+ 5904, 8101, 6997,15425, 6412,15555, 6427,15713, 6590, 7611,
+ 7682, 7844, 7930, 5446,15723, 6868, 6833, 6944, 9715, 7506,
+ 7997, 7125, 7999, 8181,36494,22453,22489,22525,22561,22597,
+ 22633,22669,22705,22741,22777,22813,22849,22885,22921,22957,
+ 22993,23029,23065,23101,23137,23173,23209,23245, 7663, 8382,
+ 7745, 7900,23281,23317,23339, 8396,23362,23397,23433,23469,
+ 23505,23541,23577, 8385, 8395, 8773,23608,23643, 8772, 8799,
+ 23674, 9361,23708,23744,23780,23816,23852,23888,23924,23960,
+ 23996,24032,24068,24104, 7260,24140,24162,24178,24208,24244,
+ 6132,24280, 8936, 6588,24310,24346, 8952, 8983,24377,24406,
+
+ 9001, 9023,24434,24470, 8402,24505,24541,24577, 9119,24613,
+ 24649, 6857,24679, 9121, 7225, 9199,24709,10509, 9098,24745,
+ 24767, 7396,24795,24817,24845, 7477, 7227,24880, 7384, 9297,
+ 24915,24939,24975,25004,25040, 7393,25076,25112,25148,25184,
+ 25220,25256, 7431,10641, 7503, 9203, 7540,25291, 7563,25327,
+ 7630,10822, 7818, 9287, 7836,10482,25362,25398,25434,25470,
+ 25506,25542,25578,25614,25650,25686,25722,25758,25794, 9368,
+ 25830,25852,25868,25884,25914,25950,25986, 7917,26022,26052,
+ 26088,26124,26159, 7995,26181,26211,26246,11362,26271, 9590,
+ 26306,26334, 8040,11379, 8072, 9323, 8087,26364,26392,26428,
+
+ 9660,26463,26499,26535, 8083, 8372,26571, 9527,26601,26630,
+ 26665, 8964, 8886, 8173, 9782,26687, 9200,11601,10717, 8213,
+ 26709,26737,26757,26786,26821, 8245, 8389,26851,26886,26911,
+ 9734,26946,26974,27010,27045,27073, 9665,11618,10974,27108,
+ 27143, 8406, 9769,11673,11426, 8409,27179, 8800,27201,27217,
+ 27247,27283,27319,27349,27385, 9931,27420,27445,10957,27481,
+ 27517,27553,27589,27625,27660,27682,27712,27747, 9830,27772,
+ 8849,11022,27807,10505,11947,11431, 8899,27835,27871,10481,
+ 8961,27901,27936,27958,11216,11069,27994,11463,28030, 8971,
+ 12161, 9533, 9012, 9021,28065, 9067,10507,28095,28124,28159,
+
+ 28180,28210,11662,28245,28273,28305,28340, 9114,12244, 9168,
+ 28367, 9209, 9206,12258, 9266,11769,28403,28439,28475,28511,
+ 28541,28576,11744,28607,28643,28679,28715,28751,28781,11836,
+ 10662, 9314,12280, 9364,28817,28853,28889,28925,10838,28955,
+ 28984,29019,29046,29068,29104,29140, 9358,12490,10679, 9516,
+ 29175,29210,29246, 9605, 9489,29276,29311,29333,29363,29393,
+ 29428,29452,29483,29515,29547,29583,29618,12893,29645,29680,
+ 29716, 9626,12981, 9776,11921,29752,29788,29824,29860,11950,
+ 10739,29896,29932,29968,13047, 9930,30004,30040, 9935,30070,
+ 30105,30127,30157,30193,30229, 9936, 9940,10872,30265,30301,
+
+ 30337,10752,30367,30402,30424,30454,30484,30519,30543,30574,
+ 30606,30638,30670,30702,30738,30774,30810,30846,10042,10124,
+ 30882,30918,30954,30990,31026,31062,31098,31134,10452,31170,
+ 31200,31235,31257,31287,31323,10470,31359,31395,31431,31467,
+ 31503,10508,31533,31563,31593,31623,31658,31682,31713,31744,
+ 31779,31810,31842,31874,31906,31942,31978,32014,32050,10511,
+ 10512,32086,32122,32158,32194,32230,32266,32302,32338,10518,
+ 32374,32404,32434,32464,32500,32536,32572,10615,32602,32632,
+ 32668,32698,32728,32763,32787,32819,32854,32888,32919,32951,
+ 32987,10632,10637,33023,33059,33095,33131,33167,33203,10673,
+
+ 33239,33275,33305,33335,33370,33406,33442,11861,33472,33502,
+ 33532,33562,33594,33626,33657,33692,33723,33759,33795,12279,
+ 12396,33831,33867,33903,33939,33975,34011,12408,10714,34047,
+ 34083,34113,34143,34179,34214,34236,34271,34301,34336,34368,
+ 34400,34431,34466,34497,34533,34568,34596,34632,34668,34704,
+ 34740,34770,34805,34841,34877,34912,34942,34970,35000,35036,
+ 35071,35101,35123,35158,35182,35214,35245,35280,35310,35337,
+ 35364,35394,35425,35461,35496,35526,35553,35588,35612,35644,
+ 35675,35711,35747,35782,35812,35842,35869,35903,35938,35966,
+ 36002,36038,36074,36106,36140,36175,36211,36247,36283,36318,
+
+ 36353,36389,36424,36458
+ } ;
+
+static yyconst flex_int16_t yy_def[2905] =
+ { 0,
+ 2326, 2326, 2325, 3, 2327, 2327, 2328, 2328, 2329, 2329,
+ 2330, 2330, 2325, 13, 2331, 2331, 2332, 2332, 2332, 2332,
+ 2333, 2333, 2334, 2334, 2335, 2335, 2336, 2336, 2337, 2337,
+ 2338, 2338, 2339, 2339, 2325, 35, 2325, 37, 2326, 2326,
+ 2325, 41, 2340, 2340, 2325, 45, 2325, 47, 2341, 2341,
+ 2342, 2342, 2343, 2343, 2344, 2344, 2345, 2345, 2325, 59,
+ 2325, 61, 2346, 2346, 2325, 65, 2325, 2325, 2325, 2325,
+ 2347, 2325, 2325, 2325, 2348, 2349, 2350, 2351, 2352, 2347,
+ 2325, 2353, 2354, 2355, 2325, 2356, 2357, 2358, 2357, 2358,
+ 90, 90, 90, 2325, 2325, 2359, 2360, 2325, 2325, 2347,
+
+ 2354, 2355, 2347, 2361, 2361, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2362, 2325, 2325, 2363, 2364, 2365, 2362, 2325,
+ 2366, 2367, 2325, 2362, 2368, 2325, 2325, 2325, 2369, 2370,
+ 2325, 2371, 2368, 2325, 2372, 2325, 2325, 2372, 2373, 2374,
+ 2374, 2375, 2375, 2325, 2375, 2325, 2325, 2375, 2325, 2325,
+ 2376, 2325, 2376, 2325, 2325, 2377, 2325, 2377, 2325, 2325,
+ 2378, 2325, 2378, 2325, 2379, 2325, 2379, 2325, 2380, 2325,
+ 2380, 2325, 2381, 2325, 2381, 2325, 2382, 2325, 2382, 2325,
+ 2383, 2325, 2325, 2383, 2384, 2383, 2325, 2325, 2325, 2385,
+ 2325, 2386, 2387, 2388, 2387, 2387, 2389, 2389, 2390, 2390,
+
+ 2325, 2391, 2390, 2392, 2325, 2325, 2325, 2325, 2393, 2394,
+ 2325, 2395, 2396, 2325, 2325, 2325, 2397, 2398, 2325, 2325,
+ 2399, 2396, 2325, 2400, 2400, 2325, 2325, 2325, 2401, 2402,
+ 2403, 2403, 2325, 2325, 2325, 2404, 2325, 2404, 2404, 2325,
+ 2325, 2325, 2325, 2405, 2406, 2407, 2325, 2407, 2408, 2408,
+ 2408, 2325, 2325, 2409, 2403, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2410, 2411, 2325, 2412, 2413, 2413, 2414,
+ 2415, 2416, 2417, 2401, 2418, 2402, 2419, 2325, 2420, 2421,
+ 2422, 2423, 2424, 2425, 2426, 2412, 2325, 2427, 2427, 2428,
+ 2325, 2325, 2429, 2429, 2429, 2429, 2430, 2431, 2432, 2433,
+
+ 2434, 2325, 2435, 2429, 2433, 305, 305, 305, 305, 2325,
+ 2325, 2436, 2437, 2325, 2325, 2325, 2325, 2325, 2325, 2438,
+ 2438, 2325, 2325, 2325, 2325, 2438, 2439, 2325, 2325, 2440,
+ 2325, 2441, 2442, 2325, 2443, 2444, 2445, 2446, 2325, 2447,
+ 2447, 2448, 2325, 2449, 2449, 2450, 2325, 2451, 2452, 2453,
+ 2454, 2325, 2455, 2455, 2456, 2456, 2457, 2325, 2457, 2325,
+ 2458, 2459, 2459, 2325, 2325, 2325, 2459, 2325, 2325, 2325,
+ 2460, 2325, 2461, 2325, 2462, 2325, 2463, 2325, 2464, 2325,
+ 2465, 2325, 2466, 2325, 2467, 2325, 2325, 2467, 2468, 2469,
+ 2325, 2325, 2467, 2325, 2325, 2470, 2325, 2325, 2471, 2472,
+
+ 2473, 2472, 2474, 2474, 2475, 2476, 2325, 2477, 2476, 2476,
+ 2478, 2479, 2479, 413, 2480, 2325, 416, 2481, 2325, 2482,
+ 2325, 2483, 2482, 423, 2325, 2325, 2484, 2485, 2486, 2484,
+ 2484, 2487, 2488, 2489, 2490, 2491, 2492, 2325, 2493, 2494,
+ 2495, 2496, 2325, 2497, 2497, 2325, 2325, 2498, 2325, 2325,
+ 2325, 2499, 2500, 2500, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2501, 2325, 2502, 2503, 2325,
+ 2504, 2325, 2505, 2506, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2507, 2508, 2509, 2510, 2511, 2509, 2512, 2513, 2514,
+ 2515, 2516, 2325, 2517, 2518, 2325, 2519, 2325, 2520, 2521,
+
+ 2522, 2523, 2325, 2524, 2325, 2525, 2325, 2325, 2526, 2526,
+ 2526, 2526, 2527, 2528, 2528, 2529, 2325, 2530, 2530, 2510,
+ 2325, 2531, 2532, 2325, 2532, 2532, 2532, 2532, 2532, 2532,
+ 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532,
+ 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532,
+ 2532, 2532, 2532, 2532, 2526, 2533, 2533, 557, 557, 557,
+ 2325, 2325, 2534, 2535, 2325, 2325, 2325, 2536, 2537, 2538,
+ 2325, 2539, 2325, 2540, 2325, 2541, 2325, 2542, 2542, 2543,
+ 2544, 2325, 2545, 2325, 2546, 2546, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2547, 2325, 2548, 2325,
+
+ 2325, 2547, 2325, 2325, 2549, 2549, 2550, 2325, 2325, 2551,
+ 2552, 2552, 2551, 2553, 2551, 2551, 2553, 2553, 2554, 2555,
+ 2553, 2555, 622, 622, 622, 2556, 2557, 2558, 2559, 2560,
+ 2560, 2553, 2561, 2561, 634, 2562, 2563, 2563, 638, 2559,
+ 2564, 2564, 642, 2565, 2325, 2325, 646, 2325, 2566, 2325,
+ 2567, 2568, 2325, 2569, 2570, 2571, 2572, 2573, 2325, 2574,
+ 2575, 2325, 2576, 2325, 2577, 2577, 2578, 2579, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2580, 2325, 2581, 2582, 2582, 2583, 2325, 2583, 2584, 2585,
+ 2586, 2587, 2325, 2588, 2587, 2589, 2325, 2587, 2325, 2590,
+
+ 2591, 2592, 2593, 2325, 2594, 2595, 2596, 2596, 2596, 2597,
+ 2598, 2599, 2600, 2598, 2325, 2325, 2325, 2601, 2602, 2602,
+ 2325, 2603, 2599, 2325, 2325, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2596, 2605, 2606, 2605, 754, 754, 2325, 2325, 2607, 2325,
+ 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2616, 2617,
+ 2325, 2325, 2325, 2618, 2618, 2619, 2619, 2620, 2620, 2621,
+ 2325, 2325, 792, 2622, 2325, 2623, 2325, 2624, 2624, 2325,
+
+ 2620, 2620, 2625, 2625, 2626, 2626, 2627, 2627, 808, 808,
+ 808, 2628, 2325, 2628, 814, 814, 814, 2325, 2325, 819,
+ 2325, 2325, 2325, 2629, 2630, 2631, 2325, 2632, 2633, 2634,
+ 2635, 2636, 2325, 2325, 2637, 2325, 2325, 2638, 2325, 2325,
+ 2325, 2325, 2325, 2639, 2640, 2641, 2642, 2640, 2325, 2643,
+ 2644, 2325, 2645, 2646, 2647, 2325, 856, 2325, 2646, 2325,
+ 2325, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2654, 2654,
+ 2655, 2656, 2656, 2657, 2325, 2657, 2658, 2325, 2325, 2659,
+ 2659, 2660, 2325, 2661, 2661, 2661, 2661, 2661, 2661, 2325,
+ 2661, 2661, 2661, 2661, 2661, 2661, 2654, 2662, 2663, 2664,
+
+ 2665, 2666, 2666, 2325, 2325, 2667, 2668, 2669, 2670, 2671,
+ 2672, 2673, 2674, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2675, 2676, 2325, 2325, 2677, 2677, 2678, 2678,
+ 2679, 2679, 2325, 933, 2325, 2325, 2325, 2680, 2681, 2325,
+ 2325, 2682, 2682, 2679, 2679, 2683, 2683, 2684, 2684, 2325,
+ 950, 2325, 952, 2325, 954, 2325, 2325, 2685, 2686, 2687,
+ 2325, 2688, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2689, 2690, 2690, 2691, 2325, 2691, 2692, 2325, 2693,
+ 2694, 2694, 2694, 2325, 2325, 2325, 2695, 985, 2696, 2325,
+ 2694, 2697, 2698, 2699, 2699, 2700, 2701, 2325, 2702, 2702,
+
+ 2703, 2325, 2703, 2704, 2705, 2325, 2325, 2706, 2706, 2707,
+ 2325, 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2702, 2709, 2710, 2711, 2711, 2712, 2713, 2714, 2715,
+ 2325, 2325, 2325, 2716, 2716, 2717, 2718, 2719, 2720, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2721, 2721, 2722, 2722, 2723, 2723, 2724, 2724, 2325, 2325,
+ 2325, 2325, 2725, 2725, 2723, 2723, 2726, 2726, 2727, 2727,
+ 2325, 1071, 2325, 1073, 2728, 2728, 2325, 2325, 2729, 2730,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2731, 2325, 2731, 2732, 2733, 2734, 2735, 2735, 2736, 2325,
+
+ 1100, 2737, 2735, 2737, 2325, 2325, 2738, 2735, 2739, 2740,
+ 2325, 2741, 2325, 2325, 2325, 2742, 2743, 2325, 2744, 2325,
+ 2325, 2745, 2746, 2747, 2747, 2747, 2747, 2747, 2747, 2742,
+ 2748, 2749, 2750, 2751, 2752, 2753, 2752, 2754, 2755, 2756,
+ 2325, 2757, 2758, 2325, 2759, 2760, 2761, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2762, 2762,
+ 2763, 2763, 2325, 2764, 2325, 2325, 2325, 2325, 2325, 2765,
+ 2765, 2764, 2764, 2766, 2766, 2767, 2767, 2768, 2768, 2769,
+ 2769, 2325, 2325, 2325, 2770, 2771, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2772, 2325, 2773, 2774, 2775,
+
+ 2775, 2325, 2775, 1202, 2776, 2325, 2777, 2775, 2777, 2325,
+ 2325, 2325, 2778, 2779, 2780, 2781, 2325, 2782, 2783, 2784,
+ 2784, 2778, 2785, 2786, 2786, 2787, 2788, 2789, 2790, 2791,
+ 2325, 2792, 2793, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2794, 2794, 2794, 2795, 2796, 2325, 2325, 2325, 2325,
+ 2325, 2797, 2797, 2796, 2796, 1253, 2798, 2799, 2799, 2325,
+ 2325, 2325, 2325, 2325, 2800, 2801, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2802, 2803, 2804, 2805, 2806, 2806,
+ 2325, 2806, 2325, 2807, 2325, 2325, 2808, 2809, 2810, 2325,
+ 2325, 2325, 2811, 2812, 2813, 2814, 2813, 2814, 2814, 2815,
+
+ 2325, 2801, 2325, 2325, 2816, 2801, 2817, 2325, 2818, 2819,
+ 2325, 2801, 2325, 2325, 2801, 2801, 2801, 2325, 2820, 2821,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2822, 2822, 2823, 2325,
+ 2325, 2325, 2325, 2824, 2824, 2325, 2825, 2826, 2827, 2325,
+ 2325, 2325, 2325, 2828, 2325, 2829, 2830, 2325, 2325, 2325,
+ 2325, 2325, 2831, 2325, 2832, 2833, 2834, 2325, 2325, 2325,
+ 2816, 2325, 2325, 2325, 2325, 2325, 2835, 2325, 2325, 2325,
+ 2325, 2325, 2325, 1373, 2325, 2325, 1374, 2325, 2325, 2325,
+ 2325, 2325, 2836, 2837, 2325, 2325, 2325, 2325, 2838, 2839,
+ 2840, 2841, 2841, 2842, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2829, 2325, 2325, 2325, 2325, 2325, 2843, 2325, 2844, 2845,
+ 2325, 2846, 2325, 2846, 2846, 2846, 2846, 1417, 1417, 1417,
+ 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417,
+ 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417,
+ 1417, 1417, 1417, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2847, 2325, 2325, 2325, 2325, 2848, 2849, 2850,
+ 2325, 2325, 2829, 2325, 2851, 2325, 2325, 2325, 2325, 2852,
+ 2853, 2854, 2855, 2854, 2854, 2854, 2325, 2854, 2854, 2854,
+ 2854, 2325, 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
+ 2325, 2856, 2325, 2325, 2325, 2325, 2857, 2325, 2857, 2857,
+
+ 2325, 2858, 2858, 2325, 2858, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2859, 2860, 2325, 2325, 2325, 2861, 2325, 2325, 2325,
+ 2325, 2325, 2862, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2863, 2864, 2864, 2865, 2866, 2866, 2867, 2325, 2325, 2868,
+ 2325, 2325, 2325, 2869, 2869, 2869, 2869, 2869, 2869, 2869,
+ 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869,
+ 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2869, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2852, 2870, 2854, 2871, 2854, 2855, 2854, 2854, 2854,
+ 2871, 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
+
+ 2854, 2854, 2854, 2854, 2854, 2872, 2854, 2854, 2854, 2854,
+ 2854, 2854, 2854, 2856, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2857, 2857, 2858, 2858, 2858, 2858, 1506, 1507, 2325, 2325,
+ 2325, 2859, 2873, 2874, 2873, 2873, 2873, 2325, 2873, 2873,
+ 2873, 2873, 2325, 2873, 2873, 2873, 2873, 2873, 2873, 2873,
+ 2873, 2875, 2325, 2325, 2876, 2325, 2876, 2876, 2325, 2325,
+ 2325, 2877, 2878, 2878, 2878, 2879, 2880, 2880, 2881, 2325,
+ 2325, 2325, 2325, 2325, 2869, 2869, 2869, 2869, 2869, 2869,
+ 2325, 2869, 2869, 2869, 2869, 2869, 2869, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2852, 2870, 2870, 2870, 2871, 2325, 2325,
+
+ 2854, 2872, 2325, 2854, 2854, 2854, 2854, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2857, 2857, 2858, 2858, 1506, 2882,
+ 2858, 2858, 2858, 2883, 2858, 2858, 2858, 2858, 2858, 2325,
+ 2858, 2858, 2858, 2858, 2858, 2325, 2325, 2876, 2873, 2884,
+ 2873, 2874, 2873, 2873, 2873, 2884, 2873, 2873, 2873, 2873,
+ 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2873,
+ 2885, 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2886, 2325,
+ 2876, 2876, 2325, 2325, 2878, 2878, 2878, 2878, 2879, 2880,
+ 2887, 2888, 2325, 2325, 2325, 2325, 2325, 2889, 2889, 2889,
+ 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2325, 2325, 2325,
+
+ 2325, 2870, 2870, 2325, 2325, 2325, 2325, 2325, 2325, 2854,
+ 2854, 2854, 2854, 2325, 2854, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2857, 2857, 2858, 2858, 1506, 2890, 2891, 2890, 2873,
+ 2890, 2890, 2858, 2890, 2890, 2890, 2890, 2858, 2890, 2890,
+ 2890, 2890, 2890, 2890, 2890, 2890, 2858, 2892, 2858, 2858,
+ 2858, 2858, 1730, 2858, 1730, 1730, 2858, 2325, 2325, 2884,
+ 2325, 2325, 2873, 2885, 2325, 2873, 2873, 2873, 2873, 2325,
+ 2325, 2325, 2876, 2876, 2893, 2325, 2878, 2878, 2878, 1779,
+ 2887, 2894, 2887, 2887, 2887, 2887, 2895, 2887, 2887, 2887,
+ 2887, 2887, 2325, 2325, 2325, 2889, 2889, 2889, 2889, 2889,
+
+ 2889, 2325, 2870, 2870, 2325, 2325, 2325, 2325, 2854, 2854,
+ 2854, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2857, 2857,
+ 2858, 2858, 2858, 2858, 2858, 2858, 2896, 2858, 2858, 2858,
+ 2858, 2858, 1730, 2858, 2858, 2858, 2858, 2858, 2890, 2873,
+ 2897, 2890, 2891, 2890, 2873, 2890, 2890, 2897, 2890, 2890,
+ 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
+ 2890, 2890, 2898, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
+ 2899, 2858, 2858, 2858, 2858, 2858, 2858, 1730, 1730, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2873, 2873, 2873, 2873, 2325,
+ 2873, 2325, 2325, 2876, 2876, 2325, 2878, 2878, 1779, 2887,
+
+ 2900, 2887, 2887, 2887, 2325, 2325, 2325, 2889, 2889, 2325,
+ 2870, 2870, 2325, 2325, 2325, 2325, 2854, 2854, 2854, 2325,
+ 2325, 2325, 2901, 2325, 2857, 2858, 2858, 2858, 2858, 2858,
+ 2858, 2902, 2858, 2858, 2858, 2858, 1948, 2858, 2858, 2890,
+ 2898, 2858, 2890, 2890, 2890, 2890, 2858, 2858, 2858, 2858,
+ 2858, 2858, 2858, 1730, 1730, 2325, 2325, 2325, 2325, 2873,
+ 2873, 2873, 2325, 2325, 2325, 2876, 2876, 2325, 2878, 2878,
+ 2887, 2887, 2887, 2903, 2887, 2887, 2887, 2887, 2887, 2900,
+ 2887, 2887, 2887, 2887, 2887, 2325, 2325, 2325, 2325, 2870,
+ 2870, 2325, 2325, 2325, 2325, 2854, 2854, 2325, 2854, 2325,
+
+ 2325, 2325, 2325, 2857, 2858, 2858, 2858, 2902, 2858, 2858,
+ 2858, 2858, 2858, 2858, 2858, 2890, 2890, 2890, 2890, 2858,
+ 2890, 2858, 2858, 2858, 2858, 2858, 2858, 1730, 1730, 2325,
+ 2325, 2325, 2325, 2873, 2873, 2873, 2325, 2325, 2876, 2878,
+ 2904, 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2325, 2325,
+ 2325, 2870, 2325, 2325, 2325, 2325, 2854, 2325, 2854, 2325,
+ 2325, 2325, 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858,
+ 2858, 2858, 2890, 2890, 2890, 2858, 2858, 2858, 2858, 2858,
+ 2858, 2858, 1730, 1730, 2325, 2325, 2325, 2325, 2873, 2873,
+ 2325, 2873, 2325, 2325, 2876, 2878, 2904, 2887, 2887, 2887,
+
+ 2887, 2887, 2887, 2887, 2325, 2870, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858,
+ 2858, 2890, 2890, 2890, 2858, 2858, 2858, 2026, 2858, 1730,
+ 2325, 2325, 2325, 2325, 2873, 2325, 2873, 2325, 2325, 2887,
+ 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2325, 2325, 2858,
+ 2858, 2858, 2858, 2858, 2858, 2858, 2890, 2890, 2858, 2890,
+ 2858, 2858, 2858, 2858, 1730, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2887, 2887, 2887, 2887, 2887, 2887, 2887, 2858, 2858,
+ 2858, 2858, 2858, 2858, 2858, 2890, 2858, 2890, 2858, 2858,
+ 2858, 2325, 2325, 2887, 2887, 2887, 2887, 2887, 2887, 2858,
+
+ 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2887,
+ 2887, 2887, 2887, 2858, 2858, 2858, 2858, 2858, 2887, 2887,
+ 2887, 2858, 2887, 2887, 0, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325
+ } ;
+
+static yyconst flex_int16_t yy_nxt[36577] =
+ { 0,
+ 2325, 329, 69, 2325, 329, 2325, 70, 70, 70, 70,
+ 70, 69, 267, 432, 852, 70, 70, 70, 70, 70,
+ 265, 1023, 431, 70, 266, 70, 98, 70, 99, 98,
+ 331, 271, 70, 331, 70, 272, 70, 333, 340, 100,
+ 301, 334, 101, 102, 103, 256, 257, 256, 256, 341,
+ 70, 258, 259, 258, 258, 256, 257, 256, 256, 70,
+ 287, 859, 347, 288, 260, 347, 300, 261, 262, 263,
+ 300, 269, 308, 300, 289, 307, 300, 558, 300, 309,
+ 70, 397, 300, 398, 270, 300, 1023, 754, 559, 70,
+ 71, 72, 73, 74, 72, 71, 75, 76, 77, 78,
+
+ 79, 80, 81, 81, 71, 82, 81, 83, 84, 71,
+ 83, 85, 81, 86, 71, 70, 81, 87, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 81,
+ 89, 81, 71, 88, 88, 88, 88, 88, 88, 90,
+ 88, 91, 88, 88, 88, 88, 92, 93, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 94, 71, 95,
+ 96, 97, 69, 792, 620, 560, 105, 105, 105, 105,
+ 105, 300, 438, 494, 69, 438, 496, 106, 105, 105,
+ 105, 105, 105, 105, 265, 105, 152, 105, 266, 106,
+
+ 153, 153, 154, 153, 153, 105, 152, 105, 524, 105,
+ 153, 153, 154, 153, 153, 401, 402, 153, 402, 153,
+ 105, 155, 310, 525, 310, 310, 561, 153, 562, 153,
+ 157, 155, 105, 852, 158, 158, 159, 158, 158, 324,
+ 325, 324, 324, 451, 155, 451, 451, 402, 311, 524,
+ 105, 158, 157, 158, 155, 160, 158, 158, 159, 158,
+ 158, 524, 105, 108, 109, 281, 108, 886, 110, 111,
+ 111, 111, 111, 158, 153, 158, 329, 160, 160, 329,
+ 363, 364, 363, 363, 153, 112, 162, 111, 540, 111,
+ 163, 163, 163, 163, 163, 1279, 358, 162, 358, 358,
+
+ 160, 163, 163, 163, 163, 163, 365, 163, 158, 163,
+ 390, 164, 111, 390, 355, 385, 355, 355, 163, 360,
+ 163, 356, 164, 524, 2325, 390, 2325, 2325, 725, 365,
+ 158, 2325, 166, 397, 164, 398, 167, 167, 167, 167,
+ 167, 884, 111, 108, 109, 164, 108, 525, 110, 111,
+ 111, 111, 111, 167, 301, 167, 467, 168, 467, 467,
+ 314, 257, 314, 314, 163, 112, 725, 111, 331, 111,
+ 404, 331, 404, 315, 676, 163, 316, 317, 318, 166,
+ 168, 730, 524, 167, 167, 167, 167, 167, 677, 300,
+ 333, 170, 111, 557, 334, 171, 171, 171, 171, 171,
+
+ 167, 404, 167, 755, 168, 386, 386, 386, 386, 524,
+ 167, 606, 171, 606, 171, 540, 172, 524, 2325, 402,
+ 387, 402, 111, 114, 115, 68, 114, 168, 116, 70,
+ 70, 117, 118, 119, 120, 120, 525, 852, 120, 172,
+ 120, 298, 606, 120, 120, 121, 540, 70, 120, 122,
+ 402, 524, 564, 386, 386, 386, 386, 167, 280, 170,
+ 280, 280, 525, 171, 171, 171, 171, 171, 387, 171,
+ 281, 120, 122, 120, 314, 257, 314, 314, 569, 524,
+ 171, 571, 171, 731, 172, 2325, 402, 315, 402, 267,
+ 316, 317, 318, 1201, 367, 368, 367, 367, 820, 123,
+
+ 420, 123, 124, 114, 115, 68, 114, 172, 116, 70,
+ 70, 117, 118, 119, 120, 120, 369, 402, 120, 319,
+ 120, 319, 319, 120, 120, 121, 524, 70, 120, 122,
+ 347, 580, 320, 347, 582, 321, 317, 171, 513, 174,
+ 525, 703, 285, 175, 175, 175, 175, 175, 269, 783,
+ 520, 120, 122, 120, 298, 343, 343, 343, 343, 343,
+ 175, 270, 175, 297, 176, 521, 687, 364, 364, 364,
+ 364, 683, 343, 285, 343, 446, 343, 446, 446, 123,
+ 447, 123, 124, 126, 127, 68, 126, 176, 128, 70,
+ 70, 129, 130, 365, 131, 131, 688, 515, 131, 343,
+
+ 131, 301, 524, 131, 131, 70, 1159, 70, 131, 132,
+ 270, 525, 368, 368, 368, 368, 365, 175, 358, 174,
+ 358, 358, 345, 175, 175, 175, 175, 175, 2007, 343,
+ 685, 131, 132, 131, 369, 352, 352, 352, 352, 352,
+ 175, 360, 175, 270, 176, 386, 386, 388, 386, 756,
+ 401, 402, 352, 402, 352, 310, 352, 310, 310, 68,
+ 387, 68, 133, 126, 127, 68, 126, 176, 128, 70,
+ 70, 129, 130, 656, 131, 131, 725, 432, 131, 352,
+ 131, 311, 402, 131, 131, 70, 431, 70, 131, 132,
+ 391, 391, 391, 391, 524, 732, 725, 175, 425, 425,
+
+ 425, 425, 354, 426, 2013, 425, 425, 425, 425, 352,
+ 426, 131, 132, 131, 431, 449, 450, 449, 449, 432,
+ 256, 257, 256, 256, 433, 431, 431, 2014, 435, 540,
+ 436, 475, 259, 475, 475, 479, 480, 479, 479, 68,
+ 738, 68, 133, 134, 135, 136, 135, 135, 134, 137,
+ 137, 138, 137, 137, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 137, 134, 137, 134,
+ 137, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 134, 137, 134, 134, 139, 139, 139, 139,
+
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 134, 134, 134, 137, 139, 134, 136, 134, 134, 524,
+ 141, 141, 141, 141, 141, 525, 358, 178, 358, 358,
+ 524, 179, 179, 179, 179, 179, 524, 141, 178, 141,
+ 524, 141, 179, 179, 179, 179, 179, 524, 179, 360,
+ 179, 889, 180, 725, 407, 438, 407, 407, 438, 179,
+ 744, 179, 69, 180, 141, 408, 70, 70, 70, 70,
+ 70, 477, 477, 477, 477, 180, 540, 478, 760, 407,
+ 191, 407, 407, 70, 540, 70, 180, 70, 298, 587,
+
+ 408, 587, 587, 743, 141, 134, 136, 134, 134, 564,
+ 141, 141, 141, 141, 141, 179, 2015, 69, 761, 409,
+ 70, 70, 70, 70, 70, 70, 179, 141, 783, 141,
+ 355, 141, 355, 355, 524, 191, 410, 356, 70, 524,
+ 70, 234, 70, 524, 409, 235, 235, 235, 235, 235,
+ 70, 69, 68, 525, 141, 198, 198, 198, 198, 198,
+ 660, 410, 235, 662, 235, 70, 235, 322, 322, 322,
+ 322, 524, 198, 323, 198, 892, 198, 324, 325, 324,
+ 324, 1051, 540, 2016, 141, 143, 144, 143, 143, 235,
+ 145, 145, 145, 145, 145, 70, 725, 69, 68, 198,
+
+ 750, 198, 198, 198, 198, 198, 2325, 146, 1364, 145,
+ 476, 147, 476, 476, 322, 322, 322, 322, 198, 235,
+ 198, 494, 198, 260, 496, 524, 261, 262, 737, 198,
+ 319, 234, 319, 319, 147, 235, 235, 235, 235, 235,
+ 745, 569, 687, 315, 571, 198, 316, 317, 324, 325,
+ 324, 324, 235, 524, 235, 237, 235, 1022, 875, 238,
+ 238, 238, 238, 238, 145, 143, 144, 143, 143, 885,
+ 145, 145, 145, 145, 145, 198, 239, 237, 238, 235,
+ 240, 238, 238, 238, 238, 238, 850, 146, 876, 145,
+ 483, 147, 524, 580, 297, 298, 582, 524, 239, 298,
+
+ 238, 483, 240, 241, 485, 297, 486, 2020, 493, 235,
+ 302, 247, 524, 525, 147, 248, 248, 248, 248, 248,
+ 1132, 319, 896, 319, 319, 241, 358, 793, 358, 358,
+ 620, 888, 248, 238, 248, 247, 248, 316, 317, 248,
+ 248, 248, 248, 248, 145, 148, 149, 148, 148, 360,
+ 145, 145, 145, 145, 145, 238, 248, 871, 248, 248,
+ 248, 427, 319, 255, 319, 319, 524, 150, 255, 145,
+ 654, 146, 640, 654, 255, 320, 627, 255, 321, 317,
+ 524, 280, 255, 248, 525, 626, 1132, 255, 660, 248,
+ 281, 662, 2021, 566, 146, 566, 566, 407, 525, 407,
+
+ 407, 443, 443, 443, 443, 443, 320, 540, 408, 321,
+ 317, 494, 524, 248, 496, 255, 873, 416, 443, 525,
+ 443, 524, 443, 852, 145, 148, 149, 148, 148, 270,
+ 145, 145, 145, 145, 145, 504, 504, 504, 504, 524,
+ 525, 255, 887, 255, 255, 443, 524, 150, 524, 145,
+ 455, 146, 409, 505, 258, 259, 258, 258, 2325, 507,
+ 2325, 2325, 298, 2325, 402, 2325, 402, 260, 445, 410,
+ 261, 262, 263, 521, 146, 443, 524, 456, 569, 457,
+ 458, 571, 1097, 451, 459, 451, 451, 460, 461, 891,
+ 2325, 462, 895, 463, 2325, 402, 464, 1012, 465, 391,
+
+ 391, 391, 391, 2325, 145, 181, 182, 183, 184, 182,
+ 181, 185, 186, 186, 186, 186, 181, 181, 181, 181,
+ 181, 187, 181, 181, 181, 181, 181, 181, 186, 181,
+ 186, 181, 186, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 181, 186, 181, 181, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 181, 181, 181, 186, 188, 68, 68, 69,
+ 68, 189, 68, 70, 70, 70, 70, 70, 68, 68,
+
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 70, 68, 70, 68, 70, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 68, 70, 68, 68,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 68, 68, 68, 70, 190, 68,
+ 68, 69, 68, 68, 68, 192, 70, 70, 70, 70,
+ 68, 68, 68, 68, 193, 68, 193, 194, 195, 193,
+ 195, 68, 70, 68, 70, 68, 70, 193, 193, 193,
+
+ 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+ 193, 193, 193, 193, 193, 193, 193, 193, 68, 196,
+ 68, 68, 193, 193, 193, 193, 193, 193, 193, 193,
+ 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+ 193, 193, 193, 193, 193, 193, 68, 68, 68, 70,
+ 68, 199, 68, 69, 68, 68, 199, 200, 201, 202,
+ 200, 70, 199, 199, 199, 199, 199, 199, 199, 199,
+ 199, 199, 203, 199, 70, 199, 200, 199, 70, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
+
+ 199, 70, 199, 199, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204, 68, 199,
+ 68, 200, 204, 205, 206, 207, 206, 206, 205, 208,
+ 209, 210, 208, 208, 205, 205, 205, 205, 205, 205,
+ 205, 205, 205, 205, 211, 205, 208, 205, 208, 205,
+ 208, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+ 212, 212, 205, 208, 205, 205, 212, 212, 212, 212,
+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+
+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+ 205, 205, 205, 208, 212, 214, 215, 68, 214, 524,
+ 216, 70, 70, 217, 218, 524, 219, 219, 607, 404,
+ 219, 404, 219, 852, 934, 219, 219, 220, 483, 70,
+ 219, 221, 524, 298, 2022, 367, 368, 367, 367, 483,
+ 620, 893, 485, 390, 486, 455, 390, 540, 597, 456,
+ 404, 457, 458, 219, 221, 219, 459, 369, 390, 460,
+ 461, 894, 783, 462, 524, 463, 2325, 404, 464, 404,
+ 465, 391, 391, 391, 391, 950, 807, 574, 574, 574,
+ 574, 68, 1098, 68, 222, 214, 215, 68, 214, 487,
+
+ 216, 70, 70, 217, 218, 575, 219, 219, 404, 760,
+ 219, 577, 219, 301, 2023, 219, 219, 220, 540, 70,
+ 219, 221, 258, 259, 258, 258, 927, 386, 386, 386,
+ 386, 322, 322, 322, 322, 260, 255, 323, 261, 262,
+ 263, 255, 387, 219, 221, 219, 903, 255, 2325, 513,
+ 255, 952, 812, 906, 280, 255, 280, 976, 280, 280,
+ 255, 500, 300, 281, 363, 364, 363, 363, 281, 580,
+ 783, 68, 582, 68, 222, 68, 223, 69, 223, 223,
+ 68, 70, 224, 70, 70, 70, 68, 977, 255, 68,
+ 365, 68, 2024, 314, 257, 314, 314, 68, 70, 68,
+
+ 70, 68, 70, 627, 401, 606, 315, 606, 519, 316,
+ 317, 318, 626, 365, 255, 1242, 255, 255, 255, 955,
+ 783, 270, 514, 255, 68, 70, 68, 68, 451, 255,
+ 451, 451, 255, 255, 852, 420, 606, 255, 648, 648,
+ 648, 648, 255, 364, 364, 364, 364, 449, 450, 449,
+ 449, 524, 68, 68, 68, 70, 68, 68, 223, 69,
+ 223, 223, 68, 70, 224, 70, 70, 70, 68, 365,
+ 255, 68, 875, 68, 928, 368, 368, 368, 368, 68,
+ 70, 68, 70, 68, 70, 386, 386, 388, 386, 852,
+ 1019, 467, 365, 467, 467, 991, 255, 369, 255, 255,
+
+ 387, 852, 407, 524, 407, 407, 68, 70, 68, 68,
+ 392, 392, 392, 392, 984, 2325, 1004, 599, 733, 600,
+ 392, 392, 393, 392, 734, 735, 524, 601, 446, 602,
+ 446, 446, 1727, 447, 68, 68, 68, 70, 68, 226,
+ 227, 226, 226, 1015, 75, 228, 228, 229, 230, 80,
+ 81, 81, 2325, 606, 81, 606, 81, 608, 2325, 81,
+ 81, 228, 1000, 228, 81, 228, 425, 425, 425, 425,
+ 467, 426, 467, 467, 609, 475, 259, 475, 475, 1740,
+ 407, 783, 407, 407, 606, 1740, 626, 81, 228, 81,
+ 951, 408, 407, 807, 407, 407, 626, 626, 626, 407,
+
+ 818, 407, 407, 408, 524, 231, 477, 477, 477, 477,
+ 408, 479, 480, 479, 479, 95, 999, 95, 232, 226,
+ 227, 226, 226, 524, 75, 228, 228, 229, 230, 80,
+ 81, 81, 1052, 852, 81, 409, 81, 1014, 520, 81,
+ 81, 228, 298, 228, 81, 228, 476, 409, 476, 476,
+ 1017, 483, 410, 521, 409, 2056, 852, 587, 617, 587,
+ 587, 1727, 261, 262, 410, 618, 524, 81, 228, 81,
+ 626, 410, 524, 953, 660, 627, 812, 662, 431, 525,
+ 626, 626, 626, 432, 629, 231, 422, 1013, 431, 431,
+ 431, 1200, 650, 494, 436, 95, 496, 95, 232, 242,
+
+ 242, 69, 242, 242, 242, 243, 243, 243, 243, 243,
+ 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
+ 242, 242, 243, 242, 243, 242, 243, 244, 244, 244,
+ 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+ 244, 244, 244, 244, 244, 244, 244, 244, 242, 243,
+ 242, 242, 244, 244, 244, 244, 244, 244, 244, 244,
+ 244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
+ 244, 244, 244, 244, 244, 244, 242, 242, 242, 243,
+ 244, 242, 242, 69, 242, 242, 242, 243, 243, 243,
+ 243, 243, 242, 242, 242, 242, 242, 242, 242, 242,
+
+ 242, 242, 242, 242, 243, 242, 243, 242, 243, 245,
+ 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+ 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+ 242, 243, 242, 242, 245, 245, 245, 245, 245, 245,
+ 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+ 245, 245, 245, 245, 245, 245, 245, 245, 242, 242,
+ 242, 243, 245, 249, 249, 250, 249, 249, 249, 251,
+ 251, 251, 251, 251, 249, 249, 249, 249, 249, 249,
+ 252, 249, 249, 253, 249, 249, 251, 249, 251, 249,
+ 254, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+
+ 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+ 253, 253, 249, 254, 249, 249, 253, 253, 253, 253,
+ 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+ 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+ 249, 249, 249, 251, 249, 255, 280, 524, 280, 283,
+ 255, 569, 580, 2325, 571, 582, 255, 2325, 281, 255,
+ 279, 1016, 524, 283, 284, 431, 2325, 520, 2325, 255,
+ 432, 298, 281, 431, 1132, 431, 431, 431, 432, 435,
+ 710, 436, 521, 433, 431, 431, 524, 435, 682, 436,
+ 682, 682, 972, 524, 524, 285, 726, 255, 483, 524,
+
+ 727, 260, 483, 298, 261, 262, 297, 298, 1018, 483,
+ 728, 298, 485, 483, 486, 524, 485, 297, 486, 540,
+ 493, 976, 302, 255, 540, 255, 255, 291, 291, 291,
+ 291, 291, 504, 504, 504, 504, 2057, 540, 710, 705,
+ 1132, 1020, 292, 298, 291, 404, 291, 404, 291, 710,
+ 505, 974, 712, 689, 713, 746, 507, 504, 504, 504,
+ 504, 747, 748, 710, 270, 1094, 524, 715, 298, 715,
+ 715, 291, 524, 852, 710, 505, 404, 712, 524, 713,
+ 294, 507, 297, 1124, 525, 524, 729, 298, 736, 295,
+ 1108, 525, 525, 297, 296, 525, 724, 660, 521, 525,
+
+ 662, 291, 255, 524, 525, 1021, 525, 255, 524, 297,
+ 1125, 2058, 1072, 255, 298, 525, 255, 279, 1074, 282,
+ 299, 284, 716, 301, 714, 302, 255, 524, 807, 281,
+ 710, 524, 524, 524, 812, 298, 2059, 710, 280, 717,
+ 280, 718, 298, 524, 712, 280, 713, 280, 718, 1126,
+ 281, 712, 285, 713, 255, 524, 739, 281, 524, 524,
+ 740, 749, 525, 540, 540, 742, 524, 1087, 540, 741,
+ 540, 648, 648, 648, 648, 524, 540, 540, 540, 298,
+ 255, 1088, 255, 303, 291, 291, 291, 291, 291, 525,
+ 521, 1128, 1127, 566, 540, 566, 566, 783, 720, 292,
+
+ 524, 291, 783, 291, 711, 291, 315, 1129, 520, 316,
+ 317, 711, 298, 566, 524, 566, 566, 574, 574, 574,
+ 574, 2325, 626, 521, 764, 524, 315, 627, 291, 316,
+ 317, 304, 626, 626, 626, 575, 791, 294, 422, 540,
+ 524, 577, 611, 1160, 611, 611, 295, 540, 852, 2064,
+ 407, 296, 407, 407, 783, 1242, 852, 1220, 291, 255,
+ 1114, 408, 1114, 1114, 255, 1114, 297, 1114, 1114, 540,
+ 255, 298, 524, 255, 279, 524, 282, 299, 284, 2065,
+ 301, 525, 302, 255, 524, 783, 281, 524, 574, 574,
+ 574, 574, 407, 1585, 407, 407, 407, 784, 407, 407,
+
+ 525, 783, 1280, 408, 1626, 409, 575, 408, 1115, 285,
+ 852, 255, 577, 1115, 785, 407, 540, 407, 407, 1719,
+ 1407, 305, 410, 1202, 2068, 800, 418, 800, 800, 1221,
+ 306, 821, 1308, 821, 821, 417, 408, 255, 852, 255,
+ 303, 255, 1240, 1243, 1240, 1240, 255, 409, 1704, 312,
+ 1328, 409, 255, 1930, 1407, 255, 255, 788, 255, 789,
+ 255, 255, 626, 783, 410, 255, 1308, 627, 410, 852,
+ 409, 431, 626, 626, 626, 520, 629, 2088, 422, 298,
+ 801, 431, 431, 431, 431, 827, 822, 410, 844, 432,
+ 521, 1585, 1023, 255, 431, 431, 431, 802, 650, 431,
+
+ 436, 1373, 2089, 823, 432, 1267, 1407, 1267, 1267, 431,
+ 431, 431, 844, 435, 1453, 436, 852, 298, 1308, 255,
+ 696, 255, 255, 844, 1023, 2092, 846, 255, 847, 297,
+ 1607, 698, 1374, 255, 298, 1585, 255, 255, 2093, 255,
+ 297, 255, 431, 301, 1536, 302, 255, 432, 682, 2094,
+ 682, 682, 433, 431, 431, 844, 650, 1023, 436, 2095,
+ 298, 260, 483, 1585, 261, 262, 844, 298, 1407, 846,
+ 483, 847, 1585, 483, 255, 298, 849, 710, 521, 1392,
+ 1308, 483, 298, 1023, 485, 710, 486, 1706, 710, 1023,
+ 298, 712, 1133, 713, 852, 715, 710, 715, 715, 712,
+
+ 255, 713, 255, 255, 322, 322, 322, 322, 255, 1291,
+ 323, 1291, 1291, 1023, 255, 1811, 848, 255, 279, 852,
+ 696, 283, 284, 865, 865, 865, 865, 255, 297, 844,
+ 281, 698, 851, 298, 298, 1240, 877, 1240, 1240, 297,
+ 844, 505, 724, 846, 521, 847, 867, 507, 1023, 710,
+ 716, 1585, 1824, 285, 298, 255, 908, 908, 908, 908,
+ 710, 626, 1308, 1002, 1407, 713, 627, 717, 1393, 1373,
+ 695, 626, 626, 626, 575, 791, 1308, 422, 1023, 910,
+ 577, 255, 2100, 255, 255, 385, 392, 392, 393, 392,
+ 385, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+
+ 385, 2096, 394, 385, 385, 394, 385, 385, 385, 385,
+ 385, 385, 385, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 385, 385, 385, 385, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 385, 395, 385, 385, 394, 406, 407, 2101,
+ 407, 407, 406, 406, 406, 411, 406, 2102, 406, 408,
+ 406, 406, 406, 406, 406, 406, 406, 406, 406, 406,
+ 852, 406, 406, 406, 2032, 412, 412, 412, 412, 412,
+
+ 412, 412, 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 406, 1023, 406, 406,
+ 412, 412, 412, 413, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412, 412, 412,
+ 414, 412, 412, 412, 1407, 406, 1308, 406, 412, 406,
+ 407, 2103, 407, 407, 406, 406, 417, 1407, 406, 1668,
+ 406, 418, 406, 406, 406, 406, 419, 417, 417, 1308,
+ 421, 406, 422, 406, 406, 406, 2038, 1210, 871, 1210,
+ 1210, 407, 1023, 407, 407, 280, 1585, 280, 280, 2130,
+ 500, 1585, 407, 1585, 407, 407, 852, 281, 406, 710,
+
+ 406, 406, 1023, 408, 298, 423, 1407, 280, 1407, 280,
+ 718, 1308, 2131, 712, 2325, 713, 2325, 2325, 1308, 281,
+ 1308, 935, 424, 935, 935, 1023, 1740, 406, 1407, 406,
+ 255, 407, 1612, 407, 407, 255, 608, 881, 1211, 1413,
+ 1308, 255, 408, 1212, 255, 279, 1705, 409, 283, 284,
+ 270, 872, 1825, 609, 255, 1707, 1535, 281, 710, 1407,
+ 1740, 931, 2325, 298, 410, 1407, 280, 1023, 280, 718,
+ 1585, 1308, 712, 711, 713, 1585, 936, 1308, 281, 1130,
+ 285, 1866, 255, 1407, 932, 800, 409, 800, 800, 800,
+ 1023, 800, 800, 937, 407, 1308, 407, 407, 1412, 821,
+
+ 1412, 821, 821, 410, 407, 408, 407, 407, 255, 882,
+ 255, 255, 255, 1412, 1607, 408, 1613, 255, 1342, 297,
+ 1342, 1342, 1869, 255, 298, 1308, 255, 279, 1740, 282,
+ 299, 284, 711, 301, 2325, 302, 255, 844, 1585, 281,
+ 940, 1585, 298, 981, 940, 981, 981, 2325, 844, 409,
+ 852, 846, 1740, 847, 822, 2132, 687, 941, 1585, 409,
+ 944, 941, 285, 431, 255, 2133, 410, 1762, 432, 687,
+ 945, 823, 1520, 433, 431, 431, 410, 650, 1267, 436,
+ 1267, 1267, 865, 865, 865, 865, 2325, 1612, 978, 705,
+ 255, 1762, 255, 303, 523, 1716, 1909, 523, 982, 1327,
+
+ 505, 1327, 1327, 523, 1613, 867, 507, 523, 687, 523,
+ 1715, 783, 2137, 523, 523, 983, 2138, 1210, 524, 1210,
+ 1210, 525, 526, 527, 528, 529, 523, 523, 530, 531,
+ 523, 532, 533, 523, 523, 534, 535, 523, 536, 537,
+ 538, 539, 1350, 852, 1350, 1350, 523, 540, 541, 542,
+ 543, 544, 523, 523, 545, 546, 547, 548, 523, 523,
+ 549, 550, 523, 551, 552, 553, 554, 523, 523, 523,
+ 255, 935, 852, 935, 935, 255, 852, 297, 1211, 1740,
+ 2032, 255, 298, 1212, 255, 255, 852, 255, 297, 255,
+ 483, 301, 1930, 302, 255, 298, 865, 865, 865, 865,
+
+ 1382, 483, 1382, 1382, 485, 1921, 486, 995, 995, 995,
+ 995, 852, 996, 1585, 505, 1023, 710, 997, 1740, 867,
+ 507, 298, 255, 1875, 710, 1767, 936, 710, 710, 298,
+ 1002, 1717, 713, 298, 1412, 710, 1412, 980, 1002, 710,
+ 521, 297, 712, 937, 713, 1718, 298, 1407, 255, 1412,
+ 255, 255, 297, 1585, 1585, 724, 255, 521, 297, 1308,
+ 1444, 2106, 255, 298, 1768, 255, 279, 1810, 282, 299,
+ 284, 844, 301, 1667, 302, 255, 298, 1003, 281, 1826,
+ 1023, 1202, 844, 2325, 710, 1092, 1740, 847, 1132, 298,
+ 1005, 1295, 280, 1999, 280, 718, 1910, 1740, 1002, 1812,
+
+ 713, 285, 710, 255, 281, 875, 1446, 298, 1446, 1446,
+ 280, 1740, 280, 718, 1023, 556, 1002, 1345, 713, 1345,
+ 1345, 1447, 281, 1447, 1447, 1035, 1035, 1035, 1035, 255,
+ 1036, 255, 303, 255, 1327, 1037, 1327, 1327, 255, 1346,
+ 407, 1867, 407, 407, 255, 298, 783, 255, 255, 1868,
+ 255, 408, 255, 852, 1132, 1740, 564, 255, 1001, 908,
+ 908, 908, 908, 1009, 1883, 1986, 764, 852, 908, 908,
+ 908, 908, 1454, 844, 1454, 1454, 1001, 575, 298, 1023,
+ 2149, 2151, 910, 577, 844, 255, 575, 1092, 483, 521,
+ 2153, 910, 577, 298, 1456, 409, 1456, 1456, 1462, 483,
+
+ 1462, 1462, 849, 1350, 521, 1350, 1350, 1987, 2154, 2051,
+ 1055, 255, 410, 255, 385, 392, 392, 393, 392, 385,
+ 385, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+ 2026, 394, 385, 385, 394, 385, 385, 385, 385, 385,
+ 385, 385, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 385, 385, 385, 385, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 385, 395, 385, 385, 394, 385, 2155, 2156, 385,
+
+ 2161, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+ 385, 385, 1915, 385, 385, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 603, 603, 385, 385, 385, 385, 603,
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 385, 385, 385, 385, 603, 611, 852,
+ 611, 611, 1740, 2162, 1930, 612, 2185, 612, 1740, 613,
+ 614, 710, 504, 504, 504, 504, 298, 1740, 844, 280,
+
+ 612, 280, 718, 298, 612, 712, 2186, 713, 2187, 844,
+ 1109, 281, 1092, 2188, 847, 1740, 507, 2193, 995, 995,
+ 995, 995, 2325, 996, 2061, 844, 1585, 612, 997, 407,
+ 298, 407, 407, 615, 1767, 407, 844, 407, 407, 846,
+ 408, 847, 2325, 1768, 687, 1345, 408, 1345, 1345, 1382,
+ 616, 1382, 1382, 1010, 612, 2325, 612, 406, 407, 1093,
+ 407, 407, 406, 406, 417, 711, 406, 1346, 406, 418,
+ 406, 406, 406, 406, 417, 417, 417, 687, 621, 406,
+ 422, 406, 406, 406, 409, 1911, 1621, 1095, 1585, 1412,
+ 409, 1412, 2194, 574, 574, 574, 574, 1412, 1414, 1056,
+
+ 1065, 410, 852, 852, 1412, 483, 406, 410, 406, 406,
+ 298, 1142, 407, 622, 407, 407, 483, 577, 852, 485,
+ 1407, 486, 1822, 408, 981, 1308, 981, 981, 1740, 852,
+ 623, 852, 1308, 1411, 1585, 406, 2325, 406, 406, 407,
+ 2157, 407, 407, 406, 406, 417, 2325, 406, 1922, 406,
+ 418, 406, 406, 406, 406, 417, 417, 417, 687, 621,
+ 406, 422, 406, 406, 406, 2124, 710, 409, 875, 1096,
+ 1412, 298, 1412, 1607, 1988, 1066, 2050, 710, 1412, 982,
+ 1002, 844, 713, 1414, 410, 1412, 298, 406, 1973, 406,
+ 406, 1407, 844, 2205, 622, 1092, 983, 847, 710, 710,
+
+ 1622, 2208, 852, 298, 298, 624, 2032, 1874, 1930, 710,
+ 710, 623, 1002, 712, 521, 713, 406, 2210, 406, 406,
+ 407, 2211, 407, 407, 406, 406, 406, 411, 406, 2212,
+ 406, 408, 406, 406, 406, 406, 406, 406, 406, 406,
+ 406, 406, 852, 406, 406, 406, 1119, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412, 406, 1585,
+ 406, 406, 412, 412, 412, 413, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 414, 412, 412, 412, 2105, 406, 852, 406,
+
+ 412, 610, 630, 1740, 611, 630, 610, 610, 610, 612,
+ 610, 631, 610, 613, 632, 2019, 610, 1740, 610, 610,
+ 610, 710, 2023, 610, 631, 610, 298, 610, 612, 844,
+ 852, 852, 710, 852, 298, 1002, 710, 713, 2325, 2231,
+ 844, 298, 1762, 846, 280, 847, 280, 718, 2107, 2232,
+ 1002, 612, 713, 610, 984, 852, 281, 634, 2233, 696,
+ 687, 1035, 1035, 1035, 1035, 984, 1036, 2234, 1203, 2239,
+ 698, 1037, 1117, 2088, 635, 2060, 1198, 2125, 612, 610,
+ 612, 610, 610, 406, 407, 2325, 407, 407, 406, 406,
+ 406, 411, 406, 2027, 406, 408, 406, 406, 406, 406,
+
+ 636, 406, 406, 636, 406, 406, 1919, 406, 406, 406,
+ 1001, 637, 637, 637, 637, 637, 637, 637, 637, 637,
+ 637, 637, 637, 637, 637, 637, 637, 637, 637, 637,
+ 637, 637, 406, 1023, 406, 406, 637, 637, 637, 638,
+ 637, 637, 637, 637, 637, 637, 637, 637, 637, 637,
+ 637, 637, 637, 637, 637, 637, 639, 637, 637, 637,
+ 852, 406, 2141, 406, 637, 406, 407, 2248, 407, 407,
+ 406, 406, 417, 852, 406, 1585, 406, 418, 406, 406,
+ 406, 406, 419, 417, 417, 1740, 421, 406, 422, 406,
+ 406, 406, 1780, 2249, 2100, 710, 483, 2267, 1023, 2269,
+
+ 298, 298, 852, 280, 2270, 280, 718, 483, 844, 712,
+ 485, 713, 486, 298, 406, 281, 406, 406, 2126, 844,
+ 523, 423, 1092, 523, 521, 984, 852, 1023, 2271, 523,
+ 696, 2136, 1974, 523, 2017, 523, 984, 1585, 424, 1203,
+ 523, 698, 1123, 406, 1542, 406, 406, 407, 2182, 407,
+ 407, 406, 406, 406, 640, 406, 1199, 406, 418, 406,
+ 406, 406, 406, 406, 406, 406, 406, 417, 406, 711,
+ 406, 406, 406, 1023, 641, 641, 641, 641, 641, 641,
+ 641, 641, 641, 641, 641, 641, 641, 641, 641, 641,
+ 641, 641, 641, 641, 641, 406, 2018, 406, 406, 641,
+
+ 641, 641, 642, 641, 641, 641, 641, 641, 641, 641,
+ 641, 641, 641, 641, 641, 641, 641, 641, 641, 643,
+ 641, 641, 641, 1585, 406, 2000, 406, 641, 406, 407,
+ 1585, 407, 407, 406, 406, 417, 852, 406, 1023, 406,
+ 418, 406, 406, 406, 406, 419, 417, 417, 852, 421,
+ 406, 422, 406, 406, 406, 2153, 844, 504, 504, 504,
+ 504, 298, 2159, 2325, 2155, 2325, 2325, 844, 2292, 2293,
+ 1092, 1407, 847, 2193, 1407, 1109, 2017, 406, 2231, 406,
+ 406, 507, 1413, 1308, 423, 2325, 1317, 504, 504, 504,
+ 504, 1446, 2127, 1446, 1446, 646, 1447, 2233, 1447, 1447,
+
+ 1240, 424, 1240, 1240, 2163, 505, 406, 1196, 406, 695,
+ 695, 507, 695, 695, 695, 695, 695, 520, 695, 695,
+ 695, 696, 695, 695, 695, 695, 695, 695, 695, 695,
+ 697, 695, 698, 695, 695, 695, 695, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 695, 695,
+ 695, 695, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 695, 695, 695, 695,
+ 699, 255, 2325, 852, 2325, 2325, 255, 852, 574, 574,
+
+ 574, 574, 255, 710, 1740, 255, 255, 2006, 298, 703,
+ 284, 280, 2005, 280, 718, 255, 1142, 1002, 852, 713,
+ 710, 1996, 577, 281, 1543, 298, 1163, 2325, 1163, 1163,
+ 1412, 710, 1412, 1993, 1002, 852, 713, 408, 1412, 1548,
+ 2325, 285, 2325, 255, 407, 1412, 407, 407, 407, 687,
+ 407, 407, 2052, 2325, 1122, 408, 2053, 2325, 1462, 408,
+ 1462, 1462, 1116, 2062, 687, 574, 574, 574, 574, 255,
+ 852, 255, 255, 255, 2032, 687, 2177, 1001, 255, 875,
+ 297, 409, 1214, 575, 255, 298, 1930, 255, 279, 577,
+ 282, 299, 284, 1823, 301, 1920, 302, 255, 410, 409,
+
+ 281, 2165, 852, 409, 2325, 1164, 2325, 2325, 407, 852,
+ 407, 407, 2025, 710, 1992, 1407, 410, 1172, 298, 408,
+ 410, 1771, 852, 285, 710, 255, 2325, 712, 710, 713,
+ 2325, 752, 1163, 298, 1163, 1163, 280, 2325, 280, 718,
+ 852, 1023, 1002, 1378, 713, 1378, 1378, 1508, 281, 1508,
+ 1508, 255, 875, 255, 303, 255, 1865, 852, 1379, 875,
+ 255, 1173, 297, 409, 852, 2179, 255, 298, 2122, 255,
+ 279, 1861, 282, 299, 284, 1740, 753, 1215, 302, 255,
+ 410, 710, 281, 1727, 1740, 2180, 298, 608, 1995, 280,
+ 1218, 280, 718, 1380, 1772, 712, 1579, 713, 1579, 1579,
+
+ 1781, 281, 1001, 1740, 609, 285, 1023, 255, 407, 1740,
+ 407, 407, 407, 1509, 407, 407, 2123, 2325, 407, 408,
+ 407, 407, 715, 408, 715, 715, 2181, 844, 1244, 408,
+ 1244, 1244, 298, 255, 2134, 255, 303, 255, 844, 875,
+ 783, 846, 255, 847, 1256, 1219, 1244, 1256, 255, 298,
+ 852, 255, 255, 1918, 255, 711, 255, 1023, 852, 2189,
+ 564, 255, 2135, 409, 2325, 710, 1579, 409, 1579, 1579,
+ 298, 1246, 1692, 409, 1692, 1692, 710, 1298, 1917, 1002,
+ 410, 713, 1254, 784, 410, 2066, 687, 844, 1255, 255,
+ 410, 1277, 298, 1692, 1299, 1692, 1692, 1554, 844, 798,
+
+ 785, 1092, 1412, 847, 1414, 631, 2164, 2010, 1412, 2010,
+ 2010, 2145, 1288, 1414, 2178, 255, 799, 255, 385, 1919,
+ 1916, 385, 1023, 385, 385, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 1355, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 385, 385, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 385, 385, 385,
+ 385, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 385, 385, 385, 385, 780,
+
+ 385, 392, 392, 393, 392, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 385, 385, 1915, 394, 385, 385,
+ 394, 385, 385, 385, 385, 385, 385, 385, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 385,
+ 385, 385, 385, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 385, 395, 385,
+ 385, 394, 611, 2325, 611, 611, 852, 844, 2325, 612,
+ 1914, 612, 298, 613, 614, 483, 1913, 1908, 844, 1907,
+
+ 298, 1092, 710, 847, 612, 875, 483, 298, 612, 485,
+ 875, 486, 710, 710, 1740, 1906, 712, 298, 713, 710,
+ 280, 852, 280, 718, 298, 1905, 1002, 280, 713, 280,
+ 718, 612, 281, 712, 1023, 713, 1023, 615, 1023, 281,
+ 407, 1902, 407, 407, 2218, 1336, 1873, 1336, 1336, 1276,
+ 1630, 408, 1630, 1630, 616, 1994, 408, 1278, 612, 1293,
+ 612, 611, 1289, 611, 611, 1549, 2235, 1412, 612, 1412,
+ 612, 2026, 613, 614, 407, 1412, 407, 407, 1508, 1294,
+ 1508, 1508, 1412, 612, 1780, 408, 1001, 612, 2146, 2082,
+ 852, 710, 1930, 711, 2032, 409, 298, 1055, 852, 1023,
+
+ 409, 1023, 710, 1023, 844, 1002, 1930, 713, 710, 298,
+ 612, 1631, 410, 298, 852, 844, 615, 410, 846, 710,
+ 847, 695, 712, 1023, 713, 1385, 1940, 1385, 1385, 409,
+ 1941, 2325, 1895, 616, 695, 1337, 695, 612, 1894, 612,
+ 611, 852, 611, 611, 1509, 844, 410, 612, 852, 612,
+ 298, 613, 614, 875, 852, 1383, 844, 2169, 2032, 1092,
+ 2226, 847, 612, 710, 1356, 1308, 612, 1412, 298, 1412,
+ 1384, 280, 1414, 280, 718, 1412, 710, 1002, 2083, 713,
+ 1386, 298, 1412, 281, 280, 2325, 280, 718, 1023, 612,
+ 712, 2325, 713, 2325, 2325, 615, 281, 1387, 2213, 2067,
+
+ 2170, 1163, 1407, 1163, 1163, 2141, 786, 875, 1378, 1470,
+ 1378, 1378, 616, 2325, 1317, 852, 612, 2076, 612, 611,
+ 852, 611, 611, 1379, 2032, 2325, 612, 1389, 612, 1893,
+ 613, 614, 2325, 852, 2325, 2325, 1930, 1001, 1390, 1876,
+ 1875, 612, 1770, 1407, 2139, 612, 1555, 687, 255, 1412,
+ 711, 1412, 852, 255, 2325, 1317, 608, 1412, 1380, 255,
+ 1407, 1865, 255, 255, 1412, 852, 1862, 255, 612, 1543,
+ 1023, 2219, 1317, 609, 615, 1412, 407, 1412, 407, 407,
+ 852, 1023, 695, 1412, 2032, 787, 2104, 408, 1550, 852,
+ 1412, 616, 2171, 695, 695, 612, 1930, 612, 406, 407,
+
+ 255, 407, 407, 406, 406, 417, 852, 406, 2221, 406,
+ 418, 406, 406, 406, 406, 417, 417, 417, 852, 621,
+ 406, 422, 406, 406, 406, 1102, 255, 2225, 255, 255,
+ 2325, 409, 2325, 2325, 2325, 2203, 2325, 2325, 2325, 1459,
+ 2010, 1407, 2010, 2010, 1740, 1407, 1023, 406, 410, 406,
+ 406, 2253, 2325, 1317, 622, 852, 2325, 1317, 844, 1798,
+ 875, 1798, 1798, 298, 1491, 2172, 1491, 1491, 852, 844,
+ 1861, 623, 846, 852, 847, 1492, 406, 2032, 406, 406,
+ 407, 2228, 407, 407, 406, 406, 417, 1364, 406, 1930,
+ 406, 418, 406, 406, 406, 406, 417, 417, 417, 2195,
+
+ 621, 406, 422, 406, 406, 406, 852, 1412, 1740, 1412,
+ 1412, 1317, 1412, 2220, 1291, 1412, 1291, 1291, 1412, 1493,
+ 1471, 1491, 1412, 1491, 1491, 1412, 852, 2216, 406, 710,
+ 406, 406, 1492, 1568, 298, 622, 1494, 1799, 1429, 1491,
+ 710, 1491, 1491, 1002, 1364, 713, 624, 2237, 1364, 1930,
+ 1492, 852, 623, 1385, 852, 1385, 1385, 406, 2032, 406,
+ 612, 630, 1364, 611, 630, 612, 612, 612, 612, 612,
+ 1930, 612, 612, 797, 2325, 612, 1493, 612, 612, 612,
+ 2227, 1023, 612, 1412, 612, 1412, 612, 612, 1740, 1512,
+ 1821, 1412, 1551, 1494, 1493, 1820, 875, 1023, 1552, 1553,
+
+ 1819, 1543, 1818, 1491, 852, 1491, 1491, 1412, 1386, 1412,
+ 612, 1494, 612, 2255, 1492, 1412, 798, 1491, 852, 1491,
+ 1491, 1491, 1412, 1491, 1491, 1387, 1364, 852, 1492, 2066,
+ 852, 2032, 1492, 799, 1930, 1364, 2147, 612, 612, 612,
+ 612, 612, 612, 1930, 1364, 612, 1023, 612, 612, 612,
+ 612, 612, 2148, 612, 612, 797, 852, 612, 1493, 612,
+ 612, 612, 1023, 1412, 612, 1412, 612, 2229, 612, 612,
+ 1817, 1412, 1493, 2308, 2252, 1494, 1493, 1630, 1412, 1630,
+ 1630, 1798, 1816, 1798, 1798, 1491, 1557, 1491, 1491, 1494,
+ 1558, 1703, 612, 1494, 612, 1510, 1492, 1510, 1510, 1559,
+
+ 1699, 1364, 710, 1491, 1801, 1491, 1491, 298, 1364, 1496,
+ 1511, 1800, 852, 710, 1492, 2217, 1002, 1787, 713, 612,
+ 612, 612, 612, 612, 610, 630, 1364, 611, 630, 610,
+ 610, 610, 612, 610, 631, 610, 613, 632, 1631, 610,
+ 1493, 610, 610, 610, 852, 1380, 610, 631, 610, 297,
+ 610, 612, 1786, 523, 298, 2314, 523, 1494, 1493, 1799,
+ 297, 1023, 523, 724, 1632, 521, 523, 1491, 523, 1491,
+ 1491, 852, 1023, 523, 612, 1494, 610, 1543, 1492, 852,
+ 634, 715, 852, 715, 715, 1491, 2032, 1491, 1491, 852,
+ 1364, 1858, 1407, 1858, 1858, 1783, 1492, 635, 1930, 2036,
+
+ 2263, 612, 610, 612, 610, 610, 610, 630, 1364, 611,
+ 630, 610, 610, 610, 612, 610, 631, 610, 613, 632,
+ 2244, 610, 1493, 610, 610, 610, 1023, 2199, 610, 631,
+ 610, 1023, 610, 612, 2250, 523, 716, 1023, 523, 1494,
+ 1493, 1380, 2261, 1491, 523, 1491, 1491, 2251, 523, 2150,
+ 523, 2150, 2150, 717, 1492, 523, 612, 1494, 610, 1543,
+ 710, 407, 634, 407, 407, 298, 1364, 1501, 280, 1774,
+ 280, 718, 408, 803, 1002, 852, 713, 852, 1414, 635,
+ 281, 1023, 852, 612, 610, 612, 610, 610, 406, 407,
+ 2245, 407, 407, 406, 406, 406, 1023, 406, 1493, 406,
+
+ 408, 406, 406, 406, 406, 852, 406, 406, 1773, 406,
+ 406, 1543, 406, 406, 406, 1494, 409, 1412, 1254, 1412,
+ 1531, 2254, 1770, 2202, 1491, 1412, 1491, 1491, 1412, 1520,
+ 1412, 2264, 1412, 410, 1001, 1492, 1412, 406, 2291, 406,
+ 406, 852, 1023, 1412, 805, 2032, 1023, 1364, 852, 297,
+ 1491, 2256, 1491, 1491, 298, 1556, 1412, 1930, 1412, 415,
+ 297, 806, 1429, 724, 1412, 521, 406, 415, 406, 406,
+ 407, 1412, 407, 407, 406, 406, 417, 1740, 406, 1493,
+ 406, 418, 406, 406, 406, 406, 419, 417, 417, 1429,
+ 621, 406, 422, 406, 406, 406, 1494, 2200, 1412, 523,
+
+ 1412, 1364, 523, 1543, 1736, 1493, 1412, 1023, 523, 1412,
+ 2280, 1412, 523, 1412, 523, 852, 1736, 1412, 406, 523,
+ 406, 406, 1494, 1542, 1412, 808, 1544, 1023, 1714, 1784,
+ 1545, 1784, 1784, 852, 1713, 1712, 1429, 1412, 1740, 1412,
+ 1546, 1711, 809, 1561, 852, 1412, 2141, 406, 2032, 406,
+ 406, 407, 1412, 407, 407, 406, 406, 417, 2076, 406,
+ 1930, 406, 418, 406, 406, 406, 406, 419, 417, 417,
+ 1429, 621, 406, 422, 406, 406, 406, 1785, 2262, 1412,
+ 523, 1412, 852, 523, 2134, 2201, 2032, 1412, 2160, 523,
+ 2160, 2160, 1023, 523, 1412, 523, 2282, 2035, 1930, 406,
+
+ 523, 406, 406, 1562, 1542, 852, 808, 852, 844, 2032,
+ 1414, 1023, 1547, 298, 1930, 852, 852, 810, 1414, 844,
+ 1615, 1930, 1092, 809, 847, 1414, 1703, 852, 406, 852,
+ 406, 406, 407, 1700, 407, 407, 406, 406, 406, 1585,
+ 406, 1023, 406, 408, 406, 406, 406, 406, 406, 406,
+ 406, 852, 813, 406, 1699, 406, 406, 406, 1412, 1412,
+ 1412, 1412, 2281, 2309, 1543, 2279, 1412, 1412, 1582, 852,
+ 1412, 1585, 1412, 1412, 1412, 1693, 852, 2179, 1412, 2228,
+ 406, 2325, 406, 406, 1429, 1412, 1560, 814, 1023, 1023,
+ 2325, 1429, 1510, 1564, 1510, 1510, 2272, 1332, 1429, 1565,
+
+ 1566, 2325, 2325, 976, 815, 852, 1023, 1511, 1563, 406,
+ 2141, 406, 406, 407, 2283, 407, 407, 406, 406, 406,
+ 852, 406, 2076, 406, 408, 406, 406, 406, 406, 406,
+ 406, 406, 2284, 813, 406, 852, 406, 406, 406, 2285,
+ 2204, 844, 1380, 1412, 1903, 1412, 298, 523, 1330, 1691,
+ 523, 1412, 844, 1023, 1023, 1092, 523, 847, 1412, 2290,
+ 523, 406, 523, 406, 406, 695, 1567, 523, 814, 1429,
+ 1940, 1542, 1690, 1429, 1941, 1023, 2317, 1689, 695, 816,
+ 695, 1429, 1688, 1429, 2207, 815, 2207, 2207, 1541, 1675,
+ 406, 2318, 406, 406, 407, 1671, 407, 407, 406, 406,
+
+ 417, 1670, 406, 1694, 406, 418, 406, 406, 406, 406,
+ 419, 417, 417, 420, 421, 406, 422, 406, 406, 406,
+ 1969, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 406, 1661, 406, 406, 420, 420, 420, 423,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 819,
+ 420, 420, 420, 420, 420, 420, 424, 420, 420, 420,
+ 852, 406, 1023, 406, 420, 695, 523, 852, 695, 523,
+ 695, 695, 695, 852, 695, 523, 695, 695, 854, 523,
+ 695, 523, 695, 695, 695, 852, 523, 695, 852, 695,
+
+ 1542, 695, 695, 1784, 523, 1784, 1784, 523, 2209, 1660,
+ 2209, 2209, 1520, 523, 1407, 429, 1676, 523, 2238, 523,
+ 2238, 2238, 1653, 429, 523, 695, 523, 695, 1542, 523,
+ 2246, 297, 1629, 2302, 1677, 523, 298, 1023, 852, 523,
+ 2303, 523, 297, 1617, 1616, 724, 523, 521, 2261, 2305,
+ 1542, 1785, 695, 695, 695, 695, 695, 695, 695, 1414,
+ 695, 695, 695, 695, 695, 855, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 856, 856, 856, 856, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+
+ 856, 856, 856, 856, 856, 856, 695, 695, 695, 695,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+ 856, 856, 856, 856, 857, 856, 856, 856, 856, 856,
+ 856, 856, 856, 856, 695, 695, 695, 858, 856, 695,
+ 695, 1615, 695, 695, 695, 695, 695, 852, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 860,
+ 861, 695, 695, 695, 695, 695, 695, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 695, 695,
+ 695, 695, 860, 860, 860, 860, 860, 860, 860, 860,
+
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 695, 695, 695, 695,
+ 860, 255, 1497, 1364, 1491, 1497, 255, 1503, 297, 1503,
+ 1503, 1023, 255, 298, 523, 255, 279, 523, 282, 299,
+ 284, 852, 753, 523, 302, 255, 687, 523, 281, 523,
+ 1858, 1585, 1858, 1858, 523, 1581, 1580, 1497, 1542, 1491,
+ 1497, 1577, 1263, 2266, 1414, 2266, 2266, 2325, 1492, 2325,
+ 2325, 285, 1605, 255, 1491, 1605, 852, 1499, 2325, 1498,
+ 1364, 687, 1576, 1606, 268, 2141, 2273, 1605, 2076, 1491,
+ 1605, 2282, 268, 281, 1500, 1607, 1023, 2076, 1606, 255,
+
+ 1380, 255, 303, 898, 852, 898, 899, 898, 898, 898,
+ 298, 688, 1499, 898, 898, 898, 898, 898, 898, 900,
+ 898, 521, 898, 1023, 898, 898, 2325, 1608, 1605, 1500,
+ 1491, 1605, 2322, 1777, 1605, 2325, 1491, 1605, 1605, 1606,
+ 1491, 1605, 1608, 1607, 1609, 1606, 2325, 2325, 976, 1606,
+ 1023, 1607, 852, 1605, 1023, 1491, 1605, 1607, 2307, 1609,
+ 2325, 1607, 2325, 2325, 1606, 1575, 1618, 1607, 1618, 1618,
+ 2325, 2325, 2325, 2325, 1023, 2243, 1607, 1492, 898, 522,
+ 255, 2325, 1574, 1608, 1573, 255, 281, 297, 1023, 1608,
+ 1802, 255, 298, 1608, 255, 279, 281, 282, 299, 284,
+
+ 1609, 753, 2284, 302, 255, 852, 1609, 281, 1608, 1572,
+ 1609, 2325, 2274, 2325, 2325, 2086, 1571, 2086, 2086, 1023,
+ 1570, 1619, 1407, 1879, 1605, 1609, 1491, 1605, 2242, 1569,
+ 285, 2325, 255, 2325, 2325, 1606, 1778, 281, 1620, 1023,
+ 1607, 1023, 2325, 1605, 1541, 1491, 1605, 1607, 1610, 2268,
+ 902, 2268, 2268, 2086, 1606, 2086, 2086, 281, 255, 2316,
+ 255, 303, 385, 2087, 1407, 385, 1607, 385, 385, 385,
+ 385, 385, 385, 385, 385, 385, 385, 385, 1539, 1608,
+ 385, 385, 2325, 385, 385, 385, 385, 385, 385, 385,
+ 1538, 1407, 1623, 2295, 1623, 1623, 1609, 1023, 1608, 852,
+
+ 1997, 2087, 1413, 1308, 875, 1491, 1023, 1491, 1491, 2325,
+ 2141, 385, 385, 385, 385, 1609, 1492, 1672, 2325, 1672,
+ 1672, 1605, 2076, 1491, 1605, 1308, 1023, 1498, 1364, 2325,
+ 2325, 976, 1606, 852, 876, 2076, 1023, 2141, 1216, 385,
+ 385, 385, 385, 611, 1607, 611, 611, 1624, 695, 2076,
+ 612, 2294, 612, 1940, 613, 614, 1605, 1941, 1491, 1605,
+ 1493, 695, 1023, 695, 1625, 612, 1530, 1606, 2247, 612,
+ 1904, 1605, 1673, 1491, 1605, 1023, 1608, 1494, 2275, 1607,
+ 1611, 1529, 1606, 2302, 1605, 1364, 1491, 1605, 1495, 1674,
+ 1023, 1023, 612, 1609, 1607, 1606, 1964, 2214, 615, 2214,
+
+ 2214, 1023, 1023, 1491, 852, 1491, 1491, 1607, 929, 1468,
+ 2289, 1608, 2289, 2289, 1492, 616, 1364, 852, 1023, 612,
+ 1467, 612, 611, 1023, 611, 611, 1608, 523, 1609, 612,
+ 523, 612, 1023, 613, 614, 1466, 523, 1465, 1023, 1608,
+ 523, 1461, 523, 1609, 612, 2215, 1023, 523, 612, 2277,
+ 523, 1542, 489, 523, 290, 1023, 1609, 1457, 1493, 523,
+ 489, 1607, 290, 523, 1455, 523, 1157, 1414, 2276, 523,
+ 523, 612, 523, 2299, 1542, 1494, 396, 615, 523, 396,
+ 1452, 1414, 523, 1023, 523, 930, 1023, 396, 1023, 523,
+ 2298, 2278, 2244, 1542, 616, 396, 1678, 1023, 612, 1451,
+
+ 612, 406, 407, 1023, 407, 407, 406, 406, 417, 1450,
+ 406, 1023, 406, 418, 406, 406, 406, 406, 417, 417,
+ 417, 620, 621, 406, 422, 406, 406, 406, 2311, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 406, 1023, 406, 406, 620, 620, 620, 622, 620, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 933, 620, 620, 623, 620, 620, 620, 1449, 406,
+ 1448, 406, 620, 612, 523, 1445, 612, 523, 612, 612,
+ 612, 612, 612, 523, 612, 612, 797, 523, 612, 523,
+
+ 612, 612, 612, 509, 523, 612, 1308, 612, 1542, 612,
+ 612, 509, 499, 1407, 1491, 499, 1491, 1491, 1408, 1388,
+ 488, 523, 852, 499, 523, 1492, 2032, 1679, 488, 1381,
+ 523, 1930, 1353, 612, 523, 612, 523, 1364, 1930, 2034,
+ 1491, 523, 1491, 1491, 1491, 1542, 1491, 1491, 1352, 1680,
+ 942, 1652, 1351, 1349, 1348, 1492, 1023, 1347, 336, 1344,
+ 612, 612, 612, 612, 612, 612, 336, 1364, 612, 1493,
+ 612, 612, 612, 612, 612, 1343, 612, 612, 797, 1333,
+ 612, 2325, 612, 612, 612, 523, 1494, 612, 523, 612,
+ 2325, 612, 612, 502, 523, 1493, 502, 1332, 523, 1493,
+
+ 523, 2325, 2325, 976, 502, 523, 2312, 1331, 1491, 1542,
+ 1491, 1491, 1494, 1414, 2325, 612, 1494, 612, 1023, 1652,
+ 1330, 1023, 1605, 2325, 1491, 1605, 1491, 1414, 1491, 1491,
+ 338, 1520, 943, 1606, 2325, 2325, 976, 1652, 338, 1326,
+ 1325, 1324, 612, 612, 612, 612, 612, 610, 630, 1520,
+ 611, 630, 610, 610, 610, 612, 610, 631, 610, 613,
+ 632, 1323, 610, 1493, 610, 610, 610, 342, 2323, 610,
+ 631, 610, 1322, 610, 612, 342, 523, 1608, 1803, 523,
+ 1494, 1493, 578, 1023, 1023, 523, 1321, 1320, 1319, 523,
+ 578, 523, 523, 1318, 1609, 523, 523, 612, 1494, 610,
+
+ 1681, 523, 1023, 634, 1292, 523, 1023, 523, 1491, 2141,
+ 1491, 1491, 523, 946, 2076, 1287, 1542, 1520, 1286, 1652,
+ 635, 2076, 1411, 1023, 612, 610, 612, 610, 610, 610,
+ 630, 1520, 611, 630, 610, 610, 610, 612, 610, 631,
+ 610, 613, 632, 2296, 610, 695, 610, 610, 610, 1023,
+ 1940, 610, 631, 610, 1941, 610, 612, 349, 695, 1682,
+ 695, 2297, 1285, 1493, 2310, 349, 1491, 1023, 1491, 1491,
+ 268, 1023, 1281, 1491, 1023, 1491, 1491, 1652, 1275, 612,
+ 1494, 610, 2319, 2325, 1652, 634, 695, 1520, 1023, 1520,
+ 268, 1940, 2325, 947, 1023, 1941, 1520, 268, 268, 695,
+
+ 1970, 695, 635, 2325, 2325, 976, 612, 610, 612, 610,
+ 610, 406, 407, 1274, 407, 407, 406, 406, 406, 1273,
+ 406, 1493, 406, 408, 406, 406, 406, 406, 1493, 406,
+ 406, 523, 406, 406, 523, 406, 406, 406, 1494, 1272,
+ 523, 1271, 2152, 1270, 523, 1494, 523, 1491, 1269, 1491,
+ 1491, 523, 275, 2320, 1491, 1542, 1491, 1491, 1652, 1023,
+ 406, 1268, 406, 406, 1266, 1652, 523, 805, 1023, 523,
+ 1520, 1265, 275, 1264, 1414, 523, 1263, 1520, 948, 523,
+ 275, 523, 1251, 1250, 806, 1708, 523, 1708, 1708, 406,
+ 1542, 406, 406, 407, 1249, 407, 407, 406, 406, 406,
+
+ 1248, 406, 1493, 406, 408, 406, 406, 406, 406, 1493,
+ 406, 406, 523, 406, 406, 523, 406, 406, 406, 1494,
+ 2313, 523, 1684, 1241, 1239, 523, 1494, 523, 1491, 1238,
+ 1491, 1491, 523, 1023, 1237, 2304, 1542, 2304, 2304, 1652,
+ 1709, 406, 852, 406, 406, 351, 1236, 2306, 805, 2306,
+ 2306, 1520, 1659, 351, 852, 585, 1023, 1710, 1491, 949,
+ 1491, 1491, 1235, 585, 1605, 806, 1491, 1605, 1234, 1652,
+ 406, 1429, 406, 406, 407, 1585, 407, 407, 406, 406,
+ 417, 1520, 406, 1493, 406, 418, 406, 406, 406, 406,
+ 419, 417, 417, 1233, 621, 406, 422, 406, 406, 406,
+
+ 1494, 695, 1232, 1144, 1144, 1231, 1940, 277, 2321, 1491,
+ 1941, 1491, 1491, 1493, 695, 2325, 695, 2325, 2325, 1608,
+ 1652, 1023, 406, 710, 406, 406, 2325, 277, 298, 808,
+ 1494, 280, 1520, 280, 718, 277, 1609, 1002, 1222, 713,
+ 1217, 281, 1023, 281, 619, 1605, 809, 1491, 1605, 1216,
+ 1213, 406, 619, 406, 406, 407, 1606, 407, 407, 406,
+ 406, 417, 1113, 406, 1493, 406, 418, 406, 406, 406,
+ 406, 419, 417, 417, 2325, 621, 406, 422, 406, 406,
+ 406, 1494, 1111, 2325, 1111, 1662, 1520, 852, 2277, 1204,
+ 1491, 1197, 1491, 1491, 2325, 2325, 976, 1001, 844, 523,
+
+ 1608, 1652, 523, 406, 1663, 406, 406, 1023, 523, 1023,
+ 808, 1023, 523, 1520, 523, 1195, 281, 1609, 1194, 523,
+ 1193, 810, 428, 1542, 1192, 2012, 1618, 809, 1618, 1618,
+ 428, 1191, 406, 1190, 406, 406, 407, 1189, 407, 407,
+ 406, 406, 406, 1188, 406, 1664, 406, 408, 406, 406,
+ 406, 406, 406, 406, 406, 2296, 813, 406, 1187, 406,
+ 406, 406, 1665, 2324, 1683, 1186, 2325, 440, 2325, 2325,
+ 523, 1185, 1184, 523, 1023, 440, 1023, 1407, 1183, 523,
+ 1877, 1619, 1181, 523, 406, 523, 406, 406, 695, 1308,
+ 523, 814, 281, 1940, 1542, 1179, 1169, 1941, 1620, 442,
+
+ 1168, 695, 2315, 695, 2315, 2315, 665, 442, 815, 852,
+ 474, 1167, 1166, 406, 665, 406, 406, 407, 474, 407,
+ 407, 406, 406, 406, 640, 406, 1429, 406, 408, 406,
+ 406, 406, 406, 406, 406, 406, 406, 406, 406, 1158,
+ 406, 406, 406, 1969, 641, 641, 641, 641, 641, 641,
+ 641, 641, 641, 641, 641, 641, 641, 641, 641, 641,
+ 641, 641, 641, 641, 641, 406, 1157, 406, 406, 641,
+ 641, 641, 642, 641, 641, 641, 641, 641, 641, 641,
+ 641, 641, 641, 641, 641, 641, 641, 641, 641, 643,
+ 641, 641, 641, 1023, 406, 1156, 406, 641, 406, 407,
+
+ 491, 407, 407, 406, 406, 406, 1155, 406, 491, 406,
+ 408, 406, 406, 406, 406, 406, 406, 406, 523, 813,
+ 406, 523, 406, 406, 406, 1154, 1153, 523, 1152, 499,
+ 499, 523, 499, 523, 2325, 1151, 2325, 2325, 523, 2319,
+ 499, 2214, 1542, 2214, 2214, 2325, 695, 406, 852, 406,
+ 406, 1940, 2032, 523, 814, 1941, 523, 1150, 1023, 695,
+ 281, 695, 523, 1149, 509, 816, 523, 1148, 523, 1147,
+ 1146, 815, 509, 523, 1144, 1429, 406, 1542, 406, 406,
+ 407, 1144, 407, 407, 406, 406, 417, 1998, 406, 2215,
+ 406, 418, 406, 406, 406, 406, 419, 417, 417, 420,
+
+ 421, 406, 422, 406, 406, 406, 1685, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 406, 1141,
+ 406, 406, 420, 420, 420, 423, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 954,
+ 420, 420, 424, 420, 420, 420, 1121, 406, 1120, 406,
+ 420, 695, 523, 1118, 695, 523, 695, 695, 695, 852,
+ 695, 523, 695, 695, 854, 523, 695, 523, 695, 695,
+ 695, 523, 523, 695, 523, 695, 1542, 695, 695, 273,
+ 523, 681, 336, 273, 523, 523, 523, 710, 523, 681,
+
+ 290, 523, 338, 290, 523, 1542, 1113, 681, 523, 273,
+ 523, 695, 336, 695, 290, 523, 514, 273, 466, 1542,
+ 336, 466, 338, 290, 514, 578, 1414, 1429, 585, 466,
+ 338, 290, 1111, 578, 1111, 1687, 585, 466, 695, 695,
+ 695, 695, 695, 695, 695, 702, 695, 695, 695, 695,
+ 984, 852, 695, 695, 695, 696, 695, 695, 695, 695,
+ 695, 984, 695, 985, 986, 695, 987, 695, 695, 695,
+ 695, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 695, 695, 695, 695, 985, 985, 985, 985,
+
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 695, 695, 695, 695, 985, 695, 695, 1105, 695, 695,
+ 695, 695, 695, 989, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 990, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 990, 695, 695, 695, 695, 990, 990,
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+
+ 990, 990, 695, 695, 695, 695, 990, 695, 695, 976,
+ 695, 695, 695, 695, 695, 852, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 860, 861, 695,
+ 695, 695, 695, 695, 695, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 695, 695, 695, 695,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 695, 695, 695, 695, 860, 695,
+ 695, 1090, 695, 695, 695, 695, 695, 992, 695, 695,
+
+ 695, 696, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 698, 695, 695, 695, 695, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 695, 695,
+ 695, 695, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 695, 695, 695, 695,
+ 699, 898, 1089, 898, 898, 898, 898, 898, 1023, 349,
+ 342, 898, 898, 898, 898, 898, 898, 898, 898, 1086,
+ 898, 342, 898, 898, 1491, 1085, 1491, 1491, 1084, 349,
+
+ 342, 1605, 1083, 1491, 1605, 1652, 351, 349, 342, 1081,
+ 1520, 2325, 1606, 1491, 1607, 1491, 1491, 1520, 1654, 1605,
+ 2325, 1491, 1605, 1080, 1652, 1079, 351, 779, 1078, 1663,
+ 1606, 2325, 2325, 976, 351, 779, 1520, 1654, 1077, 281,
+ 1076, 1062, 1607, 1023, 1061, 640, 898, 522, 898, 1493,
+ 898, 1024, 898, 898, 898, 1023, 1608, 939, 898, 898,
+ 898, 898, 898, 898, 898, 898, 1494, 898, 1664, 898,
+ 898, 1060, 1059, 1609, 1608, 1058, 657, 2325, 2011, 1655,
+ 523, 1491, 1655, 523, 657, 1665, 2325, 2325, 1050, 523,
+ 1652, 1609, 1049, 523, 1048, 523, 2325, 2325, 2325, 976,
+
+ 523, 1656, 1520, 875, 1542, 691, 691, 2325, 2325, 976,
+ 1026, 1047, 1623, 691, 1623, 1623, 1046, 1045, 665, 852,
+ 1023, 691, 1044, 1027, 514, 898, 665, 898, 898, 898,
+ 898, 898, 1023, 876, 1657, 898, 898, 898, 898, 898,
+ 1043, 1029, 898, 428, 898, 2090, 898, 898, 1686, 695,
+ 1605, 1658, 1491, 1605, 1940, 2091, 1042, 523, 1941, 440,
+ 523, 1606, 695, 428, 695, 523, 523, 1624, 523, 1041,
+ 523, 428, 523, 1607, 523, 690, 1040, 523, 523, 440,
+ 523, 1542, 1039, 690, 1625, 523, 690, 440, 684, 1542,
+ 442, 690, 1605, 1038, 1491, 1605, 684, 1023, 701, 690,
+
+ 898, 722, 255, 1606, 1970, 1608, 701, 255, 275, 297,
+ 442, 1429, 1033, 255, 298, 1607, 255, 279, 442, 282,
+ 299, 284, 1609, 753, 1429, 302, 255, 1032, 275, 281,
+ 277, 864, 1605, 1429, 1491, 1605, 275, 1031, 1695, 864,
+ 1491, 1695, 1605, 1606, 1491, 1605, 1607, 1608, 706, 1492,
+ 277, 1607, 285, 1606, 255, 1607, 706, 1011, 277, 1007,
+ 1498, 1364, 976, 1006, 1609, 1607, 695, 1605, 875, 1491,
+ 1605, 1940, 998, 703, 2325, 1941, 2325, 2325, 1606, 695,
+ 255, 695, 255, 303, 255, 2325, 509, 1608, 702, 255,
+ 1607, 297, 977, 1696, 509, 255, 298, 1608, 255, 279,
+
+ 281, 282, 299, 284, 1609, 301, 988, 302, 255, 979,
+ 1697, 281, 483, 2300, 1609, 2300, 2300, 497, 971, 497,
+ 852, 2325, 1608, 2325, 2325, 497, 474, 1605, 488, 1491,
+ 1605, 970, 2325, 497, 285, 2140, 255, 2046, 1606, 1609,
+ 969, 763, 1760, 1607, 1491, 1760, 474, 281, 488, 763,
+ 1607, 1610, 968, 1761, 474, 1030, 488, 1618, 967, 1618,
+ 1618, 2301, 255, 965, 255, 303, 385, 964, 1652, 385,
+ 962, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+ 385, 385, 1608, 961, 385, 385, 1878, 385, 385, 385,
+ 385, 385, 385, 385, 960, 765, 959, 1763, 1605, 1609,
+
+ 1491, 1605, 1605, 765, 1491, 1605, 491, 701, 1605, 1606,
+ 1491, 1605, 1619, 1606, 1764, 385, 385, 385, 385, 1606,
+ 1701, 1607, 572, 431, 572, 1607, 491, 701, 578, 1620,
+ 572, 1607, 1611, 768, 491, 701, 578, 1605, 572, 1491,
+ 1605, 768, 656, 385, 385, 385, 385, 611, 1606, 611,
+ 611, 826, 523, 1608, 612, 523, 612, 1608, 613, 614,
+ 1607, 523, 957, 1608, 956, 523, 626, 523, 817, 612,
+ 1609, 811, 523, 612, 1609, 1672, 1542, 1672, 1672, 1655,
+ 1609, 1491, 1655, 939, 1605, 585, 1491, 1605, 1605, 795,
+ 1491, 1605, 1608, 585, 926, 1606, 612, 1788, 1804, 1606,
+
+ 1804, 1804, 615, 875, 514, 925, 583, 1607, 583, 1609,
+ 1491, 1607, 1491, 1491, 583, 922, 1053, 921, 920, 616,
+ 919, 1652, 583, 612, 514, 612, 611, 918, 611, 611,
+ 1673, 514, 514, 612, 1657, 612, 281, 613, 614, 1608,
+ 917, 829, 663, 1608, 663, 916, 915, 1674, 612, 829,
+ 663, 1658, 612, 1805, 523, 914, 1609, 523, 663, 913,
+ 1609, 1607, 357, 523, 357, 1664, 911, 523, 357, 523,
+ 1806, 760, 905, 904, 523, 612, 300, 523, 1542, 1054,
+ 523, 615, 1665, 665, 396, 514, 523, 396, 357, 897,
+ 523, 665, 523, 514, 890, 396, 357, 523, 616, 1789,
+
+ 297, 1542, 612, 396, 612, 406, 407, 723, 407, 407,
+ 406, 406, 417, 883, 406, 1790, 406, 418, 406, 406,
+ 406, 406, 417, 417, 417, 620, 621, 406, 422, 406,
+ 406, 406, 879, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 406, 878, 406, 406, 620, 620,
+ 620, 622, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 1057, 620, 623, 620,
+ 620, 620, 870, 406, 869, 406, 620, 612, 523, 868,
+ 612, 523, 612, 612, 612, 612, 612, 523, 612, 612,
+
+ 797, 523, 612, 523, 612, 612, 612, 852, 523, 612,
+ 695, 612, 1542, 612, 612, 1940, 872, 693, 1760, 1941,
+ 1491, 1760, 692, 695, 872, 695, 1792, 695, 1807, 1761,
+ 1807, 1807, 1940, 864, 684, 864, 1941, 612, 687, 612,
+ 695, 1762, 695, 864, 1491, 843, 1491, 1491, 1760, 863,
+ 1491, 1760, 863, 1063, 684, 1652, 842, 1520, 1964, 1761,
+ 863, 684, 684, 841, 612, 612, 612, 612, 612, 612,
+ 840, 1762, 612, 1763, 612, 612, 612, 612, 612, 839,
+ 612, 612, 797, 1808, 612, 838, 612, 612, 612, 523,
+ 1764, 612, 523, 612, 2173, 612, 612, 657, 523, 1493,
+
+ 1809, 657, 523, 1763, 523, 837, 836, 835, 834, 523,
+ 657, 509, 1760, 1542, 1491, 1760, 1494, 657, 833, 612,
+ 1764, 612, 2325, 1761, 509, 657, 1804, 832, 1804, 1804,
+ 1791, 2325, 509, 1064, 831, 1762, 830, 1492, 1708, 664,
+ 1708, 1708, 2325, 2325, 976, 578, 612, 612, 612, 612,
+ 612, 610, 630, 578, 611, 630, 610, 610, 610, 612,
+ 610, 631, 610, 613, 632, 660, 610, 1763, 610, 610,
+ 610, 828, 763, 610, 631, 610, 466, 610, 612, 466,
+ 659, 1805, 826, 2206, 1764, 653, 645, 466, 2238, 817,
+ 2238, 2238, 763, 1709, 1760, 466, 1491, 1760, 1806, 1023,
+
+ 763, 612, 811, 610, 804, 1761, 795, 634, 1762, 411,
+ 1710, 625, 1760, 783, 1491, 1760, 2150, 1762, 2150, 2150,
+ 782, 1067, 781, 1761, 635, 601, 599, 1023, 612, 610,
+ 612, 610, 610, 610, 630, 1762, 611, 630, 610, 610,
+ 610, 612, 610, 631, 610, 613, 632, 778, 610, 1763,
+ 610, 610, 610, 722, 722, 610, 631, 610, 777, 610,
+ 612, 722, 523, 776, 1023, 523, 1764, 1763, 775, 722,
+ 1760, 523, 1491, 1760, 774, 523, 768, 523, 773, 1762,
+ 772, 1761, 523, 612, 1764, 610, 1542, 1068, 1870, 634,
+ 1870, 1870, 1023, 1762, 694, 585, 768, 1813, 771, 1814,
+
+ 1813, 694, 770, 585, 768, 769, 635, 584, 1606, 694,
+ 612, 610, 612, 610, 610, 406, 407, 694, 407, 407,
+ 406, 406, 406, 580, 406, 1763, 406, 408, 406, 406,
+ 406, 406, 1793, 406, 406, 523, 406, 406, 523, 406,
+ 406, 406, 1764, 1871, 523, 1815, 654, 767, 523, 654,
+ 523, 1491, 1608, 1491, 1491, 523, 766, 654, 577, 1542,
+ 1872, 573, 1652, 695, 406, 654, 406, 406, 1940, 1609,
+ 695, 805, 1941, 1656, 1520, 1940, 695, 569, 695, 1941,
+ 762, 1069, 334, 695, 758, 695, 757, 1847, 806, 1847,
+ 1847, 751, 1429, 406, 852, 406, 406, 407, 1848, 407,
+
+ 407, 406, 406, 406, 725, 406, 1493, 406, 408, 406,
+ 406, 406, 406, 725, 406, 406, 523, 406, 406, 523,
+ 406, 406, 406, 1494, 524, 523, 723, 2043, 721, 523,
+ 517, 523, 1760, 2116, 1491, 1760, 523, 709, 619, 708,
+ 1542, 523, 1849, 1761, 523, 406, 707, 406, 406, 665,
+ 523, 507, 805, 704, 523, 1762, 523, 665, 619, 1850,
+ 1070, 523, 973, 488, 702, 1542, 619, 522, 498, 806,
+ 973, 488, 1897, 494, 406, 522, 406, 406, 407, 1795,
+ 407, 407, 406, 406, 417, 700, 406, 1763, 406, 418,
+ 406, 406, 406, 406, 419, 417, 417, 807, 621, 406,
+
+ 422, 406, 406, 406, 1764, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 406, 693, 406, 406,
+ 807, 807, 807, 808, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 1071, 807, 807,
+ 809, 807, 807, 807, 692, 406, 266, 406, 807, 406,
+ 407, 578, 407, 407, 406, 406, 406, 680, 406, 578,
+ 406, 408, 406, 406, 406, 406, 406, 406, 406, 812,
+ 813, 406, 470, 406, 406, 406, 679, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+
+ 812, 812, 812, 812, 812, 812, 812, 812, 406, 678,
+ 406, 406, 812, 812, 812, 814, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 1073,
+ 812, 812, 815, 812, 812, 812, 675, 406, 674, 406,
+ 812, 406, 407, 585, 407, 407, 406, 406, 417, 673,
+ 406, 585, 406, 418, 406, 406, 406, 406, 419, 417,
+ 417, 420, 421, 406, 422, 406, 406, 406, 672, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 406, 671, 406, 406, 420, 420, 420, 423, 420, 420,
+
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 1075, 420, 424, 420, 420, 420, 670, 406,
+ 669, 406, 420, 695, 695, 668, 695, 695, 695, 695,
+ 695, 1099, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 695, 695, 695, 695, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1101, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+
+ 695, 695, 695, 858, 1100, 695, 695, 667, 695, 695,
+ 695, 695, 984, 852, 695, 695, 695, 696, 695, 695,
+ 695, 695, 695, 984, 695, 985, 986, 695, 987, 695,
+ 695, 695, 695, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 695, 695, 695, 695, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 695, 695, 695, 695, 985, 695, 695, 666,
+ 695, 695, 695, 695, 695, 992, 695, 695, 695, 696,
+
+ 695, 695, 695, 695, 695, 695, 695, 695, 984, 695,
+ 698, 695, 695, 695, 695, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 695, 695, 695, 695,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 695, 695, 695, 695, 699, 695,
+ 664, 665, 695, 659, 695, 695, 695, 852, 695, 665,
+ 695, 695, 695, 357, 695, 357, 695, 695, 695, 357,
+ 653, 695, 695, 695, 1103, 695, 695, 872, 695, 2325,
+
+ 681, 2325, 2325, 1940, 427, 872, 427, 1941, 681, 357,
+ 1407, 695, 829, 695, 872, 1877, 681, 357, 695, 695,
+ 695, 695, 1308, 1411, 1104, 281, 495, 509, 495, 495,
+ 578, 585, 829, 647, 872, 509, 495, 665, 578, 585,
+ 829, 872, 872, 645, 495, 665, 695, 695, 695, 695,
+ 695, 695, 695, 2118, 695, 695, 695, 695, 695, 852,
+ 695, 695, 695, 696, 695, 695, 695, 695, 695, 695,
+ 695, 1106, 695, 695, 1107, 695, 695, 695, 695, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+
+ 695, 695, 695, 695, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 695, 695,
+ 695, 695, 1106, 898, 509, 898, 898, 898, 898, 898,
+ 1023, 625, 509, 898, 898, 898, 898, 898, 898, 898,
+ 898, 578, 898, 604, 898, 898, 585, 598, 570, 578,
+ 570, 570, 695, 1760, 585, 1491, 1760, 1940, 570, 657,
+ 1760, 1941, 1491, 1760, 1761, 695, 570, 695, 596, 1762,
+ 595, 1761, 1804, 594, 1804, 1804, 1762, 1765, 1760, 657,
+ 1491, 1760, 665, 1762, 1766, 993, 993, 657, 993, 1761,
+
+ 665, 1807, 593, 1807, 1807, 1023, 993, 592, 898, 514,
+ 898, 1762, 1133, 898, 898, 898, 898, 1134, 1763, 591,
+ 898, 898, 898, 1133, 898, 1763, 1136, 898, 713, 898,
+ 2175, 898, 898, 1463, 590, 1764, 497, 1805, 497, 589,
+ 370, 1463, 1764, 1763, 497, 588, 796, 1760, 366, 1491,
+ 1760, 586, 497, 509, 1806, 509, 1808, 584, 1761, 579,
+ 1764, 1491, 340, 1491, 1491, 1491, 796, 1491, 1491, 334,
+ 1762, 509, 1652, 1809, 796, 1814, 1652, 1814, 1814, 509,
+ 509, 573, 1023, 334, 1520, 898, 711, 898, 1520, 1133,
+ 898, 898, 898, 898, 1134, 567, 565, 898, 898, 898,
+
+ 1133, 898, 1763, 1136, 898, 713, 898, 555, 898, 898,
+ 517, 512, 523, 695, 511, 523, 1493, 510, 1940, 1764,
+ 1493, 523, 1941, 1912, 1762, 523, 695, 523, 695, 508,
+ 1493, 523, 523, 1494, 523, 288, 1542, 1494, 503, 581,
+ 523, 581, 581, 695, 523, 973, 523, 1494, 1940, 581,
+ 1137, 523, 1941, 281, 266, 1542, 695, 581, 695, 1023,
+ 498, 1964, 898, 711, 898, 973, 898, 1138, 898, 898,
+ 898, 1023, 973, 973, 898, 898, 898, 898, 898, 898,
+ 898, 898, 1794, 898, 2325, 898, 898, 523, 993, 993,
+ 523, 993, 2325, 490, 2174, 312, 523, 1796, 266, 993,
+
+ 523, 1695, 523, 1491, 1695, 695, 1605, 523, 1491, 1605,
+ 1940, 1542, 2325, 481, 1941, 473, 472, 1606, 695, 1847,
+ 695, 1847, 1847, 2325, 2325, 976, 852, 470, 470, 1607,
+ 1848, 454, 1980, 452, 1980, 1980, 1023, 276, 274, 898,
+ 488, 898, 1727, 898, 898, 898, 898, 898, 1023, 287,
+ 1797, 898, 898, 898, 898, 898, 1696, 1029, 898, 441,
+ 898, 1608, 898, 898, 796, 439, 695, 695, 796, 2044,
+ 430, 1940, 1940, 1697, 1849, 1941, 1941, 796, 1609, 695,
+ 695, 695, 695, 1847, 796, 1847, 1847, 1981, 427, 384,
+ 852, 1850, 796, 572, 1848, 572, 1847, 382, 1847, 1847,
+
+ 380, 572, 378, 852, 1982, 1727, 1727, 1848, 376, 572,
+ 374, 372, 272, 1023, 370, 366, 898, 722, 898, 1727,
+ 898, 899, 898, 898, 898, 1134, 2257, 2045, 898, 898,
+ 898, 898, 898, 898, 898, 898, 521, 898, 1849, 898,
+ 898, 825, 825, 1847, 350, 1847, 1847, 348, 339, 825,
+ 852, 1849, 337, 335, 1848, 1850, 1847, 825, 1847, 1847,
+ 287, 328, 1847, 852, 1847, 1847, 1727, 1848, 1850, 852,
+ 1727, 326, 286, 1848, 1847, 281, 1847, 1847, 1727, 1727,
+ 1847, 852, 1847, 1847, 278, 1727, 1852, 852, 691, 691,
+ 1023, 1848, 276, 898, 522, 255, 691, 274, 1849, 2325,
+
+ 255, 2325, 297, 1727, 691, 2325, 255, 298, 2325, 255,
+ 279, 1849, 282, 299, 284, 1850, 301, 1849, 302, 255,
+ 2325, 2325, 281, 1983, 2325, 1983, 1983, 2325, 1850, 1849,
+ 1847, 2325, 1847, 1847, 1850, 1849, 2325, 852, 2325, 2325,
+ 2325, 1848, 2325, 2325, 2325, 285, 1850, 255, 2300, 2325,
+ 2300, 2300, 1850, 1727, 2325, 852, 2325, 2325, 1847, 2032,
+ 1847, 1847, 1140, 2325, 1870, 852, 1870, 1870, 2325, 1848,
+ 2325, 2325, 2325, 255, 2325, 255, 303, 611, 1984, 611,
+ 611, 1727, 1857, 2325, 612, 1849, 612, 2325, 613, 614,
+ 1760, 523, 1491, 1760, 523, 1985, 2301, 2325, 2325, 612,
+
+ 523, 1761, 1850, 612, 523, 1847, 523, 1847, 1847, 2325,
+ 2325, 523, 852, 1849, 2325, 1542, 1848, 2325, 1847, 1871,
+ 1847, 1847, 1414, 2325, 2325, 852, 612, 690, 1727, 1848,
+ 1850, 1760, 615, 1491, 1760, 690, 1872, 523, 690, 2325,
+ 523, 1727, 1761, 690, 2325, 1763, 523, 1161, 2325, 616,
+ 523, 690, 523, 612, 1762, 612, 611, 523, 611, 611,
+ 1849, 1542, 1764, 612, 2325, 612, 2325, 613, 614, 2325,
+ 2325, 2325, 1896, 1849, 2325, 2325, 523, 1850, 612, 523,
+ 2325, 2325, 612, 2325, 523, 523, 1763, 523, 2325, 523,
+ 1850, 523, 2325, 523, 2325, 1727, 523, 523, 2325, 523,
+
+ 1542, 2325, 2325, 1764, 523, 612, 2325, 1760, 1542, 1491,
+ 1760, 615, 695, 1760, 1414, 1491, 1760, 1940, 1761, 2325,
+ 1760, 1941, 1491, 1760, 1740, 695, 1162, 695, 616, 1762,
+ 1762, 1761, 612, 2325, 612, 406, 1163, 2325, 1163, 1163,
+ 406, 406, 417, 1762, 406, 1899, 406, 418, 406, 406,
+ 406, 406, 417, 417, 417, 2325, 621, 406, 422, 406,
+ 406, 406, 1763, 2325, 2325, 2325, 2325, 2325, 1763, 655,
+ 2325, 1760, 2325, 1491, 1760, 1763, 2325, 2325, 655, 1764,
+ 2222, 655, 1761, 2325, 406, 1764, 406, 406, 2325, 655,
+ 2325, 622, 1764, 2325, 1762, 2325, 661, 655, 661, 661,
+
+ 2325, 1760, 2325, 1491, 1760, 2325, 661, 1760, 623, 1491,
+ 1760, 2325, 1761, 406, 661, 406, 406, 407, 1761, 407,
+ 407, 406, 406, 417, 1762, 406, 1763, 406, 418, 406,
+ 406, 406, 406, 417, 417, 417, 2325, 621, 406, 422,
+ 406, 406, 406, 1764, 2325, 583, 1760, 583, 1491, 1760,
+ 663, 2325, 663, 583, 2325, 2325, 1763, 1761, 663, 2325,
+ 1762, 583, 1763, 2325, 2325, 406, 663, 406, 406, 1762,
+ 2325, 2325, 622, 1764, 1760, 694, 1491, 1760, 1165, 1764,
+ 2325, 1975, 694, 1975, 1975, 1761, 2325, 1762, 852, 623,
+ 694, 2325, 1848, 2325, 406, 2325, 406, 612, 694, 2325,
+
+ 612, 1763, 612, 612, 612, 612, 612, 2325, 612, 612,
+ 797, 2325, 612, 2325, 612, 612, 612, 2325, 1764, 612,
+ 2325, 612, 2325, 612, 612, 2325, 2325, 2325, 1760, 1763,
+ 1491, 1760, 2325, 2325, 2325, 976, 1976, 2325, 2325, 1761,
+ 2325, 2325, 2325, 2325, 1762, 2325, 1764, 612, 2325, 612,
+ 2325, 1762, 1765, 1977, 1980, 2325, 1980, 1980, 1760, 2325,
+ 1491, 1760, 1813, 2325, 1814, 1813, 2325, 1170, 2090, 1761,
+ 2325, 2325, 2325, 1585, 612, 612, 612, 612, 612, 612,
+ 1863, 1762, 612, 1763, 612, 612, 612, 612, 612, 2325,
+ 612, 612, 797, 2325, 612, 2325, 612, 612, 612, 523,
+
+ 1764, 612, 523, 612, 2325, 612, 612, 2325, 523, 1981,
+ 1815, 2325, 523, 1763, 523, 2325, 2325, 1608, 495, 523,
+ 495, 495, 1983, 1542, 1983, 1983, 1982, 2325, 495, 612,
+ 1764, 612, 2325, 1171, 1609, 570, 495, 570, 570, 1898,
+ 1760, 2325, 1491, 1760, 1980, 570, 1980, 1980, 2325, 2325,
+ 2325, 1761, 2325, 570, 2325, 1652, 612, 612, 612, 612,
+ 612, 610, 630, 1762, 611, 630, 610, 610, 610, 612,
+ 610, 631, 610, 613, 632, 2325, 610, 1984, 610, 610,
+ 610, 722, 722, 610, 631, 610, 2325, 610, 612, 722,
+ 581, 2325, 581, 581, 1985, 1763, 2325, 722, 2325, 1981,
+
+ 581, 2325, 2325, 2325, 1760, 695, 1491, 1760, 581, 2325,
+ 1940, 612, 1764, 610, 1941, 1761, 1982, 634, 695, 2325,
+ 695, 2325, 1760, 2325, 1491, 1760, 2325, 1762, 1766, 2325,
+ 2325, 2325, 1174, 1761, 635, 2325, 2325, 2325, 612, 610,
+ 612, 610, 610, 610, 630, 1762, 611, 630, 610, 610,
+ 610, 612, 610, 631, 610, 613, 632, 2325, 610, 1763,
+ 610, 610, 610, 938, 938, 610, 631, 610, 2325, 610,
+ 612, 938, 2325, 2223, 2325, 2325, 1764, 1763, 2325, 938,
+ 1760, 2325, 1491, 1760, 2325, 923, 2325, 1760, 923, 1491,
+ 1760, 1761, 695, 612, 1764, 610, 923, 1940, 1761, 634,
+
+ 2325, 1941, 2325, 1762, 923, 695, 1847, 695, 1847, 1847,
+ 1762, 2325, 2325, 852, 1175, 2325, 635, 1848, 2325, 1727,
+ 612, 610, 612, 610, 610, 406, 407, 2325, 407, 407,
+ 406, 406, 406, 2325, 406, 1763, 406, 408, 406, 406,
+ 406, 406, 1763, 406, 406, 523, 406, 406, 523, 406,
+ 406, 406, 1764, 2117, 523, 825, 825, 1762, 523, 1764,
+ 523, 1849, 509, 825, 509, 523, 2325, 2325, 2325, 1542,
+ 523, 825, 2325, 523, 406, 2325, 406, 406, 1850, 523,
+ 509, 805, 2325, 523, 523, 523, 2325, 523, 509, 2325,
+ 523, 2325, 2325, 523, 1542, 1176, 2325, 523, 806, 523,
+
+ 2325, 2325, 1900, 406, 523, 406, 406, 407, 1542, 407,
+ 407, 406, 406, 406, 2325, 406, 2325, 406, 408, 406,
+ 406, 406, 406, 2325, 406, 406, 523, 406, 406, 523,
+ 406, 406, 406, 1429, 2325, 523, 2325, 923, 2325, 523,
+ 923, 523, 1760, 2325, 1491, 1760, 523, 2325, 923, 1901,
+ 1542, 2325, 2325, 1761, 2325, 406, 923, 406, 406, 2325,
+ 1177, 2325, 805, 2325, 661, 1762, 661, 661, 2325, 938,
+ 938, 2325, 2325, 2325, 661, 2325, 2325, 938, 2325, 806,
+ 2325, 2325, 661, 1429, 406, 938, 406, 406, 407, 2325,
+ 407, 407, 406, 406, 417, 2325, 406, 1763, 406, 418,
+
+ 406, 406, 406, 406, 419, 417, 417, 807, 621, 406,
+ 422, 406, 406, 406, 1764, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 406, 2325, 406, 406,
+ 807, 807, 807, 808, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 1178, 807,
+ 809, 807, 807, 807, 2325, 406, 2325, 406, 807, 406,
+ 407, 2325, 407, 407, 406, 406, 406, 2325, 406, 2325,
+ 406, 408, 406, 406, 406, 406, 406, 406, 406, 812,
+ 813, 406, 2325, 406, 406, 406, 2325, 812, 812, 812,
+
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812, 406, 2325,
+ 406, 406, 812, 812, 812, 814, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 1180, 812, 815, 812, 812, 812, 2325, 406, 2325, 406,
+ 812, 406, 1163, 2325, 1163, 1163, 406, 406, 417, 2325,
+ 406, 2325, 406, 418, 406, 406, 406, 406, 419, 417,
+ 417, 2325, 421, 406, 422, 406, 406, 406, 862, 2325,
+ 862, 862, 2325, 2325, 2325, 2325, 695, 1847, 862, 1847,
+ 1847, 1940, 2325, 2325, 852, 1941, 862, 2325, 1848, 695,
+
+ 406, 695, 406, 406, 2325, 2325, 2325, 423, 281, 1854,
+ 1727, 2325, 2325, 2325, 1989, 2325, 1990, 1989, 2325, 1491,
+ 2325, 1491, 1491, 2325, 424, 1761, 2325, 2325, 2325, 406,
+ 2001, 406, 406, 407, 2288, 407, 407, 406, 406, 417,
+ 2325, 406, 1849, 406, 418, 406, 406, 406, 406, 419,
+ 417, 417, 2069, 421, 406, 422, 406, 406, 406, 1850,
+ 2325, 907, 1991, 907, 907, 2325, 2325, 2325, 2325, 1763,
+ 2325, 907, 2325, 2325, 2002, 912, 2325, 912, 912, 907,
+ 578, 406, 578, 406, 406, 912, 1764, 2325, 423, 2325,
+ 2325, 2003, 2325, 912, 1182, 1023, 2325, 958, 578, 958,
+
+ 958, 2325, 2325, 2325, 2325, 424, 578, 958, 2325, 2325,
+ 406, 2325, 406, 695, 695, 958, 695, 695, 695, 695,
+ 984, 852, 695, 695, 695, 696, 695, 695, 695, 695,
+ 695, 984, 695, 1202, 1203, 695, 987, 695, 695, 695,
+ 695, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 695, 695, 695, 695, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 695, 695, 695, 695, 1202, 695, 2325, 585, 695, 585,
+
+ 695, 695, 695, 852, 695, 2325, 695, 695, 695, 665,
+ 695, 665, 695, 695, 695, 585, 2325, 695, 695, 695,
+ 1103, 695, 695, 585, 2325, 2325, 1962, 665, 1847, 1962,
+ 2325, 2325, 2325, 1940, 2325, 665, 2325, 1963, 2325, 2325,
+ 2325, 695, 2325, 695, 695, 695, 695, 695, 2325, 1964,
+ 1962, 2325, 1847, 1962, 2325, 2325, 2325, 1940, 2325, 2325,
+ 1990, 1963, 1990, 1990, 2325, 695, 2325, 695, 1491, 2325,
+ 1491, 1491, 695, 695, 695, 695, 695, 695, 2325, 2001,
+ 695, 1965, 695, 695, 695, 852, 695, 2325, 695, 695,
+ 695, 1889, 695, 2325, 695, 695, 695, 2325, 1966, 695,
+
+ 695, 695, 1103, 695, 695, 1965, 2325, 862, 2063, 862,
+ 862, 2325, 2325, 2325, 2325, 1493, 2325, 862, 2325, 2325,
+ 2325, 523, 1966, 2002, 523, 862, 695, 695, 695, 695,
+ 523, 2325, 1494, 2325, 523, 2325, 523, 2325, 2325, 2325,
+ 2003, 523, 2325, 2325, 1023, 1542, 1205, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 695, 695, 695, 695, 695, 695,
+ 695, 1414, 695, 695, 695, 695, 984, 852, 695, 695,
+ 695, 696, 695, 695, 695, 695, 695, 984, 695, 985,
+ 986, 695, 987, 695, 695, 695, 695, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+
+ 985, 985, 985, 985, 985, 985, 985, 985, 695, 695,
+ 695, 695, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 1206, 985,
+ 985, 985, 985, 985, 985, 985, 695, 695, 695, 695,
+ 985, 695, 695, 2325, 695, 695, 695, 695, 695, 852,
+ 695, 695, 695, 696, 695, 695, 695, 695, 695, 695,
+ 695, 1106, 695, 695, 1107, 695, 695, 695, 695, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 695, 695, 695, 695, 1106, 1106, 1106, 1106, 1106, 1106,
+
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 695, 695,
+ 695, 695, 1106, 695, 2325, 2325, 695, 2325, 695, 695,
+ 695, 852, 695, 2325, 695, 695, 695, 2325, 695, 2325,
+ 695, 695, 695, 2325, 2325, 695, 695, 695, 1208, 695,
+ 695, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1847, 2325,
+ 1847, 1847, 2325, 2325, 2325, 852, 2325, 523, 2325, 1848,
+ 523, 2325, 695, 695, 695, 695, 523, 2325, 1209, 281,
+ 523, 1727, 523, 1847, 695, 1847, 1847, 523, 2325, 1940,
+ 852, 1542, 2325, 1941, 1848, 2325, 2325, 695, 2325, 695,
+
+ 695, 695, 695, 695, 695, 898, 1727, 898, 1223, 898,
+ 898, 898, 1023, 1849, 2325, 898, 898, 898, 898, 898,
+ 898, 898, 898, 2070, 898, 2325, 898, 898, 2325, 1962,
+ 1850, 1847, 1962, 2009, 2325, 2325, 1940, 2325, 1849, 2224,
+ 1963, 2325, 2325, 2325, 695, 2325, 695, 1962, 523, 1847,
+ 1962, 523, 1964, 2325, 1940, 1850, 1964, 523, 1963, 2325,
+ 695, 523, 695, 523, 695, 1940, 2325, 1225, 523, 1941,
+ 1964, 2325, 1542, 695, 2325, 695, 2047, 1023, 2047, 2047,
+ 1027, 872, 516, 852, 1965, 516, 1131, 2325, 1131, 1131,
+ 1131, 1414, 1131, 2325, 1227, 516, 1131, 2325, 1131, 1131,
+
+ 1131, 1966, 1965, 1131, 516, 1131, 516, 1131, 1131, 2325,
+ 907, 2325, 907, 907, 2325, 1491, 2325, 1491, 1491, 1966,
+ 907, 2286, 1962, 2325, 1847, 1962, 2001, 2325, 907, 1940,
+ 516, 2048, 516, 1963, 2325, 2325, 2325, 695, 1889, 695,
+ 1962, 2325, 1847, 1962, 2325, 1964, 2325, 1940, 2049, 2325,
+ 2325, 1963, 2325, 2325, 1964, 695, 2325, 695, 2325, 2325,
+ 1132, 1131, 898, 1964, 1133, 898, 898, 898, 898, 1134,
+ 2002, 2325, 898, 898, 898, 1133, 898, 1965, 1136, 898,
+ 713, 898, 2325, 898, 898, 2325, 2325, 2003, 2325, 2325,
+ 523, 1023, 2325, 523, 1966, 1965, 2325, 2325, 912, 523,
+
+ 912, 912, 2325, 523, 1962, 523, 1847, 1962, 912, 2325,
+ 523, 1940, 1966, 2325, 1542, 1963, 912, 2325, 2325, 695,
+ 1964, 695, 2325, 2325, 2325, 2325, 2325, 1964, 1967, 2325,
+ 2325, 2008, 2325, 2325, 1023, 2325, 2325, 898, 711, 898,
+ 2325, 898, 899, 898, 898, 898, 1134, 2325, 281, 898,
+ 898, 898, 898, 898, 898, 1133, 898, 521, 898, 1965,
+ 898, 898, 2325, 2325, 958, 2325, 958, 958, 2325, 2325,
+ 1962, 2325, 1847, 1962, 958, 523, 1966, 1940, 523, 2069,
+ 2325, 1963, 958, 2325, 523, 695, 2325, 695, 523, 1962,
+ 523, 1847, 1962, 1964, 2325, 523, 1940, 2325, 2325, 1542,
+
+ 1963, 2325, 2325, 2325, 695, 2325, 695, 2325, 1414, 2325,
+ 2325, 1023, 1964, 2325, 898, 522, 898, 2325, 1133, 898,
+ 898, 898, 898, 1134, 2325, 1965, 898, 898, 898, 1133,
+ 898, 2325, 1136, 898, 713, 898, 2325, 898, 898, 2325,
+ 2325, 2325, 1966, 2325, 1965, 2325, 2325, 1962, 2325, 1847,
+ 1962, 2325, 2325, 2325, 1940, 2325, 2325, 2325, 1963, 2325,
+ 2325, 1966, 695, 1102, 695, 695, 1102, 2325, 2325, 1228,
+ 1964, 1968, 2325, 2325, 695, 2325, 2325, 2325, 1491, 2325,
+ 1491, 1491, 2325, 281, 2325, 695, 695, 1889, 1023, 2001,
+ 2325, 898, 711, 898, 2325, 898, 898, 898, 898, 898,
+
+ 1023, 1889, 1965, 898, 898, 898, 898, 898, 898, 898,
+ 898, 2325, 898, 2325, 898, 898, 2325, 1102, 1102, 1966,
+ 2196, 2325, 2325, 1962, 2325, 1847, 1962, 2325, 2325, 1978,
+ 1940, 2325, 2325, 2002, 1963, 1102, 2325, 2325, 695, 2325,
+ 695, 1962, 523, 1847, 1962, 523, 1964, 2325, 1940, 2325,
+ 2003, 523, 1963, 2325, 1023, 523, 695, 523, 695, 2325,
+ 2325, 2325, 523, 2325, 1964, 1023, 1542, 2325, 898, 488,
+ 898, 2325, 898, 898, 898, 898, 898, 1134, 1965, 2325,
+ 898, 898, 898, 898, 898, 2325, 898, 898, 564, 898,
+ 2325, 898, 898, 2325, 2325, 1966, 1965, 2325, 2325, 2325,
+
+ 2325, 1102, 2325, 695, 1102, 1491, 2325, 1491, 1491, 2325,
+ 1429, 2325, 695, 1966, 2325, 2325, 2001, 2325, 1964, 1889,
+ 2325, 2325, 2325, 695, 695, 2325, 2325, 2325, 1889, 2325,
+ 1491, 2325, 1491, 1491, 2325, 2325, 2325, 1975, 2325, 1975,
+ 1975, 2001, 1023, 2325, 852, 898, 690, 255, 2325, 2325,
+ 2325, 2325, 255, 1889, 297, 1102, 1102, 2325, 255, 298,
+ 2002, 255, 279, 2325, 282, 299, 284, 1979, 301, 2325,
+ 302, 255, 2325, 1102, 281, 2325, 2325, 2003, 2325, 2325,
+ 1491, 1023, 1491, 1491, 2325, 2002, 2325, 1491, 2325, 1491,
+ 1491, 2001, 1976, 2325, 2325, 2325, 1889, 285, 2001, 255,
+
+ 2325, 2325, 2003, 1889, 1654, 2110, 1023, 2110, 2110, 1977,
+ 1889, 2325, 852, 2325, 2325, 2325, 1230, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 255, 2325, 255, 303, 1244,
+ 523, 1244, 1244, 523, 2325, 2002, 612, 2325, 612, 523,
+ 613, 614, 2002, 523, 2325, 523, 2325, 2325, 2325, 2325,
+ 523, 612, 2003, 2325, 1542, 612, 1023, 2325, 2325, 2003,
+ 2111, 2325, 2325, 1023, 2325, 2325, 2325, 2325, 1102, 2325,
+ 695, 1102, 1102, 523, 695, 1102, 523, 2112, 612, 2032,
+ 2325, 2325, 523, 695, 615, 2325, 523, 2325, 523, 1429,
+ 2035, 1930, 2325, 523, 695, 695, 2113, 1542, 2113, 2113,
+
+ 2325, 616, 2325, 852, 2325, 612, 2325, 612, 611, 695,
+ 611, 611, 2325, 2325, 1940, 612, 2325, 612, 1941, 613,
+ 614, 2325, 695, 1102, 695, 2325, 1102, 1102, 2325, 2325,
+ 612, 2325, 2325, 2325, 612, 2325, 2325, 2054, 1429, 2325,
+ 1102, 2325, 2325, 2325, 1102, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2114, 2325, 2325, 2325, 2325, 2325, 612, 2325, 2325,
+ 2325, 2325, 2325, 615, 2222, 2325, 2325, 2325, 2115, 1245,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 616, 2325, 2325, 2325, 612, 2325, 612, 406, 407, 2325,
+ 407, 407, 406, 406, 417, 2325, 406, 2325, 406, 418,
+
+ 406, 406, 406, 406, 417, 417, 417, 620, 621, 406,
+ 422, 406, 406, 406, 2325, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 406, 2325, 406, 406,
+ 620, 620, 620, 622, 620, 620, 620, 620, 620, 620,
+ 620, 1247, 620, 620, 620, 620, 620, 620, 620, 620,
+ 623, 620, 620, 620, 2325, 406, 2325, 406, 620, 612,
+ 2325, 2325, 612, 2325, 612, 612, 612, 612, 612, 2325,
+ 612, 612, 797, 2325, 612, 2325, 612, 612, 612, 2325,
+ 2325, 612, 2325, 612, 2325, 612, 612, 2325, 2325, 2325,
+
+ 1962, 2325, 1847, 1962, 2325, 2325, 2325, 1940, 2325, 2325,
+ 1491, 1963, 1491, 1491, 2325, 695, 2325, 695, 2325, 612,
+ 2325, 612, 2325, 1964, 1962, 2325, 1847, 1962, 2325, 2325,
+ 2047, 1940, 2047, 2047, 2325, 1963, 2325, 852, 2325, 695,
+ 1252, 695, 1989, 2325, 1990, 1989, 612, 612, 612, 612,
+ 612, 612, 2325, 1740, 612, 1965, 612, 612, 612, 612,
+ 612, 2325, 612, 612, 797, 1493, 612, 2325, 612, 612,
+ 612, 2325, 1966, 612, 2325, 612, 2325, 612, 612, 1965,
+ 2325, 2325, 1494, 2325, 2325, 2048, 2325, 2325, 2325, 2325,
+ 1991, 2325, 2166, 2325, 2166, 2166, 1966, 1763, 2325, 852,
+
+ 2325, 612, 2049, 612, 2325, 2325, 1962, 2325, 1847, 1962,
+ 2325, 2325, 2325, 1940, 1764, 2325, 2325, 1941, 2325, 2325,
+ 2325, 695, 1253, 695, 1618, 2325, 1618, 1618, 612, 612,
+ 612, 612, 612, 610, 1256, 1652, 1244, 1256, 610, 610,
+ 610, 612, 610, 631, 610, 613, 632, 2167, 610, 2325,
+ 610, 610, 610, 2325, 2325, 610, 631, 610, 2325, 610,
+ 612, 1965, 2325, 2325, 2168, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2110, 2325, 2110, 2110, 1966, 2084,
+ 2325, 852, 2325, 612, 2325, 610, 2325, 2325, 1962, 634,
+ 1847, 1962, 2325, 2325, 2325, 1940, 2085, 2325, 2325, 1963,
+
+ 2325, 2325, 2325, 695, 2325, 695, 635, 2325, 2325, 2325,
+ 612, 610, 612, 610, 610, 610, 630, 2325, 611, 630,
+ 610, 610, 610, 612, 610, 631, 610, 613, 632, 2111,
+ 610, 2325, 610, 610, 610, 2325, 2325, 610, 631, 610,
+ 2325, 610, 612, 1965, 2325, 2325, 2112, 2325, 2325, 2325,
+ 2325, 2325, 1870, 2325, 1870, 1870, 2325, 2325, 2325, 1962,
+ 1966, 1847, 1962, 2325, 2325, 612, 1940, 610, 2325, 2325,
+ 1963, 634, 2325, 2325, 695, 2325, 695, 1257, 2097, 2325,
+ 2098, 2097, 1964, 2325, 2098, 2325, 2098, 2098, 635, 1606,
+ 2325, 2325, 612, 610, 612, 610, 610, 406, 407, 2325,
+
+ 407, 407, 406, 406, 406, 2325, 406, 2143, 406, 408,
+ 406, 406, 406, 406, 1965, 406, 406, 2325, 406, 406,
+ 2325, 406, 406, 406, 2144, 2325, 2099, 2325, 2325, 2325,
+ 2325, 1966, 2158, 1608, 2325, 2325, 2325, 2325, 2325, 1493,
+ 1962, 2325, 1847, 1962, 2325, 2325, 406, 1940, 406, 406,
+ 1609, 1963, 2325, 805, 2325, 695, 1494, 695, 2325, 2325,
+ 2325, 2325, 2325, 1964, 2325, 2325, 2325, 2325, 1258, 981,
+ 806, 981, 981, 2325, 2325, 406, 852, 406, 406, 407,
+ 2032, 407, 407, 406, 406, 406, 2325, 406, 2325, 406,
+ 408, 406, 406, 406, 406, 1965, 406, 406, 2325, 406,
+
+ 406, 2325, 406, 406, 406, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 1966, 2325, 2110, 2325, 2110, 2110, 2325, 2325,
+ 2325, 852, 2325, 2325, 982, 1848, 2325, 406, 2325, 406,
+ 406, 2325, 2325, 1962, 805, 1847, 1962, 2325, 2325, 2325,
+ 1940, 983, 2325, 2325, 1963, 2325, 1964, 2325, 695, 1259,
+ 695, 806, 2325, 2325, 2325, 2325, 406, 2325, 406, 406,
+ 1163, 2325, 1163, 1163, 406, 406, 417, 2325, 406, 2111,
+ 406, 418, 406, 406, 406, 406, 419, 417, 417, 2325,
+ 621, 406, 422, 406, 406, 406, 2112, 2325, 1965, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2113, 2325, 2113, 2113, 2325,
+
+ 2325, 2325, 852, 2325, 2325, 1966, 2325, 2325, 406, 2325,
+ 406, 406, 2325, 2325, 1491, 808, 1491, 1491, 1491, 2325,
+ 1491, 1491, 2097, 2325, 2098, 2097, 2325, 2120, 2325, 2120,
+ 2120, 2325, 809, 1585, 852, 2325, 2325, 406, 2325, 406,
+ 406, 407, 2325, 407, 407, 406, 406, 417, 2325, 406,
+ 2114, 406, 418, 406, 406, 406, 406, 419, 417, 417,
+ 2325, 621, 406, 422, 406, 406, 406, 2115, 2325, 1493,
+ 2099, 2325, 2325, 1493, 2325, 2176, 715, 1608, 715, 715,
+ 2325, 2325, 1849, 2325, 2325, 2325, 1494, 1407, 2325, 406,
+ 1494, 406, 406, 2325, 1609, 1491, 808, 1491, 1491, 1850,
+
+ 2325, 2325, 1260, 2190, 2325, 2191, 2190, 2325, 1605, 2325,
+ 1491, 1605, 2325, 809, 1761, 2325, 2325, 2325, 406, 1606,
+ 406, 406, 1163, 2325, 1163, 1163, 406, 406, 406, 2325,
+ 406, 1298, 406, 408, 406, 406, 406, 406, 406, 406,
+ 406, 2325, 813, 406, 2325, 406, 406, 406, 1299, 2325,
+ 1493, 2192, 2325, 2325, 2325, 2325, 2325, 2166, 1763, 2166,
+ 2166, 2325, 2325, 1608, 852, 2325, 2325, 1494, 2325, 2325,
+ 406, 2325, 406, 406, 2325, 1764, 1491, 814, 1491, 1491,
+ 1609, 2325, 2325, 2325, 2190, 2325, 2191, 2190, 2191, 2325,
+ 2191, 2191, 2325, 2325, 815, 1740, 2325, 2325, 2325, 406,
+
+ 2325, 406, 406, 407, 2325, 407, 407, 406, 406, 406,
+ 2325, 406, 2167, 406, 408, 406, 406, 406, 406, 406,
+ 406, 406, 2325, 813, 406, 2325, 406, 406, 406, 2168,
+ 2325, 1493, 2192, 2325, 2325, 2325, 2236, 2325, 1491, 1763,
+ 1491, 1491, 2325, 1493, 2325, 2325, 2325, 2325, 1494, 1492,
+ 2325, 406, 2325, 406, 406, 2325, 1764, 2325, 814, 2325,
+ 1494, 2325, 2325, 2325, 1261, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 815, 2325, 2325, 2325, 2325,
+ 406, 2325, 406, 406, 407, 2325, 407, 407, 406, 406,
+ 417, 2325, 406, 1493, 406, 418, 406, 406, 406, 406,
+
+ 419, 417, 417, 420, 421, 406, 422, 406, 406, 406,
+ 1494, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 406, 2325, 406, 406, 420, 420, 420, 423,
+ 420, 420, 420, 420, 420, 420, 420, 1262, 420, 420,
+ 420, 420, 420, 420, 420, 420, 424, 420, 420, 420,
+ 2325, 406, 2325, 406, 420, 695, 695, 2325, 695, 695,
+ 695, 695, 984, 852, 695, 695, 695, 696, 695, 695,
+ 695, 695, 695, 984, 695, 1202, 1203, 695, 987, 695,
+ 695, 695, 695, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 695, 695, 695, 695, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 695, 695, 695, 695, 1202, 695, 2325, 2325,
+ 695, 2325, 695, 695, 695, 852, 695, 2325, 695, 695,
+ 695, 2325, 695, 2325, 695, 695, 695, 2325, 2325, 695,
+ 695, 695, 1282, 695, 695, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 695, 695, 695, 695,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 695, 695, 695, 695, 695, 695,
+ 695, 2325, 695, 695, 695, 695, 984, 852, 695, 695,
+ 695, 696, 695, 695, 695, 695, 695, 984, 695, 985,
+ 986, 695, 987, 695, 695, 695, 695, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 695, 695,
+ 695, 695, 985, 1283, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+
+ 985, 985, 985, 985, 985, 985, 695, 695, 695, 695,
+ 985, 695, 2325, 2325, 695, 2325, 695, 695, 695, 852,
+ 695, 2325, 695, 695, 695, 2325, 695, 2325, 695, 695,
+ 695, 2325, 2325, 695, 695, 695, 1208, 695, 695, 2325,
+ 2325, 2325, 1962, 2325, 1847, 1962, 2325, 2325, 2325, 1940,
+ 2325, 1964, 1491, 1963, 1491, 1491, 2325, 695, 2325, 695,
+ 695, 695, 695, 695, 2325, 1964, 2325, 2325, 1760, 2325,
+ 1491, 1760, 2325, 2325, 2325, 1672, 2325, 1672, 1672, 1761,
+ 2259, 2325, 2259, 2259, 2325, 2325, 2325, 852, 695, 695,
+ 695, 695, 695, 695, 2325, 2325, 695, 1965, 695, 695,
+
+ 695, 852, 695, 2325, 695, 695, 695, 1493, 695, 2325,
+ 695, 695, 695, 2325, 1966, 695, 695, 695, 1208, 695,
+ 695, 2325, 2325, 1763, 1494, 2325, 2325, 2325, 2287, 2325,
+ 2240, 2325, 2325, 2325, 2325, 1849, 2325, 2325, 2325, 2325,
+ 1764, 2325, 695, 695, 695, 695, 1962, 2241, 1847, 1962,
+ 2325, 2325, 1850, 1940, 2325, 2325, 2325, 1963, 2325, 2325,
+ 1964, 695, 1284, 695, 1491, 2325, 1491, 1491, 2325, 1964,
+ 695, 695, 695, 695, 695, 898, 2325, 898, 898, 898,
+ 898, 898, 1023, 2325, 2325, 898, 898, 898, 898, 898,
+ 898, 898, 898, 2325, 898, 2325, 898, 898, 2325, 2325,
+
+ 2325, 1965, 2325, 2325, 2325, 1962, 2325, 1847, 1962, 2325,
+ 2325, 2325, 1940, 2325, 2325, 2325, 1963, 2325, 1966, 1493,
+ 695, 1964, 695, 1962, 2325, 1847, 1962, 2325, 1964, 1967,
+ 1940, 2325, 2325, 2325, 1963, 2325, 1494, 2325, 695, 2325,
+ 695, 1847, 2325, 1847, 1847, 2325, 1964, 1023, 852, 2325,
+ 898, 872, 898, 2325, 1133, 898, 898, 898, 898, 1134,
+ 1965, 2325, 898, 898, 898, 1133, 898, 2325, 1296, 898,
+ 713, 898, 2325, 898, 898, 2325, 2325, 1966, 1965, 2325,
+ 2325, 2325, 1962, 2325, 1847, 1962, 2325, 2325, 2325, 1940,
+ 2325, 2325, 2325, 1963, 2325, 1966, 1849, 695, 2325, 695,
+
+ 1962, 2325, 1847, 1962, 2040, 1964, 2325, 1940, 2325, 2325,
+ 2325, 1963, 2325, 1850, 2325, 695, 2325, 695, 2325, 2325,
+ 2325, 2325, 2325, 1964, 1023, 2325, 2325, 898, 1001, 898,
+ 2325, 1133, 898, 898, 898, 898, 1134, 1965, 2325, 898,
+ 898, 898, 1133, 898, 2325, 1296, 898, 713, 898, 2325,
+ 898, 898, 2325, 2325, 1966, 1965, 2325, 2325, 2325, 2325,
+ 2325, 2325, 1962, 2325, 1847, 1962, 2325, 2325, 2325, 1940,
+ 2325, 2325, 1966, 1963, 2325, 2325, 2325, 695, 2325, 695,
+ 1962, 2325, 1847, 1962, 2325, 1964, 1968, 1940, 2325, 2325,
+ 2325, 1963, 1297, 2325, 2325, 695, 2325, 695, 2325, 2325,
+
+ 2325, 1023, 2325, 1964, 898, 1001, 516, 2325, 2325, 516,
+ 1131, 2325, 1131, 1131, 1131, 2325, 1131, 1965, 1227, 516,
+ 1131, 2325, 1131, 1131, 1131, 2325, 2325, 1131, 516, 1131,
+ 516, 1131, 1131, 2325, 1966, 1965, 2325, 2325, 2325, 2325,
+ 1962, 2325, 1847, 1962, 2325, 2325, 2325, 1940, 2325, 2325,
+ 2325, 1963, 1966, 2325, 516, 695, 516, 695, 1962, 2325,
+ 1847, 1962, 2325, 1964, 2325, 1940, 2325, 2325, 2325, 1963,
+ 2325, 2325, 2325, 695, 2325, 695, 2325, 2325, 2325, 2325,
+ 2325, 1964, 2325, 2325, 1132, 1131, 898, 2325, 1133, 898,
+ 898, 898, 898, 1134, 2325, 1965, 898, 898, 898, 1133,
+
+ 898, 2325, 1136, 898, 713, 898, 2325, 898, 898, 2325,
+ 2325, 2325, 1966, 1965, 2325, 2325, 1962, 1964, 1847, 1962,
+ 2325, 2325, 2325, 1940, 2325, 2325, 2325, 1963, 2325, 2325,
+ 1966, 695, 1102, 695, 695, 1102, 2325, 2325, 2325, 1964,
+ 2325, 2325, 2119, 695, 2120, 2119, 2325, 2325, 2325, 1940,
+ 1300, 2325, 2325, 1963, 695, 695, 2325, 695, 1023, 695,
+ 2325, 898, 711, 898, 2325, 898, 898, 898, 898, 898,
+ 1134, 1965, 2325, 898, 898, 898, 898, 898, 2325, 898,
+ 898, 564, 898, 2325, 898, 898, 1102, 1102, 1966, 2325,
+ 2121, 2325, 2325, 2325, 2325, 2055, 2325, 1965, 2119, 2325,
+
+ 2120, 2119, 2325, 2325, 1102, 1940, 2325, 2325, 2325, 1941,
+ 2325, 2325, 2325, 695, 1966, 695, 1491, 2325, 1491, 1491,
+ 2325, 2325, 2325, 2325, 2325, 2325, 1847, 1652, 1847, 1847,
+ 2325, 2325, 2325, 852, 2325, 1023, 2325, 2325, 898, 690,
+ 255, 1301, 2325, 1301, 1301, 1302, 2121, 297, 2325, 1303,
+ 1304, 255, 1305, 1965, 1306, 1307, 1308, 1309, 299, 1310,
+ 2325, 301, 2325, 1311, 1312, 1313, 2325, 281, 2325, 2325,
+ 1966, 1493, 2325, 1102, 2325, 695, 1102, 2325, 2325, 2325,
+ 2325, 1849, 2325, 1102, 695, 695, 1102, 2325, 1494, 1314,
+ 285, 2325, 1315, 2325, 695, 695, 695, 1962, 1850, 1847,
+
+ 1962, 2325, 2325, 2325, 1940, 695, 695, 2325, 1963, 2325,
+ 2325, 2325, 695, 2325, 695, 2325, 2325, 2325, 1316, 2325,
+ 1317, 303, 611, 2325, 611, 611, 2325, 1102, 1102, 612,
+ 2325, 612, 2325, 613, 614, 2325, 2129, 1102, 1102, 2325,
+ 2325, 2325, 2128, 2325, 612, 1102, 2325, 2325, 612, 2325,
+ 2325, 2325, 1965, 2325, 2325, 1102, 1847, 2325, 1847, 1847,
+ 2325, 2325, 2325, 852, 2325, 2325, 2325, 2325, 2325, 1966,
+ 2325, 612, 2325, 2325, 2325, 2325, 2325, 615, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1329, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 616, 2325, 2325, 2325, 612, 2325,
+
+ 612, 406, 407, 2325, 407, 407, 406, 406, 417, 2325,
+ 406, 1849, 406, 418, 406, 406, 406, 406, 417, 417,
+ 417, 620, 621, 406, 422, 406, 406, 406, 1850, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 406, 2325, 406, 406, 620, 620, 620, 622, 620, 1057,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 623, 620, 620, 620, 2325, 406,
+ 2325, 406, 620, 612, 1334, 2325, 1327, 1334, 612, 612,
+ 612, 612, 612, 2325, 612, 612, 797, 2325, 612, 2325,
+
+ 612, 612, 612, 2325, 2325, 612, 2325, 612, 2325, 612,
+ 612, 2325, 2325, 2325, 1847, 2325, 1847, 1847, 2325, 2325,
+ 2325, 852, 2325, 2325, 1847, 1848, 1847, 1847, 2325, 2325,
+ 2325, 852, 2325, 612, 2325, 612, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 1102, 2325, 695, 1102, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 695, 2325, 2325, 2325, 2325,
+ 612, 612, 612, 612, 612, 612, 695, 695, 612, 1849,
+ 612, 612, 612, 612, 612, 2325, 612, 612, 797, 1849,
+ 612, 2325, 612, 612, 612, 2325, 1850, 612, 2325, 612,
+ 2325, 612, 612, 2325, 2325, 2325, 1850, 2325, 1102, 1102,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2183, 612, 1102, 612, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1335, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 612, 612, 612, 612, 612, 610, 630, 2325,
+ 611, 630, 610, 610, 610, 612, 610, 631, 610, 613,
+ 632, 2325, 610, 2325, 610, 610, 610, 2325, 2325, 610,
+ 631, 610, 2325, 610, 612, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2258, 2325, 2259, 2258, 2325, 2325, 612, 1940, 610,
+
+ 2325, 2325, 1963, 634, 2325, 2325, 695, 2325, 695, 2325,
+ 2325, 1338, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 635, 2325, 2325, 2325, 612, 610, 612, 610, 610, 406,
+ 1163, 2325, 1163, 1163, 406, 406, 406, 2325, 406, 2260,
+ 406, 408, 406, 406, 406, 406, 1965, 406, 406, 2325,
+ 406, 406, 2325, 406, 406, 406, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 1966, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2258, 2325, 2259, 2258, 2325, 2325, 406, 1940,
+ 406, 406, 2325, 1941, 2325, 805, 2325, 695, 2325, 695,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 806, 2325, 2325, 2325, 2325, 406, 2325, 406,
+ 406, 407, 2325, 407, 407, 406, 406, 406, 2325, 406,
+ 2260, 406, 408, 406, 406, 406, 406, 1965, 406, 406,
+ 2325, 406, 406, 2325, 406, 406, 406, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 1966, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 406,
+ 2325, 406, 406, 2325, 2325, 2325, 805, 2325, 2325, 2325,
+ 2325, 2325, 1339, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 806, 2325, 2325, 2325, 2325, 406, 2325,
+ 406, 406, 407, 2325, 407, 407, 406, 406, 417, 2325,
+
+ 406, 2325, 406, 418, 406, 406, 406, 406, 419, 417,
+ 417, 807, 621, 406, 422, 406, 406, 406, 2325, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 406, 2325, 406, 406, 807, 807, 807, 808, 807, 807,
+ 807, 807, 807, 807, 807, 1340, 807, 807, 807, 807,
+ 807, 807, 807, 807, 809, 807, 807, 807, 2325, 406,
+ 2325, 406, 807, 406, 407, 2325, 407, 407, 406, 406,
+ 406, 2325, 406, 2325, 406, 408, 406, 406, 406, 406,
+ 406, 406, 406, 812, 813, 406, 2325, 406, 406, 406,
+
+ 2325, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 406, 2325, 406, 406, 812, 812, 812, 814,
+ 812, 812, 812, 812, 812, 812, 812, 1341, 812, 812,
+ 812, 812, 812, 812, 812, 812, 815, 812, 812, 812,
+ 2325, 406, 2325, 406, 812, 406, 407, 2325, 407, 407,
+ 406, 406, 417, 2325, 406, 2325, 406, 418, 406, 406,
+ 406, 406, 419, 417, 417, 420, 421, 406, 422, 406,
+ 406, 406, 2325, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+
+ 420, 420, 420, 420, 406, 2325, 406, 406, 420, 420,
+ 420, 423, 420, 1075, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 424, 420,
+ 420, 420, 2325, 406, 2325, 406, 420, 1357, 2325, 1357,
+ 1357, 1358, 2325, 483, 2325, 1359, 1360, 2325, 1361, 2325,
+ 1362, 1363, 1364, 1365, 483, 1366, 2325, 485, 2325, 1367,
+ 1368, 1369, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1370, 2325, 2325, 1371, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 1372, 2325, 1364, 695, 695, 2325,
+ 695, 695, 695, 695, 984, 852, 695, 695, 695, 696,
+ 695, 695, 695, 695, 695, 984, 695, 1202, 1203, 695,
+ 987, 695, 695, 695, 695, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 695, 695, 695, 695,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1375, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 695, 695, 695, 695, 1202, 695,
+
+ 695, 2325, 695, 695, 695, 695, 984, 852, 695, 695,
+ 695, 696, 695, 695, 695, 695, 695, 984, 695, 985,
+ 986, 695, 987, 695, 695, 695, 695, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 695, 695,
+ 695, 695, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 1376, 985, 985, 985, 985, 985, 695, 695, 695, 695,
+ 985, 695, 2325, 2325, 695, 2325, 695, 695, 695, 852,
+ 695, 2325, 695, 695, 695, 2325, 695, 2325, 695, 695,
+
+ 695, 2325, 2325, 695, 695, 695, 1377, 695, 695, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1102, 2325, 695,
+ 1102, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695, 2325,
+ 695, 695, 695, 695, 2325, 2325, 2325, 2325, 2325, 695,
+ 695, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695, 695,
+ 695, 695, 695, 898, 2325, 1133, 898, 898, 898, 898,
+ 1134, 1102, 1102, 898, 898, 898, 1133, 898, 2325, 1296,
+ 898, 713, 898, 2325, 898, 898, 2325, 2184, 2325, 1102,
+ 2325, 2325, 2325, 2325, 1102, 2325, 695, 1102, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 695, 2325, 2325, 2325, 1102,
+ 2325, 695, 1102, 2325, 2325, 2325, 695, 695, 2325, 2325,
+ 695, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 695, 695, 2325, 2325, 1023, 2325, 2325, 898, 1001,
+ 898, 2325, 1133, 898, 898, 898, 898, 1134, 1102, 1102,
+ 898, 898, 898, 1133, 898, 2325, 1296, 898, 713, 898,
+ 2325, 898, 898, 1102, 1102, 2325, 1102, 2325, 2325, 2325,
+ 2230, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1102, 2325, 2325, 2325, 2325, 1102, 2325, 695, 1102,
+ 2325, 2325, 2325, 1391, 2325, 2325, 2325, 695, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695, 695,
+ 2325, 2325, 1023, 2325, 2325, 898, 1001, 898, 2325, 1133,
+ 898, 898, 898, 898, 1134, 2325, 2325, 898, 898, 898,
+ 1133, 898, 2325, 1136, 898, 713, 898, 2325, 898, 898,
+ 1102, 1102, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2265,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1102, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1102, 1394, 695, 1102, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 695, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695, 695, 1023,
+ 2325, 2325, 898, 711, 1301, 2325, 1301, 1301, 1395, 2325,
+
+ 2325, 2325, 1303, 1304, 2325, 1396, 2325, 1397, 1398, 1308,
+ 1399, 2325, 1400, 2325, 2325, 2325, 1401, 1402, 1313, 1102,
+ 1102, 2325, 2183, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1102, 2325, 2325,
+ 2325, 2325, 1314, 2325, 2325, 1403, 2325, 2325, 2325, 2325,
+ 1404, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1405,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1406, 2325, 1308, 255, 2325, 2325, 2325, 2325, 255,
+ 2325, 2325, 2325, 2325, 2325, 255, 1407, 2325, 255, 1409,
+ 2325, 2325, 280, 255, 2325, 2325, 2325, 2325, 1317, 2325,
+
+ 2325, 281, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 255, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 255, 2325, 255, 255, 255, 2325, 2325, 2325,
+ 2325, 255, 2325, 2325, 2325, 2325, 2325, 255, 1407, 2325,
+ 255, 279, 2325, 1410, 283, 284, 2325, 2325, 2325, 2325,
+ 1317, 1411, 2325, 281, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 285, 2325, 255, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 255, 2325, 255, 255, 523, 2325,
+ 2325, 523, 2325, 2325, 2325, 2325, 2325, 523, 2325, 1407,
+ 2325, 523, 2325, 523, 2325, 2325, 2325, 1412, 523, 2325,
+ 1413, 1308, 524, 2325, 2325, 1414, 1415, 1416, 1417, 1418,
+ 1412, 1412, 1419, 1420, 1412, 1421, 1422, 1412, 1412, 1423,
+ 1424, 1412, 1425, 1426, 1427, 1428, 2325, 2325, 2325, 2325,
+ 1412, 1429, 1430, 1431, 1432, 1433, 1412, 1412, 1434, 1435,
+
+ 1436, 1437, 1412, 1412, 1438, 1439, 1412, 1440, 1441, 1442,
+ 1443, 1412, 1412, 1412, 611, 2325, 611, 611, 2325, 2325,
+ 2325, 612, 2325, 612, 2325, 613, 614, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 612, 2325, 2325, 2325,
+ 612, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 612, 2325, 2325, 2325, 2325, 2325, 615,
+ 2325, 1161, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 616, 2325, 2325, 2325,
+ 612, 2325, 612, 612, 1334, 2325, 1327, 1334, 612, 612,
+
+ 612, 612, 612, 2325, 612, 612, 797, 2325, 612, 2325,
+ 612, 612, 612, 2325, 2325, 612, 2325, 612, 2325, 612,
+ 612, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 612, 2325, 612, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 612, 612, 612, 612, 612, 612, 2325, 2325, 612, 2325,
+ 612, 612, 612, 612, 612, 2325, 612, 612, 797, 2325,
+ 612, 2325, 612, 612, 612, 2325, 2325, 612, 2325, 612,
+
+ 2325, 612, 612, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 612, 2325, 612, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1458,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 612, 612, 612, 612, 612, 610, 630, 2325,
+ 611, 630, 610, 610, 610, 612, 610, 631, 610, 613,
+ 632, 2325, 610, 2325, 610, 610, 610, 2325, 2325, 610,
+ 631, 610, 2325, 610, 612, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 612, 2325, 610,
+ 2325, 2325, 2325, 634, 2325, 1174, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 635, 2325, 2325, 2325, 612, 610, 612, 610, 610, 406,
+ 407, 2325, 407, 407, 406, 406, 406, 2325, 406, 2325,
+ 406, 408, 406, 406, 406, 406, 2325, 406, 406, 2325,
+ 406, 406, 2325, 406, 406, 406, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 406, 2325,
+ 406, 406, 2325, 2325, 2325, 805, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 1460, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 806, 2325, 2325, 2325, 2325, 406, 2325, 406,
+ 406, 407, 2325, 407, 407, 406, 406, 417, 2325, 406,
+ 2325, 406, 418, 406, 406, 406, 406, 419, 417, 417,
+ 807, 621, 406, 422, 406, 406, 406, 2325, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 406,
+ 2325, 406, 406, 807, 807, 807, 808, 807, 1178, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 809, 807, 807, 807, 2325, 406, 2325,
+
+ 406, 807, 406, 407, 2325, 407, 407, 406, 406, 406,
+ 2325, 406, 2325, 406, 408, 406, 406, 406, 406, 406,
+ 406, 406, 812, 813, 406, 2325, 406, 406, 406, 2325,
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 406, 2325, 406, 406, 812, 812, 812, 814, 812,
+ 1180, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 815, 812, 812, 812, 2325,
+ 406, 2325, 406, 812, 1473, 2325, 1357, 1473, 1474, 2325,
+ 2325, 2325, 1475, 1476, 2325, 1477, 2325, 1478, 1479, 1364,
+
+ 1480, 2325, 1481, 2325, 2325, 2325, 1482, 1483, 1484, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 1485, 2325, 2325, 1486, 2325, 2325, 2325, 2325,
+ 1487, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1488,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1489, 2325, 1490, 1502, 1503, 1290, 1503, 1503, 1502,
+ 1502, 1502, 1504, 1502, 1502, 1502, 1502, 1502, 1502, 1502,
+ 1502, 1502, 1502, 1502, 695, 1502, 1502, 1502, 1502, 1502,
+ 1502, 1502, 695, 695, 695, 695, 695, 695, 695, 695,
+
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 1502, 1502, 1502, 1502, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 1502, 1502, 1502, 1502, 1502, 695, 695, 2325, 695,
+ 695, 695, 695, 695, 852, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 2325, 695, 695, 695,
+ 695, 695, 695, 695, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 695, 695, 695, 695, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1505, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 695, 695, 695, 695, 695, 695, 695,
+ 2325, 695, 695, 695, 695, 984, 852, 695, 695, 695,
+ 696, 695, 695, 695, 695, 695, 984, 695, 1202, 1203,
+ 695, 987, 695, 695, 695, 695, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 695, 695, 695,
+ 695, 1202, 1506, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+
+ 1202, 1202, 1202, 1202, 1202, 695, 695, 695, 695, 1202,
+ 695, 695, 2325, 695, 695, 695, 695, 984, 852, 695,
+ 695, 695, 696, 695, 695, 695, 695, 695, 984, 695,
+ 985, 986, 695, 987, 695, 695, 695, 695, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 695,
+ 695, 695, 695, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 1507, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 695, 695, 695,
+ 695, 985, 1513, 2325, 1513, 1513, 1514, 2325, 710, 2325,
+
+ 1515, 1516, 2325, 1517, 2325, 1518, 1519, 1520, 1521, 710,
+ 1522, 2325, 712, 2325, 1523, 1524, 1525, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1526, 2325, 2325, 1527, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1528,
+ 2325, 1520, 1513, 2325, 1513, 1513, 1514, 2325, 710, 2325,
+ 1515, 1516, 2325, 1517, 2325, 1518, 1532, 1520, 1533, 718,
+ 1522, 2325, 712, 2325, 1523, 1524, 1525, 2325, 281, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1526, 2325, 2325, 1527, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1528,
+ 2325, 1520, 711, 898, 2325, 1133, 898, 898, 898, 898,
+ 1134, 2325, 2325, 898, 898, 898, 1133, 898, 2325, 1296,
+ 898, 713, 898, 2325, 898, 898, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1534, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1023, 2325, 2325, 898, 1001,
+ 898, 2325, 1133, 898, 898, 898, 898, 1134, 2325, 2325,
+ 898, 898, 898, 1133, 898, 2325, 1136, 898, 713, 898,
+ 2325, 898, 898, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 1537, 2325, 2325, 2325,
+
+ 2325, 2325, 1023, 2325, 2325, 898, 711, 255, 2325, 2325,
+ 2325, 2325, 255, 2325, 2325, 2325, 2325, 2325, 255, 1407,
+ 2325, 255, 2325, 2325, 2325, 280, 255, 2325, 2325, 2325,
+ 2325, 255, 2325, 2325, 281, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 255,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 255, 2325, 255, 255, 255,
+ 2325, 2325, 2325, 2325, 255, 2325, 2325, 2325, 2325, 2325,
+
+ 255, 1407, 2325, 255, 279, 2325, 2325, 283, 284, 2325,
+ 2325, 2325, 2325, 255, 2325, 2325, 281, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 285,
+ 2325, 255, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 255, 2325, 255,
+ 255, 612, 2325, 2325, 612, 2325, 612, 612, 612, 612,
+ 612, 2325, 612, 612, 797, 2325, 612, 2325, 612, 612,
+ 612, 2325, 2325, 612, 2325, 612, 2325, 612, 612, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 612, 2325, 612, 2325, 2325, 2325, 2325, 2325, 1252,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 612, 612,
+ 612, 612, 612, 406, 407, 2325, 407, 407, 406, 406,
+ 406, 2325, 406, 2325, 406, 408, 406, 406, 406, 406,
+ 2325, 406, 406, 2325, 406, 406, 2325, 406, 406, 406,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 406, 2325, 406, 406, 2325, 2325, 2325, 805,
+ 2325, 1258, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 806, 2325, 2325, 2325,
+ 2325, 406, 2325, 406, 1357, 2325, 1357, 1357, 1358, 2325,
+ 844, 2325, 1359, 1360, 2325, 1361, 2325, 1362, 1363, 1364,
+ 1365, 844, 1366, 2325, 846, 2325, 1583, 1368, 1369, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 1370, 2325, 2325, 1371, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1372, 2325, 1364, 1587, 2325, 1357, 1587, 1588, 2325,
+ 2325, 2325, 1589, 1590, 2325, 1591, 2325, 1592, 1593, 1364,
+ 1594, 2325, 1595, 2325, 2325, 2325, 1596, 1597, 1598, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 1599, 2325, 2325, 1600, 2325, 2325, 2325, 2325,
+ 1601, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1602,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1603, 2325, 1604, 695, 695, 2325, 695, 695, 695,
+
+ 695, 984, 852, 695, 695, 695, 696, 695, 695, 695,
+ 695, 695, 984, 695, 1202, 1203, 695, 987, 695, 695,
+ 695, 695, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 695, 695, 695, 695, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1627, 1202, 1202, 1202, 1202,
+ 1202, 695, 695, 695, 695, 1202, 695, 695, 2325, 695,
+ 695, 695, 695, 984, 852, 695, 695, 695, 696, 695,
+ 695, 695, 695, 695, 984, 695, 985, 986, 695, 987,
+
+ 695, 695, 695, 695, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 695, 695, 695, 695, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 1628, 985, 985, 985, 985,
+ 985, 985, 985, 695, 695, 695, 695, 985, 1634, 2325,
+ 1513, 1634, 1635, 2325, 2325, 2325, 1636, 1637, 2325, 1638,
+ 2325, 1639, 1640, 1520, 1641, 2325, 1642, 2325, 2325, 2325,
+ 1643, 1644, 1645, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 1646, 2325, 2325, 1647,
+ 2325, 2325, 2325, 2325, 1648, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 1649, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1650, 2325, 1651, 898, 2325,
+ 1133, 898, 898, 898, 898, 1134, 2325, 2325, 898, 898,
+ 898, 1133, 898, 2325, 1296, 898, 713, 898, 2325, 898,
+ 898, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1666, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1023, 2325, 2325, 898, 1001, 898, 2325, 1133, 898, 898,
+ 898, 898, 1134, 2325, 2325, 898, 898, 898, 1133, 898,
+ 2325, 1136, 898, 713, 898, 2325, 898, 898, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1669, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1023, 2325, 2325,
+ 898, 711, 1587, 2325, 1357, 1587, 1588, 2325, 2325, 2325,
+
+ 1589, 1590, 2325, 1591, 2325, 1592, 1593, 1364, 1594, 2325,
+ 1595, 2325, 2325, 2325, 1596, 1597, 1598, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1599, 2325, 2325, 1600, 2325, 2325, 2325, 2325, 1601, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1602, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1603,
+ 2325, 1604, 1720, 2325, 1720, 1720, 1721, 2325, 2325, 2325,
+ 1722, 1723, 2325, 1724, 2325, 1725, 1726, 1727, 1728, 2325,
+ 1729, 2325, 2325, 2325, 1730, 1731, 1732, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1733, 2325, 2325, 1734, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 985, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1735,
+ 2325, 1727, 1737, 2325, 1737, 1737, 1395, 2325, 710, 2325,
+ 1303, 1304, 2325, 1305, 2325, 1397, 1398, 1308, 1399, 710,
+ 1400, 2325, 1002, 2325, 1738, 1402, 1313, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 1314, 2325, 2325, 1403, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1406,
+ 2325, 1308, 1742, 2325, 1513, 1742, 1743, 2325, 2325, 2325,
+ 1744, 1745, 2325, 1746, 2325, 1747, 1748, 1520, 1749, 2325,
+ 1750, 2325, 2325, 2325, 1751, 1752, 1753, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1754, 2325, 2325, 1755, 2325, 2325, 2325, 2325, 1756, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1757, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1758,
+ 2325, 1759, 1737, 2325, 1737, 1737, 1395, 2325, 710, 2325,
+ 1303, 1304, 2325, 1305, 2325, 1397, 1775, 1308, 1776, 718,
+ 1400, 2325, 1002, 2325, 1738, 1402, 1313, 2325, 281, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1314, 2325, 2325, 1403, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1406,
+ 2325, 1308, 1001, 898, 2325, 1133, 898, 898, 898, 898,
+
+ 1134, 2325, 2325, 898, 898, 898, 1133, 898, 2325, 1296,
+ 898, 713, 898, 2325, 898, 898, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1779,
+ 2325, 2325, 2325, 2325, 2325, 1023, 2325, 2325, 898, 1001,
+ 898, 2325, 1133, 898, 898, 898, 898, 1134, 2325, 2325,
+ 898, 898, 898, 1133, 898, 2325, 1136, 898, 713, 898,
+ 2325, 898, 898, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 1782, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 1023, 2325, 2325, 898, 711, 1357, 2325, 1357,
+ 1357, 1358, 2325, 844, 2325, 1359, 1360, 2325, 1361, 2325,
+ 1362, 1363, 1364, 1365, 844, 1366, 2325, 1092, 2325, 1583,
+ 1368, 1369, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1370, 2325, 2325, 1371, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 1372, 2325, 1364, 1828, 2325, 1720,
+ 1828, 1829, 2325, 2325, 1830, 1831, 1832, 2325, 1833, 2325,
+ 1834, 1835, 1727, 1836, 695, 1837, 2325, 2325, 2325, 1838,
+ 1839, 1840, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1841, 2325, 2325, 1842, 2325,
+ 2325, 2325, 2325, 1843, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 1844, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 1845, 2325, 1846, 695, 2325, 2325,
+ 695, 2325, 695, 695, 695, 852, 695, 2325, 695, 695,
+ 1851, 2325, 695, 2325, 695, 695, 695, 2325, 2325, 695,
+ 2325, 695, 2325, 695, 695, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695, 2325, 695,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 695, 695, 695, 695, 695, 695,
+ 1853, 2325, 1847, 1853, 695, 695, 695, 852, 695, 1102,
+
+ 695, 1848, 695, 1102, 695, 1102, 695, 695, 695, 1102,
+ 1102, 695, 1854, 1727, 1103, 695, 695, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 695, 695,
+ 695, 695, 1102, 1102, 1104, 1855, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1856, 1102, 1102, 1102, 695, 695, 695, 695,
+ 695, 1737, 2325, 1737, 1737, 1395, 2325, 2325, 2325, 1303,
+ 1304, 2325, 1396, 2325, 1397, 1398, 1308, 1399, 2325, 1400,
+ 2325, 2325, 2325, 1859, 1402, 1313, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1314,
+ 2325, 2325, 1403, 2325, 2325, 2325, 2325, 1404, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 1405, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1406, 2325,
+ 1308, 1742, 2325, 1513, 1742, 1743, 2325, 2325, 2325, 1744,
+ 1745, 2325, 1746, 2325, 1747, 1748, 1520, 1749, 2325, 1750,
+ 2325, 2325, 2325, 1751, 1752, 1753, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1754,
+
+ 2325, 2325, 1755, 2325, 2325, 2325, 2325, 1756, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 1757, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1758, 2325,
+ 1759, 898, 2325, 1133, 898, 898, 898, 898, 1134, 2325,
+ 2325, 898, 898, 898, 1133, 898, 2325, 1296, 898, 713,
+ 898, 2325, 898, 898, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 1880, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 1023, 2325, 2325, 898, 1001, 1290, 1291,
+ 1290, 1291, 1291, 1881, 1290, 1881, 1881, 1881, 1881, 1881,
+ 1882, 1290, 1290, 1881, 1881, 1881, 1881, 1881, 2325, 1881,
+ 1881, 1290, 1881, 1290, 1881, 1881, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1290, 1290, 1290,
+ 1290, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1882, 1290, 1290, 1881, 1290,
+ 1513, 2325, 1513, 1513, 1884, 2325, 1133, 898, 1885, 1886,
+
+ 898, 1887, 2325, 1518, 1888, 1889, 1890, 1133, 1891, 2325,
+ 1136, 898, 1523, 1892, 1525, 898, 898, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1526, 2325,
+ 2325, 1527, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 1023, 1528, 2325, 1889,
+ 711, 1923, 2325, 1923, 1923, 1924, 2325, 2325, 2325, 1925,
+ 1926, 2325, 1927, 2325, 1928, 1929, 1930, 1931, 2325, 1932,
+ 2325, 2325, 2325, 1933, 1934, 1935, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1936,
+ 2325, 2325, 1937, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1202, 2325, 2325, 2325, 2325, 2325, 2325, 1938, 2325,
+ 1930, 1943, 2325, 1720, 1943, 1944, 2325, 2325, 1945, 1946,
+ 1947, 2325, 1948, 2325, 1949, 1950, 1727, 1951, 695, 1952,
+ 2325, 2325, 2325, 1953, 1954, 1955, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1956,
+
+ 2325, 2325, 1957, 2325, 2325, 2325, 2325, 1958, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 1959, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1960, 2325,
+ 1961, 695, 2325, 2325, 695, 2325, 695, 695, 695, 852,
+ 695, 2325, 695, 695, 1972, 2325, 695, 2325, 695, 695,
+ 695, 2325, 2325, 695, 2325, 695, 2325, 695, 695, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 695, 2325, 695, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695, 695,
+ 695, 695, 695, 516, 2325, 2325, 516, 1131, 2325, 1131,
+ 1131, 1131, 2325, 1131, 2325, 2004, 516, 1131, 2325, 1131,
+ 1131, 1131, 2325, 2325, 1131, 516, 1131, 516, 1131, 1131,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 516, 2325, 516, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1132, 1131, 1923, 2325, 1923, 1923, 1924, 2325, 2325,
+
+ 852, 1925, 1926, 2325, 2028, 2325, 1928, 1929, 1930, 1931,
+ 2325, 1932, 2325, 2325, 2325, 2029, 1934, 1935, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1936, 2325, 2325, 1937, 2325, 2325, 2325, 2325, 2030,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2031, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1938, 2325, 1930, 695, 2325, 2325, 695, 2325, 695, 695,
+ 695, 852, 695, 2325, 695, 695, 2033, 2325, 695, 2325,
+ 695, 695, 695, 2325, 2325, 695, 2325, 695, 2325, 695,
+
+ 695, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 695, 2325, 695, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 695, 695, 695, 695, 695, 695, 2325, 2325, 695, 2325,
+ 695, 695, 695, 852, 695, 2325, 695, 695, 2038, 2325,
+ 695, 2325, 695, 695, 695, 2325, 2325, 695, 2325, 695,
+ 2325, 695, 695, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 695, 2325, 695, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 695, 695, 695, 695, 695, 1943, 2325, 1720,
+ 1943, 1944, 2325, 2325, 1945, 1946, 1947, 2325, 1948, 2325,
+ 1949, 1950, 1727, 1951, 695, 1952, 2325, 2325, 2325, 1953,
+ 1954, 1955, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1956, 2325, 2325, 1957, 2325,
+ 2325, 2325, 2325, 1958, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 1959, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 1960, 2325, 1961, 695, 2325, 2325,
+ 695, 2325, 695, 695, 695, 852, 695, 2325, 695, 695,
+ 2039, 2325, 695, 2325, 695, 695, 695, 2325, 2325, 695,
+ 2325, 695, 2325, 695, 695, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695, 2325, 695,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 695, 695, 695, 695, 695, 695,
+
+ 2325, 2325, 695, 2325, 695, 695, 695, 852, 695, 2325,
+ 695, 695, 2042, 2325, 695, 2325, 695, 695, 695, 2325,
+ 2325, 695, 2325, 695, 2325, 695, 695, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695,
+ 2325, 695, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 695, 695, 695, 695,
+ 695, 695, 2325, 2325, 695, 2325, 695, 695, 695, 852,
+ 695, 2325, 695, 695, 1972, 2325, 695, 2325, 695, 695,
+
+ 695, 2325, 2325, 695, 2325, 695, 2325, 695, 695, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 695, 2325, 695, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695, 695,
+ 695, 695, 695, 1737, 2325, 1737, 1737, 2071, 2325, 2325,
+ 2325, 2072, 2073, 2325, 2074, 2325, 1397, 2075, 2076, 2077,
+ 2325, 2078, 2325, 2325, 2325, 1738, 2079, 1313, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1314, 2325, 2325, 1403, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1295,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1406, 2325, 2076, 1769, 2325, 2325, 1769, 1131, 2325, 1131,
+ 1131, 1131, 2325, 1131, 2325, 2081, 1769, 1131, 2325, 1131,
+ 1131, 1131, 2325, 2325, 1131, 1769, 1131, 1769, 1131, 1131,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1769, 2325, 1769, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1132, 1131, 1502, 1502, 1290, 1502, 1502, 1502, 1502,
+ 1502, 1504, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502,
+ 1502, 1502, 1502, 2325, 1502, 1502, 1502, 1502, 1502, 1502,
+ 1502, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 1502, 1502, 1502, 1502, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 1502, 1502, 1502, 1502, 1502, 695, 2325, 2325, 695, 2325,
+ 695, 695, 695, 852, 695, 2325, 695, 695, 2109, 2325,
+ 695, 2325, 695, 695, 695, 2325, 2325, 695, 2325, 695,
+ 2325, 695, 695, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 695, 2325, 695, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 695, 695, 695, 695, 695, 695, 2325, 2325,
+ 695, 2325, 695, 695, 695, 852, 695, 2325, 695, 695,
+
+ 2042, 2325, 695, 2325, 695, 695, 695, 2325, 2325, 695,
+ 2325, 695, 2325, 695, 695, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695, 2325, 695,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 695, 695, 695, 695, 695, 516,
+ 2325, 2325, 516, 1131, 2325, 1131, 1131, 1131, 2325, 1131,
+ 2325, 2142, 516, 1131, 2325, 1131, 1131, 1131, 2325, 2325,
+ 1131, 516, 1131, 516, 1131, 1131, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 516, 2325, 516,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1132, 1131, 1769,
+ 2325, 2325, 1769, 1131, 2325, 1131, 1131, 1131, 2325, 1131,
+ 2325, 2081, 1769, 1131, 2325, 1131, 1131, 1131, 2325, 2325,
+ 1131, 1769, 1131, 1769, 1131, 1131, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1769, 2325, 1769,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1132, 1131, 695,
+ 2325, 2325, 695, 2325, 695, 695, 695, 852, 695, 2325,
+ 695, 695, 2109, 2325, 695, 2325, 695, 695, 695, 2325,
+ 2325, 695, 2325, 695, 2325, 695, 695, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 695,
+ 2325, 695, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 695, 695, 695, 695,
+ 695, 1540, 2325, 2325, 1540, 1131, 2325, 1131, 1131, 1131,
+ 2325, 1131, 2325, 2198, 1540, 1131, 2325, 1131, 1131, 1131,
+ 2325, 2325, 1131, 1540, 1131, 1540, 1131, 1131, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1540,
+ 2325, 1540, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1132,
+ 1131, 1540, 2325, 2325, 1540, 1131, 2325, 1131, 1131, 1131,
+
+ 2325, 1131, 2325, 2198, 1540, 1131, 2325, 1131, 1131, 1131,
+ 2325, 2325, 1131, 1540, 1131, 1540, 1131, 1131, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1540,
+ 2325, 1540, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1132,
+ 1131, 1290, 1291, 1290, 1291, 1291, 1881, 1290, 1881, 1881,
+ 1881, 1881, 1881, 1882, 1290, 1290, 1881, 1881, 1881, 1881,
+ 1881, 2325, 1881, 1881, 1290, 1881, 1290, 1881, 1881, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1290, 1290, 1290, 1290, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1882, 1290,
+ 1290, 1881, 1290, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+
+ 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 125, 125, 125,
+
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 140, 140, 140, 140, 140, 140, 140,
+ 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+ 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
+ 140, 140, 140, 140, 140, 140, 140, 140, 140, 142,
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+
+ 142, 142, 142, 142, 142, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+ 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+ 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+ 156, 156, 156, 156, 156, 156, 156, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+
+ 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 197, 197, 197,
+ 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+ 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+ 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+ 197, 197, 197, 213, 213, 213, 213, 213, 213, 213,
+
+ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213, 213, 225,
+ 225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+
+ 71, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 246, 246, 246, 246, 246, 246, 246,
+ 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+ 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
+
+ 246, 246, 246, 246, 246, 246, 246, 246, 246, 255,
+ 2325, 2325, 2325, 255, 2325, 2325, 2325, 2325, 2325, 255,
+ 2325, 2325, 255, 255, 2325, 255, 2325, 255, 255, 2325,
+ 2325, 2325, 255, 2325, 2325, 2325, 255, 2325, 2325, 2325,
+ 255, 2325, 2325, 255, 255, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 279, 2325, 2325, 2325, 279, 2325, 2325, 2325, 2325,
+ 2325, 279, 2325, 2325, 279, 279, 2325, 279, 279, 279,
+
+ 279, 2325, 2325, 2325, 279, 2325, 2325, 279, 279, 2325,
+ 2325, 2325, 279, 2325, 2325, 279, 279, 282, 2325, 2325,
+ 2325, 282, 2325, 2325, 2325, 2325, 2325, 282, 2325, 2325,
+ 282, 282, 2325, 282, 282, 282, 282, 2325, 2325, 2325,
+ 282, 2325, 2325, 282, 282, 2325, 282, 2325, 282, 2325,
+ 2325, 282, 282, 280, 2325, 280, 280, 2325, 280, 2325,
+ 2325, 2325, 2325, 2325, 2325, 280, 280, 293, 293, 293,
+ 293, 293, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 293, 2325, 293, 2325, 293, 2325, 293, 293,
+ 2325, 293, 2325, 2325, 2325, 2325, 293, 300, 2325, 2325,
+
+ 2325, 300, 2325, 300, 2325, 2325, 2325, 300, 300, 2325,
+ 300, 300, 2325, 300, 300, 300, 300, 300, 2325, 300,
+ 300, 2325, 2325, 300, 300, 2325, 300, 2325, 300, 2325,
+ 2325, 300, 300, 313, 2325, 2325, 2325, 313, 2325, 2325,
+ 313, 2325, 2325, 313, 2325, 2325, 313, 313, 2325, 313,
+ 2325, 313, 313, 2325, 2325, 2325, 313, 2325, 2325, 2325,
+ 313, 2325, 2325, 2325, 313, 2325, 2325, 313, 313, 303,
+ 2325, 2325, 2325, 303, 2325, 303, 2325, 2325, 2325, 303,
+ 303, 2325, 303, 303, 2325, 303, 303, 303, 303, 303,
+ 2325, 303, 303, 2325, 2325, 2325, 303, 2325, 2325, 2325,
+
+ 303, 2325, 2325, 303, 303, 327, 327, 2325, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 2325, 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 330, 2325, 2325, 2325, 330, 2325, 2325, 2325, 2325,
+ 2325, 330, 2325, 2325, 330, 330, 2325, 330, 2325, 330,
+ 330, 2325, 2325, 2325, 330, 2325, 2325, 2325, 330, 2325,
+ 2325, 2325, 330, 2325, 2325, 330, 330, 332, 332, 332,
+ 332, 332, 332, 332, 332, 332, 332, 332, 332, 332,
+ 332, 332, 332, 332, 332, 332, 332, 332, 332, 332,
+
+ 332, 332, 332, 332, 332, 332, 332, 332, 332, 332,
+ 332, 332, 332, 344, 344, 344, 344, 344, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 344, 2325, 344, 2325, 344, 344, 2325, 344, 2325, 2325,
+ 2325, 2325, 344, 346, 2325, 2325, 2325, 346, 2325, 2325,
+ 2325, 2325, 2325, 346, 2325, 2325, 346, 346, 2325, 346,
+ 2325, 346, 346, 2325, 2325, 2325, 346, 2325, 2325, 2325,
+ 346, 2325, 2325, 2325, 346, 2325, 2325, 346, 346, 353,
+ 353, 353, 353, 353, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 353, 2325, 353, 2325,
+
+ 353, 353, 2325, 353, 2325, 2325, 2325, 2325, 353, 359,
+ 2325, 359, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 359, 2325, 2325,
+ 2325, 359, 2325, 2325, 2325, 359, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 359, 361, 2325, 2325, 2325, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
+ 362, 362, 2325, 362, 362, 362, 362, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+
+ 362, 362, 2325, 362, 362, 362, 2325, 362, 362, 2325,
+ 362, 362, 362, 362, 362, 362, 371, 371, 2325, 371,
+ 371, 371, 371, 2325, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 2325, 371, 371, 2325, 371, 371, 371, 371,
+ 371, 371, 373, 373, 2325, 373, 373, 373, 373, 2325,
+ 373, 373, 373, 373, 373, 373, 373, 373, 373, 373,
+ 373, 373, 373, 373, 373, 373, 373, 373, 2325, 373,
+ 373, 2325, 373, 373, 373, 373, 373, 373, 375, 375,
+ 2325, 375, 375, 375, 375, 375, 375, 375, 375, 375,
+
+ 375, 375, 375, 375, 375, 375, 375, 375, 375, 375,
+ 375, 375, 375, 375, 2325, 375, 375, 2325, 375, 375,
+ 375, 375, 375, 375, 377, 377, 2325, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377, 377, 377,
+ 2325, 377, 377, 2325, 377, 377, 377, 377, 377, 377,
+ 379, 379, 2325, 379, 379, 379, 379, 379, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379, 379, 379,
+ 379, 379, 379, 379, 379, 379, 2325, 379, 379, 2325,
+ 379, 379, 379, 379, 379, 379, 381, 381, 2325, 381,
+
+ 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
+ 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
+ 381, 381, 2325, 381, 381, 2325, 381, 381, 381, 381,
+ 381, 381, 383, 383, 2325, 383, 383, 383, 383, 383,
+ 383, 383, 383, 383, 383, 383, 383, 383, 383, 383,
+ 383, 383, 383, 383, 383, 383, 383, 383, 2325, 383,
+ 383, 2325, 383, 383, 383, 383, 383, 383, 385, 2325,
+ 2325, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+ 385, 385, 385, 2325, 385, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+
+ 385, 385, 385, 385, 389, 389, 2325, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 399, 399, 2325, 399, 399, 2325, 399, 399, 399, 399,
+ 399, 399, 399, 399, 399, 399, 399, 399, 399, 399,
+ 399, 399, 399, 399, 399, 399, 399, 399, 399, 399,
+ 399, 399, 399, 399, 399, 399, 400, 2325, 400, 400,
+ 400, 400, 400, 2325, 2325, 2325, 2325, 2325, 2325, 400,
+ 2325, 400, 403, 2325, 403, 2325, 403, 403, 403, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 403, 2325, 403, 405, 405,
+ 2325, 2325, 405, 405, 405, 405, 405, 405, 405, 405,
+ 405, 405, 405, 405, 405, 405, 405, 405, 405, 405,
+ 405, 405, 405, 405, 405, 405, 405, 405, 405, 405,
+ 405, 405, 405, 405, 406, 406, 2325, 406, 406, 406,
+ 406, 2325, 406, 2325, 406, 406, 406, 406, 406, 406,
+ 406, 406, 406, 406, 406, 406, 2325, 406, 406, 406,
+ 2325, 406, 406, 2325, 406, 406, 2325, 2325, 406, 406,
+ 420, 420, 2325, 420, 420, 420, 420, 2325, 420, 2325,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+
+ 420, 420, 420, 420, 420, 420, 2325, 420, 420, 2325,
+ 420, 420, 2325, 2325, 420, 420, 434, 2325, 2325, 2325,
+ 2325, 434, 2325, 2325, 2325, 2325, 434, 434, 434, 434,
+ 434, 2325, 434, 2325, 2325, 2325, 2325, 434, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 434, 437, 2325, 2325, 2325,
+ 437, 2325, 2325, 2325, 2325, 2325, 437, 2325, 2325, 437,
+ 437, 2325, 437, 2325, 437, 437, 2325, 2325, 2325, 437,
+ 2325, 2325, 2325, 437, 2325, 2325, 2325, 437, 2325, 2325,
+ 437, 437, 444, 444, 444, 444, 444, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 444,
+
+ 2325, 444, 2325, 444, 444, 2325, 444, 2325, 2325, 2325,
+ 2325, 444, 448, 2325, 2325, 2325, 2325, 448, 448, 2325,
+ 448, 2325, 448, 448, 448, 448, 448, 2325, 2325, 2325,
+ 2325, 2325, 2325, 448, 255, 2325, 2325, 2325, 255, 2325,
+ 2325, 2325, 2325, 2325, 255, 2325, 2325, 255, 255, 2325,
+ 255, 2325, 255, 255, 2325, 2325, 2325, 255, 2325, 2325,
+ 2325, 255, 2325, 2325, 2325, 255, 2325, 2325, 255, 255,
+ 453, 453, 2325, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 2325, 453, 453, 2325,
+
+ 453, 453, 453, 453, 453, 453, 468, 2325, 468, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 468, 2325, 2325, 468, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 468, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 468, 469, 469, 469, 469, 469, 469, 469, 469, 469,
+ 469, 469, 469, 469, 469, 469, 469, 469, 469, 469,
+ 469, 469, 469, 469, 469, 469, 469, 469, 469, 469,
+ 469, 469, 469, 469, 469, 469, 469, 471, 471, 471,
+ 471, 471, 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 471, 471, 2325, 471, 471, 2325, 471, 471, 471,
+
+ 471, 471, 471, 2325, 2325, 471, 2325, 471, 471, 471,
+ 471, 471, 471, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 264, 482,
+ 482, 2325, 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 484, 2325, 2325, 2325, 2325,
+ 484, 2325, 2325, 2325, 2325, 2325, 484, 2325, 484, 484,
+
+ 2325, 484, 2325, 2325, 2325, 2325, 484, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 484, 492, 2325, 2325, 2325, 2325,
+ 492, 2325, 2325, 2325, 2325, 2325, 492, 2325, 492, 492,
+ 2325, 492, 2325, 2325, 2325, 2325, 492, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 492, 279, 2325, 2325, 2325, 279,
+ 2325, 2325, 2325, 2325, 2325, 279, 2325, 2325, 279, 279,
+ 2325, 279, 279, 279, 279, 2325, 2325, 2325, 279, 2325,
+ 2325, 279, 279, 2325, 2325, 2325, 279, 2325, 2325, 279,
+ 279, 280, 2325, 280, 280, 2325, 280, 2325, 2325, 2325,
+ 2325, 2325, 2325, 280, 280, 282, 2325, 2325, 2325, 282,
+
+ 2325, 2325, 2325, 2325, 2325, 282, 2325, 2325, 282, 282,
+ 2325, 282, 282, 282, 282, 2325, 2325, 2325, 282, 2325,
+ 2325, 282, 282, 2325, 282, 2325, 282, 2325, 2325, 282,
+ 282, 500, 2325, 500, 500, 2325, 500, 2325, 2325, 2325,
+ 2325, 2325, 2325, 500, 500, 501, 2325, 2325, 2325, 501,
+ 2325, 2325, 2325, 2325, 2325, 501, 2325, 2325, 501, 501,
+ 2325, 501, 2325, 501, 501, 2325, 2325, 2325, 501, 2325,
+ 2325, 2325, 501, 2325, 2325, 2325, 501, 2325, 2325, 501,
+ 501, 506, 506, 506, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 506, 506,
+
+ 2325, 2325, 2325, 2325, 506, 2325, 2325, 506, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 506, 516, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 516, 2325, 2325, 516, 516, 2325,
+ 516, 2325, 2325, 2325, 516, 516, 2325, 516, 2325, 516,
+ 2325, 2325, 516, 516, 2325, 516, 518, 2325, 2325, 2325,
+ 2325, 2325, 2325, 518, 2325, 518, 518, 2325, 518, 2325,
+ 2325, 2325, 2325, 2325, 2325, 518, 518, 2325, 2325, 2325,
+ 2325, 2325, 2325, 518, 518, 300, 2325, 2325, 2325, 300,
+ 2325, 300, 2325, 2325, 2325, 300, 300, 2325, 300, 300,
+ 2325, 300, 300, 300, 300, 300, 2325, 300, 300, 2325,
+
+ 2325, 300, 300, 2325, 300, 2325, 300, 2325, 2325, 300,
+ 300, 522, 2325, 2325, 2325, 522, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 522, 2325, 522, 2325, 2325, 2325,
+ 2325, 522, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 522,
+ 303, 2325, 2325, 2325, 303, 2325, 303, 2325, 2325, 2325,
+ 303, 303, 2325, 303, 303, 2325, 303, 303, 303, 303,
+ 303, 2325, 303, 303, 2325, 2325, 2325, 303, 2325, 2325,
+ 2325, 303, 2325, 2325, 303, 303, 563, 2325, 2325, 2325,
+ 563, 2325, 2325, 2325, 2325, 2325, 563, 563, 2325, 563,
+ 563, 2325, 563, 2325, 563, 563, 2325, 2325, 563, 563,
+
+ 2325, 2325, 2325, 563, 2325, 2325, 2325, 563, 2325, 2325,
+ 563, 563, 255, 255, 2325, 255, 255, 2325, 2325, 2325,
+ 2325, 2325, 255, 2325, 2325, 255, 255, 2325, 255, 255,
+ 255, 255, 2325, 2325, 2325, 255, 2325, 2325, 2325, 255,
+ 2325, 2325, 2325, 255, 2325, 2325, 255, 255, 327, 327,
+ 2325, 327, 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 2325, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 330, 2325, 2325, 2325, 330, 2325,
+ 2325, 2325, 2325, 2325, 330, 2325, 2325, 330, 330, 2325,
+
+ 330, 2325, 330, 330, 2325, 2325, 2325, 330, 2325, 2325,
+ 2325, 330, 2325, 2325, 2325, 330, 2325, 2325, 330, 330,
+ 332, 332, 332, 332, 332, 332, 332, 332, 332, 332,
+ 332, 332, 332, 332, 332, 332, 332, 332, 332, 332,
+ 332, 332, 332, 332, 332, 332, 332, 332, 332, 332,
+ 332, 332, 332, 332, 332, 332, 568, 568, 2325, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 576, 576, 576, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 576,
+ 576, 2325, 2325, 2325, 2325, 576, 2325, 2325, 576, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 576, 346, 2325, 2325,
+ 2325, 346, 2325, 2325, 2325, 2325, 2325, 346, 2325, 2325,
+ 346, 346, 2325, 346, 2325, 346, 346, 2325, 2325, 2325,
+ 346, 2325, 2325, 2325, 346, 2325, 2325, 2325, 346, 2325,
+ 2325, 346, 346, 359, 2325, 359, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 359, 2325, 2325, 2325, 359, 2325, 2325, 2325, 359,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 359, 361, 2325,
+
+ 2325, 2325, 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 362, 362, 2325, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 2325, 362, 362, 362,
+ 2325, 362, 362, 2325, 362, 362, 362, 362, 362, 362,
+ 371, 371, 2325, 371, 371, 371, 371, 2325, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 2325, 371, 371, 2325,
+
+ 371, 371, 371, 371, 371, 371, 373, 373, 2325, 373,
+ 373, 373, 373, 2325, 373, 373, 373, 373, 373, 373,
+ 373, 373, 373, 373, 373, 373, 373, 373, 373, 373,
+ 373, 373, 2325, 373, 373, 2325, 373, 373, 373, 373,
+ 373, 373, 375, 375, 2325, 375, 375, 375, 375, 375,
+ 375, 375, 375, 375, 375, 375, 375, 375, 375, 375,
+ 375, 375, 375, 375, 375, 375, 375, 375, 2325, 375,
+ 375, 2325, 375, 375, 375, 375, 375, 375, 377, 377,
+ 2325, 377, 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377, 377, 377,
+
+ 377, 377, 377, 377, 2325, 377, 377, 2325, 377, 377,
+ 377, 377, 377, 377, 379, 379, 2325, 379, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379, 379, 379,
+ 2325, 379, 379, 2325, 379, 379, 379, 379, 379, 379,
+ 381, 381, 2325, 381, 381, 381, 381, 381, 381, 381,
+ 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
+ 381, 381, 381, 381, 381, 381, 2325, 381, 381, 2325,
+ 381, 381, 381, 381, 381, 381, 383, 383, 2325, 383,
+ 383, 383, 383, 383, 383, 383, 383, 383, 383, 383,
+
+ 383, 383, 383, 383, 383, 383, 383, 383, 383, 383,
+ 383, 383, 2325, 383, 383, 2325, 383, 383, 383, 383,
+ 383, 383, 385, 2325, 2325, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 385, 385, 385, 2325, 385, 385,
+ 385, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 385, 385, 385, 385, 389, 389,
+ 2325, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 389,
+ 389, 389, 389, 389, 390, 390, 2325, 390, 390, 390,
+
+ 390, 390, 390, 390, 390, 390, 390, 390, 390, 390,
+ 390, 390, 390, 390, 390, 390, 390, 390, 390, 390,
+ 390, 390, 390, 390, 390, 390, 390, 390, 390, 390,
+ 399, 399, 2325, 399, 399, 399, 399, 399, 399, 399,
+ 399, 399, 399, 399, 399, 399, 399, 399, 399, 399,
+ 399, 399, 399, 399, 399, 399, 399, 399, 399, 399,
+ 399, 399, 399, 399, 399, 399, 400, 2325, 400, 400,
+ 400, 400, 400, 2325, 2325, 2325, 2325, 2325, 2325, 400,
+ 2325, 400, 605, 2325, 605, 2325, 605, 605, 605, 2325,
+ 2325, 2325, 2325, 2325, 2325, 605, 2325, 605, 403, 2325,
+
+ 403, 403, 403, 403, 403, 2325, 2325, 2325, 2325, 2325,
+ 2325, 403, 2325, 403, 405, 405, 2325, 2325, 405, 405,
+ 405, 405, 405, 405, 405, 405, 405, 405, 405, 405,
+ 405, 405, 405, 405, 405, 405, 405, 405, 405, 405,
+ 405, 405, 405, 405, 405, 405, 405, 405, 405, 405,
+ 406, 406, 2325, 406, 406, 406, 406, 2325, 406, 2325,
+ 406, 406, 406, 406, 406, 406, 406, 406, 406, 406,
+ 406, 406, 2325, 406, 406, 406, 2325, 406, 406, 2325,
+ 406, 406, 2325, 2325, 406, 406, 610, 610, 2325, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 620, 620, 2325, 620, 620, 620, 620, 2325,
+ 620, 2325, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 2325, 620,
+ 620, 2325, 620, 620, 2325, 2325, 620, 620, 628, 2325,
+ 2325, 2325, 2325, 628, 2325, 2325, 2325, 2325, 628, 628,
+ 628, 628, 628, 2325, 628, 2325, 2325, 2325, 2325, 628,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 628, 633, 633,
+ 2325, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 420, 420, 2325, 420, 420, 420,
+ 420, 2325, 420, 2325, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 2325, 420, 420, 2325, 420, 420, 2325, 2325, 420, 420,
+ 644, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 644, 2325,
+ 2325, 2325, 644, 2325, 644, 2325, 2325, 2325, 644, 644,
+ 2325, 2325, 2325, 644, 2325, 2325, 644, 649, 2325, 2325,
+ 2325, 2325, 649, 2325, 2325, 2325, 2325, 649, 649, 649,
+
+ 649, 649, 2325, 649, 2325, 2325, 2325, 2325, 649, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 649, 651, 2325, 2325,
+ 2325, 2325, 651, 2325, 2325, 2325, 2325, 651, 651, 651,
+ 651, 651, 2325, 651, 2325, 2325, 2325, 2325, 651, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 651, 652, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 652, 2325, 2325, 652, 652,
+ 2325, 652, 2325, 2325, 2325, 652, 652, 2325, 652, 2325,
+ 652, 2325, 2325, 652, 652, 2325, 652, 434, 2325, 2325,
+ 2325, 2325, 434, 2325, 2325, 2325, 2325, 434, 434, 434,
+ 434, 434, 2325, 434, 2325, 2325, 2325, 2325, 434, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 434, 658, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 658, 2325, 2325, 2325, 658,
+ 2325, 658, 2325, 2325, 2325, 658, 658, 2325, 2325, 2325,
+ 658, 2325, 2325, 658, 437, 2325, 2325, 2325, 437, 2325,
+ 2325, 2325, 2325, 2325, 437, 2325, 2325, 437, 437, 2325,
+ 437, 2325, 437, 437, 2325, 2325, 2325, 437, 2325, 2325,
+ 2325, 437, 2325, 2325, 2325, 437, 2325, 2325, 437, 437,
+ 448, 2325, 2325, 2325, 2325, 448, 448, 2325, 448, 2325,
+ 448, 448, 448, 448, 448, 2325, 2325, 2325, 2325, 2325,
+ 2325, 448, 255, 2325, 2325, 2325, 255, 2325, 2325, 2325,
+
+ 2325, 2325, 255, 2325, 2325, 255, 255, 2325, 255, 2325,
+ 255, 255, 2325, 2325, 2325, 255, 2325, 2325, 2325, 255,
+ 2325, 2325, 2325, 255, 2325, 2325, 255, 255, 453, 453,
+ 2325, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 2325, 453, 453, 2325, 453, 453,
+ 453, 453, 453, 453, 468, 2325, 468, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 468,
+ 2325, 2325, 468, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 468, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 468, 469,
+
+ 469, 469, 469, 469, 469, 469, 469, 469, 469, 469,
+ 469, 469, 469, 469, 469, 469, 469, 469, 469, 469,
+ 469, 469, 469, 469, 469, 469, 469, 469, 469, 469,
+ 469, 469, 469, 469, 469, 471, 471, 471, 471, 471,
+ 471, 471, 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 2325, 471, 471, 2325, 471, 471, 471, 471, 471,
+ 471, 2325, 2325, 471, 2325, 471, 471, 471, 471, 471,
+ 471, 482, 482, 2325, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482, 482, 482,
+
+ 482, 482, 482, 482, 482, 482, 482, 484, 2325, 2325,
+ 2325, 2325, 484, 2325, 2325, 2325, 2325, 2325, 484, 2325,
+ 484, 484, 2325, 484, 2325, 2325, 2325, 2325, 484, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 484, 522, 2325, 2325,
+ 2325, 522, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 522, 2325, 522, 2325, 2325, 2325, 2325, 522, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 522, 686, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 686, 2325, 2325, 2325, 686, 2325,
+ 686, 2325, 2325, 2325, 686, 686, 2325, 2325, 2325, 686,
+ 2325, 2325, 686, 492, 2325, 2325, 2325, 2325, 492, 2325,
+
+ 2325, 2325, 2325, 2325, 492, 2325, 492, 492, 2325, 492,
+ 2325, 2325, 2325, 2325, 492, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 492, 500, 2325, 500, 500, 2325, 500, 2325,
+ 2325, 2325, 2325, 2325, 2325, 500, 500, 501, 2325, 2325,
+ 2325, 501, 2325, 2325, 2325, 2325, 2325, 501, 2325, 2325,
+ 501, 501, 2325, 501, 501, 501, 501, 2325, 2325, 2325,
+ 501, 2325, 2325, 2325, 501, 2325, 501, 2325, 501, 2325,
+ 2325, 501, 501, 502, 502, 502, 502, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 502, 2325, 502, 706, 706, 706,
+ 2325, 2325, 2325, 706, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 706, 2325, 2325, 2325, 2325, 2325,
+ 706, 2325, 2325, 706, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 706, 506, 506, 506, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 506,
+ 506, 2325, 2325, 2325, 2325, 506, 2325, 2325, 506, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 506, 711, 2325, 2325,
+ 2325, 2325, 711, 2325, 2325, 2325, 2325, 2325, 711, 2325,
+ 711, 711, 2325, 711, 2325, 2325, 2325, 2325, 711, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 711, 516, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 516, 2325, 2325, 516, 516,
+
+ 2325, 516, 2325, 2325, 2325, 516, 516, 2325, 516, 2325,
+ 516, 2325, 2325, 516, 516, 2325, 516, 719, 2325, 2325,
+ 2325, 2325, 719, 2325, 2325, 719, 2325, 719, 719, 2325,
+ 719, 719, 2325, 719, 2325, 2325, 2325, 719, 719, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 719, 523, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 523, 2325, 2325, 2325, 523,
+ 2325, 523, 2325, 2325, 2325, 523, 523, 2325, 2325, 2325,
+ 523, 2325, 2325, 523, 300, 2325, 2325, 2325, 300, 2325,
+ 300, 2325, 2325, 2325, 300, 300, 2325, 300, 300, 2325,
+ 300, 300, 300, 300, 300, 2325, 300, 300, 2325, 2325,
+
+ 300, 300, 2325, 300, 2325, 300, 2325, 2325, 300, 300,
+ 563, 2325, 2325, 2325, 563, 2325, 2325, 2325, 2325, 2325,
+ 563, 563, 2325, 563, 563, 2325, 563, 2325, 563, 563,
+ 2325, 2325, 563, 563, 2325, 2325, 2325, 563, 2325, 2325,
+ 2325, 563, 2325, 2325, 563, 563, 759, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 759, 2325, 2325, 2325, 759, 2325,
+ 759, 2325, 2325, 2325, 759, 759, 2325, 2325, 2325, 759,
+ 2325, 2325, 759, 568, 568, 2325, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
+
+ 568, 568, 568, 568, 568, 568, 568, 568, 568, 765,
+ 765, 765, 2325, 2325, 2325, 765, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 765, 2325, 2325, 2325,
+ 2325, 2325, 765, 2325, 2325, 765, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 765, 576, 576, 576, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 576, 576, 2325, 2325, 2325, 2325, 576, 2325, 2325,
+ 576, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 576, 385,
+ 2325, 2325, 385, 385, 385, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 2325, 385, 385, 385, 385, 385,
+
+ 385, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 385, 605, 2325, 605, 605, 605,
+ 605, 605, 2325, 2325, 2325, 2325, 2325, 2325, 605, 2325,
+ 605, 403, 2325, 403, 2325, 403, 403, 403, 2325, 2325,
+ 2325, 2325, 2325, 2325, 403, 2325, 403, 610, 610, 2325,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 612, 612, 2325, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 406,
+ 406, 2325, 406, 406, 406, 406, 2325, 406, 2325, 406,
+ 406, 406, 406, 406, 406, 406, 406, 406, 406, 406,
+ 406, 2325, 406, 406, 406, 2325, 406, 406, 2325, 406,
+ 406, 2325, 2325, 406, 406, 790, 2325, 2325, 2325, 2325,
+ 790, 2325, 2325, 2325, 2325, 790, 790, 790, 790, 790,
+ 2325, 790, 2325, 2325, 2325, 2325, 790, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 790, 620, 620, 2325, 620, 620,
+ 620, 620, 2325, 620, 2325, 620, 620, 620, 620, 620,
+
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 2325, 620, 620, 2325, 620, 620, 2325, 2325, 620,
+ 620, 794, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 794,
+ 2325, 2325, 794, 794, 2325, 794, 2325, 2325, 2325, 794,
+ 794, 2325, 794, 2325, 794, 2325, 2325, 794, 794, 2325,
+ 794, 628, 2325, 2325, 2325, 2325, 628, 2325, 2325, 2325,
+ 2325, 628, 628, 628, 628, 628, 2325, 628, 2325, 2325,
+ 2325, 2325, 628, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 628, 631, 631, 2325, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 633, 633, 2325,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 636, 636, 2325, 636, 636, 636, 636,
+ 2325, 636, 2325, 636, 636, 636, 636, 636, 636, 636,
+ 636, 636, 636, 636, 636, 2325, 636, 636, 636, 2325,
+ 636, 636, 2325, 636, 636, 2325, 2325, 636, 636, 807,
+ 807, 2325, 807, 807, 807, 807, 2325, 807, 2325, 807,
+
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 2325, 807, 807, 2325, 807,
+ 807, 2325, 2325, 807, 807, 812, 812, 2325, 812, 812,
+ 812, 812, 2325, 812, 2325, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 2325, 812, 812,
+ 812, 2325, 812, 812, 2325, 812, 812, 2325, 2325, 812,
+ 812, 644, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 644,
+ 2325, 2325, 2325, 644, 2325, 644, 2325, 2325, 2325, 644,
+ 644, 2325, 2325, 2325, 644, 2325, 2325, 644, 649, 2325,
+ 2325, 2325, 2325, 649, 2325, 2325, 2325, 2325, 649, 649,
+
+ 649, 649, 649, 2325, 649, 2325, 2325, 2325, 2325, 649,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 649, 651, 2325,
+ 2325, 2325, 2325, 651, 2325, 2325, 2325, 2325, 651, 651,
+ 651, 651, 651, 2325, 651, 2325, 2325, 2325, 2325, 651,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 651, 652, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 652, 2325, 2325, 652,
+ 652, 2325, 652, 2325, 2325, 2325, 652, 652, 2325, 652,
+ 2325, 652, 2325, 2325, 652, 652, 2325, 652, 824, 2325,
+ 2325, 2325, 2325, 824, 2325, 2325, 2325, 2325, 824, 824,
+ 824, 824, 824, 2325, 824, 2325, 2325, 2325, 2325, 824,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 824, 658, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 658, 2325, 2325, 2325,
+ 658, 2325, 658, 2325, 2325, 2325, 658, 658, 2325, 2325,
+ 2325, 658, 2325, 2325, 658, 255, 2325, 2325, 2325, 255,
+ 2325, 2325, 2325, 2325, 2325, 255, 2325, 2325, 255, 255,
+ 2325, 255, 2325, 255, 255, 2325, 2325, 2325, 255, 2325,
+ 2325, 2325, 255, 2325, 2325, 2325, 255, 2325, 2325, 255,
+ 255, 453, 453, 2325, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 2325, 453, 453,
+
+ 2325, 453, 453, 453, 453, 453, 453, 845, 2325, 2325,
+ 2325, 2325, 845, 2325, 2325, 2325, 2325, 2325, 845, 2325,
+ 845, 845, 2325, 845, 2325, 2325, 2325, 2325, 845, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 845, 686, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 686, 2325, 2325, 2325, 686,
+ 2325, 686, 2325, 2325, 2325, 686, 686, 2325, 2325, 2325,
+ 686, 2325, 2325, 686, 484, 2325, 2325, 2325, 2325, 484,
+ 2325, 2325, 2325, 2325, 2325, 484, 2325, 484, 484, 2325,
+ 484, 2325, 2325, 2325, 2325, 484, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 484, 695, 695, 2325, 695, 695, 695,
+
+ 695, 2325, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 853, 853, 2325, 853, 853, 853, 853, 853, 853, 853,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 853, 853, 853, 853, 853, 853, 866, 866, 866, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 866, 866, 2325, 2325, 2325, 866, 866,
+ 2325, 2325, 866, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 866, 711, 2325, 2325, 2325, 2325, 711, 2325, 2325, 2325,
+ 2325, 2325, 711, 2325, 711, 711, 2325, 711, 2325, 2325,
+ 2325, 2325, 711, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 711, 522, 2325, 2325, 2325, 522, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 522, 2325, 522, 2325, 2325, 2325,
+ 2325, 522, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 522,
+ 874, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 874, 2325,
+ 2325, 2325, 874, 2325, 874, 2325, 2325, 2325, 874, 874,
+ 2325, 2325, 2325, 874, 2325, 2325, 874, 880, 2325, 2325,
+ 2325, 2325, 2325, 2325, 880, 2325, 880, 880, 2325, 880,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 880, 880, 2325, 2325,
+ 2325, 2325, 2325, 2325, 880, 880, 719, 2325, 2325, 2325,
+ 2325, 719, 2325, 2325, 719, 2325, 719, 719, 2325, 719,
+ 719, 2325, 719, 2325, 2325, 2325, 719, 719, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 719, 523, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 523, 2325, 2325, 2325, 523, 2325,
+ 523, 2325, 2325, 2325, 523, 523, 2325, 2325, 2325, 523,
+ 2325, 2325, 523, 300, 2325, 2325, 2325, 300, 2325, 300,
+ 2325, 2325, 2325, 300, 300, 2325, 300, 300, 2325, 300,
+ 300, 300, 300, 300, 2325, 300, 300, 2325, 2325, 300,
+
+ 300, 2325, 300, 2325, 300, 2325, 2325, 300, 300, 901,
+ 2325, 901, 901, 901, 901, 901, 901, 2325, 2325, 901,
+ 901, 901, 901, 901, 901, 901, 901, 901, 901, 2325,
+ 901, 901, 901, 2325, 2325, 2325, 2325, 2325, 2325, 901,
+ 901, 759, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 759,
+ 2325, 2325, 2325, 759, 2325, 759, 2325, 2325, 2325, 759,
+ 759, 2325, 2325, 2325, 759, 2325, 2325, 759, 909, 909,
+ 909, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 909, 909, 2325, 2325, 2325,
+ 909, 909, 2325, 2325, 909, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 909, 924, 2325, 2325, 924, 924, 924, 924,
+ 924, 924, 924, 924, 924, 924, 924, 924, 2325, 924,
+ 924, 924, 924, 924, 924, 924, 924, 924, 924, 924,
+ 924, 924, 924, 924, 924, 924, 924, 924, 924, 612,
+ 612, 2325, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 610, 610, 2325, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 406, 406, 2325, 406, 406, 406, 406, 2325, 406,
+ 2325, 406, 406, 406, 406, 406, 406, 406, 406, 406,
+ 406, 406, 406, 2325, 406, 406, 406, 2325, 406, 406,
+ 2325, 406, 406, 2325, 2325, 406, 406, 790, 2325, 2325,
+ 2325, 2325, 790, 2325, 2325, 2325, 2325, 790, 790, 790,
+ 790, 790, 2325, 790, 2325, 2325, 2325, 2325, 790, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 790, 794, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 794, 2325, 2325, 794, 794,
+ 2325, 794, 2325, 2325, 2325, 794, 794, 2325, 794, 2325,
+
+ 794, 2325, 2325, 794, 794, 2325, 794, 631, 631, 2325,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 633, 633, 2325, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 636,
+ 636, 2325, 636, 636, 636, 636, 2325, 636, 2325, 636,
+ 636, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+
+ 636, 2325, 636, 636, 636, 2325, 636, 636, 2325, 636,
+ 636, 2325, 2325, 636, 636, 807, 807, 2325, 807, 807,
+ 807, 807, 2325, 807, 2325, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 2325, 807, 807, 2325, 807, 807, 2325, 2325, 807,
+ 807, 812, 812, 2325, 812, 812, 812, 812, 2325, 812,
+ 2325, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 2325, 812, 812, 812, 2325, 812, 812,
+ 2325, 812, 812, 2325, 2325, 812, 812, 824, 2325, 2325,
+ 2325, 2325, 824, 2325, 2325, 2325, 2325, 824, 824, 824,
+
+ 824, 824, 2325, 824, 2325, 2325, 2325, 2325, 824, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 824, 255, 2325, 2325,
+ 2325, 255, 2325, 2325, 2325, 2325, 2325, 255, 2325, 2325,
+ 255, 255, 2325, 255, 2325, 255, 255, 2325, 2325, 2325,
+ 255, 2325, 2325, 2325, 255, 2325, 2325, 2325, 255, 2325,
+ 2325, 255, 255, 453, 453, 2325, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 453, 453, 2325,
+ 453, 453, 2325, 453, 453, 453, 453, 453, 453, 963,
+ 963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
+
+ 963, 963, 963, 963, 963, 963, 963, 963, 2325, 963,
+ 963, 963, 963, 963, 963, 963, 2325, 963, 963, 963,
+ 963, 963, 963, 963, 963, 966, 966, 966, 966, 966,
+ 966, 966, 966, 966, 966, 966, 966, 966, 966, 966,
+ 966, 966, 966, 966, 2325, 966, 966, 966, 966, 966,
+ 966, 966, 2325, 966, 966, 966, 966, 966, 966, 966,
+ 966, 845, 2325, 2325, 2325, 2325, 845, 2325, 2325, 2325,
+ 2325, 2325, 845, 2325, 845, 845, 2325, 845, 2325, 2325,
+ 2325, 2325, 845, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 845, 522, 2325, 2325, 2325, 522, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 522, 2325, 522, 2325, 2325, 2325,
+ 2325, 522, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 522,
+ 975, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 975, 2325,
+ 2325, 2325, 975, 2325, 975, 2325, 2325, 2325, 975, 975,
+ 2325, 2325, 2325, 975, 2325, 2325, 975, 686, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 686, 2325, 2325, 2325, 686,
+ 2325, 686, 2325, 2325, 2325, 686, 686, 2325, 2325, 2325,
+ 686, 2325, 2325, 686, 484, 2325, 2325, 2325, 2325, 484,
+ 2325, 2325, 2325, 2325, 2325, 484, 2325, 484, 484, 2325,
+ 484, 2325, 2325, 2325, 2325, 484, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 484, 853, 853, 2325, 853, 853, 853,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 695, 695, 2325, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 706, 706, 706, 2325,
+ 2325, 2325, 706, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 706, 2325, 2325, 2325, 2325, 706, 706,
+
+ 2325, 2325, 706, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 706, 866, 866, 866, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 866, 866,
+ 2325, 2325, 2325, 866, 866, 2325, 2325, 866, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 866, 994, 994, 994, 994,
+ 994, 994, 994, 994, 994, 994, 994, 994, 994, 994,
+ 994, 994, 994, 994, 994, 994, 994, 994, 2325, 994,
+ 2325, 994, 994, 994, 994, 994, 994, 994, 994, 994,
+ 994, 994, 1001, 2325, 2325, 2325, 2325, 1001, 2325, 2325,
+ 2325, 2325, 2325, 1001, 2325, 1001, 1001, 2325, 1001, 2325,
+
+ 2325, 2325, 2325, 1001, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1001, 874, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 874, 2325, 2325, 2325, 874, 2325, 874, 2325, 2325, 2325,
+ 874, 874, 2325, 2325, 2325, 874, 2325, 2325, 874, 711,
+ 2325, 2325, 2325, 2325, 711, 2325, 2325, 2325, 2325, 2325,
+ 711, 2325, 711, 711, 2325, 711, 2325, 2325, 2325, 2325,
+ 711, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 711, 1008,
+ 2325, 2325, 2325, 2325, 1008, 2325, 2325, 1008, 2325, 1008,
+ 1008, 2325, 1008, 1008, 2325, 1008, 2325, 2325, 2325, 1008,
+ 1008, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1008, 719,
+
+ 2325, 2325, 2325, 2325, 719, 2325, 2325, 719, 2325, 719,
+ 719, 2325, 719, 719, 2325, 719, 2325, 2325, 2325, 719,
+ 719, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 719, 523,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 523, 2325, 2325,
+ 2325, 523, 2325, 523, 2325, 2325, 2325, 523, 523, 2325,
+ 2325, 2325, 523, 2325, 2325, 523, 898, 2325, 898, 898,
+ 898, 898, 898, 898, 2325, 2325, 898, 898, 898, 898,
+ 898, 898, 898, 898, 2325, 898, 2325, 898, 898, 898,
+ 2325, 2325, 2325, 2325, 898, 2325, 898, 901, 2325, 901,
+ 901, 901, 901, 901, 901, 2325, 2325, 901, 901, 901,
+
+ 901, 901, 901, 901, 901, 2325, 901, 2325, 901, 901,
+ 901, 2325, 2325, 2325, 2325, 901, 2325, 901, 901, 1025,
+ 2325, 1025, 1025, 1025, 1025, 1025, 1025, 2325, 2325, 1025,
+ 1025, 1025, 1025, 1025, 1025, 1025, 1025, 2325, 1025, 2325,
+ 1025, 1025, 1025, 2325, 2325, 2325, 2325, 1025, 2325, 1025,
+ 1025, 1028, 2325, 1028, 1028, 1028, 1028, 1028, 1028, 2325,
+ 2325, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 2325,
+ 1028, 2325, 1028, 1028, 1028, 2325, 2325, 2325, 2325, 1028,
+ 2325, 1028, 1028, 300, 2325, 2325, 2325, 300, 2325, 300,
+ 2325, 2325, 2325, 300, 300, 2325, 300, 300, 2325, 300,
+
+ 300, 300, 300, 300, 2325, 300, 300, 2325, 2325, 300,
+ 300, 2325, 300, 2325, 300, 2325, 2325, 300, 300, 759,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 759, 2325, 2325,
+ 2325, 759, 2325, 759, 2325, 2325, 2325, 759, 759, 2325,
+ 2325, 2325, 759, 2325, 2325, 759, 765, 765, 765, 2325,
+ 2325, 2325, 765, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 765, 2325, 2325, 2325, 2325, 765, 765,
+ 2325, 2325, 765, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 765, 909, 909, 909, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 909, 909,
+
+ 2325, 2325, 2325, 909, 909, 2325, 2325, 909, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 909, 1034, 1034, 1034, 1034,
+ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034,
+ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 2325, 1034,
+ 2325, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034,
+ 1034, 1034, 924, 2325, 2325, 924, 924, 924, 924, 924,
+ 924, 924, 924, 924, 924, 924, 924, 2325, 924, 924,
+ 924, 924, 924, 924, 924, 924, 924, 924, 924, 924,
+ 924, 924, 924, 924, 924, 924, 924, 924, 612, 612,
+ 2325, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 610, 610, 2325, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 406, 406, 2325, 406, 406, 406, 406, 2325, 406, 2325,
+ 406, 406, 406, 406, 406, 406, 406, 406, 406, 406,
+ 406, 406, 2325, 406, 406, 406, 2325, 406, 406, 2325,
+ 406, 406, 2325, 2325, 406, 406, 631, 631, 2325, 631,
+
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 633, 633, 2325, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 636, 636,
+ 2325, 636, 636, 636, 636, 2325, 636, 2325, 636, 636,
+ 636, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+ 2325, 636, 636, 636, 2325, 636, 636, 2325, 636, 636,
+
+ 2325, 2325, 636, 636, 255, 2325, 2325, 2325, 255, 2325,
+ 2325, 2325, 2325, 2325, 255, 2325, 2325, 255, 255, 2325,
+ 255, 2325, 255, 255, 2325, 2325, 2325, 255, 2325, 2325,
+ 2325, 255, 2325, 2325, 2325, 255, 2325, 2325, 255, 255,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 2325,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 2325, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1091, 2325, 2325, 2325,
+ 2325, 1091, 2325, 2325, 2325, 2325, 2325, 1091, 2325, 1091,
+ 1091, 2325, 1091, 2325, 2325, 2325, 2325, 1091, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 1091, 975, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 975, 2325, 2325, 2325, 975, 2325,
+ 975, 2325, 2325, 2325, 975, 975, 2325, 2325, 2325, 975,
+ 2325, 2325, 975, 845, 2325, 2325, 2325, 2325, 845, 2325,
+ 2325, 2325, 2325, 2325, 845, 2325, 845, 845, 2325, 845,
+ 2325, 2325, 2325, 2325, 845, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 845, 484, 2325, 2325, 2325, 2325, 484, 2325,
+ 2325, 2325, 2325, 2325, 484, 2325, 484, 484, 2325, 484,
+ 2325, 2325, 2325, 2325, 484, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 484, 695, 695, 2325, 695, 695, 695, 695,
+
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 1102,
+ 1102, 2325, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 994, 994, 994, 994, 994,
+ 2325, 994, 994, 994, 994, 2325, 994, 994, 994, 994,
+ 994, 994, 994, 994, 994, 994, 994, 2325, 994, 994,
+ 994, 994, 994, 994, 994, 994, 994, 994, 994, 994,
+
+ 994, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1001, 2325, 2325, 2325, 2325, 1001, 2325,
+ 2325, 2325, 2325, 2325, 1001, 2325, 1001, 1001, 2325, 1001,
+ 2325, 2325, 2325, 2325, 1001, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 1001, 874, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 874, 2325, 2325, 2325, 874, 2325, 874, 2325, 2325,
+ 2325, 874, 874, 2325, 2325, 2325, 874, 2325, 2325, 874,
+ 711, 2325, 2325, 2325, 2325, 711, 2325, 2325, 2325, 2325,
+ 2325, 711, 2325, 711, 711, 2325, 711, 2325, 2325, 2325,
+ 2325, 711, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 711,
+ 1008, 2325, 2325, 2325, 2325, 1008, 2325, 2325, 1008, 2325,
+ 1008, 1008, 2325, 1008, 1008, 2325, 1008, 2325, 2325, 2325,
+ 1008, 1008, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1008,
+ 719, 2325, 2325, 2325, 2325, 719, 2325, 2325, 719, 2325,
+
+ 719, 719, 2325, 719, 719, 2325, 719, 2325, 2325, 2325,
+ 719, 719, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 719,
+ 523, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 523, 2325,
+ 2325, 2325, 523, 2325, 523, 2325, 2325, 2325, 523, 523,
+ 2325, 2325, 2325, 523, 2325, 2325, 523, 1131, 2325, 1131,
+ 1131, 1131, 1131, 1131, 2325, 1131, 2325, 1131, 1131, 1131,
+ 1131, 1131, 1131, 1131, 1131, 2325, 1131, 2325, 1131, 1131,
+ 1131, 2325, 2325, 2325, 2325, 2325, 1131, 1131, 1025, 2325,
+ 1025, 1025, 1025, 1025, 1025, 1025, 2325, 2325, 1025, 1025,
+ 1025, 1025, 1025, 1025, 1025, 1025, 2325, 1025, 2325, 1025,
+
+ 1025, 1025, 2325, 2325, 2325, 2325, 1025, 2325, 1025, 1025,
+ 1135, 2325, 1135, 1135, 1135, 1135, 1135, 1135, 2325, 2325,
+ 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135,
+ 2325, 1135, 1135, 1135, 2325, 2325, 2325, 2325, 1135, 2325,
+ 1135, 1135, 1139, 2325, 1139, 1139, 1139, 1139, 1139, 1139,
+ 2325, 2325, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
+ 2325, 1139, 2325, 1139, 1139, 1139, 2325, 2325, 2325, 2325,
+ 1139, 2325, 1139, 1139, 1028, 2325, 1028, 1028, 1028, 1028,
+ 1028, 1028, 2325, 2325, 1028, 1028, 1028, 1028, 1028, 1028,
+ 1028, 1028, 2325, 1028, 2325, 1028, 1028, 1028, 2325, 2325,
+
+ 2325, 2325, 1028, 2325, 1028, 1028, 901, 2325, 901, 901,
+ 901, 901, 901, 901, 2325, 2325, 901, 901, 901, 901,
+ 901, 901, 901, 901, 901, 901, 2325, 901, 901, 901,
+ 2325, 2325, 2325, 2325, 901, 2325, 901, 901, 300, 2325,
+ 2325, 2325, 300, 2325, 300, 2325, 2325, 2325, 300, 300,
+ 2325, 300, 300, 2325, 300, 300, 300, 300, 300, 2325,
+ 300, 300, 2325, 2325, 300, 300, 2325, 300, 2325, 300,
+ 2325, 2325, 300, 300, 1034, 1034, 1034, 1034, 1034, 2325,
+ 1034, 1034, 1034, 1034, 2325, 1034, 1034, 1034, 1034, 1034,
+ 1034, 1034, 1034, 1034, 1034, 1034, 2325, 1034, 1034, 1034,
+
+ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1145, 1145, 1145, 1145,
+ 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 1145, 612, 612, 2325, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 610, 610,
+ 2325, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 406, 406, 2325, 406, 406, 406,
+ 406, 2325, 406, 2325, 406, 406, 406, 406, 406, 406,
+ 406, 406, 406, 406, 406, 406, 2325, 406, 406, 406,
+ 2325, 406, 406, 2325, 406, 406, 2325, 2325, 406, 406,
+ 620, 620, 2325, 620, 620, 620, 620, 2325, 620, 2325,
+
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 2325, 620, 620, 2325,
+ 620, 620, 2325, 2325, 620, 620, 631, 631, 2325, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 633, 633, 2325, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 636, 636,
+
+ 2325, 636, 636, 636, 636, 2325, 636, 2325, 636, 636,
+ 636, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+ 2325, 636, 636, 636, 2325, 636, 636, 2325, 636, 636,
+ 2325, 2325, 636, 636, 420, 420, 2325, 420, 420, 420,
+ 420, 2325, 420, 2325, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420, 420, 420,
+ 2325, 420, 420, 2325, 420, 420, 2325, 2325, 420, 420,
+ 255, 2325, 2325, 2325, 255, 2325, 2325, 2325, 2325, 2325,
+ 255, 2325, 2325, 255, 255, 2325, 255, 2325, 255, 255,
+ 2325, 2325, 2325, 255, 2325, 2325, 2325, 255, 2325, 2325,
+
+ 2325, 255, 2325, 2325, 255, 255, 1091, 2325, 2325, 2325,
+ 2325, 1091, 2325, 2325, 2325, 2325, 2325, 1091, 2325, 1091,
+ 1091, 2325, 1091, 2325, 2325, 2325, 2325, 1091, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1091, 975, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 975, 2325, 2325, 2325, 975, 2325,
+ 975, 2325, 2325, 2325, 975, 975, 2325, 2325, 2325, 975,
+ 2325, 2325, 975, 845, 2325, 2325, 2325, 2325, 845, 2325,
+ 2325, 2325, 2325, 2325, 845, 2325, 845, 845, 2325, 845,
+ 2325, 2325, 2325, 2325, 845, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 845, 484, 2325, 2325, 2325, 2325, 484, 2325,
+
+ 2325, 2325, 2325, 2325, 484, 2325, 484, 484, 2325, 484,
+ 2325, 2325, 2325, 2325, 484, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 484, 695, 695, 2325, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 1102,
+ 1102, 2325, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1207, 1207, 2325, 1207, 1207,
+
+ 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207,
+ 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207,
+ 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207,
+ 1207, 994, 994, 994, 994, 994, 2325, 994, 994, 994,
+ 994, 2325, 994, 994, 994, 994, 994, 994, 994, 994,
+ 994, 994, 994, 2325, 994, 994, 994, 994, 994, 994,
+ 994, 994, 994, 994, 994, 994, 994, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+
+ 1110, 1110, 1110, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1001,
+ 2325, 2325, 2325, 2325, 1001, 2325, 2325, 2325, 2325, 2325,
+ 1001, 2325, 1001, 1001, 2325, 1001, 2325, 2325, 2325, 2325,
+ 1001, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1001, 711,
+ 2325, 2325, 2325, 2325, 711, 2325, 2325, 2325, 2325, 2325,
+ 711, 2325, 711, 711, 2325, 711, 2325, 2325, 2325, 2325,
+ 711, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 711, 1008,
+
+ 2325, 2325, 2325, 2325, 1008, 2325, 2325, 1008, 2325, 1008,
+ 1008, 2325, 1008, 1008, 2325, 1008, 2325, 2325, 2325, 1008,
+ 1008, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1008, 719,
+ 2325, 2325, 2325, 2325, 719, 2325, 2325, 719, 2325, 719,
+ 719, 2325, 719, 719, 2325, 719, 2325, 2325, 2325, 719,
+ 719, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 719, 523,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 523, 2325, 2325,
+ 2325, 523, 2325, 523, 2325, 2325, 2325, 523, 523, 2325,
+ 2325, 2325, 523, 2325, 2325, 523, 1131, 2325, 1131, 1131,
+ 1131, 1131, 1131, 2325, 1131, 2325, 1131, 1131, 1131, 1131,
+
+ 1131, 1131, 1131, 1131, 2325, 1131, 2325, 1131, 1131, 1131,
+ 2325, 2325, 2325, 2325, 2325, 1131, 1131, 898, 2325, 898,
+ 898, 898, 898, 898, 2325, 2325, 2325, 898, 898, 898,
+ 898, 898, 898, 898, 898, 2325, 898, 2325, 898, 898,
+ 898, 2325, 2325, 2325, 2325, 2325, 2325, 898, 1224, 2325,
+ 1224, 1224, 1224, 1224, 1224, 1224, 2325, 2325, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 2325, 1224, 2325, 1224,
+ 1224, 1224, 2325, 2325, 2325, 2325, 1224, 2325, 1224, 1224,
+ 1226, 2325, 2325, 1226, 2325, 1226, 1226, 1226, 1226, 1226,
+ 2325, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226,
+
+ 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 2325, 1226,
+ 2325, 2325, 1226, 1226, 1135, 2325, 1135, 1135, 1135, 1135,
+ 1135, 1135, 2325, 2325, 1135, 1135, 1135, 1135, 1135, 1135,
+ 1135, 1135, 1135, 1135, 2325, 1135, 1135, 1135, 2325, 2325,
+ 2325, 2325, 1135, 2325, 1135, 1135, 901, 2325, 901, 901,
+ 901, 901, 901, 901, 2325, 2325, 901, 901, 901, 901,
+ 901, 901, 901, 901, 901, 901, 2325, 901, 901, 901,
+ 2325, 2325, 2325, 2325, 901, 2325, 901, 901, 1139, 2325,
+ 1139, 1139, 1139, 1139, 1139, 1139, 2325, 2325, 1139, 1139,
+ 1139, 1139, 1139, 1139, 1139, 1139, 2325, 1139, 2325, 1139,
+
+ 1139, 1139, 2325, 2325, 2325, 2325, 1139, 2325, 1139, 1139,
+ 1229, 2325, 1229, 1229, 1229, 1229, 1229, 1229, 2325, 2325,
+ 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
+ 2325, 1229, 1229, 1229, 2325, 2325, 2325, 2325, 1229, 2325,
+ 1229, 1229, 300, 2325, 2325, 2325, 300, 2325, 300, 2325,
+ 2325, 2325, 300, 300, 2325, 300, 300, 2325, 300, 300,
+ 300, 300, 300, 2325, 300, 300, 2325, 2325, 300, 300,
+ 2325, 300, 2325, 300, 2325, 2325, 300, 300, 1034, 1034,
+ 1034, 1034, 1034, 2325, 1034, 1034, 1034, 1034, 2325, 1034,
+ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034,
+
+ 2325, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034,
+ 1034, 1034, 1034, 1034, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 1145, 1145, 1145, 1145, 1145, 612, 612, 2325, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 610, 610, 2325, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 406, 406,
+ 2325, 406, 406, 406, 406, 2325, 406, 2325, 406, 406,
+ 406, 406, 406, 406, 406, 406, 406, 406, 406, 406,
+ 2325, 406, 406, 406, 2325, 406, 406, 2325, 406, 406,
+ 2325, 2325, 406, 406, 631, 631, 2325, 631, 631, 631,
+
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 633, 633, 2325, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 636, 636, 2325, 636,
+ 636, 636, 636, 2325, 636, 2325, 636, 636, 636, 636,
+ 636, 636, 636, 636, 636, 636, 636, 636, 2325, 636,
+ 636, 636, 2325, 636, 636, 2325, 636, 636, 2325, 2325,
+
+ 636, 636, 807, 807, 2325, 807, 807, 807, 807, 2325,
+ 807, 2325, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 2325, 807,
+ 807, 2325, 807, 807, 2325, 2325, 807, 807, 812, 812,
+ 2325, 812, 812, 812, 812, 2325, 812, 2325, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 2325, 812, 812, 812, 2325, 812, 812, 2325, 812, 812,
+ 2325, 2325, 812, 812, 255, 2325, 2325, 2325, 255, 2325,
+ 2325, 2325, 2325, 2325, 255, 2325, 2325, 255, 255, 2325,
+ 255, 2325, 255, 255, 2325, 2325, 2325, 255, 2325, 2325,
+
+ 2325, 255, 2325, 2325, 2325, 255, 2325, 2325, 255, 255,
+ 1091, 2325, 2325, 2325, 2325, 1091, 2325, 2325, 2325, 2325,
+ 2325, 1091, 2325, 1091, 1091, 2325, 1091, 2325, 2325, 2325,
+ 2325, 1091, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1091,
+ 845, 2325, 2325, 2325, 2325, 845, 2325, 2325, 2325, 2325,
+ 2325, 845, 2325, 845, 845, 2325, 845, 2325, 2325, 2325,
+ 2325, 845, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 845,
+ 484, 2325, 2325, 2325, 2325, 484, 2325, 2325, 2325, 2325,
+ 2325, 484, 2325, 484, 484, 2325, 484, 2325, 2325, 2325,
+ 2325, 484, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 484,
+
+ 695, 695, 2325, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 1102, 1102, 2325, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1207, 1207, 2325, 1207, 1207, 1207, 1207, 1207,
+ 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207,
+ 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207,
+
+ 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1001, 2325,
+ 2325, 2325, 2325, 1001, 2325, 2325, 2325, 2325, 2325, 1001,
+ 2325, 1001, 1001, 2325, 1001, 2325, 2325, 2325, 2325, 1001,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1001, 711, 2325,
+ 2325, 2325, 2325, 711, 2325, 2325, 2325, 2325, 2325, 711,
+ 2325, 711, 711, 2325, 711, 2325, 2325, 2325, 2325, 711,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 711, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 2325, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 2325, 1290, 1290, 1290, 1290,
+
+ 1290, 1290, 1290, 1290, 1008, 2325, 2325, 2325, 2325, 1008,
+ 2325, 2325, 1008, 2325, 1008, 1008, 2325, 1008, 1008, 2325,
+ 1008, 2325, 2325, 2325, 1008, 1008, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 1008, 719, 2325, 2325, 2325, 2325, 719,
+ 2325, 2325, 719, 2325, 719, 719, 2325, 719, 719, 2325,
+ 719, 2325, 2325, 2325, 719, 719, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 719, 523, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 523, 2325, 2325, 2325, 523, 2325, 523, 2325,
+ 2325, 2325, 523, 523, 2325, 2325, 2325, 523, 2325, 2325,
+ 523, 1224, 2325, 1224, 1224, 1224, 1224, 1224, 1224, 2325,
+
+ 2325, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 2325,
+ 1224, 2325, 1224, 1224, 1224, 2325, 2325, 2325, 2325, 1224,
+ 2325, 1224, 1224, 1295, 2325, 1295, 1295, 1295, 1295, 1295,
+ 1295, 2325, 2325, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+ 1295, 1295, 1295, 2325, 1295, 1295, 1295, 2325, 2325, 2325,
+ 2325, 1295, 2325, 1295, 1295, 1226, 2325, 2325, 1226, 2325,
+ 1226, 1226, 1226, 1226, 1226, 2325, 1226, 1226, 1226, 1226,
+ 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226,
+ 1226, 1226, 1226, 2325, 1226, 2325, 2325, 1226, 1226, 898,
+ 2325, 898, 898, 2325, 898, 898, 898, 898, 898, 2325,
+
+ 2325, 2325, 898, 898, 898, 898, 898, 898, 898, 898,
+ 2325, 898, 2325, 898, 898, 898, 2325, 2325, 2325, 2325,
+ 2325, 2325, 898, 1135, 2325, 1135, 1135, 1135, 1135, 1135,
+ 1135, 2325, 2325, 1135, 1135, 1135, 1135, 1135, 1135, 1135,
+ 1135, 1135, 1135, 2325, 1135, 1135, 1135, 2325, 2325, 2325,
+ 2325, 1135, 2325, 1135, 1135, 1229, 2325, 1229, 1229, 1229,
+ 1229, 1229, 1229, 2325, 2325, 1229, 1229, 1229, 1229, 1229,
+ 1229, 1229, 1229, 1229, 1229, 2325, 1229, 1229, 1229, 2325,
+ 2325, 2325, 2325, 1229, 2325, 1229, 1229, 300, 300, 2325,
+ 300, 300, 2325, 300, 2325, 300, 300, 300, 300, 2325,
+
+ 300, 300, 300, 300, 300, 300, 300, 300, 2325, 300,
+ 300, 300, 2325, 300, 300, 300, 300, 2325, 300, 2325,
+ 2325, 300, 300, 612, 612, 2325, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 610,
+ 610, 2325, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 406, 406, 2325, 406, 406,
+
+ 406, 406, 2325, 406, 2325, 406, 406, 406, 406, 406,
+ 406, 406, 406, 406, 406, 406, 406, 2325, 406, 406,
+ 406, 2325, 406, 406, 2325, 406, 406, 2325, 2325, 406,
+ 406, 631, 631, 2325, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 633, 633, 2325,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+
+ 633, 633, 633, 636, 636, 2325, 636, 636, 636, 636,
+ 2325, 636, 2325, 636, 636, 636, 636, 636, 636, 636,
+ 636, 636, 636, 636, 636, 2325, 636, 636, 636, 2325,
+ 636, 636, 2325, 636, 636, 2325, 2325, 636, 636, 255,
+ 255, 2325, 255, 255, 2325, 2325, 2325, 2325, 2325, 255,
+ 2325, 2325, 255, 255, 2325, 255, 2325, 255, 255, 2325,
+ 2325, 255, 255, 2325, 2325, 2325, 255, 2325, 2325, 2325,
+ 255, 2325, 2325, 255, 255, 1354, 1354, 1354, 1354, 1354,
+ 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354,
+ 1354, 1354, 1354, 1354, 2325, 1354, 1354, 1354, 1354, 1354,
+
+ 1354, 1354, 2325, 1354, 1354, 1354, 1354, 1354, 1354, 1354,
+ 1354, 1091, 2325, 2325, 2325, 2325, 1091, 2325, 2325, 2325,
+ 2325, 2325, 1091, 2325, 1091, 1091, 2325, 1091, 2325, 2325,
+ 2325, 2325, 1091, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 1091, 845, 2325, 2325, 2325, 2325, 845, 2325, 2325, 2325,
+ 2325, 2325, 845, 2325, 845, 845, 2325, 845, 2325, 2325,
+ 2325, 2325, 845, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 845, 484, 2325, 484, 484, 2325, 484, 2325, 484, 484,
+ 2325, 484, 2325, 484, 484, 484, 484, 484, 484, 484,
+ 484, 2325, 484, 484, 484, 2325, 2325, 484, 484, 2325,
+
+ 2325, 484, 2325, 2325, 484, 484, 695, 695, 2325, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 1207, 1207, 2325, 1207, 1207, 1207, 1207, 1207,
+ 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207,
+ 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207,
+ 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1001, 2325,
+ 2325, 2325, 2325, 1001, 2325, 2325, 2325, 2325, 2325, 1001,
+ 2325, 1001, 1001, 2325, 1001, 2325, 2325, 2325, 2325, 1001,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1001, 711, 2325,
+ 2325, 2325, 2325, 711, 2325, 2325, 2325, 2325, 2325, 711,
+ 2325, 711, 711, 2325, 711, 2325, 2325, 2325, 2325, 711,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 711, 1008, 2325,
+ 2325, 2325, 2325, 1008, 2325, 2325, 1008, 2325, 1008, 1008,
+ 2325, 1008, 1008, 2325, 1008, 2325, 2325, 2325, 1008, 1008,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1008, 719, 2325,
+ 2325, 2325, 2325, 719, 2325, 2325, 719, 2325, 719, 719,
+ 2325, 719, 719, 2325, 719, 2325, 2325, 2325, 719, 719,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 719, 1295, 2325,
+
+ 1295, 1295, 1295, 1295, 1295, 1295, 2325, 2325, 1295, 1295,
+ 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 2325, 1295,
+ 1295, 1295, 2325, 2325, 2325, 2325, 1295, 2325, 1295, 1295,
+ 898, 2325, 898, 898, 898, 898, 898, 898, 2325, 2325,
+ 898, 898, 898, 898, 898, 898, 898, 898, 2325, 898,
+ 2325, 898, 898, 898, 2325, 2325, 2325, 2325, 898, 2325,
+ 898, 1135, 2325, 1135, 1135, 1135, 1135, 1135, 1135, 2325,
+ 2325, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135,
+ 1135, 2325, 1135, 1135, 1135, 2325, 2325, 2325, 2325, 1135,
+ 2325, 1135, 1135, 516, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 516, 2325, 2325, 516, 516, 2325, 516, 2325, 2325,
+ 2325, 516, 516, 2325, 516, 2325, 516, 2325, 2325, 516,
+ 516, 2325, 516, 279, 2325, 2325, 2325, 279, 2325, 2325,
+ 2325, 2325, 2325, 279, 279, 2325, 279, 279, 2325, 279,
+ 279, 279, 279, 2325, 2325, 2325, 279, 2325, 2325, 279,
+ 279, 2325, 2325, 2325, 279, 2325, 2325, 279, 279, 282,
+ 2325, 2325, 2325, 282, 2325, 2325, 2325, 2325, 2325, 282,
+ 282, 2325, 282, 282, 2325, 282, 282, 282, 282, 2325,
+ 2325, 2325, 282, 282, 2325, 282, 282, 2325, 282, 2325,
+ 282, 2325, 2325, 282, 282, 501, 2325, 2325, 2325, 501,
+
+ 2325, 2325, 2325, 2325, 2325, 501, 501, 2325, 501, 501,
+ 2325, 501, 2325, 501, 501, 2325, 2325, 2325, 501, 2325,
+ 2325, 2325, 501, 2325, 2325, 2325, 501, 2325, 2325, 501,
+ 501, 612, 612, 2325, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 610, 610, 2325,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+
+ 610, 610, 610, 631, 631, 2325, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 406,
+ 406, 2325, 406, 406, 406, 406, 2325, 406, 2325, 406,
+ 406, 406, 406, 406, 406, 406, 406, 406, 406, 406,
+ 406, 2325, 406, 406, 406, 2325, 406, 406, 2325, 406,
+ 406, 2325, 2325, 406, 406, 633, 633, 2325, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 636, 636, 2325, 636, 636, 636, 636, 2325, 636,
+ 2325, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+ 636, 636, 636, 2325, 636, 636, 636, 2325, 636, 636,
+ 2325, 636, 636, 2325, 2325, 636, 636, 1464, 1464, 1464,
+ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464,
+ 1464, 1464, 1464, 1464, 1464, 1464, 2325, 1464, 1464, 1464,
+ 1464, 1464, 1464, 1464, 2325, 1464, 1464, 1464, 1464, 1464,
+ 1464, 1464, 1464, 1469, 1469, 1469, 1469, 1469, 1469, 1469,
+ 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469,
+
+ 1469, 1469, 2325, 1469, 1469, 1469, 1469, 1469, 1469, 1469,
+ 2325, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1091,
+ 2325, 2325, 2325, 2325, 1091, 2325, 2325, 2325, 2325, 2325,
+ 1091, 2325, 1091, 1091, 2325, 1091, 2325, 2325, 2325, 2325,
+ 1091, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1091, 845,
+ 2325, 2325, 2325, 2325, 845, 2325, 2325, 2325, 2325, 2325,
+ 845, 2325, 845, 845, 2325, 845, 2325, 2325, 2325, 2325,
+ 845, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 845, 1472,
+ 1472, 2325, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472,
+ 1472, 1472, 1472, 1472, 1472, 1472, 2325, 1472, 1472, 1472,
+
+ 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472,
+ 1472, 1472, 1472, 1472, 1472, 686, 2325, 686, 2325, 2325,
+ 2325, 2325, 2325, 686, 2325, 686, 2325, 686, 2325, 686,
+ 2325, 2325, 2325, 686, 686, 2325, 686, 686, 686, 2325,
+ 2325, 686, 1001, 2325, 2325, 2325, 2325, 1001, 2325, 2325,
+ 2325, 2325, 2325, 1001, 2325, 1001, 1001, 2325, 1001, 2325,
+ 2325, 2325, 2325, 1001, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1001, 711, 2325, 711, 711, 2325, 711, 2325, 711,
+ 711, 2325, 711, 2325, 711, 711, 711, 711, 711, 711,
+ 711, 711, 2325, 711, 711, 711, 2325, 2325, 711, 711,
+
+ 2325, 2325, 711, 2325, 2325, 711, 711, 1008, 2325, 2325,
+ 2325, 2325, 1008, 2325, 2325, 1008, 2325, 1008, 1008, 2325,
+ 1008, 1008, 2325, 1008, 2325, 2325, 2325, 1008, 1008, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 1008, 719, 2325, 719,
+ 719, 2325, 719, 2325, 719, 719, 2325, 719, 2325, 719,
+ 719, 719, 719, 719, 719, 719, 719, 2325, 719, 719,
+ 719, 2325, 719, 719, 719, 2325, 2325, 719, 2325, 2325,
+ 719, 719, 1295, 2325, 1295, 1295, 1295, 1295, 1295, 1295,
+ 2325, 2325, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295,
+ 1295, 1295, 2325, 1295, 1295, 1295, 2325, 2325, 2325, 2325,
+
+ 1295, 2325, 1295, 1295, 898, 2325, 898, 898, 898, 898,
+ 898, 898, 2325, 2325, 898, 898, 898, 898, 898, 898,
+ 898, 898, 2325, 898, 2325, 898, 898, 898, 2325, 2325,
+ 2325, 2325, 898, 2325, 898, 1135, 2325, 1135, 1135, 1135,
+ 1135, 1135, 1135, 2325, 2325, 1135, 1135, 1135, 1135, 1135,
+ 1135, 1135, 1135, 1135, 1135, 2325, 1135, 1135, 1135, 2325,
+ 2325, 2325, 2325, 1135, 2325, 1135, 1135, 1540, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1540, 2325, 2325, 1540, 1540,
+ 2325, 1540, 2325, 2325, 2325, 1540, 1540, 2325, 1540, 2325,
+ 1540, 2325, 2325, 1540, 1540, 2325, 1540, 279, 2325, 2325,
+
+ 2325, 279, 2325, 2325, 2325, 2325, 2325, 279, 279, 2325,
+ 279, 279, 2325, 279, 279, 279, 279, 2325, 2325, 2325,
+ 279, 2325, 2325, 279, 279, 2325, 2325, 2325, 279, 2325,
+ 2325, 279, 279, 282, 2325, 2325, 2325, 282, 2325, 2325,
+ 2325, 2325, 2325, 282, 282, 2325, 282, 282, 2325, 282,
+ 282, 282, 282, 2325, 2325, 2325, 282, 2325, 2325, 282,
+ 282, 2325, 282, 2325, 282, 2325, 2325, 282, 282, 1412,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1412, 2325, 2325,
+ 2325, 1412, 2325, 1412, 2325, 2325, 2325, 1412, 1412, 2325,
+ 2325, 2325, 1412, 2325, 2325, 1412, 612, 612, 2325, 612,
+
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 631, 631, 2325, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 631, 631,
+ 631, 631, 631, 631, 631, 631, 631, 631, 406, 406,
+ 2325, 406, 406, 406, 406, 2325, 406, 2325, 406, 406,
+ 406, 406, 406, 406, 406, 406, 406, 406, 406, 406,
+ 2325, 406, 406, 406, 2325, 406, 406, 2325, 406, 406,
+
+ 2325, 2325, 406, 406, 636, 636, 2325, 636, 636, 636,
+ 636, 2325, 636, 2325, 636, 636, 636, 636, 636, 636,
+ 636, 636, 636, 636, 636, 636, 2325, 636, 636, 636,
+ 2325, 636, 636, 2325, 636, 636, 2325, 2325, 636, 636,
+ 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578,
+ 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 2325,
+ 1578, 1578, 1578, 1578, 1578, 1578, 1578, 2325, 1578, 1578,
+ 1578, 1578, 1578, 1578, 1578, 1578, 1091, 2325, 2325, 2325,
+ 2325, 1091, 2325, 2325, 2325, 2325, 2325, 1091, 2325, 1091,
+ 1091, 2325, 1091, 2325, 2325, 2325, 2325, 1091, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 1091, 845, 2325, 845, 845,
+ 2325, 845, 2325, 845, 845, 2325, 845, 2325, 845, 845,
+ 845, 845, 845, 845, 845, 845, 2325, 845, 845, 845,
+ 2325, 2325, 845, 845, 2325, 2325, 845, 2325, 2325, 845,
+ 845, 1584, 1584, 2325, 2325, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 2325, 1584, 2325, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1586, 1586, 2325,
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1586, 2325, 1586, 1586, 1586, 1586, 1586,
+
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1614, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1614, 2325, 2325, 1614, 1614, 2325, 1614, 2325, 2325,
+ 2325, 1614, 1614, 2325, 1614, 2325, 1614, 2325, 2325, 1614,
+ 1614, 2325, 1614, 686, 2325, 686, 2325, 2325, 2325, 2325,
+ 2325, 686, 2325, 2325, 2325, 686, 2325, 686, 2325, 2325,
+ 2325, 686, 686, 2325, 2325, 2325, 686, 2325, 2325, 686,
+ 695, 695, 2325, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+
+ 695, 695, 695, 695, 695, 695, 1001, 2325, 2325, 2325,
+ 2325, 1001, 2325, 2325, 2325, 2325, 2325, 1001, 2325, 1001,
+ 1001, 2325, 1001, 2325, 2325, 2325, 2325, 1001, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1001, 1633, 1633, 2325, 1633,
+ 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633,
+ 1633, 1633, 1633, 2325, 1633, 1633, 1633, 1633, 1633, 1633,
+ 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633,
+ 1633, 1633, 516, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 516, 2325, 2325, 516, 516, 2325, 516, 2325, 2325, 2325,
+ 516, 516, 2325, 516, 2325, 516, 2325, 2325, 516, 516,
+
+ 2325, 516, 874, 2325, 874, 2325, 2325, 2325, 2325, 2325,
+ 874, 2325, 874, 2325, 874, 2325, 874, 2325, 2325, 2325,
+ 874, 874, 2325, 874, 874, 874, 2325, 2325, 874, 1008,
+ 2325, 2325, 2325, 2325, 1008, 2325, 2325, 1008, 2325, 1008,
+ 1008, 2325, 1008, 1008, 2325, 1008, 2325, 2325, 2325, 1008,
+ 1008, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1008, 280,
+ 2325, 280, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 280,
+ 2325, 2325, 280, 2325, 280, 280, 2325, 280, 2325, 2325,
+ 2325, 280, 2325, 2325, 280, 280, 1295, 2325, 1295, 1295,
+ 1295, 1295, 1295, 1295, 2325, 2325, 1295, 1295, 1295, 1295,
+
+ 1295, 1295, 1295, 1295, 1295, 1295, 2325, 1295, 1295, 1295,
+ 2325, 2325, 2325, 2325, 1295, 2325, 1295, 1295, 898, 2325,
+ 898, 898, 898, 898, 898, 898, 2325, 2325, 898, 898,
+ 898, 898, 898, 898, 898, 898, 2325, 898, 2325, 898,
+ 898, 898, 2325, 2325, 2325, 2325, 898, 2325, 898, 1135,
+ 2325, 1135, 1135, 1135, 1135, 1135, 1135, 2325, 2325, 1135,
+ 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 2325,
+ 1135, 1135, 1135, 2325, 2325, 2325, 2325, 1135, 2325, 1135,
+ 1135, 1540, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1540,
+ 2325, 2325, 1540, 1540, 2325, 1540, 2325, 2325, 2325, 1540,
+
+ 1540, 2325, 1540, 2325, 1540, 2325, 2325, 1540, 1540, 2325,
+ 1540, 1412, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1412,
+ 2325, 2325, 2325, 1412, 2325, 1412, 2325, 2325, 2325, 1412,
+ 1412, 2325, 2325, 2325, 1412, 2325, 2325, 1412, 975, 2325,
+ 975, 2325, 2325, 2325, 2325, 2325, 975, 2325, 975, 2325,
+ 975, 2325, 975, 2325, 2325, 2325, 975, 975, 2325, 975,
+ 975, 975, 2325, 2325, 975, 1698, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 1698, 2325, 2325, 1698, 1698, 2325, 1698,
+ 2325, 2325, 2325, 1698, 1698, 2325, 1698, 2325, 1698, 2325,
+ 2325, 1698, 1698, 2325, 1698, 1702, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 1702, 2325, 2325, 1702, 1702, 2325, 1702,
+ 2325, 2325, 2325, 1702, 1702, 2325, 1702, 2325, 1702, 2325,
+ 2325, 1702, 1702, 2325, 1702, 1739, 1739, 2325, 2325, 1739,
+ 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739,
+ 2325, 1739, 2325, 1739, 1739, 1739, 1739, 1739, 1739, 1739,
+ 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739,
+ 1739, 1741, 1741, 2325, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 2325, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1769, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 1769, 2325, 2325, 1769, 1769,
+ 2325, 1769, 2325, 2325, 2325, 1769, 1769, 2325, 1769, 2325,
+ 1769, 2325, 2325, 1769, 1769, 2325, 1769, 874, 2325, 874,
+ 2325, 2325, 2325, 2325, 2325, 874, 2325, 2325, 2325, 874,
+ 2325, 874, 2325, 2325, 2325, 874, 874, 2325, 2325, 2325,
+ 874, 2325, 2325, 874, 1008, 2325, 1008, 1008, 2325, 1008,
+ 2325, 1008, 1008, 2325, 1008, 2325, 1008, 1008, 1008, 1008,
+ 1008, 1008, 1008, 1008, 2325, 1008, 1008, 1008, 2325, 1008,
+ 1008, 1008, 2325, 2325, 1008, 2325, 2325, 1008, 1008, 280,
+ 2325, 280, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 280,
+
+ 2325, 2325, 280, 2325, 280, 280, 2325, 280, 2325, 2325,
+ 2325, 2325, 2325, 2325, 280, 280, 1295, 2325, 1295, 1295,
+ 1295, 1295, 1295, 1295, 2325, 2325, 1295, 1295, 1295, 1295,
+ 1295, 1295, 1295, 1295, 1295, 1295, 2325, 1295, 1295, 1295,
+ 2325, 2325, 2325, 2325, 1295, 2325, 1295, 1295, 898, 2325,
+ 898, 898, 898, 898, 898, 898, 2325, 2325, 898, 898,
+ 898, 898, 898, 898, 898, 898, 2325, 898, 2325, 898,
+ 898, 898, 2325, 2325, 2325, 2325, 898, 2325, 898, 1135,
+ 2325, 1135, 1135, 1135, 1135, 1135, 1135, 2325, 2325, 1135,
+ 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 2325,
+
+ 1135, 1135, 1135, 2325, 2325, 2325, 2325, 1135, 2325, 1135,
+ 1135, 1827, 1827, 2325, 1827, 1827, 1827, 1827, 1827, 1827,
+ 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827,
+ 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827,
+ 1827, 1827, 1827, 1827, 1827, 1827, 1827, 853, 853, 2325,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 853, 853, 853, 1860, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1860, 2325, 2325, 1860, 1860, 2325, 1860, 2325, 2325,
+
+ 2325, 1860, 1860, 2325, 1860, 2325, 1860, 2325, 2325, 1860,
+ 1860, 2325, 1860, 1864, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1864, 2325, 2325, 1864, 1864, 2325, 1864, 2325, 2325,
+ 2325, 1864, 1864, 2325, 1864, 2325, 1864, 2325, 2325, 1864,
+ 1864, 2325, 1864, 1769, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 1769, 2325, 2325, 1769, 1769, 2325, 1769, 2325, 2325,
+ 2325, 1769, 1769, 2325, 1769, 2325, 1769, 2325, 2325, 1769,
+ 1769, 2325, 1769, 898, 2325, 898, 898, 898, 898, 898,
+ 898, 2325, 2325, 898, 898, 898, 898, 898, 898, 898,
+ 898, 2325, 898, 2325, 898, 898, 898, 2325, 2325, 2325,
+
+ 2325, 898, 2325, 898, 1135, 2325, 1135, 1135, 2325, 1135,
+ 1135, 1135, 1135, 1135, 1135, 2325, 1135, 1135, 1135, 1135,
+ 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135,
+ 1135, 1135, 2325, 2325, 1135, 1135, 2325, 1135, 1135, 1412,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 1412, 2325, 2325,
+ 2325, 1412, 2325, 1412, 2325, 2325, 2325, 1412, 1412, 2325,
+ 2325, 2325, 1412, 2325, 2325, 1412, 1939, 1939, 2325, 1939,
+ 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939,
+ 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939,
+ 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939,
+
+ 1939, 1939, 1942, 1942, 2325, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1971, 1971,
+ 2325, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 2325, 1290, 1290, 1290, 1290, 1290, 1290,
+
+ 1290, 2325, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1131, 2325, 1131, 1131, 1131, 1131, 1131, 2325, 1131, 2325,
+ 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 2325, 1131,
+ 2325, 1131, 1131, 1131, 2325, 2325, 2325, 2325, 2325, 1131,
+ 1131, 1226, 2325, 2325, 1226, 2325, 1226, 1226, 1226, 1226,
+ 1226, 2325, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226,
+ 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 2325,
+ 1226, 2325, 2325, 1226, 1226, 853, 853, 2325, 853, 853,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+
+ 853, 853, 853, 853, 853, 853, 853, 853, 853, 853,
+ 853, 2037, 2037, 2325, 2037, 2037, 2037, 2037, 2037, 2037,
+ 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
+ 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037,
+ 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2041, 2041, 2325,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 1971, 1971, 2325, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 2080,
+ 2325, 2325, 2080, 2325, 2080, 2080, 2080, 2080, 2080, 2325,
+ 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
+ 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2325, 2080, 2325,
+ 2325, 2080, 2080, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 2325, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 2325, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 2108,
+ 2108, 2325, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+
+ 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 2108, 2108, 1226, 2325, 2325, 1226, 2325,
+ 1226, 1226, 1226, 1226, 1226, 2325, 1226, 1226, 1226, 1226,
+ 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226,
+ 1226, 1226, 1226, 2325, 1226, 2325, 2325, 1226, 1226, 2197,
+ 2325, 2325, 2197, 2325, 2197, 2197, 2197, 2197, 2197, 2325,
+ 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197,
+ 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2325, 2197, 2325,
+ 2325, 2197, 2197, 67, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325
+ } ;
+
+static yyconst flex_int16_t yy_chk[36577] =
+ { 0,
+ 0, 108, 1, 0, 108, 0, 1, 1, 1, 1,
+ 1, 2, 76, 650, 698, 2, 2, 2, 2, 2,
+ 75, 898, 650, 1, 75, 1, 4, 1, 4, 4,
+ 114, 77, 2, 114, 2, 77, 2, 116, 121, 4,
+ 558, 116, 4, 4, 4, 72, 72, 72, 72, 121,
+ 1, 73, 73, 73, 73, 74, 74, 74, 74, 2,
+ 86, 698, 126, 86, 73, 126, 91, 73, 73, 73,
+ 307, 76, 92, 93, 86, 91, 92, 307, 308, 93,
+ 1, 191, 93, 191, 76, 92, 898, 558, 308, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 5, 624, 624, 309, 5, 5, 5, 5,
+ 5, 309, 214, 275, 6, 214, 275, 5, 6, 6,
+ 6, 6, 6, 5, 264, 5, 21, 5, 264, 6,
+
+ 21, 21, 21, 21, 21, 6, 22, 6, 529, 6,
+ 22, 22, 22, 22, 22, 193, 193, 21, 193, 21,
+ 5, 21, 94, 529, 94, 94, 311, 22, 311, 22,
+ 23, 22, 6, 1200, 23, 23, 23, 23, 23, 102,
+ 102, 102, 102, 227, 21, 227, 227, 193, 94, 549,
+ 5, 23, 24, 23, 22, 23, 24, 24, 24, 24,
+ 24, 728, 6, 7, 7, 102, 7, 728, 7, 7,
+ 7, 7, 7, 24, 21, 24, 329, 24, 23, 329,
+ 143, 143, 143, 143, 22, 7, 25, 7, 549, 7,
+ 25, 25, 25, 25, 25, 1200, 139, 26, 139, 139,
+
+ 24, 26, 26, 26, 26, 26, 143, 25, 23, 25,
+ 185, 25, 7, 185, 135, 185, 135, 135, 26, 139,
+ 26, 135, 26, 726, 138, 185, 138, 138, 526, 143,
+ 24, 138, 27, 398, 25, 398, 27, 27, 27, 27,
+ 27, 726, 7, 8, 8, 26, 8, 526, 8, 8,
+ 8, 8, 8, 27, 559, 27, 245, 27, 245, 245,
+ 98, 98, 98, 98, 25, 8, 531, 8, 331, 8,
+ 194, 331, 194, 98, 463, 26, 98, 98, 98, 28,
+ 27, 531, 745, 28, 28, 28, 28, 28, 463, 306,
+ 332, 29, 8, 306, 332, 29, 29, 29, 29, 29,
+
+ 28, 194, 28, 559, 28, 182, 182, 182, 182, 548,
+ 27, 401, 29, 401, 29, 745, 29, 530, 195, 195,
+ 182, 195, 8, 9, 9, 9, 9, 28, 9, 9,
+ 9, 9, 9, 9, 9, 9, 530, 1098, 9, 29,
+ 9, 488, 401, 9, 9, 9, 548, 9, 9, 9,
+ 195, 533, 488, 183, 183, 183, 183, 28, 283, 30,
+ 283, 283, 533, 30, 30, 30, 30, 30, 183, 29,
+ 283, 9, 9, 9, 99, 99, 99, 99, 336, 532,
+ 30, 336, 30, 532, 30, 196, 196, 99, 196, 286,
+ 99, 99, 99, 1098, 148, 148, 148, 148, 647, 9,
+
+ 647, 9, 9, 10, 10, 10, 10, 30, 10, 10,
+ 10, 10, 10, 10, 10, 10, 148, 196, 10, 100,
+ 10, 100, 100, 10, 10, 10, 534, 10, 10, 10,
+ 347, 349, 100, 347, 349, 100, 100, 30, 297, 31,
+ 534, 502, 502, 31, 31, 31, 31, 31, 286, 1051,
+ 301, 10, 10, 10, 301, 122, 122, 122, 122, 122,
+ 31, 286, 31, 301, 31, 301, 486, 144, 144, 144,
+ 144, 483, 122, 502, 122, 223, 122, 223, 223, 10,
+ 223, 10, 10, 11, 11, 11, 11, 31, 11, 11,
+ 11, 11, 11, 144, 11, 11, 486, 297, 11, 122,
+
+ 11, 560, 730, 11, 11, 11, 1051, 11, 11, 11,
+ 297, 730, 149, 149, 149, 149, 144, 31, 357, 32,
+ 357, 357, 122, 32, 32, 32, 32, 32, 1895, 122,
+ 483, 11, 11, 11, 149, 132, 132, 132, 132, 132,
+ 32, 357, 32, 483, 32, 184, 184, 184, 184, 560,
+ 400, 400, 132, 400, 132, 310, 132, 310, 310, 11,
+ 184, 11, 11, 12, 12, 12, 12, 32, 12, 12,
+ 12, 12, 12, 435, 12, 12, 535, 435, 12, 132,
+ 12, 310, 400, 12, 12, 12, 435, 12, 12, 12,
+ 187, 187, 187, 187, 743, 535, 541, 32, 206, 206,
+
+ 206, 206, 132, 206, 1905, 207, 207, 207, 207, 132,
+ 207, 12, 12, 12, 212, 226, 226, 226, 226, 212,
+ 256, 256, 256, 256, 212, 212, 212, 1906, 212, 743,
+ 212, 259, 259, 259, 259, 262, 262, 262, 262, 12,
+ 541, 12, 12, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 15, 15, 15, 15, 731,
+ 15, 15, 15, 15, 15, 731, 358, 33, 358, 358,
+ 547, 33, 33, 33, 33, 33, 544, 15, 34, 15,
+ 545, 15, 34, 34, 34, 34, 34, 736, 33, 358,
+ 33, 736, 33, 546, 199, 438, 199, 199, 438, 34,
+ 547, 34, 39, 34, 15, 199, 39, 39, 39, 39,
+ 39, 261, 261, 261, 261, 33, 544, 261, 564, 200,
+ 39, 200, 200, 39, 545, 39, 34, 39, 690, 360,
+
+ 200, 360, 360, 546, 15, 16, 16, 16, 16, 690,
+ 16, 16, 16, 16, 16, 33, 1907, 40, 564, 199,
+ 39, 40, 40, 40, 40, 40, 34, 16, 927, 16,
+ 355, 16, 355, 355, 740, 40, 199, 355, 40, 538,
+ 40, 55, 40, 553, 200, 55, 55, 55, 55, 55,
+ 39, 43, 43, 538, 16, 43, 43, 43, 43, 43,
+ 440, 200, 55, 440, 55, 40, 55, 316, 316, 316,
+ 316, 554, 43, 316, 43, 740, 43, 317, 317, 317,
+ 317, 927, 553, 1908, 16, 17, 17, 17, 17, 55,
+ 17, 17, 17, 17, 17, 40, 550, 44, 44, 43,
+
+ 554, 44, 44, 44, 44, 44, 897, 17, 1912, 17,
+ 260, 17, 260, 260, 323, 323, 323, 323, 44, 55,
+ 44, 495, 44, 260, 495, 539, 260, 260, 539, 43,
+ 315, 56, 315, 315, 17, 56, 56, 56, 56, 56,
+ 550, 570, 688, 315, 570, 44, 315, 315, 324, 324,
+ 324, 324, 56, 727, 56, 57, 56, 897, 713, 57,
+ 57, 57, 57, 57, 17, 18, 18, 18, 18, 727,
+ 18, 18, 18, 18, 18, 44, 57, 58, 57, 56,
+ 57, 58, 58, 58, 58, 58, 688, 18, 713, 18,
+ 268, 18, 749, 581, 273, 268, 581, 729, 58, 273,
+
+ 58, 268, 58, 57, 268, 273, 268, 1913, 273, 56,
+ 273, 63, 734, 729, 18, 63, 63, 63, 63, 63,
+ 1023, 319, 749, 319, 319, 58, 359, 625, 359, 359,
+ 625, 734, 63, 57, 63, 64, 63, 319, 319, 64,
+ 64, 64, 64, 64, 18, 19, 19, 19, 19, 359,
+ 19, 19, 19, 19, 19, 58, 64, 710, 64, 63,
+ 64, 433, 320, 82, 320, 320, 742, 19, 82, 19,
+ 433, 19, 629, 433, 82, 320, 629, 82, 320, 320,
+ 735, 82, 82, 64, 735, 629, 1023, 82, 661, 63,
+ 82, 661, 1914, 326, 19, 326, 326, 203, 735, 203,
+
+ 203, 221, 221, 221, 221, 221, 326, 742, 203, 326,
+ 326, 701, 732, 64, 701, 82, 710, 203, 221, 732,
+ 221, 737, 221, 982, 19, 20, 20, 20, 20, 710,
+ 20, 20, 20, 20, 20, 290, 290, 290, 290, 733,
+ 737, 82, 733, 82, 82, 221, 739, 20, 747, 20,
+ 240, 20, 203, 290, 257, 257, 257, 257, 356, 290,
+ 356, 356, 760, 402, 402, 356, 402, 257, 221, 203,
+ 257, 257, 257, 760, 20, 221, 884, 240, 763, 240,
+ 240, 763, 982, 450, 240, 450, 450, 240, 240, 739,
+ 640, 240, 747, 240, 640, 402, 240, 884, 240, 387,
+
+ 387, 387, 387, 640, 20, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 49, 49, 49, 49, 741,
+ 49, 49, 49, 49, 49, 744, 49, 49, 403, 403,
+ 49, 403, 49, 983, 793, 49, 49, 49, 269, 49,
+ 49, 49, 746, 269, 1916, 367, 367, 367, 367, 269,
+ 793, 741, 269, 389, 269, 241, 389, 744, 389, 241,
+ 403, 241, 241, 49, 49, 49, 241, 367, 389, 241,
+ 241, 746, 784, 241, 750, 241, 404, 404, 241, 404,
+ 241, 391, 391, 391, 391, 810, 810, 342, 342, 342,
+ 342, 49, 983, 49, 49, 50, 50, 50, 50, 269,
+
+ 50, 50, 50, 50, 50, 342, 50, 50, 404, 761,
+ 50, 342, 50, 756, 1917, 50, 50, 50, 750, 50,
+ 50, 50, 258, 258, 258, 258, 784, 386, 386, 386,
+ 386, 321, 321, 321, 321, 258, 279, 321, 258, 258,
+ 258, 279, 386, 50, 50, 50, 756, 279, 321, 299,
+ 279, 816, 816, 761, 279, 279, 299, 847, 299, 299,
+ 279, 299, 756, 279, 363, 363, 363, 363, 299, 768,
+ 1453, 50, 768, 50, 50, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 847, 279, 51,
+ 363, 51, 1918, 314, 314, 314, 314, 51, 51, 51,
+
+ 51, 51, 51, 791, 605, 605, 314, 605, 299, 314,
+ 314, 314, 791, 363, 279, 1453, 279, 279, 284, 820,
+ 785, 299, 299, 284, 51, 51, 51, 51, 451, 284,
+ 451, 451, 284, 284, 859, 820, 605, 284, 426, 426,
+ 426, 426, 284, 364, 364, 364, 364, 449, 449, 449,
+ 449, 894, 51, 51, 51, 51, 51, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 364,
+ 284, 52, 876, 52, 785, 368, 368, 368, 368, 52,
+ 52, 52, 52, 52, 52, 388, 388, 388, 388, 1733,
+ 894, 467, 364, 467, 467, 859, 284, 368, 284, 284,
+
+ 388, 1203, 407, 536, 407, 407, 52, 52, 52, 52,
+ 392, 392, 392, 392, 1203, 870, 876, 392, 536, 392,
+ 393, 393, 393, 393, 536, 536, 888, 393, 446, 393,
+ 446, 446, 1733, 446, 52, 52, 52, 52, 52, 53,
+ 53, 53, 53, 888, 53, 53, 53, 53, 53, 53,
+ 53, 53, 606, 606, 53, 606, 53, 407, 869, 53,
+ 53, 53, 870, 53, 53, 53, 425, 425, 425, 425,
+ 468, 425, 468, 468, 407, 475, 475, 475, 475, 1940,
+ 406, 928, 406, 406, 606, 1945, 645, 53, 53, 53,
+ 811, 406, 409, 811, 409, 409, 645, 645, 645, 410,
+
+ 645, 410, 410, 409, 891, 53, 478, 478, 478, 478,
+ 410, 479, 479, 479, 479, 53, 869, 53, 53, 54,
+ 54, 54, 54, 887, 54, 54, 54, 54, 54, 54,
+ 54, 54, 928, 1097, 54, 406, 54, 887, 485, 54,
+ 54, 54, 485, 54, 54, 54, 476, 409, 476, 476,
+ 891, 485, 406, 485, 410, 1981, 1833, 587, 409, 587,
+ 587, 1833, 476, 476, 409, 410, 885, 54, 54, 54,
+ 415, 410, 886, 817, 829, 415, 817, 829, 428, 886,
+ 415, 415, 415, 428, 415, 54, 415, 885, 428, 428,
+ 428, 1097, 428, 862, 428, 54, 862, 54, 54, 59,
+
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 83, 500, 889, 500, 500,
+ 83, 907, 912, 520, 907, 912, 83, 520, 500, 83,
+ 83, 889, 892, 83, 83, 429, 520, 712, 520, 83,
+ 429, 712, 83, 434, 1131, 429, 429, 429, 434, 429,
+ 712, 429, 712, 434, 434, 434, 893, 434, 481, 434,
+ 481, 481, 844, 527, 748, 83, 527, 83, 484, 895,
+
+ 527, 481, 487, 484, 481, 481, 492, 487, 892, 484,
+ 527, 492, 484, 487, 484, 551, 487, 492, 487, 893,
+ 492, 977, 492, 83, 748, 83, 83, 87, 87, 87,
+ 87, 87, 504, 504, 504, 504, 1982, 748, 514, 504,
+ 1131, 895, 87, 514, 87, 607, 87, 607, 87, 514,
+ 504, 844, 514, 487, 514, 551, 504, 506, 506, 506,
+ 506, 551, 551, 515, 844, 977, 896, 517, 515, 517,
+ 517, 87, 1012, 991, 515, 506, 607, 515, 528, 515,
+ 87, 506, 524, 1012, 528, 537, 528, 524, 537, 87,
+ 991, 537, 528, 524, 87, 537, 524, 958, 524, 528,
+
+ 958, 87, 88, 1013, 537, 896, 537, 88, 1016, 88,
+ 1013, 1984, 951, 88, 88, 1016, 88, 88, 953, 88,
+ 88, 88, 517, 88, 515, 88, 88, 542, 951, 88,
+ 518, 543, 552, 1015, 953, 518, 1985, 519, 518, 517,
+ 518, 518, 519, 1125, 518, 519, 518, 519, 519, 1015,
+ 518, 519, 88, 519, 88, 1017, 542, 519, 1018, 1129,
+ 542, 552, 1125, 543, 552, 543, 1020, 969, 552, 542,
+ 543, 648, 648, 648, 648, 1014, 552, 543, 552, 1033,
+ 88, 969, 88, 88, 89, 89, 89, 89, 89, 1014,
+ 1033, 1018, 1017, 565, 1129, 565, 565, 1159, 519, 89,
+
+ 1019, 89, 1052, 89, 518, 89, 565, 1020, 723, 565,
+ 565, 519, 723, 566, 1021, 566, 566, 574, 574, 574,
+ 574, 723, 619, 723, 574, 1128, 566, 619, 89, 566,
+ 566, 89, 619, 619, 619, 574, 619, 89, 619, 1019,
+ 1124, 574, 611, 1052, 611, 611, 89, 1021, 1505, 1992,
+ 614, 89, 614, 614, 611, 1159, 1201, 1124, 89, 90,
+ 999, 614, 999, 999, 90, 1114, 90, 1114, 1114, 1128,
+ 90, 90, 1126, 90, 90, 1221, 90, 90, 90, 1993,
+ 90, 1126, 90, 90, 1220, 1160, 90, 1127, 576, 576,
+ 576, 576, 617, 1608, 617, 617, 618, 611, 618, 618,
+
+ 1220, 1243, 1201, 617, 1505, 614, 576, 618, 999, 90,
+ 1936, 90, 576, 1114, 611, 621, 1221, 621, 621, 1627,
+ 1303, 90, 614, 1627, 1996, 632, 621, 632, 632, 1127,
+ 90, 653, 1303, 653, 653, 621, 632, 90, 1279, 90,
+ 90, 96, 1157, 1160, 1157, 1157, 96, 617, 1608, 96,
+ 1243, 618, 96, 1936, 1395, 96, 96, 617, 96, 618,
+ 96, 96, 628, 1328, 617, 96, 1395, 628, 618, 1280,
+ 621, 659, 628, 628, 628, 846, 628, 2006, 628, 846,
+ 632, 659, 659, 659, 649, 659, 653, 621, 846, 649,
+ 846, 1485, 1393, 96, 649, 649, 649, 632, 649, 651,
+
+ 649, 1279, 2007, 653, 651, 1187, 1397, 1187, 1187, 651,
+ 651, 651, 684, 651, 1328, 651, 1208, 684, 1397, 96,
+ 1208, 96, 97, 684, 1298, 2013, 684, 97, 684, 97,
+ 1485, 1208, 1280, 97, 97, 1612, 97, 97, 2014, 97,
+ 97, 97, 655, 97, 1393, 97, 97, 655, 682, 2015,
+ 682, 682, 655, 655, 655, 685, 655, 1393, 655, 2016,
+ 685, 682, 687, 1705, 682, 682, 685, 687, 1400, 685,
+ 689, 685, 2017, 687, 97, 689, 687, 711, 687, 1298,
+ 1400, 689, 711, 1296, 689, 714, 689, 1612, 711, 1298,
+ 714, 711, 1296, 711, 1717, 715, 714, 715, 715, 714,
+
+ 97, 714, 97, 101, 101, 101, 101, 101, 101, 1216,
+ 101, 1216, 1216, 1299, 101, 1705, 685, 101, 101, 1626,
+ 1377, 101, 101, 706, 706, 706, 706, 101, 725, 845,
+ 101, 1377, 689, 725, 845, 1240, 714, 1240, 1240, 725,
+ 845, 706, 725, 845, 725, 845, 706, 706, 1296, 872,
+ 715, 2018, 1717, 101, 872, 101, 765, 765, 765, 765,
+ 872, 790, 1304, 872, 1304, 872, 790, 715, 1299, 1626,
+ 1377, 790, 790, 790, 765, 790, 1304, 790, 1299, 765,
+ 765, 101, 2020, 101, 101, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+
+ 188, 2018, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 201, 201, 2021,
+ 201, 201, 201, 201, 201, 201, 201, 2022, 201, 201,
+ 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+ 1930, 201, 201, 201, 1930, 201, 201, 201, 201, 201,
+
+ 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+ 201, 201, 201, 201, 201, 201, 201, 1536, 201, 201,
+ 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+ 201, 201, 201, 201, 201, 201, 201, 201, 201, 201,
+ 201, 201, 201, 201, 1411, 201, 1411, 201, 201, 204,
+ 204, 2024, 204, 204, 204, 204, 204, 1402, 204, 1536,
+ 204, 204, 204, 204, 204, 204, 204, 204, 204, 1402,
+ 204, 204, 204, 204, 204, 204, 2037, 1115, 718, 1115,
+ 1115, 783, 1536, 783, 783, 718, 1487, 718, 718, 2056,
+ 718, 1609, 788, 1613, 788, 788, 1718, 718, 204, 719,
+
+ 204, 204, 1392, 788, 719, 204, 1403, 719, 1398, 719,
+ 719, 1398, 2057, 719, 1022, 719, 1022, 1022, 1403, 719,
+ 1398, 795, 204, 795, 795, 1881, 1763, 204, 1401, 204,
+ 282, 789, 1487, 789, 789, 282, 783, 718, 1115, 1401,
+ 1401, 282, 789, 1115, 282, 282, 1609, 788, 282, 282,
+ 718, 718, 1718, 783, 282, 1613, 1392, 282, 720, 1406,
+ 1768, 788, 1022, 720, 788, 1413, 720, 1392, 720, 720,
+ 1488, 1406, 720, 719, 720, 1599, 795, 1413, 720, 1022,
+ 282, 1763, 282, 1444, 789, 797, 789, 797, 797, 800,
+ 1881, 800, 800, 795, 801, 1444, 801, 801, 1423, 821,
+
+ 1423, 821, 821, 789, 802, 801, 802, 802, 282, 720,
+ 282, 282, 300, 1423, 1599, 802, 1488, 300, 1263, 300,
+ 1263, 1263, 1768, 300, 300, 1406, 300, 300, 1646, 300,
+ 300, 300, 720, 300, 1622, 300, 300, 848, 1810, 300,
+ 797, 1601, 848, 854, 800, 854, 854, 1621, 848, 801,
+ 854, 848, 1754, 848, 821, 2058, 1622, 797, 1602, 802,
+ 801, 800, 300, 824, 300, 2059, 801, 1646, 824, 1621,
+ 802, 821, 2063, 824, 824, 824, 802, 824, 1267, 824,
+ 1267, 1267, 865, 865, 865, 865, 1919, 1601, 848, 865,
+ 300, 1754, 300, 300, 302, 1622, 1810, 302, 854, 1242,
+
+ 865, 1242, 1242, 302, 1602, 865, 865, 302, 1919, 302,
+ 1621, 1242, 2064, 302, 302, 854, 2065, 1210, 302, 1210,
+ 1210, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+ 302, 302, 1271, 1824, 1271, 1271, 302, 302, 302, 302,
+ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+ 302, 302, 302, 302, 302, 302, 302, 302, 302, 302,
+ 303, 935, 1624, 935, 935, 303, 1924, 303, 1210, 1648,
+ 1924, 303, 303, 1210, 303, 303, 1625, 303, 303, 303,
+ 851, 303, 1924, 303, 303, 851, 866, 866, 866, 866,
+
+ 1287, 851, 1287, 1287, 851, 1824, 851, 867, 867, 867,
+ 867, 2030, 867, 1704, 866, 1535, 873, 867, 1649, 866,
+ 866, 873, 303, 2068, 875, 1648, 935, 873, 877, 875,
+ 873, 1624, 873, 877, 1427, 875, 1427, 851, 875, 877,
+ 875, 890, 877, 935, 877, 1625, 890, 1313, 303, 1427,
+ 303, 305, 890, 1706, 1811, 890, 305, 890, 305, 1313,
+ 1313, 2030, 305, 305, 1649, 305, 305, 1704, 305, 305,
+ 305, 973, 305, 1535, 305, 305, 973, 873, 305, 1719,
+ 1535, 1719, 973, 2066, 880, 973, 1764, 973, 1882, 880,
+ 877, 1880, 880, 1880, 880, 880, 1811, 1767, 880, 1706,
+
+ 880, 305, 881, 305, 880, 2066, 1319, 881, 1319, 1319,
+ 881, 1866, 881, 881, 1781, 305, 881, 1266, 881, 1266,
+ 1266, 1320, 881, 1320, 1320, 910, 910, 910, 910, 305,
+ 910, 305, 305, 313, 1327, 910, 1327, 1327, 313, 1266,
+ 931, 1764, 931, 931, 313, 313, 1327, 313, 313, 1767,
+ 313, 931, 313, 1974, 1882, 1867, 313, 313, 880, 908,
+ 908, 908, 908, 881, 1781, 1866, 908, 1921, 909, 909,
+ 909, 909, 1330, 976, 1330, 1330, 881, 908, 976, 1781,
+ 2087, 2089, 908, 908, 976, 313, 909, 976, 979, 976,
+ 2092, 909, 909, 979, 1332, 931, 1332, 1332, 1344, 979,
+
+ 1344, 1344, 979, 1350, 979, 1350, 1350, 1867, 2093, 1974,
+ 931, 313, 931, 313, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 1921, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 394, 394, 394, 394,
+ 394, 394, 394, 394, 394, 394, 395, 2094, 2095, 395,
+
+ 2101, 395, 395, 395, 395, 395, 395, 395, 395, 395,
+ 395, 395, 2102, 395, 395, 395, 395, 395, 395, 395,
+ 395, 395, 395, 395, 395, 395, 395, 395, 395, 395,
+ 395, 395, 395, 395, 395, 395, 395, 395, 395, 395,
+ 395, 395, 395, 395, 395, 395, 395, 395, 395, 395,
+ 395, 395, 395, 395, 395, 395, 395, 395, 395, 395,
+ 395, 395, 395, 395, 395, 395, 395, 395, 395, 395,
+ 395, 395, 395, 395, 395, 395, 395, 395, 408, 2028,
+ 408, 408, 1987, 2103, 2028, 408, 2130, 408, 1756, 408,
+ 408, 882, 994, 994, 994, 994, 882, 1757, 974, 882,
+
+ 408, 882, 882, 974, 408, 882, 2131, 882, 2132, 974,
+ 994, 882, 974, 2133, 974, 2134, 994, 2137, 995, 995,
+ 995, 995, 1499, 995, 1987, 978, 1812, 408, 995, 932,
+ 978, 932, 932, 408, 1756, 944, 978, 944, 944, 978,
+ 932, 978, 995, 1757, 1499, 1345, 944, 1345, 1345, 1382,
+ 408, 1382, 1382, 882, 408, 1715, 408, 412, 412, 974,
+ 412, 412, 412, 412, 412, 882, 412, 1345, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 1715, 412, 412,
+ 412, 412, 412, 412, 932, 1812, 1499, 978, 2096, 1418,
+ 944, 1418, 2138, 1034, 1034, 1034, 1034, 1418, 1418, 932,
+
+ 944, 932, 1825, 2050, 1418, 980, 412, 944, 412, 412,
+ 980, 1034, 945, 412, 945, 945, 980, 1034, 1973, 980,
+ 1399, 980, 1715, 945, 981, 1399, 981, 981, 1868, 1849,
+ 412, 981, 1399, 1399, 1815, 412, 1500, 412, 413, 413,
+ 2096, 413, 413, 413, 413, 413, 1772, 413, 1825, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413, 1500, 413,
+ 413, 413, 413, 413, 413, 2050, 1001, 945, 1772, 980,
+ 1419, 1001, 1419, 1815, 1868, 945, 1973, 1001, 1419, 981,
+ 1001, 1091, 1001, 1419, 945, 1419, 1091, 413, 1849, 413,
+ 413, 2149, 1091, 2151, 413, 1091, 981, 1091, 1118, 1005,
+
+ 1500, 2154, 2034, 1118, 1005, 413, 2034, 1772, 2034, 1118,
+ 1005, 413, 1118, 1005, 1118, 1005, 413, 2156, 413, 416,
+ 416, 2158, 416, 416, 416, 416, 416, 416, 416, 2161,
+ 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+ 416, 416, 2027, 416, 416, 416, 1005, 416, 416, 416,
+ 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+ 416, 416, 416, 416, 416, 416, 416, 416, 416, 1911,
+ 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+ 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
+ 416, 416, 416, 416, 416, 416, 2027, 416, 2031, 416,
+
+ 416, 418, 418, 1991, 418, 418, 418, 418, 418, 418,
+ 418, 418, 418, 418, 418, 1911, 418, 1986, 418, 418,
+ 418, 1003, 2162, 418, 418, 418, 1003, 418, 418, 1095,
+ 1922, 2051, 1003, 2179, 1095, 1003, 1008, 1003, 1822, 2185,
+ 1095, 1008, 1991, 1095, 1008, 1095, 1008, 1008, 2031, 2186,
+ 1008, 418, 1008, 418, 1103, 1103, 1008, 418, 2187, 1103,
+ 1822, 1035, 1035, 1035, 1035, 1103, 1035, 2188, 1103, 2194,
+ 1103, 1035, 1003, 2205, 418, 1986, 1095, 2051, 418, 418,
+ 418, 418, 418, 419, 419, 1035, 419, 419, 419, 419,
+ 419, 419, 419, 1922, 419, 419, 419, 419, 419, 419,
+
+ 419, 419, 419, 419, 419, 419, 1822, 419, 419, 419,
+ 1008, 419, 419, 419, 419, 419, 419, 419, 419, 419,
+ 419, 419, 419, 419, 419, 419, 419, 419, 419, 419,
+ 419, 419, 419, 1667, 419, 419, 419, 419, 419, 419,
+ 419, 419, 419, 419, 419, 419, 419, 419, 419, 419,
+ 419, 419, 419, 419, 419, 419, 419, 419, 419, 419,
+ 2052, 419, 2076, 419, 419, 420, 420, 2208, 420, 420,
+ 420, 420, 420, 1850, 420, 1909, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 2062, 420, 420, 420, 420,
+ 420, 420, 1667, 2210, 2212, 1010, 1096, 2232, 1667, 2234,
+
+ 1010, 1096, 2127, 1010, 2236, 1010, 1010, 1096, 1197, 1010,
+ 1096, 1010, 1096, 1197, 420, 1010, 420, 420, 2052, 1197,
+ 1412, 420, 1197, 1412, 1197, 1282, 1282, 2076, 2239, 1412,
+ 1282, 2062, 1850, 1412, 1909, 1412, 1282, 1910, 420, 1282,
+ 1412, 1282, 1010, 420, 1412, 420, 421, 421, 2127, 421,
+ 421, 421, 421, 421, 421, 421, 1096, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421, 421, 1010,
+ 421, 421, 421, 1883, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 1910, 421, 421, 421,
+
+ 421, 421, 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 2099, 421, 1883, 421, 421, 423, 423,
+ 2157, 423, 423, 423, 423, 423, 2053, 423, 1883, 423,
+ 423, 423, 423, 423, 423, 423, 423, 423, 2105, 423,
+ 423, 423, 423, 423, 423, 2248, 1093, 1109, 1109, 1109,
+ 1109, 1093, 2099, 1302, 2249, 1302, 1302, 1093, 2267, 2269,
+ 1093, 1859, 1093, 2271, 1302, 1109, 2157, 423, 2292, 423,
+ 423, 1109, 1859, 1859, 423, 1302, 1302, 1111, 1111, 1111,
+ 1111, 1446, 2053, 1446, 1446, 423, 1447, 2293, 1447, 1447,
+
+ 1456, 423, 1456, 1456, 2105, 1111, 423, 1093, 423, 493,
+ 493, 1111, 493, 493, 493, 493, 493, 493, 493, 493,
+ 493, 493, 493, 493, 493, 493, 493, 493, 493, 493,
+ 493, 493, 493, 493, 493, 493, 493, 493, 493, 493,
+ 493, 493, 493, 493, 493, 493, 493, 493, 493, 493,
+ 493, 493, 493, 493, 493, 493, 493, 493, 493, 493,
+ 493, 493, 493, 493, 493, 493, 493, 493, 493, 493,
+ 493, 493, 493, 493, 493, 493, 493, 493, 493, 493,
+ 493, 493, 493, 493, 493, 493, 493, 493, 493, 493,
+ 493, 501, 1000, 1976, 1000, 1000, 501, 1977, 1142, 1142,
+
+ 1142, 1142, 501, 1009, 1988, 501, 501, 1894, 1009, 501,
+ 501, 1009, 1893, 1009, 1009, 501, 1142, 1009, 2122, 1009,
+ 1117, 1876, 1142, 1009, 1420, 1117, 1055, 1823, 1055, 1055,
+ 1420, 1117, 1420, 1872, 1117, 2107, 1117, 1055, 1420, 1420,
+ 1000, 501, 1716, 501, 1056, 1420, 1056, 1056, 1065, 1823,
+ 1065, 1065, 1976, 1920, 1009, 1056, 1977, 1657, 1462, 1065,
+ 1462, 1462, 1000, 1988, 1716, 1144, 1144, 1144, 1144, 501,
+ 1925, 501, 501, 556, 1925, 1920, 2122, 1009, 556, 1657,
+ 556, 1055, 1117, 1144, 556, 556, 1925, 556, 556, 1144,
+ 556, 556, 556, 1716, 556, 1823, 556, 556, 1055, 1056,
+
+ 556, 2107, 2124, 1065, 1317, 1056, 1317, 1317, 1066, 2048,
+ 1066, 1066, 1920, 1119, 1871, 1317, 1056, 1065, 1119, 1066,
+ 1065, 1657, 2125, 556, 1119, 556, 1317, 1119, 1122, 1119,
+ 1658, 556, 1163, 1122, 1163, 1163, 1122, 1874, 1122, 1122,
+ 2176, 1668, 1122, 1285, 1122, 1285, 1285, 1379, 1122, 1379,
+ 1379, 556, 1658, 556, 556, 557, 1864, 2049, 1285, 1874,
+ 557, 1066, 557, 1066, 2126, 2124, 557, 557, 2048, 557,
+ 557, 1860, 557, 557, 557, 2060, 557, 1119, 557, 557,
+ 1066, 1123, 557, 2176, 1830, 2125, 1123, 1163, 1874, 1123,
+ 1122, 1123, 1123, 1285, 1658, 1123, 1466, 1123, 1466, 1466,
+
+ 1668, 1123, 1122, 2061, 1163, 557, 1668, 557, 1164, 2135,
+ 1164, 1164, 1172, 1379, 1172, 1172, 2049, 1994, 1173, 1164,
+ 1173, 1173, 1227, 1172, 1227, 1227, 2126, 1198, 1244, 1173,
+ 1244, 1244, 1198, 557, 2060, 557, 557, 563, 1198, 1994,
+ 1244, 1198, 563, 1198, 1256, 1123, 1256, 1256, 563, 563,
+ 2106, 563, 563, 1821, 563, 1123, 563, 2082, 2123, 2135,
+ 563, 563, 2061, 1164, 2104, 1214, 1579, 1172, 1579, 1579,
+ 1214, 1164, 1580, 1173, 1580, 1580, 1214, 1227, 1820, 1214,
+ 1164, 1214, 1172, 1244, 1172, 1994, 2104, 1276, 1173, 563,
+ 1173, 1198, 1276, 1692, 1227, 1692, 1692, 1426, 1276, 1256,
+
+ 1244, 1276, 1426, 1276, 1426, 1256, 2106, 1902, 1426, 1902,
+ 1902, 2082, 1214, 1426, 2123, 563, 1256, 563, 601, 2104,
+ 1819, 601, 2082, 601, 601, 601, 601, 601, 601, 601,
+ 601, 601, 601, 601, 1276, 601, 601, 601, 601, 601,
+ 601, 601, 601, 601, 601, 601, 601, 601, 601, 601,
+ 601, 601, 601, 601, 601, 601, 601, 601, 601, 601,
+ 601, 601, 601, 601, 601, 601, 601, 601, 601, 601,
+ 601, 601, 601, 601, 601, 601, 601, 601, 601, 601,
+ 601, 601, 601, 601, 601, 601, 601, 601, 601, 601,
+ 601, 601, 601, 601, 601, 601, 601, 601, 601, 601,
+
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 603, 603, 603, 1818, 603, 603, 603,
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 603, 603, 603, 603, 603, 603, 603, 603,
+ 603, 603, 610, 1771, 610, 610, 2169, 1196, 1873, 610,
+ 1817, 610, 1196, 610, 610, 1199, 1816, 1809, 1196, 1808,
+
+ 1199, 1196, 1215, 1196, 610, 1771, 1199, 1215, 610, 1199,
+ 1873, 1199, 1218, 1215, 2189, 1806, 1215, 1218, 1215, 1219,
+ 1218, 2163, 1218, 1218, 1219, 1805, 1218, 1219, 1218, 1219,
+ 1219, 610, 1218, 1219, 2002, 1219, 2083, 610, 2000, 1219,
+ 1246, 1801, 1246, 1246, 2169, 1254, 1771, 1254, 1254, 1196,
+ 1511, 1246, 1511, 1511, 610, 1873, 1254, 1199, 610, 1218,
+ 610, 613, 1215, 613, 613, 1421, 2189, 1421, 613, 1421,
+ 613, 2163, 613, 613, 1255, 1421, 1255, 1255, 1508, 1219,
+ 1508, 1508, 1421, 613, 2000, 1255, 1218, 613, 2083, 2002,
+ 1926, 1288, 1926, 1219, 1926, 1246, 1288, 1246, 2111, 2002,
+
+ 1254, 2083, 1288, 2000, 1277, 1288, 1926, 1288, 1289, 1277,
+ 613, 1511, 1246, 1289, 2178, 1277, 613, 1254, 1277, 1289,
+ 1277, 1827, 1289, 2003, 1289, 1291, 1827, 1291, 1291, 1255,
+ 1827, 1995, 1787, 613, 1827, 1255, 1827, 613, 1786, 613,
+ 615, 2112, 615, 615, 1508, 1355, 1255, 615, 2164, 615,
+ 1355, 615, 615, 1995, 2314, 1288, 1355, 2111, 2314, 1355,
+ 2178, 1355, 615, 1293, 1277, 1785, 615, 1422, 1293, 1422,
+ 1289, 1293, 1422, 1293, 1293, 1422, 1294, 1293, 2003, 1293,
+ 1291, 1294, 1422, 1293, 1294, 2067, 1294, 1294, 2003, 615,
+ 1294, 1306, 1294, 1306, 1306, 615, 1294, 1291, 2164, 1995,
+
+ 2112, 1336, 1306, 1336, 1336, 2071, 615, 2067, 1378, 1355,
+ 1378, 1378, 615, 1306, 1306, 2170, 615, 2071, 615, 616,
+ 1928, 616, 616, 1378, 1928, 2025, 616, 1293, 616, 1783,
+ 616, 616, 1312, 2114, 1312, 1312, 1928, 1293, 1294, 1774,
+ 1773, 616, 1769, 1312, 2067, 616, 1428, 2025, 1310, 1428,
+ 1294, 1428, 2172, 1310, 1312, 1312, 1336, 1428, 1378, 1310,
+ 1310, 1761, 1310, 1310, 1428, 2177, 1746, 1310, 616, 1424,
+ 2071, 2170, 1310, 1336, 616, 1424, 1337, 1424, 1337, 1337,
+ 1932, 2147, 1853, 1424, 1932, 616, 2025, 1337, 1424, 2218,
+ 1424, 616, 2114, 1853, 1853, 616, 1932, 616, 620, 620,
+
+ 1310, 620, 620, 620, 620, 620, 2115, 620, 2172, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 2181, 620,
+ 620, 620, 620, 620, 620, 1853, 1310, 2177, 1310, 1310,
+ 1315, 1337, 1315, 1315, 1316, 2147, 1316, 1316, 2139, 1337,
+ 2010, 1315, 2010, 2010, 1741, 1316, 2147, 620, 1337, 620,
+ 620, 2218, 1315, 1315, 620, 2171, 1316, 1316, 1356, 1688,
+ 2139, 1688, 1688, 1356, 1358, 2115, 1358, 1358, 2167, 1356,
+ 1740, 620, 1356, 1934, 1356, 1358, 620, 1934, 620, 622,
+ 622, 2181, 622, 622, 622, 622, 622, 1358, 622, 1934,
+ 622, 622, 622, 622, 622, 622, 622, 622, 622, 2139,
+
+ 622, 622, 622, 622, 622, 622, 2215, 1437, 2192, 1437,
+ 1443, 1316, 1443, 2171, 2023, 1437, 2023, 2023, 1443, 1358,
+ 1356, 1359, 1437, 1359, 1359, 1443, 2180, 2167, 622, 1383,
+ 622, 622, 1359, 1443, 1383, 622, 1358, 1688, 1437, 1360,
+ 1383, 1360, 1360, 1383, 1359, 1383, 622, 2192, 1360, 2215,
+ 1360, 2220, 622, 1385, 1937, 1385, 1385, 622, 1937, 622,
+ 630, 630, 1360, 630, 630, 630, 630, 630, 630, 630,
+ 1937, 630, 630, 630, 2195, 630, 1359, 630, 630, 630,
+ 2180, 2084, 630, 1425, 630, 1425, 630, 630, 1739, 1383,
+ 1714, 1425, 1425, 1359, 1360, 1713, 2195, 2085, 1425, 1425,
+
+ 1712, 1429, 1711, 1362, 2182, 1362, 1362, 1429, 1385, 1429,
+ 630, 1360, 630, 2220, 1362, 1429, 630, 1364, 2217, 1364,
+ 1364, 1363, 1429, 1363, 1363, 1385, 1362, 1929, 1364, 2195,
+ 2287, 1929, 1363, 630, 1929, 1363, 2084, 630, 630, 630,
+ 630, 630, 631, 1929, 1363, 631, 2084, 631, 631, 631,
+ 631, 631, 2085, 631, 631, 631, 2168, 631, 1362, 631,
+ 631, 631, 2085, 1431, 631, 1431, 631, 2182, 631, 631,
+ 1710, 1431, 1364, 2287, 2217, 1362, 1363, 1630, 1431, 1630,
+ 1630, 1798, 1709, 1798, 1798, 1365, 1431, 1365, 1365, 1364,
+ 1431, 1702, 631, 1363, 631, 1381, 1365, 1381, 1381, 1431,
+
+ 1698, 1365, 1512, 1366, 1693, 1366, 1366, 1512, 1365, 1365,
+ 1381, 1690, 2301, 1512, 1366, 2168, 1512, 1674, 1512, 631,
+ 631, 631, 631, 631, 633, 633, 1366, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 1630, 633,
+ 1365, 633, 633, 633, 2227, 1381, 633, 633, 633, 1542,
+ 633, 633, 1673, 1414, 1542, 2301, 1414, 1365, 1366, 1798,
+ 1542, 2201, 1414, 1542, 1512, 1542, 1414, 1368, 1414, 1368,
+ 1368, 2213, 2143, 1414, 633, 1366, 633, 1414, 1368, 2225,
+ 633, 1408, 1935, 1408, 1408, 1371, 1935, 1371, 1371, 2216,
+ 1368, 1736, 1408, 1736, 1736, 1670, 1371, 633, 1935, 1935,
+
+ 2227, 633, 633, 633, 633, 633, 634, 634, 1371, 634,
+ 634, 634, 634, 634, 634, 634, 634, 634, 634, 634,
+ 2201, 634, 1368, 634, 634, 634, 2201, 2143, 634, 634,
+ 634, 2202, 634, 634, 2213, 1415, 1408, 2143, 1415, 1368,
+ 1371, 1736, 2225, 1369, 1415, 1369, 1369, 2216, 1415, 2088,
+ 1415, 2088, 2088, 1408, 1369, 1415, 634, 1371, 634, 1415,
+ 1389, 1459, 634, 1459, 1459, 1389, 1369, 1369, 1389, 1661,
+ 1389, 1389, 1459, 634, 1389, 2219, 1389, 2229, 1415, 634,
+ 1389, 2146, 2264, 634, 634, 634, 634, 634, 636, 636,
+ 2202, 636, 636, 636, 636, 636, 2202, 636, 1369, 636,
+
+ 636, 636, 636, 636, 636, 2221, 636, 636, 1660, 636,
+ 636, 1430, 636, 636, 636, 1369, 1459, 1430, 1459, 1430,
+ 1389, 2219, 1652, 2146, 1372, 1430, 1372, 1372, 1433, 1638,
+ 1433, 2229, 1430, 1459, 1389, 1372, 1433, 636, 2264, 636,
+ 636, 2035, 2144, 1433, 636, 2035, 2146, 1372, 2251, 1543,
+ 1491, 2221, 1491, 1491, 1543, 1430, 1438, 2035, 1438, 2391,
+ 1543, 636, 1433, 1543, 1438, 1543, 636, 2391, 636, 637,
+ 637, 1438, 637, 637, 637, 637, 637, 1633, 637, 1372,
+ 637, 637, 637, 637, 637, 637, 637, 637, 637, 1438,
+ 637, 637, 637, 637, 637, 637, 1372, 2144, 1434, 1416,
+
+ 1434, 1372, 1416, 1435, 1631, 1491, 1434, 2144, 1416, 1435,
+ 2251, 1435, 1416, 1434, 1416, 2226, 1629, 1435, 637, 1416,
+ 637, 637, 1491, 1416, 1435, 637, 1416, 2145, 1620, 1784,
+ 1416, 1784, 1784, 2253, 1619, 1617, 1434, 1442, 2235, 1442,
+ 1416, 1616, 637, 1435, 1938, 1442, 2072, 637, 1938, 637,
+ 638, 638, 1442, 638, 638, 638, 638, 638, 2072, 638,
+ 1938, 638, 638, 638, 638, 638, 638, 638, 638, 638,
+ 1442, 638, 638, 638, 638, 638, 638, 1784, 2226, 1436,
+ 1417, 1436, 2029, 1417, 2235, 2145, 2029, 1436, 2100, 1417,
+ 2100, 2100, 2145, 1417, 1436, 1417, 2253, 2029, 2029, 638,
+
+ 1417, 638, 638, 1436, 1417, 2036, 638, 2290, 1470, 2036,
+ 1417, 2072, 1417, 1470, 1938, 2250, 2252, 638, 1417, 1470,
+ 1614, 2036, 1470, 638, 1470, 1417, 1606, 2263, 638, 2291,
+ 638, 641, 641, 1591, 641, 641, 641, 641, 641, 1586,
+ 641, 2240, 641, 641, 641, 641, 641, 641, 641, 641,
+ 641, 2254, 641, 641, 1585, 641, 641, 641, 1432, 1440,
+ 1432, 1440, 2252, 2290, 1439, 2250, 1432, 1440, 1470, 2255,
+ 1439, 1584, 1439, 1432, 1440, 1581, 2256, 2263, 1439, 2291,
+ 641, 1802, 641, 641, 1432, 1439, 1432, 641, 2148, 2244,
+ 1802, 1432, 1510, 1440, 1510, 1510, 2240, 1576, 1432, 1440,
+
+ 1440, 1802, 1802, 1802, 641, 2262, 2240, 1510, 1439, 641,
+ 2078, 641, 642, 642, 2254, 642, 642, 642, 642, 642,
+ 2305, 642, 2078, 642, 642, 642, 642, 642, 642, 642,
+ 642, 642, 2255, 642, 642, 2307, 642, 642, 642, 2256,
+ 2148, 1582, 1510, 1441, 1802, 1441, 1582, 1544, 1575, 1574,
+ 1544, 1441, 1582, 2148, 2244, 1582, 1544, 1582, 1441, 2262,
+ 1544, 642, 1544, 642, 642, 1843, 1441, 1544, 642, 1441,
+ 1843, 1544, 1572, 1441, 1843, 2078, 2305, 1570, 1843, 642,
+ 1843, 1441, 1569, 1441, 2153, 642, 2153, 2153, 1540, 1544,
+ 642, 2307, 642, 646, 646, 1539, 646, 646, 646, 646,
+
+ 646, 1538, 646, 1582, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+ 1843, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 1530, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646, 646, 646,
+ 2280, 646, 2203, 646, 646, 696, 1545, 2281, 696, 1545,
+ 696, 696, 696, 696, 696, 1545, 696, 696, 696, 1545,
+ 696, 1545, 696, 696, 696, 2283, 1545, 696, 2309, 696,
+
+ 1545, 696, 696, 1671, 1546, 1671, 1671, 1546, 2155, 1529,
+ 2155, 2155, 1526, 1546, 1671, 2394, 1545, 1546, 2193, 1546,
+ 2193, 2193, 1517, 2394, 1546, 696, 1548, 696, 1546, 1548,
+ 2203, 1681, 1509, 2280, 1546, 1548, 1681, 2203, 1502, 1548,
+ 2281, 1548, 1681, 1494, 1493, 1681, 1548, 1681, 2309, 2283,
+ 1548, 1671, 696, 696, 696, 696, 696, 697, 697, 1548,
+ 697, 697, 697, 697, 697, 697, 697, 697, 697, 697,
+ 697, 697, 697, 697, 697, 697, 697, 697, 697, 697,
+ 697, 697, 697, 697, 697, 697, 697, 697, 697, 697,
+ 697, 697, 697, 697, 697, 697, 697, 697, 697, 697,
+
+ 697, 697, 697, 697, 697, 697, 697, 697, 697, 697,
+ 697, 697, 697, 697, 697, 697, 697, 697, 697, 697,
+ 697, 697, 697, 697, 697, 697, 697, 697, 697, 697,
+ 697, 697, 697, 697, 697, 697, 697, 697, 697, 699,
+ 699, 1492, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 752, 1497, 1477, 1497, 1497, 752, 2228, 752, 2228,
+ 2228, 2241, 752, 752, 1549, 752, 752, 1549, 752, 752,
+ 752, 2317, 752, 1549, 752, 752, 1497, 1549, 752, 1549,
+ 1858, 1472, 1858, 1858, 1549, 1468, 1467, 1367, 1549, 1367,
+ 1367, 1463, 1461, 2231, 1549, 2231, 2231, 1664, 1367, 1664,
+ 1664, 752, 1474, 752, 1474, 1474, 2316, 1497, 1664, 1367,
+ 1367, 1367, 1457, 1474, 2412, 2075, 2241, 1490, 2075, 1490,
+ 1490, 2317, 2412, 1664, 1497, 1474, 2241, 2075, 1490, 752,
+
+ 1858, 752, 752, 753, 2285, 753, 753, 753, 753, 753,
+ 753, 1367, 1367, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 2200, 753, 753, 1696, 1474, 1475, 1367,
+ 1475, 1475, 2316, 1664, 1476, 1696, 1476, 1476, 1478, 1475,
+ 1478, 1478, 1490, 1476, 1474, 1476, 1696, 1696, 1696, 1478,
+ 2075, 1475, 2318, 1479, 2242, 1479, 1479, 1476, 2285, 1490,
+ 1778, 1478, 1778, 1778, 1479, 1455, 1495, 1479, 1495, 1495,
+ 1665, 1778, 1665, 1665, 2199, 2200, 1479, 1495, 753, 753,
+ 754, 1665, 1452, 1475, 1451, 754, 1778, 754, 2200, 1476,
+ 1696, 754, 754, 1478, 754, 754, 1665, 754, 754, 754,
+
+ 1475, 754, 2318, 754, 754, 2303, 1476, 754, 1479, 1450,
+ 1478, 1877, 2242, 1877, 1877, 2086, 1449, 2086, 2086, 2242,
+ 1448, 1495, 1877, 1778, 1480, 1479, 1480, 1480, 2199, 1445,
+ 754, 1878, 754, 1878, 1878, 1480, 1665, 1877, 1495, 2199,
+ 1480, 2273, 1878, 1481, 1407, 1481, 1481, 1480, 1480, 2233,
+ 754, 2233, 2233, 2005, 1481, 2005, 2005, 1878, 754, 2303,
+ 754, 754, 780, 2086, 2005, 780, 1481, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 1405, 1480,
+ 780, 780, 1738, 780, 780, 780, 780, 780, 780, 780,
+ 1404, 1738, 1503, 2273, 1503, 1503, 1480, 2272, 1481, 1503,
+
+ 1878, 2005, 1738, 1738, 1738, 1482, 2273, 1482, 1482, 1803,
+ 2079, 780, 780, 780, 780, 1481, 1482, 1541, 1803, 1541,
+ 1541, 1483, 2079, 1483, 1483, 1396, 2204, 1482, 1482, 1803,
+ 1803, 1803, 1483, 2322, 1738, 2073, 2243, 2073, 1388, 780,
+ 780, 780, 780, 786, 1483, 786, 786, 1503, 1841, 2073,
+ 786, 2272, 786, 1841, 786, 786, 1484, 1841, 1484, 1484,
+ 1482, 1841, 2272, 1841, 1503, 786, 1387, 1484, 2204, 786,
+ 1803, 1486, 1541, 1486, 1486, 2079, 1483, 1482, 2243, 1484,
+ 1484, 1386, 1486, 2322, 1489, 1370, 1489, 1489, 1361, 1541,
+ 2246, 2204, 786, 1483, 1486, 1489, 1841, 2214, 786, 2214,
+
+ 2214, 2243, 2073, 1496, 2214, 1496, 1496, 1489, 786, 1352,
+ 2261, 1484, 2261, 2261, 1496, 786, 1496, 2261, 2245, 786,
+ 1351, 786, 787, 2278, 787, 787, 1486, 1547, 1484, 787,
+ 1547, 787, 2247, 787, 787, 1349, 1547, 1348, 2276, 1489,
+ 1547, 1343, 1547, 1486, 787, 2214, 2298, 1547, 787, 2246,
+ 1550, 1547, 2415, 1550, 2427, 2246, 1489, 1333, 1496, 1550,
+ 2415, 1489, 2427, 1550, 1331, 1550, 1326, 1547, 2245, 1551,
+ 1550, 787, 1551, 2278, 1550, 1496, 2385, 787, 1551, 2385,
+ 1325, 1550, 1551, 2245, 1551, 787, 2295, 2385, 2278, 1551,
+ 2276, 2247, 2298, 1551, 787, 2385, 1551, 2247, 787, 1324,
+
+ 787, 792, 792, 2276, 792, 792, 792, 792, 792, 1323,
+ 792, 2298, 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792, 2295, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 2295, 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792, 1322, 792,
+ 1321, 792, 792, 798, 1552, 1318, 798, 1552, 798, 798,
+ 798, 798, 798, 1552, 798, 798, 798, 1552, 798, 1552,
+
+ 798, 798, 798, 2429, 1552, 798, 1314, 798, 1552, 798,
+ 798, 2429, 2422, 1308, 1498, 2422, 1498, 1498, 1305, 1292,
+ 2436, 1554, 1931, 2422, 1554, 1498, 1931, 1552, 2436, 1286,
+ 1554, 1931, 1274, 798, 1554, 798, 1554, 1498, 1931, 1931,
+ 1520, 1554, 1520, 1520, 1501, 1554, 1501, 1501, 1273, 1554,
+ 798, 1520, 1272, 1270, 1269, 1501, 2297, 1268, 2443, 1265,
+ 798, 798, 798, 798, 798, 799, 2443, 1501, 799, 1498,
+ 799, 799, 799, 799, 799, 1264, 799, 799, 799, 1251,
+ 799, 2090, 799, 799, 799, 1553, 1498, 799, 1553, 799,
+ 2090, 799, 799, 2426, 1553, 1520, 2426, 1250, 1553, 1501,
+
+ 1553, 2090, 2090, 2090, 2426, 1553, 2297, 1249, 1514, 1553,
+ 1514, 1514, 1520, 1553, 1697, 799, 1501, 799, 2320, 1514,
+ 1248, 2297, 1604, 1697, 1604, 1604, 1515, 1553, 1515, 1515,
+ 2445, 1514, 799, 1604, 1697, 1697, 1697, 1515, 2445, 1241,
+ 1239, 1238, 799, 799, 799, 799, 799, 803, 803, 1515,
+ 803, 803, 803, 803, 803, 803, 803, 803, 803, 803,
+ 803, 1237, 803, 1514, 803, 803, 803, 2447, 2320, 803,
+ 803, 803, 1236, 803, 803, 2447, 1556, 1604, 1697, 1556,
+ 1514, 1515, 2449, 2320, 2274, 1556, 1235, 1233, 1232, 1556,
+ 2449, 1556, 1557, 1231, 1604, 1557, 1556, 803, 1515, 803,
+
+ 1556, 1557, 2275, 803, 1217, 1557, 2294, 1557, 1516, 2077,
+ 1516, 1516, 1557, 803, 2077, 1213, 1557, 1516, 1212, 1516,
+ 803, 2077, 2077, 2310, 803, 803, 803, 803, 803, 804,
+ 804, 1516, 804, 804, 804, 804, 804, 804, 804, 804,
+ 804, 804, 804, 2274, 804, 1844, 804, 804, 804, 2274,
+ 1844, 804, 804, 804, 1844, 804, 804, 2451, 1844, 1557,
+ 1844, 2275, 1211, 1516, 2294, 2451, 1518, 2275, 1518, 1518,
+ 2349, 2294, 1204, 1519, 2077, 1519, 1519, 1518, 1195, 804,
+ 1516, 804, 2310, 2091, 1519, 804, 1939, 1519, 2310, 1518,
+ 2349, 1939, 2091, 804, 2311, 1939, 1519, 2349, 2349, 1939,
+
+ 1844, 1939, 804, 2091, 2091, 2091, 804, 804, 804, 804,
+ 804, 805, 805, 1194, 805, 805, 805, 805, 805, 1193,
+ 805, 1518, 805, 805, 805, 805, 805, 805, 1519, 805,
+ 805, 1555, 805, 805, 1555, 805, 805, 805, 1518, 1192,
+ 1555, 1191, 2091, 1190, 1555, 1519, 1555, 1522, 1189, 1522,
+ 1522, 1555, 2351, 2311, 1524, 1555, 1524, 1524, 1522, 2311,
+ 805, 1188, 805, 805, 1186, 1524, 1559, 805, 2299, 1559,
+ 1522, 1185, 2351, 1184, 1555, 1559, 1183, 1524, 805, 1559,
+ 2351, 1559, 1169, 1168, 805, 1615, 1559, 1615, 1615, 805,
+ 1559, 805, 806, 806, 1167, 806, 806, 806, 806, 806,
+
+ 1166, 806, 1522, 806, 806, 806, 806, 806, 806, 1524,
+ 806, 806, 1561, 806, 806, 1561, 806, 806, 806, 1522,
+ 2299, 1561, 1559, 1158, 1154, 1561, 1524, 1561, 1525, 1153,
+ 1525, 1525, 1561, 2299, 1152, 2282, 1561, 2282, 2282, 1525,
+ 1615, 806, 2282, 806, 806, 2453, 1151, 2284, 806, 2284,
+ 2284, 1525, 1525, 2453, 2284, 2455, 2312, 1615, 1527, 806,
+ 1527, 1527, 1150, 2455, 1605, 806, 1605, 1605, 1148, 1527,
+ 806, 1561, 806, 807, 807, 1605, 807, 807, 807, 807,
+ 807, 1527, 807, 1525, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 1147, 807, 807, 807, 807, 807, 807,
+
+ 1525, 1942, 1146, 1145, 1143, 1141, 1942, 2352, 2312, 1528,
+ 1942, 1528, 1528, 1527, 1942, 2069, 1942, 2069, 2069, 1605,
+ 1528, 2312, 807, 1531, 807, 807, 2069, 2352, 1531, 807,
+ 1527, 1531, 1528, 1531, 1531, 2352, 1605, 1531, 1130, 1531,
+ 1121, 2069, 2313, 1531, 2478, 1607, 807, 1607, 1607, 1120,
+ 1116, 807, 2478, 807, 808, 808, 1607, 808, 808, 808,
+ 808, 808, 1113, 808, 1528, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 1904, 808, 808, 808, 808, 808,
+ 808, 1528, 1112, 1904, 1110, 1531, 1528, 1108, 2313, 1101,
+ 1532, 1094, 1532, 1532, 1904, 1904, 1904, 1531, 1092, 1558,
+
+ 1607, 1532, 1558, 808, 1532, 808, 808, 2313, 1558, 2321,
+ 808, 2323, 1558, 1532, 1558, 1090, 1532, 1607, 1089, 1558,
+ 1088, 808, 2484, 1558, 1087, 1904, 1618, 808, 1618, 1618,
+ 2484, 1086, 808, 1085, 808, 812, 812, 1084, 812, 812,
+ 812, 812, 812, 1083, 812, 1532, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 2321, 812, 812, 1081, 812,
+ 812, 812, 1532, 2323, 1558, 1080, 1775, 2493, 1775, 1775,
+ 1562, 1079, 1078, 1562, 2321, 2493, 2323, 1775, 1077, 1562,
+ 1775, 1618, 1074, 1562, 812, 1562, 812, 812, 1958, 1775,
+ 1562, 812, 1775, 1958, 1562, 1072, 1062, 1958, 1618, 2495,
+
+ 1061, 1958, 2302, 1958, 2302, 2302, 2497, 2495, 812, 2302,
+ 2505, 1060, 1059, 812, 2497, 812, 813, 813, 2505, 813,
+ 813, 813, 813, 813, 813, 813, 1562, 813, 813, 813,
+ 813, 813, 813, 813, 813, 813, 813, 813, 813, 1050,
+ 813, 813, 813, 1958, 813, 813, 813, 813, 813, 813,
+ 813, 813, 813, 813, 813, 813, 813, 813, 813, 813,
+ 813, 813, 813, 813, 813, 813, 1049, 813, 813, 813,
+ 813, 813, 813, 813, 813, 813, 813, 813, 813, 813,
+ 813, 813, 813, 813, 813, 813, 813, 813, 813, 813,
+ 813, 813, 813, 2324, 813, 1048, 813, 813, 814, 814,
+
+ 2514, 814, 814, 814, 814, 814, 1047, 814, 2514, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814, 1563, 814,
+ 814, 1563, 814, 814, 814, 1046, 1045, 1563, 1044, 2520,
+ 2520, 1563, 2520, 1563, 1879, 1043, 1879, 1879, 1563, 2324,
+ 2520, 2165, 1563, 2165, 2165, 1879, 2222, 814, 2165, 814,
+ 814, 2222, 2165, 1564, 814, 2222, 1564, 1042, 2324, 2222,
+ 1879, 2222, 1564, 1041, 2526, 814, 1564, 1040, 1564, 1039,
+ 1038, 814, 2526, 1564, 1037, 1563, 814, 1564, 814, 819,
+ 819, 1036, 819, 819, 819, 819, 819, 1879, 819, 2165,
+ 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+
+ 819, 819, 819, 819, 819, 819, 1564, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819, 819, 1031,
+ 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 1007, 819, 1006, 819,
+ 819, 853, 1560, 1004, 853, 1560, 853, 853, 853, 853,
+ 853, 1560, 853, 853, 853, 1560, 853, 1560, 853, 853,
+ 853, 1567, 1560, 853, 1567, 853, 1560, 853, 853, 2350,
+ 1567, 2506, 2364, 2350, 1567, 1677, 1567, 1002, 1677, 2506,
+
+ 2356, 1567, 2365, 2356, 1677, 1567, 998, 2506, 1677, 2350,
+ 1677, 853, 2364, 853, 2356, 1677, 2527, 2350, 2405, 1677,
+ 2364, 2405, 2365, 2356, 2527, 2542, 1677, 1560, 2546, 2405,
+ 2365, 2356, 997, 2542, 996, 1567, 2546, 2405, 853, 853,
+ 853, 853, 853, 856, 856, 993, 856, 856, 856, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+ 856, 856, 856, 856, 856, 858, 858, 988, 858, 858,
+ 858, 858, 858, 858, 858, 858, 858, 858, 858, 858,
+ 858, 858, 858, 858, 858, 858, 858, 858, 858, 858,
+ 858, 858, 858, 858, 858, 858, 858, 858, 858, 858,
+ 858, 858, 858, 858, 858, 858, 858, 858, 858, 858,
+ 858, 858, 858, 858, 858, 858, 858, 858, 858, 858,
+ 858, 858, 858, 858, 858, 858, 858, 858, 858, 858,
+ 858, 858, 858, 858, 858, 858, 858, 858, 858, 858,
+
+ 858, 858, 858, 858, 858, 858, 858, 860, 860, 975,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860, 860, 861,
+ 861, 971, 861, 861, 861, 861, 861, 861, 861, 861,
+
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 899, 970, 899, 899, 899, 899, 899, 899, 2369,
+ 2366, 899, 899, 899, 899, 899, 899, 899, 899, 968,
+ 899, 2366, 899, 899, 1521, 967, 1521, 1521, 965, 2369,
+
+ 2366, 1610, 964, 1610, 1610, 1521, 2370, 2369, 2366, 961,
+ 1521, 1903, 1610, 1533, 1610, 1533, 1533, 1521, 1521, 1588,
+ 1903, 1588, 1588, 960, 1533, 959, 2370, 2548, 957, 1533,
+ 1588, 1903, 1903, 1903, 2370, 2548, 1533, 1533, 956, 1533,
+ 955, 941, 1588, 899, 940, 939, 899, 899, 900, 1521,
+ 900, 900, 900, 900, 900, 900, 1610, 938, 900, 900,
+ 900, 900, 900, 900, 900, 900, 1521, 900, 1533, 900,
+ 900, 937, 936, 1610, 1588, 934, 2571, 2011, 1903, 1523,
+ 1565, 1523, 1523, 1565, 2571, 1533, 2011, 2012, 926, 1565,
+ 1523, 1588, 925, 1565, 922, 1565, 2012, 2011, 2011, 2011,
+
+ 1565, 1523, 1523, 1523, 1565, 2513, 2513, 2012, 2012, 2012,
+ 900, 921, 1623, 2513, 1623, 1623, 920, 919, 2577, 1623,
+ 900, 2513, 918, 900, 900, 901, 2577, 901, 901, 901,
+ 901, 901, 901, 1523, 1523, 901, 901, 901, 901, 901,
+ 917, 901, 901, 2393, 901, 2011, 901, 901, 1565, 1959,
+ 1589, 1523, 1589, 1589, 1959, 2012, 916, 1566, 1959, 2397,
+ 1566, 1589, 1959, 2393, 1959, 1568, 1566, 1623, 1568, 915,
+ 1566, 2393, 1566, 1589, 1568, 2512, 914, 1566, 1568, 2397,
+ 1568, 1566, 913, 2512, 1623, 1568, 2512, 2397, 2581, 1568,
+ 2398, 2512, 1592, 911, 1592, 1592, 2581, 901, 2590, 2512,
+
+ 901, 901, 902, 1592, 1959, 1589, 2590, 902, 2401, 902,
+ 2398, 1566, 906, 902, 902, 1592, 902, 902, 2398, 902,
+ 902, 902, 1589, 902, 1566, 902, 902, 905, 2401, 902,
+ 2402, 2593, 1593, 1568, 1593, 1593, 2401, 904, 1583, 2593,
+ 1583, 1583, 1590, 1593, 1590, 1590, 1593, 1592, 2594, 1583,
+ 2402, 1590, 902, 1590, 902, 1593, 2594, 883, 2402, 879,
+ 1583, 1583, 1583, 878, 1592, 1590, 1970, 1595, 874, 1595,
+ 1595, 1970, 868, 864, 2070, 1970, 2070, 2070, 1595, 1970,
+ 902, 1970, 902, 902, 903, 2070, 2596, 1593, 863, 903,
+ 1595, 903, 1583, 1583, 2596, 903, 903, 1590, 903, 903,
+
+ 2070, 903, 903, 903, 1593, 903, 857, 903, 903, 850,
+ 1583, 903, 849, 2300, 1590, 2300, 2300, 2419, 843, 2419,
+ 2300, 1777, 1595, 1777, 1777, 2419, 2409, 1594, 2414, 1594,
+ 1594, 842, 1777, 2419, 903, 2070, 903, 1970, 1594, 1595,
+ 841, 2608, 1651, 1594, 1651, 1651, 2409, 1777, 2414, 2608,
+ 1594, 1594, 840, 1651, 2409, 903, 2414, 1653, 839, 1653,
+ 1653, 2300, 903, 837, 903, 903, 924, 836, 1653, 924,
+ 834, 924, 924, 924, 924, 924, 924, 924, 924, 924,
+ 924, 924, 1594, 833, 924, 924, 1777, 924, 924, 924,
+ 924, 924, 924, 924, 831, 2610, 830, 1651, 1596, 1594,
+
+ 1596, 1596, 1597, 2610, 1597, 1597, 2416, 2517, 1598, 1596,
+ 1598, 1598, 1653, 1597, 1651, 924, 924, 924, 924, 1598,
+ 1596, 1596, 2446, 827, 2446, 1597, 2416, 2517, 2612, 1653,
+ 2446, 1598, 1598, 2613, 2416, 2517, 2612, 1600, 2446, 1600,
+ 1600, 2613, 826, 924, 924, 924, 924, 929, 1600, 929,
+ 929, 825, 1675, 1596, 929, 1675, 929, 1597, 929, 929,
+ 1600, 1675, 823, 1598, 822, 1675, 818, 1675, 815, 929,
+ 1596, 809, 1675, 929, 1597, 1672, 1675, 1672, 1672, 1655,
+ 1598, 1655, 1655, 796, 1603, 2615, 1603, 1603, 1611, 794,
+ 1611, 1611, 1600, 2615, 782, 1603, 929, 1675, 1699, 1611,
+
+ 1699, 1699, 929, 1655, 2430, 781, 2454, 1603, 2454, 1600,
+ 1663, 1611, 1663, 1663, 2454, 778, 929, 777, 776, 929,
+ 775, 1663, 2454, 929, 2430, 929, 930, 774, 930, 930,
+ 1672, 2430, 2430, 930, 1655, 930, 1663, 930, 930, 1603,
+ 773, 2632, 2496, 1611, 2496, 772, 771, 1672, 930, 2632,
+ 2496, 1655, 930, 1699, 1676, 770, 1603, 1676, 2496, 769,
+ 1611, 1603, 2372, 1676, 2372, 1663, 766, 1676, 2372, 1676,
+ 1699, 759, 758, 757, 1676, 930, 755, 1678, 1676, 930,
+ 1678, 930, 1663, 2634, 2470, 2647, 1678, 2470, 2372, 751,
+ 1678, 2634, 1678, 2647, 738, 2470, 2372, 1678, 930, 1676,
+
+ 724, 1678, 930, 2470, 930, 933, 933, 722, 933, 933,
+ 933, 933, 933, 721, 933, 1678, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 717, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 716, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 709, 933, 708, 933, 933, 942, 1680, 707,
+ 942, 1680, 942, 942, 942, 942, 942, 1680, 942, 942,
+
+ 942, 1680, 942, 1680, 942, 942, 942, 695, 1680, 942,
+ 1956, 942, 1680, 942, 942, 1956, 2655, 694, 1635, 1956,
+ 1635, 1635, 691, 1956, 2655, 1956, 1680, 2116, 1703, 1635,
+ 1703, 1703, 2116, 2650, 2508, 2650, 2116, 942, 686, 942,
+ 2116, 1635, 2116, 2650, 1654, 679, 1654, 1654, 1636, 2592,
+ 1636, 1636, 2592, 942, 2508, 1654, 678, 1654, 1956, 1636,
+ 2592, 2508, 2508, 677, 942, 942, 942, 942, 942, 943,
+ 676, 1636, 943, 1635, 943, 943, 943, 943, 943, 675,
+ 943, 943, 943, 1703, 943, 674, 943, 943, 943, 1679,
+ 1635, 943, 1679, 943, 2116, 943, 943, 2490, 1679, 1654,
+
+ 1703, 2490, 1679, 1636, 1679, 673, 672, 671, 670, 1679,
+ 2490, 2654, 1639, 1679, 1639, 1639, 1654, 2490, 669, 943,
+ 1636, 943, 2152, 1639, 2654, 2490, 1700, 668, 1700, 1700,
+ 1679, 2152, 2654, 943, 667, 1639, 666, 1700, 1708, 663,
+ 1708, 1708, 2152, 2152, 2152, 2672, 943, 943, 943, 943,
+ 943, 946, 946, 2672, 946, 946, 946, 946, 946, 946,
+ 946, 946, 946, 946, 946, 662, 946, 1639, 946, 946,
+ 946, 660, 2537, 946, 946, 946, 2501, 946, 946, 2501,
+ 658, 1700, 657, 2152, 1639, 652, 644, 2501, 2296, 643,
+ 2296, 2296, 2537, 1708, 1640, 2501, 1640, 1640, 1700, 2296,
+
+ 2537, 946, 639, 946, 635, 1640, 627, 946, 1640, 626,
+ 1708, 623, 1642, 612, 1642, 1642, 2319, 1640, 2319, 2319,
+ 609, 946, 608, 1642, 946, 602, 600, 2319, 946, 946,
+ 946, 946, 946, 947, 947, 1642, 947, 947, 947, 947,
+ 947, 947, 947, 947, 947, 947, 947, 596, 947, 1640,
+ 947, 947, 947, 2531, 2531, 947, 947, 947, 595, 947,
+ 947, 2531, 1682, 594, 2296, 1682, 1640, 1642, 593, 2531,
+ 1637, 1682, 1637, 1637, 592, 1682, 2543, 1682, 591, 1637,
+ 590, 1637, 1682, 947, 1642, 947, 1682, 947, 1770, 947,
+ 1770, 1770, 2319, 1637, 2515, 2674, 2543, 1707, 589, 1707,
+
+ 1707, 2515, 588, 2674, 2543, 586, 947, 583, 1707, 2515,
+ 947, 947, 947, 947, 947, 948, 948, 2515, 948, 948,
+ 948, 948, 948, 582, 948, 1637, 948, 948, 948, 948,
+ 948, 948, 1682, 948, 948, 1684, 948, 948, 1684, 948,
+ 948, 948, 1637, 1770, 1684, 1707, 2569, 580, 1684, 2569,
+ 1684, 1643, 1707, 1643, 1643, 1684, 579, 2569, 575, 1684,
+ 1770, 572, 1643, 1965, 948, 2569, 948, 948, 1965, 1707,
+ 2043, 948, 1965, 1643, 1643, 2043, 1965, 571, 1965, 2043,
+ 569, 948, 568, 2043, 562, 2043, 561, 1727, 948, 1727,
+ 1727, 555, 1684, 948, 1727, 948, 949, 949, 1727, 949,
+
+ 949, 949, 949, 949, 540, 949, 1643, 949, 949, 949,
+ 949, 949, 949, 525, 949, 949, 1685, 949, 949, 1685,
+ 949, 949, 949, 1643, 523, 1685, 522, 1965, 521, 1685,
+ 516, 1685, 1644, 2043, 1644, 1644, 1685, 512, 2556, 511,
+ 1685, 1789, 1727, 1644, 1789, 949, 510, 949, 949, 2686,
+ 1789, 505, 949, 503, 1789, 1644, 1789, 2686, 2556, 1727,
+ 949, 1789, 2689, 2696, 499, 1789, 2556, 2697, 497, 949,
+ 2689, 2696, 1789, 496, 949, 2697, 949, 950, 950, 1685,
+ 950, 950, 950, 950, 950, 494, 950, 1644, 950, 950,
+ 950, 950, 950, 950, 950, 950, 950, 950, 950, 950,
+
+ 950, 950, 950, 950, 1644, 950, 950, 950, 950, 950,
+ 950, 950, 950, 950, 950, 950, 950, 950, 950, 950,
+ 950, 950, 950, 950, 950, 950, 950, 491, 950, 950,
+ 950, 950, 950, 950, 950, 950, 950, 950, 950, 950,
+ 950, 950, 950, 950, 950, 950, 950, 950, 950, 950,
+ 950, 950, 950, 950, 489, 950, 482, 950, 950, 952,
+ 952, 2719, 952, 952, 952, 952, 952, 472, 952, 2719,
+ 952, 952, 952, 952, 952, 952, 952, 952, 952, 952,
+ 952, 952, 469, 952, 952, 952, 465, 952, 952, 952,
+ 952, 952, 952, 952, 952, 952, 952, 952, 952, 952,
+
+ 952, 952, 952, 952, 952, 952, 952, 952, 952, 464,
+ 952, 952, 952, 952, 952, 952, 952, 952, 952, 952,
+ 952, 952, 952, 952, 952, 952, 952, 952, 952, 952,
+ 952, 952, 952, 952, 952, 952, 462, 952, 461, 952,
+ 952, 954, 954, 2720, 954, 954, 954, 954, 954, 460,
+ 954, 2720, 954, 954, 954, 954, 954, 954, 954, 954,
+ 954, 954, 954, 954, 954, 954, 954, 954, 459, 954,
+ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
+ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
+ 954, 458, 954, 954, 954, 954, 954, 954, 954, 954,
+
+ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
+ 954, 954, 954, 954, 954, 954, 954, 954, 457, 954,
+ 456, 954, 954, 984, 984, 454, 984, 984, 984, 984,
+ 984, 984, 984, 984, 984, 984, 984, 984, 984, 984,
+ 984, 984, 984, 984, 984, 984, 984, 984, 984, 984,
+ 984, 984, 984, 984, 984, 984, 984, 984, 984, 984,
+ 984, 984, 984, 984, 984, 984, 984, 984, 984, 984,
+ 984, 984, 984, 984, 984, 984, 984, 984, 984, 984,
+ 984, 984, 984, 984, 984, 984, 984, 984, 984, 984,
+ 984, 984, 984, 984, 984, 984, 984, 984, 984, 984,
+
+ 984, 984, 984, 984, 984, 985, 985, 452, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 986, 986, 445,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 987,
+ 442, 2729, 987, 436, 987, 987, 987, 987, 987, 2729,
+ 987, 987, 987, 2456, 987, 2456, 987, 987, 987, 2456,
+ 432, 987, 987, 987, 987, 987, 987, 2736, 2045, 1776,
+
+ 2580, 1776, 1776, 2045, 431, 2736, 430, 2045, 2580, 2456,
+ 1776, 2045, 2574, 2045, 2597, 1776, 2580, 2456, 987, 987,
+ 987, 987, 1776, 1776, 987, 1776, 2418, 2742, 2418, 2418,
+ 2760, 2761, 2574, 424, 2597, 2742, 2418, 2770, 2760, 2761,
+ 2574, 2597, 2597, 422, 2418, 2770, 987, 987, 987, 987,
+ 987, 990, 990, 2045, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 990, 990, 990, 990, 990, 990, 990,
+ 990, 990, 990, 1024, 2778, 1024, 1024, 1024, 1024, 1024,
+ 1024, 414, 2778, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
+ 1024, 2792, 1024, 399, 1024, 1024, 2793, 390, 2444, 2792,
+ 2444, 2444, 2118, 1641, 2793, 1641, 1641, 2118, 2444, 2631,
+ 1645, 2118, 1645, 1645, 1641, 2118, 2444, 2118, 384, 1641,
+ 382, 1645, 1804, 380, 1804, 1804, 1641, 1641, 1647, 2631,
+ 1647, 1647, 2800, 1645, 1645, 2649, 2649, 2631, 2649, 1647,
+
+ 2800, 1807, 378, 1807, 1807, 1024, 2649, 376, 1024, 1024,
+ 1025, 1647, 1025, 1025, 1025, 1025, 1025, 1025, 1641, 374,
+ 1025, 1025, 1025, 1025, 1025, 1645, 1025, 1025, 1025, 1025,
+ 2118, 1025, 1025, 2829, 372, 1641, 2519, 1804, 2519, 370,
+ 369, 2829, 1645, 1647, 2519, 366, 2681, 1650, 365, 1650,
+ 1650, 354, 2519, 2702, 1804, 2702, 1807, 351, 1650, 345,
+ 1647, 1656, 341, 1656, 1656, 1659, 2681, 1659, 1659, 339,
+ 1650, 2702, 1656, 1807, 2681, 1814, 1659, 1814, 1814, 2702,
+ 2702, 338, 1025, 333, 1656, 1025, 1025, 1026, 1659, 1026,
+ 1026, 1026, 1026, 1026, 1026, 328, 318, 1026, 1026, 1026,
+
+ 1026, 1026, 1650, 1026, 1026, 1026, 1026, 304, 1026, 1026,
+ 298, 296, 1683, 2121, 295, 1683, 1656, 294, 2121, 1650,
+ 1659, 1683, 2121, 1814, 1650, 1683, 2121, 1683, 2121, 292,
+ 1814, 1686, 1683, 1656, 1686, 289, 1683, 1659, 287, 2452,
+ 1686, 2452, 2452, 2117, 1686, 2639, 1686, 1814, 2117, 2452,
+ 1026, 1686, 2117, 280, 278, 1686, 2117, 2452, 2117, 1026,
+ 277, 2121, 1026, 1026, 1027, 2639, 1027, 1027, 1027, 1027,
+ 1027, 1027, 2639, 2639, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1683, 1027, 276, 1027, 1027, 1687, 2698, 2698,
+ 1687, 2698, 274, 272, 2117, 270, 1687, 1686, 265, 2698,
+
+ 1687, 1695, 1687, 1695, 1695, 1966, 1701, 1687, 1701, 1701,
+ 1966, 1687, 1695, 263, 1966, 254, 252, 1701, 1966, 1721,
+ 1966, 1721, 1721, 1695, 1695, 1695, 1721, 248, 246, 1701,
+ 1721, 239, 1861, 231, 1861, 1861, 1027, 230, 229, 1027,
+ 1027, 1028, 1721, 1028, 1028, 1028, 1028, 1028, 1028, 220,
+ 1687, 1028, 1028, 1028, 1028, 1028, 1695, 1028, 1028, 218,
+ 1028, 1701, 1028, 1028, 2559, 217, 1969, 2223, 2559, 1966,
+ 211, 1969, 2223, 1695, 1721, 1969, 2223, 2559, 1701, 1969,
+ 2223, 1969, 2223, 1722, 2559, 1722, 1722, 1861, 209, 180,
+ 1722, 1721, 2559, 2539, 1722, 2539, 1723, 176, 1723, 1723,
+
+ 172, 2539, 168, 1723, 1861, 1723, 1722, 1723, 164, 2539,
+ 160, 155, 154, 1028, 150, 147, 1028, 1028, 1029, 1723,
+ 1029, 1029, 1029, 1029, 1029, 1029, 2223, 1969, 1029, 1029,
+ 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1722, 1029,
+ 1029, 2572, 2572, 1725, 130, 1725, 1725, 129, 119, 2572,
+ 1725, 1723, 118, 117, 1725, 1722, 1726, 2572, 1726, 1726,
+ 112, 106, 1728, 1726, 1728, 1728, 1725, 1726, 1723, 1728,
+ 1726, 103, 85, 1728, 1847, 84, 1847, 1847, 1728, 1726,
+ 1729, 1847, 1729, 1729, 80, 1728, 1728, 1729, 2586, 2586,
+ 1029, 1729, 79, 1029, 1029, 1030, 2586, 78, 1725, 67,
+
+ 1030, 0, 1030, 1729, 2586, 0, 1030, 1030, 0, 1030,
+ 1030, 1726, 1030, 1030, 1030, 1725, 1030, 1728, 1030, 1030,
+ 0, 0, 1030, 1865, 0, 1865, 1865, 0, 1726, 1847,
+ 1731, 0, 1731, 1731, 1728, 1729, 0, 1731, 0, 0,
+ 0, 1731, 0, 0, 0, 1030, 1847, 1030, 2279, 0,
+ 2279, 2279, 1729, 1731, 0, 2279, 0, 0, 1732, 2279,
+ 1732, 1732, 1030, 0, 1870, 1732, 1870, 1870, 0, 1732,
+ 0, 0, 0, 1030, 0, 1030, 1030, 1053, 1865, 1053,
+ 1053, 1732, 1732, 0, 1053, 1731, 1053, 0, 1053, 1053,
+ 1759, 1792, 1759, 1759, 1792, 1865, 2279, 0, 0, 1053,
+
+ 1792, 1759, 1731, 1053, 1792, 1734, 1792, 1734, 1734, 0,
+ 0, 1792, 1734, 1732, 0, 1792, 1734, 0, 1735, 1870,
+ 1735, 1735, 1792, 0, 0, 1735, 1053, 2585, 1734, 1735,
+ 1732, 1743, 1053, 1743, 1743, 2585, 1870, 1788, 2585, 0,
+ 1788, 1735, 1743, 2585, 0, 1759, 1788, 1053, 0, 1053,
+ 1788, 2585, 1788, 1053, 1743, 1053, 1054, 1788, 1054, 1054,
+ 1734, 1788, 1759, 1054, 0, 1054, 0, 1054, 1054, 0,
+ 0, 0, 1788, 1735, 0, 0, 1790, 1734, 1054, 1790,
+ 0, 0, 1054, 0, 1793, 1790, 1743, 1793, 0, 1790,
+ 1735, 1790, 0, 1793, 0, 1735, 1790, 1793, 0, 1793,
+
+ 1790, 0, 0, 1743, 1793, 1054, 0, 1744, 1793, 1744,
+ 1744, 1054, 2173, 1760, 1790, 1760, 1760, 2173, 1744, 0,
+ 1745, 2173, 1745, 1745, 1760, 2173, 1054, 2173, 1054, 1745,
+ 1744, 1745, 1054, 0, 1054, 1057, 1057, 0, 1057, 1057,
+ 1057, 1057, 1057, 1745, 1057, 1793, 1057, 1057, 1057, 1057,
+ 1057, 1057, 1057, 1057, 1057, 0, 1057, 1057, 1057, 1057,
+ 1057, 1057, 1744, 0, 0, 0, 0, 0, 1760, 2488,
+ 0, 1747, 0, 1747, 1747, 1745, 0, 0, 2488, 1744,
+ 2173, 2488, 1747, 0, 1057, 1760, 1057, 1057, 0, 2488,
+ 0, 1057, 1745, 0, 1747, 0, 2494, 2488, 2494, 2494,
+
+ 0, 1750, 0, 1750, 1750, 0, 2494, 1762, 1057, 1762,
+ 1762, 0, 1750, 1057, 2494, 1057, 1058, 1058, 1762, 1058,
+ 1058, 1058, 1058, 1058, 1750, 1058, 1747, 1058, 1058, 1058,
+ 1058, 1058, 1058, 1058, 1058, 1058, 0, 1058, 1058, 1058,
+ 1058, 1058, 1058, 1747, 0, 2545, 1748, 2545, 1748, 1748,
+ 2576, 0, 2576, 2545, 0, 0, 1750, 1748, 2576, 0,
+ 1748, 2545, 1762, 0, 0, 1058, 2576, 1058, 1058, 1748,
+ 0, 0, 1058, 1750, 1765, 2588, 1765, 1765, 1058, 1762,
+ 0, 1851, 2588, 1851, 1851, 1765, 0, 1765, 1851, 1058,
+ 2588, 0, 1851, 0, 1058, 0, 1058, 1063, 2588, 0,
+
+ 1063, 1748, 1063, 1063, 1063, 1063, 1063, 0, 1063, 1063,
+ 1063, 0, 1063, 2206, 1063, 1063, 1063, 0, 1748, 1063,
+ 0, 1063, 2206, 1063, 1063, 0, 0, 0, 1749, 1765,
+ 1749, 1749, 0, 2206, 2206, 2206, 1851, 0, 0, 1749,
+ 0, 0, 0, 0, 1749, 0, 1765, 1063, 0, 1063,
+ 0, 1749, 1749, 1851, 1980, 0, 1980, 1980, 1751, 0,
+ 1751, 1751, 1813, 0, 1813, 1813, 0, 1063, 2206, 1751,
+ 0, 0, 0, 1813, 1063, 1063, 1063, 1063, 1063, 1064,
+ 1751, 1751, 1064, 1749, 1064, 1064, 1064, 1064, 1064, 0,
+ 1064, 1064, 1064, 0, 1064, 0, 1064, 1064, 1064, 1791,
+
+ 1749, 1064, 1791, 1064, 0, 1064, 1064, 0, 1791, 1980,
+ 1813, 0, 1791, 1751, 1791, 0, 0, 1813, 2518, 1791,
+ 2518, 2518, 1983, 1791, 1983, 1983, 1980, 0, 2518, 1064,
+ 1751, 1064, 0, 1064, 1813, 2538, 2518, 2538, 2538, 1791,
+ 1752, 0, 1752, 1752, 1862, 2538, 1862, 1862, 0, 0,
+ 0, 1752, 0, 2538, 0, 1862, 1064, 1064, 1064, 1064,
+ 1064, 1067, 1067, 1752, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 1067, 1067, 1067, 0, 1067, 1983, 1067, 1067,
+ 1067, 2603, 2603, 1067, 1067, 1067, 0, 1067, 1067, 2603,
+ 2544, 0, 2544, 2544, 1983, 1752, 0, 2603, 0, 1862,
+
+ 2544, 0, 0, 0, 1753, 2174, 1753, 1753, 2544, 0,
+ 2174, 1067, 1752, 1067, 2174, 1753, 1862, 1067, 2174, 0,
+ 2174, 0, 1755, 0, 1755, 1755, 0, 1753, 1753, 0,
+ 0, 0, 1067, 1755, 1067, 0, 0, 0, 1067, 1067,
+ 1067, 1067, 1067, 1068, 1068, 1755, 1068, 1068, 1068, 1068,
+ 1068, 1068, 1068, 1068, 1068, 1068, 1068, 0, 1068, 1753,
+ 1068, 1068, 1068, 2623, 2623, 1068, 1068, 1068, 0, 1068,
+ 1068, 2623, 0, 2174, 0, 0, 1753, 1755, 0, 2623,
+ 1758, 0, 1758, 1758, 0, 2616, 0, 1766, 2616, 1766,
+ 1766, 1758, 2044, 1068, 1755, 1068, 2616, 2044, 1766, 1068,
+
+ 0, 2044, 0, 1758, 2616, 2044, 1852, 2044, 1852, 1852,
+ 1766, 0, 0, 1852, 1068, 0, 1068, 1852, 0, 1852,
+ 1068, 1068, 1068, 1068, 1068, 1069, 1069, 0, 1069, 1069,
+ 1069, 1069, 1069, 0, 1069, 1758, 1069, 1069, 1069, 1069,
+ 1069, 1069, 1766, 1069, 1069, 1794, 1069, 1069, 1794, 1069,
+ 1069, 1069, 1758, 2044, 1794, 2630, 2630, 1758, 1794, 1766,
+ 1794, 1852, 2808, 2630, 2808, 1794, 0, 0, 0, 1794,
+ 1795, 2630, 0, 1795, 1069, 0, 1069, 1069, 1852, 1795,
+ 2808, 1069, 0, 1795, 1796, 1795, 0, 1796, 2808, 0,
+ 1795, 0, 0, 1796, 1795, 1069, 0, 1796, 1069, 1796,
+
+ 0, 0, 1794, 1069, 1796, 1069, 1070, 1070, 1796, 1070,
+ 1070, 1070, 1070, 1070, 0, 1070, 0, 1070, 1070, 1070,
+ 1070, 1070, 1070, 0, 1070, 1070, 1797, 1070, 1070, 1797,
+ 1070, 1070, 1070, 1795, 0, 1797, 0, 2675, 0, 1797,
+ 2675, 1797, 1863, 0, 1863, 1863, 1797, 0, 2675, 1796,
+ 1797, 0, 0, 1863, 0, 1070, 2675, 1070, 1070, 0,
+ 1070, 0, 1070, 0, 2575, 1863, 2575, 2575, 0, 2680,
+ 2680, 0, 0, 0, 2575, 0, 0, 2680, 0, 1070,
+ 0, 0, 2575, 1797, 1070, 2680, 1070, 1071, 1071, 0,
+ 1071, 1071, 1071, 1071, 1071, 0, 1071, 1863, 1071, 1071,
+
+ 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071,
+ 1071, 1071, 1071, 1071, 1863, 1071, 1071, 1071, 1071, 1071,
+ 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071,
+ 1071, 1071, 1071, 1071, 1071, 1071, 1071, 0, 1071, 1071,
+ 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071,
+ 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071,
+ 1071, 1071, 1071, 1071, 0, 1071, 0, 1071, 1071, 1073,
+ 1073, 0, 1073, 1073, 1073, 1073, 1073, 0, 1073, 0,
+ 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073,
+ 1073, 1073, 0, 1073, 1073, 1073, 0, 1073, 1073, 1073,
+
+ 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073,
+ 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 0,
+ 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073,
+ 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073,
+ 1073, 1073, 1073, 1073, 1073, 1073, 0, 1073, 0, 1073,
+ 1073, 1075, 1075, 0, 1075, 1075, 1075, 1075, 1075, 0,
+ 1075, 0, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075,
+ 1075, 0, 1075, 1075, 1075, 1075, 1075, 1075, 2591, 0,
+ 2591, 2591, 1997, 0, 1997, 1997, 2260, 1838, 2591, 1838,
+ 1838, 2260, 0, 1997, 1838, 2260, 2591, 0, 1838, 2260,
+
+ 1075, 2260, 1075, 1075, 0, 0, 0, 1075, 1997, 1838,
+ 1838, 0, 0, 0, 1869, 0, 1869, 1869, 0, 1889,
+ 0, 1889, 1889, 0, 1075, 1869, 0, 0, 0, 1075,
+ 1889, 1075, 1076, 1076, 2260, 1076, 1076, 1076, 1076, 1076,
+ 0, 1076, 1838, 1076, 1076, 1076, 1076, 1076, 1076, 1076,
+ 1076, 1076, 1997, 1076, 1076, 1076, 1076, 1076, 1076, 1838,
+ 0, 2609, 1869, 2609, 2609, 0, 0, 0, 0, 1869,
+ 0, 2609, 0, 0, 1889, 2614, 0, 2614, 2614, 2609,
+ 2820, 1076, 2820, 1076, 1076, 2614, 1869, 0, 1076, 0,
+ 0, 1889, 0, 2614, 1076, 1889, 0, 2633, 2820, 2633,
+
+ 2633, 0, 0, 0, 0, 1076, 2820, 2633, 0, 0,
+ 1076, 0, 1076, 1100, 1100, 2633, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1102, 0, 2821, 1102, 2821,
+
+ 1102, 1102, 1102, 1102, 1102, 0, 1102, 1102, 1102, 2828,
+ 1102, 2828, 1102, 1102, 1102, 2821, 0, 1102, 1102, 1102,
+ 1102, 1102, 1102, 2821, 0, 0, 1829, 2828, 1829, 1829,
+ 0, 0, 0, 1829, 0, 2828, 0, 1829, 0, 0,
+ 0, 1829, 0, 1829, 1102, 1102, 1102, 1102, 0, 1829,
+ 1846, 0, 1846, 1846, 0, 0, 0, 1846, 0, 0,
+ 1990, 1846, 1990, 1990, 0, 1846, 0, 1846, 1884, 0,
+ 1884, 1884, 1102, 1102, 1102, 1102, 1102, 1104, 0, 1884,
+ 1104, 1829, 1104, 1104, 1104, 1104, 1104, 0, 1104, 1104,
+ 1104, 1884, 1104, 0, 1104, 1104, 1104, 0, 1829, 1104,
+
+ 1104, 1104, 1104, 1104, 1104, 1846, 0, 2648, 1990, 2648,
+ 2648, 0, 0, 0, 0, 1990, 0, 2648, 0, 0,
+ 0, 2008, 1846, 1884, 2008, 2648, 1104, 1104, 1104, 1104,
+ 2008, 0, 1990, 0, 2008, 0, 2008, 0, 0, 0,
+ 1884, 2008, 0, 0, 1884, 2008, 1104, 0, 0, 0,
+ 0, 0, 0, 0, 1104, 1104, 1104, 1104, 1104, 1105,
+ 1105, 2008, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
+ 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
+ 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
+ 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
+
+ 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
+ 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
+ 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
+ 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105,
+ 1105, 1106, 1106, 0, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106,
+ 1106, 1106, 1106, 1107, 0, 0, 1107, 0, 1107, 1107,
+ 1107, 1107, 1107, 0, 1107, 1107, 1107, 0, 1107, 0,
+ 1107, 1107, 1107, 0, 0, 1107, 1107, 1107, 1107, 1107,
+ 1107, 0, 0, 1998, 0, 1998, 1998, 0, 1854, 0,
+ 1854, 1854, 0, 0, 1998, 1854, 0, 1899, 0, 1854,
+ 1899, 0, 1107, 1107, 1107, 1107, 1899, 0, 1107, 1998,
+ 1899, 1854, 1899, 1857, 2175, 1857, 1857, 1899, 0, 2175,
+ 1857, 1899, 0, 2175, 1857, 0, 0, 2175, 0, 2175,
+
+ 1107, 1107, 1107, 1107, 1107, 1133, 1857, 1133, 1133, 1133,
+ 1133, 1133, 1133, 1854, 0, 1133, 1133, 1133, 1133, 1133,
+ 1133, 1133, 1133, 1998, 1133, 0, 1133, 1133, 0, 1831,
+ 1854, 1831, 1831, 1899, 0, 0, 1831, 0, 1857, 2175,
+ 1831, 0, 0, 0, 1831, 0, 1831, 1832, 1897, 1832,
+ 1832, 1897, 1831, 0, 1832, 1857, 1832, 1897, 1832, 0,
+ 2257, 1897, 1832, 1897, 1832, 2257, 0, 1133, 1897, 2257,
+ 1832, 0, 1897, 2257, 0, 2257, 1972, 1133, 1972, 1972,
+ 1133, 1133, 1134, 1972, 1831, 1134, 1134, 0, 1134, 1134,
+ 1134, 1897, 1134, 0, 1134, 1134, 1134, 0, 1134, 1134,
+
+ 1134, 1831, 1832, 1134, 1134, 1134, 1134, 1134, 1134, 0,
+ 2668, 0, 2668, 2668, 0, 1885, 0, 1885, 1885, 1832,
+ 2668, 2257, 1834, 0, 1834, 1834, 1885, 0, 2668, 1834,
+ 1134, 1972, 1134, 1834, 0, 0, 0, 1834, 1885, 1834,
+ 1835, 0, 1835, 1835, 0, 1834, 0, 1835, 1972, 0,
+ 0, 1835, 0, 0, 1835, 1835, 0, 1835, 0, 0,
+ 1134, 1134, 1135, 1835, 1135, 1135, 1135, 1135, 1135, 1135,
+ 1885, 0, 1135, 1135, 1135, 1135, 1135, 1834, 1135, 1135,
+ 1135, 1135, 0, 1135, 1135, 0, 0, 1885, 0, 0,
+ 1896, 1885, 0, 1896, 1834, 1835, 0, 0, 2673, 1896,
+
+ 2673, 2673, 0, 1896, 1836, 1896, 1836, 1836, 2673, 0,
+ 1896, 1836, 1835, 0, 1896, 1836, 2673, 0, 0, 1836,
+ 1836, 1836, 2196, 0, 2196, 2196, 0, 1836, 1836, 0,
+ 0, 1896, 0, 2196, 1135, 0, 0, 1135, 1135, 1136,
+ 0, 1136, 1136, 1136, 1136, 1136, 1136, 0, 2196, 1136,
+ 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1836,
+ 1136, 1136, 0, 0, 2685, 0, 2685, 2685, 0, 0,
+ 1837, 0, 1837, 1837, 2685, 1898, 1836, 1837, 1898, 2196,
+ 0, 1837, 2685, 0, 1898, 1837, 0, 1837, 1898, 1839,
+ 1898, 1839, 1839, 1837, 0, 1898, 1839, 0, 0, 1898,
+
+ 1839, 0, 0, 0, 1839, 0, 1839, 0, 1898, 0,
+ 0, 1136, 1839, 0, 1136, 1136, 1137, 0, 1137, 1137,
+ 1137, 1137, 1137, 1137, 0, 1837, 1137, 1137, 1137, 1137,
+ 1137, 0, 1137, 1137, 1137, 1137, 0, 1137, 1137, 0,
+ 0, 0, 1837, 0, 1839, 0, 0, 1840, 0, 1840,
+ 1840, 0, 0, 0, 1840, 0, 0, 2140, 1840, 2140,
+ 2140, 1839, 1840, 1855, 1840, 1855, 1855, 0, 2140, 1137,
+ 1840, 1840, 0, 0, 1855, 0, 0, 0, 1886, 0,
+ 1886, 1886, 0, 2140, 0, 1855, 1855, 1886, 1137, 1886,
+ 0, 1137, 1137, 1138, 0, 1138, 1138, 1138, 1138, 1138,
+
+ 1138, 1886, 1840, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
+ 1138, 0, 1138, 0, 1138, 1138, 0, 1855, 1855, 1840,
+ 2140, 0, 0, 1842, 0, 1842, 1842, 0, 0, 1855,
+ 1842, 0, 0, 1886, 1842, 1855, 0, 0, 1842, 0,
+ 1842, 1845, 1900, 1845, 1845, 1900, 1842, 0, 1845, 0,
+ 1886, 1900, 1845, 0, 1886, 1900, 1845, 1900, 1845, 0,
+ 0, 0, 1900, 0, 1845, 1138, 1900, 0, 1138, 1138,
+ 1139, 0, 1139, 1139, 1139, 1139, 1139, 1139, 1842, 0,
+ 1139, 1139, 1139, 1139, 1139, 0, 1139, 1139, 1139, 1139,
+ 0, 1139, 1139, 0, 0, 1842, 1845, 0, 0, 0,
+
+ 0, 1856, 0, 1856, 1856, 1888, 0, 1888, 1888, 0,
+ 1900, 0, 1856, 1845, 0, 0, 1888, 0, 1845, 1888,
+ 0, 0, 0, 1856, 1856, 0, 0, 0, 1888, 0,
+ 1891, 0, 1891, 1891, 0, 0, 0, 1975, 0, 1975,
+ 1975, 1891, 1139, 0, 1975, 1139, 1139, 1140, 0, 0,
+ 0, 0, 1140, 1891, 1140, 1856, 1856, 0, 1140, 1140,
+ 1888, 1140, 1140, 0, 1140, 1140, 1140, 1856, 1140, 0,
+ 1140, 1140, 0, 1856, 1140, 0, 0, 1888, 0, 0,
+ 1890, 1888, 1890, 1890, 0, 1891, 0, 1892, 0, 1892,
+ 1892, 1890, 1975, 0, 0, 0, 1890, 1140, 1892, 1140,
+
+ 0, 0, 1891, 1890, 1890, 2038, 1891, 2038, 2038, 1975,
+ 1892, 0, 2038, 0, 0, 0, 1140, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1140, 0, 1140, 1140, 1161,
+ 1901, 1161, 1161, 1901, 0, 1890, 1161, 0, 1161, 1901,
+ 1161, 1161, 1892, 1901, 0, 1901, 0, 0, 0, 0,
+ 1901, 1161, 1890, 0, 1901, 1161, 1890, 0, 0, 1892,
+ 2038, 0, 0, 1892, 0, 0, 0, 0, 1933, 0,
+ 1933, 1933, 1978, 2009, 1978, 1978, 2009, 2038, 1161, 1933,
+ 0, 0, 2009, 1978, 1161, 0, 2009, 0, 2009, 1901,
+ 1933, 1933, 0, 2009, 1978, 1978, 2042, 2009, 2042, 2042,
+
+ 0, 1161, 0, 2042, 0, 1161, 0, 1161, 1162, 2286,
+ 1162, 1162, 0, 0, 2286, 1162, 0, 1162, 2286, 1162,
+ 1162, 0, 2286, 1933, 2286, 0, 1978, 1978, 0, 0,
+ 1162, 0, 0, 0, 1162, 0, 0, 1978, 2009, 0,
+ 1933, 0, 0, 0, 1978, 0, 0, 0, 0, 0,
+ 0, 2042, 0, 0, 0, 0, 0, 1162, 0, 0,
+ 0, 0, 0, 1162, 2286, 0, 0, 0, 2042, 1162,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1162, 0, 0, 0, 1162, 0, 1162, 1165, 1165, 0,
+ 1165, 1165, 1165, 1165, 1165, 0, 1165, 0, 1165, 1165,
+
+ 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
+ 1165, 1165, 1165, 1165, 0, 1165, 1165, 1165, 1165, 1165,
+ 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
+ 1165, 1165, 1165, 1165, 1165, 1165, 1165, 0, 1165, 1165,
+ 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
+ 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
+ 1165, 1165, 1165, 1165, 0, 1165, 0, 1165, 1165, 1170,
+ 0, 0, 1170, 0, 1170, 1170, 1170, 1170, 1170, 0,
+ 1170, 1170, 1170, 0, 1170, 0, 1170, 1170, 1170, 0,
+ 0, 1170, 0, 1170, 0, 1170, 1170, 0, 0, 0,
+
+ 1944, 0, 1944, 1944, 0, 0, 0, 1944, 0, 0,
+ 2150, 1944, 2150, 2150, 0, 1944, 0, 1944, 0, 1170,
+ 0, 1170, 0, 1944, 1961, 0, 1961, 1961, 0, 0,
+ 2047, 1961, 2047, 2047, 0, 1961, 0, 2047, 0, 1961,
+ 1170, 1961, 1989, 0, 1989, 1989, 1170, 1170, 1170, 1170,
+ 1170, 1171, 0, 1989, 1171, 1944, 1171, 1171, 1171, 1171,
+ 1171, 0, 1171, 1171, 1171, 2150, 1171, 0, 1171, 1171,
+ 1171, 0, 1944, 1171, 0, 1171, 0, 1171, 1171, 1961,
+ 0, 0, 2150, 0, 0, 2047, 0, 0, 0, 0,
+ 1989, 0, 2109, 0, 2109, 2109, 1961, 1989, 0, 2109,
+
+ 0, 1171, 2047, 1171, 0, 0, 1962, 0, 1962, 1962,
+ 0, 0, 0, 1962, 1989, 0, 0, 1962, 0, 0,
+ 0, 1962, 1171, 1962, 2004, 0, 2004, 2004, 1171, 1171,
+ 1171, 1171, 1171, 1174, 1174, 2004, 1174, 1174, 1174, 1174,
+ 1174, 1174, 1174, 1174, 1174, 1174, 1174, 2109, 1174, 0,
+ 1174, 1174, 1174, 0, 0, 1174, 1174, 1174, 0, 1174,
+ 1174, 1962, 0, 0, 2109, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2110, 0, 2110, 2110, 1962, 2004,
+ 0, 2110, 0, 1174, 0, 1174, 0, 0, 1964, 1174,
+ 1964, 1964, 0, 0, 0, 1964, 2004, 0, 0, 1964,
+
+ 2004, 0, 0, 1964, 0, 1964, 1174, 0, 0, 0,
+ 1174, 1174, 1174, 1174, 1174, 1175, 1175, 0, 1175, 1175,
+ 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 2110,
+ 1175, 0, 1175, 1175, 1175, 0, 0, 1175, 1175, 1175,
+ 0, 1175, 1175, 1964, 0, 0, 2110, 0, 0, 0,
+ 0, 0, 2081, 0, 2081, 2081, 0, 0, 0, 1946,
+ 1964, 1946, 1946, 2081, 0, 1175, 1946, 1175, 0, 0,
+ 1946, 1175, 0, 0, 1946, 0, 1946, 1175, 2019, 0,
+ 2019, 2019, 1946, 0, 2098, 0, 2098, 2098, 1175, 2019,
+ 0, 0, 1175, 1175, 1175, 1175, 1175, 1176, 1176, 0,
+
+ 1176, 1176, 1176, 1176, 1176, 0, 1176, 2081, 1176, 1176,
+ 1176, 1176, 1176, 1176, 1946, 1176, 1176, 0, 1176, 1176,
+ 0, 1176, 1176, 1176, 2081, 0, 2019, 0, 2081, 0,
+ 0, 1946, 2098, 2019, 0, 0, 0, 0, 0, 2098,
+ 1949, 0, 1949, 1949, 0, 0, 1176, 1949, 1176, 1176,
+ 2019, 1949, 0, 1176, 0, 1949, 2098, 1949, 0, 0,
+ 0, 0, 0, 1949, 0, 0, 0, 0, 1176, 2033,
+ 1176, 2033, 2033, 0, 0, 1176, 2033, 1176, 1177, 1177,
+ 2033, 1177, 1177, 1177, 1177, 1177, 0, 1177, 0, 1177,
+ 1177, 1177, 1177, 1177, 1177, 1949, 1177, 1177, 0, 1177,
+
+ 1177, 0, 1177, 1177, 1177, 0, 0, 0, 0, 0,
+ 0, 0, 1949, 0, 2039, 0, 2039, 2039, 0, 0,
+ 0, 2039, 0, 0, 2033, 2039, 0, 1177, 0, 1177,
+ 1177, 0, 0, 1967, 1177, 1967, 1967, 0, 0, 0,
+ 1967, 2033, 0, 0, 1967, 0, 1967, 0, 1967, 1177,
+ 1967, 1177, 0, 0, 0, 0, 1177, 0, 1177, 1178,
+ 1178, 0, 1178, 1178, 1178, 1178, 1178, 0, 1178, 2039,
+ 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 0,
+ 1178, 1178, 1178, 1178, 1178, 1178, 2039, 0, 1967, 0,
+ 0, 0, 0, 0, 0, 2113, 0, 2113, 2113, 0,
+
+ 0, 0, 2113, 0, 0, 1967, 0, 0, 1178, 0,
+ 1178, 1178, 0, 0, 2160, 1178, 2160, 2160, 2207, 0,
+ 2207, 2207, 2097, 0, 2097, 2097, 0, 2120, 0, 2120,
+ 2120, 0, 1178, 2097, 2120, 0, 0, 1178, 0, 1178,
+ 1179, 1179, 0, 1179, 1179, 1179, 1179, 1179, 0, 1179,
+ 2113, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 0, 1179, 1179, 1179, 1179, 1179, 1179, 2113, 0, 2160,
+ 2097, 0, 0, 2207, 0, 2120, 2142, 2097, 2142, 2142,
+ 0, 0, 2120, 0, 0, 0, 2160, 2142, 0, 1179,
+ 2207, 1179, 1179, 0, 2097, 2209, 1179, 2209, 2209, 2120,
+
+ 0, 0, 1179, 2136, 0, 2136, 2136, 0, 2159, 0,
+ 2159, 2159, 0, 1179, 2136, 0, 0, 0, 1179, 2159,
+ 1179, 1180, 1180, 0, 1180, 1180, 1180, 1180, 1180, 0,
+ 1180, 2142, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180,
+ 1180, 0, 1180, 1180, 0, 1180, 1180, 1180, 2142, 0,
+ 2209, 2136, 2142, 0, 0, 0, 0, 2166, 2136, 2166,
+ 2166, 0, 0, 2159, 2166, 0, 0, 2209, 0, 0,
+ 1180, 0, 1180, 1180, 0, 2136, 2238, 1180, 2238, 2238,
+ 2159, 0, 0, 0, 2190, 0, 2190, 2190, 2191, 0,
+ 2191, 2191, 0, 0, 1180, 2190, 0, 0, 0, 1180,
+
+ 0, 1180, 1181, 1181, 0, 1181, 1181, 1181, 1181, 1181,
+ 0, 1181, 2166, 1181, 1181, 1181, 1181, 1181, 1181, 1181,
+ 1181, 1181, 0, 1181, 1181, 0, 1181, 1181, 1181, 2166,
+ 0, 2238, 2190, 0, 0, 0, 2191, 0, 2211, 2190,
+ 2211, 2211, 0, 2191, 0, 0, 0, 0, 2238, 2211,
+ 0, 1181, 0, 1181, 1181, 0, 2190, 0, 1181, 0,
+ 2191, 0, 0, 0, 1181, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1181, 0, 0, 0, 0,
+ 1181, 0, 1181, 1182, 1182, 0, 1182, 1182, 1182, 1182,
+ 1182, 0, 1182, 2211, 1182, 1182, 1182, 1182, 1182, 1182,
+
+ 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 2211, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 0, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 0, 1182, 0, 1182, 1182, 1202, 1202, 0, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1205, 0, 0,
+ 1205, 0, 1205, 1205, 1205, 1205, 1205, 0, 1205, 1205,
+ 1205, 0, 1205, 0, 1205, 1205, 1205, 0, 0, 1205,
+ 1205, 1205, 1205, 1205, 1205, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1205, 1205, 1205, 1205,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1205, 1205, 1205, 1205, 1205, 1206,
+ 1206, 0, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+ 1206, 1207, 0, 0, 1207, 0, 1207, 1207, 1207, 1207,
+ 1207, 0, 1207, 1207, 1207, 0, 1207, 0, 1207, 1207,
+ 1207, 0, 0, 1207, 1207, 1207, 1207, 1207, 1207, 0,
+ 0, 0, 1947, 0, 1947, 1947, 0, 0, 0, 1947,
+ 0, 1947, 2266, 1947, 2266, 2266, 0, 1947, 0, 1947,
+ 1207, 1207, 1207, 1207, 0, 1947, 0, 0, 2237, 0,
+ 2237, 2237, 0, 0, 0, 2198, 0, 2198, 2198, 2237,
+ 2259, 0, 2259, 2259, 0, 0, 2198, 2259, 1207, 1207,
+ 1207, 1207, 1207, 1209, 0, 0, 1209, 1947, 1209, 1209,
+
+ 1209, 1209, 1209, 0, 1209, 1209, 1209, 2266, 1209, 0,
+ 1209, 1209, 1209, 0, 1947, 1209, 1209, 1209, 1209, 1209,
+ 1209, 0, 0, 2237, 2266, 0, 0, 0, 2259, 0,
+ 2198, 0, 0, 0, 0, 2259, 0, 0, 0, 0,
+ 2237, 0, 1209, 1209, 1209, 1209, 1950, 2198, 1950, 1950,
+ 0, 2198, 2259, 1950, 0, 0, 0, 1950, 0, 0,
+ 1950, 1950, 1209, 1950, 2268, 0, 2268, 2268, 0, 1950,
+ 1209, 1209, 1209, 1209, 1209, 1223, 0, 1223, 1223, 1223,
+ 1223, 1223, 1223, 0, 0, 1223, 1223, 1223, 1223, 1223,
+ 1223, 1223, 1223, 0, 1223, 0, 1223, 1223, 0, 0,
+
+ 0, 1950, 0, 0, 0, 1951, 0, 1951, 1951, 0,
+ 0, 0, 1951, 0, 0, 0, 1951, 0, 1950, 2268,
+ 1951, 1951, 1951, 1952, 0, 1952, 1952, 0, 1951, 1951,
+ 1952, 0, 0, 0, 1952, 0, 2268, 0, 1952, 0,
+ 1952, 2289, 0, 2289, 2289, 0, 1952, 1223, 2289, 0,
+ 1223, 1223, 1224, 0, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1951, 0, 1224, 1224, 1224, 1224, 1224, 0, 1224, 1224,
+ 1224, 1224, 0, 1224, 1224, 0, 0, 1951, 1952, 0,
+ 0, 0, 1953, 0, 1953, 1953, 0, 0, 0, 1953,
+ 0, 0, 0, 1953, 0, 1952, 2289, 1953, 0, 1953,
+
+ 1954, 0, 1954, 1954, 1953, 1953, 0, 1954, 0, 0,
+ 0, 1954, 0, 2289, 0, 1954, 0, 1954, 0, 0,
+ 0, 0, 0, 1954, 1224, 0, 0, 1224, 1224, 1225,
+ 0, 1225, 1225, 1225, 1225, 1225, 1225, 1953, 0, 1225,
+ 1225, 1225, 1225, 1225, 0, 1225, 1225, 1225, 1225, 0,
+ 1225, 1225, 0, 0, 1953, 1954, 0, 0, 0, 0,
+ 0, 0, 1955, 0, 1955, 1955, 0, 0, 0, 1955,
+ 0, 0, 1954, 1955, 0, 0, 0, 1955, 0, 1955,
+ 1957, 0, 1957, 1957, 0, 1955, 1955, 1957, 0, 0,
+ 0, 1957, 1225, 0, 0, 1957, 0, 1957, 0, 0,
+
+ 0, 1225, 0, 1957, 1225, 1225, 1226, 0, 0, 1226,
+ 1226, 0, 1226, 1226, 1226, 0, 1226, 1955, 1226, 1226,
+ 1226, 0, 1226, 1226, 1226, 0, 0, 1226, 1226, 1226,
+ 1226, 1226, 1226, 0, 1955, 1957, 0, 0, 0, 0,
+ 1960, 0, 1960, 1960, 0, 0, 0, 1960, 0, 0,
+ 0, 1960, 1957, 0, 1226, 1960, 1226, 1960, 1968, 0,
+ 1968, 1968, 0, 1960, 0, 1968, 0, 0, 0, 1968,
+ 0, 0, 0, 1968, 0, 1968, 0, 0, 0, 0,
+ 0, 1968, 0, 0, 1226, 1226, 1228, 0, 1228, 1228,
+ 1228, 1228, 1228, 1228, 0, 1960, 1228, 1228, 1228, 1228,
+
+ 1228, 0, 1228, 1228, 1228, 1228, 0, 1228, 1228, 0,
+ 0, 0, 1960, 1968, 0, 0, 2040, 1960, 2040, 2040,
+ 0, 0, 0, 2040, 0, 0, 0, 2040, 0, 0,
+ 1968, 2040, 1979, 2040, 1979, 1979, 0, 0, 0, 2040,
+ 0, 0, 2046, 1979, 2046, 2046, 0, 0, 0, 2046,
+ 1228, 0, 0, 2046, 1979, 1979, 0, 2046, 1228, 2046,
+ 0, 1228, 1228, 1229, 0, 1229, 1229, 1229, 1229, 1229,
+ 1229, 2040, 0, 1229, 1229, 1229, 1229, 1229, 0, 1229,
+ 1229, 1229, 1229, 0, 1229, 1229, 1979, 1979, 2040, 0,
+ 2046, 0, 0, 0, 0, 1979, 0, 2046, 2119, 0,
+
+ 2119, 2119, 0, 0, 1979, 2119, 0, 0, 0, 2119,
+ 0, 0, 0, 2119, 2046, 2119, 2270, 0, 2270, 2270,
+ 0, 0, 0, 0, 0, 0, 2304, 2270, 2304, 2304,
+ 0, 0, 0, 2304, 0, 1229, 0, 0, 1229, 1229,
+ 1230, 1230, 0, 1230, 1230, 1230, 2119, 1230, 0, 1230,
+ 1230, 1230, 1230, 2119, 1230, 1230, 1230, 1230, 1230, 1230,
+ 0, 1230, 0, 1230, 1230, 1230, 0, 1230, 0, 0,
+ 2119, 2270, 0, 2054, 0, 2054, 2054, 0, 0, 0,
+ 0, 2304, 0, 2055, 2054, 2055, 2055, 0, 2270, 1230,
+ 1230, 0, 1230, 0, 2055, 2054, 2054, 2288, 2304, 2288,
+
+ 2288, 0, 0, 0, 2288, 2055, 2055, 0, 2288, 0,
+ 0, 0, 2288, 0, 2288, 0, 0, 0, 1230, 0,
+ 1230, 1230, 1245, 0, 1245, 1245, 0, 2054, 2054, 1245,
+ 0, 1245, 0, 1245, 1245, 0, 2055, 2055, 2055, 0,
+ 0, 0, 2054, 0, 1245, 2054, 0, 0, 1245, 0,
+ 0, 0, 2288, 0, 0, 2055, 2306, 0, 2306, 2306,
+ 0, 0, 0, 2306, 0, 0, 0, 0, 0, 2288,
+ 0, 1245, 0, 0, 0, 0, 0, 1245, 0, 0,
+ 0, 0, 0, 0, 0, 1245, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1245, 0, 0, 0, 1245, 0,
+
+ 1245, 1247, 1247, 0, 1247, 1247, 1247, 1247, 1247, 0,
+ 1247, 2306, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247,
+ 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 2306, 1247,
+ 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247,
+ 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247,
+ 1247, 0, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247,
+ 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247,
+ 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 0, 1247,
+ 0, 1247, 1247, 1252, 1252, 0, 1252, 1252, 1252, 1252,
+ 1252, 1252, 1252, 0, 1252, 1252, 1252, 0, 1252, 0,
+
+ 1252, 1252, 1252, 0, 0, 1252, 0, 1252, 0, 1252,
+ 1252, 0, 0, 0, 2308, 0, 2308, 2308, 0, 0,
+ 0, 2308, 0, 0, 2315, 2308, 2315, 2315, 0, 0,
+ 0, 2315, 0, 1252, 0, 1252, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2128, 0, 2128, 2128, 0, 0,
+ 0, 0, 0, 0, 0, 2128, 0, 0, 0, 0,
+ 1252, 1252, 1252, 1252, 1252, 1253, 2128, 2128, 1253, 2308,
+ 1253, 1253, 1253, 1253, 1253, 0, 1253, 1253, 1253, 2315,
+ 1253, 0, 1253, 1253, 1253, 0, 2308, 1253, 0, 1253,
+ 0, 1253, 1253, 0, 0, 0, 2315, 0, 2128, 2128,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2128, 1253, 2128, 1253, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1253, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1253, 1253, 1253, 1253, 1253, 1257, 1257, 0,
+ 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257,
+ 1257, 0, 1257, 0, 1257, 1257, 1257, 0, 0, 1257,
+ 1257, 1257, 0, 1257, 1257, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2224, 0, 2224, 2224, 0, 0, 1257, 2224, 1257,
+
+ 0, 0, 2224, 1257, 0, 0, 2224, 0, 2224, 0,
+ 0, 1257, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1257, 0, 0, 0, 1257, 1257, 1257, 1257, 1257, 1258,
+ 1258, 0, 1258, 1258, 1258, 1258, 1258, 0, 1258, 2224,
+ 1258, 1258, 1258, 1258, 1258, 1258, 2224, 1258, 1258, 0,
+ 1258, 1258, 0, 1258, 1258, 1258, 0, 0, 0, 0,
+ 0, 0, 0, 2224, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2258, 0, 2258, 2258, 0, 0, 1258, 2258,
+ 1258, 1258, 0, 2258, 0, 1258, 0, 2258, 0, 2258,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 1258, 0, 0, 0, 0, 1258, 0, 1258,
+ 1259, 1259, 0, 1259, 1259, 1259, 1259, 1259, 0, 1259,
+ 2258, 1259, 1259, 1259, 1259, 1259, 1259, 2258, 1259, 1259,
+ 0, 1259, 1259, 0, 1259, 1259, 1259, 0, 0, 0,
+ 0, 0, 0, 0, 2258, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1259,
+ 0, 1259, 1259, 0, 0, 0, 1259, 0, 0, 0,
+ 0, 0, 1259, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1259, 0, 0, 0, 0, 1259, 0,
+ 1259, 1260, 1260, 0, 1260, 1260, 1260, 1260, 1260, 0,
+
+ 1260, 0, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 0, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 0, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 0, 1260,
+ 0, 1260, 1260, 1261, 1261, 0, 1261, 1261, 1261, 1261,
+ 1261, 0, 1261, 0, 1261, 1261, 1261, 1261, 1261, 1261,
+ 1261, 1261, 1261, 1261, 1261, 1261, 0, 1261, 1261, 1261,
+
+ 0, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261,
+ 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261,
+ 1261, 1261, 1261, 0, 1261, 1261, 1261, 1261, 1261, 1261,
+ 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261,
+ 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261,
+ 0, 1261, 0, 1261, 1261, 1262, 1262, 0, 1262, 1262,
+ 1262, 1262, 1262, 0, 1262, 0, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 0, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+
+ 1262, 1262, 1262, 1262, 1262, 0, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 0, 1262, 0, 1262, 1262, 1278, 0, 1278,
+ 1278, 1278, 0, 1278, 0, 1278, 1278, 0, 1278, 0,
+ 1278, 1278, 1278, 1278, 1278, 1278, 0, 1278, 0, 1278,
+ 1278, 1278, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1278, 0, 0, 1278, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1278, 0, 1278, 1281, 1281, 0,
+ 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
+ 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
+ 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
+ 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
+ 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
+ 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
+ 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281,
+ 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1283,
+
+ 1283, 0, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283,
+ 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283,
+ 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283,
+ 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283,
+ 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283,
+ 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283,
+ 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283,
+ 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283,
+ 1283, 1284, 0, 0, 1284, 0, 1284, 1284, 1284, 1284,
+ 1284, 0, 1284, 1284, 1284, 0, 1284, 0, 1284, 1284,
+
+ 1284, 0, 0, 1284, 1284, 1284, 1284, 1284, 1284, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2129, 0, 2129,
+ 2129, 0, 0, 0, 0, 0, 0, 0, 2129, 0,
+ 1284, 1284, 1284, 1284, 0, 0, 0, 0, 0, 2129,
+ 2129, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1284, 1284,
+ 1284, 1284, 1284, 1295, 0, 1295, 1295, 1295, 1295, 1295,
+ 1295, 2129, 2129, 1295, 1295, 1295, 1295, 1295, 0, 1295,
+ 1295, 1295, 1295, 0, 1295, 1295, 0, 2129, 0, 2129,
+ 0, 0, 0, 0, 2183, 0, 2183, 2183, 0, 0,
+
+ 0, 0, 0, 0, 0, 2183, 0, 0, 0, 2184,
+ 0, 2184, 2184, 0, 0, 0, 2183, 2183, 0, 0,
+ 2184, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2184, 2184, 0, 0, 1295, 0, 0, 1295, 1295,
+ 1297, 0, 1297, 1297, 1297, 1297, 1297, 1297, 2183, 2183,
+ 1297, 1297, 1297, 1297, 1297, 0, 1297, 1297, 1297, 1297,
+ 0, 1297, 1297, 2184, 2184, 0, 2183, 0, 0, 0,
+ 2184, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2184, 0, 0, 0, 0, 2230, 0, 2230, 2230,
+ 0, 0, 0, 1297, 0, 0, 0, 2230, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 2230, 2230,
+ 0, 0, 1297, 0, 0, 1297, 1297, 1300, 0, 1300,
+ 1300, 1300, 1300, 1300, 1300, 0, 0, 1300, 1300, 1300,
+ 1300, 1300, 0, 1300, 1300, 1300, 1300, 0, 1300, 1300,
+ 2230, 2230, 0, 0, 0, 0, 0, 0, 0, 2230,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2230, 0,
+ 0, 0, 0, 0, 0, 2265, 1300, 2265, 2265, 0,
+ 0, 0, 0, 0, 0, 0, 2265, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2265, 2265, 1300,
+ 0, 0, 1300, 1300, 1301, 0, 1301, 1301, 1301, 0,
+
+ 0, 0, 1301, 1301, 0, 1301, 0, 1301, 1301, 1301,
+ 1301, 0, 1301, 0, 0, 0, 1301, 1301, 1301, 2265,
+ 2265, 0, 2265, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2265, 0, 0,
+ 0, 0, 1301, 0, 0, 1301, 0, 0, 0, 0,
+ 1301, 0, 0, 0, 0, 0, 0, 0, 0, 1301,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1301, 0, 1301, 1307, 0, 0, 0, 0, 1307,
+ 0, 0, 0, 0, 0, 1307, 1307, 0, 1307, 1307,
+ 0, 0, 1307, 1307, 0, 0, 0, 0, 1307, 0,
+
+ 0, 1307, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1307, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1307, 0, 1307, 1307, 1309, 0, 0, 0,
+ 0, 1309, 0, 0, 0, 0, 0, 1309, 1309, 0,
+ 1309, 1309, 0, 1309, 1309, 1309, 0, 0, 0, 0,
+ 1309, 1309, 0, 1309, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 1309, 0, 1309, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1309, 0, 1309, 1309, 1311, 0,
+ 0, 1311, 0, 0, 0, 0, 0, 1311, 0, 1311,
+ 0, 1311, 0, 1311, 0, 0, 0, 1311, 1311, 0,
+ 1311, 1311, 1311, 0, 0, 1311, 1311, 1311, 1311, 1311,
+ 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311,
+ 1311, 1311, 1311, 1311, 1311, 1311, 0, 0, 0, 0,
+ 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311,
+
+ 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311,
+ 1311, 1311, 1311, 1311, 1329, 0, 1329, 1329, 0, 0,
+ 0, 1329, 0, 1329, 0, 1329, 1329, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1329, 0, 0, 0,
+ 1329, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1329, 0, 0, 0, 0, 0, 1329,
+ 0, 1329, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1329, 0, 0, 0,
+ 1329, 0, 1329, 1334, 1334, 0, 1334, 1334, 1334, 1334,
+
+ 1334, 1334, 1334, 0, 1334, 1334, 1334, 0, 1334, 0,
+ 1334, 1334, 1334, 0, 0, 1334, 0, 1334, 0, 1334,
+ 1334, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1334, 0, 1334, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1334, 1334, 1334, 1334, 1334, 1335, 0, 0, 1335, 0,
+ 1335, 1335, 1335, 1335, 1335, 0, 1335, 1335, 1335, 0,
+ 1335, 0, 1335, 1335, 1335, 0, 0, 1335, 0, 1335,
+
+ 0, 1335, 1335, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1335, 0, 1335, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1335,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1335, 1335, 1335, 1335, 1335, 1338, 1338, 0,
+ 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338,
+ 1338, 0, 1338, 0, 1338, 1338, 1338, 0, 0, 1338,
+ 1338, 1338, 0, 1338, 1338, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 1338, 0, 1338,
+ 0, 0, 0, 1338, 0, 1338, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1338, 0, 0, 0, 1338, 1338, 1338, 1338, 1338, 1339,
+ 1339, 0, 1339, 1339, 1339, 1339, 1339, 0, 1339, 0,
+ 1339, 1339, 1339, 1339, 1339, 1339, 0, 1339, 1339, 0,
+ 1339, 1339, 0, 1339, 1339, 1339, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1339, 0,
+ 1339, 1339, 0, 0, 0, 1339, 0, 0, 0, 0,
+
+ 0, 0, 0, 1339, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1339, 0, 0, 0, 0, 1339, 0, 1339,
+ 1340, 1340, 0, 1340, 1340, 1340, 1340, 1340, 0, 1340,
+ 0, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340,
+ 1340, 1340, 1340, 1340, 1340, 1340, 1340, 0, 1340, 1340,
+ 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340,
+ 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340,
+ 0, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340,
+ 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340,
+ 1340, 1340, 1340, 1340, 1340, 1340, 1340, 0, 1340, 0,
+
+ 1340, 1340, 1341, 1341, 0, 1341, 1341, 1341, 1341, 1341,
+ 0, 1341, 0, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 0, 1341, 1341, 1341, 0,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 0, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 0,
+ 1341, 0, 1341, 1341, 1357, 0, 1357, 1357, 1357, 0,
+ 0, 0, 1357, 1357, 0, 1357, 0, 1357, 1357, 1357,
+
+ 1357, 0, 1357, 0, 0, 0, 1357, 1357, 1357, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1357, 0, 0, 1357, 0, 0, 0, 0,
+ 1357, 0, 0, 0, 0, 0, 0, 0, 0, 1357,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1357, 0, 1357, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1374, 1374, 1374, 1374,
+ 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374,
+ 1374, 1374, 1374, 1374, 1374, 1374, 0, 1374, 1374, 1374,
+ 1374, 1374, 1374, 1374, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1374, 1374, 1374, 1374, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 1374, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1374, 1374, 1374, 1374, 1374, 1375, 1375,
+ 0, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1376, 1376, 0, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+ 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+ 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+ 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+ 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+ 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+ 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+ 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+ 1376, 1376, 1384, 0, 1384, 1384, 1384, 0, 1384, 0,
+
+ 1384, 1384, 0, 1384, 0, 1384, 1384, 1384, 1384, 1384,
+ 1384, 0, 1384, 0, 1384, 1384, 1384, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1384, 0, 0, 1384, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1384,
+ 0, 1384, 1390, 0, 1390, 1390, 1390, 0, 1390, 0,
+ 1390, 1390, 0, 1390, 0, 1390, 1390, 1390, 1390, 1390,
+ 1390, 0, 1390, 0, 1390, 1390, 1390, 0, 1390, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1390, 0, 0, 1390, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1390,
+ 0, 1390, 1390, 1391, 0, 1391, 1391, 1391, 1391, 1391,
+ 1391, 0, 0, 1391, 1391, 1391, 1391, 1391, 0, 1391,
+ 1391, 1391, 1391, 0, 1391, 1391, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1391, 0, 0,
+ 0, 0, 0, 0, 0, 1391, 0, 0, 1391, 1391,
+ 1394, 0, 1394, 1394, 1394, 1394, 1394, 1394, 0, 0,
+ 1394, 1394, 1394, 1394, 1394, 0, 1394, 1394, 1394, 1394,
+ 0, 1394, 1394, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1394, 0, 0, 0,
+
+ 0, 0, 1394, 0, 0, 1394, 1394, 1409, 0, 0,
+ 0, 0, 1409, 0, 0, 0, 0, 0, 1409, 1409,
+ 0, 1409, 0, 0, 0, 1409, 1409, 0, 0, 0,
+ 0, 1409, 0, 0, 1409, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1409,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1409, 0, 1409, 1409, 1410,
+ 0, 0, 0, 0, 1410, 0, 0, 0, 0, 0,
+
+ 1410, 1410, 0, 1410, 1410, 0, 0, 1410, 1410, 0,
+ 0, 0, 0, 1410, 0, 0, 1410, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1410,
+ 0, 1410, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1410, 0, 1410,
+ 1410, 1458, 0, 0, 1458, 0, 1458, 1458, 1458, 1458,
+ 1458, 0, 1458, 1458, 1458, 0, 1458, 0, 1458, 1458,
+ 1458, 0, 0, 1458, 0, 1458, 0, 1458, 1458, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1458, 0, 1458, 0, 0, 0, 0, 0, 1458,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1458, 1458,
+ 1458, 1458, 1458, 1460, 1460, 0, 1460, 1460, 1460, 1460,
+ 1460, 0, 1460, 0, 1460, 1460, 1460, 1460, 1460, 1460,
+ 0, 1460, 1460, 0, 1460, 1460, 0, 1460, 1460, 1460,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 1460, 0, 1460, 1460, 0, 0, 0, 1460,
+ 0, 1460, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1460, 0, 0, 0,
+ 0, 1460, 0, 1460, 1471, 0, 1471, 1471, 1471, 0,
+ 1471, 0, 1471, 1471, 0, 1471, 0, 1471, 1471, 1471,
+ 1471, 1471, 1471, 0, 1471, 0, 1471, 1471, 1471, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1471, 0, 0, 1471, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1471, 0, 1471, 1473, 0, 1473, 1473, 1473, 0,
+ 0, 0, 1473, 1473, 0, 1473, 0, 1473, 1473, 1473,
+ 1473, 0, 1473, 0, 0, 0, 1473, 1473, 1473, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1473, 0, 0, 1473, 0, 0, 0, 0,
+ 1473, 0, 0, 0, 0, 0, 0, 0, 0, 1473,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1473, 0, 1473, 1506, 1506, 0, 1506, 1506, 1506,
+
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1507, 1507, 0, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1513, 0,
+ 1513, 1513, 1513, 0, 0, 0, 1513, 1513, 0, 1513,
+ 0, 1513, 1513, 1513, 1513, 0, 1513, 0, 0, 0,
+ 1513, 1513, 1513, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 1513, 0, 0, 1513,
+ 0, 0, 0, 0, 1513, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1513, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1513, 0, 1513, 1534, 0,
+ 1534, 1534, 1534, 1534, 1534, 1534, 0, 0, 1534, 1534,
+ 1534, 1534, 1534, 0, 1534, 1534, 1534, 1534, 0, 1534,
+ 1534, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1534, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1534, 0, 0, 1534, 1534, 1537, 0, 1537, 1537, 1537,
+ 1537, 1537, 1537, 0, 0, 1537, 1537, 1537, 1537, 1537,
+ 0, 1537, 1537, 1537, 1537, 0, 1537, 1537, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1537, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1537, 0, 0,
+ 1537, 1537, 1587, 0, 1587, 1587, 1587, 0, 0, 0,
+
+ 1587, 1587, 0, 1587, 0, 1587, 1587, 1587, 1587, 0,
+ 1587, 0, 0, 0, 1587, 1587, 1587, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1587, 0, 0, 1587, 0, 0, 0, 0, 1587, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1587, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1587,
+ 0, 1587, 1628, 0, 1628, 1628, 1628, 0, 0, 0,
+ 1628, 1628, 0, 1628, 0, 1628, 1628, 1628, 1628, 0,
+ 1628, 0, 0, 0, 1628, 1628, 1628, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1628, 0, 0, 1628, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1628, 0, 0, 0, 0, 0, 0, 0, 0, 1628,
+ 0, 1628, 1632, 0, 1632, 1632, 1632, 0, 1632, 0,
+ 1632, 1632, 0, 1632, 0, 1632, 1632, 1632, 1632, 1632,
+ 1632, 0, 1632, 0, 1632, 1632, 1632, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 1632, 0, 0, 1632, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632,
+ 0, 1632, 1634, 0, 1634, 1634, 1634, 0, 0, 0,
+ 1634, 1634, 0, 1634, 0, 1634, 1634, 1634, 1634, 0,
+ 1634, 0, 0, 0, 1634, 1634, 1634, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1634, 0, 0, 1634, 0, 0, 0, 0, 1634, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1634, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1634,
+ 0, 1634, 1662, 0, 1662, 1662, 1662, 0, 1662, 0,
+ 1662, 1662, 0, 1662, 0, 1662, 1662, 1662, 1662, 1662,
+ 1662, 0, 1662, 0, 1662, 1662, 1662, 0, 1662, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1662, 0, 0, 1662, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1662,
+ 0, 1662, 1662, 1666, 0, 1666, 1666, 1666, 1666, 1666,
+
+ 1666, 0, 0, 1666, 1666, 1666, 1666, 1666, 0, 1666,
+ 1666, 1666, 1666, 0, 1666, 1666, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1666,
+ 0, 0, 0, 0, 0, 1666, 0, 0, 1666, 1666,
+ 1669, 0, 1669, 1669, 1669, 1669, 1669, 1669, 0, 0,
+ 1669, 1669, 1669, 1669, 1669, 0, 1669, 1669, 1669, 1669,
+ 0, 1669, 1669, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1669, 0, 0, 0, 0, 0,
+ 0, 0, 1669, 0, 0, 1669, 1669, 1694, 0, 1694,
+ 1694, 1694, 0, 1694, 0, 1694, 1694, 0, 1694, 0,
+ 1694, 1694, 1694, 1694, 1694, 1694, 0, 1694, 0, 1694,
+ 1694, 1694, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1694, 0, 0, 1694, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1694, 0, 1694, 1720, 0, 1720,
+ 1720, 1720, 0, 0, 1720, 1720, 1720, 0, 1720, 0,
+ 1720, 1720, 1720, 1720, 1720, 1720, 0, 0, 0, 1720,
+ 1720, 1720, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1720, 0, 0, 1720, 0,
+ 0, 0, 0, 1720, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1720, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 1720, 0, 1720, 1724, 0, 0,
+ 1724, 0, 1724, 1724, 1724, 1724, 1724, 0, 1724, 1724,
+ 1724, 0, 1724, 0, 1724, 1724, 1724, 0, 0, 1724,
+ 0, 1724, 0, 1724, 1724, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1724, 0, 1724,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1724, 1724, 1724, 1724, 1724, 1730,
+ 1730, 0, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1737, 0, 1737, 1737, 1737, 0, 0, 0, 1737,
+ 1737, 0, 1737, 0, 1737, 1737, 1737, 1737, 0, 1737,
+ 0, 0, 0, 1737, 1737, 1737, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1737,
+ 0, 0, 1737, 0, 0, 0, 0, 1737, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1737, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1737, 0,
+ 1737, 1742, 0, 1742, 1742, 1742, 0, 0, 0, 1742,
+ 1742, 0, 1742, 0, 1742, 1742, 1742, 1742, 0, 1742,
+ 0, 0, 0, 1742, 1742, 1742, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1742,
+
+ 0, 0, 1742, 0, 0, 0, 0, 1742, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1742, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1742, 0,
+ 1742, 1779, 0, 1779, 1779, 1779, 1779, 1779, 1779, 0,
+ 0, 1779, 1779, 1779, 1779, 1779, 0, 1779, 1779, 1779,
+ 1779, 0, 1779, 1779, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1779, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 1779, 0, 0, 1779, 1779, 1780, 1780,
+ 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780,
+ 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 0, 1780,
+ 1780, 1780, 1780, 1780, 1780, 1780, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1780, 1780, 1780,
+ 1780, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1780, 1780, 1780, 1780, 1780,
+ 1782, 0, 1782, 1782, 1782, 0, 1782, 1782, 1782, 1782,
+
+ 1782, 1782, 0, 1782, 1782, 1782, 1782, 1782, 1782, 0,
+ 1782, 1782, 1782, 1782, 1782, 1782, 1782, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1782, 0,
+ 0, 1782, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1782, 1782, 0, 1782,
+ 1782, 1826, 0, 1826, 1826, 1826, 0, 0, 0, 1826,
+ 1826, 0, 1826, 0, 1826, 1826, 1826, 1826, 0, 1826,
+ 0, 0, 0, 1826, 1826, 1826, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1826,
+ 0, 0, 1826, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1826, 0, 0, 0, 0, 0, 0, 1826, 0,
+ 1826, 1828, 0, 1828, 1828, 1828, 0, 0, 1828, 1828,
+ 1828, 0, 1828, 0, 1828, 1828, 1828, 1828, 1828, 1828,
+ 0, 0, 0, 1828, 1828, 1828, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1828,
+
+ 0, 0, 1828, 0, 0, 0, 0, 1828, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1828, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1828, 0,
+ 1828, 1848, 0, 0, 1848, 0, 1848, 1848, 1848, 1848,
+ 1848, 0, 1848, 1848, 1848, 0, 1848, 0, 1848, 1848,
+ 1848, 0, 0, 1848, 0, 1848, 0, 1848, 1848, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1848, 0, 1848, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 1848, 1848,
+ 1848, 1848, 1848, 1887, 0, 0, 1887, 1887, 0, 1887,
+ 1887, 1887, 0, 1887, 0, 1887, 1887, 1887, 0, 1887,
+ 1887, 1887, 0, 0, 1887, 1887, 1887, 1887, 1887, 1887,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1887, 0, 1887, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1887, 1887, 1923, 0, 1923, 1923, 1923, 0, 0,
+
+ 1923, 1923, 1923, 0, 1923, 0, 1923, 1923, 1923, 1923,
+ 0, 1923, 0, 0, 0, 1923, 1923, 1923, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1923, 0, 0, 1923, 0, 0, 0, 0, 1923,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1923, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1923, 0, 1923, 1927, 0, 0, 1927, 0, 1927, 1927,
+ 1927, 1927, 1927, 0, 1927, 1927, 1927, 0, 1927, 0,
+ 1927, 1927, 1927, 0, 0, 1927, 0, 1927, 0, 1927,
+
+ 1927, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1927, 0, 1927, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1927, 1927, 1927, 1927, 1927, 1941, 0, 0, 1941, 0,
+ 1941, 1941, 1941, 1941, 1941, 0, 1941, 1941, 1941, 0,
+ 1941, 0, 1941, 1941, 1941, 0, 0, 1941, 0, 1941,
+ 0, 1941, 1941, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 1941, 0, 1941, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1941, 1941, 1941, 1941, 1941, 1943, 0, 1943,
+ 1943, 1943, 0, 0, 1943, 1943, 1943, 0, 1943, 0,
+ 1943, 1943, 1943, 1943, 1943, 1943, 0, 0, 0, 1943,
+ 1943, 1943, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1943, 0, 0, 1943, 0,
+ 0, 0, 0, 1943, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 1943, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1943, 0, 1943, 1948, 0, 0,
+ 1948, 0, 1948, 1948, 1948, 1948, 1948, 0, 1948, 1948,
+ 1948, 0, 1948, 0, 1948, 1948, 1948, 0, 0, 1948,
+ 0, 1948, 0, 1948, 1948, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1948, 0, 1948,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1948, 1948, 1948, 1948, 1948, 1963,
+
+ 0, 0, 1963, 0, 1963, 1963, 1963, 1963, 1963, 0,
+ 1963, 1963, 1963, 0, 1963, 0, 1963, 1963, 1963, 0,
+ 0, 1963, 0, 1963, 0, 1963, 1963, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1963,
+ 0, 1963, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1963, 1963, 1963, 1963,
+ 1963, 1971, 0, 0, 1971, 0, 1971, 1971, 1971, 1971,
+ 1971, 0, 1971, 1971, 1971, 0, 1971, 0, 1971, 1971,
+
+ 1971, 0, 0, 1971, 0, 1971, 0, 1971, 1971, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1971, 0, 1971, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1971, 1971,
+ 1971, 1971, 1971, 1999, 0, 1999, 1999, 1999, 0, 0,
+ 0, 1999, 1999, 0, 1999, 0, 1999, 1999, 1999, 1999,
+ 0, 1999, 0, 0, 0, 1999, 1999, 1999, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1999, 0, 0, 1999, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1999,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1999, 0, 1999, 2001, 0, 0, 2001, 2001, 0, 2001,
+ 2001, 2001, 0, 2001, 0, 2001, 2001, 2001, 0, 2001,
+ 2001, 2001, 0, 0, 2001, 2001, 2001, 2001, 2001, 2001,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2001, 0, 2001, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2001, 2001, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 0, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2026, 2026, 2026, 2026, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 2026, 2026, 2026, 2026, 2026, 2032, 0, 0, 2032, 0,
+ 2032, 2032, 2032, 2032, 2032, 0, 2032, 2032, 2032, 0,
+ 2032, 0, 2032, 2032, 2032, 0, 0, 2032, 0, 2032,
+ 0, 2032, 2032, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2032, 0, 2032, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2032, 2032, 2032, 2032, 2032, 2041, 0, 0,
+ 2041, 0, 2041, 2041, 2041, 2041, 2041, 0, 2041, 2041,
+
+ 2041, 0, 2041, 0, 2041, 2041, 2041, 0, 0, 2041,
+ 0, 2041, 0, 2041, 2041, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2041, 0, 2041,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2041, 2041, 2041, 2041, 2041, 2074,
+ 0, 0, 2074, 2074, 0, 2074, 2074, 2074, 0, 2074,
+ 0, 2074, 2074, 2074, 0, 2074, 2074, 2074, 0, 0,
+ 2074, 2074, 2074, 2074, 2074, 2074, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2074, 0, 2074,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2074, 2074, 2080,
+ 0, 0, 2080, 2080, 0, 2080, 2080, 2080, 0, 2080,
+ 0, 2080, 2080, 2080, 0, 2080, 2080, 2080, 0, 0,
+ 2080, 2080, 2080, 2080, 2080, 2080, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2080, 0, 2080,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2080, 2080, 2108,
+ 0, 0, 2108, 0, 2108, 2108, 2108, 2108, 2108, 0,
+ 2108, 2108, 2108, 0, 2108, 0, 2108, 2108, 2108, 0,
+ 0, 2108, 0, 2108, 0, 2108, 2108, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2108,
+ 0, 2108, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 2108, 2108, 2108, 2108,
+ 2108, 2141, 0, 0, 2141, 2141, 0, 2141, 2141, 2141,
+ 0, 2141, 0, 2141, 2141, 2141, 0, 2141, 2141, 2141,
+ 0, 0, 2141, 2141, 2141, 2141, 2141, 2141, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2141,
+ 0, 2141, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2141,
+ 2141, 2197, 0, 0, 2197, 2197, 0, 2197, 2197, 2197,
+
+ 0, 2197, 0, 2197, 2197, 2197, 0, 2197, 2197, 2197,
+ 0, 0, 2197, 2197, 2197, 2197, 2197, 2197, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2197,
+ 0, 2197, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2197,
+ 2197, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
+ 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
+ 2277, 0, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2277, 2277, 2277, 2277, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2277, 2277,
+ 2277, 2277, 2277, 2326, 2326, 2326, 2326, 2326, 2326, 2326,
+ 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326,
+ 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326,
+ 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2327,
+ 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327,
+
+ 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327,
+ 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327,
+ 2327, 2327, 2327, 2327, 2327, 2328, 2328, 2328, 2328, 2328,
+ 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328,
+ 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328,
+ 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328,
+ 2328, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329,
+ 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329,
+ 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329,
+ 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2330, 2330, 2330,
+
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330,
+ 2330, 2330, 2330, 2331, 2331, 2331, 2331, 2331, 2331, 2331,
+ 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331,
+ 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331,
+ 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2332,
+ 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332,
+ 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332,
+ 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332, 2332,
+
+ 2332, 2332, 2332, 2332, 2332, 2333, 2333, 2333, 2333, 2333,
+ 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333,
+ 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333,
+ 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333,
+ 2333, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334,
+ 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334,
+ 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334,
+ 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
+ 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
+ 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
+ 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2337,
+ 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337,
+ 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337,
+ 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337,
+ 2337, 2337, 2337, 2337, 2337, 2338, 2338, 2338, 2338, 2338,
+ 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338,
+
+ 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338,
+ 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338, 2338,
+ 2338, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339,
+ 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339,
+ 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339,
+ 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2341, 2341, 2341, 2341, 2341, 2341, 2341,
+
+ 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341,
+ 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341,
+ 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2342,
+ 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342,
+ 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342,
+ 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342,
+ 2342, 2342, 2342, 2342, 2342, 2343, 2343, 2343, 2343, 2343,
+ 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343,
+ 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343,
+ 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343,
+
+ 2343, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2345, 2345, 2345,
+ 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345,
+ 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345,
+ 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345,
+ 2345, 2345, 2345, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2347,
+ 0, 0, 0, 2347, 0, 0, 0, 0, 0, 2347,
+ 0, 0, 2347, 2347, 0, 2347, 0, 2347, 2347, 0,
+ 0, 0, 2347, 0, 0, 0, 2347, 0, 0, 0,
+ 2347, 0, 0, 2347, 2347, 2348, 2348, 2348, 2348, 2348,
+ 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348,
+ 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348,
+ 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348, 2348,
+ 2348, 2353, 0, 0, 0, 2353, 0, 0, 0, 0,
+ 0, 2353, 0, 0, 2353, 2353, 0, 2353, 2353, 2353,
+
+ 2353, 0, 0, 0, 2353, 0, 0, 2353, 2353, 0,
+ 0, 0, 2353, 0, 0, 2353, 2353, 2354, 0, 0,
+ 0, 2354, 0, 0, 0, 0, 0, 2354, 0, 0,
+ 2354, 2354, 0, 2354, 2354, 2354, 2354, 0, 0, 0,
+ 2354, 0, 0, 2354, 2354, 0, 2354, 0, 2354, 0,
+ 0, 2354, 2354, 2355, 0, 2355, 2355, 0, 2355, 0,
+ 0, 0, 0, 0, 0, 2355, 2355, 2357, 2357, 2357,
+ 2357, 2357, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2357, 0, 2357, 0, 2357, 0, 2357, 2357,
+ 0, 2357, 0, 0, 0, 0, 2357, 2358, 0, 0,
+
+ 0, 2358, 0, 2358, 0, 0, 0, 2358, 2358, 0,
+ 2358, 2358, 0, 2358, 2358, 2358, 2358, 2358, 0, 2358,
+ 2358, 0, 0, 2358, 2358, 0, 2358, 0, 2358, 0,
+ 0, 2358, 2358, 2359, 0, 0, 0, 2359, 0, 0,
+ 2359, 0, 0, 2359, 0, 0, 2359, 2359, 0, 2359,
+ 0, 2359, 2359, 0, 0, 0, 2359, 0, 0, 0,
+ 2359, 0, 0, 0, 2359, 0, 0, 2359, 2359, 2360,
+ 0, 0, 0, 2360, 0, 2360, 0, 0, 0, 2360,
+ 2360, 0, 2360, 2360, 0, 2360, 2360, 2360, 2360, 2360,
+ 0, 2360, 2360, 0, 0, 0, 2360, 0, 0, 0,
+
+ 2360, 0, 0, 2360, 2360, 2361, 2361, 0, 2361, 2361,
+ 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361,
+ 2361, 0, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361,
+ 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361,
+ 2361, 2362, 0, 0, 0, 2362, 0, 0, 0, 0,
+ 0, 2362, 0, 0, 2362, 2362, 0, 2362, 0, 2362,
+ 2362, 0, 0, 0, 2362, 0, 0, 0, 2362, 0,
+ 0, 0, 2362, 0, 0, 2362, 2362, 2363, 2363, 2363,
+ 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363,
+ 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363,
+
+ 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363, 2363,
+ 2363, 2363, 2363, 2367, 2367, 2367, 2367, 2367, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2367, 0, 2367, 0, 2367, 2367, 0, 2367, 0, 0,
+ 0, 0, 2367, 2368, 0, 0, 0, 2368, 0, 0,
+ 0, 0, 0, 2368, 0, 0, 2368, 2368, 0, 2368,
+ 0, 2368, 2368, 0, 0, 0, 2368, 0, 0, 0,
+ 2368, 0, 0, 0, 2368, 0, 0, 2368, 2368, 2371,
+ 2371, 2371, 2371, 2371, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2371, 0, 2371, 0,
+
+ 2371, 2371, 0, 2371, 0, 0, 0, 0, 2371, 2373,
+ 0, 2373, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2373, 0, 0,
+ 0, 2373, 0, 0, 0, 2373, 0, 0, 0, 0,
+ 0, 0, 0, 2373, 2374, 0, 0, 0, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2375, 2375, 0, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
+
+ 2375, 2375, 0, 2375, 2375, 2375, 0, 2375, 2375, 0,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2376, 2376, 0, 2376,
+ 2376, 2376, 2376, 0, 2376, 2376, 2376, 2376, 2376, 2376,
+ 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376, 2376,
+ 2376, 2376, 0, 2376, 2376, 0, 2376, 2376, 2376, 2376,
+ 2376, 2376, 2377, 2377, 0, 2377, 2377, 2377, 2377, 0,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377,
+ 2377, 2377, 2377, 2377, 2377, 2377, 2377, 2377, 0, 2377,
+ 2377, 0, 2377, 2377, 2377, 2377, 2377, 2377, 2378, 2378,
+ 0, 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378,
+
+ 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2378,
+ 2378, 2378, 2378, 2378, 0, 2378, 2378, 0, 2378, 2378,
+ 2378, 2378, 2378, 2378, 2379, 2379, 0, 2379, 2379, 2379,
+ 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379,
+ 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379,
+ 0, 2379, 2379, 0, 2379, 2379, 2379, 2379, 2379, 2379,
+ 2380, 2380, 0, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 0, 2380, 2380, 0,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2381, 2381, 0, 2381,
+
+ 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381,
+ 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381, 2381,
+ 2381, 2381, 0, 2381, 2381, 0, 2381, 2381, 2381, 2381,
+ 2381, 2381, 2382, 2382, 0, 2382, 2382, 2382, 2382, 2382,
+ 2382, 2382, 2382, 2382, 2382, 2382, 2382, 2382, 2382, 2382,
+ 2382, 2382, 2382, 2382, 2382, 2382, 2382, 2382, 0, 2382,
+ 2382, 0, 2382, 2382, 2382, 2382, 2382, 2382, 2383, 0,
+ 0, 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 0, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+
+ 2383, 2383, 2383, 2383, 2384, 2384, 0, 2384, 2384, 2384,
+ 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384,
+ 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384,
+ 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384, 2384,
+ 2386, 2386, 0, 2386, 2386, 0, 2386, 2386, 2386, 2386,
+ 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
+ 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
+ 2386, 2386, 2386, 2386, 2386, 2386, 2387, 0, 2387, 2387,
+ 2387, 2387, 2387, 0, 0, 0, 0, 0, 0, 2387,
+ 0, 2387, 2388, 0, 2388, 0, 2388, 2388, 2388, 0,
+
+ 0, 0, 0, 0, 0, 2388, 0, 2388, 2389, 2389,
+ 0, 0, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2390, 2390, 0, 2390, 2390, 2390,
+ 2390, 0, 2390, 0, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 0, 2390, 2390, 2390,
+ 0, 2390, 2390, 0, 2390, 2390, 0, 0, 2390, 2390,
+ 2392, 2392, 0, 2392, 2392, 2392, 2392, 0, 2392, 0,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+
+ 2392, 2392, 2392, 2392, 2392, 2392, 0, 2392, 2392, 0,
+ 2392, 2392, 0, 0, 2392, 2392, 2395, 0, 0, 0,
+ 0, 2395, 0, 0, 0, 0, 2395, 2395, 2395, 2395,
+ 2395, 0, 2395, 0, 0, 0, 0, 2395, 0, 0,
+ 0, 0, 0, 0, 0, 2395, 2396, 0, 0, 0,
+ 2396, 0, 0, 0, 0, 0, 2396, 0, 0, 2396,
+ 2396, 0, 2396, 0, 2396, 2396, 0, 0, 0, 2396,
+ 0, 0, 0, 2396, 0, 0, 0, 2396, 0, 0,
+ 2396, 2396, 2399, 2399, 2399, 2399, 2399, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2399,
+
+ 0, 2399, 0, 2399, 2399, 0, 2399, 0, 0, 0,
+ 0, 2399, 2400, 0, 0, 0, 0, 2400, 2400, 0,
+ 2400, 0, 2400, 2400, 2400, 2400, 2400, 0, 0, 0,
+ 0, 0, 0, 2400, 2403, 0, 0, 0, 2403, 0,
+ 0, 0, 0, 0, 2403, 0, 0, 2403, 2403, 0,
+ 2403, 0, 2403, 2403, 0, 0, 0, 2403, 0, 0,
+ 0, 2403, 0, 0, 0, 2403, 0, 0, 2403, 2403,
+ 2404, 2404, 0, 2404, 2404, 2404, 2404, 2404, 2404, 2404,
+ 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404,
+ 2404, 2404, 2404, 2404, 2404, 2404, 0, 2404, 2404, 0,
+
+ 2404, 2404, 2404, 2404, 2404, 2404, 2406, 0, 2406, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2406, 0, 0, 2406, 0, 0, 0, 0, 0,
+ 0, 0, 2406, 0, 0, 0, 0, 0, 0, 0,
+ 2406, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407,
+ 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407,
+ 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407,
+ 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2408, 2408, 2408,
+ 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408,
+ 2408, 2408, 2408, 0, 2408, 2408, 0, 2408, 2408, 2408,
+
+ 2408, 2408, 2408, 0, 0, 2408, 0, 2408, 2408, 2408,
+ 2408, 2408, 2408, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2411,
+ 2411, 0, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2413, 0, 0, 0, 0,
+ 2413, 0, 0, 0, 0, 0, 2413, 0, 2413, 2413,
+
+ 0, 2413, 0, 0, 0, 0, 2413, 0, 0, 0,
+ 0, 0, 0, 0, 2413, 2417, 0, 0, 0, 0,
+ 2417, 0, 0, 0, 0, 0, 2417, 0, 2417, 2417,
+ 0, 2417, 0, 0, 0, 0, 2417, 0, 0, 0,
+ 0, 0, 0, 0, 2417, 2420, 0, 0, 0, 2420,
+ 0, 0, 0, 0, 0, 2420, 0, 0, 2420, 2420,
+ 0, 2420, 2420, 2420, 2420, 0, 0, 0, 2420, 0,
+ 0, 2420, 2420, 0, 0, 0, 2420, 0, 0, 2420,
+ 2420, 2421, 0, 2421, 2421, 0, 2421, 0, 0, 0,
+ 0, 0, 0, 2421, 2421, 2423, 0, 0, 0, 2423,
+
+ 0, 0, 0, 0, 0, 2423, 0, 0, 2423, 2423,
+ 0, 2423, 2423, 2423, 2423, 0, 0, 0, 2423, 0,
+ 0, 2423, 2423, 0, 2423, 0, 2423, 0, 0, 2423,
+ 2423, 2424, 0, 2424, 2424, 0, 2424, 0, 0, 0,
+ 0, 0, 0, 2424, 2424, 2425, 0, 0, 0, 2425,
+ 0, 0, 0, 0, 0, 2425, 0, 0, 2425, 2425,
+ 0, 2425, 0, 2425, 2425, 0, 0, 0, 2425, 0,
+ 0, 0, 2425, 0, 0, 0, 2425, 0, 0, 2425,
+ 2425, 2428, 2428, 2428, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2428, 2428,
+
+ 0, 0, 0, 0, 2428, 0, 0, 2428, 0, 0,
+ 0, 0, 0, 0, 0, 2428, 2431, 0, 0, 0,
+ 0, 0, 0, 0, 2431, 0, 0, 2431, 2431, 0,
+ 2431, 0, 0, 0, 2431, 2431, 0, 2431, 0, 2431,
+ 0, 0, 2431, 2431, 0, 2431, 2432, 0, 0, 0,
+ 0, 0, 0, 2432, 0, 2432, 2432, 0, 2432, 0,
+ 0, 0, 0, 0, 0, 2432, 2432, 0, 0, 0,
+ 0, 0, 0, 2432, 2432, 2433, 0, 0, 0, 2433,
+ 0, 2433, 0, 0, 0, 2433, 2433, 0, 2433, 2433,
+ 0, 2433, 2433, 2433, 2433, 2433, 0, 2433, 2433, 0,
+
+ 0, 2433, 2433, 0, 2433, 0, 2433, 0, 0, 2433,
+ 2433, 2434, 0, 0, 0, 2434, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2434, 0, 2434, 0, 0, 0,
+ 0, 2434, 0, 0, 0, 0, 0, 0, 0, 2434,
+ 2435, 0, 0, 0, 2435, 0, 2435, 0, 0, 0,
+ 2435, 2435, 0, 2435, 2435, 0, 2435, 2435, 2435, 2435,
+ 2435, 0, 2435, 2435, 0, 0, 0, 2435, 0, 0,
+ 0, 2435, 0, 0, 2435, 2435, 2437, 0, 0, 0,
+ 2437, 0, 0, 0, 0, 0, 2437, 2437, 0, 2437,
+ 2437, 0, 2437, 0, 2437, 2437, 0, 0, 2437, 2437,
+
+ 0, 0, 0, 2437, 0, 0, 0, 2437, 0, 0,
+ 2437, 2437, 2438, 2438, 0, 2438, 2438, 0, 0, 0,
+ 0, 0, 2438, 0, 0, 2438, 2438, 0, 2438, 2438,
+ 2438, 2438, 0, 0, 0, 2438, 0, 0, 0, 2438,
+ 0, 0, 0, 2438, 0, 0, 2438, 2438, 2439, 2439,
+ 0, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439,
+ 2439, 2439, 2439, 2439, 0, 2439, 2439, 2439, 2439, 2439,
+ 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439,
+ 2439, 2439, 2439, 2439, 2440, 0, 0, 0, 2440, 0,
+ 0, 0, 0, 0, 2440, 0, 0, 2440, 2440, 0,
+
+ 2440, 0, 2440, 2440, 0, 0, 0, 2440, 0, 0,
+ 0, 2440, 0, 0, 0, 2440, 0, 0, 2440, 2440,
+ 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
+ 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
+ 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
+ 2441, 2441, 2441, 2441, 2441, 2441, 2442, 2442, 0, 2442,
+ 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442,
+ 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442,
+ 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442,
+ 2442, 2442, 2448, 2448, 2448, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2448,
+ 2448, 0, 0, 0, 0, 2448, 0, 0, 2448, 0,
+ 0, 0, 0, 0, 0, 0, 2448, 2450, 0, 0,
+ 0, 2450, 0, 0, 0, 0, 0, 2450, 0, 0,
+ 2450, 2450, 0, 2450, 0, 2450, 2450, 0, 0, 0,
+ 2450, 0, 0, 0, 2450, 0, 0, 0, 2450, 0,
+ 0, 2450, 2450, 2457, 0, 2457, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2457, 0, 0, 0, 2457, 0, 0, 0, 2457,
+ 0, 0, 0, 0, 0, 0, 0, 2457, 2458, 0,
+
+ 0, 0, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458,
+ 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458,
+ 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458,
+ 2458, 2458, 2458, 2458, 2459, 2459, 0, 2459, 2459, 2459,
+ 2459, 2459, 2459, 2459, 2459, 2459, 2459, 2459, 2459, 2459,
+ 2459, 2459, 2459, 2459, 2459, 2459, 0, 2459, 2459, 2459,
+ 0, 2459, 2459, 0, 2459, 2459, 2459, 2459, 2459, 2459,
+ 2460, 2460, 0, 2460, 2460, 2460, 2460, 0, 2460, 2460,
+ 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460,
+ 2460, 2460, 2460, 2460, 2460, 2460, 0, 2460, 2460, 0,
+
+ 2460, 2460, 2460, 2460, 2460, 2460, 2461, 2461, 0, 2461,
+ 2461, 2461, 2461, 0, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 0, 2461, 2461, 0, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2462, 2462, 0, 2462, 2462, 2462, 2462, 2462,
+ 2462, 2462, 2462, 2462, 2462, 2462, 2462, 2462, 2462, 2462,
+ 2462, 2462, 2462, 2462, 2462, 2462, 2462, 2462, 0, 2462,
+ 2462, 0, 2462, 2462, 2462, 2462, 2462, 2462, 2463, 2463,
+ 0, 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+ 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463, 2463,
+
+ 2463, 2463, 2463, 2463, 0, 2463, 2463, 0, 2463, 2463,
+ 2463, 2463, 2463, 2463, 2464, 2464, 0, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464, 2464,
+ 0, 2464, 2464, 0, 2464, 2464, 2464, 2464, 2464, 2464,
+ 2465, 2465, 0, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+ 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+ 2465, 2465, 2465, 2465, 2465, 2465, 0, 2465, 2465, 0,
+ 2465, 2465, 2465, 2465, 2465, 2465, 2466, 2466, 0, 2466,
+ 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466,
+
+ 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466,
+ 2466, 2466, 0, 2466, 2466, 0, 2466, 2466, 2466, 2466,
+ 2466, 2466, 2467, 0, 0, 2467, 2467, 2467, 2467, 2467,
+ 2467, 2467, 2467, 2467, 2467, 2467, 2467, 0, 2467, 2467,
+ 2467, 2467, 2467, 2467, 2467, 2467, 2467, 2467, 2467, 2467,
+ 2467, 2467, 2467, 2467, 2467, 2467, 2467, 2467, 2468, 2468,
+ 0, 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+ 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+ 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468, 2468,
+ 2468, 2468, 2468, 2468, 2469, 2469, 0, 2469, 2469, 2469,
+
+ 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469,
+ 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469,
+ 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469,
+ 2471, 2471, 0, 2471, 2471, 2471, 2471, 2471, 2471, 2471,
+ 2471, 2471, 2471, 2471, 2471, 2471, 2471, 2471, 2471, 2471,
+ 2471, 2471, 2471, 2471, 2471, 2471, 2471, 2471, 2471, 2471,
+ 2471, 2471, 2471, 2471, 2471, 2471, 2472, 0, 2472, 2472,
+ 2472, 2472, 2472, 0, 0, 0, 0, 0, 0, 2472,
+ 0, 2472, 2473, 0, 2473, 0, 2473, 2473, 2473, 0,
+ 0, 0, 0, 0, 0, 2473, 0, 2473, 2474, 0,
+
+ 2474, 2474, 2474, 2474, 2474, 0, 0, 0, 0, 0,
+ 0, 2474, 0, 2474, 2475, 2475, 0, 0, 2475, 2475,
+ 2475, 2475, 2475, 2475, 2475, 2475, 2475, 2475, 2475, 2475,
+ 2475, 2475, 2475, 2475, 2475, 2475, 2475, 2475, 2475, 2475,
+ 2475, 2475, 2475, 2475, 2475, 2475, 2475, 2475, 2475, 2475,
+ 2476, 2476, 0, 2476, 2476, 2476, 2476, 0, 2476, 0,
+ 2476, 2476, 2476, 2476, 2476, 2476, 2476, 2476, 2476, 2476,
+ 2476, 2476, 0, 2476, 2476, 2476, 0, 2476, 2476, 0,
+ 2476, 2476, 0, 0, 2476, 2476, 2477, 2477, 0, 2477,
+ 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477,
+
+ 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477,
+ 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477,
+ 2477, 2477, 2479, 2479, 0, 2479, 2479, 2479, 2479, 0,
+ 2479, 0, 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479,
+ 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, 0, 2479,
+ 2479, 0, 2479, 2479, 0, 0, 2479, 2479, 2480, 0,
+ 0, 0, 0, 2480, 0, 0, 0, 0, 2480, 2480,
+ 2480, 2480, 2480, 0, 2480, 0, 0, 0, 0, 2480,
+ 0, 0, 0, 0, 0, 0, 0, 2480, 2481, 2481,
+ 0, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2482, 2482, 0, 2482, 2482, 2482,
+ 2482, 0, 2482, 0, 2482, 2482, 2482, 2482, 2482, 2482,
+ 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482,
+ 0, 2482, 2482, 0, 2482, 2482, 0, 0, 2482, 2482,
+ 2483, 0, 0, 0, 0, 0, 0, 0, 2483, 0,
+ 0, 0, 2483, 0, 2483, 0, 0, 0, 2483, 2483,
+ 0, 0, 0, 2483, 0, 0, 2483, 2485, 0, 0,
+ 0, 0, 2485, 0, 0, 0, 0, 2485, 2485, 2485,
+
+ 2485, 2485, 0, 2485, 0, 0, 0, 0, 2485, 0,
+ 0, 0, 0, 0, 0, 0, 2485, 2486, 0, 0,
+ 0, 0, 2486, 0, 0, 0, 0, 2486, 2486, 2486,
+ 2486, 2486, 0, 2486, 0, 0, 0, 0, 2486, 0,
+ 0, 0, 0, 0, 0, 0, 2486, 2487, 0, 0,
+ 0, 0, 0, 0, 0, 2487, 0, 0, 2487, 2487,
+ 0, 2487, 0, 0, 0, 2487, 2487, 0, 2487, 0,
+ 2487, 0, 0, 2487, 2487, 0, 2487, 2489, 0, 0,
+ 0, 0, 2489, 0, 0, 0, 0, 2489, 2489, 2489,
+ 2489, 2489, 0, 2489, 0, 0, 0, 0, 2489, 0,
+
+ 0, 0, 0, 0, 0, 0, 2489, 2491, 0, 0,
+ 0, 0, 0, 0, 0, 2491, 0, 0, 0, 2491,
+ 0, 2491, 0, 0, 0, 2491, 2491, 0, 0, 0,
+ 2491, 0, 0, 2491, 2492, 0, 0, 0, 2492, 0,
+ 0, 0, 0, 0, 2492, 0, 0, 2492, 2492, 0,
+ 2492, 0, 2492, 2492, 0, 0, 0, 2492, 0, 0,
+ 0, 2492, 0, 0, 0, 2492, 0, 0, 2492, 2492,
+ 2498, 0, 0, 0, 0, 2498, 2498, 0, 2498, 0,
+ 2498, 2498, 2498, 2498, 2498, 0, 0, 0, 0, 0,
+ 0, 2498, 2499, 0, 0, 0, 2499, 0, 0, 0,
+
+ 0, 0, 2499, 0, 0, 2499, 2499, 0, 2499, 0,
+ 2499, 2499, 0, 0, 0, 2499, 0, 0, 0, 2499,
+ 0, 0, 0, 2499, 0, 0, 2499, 2499, 2500, 2500,
+ 0, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
+ 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
+ 2500, 2500, 2500, 2500, 0, 2500, 2500, 0, 2500, 2500,
+ 2500, 2500, 2500, 2500, 2502, 0, 2502, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2502,
+ 0, 0, 2502, 0, 0, 0, 0, 0, 0, 0,
+ 2502, 0, 0, 0, 0, 0, 0, 0, 2502, 2503,
+
+ 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503,
+ 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503,
+ 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503,
+ 2503, 2503, 2503, 2503, 2503, 2504, 2504, 2504, 2504, 2504,
+ 2504, 2504, 2504, 2504, 2504, 2504, 2504, 2504, 2504, 2504,
+ 2504, 0, 2504, 2504, 0, 2504, 2504, 2504, 2504, 2504,
+ 2504, 0, 0, 2504, 0, 2504, 2504, 2504, 2504, 2504,
+ 2504, 2507, 2507, 0, 2507, 2507, 2507, 2507, 2507, 2507,
+ 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
+ 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
+
+ 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2509, 0, 0,
+ 0, 0, 2509, 0, 0, 0, 0, 0, 2509, 0,
+ 2509, 2509, 0, 2509, 0, 0, 0, 0, 2509, 0,
+ 0, 0, 0, 0, 0, 0, 2509, 2510, 0, 0,
+ 0, 2510, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2510, 0, 2510, 0, 0, 0, 0, 2510, 0, 0,
+ 0, 0, 0, 0, 0, 2510, 2511, 0, 0, 0,
+ 0, 0, 0, 0, 2511, 0, 0, 0, 2511, 0,
+ 2511, 0, 0, 0, 2511, 2511, 0, 0, 0, 2511,
+ 0, 0, 2511, 2516, 0, 0, 0, 0, 2516, 0,
+
+ 0, 0, 0, 0, 2516, 0, 2516, 2516, 0, 2516,
+ 0, 0, 0, 0, 2516, 0, 0, 0, 0, 0,
+ 0, 0, 2516, 2521, 0, 2521, 2521, 0, 2521, 0,
+ 0, 0, 0, 0, 0, 2521, 2521, 2522, 0, 0,
+ 0, 2522, 0, 0, 0, 0, 0, 2522, 0, 0,
+ 2522, 2522, 0, 2522, 2522, 2522, 2522, 0, 0, 0,
+ 2522, 0, 0, 0, 2522, 0, 2522, 0, 2522, 0,
+ 0, 2522, 2522, 2523, 2523, 2523, 2523, 0, 0, 0,
+ 0, 0, 0, 0, 2523, 0, 2523, 2524, 2524, 2524,
+ 0, 0, 0, 2524, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 2524, 0, 0, 0, 0, 0,
+ 2524, 0, 0, 2524, 0, 0, 0, 0, 0, 0,
+ 0, 2524, 2525, 2525, 2525, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2525,
+ 2525, 0, 0, 0, 0, 2525, 0, 0, 2525, 0,
+ 0, 0, 0, 0, 0, 0, 2525, 2528, 0, 0,
+ 0, 0, 2528, 0, 0, 0, 0, 0, 2528, 0,
+ 2528, 2528, 0, 2528, 0, 0, 0, 0, 2528, 0,
+ 0, 0, 0, 0, 0, 0, 2528, 2529, 0, 0,
+ 0, 0, 0, 0, 0, 2529, 0, 0, 2529, 2529,
+
+ 0, 2529, 0, 0, 0, 2529, 2529, 0, 2529, 0,
+ 2529, 0, 0, 2529, 2529, 0, 2529, 2530, 0, 0,
+ 0, 0, 2530, 0, 0, 2530, 0, 2530, 2530, 0,
+ 2530, 2530, 0, 2530, 0, 0, 0, 2530, 2530, 0,
+ 0, 0, 0, 0, 0, 0, 2530, 2532, 0, 0,
+ 0, 0, 0, 0, 0, 2532, 0, 0, 0, 2532,
+ 0, 2532, 0, 0, 0, 2532, 2532, 0, 0, 0,
+ 2532, 0, 0, 2532, 2533, 0, 0, 0, 2533, 0,
+ 2533, 0, 0, 0, 2533, 2533, 0, 2533, 2533, 0,
+ 2533, 2533, 2533, 2533, 2533, 0, 2533, 2533, 0, 0,
+
+ 2533, 2533, 0, 2533, 0, 2533, 0, 0, 2533, 2533,
+ 2534, 0, 0, 0, 2534, 0, 0, 0, 0, 0,
+ 2534, 2534, 0, 2534, 2534, 0, 2534, 0, 2534, 2534,
+ 0, 0, 2534, 2534, 0, 0, 0, 2534, 0, 0,
+ 0, 2534, 0, 0, 2534, 2534, 2535, 0, 0, 0,
+ 0, 0, 0, 0, 2535, 0, 0, 0, 2535, 0,
+ 2535, 0, 0, 0, 2535, 2535, 0, 0, 0, 2535,
+ 0, 0, 2535, 2536, 2536, 0, 2536, 2536, 2536, 2536,
+ 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536,
+ 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536,
+
+ 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2540,
+ 2540, 2540, 0, 0, 0, 2540, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2540, 0, 0, 0,
+ 0, 0, 2540, 0, 0, 2540, 0, 0, 0, 0,
+ 0, 0, 0, 2540, 2541, 2541, 2541, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2541, 2541, 0, 0, 0, 0, 2541, 0, 0,
+ 2541, 0, 0, 0, 0, 0, 0, 0, 2541, 2547,
+ 0, 0, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
+ 2547, 2547, 2547, 2547, 0, 2547, 2547, 2547, 2547, 2547,
+
+ 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
+ 2547, 2547, 2547, 2547, 2547, 2549, 0, 2549, 2549, 2549,
+ 2549, 2549, 0, 0, 0, 0, 0, 0, 2549, 0,
+ 2549, 2550, 0, 2550, 0, 2550, 2550, 2550, 0, 0,
+ 0, 0, 0, 0, 2550, 0, 2550, 2551, 2551, 0,
+ 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
+ 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
+ 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
+ 2551, 2551, 2551, 2552, 2552, 0, 2552, 2552, 2552, 2552,
+ 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552,
+
+ 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552,
+ 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2553,
+ 2553, 0, 2553, 2553, 2553, 2553, 0, 2553, 0, 2553,
+ 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553,
+ 2553, 0, 2553, 2553, 2553, 0, 2553, 2553, 0, 2553,
+ 2553, 0, 0, 2553, 2553, 2554, 0, 0, 0, 0,
+ 2554, 0, 0, 0, 0, 2554, 2554, 2554, 2554, 2554,
+ 0, 2554, 0, 0, 0, 0, 2554, 0, 0, 0,
+ 0, 0, 0, 0, 2554, 2555, 2555, 0, 2555, 2555,
+ 2555, 2555, 0, 2555, 0, 2555, 2555, 2555, 2555, 2555,
+
+ 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555,
+ 2555, 0, 2555, 2555, 0, 2555, 2555, 0, 0, 2555,
+ 2555, 2557, 0, 0, 0, 0, 0, 0, 0, 2557,
+ 0, 0, 2557, 2557, 0, 2557, 0, 0, 0, 2557,
+ 2557, 0, 2557, 0, 2557, 0, 0, 2557, 2557, 0,
+ 2557, 2558, 0, 0, 0, 0, 2558, 0, 0, 0,
+ 0, 2558, 2558, 2558, 2558, 2558, 0, 2558, 0, 0,
+ 0, 0, 2558, 0, 0, 0, 0, 0, 0, 0,
+ 2558, 2560, 2560, 0, 2560, 2560, 2560, 2560, 2560, 2560,
+ 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560,
+
+ 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560,
+ 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2561, 2561, 0,
+ 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561,
+ 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561,
+ 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561,
+ 2561, 2561, 2561, 2562, 2562, 0, 2562, 2562, 2562, 2562,
+ 0, 2562, 0, 2562, 2562, 2562, 2562, 2562, 2562, 2562,
+ 2562, 2562, 2562, 2562, 2562, 0, 2562, 2562, 2562, 0,
+ 2562, 2562, 0, 2562, 2562, 0, 0, 2562, 2562, 2563,
+ 2563, 0, 2563, 2563, 2563, 2563, 0, 2563, 0, 2563,
+
+ 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
+ 2563, 2563, 2563, 2563, 2563, 0, 2563, 2563, 0, 2563,
+ 2563, 0, 0, 2563, 2563, 2564, 2564, 0, 2564, 2564,
+ 2564, 2564, 0, 2564, 0, 2564, 2564, 2564, 2564, 2564,
+ 2564, 2564, 2564, 2564, 2564, 2564, 2564, 0, 2564, 2564,
+ 2564, 0, 2564, 2564, 0, 2564, 2564, 0, 0, 2564,
+ 2564, 2565, 0, 0, 0, 0, 0, 0, 0, 2565,
+ 0, 0, 0, 2565, 0, 2565, 0, 0, 0, 2565,
+ 2565, 0, 0, 0, 2565, 0, 0, 2565, 2566, 0,
+ 0, 0, 0, 2566, 0, 0, 0, 0, 2566, 2566,
+
+ 2566, 2566, 2566, 0, 2566, 0, 0, 0, 0, 2566,
+ 0, 0, 0, 0, 0, 0, 0, 2566, 2567, 0,
+ 0, 0, 0, 2567, 0, 0, 0, 0, 2567, 2567,
+ 2567, 2567, 2567, 0, 2567, 0, 0, 0, 0, 2567,
+ 0, 0, 0, 0, 0, 0, 0, 2567, 2568, 0,
+ 0, 0, 0, 0, 0, 0, 2568, 0, 0, 2568,
+ 2568, 0, 2568, 0, 0, 0, 2568, 2568, 0, 2568,
+ 0, 2568, 0, 0, 2568, 2568, 0, 2568, 2570, 0,
+ 0, 0, 0, 2570, 0, 0, 0, 0, 2570, 2570,
+ 2570, 2570, 2570, 0, 2570, 0, 0, 0, 0, 2570,
+
+ 0, 0, 0, 0, 0, 0, 0, 2570, 2573, 0,
+ 0, 0, 0, 0, 0, 0, 2573, 0, 0, 0,
+ 2573, 0, 2573, 0, 0, 0, 2573, 2573, 0, 0,
+ 0, 2573, 0, 0, 2573, 2578, 0, 0, 0, 2578,
+ 0, 0, 0, 0, 0, 2578, 0, 0, 2578, 2578,
+ 0, 2578, 0, 2578, 2578, 0, 0, 0, 2578, 0,
+ 0, 0, 2578, 0, 0, 0, 2578, 0, 0, 2578,
+ 2578, 2579, 2579, 0, 2579, 2579, 2579, 2579, 2579, 2579,
+ 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579,
+ 2579, 2579, 2579, 2579, 2579, 2579, 2579, 0, 2579, 2579,
+
+ 0, 2579, 2579, 2579, 2579, 2579, 2579, 2582, 0, 0,
+ 0, 0, 2582, 0, 0, 0, 0, 0, 2582, 0,
+ 2582, 2582, 0, 2582, 0, 0, 0, 0, 2582, 0,
+ 0, 0, 0, 0, 0, 0, 2582, 2583, 0, 0,
+ 0, 0, 0, 0, 0, 2583, 0, 0, 0, 2583,
+ 0, 2583, 0, 0, 0, 2583, 2583, 0, 0, 0,
+ 2583, 0, 0, 2583, 2584, 0, 0, 0, 0, 2584,
+ 0, 0, 0, 0, 0, 2584, 0, 2584, 2584, 0,
+ 2584, 0, 0, 0, 0, 2584, 0, 0, 0, 0,
+ 0, 0, 0, 2584, 2587, 2587, 0, 2587, 2587, 2587,
+
+ 2587, 0, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587,
+ 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587,
+ 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587,
+ 2589, 2589, 0, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
+ 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
+ 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
+ 2589, 2589, 2589, 2589, 2589, 2589, 2595, 2595, 2595, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2595, 2595, 0, 0, 0, 2595, 2595,
+ 0, 0, 2595, 0, 0, 0, 0, 0, 0, 0,
+
+ 2595, 2598, 0, 0, 0, 0, 2598, 0, 0, 0,
+ 0, 0, 2598, 0, 2598, 2598, 0, 2598, 0, 0,
+ 0, 0, 2598, 0, 0, 0, 0, 0, 0, 0,
+ 2598, 2599, 0, 0, 0, 2599, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2599, 0, 2599, 0, 0, 0,
+ 0, 2599, 0, 0, 0, 0, 0, 0, 0, 2599,
+ 2600, 0, 0, 0, 0, 0, 0, 0, 2600, 0,
+ 0, 0, 2600, 0, 2600, 0, 0, 0, 2600, 2600,
+ 0, 0, 0, 2600, 0, 0, 2600, 2601, 0, 0,
+ 0, 0, 0, 0, 2601, 0, 2601, 2601, 0, 2601,
+
+ 0, 0, 0, 0, 0, 0, 2601, 2601, 0, 0,
+ 0, 0, 0, 0, 2601, 2601, 2602, 0, 0, 0,
+ 0, 2602, 0, 0, 2602, 0, 2602, 2602, 0, 2602,
+ 2602, 0, 2602, 0, 0, 0, 2602, 2602, 0, 0,
+ 0, 0, 0, 0, 0, 2602, 2604, 0, 0, 0,
+ 0, 0, 0, 0, 2604, 0, 0, 0, 2604, 0,
+ 2604, 0, 0, 0, 2604, 2604, 0, 0, 0, 2604,
+ 0, 0, 2604, 2605, 0, 0, 0, 2605, 0, 2605,
+ 0, 0, 0, 2605, 2605, 0, 2605, 2605, 0, 2605,
+ 2605, 2605, 2605, 2605, 0, 2605, 2605, 0, 0, 2605,
+
+ 2605, 0, 2605, 0, 2605, 0, 0, 2605, 2605, 2606,
+ 0, 2606, 2606, 2606, 2606, 2606, 2606, 0, 0, 2606,
+ 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 0,
+ 2606, 2606, 2606, 0, 0, 0, 0, 0, 0, 2606,
+ 2606, 2607, 0, 0, 0, 0, 0, 0, 0, 2607,
+ 0, 0, 0, 2607, 0, 2607, 0, 0, 0, 2607,
+ 2607, 0, 0, 0, 2607, 0, 0, 2607, 2611, 2611,
+ 2611, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2611, 2611, 0, 0, 0,
+ 2611, 2611, 0, 0, 2611, 0, 0, 0, 0, 0,
+
+ 0, 0, 2611, 2617, 0, 0, 2617, 2617, 2617, 2617,
+ 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 0, 2617,
+ 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
+ 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2618,
+ 2618, 0, 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2619, 2619, 0, 2619, 2619,
+ 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619,
+ 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619,
+
+ 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619, 2619,
+ 2619, 2620, 2620, 0, 2620, 2620, 2620, 2620, 0, 2620,
+ 0, 2620, 2620, 2620, 2620, 2620, 2620, 2620, 2620, 2620,
+ 2620, 2620, 2620, 0, 2620, 2620, 2620, 0, 2620, 2620,
+ 0, 2620, 2620, 0, 0, 2620, 2620, 2621, 0, 0,
+ 0, 0, 2621, 0, 0, 0, 0, 2621, 2621, 2621,
+ 2621, 2621, 0, 2621, 0, 0, 0, 0, 2621, 0,
+ 0, 0, 0, 0, 0, 0, 2621, 2622, 0, 0,
+ 0, 0, 0, 0, 0, 2622, 0, 0, 2622, 2622,
+ 0, 2622, 0, 0, 0, 2622, 2622, 0, 2622, 0,
+
+ 2622, 0, 0, 2622, 2622, 0, 2622, 2624, 2624, 0,
+ 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624,
+ 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624,
+ 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624,
+ 2624, 2624, 2624, 2625, 2625, 0, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
+ 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2626,
+ 2626, 0, 2626, 2626, 2626, 2626, 0, 2626, 0, 2626,
+ 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
+
+ 2626, 0, 2626, 2626, 2626, 0, 2626, 2626, 0, 2626,
+ 2626, 0, 0, 2626, 2626, 2627, 2627, 0, 2627, 2627,
+ 2627, 2627, 0, 2627, 0, 2627, 2627, 2627, 2627, 2627,
+ 2627, 2627, 2627, 2627, 2627, 2627, 2627, 2627, 2627, 2627,
+ 2627, 0, 2627, 2627, 0, 2627, 2627, 0, 0, 2627,
+ 2627, 2628, 2628, 0, 2628, 2628, 2628, 2628, 0, 2628,
+ 0, 2628, 2628, 2628, 2628, 2628, 2628, 2628, 2628, 2628,
+ 2628, 2628, 2628, 0, 2628, 2628, 2628, 0, 2628, 2628,
+ 0, 2628, 2628, 0, 0, 2628, 2628, 2629, 0, 0,
+ 0, 0, 2629, 0, 0, 0, 0, 2629, 2629, 2629,
+
+ 2629, 2629, 0, 2629, 0, 0, 0, 0, 2629, 0,
+ 0, 0, 0, 0, 0, 0, 2629, 2635, 0, 0,
+ 0, 2635, 0, 0, 0, 0, 0, 2635, 0, 0,
+ 2635, 2635, 0, 2635, 0, 2635, 2635, 0, 0, 0,
+ 2635, 0, 0, 0, 2635, 0, 0, 0, 2635, 0,
+ 0, 2635, 2635, 2636, 2636, 0, 2636, 2636, 2636, 2636,
+ 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636,
+ 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636, 0,
+ 2636, 2636, 0, 2636, 2636, 2636, 2636, 2636, 2636, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 0, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 0, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 0, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 0, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2640, 0, 0, 0, 0, 2640, 0, 0, 0,
+ 0, 0, 2640, 0, 2640, 2640, 0, 2640, 0, 0,
+ 0, 0, 2640, 0, 0, 0, 0, 0, 0, 0,
+ 2640, 2641, 0, 0, 0, 2641, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 2641, 0, 2641, 0, 0, 0,
+ 0, 2641, 0, 0, 0, 0, 0, 0, 0, 2641,
+ 2642, 0, 0, 0, 0, 0, 0, 0, 2642, 0,
+ 0, 0, 2642, 0, 2642, 0, 0, 0, 2642, 2642,
+ 0, 0, 0, 2642, 0, 0, 2642, 2643, 0, 0,
+ 0, 0, 0, 0, 0, 2643, 0, 0, 0, 2643,
+ 0, 2643, 0, 0, 0, 2643, 2643, 0, 0, 0,
+ 2643, 0, 0, 2643, 2644, 0, 0, 0, 0, 2644,
+ 0, 0, 0, 0, 0, 2644, 0, 2644, 2644, 0,
+ 2644, 0, 0, 0, 0, 2644, 0, 0, 0, 0,
+
+ 0, 0, 0, 2644, 2645, 2645, 0, 2645, 2645, 2645,
+ 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645,
+ 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645,
+ 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645, 2645,
+ 2646, 2646, 0, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2651, 2651, 2651, 0,
+ 0, 0, 2651, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2651, 0, 0, 0, 0, 2651, 2651,
+
+ 0, 0, 2651, 0, 0, 0, 0, 0, 0, 0,
+ 2651, 2652, 2652, 2652, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2652, 2652,
+ 0, 0, 0, 2652, 2652, 0, 0, 2652, 0, 0,
+ 0, 0, 0, 0, 0, 2652, 2653, 2653, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 0, 2653,
+ 0, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
+ 2653, 2653, 2656, 0, 0, 0, 0, 2656, 0, 0,
+ 0, 0, 0, 2656, 0, 2656, 2656, 0, 2656, 0,
+
+ 0, 0, 0, 2656, 0, 0, 0, 0, 0, 0,
+ 0, 2656, 2657, 0, 0, 0, 0, 0, 0, 0,
+ 2657, 0, 0, 0, 2657, 0, 2657, 0, 0, 0,
+ 2657, 2657, 0, 0, 0, 2657, 0, 0, 2657, 2658,
+ 0, 0, 0, 0, 2658, 0, 0, 0, 0, 0,
+ 2658, 0, 2658, 2658, 0, 2658, 0, 0, 0, 0,
+ 2658, 0, 0, 0, 0, 0, 0, 0, 2658, 2659,
+ 0, 0, 0, 0, 2659, 0, 0, 2659, 0, 2659,
+ 2659, 0, 2659, 2659, 0, 2659, 0, 0, 0, 2659,
+ 2659, 0, 0, 0, 0, 0, 0, 0, 2659, 2660,
+
+ 0, 0, 0, 0, 2660, 0, 0, 2660, 0, 2660,
+ 2660, 0, 2660, 2660, 0, 2660, 0, 0, 0, 2660,
+ 2660, 0, 0, 0, 0, 0, 0, 0, 2660, 2661,
+ 0, 0, 0, 0, 0, 0, 0, 2661, 0, 0,
+ 0, 2661, 0, 2661, 0, 0, 0, 2661, 2661, 0,
+ 0, 0, 2661, 0, 0, 2661, 2662, 0, 2662, 2662,
+ 2662, 2662, 2662, 2662, 0, 0, 2662, 2662, 2662, 2662,
+ 2662, 2662, 2662, 2662, 0, 2662, 0, 2662, 2662, 2662,
+ 0, 0, 0, 0, 2662, 0, 2662, 2663, 0, 2663,
+ 2663, 2663, 2663, 2663, 2663, 0, 0, 2663, 2663, 2663,
+
+ 2663, 2663, 2663, 2663, 2663, 0, 2663, 0, 2663, 2663,
+ 2663, 0, 0, 0, 0, 2663, 0, 2663, 2663, 2664,
+ 0, 2664, 2664, 2664, 2664, 2664, 2664, 0, 0, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 0, 2664, 0,
+ 2664, 2664, 2664, 0, 0, 0, 0, 2664, 0, 2664,
+ 2664, 2665, 0, 2665, 2665, 2665, 2665, 2665, 2665, 0,
+ 0, 2665, 2665, 2665, 2665, 2665, 2665, 2665, 2665, 0,
+ 2665, 0, 2665, 2665, 2665, 0, 0, 0, 0, 2665,
+ 0, 2665, 2665, 2666, 0, 0, 0, 2666, 0, 2666,
+ 0, 0, 0, 2666, 2666, 0, 2666, 2666, 0, 2666,
+
+ 2666, 2666, 2666, 2666, 0, 2666, 2666, 0, 0, 2666,
+ 2666, 0, 2666, 0, 2666, 0, 0, 2666, 2666, 2667,
+ 0, 0, 0, 0, 0, 0, 0, 2667, 0, 0,
+ 0, 2667, 0, 2667, 0, 0, 0, 2667, 2667, 0,
+ 0, 0, 2667, 0, 0, 2667, 2669, 2669, 2669, 0,
+ 0, 0, 2669, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2669, 0, 0, 0, 0, 2669, 2669,
+ 0, 0, 2669, 0, 0, 0, 0, 0, 0, 0,
+ 2669, 2670, 2670, 2670, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2670, 2670,
+
+ 0, 0, 0, 2670, 2670, 0, 0, 2670, 0, 0,
+ 0, 0, 0, 0, 0, 2670, 2671, 2671, 2671, 2671,
+ 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671,
+ 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 0, 2671,
+ 0, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671,
+ 2671, 2671, 2676, 0, 0, 2676, 2676, 2676, 2676, 2676,
+ 2676, 2676, 2676, 2676, 2676, 2676, 2676, 0, 2676, 2676,
+ 2676, 2676, 2676, 2676, 2676, 2676, 2676, 2676, 2676, 2676,
+ 2676, 2676, 2676, 2676, 2676, 2676, 2676, 2676, 2677, 2677,
+ 0, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2678, 2678, 0, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2679, 2679, 0, 2679, 2679, 2679, 2679, 0, 2679, 0,
+ 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679,
+ 2679, 2679, 0, 2679, 2679, 2679, 0, 2679, 2679, 0,
+ 2679, 2679, 0, 0, 2679, 2679, 2682, 2682, 0, 2682,
+
+ 2682, 2682, 2682, 2682, 2682, 2682, 2682, 2682, 2682, 2682,
+ 2682, 2682, 2682, 2682, 2682, 2682, 2682, 2682, 2682, 2682,
+ 2682, 2682, 2682, 2682, 2682, 2682, 2682, 2682, 2682, 2682,
+ 2682, 2682, 2683, 2683, 0, 2683, 2683, 2683, 2683, 2683,
+ 2683, 2683, 2683, 2683, 2683, 2683, 2683, 2683, 2683, 2683,
+ 2683, 2683, 2683, 2683, 2683, 2683, 2683, 2683, 2683, 2683,
+ 2683, 2683, 2683, 2683, 2683, 2683, 2683, 2683, 2684, 2684,
+ 0, 2684, 2684, 2684, 2684, 0, 2684, 0, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 0, 2684, 2684, 2684, 0, 2684, 2684, 0, 2684, 2684,
+
+ 0, 0, 2684, 2684, 2687, 0, 0, 0, 2687, 0,
+ 0, 0, 0, 0, 2687, 0, 0, 2687, 2687, 0,
+ 2687, 0, 2687, 2687, 0, 0, 0, 2687, 0, 0,
+ 0, 2687, 0, 0, 0, 2687, 0, 0, 2687, 2687,
+ 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688,
+ 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, 2688, 0,
+ 2688, 2688, 2688, 2688, 2688, 2688, 2688, 0, 2688, 2688,
+ 2688, 2688, 2688, 2688, 2688, 2688, 2690, 0, 0, 0,
+ 0, 2690, 0, 0, 0, 0, 0, 2690, 0, 2690,
+ 2690, 0, 2690, 0, 0, 0, 0, 2690, 0, 0,
+
+ 0, 0, 0, 0, 0, 2690, 2691, 0, 0, 0,
+ 0, 0, 0, 0, 2691, 0, 0, 0, 2691, 0,
+ 2691, 0, 0, 0, 2691, 2691, 0, 0, 0, 2691,
+ 0, 0, 2691, 2692, 0, 0, 0, 0, 2692, 0,
+ 0, 0, 0, 0, 2692, 0, 2692, 2692, 0, 2692,
+ 0, 0, 0, 0, 2692, 0, 0, 0, 0, 0,
+ 0, 0, 2692, 2693, 0, 0, 0, 0, 2693, 0,
+ 0, 0, 0, 0, 2693, 0, 2693, 2693, 0, 2693,
+ 0, 0, 0, 0, 2693, 0, 0, 0, 0, 0,
+ 0, 0, 2693, 2694, 2694, 0, 2694, 2694, 2694, 2694,
+
+ 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694,
+ 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694,
+ 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2694, 2695,
+ 2695, 0, 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695,
+ 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695,
+ 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695,
+ 2695, 2695, 2695, 2695, 2695, 2699, 2699, 2699, 2699, 2699,
+ 0, 2699, 2699, 2699, 2699, 0, 2699, 2699, 2699, 2699,
+ 2699, 2699, 2699, 2699, 2699, 2699, 2699, 0, 2699, 2699,
+ 2699, 2699, 2699, 2699, 2699, 2699, 2699, 2699, 2699, 2699,
+
+ 2699, 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2703, 0, 0, 0, 0, 2703, 0,
+ 0, 0, 0, 0, 2703, 0, 2703, 2703, 0, 2703,
+ 0, 0, 0, 0, 2703, 0, 0, 0, 0, 0,
+
+ 0, 0, 2703, 2704, 0, 0, 0, 0, 0, 0,
+ 0, 2704, 0, 0, 0, 2704, 0, 2704, 0, 0,
+ 0, 2704, 2704, 0, 0, 0, 2704, 0, 0, 2704,
+ 2705, 0, 0, 0, 0, 2705, 0, 0, 0, 0,
+ 0, 2705, 0, 2705, 2705, 0, 2705, 0, 0, 0,
+ 0, 2705, 0, 0, 0, 0, 0, 0, 0, 2705,
+ 2706, 0, 0, 0, 0, 2706, 0, 0, 2706, 0,
+ 2706, 2706, 0, 2706, 2706, 0, 2706, 0, 0, 0,
+ 2706, 2706, 0, 0, 0, 0, 0, 0, 0, 2706,
+ 2707, 0, 0, 0, 0, 2707, 0, 0, 2707, 0,
+
+ 2707, 2707, 0, 2707, 2707, 0, 2707, 0, 0, 0,
+ 2707, 2707, 0, 0, 0, 0, 0, 0, 0, 2707,
+ 2708, 0, 0, 0, 0, 0, 0, 0, 2708, 0,
+ 0, 0, 2708, 0, 2708, 0, 0, 0, 2708, 2708,
+ 0, 0, 0, 2708, 0, 0, 2708, 2709, 0, 2709,
+ 2709, 2709, 2709, 2709, 0, 2709, 0, 2709, 2709, 2709,
+ 2709, 2709, 2709, 2709, 2709, 0, 2709, 0, 2709, 2709,
+ 2709, 0, 0, 0, 0, 0, 2709, 2709, 2710, 0,
+ 2710, 2710, 2710, 2710, 2710, 2710, 0, 0, 2710, 2710,
+ 2710, 2710, 2710, 2710, 2710, 2710, 0, 2710, 0, 2710,
+
+ 2710, 2710, 0, 0, 0, 0, 2710, 0, 2710, 2710,
+ 2711, 0, 2711, 2711, 2711, 2711, 2711, 2711, 0, 0,
+ 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711,
+ 0, 2711, 2711, 2711, 0, 0, 0, 0, 2711, 0,
+ 2711, 2711, 2712, 0, 2712, 2712, 2712, 2712, 2712, 2712,
+ 0, 0, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712,
+ 0, 2712, 0, 2712, 2712, 2712, 0, 0, 0, 0,
+ 2712, 0, 2712, 2712, 2713, 0, 2713, 2713, 2713, 2713,
+ 2713, 2713, 0, 0, 2713, 2713, 2713, 2713, 2713, 2713,
+ 2713, 2713, 0, 2713, 0, 2713, 2713, 2713, 0, 0,
+
+ 0, 0, 2713, 0, 2713, 2713, 2714, 0, 2714, 2714,
+ 2714, 2714, 2714, 2714, 0, 0, 2714, 2714, 2714, 2714,
+ 2714, 2714, 2714, 2714, 2714, 2714, 0, 2714, 2714, 2714,
+ 0, 0, 0, 0, 2714, 0, 2714, 2714, 2715, 0,
+ 0, 0, 2715, 0, 2715, 0, 0, 0, 2715, 2715,
+ 0, 2715, 2715, 0, 2715, 2715, 2715, 2715, 2715, 0,
+ 2715, 2715, 0, 0, 2715, 2715, 0, 2715, 0, 2715,
+ 0, 0, 2715, 2715, 2716, 2716, 2716, 2716, 2716, 0,
+ 2716, 2716, 2716, 2716, 0, 2716, 2716, 2716, 2716, 2716,
+ 2716, 2716, 2716, 2716, 2716, 2716, 0, 2716, 2716, 2716,
+
+ 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2721, 2721, 0, 2721, 2721, 2721, 2721, 2721,
+ 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721,
+
+ 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721,
+ 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2722, 2722,
+ 0, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722,
+ 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722,
+ 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722,
+ 2722, 2722, 2722, 2722, 2723, 2723, 0, 2723, 2723, 2723,
+ 2723, 0, 2723, 0, 2723, 2723, 2723, 2723, 2723, 2723,
+ 2723, 2723, 2723, 2723, 2723, 2723, 0, 2723, 2723, 2723,
+ 0, 2723, 2723, 0, 2723, 2723, 0, 0, 2723, 2723,
+ 2724, 2724, 0, 2724, 2724, 2724, 2724, 0, 2724, 0,
+
+ 2724, 2724, 2724, 2724, 2724, 2724, 2724, 2724, 2724, 2724,
+ 2724, 2724, 2724, 2724, 2724, 2724, 0, 2724, 2724, 0,
+ 2724, 2724, 0, 0, 2724, 2724, 2725, 2725, 0, 2725,
+ 2725, 2725, 2725, 2725, 2725, 2725, 2725, 2725, 2725, 2725,
+ 2725, 2725, 2725, 2725, 2725, 2725, 2725, 2725, 2725, 2725,
+ 2725, 2725, 2725, 2725, 2725, 2725, 2725, 2725, 2725, 2725,
+ 2725, 2725, 2726, 2726, 0, 2726, 2726, 2726, 2726, 2726,
+ 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
+ 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
+ 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2727, 2727,
+
+ 0, 2727, 2727, 2727, 2727, 0, 2727, 0, 2727, 2727,
+ 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727,
+ 0, 2727, 2727, 2727, 0, 2727, 2727, 0, 2727, 2727,
+ 0, 0, 2727, 2727, 2728, 2728, 0, 2728, 2728, 2728,
+ 2728, 0, 2728, 0, 2728, 2728, 2728, 2728, 2728, 2728,
+ 2728, 2728, 2728, 2728, 2728, 2728, 2728, 2728, 2728, 2728,
+ 0, 2728, 2728, 0, 2728, 2728, 0, 0, 2728, 2728,
+ 2730, 0, 0, 0, 2730, 0, 0, 0, 0, 0,
+ 2730, 0, 0, 2730, 2730, 0, 2730, 0, 2730, 2730,
+ 0, 0, 0, 2730, 0, 0, 0, 2730, 0, 0,
+
+ 0, 2730, 0, 0, 2730, 2730, 2731, 0, 0, 0,
+ 0, 2731, 0, 0, 0, 0, 0, 2731, 0, 2731,
+ 2731, 0, 2731, 0, 0, 0, 0, 2731, 0, 0,
+ 0, 0, 0, 0, 0, 2731, 2732, 0, 0, 0,
+ 0, 0, 0, 0, 2732, 0, 0, 0, 2732, 0,
+ 2732, 0, 0, 0, 2732, 2732, 0, 0, 0, 2732,
+ 0, 0, 2732, 2733, 0, 0, 0, 0, 2733, 0,
+ 0, 0, 0, 0, 2733, 0, 2733, 2733, 0, 2733,
+ 0, 0, 0, 0, 2733, 0, 0, 0, 0, 0,
+ 0, 0, 2733, 2734, 0, 0, 0, 0, 2734, 0,
+
+ 0, 0, 0, 0, 2734, 0, 2734, 2734, 0, 2734,
+ 0, 0, 0, 0, 2734, 0, 0, 0, 0, 0,
+ 0, 0, 2734, 2735, 2735, 0, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2737,
+ 2737, 0, 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
+ 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
+ 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
+ 2737, 2737, 2737, 2737, 2737, 2738, 2738, 0, 2738, 2738,
+
+ 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738,
+ 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738,
+ 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738, 2738,
+ 2738, 2739, 2739, 2739, 2739, 2739, 0, 2739, 2739, 2739,
+ 2739, 0, 2739, 2739, 2739, 2739, 2739, 2739, 2739, 2739,
+ 2739, 2739, 2739, 0, 2739, 2739, 2739, 2739, 2739, 2739,
+ 2739, 2739, 2739, 2739, 2739, 2739, 2739, 2740, 2740, 2740,
+ 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740,
+ 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740,
+ 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740,
+
+ 2740, 2740, 2740, 2741, 2741, 2741, 2741, 2741, 2741, 2741,
+ 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741,
+ 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741,
+ 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2743,
+ 0, 0, 0, 0, 2743, 0, 0, 0, 0, 0,
+ 2743, 0, 2743, 2743, 0, 2743, 0, 0, 0, 0,
+ 2743, 0, 0, 0, 0, 0, 0, 0, 2743, 2744,
+ 0, 0, 0, 0, 2744, 0, 0, 0, 0, 0,
+ 2744, 0, 2744, 2744, 0, 2744, 0, 0, 0, 0,
+ 2744, 0, 0, 0, 0, 0, 0, 0, 2744, 2745,
+
+ 0, 0, 0, 0, 2745, 0, 0, 2745, 0, 2745,
+ 2745, 0, 2745, 2745, 0, 2745, 0, 0, 0, 2745,
+ 2745, 0, 0, 0, 0, 0, 0, 0, 2745, 2746,
+ 0, 0, 0, 0, 2746, 0, 0, 2746, 0, 2746,
+ 2746, 0, 2746, 2746, 0, 2746, 0, 0, 0, 2746,
+ 2746, 0, 0, 0, 0, 0, 0, 0, 2746, 2747,
+ 0, 0, 0, 0, 0, 0, 0, 2747, 0, 0,
+ 0, 2747, 0, 2747, 0, 0, 0, 2747, 2747, 0,
+ 0, 0, 2747, 0, 0, 2747, 2748, 0, 2748, 2748,
+ 2748, 2748, 2748, 0, 2748, 0, 2748, 2748, 2748, 2748,
+
+ 2748, 2748, 2748, 2748, 0, 2748, 0, 2748, 2748, 2748,
+ 0, 0, 0, 0, 0, 2748, 2748, 2749, 0, 2749,
+ 2749, 2749, 2749, 2749, 0, 0, 0, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 0, 2749, 0, 2749, 2749,
+ 2749, 0, 0, 0, 0, 0, 0, 2749, 2750, 0,
+ 2750, 2750, 2750, 2750, 2750, 2750, 0, 0, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 0, 2750, 0, 2750,
+ 2750, 2750, 0, 0, 0, 0, 2750, 0, 2750, 2750,
+ 2751, 0, 0, 2751, 0, 2751, 2751, 2751, 2751, 2751,
+ 0, 2751, 2751, 2751, 2751, 2751, 2751, 2751, 2751, 2751,
+
+ 2751, 2751, 2751, 2751, 2751, 2751, 2751, 2751, 0, 2751,
+ 0, 0, 2751, 2751, 2752, 0, 2752, 2752, 2752, 2752,
+ 2752, 2752, 0, 0, 2752, 2752, 2752, 2752, 2752, 2752,
+ 2752, 2752, 2752, 2752, 0, 2752, 2752, 2752, 0, 0,
+ 0, 0, 2752, 0, 2752, 2752, 2753, 0, 2753, 2753,
+ 2753, 2753, 2753, 2753, 0, 0, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2753, 2753, 2753, 2753, 0, 2753, 2753, 2753,
+ 0, 0, 0, 0, 2753, 0, 2753, 2753, 2754, 0,
+ 2754, 2754, 2754, 2754, 2754, 2754, 0, 0, 2754, 2754,
+ 2754, 2754, 2754, 2754, 2754, 2754, 0, 2754, 0, 2754,
+
+ 2754, 2754, 0, 0, 0, 0, 2754, 0, 2754, 2754,
+ 2755, 0, 2755, 2755, 2755, 2755, 2755, 2755, 0, 0,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 0, 2755, 2755, 2755, 0, 0, 0, 0, 2755, 0,
+ 2755, 2755, 2756, 0, 0, 0, 2756, 0, 2756, 0,
+ 0, 0, 2756, 2756, 0, 2756, 2756, 0, 2756, 2756,
+ 2756, 2756, 2756, 0, 2756, 2756, 0, 0, 2756, 2756,
+ 0, 2756, 0, 2756, 0, 0, 2756, 2756, 2757, 2757,
+ 2757, 2757, 2757, 0, 2757, 2757, 2757, 2757, 0, 2757,
+ 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
+
+ 0, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757,
+ 2757, 2757, 2757, 2757, 2758, 2758, 2758, 2758, 2758, 2758,
+ 2758, 2758, 2758, 2758, 2758, 2758, 2758, 2758, 2758, 2758,
+ 2758, 2758, 2758, 2758, 2758, 2758, 2758, 2758, 2758, 2758,
+ 2758, 2758, 2758, 2758, 2758, 2758, 2758, 2758, 2758, 2758,
+ 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759,
+ 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759,
+ 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759,
+ 2759, 2759, 2759, 2759, 2759, 2759, 2762, 2762, 0, 2762,
+ 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762,
+
+ 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762,
+ 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762,
+ 2762, 2762, 2763, 2763, 0, 2763, 2763, 2763, 2763, 2763,
+ 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763,
+ 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763,
+ 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2764, 2764,
+ 0, 2764, 2764, 2764, 2764, 0, 2764, 0, 2764, 2764,
+ 2764, 2764, 2764, 2764, 2764, 2764, 2764, 2764, 2764, 2764,
+ 0, 2764, 2764, 2764, 0, 2764, 2764, 0, 2764, 2764,
+ 0, 0, 2764, 2764, 2765, 2765, 0, 2765, 2765, 2765,
+
+ 2765, 2765, 2765, 2765, 2765, 2765, 2765, 2765, 2765, 2765,
+ 2765, 2765, 2765, 2765, 2765, 2765, 2765, 2765, 2765, 2765,
+ 2765, 2765, 2765, 2765, 2765, 2765, 2765, 2765, 2765, 2765,
+ 2766, 2766, 0, 2766, 2766, 2766, 2766, 2766, 2766, 2766,
+ 2766, 2766, 2766, 2766, 2766, 2766, 2766, 2766, 2766, 2766,
+ 2766, 2766, 2766, 2766, 2766, 2766, 2766, 2766, 2766, 2766,
+ 2766, 2766, 2766, 2766, 2766, 2766, 2767, 2767, 0, 2767,
+ 2767, 2767, 2767, 0, 2767, 0, 2767, 2767, 2767, 2767,
+ 2767, 2767, 2767, 2767, 2767, 2767, 2767, 2767, 0, 2767,
+ 2767, 2767, 0, 2767, 2767, 0, 2767, 2767, 0, 0,
+
+ 2767, 2767, 2768, 2768, 0, 2768, 2768, 2768, 2768, 0,
+ 2768, 0, 2768, 2768, 2768, 2768, 2768, 2768, 2768, 2768,
+ 2768, 2768, 2768, 2768, 2768, 2768, 2768, 2768, 0, 2768,
+ 2768, 0, 2768, 2768, 0, 0, 2768, 2768, 2769, 2769,
+ 0, 2769, 2769, 2769, 2769, 0, 2769, 0, 2769, 2769,
+ 2769, 2769, 2769, 2769, 2769, 2769, 2769, 2769, 2769, 2769,
+ 0, 2769, 2769, 2769, 0, 2769, 2769, 0, 2769, 2769,
+ 0, 0, 2769, 2769, 2771, 0, 0, 0, 2771, 0,
+ 0, 0, 0, 0, 2771, 0, 0, 2771, 2771, 0,
+ 2771, 0, 2771, 2771, 0, 0, 0, 2771, 0, 0,
+
+ 0, 2771, 0, 0, 0, 2771, 0, 0, 2771, 2771,
+ 2772, 0, 0, 0, 0, 2772, 0, 0, 0, 0,
+ 0, 2772, 0, 2772, 2772, 0, 2772, 0, 0, 0,
+ 0, 2772, 0, 0, 0, 0, 0, 0, 0, 2772,
+ 2773, 0, 0, 0, 0, 2773, 0, 0, 0, 0,
+ 0, 2773, 0, 2773, 2773, 0, 2773, 0, 0, 0,
+ 0, 2773, 0, 0, 0, 0, 0, 0, 0, 2773,
+ 2774, 0, 0, 0, 0, 2774, 0, 0, 0, 0,
+ 0, 2774, 0, 2774, 2774, 0, 2774, 0, 0, 0,
+ 0, 2774, 0, 0, 0, 0, 0, 0, 0, 2774,
+
+ 2775, 2775, 0, 2775, 2775, 2775, 2775, 2775, 2775, 2775,
+ 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775,
+ 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775, 2775,
+ 2775, 2775, 2775, 2775, 2775, 2775, 2776, 2776, 0, 2776,
+ 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776,
+ 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776,
+ 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776, 2776,
+ 2776, 2776, 2777, 2777, 0, 2777, 2777, 2777, 2777, 2777,
+ 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777,
+ 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777,
+
+ 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2779, 0,
+ 0, 0, 0, 2779, 0, 0, 0, 0, 0, 2779,
+ 0, 2779, 2779, 0, 2779, 0, 0, 0, 0, 2779,
+ 0, 0, 0, 0, 0, 0, 0, 2779, 2780, 0,
+ 0, 0, 0, 2780, 0, 0, 0, 0, 0, 2780,
+ 0, 2780, 2780, 0, 2780, 0, 0, 0, 0, 2780,
+ 0, 0, 0, 0, 0, 0, 0, 2780, 2781, 2781,
+ 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2781,
+ 2781, 2781, 2781, 2781, 2781, 2781, 2781, 0, 2781, 2781,
+ 2781, 2781, 2781, 2781, 2781, 0, 2781, 2781, 2781, 2781,
+
+ 2781, 2781, 2781, 2781, 2782, 0, 0, 0, 0, 2782,
+ 0, 0, 2782, 0, 2782, 2782, 0, 2782, 2782, 0,
+ 2782, 0, 0, 0, 2782, 2782, 0, 0, 0, 0,
+ 0, 0, 0, 2782, 2783, 0, 0, 0, 0, 2783,
+ 0, 0, 2783, 0, 2783, 2783, 0, 2783, 2783, 0,
+ 2783, 0, 0, 0, 2783, 2783, 0, 0, 0, 0,
+ 0, 0, 0, 2783, 2784, 0, 0, 0, 0, 0,
+ 0, 0, 2784, 0, 0, 0, 2784, 0, 2784, 0,
+ 0, 0, 2784, 2784, 0, 0, 0, 2784, 0, 0,
+ 2784, 2785, 0, 2785, 2785, 2785, 2785, 2785, 2785, 0,
+
+ 0, 2785, 2785, 2785, 2785, 2785, 2785, 2785, 2785, 0,
+ 2785, 0, 2785, 2785, 2785, 0, 0, 0, 0, 2785,
+ 0, 2785, 2785, 2786, 0, 2786, 2786, 2786, 2786, 2786,
+ 2786, 0, 0, 2786, 2786, 2786, 2786, 2786, 2786, 2786,
+ 2786, 2786, 2786, 0, 2786, 2786, 2786, 0, 0, 0,
+ 0, 2786, 0, 2786, 2786, 2787, 0, 0, 2787, 0,
+ 2787, 2787, 2787, 2787, 2787, 0, 2787, 2787, 2787, 2787,
+ 2787, 2787, 2787, 2787, 2787, 2787, 2787, 2787, 2787, 2787,
+ 2787, 2787, 2787, 0, 2787, 0, 0, 2787, 2787, 2788,
+ 0, 2788, 2788, 0, 2788, 2788, 2788, 2788, 2788, 0,
+
+ 0, 0, 2788, 2788, 2788, 2788, 2788, 2788, 2788, 2788,
+ 0, 2788, 0, 2788, 2788, 2788, 0, 0, 0, 0,
+ 0, 0, 2788, 2789, 0, 2789, 2789, 2789, 2789, 2789,
+ 2789, 0, 0, 2789, 2789, 2789, 2789, 2789, 2789, 2789,
+ 2789, 2789, 2789, 0, 2789, 2789, 2789, 0, 0, 0,
+ 0, 2789, 0, 2789, 2789, 2790, 0, 2790, 2790, 2790,
+ 2790, 2790, 2790, 0, 0, 2790, 2790, 2790, 2790, 2790,
+ 2790, 2790, 2790, 2790, 2790, 0, 2790, 2790, 2790, 0,
+ 0, 0, 0, 2790, 0, 2790, 2790, 2791, 2791, 0,
+ 2791, 2791, 0, 2791, 0, 2791, 2791, 2791, 2791, 0,
+
+ 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791, 0, 2791,
+ 2791, 2791, 0, 2791, 2791, 2791, 2791, 0, 2791, 0,
+ 0, 2791, 2791, 2794, 2794, 0, 2794, 2794, 2794, 2794,
+ 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794,
+ 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794,
+ 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2794, 2795,
+ 2795, 0, 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795,
+ 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795,
+ 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795,
+ 2795, 2795, 2795, 2795, 2795, 2796, 2796, 0, 2796, 2796,
+
+ 2796, 2796, 0, 2796, 0, 2796, 2796, 2796, 2796, 2796,
+ 2796, 2796, 2796, 2796, 2796, 2796, 2796, 0, 2796, 2796,
+ 2796, 0, 2796, 2796, 0, 2796, 2796, 0, 0, 2796,
+ 2796, 2797, 2797, 0, 2797, 2797, 2797, 2797, 2797, 2797,
+ 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
+ 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
+ 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2798, 2798, 0,
+ 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798,
+ 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798,
+ 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798, 2798,
+
+ 2798, 2798, 2798, 2799, 2799, 0, 2799, 2799, 2799, 2799,
+ 0, 2799, 0, 2799, 2799, 2799, 2799, 2799, 2799, 2799,
+ 2799, 2799, 2799, 2799, 2799, 0, 2799, 2799, 2799, 0,
+ 2799, 2799, 0, 2799, 2799, 0, 0, 2799, 2799, 2801,
+ 2801, 0, 2801, 2801, 0, 0, 0, 0, 0, 2801,
+ 0, 0, 2801, 2801, 0, 2801, 0, 2801, 2801, 0,
+ 0, 2801, 2801, 0, 0, 0, 2801, 0, 0, 0,
+ 2801, 0, 0, 2801, 2801, 2802, 2802, 2802, 2802, 2802,
+ 2802, 2802, 2802, 2802, 2802, 2802, 2802, 2802, 2802, 2802,
+ 2802, 2802, 2802, 2802, 0, 2802, 2802, 2802, 2802, 2802,
+
+ 2802, 2802, 0, 2802, 2802, 2802, 2802, 2802, 2802, 2802,
+ 2802, 2803, 0, 0, 0, 0, 2803, 0, 0, 0,
+ 0, 0, 2803, 0, 2803, 2803, 0, 2803, 0, 0,
+ 0, 0, 2803, 0, 0, 0, 0, 0, 0, 0,
+ 2803, 2804, 0, 0, 0, 0, 2804, 0, 0, 0,
+ 0, 0, 2804, 0, 2804, 2804, 0, 2804, 0, 0,
+ 0, 0, 2804, 0, 0, 0, 0, 0, 0, 0,
+ 2804, 2805, 0, 2805, 2805, 0, 2805, 0, 2805, 2805,
+ 0, 2805, 0, 2805, 2805, 2805, 2805, 2805, 2805, 2805,
+ 2805, 0, 2805, 2805, 2805, 0, 0, 2805, 2805, 0,
+
+ 0, 2805, 0, 0, 2805, 2805, 2806, 2806, 0, 2806,
+ 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
+ 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
+ 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806, 2806,
+ 2806, 2806, 2807, 2807, 0, 2807, 2807, 2807, 2807, 2807,
+ 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807,
+ 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807,
+ 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2809, 0,
+ 0, 0, 0, 2809, 0, 0, 0, 0, 0, 2809,
+ 0, 2809, 2809, 0, 2809, 0, 0, 0, 0, 2809,
+
+ 0, 0, 0, 0, 0, 0, 0, 2809, 2810, 0,
+ 0, 0, 0, 2810, 0, 0, 0, 0, 0, 2810,
+ 0, 2810, 2810, 0, 2810, 0, 0, 0, 0, 2810,
+ 0, 0, 0, 0, 0, 0, 0, 2810, 2811, 0,
+ 0, 0, 0, 2811, 0, 0, 2811, 0, 2811, 2811,
+ 0, 2811, 2811, 0, 2811, 0, 0, 0, 2811, 2811,
+ 0, 0, 0, 0, 0, 0, 0, 2811, 2812, 0,
+ 0, 0, 0, 2812, 0, 0, 2812, 0, 2812, 2812,
+ 0, 2812, 2812, 0, 2812, 0, 0, 0, 2812, 2812,
+ 0, 0, 0, 0, 0, 0, 0, 2812, 2813, 0,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 0, 0, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 0, 2813,
+ 2813, 2813, 0, 0, 0, 0, 2813, 0, 2813, 2813,
+ 2814, 0, 2814, 2814, 2814, 2814, 2814, 2814, 0, 0,
+ 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 0, 2814,
+ 0, 2814, 2814, 2814, 0, 0, 0, 0, 2814, 0,
+ 2814, 2815, 0, 2815, 2815, 2815, 2815, 2815, 2815, 0,
+ 0, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815,
+ 2815, 0, 2815, 2815, 2815, 0, 0, 0, 0, 2815,
+ 0, 2815, 2815, 2816, 0, 0, 0, 0, 0, 0,
+
+ 0, 2816, 0, 0, 2816, 2816, 0, 2816, 0, 0,
+ 0, 2816, 2816, 0, 2816, 0, 2816, 0, 0, 2816,
+ 2816, 0, 2816, 2817, 0, 0, 0, 2817, 0, 0,
+ 0, 0, 0, 2817, 2817, 0, 2817, 2817, 0, 2817,
+ 2817, 2817, 2817, 0, 0, 0, 2817, 0, 0, 2817,
+ 2817, 0, 0, 0, 2817, 0, 0, 2817, 2817, 2818,
+ 0, 0, 0, 2818, 0, 0, 0, 0, 0, 2818,
+ 2818, 0, 2818, 2818, 0, 2818, 2818, 2818, 2818, 0,
+ 0, 0, 2818, 2818, 0, 2818, 2818, 0, 2818, 0,
+ 2818, 0, 0, 2818, 2818, 2819, 0, 0, 0, 2819,
+
+ 0, 0, 0, 0, 0, 2819, 2819, 0, 2819, 2819,
+ 0, 2819, 0, 2819, 2819, 0, 0, 0, 2819, 0,
+ 0, 0, 2819, 0, 0, 0, 2819, 0, 0, 2819,
+ 2819, 2822, 2822, 0, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2823, 2823, 0,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+
+ 2823, 2823, 2823, 2824, 2824, 0, 2824, 2824, 2824, 2824,
+ 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824,
+ 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824,
+ 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2825,
+ 2825, 0, 2825, 2825, 2825, 2825, 0, 2825, 0, 2825,
+ 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825,
+ 2825, 0, 2825, 2825, 2825, 0, 2825, 2825, 0, 2825,
+ 2825, 0, 0, 2825, 2825, 2826, 2826, 0, 2826, 2826,
+ 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826,
+ 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826,
+
+ 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826,
+ 2826, 2827, 2827, 0, 2827, 2827, 2827, 2827, 0, 2827,
+ 0, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
+ 2827, 2827, 2827, 0, 2827, 2827, 2827, 0, 2827, 2827,
+ 0, 2827, 2827, 0, 0, 2827, 2827, 2830, 2830, 2830,
+ 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
+ 2830, 2830, 2830, 2830, 2830, 2830, 0, 2830, 2830, 2830,
+ 2830, 2830, 2830, 2830, 0, 2830, 2830, 2830, 2830, 2830,
+ 2830, 2830, 2830, 2831, 2831, 2831, 2831, 2831, 2831, 2831,
+ 2831, 2831, 2831, 2831, 2831, 2831, 2831, 2831, 2831, 2831,
+
+ 2831, 2831, 0, 2831, 2831, 2831, 2831, 2831, 2831, 2831,
+ 0, 2831, 2831, 2831, 2831, 2831, 2831, 2831, 2831, 2832,
+ 0, 0, 0, 0, 2832, 0, 0, 0, 0, 0,
+ 2832, 0, 2832, 2832, 0, 2832, 0, 0, 0, 0,
+ 2832, 0, 0, 0, 0, 0, 0, 0, 2832, 2833,
+ 0, 0, 0, 0, 2833, 0, 0, 0, 0, 0,
+ 2833, 0, 2833, 2833, 0, 2833, 0, 0, 0, 0,
+ 2833, 0, 0, 0, 0, 0, 0, 0, 2833, 2834,
+ 2834, 0, 2834, 2834, 2834, 2834, 2834, 2834, 2834, 2834,
+ 2834, 2834, 2834, 2834, 2834, 2834, 0, 2834, 2834, 2834,
+
+ 2834, 2834, 2834, 2834, 2834, 2834, 2834, 2834, 2834, 2834,
+ 2834, 2834, 2834, 2834, 2834, 2835, 0, 2835, 0, 0,
+ 0, 0, 0, 2835, 0, 2835, 0, 2835, 0, 2835,
+ 0, 0, 0, 2835, 2835, 0, 2835, 2835, 2835, 0,
+ 0, 2835, 2836, 0, 0, 0, 0, 2836, 0, 0,
+ 0, 0, 0, 2836, 0, 2836, 2836, 0, 2836, 0,
+ 0, 0, 0, 2836, 0, 0, 0, 0, 0, 0,
+ 0, 2836, 2837, 0, 2837, 2837, 0, 2837, 0, 2837,
+ 2837, 0, 2837, 0, 2837, 2837, 2837, 2837, 2837, 2837,
+ 2837, 2837, 0, 2837, 2837, 2837, 0, 0, 2837, 2837,
+
+ 0, 0, 2837, 0, 0, 2837, 2837, 2838, 0, 0,
+ 0, 0, 2838, 0, 0, 2838, 0, 2838, 2838, 0,
+ 2838, 2838, 0, 2838, 0, 0, 0, 2838, 2838, 0,
+ 0, 0, 0, 0, 0, 0, 2838, 2839, 0, 2839,
+ 2839, 0, 2839, 0, 2839, 2839, 0, 2839, 0, 2839,
+ 2839, 2839, 2839, 2839, 2839, 2839, 2839, 0, 2839, 2839,
+ 2839, 0, 2839, 2839, 2839, 0, 0, 2839, 0, 0,
+ 2839, 2839, 2840, 0, 2840, 2840, 2840, 2840, 2840, 2840,
+ 0, 0, 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+ 2840, 2840, 0, 2840, 2840, 2840, 0, 0, 0, 0,
+
+ 2840, 0, 2840, 2840, 2841, 0, 2841, 2841, 2841, 2841,
+ 2841, 2841, 0, 0, 2841, 2841, 2841, 2841, 2841, 2841,
+ 2841, 2841, 0, 2841, 0, 2841, 2841, 2841, 0, 0,
+ 0, 0, 2841, 0, 2841, 2842, 0, 2842, 2842, 2842,
+ 2842, 2842, 2842, 0, 0, 2842, 2842, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 0, 2842, 2842, 2842, 0,
+ 0, 0, 0, 2842, 0, 2842, 2842, 2843, 0, 0,
+ 0, 0, 0, 0, 0, 2843, 0, 0, 2843, 2843,
+ 0, 2843, 0, 0, 0, 2843, 2843, 0, 2843, 0,
+ 2843, 0, 0, 2843, 2843, 0, 2843, 2844, 0, 0,
+
+ 0, 2844, 0, 0, 0, 0, 0, 2844, 2844, 0,
+ 2844, 2844, 0, 2844, 2844, 2844, 2844, 0, 0, 0,
+ 2844, 0, 0, 2844, 2844, 0, 0, 0, 2844, 0,
+ 0, 2844, 2844, 2845, 0, 0, 0, 2845, 0, 0,
+ 0, 0, 0, 2845, 2845, 0, 2845, 2845, 0, 2845,
+ 2845, 2845, 2845, 0, 0, 0, 2845, 0, 0, 2845,
+ 2845, 0, 2845, 0, 2845, 0, 0, 2845, 2845, 2846,
+ 0, 0, 0, 0, 0, 0, 0, 2846, 0, 0,
+ 0, 2846, 0, 2846, 0, 0, 0, 2846, 2846, 0,
+ 0, 0, 2846, 0, 0, 2846, 2847, 2847, 0, 2847,
+
+ 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847,
+ 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847,
+ 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847, 2847,
+ 2847, 2847, 2848, 2848, 0, 2848, 2848, 2848, 2848, 2848,
+ 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848,
+ 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848,
+ 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2848, 2849, 2849,
+ 0, 2849, 2849, 2849, 2849, 0, 2849, 0, 2849, 2849,
+ 2849, 2849, 2849, 2849, 2849, 2849, 2849, 2849, 2849, 2849,
+ 0, 2849, 2849, 2849, 0, 2849, 2849, 0, 2849, 2849,
+
+ 0, 0, 2849, 2849, 2850, 2850, 0, 2850, 2850, 2850,
+ 2850, 0, 2850, 0, 2850, 2850, 2850, 2850, 2850, 2850,
+ 2850, 2850, 2850, 2850, 2850, 2850, 0, 2850, 2850, 2850,
+ 0, 2850, 2850, 0, 2850, 2850, 0, 0, 2850, 2850,
+ 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851,
+ 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851, 0,
+ 2851, 2851, 2851, 2851, 2851, 2851, 2851, 0, 2851, 2851,
+ 2851, 2851, 2851, 2851, 2851, 2851, 2852, 0, 0, 0,
+ 0, 2852, 0, 0, 0, 0, 0, 2852, 0, 2852,
+ 2852, 0, 2852, 0, 0, 0, 0, 2852, 0, 0,
+
+ 0, 0, 0, 0, 0, 2852, 2853, 0, 2853, 2853,
+ 0, 2853, 0, 2853, 2853, 0, 2853, 0, 2853, 2853,
+ 2853, 2853, 2853, 2853, 2853, 2853, 0, 2853, 2853, 2853,
+ 0, 0, 2853, 2853, 0, 0, 2853, 0, 0, 2853,
+ 2853, 2854, 2854, 0, 0, 2854, 2854, 2854, 2854, 2854,
+ 2854, 2854, 2854, 2854, 2854, 2854, 0, 2854, 0, 2854,
+ 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
+ 2854, 2854, 2854, 2854, 2854, 2854, 2854, 2855, 2855, 0,
+ 2855, 2855, 2855, 2855, 2855, 2855, 2855, 2855, 2855, 2855,
+ 2855, 2855, 2855, 2855, 0, 2855, 2855, 2855, 2855, 2855,
+
+ 2855, 2855, 2855, 2855, 2855, 2855, 2855, 2855, 2855, 2855,
+ 2855, 2855, 2855, 2856, 0, 0, 0, 0, 0, 0,
+ 0, 2856, 0, 0, 2856, 2856, 0, 2856, 0, 0,
+ 0, 2856, 2856, 0, 2856, 0, 2856, 0, 0, 2856,
+ 2856, 0, 2856, 2857, 0, 2857, 0, 0, 0, 0,
+ 0, 2857, 0, 0, 0, 2857, 0, 2857, 0, 0,
+ 0, 2857, 2857, 0, 0, 0, 2857, 0, 0, 2857,
+ 2858, 2858, 0, 2858, 2858, 2858, 2858, 2858, 2858, 2858,
+ 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858,
+ 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858, 2858,
+
+ 2858, 2858, 2858, 2858, 2858, 2858, 2859, 0, 0, 0,
+ 0, 2859, 0, 0, 0, 0, 0, 2859, 0, 2859,
+ 2859, 0, 2859, 0, 0, 0, 0, 2859, 0, 0,
+ 0, 0, 0, 0, 0, 2859, 2860, 2860, 0, 2860,
+ 2860, 2860, 2860, 2860, 2860, 2860, 2860, 2860, 2860, 2860,
+ 2860, 2860, 2860, 0, 2860, 2860, 2860, 2860, 2860, 2860,
+ 2860, 2860, 2860, 2860, 2860, 2860, 2860, 2860, 2860, 2860,
+ 2860, 2860, 2861, 0, 0, 0, 0, 0, 0, 0,
+ 2861, 0, 0, 2861, 2861, 0, 2861, 0, 0, 0,
+ 2861, 2861, 0, 2861, 0, 2861, 0, 0, 2861, 2861,
+
+ 0, 2861, 2862, 0, 2862, 0, 0, 0, 0, 0,
+ 2862, 0, 2862, 0, 2862, 0, 2862, 0, 0, 0,
+ 2862, 2862, 0, 2862, 2862, 2862, 0, 0, 2862, 2863,
+ 0, 0, 0, 0, 2863, 0, 0, 2863, 0, 2863,
+ 2863, 0, 2863, 2863, 0, 2863, 0, 0, 0, 2863,
+ 2863, 0, 0, 0, 0, 0, 0, 0, 2863, 2864,
+ 0, 2864, 0, 0, 0, 0, 0, 0, 0, 2864,
+ 0, 0, 2864, 0, 2864, 2864, 0, 2864, 0, 0,
+ 0, 2864, 0, 0, 2864, 2864, 2865, 0, 2865, 2865,
+ 2865, 2865, 2865, 2865, 0, 0, 2865, 2865, 2865, 2865,
+
+ 2865, 2865, 2865, 2865, 2865, 2865, 0, 2865, 2865, 2865,
+ 0, 0, 0, 0, 2865, 0, 2865, 2865, 2866, 0,
+ 2866, 2866, 2866, 2866, 2866, 2866, 0, 0, 2866, 2866,
+ 2866, 2866, 2866, 2866, 2866, 2866, 0, 2866, 0, 2866,
+ 2866, 2866, 0, 0, 0, 0, 2866, 0, 2866, 2867,
+ 0, 2867, 2867, 2867, 2867, 2867, 2867, 0, 0, 2867,
+ 2867, 2867, 2867, 2867, 2867, 2867, 2867, 2867, 2867, 0,
+ 2867, 2867, 2867, 0, 0, 0, 0, 2867, 0, 2867,
+ 2867, 2868, 0, 0, 0, 0, 0, 0, 0, 2868,
+ 0, 0, 2868, 2868, 0, 2868, 0, 0, 0, 2868,
+
+ 2868, 0, 2868, 0, 2868, 0, 0, 2868, 2868, 0,
+ 2868, 2869, 0, 0, 0, 0, 0, 0, 0, 2869,
+ 0, 0, 0, 2869, 0, 2869, 0, 0, 0, 2869,
+ 2869, 0, 0, 0, 2869, 0, 0, 2869, 2870, 0,
+ 2870, 0, 0, 0, 0, 0, 2870, 0, 2870, 0,
+ 2870, 0, 2870, 0, 0, 0, 2870, 2870, 0, 2870,
+ 2870, 2870, 0, 0, 2870, 2871, 0, 0, 0, 0,
+ 0, 0, 0, 2871, 0, 0, 2871, 2871, 0, 2871,
+ 0, 0, 0, 2871, 2871, 0, 2871, 0, 2871, 0,
+ 0, 2871, 2871, 0, 2871, 2872, 0, 0, 0, 0,
+
+ 0, 0, 0, 2872, 0, 0, 2872, 2872, 0, 2872,
+ 0, 0, 0, 2872, 2872, 0, 2872, 0, 2872, 0,
+ 0, 2872, 2872, 0, 2872, 2873, 2873, 0, 0, 2873,
+ 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2873,
+ 0, 2873, 0, 2873, 2873, 2873, 2873, 2873, 2873, 2873,
+ 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2873, 2873,
+ 2873, 2874, 2874, 0, 2874, 2874, 2874, 2874, 2874, 2874,
+ 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 0, 2874,
+ 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2874,
+ 2874, 2874, 2874, 2874, 2874, 2874, 2874, 2875, 0, 0,
+
+ 0, 0, 0, 0, 0, 2875, 0, 0, 2875, 2875,
+ 0, 2875, 0, 0, 0, 2875, 2875, 0, 2875, 0,
+ 2875, 0, 0, 2875, 2875, 0, 2875, 2876, 0, 2876,
+ 0, 0, 0, 0, 0, 2876, 0, 0, 0, 2876,
+ 0, 2876, 0, 0, 0, 2876, 2876, 0, 0, 0,
+ 2876, 0, 0, 2876, 2877, 0, 2877, 2877, 0, 2877,
+ 0, 2877, 2877, 0, 2877, 0, 2877, 2877, 2877, 2877,
+ 2877, 2877, 2877, 2877, 0, 2877, 2877, 2877, 0, 2877,
+ 2877, 2877, 0, 0, 2877, 0, 0, 2877, 2877, 2878,
+ 0, 2878, 0, 0, 0, 0, 0, 0, 0, 2878,
+
+ 0, 0, 2878, 0, 2878, 2878, 0, 2878, 0, 0,
+ 0, 0, 0, 0, 2878, 2878, 2879, 0, 2879, 2879,
+ 2879, 2879, 2879, 2879, 0, 0, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2879, 2879, 2879, 2879, 0, 2879, 2879, 2879,
+ 0, 0, 0, 0, 2879, 0, 2879, 2879, 2880, 0,
+ 2880, 2880, 2880, 2880, 2880, 2880, 0, 0, 2880, 2880,
+ 2880, 2880, 2880, 2880, 2880, 2880, 0, 2880, 0, 2880,
+ 2880, 2880, 0, 0, 0, 0, 2880, 0, 2880, 2881,
+ 0, 2881, 2881, 2881, 2881, 2881, 2881, 0, 0, 2881,
+ 2881, 2881, 2881, 2881, 2881, 2881, 2881, 2881, 2881, 0,
+
+ 2881, 2881, 2881, 0, 0, 0, 0, 2881, 0, 2881,
+ 2881, 2882, 2882, 0, 2882, 2882, 2882, 2882, 2882, 2882,
+ 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2882,
+ 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2882,
+ 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2883, 2883, 0,
+ 2883, 2883, 2883, 2883, 2883, 2883, 2883, 2883, 2883, 2883,
+ 2883, 2883, 2883, 2883, 2883, 2883, 2883, 2883, 2883, 2883,
+ 2883, 2883, 2883, 2883, 2883, 2883, 2883, 2883, 2883, 2883,
+ 2883, 2883, 2883, 2884, 0, 0, 0, 0, 0, 0,
+ 0, 2884, 0, 0, 2884, 2884, 0, 2884, 0, 0,
+
+ 0, 2884, 2884, 0, 2884, 0, 2884, 0, 0, 2884,
+ 2884, 0, 2884, 2885, 0, 0, 0, 0, 0, 0,
+ 0, 2885, 0, 0, 2885, 2885, 0, 2885, 0, 0,
+ 0, 2885, 2885, 0, 2885, 0, 2885, 0, 0, 2885,
+ 2885, 0, 2885, 2886, 0, 0, 0, 0, 0, 0,
+ 0, 2886, 0, 0, 2886, 2886, 0, 2886, 0, 0,
+ 0, 2886, 2886, 0, 2886, 0, 2886, 0, 0, 2886,
+ 2886, 0, 2886, 2887, 0, 2887, 2887, 2887, 2887, 2887,
+ 2887, 0, 0, 2887, 2887, 2887, 2887, 2887, 2887, 2887,
+ 2887, 0, 2887, 0, 2887, 2887, 2887, 0, 0, 0,
+
+ 0, 2887, 0, 2887, 2888, 0, 2888, 2888, 0, 2888,
+ 2888, 2888, 2888, 2888, 2888, 0, 2888, 2888, 2888, 2888,
+ 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888,
+ 2888, 2888, 0, 0, 2888, 2888, 0, 2888, 2888, 2889,
+ 0, 0, 0, 0, 0, 0, 0, 2889, 0, 0,
+ 0, 2889, 0, 2889, 0, 0, 0, 2889, 2889, 0,
+ 0, 0, 2889, 0, 0, 2889, 2890, 2890, 0, 2890,
+ 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
+ 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
+ 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
+
+ 2890, 2890, 2891, 2891, 0, 2891, 2891, 2891, 2891, 2891,
+ 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
+ 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891,
+ 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2892, 2892,
+ 0, 2892, 2892, 2892, 2892, 2892, 2892, 2892, 2892, 2892,
+ 2892, 2892, 2892, 2892, 2892, 2892, 2892, 2892, 2892, 2892,
+ 2892, 2892, 2892, 2892, 2892, 2892, 2892, 2892, 2892, 2892,
+ 2892, 2892, 2892, 2892, 2893, 2893, 2893, 2893, 2893, 2893,
+ 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893,
+ 2893, 2893, 2893, 0, 2893, 2893, 2893, 2893, 2893, 2893,
+
+ 2893, 0, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893,
+ 2894, 0, 2894, 2894, 2894, 2894, 2894, 0, 2894, 0,
+ 2894, 2894, 2894, 2894, 2894, 2894, 2894, 2894, 0, 2894,
+ 0, 2894, 2894, 2894, 0, 0, 0, 0, 0, 2894,
+ 2894, 2895, 0, 0, 2895, 0, 2895, 2895, 2895, 2895,
+ 2895, 0, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895,
+ 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 0,
+ 2895, 0, 0, 2895, 2895, 2896, 2896, 0, 2896, 2896,
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2897, 2897, 0, 2897, 2897, 2897, 2897, 2897, 2897,
+ 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897,
+ 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897,
+ 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2898, 2898, 0,
+ 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898,
+ 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898,
+ 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898, 2898,
+ 2898, 2898, 2898, 2899, 2899, 0, 2899, 2899, 2899, 2899,
+ 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899,
+
+ 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899,
+ 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2900,
+ 0, 0, 2900, 0, 2900, 2900, 2900, 2900, 2900, 0,
+ 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900,
+ 2900, 2900, 2900, 2900, 2900, 2900, 2900, 0, 2900, 0,
+ 0, 2900, 2900, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
+ 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
+ 2901, 2901, 0, 2901, 2901, 2901, 2901, 2901, 2901, 2901,
+ 0, 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2902,
+ 2902, 0, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2903, 0, 0, 2903, 0,
+ 2903, 2903, 2903, 2903, 2903, 0, 2903, 2903, 2903, 2903,
+ 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903,
+ 2903, 2903, 2903, 0, 2903, 0, 0, 2903, 2903, 2904,
+ 0, 0, 2904, 0, 2904, 2904, 2904, 2904, 2904, 0,
+ 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904,
+ 2904, 2904, 2904, 2904, 2904, 2904, 2904, 0, 2904, 0,
+ 0, 2904, 2904, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325
+ } ;
+
+/* Table of booleans, true if rule could match eol. */
+static yyconst flex_int32_t yy_rule_can_match_eol[155] =
+ { 0,
+0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0,
+ 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
+ 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, };
+
+extern int doctokenizerYY_flex_debug;
+int doctokenizerYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *doctokenizerYYtext;
+#line 1 "doctokenizer.l"
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#line 21 "doctokenizer.l"
+
+#include <qfile.h>
+#include <qstring.h>
+#include <qstack.h>
+#include <qdict.h>
+
+#include "doctokenizer.h"
+#include "cmdmapper.h"
+#include "config.h"
+#include "message.h"
+#include "section.h"
+#include "membergroup.h"
+#include "definition.h"
+#include "doxygen.h"
+#include "portable.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+//--------------------------------------------------------------------------
+
+// context for tokenizer phase
+static int g_commentState;
+TokenInfo *g_token = 0;
+static int g_inputPos = 0;
+static const char *g_inputString;
+static QCString g_fileName;
+static bool g_insidePre;
+
+// context for section finding phase
+static Definition *g_definition;
+static MemberGroup *g_memberGroup;
+static QCString g_secLabel;
+static QCString g_secTitle;
+static SectionInfo::SectionType g_secType;
+static QCString g_endMarker;
+
+struct DocLexerContext
+{
+ TokenInfo *token;
+ int rule;
+ int inputPos;
+ const char *inputString;
+ YY_BUFFER_STATE state;
+};
+
+static QStack<DocLexerContext> g_lexerStack;
+
+//--------------------------------------------------------------------------
+
+void doctokenizerYYpushContext()
+{
+ DocLexerContext *ctx = new DocLexerContext;
+ ctx->rule = YY_START;
+ ctx->token = g_token;
+ ctx->inputPos = g_inputPos;
+ ctx->inputString = g_inputString;
+ ctx->state = YY_CURRENT_BUFFER;
+ g_lexerStack.push(ctx);
+ doctokenizerYY_switch_to_buffer(doctokenizerYY_create_buffer(doctokenizerYYin,YY_BUF_SIZE));
+}
+
+bool doctokenizerYYpopContext()
+{
+ if (g_lexerStack.isEmpty()) return FALSE;
+ DocLexerContext *ctx = g_lexerStack.pop();
+ g_inputPos = ctx->inputPos;
+ g_inputString = ctx->inputString;
+ doctokenizerYY_delete_buffer(YY_CURRENT_BUFFER);
+ doctokenizerYY_switch_to_buffer(ctx->state);
+ BEGIN(ctx->rule);
+ delete ctx;
+ return TRUE;
+}
+
+
+//--------------------------------------------------------------------------
+
+const char *tokToString(int token)
+{
+ switch (token)
+ {
+ case 0: return "TK_EOF";
+ case TK_WORD: return "TK_WORD";
+ case TK_LNKWORD: return "TK_LNKWORD";
+ case TK_WHITESPACE: return "TK_WHITESPACE";
+ case TK_LISTITEM: return "TK_LISTITEM";
+ case TK_ENDLIST: return "TK_ENDLIST";
+ case TK_COMMAND: return "TK_COMMAND";
+ case TK_HTMLTAG: return "TK_HTMLTAG";
+ case TK_SYMBOL: return "TK_SYMBOL";
+ case TK_NEWPARA: return "TK_NEWPARA";
+ case TK_RCSTAG: return "TK_RCSTAG";
+ case TK_URL: return "TK_URL";
+ }
+ return "ERROR";
+}
+
+static int computeIndent(const char *str,int length)
+{
+ int i;
+ int indent=0;
+ int tabSize=Config_getInt("TAB_SIZE");
+ for (i=0;i<length;i++)
+ {
+ if (str[i]=='\t')
+ {
+ indent+=tabSize - (indent%tabSize);
+ }
+ else if (str[i]=='\n')
+ {
+ indent=0;
+ }
+ else
+ {
+ indent++;
+ }
+ }
+ return indent;
+}
+
+//--------------------------------------------------------------------------
+
+static void processSection()
+{
+ //printf("%s: found section/anchor with name `%s'\n",g_fileName.data(),g_secLabel.data());
+ QCString file;
+ if (g_memberGroup)
+ {
+ file = g_memberGroup->parent()->getOutputFileBase();
+ }
+ else if (g_definition)
+ {
+ file = g_definition->getOutputFileBase();
+ }
+ else
+ {
+ warn(g_fileName,doctokenizerYYlineno,"Found section/anchor %s without context\n",g_secLabel.data());
+ }
+ SectionInfo *si=0;
+ if ((si=Doxygen::sectionDict.find(g_secLabel)))
+ {
+ si->fileName = file;
+ //si = new SectionInfo(file,g_secLabel,g_secTitle,g_secType);
+ //Doxygen::sectionDict.insert(g_secLabel,si);
+ }
+}
+
+static void handleHtmlTag()
+{
+ QCString tagText=doctokenizerYYtext;
+ g_token->attribs.clear();
+ g_token->endTag = FALSE;
+ g_token->emptyTag = FALSE;
+
+ // Check for end tag
+ int startNamePos=1;
+ if (tagText.at(1)=='/')
+ {
+ g_token->endTag = TRUE;
+ startNamePos++;
+ }
+
+ // Parse the name portion
+ int i = startNamePos;
+ for (i=startNamePos; i < (int)doctokenizerYYleng; i++)
+ {
+ // Check for valid HTML/XML name chars (including namespaces)
+ char c = tagText.at(i);
+ if (!(isalnum(c) || c=='-' || c=='_' || c==':')) break;
+ }
+ g_token->name = tagText.mid(startNamePos,i-startNamePos);
+
+ // Parse the attributes. Each attribute is a name, value pair
+ // The result is stored in g_token->attribs.
+ int startName,endName,startAttrib,endAttrib;
+ while (i<(int)doctokenizerYYleng)
+ {
+ char c=tagText.at(i);
+ // skip spaces
+ while (i<(int)doctokenizerYYleng && isspace(c)) { c=tagText.at(++i); }
+ // check for end of the tag
+ if (c == '>') break;
+ // Check for XML style "empty" tag.
+ if (c == '/')
+ {
+ g_token->emptyTag = TRUE;
+ break;
+ }
+ startName=i;
+ // search for end of name
+ while (i<(int)doctokenizerYYleng && !isspace(c) && c!='=') { c=tagText.at(++i); }
+ endName=i;
+ HtmlAttrib opt;
+ opt.name = tagText.mid(startName,endName-startName).lower();
+ // skip spaces
+ while (i<(int)doctokenizerYYleng && isspace(c)) { c=tagText.at(++i); }
+ if (tagText.at(i)=='=') // option has value
+ {
+ c=tagText.at(++i);
+ // skip spaces
+ while (i<(int)doctokenizerYYleng && isspace(c)) { c=tagText.at(++i); }
+ if (tagText.at(i)=='\'') // option '...'
+ {
+ c=tagText.at(++i);
+ startAttrib=i;
+
+ // search for matching quote
+ while (i<(int)doctokenizerYYleng && c!='\'') { c=tagText.at(++i); }
+ endAttrib=i;
+ if (i<(int)doctokenizerYYleng) c=tagText.at(++i);
+ }
+ else if (tagText.at(i)=='"') // option "..."
+ {
+ c=tagText.at(++i);
+ startAttrib=i;
+ // search for matching quote
+ while (i<(int)doctokenizerYYleng && c!='"') { c=tagText.at(++i); }
+ endAttrib=i;
+ if (i<(int)doctokenizerYYleng) c=tagText.at(++i);
+ }
+ else // value without any quotes
+ {
+ startAttrib=i;
+ // search for separator or end symbol
+ while (i<(int)doctokenizerYYleng && !isspace(c) && c!='>') { c=tagText.at(++i); }
+ endAttrib=i;
+ if (i<(int)doctokenizerYYleng) c=tagText.at(++i);
+ }
+ opt.value = tagText.mid(startAttrib,endAttrib-startAttrib);
+ }
+ else // start next option
+ {
+ }
+ //printf("=====> Adding option name=<%s> value=<%s>\n",
+ // opt.name.data(),opt.value.data());
+ g_token->attribs.append(&opt);
+ }
+}
+
+static QCString stripEmptyLines(const char *s)
+{
+ if (s==0) return QCString();
+ int result=0,p=0;
+ for (;;)
+ {
+ int c;
+ while ((c=s[p]) && isspace(c)) p++;
+ if (s[p]=='\n') result=++p; else break;
+ }
+ return &s[result];
+}
+
+//--------------------------------------------------------------------------
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ const char *src=g_inputString+g_inputPos;
+ while ( c < max_size && *src ) *buf++ = *src++, c++;
+ g_inputPos+=c;
+ return c;
+}
+
+//--------------------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 9960 "<stdout>"
+
+#define INITIAL 0
+#define St_Para 1
+#define St_Comment 2
+#define St_Title 3
+#define St_TitleN 4
+#define St_TitleQ 5
+#define St_TitleA 6
+#define St_TitleV 7
+#define St_Code 8
+#define St_XmlCode 9
+#define St_HtmlOnly 10
+#define St_ManOnly 11
+#define St_LatexOnly 12
+#define St_XmlOnly 13
+#define St_Verbatim 14
+#define St_Dot 15
+#define St_Msc 16
+#define St_Param 17
+#define St_XRefItem 18
+#define St_XRefItem2 19
+#define St_File 20
+#define St_Pattern 21
+#define St_Link 22
+#define St_Ref 23
+#define St_Ref2 24
+#define St_IntRef 25
+#define St_Text 26
+#define St_SkipTitle 27
+#define St_Sections 28
+#define St_SecLabel1 29
+#define St_SecLabel2 30
+#define St_SecTitle 31
+#define St_SecSkip 32
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int doctokenizerYYlex_destroy (void );
+
+int doctokenizerYYget_debug (void );
+
+void doctokenizerYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE doctokenizerYYget_extra (void );
+
+void doctokenizerYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *doctokenizerYYget_in (void );
+
+void doctokenizerYYset_in (FILE * in_str );
+
+FILE *doctokenizerYYget_out (void );
+
+void doctokenizerYYset_out (FILE * out_str );
+
+yy_size_t doctokenizerYYget_leng (void );
+
+char *doctokenizerYYget_text (void );
+
+int doctokenizerYYget_lineno (void );
+
+void doctokenizerYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int doctokenizerYYwrap (void );
+#else
+extern int doctokenizerYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( doctokenizerYYtext, doctokenizerYYleng, 1, doctokenizerYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( doctokenizerYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( doctokenizerYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, doctokenizerYYin))==0 && ferror(doctokenizerYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(doctokenizerYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int doctokenizerYYlex (void);
+
+#define YY_DECL int doctokenizerYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after doctokenizerYYtext and doctokenizerYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( doctokenizerYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (doctokenizerYYtext[doctokenizerYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 387 "doctokenizer.l"
+
+#line 10179 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)doctokenizerYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in doctokenizerYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! doctokenizerYYin )
+ doctokenizerYYin = stdin;
+
+ if ( ! doctokenizerYYout )
+ doctokenizerYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ doctokenizerYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ doctokenizerYY_create_buffer(doctokenizerYYin,YY_BUF_SIZE );
+ }
+
+ doctokenizerYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of doctokenizerYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 2326 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 36494 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+ if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+ {
+ int yyl;
+ for ( yyl = 0; yyl < doctokenizerYYleng; ++yyl )
+ if ( doctokenizerYYtext[yyl] == '\n' )
+
+ doctokenizerYYlineno++;
+;
+ }
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 388 "doctokenizer.l"
+/* skip carriage return */
+ YY_BREAK
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 389 "doctokenizer.l"
+{ /* list item */
+ QCString text=doctokenizerYYtext;
+ int dashPos = text.findRev('-');
+ g_token->isEnumList = text.at(dashPos+1)=='#';
+ g_token->indent = computeIndent(doctokenizerYYtext,dashPos);
+ return TK_LISTITEM;
+ }
+ YY_BREAK
+case 3:
+/* rule 3 can match eol */
+YY_RULE_SETUP
+#line 396 "doctokenizer.l"
+{ /* list item on next line */
+ QCString text=doctokenizerYYtext;
+ text=text.right(text.length()-text.find('\n')-1);
+ int dashPos = text.findRev('-');
+ g_token->isEnumList = text.at(dashPos+1)=='#';
+ g_token->indent = computeIndent(text,dashPos);
+ return TK_LISTITEM;
+ }
+ YY_BREAK
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 404 "doctokenizer.l"
+{ /* end list */
+ int dotPos = QCString(doctokenizerYYtext).findRev('.');
+ g_token->indent = computeIndent(doctokenizerYYtext,dotPos);
+ return TK_ENDLIST;
+ }
+ YY_BREAK
+case 5:
+/* rule 5 can match eol */
+YY_RULE_SETUP
+#line 409 "doctokenizer.l"
+{ /* end list on next line */
+ QCString text=doctokenizerYYtext;
+ text=text.right(text.length()-text.find('\n')-1);
+ int dotPos = text.findRev('.');
+ g_token->indent = computeIndent(text,dotPos);
+ return TK_ENDLIST;
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 416 "doctokenizer.l"
+{
+ g_token->name = "javalink";
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 420 "doctokenizer.l"
+{
+ g_token->name = "inheritdoc";
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 424 "doctokenizer.l"
+{ // artificial new line
+ doctokenizerYYlineno++;
+ }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 427 "doctokenizer.l"
+{
+ g_token->name = "form";
+ bool ok;
+ g_token->id = QCString(doctokenizerYYtext).right(doctokenizerYYleng-6).toInt(&ok);
+ ASSERT(ok);
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 10:
+#line 435 "doctokenizer.l"
+case 11:
+#line 436 "doctokenizer.l"
+case 12:
+YY_RULE_SETUP
+#line 436 "doctokenizer.l"
+{ /* special command */
+ g_token->name = doctokenizerYYtext+1;
+ g_token->name = g_token->name.stripWhiteSpace();
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 442 "doctokenizer.l"
+{ /* param [in,out] command */
+ g_token->name = "param";
+ QCString s(doctokenizerYYtext);
+ bool isIn = s.find("in")!=-1;
+ bool isOut = s.find("out")!=-1;
+ if (isIn)
+ {
+ if (isOut)
+ {
+ g_token->paramDir=TokenInfo::InOut;
+ }
+ else
+ {
+ g_token->paramDir=TokenInfo::In;
+ }
+ }
+ else if (isOut)
+ {
+ g_token->paramDir=TokenInfo::Out;
+ }
+ else
+ {
+ g_token->paramDir=TokenInfo::Unspecified;
+ }
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 468 "doctokenizer.l"
+{ // URL
+ g_token->name=doctokenizerYYtext;
+ g_token->isEMailAddr=FALSE;
+ return TK_URL;
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 473 "doctokenizer.l"
+{ // Mail address
+ g_token->name=doctokenizerYYtext;
+ g_token->isEMailAddr=TRUE;
+ return TK_URL;
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 478 "doctokenizer.l"
+{ /* RCS tag */
+ QCString tagName(doctokenizerYYtext+1);
+ int index=tagName.find(':');
+ g_token->name = tagName.left(index+1);
+ g_token->text = tagName.mid(index+2,tagName.length()-index-3);
+ return TK_RCSTAG;
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 485 "doctokenizer.l"
+{ /* environment variable */
+ QCString name = &doctokenizerYYtext[2];
+ name = name.left(name.length()-1);
+ QCString value = portable_getenv(name);
+ for (int i=value.length()-1;i>=0;i--) unput(value.at(i));
+ }
+ YY_BREAK
+case 18:
+/* rule 18 can match eol */
+YY_RULE_SETUP
+#line 491 "doctokenizer.l"
+{ /* html tag */
+ handleHtmlTag();
+ return TK_HTMLTAG;
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 495 "doctokenizer.l"
+{ /* special symbol */
+ g_token->name = doctokenizerYYtext;
+ return TK_SYMBOL;
+ }
+ YY_BREAK
+/********* patterns for linkable words ******************/
+case 20:
+YY_RULE_SETUP
+#line 502 "doctokenizer.l"
+{ /* this rule is to prevent opening html
+ * tag to be recognized as a templated classes
+ */
+ g_token->name = doctokenizerYYtext;
+ return TK_LNKWORD;
+ }
+ YY_BREAK
+case 21:
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */
+(yy_c_buf_p) = yy_cp -= 4;
+YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */
+#line 509 "doctokenizer.l"
+case 22:
+#line 510 "doctokenizer.l"
+case 23:
+#line 511 "doctokenizer.l"
+case 24:
+#line 512 "doctokenizer.l"
+case 25:
+YY_RULE_SETUP
+#line 512 "doctokenizer.l"
+{
+ g_token->name = doctokenizerYYtext;
+ return TK_LNKWORD;
+ }
+ YY_BREAK
+case 26:
+/* rule 26 can match eol */
+YY_RULE_SETUP
+#line 516 "doctokenizer.l"
+{
+ g_token->name = doctokenizerYYtext;
+ g_token->name = g_token->name.left(g_token->name.length()-1);
+ unput(doctokenizerYYtext[doctokenizerYYleng-1]);
+ return TK_LNKWORD;
+ }
+ YY_BREAK
+/********* patterns for normal words ******************/
+case 27:
+/* rule 27 can match eol */
+#line 525 "doctokenizer.l"
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+#line 525 "doctokenizer.l"
+{ /* function call */
+ if (doctokenizerYYtext[0]=='%') // strip % if present
+ g_token->name = &doctokenizerYYtext[1];
+ else
+ g_token->name = doctokenizerYYtext;
+ return TK_WORD;
+
+ /* the following is dummy code to please the
+ * compiler, removing this results in a warning
+ * on my machine
+ */
+ goto find_rule;
+ }
+ YY_BREAK
+case 29:
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 8;
+YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */
+YY_RULE_SETUP
+#line 538 "doctokenizer.l"
+{ // Special case: word "operator" followed by a HTML command
+ // avoid interpretation as "operator <"
+ g_token->name = doctokenizerYYtext;
+ return TK_WORD;
+ }
+ YY_BREAK
+/*******************************************************/
+case 30:
+#line 547 "doctokenizer.l"
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+#line 547 "doctokenizer.l"
+{ /* white space */
+ g_token->chars=doctokenizerYYtext;
+ return TK_WHITESPACE;
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 551 "doctokenizer.l"
+{
+ g_token->name = doctokenizerYYtext;
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+#line 555 "doctokenizer.l"
+{
+ if (g_insidePre)
+ {
+ /* Inside a <pre>..</pre> blank lines are treated
+ * as whitespace.
+ */
+ g_token->chars=doctokenizerYYtext;
+ return TK_WHITESPACE;
+ }
+ else
+ {
+ /* start of a new paragraph */
+ return TK_NEWPARA;
+ }
+ }
+ YY_BREAK
+case 34:
+/* rule 34 can match eol */
+YY_RULE_SETUP
+#line 570 "doctokenizer.l"
+{
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 35:
+/* rule 35 can match eol */
+YY_RULE_SETUP
+#line 573 "doctokenizer.l"
+{
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 36:
+#line 577 "doctokenizer.l"
+case 37:
+/* rule 37 can match eol */
+#line 578 "doctokenizer.l"
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 578 "doctokenizer.l"
+{
+ g_token->verb+=doctokenizerYYtext;
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 581 "doctokenizer.l"
+{
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 40:
+#line 585 "doctokenizer.l"
+case 41:
+/* rule 41 can match eol */
+#line 586 "doctokenizer.l"
+case 42:
+/* rule 42 can match eol */
+YY_RULE_SETUP
+#line 586 "doctokenizer.l"
+{
+ g_token->verb+=doctokenizerYYtext;
+ }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 589 "doctokenizer.l"
+{
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 44:
+#line 593 "doctokenizer.l"
+case 45:
+/* rule 45 can match eol */
+#line 594 "doctokenizer.l"
+case 46:
+/* rule 46 can match eol */
+YY_RULE_SETUP
+#line 594 "doctokenizer.l"
+{
+ g_token->verb+=doctokenizerYYtext;
+ }
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 597 "doctokenizer.l"
+{
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 48:
+#line 601 "doctokenizer.l"
+case 49:
+/* rule 49 can match eol */
+#line 602 "doctokenizer.l"
+case 50:
+/* rule 50 can match eol */
+YY_RULE_SETUP
+#line 602 "doctokenizer.l"
+{
+ g_token->verb+=doctokenizerYYtext;
+ }
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 605 "doctokenizer.l"
+{
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 52:
+#line 609 "doctokenizer.l"
+case 53:
+/* rule 53 can match eol */
+#line 610 "doctokenizer.l"
+case 54:
+/* rule 54 can match eol */
+YY_RULE_SETUP
+#line 610 "doctokenizer.l"
+{
+ g_token->verb+=doctokenizerYYtext;
+ }
+ YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 613 "doctokenizer.l"
+{
+ g_token->verb=stripEmptyLines(g_token->verb);
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 56:
+#line 618 "doctokenizer.l"
+case 57:
+/* rule 57 can match eol */
+#line 619 "doctokenizer.l"
+case 58:
+/* rule 58 can match eol */
+YY_RULE_SETUP
+#line 619 "doctokenizer.l"
+{ /* Verbatim text */
+ g_token->verb+=doctokenizerYYtext;
+ }
+ YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 622 "doctokenizer.l"
+{
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 60:
+#line 626 "doctokenizer.l"
+case 61:
+/* rule 61 can match eol */
+#line 627 "doctokenizer.l"
+case 62:
+/* rule 62 can match eol */
+YY_RULE_SETUP
+#line 627 "doctokenizer.l"
+{ /* dot text */
+ g_token->verb+=doctokenizerYYtext;
+ }
+ YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 630 "doctokenizer.l"
+{
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 64:
+#line 634 "doctokenizer.l"
+case 65:
+/* rule 65 can match eol */
+#line 635 "doctokenizer.l"
+case 66:
+/* rule 66 can match eol */
+YY_RULE_SETUP
+#line 635 "doctokenizer.l"
+{ /* msc text */
+ g_token->verb+=doctokenizerYYtext;
+ }
+ YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 638 "doctokenizer.l"
+{ // quoted title
+ BEGIN(St_TitleQ);
+ }
+ YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 641 "doctokenizer.l"
+{
+ g_token->chars=doctokenizerYYtext;
+ return TK_WHITESPACE;
+ }
+ YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 645 "doctokenizer.l"
+{ // non-quoted title
+ unput(*doctokenizerYYtext);
+ BEGIN(St_TitleN);
+ }
+ YY_BREAK
+case 70:
+/* rule 70 can match eol */
+YY_RULE_SETUP
+#line 649 "doctokenizer.l"
+{
+ unput(*doctokenizerYYtext);
+ return 0;
+ }
+ YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 653 "doctokenizer.l"
+{ /* symbol */
+ g_token->name = doctokenizerYYtext;
+ return TK_SYMBOL;
+ }
+ YY_BREAK
+case 72:
+/* rule 72 can match eol */
+YY_RULE_SETUP
+#line 657 "doctokenizer.l"
+{
+ }
+ YY_BREAK
+case 73:
+#line 660 "doctokenizer.l"
+case 74:
+YY_RULE_SETUP
+#line 660 "doctokenizer.l"
+{ /* special command */
+ g_token->name = doctokenizerYYtext+1;
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 75:
+/* rule 75 can match eol */
+#line 666 "doctokenizer.l"
+case 76:
+/* rule 76 can match eol */
+YY_RULE_SETUP
+#line 666 "doctokenizer.l"
+{ /* word */
+ if (doctokenizerYYtext[0]=='%') // strip % if present
+ g_token->name = &doctokenizerYYtext[1];
+ else
+ g_token->name = doctokenizerYYtext;
+ return TK_WORD;
+ }
+ YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 673 "doctokenizer.l"
+{
+ g_token->chars=doctokenizerYYtext;
+ return TK_WHITESPACE;
+ }
+ YY_BREAK
+case 78:
+/* rule 78 can match eol */
+YY_RULE_SETUP
+#line 677 "doctokenizer.l"
+{ /* new line => end of title */
+ unput(*doctokenizerYYtext);
+ return 0;
+ }
+ YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 681 "doctokenizer.l"
+{ /* symbol */
+ g_token->name = doctokenizerYYtext;
+ return TK_SYMBOL;
+ }
+ YY_BREAK
+case 80:
+#line 686 "doctokenizer.l"
+case 81:
+YY_RULE_SETUP
+#line 686 "doctokenizer.l"
+{ /* special command */
+ g_token->name = doctokenizerYYtext+1;
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 82:
+#line 692 "doctokenizer.l"
+case 83:
+YY_RULE_SETUP
+#line 692 "doctokenizer.l"
+{ /* word */
+ g_token->name = doctokenizerYYtext;
+ return TK_WORD;
+ }
+ YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 696 "doctokenizer.l"
+{
+ g_token->chars=doctokenizerYYtext;
+ return TK_WHITESPACE;
+ }
+ YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 700 "doctokenizer.l"
+{ /* closing quote => end of title */
+ BEGIN(St_TitleA);
+ return 0;
+ }
+ YY_BREAK
+case 86:
+/* rule 86 can match eol */
+YY_RULE_SETUP
+#line 704 "doctokenizer.l"
+{ /* new line => end of title */
+ unput(*doctokenizerYYtext);
+ return 0;
+ }
+ YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 708 "doctokenizer.l"
+{ // title attribute
+ g_token->name = doctokenizerYYtext;
+ g_token->name = g_token->name.left(
+ g_token->name.find('=')).stripWhiteSpace();
+ BEGIN(St_TitleV);
+ }
+ YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 714 "doctokenizer.l"
+{ // attribute value
+ g_token->chars = doctokenizerYYtext;
+ BEGIN(St_TitleN);
+ return TK_WORD;
+ }
+ YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 719 "doctokenizer.l"
+{
+ unput(*doctokenizerYYtext);
+ return 0;
+ }
+ YY_BREAK
+case 90:
+/* rule 90 can match eol */
+YY_RULE_SETUP
+#line 723 "doctokenizer.l"
+{
+ return 0;
+ }
+ YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 727 "doctokenizer.l"
+{ // label to refer to
+ g_token->name=doctokenizerYYtext;
+ return TK_WORD;
+ }
+ YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 731 "doctokenizer.l"
+{ // white space
+ unput(' ');
+ return 0;
+ }
+ YY_BREAK
+case 93:
+/* rule 93 can match eol */
+YY_RULE_SETUP
+#line 735 "doctokenizer.l"
+{ // white space following by quoted string
+ BEGIN(St_Ref2);
+ }
+ YY_BREAK
+case 94:
+/* rule 94 can match eol */
+YY_RULE_SETUP
+#line 738 "doctokenizer.l"
+{ // new line
+ unput(*doctokenizerYYtext);
+ return 0;
+ }
+ YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 742 "doctokenizer.l"
+{ // any other character
+ unput(*doctokenizerYYtext);
+ return 0;
+ }
+ YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 746 "doctokenizer.l"
+{
+ g_token->name = doctokenizerYYtext;
+ return TK_WORD;
+ }
+ YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 750 "doctokenizer.l"
+{
+ BEGIN(St_Ref2);
+ }
+ YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 753 "doctokenizer.l"
+{ /* symbol */
+ g_token->name = doctokenizerYYtext;
+ return TK_SYMBOL;
+ }
+ YY_BREAK
+case 99:
+#line 758 "doctokenizer.l"
+case 100:
+YY_RULE_SETUP
+#line 758 "doctokenizer.l"
+{ /* special command */
+ g_token->name = doctokenizerYYtext+1;
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 101:
+#line 764 "doctokenizer.l"
+case 102:
+YY_RULE_SETUP
+#line 764 "doctokenizer.l"
+{
+ /* word */
+ g_token->name = doctokenizerYYtext;
+ return TK_WORD;
+ }
+ YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 769 "doctokenizer.l"
+{
+ g_token->chars=doctokenizerYYtext;
+ return TK_WHITESPACE;
+ }
+ YY_BREAK
+case 104:
+/* rule 104 can match eol */
+YY_RULE_SETUP
+#line 773 "doctokenizer.l"
+{ /* " or \n => end of title */
+ return 0;
+ }
+ YY_BREAK
+case 105:
+YY_RULE_SETUP
+#line 776 "doctokenizer.l"
+{
+ g_token->name=doctokenizerYYtext;
+ }
+ YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 779 "doctokenizer.l"
+{
+ BEGIN(St_XRefItem2);
+ }
+ YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 782 "doctokenizer.l"
+{
+ QCString numStr=doctokenizerYYtext;
+ numStr=numStr.left(doctokenizerYYleng-1);
+ g_token->id=numStr.toInt();
+ return RetVal_OK;
+ }
+ YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 788 "doctokenizer.l"
+{ /* html style comment block */
+ g_commentState = YY_START;
+ BEGIN(St_Comment);
+ }
+ YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 792 "doctokenizer.l"
+{
+ g_token->name = doctokenizerYYtext+1;
+ g_token->name = g_token->name.left(doctokenizerYYleng-2);
+ return TK_WORD;
+ }
+ YY_BREAK
+case 110:
+/* rule 110 can match eol */
+YY_RULE_SETUP
+#line 797 "doctokenizer.l"
+{
+ QCString params = doctokenizerYYtext;
+ int j = params.find('&');
+ int i = params.find('$');
+ if (j<i && j!=-1) i=j;
+ QCString types = params.left(i).stripWhiteSpace();
+ g_token->name = types+"#"+params.mid(i);
+ return TK_WORD;
+ }
+ YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 806 "doctokenizer.l"
+{
+ g_token->name = doctokenizerYYtext;
+ return TK_WORD;
+ }
+ YY_BREAK
+case 112:
+/* rule 112 can match eol */
+YY_RULE_SETUP
+#line 810 "doctokenizer.l"
+/* param separator */
+ YY_BREAK
+case 113:
+/* rule 113 can match eol */
+YY_RULE_SETUP
+#line 811 "doctokenizer.l"
+{
+ g_token->chars=doctokenizerYYtext;
+ return TK_WHITESPACE;
+ }
+ YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 815 "doctokenizer.l"
+{
+ g_token->name = doctokenizerYYtext;
+ return TK_WORD;
+ }
+ YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 819 "doctokenizer.l"
+{
+ QCString text=doctokenizerYYtext;
+ g_token->name = text.mid(1,text.length()-2);
+ return TK_WORD;
+ }
+ YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 824 "doctokenizer.l"
+{
+ g_token->name = doctokenizerYYtext;
+ g_token->name = g_token->name.stripWhiteSpace();
+ return TK_WORD;
+ }
+ YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 829 "doctokenizer.l"
+{
+ g_token->name = doctokenizerYYtext;
+ return TK_WORD;
+ }
+ YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 833 "doctokenizer.l"
+{ /* end of html comment */
+ BEGIN(g_commentState);
+ }
+ YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 836 "doctokenizer.l"
+/* inside html comment */
+ YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 837 "doctokenizer.l"
+/* inside html comment */
+ YY_BREAK
+/* State for skipping title (all chars until the end of the line) */
+case 121:
+YY_RULE_SETUP
+#line 841 "doctokenizer.l"
+
+ YY_BREAK
+case 122:
+/* rule 122 can match eol */
+YY_RULE_SETUP
+#line 842 "doctokenizer.l"
+{ return 0; }
+ YY_BREAK
+/* State for the pass used to find the anchors and sections */
+case 123:
+YY_RULE_SETUP
+#line 846 "doctokenizer.l"
+
+ YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 847 "doctokenizer.l"
+
+ YY_BREAK
+case 125:
+YY_RULE_SETUP
+#line 848 "doctokenizer.l"
+{
+ g_secType = SectionInfo::Anchor;
+ BEGIN(St_SecLabel1);
+ }
+ YY_BREAK
+case 126:
+YY_RULE_SETUP
+#line 852 "doctokenizer.l"
+{
+ g_secType = SectionInfo::Section;
+ BEGIN(St_SecLabel2);
+ }
+ YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 856 "doctokenizer.l"
+{
+ g_secType = SectionInfo::Subsection;
+ BEGIN(St_SecLabel2);
+ }
+ YY_BREAK
+case 128:
+YY_RULE_SETUP
+#line 860 "doctokenizer.l"
+{
+ g_secType = SectionInfo::Subsubsection;
+ BEGIN(St_SecLabel2);
+ }
+ YY_BREAK
+case 129:
+YY_RULE_SETUP
+#line 864 "doctokenizer.l"
+{
+ g_secType = SectionInfo::Paragraph;
+ BEGIN(St_SecLabel2);
+ }
+ YY_BREAK
+case 130:
+/* rule 130 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */
+YY_RULE_SETUP
+#line 868 "doctokenizer.l"
+{
+ g_endMarker="endverbatim";
+ BEGIN(St_SecSkip);
+ }
+ YY_BREAK
+case 131:
+/* rule 131 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */
+YY_RULE_SETUP
+#line 872 "doctokenizer.l"
+{
+ g_endMarker="enddot";
+ BEGIN(St_SecSkip);
+ }
+ YY_BREAK
+case 132:
+/* rule 132 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */
+YY_RULE_SETUP
+#line 876 "doctokenizer.l"
+{
+ g_endMarker="endmsc";
+ BEGIN(St_SecSkip);
+ }
+ YY_BREAK
+case 133:
+/* rule 133 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */
+YY_RULE_SETUP
+#line 880 "doctokenizer.l"
+{
+ g_endMarker="endhtmlonly";
+ BEGIN(St_SecSkip);
+ }
+ YY_BREAK
+case 134:
+/* rule 134 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */
+YY_RULE_SETUP
+#line 884 "doctokenizer.l"
+{
+ g_endMarker="endlatexonly";
+ BEGIN(St_SecSkip);
+ }
+ YY_BREAK
+case 135:
+/* rule 135 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */
+YY_RULE_SETUP
+#line 888 "doctokenizer.l"
+{
+ g_endMarker="endxmlonly";
+ BEGIN(St_SecSkip);
+ }
+ YY_BREAK
+case 136:
+/* rule 136 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up doctokenizerYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up doctokenizerYYtext again */
+YY_RULE_SETUP
+#line 892 "doctokenizer.l"
+{
+ g_endMarker="endcode";
+ BEGIN(St_SecSkip);
+ }
+ YY_BREAK
+case 137:
+YY_RULE_SETUP
+#line 896 "doctokenizer.l"
+{
+ g_endMarker="-->";
+ BEGIN(St_SecSkip);
+ }
+ YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 900 "doctokenizer.l"
+{
+ if (strcmp(doctokenizerYYtext+1,g_endMarker)==0)
+ {
+ BEGIN(St_Sections);
+ }
+ }
+ YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 906 "doctokenizer.l"
+{
+ if (strcmp(doctokenizerYYtext,g_endMarker)==0)
+ {
+ BEGIN(St_Sections);
+ }
+ }
+ YY_BREAK
+case 140:
+/* rule 140 can match eol */
+YY_RULE_SETUP
+#line 912 "doctokenizer.l"
+
+ YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 913 "doctokenizer.l"
+
+ YY_BREAK
+case 142:
+/* rule 142 can match eol */
+YY_RULE_SETUP
+#line 914 "doctokenizer.l"
+
+ YY_BREAK
+case 143:
+YY_RULE_SETUP
+#line 915 "doctokenizer.l"
+
+ YY_BREAK
+case 144:
+/* rule 144 can match eol */
+YY_RULE_SETUP
+#line 916 "doctokenizer.l"
+
+ YY_BREAK
+case 145:
+YY_RULE_SETUP
+#line 917 "doctokenizer.l"
+{
+ g_secLabel = doctokenizerYYtext;
+ processSection();
+ BEGIN(St_Sections);
+ }
+ YY_BREAK
+case 146:
+#line 923 "doctokenizer.l"
+case 147:
+YY_RULE_SETUP
+#line 923 "doctokenizer.l"
+{
+ g_secLabel = doctokenizerYYtext;
+ g_secLabel = g_secLabel.stripWhiteSpace();
+ BEGIN(St_SecTitle);
+ }
+ YY_BREAK
+case 148:
+#line 929 "doctokenizer.l"
+case 149:
+/* rule 149 can match eol */
+YY_RULE_SETUP
+#line 929 "doctokenizer.l"
+{
+ g_secTitle = doctokenizerYYtext;
+ g_secTitle = g_secTitle.stripWhiteSpace();
+ processSection();
+ BEGIN(St_Sections);
+ }
+ YY_BREAK
+case 150:
+YY_RULE_SETUP
+#line 935 "doctokenizer.l"
+{
+ warn(g_fileName,doctokenizerYYlineno,"warning: Unexpected character `%s' while looking for section label or title",doctokenizerYYtext);
+ }
+ YY_BREAK
+/* Generic rules that work for all states */
+case 151:
+/* rule 151 can match eol */
+YY_RULE_SETUP
+#line 940 "doctokenizer.l"
+{
+ warn(g_fileName,doctokenizerYYlineno,"warning: Unexpected new line character");
+ }
+ YY_BREAK
+case 152:
+YY_RULE_SETUP
+#line 943 "doctokenizer.l"
+{ /* unescaped special character */
+ //warn(g_fileName,doctokenizerYYlineno,"warning: Unexpected character `%s', assuming command \\%s was meant.",doctokenizerYYtext,doctokenizerYYtext);
+ g_token->name = doctokenizerYYtext;
+ return TK_COMMAND;
+ }
+ YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 948 "doctokenizer.l"
+{
+ warn(g_fileName,doctokenizerYYlineno,"warning: Unexpected character `%s'",doctokenizerYYtext);
+ }
+ YY_BREAK
+case 154:
+YY_RULE_SETUP
+#line 951 "doctokenizer.l"
+ECHO;
+ YY_BREAK
+#line 11457 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(St_Para):
+ case YY_STATE_EOF(St_Comment):
+ case YY_STATE_EOF(St_Title):
+ case YY_STATE_EOF(St_TitleN):
+ case YY_STATE_EOF(St_TitleQ):
+ case YY_STATE_EOF(St_TitleA):
+ case YY_STATE_EOF(St_TitleV):
+ case YY_STATE_EOF(St_Code):
+ case YY_STATE_EOF(St_XmlCode):
+ case YY_STATE_EOF(St_HtmlOnly):
+ case YY_STATE_EOF(St_ManOnly):
+ case YY_STATE_EOF(St_LatexOnly):
+ case YY_STATE_EOF(St_XmlOnly):
+ case YY_STATE_EOF(St_Verbatim):
+ case YY_STATE_EOF(St_Dot):
+ case YY_STATE_EOF(St_Msc):
+ case YY_STATE_EOF(St_Param):
+ case YY_STATE_EOF(St_XRefItem):
+ case YY_STATE_EOF(St_XRefItem2):
+ case YY_STATE_EOF(St_File):
+ case YY_STATE_EOF(St_Pattern):
+ case YY_STATE_EOF(St_Link):
+ case YY_STATE_EOF(St_Ref):
+ case YY_STATE_EOF(St_Ref2):
+ case YY_STATE_EOF(St_IntRef):
+ case YY_STATE_EOF(St_Text):
+ case YY_STATE_EOF(St_SkipTitle):
+ case YY_STATE_EOF(St_Sections):
+ case YY_STATE_EOF(St_SecLabel1):
+ case YY_STATE_EOF(St_SecLabel2):
+ case YY_STATE_EOF(St_SecTitle):
+ case YY_STATE_EOF(St_SecSkip):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed doctokenizerYYin at a new source and called
+ * doctokenizerYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = doctokenizerYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( doctokenizerYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * doctokenizerYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of doctokenizerYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ doctokenizerYYrestart(doctokenizerYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) doctokenizerYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 2326 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 2326 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 2325);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up doctokenizerYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ if ( c == '\n' ){
+ --doctokenizerYYlineno;
+ }
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ doctokenizerYYrestart(doctokenizerYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( doctokenizerYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve doctokenizerYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )
+
+ doctokenizerYYlineno++;
+;
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void doctokenizerYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ doctokenizerYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ doctokenizerYY_create_buffer(doctokenizerYYin,YY_BUF_SIZE );
+ }
+
+ doctokenizerYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ doctokenizerYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void doctokenizerYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * doctokenizerYYpop_buffer_state();
+ * doctokenizerYYpush_buffer_state(new_buffer);
+ */
+ doctokenizerYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ doctokenizerYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (doctokenizerYYwrap()) processing, but the only time this flag
+ * is looked at is after doctokenizerYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void doctokenizerYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ doctokenizerYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE doctokenizerYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) doctokenizerYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in doctokenizerYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) doctokenizerYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in doctokenizerYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ doctokenizerYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with doctokenizerYY_create_buffer()
+ *
+ */
+ void doctokenizerYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ doctokenizerYYfree((void *) b->yy_ch_buf );
+
+ doctokenizerYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a doctokenizerYYrestart() or at EOF.
+ */
+ static void doctokenizerYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ doctokenizerYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then doctokenizerYY_init_buffer was _probably_
+ * called from doctokenizerYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void doctokenizerYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ doctokenizerYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void doctokenizerYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ doctokenizerYYensure_buffer_stack();
+
+ /* This block is copied from doctokenizerYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from doctokenizerYY_switch_to_buffer. */
+ doctokenizerYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void doctokenizerYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ doctokenizerYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ doctokenizerYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void doctokenizerYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)doctokenizerYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in doctokenizerYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)doctokenizerYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in doctokenizerYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE doctokenizerYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) doctokenizerYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in doctokenizerYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ doctokenizerYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to doctokenizerYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * doctokenizerYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE doctokenizerYY_scan_string (yyconst char * yystr )
+{
+
+ return doctokenizerYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to doctokenizerYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE doctokenizerYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) doctokenizerYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in doctokenizerYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = doctokenizerYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in doctokenizerYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up doctokenizerYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ doctokenizerYYtext[doctokenizerYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = doctokenizerYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ doctokenizerYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int doctokenizerYYget_lineno (void)
+{
+
+ return doctokenizerYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *doctokenizerYYget_in (void)
+{
+ return doctokenizerYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *doctokenizerYYget_out (void)
+{
+ return doctokenizerYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t doctokenizerYYget_leng (void)
+{
+ return doctokenizerYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *doctokenizerYYget_text (void)
+{
+ return doctokenizerYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void doctokenizerYYset_lineno (int line_number )
+{
+
+ doctokenizerYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see doctokenizerYY_switch_to_buffer
+ */
+void doctokenizerYYset_in (FILE * in_str )
+{
+ doctokenizerYYin = in_str ;
+}
+
+void doctokenizerYYset_out (FILE * out_str )
+{
+ doctokenizerYYout = out_str ;
+}
+
+int doctokenizerYYget_debug (void)
+{
+ return doctokenizerYY_flex_debug;
+}
+
+void doctokenizerYYset_debug (int bdebug )
+{
+ doctokenizerYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from doctokenizerYYlex_destroy(), so don't allocate here.
+ */
+
+ /* We do not touch doctokenizerYYlineno unless the option is enabled. */
+ doctokenizerYYlineno = 1;
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ doctokenizerYYin = stdin;
+ doctokenizerYYout = stdout;
+#else
+ doctokenizerYYin = (FILE *) 0;
+ doctokenizerYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * doctokenizerYYlex_init()
+ */
+ return 0;
+}
+
+/* doctokenizerYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int doctokenizerYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ doctokenizerYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ doctokenizerYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ doctokenizerYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ doctokenizerYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * doctokenizerYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *doctokenizerYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *doctokenizerYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void doctokenizerYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see doctokenizerYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 951 "doctokenizer.l"
+
+
+
+//--------------------------------------------------------------------------
+
+void doctokenizerYYFindSections(const char *input,Definition *d,
+ MemberGroup *mg,const char *fileName)
+{
+ if (input==0) return;
+ g_inputString = input;
+ //printf("parsing --->`%s'<---\n",input);
+ g_inputPos = 0;
+ g_definition = d;
+ g_memberGroup = mg;
+ g_fileName = fileName;
+ BEGIN(St_Sections);
+ doctokenizerYYlineno = 1;
+ doctokenizerYYlex();
+}
+
+void doctokenizerYYinit(const char *input,const char *fileName)
+{
+ g_inputString = input;
+ g_inputPos = 0;
+ g_fileName = fileName;
+ g_insidePre = FALSE;
+ BEGIN(St_Para);
+}
+
+void doctokenizerYYsetStatePara()
+{
+ BEGIN(St_Para);
+}
+
+void doctokenizerYYsetStateTitle()
+{
+ BEGIN(St_Title);
+}
+
+void doctokenizerYYsetStateTitleAttrValue()
+{
+ BEGIN(St_TitleV);
+}
+
+void doctokenizerYYsetStateCode()
+{
+ g_token->verb="";
+ BEGIN(St_Code);
+}
+
+void doctokenizerYYsetStateXmlCode()
+{
+ g_token->verb="";
+ BEGIN(St_XmlCode);
+}
+
+void doctokenizerYYsetStateHtmlOnly()
+{
+ g_token->verb="";
+ BEGIN(St_HtmlOnly);
+}
+
+void doctokenizerYYsetStateManOnly()
+{
+ g_token->verb="";
+ BEGIN(St_ManOnly);
+}
+
+void doctokenizerYYsetStateXmlOnly()
+{
+ g_token->verb="";
+ BEGIN(St_XmlOnly);
+}
+
+void doctokenizerYYsetStateLatexOnly()
+{
+ g_token->verb="";
+ BEGIN(St_LatexOnly);
+}
+
+void doctokenizerYYsetStateVerbatim()
+{
+ g_token->verb="";
+ BEGIN(St_Verbatim);
+}
+
+void doctokenizerYYsetStateDot()
+{
+ g_token->verb="";
+ BEGIN(St_Dot);
+}
+
+void doctokenizerYYsetStateMsc()
+{
+ g_token->verb="";
+ BEGIN(St_Msc);
+}
+
+void doctokenizerYYsetStateParam()
+{
+ BEGIN(St_Param);
+}
+
+void doctokenizerYYsetStateXRefItem()
+{
+ BEGIN(St_XRefItem);
+}
+
+void doctokenizerYYsetStateFile()
+{
+ BEGIN(St_File);
+}
+
+void doctokenizerYYsetStatePattern()
+{
+ BEGIN(St_Pattern);
+}
+
+void doctokenizerYYsetStateLink()
+{
+ BEGIN(St_Link);
+}
+
+void doctokenizerYYsetStateRef()
+{
+ BEGIN(St_Ref);
+}
+
+void doctokenizerYYsetStateInternalRef()
+{
+ BEGIN(St_IntRef);
+}
+
+void doctokenizerYYsetStateText()
+{
+ BEGIN(St_Text);
+}
+
+void doctokenizerYYsetStateSkipTitle()
+{
+ BEGIN(St_SkipTitle);
+}
+
+void doctokenizerYYcleanup()
+{
+ doctokenizerYY_delete_buffer(YY_CURRENT_BUFFER );
+}
+
+void doctokenizerYYsetInsidePre(bool b)
+{
+ g_insidePre = b;
+}
+
+void doctokenizerYYpushBackHtmlTag(const char *tag)
+{
+ QCString tagName = tag;
+ int i,l = tagName.length();
+ unput('>');
+ for (i=l-1;i>=0;i--)
+ {
+ unput(tag[i]);
+ }
+ unput('<');
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void doctokenizerYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
+
diff --git a/src/doctokenizer.h b/src/doctokenizer.h
new file mode 100644
index 0000000..1b893d3
--- /dev/null
+++ b/src/doctokenizer.h
@@ -0,0 +1,151 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _DOCTOKENIZER_H
+#define _DOCTOKENIZER_H
+
+#include <qcstring.h>
+#include <qlist.h>
+#include "htmlattrib.h"
+
+class Definition;
+class MemberGroup;
+
+enum Tokens
+{
+ TK_WORD = 1,
+ TK_LNKWORD = 2,
+ TK_WHITESPACE = 3,
+ TK_LISTITEM = 4,
+ TK_ENDLIST = 5,
+ TK_COMMAND = 6,
+ TK_HTMLTAG = 7,
+ TK_SYMBOL = 8,
+ TK_NEWPARA = 9,
+ TK_RCSTAG = 10,
+ TK_URL = 11,
+
+ RetVal_OK = 0x10000,
+ RetVal_SimpleSec = 0x10001,
+ RetVal_ListItem = 0x10002,
+ RetVal_Section = 0x10003,
+ RetVal_Subsection = 0x10004,
+ RetVal_Subsubsection = 0x10005,
+ RetVal_Paragraph = 0x10006,
+ RetVal_SubParagraph = 0x10007,
+ RetVal_EndList = 0x10008,
+ RetVal_EndPre = 0x10009,
+ RetVal_DescData = 0x1000A,
+ RetVal_DescTitle = 0x1000B,
+ RetVal_EndDesc = 0x1000C,
+ RetVal_TableRow = 0x1000D,
+ RetVal_TableCell = 0x1000E,
+ RetVal_TableHCell = 0x1000F,
+ RetVal_EndTable = 0x10010,
+ RetVal_Internal = 0x10011,
+ RetVal_SwitchLang = 0x10012,
+ RetVal_CloseXml = 0x10013
+};
+
+struct TokenInfo
+{
+ // unknown token
+ char unknownChar;
+
+ // command token
+ QCString name;
+
+ // command text (RCS tag)
+ QCString text;
+
+ // comment blocks
+
+ // list token info
+ bool isEnumList;
+ int indent;
+
+ // sections
+ QCString sectionId;
+
+ // simple section
+ QCString simpleSectName;
+ QCString simpleSectText;
+
+ // verbatim fragment
+ QCString verb;
+
+ // xrefitem
+ int id;
+
+ // html tag
+ HtmlAttribList attribs;
+ bool endTag;
+ bool emptyTag;
+
+ // whitespace
+ QCString chars;
+
+ // url
+ bool isEMailAddr;
+
+ // param attributes
+ enum ParamDir { In=1, Out=2, InOut=3, Unspecified=0 };
+ ParamDir paramDir;
+};
+
+// globals
+extern TokenInfo *g_token;
+extern int doctokenizerYYlineno;
+extern FILE *doctokenizerYYin;
+
+// helper functions
+const char *tokToString(int token);
+
+// operations on the scanner
+void doctokenizerYYFindSections(const char *input,Definition *d,
+ MemberGroup *mg,const char *fileName);
+void doctokenizerYYinit(const char *input,const char *fileName);
+void doctokenizerYYcleanup();
+void doctokenizerYYpushContext();
+bool doctokenizerYYpopContext();
+int doctokenizerYYlex();
+void doctokenizerYYsetStatePara();
+void doctokenizerYYsetStateTitle();
+void doctokenizerYYsetStateTitleAttrValue();
+void doctokenizerYYsetStateCode();
+void doctokenizerYYsetStateXmlCode();
+void doctokenizerYYsetStateHtmlOnly();
+void doctokenizerYYsetStateManOnly();
+void doctokenizerYYsetStateLatexOnly();
+void doctokenizerYYsetStateXmlOnly();
+void doctokenizerYYsetStateVerbatim();
+void doctokenizerYYsetStateDot();
+void doctokenizerYYsetStateMsc();
+void doctokenizerYYsetStateParam();
+void doctokenizerYYsetStateXRefItem();
+void doctokenizerYYsetStateFile();
+void doctokenizerYYsetStatePattern();
+void doctokenizerYYsetStateLink();
+void doctokenizerYYsetStateRef();
+void doctokenizerYYsetStateInternalRef();
+void doctokenizerYYsetStateText();
+void doctokenizerYYsetStateSkipTitle();
+void doctokenizerYYsetInsidePre(bool b);
+void doctokenizerYYpushBackHtmlTag(const char *tag);
+
+#endif
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
new file mode 100644
index 0000000..b40549c
--- /dev/null
+++ b/src/doctokenizer.l
@@ -0,0 +1,1120 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+
+%{
+
+#include <qfile.h>
+#include <qstring.h>
+#include <qstack.h>
+#include <qdict.h>
+
+#include "doctokenizer.h"
+#include "cmdmapper.h"
+#include "config.h"
+#include "message.h"
+#include "section.h"
+#include "membergroup.h"
+#include "definition.h"
+#include "doxygen.h"
+#include "portable.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+//--------------------------------------------------------------------------
+
+// context for tokenizer phase
+static int g_commentState;
+TokenInfo *g_token = 0;
+static int g_inputPos = 0;
+static const char *g_inputString;
+static QCString g_fileName;
+static bool g_insidePre;
+
+// context for section finding phase
+static Definition *g_definition;
+static MemberGroup *g_memberGroup;
+static QCString g_secLabel;
+static QCString g_secTitle;
+static SectionInfo::SectionType g_secType;
+static QCString g_endMarker;
+
+struct DocLexerContext
+{
+ TokenInfo *token;
+ int rule;
+ int inputPos;
+ const char *inputString;
+ YY_BUFFER_STATE state;
+};
+
+static QStack<DocLexerContext> g_lexerStack;
+
+//--------------------------------------------------------------------------
+
+void doctokenizerYYpushContext()
+{
+ DocLexerContext *ctx = new DocLexerContext;
+ ctx->rule = YY_START;
+ ctx->token = g_token;
+ ctx->inputPos = g_inputPos;
+ ctx->inputString = g_inputString;
+ ctx->state = YY_CURRENT_BUFFER;
+ g_lexerStack.push(ctx);
+ yy_switch_to_buffer(yy_create_buffer(doctokenizerYYin, YY_BUF_SIZE));
+}
+
+bool doctokenizerYYpopContext()
+{
+ if (g_lexerStack.isEmpty()) return FALSE;
+ DocLexerContext *ctx = g_lexerStack.pop();
+ g_inputPos = ctx->inputPos;
+ g_inputString = ctx->inputString;
+ yy_delete_buffer(YY_CURRENT_BUFFER);
+ yy_switch_to_buffer(ctx->state);
+ BEGIN(ctx->rule);
+ delete ctx;
+ return TRUE;
+}
+
+
+//--------------------------------------------------------------------------
+
+const char *tokToString(int token)
+{
+ switch (token)
+ {
+ case 0: return "TK_EOF";
+ case TK_WORD: return "TK_WORD";
+ case TK_LNKWORD: return "TK_LNKWORD";
+ case TK_WHITESPACE: return "TK_WHITESPACE";
+ case TK_LISTITEM: return "TK_LISTITEM";
+ case TK_ENDLIST: return "TK_ENDLIST";
+ case TK_COMMAND: return "TK_COMMAND";
+ case TK_HTMLTAG: return "TK_HTMLTAG";
+ case TK_SYMBOL: return "TK_SYMBOL";
+ case TK_NEWPARA: return "TK_NEWPARA";
+ case TK_RCSTAG: return "TK_RCSTAG";
+ case TK_URL: return "TK_URL";
+ }
+ return "ERROR";
+}
+
+static int computeIndent(const char *str,int length)
+{
+ int i;
+ int indent=0;
+ int tabSize=Config_getInt("TAB_SIZE");
+ for (i=0;i<length;i++)
+ {
+ if (str[i]=='\t')
+ {
+ indent+=tabSize - (indent%tabSize);
+ }
+ else if (str[i]=='\n')
+ {
+ indent=0;
+ }
+ else
+ {
+ indent++;
+ }
+ }
+ return indent;
+}
+
+//--------------------------------------------------------------------------
+
+static void processSection()
+{
+ //printf("%s: found section/anchor with name `%s'\n",g_fileName.data(),g_secLabel.data());
+ QCString file;
+ if (g_memberGroup)
+ {
+ file = g_memberGroup->parent()->getOutputFileBase();
+ }
+ else if (g_definition)
+ {
+ file = g_definition->getOutputFileBase();
+ }
+ else
+ {
+ warn(g_fileName,yylineno,"Found section/anchor %s without context\n",g_secLabel.data());
+ }
+ SectionInfo *si=0;
+ if ((si=Doxygen::sectionDict.find(g_secLabel)))
+ {
+ si->fileName = file;
+ //si = new SectionInfo(file,g_secLabel,g_secTitle,g_secType);
+ //Doxygen::sectionDict.insert(g_secLabel,si);
+ }
+}
+
+static void handleHtmlTag()
+{
+ QCString tagText=yytext;
+ g_token->attribs.clear();
+ g_token->endTag = FALSE;
+ g_token->emptyTag = FALSE;
+
+ // Check for end tag
+ int startNamePos=1;
+ if (tagText.at(1)=='/')
+ {
+ g_token->endTag = TRUE;
+ startNamePos++;
+ }
+
+ // Parse the name portion
+ int i = startNamePos;
+ for (i=startNamePos; i < (int)yyleng; i++)
+ {
+ // Check for valid HTML/XML name chars (including namespaces)
+ char c = tagText.at(i);
+ if (!(isalnum(c) || c=='-' || c=='_' || c==':')) break;
+ }
+ g_token->name = tagText.mid(startNamePos,i-startNamePos);
+
+ // Parse the attributes. Each attribute is a name, value pair
+ // The result is stored in g_token->attribs.
+ int startName,endName,startAttrib,endAttrib;
+ while (i<(int)yyleng)
+ {
+ char c=tagText.at(i);
+ // skip spaces
+ while (i<(int)yyleng && isspace(c)) { c=tagText.at(++i); }
+ // check for end of the tag
+ if (c == '>') break;
+ // Check for XML style "empty" tag.
+ if (c == '/')
+ {
+ g_token->emptyTag = TRUE;
+ break;
+ }
+ startName=i;
+ // search for end of name
+ while (i<(int)yyleng && !isspace(c) && c!='=') { c=tagText.at(++i); }
+ endName=i;
+ HtmlAttrib opt;
+ opt.name = tagText.mid(startName,endName-startName).lower();
+ // skip spaces
+ while (i<(int)yyleng && isspace(c)) { c=tagText.at(++i); }
+ if (tagText.at(i)=='=') // option has value
+ {
+ c=tagText.at(++i);
+ // skip spaces
+ while (i<(int)yyleng && isspace(c)) { c=tagText.at(++i); }
+ if (tagText.at(i)=='\'') // option '...'
+ {
+ c=tagText.at(++i);
+ startAttrib=i;
+
+ // search for matching quote
+ while (i<(int)yyleng && c!='\'') { c=tagText.at(++i); }
+ endAttrib=i;
+ if (i<(int)yyleng) c=tagText.at(++i);
+ }
+ else if (tagText.at(i)=='"') // option "..."
+ {
+ c=tagText.at(++i);
+ startAttrib=i;
+ // search for matching quote
+ while (i<(int)yyleng && c!='"') { c=tagText.at(++i); }
+ endAttrib=i;
+ if (i<(int)yyleng) c=tagText.at(++i);
+ }
+ else // value without any quotes
+ {
+ startAttrib=i;
+ // search for separator or end symbol
+ while (i<(int)yyleng && !isspace(c) && c!='>') { c=tagText.at(++i); }
+ endAttrib=i;
+ if (i<(int)yyleng) c=tagText.at(++i);
+ }
+ opt.value = tagText.mid(startAttrib,endAttrib-startAttrib);
+ }
+ else // start next option
+ {
+ }
+ //printf("=====> Adding option name=<%s> value=<%s>\n",
+ // opt.name.data(),opt.value.data());
+ g_token->attribs.append(&opt);
+ }
+}
+
+static QCString stripEmptyLines(const char *s)
+{
+ if (s==0) return QCString();
+ int result=0,p=0;
+ for (;;)
+ {
+ int c;
+ while ((c=s[p]) && isspace(c)) p++;
+ if (s[p]=='\n') result=++p; else break;
+ }
+ return &s[result];
+}
+
+//--------------------------------------------------------------------------
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ const char *src=g_inputString+g_inputPos;
+ while ( c < max_size && *src ) *buf++ = *src++, c++;
+ g_inputPos+=c;
+ return c;
+}
+
+//--------------------------------------------------------------------------
+
+%}
+
+CMD ("\\"|"@")
+WS [ \t\r\n]
+NONWS [^ \t\r\n]
+BLANK [ \t\r]
+ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
+LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
+MAILADR [a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
+OPTSTARS ("//"{BLANK}*)?"*"*{BLANK}*
+LISTITEM {BLANK}*{OPTSTARS}"-"("#")?{WS}
+ENDLIST {BLANK}*{OPTSTARS}"."{BLANK}*\n
+ATTRIB {ID}{WS}*("="{WS}*(("\""[^\"]*"\"")|("'"[^\']*"'")|[^ \t\r\n'"><]+))?
+URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=]
+URLMASK ({URLCHAR}+([({]{URLCHAR}*[)}])?)*
+FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+]
+FILEECHAR [a-z_A-Z0-9\-\+]
+HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)*
+FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
+LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
+VERBATIM "verbatim"{BLANK}*
+SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM})
+SPCMD2 {CMD}[\\@<>&$#%~"]
+SPCMD3 {CMD}form#[0-9]+
+SPCMD4 {CMD}"::"
+INOUT "in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in")
+PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]"
+TEMPCHAR [a-z_A-Z0-9,: \t\*\&]
+FUNCCHAR [a-z_A-Z0-9,:\<\> \t\*\&\[\]]
+SCOPESEP "::"|"#"|"."
+TEMPLPART "<"{TEMPCHAR}*">"
+SCOPEPRE {ID}{TEMPLPART}?{SCOPESEP}
+SCOPEKEYS ":"({ID}":")*
+SCOPECPP {SCOPEPRE}*(~)?{ID}("<"{TEMPCHAR}*">")?
+SCOPEOBJC {SCOPEPRE}?{ID}{SCOPEKEYS}?
+SCOPEMASK {SCOPECPP}|{SCOPEOBJC}
+FUNCARG "("{FUNCCHAR}*")"({BLANK}*("volatile"|"const"){BLANK})?
+OPNEW {BLANK}+"new"({BLANK}*"[]")?
+OPDEL {BLANK}+"delete"({BLANK}*"[]")?
+OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()"
+OPCAST {BLANK}+[^<(\r\n.,][^(\r\n.,]*
+OPMASK ({BLANK}*{OPNORM}{FUNCARG})
+OPMASKOPT ({BLANK}*{OPNORM}{FUNCARG}?)|({OPCAST}{FUNCARG})
+LNKWORD1 ("::"|"#")?{SCOPEMASK}
+CVSPEC {BLANK}*("const"|"volatile")
+LNKWORD2 (({SCOPEPRE}*"operator"{OPMASK})|({SCOPEPRE}"operator"{OPMASKOPT})|(("::"|"#"){SCOPEPRE}*"operator"{OPMASKOPT})){CVSPEC}?
+LNKWORD3 ([0-9a-z_A-Z\-]+("/"|"\\"))*[0-9a-z_A-Z\-]+("."[0-9a-z_A-Z]+)+
+CHARWORDQ [^ \t\n\r\\@<>()\[\]:;\?{}&%$#,."]
+ESCWORD "%"{ID}(("::"|"."){ID})*
+WORD1 {ESCWORD}|{CHARWORDQ}+|"{"|"}"|"'\"'"|("\""[^"\n]*\n?[^"\n]*"\"")
+WORD2 "."|","|"("|")"|"["|"]"|":"|";"|"\?"
+WORD1NQ {ESCWORD}|{CHARWORDQ}+
+WORD2NQ "."|","|"("|")"|"["|"]"|":"|";"|"\?"
+HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">"
+HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"
+HTMLKEYU "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"SUP"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P"
+HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
+REFWORD2 ("#"|"::")?({ID}{TEMPLPART}?("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}?
+REFWORD3 ({ID}":")*{ID}":"?
+REFWORD {LABELID}|{REFWORD2}|{REFWORD3}
+
+%option noyywrap
+%option yylineno
+
+%x St_Para
+%x St_Comment
+%x St_Title
+%x St_TitleN
+%x St_TitleQ
+%x St_TitleA
+%x St_TitleV
+%x St_Code
+%x St_XmlCode
+%x St_HtmlOnly
+%x St_ManOnly
+%x St_LatexOnly
+%x St_XmlOnly
+%x St_Verbatim
+%x St_Dot
+%x St_Msc
+%x St_Param
+%x St_XRefItem
+%x St_XRefItem2
+%x St_File
+%x St_Pattern
+%x St_Link
+%x St_Ref
+%x St_Ref2
+%x St_IntRef
+%x St_Text
+%x St_SkipTitle
+
+%x St_Sections
+%s St_SecLabel1
+%s St_SecLabel2
+%s St_SecTitle
+%x St_SecSkip
+
+%%
+<St_Para>\r /* skip carriage return */
+<St_Para>^{LISTITEM} { /* list item */
+ QCString text=yytext;
+ int dashPos = text.findRev('-');
+ g_token->isEnumList = text.at(dashPos+1)=='#';
+ g_token->indent = computeIndent(yytext,dashPos);
+ return TK_LISTITEM;
+ }
+<St_Para>{BLANK}*\n{LISTITEM} { /* list item on next line */
+ QCString text=yytext;
+ text=text.right(text.length()-text.find('\n')-1);
+ int dashPos = text.findRev('-');
+ g_token->isEnumList = text.at(dashPos+1)=='#';
+ g_token->indent = computeIndent(text,dashPos);
+ return TK_LISTITEM;
+ }
+<St_Para>^{ENDLIST} { /* end list */
+ int dotPos = QCString(yytext).findRev('.');
+ g_token->indent = computeIndent(yytext,dotPos);
+ return TK_ENDLIST;
+ }
+<St_Para>{BLANK}*\n{ENDLIST} { /* end list on next line */
+ QCString text=yytext;
+ text=text.right(text.length()-text.find('\n')-1);
+ int dotPos = text.findRev('.');
+ g_token->indent = computeIndent(text,dotPos);
+ return TK_ENDLIST;
+ }
+<St_Para>"{"{BLANK}*"@link" {
+ g_token->name = "javalink";
+ return TK_COMMAND;
+ }
+<St_Para>"{"{BLANK}*"@inheritDoc"{BLANK}*"}" {
+ g_token->name = "inheritdoc";
+ return TK_COMMAND;
+ }
+<St_Para>"\\_fakenl" { // artificial new line
+ yylineno++;
+ }
+<St_Para>{SPCMD3} {
+ g_token->name = "form";
+ bool ok;
+ g_token->id = QCString(yytext).right(yyleng-6).toInt(&ok);
+ ASSERT(ok);
+ return TK_COMMAND;
+ }
+<St_Para>{SPCMD1} |
+<St_Para>{SPCMD2} |
+<St_Para>{SPCMD4} { /* special command */
+ g_token->name = yytext+1;
+ g_token->name = g_token->name.stripWhiteSpace();
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND;
+ }
+<St_Para>{PARAMIO} { /* param [in,out] command */
+ g_token->name = "param";
+ QCString s(yytext);
+ bool isIn = s.find("in")!=-1;
+ bool isOut = s.find("out")!=-1;
+ if (isIn)
+ {
+ if (isOut)
+ {
+ g_token->paramDir=TokenInfo::InOut;
+ }
+ else
+ {
+ g_token->paramDir=TokenInfo::In;
+ }
+ }
+ else if (isOut)
+ {
+ g_token->paramDir=TokenInfo::Out;
+ }
+ else
+ {
+ g_token->paramDir=TokenInfo::Unspecified;
+ }
+ return TK_COMMAND;
+ }
+<St_Para>("http:"|"https:"|"ftp:"|"file:"|"news:"){URLMASK} { // URL
+ g_token->name=yytext;
+ g_token->isEMailAddr=FALSE;
+ return TK_URL;
+ }
+<St_Para>{MAILADR} { // Mail address
+ g_token->name=yytext;
+ g_token->isEMailAddr=TRUE;
+ return TK_URL;
+ }
+<St_Para>"$"{ID}":"[^\n$]+"$" { /* RCS tag */
+ QCString tagName(yytext+1);
+ int index=tagName.find(':');
+ g_token->name = tagName.left(index+1);
+ g_token->text = tagName.mid(index+2,tagName.length()-index-3);
+ return TK_RCSTAG;
+ }
+<St_Para,St_HtmlOnly>"$("{ID}")" { /* environment variable */
+ QCString name = &yytext[2];
+ name = name.left(name.length()-1);
+ QCString value = portable_getenv(name);
+ for (int i=value.length()-1;i>=0;i--) unput(value.at(i));
+ }
+<St_Para>{HTMLTAG} { /* html tag */
+ handleHtmlTag();
+ return TK_HTMLTAG;
+ }
+<St_Para,St_Text>"&"{ID}";" { /* special symbol */
+ g_token->name = yytext;
+ return TK_SYMBOL;
+ }
+
+ /********* patterns for linkable words ******************/
+
+<St_Para>{ID}/"<"{HTMLKEYW}">" { /* this rule is to prevent opening html
+ * tag to be recognized as a templated classes
+ */
+ g_token->name = yytext;
+ return TK_LNKWORD;
+ }
+<St_Para>{LNKWORD1}/"<br>" | // prevent <br> html tag to be parsed as template arguments
+<St_Para>{LNKWORD1} |
+<St_Para>{LNKWORD1}{FUNCARG} |
+<St_Para>{LNKWORD2} |
+<St_Para>{LNKWORD3} {
+ g_token->name = yytext;
+ return TK_LNKWORD;
+ }
+<St_Para>{LNKWORD1}{FUNCARG}{CVSPEC}[^a-z_A-Z0-9] {
+ g_token->name = yytext;
+ g_token->name = g_token->name.left(g_token->name.length()-1);
+ unput(yytext[yyleng-1]);
+ return TK_LNKWORD;
+ }
+ /********* patterns for normal words ******************/
+
+<St_Para,St_Text>{WORD1} |
+<St_Para,St_Text>{WORD2} { /* function call */
+ if (yytext[0]=='%') // strip % if present
+ g_token->name = &yytext[1];
+ else
+ g_token->name = yytext;
+ return TK_WORD;
+
+ /* the following is dummy code to please the
+ * compiler, removing this results in a warning
+ * on my machine
+ */
+ goto find_rule;
+ }
+<St_Para,St_Text>"operator"/{BLANK}*"<"[a-zA-Z_0-9]+">" { // Special case: word "operator" followed by a HTML command
+ // avoid interpretation as "operator <"
+ g_token->name = yytext;
+ return TK_WORD;
+ }
+
+ /*******************************************************/
+
+<St_Para,St_Text>{BLANK}+ |
+<St_Para,St_Text>{BLANK}*\n{BLANK}* { /* white space */
+ g_token->chars=yytext;
+ return TK_WHITESPACE;
+ }
+<St_Text>[\\@<>&$#%~] {
+ g_token->name = yytext;
+ return TK_COMMAND;
+ }
+<St_Para>({BLANK}*\n)+{BLANK}*\n {
+ if (g_insidePre)
+ {
+ /* Inside a <pre>..</pre> blank lines are treated
+ * as whitespace.
+ */
+ g_token->chars=yytext;
+ return TK_WHITESPACE;
+ }
+ else
+ {
+ /* start of a new paragraph */
+ return TK_NEWPARA;
+ }
+ }
+<St_Code>{WS}*{CMD}"endcode" {
+ return RetVal_OK;
+ }
+<St_XmlCode>{WS}*"</code>" {
+ return RetVal_OK;
+ }
+<St_Code,St_XmlCode>[^\\@\n<]+ |
+<St_Code,St_XmlCode>\n |
+<St_Code,St_XmlCode>. {
+ g_token->verb+=yytext;
+ }
+<St_HtmlOnly>{CMD}"endhtmlonly" {
+ return RetVal_OK;
+ }
+<St_HtmlOnly>[^\\@\n$]+ |
+<St_HtmlOnly>\n |
+<St_HtmlOnly>. {
+ g_token->verb+=yytext;
+ }
+<St_ManOnly>{CMD}"endmanonly" {
+ return RetVal_OK;
+ }
+<St_ManOnly>[^\\@\n$]+ |
+<St_ManOnly>\n |
+<St_ManOnly>. {
+ g_token->verb+=yytext;
+ }
+<St_LatexOnly>{CMD}"endlatexonly" {
+ return RetVal_OK;
+ }
+<St_LatexOnly>[^\\@\n]+ |
+<St_LatexOnly>\n |
+<St_LatexOnly>. {
+ g_token->verb+=yytext;
+ }
+<St_XmlOnly>{CMD}"endxmlonly" {
+ return RetVal_OK;
+ }
+<St_XmlOnly>[^\\@\n]+ |
+<St_XmlOnly>\n |
+<St_XmlOnly>. {
+ g_token->verb+=yytext;
+ }
+<St_Verbatim>{CMD}"endverbatim" {
+ g_token->verb=stripEmptyLines(g_token->verb);
+ return RetVal_OK;
+ }
+<St_Verbatim>[^\\@\n]+ |
+<St_Verbatim>\n |
+<St_Verbatim>. { /* Verbatim text */
+ g_token->verb+=yytext;
+ }
+<St_Dot>{CMD}"enddot" {
+ return RetVal_OK;
+ }
+<St_Dot>[^\\@\n]+ |
+<St_Dot>\n |
+<St_Dot>. { /* dot text */
+ g_token->verb+=yytext;
+ }
+<St_Msc>{CMD}"endmsc" {
+ return RetVal_OK;
+ }
+<St_Msc>[^\\@\n]+ |
+<St_Msc>\n |
+<St_Msc>. { /* msc text */
+ g_token->verb+=yytext;
+ }
+<St_Title>"\"" { // quoted title
+ BEGIN(St_TitleQ);
+ }
+<St_Title>[ \t]+ {
+ g_token->chars=yytext;
+ return TK_WHITESPACE;
+ }
+<St_Title>. { // non-quoted title
+ unput(*yytext);
+ BEGIN(St_TitleN);
+ }
+<St_Title>\n {
+ unput(*yytext);
+ return 0;
+ }
+<St_TitleN>"&"{ID}";" { /* symbol */
+ g_token->name = yytext;
+ return TK_SYMBOL;
+ }
+<St_TitleN>{HTMLTAG} {
+ }
+<St_TitleN>{SPCMD1} |
+<St_TitleN>{SPCMD2} { /* special command */
+ g_token->name = yytext+1;
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND;
+ }
+<St_TitleN>{WORD1} |
+<St_TitleN>{WORD2} { /* word */
+ if (yytext[0]=='%') // strip % if present
+ g_token->name = &yytext[1];
+ else
+ g_token->name = yytext;
+ return TK_WORD;
+ }
+<St_TitleN>[ \t]+ {
+ g_token->chars=yytext;
+ return TK_WHITESPACE;
+ }
+<St_TitleN>\n { /* new line => end of title */
+ unput(*yytext);
+ return 0;
+ }
+<St_TitleQ>"&"{ID}";" { /* symbol */
+ g_token->name = yytext;
+ return TK_SYMBOL;
+ }
+<St_TitleQ>{SPCMD1} |
+<St_TitleQ>{SPCMD2} { /* special command */
+ g_token->name = yytext+1;
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND;
+ }
+<St_TitleQ>{WORD1NQ} |
+<St_TitleQ>{WORD2NQ} { /* word */
+ g_token->name = yytext;
+ return TK_WORD;
+ }
+<St_TitleQ>[ \t]+ {
+ g_token->chars=yytext;
+ return TK_WHITESPACE;
+ }
+<St_TitleQ>"\"" { /* closing quote => end of title */
+ BEGIN(St_TitleA);
+ return 0;
+ }
+<St_TitleQ>\n { /* new line => end of title */
+ unput(*yytext);
+ return 0;
+ }
+<St_TitleA>{BLANK}*{ID}{BLANK}*"="{BLANK}* { // title attribute
+ g_token->name = yytext;
+ g_token->name = g_token->name.left(
+ g_token->name.find('=')).stripWhiteSpace();
+ BEGIN(St_TitleV);
+ }
+<St_TitleV>[^ \t\r\n]+ { // attribute value
+ g_token->chars = yytext;
+ BEGIN(St_TitleN);
+ return TK_WORD;
+ }
+<St_TitleV,St_TitleA>. {
+ unput(*yytext);
+ return 0;
+ }
+<St_TitleV,St_TitleA>\n {
+ return 0;
+ }
+
+<St_Ref>{REFWORD} { // label to refer to
+ g_token->name=yytext;
+ return TK_WORD;
+ }
+<St_Ref>{BLANK} { // white space
+ unput(' ');
+ return 0;
+ }
+<St_Ref>{WS}+"\""{WS}* { // white space following by quoted string
+ BEGIN(St_Ref2);
+ }
+<St_Ref>\n { // new line
+ unput(*yytext);
+ return 0;
+ }
+<St_Ref>. { // any other character
+ unput(*yytext);
+ return 0;
+ }
+<St_IntRef>[A-Z_a-z0-9.:/#\-\+\(\)]+ {
+ g_token->name = yytext;
+ return TK_WORD;
+ }
+<St_IntRef>{BLANK}+"\"" {
+ BEGIN(St_Ref2);
+ }
+<St_Ref2>"&"{ID}";" { /* symbol */
+ g_token->name = yytext;
+ return TK_SYMBOL;
+ }
+<St_Ref2>{SPCMD1} |
+<St_Ref2>{SPCMD2} { /* special command */
+ g_token->name = yytext+1;
+ g_token->paramDir=TokenInfo::Unspecified;
+ return TK_COMMAND;
+ }
+<St_Ref2>{WORD1NQ} |
+<St_Ref2>{WORD2NQ} {
+ /* word */
+ g_token->name = yytext;
+ return TK_WORD;
+ }
+<St_Ref2>[ \t]+ {
+ g_token->chars=yytext;
+ return TK_WHITESPACE;
+ }
+<St_Ref2>"\""|\n { /* " or \n => end of title */
+ return 0;
+ }
+<St_XRefItem>{LABELID} {
+ g_token->name=yytext;
+ }
+<St_XRefItem>" " {
+ BEGIN(St_XRefItem2);
+ }
+<St_XRefItem2>[0-9]+"." {
+ QCString numStr=yytext;
+ numStr=numStr.left(yyleng-1);
+ g_token->id=numStr.toInt();
+ return RetVal_OK;
+ }
+<St_Para,St_Title,St_Ref2>"<!--" { /* html style comment block */
+ g_commentState = YY_START;
+ BEGIN(St_Comment);
+ }
+<St_Param>"\""[^\n\"]+"\"" {
+ g_token->name = yytext+1;
+ g_token->name = g_token->name.left(yyleng-2);
+ return TK_WORD;
+ }
+<St_Param>({LABELID}"|")*{LABELID}{WS}+("&")?"$"{LABELID} {
+ QCString params = yytext;
+ int j = params.find('&');
+ int i = params.find('$');
+ if (j<i && j!=-1) i=j;
+ QCString types = params.left(i).stripWhiteSpace();
+ g_token->name = types+"#"+params.mid(i);
+ return TK_WORD;
+ }
+<St_Param>[^ \t\n,]+ {
+ g_token->name = yytext;
+ return TK_WORD;
+ }
+<St_Param>{WS}*","{WS}* /* param separator */
+<St_Param>{WS} {
+ g_token->chars=yytext;
+ return TK_WHITESPACE;
+ }
+<St_File>{FILEMASK} {
+ g_token->name = yytext;
+ return TK_WORD;
+ }
+<St_File>"\""[^\n\"]+"\"" {
+ QCString text=yytext;
+ g_token->name = text.mid(1,text.length()-2);
+ return TK_WORD;
+ }
+<St_Pattern>[^\r\n]+ {
+ g_token->name = yytext;
+ g_token->name = g_token->name.stripWhiteSpace();
+ return TK_WORD;
+ }
+<St_Link>{LINKMASK}|{REFWORD} {
+ g_token->name = yytext;
+ return TK_WORD;
+ }
+<St_Comment>"-->" { /* end of html comment */
+ BEGIN(g_commentState);
+ }
+<St_Comment>[^-\n]+ /* inside html comment */
+<St_Comment>. /* inside html comment */
+
+ /* State for skipping title (all chars until the end of the line) */
+
+<St_SkipTitle>.
+<St_SkipTitle>\n { return 0; }
+
+ /* State for the pass used to find the anchors and sections */
+
+<St_Sections>[^\n@\\]+
+<St_Sections>"@@"|"\\\\"
+<St_Sections>{CMD}"anchor"{BLANK}+ {
+ g_secType = SectionInfo::Anchor;
+ BEGIN(St_SecLabel1);
+ }
+<St_Sections>{CMD}"section"{BLANK}+ {
+ g_secType = SectionInfo::Section;
+ BEGIN(St_SecLabel2);
+ }
+<St_Sections>{CMD}"subsection"{BLANK}+ {
+ g_secType = SectionInfo::Subsection;
+ BEGIN(St_SecLabel2);
+ }
+<St_Sections>{CMD}"subsubsection"{BLANK}+ {
+ g_secType = SectionInfo::Subsubsection;
+ BEGIN(St_SecLabel2);
+ }
+<St_Sections>{CMD}"paragraph"{BLANK}+ {
+ g_secType = SectionInfo::Paragraph;
+ BEGIN(St_SecLabel2);
+ }
+<St_Sections>{CMD}"verbatim"/[^a-z_A-Z0-9] {
+ g_endMarker="endverbatim";
+ BEGIN(St_SecSkip);
+ }
+<St_Sections>{CMD}"dot"/[^a-z_A-Z0-9] {
+ g_endMarker="enddot";
+ BEGIN(St_SecSkip);
+ }
+<St_Sections>{CMD}"msc"/[^a-z_A-Z0-9] {
+ g_endMarker="endmsc";
+ BEGIN(St_SecSkip);
+ }
+<St_Sections>{CMD}"htmlonly"/[^a-z_A-Z0-9] {
+ g_endMarker="endhtmlonly";
+ BEGIN(St_SecSkip);
+ }
+<St_Sections>{CMD}"latexonly"/[^a-z_A-Z0-9] {
+ g_endMarker="endlatexonly";
+ BEGIN(St_SecSkip);
+ }
+<St_Sections>{CMD}"xmlonly"/[^a-z_A-Z0-9] {
+ g_endMarker="endxmlonly";
+ BEGIN(St_SecSkip);
+ }
+<St_Sections>{CMD}"code"/[^a-z_A-Z0-9] {
+ g_endMarker="endcode";
+ BEGIN(St_SecSkip);
+ }
+<St_Sections>"<!--" {
+ g_endMarker="-->";
+ BEGIN(St_SecSkip);
+ }
+<St_SecSkip>{CMD}{ID} {
+ if (strcmp(yytext+1,g_endMarker)==0)
+ {
+ BEGIN(St_Sections);
+ }
+ }
+<St_SecSkip>"-->" {
+ if (strcmp(yytext,g_endMarker)==0)
+ {
+ BEGIN(St_Sections);
+ }
+ }
+<St_SecSkip>[^a-z_A-Z0-9\-\\\@]+
+<St_SecSkip>.
+<St_SecSkip>\n
+<St_Sections>.
+<St_Sections>\n
+<St_SecLabel1>{LABELID} {
+ g_secLabel = yytext;
+ processSection();
+ BEGIN(St_Sections);
+ }
+<St_SecLabel2>{LABELID}{BLANK}+ |
+<St_SecLabel2>{LABELID} {
+ g_secLabel = yytext;
+ g_secLabel = g_secLabel.stripWhiteSpace();
+ BEGIN(St_SecTitle);
+ }
+<St_SecTitle>[^\n]+ |
+<St_SecTitle>[^\n]*\n {
+ g_secTitle = yytext;
+ g_secTitle = g_secTitle.stripWhiteSpace();
+ processSection();
+ BEGIN(St_Sections);
+ }
+<St_SecTitle,St_SecLabel1,St_SecLabel2>. {
+ warn(g_fileName,yylineno,"warning: Unexpected character `%s' while looking for section label or title",yytext);
+ }
+
+ /* Generic rules that work for all states */
+<*>\n {
+ warn(g_fileName,yylineno,"warning: Unexpected new line character");
+ }
+<*>[\\@<>&$#%~"] { /* unescaped special character */
+ //warn(g_fileName,yylineno,"warning: Unexpected character `%s', assuming command \\%s was meant.",yytext,yytext);
+ g_token->name = yytext;
+ return TK_COMMAND;
+ }
+<*>. {
+ warn(g_fileName,yylineno,"warning: Unexpected character `%s'",yytext);
+ }
+%%
+
+//--------------------------------------------------------------------------
+
+void doctokenizerYYFindSections(const char *input,Definition *d,
+ MemberGroup *mg,const char *fileName)
+{
+ if (input==0) return;
+ g_inputString = input;
+ //printf("parsing --->`%s'<---\n",input);
+ g_inputPos = 0;
+ g_definition = d;
+ g_memberGroup = mg;
+ g_fileName = fileName;
+ BEGIN(St_Sections);
+ doctokenizerYYlineno = 1;
+ doctokenizerYYlex();
+}
+
+void doctokenizerYYinit(const char *input,const char *fileName)
+{
+ g_inputString = input;
+ g_inputPos = 0;
+ g_fileName = fileName;
+ g_insidePre = FALSE;
+ BEGIN(St_Para);
+}
+
+void doctokenizerYYsetStatePara()
+{
+ BEGIN(St_Para);
+}
+
+void doctokenizerYYsetStateTitle()
+{
+ BEGIN(St_Title);
+}
+
+void doctokenizerYYsetStateTitleAttrValue()
+{
+ BEGIN(St_TitleV);
+}
+
+void doctokenizerYYsetStateCode()
+{
+ g_token->verb="";
+ BEGIN(St_Code);
+}
+
+void doctokenizerYYsetStateXmlCode()
+{
+ g_token->verb="";
+ BEGIN(St_XmlCode);
+}
+
+void doctokenizerYYsetStateHtmlOnly()
+{
+ g_token->verb="";
+ BEGIN(St_HtmlOnly);
+}
+
+void doctokenizerYYsetStateManOnly()
+{
+ g_token->verb="";
+ BEGIN(St_ManOnly);
+}
+
+void doctokenizerYYsetStateXmlOnly()
+{
+ g_token->verb="";
+ BEGIN(St_XmlOnly);
+}
+
+void doctokenizerYYsetStateLatexOnly()
+{
+ g_token->verb="";
+ BEGIN(St_LatexOnly);
+}
+
+void doctokenizerYYsetStateVerbatim()
+{
+ g_token->verb="";
+ BEGIN(St_Verbatim);
+}
+
+void doctokenizerYYsetStateDot()
+{
+ g_token->verb="";
+ BEGIN(St_Dot);
+}
+
+void doctokenizerYYsetStateMsc()
+{
+ g_token->verb="";
+ BEGIN(St_Msc);
+}
+
+void doctokenizerYYsetStateParam()
+{
+ BEGIN(St_Param);
+}
+
+void doctokenizerYYsetStateXRefItem()
+{
+ BEGIN(St_XRefItem);
+}
+
+void doctokenizerYYsetStateFile()
+{
+ BEGIN(St_File);
+}
+
+void doctokenizerYYsetStatePattern()
+{
+ BEGIN(St_Pattern);
+}
+
+void doctokenizerYYsetStateLink()
+{
+ BEGIN(St_Link);
+}
+
+void doctokenizerYYsetStateRef()
+{
+ BEGIN(St_Ref);
+}
+
+void doctokenizerYYsetStateInternalRef()
+{
+ BEGIN(St_IntRef);
+}
+
+void doctokenizerYYsetStateText()
+{
+ BEGIN(St_Text);
+}
+
+void doctokenizerYYsetStateSkipTitle()
+{
+ BEGIN(St_SkipTitle);
+}
+
+void doctokenizerYYcleanup()
+{
+ yy_delete_buffer( YY_CURRENT_BUFFER );
+}
+
+void doctokenizerYYsetInsidePre(bool b)
+{
+ g_insidePre = b;
+}
+
+void doctokenizerYYpushBackHtmlTag(const char *tag)
+{
+ QCString tagName = tag;
+ int i,l = tagName.length();
+ unput('>');
+ for (i=l-1;i>=0;i--)
+ {
+ unput(tag[i]);
+ }
+ unput('<');
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void doctokenizerYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
diff --git a/src/docvisitor.h b/src/docvisitor.h
new file mode 100644
index 0000000..6db53d0
--- /dev/null
+++ b/src/docvisitor.h
@@ -0,0 +1,189 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _DOCVISITOR_H
+#define _DOCVISITOR_H
+
+// ids
+const int DocVisitor_Html = 0;
+const int DocVisitor_Latex = 1;
+const int DocVisitor_XML = 2;
+const int DocVisitor_RTF = 3;
+const int DocVisitor_Man = 4;
+const int DocVisitor_Text = 5;
+const int DocVisitor_Other = 6;
+
+// forward declarations
+class DocWord;
+class DocWhiteSpace;
+class DocAutoList;
+class DocAutoListItem;
+class DocPara;
+class DocRoot;
+class DocSymbol;
+class DocURL;
+class DocStyleChange;
+class DocSimpleSect;
+class DocTitle;
+class DocSimpleList;
+class DocSimpleListItem;
+class DocSection;
+class DocVerbatim;
+class DocXRefItem;
+class DocHtmlList;
+class DocHtmlListItem;
+class DocHtmlDescList;
+class DocHtmlDescTitle;
+class DocHtmlDescData;
+class DocHtmlTable;
+class DocHtmlRow;
+class DocHtmlCell;
+class DocHtmlCaption;
+class DocLineBreak;
+class DocHorRuler;
+class DocAnchor;
+class DocIndexEntry;
+class DocInternal;
+class DocHRef;
+class DocInclude;
+class DocIncOperator;
+class DocHtmlHeader;
+class DocImage;
+class DocDotFile;
+class DocMscFile;
+class DocLink;
+class DocRef;
+class DocFormula;
+class DocSecRefItem;
+class DocSecRefList;
+//class DocLanguage;
+class DocLinkedWord;
+class DocParamSect;
+class DocParamList;
+class DocInternalRef;
+class DocCopy;
+class DocText;
+class DocSimpleSectSep;
+
+/*! @brief Abstract visitor that participates in the visitor pattern.
+ */
+class DocVisitor
+{
+ int m_id;
+ public:
+ DocVisitor(int id) : m_id(id) {}
+ virtual ~DocVisitor() {}
+ int id() const { return m_id; }
+
+ /*! @name Visitor functions for leaf nodes
+ * @{
+ */
+ virtual void visit(DocWord *) = 0;
+ virtual void visit(DocWhiteSpace *) = 0;
+ virtual void visit(DocSymbol *) = 0;
+ virtual void visit(DocURL *) = 0;
+ virtual void visit(DocStyleChange *) = 0;
+ virtual void visit(DocVerbatim *) = 0;
+ virtual void visit(DocLineBreak *) = 0;
+ virtual void visit(DocHorRuler *) = 0;
+ virtual void visit(DocAnchor *) = 0;
+ virtual void visit(DocInclude *) = 0;
+ virtual void visit(DocIncOperator *) = 0;
+ virtual void visit(DocFormula *) = 0;
+ virtual void visit(DocLinkedWord *) = 0;
+ virtual void visit(DocIndexEntry *) = 0;
+ virtual void visit(DocSimpleSectSep *) = 0;
+ /*! @} */
+
+ /*! @name Visitor functions for internal nodes
+ * @{
+ */
+ virtual void visitPre(DocAutoList *) = 0;
+ virtual void visitPost(DocAutoList *) = 0;
+ virtual void visitPre(DocAutoListItem *) = 0;
+ virtual void visitPost(DocAutoListItem *) = 0;
+ virtual void visitPre(DocPara *) = 0;
+ virtual void visitPost(DocPara *) = 0;
+ virtual void visitPre(DocRoot *) = 0;
+ virtual void visitPost(DocRoot *) = 0;
+ virtual void visitPre(DocSimpleSect *) = 0;
+ virtual void visitPost(DocSimpleSect *) = 0;
+ virtual void visitPre(DocTitle *) = 0;
+ virtual void visitPost(DocTitle *) = 0;
+ virtual void visitPre(DocSimpleList *) = 0;
+ virtual void visitPost(DocSimpleList *) = 0;
+ virtual void visitPre(DocSimpleListItem *) = 0;
+ virtual void visitPost(DocSimpleListItem *) = 0;
+ virtual void visitPre(DocSection *) = 0;
+ virtual void visitPost(DocSection *) = 0;
+ virtual void visitPre(DocHtmlList *) = 0;
+ virtual void visitPost(DocHtmlListItem *) = 0;
+ virtual void visitPre(DocHtmlListItem *) = 0;
+ virtual void visitPost(DocHtmlList *) = 0;
+ virtual void visitPre(DocHtmlDescList *) = 0;
+ virtual void visitPost(DocHtmlDescList *) = 0;
+ virtual void visitPre(DocHtmlDescTitle *) = 0;
+ virtual void visitPost(DocHtmlDescTitle *) = 0;
+ virtual void visitPre(DocHtmlDescData *) = 0;
+ virtual void visitPost(DocHtmlDescData *) = 0;
+ virtual void visitPre(DocHtmlTable *) = 0;
+ virtual void visitPost(DocHtmlRow *) = 0;
+ virtual void visitPre(DocHtmlCell *) = 0;
+ virtual void visitPost(DocHtmlCell *) = 0;
+ virtual void visitPre(DocHtmlRow *) = 0;
+ virtual void visitPost(DocHtmlTable *) = 0;
+ virtual void visitPre(DocHtmlCaption *) = 0;
+ virtual void visitPost(DocHtmlCaption *) = 0;
+ virtual void visitPre(DocInternal *) = 0;
+ virtual void visitPost(DocInternal *) = 0;
+ virtual void visitPre(DocHRef *) = 0;
+ virtual void visitPost(DocHRef *) = 0;
+ virtual void visitPre(DocHtmlHeader *) = 0;
+ virtual void visitPost(DocHtmlHeader *) = 0;
+ virtual void visitPre(DocImage *) = 0;
+ virtual void visitPost(DocImage *) = 0;
+ virtual void visitPre(DocDotFile *) = 0;
+ virtual void visitPost(DocDotFile *) = 0;
+ virtual void visitPre(DocMscFile *) = 0;
+ virtual void visitPost(DocMscFile *) = 0;
+ virtual void visitPre(DocLink *) = 0;
+ virtual void visitPost(DocLink *) = 0;
+ virtual void visitPre(DocRef *) = 0;
+ virtual void visitPost(DocRef *) = 0;
+ virtual void visitPre(DocSecRefItem *) = 0;
+ virtual void visitPost(DocSecRefItem *) = 0;
+ virtual void visitPre(DocSecRefList *) = 0;
+ virtual void visitPost(DocSecRefList *) = 0;
+ //virtual void visitPre(DocLanguage *) = 0;
+ //virtual void visitPost(DocLanguage *) = 0;
+ virtual void visitPre(DocParamSect *) = 0;
+ virtual void visitPost(DocParamSect *) = 0;
+ virtual void visitPre(DocParamList *) = 0;
+ virtual void visitPost(DocParamList *) = 0;
+ virtual void visitPre(DocXRefItem *) = 0;
+ virtual void visitPost(DocXRefItem *) = 0;
+ virtual void visitPre(DocInternalRef *) = 0;
+ virtual void visitPost(DocInternalRef *) = 0;
+ virtual void visitPre(DocCopy *) = 0;
+ virtual void visitPost(DocCopy *) = 0;
+ virtual void visitPre(DocText *) = 0;
+ virtual void visitPost(DocText *) = 0;
+ /*! @} */
+};
+
+#endif
diff --git a/src/dot.cpp b/src/dot.cpp
new file mode 100644
index 0000000..a8d49b5
--- /dev/null
+++ b/src/dot.cpp
@@ -0,0 +1,4174 @@
+/*****************************************************************************
+ *
+ * $Id: dot.cpp,v 1.20 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#define BITMAP W_BITMAP
+#endif
+
+#include <stdlib.h>
+
+#include "dot.h"
+#include "doxygen.h"
+#include "message.h"
+#include "util.h"
+#include "config.h"
+#include "language.h"
+#include "defargs.h"
+#include "docparser.h"
+#include "debug.h"
+#include "pagedef.h"
+#include "portable.h"
+#include "dirdef.h"
+#include "vhdldocgen.h"
+#include <qdir.h>
+#include <qfile.h>
+#include "ftextstream.h"
+#include "md5.h"
+#include <qqueue.h>
+
+#include <qthread.h>
+#include <qmutex.h>
+#include <qwaitcondition.h>
+
+#define MAP_CMD "cmapx"
+
+//#define FONTNAME "Helvetica"
+#define FONTNAME getDotFontName()
+#define FONTSIZE getDotFontSize()
+
+//--------------------------------------------------------------------
+
+static const int maxCmdLine = 40960;
+
+/*! mapping from protection levels to color names */
+static const char *edgeColorMap[] =
+{
+ "midnightblue", // Public
+ "darkgreen", // Protected
+ "firebrick4", // Private
+ "darkorchid3", // "use" relation
+ "grey75", // Undocumented
+ "orange" // template relation
+};
+
+static const char *arrowStyle[] =
+{
+ "empty", // Public
+ "empty", // Protected
+ "empty", // Private
+ "open", // "use" relation
+ 0, // Undocumented
+ 0 // template relation
+};
+
+static const char *edgeStyleMap[] =
+{
+ "solid", // inheritance
+ "dashed" // usage
+};
+
+static QCString getDotFontName()
+{
+ static QCString dotFontName = Config_getString("DOT_FONTNAME");
+ if (dotFontName.isEmpty())
+ {
+ //dotFontName="FreeSans.ttf";
+ dotFontName="Helvetica";
+ }
+ return dotFontName;
+}
+
+static int getDotFontSize()
+{
+ static int dotFontSize = Config_getInt("DOT_FONTSIZE");
+ if (dotFontSize<4) dotFontSize=4;
+ return dotFontSize;
+}
+
+static void writeGraphHeader(FTextStream &t)
+{
+ t << "digraph G" << endl;
+ t << "{" << endl;
+ if (Config_getBool("DOT_TRANSPARENT"))
+ {
+ t << " bgcolor=\"transparent\";" << endl;
+ }
+ t << " edge [fontname=\"" << FONTNAME << "\","
+ "fontsize=\"" << FONTSIZE << "\","
+ "labelfontname=\"" << FONTNAME << "\","
+ "labelfontsize=\"" << FONTSIZE << "\"];\n";
+ t << " node [fontname=\"" << FONTNAME << "\","
+ "fontsize=\"" << FONTSIZE << "\",shape=record];\n";
+}
+
+static void writeGraphFooter(FTextStream &t)
+{
+ t << "}" << endl;
+}
+
+static QCString replaceRef(const QCString &buf,const QCString relPath,
+ bool urlOnly,const QCString &context,const QCString &target=QCString())
+{
+ // search for href="...", store ... part in link
+ QCString href = "href";
+ bool isXLink=FALSE;
+ int len = 6;
+ int indexS = buf.find("href=\""), indexE;
+ if (indexS>5 && buf.find("xlink:href=\"")!=-1) // XLink href (for SVG)
+ {
+ indexS-=6;
+ len+=6;
+ href.prepend("xlink:");
+ isXLink=TRUE;
+ }
+ if (indexS>=0 && (indexE=buf.find('"',indexS+len))!=-1)
+ {
+ QCString link = buf.mid(indexS+len,indexE-indexS-len);
+ QCString result;
+ if (urlOnly) // for user defined dot graphs
+ {
+ if (link.left(5)=="\\ref " || link.left(5)=="@ref ") // \ref url
+ {
+ result=href+"=\"";
+ // fake ref node to resolve the url
+ DocRef *df = new DocRef( (DocNode*) 0, link.mid(5), context );
+ result+=externalRef(relPath,df->ref(),TRUE);
+ if (!df->file().isEmpty())
+ result += df->file().data() + Doxygen::htmlFileExtension;
+ if (!df->anchor().isEmpty())
+ result += "#" + df->anchor();
+ delete df;
+ result += "\"";
+ }
+ else
+ {
+ result = href+"=\"" + link + "\"";
+ }
+ }
+ else // ref$url (external ref via tag file), or $url (local ref)
+ {
+ int marker = link.find('$');
+ if (marker!=-1)
+ {
+ QCString ref = link.left(marker);
+ QCString url = link.mid(marker+1);
+ if (!ref.isEmpty())
+ {
+ result = externalLinkTarget() + externalRef(relPath,ref,FALSE);
+ }
+ result+= href+"=\"";
+ result+=externalRef(relPath,ref,TRUE);
+ result+= url + "\"";
+ }
+ else // should not happen, but handle properly anyway
+ {
+ result = href+"=\"" + link + "\"";
+ }
+ }
+ if (!target.isEmpty())
+ {
+ result+=" target=\""+target+"\"";
+ }
+ QCString leftPart = buf.left(indexS);
+ QCString rightPart = buf.mid(indexE+1);
+ return leftPart + result + rightPart;
+ }
+ else
+ {
+ return buf;
+ }
+}
+
+/*! converts the rectangles in a client site image map into a stream
+ * \param t the stream to which the result is written.
+ * \param mapName the name of the map file.
+ * \param relPath the relative path to the root of the output directory
+ * (used in case CREATE_SUBDIRS is enabled).
+ * \param urlOnly if FALSE the url field in the map contains an external
+ * references followed by a $ and then the URL.
+ * \param context the context (file, class, or namespace) in which the
+ * map file was found
+ * \returns TRUE if succesful.
+ */
+static bool convertMapFile(FTextStream &t,const char *mapName,
+ const QCString relPath, bool urlOnly=FALSE,
+ const QCString &context=QCString())
+{
+ QFile f(mapName);
+ if (!f.open(IO_ReadOnly))
+ {
+ err("error: problems opening map file %s for inclusion in the docs!\n"
+ "If you installed Graphviz/dot after a previous failing run, \n"
+ "try deleting the output directory and rerun doxygen.\n",mapName);
+ return FALSE;
+ }
+ const int maxLineLen=10240;
+ while (!f.atEnd()) // foreach line
+ {
+ QCString buf(maxLineLen);
+ int numBytes = f.readLine(buf.data(),maxLineLen);
+ buf[numBytes-1]='\0';
+
+ if (buf.left(5)=="<area")
+ {
+ t << replaceRef(buf,relPath,urlOnly,context);
+ }
+ }
+ return TRUE;
+}
+
+static QArray<int> s_newNumber;
+static int s_max_newNumber=0;
+
+inline int reNumberNode(int number, bool doReNumbering)
+{
+ if (!doReNumbering)
+ {
+ return number;
+ }
+ else
+ {
+ int s = s_newNumber.size();
+ if (number>=s)
+ {
+ int ns=0;
+ ns = s * 3 / 2 + 5; // new size
+ if (number>=ns) // number still doesn't fit
+ {
+ ns = number * 3 / 2 + 5;
+ }
+ s_newNumber.resize(ns);
+ for (int i=s;i<ns;i++) // clear new part of the array
+ {
+ s_newNumber.at(i)=0;
+ }
+ }
+ int i = s_newNumber.at(number);
+ if (i == 0) // not yet mapped
+ {
+ i = ++s_max_newNumber; // start from 1
+ s_newNumber.at(number) = i;
+ }
+ return i;
+ }
+}
+
+static void resetReNumbering()
+{
+ s_max_newNumber=0;
+ s_newNumber.resize(s_max_newNumber);
+}
+
+static QCString g_dotFontPath;
+
+static void setDotFontPath(const char *path)
+{
+ ASSERT(g_dotFontPath.isEmpty());
+ g_dotFontPath = portable_getenv("DOTFONTPATH");
+ QCString newFontPath = Config_getString("DOT_FONTPATH");
+ QCString spath = path;
+ if (!newFontPath.isEmpty() && !spath.isEmpty())
+ {
+ newFontPath.prepend(spath+portable_pathListSeparator());
+ }
+ else if (newFontPath.isEmpty() && !spath.isEmpty())
+ {
+ newFontPath=path;
+ }
+ else
+ {
+ portable_unsetenv("DOTFONTPATH");
+ return;
+ }
+ portable_setenv("DOTFONTPATH",newFontPath);
+}
+
+static void unsetDotFontPath()
+{
+ if (g_dotFontPath.isEmpty())
+ {
+ portable_unsetenv("DOTFONTPATH");
+ }
+ else
+ {
+ portable_setenv("DOTFONTPATH",g_dotFontPath);
+ }
+ g_dotFontPath="";
+}
+
+static bool readBoundingBox(const char *fileName,int *width,int *height,bool isEps)
+{
+ QCString bb = isEps ? QCString("%%PageBoundingBox:") : QCString(" /MediaBox [ ");
+ QFile f(fileName);
+ if (!f.open(IO_ReadOnly|IO_Raw))
+ {
+ //printf("readBoundingBox: could not open %s\n",fileName);
+ return FALSE;
+ }
+ const int maxLineLen=1024;
+ char buf[maxLineLen];
+ while (!f.atEnd())
+ {
+ int numBytes = f.readLine(buf,maxLineLen-1); // read line
+ if (numBytes>0)
+ {
+ buf[numBytes]='\0';
+ if (strncmp(buf,bb.data(),bb.length()-1)==0) // found PageBoundingBox string
+ {
+ int x,y;
+ if (sscanf(buf+bb.length(),"%d %d %d %d",&x,&y,width,height)!=4)
+ {
+ //printf("readBoundingBox sscanf fail\n");
+ return FALSE;
+ }
+ return TRUE;
+ }
+ }
+ else // read error!
+ {
+ //printf("Read error %d!\n",numBytes);
+ return FALSE;
+ }
+ }
+ //printf("readBoundingBox: bounding box not found\n");
+ return FALSE;
+}
+
+static bool writeVecGfxFigure(FTextStream &out,const QCString &baseName,
+ const QCString &figureName)
+{
+ int width=420,height=600;
+ static bool usePdfLatex = Config_getBool("USE_PDFLATEX");
+ if (usePdfLatex)
+ {
+ if (!readBoundingBox(figureName+".pdf",&width,&height,FALSE))
+ {
+ //printf("writeVecGfxFigure()=0\n");
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!readBoundingBox(figureName+".eps",&width,&height,TRUE))
+ {
+ //printf("writeVecGfxFigure()=0\n");
+ return FALSE;
+ }
+ }
+ //printf("Got PDF/EPS size %d,%d\n",width,height);
+ int maxWidth = 400; /* approx. page width in points, excl. margins */
+ int maxHeight = 600; /* approx. page height in points, excl. margins */
+ out << "\\nopagebreak\n"
+ "\\begin{figure}[H]\n"
+ "\\begin{center}\n"
+ "\\leavevmode\n";
+ if (width>maxWidth || height>maxHeight) // figure too big for page
+ {
+ // c*width/maxWidth > c*height/maxHeight, where c=maxWidth*maxHeight>0
+ if (width*maxHeight>height*maxWidth)
+ {
+ out << "\\includegraphics[width=" << maxWidth << "pt]";
+ }
+ else
+ {
+ out << "\\includegraphics[height=" << maxHeight << "pt]";
+ }
+ }
+ else
+ {
+ out << "\\includegraphics[width=" << width << "pt]";
+ }
+
+ out << "{" << baseName << "}\n"
+ "\\end{center}\n"
+ "\\end{figure}\n";
+
+ //printf("writeVecGfxFigure()=1\n");
+ return TRUE;
+}
+
+// extract size from a dot generated SVG file
+static bool readSVGSize(const QCString &fileName,int *width,int *height)
+{
+ bool found=FALSE;
+ QFile f(fileName);
+ if (!f.open(IO_ReadOnly))
+ {
+ return FALSE;
+ }
+ const int maxLineLen=4096;
+ char buf[maxLineLen];
+ while (!f.atEnd() && !found)
+ {
+ int numBytes = f.readLine(buf,maxLineLen-1); // read line
+ if (numBytes>0)
+ {
+ buf[numBytes]='\0';
+ if (sscanf(buf,"<svg width=\"%dpt\" height=\"%dpt\"",width,height)==2)
+ {
+ found=TRUE;
+ }
+ }
+ else // read error!
+ {
+ //printf("Read error %d!\n",numBytes);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void writeSVGNotSupported(FTextStream &out)
+{
+ out << "<p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p>";
+}
+
+// check if a reference to a SVG figure can be written and does so if possible.
+// return FALSE if not possible (for instance because the SVG file is not yet generated).
+static bool writeSVGFigureLink(FTextStream &out,const QCString &relPath,
+ const QCString &baseName,const QCString &absImgName)
+{
+ int width=600,height=450;
+ if (!readSVGSize(absImgName,&width,&height))
+ {
+ return FALSE;
+ }
+// out << "<object type=\"image/svg+xml\" data=\""
+ out << "<iframe src=\""
+ << relPath << baseName << ".svg\" width=\""
+ << ((width*96+48)/72) << "\" height=\""
+ << ((height*96+48)/72) << "\" frameborder=\"0\" scrolling=\"no\">";
+ writeSVGNotSupported(out);
+// out << "</object>";
+ out << "</iframe>";
+
+ return TRUE;
+}
+
+// since dot silently reproduces the input file when it does not
+// support the PNG format, we need to check the result.
+static void checkDotResult(const QCString &imgName)
+{
+ if (Config_getEnum("DOT_IMAGE_FORMAT")=="png")
+ {
+ QFile f(imgName);
+ if (f.open(IO_ReadOnly))
+ {
+ char data[4];
+ if (f.readBlock(data,4)==4)
+ {
+ if (!(data[1]=='P' && data[2]=='N' && data[3]=='G'))
+ {
+ err("error: Image `%s' produced by dot is not a valid PNG!\n"
+ "You should either select a different format "
+ "(DOT_IMAGE_FORMAT in the config file) or install a more "
+ "recent version of graphviz (1.7+)\n",imgName.data()
+ );
+ }
+ }
+ else
+ {
+ err("error: Could not read image `%s' generated by dot!\n",imgName.data());
+ }
+ }
+ else
+ {
+ err("error: Could not open image `%s' generated by dot!\n",imgName.data());
+ }
+ }
+}
+
+static bool insertMapFile(FTextStream &out,const QCString &mapFile,
+ const QCString &relPath,const QCString &mapLabel)
+{
+ QFileInfo fi(mapFile);
+ if (fi.exists() && fi.size()>0) // reuse existing map file
+ {
+ QGString tmpstr;
+ FTextStream tmpout(&tmpstr);
+ convertMapFile(tmpout,mapFile,relPath);
+ if (!tmpstr.isEmpty())
+ {
+ out << "<map name=\"" << mapLabel << "\" id=\"" << mapLabel << "\">" << endl;
+ out << tmpstr;
+ out << "</map>" << endl;
+ }
+ return TRUE;
+ }
+ return FALSE; // no map file yet, need to generate it
+}
+
+static void removeDotGraph(const QCString &dotName)
+{
+ static bool dotCleanUp = Config_getBool("DOT_CLEANUP");
+ if (dotCleanUp)
+ {
+ QDir d;
+ d.remove(dotName);
+ }
+}
+
+
+
+/*! Checks if a file "baseName".md5 exists. If so the contents
+ * are compared with \a md5. If equal FALSE is returned. If the .md5
+ * file does not exist or its contents are not equal to \a md5,
+ * a new .md5 is generated with the \a md5 string as contents.
+ */
+static bool checkAndUpdateMd5Signature(const QCString &baseName,const QCString &md5)
+{
+ QFile f(baseName+".md5");
+ if (f.open(IO_ReadOnly))
+ {
+ // read checksum
+ QCString md5stored(33);
+ int bytesRead=f.readBlock(md5stored.data(),32);
+ md5stored[32]='\0';
+ // compare checksum
+ if (bytesRead==32 && md5==md5stored)
+ {
+ // bail out if equal
+ return FALSE;
+ }
+ }
+ f.close();
+ // create checksum file
+ if (f.open(IO_WriteOnly))
+ {
+ f.writeBlock(md5.data(),32);
+ f.close();
+ }
+ return TRUE;
+}
+
+static bool checkDeliverables(const QCString &file1,
+ const QCString &file2=QCString())
+{
+ bool file1Ok = TRUE;
+ bool file2Ok = TRUE;
+ if (!file1.isEmpty())
+ {
+ QFileInfo fi(file1);
+ file1Ok = (fi.exists() && fi.size()>0);
+ }
+ if (!file2.isEmpty())
+ {
+ QFileInfo fi(file2);
+ file2Ok = (fi.exists() && fi.size()>0);
+ }
+ return file1Ok && file2Ok;
+}
+
+//--------------------------------------------------------------------
+
+class DotNodeList : public QList<DotNode>
+{
+ public:
+ DotNodeList() : QList<DotNode>() {}
+ ~DotNodeList() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ return stricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label);
+ }
+};
+
+//--------------------------------------------------------------------
+
+DotRunner::DotRunner(const QCString &file,const QCString &path,
+ bool checkResult,const QCString &imageName)
+ : m_file(file), m_path(path),
+ m_checkResult(checkResult), m_imageName(imageName)
+{
+ static bool dotCleanUp = Config_getBool("DOT_CLEANUP");
+ m_cleanUp = dotCleanUp;
+ m_jobs.setAutoDelete(TRUE);
+}
+
+void DotRunner::addJob(const char *format,const char *output)
+{
+ QCString args = QCString("-T")+format+" -o \""+output+"\"";
+ m_jobs.append(new QCString(args));
+}
+
+void DotRunner::addPostProcessing(const char *cmd,const char *args)
+{
+ m_postCmd = cmd;
+ m_postArgs = args;
+}
+
+bool DotRunner::run()
+{
+ int exitCode=0;
+ static QCString dotExe = Config_getString("DOT_PATH")+"dot";
+ static bool multiTargets = Config_getBool("DOT_MULTI_TARGETS");
+ QCString dotArgs;
+ QListIterator<QCString> li(m_jobs);
+ QCString *s;
+ QCString file = m_file;
+ QCString path = m_path;
+ QCString imageName = m_imageName;
+ QCString postCmd = m_postCmd;
+ QCString postArgs = m_postArgs;
+ bool checkResult = m_checkResult;
+ bool cleanUp = m_cleanUp;
+ if (multiTargets)
+ {
+ dotArgs="\""+file+"\"";
+ for (li.toFirst();(s=li.current());++li)
+ {
+ dotArgs+=' ';
+ dotArgs+=*s;
+ }
+ if ((exitCode=portable_system(dotExe,dotArgs,FALSE))!=0)
+ {
+ goto error;
+ }
+ }
+ else
+ {
+ for (li.toFirst();(s=li.current());++li)
+ {
+ dotArgs="\""+file+"\" "+*s;
+ if ((exitCode=portable_system(dotExe,dotArgs,FALSE))!=0)
+ {
+ goto error;
+ }
+ }
+ }
+ if (!postCmd.isEmpty() && portable_system(postCmd,postArgs)!=0)
+ {
+ err("error: Problems running '%s' as a post-processing step for dot output\n",m_postCmd.data());
+ return FALSE;
+ }
+ if (checkResult) checkDotResult(imageName);
+ if (cleanUp)
+ {
+ //printf("removing dot file %s\n",m_file.data());
+ //QDir(path).remove(file);
+ m_cleanupItem.file = file;
+ m_cleanupItem.path = path;
+ }
+ return TRUE;
+error:
+ err("Problems running dot: exit code=%d, command='%s', arguments='%s'\n",
+ exitCode,dotExe.data(),dotArgs.data());
+ return FALSE;
+}
+
+//--------------------------------------------------------------------
+
+DotFilePatcher::DotFilePatcher(const char *patchFile)
+ : m_patchFile(patchFile)
+{
+ m_maps.setAutoDelete(TRUE);
+}
+
+int DotFilePatcher::addMap(const QCString &mapFile,const QCString &relPath,
+ bool urlOnly,const QCString &context,const QCString &label)
+{
+ int id = m_maps.count();
+ Map *map = new Map;
+ map->mapFile = mapFile;
+ map->relPath = relPath;
+ map->urlOnly = urlOnly;
+ map->context = context;
+ map->label = label;
+ m_maps.append(map);
+ return id;
+}
+
+int DotFilePatcher::addFigure(const QCString &baseName,
+ const QCString &figureName,bool heightCheck)
+{
+ int id = m_maps.count();
+ Map *map = new Map;
+ map->mapFile = figureName;
+ map->urlOnly = heightCheck;
+ map->label = baseName;
+ m_maps.append(map);
+ return id;
+}
+
+int DotFilePatcher::addSVGConversion(const QCString &relPath,bool urlOnly,
+ const QCString &context)
+{
+ int id = m_maps.count();
+ Map *map = new Map;
+ map->relPath = relPath;
+ map->urlOnly = urlOnly;
+ map->context = context;
+ m_maps.append(map);
+ return id;
+}
+
+int DotFilePatcher::addSVGObject(const QCString &baseName,
+ const QCString &absImgName,
+ const QCString &relPath)
+{
+ int id = m_maps.count();
+ Map *map = new Map;
+ map->mapFile = absImgName;
+ map->relPath = relPath;
+ map->label = baseName;
+ m_maps.append(map);
+ return id;
+}
+
+bool DotFilePatcher::run()
+{
+ //printf("DotFilePatcher::run(): %s\n",m_patchFile.data());
+ bool isSVGFile = m_patchFile.right(4)==".svg";
+ QCString tmpName = m_patchFile+".tmp";
+ if (!QDir::current().rename(m_patchFile,tmpName))
+ {
+ err("Failed to rename file %s to %s!\n",m_patchFile.data(),tmpName.data());
+ return FALSE;
+ }
+ QFile fi(tmpName);
+ QFile fo(m_patchFile);
+ if (!fi.open(IO_ReadOnly))
+ {
+ err("error: problem opening file %s for patching!\n",tmpName.data());
+ QDir::current().rename(tmpName,m_patchFile);
+ return FALSE;
+ }
+ if (!fo.open(IO_WriteOnly))
+ {
+ err("error: problem opening file %s for patching!\n",m_patchFile.data());
+ QDir::current().rename(tmpName,m_patchFile);
+ return FALSE;
+ }
+ FTextStream t(&fo);
+ const int maxLineLen=100*1024;
+ while (!fi.atEnd()) // foreach line
+ {
+ QCString line(maxLineLen);
+ int numBytes = fi.readLine(line.data(),maxLineLen);
+ //printf("line=[%s]\n",line.stripWhiteSpace().data());
+ int i;
+ ASSERT(numBytes<maxLineLen);
+ if (isSVGFile)
+ {
+ Map *map = m_maps.at(0); // there is only one 'map' for a SVG file
+ t << replaceRef(line,map->relPath,map->urlOnly,map->context,"_top");
+ }
+ else if ((i=line.find("<!-- SVG"))!=-1 || (i=line.find("[!-- SVG"))!=-1)
+ {
+ //printf("Found marker at %d\n",i);
+ int mapId=-1;
+ t << line.left(i);
+ int n = sscanf(line.data()+i+1,"!-- SVG %d",&mapId);
+ if (n==1 && mapId>=0 && mapId<(int)m_maps.count())
+ {
+ int e = QMAX(line.find("--]"),line.find("-->"));
+ Map *map = m_maps.at(mapId);
+ if (!writeSVGFigureLink(t,map->relPath,map->label,map->mapFile))
+ {
+ err("Problem extracting size from SVG file %s\n",map->mapFile.data());
+ }
+ if (e!=-1) t << line.mid(e+3);
+ }
+ else // error invalid map id!
+ {
+ err("Found invalid SVG id in file %s!\n",m_patchFile.data());
+ t << line.mid(i);
+ }
+ }
+ else if ((i=line.find("<!-- MAP"))!=-1)
+ {
+ int mapId=-1;
+ t << line.left(i);
+ int n = sscanf(line.data()+i,"<!-- MAP %d",&mapId);
+ if (n==1 && mapId>=0 && mapId<(int)m_maps.count())
+ {
+ Map *map = m_maps.at(mapId);
+ //printf("patching MAP %d in file %s with contents of %s\n",
+ // mapId,m_patchFile.data(),map->mapFile.data());
+ t << "<map name=\"" << map->label << "\" id=\"" << map->label << "\">" << endl;
+ convertMapFile(t,map->mapFile,map->relPath,map->urlOnly,map->context);
+ t << "</map>" << endl;
+ }
+ else // error invalid map id!
+ {
+ err("Found invalid MAP id in file %s!\n",m_patchFile.data());
+ t << line.mid(i);
+ }
+ }
+ else if ((i=line.find("% FIG"))!=-1)
+ {
+ int mapId=-1;
+ int n = sscanf(line.data()+i+2,"FIG %d",&mapId);
+ //printf("line='%s' n=%d\n",line.data()+i,n);
+ if (n==1 && mapId>=0 && mapId<(int)m_maps.count())
+ {
+ Map *map = m_maps.at(mapId);
+ //printf("patching FIG %d in file %s with contents of %s\n",
+ // mapId,m_patchFile.data(),map->mapFile.data());
+ writeVecGfxFigure(t,map->label,map->mapFile);
+ }
+ else // error invalid map id!
+ {
+ err("Found invalid bounding FIG id in file %s!\n",mapId,m_patchFile.data());
+ t << line;
+ }
+ }
+ else
+ {
+ t << line;
+ }
+ }
+ fi.close();
+ QDir::current().remove(tmpName);
+ return TRUE;
+}
+
+//--------------------------------------------------------------------
+
+void DotRunnerQueue::enqueue(DotRunner *runner)
+{
+ QMutexLocker locker(&m_mutex);
+ m_queue.enqueue(runner);
+ m_bufferNotEmpty.wakeAll();
+}
+
+DotRunner *DotRunnerQueue::dequeue()
+{
+ QMutexLocker locker(&m_mutex);
+ while (m_queue.isEmpty())
+ {
+ // wait until something is added to the queue
+ m_bufferNotEmpty.wait(&m_mutex);
+ }
+ DotRunner *result = m_queue.dequeue();
+ return result;
+}
+
+uint DotRunnerQueue::count() const
+{
+ QMutexLocker locker(&m_mutex);
+ return m_queue.count();
+}
+
+//--------------------------------------------------------------------
+
+DotWorkerThread::DotWorkerThread(int id,DotRunnerQueue *queue)
+ : m_id(id), m_queue(queue)
+{
+ m_cleanupItems.setAutoDelete(TRUE);
+}
+
+void DotWorkerThread::run()
+{
+ DotRunner *runner;
+ while ((runner=m_queue->dequeue()))
+ {
+ runner->run();
+ DotRunner::CleanupItem cleanup = runner->cleanup();
+ if (!cleanup.file.isEmpty())
+ {
+ m_cleanupItems.append(new DotRunner::CleanupItem(cleanup));
+ }
+ }
+}
+
+void DotWorkerThread::cleanup()
+{
+ QListIterator<DotRunner::CleanupItem> it(m_cleanupItems);
+ DotRunner::CleanupItem *ci;
+ for (;(ci=it.current());++it)
+ {
+ QDir(ci->path).remove(ci->file);
+ }
+}
+
+//--------------------------------------------------------------------
+
+DotManager *DotManager::m_theInstance = 0;
+
+DotManager *DotManager::instance()
+{
+ if (!m_theInstance)
+ {
+ m_theInstance = new DotManager;
+ }
+ return m_theInstance;
+}
+
+DotManager::DotManager() : m_dotMaps(1007)
+{
+ m_dotRuns.setAutoDelete(TRUE);
+ m_dotMaps.setAutoDelete(TRUE);
+ m_queue = new DotRunnerQueue;
+ int i;
+ int numThreads = QMIN(32,Config_getInt("DOT_NUM_THREADS"));
+ if (numThreads==0) numThreads = QMAX(1,QThread::idealThreadCount()+1);
+ for (i=0;i<numThreads;i++)
+ {
+ DotWorkerThread *thread = new DotWorkerThread(i,m_queue);
+ thread->start();
+ if (thread->isRunning())
+ {
+ m_workers.append(thread);
+ }
+ else // no more threads available!
+ {
+ delete thread;
+ }
+ }
+ ASSERT(m_workers.count()>0);
+}
+
+DotManager::~DotManager()
+{
+ delete m_queue;
+}
+
+void DotManager::addRun(DotRunner *run)
+{
+ m_dotRuns.append(run);
+}
+
+int DotManager::addMap(const QCString &file,const QCString &mapFile,
+ const QCString &relPath,bool urlOnly,const QCString &context,
+ const QCString &label)
+{
+ DotFilePatcher *map = m_dotMaps.find(file);
+ if (map==0)
+ {
+ map = new DotFilePatcher(file);
+ m_dotMaps.append(file,map);
+ }
+ return map->addMap(mapFile,relPath,urlOnly,context,label);
+}
+
+int DotManager::addFigure(const QCString &file,const QCString &baseName,
+ const QCString &figureName,bool heightCheck)
+{
+ DotFilePatcher *map = m_dotMaps.find(file);
+ if (map==0)
+ {
+ map = new DotFilePatcher(file);
+ m_dotMaps.append(file,map);
+ }
+ return map->addFigure(baseName,figureName,heightCheck);
+}
+
+int DotManager::addSVGConversion(const QCString &file,const QCString &relPath,
+ bool urlOnly,const QCString &context)
+{
+ DotFilePatcher *map = m_dotMaps.find(file);
+ if (map==0)
+ {
+ map = new DotFilePatcher(file);
+ m_dotMaps.append(file,map);
+ }
+ return map->addSVGConversion(relPath,urlOnly,context);
+}
+
+int DotManager::addSVGObject(const QCString &file,const QCString &baseName,
+ const QCString &absImgName,const QCString &relPath)
+{
+ DotFilePatcher *map = m_dotMaps.find(file);
+ if (map==0)
+ {
+ map = new DotFilePatcher(file);
+ m_dotMaps.append(file,map);
+ }
+ return map->addSVGObject(baseName,absImgName,relPath);
+}
+
+bool DotManager::run()
+{
+ uint numDotRuns = m_dotRuns.count();
+ uint numDotMaps = m_dotMaps.count();
+ if (numDotRuns+numDotMaps>1)
+ {
+ msg("Generating dot graphs using %d parallel threads...\n",QMIN(numDotRuns+numDotMaps,m_workers.count()));
+ }
+ int i=1;
+ QListIterator<DotRunner> li(m_dotRuns);
+
+ bool setPath=FALSE;
+ if (Config_getBool("GENERATE_HTML"))
+ {
+ setDotFontPath(Config_getString("HTML_OUTPUT"));
+ setPath=TRUE;
+ }
+ else if (Config_getBool("GENERATE_LATEX"))
+ {
+ setDotFontPath(Config_getString("LATEX_OUTPUT"));
+ setPath=TRUE;
+ }
+ else if (Config_getBool("GENERATE_RTF"))
+ {
+ setDotFontPath(Config_getString("RTF_OUTPUT"));
+ setPath=TRUE;
+ }
+ portable_sysTimerStart();
+ // fill work queue with dot operations
+ DotRunner *dr;
+ for (li.toFirst();(dr=li.current());++li)
+ {
+ m_queue->enqueue(dr);
+ }
+ int prev=1;
+ // wait for the queue to become empty
+ while ((i=m_queue->count())>0)
+ {
+ i = numDotRuns - i;
+ while (i>=prev)
+ {
+ msg("Running dot for graph %d/%d\n",prev,numDotRuns);
+ prev++;
+ }
+ portable_sleep(100);
+ }
+ while ((int)numDotRuns>=prev)
+ {
+ msg("Running dot for graph %d/%d\n",prev,numDotRuns);
+ prev++;
+ }
+ // signal the workers we are done
+ for (i=0;i<(int)m_workers.count();i++)
+ {
+ m_queue->enqueue(0); // add terminator for each worker
+ }
+ // wait for the workers to finish
+ for (i=0;i<(int)m_workers.count();i++)
+ {
+ m_workers.at(i)->wait();
+ }
+ // clean up dot files from main thread
+ for (i=0;i<(int)m_workers.count();i++)
+ {
+ m_workers.at(i)->cleanup();
+ }
+ portable_sysTimerStop();
+ if (setPath)
+ {
+ unsetDotFontPath();
+ }
+
+ // patch the output file and insert the maps and figures
+ i=1;
+ SDict<DotFilePatcher>::Iterator di(m_dotMaps);
+ DotFilePatcher *map;
+ for (di.toFirst();(map=di.current());++di)
+ {
+ msg("Patching output file %d/%d\n",i,numDotMaps);
+ if (!map->run()) return FALSE;
+ i++;
+ }
+ return TRUE;
+}
+
+
+//--------------------------------------------------------------------
+
+
+/*! helper function that deletes all nodes in a connected graph, given
+ * one of the graph's nodes
+ */
+static void deleteNodes(DotNode *node,SDict<DotNode> *skipNodes=0)
+{
+ //printf("deleteNodes skipNodes=%p\n",skipNodes);
+ static DotNodeList deletedNodes;
+ deletedNodes.setAutoDelete(TRUE);
+ node->deleteNode(deletedNodes,skipNodes); // collect nodes to be deleted.
+ deletedNodes.clear(); // actually remove the nodes.
+}
+
+DotNode::DotNode(int n,const char *lab,const char *tip, const char *url,
+ bool isRoot,ClassDef *cd)
+ : m_subgraphId(-1)
+ , m_number(n)
+ , m_label(lab)
+ , m_tooltip(tip)
+ , m_url(url)
+ , m_parents(0)
+ , m_children(0)
+ , m_edgeInfo(0)
+ , m_deleted(FALSE)
+ , m_written(FALSE)
+ , m_hasDoc(FALSE)
+ , m_isRoot(isRoot)
+ , m_classDef(cd)
+ , m_visible(FALSE)
+ , m_truncated(Unknown)
+ , m_distance(1000)
+{
+}
+
+DotNode::~DotNode()
+{
+ delete m_children;
+ delete m_parents;
+ delete m_edgeInfo;
+}
+
+void DotNode::addChild(DotNode *n,
+ int edgeColor,
+ int edgeStyle,
+ const char *edgeLab,
+ const char *edgeURL,
+ int edgeLabCol
+ )
+{
+ if (m_children==0)
+ {
+ m_children = new QList<DotNode>;
+ m_edgeInfo = new QList<EdgeInfo>;
+ m_edgeInfo->setAutoDelete(TRUE);
+ }
+ m_children->append(n);
+ EdgeInfo *ei = new EdgeInfo;
+ ei->m_color = edgeColor;
+ ei->m_style = edgeStyle;
+ ei->m_label = edgeLab;
+ ei->m_url = edgeURL;
+ if (edgeLabCol==-1)
+ ei->m_labColor=edgeColor;
+ else
+ ei->m_labColor=edgeLabCol;
+ m_edgeInfo->append(ei);
+}
+
+void DotNode::addParent(DotNode *n)
+{
+ if (m_parents==0)
+ {
+ m_parents = new QList<DotNode>;
+ }
+ m_parents->append(n);
+}
+
+void DotNode::removeChild(DotNode *n)
+{
+ if (m_children) m_children->remove(n);
+}
+
+void DotNode::removeParent(DotNode *n)
+{
+ if (m_parents) m_parents->remove(n);
+}
+
+void DotNode::deleteNode(DotNodeList &deletedList,SDict<DotNode> *skipNodes)
+{
+ if (m_deleted) return; // avoid recursive loops in case the graph has cycles
+ m_deleted=TRUE;
+ if (m_parents!=0) // delete all parent nodes of this node
+ {
+ QListIterator<DotNode> dnlip(*m_parents);
+ DotNode *pn;
+ for (dnlip.toFirst();(pn=dnlip.current());++dnlip)
+ {
+ //pn->removeChild(this);
+ pn->deleteNode(deletedList,skipNodes);
+ }
+ }
+ if (m_children!=0) // delete all child nodes of this node
+ {
+ QListIterator<DotNode> dnlic(*m_children);
+ DotNode *cn;
+ for (dnlic.toFirst();(cn=dnlic.current());++dnlic)
+ {
+ //cn->removeParent(this);
+ cn->deleteNode(deletedList,skipNodes);
+ }
+ }
+ // add this node to the list of deleted nodes.
+ //printf("skipNodes=%p find(%p)=%p\n",skipNodes,this,skipNodes ? skipNodes->find((int)this) : 0);
+ if (skipNodes==0 || skipNodes->find((char*)this)==0)
+ {
+ //printf("deleting\n");
+ deletedList.append(this);
+ }
+}
+
+void DotNode::setDistance(int distance)
+{
+ if (distance<m_distance) m_distance = distance;
+}
+
+static QCString convertLabel(const QCString &l)
+{
+ QCString result;
+ const char *p=l.data();
+ if (p==0) return result;
+ char c;
+ while ((c=*p++))
+ {
+ switch(c)
+ {
+ case '\\': result+="\\\\"; break;
+ case '\n': result+="\\n"; break;
+ case '<': result+="\\<"; break;
+ case '>': result+="\\>"; break;
+ case '|': result+="\\|"; break;
+ case '{': result+="\\{"; break;
+ case '}': result+="\\}"; break;
+ case '"': result+="\\\""; break;
+ default: result+=c; break;
+ }
+ }
+ return result;
+}
+
+#if 0
+static QCString escapeTooltip(const QCString &tooltip)
+{
+ QCString result;
+ const char *p=tooltip.data();
+ if (p==0) return result;
+ char c;
+ while ((c=*p++))
+ {
+ switch(c)
+ {
+ case '\\': result+="\\\\"; break;
+ default: result+=c; break;
+ }
+ }
+ return result;
+}
+#endif
+
+static void writeBoxMemberList(FTextStream &t,char prot,MemberList *ml,ClassDef *scope)
+{
+ if (ml)
+ {
+ MemberListIterator mlia(*ml);
+ MemberDef *mma;
+ for (mlia.toFirst();(mma = mlia.current());++mlia)
+ {
+ if (mma->getClassDef() == scope)
+ {
+ t << prot << " " << convertLabel(mma->name());
+ if (!mma->isObjCMethod() &&
+ (mma->isFunction() || mma->isSlot() || mma->isSignal())) t << "()";
+ t << "\\l";
+ }
+ }
+ // write member groups within the memberlist
+ MemberGroupList *mgl = ml->getMemberGroupList();
+ if (mgl)
+ {
+ MemberGroupListIterator mgli(*mgl);
+ MemberGroup *mg;
+ for (mgli.toFirst();(mg=mgli.current());++mgli)
+ {
+ if (mg->members())
+ {
+ writeBoxMemberList(t,prot,mg->members(),scope);
+ }
+ }
+ }
+ }
+}
+
+void DotNode::writeBox(FTextStream &t,
+ GraphType gt,
+ GraphOutputFormat /*format*/,
+ bool hasNonReachableChildren,
+ bool reNumber)
+{
+ const char *labCol =
+ m_url.isEmpty() ? "grey75" : // non link
+ (
+ (hasNonReachableChildren) ? "red" : "black"
+ );
+ t << " Node" << reNumberNode(m_number,reNumber) << " [label=\"";
+
+ if (m_classDef && Config_getBool("UML_LOOK") &&
+ (gt==Inheritance || gt==Collaboration))
+ {
+ t << "{" << convertLabel(m_label);
+ t << "\\n|";
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubAttribs),m_classDef);
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticAttribs),m_classDef);
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::properties),m_classDef);
+ writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacAttribs),m_classDef);
+ writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticAttribs),m_classDef);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proAttribs),m_classDef);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticAttribs),m_classDef);
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priAttribs),m_classDef);
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticAttribs),m_classDef);
+ t << "|";
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubMethods),m_classDef);
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticMethods),m_classDef);
+ writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubSlots),m_classDef);
+ writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacMethods),m_classDef);
+ writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticMethods),m_classDef);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proMethods),m_classDef);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticMethods),m_classDef);
+ writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proSlots),m_classDef);
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priMethods),m_classDef);
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticMethods),m_classDef);
+ writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priSlots),m_classDef);
+ if (m_classDef->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgdi(*m_classDef->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (mgdi.toFirst();(mg=mgdi.current());++mgdi)
+ {
+ if (mg->members())
+ {
+ writeBoxMemberList(t,'*',mg->members(),m_classDef);
+ }
+ }
+ }
+ t << "}";
+ }
+ else // standard look
+ {
+ t << convertLabel(m_label);
+ }
+ t << "\",height=0.2,width=0.4";
+ if (m_isRoot)
+ {
+ t << ",color=\"black\", fillcolor=\"grey75\", style=\"filled\" fontcolor=\"black\"";
+ }
+ else
+ {
+ static bool dotTransparent = Config_getBool("DOT_TRANSPARENT");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ if (!dotTransparent)
+ {
+ ClassDef* ccd=this->m_classDef;
+
+ t << ",color=\"" << labCol << "\", fillcolor=\"";
+ if (ccd && vhdlOpt && (VhdlDocGen::VhdlClasses)ccd->protection()==VhdlDocGen::ARCHITECTURECLASS)
+ t << "khaki";
+ else
+ t << "white";
+ t << "\", style=\"filled\"";
+ }
+ else
+ {
+ t << ",color=\"" << labCol << "\"";
+ }
+ if (!m_url.isEmpty())
+ {
+ int anchorPos = m_url.findRev('#');
+ if (anchorPos==-1)
+ {
+ t << ",URL=\"" << m_url << Doxygen::htmlFileExtension << "\"";
+ }
+ else
+ {
+ t << ",URL=\"" << m_url.left(anchorPos) << Doxygen::htmlFileExtension
+ << m_url.right(m_url.length()-anchorPos) << "\"";
+ }
+ }
+ if (!m_tooltip.isEmpty())
+ {
+ t << ",tooltip=\"" << /*escapeTooltip(m_tooltip)*/ m_tooltip << "\"";
+ }
+ }
+ t << "];" << endl;
+}
+
+void DotNode::writeArrow(FTextStream &t,
+ GraphType gt,
+ GraphOutputFormat format,
+ DotNode *cn,
+ EdgeInfo *ei,
+ bool topDown,
+ bool pointBack,
+ bool reNumber
+ )
+{
+ t << " Node";
+ if (topDown)
+ t << reNumberNode(cn->number(),reNumber);
+ else
+ t << reNumberNode(m_number,reNumber);
+ t << " -> Node";
+ if (topDown)
+ t << reNumberNode(m_number,reNumber);
+ else
+ t << reNumberNode(cn->number(),reNumber);
+ t << " [";
+ if (pointBack) t << "dir=back,";
+ t << "color=\"" << edgeColorMap[ei->m_color]
+ << "\",fontsize=\"" << FONTSIZE << "\",style=\"" << edgeStyleMap[ei->m_style] << "\"";
+ if (!ei->m_label.isEmpty())
+ {
+ t << ",label=\"" << convertLabel(ei->m_label) << "\"";
+ }
+ if (Config_getBool("UML_LOOK") &&
+ arrowStyle[ei->m_color] &&
+ (gt==Inheritance || gt==Collaboration)
+ )
+ {
+ if (pointBack)
+ t << ",arrowtail=\"" << arrowStyle[ei->m_color] << "\"";
+ else
+ t << ",arrowhead=\"" << arrowStyle[ei->m_color] << "\"";
+ }
+
+ if (format==BITMAP) t << ",fontname=\"" << FONTNAME << "\"";
+ t << "];" << endl;
+}
+
+void DotNode::write(FTextStream &t,
+ GraphType gt,
+ GraphOutputFormat format,
+ bool topDown,
+ bool toChildren,
+ bool backArrows,
+ bool reNumber
+ )
+{
+ //printf("DotNode::write(%d) name=%s this=%p written=%d\n",distance,m_label.data(),this,m_written);
+ if (m_written) return; // node already written to the output
+ if (!m_visible) return; // node is not visible
+ writeBox(t,gt,format,m_truncated==Truncated,reNumber);
+ m_written=TRUE;
+ QList<DotNode> *nl = toChildren ? m_children : m_parents;
+ if (nl)
+ {
+ if (toChildren)
+ {
+ QListIterator<DotNode> dnli1(*nl);
+ QListIterator<EdgeInfo> dnli2(*m_edgeInfo);
+ DotNode *cn;
+ for (dnli1.toFirst();(cn=dnli1.current());++dnli1,++dnli2)
+ {
+ if (cn->isVisible())
+ {
+ //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",cn->label().data());
+ writeArrow(t,gt,format,cn,dnli2.current(),topDown,backArrows,reNumber);
+ }
+ cn->write(t,gt,format,topDown,toChildren,backArrows,reNumber);
+ }
+ }
+ else // render parents
+ {
+ QListIterator<DotNode> dnli(*nl);
+ DotNode *pn;
+ for (dnli.toFirst();(pn=dnli.current());++dnli)
+ {
+ if (pn->isVisible())
+ {
+ //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",pn->label().data());
+ writeArrow(t,
+ gt,
+ format,
+ pn,
+ pn->m_edgeInfo->at(pn->m_children->findRef(this)),
+ FALSE,
+ backArrows,
+ reNumber
+ );
+ }
+ pn->write(t,gt,format,TRUE,FALSE,backArrows,reNumber);
+ }
+ }
+ }
+ //printf("end DotNode::write(%d) name=%s\n",distance,m_label.data());
+}
+
+void DotNode::writeXML(FTextStream &t,bool isClassGraph)
+{
+ t << " <node id=\"" << m_number << "\">" << endl;
+ t << " <label>" << convertToXML(m_label) << "</label>" << endl;
+ if (!m_url.isEmpty())
+ {
+ QCString url(m_url);
+ char *refPtr = url.data();
+ char *urlPtr = strchr(url.data(),'$');
+ if (urlPtr)
+ {
+ *urlPtr++='\0';
+ t << " <link refid=\"" << convertToXML(urlPtr) << "\"";
+ if (*refPtr!='\0')
+ {
+ t << " external=\"" << convertToXML(refPtr) << "\"";
+ }
+ t << "/>" << endl;
+ }
+ }
+ if (m_children)
+ {
+ QListIterator<DotNode> nli(*m_children);
+ QListIterator<EdgeInfo> eli(*m_edgeInfo);
+ DotNode *childNode;
+ EdgeInfo *edgeInfo;
+ for (;(childNode=nli.current());++nli,++eli)
+ {
+ edgeInfo=eli.current();
+ t << " <childnode refid=\"" << childNode->m_number << "\" relation=\"";
+ if (isClassGraph)
+ {
+ switch(edgeInfo->m_color)
+ {
+ case EdgeInfo::Blue: t << "public-inheritance"; break;
+ case EdgeInfo::Green: t << "protected-inheritance"; break;
+ case EdgeInfo::Red: t << "private-inheritance"; break;
+ case EdgeInfo::Purple: t << "usage"; break;
+ case EdgeInfo::Orange: t << "template-instance"; break;
+ case EdgeInfo::Grey: ASSERT(0); break;
+ }
+ }
+ else // include graph
+ {
+ t << "include";
+ }
+ t << "\">" << endl;
+ if (!edgeInfo->m_label.isEmpty())
+ {
+ int p=0;
+ int ni;
+ while ((ni=edgeInfo->m_label.find('\n',p))!=-1)
+ {
+ t << " <edgelabel>"
+ << convertToXML(edgeInfo->m_label.mid(p,ni-p))
+ << "</edgelabel>" << endl;
+ p=ni+1;
+ }
+ t << " <edgelabel>"
+ << convertToXML(edgeInfo->m_label.right(edgeInfo->m_label.length()-p))
+ << "</edgelabel>" << endl;
+ }
+ t << " </childnode>" << endl;
+ }
+ }
+ t << " </node>" << endl;
+}
+
+
+void DotNode::writeDEF(FTextStream &t)
+{
+ const char* nodePrefix = " node-";
+
+ t << " node = {" << endl;
+ t << nodePrefix << "id = " << m_number << ';' << endl;
+ t << nodePrefix << "label = '" << m_label << "';" << endl;
+
+ if (!m_url.isEmpty())
+ {
+ QCString url(m_url);
+ char *refPtr = url.data();
+ char *urlPtr = strchr(url.data(),'$');
+ if (urlPtr)
+ {
+ *urlPtr++='\0';
+ t << nodePrefix << "link = {" << endl << " "
+ << nodePrefix << "link-id = '" << urlPtr << "';" << endl;
+
+ if (*refPtr!='\0')
+ {
+ t << " " << nodePrefix << "link-external = '"
+ << refPtr << "';" << endl;
+ }
+ t << " };" << endl;
+ }
+ }
+ if (m_children)
+ {
+ QListIterator<DotNode> nli(*m_children);
+ QListIterator<EdgeInfo> eli(*m_edgeInfo);
+ DotNode *childNode;
+ EdgeInfo *edgeInfo;
+ for (;(childNode=nli.current());++nli,++eli)
+ {
+ edgeInfo=eli.current();
+ t << " node-child = {" << endl;
+ t << " child-id = '" << childNode->m_number << "';" << endl;
+ t << " relation = ";
+
+ switch(edgeInfo->m_color)
+ {
+ case EdgeInfo::Blue: t << "public-inheritance"; break;
+ case EdgeInfo::Green: t << "protected-inheritance"; break;
+ case EdgeInfo::Red: t << "private-inheritance"; break;
+ case EdgeInfo::Purple: t << "usage"; break;
+ case EdgeInfo::Orange: t << "template-instance"; break;
+ case EdgeInfo::Grey: ASSERT(0); break;
+ }
+ t << ';' << endl;
+
+ if (!edgeInfo->m_label.isEmpty())
+ {
+ t << " edgelabel = <<_EnD_oF_dEf_TeXt_" << endl
+ << edgeInfo->m_label << endl
+ << "_EnD_oF_dEf_TeXt_;" << endl;
+ }
+ t << " }; /* node-child */" << endl;
+ } /* for (;childNode...) */
+ }
+ t << " }; /* node */" << endl;
+}
+
+
+void DotNode::clearWriteFlag()
+{
+ m_written=FALSE;
+ if (m_parents!=0)
+ {
+ QListIterator<DotNode> dnlip(*m_parents);
+ DotNode *pn;
+ for (dnlip.toFirst();(pn=dnlip.current());++dnlip)
+ {
+ if (pn->m_written)
+ {
+ pn->clearWriteFlag();
+ }
+ }
+ }
+ if (m_children!=0)
+ {
+ QListIterator<DotNode> dnlic(*m_children);
+ DotNode *cn;
+ for (dnlic.toFirst();(cn=dnlic.current());++dnlic)
+ {
+ if (cn->m_written)
+ {
+ cn->clearWriteFlag();
+ }
+ }
+ }
+}
+
+void DotNode::colorConnectedNodes(int curColor)
+{
+ if (m_children)
+ {
+ QListIterator<DotNode> dnlic(*m_children);
+ DotNode *cn;
+ for (dnlic.toFirst();(cn=dnlic.current());++dnlic)
+ {
+ if (cn->m_subgraphId==-1) // uncolored child node
+ {
+ cn->m_subgraphId=curColor;
+ cn->markAsVisible();
+ cn->colorConnectedNodes(curColor);
+ //printf("coloring node %s (%p): %d\n",cn->m_label.data(),cn,cn->m_subgraphId);
+ }
+ }
+ }
+
+ if (m_parents)
+ {
+ QListIterator<DotNode> dnlip(*m_parents);
+ DotNode *pn;
+ for (dnlip.toFirst();(pn=dnlip.current());++dnlip)
+ {
+ if (pn->m_subgraphId==-1) // uncolored parent node
+ {
+ pn->m_subgraphId=curColor;
+ pn->markAsVisible();
+ pn->colorConnectedNodes(curColor);
+ //printf("coloring node %s (%p): %d\n",pn->m_label.data(),pn,pn->m_subgraphId);
+ }
+ }
+ }
+}
+
+const DotNode *DotNode::findDocNode() const
+{
+ if (!m_url.isEmpty()) return this;
+ //printf("findDocNode(): `%s'\n",m_label.data());
+ if (m_parents)
+ {
+ QListIterator<DotNode> dnli(*m_parents);
+ DotNode *pn;
+ for (dnli.toFirst();(pn=dnli.current());++dnli)
+ {
+ if (!pn->m_hasDoc)
+ {
+ pn->m_hasDoc=TRUE;
+ const DotNode *dn = pn->findDocNode();
+ if (dn) return dn;
+ }
+ }
+ }
+ if (m_children)
+ {
+ QListIterator<DotNode> dnli(*m_children);
+ DotNode *cn;
+ for (dnli.toFirst();(cn=dnli.current());++dnli)
+ {
+ if (!cn->m_hasDoc)
+ {
+ cn->m_hasDoc=TRUE;
+ const DotNode *dn = cn->findDocNode();
+ if (dn) return dn;
+ }
+ }
+ }
+ return 0;
+}
+
+//--------------------------------------------------------------------
+
+int DotGfxHierarchyTable::m_curNodeNumber;
+
+void DotGfxHierarchyTable::writeGraph(FTextStream &out,
+ const char *path,const char *fileName) const
+{
+ //printf("DotGfxHierarchyTable::writeGraph(%s)\n",name);
+ //printf("m_rootNodes=%p count=%d\n",m_rootNodes,m_rootNodes->count());
+ if (m_rootSubgraphs->count()==0) return;
+
+ QDir d(path);
+ // store the original directory
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",path); exit(1);
+ }
+
+ // put each connected subgraph of the hierarchy in a row of the HTML output
+ out << "<table border=\"0\" cellspacing=\"10\" cellpadding=\"0\">" << endl;
+
+ QListIterator<DotNode> dnli(*m_rootSubgraphs);
+ DotNode *n;
+ int count=0;
+ for (dnli.toFirst();(n=dnli.current());++dnli)
+ {
+ QCString baseName;
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ baseName.sprintf("inherit_graph_%d",count++);
+ //baseName = convertNameToFile(baseName);
+ QCString imgName = baseName+"."+ imgExt;
+ QCString mapName = baseName+".map";
+ QCString absImgName = QCString(d.absPath().data())+"/"+imgName;
+ QCString absMapName = QCString(d.absPath().data())+"/"+mapName;
+ QCString absBaseName = QCString(d.absPath().data())+"/"+baseName;
+ QListIterator<DotNode> dnli2(*m_rootNodes);
+ DotNode *node;
+
+ // compute md5 checksum of the graph were are about to generate
+ QGString theGraph;
+ FTextStream md5stream(&theGraph);
+ writeGraphHeader(md5stream);
+ md5stream << " rankdir=LR;" << endl;
+ for (dnli2.toFirst();(node=dnli2.current());++dnli2)
+ {
+ if (node->m_subgraphId==n->m_subgraphId)
+ {
+ node->clearWriteFlag();
+ }
+ }
+ for (dnli2.toFirst();(node=dnli2.current());++dnli2)
+ {
+ if (node->m_subgraphId==n->m_subgraphId)
+ {
+ node->write(md5stream,DotNode::Hierarchy,BITMAP,FALSE,TRUE,TRUE,TRUE);
+ }
+ }
+ writeGraphFooter(md5stream);
+ resetReNumbering();
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)theGraph.data(),theGraph.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ bool regenerate=FALSE;
+ if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
+ !checkDeliverables(absImgName,absMapName))
+ {
+ regenerate=TRUE;
+ // image was new or has changed
+ QCString dotName=absBaseName+".dot";
+ QFile f(dotName);
+ if (!f.open(IO_WriteOnly)) return;
+ FTextStream t(&f);
+ t << theGraph;
+ f.close();
+ resetReNumbering();
+
+ DotRunner *dotRun = new DotRunner(dotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+ }
+ else
+ {
+ removeDotGraph(absBaseName+".dot");
+ }
+ Doxygen::indexList.addImageFile(imgName);
+ // write image and map in a table row
+ QCString mapLabel = escapeCharsInString(n->m_label,FALSE);
+ out << "<tr><td>";
+ if (imgExt=="svg") // vector graphics
+ {
+ if (regenerate || !writeSVGFigureLink(out,QCString(),baseName,absImgName))
+ {
+ if (regenerate)
+ {
+ DotManager::instance()->addSVGConversion(absImgName,QCString(),
+ FALSE,QCString());
+ }
+ int mapId = DotManager::instance()->addSVGObject(fileName,baseName,
+ absImgName,QCString());
+ out << "<!-- SVG " << mapId << " -->" << endl;
+ }
+ }
+ else // normal bitmap
+ {
+ out << "<img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#"
+ << mapLabel << "\"/>" << endl;
+
+ if (regenerate || !insertMapFile(out,absMapName,QCString(),mapLabel))
+ {
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,QCString(),
+ FALSE,QCString(),mapLabel);
+ out << "<!-- MAP " << mapId << " -->" << endl;
+ }
+ }
+
+ out << "</td></tr>" << endl;
+ }
+ out << "</table>" << endl;
+}
+
+void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
+{
+ //printf("addHierarchy `%s' baseClasses=%d\n",cd->name().data(),cd->baseClasses()->count());
+ if (cd->subClasses())
+ {
+ BaseClassListIterator bcli(*cd->subClasses());
+ BaseClassDef *bcd;
+ for ( ; (bcd=bcli.current()) ; ++bcli )
+ {
+ ClassDef *bClass=bcd->classDef;
+ //printf(" Trying sub class=`%s' usedNodes=%d\n",bClass->name().data(),m_usedNodes->count());
+ if (bClass->isVisibleInHierarchy() && hasVisibleRoot(bClass->baseClasses()))
+ {
+ DotNode *bn;
+ //printf(" Node `%s' Found visible class=`%s'\n",n->m_label.data(),
+ // bClass->name().data());
+ if ((bn=m_usedNodes->find(bClass->name()))) // node already present
+ {
+ if (n->m_children==0 || n->m_children->findRef(bn)==-1) // no arrow yet
+ {
+ n->addChild(bn,bcd->prot);
+ bn->addParent(n);
+ //printf(" Adding node %s to existing base node %s (c=%d,p=%d)\n",
+ // n->m_label.data(),
+ // bn->m_label.data(),
+ // bn->m_children ? bn->m_children->count() : 0,
+ // bn->m_parents ? bn->m_parents->count() : 0
+ // );
+ }
+ //else
+ //{
+ // printf(" Class already has an arrow!\n");
+ //}
+ }
+ else
+ {
+ QCString tmp_url="";
+ if (bClass->isLinkable() && !bClass->isHidden())
+ {
+ tmp_url=bClass->getReference()+"$"+bClass->getOutputFileBase();
+ if (!bClass->anchor().isEmpty())
+ {
+ tmp_url+="#"+bClass->anchor();
+ }
+ }
+ QCString tooltip = bClass->briefDescriptionAsTooltip();
+ bn = new DotNode(m_curNodeNumber++,
+ bClass->displayName(),
+ tooltip,
+ tmp_url.data()
+ );
+ n->addChild(bn,bcd->prot);
+ bn->addParent(n);
+ //printf(" Adding node %s to new base node %s (c=%d,p=%d)\n",
+ // n->m_label.data(),
+ // bn->m_label.data(),
+ // bn->m_children ? bn->m_children->count() : 0,
+ // bn->m_parents ? bn->m_parents->count() : 0
+ // );
+ //printf(" inserting %s (%p)\n",bClass->name().data(),bn);
+ m_usedNodes->insert(bClass->name(),bn); // add node to the used list
+ }
+ if (!bClass->visited && !hideSuper && bClass->subClasses())
+ {
+ bool wasVisited=bClass->visited;
+ bClass->visited=TRUE;
+ addHierarchy(bn,bClass,wasVisited);
+ }
+ }
+ }
+ }
+ //printf("end addHierarchy\n");
+}
+
+void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
+{
+ ClassSDict::Iterator cli(*cl);
+ ClassDef *cd;
+ for (cli.toLast();(cd=cli.current());--cli)
+ {
+ //printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
+ if (!hasVisibleRoot(cd->baseClasses()) &&
+ cd->isVisibleInHierarchy()
+ ) // root node in the forest
+ {
+ QCString tmp_url="";
+ if (cd->isLinkable() && !cd->isHidden())
+ {
+ tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
+ if (!cd->anchor().isEmpty())
+ {
+ tmp_url+="#"+cd->anchor();
+ }
+ }
+ //printf("Inserting root class %s\n",cd->name().data());
+ QCString tooltip = cd->briefDescriptionAsTooltip();
+ DotNode *n = new DotNode(m_curNodeNumber++,
+ cd->displayName(),
+ tooltip,
+ tmp_url.data());
+
+ //m_usedNodes->clear();
+ m_usedNodes->insert(cd->name(),n);
+ m_rootNodes->insert(0,n);
+ if (!cd->visited && cd->subClasses())
+ {
+ addHierarchy(n,cd,cd->visited);
+ cd->visited=TRUE;
+ }
+ }
+ }
+}
+
+DotGfxHierarchyTable::DotGfxHierarchyTable()
+{
+ m_curNodeNumber=0;
+ m_rootNodes = new QList<DotNode>;
+ m_usedNodes = new QDict<DotNode>(1009);
+ m_usedNodes->setAutoDelete(TRUE);
+ m_rootSubgraphs = new DotNodeList;
+
+ // build a graph with each class as a node and the inheritance relations
+ // as edges
+ initClassHierarchy(Doxygen::classSDict);
+ initClassHierarchy(Doxygen::hiddenClasses);
+ addClassList(Doxygen::classSDict);
+ addClassList(Doxygen::hiddenClasses);
+ // m_usedNodes now contains all nodes in the graph
+
+ // color the graph into a set of independent subgraphs
+ bool done=FALSE;
+ int curColor=0;
+ QListIterator<DotNode> dnli(*m_rootNodes);
+ while (!done) // there are still nodes to color
+ {
+ DotNode *n;
+ done=TRUE; // we are done unless there are still uncolored nodes
+ for (dnli.toLast();(n=dnli.current());--dnli)
+ {
+ if (n->m_subgraphId==-1) // not yet colored
+ {
+ //printf("Starting at node %s (%p): %d\n",n->m_label.data(),n,curColor);
+ done=FALSE; // still uncolored nodes
+ n->m_subgraphId=curColor;
+ n->markAsVisible();
+ n->colorConnectedNodes(curColor);
+ curColor++;
+ const DotNode *dn=n->findDocNode();
+ if (dn!=0)
+ m_rootSubgraphs->inSort(dn);
+ else
+ m_rootSubgraphs->inSort(n);
+ }
+ }
+ }
+
+ //printf("Number of independent subgraphs: %d\n",curColor);
+ //QListIterator<DotNode> dnli2(*m_rootSubgraphs);
+ //DotNode *n;
+ //for (dnli2.toFirst();(n=dnli2.current());++dnli2)
+ //{
+ // printf("Node %s color=%d (c=%d,p=%d)\n",
+ // n->m_label.data(),n->m_subgraphId,
+ // n->m_children?n->m_children->count():0,
+ // n->m_parents?n->m_parents->count():0);
+ //}
+}
+
+DotGfxHierarchyTable::~DotGfxHierarchyTable()
+{
+ //printf("DotGfxHierarchyTable::~DotGfxHierarchyTable\n");
+
+ //QDictIterator<DotNode> di(*m_usedNodes);
+ //DotNode *n;
+ //for (;(n=di.current());++di)
+ //{
+ // printf("Node %p: %s\n",n,n->label().data());
+ //}
+
+ delete m_rootNodes;
+ delete m_usedNodes;
+ delete m_rootSubgraphs;
+}
+
+//--------------------------------------------------------------------
+
+int DotClassGraph::m_curNodeNumber = 0;
+
+void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
+ const char *label,const char *usedName,const char *templSpec,bool base,int distance)
+{
+ if (Config_getBool("HIDE_UNDOC_CLASSES") && !cd->isLinkable()) return;
+
+ int edgeStyle = (label || prot==EdgeInfo::Orange) ? EdgeInfo::Dashed : EdgeInfo::Solid;
+ QCString className;
+ if (usedName) // name is a typedef
+ {
+ className=usedName;
+ }
+ else if (templSpec) // name has a template part
+ {
+ className=insertTemplateSpecifierInScope(cd->name(),templSpec);
+ }
+ else // just a normal name
+ {
+ className=cd->displayName();
+ }
+ //printf("DotClassGraph::addClass(class=`%s',parent=%s,prot=%d,label=%s,dist=%d,usedName=%s,templSpec=%s,base=%d)\n",
+ // className.data(),n->m_label.data(),prot,label,distance,usedName,templSpec,base);
+ DotNode *bn = m_usedNodes->find(className);
+ if (bn) // class already inserted
+ {
+ if (base)
+ {
+ n->addChild(bn,prot,edgeStyle,label);
+ bn->addParent(n);
+ }
+ else
+ {
+ bn->addChild(n,prot,edgeStyle,label);
+ n->addParent(bn);
+ }
+ bn->setDistance(distance);
+ //printf(" add exiting node %s of %s\n",bn->m_label.data(),n->m_label.data());
+ }
+ else // new class
+ {
+ QCString displayName=className;
+ if (Config_getBool("HIDE_SCOPE_NAMES")) displayName=stripScope(displayName);
+ QCString tmp_url;
+ if (cd->isLinkable() && !cd->isHidden())
+ {
+ tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
+ if (!cd->anchor().isEmpty())
+ {
+ tmp_url+="#"+cd->anchor();
+ }
+ }
+ QCString tooltip = cd->briefDescriptionAsTooltip();
+ bn = new DotNode(m_curNodeNumber++,
+ displayName,
+ tooltip,
+ tmp_url.data(),
+ FALSE, // rootNode
+ cd
+ );
+ if (base)
+ {
+ n->addChild(bn,prot,edgeStyle,label);
+ bn->addParent(n);
+ }
+ else
+ {
+ bn->addChild(n,prot,edgeStyle,label);
+ n->addParent(bn);
+ }
+ bn->setDistance(distance);
+ m_usedNodes->insert(className,bn);
+ //printf(" add new child node `%s' to %s hidden=%d url=%s\n",
+ // className.data(),n->m_label.data(),cd->isHidden(),tmp_url.data());
+
+ buildGraph(cd,bn,base,distance+1);
+ }
+}
+
+void DotClassGraph::determineTruncatedNodes(QList<DotNode> &queue,bool includeParents)
+{
+ while (queue.count()>0)
+ {
+ DotNode *n = queue.take(0);
+ if (n->isVisible() && n->isTruncated()==DotNode::Unknown)
+ {
+ bool truncated = FALSE;
+ if (n->m_children)
+ {
+ QListIterator<DotNode> li(*n->m_children);
+ DotNode *dn;
+ for (li.toFirst();(dn=li.current());++li)
+ {
+ if (!dn->isVisible())
+ truncated = TRUE;
+ else
+ queue.append(dn);
+ }
+ }
+ if (n->m_parents && includeParents)
+ {
+ QListIterator<DotNode> li(*n->m_parents);
+ DotNode *dn;
+ for (li.toFirst();(dn=li.current());++li)
+ {
+ if (!dn->isVisible())
+ truncated = TRUE;
+ else
+ queue.append(dn);
+ }
+ }
+ n->markAsTruncated(truncated);
+ }
+ }
+}
+
+bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
+ int maxNodes,bool includeParents)
+{
+ QList<DotNode> childQueue;
+ QList<DotNode> parentQueue;
+ QArray<int> childTreeWidth;
+ QArray<int> parentTreeWidth;
+ childQueue.append(rootNode);
+ if (includeParents) parentQueue.append(rootNode);
+ bool firstNode=TRUE; // flag to force reprocessing rootNode in the parent loop
+ // despite being marked visible in the child loop
+ while ((childQueue.count()>0 || parentQueue.count()>0) && maxNodes>0)
+ {
+ static int maxDistance = Config_getInt("MAX_DOT_GRAPH_DEPTH");
+ if (childQueue.count()>0)
+ {
+ DotNode *n = childQueue.take(0);
+ int distance = n->distance();
+ if (!n->isVisible() && distance<maxDistance) // not yet processed
+ {
+ if (distance>0)
+ {
+ int oldSize=(int)childTreeWidth.size();
+ if (distance>oldSize)
+ {
+ childTreeWidth.resize(QMAX(childTreeWidth.size(),(uint)distance));
+ int i; for (i=oldSize;i<distance;i++) childTreeWidth[i]=0;
+ }
+ childTreeWidth[distance-1]+=n->label().length();
+ }
+ n->markAsVisible();
+ maxNodes--;
+ // add direct children
+ if (n->m_children)
+ {
+ QListIterator<DotNode> li(*n->m_children);
+ DotNode *dn;
+ for (li.toFirst();(dn=li.current());++li)
+ {
+ childQueue.append(dn);
+ }
+ }
+ }
+ }
+ if (includeParents && parentQueue.count()>0)
+ {
+ DotNode *n = parentQueue.take(0);
+ if ((!n->isVisible() || firstNode) && n->distance()<maxDistance) // not yet processed
+ {
+ firstNode=FALSE;
+ int distance = n->distance();
+ if (distance>0)
+ {
+ int oldSize = (int)parentTreeWidth.size();
+ if (distance>oldSize)
+ {
+ parentTreeWidth.resize(QMAX(parentTreeWidth.size(),(uint)distance));
+ int i; for (i=oldSize;i<distance;i++) parentTreeWidth[i]=0;
+ }
+ parentTreeWidth[distance-1]+=n->label().length();
+ }
+ n->markAsVisible();
+ maxNodes--;
+ // add direct parents
+ if (n->m_parents)
+ {
+ QListIterator<DotNode> li(*n->m_parents);
+ DotNode *dn;
+ for (li.toFirst();(dn=li.current());++li)
+ {
+ parentQueue.append(dn);
+ }
+ }
+ }
+ }
+ }
+ if (Config_getBool("UML_LOOK")) return FALSE; // UML graph are always top to bottom
+ int maxWidth=0;
+ int maxHeight=(int)QMAX(childTreeWidth.size(),parentTreeWidth.size());
+ uint i;
+ for (i=0;i<childTreeWidth.size();i++)
+ {
+ if (childTreeWidth.at(i)>maxWidth) maxWidth=childTreeWidth.at(i);
+ }
+ for (i=0;i<parentTreeWidth.size();i++)
+ {
+ if (parentTreeWidth.at(i)>maxWidth) maxWidth=parentTreeWidth.at(i);
+ }
+ //printf("max tree width=%d, max tree height=%d\n",maxWidth,maxHeight);
+ return maxWidth>80 && maxHeight<12; // used metric to decide to render the tree
+ // from left to right instead of top to bottom,
+ // with the idea to render very wide trees in
+ // left to right order.
+}
+
+void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,bool base,int distance)
+{
+ //printf("DocClassGraph::buildGraph(%s,distance=%d,base=%d)\n",
+ // cd->name().data(),distance,base);
+ // ---- Add inheritance relations
+
+ if (m_graphType == DotNode::Inheritance || m_graphType==DotNode::Collaboration)
+ {
+ BaseClassList *bcl = base ? cd->baseClasses() : cd->subClasses();
+ if (bcl)
+ {
+ BaseClassListIterator bcli(*bcl);
+ BaseClassDef *bcd;
+ for ( ; (bcd=bcli.current()) ; ++bcli )
+ {
+ //printf("-------- inheritance relation %s->%s templ=`%s'\n",
+ // cd->name().data(),bcd->classDef->name().data(),bcd->templSpecifiers.data());
+ addClass(bcd->classDef,n,bcd->prot,0,bcd->usedName,
+ bcd->templSpecifiers,base,distance);
+ }
+ }
+ }
+ if (m_graphType == DotNode::Collaboration)
+ {
+ // ---- Add usage relations
+
+ UsesClassDict *dict =
+ base ? cd->usedImplementationClasses() :
+ cd->usedByImplementationClasses()
+ ;
+ if (dict)
+ {
+ UsesClassDictIterator ucdi(*dict);
+ UsesClassDef *ucd;
+ for (;(ucd=ucdi.current());++ucdi)
+ {
+ QCString label;
+ QDictIterator<void> dvi(*ucd->accessors);
+ const char *s;
+ bool first=TRUE;
+ int count=0;
+ int maxLabels=10;
+ for (;(s=dvi.currentKey()) && count<maxLabels;++dvi,++count)
+ {
+ if (first)
+ {
+ label=s;
+ first=FALSE;
+ }
+ else
+ {
+ label+=QCString("\n")+s;
+ }
+ }
+ if (count==maxLabels) label+="\n...";
+ //printf("addClass: %s templSpec=%s\n",ucd->classDef->name().data(),ucd->templSpecifiers.data());
+ addClass(ucd->classDef,n,EdgeInfo::Purple,label,0,
+ ucd->templSpecifiers,base,distance);
+ }
+ }
+ }
+
+ // ---- Add template instantiation relations
+
+ static bool templateRelations = Config_getBool("TEMPLATE_RELATIONS");
+ if (templateRelations)
+ {
+ if (base) // template relations for base classes
+ {
+ ClassDef *templMaster=cd->templateMaster();
+ if (templMaster)
+ {
+ QDictIterator<ClassDef> cli(*templMaster->getTemplateInstances());
+ ClassDef *templInstance;
+ for (;(templInstance=cli.current());++cli)
+ {
+ if (templInstance==cd)
+ {
+ addClass(templMaster,n,EdgeInfo::Orange,cli.currentKey(),0,
+ 0,TRUE,distance);
+ }
+ }
+ }
+ }
+ else // template relations for super classes
+ {
+ QDict<ClassDef> *templInstances = cd->getTemplateInstances();
+ if (templInstances)
+ {
+ QDictIterator<ClassDef> cli(*templInstances);
+ ClassDef *templInstance;
+ for (;(templInstance=cli.current());++cli)
+ {
+ addClass(templInstance,n,EdgeInfo::Orange,cli.currentKey(),0,
+ 0,FALSE,distance);
+ }
+ }
+ }
+ }
+}
+
+DotClassGraph::DotClassGraph(ClassDef *cd,DotNode::GraphType t)
+{
+ //printf("--------------- DotClassGraph::DotClassGraph `%s'\n",cd->displayName().data());
+ m_graphType = t;
+ QCString tmp_url="";
+ if (cd->isLinkable() && !cd->isHidden())
+ {
+ tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
+ if (!cd->anchor().isEmpty())
+ {
+ tmp_url+="#"+cd->anchor();
+ }
+ }
+ QCString className = cd->displayName();
+ QCString tooltip = cd->briefDescriptionAsTooltip();
+ m_startNode = new DotNode(m_curNodeNumber++,
+ className,
+ tooltip,
+ tmp_url.data(),
+ TRUE, // is a root node
+ cd
+ );
+ m_startNode->setDistance(0);
+ m_usedNodes = new QDict<DotNode>(1009);
+ m_usedNodes->insert(className,m_startNode);
+
+ //printf("Root node %s\n",cd->name().data());
+ //if (m_recDepth>0)
+ //{
+ buildGraph(cd,m_startNode,TRUE,1);
+ if (t==DotNode::Inheritance) buildGraph(cd,m_startNode,FALSE,1);
+ //}
+
+ static int maxNodes = Config_getInt("DOT_GRAPH_MAX_NODES");
+ //int directChildNodes = 1;
+ //if (m_startNode->m_children!=0)
+ // directChildNodes+=m_startNode->m_children->count();
+ //if (t==DotNode::Inheritance && m_startNode->m_parents!=0)
+ // directChildNodes+=m_startNode->m_parents->count();
+ //if (directChildNodes>maxNodes) maxNodes=directChildNodes;
+ //openNodeQueue.append(m_startNode);
+ m_lrRank = determineVisibleNodes(m_startNode,maxNodes,t==DotNode::Inheritance);
+ QList<DotNode> openNodeQueue;
+ openNodeQueue.append(m_startNode);
+ determineTruncatedNodes(openNodeQueue,t==DotNode::Inheritance);
+
+ m_diskName = cd->getFileBase().copy();
+}
+
+bool DotClassGraph::isTrivial() const
+{
+ if (m_graphType==DotNode::Inheritance)
+ return m_startNode->m_children==0 && m_startNode->m_parents==0;
+ else
+ return m_startNode->m_children==0;
+}
+
+bool DotClassGraph::isTooBig() const
+{
+ static int maxNodes = Config_getInt("DOT_GRAPH_MAX_NODES");
+ int numNodes = 0;
+ numNodes+= m_startNode->m_children ? m_startNode->m_children->count() : 0;
+ if (m_graphType==DotNode::Inheritance)
+ {
+ numNodes+= m_startNode->m_parents ? m_startNode->m_parents->count() : 0;
+ }
+ return numNodes>=maxNodes;
+}
+
+DotClassGraph::~DotClassGraph()
+{
+ deleteNodes(m_startNode);
+ delete m_usedNodes;
+}
+
+/*! Computes a 16 byte md5 checksum for a given dot graph.
+ * The md5 checksum is returned as a 32 character ASCII string.
+ */
+QCString computeMd5Signature(DotNode *root,
+ DotNode::GraphType gt,
+ GraphOutputFormat format,
+ bool lrRank,
+ bool renderParents,
+ bool backArrows,
+ QCString &graphStr
+ )
+{
+ bool reNumber=TRUE;
+
+ //printf("computeMd5Signature\n");
+ QGString buf;
+ FTextStream md5stream(&buf);
+ writeGraphHeader(md5stream);
+ if (lrRank)
+ {
+ md5stream << " rankdir=LR;" << endl;
+ }
+ root->clearWriteFlag();
+ root->write(md5stream,
+ gt,
+ format,
+ gt!=DotNode::CallGraph && gt!=DotNode::Dependency,
+ TRUE,
+ backArrows,
+ reNumber);
+ if (renderParents && root->m_parents)
+ {
+ QListIterator<DotNode> dnli(*root->m_parents);
+ DotNode *pn;
+ for (dnli.toFirst();(pn=dnli.current());++dnli)
+ {
+ if (pn->isVisible())
+ {
+ root->writeArrow(md5stream, // stream
+ gt, // graph type
+ format, // output format
+ pn, // child node
+ pn->m_edgeInfo->at(pn->m_children->findRef(root)), // edge info
+ FALSE, // topDown?
+ backArrows, // point back?
+ reNumber // renumber nodes
+ );
+ }
+ pn->write(md5stream, // stream
+ gt, // graph type
+ format, // output format
+ TRUE, // topDown?
+ FALSE, // toChildren?
+ backArrows, // backward pointing arrows?
+ reNumber // renumber nodes?
+ );
+ }
+ }
+ writeGraphFooter(md5stream);
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)buf.data(),buf.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ if (reNumber)
+ {
+ resetReNumbering();
+ }
+ graphStr=buf.data();
+ //printf("md5: %s | file: %s\n",sigStr,baseName.data());
+ return sigStr;
+}
+
+static bool updateDotGraph(DotNode *root,
+ DotNode::GraphType gt,
+ const QCString &baseName,
+ GraphOutputFormat format,
+ bool lrRank,
+ bool renderParents,
+ bool backArrows
+ )
+{
+ QCString theGraph;
+ // TODO: write graph to theGraph, then compute md5 checksum
+ QCString md5 = computeMd5Signature(
+ root,gt,format,lrRank,renderParents,backArrows,theGraph);
+ QFile f(baseName+".dot");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << theGraph;
+ }
+ return checkAndUpdateMd5Signature(baseName,md5); // graph needs to be regenerated
+}
+
+QCString DotClassGraph::diskName() const
+{
+ QCString result=m_diskName.copy();
+ switch (m_graphType)
+ {
+ case DotNode::Collaboration:
+ result+="_coll_graph";
+ break;
+ //case Interface:
+ // result+="_intf_graph";
+ // break;
+ case DotNode::Inheritance:
+ result+="_inherit_graph";
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ return result;
+}
+
+QCString DotClassGraph::writeGraph(FTextStream &out,
+ GraphOutputFormat format,
+ const char *path,
+ const char *fileName,
+ const char *relPath,
+ bool /*isTBRank*/,
+ bool generateImageMap) const
+{
+ QDir d(path);
+ // store the original directory
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",path); exit(1);
+ }
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+
+ QCString baseName;
+ QCString mapName;
+ switch (m_graphType)
+ {
+ case DotNode::Collaboration:
+ mapName="coll_map";
+ break;
+ //case Interface:
+ // mapName="intf_map";
+ // break;
+ case DotNode::Inheritance:
+ mapName="inherit_map";
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ baseName = convertNameToFile(diskName());
+
+ // derive target file names from baseName
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString absBaseName = QCString(d.absPath())+"/"+baseName;
+ QCString absDotName = absBaseName+".dot";
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ QCString absImgName = absBaseName+"."+imgExt;
+
+ bool regenerate = FALSE;
+ if (updateDotGraph(m_startNode,
+ m_graphType,
+ absBaseName,
+ format,
+ m_lrRank,
+ m_graphType==DotNode::Inheritance,
+ TRUE
+ ) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP && generateImageMap ? absMapName : QCString())
+ )
+ {
+ regenerate=TRUE;
+ if (format==BITMAP) // run dot to create a bitmap image
+ {
+ QCString dotArgs(maxCmdLine);
+
+ DotRunner *dotRun = new DotRunner(absDotName,
+ d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+
+ }
+ else if (format==EPS) // run dot to create a .eps image
+ {
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
+ {
+ dotRun->addJob("pdf",absPdfName);
+ }
+ else
+ {
+ dotRun->addJob("ps",absEpsName);
+ }
+ DotManager::instance()->addRun(dotRun);
+ }
+ }
+ Doxygen::indexList.addImageFile(baseName+"."+imgExt);
+
+ if (format==BITMAP && generateImageMap) // produce HTML to include the image
+ {
+ QCString mapLabel = escapeCharsInString(m_startNode->m_label,FALSE)+"_"+
+ escapeCharsInString(mapName,FALSE);
+ if (imgExt=="svg") // add link to SVG file without map file
+ {
+ out << "<div class=\"center\">";
+ if (regenerate || !writeSVGFigureLink(out,relPath,baseName,absImgName)) // need to patch the links in the generated SVG file
+ {
+ if (regenerate)
+ {
+ DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString());
+ }
+ int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath);
+ out << "<!-- SVG " << mapId << " -->" << endl;
+ }
+ out << "</div>" << endl;
+ }
+ else // add link to bitmap file with image map
+ {
+ out << "<div class=\"center\">";
+ out << "<img src=\"" << relPath << baseName << "."
+ << imgExt << "\" border=\"0\" usemap=\"#"
+ << mapLabel << "\" alt=\"";
+ switch (m_graphType)
+ {
+ case DotNode::Collaboration:
+ out << "Collaboration graph";
+ break;
+ case DotNode::Inheritance:
+ out << "Inheritance graph";
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ out << "\"/>";
+ out << "</div>" << endl;
+
+ if (regenerate || !insertMapFile(out,absMapName,relPath,mapLabel))
+ {
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ FALSE,QCString(),mapLabel);
+ out << "<!-- MAP " << mapId << " -->" << endl;
+ }
+ }
+ }
+ else if (format==EPS) // produce tex to include the .eps image
+ {
+ if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
+ {
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE /*TRUE*/);
+ out << endl << "% FIG " << figId << endl;
+ }
+ }
+ if (!regenerate) removeDotGraph(absDotName);
+
+ return baseName;
+}
+
+//--------------------------------------------------------------------
+
+void DotClassGraph::writeXML(FTextStream &t)
+{
+ QDictIterator<DotNode> dni(*m_usedNodes);
+ DotNode *node;
+ for (;(node=dni.current());++dni)
+ {
+ node->writeXML(t,TRUE);
+ }
+}
+
+void DotClassGraph::writeDEF(FTextStream &t)
+{
+ QDictIterator<DotNode> dni(*m_usedNodes);
+ DotNode *node;
+ for (;(node=dni.current());++dni)
+ {
+ node->writeDEF(t);
+ }
+}
+
+//--------------------------------------------------------------------
+
+int DotInclDepGraph::m_curNodeNumber = 0;
+
+void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance)
+{
+ QList<IncludeInfo> *includeFiles =
+ m_inverse ? fd->includedByFileList() : fd->includeFileList();
+ if (includeFiles)
+ {
+ QListIterator<IncludeInfo> ili(*includeFiles);
+ IncludeInfo *ii;
+ for (;(ii=ili.current());++ili)
+ {
+ FileDef *bfd = ii->fileDef;
+ QCString in = ii->includeName;
+ //printf(">>>> in=`%s' bfd=%p\n",ii->includeName.data(),bfd);
+ bool doc=TRUE,src=FALSE;
+ if (bfd)
+ {
+ in = bfd->absFilePath();
+ doc = bfd->isLinkable() && !bfd->isHidden();
+ src = bfd->generateSourceFile();
+ }
+ if (doc || src || !Config_getBool("HIDE_UNDOC_RELATIONS"))
+ {
+ QCString url="";
+ if (bfd) url=bfd->getOutputFileBase().copy();
+ if (!doc && src)
+ {
+ url=bfd->getSourceFileBase();
+ }
+ DotNode *bn = m_usedNodes->find(in);
+ if (bn) // file is already a node in the graph
+ {
+ n->addChild(bn,0,0,0);
+ bn->addParent(n);
+ bn->setDistance(distance);
+ }
+ else
+ {
+ QCString tmp_url;
+ QCString tooltip;
+ if (bfd)
+ {
+ tmp_url=doc || src ? bfd->getReference()+"$"+url : QCString();
+ tooltip = bfd->briefDescriptionAsTooltip();
+ }
+ bn = new DotNode(
+ m_curNodeNumber++, // n
+ ii->includeName, // label
+ tooltip, // tip
+ tmp_url, // url
+ FALSE, // rootNode
+ 0 // cd
+ );
+ n->addChild(bn,0,0,0);
+ bn->addParent(n);
+ m_usedNodes->insert(in,bn);
+ bn->setDistance(distance);
+
+ if (bfd) buildGraph(bn,bfd,distance+1);
+ }
+ }
+ }
+ }
+}
+
+void DotInclDepGraph::determineVisibleNodes(QList<DotNode> &queue, int &maxNodes)
+{
+ while (queue.count()>0 && maxNodes>0)
+ {
+ static int maxDistance = Config_getInt("MAX_DOT_GRAPH_DEPTH");
+ DotNode *n = queue.take(0);
+ if (!n->isVisible() && n->distance()<maxDistance) // not yet processed
+ {
+ n->markAsVisible();
+ maxNodes--;
+ // add direct children
+ if (n->m_children)
+ {
+ QListIterator<DotNode> li(*n->m_children);
+ DotNode *dn;
+ for (li.toFirst();(dn=li.current());++li)
+ {
+ queue.append(dn);
+ }
+ }
+ }
+ }
+}
+
+void DotInclDepGraph::determineTruncatedNodes(QList<DotNode> &queue)
+{
+ while (queue.count()>0)
+ {
+ DotNode *n = queue.take(0);
+ if (n->isVisible() && n->isTruncated()==DotNode::Unknown)
+ {
+ bool truncated = FALSE;
+ if (n->m_children)
+ {
+ QListIterator<DotNode> li(*n->m_children);
+ DotNode *dn;
+ for (li.toFirst();(dn=li.current());++li)
+ {
+ if (!dn->isVisible())
+ truncated = TRUE;
+ else
+ queue.append(dn);
+ }
+ }
+ n->markAsTruncated(truncated);
+ }
+ }
+}
+
+
+DotInclDepGraph::DotInclDepGraph(FileDef *fd,bool inverse)
+{
+ m_maxDistance = 0;
+ m_inverse = inverse;
+ ASSERT(fd!=0);
+ m_diskName = fd->getFileBase().copy();
+ QCString tmp_url=fd->getReference()+"$"+fd->getFileBase();
+ m_startNode = new DotNode(m_curNodeNumber++,
+ fd->docName(),
+ "",
+ tmp_url.data(),
+ TRUE // root node
+ );
+ m_startNode->setDistance(0);
+ m_usedNodes = new QDict<DotNode>(1009);
+ m_usedNodes->insert(fd->absFilePath(),m_startNode);
+ buildGraph(m_startNode,fd,1);
+
+ static int nodes = Config_getInt("DOT_GRAPH_MAX_NODES");
+ int maxNodes = nodes;
+ //int directChildNodes = 1;
+ //if (m_startNode->m_children!=0)
+ // directChildNodes+=m_startNode->m_children->count();
+ //if (directChildNodes>maxNodes) maxNodes=directChildNodes;
+ QList<DotNode> openNodeQueue;
+ openNodeQueue.append(m_startNode);
+ determineVisibleNodes(openNodeQueue,maxNodes);
+ openNodeQueue.clear();
+ openNodeQueue.append(m_startNode);
+ determineTruncatedNodes(openNodeQueue);
+}
+
+DotInclDepGraph::~DotInclDepGraph()
+{
+ deleteNodes(m_startNode);
+ delete m_usedNodes;
+}
+
+QCString DotInclDepGraph::diskName() const
+{
+ QCString result=m_diskName.copy();
+ if (m_inverse) result+="_dep";
+ result+="_incl";
+ return convertNameToFile(result);
+}
+
+QCString DotInclDepGraph::writeGraph(FTextStream &out,
+ GraphOutputFormat format,
+ const char *path,
+ const char *fileName,
+ const char *relPath,
+ bool generateImageMap
+ ) const
+{
+ QDir d(path);
+ // store the original directory
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",path); exit(1);
+ }
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+
+ QCString baseName=m_diskName;
+ if (m_inverse) baseName+="_dep";
+ baseName+="_incl";
+ baseName=convertNameToFile(baseName);
+ QCString mapName=escapeCharsInString(m_startNode->m_label,FALSE);
+ if (m_inverse) mapName+="dep";
+
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString absBaseName = QCString(d.absPath())+"/"+baseName;
+ QCString absDotName = absBaseName+".dot";
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ QCString absImgName = absBaseName+"."+imgExt;
+
+ bool regenerate = FALSE;
+ if (updateDotGraph(m_startNode,
+ DotNode::Dependency,
+ absBaseName,
+ format,
+ FALSE, // lrRank
+ FALSE, // renderParents
+ m_inverse // backArrows
+ ) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP && generateImageMap ? absMapName : QCString())
+ )
+ {
+ regenerate=TRUE;
+ if (format==BITMAP)
+ {
+ // run dot to create a bitmap image
+ QCString dotArgs(maxCmdLine);
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+ }
+ else if (format==EPS)
+ {
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
+ {
+ dotRun->addJob("pdf",absPdfName);
+ }
+ else
+ {
+ dotRun->addJob("ps",absEpsName);
+ }
+ DotManager::instance()->addRun(dotRun);
+
+ }
+ }
+ Doxygen::indexList.addImageFile(baseName+"."+imgExt);
+
+ if (format==BITMAP && generateImageMap)
+ {
+ if (imgExt=="svg") // Scalable vector graphics
+ {
+ out << "<div class=\"center\">";
+ if (regenerate || !writeSVGFigureLink(out,relPath,baseName,absImgName)) // need to patch the links in the generated SVG file
+ {
+ if (regenerate)
+ {
+ DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString());
+ }
+ int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath);
+ out << "<!-- SVG " << mapId << " -->" << endl;
+ }
+ out << "</div>" << endl;
+ }
+ else // bitmap graphics
+ {
+ out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
+ << imgExt << "\" border=\"0\" usemap=\"#"
+ << mapName << "\" alt=\"\"/>";
+ out << "</div>" << endl;
+
+ QCString absMapName = absBaseName+".map";
+ if (regenerate || !insertMapFile(out,absMapName,relPath,mapName))
+ {
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ FALSE,QCString(),mapName);
+ out << "<!-- MAP " << mapId << " -->" << endl;
+ }
+ }
+ }
+ else if (format==EPS) // encapsulated postscript
+ {
+ if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
+ {
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE);
+ out << endl << "% FIG " << figId << endl;
+ }
+ }
+ if (!regenerate) removeDotGraph(absDotName);
+
+ return baseName;
+}
+
+bool DotInclDepGraph::isTrivial() const
+{
+ return m_startNode->m_children==0;
+}
+
+bool DotInclDepGraph::isTooBig() const
+{
+ static int maxNodes = Config_getInt("DOT_GRAPH_MAX_NODES");
+ int numNodes = m_startNode->m_children ? m_startNode->m_children->count() : 0;
+ return numNodes>=maxNodes;
+}
+
+void DotInclDepGraph::writeXML(FTextStream &t)
+{
+ QDictIterator<DotNode> dni(*m_usedNodes);
+ DotNode *node;
+ for (;(node=dni.current());++dni)
+ {
+ node->writeXML(t,FALSE);
+ }
+}
+
+//-------------------------------------------------------------
+
+int DotCallGraph::m_curNodeNumber = 0;
+
+void DotCallGraph::buildGraph(DotNode *n,MemberDef *md,int distance)
+{
+ LockingPtr<MemberSDict> refs = m_inverse ? md->getReferencedByMembers() : md->getReferencesMembers();
+ if (!refs.isNull())
+ {
+ MemberSDict::Iterator mri(*refs);
+ MemberDef *rmd;
+ for (;(rmd=mri.current());++mri)
+ {
+ if (rmd->isFunction() || rmd->isSlot() || rmd->isSignal())
+ {
+ QCString uniqueId;
+ uniqueId=rmd->getReference()+"$"+
+ rmd->getOutputFileBase()+"#"+rmd->anchor();
+ DotNode *bn = m_usedNodes->find(uniqueId);
+ if (bn) // file is already a node in the graph
+ {
+ n->addChild(bn,0,0,0);
+ bn->addParent(n);
+ bn->setDistance(distance);
+ }
+ else
+ {
+ QCString name;
+ if (Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ name = rmd->getOuterScope()==m_scope ?
+ rmd->name() : rmd->qualifiedName();
+ }
+ else
+ {
+ name = rmd->qualifiedName();
+ }
+ QCString tooltip = rmd->briefDescriptionAsTooltip();
+ bn = new DotNode(
+ m_curNodeNumber++,
+ linkToText(name,FALSE),
+ tooltip,
+ uniqueId,
+ 0 //distance
+ );
+ n->addChild(bn,0,0,0);
+ bn->addParent(n);
+ bn->setDistance(distance);
+ m_usedNodes->insert(uniqueId,bn);
+
+ buildGraph(bn,rmd,distance+1);
+ }
+ }
+ }
+ }
+}
+
+void DotCallGraph::determineVisibleNodes(QList<DotNode> &queue, int &maxNodes)
+{
+ while (queue.count()>0 && maxNodes>0)
+ {
+ static int maxDistance = Config_getInt("MAX_DOT_GRAPH_DEPTH");
+ DotNode *n = queue.take(0);
+ if (!n->isVisible() && n->distance()<maxDistance) // not yet processed
+ {
+ n->markAsVisible();
+ maxNodes--;
+ // add direct children
+ if (n->m_children)
+ {
+ QListIterator<DotNode> li(*n->m_children);
+ DotNode *dn;
+ for (li.toFirst();(dn=li.current());++li)
+ {
+ queue.append(dn);
+ }
+ }
+ }
+ }
+}
+
+void DotCallGraph::determineTruncatedNodes(QList<DotNode> &queue)
+{
+ while (queue.count()>0)
+ {
+ DotNode *n = queue.take(0);
+ if (n->isVisible() && n->isTruncated()==DotNode::Unknown)
+ {
+ bool truncated = FALSE;
+ if (n->m_children)
+ {
+ QListIterator<DotNode> li(*n->m_children);
+ DotNode *dn;
+ for (li.toFirst();(dn=li.current());++li)
+ {
+ if (!dn->isVisible())
+ truncated = TRUE;
+ else
+ queue.append(dn);
+ }
+ }
+ n->markAsTruncated(truncated);
+ }
+ }
+}
+
+
+
+DotCallGraph::DotCallGraph(MemberDef *md,bool inverse)
+{
+ m_maxDistance = 0;
+ m_inverse = inverse;
+ m_diskName = md->getOutputFileBase()+"_"+md->anchor();
+ m_scope = md->getOuterScope();
+ QCString uniqueId;
+ uniqueId = md->getReference()+"$"+
+ md->getOutputFileBase()+"#"+md->anchor();
+ QCString name;
+ if (Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ name = md->name();
+ }
+ else
+ {
+ name = md->qualifiedName();
+ }
+ m_startNode = new DotNode(m_curNodeNumber++,
+ linkToText(name,FALSE),
+ "",
+ uniqueId.data(),
+ TRUE // root node
+ );
+ m_startNode->setDistance(0);
+ m_usedNodes = new QDict<DotNode>(1009);
+ m_usedNodes->insert(uniqueId,m_startNode);
+ buildGraph(m_startNode,md,1);
+
+ static int nodes = Config_getInt("DOT_GRAPH_MAX_NODES");
+ int maxNodes = nodes;
+ //int directChildNodes = 1;
+ //if (m_startNode->m_children!=0)
+ // directChildNodes+=m_startNode->m_children->count();
+ //if (directChildNodes>maxNodes) maxNodes=directChildNodes;
+ QList<DotNode> openNodeQueue;
+ openNodeQueue.append(m_startNode);
+ determineVisibleNodes(openNodeQueue,maxNodes);
+ openNodeQueue.clear();
+ openNodeQueue.append(m_startNode);
+ determineTruncatedNodes(openNodeQueue);
+}
+
+DotCallGraph::~DotCallGraph()
+{
+ deleteNodes(m_startNode);
+ delete m_usedNodes;
+}
+
+QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
+ const char *path,const char *fileName,
+ const char *relPath,bool generateImageMap) const
+{
+ QDir d(path);
+ // store the original directory
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",path); exit(1);
+ }
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+
+ QCString baseName = m_diskName + (m_inverse ? "_icgraph" : "_cgraph");
+ QCString mapName = baseName;
+
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString absBaseName = QCString(d.absPath())+"/"+baseName;
+ QCString absDotName = absBaseName+".dot";
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ QCString absImgName = absBaseName+"."+imgExt;
+
+ bool regenerate=FALSE;
+ if (updateDotGraph(m_startNode,
+ DotNode::CallGraph,
+ absBaseName,
+ format,
+ TRUE, // lrRank
+ FALSE, // renderParents
+ m_inverse // backArrows
+ ) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP && generateImageMap ? absMapName : QCString())
+ )
+ {
+ regenerate=TRUE;
+ if (format==BITMAP)
+ {
+ // run dot to create a bitmap image
+ QCString dotArgs(maxCmdLine);
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+
+ }
+ else if (format==EPS)
+ {
+ // run dot to create a .eps image
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
+ {
+ dotRun->addJob("pdf",absPdfName);
+ }
+ else
+ {
+ dotRun->addJob("ps",absEpsName);
+ }
+ DotManager::instance()->addRun(dotRun);
+
+ }
+ }
+ Doxygen::indexList.addImageFile(baseName+"."+imgExt);
+
+ if (format==BITMAP && generateImageMap)
+ {
+ if (imgExt=="svg") // Scalable vector graphics
+ {
+ out << "<div class=\"center\">";
+ if (regenerate || !writeSVGFigureLink(out,relPath,baseName,absImgName)) // need to patch the links in the generated SVG file
+ {
+ if (regenerate)
+ {
+ DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString());
+ }
+ int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath);
+ out << "<!-- SVG " << mapId << " -->" << endl;
+ }
+ out << "</div>" << endl;
+ }
+ else // bitmap graphics
+ {
+ out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
+ << imgExt << "\" border=\"0\" usemap=\"#"
+ << mapName << "\" alt=\"";
+ out << "\"/>";
+ out << "</div>" << endl;
+
+ if (regenerate || !insertMapFile(out,absMapName,relPath,mapName))
+ {
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ FALSE,QCString(),mapName);
+ out << "<!-- MAP " << mapId << " -->" << endl;
+ }
+ }
+ }
+ else if (format==EPS) // encapsulated postscript
+ {
+ if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
+ {
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE);
+ out << endl << "% FIG " << figId << endl;
+ }
+ }
+ if (!regenerate) removeDotGraph(absDotName);
+
+ return baseName;
+}
+
+bool DotCallGraph::isTrivial() const
+{
+ return m_startNode->m_children==0;
+}
+
+bool DotCallGraph::isTooBig() const
+{
+ static int maxNodes = Config_getInt("DOT_GRAPH_MAX_NODES");
+ int numNodes = m_startNode->m_children ? m_startNode->m_children->count() : 0;
+ return numNodes>=maxNodes;
+}
+
+//-------------------------------------------------------------
+
+DotDirDeps::DotDirDeps(DirDef *dir) : m_dir(dir)
+{
+}
+
+DotDirDeps::~DotDirDeps()
+{
+}
+
+QCString DotDirDeps::writeGraph(FTextStream &out,
+ GraphOutputFormat format,
+ const char *path,
+ const char *fileName,
+ const char *relPath,
+ bool generateImageMap) const
+{
+ QDir d(path);
+ // store the original directory
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",path); exit(1);
+ }
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+
+ QCString baseName=m_dir->getOutputFileBase()+"_dep";
+ QCString mapName=escapeCharsInString(baseName,FALSE);
+
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString absBaseName = QCString(d.absPath())+"/"+baseName;
+ QCString absDotName = absBaseName+".dot";
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ QCString absImgName = absBaseName+"."+imgExt;
+
+ // compute md5 checksum of the graph were are about to generate
+ QGString theGraph;
+ FTextStream md5stream(&theGraph);
+ m_dir->writeDepGraph(md5stream);
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)theGraph.data(),theGraph.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ bool regenerate=FALSE;
+ if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP && generateImageMap ? absMapName : QCString())
+ )
+ {
+ regenerate=TRUE;
+
+ QFile f(absDotName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot create file %s.dot for writing!\n",baseName.data());
+ }
+ FTextStream t(&f);
+ t << theGraph.data();
+ f.close();
+
+ if (format==BITMAP)
+ {
+ // run dot to create a bitmap image
+ QCString dotArgs(maxCmdLine);
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+ }
+ else if (format==EPS)
+ {
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
+ {
+ dotRun->addJob("pdf",absPdfName);
+ }
+ else
+ {
+ dotRun->addJob("ps",absEpsName);
+ }
+ DotManager::instance()->addRun(dotRun);
+ }
+ }
+ Doxygen::indexList.addImageFile(baseName+"."+imgExt);
+
+ if (format==BITMAP && generateImageMap)
+ {
+ if (imgExt=="svg") // Scalable vector graphics
+ {
+ out << "<div class=\"center\">";
+ if (regenerate || !writeSVGFigureLink(out,relPath,baseName,absImgName)) // need to patch the links in the generated SVG file
+ {
+ if (regenerate)
+ {
+ DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString());
+ }
+ int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath);
+ out << "<!-- SVG " << mapId << " -->" << endl;
+ }
+ out << "</div>" << endl;
+ }
+ else // bitmap graphics
+ {
+ out << "<div class=\"center\"><img src=\"" << relPath << baseName << "."
+ << imgExt << "\" border=\"0\" usemap=\"#"
+ << mapName << "\" alt=\"";
+ out << convertToXML(m_dir->displayName());
+ out << "\"/>";
+ out << "</div>" << endl;
+
+ if (regenerate || !insertMapFile(out,absMapName,relPath,mapName))
+ {
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ TRUE,QCString(),mapName);
+ out << "<!-- MAP " << mapId << " -->" << endl;
+ }
+ }
+ }
+ else if (format==EPS)
+ {
+ if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName))
+ {
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE);
+ out << endl << "% FIG " << figId << endl;
+ }
+ }
+ if (!regenerate) removeDotGraph(absDotName);
+
+ return baseName;
+}
+
+bool DotDirDeps::isTrivial() const
+{
+ return m_dir->depGraphIsTrivial();
+}
+
+//-------------------------------------------------------------
+
+void generateGraphLegend(const char *path)
+{
+ QDir d(path);
+ // store the original directory
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",path); exit(1);
+ }
+
+ QGString theGraph;
+ FTextStream md5stream(&theGraph);
+ writeGraphHeader(md5stream);
+ md5stream << " Node9 [shape=\"box\",label=\"Inherited\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",fillcolor=\"grey75\",style=\"filled\" fontcolor=\"black\"];\n";
+ md5stream << " Node10 -> Node9 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node10 [shape=\"box\",label=\"PublicBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classPublicBase" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node11 -> Node10 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node11 [shape=\"box\",label=\"Truncated\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"red\",URL=\"$classTruncated" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node13 -> Node9 [dir=back,color=\"darkgreen\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node13 [shape=\"box\",label=\"ProtectedBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classProtectedBase" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node14 -> Node9 [dir=back,color=\"firebrick4\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node14 [shape=\"box\",label=\"PrivateBase\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classPrivateBase" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node15 -> Node9 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node15 [shape=\"box\",label=\"Undocumented\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"grey75\"];\n";
+ md5stream << " Node16 -> Node9 [dir=back,color=\"midnightblue\",fontsize=\"" << FONTSIZE << "\",style=\"solid\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node16 [shape=\"box\",label=\"Templ< int >\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classTempl" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node17 -> Node16 [dir=back,color=\"orange\",fontsize=\"" << FONTSIZE << "\",style=\"dashed\",label=\"< int >\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node17 [shape=\"box\",label=\"Templ< T >\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classTempl" << Doxygen::htmlFileExtension << "\"];\n";
+ md5stream << " Node18 -> Node9 [dir=back,color=\"darkorchid3\",fontsize=\"" << FONTSIZE << "\",style=\"dashed\",label=\"m_usedClass\",fontname=\"" << FONTNAME << "\"];\n";
+ md5stream << " Node18 [shape=\"box\",label=\"Used\",fontsize=\"" << FONTSIZE << "\",height=0.2,width=0.4,fontname=\"" << FONTNAME << "\",color=\"black\",URL=\"$classUsed" << Doxygen::htmlFileExtension << "\"];\n";
+ writeGraphFooter(md5stream);
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)theGraph.data(),theGraph.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ QCString absBaseName = (QCString)path+"/graph_legend";
+ QCString absDotName = absBaseName+".dot";
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString imgName = "graph_legend."+imgExt;
+ QCString absImgName = absBaseName+"."+imgExt;
+ if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
+ !checkDeliverables(absImgName))
+ {
+ QFile dotFile(absDotName);
+ if (!dotFile.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",
+ convertToQCString(dotFile.name()).data());
+ return;
+ }
+
+ FTextStream dotText(&dotFile);
+ dotText << theGraph;
+ dotFile.close();
+
+ // run dot to generate the a bitmap image from the graph
+
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),TRUE,absImgName);
+ dotRun->addJob(imgExt,absImgName);
+ DotManager::instance()->addRun(dotRun);
+ }
+ else
+ {
+ removeDotGraph(absDotName);
+ }
+ Doxygen::indexList.addImageFile(imgName);
+
+ if (imgExt=="svg")
+ {
+ DotManager::instance()->addSVGObject(
+ absBaseName+Config_getString("HTML_FILE_EXTENSION"),
+ "graph_legend",
+ absImgName,QCString());
+ }
+
+}
+
+void writeDotGraphFromFile(const char *inFile,const char *outDir,
+ const char *outFile,GraphOutputFormat format)
+{
+ QDir d(outDir);
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",outDir); exit(1);
+ }
+
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString imgName = (QCString)outFile+"."+imgExt;
+ QCString absImgName = QCString(d.absPath())+"/"+imgName;
+ QCString absOutFile = QCString(d.absPath())+"/"+outFile;
+
+ DotRunner dotRun(inFile,d.absPath().data(),FALSE,absImgName);
+ if (format==BITMAP)
+ dotRun.addJob(imgExt,absImgName);
+ else // format==EPS
+ {
+ if (Config_getBool("USE_PDFLATEX"))
+ {
+ dotRun.addJob("pdf",absOutFile+".pdf");
+ }
+ else
+ {
+ dotRun.addJob("ps",absOutFile+".eps");
+ }
+ }
+
+ dotRun.preventCleanUp();
+ if (!dotRun.run())
+ {
+ return;
+ }
+
+ if (format==BITMAP) checkDotResult(absImgName);
+
+ Doxygen::indexList.addImageFile(imgName);
+
+}
+
+
+/*! Writes user defined image map to the output.
+ * \param t text stream to write to
+ * \param inFile just the basename part of the filename
+ * \param outDir output directory
+ * \param relPath relative path the to root of the output dir
+ * \param baseName the base name of the output files
+ * \param context the scope in which this graph is found (for resolving links)
+ */
+void writeDotImageMapFromFile(FTextStream &t,
+ const QCString &inFile, const QCString &outDir,
+ const QCString &relPath, const QCString &baseName,
+ const QCString &context)
+{
+
+ QDir d(outDir);
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",outDir.data()); exit(1);
+ }
+
+ QCString mapName = baseName+".map";
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString imgName = baseName+"."+imgExt;
+ QCString absOutFile = QCString(d.absPath())+"/"+mapName;
+
+ DotRunner dotRun(inFile,d.absPath().data(),FALSE);
+ dotRun.addJob(MAP_CMD,absOutFile);
+ dotRun.preventCleanUp();
+ if (!dotRun.run())
+ {
+ return;
+ }
+
+ if (imgExt=="svg") // vector graphics
+ {
+ writeSVGFigureLink(t,relPath,inFile,inFile+".svg");
+ DotFilePatcher patcher(inFile+".svg");
+ patcher.addSVGConversion(relPath,TRUE,context);
+ patcher.run();
+ }
+ else // bitmap graphics
+ {
+ t << "<img src=\"" << relPath << imgName << "\" alt=\""
+ << imgName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl
+ << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">";
+
+ convertMapFile(t, absOutFile, relPath ,TRUE, context);
+
+ t << "</map>" << endl;
+ }
+ d.remove(absOutFile);
+}
+
+//-------------------------------------------------------------
+
+DotGroupCollaboration::DotGroupCollaboration(GroupDef* gd)
+{
+ m_curNodeId = 0;
+ QCString tmp_url = gd->getReference()+"$"+gd->getOutputFileBase();
+ m_usedNodes = new QDict<DotNode>(1009);
+ m_rootNode = new DotNode(m_curNodeId++, gd->groupTitle(), "", tmp_url, TRUE );
+ m_rootNode->markAsVisible();
+ m_usedNodes->insert(gd->name(), m_rootNode );
+ m_edges.setAutoDelete(TRUE);
+
+ m_diskName = gd->getOutputFileBase();
+
+ buildGraph( gd );
+}
+
+DotGroupCollaboration::~DotGroupCollaboration()
+{
+ delete m_usedNodes;
+}
+
+void DotGroupCollaboration::buildGraph(GroupDef* gd)
+{
+ QCString tmp_url;
+ //===========================
+ // hierarchy.
+
+ // Write parents
+ LockingPtr<GroupList> groups = gd->partOfGroups();
+ if ( groups!=0 )
+ {
+ GroupListIterator gli(*groups);
+ GroupDef *d;
+ for (gli.toFirst();(d=gli.current());++gli)
+ {
+ DotNode* nnode = m_usedNodes->find(d->name());
+ if ( !nnode )
+ { // add node
+ tmp_url = d->getReference()+"$"+d->getOutputFileBase();
+ QCString tooltip = d->briefDescriptionAsTooltip();
+ nnode = new DotNode(m_curNodeId++, d->groupTitle(), tooltip, tmp_url );
+ nnode->markAsVisible();
+ m_usedNodes->insert(d->name(), nnode );
+ }
+ tmp_url = "";
+ addEdge( nnode, m_rootNode, DotGroupCollaboration::thierarchy, tmp_url, tmp_url );
+ }
+ }
+
+ // Add subgroups
+ if ( gd->getSubGroups() && gd->getSubGroups()->count() )
+ {
+ QListIterator<GroupDef> defli(*gd->getSubGroups());
+ GroupDef *def;
+ for (;(def=defli.current());++defli)
+ {
+ DotNode* nnode = m_usedNodes->find(def->name());
+ if ( !nnode )
+ { // add node
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase();
+ QCString tooltip = def->briefDescriptionAsTooltip();
+ nnode = new DotNode(m_curNodeId++, def->groupTitle(), tooltip, tmp_url );
+ nnode->markAsVisible();
+ m_usedNodes->insert(def->name(), nnode );
+ }
+ tmp_url = "";
+ addEdge( m_rootNode, nnode, DotGroupCollaboration::thierarchy, tmp_url, tmp_url );
+ }
+ }
+
+ //=======================
+ // Write collaboration
+
+ // Add members
+ addMemberList( gd->getMemberList(MemberList::allMembersList) );
+
+ // Add classes
+ if ( gd->getClasses() && gd->getClasses()->count() )
+ {
+ ClassSDict::Iterator defli(*gd->getClasses());
+ ClassDef *def;
+ for (;(def=defli.current());++defli)
+ {
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ if (!def->anchor().isEmpty())
+ {
+ tmp_url+="#"+def->anchor();
+ }
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tclass );
+ }
+ }
+
+ // Add namespaces
+ if ( gd->getNamespaces() && gd->getNamespaces()->count() )
+ {
+ NamespaceSDict::Iterator defli(*gd->getNamespaces());
+ NamespaceDef *def;
+ for (;(def=defli.current());++defli)
+ {
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tnamespace );
+ }
+ }
+
+ // Add files
+ if ( gd->getFiles() && gd->getFiles()->count() )
+ {
+ QListIterator<FileDef> defli(*gd->getFiles());
+ FileDef *def;
+ for (;(def=defli.current());++defli)
+ {
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tfile );
+ }
+ }
+
+ // Add pages
+ if ( gd->getPages() && gd->getPages()->count() )
+ {
+ PageSDict::Iterator defli(*gd->getPages());
+ PageDef *def;
+ for (;(def=defli.current());++defli)
+ {
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tpages );
+ }
+ }
+
+ // Add directories
+ if ( gd->getDirs() && gd->getDirs()->count() )
+ {
+ QListIterator<DirDef> defli(*gd->getDirs());
+ DirDef *def;
+ for (;(def=defli.current());++defli)
+ {
+ tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tdir );
+ }
+ }
+}
+
+void DotGroupCollaboration::addMemberList( MemberList* ml )
+{
+ if ( !( ml && ml->count()) ) return;
+ MemberListIterator defli(*ml);
+ MemberDef *def;
+ for (;(def=defli.current());++defli)
+ {
+ QCString tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension
+ +"#"+def->anchor();
+ addCollaborationMember( def, tmp_url, DotGroupCollaboration::tmember );
+ }
+}
+
+DotGroupCollaboration::Edge* DotGroupCollaboration::addEdge(
+ DotNode* _pNStart, DotNode* _pNEnd, EdgeType _eType,
+ const QCString& _label, const QCString& _url )
+{
+ // search a existing link.
+ QListIterator<Edge> lli(m_edges);
+ Edge* newEdge = 0;
+ for ( lli.toFirst(); (newEdge=lli.current()); ++lli)
+ {
+ if ( newEdge->pNStart==_pNStart &&
+ newEdge->pNEnd==_pNEnd &&
+ newEdge->eType==_eType
+ )
+ { // edge already found
+ break;
+ }
+ }
+ if ( newEdge==0 ) // new link
+ {
+ newEdge = new Edge(_pNStart,_pNEnd,_eType);
+ m_edges.append( newEdge );
+ }
+
+ if (!_label.isEmpty())
+ {
+ newEdge->links.append(new Link(_label,_url));
+ }
+
+ return newEdge;
+}
+
+void DotGroupCollaboration::addCollaborationMember(
+ Definition* def, QCString& url, EdgeType eType )
+{
+ // Create group nodes
+ if ( !def->partOfGroups() )
+ return;
+ GroupListIterator gli(*def->partOfGroups());
+ GroupDef *d;
+ QCString tmp_str;
+ for (;(d=gli.current());++gli)
+ {
+ DotNode* nnode = m_usedNodes->find(d->name());
+ if ( nnode != m_rootNode )
+ {
+ if ( nnode==0 )
+ { // add node
+ tmp_str = d->getReference()+"$"+d->getOutputFileBase();
+ QCString tooltip = d->briefDescriptionAsTooltip();
+ nnode = new DotNode(m_curNodeId++, d->groupTitle(), tooltip, tmp_str );
+ nnode->markAsVisible();
+ m_usedNodes->insert(d->name(), nnode );
+ }
+ tmp_str = def->qualifiedName();
+ addEdge( m_rootNode, nnode, eType, tmp_str, url );
+ }
+ }
+}
+
+
+QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat format,
+ const char *path, const char *fileName, const char *relPath,
+ bool writeImageMap) const
+{
+ QDir d(path);
+ // store the original directory
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",path); exit(1);
+ }
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+
+ QGString theGraph;
+ FTextStream md5stream(&theGraph);
+ writeGraphHeader(md5stream);
+
+ // clean write flags
+ QDictIterator<DotNode> dni(*m_usedNodes);
+ DotNode *pn;
+ for (dni.toFirst();(pn=dni.current());++dni)
+ {
+ pn->clearWriteFlag();
+ }
+
+ // write other nodes.
+ for (dni.toFirst();(pn=dni.current());++dni)
+ {
+ pn->write(md5stream,DotNode::Inheritance,format,TRUE,FALSE,FALSE,FALSE);
+ }
+
+ // write edges
+ QListIterator<Edge> eli(m_edges);
+ Edge* edge;
+ for (eli.toFirst();(edge=eli.current());++eli)
+ {
+ edge->write( md5stream );
+ }
+
+ writeGraphFooter(md5stream);
+ resetReNumbering();
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)theGraph.data(),theGraph.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
+ QCString baseName = m_diskName;
+ QCString imgName = baseName+"."+imgExt;
+ QCString mapName = baseName+".map";
+ QCString absPath = d.absPath().data();
+ QCString absBaseName = absPath+"/"+baseName;
+ QCString absDotName = absBaseName+".dot";
+ QCString absImgName = absBaseName+"."+imgExt;
+ QCString absMapName = absBaseName+".map";
+ QCString absPdfName = absBaseName+".pdf";
+ QCString absEpsName = absBaseName+".eps";
+ bool regenerate=FALSE;
+ if (checkAndUpdateMd5Signature(absBaseName,sigStr) ||
+ !checkDeliverables(format==BITMAP ? absImgName :
+ usePDFLatex ? absPdfName : absEpsName,
+ format==BITMAP /*&& generateImageMap*/ ? absMapName : QCString())
+ )
+ {
+ regenerate=TRUE;
+
+ QFile dotfile(absDotName);
+ if (dotfile.open(IO_WriteOnly))
+ {
+ FTextStream tdot(&dotfile);
+ tdot << theGraph;
+ dotfile.close();
+ }
+
+ if (format==BITMAP) // run dot to create a bitmap image
+ {
+ QCString dotArgs(maxCmdLine);
+
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ dotRun->addJob(imgExt,absImgName);
+ if (writeImageMap) dotRun->addJob(MAP_CMD,absMapName);
+ DotManager::instance()->addRun(dotRun);
+
+ }
+ else if (format==EPS)
+ {
+ DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE);
+ if (usePDFLatex)
+ {
+ dotRun->addJob("pdf",absPdfName);
+ }
+ else
+ {
+ dotRun->addJob("ps",absEpsName);
+ }
+ DotManager::instance()->addRun(dotRun);
+ }
+
+ }
+ if (format==BITMAP && writeImageMap)
+ {
+ QCString mapLabel = escapeCharsInString(baseName,FALSE);
+ t << "<center><table><tr><td>";
+
+ if (imgExt=="svg")
+ {
+ t << "<div class=\"center\">";
+ if (regenerate || !writeSVGFigureLink(t,relPath,baseName,absImgName)) // need to patch the links in the generated SVG file
+ {
+ if (regenerate)
+ {
+ DotManager::instance()->addSVGConversion(absImgName,relPath,FALSE,QCString());
+ }
+ int mapId = DotManager::instance()->addSVGObject(fileName,baseName,absImgName,relPath);
+ t << "<!-- SVG " << mapId << " -->" << endl;
+ }
+ t << "</div>" << endl;
+ }
+ else
+ {
+ t << "<img src=\"" << relPath << imgName
+ << "\" border=\"0\" alt=\"\" usemap=\"#"
+ << mapLabel << "\"/>" << endl;
+ if (regenerate || !insertMapFile(t,absMapName,relPath,mapLabel))
+ {
+ int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath,
+ FALSE,QCString(),mapLabel);
+ t << "<!-- MAP " << mapId << " -->" << endl;
+ }
+ }
+
+ t << "</td></tr></table></center>" << endl;
+ }
+ else if (format==EPS)
+ {
+ if (regenerate || !writeVecGfxFigure(t,baseName,absBaseName))
+ {
+ int figId = DotManager::instance()->addFigure(fileName,baseName,absBaseName,FALSE);
+ t << endl << "% FIG " << figId << endl;
+ }
+ }
+ if (!regenerate) removeDotGraph(absDotName);
+
+ return baseName;
+}
+
+void DotGroupCollaboration::Edge::write( FTextStream &t ) const
+{
+ const char* linkTypeColor[] = {
+ "darkorchid3"
+ ,"orange"
+ ,"blueviolet"
+ ,"darkgreen"
+ ,"firebrick4"
+ ,"grey75"
+ ,"midnightblue"
+ };
+ QCString arrowStyle = "dir=\"none\", style=\"dashed\"";
+ t << " Node" << pNStart->number();
+ t << "->";
+ t << "Node" << pNEnd->number();
+
+ t << " [shape=plaintext";
+ if (links.count()>0) // there are links
+ {
+ t << ", ";
+ // HTML-like edge labels crash on my Mac with Graphviz 2.0! and
+ // are not supported by older version of dot.
+ //
+ //t << label=<<TABLE BORDER=\"0\" CELLBORDER=\"0\">";
+ //QListIterator<Link> lli(links);
+ //Link *link;
+ //for( lli.toFirst(); (link=lli.current()); ++lli)
+ //{
+ // t << "<TR><TD";
+ // if ( !link->url.isEmpty() )
+ // t << " HREF=\"" << link->url << "\"";
+ // t << ">" << link->label << "</TD></TR>";
+ //}
+ //t << "</TABLE>>";
+
+ t << "label=\"";
+ QListIterator<Link> lli(links);
+ Link *link;
+ bool first=TRUE;
+ int count=0;
+ const int maxLabels = 10;
+ for( lli.toFirst(); (link=lli.current()) && count<maxLabels; ++lli,++count)
+ {
+ if (first) first=FALSE; else t << "\\n";
+ t << convertLabel(link->label);
+ }
+ if (count==maxLabels) t << "\\n...";
+ t << "\"";
+
+ }
+ switch( eType )
+ {
+ case thierarchy :
+ arrowStyle = "dir=\"back\", style=\"solid\"";
+ default :
+ t << ", color=\"" << linkTypeColor[(int)eType] << "\"";
+ break;
+ }
+ t << ", " << arrowStyle;
+ t << "];" << endl;
+}
+
+bool DotGroupCollaboration::isTrivial() const
+{
+ return m_usedNodes->count() <= 1;
+}
+
+void DotGroupCollaboration::writeGraphHeader(FTextStream &t) const
+{
+ t << "digraph structs" << endl;
+ t << "{" << endl;
+ if (Config_getBool("DOT_TRANSPARENT"))
+ {
+ t << " bgcolor=\"transparent\";" << endl;
+ }
+ t << " edge [fontname=\"" << FONTNAME << "\",fontsize=\"" << FONTSIZE << "\","
+ "labelfontname=\"" << FONTNAME << "\",labelfontsize=\"" << FONTSIZE << "\"];\n";
+ t << " node [fontname=\"" << FONTNAME << "\",fontsize=\"" << FONTSIZE << "\",shape=record];\n";
+ t << " rankdir=LR;\n";
+}
+
+void writeDotDirDepGraph(FTextStream &t,DirDef *dd)
+{
+ t << "digraph G {\n";
+ if (Config_getBool("DOT_TRANSPARENT"))
+ {
+ t << " bgcolor=transparent;\n";
+ }
+ t << " compound=true\n";
+ t << " node [ fontsize=\"" << FONTSIZE << "\", fontname=\"" << FONTNAME << "\"];\n";
+ t << " edge [ labelfontsize=\"" << FONTSIZE << "\", labelfontname=\"" << FONTNAME << "\"];\n";
+
+ QDict<DirDef> dirsInGraph(257);
+
+ dirsInGraph.insert(dd->getOutputFileBase(),dd);
+ if (dd->parent())
+ {
+ t << " subgraph cluster" << dd->parent()->getOutputFileBase() << " {\n";
+ t << " graph [ bgcolor=\"#ddddee\", pencolor=\"black\", label=\""
+ << dd->parent()->shortName()
+ << "\" fontname=\"" << FONTNAME << "\", fontsize=\"" << FONTSIZE << "\", URL=\"";
+ t << dd->parent()->getOutputFileBase() << Doxygen::htmlFileExtension;
+ t << "\"]\n";
+ }
+ if (dd->isCluster())
+ {
+ t << " subgraph cluster" << dd->getOutputFileBase() << " {\n";
+ t << " graph [ bgcolor=\"#eeeeff\", pencolor=\"black\", label=\"\""
+ << " URL=\"" << dd->getOutputFileBase() << Doxygen::htmlFileExtension
+ << "\"];\n";
+ t << " " << dd->getOutputFileBase() << " [shape=plaintext label=\""
+ << dd->shortName() << "\"];\n";
+
+ // add nodes for sub directories
+ QListIterator<DirDef> sdi(dd->subDirs());
+ DirDef *sdir;
+ for (sdi.toFirst();(sdir=sdi.current());++sdi)
+ {
+ t << " " << sdir->getOutputFileBase() << " [shape=box label=\""
+ << sdir->shortName() << "\"";
+ if (sdir->isCluster())
+ {
+ t << " color=\"red\"";
+ }
+ else
+ {
+ t << " color=\"black\"";
+ }
+ t << " fillcolor=\"white\" style=\"filled\"";
+ t << " URL=\"" << sdir->getOutputFileBase()
+ << Doxygen::htmlFileExtension << "\"";
+ t << "];\n";
+ dirsInGraph.insert(sdir->getOutputFileBase(),sdir);
+ }
+ t << " }\n";
+ }
+ else
+ {
+ t << " " << dd->getOutputFileBase() << " [shape=box, label=\""
+ << dd->shortName() << "\", style=\"filled\", fillcolor=\"#eeeeff\","
+ << " pencolor=\"black\", URL=\"" << dd->getOutputFileBase()
+ << Doxygen::htmlFileExtension << "\"];\n";
+ }
+ if (dd->parent())
+ {
+ t << " }\n";
+ }
+
+ // add nodes for other used directories
+ QDictIterator<UsedDir> udi(*dd->usedDirs());
+ UsedDir *udir;
+ //printf("*** For dir %s\n",shortName().data());
+ for (udi.toFirst();(udir=udi.current());++udi)
+ // for each used dir (=directly used or a parent of a directly used dir)
+ {
+ const DirDef *usedDir=udir->dir();
+ DirDef *dir=dd;
+ while (dir)
+ {
+ //printf("*** check relation %s->%s same_parent=%d !%s->isParentOf(%s)=%d\n",
+ // dir->shortName().data(),usedDir->shortName().data(),
+ // dir->parent()==usedDir->parent(),
+ // usedDir->shortName().data(),
+ // shortName().data(),
+ // !usedDir->isParentOf(this)
+ // );
+ if (dir!=usedDir && dir->parent()==usedDir->parent() &&
+ !usedDir->isParentOf(dd))
+ // include if both have the same parent (or no parent)
+ {
+ t << " " << usedDir->getOutputFileBase() << " [shape=box label=\""
+ << usedDir->shortName() << "\"";
+ if (usedDir->isCluster())
+ {
+ if (!Config_getBool("DOT_TRANSPARENT"))
+ {
+ t << " fillcolor=\"white\" style=\"filled\"";
+ }
+ t << " color=\"red\"";
+ }
+ t << " URL=\"" << usedDir->getOutputFileBase()
+ << Doxygen::htmlFileExtension << "\"];\n";
+ dirsInGraph.insert(usedDir->getOutputFileBase(),usedDir);
+ break;
+ }
+ dir=dir->parent();
+ }
+ }
+
+ // add relations between all selected directories
+ DirDef *dir;
+ QDictIterator<DirDef> di(dirsInGraph);
+ for (di.toFirst();(dir=di.current());++di) // foreach dir in the graph
+ {
+ QDictIterator<UsedDir> udi(*dir->usedDirs());
+ UsedDir *udir;
+ for (udi.toFirst();(udir=udi.current());++udi) // foreach used dir
+ {
+ const DirDef *usedDir=udir->dir();
+ if ((dir!=dd || !udir->inherited()) && // only show direct dependendies for this dir
+ (usedDir!=dd || !udir->inherited()) && // only show direct dependendies for this dir
+ !usedDir->isParentOf(dir) && // don't point to own parent
+ dirsInGraph.find(usedDir->getOutputFileBase())) // only point to nodes that are in the graph
+ {
+ QCString relationName;
+ relationName.sprintf("dir_%06d_%06d",dir->dirCount(),usedDir->dirCount());
+ if (Doxygen::dirRelations.find(relationName)==0)
+ {
+ // new relation
+ Doxygen::dirRelations.append(relationName,
+ new DirRelation(relationName,dir,udir));
+ }
+ int nrefs = udir->filePairs().count();
+ t << " " << dir->getOutputFileBase() << "->"
+ << usedDir->getOutputFileBase();
+ t << " [headlabel=\"" << nrefs << "\", labeldistance=1.5";
+ t << " headhref=\"" << relationName << Doxygen::htmlFileExtension
+ << "\"];\n";
+ }
+ }
+ }
+
+ t << "}\n";
+}
diff --git a/src/dot.h b/src/dot.h
new file mode 100644
index 0000000..f8ac63f
--- /dev/null
+++ b/src/dot.h
@@ -0,0 +1,450 @@
+/******************************************************************************
+ *
+ * $Id: dot.h,v 1.14 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _DOT_H
+#define _DOT_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qdict.h>
+#include <qwaitcondition.h>
+#include <qmutex.h>
+#include <qqueue.h>
+#include <qthread.h>
+#include "sortdict.h"
+
+class ClassDef;
+class FileDef;
+class FTextStream;
+class DotNodeList;
+class ClassSDict;
+class MemberDef;
+class Definition;
+class DirDef;
+class GroupDef;
+class DotGroupCollaboration;
+class DotRunnerQueue;
+
+enum GraphOutputFormat { BITMAP , EPS };
+
+/** @brief Attributes of an edge of a dot graph */
+struct EdgeInfo
+{
+ enum Colors { Blue=0, Green=1, Red=2, Purple=3, Grey=4, Orange=5 };
+ enum Styles { Solid=0, Dashed=1 };
+ EdgeInfo() : m_color(0), m_style(0), m_labColor(0) {}
+ ~EdgeInfo() {}
+ int m_color;
+ int m_style;
+ QCString m_label;
+ QCString m_url;
+ int m_labColor;
+};
+
+/** @brief A node in a dot graph */
+class DotNode
+{
+ public:
+ enum GraphType { Dependency, Inheritance, Collaboration, Hierarchy, CallGraph };
+ enum TruncState { Unknown, Truncated, Untruncated };
+ DotNode(int n,const char *lab,const char *tip,const char *url,
+ bool rootNode=FALSE,ClassDef *cd=0);
+ ~DotNode();
+ void addChild(DotNode *n,
+ int edgeColor=EdgeInfo::Purple,
+ int edgeStyle=EdgeInfo::Solid,
+ const char *edgeLab=0,
+ const char *edgeURL=0,
+ int edgeLabCol=-1
+ );
+ void addParent(DotNode *n);
+ void deleteNode(DotNodeList &deletedList,SDict<DotNode> *skipNodes=0);
+ void removeChild(DotNode *n);
+ void removeParent(DotNode *n);
+ int findParent( DotNode *n );
+ void write(FTextStream &t,GraphType gt,GraphOutputFormat f,
+ bool topDown,bool toChildren,bool backArrows,bool reNumber);
+ int m_subgraphId;
+ void clearWriteFlag();
+ void writeXML(FTextStream &t,bool isClassGraph);
+ void writeDEF(FTextStream &t);
+ QCString label() const { return m_label; }
+ int number() const { return m_number; }
+ bool isVisible() const { return m_visible; }
+ TruncState isTruncated() const { return m_truncated; }
+ int distance() const { return m_distance; }
+
+ private:
+ void colorConnectedNodes(int curColor);
+ void writeBox(FTextStream &t,GraphType gt,GraphOutputFormat f,
+ bool hasNonReachableChildren, bool reNumber=FALSE);
+ void writeArrow(FTextStream &t,GraphType gt,GraphOutputFormat f,DotNode *cn,
+ EdgeInfo *ei,bool topDown, bool pointBack=TRUE, bool reNumber=FALSE);
+ void setDistance(int distance);
+ const DotNode *findDocNode() const; // only works for acyclic graphs!
+ void markAsVisible(bool b=TRUE) { m_visible=b; }
+ void markAsTruncated(bool b=TRUE) { m_truncated=b ? Truncated : Untruncated; }
+ int m_number;
+ QCString m_label; //!< label text
+ QCString m_tooltip; //!< node's tooltip
+ QCString m_url; //!< url of the node (format: remote$local)
+ QList<DotNode> *m_parents; //!< list of parent nodes (incoming arrows)
+ QList<DotNode> *m_children; //!< list of child nodes (outgoing arrows)
+ QList<EdgeInfo> *m_edgeInfo; //!< edge info for each child
+ bool m_deleted; //!< used to mark a node as deleted
+ bool m_written; //!< used to mark a node as written
+ bool m_hasDoc; //!< used to mark a node as documented
+ bool m_isRoot; //!< indicates if this is a root node
+ ClassDef * m_classDef; //!< class representing this node (can be 0)
+ bool m_visible; //!< is the node visible in the output
+ TruncState m_truncated; //!< does the node have non-visible children/parents
+ int m_distance; //!< shortest path to the root node
+
+ friend class DotGfxHierarchyTable;
+ friend class DotClassGraph;
+ friend class DotInclDepGraph;
+ friend class DotNodeList;
+ friend class DotCallGraph;
+ friend class DotGroupCollaboration;
+
+ friend QCString computeMd5Signature(
+ DotNode *root, GraphType gt,
+ GraphOutputFormat f,
+ bool lrRank, bool renderParents,
+ bool backArrows,
+ QCString &graphStr
+ );
+};
+
+inline int DotNode::findParent( DotNode *n )
+{
+ if( !m_parents )
+ return -1;
+ return m_parents->find(n);
+}
+
+/** @brief Represents a graphical class hierarchy */
+class DotGfxHierarchyTable
+{
+ public:
+ DotGfxHierarchyTable();
+ ~DotGfxHierarchyTable();
+ void writeGraph(FTextStream &t,const char *path, const char *fileName) const;
+
+ private:
+ void addHierarchy(DotNode *n,ClassDef *cd,bool hide);
+ void addClassList(ClassSDict *cl);
+
+ QList<DotNode> *m_rootNodes;
+ QDict<DotNode> *m_usedNodes;
+ static int m_curNodeNumber;
+ DotNodeList *m_rootSubgraphs;
+};
+
+/** @brief Representation of a class inheritance or dependency graph */
+class DotClassGraph
+{
+ public:
+ DotClassGraph(ClassDef *cd,DotNode::GraphType t);
+ ~DotClassGraph();
+ bool isTrivial() const;
+ bool isTooBig() const;
+ QCString writeGraph(FTextStream &t,GraphOutputFormat f,const char *path,
+ const char *fileName, const char *relPath,
+ bool TBRank=TRUE,bool imageMap=TRUE) const;
+
+ void writeXML(FTextStream &t);
+ void writeDEF(FTextStream &t);
+ QCString diskName() const;
+
+ private:
+ void buildGraph(ClassDef *cd,DotNode *n,bool base,int distance);
+ bool determineVisibleNodes(DotNode *rootNode,int maxNodes,bool includeParents);
+ void determineTruncatedNodes(QList<DotNode> &queue,bool includeParents);
+ void addClass(ClassDef *cd,DotNode *n,int prot,const char *label,
+ const char *usedName,const char *templSpec,
+ bool base,int distance);
+
+ DotNode * m_startNode;
+ QDict<DotNode> * m_usedNodes;
+ static int m_curNodeNumber;
+ DotNode::GraphType m_graphType;
+ QCString m_diskName;
+ bool m_lrRank;
+};
+
+/** @brief Representation of an include dependency graph */
+class DotInclDepGraph
+{
+ public:
+ DotInclDepGraph(FileDef *fd,bool inverse);
+ ~DotInclDepGraph();
+ QCString writeGraph(FTextStream &t, GraphOutputFormat f,
+ const char *path,const char *fileName,const char *relPath,
+ bool writeImageMap=TRUE) const;
+ bool isTrivial() const;
+ bool isTooBig() const;
+ QCString diskName() const;
+ void writeXML(FTextStream &t);
+
+ private:
+ void buildGraph(DotNode *n,FileDef *fd,int distance);
+ void determineVisibleNodes(QList<DotNode> &queue,int &maxNodes);
+ void determineTruncatedNodes(QList<DotNode> &queue);
+
+ DotNode *m_startNode;
+ QDict<DotNode> *m_usedNodes;
+ static int m_curNodeNumber;
+ QCString m_diskName;
+ int m_maxDistance;
+ bool m_inverse;
+};
+
+/** @brief Representation of an call graph */
+class DotCallGraph
+{
+ public:
+ DotCallGraph(MemberDef *md,bool inverse);
+ ~DotCallGraph();
+ QCString writeGraph(FTextStream &t, GraphOutputFormat f,
+ const char *path,const char *fileName,
+ const char *relPath,bool writeImageMap=TRUE) const;
+ void buildGraph(DotNode *n,MemberDef *md,int distance);
+ bool isTrivial() const;
+ bool isTooBig() const;
+ void determineVisibleNodes(QList<DotNode> &queue, int &maxNodes);
+ void determineTruncatedNodes(QList<DotNode> &queue);
+
+ private:
+ DotNode *m_startNode;
+ static int m_curNodeNumber;
+ QDict<DotNode> *m_usedNodes;
+ int m_maxDistance;
+ int m_recDepth;
+ bool m_inverse;
+ QCString m_diskName;
+ Definition * m_scope;
+};
+
+/** @brief Representation of an directory dependency graph */
+class DotDirDeps
+{
+ public:
+ DotDirDeps(DirDef *dir);
+ ~DotDirDeps();
+ bool isTrivial() const;
+ QCString writeGraph(FTextStream &out,
+ GraphOutputFormat format,
+ const char *path,
+ const char *fileName,
+ const char *relPath,
+ bool writeImageMap=TRUE) const;
+ private:
+ DirDef *m_dir;
+};
+
+/** @brief Representation of a group collaboration graph */
+class DotGroupCollaboration
+{
+ public :
+ enum EdgeType
+ { tmember = 0,
+ tclass,
+ tnamespace,
+ tfile,
+ tpages,
+ tdir,
+ thierarchy
+ };
+
+ class Link
+ {
+ public:
+ Link(const QCString lab,const QCString &u) : label(lab), url(u) {}
+ QCString label;
+ QCString url;
+ };
+
+ class Edge
+ {
+ public :
+ Edge(DotNode *start,DotNode *end,EdgeType type)
+ : pNStart(start), pNEnd(end), eType(type)
+ { links.setAutoDelete(TRUE); }
+
+ DotNode* pNStart;
+ DotNode* pNEnd;
+ EdgeType eType;
+
+ QList<Link> links;
+ void write( FTextStream &t ) const;
+ };
+
+ DotGroupCollaboration(GroupDef* gd);
+ ~DotGroupCollaboration();
+ QCString writeGraph(FTextStream &t, GraphOutputFormat format,
+ const char *path,const char *fileName,const char *relPath,
+ bool writeImageMap=TRUE) const;
+ void buildGraph(GroupDef* gd);
+ bool isTrivial() const;
+ private :
+ void addCollaborationMember( Definition* def, QCString& url, EdgeType eType );
+ void addMemberList( class MemberList* ml );
+ void writeGraphHeader(FTextStream &t) const;
+ Edge* addEdge( DotNode* _pNStart, DotNode* _pNEnd, EdgeType _eType,
+ const QCString& _label, const QCString& _url );
+
+ DotNode *m_rootNode;
+ int m_curNodeId;
+ QDict<DotNode> *m_usedNodes;
+ QCString m_diskName;
+ QList<Edge> m_edges;
+};
+
+/** @brief Helper class to run dot from doxygen.
+ */
+class DotRunner
+{
+ public:
+ struct CleanupItem
+ {
+ QCString path;
+ QCString file;
+ };
+
+ /** Creates a runner for a dot \a file. */
+ DotRunner(const QCString &file,const QCString &fontPath,bool checkResult,
+ const QCString &imageName = QCString());
+
+ /** Adds an additional job to the run.
+ * Performing multiple jobs one file can be faster.
+ */
+ void addJob(const char *format,const char *output);
+
+ void addPostProcessing(const char *cmd,const char *args);
+
+ void preventCleanUp() { m_cleanUp = FALSE; }
+
+ /** Runs dot for all jobs added. */
+ bool run();
+ CleanupItem cleanup() const { return m_cleanupItem; }
+
+ private:
+ QList<QCString> m_jobs;
+ QCString m_postArgs;
+ QCString m_postCmd;
+ QCString m_file;
+ QCString m_path;
+ bool m_checkResult;
+ QCString m_imageName;
+ bool m_cleanUp;
+ CleanupItem m_cleanupItem;
+};
+
+/** @brief Helper class to insert a set of map file into an output file */
+class DotFilePatcher
+{
+ public:
+ struct Map
+ {
+ QCString mapFile;
+ QCString relPath;
+ bool urlOnly;
+ QCString context;
+ QCString label;
+ };
+ DotFilePatcher(const char *patchFile);
+ int addMap(const QCString &mapFile,const QCString &relPath,
+ bool urlOnly,const QCString &context,const QCString &label);
+ int addFigure(const QCString &baseName,
+ const QCString &figureName,bool heightCheck);
+ int addSVGConversion(const QCString &relPath,bool urlOnly,const QCString &context);
+ int addSVGObject(const QCString &baseName, const QCString &figureName,
+ const QCString &relPath);
+ bool run();
+
+ private:
+ QList<Map> m_maps;
+ QCString m_patchFile;
+};
+
+class DotRunnerQueue
+{
+ public:
+ void enqueue(DotRunner *runner);
+ DotRunner *dequeue();
+ uint count() const;
+ private:
+ QWaitCondition m_bufferNotEmpty;
+ QQueue<DotRunner> m_queue;
+ mutable QMutex m_mutex;
+};
+
+class DotWorkerThread : public QThread
+{
+ public:
+ DotWorkerThread(int id,DotRunnerQueue *queue);
+ void run();
+ void cleanup();
+ private:
+ int m_id;
+ DotRunnerQueue *m_queue;
+ QList<DotRunner::CleanupItem> m_cleanupItems;
+};
+
+/** @brief singleton that manages dot relation actions */
+class DotManager
+{
+ public:
+ static DotManager *instance();
+ void addRun(DotRunner *run);
+ int addMap(const QCString &file,const QCString &mapFile,
+ const QCString &relPath,bool urlOnly,
+ const QCString &context,const QCString &label);
+ int addFigure(const QCString &file,const QCString &baseName,
+ const QCString &figureName,bool heightCheck);
+ int addSVGConversion(const QCString &file,const QCString &relPath,
+ bool urlOnly,const QCString &context);
+ int addSVGObject(const QCString &file,const QCString &baseName,
+ const QCString &figureNAme,const QCString &relPath);
+ bool run();
+
+ private:
+ DotManager();
+ virtual ~DotManager();
+ QList<DotRunner> m_dotRuns;
+ SDict<DotFilePatcher> m_dotMaps;
+ static DotManager *m_theInstance;
+ DotRunnerQueue *m_queue;
+ QList<DotWorkerThread> m_workers;
+};
+
+
+/** Generated a graphs legend page */
+void generateGraphLegend(const char *path);
+
+void writeDotGraphFromFile(const char *inFile,const char *outDir,
+ const char *outFile,GraphOutputFormat format);
+void writeDotImageMapFromFile(FTextStream &t,
+ const QCString& inFile, const QCString& outDir,
+ const QCString& relPath,const QCString& baseName,
+ const QCString& context);
+
+void writeDotDirDepGraph(FTextStream &t,DirDef *dd);
+
+#endif
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
new file mode 100644
index 0000000..2ad5bc5
--- /dev/null
+++ b/src/doxygen.cpp
@@ -0,0 +1,10772 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include <qfileinfo.h>
+#include <qfile.h>
+#include <qdir.h>
+#include <qdict.h>
+#include <qregexp.h>
+#include <qstrlist.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <qtextcodec.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "version.h"
+#include "doxygen.h"
+#include "scanner.h"
+#include "entry.h"
+#include "index.h"
+#include "logos.h"
+#include "instdox.h"
+#include "message.h"
+#include "config.h"
+#include "util.h"
+#include "pre.h"
+#include "tagreader.h"
+#include "dot.h"
+#include "msc.h"
+#include "docparser.h"
+#include "dirdef.h"
+#include "outputlist.h"
+#include "declinfo.h"
+#include "htmlgen.h"
+#include "latexgen.h"
+#include "mangen.h"
+#include "language.h"
+#include "debug.h"
+#include "htmlhelp.h"
+#include "qhp.h"
+#include "indexlog.h"
+#include "ftvhelp.h"
+#include "defargs.h"
+#include "rtfgen.h"
+#include "xmlgen.h"
+#include "defgen.h"
+#include "perlmodgen.h"
+#include "reflist.h"
+#include "pagedef.h"
+#include "bufstr.h"
+#include "commentcnv.h"
+#include "cmdmapper.h"
+#include "searchindex.h"
+#include "parserintf.h"
+#include "htags.h"
+#include "pyscanner.h"
+#include "fortranscanner.h"
+#include "dbusxmlscanner.h"
+#include "code.h"
+#include "objcache.h"
+#include "store.h"
+#include "marshal.h"
+#include "portable.h"
+#include "vhdlscanner.h"
+#include "vhdldocgen.h"
+#include "eclipsehelp.h"
+
+#include "layout.h"
+
+#define RECURSE_ENTRYTREE(func,var) \
+ do { if (var->children()) { \
+ EntryNavListIterator eli(*var->children()); \
+ for (;eli.current();++eli) func(eli.current()); \
+ } } while(0)
+
+
+#if !defined(_WIN32) || defined(__CYGWIN__)
+#include <signal.h>
+#define HAS_SIGNALS
+#endif
+
+// globally accessible variables
+ClassSDict *Doxygen::classSDict = 0;
+ClassSDict *Doxygen::hiddenClasses = 0;
+NamespaceSDict *Doxygen::namespaceSDict = 0;
+MemberNameSDict *Doxygen::memberNameSDict = 0;
+MemberNameSDict *Doxygen::functionNameSDict = 0;
+FileNameList *Doxygen::inputNameList = 0; // all input files
+FileNameDict *Doxygen::inputNameDict = 0;
+GroupSDict *Doxygen::groupSDict = 0;
+FormulaList Doxygen::formulaList; // all formulas
+FormulaDict Doxygen::formulaDict(1009); // all formulas
+FormulaDict Doxygen::formulaNameDict(1009); // the label name of all formulas
+PageSDict *Doxygen::pageSDict = 0;
+PageSDict *Doxygen::exampleSDict = 0;
+SectionDict Doxygen::sectionDict(257); // all page sections
+StringDict Doxygen::aliasDict(257); // aliases
+FileNameDict *Doxygen::includeNameDict = 0; // include names
+FileNameDict *Doxygen::exampleNameDict = 0; // examples
+FileNameDict *Doxygen::imageNameDict = 0; // images
+FileNameDict *Doxygen::dotFileNameDict = 0; // dot files
+FileNameDict *Doxygen::mscFileNameDict = 0; // dot files
+StringDict Doxygen::namespaceAliasDict(257); // all namespace aliases
+StringDict Doxygen::tagDestinationDict(257); // all tag locations
+QDict<void> Doxygen::expandAsDefinedDict(257); // all macros that should be expanded
+QIntDict<MemberGroupInfo> Doxygen::memGrpInfoDict(1009); // dictionary of the member groups heading
+PageDef *Doxygen::mainPage = 0;
+bool Doxygen::insideMainPage = FALSE; // are we generating docs for the main page?
+FTextStream Doxygen::tagFile;
+NamespaceDef *Doxygen::globalScope = 0;
+QDict<RefList> *Doxygen::xrefLists = new QDict<RefList>; // dictionary of cross-referenced item lists
+bool Doxygen::parseSourcesNeeded = FALSE;
+QTime Doxygen::runningTime;
+SearchIndex * Doxygen::searchIndex=0;
+QDict<DefinitionIntf> *Doxygen::symbolMap;
+bool Doxygen::outputToWizard=FALSE;
+QDict<int> * Doxygen::htmlDirMap = 0;
+QCache<LookupInfo> Doxygen::lookupCache(50000,50000);
+DirSDict *Doxygen::directories;
+SDict<DirRelation> Doxygen::dirRelations(257);
+ParserManager *Doxygen::parserManager = 0;
+QCString Doxygen::htmlFileExtension;
+bool Doxygen::suppressDocWarnings = FALSE;
+ObjCache *Doxygen::symbolCache = 0;
+Store *Doxygen::symbolStorage;
+QCString Doxygen::objDBFileName;
+QCString Doxygen::entryDBFileName;
+bool Doxygen::gatherDefines = TRUE;
+IndexList Doxygen::indexList;
+int Doxygen::subpageNestingLevel = 0;
+bool Doxygen::userComments = FALSE;
+QCString Doxygen::spaces;
+
+// locally accessible globals
+static QDict<EntryNav> g_classEntries(1009);
+static StringList g_inputFiles;
+static QDict<void> g_compoundKeywordDict(7); // keywords recognised as compounds
+static OutputList *g_outputList = 0; // list of output generating objects
+static QDict<FileDef> g_usingDeclarations(1009); // used classes
+static FileStorage *g_storage = 0;
+static bool g_successfulRun = FALSE;
+static bool g_dumpSymbolMap = FALSE;
+static bool g_dumpConfigAsXML = FALSE;
+
+
+
+void clearAll()
+{
+ g_inputFiles.clear();
+ //g_excludeNameDict.clear();
+ //delete g_outputList; g_outputList=0;
+
+ Doxygen::classSDict->clear();
+ Doxygen::namespaceSDict->clear();
+ Doxygen::pageSDict->clear();
+ Doxygen::exampleSDict->clear();
+ Doxygen::inputNameList->clear();
+ Doxygen::formulaList.clear();
+ Doxygen::sectionDict.clear();
+ Doxygen::inputNameDict->clear();
+ Doxygen::includeNameDict->clear();
+ Doxygen::exampleNameDict->clear();
+ Doxygen::imageNameDict->clear();
+ Doxygen::dotFileNameDict->clear();
+ Doxygen::mscFileNameDict->clear();
+ Doxygen::formulaDict.clear();
+ Doxygen::formulaNameDict.clear();
+ Doxygen::tagDestinationDict.clear();
+ delete Doxygen::mainPage; Doxygen::mainPage=0;
+}
+
+void statistics()
+{
+ fprintf(stderr,"--- inputNameDict stats ----\n");
+ Doxygen::inputNameDict->statistics();
+ fprintf(stderr,"--- includeNameDict stats ----\n");
+ Doxygen::includeNameDict->statistics();
+ fprintf(stderr,"--- exampleNameDict stats ----\n");
+ Doxygen::exampleNameDict->statistics();
+ fprintf(stderr,"--- imageNameDict stats ----\n");
+ Doxygen::imageNameDict->statistics();
+ fprintf(stderr,"--- dotFileNameDict stats ----\n");
+ Doxygen::dotFileNameDict->statistics();
+ fprintf(stderr,"--- mscFileNameDict stats ----\n");
+ Doxygen::mscFileNameDict->statistics();
+ //fprintf(stderr,"--- g_excludeNameDict stats ----\n");
+ //g_excludeNameDict.statistics();
+ fprintf(stderr,"--- aliasDict stats ----\n");
+ Doxygen::aliasDict.statistics();
+ fprintf(stderr,"--- typedefDict stats ----\n");
+ fprintf(stderr,"--- namespaceAliasDict stats ----\n");
+ Doxygen::namespaceAliasDict.statistics();
+ fprintf(stderr,"--- formulaDict stats ----\n");
+ Doxygen::formulaDict.statistics();
+ fprintf(stderr,"--- formulaNameDict stats ----\n");
+ Doxygen::formulaNameDict.statistics();
+ fprintf(stderr,"--- tagDestinationDict stats ----\n");
+ Doxygen::tagDestinationDict.statistics();
+ fprintf(stderr,"--- g_compoundKeywordDict stats ----\n");
+ g_compoundKeywordDict.statistics();
+ fprintf(stderr,"--- expandAsDefinedDict stats ----\n");
+ Doxygen::expandAsDefinedDict.statistics();
+ fprintf(stderr,"--- memGrpInfoDict stats ----\n");
+ Doxygen::memGrpInfoDict.statistics();
+}
+
+
+
+static void addMemberDocs(EntryNav *rootNav,MemberDef *md, const char *funcDecl,
+ ArgumentList *al,bool over_load,NamespaceSDict *nl=0);
+static void findMember(EntryNav *rootNav,
+ QCString funcDecl,
+ bool overloaded,
+ bool isFunc
+ );
+
+
+struct STLInfo
+{
+ const char *className;
+ const char *baseClass1;
+ const char *baseClass2;
+ const char *templType1;
+ const char *templName1;
+ const char *templType2;
+ const char *templName2;
+ bool virtualInheritance;
+ bool iterators;
+};
+
+static STLInfo g_stlinfo[] =
+{
+ // className baseClass1 baseClass2 templType1 templName1 templType2 templName2 virtInheritance // iterators
+ { "allocator", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "auto_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE },
+ { "ios_base", 0, 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "basic_ios", "ios_base", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_istream", "basic_ios<Char>", 0, "Char", 0, 0, 0, TRUE, FALSE },
+ { "basic_ostream", "basic_ios<Char>", 0, "Char", 0, 0, 0, TRUE, FALSE },
+ { "basic_iostream", "basic_istream<Char>", "basic_ostream<Char>", "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_ifstream", "basic_istream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_ofstream", "basic_ostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_fstream", "basic_iostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_istringstream", "basic_istream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_ostringstream", "basic_ostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "basic_stringstream", "basic_iostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
+ { "ios", "basic_ios<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wios", "basic_ios<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "istream", "basic_istream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wistream", "basic_istream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ostream", "basic_ostream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wostream", "basic_ostream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ifstream", "basic_ifstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wifstream", "basic_ifstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ofstream", "basic_ofstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wofstream", "basic_ofstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "fstream", "basic_fstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wfstream", "basic_fstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "istringstream", "basic_istringstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wistringstream", "basic_istringstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ostringstream", "basic_ostringstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wostringstream", "basic_ostringstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "stringstream", "basic_stringstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "wstringstream", "basic_stringstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "basic_string", 0, 0, "Char", 0, 0, 0, FALSE, TRUE },
+ { "string", "basic_string<char>", 0, 0, 0, 0, 0, FALSE, TRUE },
+ { "wstring", "basic_string<wchar_t>", 0, 0, 0, 0, 0, FALSE, TRUE },
+ { "complex", 0, 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bitset", 0, 0, "Bits", 0, 0, 0, FALSE, FALSE },
+ { "deque", 0, 0, "T", "elements", 0, 0, FALSE, TRUE },
+ { "list", 0, 0, "T", "elements", 0, 0, FALSE, TRUE },
+ { "map", 0, 0, "K", "keys", "T", "elements", FALSE, TRUE },
+ { "multimap", 0, 0, "K", "keys", "T", "elements", FALSE, TRUE },
+ { "set", 0, 0, "K", "keys", 0, 0, FALSE, TRUE },
+ { "multiset", 0, 0, "K", "keys", 0, 0, FALSE, TRUE },
+ { "vector", 0, 0, "T", "elements", 0, 0, FALSE, TRUE },
+ { "queue", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "priority_queue", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "stack", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "valarray", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
+ { "exception", 0, 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bad_alloc", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bad_cast", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bad_typeid", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "logic_error", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "ios_base::failure", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "runtime_error", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "bad_exception", "exception", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "domain_error", "logic_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "invalid_argument", "logic_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "length_error", "logic_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "out_of_range", "logic_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "range_error", "runtime_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "overflow_error", "runtime_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { "underflow_error", "runtime_error", 0, 0, 0, 0, 0, FALSE, FALSE },
+ { 0, 0, 0, 0, 0, 0, 0, FALSE, FALSE }
+};
+
+static void addSTLMember(EntryNav *rootNav,const char *type,const char *name)
+{
+ Entry *memEntry = new Entry;
+ memEntry->name = name;
+ memEntry->type = type;
+ memEntry->protection = Private;
+ memEntry->section = Entry::VARIABLE_SEC;
+ memEntry->brief = "STL member";
+ memEntry->hidden = FALSE;
+ memEntry->artificial = TRUE;
+ //memEntry->parent = root;
+ //root->addSubEntry(memEntry);
+ EntryNav *memEntryNav = new EntryNav(rootNav,memEntry);
+ memEntryNav->setEntry(memEntry);
+ rootNav->addChild(memEntryNav);
+}
+
+static void addSTLIterator(EntryNav *classEntryNav,const char *name)
+{
+ Entry *iteratorClassEntry = new Entry;
+ iteratorClassEntry->fileName = "[STL]";
+ iteratorClassEntry->startLine = 1;
+ iteratorClassEntry->name = name;
+ iteratorClassEntry->section = Entry::CLASS_SEC;
+ iteratorClassEntry->brief = "STL iterator class";
+ iteratorClassEntry->hidden = FALSE;
+ iteratorClassEntry->artificial= TRUE;
+ EntryNav *iteratorClassEntryNav = new EntryNav(classEntryNav,iteratorClassEntry);
+ iteratorClassEntryNav->setEntry(iteratorClassEntry);
+ classEntryNav->addChild(iteratorClassEntryNav);
+}
+
+
+static void addSTLClasses(EntryNav *rootNav)
+{
+ Entry *namespaceEntry = new Entry;
+ namespaceEntry->fileName = "[STL]";
+ namespaceEntry->startLine = 1;
+ //namespaceEntry->parent = rootNav->entry();
+ namespaceEntry->name = "std";
+ namespaceEntry->section = Entry::NAMESPACE_SEC;
+ namespaceEntry->brief = "STL namespace";
+ namespaceEntry->hidden = FALSE;
+ namespaceEntry->artificial= TRUE;
+ //root->addSubEntry(namespaceEntry);
+ EntryNav *namespaceEntryNav = new EntryNav(rootNav,namespaceEntry);
+ namespaceEntryNav->setEntry(namespaceEntry);
+ rootNav->addChild(namespaceEntryNav);
+
+ STLInfo *info = g_stlinfo;
+ while (info->className)
+ {
+ //printf("Adding STL class %s\n",info->className);
+ QCString fullName = info->className;
+ fullName.prepend("std::");
+
+ // add fake Entry for the class
+ Entry *classEntry = new Entry;
+ classEntry->fileName = "[STL]";
+ classEntry->startLine = 1;
+ classEntry->name = fullName;
+ //classEntry->parent = namespaceEntry;
+ classEntry->section = Entry::CLASS_SEC;
+ classEntry->brief = "STL class";
+ classEntry->hidden = FALSE;
+ classEntry->artificial= TRUE;
+ //namespaceEntry->addSubEntry(classEntry);
+ EntryNav *classEntryNav = new EntryNav(namespaceEntryNav,classEntry);
+ classEntryNav->setEntry(classEntry);
+ namespaceEntryNav->addChild(classEntryNav);
+
+ // add template arguments to class
+ if (info->templType1)
+ {
+ ArgumentList *al = new ArgumentList;
+ Argument *a=new Argument;
+ a->type="typename";
+ a->name=info->templType1;
+ al->append(a);
+ if (info->templType2) // another template argument
+ {
+ a=new Argument;
+ a->type="typename";
+ a->name=info->templType2;
+ al->append(a);
+ }
+ classEntry->tArgLists = new QList<ArgumentList>;
+ classEntry->tArgLists->setAutoDelete(TRUE);
+ classEntry->tArgLists->append(al);
+ }
+ // add member variables
+ if (info->templName1)
+ {
+ addSTLMember(classEntryNav,info->templType1,info->templName1);
+ }
+ if (info->templName2)
+ {
+ addSTLMember(classEntryNav,info->templType2,info->templName2);
+ }
+ if (info->baseClass1)
+ {
+ classEntry->extends->append(new BaseInfo(info->baseClass1,Public,info->virtualInheritance?Virtual:Normal));
+ }
+ if (info->baseClass2)
+ {
+ classEntry->extends->append(new BaseInfo(info->baseClass2,Public,info->virtualInheritance?Virtual:Normal));
+ }
+ if (info->iterators)
+ {
+ // add iterator class
+ addSTLIterator(classEntryNav,fullName+"::iterator");
+ addSTLIterator(classEntryNav,fullName+"::const_iterator");
+ addSTLIterator(classEntryNav,fullName+"::reverse_iterator");
+ addSTLIterator(classEntryNav,fullName+"::const_reverse_iterator");
+ }
+ info++;
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n,
+ FileDef *fileScope=0);
+
+static void addPageToContext(PageDef *pd,EntryNav *rootNav)
+{
+ if (rootNav->parent()) // add the page to it's scope
+ {
+ QCString scope = rootNav->parent()->name();
+ if (rootNav->parent()->section()==Entry::PACKAGEDOC_SEC)
+ {
+ scope=substitute(scope,".","::");
+ }
+ scope = stripAnonymousNamespaceScope(scope);
+ scope+="::"+pd->name();
+ Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope);
+ if (d)
+ {
+ pd->setPageScope(d);
+ }
+ }
+}
+
+static void addRelatedPage(EntryNav *rootNav)
+{
+ Entry *root = rootNav->entry();
+ GroupDef *gd=0;
+ QListIterator<Grouping> gli(*root->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname))) break;
+ }
+ //printf("---> addRelatedPage() %s gd=%p\n",root->name.data(),gd);
+ QCString doc;
+ if (root->brief.isEmpty())
+ {
+ doc=root->doc+root->inbodyDocs;
+ }
+ else
+ {
+ doc=root->brief+"\n\n"+root->doc+root->inbodyDocs;
+ }
+ PageDef *pd = addRelatedPage(root->name,root->args,doc,root->anchors,
+ root->fileName,root->startLine,
+ root->sli,
+ gd,rootNav->tagInfo()
+ );
+ if (pd)
+ {
+ pd->addSectionsToDefinition(root->anchors);
+ addPageToContext(pd,rootNav);
+ }
+}
+
+static void buildGroupListFiltered(EntryNav *rootNav,bool additional, bool includeExternal)
+{
+ if (rootNav->section()==Entry::GROUPDOC_SEC && !rootNav->name().isEmpty() &&
+ ((!includeExternal && rootNav->tagInfo()==0) ||
+ ( includeExternal && rootNav->tagInfo()!=0))
+ )
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ if ((root->groupDocType==Entry::GROUPDOC_NORMAL && !additional) ||
+ (root->groupDocType!=Entry::GROUPDOC_NORMAL && additional))
+ {
+ GroupDef *gd = Doxygen::groupSDict->find(root->name);
+ //printf("Processing group '%s': add=%d ext=%d gd=%p\n",
+ // root->type.data(),additional,includeExternal,gd);
+
+ if (gd)
+ {
+ if ( !gd->hasGroupTitle() )
+ {
+ gd->setGroupTitle( root->type );
+ }
+ else if ( root->type.length() > 0 && root->name != root->type && gd->groupTitle() != root->type )
+ {
+ warn( root->fileName,root->startLine,
+ "group %s: ignoring title \"%s\" that does not match old title \"%s\"\n",
+ qPrint(root->name), qPrint(root->type), qPrint(gd->groupTitle()) );
+ }
+ gd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ gd->setDocumentation( root->doc, root->docFile, root->docLine );
+ gd->setInbodyDocumentation( root->inbodyDocs, root->inbodyFile, root->inbodyLine );
+ gd->addSectionsToDefinition(root->anchors);
+ gd->setRefItems(root->sli);
+ }
+ else
+ {
+ if (rootNav->tagInfo())
+ {
+ gd = new GroupDef(root->fileName,root->startLine,root->name,root->type,rootNav->tagInfo()->fileName);
+ gd->setReference(rootNav->tagInfo()->tagName);
+ }
+ else
+ {
+ gd = new GroupDef(root->fileName,root->startLine,root->name,root->type);
+ }
+ gd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ gd->setDocumentation(root->doc,root->docFile,root->docLine);
+ gd->setInbodyDocumentation( root->inbodyDocs, root->inbodyFile, root->inbodyLine );
+ gd->addSectionsToDefinition(root->anchors);
+ Doxygen::groupSDict->append(root->name,gd);
+ gd->setRefItems(root->sli);
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ EntryNav *e;
+ for (;(e=eli.current());++eli)
+ {
+ buildGroupListFiltered(e,additional,includeExternal);
+ }
+ }
+}
+
+static void buildGroupList(EntryNav *rootNav)
+{
+ // --- first process only local groups
+ // first process the @defgroups blocks
+ buildGroupListFiltered(rootNav,FALSE,FALSE);
+ // then process the @addtogroup, @weakgroup blocks
+ buildGroupListFiltered(rootNav,TRUE,FALSE);
+
+ // --- then also process external groups
+ // first process the @defgroups blocks
+ buildGroupListFiltered(rootNav,FALSE,TRUE);
+ // then process the @addtogroup, @weakgroup blocks
+ buildGroupListFiltered(rootNav,TRUE,TRUE);
+}
+
+static void findGroupScope(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::GROUPDOC_SEC && !rootNav->name().isEmpty() &&
+ rootNav->parent() && !rootNav->parent()->name().isEmpty())
+ {
+ GroupDef *gd;
+ if ((gd=Doxygen::groupSDict->find(rootNav->name())))
+ {
+ QCString scope = rootNav->parent()->name();
+ if (rootNav->parent()->section()==Entry::PACKAGEDOC_SEC)
+ {
+ scope=substitute(scope,".","::");
+ }
+ scope = stripAnonymousNamespaceScope(scope);
+ scope+="::"+gd->name();
+ Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope);
+ if (d)
+ {
+ gd->setGroupScope(d);
+ }
+ }
+ }
+ RECURSE_ENTRYTREE(findGroupScope,rootNav);
+}
+
+static void organizeSubGroupsFiltered(EntryNav *rootNav,bool additional)
+{
+ if (rootNav->section()==Entry::GROUPDOC_SEC && !rootNav->name().isEmpty())
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ if ((root->groupDocType==Entry::GROUPDOC_NORMAL && !additional) ||
+ (root->groupDocType!=Entry::GROUPDOC_NORMAL && additional))
+ {
+ GroupDef *gd;
+ if ((gd=Doxygen::groupSDict->find(root->name)))
+ {
+ //printf("adding %s to group %s\n",root->name.data(),gd->name().data());
+ addGroupToGroups(root,gd);
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ EntryNav *e;
+ for (;(e=eli.current());++eli)
+ {
+ organizeSubGroupsFiltered(e,additional);
+ }
+ }
+}
+
+static void organizeSubGroups(EntryNav *rootNav)
+{
+ //printf("Defining groups\n");
+ // first process the @defgroups blocks
+ organizeSubGroupsFiltered(rootNav,FALSE);
+ //printf("Additional groups\n");
+ // then process the @addtogroup, @weakgroup blocks
+ organizeSubGroupsFiltered(rootNav,TRUE);
+}
+
+//----------------------------------------------------------------------
+
+static void buildFileList(EntryNav *rootNav)
+{
+ if (((rootNav->section()==Entry::FILEDOC_SEC) ||
+ ((rootNav->section() & Entry::FILE_MASK) && Config_getBool("EXTRACT_ALL"))) &&
+ !rootNav->name().isEmpty() && !rootNav->tagInfo() // skip any file coming from tag files
+ )
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ bool ambig;
+ FileDef *fd=findFileDef(Doxygen::inputNameDict,root->name,ambig);
+ //printf("**************** root->name=%s fd=%p\n",root->name.data(),fd);
+ if (fd && !ambig)
+ {
+#if 0
+ if ((!root->doc.isEmpty() && !fd->documentation().isEmpty()) ||
+ (!root->brief.isEmpty() && !fd->briefDescription().isEmpty()))
+ {
+ warn(
+ root->fileName,root->startLine,
+ "warning: file %s already documented. "
+ "Skipping documentation.",
+ root->name.data()
+ );
+ }
+ else
+#endif
+ {
+ //printf("Adding documentation!\n");
+ // using FALSE in setDocumentation is small hack to make sure a file
+ // is documented even if a \file command is used without further
+ // documentation
+ fd->setDocumentation(root->doc,root->docFile,root->docLine,FALSE);
+ fd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ fd->addSectionsToDefinition(root->anchors);
+ fd->setRefItems(root->sli);
+ QListIterator<Grouping> gli(*root->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ GroupDef *gd=0;
+ if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
+ {
+ gd->addFile(fd);
+ fd->makePartOfGroup(gd);
+ //printf("File %s: in group %s\n",fd->name().data(),s->data());
+ }
+ }
+ }
+ }
+ else
+ {
+ const char *fn = root->fileName.data();
+ QCString text;
+ text.sprintf("warning: the name `%s' supplied as "
+ "the second argument in the \\file statement ",
+ qPrint(root->name)
+ );
+ if (ambig) // name is ambiguous
+ {
+ text+="matches the following input files:\n";
+ text+=showFileDefMatches(Doxygen::inputNameDict,root->name);
+ text+="Please use a more specific name by "
+ "including a (larger) part of the path!";
+ }
+ else // name is not an input file
+ {
+ text+="is not an input file";
+ }
+ warn(fn,root->startLine,text);
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(buildFileList,rootNav);
+}
+
+static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
+{
+ if (
+ (!root->doc.stripWhiteSpace().isEmpty() ||
+ !root->brief.stripWhiteSpace().isEmpty() ||
+ Config_getBool("EXTRACT_ALL")
+ ) && root->protection!=Private
+ )
+ {
+ //printf(">>>>>> includeFile=%s\n",root->includeFile.data());
+
+ bool local=Config_getBool("FORCE_LOCAL_INCLUDES");
+ QCString includeFile = root->includeFile;
+ if (!includeFile.isEmpty() && includeFile.at(0)=='"')
+ {
+ local = TRUE;
+ includeFile=includeFile.mid(1,includeFile.length()-2);
+ }
+ else if (!includeFile.isEmpty() && includeFile.at(0)=='<')
+ {
+ local = FALSE;
+ includeFile=includeFile.mid(1,includeFile.length()-2);
+ }
+
+ bool ambig;
+ FileDef *fd=0;
+ // see if we need to include a verbatim copy of the header file
+ //printf("root->includeFile=%s\n",root->includeFile.data());
+ if (!includeFile.isEmpty() &&
+ (fd=findFileDef(Doxygen::inputNameDict,includeFile,ambig))==0
+ )
+ { // explicit request
+ QCString text;
+ text.sprintf("warning: the name `%s' supplied as "
+ "the argument of the \\class, \\struct, \\union, or \\include command ",
+ qPrint(includeFile)
+ );
+ if (ambig) // name is ambiguous
+ {
+ text+="matches the following input files:\n";
+ text+=showFileDefMatches(Doxygen::inputNameDict,root->includeFile);
+ text+="Please use a more specific name by "
+ "including a (larger) part of the path!";
+ }
+ else // name is not an input file
+ {
+ text+="is not an input file";
+ }
+ warn(root->fileName,root->startLine,text);
+ }
+ else if (includeFile.isEmpty() && ifd &&
+ // see if the file extension makes sense
+ guessSection(ifd->name())==Entry::HEADER_SEC)
+ { // implicit assumption
+ fd=ifd;
+ }
+
+ // if a file is found, we mark it as a source file.
+ if (fd)
+ {
+ QCString iName = !root->includeName.isEmpty() ?
+ root->includeName : includeFile;
+ if (!iName.isEmpty()) // user specified include file
+ {
+ if (iName.at(0)=='<') local=FALSE; // explicit override
+ if (iName.at(0)=='"' || iName.at(0)=='<')
+ {
+ iName=iName.mid(1,iName.length()-2); // strip quotes or brackets
+ }
+ if (iName.isEmpty())
+ {
+ iName=fd->name();
+ }
+ }
+ else if (!Config_getList("STRIP_FROM_INC_PATH").isEmpty())
+ {
+ iName=stripFromIncludePath(fd->absFilePath());
+ }
+ else // use name of the file containing the class definition
+ {
+ iName=fd->name();
+ }
+ if (fd->generateSourceFile()) // generate code for header
+ {
+ cd->setIncludeFile(fd,iName,local,!root->includeName.isEmpty());
+ }
+ else // put #include in the class documentation without link
+ {
+ cd->setIncludeFile(0,iName,local,TRUE);
+ }
+ }
+ }
+}
+
+#if 0
+static bool addNamespace(Entry *root,ClassDef *cd)
+{
+ // see if this class is defined inside a namespace
+ if (root->section & Entry::COMPOUND_MASK)
+ {
+ Entry *e = root->parent;
+ while (e)
+ {
+ if (e->section==Entry::NAMESPACE_SEC)
+ {
+ NamespaceDef *nd=0;
+ QCString nsName = stripAnonymousNamespaceScope(e->name);
+ //printf("addNameSpace() trying: %s\n",nsName.data());
+ if (!nsName.isEmpty() && nsName.at(0)!='@' &&
+ (nd=getResolvedNamespace(nsName))
+ )
+ {
+ cd->setNamespace(nd);
+ cd->setOuterScope(nd);
+ nd->insertClass(cd);
+ return TRUE;
+ }
+ }
+ e=e->parent;
+ }
+ }
+ return FALSE;
+}
+#endif
+
+#if 0
+static Definition *findScope(Entry *root,int level=0)
+{
+ if (root==0) return 0;
+ //printf("start findScope name=%s\n",root->name.data());
+ Definition *result=0;
+ if (root->section&Entry::SCOPE_MASK)
+ {
+ result = findScope(root->parent,level+1); // traverse to the root of the tree
+ if (result)
+ {
+ //printf("Found %s inside %s at level %d\n",root->name.data(),result->name().data(),level);
+ // TODO: look at template arguments
+ result = result->findInnerCompound(root->name);
+ }
+ else // reached the global scope
+ {
+ // TODO: look at template arguments
+ result = Doxygen::globalScope->findInnerCompound(root->name);
+ //printf("Found in globalScope %s at level %d\n",result->name().data(),level);
+ }
+ }
+ //printf("end findScope(%s,%d)=%s\n",root->name.data(),
+ // level,result==0 ? "<none>" : result->name().data());
+ return result;
+}
+#endif
+
+/*! returns the Definition object belonging to the first \a level levels of
+ * full qualified name \a name. Creates an artificial scope if the scope is
+ * not found and set the parent/child scope relation if the scope is found.
+ */
+static Definition *buildScopeFromQualifiedName(const QCString name,int level)
+{
+ int i=0;
+ int p=0,l;
+ Definition *prevScope=Doxygen::globalScope;
+ QCString fullScope;
+ while (i<level)
+ {
+ int idx=getScopeFragment(name,p,&l);
+ QCString nsName = name.mid(idx,l);
+ if (nsName.isEmpty()) return prevScope;
+ if (!fullScope.isEmpty()) fullScope+="::";
+ fullScope+=nsName;
+ NamespaceDef *nd=Doxygen::namespaceSDict->find(fullScope);
+ Definition *innerScope = nd;
+ ClassDef *cd=0;
+ if (nd==0) cd = getClass(fullScope);
+ if (nd==0 && cd) // scope is a class
+ {
+ innerScope = cd;
+ }
+ else if (nd==0 && cd==0) // scope is not known!
+ {
+ // introduce bogus namespace
+ //printf("++ adding dummy namespace %s to %s\n",nsName.data(),prevScope->name().data());
+ nd=new NamespaceDef(
+ "[generated]",1,fullScope);
+
+ // add namespace to the list
+ Doxygen::namespaceSDict->inSort(fullScope,nd);
+ innerScope = nd;
+ }
+ else // scope is a namespace
+ {
+ }
+ // make the parent/child scope relation
+ prevScope->addInnerCompound(innerScope);
+ innerScope->setOuterScope(prevScope);
+ // proceed to the next scope fragment
+ p=idx+l+2;
+ prevScope=innerScope;
+ i++;
+ }
+ return prevScope;
+}
+
+static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n,
+ FileDef *fileScope)
+{
+ //printf("<findScopeFromQualifiedName(%s,%s)\n",startScope ? startScope->name().data() : 0, n.data());
+ Definition *resultScope=startScope;
+ if (resultScope==0) resultScope=Doxygen::globalScope;
+ QCString scope=stripTemplateSpecifiersFromScope(n,FALSE);
+ int l1=0,i1;
+ i1=getScopeFragment(scope,0,&l1);
+ if (i1==-1)
+ {
+ //printf(">no fragments!\n");
+ return resultScope;
+ }
+ int p=i1+l1,l2=0,i2;
+ while ((i2=getScopeFragment(scope,p,&l2))!=-1)
+ {
+ QCString nestedNameSpecifier = scope.mid(i1,l1);
+ Definition *orgScope = resultScope;
+ //printf(" nestedNameSpecifier=%s\n",nestedNameSpecifier.data());
+ resultScope = resultScope->findInnerCompound(nestedNameSpecifier);
+ //printf(" resultScope=%p\n",resultScope);
+ if (resultScope==0)
+ {
+ NamespaceSDict *usedNamespaces;
+ if (orgScope==Doxygen::globalScope && fileScope &&
+ (usedNamespaces = fileScope->getUsedNamespaces()))
+ // also search for used namespaces
+ {
+ NamespaceSDict::Iterator ni(*usedNamespaces);
+ NamespaceDef *nd;
+ for (ni.toFirst();((nd=ni.current()) && resultScope==0);++ni)
+ {
+ // restart search within the used namespace
+ resultScope = findScopeFromQualifiedName(nd,n,fileScope);
+ }
+ if (resultScope)
+ {
+ // for a nested class A::I in used namespace N, we get
+ // N::A::I while looking for A, so we should compare
+ // resultScope->name() against scope.left(i2+l2)
+ //printf(" -> result=%s scope=%s\n",resultScope->name().data(),scope.data());
+ if (rightScopeMatch(resultScope->name(),scope.left(i2+l2)))
+ {
+ break;
+ }
+ goto nextFragment;
+ }
+ }
+
+ // also search for used classes. Complication: we haven't been able
+ // to put them in the right scope yet, because we are still resolving
+ // the scope relations!
+ // Therefore loop through all used classes and see if there is a right
+ // scope match between the used class and nestedNameSpecifier.
+ QDictIterator<FileDef> ui(g_usingDeclarations);
+ FileDef *usedFd;
+ for (ui.toFirst();(usedFd=ui.current());++ui)
+ {
+ //printf("Checking using class %s\n",ui.currentKey());
+ if (rightScopeMatch(ui.currentKey(),nestedNameSpecifier))
+ {
+ // ui.currentKey() is the fully qualified name of nestedNameSpecifier
+ // so use this instead.
+ QCString fqn = QCString(ui.currentKey())+
+ scope.right(scope.length()-p);
+ resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"));
+ //printf("Creating scope from fqn=%s result %p\n",fqn.data(),resultScope);
+ if (resultScope)
+ {
+ //printf("> Match! resultScope=%s\n",resultScope->name().data());
+ return resultScope;
+ }
+ }
+ }
+
+ //printf("> name %s not found in scope %s\n",nestedNameSpecifier.data(),orgScope->name().data());
+ return 0;
+ }
+ nextFragment:
+ i1=i2;
+ l1=l2;
+ p=i2+l2;
+ }
+ //printf(">findScopeFromQualifiedName scope %s\n",resultScope->name().data());
+ return resultScope;
+}
+
+ArgumentList *getTemplateArgumentsFromName(
+ const QCString &name,
+ const QList<ArgumentList> *tArgLists)
+{
+ if (tArgLists==0) return 0;
+
+ QListIterator<ArgumentList> ali(*tArgLists);
+ // for each scope fragment, check if it is a template and advance through
+ // the list if so.
+ int i,p=0;
+ while ((i=name.find("::",p))!=-1)
+ {
+ NamespaceDef *nd = Doxygen::namespaceSDict->find(name.left(i));
+ if (nd==0)
+ {
+ ClassDef *cd = getClass(name.left(i));
+ if (cd)
+ {
+ if (cd->templateArguments())
+ {
+ ++ali;
+ }
+ }
+ }
+ p=i+2;
+ }
+ return ali.current();
+}
+
+static ClassDef::CompoundType convertToCompoundType(int section,int specifier)
+{
+ ClassDef::CompoundType sec=ClassDef::Class;
+ if (specifier&Entry::Struct)
+ sec=ClassDef::Struct;
+ else if (specifier&Entry::Union)
+ sec=ClassDef::Union;
+ else if (specifier&Entry::Interface)
+ sec=ClassDef::Interface;
+ else if (specifier&Entry::Protocol)
+ sec=ClassDef::Protocol;
+ else if (specifier&Entry::Category)
+ sec=ClassDef::Category;
+ else if (specifier&Entry::Exception)
+ sec=ClassDef::Exception;
+
+ switch(section)
+ {
+ //case Entry::UNION_SEC:
+ case Entry::UNIONDOC_SEC:
+ sec=ClassDef::Union;
+ break;
+ //case Entry::STRUCT_SEC:
+ case Entry::STRUCTDOC_SEC:
+ sec=ClassDef::Struct;
+ break;
+ //case Entry::INTERFACE_SEC:
+ case Entry::INTERFACEDOC_SEC:
+ sec=ClassDef::Interface;
+ break;
+ //case Entry::PROTOCOL_SEC:
+ case Entry::PROTOCOLDOC_SEC:
+ sec=ClassDef::Protocol;
+ break;
+ //case Entry::CATEGORY_SEC:
+ case Entry::CATEGORYDOC_SEC:
+ sec=ClassDef::Category;
+ break;
+ //case Entry::EXCEPTION_SEC:
+ case Entry::EXCEPTIONDOC_SEC:
+ sec=ClassDef::Exception;
+ break;
+ }
+ return sec;
+}
+
+
+static void addClassToContext(EntryNav *rootNav)
+{
+ //printf("Loading entry for rootNav=%p name=%s\n",rootNav,rootNav->name().data());
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ //NamespaceDef *nd = 0;
+ FileDef *fd = rootNav->fileDef();
+
+ QCString scName;
+ if (rootNav->parent()->section()&Entry::SCOPE_MASK)
+ {
+ scName=rootNav->parent()->name();
+ }
+ // name without parent's scope
+ QCString fullName = root->name;
+
+ // strip off any template parameters (but not those for specializations)
+ fullName=stripTemplateSpecifiersFromScope(fullName);
+
+ // name with scope (if not present already)
+ QCString qualifiedName = fullName;
+ if (!scName.isEmpty() && !leftScopeMatch(fullName,scName))
+ {
+ qualifiedName.prepend(scName+"::");
+ }
+
+ // see if we already found the class before
+ ClassDef *cd = getClass(qualifiedName);
+
+ Debug::print(Debug::Classes,0, " Found class with name %s (qualifiedName=%s -> cd=%p)\n",
+ cd ? cd->name().data() : root->name.data(), qualifiedName.data(),cd);
+
+ if (cd)
+ {
+ fullName=cd->name();
+ Debug::print(Debug::Classes,0," Existing class %s!\n",cd->name().data());
+ //if (cd->templateArguments()==0)
+ //{
+ // //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data());
+ // cd->setTemplateArguments(tArgList);
+ //}
+
+ cd->setDocumentation(root->doc,root->docFile,root->docLine);
+ cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+
+ if (root->bodyLine!=-1 && cd->getStartBodyLine()==-1)
+ {
+ cd->setBodySegment(root->bodyLine,root->endBodyLine);
+ cd->setBodyDef(fd);
+ }
+ //cd->setName(fullName); // change name to match docs
+
+ if (cd->templateArguments()==0)
+ {
+ // this happens if a template class declared with @class is found
+ // before the actual definition.
+ ArgumentList *tArgList =
+ getTemplateArgumentsFromName(cd->name(),root->tArgLists);
+ cd->setTemplateArguments(tArgList);
+ }
+
+ cd->setCompoundType(convertToCompoundType(root->section,root->spec));
+ }
+ else // new class
+ {
+ ClassDef::CompoundType sec = convertToCompoundType(root->section,root->spec);
+
+ QCString className;
+ QCString namespaceName;
+ extractNamespaceName(fullName,className,namespaceName);
+
+ //printf("New class: fullname %s namespace `%s' name=`%s' brief=`%s' docs=`%s'\n",
+ // fullName.data(),namespaceName.data(),className.data(),root->brief.data(),root->doc.data());
+
+ QCString tagName;
+ QCString refFileName;
+ if (rootNav->tagInfo())
+ {
+ tagName = rootNav->tagInfo()->tagName;
+ refFileName = rootNav->tagInfo()->fileName;
+ }
+ cd=new ClassDef(root->fileName,root->startLine,fullName,sec,
+ tagName,refFileName);
+ Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n",
+ fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
+ cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
+ cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ cd->setLanguage(root->lang);
+ cd->setHidden(root->hidden);
+ cd->setArtificial(root->artificial);
+ cd->setTypeConstraints(root->typeConstr);
+ //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data());
+
+ ArgumentList *tArgList =
+ getTemplateArgumentsFromName(fullName,root->tArgLists);
+ //printf("class %s template args=%s\n",fullName.data(),
+ // tArgList ? tempArgListToString(tArgList).data() : "<none>");
+ cd->setTemplateArguments(tArgList);
+ cd->setProtection(root->protection);
+ cd->setIsStatic(root->stat);
+
+ // file definition containing the class cd
+ cd->setBodySegment(root->bodyLine,root->endBodyLine);
+ cd->setBodyDef(fd);
+
+ // see if the class is found inside a namespace
+ //bool found=addNamespace(root,cd);
+
+
+ // the empty string test is needed for extract all case
+ cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ cd->insertUsedFile(root->fileName);
+
+ // add class to the list
+ //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data());
+ Doxygen::classSDict->append(fullName,cd);
+
+ }
+
+ cd->addSectionsToDefinition(root->anchors);
+ if (!root->subGrouping) cd->setSubGrouping(FALSE);
+ if (cd->hasDocumentation())
+ {
+ addIncludeFile(cd,fd,root);
+ }
+ if (fd && (root->section & Entry::COMPOUND_MASK))
+ {
+ //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n",
+ // cd->name().data(),
+ // fd->name().data(),
+ // root->fileName.data()
+ // );
+ cd->setFileDef(fd);
+ fd->insertClass(cd);
+ }
+ addClassToGroups(root,cd);
+ cd->setRefItems(root->sli);
+
+ rootNav->releaseEntry();
+}
+
+//----------------------------------------------------------------------
+// build a list of all classes mentioned in the documentation
+// and all classes that have a documentation block before their definition.
+static void buildClassList(EntryNav *rootNav)
+{
+ if (
+ ((rootNav->section() & Entry::COMPOUND_MASK) ||
+ rootNav->section()==Entry::OBJCIMPL_SEC) && !rootNav->name().isEmpty()
+ )
+ {
+ addClassToContext(rootNav);
+ }
+ RECURSE_ENTRYTREE(buildClassList,rootNav);
+}
+
+static void buildClassDocList(EntryNav *rootNav)
+{
+ if (
+ (rootNav->section() & Entry::COMPOUNDDOC_MASK) && !rootNav->name().isEmpty()
+ )
+ {
+ addClassToContext(rootNav);
+ }
+ RECURSE_ENTRYTREE(buildClassDocList,rootNav);
+}
+
+static void resolveClassNestingRelations()
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE;
+
+ bool done=FALSE;
+ int iteration=0;
+ while (!done)
+ {
+ done=TRUE;
+ ++iteration;
+ ClassDef *cd=0;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (!cd->visited)
+ {
+ QCString name = stripAnonymousNamespaceScope(cd->name());
+ //printf("processing=%s, iteration=%d\n",cd->name().data(),iteration);
+ // also add class to the correct structural context
+ Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,
+ name,cd->getFileDef());
+ if (d)
+ {
+ //printf("****** adding %s to scope %s in iteration %d\n",cd->name().data(),d->name().data(),iteration);
+ d->addInnerCompound(cd);
+ cd->setOuterScope(d);
+ cd->visited=TRUE;
+ done=FALSE;
+ }
+ //else
+ //{
+ // printf("****** ignoring %s: scope not (yet) found in iteration %d\n",cd->name().data(),iteration);
+ //}
+ }
+ }
+ }
+
+ //give warnings for unresolved compounds
+ ClassDef *cd=0;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (!cd->visited)
+ {
+ QCString name = stripAnonymousNamespaceScope(cd->name());
+ //printf("processing unresolved=%s, iteration=%d\n",cd->name().data(),iteration);
+ /// create the scope artificially
+ // anyway, so we can at least relate scopes properly.
+ Definition *d = buildScopeFromQualifiedName(name,name.contains("::"));
+ if (d!=cd && !cd->getDefFileName().isEmpty())
+ // avoid recursion in case of redundant scopes, i.e: namespace N { class N::C {}; }
+ // for this case doxygen assumes the exitance of a namespace N::N in which C is to be found!
+ // also avoid warning for stuff imported via a tagfile.
+ {
+ d->addInnerCompound(cd);
+ cd->setOuterScope(d);
+ warn(cd->getDefFileName(),cd->getDefLine(),
+ "warning: Internal inconsistency: scope for class %s not "
+ "found!",name.data()
+ );
+ }
+ }
+ }
+}
+
+void distributeClassGroupRelations()
+{
+ static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ if (!inlineGroupedClasses) return;
+ //printf("** distributeClassGroupRelations()\n");
+
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE;
+
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ //printf("Checking %s\n",cd->name().data());
+ // distribute the group to nested classes as well
+ if (!cd->visited && cd->partOfGroups()!=0 && cd->getInnerClasses())
+ {
+ //printf(" Candidate for merging\n");
+ ClassSDict::Iterator ncli(*cd->getInnerClasses());
+ ClassDef *ncd;
+ GroupDef *gd = cd->partOfGroups()->at(0);
+ for (ncli.toFirst();(ncd=ncli.current());++ncli)
+ {
+ if (ncd->partOfGroups()==0)
+ {
+ //printf(" Adding %s to group '%s'\n",ncd->name().data(),
+ // gd->groupTitle());
+ ncd->makePartOfGroup(gd);
+ gd->addClass(ncd);
+ }
+ }
+ cd->visited=TRUE; // only visit every class once
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+// build a list of all namespaces mentioned in the documentation
+// and all namespaces that have a documentation block before their definition.
+static void buildNamespaceList(EntryNav *rootNav)
+{
+ if (
+ (rootNav->section()==Entry::NAMESPACE_SEC ||
+ rootNav->section()==Entry::NAMESPACEDOC_SEC ||
+ rootNav->section()==Entry::PACKAGEDOC_SEC
+ ) &&
+ !rootNav->name().isEmpty()
+ )
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ //printf("** buildNamespaceList(%s)\n",root->name.data());
+
+ QCString fName = root->name;
+ if (root->section==Entry::PACKAGEDOC_SEC)
+ {
+ fName=substitute(fName,".","::");
+ }
+
+ QCString fullName = stripAnonymousNamespaceScope(fName);
+ if (!fullName.isEmpty())
+ {
+ //printf("Found namespace %s in %s at line %d\n",root->name.data(),
+ // root->fileName.data(), root->startLine);
+ NamespaceDef *nd;
+ if ((nd=Doxygen::namespaceSDict->find(fullName))) // existing namespace
+ {
+#if 0
+ if (!root->doc.isEmpty() || !root->brief.isEmpty()) // block contains docs
+ {
+ if (nd->documentation().isEmpty() && !root->doc.isEmpty())
+ {
+#endif
+ nd->setDocumentation(root->doc,root->docFile,root->docLine);
+ nd->setName(fullName); // change name to match docs
+ nd->addSectionsToDefinition(root->anchors);
+#if 0
+ }
+ else if (!nd->documentation().isEmpty() && !root->doc.isEmpty())
+ {
+ warn(
+ root->fileName,root->startLine,
+ "warning: namespace %s already has a detailed description found in file %s at line %d. "
+ "Skipping the documentation found here.",
+ fullName.data(),nd->docFile().data(),nd->docLine());
+ }
+ if (nd->briefDescription().isEmpty() && !root->brief.isEmpty())
+ {
+#endif
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+#if 0
+ nd->setName(fullName); // change name to match docs
+ }
+ else if (!nd->briefDescription().isEmpty() && !root->brief.isEmpty())
+ {
+ warn(root->fileName,root->startLine,
+ "warning: namespace %s already has a brief description found in file %s at line %d. "
+ "Skipping the documentation found here.",
+ fullName.data(),nd->docFile().data(),nd->docLine()
+ );
+ }
+ }
+#endif
+
+ // file definition containing the namespace nd
+ FileDef *fd=rootNav->fileDef();
+ // insert the namespace in the file definition
+ if (fd) fd->insertNamespace(nd);
+ addNamespaceToGroups(root,nd);
+ nd->setRefItems(root->sli);
+ }
+ else // fresh namespace
+ {
+ QCString tagName;
+ QCString tagFileName;
+ if (rootNav->tagInfo())
+ {
+ tagName=rootNav->tagInfo()->tagName;
+ tagFileName=rootNav->tagInfo()->fileName;
+ }
+ //printf("++ new namespace %s\n",fullName.data());
+ NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,fullName,tagName,tagFileName);
+ nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ nd->addSectionsToDefinition(root->anchors);
+ nd->setHidden(root->hidden);
+ nd->setArtificial(root->artificial);
+
+ //printf("Adding namespace to group\n");
+ addNamespaceToGroups(root,nd);
+ nd->setRefItems(root->sli);
+
+ // file definition containing the namespace nd
+ FileDef *fd=rootNav->fileDef();
+ // insert the namespace in the file definition
+ if (fd) fd->insertNamespace(nd);
+
+ // the empty string test is needed for extract all case
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ nd->insertUsedFile(root->fileName);
+ nd->setBodySegment(root->bodyLine,root->endBodyLine);
+ nd->setBodyDef(fd);
+ // add class to the list
+ Doxygen::namespaceSDict->inSort(fullName,nd);
+
+ // also add namespace to the correct structural context
+ Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName);
+ //printf("adding namespace %s to context %s\n",nd->name().data(),d?d->name().data():"<none>");
+ if (d==0) // we didn't find anything, create the scope artificially
+ // anyway, so we can at least relate scopes properly.
+ {
+ Definition *d = buildScopeFromQualifiedName(fullName,fullName.contains("::"));
+ d->addInnerCompound(nd);
+ nd->setOuterScope(d);
+ // TODO: Due to the order in which the tag file is written
+ // a nested class can be found before its parent!
+ }
+ else
+ {
+ d->addInnerCompound(nd);
+ nd->setOuterScope(d);
+ }
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(buildNamespaceList,rootNav);
+}
+
+//----------------------------------------------------------------------
+
+static NamespaceDef *findUsedNamespace(NamespaceSDict *unl,
+ const QCString &name)
+{
+ NamespaceDef *usingNd =0;
+ if (unl)
+ {
+ //printf("Found namespace dict %d\n",unl->count());
+ NamespaceSDict::Iterator unli(*unl);
+ NamespaceDef *und;
+ for (unli.toFirst();(und=unli.current());++unli)
+ {
+ QCString uScope=und->name()+"::";
+ usingNd = getResolvedNamespace(uScope+name);
+ //printf("Also trying with scope=`%s' usingNd=%p\n",(uScope+name).data(),usingNd);
+ }
+ }
+ return usingNd;
+}
+
+static void findUsingDirectives(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::USINGDIR_SEC)
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ //printf("Found using directive %s at line %d of %s\n",
+ // root->name.data(),root->startLine,root->fileName.data());
+ QCString name=substitute(root->name,".","::");
+ if (!name.isEmpty())
+ {
+ NamespaceDef *usingNd = 0;
+ NamespaceDef *nd = 0;
+ FileDef *fd = rootNav->fileDef();
+ QCString nsName;
+
+ // see if the using statement was found inside a namespace or inside
+ // the global file scope.
+ if (rootNav->parent() && rootNav->parent()->section()==Entry::NAMESPACE_SEC &&
+ (fd==0 || !fd->isJava()) // not a .java file
+ )
+ {
+ nsName=stripAnonymousNamespaceScope(rootNav->parent()->name());
+ if (!nsName.isEmpty())
+ {
+ nd = getResolvedNamespace(nsName);
+ }
+ }
+
+ // find the scope in which the `using' namespace is defined by prepending
+ // the possible scopes in which the using statement was found, starting
+ // with the most inner scope and going to the most outer scope (i.e.
+ // file scope).
+ int scopeOffset = nsName.length();
+ do
+ {
+ QCString scope=scopeOffset>0 ?
+ nsName.left(scopeOffset)+"::" : QCString();
+ usingNd = getResolvedNamespace(scope+name);
+ //printf("Trying with scope=`%s' usingNd=%p\n",(scope+name).data(),usingNd);
+ if (scopeOffset==0)
+ {
+ scopeOffset=-1;
+ }
+ else if ((scopeOffset=nsName.findRev("::",scopeOffset-1))==-1)
+ {
+ scopeOffset=0;
+ }
+ } while (scopeOffset>=0 && usingNd==0);
+
+ if (usingNd==0 && nd) // not found, try used namespaces in this scope
+ // or in one of the parent namespace scopes
+ {
+ NamespaceDef *pnd = nd;
+ while (pnd && usingNd==0)
+ {
+ // also try with one of the used namespaces found earlier
+ usingNd = findUsedNamespace(pnd->getUsedNamespaces(),name);
+
+ // goto the parent
+ Definition *s = pnd->getOuterScope();
+ if (s && s->definitionType()==Definition::TypeNamespace)
+ {
+ pnd = (NamespaceDef*)s;
+ }
+ else
+ {
+ pnd = 0;
+ }
+ }
+ }
+ if (usingNd==0 && fd) // still nothing, also try used namespace in the
+ // global scope
+ {
+ usingNd = findUsedNamespace(fd->getUsedNamespaces(),name);
+ }
+
+ //printf("%s -> %s\n",name.data(),usingNd?usingNd->name().data():"<none>");
+
+ // add the namespace the correct scope
+ if (usingNd)
+ {
+ //printf("using fd=%p nd=%p\n",fd,nd);
+ if (nd)
+ {
+ //printf("Inside namespace %s\n",nd->name().data());
+ nd->addUsingDirective(usingNd);
+ }
+ else if (fd)
+ {
+ //printf("Inside file %s\n",fd->name().data());
+ fd->addUsingDirective(usingNd);
+ }
+ }
+ else // unknown namespace, but add it anyway.
+ {
+ //printf("++ new unknown namespace %s\n",name.data());
+ NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,name);
+ nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ nd->addSectionsToDefinition(root->anchors);
+ //printf("** Adding namespace %s hidden=%d\n",name.data(),root->hidden);
+ nd->setHidden(root->hidden);
+ nd->setArtificial(TRUE);
+
+ QListIterator<Grouping> gli(*root->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ GroupDef *gd=0;
+ if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
+ gd->addNamespace(nd);
+ }
+
+ // insert the namespace in the file definition
+ if (fd)
+ {
+ fd->insertNamespace(nd);
+ fd->addUsingDirective(nd);
+ }
+
+ // the empty string test is needed for extract all case
+ nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ nd->insertUsedFile(root->fileName);
+ // add class to the list
+ Doxygen::namespaceSDict->inSort(name,nd);
+ nd->setRefItems(root->sli);
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(findUsingDirectives,rootNav);
+}
+
+//----------------------------------------------------------------------
+
+static void buildListOfUsingDecls(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::USINGDECL_SEC &&
+ !(rootNav->parent()->section()&Entry::COMPOUND_MASK) // not a class/struct member
+ )
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ QCString name = substitute(root->name,".","::");
+ if (g_usingDeclarations.find(name)==0)
+ {
+ FileDef *fd = rootNav->fileDef();
+ if (fd)
+ {
+ g_usingDeclarations.insert(name,fd);
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(buildListOfUsingDecls,rootNav);
+}
+
+
+static void findUsingDeclarations(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::USINGDECL_SEC &&
+ !(rootNav->parent()->section()&Entry::COMPOUND_MASK) // not a class/struct member
+ )
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ //printf("Found using declaration %s at line %d of %s inside section %x\n",
+ // root->name.data(),root->startLine,root->fileName.data(),
+ // rootNav->parent()->section());
+ if (!root->name.isEmpty())
+ {
+ ClassDef *usingCd = 0;
+ NamespaceDef *nd = 0;
+ FileDef *fd = rootNav->fileDef();
+ QCString scName;
+
+ // see if the using statement was found inside a namespace or inside
+ // the global file scope.
+ if (rootNav->parent()->section() == Entry::NAMESPACE_SEC)
+ {
+ scName=rootNav->parent()->name();
+ if (!scName.isEmpty())
+ {
+ nd = getResolvedNamespace(scName);
+ }
+ }
+
+ // Assume the using statement was used to import a class.
+ // Find the scope in which the `using' namespace is defined by prepending
+ // the possible scopes in which the using statement was found, starting
+ // with the most inner scope and going to the most outer scope (i.e.
+ // file scope).
+
+ QCString name = substitute(root->name,".","::"); //Java/C# scope->internal
+ usingCd = getClass(name);
+ if (usingCd==0)
+ {
+ usingCd = Doxygen::hiddenClasses->find(name);
+ }
+
+ //printf("%s -> %p\n",root->name.data(),usingCd);
+ if (usingCd==0) // definition not in the input => add an artificial class
+ {
+ Debug::print(Debug::Classes,0," New using class `%s' (sec=0x%08x)! #tArgLists=%d\n",
+ name.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
+ usingCd = new ClassDef(
+ "<using>",1,
+ name,ClassDef::Class);
+ Doxygen::hiddenClasses->append(root->name,usingCd);
+ usingCd->setArtificial(TRUE);
+ }
+ else
+ {
+ Debug::print(Debug::Classes,0," Found used class %s in scope=%s\n",
+ usingCd->name().data(),nd?nd->name().data():fd->name().data());
+ }
+
+ if (usingCd) // add the class to the correct scope
+ {
+ if (nd)
+ {
+ //printf("Inside namespace %s\n",nd->name().data());
+ nd->addUsingDeclaration(usingCd);
+ }
+ else if (fd)
+ {
+ //printf("Inside file %s\n",fd->name().data());
+ fd->addUsingDeclaration(usingCd);
+ }
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(findUsingDeclarations,rootNav);
+}
+
+//----------------------------------------------------------------------
+
+static void findUsingDeclImports(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::USINGDECL_SEC &&
+ (rootNav->parent()->section()&Entry::COMPOUND_MASK) // in a class/struct member
+ )
+ {
+ //printf("Found using declaration %s at line %d of %s inside section %x\n",
+ // root->name.data(),root->startLine,root->fileName.data(),
+ // root->parent->section);
+ QCString fullName=removeRedundantWhiteSpace(rootNav->parent()->name());
+ fullName=stripAnonymousNamespaceScope(fullName);
+ fullName=stripTemplateSpecifiersFromScope(fullName);
+ ClassDef *cd = getClass(fullName);
+ if (cd)
+ {
+ //printf("found class %s\n",cd->name().data());
+ int i=rootNav->name().find("::");
+ if (i!=-1)
+ {
+ QCString scope=rootNav->name().left(i);
+ QCString memName=rootNav->name().right(rootNav->name().length()-i-2);
+ ClassDef *bcd = getResolvedClass(cd,0,scope); // todo: file in fileScope parameter
+ if (bcd)
+ {
+ //printf("found class %s\n",bcd->name().data());
+ MemberNameInfoSDict *mndict=bcd->memberNameInfoSDict();
+ if (mndict)
+ {
+ MemberNameInfo *mni = mndict->find(memName);
+ if (mni)
+ {
+ MemberNameInfoIterator mnii(*mni);
+ MemberInfo *mi;
+ for ( ; (mi=mnii.current()) ; ++mnii )
+ {
+ MemberDef *md = mi->memberDef;
+ if (md && md->protection()!=Private)
+ {
+
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ //printf("found member %s\n",mni->memberName());
+ MemberDef *newMd = 0;
+ {
+ LockingPtr<ArgumentList> templAl = md->templateArguments();
+ LockingPtr<ArgumentList> al = md->templateArguments();
+ newMd = new MemberDef(
+ root->fileName,root->startLine,
+ md->typeString(),memName,md->argsString(),
+ md->excpString(),root->protection,root->virt,
+ md->isStatic(),Member,md->memberType(),
+ templAl.pointer(),al.pointer()
+ );
+ }
+ newMd->setMemberClass(cd);
+ cd->insertMember(newMd);
+ if (!root->doc.isEmpty() || !root->brief.isEmpty())
+ {
+ newMd->setDocumentation(root->doc,root->docFile,root->docLine);
+ newMd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ newMd->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ }
+ else
+ {
+ newMd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
+ newMd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
+ newMd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
+ }
+ newMd->setDefinition(md->definition());
+ newMd->enableCallGraph(root->callGraph);
+ newMd->enableCallerGraph(root->callerGraph);
+ newMd->setBitfields(md->bitfieldString());
+ newMd->addSectionsToDefinition(root->anchors);
+ newMd->setBodySegment(md->getStartBodyLine(),md->getEndBodyLine());
+ newMd->setBodyDef(md->getBodyDef());
+ newMd->setInitializer(md->initializer());
+ newMd->setMaxInitLines(md->initializerLines());
+ newMd->setMemberGroupId(root->mGrpId);
+ newMd->setMemberSpecifiers(md->getMemberSpecifiers());
+
+ rootNav->releaseEntry();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+ RECURSE_ENTRYTREE(findUsingDeclImports,rootNav);
+}
+
+//----------------------------------------------------------------------
+
+static void findIncludedUsingDirectives()
+{
+ // first mark all files as not visited
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ fd->visited=FALSE;
+ }
+ }
+ // then recursively add using directives found in #include files
+ // to files that have not been visited.
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (fni.toFirst();(fd=fni.current());++fni)
+ {
+ if (!fd->visited)
+ {
+ //printf("----- adding using directives for file %s\n",fd->name().data());
+ fd->addIncludedUsingDirectives();
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+
+static MemberDef *addVariableToClass(
+ EntryNav *rootNav,
+ ClassDef *cd,
+ MemberDef::MemberType mtype,
+ const QCString &name,
+ bool fromAnnScope,
+ MemberDef *fromAnnMemb,
+ Protection prot,
+ Relationship related)
+{
+ Entry *root = rootNav->entry();
+
+ QCString qualScope = cd->qualifiedNameWithTemplateParameters();
+ QCString scopeSeparator="::";
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ qualScope = substitute(qualScope,"::",".");
+ scopeSeparator=".";
+ }
+ Debug::print(Debug::Variables,0,
+ " class variable:\n"
+ " `%s' `%s'::`%s' `%s' prot=`%d ann=%d init=`%s'\n",
+ root->type.data(),
+ qualScope.data(),
+ name.data(),
+ root->args.data(),
+ root->protection,
+ fromAnnScope,
+ root->initializer.data()
+ );
+
+ QCString def;
+ if (!root->type.isEmpty())
+ {
+ if (related || mtype==MemberDef::Friend || Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ def=root->type+" "+name+root->args;
+ }
+ else
+ {
+ def=root->type+" "+qualScope+scopeSeparator+name+root->args;
+ }
+ }
+ else
+ {
+ if (Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ def=name+root->args;
+ }
+ else
+ {
+ def=qualScope+scopeSeparator+name+root->args;
+ }
+ }
+ def.stripPrefix("static ");
+
+ // see if the member is already found in the same scope
+ // (this may be the case for a static member that is initialized
+ // outside the class)
+ MemberName *mn=Doxygen::memberNameSDict->find(name);
+ if (mn)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ //printf("md->getClassDef()=%p cd=%p type=[%s] md->typeString()=[%s]\n",
+ // md->getClassDef(),cd,root->type.data(),md->typeString());
+ if (md->getClassDef()==cd &&
+ removeRedundantWhiteSpace(root->type)==md->typeString())
+ // member already in the scope
+ {
+
+ if (root->lang==SrcLangExt_ObjC &&
+ root->mtype==Property &&
+ md->memberType()==MemberDef::Variable)
+ { // Objective-C 2.0 property
+ // turn variable into a property
+ md->setProtection(root->protection);
+ cd->reclassifyMember(md,MemberDef::Property);
+ }
+ addMemberDocs(rootNav,md,def,0,FALSE);
+ //printf(" Member already found!\n");
+ return md;
+ }
+ }
+ }
+
+ // new member variable, typedef or enum value
+ MemberDef *md=new MemberDef(
+ root->fileName,root->startLine,
+ root->type,name,root->args,0,
+ prot,Normal,root->stat,related,
+ mtype,0,0);
+ md->setTagInfo(rootNav->tagInfo());
+ md->setMemberClass(cd); // also sets outer scope (i.e. getOuterScope())
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDefinition(def);
+ md->setBitfields(root->bitfields);
+ md->addSectionsToDefinition(root->anchors);
+ md->setFromAnonymousScope(fromAnnScope);
+ md->setFromAnonymousMember(fromAnnMemb);
+ //md->setIndentDepth(indentDepth);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setInitializer(root->initializer);
+ md->setMaxInitLines(root->initLines);
+ md->setMemberGroupId(root->mGrpId);
+ md->setMemberSpecifiers(root->spec);
+ md->setReadAccessor(root->read);
+ md->setWriteAccessor(root->write);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ md->setHidden(root->hidden);
+ md->setArtificial(root->artificial);
+ addMemberToGroups(root,md);
+ //if (root->mGrpId!=-1)
+ //{
+ // printf("memberdef %s in memberGroup %d\n",name.data(),root->mGrpId);
+ // md->setMemberGroup(memberGroupDict[root->mGrpId]);
+ //
+ md->setBodyDef(rootNav->fileDef());
+
+ //printf(" Adding member=%s\n",md->name().data());
+ // add the member to the global list
+ if (mn)
+ {
+ mn->append(md);
+ }
+ else // new variable name
+ {
+ mn = new MemberName(name);
+ mn->append(md);
+ //printf("Adding memberName=%s\n",mn->memberName());
+ //Doxygen::memberNameDict.insert(name,mn);
+ //Doxygen::memberNameList.append(mn);
+ Doxygen::memberNameSDict->append(name,mn);
+ // add the member to the class
+ }
+ //printf(" New member adding to %s (%p)!\n",cd->name().data(),cd);
+ cd->insertMember(md);
+ md->setRefItems(root->sli);
+
+ //TODO: insert FileDef instead of filename strings.
+ cd->insertUsedFile(root->fileName);
+ rootNav->changeSection(Entry::EMPTY_SEC);
+ return md;
+}
+
+//----------------------------------------------------------------------
+
+static MemberDef *addVariableToFile(
+ EntryNav *rootNav,
+ MemberDef::MemberType mtype,
+ const QCString &scope,
+ const QCString &name,
+ bool fromAnnScope,
+ /*int indentDepth,*/
+ MemberDef *fromAnnMemb)
+{
+ Entry *root = rootNav->entry();
+ Debug::print(Debug::Variables,0,
+ " global variable:\n"
+ " type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d mtype=%d\n",
+ root->type.data(),
+ scope.data(),
+ name.data(),
+ root->args.data(),
+ root->protection,
+ mtype
+ );
+
+ FileDef *fd = rootNav->fileDef();
+
+ // see if we have a typedef that should hide a struct or union
+ if (mtype==MemberDef::Typedef && Config_getBool("TYPEDEF_HIDES_STRUCT"))
+ {
+ QCString type = root->type;
+ type.stripPrefix("typedef ");
+ if (type.left(7)=="struct " || type.left(6)=="union ")
+ {
+ type.stripPrefix("struct ");
+ type.stripPrefix("union ");
+ static QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*");
+ int l,s;
+ s = re.match(type,0,&l);
+ if (s>=0)
+ {
+ QCString typeValue = type.mid(s,l);
+ ClassDef *cd = getClass(typeValue);
+ if (cd)
+ {
+ // this typedef should hide compound name cd, so we
+ // change the name that is displayed from cd.
+ cd->setClassName(name);
+ cd->setDocumentation(root->doc,root->docFile,root->docLine);
+ cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ return 0;
+ }
+ }
+ }
+ }
+
+ // see if the function is inside a namespace
+ NamespaceDef *nd = 0;
+ QCString nscope;
+ if (!scope.isEmpty())
+ {
+ if (scope.find('@')!=-1) return 0; // anonymous scope!
+ //nscope=removeAnonymousScopes(scope);
+ //if (!nscope.isEmpty())
+ //{
+ nd = getResolvedNamespace(scope);
+ //}
+ }
+ QCString def;
+
+ // determine the definition of the global variable
+ if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@' &&
+ !Config_getBool("HIDE_SCOPE_NAMES")
+ )
+ // variable is inside a namespace, so put the scope before the name
+ {
+ static bool optimizeForJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ QCString sep="::";
+ if (optimizeForJava) sep=".";
+
+ if (!root->type.isEmpty())
+ {
+ def=root->type+" "+nd->name()+sep+name+root->args;
+ }
+ else
+ {
+ def=nd->name()+sep+name+root->args;
+ }
+ }
+ else
+ {
+ if (!root->type.isEmpty() && !root->name.isEmpty())
+ {
+ if (name.at(0)=='@') // dummy variable representing anonymous union
+ def=root->type;
+ else
+ def=root->type+" "+name+root->args;
+ }
+ else
+ {
+ def=name+root->args;
+ }
+ }
+ def.stripPrefix("static ");
+
+ MemberName *mn=Doxygen::functionNameSDict->find(name);
+ if (mn)
+ {
+ //QCString nscope=removeAnonymousScopes(scope);
+ //NamespaceDef *nd=0;
+ //if (!nscope.isEmpty())
+ if (!scope.isEmpty())
+ {
+ nd = getResolvedNamespace(scope);
+ }
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ if (
+ ((nd==0 && md->getNamespaceDef()==0 && md->getFileDef() &&
+ root->fileName==md->getFileDef()->absFilePath()
+ ) // both variable names in the same file
+ || (nd!=0 && md->getNamespaceDef()==nd) // both in same namespace
+ )
+ && !md->isDefine() // function style #define's can be "overloaded" by typedefs or variables
+ && !md->isEnumerate() // in C# an enum value and enum can have the same name
+ )
+ // variable already in the scope
+ {
+ if (md->getFileDef() &&
+ ! // not a php array
+ (
+ (getLanguageFromFileName(md->getFileDef()->name())==SrcLangExt_PHP) &&
+ (md->argsString()!=root->args && root->args.find('[')!=-1)
+ )
+ )
+ // not a php array variable
+ {
+
+ Debug::print(Debug::Variables,0,
+ " variable already found: scope=%s\n",md->getOuterScope()->name().data());
+ addMemberDocs(rootNav,md,def,0,FALSE);
+ md->setRefItems(root->sli);
+ return md;
+ }
+ }
+ }
+ }
+ Debug::print(Debug::Variables,0,
+ " new variable, nd=%s!\n",nd?nd->name().data():"<global>");
+ // new global variable, enum value or typedef
+ MemberDef *md=new MemberDef(
+ root->fileName,root->startLine,
+ root->type,name,root->args,0,
+ Public, Normal,root->stat,Member,
+ mtype,0,0);
+ md->setTagInfo(rootNav->tagInfo());
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->addSectionsToDefinition(root->anchors);
+ md->setFromAnonymousScope(fromAnnScope);
+ md->setFromAnonymousMember(fromAnnMemb);
+ md->setInitializer(root->initializer);
+ md->setMaxInitLines(root->initLines);
+ md->setMemberGroupId(root->mGrpId);
+ md->setDefinition(def);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ md->setExplicitExternal(root->explicitExternal);
+ //md->setOuterScope(fd);
+ if (!root->explicitExternal)
+ {
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodyDef(fd);
+ }
+ addMemberToGroups(root,md);
+
+ md->setRefItems(root->sli);
+ if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
+ {
+ md->setNamespace(nd);
+ nd->insertMember(md);
+ }
+
+ // add member to the file (we do this even if we have already inserted
+ // it into the namespace.
+ if (fd)
+ {
+ md->setFileDef(fd);
+ fd->insertMember(md);
+ }
+
+ // add member definition to the list of globals
+ if (mn)
+ {
+ mn->append(md);
+ }
+ else
+ {
+ mn = new MemberName(name);
+ mn->append(md);
+ Doxygen::functionNameSDict->append(name,mn);
+ }
+ rootNav->changeSection(Entry::EMPTY_SEC);
+ return md;
+}
+
+/*! See if the return type string \a type is that of a function pointer
+ * \returns -1 if this is not a function pointer variable or
+ * the index at which the brace of (...*name) was found.
+ */
+static int findFunctionPtr(const QCString &type,int lang, int *pLength=0)
+{
+ if (lang == SrcLangExt_F90) return -1; // Fortran does not have function pointers
+ static const QRegExp re("([^)]*[\\*\\^][^)]*)");
+ int i=-1,l;
+ if (!type.isEmpty() && // return type is non-empty
+ (i=re.match(type,0,&l))!=-1 && // contains (...*...)
+ type.find("operator")==-1 && // not an operator
+ (type.find(")(")==-1 || type.find("typedef ")!=-1)
+ // not a function pointer return type
+ )
+ {
+ if (pLength) *pLength=l;
+ //printf("findFunctionPtr=%d\n",i);
+ return i;
+ }
+ else
+ {
+ //printf("findFunctionPtr=%d\n",-1);
+ return -1;
+ }
+}
+
+
+/*! Returns TRUE iff \a type is a class within scope \a context.
+ * Used to detect variable declarations that look like function prototypes.
+ */
+static bool isVarWithConstructor(EntryNav *rootNav)
+{
+ static QRegExp initChars("[0-9\"'&*!^]+");
+ static QRegExp idChars("[a-z_A-Z][a-z_A-Z0-9]*");
+ bool result=FALSE;
+ bool typeIsClass;
+ QCString type;
+ Definition *ctx = 0;
+ FileDef *fd = 0;
+ int ti;
+
+ //printf("isVarWithConstructor(%s)\n",rootNav->name().data());
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ if (rootNav->parent()->section() & Entry::COMPOUND_MASK)
+ { // inside a class
+ result=FALSE;
+ goto done;
+ }
+ else if ((fd = rootNav->fileDef()) &&
+ (fd->name().right(2)==".c" || fd->name().right(2)==".h")
+ )
+ { // inside a .c file
+ result=FALSE;
+ goto done;
+ }
+ if (root->type.isEmpty())
+ {
+ result=FALSE;
+ goto done;
+ }
+ if (!rootNav->parent()->name().isEmpty())
+ {
+ ctx=Doxygen::namespaceSDict->find(rootNav->parent()->name());
+ }
+ type = root->type;
+ // remove qualifiers
+ findAndRemoveWord(type,"const");
+ findAndRemoveWord(type,"static");
+ findAndRemoveWord(type,"volatile");
+ //if (type.left(6)=="const ") type=type.right(type.length()-6);
+ typeIsClass=getResolvedClass(ctx,fd,type)!=0;
+ if (!typeIsClass && (ti=type.find('<'))!=-1)
+ {
+ typeIsClass=getResolvedClass(ctx,fd,type.left(ti))!=0;
+ }
+ if (typeIsClass) // now we still have to check if the arguments are
+ // types or values. Since we do not have complete type info
+ // we need to rely on heuristics :-(
+ {
+ //printf("typeIsClass\n");
+ ArgumentList *al = root->argList;
+ if (al==0 || al->isEmpty())
+ {
+ result=FALSE; // empty arg list -> function prototype.
+ goto done;
+ }
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (!a->name.isEmpty() || !a->defval.isEmpty())
+ {
+ if (a->name.find(initChars)==0)
+ {
+ result=TRUE;
+ }
+ else
+ {
+ result=FALSE; // arg has (type,name) pair -> function prototype
+ }
+ goto done;
+ }
+ if (a->type.isEmpty() || getResolvedClass(ctx,fd,a->type)!=0)
+ {
+ result=FALSE; // arg type is a known type
+ goto done;
+ }
+ if (checkIfTypedef(ctx,fd,a->type))
+ {
+ //printf("%s:%d: false (arg is typedef)\n",__FILE__,__LINE__);
+ result=FALSE; // argument is a typedef
+ goto done;
+ }
+ if (a->type.at(a->type.length()-1)=='*' ||
+ a->type.at(a->type.length()-1)=='&')
+ // type ends with * or & => pointer or reference
+ {
+ result=FALSE;
+ goto done;
+ }
+ if (a->type.find(initChars)==0)
+ {
+ result=TRUE; // argument type starts with typical initializer char
+ goto done;
+ }
+ QCString resType=resolveTypeDef(ctx,a->type);
+ if (resType.isEmpty()) resType=a->type;
+ int len;
+ if (idChars.match(resType,0,&len)==0) // resType starts with identifier
+ {
+ resType=resType.left(len);
+ //printf("resType=%s\n",resType.data());
+ if (resType=="int" || resType=="long" || resType=="float" ||
+ resType=="double" || resType=="char" || resType=="signed" ||
+ resType=="const" || resType=="unsigned" || resType=="void")
+ {
+ result=FALSE; // type keyword -> function prototype
+ goto done;
+ }
+ }
+ }
+ result=TRUE;
+ }
+
+done:
+ //printf("isVarWithConstructor(%s,%s)=%d\n",rootNav->parent()->name().data(),
+ // root->type.data(),result);
+ rootNav->releaseEntry();
+ return result;
+}
+
+static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
+{
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ Debug::print(Debug::Variables,0,
+ "VARIABLE_SEC: \n"
+ " type=`%s' name=`%s' args=`%s' bodyLine=`%d' mGrpId=%d\n",
+ root->type.data(),
+ root->name.data(),
+ root->args.data(),
+ root->bodyLine,
+ root->mGrpId
+ );
+ //printf("root->parent->name=%s\n",root->parent->name.data());
+
+ if (root->type.isEmpty() && root->name.find("operator")==-1 &&
+ (root->name.find('*')!=-1 || root->name.find('&')!=-1))
+ {
+ // recover from parse error caused by redundant braces
+ // like in "int *(var[10]);", which is parsed as
+ // type="" name="int *" args="(var[10])"
+
+ root->type=root->name;
+ static const QRegExp reName("[a-z_A-Z][a-z_A-Z0-9]*");
+ int l;
+ int i=root->args.isEmpty() ? -1 : reName.match(root->args,0,&l);
+ root->name=root->args.mid(i,l);
+ root->args=root->args.mid(i+l,root->args.find(')',i+l)-i-l);
+ //printf("new: type=`%s' name=`%s' args=`%s'\n",
+ // root->type.data(),root->name.data(),root->args.data());
+ }
+ else
+ {
+ int i=isFuncPtr;
+ if (i==-1) i=findFunctionPtr(root->type,root->lang); // for typedefs isFuncPtr is not yet set
+ if (i!=-1) // function pointer
+ {
+ int ai = root->type.find('[',i);
+ if (ai>i) // function pointer array
+ {
+ root->args.prepend(root->type.right(root->type.length()-ai));
+ root->type=root->type.left(ai);
+ }
+ else if (root->type.find(')',i)!=-1) // function ptr, not variable like "int (*bla)[10]"
+ {
+ root->type=root->type.left(root->type.length()-1);
+ root->args.prepend(")");
+ //printf("root->type=%s root->args=%s\n",root->type.data(),root->args.data());
+ }
+ }
+ else if (root->type.find("typedef ")!=-1 && root->type.right(2)=="()") // typedef void (func)(int)
+ {
+ root->type=root->type.left(root->type.length()-1);
+ root->args.prepend(")");
+ }
+ }
+
+ QCString scope,name=removeRedundantWhiteSpace(root->name);
+
+ // find the scope of this variable
+ EntryNav *p = rootNav->parent();
+ while ((p->section() & Entry::SCOPE_MASK))
+ {
+ QCString scopeName = p->name();
+ if (!scopeName.isEmpty())
+ {
+ scope.prepend(scopeName);
+ break;
+ }
+ p=p->parent();
+ }
+
+ MemberDef::MemberType mtype;
+ QCString type=root->type.stripWhiteSpace();
+ ClassDef *cd=0;
+ bool isRelated=FALSE;
+ bool isMemberOf=FALSE;
+
+ QCString classScope=stripAnonymousNamespaceScope(scope);
+ classScope=stripTemplateSpecifiersFromScope(classScope,FALSE);
+ QCString annScopePrefix=scope.left(scope.length()-classScope.length());
+
+ if (root->name.findRev("::")!=-1)
+ {
+ if (root->type=="friend class" || root->type=="friend struct" ||
+ root->type=="friend union")
+ {
+ cd=getClass(scope);
+ if (cd)
+ {
+ addVariableToClass(rootNav, // entry
+ cd, // class to add member to
+ MemberDef::Friend, // type of member
+ name, // name of the member
+ FALSE, // from Anonymous scope
+ 0, // anonymous member
+ Public, // protection
+ Member // related to a class
+ );
+ }
+ }
+ goto nextMember;
+ /* skip this member, because it is a
+ * static variable definition (always?), which will be
+ * found in a class scope as well, but then we know the
+ * correct protection level, so only then it will be
+ * inserted in the correct list!
+ */
+ }
+
+ if (type=="@")
+ mtype=MemberDef::EnumValue;
+ else if (type.left(8)=="typedef ")
+ mtype=MemberDef::Typedef;
+ else if (type.left(7)=="friend ")
+ mtype=MemberDef::Friend;
+ else if (root->mtype==Property)
+ mtype=MemberDef::Property;
+ else if (root->mtype==Event)
+ mtype=MemberDef::Event;
+ else
+ mtype=MemberDef::Variable;
+
+ if (!root->relates.isEmpty()) // related variable
+ {
+ isRelated=TRUE;
+ isMemberOf=(root->relatesType == MemberOf);
+ if (getClass(root->relates)==0 && !scope.isEmpty())
+ scope=mergeScopes(scope,root->relates);
+ else
+ scope=root->relates;
+ }
+
+ cd=getClass(scope);
+ if (cd==0 && classScope!=scope) cd=getClass(classScope);
+ if (cd)
+ {
+ MemberDef *md=0;
+
+ // if cd is an anonymous scope we insert the member
+ // into a non-anonymous scope as well. This is needed to
+ // be able to refer to it using \var or \fn
+
+ //int indentDepth=0;
+ int si=scope.find('@');
+ //int anonyScopes = 0;
+ bool added=FALSE;
+
+ if (si!=-1) // anonymous scope
+ {
+ QCString pScope;
+ ClassDef *pcd=0;
+ pScope = scope.left(QMAX(si-2,0));
+ if (!pScope.isEmpty())
+ pScope.prepend(annScopePrefix);
+ else if (annScopePrefix.length()>2)
+ pScope=annScopePrefix.left(annScopePrefix.length()-2);
+ if (name.at(0)!='@')
+ {
+ if (!pScope.isEmpty() && (pcd=getClass(pScope)))
+ {
+ md=addVariableToClass(rootNav, // entry
+ pcd, // class to add member to
+ mtype, // member type
+ name, // member name
+ TRUE, // from anonymous scope
+ 0, // from anonymous member
+ root->protection,
+ isMemberOf ? Foreign : isRelated ? Related : Member
+ );
+ added=TRUE;
+ }
+ else // anonymous scope inside namespace or file => put variable in the global scope
+ {
+ if (mtype==MemberDef::Variable)
+ {
+ md=addVariableToFile(rootNav,mtype,pScope,name,TRUE,0);
+ }
+ added=TRUE;
+ }
+ }
+ }
+
+ //printf("name=`%s' scope=%s scope.right=%s\n",
+ // name.data(),scope.data(),
+ // scope.right(scope.length()-si).data());
+ addVariableToClass(rootNav, // entry
+ cd, // class to add member to
+ mtype, // member type
+ name, // name of the member
+ FALSE, // from anonymous scope
+ md, // from anonymous member
+ root->protection,
+ isMemberOf ? Foreign : isRelated ? Related : Member);
+ }
+ else if (!name.isEmpty()) // global variable
+ {
+ //printf("Inserting member in global scope %s!\n",scope.data());
+ addVariableToFile(rootNav,mtype,scope,name,FALSE,/*0,*/0);
+ }
+
+nextMember:
+ rootNav->releaseEntry();
+}
+
+//----------------------------------------------------------------------
+// Searches the Entry tree for typedef documentation sections.
+// If found they are stored in their class or in the global list.
+static void buildTypedefList(EntryNav *rootNav)
+{
+ //printf("buildVarList(%s)\n",rootNav->name().data());
+ if (!rootNav->name().isEmpty() &&
+ rootNav->section()==Entry::VARIABLE_SEC &&
+ rootNav->type().find("typedef ")!=-1 // its a typedef
+ )
+ {
+ addVariable(rootNav);
+ }
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ EntryNav *e;
+ for (;(e=eli.current());++eli)
+ {
+ if (e->section()!=Entry::ENUM_SEC)
+ {
+ buildTypedefList(e);
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+// Searches the Entry tree for Variable documentation sections.
+// If found they are stored in their class or in the global list.
+
+static void buildVarList(EntryNav *rootNav)
+{
+ //printf("buildVarList(%s)\n",rootNav->name().data());
+ int isFuncPtr=-1;
+ if (!rootNav->name().isEmpty() &&
+ (rootNav->type().isEmpty() || g_compoundKeywordDict.find(rootNav->type())==0) &&
+ (
+ (rootNav->section()==Entry::VARIABLE_SEC // it's a variable
+ ) ||
+ (rootNav->section()==Entry::FUNCTION_SEC && // or maybe a function pointer variable
+ (isFuncPtr=findFunctionPtr(rootNav->type(),rootNav->lang()))!=-1
+ ) ||
+ (rootNav->section()==Entry::FUNCTION_SEC && // class variable initialized by constructor
+ isVarWithConstructor(rootNav)
+ )
+ )
+ ) // documented variable
+ {
+ addVariable(rootNav,isFuncPtr);
+ }
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ EntryNav *e;
+ for (;(e=eli.current());++eli)
+ {
+ if (e->section()!=Entry::ENUM_SEC)
+ {
+ buildVarList(e);
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+// Searches the Entry tree for Function sections.
+// If found they are stored in their class or in the global list.
+
+static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
+ const QCString &rname,bool isFriend)
+{
+ Entry *root = rootNav->entry();
+ FileDef *fd=rootNav->fileDef();
+
+ int l,i=-1;
+ static QRegExp re("([a-z_A-Z0-9: ]*[ &*]+[ ]*");
+
+ if (!root->type.isEmpty() && (i=re.match(root->type,0,&l))!=-1) // function variable
+ {
+ root->args+=root->type.right(root->type.length()-i-l);
+ root->type=root->type.left(i+l);
+ }
+
+ QCString name=removeRedundantWhiteSpace(rname);
+ if (name.left(2)=="::") name=name.right(name.length()-2);
+
+ MemberDef::MemberType mtype;
+ if (isFriend) mtype=MemberDef::Friend;
+ else if (root->mtype==Signal) mtype=MemberDef::Signal;
+ else if (root->mtype==Slot) mtype=MemberDef::Slot;
+ else if (root->mtype==DCOP) mtype=MemberDef::DCOP;
+ else mtype=MemberDef::Function;
+
+ // strip redundant template specifier for constructors
+ if ((fd==0 || getLanguageFromFileName(fd->name())==SrcLangExt_Cpp) &&
+ name.left(9)!="operator " && (i=name.find('<'))!=-1 && name.find('>')!=-1)
+ {
+ name=name.left(i);
+ }
+
+ //printf("root->name=`%s; root->args=`%s' root->argList=`%s'\n",
+ // root->name.data(),root->args.data(),argListToString(root->argList).data()
+ // );
+
+ // adding class member
+ MemberDef *md=new MemberDef(
+ root->fileName,root->startLine,
+ root->type,name,root->args,root->exception,
+ root->protection,root->virt,
+ root->stat && root->relatesType != MemberOf,
+ root->relates.isEmpty() ? Member :
+ root->relatesType == MemberOf ? Foreign : Related,
+ mtype,root->tArgLists ? root->tArgLists->last() : 0,root->argList);
+ md->setTagInfo(rootNav->tagInfo());
+ md->setMemberClass(cd);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setMemberSpecifiers(root->spec);
+ md->setMemberGroupId(root->mGrpId);
+ md->setTypeConstraints(root->typeConstr);
+ md->setBodyDef(fd);
+ md->setFileDef(fd);
+ //md->setScopeTemplateArguments(root->tArgList);
+ md->addSectionsToDefinition(root->anchors);
+ QCString def;
+ QCString qualScope = cd->qualifiedNameWithTemplateParameters();
+ QCString scopeSeparator="::";
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ qualScope = substitute(qualScope,"::",".");
+ scopeSeparator=".";
+ }
+ if (!root->relates.isEmpty() || isFriend || Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ if (!root->type.isEmpty())
+ {
+ if (root->argList)
+ {
+ def=root->type+" "+name;
+ }
+ else
+ {
+ def=root->type+" "+name+root->args;
+ }
+ }
+ else
+ {
+ if (root->argList)
+ {
+ def=name;
+ }
+ else
+ {
+ def=name+root->args;
+ }
+ }
+ }
+ else
+ {
+ if (!root->type.isEmpty())
+ {
+ if (root->argList)
+ {
+ def=root->type+" "+qualScope+scopeSeparator+name;
+ }
+ else
+ {
+ def=root->type+" "+qualScope+scopeSeparator+name+root->args;
+ }
+ }
+ else
+ {
+ if (root->argList)
+ {
+ def=qualScope+scopeSeparator+name;
+ }
+ else
+ {
+ def=qualScope+scopeSeparator+name+root->args;
+ }
+ }
+ }
+ if (def.left(7)=="friend ") def=def.right(def.length()-7);
+ md->setDefinition(def);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+
+ Debug::print(Debug::Functions,0,
+ " Func Member:\n"
+ " `%s' `%s'::`%s' `%s' proto=%d\n"
+ " def=`%s'\n",
+ root->type.data(),
+ qualScope.data(),
+ rname.data(),
+ root->args.data(),
+ root->proto,
+ def.data()
+ );
+
+ // add member to the global list of all members
+ //printf("Adding member=%s class=%s\n",md->name().data(),cd->name().data());
+ MemberName *mn;
+ if ((mn=Doxygen::memberNameSDict->find(name)))
+ {
+ mn->append(md);
+ }
+ else
+ {
+ mn = new MemberName(name);
+ mn->append(md);
+ Doxygen::memberNameSDict->append(name,mn);
+ }
+
+ // add member to the class cd
+ cd->insertMember(md);
+ // add file to list of used files
+ cd->insertUsedFile(root->fileName);
+
+ addMemberToGroups(root,md);
+ rootNav->changeSection(Entry::EMPTY_SEC);
+ md->setRefItems(root->sli);
+}
+
+
+static void buildFunctionList(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::FUNCTION_SEC)
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ Debug::print(Debug::Functions,0,
+ "FUNCTION_SEC:\n"
+ " `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%d proto=%d docFile=%s\n",
+ root->type.data(),
+ rootNav->parent()->name().data(),
+ root->name.data(),
+ root->args.data(),
+ root->relates.data(),
+ root->relatesType,
+ root->fileName.data(),
+ root->startLine,
+ root->bodyLine,
+ root->tArgLists ? (int)root->tArgLists->count() : -1,
+ root->mGrpId,
+ root->spec,
+ root->proto,
+ root->docFile.data()
+ );
+
+ bool isFriend=root->type.find("friend ")!=-1;
+ QCString rname = removeRedundantWhiteSpace(root->name);
+ //printf("rname=%s\n",rname.data());
+
+ QCString scope=rootNav->parent()->name(); //stripAnonymousNamespaceScope(root->parent->name);
+ if (!rname.isEmpty() && scope.find('@')==-1)
+ {
+ ClassDef *cd=0;
+ // check if this function's parent is a class
+ scope=stripTemplateSpecifiersFromScope(scope,FALSE);
+
+ FileDef *rfd=rootNav->fileDef();
+
+ int memIndex=rname.findRev("::");
+
+ cd=getClass(scope);
+ if (cd && scope+"::"==rname.left(scope.length()+2)) // found A::f inside A
+ {
+ // strip scope from name
+ rname=rname.right(rname.length()-rootNav->parent()->name().length()-2);
+ }
+
+ NamespaceDef *nd = 0;
+ bool isMember=FALSE;
+ if (memIndex!=-1)
+ {
+ int ts=rname.find('<');
+ int te=rname.find('>');
+ if (memIndex>0 && (ts==-1 || te==-1))
+ {
+ // note: the following code was replaced by inMember=TRUE to deal with a
+ // function rname='X::foo' of class X inside a namespace also called X...
+ // bug id 548175
+ //nd = Doxygen::namespaceSDict->find(rname.left(memIndex));
+ //isMember = nd==0;
+ //if (nd)
+ //{
+ // // strip namespace scope from name
+ // scope=rname.left(memIndex);
+ // rname=rname.right(rname.length()-memIndex-2);
+ //}
+ isMember = TRUE;
+ }
+ else
+ {
+ isMember=memIndex<ts || memIndex>te;
+ }
+ }
+
+ static QRegExp re("([a-z_A-Z0-9: ]*[ &*]+[ ]*");
+ if (!rootNav->parent()->name().isEmpty() &&
+ (rootNav->parent()->section() & Entry::COMPOUND_MASK) &&
+ cd &&
+ // do some fuzzy things to exclude function pointers
+ (root->type.isEmpty() ||
+ (root->type.find(re,0)==-1 || root->args.find(")[")!=-1) || // type contains ..(..* and args not )[.. -> function pointer
+ root->type.find(")(")!=-1 || root->type.find("operator")!=-1 // type contains ..)(.. and not "operator"
+ )
+ )
+ {
+ Debug::print(Debug::Functions,0," --> member %s of class %s!\n",
+ rname.data(),cd->name().data());
+ addMethodToClass(rootNav,cd,rname,isFriend);
+ }
+ else if (!((rootNav->parent()->section() & Entry::COMPOUND_MASK)
+ || rootNav->parent()->section()==Entry::OBJCIMPL_SEC
+ ) &&
+ !isMember &&
+ (root->relates.isEmpty() || root->relatesType == Duplicate) &&
+ root->type.left(7)!="extern " && root->type.left(8)!="typedef "
+ )
+ // no member => unrelated function
+ {
+ /* check the uniqueness of the function name in the file.
+ * A file could contain a function prototype and a function definition
+ * or even multiple function prototypes.
+ */
+ bool found=FALSE;
+ MemberName *mn;
+ MemberDef *md=0;
+ if ((mn=Doxygen::functionNameSDict->find(rname)))
+ {
+ Debug::print(Debug::Functions,0," --> function %s already found!\n",rname.data());
+ MemberNameIterator mni(*mn);
+ for (mni.toFirst();(!found && (md=mni.current()));++mni)
+ {
+ NamespaceDef *mnd = md->getNamespaceDef();
+ NamespaceDef *rnd = 0;
+ //printf("root namespace=%s\n",rootNav->parent()->name().data());
+ QCString fullScope = scope;
+ QCString parentScope = rootNav->parent()->name();
+ if (!parentScope.isEmpty() && !leftScopeMatch(parentScope,scope))
+ {
+ if (!scope.isEmpty()) fullScope.prepend("::");
+ fullScope.prepend(parentScope);
+ }
+ //printf("fullScope=%s\n",fullScope.data());
+ rnd = getResolvedNamespace(fullScope);
+ FileDef *mfd = md->getFileDef();
+ QCString nsName,rnsName;
+ if (mnd) nsName = mnd->name().copy();
+ if (rnd) rnsName = rnd->name().copy();
+ //printf("matching arguments for %s%s %s%s\n",
+ // md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data());
+ LockingPtr<ArgumentList> mdAl = md->argumentList();
+ LockingPtr<ArgumentList> mdTempl = md->templateArguments();
+
+ // in case of template functions, we need to check if the
+ // functions have the same number of template parameters
+ bool sameNumTemplateArgs = TRUE;
+ if (mdTempl!=0 && root->tArgLists)
+ {
+ if (mdTempl->count()!=root->tArgLists->getLast()->count())
+ {
+ sameNumTemplateArgs = FALSE;
+ }
+ }
+ if (
+ matchArguments2(md->getOuterScope(),mfd,mdAl.pointer(),
+ rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
+ FALSE) &&
+ sameNumTemplateArgs
+ )
+ {
+ GroupDef *gd=0;
+ if (root->groups->first()!=0)
+ {
+ gd = Doxygen::groupSDict->find(root->groups->first()->groupname.data());
+ }
+ //printf("match!\n");
+ //printf("mnd=%p rnd=%p nsName=%s rnsName=%s\n",mnd,rnd,nsName.data(),rnsName.data());
+ // see if we need to create a new member
+ found=(mnd && rnd && nsName==rnsName) || // members are in the same namespace
+ ((mnd==0 && rnd==0 && mfd!=0 && // no external reference and
+ mfd->absFilePath()==root->fileName // prototype in the same file
+ )
+ );
+ // otherwise, allow a duplicate global member with the same argument list
+ if (!found && gd && gd==md->getGroupDef())
+ {
+ // member is already in the group, so we don't want to add it again.
+ found=TRUE;
+ }
+
+ //printf("combining function with prototype found=%d in namespace %s\n",
+ // found,nsName.data());
+
+ if (found)
+ {
+ // merge argument lists
+ mergeArguments(mdAl.pointer(),root->argList,!root->doc.isEmpty());
+ // merge documentation
+ if (md->documentation().isEmpty() && !root->doc.isEmpty())
+ {
+ ArgumentList *argList = new ArgumentList;
+ stringToArgumentList(root->args,argList);
+ if (root->proto)
+ {
+ //printf("setDeclArgumentList to %p\n",argList);
+ md->setDeclArgumentList(argList);
+ }
+ else
+ {
+ md->setArgumentList(argList);
+ }
+ }
+
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ if (md->getStartBodyLine()!=-1 && md->getStartBodyLine()==-1)
+ {
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodyDef(rfd);
+ }
+
+ if (md->briefDescription().isEmpty() && !root->brief.isEmpty())
+ {
+ md->setArgsString(root->args);
+ }
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+
+ md->addSectionsToDefinition(root->anchors);
+
+ md->enableCallGraph(md->hasCallGraph() || root->callGraph);
+ md->enableCallerGraph(md->hasCallerGraph() || root->callerGraph);
+
+ // merge ingroup specifiers
+ if (md->getGroupDef()==0 && root->groups->first()!=0)
+ {
+ addMemberToGroups(root,md);
+ }
+ else if (md->getGroupDef()!=0 && root->groups->count()==0)
+ {
+ //printf("existing member is grouped, new member not\n");
+ root->groups->append(new Grouping(md->getGroupDef()->name(), md->getGroupPri()));
+ }
+ else if (md->getGroupDef()!=0 && root->groups->first()!=0)
+ {
+ //printf("both members are grouped\n");
+ }
+
+ // if md is a declaration and root is the corresponding
+ // definition, then turn md into a definition.
+ if (md->isPrototype() && !root->proto)
+ {
+ md->setPrototype(FALSE);
+ }
+ }
+ }
+ }
+ }
+ if (!found) /* global function is unique with respect to the file */
+ {
+ Debug::print(Debug::Functions,0," --> new function %s found!\n",rname.data());
+ //printf("New function type=`%s' name=`%s' args=`%s' bodyLine=%d\n",
+ // root->type.data(),rname.data(),root->args.data(),root->bodyLine);
+
+ // new global function
+ ArgumentList *tArgList = root->tArgLists ? root->tArgLists->last() : 0;
+ QCString name=removeRedundantWhiteSpace(rname);
+ md=new MemberDef(
+ root->fileName,root->startLine,
+ root->type,name,root->args,root->exception,
+ root->protection,root->virt,root->stat,Member,
+ MemberDef::Function,tArgList,root->argList);
+
+ md->setTagInfo(rootNav->tagInfo());
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setPrototype(root->proto);
+ md->setDocsForDefinition(!root->proto);
+ md->setTypeConstraints(root->typeConstr);
+ //md->setBody(root->body);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ FileDef *fd=rootNav->fileDef();
+ md->setBodyDef(fd);
+ md->addSectionsToDefinition(root->anchors);
+ md->setMemberSpecifiers(root->spec);
+ md->setMemberGroupId(root->mGrpId);
+
+ // see if the function is inside a namespace that was not part of
+ // the name already (in that case nd should be non-zero already)
+ if (nd==0 && rootNav->parent()->section() == Entry::NAMESPACE_SEC )
+ {
+ //QCString nscope=removeAnonymousScopes(rootNav->parent()->name());
+ QCString nscope=rootNav->parent()->name();
+ if (!nscope.isEmpty())
+ {
+ nd = getResolvedNamespace(nscope);
+ }
+ }
+
+ if (!scope.isEmpty())
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ scope = substitute(scope,"::",".")+".";
+ }
+ else
+ {
+ scope+="::";
+ }
+ }
+
+ QCString def;
+ if (!root->type.isEmpty())
+ {
+ if (root->argList)
+ {
+ def=root->type+" "+scope+name;
+ }
+ else
+ {
+ def=root->type+" "+scope+name+root->args;
+ }
+ }
+ else
+ {
+ if (root->argList)
+ {
+ def=scope+name.copy();
+ }
+ else
+ {
+ def=scope+name+root->args;
+ }
+ }
+ Debug::print(Debug::Functions,0,
+ " Global Function:\n"
+ " `%s' `%s'::`%s' `%s' proto=%d\n"
+ " def=`%s'\n",
+ root->type.data(),
+ rootNav->parent()->name().data(),
+ rname.data(),
+ root->args.data(),
+ root->proto,
+ def.data()
+ );
+ md->setDefinition(def);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ //if (root->mGrpId!=-1)
+ //{
+ // md->setMemberGroup(memberGroupDict[root->mGrpId]);
+ //}
+
+ md->setRefItems(root->sli);
+ if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
+ {
+ // add member to namespace
+ md->setNamespace(nd);
+ nd->insertMember(md);
+ }
+ if (fd)
+ {
+ // add member to the file (we do this even if we have already
+ // inserted it into the namespace)
+ md->setFileDef(fd);
+ fd->insertMember(md);
+ }
+
+ // add member to the list of file members
+ //printf("Adding member=%s\n",md->name().data());
+ MemberName *mn;
+ if ((mn=Doxygen::functionNameSDict->find(name)))
+ {
+ mn->append(md);
+ }
+ else
+ {
+ mn = new MemberName(name);
+ mn->append(md);
+ Doxygen::functionNameSDict->append(name,mn);
+ }
+ addMemberToGroups(root,md);
+ if (root->relatesType == Simple) // if this is a relatesalso command,
+ // allow find Member to pick it up
+ {
+ rootNav->changeSection(Entry::EMPTY_SEC); // Otherwise we have finished
+ // with this entry.
+
+ }
+ }
+ else
+ {
+ FileDef *fd=rootNav->fileDef();
+ if (fd)
+ {
+ // add member to the file (we do this even if we have already
+ // inserted it into the namespace)
+ fd->insertMember(md);
+ }
+ }
+
+ //printf("unrelated function %d `%s' `%s' `%s'\n",
+ // root->parent->section,root->type.data(),rname.data(),root->args.data());
+ }
+ else
+ {
+ Debug::print(Debug::Functions,0," --> %s not processed!\n",rname.data());
+ }
+ }
+ else if (rname.isEmpty())
+ {
+ warn(root->fileName,root->startLine,
+ "warning: Illegal member name found."
+ );
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(buildFunctionList,rootNav);
+}
+
+//----------------------------------------------------------------------
+
+static void findFriends()
+{
+ //printf("findFriends()\n");
+ MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
+ MemberName *fn;
+ for (;(fn=fnli.current());++fnli) // for each global function name
+ {
+ //printf("Function name=`%s'\n",fn->memberName());
+ MemberName *mn;
+ if ((mn=Doxygen::memberNameSDict->find(fn->memberName())))
+ { // there are members with the same name
+ //printf("Function name is also a member name\n");
+ MemberNameIterator fni(*fn);
+ MemberDef *fmd;
+ for (;(fmd=fni.current());++fni) // for each function with that name
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *mmd;
+ for (;(mmd=mni.current());++mni) // for each member with that name
+ {
+ //printf("Checking for matching arguments
+ // mmd->isRelated()=%d mmd->isFriend()=%d mmd->isFunction()=%d\n",
+ // mmd->isRelated(),mmd->isFriend(),mmd->isFunction());
+ LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
+ LockingPtr<ArgumentList> fmdAl = fmd->argumentList();
+ if ((mmd->isFriend() || (mmd->isRelated() && mmd->isFunction())) &&
+ matchArguments2(mmd->getOuterScope(), mmd->getFileDef(), mmdAl.pointer(),
+ fmd->getOuterScope(), fmd->getFileDef(), fmdAl.pointer(),
+ TRUE
+ )
+
+ ) // if the member is related and the arguments match then the
+ // function is actually a friend.
+ {
+ mergeArguments(mmdAl.pointer(),fmdAl.pointer());
+ if (!fmd->documentation().isEmpty())
+ {
+ mmd->setDocumentation(fmd->documentation(),fmd->docFile(),fmd->docLine());
+ }
+ else if (!mmd->documentation().isEmpty())
+ {
+ fmd->setDocumentation(mmd->documentation(),mmd->docFile(),mmd->docLine());
+ }
+ if (mmd->briefDescription().isEmpty() && !fmd->briefDescription().isEmpty())
+ {
+ mmd->setBriefDescription(fmd->briefDescription(),fmd->briefFile(),fmd->briefLine());
+ }
+ else if (!mmd->briefDescription().isEmpty() && !fmd->briefDescription().isEmpty())
+ {
+ fmd->setBriefDescription(mmd->briefDescription(),mmd->briefFile(),mmd->briefLine());
+ }
+ if (!fmd->inbodyDocumentation().isEmpty())
+ {
+ mmd->setInbodyDocumentation(fmd->inbodyDocumentation(),fmd->inbodyFile(),fmd->inbodyLine());
+ }
+ else if (!mmd->inbodyDocumentation().isEmpty())
+ {
+ fmd->setInbodyDocumentation(mmd->inbodyDocumentation(),mmd->inbodyFile(),mmd->inbodyLine());
+ }
+ //printf("body mmd %d fmd %d\n",mmd->getStartBodyLine(),fmd->getStartBodyLine());
+ if (mmd->getStartBodyLine()==-1 && fmd->getStartBodyLine()!=-1)
+ {
+ mmd->setBodySegment(fmd->getStartBodyLine(),fmd->getEndBodyLine());
+ mmd->setBodyDef(fmd->getBodyDef());
+ //mmd->setBodyMember(fmd);
+ }
+ else if (mmd->getStartBodyLine()!=-1 && fmd->getStartBodyLine()==-1)
+ {
+ fmd->setBodySegment(mmd->getStartBodyLine(),mmd->getEndBodyLine());
+ fmd->setBodyDef(mmd->getBodyDef());
+ //fmd->setBodyMember(mmd);
+ }
+ mmd->setDocsForDefinition(fmd->isDocsForDefinition());
+
+ mmd->enableCallGraph(mmd->hasCallGraph() || fmd->hasCallGraph());
+ mmd->enableCallerGraph(mmd->hasCallerGraph() || fmd->hasCallerGraph());
+ fmd->enableCallGraph(mmd->hasCallGraph() || fmd->hasCallGraph());
+ fmd->enableCallerGraph(mmd->hasCallerGraph() || fmd->hasCallerGraph());
+ }
+ }
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+
+static void transferArgumentDocumentation(ArgumentList *decAl,ArgumentList *defAl)
+{
+ if (decAl && defAl)
+ {
+ ArgumentListIterator decAli(*decAl);
+ ArgumentListIterator defAli(*defAl);
+ Argument *decA,*defA;
+ for (decAli.toFirst(),defAli.toFirst();
+ (decA=decAli.current()) && (defA=defAli.current());
+ ++decAli,++defAli)
+ {
+ //printf("Argument decA->name=%s (doc=%s) defA->name=%s (doc=%s)\n",
+ // decA->name.data(),decA->docs.data(),
+ // defA->name.data(),defA->docs.data()
+ // );
+ if (decA->docs.isEmpty() && !defA->docs.isEmpty())
+ {
+ decA->docs = defA->docs.copy();
+ }
+ else if (defA->docs.isEmpty() && !decA->docs.isEmpty())
+ {
+ defA->docs = decA->docs.copy();
+ }
+ }
+ }
+}
+
+static void transferFunctionDocumentation()
+{
+ //printf("---- transferFunctionDocumentation()\n");
+
+ // find matching function declaration and definitions.
+ MemberNameSDict::Iterator mnli(*Doxygen::functionNameSDict);
+ MemberName *mn;
+ for (;(mn=mnli.current());++mnli)
+ {
+ //printf("memberName=%s count=%d\n",mn->memberName(),mn->count());
+ MemberDef *mdef=0,*mdec=0;
+ MemberNameIterator mni1(*mn);
+ /* find a matching function declaration and definition for this function */
+ for (;(mdec=mni1.current());++mni1)
+ {
+ //printf("mdec=%s isPrototype()=%d\n",mdec->name().data(),mdec->isPrototype());
+ if (mdec->isPrototype() ||
+ (mdec->isVariable() && mdec->isExternal())
+ )
+ {
+ MemberNameIterator mni2(*mn);
+ for (;(mdef=mni2.current());++mni2)
+ {
+ if (
+ (mdef->isFunction() && !mdef->isStatic() && !mdef->isPrototype()) ||
+ (mdef->isVariable() && !mdef->isExternal() && !mdef->isStatic())
+ )
+ {
+ //printf("mdef=(%p,%s) mdec=(%p,%s)\n",
+ // mdef, mdef ? mdef->name().data() : "",
+ // mdec, mdec ? mdec->name().data() : "");
+
+ LockingPtr<ArgumentList> mdefAl = mdef->argumentList();
+ LockingPtr<ArgumentList> mdecAl = mdec->argumentList();
+ if (matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl.pointer(),
+ mdec->getOuterScope(),mdec->getFileDef(),mdecAl.pointer(),
+ TRUE
+ )
+ ) /* match found */
+ {
+ //printf("Found member %s: definition in %s (doc=`%s') and declaration in %s (doc=`%s')\n",
+ // mn->memberName(),
+ // mdef->getFileDef()->name().data(),mdef->documentation().data(),
+ // mdec->getFileDef()->name().data(),mdec->documentation().data()
+ // );
+
+ // first merge argument documentation
+ transferArgumentDocumentation(mdecAl.pointer(),mdefAl.pointer());
+
+ /* copy documentation between function definition and declaration */
+ if (!mdec->briefDescription().isEmpty())
+ {
+ mdef->setBriefDescription(mdec->briefDescription(),mdec->briefFile(),mdec->briefLine());
+ }
+ else if (!mdef->briefDescription().isEmpty())
+ {
+ mdec->setBriefDescription(mdef->briefDescription(),mdef->briefFile(),mdef->briefLine());
+ }
+ if (!mdef->documentation().isEmpty())
+ {
+ //printf("transfering docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
+ mdec->setDocumentation(mdef->documentation(),mdef->docFile(),mdef->docLine());
+ mdec->setDocsForDefinition(mdef->isDocsForDefinition());
+ if (mdefAl!=0)
+ {
+ ArgumentList *mdefAlComb = new ArgumentList;
+ stringToArgumentList(mdef->argsString(),mdefAlComb);
+ transferArgumentDocumentation(mdefAl.pointer(),mdefAlComb);
+ mdec->setArgumentList(mdefAlComb);
+ }
+ }
+ else if (!mdec->documentation().isEmpty())
+ {
+ //printf("transfering docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
+ mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine());
+ mdef->setDocsForDefinition(mdec->isDocsForDefinition());
+ if (mdecAl!=0)
+ {
+ ArgumentList *mdecAlComb = new ArgumentList;
+ stringToArgumentList(mdec->argsString(),mdecAlComb);
+ transferArgumentDocumentation(mdecAl.pointer(),mdecAlComb);
+ mdef->setDeclArgumentList(mdecAlComb);
+ }
+ }
+ if (!mdef->inbodyDocumentation().isEmpty())
+ {
+ mdec->setInbodyDocumentation(mdef->inbodyDocumentation(),mdef->inbodyFile(),mdef->inbodyLine());
+ }
+ else if (!mdec->inbodyDocumentation().isEmpty())
+ {
+ mdef->setInbodyDocumentation(mdec->inbodyDocumentation(),mdec->inbodyFile(),mdec->inbodyLine());
+ }
+ if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1)
+ {
+ //printf("body mdec->mdef %d-%d\n",mdec->getStartBodyLine(),mdef->getEndBodyLine());
+ mdef->setBodySegment(mdec->getStartBodyLine(),mdec->getEndBodyLine());
+ mdef->setBodyDef(mdec->getBodyDef());
+ //mdef->setBodyMember(mdec);
+ }
+ else if (mdef->getStartBodyLine()!=-1 && mdec->getStartBodyLine()==-1)
+ {
+ //printf("body mdef->mdec %d-%d\n",mdef->getStartBodyLine(),mdec->getEndBodyLine());
+ mdec->setBodySegment(mdef->getStartBodyLine(),mdef->getEndBodyLine());
+ mdec->setBodyDef(mdef->getBodyDef());
+ //mdec->setBodyMember(mdef);
+ }
+ mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers());
+ mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers());
+
+
+ // copy group info.
+ if (mdec->getGroupDef()==0 && mdef->getGroupDef()!=0)
+ {
+ mdec->setGroupDef(mdef->getGroupDef(),
+ mdef->getGroupPri(),
+ mdef->docFile(),
+ mdef->docLine(),
+ mdef->hasDocumentation(),
+ mdef
+ );
+ }
+ else if (mdef->getGroupDef()==0 && mdec->getGroupDef()!=0)
+ {
+ mdef->setGroupDef(mdec->getGroupDef(),
+ mdec->getGroupPri(),
+ mdec->docFile(),
+ mdec->docLine(),
+ mdec->hasDocumentation(),
+ mdec
+ );
+ }
+
+
+ mdec->mergeRefItems(mdef);
+ mdef->mergeRefItems(mdec);
+
+ mdef->setMemberDeclaration(mdec);
+ mdec->setMemberDefinition(mdef);
+
+ mdef->enableCallGraph(mdec->hasCallGraph() || mdef->hasCallGraph());
+ mdef->enableCallerGraph(mdec->hasCallerGraph() || mdef->hasCallerGraph());
+ mdec->enableCallGraph(mdec->hasCallGraph() || mdef->hasCallGraph());
+ mdec->enableCallerGraph(mdec->hasCallerGraph() || mdef->hasCallerGraph());
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+
+static void transferFunctionReferences()
+{
+ MemberNameSDict::Iterator mnli(*Doxygen::functionNameSDict);
+ MemberName *mn;
+ for (;(mn=mnli.current());++mnli)
+ {
+ MemberDef *md,*mdef=0,*mdec=0;
+ MemberNameIterator mni(*mn);
+ /* find a matching function declaration and definition for this function */
+ for (;(md=mni.current());++mni)
+ {
+ if (md->isPrototype())
+ mdec=md;
+ else if (md->isVariable() && md->isExternal())
+ mdec=md;
+
+ if (md->isFunction() && !md->isStatic() && !md->isPrototype())
+ mdef=md;
+ else if (md->isVariable() && !md->isExternal() && !md->isStatic())
+ mdef=md;
+ }
+ if (mdef && mdec)
+ {
+ LockingPtr<ArgumentList> mdefAl = mdef->argumentList();
+ LockingPtr<ArgumentList> mdecAl = mdec->argumentList();
+ if (
+ matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl.pointer(),
+ mdec->getOuterScope(),mdec->getFileDef(),mdecAl.pointer(),
+ TRUE
+ )
+ ) /* match found */
+ {
+ LockingPtr<MemberSDict> defDict = mdef->getReferencesMembers();
+ LockingPtr<MemberSDict> decDict = mdec->getReferencesMembers();
+ if (defDict!=0)
+ {
+ MemberSDict::Iterator msdi(*defDict);
+ MemberDef *rmd;
+ for (msdi.toFirst();(rmd=msdi.current());++msdi)
+ {
+ if (decDict==0 || decDict->find(rmd->name())==0)
+ {
+ mdec->addSourceReferences(rmd);
+ }
+ }
+ }
+ if (decDict!=0)
+ {
+ MemberSDict::Iterator msdi(*decDict);
+ MemberDef *rmd;
+ for (msdi.toFirst();(rmd=msdi.current());++msdi)
+ {
+ if (defDict==0 || defDict->find(rmd->name())==0)
+ {
+ mdef->addSourceReferences(rmd);
+ }
+ }
+ }
+
+ defDict = mdef->getReferencedByMembers();
+ decDict = mdec->getReferencedByMembers();
+ if (defDict!=0)
+ {
+ MemberSDict::Iterator msdi(*defDict);
+ MemberDef *rmd;
+ for (msdi.toFirst();(rmd=msdi.current());++msdi)
+ {
+ if (decDict==0 || decDict->find(rmd->name())==0)
+ {
+ mdec->addSourceReferencedBy(rmd);
+ }
+ }
+ }
+ if (decDict!=0)
+ {
+ MemberSDict::Iterator msdi(*decDict);
+ MemberDef *rmd;
+ for (msdi.toFirst();(rmd=msdi.current());++msdi)
+ {
+ if (defDict==0 || defDict->find(rmd->name())==0)
+ {
+ mdef->addSourceReferencedBy(rmd);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+
+static void transferRelatedFunctionDocumentation()
+{
+ // find match between function declaration and definition for
+ // related functions
+ MemberNameSDict::Iterator mnli(*Doxygen::functionNameSDict);
+ MemberName *mn;
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
+ {
+ MemberDef *md;
+ MemberNameIterator mni(*mn);
+ /* find a matching function declaration and definition for this function */
+ for (mni.toFirst();(md=mni.current());++mni) // for each global function
+ {
+ //printf(" Function `%s'\n",md->name().data());
+ MemberName *rmn;
+ if ((rmn=Doxygen::memberNameSDict->find(md->name()))) // check if there is a member with the same name
+ {
+ //printf(" Member name found\n");
+ MemberDef *rmd;
+ MemberNameIterator rmni(*rmn);
+ for (rmni.toFirst();(rmd=rmni.current());++rmni) // for each member with the same name
+ {
+ LockingPtr<ArgumentList> mdAl = md->argumentList();
+ LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
+ //printf(" Member found: related=`%d'\n",rmd->isRelated());
+ if ((rmd->isRelated() || rmd->isForeign()) && // related function
+ matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
+ rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
+ TRUE
+ )
+ )
+ {
+ //printf(" Found related member `%s'\n",md->name().data());
+ if (rmd->relatedAlso())
+ md->setRelatedAlso(rmd->relatedAlso());
+ else if (rmd->isForeign())
+ md->makeForeign();
+ else
+ md->makeRelated();
+ }
+ }
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+
+/*! make a dictionary of all template arguments of class cd
+ * that are part of the base class name.
+ * Example: A template class A with template arguments <R,S,T>
+ * that inherits from B<T,T,S> will have T and S in the dictionary.
+ */
+static QDict<int> *getTemplateArgumentsInName(ArgumentList *templateArguments,const QCString &name)
+{
+ QDict<int> *templateNames = new QDict<int>(17);
+ templateNames->setAutoDelete(TRUE);
+ static QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
+ if (templateArguments)
+ {
+ ArgumentListIterator ali(*templateArguments);
+ Argument *arg;
+ int count=0;
+ for (ali.toFirst();(arg=ali.current());++ali,count++)
+ {
+ int i,p=0,l;
+ while ((i=re.match(name,p,&l))!=-1)
+ {
+ QCString n = name.mid(i,l);
+ if (n==arg->name)
+ {
+ if (templateNames->find(n)==0)
+ {
+ templateNames->insert(n,new int(count));
+ }
+ }
+ p=i+l;
+ }
+ }
+ }
+ return templateNames;
+}
+
+/*! Searches a class from within \a context and \a cd and returns its
+ * definition if found (otherwise 0 is returned).
+ */
+static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,const QCString &name)
+{
+ FileDef *fd=cd->getFileDef();
+ ClassDef *result=0;
+ if (context && cd!=context)
+ {
+ result = getResolvedClass(context,0,name,0,0,TRUE,TRUE);
+ }
+ if (result==0)
+ {
+ result = getResolvedClass(cd,fd,name,0,0,TRUE,TRUE);
+ }
+ if (result==0) // try direct class, needed for namespaced classes imported via tag files (see bug624095)
+ {
+ result = getClass(name);
+ }
+ //printf("** Trying to find %s within context %s class %s result=%s lookup=%p\n",
+ // name.data(),
+ // context ? context->name().data() : "<none>",
+ // cd ? cd->name().data() : "<none>",
+ // result ? result->name().data() : "<none>",
+ // Doxygen::classSDict.find(name)
+ // );
+ return result;
+}
+
+enum FindBaseClassRelation_Mode
+{
+ TemplateInstances,
+ DocumentedOnly,
+ Undocumented
+};
+
+static bool findClassRelation(
+ EntryNav *rootNav,
+ Definition *context,
+ ClassDef *cd,
+ BaseInfo *bi,
+ QDict<int> *templateNames,
+ /*bool insertUndocumented*/
+ FindBaseClassRelation_Mode mode,
+ bool isArtificial
+ );
+
+
+static void findUsedClassesForClass(EntryNav *rootNav,
+ Definition *context,
+ ClassDef *masterCd,
+ ClassDef *instanceCd,
+ bool isArtificial,
+ ArgumentList *actualArgs=0,
+ QDict<int> *templateNames=0
+ )
+{
+ masterCd->visited=TRUE;
+ ArgumentList *formalArgs = masterCd->templateArguments();
+ if (masterCd->memberNameInfoSDict())
+ {
+ MemberNameInfoSDict::Iterator mnili(*masterCd->memberNameInfoSDict());
+ MemberNameInfo *mni;
+ for (;(mni=mnili.current());++mnili)
+ {
+ MemberNameInfoIterator mnii(*mni);
+ MemberInfo *mi;
+ for (mnii.toFirst();(mi=mnii.current());++mnii)
+ {
+ MemberDef *md=mi->memberDef;
+ if (md->isVariable()) // for each member variable in this class
+ {
+ //printf(" Found variable %s in class %s\n",md->name().data(),masterCd->name().data());
+ QCString type=removeRedundantWhiteSpace(md->typeString());
+ QCString typedefValue = resolveTypeDef(masterCd,type);
+ if (!typedefValue.isEmpty())
+ {
+ type = typedefValue;
+ }
+ int pos=0;
+ QCString usedClassName;
+ QCString templSpec;
+ bool found=FALSE;
+ // the type can contain template variables, replace them if present
+ if (actualArgs)
+ {
+ type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs);
+ }
+
+ //printf(" template substitution gives=%s\n",type.data());
+ while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1)
+ {
+ // find the type (if any) that matches usedClassName
+ ClassDef *typeCd = getResolvedClass(masterCd,
+ masterCd->getFileDef(),
+ usedClassName,
+ 0,0,
+ FALSE,TRUE
+ );
+ //printf("====> usedClassName=%s -> typeCd=%s\n",
+ // usedClassName.data(),typeCd?typeCd->name().data():"<none>");
+ if (typeCd)
+ {
+ usedClassName = typeCd->name();
+ }
+
+ int sp=usedClassName.find('<');
+ if (sp==-1) sp=0;
+ int si=usedClassName.findRev("::",sp);
+ if (si!=-1)
+ {
+ // replace any namespace aliases
+ replaceNamespaceAliases(usedClassName,si);
+ }
+ // add any template arguments to the class
+ QCString usedName = removeRedundantWhiteSpace(usedClassName+templSpec);
+ //printf(" usedName=%s\n",usedName.data());
+
+ bool delTempNames=FALSE;
+ if (templateNames==0)
+ {
+ templateNames = getTemplateArgumentsInName(formalArgs,usedName);
+ delTempNames=TRUE;
+ }
+ BaseInfo bi(usedName,Public,Normal);
+ findClassRelation(rootNav,context,instanceCd,&bi,templateNames,TemplateInstances,isArtificial);
+
+ if (masterCd->templateArguments())
+ {
+ ArgumentListIterator ali(*masterCd->templateArguments());
+ Argument *arg;
+ int count=0;
+ for (ali.toFirst();(arg=ali.current());++ali,++count)
+ {
+ if (arg->name==usedName) // type is a template argument
+ {
+ found=TRUE;
+ Debug::print(Debug::Classes,0," New used class `%s'\n", usedName.data());
+
+ ClassDef *usedCd = Doxygen::hiddenClasses->find(usedName);
+ if (usedCd==0)
+ {
+ usedCd = new ClassDef(
+ masterCd->getDefFileName(),masterCd->getDefLine(),
+ usedName,ClassDef::Class);
+ //printf("making %s a template argument!!!\n",usedCd->name().data());
+ usedCd->makeTemplateArgument();
+ usedCd->setUsedOnly(TRUE);
+ Doxygen::hiddenClasses->append(usedName,usedCd);
+ }
+ if (usedCd)
+ {
+ if (isArtificial) usedCd->setArtificial(TRUE);
+ Debug::print(Debug::Classes,0," Adding used class `%s' (1)\n", usedCd->name().data());
+ instanceCd->addUsedClass(usedCd,md->name());
+ usedCd->addUsedByClass(instanceCd,md->name());
+ }
+ }
+ }
+ }
+
+ if (!found)
+ {
+ ClassDef *usedCd=findClassWithinClassContext(context,masterCd,usedName);
+ //printf("Looking for used class %s: result=%s master=%s\n",
+ // usedName.data(),usedCd?usedCd->name().data():"<none>",masterCd?masterCd->name().data():"<none>");
+
+ if (usedCd)
+ {
+ found=TRUE;
+ Debug::print(Debug::Classes,0," Adding used class `%s' (2)\n", usedCd->name().data());
+ instanceCd->addUsedClass(usedCd,md->name()); // class exists
+ usedCd->addUsedByClass(instanceCd,md->name());
+ }
+ }
+ if (delTempNames)
+ {
+ delete templateNames;
+ templateNames=0;
+ }
+ }
+ if (!found && !type.isEmpty()) // used class is not documented in any scope
+ {
+ ClassDef *usedCd = Doxygen::hiddenClasses->find(type);
+ if (usedCd==0 && !Config_getBool("HIDE_UNDOC_RELATIONS"))
+ {
+ if (type.right(2)=="(*" || type.right(2)=="(^") // type is a function pointer
+ {
+ type+=md->argsString();
+ }
+ Debug::print(Debug::Classes,0," New undocumented used class `%s'\n", type.data());
+ usedCd = new ClassDef(
+ masterCd->getDefFileName(),masterCd->getDefLine(),
+ type,ClassDef::Class);
+ usedCd->setUsedOnly(TRUE);
+ Doxygen::hiddenClasses->append(type,usedCd);
+ }
+ if (usedCd)
+ {
+ if (isArtificial) usedCd->setArtificial(TRUE);
+ Debug::print(Debug::Classes,0," Adding used class `%s' (3)\n", usedCd->name().data());
+ instanceCd->addUsedClass(usedCd,md->name());
+ usedCd->addUsedByClass(instanceCd,md->name());
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ //printf("no members for class %s (%p)\n",masterCd->name().data(),masterCd);
+ }
+}
+
+static void findBaseClassesForClass(
+ EntryNav *rootNav,
+ Definition *context,
+ ClassDef *masterCd,
+ ClassDef *instanceCd,
+ FindBaseClassRelation_Mode mode,
+ bool isArtificial,
+ ArgumentList *actualArgs=0,
+ QDict<int> *templateNames=0
+ )
+{
+ Entry *root = rootNav->entry();
+ //if (masterCd->visited) return;
+ masterCd->visited=TRUE;
+ // The base class could ofcouse also be a non-nested class
+ ArgumentList *formalArgs = masterCd->templateArguments();
+ QListIterator<BaseInfo> bii(*root->extends);
+ BaseInfo *bi=0;
+ for (bii.toFirst();(bi=bii.current());++bii)
+ {
+ //printf("masterCd=%s bi->name='%s' #actualArgs=%d\n",
+ // masterCd->localName().data(),bi->name.data(),actualArgs?(int)actualArgs->count():-1);
+ bool delTempNames=FALSE;
+ if (templateNames==0)
+ {
+ templateNames = getTemplateArgumentsInName(formalArgs,bi->name);
+ delTempNames=TRUE;
+ }
+ BaseInfo tbi(bi->name,bi->prot,bi->virt);
+ if (actualArgs) // substitute the formal template arguments of the base class
+ {
+ tbi.name = substituteTemplateArgumentsInString(bi->name,formalArgs,actualArgs);
+ }
+ //printf("bi->name=%s tbi.name=%s\n",bi->name.data(),tbi.name.data());
+
+ if (mode==DocumentedOnly)
+ {
+ // find a documented base class in the correct scope
+ if (!findClassRelation(rootNav,context,instanceCd,&tbi,templateNames,DocumentedOnly,isArtificial))
+ {
+ if (!Config_getBool("HIDE_UNDOC_RELATIONS"))
+ {
+ // no documented base class -> try to find an undocumented one
+ findClassRelation(rootNav,context,instanceCd,&tbi,templateNames,Undocumented,isArtificial);
+ }
+ }
+ }
+ else if (mode==TemplateInstances)
+ {
+ findClassRelation(rootNav,context,instanceCd,&tbi,templateNames,TemplateInstances,isArtificial);
+ }
+ if (delTempNames)
+ {
+ delete templateNames;
+ templateNames=0;
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+
+static bool findTemplateInstanceRelation(Entry *root,
+ Definition *context,
+ ClassDef *templateClass,const QCString &templSpec,
+ QDict<int> *templateNames,
+ bool isArtificial)
+{
+ Debug::print(Debug::Classes,0," derived from template %s with parameters %s\n",
+ templateClass->name().data(),templSpec.data());
+ //printf("findTemplateInstanceRelation(base=%s templSpec=%s templateNames=",
+ // templateClass->name().data(),templSpec.data());
+ //if (templateNames)
+ //{
+ // QDictIterator<int> qdi(*templateNames);
+ // int *tempArgIndex;
+ // for (;(tempArgIndex=qdi.current());++qdi)
+ // {
+ // printf("(%s->%d) ",qdi.currentKey(),*tempArgIndex);
+ // }
+ //}
+ //printf("\n");
+
+ bool existingClass = (templSpec ==
+ tempArgListToString(templateClass->templateArguments())
+ );
+ if (existingClass) return TRUE;
+
+ bool freshInstance=FALSE;
+ ClassDef *instanceClass = templateClass->insertTemplateInstance(
+ root->fileName,root->startLine,templSpec,freshInstance);
+ if (isArtificial) instanceClass->setArtificial(TRUE);
+ instanceClass->setLanguage(root->lang);
+
+ if (freshInstance)
+ {
+ Debug::print(Debug::Classes,0," found fresh instance '%s'!\n",instanceClass->name().data());
+ Doxygen::classSDict->append(instanceClass->name(),instanceClass);
+ instanceClass->setTemplateBaseClassNames(templateNames);
+
+ // search for new template instances caused by base classes of
+ // instanceClass
+ EntryNav *templateRootNav = g_classEntries.find(templateClass->name());
+ if (templateRootNav)
+ {
+ bool unloadNeeded=FALSE;
+ Entry *templateRoot = templateRootNav->entry();
+ if (templateRoot==0) // not yet loaded
+ {
+ templateRootNav->loadEntry(g_storage);
+ templateRoot = templateRootNav->entry();
+ ASSERT(templateRoot!=0); // now it should really be loaded
+ unloadNeeded=TRUE;
+ }
+
+ Debug::print(Debug::Classes,0," template root found %s templSpec=%s!\n",
+ templateRoot->name.data(),templSpec.data());
+ ArgumentList *templArgs = new ArgumentList;
+ stringToArgumentList(templSpec,templArgs);
+ findBaseClassesForClass(templateRootNav,context,templateClass,instanceClass,
+ TemplateInstances,isArtificial,templArgs,templateNames);
+
+ findUsedClassesForClass(templateRootNav,context,templateClass,instanceClass,
+ isArtificial,templArgs,templateNames);
+ delete templArgs;
+
+ if (unloadNeeded) // still cleanup to do
+ {
+ templateRootNav->releaseEntry();
+ }
+ }
+ else
+ {
+ Debug::print(Debug::Classes,0," no template root entry found!\n");
+ // TODO: what happened if we get here?
+ }
+
+ //Debug::print(Debug::Classes,0," Template instance %s : \n",instanceClass->name().data());
+ //ArgumentList *tl = templateClass->templateArguments();
+ }
+ else
+ {
+ Debug::print(Debug::Classes,0," instance already exists!\n");
+ }
+ return TRUE;
+}
+
+static bool isRecursiveBaseClass(const QCString &scope,const QCString &name)
+{
+ QCString n=name;
+ int index=n.find('<');
+ if (index!=-1)
+ {
+ n=n.left(index);
+ }
+ bool result = rightScopeMatch(scope,n);
+ return result;
+}
+
+/*! Searches for the end of a template in prototype \a s starting from
+ * character position \a startPos. If the end was found the position
+ * of the closing \> is returned, otherwise -1 is returned.
+ *
+ * Handles exotic cases such as
+ * \code
+ * Class<(id<0)>
+ * Class<bits<<2>
+ * Class<"<">
+ * Class<'<'>
+ * Class<(")<")>
+ * \endcode
+ */
+static int findEndOfTemplate(const QCString &s,int startPos)
+{
+ // locate end of template
+ int e=startPos;
+ int brCount=1;
+ int roundCount=0;
+ int len = s.length();
+ bool insideString=FALSE;
+ bool insideChar=FALSE;
+ char pc = 0;
+ while (e<len && brCount!=0)
+ {
+ char c=s.at(e);
+ switch(c)
+ {
+ case '<':
+ if (!insideString && !insideChar)
+ {
+ if (e<len-1 && s.at(e+1)=='<')
+ e++;
+ else if (roundCount==0)
+ brCount++;
+ }
+ break;
+ case '>':
+ if (!insideString && !insideChar)
+ {
+ if (e<len-1 && s.at(e+1)=='>')
+ e++;
+ else if (roundCount==0)
+ brCount--;
+ }
+ break;
+ case '(':
+ if (!insideString && !insideChar)
+ roundCount++;
+ break;
+ case ')':
+ if (!insideString && !insideChar)
+ roundCount--;
+ break;
+ case '"':
+ if (!insideChar)
+ {
+ if (insideString && pc!='\\')
+ insideString=FALSE;
+ else
+ insideString=TRUE;
+ }
+ break;
+ case '\'':
+ if (!insideString)
+ {
+ if (insideChar && pc!='\\')
+ insideChar=FALSE;
+ else
+ insideChar=TRUE;
+ }
+ break;
+ }
+ pc = c;
+ e++;
+ }
+ return brCount==0 ? e : -1;
+}
+
+static bool findClassRelation(
+ EntryNav *rootNav,
+ Definition *context,
+ ClassDef *cd,
+ BaseInfo *bi,
+ QDict<int> *templateNames,
+ FindBaseClassRelation_Mode mode,
+ bool isArtificial
+ )
+{
+ //printf("findClassRelation(class=%s base=%s templateNames=",
+ // cd->name().data(),bi->name.data());
+ //if (templateNames)
+ //{
+ // QDictIterator<int> qdi(*templateNames);
+ // int *tempArgIndex;
+ // for (;(tempArgIndex=qdi.current());++qdi)
+ // {
+ // printf("(%s->%d) ",qdi.currentKey(),*tempArgIndex);
+ // }
+ //}
+ //printf("\n");
+
+ Entry *root = rootNav->entry();
+
+ QCString biName=bi->name;
+ bool explicitGlobalScope=FALSE;
+ //printf("findClassRelation: biName=`%s'\n",biName.data());
+ if (biName.left(2)=="::") // explicit global scope
+ {
+ biName=biName.right(biName.length()-2);
+ explicitGlobalScope=TRUE;
+ }
+
+ EntryNav *parentNode=rootNav->parent();
+ bool lastParent=FALSE;
+ do // for each parent scope, starting with the largest scope
+ // (in case of nested classes)
+ {
+ QCString scopeName= parentNode ? parentNode->name().data() : "";
+ int scopeOffset=explicitGlobalScope ? 0 : scopeName.length();
+ do // try all parent scope prefixes, starting with the largest scope
+ {
+ //printf("scopePrefix=`%s' biName=`%s'\n",
+ // scopeName.left(scopeOffset).data(),biName.data());
+
+ QCString baseClassName=biName;
+ if (scopeOffset>0)
+ {
+ baseClassName.prepend(scopeName.left(scopeOffset)+"::");
+ }
+ //QCString stripped;
+ //baseClassName=stripTemplateSpecifiersFromScope
+ // (removeRedundantWhiteSpace(baseClassName),TRUE,
+ // &stripped);
+ MemberDef *baseClassTypeDef=0;
+ QCString templSpec;
+ ClassDef *baseClass=getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context,
+ cd->getFileDef(),
+ baseClassName,
+ &baseClassTypeDef,
+ &templSpec,
+ mode==Undocumented,
+ TRUE
+ );
+ //printf("baseClassName=%s baseClass=%p cd=%p explicitGlobalScope=%d\n",
+ // baseClassName.data(),baseClass,cd,explicitGlobalScope);
+ //printf(" scope=`%s' baseClassName=`%s' baseClass=%s templSpec=%s\n",
+ // cd ? cd->name().data():"<none>",
+ // baseClassName.data(),
+ // baseClass?baseClass->name().data():"<none>",
+ // templSpec.data()
+ // );
+ //if (baseClassName.left(root->name.length())!=root->name ||
+ // baseClassName.at(root->name.length())!='<'
+ // ) // Check for base class with the same name.
+ // // If found then look in the outer scope for a match
+ // // and prevent recursion.
+ if (!isRecursiveBaseClass(rootNav->name(),baseClassName) || explicitGlobalScope)
+ {
+ Debug::print(
+ Debug::Classes,0," class relation %s inherited/used by %s found (%s and %s) templSpec='%s'\n",
+ baseClassName.data(),
+ rootNav->name().data(),
+ (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"),
+ (bi->virt==Normal)?"normal":"virtual",
+ templSpec.data()
+ );
+
+ int i=baseClassName.find('<');
+ int si=baseClassName.findRev("::",i==-1 ? baseClassName.length() : i);
+ if (si==-1) si=0;
+ if (baseClass==0 && i!=-1)
+ // base class has template specifiers
+ {
+ // TODO: here we should try to find the correct template specialization
+ // but for now, we only look for the unspecializated base class.
+ int e=findEndOfTemplate(baseClassName,i+1);
+ //printf("baseClass==0 i=%d e=%d\n",i,e);
+ if (e!=-1) // end of template was found at e
+ {
+ templSpec=removeRedundantWhiteSpace(baseClassName.mid(i,e-i));
+ baseClassName=baseClassName.left(i)+baseClassName.right(baseClassName.length()-e);
+ baseClass=getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context,
+ cd->getFileDef(),
+ baseClassName,
+ &baseClassTypeDef,
+ 0, //&templSpec,
+ mode==Undocumented,
+ TRUE
+ );
+ //printf("baseClass=%p -> baseClass=%s templSpec=%s\n",
+ // baseClass,baseClassName.data(),templSpec.data());
+ }
+ }
+ else if (baseClass && !templSpec.isEmpty()) // we have a known class, but also
+ // know it is a template, so see if
+ // we can also link to the explicit
+ // instance (for instance if a class
+ // derived from a template argument)
+ {
+ //printf("baseClass=%p templSpec=%s\n",baseClass,templSpec.data());
+ ClassDef *templClass=getClass(baseClass->name()+templSpec);
+ if (templClass)
+ {
+ // use the template instance instead of the template base.
+ baseClass = templClass;
+ templSpec.resize(0);
+ }
+ }
+
+ //printf("cd=%p baseClass=%p\n",cd,baseClass);
+ bool found=baseClass!=0 && (baseClass!=cd || mode==TemplateInstances);
+ //printf("1. found=%d\n",found);
+ if (!found && si!=-1)
+ {
+ QCString tmpTemplSpec;
+ // replace any namespace aliases
+ replaceNamespaceAliases(baseClassName,si);
+ baseClass=getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context,
+ cd->getFileDef(),
+ baseClassName,
+ &baseClassTypeDef,
+ &tmpTemplSpec,
+ mode==Undocumented,
+ TRUE
+ );
+ found=baseClass!=0 && baseClass!=cd;
+ if (found) templSpec = tmpTemplSpec;
+ }
+ //printf("2. found=%d\n",found);
+
+ //printf("root->name=%s biName=%s baseClassName=%s\n",
+ // root->name.data(),biName.data(),baseClassName.data());
+ if (cd->isCSharp() && i!=-1) // C# generic -> add internal -g postfix
+ {
+ baseClassName+="-g";
+ templSpec.resize(0);
+ }
+
+ if (!found)
+ {
+ baseClass=findClassWithinClassContext(context,cd,baseClassName);
+ //printf("findClassWithinClassContext(%s,%s)=%p\n",
+ // cd->name().data(),baseClassName.data(),baseClass);
+ found = baseClass!=0 && baseClass!=cd;
+
+ }
+ if (!found)
+ {
+ // for PHP the "use A\B as C" construct map class C to A::B, so we lookup
+ // the class name also in the alias mapping.
+ QCString *aliasName = Doxygen::namespaceAliasDict[baseClassName];
+ if (aliasName) // see if it is indeed a class.
+ {
+ baseClass=getClass(*aliasName);
+ found = baseClass!=0 && baseClass!=cd;
+ }
+ }
+ bool isATemplateArgument = templateNames!=0 && templateNames->find(biName)!=0;
+ // make templSpec canonical
+ // warning: the following line doesn't work for Mixin classes (see bug 560623)
+ // templSpec = getCanonicalTemplateSpec(cd, cd->getFileDef(), templSpec);
+
+ //printf("3. found=%d\n",found);
+ if (found)
+ {
+ Debug::print(Debug::Classes,0," Documented base class `%s' templSpec=%s\n",biName.data(),templSpec.isEmpty()?"":templSpec.data());
+ // add base class to this class
+
+ // if templSpec is not empty then we should "instantiate"
+ // the template baseClass. A new ClassDef should be created
+ // to represent the instance. To be able to add the (instantiated)
+ // members and documentation of a template class
+ // (inserted in that template class at a later stage),
+ // the template should know about its instances.
+ // the instantiation process, should be done in a recursive way,
+ // since instantiating a template may introduce new inheritance
+ // relations.
+ if (!templSpec.isEmpty() && mode==TemplateInstances)
+ {
+ // if baseClass is actually a typedef then we should not
+ // instantiate it, since typedefs are in a different namespace
+ // see bug531637 for an example where this would otherwise hang
+ // doxygen
+ if (baseClassTypeDef==0)
+ {
+ //printf(" => findTemplateInstanceRelation: %p\n",baseClassTypeDef);
+ findTemplateInstanceRelation(root,context,baseClass,templSpec,templateNames,isArtificial);
+ }
+ }
+ else if (mode==DocumentedOnly || mode==Undocumented)
+ {
+ //printf(" => insert base class\n");
+ QCString usedName;
+ if (baseClassTypeDef || cd->isCSharp())
+ {
+ usedName=biName;
+ //printf("***** usedName=%s templSpec=%s\n",usedName.data(),templSpec.data());
+ }
+ if (Config_getBool("SIP_SUPPORT")) bi->prot=Public;
+ cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec);
+ // add this class as super class to the base class
+ baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
+ }
+ return TRUE;
+ }
+ else if (mode==Undocumented && (scopeOffset==0 || isATemplateArgument))
+ {
+ Debug::print(Debug::Classes,0,
+ " New undocumented base class `%s' baseClassName=%s\n",
+ biName.data(),baseClassName.data()
+ );
+ baseClass=0;
+ if (isATemplateArgument)
+ {
+ baseClass=Doxygen::hiddenClasses->find(baseClassName);
+ if (baseClass==0)
+ {
+ baseClass=new ClassDef(root->fileName,root->startLine,
+ baseClassName,ClassDef::Class);
+ Doxygen::hiddenClasses->append(baseClassName,baseClass);
+ if (isArtificial) baseClass->setArtificial(TRUE);
+ }
+ }
+ else
+ {
+ baseClass=Doxygen::classSDict->find(baseClassName);
+ //printf("*** classDDict->find(%s)=%p biName=%s templSpec=%s\n",
+ // baseClassName.data(),baseClass,biName.data(),templSpec.data());
+ if (baseClass==0)
+ {
+ baseClass=new ClassDef(root->fileName,root->startLine,
+ baseClassName,ClassDef::Class);
+ Doxygen::classSDict->append(baseClassName,baseClass);
+ if (isArtificial) baseClass->setArtificial(TRUE);
+ }
+ }
+ // add base class to this class
+ cd->insertBaseClass(baseClass,biName,bi->prot,bi->virt,templSpec);
+ // add this class as super class to the base class
+ baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
+ // the undocumented base was found in this file
+ baseClass->insertUsedFile(root->fileName);
+ baseClass->setOuterScope(Doxygen::globalScope);
+ return TRUE;
+ }
+ else
+ {
+ Debug::print(Debug::Classes,0," Base class `%s' not found\n",biName.data());
+ }
+ }
+ else
+ {
+ if (mode!=TemplateInstances)
+ {
+ warn(root->fileName,root->startLine,
+ "Detected potential recursive class relation "
+ "between class %s and base class %s!\n",
+ root->name.data(),baseClassName.data()
+ );
+ }
+ // for mode==TemplateInstance this case is quite common and
+ // indicates a relation between a template class and a template
+ // instance with the same name.
+ }
+ if (scopeOffset==0)
+ {
+ scopeOffset=-1;
+ }
+ else if ((scopeOffset=scopeName.findRev("::",scopeOffset-1))==-1)
+ {
+ scopeOffset=0;
+ }
+ //printf("new scopeOffset=`%d'",scopeOffset);
+ } while (scopeOffset>=0);
+
+ if (parentNode==0)
+ {
+ lastParent=TRUE;
+ }
+ else
+ {
+ parentNode=parentNode->parent();
+ }
+ } while (lastParent);
+
+ return FALSE;
+}
+
+//----------------------------------------------------------------------
+// Computes the base and super classes for each class in the tree
+
+static bool isClassSection(EntryNav *rootNav)
+{
+ if ( !rootNav->name().isEmpty() )
+ {
+ if (rootNav->section() & Entry::COMPOUND_MASK)
+ // is it a compound (class, struct, union, interface ...)
+ {
+ return TRUE;
+ }
+ else if (rootNav->section() & Entry::COMPOUNDDOC_MASK)
+ // is it a documentation block with inheritance info.
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+ bool extends = root->extends->count()>0;
+ rootNav->releaseEntry();
+ if (extends) return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+/*! Builds a dictionary of all entry nodes in the tree starting with \a root
+ */
+static void findClassEntries(EntryNav *rootNav)
+{
+ if (isClassSection(rootNav))
+ {
+ g_classEntries.insert(rootNav->name(),rootNav);
+ }
+ RECURSE_ENTRYTREE(findClassEntries,rootNav);
+}
+
+/*! Using the dictionary build by findClassEntries(), this
+ * function will look for additional template specialization that
+ * exists as inheritance relations only. These instances will be
+ * added to the template they are derived from.
+ */
+static void findInheritedTemplateInstances()
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE;
+ QDictIterator<EntryNav> edi(g_classEntries);
+ EntryNav *rootNav;
+ for (;(rootNav=edi.current());++edi)
+ {
+ ClassDef *cd;
+ // strip any anonymous scopes first
+ QCString bName=stripAnonymousNamespaceScope(rootNav->name());
+ bName=stripTemplateSpecifiersFromScope(bName);
+ Debug::print(Debug::Classes,0," Inheritance: Class %s : \n",bName.data());
+ if ((cd=getClass(bName)))
+ {
+ rootNav->loadEntry(g_storage);
+ //printf("Class %s %d\n",cd->name().data(),root->extends->count());
+ findBaseClassesForClass(rootNav,cd,cd,cd,TemplateInstances,FALSE);
+ rootNav->releaseEntry();
+ }
+ }
+}
+
+static void findUsedTemplateInstances()
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE;
+ QDictIterator<EntryNav> edi(g_classEntries);
+ EntryNav *rootNav;
+ for (;(rootNav=edi.current());++edi)
+ {
+ ClassDef *cd;
+ // strip any anonymous scopes first
+ QCString bName=stripAnonymousNamespaceScope(rootNav->name());
+ bName=stripTemplateSpecifiersFromScope(bName);
+ Debug::print(Debug::Classes,0," Usage: Class %s : \n",bName.data());
+ if ((cd=getClass(bName)))
+ {
+ rootNav->loadEntry(g_storage);
+ findUsedClassesForClass(rootNav,cd,cd,cd,TRUE);
+ rootNav->releaseEntry();
+ }
+ }
+}
+
+static void computeClassRelations()
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE;
+ QDictIterator<EntryNav> edi(g_classEntries);
+ EntryNav *rootNav;
+ for (;(rootNav=edi.current());++edi)
+ {
+ ClassDef *cd;
+
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ // strip any anonymous scopes first
+ QCString bName=stripAnonymousNamespaceScope(rootNav->name());
+ bName=stripTemplateSpecifiersFromScope(bName);
+ Debug::print(Debug::Classes,0," Relations: Class %s : \n",bName.data());
+ if ((cd=getClass(bName)))
+ {
+ findBaseClassesForClass(rootNav,cd,cd,cd,DocumentedOnly,FALSE);
+ }
+ if ((cd==0 || (!cd->hasDocumentation() && !cd->isReference())) &&
+ bName.right(2)!="::")
+ {
+ if (!root->name.isEmpty() && root->name.find('@')==-1 && // normal name
+ (guessSection(root->fileName)==Entry::HEADER_SEC ||
+ Config_getBool("EXTRACT_LOCAL_CLASSES")) && // not defined in source file
+ (root->protection!=Private || Config_getBool("EXTRACT_PRIVATE")) && // hidden by protection
+ !Config_getBool("HIDE_UNDOC_CLASSES") // undocumented class are visible
+ )
+ warn_undoc(
+ root->fileName,root->startLine,
+ "warning: Compound %s is not documented.",
+ root->name.data()
+ );
+ }
+
+ rootNav->releaseEntry();
+ }
+}
+
+static void computeTemplateClassRelations()
+{
+ QDictIterator<EntryNav> edi(g_classEntries);
+ EntryNav *rootNav;
+ for (;(rootNav=edi.current());++edi)
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ QCString bName=stripAnonymousNamespaceScope(root->name);
+ bName=stripTemplateSpecifiersFromScope(bName);
+ ClassDef *cd=getClass(bName);
+ // strip any anonymous scopes first
+ QDict<ClassDef> *templInstances = 0;
+ if (cd && (templInstances=cd->getTemplateInstances()))
+ {
+ Debug::print(Debug::Classes,0," Template class %s : \n",cd->name().data());
+ QDictIterator<ClassDef> tdi(*templInstances);
+ ClassDef *tcd;
+ for (tdi.toFirst();(tcd=tdi.current());++tdi) // for each template instance
+ {
+ Debug::print(Debug::Classes,0," Template instance %s : \n",tcd->name().data());
+ QCString templSpec = tdi.currentKey();
+ ArgumentList *templArgs = new ArgumentList;
+ stringToArgumentList(templSpec,templArgs);
+ QList<BaseInfo> *baseList=root->extends;
+ BaseInfo *bi=baseList->first();
+ while (bi) // for each base class of the template
+ {
+ // check if the base class is a template argument
+ BaseInfo tbi(bi->name,bi->prot,bi->virt);
+ ArgumentList *tl = cd->templateArguments();
+ if (tl)
+ {
+ QDict<int> *baseClassNames = tcd->getTemplateBaseClassNames();
+ QDict<int> *templateNames = getTemplateArgumentsInName(tl,bi->name);
+ // for each template name that we inherit from we need to
+ // substitute the formal with the actual arguments
+ QDict<int> *actualTemplateNames = new QDict<int>(17);
+ actualTemplateNames->setAutoDelete(TRUE);
+ QDictIterator<int> qdi(*templateNames);
+ for (qdi.toFirst();qdi.current();++qdi)
+ {
+ int templIndex = *qdi.current();
+ Argument *actArg = 0;
+ if (templIndex<(int)templArgs->count())
+ {
+ actArg=templArgs->at(templIndex);
+ }
+ if (actArg!=0 &&
+ baseClassNames!=0 &&
+ baseClassNames->find(actArg->type)!=0 &&
+ actualTemplateNames->find(actArg->type)==0
+ )
+ {
+ actualTemplateNames->insert(actArg->type,new int(templIndex));
+ }
+ }
+ delete templateNames;
+
+ tbi.name = substituteTemplateArgumentsInString(bi->name,tl,templArgs);
+ // find a documented base class in the correct scope
+ if (!findClassRelation(rootNav,cd,tcd,&tbi,actualTemplateNames,DocumentedOnly,FALSE))
+ {
+ // no documented base class -> try to find an undocumented one
+ findClassRelation(rootNav,cd,tcd,&tbi,actualTemplateNames,Undocumented,FALSE);
+ }
+ delete actualTemplateNames;
+ }
+ bi=baseList->next();
+ }
+ delete templArgs;
+ } // class has no base classes
+ }
+
+ rootNav->releaseEntry();
+ }
+}
+
+//-----------------------------------------------------------------------
+// compute the references (anchors in HTML) for each function in the file
+
+static void computeMemberReferences()
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ cd->computeAnchors();
+ }
+ FileName *fn=Doxygen::inputNameList->first();
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ fd->computeAnchors();
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd=0;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ nd->computeAnchors();
+ }
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ gd->computeAnchors();
+ }
+}
+
+//----------------------------------------------------------------------
+
+static void addListReferences()
+{
+ MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
+ MemberName *mn=0;
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md=0;
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ md->visited=FALSE;
+ }
+ }
+ MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
+ for (fnli.toFirst();(mn=fnli.current());++fnli)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md=0;
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ md->visited=FALSE;
+ }
+ }
+
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ cd->addListReferences();
+ }
+ FileName *fn=Doxygen::inputNameList->first();
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ fd->addListReferences();
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd=0;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ nd->addListReferences();
+ }
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ gd->addListReferences();
+ }
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ QCString name = pd->getOutputFileBase();
+ if (pd->getGroupDef())
+ {
+ name = pd->getGroupDef()->getOutputFileBase();
+ }
+ {
+ LockingPtr< QList<ListItemInfo> > xrefItems = pd->xrefListItems();
+ addRefItem(xrefItems.pointer(),
+ name,
+ theTranslator->trPage(TRUE,TRUE),
+ name,pd->title(),0);
+ }
+ }
+ DirSDict::Iterator ddi(*Doxygen::directories);
+ DirDef *dd = 0;
+ for (ddi.toFirst();(dd=ddi.current());++ddi)
+ {
+ QCString name = dd->getOutputFileBase();
+ //if (dd->getGroupDef())
+ //{
+ // name = dd->getGroupDef()->getOutputFileBase();
+ //}
+ LockingPtr< QList<ListItemInfo> > xrefItems = dd->xrefListItems();
+ addRefItem(xrefItems.pointer(),
+ name,
+ theTranslator->trDir(TRUE,TRUE),
+ name,dd->displayName(),0);
+ }
+}
+
+//----------------------------------------------------------------------
+
+static void generateXRefPages()
+{
+ QDictIterator<RefList> di(*Doxygen::xrefLists);
+ RefList *rl;
+ for (di.toFirst();(rl=di.current());++di)
+ {
+ rl->generatePage();
+ }
+}
+
+//----------------------------------------------------------------------
+// Copy the documentation in entry `root' to member definition `md' and
+// set the function declaration of the member to `funcDecl'. If the boolean
+// over_load is set the standard overload text is added.
+
+static void addMemberDocs(EntryNav *rootNav,
+ MemberDef *md, const char *funcDecl,
+ ArgumentList *al,
+ bool over_load,
+ NamespaceSDict *
+ )
+{
+ Entry *root = rootNav->entry();
+ //printf("addMemberDocs: `%s'::`%s' `%s' funcDecl=`%s' mSpec=%d\n",
+ // root->parent->name.data(),md->name().data(),md->argsString(),funcDecl,root->spec);
+ QCString fDecl=funcDecl;
+ // strip extern specifier
+ fDecl.stripPrefix("extern ");
+ md->setDefinition(fDecl);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ ClassDef *cd=md->getClassDef();
+ NamespaceDef *nd=md->getNamespaceDef();
+ QCString fullName;
+ if (cd)
+ fullName = cd->name();
+ else if (nd)
+ fullName = nd->name();
+
+ if (!fullName.isEmpty()) fullName+="::";
+ fullName+=md->name();
+ FileDef *rfd=rootNav->fileDef();
+
+ // TODO determine scope based on root not md
+ Definition *rscope = md->getOuterScope();
+
+ LockingPtr<ArgumentList> mdAl = md->argumentList();
+ if (al)
+ {
+ //printf("merging arguments (1) docs=%d\n",root->doc.isEmpty());
+ mergeArguments(mdAl.pointer(),al,!root->doc.isEmpty());
+ }
+ else
+ {
+ if (
+ matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
+ rscope,rfd,root->argList,
+ TRUE
+ )
+ )
+ {
+ //printf("merging arguments (2)\n");
+ mergeArguments(mdAl.pointer(),root->argList,!root->doc.isEmpty());
+ }
+ }
+ if (over_load) // the \overload keyword was used
+ {
+ QCString doc=getOverloadDocs();
+ if (!root->doc.isEmpty())
+ {
+ doc+="<p>";
+ doc+=root->doc;
+ }
+ md->setDocumentation(doc,root->docFile,root->docLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ }
+ else
+ {
+ //printf("overwrite!\n");
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
+
+ //printf("overwrite!\n");
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+
+ if (
+ (md->inbodyDocumentation().isEmpty() ||
+ !rootNav->parent()->name().isEmpty()
+ ) && !root->inbodyDocs.isEmpty()
+ )
+ {
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ }
+ }
+
+ //printf("initializer: '%s'(isEmpty=%d) '%s'(isEmpty=%d)\n",
+ // md->initializer().data(),md->initializer().isEmpty(),
+ // root->initializer.data(),root->initializer.isEmpty()
+ // );
+ if (md->initializer().isEmpty() && !root->initializer.isEmpty())
+ {
+ //printf("setInitializer\n");
+ md->setInitializer(root->initializer);
+ }
+
+ md->setMaxInitLines(root->initLines);
+
+ if (rfd)
+ {
+ if ((md->getStartBodyLine()==-1 && root->bodyLine!=-1)
+ )
+ {
+ //printf("Setting new body segment [%d,%d]\n",root->bodyLine,root->endBodyLine);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodyDef(rfd);
+ }
+
+ md->setRefItems(root->sli);
+ }
+
+ md->enableCallGraph(md->hasCallGraph() || root->callGraph);
+ md->enableCallerGraph(md->hasCallerGraph() || root->callerGraph);
+
+ md->mergeMemberSpecifiers(root->spec);
+ md->addSectionsToDefinition(root->anchors);
+ addMemberToGroups(root,md);
+ if (cd) cd->insertUsedFile(root->fileName);
+ //printf("root->mGrpId=%d\n",root->mGrpId);
+ if (root->mGrpId!=-1)
+ {
+ if (md->getMemberGroupId()!=-1)
+ {
+ if (md->getMemberGroupId()!=root->mGrpId)
+ {
+ warn(
+ root->fileName,root->startLine,
+ "warning: member %s belongs to two different groups. The second "
+ "one found here will be ignored.",
+ md->name().data()
+ );
+ }
+ }
+ else // set group id
+ {
+ //printf("setMemberGroupId=%d md=%s\n",root->mGrpId,md->name().data());
+ md->setMemberGroupId(root->mGrpId);
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+// find a class definition given the scope name and (optionally) a
+// template list specifier
+
+static ClassDef *findClassDefinition(FileDef *fd,NamespaceDef *nd,
+ const char *scopeName)
+{
+ ClassDef *tcd = getResolvedClass(nd,fd,scopeName,0,0,TRUE,TRUE);
+ return tcd;
+}
+
+
+//----------------------------------------------------------------------
+// Adds the documentation contained in `root' to a global function
+// with name `name' and argument list `args' (for overloading) and
+// function declaration `decl' to the corresponding member definition.
+
+static bool findGlobalMember(EntryNav *rootNav,
+ const QCString &namespaceName,
+ const char *name,
+ const char *tempArg,
+ const char *,
+ const char *decl)
+{
+ Entry *root = rootNav->entry();
+ Debug::print(Debug::FindMembers,0,
+ "2. findGlobalMember(namespace=%s,name=%s,tempArg=%s,decl=%s)\n",
+ namespaceName.data(),name,tempArg,decl);
+ QCString n=name;
+ if (n.isEmpty()) return FALSE;
+ if (n.find("::")!=-1) return FALSE; // skip undefined class members
+ MemberName *mn=Doxygen::functionNameSDict->find(n+tempArg); // look in function dictionary
+ if (mn==0)
+ {
+ mn=Doxygen::functionNameSDict->find(n); // try without template arguments
+ }
+ if (mn) // function name defined
+ {
+ Debug::print(Debug::FindMembers,0,"3. Found function scope\n");
+ //int count=0;
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
+ bool found=FALSE;
+ for (mni.toFirst();(md=mni.current()) && !found;++mni)
+ {
+ NamespaceDef *nd=md->getNamespaceDef();
+
+ //printf("Namespace namespaceName=%s nd=%s\n",
+ // namespaceName.data(),nd ? nd->name().data() : "<none>");
+
+ FileDef *fd=rootNav->fileDef();
+ //printf("File %s\n",fd ? fd->name().data() : "<none>");
+ NamespaceSDict *nl = fd ? fd->getUsedNamespaces() : 0;
+ //SDict<Definition> *cl = fd ? fd->getUsedClasses() : 0;
+ //printf("NamespaceList %p\n",nl);
+
+ // search in the list of namespaces that are imported via a
+ // using declaration
+ bool viaUsingDirective = nl && nd && nl->find(nd->qualifiedName())!=0;
+
+ if ((namespaceName.isEmpty() && nd==0) || // not in a namespace
+ (nd && nd->name()==namespaceName) || // or in the same namespace
+ viaUsingDirective // member in `using' namespace
+ )
+ {
+ Debug::print(Debug::FindMembers,0,"4. Try to add member `%s' to scope `%s'\n",
+ md->name().data(),namespaceName.data());
+ QCString nsName = nd ? nd->name().data() : "";
+
+ NamespaceDef *rnd = 0;
+ if (!namespaceName.isEmpty()) rnd = Doxygen::namespaceSDict->find(namespaceName);
+
+ LockingPtr<ArgumentList> mdAl = md->argumentList();
+ bool matching=
+ (mdAl==0 && root->argList->count()==0) ||
+ md->isVariable() || md->isTypedef() || /* in case of function pointers */
+ matchArguments2(md->getOuterScope(),md->getFileDef(),mdAl.pointer(),
+ rnd ? rnd : Doxygen::globalScope,fd,root->argList,
+ FALSE);
+
+ // for template members we need to check if the number of
+ // template arguments is the same, otherwise we are dealing with
+ // different functions.
+ if (matching && root->tArgLists)
+ {
+ LockingPtr<ArgumentList> mdTempl = md->templateArguments();
+ if (mdTempl!=0)
+ {
+ if (root->tArgLists->getLast()->count()!=mdTempl->count())
+ {
+ matching=FALSE;
+ }
+ }
+ }
+
+
+ //printf("%s<->%s\n",
+ // argListToString(md->argumentList()).data(),
+ // argListToString(root->argList).data());
+
+ // for static members we also check if the comment block was found in
+ // the same file. This is needed because static members with the same
+ // name can be in different files. Thus it would be wrong to just
+ // put the comment block at the first syntactically matching member.
+ if (matching && md->isStatic() &&
+ md->getDefFileName()!=root->fileName &&
+ mn->count()>1)
+ {
+ matching = FALSE;
+ }
+
+ if (matching) // add docs to the member
+ {
+ Debug::print(Debug::FindMembers,0,"5. Match found\n");
+ addMemberDocs(rootNav,md,decl,root->argList,FALSE);
+ found=TRUE;
+ }
+ }
+ }
+ if (!found && root->relatesType != Duplicate) // no match
+ {
+ QCString fullFuncDecl=decl;
+ if (root->argList) fullFuncDecl+=argListToString(root->argList,TRUE);
+ QCString warnMsg =
+ QCString("warning: no matching file member found for \n")+fullFuncDecl;
+ if (mn->count()>0)
+ {
+ warnMsg+="Possible candidates:\n";
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ warnMsg+=" ";
+ warnMsg+=md->declaration();
+ warnMsg+='\n';
+ }
+ }
+ warn(root->fileName,root->startLine,warnMsg);
+ }
+ }
+ else // got docs for an undefined member!
+ {
+ if (root->type!="friend class" &&
+ root->type!="friend struct" &&
+ root->type!="friend union" &&
+ (!Config_getBool("TYPEDEF_HIDES_STRUCT") ||
+ root->type.find("typedef ")==-1)
+ )
+ {
+ warn(root->fileName,root->startLine,
+ "warning: documented function `%s' was not declared or defined.",decl
+ );
+ }
+ }
+ return TRUE;
+}
+
+static bool isSpecialization(
+ const QList<ArgumentList> &srcTempArgLists,
+ const QList<ArgumentList> &dstTempArgLists
+ )
+{
+ QListIterator<ArgumentList> srclali(srcTempArgLists);
+ QListIterator<ArgumentList> dstlali(dstTempArgLists);
+ for (;srclali.current();++srclali,++dstlali)
+ {
+ ArgumentList *sal = srclali.current();
+ ArgumentList *dal = dstlali.current();
+ if (!(sal && dal && sal->count()==dal->count())) return TRUE;
+ }
+ return FALSE;
+}
+
+
+static QCString substituteTemplatesInString(
+ const QList<ArgumentList> &srcTempArgLists,
+ const QList<ArgumentList> &dstTempArgLists,
+ ArgumentList *funcTempArgList, // can be used to match template specializations
+ const QCString &src
+ )
+{
+ QCString dst;
+ QRegExp re( "[A-Za-z_][A-Za-z_0-9]*");
+ //printf("type=%s\n",sa->type.data());
+ int i,p=0,l;
+ while ((i=re.match(src,p,&l))!=-1) // for each word in srcType
+ {
+ bool found=FALSE;
+ dst+=src.mid(p,i-p);
+ QCString name=src.mid(i,l);
+
+ QListIterator<ArgumentList> srclali(srcTempArgLists);
+ QListIterator<ArgumentList> dstlali(dstTempArgLists);
+ for (;srclali.current() && !found;++srclali,++dstlali)
+ {
+ ArgumentListIterator tsali(*srclali.current());
+ ArgumentListIterator tdali(*dstlali.current());
+ Argument *tsa =0,*tda=0, *fa=0;
+ if (funcTempArgList)
+ {
+ fa=funcTempArgList->first();
+ }
+
+ for (tsali.toFirst();(tsa=tsali.current()) && !found;++tsali)
+ {
+ tda = tdali.current();
+ //if (tda) printf("tsa=%s|%s tda=%s|%s\n",
+ // tsa->type.data(),tsa->name.data(),
+ // tda->type.data(),tda->name.data());
+ if (name==tsa->name)
+ {
+ if (tda && tda->name.isEmpty())
+ {
+ int vc=0;
+ if (tda->type.left(6)=="class ") vc=6;
+ else if (tda->type.left(9)=="typename ") vc=9;
+ if (vc>0) // convert type=="class T" to type=="class" name=="T"
+ {
+ tda->name = tda->type.mid(vc);
+ tda->type = tda->type.left(vc-1);
+ }
+ }
+ if (tda && !tda->name.isEmpty())
+ {
+ name=tda->name; // substitute
+ found=TRUE;
+ }
+ else if (fa)
+ {
+ name=fa->type;
+ found=TRUE;
+ }
+ }
+ if (tda)
+ ++tdali;
+ else if (fa)
+ fa=funcTempArgList->next();
+ }
+ //printf(" srcList='%s' dstList='%s faList='%s'\n",
+ // argListToString(srclali.current()).data(),
+ // argListToString(dstlali.current()).data(),
+ // funcTempArgList ? argListToString(funcTempArgList).data() : "<none>");
+ }
+ dst+=name;
+ p=i+l;
+ }
+ dst+=src.right(src.length()-p);
+ //printf(" substituteTemplatesInString(%s)=%s\n",
+ // src.data(),dst.data());
+ return dst;
+}
+
+static void substituteTemplatesInArgList(
+ const QList<ArgumentList> &srcTempArgLists,
+ const QList<ArgumentList> &dstTempArgLists,
+ ArgumentList *src,
+ ArgumentList *dst,
+ ArgumentList *funcTempArgs = 0
+ )
+{
+ ArgumentListIterator sali(*src);
+ Argument *sa=0;
+ Argument *da=dst->first();
+
+ for (sali.toFirst();(sa=sali.current());++sali) // for each member argument
+ {
+ QCString dstType = substituteTemplatesInString(
+ srcTempArgLists,dstTempArgLists,funcTempArgs,
+ sa->type);
+ QCString dstArray = substituteTemplatesInString(
+ srcTempArgLists,dstTempArgLists,funcTempArgs,
+ sa->array);
+ if (da==0)
+ {
+ da=new Argument(*sa);
+ dst->append(da);
+ da->type=dstType;
+ da->array=dstArray;
+ da=0;
+ }
+ else
+ {
+ da->type=dstType;
+ da->type=dstArray;
+ da=dst->next();
+ }
+ }
+ dst->constSpecifier = src->constSpecifier;
+ dst->volatileSpecifier = src->volatileSpecifier;
+ dst->pureSpecifier = src->pureSpecifier;
+ //printf("substituteTemplatesInArgList: replacing %s with %s\n",
+ // argListToString(src).data(),argListToString(dst).data()
+ // );
+}
+
+
+
+/*! This function tries to find a member (in a documented class/file/namespace)
+ * that corresponds to the function/variable declaration given in \a funcDecl.
+ *
+ * The boolean \a overloaded is used to specify whether or not a standard
+ * overload documentation line should be generated.
+ *
+ * The boolean \a isFunc is a hint that indicates that this is a function
+ * instead of a variable or typedef.
+ */
+static void findMember(EntryNav *rootNav,
+ QCString funcDecl,
+ bool overloaded,
+ bool isFunc
+ )
+{
+ Entry *root = rootNav->entry();
+
+ Debug::print(Debug::FindMembers,0,
+ "findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,"
+ "isFunc=%d mGrpId=%d tArgList=%p (#=%d) "
+ "spec=%d lang=%x\n",
+ root,funcDecl.data(),root->relates.data(),overloaded,isFunc,root->mGrpId,
+ root->tArgLists,root->tArgLists ? root->tArgLists->count() : 0,
+ root->spec,root->lang
+ );
+
+ QCString scopeName;
+ QCString className;
+ QCString namespaceName;
+ QCString funcType;
+ QCString funcName;
+ QCString funcArgs;
+ QCString funcTempList;
+ QCString exceptions;
+ QCString funcSpec;
+ bool isRelated=FALSE;
+ bool isMemberOf=FALSE;
+ bool isFriend=FALSE;
+ bool done;
+ do
+ {
+ done=TRUE;
+ if (funcDecl.stripPrefix("friend ")) // treat friends as related members
+ {
+ isFriend=TRUE;
+ done=FALSE;
+ }
+ if (funcDecl.stripPrefix("inline "))
+ {
+ root->spec|=Entry::Inline;
+ done=FALSE;
+ }
+ if (funcDecl.stripPrefix("explicit "))
+ {
+ root->spec|=Entry::Explicit;
+ done=FALSE;
+ }
+ if (funcDecl.stripPrefix("mutable "))
+ {
+ root->spec|=Entry::Mutable;
+ done=FALSE;
+ }
+ if (funcDecl.stripPrefix("virtual "))
+ {
+ done=FALSE;
+ }
+ } while (!done);
+
+ // delete any ; from the function declaration
+ int sep;
+ while ((sep=funcDecl.find(';'))!=-1)
+ {
+ funcDecl=(funcDecl.left(sep)+funcDecl.right(funcDecl.length()-sep-1)).stripWhiteSpace();
+ }
+
+ // make sure the first character is a space to simplify searching.
+ if (!funcDecl.isEmpty() && funcDecl[0]!=' ') funcDecl.prepend(" ");
+
+ // remove some superfluous spaces
+ funcDecl= substitute(
+ substitute(
+ substitute(funcDecl,"~ ","~"),
+ ":: ","::"
+ ),
+ " ::","::"
+ ).stripWhiteSpace();
+
+ //printf("funcDecl=`%s'\n",funcDecl.data());
+ if (isFriend && funcDecl.left(6)=="class ")
+ {
+ //printf("friend class\n");
+ funcDecl=funcDecl.right(funcDecl.length()-6);
+ funcName = funcDecl.copy();
+ }
+ else if (isFriend && funcDecl.left(7)=="struct ")
+ {
+ funcDecl=funcDecl.right(funcDecl.length()-7);
+ funcName = funcDecl.copy();
+ }
+ else
+ {
+ // extract information from the declarations
+ parseFuncDecl(funcDecl,root->lang==SrcLangExt_ObjC,scopeName,funcType,funcName,
+ funcArgs,funcTempList,exceptions
+ );
+ }
+ //printf("scopeName=`%s' funcType=`%s' funcName=`%s' funcArgs=`%s'\n",
+ // scopeName.data(),funcType.data(),funcName.data(),funcArgs.data());
+
+ // the class name can also be a namespace name, we decide this later.
+ // if a related class name is specified and the class name could
+ // not be derived from the function declaration, then use the
+ // related field.
+ //printf("scopeName=`%s' className=`%s' namespaceName=`%s'\n",
+ // scopeName.data(),className.data(),namespaceName.data());
+ if (!root->relates.isEmpty())
+ { // related member, prefix user specified scope
+ isRelated=TRUE;
+ isMemberOf=(root->relatesType == MemberOf);
+ if (getClass(root->relates)==0 && !scopeName.isEmpty())
+ {
+ scopeName= mergeScopes(scopeName,root->relates);
+ }
+ else
+ {
+ scopeName = root->relates;
+ }
+ }
+
+ if (root->relates.isEmpty() && rootNav->parent() &&
+ ((rootNav->parent()->section()&Entry::SCOPE_MASK) ||
+ (rootNav->parent()->section()==Entry::OBJCIMPL_SEC)
+ ) &&
+ !rootNav->parent()->name().isEmpty()) // see if we can combine scopeName
+ // with the scope in which it was found
+ {
+ QCString joinedName = rootNav->parent()->name()+"::"+scopeName;
+ if (!scopeName.isEmpty() &&
+ (getClass(joinedName) || Doxygen::namespaceSDict->find(joinedName)))
+ {
+ scopeName = joinedName;
+ }
+ else
+ {
+ scopeName = mergeScopes(rootNav->parent()->name(),scopeName);
+ }
+ }
+ else // see if we can prefix a namespace or class that is used from the file
+ {
+ FileDef *fd=rootNav->fileDef();
+ if (fd)
+ {
+ NamespaceSDict *fnl = fd->getUsedNamespaces();
+ if (fnl)
+ {
+ QCString joinedName;
+ NamespaceDef *fnd;
+ NamespaceSDict::Iterator nsdi(*fnl);
+ for (nsdi.toFirst();(fnd=nsdi.current());++nsdi)
+ {
+ joinedName = fnd->name()+"::"+scopeName;
+ if (Doxygen::namespaceSDict->find(joinedName))
+ {
+ scopeName=joinedName;
+ break;
+ }
+ }
+ }
+ }
+ }
+ scopeName=stripTemplateSpecifiersFromScope(
+ removeRedundantWhiteSpace(scopeName),FALSE,&funcSpec);
+
+ // funcSpec contains the last template specifiers of the given scope.
+ // If this method does not have any template arguments or they are
+ // empty while funcSpec is not empty we assume this is a
+ // specialization of a method. If not, we clear the funcSpec and treat
+ // this as a normal method of a template class.
+ if (!(root->tArgLists &&
+ root->tArgLists->count()>0 &&
+ root->tArgLists->first()->count()==0
+ )
+ )
+ {
+ funcSpec.resize(0);
+ }
+
+ // split scope into a namespace and a class part
+ extractNamespaceName(scopeName,className,namespaceName,TRUE);
+ //printf("scopeName=`%s' className=`%s' namespaceName=`%s'\n",
+ // scopeName.data(),className.data(),namespaceName.data());
+
+ //namespaceName=removeAnonymousScopes(namespaceName);
+ if (namespaceName.find('@')!=-1) return; // skip stuff in anonymous namespace...
+
+ //printf("namespaceName=`%s' className=`%s'\n",namespaceName.data(),className.data());
+ // merge class and namespace scopes again
+ scopeName.resize(0);
+ if (!namespaceName.isEmpty())
+ {
+ if (className.isEmpty())
+ {
+ scopeName=namespaceName;
+ }
+ else if (!root->relates.isEmpty() || // relates command with explicit scope
+ !getClass(className)) // class name only exists in a namespace
+ {
+ scopeName=namespaceName+"::"+className;
+ }
+ else
+ {
+ scopeName=className;
+ }
+ }
+ else if (!className.isEmpty())
+ {
+ scopeName=className;
+ }
+ //printf("new scope=`%s'\n",scopeName.data());
+
+ QCString tempScopeName=scopeName;
+ ClassDef *cd=getClass(scopeName);
+ if (cd)
+ {
+ if (root->tArgLists) root->tArgLists->first();
+ if (funcSpec.isEmpty())
+ {
+ tempScopeName=cd->qualifiedNameWithTemplateParameters(root->tArgLists);
+ }
+ else
+ {
+ tempScopeName=scopeName+funcSpec;
+ }
+ }
+ //printf("scopeName=%s cd=%p root->tArgLists=%p result=%s\n",
+ // scopeName.data(),cd,root->tArgLists,tempScopeName.data());
+
+ //printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
+ // rebuild the function declaration (needed to get the scope right).
+ if (!scopeName.isEmpty() && !isRelated && !isFriend && !Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ if (!funcType.isEmpty())
+ {
+ if (isFunc) // a function -> we use argList for the arguments
+ {
+ funcDecl=funcType+" "+tempScopeName+"::"+funcName+funcTempList;
+ }
+ else
+ {
+ funcDecl=funcType+" "+tempScopeName+"::"+funcName+funcArgs;
+ }
+ }
+ else
+ {
+ if (isFunc) // a function => we use argList for the arguments
+ {
+ funcDecl=tempScopeName+"::"+funcName+funcTempList;
+ }
+ else // variable => add `argument' list
+ {
+ funcDecl=tempScopeName+"::"+funcName+funcArgs;
+ }
+ }
+ }
+ else // build declaration without scope
+ {
+ if (!funcType.isEmpty()) // but with a type
+ {
+ if (isFunc) // function => omit argument list
+ {
+ funcDecl=funcType+" "+funcName+funcTempList;
+ }
+ else // variable => add `argument' list
+ {
+ funcDecl=funcType+" "+funcName+funcArgs;
+ }
+ }
+ else // no type
+ {
+ if (isFunc)
+ {
+ funcDecl=funcName+funcTempList;
+ }
+ else
+ {
+ funcDecl=funcName+funcArgs;
+ }
+ }
+ }
+
+ if (funcType=="template class" && !funcTempList.isEmpty())
+ return; // ignore explicit template instantiations
+
+ Debug::print(Debug::FindMembers,0,
+ "findMember() Parse results:\n"
+ " namespaceName=`%s'\n"
+ " className=`%s`\n"
+ " funcType=`%s'\n"
+ " funcSpec=`%s'\n"
+ " funcName=`%s'\n"
+ " funcArgs=`%s'\n"
+ " funcTempList=`%s'\n"
+ " funcDecl=`%s'\n"
+ " related=`%s'\n"
+ " exceptions=`%s'\n"
+ " isRelated=%d\n"
+ " isMemberOf=%d\n"
+ " isFriend=%d\n"
+ " isFunc=%d\n\n",
+ namespaceName.data(),className.data(),
+ funcType.data(),funcSpec.data(),funcName.data(),funcArgs.data(),funcTempList.data(),
+ funcDecl.data(),root->relates.data(),exceptions.data(),isRelated,isMemberOf,isFriend,
+ isFunc
+ );
+
+ MemberName *mn=0;
+ if (!funcName.isEmpty()) // function name is valid
+ {
+ Debug::print(Debug::FindMembers,0,
+ "1. funcName=`%s'\n",funcName.data());
+ if (funcName.left(9)=="operator ") // strip class scope from cast operator
+ {
+ funcName = substitute(funcName,className+"::","");
+ }
+ if (!funcTempList.isEmpty()) // try with member specialization
+ {
+ mn=Doxygen::memberNameSDict->find(funcName+funcTempList);
+ }
+ if (mn==0) // try without specialization
+ {
+ mn=Doxygen::memberNameSDict->find(funcName);
+ }
+ if (!isRelated && mn) // function name already found
+ {
+ Debug::print(Debug::FindMembers,0,
+ "2. member name exists (%d members with this name)\n",mn->count());
+ if (!className.isEmpty()) // class name is valid
+ {
+ if (funcSpec.isEmpty()) // not a member specialization
+ {
+ int count=0;
+ int noMatchCount=0;
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
+ bool memFound=FALSE;
+ for (mni.toFirst();!memFound && (md=mni.current());++mni)
+ {
+ ClassDef *cd=md->getClassDef();
+ Debug::print(Debug::FindMembers,0,
+ "3. member definition found, "
+ "scope needed=`%s' scope=`%s' args=`%s' fileName=%s\n",
+ scopeName.data(),cd ? cd->name().data() : "<none>",
+ md->argsString(),
+ root->fileName.data());
+ //printf("Member %s (member scopeName=%s) (this scopeName=%s) classTempList=%s\n",md->name().data(),cd->name().data(),scopeName.data(),classTempList.data());
+ FileDef *fd=rootNav->fileDef();
+ NamespaceDef *nd=0;
+ if (!namespaceName.isEmpty()) nd=getResolvedNamespace(namespaceName);
+
+ //printf("scopeName %s->%s\n",scopeName.data(),
+ // stripTemplateSpecifiersFromScope(scopeName,FALSE).data());
+
+ ClassDef *tcd=findClassDefinition(fd,nd,scopeName);
+ if (tcd==0 && stripAnonymousNamespaceScope(cd->name())==scopeName)
+ {
+ // don't be fooled by anonymous scopes
+ tcd=cd;
+ }
+ //printf("Looking for %s inside nd=%s result=%p (%s) cd=%p\n",
+ // scopeName.data(),nd?nd->name().data():"<none>",tcd,tcd?tcd->name().data():"",cd);
+
+ if (cd && tcd==cd) // member's classes match
+ {
+ Debug::print(Debug::FindMembers,0,
+ "4. class definition %s found\n",cd->name().data());
+
+ // get the template parameter lists found at the member declaration
+ QList<ArgumentList> declTemplArgs;
+ cd->getTemplateParameterLists(declTemplArgs);
+ LockingPtr<ArgumentList> templAl = md->templateArguments();
+ if (templAl!=0)
+ {
+ declTemplArgs.append(templAl.pointer());
+ }
+
+ // get the template parameter lists found at the member definition
+ QList<ArgumentList> *defTemplArgs = root->tArgLists;
+ //printf("defTemplArgs=%p\n",defTemplArgs);
+
+ // do we replace the decl argument lists with the def argument lists?
+ bool substDone=FALSE;
+ ArgumentList *argList=0;
+
+ /* substitute the occurrences of class template names in the
+ * argument list before matching
+ */
+ LockingPtr<ArgumentList> mdAl = md->argumentList();
+ if (declTemplArgs.count()>0 && defTemplArgs &&
+ declTemplArgs.count()==defTemplArgs->count() &&
+ mdAl.pointer()
+ )
+ {
+ /* the function definition has template arguments
+ * and the class definition also has template arguments, so
+ * we must substitute the template names of the class by that
+ * of the function definition before matching.
+ */
+ argList = new ArgumentList;
+ substituteTemplatesInArgList(declTemplArgs,*defTemplArgs,
+ mdAl.pointer(),argList);
+
+ substDone=TRUE;
+ }
+ else /* no template arguments, compare argument lists directly */
+ {
+ argList = mdAl.pointer();
+ }
+
+ Debug::print(Debug::FindMembers,0,
+ "5. matching `%s'<=>`%s' className=%s namespaceName=%s\n",
+ argListToString(argList,TRUE).data(),argListToString(root->argList,TRUE).data(),
+ className.data(),namespaceName.data()
+ );
+
+ bool matching=
+ md->isVariable() || md->isTypedef() || // needed for function pointers
+ (mdAl.pointer()==0 && root->argList->count()==0) ||
+ matchArguments2(
+ md->getClassDef(),md->getFileDef(),argList,
+ cd,fd,root->argList,
+ TRUE);
+
+ Debug::print(Debug::FindMembers,0,
+ "6. match results of matchArguments2 = %d\n",matching);
+
+ if (substDone) // found a new argument list
+ {
+ if (matching) // replace member's argument list
+ {
+ md->setDefinitionTemplateParameterLists(root->tArgLists);
+ md->setArgumentList(argList); // new owner of the list => no delete
+ }
+ else // no match
+ {
+ if (!funcTempList.isEmpty() &&
+ isSpecialization(declTemplArgs,*defTemplArgs))
+ {
+ // check if we are dealing with a partial template
+ // specialization. In this case we add it to the class
+ // even though the member arguments do not match.
+
+ // TODO: copy other aspects?
+ root->protection=md->protection(); // copy protection level
+ addMethodToClass(rootNav,cd,md->name(),isFriend);
+ return;
+ }
+ delete argList;
+ }
+ }
+ if (matching)
+ {
+ addMemberDocs(rootNav,md,funcDecl,0,overloaded,0/* TODO */);
+ count++;
+ memFound=TRUE;
+ }
+ }
+ else if (cd && cd!=tcd) // we did find a class with the same name as cd
+ // but in a different namespace
+ {
+ noMatchCount++;
+ }
+ }
+ if (count==0 && rootNav->parent() &&
+ rootNav->parent()->section()==Entry::OBJCIMPL_SEC)
+ {
+ goto localObjCMethod;
+ }
+ if (count==0 && !(isFriend && funcType=="class"))
+ {
+ int candidates=0;
+ ClassDef *ccd = 0, *ecd = 0;
+ MemberDef *cmd = 0, *emd = 0;
+ if (mn->count()>0)
+ {
+ //printf("Assume template class\n");
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ ccd=md->getClassDef();
+ cmd=md;
+ //printf("ccd->name()==%s className=%s\n",ccd->name().data(),className.data());
+ if (ccd!=0 && rightScopeMatch(ccd->name(),className))
+ {
+ LockingPtr<ArgumentList> templAl = md->templateArguments();
+ if (root->tArgLists && templAl!=0 &&
+ root->tArgLists->getLast()->count()<=templAl->count())
+ {
+ addMethodToClass(rootNav,ccd,md->name(),isFriend);
+ return;
+ }
+ if (md->argsString()==argListToString(root->argList,TRUE,FALSE))
+ { // exact argument list match -> remember
+ ecd = ccd;
+ emd = cmd;
+ }
+ candidates++;
+ }
+ }
+ }
+ static bool strictProtoMatching = Config_getBool("STRICT_PROTO_MATCHING");
+ if (!strictProtoMatching)
+ {
+ if (candidates==1 && ccd && cmd)
+ {
+ // we didn't find an actual match on argument lists, but there is only 1 member with this
+ // name in the same scope, so that has to be the one.
+ addMemberDocs(rootNav,cmd,funcDecl,0,overloaded,0);
+ return;
+ }
+ else if (candidates>1 && ecd && emd)
+ {
+ // we didn't find a unique match using type resolution,
+ // but one of the matches has the exact same signature so
+ // we take that one.
+ addMemberDocs(rootNav,emd,funcDecl,0,overloaded,0);
+ return;
+ }
+ }
+
+ QCString warnMsg = "warning: no ";
+ if (noMatchCount>1) warnMsg+="uniquely ";
+ warnMsg+="matching class member found for \n";
+
+ if (root->tArgLists)
+ {
+ QListIterator<ArgumentList> alli(*root->tArgLists);
+ ArgumentList *al;
+ for (;(al=alli.current());++alli)
+ {
+ warnMsg+=" template ";
+ warnMsg+=tempArgListToString(al);
+ warnMsg+='\n';
+ }
+ }
+ QCString fullFuncDecl=funcDecl.copy();
+ if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
+
+ warnMsg+=" ";
+ warnMsg+=fullFuncDecl;
+ warnMsg+='\n';
+
+ if (candidates>0)
+ {
+ warnMsg+="Possible candidates:\n";
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ ClassDef *cd=md->getClassDef();
+ if (cd!=0 && rightScopeMatch(cd->name(),className))
+ {
+ LockingPtr<ArgumentList> templAl = md->templateArguments();
+ if (templAl!=0)
+ {
+ warnMsg+=" template ";
+ warnMsg+=tempArgListToString(templAl.pointer());
+ warnMsg+='\n';
+ }
+ warnMsg+=" ";
+ if (md->typeString())
+ {
+ warnMsg+=md->typeString();
+ warnMsg+=' ';
+ }
+ QCString qScope = cd->qualifiedNameWithTemplateParameters();
+ if (!qScope.isEmpty())
+ warnMsg+=qScope+"::"+md->name();
+ if (md->argsString())
+ warnMsg+=md->argsString();
+ if (noMatchCount>1)
+ {
+ QCString lineFile;
+ lineFile.sprintf(" at line %d of file ",md->getDefLine());
+ warnMsg+=lineFile+md->getDefFileName();
+ }
+
+ warnMsg+='\n';
+ }
+ }
+ }
+ warn_simple(root->fileName,root->startLine,warnMsg);
+ }
+ }
+ else if (cd) // member specialization
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *declMd=0;
+ MemberDef *md=0;
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ if (md->getClassDef()==cd)
+ {
+ // TODO: we should probably also check for matching arguments
+ declMd = md;
+ break;
+ }
+ }
+ MemberDef::MemberType mtype=MemberDef::Function;
+ ArgumentList *tArgList = new ArgumentList;
+ // getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
+ md=new MemberDef(
+ root->fileName,root->startLine,
+ funcType,funcName,funcArgs,exceptions,
+ declMd ? declMd->protection() : root->protection,
+ root->virt,root->stat,Member,
+ mtype,tArgList,root->argList);
+ //printf("new specialized member %s args=`%s'\n",md->name().data(),funcArgs.data());
+ md->setTagInfo(rootNav->tagInfo());
+ md->setMemberClass(cd);
+ md->setTemplateSpecialization(TRUE);
+ md->setTypeConstraints(root->typeConstr);
+ md->setDefinition(funcDecl);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setPrototype(root->proto);
+ md->addSectionsToDefinition(root->anchors);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ FileDef *fd=rootNav->fileDef();
+ md->setBodyDef(fd);
+ md->setMemberSpecifiers(root->spec);
+ md->setMemberGroupId(root->mGrpId);
+ mn->append(md);
+ cd->insertMember(md);
+ md->setRefItems(root->sli);
+ delete tArgList;
+ }
+ else
+ {
+ //printf("*** Specialized member %s of unknown scope %s%s found!\n",
+ // scopeName.data(),funcName.data(),funcArgs.data());
+ }
+ }
+ else if (overloaded) // check if the function belongs to only one class
+ {
+ // for unique overloaded member we allow the class to be
+ // omitted, this is to be Qt compatable. Using this should
+ // however be avoided, because it is error prone
+ MemberNameIterator mni(*mn);
+ MemberDef *md=mni.toFirst();
+ ASSERT(md);
+ ClassDef *cd=md->getClassDef();
+ ASSERT(cd);
+ QCString className=cd->name().copy();
+ ++mni;
+ bool unique=TRUE;
+ for (;(md=mni.current());++mni)
+ {
+ ClassDef *cd=md->getClassDef();
+ if (className!=cd->name()) unique=FALSE;
+ }
+ if (unique)
+ {
+ MemberDef::MemberType mtype;
+ if (root->mtype==Signal) mtype=MemberDef::Signal;
+ else if (root->mtype==Slot) mtype=MemberDef::Slot;
+ else if (root->mtype==DCOP) mtype=MemberDef::DCOP;
+ else mtype=MemberDef::Function;
+
+ // new overloaded member function
+ ArgumentList *tArgList =
+ getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
+ //printf("new related member %s args=`%s'\n",md->name().data(),funcArgs.data());
+ MemberDef *md=new MemberDef(
+ root->fileName,root->startLine,
+ funcType,funcName,funcArgs,exceptions,
+ root->protection,root->virt,root->stat,Related,
+ mtype,tArgList,root->argList);
+ md->setTagInfo(rootNav->tagInfo());
+ md->setTypeConstraints(root->typeConstr);
+ md->setMemberClass(cd);
+ md->setDefinition(funcDecl);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ QCString doc=getOverloadDocs();
+ doc+="<p>";
+ doc+=root->doc;
+ md->setDocumentation(doc,root->docFile,root->docLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setPrototype(root->proto);
+ md->addSectionsToDefinition(root->anchors);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ FileDef *fd=rootNav->fileDef();
+ md->setBodyDef(fd);
+ md->setMemberSpecifiers(root->spec);
+ md->setMemberGroupId(root->mGrpId);
+ mn->append(md);
+ cd->insertMember(md);
+ cd->insertUsedFile(root->fileName);
+ md->setRefItems(root->sli);
+ }
+ }
+ else // unrelated function with the same name as a member
+ {
+ if (!findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
+ {
+ QCString fullFuncDecl=funcDecl.copy();
+ if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
+ warn(root->fileName,root->startLine,
+ "warning: Cannot determine class for function\n%s",
+ fullFuncDecl.data()
+ );
+ }
+ }
+ }
+ else if (isRelated && !root->relates.isEmpty())
+ {
+ Debug::print(Debug::FindMembers,0,"2. related function\n"
+ " scopeName=%s className=%s\n",scopeName.data(),className.data());
+ if (className.isEmpty()) className=root->relates;
+ ClassDef *cd;
+ //printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
+ if ((cd=getClass(scopeName)))
+ {
+ bool newMember=TRUE; // assume we have a new member
+ bool newMemberName=FALSE;
+ bool isDefine=FALSE;
+ {
+ MemberName *mn = Doxygen::functionNameSDict->find(funcName);
+ if (mn)
+ {
+ MemberDef *md = mn->first();
+ while (md && !isDefine)
+ {
+ isDefine = isDefine || md->isDefine();
+ md = mn->next();
+ }
+ }
+ }
+
+ FileDef *fd=rootNav->fileDef();
+
+ if ((mn=Doxygen::memberNameSDict->find(funcName))==0)
+ {
+ mn=new MemberName(funcName);
+ newMemberName=TRUE; // we create a new member name
+ }
+ else
+ {
+ MemberDef *rmd=mn->first();
+ while (rmd && newMember) // see if we got another member with matching arguments
+ {
+ LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
+
+ newMember=
+ !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
+ cd,fd,root->argList,
+ TRUE);
+ if (newMember) rmd=mn->next();
+ }
+ if (!newMember && rmd) // member already exists as rmd -> add docs
+ {
+ //printf("addMemberDocs for related member %s\n",root->name.data());
+ //rmd->setMemberDefTemplateArguments(root->mtArgList);
+ addMemberDocs(rootNav,rmd,funcDecl,0,overloaded);
+ }
+ }
+
+ if (newMember) // need to create a new member
+ {
+ MemberDef::MemberType mtype;
+ if (isDefine)
+ mtype=MemberDef::Define;
+ else if (root->mtype==Signal)
+ mtype=MemberDef::Signal;
+ else if (root->mtype==Slot)
+ mtype=MemberDef::Slot;
+ else if (root->mtype==DCOP)
+ mtype=MemberDef::DCOP;
+ else
+ mtype=MemberDef::Function;
+
+ //printf("New related name `%s' `%d'\n",funcName.data(),
+ // root->argList ? (int)root->argList->count() : -1);
+
+ // new related (member) function
+#if 0 // removed as it doesn't handle related template functions correctly
+ ArgumentList *tArgList =
+ getTemplateArgumentsFromName(scopeName+"::"+funcName,root->tArgLists);
+ MemberDef *md=new MemberDef(
+ root->fileName,root->startLine,
+ funcType,funcName,funcArgs,exceptions,
+ root->protection,root->virt,root->stat,TRUE,
+ mtype,tArgList,funcArgs.isEmpty() ? 0 : root->argList);
+#endif
+ // first note that we pass:
+ // (root->tArgLists ? root->tArgLists->last() : 0)
+ // for the template arguments fo the new "member."
+ // this accurately reflects the template arguments of
+ // the related function, which don't have to do with
+ // those of the related class.
+ MemberDef *md=new MemberDef(
+ root->fileName,root->startLine,
+ funcType,funcName,funcArgs,exceptions,
+ root->protection,root->virt,
+ root->stat && !isMemberOf,
+ isMemberOf ? Foreign : isRelated ? Related : Member,
+ mtype,
+ (root->tArgLists ? root->tArgLists->last() : 0),
+ funcArgs.isEmpty() ? 0 : root->argList);
+ //
+ // we still have the problem that
+ // MemberDef::writeDocumentation() in memberdef.cpp
+ // writes the template argument list for the class,
+ // as if this member is a member of the class.
+ // fortunately, MemberDef::writeDocumentation() has
+ // a special mechanism that allows us to totally
+ // override the set of template argument lists that
+ // are printed. We use that and set it to the
+ // template argument lists of the related function.
+ //
+ md->setDefinitionTemplateParameterLists(root->tArgLists);
+
+ md->setTagInfo(rootNav->tagInfo());
+
+
+
+ //printf("Related member name=`%s' decl=`%s' bodyLine=`%d'\n",
+ // funcName.data(),funcDecl.data(),root->bodyLine);
+
+ // try to find the matching line number of the body from the
+ // global function list
+ bool found=FALSE;
+ if (root->bodyLine==-1)
+ {
+ MemberName *rmn=Doxygen::functionNameSDict->find(funcName);
+ if (rmn)
+ {
+ MemberDef *rmd=rmn->first();
+ while (rmd && !found) // see if we got another member with matching arguments
+ {
+ LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
+ // check for matching argument lists
+ if (
+ matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
+ cd,fd,root->argList,
+ TRUE)
+ )
+ {
+ found=TRUE;
+ }
+ if (!found) rmd=rmn->next();
+ }
+ if (rmd) // member found -> copy line number info
+ {
+ md->setBodySegment(rmd->getStartBodyLine(),rmd->getEndBodyLine());
+ md->setBodyDef(rmd->getBodyDef());
+ //md->setBodyMember(rmd);
+ }
+ }
+ }
+ if (!found) // line number could not be found or is available in this
+ // entry
+ {
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodyDef(fd);
+ }
+
+ //if (root->mGrpId!=-1)
+ //{
+ // md->setMemberGroup(memberGroupDict[root->mGrpId]);
+ //}
+ md->setMemberClass(cd);
+ md->setMemberSpecifiers(root->spec);
+ md->setDefinition(funcDecl);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setPrototype(root->proto);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->addSectionsToDefinition(root->anchors);
+ md->setMemberGroupId(root->mGrpId);
+ //md->setMemberDefTemplateArguments(root->mtArgList);
+ mn->append(md);
+ cd->insertMember(md);
+ cd->insertUsedFile(root->fileName);
+ md->setRefItems(root->sli);
+ if (root->relatesType == Duplicate) md->setRelatedAlso(cd);
+ addMemberToGroups(root,md);
+ //printf("Adding member=%s\n",md->name().data());
+ if (newMemberName)
+ {
+ //Doxygen::memberNameList.append(mn);
+ //Doxygen::memberNameDict.insert(funcName,mn);
+ Doxygen::memberNameSDict->append(funcName,mn);
+ }
+ }
+ if (root->relatesType == Duplicate)
+ {
+ if (!findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
+ {
+ QCString fullFuncDecl=funcDecl.copy();
+ if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
+ warn(root->fileName,root->startLine,
+ "warning: Cannot determine file/namespace for relatedalso function\n%s",
+ fullFuncDecl.data()
+ );
+ }
+ }
+ }
+ else
+ {
+ warn_undoc(root->fileName,root->startLine,
+ "warning: class `%s' for related function `%s' is not "
+ "documented.",
+ className.data(),funcName.data()
+ );
+ }
+ }
+ else if (rootNav->parent() && rootNav->parent()->section()==Entry::OBJCIMPL_SEC)
+ {
+localObjCMethod:
+ ClassDef *cd;
+ //printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
+ if (Config_getBool("EXTRACT_LOCAL_METHODS") && (cd=getClass(scopeName)))
+ {
+ //printf("Local objective C method `%s' of class `%s' found\n",root->name.data(),cd->name().data());
+ MemberDef *md=new MemberDef(
+ root->fileName,root->startLine,
+ funcType,funcName,funcArgs,exceptions,
+ root->protection,root->virt,root->stat,Member,
+ MemberDef::Function,0,root->argList);
+ md->setTagInfo(rootNav->tagInfo());
+ md->makeImplementationDetail();
+ md->setMemberClass(cd);
+ md->setDefinition(funcDecl);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setPrototype(root->proto);
+ md->addSectionsToDefinition(root->anchors);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ FileDef *fd=rootNav->fileDef();
+ md->setBodyDef(fd);
+ md->setMemberSpecifiers(root->spec);
+ md->setMemberGroupId(root->mGrpId);
+ cd->insertMember(md);
+ cd->insertUsedFile(root->fileName);
+ md->setRefItems(root->sli);
+ if ((mn=Doxygen::memberNameSDict->find(root->name)))
+ {
+ mn->append(md);
+ }
+ else
+ {
+ mn = new MemberName(root->name);
+ mn->append(md);
+ Doxygen::memberNameSDict->append(root->name,mn);
+ }
+ }
+ else
+ {
+ // local objective C method found for class without interface
+ }
+ }
+ else // unrelated not overloaded member found
+ {
+ bool globMem = findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl);
+ if (className.isEmpty() && !globMem)
+ {
+ warn(root->fileName,root->startLine,
+ "warning: class for member `%s' cannot "
+ "be found.", funcName.data()
+ );
+ }
+ else if (!className.isEmpty() && !globMem)
+ {
+ warn(root->fileName,root->startLine,
+ "warning: member `%s' of class `%s' cannot be found",
+ funcName.data(),className.data());
+ }
+ }
+ }
+ else
+ {
+ // this should not be called
+ warn(root->fileName,root->startLine,
+ "warning: member with no name found.");
+ }
+ return;
+}
+
+//----------------------------------------------------------------------
+// find the members corresponding to the different documentation blocks
+// that are extracted from the sources.
+
+static void filterMemberDocumentation(EntryNav *rootNav)
+{
+ Entry *root = rootNav->entry();
+ int i=-1,l;
+ Debug::print(Debug::FindMembers,0,
+ "findMemberDocumentation(): root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->spec=%d root->mGrpId=%d\n",
+ root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->spec,root->mGrpId
+ );
+ //printf("rootNav->parent()->name()=%s\n",rootNav->parent()->name().data());
+ bool isFunc=TRUE;
+
+ if (root->relatesType == Duplicate && !root->relates.isEmpty())
+ {
+ QCString tmp = root->relates;
+ root->relates.resize(0);
+ filterMemberDocumentation(rootNav);
+ root->relates = tmp;
+ }
+
+ if ( // detect func variable/typedef to func ptr
+ (i=findFunctionPtr(root->type,root->lang,&l))!=-1
+ )
+ {
+ //printf("Fixing function pointer!\n");
+ // fix type and argument
+ root->args.prepend(root->type.right(root->type.length()-i-l));
+ root->type=root->type.left(i+l);
+ //printf("Results type=%s,name=%s,args=%s\n",root->type.data(),root->name.data(),root->args.data());
+ isFunc=FALSE;
+ }
+ else if ((root->type.left(8)=="typedef " && root->args.find('(')!=-1))
+ // detect function types marked as functions
+ {
+ isFunc=FALSE;
+ }
+
+ //printf("Member %s isFunc=%d\n",root->name.data(),isFunc);
+ if (root->section==Entry::MEMBERDOC_SEC)
+ {
+ //printf("Documentation for inline member `%s' found args=`%s'\n",
+ // root->name.data(),root->args.data());
+ //if (root->relates.length()) printf(" Relates %s\n",root->relates.data());
+ if (root->type.isEmpty())
+ {
+ findMember(rootNav,root->name+root->args+root->exception,FALSE,isFunc);
+ }
+ else
+ {
+ findMember(rootNav,root->type+" "+root->name+root->args+root->exception,FALSE,isFunc);
+ }
+ }
+ else if (root->section==Entry::OVERLOADDOC_SEC)
+ {
+ //printf("Overloaded member %s found\n",root->name.data());
+ findMember(rootNav,root->name,TRUE,isFunc);
+ }
+ else if
+ ((root->section==Entry::FUNCTION_SEC // function
+ ||
+ (root->section==Entry::VARIABLE_SEC && // variable
+ !root->type.isEmpty() && // with a type
+ g_compoundKeywordDict.find(root->type)==0 // that is not a keyword
+ // (to skip forward declaration of class etc.)
+ )
+ )
+ )
+ {
+ //printf("Documentation for member `%s' found args=`%s' excp=`%s'\n",
+ // root->name.data(),root->args.data(),root->exception.data());
+ //if (root->relates.length()) printf(" Relates %s\n",root->relates.data());
+ //printf("Inside=%s\n Relates=%s\n",root->inside.data(),root->relates.data());
+ if (root->type=="friend class" || root->type=="friend struct" ||
+ root->type=="friend union")
+ {
+ findMember(rootNav,
+ root->type+" "+
+ root->name,
+ FALSE,FALSE);
+
+ }
+ else if (!root->type.isEmpty())
+ {
+ findMember(rootNav,
+ root->type+" "+
+ root->inside+
+ root->name+
+ root->args+
+ root->exception,
+ FALSE,isFunc);
+ }
+ else
+ {
+ findMember(rootNav,
+ root->inside+
+ root->name+
+ root->args+
+ root->exception,
+ FALSE,isFunc);
+ }
+ }
+ else if (root->section==Entry::DEFINE_SEC && !root->relates.isEmpty())
+ {
+ findMember(rootNav,root->name+root->args,FALSE,!root->args.isEmpty());
+ }
+ else if (root->section==Entry::VARIABLEDOC_SEC)
+ {
+ //printf("Documentation for variable %s found\n",root->name.data());
+ //if (!root->relates.isEmpty()) printf(" Relates %s\n",root->relates.data());
+ findMember(rootNav,root->name,FALSE,FALSE);
+ }
+ else
+ {
+ // skip section
+ //printf("skip section\n");
+ }
+}
+
+static void findMemberDocumentation(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::MEMBERDOC_SEC ||
+ rootNav->section()==Entry::OVERLOADDOC_SEC ||
+ rootNav->section()==Entry::FUNCTION_SEC ||
+ rootNav->section()==Entry::VARIABLE_SEC ||
+ rootNav->section()==Entry::VARIABLEDOC_SEC ||
+ rootNav->section()==Entry::DEFINE_SEC
+ )
+ {
+ rootNav->loadEntry(g_storage);
+
+ filterMemberDocumentation(rootNav);
+
+ rootNav->releaseEntry();
+ }
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ EntryNav *e;
+ for (;(e=eli.current());++eli)
+ {
+ if (e->section()!=Entry::ENUM_SEC) findMemberDocumentation(e);
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+
+static void findObjCMethodDefinitions(EntryNav *rootNav)
+{
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ EntryNav *objCImplNav;
+ for (;(objCImplNav=eli.current());++eli)
+ {
+ if (objCImplNav->section()==Entry::OBJCIMPL_SEC && objCImplNav->children())
+ {
+ EntryNavListIterator seli(*objCImplNav->children());
+ EntryNav *objCMethodNav;
+ for (;(objCMethodNav=seli.current());++seli)
+ {
+ if (objCMethodNav->section()==Entry::FUNCTION_SEC)
+ {
+ objCMethodNav->loadEntry(g_storage);
+ Entry *objCMethod = objCMethodNav->entry();
+
+ //Printf(" Found ObjC method definition %s\n",objCMethod->name.data());
+ findMember(objCMethodNav, objCMethod->type+" "+objCImplNav->name()+"::"+
+ objCMethod->name+" "+objCMethod->args, FALSE,TRUE);
+ objCMethod->section=Entry::EMPTY_SEC;
+
+ objCMethodNav->releaseEntry();
+ }
+ }
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+// find and add the enumeration to their classes, namespaces or files
+
+static void findEnums(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::ENUM_SEC)
+ // non anonymous enumeration
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ MemberDef *md=0;
+ ClassDef *cd=0;
+ FileDef *fd=0;
+ NamespaceDef *nd=0;
+ MemberNameSDict *mnsd=0;
+ bool isGlobal;
+ bool isRelated=FALSE;
+ bool isMemberOf=FALSE;
+ //printf("Found enum with name `%s' relates=%s\n",root->name.data(),root->relates.data());
+ int i;
+
+ QCString name;
+ QCString scope;
+
+ if ((i=root->name.findRev("::"))!=-1) // scope is specified
+ {
+ scope=root->name.left(i); // extract scope
+ name=root->name.right(root->name.length()-i-2); // extract name
+ if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ }
+ else // no scope, check the scope in which the docs where found
+ {
+ if (( rootNav->parent()->section() & Entry::SCOPE_MASK )
+ && !rootNav->parent()->name().isEmpty()
+ ) // found enum docs inside a compound
+ {
+ scope=rootNav->parent()->name();
+ if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ }
+ name=root->name;
+ }
+
+ if (!root->relates.isEmpty())
+ { // related member, prefix user specified scope
+ isRelated=TRUE;
+ isMemberOf=(root->relatesType == MemberOf);
+ if (getClass(root->relates)==0 && !scope.isEmpty())
+ scope=mergeScopes(scope,root->relates);
+ else
+ scope=root->relates.copy();
+ if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ }
+
+ if (cd && !name.isEmpty()) // found a enum inside a compound
+ {
+ //printf("Enum `%s'::`%s'\n",cd->name(),name.data());
+ fd=0;
+ mnsd=Doxygen::memberNameSDict;
+ isGlobal=FALSE;
+ }
+ else if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') // found enum inside namespace
+ {
+ mnsd=Doxygen::functionNameSDict;
+ isGlobal=TRUE;
+ }
+ else // found a global enum
+ {
+ fd=rootNav->fileDef();
+ mnsd=Doxygen::functionNameSDict;
+ isGlobal=TRUE;
+ }
+
+ if (!name.isEmpty())
+ {
+ // new enum type
+ md = new MemberDef(
+ root->fileName,root->startLine,
+ 0,name,0,0,
+ root->protection,Normal,FALSE,
+ isMemberOf ? Foreign : isRelated ? Related : Member,
+ MemberDef::Enumeration,
+ 0,0);
+ md->setTagInfo(rootNav->tagInfo());
+ if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodyDef(rootNav->fileDef());
+ //printf("Enum %s definition at line %d of %s: protection=%d\n",
+ // root->name.data(),root->bodyLine,root->fileName.data(),root->protection);
+ md->addSectionsToDefinition(root->anchors);
+ md->setMemberGroupId(root->mGrpId);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+ //printf("%s::setRefItems(%d)\n",md->name().data(),root->sli?root->sli->count():-1);
+ md->setRefItems(root->sli);
+ //printf("found enum %s nd=%p\n",name.data(),nd);
+ bool defSet=FALSE;
+ if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
+ {
+ if (isRelated || Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ md->setDefinition(name);
+ }
+ else
+ {
+ md->setDefinition(nd->name()+"::"+name);
+ }
+ //printf("definition=%s\n",md->definition());
+ defSet=TRUE;
+ md->setNamespace(nd);
+ nd->insertMember(md);
+ }
+
+ // even if we have already added the enum to a namespace, we still
+ // also want to add it to other appropriate places such as file
+ // or class.
+ if (isGlobal)
+ {
+ if (!defSet) md->setDefinition(name);
+ if (fd==0 && rootNav->parent())
+ {
+ fd=rootNav->parent()->fileDef();
+ }
+ if (fd)
+ {
+ md->setFileDef(fd);
+ fd->insertMember(md);
+ }
+ }
+ else if (cd)
+ {
+ if (isRelated || Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ md->setDefinition(name);
+ }
+ else
+ {
+ md->setDefinition(cd->name()+"::"+name);
+ }
+ cd->insertMember(md);
+ cd->insertUsedFile(root->fileName);
+ }
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+
+ //printf("Adding member=%s\n",md->name().data());
+ MemberName *mn;
+ if ((mn=(*mnsd)[name]))
+ {
+ // this is used if the same enum is in multiple namespaces/classes
+ mn->append(md);
+ }
+ else // new enum name
+ {
+ mn = new MemberName(name);
+ mn->append(md);
+ mnsd->append(name,mn);
+ //printf("add %s to new memberName. Now %d members\n",
+ // name.data(),mn->count());
+ }
+ addMemberToGroups(root,md);
+
+#if 0
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ EntryNav *e;
+ for (;(e=eli.current());++eli)
+ {
+ //printf("e->name=%s isRelated=%d\n",e->name.data(),isRelated);
+ MemberName *fmn=0;
+ MemberNameSDict *emnsd = isRelated ? Doxygen::functionNameSDict : mnsd;
+ if (!e->name().isEmpty() && (fmn=(*emnsd)[e->name()]))
+ // get list of members with the same name as the field
+ {
+ MemberNameIterator fmni(*fmn);
+ MemberDef *fmd;
+ for (fmni.toFirst(); (fmd=fmni.current()) ; ++fmni)
+ {
+ if (fmd->isEnumValue())
+ {
+ //printf("found enum value with same name\n");
+ if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
+ {
+ NamespaceDef *fnd=fmd->getNamespaceDef();
+ if (fnd==nd) // enum value is inside a namespace
+ {
+ md->insertEnumField(fmd);
+ fmd->setEnumScope(md);
+ }
+ }
+ else if (isGlobal)
+ {
+ FileDef *ffd=fmd->getFileDef();
+ if (ffd==fd) // enum value has file scope
+ {
+ md->insertEnumField(fmd);
+ fmd->setEnumScope(md);
+ }
+ }
+ else if (isRelated && cd) // reparent enum value to
+ // match the enum's scope
+ {
+ md->insertEnumField(fmd); // add field def to list
+ fmd->setEnumScope(md); // cross ref with enum name
+ fmd->setEnumClassScope(cd); // cross ref with enum name
+ fmd->setOuterScope(cd);
+ fmd->makeRelated();
+ cd->insertMember(fmd);
+ }
+ else
+ {
+ ClassDef *fcd=fmd->getClassDef();
+ if (fcd==cd) // enum value is inside a class
+ {
+ //printf("Inserting enum field %s in enum scope %s\n",
+ // fmd->name().data(),md->name().data());
+ md->insertEnumField(fmd); // add field def to list
+ fmd->setEnumScope(md); // cross ref with enum name
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+#endif
+ }
+
+ rootNav->releaseEntry();
+ }
+ else
+ {
+ RECURSE_ENTRYTREE(findEnums,rootNav);
+ }
+}
+
+//----------------------------------------------------------------------
+
+static void addEnumValuesToEnums(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::ENUM_SEC)
+ // non anonymous enumeration
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ ClassDef *cd=0;
+ FileDef *fd=0;
+ NamespaceDef *nd=0;
+ MemberNameSDict *mnsd=0;
+ bool isGlobal;
+ bool isRelated=FALSE;
+ //printf("Found enum with name `%s' relates=%s\n",root->name.data(),root->relates.data());
+ int i;
+
+ QCString name;
+ QCString scope;
+
+ if ((i=root->name.findRev("::"))!=-1) // scope is specified
+ {
+ scope=root->name.left(i); // extract scope
+ name=root->name.right(root->name.length()-i-2); // extract name
+ if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ }
+ else // no scope, check the scope in which the docs where found
+ {
+ if (( rootNav->parent()->section() & Entry::SCOPE_MASK )
+ && !rootNav->parent()->name().isEmpty()
+ ) // found enum docs inside a compound
+ {
+ scope=rootNav->parent()->name();
+ if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ }
+ name=root->name;
+ }
+
+ if (!root->relates.isEmpty())
+ { // related member, prefix user specified scope
+ isRelated=TRUE;
+ if (getClass(root->relates)==0 && !scope.isEmpty())
+ scope=mergeScopes(scope,root->relates);
+ else
+ scope=root->relates.copy();
+ if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
+ }
+
+ if (cd && !name.isEmpty()) // found a enum inside a compound
+ {
+ //printf("Enum in class `%s'::`%s'\n",cd->name().data(),name.data());
+ fd=0;
+ mnsd=Doxygen::memberNameSDict;
+ isGlobal=FALSE;
+ }
+ else if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') // found enum inside namespace
+ {
+ //printf("Enum in namespace `%s'::`%s'\n",nd->name().data(),name.data());
+ mnsd=Doxygen::functionNameSDict;
+ isGlobal=TRUE;
+ }
+ else // found a global enum
+ {
+ fd=rootNav->fileDef();
+ //printf("Enum in file `%s': `%s'\n",fd->name().data(),name.data());
+ mnsd=Doxygen::functionNameSDict;
+ isGlobal=TRUE;
+ }
+
+ if (!name.isEmpty())
+ {
+ MemberName *mn = mnsd->find(name); // for all members with this name
+ if (mn)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
+ for (mni.toFirst(); (md=mni.current()) ; ++mni) // for each enum in this list
+ {
+ if (md->isEnumerate() && rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children()); // for each enum value
+ EntryNav *e;
+ for (;(e=eli.current());++eli)
+ {
+ SrcLangExt sle;
+ if (rootNav->fileDef() &&
+ ( (sle=getLanguageFromFileName(rootNav->fileDef()->name()))==SrcLangExt_CSharp
+ || sle==SrcLangExt_Java || sle==SrcLangExt_XML
+ )
+ )
+ {
+ // Unlike C++, for C# enum value are only inside the enum
+ // scope, so we must create them here and only add them to the
+ // enum
+ e->loadEntry(g_storage);
+ Entry *root = e->entry();
+ if (md->qualifiedName()==rootNav->name()) // enum value scope matches that of the enum
+ {
+ MemberDef *fmd=new MemberDef(
+ root->fileName,root->startLine,
+ root->type,root->name,root->args,0,
+ Public, Normal,root->stat,Member,
+ MemberDef::EnumValue,0,0);
+ if (md->getClassDef()) fmd->setMemberClass(md->getClassDef());
+ else if (md->getNamespaceDef()) fmd->setNamespace(md->getNamespaceDef());
+ else if (md->getFileDef()) fmd->setFileDef(md->getFileDef());
+ fmd->setOuterScope(md->getOuterScope());
+ fmd->setTagInfo(e->tagInfo());
+ fmd->setDocumentation(root->doc,root->docFile,root->docLine);
+ fmd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ fmd->addSectionsToDefinition(root->anchors);
+ fmd->setInitializer(root->initializer);
+ fmd->setMaxInitLines(root->initLines);
+ fmd->setMemberGroupId(root->mGrpId);
+ fmd->setExplicitExternal(root->explicitExternal);
+ fmd->setRefItems(root->sli);
+ if (fmd)
+ {
+ md->insertEnumField(fmd);
+ fmd->setEnumScope(md);
+ }
+ }
+ e->releaseEntry();
+ }
+ else
+ {
+ //printf("e->name=%s isRelated=%d\n",e->name().data(),isRelated);
+ MemberName *fmn=0;
+ MemberNameSDict *emnsd = isRelated ? Doxygen::functionNameSDict : mnsd;
+ if (!e->name().isEmpty() && (fmn=(*emnsd)[e->name()]))
+ // get list of members with the same name as the field
+ {
+ MemberNameIterator fmni(*fmn);
+ MemberDef *fmd;
+ for (fmni.toFirst(); (fmd=fmni.current()) ; ++fmni)
+ {
+ if (fmd->isEnumValue() && fmd->getOuterScope()==md->getOuterScope()) // in same scope
+ {
+ //printf("found enum value with same name %s in scope %s\n",
+ // fmd->name().data(),fmd->getOuterScope()->name().data());
+ if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
+ {
+ NamespaceDef *fnd=fmd->getNamespaceDef();
+ if (fnd==nd) // enum value is inside a namespace
+ {
+ md->insertEnumField(fmd);
+ fmd->setEnumScope(md);
+ }
+ }
+ else if (isGlobal)
+ {
+ FileDef *ffd=fmd->getFileDef();
+ if (ffd==fd) // enum value has file scope
+ {
+ md->insertEnumField(fmd);
+ fmd->setEnumScope(md);
+ }
+ }
+ else if (isRelated && cd) // reparent enum value to
+ // match the enum's scope
+ {
+ md->insertEnumField(fmd); // add field def to list
+ fmd->setEnumScope(md); // cross ref with enum name
+ fmd->setEnumClassScope(cd); // cross ref with enum name
+ fmd->setOuterScope(cd);
+ fmd->makeRelated();
+ cd->insertMember(fmd);
+ }
+ else
+ {
+ ClassDef *fcd=fmd->getClassDef();
+ if (fcd==cd) // enum value is inside a class
+ {
+ //printf("Inserting enum field %s in enum scope %s\n",
+ // fmd->name().data(),md->name().data());
+ md->insertEnumField(fmd); // add field def to list
+ fmd->setEnumScope(md); // cross ref with enum name
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ else
+ {
+ RECURSE_ENTRYTREE(addEnumValuesToEnums,rootNav);
+ }
+}
+
+
+//----------------------------------------------------------------------
+// find the documentation blocks for the enumerations
+
+static void findEnumDocumentation(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::ENUMDOC_SEC
+ && !rootNav->name().isEmpty()
+ && rootNav->name().at(0)!='@' // skip anonymous enums
+ )
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ //printf("Found docs for enum with name `%s' in context %s\n",
+ // root->name.data(),root->parent->name.data());
+ int i;
+ QCString name;
+ QCString scope;
+ if ((i=root->name.findRev("::"))!=-1) // scope is specified as part of the name
+ {
+ name=root->name.right(root->name.length()-i-2); // extract name
+ scope=root->name.left(i); // extract scope
+ //printf("Scope=`%s' Name=`%s'\n",scope.data(),name.data());
+ }
+ else // just the name
+ {
+ name=root->name;
+ }
+ if (( rootNav->parent()->section() & Entry::SCOPE_MASK )
+ && !rootNav->parent()->name().isEmpty()
+ ) // found enum docs inside a compound
+ {
+ if (!scope.isEmpty()) scope.prepend("::");
+ scope.prepend(rootNav->parent()->name());
+ }
+ ClassDef *cd=getClass(scope);
+
+ if (!name.isEmpty())
+ {
+ bool found=FALSE;
+ if (cd)
+ {
+ //printf("Enum: scope=`%s' name=`%s'\n",cd->name(),name.data());
+ QCString className=cd->name().copy();
+ MemberName *mn=Doxygen::memberNameSDict->find(name);
+ if (mn)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
+ for (mni.toFirst();(md=mni.current()) && !found;++mni)
+ {
+ ClassDef *cd=md->getClassDef();
+ if (cd && cd->name()==className && md->isEnumerate())
+ {
+ // documentation outside a compound overrides the documentation inside it
+#if 0
+ if (!md->documentation() || rootNav->parent()->name().isEmpty())
+#endif
+ {
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
+ }
+
+ // brief descriptions inside a compound override the documentation
+ // outside it
+#if 0
+ if (!md->briefDescription() || !rootNav->parent()->name().isEmpty())
+#endif
+ {
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ }
+
+ if (!md->inbodyDocumentation() || !rootNav->parent()->name().isEmpty())
+ {
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ }
+
+ if (root->mGrpId!=-1 && md->getMemberGroupId()==-1)
+ {
+ md->setMemberGroupId(root->mGrpId);
+ }
+
+ md->addSectionsToDefinition(root->anchors);
+ md->setRefItems(root->sli);
+
+ GroupDef *gd=md->getGroupDef();
+ if (gd==0 &&root->groups->first()!=0) // member not grouped but out-of-line documentation is
+ {
+ addMemberToGroups(root,md);
+ }
+
+ found=TRUE;
+ }
+ }
+ }
+ else
+ {
+ //printf("MemberName %s not found!\n",name.data());
+ }
+ }
+ else // enum outside class
+ {
+ //printf("Enum outside class: %s grpId=%d\n",name.data(),root->mGrpId);
+ MemberName *mn=Doxygen::functionNameSDict->find(name);
+ if (mn)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
+ for (mni.toFirst();(md=mni.current()) && !found;++mni)
+ {
+ if (md->isEnumerate())
+ {
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->addSectionsToDefinition(root->anchors);
+ md->setMemberGroupId(root->mGrpId);
+
+ GroupDef *gd=md->getGroupDef();
+ if (gd==0 && root->groups->first()!=0) // member not grouped but out-of-line documentation is
+ {
+ addMemberToGroups(root,md);
+ }
+
+ found=TRUE;
+ }
+ }
+ }
+ }
+ if (!found)
+ {
+ warn(root->fileName,root->startLine,
+ "warning: Documentation for undefined enum `%s' found.",
+ name.data()
+ );
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(findEnumDocumentation,rootNav);
+}
+
+// seach for each enum (member or function) in mnl if it has documented
+// enum values.
+static void findDEV(const MemberNameSDict &mnsd)
+{
+ MemberName *mn;
+ MemberNameSDict::Iterator mnli(mnsd);
+ // for each member name
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
+ {
+ MemberDef *md;
+ MemberNameIterator mni(*mn);
+ // for each member definition
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ if (md->isEnumerate()) // member is an enum
+ {
+ LockingPtr<MemberList> fmdl = md->enumFieldList();
+ int documentedEnumValues=0;
+ if (fmdl!=0) // enum has values
+ {
+ MemberListIterator fmni(*fmdl);
+ MemberDef *fmd;
+ // for each enum value
+ for (fmni.toFirst();(fmd=fmni.current());++fmni)
+ {
+ if (fmd->isLinkableInProject()) documentedEnumValues++;
+ }
+ }
+ // at least one enum value is documented
+ if (documentedEnumValues>0) md->setDocumentedEnumValues(TRUE);
+ }
+ }
+ }
+}
+
+// seach for each enum (member or function) if it has documented enum
+// values.
+static void findDocumentedEnumValues()
+{
+ findDEV(*Doxygen::memberNameSDict);
+ findDEV(*Doxygen::functionNameSDict);
+}
+
+//----------------------------------------------------------------------
+
+static void addMembersToIndex()
+{
+ MemberName *mn;
+ MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
+ // for each member name
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
+ {
+ MemberDef *md;
+ MemberNameIterator mni(*mn);
+ // for each member definition
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ addClassMemberNameToIndex(md);
+ }
+ }
+ MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
+ // for each member name
+ for (fnli.toFirst();(mn=fnli.current());++fnli)
+ {
+ MemberDef *md;
+ MemberNameIterator mni(*mn);
+ // for each member definition
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ if (md->getNamespaceDef())
+ {
+ addNamespaceMemberNameToIndex(md);
+ }
+ else
+ {
+ addFileMemberNameToIndex(md);
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------
+// computes the relation between all members. For each member `m'
+// the members that override the implementation of `m' are searched and
+// the member that `m' overrides is searched.
+
+static void computeMemberRelations()
+{
+ MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
+ MemberName *mn;
+ for ( ; (mn=mnli.current()) ; ++mnli ) // for each member name
+ {
+ MemberNameIterator mdi(*mn);
+ MemberDef *md;
+ for ( ; (md=mdi.current()) ; ++mdi ) // for each member with a specific name
+ {
+ MemberDef *bmd = mn->first(); // for each other member with the same name
+ while (bmd)
+ {
+ ClassDef *mcd = md->getClassDef();
+ if (mcd && mcd->baseClasses())
+ {
+ ClassDef *bmcd = bmd->getClassDef();
+ //printf("Check relation between `%s'::`%s' (%p) and `%s'::`%s' (%p)\n",
+ // mcd->name().data(),md->name().data(),md,
+ // bmcd->name().data(),bmd->name().data(),bmd
+ // );
+ if (md!=bmd && bmcd && mcd && bmcd!=mcd && mcd->isBaseClass(bmcd,TRUE))
+ {
+ //printf(" derived scope\n");
+ LockingPtr<ArgumentList> bmdAl = bmd->argumentList();
+ LockingPtr<ArgumentList> mdAl = md->argumentList();
+ //printf(" Base argList=`%s'\n Super argList=`%s'\n",
+ // argListToString(bmdAl.pointer()).data(),
+ // argListToString(mdAl.pointer()).data()
+ // );
+ if (
+ matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmdAl.pointer(),
+ md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
+ TRUE
+ )
+ )
+ {
+ //printf(" match found!\n");
+ if (mcd && bmcd &&
+ mcd->isLinkable() && bmcd->isLinkable()
+ )
+ {
+ MemberDef *rmd;
+ if ((rmd=md->reimplements())==0 ||
+ minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->getClassDef())
+ )
+ {
+ //printf("setting (new) reimplements member\n");
+ md->setReimplements(bmd);
+ }
+ //printf("%s: add reimplements member %s\n",mcd->name().data(),bmcd->name().data());
+ //md->setImplements(bmd);
+ //printf("%s: add reimplementedBy member %s\n",bmcd->name().data(),mcd->name().data());
+ bmd->insertReimplementedBy(md);
+ }
+ }
+ }
+ }
+ bmd = mn->next();
+ }
+ }
+ }
+}
+
+
+//----------------------------------------------------------------------------
+//static void computeClassImplUsageRelations()
+//{
+// ClassDef *cd;
+// ClassSDict::Iterator cli(*Doxygen::classSDict);
+// for (;(cd=cli.current());++cli)
+// {
+// cd->determineImplUsageRelation();
+// }
+//}
+
+//----------------------------------------------------------------------------
+
+static void createTemplateInstanceMembers()
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ // for each class
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ // that is a template
+ QDict<ClassDef> *templInstances = cd->getTemplateInstances();
+ if (templInstances)
+ {
+ QDictIterator<ClassDef> qdi(*templInstances);
+ ClassDef *tcd=0;
+ // for each instance of the template
+ for (qdi.toFirst();(tcd=qdi.current());++qdi)
+ {
+ tcd->addMembersToTemplateInstance(cd,qdi.currentKey());
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+// builds the list of all members for each class
+
+static void buildCompleteMemberLists()
+{
+ ClassDef *cd;
+ // merge members of categories into the class they extend
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ int i=cd->name().find('(');
+ if (i!=-1) // it is an Objective-C category
+ {
+ QCString baseName=cd->name().left(i);
+ ClassDef *baseClass=Doxygen::classSDict->find(baseName);
+ if (baseClass)
+ {
+ //printf("*** merging members of category %s into %s\n",
+ // cd->name().data(),baseClass->name().data());
+ baseClass->mergeCategory(cd);
+ }
+ }
+ }
+ // merge the member list of base classes into the inherited classes.
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (// !cd->isReference() && // not an external class
+ cd->subClasses()==0 && // is a root of the hierarchy
+ cd->baseClasses()) // and has at least one base class
+ {
+ //printf("*** merging members for %s\n",cd->name().data());
+ cd->mergeMembers();
+ }
+ }
+ // now sort the member list of all classes.
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (cd->memberNameInfoSDict()) cd->memberNameInfoSDict()->sort();
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void generateFileSources()
+{
+ if (documentedHtmlFiles==0) return;
+ if (Doxygen::inputNameList->count()>0)
+ {
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ if (fd->generateSourceFile()) // sources need to be shown in the output
+ {
+ msg("Generating code for file %s...\n",fd->docName().data());
+ fd->writeSource(*g_outputList);
+ }
+ else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
+ // we needed to parse the sources even if we do not show them
+ {
+ msg("Parsing code for file %s...\n",fd->docName().data());
+ fd->parseSource();
+ }
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void generateFileDocs()
+{
+ if (documentedHtmlFiles==0) return;
+
+ if (Doxygen::inputNameList->count()>0)
+ {
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (fni.toFirst();(fd=fni.current());++fni)
+ {
+ bool doc = fd->isLinkableInProject();
+ if (doc)
+ {
+ msg("Generating docs for file %s...\n",fd->docName().data());
+ fd->writeDocumentation(*g_outputList);
+ }
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void addSourceReferences()
+{
+ // add source references for class definitions
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ FileDef *fd=cd->getBodyDef();
+ if (fd && cd->isLinkableInProject() && cd->getStartBodyLine()!=-1)
+ {
+ fd->addSourceRef(cd->getStartBodyLine(),cd,0);
+ }
+ }
+ // add source references for namespace definitions
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd=0;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ FileDef *fd=nd->getBodyDef();
+ if (fd && nd->isLinkableInProject() && nd->getStartBodyLine()!=-1)
+ {
+ fd->addSourceRef(nd->getStartBodyLine(),nd,0);
+ }
+ }
+
+ // add source references for member names
+ MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
+ MemberName *mn=0;
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md=0;
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ //printf("class member %s: def=%s body=%d link?=%d\n",
+ // md->name().data(),
+ // md->getBodyDef()?md->getBodyDef()->name().data():"<none>",
+ // md->getStartBodyLine(),md->isLinkableInProject());
+ FileDef *fd=md->getBodyDef();
+ if (fd &&
+ md->getStartBodyLine()!=-1 &&
+ md->isLinkableInProject() &&
+ (fd->generateSourceFile() || Doxygen::parseSourcesNeeded)
+ )
+ {
+ //printf("Found member `%s' in file `%s' at line `%d' def=%s\n",
+ // md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data());
+ fd->addSourceRef(md->getStartBodyLine(),md->getOuterScope(),md);
+ }
+ }
+ }
+ MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
+ for (fnli.toFirst();(mn=fnli.current());++fnli)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md=0;
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ FileDef *fd=md->getBodyDef();
+ //printf("member %s body=[%d,%d] fd=%p link=%d parseSources=%d\n",
+ // md->name().data(),
+ // md->getStartBodyLine(),md->getEndBodyLine(),fd,
+ // md->isLinkableInProject(),
+ // Doxygen::parseSourcesNeeded);
+ if (fd &&
+ md->getStartBodyLine()!=-1 &&
+ md->isLinkableInProject() &&
+ (fd->generateSourceFile() || Doxygen::parseSourcesNeeded)
+ )
+ {
+ //printf("Found member `%s' in file `%s' at line `%d' def=%s\n",
+ // md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data());
+ fd->addSourceRef(md->getStartBodyLine(),md->getOuterScope(),md);
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void sortMemberLists()
+{
+ // sort class member lists
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ cd->sortMemberLists();
+ }
+
+ // sort namespace member lists
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd=0;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ nd->sortMemberLists();
+ }
+
+ // sort file member lists
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ fd->sortMemberLists();
+ }
+ }
+
+ // sort group member lists
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ gd->sortMemberLists();
+ }
+}
+
+//----------------------------------------------------------------------------
+// generate the documentation of all classes
+
+static void generateClassList(ClassSDict &classSDict)
+{
+ ClassSDict::Iterator cli(classSDict);
+ for ( ; cli.current() ; ++cli )
+ {
+ ClassDef *cd=cli.current();
+
+ //printf("cd=%s getOuterScope=%p global=%p\n",cd->name().data(),cd->getOuterScope(),Doxygen::globalScope);
+ if ((cd->getOuterScope()==0 || // <-- should not happen, but can if we read an old tag file
+ cd->getOuterScope()==Doxygen::globalScope // only look at global classes
+ ) && !cd->isHidden() && !cd->isEmbeddedInGroupDocs()
+ )
+ {
+ // skip external references, anonymous compounds and
+ // template instances
+ if ( cd->isLinkableInProject() && cd->templateMaster()==0)
+ {
+ msg("Generating docs for compound %s...\n",cd->name().data());
+
+ cd->writeDocumentation(*g_outputList);
+ cd->writeMemberList(*g_outputList);
+ }
+ // even for undocumented classes, the inner classes can be documented.
+ cd->writeDocumentationForInnerClasses(*g_outputList);
+ }
+ }
+}
+
+static void generateClassDocs()
+{
+ // write the installdox script if necessary
+ if (Config_getBool("GENERATE_HTML") &&
+ (Config_getList("TAGFILES").count()>0 ||
+ Config_getBool("SEARCHENGINE")
+ )
+ )
+ {
+ writeInstallScript();
+ }
+
+ msg("Generating annotated compound index...\n");
+ writeAnnotatedIndex(*g_outputList);
+
+ //if (Config_getBool("ALPHABETICAL_INDEX"))
+ //{
+ msg("Generating alphabetical compound index...\n");
+ writeAlphabeticalIndex(*g_outputList);
+ //}
+
+ msg("Generating hierarchical class index...\n");
+ writeHierarchicalIndex(*g_outputList);
+
+ msg("Generating member index...\n");
+ writeClassMemberIndex(*g_outputList);
+
+ if (Doxygen::exampleSDict->count()>0)
+ {
+ msg("Generating example index...\n");
+ }
+
+ generateClassList(*Doxygen::classSDict);
+ generateClassList(*Doxygen::hiddenClasses);
+}
+
+//----------------------------------------------------------------------------
+
+static void inheritDocumentation()
+{
+ MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
+ MemberName *mn;
+ //int count=0;
+ for (;(mn=mnli.current());++mnli)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
+ for (;(md=mni.current());++mni)
+ {
+ //printf("%04d Member `%s'\n",count++,md->name().data());
+ if (md->documentation().isEmpty() && md->briefDescription().isEmpty())
+ { // no documentation yet
+ MemberDef *bmd = md->reimplements();
+ while (bmd && bmd->documentation().isEmpty() &&
+ bmd->briefDescription().isEmpty()
+ )
+ { // search up the inheritance tree for a documentation member
+ //printf("bmd=%s class=%s\n",bmd->name().data(),bmd->getClassDef()->name().data());
+ bmd = bmd->reimplements();
+ }
+ if (bmd) // copy the documentation from the reimplemented member
+ {
+ md->setInheritsDocsFrom(bmd);
+ md->setDocumentation(bmd->documentation(),bmd->docFile(),bmd->docLine());
+ md->setDocsForDefinition(bmd->isDocsForDefinition());
+ md->setBriefDescription(bmd->briefDescription(),bmd->briefFile(),bmd->briefLine());
+ md->copyArgumentNames(bmd);
+ md->setInbodyDocumentation(bmd->inbodyDocumentation(),bmd->inbodyFile(),bmd->inbodyLine());
+ }
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void combineUsingRelations()
+{
+ // for each file
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (fni.toFirst();(fd=fni.current());++fni)
+ {
+ fd->visited=FALSE;
+ }
+ }
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (fni.toFirst();(fd=fni.current());++fni)
+ {
+ fd->combineUsingRelations();
+ }
+ }
+
+ // for each namespace
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for (nli.toFirst() ; (nd=nli.current()) ; ++nli )
+ {
+ nd->visited=FALSE;
+ }
+ for (nli.toFirst() ; (nd=nli.current()) ; ++nli )
+ {
+ nd->combineUsingRelations();
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void addMembersToMemberGroup()
+{
+ // for each class
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for ( ; (cd=cli.current()) ; ++cli )
+ {
+ cd->addMembersToMemberGroup();
+ }
+ // for each file
+ FileName *fn=Doxygen::inputNameList->first();
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ fd->addMembersToMemberGroup();
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ // for each namespace
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for ( ; (nd=nli.current()) ; ++nli )
+ {
+ nd->addMembersToMemberGroup();
+ }
+ // for each group
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ gd->addMembersToMemberGroup();
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void distributeMemberGroupDocumentation()
+{
+ // for each class
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for ( ; (cd=cli.current()) ; ++cli )
+ {
+ cd->distributeMemberGroupDocumentation();
+ }
+ // for each file
+ FileName *fn=Doxygen::inputNameList->first();
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ fd->distributeMemberGroupDocumentation();
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ // for each namespace
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for ( ; (nd=nli.current()) ; ++nli )
+ {
+ nd->distributeMemberGroupDocumentation();
+ }
+ // for each group
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ gd->distributeMemberGroupDocumentation();
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void findSectionsInDocumentation()
+{
+ // for each class
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for ( ; (cd=cli.current()) ; ++cli )
+ {
+ cd->findSectionsInDocumentation();
+ }
+ // for each file
+ FileName *fn=Doxygen::inputNameList->first();
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ fd->findSectionsInDocumentation();
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ // for each namespace
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for ( ; (nd=nli.current()) ; ++nli )
+ {
+ nd->findSectionsInDocumentation();
+ }
+ // for each group
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ gd->findSectionsInDocumentation();
+ }
+ // for each page
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ pd->findSectionsInDocumentation();
+ }
+ if (Doxygen::mainPage) Doxygen::mainPage->findSectionsInDocumentation();
+}
+
+static void flushCachedTemplateRelations()
+{
+ // remove all references to classes from the cache
+ // as there can be new template instances in the inheritance path
+ // to this class. Optimization: only remove those classes that
+ // have inheritance instances as direct or indirect sub classes.
+ QCacheIterator<LookupInfo> ci(Doxygen::lookupCache);
+ LookupInfo *li=0;
+ for (ci.toFirst();(li=ci.current());++ci)
+ {
+ if (li->classDef)
+ {
+ Doxygen::lookupCache.remove(ci.currentKey());
+ }
+ }
+ // remove all cached typedef resolutions whose target is a
+ // template class as this may now be a template instance
+ MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
+ MemberName *fn;
+ for (;(fn=fnli.current());++fnli) // for each global function name
+ {
+ MemberNameIterator fni(*fn);
+ MemberDef *fmd;
+ for (;(fmd=fni.current());++fni) // for each function with that name
+ {
+ if (fmd->isTypedefValCached())
+ {
+ ClassDef *cd = fmd->getCachedTypedefVal();
+ if (cd->isTemplate()) fmd->invalidateTypedefValCache();
+ }
+ }
+ }
+ MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
+ for (;(fn=mnli.current());++mnli) // for each class method name
+ {
+ MemberNameIterator mni(*fn);
+ MemberDef *fmd;
+ for (;(fmd=mni.current());++mni) // for each function with that name
+ {
+ if (fmd->isTypedefValCached())
+ {
+ ClassDef *cd = fmd->getCachedTypedefVal();
+ if (cd->isTemplate()) fmd->invalidateTypedefValCache();
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void flushUnresolvedRelations()
+{
+ // Remove all unresolved references to classes from the cache.
+ // This is needed before resolving the inheritance relations, since
+ // it would otherwise not find the inheritance relation
+ // for C in the example below, as B::I was already found to be unresolvable
+ // (which is correct if you igore the inheritance relation between A and B).
+ //
+ // class A { class I {} };
+ // class B : public A {};
+ // class C : public B::I {};
+ //
+ QCacheIterator<LookupInfo> ci(Doxygen::lookupCache);
+ LookupInfo *li=0;
+ for (ci.toFirst();(li=ci.current());++ci)
+ {
+ if (li->classDef==0 && li->typeDef==0)
+ {
+ Doxygen::lookupCache.remove(ci.currentKey());
+ }
+ }
+
+ MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
+ MemberName *fn;
+ for (;(fn=fnli.current());++fnli) // for each global function name
+ {
+ MemberNameIterator fni(*fn);
+ MemberDef *fmd;
+ for (;(fmd=fni.current());++fni) // for each function with that name
+ {
+ fmd->invalidateCachedArgumentTypes();
+ }
+ }
+ MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
+ for (;(fn=mnli.current());++mnli) // for each class method name
+ {
+ MemberNameIterator mni(*fn);
+ MemberDef *fmd;
+ for (;(fmd=mni.current());++mni) // for each function with that name
+ {
+ fmd->invalidateCachedArgumentTypes();
+ }
+ }
+
+}
+
+//----------------------------------------------------------------------------
+
+static void findDefineDocumentation(EntryNav *rootNav)
+{
+ if ((rootNav->section()==Entry::DEFINEDOC_SEC ||
+ rootNav->section()==Entry::DEFINE_SEC) && !rootNav->name().isEmpty()
+ )
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ //printf("found define `%s' `%s' brief=`%s' doc=`%s'\n",
+ // root->name.data(),root->args.data(),root->brief.data(),root->doc.data());
+
+ if (rootNav->tagInfo() && !root->name.isEmpty()) // define read from a tag file
+ {
+ MemberDef *md=new MemberDef("<tagfile>",1,
+ "#define",root->name,root->args,0,
+ Public,Normal,FALSE,Member,MemberDef::Define,0,0);
+ md->setTagInfo(rootNav->tagInfo());
+ //printf("Searching for `%s' fd=%p\n",filePathName.data(),fd);
+ md->setFileDef(rootNav->parent()->fileDef());
+ //printf("Adding member=%s\n",md->name().data());
+ MemberName *mn;
+ if ((mn=Doxygen::functionNameSDict->find(root->name)))
+ {
+ mn->append(md);
+ }
+ else
+ {
+ mn = new MemberName(root->name);
+ mn->append(md);
+ Doxygen::functionNameSDict->append(root->name,mn);
+ }
+ }
+ MemberName *mn=Doxygen::functionNameSDict->find(root->name);
+ if (mn)
+ {
+ int count=0;
+ MemberDef *md=mn->first();
+ while (md)
+ {
+ if (md->memberType()==MemberDef::Define) count++;
+ md=mn->next();
+ }
+ if (count==1)
+ {
+ md=mn->first();
+ while (md)
+ {
+ if (md->memberType()==MemberDef::Define)
+ {
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ if (md->inbodyDocumentation().isEmpty())
+ {
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ }
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodyDef(rootNav->fileDef());
+ md->addSectionsToDefinition(root->anchors);
+ md->setMaxInitLines(root->initLines);
+ md->setRefItems(root->sli);
+ if (root->mGrpId!=-1) md->setMemberGroupId(root->mGrpId);
+ addMemberToGroups(root,md);
+ }
+ md=mn->next();
+ }
+ }
+ else if (count>1 &&
+ (!root->doc.isEmpty() ||
+ !root->brief.isEmpty() ||
+ root->bodyLine!=-1
+ )
+ )
+ // multiple defines don't know where to add docs
+ // but maybe they are in different files together with their documentation
+ {
+ md=mn->first();
+ while (md)
+ {
+ if (md->memberType()==MemberDef::Define)
+ {
+ FileDef *fd=md->getFileDef();
+ if (fd && fd->absFilePath()==root->fileName)
+ // doc and define in the same file assume they belong together.
+ {
+#if 0
+ if (md->documentation().isEmpty())
+#endif
+ {
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(!root->proto);
+ }
+#if 0
+ if (md->briefDescription().isEmpty())
+#endif
+ {
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ }
+ if (md->inbodyDocumentation().isEmpty())
+ {
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ }
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setBodyDef(rootNav->fileDef());
+ md->addSectionsToDefinition(root->anchors);
+ md->setRefItems(root->sli);
+ if (root->mGrpId!=-1) md->setMemberGroupId(root->mGrpId);
+ addMemberToGroups(root,md);
+ }
+ }
+ md=mn->next();
+ }
+ //warn("warning: define %s found in the following files:\n",root->name.data());
+ //warn("Cannot determine where to add the documentation found "
+ // "at line %d of file %s. \n",
+ // root->startLine,root->fileName.data());
+ }
+ }
+ else if (!root->doc.isEmpty() || !root->brief.isEmpty()) // define not found
+ {
+ static bool preEnabled = Config_getBool("ENABLE_PREPROCESSING");
+ if (preEnabled)
+ {
+ warn(root->fileName,root->startLine,
+ "warning: documentation for unknown define %s found.\n",
+ root->name.data()
+ );
+ }
+ else
+ {
+ warn(root->fileName,root->startLine,
+ "warning: found documented #define but ignoring it because "
+ "ENABLE_PREPROCESSING is NO.\n",
+ root->name.data()
+ );
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(findDefineDocumentation,rootNav);
+}
+
+//----------------------------------------------------------------------------
+
+static void findDirDocumentation(EntryNav *rootNav)
+{
+ if (rootNav->section() == Entry::DIRDOC_SEC)
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ QCString normalizedName = root->name;
+ normalizedName = substitute(normalizedName,"\\","/");
+ //printf("root->docFile=%s normalizedName=%s\n",
+ // root->docFile.data(),normalizedName.data());
+ if (root->docFile==normalizedName) // current dir?
+ {
+ int lastSlashPos=normalizedName.findRev('/');
+ if (lastSlashPos!=-1) // strip file name
+ {
+ normalizedName=normalizedName.left(lastSlashPos);
+ }
+ }
+ if (normalizedName.at(normalizedName.length()-1)!='/')
+ {
+ normalizedName+='/';
+ }
+ DirDef *dir,*matchingDir=0;
+ SDict<DirDef>::Iterator sdi(*Doxygen::directories);
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ //printf("Dir: %s<->%s\n",dir->name().data(),normalizedName.data());
+ if (dir->name().right(normalizedName.length())==normalizedName)
+ {
+ if (matchingDir)
+ {
+ warn(root->fileName,root->startLine,
+ "warning: \\dir command matches multiple directories.\n"
+ " Applying the command for directory %s\n"
+ " Ignoring the command for directory %s\n",
+ matchingDir->name().data(),dir->name().data()
+ );
+ }
+ else
+ {
+ matchingDir=dir;
+ }
+ }
+ }
+ if (matchingDir)
+ {
+ //printf("Match for with dir %s\n",matchingDir->name().data());
+ matchingDir->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ matchingDir->setDocumentation(root->doc,root->docFile,root->docLine);
+ matchingDir->setRefItems(root->sli);
+ addDirToGroups(root,matchingDir);
+ }
+ else
+ {
+ warn(root->fileName,root->startLine,"warning: No matching "
+ "directory found for command \\dir %s\n",normalizedName.data());
+ }
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(findDirDocumentation,rootNav);
+}
+
+
+//----------------------------------------------------------------------------
+// create a (sorted) list of separate documentation pages
+
+static void buildPageList(EntryNav *rootNav)
+{
+ if (rootNav->section() == Entry::PAGEDOC_SEC)
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ if (!root->name.isEmpty())
+ {
+ addRelatedPage(rootNav);
+ }
+
+ rootNav->releaseEntry();
+ }
+ else if (rootNav->section() == Entry::MAINPAGEDOC_SEC)
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ QCString title=root->args.stripWhiteSpace();
+ if (title.isEmpty()) title=theTranslator->trMainPage();
+ QCString name = Config_getBool("GENERATE_TREEVIEW")?"main":"index";
+ addRefItem(root->sli,
+ name,
+ "page",
+ name,
+ title,
+ 0
+ );
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(buildPageList,rootNav);
+}
+
+static void findMainPage(EntryNav *rootNav)
+{
+ if (rootNav->section() == Entry::MAINPAGEDOC_SEC)
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ if (Doxygen::mainPage==0)
+ {
+ //printf("Found main page! \n======\n%s\n=======\n",root->doc.data());
+ QCString title=root->args.stripWhiteSpace();
+ QCString indexName=Config_getBool("GENERATE_TREEVIEW")?"main":"index";
+ Doxygen::mainPage = new PageDef(root->fileName,root->startLine,
+ indexName, root->brief+root->doc+root->inbodyDocs,title);
+ //setFileNameForSections(root->anchors,"index",Doxygen::mainPage);
+ Doxygen::mainPage->setFileName(indexName);
+ addPageToContext(Doxygen::mainPage,rootNav);
+
+ // a page name is a label as well!
+ SectionInfo *si=new SectionInfo(
+ indexName,
+ Doxygen::mainPage->name(),
+ Doxygen::mainPage->title(),
+ SectionInfo::Page);
+ Doxygen::sectionDict.insert(indexName,si);
+ Doxygen::mainPage->addSectionsToDefinition(root->anchors);
+ }
+ else
+ {
+ warn(root->fileName,root->startLine,
+ "warning: found more than one \\mainpage comment block! Skipping this "
+ "block."
+ );
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(findMainPage,rootNav);
+}
+
+static void computePageRelations(EntryNav *rootNav)
+{
+ if ((rootNav->section()==Entry::PAGEDOC_SEC ||
+ rootNav->section()==Entry::MAINPAGEDOC_SEC
+ )
+ && !rootNav->name().isEmpty()
+ )
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ PageDef *pd = root->section==Entry::PAGEDOC_SEC ?
+ Doxygen::pageSDict->find(root->name) :
+ Doxygen::mainPage;
+ if (pd)
+ {
+ QListIterator<BaseInfo> bii(*root->extends);
+ BaseInfo *bi;
+ for (bii.toFirst();(bi=bii.current());++bii)
+ {
+ PageDef *subPd = Doxygen::pageSDict->find(bi->name);
+ if (subPd)
+ {
+ pd->addInnerCompound(subPd);
+ //printf("*** Added subpage relation: %s->%s\n",
+ // pd->name().data(),subPd->name().data());
+ }
+ }
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(computePageRelations,rootNav);
+}
+
+static void checkPageRelations()
+{
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ Definition *ppd = pd->getOuterScope();
+ while (ppd)
+ {
+ if (ppd==pd)
+ {
+ err("warning: page defined at line %d of file %s with label %s is a subpage "
+ "of itself! Please remove this cyclic dependency.\n",
+ pd->docLine(),pd->docFile().data(),pd->name().data());
+ exit(1);
+ }
+ ppd=ppd->getOuterScope();
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void resolveUserReferences()
+{
+ QDictIterator<SectionInfo> sdi(Doxygen::sectionDict);
+ SectionInfo *si;
+ for (;(si=sdi.current());++sdi)
+ {
+ //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n",
+ // si->label.data(),si->definition?si->definition->name().data():"<none>",
+ // si->fileName.data());
+ PageDef *pd=0;
+
+ // hack: the items of a todo/test/bug/deprecated list are all fragments from
+ // different files, so the resulting section's all have the wrong file
+ // name (not from the todo/test/bug/deprecated list, but from the file in
+ // which they are defined). We correct this here by looking at the
+ // generated section labels!
+ QDictIterator<RefList> rli(*Doxygen::xrefLists);
+ RefList *rl;
+ for (rli.toFirst();(rl=rli.current());++rli)
+ {
+ QCString label="_"+rl->listName(); // "_todo", "_test", ...
+ if (si->label.left(label.length())==label)
+ {
+ si->fileName=rl->listName();
+ si->generated=TRUE;
+ break;
+ }
+ }
+
+ //printf("start: si->label=%s si->fileName=%s\n",si->label.data(),si->fileName.data());
+ if (!si->generated)
+ {
+ // if this section is in a page and the page is in a group, then we
+ // have to adjust the link file name to point to the group.
+ if (!si->fileName.isEmpty() &&
+ (pd=Doxygen::pageSDict->find(si->fileName)) &&
+ pd->getGroupDef())
+ {
+ si->fileName=pd->getGroupDef()->getOutputFileBase().copy();
+ }
+
+ if (si->definition)
+ {
+ // TODO: there should be one function in Definition that returns
+ // the file to link to, so we can avoid the following tests.
+ GroupDef *gd=0;
+ if (si->definition->definitionType()==Definition::TypeMember)
+ {
+ gd = ((MemberDef *)si->definition)->getGroupDef();
+ }
+
+ if (gd)
+ {
+ si->fileName=gd->getOutputFileBase().copy();
+ }
+ else
+ {
+ //si->fileName=si->definition->getOutputFileBase().copy();
+ //printf("Setting si->fileName to %s\n",si->fileName.data());
+ }
+ }
+ }
+ //printf("end: si->label=%s si->fileName=%s\n",si->label.data(),si->fileName.data());
+ }
+}
+
+
+//----------------------------------------------------------------------------
+// generate all separate documentation pages
+
+
+static void generatePageDocs()
+{
+ //printf("documentedPages=%d real=%d\n",documentedPages,Doxygen::pageSDict->count());
+ if (documentedPages==0) return;
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ if (!pd->getGroupDef() && !pd->isReference())
+ {
+ msg("Generating docs for page %s...\n",pd->name().data());
+ Doxygen::insideMainPage=TRUE;
+ pd->writeDocumentation(*g_outputList);
+ Doxygen::insideMainPage=FALSE;
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+// create a (sorted) list & dictionary of example pages
+
+static void buildExampleList(EntryNav *rootNav)
+{
+ if (rootNav->section()==Entry::EXAMPLE_SEC && !rootNav->name().isEmpty())
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *root = rootNav->entry();
+
+ if (Doxygen::exampleSDict->find(root->name))
+ {
+ warn(root->fileName,root->startLine,
+ "warning: Example %s was already documented. Ignoring "
+ "documentation found here.",
+ root->name.data()
+ );
+ }
+ else
+ {
+ PageDef *pd=new PageDef(root->fileName,root->startLine,
+ root->name,root->brief+root->doc+root->inbodyDocs,root->args);
+ pd->setFileName(convertNameToFile(pd->name()+"-example",FALSE,TRUE));
+ pd->addSectionsToDefinition(root->anchors);
+ //pi->addSections(root->anchors);
+
+ Doxygen::exampleSDict->inSort(root->name,pd);
+ //we don't add example to groups
+ //addExampleToGroups(root,pd);
+ }
+
+ rootNav->releaseEntry();
+ }
+ RECURSE_ENTRYTREE(buildExampleList,rootNav);
+}
+
+//----------------------------------------------------------------------------
+// prints the Entry tree (for debugging)
+
+void printNavTree(EntryNav *rootNav,int indent)
+{
+ QCString indentStr;
+ indentStr.fill(' ',indent);
+ msg("%s%s (sec=0x%x)\n",
+ indentStr.isEmpty()?"":indentStr.data(),
+ rootNav->name().isEmpty()?"<empty>":rootNav->name().data(),
+ rootNav->section());
+ if (rootNav->children())
+ {
+ EntryNavListIterator eli(*rootNav->children());
+ for (;eli.current();++eli) printNavTree(eli.current(),indent+2);
+ }
+}
+
+
+//----------------------------------------------------------------------------
+// generate the example documentation
+
+static void generateExampleDocs()
+{
+ g_outputList->disable(OutputGenerator::Man);
+ PageSDict::Iterator pdi(*Doxygen::exampleSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ msg("Generating docs for example %s...\n",pd->name().data());
+ resetCCodeParserState();
+ QCString n=pd->getOutputFileBase();
+ startFile(*g_outputList,n,n,pd->name());
+ startTitle(*g_outputList,n);
+ g_outputList->docify(pd->name());
+ endTitle(*g_outputList,n,0);
+ g_outputList->startContents();
+ g_outputList->parseDoc(pd->docFile(), // file
+ pd->docLine(), // startLine
+ pd, // context
+ 0, // memberDef
+ pd->documentation()+"\n\n\\include "+pd->name(), // docs
+ TRUE, // index words
+ TRUE, // is example
+ pd->name()
+ );
+ g_outputList->endContents();
+ endFile(*g_outputList);
+ }
+ g_outputList->enable(OutputGenerator::Man);
+}
+
+//----------------------------------------------------------------------------
+// generate module pages
+
+static void generateGroupDocs()
+{
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ if (!gd->isReference())
+ {
+ gd->writeDocumentation(*g_outputList);
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+//static void generatePackageDocs()
+//{
+// writePackageIndex(*g_outputList);
+//
+// if (Doxygen::packageDict.count()>0)
+// {
+// PackageSDict::Iterator pdi(Doxygen::packageDict);
+// PackageDef *pd;
+// for (pdi.toFirst();(pd=pdi.current());++pdi)
+// {
+// pd->writeDocumentation(*g_outputList);
+// }
+// }
+//}
+
+//----------------------------------------------------------------------------
+// generate module pages
+
+static void generateNamespaceDocs()
+{
+ writeNamespaceIndex(*g_outputList);
+
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ // for each namespace...
+ for (;(nd=nli.current());++nli)
+ {
+
+ if (nd->isLinkableInProject())
+ {
+ msg("Generating docs for namespace %s\n",nd->name().data());
+ nd->writeDocumentation(*g_outputList);
+ }
+
+ // for each class in the namespace...
+ ClassSDict::Iterator cli(*nd->getClassSDict());
+ for ( ; cli.current() ; ++cli )
+ {
+ ClassDef *cd=cli.current();
+ if ( ( cd->isLinkableInProject() &&
+ cd->templateMaster()==0
+ ) // skip external references, anonymous compounds and
+ // template instances and nested classes
+ && !cd->isHidden()
+ )
+ {
+ msg("Generating docs for compound %s...\n",cd->name().data());
+
+ cd->writeDocumentation(*g_outputList);
+ cd->writeMemberList(*g_outputList);
+ }
+ cd->writeDocumentationForInnerClasses(*g_outputList);
+ }
+ }
+}
+
+#if defined(_WIN32)
+static QCString fixSlashes(QCString &s)
+{
+ QCString result;
+ uint i;
+ for (i=0;i<s.length();i++)
+ {
+ switch(s.at(i))
+ {
+ case '/':
+ case '\\':
+ result+="\\\\";
+ break;
+ default:
+ result+=s.at(i);
+ }
+ }
+ return result;
+}
+#endif
+
+
+//----------------------------------------------------------------------------
+// generate files for the search engine
+
+//static void generateSearchIndex()
+//{
+// if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTML"))
+// {
+// // create search index
+// QCString fileName;
+// writeSearchButton(Config_getString("HTML_OUTPUT"));
+//
+//#if !defined(_WIN32)
+// // create cgi script
+// fileName = Config_getString("HTML_OUTPUT")+"/"+Config_getString("CGI_NAME");
+// QFile f(fileName);
+// if (f.open(IO_WriteOnly))
+// {
+// QTextStream t(&f);
+// t << "#!/bin/sh" << endl
+// << "DOXYSEARCH=" << Config_getString("BIN_ABSPATH") << "/doxysearch" << endl
+// << "DOXYPATH=\"" << Config_getString("DOC_ABSPATH") << " ";
+//
+// QStrList &extDocPaths=Config_getList("EXT_DOC_PATHS");
+// char *s= extDocPaths.first();
+// while (s)
+// {
+// t << s << " ";
+// s=extDocPaths.next();
+// }
+//
+// t << "\"" << endl
+// << "if [ -f $DOXYSEARCH ]" << endl
+// << "then" << endl
+// << " $DOXYSEARCH $DOXYPATH" << endl
+// << "else" << endl
+// << " echo \"Content-Type: text/html\"" << endl
+// << " echo \"\"" << endl
+// << " echo \"<h2>error: $DOXYSEARCH not found. Check cgi script!</h2>\"" << endl
+// << "fi" << endl;
+//
+// f.close();
+// struct stat stat_struct;
+// stat(fileName,&stat_struct);
+// chmod(fileName,stat_struct.st_mode|S_IXUSR|S_IXGRP|S_IXOTH);
+// }
+// else
+// {
+// err("error: Cannot open file %s for writing\n",fileName.data());
+// }
+//#else /* Windows platform */
+// // create cgi program
+// fileName = Config_getString("CGI_NAME").copy();
+// if (fileName.right(4)==".cgi")
+// fileName=fileName.left(fileName.length()-4);
+// fileName+=".c";
+// fileName.prepend(Config_getString("HTML_OUTPUT")+"/");
+// QFile f(fileName);
+// if (f.open(IO_WriteOnly))
+// {
+// QTextStream t(&f);
+// t << "#include <stdio.h>" << endl;
+// t << "#include <stdlib.h>" << endl;
+// t << "#include <process.h>" << endl;
+// t << endl;
+// t << "const char *DOXYSEARCH = \"" <<
+// fixSlashes(Config_getString("BIN_ABSPATH")) << "\\\\doxysearch.exe\";" << endl;
+// t << "const char *DOXYPATH = \"" <<
+// fixSlashes(Config_getString("DOC_ABSPATH")) << "\";" << endl;
+// t << endl;
+// t << "int main(void)" << endl;
+// t << "{" << endl;
+// t << " char buf[1024];" << endl;
+// t << " sprintf(buf,\"%s %s\",DOXYSEARCH,DOXYPATH);" << endl;
+// t << " if (system(buf))" << endl;
+// t << " {" << endl;
+// t << " printf(\"Content-Type: text/html\\n\\n\");" << endl;
+// t << " printf(\"<h2>error: failed to execute %s</h2>\\n\",DOXYSEARCH);" << endl;
+// t << " exit(1);" << endl;
+// t << " }" << endl;
+// t << " return 0;" << endl;
+// t << "}" << endl;
+// f.close();
+// }
+// else
+// {
+// err("error: Cannot open file %s for writing\n",fileName.data());
+// }
+//#endif /* !defined(_WIN32) */
+//
+// // create config file
+// fileName = Config_getString("HTML_OUTPUT")+"/search.cfg";
+// f.setName(fileName);
+// if (f.open(IO_WriteOnly))
+// {
+// QTextStream t(&f);
+// t << Config_getString("DOC_URL") << "/" << endl
+// << Config_getString("CGI_URL") << "/" << Config_getString("CGI_NAME") << endl;
+// f.close();
+// }
+// else
+// {
+// err("error: Cannot open file %s for writing\n",fileName.data());
+// }
+// //g_outputList->generateExternalIndex();
+// g_outputList->pushGeneratorState();
+// g_outputList->disableAllBut(OutputGenerator::Html);
+// startFile(*g_outputList,"header"+Doxygen::htmlFileExtension,0,"Search Engine",TRUE);
+// g_outputList->endPlainFile();
+// g_outputList->startPlainFile("footer"+Doxygen::htmlFileExtension);
+// endFile(*g_outputList,TRUE);
+// g_outputList->popGeneratorState();
+// }
+//}
+
+//----------------------------------------------------------------------------
+
+static bool openOutputFile(const char *outFile,QFile &f)
+{
+ bool fileOpened=FALSE;
+ bool writeToStdout=(outFile[0]=='-' && outFile[1]=='\0');
+ if (writeToStdout) // write to stdout
+ {
+ fileOpened = f.open(IO_WriteOnly,stdout);
+ }
+ else // write to file
+ {
+ QFileInfo fi(outFile);
+ if (fi.exists()) // create a backup
+ {
+ QDir dir=fi.dir();
+ QFileInfo backup(fi.fileName()+".bak");
+ if (backup.exists()) // remove existing backup
+ dir.remove(backup.fileName());
+ dir.rename(fi.fileName(),fi.fileName()+".bak");
+ }
+ f.setName(outFile);
+ fileOpened = f.open(IO_WriteOnly|IO_Translate);
+ }
+ return fileOpened;
+}
+
+/*! Generate a template version of the configuration file.
+ * If the \a shortList parameter is TRUE a configuration file without
+ * comments will be generated.
+ */
+static void generateConfigFile(const char *configFile,bool shortList,
+ bool updateOnly=FALSE)
+{
+ QFile f;
+ bool fileOpened=openOutputFile(configFile,f);
+ bool writeToStdout=(configFile[0]=='-' && configFile[1]=='\0');
+ if (fileOpened)
+ {
+ FTextStream t(&f);
+ Config::instance()->writeTemplate(t,shortList,updateOnly);
+ if (!writeToStdout)
+ {
+ if (!updateOnly)
+ {
+ msg("\n\nConfiguration file `%s' created.\n\n",configFile);
+ msg("Now edit the configuration file and enter\n\n");
+ if (strcmp(configFile,"Doxyfile") || strcmp(configFile,"doxyfile"))
+ msg(" doxygen %s\n\n",configFile);
+ else
+ msg(" doxygen\n\n");
+ msg("to generate the documentation for your project\n\n");
+ }
+ else
+ {
+ msg("\n\nConfiguration file `%s' updated.\n\n",configFile);
+ }
+ }
+ }
+ else
+ {
+ err("error: Cannot open file %s for writing\n",configFile);
+ exit(1);
+ }
+}
+
+//----------------------------------------------------------------------------
+// read and parse a tag file
+
+//static bool readLineFromFile(QFile &f,QCString &s)
+//{
+// char c=0;
+// s.resize(0);
+// while (!f.atEnd() && (c=f.getch())!='\n') s+=c;
+// return f.atEnd();
+//}
+
+//----------------------------------------------------------------------------
+
+static void readTagFile(Entry *root,const char *tl)
+{
+ QCString tagLine = tl;
+ QCString fileName;
+ QCString destName;
+ int eqPos = tagLine.find('=');
+ if (eqPos!=-1) // tag command contains a destination
+ {
+ fileName = tagLine.left(eqPos).stripWhiteSpace();
+ destName = tagLine.right(tagLine.length()-eqPos-1).stripWhiteSpace();
+ QFileInfo fi(fileName);
+ Doxygen::tagDestinationDict.insert(fi.fileName(),new QCString(destName));
+ //printf("insert tagDestination %s->%s\n",fi.fileName().data(),destName.data());
+ }
+ else
+ {
+ fileName = tagLine;
+ }
+
+ QFileInfo fi(fileName);
+ if (!fi.exists() || !fi.isFile())
+ {
+ err("error: Tag file `%s' does not exist or is not a file. Skipping it...\n",
+ fileName.data());
+ return;
+ }
+
+ if (!destName.isEmpty())
+ msg("Reading tag file `%s', location `%s'...\n",fileName.data(),destName.data());
+ else
+ msg("Reading tag file `%s'...\n",fileName.data());
+
+ parseTagFile(root,fi.absFilePath(),fi.fileName());
+
+}
+
+//----------------------------------------------------------------------------
+static void copyFile(const QCString &src,const QCString &dest)
+{
+ QFile sf(src);
+ if (sf.open(IO_ReadOnly))
+ {
+ QFileInfo fi(src);
+ QFile df(dest);
+ if (df.open(IO_WriteOnly))
+ {
+ char *buffer = new char[fi.size()];
+ sf.readBlock(buffer,fi.size());
+ df.writeBlock(buffer,fi.size());
+ df.flush();
+ delete[] buffer;
+ }
+ else
+ {
+ err("error: could not write to file %s\n",dest.data());
+ }
+ }
+ else
+ {
+ err("error: could not open user specified file %s\n",src.data());
+ }
+}
+
+static void copyStyleSheet()
+{
+ QCString &htmlStyleSheet = Config_getString("HTML_STYLESHEET");
+ if (!htmlStyleSheet.isEmpty())
+ {
+ QFileInfo fi(htmlStyleSheet);
+ if (!fi.exists())
+ {
+ err("Style sheet '%s' specified by HTML_STYLESHEET does not exist!\n",htmlStyleSheet.data());
+ htmlStyleSheet.resize(0); // revert to the default
+ }
+ else
+ {
+ QCString destFileName = Config_getString("HTML_OUTPUT")+"/"+fi.fileName().data();
+ copyFile(htmlStyleSheet,destFileName);
+ }
+ }
+}
+
+static void copyLogo()
+{
+ QCString &projectLogo = Config_getString("PROJECT_LOGO");
+ if (!projectLogo.isEmpty())
+ {
+ QFileInfo fi(projectLogo);
+ if (!fi.exists())
+ {
+ err("Project logo '%s' specified by PROJECT_LOGO does not exist!\n",projectLogo.data());
+ projectLogo.resize(0); // revert to the default
+ }
+ else
+ {
+ QCString destFileName = Config_getString("HTML_OUTPUT")+"/"+fi.fileName().data();
+ copyFile(projectLogo,destFileName);
+ }
+ }
+}
+
+static void copyExtraFiles()
+{
+ QStrList files = Config_getList("HTML_EXTRA_FILES");
+ uint i;
+ for (i=0; i<files.count(); ++i)
+ {
+ QCString fileName(files.at(i));
+
+ if (!fileName.isEmpty())
+ {
+ QFileInfo fi(fileName);
+ if (!fi.exists())
+ {
+ err("Extra HTML file '%s' specified in HTML_EXTRA_FILES does not exist!\n", fileName.data());
+ }
+ else
+ {
+ QCString destFileName = Config_getString("HTML_OUTPUT")+"/"+fi.fileName().data();
+ Doxygen::indexList.addImageFile(fi.fileName().data());
+ copyFile(fileName, destFileName);
+ }
+ }
+ }
+}
+
+//! parse the list of input files
+static void parseFiles(Entry *root,EntryNav *rootNav)
+{
+#if 0
+ void *cd = 0;
+ QCString inpEncoding = Config_getString("INPUT_ENCODING");
+ bool needsTranscoding = !inpEncoding.isEmpty();
+ if (needsTranscoding)
+ {
+ if (!(cd = portable_iconv_open("UTF-8", inpEncoding)))
+ {
+ err("error: unsupported character enconding: '%s'",inpEncoding.data());
+ exit(1);
+ }
+ }
+#endif
+
+ QCString *s=g_inputFiles.first();
+ while (s)
+ {
+ QCString fileName=*s;
+ QCString extension;
+ int ei = fileName.findRev('.');
+ if (ei!=-1) extension=fileName.right(fileName.length()-ei);
+ ParserInterface *parser = Doxygen::parserManager->getParser(extension);
+
+ QFileInfo fi(fileName);
+ BufStr preBuf(fi.size()+4096);
+
+ if (Config_getBool("ENABLE_PREPROCESSING") &&
+ parser->needsPreprocessing(extension))
+ {
+ BufStr inBuf(fi.size()+4096);
+ msg("Preprocessing %s...\n",s->data());
+ readInputFile(fileName,inBuf);
+ preprocessFile(fileName,inBuf,preBuf);
+ }
+ else // no preprocessing
+ {
+ msg("Reading %s...\n",s->data());
+ readInputFile(fileName,preBuf);
+ }
+
+ BufStr convBuf(preBuf.curPos()+1024);
+
+ // convert multi-line C++ comments to C style comments
+ convertCppComments(&preBuf,&convBuf,fileName);
+
+ convBuf.addChar('\0');
+
+ // use language parse to parse the file
+ parser->parseInput(fileName,convBuf.data(),root);
+
+ // store the Entry tree in a file and create an index to
+ // navigate/load entries
+ bool ambig;
+ FileDef *fd=findFileDef(Doxygen::inputNameDict,fileName,ambig);
+ ASSERT(fd!=0);
+ root->createNavigationIndex(rootNav,g_storage,fd);
+
+ s=g_inputFiles.next();
+ }
+}
+
+// resolves a path that may include symlinks, if a recursive symlink is
+// found an empty string is returned.
+static QCString resolveSymlink(QCString path)
+{
+ int sepPos=0;
+ int oldPos=0;
+ QFileInfo fi;
+ QDict<void> nonSymlinks;
+ QDict<void> known;
+ QCString result = path;
+ QCString oldPrefix = "/";
+ do
+ {
+#ifdef WIN32
+ // UNC path, skip server and share name
+ if (sepPos==0 && (result.left(2)=="//" || result.left(2)=="\\\\"))
+ sepPos = result.find('/',2);
+ if (sepPos!=-1)
+ sepPos = result.find('/',sepPos+1);
+#else
+ sepPos = result.find('/',sepPos+1);
+#endif
+ QCString prefix = sepPos==-1 ? result : result.left(sepPos);
+ if (nonSymlinks.find(prefix)==0)
+ {
+ fi.setFile(prefix);
+ if (fi.isSymLink())
+ {
+ QString target = fi.readLink();
+ bool isRelative = QFileInfo(target).isRelative();
+ if (isRelative)
+ {
+ target = QDir::cleanDirPath(oldPrefix+"/"+target.data());
+ }
+ if (sepPos!=-1)
+ {
+ if (fi.isDir() && target.length()>0 && target.at(target.length()-1)!='/')
+ {
+ target+='/';
+ }
+ target+=result.mid(sepPos);
+ }
+ result = QDir::cleanDirPath(target).data();
+ sepPos = 0;
+ if (known.find(result)) return QCString(); // recursive symlink!
+ known.insert(result,(void*)0x8);
+ if (isRelative)
+ {
+ sepPos = oldPos;
+ }
+ else // link to absolute path
+ {
+ sepPos = 0;
+ oldPrefix = "/";
+ }
+ }
+ else
+ {
+ nonSymlinks.insert(prefix,(void*)0x8);
+ oldPrefix = prefix;
+ }
+ oldPos = sepPos;
+ }
+ }
+ while (sepPos!=-1);
+ return QDir::cleanDirPath(result).data();
+}
+
+static QDict<void> g_pathsVisited(1009);
+
+//----------------------------------------------------------------------------
+// Read all files matching at least one pattern in `patList' in the
+// directory represented by `fi'.
+// The directory is read iff the recusiveFlag is set.
+// The contents of all files is append to the input string
+
+int readDir(QFileInfo *fi,
+ FileNameList *fnList,
+ FileNameDict *fnDict,
+ StringDict *exclDict,
+ QStrList *patList,
+ QStrList *exclPatList,
+ StringList *resultList,
+ StringDict *resultDict,
+ bool errorIfNotExist,
+ bool recursive,
+ QDict<void> *killDict
+ )
+{
+ QString dirName = fi->absFilePath();
+ if (fi->isSymLink())
+ {
+ dirName = resolveSymlink(dirName.data());
+ if (dirName.isEmpty()) return 0; // recusive symlink
+ if (g_pathsVisited.find(dirName)) return 0; // already visited path
+ g_pathsVisited.insert(dirName,(void*)0x8);
+ }
+ QDir dir(dirName);
+ dir.setFilter( QDir::Files | QDir::Dirs | QDir::Hidden );
+ int totalSize=0;
+ msg("Searching for files in directory %s\n", fi->absFilePath().data());
+ //printf("killDict=%p count=%d\n",killDict,killDict->count());
+
+ const QFileInfoList *list = dir.entryInfoList();
+ if (list)
+ {
+ QFileInfoListIterator it( *list );
+ QFileInfo *cfi;
+
+ while ((cfi=it.current()))
+ {
+ if (exclDict==0 || exclDict->find(cfi->absFilePath())==0)
+ { // file should not be excluded
+ //printf("killDict->find(%s)\n",cfi->absFilePath().data());
+ if (!cfi->exists() || !cfi->isReadable())
+ {
+ if (errorIfNotExist)
+ {
+ err("warning: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
+ }
+ }
+ else if (cfi->isFile() &&
+ (!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
+ (patList==0 || patternMatch(*cfi,patList)) &&
+ !patternMatch(*cfi,exclPatList) &&
+ (killDict==0 || killDict->find(cfi->absFilePath())==0)
+ )
+ {
+ totalSize+=cfi->size()+cfi->absFilePath().length()+4;
+ QCString name=convertToQCString(cfi->fileName());
+ //printf("New file %s\n",name.data());
+ if (fnDict)
+ {
+ FileDef *fd=new FileDef(cfi->dirPath()+"/",name);
+ FileName *fn=0;
+ if (!name.isEmpty() && (fn=(*fnDict)[name]))
+ {
+ fn->append(fd);
+ }
+ else
+ {
+ fn = new FileName(cfi->absFilePath(),name);
+ fn->append(fd);
+ if (fnList) fnList->inSort(fn);
+ fnDict->insert(name,fn);
+ }
+ }
+ QCString *rs=0;
+ if (resultList || resultDict)
+ {
+ rs=new QCString(cfi->absFilePath());
+ }
+ if (resultList) resultList->append(rs);
+ if (resultDict) resultDict->insert(cfi->absFilePath(),rs);
+ if (killDict) killDict->insert(cfi->absFilePath(),(void *)0x8);
+ }
+ else if (recursive &&
+ (!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
+ cfi->isDir() && cfi->fileName()!="." &&
+ !patternMatch(*cfi,exclPatList) &&
+ cfi->fileName()!="..")
+ {
+ cfi->setFile(cfi->absFilePath());
+ totalSize+=readDir(cfi,fnList,fnDict,exclDict,
+ patList,exclPatList,resultList,resultDict,errorIfNotExist,
+ recursive,killDict);
+ }
+ }
+ ++it;
+ }
+ }
+ return totalSize;
+}
+
+
+//----------------------------------------------------------------------------
+// read a file or all files in a directory and append their contents to the
+// input string. The names of the files are appended to the `fiList' list.
+
+int readFileOrDirectory(const char *s,
+ FileNameList *fnList,
+ FileNameDict *fnDict,
+ StringDict *exclDict,
+ QStrList *patList,
+ QStrList *exclPatList,
+ StringList *resultList,
+ StringDict *resultDict,
+ bool recursive,
+ bool errorIfNotExist,
+ QDict<void> *killDict
+ )
+{
+ //printf("killDict=%p count=%d\n",killDict,killDict->count());
+ // strip trailing slashes
+ if (s==0) return 0;
+ QCString fs = s;
+ char lc = fs.at(fs.length()-1);
+ if (lc=='/' || lc=='\\') fs = fs.left(fs.length()-1);
+
+ QFileInfo fi(fs);
+ //printf("readFileOrDirectory(%s)\n",s);
+ int totalSize=0;
+ {
+ if (exclDict==0 || exclDict->find(fi.absFilePath())==0)
+ {
+ if (!fi.exists() || !fi.isReadable())
+ {
+ if (errorIfNotExist)
+ {
+ err("warning: source %s is not a readable file or directory... skipping.\n",s);
+ }
+ }
+ else if (!Config_getBool("EXCLUDE_SYMLINKS") || !fi.isSymLink())
+ {
+ if (fi.isFile())
+ {
+ //printf("killDict->find(%s)\n",fi.absFilePath().data());
+ if (killDict==0 || killDict->find(fi.absFilePath())==0)
+ {
+ totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
+ //fiList->inSort(new FileInfo(fi));
+ QCString name=convertToQCString(fi.fileName());
+ //printf("New file %s\n",name.data());
+ if (fnDict)
+ {
+ FileDef *fd=new FileDef(fi.dirPath(TRUE)+"/",name);
+ FileName *fn=0;
+ if (!name.isEmpty() && (fn=(*fnDict)[name]))
+ {
+ fn->append(fd);
+ }
+ else
+ {
+ fn = new FileName(fi.absFilePath(),name);
+ fn->append(fd);
+ if (fnList) fnList->inSort(fn);
+ fnDict->insert(name,fn);
+ }
+ }
+ QCString *rs=0;
+ if (resultList || resultDict)
+ {
+ rs=new QCString(fi.absFilePath());
+ if (resultList) resultList->append(rs);
+ if (resultDict) resultDict->insert(fi.absFilePath(),rs);
+ }
+
+ if (killDict) killDict->insert(fi.absFilePath(),(void *)0x8);
+ }
+ }
+ else if (fi.isDir()) // readable dir
+ {
+ totalSize+=readDir(&fi,fnList,fnDict,exclDict,patList,
+ exclPatList,resultList,resultDict,errorIfNotExist,
+ recursive,killDict);
+ }
+ }
+ }
+ }
+ return totalSize;
+}
+
+//----------------------------------------------------------------------------
+
+void readFormulaRepository()
+{
+ QFile f(Config_getString("HTML_OUTPUT")+"/formula.repository");
+ if (f.open(IO_ReadOnly)) // open repository
+ {
+ msg("Reading formula repository...\n");
+ QTextStream t(&f);
+ QCString line;
+ while (!t.eof())
+ {
+ line=t.readLine();
+ int se=line.find(':'); // find name and text separator.
+ if (se==-1)
+ {
+ err("warning: formula.repository is corrupted!\n");
+ break;
+ }
+ else
+ {
+ QCString formName = line.left(se);
+ QCString formText = line.right(line.length()-se-1);
+ Formula *f=new Formula(formText);
+ Doxygen::formulaList.append(f);
+ Doxygen::formulaDict.insert(formText,f);
+ Doxygen::formulaNameDict.insert(formName,f);
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void expandAliases()
+{
+ QDictIterator<QCString> adi(Doxygen::aliasDict);
+ QCString *s;
+ for (adi.toFirst();(s=adi.current());++adi)
+ {
+ *s = expandAlias(adi.currentKey(),*s);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void escapeAliases()
+{
+ QDictIterator<QCString> adi(Doxygen::aliasDict);
+ QCString *s;
+ for (adi.toFirst();(s=adi.current());++adi)
+ {
+ QCString value=*s,newValue;
+ int in,p=0;
+ // for each \n in the alias command value
+ while ((in=value.find("\\n",p))!=-1)
+ {
+ newValue+=value.mid(p,in-p);
+ // expand \n's except if \n is part of a built-in command.
+ if (value.mid(in,5)!="\\note" &&
+ value.mid(in,5)!="\\name" &&
+ value.mid(in,10)!="\\namespace" &&
+ value.mid(in,14)!="\\nosubgrouping"
+ )
+ {
+ newValue+="\\_linebr ";
+ }
+ else
+ {
+ newValue+="\\n";
+ }
+ p=in+2;
+ }
+ newValue+=value.mid(p,value.length()-p);
+ *s=newValue;
+ //printf("Alias %s has value %s\n",adi.currentKey().data(),s->data());
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void readAliases()
+{
+ // add aliases to a dictionary
+ Doxygen::aliasDict.setAutoDelete(TRUE);
+ QStrList &aliasList = Config_getList("ALIASES");
+ const char *s=aliasList.first();
+ while (s)
+ {
+ if (Doxygen::aliasDict[s]==0)
+ {
+ QCString alias=s;
+ int i=alias.find('=');
+ if (i>0)
+ {
+ QCString name=alias.left(i).stripWhiteSpace();
+ QCString value=alias.right(alias.length()-i-1);
+ //printf("Alias: found name=`%s' value=`%s'\n",name.data(),value.data());
+ if (!name.isEmpty())
+ {
+ QCString *dn=Doxygen::aliasDict[name];
+ if (dn==0) // insert new alias
+ {
+ Doxygen::aliasDict.insert(name,new QCString(value));
+ }
+ else // overwrite previous alias
+ {
+ *dn=value;
+ }
+ }
+ }
+ }
+ s=aliasList.next();
+ }
+ expandAliases();
+ escapeAliases();
+}
+
+//----------------------------------------------------------------------------
+
+static void dumpSymbol(FTextStream &t,Definition *d)
+{
+ QCString anchor;
+ if (d->definitionType()==Definition::TypeMember)
+ {
+ MemberDef *md = (MemberDef *)d;
+ anchor=":"+md->anchor();
+ }
+ QCString scope;
+ if (d->getOuterScope() && d->getOuterScope()!=Doxygen::globalScope)
+ {
+ scope = d->getOuterScope()->getOutputFileBase()+Doxygen::htmlFileExtension;
+ }
+ t << "REPLACE INTO symbols (symbol_id,scope_id,name,file,line) VALUES('"
+ << d->getOutputFileBase()+Doxygen::htmlFileExtension+anchor << "','"
+ << scope << "','"
+ << d->name() << "','"
+ << d->getDefFileName() << "','"
+ << d->getDefLine()
+ << "');" << endl;
+}
+
+static void dumpSymbolMap()
+{
+ QFile f("symbols.sql");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
+ DefinitionIntf *intf;
+ for (;(intf=di.current());++di)
+ {
+ if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
+ {
+ DefinitionListIterator dli(*(DefinitionList*)intf);
+ Definition *d;
+ // for each symbol
+ for (dli.toFirst();(d=dli.current());++dli)
+ {
+ dumpSymbol(t,d);
+ }
+ }
+ else // single symbol
+ {
+ Definition *d = (Definition *)intf;
+ if (d!=Doxygen::globalScope) dumpSymbol(t,d);
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void dumpConfigAsXML()
+{
+ QFile f("config.xml");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ Config::instance()->writeXML(t);
+ }
+}
+
+//----------------------------------------------------------------------------
+// print the usage of doxygen
+
+static void usage(const char *name)
+{
+ msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2011\n\n",versionString);
+ msg("You can use doxygen in a number of ways:\n\n");
+ msg("1) Use doxygen to generate a template configuration file:\n");
+ msg(" %s [-s] -g [configName]\n\n",name);
+ msg(" If - is used for configName doxygen will write to standard output.\n\n");
+ msg("2) Use doxygen to update an old configuration file:\n");
+ msg(" %s [-s] -u [configName]\n\n",name);
+ msg("3) Use doxygen to generate documentation using an existing ");
+ msg("configuration file:\n");
+ msg(" %s [configName]\n\n",name);
+ msg(" If - is used for configName doxygen will read from standard input.\n\n");
+ msg("4) Use doxygen to generate a template file controlling the layout of the\n");
+ msg(" generated documentation:\n");
+ msg(" %s -l layoutFileName.xml\n\n",name);
+ msg("5) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n");
+ msg(" RTF: %s -w rtf styleSheetFile\n",name);
+ msg(" HTML: %s -w html headerFile footerFile styleSheetFile [configFile]\n",name);
+ msg(" LaTeX: %s -w latex headerFile footerFile styleSheetFile [configFile]\n\n",name);
+ msg("6) Use doxygen to generate an rtf extensions file\n");
+ msg(" RTF: %s -e rtf extensionsFile\n\n",name);
+ msg("If -s is specified the comments in the config file will be omitted.\n");
+ msg("If configName is omitted `Doxyfile' will be used as a default.\n\n");
+ exit(1);
+}
+
+//----------------------------------------------------------------------------
+// read the argument of option `c' from the comment argument list and
+// update the option index `optind'.
+
+static const char *getArg(int argc,char **argv,int &optind)
+{
+ char *s=0;
+ if (strlen(&argv[optind][2])>0)
+ s=&argv[optind][2];
+ else if (optind+1<argc && argv[optind+1][0]!='-')
+ s=argv[++optind];
+ return s;
+}
+
+//----------------------------------------------------------------------------
+
+extern void commentScanTest();
+
+void initDoxygen()
+{
+ setlocale(LC_ALL,"");
+ setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
+ setlocale(LC_NUMERIC,"C");
+
+ //Doxygen::symbolMap->setAutoDelete(TRUE);
+
+ Doxygen::runningTime.start();
+ initPreprocessor();
+
+ Doxygen::parserManager = new ParserManager;
+ Doxygen::parserManager->registerParser("c", new CLanguageScanner, TRUE);
+ Doxygen::parserManager->registerParser("python", new PythonLanguageScanner);
+ Doxygen::parserManager->registerParser("fortran", new FortranLanguageScanner);
+ Doxygen::parserManager->registerParser("vhdl", new VHDLLanguageScanner);
+ Doxygen::parserManager->registerParser("dbusxml", new DBusXMLScanner);
+
+ // register any additional parsers here...
+
+ initDefaultExtensionMapping();
+ initClassMemberIndices();
+ initNamespaceMemberIndices();
+ initFileMemberIndices();
+
+ Doxygen::symbolMap = new QDict<DefinitionIntf>(1000);
+ Doxygen::inputNameList = new FileNameList;
+ Doxygen::inputNameList->setAutoDelete(TRUE);
+ Doxygen::memberNameSDict = new MemberNameSDict(10000);
+ Doxygen::memberNameSDict->setAutoDelete(TRUE);
+ Doxygen::functionNameSDict = new MemberNameSDict(10000);
+ Doxygen::functionNameSDict->setAutoDelete(TRUE);
+ Doxygen::groupSDict = new GroupSDict(17);
+ Doxygen::groupSDict->setAutoDelete(TRUE);
+ Doxygen::globalScope = new NamespaceDef("<globalScope>",1,"<globalScope>");
+ Doxygen::namespaceSDict = new NamespaceSDict(20);
+ Doxygen::namespaceSDict->setAutoDelete(TRUE);
+ Doxygen::classSDict = new ClassSDict(1009);
+ Doxygen::classSDict->setAutoDelete(TRUE);
+ Doxygen::hiddenClasses = new ClassSDict(257);
+ Doxygen::hiddenClasses->setAutoDelete(TRUE);
+ Doxygen::directories = new DirSDict(17);
+ Doxygen::directories->setAutoDelete(TRUE);
+ Doxygen::pageSDict = new PageSDict(1009); // all doc pages
+ Doxygen::pageSDict->setAutoDelete(TRUE);
+ Doxygen::exampleSDict = new PageSDict(1009); // all examples
+ Doxygen::exampleSDict->setAutoDelete(TRUE);
+ Doxygen::inputNameDict = new FileNameDict(10007);
+ Doxygen::includeNameDict = new FileNameDict(10007);
+ Doxygen::exampleNameDict = new FileNameDict(1009);
+ Doxygen::exampleNameDict->setAutoDelete(TRUE);
+ Doxygen::imageNameDict = new FileNameDict(257);
+ Doxygen::dotFileNameDict = new FileNameDict(257);
+ Doxygen::mscFileNameDict = new FileNameDict(257);
+ Doxygen::sectionDict.setAutoDelete(TRUE);
+ Doxygen::memGrpInfoDict.setAutoDelete(TRUE);
+ Doxygen::tagDestinationDict.setAutoDelete(TRUE);
+ Doxygen::lookupCache.setAutoDelete(TRUE);
+ Doxygen::dirRelations.setAutoDelete(TRUE);
+}
+
+void cleanUpDoxygen()
+{
+ delete Doxygen::inputNameDict;
+ delete Doxygen::includeNameDict;
+ delete Doxygen::exampleNameDict;
+ delete Doxygen::imageNameDict;
+ delete Doxygen::dotFileNameDict;
+ delete Doxygen::mscFileNameDict;
+ delete Doxygen::mainPage;
+ delete Doxygen::pageSDict;
+ delete Doxygen::exampleSDict;
+ delete Doxygen::globalScope;
+ delete Doxygen::xrefLists;
+ delete Doxygen::parserManager;
+ cleanUpPreprocessor();
+ delete theTranslator;
+ delete g_outputList;
+ Mappers::freeMappers();
+ codeFreeScanner();
+
+ if (Doxygen::symbolMap)
+ {
+ // iterate through Doxygen::symbolMap and delete all
+ // DefinitionList objects, since they have no owner
+ QDictIterator<DefinitionIntf> dli(*Doxygen::symbolMap);
+ DefinitionIntf *di;
+ for (dli.toFirst();(di=dli.current());)
+ {
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList)
+ {
+ DefinitionIntf *tmp = Doxygen::symbolMap->take(dli.currentKey());
+ delete (DefinitionList *)tmp;
+ }
+ else
+ {
+ ++dli;
+ }
+ }
+ }
+
+ delete Doxygen::inputNameList;
+ delete Doxygen::memberNameSDict;
+ delete Doxygen::functionNameSDict;
+ delete Doxygen::groupSDict;
+ delete Doxygen::classSDict;
+ delete Doxygen::hiddenClasses;
+ delete Doxygen::namespaceSDict;
+ delete Doxygen::directories;
+
+ //delete Doxygen::symbolMap; <- we cannot do this unless all static lists
+ // (such as Doxygen::namespaceSDict)
+ // with objects based on Definition are made
+ // dynamic first
+}
+
+void readConfiguration(int argc, char **argv)
+{
+ /**************************************************************************
+ * Handle arguments *
+ **************************************************************************/
+
+ int optind=1;
+ const char *configName=0;
+ const char *layoutName=0;
+ const char *debugLabel;
+ const char *formatName;
+ bool genConfig=FALSE;
+ bool shortList=FALSE;
+ bool updateConfig=FALSE;
+ bool genLayout=FALSE;
+ while (optind<argc && argv[optind][0]=='-' &&
+ (isalpha(argv[optind][1]) || argv[optind][1]=='?' ||
+ argv[optind][1]=='-')
+ )
+ {
+ switch(argv[optind][1])
+ {
+ case 'g':
+ genConfig=TRUE;
+ configName=getArg(argc,argv,optind);
+ if (strcmp(argv[optind+1],"-")==0)
+ { configName="-"; optind++; }
+ if (!configName)
+ { configName="Doxyfile"; }
+ break;
+ case 'l':
+ genLayout=TRUE;
+ layoutName=getArg(argc,argv,optind);
+ if (!layoutName)
+ { layoutName="DoxygenLayout.xml"; }
+ break;
+ case 'd':
+ debugLabel=getArg(argc,argv,optind);
+ Debug::setFlag(debugLabel);
+ break;
+ case 's':
+ shortList=TRUE;
+ break;
+ case 'u':
+ updateConfig=TRUE;
+ break;
+ case 'e':
+ formatName=getArg(argc,argv,optind);
+ if (!formatName)
+ {
+ err("error: option -e is missing format specifier rtf.\n");
+ cleanUpDoxygen();
+ exit(1);
+ }
+ if (stricmp(formatName,"rtf")==0)
+ {
+ if (optind+1>=argc)
+ {
+ err("error: option \"-e rtf\" is missing an extensions file name\n");
+ cleanUpDoxygen();
+ exit(1);
+ }
+ QFile f;
+ if (openOutputFile(argv[optind+1],f))
+ {
+ RTFGenerator::writeExtensionsFile(f);
+ }
+ cleanUpDoxygen();
+ exit(1);
+ }
+ err("error: option \"-e\" has invalid format specifier.\n");
+ cleanUpDoxygen();
+ exit(1);
+ break;
+ case 'w':
+ formatName=getArg(argc,argv,optind);
+ if (!formatName)
+ {
+ err("error: option -w is missing format specifier rtf, html or latex\n");
+ cleanUpDoxygen();
+ exit(1);
+ }
+ if (stricmp(formatName,"rtf")==0)
+ {
+ if (optind+1>=argc)
+ {
+ err("error: option \"-w rtf\" is missing a style sheet file name\n");
+ cleanUpDoxygen();
+ exit(1);
+ }
+ QFile f;
+ if (openOutputFile(argv[optind+1],f))
+ {
+ RTFGenerator::writeStyleSheetFile(f);
+ }
+ cleanUpDoxygen();
+ exit(1);
+ }
+ else if (stricmp(formatName,"html")==0)
+ {
+ if (optind+4<argc || QFileInfo("Doxyfile").exists())
+ {
+ QCString df = optind+4<argc ? argv[optind+4] : QCString("Doxyfile");
+ if (!Config::instance()->parse(df))
+ {
+ err("error opening or reading configuration file %s!\n",argv[optind+4]);
+ cleanUpDoxygen();
+ exit(1);
+ }
+ Config::instance()->substituteEnvironmentVars();
+ Config::instance()->convertStrToVal();
+ // avoid bootstrapping issues when the config file already
+ // refers to the files that we are supposed to parse.
+ Config_getString("HTML_HEADER")="";
+ Config_getString("HTML_FOOTER")="";
+ Config::instance()->check();
+ }
+ else
+ {
+ Config::instance()->init();
+ }
+ if (optind+3>=argc)
+ {
+ err("error: option \"-w html\" does not have enough arguments\n");
+ cleanUpDoxygen();
+ exit(1);
+ }
+
+ QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
+ if (!setTranslator(outputLanguage))
+ {
+ err("warning: Output language %s not supported! Using English instead.\n", outputLanguage.data());
+ }
+
+ QFile f;
+ if (openOutputFile(argv[optind+1],f))
+ {
+ HtmlGenerator::writeHeaderFile(f, argv[optind+3]);
+ }
+ f.close();
+ if (openOutputFile(argv[optind+2],f))
+ {
+ HtmlGenerator::writeFooterFile(f);
+ }
+ f.close();
+ if (openOutputFile(argv[optind+3],f))
+ {
+ HtmlGenerator::writeStyleSheetFile(f);
+ }
+ cleanUpDoxygen();
+ exit(0);
+ }
+ else if (stricmp(formatName,"latex")==0)
+ {
+ if (optind+4<argc) // use config file to get settings
+ {
+ if (!Config::instance()->parse(argv[optind+4]))
+ {
+ err("error opening or reading configuration file %s!\n",argv[optind+4]);
+ exit(1);
+ }
+ Config::instance()->substituteEnvironmentVars();
+ Config::instance()->convertStrToVal();
+ Config_getString("LATEX_HEADER")="";
+ Config::instance()->check();
+ }
+ else // use default config
+ {
+ Config::instance()->init();
+ }
+ if (optind+3>=argc)
+ {
+ err("error: option \"-w latex\" does not have enough arguments\n");
+ cleanUpDoxygen();
+ exit(1);
+ }
+
+ QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
+ if (!setTranslator(outputLanguage))
+ {
+ err("warning: Output language %s not supported! Using English instead.\n", outputLanguage.data());
+ }
+
+ QFile f;
+ if (openOutputFile(argv[optind+1],f))
+ {
+ LatexGenerator::writeHeaderFile(f);
+ }
+ f.close();
+ if (openOutputFile(argv[optind+2],f))
+ {
+ LatexGenerator::writeFooterFile(f);
+ }
+ f.close();
+ if (openOutputFile(argv[optind+3],f))
+ {
+ LatexGenerator::writeStyleSheetFile(f);
+ }
+ cleanUpDoxygen();
+ exit(0);
+ }
+ else
+ {
+ err("error: Illegal format specifier %s: should be one of rtf, html, or latex\n",formatName);
+ cleanUpDoxygen();
+ exit(1);
+ }
+ break;
+ case 'm':
+ g_dumpSymbolMap = TRUE;
+ break;
+ case 'x':
+ g_dumpConfigAsXML = TRUE;
+ break;
+ case '-':
+ if (strcmp(&argv[optind][2],"help")==0)
+ {
+ usage(argv[0]);
+ }
+ else if (strcmp(&argv[optind][2],"version")==0)
+ {
+ msg("%s\n",versionString);
+ cleanUpDoxygen();
+ exit(0);
+ }
+ break;
+ case 'b':
+ setvbuf(stdout,NULL,_IONBF,0);
+ Doxygen::outputToWizard=TRUE;
+ break;
+ case 'h':
+ case '?':
+ usage(argv[0]);
+ break;
+ default:
+ err("Unknown option -%c\n",argv[optind][1]);
+ usage(argv[0]);
+ }
+ optind++;
+ }
+
+ /**************************************************************************
+ * Parse or generate the config file *
+ **************************************************************************/
+
+ Config::instance()->init();
+
+ if (genConfig)
+ {
+ if (g_dumpConfigAsXML)
+ {
+ checkConfiguration();
+ generateConfigFile(configName,shortList);
+ dumpConfigAsXML();
+ exit(0);
+ }
+ else
+ {
+ generateConfigFile(configName,shortList);
+ }
+ cleanUpDoxygen();
+ exit(0);
+ }
+ if (genLayout)
+ {
+ writeDefaultLayoutFile(layoutName);
+ cleanUpDoxygen();
+ exit(0);
+ }
+
+ QFileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
+ if (optind>=argc)
+ {
+ if (configFileInfo1.exists())
+ {
+ configName="Doxyfile";
+ }
+ else if (configFileInfo2.exists())
+ {
+ configName="doxyfile";
+ }
+ else
+ {
+ err("Doxyfile not found and no input file specified!\n");
+ usage(argv[0]);
+ }
+ }
+ else
+ {
+ QFileInfo fi(argv[optind]);
+ if (fi.exists() || strcmp(argv[optind],"-")==0)
+ {
+ configName=argv[optind];
+ }
+ else
+ {
+ err("error: configuration file %s not found!\n",argv[optind]);
+ usage(argv[0]);
+ }
+ }
+
+
+ if (!Config::instance()->parse(configName))
+ {
+ err("error: could not open or read configuration file %s!\n",configName);
+ cleanUpDoxygen();
+ exit(1);
+ }
+
+ if (updateConfig)
+ {
+ generateConfigFile(configName,shortList,TRUE);
+ cleanUpDoxygen();
+ exit(0);
+ }
+
+ /* Perlmod wants to know the path to the config file.*/
+ QFileInfo configFileInfo(configName);
+ setPerlModDoxyfile(configFileInfo.absFilePath().data());
+
+}
+
+/** check and resolve config options */
+void checkConfiguration()
+{
+
+ Config::instance()->substituteEnvironmentVars();
+ Config::instance()->convertStrToVal();
+ Config::instance()->check();
+
+ initWarningFormat();
+}
+
+/** adjust globals that depend on configuration settings. */
+void adjustConfiguration()
+{
+ QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
+ if (!setTranslator(outputLanguage))
+ {
+ err("warning: Output language %s not supported! Using English instead.\n",
+ outputLanguage.data());
+ }
+ QStrList &includePath = Config_getList("INCLUDE_PATH");
+ char *s=includePath.first();
+ while (s)
+ {
+ QFileInfo fi(s);
+ addSearchDir(fi.absFilePath());
+ s=includePath.next();
+ }
+
+ /* Set the global html file extension. */
+ Doxygen::htmlFileExtension = Config_getString("HTML_FILE_EXTENSION");
+
+
+ Doxygen::xrefLists->setAutoDelete(TRUE);
+
+ Doxygen::parseSourcesNeeded = Config_getBool("CALL_GRAPH") ||
+ Config_getBool("CALLER_GRAPH") ||
+ Config_getBool("REFERENCES_RELATION") ||
+ Config_getBool("REFERENCED_BY_RELATION");
+
+ /**************************************************************************
+ * Add custom extension mappings
+ **************************************************************************/
+
+ QStrList &extMaps = Config_getList("EXTENSION_MAPPING");
+ char *mapping = extMaps.first();
+ while (mapping)
+ {
+ QCString mapStr = mapping;
+ int i;
+ if ((i=mapStr.find('='))!=-1)
+ {
+ QCString ext=mapStr.left(i).stripWhiteSpace().lower();
+ QCString language=mapStr.mid(i+1).stripWhiteSpace().lower();
+ if (!updateLanguageMapping(ext,language))
+ {
+ err("Failed to map file extension '%s' to unsupported language '%s'.\n"
+ "Check the EXTENSION_MAPPING setting in the config file.\n",
+ ext.data(),language.data());
+ }
+ else
+ {
+ msg("Adding custom extension mapping: .%s will be treated as language %s\n",
+ ext.data(),language.data());
+ }
+ }
+ mapping = extMaps.next();
+ }
+
+
+ // add predefined macro name to a dictionary
+ QStrList &expandAsDefinedList =Config_getList("EXPAND_AS_DEFINED");
+ s=expandAsDefinedList.first();
+ while (s)
+ {
+ if (Doxygen::expandAsDefinedDict[s]==0)
+ {
+ Doxygen::expandAsDefinedDict.insert(s,(void *)666);
+ }
+ s=expandAsDefinedList.next();
+ }
+
+ // read aliases and store them in a dictionary
+ readAliases();
+
+ // store number of spaces in a tab into Doxygen::spaces
+ int &tabSize = Config_getInt("TAB_SIZE");
+ Doxygen::spaces.resize(tabSize+1);
+ int sp;for (sp=0;sp<tabSize;sp++) Doxygen::spaces.at(sp)=' ';
+ Doxygen::spaces.at(tabSize)='\0';
+}
+
+#ifdef HAS_SIGNALS
+static void stopDoxygen(int)
+{
+ QDir thisDir;
+ msg("Cleaning up...\n");
+ if (!Doxygen::entryDBFileName.isEmpty())
+ {
+ thisDir.remove(Doxygen::entryDBFileName);
+ }
+ if (!Doxygen::objDBFileName.isEmpty())
+ {
+ thisDir.remove(Doxygen::objDBFileName);
+ }
+ exit(1);
+}
+#endif
+
+static void exitDoxygen()
+{
+ if (!g_successfulRun) // premature exit
+ {
+ QDir thisDir;
+ msg("Exiting...\n");
+ if (!Doxygen::entryDBFileName.isEmpty())
+ {
+ thisDir.remove(Doxygen::entryDBFileName);
+ }
+ if (!Doxygen::objDBFileName.isEmpty())
+ {
+ thisDir.remove(Doxygen::objDBFileName);
+ }
+ }
+}
+
+static QCString createOutputDirectory(const QCString &baseDirName,
+ const char *formatDirOption,
+ const char *defaultDirName)
+{
+ // Note the & on the next line, we modify the formatDirOption!
+ QCString &formatDirName = Config_getString(formatDirOption);
+ if (formatDirName.isEmpty())
+ {
+ formatDirName = baseDirName + defaultDirName;
+ }
+ else if (formatDirName[0]!='/' && (formatDirName.length()==1 || formatDirName[1]!=':'))
+ {
+ formatDirName.prepend(baseDirName+'/');
+ }
+ QDir formatDir(formatDirName);
+ if (!formatDir.exists() && !formatDir.mkdir(formatDirName))
+ {
+ err("Could not create output directory %s\n", formatDirName.data());
+ cleanUpDoxygen();
+ exit(1);
+ }
+ return formatDirName;
+}
+
+static QCString getQchFileName()
+{
+ QCString const & qchFile = Config_getString("QCH_FILE");
+ if (!qchFile.isEmpty())
+ {
+ return qchFile;
+ }
+
+ QCString const & projectName = Config_getString("PROJECT_NAME");
+ QCString const & versionText = Config_getString("PROJECT_NUMBER");
+
+ return QCString("../qch/")
+ + (projectName.isEmpty() ? QCString("index") : projectName)
+ + (versionText.isEmpty() ? QCString("") : QCString("-") + versionText)
+ + QCString(".qch");
+}
+
+void searchInputFiles(StringList &inputFiles)
+{
+ QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS");
+ bool alwaysRecursive = Config_getBool("RECURSIVE");
+ StringDict excludeNameDict(1009);
+ excludeNameDict.setAutoDelete(TRUE);
+
+ // gather names of all files in the include path
+ msg("Searching for include files...\n");
+ QStrList &includePathList = Config_getList("INCLUDE_PATH");
+ char *s=includePathList.first();
+ while (s)
+ {
+ QStrList &pl = Config_getList("INCLUDE_FILE_PATTERNS");
+ if (pl.count()==0)
+ {
+ pl = Config_getList("FILE_PATTERNS");
+ }
+ readFileOrDirectory(s,0,Doxygen::includeNameDict,0,&pl,
+ &exclPatterns,0,0,
+ alwaysRecursive);
+ s=includePathList.next();
+ }
+
+ msg("Searching for example files...\n");
+ QStrList &examplePathList = Config_getList("EXAMPLE_PATH");
+ s=examplePathList.first();
+ while (s)
+ {
+ readFileOrDirectory(s,0,Doxygen::exampleNameDict,0,
+ &Config_getList("EXAMPLE_PATTERNS"),
+ 0,0,0,
+ (alwaysRecursive || Config_getBool("EXAMPLE_RECURSIVE")));
+ s=examplePathList.next();
+ }
+
+ msg("Searching for images...\n");
+ QStrList &imagePathList=Config_getList("IMAGE_PATH");
+ s=imagePathList.first();
+ while (s)
+ {
+ readFileOrDirectory(s,0,Doxygen::imageNameDict,0,0,
+ 0,0,0,
+ alwaysRecursive);
+ s=imagePathList.next();
+ }
+
+ msg("Searching for dot files...\n");
+ QStrList &dotFileList=Config_getList("DOTFILE_DIRS");
+ s=dotFileList.first();
+ while (s)
+ {
+ readFileOrDirectory(s,0,Doxygen::dotFileNameDict,0,0,
+ 0,0,0,
+ alwaysRecursive);
+ s=dotFileList.next();
+ }
+
+ msg("Searching for msc files...\n");
+ QStrList &mscFileList=Config_getList("MSCFILE_DIRS");
+ s=mscFileList.first();
+ while (s)
+ {
+ readFileOrDirectory(s,0,Doxygen::mscFileNameDict,0,0,
+ 0,0,0,
+ alwaysRecursive);
+ s=dotFileList.next();
+ }
+
+
+ msg("Searching for files to exclude\n");
+ QStrList &excludeList = Config_getList("EXCLUDE");
+ s=excludeList.first();
+ while (s)
+ {
+ readFileOrDirectory(s,0,0,0,&Config_getList("FILE_PATTERNS"),
+ 0,0,&excludeNameDict,
+ alwaysRecursive,
+ FALSE);
+ s=excludeList.next();
+ }
+
+ /**************************************************************************
+ * Determine Input Files *
+ **************************************************************************/
+
+ msg("Searching for files to process...\n");
+ QDict<void> *killDict = new QDict<void>(10007);
+ int inputSize=0;
+ QStrList &inputList=Config_getList("INPUT");
+ inputFiles.setAutoDelete(TRUE);
+ s=inputList.first();
+ while (s)
+ {
+ QCString path=s;
+ uint l = path.length();
+ // strip trailing slashes
+ if (path.at(l-1)=='\\' || path.at(l-1)=='/') path=path.left(l-1);
+
+ inputSize+=readFileOrDirectory(
+ path,
+ Doxygen::inputNameList,
+ Doxygen::inputNameDict,
+ &excludeNameDict,
+ &Config_getList("FILE_PATTERNS"),
+ &exclPatterns,
+ &inputFiles,0,
+ alwaysRecursive,
+ TRUE,
+ killDict);
+ s=inputList.next();
+ }
+ delete killDict;
+}
+
+
+void parseInput()
+{
+ atexit(exitDoxygen);
+
+
+ /**************************************************************************
+ * Make sure the output directory exists
+ **************************************************************************/
+ QCString &outputDirectory = Config_getString("OUTPUT_DIRECTORY");
+ if (outputDirectory.isEmpty())
+ {
+ outputDirectory=QDir::currentDirPath();
+ }
+ else
+ {
+ QDir dir(outputDirectory);
+ if (!dir.exists())
+ {
+ dir.setPath(QDir::currentDirPath());
+ if (!dir.mkdir(outputDirectory))
+ {
+ err("error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
+ "exist and cannot be created\n",outputDirectory.data());
+ cleanUpDoxygen();
+ exit(1);
+ }
+ else if (!Config_getBool("QUIET"))
+ {
+ err("Notice: Output directory `%s' does not exist. "
+ "I have created it for you.\n", outputDirectory.data());
+ }
+ dir.cd(outputDirectory);
+ }
+ outputDirectory=dir.absPath();
+ }
+
+ /**************************************************************************
+ * Initialize global lists and dictionaries
+ **************************************************************************/
+
+ int cacheSize = Config_getInt("SYMBOL_CACHE_SIZE");
+ if (cacheSize<0) cacheSize=0;
+ if (cacheSize>9) cacheSize=9;
+ Doxygen::symbolCache = new ObjCache(16+cacheSize); // 16 -> room for 65536 elements,
+ // ~2.0 MByte "overhead"
+ Doxygen::symbolStorage = new Store;
+
+#ifdef HAS_SIGNALS
+ signal(SIGINT, stopDoxygen);
+#endif
+
+ uint pid = portable_pid();
+ Doxygen::objDBFileName.sprintf("doxygen_objdb_%d.tmp",pid);
+ Doxygen::objDBFileName.prepend(outputDirectory+"/");
+ Doxygen::entryDBFileName.sprintf("doxygen_entrydb_%d.tmp",pid);
+ Doxygen::entryDBFileName.prepend(outputDirectory+"/");
+
+ if (Doxygen::symbolStorage->open(Doxygen::objDBFileName)==-1)
+ {
+ err("Failed to open temporary file %s\n",Doxygen::objDBFileName.data());
+ exit(1);
+ }
+
+
+ /**************************************************************************
+ * Initialize some global constants
+ **************************************************************************/
+
+ g_compoundKeywordDict.insert("template class",(void *)8);
+ g_compoundKeywordDict.insert("template struct",(void *)8);
+ g_compoundKeywordDict.insert("class",(void *)8);
+ g_compoundKeywordDict.insert("struct",(void *)8);
+ g_compoundKeywordDict.insert("union",(void *)8);
+ g_compoundKeywordDict.insert("interface",(void *)8);
+ g_compoundKeywordDict.insert("exception",(void *)8);
+
+
+ /**************************************************************************
+ * Check/create output directorties *
+ **************************************************************************/
+
+ QCString htmlOutput;
+ bool &generateHtml = Config_getBool("GENERATE_HTML");
+ if (generateHtml)
+ htmlOutput = createOutputDirectory(outputDirectory,"HTML_OUTPUT","/html");
+
+ QCString xmlOutput;
+ bool &generateXml = Config_getBool("GENERATE_XML");
+ if (generateXml)
+ xmlOutput = createOutputDirectory(outputDirectory,"XML_OUTPUT","/xml");
+
+ QCString latexOutput;
+ bool &generateLatex = Config_getBool("GENERATE_LATEX");
+ if (generateLatex)
+ latexOutput = createOutputDirectory(outputDirectory,"LATEX_OUTPUT","/latex");
+
+ QCString rtfOutput;
+ bool &generateRtf = Config_getBool("GENERATE_RTF");
+ if (generateRtf)
+ rtfOutput = createOutputDirectory(outputDirectory,"RTF_OUTPUT","/rtf");
+
+ QCString manOutput;
+ bool &generateMan = Config_getBool("GENERATE_MAN");
+ if (generateMan)
+ manOutput = createOutputDirectory(outputDirectory,"MAN_OUTPUT","/man");
+
+
+ if (Config_getBool("HAVE_DOT"))
+ {
+ QCString curFontPath = Config_getString("DOT_FONTPATH");
+ if (curFontPath.isEmpty())
+ {
+ portable_getenv("DOTFONTPATH");
+ QCString newFontPath = ".";
+ if (!curFontPath.isEmpty())
+ {
+ newFontPath+=portable_pathListSeparator();
+ newFontPath+=curFontPath;
+ }
+ portable_setenv("DOTFONTPATH",newFontPath);
+ }
+ else
+ {
+ portable_setenv("DOTFONTPATH",curFontPath);
+ }
+ }
+
+
+
+ /**************************************************************************
+ * Handle layout file *
+ **************************************************************************/
+
+ LayoutDocManager::instance().init();
+ QCString layoutFileName = Config_getString("LAYOUT_FILE");
+ bool defaultLayoutUsed = FALSE;
+ if (layoutFileName.isEmpty())
+ {
+ layoutFileName = "DoxygenLayout.xml";
+ defaultLayoutUsed = TRUE;
+ }
+
+ QFile layoutFile(layoutFileName);
+ if (layoutFile.open(IO_ReadOnly))
+ {
+ msg("Parsing layout file %s...\n",layoutFileName.data());
+ QTextStream t(&layoutFile);
+ t.setEncoding(QTextStream::Latin1);
+ LayoutDocManager::instance().parse(t);
+ }
+ else if (!defaultLayoutUsed)
+ {
+ err("warning: failed to open layout file '%s' for reading!\n",layoutFileName.data());
+ }
+
+ /**************************************************************************
+ * Read and preprocess input *
+ **************************************************************************/
+
+ // prevent search in the output directories
+ QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS");
+ if (generateHtml) exclPatterns.append(htmlOutput);
+ if (generateXml) exclPatterns.append(xmlOutput);
+ if (generateLatex) exclPatterns.append(latexOutput);
+ if (generateRtf) exclPatterns.append(rtfOutput);
+ if (generateMan) exclPatterns.append(manOutput);
+
+
+ searchInputFiles(g_inputFiles);
+
+ // Notice: the order of the function calls below is very important!
+
+ if (Config_getBool("GENERATE_HTML"))
+ {
+ readFormulaRepository();
+ }
+
+ /**************************************************************************
+ * Handle Tag Files *
+ **************************************************************************/
+
+ g_storage = new FileStorage;
+ g_storage->setName(Doxygen::entryDBFileName);
+ if (!g_storage->open(IO_WriteOnly))
+ {
+ err("Failed to create temporary storage file %s\n",
+ Doxygen::entryDBFileName.data());
+ exit(1);
+ }
+ Entry *root=new Entry;
+ EntryNav *rootNav = new EntryNav(0,root);
+ rootNav->setEntry(root);
+ msg("Reading and parsing tag files\n");
+
+ QStrList &tagFileList = Config_getList("TAGFILES");
+ char *s=tagFileList.first();
+ while (s)
+ {
+ readTagFile(root,s);
+ root->createNavigationIndex(rootNav,g_storage,0);
+ s=tagFileList.next();
+ }
+
+ /**************************************************************************
+ * Parse source files *
+ **************************************************************************/
+
+ parseFiles(root,rootNav);
+ g_storage->close();
+ if (!g_storage->open(IO_ReadOnly))
+ {
+ err("Failed to open temporary storage file %s for reading",
+ Doxygen::entryDBFileName.data());
+ exit(1);
+ }
+
+ //printNavTree(rootNav,0);
+
+ // we are done with input scanning now, so free up the buffers used by flex
+ // (can be around 4MB)
+ preFreeScanner();
+ scanFreeScanner();
+ pyscanFreeScanner();
+
+ //delete rootNav;
+ //g_storage.close();
+ //exit(1);
+
+ /**************************************************************************
+ * Gather information *
+ **************************************************************************/
+
+ msg("Building group list...\n");
+ buildGroupList(rootNav);
+ organizeSubGroups(rootNav);
+
+ msg("Building directory list...\n");
+ buildDirectories();
+ findDirDocumentation(rootNav);
+
+ if (Config_getBool("BUILTIN_STL_SUPPORT"))
+ {
+ addSTLClasses(rootNav);
+ }
+
+ msg("Building namespace list...\n");
+ buildNamespaceList(rootNav);
+ findUsingDirectives(rootNav);
+
+ msg("Building file list...\n");
+ buildFileList(rootNav);
+ //generateFileTree();
+
+ msg("Building class list...\n");
+ buildClassList(rootNav);
+
+ msg("Associating documentation with classes...\n");
+ buildClassDocList(rootNav);
+
+ // build list of using declarations here (global list)
+ buildListOfUsingDecls(rootNav);
+
+ msg("Computing nesting relations for classes...\n");
+ resolveClassNestingRelations();
+ distributeClassGroupRelations();
+
+ // calling buildClassList may result in cached relations that
+ // become invalid after resolveClassNestingRelations(), that's why
+ // we need to clear the cache here
+ Doxygen::lookupCache.clear();
+ // we don't need the list of using declaration anymore
+ g_usingDeclarations.clear();
+
+ msg("Building example list...\n");
+ buildExampleList(rootNav);
+
+ msg("Searching for enumerations...\n");
+ findEnums(rootNav);
+
+ // Since buildVarList calls isVarWithConstructor
+ // and this calls getResolvedClass we need to process
+ // typedefs first so the relations between classes via typedefs
+ // are properly resolved. See bug 536385 for an example.
+ msg("Searching for documented typedefs...\n");
+ buildTypedefList(rootNav);
+
+ msg("Searching for members imported via using declarations...\n");
+ findUsingDeclImports(rootNav);
+ // this should be after buildTypedefList in order to properly import
+ // used typedefs
+ findUsingDeclarations(rootNav);
+
+ msg("Searching for included using directives...\n");
+ findIncludedUsingDirectives();
+
+ msg("Searching for documented variables...\n");
+ buildVarList(rootNav);
+
+ msg("Building member list...\n"); // using class info only !
+ buildFunctionList(rootNav);
+
+ msg("Searching for friends...\n");
+ findFriends();
+
+ msg("Searching for documented defines...\n");
+ findDefineDocumentation(rootNav);
+
+ findClassEntries(rootNav);
+ msg("Computing class inheritance relations...\n");
+ findInheritedTemplateInstances();
+ msg("Computing class usage relations...\n");
+ findUsedTemplateInstances();
+
+ msg("Flushing cached template relations that have become invalid...\n");
+ flushCachedTemplateRelations();
+
+ msg("Creating members for template instances...\n");
+ createTemplateInstanceMembers();
+
+ msg("Computing class relations...\n");
+ computeTemplateClassRelations();
+ flushUnresolvedRelations();
+
+ computeClassRelations();
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_VHDL"))
+ VhdlDocGen::computeVhdlComponentRelations();
+
+ g_classEntries.clear();
+
+ msg("Add enum values to enums...\n");
+ addEnumValuesToEnums(rootNav);
+ findEnumDocumentation(rootNav);
+
+ msg("Searching for member function documentation...\n");
+ findObjCMethodDefinitions(rootNav);
+ findMemberDocumentation(rootNav); // may introduce new members !
+
+ transferRelatedFunctionDocumentation();
+ transferFunctionDocumentation();
+
+ msg("Building page list...\n");
+ buildPageList(rootNav);
+
+ msg("Search for main page...\n");
+ findMainPage(rootNav);
+
+ msg("Computing page relations...\n");
+ computePageRelations(rootNav);
+ checkPageRelations();
+
+ msg("Determining the scope of groups...\n");
+ findGroupScope(rootNav);
+
+ msg("Sorting lists...\n");
+ Doxygen::memberNameSDict->sort();
+ Doxygen::functionNameSDict->sort();
+ Doxygen::hiddenClasses->sort();
+ Doxygen::classSDict->sort();
+
+ msg("Freeing entry tree\n");
+ delete rootNav;
+ g_storage->close();
+ delete g_storage;
+ g_storage=0;
+
+ QDir thisDir;
+ thisDir.remove(Doxygen::entryDBFileName);
+
+ msg("Determining which enums are documented\n");
+ findDocumentedEnumValues();
+
+ msg("Computing member relations...\n");
+ computeMemberRelations();
+
+ msg("Building full member lists recursively...\n");
+ buildCompleteMemberLists();
+
+ msg("Adding members to member groups.\n");
+ addMembersToMemberGroup();
+
+ if (Config_getBool("DISTRIBUTE_GROUP_DOC"))
+ {
+ msg("Distributing member group documentation.\n");
+ distributeMemberGroupDocumentation();
+ }
+
+ msg("Computing member references...\n");
+ computeMemberReferences();
+
+ if (Config_getBool("INHERIT_DOCS"))
+ {
+ msg("Inheriting documentation...\n");
+ inheritDocumentation();
+ }
+
+ // compute the shortest possible names of all files
+ // without loosing the uniqueness of the file names.
+ msg("Generating disk names...\n");
+ Doxygen::inputNameList->generateDiskNames();
+
+ msg("Adding source references...\n");
+ addSourceReferences();
+
+ msg("Adding xrefitems...\n");
+ addListReferences();
+ generateXRefPages();
+
+ msg("Sorting member lists...\n");
+ sortMemberLists();
+
+ if (Config_getBool("SHOW_DIRECTORIES") && Config_getBool("DIRECTORY_GRAPH"))
+ {
+ msg("Computing dependencies between directories...\n");
+ computeDirDependencies();
+ }
+
+ msg("Counting data structures...\n");
+ countDataStructures();
+
+ msg("Resolving user defined references...\n");
+ resolveUserReferences();
+
+ msg("Finding anchors and sections in the documentation...\n");
+ findSectionsInDocumentation();
+
+ transferFunctionReferences();
+
+ msg("Combining using relations...\n");
+ combineUsingRelations();
+
+ msg("Adding members to index pages...\n");
+ addMembersToIndex();
+}
+
+void generateOutput()
+{
+ /**************************************************************************
+ * Initialize output generators *
+ **************************************************************************/
+
+ //// dump all symbols
+ //SDict<DefinitionList>::Iterator sdi(Doxygen::symbolMap);
+ //DefinitionList *dl;
+ //for (sdi.toFirst();(dl=sdi.current());++sdi)
+ //{
+ // DefinitionListIterator dli(*dl);
+ // Definition *d;
+ // printf("Symbol: ");
+ // for (dli.toFirst();(d=dli.current());++dli)
+ // {
+ // printf("%s ",d->qualifiedName().data());
+ // }
+ // printf("\n");
+ //}
+ if (g_dumpSymbolMap)
+ {
+ dumpSymbolMap();
+ exit(0);
+ }
+
+ initDocParser();
+
+ g_outputList = new OutputList(TRUE);
+ if (Config_getBool("GENERATE_HTML"))
+ {
+ g_outputList->add(new HtmlGenerator);
+ HtmlGenerator::init();
+
+ bool generateHtmlHelp = Config_getBool("GENERATE_HTMLHELP");
+ bool generateEclipseHelp = Config_getBool("GENERATE_ECLIPSEHELP");
+ bool generateQhp = Config_getBool("GENERATE_QHP");
+ bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ bool generateDocSet = Config_getBool("GENERATE_DOCSET");
+ if (generateEclipseHelp) Doxygen::indexList.addIndex(new EclipseHelp);
+ if (generateHtmlHelp) Doxygen::indexList.addIndex(new HtmlHelp);
+ if (generateQhp) Doxygen::indexList.addIndex(new Qhp);
+ if (generateTreeView) Doxygen::indexList.addIndex(new FTVHelp(TRUE));
+ if (generateDocSet) Doxygen::indexList.addIndex(new DocSets);
+ Doxygen::indexList.initialize();
+ HtmlGenerator::writeTabData();
+
+#if 0
+ if (Config_getBool("GENERATE_INDEXLOG")) Doxygen::indexList.addIndex(new IndexLog);
+#endif
+ //if (Config_getBool("HTML_DYNAMIC_SECTIONS")) HtmlGenerator::generateSectionImages();
+ copyStyleSheet();
+ copyLogo();
+ copyExtraFiles();
+ if (!generateTreeView && Config_getBool("USE_INLINE_TREES"))
+ {
+ FTVHelp::generateTreeViewImages();
+ }
+ }
+ if (Config_getBool("GENERATE_LATEX"))
+ {
+ g_outputList->add(new LatexGenerator);
+ LatexGenerator::init();
+ }
+ if (Config_getBool("GENERATE_MAN"))
+ {
+ g_outputList->add(new ManGenerator);
+ ManGenerator::init();
+ }
+ if (Config_getBool("GENERATE_RTF"))
+ {
+ g_outputList->add(new RTFGenerator);
+ RTFGenerator::init();
+ }
+
+ if (Config_getBool("USE_HTAGS"))
+ {
+ Htags::useHtags = TRUE;
+ QCString htmldir = Config_getString("HTML_OUTPUT");
+ if (!Htags::execute(htmldir))
+ err("error: USE_HTAGS is YES but htags(1) failed. \n");
+ if (!Htags::loadFilemap(htmldir))
+ err("error: htags(1) ended normally but failed to load the filemap. \n");
+ }
+
+ /**************************************************************************
+ * Generate documentation *
+ **************************************************************************/
+
+ QFile *tag=0;
+ QCString &generateTagFile = Config_getString("GENERATE_TAGFILE");
+ if (!generateTagFile.isEmpty())
+ {
+ tag=new QFile(generateTagFile);
+ if (!tag->open(IO_WriteOnly))
+ {
+ err("error: cannot open tag file %s for writing\n",
+ generateTagFile.data()
+ );
+ cleanUpDoxygen();
+ exit(1);
+ }
+ Doxygen::tagFile.setDevice(tag);
+ Doxygen::tagFile << "<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?>" << endl;
+ Doxygen::tagFile << "<tagfile>" << endl;
+ }
+
+ if (Config_getBool("GENERATE_HTML")) writeDoxFont(Config_getString("HTML_OUTPUT"));
+ if (Config_getBool("GENERATE_LATEX")) writeDoxFont(Config_getString("LATEX_OUTPUT"));
+ if (Config_getBool("GENERATE_RTF")) writeDoxFont(Config_getString("RTF_OUTPUT"));
+
+ msg("Generating style sheet...\n");
+ //printf("writing style info\n");
+ QCString genString =
+ theTranslator->trGeneratedAt(dateToString(TRUE),Config_getString("PROJECT_NAME"));
+ g_outputList->writeStyleInfo(0); // write first part
+ g_outputList->disableAllBut(OutputGenerator::Latex);
+ g_outputList->parseText(genString);
+ g_outputList->writeStyleInfo(1); // write second part
+ //parseText(*g_outputList,theTranslator->trWrittenBy());
+ g_outputList->writeStyleInfo(2); // write third part
+ g_outputList->parseText(genString);
+ g_outputList->writeStyleInfo(3); // write fourth part
+ //parseText(*g_outputList,theTranslator->trWrittenBy());
+ g_outputList->writeStyleInfo(4); // write last part
+ g_outputList->enableAll();
+
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
+
+ // generate search indices (need to do this before writing other HTML
+ // pages as these contain a drop down menu with options depending on
+ // what categories we find in this function.
+ if (Config_getBool("GENERATE_HTML") && searchEngine)
+ {
+ msg("Generating search indices...\n");
+ QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search";
+ QDir searchDir(searchDirName);
+ if (!searchDir.exists() && !searchDir.mkdir(searchDirName))
+ {
+ err("error: Could not create search results directory '%s' $PWD='%s'\n",
+ searchDirName.data(),QDir::currentDirPath().data());
+ exit(1);
+ }
+ HtmlGenerator::writeSearchData(searchDirName);
+ if (!serverBasedSearch) // client side search index
+ {
+ writeJavascriptSearchIndex();
+ }
+ }
+
+ //statistics();
+
+ // count the number of documented elements in the lists we have built.
+ // If the result is 0 we do not generate the lists and omit the
+ // corresponding links in the index.
+ msg("Generating index page...\n");
+ writeIndex(*g_outputList);
+
+ msg("Generating page index...\n");
+ writePageIndex(*g_outputList);
+
+ msg("Generating example documentation...\n");
+ generateExampleDocs();
+
+ msg("Generating file sources...\n");
+ if (!Htags::useHtags)
+ {
+ generateFileSources();
+ }
+
+ msg("Generating file documentation...\n");
+ generateFileDocs();
+
+ msg("Generating page documentation...\n");
+ generatePageDocs();
+
+ msg("Generating group documentation...\n");
+ generateGroupDocs();
+
+ msg("Generating group index...\n");
+ writeGroupIndex(*g_outputList);
+
+ msg("Generating class documentation...\n");
+ generateClassDocs();
+
+ if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY"))
+ {
+ msg("Generating graphical class hierarchy...\n");
+ writeGraphicalClassHierarchy(*g_outputList);
+ }
+
+ msg("Generating namespace index...\n");
+ generateNamespaceDocs();
+
+ msg("Generating namespace member index...\n");
+ writeNamespaceMemberIndex(*g_outputList);
+
+ if (Config_getBool("GENERATE_LEGEND"))
+ {
+ msg("Generating graph info page...\n");
+ writeGraphInfo(*g_outputList);
+ }
+
+ if (Config_getBool("SHOW_DIRECTORIES"))
+ {
+ msg("Generating directory documentation...\n");
+ generateDirDocs(*g_outputList);
+ }
+
+ msg("Generating file index...\n");
+ writeFileIndex(*g_outputList);
+
+ if (Config_getBool("SHOW_DIRECTORIES"))
+ {
+ msg("Generating directory index...\n");
+ writeDirIndex(*g_outputList);
+ }
+
+ msg("Generating example index...\n");
+ writeExampleIndex(*g_outputList);
+
+ msg("Generating file member index...\n");
+ writeFileMemberIndex(*g_outputList);
+
+
+ //writeDirDependencyGraph(Config_getString("HTML_OUTPUT"));
+
+ if (Doxygen::formulaList.count()>0 && Config_getBool("GENERATE_HTML")
+ && !Config_getBool("USE_MATHJAX"))
+ {
+ msg("Generating bitmaps for formulas in HTML...\n");
+ Doxygen::formulaList.generateBitmaps(Config_getString("HTML_OUTPUT"));
+ }
+
+ //if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"))
+ //{
+ // HtmlHelp::getInstance()->finalize();
+ //}
+ //if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_TREEVIEW"))
+ //{
+ // FTVHelp::getInstance()->finalize();
+ //}
+
+ msg("finalizing index lists...\n");
+ Doxygen::indexList.finalize();
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << "</tagfile>" << endl;
+ delete tag;
+ }
+
+ if (Config_getBool("DOT_CLEANUP"))
+ {
+ if (Config_getBool("GENERATE_HTML"))
+ removeDoxFont(Config_getString("HTML_OUTPUT"));
+ if (Config_getBool("GENERATE_RTF"))
+ removeDoxFont(Config_getString("RTF_OUTPUT"));
+ if (Config_getBool("GENERATE_LATEX"))
+ removeDoxFont(Config_getString("LATEX_OUTPUT"));
+ }
+
+ if (Config_getBool("GENERATE_XML"))
+ {
+ msg("Generating XML output...\n");
+ generateXML();
+ }
+ if (Config_getBool("GENERATE_AUTOGEN_DEF"))
+ {
+ msg("Generating AutoGen DEF output...\n");
+ generateDEF();
+ }
+ if (Config_getBool("GENERATE_PERLMOD"))
+ {
+ msg("Generating Perl module output...\n");
+ generatePerlMod();
+ }
+ if (Config_getBool("GENERATE_HTML") && searchEngine && serverBasedSearch)
+ {
+ msg("Generating search index\n");
+ HtmlGenerator::writeSearchPage();
+ Doxygen::searchIndex->write(Config_getString("HTML_OUTPUT")+"/search/search.idx");
+ }
+
+ if (Config_getBool("GENERATE_RTF"))
+ {
+ msg("Combining RTF output...\n");
+ if (!RTFGenerator::preProcessFileInplace(Config_getString("RTF_OUTPUT"),"refman.rtf"))
+ {
+ err("An error occurred during post-processing the RTF files!\n");
+ }
+ }
+
+ if (Config_getBool("HAVE_DOT"))
+ {
+ DotManager::instance()->run();
+ }
+
+ if (Config_getBool("GENERATE_HTML") &&
+ Config_getBool("GENERATE_HTMLHELP") &&
+ !Config_getString("HHC_LOCATION").isEmpty())
+ {
+ msg("Running html help compiler...\n");
+ QString oldDir = QDir::currentDirPath();
+ QDir::setCurrent(Config_getString("HTML_OUTPUT"));
+ portable_sysTimerStart();
+ if (portable_system(Config_getString("HHC_LOCATION"), "index.hhp", FALSE))
+ {
+ err("error: failed to run html help compiler on index.hhp\n");
+ }
+ portable_sysTimerStop();
+ QDir::setCurrent(oldDir);
+ }
+ if ( Config_getBool("GENERATE_HTML") &&
+ Config_getBool("GENERATE_QHP") &&
+ !Config_getString("QHG_LOCATION").isEmpty())
+ {
+ msg("Running qhelpgenerator...\n");
+ QCString const qhpFileName = Qhp::getQhpFileName();
+ QCString const qchFileName = getQchFileName();
+
+ QCString const args = QCString().sprintf("%s -o \"%s\"", qhpFileName.data(), qchFileName.data());
+ QString const oldDir = QDir::currentDirPath();
+ QDir::setCurrent(Config_getString("HTML_OUTPUT"));
+ portable_sysTimerStart();
+ if (portable_system(Config_getString("QHG_LOCATION"), args.data(), FALSE))
+ {
+ err("error: failed to run qhelpgenerator on index.qhp\n");
+ }
+ portable_sysTimerStop();
+ QDir::setCurrent(oldDir);
+ }
+
+
+ if (Debug::isFlagSet(Debug::Time))
+ {
+ msg("Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n",
+ ((double)Doxygen::runningTime.elapsed())/1000.0,
+ portable_getSysElapsedTime()
+ );
+ }
+ else
+ {
+ msg("finished...\n");
+ }
+
+ /**************************************************************************
+ * Start cleaning up *
+ **************************************************************************/
+
+ //Doxygen::symbolCache->printStats();
+ //Doxygen::symbolStorage->printStats();
+ cleanUpDoxygen();
+
+ finializeDocParser();
+ Doxygen::symbolStorage->close();
+ QDir thisDir;
+ thisDir.remove(Doxygen::objDBFileName);
+ Config::deleteInstance();
+ QTextCodec::deleteAllCodecs();
+ delete Doxygen::symbolCache;
+ delete Doxygen::symbolMap;
+ delete Doxygen::symbolStorage;
+ g_successfulRun=TRUE;
+}
+
diff --git a/src/doxygen.css b/src/doxygen.css
new file mode 100644
index 0000000..4b50f0d
--- /dev/null
+++ b/src/doxygen.css
@@ -0,0 +1,835 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+ font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+ font-size: 12px;
+}
+
+/* @group Heading Levels */
+
+h1 {
+ font-size: 150%;
+}
+
+.title {
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2 {
+ font-size: 120%;
+}
+
+h3 {
+ font-size: 100%;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+ margin-top: 2px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: ##ee;
+ border: 1px solid ##b0;
+ text-align: center;
+ margin: 2px;
+ padding: 2px;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: ##50;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: ##60;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: ##AA;
+ color: #ffffff;
+ border: 1px double ##98;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code {
+ color: ##60;
+}
+
+a.codeRef {
+ color: ##60;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+.fragment {
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+pre.fragment {
+ border: 1px solid ##CC;
+ background-color: ##FC;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+}
+
+div.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 10px;
+ margin-right: 5px;
+}
+
+td.indexkey {
+ background-color: ##ee;
+ font-weight: bold;
+ border: 1px solid ##cc;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+}
+
+td.indexvalue {
+ background-color: ##ee;
+ border: 1px solid ##cc;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: ##f0;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid ##b0;
+}
+
+th.dirtab {
+ background: ##ee;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid ##66;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: ##FA;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+ border-top: 1px solid ##cc;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: ##60;
+ white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: ##60;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: ##ee;
+ border: 1px solid ##b0;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+}
+
+.memname {
+ white-space: nowrap;
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memproto {
+ border-top: 1px solid ##B4;
+ border-left: 1px solid ##B4;
+ border-right: 1px solid ##B4;
+ padding: 6px 0px 6px 0px;
+ color: ##2b;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 8px;
+ border-top-left-radius: 8px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 8px;
+ -moz-border-radius-topleft: 8px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 8px;
+ -webkit-border-top-left-radius: 8px;
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: ##E6;
+
+}
+
+.memdoc {
+ border-bottom: 1px solid ##B4;
+ border-left: 1px solid ##B4;
+ border-right: 1px solid ##B4;
+ padding: 2px 5px;
+ background-color: ##FC;
+ border-top-width: 0;
+ /* opera specific markup */
+ border-bottom-left-radius: 8px;
+ border-bottom-right-radius: 8px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 8px;
+ -moz-border-radius-bottomright: 8px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ background-image: -moz-linear-gradient(center top, ##FF 0%, ##FF 60%, ##F8 95%, ##F0);
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 8px;
+ -webkit-border-bottom-right-radius: 8px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ background-image: -webkit-gradient(linear,center top,center bottom,from(##FF), color-stop(0.6,##FF), color-stop(0.60,##FF), color-stop(0.95,##F8), to(##F0));
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+
+.params, .retval, .exception, .tparams {
+ border-spacing: 6px 2px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+
+
+
+/* @end */
+
+/* @group Directory (tree) */
+
+/* for the tree view */
+
+.ftvtree {
+ font-family: sans-serif;
+ margin: 0px;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+ font-size: 9pt;
+ font-weight: bold;
+ margin: 5px;
+}
+
+.directory h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice. Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+ height: 61px;
+ background-repeat: no-repeat;
+ background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+ display: none;
+}
+*/
+
+.directory > h3 {
+ margin-top: 0;
+}
+
+.directory p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory div {
+ display: none;
+ margin: 0px;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+ font-size: 100%;
+ font-weight: bold;
+}
+
+.directory-alt h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+.directory-alt > h3 {
+ margin-top: 0;
+}
+
+.directory-alt p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory-alt div {
+ display: none;
+ margin: 0px;
+}
+
+.directory-alt img {
+ vertical-align: -30%;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+}
+
+address {
+ font-style: normal;
+ color: ##33;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid ##37;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: ##47;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+}
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ height:30px;
+ line-height:30px;
+ color:##9b;
+ border:solid 1px ##ca;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:##45;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:##80;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:##45;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ padding-left: 5px;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: ##FA;
+ margin: 0px;
+ border-bottom: 1px solid ##CC;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug
+{
+ border-left:4px solid;
+ padding: 0 0 0 6px;
+}
+
+dl.note
+{
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ border-color: #505050;
+}
+
+dl.todo
+{
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ border-color: #C08050;
+}
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid ##70;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
diff --git a/src/doxygen.h b/src/doxygen.h
new file mode 100644
index 0000000..3f3a630
--- /dev/null
+++ b/src/doxygen.h
@@ -0,0 +1,173 @@
+/******************************************************************************
+ *
+ * $Id: doxygen.h,v 1.39 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DOXYGEN_H
+#define DOXYGEN_H
+
+#include "qtbc.h"
+#include <qdatetime.h>
+#include <qcache.h>
+#include "ftextstream.h"
+#include "groupdef.h"
+#include "filedef.h"
+#include "classdef.h"
+#include "memberdef.h"
+#include "classlist.h"
+#include "membername.h"
+#include "filename.h"
+#include "namespacedef.h"
+#include "formula.h"
+#include "section.h"
+#include "membergroup.h"
+#include "reflist.h"
+#include "dirdef.h"
+#include "index.h"
+#include "docsets.h"
+
+class PageSList;
+class PageSDict;
+class PageDef;
+class SearchIndex;
+class ParserManager;
+class ObjCache;
+class Store;
+class QFileInfo;
+class BufStr;
+
+typedef QList<QCString> StringList;
+typedef QDict<FileDef> FileDict;
+typedef QDict<GroupDef> GroupDict;
+
+class StringDict : public QDict<QCString>
+{
+ public:
+ StringDict(uint size=17) : QDict<QCString>(size) {}
+ virtual ~StringDict() {}
+};
+
+struct LookupInfo
+{
+ LookupInfo() : classDef(0), typeDef(0) {}
+ LookupInfo(ClassDef *cd,MemberDef *td,QCString ts,QCString rt)
+ : classDef(cd), typeDef(td), templSpec(ts),resolvedType(rt) {}
+ ClassDef *classDef;
+ MemberDef *typeDef;
+ QCString templSpec;
+ QCString resolvedType;
+};
+
+extern QCString g_spaces;
+
+/*! \brief This class serves as a namespace for global variables used by doxygen.
+ *
+ * All fields in this class are public and static, so they can be used directly.
+ */
+class Doxygen
+{
+ public:
+ static ClassSDict *classSDict;
+ static ClassSDict *hiddenClasses;
+ static PageSDict *exampleSDict;
+ static PageSDict *pageSDict;
+ static PageDef *mainPage;
+ static bool insideMainPage;
+ static FileNameDict *includeNameDict;
+ static FileNameDict *exampleNameDict;
+ static FileNameDict *inputNameDict;
+ static FileNameList *inputNameList;
+ static FileNameDict *imageNameDict;
+ static FileNameDict *dotFileNameDict;
+ static FileNameDict *mscFileNameDict;
+ static QStrList tagfileList;
+ static MemberNameSDict *memberNameSDict;
+ static MemberNameSDict *functionNameSDict;
+ static FTextStream tagFile;
+ static SectionDict sectionDict;
+ static StringDict namespaceAliasDict;
+ static GroupSDict *groupSDict;
+ static NamespaceSDict *namespaceSDict;
+ static FormulaList formulaList;
+ static FormulaDict formulaDict;
+ static FormulaDict formulaNameDict;
+ static StringDict tagDestinationDict;
+ static StringDict aliasDict;
+ static QIntDict<MemberGroupInfo> memGrpInfoDict;
+ static QDict<void> expandAsDefinedDict;
+ static NamespaceDef *globalScope;
+ static QDict<RefList> *xrefLists; // array of xref lists: todo, test, bug, deprecated ...
+ static QCString htmlFileExtension;
+ static bool parseSourcesNeeded;
+ static QTime runningTime;
+ static SearchIndex *searchIndex;
+ static QDict<DefinitionIntf> *symbolMap;
+ static bool outputToWizard;
+ static QDict<int> *htmlDirMap;
+ static QCache<LookupInfo> lookupCache;
+ static DirSDict *directories;
+ static SDict<DirRelation> dirRelations;
+ static ParserManager *parserManager;
+ static bool suppressDocWarnings;
+ static ObjCache *symbolCache;
+ static Store *symbolStorage;
+ static QCString objDBFileName;
+ static QCString entryDBFileName;
+ static bool gatherDefines;
+ static bool userComments;
+ static IndexList indexList;
+ static int subpageNestingLevel;
+ static QCString spaces;
+};
+
+void initDoxygen();
+void readConfiguration(int argc, char **argv);
+void checkConfiguration();
+void adjustConfiguration();
+void searchInputFiles(StringList &inputFiles);
+void parseInput();
+void generateOutput();
+void readAliases();
+void readFormulaRepository();
+int readFileOrDirectory(const char *s,
+ FileNameList *fnList,
+ FileNameDict *fnDict,
+ StringDict *exclDict,
+ QStrList *patList,
+ QStrList *exclPatList,
+ StringList *resultList,
+ StringDict *resultDict,
+ bool recursive,
+ bool errorIfNotExist=TRUE,
+ QDict<void> *killDict = 0
+ );
+int readDir(QFileInfo *fi,
+ FileNameList *fnList,
+ FileNameDict *fnDict,
+ StringDict *exclDict,
+ QStrList *patList,
+ QStrList *exclPatList,
+ StringList *resultList,
+ StringDict *resultDict,
+ bool errorIfNotExist,
+ bool recursive,
+ QDict<void> *killDict
+ );
+void copyAndFilterFile(const char *fileName,BufStr &dest);
+
+#define NEWMATCH
+
+#endif
diff --git a/src/doxygen.pro b/src/doxygen.pro
new file mode 100644
index 0000000..3451d94
--- /dev/null
+++ b/src/doxygen.pro
@@ -0,0 +1,44 @@
+#
+# This file was generated from doxygen.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+#
+# $Id: doxygen.pro.in,v 1.6 2001/03/19 19:27:40 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+# TMake project file for doxygen
+
+TEMPLATE = app.t
+CONFIG = console warn_on debug
+HEADERS = doxygen.h
+SOURCES = main.cpp
+unix:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
+win32-msvc:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib
+win32-borland:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
+win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread
+win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
+INCLUDEPATH += ../qtools ../libmd5 .
+DESTDIR = ../bin
+TARGET = doxygen
+unix:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
+win32:TARGETDEPS = ..\lib\doxygen.lib ..\lib\doxycfg.lib
+win32-g++:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
+win32-mingw:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
+OBJECTS_DIR = ../objects
+
+TMAKE_MOC = /usr/bin/moc
diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in
new file mode 100644
index 0000000..afdf242
--- /dev/null
+++ b/src/doxygen.pro.in
@@ -0,0 +1,39 @@
+#
+# $Id: doxygen.pro.in,v 1.6 2001/03/19 19:27:40 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+# TMake project file for doxygen
+
+TEMPLATE = app.t
+CONFIG = console warn_on $extraopts
+HEADERS = doxygen.h
+SOURCES = main.cpp
+unix:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
+win32-msvc:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib
+win32-borland:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
+win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread
+win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
+INCLUDEPATH += ../qtools ../libmd5 .
+DESTDIR = ../bin
+TARGET = doxygen
+unix:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
+win32:TARGETDEPS = ..\lib\doxygen.lib ..\lib\doxycfg.lib
+win32-g++:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
+win32-mingw:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
+OBJECTS_DIR = ../objects
+
diff --git a/src/doxygen_css.h b/src/doxygen_css.h
new file mode 100644
index 0000000..b0ec3de
--- /dev/null
+++ b/src/doxygen_css.h
@@ -0,0 +1,835 @@
+"/* The standard CSS for doxygen */\n"
+"\n"
+"body, table, div, p, dl {\n"
+" font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;\n"
+" font-size: 12px;\n"
+"}\n"
+"\n"
+"/* @group Heading Levels */\n"
+"\n"
+"h1 {\n"
+" font-size: 150%;\n"
+"}\n"
+"\n"
+".title {\n"
+" font-size: 150%;\n"
+" font-weight: bold;\n"
+" margin: 10px 2px;\n"
+"}\n"
+"\n"
+"h2 {\n"
+" font-size: 120%;\n"
+"}\n"
+"\n"
+"h3 {\n"
+" font-size: 100%;\n"
+"}\n"
+"\n"
+"dt {\n"
+" font-weight: bold;\n"
+"}\n"
+"\n"
+"div.multicol {\n"
+" -moz-column-gap: 1em;\n"
+" -webkit-column-gap: 1em;\n"
+" -moz-column-count: 3;\n"
+" -webkit-column-count: 3;\n"
+"}\n"
+"\n"
+"p.startli, p.startdd, p.starttd {\n"
+" margin-top: 2px;\n"
+"}\n"
+"\n"
+"p.endli {\n"
+" margin-bottom: 0px;\n"
+"}\n"
+"\n"
+"p.enddd {\n"
+" margin-bottom: 4px;\n"
+"}\n"
+"\n"
+"p.endtd {\n"
+" margin-bottom: 2px;\n"
+"}\n"
+"\n"
+"/* @end */\n"
+"\n"
+"caption {\n"
+" font-weight: bold;\n"
+"}\n"
+"\n"
+"span.legend {\n"
+" font-size: 70%;\n"
+" text-align: center;\n"
+"}\n"
+"\n"
+"h3.version {\n"
+" font-size: 90%;\n"
+" text-align: center;\n"
+"}\n"
+"\n"
+"div.qindex, div.navtab{\n"
+" background-color: ##ee;\n"
+" border: 1px solid ##b0;\n"
+" text-align: center;\n"
+" margin: 2px;\n"
+" padding: 2px;\n"
+"}\n"
+"\n"
+"div.qindex, div.navpath {\n"
+" width: 100%;\n"
+" line-height: 140%;\n"
+"}\n"
+"\n"
+"div.navtab {\n"
+" margin-right: 15px;\n"
+"}\n"
+"\n"
+"/* @group Link Styling */\n"
+"\n"
+"a {\n"
+" color: ##50;\n"
+" font-weight: normal;\n"
+" text-decoration: none;\n"
+"}\n"
+"\n"
+".contents a:visited {\n"
+" color: ##60;\n"
+"}\n"
+"\n"
+"a:hover {\n"
+" text-decoration: underline;\n"
+"}\n"
+"\n"
+"a.qindex {\n"
+" font-weight: bold;\n"
+"}\n"
+"\n"
+"a.qindexHL {\n"
+" font-weight: bold;\n"
+" background-color: ##AA;\n"
+" color: #ffffff;\n"
+" border: 1px double ##98;\n"
+"}\n"
+"\n"
+".contents a.qindexHL:visited {\n"
+" color: #ffffff;\n"
+"}\n"
+"\n"
+"a.el {\n"
+" font-weight: bold;\n"
+"}\n"
+"\n"
+"a.elRef {\n"
+"}\n"
+"\n"
+"a.code {\n"
+" color: ##60;\n"
+"}\n"
+"\n"
+"a.codeRef {\n"
+" color: ##60;\n"
+"}\n"
+"\n"
+"/* @end */\n"
+"\n"
+"dl.el {\n"
+" margin-left: -1cm;\n"
+"}\n"
+"\n"
+".fragment {\n"
+" font-family: monospace, fixed;\n"
+" font-size: 105%;\n"
+"}\n"
+"\n"
+"pre.fragment {\n"
+" border: 1px solid ##CC;\n"
+" background-color: ##FC;\n"
+" padding: 4px 6px;\n"
+" margin: 4px 8px 4px 2px;\n"
+" overflow: auto;\n"
+" word-wrap: break-word;\n"
+" font-size: 9pt;\n"
+" line-height: 125%;\n"
+"}\n"
+"\n"
+"div.ah {\n"
+" background-color: black;\n"
+" font-weight: bold;\n"
+" color: #ffffff;\n"
+" margin-bottom: 3px;\n"
+" margin-top: 3px;\n"
+" padding: 0.2em;\n"
+" border: solid thin #333;\n"
+" border-radius: 0.5em;\n"
+" -webkit-border-radius: .5em;\n"
+" -moz-border-radius: .5em;\n"
+" box-shadow: 2px 2px 3px #999;\n"
+" -webkit-box-shadow: 2px 2px 3px #999;\n"
+" -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;\n"
+" background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));\n"
+" background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);\n"
+"}\n"
+"\n"
+"div.groupHeader {\n"
+" margin-left: 16px;\n"
+" margin-top: 12px;\n"
+" font-weight: bold;\n"
+"}\n"
+"\n"
+"div.groupText {\n"
+" margin-left: 16px;\n"
+" font-style: italic;\n"
+"}\n"
+"\n"
+"body {\n"
+" background: white;\n"
+" color: black;\n"
+" margin: 0;\n"
+"}\n"
+"\n"
+"div.contents {\n"
+" margin-top: 10px;\n"
+" margin-left: 10px;\n"
+" margin-right: 5px;\n"
+"}\n"
+"\n"
+"td.indexkey {\n"
+" background-color: ##ee;\n"
+" font-weight: bold;\n"
+" border: 1px solid ##cc;\n"
+" margin: 2px 0px 2px 0;\n"
+" padding: 2px 10px;\n"
+"}\n"
+"\n"
+"td.indexvalue {\n"
+" background-color: ##ee;\n"
+" border: 1px solid ##cc;\n"
+" padding: 2px 10px;\n"
+" margin: 2px 0px;\n"
+"}\n"
+"\n"
+"tr.memlist {\n"
+" background-color: ##f0;\n"
+"}\n"
+"\n"
+"p.formulaDsp {\n"
+" text-align: center;\n"
+"}\n"
+"\n"
+"img.formulaDsp {\n"
+" \n"
+"}\n"
+"\n"
+"img.formulaInl {\n"
+" vertical-align: middle;\n"
+"}\n"
+"\n"
+"div.center {\n"
+" text-align: center;\n"
+" margin-top: 0px;\n"
+" margin-bottom: 0px;\n"
+" padding: 0px;\n"
+"}\n"
+"\n"
+"div.center img {\n"
+" border: 0px;\n"
+"}\n"
+"\n"
+"address.footer {\n"
+" text-align: right;\n"
+" padding-right: 12px;\n"
+"}\n"
+"\n"
+"img.footer {\n"
+" border: 0px;\n"
+" vertical-align: middle;\n"
+"}\n"
+"\n"
+"/* @group Code Colorization */\n"
+"\n"
+"span.keyword {\n"
+" color: #008000\n"
+"}\n"
+"\n"
+"span.keywordtype {\n"
+" color: #604020\n"
+"}\n"
+"\n"
+"span.keywordflow {\n"
+" color: #e08000\n"
+"}\n"
+"\n"
+"span.comment {\n"
+" color: #800000\n"
+"}\n"
+"\n"
+"span.preprocessor {\n"
+" color: #806020\n"
+"}\n"
+"\n"
+"span.stringliteral {\n"
+" color: #002080\n"
+"}\n"
+"\n"
+"span.charliteral {\n"
+" color: #008080\n"
+"}\n"
+"\n"
+"span.vhdldigit { \n"
+" color: #ff00ff \n"
+"}\n"
+"\n"
+"span.vhdlchar { \n"
+" color: #000000 \n"
+"}\n"
+"\n"
+"span.vhdlkeyword { \n"
+" color: #700070 \n"
+"}\n"
+"\n"
+"span.vhdllogic { \n"
+" color: #ff0000 \n"
+"}\n"
+"\n"
+"/* @end */\n"
+"\n"
+"/*\n"
+".search {\n"
+" color: #003399;\n"
+" font-weight: bold;\n"
+"}\n"
+"\n"
+"form.search {\n"
+" margin-bottom: 0px;\n"
+" margin-top: 0px;\n"
+"}\n"
+"\n"
+"input.search {\n"
+" font-size: 75%;\n"
+" color: #000080;\n"
+" font-weight: normal;\n"
+" background-color: #e8eef2;\n"
+"}\n"
+"*/\n"
+"\n"
+"td.tiny {\n"
+" font-size: 75%;\n"
+"}\n"
+"\n"
+".dirtab {\n"
+" padding: 4px;\n"
+" border-collapse: collapse;\n"
+" border: 1px solid ##b0;\n"
+"}\n"
+"\n"
+"th.dirtab {\n"
+" background: ##ee;\n"
+" font-weight: bold;\n"
+"}\n"
+"\n"
+"hr {\n"
+" height: 0px;\n"
+" border: none;\n"
+" border-top: 1px solid ##66;\n"
+"}\n"
+"\n"
+"hr.footer {\n"
+" height: 1px;\n"
+"}\n"
+"\n"
+"/* @group Member Descriptions */\n"
+"\n"
+"table.memberdecls {\n"
+" border-spacing: 0px;\n"
+" padding: 0px;\n"
+"}\n"
+"\n"
+".mdescLeft, .mdescRight,\n"
+".memItemLeft, .memItemRight,\n"
+".memTemplItemLeft, .memTemplItemRight, .memTemplParams {\n"
+" background-color: ##FA;\n"
+" border: none;\n"
+" margin: 4px;\n"
+" padding: 1px 0 0 8px;\n"
+"}\n"
+"\n"
+".mdescLeft, .mdescRight {\n"
+" padding: 0px 8px 4px 8px;\n"
+" color: #555;\n"
+"}\n"
+"\n"
+".memItemLeft, .memItemRight, .memTemplParams {\n"
+" border-top: 1px solid ##cc;\n"
+"}\n"
+"\n"
+".memItemLeft, .memTemplItemLeft {\n"
+" white-space: nowrap;\n"
+"}\n"
+"\n"
+".memItemRight {\n"
+" width: 100%;\n"
+"}\n"
+"\n"
+".memTemplParams {\n"
+" color: ##60;\n"
+" white-space: nowrap;\n"
+"}\n"
+"\n"
+"/* @end */\n"
+"\n"
+"/* @group Member Details */\n"
+"\n"
+"/* Styles for detailed member documentation */\n"
+"\n"
+".memtemplate {\n"
+" font-size: 80%;\n"
+" color: ##60;\n"
+" font-weight: normal;\n"
+" margin-left: 9px;\n"
+"}\n"
+"\n"
+".memnav {\n"
+" background-color: ##ee;\n"
+" border: 1px solid ##b0;\n"
+" text-align: center;\n"
+" margin: 2px;\n"
+" margin-right: 15px;\n"
+" padding: 2px;\n"
+"}\n"
+"\n"
+".mempage {\n"
+" width: 100%;\n"
+"}\n"
+"\n"
+".memitem {\n"
+" padding: 0;\n"
+" margin-bottom: 10px;\n"
+" margin-right: 5px;\n"
+"}\n"
+"\n"
+".memname {\n"
+" white-space: nowrap;\n"
+" font-weight: bold;\n"
+" margin-left: 6px;\n"
+"}\n"
+"\n"
+".memproto {\n"
+" border-top: 1px solid ##B4;\n"
+" border-left: 1px solid ##B4;\n"
+" border-right: 1px solid ##B4;\n"
+" padding: 6px 0px 6px 0px;\n"
+" color: ##2b;\n"
+" font-weight: bold;\n"
+" text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);\n"
+" /* opera specific markup */\n"
+" box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n"
+" border-top-right-radius: 8px;\n"
+" border-top-left-radius: 8px;\n"
+" /* firefox specific markup */\n"
+" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n"
+" -moz-border-radius-topright: 8px;\n"
+" -moz-border-radius-topleft: 8px;\n"
+" /* webkit specific markup */\n"
+" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n"
+" -webkit-border-top-right-radius: 8px;\n"
+" -webkit-border-top-left-radius: 8px;\n"
+" background-image:url('nav_f.png');\n"
+" background-repeat:repeat-x;\n"
+" background-color: ##E6;\n"
+"\n"
+"}\n"
+"\n"
+".memdoc {\n"
+" border-bottom: 1px solid ##B4; \n"
+" border-left: 1px solid ##B4; \n"
+" border-right: 1px solid ##B4; \n"
+" padding: 2px 5px;\n"
+" background-color: ##FC;\n"
+" border-top-width: 0;\n"
+" /* opera specific markup */\n"
+" border-bottom-left-radius: 8px;\n"
+" border-bottom-right-radius: 8px;\n"
+" box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n"
+" /* firefox specific markup */\n"
+" -moz-border-radius-bottomleft: 8px;\n"
+" -moz-border-radius-bottomright: 8px;\n"
+" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n"
+" background-image: -moz-linear-gradient(center top, ##FF 0%, ##FF 60%, ##F8 95%, ##F0);\n"
+" /* webkit specific markup */\n"
+" -webkit-border-bottom-left-radius: 8px;\n"
+" -webkit-border-bottom-right-radius: 8px;\n"
+" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n"
+" background-image: -webkit-gradient(linear,center top,center bottom,from(##FF), color-stop(0.6,##FF), color-stop(0.60,##FF), color-stop(0.95,##F8), to(##F0));\n"
+"}\n"
+"\n"
+".paramkey {\n"
+" text-align: right;\n"
+"}\n"
+"\n"
+".paramtype {\n"
+" white-space: nowrap;\n"
+"}\n"
+"\n"
+".paramname {\n"
+" color: #602020;\n"
+" white-space: nowrap;\n"
+"}\n"
+".paramname em {\n"
+" font-style: normal;\n"
+"}\n"
+"\n"
+".params, .retval, .exception, .tparams {\n"
+" border-spacing: 6px 2px;\n"
+"} \n"
+"\n"
+".params .paramname, .retval .paramname {\n"
+" font-weight: bold;\n"
+" vertical-align: top;\n"
+"}\n"
+" \n"
+".params .paramtype {\n"
+" font-style: italic;\n"
+" vertical-align: top;\n"
+"} \n"
+" \n"
+".params .paramdir {\n"
+" font-family: \"courier new\",courier,monospace;\n"
+" vertical-align: top;\n"
+"}\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"/* @end */\n"
+"\n"
+"/* @group Directory (tree) */\n"
+"\n"
+"/* for the tree view */\n"
+"\n"
+".ftvtree {\n"
+" font-family: sans-serif;\n"
+" margin: 0px;\n"
+"}\n"
+"\n"
+"/* these are for tree view when used as main index */\n"
+"\n"
+".directory {\n"
+" font-size: 9pt;\n"
+" font-weight: bold;\n"
+" margin: 5px;\n"
+"}\n"
+"\n"
+".directory h3 {\n"
+" margin: 0px;\n"
+" margin-top: 1em;\n"
+" font-size: 11pt;\n"
+"}\n"
+"\n"
+"/*\n"
+"The following two styles can be used to replace the root node title\n"
+"with an image of your choice. Simply uncomment the next two styles,\n"
+"specify the name of your image and be sure to set 'height' to the\n"
+"proper pixel height of your image.\n"
+"*/\n"
+"\n"
+"/*\n"
+".directory h3.swap {\n"
+" height: 61px;\n"
+" background-repeat: no-repeat;\n"
+" background-image: url(\"yourimage.gif\");\n"
+"}\n"
+".directory h3.swap span {\n"
+" display: none;\n"
+"}\n"
+"*/\n"
+"\n"
+".directory > h3 {\n"
+" margin-top: 0;\n"
+"}\n"
+"\n"
+".directory p {\n"
+" margin: 0px;\n"
+" white-space: nowrap;\n"
+"}\n"
+"\n"
+".directory div {\n"
+" display: none;\n"
+" margin: 0px;\n"
+"}\n"
+"\n"
+".directory img {\n"
+" vertical-align: -30%;\n"
+"}\n"
+"\n"
+"/* these are for tree view when not used as main index */\n"
+"\n"
+".directory-alt {\n"
+" font-size: 100%;\n"
+" font-weight: bold;\n"
+"}\n"
+"\n"
+".directory-alt h3 {\n"
+" margin: 0px;\n"
+" margin-top: 1em;\n"
+" font-size: 11pt;\n"
+"}\n"
+"\n"
+".directory-alt > h3 {\n"
+" margin-top: 0;\n"
+"}\n"
+"\n"
+".directory-alt p {\n"
+" margin: 0px;\n"
+" white-space: nowrap;\n"
+"}\n"
+"\n"
+".directory-alt div {\n"
+" display: none;\n"
+" margin: 0px;\n"
+"}\n"
+"\n"
+".directory-alt img {\n"
+" vertical-align: -30%;\n"
+"}\n"
+"\n"
+"/* @end */\n"
+"\n"
+"div.dynheader {\n"
+" margin-top: 8px;\n"
+"}\n"
+"\n"
+"address {\n"
+" font-style: normal;\n"
+" color: ##33;\n"
+"}\n"
+"\n"
+"table.doxtable {\n"
+" border-collapse:collapse;\n"
+"}\n"
+"\n"
+"table.doxtable td, table.doxtable th {\n"
+" border: 1px solid ##37;\n"
+" padding: 3px 7px 2px;\n"
+"}\n"
+"\n"
+"table.doxtable th {\n"
+" background-color: ##47;\n"
+" color: #FFFFFF;\n"
+" font-size: 110%;\n"
+" padding-bottom: 4px;\n"
+" padding-top: 5px;\n"
+" text-align:left;\n"
+"}\n"
+"\n"
+".tabsearch {\n"
+" top: 0px;\n"
+" left: 10px;\n"
+" height: 36px;\n"
+" background-image: url('tab_b.png');\n"
+" z-index: 101;\n"
+" overflow: hidden;\n"
+" font-size: 13px;\n"
+"}\n"
+"\n"
+".navpath ul\n"
+"{\n"
+" font-size: 11px;\n"
+" background-image:url('tab_b.png');\n"
+" background-repeat:repeat-x;\n"
+" height:30px;\n"
+" line-height:30px;\n"
+" color:##9b;\n"
+" border:solid 1px ##ca;\n"
+" overflow:hidden;\n"
+" margin:0px;\n"
+" padding:0px;\n"
+"}\n"
+"\n"
+".navpath li\n"
+"{\n"
+" list-style-type:none;\n"
+" float:left;\n"
+" padding-left:10px;\n"
+" padding-right:15px;\n"
+" background-image:url('bc_s.png');\n"
+" background-repeat:no-repeat;\n"
+" background-position:right;\n"
+" color:##45;\n"
+"}\n"
+"\n"
+".navpath li.navelem a\n"
+"{\n"
+" height:32px;\n"
+" display:block;\n"
+" text-decoration: none;\n"
+" outline: none;\n"
+"}\n"
+"\n"
+".navpath li.navelem a:hover\n"
+"{\n"
+" color:##80;\n"
+"}\n"
+"\n"
+".navpath li.footer\n"
+"{\n"
+" list-style-type:none;\n"
+" float:right;\n"
+" padding-left:10px;\n"
+" padding-right:15px;\n"
+" background-image:none;\n"
+" background-repeat:no-repeat;\n"
+" background-position:right;\n"
+" color:##45;\n"
+" font-size: 8pt;\n"
+"}\n"
+"\n"
+"\n"
+"div.summary\n"
+"{\n"
+" float: right;\n"
+" font-size: 8pt;\n"
+" padding-right: 5px;\n"
+" width: 50%;\n"
+" text-align: right;\n"
+"} \n"
+"\n"
+"div.summary a\n"
+"{\n"
+" white-space: nowrap;\n"
+"}\n"
+"\n"
+"div.ingroups\n"
+"{\n"
+" font-size: 8pt;\n"
+" padding-left: 5px;\n"
+" width: 50%;\n"
+" text-align: left;\n"
+"}\n"
+"\n"
+"div.ingroups a\n"
+"{\n"
+" white-space: nowrap;\n"
+"}\n"
+"\n"
+"div.header\n"
+"{\n"
+" background-image:url('nav_h.png');\n"
+" background-repeat:repeat-x;\n"
+" background-color: ##FA;\n"
+" margin: 0px;\n"
+" border-bottom: 1px solid ##CC;\n"
+"}\n"
+"\n"
+"div.headertitle\n"
+"{\n"
+" padding: 5px 5px 5px 10px;\n"
+"}\n"
+"\n"
+"dl\n"
+"{\n"
+" padding: 0 0 0 10px;\n"
+"}\n"
+"\n"
+"dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug\n"
+"{\n"
+" border-left:4px solid;\n"
+" padding: 0 0 0 6px;\n"
+"}\n"
+"\n"
+"dl.note\n"
+"{\n"
+" border-color: #D0C000;\n"
+"}\n"
+"\n"
+"dl.warning, dl.attention\n"
+"{\n"
+" border-color: #FF0000;\n"
+"}\n"
+"\n"
+"dl.pre, dl.post, dl.invariant\n"
+"{\n"
+" border-color: #00D000;\n"
+"}\n"
+"\n"
+"dl.deprecated\n"
+"{\n"
+" border-color: #505050;\n"
+"}\n"
+"\n"
+"dl.todo\n"
+"{\n"
+" border-color: #00C0E0;\n"
+"}\n"
+"\n"
+"dl.test\n"
+"{\n"
+" border-color: #3030E0;\n"
+"}\n"
+"\n"
+"dl.bug\n"
+"{\n"
+" border-color: #C08050;\n"
+"}\n"
+"\n"
+"#projectlogo\n"
+"{\n"
+" text-align: center;\n"
+" vertical-align: bottom;\n"
+" border-collapse: separate;\n"
+"}\n"
+" \n"
+"#projectlogo img\n"
+"{ \n"
+" border: 0px none;\n"
+"}\n"
+" \n"
+"#projectname\n"
+"{\n"
+" font: 300% Tahoma, Arial,sans-serif;\n"
+" margin: 0px;\n"
+" padding: 2px 0px;\n"
+"}\n"
+" \n"
+"#projectbrief\n"
+"{\n"
+" font: 120% Tahoma, Arial,sans-serif;\n"
+" margin: 0px;\n"
+" padding: 0px;\n"
+"}\n"
+"\n"
+"#projectnumber\n"
+"{\n"
+" font: 50% Tahoma, Arial,sans-serif;\n"
+" margin: 0px;\n"
+" padding: 0px;\n"
+"}\n"
+"\n"
+"#titlearea\n"
+"{\n"
+" padding: 0px;\n"
+" margin: 0px;\n"
+" width: 100%;\n"
+" border-bottom: 1px solid ##70;\n"
+"}\n"
+"\n"
+".image\n"
+"{\n"
+" text-align: center;\n"
+"}\n"
+"\n"
+".dotgraph\n"
+"{\n"
+" text-align: center;\n"
+"}\n"
+"\n"
+".mscgraph\n"
+"{\n"
+" text-align: center;\n"
+"}\n"
+"\n"
+".caption\n"
+"{\n"
+" font-weight: bold;\n"
+"}\n"
+"\n"
diff --git a/src/doxytag.cpp b/src/doxytag.cpp
new file mode 100644
index 0000000..57dd1a1
--- /dev/null
+++ b/src/doxytag.cpp
@@ -0,0 +1,3923 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer tagYY_create_buffer
+#define yy_delete_buffer tagYY_delete_buffer
+#define yy_flex_debug tagYY_flex_debug
+#define yy_init_buffer tagYY_init_buffer
+#define yy_flush_buffer tagYY_flush_buffer
+#define yy_load_buffer_state tagYY_load_buffer_state
+#define yy_switch_to_buffer tagYY_switch_to_buffer
+#define yyin tagYYin
+#define yyleng tagYYleng
+#define yylex tagYYlex
+#define yylineno tagYYlineno
+#define yyout tagYYout
+#define yyrestart tagYYrestart
+#define yytext tagYYtext
+#define yywrap tagYYwrap
+#define yyalloc tagYYalloc
+#define yyrealloc tagYYrealloc
+#define yyfree tagYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE tagYYrestart(tagYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t tagYYleng;
+
+extern FILE *tagYYin, *tagYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up tagYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up tagYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via tagYYrestart()), so that the user can continue scanning by
+ * just pointing tagYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when tagYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t tagYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow tagYYwrap()'s to do buffer switches
+ * instead of setting up a fresh tagYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void tagYYrestart (FILE *input_file );
+void tagYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE tagYY_create_buffer (FILE *file,int size );
+void tagYY_delete_buffer (YY_BUFFER_STATE b );
+void tagYY_flush_buffer (YY_BUFFER_STATE b );
+void tagYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void tagYYpop_buffer_state (void );
+
+static void tagYYensure_buffer_stack (void );
+static void tagYY_load_buffer_state (void );
+static void tagYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER tagYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE tagYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE tagYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE tagYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *tagYYalloc (yy_size_t );
+void *tagYYrealloc (void *,yy_size_t );
+void tagYYfree (void * );
+
+#define yy_new_buffer tagYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ tagYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ tagYY_create_buffer(tagYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ tagYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ tagYY_create_buffer(tagYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+typedef unsigned char YY_CHAR;
+
+FILE *tagYYin = (FILE *) 0, *tagYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int tagYYlineno;
+
+int tagYYlineno = 1;
+
+extern char *tagYYtext;
+#define yytext_ptr tagYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up tagYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ tagYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 125
+#define YY_END_OF_BUFFER 126
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_accept[707] =
+ { 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 126, 123, 124, 123, 79, 81, 79, 81,
+ 123, 101, 100, 99, 99, 99, 96, 102, 123, 104,
+ 112, 112, 106, 106, 111, 123, 123, 92, 123, 93,
+ 123, 90, 90, 90, 123, 120, 119, 120, 119, 85,
+
+ 121, 122, 84, 83, 123, 81, 13, 13, 16, 14,
+ 16, 26, 26, 24, 18, 18, 24, 24, 24, 37,
+ 37, 37, 27, 35, 36, 37, 63, 63, 68, 68,
+ 56, 56, 61, 61, 70, 70, 75, 75, 39, 39,
+ 44, 44, 47, 47, 53, 53, 48, 0, 0, 0,
+ 0, 0, 81, 0, 0, 0, 81, 0, 100, 99,
+ 99, 99, 96, 102, 0, 0, 112, 112, 0, 0,
+ 0, 0, 0, 93, 0, 0, 90, 90, 90, 90,
+ 0, 0, 0, 0, 0, 0, 85, 122, 84, 83,
+ 0, 81, 0, 14, 0, 0, 0, 18, 0, 0,
+
+ 23, 0, 0, 0, 27, 0, 0, 0, 0, 0,
+ 36, 0, 0, 63, 0, 0, 0, 0, 0, 56,
+ 0, 0, 0, 0, 0, 70, 0, 0, 0, 0,
+ 0, 39, 0, 0, 0, 0, 0, 47, 0, 0,
+ 0, 0, 0, 80, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 81, 0, 99, 99, 103, 0, 112,
+ 0, 0, 0, 109, 0, 0, 0, 90, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 21, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 6,
+ 0, 0, 1, 0, 0, 81, 0, 0, 99, 99,
+ 0, 112, 108, 107, 0, 0, 0, 0, 90, 113,
+ 0, 116, 115, 0, 0, 0, 0, 0, 25, 25,
+ 20, 19, 0, 0, 30, 29, 0, 0, 0, 0,
+ 0, 65, 64, 0, 0, 0, 58, 57, 0, 0,
+ 0, 72, 71, 0, 0, 0, 41, 40, 0, 0,
+ 0, 50, 49, 0, 0, 0, 0, 77, 0, 0,
+ 0, 0, 81, 0, 0, 99, 0, 0, 112, 0,
+
+ 91, 0, 0, 90, 114, 0, 0, 0, 0, 0,
+ 25, 0, 28, 0, 0, 33, 0, 66, 0, 0,
+ 59, 0, 76, 73, 0, 45, 42, 0, 54, 51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 81, 0,
+ 0, 0, 0, 0, 112, 110, 0, 88, 90, 118,
+ 117, 82, 0, 15, 25, 22, 32, 31, 0, 67,
+ 0, 60, 74, 43, 52, 0, 0, 0, 0, 0,
+ 0, 0, 81, 0, 0, 0, 0, 0, 112, 0,
+ 0, 90, 0, 25, 0, 62, 0, 0, 0, 0,
+ 0, 0, 81, 0, 0, 0, 0, 105, 0, 87,
+
+ 90, 0, 25, 69, 0, 0, 78, 0, 0, 0,
+ 7, 0, 95, 0, 0, 0, 0, 89, 0, 0,
+ 89, 89, 89, 90, 90, 89, 12, 25, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 89, 0, 0,
+ 0, 0, 0, 89, 0, 90, 90, 89, 25, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 0,
+ 0, 0, 0, 0, 0, 90, 17, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 89, 89,
+ 0, 90, 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 89, 0, 89, 0, 89, 89, 90,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 98,
+ 0, 0, 89, 0, 0, 89, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 97, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 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, 2, 94, 38,
+ 0, 0, 0, 0, 0, 0, 0, 55, 0, 0,
+ 0, 10, 0, 0, 0, 0, 46, 0, 0, 11,
+
+ 0, 0, 0, 4, 3, 0
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 4, 5, 6, 7, 1, 8, 9, 1, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 18,
+ 20, 18, 18, 18, 18, 18, 18, 21, 22, 23,
+ 24, 25, 1, 26, 27, 27, 28, 27, 27, 29,
+ 27, 27, 30, 27, 27, 27, 27, 27, 27, 27,
+ 27, 31, 27, 27, 27, 27, 27, 27, 27, 27,
+ 32, 1, 33, 8, 34, 1, 35, 36, 37, 38,
+
+ 39, 40, 41, 42, 43, 27, 27, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 27, 54, 55,
+ 56, 27, 1, 57, 1, 58, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[59] =
+ { 0,
+ 1, 1, 2, 3, 4, 5, 1, 4, 6, 1,
+ 1, 4, 7, 8, 7, 9, 10, 11, 11, 11,
+ 12, 1, 13, 10, 14, 3, 15, 15, 15, 15,
+ 15, 4, 4, 11, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 4, 16
+ } ;
+
+static yyconst flex_int16_t yy_base[746] =
+ { 0,
+ 2054, 2053, 0, 36, 57, 58, 81, 0, 139, 0,
+ 197, 255, 60, 61, 313, 0, 371, 0, 429, 0,
+ 485, 0, 209, 210, 543, 0, 59, 66, 601, 0,
+ 212, 213, 215, 222, 659, 0, 715, 0, 771, 0,
+ 829, 0, 214, 223, 887, 913, 939, 0, 995, 1051,
+ 1109, 0, 67, 68, 238, 265, 267, 280, 287, 288,
+ 289, 296, 2055, 2058, 2058, 0, 484, 0, 486, 2008,
+ 2018, 2058, 0, 0, 2008, 2008, 0, 0, 191, 2058,
+ 0, 2002, 2058, 34, 2058, 2010, 2009, 2058, 2012, 0,
+ 224, 192, 253, 0, 2029, 2058, 2058, 684, 2058, 0,
+
+ 2058, 0, 0, 0, 2028, 1167, 2058, 2009, 2058, 0,
+ 2018, 2058, 2021, 2058, 0, 199, 2030, 2001, 2000, 2058,
+ 502, 685, 2058, 2058, 0, 2021, 0, 0, 2033, 492,
+ 0, 0, 2032, 974, 0, 0, 2031, 976, 0, 0,
+ 2030, 991, 0, 0, 2029, 995, 2058, 2010, 2016, 1978,
+ 2025, 1978, 0, 232, 1984, 1988, 1983, 2020, 0, 0,
+ 1988, 1978, 0, 0, 1996, 1968, 0, 1980, 1966, 1965,
+ 1972, 1961, 2010, 0, 1975, 1989, 452, 466, 0, 468,
+ 1976, 1965, 1957, 1956, 1971, 1953, 0, 0, 0, 0,
+ 1957, 0, 2000, 0, 1980, 1981, 1980, 0, 1948, 1947,
+
+ 2058, 1954, 1943, 737, 2058, 1951, 1943, 1942, 1957, 1939,
+ 0, 1966, 480, 0, 1955, 1944, 1936, 1935, 1933, 0,
+ 1935, 1939, 1931, 1930, 1928, 0, 1965, 1934, 1926, 1925,
+ 1923, 0, 1960, 1929, 1921, 1920, 1918, 0, 1955, 1924,
+ 1916, 1915, 1913, 2058, 1950, 1929, 1917, 1923, 281, 1957,
+ 1935, 1934, 1935, 1918, 211, 1905, 1916, 2058, 1904, 1903,
+ 1930, 1929, 1911, 2058, 0, 1902, 1931, 674, 1922, 1898,
+ 1923, 1922, 1892, 1895, 1891, 1894, 1922, 1891, 1915, 1914,
+ 1896, 2058, 1886, 1911, 1910, 1880, 1883, 2058, 284, 1879,
+ 1880, 1905, 1904, 1878, 1885, 1875, 1900, 1899, 1873, 1904,
+
+ 1870, 1895, 1894, 1868, 1899, 1865, 1890, 1889, 1863, 1894,
+ 1860, 1885, 1884, 1858, 1900, 1867, 1867, 1876, 1865, 2058,
+ 1862, 1875, 2058, 1874, 469, 1846, 1851, 1844, 1842, 1888,
+ 1844, 1855, 2058, 2058, 1837, 1863, 1832, 1851, 860, 2058,
+ 1863, 2058, 2058, 1836, 1831, 1843, 1846, 1845, 0, 1831,
+ 2058, 2058, 1826, 1855, 2058, 2058, 1828, 1823, 1849, 1832,
+ 1850, 2058, 2058, 1819, 1830, 1847, 2058, 2058, 1816, 1842,
+ 1844, 2058, 2058, 1813, 1839, 1841, 2058, 2058, 1810, 1836,
+ 1838, 2058, 2058, 1807, 1820, 1813, 1811, 2058, 1811, 1810,
+ 1811, 497, 1809, 1816, 1811, 1845, 1817, 1801, 1794, 1806,
+
+ 2058, 1788, 1818, 874, 2058, 1820, 1819, 1815, 1794, 1813,
+ 1798, 1797, 2058, 1813, 1812, 2058, 1782, 2058, 1810, 1807,
+ 2058, 1808, 2058, 2058, 1807, 2058, 2058, 1806, 2058, 2058,
+ 1805, 1779, 1786, 1785, 1780, 1787, 1802, 902, 1768, 1768,
+ 1778, 1786, 1777, 1774, 1767, 2058, 1761, 1789, 482, 2058,
+ 2058, 2058, 1772, 2058, 1760, 2058, 2058, 2058, 1785, 2058,
+ 1802, 2058, 2058, 2058, 2058, 1752, 1781, 1781, 1763, 1752,
+ 1777, 502, 1750, 1749, 1775, 1759, 1757, 1771, 1745, 1759,
+ 1758, 966, 1768, 1756, 1784, 2058, 1733, 1765, 1781, 1740,
+ 1734, 704, 1780, 1759, 1776, 1741, 1741, 0, 1738, 2058,
+
+ 1224, 1772, 1725, 2058, 1724, 1733, 2058, 1750, 1749, 879,
+ 2058, 1766, 2058, 1732, 1720, 1745, 1281, 1034, 1002, 1231,
+ 1254, 2058, 1759, 1018, 1023, 1291, 2058, 1719, 1729, 1741,
+ 1722, 893, 1028, 1719, 1705, 1715, 1743, 1307, 1708, 1706,
+ 1684, 1667, 1665, 691, 1675, 1027, 984, 0, 1651, 1659,
+ 1681, 1645, 1629, 1622, 261, 1609, 1613, 1599, 2058, 1586,
+ 1575, 1580, 1605, 1604, 1572, 1040, 0, 1602, 700, 1574,
+ 1571, 1591, 699, 1605, 1564, 1572, 1568, 1584, 997, 1064,
+ 1583, 1043, 1598, 1553, 1542, 1530, 1575, 1553, 1011, 1571,
+ 1535, 1531, 1514, 1068, 1524, 1069, 1518, 1221, 1548, 1047,
+
+ 1059, 1514, 1521, 1514, 1526, 1513, 1204, 1505, 1507, 2058,
+ 1505, 1507, 1226, 1311, 1310, 1349, 1316, 1313, 1319, 1316,
+ 1305, 1305, 1331, 1349, 882, 1302, 2058, 1306, 1328, 1327,
+ 1312, 1304, 1300, 1298, 1292, 1317, 2058, 1306, 1291, 1208,
+ 1297, 1287, 1283, 1294, 1296, 1306, 1305, 2058, 1324, 1291,
+ 1224, 1285, 1272, 1271, 1278, 1308, 1304, 1263, 1263, 979,
+ 1283, 1279, 1257, 1249, 1260, 1240, 1249, 1241, 976, 1273,
+ 1271, 1224, 1251, 1235, 1230, 1221, 1235, 1229, 2058, 2058,
+ 1200, 1234, 1144, 1118, 1068, 1100, 1076, 2058, 1030, 1036,
+ 1048, 2058, 1049, 1011, 983, 925, 2058, 850, 730, 2058,
+
+ 302, 250, 209, 2058, 2058, 2058, 1364, 1380, 1396, 1412,
+ 1428, 1444, 1460, 1476, 1492, 1508, 1524, 195, 524, 1534,
+ 881, 1543, 1088, 1238, 1243, 1552, 1562, 1246, 64, 1568,
+ 1584, 1597, 1603, 1615, 1257, 1631, 1647, 1663, 1679, 1695,
+ 1711, 1727, 1741, 1746, 1752
+ } ;
+
+static yyconst flex_int16_t yy_def[746] =
+ { 0,
+ 707, 707, 706, 3, 707, 707, 706, 7, 706, 9,
+ 708, 708, 707, 707, 706, 15, 706, 17, 706, 19,
+ 707, 21, 707, 707, 706, 25, 707, 707, 706, 29,
+ 707, 707, 709, 709, 706, 35, 707, 37, 706, 39,
+ 706, 41, 710, 710, 711, 711, 706, 47, 712, 712,
+ 706, 51, 713, 713, 714, 714, 715, 715, 716, 716,
+ 717, 717, 706, 706, 706, 718, 706, 719, 706, 719,
+ 706, 706, 720, 721, 721, 721, 722, 723, 706, 706,
+ 724, 724, 706, 706, 706, 706, 706, 706, 706, 725,
+ 706, 726, 726, 727, 706, 706, 706, 706, 706, 728,
+
+ 706, 729, 730, 731, 706, 706, 706, 706, 706, 732,
+ 706, 706, 733, 706, 734, 734, 706, 706, 706, 706,
+ 706, 706, 706, 706, 735, 736, 737, 737, 706, 706,
+ 738, 738, 706, 706, 739, 739, 706, 706, 740, 740,
+ 706, 706, 741, 741, 706, 706, 706, 718, 706, 706,
+ 706, 706, 719, 706, 706, 706, 719, 706, 720, 721,
+ 721, 721, 722, 723, 706, 706, 724, 724, 706, 706,
+ 706, 706, 706, 725, 706, 706, 726, 726, 727, 726,
+ 706, 706, 706, 706, 706, 706, 728, 729, 730, 731,
+ 706, 106, 706, 732, 706, 733, 706, 734, 706, 706,
+
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 735, 736, 736, 737, 706, 706, 706, 706, 706, 738,
+ 706, 706, 706, 706, 706, 739, 706, 706, 706, 706,
+ 706, 740, 706, 706, 706, 706, 706, 741, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 742, 719, 706, 721, 721, 706, 706, 724,
+ 706, 706, 706, 706, 743, 706, 706, 726, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 744, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 736, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 742, 742, 719, 706, 706, 721, 721,
+ 706, 724, 706, 706, 706, 743, 706, 706, 726, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 744, 744,
+ 706, 706, 706, 706, 706, 706, 706, 706, 736, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 742, 719, 706, 706, 721, 706, 706, 724, 706,
+
+ 706, 706, 706, 726, 706, 706, 706, 706, 706, 706,
+ 744, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 742, 719, 706,
+ 706, 706, 706, 706, 724, 706, 706, 706, 726, 706,
+ 706, 706, 706, 706, 744, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 742, 719, 706, 706, 706, 706, 706, 724, 706,
+ 706, 726, 706, 744, 706, 706, 706, 706, 706, 706,
+ 706, 742, 719, 706, 706, 706, 706, 724, 706, 706,
+
+ 726, 706, 744, 706, 706, 706, 706, 706, 706, 742,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 726, 706, 521, 726, 726, 727, 706, 744, 706, 706,
+ 706, 706, 742, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 726, 706, 726, 726, 727, 744, 706,
+ 706, 706, 706, 706, 742, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 726, 744, 706, 706, 706,
+ 706, 706, 742, 706, 706, 706, 706, 706, 706, 706,
+ 706, 726, 706, 706, 706, 706, 706, 706, 742, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 726,
+
+ 706, 706, 706, 706, 706, 706, 742, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 745, 706, 742, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 742,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 742, 706, 706, 706, 706, 706, 706, 706, 706, 742,
+ 706, 706, 706, 706, 706, 706, 706, 706, 742, 706,
+ 706, 706, 706, 706, 706, 706, 706, 742, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+
+ 706, 706, 706, 706, 706, 0, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706
+ } ;
+
+static yyconst flex_int16_t yy_nxt[2117] =
+ { 0,
+ 64, 64, 65, 64, 64, 64, 64, 64, 66, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 67, 64, 64, 64, 68, 68, 68, 68,
+ 68, 64, 64, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 64, 64, 69, 65,
+ 65, 65, 65, 65, 91, 70, 72, 72, 65, 128,
+ 128, 91, 129, 129, 169, 130, 130, 170, 188, 71,
+ 71, 64, 64, 65, 64, 64, 64, 72, 64, 64,
+ 64, 64, 64, 73, 64, 73, 73, 64, 73, 73,
+
+ 73, 64, 64, 64, 64, 64, 64, 73, 73, 73,
+ 73, 73, 64, 64, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 64, 64, 64,
+ 64, 65, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 74, 74, 74, 64,
+ 64, 64, 64, 64, 64, 74, 75, 76, 74, 74,
+ 64, 64, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 64, 64, 64, 64, 65,
+
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 148,
+ 64, 88, 88, 64, 65, 65, 65, 97, 64, 64,
+ 64, 64, 64, 98, 97, 65, 165, 175, 64, 64,
+ 98, 89, 89, 705, 95, 95, 108, 99, 178, 199,
+ 132, 166, 200, 133, 99, 108, 134, 327, 176, 179,
+ 249, 250, 328, 64, 64, 64, 64, 65, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 132, 64, 136,
+ 133, 64, 137, 134, 704, 138, 64, 64, 64, 64,
+ 64, 251, 136, 325, 319, 137, 64, 64, 138, 140,
+ 140, 144, 141, 141, 145, 142, 142, 146, 144, 178,
+
+ 180, 145, 147, 359, 146, 320, 573, 703, 288, 147,
+ 179, 64, 64, 64, 64, 65, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 78, 78, 78, 64, 64, 64, 64, 64, 64, 78,
+ 78, 78, 78, 78, 64, 64, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 64,
+ 64, 64, 64, 65, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 79, 64, 64, 64, 80, 80, 80,
+
+ 80, 80, 64, 64, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 64, 80, 64,
+ 64, 65, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 81, 81, 81, 64,
+ 64, 64, 64, 64, 64, 81, 81, 81, 81, 81,
+ 64, 64, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 82, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 64, 64, 65, 149, 83,
+ 149, 325, 83, 84, 83, 83, 83, 83, 178, 83,
+
+ 150, 83, 150, 204, 288, 204, 268, 85, 83, 179,
+ 392, 205, 178, 180, 178, 438, 83, 83, 151, 325,
+ 151, 289, 86, 179, 325, 179, 216, 154, 482, 155,
+ 87, 152, 217, 152, 153, 218, 492, 156, 153, 179,
+ 219, 83, 83, 64, 64, 65, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 90, 90, 90, 64, 64, 64, 64, 64, 64, 90,
+ 90, 90, 90, 90, 64, 64, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 64,
+
+ 64, 64, 64, 65, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 92, 64, 92, 92, 64, 92, 92,
+ 92, 92, 64, 64, 64, 64, 64, 92, 92, 92,
+ 92, 92, 64, 64, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 93, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 64, 94, 64,
+ 64, 65, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 100, 100, 100, 64,
+ 64, 64, 64, 64, 64, 100, 100, 100, 100, 100,
+ 64, 64, 100, 100, 100, 100, 100, 100, 100, 100,
+
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+ 100, 100, 100, 100, 100, 64, 64, 65, 182, 206,
+ 178, 325, 589, 339, 183, 207, 325, 184, 208, 185,
+ 209, 179, 186, 210, 584, 702, 585, 178, 204, 101,
+ 204, 102, 102, 102, 102, 102, 205, 510, 179, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 64, 64, 65, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 103, 103,
+ 103, 103, 64, 64, 64, 64, 64, 103, 103, 103,
+
+ 103, 103, 64, 64, 103, 103, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 103, 64, 103, 104,
+ 104, 65, 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 105, 104, 104, 104, 106, 106, 106, 106, 106,
+ 104, 104, 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 106, 106, 106, 106, 104, 104, 109, 109, 65,
+ 109, 160, 111, 109, 404, 160, 109, 109, 553, 701,
+
+ 109, 325, 109, 109, 325, 472, 178, 109, 109, 109,
+ 109, 109, 109, 109, 109, 65, 109, 179, 111, 109,
+ 178, 533, 109, 109, 325, 449, 109, 640, 109, 109,
+ 700, 179, 554, 109, 109, 109, 109, 109, 109, 112,
+ 112, 65, 112, 112, 112, 112, 112, 112, 112, 112,
+ 112, 112, 112, 112, 112, 112, 113, 113, 113, 112,
+ 112, 112, 112, 112, 112, 113, 113, 113, 113, 113,
+ 112, 112, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 112, 112, 65, 325, 115,
+
+ 678, 325, 115, 116, 117, 595, 115, 115, 222, 115,
+ 228, 115, 178, 180, 223, 501, 229, 224, 115, 230,
+ 596, 699, 225, 179, 231, 234, 115, 115, 669, 240,
+ 178, 235, 118, 325, 236, 241, 541, 544, 242, 237,
+ 119, 179, 542, 243, 522, 543, 522, 607, 522, 698,
+ 325, 115, 115, 65, 697, 115, 546, 522, 115, 116,
+ 117, 547, 115, 115, 178, 115, 522, 115, 555, 178,
+ 566, 696, 597, 178, 115, 179, 612, 595, 582, 695,
+ 179, 694, 115, 115, 179, 544, 178, 598, 118, 178,
+ 522, 613, 596, 178, 600, 617, 119, 179, 164, 693,
+
+ 179, 618, 164, 619, 179, 692, 691, 115, 115, 120,
+ 121, 65, 121, 120, 120, 120, 120, 122, 123, 124,
+ 120, 120, 120, 120, 120, 120, 125, 125, 125, 120,
+ 120, 126, 120, 120, 120, 125, 125, 125, 125, 125,
+ 120, 120, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 120, 120, 190, 190, 690,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 192, 192, 192, 190, 190, 689,
+ 190, 190, 190, 192, 192, 192, 192, 192, 190, 190,
+
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 190, 190, 517, 325, 517, 518, 597,
+ 325, 518, 519, 520, 612, 518, 521, 522, 523, 688,
+ 518, 522, 625, 522, 598, 522, 325, 518, 167, 613,
+ 687, 325, 167, 174, 522, 520, 187, 174, 686, 651,
+ 187, 524, 660, 522, 522, 685, 544, 211, 544, 525,
+ 178, 211, 684, 683, 682, 681, 680, 522, 679, 677,
+ 518, 526, 517, 676, 517, 518, 522, 522, 518, 519,
+ 520, 675, 518, 518, 522, 538, 674, 518, 673, 672,
+
+ 178, 522, 671, 548, 518, 548, 670, 668, 667, 666,
+ 522, 179, 520, 665, 522, 545, 664, 522, 539, 522,
+ 663, 522, 662, 522, 661, 659, 540, 658, 657, 656,
+ 522, 655, 654, 653, 613, 652, 650, 518, 518, 522,
+ 649, 648, 647, 646, 645, 644, 643, 522, 598, 596,
+ 642, 641, 639, 638, 636, 635, 634, 633, 632, 631,
+ 616, 630, 629, 522, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 96, 96, 96, 96,
+
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 110, 110,
+ 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+ 110, 110, 110, 110, 114, 114, 114, 114, 114, 114,
+ 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 131, 131, 131, 131,
+ 131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+ 131, 131, 135, 135, 135, 135, 135, 135, 135, 135,
+
+ 135, 135, 135, 135, 135, 135, 135, 135, 139, 139,
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 139, 139, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
+ 159, 628, 159, 522, 159, 627, 626, 624, 159, 163,
+ 623, 163, 622, 163, 163, 621, 620, 163, 177, 616,
+ 177, 615, 177, 177, 614, 611, 177, 177, 179, 610,
+ 179, 609, 179, 179, 608, 606, 179, 179, 189, 189,
+ 605, 604, 189, 189, 190, 603, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 602, 190, 190, 190,
+
+ 194, 601, 194, 194, 599, 594, 593, 194, 592, 591,
+ 590, 194, 194, 196, 196, 588, 587, 196, 198, 586,
+ 198, 198, 583, 581, 198, 580, 579, 578, 522, 577,
+ 198, 212, 212, 212, 212, 212, 212, 212, 212, 212,
+ 212, 212, 212, 212, 576, 212, 212, 214, 214, 214,
+ 214, 575, 574, 214, 214, 214, 214, 214, 214, 214,
+ 214, 214, 214, 220, 220, 220, 220, 572, 571, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220, 220, 226,
+ 226, 226, 226, 570, 569, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 232, 232, 232, 232, 568,
+
+ 567, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 238, 238, 238, 238, 565, 564, 238, 563, 238,
+ 238, 238, 238, 238, 238, 238, 238, 324, 562, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324,
+ 324, 324, 324, 336, 561, 336, 560, 336, 559, 336,
+ 336, 336, 336, 558, 557, 336, 349, 556, 552, 551,
+ 349, 349, 637, 550, 637, 549, 637, 545, 537, 536,
+ 535, 534, 532, 531, 530, 529, 528, 527, 516, 515,
+ 514, 513, 512, 511, 509, 508, 507, 506, 505, 504,
+ 503, 502, 500, 499, 498, 258, 497, 496, 495, 494,
+
+ 493, 320, 491, 490, 489, 488, 487, 486, 485, 484,
+ 483, 481, 480, 479, 478, 477, 476, 475, 474, 473,
+ 471, 470, 469, 468, 467, 466, 465, 464, 463, 462,
+ 461, 460, 459, 458, 457, 456, 455, 454, 453, 452,
+ 451, 450, 448, 447, 446, 445, 444, 443, 442, 441,
+ 440, 439, 437, 436, 435, 434, 433, 432, 431, 430,
+ 429, 428, 427, 426, 425, 424, 423, 422, 421, 420,
+ 419, 418, 417, 416, 415, 414, 413, 412, 411, 410,
+ 409, 408, 407, 406, 405, 403, 402, 401, 400, 399,
+ 398, 397, 396, 395, 394, 393, 325, 391, 390, 389,
+
+ 388, 387, 386, 385, 384, 383, 382, 381, 380, 379,
+ 378, 377, 376, 375, 374, 373, 372, 371, 370, 369,
+ 368, 367, 366, 365, 364, 363, 362, 361, 360, 358,
+ 357, 356, 355, 354, 353, 352, 351, 350, 348, 347,
+ 346, 345, 344, 343, 342, 341, 340, 338, 337, 335,
+ 334, 333, 332, 331, 330, 329, 326, 325, 323, 322,
+ 321, 318, 317, 316, 315, 314, 313, 312, 311, 310,
+ 309, 308, 307, 306, 305, 304, 303, 302, 301, 300,
+ 299, 298, 297, 296, 295, 294, 293, 292, 291, 290,
+ 288, 287, 286, 285, 284, 283, 282, 281, 280, 279,
+
+ 278, 197, 277, 276, 275, 274, 273, 272, 271, 270,
+ 269, 267, 266, 265, 264, 263, 262, 261, 260, 259,
+ 258, 257, 256, 255, 254, 253, 252, 248, 247, 246,
+ 245, 244, 239, 233, 227, 221, 215, 213, 203, 202,
+ 201, 197, 195, 193, 191, 181, 173, 172, 171, 168,
+ 162, 161, 158, 157, 706, 65, 65, 63, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706
+ } ;
+
+static yyconst flex_int16_t yy_chk[2117] =
+ { 0,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 4, 5,
+ 6, 27, 13, 14, 27, 4, 13, 14, 28, 53,
+ 54, 28, 53, 54, 84, 53, 54, 84, 729, 5,
+ 6, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 11, 11, 11,
+
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 718,
+ 11, 23, 24, 11, 31, 32, 43, 33, 11, 11,
+ 11, 11, 11, 33, 34, 44, 79, 91, 11, 11,
+ 34, 23, 24, 703, 31, 32, 43, 33, 92, 116,
+ 55, 79, 116, 55, 34, 44, 55, 255, 91, 92,
+ 154, 154, 255, 11, 11, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 56, 12, 57,
+ 56, 12, 57, 56, 702, 57, 12, 12, 12, 12,
+ 12, 154, 58, 555, 249, 58, 12, 12, 58, 59,
+ 60, 61, 59, 60, 61, 59, 60, 61, 62, 93,
+
+ 93, 62, 61, 289, 62, 249, 555, 701, 289, 62,
+ 93, 12, 12, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 21, 67, 21,
+ 69, 325, 21, 21, 21, 21, 21, 21, 177, 21,
+
+ 67, 21, 69, 121, 213, 121, 180, 21, 21, 177,
+ 325, 121, 178, 178, 180, 392, 21, 21, 67, 392,
+ 69, 213, 21, 178, 472, 180, 130, 69, 449, 69,
+ 21, 67, 130, 69, 719, 130, 472, 69, 719, 449,
+ 130, 21, 21, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+
+ 25, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 37, 98, 122,
+ 268, 573, 573, 268, 98, 122, 492, 98, 122, 98,
+ 122, 268, 98, 122, 569, 699, 569, 544, 204, 37,
+ 204, 37, 37, 37, 37, 37, 204, 492, 544, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 45, 45, 45,
+ 45, 721, 45, 45, 339, 721, 45, 45, 532, 698,
+
+ 45, 510, 45, 45, 625, 438, 339, 45, 45, 45,
+ 45, 45, 45, 46, 46, 46, 46, 339, 46, 46,
+ 404, 510, 46, 46, 438, 404, 46, 625, 46, 46,
+ 696, 404, 532, 46, 46, 46, 46, 46, 46, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 49, 669, 49,
+
+ 669, 660, 49, 49, 49, 579, 49, 49, 134, 49,
+ 138, 49, 482, 482, 134, 482, 138, 134, 49, 138,
+ 579, 695, 134, 482, 138, 142, 49, 49, 660, 146,
+ 547, 142, 49, 589, 142, 146, 519, 547, 146, 142,
+ 49, 547, 519, 146, 518, 519, 518, 589, 518, 694,
+ 533, 49, 49, 50, 693, 50, 524, 518, 50, 50,
+ 50, 525, 50, 50, 524, 50, 518, 50, 533, 525,
+ 546, 691, 580, 546, 50, 524, 594, 596, 566, 690,
+ 525, 689, 50, 50, 546, 600, 566, 580, 50, 582,
+ 518, 594, 596, 600, 582, 601, 50, 566, 723, 687,
+
+ 582, 601, 723, 601, 600, 686, 685, 50, 50, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 106, 106, 684,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 683,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 106, 106, 106, 106, 501, 607, 501, 501, 598,
+ 640, 501, 501, 501, 613, 501, 501, 501, 501, 682,
+ 501, 520, 607, 520, 598, 520, 651, 501, 724, 613,
+ 681, 678, 724, 725, 520, 501, 728, 725, 677, 640,
+ 728, 501, 651, 520, 521, 676, 521, 735, 521, 501,
+ 501, 735, 675, 674, 673, 672, 671, 521, 670, 668,
+ 501, 501, 517, 667, 517, 517, 521, 520, 517, 517,
+ 517, 666, 517, 517, 517, 517, 665, 517, 664, 663,
+
+ 521, 526, 662, 526, 517, 526, 661, 659, 658, 657,
+ 521, 521, 517, 656, 526, 538, 655, 538, 517, 538,
+ 654, 538, 653, 526, 652, 650, 517, 649, 647, 646,
+ 538, 645, 644, 643, 642, 641, 639, 517, 517, 538,
+ 638, 636, 635, 634, 633, 632, 631, 526, 630, 629,
+ 628, 626, 624, 623, 622, 621, 620, 619, 618, 617,
+ 616, 615, 614, 538, 707, 707, 707, 707, 707, 707,
+ 707, 707, 707, 707, 707, 707, 707, 707, 707, 707,
+ 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,
+ 708, 708, 708, 708, 708, 708, 709, 709, 709, 709,
+
+ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
+ 709, 709, 710, 710, 710, 710, 710, 710, 710, 710,
+ 710, 710, 710, 710, 710, 710, 710, 710, 711, 711,
+ 711, 711, 711, 711, 711, 711, 711, 711, 711, 711,
+ 711, 711, 711, 711, 712, 712, 712, 712, 712, 712,
+ 712, 712, 712, 712, 712, 712, 712, 712, 712, 712,
+ 713, 713, 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 714, 714, 714, 714,
+ 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
+ 714, 714, 715, 715, 715, 715, 715, 715, 715, 715,
+
+ 715, 715, 715, 715, 715, 715, 715, 715, 716, 716,
+ 716, 716, 716, 716, 716, 716, 716, 716, 716, 716,
+ 716, 716, 716, 716, 717, 717, 717, 717, 717, 717,
+ 717, 717, 717, 717, 717, 717, 717, 717, 717, 717,
+ 720, 612, 720, 611, 720, 609, 608, 606, 720, 722,
+ 605, 722, 604, 722, 722, 603, 602, 722, 726, 599,
+ 726, 597, 726, 726, 595, 593, 726, 726, 727, 592,
+ 727, 591, 727, 727, 590, 588, 727, 727, 730, 730,
+ 587, 586, 730, 730, 731, 585, 731, 731, 731, 731,
+ 731, 731, 731, 731, 731, 731, 584, 731, 731, 731,
+
+ 732, 583, 732, 732, 581, 578, 577, 732, 576, 575,
+ 574, 732, 732, 733, 733, 572, 571, 733, 734, 570,
+ 734, 734, 568, 565, 734, 564, 563, 562, 561, 560,
+ 734, 736, 736, 736, 736, 736, 736, 736, 736, 736,
+ 736, 736, 736, 736, 558, 736, 736, 737, 737, 737,
+ 737, 557, 556, 737, 737, 737, 737, 737, 737, 737,
+ 737, 737, 737, 738, 738, 738, 738, 554, 553, 738,
+ 738, 738, 738, 738, 738, 738, 738, 738, 738, 739,
+ 739, 739, 739, 552, 551, 739, 739, 739, 739, 739,
+ 739, 739, 739, 739, 739, 740, 740, 740, 740, 550,
+
+ 549, 740, 740, 740, 740, 740, 740, 740, 740, 740,
+ 740, 741, 741, 741, 741, 545, 543, 741, 542, 741,
+ 741, 741, 741, 741, 741, 741, 741, 742, 541, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 743, 540, 743, 539, 743, 537, 743,
+ 743, 743, 743, 536, 535, 743, 744, 534, 531, 530,
+ 744, 744, 745, 529, 745, 528, 745, 523, 516, 515,
+ 514, 512, 509, 508, 506, 505, 503, 502, 499, 497,
+ 496, 495, 494, 493, 491, 490, 489, 488, 487, 485,
+ 484, 483, 481, 480, 479, 478, 477, 476, 475, 474,
+
+ 473, 471, 470, 469, 468, 467, 466, 461, 459, 455,
+ 453, 448, 447, 445, 444, 443, 442, 441, 440, 439,
+ 437, 436, 435, 434, 433, 432, 431, 428, 425, 422,
+ 420, 419, 417, 415, 414, 412, 411, 410, 409, 408,
+ 407, 406, 403, 402, 400, 399, 398, 397, 396, 395,
+ 394, 393, 391, 390, 389, 387, 386, 385, 384, 381,
+ 380, 379, 376, 375, 374, 371, 370, 369, 366, 365,
+ 364, 361, 360, 359, 358, 357, 354, 353, 350, 348,
+ 347, 346, 345, 344, 341, 338, 337, 336, 335, 332,
+ 331, 330, 329, 328, 327, 326, 324, 322, 321, 319,
+
+ 318, 317, 316, 315, 314, 313, 312, 311, 310, 309,
+ 308, 307, 306, 305, 304, 303, 302, 301, 300, 299,
+ 298, 297, 296, 295, 294, 293, 292, 291, 290, 287,
+ 286, 285, 284, 283, 281, 280, 279, 278, 277, 276,
+ 275, 274, 273, 272, 271, 270, 269, 267, 266, 263,
+ 262, 261, 260, 259, 257, 256, 254, 253, 252, 251,
+ 250, 248, 247, 246, 245, 243, 242, 241, 240, 239,
+ 237, 236, 235, 234, 233, 231, 230, 229, 228, 227,
+ 225, 224, 223, 222, 221, 219, 218, 217, 216, 215,
+ 212, 210, 209, 208, 207, 206, 203, 202, 200, 199,
+
+ 197, 196, 195, 193, 191, 186, 185, 184, 183, 182,
+ 181, 176, 175, 173, 172, 171, 170, 169, 168, 166,
+ 165, 162, 161, 158, 157, 156, 155, 152, 151, 150,
+ 149, 148, 145, 141, 137, 133, 129, 126, 119, 118,
+ 117, 113, 111, 108, 105, 95, 89, 87, 86, 82,
+ 76, 75, 71, 70, 63, 2, 1, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int tagYY_flex_debug;
+int tagYY_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *tagYYtext;
+#line 1 "doxytag.l"
+/******************************************************************************
+ *
+ * $Id: doxytag.l,v 1.27 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#line 19 "doxytag.l"
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qstrlist.h>
+#include <qfileinfo.h>
+#include <qfile.h>
+#include <qdict.h>
+#include <qtextstream.h>
+#include <qdir.h>
+
+#include "version.h"
+//#include "suffixtree.h"
+//#include "searchindex.h"
+#include "logos.h"
+
+static QCString convertToXML(const char *s)
+{
+ QCString result;
+ if (s==0) return result;
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '<': result+="&lt;"; break;
+ case '>': result+="&gt;"; break;
+ case '&': result+="&amp;"; break;
+ case '\'': result+="&apos;"; break;
+ case '"': result+="&quot;"; break;
+ default: result+=c; break;
+ }
+ }
+ return result;
+}
+
+struct MemberDef
+{
+ QCString name;
+ QCString anchor;
+ QCString args;
+};
+
+struct ClassDef
+{
+ QCString name;
+ QStrList bases;
+ QCString fileName;
+ bool isFile;
+ QList<MemberDef> memberList;
+};
+
+QList<ClassDef> classList;
+QDict<ClassDef> classDict(1009);
+QList<ClassDef> fileList;
+QDict<ClassDef> fileDict(1009);
+
+static bool genTag;
+static bool genIndex;
+
+static QStrList bases;
+static QCString inputString;
+static int inputPosition;
+static QCString yyFileName;
+static int yyLineNr;
+static QCString classFile;
+static QCString memberRef;
+static QCString memberName;
+static QCString memberArgs;
+static QCString className;
+static QCString baseName;
+static QCString docBaseLink;
+static QCString docAnchor;
+static QCString docRefName;
+static bool nameBug;
+//static SearchIndex searchIndex;
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+static void addClass(const char *clName)
+{
+ if (classDict[clName]==0)
+ {
+ //printf("addClass(%s)\n",clName);
+ ClassDef *cd=new ClassDef;
+ cd->name=clName;
+ cd->fileName=yyFileName;
+ cd->isFile=FALSE;
+ classList.append(cd);
+ classDict.insert(clName,cd);
+ }
+}
+
+static void addFile(const char *fName)
+{
+ if (classDict[fName]==0)
+ {
+ ClassDef *fd=new ClassDef;
+ fd->name=fName;
+ fd->fileName=yyFileName;
+ fd->isFile=TRUE;
+ classList.append(fd);
+ classDict.insert(fName,fd);
+ }
+}
+
+static void addBases(const char *clName)
+{
+ ClassDef *cd=0;
+ if (clName && (cd=classDict[clName])) cd->bases=bases;
+}
+
+static void addMember(const char *memName,const char *memRef,const char *memArgs)
+{
+ //printf("addMember(%s,%s,%s)\n",memName,memRef,memArgs);
+ ClassDef *cd=classList.last();
+ if (cd)
+ {
+ MemberDef *md;
+ md=new MemberDef;
+ md->name=memName;
+ md->anchor=memRef;
+ md->args=memArgs;
+ cd->memberList.append(md);
+ }
+ else
+ {
+ //printf("Warning: found member %s %s but not class was found to insert it!\n",
+ // memName,memArgs);
+ }
+}
+
+static void addReference()
+{
+ //printf("addReference() key: %s ref:%s\n",
+ // docRefName.data(),(docBaseLink+"#"+docAnchor).data());
+ //if (genIndex && !docRefName.isEmpty() && !docBaseLink.isEmpty())
+ //{
+ // if (docAnchor.isEmpty())
+ // searchIndex.addReference(docRefName,docBaseLink);
+ // else
+ // searchIndex.addReference(docRefName,docBaseLink+"#"+docAnchor);
+ // searchIndex.addWord(docRefName,docRefName,TRUE);
+ //}
+}
+
+QCString unhtmlify(const char *str)
+{
+ QCString result;
+ const char *p=str;
+ char c;
+ while ((c=*p)!='\0')
+ {
+ if (c!='&') { result+=c; p++; }
+ else
+ {
+ if (strncmp(p,"&amp;",5)==0) { result+='&'; p+=5; }
+ else if (strncmp(p,"&lt;",4)==0) { result+='<'; p+=4; }
+ else if (strncmp(p,"&gt;",4)==0) { result+='>'; p+=4; }
+ else if (strncmp(p,"&quot;",6)==0) { result+='"'; p+=4; }
+ else /* should not happen */ { result+='&'; p++; }
+ }
+ }
+ return result;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 1410 "<stdout>"
+
+#define INITIAL 0
+#define Start 1
+#define SearchClassFile 2
+#define ReadClassFile 3
+#define CheckClassName 4
+#define ReadClassName 5
+#define SearchMemberRef 6
+#define ReadMemberRef 7
+#define SearchMemberName 8
+#define ReadMemberName 9
+#define ReadOperator 10
+#define SearchBaseClasses 11
+#define ReadBaseClass 12
+#define SearchRefName 13
+#define ReadRefName 14
+#define SearchArgs 15
+#define ReadArgs 16
+#define SearchWords 17
+#define SkipHTMLTag 18
+#define CheckConstructor 19
+#define SkipPreformated 20
+#define Qt3ReadType 21
+#define Qt3ReadAnchor 22
+#define Qt3ReadName 23
+#define Qt3ReadOperator 24
+#define Qt3ReadArgs 25
+#define DoxReadAnchor 26
+#define DoxReadName 27
+#define DoxReadArgs 28
+#define DoxClassName 29
+#define DoxClassBase 30
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int tagYYlex_destroy (void );
+
+int tagYYget_debug (void );
+
+void tagYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE tagYYget_extra (void );
+
+void tagYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *tagYYget_in (void );
+
+void tagYYset_in (FILE * in_str );
+
+FILE *tagYYget_out (void );
+
+void tagYYset_out (FILE * out_str );
+
+yy_size_t tagYYget_leng (void );
+
+char *tagYYget_text (void );
+
+int tagYYget_lineno (void );
+
+void tagYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int tagYYwrap (void );
+#else
+extern int tagYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( tagYYtext, tagYYleng, 1, tagYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( tagYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( tagYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, tagYYin))==0 && ferror(tagYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(tagYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int tagYYlex (void);
+
+#define YY_DECL int tagYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after tagYYtext and tagYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( tagYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (tagYYtext[tagYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 241 "doxytag.l"
+
+
+#line 1628 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! tagYYin )
+ tagYYin = stdin;
+
+ if ( ! tagYYout )
+ tagYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ tagYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ tagYY_create_buffer(tagYYin,YY_BUF_SIZE );
+ }
+
+ tagYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of tagYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 707 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 2058 );
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+ if ( yy_act == 0 )
+ { /* have to back up */
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ yy_act = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 243 "doxytag.l"
+{
+ BEGIN( SearchClassFile );
+ }
+ YY_BREAK
+case 2:
+#line 247 "doxytag.l"
+case 3:
+#line 248 "doxytag.l"
+case 4:
+#line 249 "doxytag.l"
+case 5:
+YY_RULE_SETUP
+#line 249 "doxytag.l"
+{ // Qt variant
+ BEGIN( ReadClassName );
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 252 "doxytag.l"
+{ // Doxygen variant
+ BEGIN( ReadClassName );
+ }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 255 "doxytag.l"
+{
+ //printf("Inherits found\n");
+ BEGIN( SearchBaseClasses );
+ }
+ YY_BREAK
+case 8:
+*yy_cp = (yy_hold_char); /* undo effects of setting up tagYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 15;
+YY_DO_BEFORE_ACTION; /* set up tagYYtext again */
+YY_RULE_SETUP
+#line 259 "doxytag.l"
+{ // needed due to inconsistency in the Qt docs
+ BEGIN( CheckConstructor );
+ }
+ YY_BREAK
+/* --------------------------------------------------- */
+/* Qt member extraction rules */
+case 9:
+YY_RULE_SETUP
+#line 266 "doxytag.l"
+{
+ BEGIN( Qt3ReadType );
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 269 "doxytag.l"
+{ // Qt-3.3+ html file
+ BEGIN( Qt3ReadAnchor );
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 272 "doxytag.l"
+{ // Qt-4 html file
+ BEGIN( Qt3ReadAnchor );
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 275 "doxytag.l"
+{
+ BEGIN( Qt3ReadAnchor );
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 278 "doxytag.l"
+
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 279 "doxytag.l"
+{
+ memberRef = tagYYtext;
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 282 "doxytag.l"
+{
+ BEGIN( Qt3ReadName );
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 285 "doxytag.l"
+{
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 288 "doxytag.l"
+{
+ memberName="operator";
+ BEGIN(Qt3ReadOperator);
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 292 "doxytag.l"
+{ memberName+=tagYYtext; }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 293 "doxytag.l"
+{ memberName+="<"; }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 294 "doxytag.l"
+{ memberName+=">"; }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 295 "doxytag.l"
+{ memberName+=" new"; }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 296 "doxytag.l"
+{ memberName+=" delete"; }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 297 "doxytag.l"
+{ memberName+="()"; BEGIN( Qt3ReadArgs ); }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 298 "doxytag.l"
+{ unput(*tagYYtext); BEGIN( Qt3ReadArgs ); }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 299 "doxytag.l"
+{
+ memberName=tagYYtext;
+ memberName=memberName.mid(memberName.find("::")+2);
+ BEGIN(Qt3ReadArgs);
+ }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 304 "doxytag.l"
+
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 305 "doxytag.l"
+{
+ memberArgs+='(';
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 308 "doxytag.l"
+{ memberArgs+='&'; }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 309 "doxytag.l"
+{ memberArgs+='<'; }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 310 "doxytag.l"
+{ memberArgs+='>'; }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 311 "doxytag.l"
+{ memberArgs+='"'; }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 312 "doxytag.l"
+{ memberArgs+=' '; }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 313 "doxytag.l"
+{
+ addMember(memberName,memberRef,memberArgs);
+ memberName.resize(0);
+ memberRef.resize(0);
+ memberArgs.resize(0);
+ BEGIN(Start);
+ }
+ YY_BREAK
+case 34:
+/* rule 34 can match eol */
+YY_RULE_SETUP
+#line 320 "doxytag.l"
+
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 321 "doxytag.l"
+{
+ memberArgs+=')';
+ addMember(memberName,memberRef,memberArgs);
+ memberName.resize(0);
+ memberRef.resize(0);
+ memberArgs.resize(0);
+ BEGIN(Start);
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 329 "doxytag.l"
+{ memberArgs+=tagYYtext; }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 330 "doxytag.l"
+{ memberArgs+=*tagYYtext; }
+ YY_BREAK
+/* --------------------------------------------------- */
+/* Doxygen class extraction rules */
+case 38:
+YY_RULE_SETUP
+#line 335 "doxytag.l"
+{
+ className.resize(0);
+ BEGIN(DoxClassName);
+ }
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 339 "doxytag.l"
+{
+ className=tagYYtext;
+ addClass(className);
+ }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 343 "doxytag.l"
+{
+ className+='<';
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 346 "doxytag.l"
+{
+ className+='>';
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 349 "doxytag.l"
+{
+ className+='&';
+ }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 352 "doxytag.l"
+{
+ className+='"';
+ }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 355 "doxytag.l"
+{
+ className+=*tagYYtext;
+ }
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 358 "doxytag.l"
+{
+ BEGIN(Start);
+ }
+ YY_BREAK
+/* --------------------------------------------------- */
+/* Doxygen inheritance extraction rules */
+case 46:
+YY_RULE_SETUP
+#line 365 "doxytag.l"
+{
+ bases.clear();
+ baseName.resize(0);
+ BEGIN(DoxClassBase);
+ }
+ YY_BREAK
+case 47:
+/* rule 47 can match eol */
+YY_RULE_SETUP
+#line 370 "doxytag.l"
+{
+ baseName+=tagYYtext;
+ }
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 373 "doxytag.l"
+{
+ bases.append(baseName);
+ baseName.resize(0);
+ }
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 377 "doxytag.l"
+{
+ baseName+='<';
+ }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 380 "doxytag.l"
+{
+ baseName+='>';
+ }
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 383 "doxytag.l"
+{
+ baseName+='&';
+ }
+ YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 386 "doxytag.l"
+{
+ baseName+='"';
+ }
+ YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 389 "doxytag.l"
+{
+ baseName+=*tagYYtext;
+ }
+ YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 392 "doxytag.l"
+{
+ bases.append(baseName);
+ baseName.resize(0);
+ addBases(className);
+ BEGIN(Start);
+ }
+ YY_BREAK
+/* --------------------------------------------------- */
+/* Doxygen member extraction rules */
+case 55:
+YY_RULE_SETUP
+#line 402 "doxytag.l"
+{
+ memberName.resize(0);
+ BEGIN(DoxReadName);
+ }
+ YY_BREAK
+case 56:
+/* rule 56 can match eol */
+YY_RULE_SETUP
+#line 406 "doxytag.l"
+{
+ memberName+=tagYYtext;
+ }
+ YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 409 "doxytag.l"
+{
+ memberName+='<';
+ }
+ YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 412 "doxytag.l"
+{
+ memberName+='>';
+ }
+ YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 415 "doxytag.l"
+{
+ memberName+='&';
+ }
+ YY_BREAK
+case 60:
+YY_RULE_SETUP
+#line 418 "doxytag.l"
+{
+ memberName+='"';
+ }
+ YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 421 "doxytag.l"
+{
+ memberName+=*tagYYtext;
+ }
+ YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 424 "doxytag.l"
+{
+ memberName=memberName.mid(memberName.find("::")+2);
+ memberRef.resize(0);
+ BEGIN(DoxReadAnchor);
+ }
+ YY_BREAK
+case 63:
+/* rule 63 can match eol */
+YY_RULE_SETUP
+#line 429 "doxytag.l"
+{
+ memberRef+=tagYYtext;
+ }
+ YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 432 "doxytag.l"
+{
+ memberRef+='<';
+ }
+ YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 435 "doxytag.l"
+{
+ memberRef+='>';
+ }
+ YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 438 "doxytag.l"
+{
+ memberRef+='&';
+ }
+ YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 441 "doxytag.l"
+{
+ memberRef+='"';
+ }
+ YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 444 "doxytag.l"
+{
+ memberRef+=*tagYYtext;
+ }
+ YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 447 "doxytag.l"
+{
+ memberArgs.resize(0);
+ BEGIN(DoxReadArgs);
+ }
+ YY_BREAK
+case 70:
+/* rule 70 can match eol */
+YY_RULE_SETUP
+#line 451 "doxytag.l"
+{
+ memberArgs+=tagYYtext;
+ }
+ YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 454 "doxytag.l"
+{
+ memberArgs+='<';
+ }
+ YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 457 "doxytag.l"
+{
+ memberArgs+='>';
+ }
+ YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 460 "doxytag.l"
+{
+ memberArgs+='&';
+ }
+ YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 463 "doxytag.l"
+{
+ memberArgs+='"';
+ }
+ YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 466 "doxytag.l"
+{
+ memberArgs+=*tagYYtext;
+ }
+ YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 469 "doxytag.l"
+{
+ addMember(memberName,memberRef,memberArgs);
+ memberName.resize(0);
+ memberRef.resize(0);
+ memberArgs.resize(0);
+ BEGIN(Start);
+ }
+ YY_BREAK
+/** --------------------------------------------------- */
+case 77:
+YY_RULE_SETUP
+#line 479 "doxytag.l"
+{
+ BEGIN( SkipPreformated );
+ }
+ YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 482 "doxytag.l"
+{
+ BEGIN( SearchWords );
+ }
+ YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 485 "doxytag.l"
+{
+ BEGIN( SkipHTMLTag );
+ }
+ YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 488 "doxytag.l"
+
+ YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 489 "doxytag.l"
+{
+ //printf("tag: %s#%s ref: %s word: `%s'\n",
+ // docBaseLink.data(),docAnchor.data(),
+ // docRefName.data(),tagYYtext);
+ //if (genIndex && !docRefName.isEmpty() && tagYYleng>2)
+ // searchIndex.addWord(docRefName,
+ // tagYYtext,FALSE
+ // );
+ }
+ YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 498 "doxytag.l"
+{
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 501 "doxytag.l"
+
+ YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 502 "doxytag.l"
+{
+ QCString s=tagYYtext;
+ if (s.find("::")!=-1)
+ {
+ docRefName=tagYYtext;
+ addReference();
+ nameBug=TRUE;
+ }
+ else
+ {
+ nameBug=FALSE;
+ }
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 516 "doxytag.l"
+{
+ docAnchor = tagYYtext;
+ if (docAnchor=="details" ||
+ docAnchor=="_details")
+ {
+ docRefName=className.copy();
+ addReference();
+ BEGIN( Start );
+ }
+ else
+ {
+ BEGIN( SearchRefName );
+ }
+ }
+ YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 530 "doxytag.l"
+{
+ BEGIN( ReadRefName );
+ }
+ YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 533 "doxytag.l"
+{ // HACK: avoid finding links in code fragments
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 536 "doxytag.l"
+{ // HACK: deal with Qt code
+ if (nameBug)
+ BEGIN( Start );
+ else
+ BEGIN( ReadRefName );
+ }
+ YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 543 "doxytag.l"
+{ // hmm, looks impressive :-)
+ docRefName=unhtmlify(tagYYtext);
+ addReference();
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 548 "doxytag.l"
+{
+ //printf("ReadRef=%s\n",tagYYtext);
+ docRefName=tagYYtext;
+ addReference();
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 554 "doxytag.l"
+{
+ //printf("Search %s\n",tagYYtext);
+ BEGIN( ReadBaseClass );
+ }
+ YY_BREAK
+case 92:
+/* rule 92 can match eol */
+YY_RULE_SETUP
+#line 558 "doxytag.l"
+{
+ addBases(className);
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 562 "doxytag.l"
+{
+ bases.append(tagYYtext);
+ BEGIN( SearchBaseClasses );
+ }
+ YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 566 "doxytag.l"
+{
+ BEGIN( ReadClassFile );
+ }
+ YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 569 "doxytag.l"
+{
+ BEGIN( ReadClassFile );
+ }
+ YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 572 "doxytag.l"
+{
+ className=tagYYtext;
+ BEGIN( CheckClassName);
+ }
+ YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 576 "doxytag.l"
+{
+ //printf("className=%s\n",className.data());
+ addClass(className);
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 581 "doxytag.l"
+{
+ //printf("className=%s\n",className.data());
+ addFile(className);
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 99:
+YY_RULE_SETUP
+#line 586 "doxytag.l"
+{ // not a class file
+ className.resize(0);
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 590 "doxytag.l"
+{
+ classFile=tagYYtext;
+ BEGIN( SearchMemberRef );
+ }
+ YY_BREAK
+case 101:
+YY_RULE_SETUP
+#line 594 "doxytag.l"
+{
+ if (YY_START==ReadClassFile)
+ {
+ classFile=yyFileName;
+ }
+ //BEGIN( ReadMemberRef );
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 102:
+YY_RULE_SETUP
+#line 602 "doxytag.l"
+{
+ memberRef=tagYYtext;
+ BEGIN( SearchMemberName );
+ }
+ YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 606 "doxytag.l"
+{ // <strong> is for qt-1.44, <b> is for qt-2.00
+ BEGIN( ReadMemberName );
+ }
+ YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 609 "doxytag.l"
+{
+ unput(*tagYYtext);
+ BEGIN( ReadMemberName );
+ }
+ YY_BREAK
+case 105:
+YY_RULE_SETUP
+#line 613 "doxytag.l"
+{
+ memberName="operator";
+ BEGIN( ReadOperator );
+ }
+ YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 617 "doxytag.l"
+{ memberName+=*tagYYtext; }
+ YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 618 "doxytag.l"
+{ memberName+="<"; }
+ YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 619 "doxytag.l"
+{ memberName+=">"; }
+ YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 620 "doxytag.l"
+{ memberName+=" new"; }
+ YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 621 "doxytag.l"
+{ memberName+=" delete"; }
+ YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 622 "doxytag.l"
+{ BEGIN( SearchArgs ); }
+ YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 623 "doxytag.l"
+{
+ memberName=tagYYtext;
+ BEGIN( SearchArgs );
+ }
+ YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 627 "doxytag.l"
+{
+ //printf("SearchArg className=%s memberName=%s\n",className.data(),memberName.data());
+ if (!className.isEmpty() && !memberName.isEmpty())
+ BEGIN( ReadArgs );
+ else
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 634 "doxytag.l"
+{ memberArgs+='&'; }
+ YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 635 "doxytag.l"
+{ memberArgs+='<'; }
+ YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 636 "doxytag.l"
+{ memberArgs+='>'; }
+ YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 637 "doxytag.l"
+{ memberArgs+='"'; }
+ YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 638 "doxytag.l"
+{ memberArgs+=' '; }
+ YY_BREAK
+/*
+<ReadArgs>[{}] { // handle enums
+ memberArgs.resize(0);
+ addMember(memberName,memberRef,memberArgs);
+ if (*tagYYtext=='}')
+ BEGIN( Start );
+ else
+ BEGIN( SearchClassFile );
+ }
+ */
+case 119:
+/* rule 119 can match eol */
+YY_RULE_SETUP
+#line 649 "doxytag.l"
+{
+ //printf("adding member %s\n",memberName.data());
+ memberArgs=memberArgs.stripWhiteSpace();
+ //if (newClass)
+ //{
+ // newClass=FALSE;
+ // addClass(className);
+ //}
+ addMember(memberName,memberRef,memberArgs);
+ memberName.resize(0);
+ memberRef.resize(0);
+ memberArgs.resize(0);
+ if (*tagYYtext=='<')
+ BEGIN( SkipHTMLTag);
+ else
+ BEGIN( Start );
+ }
+ YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 666 "doxytag.l"
+{ memberArgs+=(*tagYYtext)&0x7f; }
+ YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 667 "doxytag.l"
+{ BEGIN( Start ); }
+ YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 668 "doxytag.l"
+
+ YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 669 "doxytag.l"
+
+ YY_BREAK
+case 124:
+/* rule 124 can match eol */
+YY_RULE_SETUP
+#line 670 "doxytag.l"
+{ yyLineNr++;
+ if (YY_START!=SkipHTMLTag) BEGIN( Start );
+ }
+ YY_BREAK
+case 125:
+YY_RULE_SETUP
+#line 674 "doxytag.l"
+ECHO;
+ YY_BREAK
+#line 2635 "<stdout>"
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(Start):
+case YY_STATE_EOF(SearchClassFile):
+case YY_STATE_EOF(ReadClassFile):
+case YY_STATE_EOF(CheckClassName):
+case YY_STATE_EOF(ReadClassName):
+case YY_STATE_EOF(SearchMemberRef):
+case YY_STATE_EOF(ReadMemberRef):
+case YY_STATE_EOF(SearchMemberName):
+case YY_STATE_EOF(ReadMemberName):
+case YY_STATE_EOF(ReadOperator):
+case YY_STATE_EOF(SearchBaseClasses):
+case YY_STATE_EOF(ReadBaseClass):
+case YY_STATE_EOF(SearchRefName):
+case YY_STATE_EOF(ReadRefName):
+case YY_STATE_EOF(SearchArgs):
+case YY_STATE_EOF(ReadArgs):
+case YY_STATE_EOF(SearchWords):
+case YY_STATE_EOF(SkipHTMLTag):
+case YY_STATE_EOF(CheckConstructor):
+case YY_STATE_EOF(SkipPreformated):
+case YY_STATE_EOF(Qt3ReadType):
+case YY_STATE_EOF(Qt3ReadAnchor):
+case YY_STATE_EOF(Qt3ReadName):
+case YY_STATE_EOF(Qt3ReadOperator):
+case YY_STATE_EOF(Qt3ReadArgs):
+case YY_STATE_EOF(DoxReadAnchor):
+case YY_STATE_EOF(DoxReadName):
+case YY_STATE_EOF(DoxReadArgs):
+case YY_STATE_EOF(DoxClassName):
+case YY_STATE_EOF(DoxClassBase):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed tagYYin at a new source and called
+ * tagYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = tagYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( tagYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * tagYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of tagYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ yy_size_t new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ tagYYrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ tagYYrestart(tagYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) tagYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 707 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+ register char *yy_cp = (yy_c_buf_p);
+
+ register YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 707 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 706);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up tagYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ tagYYrestart(tagYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( tagYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve tagYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void tagYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ tagYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ tagYY_create_buffer(tagYYin,YY_BUF_SIZE );
+ }
+
+ tagYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ tagYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void tagYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * tagYYpop_buffer_state();
+ * tagYYpush_buffer_state(new_buffer);
+ */
+ tagYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ tagYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (tagYYwrap()) processing, but the only time this flag
+ * is looked at is after tagYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void tagYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ tagYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE tagYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) tagYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in tagYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) tagYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in tagYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ tagYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with tagYY_create_buffer()
+ *
+ */
+ void tagYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ tagYYfree((void *) b->yy_ch_buf );
+
+ tagYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a tagYYrestart() or at EOF.
+ */
+ static void tagYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ tagYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then tagYY_init_buffer was _probably_
+ * called from tagYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void tagYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ tagYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void tagYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ tagYYensure_buffer_stack();
+
+ /* This block is copied from tagYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from tagYY_switch_to_buffer. */
+ tagYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void tagYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ tagYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ tagYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void tagYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)tagYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in tagYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)tagYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in tagYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE tagYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) tagYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in tagYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ tagYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to tagYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * tagYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE tagYY_scan_string (yyconst char * yystr )
+{
+
+ return tagYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to tagYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE tagYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) tagYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in tagYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = tagYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in tagYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up tagYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ tagYYtext[tagYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = tagYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ tagYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int tagYYget_lineno (void)
+{
+
+ return tagYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *tagYYget_in (void)
+{
+ return tagYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *tagYYget_out (void)
+{
+ return tagYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t tagYYget_leng (void)
+{
+ return tagYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *tagYYget_text (void)
+{
+ return tagYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void tagYYset_lineno (int line_number )
+{
+
+ tagYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see tagYY_switch_to_buffer
+ */
+void tagYYset_in (FILE * in_str )
+{
+ tagYYin = in_str ;
+}
+
+void tagYYset_out (FILE * out_str )
+{
+ tagYYout = out_str ;
+}
+
+int tagYYget_debug (void)
+{
+ return tagYY_flex_debug;
+}
+
+void tagYYset_debug (int bdebug )
+{
+ tagYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from tagYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ tagYYin = stdin;
+ tagYYout = stdout;
+#else
+ tagYYin = (FILE *) 0;
+ tagYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * tagYYlex_init()
+ */
+ return 0;
+}
+
+/* tagYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int tagYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ tagYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ tagYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ tagYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * tagYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *tagYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *tagYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void tagYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see tagYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 674 "doxytag.l"
+
+
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+
+void parse(QCString &s)
+{
+ bases.clear();
+ nameBug = FALSE;
+ //newClass = TRUE;
+ inputString = s;
+ inputPosition = 0;
+ yyLineNr = 0;
+ tagYYrestart( tagYYin );
+ BEGIN( Start );
+ tagYYlex();
+ //printf("Number of lines scanned: %d\n",yyLineNr);
+}
+
+void parseFile(QFileInfo &fi)
+{
+ printf("Parsing file %s...\n",fi.fileName().data());
+ QFile f;
+ f.setName(fi.absFilePath());
+ if (f.open(IO_ReadOnly))
+ {
+ yyFileName = fi.fileName();
+ className.resize(0);
+ memberName.resize(0);
+ //printf("Parsing file %s...\n",fi.fileName().data());
+ QCString input(fi.size()+1);
+ docBaseLink=fi.fileName();
+ docRefName=fi.fileName().copy();
+ //searchIndex.addReference(docRefName,docBaseLink);
+ //searchIndex.addWord(docRefName,docRefName,TRUE);
+ f.readBlock(input.data(),fi.size());
+ input.at(fi.size())='\0';
+ parse(input);
+ }
+ else
+ {
+ fprintf(stderr,"Warning: Cannot open file %s\n",fi.fileName().data());
+ }
+}
+
+void parseFileOrDir(const char *fileName)
+{
+ QFileInfo fi(fileName);
+ if (fi.exists())
+ {
+ if (fi.isFile())
+ {
+ parseFile(fi);
+ }
+ else if (fi.isDir())
+ {
+ QDir dir(fileName);
+ dir.setFilter( QDir::Files );
+ dir.setNameFilter( "*.html" );
+ const QFileInfoList *list = dir.entryInfoList();
+ QFileInfoListIterator it( *list );
+ QFileInfo *cfi;
+ for ( it.toFirst() ; (cfi=it.current()) ; ++it)
+ {
+ if (cfi->isFile())
+ {
+ parseFile(*cfi);
+ }
+ }
+ }
+ }
+ else
+ {
+ fprintf(stderr,"Warning: File %s does not exist\n",fileName);
+ }
+}
+
+void usage(const char *name)
+{
+ fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-2011\n\n",
+ versionString);
+ fprintf(stderr," Generates a tag file and/or a search index for a set of HTML files\n\n");
+ fprintf(stderr,"Usage: %s [-t tag_file] [ html_file [html_file...] ]\n",name);
+ fprintf(stderr,"Options:\n");
+ fprintf(stderr," -t <tag_file> Generate tag file <tag_file>.\n");
+ fprintf(stderr,"If no HTML files are given all files in the current dir that\n"
+ "have a .html extension are parsed.\n\n");
+ exit(1);
+}
+
+const char *getArg(int argc,char **argv,int &optind,const char c)
+{
+ char *s=0;
+ if (strlen(&argv[optind][2])>0)
+ s=&argv[optind][2];
+ else if (optind+1<argc)
+ s=argv[++optind];
+ else
+ {
+ fprintf(stderr,"option -%c requires an argument\n",c);
+ exit(1);
+ }
+ return s;
+}
+
+int main(int argc,char **argv)
+{
+ QCString tagName;
+ QCString indexName;
+
+ int optind=1;
+ const char *arg;
+ while (optind<argc && argv[optind][0]=='-')
+ {
+ switch(argv[optind][1])
+ {
+ case 't':
+ arg=getArg(argc,argv,optind,'t');
+ tagName=arg;
+ break;
+ case 's':
+ arg=getArg(argc,argv,optind,'s');
+ indexName=arg;
+ break;
+ case 'h':
+ case '?':
+ usage(argv[0]);
+ break;
+ default:
+ fprintf(stderr,"Unknown option -%c\n",argv[optind][1]);
+ usage(argv[0]);
+ }
+ optind++;
+ }
+
+ genTag = !tagName.isEmpty();
+ genIndex = !indexName.isEmpty();
+
+ if (!genTag && !genIndex)
+ {
+ fprintf(stderr,"Nothing to do !\n\n");
+ usage(argv[0]);
+ }
+
+ int i;
+ if (optind>=argc)
+ {
+ parseFileOrDir(".");
+ }
+ else
+ {
+ for (i=optind;i<argc;i++)
+ {
+ parseFileOrDir(argv[i]);
+ }
+ }
+ if (genIndex)
+ {
+ fprintf(stderr,"Error: doxytag cannot be used to generate a search index anymore.\n"
+ "This functionality has been integrated into doxygen.\n");
+// printf("Writing search index\n");
+// if (!searchIndex.saveIndex(indexName))
+// {
+// fprintf(stderr,"Error: Could not write search index\n");
+// }
+// QFileInfo fi(indexName);
+// if (fi.exists())
+// {
+// QCString dir=convertToQCString(fi.dir().absPath());
+// fi.setFile(dir+"/search.png");
+// if (!fi.exists()) writeSearchButton(dir);
+// fi.setFile(dir+"/doxygen.png");
+// if (!fi.exists()) writeLogo(dir);
+// fi.setFile(dir+"/search.cgi");
+// if (!fi.exists())
+// {
+// QFile f;
+// f.setName(dir+"/search.cgi");
+// if (f.open(IO_WriteOnly))
+// {
+// QTextStream t(&f);
+// t << "#!/bin/sh" << endl
+// << "DOXYSEARCH=" << endl
+// << "DOXYPATH=" << endl
+// << "if [ -f $DOXYSEARCH ]" << endl
+// << "then" << endl
+// << " $DOXYSEARCH $DOXYPATH" << endl
+// << "else" << endl
+// << " echo \"Content-Type: text/html\"" << endl
+// << " echo \"\"" << endl
+// << " echo \"<H1>Error: $DOXYSEARCH not found. Check cgi script!\"" << endl
+// << "fi" << endl;
+// f.close();
+// }
+// else
+// {
+// fprintf(stderr,"Error: could not open file %s for writing\n",(dir+"/search.cgi").data());
+// }
+// }
+// }
+ }
+ if (genTag)
+ {
+ QFile f;
+ f.setName(tagName);
+ if (f.open(IO_WriteOnly))
+ {
+ QTextStream t(&f);
+ t << "<tagfile>" << endl;
+ ClassDef *cd=classList.first();
+ while (cd)
+ {
+ t << " <compound kind=\"";
+ if (cd->isFile) t << "file"; else t << "class";
+ t << "\">" << endl;
+ t << " <name>" << convertToXML(cd->name) << "</name>" << endl;
+ char *base=cd->bases.first();
+ while (base)
+ {
+ t << " <base>" << convertToXML(base) << "</base>" << endl;
+ base=cd->bases.next();
+ }
+ t << " <filename>" << convertToXML(cd->fileName) << "</filename>" << endl;
+ MemberDef *md=cd->memberList.first();
+ while (md)
+ {
+ if (md->anchor.right(5)=="-enum")
+ {
+ t << " <member kind=\"enum\">" << endl;
+ }
+ else
+ {
+ t << " <member kind=\"function\">" << endl;
+ }
+ t << " <name>" << convertToXML(md->name) << "</name>" << endl;
+ t << " <anchor>" << convertToXML(md->anchor) << "</anchor>" << endl;
+ t << " <arglist>" << convertToXML(md->args) << "</arglist>" << endl;
+ t << " </member>" << endl;
+ md=cd->memberList.next();
+ }
+ t << " </compound>" << endl;
+ cd=classList.next();
+ }
+ t << "</tagfile>" << endl;
+ }
+ else
+ {
+ fprintf(stderr,"Error: Could not write tag file %s\n",tagName.data());
+ }
+ }
+ return 0;
+}
+
+extern "C" {
+int tagYYwrap() { return 1 ; }
+};
+
diff --git a/src/doxytag.l b/src/doxytag.l
new file mode 100644
index 0000000..4feb43a
--- /dev/null
+++ b/src/doxytag.l
@@ -0,0 +1,930 @@
+/******************************************************************************
+ *
+ * $Id: doxytag.l,v 1.27 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qstrlist.h>
+#include <qfileinfo.h>
+#include <qfile.h>
+#include <qdict.h>
+#include <qtextstream.h>
+#include <qdir.h>
+
+#include "version.h"
+//#include "suffixtree.h"
+//#include "searchindex.h"
+#include "logos.h"
+
+static QCString convertToXML(const char *s)
+{
+ QCString result;
+ if (s==0) return result;
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '<': result+="&lt;"; break;
+ case '>': result+="&gt;"; break;
+ case '&': result+="&amp;"; break;
+ case '\'': result+="&apos;"; break;
+ case '"': result+="&quot;"; break;
+ default: result+=c; break;
+ }
+ }
+ return result;
+}
+
+struct MemberDef
+{
+ QCString name;
+ QCString anchor;
+ QCString args;
+};
+
+struct ClassDef
+{
+ QCString name;
+ QStrList bases;
+ QCString fileName;
+ bool isFile;
+ QList<MemberDef> memberList;
+};
+
+QList<ClassDef> classList;
+QDict<ClassDef> classDict(1009);
+QList<ClassDef> fileList;
+QDict<ClassDef> fileDict(1009);
+
+static bool genTag;
+static bool genIndex;
+
+static QStrList bases;
+static QCString inputString;
+static int inputPosition;
+static QCString yyFileName;
+static int yyLineNr;
+static QCString classFile;
+static QCString memberRef;
+static QCString memberName;
+static QCString memberArgs;
+static QCString className;
+static QCString baseName;
+static QCString docBaseLink;
+static QCString docAnchor;
+static QCString docRefName;
+static bool nameBug;
+//static SearchIndex searchIndex;
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+static void addClass(const char *clName)
+{
+ if (classDict[clName]==0)
+ {
+ //printf("addClass(%s)\n",clName);
+ ClassDef *cd=new ClassDef;
+ cd->name=clName;
+ cd->fileName=yyFileName;
+ cd->isFile=FALSE;
+ classList.append(cd);
+ classDict.insert(clName,cd);
+ }
+}
+
+static void addFile(const char *fName)
+{
+ if (classDict[fName]==0)
+ {
+ ClassDef *fd=new ClassDef;
+ fd->name=fName;
+ fd->fileName=yyFileName;
+ fd->isFile=TRUE;
+ classList.append(fd);
+ classDict.insert(fName,fd);
+ }
+}
+
+static void addBases(const char *clName)
+{
+ ClassDef *cd=0;
+ if (clName && (cd=classDict[clName])) cd->bases=bases;
+}
+
+static void addMember(const char *memName,const char *memRef,const char *memArgs)
+{
+ //printf("addMember(%s,%s,%s)\n",memName,memRef,memArgs);
+ ClassDef *cd=classList.last();
+ if (cd)
+ {
+ MemberDef *md;
+ md=new MemberDef;
+ md->name=memName;
+ md->anchor=memRef;
+ md->args=memArgs;
+ cd->memberList.append(md);
+ }
+ else
+ {
+ //printf("Warning: found member %s %s but not class was found to insert it!\n",
+ // memName,memArgs);
+ }
+}
+
+static void addReference()
+{
+ //printf("addReference() key: %s ref:%s\n",
+ // docRefName.data(),(docBaseLink+"#"+docAnchor).data());
+ //if (genIndex && !docRefName.isEmpty() && !docBaseLink.isEmpty())
+ //{
+ // if (docAnchor.isEmpty())
+ // searchIndex.addReference(docRefName,docBaseLink);
+ // else
+ // searchIndex.addReference(docRefName,docBaseLink+"#"+docAnchor);
+ // searchIndex.addWord(docRefName,docRefName,TRUE);
+ //}
+}
+
+QCString unhtmlify(const char *str)
+{
+ QCString result;
+ const char *p=str;
+ char c;
+ while ((c=*p)!='\0')
+ {
+ if (c!='&') { result+=c; p++; }
+ else
+ {
+ if (strncmp(p,"&amp;",5)==0) { result+='&'; p+=5; }
+ else if (strncmp(p,"&lt;",4)==0) { result+='<'; p+=4; }
+ else if (strncmp(p,"&gt;",4)==0) { result+='>'; p+=4; }
+ else if (strncmp(p,"&quot;",6)==0) { result+='"'; p+=4; }
+ else /* should not happen */ { result+='&'; p++; }
+ }
+ }
+ return result;
+}
+
+%}
+
+%x Start
+%x SearchClassFile
+%x ReadClassFile
+%x CheckClassName
+%x ReadClassName
+%x SearchMemberRef
+%x ReadMemberRef
+%x SearchMemberName
+%x ReadMemberName
+%x ReadOperator
+%x SearchBaseClasses
+%x ReadBaseClass
+%x SearchRefName
+%x ReadRefName
+%x SearchArgs
+%x ReadArgs
+%x SearchWords
+%x SkipHTMLTag
+%x CheckConstructor
+%x SkipPreformated
+
+%x Qt3ReadType
+%x Qt3ReadAnchor
+%x Qt3ReadName
+%x Qt3ReadOperator
+%x Qt3ReadArgs
+
+%x DoxReadAnchor
+%x DoxReadName
+%x DoxReadArgs
+%x DoxClassName
+%x DoxClassBase
+
+%%
+
+<Start>^"<li>" {
+ BEGIN( SearchClassFile );
+ }
+<Start>^"<td"[^\n]*"<h1 align=center>" | // Qt-3.x.x
+<Start>"</table><h1 align=\"center\">" | // Qt-4
+<Start>"</table><h1 class=\"title\">" | // >Qt-4.4.0
+<Start>^"<h1 align=center>" { // Qt variant
+ BEGIN( ReadClassName );
+ }
+<Start>^("<hr>")?"<h1>" { // Doxygen variant
+ BEGIN( ReadClassName );
+ }
+<Start>^"Inherits " {
+ //printf("Inherits found\n");
+ BEGIN( SearchBaseClasses );
+ }
+<Start>^"<h3 class=\"fn\">"/[a-z_A-Z0-9] { // needed due to inconsistency in the Qt docs
+ BEGIN( CheckConstructor );
+ }
+
+ /* --------------------------------------------------- */
+ /* Qt member extraction rules */
+
+<Start>^"<h3 class=fn>" {
+ BEGIN( Qt3ReadType );
+ }
+<Start>^"<h3 class=fn><a name=\"" { // Qt-3.3+ html file
+ BEGIN( Qt3ReadAnchor );
+ }
+<Start>^"<h3 class=\"fn\"><a name=\"" { // Qt-4 html file
+ BEGIN( Qt3ReadAnchor );
+ }
+<Qt3ReadType>"<a name=\"" {
+ BEGIN( Qt3ReadAnchor );
+ }
+<Qt3ReadType>.
+<Qt3ReadAnchor>[~a-z_A-Z0-9\-\[\]*+%\^&|!]+ {
+ memberRef = yytext;
+ }
+<Qt3ReadAnchor>"\"></a>" {
+ BEGIN( Qt3ReadName );
+ }
+<Qt3ReadAnchor>. {
+ BEGIN( Start );
+ }
+<Qt3ReadName>[a-z_A-Z0-9]+"::operator" {
+ memberName="operator";
+ BEGIN(Qt3ReadOperator);
+ }
+<Qt3ReadOperator>[+\-*/%\^&|~!=\[\]]+ { memberName+=yytext; }
+<Qt3ReadOperator>"&lt;" { memberName+="<"; }
+<Qt3ReadOperator>"&gt;" { memberName+=">"; }
+<Qt3ReadOperator>"new" { memberName+=" new"; }
+<Qt3ReadOperator>"delete" { memberName+=" delete"; }
+<Qt3ReadOperator>"()" { memberName+="()"; BEGIN( Qt3ReadArgs ); }
+<Qt3ReadOperator>. { unput(*yytext); BEGIN( Qt3ReadArgs ); }
+<Qt3ReadName>[a-z_A-Z0-9]+"::"[~a-z_A-Z0-9]+ {
+ memberName=yytext;
+ memberName=memberName.mid(memberName.find("::")+2);
+ BEGIN(Qt3ReadArgs);
+ }
+<Qt3ReadName>.
+<Qt3ReadArgs>[ \t]*"(" {
+ memberArgs+='(';
+ }
+<Qt3ReadArgs>"&amp;" { memberArgs+='&'; }
+<Qt3ReadArgs>"&lt;" { memberArgs+='<'; }
+<Qt3ReadArgs>"&gt;" { memberArgs+='>'; }
+<Qt3ReadArgs>"&quot;" { memberArgs+='"'; }
+<Qt3ReadArgs>"&nbsp;" { memberArgs+=' '; }
+<Qt3ReadArgs>"</h3>" {
+ addMember(memberName,memberRef,memberArgs);
+ memberName.resize(0);
+ memberRef.resize(0);
+ memberArgs.resize(0);
+ BEGIN(Start);
+ }
+<Qt3ReadArgs>"<"[^>]+">"
+<Qt3ReadArgs>")" {
+ memberArgs+=')';
+ addMember(memberName,memberRef,memberArgs);
+ memberName.resize(0);
+ memberRef.resize(0);
+ memberArgs.resize(0);
+ BEGIN(Start);
+ }
+<Qt3ReadArgs>[a-z_A-Z0-9]+ { memberArgs+=yytext; }
+<Qt3ReadArgs>. { memberArgs+=*yytext; }
+
+ /* --------------------------------------------------- */
+ /* Doxygen class extraction rules */
+
+<Start>"<!-- doxytag: class=\"" {
+ className.resize(0);
+ BEGIN(DoxClassName);
+ }
+<DoxClassName>[^&"]+ {
+ className=yytext;
+ addClass(className);
+ }
+<DoxClassName>"&lt;" {
+ className+='<';
+ }
+<DoxClassName>"&gt;" {
+ className+='>';
+ }
+<DoxClassName>"&amp;" {
+ className+='&';
+ }
+<DoxClassName>"&quot;" {
+ className+='"';
+ }
+<DoxClassName>. {
+ className+=*yytext;
+ }
+<DoxClassName>"\" -->" {
+ BEGIN(Start);
+ }
+
+ /* --------------------------------------------------- */
+ /* Doxygen inheritance extraction rules */
+
+<Start>"<!-- doxytag: inherits=\"" {
+ bases.clear();
+ baseName.resize(0);
+ BEGIN(DoxClassBase);
+ }
+<DoxClassBase>[^&,"]+ {
+ baseName+=yytext;
+ }
+<DoxClassBase>"," {
+ bases.append(baseName);
+ baseName.resize(0);
+ }
+<DoxClassBase>"&lt;" {
+ baseName+='<';
+ }
+<DoxClassBase>"&gt;" {
+ baseName+='>';
+ }
+<DoxClassBase>"&amp;" {
+ baseName+='&';
+ }
+<DoxClassBase>"&quot;" {
+ baseName+='"';
+ }
+<DoxClassBase>. {
+ baseName+=*yytext;
+ }
+<DoxClassBase>"\" -->" {
+ bases.append(baseName);
+ baseName.resize(0);
+ addBases(className);
+ BEGIN(Start);
+ }
+
+ /* --------------------------------------------------- */
+ /* Doxygen member extraction rules */
+
+<Start>"<!-- doxytag: member=\"" {
+ memberName.resize(0);
+ BEGIN(DoxReadName);
+ }
+<DoxReadName>[^&"]+ {
+ memberName+=yytext;
+ }
+<DoxReadName>"&lt;" {
+ memberName+='<';
+ }
+<DoxReadName>"&gt;" {
+ memberName+='>';
+ }
+<DoxReadName>"&amp;" {
+ memberName+='&';
+ }
+<DoxReadName>"&quot;" {
+ memberName+='"';
+ }
+<DoxReadName>. {
+ memberName+=*yytext;
+ }
+<DoxReadName>"\" ref=\"" {
+ memberName=memberName.mid(memberName.find("::")+2);
+ memberRef.resize(0);
+ BEGIN(DoxReadAnchor);
+ }
+<DoxReadAnchor>[^&"]+ {
+ memberRef+=yytext;
+ }
+<DoxReadAnchor>"&lt;" {
+ memberRef+='<';
+ }
+<DoxReadAnchor>"&gt;" {
+ memberRef+='>';
+ }
+<DoxReadAnchor>"&amp;" {
+ memberRef+='&';
+ }
+<DoxReadAnchor>"&quot;" {
+ memberRef+='"';
+ }
+<DoxReadAnchor>. {
+ memberRef+=*yytext;
+ }
+<DoxReadAnchor>"\" args=\"" {
+ memberArgs.resize(0);
+ BEGIN(DoxReadArgs);
+ }
+<DoxReadArgs>[^&"]+ {
+ memberArgs+=yytext;
+ }
+<DoxReadArgs>"&lt;" {
+ memberArgs+='<';
+ }
+<DoxReadArgs>"&gt;" {
+ memberArgs+='>';
+ }
+<DoxReadArgs>"&amp;" {
+ memberArgs+='&';
+ }
+<DoxReadArgs>"&quot;" {
+ memberArgs+='"';
+ }
+<DoxReadArgs>. {
+ memberArgs+=*yytext;
+ }
+<DoxReadArgs>"\" -->" {
+ addMember(memberName,memberRef,memberArgs);
+ memberName.resize(0);
+ memberRef.resize(0);
+ memberArgs.resize(0);
+ BEGIN(Start);
+ }
+
+ /** --------------------------------------------------- */
+
+<Start>"<pre>" {
+ BEGIN( SkipPreformated );
+ }
+<Start>"<a name=\"" {
+ BEGIN( SearchWords );
+ }
+<Start>"<" {
+ BEGIN( SkipHTMLTag );
+ }
+<Start>"&"[a-zA-Z]+";"
+<Start,SkipPreformated>[a-z_A-Z][a-z_A-Z0-9]* {
+ //printf("tag: %s#%s ref: %s word: `%s'\n",
+ // docBaseLink.data(),docAnchor.data(),
+ // docRefName.data(),yytext);
+ //if (genIndex && !docRefName.isEmpty() && yyleng>2)
+ // searchIndex.addWord(docRefName,
+ // yytext,FALSE
+ // );
+ }
+<SkipPreformated>"</pre>" {
+ BEGIN( Start );
+ }
+<SkipPreformated>[^\<\n]+
+<CheckConstructor>[a-z_A-Z0-9~:]+ {
+ QCString s=yytext;
+ if (s.find("::")!=-1)
+ {
+ docRefName=yytext;
+ addReference();
+ nameBug=TRUE;
+ }
+ else
+ {
+ nameBug=FALSE;
+ }
+ BEGIN( Start );
+ }
+<SearchWords>[a-z_A-Z0-9]+ {
+ docAnchor = yytext;
+ if (docAnchor=="details" ||
+ docAnchor=="_details")
+ {
+ docRefName=className.copy();
+ addReference();
+ BEGIN( Start );
+ }
+ else
+ {
+ BEGIN( SearchRefName );
+ }
+ }
+<SearchRefName>"\" doxytag=\"" {
+ BEGIN( ReadRefName );
+ }
+<SearchRefName>"\"></a><a" { // HACK: avoid finding links in code fragments
+ BEGIN( Start );
+ }
+<SearchRefName>"\"></a>" { // HACK: deal with Qt code
+ if (nameBug)
+ BEGIN( Start );
+ else
+ BEGIN( ReadRefName );
+ }
+
+<ReadRefName>[a-z_A-Z0-9:\.\+\-]*"operator"[ \t]*("new"|"delete"|("&amp;"("&amp"|"=")*)|("&gt;"("&gt;"|"=")*)|("&lt;"("&lt;"|"=")*)|("-&gt;"[*]*)|[+\-*%/|~!=,\^]|[+\-*%/\^!|~=\[(][=|+\-\])]) { // hmm, looks impressive :-)
+ docRefName=unhtmlify(yytext);
+ addReference();
+ BEGIN( Start );
+ }
+<ReadRefName>[a-z_A-Z0-9~:\.\+\-]+ {
+ //printf("ReadRef=%s\n",yytext);
+ docRefName=yytext;
+ addReference();
+ BEGIN( Start );
+ }
+<SearchBaseClasses>"<a "[a-z_A-Z0-9 .:\=\"\-\+\/\@]+">" {
+ //printf("Search %s\n",yytext);
+ BEGIN( ReadBaseClass );
+ }
+<SearchBaseClasses>\n {
+ addBases(className);
+ BEGIN( Start );
+ }
+<ReadBaseClass>[a-z_A-Z0-9]+ {
+ bases.append(yytext);
+ BEGIN( SearchBaseClasses );
+ }
+<SearchClassFile>"<a class=\"el\" href=\"" {
+ BEGIN( ReadClassFile );
+ }
+<SearchClassFile>"<a href=\"" {
+ BEGIN( ReadClassFile );
+ }
+<ReadClassName>[a-z_A-Z0-9:\.\-\+]+ {
+ className=yytext;
+ BEGIN( CheckClassName);
+ }
+<CheckClassName>"Class Reference" {
+ //printf("className=%s\n",className.data());
+ addClass(className);
+ BEGIN( Start );
+ }
+<CheckClassName>"File Reference" {
+ //printf("className=%s\n",className.data());
+ addFile(className);
+ BEGIN( Start );
+ }
+<CheckClassName>[a-z_A-Z0-9]+ { // not a class file
+ className.resize(0);
+ BEGIN( Start );
+ }
+<ReadClassFile>[a-z_A-Z0-9.\-\+]+ {
+ classFile=yytext;
+ BEGIN( SearchMemberRef );
+ }
+<SearchMemberRef,ReadClassFile>"#" {
+ if (YY_START==ReadClassFile)
+ {
+ classFile=yyFileName;
+ }
+ //BEGIN( ReadMemberRef );
+ BEGIN( Start );
+ }
+<ReadMemberRef>[a-z_A-Z0-9]+ {
+ memberRef=yytext;
+ BEGIN( SearchMemberName );
+ }
+<SearchMemberName>"<strong>"|"<b>" { // <strong> is for qt-1.44, <b> is for qt-2.00
+ BEGIN( ReadMemberName );
+ }
+<SearchMemberName>[a-z_A-Z~] {
+ unput(*yytext);
+ BEGIN( ReadMemberName );
+ }
+<ReadMemberName>"operator" {
+ memberName="operator";
+ BEGIN( ReadOperator );
+ }
+<ReadOperator>[+\-*/%\^&|~!=()\[\]] { memberName+=*yytext; }
+<ReadOperator>"&lt;" { memberName+="<"; }
+<ReadOperator>"&gt;" { memberName+=">"; }
+<ReadOperator>"new" { memberName+=" new"; }
+<ReadOperator>"delete" { memberName+=" delete"; }
+<ReadOperator>"<" { BEGIN( SearchArgs ); }
+<ReadMemberName>[a-z_A-Z0-9]+ {
+ memberName=yytext;
+ BEGIN( SearchArgs );
+ }
+<SearchArgs>"</a>" {
+ //printf("SearchArg className=%s memberName=%s\n",className.data(),memberName.data());
+ if (!className.isEmpty() && !memberName.isEmpty())
+ BEGIN( ReadArgs );
+ else
+ BEGIN( Start );
+ }
+<ReadArgs>"&amp;" { memberArgs+='&'; }
+<ReadArgs>"&lt;" { memberArgs+='<'; }
+<ReadArgs>"&gt;" { memberArgs+='>'; }
+<ReadArgs>"&quot;" { memberArgs+='"'; }
+<ReadArgs>"&nbsp;" { memberArgs+=' '; }
+ /*
+<ReadArgs>[{}] { // handle enums
+ memberArgs.resize(0);
+ addMember(memberName,memberRef,memberArgs);
+ if (*yytext=='}')
+ BEGIN( Start );
+ else
+ BEGIN( SearchClassFile );
+ }
+ */
+<ReadArgs>"<"|"\n" {
+ //printf("adding member %s\n",memberName.data());
+ memberArgs=memberArgs.stripWhiteSpace();
+ //if (newClass)
+ //{
+ // newClass=FALSE;
+ // addClass(className);
+ //}
+ addMember(memberName,memberRef,memberArgs);
+ memberName.resize(0);
+ memberRef.resize(0);
+ memberArgs.resize(0);
+ if (*yytext=='<')
+ BEGIN( SkipHTMLTag);
+ else
+ BEGIN( Start );
+ }
+<ReadArgs>. { memberArgs+=(*yytext)&0x7f; }
+<SkipHTMLTag>">" { BEGIN( Start ); }
+<SkipHTMLTag>[a-zA-Z]+
+<*>.
+<*>\n { yyLineNr++;
+ if (YY_START!=SkipHTMLTag) BEGIN( Start );
+ }
+
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+
+void parse(QCString &s)
+{
+ bases.clear();
+ nameBug = FALSE;
+ //newClass = TRUE;
+ inputString = s;
+ inputPosition = 0;
+ yyLineNr = 0;
+ tagYYrestart( tagYYin );
+ BEGIN( Start );
+ tagYYlex();
+ //printf("Number of lines scanned: %d\n",yyLineNr);
+}
+
+void parseFile(QFileInfo &fi)
+{
+ printf("Parsing file %s...\n",fi.fileName().data());
+ QFile f;
+ f.setName(fi.absFilePath());
+ if (f.open(IO_ReadOnly))
+ {
+ yyFileName = fi.fileName();
+ className.resize(0);
+ memberName.resize(0);
+ //printf("Parsing file %s...\n",fi.fileName().data());
+ QCString input(fi.size()+1);
+ docBaseLink=fi.fileName();
+ docRefName=fi.fileName().copy();
+ //searchIndex.addReference(docRefName,docBaseLink);
+ //searchIndex.addWord(docRefName,docRefName,TRUE);
+ f.readBlock(input.data(),fi.size());
+ input.at(fi.size())='\0';
+ parse(input);
+ }
+ else
+ {
+ fprintf(stderr,"Warning: Cannot open file %s\n",fi.fileName().data());
+ }
+}
+
+void parseFileOrDir(const char *fileName)
+{
+ QFileInfo fi(fileName);
+ if (fi.exists())
+ {
+ if (fi.isFile())
+ {
+ parseFile(fi);
+ }
+ else if (fi.isDir())
+ {
+ QDir dir(fileName);
+ dir.setFilter( QDir::Files );
+ dir.setNameFilter( "*.html" );
+ const QFileInfoList *list = dir.entryInfoList();
+ QFileInfoListIterator it( *list );
+ QFileInfo *cfi;
+ for ( it.toFirst() ; (cfi=it.current()) ; ++it)
+ {
+ if (cfi->isFile())
+ {
+ parseFile(*cfi);
+ }
+ }
+ }
+ }
+ else
+ {
+ fprintf(stderr,"Warning: File %s does not exist\n",fileName);
+ }
+}
+
+void usage(const char *name)
+{
+ fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-2011\n\n",
+ versionString);
+ fprintf(stderr," Generates a tag file and/or a search index for a set of HTML files\n\n");
+ fprintf(stderr,"Usage: %s [-t tag_file] [ html_file [html_file...] ]\n",name);
+ fprintf(stderr,"Options:\n");
+ fprintf(stderr," -t <tag_file> Generate tag file <tag_file>.\n");
+ fprintf(stderr,"If no HTML files are given all files in the current dir that\n"
+ "have a .html extension are parsed.\n\n");
+ exit(1);
+}
+
+const char *getArg(int argc,char **argv,int &optind,const char c)
+{
+ char *s=0;
+ if (strlen(&argv[optind][2])>0)
+ s=&argv[optind][2];
+ else if (optind+1<argc)
+ s=argv[++optind];
+ else
+ {
+ fprintf(stderr,"option -%c requires an argument\n",c);
+ exit(1);
+ }
+ return s;
+}
+
+int main(int argc,char **argv)
+{
+ QCString tagName;
+ QCString indexName;
+
+ int optind=1;
+ const char *arg;
+ while (optind<argc && argv[optind][0]=='-')
+ {
+ switch(argv[optind][1])
+ {
+ case 't':
+ arg=getArg(argc,argv,optind,'t');
+ tagName=arg;
+ break;
+ case 's':
+ arg=getArg(argc,argv,optind,'s');
+ indexName=arg;
+ break;
+ case 'h':
+ case '?':
+ usage(argv[0]);
+ break;
+ default:
+ fprintf(stderr,"Unknown option -%c\n",argv[optind][1]);
+ usage(argv[0]);
+ }
+ optind++;
+ }
+
+ genTag = !tagName.isEmpty();
+ genIndex = !indexName.isEmpty();
+
+ if (!genTag && !genIndex)
+ {
+ fprintf(stderr,"Nothing to do !\n\n");
+ usage(argv[0]);
+ }
+
+ int i;
+ if (optind>=argc)
+ {
+ parseFileOrDir(".");
+ }
+ else
+ {
+ for (i=optind;i<argc;i++)
+ {
+ parseFileOrDir(argv[i]);
+ }
+ }
+ if (genIndex)
+ {
+ fprintf(stderr,"Error: doxytag cannot be used to generate a search index anymore.\n"
+ "This functionality has been integrated into doxygen.\n");
+// printf("Writing search index\n");
+// if (!searchIndex.saveIndex(indexName))
+// {
+// fprintf(stderr,"Error: Could not write search index\n");
+// }
+// QFileInfo fi(indexName);
+// if (fi.exists())
+// {
+// QCString dir=convertToQCString(fi.dir().absPath());
+// fi.setFile(dir+"/search.png");
+// if (!fi.exists()) writeSearchButton(dir);
+// fi.setFile(dir+"/doxygen.png");
+// if (!fi.exists()) writeLogo(dir);
+// fi.setFile(dir+"/search.cgi");
+// if (!fi.exists())
+// {
+// QFile f;
+// f.setName(dir+"/search.cgi");
+// if (f.open(IO_WriteOnly))
+// {
+// QTextStream t(&f);
+// t << "#!/bin/sh" << endl
+// << "DOXYSEARCH=" << endl
+// << "DOXYPATH=" << endl
+// << "if [ -f $DOXYSEARCH ]" << endl
+// << "then" << endl
+// << " $DOXYSEARCH $DOXYPATH" << endl
+// << "else" << endl
+// << " echo \"Content-Type: text/html\"" << endl
+// << " echo \"\"" << endl
+// << " echo \"<H1>Error: $DOXYSEARCH not found. Check cgi script!\"" << endl
+// << "fi" << endl;
+// f.close();
+// }
+// else
+// {
+// fprintf(stderr,"Error: could not open file %s for writing\n",(dir+"/search.cgi").data());
+// }
+// }
+// }
+ }
+ if (genTag)
+ {
+ QFile f;
+ f.setName(tagName);
+ if (f.open(IO_WriteOnly))
+ {
+ QTextStream t(&f);
+ t << "<tagfile>" << endl;
+ ClassDef *cd=classList.first();
+ while (cd)
+ {
+ t << " <compound kind=\"";
+ if (cd->isFile) t << "file"; else t << "class";
+ t << "\">" << endl;
+ t << " <name>" << convertToXML(cd->name) << "</name>" << endl;
+ char *base=cd->bases.first();
+ while (base)
+ {
+ t << " <base>" << convertToXML(base) << "</base>" << endl;
+ base=cd->bases.next();
+ }
+ t << " <filename>" << convertToXML(cd->fileName) << "</filename>" << endl;
+ MemberDef *md=cd->memberList.first();
+ while (md)
+ {
+ if (md->anchor.right(5)=="-enum")
+ {
+ t << " <member kind=\"enum\">" << endl;
+ }
+ else
+ {
+ t << " <member kind=\"function\">" << endl;
+ }
+ t << " <name>" << convertToXML(md->name) << "</name>" << endl;
+ t << " <anchor>" << convertToXML(md->anchor) << "</anchor>" << endl;
+ t << " <arglist>" << convertToXML(md->args) << "</arglist>" << endl;
+ t << " </member>" << endl;
+ md=cd->memberList.next();
+ }
+ t << " </compound>" << endl;
+ cd=classList.next();
+ }
+ t << "</tagfile>" << endl;
+ }
+ else
+ {
+ fprintf(stderr,"Error: Could not write tag file %s\n",tagName.data());
+ }
+ }
+ return 0;
+}
+
+extern "C" {
+int tagYYwrap() { return 1 ; }
+};
diff --git a/src/doxytag.pro b/src/doxytag.pro
new file mode 100644
index 0000000..a18b14f
--- /dev/null
+++ b/src/doxytag.pro
@@ -0,0 +1,36 @@
+#
+# This file was generated from doxytag.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+#
+# $Id: doxytag.pro,v 1.13 1999/04/04 10:16:11 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+# TMake project file for doxytag
+
+TEMPLATE = doxytag.t
+CONFIG = console warn_on debug
+HEADERS = logos.h version.h
+SOURCES = doxytag.cpp logos.cpp version.cpp
+unix:LIBS += -L../lib -lqtools
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../lib -lqtools
+win32-msvc:LIBS += qtools.lib shell32.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib
+win32-borland:LIBS += qtools.lib shell32.lib
+win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+INCLUDEPATH += ../qtools
+OBJECTS_DIR = ../objects
+TARGET = ../bin/doxytag
+TMAKE_MOC = /usr/bin/moc
diff --git a/src/doxytag.pro.in b/src/doxytag.pro.in
new file mode 100644
index 0000000..f6010dd
--- /dev/null
+++ b/src/doxytag.pro.in
@@ -0,0 +1,31 @@
+#
+# $Id: doxytag.pro,v 1.13 1999/04/04 10:16:11 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+# TMake project file for doxytag
+
+TEMPLATE = doxytag.t
+CONFIG = console warn_on $extraopts
+HEADERS = logos.h version.h
+SOURCES = doxytag.cpp logos.cpp version.cpp
+unix:LIBS += -L../lib -lqtools
+win32:INCLUDEPATH += .
+win32-mingw:LIBS += -L../lib -lqtools
+win32-msvc:LIBS += qtools.lib shell32.lib
+win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib
+win32-borland:LIBS += qtools.lib shell32.lib
+win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+INCLUDEPATH += ../qtools
+OBJECTS_DIR = ../objects
+TARGET = ../bin/doxytag
diff --git a/src/doxytag.t b/src/doxytag.t
new file mode 100644
index 0000000..9a723af
--- /dev/null
+++ b/src/doxytag.t
@@ -0,0 +1,50 @@
+#
+# $Id: doxytag.t,v 1.7 2000/04/23 14:56:23 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+#!
+#! doxytag.t: This is a custom template for building Doxytag
+#!
+#$ IncludeTemplate("app.t");
+
+LEX = flex
+
+#${
+sub GenerateDep {
+ my($obj,$src,$dep) = @_;
+ my(@objv,$srcv,$i,$s,$o,$d,$c);
+ @objv = split(/\s+/,$obj);
+ @srcv = split(/\s+/,$src);
+ for $i ( 0..$#objv ) {
+ $s = $srcv[$i];
+ $o = $objv[$i];
+ next if $s eq "";
+ $text .= $o . ": " . $s;
+ $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
+ if ( $moc_output{$s} ne "" ) {
+ $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
+ }
+ $d = &make_depend($s);
+ $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
+ $text .= "\n";
+ }
+ chop $text;
+}
+#$}
+
+#####################
+
+#$ GenerateDep("doxytag.cpp","doxytag.l");
+ $(LEX) -PtagYY -t doxytag.l >doxytag.cpp
+
+
diff --git a/src/eclipsehelp.cpp b/src/eclipsehelp.cpp
new file mode 100644
index 0000000..feea0ba
--- /dev/null
+++ b/src/eclipsehelp.cpp
@@ -0,0 +1,201 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#include "eclipsehelp.h"
+#include "util.h"
+#include "config.h"
+#include "message.h"
+#include "doxygen.h"
+
+EclipseHelp::EclipseHelp() : m_depth(0), m_endtag(FALSE), m_tocfile(0)
+{
+}
+
+EclipseHelp::~EclipseHelp()
+{
+}
+
+void EclipseHelp::indent()
+{
+ int i;
+ for (i=0; i<m_depth; i++)
+ {
+ m_tocstream << " ";
+ }
+}
+
+void EclipseHelp::closedTag()
+{
+ if (m_endtag)
+ {
+ m_tocstream << "/>" << endl;
+ m_endtag = FALSE;
+ }
+}
+
+void EclipseHelp::openedTag()
+{
+ if (m_endtag)
+ {
+ m_tocstream << ">" << endl;
+ m_endtag = FALSE;
+ }
+}
+
+/*!
+ * \brief Initialize the Eclipse generator
+ *
+ * This method opens the XML TOC file and writes headers of the files.
+ * \sa finalize()
+ */
+void EclipseHelp::initialize()
+{
+ // -- read path prefix from the configuration
+ //m_pathprefix = Config_getString("ECLIPSE_PATHPREFIX");
+ //if (m_pathprefix.isEmpty()) m_pathprefix = "html/";
+
+ // -- open the contents file
+ QCString name = Config_getString("HTML_OUTPUT") + "/toc.xml";
+ m_tocfile = new QFile(name);
+ if (!m_tocfile->open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n", name.data());
+ exit(1);
+ }
+
+ // -- initialize its text stream
+ m_tocstream.setDevice(m_tocfile);
+ //m_tocstream.setEncoding(FTextStream::UnicodeUTF8);
+
+ // -- write the opening tag
+ QCString title = Config_getString("PROJECT_NAME");
+ if (title.isEmpty())
+ {
+ title = "Doxygen generated documentation";
+ }
+ m_tocstream << "<toc label=\"" << convertToXML(title)
+ << "\" topic=\"" << convertToXML(m_pathprefix)
+ << "index" << Doxygen::htmlFileExtension << "\">" << endl;
+ ++ m_depth;
+}
+
+/*!
+ * \brief Finish generation of the Eclipse specific help files
+ *
+ * This method writes footers of the files and closes them.
+ * \sa initialize()
+ */
+void EclipseHelp::finalize()
+{
+ closedTag(); // -- close previous tag
+
+ // -- write ending tag
+ --m_depth;
+ m_tocstream << "</toc>" << endl;
+
+ // -- close the content file
+ m_tocstream.unsetDevice();
+ m_tocfile->close();
+ delete m_tocfile; m_tocfile = 0;
+
+ QCString name = Config_getString("HTML_OUTPUT") + "/plugin.xml";
+ QFile pluginFile(name);
+ if (pluginFile.open(IO_WriteOnly))
+ {
+ QString docId = Config_getString("ECLIPSE_DOC_ID");
+ FTextStream t(&pluginFile);
+ t << "<plugin name=\"" << docId << "\" id=\"" << docId << "\"" << endl;
+ t << " version=\"1.0.0\" provider-name=\"Doxygen\">" << endl;
+ t << " <extension point=\"org.eclipse.help.toc\">" << endl;
+ t << " <toc file=\"toc.xml\" primary=\"true\" />" << endl;
+ t << " </extension>" << endl;
+ t << "</plugin>" << endl;
+ }
+}
+
+/*!
+ * \brief Increase the level of content hierarchy
+ */
+void EclipseHelp::incContentsDepth()
+{
+ openedTag();
+ ++m_depth;
+}
+
+/*!
+ * \brief Decrease the level of content hierarchy
+ *
+ * It closes currently opened topic tag.
+ */
+void EclipseHelp::decContentsDepth()
+{
+ // -- end of the opened topic
+ closedTag();
+ --m_depth;
+ indent();
+ m_tocstream << "</topic>" << endl;
+}
+
+/*!
+ * \brief Add an item to the content
+ *
+ * @param isDir Flag whether the argument \a file is a directory or a file entry
+ * @param name Name of the item
+ * @param ref URL of the item
+ * @param file Name of a file which the item is defined in (without extension)
+ * @param anchor Name of an anchor of the item.
+ */
+void EclipseHelp::addContentsItem(
+ bool /* isDir */,
+ const char *name,
+ const char * /* ref */,
+ const char *file,
+ const char *anchor)
+{
+ // -- write the topic tag
+ closedTag();
+ indent();
+ m_tocstream << "<topic label=\"" << convertToXML(name) << "\"";
+ if (file)
+ {
+ m_tocstream << " href=\"" << convertToXML(m_pathprefix)
+ << file << Doxygen::htmlFileExtension;
+ if (anchor)
+ {
+ m_tocstream << "#" << anchor;
+ }
+ m_tocstream << "\"";
+ }
+ m_endtag = TRUE;
+}
+
+void EclipseHelp::addIndexItem(
+ Definition * /* context */,
+ MemberDef * /* md */,
+ const char * /* title */)
+{
+}
+
+void EclipseHelp::addIndexFile(const char * /* name */)
+{
+}
+
+void EclipseHelp::addImageFile(const char * /* name */)
+{
+}
+
+void EclipseHelp::addStyleSheetFile(const char * /* name */)
+{
+}
+
diff --git a/src/eclipsehelp.h b/src/eclipsehelp.h
new file mode 100644
index 0000000..9b7ab83
--- /dev/null
+++ b/src/eclipsehelp.h
@@ -0,0 +1,77 @@
+/******************************************************************************
+ *
+ * $Id: htmlgen.h,v 1.51 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*
+ * eclipsehelp.h
+ *
+ * Created on: 7.11.2009
+ * Author: ondrej
+ */
+
+#ifndef ECLIPSEHELP_H
+#define ECLIPSEHELP_H
+
+#include "qtbc.h"
+#include "index.h"
+#include "ftextstream.h"
+
+/* -- forward declarations */
+class QFile;
+
+/*!
+ * \brief Generator of Eclipse help files
+ *
+ * This class generates the Eclipse specific help files.
+ * These files can be used to generate a help plugin readable
+ * by the Eclipse IDE.
+ */
+class EclipseHelp : public IndexIntf
+{
+ public:
+ EclipseHelp();
+ virtual ~EclipseHelp();
+
+ /* -- index interface */
+ virtual void initialize();
+ virtual void finalize();
+ virtual void incContentsDepth();
+ virtual void decContentsDepth();
+ virtual void addContentsItem(bool isDir, const char *name, const char *ref = 0,
+ const char *file = 0, const char *anchor = 0);
+ virtual void addIndexItem(Definition *context,MemberDef *md,const char *title);
+ virtual void addIndexFile(const char *name);
+ virtual void addImageFile(const char *name);
+ virtual void addStyleSheetFile(const char *name);
+
+ private:
+ int m_depth;
+ bool m_endtag;
+
+ QFile * m_tocfile;
+ FTextStream m_tocstream;
+ QCString m_pathprefix;
+
+ /* -- avoid copying */
+ EclipseHelp(const EclipseHelp &);
+ EclipseHelp & operator = (const EclipseHelp &);
+
+ /* -- formatting helpers */
+ void indent();
+ void closedTag();
+ void openedTag();
+};
+
+#endif /* ECLIPSEHELP_H */
diff --git a/src/entry.cpp b/src/entry.cpp
new file mode 100644
index 0000000..1a6bc4f
--- /dev/null
+++ b/src/entry.cpp
@@ -0,0 +1,467 @@
+/******************************************************************************
+ *
+ * $Id: entry.cpp,v 1.29 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+#include <qfile.h>
+#include "entry.h"
+#include "marshal.h"
+#include "util.h"
+#include "section.h"
+#include "doxygen.h"
+
+//------------------------------------------------------------------
+
+#define HEADER ('D'<<24)+('O'<<16)+('X'<<8)+'!'
+
+//------------------------------------------------------------------
+
+/*! the argument list is documented if one of its
+ * arguments is documented
+ */
+bool ArgumentList::hasDocumentation() const
+{
+ bool hasDocs=FALSE;
+ ArgumentListIterator ali(*this);
+ Argument *a;
+ for (ali.toFirst();!hasDocs && (a=ali.current());++ali)
+ {
+ hasDocs = a->hasDocumentation();
+ }
+ return hasDocs;
+}
+
+//------------------------------------------------------------------
+
+int Entry::num=0;
+
+Entry::Entry()
+{
+ //printf("Entry::Entry(%p)\n",this);
+ num++;
+ m_parent=0;
+ section = EMPTY_SEC;
+ m_sublist = new QList<Entry>;
+ m_sublist->setAutoDelete(TRUE);
+ extends = new QList<BaseInfo>;
+ extends->setAutoDelete(TRUE);
+ groups = new QList<Grouping>;
+ groups->setAutoDelete(TRUE);
+ anchors = new QList<SectionInfo>; // Doxygen::sectionDict takes ownership of the items!
+ argList = new ArgumentList;
+ argList->setAutoDelete(TRUE);
+ //printf("Entry::Entry() tArgList=0\n");
+ tArgLists = 0;
+ typeConstr = 0;
+ mGrpId = -1;
+ tagInfo = 0;
+ sli = 0;
+ relatesType = Simple;
+ hidden = FALSE;
+ groupDocType = GROUPDOC_NORMAL;
+ reset();
+}
+
+Entry::Entry(const Entry &e)
+{
+ //printf("Entry::Entry(%p):copy\n",this);
+ num++;
+ section = e.section;
+ type = e.type;
+ name = e.name;
+ tagInfo = e.tagInfo;
+ protection = e.protection;
+ mtype = e.mtype;
+ spec = e.spec;
+ initLines = e.initLines;
+ stat = e.stat;
+ explicitExternal = e.explicitExternal;
+ proto = e.proto;
+ subGrouping = e.subGrouping;
+ callGraph = e.callGraph;
+ callerGraph = e.callerGraph;
+ virt = e.virt;
+ args = e.args;
+ bitfields = e.bitfields;
+ argList = new ArgumentList;
+ argList->setAutoDelete(TRUE);
+ tArgLists = 0;
+ program = e.program;
+ initializer = e.initializer;
+ includeFile = e.includeFile;
+ includeName = e.includeName;
+ doc = e.doc;
+ docLine = e.docLine;
+ docFile = e.docFile;
+ brief = e.brief;
+ briefLine = e.briefLine;
+ briefFile = e.briefFile;
+ inbodyDocs = e.inbodyDocs;
+ inbodyLine = e.inbodyLine;
+ inbodyFile = e.inbodyFile;
+ relates = e.relates;
+ relatesType = e.relatesType;
+ read = e.read;
+ write = e.write;
+ inside = e.inside;
+ exception = e.exception;
+ typeConstr = 0;
+ bodyLine = e.bodyLine;
+ endBodyLine = e.endBodyLine;
+ mGrpId = e.mGrpId;
+ extends = new QList<BaseInfo>;
+ extends->setAutoDelete(TRUE);
+ groups = new QList<Grouping>;
+ groups->setAutoDelete(TRUE);
+ anchors = new QList<SectionInfo>;
+ fileName = e.fileName;
+ startLine = e.startLine;
+ if (e.sli)
+ {
+ sli = new QList<ListItemInfo>;
+ sli->setAutoDelete(TRUE);
+ QListIterator<ListItemInfo> slii(*e.sli);
+ ListItemInfo *ili;
+ for (slii.toFirst();(ili=slii.current());++slii)
+ {
+ sli->append(new ListItemInfo(*ili));
+ }
+ }
+ else
+ {
+ sli=0;
+ }
+ lang = e.lang;
+ hidden = e.hidden;
+ artificial = e.artificial;
+ groupDocType = e.groupDocType;
+
+ m_parent = e.m_parent;
+ m_sublist = new QList<Entry>;
+ m_sublist->setAutoDelete(TRUE);
+
+ // deep copy of the child entry list
+ QListIterator<Entry> eli(*e.m_sublist);
+ Entry *cur;
+ for (;(cur=eli.current());++eli)
+ {
+ m_sublist->append(new Entry(*cur));
+ }
+
+ // deep copy base class list
+ QListIterator<BaseInfo> bli(*e.extends);
+ BaseInfo *bi;
+ for (;(bi=bli.current());++bli)
+ {
+ extends->append(new BaseInfo(*bi));
+ }
+
+ // deep copy group list
+ QListIterator<Grouping> gli(*e.groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ groups->append(new Grouping(*g));
+ }
+
+ QListIterator<SectionInfo> sli2(*e.anchors);
+ SectionInfo *s;
+ for (;(s=sli2.current());++sli2)
+ {
+ anchors->append(new SectionInfo(*s));
+ }
+
+ // deep copy argument list
+ QListIterator<Argument> ali(*e.argList);
+ Argument *a;
+ for (;(a=ali.current());++ali)
+ {
+ argList->append(new Argument(*a));
+ }
+ argList->constSpecifier = e.argList->constSpecifier;
+ argList->volatileSpecifier = e.argList->volatileSpecifier;
+ argList->pureSpecifier = e.argList->pureSpecifier;
+
+ // deep copy type contraint list
+ if (e.typeConstr)
+ {
+ typeConstr = new ArgumentList;
+ typeConstr->setAutoDelete(TRUE);
+ QListIterator<Argument> tcli(*e.typeConstr);
+ for (;(a=tcli.current());++tcli)
+ {
+ typeConstr->append(new Argument(*a));
+ }
+ }
+
+ // deep copy template argument lists
+ if (e.tArgLists)
+ {
+ tArgLists = copyArgumentLists(e.tArgLists);
+ }
+
+}
+
+Entry::~Entry()
+{
+ //printf("Entry::~Entry(%p) num=%d\n",this,num);
+ //printf("Deleting entry %d name %s type %x children %d\n",
+ // num,name.data(),section,sublist->count());
+
+ delete m_sublist; // each element is now own by a EntryNav so we do no longer own
+ // our children.
+ delete extends;
+ delete groups;
+ delete anchors;
+ delete argList;
+ delete tArgLists;
+ delete tagInfo;
+ delete typeConstr;
+ delete sli;
+ num--;
+}
+
+void Entry::addSubEntry(Entry *current)
+{
+ //printf("Entry %d with name %s type 0x%x added to %s type 0x%x\n",
+ // current->num,current->name.data(),current->section,
+ // name.data(),section);
+ //printf("Entry::addSubEntry(%s:%p) to %s\n",current->name.data(),
+ // current,name.data());
+ current->m_parent=this;
+ m_sublist->append(current);
+}
+
+void Entry::reset()
+{
+ //printf("Entry::reset()\n");
+ name.resize(0);
+ type.resize(0);
+ args.resize(0);
+ bitfields.resize(0);
+ exception.resize(0);
+ program.resize(0);
+ includeFile.resize(0);
+ includeName.resize(0);
+ doc.resize(0);
+ docFile.resize(0);
+ docLine=-1;
+ relates.resize(0);
+ relatesType=Simple;
+ brief.resize(0);
+ briefFile.resize(0);
+ briefLine=-1;
+ inbodyDocs.resize(0);
+ inbodyFile.resize(0);
+ inbodyLine=-1;
+ inside.resize(0);
+ fileName.resize(0);
+ initializer.resize(0);
+ initLines = -1;
+ startLine = 1;
+ bodyLine = -1;
+ endBodyLine = -1;
+ mGrpId = -1;
+ callGraph = FALSE;
+ callerGraph = FALSE;
+ section = EMPTY_SEC;
+ mtype = Method;
+ virt = Normal;
+ stat = FALSE;
+ proto = FALSE;
+ explicitExternal = FALSE;
+ spec = 0;
+ lang = SrcLangExt_Unknown;
+ hidden = FALSE;
+ artificial = FALSE;
+ subGrouping = TRUE;
+ protection = Public;
+ groupDocType = GROUPDOC_NORMAL;
+ m_sublist->clear();
+ extends->clear();
+ groups->clear();
+ anchors->clear();
+ argList->clear();
+ if (tagInfo) { delete tagInfo; tagInfo=0; }
+ if (tArgLists) { delete tArgLists; tArgLists=0; }
+ if (sli) { delete sli; sli=0; }
+ if (typeConstr) { delete typeConstr; typeConstr=0; }
+ //if (mtArgList) { delete mtArgList; mtArgList=0; }
+}
+
+
+int Entry::getSize()
+{
+ return sizeof(Entry);
+}
+
+void Entry::createSubtreeIndex(EntryNav *nav,FileStorage *storage,FileDef *fd)
+{
+ EntryNav *childNav = new EntryNav(nav,this);
+ nav->addChild(childNav);
+ childNav->setFileDef(fd);
+ childNav->saveEntry(this,storage);
+ if (m_sublist)
+ {
+ //printf("saveEntry: %d children\n",node->sublist->count());
+ QListIterator<Entry> eli(*m_sublist);
+ Entry *childNode;
+ for (eli.toFirst();(childNode=eli.current());++eli)
+ {
+ childNode->createSubtreeIndex(childNav,storage,fd);
+ }
+ //m_sublist->setAutoDelete(FALSE);
+ m_sublist->clear();
+ }
+}
+
+void Entry::createNavigationIndex(EntryNav *rootNav,FileStorage *storage,FileDef *fd)
+{
+ //printf("createNavigationIndex(%p) sublist=%p\n",this,m_sublist);
+ if (m_sublist)
+ {
+ //printf("saveEntries: %d children\n",root->sublist->count());
+ // store all child entries of root, but keep the navigation info (=index)
+ QListIterator<Entry> eli(*m_sublist);
+ Entry *e;
+ for (eli.toFirst();(e=eli.current());++eli)
+ {
+ createSubtreeIndex(rootNav,storage,fd);
+ }
+ // remove all entries from root
+ //m_sublist->setAutoDelete(FALSE);
+ m_sublist->clear();
+ }
+}
+
+void Entry::addSpecialListItem(const char *listName,int itemId)
+{
+ if (sli==0)
+ {
+ sli = new QList<ListItemInfo>;
+ sli->setAutoDelete(TRUE);
+ }
+ ListItemInfo *ili=new ListItemInfo;
+ ili->type = listName;
+ ili->itemId = itemId;
+ sli->append(ili);
+}
+
+//------------------------------------------------------------------
+
+
+EntryNav::EntryNav(EntryNav *parent, Entry *e)
+ : m_parent(parent), m_subList(0), m_section(e->section), m_type(e->type),
+ m_name(e->name), m_fileDef(0), m_lang(e->lang),
+ m_info(0), m_offset(-1), m_noLoad(FALSE)
+{
+ if (e->tagInfo)
+ {
+ m_tagInfo = new TagInfo;
+ m_tagInfo->tagName = e->tagInfo->tagName;
+ m_tagInfo->fileName = e->tagInfo->fileName;
+ m_tagInfo->anchor = e->tagInfo->anchor;
+ if (e->tagInfo)
+ {
+ //printf("tagInfo %p: tagName=%s fileName=%s anchor=%s\n",
+ // e->tagInfo,
+ // e->tagInfo->tagName.data(),
+ // e->tagInfo->fileName.data(),
+ // e->tagInfo->anchor.data());
+ }
+ }
+ else
+ {
+ m_tagInfo = 0;
+ }
+}
+
+EntryNav::~EntryNav()
+{
+ delete m_subList;
+ delete m_info;
+ delete m_tagInfo;
+}
+
+void EntryNav::addChild(EntryNav *e)
+{
+ if (m_subList==0)
+ {
+ m_subList = new QList<EntryNav>;
+ m_subList->setAutoDelete(TRUE);
+ }
+ m_subList->append(e);
+}
+
+bool EntryNav::loadEntry(FileStorage *storage)
+{
+ if (m_noLoad)
+ {
+ return TRUE;
+ }
+ if (m_offset==-1)
+ {
+ //printf("offset not set!\n");
+ return FALSE;
+ }
+ //delete m_info;
+ //printf("EntryNav::loadEntry: new entry %p: %s\n",m_info,m_name.data());
+ //m_info->tagInfo = m_tagInfo;
+ //if (m_parent)
+ //{
+ // m_info->parent = m_parent->m_info;
+ //}
+ //m_info->parent = 0;
+ //printf("load entry: seek to %llx\n",m_offset);
+ if (!storage->seek(m_offset))
+ {
+ //printf("seek failed!\n");
+ return FALSE;
+ }
+ if (m_info) delete m_info;
+ m_info = unmarshalEntry(storage);
+ m_info->name = m_name;
+ m_info->type = m_type;
+ m_info->section = m_section;
+ return TRUE;
+}
+
+bool EntryNav::saveEntry(Entry *e,FileStorage *storage)
+{
+ m_offset = storage->pos();
+ //printf("EntryNav::saveEntry offset=%llx\n",m_offset);
+ marshalEntry(storage,e);
+ return TRUE;
+}
+
+void EntryNav::releaseEntry()
+{
+ if (!m_noLoad)
+ {
+ //printf("EntryNav::releaseEntry %p\n",m_info);
+ delete m_info;
+ m_info=0;
+ }
+}
+
+void EntryNav::setEntry(Entry *e)
+{
+ delete m_info;
+ m_info = e;
+ //printf("EntryNav::setEntry %p\n",e);
+ m_noLoad=TRUE;
+}
+
diff --git a/src/entry.h b/src/entry.h
new file mode 100644
index 0000000..a8b4d81
--- /dev/null
+++ b/src/entry.h
@@ -0,0 +1,450 @@
+/******************************************************************************
+ *
+ * $Id: entry.h,v 1.36 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef ENTRY_H
+#define ENTRY_H
+
+#include "qtbc.h"
+#include <qlist.h>
+
+#include <qgstring.h>
+#include "util.h"
+
+struct SectionInfo;
+class QFile;
+class EntryNav;
+class FileDef;
+class FileStorage;
+class StorageIntf;
+
+enum Protection { Public, Protected, Private, Package } ;
+enum Specifier { Normal, Virtual, Pure } ;
+enum MethodTypes { Method, Signal, Slot, DCOP, Property, Event };
+enum RelatesType { Simple, Duplicate, MemberOf };
+enum Relationship { Member, Related, Foreign };
+
+struct ListItemInfo
+{
+ QCString type;
+ int itemId;
+};
+
+/*! \brief This class stores information about an inheritance relation
+ */
+struct BaseInfo
+{
+ /*! Creates an object representing an inheritance relation */
+ BaseInfo(const char *n,Protection p,Specifier v) :
+ name(n),prot(p),virt(v) {}
+ QCString name; //!< the name of the base class
+ Protection prot; //!< inheritance type
+ Specifier virt; //!< virtualness
+};
+
+/*! \brief This class contains the information about the argument of a
+ * function or template
+ *
+ */
+struct Argument
+{
+ /*! Construct a new argument. */
+ Argument() {}
+ /*! Copy an argument (does a deep copy of all strings). */
+ Argument(const Argument &a)
+ {
+ attrib=a.attrib.copy();
+ type=a.type.copy();
+ name=a.name.copy();
+ defval=a.defval.copy();
+ docs=a.docs.copy();
+ array=a.array.copy();
+ }
+ /*! Assignment of an argument (does a deep copy of all strings). */
+ Argument &operator=(const Argument &a)
+ {
+ if (this!=&a)
+ {
+ attrib=a.attrib.copy();
+ type=a.type.copy();
+ name=a.name.copy();
+ defval=a.defval.copy();
+ docs=a.docs.copy();
+ array=a.array.copy();
+ }
+ return *this;
+ }
+ /*! return TRUE if this argument is documentation and the argument has a
+ * non empty name.
+ */
+ bool hasDocumentation() const
+ {
+ return !name.isEmpty() && !docs.isEmpty();
+ }
+
+ QCString attrib; /*!< Argument's attribute (IDL only) */
+ QCString type; /*!< Argument's type */
+ QCString canType; /*!< Cached value of canonical type (after type resolution). Empty initially. */
+ QCString name; /*!< Argument's name (may be empty) */
+ QCString array; /*!< Argument's array specifier (may be empty) */
+ QCString defval; /*!< Argument's default value (may be empty) */
+ QCString docs; /*!< Argument's documentation (may be empty) */
+};
+
+/*! \brief This class represents an function or template argument list.
+ *
+ * This class also stores some information about member that is typically
+ * put after the argument list, such as wether the member is const,
+ * volatile or pure virtual.
+ */
+class ArgumentList : public QList<Argument>
+{
+ public:
+ /*! Creates an empty argument list */
+ ArgumentList() : QList<Argument>(),
+ constSpecifier(FALSE),
+ volatileSpecifier(FALSE),
+ pureSpecifier(FALSE)
+ { setAutoDelete(TRUE); }
+ /*! Destroys the argument list */
+ ~ArgumentList() {}
+ bool hasDocumentation() const;
+ /*! Does the member modify the state of the class? default: FALSE. */
+ bool constSpecifier;
+ /*! Is the member volatile? default: FALSE. */
+ bool volatileSpecifier;
+ /*! Is this a pure virtual member? default: FALSE */
+ bool pureSpecifier;
+};
+
+typedef QListIterator<Argument> ArgumentListIterator;
+
+/*! \brief This struct is used to capture the tag file information
+ * for an Entry.
+ */
+struct TagInfo
+{
+ QCString tagName;
+ QCString fileName;
+ QCString anchor;
+};
+
+struct Grouping
+{
+ enum GroupPri_t
+ {
+ GROUPING_LOWEST,
+ GROUPING_AUTO_WEAK =
+ GROUPING_LOWEST, //!< membership in group was defined via \@weakgroup
+ GROUPING_AUTO_ADD, //!< membership in group was defined via \@add[to]group
+ GROUPING_AUTO_DEF, //!< membership in group was defined via \@defgroup
+ GROUPING_AUTO_HIGHEST = GROUPING_AUTO_DEF,
+ GROUPING_INGROUP, //!< membership in group was defined by \@ingroup
+ GROUPING_HIGHEST = GROUPING_INGROUP
+ };
+
+ static const char *getGroupPriName( GroupPri_t priority )
+ {
+ switch( priority )
+ {
+ case GROUPING_AUTO_WEAK:
+ return "@weakgroup";
+ case GROUPING_AUTO_ADD:
+ return "@addtogroup";
+ case GROUPING_AUTO_DEF:
+ return "@defgroup";
+ case GROUPING_INGROUP:
+ return "@ingroup";
+ }
+ return "???";
+ }
+
+ Grouping( const char *gn, GroupPri_t p ) : groupname(gn), pri(p) {}
+ Grouping( const Grouping &g ) : groupname(g.groupname), pri(g.pri) {}
+ QCString groupname; //!< name of the group
+ GroupPri_t pri; //!< priority of this definition
+
+};
+
+/*! \brief Represents an unstructured piece of information, about an
+ * entity found in the sources.
+ *
+ * parseMain() in scanner.l will generate a tree of these
+ * entries.
+ */
+class Entry
+{
+ public:
+
+ /*! Kind of entries that are supported */
+ enum Sections {
+ CLASS_SEC = 0x00000001,
+ NAMESPACE_SEC = 0x00000010,
+ COMPOUND_MASK = CLASS_SEC,
+ SCOPE_MASK = COMPOUND_MASK | NAMESPACE_SEC,
+
+ CLASSDOC_SEC = 0x00000800,
+ STRUCTDOC_SEC = 0x00001000,
+ UNIONDOC_SEC = 0x00002000,
+ EXCEPTIONDOC_SEC = 0x00004000,
+ NAMESPACEDOC_SEC = 0x00008000,
+ INTERFACEDOC_SEC = 0x00010000,
+ PROTOCOLDOC_SEC = 0x00020000,
+ CATEGORYDOC_SEC = 0x00040000,
+ COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC |
+ INTERFACEDOC_SEC | EXCEPTIONDOC_SEC | PROTOCOLDOC_SEC |
+ CATEGORYDOC_SEC,
+
+ SOURCE_SEC = 0x00400000,
+ HEADER_SEC = 0x00800000,
+ FILE_MASK = SOURCE_SEC | HEADER_SEC,
+
+ ENUMDOC_SEC = 0x01000000,
+ ENUM_SEC = 0x02000000,
+ EMPTY_SEC = 0x03000000,
+ PAGEDOC_SEC = 0x04000000,
+ VARIABLE_SEC = 0x05000000,
+ FUNCTION_SEC = 0x06000000,
+ TYPEDEF_SEC = 0x07000000,
+ MEMBERDOC_SEC = 0x08000000,
+ OVERLOADDOC_SEC = 0x09000000,
+ EXAMPLE_SEC = 0x0a000000,
+ VARIABLEDOC_SEC = 0x0b000000,
+ FILEDOC_SEC = 0x0c000000,
+ DEFINEDOC_SEC = 0x0d000000,
+ INCLUDE_SEC = 0x0e000000,
+ DEFINE_SEC = 0x0f000000,
+ GROUPDOC_SEC = 0x10000000,
+ USINGDIR_SEC = 0x11000000,
+ MAINPAGEDOC_SEC = 0x12000000,
+ MEMBERGRP_SEC = 0x13000000,
+ USINGDECL_SEC = 0x14000000,
+ PACKAGE_SEC = 0x15000000,
+ PACKAGEDOC_SEC = 0x16000000,
+ OBJCIMPL_SEC = 0x17000000,
+ DIRDOC_SEC = 0x18000000
+ };
+ enum MemberSpecifier
+ {
+ Inline = 0x000001,
+ Explicit = 0x000002,
+ Mutable = 0x000004,
+ Settable = 0x000008,
+ Gettable = 0x000010,
+ Readable = 0x000020,
+ Writable = 0x000040,
+ Final = 0x000080,
+ Abstract = 0x000100,
+ Addable = 0x000200,
+ Removable = 0x000400,
+ Raisable = 0x000800,
+ Override = 0x001000,
+ New = 0x002000,
+ Sealed = 0x004000,
+ Initonly = 0x008000,
+ Optional = 0x010000,
+ Required = 0x020000,
+ NonAtomic = 0x040000,
+ Copy = 0x080000,
+ Retain = 0x100000,
+ Assign = 0x200000
+ };
+ enum ClassSpecifier
+ {
+ Template = 0x0001,
+ Generic = 0x0002,
+ Ref = 0x0004,
+ Value = 0x0008,
+ Interface = 0x0010,
+ Struct = 0x0020,
+ Union = 0x0040,
+ Exception = 0x0080,
+ Protocol = 0x0100,
+ Category = 0x0200,
+ SealedClass = 0x0400,
+ AbstractClass = 0x0800
+ };
+ enum GroupDocType
+ {
+ GROUPDOC_NORMAL, //!< defgroup
+ GROUPDOC_ADD, //!< addgroup
+ GROUPDOC_WEAK //!< weakgroup
+ }; //!< kind of group
+
+ Entry();
+ Entry(const Entry &);
+ ~Entry();
+ int getSize();
+ void addSpecialListItem(const char *listName,int index);
+ void createNavigationIndex(EntryNav *rootNav,FileStorage *storage,FileDef *fd);
+
+ // while parsing a file these function can be used to navigate/build the tree
+ void setParent(Entry *parent) { m_parent = parent; }
+ Entry *parent() const { return m_parent; }
+ const QList<Entry> *children() const { return m_sublist; }
+
+ /*! Adds entry \e as a child to this entry */
+ void addSubEntry (Entry* e) ;
+ /*! Restore the state of this Entry to the default value it has
+ * at construction time.
+ */
+ void reset();
+ void marshall(StorageIntf *);
+ void unmarshall(StorageIntf *);
+
+ public:
+
+ // identification
+ int section; //!< entry type (see Sections);
+ QCString type; //!< member type
+ QCString name; //!< member name
+ TagInfo *tagInfo; //!< tag file info
+
+ // content
+ Protection protection; //!< class protection
+ MethodTypes mtype; //!< signal, slot, (dcop) method, or property?
+ int spec; //!< class/member specifiers
+ int initLines; //!< define/variable initializer lines to show
+ bool stat; //!< static ?
+ bool explicitExternal; //!< explicitly defined as external?
+ bool proto; //!< prototype ?
+ bool subGrouping; //!< automatically group class members?
+ bool callGraph; //!< do we need to draw the call graph?
+ bool callerGraph; //!< do we need to draw the caller graph?
+ Specifier virt; //!< virtualness of the entry
+ QCString args; //!< member argument string
+ QCString bitfields; //!< member's bit fields
+ ArgumentList *argList; //!< member arguments as a list
+ QList<ArgumentList> *tArgLists; //!< template argument declarations
+ QGString program; //!< the program text
+ QGString initializer; //!< initial value (for variables)
+ QCString includeFile; //!< include file (2 arg of \\class, must be unique)
+ QCString includeName; //!< include name (3 arg of \\class)
+ QCString doc; //!< documentation block (partly parsed)
+ int docLine; //!< line number at which the documentation was found
+ QCString docFile; //!< file in which the documentation was found
+ QCString brief; //!< brief description (doc block)
+ int briefLine; //!< line number at which the brief desc. was found
+ QCString briefFile; //!< file in which the brief desc. was found
+ QCString inbodyDocs; //!< documentation inside the body of a function
+ int inbodyLine; //!< line number at which the body doc was found
+ QCString inbodyFile; //!< file in which the body doc was found
+ QCString relates; //!< related class (doc block)
+ RelatesType relatesType; //!< how relates is handled
+ QCString read; //!< property read accessor
+ QCString write; //!< property write accessor
+ QCString inside; //!< name of the class in which documents are found
+ QCString exception; //!< throw specification
+ ArgumentList *typeConstr; //!< where clause (C#) for type constraints
+ int bodyLine; //!< line number of the definition in the source
+ int endBodyLine; //!< line number where the definition ends
+ int mGrpId; //!< member group id
+ QList<BaseInfo> *extends; //!< list of base classes
+ QList<Grouping> *groups; //!< list of groups this entry belongs to
+ QList<SectionInfo> *anchors; //!< list of anchors defined in this entry
+ QCString fileName; //!< file this entry was extracted from
+ int startLine; //!< start line of entry in the source
+ QList<ListItemInfo> *sli; //!< special lists (test/todo/bug/deprecated/..) this entry is in
+ SrcLangExt lang; //!< programming language in which this entry was found
+ bool hidden; //!< does this represent an entity that is hidden from the output
+ bool artificial; //!< Artificially introduced item
+ GroupDocType groupDocType;
+
+ static int num; //!< counts the total number of entries
+
+ /// return the command name used to define GROUPDOC_SEC
+ const char *groupDocCmd() const
+ {
+ switch( groupDocType )
+ {
+ case GROUPDOC_NORMAL: return "\\defgroup";
+ case GROUPDOC_ADD: return "\\addgroup";
+ case GROUPDOC_WEAK: return "\\weakgroup";
+ default: return "unknown group command";
+ }
+ }
+ Grouping::GroupPri_t groupingPri() const
+ {
+ if( section != GROUPDOC_SEC )
+ {
+ return Grouping::GROUPING_LOWEST;
+ }
+ switch( groupDocType )
+ {
+ case GROUPDOC_NORMAL: return Grouping::GROUPING_AUTO_DEF;
+ case GROUPDOC_ADD: return Grouping::GROUPING_AUTO_ADD;
+ case GROUPDOC_WEAK: return Grouping::GROUPING_AUTO_WEAK;
+ default: return Grouping::GROUPING_LOWEST;
+ }
+ }
+
+ private:
+ void createSubtreeIndex(EntryNav *nav,FileStorage *storage,FileDef *fd);
+ Entry *m_parent; //!< parent node in the tree
+ QList<Entry> *m_sublist; //!< entries that are children of this one
+ Entry &operator=(const Entry &);
+};
+
+class EntryNav
+{
+ public:
+ EntryNav(EntryNav *parent,Entry *e);
+ ~EntryNav();
+ void addChild(EntryNav *);
+ bool loadEntry(FileStorage *storage);
+ bool saveEntry(Entry *e,FileStorage *storage);
+ void setEntry(Entry *e);
+ void releaseEntry();
+ void changeSection(int section) { m_section = section; }
+ void setFileDef(FileDef *fd) { m_fileDef = fd; }
+
+ Entry *entry() const { return m_info; }
+ int section() const { return m_section; }
+ SrcLangExt lang() const { return m_lang; }
+ const QCString &type() const { return m_type; }
+ const QCString &name() const { return m_name; }
+ TagInfo *tagInfo() const { return m_tagInfo; }
+ const QList<EntryNav> *children() const { return m_subList; }
+ EntryNav *parent() const { return m_parent; }
+ FileDef *fileDef() const { return m_fileDef; }
+
+ private:
+
+ // navigation
+ EntryNav *m_parent; //!< parent node in the tree
+ QList<EntryNav> *m_subList; //!< entries that are children of this one
+
+ // identification
+ int m_section; //!< entry type (see Sections);
+ QCString m_type; //!< member type
+ QCString m_name; //!< member name
+ TagInfo *m_tagInfo; //!< tag file info
+ FileDef *m_fileDef;
+ SrcLangExt m_lang; //!< programming language in which this entry was found
+
+ Entry *m_info;
+ int64 m_offset;
+ bool m_noLoad;
+};
+
+
+typedef QList<Entry> EntryList;
+typedef QListIterator<Entry> EntryListIterator;
+
+typedef QList<EntryNav> EntryNavList;
+typedef QListIterator<EntryNav> EntryNavListIterator;
+
+#endif
diff --git a/src/example.h b/src/example.h
new file mode 100644
index 0000000..b73074d
--- /dev/null
+++ b/src/example.h
@@ -0,0 +1,45 @@
+/******************************************************************************
+ *
+ * $Id: example.h,v 1.10 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef EXAMPLE_H
+#define EXAMPLE_H
+
+#include "qtbc.h"
+#include <qdict.h>
+
+class ClassDef;
+class MemberName;
+
+struct Example
+{
+ QCString anchor;
+ QCString name;
+ QCString file;
+};
+
+class ExampleSDict : public SDict<Example>
+{
+ public:
+ ExampleSDict(int size=17) : SDict<Example>(size) {}
+ ~ExampleSDict() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ return stricmp(((Example *)item1)->name,((Example *)item2)->name);
+ }
+};
+
+#endif
diff --git a/src/filedef.cpp b/src/filedef.cpp
new file mode 100644
index 0000000..e7f257a
--- /dev/null
+++ b/src/filedef.cpp
@@ -0,0 +1,1656 @@
+/******************************************************************************
+ *
+ * $Id: filedef.cpp,v 1.55 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include "memberlist.h"
+#include "classlist.h"
+#include "filedef.h"
+#include "doxygen.h"
+#include "memberdef.h"
+#include "classdef.h"
+#include "namespacedef.h"
+#include "util.h"
+#include "language.h"
+#include "outputlist.h"
+#include "dot.h"
+#include "message.h"
+#include "docparser.h"
+#include "searchindex.h"
+#include "htags.h"
+#include "parserintf.h"
+#include "portable.h"
+#include "vhdldocgen.h"
+#include "debug.h"
+#include "layout.h"
+
+//---------------------------------------------------------------------------
+
+class DevNullCodeDocInterface : public CodeOutputInterface
+{
+ public:
+ virtual void codify(const char *) {}
+ virtual void writeCodeLink(const char *,const char *,
+ const char *,const char *,
+ const char *) {}
+ virtual void writeLineNumber(const char *,const char *,
+ const char *,int) {}
+ virtual void startCodeLine() {}
+ virtual void endCodeLine() {}
+ virtual void startCodeAnchor(const char *) {}
+ virtual void endCodeAnchor() {}
+ virtual void startFontClass(const char *) {}
+ virtual void endFontClass() {}
+ virtual void writeCodeAnchor(const char *) {}
+ virtual void linkableSymbol(int, const char *,Definition *,Definition *) {}
+};
+
+//---------------------------------------------------------------------------
+
+/*! create a new file definition, where \a p is the file path,
+ \a nm the file name, and \a lref is an HTML anchor name if the
+ file was read from a tag file or 0 otherwise
+*/
+FileDef::FileDef(const char *p,const char *nm,
+ const char *lref,const char *dn)
+ : Definition((QCString)p+nm,1,nm)
+{
+ path=p;
+ filepath=path+nm;
+ filename=nm;
+ diskname=dn;
+ if (diskname.isEmpty()) diskname=nm;
+ setReference(lref);
+ classSDict = 0;
+ includeList = 0;
+ includeDict = 0;
+ includedByList = 0;
+ includedByDict = 0;
+ namespaceSDict = 0;
+ srcDefDict = 0;
+ srcMemberDict = 0;
+ usingDirList = 0;
+ usingDeclList = 0;
+ package = 0;
+ isSource = FALSE;
+ docname = nm;
+ dir = 0;
+ if (Config_getBool("FULL_PATH_NAMES"))
+ {
+ docname.prepend(stripFromPath(path.copy()));
+ }
+ SrcLangExt lang = getLanguageFromFileName(name());
+ m_isJava = lang==SrcLangExt_Java;
+ m_isCSharp = lang==SrcLangExt_CSharp;
+ memberGroupSDict = 0;
+ acquireFileVersion();
+ m_subGrouping=Config_getBool("SUBGROUPING");
+}
+
+/*! destroy the file definition */
+FileDef::~FileDef()
+{
+ delete classSDict;
+ delete includeDict;
+ delete includeList;
+ delete includedByDict;
+ delete includedByList;
+ delete namespaceSDict;
+ delete srcDefDict;
+ delete srcMemberDict;
+ delete usingDirList;
+ delete usingDeclList;
+ delete memberGroupSDict;
+}
+
+/*! Compute the HTML anchor names for all members in the class */
+void FileDef::computeAnchors()
+{
+ MemberList *ml = getMemberList(MemberList::allMembersList);
+ if (ml) setAnchors(0,'a',ml);
+}
+
+void FileDef::distributeMemberGroupDocumentation()
+{
+ //printf("FileDef::distributeMemberGroupDocumentation()\n");
+ if (memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->distributeMemberGroupDocumentation();
+ }
+ }
+}
+
+void FileDef::findSectionsInDocumentation()
+{
+ docFindSections(documentation(),this,0,docFile());
+ if (memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->findSectionsInDocumentation();
+ }
+ }
+
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::declarationLists)
+ {
+ ml->findSectionsInDocumentation();
+ }
+ }
+}
+
+void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
+{
+ if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
+ !documentation().isEmpty() ||
+ (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef())
+ )
+ {
+ ol.writeRuler();
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeAnchor(0,"details");
+ ol.popGeneratorState();
+ ol.startGroupHeader();
+ ol.parseText(title);
+ ol.endGroupHeader();
+
+ ol.startTextBlock();
+ if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
+ {
+ ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ }
+ if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
+ !documentation().isEmpty())
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::RTF);
+ // ol.newParagraph(); // FIXME:PARA
+ ol.enableAll();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.writeString("\n\n");
+ ol.popGeneratorState();
+ }
+ if (!documentation().isEmpty())
+ {
+ ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ }
+ //printf("Writing source ref for file %s\n",name().data());
+ if (Config_getBool("SOURCE_BROWSER"))
+ {
+ ol.startParagraph();
+ QCString refText = theTranslator->trDefinedInSourceFile();
+ int fileMarkerPos = refText.find("@0");
+ if (fileMarkerPos!=-1) // should always pass this.
+ {
+ ol.parseText(refText.left(fileMarkerPos)); //text left from marker 1
+ ol.writeObjectLink(0,getSourceFileBase(),
+ 0,name());
+ ol.parseText(refText.right(
+ refText.length()-fileMarkerPos-2)); // text right from marker 2
+ }
+ ol.endParagraph();
+ }
+ ol.endTextBlock();
+ }
+}
+
+void FileDef::writeBriefDescription(OutputList &ol)
+{
+ if (!briefDescription().isEmpty())
+ {
+ ol.startParagraph();
+ ol.parseDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.writeString(" \n");
+ ol.enable(OutputGenerator::RTF);
+
+ if (Config_getBool("REPEAT_BRIEF") ||
+ !documentation().isEmpty()
+ )
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startTextLink(0,"details");
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ }
+ ol.popGeneratorState();
+ ol.endParagraph();
+
+ //ol.pushGeneratorState();
+ //ol.disable(OutputGenerator::RTF);
+ //ol.newParagraph();
+ //ol.popGeneratorState();
+ }
+ ol.writeSynopsis();
+}
+
+void FileDef::writeIncludeFiles(OutputList &ol)
+{
+ if (/*Config_getBool("SHOW_INCLUDE_FILES") &&*/ includeList &&
+ includeList->count()>0)
+ {
+ ol.startTextBlock(TRUE);
+ QListIterator<IncludeInfo> ili(*includeList);
+ IncludeInfo *ii;
+ for (;(ii=ili.current());++ili)
+ {
+ FileDef *fd=ii->fileDef;
+ bool isIDLorJava = FALSE;
+ if (fd)
+ {
+ SrcLangExt lang = getLanguageFromFileName(fd->name());
+ isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java;
+ }
+ ol.startTypewriter();
+ if (isIDLorJava) // IDL/Java include
+ {
+ ol.docify("import ");
+ }
+ else if (ii->imported) // Objective-C include
+ {
+ ol.docify("#import ");
+ }
+ else // C/C++ include
+ {
+ ol.docify("#include ");
+ }
+ if (ii->local || isIDLorJava)
+ ol.docify("\"");
+ else
+ ol.docify("<");
+ ol.disable(OutputGenerator::Html);
+ ol.docify(ii->includeName);
+ ol.enableAll();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ // Here we use the include file name as it appears in the file.
+ // we could also we the name as it is used within doxygen,
+ // then we should have used fd->docName() instead of ii->includeName
+ if (fd && fd->isLinkable())
+ {
+ ol.writeObjectLink(fd->getReference(),
+ fd->generateSourceFile() ? fd->includeName() : fd->getOutputFileBase(),
+ 0,ii->includeName);
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !fd->isReference())
+ {
+ const char *locStr = (ii->local || isIDLorJava) ? "yes" : "no";
+ const char *impStr = (ii->imported || isIDLorJava) ? "yes" : "no";
+ Doxygen::tagFile << " <includes id=\""
+ << convertToXML(fd->getOutputFileBase()) << "\" "
+ << "name=\"" << convertToXML(fd->name()) << "\" "
+ << "local=\"" << locStr << "\" "
+ << "imported=\"" << impStr << "\">"
+ << convertToXML(ii->includeName)
+ << "</includes>"
+ << endl;
+ }
+ }
+ else
+ {
+ ol.docify(ii->includeName);
+ }
+
+ ol.enableAll();
+ if (ii->local || isIDLorJava)
+ ol.docify("\"");
+ else
+ ol.docify(">");
+ if (isIDLorJava)
+ ol.docify(";");
+ ol.endTypewriter();
+ ol.lineBreak();
+ }
+ ol.endTextBlock();
+ }
+}
+
+void FileDef::writeIncludeGraph(OutputList &ol)
+{
+ if (Config_getBool("HAVE_DOT") /*&& Config_getBool("INCLUDE_GRAPH")*/)
+ {
+ //printf("Graph for file %s\n",name().data());
+ DotInclDepGraph incDepGraph(this,FALSE);
+ if (!incDepGraph.isTrivial() && !incDepGraph.isTooBig())
+ {
+ ol.startTextBlock();
+ ol.disable(OutputGenerator::Man);
+ ol.startInclDepGraph();
+ ol.parseText(theTranslator->trInclDepGraph(name()));
+ ol.endInclDepGraph(incDepGraph);
+ ol.enableAll();
+ ol.endTextBlock(TRUE);
+ }
+ //incDepGraph.writeGraph(Config_getString("HTML_OUTPUT"),fd->getOutputFileBase());
+ }
+}
+
+void FileDef::writeIncludedByGraph(OutputList &ol)
+{
+ if (Config_getBool("HAVE_DOT") /*&& Config_getBool("INCLUDED_BY_GRAPH")*/)
+ {
+ //printf("Graph for file %s\n",name().data());
+ DotInclDepGraph incDepGraph(this,TRUE);
+ if (!incDepGraph.isTrivial() && !incDepGraph.isTooBig())
+ {
+ ol.startTextBlock();
+ ol.disable(OutputGenerator::Man);
+ ol.startInclDepGraph();
+ ol.parseText(theTranslator->trInclByDepGraph());
+ ol.endInclDepGraph(incDepGraph);
+ ol.enableAll();
+ ol.endTextBlock(TRUE);
+ }
+ //incDepGraph.writeGraph(Config_getString("HTML_OUTPUT"),fd->getOutputFileBase());
+ }
+}
+
+
+void FileDef::writeSourceLink(OutputList &ol)
+{
+ //printf("%s: generateSourceFile()=%d\n",name().data(),generateSourceFile());
+ if (generateSourceFile())
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startParagraph();
+ ol.startTextLink(includeName(),0);
+ ol.parseText(theTranslator->trGotoSourceCode());
+ ol.endTextLink();
+ ol.endParagraph();
+ ol.enableAll();
+ }
+}
+
+void FileDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
+{
+ // write list of namespaces
+ if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title);
+}
+
+void FileDef::writeClassDeclarations(OutputList &ol,const QCString &title)
+{
+ // write list of classes
+ if (classSDict) classSDict->writeDeclaration(ol,0,title,FALSE);
+}
+
+void FileDef::startMemberDeclarations(OutputList &ol)
+{
+ ol.startMemberSections();
+}
+
+void FileDef::endMemberDeclarations(OutputList &ol)
+{
+ ol.endMemberSections();
+}
+
+void FileDef::startMemberDocumentation(OutputList &ol)
+{
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ ol.disable(OutputGenerator::Html);
+ Doxygen::suppressDocWarnings = TRUE;
+ }
+}
+
+void FileDef::endMemberDocumentation(OutputList &ol)
+{
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ ol.enable(OutputGenerator::Html);
+ Doxygen::suppressDocWarnings = FALSE;
+ }
+}
+
+void FileDef::writeMemberGroups(OutputList &ol)
+{
+ /* write user defined member groups */
+ if (memberGroupSDict)
+ {
+ memberGroupSDict->sort();
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ if ((!mg->allMembersInSameSection() || !m_subGrouping)
+ && mg->header()!="[NOHEADER]")
+ {
+ mg->writeDeclarations(ol,0,0,this,0);
+ }
+ }
+ }
+}
+
+void FileDef::writeAuthorSection(OutputList &ol)
+{
+ // write Author section (Man only)
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.startGroupHeader();
+ ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
+ ol.endGroupHeader();
+ ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
+ ol.popGeneratorState();
+}
+
+void FileDef::writeSummaryLinks(OutputList &ol)
+{
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::File));
+ LayoutDocEntry *lde;
+ bool first=TRUE;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ if ((lde->kind()==LayoutDocEntry::FileClasses && classSDict && classSDict->declVisible()) ||
+ (lde->kind()==LayoutDocEntry::FileNamespaces && namespaceSDict && namespaceSDict->declVisible())
+ )
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = lde->kind()==LayoutDocEntry::FileClasses ? "nested-classes" : "namespaces";
+ writeSummaryLink(ol,label,ls->title,first);
+ }
+ else if (lde->kind()==LayoutDocEntry::MemberDecl)
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ MemberList * ml = getMemberList(lmd->type);
+ if (ml && ml->declVisible())
+ {
+ writeSummaryLink(ol,ml->listTypeAsString(),lmd->title,first);
+ }
+ }
+ }
+ if (!first)
+ {
+ ol.writeString(" </div>\n");
+ }
+ ol.popGeneratorState();
+}
+
+/*! Write the documentation page for this file to the file of output
+ generators \a ol.
+*/
+void FileDef::writeDocumentation(OutputList &ol)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ //funcList->countDecMembers();
+
+ //QCString fn = name();
+ //if (Config_getBool("FULL_PATH_NAMES"))
+ //{
+ // fn.prepend(stripFromPath(getPath().copy()));
+ //}
+
+ //printf("WriteDocumentation diskname=%s\n",diskname.data());
+
+ QCString versionTitle;
+ if (!fileVersion.isEmpty())
+ {
+ versionTitle=("("+fileVersion+")");
+ }
+ QCString title = docname+versionTitle;
+ QCString pageTitle=theTranslator->trFileReference(docname);
+
+ if (Config_getBool("SHOW_DIRECTORIES") && getDirDef())
+ {
+ startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_FileVisible,!generateTreeView);
+ if (!generateTreeView)
+ {
+ getDirDef()->writeNavigationPath(ol);
+ ol.endQuickIndices();
+ }
+ QCString pageTitleShort=theTranslator->trFileReference(name());
+ startTitle(ol,getOutputFileBase(),this);
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.parseText(pageTitleShort); // Html only
+ ol.enableAll();
+ ol.disable(OutputGenerator::Html);
+ ol.parseText(pageTitle); // other output formats
+ ol.popGeneratorState();
+ addGroupListToTitle(ol,this);
+ endTitle(ol,getOutputFileBase(),title);
+ }
+ else
+ {
+ startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_FileVisible,!generateTreeView);
+ if (!generateTreeView)
+ {
+ ol.endQuickIndices();
+ }
+ startTitle(ol,getOutputFileBase(),this);
+ ol.parseText(pageTitle);
+ addGroupListToTitle(ol,this);
+ endTitle(ol,getOutputFileBase(),title);
+ }
+
+ ol.startContents();
+
+ if (!fileVersion.isEmpty())
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startProjectNumber();
+ ol.docify(versionTitle);
+ ol.endProjectNumber();
+ ol.enableAll();
+ }
+
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());
+ Doxygen::searchIndex->addWord(localName(),TRUE);
+ }
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <compound kind=\"file\">" << endl;
+ Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
+ Doxygen::tagFile << " <path>" << convertToXML(getPath()) << "</path>" << endl;
+ Doxygen::tagFile << " <filename>"
+ << convertToXML(getOutputFileBase())
+ << "</filename>" << endl;
+ }
+
+ //---------------------------------------- start flexible part -------------------------------
+
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::File));
+ LayoutDocEntry *lde;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ switch (lde->kind())
+ {
+ case LayoutDocEntry::BriefDesc:
+ writeBriefDescription(ol);
+ break;
+ case LayoutDocEntry::MemberDeclStart:
+ startMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::FileIncludes:
+ writeIncludeFiles(ol);
+ break;
+ case LayoutDocEntry::FileIncludeGraph:
+ writeIncludeGraph(ol);
+ break;
+ case LayoutDocEntry::FileIncludedByGraph:
+ writeIncludedByGraph(ol);
+ break;
+ case LayoutDocEntry::FileSourceLink:
+ writeSourceLink(ol);
+ break;
+ case LayoutDocEntry::FileClasses:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeClassDeclarations(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::FileNamespaces:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeNamespaceDeclarations(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::MemberGroups:
+ writeMemberGroups(ol);
+ break;
+ case LayoutDocEntry::MemberDecl:
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ writeMemberDeclarations(ol,lmd->type,lmd->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
+ endMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::DetailedDesc:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeDetailedDescription(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDefStart:
+ startMemberDocumentation(ol);
+ break;
+ case LayoutDocEntry::MemberDef:
+ {
+ LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+ writeMemberDocumentation(ol,lmd->type,lmd->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDefEnd:
+ endMemberDocumentation(ol);
+ break;
+ case LayoutDocEntry::AuthorSection:
+ writeAuthorSection(ol);
+ break;
+ case LayoutDocEntry::ClassIncludes:
+ case LayoutDocEntry::ClassInheritanceGraph:
+ case LayoutDocEntry::ClassNestedClasses:
+ case LayoutDocEntry::ClassCollaborationGraph:
+ case LayoutDocEntry::ClassAllMembersLink:
+ case LayoutDocEntry::ClassUsedFiles:
+ case LayoutDocEntry::NamespaceNestedNamespaces:
+ case LayoutDocEntry::NamespaceClasses:
+ case LayoutDocEntry::GroupClasses:
+ case LayoutDocEntry::GroupInlineClasses:
+ case LayoutDocEntry::GroupNamespaces:
+ case LayoutDocEntry::GroupDirs:
+ case LayoutDocEntry::GroupNestedGroups:
+ case LayoutDocEntry::GroupFiles:
+ case LayoutDocEntry::GroupGraph:
+ case LayoutDocEntry::GroupPageDocs:
+ case LayoutDocEntry::DirSubDirs:
+ case LayoutDocEntry::DirFiles:
+ case LayoutDocEntry::DirGraph:
+ err("Internal inconsistency: member %d should not be part of "
+ "LayoutDocManager::File entry list\n",lde->kind());
+ break;
+ }
+ }
+
+ //---------------------------------------- end flexible part -------------------------------
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ writeDocAnchorsToTagFile();
+ Doxygen::tagFile << " </compound>" << endl;
+ }
+
+ ol.endContents();
+
+ if (generateTreeView)
+ {
+ writeNavigationPath(ol);
+ }
+
+ endFile(ol,TRUE);
+
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ MemberList *ml = getMemberList(MemberList::allMembersList);
+ if (ml) ml->sort();
+ writeMemberPages(ol);
+ }
+}
+
+void FileDef::writeMemberPages(OutputList &ol)
+{
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::documentationLists)
+ {
+ ml->writeDocumentationPage(ol,name(),this);
+ }
+ }
+
+ ol.popGeneratorState();
+}
+
+void FileDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
+{
+ static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
+
+ ol.writeString(" <div class=\"navtab\">\n");
+ ol.writeString(" <table>\n");
+
+ MemberList *allMemberList = getMemberList(MemberList::allMembersList);
+ if (allMemberList)
+ {
+ MemberListIterator mli(*allMemberList);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ if (md->getFileDef()==this && md->getNamespaceDef()==0 && md->isLinkable())
+ {
+ ol.writeString(" <tr><td class=\"navtab\">");
+ if (md->isLinkableInProject())
+ {
+ if (md==currentMd) // selected item => highlight
+ {
+ ol.writeString("<a class=\"qindexHL\" ");
+ }
+ else
+ {
+ ol.writeString("<a class=\"qindex\" ");
+ }
+ ol.writeString("href=\"");
+ if (createSubDirs) ol.writeString("../../");
+ ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
+ ol.writeString("\">");
+ ol.writeString(md->localName());
+ ol.writeString("</a>");
+ }
+ ol.writeString("</td></tr>\n");
+ }
+ }
+ }
+
+ ol.writeString(" </table>\n");
+ ol.writeString(" </div>\n");
+}
+
+/*! Write a source listing of this file to the output */
+void FileDef::writeSource(OutputList &ol)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
+ static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
+ QCString title = docname;
+ if (!fileVersion.isEmpty())
+ {
+ title+=(" ("+fileVersion+")");
+ }
+ QCString pageTitle = theTranslator->trSourceFile(title);
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::RTF);
+ if (!latexSourceCode) ol.disable(OutputGenerator::Latex);
+
+ if (Config_getBool("SHOW_DIRECTORIES") && getDirDef())
+ {
+ startFile(ol,getSourceFileBase(),0,pageTitle,HLI_FileVisible,
+ !generateTreeView,getOutputFileBase());
+ if (!generateTreeView)
+ {
+ getDirDef()->writeNavigationPath(ol);
+ ol.endQuickIndices();
+ }
+ startTitle(ol,getOutputFileBase());
+ ol.parseText(name());
+ endTitle(ol,getOutputFileBase(),title);
+ }
+ else
+ {
+ startFile(ol,getSourceFileBase(),0,pageTitle,HLI_FileVisible,
+ !generateTreeView,getOutputFileBase());
+ startTitle(ol,getSourceFileBase());
+ ol.parseText(title);
+ endTitle(ol,getSourceFileBase(),0);
+ }
+
+ ol.startContents();
+
+ if (isLinkable())
+ {
+ if (latexSourceCode) ol.disable(OutputGenerator::Latex);
+ ol.startTextLink(getOutputFileBase(),0);
+ ol.parseText(theTranslator->trGotoDocumentation());
+ ol.endTextLink();
+ if (latexSourceCode) ol.enable(OutputGenerator::Latex);
+ }
+
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
+ pIntf->resetCodeParserState();
+ ol.startCodeFragment();
+ pIntf->parseCode(ol,0,
+ fileToString(absFilePath(),filterSourceFiles,TRUE),
+ FALSE,0,this
+ );
+ ol.endCodeFragment();
+ ol.endContents();
+ if (generateTreeView)
+ {
+ writeNavigationPath(ol);
+ endFile(ol,TRUE);
+ }
+ else
+ {
+ endFile(ol);
+ }
+ ol.enableAll();
+}
+
+void FileDef::parseSource()
+{
+ static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
+ DevNullCodeDocInterface devNullIntf;
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
+ pIntf->resetCodeParserState();
+ pIntf->parseCode(
+ devNullIntf,0,
+ fileToString(absFilePath(),filterSourceFiles,TRUE),
+ FALSE,0,this
+ );
+}
+
+void FileDef::addMembersToMemberGroup()
+{
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::declarationLists)
+ {
+ ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
+ }
+ }
+
+ // add members inside sections to their groups
+ if (memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ if (mg->allMembersInSameSection() && m_subGrouping)
+ {
+ //printf("----> addToDeclarationSection(%s)\n",mg->header().data());
+ mg->addToDeclarationSection();
+ }
+ }
+ }
+}
+
+/*! Adds member definition \a md to the list of all members of this file */
+void FileDef::insertMember(MemberDef *md)
+{
+ if (md->isHidden()) return;
+ //printf("%s:FileDef::insertMember(%s (=%p) list has %d elements)\n",
+ // name().data(),md->name().data(),md,allMemberList.count());
+ MemberList *allMemberList = getMemberList(MemberList::allMembersList);
+ if (allMemberList && allMemberList->findRef(md)!=-1) // TODO optimize the findRef!
+ {
+ return;
+ }
+
+ if (allMemberList==0)
+ {
+ allMemberList = new MemberList(MemberList::allMembersList);;
+ m_memberLists.append(allMemberList);
+ }
+ allMemberList->append(md);
+ //::addFileMemberNameToIndex(md);
+ switch (md->memberType())
+ {
+ case MemberDef::Variable:
+ case MemberDef::Property:
+ addMemberToList(MemberList::decVarMembers,md);
+ addMemberToList(MemberList::docVarMembers,md);
+ break;
+ case MemberDef::Function:
+ addMemberToList(MemberList::decFuncMembers,md);
+ addMemberToList(MemberList::docFuncMembers,md);
+ break;
+ case MemberDef::Typedef:
+ addMemberToList(MemberList::decTypedefMembers,md);
+ addMemberToList(MemberList::docTypedefMembers,md);
+ break;
+ case MemberDef::Enumeration:
+ addMemberToList(MemberList::decEnumMembers,md);
+ addMemberToList(MemberList::docEnumMembers,md);
+ break;
+ case MemberDef::EnumValue: // enum values are shown inside their enums
+ break;
+ case MemberDef::Define:
+ addMemberToList(MemberList::decDefineMembers,md);
+ addMemberToList(MemberList::docDefineMembers,md);
+ break;
+ default:
+ err("FileDef::insertMembers(): "
+ "member `%s' with class scope `%s' inserted in file scope `%s'!\n",
+ md->name().data(),
+ md->getClassDef() ? md->getClassDef()->name().data() : "<global>",
+ name().data());
+ }
+ //addMemberToGroup(md,groupId);
+}
+
+/*! Adds compound definition \a cd to the list of all compounds of this file */
+void FileDef::insertClass(ClassDef *cd)
+{
+ if (cd->isHidden()) return;
+ if (classSDict==0)
+ {
+ classSDict = new ClassSDict(17);
+ }
+ if (Config_getBool("SORT_BRIEF_DOCS"))
+ classSDict->inSort(cd->name(),cd);
+ else
+ classSDict->append(cd->name(),cd);
+}
+
+/*! Adds namespace definition \a nd to the list of all compounds of this file */
+void FileDef::insertNamespace(NamespaceDef *nd)
+{
+ if (nd->isHidden()) return;
+ if (!nd->name().isEmpty() &&
+ (namespaceSDict==0 || namespaceSDict->find(nd->name())==0))
+ {
+ if (namespaceSDict==0)
+ {
+ namespaceSDict = new NamespaceSDict;
+ }
+ if (Config_getBool("SORT_BRIEF_DOCS"))
+ namespaceSDict->inSort(nd->name(),nd);
+ else
+ namespaceSDict->append(nd->name(),nd);
+ }
+}
+
+void FileDef::addSourceRef(int line,Definition *d,MemberDef *md)
+{
+ //printf("FileDef::addSourceDef(%d,%p,%p)\n",line,d,md);
+ if (d)
+ {
+ if (srcDefDict==0) srcDefDict = new QIntDict<Definition>(257);
+ if (srcMemberDict==0) srcMemberDict = new QIntDict<MemberDef>(257);
+ srcDefDict->insert(line,d);
+ if (md) srcMemberDict->insert(line,md);
+ //printf("Adding member %s with anchor %s at line %d to file %s\n",
+ // md->name().data(),md->anchor().data(),line,name().data());
+ }
+}
+
+Definition *FileDef::getSourceDefinition(int lineNr)
+{
+ Definition *result=0;
+ if (srcDefDict)
+ {
+ result = srcDefDict->find(lineNr);
+ }
+ return result;
+}
+
+MemberDef *FileDef::getSourceMember(int lineNr)
+{
+ MemberDef *result=0;
+ if (srcMemberDict)
+ {
+ result = srcMemberDict->find(lineNr);
+ }
+ return result;
+}
+
+
+void FileDef::addUsingDirective(NamespaceDef *nd)
+{
+ if (usingDirList==0)
+ {
+ usingDirList = new NamespaceSDict;
+ }
+ if (usingDirList->find(nd->qualifiedName())==0)
+ {
+ usingDirList->append(nd->qualifiedName(),nd);
+ }
+ //printf("%p: FileDef::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count());
+}
+
+NamespaceSDict *FileDef::getUsedNamespaces() const
+{
+ //printf("%p: FileDef::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0);
+ return usingDirList;
+}
+
+void FileDef::addUsingDeclaration(Definition *d)
+{
+ if (usingDeclList==0)
+ {
+ usingDeclList = new SDict<Definition>(17);
+ }
+ if (usingDeclList->find(d->qualifiedName())==0)
+ {
+ usingDeclList->append(d->qualifiedName(),d);
+ }
+}
+
+void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local,
+ bool imported)
+{
+ //printf("FileDef::addIncludeDependency(%p,%s,%d)\n",fd,incName,local);
+ QCString iName = fd ? fd->absFilePath().data() : incName;
+ if (!iName.isEmpty() && (!includeDict || includeDict->find(iName)==0))
+ {
+ if (includeDict==0)
+ {
+ includeDict = new QDict<IncludeInfo>(61);
+ includeList = new QList<IncludeInfo>;
+ includeList->setAutoDelete(TRUE);
+ }
+ IncludeInfo *ii = new IncludeInfo;
+ ii->fileDef = fd;
+ ii->includeName = incName;
+ ii->local = local;
+ ii->imported = imported;
+ includeList->append(ii);
+ includeDict->insert(iName,ii);
+ }
+}
+
+void FileDef::addIncludedUsingDirectives()
+{
+ if (visited) return;
+ visited=TRUE;
+ //printf("( FileDef::addIncludedUsingDirectives for file %s\n",name().data());
+
+ NamespaceList nl;
+ if (includeList) // file contains #includes
+ {
+ {
+ QListIterator<IncludeInfo> iii(*includeList);
+ IncludeInfo *ii;
+ for (iii.toFirst();(ii=iii.current());++iii) // foreach #include...
+ {
+ if (ii->fileDef && !ii->fileDef->visited) // ...that is a known file
+ {
+ // recurse into this file
+ ii->fileDef->addIncludedUsingDirectives();
+ }
+ }
+ }
+ {
+ QListIterator<IncludeInfo> iii(*includeList);
+ IncludeInfo *ii;
+ // iterate through list from last to first
+ for (iii.toLast();(ii=iii.current());--iii)
+ {
+ if (ii->fileDef && ii->fileDef!=this)
+ {
+ // add using directives
+ NamespaceSDict *unl = ii->fileDef->usingDirList;
+ if (unl)
+ {
+ NamespaceSDict::Iterator nli(*unl);
+ NamespaceDef *nd;
+ for (nli.toLast();(nd=nli.current());--nli)
+ {
+ // append each using directive found in a #include file
+ if (usingDirList==0) usingDirList = new NamespaceSDict;
+ //printf("Prepending used namespace %s to the list of file %s\n",
+ // nd->name().data(),name().data());
+ if (usingDirList->find(nd->qualifiedName())==0) // not yet added
+ {
+ usingDirList->prepend(nd->qualifiedName(),nd);
+ }
+ }
+ }
+ // add using declarations
+ SDict<Definition> *udl = ii->fileDef->usingDeclList;
+ if (udl)
+ {
+ SDict<Definition>::Iterator udi(*udl);
+ Definition *d;
+ for (udi.toLast();(d=udi.current());--udi)
+ {
+ //printf("Adding using declaration %s\n",d->name().data());
+ if (usingDeclList==0)
+ {
+ usingDeclList = new SDict<Definition>(17);
+ }
+ if (usingDeclList->find(d->qualifiedName())==0)
+ {
+ usingDeclList->prepend(d->qualifiedName(),d);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ //printf(") end FileDef::addIncludedUsingDirectives for file %s\n",name().data());
+}
+
+
+void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,
+ bool local,bool imported)
+{
+ //printf("FileDef::addIncludedByDependency(%p,%s,%d)\n",fd,incName,local);
+ QCString iName = fd ? fd->absFilePath().data() : incName;
+ if (!iName.isEmpty() && (includedByDict==0 || includedByDict->find(iName)==0))
+ {
+ if (includedByDict==0)
+ {
+ includedByDict = new QDict<IncludeInfo>(61);
+ includedByList = new QList<IncludeInfo>;
+ includedByList->setAutoDelete(TRUE);
+ }
+ IncludeInfo *ii = new IncludeInfo;
+ ii->fileDef = fd;
+ ii->includeName = incName;
+ ii->local = local;
+ ii->imported = imported;
+ includedByList->append(ii);
+ includedByDict->insert(iName,ii);
+ }
+}
+
+bool FileDef::isIncluded(const QCString &name) const
+{
+ if (name.isEmpty()) return FALSE;
+ return includeDict!=0 && includeDict->find(name)!=0;
+}
+
+bool FileDef::generateSourceFile() const
+{
+ QCString extension = name().right(4);
+ return !isReference() &&
+ (Config_getBool("SOURCE_BROWSER") ||
+ (Config_getBool("VERBATIM_HEADERS") && guessSection(name())==Entry::HEADER_SEC)
+ ) &&
+ extension!=".doc" && extension!=".txt" && extension!=".dox";
+}
+
+
+void FileDef::addListReferences()
+{
+ {
+ LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
+ addRefItem(xrefItems.pointer(),
+ getOutputFileBase(),
+ theTranslator->trFile(TRUE,TRUE),
+ getOutputFileBase(),name(),
+ 0
+ );
+ }
+ if (memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->addListReferences(this);
+ }
+ }
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::documentationLists)
+ {
+ ml->addListReferences(this);
+ }
+ }
+}
+
+//-------------------------------------------------------------------
+
+static int findMatchingPart(const QCString &path,const QCString dir)
+{
+ int si1;
+ int pos1=0,pos2=0;
+ while ((si1=path.find('/',pos1))!=-1)
+ {
+ int si2=dir.find('/',pos2);
+ //printf(" found slash at pos %d in path %d: %s<->%s\n",si1,si2,
+ // path.mid(pos1,si1-pos2).data(),dir.mid(pos2).data());
+ if (si2==-1 && path.mid(pos1,si1-pos2)==dir.mid(pos2)) // match at end
+ {
+ return dir.length();
+ }
+ if (si1!=si2 || path.mid(pos1,si1-pos2)!=dir.mid(pos2,si2-pos2)) // no match in middle
+ {
+ return QMAX(pos1-1,0);
+ }
+ pos1=si1+1;
+ pos2=si2+1;
+ }
+ return 0;
+}
+
+static Directory *findDirNode(Directory *root,const QCString &name)
+{
+ QListIterator<DirEntry> dli(root->children());
+ DirEntry *de;
+ for (dli.toFirst();(de=dli.current());++dli)
+ {
+ if (de->kind()==DirEntry::Dir)
+ {
+ Directory *dir = (Directory *)de;
+ QCString dirName=dir->name();
+ int sp=findMatchingPart(name,dirName);
+ //printf("findMatchingPart(%s,%s)=%d\n",name.data(),dirName.data(),sp);
+ if (sp>0) // match found
+ {
+ if ((uint)sp==dirName.length()) // whole directory matches
+ {
+ // recurse into the directory
+ return findDirNode(dir,name.mid(dirName.length()+1));
+ }
+ else // partial match => we need to split the path into three parts
+ {
+ QCString baseName =dirName.left(sp);
+ QCString oldBranchName=dirName.mid(sp+1);
+ QCString newBranchName=name.mid(sp+1);
+ // strip file name from path
+ int newIndex=newBranchName.findRev('/');
+ if (newIndex>0) newBranchName=newBranchName.left(newIndex);
+
+ //printf("Splitting off part in new branch \n"
+ // "base=%s old=%s new=%s\n",
+ // baseName.data(),
+ // oldBranchName.data(),
+ // newBranchName.data()
+ // );
+ Directory *base = new Directory(root,baseName);
+ Directory *newBranch = new Directory(base,newBranchName);
+ dir->reParent(base);
+ dir->rename(oldBranchName);
+ base->addChild(dir);
+ base->addChild(newBranch);
+ dir->setLast(FALSE);
+ // remove DirEntry container from list (without deleting it)
+ root->children().setAutoDelete(FALSE);
+ root->children().removeRef(dir);
+ root->children().setAutoDelete(TRUE);
+ // add new branch to the root
+ if (!root->children().isEmpty())
+ {
+ root->children().last()->setLast(FALSE);
+ }
+ root->addChild(base);
+ return newBranch;
+ }
+ }
+ }
+ }
+ int si=name.findRev('/');
+ if (si==-1) // no subdir
+ {
+ return root; // put the file under the root node.
+ }
+ else // need to create a subdir
+ {
+ QCString baseName = name.left(si);
+ //printf("new subdir %s\n",baseName.data());
+ Directory *newBranch = new Directory(root,baseName);
+ if (!root->children().isEmpty())
+ {
+ root->children().last()->setLast(FALSE);
+ }
+ root->addChild(newBranch);
+ return newBranch;
+ }
+}
+
+static void mergeFileDef(Directory *root,FileDef *fd)
+{
+ QCString rootPath = root->name();
+ QCString filePath = fd->absFilePath();
+ //printf("merging %s\n",filePath.data());
+ Directory *dirNode = findDirNode(root,filePath);
+ if (!dirNode->children().isEmpty())
+ {
+ dirNode->children().last()->setLast(FALSE);
+ }
+ DirEntry *e=new DirEntry(dirNode,fd);
+ dirNode->addChild(e);
+}
+
+#if 0
+static void generateIndent(QTextStream &t,DirEntry *de,int level)
+{
+ if (de->parent())
+ {
+ generateIndent(t,de->parent(),level+1);
+ }
+ // from the root up to node n do...
+ if (level==0) // item before a dir or document
+ {
+ if (de->isLast())
+ {
+ if (de->kind()==DirEntry::Dir)
+ {
+ t << "<img " << FTV_IMGATTRIBS(plastnode) << "/>";
+ }
+ else
+ {
+ t << "<img " << FTV_IMGATTRIBS(lastnode) << "/>";
+ }
+ }
+ else
+ {
+ if (de->kind()==DirEntry::Dir)
+ {
+ t << "<img " << FTV_IMGATTRIBS(pnode) << "/>";
+ }
+ else
+ {
+ t << "<img " << FTV_IMGATTRIBS(node) << "/>";
+ }
+ }
+ }
+ else // item at another level
+ {
+ if (de->isLast())
+ {
+ t << "<img " << FTV_IMGATTRIBS(blank) << "/>";
+ }
+ else
+ {
+ t << "<img " << FTV_IMGATTRIBS(vertline) << "/>";
+ }
+ }
+}
+
+static void writeDirTreeNode(QTextStream &t,Directory *root,int level)
+{
+ QCString indent;
+ indent.fill(' ',level*2);
+ QListIterator<DirEntry> dli(root->children());
+ DirEntry *de;
+ for (dli.toFirst();(de=dli.current());++dli)
+ {
+ t << indent << "<p>";
+ generateIndent(t,de,0);
+ if (de->kind()==DirEntry::Dir)
+ {
+ Directory *dir=(Directory *)de;
+ //printf("%s [dir]: %s (last=%d,dir=%d)\n",indent.data(),dir->name().data(),dir->isLast(),dir->kind()==DirEntry::Dir);
+ t << "<img " << FTV_IMGATTRIBS(folderclosed) << "/>";
+ t << dir->name();
+ t << "</p>\n";
+ t << indent << "<div>\n";
+ writeDirTreeNode(t,dir,level+1);
+ t << indent << "</div>\n";
+ }
+ else
+ {
+ //printf("%s [file]: %s (last=%d,dir=%d)\n",indent.data(),de->file()->name().data(),de->isLast(),de->kind()==DirEntry::Dir);
+ t << "<img " << FTV_IMGATTRIBS(doc) << "/>";
+ t << de->file()->name();
+ t << "</p>\n";
+ }
+ }
+}
+#endif
+
+static void addDirsAsGroups(Directory *root,GroupDef *parent,int level)
+{
+ GroupDef *gd=0;
+ if (root->kind()==DirEntry::Dir)
+ {
+ gd = new GroupDef("[generated]",
+ 1,
+ root->path(), // name
+ root->name() // title
+ );
+ if (parent)
+ {
+ parent->addGroup(gd);
+ gd->makePartOfGroup(parent);
+ }
+ else
+ {
+ Doxygen::groupSDict->append(root->path(),gd);
+ }
+ }
+ QListIterator<DirEntry> dli(root->children());
+ DirEntry *de;
+ for (dli.toFirst();(de=dli.current());++dli)
+ {
+ if (de->kind()==DirEntry::Dir)
+ {
+ addDirsAsGroups((Directory *)de,gd,level+1);
+ }
+ }
+}
+
+void generateFileTree()
+{
+ Directory *root=new Directory(0,"root");
+ root->setLast(TRUE);
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ mergeFileDef(root,fd);
+ }
+ }
+ //t << "<div class=\"directory\">\n";
+ //writeDirTreeNode(t,root,0);
+ //t << "</div>\n";
+ addDirsAsGroups(root,0,0);
+ delete root;
+}
+
+//-------------------------------------------------------------------
+
+void FileDef::combineUsingRelations()
+{
+ if (visited) return; // already done
+ visited=TRUE;
+ if (usingDirList)
+ {
+ NamespaceSDict::Iterator nli(*usingDirList);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ nd->combineUsingRelations();
+ }
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ // add used namespaces of namespace nd to this namespace
+ if (nd->getUsedNamespaces())
+ {
+ NamespaceSDict::Iterator unli(*nd->getUsedNamespaces());
+ NamespaceDef *und;
+ for (unli.toFirst();(und=unli.current());++unli)
+ {
+ //printf("Adding namespace %s to the using list of %s\n",und->qualifiedName().data(),qualifiedName().data());
+ addUsingDirective(und);
+ }
+ }
+ // add used classes of namespace nd to this namespace
+ if (nd->getUsedClasses())
+ {
+ SDict<Definition>::Iterator cli(*nd->getUsedClasses());
+ Definition *ucd;
+ for (cli.toFirst();(ucd=cli.current());++cli)
+ {
+ //printf("Adding class %s to the using list of %s\n",cd->qualifiedName().data(),qualifiedName().data());
+ addUsingDeclaration(ucd);
+ }
+ }
+ }
+ }
+}
+
+bool FileDef::isDocumentationFile() const
+{
+ return name().right(4)==".doc" ||
+ name().right(4)==".txt" ||
+ name().right(4)==".dox";
+}
+
+void FileDef::acquireFileVersion()
+{
+ QCString vercmd = Config_getString("FILE_VERSION_FILTER");
+ if (!vercmd.isEmpty() && filepath!="generated")
+ {
+ msg("Version of %s : ",filepath.data());
+ QCString cmd = vercmd+" \""+filepath+"\"";
+ Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",cmd.data());
+ FILE *f=portable_popen(cmd,"r");
+ if (!f)
+ {
+ err("error: could not execute %s\n",vercmd.data());
+ return;
+ }
+ const int bufSize=1024;
+ char buf[bufSize];
+ int numRead = fread(buf,1,bufSize,f);
+ portable_pclose(f);
+ if (numRead > 0)
+ {
+ fileVersion = QCString(buf,numRead).stripWhiteSpace();
+ msg("%s\n",fileVersion.data());
+ }
+ else
+ {
+ msg("no version available\n");
+ }
+ }
+}
+
+
+QCString FileDef::getSourceFileBase() const
+{
+ if (Htags::useHtags)
+ {
+ return Htags::path2URL(filepath);
+ }
+ else
+ {
+ return convertNameToFile(diskname)+"_source";
+ }
+}
+
+/*! Returns the name of the verbatim copy of this file (if any). */
+QCString FileDef::includeName() const
+{
+ if (Htags::useHtags)
+ {
+ return Htags::path2URL(filepath);
+ }
+ else
+ {
+ return convertNameToFile(diskname)+"_source";
+ }
+}
+
+MemberList *FileDef::createMemberList(MemberList::ListType lt)
+{
+ m_memberLists.setAutoDelete(TRUE);
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()==lt)
+ {
+ return ml;
+ }
+ }
+ // not found, create a new member list
+ ml = new MemberList(lt);
+ m_memberLists.append(ml);
+ return ml;
+}
+
+void FileDef::addMemberToList(MemberList::ListType lt,MemberDef *md)
+{
+ static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
+ static bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");
+ MemberList *ml = createMemberList(lt);
+ ml->setNeedsSorting(
+ ((ml->listType()&MemberList::declarationLists) && sortBriefDocs) ||
+ ((ml->listType()&MemberList::documentationLists) && sortMemberDocs));
+ ml->append(md);
+#if 0
+ if (ml->needsSorting())
+ ml->inSort(md);
+ else
+ ml->append(md);
+#endif
+ if (lt&MemberList::documentationLists)
+ {
+ ml->setInFile(TRUE);
+ }
+ if (ml->listType()&MemberList::declarationLists) md->setSectionList(this,ml);
+}
+
+void FileDef::sortMemberLists()
+{
+ MemberList *ml = m_memberLists.first();
+ while (ml)
+ {
+ if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
+ ml = m_memberLists.next();
+ }
+}
+
+MemberList *FileDef::getMemberList(MemberList::ListType lt) const
+{
+ FileDef *that = (FileDef*)this;
+ MemberList *ml = that->m_memberLists.first();
+ while (ml)
+ {
+ if (ml->listType()==lt)
+ {
+ return ml;
+ }
+ ml = that->m_memberLists.next();
+ }
+ return 0;
+}
+
+void FileDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title)
+{
+ static bool optVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ MemberList * ml = getMemberList(lt);
+ if (ml)
+ {
+ if (optVhdl) // use specific declarations function
+ {
+ VhdlDocGen::writeVhdlDeclarations(ml,ol,0,0,this);
+ }
+ else
+ {
+ ml->writeDeclarations(ol,0,0,this,0,title,0);
+ }
+ }
+}
+
+void FileDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title)
+{
+ MemberList * ml = getMemberList(lt);
+ if (ml) ml->writeDocumentation(ol,name(),this,title);
+}
+
+bool FileDef::isLinkableInProject() const
+{
+ static bool showFiles = Config_getBool("SHOW_FILES");
+ return hasDocumentation() && !isReference() && showFiles;
+}
+
+bool FileDef::includes(FileDef *incFile,QDict<FileDef> *includedFiles) const
+{
+ if (incFile==this) return TRUE;
+ //printf("%s::includes(%s)\n",name().data(),incFile->name().data());
+ includedFiles->insert(absFilePath(),this);
+ if (includeList)
+ {
+ QListIterator<IncludeInfo> ili(*includeList);
+ IncludeInfo *ii;
+ for (;(ii=ili.current());++ili)
+ {
+ if (ii->fileDef &&
+ includedFiles->find(ii->fileDef->absFilePath())==0 &&
+ ii->fileDef->includes(incFile,includedFiles)) return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
diff --git a/src/filedef.h b/src/filedef.h
new file mode 100644
index 0000000..e1e8c32
--- /dev/null
+++ b/src/filedef.h
@@ -0,0 +1,324 @@
+/******************************************************************************
+ *
+ * $Id: filedef.h,v 1.32 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef FILEDEF_H
+#define FILEDEF_H
+
+#include "index.h"
+#include <qlist.h>
+#include <qintdict.h>
+#include <qdict.h>
+#include "config.h"
+#include "definition.h"
+#include "memberlist.h"
+#include "util.h"
+
+class FileDef;
+class FileList;
+class ClassSDict;
+class ClassDef;
+class ClassList;
+class MemberDef;
+class OutputList;
+class NamespaceDef;
+class NamespaceSDict;
+class MemberGroupSDict;
+class PackageDef;
+class DirDef;
+
+struct IncludeInfo
+{
+ IncludeInfo() { fileDef=0; local=FALSE; }
+ ~IncludeInfo() {}
+ FileDef *fileDef;
+ QCString includeName;
+ bool local;
+ bool imported;
+};
+
+/*! \class FileDef filedef.h
+ \brief A File definition.
+
+ An object of this class contains all file information that is gathered.
+ This includes the members and compounds defined in the file.
+
+ The member writeDocumentation() can be used to generate the page of
+ documentation to HTML and LaTeX.
+*/
+
+class FileDef : public Definition
+{
+ friend class FileName;
+
+ public:
+ //enum FileType { Source, Header, Unknown };
+
+ FileDef(const char *p,const char *n,const char *ref=0,const char *dn=0);
+ ~FileDef();
+ DefType definitionType() const { return TypeFile; }
+
+ /*! Returns the unique file name (this may include part of the path). */
+ QCString name() const
+ {
+ if (Config_getBool("FULL_PATH_NAMES"))
+ return filename;
+ else
+ return Definition::name();
+ }
+
+ QCString fileName() const
+ {
+ return filename;
+ }
+
+ QCString getOutputFileBase() const
+ { return convertNameToFile(diskname); }
+
+ QCString getFileBase() const
+ { return diskname; }
+
+ QCString getSourceFileBase() const;
+
+ /*! Returns the name of the verbatim copy of this file (if any). */
+ QCString includeName() const;
+
+ /*! Returns the absolute path including the file name. */
+ QCString absFilePath() const { return filepath; }
+
+
+ /*! Returns the name as it is used in the documentation */
+ QCString docName() const { return docname; }
+
+ void addSourceRef(int line,Definition *d,MemberDef *md);
+ Definition *getSourceDefinition(int lineNr);
+ MemberDef *getSourceMember(int lineNr);
+
+ /* Sets the name of the include file to \a n. */
+ //void setIncludeName(const char *n_) { incName=n_; }
+
+ /*! Returns the absolute path of this file. */
+ QCString getPath() const { return path; }
+
+ /*! Returns version of this file. */
+ QCString getVersion() const { return fileVersion; }
+
+ bool isLinkableInProject() const;
+
+ bool isLinkable() const
+ {
+ return isLinkableInProject() || isReference();
+ }
+ bool isIncluded(const QCString &name) const;
+
+ bool isJava() const { return m_isJava; }
+ bool isCSharp() const { return m_isCSharp; }
+
+ void writeDocumentation(OutputList &ol);
+ void writeMemberPages(OutputList &ol);
+ void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
+ void writeSummaryLinks(OutputList &ol);
+
+ void writeSource(OutputList &ol);
+ void parseSource();
+ friend void generatedFileNames();
+ void insertMember(MemberDef *md);
+ void insertClass(ClassDef *cd);
+ void insertNamespace(NamespaceDef *nd);
+ void computeAnchors();
+
+ void setPackageDef(PackageDef *pd) { package=pd; }
+ PackageDef *packageDef() const { return package; }
+
+ void setDirDef(DirDef *dd) { dir=dd; }
+ DirDef *getDirDef() const { return dir; }
+
+ void addUsingDirective(NamespaceDef *nd);
+ NamespaceSDict *getUsedNamespaces() const;
+ void addUsingDeclaration(Definition *def);
+ SDict<Definition> *getUsedClasses() const { return usingDeclList; }
+ void combineUsingRelations();
+
+ bool generateSourceFile() const;
+ void sortMemberLists();
+
+ void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported);
+ void addIncludedByDependency(FileDef *fd,const char *incName,bool local,bool imported);
+ QList<IncludeInfo> *includeFileList() const { return includeList; }
+ QList<IncludeInfo> *includedByFileList() const { return includedByList; }
+
+ void addMembersToMemberGroup();
+ void distributeMemberGroupDocumentation();
+ void findSectionsInDocumentation();
+ void addIncludedUsingDirectives();
+
+ void addListReferences();
+ bool isDocumentationFile() const;
+ bool includes(FileDef *incFile,QDict<FileDef> *includedFiles) const;
+
+ MemberList *getMemberList(MemberList::ListType lt) const;
+ const QList<MemberList> &getMemberLists() const { return m_memberLists; }
+
+ /* user defined member groups */
+ MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
+ NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; }
+ ClassSDict *getClassSDict() const { return classSDict; }
+
+ bool visited;
+
+ protected:
+ /**
+ * Retrieves the file version from version control system.
+ */
+ void acquireFileVersion();
+
+ private:
+ MemberList *createMemberList(MemberList::ListType lt);
+ void addMemberToList(MemberList::ListType lt,MemberDef *md);
+ void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title);
+ void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title);
+ void writeIncludeFiles(OutputList &ol);
+ void writeIncludeGraph(OutputList &ol);
+ void writeIncludedByGraph(OutputList &ol);
+ void writeMemberGroups(OutputList &ol);
+ void writeAuthorSection(OutputList &ol);
+ void writeSourceLink(OutputList &ol);
+ void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
+ void writeClassDeclarations(OutputList &ol,const QCString &title);
+ void startMemberDeclarations(OutputList &ol);
+ void endMemberDeclarations(OutputList &ol);
+ void startMemberDocumentation(OutputList &ol);
+ void endMemberDocumentation(OutputList &ol);
+ void writeDetailedDescription(OutputList &ol,const QCString &title);
+ void writeBriefDescription(OutputList &ol);
+
+ QDict<IncludeInfo> *includeDict;
+ QList<IncludeInfo> *includeList;
+ QDict<IncludeInfo> *includedByDict;
+ QList<IncludeInfo> *includedByList;
+ NamespaceSDict *usingDirList;
+ SDict<Definition> *usingDeclList;
+ QCString path;
+ QCString filepath;
+ QCString diskname;
+ QCString filename;
+ QCString docname;
+ QIntDict<Definition> *srcDefDict;
+ QIntDict<MemberDef> *srcMemberDict;
+ bool isSource;
+ bool m_isJava;
+ bool m_isCSharp;
+ QCString fileVersion;
+ PackageDef *package;
+ DirDef *dir;
+ QList<MemberList> m_memberLists;
+ MemberGroupSDict *memberGroupSDict;
+ NamespaceSDict *namespaceSDict;
+ ClassSDict *classSDict;
+ bool m_subGrouping;
+};
+
+
+class FileList : public QList<FileDef>
+{
+ public:
+ FileList() : m_pathName("tmp") {}
+ FileList(const char *path) : QList<FileDef>(), m_pathName(path) {}
+ ~FileList() {}
+ QCString path() const { return m_pathName; }
+ int compareItems(GCI item1,GCI item2)
+ {
+ FileDef *md1 = (FileDef *)item1;
+ FileDef *md2 = (FileDef *)item2;
+ return stricmp(md1->name(),md2->name());
+ }
+ private:
+ QCString m_pathName;
+};
+
+class OutputNameList : public QList<FileList>
+{
+ public:
+ OutputNameList() : QList<FileList>() {}
+ ~OutputNameList() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ FileList *fl1 = (FileList *)item1;
+ FileList *fl2 = (FileList *)item2;
+ return stricmp(fl1->path(),fl2->path());
+ }
+};
+
+class OutputNameDict : public QDict<FileList>
+{
+ public:
+ OutputNameDict(int size) : QDict<FileList>(size) {}
+ ~OutputNameDict() {}
+};
+
+class Directory;
+
+class DirEntry
+{
+ public:
+ enum EntryKind { Dir, File };
+ DirEntry(DirEntry *parent,FileDef *fd)
+ : m_parent(parent), m_name(fd->name()), m_kind(File), m_fd(fd),
+ m_isLast(FALSE) { }
+ DirEntry(DirEntry *parent,QCString name)
+ : m_parent(parent), m_name(name), m_kind(Dir),
+ m_fd(0), m_isLast(FALSE) { }
+ virtual ~DirEntry() { }
+ EntryKind kind() const { return m_kind; }
+ FileDef *file() const { return m_fd; }
+ bool isLast() const { return m_isLast; }
+ void setLast(bool b) { m_isLast=b; }
+ DirEntry *parent() const { return m_parent; }
+ QCString name() const { return m_name; }
+ QCString path() const { return parent() ? parent()->path()+"/"+name() : name(); }
+
+ protected:
+ DirEntry *m_parent;
+ QCString m_name;
+
+ private:
+ EntryKind m_kind;
+ FileDef *m_fd;
+ int num;
+ bool m_isLast;
+};
+
+class Directory : public DirEntry
+{
+ public:
+ Directory(Directory *parent,const QCString &name)
+ : DirEntry(parent,name)
+ { m_children.setAutoDelete(TRUE); }
+ virtual ~Directory() {}
+ void addChild(DirEntry *d) { m_children.append(d); d->setLast(TRUE); }
+ QList<DirEntry> &children() { return m_children; }
+ void rename(const QCString &name) { m_name=name; }
+ void reParent(Directory *parent) { m_parent=parent; }
+
+ private:
+ QList<DirEntry> m_children;
+};
+
+//void generateFileTree(QTextStream &t);
+void generateFileTree();
+
+#endif
+
diff --git a/src/filename.cpp b/src/filename.cpp
new file mode 100644
index 0000000..f775f7d
--- /dev/null
+++ b/src/filename.cpp
@@ -0,0 +1,144 @@
+/******************************************************************************
+ *
+ * $Id: filename.cpp,v 1.18 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "filename.h"
+#include "util.h"
+
+FileName::FileName(const char *fn,const char *n) : FileList()
+{
+ setAutoDelete(TRUE);
+ fName=fn;
+ name=n;
+}
+
+FileName::~FileName()
+{
+}
+
+
+void FileName::generateDiskNames()
+{
+ //QCString commonPrefix;
+ FileDef *fd=first();
+ int count=0;
+ while (fd)
+ {
+ if (!fd->isReference()) count++;
+ fd=next();
+ }
+ if (count==1)
+ {
+ fd=first();
+ // skip references
+ while (fd && fd->isReference()) fd=next();
+ // name if unique, so diskname is simply the name
+ //printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
+ fd->diskname=name.copy();
+ }
+ else if (count>1) // multiple occurrences of the same file name
+ {
+ //printf("Multiple occurrences of %s\n",name.data());
+ int i=0,j=0;
+ bool found=FALSE;
+ while (!found) // search for the common prefix of all paths
+ {
+ fd=first();
+ while (fd && fd->isReference()) fd=next();
+ char c=fd->path.at(i);
+ if (c=='/') j=i; // remember last position of dirname
+ fd=next();
+ while (fd && !found)
+ {
+ if (!fd->isReference())
+ {
+ //printf("i=%d j=%d fd->path=`%s' fd->name=`%s'\n",i,j,fd->path.left(i).data(),fd->name().data());
+ if (i==(int)fd->path.length())
+ {
+ //warning("Warning: Input file %s found multiple times!\n"
+ // " The generated documentation for this file may not be correct!\n",fd->absFilePath().data());
+ found=TRUE;
+ }
+ else if (fd->path[i]!=c)
+ {
+ found=TRUE;
+ }
+ }
+ fd=next();
+ }
+ i++;
+ }
+ fd=first();
+ while (fd)
+ {
+ //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
+ if (!fd->isReference())
+ {
+ QCString prefix = fd->path.right(fd->path.length()-j-1);
+ fd->setName(prefix+name);
+ //printf("!!!!!!!! non unique disk name=%s for fd=%s\n",(prefix+name).data(),fd->diskname.data());
+ fd->diskname=prefix+name;
+ }
+ fd=next();
+ }
+ }
+}
+
+int FileName::compareItems(GCI item1, GCI item2)
+{
+ FileName *f1=(FileName *)item1;
+ FileName *f2=(FileName *)item2;
+ return stricmp(f1->fileName(),f2->fileName());
+}
+
+FileNameIterator::FileNameIterator(const FileName &fname) :
+ QListIterator<FileDef>(fname)
+{
+}
+
+FileNameList::FileNameList() : QList<FileName>()
+{
+}
+
+FileNameList::~FileNameList()
+{
+}
+
+void FileNameList::generateDiskNames()
+{
+ FileName *fn=first();
+ while (fn)
+ {
+ fn->generateDiskNames();
+ fn=next();
+ }
+}
+
+int FileNameList::compareItems(GCI item1, GCI item2)
+{
+ FileName *f1=(FileName *)item1;
+ FileName *f2=(FileName *)item2;
+ //printf("FileNameList::compareItems `%s'<->`%s'\n",
+ // f1->fileName(),f2->fileName());
+ return Config_getBool("FULL_PATH_NAMES") ?
+ stricmp(f1->fullName(),f2->fullName()) :
+ stricmp(f1->fileName(),f2->fileName());
+}
+
+FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) :
+ QListIterator<FileName>(fnlist)
+{
+}
diff --git a/src/filename.h b/src/filename.h
new file mode 100644
index 0000000..6e7eaeb
--- /dev/null
+++ b/src/filename.h
@@ -0,0 +1,69 @@
+/******************************************************************************
+ *
+ * $Id: filename.h,v 1.10 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef FILENAME_H
+#define FILENAME_H
+
+#include "qtbc.h"
+#include <qdict.h>
+#include "filedef.h"
+
+class FileName : public FileList
+{
+ public:
+ FileName(const char *fn,const char *name);
+ ~FileName();
+ const char *fileName() const { return name; }
+ const char *fullName() const { return fName; }
+ void generateDiskNames();
+ int compareItems(GCI item1,GCI item2);
+
+ private:
+ QCString name;
+ QCString fName;
+};
+
+class FileNameIterator : public QListIterator<FileDef>
+{
+ public:
+ FileNameIterator(const FileName &list);
+};
+
+class FileNameList : public QList<FileName>
+{
+ public:
+ FileNameList();
+ ~FileNameList();
+ void generateDiskNames();
+ int compareItems(GCI item1,GCI item2);
+};
+
+class FileNameListIterator : public QListIterator<FileName>
+{
+ public:
+ FileNameListIterator( const FileNameList &list );
+};
+
+class FileNameDict : public QDict<FileName>
+{
+ public:
+ FileNameDict(uint size) :
+ QDict<FileName>(size,Config_getBool("CASE_SENSE_NAMES")) {}
+ ~FileNameDict() {}
+};
+
+#endif
diff --git a/src/formula.cpp b/src/formula.cpp
new file mode 100644
index 0000000..ff93951
--- /dev/null
+++ b/src/formula.cpp
@@ -0,0 +1,329 @@
+/******************************************************************************
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "qtbc.h"
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+#include <qdir.h>
+
+#include "formula.h"
+#include "image.h"
+#include "util.h"
+#include "message.h"
+#include "config.h"
+#include "portable.h"
+#include "index.h"
+#include "doxygen.h"
+#include "ftextstream.h"
+
+Formula::Formula(const char *text)
+{
+ static int count=0;
+ number = count++;
+ form=text;
+}
+
+Formula::~Formula()
+{
+}
+
+int Formula::getId()
+{
+ return number;
+}
+
+void FormulaList::generateBitmaps(const char *path)
+{
+ int x1,y1,x2,y2;
+ QDir d(path);
+ // store the original directory
+ if (!d.exists()) { err("error: Output dir %s does not exist!\n",path); exit(1); }
+ QCString oldDir = convertToQCString(QDir::currentDirPath());
+ // go to the html output directory (i.e. path)
+ QDir::setCurrent(d.absPath());
+ QDir thisDir;
+ // generate a latex file containing one formula per page.
+ QCString texName="_formulas.tex";
+ QList<int> pagesToGenerate;
+ pagesToGenerate.setAutoDelete(TRUE);
+ FormulaListIterator fli(*this);
+ Formula *formula;
+ QFile f(texName);
+ bool formulaError=FALSE;
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ if (Config_getBool("LATEX_BATCHMODE")) t << "\\batchmode" << endl;
+ t << "\\documentclass{article}" << endl;
+ t << "\\usepackage{epsfig}" << endl; // for those who want to include images
+ const char *s=Config_getList("EXTRA_PACKAGES").first();
+ while (s)
+ {
+ t << "\\usepackage{" << s << "}\n";
+ s=Config_getList("EXTRA_PACKAGES").next();
+ }
+ t << "\\pagestyle{empty}" << endl;
+ t << "\\begin{document}" << endl;
+ int page=0;
+ for (fli.toFirst();(formula=fli.current());++fli)
+ {
+ QCString resultName;
+ resultName.sprintf("form_%d.png",formula->getId());
+ // only formulas for which no image exists are generated
+ QFileInfo fi(resultName);
+ if (!fi.exists())
+ {
+ // we force a pagebreak after each formula
+ t << formula->getFormulaText() << endl << "\\pagebreak\n\n";
+ pagesToGenerate.append(new int(page));
+ }
+ Doxygen::indexList.addImageFile(resultName);
+ page++;
+ }
+ t << "\\end{document}" << endl;
+ f.close();
+ }
+ if (pagesToGenerate.count()>0) // there are new formulas
+ {
+ //printf("Running latex...\n");
+ //system("latex _formulas.tex </dev/null >/dev/null");
+ QCString latexCmd = Config_getString("LATEX_CMD_NAME");
+ if (latexCmd.isEmpty()) latexCmd="latex";
+ portable_sysTimerStart();
+ if (portable_system(latexCmd,"_formulas.tex")!=0)
+ {
+ err("Problems running latex. Check your installation or look "
+ "for typos in _formulas.tex and check _formulas.log!\n");
+ formulaError=TRUE;
+ //return;
+ }
+ portable_sysTimerStop();
+ //printf("Running dvips...\n");
+ QListIterator<int> pli(pagesToGenerate);
+ int *pagePtr;
+ int pageIndex=1;
+ for (;(pagePtr=pli.current());++pli,++pageIndex)
+ {
+ int pageNum=*pagePtr;
+ msg("Generating image form_%d.png for formula\n",pageNum);
+ char dviArgs[4096];
+ QCString formBase;
+ formBase.sprintf("_form%d",pageNum);
+ // run dvips to convert the page with number pageIndex to an
+ // encapsulated postscript.
+ sprintf(dviArgs,"-q -D 600 -E -n 1 -p %d -o %s.eps _formulas.dvi",
+ pageIndex,formBase.data());
+ portable_sysTimerStart();
+ if (portable_system("dvips",dviArgs)!=0)
+ {
+ err("Problems running dvips. Check your installation!\n");
+ portable_sysTimerStop();
+ return;
+ }
+ portable_sysTimerStop();
+ // now we read the generated postscript file to extract the bounding box
+ QFileInfo fi(formBase+".eps");
+ if (fi.exists())
+ {
+ QCString eps = fileToString(formBase+".eps");
+ int i=eps.find("%%BoundingBox:");
+ if (i!=-1)
+ {
+ sscanf(eps.data()+i,"%%%%BoundingBox:%d %d %d %d",&x1,&y1,&x2,&y2);
+ }
+ else
+ {
+ err("error: Couldn't extract bounding box!\n");
+ }
+ }
+ // next we generate a postscript file which contains the eps
+ // and displays it in the right colors and the right bounding box
+ f.setName(formBase+".ps");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << "1 1 1 setrgbcolor" << endl; // anti-alias to white background
+ t << "newpath" << endl;
+ t << "-1 -1 moveto" << endl;
+ t << (x2-x1+2) << " -1 lineto" << endl;
+ t << (x2-x1+2) << " " << (y2-y1+2) << " lineto" << endl;
+ t << "-1 " << (y2-y1+2) << " lineto" <<endl;
+ t << "closepath" << endl;
+ t << "fill" << endl;
+ t << -x1 << " " << -y1 << " translate" << endl;
+ t << "0 0 0 setrgbcolor" << endl;
+ t << "(" << formBase << ".eps) run" << endl;
+ f.close();
+ }
+ // scale the image so that it is four times larger than needed.
+ // and the sizes are a multiple of four.
+ double scaleFactor = 16.0/3.0;
+ int zoomFactor = Config_getInt("FORMULA_FONTSIZE");
+ if (zoomFactor<8 || zoomFactor>50) zoomFactor=10;
+ scaleFactor *= zoomFactor/10.0;
+ int gx = (((int)((x2-x1)*scaleFactor))+3)&~1;
+ int gy = (((int)((y2-y1)*scaleFactor))+3)&~1;
+ // Then we run ghostscript to convert the postscript to a pixmap
+ // The pixmap is a truecolor image, where only black and white are
+ // used.
+
+ char gsArgs[4096];
+ sprintf(gsArgs,"-q -g%dx%d -r%dx%dx -sDEVICE=ppmraw "
+ "-sOutputFile=%s.pnm -dNOPAUSE -dBATCH -- %s.ps",
+ gx,gy,(int)(scaleFactor*72),(int)(scaleFactor*72),
+ formBase.data(),formBase.data()
+ );
+ portable_sysTimerStart();
+ if (portable_system(portable_ghostScriptCommand(),gsArgs)!=0)
+ {
+ err("Problem running ghostscript %s %s. Check your installation!\n",portable_ghostScriptCommand(),gsArgs);
+ portable_sysTimerStop();
+ return;
+ }
+ portable_sysTimerStop();
+ f.setName(formBase+".pnm");
+ uint imageX=0,imageY=0;
+ // we read the generated image again, to obtain the pixel data.
+ if (f.open(IO_ReadOnly))
+ {
+ QTextStream t(&f);
+ QCString s;
+ if (!t.eof())
+ s=t.readLine();
+ if (s.length()<2 || s.left(2)!="P6")
+ err("error: ghostscript produced an illegal image format!");
+ else
+ {
+ // assume the size if after the first line that does not start with
+ // # excluding the first line of the file.
+ while (!t.eof() && (s=t.readLine()) && !s.isEmpty() && s.at(0)=='#') { }
+ sscanf(s,"%d %d",&imageX,&imageY);
+ }
+ if (imageX>0 && imageY>0)
+ {
+ //printf("Converting image...\n");
+ char *data = new char[imageX*imageY*3]; // rgb 8:8:8 format
+ uint i,x,y,ix,iy;
+ f.readBlock(data,imageX*imageY*3);
+ Image srcImage(imageX,imageY),
+ filteredImage(imageX,imageY),
+ dstImage(imageX/4,imageY/4);
+ uchar *ps=srcImage.getData();
+ // convert image to black (1) and white (0) index.
+ for (i=0;i<imageX*imageY;i++) *ps++= (data[i*3]==0 ? 1 : 0);
+ // apply a simple box filter to the image
+ static int filterMask[]={1,2,1,2,8,2,1,2,1};
+ for (y=0;y<srcImage.getHeight();y++)
+ {
+ for (x=0;x<srcImage.getWidth();x++)
+ {
+ int s=0;
+ for (iy=0;iy<2;iy++)
+ {
+ for (ix=0;ix<2;ix++)
+ {
+ s+=srcImage.getPixel(x+ix-1,y+iy-1)*filterMask[iy*3+ix];
+ }
+ }
+ filteredImage.setPixel(x,y,s);
+ }
+ }
+ // down-sample the image to 1/16th of the area using 16 gray scale
+ // colors.
+ // TODO: optimize this code.
+ for (y=0;y<dstImage.getHeight();y++)
+ {
+ for (x=0;x<dstImage.getWidth();x++)
+ {
+ int xp=x<<2;
+ int yp=y<<2;
+ int c=filteredImage.getPixel(xp+0,yp+0)+
+ filteredImage.getPixel(xp+1,yp+0)+
+ filteredImage.getPixel(xp+2,yp+0)+
+ filteredImage.getPixel(xp+3,yp+0)+
+ filteredImage.getPixel(xp+0,yp+1)+
+ filteredImage.getPixel(xp+1,yp+1)+
+ filteredImage.getPixel(xp+2,yp+1)+
+ filteredImage.getPixel(xp+3,yp+1)+
+ filteredImage.getPixel(xp+0,yp+2)+
+ filteredImage.getPixel(xp+1,yp+2)+
+ filteredImage.getPixel(xp+2,yp+2)+
+ filteredImage.getPixel(xp+3,yp+2)+
+ filteredImage.getPixel(xp+0,yp+3)+
+ filteredImage.getPixel(xp+1,yp+3)+
+ filteredImage.getPixel(xp+2,yp+3)+
+ filteredImage.getPixel(xp+3,yp+3);
+ // here we scale and clip the color value so the
+ // resulting image has a reasonable contrast
+ dstImage.setPixel(x,y,QMIN(15,(c*15)/(16*10)));
+ }
+ }
+ // save the result as a bitmap
+ QCString resultName;
+ resultName.sprintf("form_%d.png",pageNum);
+ // the option parameter 1 is used here as a temporary hack
+ // to select the right color palette!
+ dstImage.save(resultName,1);
+ delete[] data;
+ }
+ f.close();
+ }
+ // remove intermediate image files
+ thisDir.remove(formBase+".eps");
+ thisDir.remove(formBase+".pnm");
+ thisDir.remove(formBase+".ps");
+ }
+ // remove intermediate files produced by latex
+ thisDir.remove("_formulas.dvi");
+ if (!formulaError) thisDir.remove("_formulas.log"); // keep file in case of errors
+ thisDir.remove("_formulas.aux");
+ }
+ // remove the latex file itself
+ if (!formulaError) thisDir.remove("_formulas.tex");
+ // write/update the formula repository so we know what text the
+ // generated images represent (we use this next time to avoid regeneration
+ // of the images, and to avoid forcing the user to delete all images in order
+ // to let a browser refresh the images).
+ f.setName("formula.repository");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ for (fli.toFirst();(formula=fli.current());++fli)
+ {
+ t << "\\form#" << formula->getId() << ":" << formula->getFormulaText() << endl;
+ }
+ f.close();
+ }
+ // reset the directory to the original location.
+ QDir::setCurrent(oldDir);
+}
+
+
+#ifdef FORMULA_TEST
+int main()
+{
+ FormulaList fl;
+ fl.append(new Formula("$x^2$"));
+ fl.append(new Formula("$y^2$"));
+ fl.append(new Formula("$\\sqrt{x_0^2+x_1^2+x_2^2}$"));
+ fl.generateBitmaps("dest");
+ return 0;
+}
+#endif
diff --git a/src/formula.h b/src/formula.h
new file mode 100644
index 0000000..e1906c2
--- /dev/null
+++ b/src/formula.h
@@ -0,0 +1,59 @@
+/******************************************************************************
+ *
+ * $Id: formula.h,v 1.7 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef FORMULA_H
+#define FORMULA_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qdict.h>
+
+class Formula
+{
+ public:
+ Formula(const char *text);
+ ~Formula();
+ int getId();
+ QCString getFormulaText() const { return form; }
+
+ private:
+ int number;
+ QCString form;
+};
+
+class FormulaList : public QList<Formula>
+{
+ public:
+ void generateBitmaps(const char *path);
+};
+
+class FormulaListIterator : public QListIterator<Formula>
+{
+ public:
+ FormulaListIterator(const FormulaList &l) :
+ QListIterator<Formula>(l) {}
+};
+
+class FormulaDict : public QDict<Formula>
+{
+ public:
+ FormulaDict(uint size) :
+ QDict<Formula>(size) {}
+ ~FormulaDict() {}
+};
+
+#endif
diff --git a/src/fortrancode.cpp b/src/fortrancode.cpp
new file mode 100644
index 0000000..2292a86
--- /dev/null
+++ b/src/fortrancode.cpp
@@ -0,0 +1,9942 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer fcodeYY_create_buffer
+#define yy_delete_buffer fcodeYY_delete_buffer
+#define yy_flex_debug fcodeYY_flex_debug
+#define yy_init_buffer fcodeYY_init_buffer
+#define yy_flush_buffer fcodeYY_flush_buffer
+#define yy_load_buffer_state fcodeYY_load_buffer_state
+#define yy_switch_to_buffer fcodeYY_switch_to_buffer
+#define yyin fcodeYYin
+#define yyleng fcodeYYleng
+#define yylex fcodeYYlex
+#define yylineno fcodeYYlineno
+#define yyout fcodeYYout
+#define yyrestart fcodeYYrestart
+#define yytext fcodeYYtext
+#define yywrap fcodeYYwrap
+#define yyalloc fcodeYYalloc
+#define yyrealloc fcodeYYrealloc
+#define yyfree fcodeYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE fcodeYYrestart(fcodeYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t fcodeYYleng;
+
+extern FILE *fcodeYYin, *fcodeYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up fcodeYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up fcodeYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via fcodeYYrestart()), so that the user can continue scanning by
+ * just pointing fcodeYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when fcodeYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t fcodeYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow fcodeYYwrap()'s to do buffer switches
+ * instead of setting up a fresh fcodeYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void fcodeYYrestart (FILE *input_file );
+void fcodeYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE fcodeYY_create_buffer (FILE *file,int size );
+void fcodeYY_delete_buffer (YY_BUFFER_STATE b );
+void fcodeYY_flush_buffer (YY_BUFFER_STATE b );
+void fcodeYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void fcodeYYpop_buffer_state (void );
+
+static void fcodeYYensure_buffer_stack (void );
+static void fcodeYY_load_buffer_state (void );
+static void fcodeYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER fcodeYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE fcodeYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE fcodeYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE fcodeYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *fcodeYYalloc (yy_size_t );
+void *fcodeYYrealloc (void *,yy_size_t );
+void fcodeYYfree (void * );
+
+#define yy_new_buffer fcodeYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ fcodeYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ fcodeYY_create_buffer(fcodeYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ fcodeYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ fcodeYY_create_buffer(fcodeYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define fcodeYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *fcodeYYin = (FILE *) 0, *fcodeYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int fcodeYYlineno;
+
+int fcodeYYlineno = 1;
+
+extern char *fcodeYYtext;
+#define yytext_ptr fcodeYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up fcodeYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ fcodeYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 52
+#define YY_END_OF_BUFFER 53
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[2282] =
+ { 0,
+ 37, 37, 53, 51, 52, 50, 52, 51, 52, 49,
+ 51, 52, 51, 52, 41, 51, 52, 51, 52, 50,
+ 52, 51, 52, 51, 52, 51, 52, 44, 51, 52,
+ 44, 51, 52, 44, 51, 52, 44, 51, 52, 44,
+ 51, 52, 44, 51, 52, 44, 51, 52, 44, 51,
+ 52, 44, 51, 52, 44, 51, 52, 44, 51, 52,
+ 44, 51, 52, 44, 51, 52, 44, 51, 52, 44,
+ 51, 52, 44, 51, 52, 44, 51, 52, 51, 52,
+ 41, 44, 51, 52, 44, 51, 52, 34, 51, 52,
+ 34, 41, 51, 52, 12, 50, 52, 11, 51, 52,
+
+ 11, 41, 51, 52, 19, 50, 52, 18, 51, 52,
+ 17, 51, 52, 17, 41, 51, 52, 37, 51, 52,
+ 39, 50, 52, 37, 51, 52, 37, 49, 51, 52,
+ 37, 51, 52, 37, 41, 51, 52, 9, 50, 52,
+ 51, 52, 5, 51, 52, 5, 41, 51, 52, 51,
+ 52, 7, 51, 52, 8, 51, 52, 8, 41, 51,
+ 52, 23, 51, 52, 22, 51, 52, 22, 41, 51,
+ 52, 32, 50, 52, 30, 51, 52, 28, 51, 52,
+ 29, 51, 52, 27, 51, 52, 27, 51, 52, 27,
+ 51, 52, 27, 51, 52, 27, 51, 52, 27, 51,
+
+ 52, 27, 51, 52, 27, 51, 52, 27, 51, 52,
+ 27, 51, 52, 27, 51, 52, 27, 51, 52, 27,
+ 41, 51, 52, 31, 50, 52, 48, 51, 52, 48,
+ 51, 52, 47, 48, 49, 51, 52, 48, 51, 52,
+ 41, 48, 51, 52, 40, 46, 45, 41, 36, 42,
+ 43, 35, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44,16386, 44, 44, 44, 44,
+ 44,16386, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 41, 35, 41, 41, 44, 41, 44, 41,
+
+ 44, 41, 44, 41, 44, 41, 44, 44, 34, 34,
+ 34, 41, 34, 41, 11, 11, 11, 41, 11, 41,
+ 18, 17, 17, 17, 41, 17, 41, 37, 38, 37,
+ 37, 46, 37, 45, 37, 41, 5, 5, 5, 41,
+ 5, 41, 7, 7, 8, 8, 8, 41, 8, 41,
+ 22, 22, 22, 41, 22, 41, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 41, 27, 41,
+ 27, 41, 27, 41, 43, 43, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 8194, 8194,
+
+ 8194, 35, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 41, 44, 41, 44, 41, 44,
+ 41, 44, 41, 44, 41, 44, 44,16398,16404, 38,
+ 38, 37, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 41, 27, 41, 44, 44, 44, 1,
+ 44, 44,16386, 44, 44, 44, 44, 44,16386, 44,
+ 44, 8194, 8194, 8194, 35, 44, 44, 44,16386, 3,
+
+ 3, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44,16386, 44, 44, 44, 44, 44, 44, 25,
+ 44, 44,16386, 44,16399, 44, 25, 44, 44, 44,
+ 16386, 44, 44, 44,16386, 44,16394, 4, 44, 44,
+ 44,16398,16404, 1, 41, 44, 41, 44,16386, 41,
+ 44, 41, 44, 41, 44, 41, 44, 3,16398,16404,
+ 3, 8206, 8212, 8206, 8212, 44, 44, 44, 44, 44,
+ 44, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 41, 27, 41, 44, 44, 44, 1,
+
+ 33, 1, 35, 44, 44,16386, 44, 44, 44, 44,
+ 44, 44, 44,16386, 44,16386, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44,16399, 24,16399, 24, 35, 24, 44, 44,
+ 44, 44, 44, 44, 8202, 8202, 21, 35, 44,16386,
+ 44,16386, 44,16386,16398,16404, 1, 33, 41, 1,
+ 35, 41, 8194, 41, 8194, 35, 41, 8194, 41, 41,
+ 44, 41, 44,16386, 41, 44, 41, 44,16398,16404,
+ 44, 44, 44, 44, 44, 44, 6, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+
+ 27, 27, 27, 26, 26, 26, 27, 27, 27, 41,
+ 27, 41, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44,16386,16386, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44,16394, 44, 44, 44, 44, 44,
+ 25, 44, 35,16399,16399, 44, 44, 44, 44,16386,
+ 44, 25, 44,16399, 8194, 41, 8194, 41, 8194, 35,
+ 41, 41, 44, 41, 44, 41, 44, 44, 44, 44,
+ 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 41, 27, 41, 44, 44, 44, 44, 44,
+
+ 16399, 44, 44, 44, 44, 8194, 3, 44, 44, 44,
+ 44,16386, 44,16399, 35, 44, 44, 44,16399, 8202,
+ 44, 44, 25, 44, 25, 44, 44,16394,16399,16399,
+ 16399, 24,16399, 44, 44, 44, 44,16399,16399, 41,
+ 44, 41, 44,16399, 41, 44, 44, 44, 44, 44,
+ 44, 44,16398, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 41, 27,
+ 41, 44, 44,16386, 44, 44, 44, 44,16386, 44,
+ 44, 44, 25, 44, 44, 44, 44, 44, 25, 44,
+ 44, 8202,16399,16399,16399, 24,16399, 24, 24, 44,
+
+ 44, 44, 44,16399,16399,16399, 24,16399, 24, 24,
+ 16398, 41, 44, 41,16399, 24, 41,16399, 24, 35,
+ 41, 41, 24, 41, 41, 44, 41, 44, 41, 44,
+ 16386, 44, 44, 44, 44, 44,16398, 8206, 27, 27,
+ 27, 27, 27, 27, 27, 27, 26, 26, 27, 26,
+ 26, 27, 41, 41, 26, 41, 26, 41, 41, 26,
+ 41, 44, 44,16386, 44, 44,16386, 44,16399, 44,
+ 44, 25, 44, 16, 44, 44,16394, 25, 44, 25,
+ 44,16399, 24,16399, 24,16399, 24,16399, 44, 44,
+ 25, 44, 44,16399, 24,16399, 24,16399, 24,16399,
+
+ 16398, 41, 44,16399, 35, 41, 41, 41, 41, 41,
+ 41,16399, 41, 41,16399, 41, 44, 41, 44, 44,
+ 44, 44,16398, 44, 44,16398, 27, 27, 27, 27,
+ 27, 27, 26, 26, 27, 26, 26, 27, 41, 41,
+ 41, 41, 41, 41, 41, 44, 44,16386,16386,16399,
+ 24,16399, 24, 35, 44,16386, 35, 13, 44, 25,
+ 16399,16399, 24,16399, 24,16399, 24,16399, 44, 44,
+ 44,16399,16399, 24,16399, 24,16399, 24,16399,16398,
+ 41,16399, 24, 41,16399, 24, 35, 41, 41, 41,
+ 41, 41,16399, 41, 41, 41,16399, 41,16399, 24,
+
+ 41,16399, 41, 44, 41, 44, 13,16398, 44, 44,
+ 44,16398, 44,16398,16398,16398, 27, 26, 26, 26,
+ 26, 26, 26, 41, 26, 41, 26, 41, 41, 41,
+ 41, 41, 41, 25, 44, 35,16399,16399, 25, 13,
+ 13, 44,16399, 44, 44,16399, 8202,16398, 35, 41,
+ 41, 41, 41,16399, 41, 41, 41,16399, 41, 41,
+ 41,16399, 41, 41,16399, 41, 41,16399, 24, 41,
+ 16399, 24, 41, 24, 41, 41, 41, 41, 44, 41,
+ 44, 13,16398, 13, 8206, 44,16404, 44, 44, 27,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+
+ 41, 26, 41, 26, 41,16399,16399,16399, 25, 25,
+ 13, 44,16386, 44, 44,16404, 41,16399, 41, 41,
+ 41,16399, 41, 41, 41,16399, 41, 41, 41, 41,
+ 16399, 24, 41,16399, 24, 41, 41,16399, 24, 41,
+ 41, 41, 41, 41, 41, 41,16399, 41, 41, 41,
+ 44, 41, 44, 13,16398, 13,16398,16404, 8212, 44,
+ 16398, 44, 41, 41, 41, 41, 41, 41, 41, 41,
+ 26, 41, 26, 41, 41, 41, 41, 41, 41,16399,
+ 16399,16399, 24,16399, 24, 24,16399,16399, 25, 25,
+ 13,16386,16399,16399, 8207, 44,16399,16399,16404,16398,
+
+ 41,16399, 41, 41,16399, 41, 41,16399, 24, 41,
+ 16399, 24, 41, 24, 41, 41, 41, 41,16399, 41,
+ 41, 41,16399, 41, 41, 41, 41, 41, 41,16399,
+ 41, 41,16399, 24, 41,16399, 24, 41, 41,16399,
+ 24, 41, 41, 41, 41, 41, 41,16399, 41, 41,
+ 41, 41, 41, 44, 41, 44, 13,16398, 13,16398,
+ 13,16398, 13,16398,16404, 44,16404, 26, 26, 26,
+ 26, 41, 41, 41, 41, 26, 41, 26, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 26, 41,
+ 26, 41, 41, 41, 41, 41,16399, 24,16399, 24,
+
+ 16399, 24,16399,16399,16399,16399, 24,16399, 24, 24,
+ 25, 25, 13, 8207,16399,16399,16399, 24,16399, 24,
+ 24, 44,16399,16399,16399, 24,16399, 24, 24,16404,
+ 41, 41,16399, 24, 41,16399, 24, 41, 41,16399,
+ 24, 41, 41, 41, 41, 41, 41, 41,16399, 41,
+ 41, 41,16399, 41, 41,16399, 41, 41,16399, 24,
+ 41,16399, 24, 41, 24, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41,16399,
+ 41, 41, 41, 44, 41, 44, 13,16398,16404,16404,
+ 16404, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+
+ 26, 41, 26, 41, 26, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 26, 41, 26, 41, 41,
+ 41, 41, 41, 41,16399,16399, 24,16399, 24,16399,
+ 24,16399,16399, 24,16399, 24,16399, 24,16399, 25,
+ 25, 25, 13,16399, 24,16399, 24, 24,16399,16399,
+ 24,16399, 24, 24,16399, 41, 41, 41, 41,16399,
+ 41, 41,16399, 24, 41,16399, 24, 41, 41,16399,
+ 24, 41, 41, 41, 41, 41, 41,16399, 41, 41,
+ 41, 41, 41, 41,16399, 24, 41,16399, 24, 41,
+ 41,16399, 24, 41, 41, 41, 41, 41, 41, 41,
+
+ 16399, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 44, 41, 44,
+ 13,16398, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 41, 41, 41, 41, 41, 26, 41, 26,
+ 41, 41, 41, 41, 41, 41, 26, 41, 26, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 16399,16399,16399, 24,16399, 24,16399, 24,16399, 25,
+ 16399, 13,16386, 8207, 8207, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41,16399, 41, 41, 41, 41, 41,
+ 41,16399, 41, 41,16399, 24, 41,16399, 24, 41,
+
+ 41,16399, 24, 41, 41, 41, 41, 41, 41,16399,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41,16399,
+ 41, 41, 41,16399, 41, 41, 41, 41, 41, 41,
+ 8207, 41, 41, 44, 13,16398, 26, 26, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 26, 41,
+ 26, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41,16399, 13, 8207, 8207, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41,16399, 41, 41, 8207,
+ 41, 41, 41, 41, 41,16399, 41,16399, 41, 41,
+
+ 41,16399, 24, 41,16399, 24, 41, 24, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 44, 13,
+ 16398, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 26, 41, 26,
+ 41,16399,16399, 25, 25, 13, 8207, 8207, 41, 41,
+ 41,16399, 41, 41, 41,16399, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41,16399, 24, 41,16399, 24,
+ 41, 24, 41, 41, 41, 41,16399, 41, 41, 41,
+ 41, 41, 41, 41, 41, 13,16398, 41, 41, 41,
+
+ 41, 41, 41, 41, 41, 41, 41, 41, 26, 41,
+ 26, 41, 41,16399,16399,16399, 24,16399, 24, 24,
+ 16399,16399, 25, 25, 13, 41, 41, 41,16399, 41,
+ 16399, 41, 41, 41,16399, 24, 41,16399, 24, 41,
+ 24, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41,16399, 41, 41, 41,16399, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 8207, 41, 41, 13,16398, 26, 26, 26,
+ 26, 41, 41, 41, 41, 41, 41, 26, 41, 26,
+ 41, 41, 41, 41, 41, 41, 41,16399, 24,16399,
+
+ 24, 24,16399,16399,16399,16399, 24,16399, 24, 24,
+ 25, 13, 41,16399, 24, 41,16399, 24, 41, 24,
+ 41, 41, 41, 41,16399, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41,16399, 41,16399, 41,
+ 41, 41,16399, 24, 41,16399, 24, 41, 24, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 8207, 41, 41, 41, 13,16398,
+ 26, 26, 26, 26, 26, 26, 26, 41, 26, 41,
+ 41, 41, 41, 41, 41, 41, 41, 26, 41, 26,
+ 41, 8207,16399, 24,16399, 24, 24,16399, 3, 13,
+
+ 41, 41, 41, 41, 41, 41, 41, 41, 8207, 41,
+ 41, 41,16399, 24, 41,16399, 24, 41, 24, 41,
+ 41, 41, 41,16399, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 8207, 41, 41, 41,
+ 3, 13,16398, 3, 8206, 26, 26, 26, 41, 26,
+ 41, 41, 8207, 8207, 8207, 8207, 41, 41, 41, 41,
+ 41, 41, 8207, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 8207, 41, 41, 41, 41, 41,
+ 41, 41, 8207, 8207, 8207, 8207, 41, 41, 41, 41,
+ 8207, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+
+ 8207, 41, 41, 41, 41, 41, 41, 41, 8207, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 8207, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 8207, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 8207, 41,
+ 41, 41, 8207, 41, 41, 8207, 41, 41, 41, 41,
+ 41, 41, 41, 8207, 8207, 8207, 41, 41, 41, 41,
+ 41, 8207, 41, 41, 8207, 41, 8207, 41, 41, 41,
+ 41
+ } ;
+
+static yyconst flex_int16_t yy_accept[2815] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 4, 6, 8, 10, 13, 15, 18, 20, 22,
+ 24, 26, 28, 31, 34, 37, 40, 43, 46, 49,
+ 52, 55, 58, 61, 64, 67, 70, 73, 76, 79,
+ 81, 85, 88, 91, 95, 98, 101, 105, 108, 111,
+ 114, 118, 121, 124, 127, 131, 134, 138, 141, 143,
+ 146, 150, 152, 155, 158, 162, 165, 168, 172, 175,
+ 178, 181, 184, 187, 190, 193, 196, 199, 202, 205,
+
+ 208, 211, 214, 217, 220, 224, 227, 230, 233, 238,
+ 241, 245, 245, 246, 247, 248, 249, 249, 249, 250,
+ 250, 251, 251, 252, 252, 253, 254, 255, 256, 257,
+ 258, 259, 260, 261, 262, 263, 264, 265, 267, 268,
+ 269, 270, 271, 273, 274, 275, 276, 277, 278, 279,
+ 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
+ 290, 291, 292, 293, 293, 293, 294, 296, 298, 300,
+ 302, 304, 306, 308, 309, 310, 311, 313, 315, 316,
+ 317, 319, 321, 322, 323, 324, 326, 328, 329, 329,
+ 330, 331, 333, 335, 337, 337, 337, 338, 339, 341,
+
+ 343, 343, 344, 345, 346, 347, 349, 351, 352, 353,
+ 355, 357, 358, 359, 360, 361, 362, 363, 364, 365,
+ 366, 367, 368, 369, 370, 371, 372, 373, 374, 375,
+ 376, 377, 379, 381, 383, 385, 385, 386, 387, 388,
+ 389, 390, 391, 392, 393, 394, 395, 396, 397, 398,
+ 399, 400, 401, 403, 404, 405, 406, 407, 408, 409,
+ 410, 411, 412, 413, 414, 415, 416, 417, 418, 419,
+ 420, 421, 422, 423, 424, 425, 426, 427, 428, 429,
+ 430, 431, 432, 433, 434, 435, 435, 437, 439, 441,
+ 443, 445, 447, 450, 451, 452, 453, 453, 454, 455,
+
+ 456, 457, 458, 459, 460, 461, 462, 463, 464, 465,
+ 466, 467, 468, 469, 470, 471, 472, 473, 475, 477,
+ 478, 479, 480, 482, 484, 485, 486, 487, 488, 490,
+ 491, 492, 493, 494, 496, 497, 498, 500, 501, 502,
+ 503, 504, 505, 506, 507, 508, 509, 510, 511, 512,
+ 514, 515, 516, 517, 518, 519, 520, 522, 524, 526,
+ 527, 529, 530, 532, 533, 534, 536, 538, 539, 540,
+ 541, 542, 544, 547, 550, 552, 554, 556, 558, 561,
+ 564, 566, 567, 568, 569, 570, 571, 572, 572, 573,
+ 574, 575, 576, 577, 578, 579, 580, 581, 582, 583,
+
+ 584, 585, 586, 587, 588, 589, 590, 591, 592, 593,
+ 595, 597, 598, 599, 600, 602, 604, 605, 607, 608,
+ 609, 610, 611, 612, 613, 613, 613, 613, 613, 613,
+ 613, 613, 613, 613, 613, 613, 613, 613, 615, 617,
+ 618, 619, 620, 621, 622, 623, 624, 625, 626, 627,
+ 628, 629, 630, 631, 632, 633, 634, 636, 638, 638,
+ 639, 640, 641, 642, 643, 644, 645, 646, 647, 649,
+ 649, 651, 653, 655, 657, 657, 657, 657, 657, 657,
+ 657, 660, 663, 665, 668, 670, 672, 675, 677, 679,
+ 681, 681, 681, 681, 681, 682, 683, 684, 685, 686,
+
+ 687, 688, 689, 690, 691, 692, 693, 694, 695, 696,
+ 697, 698, 699, 700, 701, 702, 703, 704, 705, 705,
+ 706, 707, 707, 708, 709, 709, 709, 711, 713, 714,
+ 715, 715, 716, 717, 718, 719, 720, 721, 722, 723,
+ 723, 723, 723, 723, 723, 723, 723, 723, 724, 724,
+ 724, 725, 725, 725, 725, 725, 725, 725, 725, 725,
+ 725, 725, 726, 727, 728, 729, 730, 731, 732, 733,
+ 734, 736, 737, 738, 739, 740, 741, 743, 744, 744,
+ 744, 744, 744, 745, 745, 746, 747, 748, 749, 751,
+ 752, 754, 754, 754, 755, 755, 755, 755, 755, 755,
+
+ 755, 755, 755, 757, 759, 762, 764, 766, 768, 768,
+ 768, 769, 770, 771, 772, 773, 774, 775, 776, 777,
+ 778, 779, 780, 781, 782, 783, 784, 785, 786, 787,
+ 788, 789, 790, 790, 790, 790, 790, 790, 790, 791,
+ 792, 792, 792, 792, 794, 796, 797, 798, 798, 799,
+ 800, 802, 803, 804, 805, 805, 806, 806, 806, 806,
+ 806, 806, 806, 806, 806, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 809,
+ 810, 811, 813, 815, 815, 816, 817, 818, 820, 821,
+ 822, 823, 825, 827, 829, 829, 829, 830, 830, 830,
+
+ 831, 832, 834, 835, 836, 837, 838, 839, 839, 839,
+ 840, 840, 840, 840, 840, 840, 840, 840, 840, 842,
+ 845, 847, 847, 848, 849, 850, 851, 852, 854, 855,
+ 856, 857, 858, 858, 859, 860, 861, 861, 861, 862,
+ 863, 864, 865, 866, 867, 867, 867, 867, 867, 868,
+ 868, 868, 868, 868, 870, 872, 873, 875, 876, 876,
+ 877, 878, 880, 881, 882, 882, 883, 883, 883, 883,
+ 883, 883, 883, 883, 883, 883, 883, 883, 883, 883,
+ 883, 883, 883, 883, 883, 883, 883, 883, 883, 883,
+ 885, 886, 887, 887, 887, 887, 888, 889, 889, 891,
+
+ 892, 893, 893, 893, 894, 894, 895, 895, 896, 898,
+ 899, 900, 900, 900, 901, 902, 903, 904, 905, 905,
+ 906, 906, 907, 909, 910, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 912, 914, 916, 919, 922,
+ 923, 925, 927, 929, 932, 932, 933, 934, 935, 936,
+ 937, 938, 939, 940, 941, 942, 942, 943, 944, 944,
+ 944, 944, 945, 946, 947, 947, 947, 947, 947, 948,
+ 949, 950, 950, 950, 950, 950, 951, 952, 954, 955,
+ 957, 959, 960, 962, 963, 965, 966, 966, 968, 970,
+ 971, 972, 972, 974, 974, 974, 974, 974, 974, 974,
+
+ 974, 974, 974, 974, 974, 974, 974, 974, 974, 975,
+ 975, 976, 976, 976, 978, 980, 980, 982, 982, 982,
+ 982, 983, 985, 986, 987, 988, 988, 988, 988, 988,
+ 988, 989, 989, 989, 990, 991, 993, 994, 994, 995,
+ 997, 998, 999, 1000, 1000, 1000, 1000, 1000, 1000, 1001,
+ 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1002,
+ 1005, 1007, 1008, 1009, 1010, 1011, 1013, 1014, 1016, 1018,
+ 1020, 1020, 1021, 1022, 1024, 1025, 1026, 1027, 1028, 1029,
+ 1030, 1030, 1031, 1031, 1031, 1032, 1033, 1033, 1034, 1035,
+ 1035, 1035, 1035, 1035, 1035, 1036, 1036, 1037, 1038, 1038,
+
+ 1038, 1038, 1038, 1038, 1040, 1041, 1042, 1043, 1044, 1045,
+ 1046, 1047, 1049, 1050, 1051, 1053, 1055, 1055, 1057, 1057,
+ 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058,
+ 1059, 1059, 1059, 1060, 1060, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1062, 1062, 1063, 1065, 1066, 1067,
+ 1068, 1068, 1068, 1068, 1068, 1069, 1069, 1069, 1069, 1069,
+ 1070, 1071, 1072, 1072, 1072, 1072, 1073, 1073, 1074, 1076,
+ 1077, 1078, 1079, 1079, 1079, 1079, 1079, 1080, 1080, 1080,
+ 1080, 1080, 1080, 1080, 1080, 1080, 1081, 1081, 1081, 1083,
+ 1086, 1089, 1090, 1091, 1092, 1094, 1095, 1096, 1098, 1100,
+
+ 1103, 1105, 1107, 1109, 1110, 1111, 1113, 1114, 1115, 1116,
+ 1117, 1118, 1118, 1119, 1120, 1120, 1120, 1120, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1121, 1122,
+ 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1123,
+ 1124, 1124, 1124, 1124, 1124, 1125, 1127, 1129, 1130, 1131,
+ 1132, 1133, 1134, 1136, 1137, 1137, 1137, 1138, 1138, 1138,
+ 1139, 1139, 1139, 1140, 1140, 1140, 1140, 1140, 1140, 1140,
+ 1140, 1140, 1141, 1142, 1142, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1144,
+ 1144, 1144, 1145, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+
+ 1146, 1146, 1147, 1147, 1147, 1147, 1148, 1148, 1148, 1149,
+ 1149, 1151, 1152, 1153, 1155, 1156, 1157, 1159, 1160, 1161,
+ 1163, 1164, 1166, 1167, 1169, 1172, 1174, 1176, 1177, 1178,
+ 1180, 1182, 1184, 1186, 1188, 1189, 1190, 1191, 1191, 1191,
+ 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191,
+ 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191,
+ 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200,
+ 1201, 1202, 1204, 1206, 1207, 1207, 1207, 1208, 1208, 1208,
+ 1209, 1210, 1210, 1210, 1211, 1211, 1211, 1211, 1211, 1211,
+ 1211, 1211, 1212, 1212, 1214, 1214, 1214, 1214, 1214, 1214,
+
+ 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214,
+ 1215, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216,
+ 1216, 1216, 1216, 1217, 1217, 1217, 1219, 1220, 1221, 1223,
+ 1224, 1225, 1227, 1228, 1229, 1230, 1232, 1235, 1237, 1239,
+ 1241, 1242, 1243, 1244, 1245, 1246, 1248, 1249, 1250, 1252,
+ 1254, 1256, 1258, 1259, 1260, 1262, 1263, 1263, 1263, 1263,
+ 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263,
+ 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263,
+ 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1273, 1275,
+ 1276, 1277, 1278, 1279, 1280, 1281, 1281, 1282, 1282, 1283,
+
+ 1285, 1286, 1287, 1287, 1287, 1288, 1288, 1288, 1289, 1290,
+ 1290, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291,
+ 1291, 1292, 1293, 1293, 1293, 1293, 1293, 1293, 1294, 1294,
+ 1294, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1296, 1297,
+ 1297, 1297, 1298, 1298, 1298, 1299, 1299, 1299, 1299, 1299,
+ 1299, 1299, 1300, 1301, 1301, 1303, 1304, 1306, 1307, 1309,
+ 1312, 1314, 1316, 1317, 1318, 1320, 1321, 1322, 1324, 1325,
+ 1326, 1327, 1328, 1329, 1331, 1332, 1334, 1337, 1339, 1341,
+ 1343, 1344, 1345, 1346, 1347, 1349, 1350, 1351, 1352, 1353,
+ 1355, 1357, 1359, 1361, 1363, 1365, 1366, 1368, 1368, 1368,
+
+ 1368, 1368, 1369, 1370, 1370, 1370, 1370, 1370, 1370, 1370,
+ 1370, 1370, 1371, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
+ 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1373, 1374, 1375,
+ 1376, 1378, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387,
+ 1388, 1389, 1391, 1393, 1394, 1395, 1396, 1397, 1397, 1398,
+ 1400, 1401, 1402, 1403, 1403, 1403, 1403, 1403, 1403, 1404,
+ 1404, 1404, 1405, 1405, 1406, 1406, 1407, 1409, 1410, 1411,
+ 1411, 1411, 1411, 1411, 1412, 1412, 1412, 1413, 1413, 1413,
+ 1413, 1413, 1414, 1414, 1415, 1415, 1415, 1415, 1416, 1417,
+ 1417, 1417, 1418, 1420, 1421, 1422, 1422, 1422, 1422, 1422,
+
+ 1422, 1422, 1422, 1422, 1423, 1423, 1423, 1424, 1425, 1425,
+ 1425, 1426, 1428, 1429, 1430, 1430, 1430, 1430, 1430, 1430,
+ 1430, 1430, 1430, 1431, 1432, 1434, 1437, 1439, 1441, 1443,
+ 1444, 1445, 1446, 1447, 1448, 1450, 1451, 1452, 1454, 1455,
+ 1457, 1458, 1460, 1463, 1465, 1467, 1468, 1469, 1470, 1471,
+ 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1482,
+ 1483, 1485, 1487, 1489, 1490, 1491, 1492, 1492, 1493, 1494,
+ 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1495,
+ 1496, 1496, 1497, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
+ 1498, 1498, 1498, 1498, 1498, 1498, 1499, 1500, 1500, 1500,
+
+ 1500, 1500, 1500, 1500, 1501, 1502, 1503, 1505, 1507, 1508,
+ 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1518, 1520,
+ 1521, 1522, 1523, 1524, 1525, 1525, 1525, 1525, 1526, 1526,
+ 1527, 1529, 1530, 1531, 1532, 1532, 1532, 1532, 1532, 1533,
+ 1533, 1533, 1533, 1533, 1533, 1534, 1536, 1537, 1538, 1539,
+ 1539, 1539, 1539, 1539, 1539, 1540, 1540, 1540, 1540, 1540,
+ 1541, 1541, 1541, 1542, 1543, 1543, 1543, 1543, 1543, 1544,
+ 1544, 1544, 1545, 1547, 1548, 1549, 1549, 1549, 1550, 1550,
+ 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1551, 1553, 1554,
+ 1555, 1555, 1555, 1556, 1556, 1556, 1556, 1556, 1556, 1556,
+
+ 1556, 1556, 1557, 1558, 1559, 1561, 1562, 1564, 1567, 1569,
+ 1571, 1573, 1574, 1575, 1576, 1577, 1579, 1580, 1581, 1582,
+ 1583, 1584, 1586, 1589, 1591, 1593, 1595, 1596, 1597, 1598,
+ 1599, 1600, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609,
+ 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1619, 1621,
+ 1623, 1623, 1623, 1623, 1623, 1623, 1624, 1625, 1625, 1625,
+ 1625, 1625, 1625, 1626, 1627, 1627, 1627, 1627, 1627, 1627,
+ 1627, 1627, 1627, 1627, 1627, 1628, 1629, 1629, 1629, 1629,
+ 1629, 1629, 1630, 1631, 1631, 1632, 1633, 1633, 1634, 1635,
+ 1636, 1637, 1638, 1640, 1642, 1643, 1644, 1645, 1646, 1647,
+
+ 1649, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659,
+ 1660, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1663, 1663, 1664, 1666,
+ 1667, 1668, 1669, 1669, 1669, 1669, 1669, 1670, 1670, 1670,
+ 1670, 1670, 1670, 1670, 1670, 1671, 1672, 1672, 1673, 1674,
+ 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1676, 1676,
+ 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1686, 1687,
+ 1688, 1689, 1690, 1691, 1693, 1694, 1696, 1699, 1701, 1703,
+ 1705, 1706, 1707, 1708, 1709, 1711, 1712, 1713, 1714, 1715,
+
+ 1716, 1717, 1718, 1719, 1721, 1722, 1723, 1725, 1726, 1727,
+ 1728, 1729, 1730, 1731, 1733, 1735, 1737, 1737, 1737, 1737,
+ 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1738, 1739, 1739,
+ 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1740,
+ 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1751,
+ 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762,
+ 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763,
+ 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763,
+ 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1765, 1765,
+ 1765, 1765, 1765, 1765, 1765, 1766, 1766, 1766, 1766, 1766,
+
+ 1766, 1766, 1766, 1766, 1767, 1767, 1767, 1768, 1769, 1770,
+ 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780,
+ 1781, 1782, 1783, 1784, 1785, 1786, 1788, 1789, 1790, 1792,
+ 1793, 1794, 1795, 1797, 1799, 1800, 1801, 1803, 1806, 1808,
+ 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1820,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822,
+ 1822, 1822, 1822, 1822, 1822, 1822, 1823, 1824, 1825, 1826,
+ 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836,
+ 1837, 1838, 1840, 1842, 1842, 1842, 1843, 1843, 1843, 1844,
+ 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844,
+
+ 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1845,
+ 1845, 1845, 1846, 1847, 1847, 1847, 1847, 1847, 1848, 1848,
+ 1848, 1848, 1848, 1848, 1848, 1849, 1849, 1849, 1850, 1851,
+ 1853, 1854, 1855, 1857, 1858, 1859, 1860, 1861, 1862, 1863,
+ 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873,
+ 1874, 1875, 1877, 1880, 1882, 1884, 1885, 1886, 1888, 1889,
+ 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1898, 1898, 1898,
+ 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898,
+ 1898, 1898, 1898, 1898, 1898, 1899, 1900, 1901, 1902, 1903,
+ 1904, 1905, 1906, 1907, 1908, 1909, 1911, 1913, 1914, 1914,
+
+ 1914, 1915, 1916, 1916, 1916, 1917, 1919, 1920, 1921, 1921,
+ 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1922,
+ 1922, 1922, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923,
+ 1923, 1924, 1925, 1925, 1925, 1926, 1926, 1926, 1926, 1926,
+ 1926, 1926, 1926, 1926, 1926, 1926, 1927, 1928, 1930, 1932,
+ 1933, 1934, 1936, 1939, 1941, 1943, 1944, 1945, 1946, 1947,
+ 1948, 1949, 1950, 1951, 1952, 1953, 1955, 1956, 1957, 1959,
+ 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969,
+ 1970, 1971, 1972, 1973, 1975, 1976, 1978, 1978, 1978, 1978,
+ 1978, 1978, 1978, 1979, 1980, 1980, 1980, 1980, 1980, 1980,
+
+ 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1981, 1982, 1983,
+ 1984, 1985, 1986, 1987, 1988, 1990, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2003, 2003, 2004,
+ 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004,
+ 2005, 2006, 2006, 2006, 2007, 2009, 2010, 2011, 2011, 2011,
+ 2011, 2011, 2011, 2011, 2011, 2011, 2012, 2013, 2013, 2013,
+ 2013, 2013, 2013, 2013, 2013, 2013, 2015, 2018, 2020, 2022,
+ 2023, 2024, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033,
+ 2034, 2035, 2036, 2038, 2040, 2041, 2042, 2044, 2047, 2049,
+ 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060,
+
+ 2061, 2062, 2063, 2064, 2065, 2067, 2068, 2069, 2071, 2072,
+ 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2074, 2075,
+ 2076, 2077, 2077, 2079, 2081, 2082, 2083, 2084, 2085, 2086,
+ 2087, 2088, 2090, 2092, 2092, 2092, 2092, 2092, 2092, 2092,
+ 2092, 2092, 2093, 2093, 2094, 2096, 2097, 2098, 2098, 2098,
+ 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2101,
+ 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2102, 2103,
+ 2104, 2105, 2106, 2107, 2108, 2109, 2111, 2112, 2114, 2117,
+ 2119, 2121, 2122, 2123, 2125, 2126, 2127, 2128, 2129, 2130,
+ 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2139, 2140, 2141,
+
+ 2144, 2146, 2147, 2148, 2148, 2150, 2152, 2153, 2153, 2153,
+ 2153, 2153, 2153, 2153, 2154, 2154, 2154, 2154, 2154, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2155, 2155, 2155, 2155, 2156,
+ 2156, 2156, 2156, 2157, 2157, 2158, 2159, 2160, 2161, 2162,
+ 2163, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173,
+ 2174, 2175, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2183,
+ 2183, 2183, 2183, 2184, 2184, 2184, 2184, 2184, 2184, 2184,
+ 2184, 2184, 2185, 2185, 2185, 2186, 2186, 2186, 2187, 2187,
+ 2187, 2188, 2189, 2190, 2191, 2193, 2194, 2195, 2196, 2197,
+ 2198, 2199, 2200, 2201, 2203, 2204, 2205, 2206, 2207, 2208,
+
+ 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209,
+ 2210, 2210, 2210, 2210, 2210, 2211, 2212, 2213, 2214, 2215,
+ 2216, 2217, 2218, 2219, 2221, 2222, 2223, 2224, 2225, 2226,
+ 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227,
+ 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237,
+ 2238, 2240, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241,
+ 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2251,
+ 2252, 2253, 2253, 2253, 2254, 2254, 2254, 2254, 2254, 2254,
+ 2255, 2256, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265,
+ 2265, 2265, 2265, 2265, 2266, 2266, 2268, 2269, 2270, 2271,
+
+ 2272, 2274, 2275, 2275, 2276, 2276, 2276, 2277, 2279, 2280,
+ 2281, 2281, 2282, 2282
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 4, 5, 6, 7, 1, 8, 9, 10, 11,
+ 12, 13, 1, 14, 1, 1, 1, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 16, 1, 1,
+ 1, 17, 1, 1, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
+ 1, 44, 1, 1, 27, 1, 45, 46, 47, 48,
+
+ 49, 50, 51, 52, 53, 27, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
+ 68, 69, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[70] =
+ { 0,
+ 1, 2, 3, 4, 5, 1, 1, 1, 1, 1,
+ 6, 1, 1, 7, 8, 9, 10, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 1, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11
+ } ;
+
+static yyconst flex_int16_t yy_base[3803] =
+ { 0,
+ 0, 6, 53, 0, 122, 166, 140, 182, 229, 273,
+ 146, 247, 320, 364, 152, 294, 411, 455, 502, 546,
+ 593, 637, 684, 1, 211, 339, 217, 385, 259, 430,
+ 1445,24618,24618, 1410,24618, 153, 0, 13, 23, 20,
+ 1373, 27, 752, 196, 813, 870, 753, 527, 28, 833,
+ 758, 768, 794, 927, 294, 869, 895, 620, 832, 474,
+ 991, 1010, 1354, 1077,24618, 1324, 1121,24618, 0, 1316,
+ 1165, 0, 31, 21, 0, 155, 0,24618, 772, 1281,
+ 1209, 38, 138, 1276, 1253,24618, 1264, 1297,24618,24618,
+ 24618,24618, 332, 1261, 468, 469, 746, 197, 234, 280,
+
+ 926, 297, 340, 807, 1341,24618,24618, 1242,24618, 262,
+ 0, 1239,24618,24618,24618, 0, 189, 1220,24618, 1205,
+ 24618, 199, 1189, 204,24618, 346, 392, 901, 1011, 1048,
+ 1359, 526, 1360, 1375, 1105, 566, 1182, 1192, 1376, 565,
+ 1237, 1093, 483, 1400, 1392, 610, 615, 1426, 1432, 1137,
+ 1438, 1467, 1051, 1279, 1470, 1486, 858, 1496, 1142, 1501,
+ 1229, 1515, 1269, 930, 325, 349, 0, 1568, 1612, 418,
+ 921, 919, 1491, 791, 0, 1177, 1674, 1718, 0, 1096,
+ 1762, 1806, 0, 0, 1084, 1850, 1894, 0, 254, 29,
+ 1045, 0, 0, 0, 922, 332, 0, 1025, 1938, 1982,
+
+ 395, 306, 398, 0, 1017, 2026, 2070, 0, 1014, 2114,
+ 2158, 0, 952, 560, 386, 603, 762, 765, 921, 796,
+ 817, 521, 931, 995, 825, 1019, 1404, 1013, 910, 1003,
+ 1009, 2202, 2246, 2290, 741, 950, 0, 871, 1534, 1600,
+ 1313, 1634, 1584, 1548, 1635, 1640, 1702, 1143, 1692, 1585,
+ 435, 0, 0, 1319, 1779, 1738, 1822, 1739, 1780, 1912,
+ 1827, 2307, 1867, 1915, 1954, 1955, 1232, 1998, 2008, 2042,
+ 2088, 1875, 2176, 2003, 2047, 2087, 2130, 2278, 2131, 2218,
+ 2179, 656, 2308, 2322, 2334, 607, 2397, 2452, 1457, 2292,
+ 1402, 1446, 2500, 871,24618, 863, 736, 1012, 1039, 1042,
+
+ 1134, 804, 1046, 1140, 2325, 1267, 1314, 864, 1128, 1344,
+ 1172, 1183, 1220, 1382, 1270, 1357, 1367, 1497, 1506, 2048,
+ 2219, 2342, 662, 1650, 1870, 2266, 2361, 2376, 1960, 2416,
+ 2413, 0, 440, 0, 2421, 2471, 2136, 2562,24618, 2476,
+ 1830, 2477, 2495, 2514, 2550, 2602, 2625, 2540, 2520, 2575,
+ 2628, 2643, 2646, 2377, 2660, 2665, 668, 2686, 2720, 2692,
+ 1655, 2700, 2726, 2740, 2670, 2746, 2760, 581, 2765, 2775,
+ 2781, 2829, 2789, 2804, 1522, 736, 1455, 2139, 2891,24618,
+ 24618, 2808, 2833, 2839, 2825, 2865, 2866, 918, 1407, 1095,
+ 1576, 1353, 1683, 1465, 1742, 2301, 1582, 1583, 1214, 1680,
+
+ 974, 1271, 1733, 1321, 2896, 1945, 1917, 1736, 2263, 876,
+ 2330, 2921, 2911, 2931, 1101,24618, 2947, 2957, 2971, 2972,
+ 2986, 2436, 3000, 3001, 0, 2209, 1173, 2829, 2978, 1773,
+ 2682, 1503, 1610, 1395, 2340, 1821, 2394, 3026, 3031, 3046,
+ 3049, 3052, 3069, 3072, 3077, 3094, 3104, 3109, 3114, 3135,
+ 3130, 3145, 3153, 3167, 3173, 3185, 3200, 136, 896,24618,
+ 3195, 3203, 3213, 3223, 3228, 3240, 2712,24618, 142, 2537,
+ 3250, 3267, 3285, 0, 1673, 1856, 1860, 1900, 1939, 1936,
+ 1698, 0, 1794, 0, 0, 2178, 3291, 1827, 3017, 0,
+ 3260, 1990, 3282, 2475, 3307, 3310, 3322, 3330, 3340, 3346,
+
+ 24618, 2092, 2041, 2177, 2181, 2220, 2585, 2651, 2597, 2532,
+ 2653, 2556, 2737, 2616, 2773, 2607, 2129,24618, 3170, 3352,
+ 193, 1458, 2763, 2836, 2013, 207, 2898, 3037, 3356, 3372,
+ 3364, 3380, 3392, 3395, 3400, 3412, 3422, 3436, 3439, 2454,
+ 2483, 2514, 2722, 2770, 2782, 2779, 2111, 3325, 2813, 2334,
+ 3442, 2830, 2844, 2352, 2592, 2634, 2876, 2887, 2676, 3438,
+ 2720, 3459, 3467, 3477, 3494, 3504, 3482, 3509, 3527, 3530,
+ 3533, 3549, 3564, 3567, 3582, 3588, 3572, 236, 2917, 2925,
+ 259, 290, 3596, 2433, 3619, 3609, 3634, 3637, 3657, 3663,
+ 3671, 381, 437, 3681, 2936, 3062, 2934, 2943, 2733, 2989,
+
+ 2938, 2993, 0, 2102, 0, 3209, 3207, 3524, 3405, 2971,
+ 3687, 3697, 3707, 3712, 3726, 3736, 3070, 3075, 3282, 3127,
+ 3508, 3128, 3050, 3357, 3751, 3086, 3171, 3113, 3315, 3374,
+ 3258, 3753, 441, 470, 477, 664, 3750, 3766, 3253, 3775,
+ 479, 513, 3469, 3477, 3731, 3790, 3791, 3044, 3805, 3811,
+ 3867, 3823, 3846, 3841, 3842, 3847, 3187, 3205, 3156, 3173,
+ 3372, 3463, 3239, 3478, 0, 3331, 3868, 3533, 3532, 3542,
+ 3560, 3380, 3400, 3445, 3594, 3615, 3633, 3633, 3882, 3894,
+ 3904, 3920, 3966, 3731, 3771, 3928, 3934, 4027, 3950, 3942,
+ 3954, 3984, 3989, 4003, 3646, 3471, 4009, 521, 829, 4042,
+
+ 4032, 4047, 4065, 4084, 4022, 4096, 4104, 523, 809, 4112,
+ 3475, 3531, 3575, 3594, 3641, 3605, 3649, 3615, 3671, 4173,
+ 3774, 3649, 4127, 4132, 4142, 4157, 4196, 4199, 3714, 3825,
+ 4223, 3927, 3988, 3796, 3745, 4229, 3916, 4215, 3851, 4244,
+ 3873, 3925, 4165, 4260, 3896, 528, 787, 4266, 3848, 4275,
+ 562, 777, 4281, 3990, 4292, 4296, 4310, 4318, 3687, 4328,
+ 4334, 4348, 4353, 4368, 3743, 4373, 3674, 3736, 3944, 1115,
+ 4008, 4030, 1454, 3955, 1712, 4383, 3964, 4029, 4038, 4040,
+ 3972, 1742, 2281, 4054, 3005, 3554, 4068, 4081, 4083, 4378,
+ 4390, 4396, 4406, 4053, 4075, 4411, 4419, 4090, 4433, 4439,
+
+ 4438, 4113, 4102, 4459, 766, 4465, 567, 4481, 4487, 576,
+ 1103, 4144, 4290, 4492, 4509, 4524, 4543, 4548, 754, 4566,
+ 1188, 4581, 4584, 1276, 1315, 4408, 4594, 4113, 4136, 4136,
+ 4159, 4177, 4189, 4194, 4314, 4325, 4625, 4631, 2174, 3815,
+ 0, 4484, 4559, 4648, 4201, 4561, 4607, 4661, 4662, 4667,
+ 4687,24618, 4399, 4248, 4487, 4226, 4501, 4697, 4692, 4231,
+ 4289, 4168, 4705, 4356, 4711, 664, 4722, 1389, 1582, 1681,
+ 4250, 4728, 657, 4737, 1744, 1781, 1828, 4711, 4750, 4753,
+ 2229, 4058, 0, 4645, 4756, 4771, 4140, 4774, 4818, 4779,
+ 4684, 4312, 4789, 4358, 4371, 4726, 4453, 4425, 4426, 4622,
+
+ 4637, 4467, 4451, 4483, 4471, 4700, 4793, 4803, 4806, 4807,
+ 4812, 4833, 4488, 4844, 4838, 4508, 4858, 4516, 4543, 1872,
+ 4870, 4873, 1925, 4888, 1961, 4787, 4867, 2009, 2053, 2089,
+ 4925, 4855, 4876, 4899, 4915, 4940, 4943, 2100, 4955, 4958,
+ 2142, 4986, 2225, 4961, 4965, 2261, 2275, 2309, 5019, 4984,
+ 4999, 4524, 4568, 4653, 4712, 4781, 4794, 4581, 5035, 5080,
+ 2431, 4679, 4749, 4886, 4904, 5047, 4848, 5062, 5022, 4967,
+ 4834, 5102, 5103, 5084, 5121, 5124, 5141, 4879, 5151, 5148,
+ 4891, 5164, 5002, 4919, 5170, 5178, 2319, 2372, 2473, 5184,
+ 2478, 2483, 2502, 5193, 5197, 2623, 2644, 2754, 5206, 2793,
+
+ 2809, 2890, 5212, 5228, 5016, 5056, 5089, 5242, 5050, 5246,
+ 5262, 5265, 5279, 5283, 5284, 2908, 5287, 5301, 5129, 2966,
+ 4954, 4987, 4962, 5106, 4967, 5080, 5027, 5094, 5100, 625,
+ 5167, 5083, 5306, 5297,24618, 5119, 5247, 5152, 5150, 5183,
+ 3002, 3409, 3597, 5324, 3603, 5320, 5355, 3820, 5373, 3951,
+ 5330, 5338, 5243, 5342, 5396, 4201, 4255, 5381, 5360, 5409,
+ 5414, 5429, 4354, 4579, 4601, 5443, 4673, 5458, 5461, 4757,
+ 5476, 4768, 5392, 5437, 5471, 5415, 5513, 4952, 4972, 5484,
+ 5403, 5215, 5228, 5260, 5307, 5530, 5283, 5327, 5535, 5541,
+ 5203, 5540, 5342, 5339, 5558, 5495, 620, 5619, 5517, 5557,
+
+ 5681, 5728, 5584, 5594, 5625, 5613, 5650, 5597, 5608, 5644,
+ 5535, 5630, 5660, 5045, 5664, 5656, 5179, 5359, 5715, 5562,
+ 5404, 5602, 5259, 5369, 5425, 5695, 5441, 5474, 5477, 5704,
+ 5710, 5498, 5502, 5571, 5626, 5645, 5742, 5666, 5693, 5701,
+ 5746, 5755, 5737, 5740, 5766, 5772, 5775, 5780, 5786, 5793,
+ 662, 5795, 5799, 5753, 5769, 5781, 5811, 5815, 5809, 5827,
+ 5812, 5821,24618, 5450, 5469, 5437, 5493, 5608, 5523, 5637,
+ 5833, 0, 5842, 5653, 5847, 5791, 5853, 5543, 5808, 5808,
+ 5841, 5848, 650, 5856, 5867, 5869, 5871, 5873, 5891, 5875,
+ 5888, 5902, 5917, 5898, 5911, 608, 5914, 5918, 5925, 5936,
+
+ 5928, 5950, 5939, 5946, 5604,24618, 5817, 5741, 5977, 5786,
+ 5957, 5981, 5984, 5995, 5999, 6004, 6018, 5850, 5829, 6079,
+ 843, 6140, 6014, 6035, 6063, 6016, 6032, 6039, 6050, 6202,
+ 6265, 6323, 0, 6105, 6090, 6115, 6107, 5979, 6012, 6037,
+ 6120, 6085, 6044, 6134, 6048, 6052, 6151, 5919, 5879, 6156,
+ 6058, 6061, 604, 6067, 6166, 6116, 6121, 570, 6162, 6175,
+ 6172, 6182, 6185, 6155, 6218, 6189, 6220, 6237, 858, 6280,
+ 6244, 6247, 6249, 6339, 6187, 552, 6347, 6214, 6216, 6362,
+ 24618, 6226, 531, 6231, 6099, 6296, 5945, 5995, 6260, 6158,
+ 6285, 6250, 6115, 6299, 6303, 6184, 6255, 6204, 6233, 509,
+
+ 6307, 6309, 6334, 6357, 6360, 6368, 6375, 6382, 6336, 6388,
+ 6411, 6399, 480, 6405, 6407, 6416, 6418, 6425, 6429, 6432,
+ 6435, 6437, 6448, 6246, 6375, 6468, 6451, 905, 6529, 6466,
+ 6482, 6498, 6408, 6423, 6484, 6513, 6535, 6486, 6596, 6496,
+ 6516, 6539, 6550, 6556, 6561, 6657, 6571, 6575, 6719, 6772,
+ 6836, 6880, 6611,24618, 6622, 6627, 6636, 6445, 433, 6651,
+ 6447, 6462, 6640, 6668, 6494, 429, 6674, 6467, 6641, 6499,
+ 426, 6511, 6544, 6558, 6577, 422, 6581, 6584, 6593, 6683,
+ 6606, 966, 6692, 6663, 6680, 6698, 6735, 6737, 6739, 6750,
+ 6756, 6787, 6789, 6791, 6896, 418, 6902, 6623, 6919, 6924,
+
+ 6689, 6699, 6705, 6759, 6952, 6744, 398, 6968, 6746, 394,
+ 6797, 6800, 6802, 6328, 6815, 6336, 6818, 6374, 6802, 6657,
+ 6681, 6852, 6680, 1015, 6734, 6813, 6815, 6983, 6817, 6819,
+ 6999, 6864, 6966, 6846, 6978, 6996, 6866, 6858, 7021, 6823,
+ 6853, 7036, 6856, 6859, 7051, 7045, 7057, 6939, 7064, 7067,
+ 7069, 7088, 7092, 6535, 7131, 970, 7192, 6937, 7108, 7137,
+ 6950, 7009, 7115, 7118, 7148, 7111, 1148, 7253, 6891, 6841,
+ 7154, 7165, 7177, 7314, 7180, 7209, 7237, 7206, 7270, 7211,
+ 7213, 7224, 7235, 7293, 7375, 7241, 7267, 7299, 7279, 7437,
+ 7495, 7319, 7558, 7602, 7646, 7339, 7354, 7356, 350, 7369,
+
+ 6862, 6922, 7015, 7030, 7072, 342, 7388, 7401, 328, 7410,
+ 7092, 7105, 7125, 6947, 7163, 7174, 7416, 7189, 7218, 7451,
+ 7222, 7283, 7460, 7286, 7289, 7466, 7510, 1598, 7524, 7324,
+ 7350, 7363, 7392, 7398, 1665, 7530, 7472, 7476, 7482, 7573,
+ 7540, 7542, 7544, 7577, 7617, 7583, 7587, 7296, 7662, 7665,
+ 7322, 7680, 7336, 7422, 7519, 7340, 7382, 7407, 7695, 7611,
+ 7479, 7724, 306, 7739, 7424, 7754, 7757, 7445, 7447, 7675,
+ 7708, 7504, 7506, 7508, 7537, 7567, 7585, 6879, 7622, 7632,
+ 6914, 7011, 6922, 1552, 7015, 7589, 7626, 7794, 7809, 7628,
+ 7632, 7824, 7827, 7659, 7668, 7776, 7830, 7711, 7837, 7822,
+
+ 7841, 7721, 7759, 7706, 7737, 7770, 7879, 7894, 7772, 7780,
+ 7909, 7912, 7783, 7788, 7854, 7861, 7850, 7915, 7922, 7926,
+ 7935, 7931, 7947, 7876, 7965, 7983, 7928, 8044, 7961, 7979,
+ 7993, 7996, 7999, 8009, 8105, 8011, 8013, 8166, 1777, 8227,
+ 8023, 8026, 8061, 8041, 8058, 8063, 8074, 6935, 7014, 8078,
+ 8080, 1922, 8084, 8102, 8128, 8132, 8146, 8288, 8134, 8151,
+ 8350, 8407, 8460, 8182, 8188, 8196, 7791, 7846, 7858, 8118,
+ 7873, 7949, 7986, 8192, 8201, 303, 8210, 8028, 8039, 8067,
+ 8087, 8091, 8113, 8221, 8139, 8149, 8153, 8240, 7114, 8161,
+ 8164, 8253, 8262, 8183, 8207, 8234, 8236, 8247, 8249, 8268,
+
+ 8282, 8259, 8276, 8294, 8296, 8298, 8309, 8311, 8314, 8324,
+ 8328, 8330, 8366, 8372, 2013, 8386, 8334, 8384, 8423, 8425,
+ 8427, 2042, 8429, 8441, 8304, 8332, 8336, 8477, 8360, 8483,
+ 8499, 8362, 8514, 8380, 8503, 8509, 8486, 8437, 8542, 8392,
+ 8394, 8512, 8447, 8431, 8558, 8573, 8435, 8589, 8540, 8560,
+ 8568, 8571, 8575, 8577, 8617, 8599, 8603, 8605, 8615, 8625,
+ 8630, 8632,24618, 8634, 8636, 8643, 7174, 7017, 7051, 7102,
+ 1658, 8648, 8664, 8646, 8650, 8652, 8658, 8681, 8670, 8661,
+ 8677, 8666, 8694, 8707, 8709, 8725, 8730, 8736, 8712, 8733,
+ 8738, 8743, 8773, 8757, 8751, 8746, 8753, 8762, 8789, 8801,
+
+ 8799, 8814, 8817, 8821, 8855, 8828, 8849, 8871, 8833, 8886,
+ 8835, 8851, 8865, 8881, 8907, 8952, 8838, 8884, 8920, 8934,
+ 8913, 8947, 8969, 8931, 9030, 8949, 8973, 8975, 8979, 8995,
+ 9005, 9091, 9012, 9009, 7206, 7137, 9015, 2427, 9037, 9047,
+ 9049, 9051, 9061, 9067, 9065, 9098, 9078, 9153, 9197, 9254,
+ 8783, 8810, 8853, 9071, 8868, 8902, 8916, 8985, 9117, 8982,
+ 8992, 9018, 9024, 9045, 9132, 9088, 9100, 9106, 9167, 9108,
+ 9114, 9123, 9173, 9126, 9128, 9138, 9211, 9219, 9161, 9163,
+ 7252, 9179, 9181, 9228, 9183, 9205, 9234, 9240, 9269, 9271,
+ 9274, 9281, 9284, 9288, 9290, 9304, 9299, 9302, 9314, 9316,
+
+ 9318, 9320, 9330, 9332, 9334, 9336, 9346, 3066, 9348, 9350,
+ 9352, 9207, 9209, 299, 9225, 9354, 9356, 9358, 9360, 9377,
+ 9362, 9365, 9371, 9375, 9392, 9406, 9395, 9422, 9426, 9403,
+ 9450, 9420, 9429, 9432, 9424, 9463, 9483, 9435, 9439, 9478,
+ 9466, 9448, 251, 9468, 9480, 9500, 9518, 7237, 9526, 9520,
+ 9496, 9506, 9523, 9532, 9535, 9537, 9543, 9555, 9553, 9559,
+ 9557, 9561, 9571, 9567, 9575, 9593, 9580, 9608, 9603, 9582,
+ 9606, 3273, 9610, 9623, 9627, 9630, 9633, 9693, 9637, 9644,
+ 9648, 9650, 9654, 9754, 9660, 9687, 9709, 9667, 9724, 9672,
+ 9703, 9741, 9719, 9761, 9815, 9722, 9751, 9781, 9785, 1795,
+
+ 7298, 9788, 9791, 9876, 9803, 9810, 9937, 9821, 9831, 9833,
+ 9836, 9838, 9857, 7386, 9999,10048, 9670, 9674, 212, 9676,
+ 9771, 9681, 9706, 9797, 9850, 9799, 9841, 9844, 9887, 9893,
+ 9860, 9864, 9870, 9899, 197, 9902, 9911, 9917, 9905, 9931,
+ 3549, 9933, 9943, 9953, 9955, 9958, 9968, 9965, 9978, 9980,
+ 9982,10014,10020,10024,10026,10030,10063,10069,10073,10079,
+ 9907, 177, 9918, 9951, 9963,10077,10033, 9983,10075,10087,
+ 10089,10028,10059, 152,10091,10094,10097,10099,10103,10118,
+ 10124,10133,10106, 148,10136,10138,10144, 7307,10146,10148,
+ 10151,10158,10170,10164,10190,10174,10195,10192,10199,10206,
+
+ 10166,10218,10214,10229,10216,10240,10243, 3703,10245,10247,
+ 10250,10261,10263,10265,10267,10277,10279,10281,10283, 3736,
+ 10293,10298,10303,10315,10309,10369,10328,10335, 2191, 7501,
+ 10330,10342,10430,10491,10345,10347,10375,10412,10349,10363,
+ 10391,10401,10396,10440,10398,10447,10458,10460,10553,10597,
+ 10224, 132,10325,10352,10357,10377,10384, 129,10406,10471,
+ 10409, 39,10415,10456,10465,10485, 3864,10487,10497,10508,
+ 10513,10518, 4069,10520,10531,10525,10537,10568,10574,10580,
+ 10584,10612,10614,10506,10527,10616,10539,10562,10632,10582,
+ 10626,10638,10642,10645,10610,10564, 33,10648,10651,10658,
+
+ 10663,10660,10674,10676,10678,10681,10685,10687,10689,10701,
+ 10703,10705, 7405,10711,10714,10716,10718,10739,10727,10750,
+ 10721,10748,10752,10754,10775,10759,10786,10782,10788,10817,
+ 10792,10798,10878,10811,10804,10823,10827,10839,10849,10834,
+ 4138,10844,10861,10866,10884,10872,10897,10907,10910,10912,
+ 2589,10941,10944,10914,10926,10946,10958,11021,10970,10996,
+ 10963,10975,10986,11002,11037,11042,11099,10724,10756,11047,
+ 10800,10813,11056,10832, 29,10846,10887,10891,10894,10930,
+ 11065,10960,10981,11074,11008,11053,11114,11063,11081,11128,
+ 11084, 4278,11086,11124,11126,11138,11142,11152,11018,11035,
+
+ 11163,11169,11108,11110,11185,11191,11112,11135,11140,11146,
+ 11189,11179,11200,11211,11195,11218,11150,11158,11252,11222,
+ 11225,11268,11248,11265,11239,11275,11278,11282,11227,11234,
+ 11250,11284,11287,11289, 7623,11294,11296,11305,11313,11329,
+ 11316,11310,11332,11340,11354,11343,11350,11402,11463,11356,
+ 11367,11384,11419,11369,11372,11386,11389,11382,11399,11429,
+ 11433,11445,11477,11448,11479,11529,11481,11494,11590,11497,
+ 11504,11511,11508,11515,11545,11539,11564,11575,11577,11587,
+ 11604,11617,11620,11631,11634,11683,11417,11460,11649,11655,
+ 11483,11517,11527,11542,11547,11557,11664,11573,11613,11697,
+
+ 11636,11638,11703,11712,11643,11661,11670,11691,11709,11719,
+ 11730,11736,11726,11742,11746,11748,11752,11758,11762,11768,
+ 11772,11778,11784,11789,11724,11756,11786,11791,11807,11802,
+ 11816,11794,11804,11825,11837,11862,11849,11820,11833,11873,
+ 11889,11842,11859,11906,11909,11867,11883,11886,11903,11922,
+ 11915,11925,11932,11935,11950,11919,11961,11961,11943,11966,
+ 11973,11970,11975,11977,11979,12013,12018,11998,12028,12032,
+ 12034,12097,12045,12039,12049,12066,12062,12079,12112,12114,
+ 12076,12083,12170,12231,12119,12124,12139,12154,12137,12141,
+ 12157,12167,12185,12180,12191,12214,12196,12245,12249,12152,
+
+ 12225,12247,12261,12263,12280,12275,12297,12324,12002,12055,
+ 12299,12072,12126,12338,12344,12198,12203,12218,12228,12278,
+ 12295,12353,12311,12350,12367,12363,12373,12383,12389,12377,
+ 12379,12395,12399,12397,12401,12403,12361,12405,12407,12423,
+ 12418,12440,12434,12453,12457,12305,12307,12420,12428,12486,
+ 12460,12462,12467,12474,12483,12494,12519,12501, 0,12515,
+ 12517,12540,12522,12538,12545,12562,12549,12551,12556,12573,
+ 12575,12578,12585,12601,12588,12612,12615,12629,12644,12618,
+ 12631,12646,12648,12711,12650,12663,12660,12665,12685,12718,
+ 12729,12708,12687,12734,12746,12740,12751,12757,12772,12341,
+
+ 24618,12426,12527,12689,12774,12777,12791,12770,12785,12789,
+ 12797,12810,12799,12821,12816,12832,12804,12828,12830,12837,
+ 12842,12852,12855,12857,12878,12859,12881,12864,12892,12875,
+ 12898,12895,12911,12905,12908,12922,12926,12928,12939,12933,
+ 12963,12950,12966,12970,12968,12973,12991,12985,12995,13006,
+ 13001,13026,13012,13028,13032,13044,13038,13060,13048,13034,
+ 13056,13062,13075,13072,13086,13092,13094,13096,13102,13113,
+ 13107,13133,13119,13138,13150,13135,13154,13165,13159,13171,
+ 13175,13177,13187,13182,13193,13199,13212,13214,13216,13219,
+ 13230,13241,13247,13261,13257,13272,13278,13282,13284,13296,
+
+ 13286,13280,13116,13289,13309,13291,13305,13312,13318,13323,
+ 13320,13346,13349,13360,13363,13356,13367,13373,13384,13380,
+ 13390,13397,13394,13426,13423,13449,13400,13430,13462,13451,
+ 13435,13407,13428,13464,13466,13457,13468,13475,13487,13491,
+ 13485,13498,13504,13521,13502,13524,13531,13542,13548,13558,
+ 13560,13564,13566,13569,13581,13576,13579,13587,13589,13591,
+ 13607,13623,13628,13640,13642,13644,13654,13656,13658,13672,
+ 13675,13687,13661,13691,13693,13701,13708,13712,13714,13725,
+ 13719,13736,13732,13748,13754,13766,13752,13782,13785,13779,
+ 13800,13804,13741,13815,13788,13818,13820,13832,13836,13842,
+
+ 13847,13849,13853,13864,13866,13868,13879,13882,13884,13898,
+ 13901,13914,24618,13933,13944,13955,13966,13977,13988,13999,
+ 14010,14021,14032,14043,14054,14064,14074,14085,14089,14100,
+ 14104,14115,14126,14130,14141,14152,14163,14174,14178,14189,
+ 14193,14204,14208,14219,14223,14234,14245,14249,14259,14270,
+ 14274,14278,14289,14300,14304,14308,14319,14330,14341,14345,
+ 14349,14360,14371,14382,14393,14404,14408,14412,14423,14434,
+ 14438,14442,14453,14464,14468,14472,14483,14494,14498,14502,
+ 14513,14524,14535,14539,14543,14553,14564,14575,14586,14597,
+ 14608,14619,14630,14641,14652,14663,14674,14685,14696,14707,
+
+ 14718,14729,14740,14751,14762,14773,14784,14795,14806,14817,
+ 14828,14838,14849,14860,14871,14882,14893,14904,14915,14926,
+ 14937,14948,14959,14970,14980,14991,15002,15013,15024,15035,
+ 15046,15057,15068,15079,15090,15101,15112,15123,15134,15145,
+ 15156,15167,15178,15189,15200,15211,15222,15233,15244,15255,
+ 15266,15277,15288,15299,15310,15321,15332,15343,15354,15365,
+ 15375,15385,15389,15400,15411,15422,15433,15444,15455,15466,
+ 15477,15488,15499,15510,15521,15532,15543,15554,15565,15576,
+ 15587,15598,15609,15620,15631,15642,15653,15664,15675,15686,
+ 15697,15708,15719,15730,15741,15752,15763,15774,15785,15796,
+
+ 15807,15818,15829,15840,15851,15862,15873,15884,15892,15903,
+ 15914,15925,15936,15947,15958,15969,15980,15991,16002,16013,
+ 16024,16035,16046,16057,16068,16079,16090,16101,16112,16123,
+ 16134,16145,16156,16167,16178,16189,16200,16211,16221,16232,
+ 16243,16254,16265,16276,16287,16298,16309,16320,16331,16342,
+ 16353,16364,16375,16386,16397,16408,16419,16430,16441,16452,
+ 16463,16474,16485,16496,16507,16518,16529,16539,16550,16561,
+ 16572,16583,16594,16605,16616,16627,16638,16649,16660,16671,
+ 16682,16693,16704,16715,16726,16737,16748,16759,16770,16781,
+ 16792,16803,16814,16825,16836,16847,16858,16869,16880,16891,
+
+ 16902,16913,16924,16935,16946,16957,16968,16979,16990,17001,
+ 17012,17023,17034,17045,17056,17067,17077,17088,17099,17110,
+ 17121,17132,17143,17154,17165,17175,17186,17197,17208,17219,
+ 17230,17241,17252,17263,17274,17285,17296,17307,17318,17329,
+ 17340,17351,17362,17373,17383,17393,17404,17415,17426,17437,
+ 17448,17459,17470,17481,17492,17503,17514,17525,17536,17547,
+ 17558,17569,17580,17591,17602,17613,17624,17635,17646,17657,
+ 17668,17679,17690,17701,17712,17723,17734,17745,17756,17767,
+ 17778,17789,17800,17811,17822,17833,17844,17855,17866,17877,
+ 17888,17899,17910,17921,17932,17943,17954,17965,17976,17987,
+
+ 17998,18009,18020,18031,18042,18053,18064,18075,18085,18096,
+ 18107,18118,18129,18140,18151,18162,18173,18184,18195,18206,
+ 18217,18228,18239,18250,18261,18272,18283,18294,18305,18316,
+ 18327,18338,18349,18360,18371,18382,18392,18402,18413,18424,
+ 18435,18446,18457,18468,18479,18490,18501,18512,18523,18534,
+ 18545,18556,18567,18578,18589,18600,18611,18622,18633,18644,
+ 18655,18666,18677,18688,18699,18710,18721,18732,18743,18754,
+ 18765,18776,18787,18798,18809,18820,18831,18842,18853,18864,
+ 18875,18886,18897,18908,18919,18930,18941,18952,18963,18974,
+ 18985,18996,19007,19018,19029,19040,19051,19062,19073,19084,
+
+ 19095,19106,19117,19128,19139,19150,19161,19172,19183,19194,
+ 19205,19216,19227,19238,19249,19260,19271,19282,19293,19304,
+ 19315,19326,19337,19348,19359,19370,19381,19392,19403,19414,
+ 19425,19436,19447,19458,19469,19480,19491,19502,19513,19524,
+ 19535,19546,19557,19568,19579,19590,19601,19612,19623,19634,
+ 19645,19656,19667,19678,19689,19700,19711,19722,19733,19744,
+ 19755,19766,19777,19788,19799,19810,19821,19832,19843,19854,
+ 19865,19876,19887,19898,19909,19920,19931,19942,19953,19964,
+ 19975,19986,19997,20008,20019,20030,20041,20052,20063,20074,
+ 20085,20096,20107,20118,20129,20140,20151,20162,20173,20184,
+
+ 20195,20206,20217,20228,20239,20250,20261,20272,20283,20294,
+ 20305,20316,20327,20338,20349,20360,20371,20382,20393,20404,
+ 20415,20426,20437,20448,20459,20470,20481,20492,20503,20514,
+ 20525,20536,20547,20558,20569,20580,20591,20602,20613,20624,
+ 20635,20646,20657,20668,20679,20690,20701,20712,20723,20734,
+ 20745,20756,20767,20778,20789,20800,20811,20822,20833,20844,
+ 20855,20866,20877,20888,20899,20910,20921,20932,20943,20954,
+ 20965,20976,20987,20998,21009,21020,21031,21042,21053,21064,
+ 21075,21086,21097,21108,21119,21130,21141,21152,21163,21174,
+ 21185,21196,21207,21218,21229,21240,21251,21262,21273,21284,
+
+ 21295,21306,21317,21328,21339,21350,21361,21372,21383,21394,
+ 21405,21416,21427,21438,21449,21460,21471,21482,21493,21504,
+ 21515,21526,21537,21548,21559,21570,21581,21592,21603,21614,
+ 21625,21636,21647,21658,21669,21680,21691,21702,21713,21724,
+ 21735,21746,21757,21768,21779,21790,21801,21812,21823,21834,
+ 21845,21856,21867,21878,21889,21900,21911,21922,21933,21944,
+ 21955,21966,21977,21988,21999,22010,22021,22032,22043,22054,
+ 22065,22076,22087,22098,22109,22120,22131,22142,22153,22164,
+ 22175,22186,22197,22208,22219,22230,22241,22252,22263,22274,
+ 22285,22296,22307,22318,22329,22340,22351,22362,22373,22384,
+
+ 22395,22406,22417,22428,22439,22450,22461,22472,22483,22494,
+ 22505,22516,22527,22538,22549,22560,22571,22582,22593,22604,
+ 22615,22626,22637,22648,22659,22670,22681,22692,22703,22714,
+ 22725,22736,22747,22758,22769,22780,22791,22802,22813,22824,
+ 22835,22846,22857,22868,22879,22890,22901,22912,22923,22934,
+ 22945,22956,22967,22978,22989,23000,23011,23022,23033,23044,
+ 23055,23066,23077,23088,23099,23110,23121,23132,23143,23154,
+ 23165,23176,23187,23198,23209,23220,23231,23242,23253,23264,
+ 23275,23286,23297,23308,23319,23330,23341,23352,23363,23374,
+ 23385,23396,23407,23418,23429,23440,23451,23462,23473,23484,
+
+ 23495,23506,23517,23528,23539,23550,23561,23572,23583,23594,
+ 23605,23616,23627,23638,23649,23660,23671,23682,23693,23704,
+ 23715,23726,23737,23748,23759,23770,23781,23792,23803,23814,
+ 23825,23836,23847,23858,23869,23880,23891,23902,23913,23924,
+ 23935,23946,23957,23968,23979,23990,24001,24012,24023,24034,
+ 24045,24056,24067,24078,24089,24100,24111,24122,24133,24144,
+ 24155,24166,24177,24188,24199,24210,24221,24232,24243,24254,
+ 24265,24276,24287,24298,24309,24320,24331,24342,24353,24364,
+ 24375,24386,24397,24408,24419,24430,24441,24452,24463,24474,
+ 24485,24496,24507,24518,24529,24540,24551,24562,24573,24584,
+
+ 24595,24606
+ } ;
+
+static yyconst flex_int16_t yy_def[3803] =
+ { 0,
+ 2814, 2814, 2813, 3, 2815, 2815, 2814, 2814, 2816, 2816,
+ 2814, 2814, 2817, 2817, 2818, 2818, 2819, 2819, 2820, 2820,
+ 2821, 2821, 2813, 23, 2814, 2814, 2814, 2814, 2822, 2822,
+ 2813, 2813, 2813, 2823, 2813, 2813, 2824, 2813, 2813, 2823,
+ 2825, 2826, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
+ 2827, 2827, 2827, 2827, 2827, 46, 2827, 2827, 2827, 2813,
+ 2828, 2827, 2829, 2830, 2813, 2831, 2832, 2813, 2833, 2834,
+ 2835, 2836, 2813, 2837, 2836, 2836, 2838, 2813, 2813, 2839,
+ 2840, 2813, 2813, 2841, 2842, 2813, 2843, 2844, 2813, 2813,
+ 2813, 2813, 2845, 2845, 2845, 2845, 2845, 2845, 2845, 2845,
+
+ 2845, 2845, 2845, 2845, 2846, 2813, 2813, 2823, 2813, 2813,
+ 2824, 2847, 2813, 2813, 2813, 2824, 2813, 2813, 2813, 2825,
+ 2813, 2826, 2848, 2813, 2813, 2849, 2827, 2827, 2827, 2827,
+ 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
+ 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
+ 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827,
+ 2827, 2827, 2827, 2813, 2813, 2824, 2824, 2850, 2828, 169,
+ 169, 169, 169, 2827, 2851, 2852, 2853, 2854, 2855, 2856,
+ 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2813, 2813,
+ 2865, 2864, 2864, 2866, 2813, 2813, 2867, 2868, 2869, 2870,
+
+ 2813, 2813, 2813, 2871, 2872, 2873, 2874, 2875, 2876, 2877,
+ 2878, 2879, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880,
+ 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880,
+ 2880, 2881, 2882, 2882, 234, 2883, 2884, 2885, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
+ 2887, 2887, 2887, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2813, 2888, 2888, 288, 288,
+ 288, 288, 2886, 2813, 2813, 2865, 2813, 2880, 2880, 2880,
+
+ 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880,
+ 2880, 2880, 2880, 2880, 2880, 2880, 2880, 234, 234, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
+ 2886, 2887, 2887, 2887, 2886, 2886, 2886, 2813, 2813, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2813, 2886, 2886,
+ 2886, 2813, 288, 288, 288, 288, 288, 288, 338, 2813,
+ 2813, 2886, 2886, 2886, 2886, 2886, 2886, 2813, 2880, 2880,
+ 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880,
+
+ 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 234,
+ 234, 2886, 2886, 2886, 2813, 2813, 2886, 2886, 2886, 2886,
+ 2886, 2886, 2886, 2886, 338, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2886, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2813, 2813, 2889, 2813, 2813,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2813, 2813, 2890, 2813,
+ 2886, 2886, 2886, 372, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2891, 2891, 2892, 2892, 2892, 288, 288, 288, 288, 379,
+ 2813, 2813, 2813, 2813, 2886, 2886, 2886, 2886, 2886, 2886,
+
+ 2813, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880,
+ 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2813, 2813, 2813,
+ 2893, 2813, 2880, 2880, 2813, 2894, 234, 234, 2886, 2886,
+ 2813, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2889, 2813, 2813,
+ 2889, 2895, 2813, 2813, 2813, 2886, 2886, 2886, 2886, 2886,
+ 2886, 2890, 2896, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2892, 2892, 2892, 288, 288, 288, 2813, 2813,
+ 2886, 2886, 2886, 2886, 2886, 2886, 2880, 2880, 2880, 2880,
+ 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880,
+ 2880, 2880, 2893, 2893, 2897, 2813, 2813, 2813, 2880, 2880,
+ 2894, 2898, 2813, 234, 234, 2886, 2886, 2813, 2886, 2886,
+ 2886, 2886, 2886, 2886, 2813, 2886, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2887, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2886, 2886,
+ 2886, 2886, 2886, 2813, 2813, 2886, 2886, 2886, 2813, 2886,
+ 2886, 2886, 2886, 2886, 2813, 2813, 2813, 2895, 2899, 2900,
+
+ 2813, 2813, 2886, 2886, 2886, 2886, 2813, 2896, 2901, 2902,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 288, 288,
+ 288, 2813, 2886, 2886, 2886, 2886, 2886, 2886, 2880, 2880,
+ 2880, 2880, 2813, 2880, 2880, 2880, 2813, 2813, 2880, 2880,
+ 2880, 2880, 2880, 2880, 2813, 2897, 2903, 2904, 2880, 2813,
+ 2898, 2905, 2906, 234, 234, 2886, 2886, 2886, 2813, 2886,
+ 2886, 2886, 2886, 2886, 2813, 2886, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2886,
+ 2886, 2886, 2813, 2813, 2813, 2886, 2886, 2813, 2886, 2886,
+
+ 2813, 2813, 2813, 2900, 2899, 2907, 2900, 2900, 2900, 2908,
+ 2900, 2900, 2900, 2886, 2886, 2886, 2886, 2902, 2901, 2909,
+ 2902, 2902, 2902, 2910, 2902, 2902, 2902, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 288, 2891, 2891, 2911, 2891,
+ 2891, 288, 288, 288, 2813, 2886, 2886, 2886, 2886, 2886,
+ 2912, 2813, 2880, 2880, 2880, 2813, 2880, 2880, 2813, 2813,
+ 2813, 2880, 2880, 2880, 2904, 2903, 2913, 2904, 2904, 2914,
+ 2880, 2906, 2905, 2915, 2906, 2906, 2916, 234, 2891, 2891,
+ 2917, 2891, 2891, 2886, 2886, 2886, 2813, 2886, 2886, 2886,
+ 2886, 2813, 2886, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2886, 2813, 2813, 2886, 2886, 2813, 2886, 2813, 2813, 2907,
+ 2907, 2907, 2918, 2919, 2907, 2907, 2907, 2908, 2908, 2920,
+ 2900, 2900, 2900, 2886, 2886, 2886, 2886, 2909, 2909, 2909,
+ 2921, 2922, 2909, 2909, 2909, 2910, 2910, 2923, 2902, 2902,
+ 2902, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2912, 288,
+ 2911, 2891, 2891, 2911, 2924, 2891, 2891, 2891, 288, 288,
+ 2813, 2886, 2886, 2886, 2886, 2886, 2925, 2880, 2880, 2880,
+ 2813, 2880, 2813, 2813, 2880, 2880, 2926, 2926, 2927, 2928,
+ 2929, 2929, 2930, 2931, 2880, 2932, 2932, 2933, 2934, 2935,
+
+ 2935, 2936, 2937, 2938, 2939, 2939, 2940, 2891, 2891, 2891,
+ 2886, 2886, 2813, 2813, 2813, 2941, 2813, 2886, 2813, 2942,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2943,
+ 2813, 2813, 2886, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2944, 2944, 2944, 2945, 2946, 2946, 2946, 2947, 2813, 2946,
+ 2946, 2946, 2945, 2945, 2948, 2949, 2949, 2948, 2948, 2886,
+ 2886, 2886, 2950, 2950, 2950, 2951, 2952, 2952, 2952, 2953,
+ 2813, 2952, 2952, 2952, 2951, 2951, 2954, 2955, 2955, 2954,
+ 2954, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2891, 2891,
+ 2956, 2891, 2891, 2891, 2891, 2957, 2958, 2959, 2891, 2891,
+
+ 2960, 2960, 2943, 2886, 2886, 2886, 2886, 2813, 2961, 2962,
+ 2963, 2813, 2813, 2964, 2813, 2813, 2965, 2813, 2813, 2813,
+ 2813, 2813, 2966, 2966, 2966, 2967, 2968, 2968, 2969, 2813,
+ 2970, 2971, 2971, 2972, 2972, 2972, 2973, 2974, 2974, 2975,
+ 2813, 2976, 2977, 2977, 2891, 2891, 2978, 2891, 2891, 2979,
+ 2980, 2981, 2886, 2982, 2982, 2983, 2813, 2813, 2984, 2813,
+ 2985, 2986, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2987, 2987, 2813, 2886, 2813, 2813, 2813, 2813, 2813,
+ 2988, 2988, 2989, 2990, 2991, 2991, 2992, 2992, 2992, 2993,
+ 2993, 2886, 2886, 2994, 2994, 2995, 2996, 2997, 2997, 2998,
+
+ 2998, 2998, 2999, 2999, 2813, 2813, 2813, 2813, 2813, 2813,
+ 3000, 3000, 3001, 2891, 2891, 3002, 2891, 2891, 2891, 3003,
+ 3004, 3005, 3003, 3003, 3003, 3006, 3003, 3003, 3003, 3007,
+ 3007, 3008, 2987, 2886, 2886, 2886, 3009, 3010, 3010, 3011,
+ 2813, 2813, 3012, 2813, 3013, 3014, 2813, 2813, 2813, 2813,
+ 3015, 3015, 3016, 3017, 3018, 3019, 3019, 3020, 3021, 3022,
+ 3023, 3023, 3024, 2891, 2891, 3025, 2891, 3026, 3027, 3028,
+ 3026, 3026, 3029, 2813, 3030, 3031, 3032, 3033, 3034, 2813,
+ 2813, 3035, 3036, 3037, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 3038, 2813, 3039, 2813, 2813, 2813, 2813, 3040, 3041,
+
+ 3042, 3040, 3043, 3044, 3044, 3045, 3045, 3046, 3046, 3039,
+ 3039, 3047, 3048, 3049, 3047, 3050, 3051, 3051, 3052, 3052,
+ 3053, 3053, 2813, 2813, 2813, 3054, 3055, 3056, 3057, 3058,
+ 3059, 3054, 3054, 3054, 3060, 3060, 3060, 3061, 3062, 3060,
+ 3060, 3060, 3063, 3063, 3064, 3065, 3065, 3065, 3066, 3066,
+ 3067, 3067, 3068, 2813, 3039, 3039, 2813, 3069, 3070, 3071,
+ 3072, 3073, 2813, 2813, 3074, 3075, 3076, 2813, 2813, 3077,
+ 3078, 3079, 3077, 3080, 3081, 3082, 3083, 3081, 3084, 3085,
+ 3086, 3087, 3088, 3089, 3090, 3085, 3091, 3091, 3092, 3093,
+ 3094, 3094, 3095, 3096, 3097, 3098, 3099, 3097, 3097, 3097,
+
+ 3100, 3097, 3097, 3097, 2813, 3101, 3102, 3103, 3104, 3105,
+ 3106, 3104, 3107, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 3108, 2813, 2813, 2813, 2813, 3109, 3110, 3111, 3112, 3113,
+ 3114, 3111, 3111, 3115, 3115, 3116, 3116, 2813, 3117, 3118,
+ 3119, 3120, 3121, 3122, 3123, 3120, 3120, 3124, 3124, 3125,
+ 3125, 3126, 2813, 2813, 3127, 3128, 3129, 3127, 3127, 3127,
+ 3130, 3127, 3127, 3127, 3131, 3132, 3133, 3134, 3131, 3131,
+ 3135, 3135, 3135, 3136, 3137, 3137, 3137, 3138, 3131, 3137,
+ 3137, 3137, 3136, 3136, 3139, 3140, 3140, 3139, 3139, 3141,
+ 3141, 3142, 3143, 3144, 3144, 3145, 3146, 3147, 3148, 3149,
+
+ 3147, 3147, 3150, 2813, 3151, 3152, 3153, 3154, 3155, 3156,
+ 3154, 3154, 3157, 2813, 3158, 3159, 3160, 3161, 3162, 3163,
+ 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3170,
+ 3170, 3173, 3174, 3175, 3176, 3177, 3178, 3178, 3178, 3179,
+ 3180, 3180, 3181, 3174, 3182, 3183, 3183, 3184, 3184, 3184,
+ 3185, 3186, 3184, 3184, 3184, 3187, 3187, 3188, 3189, 3189,
+ 3189, 3190, 3191, 3192, 3190, 3190, 3190, 3193, 3190, 3190,
+ 3190, 3194, 3195, 3196, 3197, 3198, 3199, 2813, 2813, 2813,
+ 2813, 3200, 2813, 2813, 2813, 3201, 3201, 3202, 3203, 3204,
+ 3204, 3203, 3203, 3205, 3203, 3203, 3203, 3206, 3206, 3207,
+
+ 3207, 3208, 3208, 3209, 3210, 3210, 3211, 3212, 3213, 3213,
+ 3212, 3212, 3214, 3212, 3212, 3212, 3215, 3215, 3216, 3216,
+ 3217, 3217, 2813, 3218, 3218, 3218, 3219, 3220, 3218, 3218,
+ 3218, 3221, 3221, 3222, 3223, 3223, 3223, 3224, 3225, 3226,
+ 3224, 3224, 3224, 3227, 3224, 3224, 3224, 3228, 3228, 3229,
+ 3229, 3230, 3231, 3232, 3232, 3233, 3233, 3233, 3234, 3234,
+ 3235, 3235, 3236, 2813, 3237, 3238, 3239, 3239, 3240, 3241,
+ 3242, 3242, 3243, 3244, 3245, 3246, 3247, 3245, 3245, 3248,
+ 3249, 3249, 3250, 3251, 3252, 3252, 3253, 3254, 2813, 3255,
+ 3255, 3256, 3257, 3258, 3258, 3257, 3259, 3260, 3260, 3261,
+
+ 3262, 3263, 3263, 3262, 3264, 3265, 3265, 3266, 3267, 3268,
+ 3268, 3269, 3270, 3271, 3272, 3273, 3271, 3271, 3274, 3275,
+ 3275, 3276, 3277, 3278, 3279, 3279, 3279, 3280, 3281, 3281,
+ 3281, 3282, 2813, 3281, 3281, 3281, 3280, 3280, 3283, 3284,
+ 3284, 3283, 3283, 3285, 3285, 3285, 3286, 3287, 3285, 3285,
+ 3285, 3288, 3288, 3289, 3290, 3290, 3290, 3291, 3291, 3292,
+ 3293, 3294, 2813, 3295, 3296, 3296, 2813, 2813, 3297, 2813,
+ 2813, 3298, 3298, 3299, 3298, 3298, 3298, 3298, 3300, 3300,
+ 3301, 3301, 3302, 3302, 3303, 3303, 3304, 3304, 3305, 3304,
+ 3304, 3304, 3304, 3306, 3306, 3307, 3307, 3308, 3308, 3309,
+
+ 3309, 3310, 3310, 3310, 3311, 3312, 3312, 3312, 3313, 3314,
+ 3312, 3312, 3312, 3311, 3311, 3315, 3316, 3316, 3315, 3315,
+ 3317, 3317, 3317, 3318, 3319, 3317, 3317, 3317, 3320, 3320,
+ 3321, 3322, 3322, 3322, 3314, 3314, 3323, 3324, 3325, 3323,
+ 3326, 3327, 3327, 3328, 3328, 3329, 3329, 3330, 3330, 3331,
+ 3332, 3332, 3332, 3333, 3334, 3334, 3335, 2813, 3336, 3337,
+ 3337, 3338, 3338, 3339, 3340, 3341, 3341, 3342, 3343, 3344,
+ 3344, 3344, 3345, 3346, 3346, 3347, 2813, 3348, 3349, 3349,
+ 2813, 3350, 3351, 3350, 3352, 3353, 3352, 3354, 3354, 3354,
+ 3355, 3356, 3356, 3357, 3358, 3359, 3360, 3360, 3361, 3361,
+
+ 3362, 3363, 3364, 3364, 3365, 3366, 3367, 3368, 3369, 3367,
+ 3370, 3371, 3371, 3372, 3373, 3374, 3374, 3375, 3375, 3375,
+ 3376, 3376, 3377, 3377, 3377, 3378, 3379, 3379, 3379, 3380,
+ 2813, 3379, 3379, 3379, 3378, 3378, 3381, 3382, 3382, 3381,
+ 3381, 3383, 3384, 3385, 3386, 2813, 2813, 3387, 2813, 3388,
+ 3388, 3389, 3389, 3390, 3390, 3391, 3391, 3392, 3392, 3393,
+ 3393, 3394, 3394, 3395, 3395, 3396, 3396, 3397, 3397, 3398,
+ 3398, 3399, 3400, 3401, 3401, 3402, 3402, 3402, 3403, 3403,
+ 3404, 3404, 3404, 3405, 3406, 3406, 3406, 3407, 3408, 3406,
+ 3406, 3406, 3405, 3405, 3409, 3410, 3410, 3409, 3409, 3408,
+
+ 3408, 3411, 3412, 3413, 3414, 3415, 3416, 3413, 3413, 3417,
+ 3417, 3418, 3418, 3408, 3419, 3420, 3421, 3421, 3422, 3423,
+ 3424, 3425, 3425, 3425, 3426, 3427, 3427, 3428, 2813, 3429,
+ 3430, 3430, 3431, 3431, 3432, 3433, 3434, 2813, 3435, 3435,
+ 3436, 3437, 3438, 3439, 3439, 3439, 3440, 3441, 3441, 3442,
+ 3408, 3443, 3444, 3444, 3445, 3446, 3447, 3448, 3449, 3450,
+ 3451, 3452, 3453, 3451, 3454, 3455, 3455, 3456, 3456, 3457,
+ 3457, 3458, 3458, 3459, 3460, 3461, 3461, 3462, 3462, 3462,
+ 3463, 3463, 3464, 3465, 3466, 3464, 3467, 3468, 3469, 3469,
+ 3470, 3470, 3471, 3471, 3472, 3472, 3473, 3474, 3474, 3475,
+
+ 3475, 3476, 3476, 3477, 3477, 3478, 3479, 3480, 3481, 3479,
+ 3482, 3483, 3483, 3484, 3484, 3485, 3485, 3486, 3486, 3487,
+ 3488, 3489, 3489, 3490, 3490, 3490, 3491, 3491, 3492, 3492,
+ 3493, 3493, 3494, 3495, 3496, 3496, 3495, 3495, 3497, 3495,
+ 3495, 3495, 3498, 3498, 3499, 3499, 3500, 3500, 3501, 3502,
+ 3503, 3504, 3505, 3503, 3506, 3507, 3507, 3508, 3509, 3510,
+ 3511, 3512, 3513, 3511, 3514, 3515, 3516, 3517, 3515, 3518,
+ 3519, 3519, 3520, 3521, 3522, 3523, 3523, 3524, 3525, 3526,
+ 3526, 3525, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3530,
+ 3530, 3534, 3534, 3535, 3535, 3536, 3537, 3538, 3536, 3539,
+
+ 3540, 3540, 3541, 3541, 3542, 3542, 3543, 3544, 3545, 3546,
+ 3547, 3548, 3549, 3550, 3550, 3551, 3551, 3552, 3552, 3553,
+ 3554, 3554, 3555, 3555, 3556, 3556, 3557, 3558, 3559, 3560,
+ 3561, 3562, 3563, 3560, 3560, 3564, 3564, 3565, 3565, 3566,
+ 3567, 3568, 3566, 3569, 3570, 3570, 3571, 3571, 3572, 3572,
+ 3573, 3574, 3574, 3575, 3574, 3574, 3574, 3574, 3576, 3576,
+ 3577, 3577, 3578, 3578, 3579, 3579, 3580, 3581, 3582, 3583,
+ 3584, 3585, 3586, 3587, 3588, 3589, 3587, 3590, 3591, 3592,
+ 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602,
+ 3603, 3604, 3605, 3603, 3606, 3607, 3608, 3607, 3609, 3609,
+
+ 3610, 3611, 3612, 3612, 3611, 3611, 3613, 3611, 3611, 3611,
+ 3614, 3614, 3615, 3615, 3616, 3616, 3617, 3618, 3619, 3620,
+ 3621, 3622, 3619, 3619, 3623, 3623, 3624, 3624, 3625, 3625,
+ 3626, 3627, 3628, 3628, 3629, 3630, 3630, 3631, 3631, 3632,
+ 3633, 3633, 3634, 3634, 3635, 3636, 3636, 3637, 3638, 3639,
+ 3639, 3638, 3638, 3640, 3638, 3638, 3638, 3641, 3641, 3642,
+ 3642, 3643, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3646,
+ 3646, 3650, 3650, 3651, 3651, 3652, 3652, 3653, 3653, 3654,
+ 3654, 3655, 3655, 3656, 3656, 3657, 3658, 3658, 3659, 3660,
+ 3661, 3661, 3660, 3662, 3663, 3664, 3665, 3666, 3667, 3668,
+
+ 3669, 3669, 3670, 3671, 3672, 3672, 3671, 3673, 3674, 3674,
+ 3675, 3676, 3677, 3677, 3676, 3678, 3679, 3680, 3681, 3682,
+ 3683, 3684, 3685, 3685, 3686, 3685, 3685, 3685, 3685, 3687,
+ 3687, 3688, 3688, 3689, 3689, 3690, 3690, 3691, 3691, 3692,
+ 3693, 3694, 3694, 3693, 3693, 3695, 3693, 3693, 3693, 3696,
+ 3696, 3697, 3697, 3698, 3698, 3699, 3700, 3701, 3701, 3702,
+ 3702, 3703, 3703, 3704, 3704, 3705, 3705, 3706, 3705, 3705,
+ 3705, 3705, 3707, 3707, 3708, 3708, 3709, 3709, 3710, 3710,
+ 3711, 3711, 3712, 3713, 3714, 3714, 3713, 3713, 3715, 3713,
+ 3713, 3713, 3716, 3716, 3717, 3717, 3718, 3718, 3719, 3719,
+
+ 3720, 3720, 3721, 3721, 3722, 3722, 3723, 3724, 3725, 3726,
+ 3725, 3727, 3727, 3728, 3729, 3730, 3730, 3729, 3731, 3732,
+ 3733, 3732, 3734, 3735, 3734, 3736, 3736, 3737, 3738, 3739,
+ 3739, 3738, 3740, 3741, 3741, 3742, 3742, 3743, 3743, 3744,
+ 3744, 3745, 3745, 3746, 3746, 3747, 3746, 3746, 3746, 3746,
+ 3748, 3748, 3749, 3749, 3750, 3750, 3751, 3751, 3752, 3753,
+ 3753, 3754, 3754, 3755, 3755, 3756, 3756, 3757, 3757, 3758,
+ 3758, 3759, 3759, 3760, 3760, 3761, 3761, 3762, 3762, 3763,
+ 3762, 3762, 3762, 3762, 3764, 3764, 3765, 3765, 3766, 3766,
+ 3767, 3767, 3768, 3768, 3769, 3769, 3770, 3770, 3771, 3752,
+
+ 2813, 3772, 3773, 3772, 3774, 3775, 3774, 3776, 3776, 3777,
+ 3777, 3778, 3778, 3779, 3779, 3780, 3781, 3781, 3782, 3782,
+ 3783, 3783, 3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787,
+ 3788, 3788, 3789, 3789, 3790, 3790, 3791, 3791, 3792, 3792,
+ 3793, 3793, 3794, 3795, 3795, 3796, 3796, 3797, 3797, 3798,
+ 3798, 3799, 3799, 3800, 3800, 3801, 3801, 3802, 3776, 3776,
+ 3777, 3777, 3778, 3778, 3779, 3781, 3781, 3782, 3782, 3783,
+ 3783, 3784, 3784, 3785, 3786, 3786, 3787, 3788, 3788, 3789,
+ 3790, 3790, 3791, 3791, 3792, 3792, 3793, 3795, 3795, 3796,
+ 3796, 3797, 3797, 3798, 3798, 3799, 3800, 3800, 3801, 3801,
+
+ 3776, 3776, 3777, 3777, 3778, 3781, 3781, 3782, 3782, 3783,
+ 3783, 3784, 3786, 3788, 3790, 3790, 3791, 3791, 3792, 3795,
+ 3795, 3796, 3796, 3797, 3797, 3798, 3800, 3800, 3801, 3801,
+ 3776, 3776, 3777, 3777, 3781, 3781, 3782, 3782, 3783, 3790,
+ 3790, 3791, 3791, 3795, 3795, 3796, 3796, 3797, 3800, 3800,
+ 3801, 3801, 3776, 3776, 3777, 3777, 3781, 3781, 3782, 3782,
+ 3790, 3790, 3791, 3791, 3795, 3795, 3796, 3796, 3800, 3800,
+ 3801, 3776, 3776, 3777, 3777, 3781, 3781, 3782, 3782, 3790,
+ 3790, 3791, 3791, 3795, 3795, 3796, 3796, 3800, 3776, 3776,
+ 3777, 3781, 3781, 3782, 3782, 3790, 3790, 3791, 3795, 3795,
+
+ 3796, 3796, 3776, 3781, 3781, 3782, 3790, 3795, 3795, 3796,
+ 3781, 3795, 0, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+
+ 2813, 2813
+ } ;
+
+static yyconst flex_int16_t yy_nxt[24688] =
+ { 0,
+ 2813, 60, 33, 60, 34, 35, 2813, 2813, 33, 35,
+ 34, 35, 37, 37, 117, 35, 117, 118, 37, 61,
+ 105, 62, 113, 113, 117, 37, 117, 118, 122, 124,
+ 122, 124, 189, 294, 189, 190, 119, 188, 125, 201,
+ 2276, 201, 126, 36, 2198, 295, 61, 105, 62, 36,
+ 2163, 202, 37, 32, 38, 39, 38, 40, 35, 41,
+ 42, 32, 35, 32, 32, 32, 32, 32, 32, 32,
+ 43, 44, 45, 46, 47, 48, 49, 49, 50, 49,
+ 49, 51, 52, 49, 53, 54, 49, 55, 56, 57,
+ 58, 49, 59, 49, 49, 49, 36, 43, 44, 45,
+
+ 46, 47, 48, 49, 49, 50, 49, 51, 52, 49,
+ 53, 54, 49, 55, 56, 57, 58, 49, 59, 49,
+ 49, 49, 32, 32, 33, 32, 34, 35, 32, 32,
+ 32, 35, 32, 32, 32, 32, 32, 32, 32, 203,
+ 2276, 203, 33, 2153, 34, 35, 582, 583, 33, 35,
+ 34, 35, 593, 594, 73, 35, 74, 75, 114, 2085,
+ 192, 75, 114, 2198, 192, 36, 32, 32, 33, 32,
+ 34, 35, 32, 32, 32, 35, 32, 32, 37, 32,
+ 32, 32, 32, 36, 33, 64, 34, 35, 2063, 36,
+ 117, 35, 117, 118, 37, 76, 115, 124, 193, 124,
+
+ 122, 37, 122, 635, 636, 124, 125, 124, 2163, 36,
+ 126, 212, 64, 106, 125, 34, 35, 642, 643, 33,
+ 35, 34, 35, 2153, 130, 36, 35, 221, 37, 32,
+ 32, 65, 32, 34, 35, 32, 32, 32, 35, 32,
+ 32, 32, 32, 32, 32, 32, 582, 583, 212, 33,
+ 130, 34, 35, 221, 36, 189, 35, 189, 190, 37,
+ 36, 33, 2085, 108, 109, 222, 37, 114, 109, 582,
+ 697, 114, 36, 32, 32, 65, 32, 34, 35, 32,
+ 32, 32, 35, 32, 32, 37, 32, 32, 32, 32,
+ 36, 222, 67, 37, 212, 124, 73, 124, 74, 75,
+
+ 699, 700, 110, 75, 125, 115, 77, 203, 126, 203,
+ 2063, 212, 223, 77, 1677, 153, 36, 1564, 228, 67,
+ 32, 32, 68, 32, 34, 35, 32, 32, 32, 35,
+ 69, 32, 32, 32, 32, 32, 32, 76, 223, 1510,
+ 77, 106, 153, 34, 35, 228, 212, 124, 35, 124,
+ 166, 37, 166, 1677, 212, 286, 125, 229, 37, 167,
+ 214, 1500, 297, 36, 32, 32, 68, 32, 34, 35,
+ 32, 32, 32, 35, 69, 32, 37, 32, 32, 32,
+ 32, 286, 36, 71, 229, 37, 214, 33, 297, 34,
+ 35, 593, 707, 124, 35, 124, 201, 37, 201, 203,
+
+ 212, 203, 125, 299, 37, 1411, 126, 36, 202, 1564,
+ 71, 32, 32, 78, 32, 34, 35, 32, 32, 32,
+ 35, 32, 32, 32, 79, 32, 32, 32, 36, 1397,
+ 299, 37, 33, 1377, 108, 109, 333, 1372, 333, 109,
+ 1510, 333, 111, 333, 1500, 334, 170, 709, 710, 111,
+ 334, 635, 636, 170, 36, 32, 32, 78, 32, 34,
+ 35, 32, 32, 32, 35, 32, 32, 37, 79, 32,
+ 32, 32, 170, 110, 81, 164, 111, 164, 118, 170,
+ 635, 745, 212, 212, 251, 252, 251, 747, 748, 642,
+ 750, 1314, 215, 253, 217, 165, 252, 126, 36, 216,
+
+ 218, 81, 32, 82, 78, 82, 34, 35, 32, 32,
+ 32, 35, 32, 32, 32, 83, 32, 32, 32, 215,
+ 1301, 217, 165, 752, 753, 216, 218, 124, 124, 124,
+ 124, 699, 804, 709, 818, 212, 125, 125, 747, 865,
+ 126, 126, 1411, 244, 306, 36, 32, 82, 78, 82,
+ 34, 35, 32, 32, 32, 35, 32, 32, 37, 83,
+ 32, 32, 32, 1397, 142, 85, 124, 124, 124, 124,
+ 244, 306, 752, 872, 212, 125, 125, 928, 697, 126,
+ 126, 1377, 368, 249, 368, 257, 930, 931, 298, 36,
+ 142, 125, 85, 32, 32, 33, 32, 34, 35, 32,
+
+ 32, 32, 35, 32, 86, 32, 32, 32, 32, 32,
+ 249, 124, 257, 124, 298, 1372, 124, 212, 124, 1314,
+ 125, 124, 805, 124, 126, 125, 1173, 372, 1173, 126,
+ 125, 1222, 300, 263, 126, 264, 36, 32, 32, 33,
+ 32, 34, 35, 32, 32, 32, 35, 32, 86, 37,
+ 32, 32, 32, 32, 372, 161, 88, 368, 300, 368,
+ 263, 1301, 264, 415, 866, 415, 125, 518, 874, 124,
+ 126, 124, 416, 1270, 518, 867, 126, 518, 125, 518,
+ 36, 161, 126, 88, 32, 32, 89, 32, 34, 35,
+ 32, 32, 90, 35, 91, 92, 32, 32, 32, 32,
+
+ 32, 93, 94, 95, 96, 97, 94, 94, 94, 98,
+ 94, 94, 99, 94, 94, 100, 101, 94, 102, 103,
+ 104, 94, 94, 94, 94, 94, 94, 36, 93, 94,
+ 95, 96, 97, 94, 94, 94, 98, 94, 99, 94,
+ 94, 100, 101, 94, 102, 103, 104, 94, 94, 94,
+ 94, 94, 94, 124, 124, 124, 124, 487, 233, 124,
+ 212, 124, 125, 125, 388, 820, 126, 126, 125, 124,
+ 319, 124, 126, 195, 219, 195, 212, 806, 125, 212,
+ 128, 139, 126, 140, 487, 233, 220, 129, 874, 146,
+ 388, 301, 124, 141, 124, 124, 319, 124, 867, 147,
+
+ 219, 125, 302, 196, 125, 126, 128, 139, 126, 140,
+ 212, 293, 220, 129, 124, 146, 124, 301, 212, 141,
+ 820, 212, 393, 125, 230, 147, 148, 126, 302, 196,
+ 131, 212, 304, 124, 124, 124, 124, 132, 293, 212,
+ 806, 133, 125, 125, 134, 805, 126, 126, 231, 393,
+ 309, 230, 148, 305, 1222, 143, 162, 131, 304, 124,
+ 866, 124, 144, 145, 132, 113, 163, 133, 125, 1270,
+ 134, 124, 126, 124, 231, 294, 278, 309, 212, 305,
+ 125, 400, 143, 162, 126, 237, 154, 135, 144, 145,
+ 155, 136, 163, 527, 156, 137, 124, 584, 124, 584,
+
+ 127, 138, 124, 278, 124, 125, 157, 1396, 400, 126,
+ 585, 125, 158, 154, 135, 126, 1457, 155, 136, 159,
+ 527, 156, 137, 195, 212, 195, 127, 138, 124, 239,
+ 124, 164, 157, 164, 118, 212, 160, 125, 289, 158,
+ 212, 126, 303, 224, 149, 212, 159, 170, 315, 170,
+ 290, 165, 113, 196, 170, 239, 170, 225, 150, 501,
+ 226, 151, 160, 227, 152, 289, 212, 307, 1499, 303,
+ 224, 149, 1396, 170, 315, 170, 290, 1529, 165, 196,
+ 170, 1457, 170, 225, 150, 501, 226, 151, 212, 227,
+ 152, 116, 166, 307, 166, 116, 116, 116, 116, 116,
+
+ 116, 167, 116, 116, 116, 168, 116, 116, 169, 212,
+ 515, 124, 124, 124, 124, 171, 1584, 212, 1584, 172,
+ 125, 125, 173, 212, 126, 126, 212, 212, 208, 308,
+ 313, 204, 314, 212, 116, 169, 515, 316, 139, 197,
+ 174, 317, 171, 389, 310, 172, 240, 113, 173, 124,
+ 141, 124, 124, 212, 124, 308, 212, 313, 125, 314,
+ 212, 125, 126, 316, 139, 126, 174, 317, 273, 389,
+ 274, 310, 240, 390, 391, 394, 141, 116, 116, 241,
+ 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+ 116, 177, 116, 116, 124, 273, 124, 274, 184, 390,
+
+ 391, 394, 415, 125, 415, 241, 124, 126, 124, 212,
+ 179, 416, 503, 928, 697, 125, 339, 339, 339, 126,
+ 116, 116, 116, 259, 116, 116, 116, 116, 116, 116,
+ 116, 116, 116, 116, 116, 181, 116, 116, 124, 503,
+ 124, 248, 212, 124, 124, 124, 124, 125, 212, 259,
+ 1563, 126, 125, 125, 212, 392, 126, 126, 401, 1640,
+ 329, 395, 268, 280, 116, 116, 116, 248, 116, 116,
+ 116, 116, 116, 116, 116, 116, 116, 116, 116, 186,
+ 116, 116, 392, 124, 401, 124, 212, 329, 395, 268,
+ 280, 175, 125, 251, 252, 251, 126, 212, 946, 707,
+
+ 403, 542, 253, 237, 404, 252, 126, 121, 116, 116,
+ 116, 250, 116, 116, 116, 116, 116, 116, 116, 116,
+ 116, 116, 116, 199, 116, 116, 403, 542, 212, 254,
+ 124, 404, 124, 124, 212, 124, 119, 250, 124, 125,
+ 124, 113, 125, 126, 113, 513, 126, 125, 405, 352,
+ 282, 126, 116, 116, 116, 254, 116, 116, 116, 116,
+ 116, 116, 116, 116, 116, 116, 116, 206, 116, 116,
+ 124, 513, 124, 258, 405, 212, 352, 282, 208, 125,
+ 124, 212, 124, 126, 212, 212, 948, 949, 516, 125,
+ 204, 407, 398, 126, 285, 197, 116, 116, 116, 258,
+
+ 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+ 116, 210, 116, 116, 124, 516, 124, 275, 407, 398,
+ 124, 285, 124, 125, 518, 946, 707, 126, 212, 125,
+ 184, 518, 322, 126, 518, 212, 518, 335, 179, 399,
+ 116, 116, 116, 275, 116, 116, 116, 116, 116, 116,
+ 116, 116, 116, 116, 116, 232, 116, 116, 212, 322,
+ 124, 124, 124, 124, 335, 234, 399, 212, 175, 125,
+ 125, 212, 235, 126, 126, 121, 124, 124, 124, 124,
+ 408, 212, 402, 505, 116, 125, 125, 242, 409, 126,
+ 126, 245, 234, 124, 243, 124, 212, 255, 235, 991,
+
+ 745, 124, 125, 124, 246, 247, 126, 408, 402, 505,
+ 125, 256, 113, 242, 126, 409, 556, 245, 212, 406,
+ 243, 212, 311, 170, 255, 261, 502, 124, 262, 124,
+ 246, 247, 260, 124, 377, 124, 125, 256, 312, 124,
+ 126, 124, 125, 556, 2813, 406, 126, 265, 125, 311,
+ 170, 261, 126, 502, 262, 339, 339, 339, 260, 637,
+ 377, 637, 266, 269, 312, 2813, 267, 170, 124, 270,
+ 124, 124, 638, 124, 265, 2813, 170, 125, 170, 212,
+ 125, 126, 378, 488, 126, 271, 507, 124, 266, 124,
+ 269, 375, 267, 2813, 170, 270, 125, 124, 276, 124,
+
+ 126, 272, 124, 170, 124, 170, 125, 2813, 378, 488,
+ 126, 125, 271, 507, 233, 126, 124, 375, 124, 170,
+ 291, 292, 2813, 233, 276, 125, 170, 272, 277, 126,
+ 279, 410, 2813, 281, 554, 124, 283, 124, 411, 486,
+ 284, 233, 2813, 170, 125, 170, 291, 292, 126, 124,
+ 233, 124, 170, 1584, 277, 1584, 279, 410, 125, 281,
+ 554, 2813, 126, 283, 411, 320, 486, 284, 116, 166,
+ 170, 166, 116, 116, 116, 116, 116, 116, 167, 116,
+ 116, 116, 325, 116, 116, 124, 124, 124, 124, 2813,
+ 212, 320, 991, 745, 125, 125, 212, 212, 126, 126,
+
+ 1499, 124, 512, 124, 504, 324, 331, 511, 325, 1529,
+ 125, 116, 116, 166, 126, 166, 116, 116, 116, 116,
+ 116, 116, 167, 116, 116, 116, 168, 116, 116, 512,
+ 504, 321, 324, 331, 511, 124, 124, 124, 124, 2813,
+ 287, 124, 555, 124, 125, 125, 2813, 288, 126, 126,
+ 125, 251, 252, 251, 126, 116, 124, 321, 124, 1584,
+ 253, 1584, 323, 252, 126, 125, 287, 1676, 555, 126,
+ 326, 2813, 327, 288, 116, 116, 1716, 116, 116, 116,
+ 116, 116, 116, 116, 116, 116, 116, 116, 323, 116,
+ 116, 993, 994, 124, 212, 124, 326, 212, 327, 481,
+
+ 2813, 481, 125, 124, 2813, 124, 126, 2813, 482, 514,
+ 597, 506, 125, 339, 339, 339, 126, 116, 116, 116,
+ 330, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+ 116, 116, 177, 116, 116, 514, 597, 506, 328, 124,
+ 124, 124, 124, 339, 339, 339, 330, 212, 125, 125,
+ 212, 2813, 126, 126, 1000, 750, 212, 524, 517, 337,
+ 342, 116, 116, 116, 328, 116, 116, 116, 116, 116,
+ 116, 116, 116, 116, 116, 116, 508, 116, 116, 1563,
+ 124, 124, 124, 124, 524, 517, 337, 342, 1640, 125,
+ 125, 1000, 750, 126, 126, 604, 2129, 604, 2129, 343,
+
+ 2813, 549, 508, 550, 605, 116, 116, 116, 336, 116,
+ 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+ 181, 116, 116, 338, 339, 338, 343, 549, 124, 550,
+ 124, 124, 125, 124, 336, 2813, 126, 125, 1002, 1003,
+ 125, 126, 340, 2813, 126, 559, 2813, 341, 607, 116,
+ 116, 116, 439, 116, 116, 116, 116, 116, 116, 116,
+ 116, 116, 116, 116, 345, 116, 116, 2813, 124, 340,
+ 124, 124, 559, 124, 341, 607, 124, 125, 124, 439,
+ 125, 126, 1041, 924, 126, 125, 598, 417, 2813, 126,
+ 345, 599, 348, 116, 116, 116, 357, 116, 116, 116,
+
+ 116, 116, 116, 116, 116, 116, 116, 116, 186, 116,
+ 116, 2813, 598, 124, 417, 124, 124, 599, 124, 348,
+ 518, 2813, 125, 357, 1300, 125, 126, 518, 2813, 126,
+ 518, 212, 518, 1839, 600, 1043, 1044, 116, 116, 116,
+ 344, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+ 116, 116, 349, 116, 116, 124, 124, 124, 124, 212,
+ 600, 251, 252, 251, 125, 125, 344, 2813, 126, 126,
+ 253, 1041, 924, 252, 126, 2813, 601, 602, 349, 523,
+ 351, 116, 116, 116, 350, 116, 116, 116, 116, 116,
+ 116, 116, 116, 116, 116, 116, 199, 116, 116, 124,
+
+ 2813, 124, 601, 602, 124, 523, 124, 351, 125, 124,
+ 350, 124, 126, 125, 525, 1676, 525, 126, 125, 930,
+ 931, 610, 126, 526, 1716, 116, 116, 116, 353, 116,
+ 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+ 360, 116, 116, 124, 1371, 124, 354, 610, 124, 124,
+ 124, 124, 125, 1909, 353, 212, 126, 125, 125, 2813,
+ 618, 126, 126, 930, 1055, 355, 360, 412, 361, 116,
+ 116, 116, 354, 116, 116, 116, 116, 116, 116, 116,
+ 116, 116, 116, 116, 206, 116, 116, 618, 124, 124,
+ 124, 124, 355, 2813, 412, 361, 2813, 125, 125, 1057,
+
+ 1044, 126, 126, 604, 2813, 604, 212, 2813, 362, 617,
+ 1063, 942, 605, 116, 116, 116, 356, 116, 116, 116,
+ 116, 116, 116, 116, 116, 116, 116, 116, 664, 116,
+ 116, 124, 124, 124, 124, 362, 617, 251, 252, 251,
+ 125, 125, 356, 212, 126, 126, 253, 2813, 632, 252,
+ 126, 363, 1065, 1066, 365, 664, 489, 116, 116, 116,
+ 170, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+ 116, 116, 210, 116, 116, 632, 581, 124, 363, 124,
+ 124, 365, 124, 489, 965, 966, 125, 170, 2813, 125,
+ 126, 212, 2129, 126, 2129, 212, 358, 606, 619, 170,
+
+ 367, 116, 116, 116, 359, 116, 116, 116, 116, 116,
+ 116, 116, 116, 116, 116, 116, 620, 116, 116, 124,
+ 124, 124, 124, 358, 606, 619, 170, 367, 125, 125,
+ 359, 634, 126, 126, 212, 1063, 942, 540, 413, 1007,
+ 1008, 621, 620, 2813, 541, 116, 116, 116, 366, 116,
+ 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+ 232, 116, 116, 540, 525, 413, 525, 124, 621, 124,
+ 541, 948, 949, 526, 366, 2813, 125, 212, 2813, 124,
+ 126, 124, 339, 339, 339, 948, 1077, 418, 125, 116,
+ 116, 116, 126, 116, 116, 116, 116, 116, 116, 116,
+
+ 116, 116, 116, 116, 232, 116, 116, 318, 124, 124,
+ 124, 124, 364, 170, 418, 212, 2813, 125, 125, 1079,
+ 1066, 126, 126, 124, 509, 124, 2813, 376, 346, 1123,
+ 990, 510, 125, 116, 318, 124, 126, 124, 364, 212,
+ 170, 347, 369, 124, 125, 124, 396, 233, 126, 2813,
+ 370, 509, 125, 376, 667, 346, 126, 510, 528, 397,
+ 2813, 557, 124, 2813, 124, 558, 2813, 347, 369, 414,
+ 371, 125, 670, 396, 233, 126, 370, 124, 124, 124,
+ 124, 667, 1123, 990, 528, 397, 125, 125, 557, 419,
+ 126, 126, 558, 420, 453, 414, 371, 116, 166, 670,
+
+ 166, 116, 116, 116, 116, 116, 116, 167, 116, 116,
+ 116, 168, 116, 116, 124, 419, 124, 124, 560, 124,
+ 420, 453, 124, 125, 124, 373, 125, 126, 561, 1300,
+ 126, 125, 2813, 581, 584, 126, 584, 124, 1839, 124,
+ 116, 965, 966, 422, 421, 560, 125, 585, 2813, 423,
+ 126, 373, 116, 166, 561, 166, 116, 116, 116, 116,
+ 116, 116, 167, 116, 116, 116, 168, 116, 116, 422,
+ 421, 537, 124, 374, 124, 423, 2813, 124, 124, 124,
+ 124, 125, 657, 1125, 1126, 126, 125, 125, 993, 994,
+ 126, 126, 424, 993, 1131, 116, 124, 537, 124, 559,
+
+ 374, 379, 380, 379, 381, 125, 2813, 438, 657, 126,
+ 125, 440, 1133, 1126, 126, 124, 602, 124, 658, 424,
+ 340, 124, 382, 124, 125, 383, 559, 2813, 126, 384,
+ 125, 441, 385, 438, 126, 386, 387, 440, 595, 442,
+ 595, 124, 602, 124, 658, 659, 212, 340, 449, 382,
+ 125, 124, 383, 124, 126, 384, 2813, 441, 385, 448,
+ 125, 386, 387, 425, 126, 425, 442, 2813, 625, 596,
+ 212, 659, 125, 627, 449, 443, 251, 252, 251, 426,
+ 427, 428, 429, 430, 2813, 253, 448, 431, 252, 126,
+ 2129, 432, 2129, 433, 625, 596, 434, 435, 436, 212,
+
+ 627, 437, 443, 124, 2813, 124, 426, 427, 428, 429,
+ 430, 212, 125, 671, 431, 622, 126, 432, 624, 433,
+ 2813, 212, 434, 435, 436, 444, 124, 437, 124, 124,
+ 212, 124, 445, 1134, 999, 125, 446, 629, 125, 126,
+ 671, 622, 126, 631, 124, 624, 124, 124, 2813, 124,
+ 447, 672, 444, 125, 1134, 999, 125, 126, 445, 450,
+ 126, 124, 446, 124, 629, 212, 124, 212, 124, 631,
+ 125, 124, 451, 124, 126, 125, 2813, 447, 672, 126,
+ 125, 623, 452, 626, 126, 450, 2813, 251, 252, 251,
+ 455, 466, 2813, 124, 454, 124, 253, 675, 451, 252,
+
+ 126, 124, 125, 124, 551, 2813, 126, 623, 452, 626,
+ 125, 552, 553, 467, 126, 467, 2813, 455, 466, 464,
+ 454, 456, 469, 457, 675, 470, 463, 251, 252, 251,
+ 458, 551, 459, 460, 126, 460, 253, 552, 553, 252,
+ 126, 124, 461, 124, 2813, 678, 464, 251, 252, 251,
+ 125, 212, 463, 715, 126, 462, 253, 660, 2813, 252,
+ 126, 467, 468, 467, 1136, 1137, 124, 628, 124, 461,
+ 469, 465, 678, 470, 126, 125, 124, 212, 124, 126,
+ 715, 462, 124, 660, 124, 125, 471, 212, 2813, 126,
+ 481, 125, 481, 628, 630, 126, 472, 465, 639, 482,
+
+ 2813, 661, 473, 1002, 1003, 483, 252, 483, 2813, 124,
+ 170, 124, 662, 471, 484, 663, 2813, 485, 125, 1002,
+ 1142, 630, 126, 472, 639, 170, 124, 661, 124, 473,
+ 474, 381, 474, 381, 124, 125, 124, 170, 662, 126,
+ 124, 663, 124, 125, 2813, 495, 543, 126, 666, 125,
+ 212, 475, 170, 126, 476, 439, 2813, 544, 477, 498,
+ 545, 478, 668, 496, 479, 480, 124, 124, 124, 124,
+ 497, 495, 640, 543, 666, 125, 125, 669, 475, 126,
+ 126, 476, 439, 544, 477, 498, 545, 478, 668, 496,
+ 479, 480, 490, 381, 490, 381, 497, 519, 640, 520,
+
+ 1144, 1137, 499, 669, 673, 2813, 521, 500, 522, 518,
+ 212, 518, 124, 475, 124, 233, 491, 644, 1156, 1157,
+ 492, 125, 124, 478, 124, 126, 493, 494, 499, 674,
+ 673, 125, 531, 500, 531, 126, 530, 595, 529, 595,
+ 475, 125, 233, 491, 644, 126, 492, 2813, 124, 478,
+ 124, 532, 493, 494, 695, 674, 717, 125, 251, 252,
+ 251, 126, 696, 530, 713, 529, 533, 253, 596, 2813,
+ 252, 126, 124, 124, 124, 124, 1162, 1163, 532, 714,
+ 695, 125, 125, 717, 2813, 126, 126, 124, 696, 124,
+ 713, 722, 534, 533, 596, 546, 125, 535, 2813, 547,
+
+ 126, 124, 124, 124, 124, 714, 339, 339, 339, 548,
+ 125, 125, 1043, 1044, 126, 126, 2813, 536, 722, 534,
+ 716, 538, 546, 2813, 535, 718, 547, 251, 252, 251,
+ 2813, 539, 251, 252, 251, 548, 253, 2813, 170, 252,
+ 126, 253, 608, 536, 252, 126, 716, 124, 538, 124,
+ 124, 718, 124, 124, 233, 124, 125, 539, 645, 125,
+ 126, 759, 125, 126, 212, 170, 126, 735, 1371, 608,
+ 124, 564, 124, 124, 563, 124, 562, 1909, 124, 125,
+ 124, 233, 125, 126, 212, 645, 126, 125, 759, 212,
+ 2813, 126, 2813, 566, 735, 124, 711, 124, 564, 712,
+
+ 212, 563, 562, 565, 125, 124, 729, 124, 126, 2813,
+ 124, 730, 124, 567, 125, 124, 568, 124, 126, 125,
+ 566, 739, 711, 126, 125, 712, 570, 212, 126, 565,
+ 741, 124, 729, 124, 569, 571, 124, 730, 124, 567,
+ 125, 212, 212, 568, 126, 125, 124, 739, 124, 126,
+ 2813, 573, 732, 570, 124, 125, 124, 741, 2813, 126,
+ 569, 2813, 571, 125, 734, 572, 574, 126, 124, 2813,
+ 124, 519, 2813, 519, 124, 769, 124, 125, 573, 732,
+ 633, 126, 522, 125, 576, 212, 456, 126, 456, 575,
+ 734, 572, 577, 574, 770, 578, 124, 459, 124, 740,
+
+ 2813, 456, 769, 456, 124, 125, 124, 579, 2813, 126,
+ 578, 576, 459, 125, 124, 575, 124, 126, 767, 577,
+ 580, 770, 579, 125, 124, 740, 124, 126, 170, 124,
+ 170, 124, 586, 125, 579, 580, 768, 126, 125, 2813,
+ 587, 124, 126, 124, 767, 719, 580, 720, 588, 579,
+ 125, 251, 252, 251, 126, 170, 773, 170, 586, 589,
+ 253, 580, 768, 252, 126, 590, 587, 212, 251, 252,
+ 251, 719, 212, 720, 588, 2062, 591, 253, 749, 744,
+ 252, 126, 551, 773, 2109, 589, 251, 252, 251, 552,
+ 609, 590, 483, 252, 483, 253, 212, 2813, 252, 126,
+
+ 2813, 484, 591, 557, 485, 749, 744, 558, 124, 551,
+ 124, 124, 170, 124, 2813, 552, 609, 125, 2813, 601,
+ 125, 126, 731, 124, 126, 124, 665, 665, 665, 212,
+ 557, 124, 125, 124, 558, 252, 126, 611, 252, 170,
+ 125, 124, 613, 124, 126, 601, 612, 124, 731, 124,
+ 125, 742, 775, 519, 126, 519, 125, 124, 615, 124,
+ 126, 614, 633, 611, 522, 531, 125, 531, 2813, 613,
+ 126, 212, 612, 124, 125, 124, 2813, 742, 616, 775,
+ 2813, 124, 125, 124, 648, 615, 126, 614, 212, 647,
+ 125, 736, 646, 124, 126, 124, 124, 649, 124, 2813,
+
+ 783, 124, 125, 124, 616, 125, 126, 771, 743, 126,
+ 125, 648, 2813, 124, 126, 124, 647, 736, 646, 1043,
+ 1044, 784, 125, 124, 649, 124, 126, 783, 650, 2813,
+ 652, 653, 125, 771, 743, 651, 126, 655, 669, 655,
+ 124, 714, 124, 665, 665, 665, 125, 654, 784, 125,
+ 126, 2813, 252, 126, 650, 252, 652, 2813, 653, 676,
+ 124, 651, 124, 677, 669, 2813, 785, 714, 124, 125,
+ 124, 2813, 518, 126, 654, 656, 679, 125, 124, 518,
+ 124, 126, 518, 684, 518, 684, 676, 125, 2813, 803,
+ 677, 126, 685, 785, 233, 124, 126, 124, 680, 772,
+
+ 828, 656, 681, 679, 125, 124, 774, 124, 126, 733,
+ 124, 733, 124, 754, 125, 682, 803, 2813, 126, 125,
+ 2813, 233, 212, 126, 680, 772, 686, 828, 124, 681,
+ 124, 124, 774, 124, 689, 468, 689, 125, 683, 754,
+ 125, 126, 682, 125, 126, 170, 470, 126, 2813, 829,
+ 124, 2152, 124, 686, 721, 339, 339, 339, 688, 125,
+ 2168, 779, 687, 126, 683, 124, 690, 124, 124, 780,
+ 124, 2813, 170, 124, 125, 124, 829, 125, 126, 781,
+ 721, 126, 125, 124, 688, 124, 126, 779, 687, 124,
+ 782, 124, 125, 690, 830, 780, 126, 701, 125, 702,
+
+ 691, 692, 126, 693, 2813, 781, 460, 1043, 1044, 460,
+ 124, 460, 124, 1181, 1049, 831, 782, 694, 579, 125,
+ 701, 830, 702, 126, 786, 2813, 691, 692, 833, 460,
+ 693, 580, 460, 585, 460, 124, 835, 124, 124, 703,
+ 124, 579, 831, 694, 125, 579, 2813, 125, 126, 787,
+ 786, 126, 704, 2813, 580, 833, 2813, 580, 251, 252,
+ 251, 788, 705, 835, 124, 703, 124, 253, 579, 789,
+ 252, 126, 124, 125, 124, 787, 802, 126, 832, 704,
+ 580, 125, 701, 834, 702, 126, 845, 788, 124, 705,
+ 124, 460, 836, 894, 460, 789, 460, 125, 124, 706,
+
+ 124, 126, 802, 579, 832, 2062, 723, 125, 124, 834,
+ 124, 126, 845, 124, 2109, 124, 580, 125, 724, 836,
+ 894, 126, 125, 887, 2813, 706, 126, 124, 212, 124,
+ 579, 853, 684, 723, 684, 726, 125, 124, 2197, 124,
+ 126, 685, 580, 2813, 725, 724, 125, 2242, 233, 887,
+ 126, 637, 737, 637, 737, 895, 518, 728, 853, 212,
+ 727, 738, 726, 518, 638, 212, 518, 212, 518, 518,
+ 725, 755, 793, 858, 793, 233, 518, 892, 518, 518,
+ 638, 518, 895, 2813, 728, 518, 727, 2813, 518, 212,
+ 518, 124, 124, 124, 124, 170, 794, 755, 2813, 858,
+
+ 125, 125, 795, 892, 126, 126, 124, 756, 124, 844,
+ 212, 757, 124, 857, 124, 125, 967, 2813, 967, 126,
+ 2813, 125, 170, 794, 124, 126, 124, 758, 795, 968,
+ 1183, 1184, 761, 125, 756, 844, 2813, 126, 757, 212,
+ 857, 760, 124, 655, 124, 655, 854, 124, 124, 124,
+ 124, 125, 125, 758, 2813, 126, 125, 125, 762, 761,
+ 126, 126, 212, 763, 766, 212, 2152, 760, 456, 776,
+ 457, 776, 764, 854, 765, 2168, 862, 458, 2813, 459,
+ 460, 126, 460, 124, 762, 124, 871, 212, 777, 461,
+ 763, 766, 125, 778, 2813, 124, 126, 124, 764, 518,
+
+ 765, 863, 462, 862, 125, 124, 518, 124, 126, 518,
+ 790, 518, 871, 2813, 125, 777, 461, 737, 126, 737,
+ 778, 251, 252, 251, 791, 2813, 738, 863, 462, 124,
+ 253, 124, 2813, 252, 126, 124, 790, 124, 125, 212,
+ 792, 212, 126, 124, 125, 124, 864, 796, 126, 2813,
+ 791, 689, 125, 689, 2813, 124, 126, 124, 855, 797,
+ 125, 1181, 1049, 470, 125, 2813, 792, 456, 126, 457,
+ 799, 896, 2813, 864, 796, 800, 458, 2813, 459, 460,
+ 126, 460, 798, 899, 855, 124, 797, 124, 461, 733,
+ 124, 733, 124, 2813, 125, 900, 799, 896, 126, 125,
+
+ 904, 462, 800, 126, 801, 468, 801, 233, 798, 899,
+ 701, 878, 702, 125, 2813, 461, 470, 126, 2813, 460,
+ 856, 900, 460, 124, 460, 124, 904, 462, 456, 897,
+ 457, 579, 125, 701, 233, 701, 126, 458, 878, 459,
+ 460, 126, 460, 808, 580, 809, 856, 898, 701, 461,
+ 701, 901, 810, 697, 579, 811, 897, 811, 579, 1009,
+ 816, 1009, 462, 902, 812, 903, 124, 580, 124, 579,
+ 580, 2275, 1010, 905, 898, 125, 461, 813, 901, 126,
+ 2293, 579, 580, 912, 814, 124, 816, 124, 462, 906,
+ 902, 812, 903, 580, 125, 2813, 579, 124, 126, 124,
+
+ 905, 2813, 907, 813, 908, 701, 125, 702, 580, 912,
+ 126, 814, 913, 822, 460, 823, 906, 460, 815, 460,
+ 2813, 817, 824, 707, 916, 825, 579, 825, 124, 907,
+ 124, 908, 918, 124, 826, 124, 919, 125, 913, 580,
+ 2197, 126, 125, 124, 815, 124, 126, 827, 817, 2242,
+ 916, 952, 125, 579, 928, 697, 126, 1013, 124, 918,
+ 124, 826, 919, 846, 953, 580, 847, 125, 518, 2813,
+ 848, 126, 954, 827, 837, 518, 838, 952, 518, 212,
+ 518, 932, 212, 839, 1013, 840, 841, 985, 841, 846,
+ 953, 849, 847, 955, 170, 842, 848, 124, 954, 124,
+
+ 851, 852, 851, 852, 2813, 956, 125, 932, 843, 125,
+ 126, 1057, 1189, 126, 985, 2813, 859, 849, 859, 955,
+ 2813, 170, 842, 957, 519, 958, 520, 850, 2813, 971,
+ 519, 956, 520, 521, 843, 522, 518, 212, 518, 521,
+ 860, 522, 518, 212, 518, 519, 861, 520, 2813, 957,
+ 2813, 958, 2813, 850, 521, 971, 522, 518, 212, 518,
+ 981, 983, 212, 518, 212, 1057, 1044, 860, 2813, 869,
+ 518, 995, 861, 518, 212, 518, 870, 745, 518, 869,
+ 2275, 869, 979, 2813, 876, 518, 981, 983, 518, 2293,
+ 518, 877, 750, 879, 876, 880, 876, 124, 995, 124,
+
+ 928, 697, 881, 2813, 882, 883, 125, 883, 979, 233,
+ 126, 251, 252, 251, 884, 959, 852, 959, 852, 124,
+ 253, 124, 2813, 252, 126, 2813, 984, 933, 125, 124,
+ 885, 124, 126, 1021, 2813, 124, 233, 124, 125, 886,
+ 2813, 884, 126, 2813, 125, 888, 170, 2813, 126, 251,
+ 252, 251, 984, 933, 124, 2813, 124, 885, 253, 960,
+ 1021, 252, 126, 125, 1065, 1066, 886, 126, 889, 124,
+ 212, 124, 888, 170, 124, 1022, 124, 2813, 125, 124,
+ 2813, 124, 126, 125, 776, 960, 776, 126, 125, 890,
+ 986, 909, 126, 909, 889, 2813, 1023, 910, 891, 910,
+
+ 125, 893, 1022, 777, 126, 2813, 125, 793, 778, 793,
+ 126, 2813, 124, 212, 124, 890, 986, 978, 946, 707,
+ 124, 125, 124, 1023, 891, 126, 911, 893, 2813, 125,
+ 777, 794, 914, 126, 124, 778, 124, 795, 915, 801,
+ 124, 801, 124, 125, 978, 950, 2813, 126, 125, 125,
+ 1026, 470, 911, 126, 339, 339, 339, 1027, 794, 914,
+ 808, 2813, 809, 795, 2813, 915, 921, 2813, 922, 810,
+ 697, 950, 811, 917, 811, 923, 924, 1026, 925, 2813,
+ 925, 812, 808, 1027, 808, 1029, 1028, 926, 808, 2813,
+ 808, 928, 697, 124, 813, 124, 2813, 928, 697, 917,
+
+ 927, 212, 125, 812, 1030, 170, 126, 1031, 812, 812,
+ 124, 1029, 124, 1028, 926, 212, 813, 980, 2813, 125,
+ 813, 969, 813, 126, 1037, 124, 927, 124, 934, 982,
+ 812, 1030, 170, 1031, 125, 2813, 812, 2813, 126, 1038,
+ 935, 1082, 813, 980, 124, 936, 124, 969, 813, 822,
+ 1037, 823, 1039, 125, 934, 982, 2813, 126, 824, 707,
+ 2813, 825, 124, 825, 124, 1038, 935, 939, 1082, 940,
+ 826, 125, 936, 937, 1040, 126, 941, 942, 1039, 943,
+ 170, 943, 822, 827, 822, 822, 972, 822, 944, 1065,
+ 1066, 946, 707, 1083, 946, 707, 970, 826, 2813, 937,
+
+ 1040, 945, 2813, 826, 946, 707, 826, 170, 124, 827,
+ 124, 1065, 1066, 972, 2813, 944, 827, 125, 1088, 827,
+ 1083, 126, 970, 339, 339, 339, 837, 945, 837, 973,
+ 826, 951, 837, 826, 837, 961, 2813, 840, 339, 339,
+ 339, 961, 827, 840, 1088, 827, 124, 962, 124, 483,
+ 252, 483, 2813, 962, 2813, 125, 973, 951, 484, 126,
+ 963, 485, 124, 124, 124, 124, 963, 2813, 124, 170,
+ 124, 125, 125, 1011, 962, 126, 126, 125, 1084, 975,
+ 962, 126, 974, 1194, 1071, 1019, 963, 1019, 851, 852,
+ 851, 852, 963, 859, 1020, 859, 170, 125, 126, 1011,
+
+ 518, 339, 339, 339, 976, 1084, 975, 518, 518, 974,
+ 518, 212, 518, 2813, 869, 518, 1093, 860, 518, 212,
+ 518, 870, 745, 861, 869, 988, 869, 1024, 233, 1024,
+ 976, 876, 989, 990, 1085, 988, 2813, 988, 877, 750,
+ 997, 876, 1093, 876, 860, 1004, 1025, 998, 999, 861,
+ 997, 879, 997, 879, 879, 233, 879, 251, 252, 251,
+ 1005, 1085, 882, 1005, 2813, 882, 253, 1196, 1197, 252,
+ 126, 1004, 124, 1025, 124, 251, 252, 251, 1194, 1071,
+ 124, 125, 124, 2813, 253, 126, 1094, 252, 126, 125,
+ 124, 1012, 124, 126, 339, 339, 339, 1041, 924, 125,
+
+ 1018, 2813, 1086, 126, 339, 339, 339, 909, 910, 909,
+ 910, 1087, 1094, 124, 2813, 124, 125, 125, 1012, 1014,
+ 2813, 1015, 125, 2813, 1053, 2813, 126, 1018, 1016, 1086,
+ 1017, 460, 126, 460, 1034, 2813, 1034, 1032, 1087, 124,
+ 461, 124, 2813, 1033, 1035, 801, 468, 801, 125, 967,
+ 1053, 967, 126, 462, 125, 1103, 2813, 470, 126, 124,
+ 2813, 124, 968, 1032, 1036, 928, 697, 461, 125, 1033,
+ 2813, 921, 126, 921, 921, 2813, 921, 1041, 924, 462,
+ 1041, 924, 1103, 1041, 924, 1058, 928, 697, 581, 1046,
+ 1036, 1047, 926, 212, 1059, 926, 965, 1095, 1048, 1049,
+
+ 124, 1050, 124, 1050, 1054, 927, 698, 1111, 927, 125,
+ 1051, 1058, 1118, 126, 1097, 1098, 124, 2813, 124, 926,
+ 2813, 1059, 926, 1052, 1060, 125, 808, 2813, 809, 126,
+ 1054, 927, 2813, 1111, 927, 810, 697, 1051, 811, 1118,
+ 811, 124, 2813, 124, 124, 2813, 124, 812, 2813, 1052,
+ 125, 1060, 1061, 125, 126, 1122, 939, 126, 939, 939,
+ 813, 939, 1079, 1202, 1062, 1063, 942, 2813, 1063, 942,
+ 2813, 1063, 942, 1164, 812, 1063, 942, 944, 1061, 1166,
+ 944, 1122, 1079, 1066, 1167, 1102, 813, 1068, 170, 1069,
+ 945, 1062, 2813, 945, 946, 707, 1070, 1071, 1075, 1072,
+
+ 1164, 1072, 1076, 1119, 944, 1119, 1166, 944, 1073, 946,
+ 707, 1167, 1102, 1120, 1080, 170, 945, 1081, 634, 945,
+ 822, 1074, 823, 1165, 1075, 2813, 1007, 1008, 1076, 824,
+ 707, 2813, 825, 1121, 825, 1073, 959, 852, 959, 852,
+ 1080, 826, 2813, 170, 1081, 2813, 1169, 1074, 1099, 1165,
+ 1100, 1009, 1101, 1009, 827, 1240, 1241, 841, 634, 1121,
+ 841, 2813, 841, 1099, 1010, 1100, 1007, 1149, 826, 962,
+ 170, 2813, 841, 1169, 2813, 841, 968, 841, 1101, 2813,
+ 827, 1089, 963, 1090, 962, 851, 852, 851, 852, 2813,
+ 1091, 746, 1092, 841, 125, 841, 962, 963, 126, 1151,
+
+ 1152, 170, 842, 124, 124, 124, 124, 1024, 963, 1024,
+ 1168, 962, 125, 125, 1174, 843, 126, 126, 2813, 1170,
+ 1105, 1171, 124, 963, 124, 124, 1025, 124, 170, 842,
+ 1019, 125, 1019, 1104, 125, 126, 1168, 2813, 126, 1020,
+ 1174, 843, 1108, 852, 1108, 852, 1170, 1105, 1171, 1116,
+ 1106, 1116, 1112, 1025, 1113, 1109, 1176, 2813, 1117, 1104,
+ 1107, 1114, 212, 1115, 518, 212, 518, 518, 339, 339,
+ 339, 1178, 2813, 518, 518, 1179, 1106, 518, 212, 518,
+ 518, 518, 1176, 518, 212, 518, 1107, 1128, 518, 1246,
+ 1247, 518, 212, 518, 1129, 1130, 869, 1128, 1178, 1128,
+
+ 518, 2813, 1179, 870, 745, 1155, 869, 518, 869, 1139,
+ 518, 212, 518, 1213, 1214, 876, 1140, 1141, 2813, 1139,
+ 1180, 1139, 877, 750, 2813, 876, 2813, 876, 116, 1145,
+ 2813, 1146, 116, 116, 116, 116, 116, 116, 1147, 116,
+ 1148, 883, 232, 883, 116, 883, 1180, 1206, 1177, 883,
+ 1177, 1205, 883, 1041, 924, 883, 883, 883, 1035, 883,
+ 1010, 883, 2813, 124, 2813, 124, 251, 252, 251, 1125,
+ 1126, 116, 125, 1187, 1206, 253, 126, 1205, 252, 126,
+ 252, 252, 252, 1153, 1014, 1014, 1014, 1014, 1158, 252,
+ 1158, 1207, 252, 1154, 1154, 1017, 1017, 1159, 1034, 1187,
+
+ 1034, 1160, 251, 252, 251, 579, 579, 124, 1035, 124,
+ 1153, 253, 1209, 2813, 252, 126, 125, 1207, 580, 580,
+ 126, 1046, 2813, 1046, 1208, 921, 2813, 922, 1036, 2813,
+ 1181, 1049, 579, 579, 923, 924, 1175, 925, 1209, 925,
+ 1181, 1049, 1051, 2813, 580, 580, 926, 2813, 1181, 1049,
+ 2813, 1208, 1041, 924, 1036, 1052, 1046, 1219, 1046, 927,
+ 1188, 2813, 1175, 1210, 2813, 1181, 1049, 1185, 2813, 1051,
+ 928, 697, 1218, 926, 701, 1186, 702, 1051, 1248, 1125,
+ 1126, 1052, 2813, 460, 1219, 927, 460, 1188, 460, 1210,
+ 1052, 928, 697, 1185, 1191, 579, 2813, 808, 1218, 809,
+
+ 1190, 1186, 1194, 1071, 1051, 1248, 810, 697, 580, 811,
+ 124, 811, 124, 946, 707, 124, 1052, 124, 812, 125,
+ 1191, 2813, 579, 126, 125, 1063, 942, 1190, 126, 1198,
+ 909, 813, 909, 1201, 580, 1125, 1126, 1204, 2813, 125,
+ 1192, 1249, 2813, 126, 939, 812, 940, 1194, 1071, 2813,
+ 1193, 1251, 1130, 941, 942, 1198, 943, 813, 943, 1068,
+ 1201, 1068, 1068, 1204, 1068, 944, 1192, 1249, 1194, 1071,
+ 2813, 1194, 1071, 1287, 1199, 1285, 1193, 701, 945, 702,
+ 1073, 1063, 942, 1073, 1251, 1130, 460, 1253, 1254, 460,
+ 1286, 460, 944, 1074, 946, 707, 1074, 698, 579, 1287,
+
+ 1199, 1200, 1285, 1203, 945, 1097, 1220, 1073, 1133, 1255,
+ 1073, 580, 1133, 1126, 822, 2813, 823, 1286, 1099, 1074,
+ 1099, 2813, 1074, 824, 707, 579, 825, 1200, 825, 1288,
+ 1203, 959, 852, 959, 852, 826, 1089, 580, 1089, 962,
+ 1290, 1215, 1089, 1215, 1089, 1211, 2813, 1092, 827, 212,
+ 1216, 1211, 963, 1092, 1217, 1288, 1237, 962, 1099, 1099,
+ 1099, 1100, 826, 962, 1296, 518, 962, 1290, 841, 2813,
+ 963, 841, 518, 841, 827, 518, 963, 518, 963, 962,
+ 962, 1136, 1137, 1237, 962, 1232, 852, 1232, 1233, 2813,
+ 962, 1296, 963, 963, 2813, 124, 963, 124, 1108, 852,
+
+ 1108, 852, 963, 1250, 125, 1250, 962, 962, 126, 1108,
+ 852, 1108, 852, 1120, 851, 852, 851, 852, 963, 963,
+ 1224, 807, 1225, 125, 1234, 468, 124, 126, 124, 1226,
+ 1095, 1112, 1227, 1112, 1227, 125, 1136, 1137, 2813, 126,
+ 1238, 1228, 1115, 1289, 1235, 1108, 852, 1108, 852, 2813,
+ 1234, 124, 468, 124, 1229, 1136, 1137, 1116, 1109, 1116,
+ 125, 1112, 2813, 1112, 126, 1242, 1117, 1242, 1228, 1289,
+ 1238, 1235, 1115, 1291, 1243, 1236, 1256, 1141, 1244, 2813,
+ 1229, 116, 166, 1293, 166, 116, 116, 116, 116, 116,
+ 116, 167, 116, 116, 116, 168, 116, 116, 988, 1291,
+
+ 1230, 2813, 1236, 1256, 1141, 989, 990, 518, 988, 1293,
+ 988, 1258, 1259, 869, 518, 2813, 1119, 518, 1119, 518,
+ 870, 745, 2813, 869, 116, 869, 1120, 1230, 116, 166,
+ 2813, 166, 116, 116, 116, 116, 116, 116, 167, 116,
+ 116, 116, 168, 116, 116, 997, 1121, 1144, 1260, 518,
+ 1144, 1137, 998, 999, 2813, 997, 518, 997, 876, 518,
+ 1324, 518, 1231, 1156, 1157, 877, 750, 1145, 876, 1145,
+ 876, 116, 1121, 1145, 2813, 1145, 1261, 1239, 1148, 1156,
+ 1274, 1265, 1261, 1265, 1148, 1263, 1264, 1324, 1231, 883,
+ 1266, 1276, 1277, 2813, 1267, 746, 883, 868, 1272, 883,
+
+ 124, 883, 124, 1151, 1268, 1273, 1149, 2813, 1272, 125,
+ 1272, 1325, 701, 126, 702, 2813, 1158, 2813, 1158, 1279,
+ 1280, 460, 1162, 1281, 460, 1159, 460, 1295, 701, 1160,
+ 702, 1283, 1284, 579, 339, 339, 339, 460, 1325, 1297,
+ 460, 1160, 460, 1173, 1298, 1173, 580, 1323, 124, 579,
+ 124, 1183, 1184, 1295, 1177, 2813, 1177, 125, 1183, 1299,
+ 579, 126, 580, 1334, 1035, 1297, 1303, 1049, 1294, 1333,
+ 1298, 2813, 580, 1323, 1292, 2813, 579, 1181, 1049, 1181,
+ 1049, 1041, 924, 1041, 924, 928, 697, 1305, 580, 1334,
+ 1306, 2813, 921, 2813, 922, 1294, 1333, 1304, 928, 697,
+
+ 1292, 923, 924, 124, 925, 124, 925, 1307, 1196, 1197,
+ 2813, 1308, 125, 926, 1305, 1369, 126, 1306, 124, 1309,
+ 124, 1196, 1312, 1304, 1316, 1071, 927, 125, 1194, 1071,
+ 2813, 126, 1310, 1307, 2813, 1194, 1071, 1308, 1063, 942,
+ 926, 1369, 1311, 1318, 1368, 1309, 1063, 942, 1317, 946,
+ 707, 939, 927, 940, 2813, 1319, 946, 707, 1310, 1155,
+ 941, 942, 1320, 943, 2813, 943, 1416, 1213, 1214, 1311,
+ 1318, 1368, 944, 2813, 1317, 1321, 2813, 1322, 959, 852,
+ 959, 852, 1319, 1155, 2813, 945, 1275, 2813, 1320, 1240,
+ 1241, 1213, 1326, 1416, 1328, 1329, 1099, 2813, 1100, 944,
+
+ 1215, 1321, 1215, 1322, 2813, 841, 1278, 2813, 841, 1216,
+ 841, 945, 1417, 1217, 1331, 1332, 807, 962, 929, 1099,
+ 2813, 1100, 1240, 1357, 1343, 1095, 1345, 1346, 841, 2813,
+ 963, 841, 1217, 841, 807, 2813, 1224, 807, 1224, 1417,
+ 962, 807, 1343, 1095, 962, 1343, 1095, 1359, 1360, 1343,
+ 1095, 2813, 807, 963, 1362, 1363, 963, 1228, 1246, 1364,
+ 1343, 1095, 1366, 1367, 1224, 807, 1224, 962, 1253, 1254,
+ 1229, 1253, 1370, 1343, 1095, 2813, 1347, 1374, 1130, 963,
+ 1224, 807, 1225, 2813, 1228, 1228, 1242, 1348, 1242, 1226,
+ 1095, 124, 1227, 124, 1227, 1243, 1229, 2813, 1229, 1244,
+
+ 125, 1228, 1347, 2813, 126, 2813, 1353, 1354, 1353, 1354,
+ 518, 1355, 1228, 1348, 1229, 125, 124, 518, 124, 126,
+ 518, 212, 518, 518, 1229, 125, 1258, 1259, 1228, 126,
+ 518, 1258, 1375, 518, 1414, 518, 1422, 518, 1355, 2813,
+ 1229, 1336, 920, 1337, 518, 1356, 2813, 518, 1244, 518,
+ 1338, 1339, 2813, 1340, 518, 1340, 2813, 1250, 883, 1250,
+ 1414, 518, 1341, 1422, 518, 883, 518, 1120, 883, 988,
+ 883, 1356, 1379, 1141, 1239, 1342, 989, 990, 997, 988,
+ 2813, 988, 1263, 1264, 1239, 998, 999, 1358, 997, 1341,
+ 997, 1361, 1263, 1380, 1418, 1382, 1383, 1276, 1395, 1385,
+
+ 1386, 1342, 116, 166, 1423, 166, 116, 116, 116, 116,
+ 116, 116, 167, 116, 116, 116, 168, 116, 116, 1265,
+ 1418, 1265, 2813, 883, 1279, 1405, 1407, 1408, 1266, 1425,
+ 883, 1423, 1267, 883, 1267, 883, 1283, 1409, 1349, 868,
+ 1272, 1413, 1281, 1303, 1049, 116, 868, 1273, 1149, 868,
+ 1272, 992, 1272, 2813, 1391, 1149, 1425, 1391, 1149, 1393,
+ 1394, 339, 339, 339, 1349, 116, 166, 1453, 166, 116,
+ 116, 116, 116, 116, 116, 167, 116, 116, 116, 168,
+ 116, 116, 987, 1388, 1421, 1424, 1419, 2813, 1419, 2813,
+ 1389, 1390, 2813, 1388, 1453, 1388, 1350, 339, 339, 339,
+
+ 251, 252, 251, 2813, 1177, 2813, 1177, 2813, 116, 253,
+ 1421, 1424, 252, 126, 1035, 1420, 1415, 1427, 1428, 1303,
+ 1049, 2813, 1350, 1172, 1232, 852, 1232, 1233, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+ 701, 1420, 702, 1415, 1430, 1431, 928, 697, 1399, 460,
+ 1400, 2813, 460, 1578, 460, 1352, 1579, 1401, 1274, 2813,
+ 1402, 579, 1402, 701, 2813, 702, 1172, 1181, 1049, 1403,
+ 1181, 1049, 460, 1437, 580, 460, 1432, 460, 1041, 924,
+ 1578, 1352, 1404, 1579, 579, 1041, 924, 2813, 579, 1438,
+ 2813, 1438, 928, 697, 1433, 1580, 1403, 580, 125, 1437,
+
+ 580, 2813, 126, 1432, 1434, 1454, 1435, 1436, 1404, 1316,
+ 1071, 579, 124, 2813, 124, 1441, 1442, 1316, 1071, 2813,
+ 1433, 125, 1580, 580, 2813, 126, 1444, 1445, 1194, 1071,
+ 1434, 1454, 1435, 2813, 1436, 1194, 1071, 1446, 2813, 1063,
+ 942, 1439, 1063, 942, 1469, 946, 707, 946, 707, 1452,
+ 1354, 1452, 1354, 1275, 1470, 1359, 1498, 1362, 1504, 1447,
+ 1450, 1328, 1455, 1449, 1446, 1448, 2813, 1439, 1278, 1099,
+ 1469, 1100, 1506, 1507, 1451, 2813, 1331, 1465, 841, 2813,
+ 1470, 841, 2813, 841, 1406, 1447, 920, 1450, 1042, 1449,
+ 962, 1448, 1467, 1468, 1471, 1339, 1473, 1474, 920, 1099,
+
+ 1451, 1100, 1514, 963, 1366, 1508, 1471, 1339, 841, 1374,
+ 1130, 841, 2813, 841, 1336, 920, 1336, 962, 920, 2813,
+ 962, 1516, 1517, 1471, 1339, 2813, 1471, 1339, 1514, 963,
+ 1459, 1398, 1460, 963, 2813, 1341, 1336, 920, 1336, 1461,
+ 1326, 920, 1462, 2813, 1462, 1471, 1339, 962, 1342, 1471,
+ 1339, 1463, 929, 1483, 1374, 1130, 1623, 1341, 929, 963,
+ 1345, 1346, 1341, 1056, 1464, 2813, 1345, 1485, 1519, 1520,
+ 1342, 1487, 1474, 807, 1342, 2813, 1484, 807, 1463, 1483,
+ 2813, 1343, 1095, 1623, 1341, 1343, 1095, 1379, 1141, 2813,
+ 1464, 1522, 1523, 1489, 1379, 1141, 1342, 1476, 1045, 1477,
+
+ 2813, 1488, 1484, 1525, 1526, 2813, 1478, 1479, 1358, 1480,
+ 2813, 1480, 1353, 1354, 1353, 1354, 1382, 1527, 1481, 2813,
+ 1489, 125, 2813, 851, 852, 851, 852, 1488, 124, 2813,
+ 124, 1482, 125, 1556, 1274, 2813, 126, 125, 2813, 518,
+ 2813, 126, 1250, 518, 1250, 1481, 518, 2813, 1497, 518,
+ 518, 518, 1120, 518, 1502, 518, 2813, 1482, 1224, 807,
+ 1225, 1503, 1357, 2813, 1502, 1361, 1502, 1226, 1095, 2813,
+ 1227, 518, 1227, 1385, 1533, 1497, 2813, 1512, 518, 1228,
+ 2813, 518, 1505, 518, 1513, 1364, 883, 1512, 1581, 1512,
+ 1535, 1536, 1229, 883, 1501, 1531, 883, 2813, 883, 1558,
+
+ 1559, 883, 1532, 1380, 2813, 1531, 1228, 1531, 883, 1556,
+ 1274, 883, 1582, 883, 1581, 1556, 1274, 1583, 1229, 116,
+ 166, 2813, 166, 116, 116, 116, 116, 116, 116, 167,
+ 116, 116, 116, 168, 116, 116, 2813, 987, 1582, 987,
+ 2813, 1124, 1560, 1583, 1490, 1537, 1390, 1537, 1390, 1539,
+ 1540, 2813, 1127, 1542, 1407, 1562, 1413, 1281, 992, 2813,
+ 1543, 1544, 116, 1542, 1585, 1542, 1393, 1394, 1560, 1556,
+ 1274, 1490, 116, 166, 2813, 166, 116, 116, 116, 116,
+ 116, 116, 167, 116, 116, 116, 168, 116, 116, 992,
+ 1585, 1132, 2813, 868, 1272, 2813, 1561, 1393, 1545, 1547,
+
+ 1540, 1273, 1149, 1419, 1272, 1419, 1272, 1573, 1574, 1491,
+ 1413, 1281, 1576, 1577, 2813, 116, 339, 339, 339, 339,
+ 339, 339, 1561, 1427, 1428, 1587, 1588, 1430, 1589, 1591,
+ 1588, 2813, 1420, 1441, 1442, 1491, 1172, 1492, 852, 1492,
+ 1233, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1493, 1172, 1172, 252, 252, 252, 1041, 924, 1420, 1438,
+ 2813, 1438, 252, 1606, 1607, 252, 1444, 1608, 125, 1610,
+ 1607, 1600, 1671, 1357, 1181, 1049, 928, 697, 1649, 1172,
+ 1172, 1492, 852, 1492, 1233, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1493, 1172, 1172, 1399, 1600, 1400,
+
+ 1598, 2813, 1603, 1549, 1649, 1550, 1401, 1274, 2813, 1402,
+ 1767, 1402, 1551, 1552, 1495, 1553, 1648, 1553, 1403, 2813,
+ 1399, 2813, 1399, 1172, 1554, 1399, 1598, 1399, 1603, 1556,
+ 1274, 1404, 1671, 1357, 1556, 1274, 1767, 1555, 2813, 1398,
+ 1495, 1403, 2813, 1648, 1768, 1403, 1403, 1632, 1326, 1063,
+ 942, 1554, 1557, 701, 1404, 702, 1770, 1404, 2813, 1404,
+ 1634, 1635, 460, 1555, 1619, 460, 1835, 460, 1403, 1566,
+ 1768, 1567, 1689, 1403, 579, 2813, 1181, 1049, 1568, 1405,
+ 1404, 1569, 1770, 1569, 1046, 1404, 1047, 580, 1041, 924,
+ 1570, 1619, 1835, 1048, 1049, 2813, 1050, 1599, 1050, 1689,
+
+ 1592, 579, 1593, 1571, 2813, 1051, 928, 697, 2813, 1594,
+ 1049, 1398, 1595, 580, 1595, 1601, 2813, 1570, 1052, 1632,
+ 1326, 1596, 124, 1599, 124, 1673, 1674, 1602, 2813, 1571,
+ 1769, 125, 1051, 518, 1597, 126, 1771, 1068, 1947, 1069,
+ 518, 1601, 1604, 518, 1052, 518, 1070, 1071, 1596, 1072,
+ 1836, 1072, 1611, 1602, 1612, 1194, 1071, 1769, 1073, 2813,
+ 1597, 1613, 1071, 1771, 1614, 1947, 1614, 1194, 1071, 1604,
+ 2813, 1074, 1948, 1615, 1063, 942, 1836, 946, 707, 946,
+ 707, 1617, 1506, 1675, 2813, 1073, 1616, 2813, 1618, 1452,
+ 1354, 1452, 1354, 959, 852, 959, 852, 1074, 1621, 1948,
+
+ 1615, 1620, 1685, 1364, 2813, 1622, 2813, 1617, 2813, 1459,
+ 1398, 1459, 1616, 1406, 1618, 1685, 1364, 1398, 1632, 1326,
+ 1398, 1467, 1638, 1949, 1621, 1632, 1326, 1620, 1632, 1326,
+ 1463, 1622, 1459, 1398, 1460, 1687, 1688, 2813, 1459, 1398,
+ 1459, 1461, 1326, 1464, 1462, 1881, 1462, 1632, 1326, 1099,
+ 1949, 1100, 1636, 1463, 2813, 1637, 1042, 1463, 841, 1463,
+ 2813, 841, 2001, 841, 1473, 1474, 1464, 1042, 2813, 1464,
+ 962, 1881, 1464, 1516, 1517, 1473, 1474, 2813, 1636, 1042,
+ 1463, 1637, 1045, 963, 1691, 1692, 1463, 1473, 1474, 2001,
+ 1650, 1479, 1464, 1625, 1548, 1626, 2813, 962, 1464, 1519,
+
+ 1693, 2813, 1627, 1628, 1946, 1629, 2813, 1629, 1182, 963,
+ 1476, 1045, 1476, 1045, 1630, 1045, 1652, 1653, 2813, 1650,
+ 1479, 1650, 1479, 1650, 1479, 2813, 1045, 1631, 1695, 1692,
+ 1946, 1481, 1522, 1523, 1650, 1479, 2000, 920, 1476, 1045,
+ 1476, 1630, 2813, 1056, 1482, 1471, 1339, 1650, 1479, 2813,
+ 1654, 1487, 1658, 1631, 1642, 1565, 1643, 2088, 1481, 1481,
+ 2813, 1655, 2000, 1644, 1465, 1656, 1645, 2813, 1645, 1056,
+ 1482, 1099, 1482, 1100, 2813, 1646, 1654, 1487, 1474, 2813,
+ 841, 807, 2038, 841, 2088, 841, 1481, 1655, 1647, 1343,
+ 1095, 1656, 962, 1699, 1700, 920, 1525, 1701, 1482, 1703,
+
+ 1700, 807, 1646, 1471, 1339, 963, 1725, 1552, 2038, 1343,
+ 1095, 1657, 2813, 1660, 1647, 1336, 920, 1337, 1659, 962,
+ 1492, 852, 1492, 1233, 1338, 1339, 1501, 1340, 2130, 1340,
+ 2813, 963, 1727, 1728, 1710, 1380, 1341, 2813, 1657, 1660,
+ 1664, 1354, 1664, 1354, 2213, 1659, 1725, 1552, 2813, 1342,
+ 1558, 1559, 1501, 1665, 2130, 1353, 1354, 1353, 1354, 1502,
+ 1710, 1380, 2813, 1341, 125, 1672, 1503, 1357, 126, 1502,
+ 2213, 1502, 1668, 1712, 1713, 1342, 1224, 807, 1225, 1669,
+ 1670, 2813, 1668, 2813, 1668, 1226, 1095, 2014, 1227, 2014,
+ 1227, 1679, 1558, 1739, 2813, 883, 167, 1228, 1680, 1504,
+
+ 1505, 1679, 883, 1679, 1512, 883, 2813, 883, 1535, 1714,
+ 1229, 1513, 1364, 1682, 1512, 2813, 1512, 1741, 1728, 1128,
+ 1683, 1684, 2813, 1682, 1228, 1682, 1129, 1130, 2813, 1128,
+ 2813, 1128, 1725, 1552, 1752, 1405, 1229, 116, 166, 2335,
+ 166, 116, 116, 116, 116, 116, 116, 167, 116, 116,
+ 116, 168, 116, 116, 1696, 1754, 1755, 1752, 1405, 1737,
+ 2813, 1697, 1130, 1139, 1696, 2335, 1696, 2813, 1661, 1704,
+ 1140, 1141, 2813, 1139, 1124, 1139, 1705, 1141, 1124, 1704,
+ 116, 1704, 1539, 1540, 1124, 1737, 1539, 1540, 2813, 1556,
+ 1274, 2813, 1539, 1540, 1661, 116, 166, 1743, 166, 116,
+
+ 116, 116, 116, 116, 116, 167, 116, 116, 116, 168,
+ 116, 116, 1501, 1531, 1573, 1574, 1759, 1760, 1762, 1763,
+ 1532, 1380, 2251, 1531, 1743, 1531, 1667, 1707, 2813, 1725,
+ 1552, 1662, 1678, 1718, 1708, 1709, 2813, 1707, 116, 1707,
+ 1719, 1533, 1127, 1718, 1127, 1718, 1252, 1576, 1764, 2251,
+ 1720, 1544, 1720, 1544, 1722, 1723, 1738, 1662, 1172, 1492,
+ 852, 1492, 1233, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 2813, 1172, 1172, 987, 1388, 1766, 1760, 2813,
+ 883, 2813, 1738, 1389, 1390, 1132, 1388, 883, 1388, 1132,
+ 883, 2813, 883, 1547, 1724, 1413, 1281, 1547, 1540, 1587,
+
+ 1588, 1172, 1172, 1492, 852, 1492, 1233, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1172, 1172, 1493, 1172, 1172, 868,
+ 1272, 1556, 1274, 339, 339, 339, 2813, 1273, 1149, 2813,
+ 1272, 2813, 1272, 339, 339, 339, 1587, 1588, 1591, 1778,
+ 2813, 1742, 1591, 1588, 2457, 1172, 1172, 1492, 852, 1492,
+ 1233, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1493, 1172, 1172, 1549, 2813, 1549, 1549, 1742, 1549, 1430,
+ 1431, 2457, 1725, 1552, 2813, 1725, 1552, 1663, 1303, 1049,
+ 2813, 1730, 2813, 1731, 1554, 1752, 1405, 1554, 2813, 1172,
+ 1732, 1733, 2813, 1734, 2813, 1734, 1399, 1555, 1400, 2813,
+
+ 1555, 2813, 1735, 1663, 2813, 1401, 1274, 1438, 1402, 1438,
+ 1402, 1554, 1756, 2813, 1554, 1736, 125, 1403, 1752, 1405,
+ 126, 1181, 1049, 1555, 2813, 1566, 1555, 1567, 2813, 1735,
+ 1404, 928, 697, 2813, 1568, 1405, 1781, 1569, 1756, 1569,
+ 1745, 1736, 1746, 2813, 1403, 1757, 1570, 1606, 1607, 1747,
+ 1748, 1785, 1749, 2813, 1749, 1566, 1404, 1566, 1566, 1571,
+ 1566, 1750, 2813, 1781, 1752, 1405, 2813, 1752, 1405, 928,
+ 697, 1757, 2813, 1570, 1751, 2813, 1570, 1785, 2813, 1570,
+ 1606, 1607, 1610, 1793, 1786, 1571, 1303, 1049, 1750, 1571,
+ 1610, 1607, 1571, 1444, 1445, 1772, 2813, 1773, 1316, 1071,
+
+ 1751, 1851, 1670, 1570, 1774, 1428, 1570, 1775, 2813, 1775,
+ 1592, 1786, 1593, 1779, 2813, 1571, 1776, 2813, 1571, 1594,
+ 1049, 2813, 1595, 2813, 1595, 1592, 2813, 1592, 1592, 1777,
+ 1592, 1596, 1041, 924, 1303, 1049, 2813, 1303, 1049, 1779,
+ 1303, 1049, 2813, 1776, 1597, 2813, 1596, 1181, 1049, 1596,
+ 2813, 1041, 924, 1783, 2813, 1777, 1851, 1670, 1596, 1597,
+ 1194, 1071, 1597, 2813, 1316, 1071, 2813, 1780, 1853, 1854,
+ 1597, 1316, 1071, 1596, 1782, 1796, 1596, 1784, 1548, 1783,
+ 1787, 2813, 1788, 1673, 1674, 1597, 1802, 1628, 1597, 1789,
+ 1442, 1794, 1790, 1780, 1790, 1611, 2813, 1612, 1795, 2813,
+
+ 1782, 1791, 1796, 1784, 1613, 1071, 2813, 1614, 2813, 1614,
+ 1611, 2813, 1611, 1611, 1792, 1611, 1615, 1794, 2813, 1316,
+ 1071, 2813, 1316, 1071, 1795, 1194, 1071, 2813, 1791, 1616,
+ 1726, 1615, 1063, 942, 1615, 2813, 1063, 942, 1804, 1805,
+ 1792, 946, 707, 1615, 1616, 946, 707, 1616, 1452, 1354,
+ 1452, 1354, 1797, 1798, 2813, 1616, 1801, 2813, 1615, 1673,
+ 1859, 1615, 1799, 1548, 2813, 1800, 1625, 1548, 1625, 2813,
+ 1616, 1802, 1628, 1616, 2813, 1802, 1628, 2813, 1797, 1798,
+ 2813, 1548, 2813, 1801, 1625, 1548, 1625, 1630, 1799, 1802,
+ 1628, 1800, 2813, 1802, 1628, 1548, 1861, 1854, 1557, 2813,
+
+ 1631, 1557, 2813, 1802, 1628, 1630, 1634, 1635, 2813, 1634,
+ 1816, 1740, 2813, 1398, 1630, 1398, 1814, 2813, 1631, 1818,
+ 1805, 1632, 1326, 1632, 1326, 1565, 1631, 1642, 1565, 1642,
+ 1815, 1820, 1630, 1829, 1465, 2813, 1829, 1465, 1866, 1504,
+ 2813, 1819, 1814, 1753, 1631, 1807, 1729, 1808, 1646, 1866,
+ 1504, 1831, 1832, 2813, 1809, 1810, 1815, 1811, 1820, 1811,
+ 1565, 1647, 1642, 1565, 1642, 1565, 1812, 1819, 1829, 1465,
+ 2813, 1829, 1465, 1829, 1465, 1646, 1565, 1868, 1869, 1813,
+ 1182, 2813, 1182, 1646, 1829, 1465, 1302, 1647, 1652, 1653,
+ 1652, 1837, 2813, 1812, 1841, 1479, 1647, 1870, 1684, 2813,
+
+ 1833, 1870, 1684, 2813, 1045, 1813, 1459, 1398, 1460, 2813,
+ 1646, 1834, 1650, 1479, 2813, 1461, 1326, 2813, 1462, 2813,
+ 1462, 1856, 1647, 1872, 1873, 2813, 1833, 1463, 1857, 1858,
+ 1045, 1856, 1842, 1856, 920, 2813, 807, 1834, 1650, 1479,
+ 1464, 2813, 1471, 1339, 1343, 1095, 1843, 2813, 920, 1687,
+ 1688, 1844, 2813, 807, 1463, 2813, 1471, 1339, 1842, 1687,
+ 1878, 1343, 1095, 1880, 1873, 2813, 1464, 1642, 1565, 1643,
+ 1846, 1691, 1692, 1843, 1691, 1692, 1644, 1465, 1844, 1645,
+ 1845, 1645, 1847, 1664, 1354, 1664, 1354, 2813, 1646, 1664,
+ 1354, 1664, 1354, 1695, 1884, 1502, 1846, 1664, 1354, 1664,
+
+ 1354, 1647, 1503, 1357, 1679, 1502, 1845, 1502, 1847, 2813,
+ 1665, 1680, 1504, 1863, 1679, 1646, 1679, 1695, 1692, 2813,
+ 1864, 1865, 2813, 1863, 1875, 1863, 2813, 1647, 1822, 1744,
+ 1823, 1876, 1877, 2813, 1875, 2813, 1875, 1824, 1825, 2813,
+ 1826, 2813, 1826, 1512, 1374, 1130, 1519, 1520, 2813, 1827,
+ 1513, 1364, 2813, 1512, 2813, 1512, 1882, 1699, 1700, 1699,
+ 1700, 2813, 1828, 1883, 1517, 1696, 1882, 2813, 1882, 1703,
+ 1887, 1885, 1697, 1130, 2813, 1696, 1827, 1696, 1886, 1523,
+ 2813, 1885, 2813, 1885, 2813, 1704, 1703, 1700, 1828, 1336,
+ 920, 1337, 1705, 1141, 2813, 1704, 2813, 1704, 1338, 1339,
+
+ 1667, 1340, 2813, 1340, 1379, 1141, 1525, 1526, 1888, 1709,
+ 1341, 1667, 2813, 1852, 1727, 1728, 1855, 1893, 2813, 1888,
+ 1709, 1890, 1891, 1342, 1894, 1895, 1672, 1893, 2813, 1893,
+ 1672, 2813, 1860, 2813, 1712, 1713, 1678, 1341, 1712, 1896,
+ 1898, 1891, 1727, 1728, 1903, 1533, 1727, 1728, 2813, 1342,
+ 116, 166, 2813, 166, 116, 116, 116, 116, 116, 116,
+ 167, 116, 116, 116, 168, 116, 116, 2813, 1501, 1531,
+ 1912, 1733, 1914, 1915, 1678, 1718, 1532, 1380, 2813, 1531,
+ 1848, 1531, 1719, 1533, 2813, 1718, 1678, 1718, 1862, 1900,
+ 1912, 1733, 2813, 116, 1903, 1533, 1901, 1902, 2813, 1900,
+
+ 2813, 1900, 1741, 1920, 1741, 1728, 1848, 116, 166, 2813,
+ 166, 116, 116, 116, 116, 116, 116, 167, 116, 116,
+ 116, 168, 116, 116, 2813, 1867, 2813, 1252, 2813, 1252,
+ 2813, 1373, 1849, 1905, 1906, 1722, 1723, 1722, 1907, 1911,
+ 1544, 1923, 1748, 987, 1388, 1925, 1926, 1725, 1552, 2813,
+ 116, 1389, 1390, 2813, 1388, 1919, 1388, 1556, 1274, 1849,
+ 1172, 1492, 852, 1492, 1233, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1493, 1172, 1172, 2813, 1549, 1850,
+ 1550, 1922, 1919, 2813, 1730, 2813, 1730, 1551, 1552, 2813,
+ 1553, 2813, 1553, 1912, 1733, 2813, 1725, 1552, 2813, 1554,
+
+ 1730, 2813, 1730, 1172, 2813, 1735, 1850, 1922, 2813, 1912,
+ 1733, 2813, 1555, 1912, 1733, 701, 1918, 702, 1736, 1912,
+ 1733, 1735, 1556, 1274, 460, 2813, 1554, 460, 2813, 460,
+ 2813, 1921, 1735, 2813, 1736, 2813, 579, 2813, 1555, 2813,
+ 1916, 2813, 1918, 1399, 1736, 1400, 1917, 2813, 1735, 580,
+ 1923, 1748, 1401, 1274, 2813, 1402, 2813, 1402, 1921, 1745,
+ 1736, 1745, 2813, 579, 1403, 2813, 1916, 2813, 1923, 1748,
+ 1923, 1748, 1917, 2813, 1745, 580, 1745, 1404, 1923, 1748,
+ 1750, 1754, 1755, 1923, 1748, 1754, 1937, 1939, 1926, 2813,
+ 1928, 1403, 1929, 1751, 2813, 1750, 2813, 1935, 2813, 1930,
+
+ 1931, 2813, 1932, 1404, 1932, 1936, 2813, 1750, 1751, 1752,
+ 1405, 1933, 2813, 1752, 1405, 1759, 1760, 2813, 1566, 1751,
+ 1567, 1941, 1750, 1935, 1934, 1759, 1760, 1568, 1405, 1940,
+ 1569, 1936, 1569, 2813, 1751, 1573, 1574, 2813, 1933, 1570,
+ 1762, 1763, 1943, 1944, 1413, 1281, 1766, 1945, 1941, 1772,
+ 1934, 1772, 1571, 1766, 1760, 1940, 1587, 1588, 1427, 1428,
+ 1427, 1428, 1427, 1428, 2813, 1772, 1570, 1772, 1427, 1428,
+ 1776, 1303, 1049, 2813, 1427, 1428, 1181, 1049, 1571, 1953,
+ 1303, 1049, 1772, 1777, 1773, 2813, 1776, 1181, 1049, 1950,
+ 2813, 1774, 1428, 2813, 1775, 1951, 1775, 1776, 2813, 1777,
+
+ 1952, 2813, 1955, 1776, 1041, 924, 1953, 2813, 1954, 1777,
+ 1958, 2813, 1958, 1776, 2813, 1950, 1777, 1041, 924, 928,
+ 697, 1951, 1606, 1607, 1956, 1777, 1952, 2813, 1955, 2813,
+ 1776, 1787, 1957, 1787, 1954, 928, 697, 1787, 2813, 1787,
+ 1441, 1442, 1777, 1441, 1442, 2813, 1441, 1442, 1441, 1442,
+ 1956, 2813, 1791, 1441, 1442, 1959, 1194, 1071, 1791, 1957,
+ 2813, 1316, 1071, 1194, 1071, 1792, 2813, 1316, 1071, 1963,
+ 2813, 1792, 1063, 942, 1787, 1960, 1788, 1964, 2813, 1791,
+ 1961, 1959, 2813, 1789, 1442, 1791, 1790, 1962, 1790, 1965,
+ 2813, 1792, 1966, 1853, 1854, 1791, 1963, 1792, 2813, 1063,
+
+ 942, 1960, 1968, 1964, 1968, 2813, 1961, 2813, 1792, 946,
+ 707, 946, 707, 1962, 1967, 1965, 1726, 2813, 1966, 1726,
+ 1853, 1854, 1791, 1726, 1804, 1805, 2813, 1804, 1805, 1969,
+ 1729, 1804, 1805, 2813, 1792, 1913, 2813, 1729, 1970, 1810,
+ 1740, 1967, 2813, 1972, 1973, 1970, 1810, 2813, 1818, 1978,
+ 1807, 1729, 1807, 1729, 2813, 1969, 1625, 1548, 1626, 1970,
+ 1810, 1970, 1810, 1853, 1854, 1627, 1628, 1729, 1629, 2813,
+ 1629, 1812, 1807, 1729, 1807, 1970, 1810, 1630, 2017, 1858,
+ 2813, 1970, 1810, 1548, 1813, 2813, 1740, 1099, 1974, 1100,
+ 1631, 1802, 1628, 1812, 1818, 1805, 841, 2813, 1812, 841,
+
+ 2813, 841, 1975, 2813, 1630, 2813, 1813, 2813, 962, 1548,
+ 1813, 1976, 2017, 1858, 1974, 1744, 1631, 1802, 1628, 2813,
+ 1812, 963, 1398, 1981, 1825, 1977, 2019, 2020, 1975, 2813,
+ 1632, 1326, 1813, 1924, 2813, 962, 1398, 1976, 2813, 1979,
+ 2813, 1983, 1984, 2813, 1632, 1326, 2813, 963, 1822, 1744,
+ 1822, 1744, 1977, 1459, 1398, 1460, 2813, 1981, 1825, 1981,
+ 1825, 2813, 1461, 1326, 2813, 1462, 1979, 1462, 1980, 1827,
+ 1822, 1744, 1822, 2813, 1463, 1744, 2813, 1744, 2813, 1981,
+ 1825, 1753, 1828, 1981, 1825, 1981, 1825, 1464, 518, 1831,
+ 1832, 1827, 1861, 2021, 1980, 518, 1827, 1753, 518, 2813,
+
+ 518, 1463, 1861, 1854, 1828, 1831, 1995, 1938, 1828, 2813,
+ 1993, 1565, 1994, 1464, 1565, 1997, 1984, 1302, 1827, 1829,
+ 1465, 2813, 1829, 1465, 2813, 1841, 1479, 1999, 2022, 1865,
+ 1828, 1986, 1927, 1987, 2022, 1865, 1993, 2813, 1994, 1426,
+ 1988, 1989, 1998, 1990, 2813, 1990, 2813, 2003, 2004, 1302,
+ 2813, 1429, 1991, 1045, 1999, 2024, 2025, 1841, 1479, 2006,
+ 2007, 1650, 1479, 1045, 2813, 1992, 2813, 920, 1998, 920,
+ 2008, 1650, 1479, 2813, 1668, 1471, 1339, 1471, 1339, 1991,
+ 807, 1669, 1670, 2813, 1668, 2813, 1668, 2813, 1343, 1095,
+ 2813, 1992, 1642, 1565, 1643, 2009, 2011, 2008, 1868, 1869,
+
+ 807, 1644, 1465, 2010, 1645, 2813, 1645, 2813, 1343, 1095,
+ 1868, 2030, 2813, 1646, 2813, 2013, 2032, 2025, 1872, 1873,
+ 1502, 2009, 2011, 2012, 1872, 1873, 1647, 1503, 1357, 2010,
+ 1502, 2813, 1502, 1872, 1873, 2027, 2033, 1877, 2033, 1877,
+ 1646, 2013, 2028, 2029, 2813, 2027, 2813, 2027, 2035, 2036,
+ 2012, 2813, 1647, 116, 2014, 2813, 2014, 116, 116, 116,
+ 116, 116, 116, 167, 116, 116, 116, 168, 116, 116,
+ 1679, 1880, 2037, 1880, 1873, 2813, 1682, 1680, 1504, 2813,
+ 1679, 2813, 1679, 1683, 1684, 2813, 1682, 2813, 1682, 1516,
+ 1517, 1691, 1692, 1522, 1523, 2813, 116, 116, 166, 2813,
+
+ 166, 116, 116, 116, 116, 116, 116, 167, 116, 116,
+ 116, 168, 116, 116, 518, 1699, 1700, 1914, 1915, 1914,
+ 2061, 518, 1512, 2813, 518, 2813, 518, 2015, 2813, 1513,
+ 1364, 1882, 1512, 2813, 1512, 2065, 1733, 1885, 1883, 1517,
+ 116, 1882, 1852, 1882, 1886, 1523, 2813, 1885, 2813, 1885,
+ 1890, 1891, 2813, 2015, 1172, 1492, 852, 1492, 1233, 1172,
+ 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1493, 1172,
+ 1172, 1852, 2813, 1852, 2813, 2016, 1667, 1707, 2813, 1890,
+ 1891, 1890, 1891, 1855, 1708, 1709, 1855, 1707, 2813, 1707,
+ 2018, 2039, 1895, 883, 2039, 1895, 2813, 1172, 2041, 2042,
+
+ 883, 1860, 2016, 883, 1860, 883, 1501, 1531, 2813, 1898,
+ 2043, 2813, 1898, 1891, 1532, 1380, 1862, 1531, 1862, 1531,
+ 2023, 2813, 2026, 2049, 2044, 1902, 2044, 1902, 2046, 2047,
+ 2050, 2051, 1867, 2049, 1867, 2049, 2031, 2813, 1678, 1718,
+ 1905, 1906, 1905, 2052, 2054, 2047, 1719, 1533, 1373, 1718,
+ 1515, 1718, 1373, 2813, 1518, 2813, 1911, 1544, 2056, 2057,
+ 1911, 1544, 2059, 2060, 1912, 1733, 1912, 1733, 1725, 1552,
+ 1725, 1552, 1556, 1274, 2067, 1556, 1274, 2068, 1549, 2813,
+ 1550, 1925, 1926, 2813, 2066, 1925, 1926, 1551, 1552, 2813,
+ 1553, 2813, 1553, 2813, 2069, 2813, 2071, 2813, 2070, 1554,
+
+ 2813, 2067, 1925, 1926, 2068, 2072, 1931, 1745, 2813, 1746,
+ 2066, 2813, 1555, 2074, 2075, 2813, 1747, 1748, 2813, 1749,
+ 2069, 1749, 2071, 1928, 2070, 1928, 1554, 1928, 1750, 1928,
+ 2072, 1931, 2072, 1931, 1923, 1748, 2072, 1931, 1555, 2072,
+ 1931, 1751, 2072, 1931, 1933, 1939, 2080, 2813, 1933, 1939,
+ 1926, 701, 2813, 702, 2078, 1750, 2813, 1934, 1943, 2083,
+ 460, 1934, 2813, 460, 2813, 460, 2076, 1751, 2813, 2077,
+ 2813, 1933, 579, 1923, 1748, 1933, 1752, 1405, 2087, 1763,
+ 2078, 2079, 2813, 1934, 1566, 580, 1567, 1934, 1752, 1405,
+ 1573, 1574, 2076, 1568, 1405, 2077, 1569, 2081, 1569, 579,
+
+ 2082, 701, 2813, 702, 2813, 1570, 1427, 1428, 2079, 2813,
+ 460, 580, 2813, 460, 2090, 460, 1303, 1049, 1571, 339,
+ 339, 339, 579, 2813, 2081, 2091, 2082, 252, 252, 252,
+ 1427, 1428, 1570, 1303, 1049, 580, 252, 2813, 2095, 252,
+ 2095, 2090, 1181, 1049, 1571, 1181, 1049, 1041, 924, 579,
+ 2089, 2813, 2091, 1041, 924, 2813, 1958, 2092, 1958, 2813,
+ 2094, 580, 2093, 928, 697, 928, 697, 1441, 1442, 1441,
+ 1442, 1316, 1071, 2096, 2097, 2099, 2089, 1194, 1071, 2813,
+ 2100, 1316, 1071, 2092, 1913, 1194, 1071, 2094, 2093, 2098,
+ 1063, 942, 1972, 1973, 2104, 2813, 2104, 2102, 2813, 2096,
+
+ 2103, 2097, 2099, 1063, 942, 2101, 2813, 2100, 1913, 1968,
+ 2105, 1968, 2064, 946, 707, 2098, 1972, 2107, 946, 707,
+ 2111, 1810, 2813, 2102, 2106, 1729, 2813, 2103, 2813, 1729,
+ 2813, 2101, 1548, 1970, 1810, 1548, 2105, 1970, 1810, 1398,
+ 1802, 1628, 2813, 1802, 1628, 2113, 1398, 1632, 1326, 2114,
+ 1924, 2106, 1924, 2112, 1632, 1326, 1924, 2813, 1983, 1984,
+ 1983, 1984, 1927, 2813, 1983, 1984, 2813, 2115, 2813, 2073,
+ 2118, 1989, 2113, 2116, 1927, 2117, 2114, 2120, 2121, 2112,
+ 2019, 2020, 2118, 1989, 2019, 2151, 2155, 1858, 1986, 1927,
+ 1986, 2024, 2025, 2115, 1625, 1548, 1626, 2118, 1989, 2116,
+
+ 2813, 2117, 2813, 1627, 1628, 1927, 1629, 2813, 1629, 1991,
+ 1986, 1927, 1986, 2118, 1989, 1630, 2024, 2025, 2813, 2118,
+ 1989, 1744, 1992, 2813, 1938, 1099, 2813, 1100, 1631, 1981,
+ 1825, 1991, 1997, 2126, 841, 2813, 1991, 841, 2813, 841,
+ 2122, 2813, 1630, 1927, 1992, 2813, 962, 2813, 1992, 2124,
+ 2813, 2118, 1989, 1938, 1631, 1822, 1744, 1823, 1991, 963,
+ 2813, 1997, 1984, 1744, 1824, 1825, 2122, 1826, 2813, 1826,
+ 1992, 1981, 1825, 962, 1668, 2124, 1827, 2813, 2123, 2125,
+ 2813, 1669, 1670, 1565, 1668, 963, 1668, 1565, 2813, 1828,
+ 1426, 1829, 1465, 1586, 2813, 1829, 1465, 2813, 2003, 2004,
+
+ 2127, 2132, 2133, 1827, 2123, 1429, 2125, 2024, 2025, 2156,
+ 2029, 2813, 1590, 2006, 2134, 1828, 1642, 1565, 1643, 2128,
+ 2136, 2133, 2813, 1045, 2813, 1644, 1465, 2127, 1645, 2813,
+ 1645, 1650, 1479, 1045, 2813, 920, 2813, 1646, 920, 2813,
+ 807, 1650, 1479, 1471, 1339, 2128, 1471, 1339, 1343, 1095,
+ 1647, 2156, 2029, 1863, 2158, 2159, 2813, 2143, 2145, 807,
+ 1864, 1865, 2144, 1863, 1646, 1863, 2813, 1343, 1095, 2147,
+ 2032, 2160, 2813, 2146, 2032, 2025, 1647, 1476, 1045, 1477,
+ 2035, 2036, 2813, 2143, 2813, 2145, 1478, 1479, 2144, 1480,
+ 518, 1480, 2813, 2148, 2813, 2147, 1679, 518, 1481, 2146,
+
+ 518, 2813, 518, 1680, 1504, 2813, 1679, 2018, 1679, 2035,
+ 2161, 1482, 2165, 1877, 1682, 2041, 2042, 2065, 1733, 2148,
+ 518, 1683, 1684, 2813, 1682, 1481, 1682, 518, 2185, 2186,
+ 518, 2813, 518, 2018, 2813, 2154, 2813, 1482, 2137, 1302,
+ 2138, 2041, 2166, 2170, 1895, 1667, 1707, 2139, 1479, 2813,
+ 2140, 2813, 2140, 1708, 1709, 2023, 1707, 2023, 1707, 2141,
+ 2023, 2065, 1733, 2046, 2047, 2046, 2047, 2026, 2046, 2047,
+ 1862, 1900, 2142, 2188, 2189, 2171, 2051, 2813, 1901, 1902,
+ 2026, 1900, 2157, 1900, 2813, 883, 2141, 2813, 2171, 2051,
+ 2173, 2174, 883, 1725, 1552, 883, 2813, 883, 2142, 116,
+
+ 166, 2813, 166, 116, 116, 116, 116, 116, 116, 167,
+ 116, 116, 116, 168, 116, 116, 1678, 1718, 2813, 2192,
+ 2149, 2813, 2031, 2813, 1719, 1533, 2031, 1718, 1515, 1718,
+ 2054, 2175, 1690, 2813, 2054, 2047, 2056, 2057, 2074, 2075,
+ 2177, 2178, 116, 1912, 1733, 2192, 2813, 2149, 1172, 1492,
+ 852, 1492, 1233, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1493, 1172, 1172, 1127, 1542, 2191, 2150, 2074,
+ 2196, 1518, 2813, 1543, 1544, 1694, 1542, 2813, 1542, 2059,
+ 2179, 1373, 2182, 2181, 2178, 1725, 1552, 1912, 1733, 2183,
+ 1544, 1172, 2182, 2191, 2182, 2150, 2190, 1556, 1274, 1556,
+
+ 1274, 2200, 1931, 2813, 2072, 1931, 2193, 2072, 1931, 1923,
+ 1748, 2813, 2194, 1923, 1748, 2202, 2087, 1763, 2203, 1745,
+ 2813, 1746, 2813, 2190, 2201, 2813, 2195, 2813, 1747, 1748,
+ 2813, 1749, 2193, 1749, 1752, 1405, 2813, 2204, 2813, 2194,
+ 1750, 2813, 2202, 1752, 1405, 2203, 2208, 2209, 2087, 1763,
+ 2201, 2813, 2195, 1751, 2211, 2212, 1427, 1428, 1427, 1428,
+ 2205, 1303, 1049, 2204, 2206, 2214, 2813, 1750, 1303, 1049,
+ 2813, 2218, 2813, 2218, 1181, 1049, 1316, 1071, 2813, 1751,
+ 1181, 1049, 2215, 2813, 1041, 924, 2205, 2216, 2813, 2217,
+ 2206, 2095, 2214, 2095, 2219, 2220, 1958, 2224, 1958, 2813,
+
+ 1041, 924, 1441, 1442, 2813, 928, 697, 2813, 2215, 1441,
+ 1442, 2221, 2813, 2216, 2813, 2217, 1316, 1071, 2813, 2225,
+ 2219, 2225, 2220, 2224, 1194, 1071, 1063, 942, 1194, 1071,
+ 2104, 2813, 2104, 2222, 2155, 1858, 2813, 2227, 2221, 1063,
+ 942, 1968, 2223, 1968, 2226, 2064, 2813, 2184, 2813, 2064,
+ 946, 707, 2187, 2111, 1810, 2229, 2230, 2111, 1810, 2222,
+ 2232, 2233, 2813, 1729, 2227, 1729, 2813, 1548, 2223, 1548,
+ 2226, 1970, 1810, 1970, 1810, 1802, 1628, 1802, 1628, 1398,
+ 2234, 1398, 2813, 2073, 2813, 2073, 2813, 1632, 1326, 1632,
+ 1326, 2120, 2121, 2120, 2240, 2199, 2813, 2235, 2237, 2813,
+
+ 1927, 2236, 2238, 2244, 1989, 1927, 2813, 2234, 2118, 1989,
+ 2813, 1744, 2813, 2118, 1989, 2813, 2239, 1744, 2813, 1981,
+ 1825, 2246, 2813, 2235, 2237, 1981, 1825, 2236, 2245, 2238,
+ 1565, 2813, 1586, 2813, 2247, 2269, 2270, 1565, 1829, 1465,
+ 2132, 2133, 2239, 2248, 1586, 1829, 1465, 1590, 2246, 1590,
+ 2813, 1429, 2132, 2133, 2245, 2136, 2258, 2136, 2133, 2006,
+ 2007, 2247, 2155, 1858, 2249, 1302, 2250, 2272, 2273, 2248,
+ 1822, 1744, 1823, 1841, 1479, 2813, 2137, 1302, 2137, 1824,
+ 1825, 2813, 1826, 2813, 1826, 1841, 1479, 2158, 2159, 2813,
+ 2249, 1827, 2250, 1302, 2158, 2274, 2813, 2141, 1045, 2813,
+
+ 920, 1841, 1479, 1302, 1828, 2813, 1650, 1479, 1471, 1339,
+ 2142, 1841, 1479, 2137, 1302, 2137, 2278, 2029, 1827, 2165,
+ 1877, 2261, 1841, 1479, 2141, 2280, 2281, 2813, 2259, 2263,
+ 1828, 2252, 1426, 2253, 2141, 2813, 2142, 2813, 2260, 2813,
+ 2254, 2004, 1045, 2255, 2813, 2255, 2813, 2142, 2261, 920,
+ 1650, 1479, 2256, 2813, 2259, 2263, 2813, 1471, 1339, 2813,
+ 807, 2141, 807, 2813, 2260, 2257, 2165, 1877, 1343, 1095,
+ 1343, 1095, 2813, 2142, 1863, 2283, 2284, 2262, 2813, 2256,
+ 2813, 1864, 1865, 2264, 1863, 2266, 1863, 2154, 2265, 2268,
+ 2813, 2257, 2137, 1302, 2138, 2170, 1895, 2286, 2287, 2154,
+
+ 2813, 2139, 1479, 2262, 2140, 2813, 2140, 2170, 1895, 2264,
+ 2271, 2813, 2266, 2141, 2265, 2157, 2185, 2186, 2289, 2290,
+ 2157, 2813, 2277, 2173, 2174, 2813, 2142, 1690, 2173, 2291,
+ 2295, 2051, 2813, 1862, 1900, 2177, 2178, 2300, 2301, 1690,
+ 2141, 1901, 1902, 2813, 1900, 2813, 1900, 2177, 2178, 2188,
+ 2302, 2813, 2142, 116, 2014, 2813, 2014, 116, 116, 116,
+ 116, 116, 116, 167, 116, 116, 116, 168, 116, 116,
+ 1515, 2296, 2304, 2301, 2200, 1931, 1373, 2182, 2297, 2057,
+ 2813, 2296, 1694, 2296, 2183, 1544, 1694, 2182, 2813, 2182,
+ 2181, 2298, 1912, 1733, 2181, 2178, 116, 1172, 1492, 852,
+
+ 1492, 1233, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1493, 1172, 1172, 1373, 2813, 1518, 1730, 2311, 1731,
+ 1556, 1274, 1911, 1544, 2059, 2060, 1732, 1733, 2813, 1734,
+ 2813, 1734, 2813, 2305, 2267, 2306, 1912, 1733, 1735, 2813,
+ 1172, 2813, 2307, 1733, 2311, 2308, 2316, 2308, 1725, 1552,
+ 2813, 1736, 1725, 1552, 2309, 1556, 1274, 2312, 2318, 2319,
+ 2267, 2200, 1931, 2313, 2813, 1735, 2813, 2310, 2321, 2322,
+ 2072, 1931, 2316, 2072, 1931, 2813, 2315, 1736, 2813, 2314,
+ 2813, 2309, 2323, 2312, 1923, 1748, 1923, 1748, 1752, 1405,
+ 2313, 1752, 1405, 2310, 2324, 2208, 2209, 2330, 2331, 1762,
+
+ 1763, 2813, 2315, 2327, 2813, 2314, 2813, 2326, 2813, 2323,
+ 2325, 2211, 2332, 2334, 2331, 2087, 1763, 2813, 2328, 2813,
+ 2324, 1427, 1428, 2813, 1427, 1428, 1303, 1049, 1303, 1049,
+ 2327, 1441, 1442, 2326, 2269, 2270, 2325, 1181, 1049, 2813,
+ 2218, 2338, 2218, 2813, 2328, 2337, 2813, 2336, 2340, 1181,
+ 1049, 2095, 2813, 2095, 2813, 2339, 2813, 2341, 1441, 1442,
+ 1041, 924, 1316, 1071, 1316, 1071, 2388, 2389, 2338, 1194,
+ 1071, 2337, 2813, 2336, 2813, 2340, 2225, 2343, 2225, 2342,
+ 2345, 2339, 2813, 2341, 2184, 1194, 1071, 2104, 2813, 2104,
+ 2299, 2344, 2229, 2230, 2187, 2813, 1063, 942, 2347, 2348,
+
+ 2303, 2813, 2232, 2349, 2343, 2342, 1729, 2345, 2351, 2348,
+ 2272, 2390, 2813, 1729, 1970, 1810, 2813, 2344, 1807, 1729,
+ 1808, 1970, 1810, 2392, 2389, 1548, 2813, 1809, 1810, 1548,
+ 1811, 2813, 1811, 1802, 1628, 2359, 2199, 1802, 1628, 1812,
+ 2813, 1398, 2278, 2029, 2244, 1989, 2317, 2358, 2360, 1632,
+ 1326, 1398, 1813, 2813, 2365, 2366, 2396, 2397, 2813, 1632,
+ 1326, 2359, 2813, 2199, 2361, 2813, 1812, 2813, 2320, 2813,
+ 2362, 2244, 1989, 2358, 1927, 2360, 2368, 2369, 1813, 2352,
+ 2064, 2353, 2118, 1989, 2813, 2363, 1927, 2813, 2354, 1810,
+ 2361, 2355, 2813, 2355, 2118, 1989, 2362, 2278, 2029, 1744,
+
+ 2356, 2399, 2400, 2370, 2280, 2281, 2371, 1981, 1825, 1744,
+ 2813, 2363, 1565, 2357, 1565, 2813, 1586, 1981, 1825, 2813,
+ 1829, 1465, 1829, 1465, 2132, 2133, 2813, 2356, 1426, 2813,
+ 2370, 2813, 2371, 2372, 2813, 2374, 2003, 2004, 2373, 2357,
+ 2402, 2403, 2252, 1426, 2252, 2252, 1426, 2252, 1426, 2375,
+ 2813, 2003, 2004, 2813, 2003, 2004, 2003, 2004, 2813, 2372,
+ 1426, 2813, 2374, 2256, 2373, 1045, 2256, 2813, 2003, 2004,
+ 2283, 2404, 1302, 1650, 1479, 2375, 2257, 1045, 2813, 2257,
+ 1841, 1479, 2813, 2376, 2813, 1650, 1479, 2813, 920, 2813,
+ 2256, 2406, 2403, 2256, 2380, 2377, 1471, 1339, 1302, 2813,
+
+ 2378, 2813, 2257, 2813, 920, 2257, 1841, 1479, 2813, 2376,
+ 2268, 2381, 1471, 1339, 2379, 2813, 2382, 2813, 2286, 2287,
+ 2380, 2377, 2252, 1426, 2253, 2813, 2378, 2383, 2300, 2301,
+ 2813, 2254, 2004, 2813, 2255, 2813, 2255, 2381, 2384, 807,
+ 2384, 2379, 2382, 2256, 807, 2300, 2301, 1343, 1095, 2813,
+ 1856, 2813, 1343, 1095, 2383, 2387, 2257, 1857, 1858, 2393,
+ 1856, 2813, 1856, 2410, 2411, 2271, 2394, 1858, 1875, 2393,
+ 2256, 2393, 2385, 2289, 2412, 1876, 1877, 2407, 1875, 2813,
+ 1875, 2813, 2257, 2391, 2408, 1877, 2277, 2407, 2395, 2407,
+ 2813, 2414, 2411, 2813, 2295, 2051, 2418, 2419, 2385, 1172,
+
+ 1492, 852, 1492, 1233, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1493, 1172, 1172, 1855, 1893, 2304, 2429,
+ 2304, 2301, 2188, 2189, 1894, 1895, 2277, 1893, 2398, 1893,
+ 2154, 2415, 2813, 2386, 2295, 2051, 2421, 2422, 2416, 1895,
+ 1515, 2415, 1172, 2415, 1690, 2065, 1733, 2813, 2056, 2057,
+ 2065, 1733, 2177, 2178, 1515, 2296, 2065, 1733, 2813, 2386,
+ 2318, 2319, 2297, 2057, 2423, 2296, 2424, 2296, 2439, 2440,
+ 2305, 2813, 2306, 2425, 2186, 2813, 2426, 2430, 2426, 2307,
+ 1733, 2813, 2308, 2431, 2308, 2427, 2305, 2813, 2305, 1912,
+ 1733, 2309, 2305, 2813, 2305, 2065, 1733, 2813, 2428, 1912,
+
+ 1733, 2065, 1733, 2430, 2310, 1556, 1274, 2309, 2813, 2431,
+ 1725, 1552, 2427, 2309, 2432, 2813, 2433, 2813, 2309, 2813,
+ 2310, 1725, 1552, 2813, 2428, 2436, 2310, 2813, 1556, 1274,
+ 2310, 2434, 2321, 2441, 2309, 2443, 2440, 2330, 2331, 2813,
+ 2309, 2432, 2433, 2437, 2330, 2331, 2310, 2435, 2813, 1923,
+ 1748, 2436, 2310, 1928, 2813, 1929, 2813, 2434, 2072, 1931,
+ 2208, 2209, 1930, 1931, 2452, 1932, 2813, 1932, 2813, 2444,
+ 2437, 2445, 2813, 2435, 1933, 2072, 1931, 2813, 2446, 1931,
+ 2813, 2447, 2813, 2447, 2450, 1923, 1748, 1934, 1752, 1405,
+ 2448, 2452, 1752, 1405, 2087, 1763, 2451, 2334, 2456, 2334,
+
+ 2331, 1933, 2813, 2449, 1427, 1428, 1427, 1428, 2813, 2454,
+ 2450, 2813, 2453, 1934, 2813, 1303, 1049, 2448, 2455, 2458,
+ 1441, 1442, 2451, 1303, 1049, 2813, 1441, 1442, 2813, 2449,
+ 2218, 2813, 2218, 2459, 2813, 2454, 2460, 2813, 2453, 1181,
+ 1049, 2462, 1316, 1071, 2455, 2299, 2458, 2463, 2813, 2461,
+ 1316, 1071, 2299, 2347, 2348, 2225, 2813, 2225, 2303, 2459,
+ 2347, 2348, 2460, 2464, 1194, 1071, 2351, 2472, 2462, 2303,
+ 2813, 2187, 2813, 2463, 2064, 2461, 2465, 2351, 2348, 2232,
+ 2233, 2813, 2111, 1810, 1729, 2352, 2064, 2352, 2064, 2464,
+ 2813, 2064, 1970, 1810, 2111, 1810, 2111, 1810, 2813, 2111,
+
+ 1810, 1729, 2465, 2466, 2184, 2467, 2356, 2475, 2813, 1970,
+ 1810, 2813, 2468, 2230, 2813, 2469, 2813, 2469, 2813, 2357,
+ 2352, 2064, 2352, 2473, 2470, 2813, 2474, 2388, 2389, 2111,
+ 1810, 1548, 2813, 2356, 2475, 1548, 2476, 2471, 2813, 1802,
+ 1628, 2356, 2813, 1802, 1628, 2357, 2813, 1398, 2813, 2473,
+ 2317, 2470, 2474, 2813, 2357, 1632, 1326, 2813, 2365, 2366,
+ 2477, 2813, 2476, 2471, 2352, 2064, 2353, 2813, 2356, 2478,
+ 2388, 2389, 2813, 2354, 1810, 2479, 2355, 2813, 2355, 1398,
+ 2357, 2438, 2813, 2320, 2813, 2356, 2477, 1632, 1326, 2482,
+ 2483, 2368, 2484, 2392, 2511, 2478, 2442, 2813, 2357, 1927,
+
+ 2813, 2479, 2480, 2813, 2486, 2483, 1927, 2118, 1989, 2813,
+ 1744, 2813, 2356, 1744, 2118, 1989, 2813, 1565, 1981, 1825,
+ 2813, 1981, 1825, 2813, 2357, 1829, 1465, 2392, 2389, 2480,
+ 1986, 1927, 1987, 2493, 2813, 2494, 2495, 2155, 1858, 1988,
+ 1989, 1426, 1990, 2813, 1990, 2496, 2497, 1565, 2813, 2003,
+ 2004, 1991, 2272, 2273, 2813, 1829, 1465, 2396, 2397, 2493,
+ 2813, 2494, 2813, 2495, 1992, 2813, 1426, 2513, 2514, 2499,
+ 2813, 2496, 2497, 2813, 2003, 2004, 2813, 1302, 1991, 1302,
+ 2813, 2498, 2500, 2399, 2515, 1841, 1479, 1841, 1479, 1045,
+ 1992, 2487, 2199, 2488, 2501, 2499, 2813, 1650, 1479, 2813,
+
+ 2489, 1989, 2813, 2490, 2813, 2490, 1045, 2498, 2813, 2500,
+ 2813, 2502, 2491, 2813, 1650, 1479, 2813, 2503, 2505, 920,
+ 2505, 2501, 920, 2517, 2514, 2492, 2813, 1471, 1339, 2504,
+ 1471, 1339, 2384, 807, 2384, 2813, 807, 2502, 2813, 2491,
+ 2813, 1343, 1095, 2503, 1343, 1095, 2402, 2403, 2402, 2403,
+ 2506, 2492, 2509, 2406, 2522, 2507, 2504, 2813, 2393, 2510,
+ 2270, 2813, 2509, 2813, 2509, 2394, 1858, 2027, 2393, 2813,
+ 2393, 2406, 2403, 2813, 2028, 2029, 2506, 2027, 2813, 2027,
+ 2165, 1877, 2507, 1172, 1492, 852, 1492, 1233, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1493, 1172, 1172,
+
+ 2518, 2283, 2284, 2813, 2508, 2813, 2520, 2519, 2029, 2813,
+ 2518, 2387, 2518, 2521, 2281, 2407, 2520, 2813, 2520, 2410,
+ 2411, 2387, 2408, 1877, 2813, 2407, 1172, 2407, 2391, 2410,
+ 2411, 2508, 2268, 2523, 2300, 2301, 2414, 2525, 2154, 2415,
+ 2524, 2287, 2813, 2523, 2391, 2523, 2416, 1895, 2154, 2415,
+ 2271, 2415, 2414, 2411, 2395, 2813, 2170, 1895, 2289, 2290,
+ 2512, 2813, 2418, 2419, 2026, 2049, 2185, 2186, 2527, 2528,
+ 2398, 2813, 2050, 2051, 2516, 2049, 2813, 2049, 2421, 2529,
+ 2277, 2532, 2531, 2528, 2813, 2423, 2813, 2423, 2533, 2051,
+ 2423, 2532, 2423, 2532, 2185, 2186, 2185, 2186, 2813, 2185,
+
+ 2186, 2185, 2186, 2813, 1912, 1733, 2427, 2813, 2423, 2813,
+ 2424, 2427, 2065, 1733, 1912, 1733, 2813, 2425, 2186, 2428,
+ 2426, 2813, 2426, 2534, 2428, 2538, 2065, 1733, 2535, 2427,
+ 2439, 2440, 2536, 2427, 2537, 1725, 1552, 2813, 2427, 2813,
+ 2539, 2813, 2428, 2439, 2440, 2428, 2813, 1725, 1552, 2534,
+ 2428, 2538, 2443, 2550, 2535, 2540, 2427, 2813, 2536, 1556,
+ 1274, 2537, 2541, 2542, 2813, 2542, 2539, 2813, 2428, 2443,
+ 2440, 2813, 1556, 1274, 2544, 2813, 2545, 2321, 2322, 2543,
+ 2813, 2540, 2813, 2546, 2319, 2813, 2547, 2813, 2547, 2541,
+ 2444, 2813, 2445, 2200, 1931, 2548, 2200, 1931, 2813, 2446,
+
+ 1931, 2813, 2447, 2813, 2447, 2543, 2813, 2444, 2549, 2444,
+ 2444, 2448, 2444, 2200, 1931, 2813, 2200, 1931, 2813, 2200,
+ 1931, 2813, 2548, 2551, 2449, 2072, 1931, 2813, 2448, 2208,
+ 2209, 2448, 2072, 1931, 2549, 1923, 1748, 2813, 2448, 2813,
+ 2552, 2449, 1923, 1748, 2449, 1752, 1405, 2553, 2813, 2551,
+ 2449, 2813, 2554, 1427, 1428, 2448, 2555, 2813, 2448, 2813,
+ 1752, 1405, 2559, 339, 2559, 2557, 2552, 2449, 2556, 2813,
+ 2449, 1427, 1428, 2813, 2553, 2558, 1303, 1049, 2554, 2561,
+ 1441, 1442, 2555, 1303, 1049, 1441, 1442, 1316, 1071, 1316,
+ 1071, 2557, 2560, 2813, 2556, 2813, 2562, 2813, 2563, 2813,
+
+ 2299, 2564, 2558, 2813, 2567, 2561, 2813, 2566, 2347, 2348,
+ 2813, 2565, 2269, 2270, 2466, 2184, 2466, 2813, 2560, 2466,
+ 2184, 2466, 2562, 2229, 2230, 2563, 2813, 2564, 2229, 2230,
+ 2184, 2567, 2813, 2566, 2184, 2470, 2184, 2565, 2229, 2230,
+ 2470, 2064, 2229, 2230, 2229, 2230, 2813, 2064, 2471, 2111,
+ 1810, 1729, 2813, 2471, 2813, 2111, 1810, 2571, 2813, 1970,
+ 1810, 2813, 2470, 2813, 1548, 2388, 2389, 2470, 1729, 2568,
+ 2813, 2569, 1802, 1628, 2471, 2570, 1970, 1810, 2438, 2471,
+ 2572, 1548, 2513, 2514, 2571, 2438, 2482, 2483, 2813, 1802,
+ 1628, 2813, 2574, 2482, 2483, 2568, 2813, 2569, 2466, 2184,
+
+ 2467, 2570, 2573, 2813, 2575, 2813, 2572, 2468, 2230, 2813,
+ 2469, 2813, 2469, 2576, 1398, 2576, 1398, 2813, 2574, 2470,
+ 2813, 2442, 1632, 1326, 1632, 1326, 2442, 2813, 2573, 2486,
+ 2584, 2575, 2471, 2813, 2486, 2483, 2513, 2514, 2813, 2320,
+ 2487, 2199, 2487, 2199, 2577, 2813, 2470, 2368, 2369, 2244,
+ 1989, 2244, 1989, 2813, 1426, 2487, 2199, 2487, 2471, 2199,
+ 2813, 2491, 2003, 2004, 2244, 1989, 2813, 2244, 1989, 2199,
+ 2577, 2578, 2317, 2579, 2492, 2813, 2491, 2244, 1989, 2813,
+ 2580, 2366, 1927, 2581, 2813, 2581, 2594, 1927, 2491, 2492,
+ 2118, 1989, 2582, 1744, 2585, 2118, 1989, 2813, 1565, 2813,
+
+ 2492, 1981, 1825, 2491, 2586, 2583, 1829, 1465, 2517, 2604,
+ 2587, 2813, 2594, 2517, 2514, 2492, 1744, 2588, 2813, 2582,
+ 2585, 2813, 2589, 2813, 1981, 1825, 2591, 1302, 2278, 2029,
+ 2586, 2583, 2487, 2199, 2488, 1841, 1479, 2587, 2399, 2400,
+ 2813, 2489, 1989, 2588, 2490, 2813, 2490, 1565, 2589, 1302,
+ 2590, 1426, 2591, 2491, 2813, 1829, 1465, 1841, 1479, 2003,
+ 2004, 2595, 2597, 1045, 2597, 1045, 2492, 2813, 2593, 2813,
+ 2592, 1650, 1479, 1650, 1479, 2813, 2590, 920, 2596, 2813,
+ 2491, 2505, 920, 2505, 2813, 1471, 1339, 2595, 2280, 2281,
+ 1471, 1339, 2492, 2598, 2813, 2593, 2599, 2592, 2384, 807,
+
+ 2384, 2813, 2509, 2813, 2596, 2402, 2403, 1343, 1095, 2510,
+ 2270, 2813, 2509, 2268, 2509, 2439, 2440, 2318, 2319, 2598,
+ 2813, 2286, 2287, 2599, 1172, 2600, 2601, 2600, 1233, 1172,
+ 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1493, 1172,
+ 1172, 2602, 1492, 852, 1492, 1233, 2813, 2518, 2603, 2397,
+ 2813, 2602, 2387, 2602, 2519, 2029, 2520, 2518, 2813, 2518,
+ 2410, 2411, 2813, 2521, 2281, 2512, 2520, 1172, 2520, 2268,
+ 2523, 2065, 1733, 2527, 2528, 2512, 2813, 2524, 2287, 2516,
+ 2523, 2516, 2523, 2527, 2528, 2395, 2605, 2531, 2607, 2531,
+ 2528, 2277, 2532, 2606, 2419, 2611, 2605, 2277, 2605, 2533,
+
+ 2051, 2398, 2532, 2813, 2532, 2295, 2051, 2185, 2186, 2421,
+ 2422, 2185, 2186, 2065, 1733, 1912, 1733, 1912, 1733, 2609,
+ 2813, 2611, 2610, 2813, 2614, 2813, 2614, 2608, 1725, 1552,
+ 2318, 2319, 2613, 1725, 1552, 2612, 2396, 2397, 2318, 2319,
+ 2813, 2542, 2813, 2542, 1556, 1274, 2609, 2813, 2615, 2610,
+ 1556, 1274, 2813, 2608, 2544, 2616, 2544, 2617, 2544, 2613,
+ 2544, 2612, 2813, 2318, 2319, 2618, 2813, 2318, 2319, 2813,
+ 2200, 1931, 2200, 1931, 2615, 2548, 2813, 2072, 1931, 2548,
+ 2620, 2813, 2616, 2617, 2072, 1931, 2813, 2544, 2549, 2545,
+ 2619, 2618, 2549, 1923, 1748, 2813, 2546, 2319, 2621, 2547,
+
+ 2813, 2547, 2548, 2813, 1923, 1748, 2548, 2620, 2548, 2813,
+ 2622, 1752, 1405, 2623, 2549, 2813, 2619, 2813, 2549, 2624,
+ 2625, 2549, 2625, 2813, 2621, 1427, 1428, 1427, 1428, 1752,
+ 1405, 2626, 1303, 1049, 2813, 2548, 2622, 2513, 2514, 2623,
+ 2813, 2629, 2628, 2629, 2813, 2627, 2624, 2549, 1441, 1442,
+ 1303, 1049, 2630, 2184, 2813, 1441, 1442, 2626, 2184, 1316,
+ 1071, 2229, 2230, 2633, 2813, 2633, 2229, 2230, 2631, 2628,
+ 2632, 2627, 1316, 1071, 2636, 2064, 2813, 2064, 2630, 2634,
+ 1729, 2635, 2813, 2111, 1810, 2111, 1810, 1729, 1970, 1810,
+ 1548, 2813, 2637, 2813, 2631, 1970, 1810, 2632, 1802, 1628,
+
+ 2813, 2636, 2641, 1548, 2641, 2634, 2813, 2635, 2639, 2638,
+ 2640, 1802, 1628, 2576, 1398, 2576, 2813, 1398, 2642, 2637,
+ 2438, 2813, 1632, 1326, 2813, 1632, 1326, 2813, 2482, 2483,
+ 2578, 2317, 2578, 2317, 2639, 2638, 2643, 2640, 2813, 2365,
+ 2366, 2365, 2366, 2813, 2642, 2578, 2317, 2578, 2317, 2813,
+ 2317, 2582, 2199, 2813, 2365, 2366, 2365, 2366, 2365, 2366,
+ 2244, 1989, 1927, 2643, 2583, 2199, 2582, 1927, 2813, 2813,
+ 2118, 1989, 2813, 2244, 1989, 2118, 1989, 2813, 2582, 2583,
+ 2646, 2647, 2813, 2644, 2813, 2645, 2813, 1744, 2813, 1426,
+ 2583, 2648, 2602, 2582, 2813, 1981, 1825, 2003, 2004, 2603,
+
+ 2397, 2649, 2602, 2813, 2602, 2583, 2646, 2813, 2647, 2644,
+ 1565, 2645, 2578, 2317, 2579, 2650, 2813, 2648, 1829, 1465,
+ 1744, 2580, 2366, 2654, 2581, 2813, 2581, 2649, 1981, 1825,
+ 2652, 1565, 2652, 2582, 2813, 2813, 1426, 2813, 2653, 1829,
+ 1465, 2650, 1302, 2651, 2003, 2004, 2583, 2813, 1302, 2654,
+ 1841, 1479, 2597, 1045, 2597, 2813, 1841, 1479, 2813, 1045,
+ 2582, 1650, 1479, 2813, 2653, 2655, 2813, 1650, 1479, 2813,
+ 2651, 2656, 2583, 2505, 920, 2505, 2395, 2657, 2658, 2512,
+ 2185, 2186, 1471, 1339, 2418, 2419, 2813, 2527, 2528, 2659,
+ 2813, 2655, 2813, 2395, 2605, 2185, 2186, 2813, 2656, 2065,
+
+ 1733, 2606, 2419, 2657, 2605, 2658, 2605, 2065, 1733, 1912,
+ 1733, 2663, 2813, 2663, 2318, 2319, 2659, 2813, 2813, 2660,
+ 1912, 1733, 2614, 2813, 2614, 2661, 1725, 1552, 2662, 2664,
+ 2813, 1725, 1552, 2542, 2666, 2542, 2813, 2665, 2318, 2319,
+ 2200, 1931, 1556, 1274, 2813, 2660, 2667, 2200, 1931, 2668,
+ 2813, 2661, 2072, 1931, 2662, 2664, 2672, 2813, 2672, 2813,
+ 2666, 2813, 2072, 1931, 2665, 1923, 1748, 1923, 1748, 1752,
+ 1405, 2669, 2670, 2667, 1427, 1428, 2668, 2671, 2813, 2625,
+ 2674, 2625, 2675, 2813, 2675, 1303, 1049, 2673, 1752, 1405,
+ 2813, 1427, 1428, 2629, 2676, 2629, 2677, 2669, 2670, 2678,
+
+ 2813, 2678, 1303, 1049, 2671, 1441, 1442, 2674, 1441, 1442,
+ 2184, 2813, 2633, 2673, 2633, 1316, 1071, 2813, 2229, 2230,
+ 2676, 1316, 1071, 2677, 2184, 2679, 2680, 2681, 2064, 2813,
+ 2064, 2813, 2229, 2230, 2813, 1729, 2111, 1810, 2111, 1810,
+ 2685, 1729, 2685, 1970, 1810, 2813, 2813, 2813, 2813, 1970,
+ 1810, 2679, 1548, 2680, 2681, 2813, 2682, 2813, 2813, 2684,
+ 1802, 1628, 2683, 2686, 2641, 1548, 2641, 2576, 1398, 2576,
+ 2317, 2687, 2317, 1802, 1628, 2199, 1632, 1326, 2365, 2366,
+ 2365, 2366, 2682, 2244, 1989, 2684, 2689, 1927, 2683, 2686,
+ 2813, 2813, 2690, 2199, 2813, 2118, 1989, 1927, 2687, 2813,
+
+ 2688, 2244, 1989, 1744, 2813, 2118, 1989, 2694, 1744, 2694,
+ 2813, 1981, 1825, 2689, 1565, 2692, 1981, 1825, 2813, 2690,
+ 2693, 2813, 1829, 1465, 2813, 2691, 2688, 2652, 1565, 2652,
+ 1426, 2695, 2813, 2696, 1426, 2813, 1829, 1465, 2003, 2004,
+ 1302, 2692, 2003, 2004, 2185, 2186, 1302, 2693, 1841, 1479,
+ 2813, 2691, 2813, 2697, 1841, 1479, 2813, 2695, 2185, 2186,
+ 2696, 2597, 1045, 2597, 2813, 2702, 2065, 1733, 2813, 2698,
+ 1650, 1479, 2065, 1733, 2700, 2699, 2663, 2813, 2663, 2813,
+ 2697, 2703, 1912, 1733, 2701, 1912, 1733, 2614, 2813, 2614,
+ 2813, 2702, 2813, 2705, 2813, 2698, 1725, 1552, 2813, 2704,
+
+ 2700, 2699, 2318, 2319, 2318, 2319, 2200, 1931, 2703, 2813,
+ 2701, 2706, 2200, 1931, 2710, 2813, 2710, 2072, 1931, 2813,
+ 2705, 2813, 2813, 2072, 1931, 2704, 2065, 1733, 2707, 1923,
+ 1748, 2813, 2708, 2709, 2672, 2813, 2672, 2711, 2706, 2625,
+ 2712, 2625, 2813, 1923, 1748, 1427, 1428, 2733, 1752, 1405,
+ 2813, 2675, 2813, 2675, 2707, 2629, 2713, 2629, 2708, 2709,
+ 1427, 1428, 2813, 2711, 1303, 1049, 2678, 2712, 2678, 1441,
+ 1442, 2813, 2633, 2733, 2633, 1441, 1442, 2184, 2813, 2184,
+ 2714, 1316, 1071, 2713, 2064, 2229, 2230, 2229, 2230, 2064,
+ 2813, 2813, 2111, 1810, 2685, 1729, 2685, 2111, 1810, 2813,
+
+ 2813, 1729, 2813, 1970, 1810, 2813, 2813, 2714, 2716, 1970,
+ 1810, 2715, 2717, 2641, 1548, 2641, 2317, 2813, 2317, 2718,
+ 2719, 2199, 1802, 1628, 2365, 2366, 2365, 2366, 2813, 2244,
+ 1989, 2813, 2199, 2720, 2716, 2813, 2813, 2715, 2813, 2717,
+ 2244, 1989, 2724, 1927, 2724, 2718, 2813, 2719, 2813, 1927,
+ 2721, 2118, 1989, 2813, 2813, 2722, 2813, 2118, 1989, 1744,
+ 2720, 2723, 2694, 1744, 2694, 2813, 2813, 1981, 1825, 2813,
+ 2813, 1981, 1825, 2652, 1565, 2652, 2721, 2725, 2726, 2813,
+ 1426, 2722, 1829, 1465, 1426, 2813, 1302, 2723, 2003, 2004,
+ 2185, 2186, 2003, 2004, 1841, 1479, 2185, 2186, 1302, 2065,
+
+ 1733, 2318, 2319, 2725, 2813, 2726, 1841, 1479, 2813, 2727,
+ 2663, 2731, 2663, 2813, 2729, 2318, 2319, 2732, 2728, 1912,
+ 1733, 2730, 2200, 1931, 2710, 2734, 2710, 2735, 2200, 1931,
+ 2072, 1931, 2813, 2072, 1931, 2727, 2736, 2737, 2731, 2813,
+ 2729, 2739, 2813, 2732, 2728, 2813, 2813, 2672, 2730, 2672,
+ 2675, 2734, 2675, 2735, 2813, 2738, 1923, 1748, 2184, 1427,
+ 1428, 2678, 2736, 2678, 2737, 2184, 2229, 2230, 2739, 2064,
+ 1441, 1442, 2813, 2229, 2230, 2064, 2813, 2111, 1810, 2813,
+ 2813, 2738, 2317, 2111, 1810, 2685, 1729, 2685, 2740, 2813,
+ 2365, 2366, 2317, 2741, 1970, 1810, 2199, 2813, 2742, 2199,
+
+ 2365, 2366, 1426, 2813, 2244, 1989, 2813, 2244, 1989, 2743,
+ 2003, 2004, 2813, 2813, 2813, 2740, 2744, 2185, 2186, 2741,
+ 2813, 2745, 2746, 2813, 2742, 1927, 2813, 2724, 1927, 2724,
+ 2749, 2747, 1426, 2118, 1989, 2743, 2118, 1989, 2065, 1733,
+ 2003, 2004, 2744, 2754, 2748, 2185, 2186, 2745, 2813, 2746,
+ 2694, 1744, 2694, 1302, 2813, 2750, 2749, 2747, 2755, 1981,
+ 1825, 1841, 1479, 2751, 1302, 2751, 2753, 2318, 2319, 2754,
+ 2813, 2748, 1841, 1479, 2065, 1733, 2318, 2319, 2200, 1931,
+ 2813, 2752, 2750, 2813, 2755, 2200, 1931, 2184, 2710, 2756,
+ 2710, 2757, 2753, 2184, 2758, 2229, 2230, 2072, 1931, 2759,
+
+ 2064, 2229, 2230, 2813, 2317, 2813, 2064, 2752, 2111, 1810,
+ 2813, 2760, 2365, 2366, 2111, 1810, 2756, 2813, 2757, 2813,
+ 2758, 2762, 2761, 2317, 2813, 2759, 2199, 2813, 2763, 2764,
+ 2813, 2365, 2366, 2199, 2244, 1989, 2813, 2760, 2813, 2766,
+ 2813, 2244, 1989, 2724, 1927, 2724, 2765, 2762, 2761, 2769,
+ 1426, 2769, 2118, 1989, 2763, 2767, 2764, 2813, 2003, 2004,
+ 1426, 2751, 1302, 2751, 2813, 2766, 1302, 2768, 2003, 2004,
+ 1841, 1479, 2813, 2765, 1841, 1479, 2185, 2186, 2813, 2185,
+ 2186, 2767, 2774, 2813, 2774, 2771, 2065, 1733, 2770, 2318,
+ 2319, 2065, 1733, 2768, 2773, 2813, 2772, 2318, 2319, 2200,
+
+ 1931, 2200, 1931, 2813, 2813, 2813, 2775, 2813, 2813, 2184,
+ 2776, 2813, 2771, 2813, 2770, 2813, 2779, 2229, 2230, 2778,
+ 2813, 2773, 2772, 2777, 2813, 2184, 2813, 2813, 2813, 2782,
+ 2064, 2782, 2775, 2229, 2230, 2813, 2776, 2780, 2111, 1810,
+ 2813, 2813, 2064, 2779, 2317, 2778, 2317, 2813, 2781, 2777,
+ 2111, 1810, 2365, 2366, 2365, 2366, 2199, 2813, 2199, 2769,
+ 1426, 2769, 2813, 2780, 2244, 1989, 2244, 1989, 2003, 2004,
+ 2783, 2185, 2186, 2784, 1426, 2781, 2751, 1302, 2751, 2813,
+ 2785, 2787, 2003, 2004, 2786, 1841, 1479, 2813, 2789, 2813,
+ 2789, 2790, 2774, 2788, 2774, 2813, 2783, 2185, 2186, 2784,
+
+ 2813, 2065, 1733, 2065, 1733, 2813, 2785, 2813, 2787, 2813,
+ 2786, 2318, 2319, 2794, 2791, 2794, 2813, 2790, 2318, 2319,
+ 2788, 2184, 2200, 1931, 2200, 1931, 2796, 2184, 2796, 2229,
+ 2230, 2792, 2813, 2793, 2064, 2229, 2230, 2782, 2064, 2782,
+ 2813, 2791, 2111, 1810, 2795, 2813, 2111, 1810, 2813, 2797,
+ 2317, 2318, 2319, 2798, 2199, 2813, 2317, 2792, 2365, 2366,
+ 2793, 2813, 2244, 1989, 2365, 2366, 2813, 2801, 2199, 2801,
+ 2795, 2805, 2813, 2813, 2813, 2797, 2244, 1989, 2799, 2800,
+ 2798, 2813, 2802, 2769, 1426, 2769, 2789, 2813, 2789, 2185,
+ 2186, 2813, 2003, 2004, 2813, 2185, 2186, 2805, 2200, 1931,
+
+ 2803, 2774, 2813, 2774, 2799, 2804, 2800, 2804, 2802, 2806,
+ 2065, 1733, 2813, 2813, 2318, 2319, 2794, 2813, 2794, 2796,
+ 2184, 2796, 2184, 2813, 2813, 2200, 1931, 2803, 2229, 2230,
+ 2229, 2230, 2813, 2782, 2064, 2782, 2806, 2808, 2317, 2808,
+ 2813, 2807, 2111, 1810, 2317, 2813, 2365, 2366, 2801, 2199,
+ 2801, 2199, 2365, 2366, 2789, 2813, 2789, 2244, 1989, 2244,
+ 1989, 2813, 2813, 2185, 2186, 2804, 2813, 2804, 2807, 2794,
+ 2810, 2794, 2809, 2813, 2318, 2319, 2318, 2319, 2200, 1931,
+ 2796, 2184, 2796, 2808, 2317, 2808, 2317, 2811, 2813, 2229,
+ 2230, 2813, 2365, 2366, 2365, 2366, 2813, 2810, 2809, 2801,
+
+ 2199, 2801, 2804, 2813, 2804, 2812, 2813, 2813, 2244, 1989,
+ 2813, 2318, 2319, 2813, 2811, 2808, 2317, 2808, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2365, 2366, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2812, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 84,
+
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 112, 112, 112, 112, 112, 112, 112, 112,
+ 112, 2813, 112, 116, 116, 2813, 116, 116, 116, 116,
+ 116, 116, 116, 116, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 123, 2813, 123, 2813, 2813,
+ 2813, 2813, 2813, 2813, 123, 127, 2813, 127, 2813, 127,
+ 2813, 127, 2813, 2813, 127, 170, 170, 2813, 170, 170,
+ 170, 170, 170, 170, 170, 170, 176, 2813, 2813, 176,
+
+ 178, 178, 2813, 178, 178, 178, 178, 178, 178, 178,
+ 178, 180, 2813, 2813, 180, 182, 182, 2813, 182, 182,
+ 182, 182, 182, 182, 182, 182, 183, 183, 2813, 183,
+ 183, 183, 183, 183, 183, 183, 183, 185, 2813, 2813,
+ 185, 187, 187, 2813, 187, 187, 187, 187, 187, 187,
+ 187, 187, 188, 188, 2813, 188, 188, 188, 188, 188,
+ 188, 188, 188, 191, 191, 191, 191, 191, 191, 191,
+ 191, 191, 191, 191, 194, 194, 2813, 194, 194, 194,
+ 194, 194, 194, 194, 194, 198, 2813, 2813, 198, 200,
+ 200, 2813, 200, 200, 200, 200, 200, 200, 200, 200,
+
+ 205, 2813, 2813, 205, 207, 207, 2813, 207, 207, 207,
+ 207, 207, 207, 207, 207, 209, 2813, 2813, 209, 211,
+ 211, 2813, 211, 211, 211, 211, 211, 211, 211, 211,
+ 213, 2813, 2813, 213, 233, 233, 2813, 233, 233, 233,
+ 233, 233, 233, 233, 233, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 238, 2813, 2813, 238,
+ 126, 2813, 126, 2813, 126, 2813, 126, 2813, 2813, 126,
+ 168, 168, 2813, 168, 168, 168, 168, 168, 168, 168,
+ 168, 175, 2813, 2813, 175, 176, 2813, 2813, 176, 177,
+ 177, 2813, 177, 177, 177, 177, 177, 177, 177, 177,
+
+ 178, 178, 2813, 178, 178, 178, 178, 178, 178, 178,
+ 178, 179, 2813, 2813, 179, 180, 2813, 2813, 180, 181,
+ 181, 2813, 181, 181, 181, 181, 181, 181, 181, 181,
+ 182, 182, 2813, 182, 182, 182, 182, 182, 182, 182,
+ 182, 183, 183, 2813, 183, 183, 183, 183, 183, 183,
+ 183, 183, 184, 2813, 2813, 184, 185, 2813, 2813, 185,
+ 186, 186, 2813, 186, 186, 186, 186, 186, 186, 186,
+ 186, 187, 187, 2813, 187, 187, 187, 187, 187, 187,
+ 187, 187, 188, 188, 2813, 188, 188, 188, 188, 188,
+ 188, 188, 188, 296, 296, 296, 296, 296, 296, 296,
+
+ 296, 296, 296, 296, 194, 194, 2813, 194, 194, 194,
+ 194, 194, 194, 194, 194, 197, 2813, 2813, 197, 198,
+ 2813, 2813, 198, 199, 199, 2813, 199, 199, 199, 199,
+ 199, 199, 199, 199, 200, 200, 2813, 200, 200, 200,
+ 200, 200, 200, 200, 200, 204, 2813, 2813, 204, 205,
+ 2813, 2813, 205, 206, 206, 2813, 206, 206, 206, 206,
+ 206, 206, 206, 206, 207, 207, 2813, 207, 207, 207,
+ 207, 207, 207, 207, 207, 208, 2813, 2813, 208, 209,
+ 2813, 2813, 209, 210, 210, 2813, 210, 210, 210, 210,
+ 210, 210, 210, 210, 211, 211, 2813, 211, 211, 211,
+
+ 211, 211, 211, 211, 211, 212, 2813, 2813, 212, 213,
+ 2813, 2813, 213, 232, 232, 2813, 232, 232, 232, 232,
+ 232, 232, 232, 232, 233, 233, 2813, 233, 233, 233,
+ 233, 233, 233, 233, 233, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 237, 2813, 2813, 237,
+ 238, 2813, 2813, 238, 127, 2813, 127, 2813, 127, 2813,
+ 127, 2813, 2813, 127, 332, 332, 2813, 332, 332, 332,
+ 332, 332, 332, 332, 332, 170, 170, 2813, 170, 170,
+ 170, 170, 170, 170, 170, 170, 581, 581, 581, 581,
+ 581, 581, 581, 581, 581, 581, 581, 592, 592, 592,
+
+ 592, 592, 592, 592, 592, 592, 592, 592, 116, 116,
+ 2813, 116, 116, 116, 116, 116, 116, 116, 116, 603,
+ 603, 2813, 603, 603, 603, 603, 603, 603, 603, 603,
+ 634, 634, 634, 634, 634, 634, 634, 634, 634, 634,
+ 634, 641, 641, 641, 641, 641, 641, 641, 641, 641,
+ 641, 641, 698, 698, 698, 698, 698, 698, 698, 698,
+ 698, 698, 698, 708, 708, 708, 708, 708, 708, 708,
+ 708, 708, 708, 708, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 751, 751, 751, 751, 751,
+ 751, 751, 751, 751, 751, 751, 805, 805, 805, 805,
+
+ 805, 805, 805, 805, 805, 805, 805, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819, 819, 821,
+ 821, 821, 821, 821, 821, 821, 821, 821, 821, 821,
+ 866, 866, 866, 866, 866, 866, 866, 866, 866, 866,
+ 866, 868, 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 873, 873, 873, 873, 873, 873, 873, 873,
+ 873, 873, 873, 875, 875, 875, 875, 875, 875, 875,
+ 875, 875, 875, 875, 920, 920, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 929, 929, 929, 929, 929,
+
+ 929, 929, 929, 929, 929, 929, 938, 938, 938, 938,
+ 938, 938, 938, 938, 938, 938, 938, 947, 947, 947,
+ 947, 947, 947, 947, 947, 947, 947, 947, 964, 964,
+ 964, 964, 964, 964, 964, 964, 964, 964, 964, 977,
+ 977, 977, 977, 977, 2813, 2813, 2813, 2813, 977, 987,
+ 987, 987, 987, 987, 987, 987, 987, 987, 987, 987,
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ 992, 996, 996, 996, 996, 996, 996, 996, 996, 996,
+ 996, 996, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
+ 1001, 1001, 1001, 1006, 1006, 1006, 1006, 1006, 1006, 1006,
+
+ 1006, 1006, 1006, 1006, 1042, 1042, 1042, 1042, 1042, 1042,
+ 1042, 1042, 1042, 1042, 1042, 1045, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1045, 1045, 1045, 1056, 1056, 1056, 1056,
+ 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1064, 1064, 1064,
+ 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1067, 1067,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1110, 1110, 1110, 1110, 2813, 2813, 1110, 2813, 2813,
+ 1110, 987, 987, 987, 987, 987, 987, 987, 987, 987,
+
+ 987, 987, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 992, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 996, 996, 996,
+ 996, 996, 996, 996, 996, 996, 996, 996, 1135, 1135,
+ 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1138,
+ 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
+ 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
+
+ 1001, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 875, 875, 875, 875, 875, 875, 875, 875,
+ 875, 875, 875, 233, 233, 2813, 233, 233, 233, 233,
+ 233, 233, 233, 233, 1006, 1006, 1006, 1006, 1006, 1006,
+ 1006, 1006, 1006, 1006, 1006, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1155, 1155, 1155, 1155,
+ 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1161, 1161, 1161,
+ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1172, 1172,
+ 2813, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1042,
+ 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+
+ 920, 920, 920, 920, 920, 920, 920, 920, 920, 920,
+ 920, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 1056, 1056, 1056, 1056, 1056, 1056,
+ 1056, 1056, 1056, 1056, 1056, 1064, 1064, 1064, 1064, 1064,
+ 1064, 1064, 1064, 1064, 1064, 1064, 938, 938, 938, 938,
+ 938, 938, 938, 938, 938, 938, 938, 1067, 1067, 1067,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 821,
+
+ 821, 821, 821, 821, 821, 821, 821, 821, 821, 821,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212,
+ 1212, 1212, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1096, 1096, 1221, 1221, 1221, 1221, 1221, 1221, 1221,
+ 1221, 1221, 1221, 1221, 1223, 1223, 1223, 1223, 1223, 1223,
+ 1223, 1223, 1223, 1223, 1223, 170, 170, 2813, 170, 170,
+ 170, 170, 170, 170, 170, 170, 1109, 1109, 1109, 1109,
+ 2813, 2813, 1109, 2813, 2813, 1109, 1110, 1110, 1110, 1110,
+ 2813, 2813, 1110, 2813, 2813, 1110, 213, 2813, 2813, 213,
+
+ 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239,
+ 1239, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245,
+ 1245, 1245, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 987, 987, 987, 987, 987, 987, 987,
+ 987, 987, 987, 987, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 1252, 1252, 1252, 1252, 1252,
+ 1252, 1252, 1252, 1252, 1252, 1252, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1135, 1135,
+ 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 996,
+
+ 996, 996, 996, 996, 996, 996, 996, 996, 996, 996,
+ 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
+ 1138, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257,
+ 1257, 1257, 875, 875, 875, 875, 875, 875, 875, 875,
+ 875, 875, 875, 1143, 1143, 1143, 1143, 1143, 1143, 1143,
+ 1143, 1143, 1143, 1143, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1269, 1269, 1269, 1269,
+ 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1271, 1271, 1271,
+ 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1155, 1155,
+
+ 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1275,
+ 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275,
+ 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278,
+ 1278, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161,
+ 1161, 1161, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282,
+ 1282, 1282, 1282, 1172, 1172, 2813, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1300, 1300, 1300, 1300, 1300,
+ 1300, 1300, 1300, 1300, 1300, 1300, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1045, 1045, 1045,
+
+ 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920, 920, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313,
+ 1313, 1313, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 1067, 1067, 938, 938, 938, 938, 938, 938,
+ 938, 938, 938, 938, 938, 821, 821, 821, 821, 821,
+ 821, 821, 821, 821, 821, 821, 1212, 1212, 1212, 1212,
+
+ 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1327, 1327, 1327,
+ 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1330, 1330,
+ 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1223,
+ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221,
+ 1221, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335,
+ 1335, 1335, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344,
+ 1344, 1344, 1344, 170, 170, 2813, 170, 170, 170, 170,
+ 170, 170, 170, 170, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 213, 2813, 213, 213, 213,
+
+ 213, 2813, 213, 1239, 1239, 1239, 1239, 1239, 1239, 1239,
+ 1239, 1239, 1239, 1239, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1245, 1245, 1245, 1245,
+ 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1365, 1365, 1365,
+ 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1252, 1252,
+ 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 987, 987, 987, 987, 987, 987, 987, 987, 987,
+
+ 987, 987, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257,
+ 1257, 1257, 1257, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+ 1376, 1376, 1376, 1376, 1378, 1378, 1378, 1378, 1378, 1378,
+ 1378, 1378, 1378, 1378, 1378, 996, 996, 996, 996, 996,
+ 996, 996, 996, 996, 996, 996, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1271,
+ 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
+ 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269,
+
+ 1269, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387,
+ 1387, 1387, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392,
+ 1392, 1392, 1392, 1275, 1275, 1275, 1275, 1275, 1275, 1275,
+ 1275, 1275, 1275, 1275, 1396, 1396, 1396, 1396, 1396, 1396,
+ 1396, 1396, 1396, 1396, 1396, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1278, 1278, 1278, 1278,
+ 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1406, 1406, 1406,
+ 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1282, 1282,
+ 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1410,
+ 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410,
+
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1172, 1172, 2813, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 127, 127, 127, 2813, 127, 127, 127, 2813,
+ 2813, 127, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1302, 1300, 1300, 1300, 1300, 1300, 1300, 1300,
+ 1300, 1300, 1300, 1300, 1426, 1426, 1426, 1426, 1426, 1426,
+ 1426, 1426, 1426, 1426, 1426, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1045, 1045, 1045, 1045, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920, 807, 807,
+
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313,
+ 1313, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
+ 1440, 1440, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
+ 1443, 1443, 1443, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 1067, 1067, 938, 938, 938, 938, 938, 938,
+ 938, 938, 938, 938, 938, 821, 821, 821, 821, 821,
+ 821, 821, 821, 821, 821, 821, 116, 116, 2813, 116,
+ 116, 116, 116, 116, 116, 116, 116, 1327, 1327, 1327,
+
+ 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1456, 1456,
+ 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330,
+ 1330, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466,
+ 1466, 1466, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335,
+ 1335, 1335, 1335, 1472, 1472, 1472, 1472, 1472, 1472, 1472,
+ 1472, 1472, 1472, 1472, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1344, 1344, 1344, 1344, 1344,
+ 1344, 1344, 1344, 1344, 1344, 1344, 1486, 1486, 1486, 1486,
+
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1223, 1223, 1223,
+ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 170, 170,
+ 2813, 170, 170, 170, 170, 170, 170, 170, 170, 1494,
+ 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494,
+ 1496, 1496, 1496, 1496, 1496, 2813, 2813, 2813, 2813, 1496,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499,
+ 1499, 1499, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+ 1501, 1501, 1501, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1505, 1505, 1505, 1505, 1505, 1505,
+
+ 1505, 1505, 1505, 1505, 1505, 1365, 1365, 1365, 1365, 1365,
+ 1365, 1365, 1365, 1365, 1365, 1365, 1509, 1509, 1509, 1509,
+ 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1511, 1511, 1511,
+ 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1373, 1373,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515,
+ 1515, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378,
+ 1378, 1378, 1378, 1376, 1376, 1376, 1376, 1376, 1376, 1376,
+
+ 1376, 1376, 1376, 1376, 1521, 1521, 1521, 1521, 1521, 1521,
+ 1521, 1521, 1521, 1521, 1521, 1524, 1524, 1524, 1524, 1524,
+ 1524, 1524, 1524, 1524, 1524, 1524, 116, 116, 2813, 116,
+ 116, 116, 116, 116, 116, 116, 116, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1528, 1528,
+ 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534,
+ 1534, 1534, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387,
+
+ 1387, 1387, 1387, 1538, 1538, 1538, 1538, 1538, 1538, 1538,
+ 1538, 1538, 1538, 1538, 1541, 1541, 1541, 1541, 1541, 1541,
+ 1541, 1541, 1541, 1541, 1541, 1392, 1392, 1392, 1392, 1392,
+ 1392, 1392, 1392, 1392, 1392, 1392, 1546, 1546, 1546, 1546,
+ 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1271, 1271, 1271,
+ 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1398, 1398,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1396,
+ 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
+
+ 1557, 1557, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406,
+ 1406, 1406, 1406, 1563, 1563, 1563, 1563, 1563, 1563, 1563,
+ 1563, 1563, 1563, 1563, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1410, 1410, 1410, 1410,
+ 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1572, 1572, 1572,
+ 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1575, 1575,
+ 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1172,
+ 1172, 2813, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
+
+ 1426, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1590, 1590, 1590, 1590, 1590, 1590,
+ 1590, 1590, 1590, 1590, 1590, 1302, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1302, 1302, 1302, 1302, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 127, 2813,
+ 127, 2813, 127, 2813, 127, 2813, 2813, 127, 1440, 1440,
+ 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1605,
+
+ 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
+ 1443, 1443, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609,
+ 1609, 1609, 1609, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1315, 938, 938, 938, 938, 938, 938,
+ 938, 938, 938, 938, 938, 821, 821, 821, 821, 821,
+ 821, 821, 821, 821, 821, 821, 1496, 1496, 1496, 1496,
+ 2813, 2813, 2813, 2813, 2813, 1496, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1456, 1456, 1456,
+
+ 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1633,
+ 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633,
+ 116, 116, 2813, 116, 116, 116, 116, 116, 116, 116,
+ 116, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466,
+ 1466, 1466, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639,
+ 1639, 1639, 1639, 1641, 1641, 1641, 1641, 1641, 1641, 1641,
+ 1641, 1641, 1641, 1641, 1472, 1472, 1472, 1472, 1472, 1472,
+ 1472, 1472, 1472, 1472, 1472, 1335, 1335, 1335, 1335, 1335,
+ 1335, 1335, 1335, 1335, 1335, 1335, 1475, 1475, 1475, 1475,
+
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1223, 1223,
+ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 170, 170, 2813, 170, 170, 170, 170, 170, 170, 170,
+ 170, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493,
+ 1493, 1493, 1493, 1494, 1494, 1494, 1494, 1494, 1494, 1494,
+ 1494, 1494, 1494, 1494, 1666, 1666, 1666, 1666, 2813, 2813,
+ 1666, 2813, 2813, 1666, 127, 127, 127, 127, 127, 2813,
+
+ 127, 2813, 2813, 127, 1501, 1501, 1501, 1501, 1501, 1501,
+ 1501, 1501, 1501, 1501, 1501, 1499, 1499, 1499, 1499, 1499,
+ 1499, 1499, 1499, 1499, 1499, 1499, 1667, 1667, 1667, 1667,
+ 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1672, 1672, 1672,
+ 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1505, 1505,
+ 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1676,
+ 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676,
+ 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
+ 1678, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
+ 1511, 1511, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509,
+
+ 1509, 1509, 1509, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1686, 1686, 1686, 1686, 1686, 1686,
+ 1686, 1686, 1686, 1686, 1686, 1515, 1515, 1515, 1515, 1515,
+ 1515, 1515, 1515, 1515, 1515, 1515, 1690, 1690, 1690, 1690,
+ 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1694,
+ 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
+ 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
+
+ 1521, 1521, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
+ 1698, 1698, 1698, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
+ 1138, 1138, 1138, 1138, 1524, 1524, 1524, 1524, 1524, 1524,
+ 1524, 1524, 1524, 1524, 1524, 1702, 1702, 1702, 1702, 1702,
+ 1702, 1702, 1702, 1702, 1702, 1702, 1378, 1378, 1378, 1378,
+ 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1528, 1528,
+ 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1706,
+ 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
+ 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711,
+
+ 1711, 116, 116, 2813, 116, 116, 116, 116, 116, 116,
+ 116, 116, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534,
+ 1534, 1534, 1534, 1715, 1715, 1715, 1715, 1715, 1715, 1715,
+ 1715, 1715, 1715, 1715, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1538, 1538, 1538, 1538, 1538,
+ 1538, 1538, 1538, 1538, 1538, 1538, 1387, 1387, 1387, 1387,
+ 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1541, 1541, 1541,
+ 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1271,
+ 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
+
+ 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,
+ 1546, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
+ 1726, 1726, 1726, 1729, 1729, 1729, 1729, 1729, 1729, 1729,
+ 1729, 1729, 1729, 1729, 1557, 1557, 1557, 1557, 1557, 1557,
+ 1557, 1557, 1557, 1557, 1557, 1740, 1740, 1740, 1740, 1740,
+ 1740, 1740, 1740, 1740, 1740, 1740, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1563, 1563,
+ 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1744,
+
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753,
+ 1753, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572,
+ 1572, 1572, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758,
+ 1758, 1758, 1758, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
+ 1761, 1761, 1761, 1761, 1575, 1575, 1575, 1575, 1575, 1575,
+ 1575, 1575, 1575, 1575, 1575, 1765, 1765, 1765, 1765, 1765,
+ 1765, 1765, 1765, 1765, 1765, 1765, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1172, 1172, 2813,
+ 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1586, 1586,
+
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1426,
+ 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
+ 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302,
+ 1302, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590,
+ 1590, 1590, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1045, 1045, 1045, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1045, 920, 920, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 127, 2813, 127, 2813,
+ 127, 2813, 127, 2813, 2813, 127, 1605, 1605, 1605, 1605,
+
+ 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1440, 1440, 1440,
+ 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1609,
+ 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609,
+ 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
+ 1443, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 938, 938, 938, 938, 938, 938, 938, 938,
+ 938, 938, 938, 821, 821, 821, 821, 821, 821, 821,
+ 821, 821, 821, 821, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1803, 1803, 1803, 1803, 1803,
+
+ 1803, 1803, 1803, 1803, 1803, 1803, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1633, 1633, 1633,
+ 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1817, 1817,
+ 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641,
+ 1641, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639,
+ 1639, 1639, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
+ 1821, 1821, 1821, 1830, 1830, 1830, 1830, 1830, 1830, 1830,
+ 1830, 1830, 1830, 1830, 116, 116, 2813, 116, 116, 116,
+
+ 116, 116, 116, 116, 116, 1651, 1651, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 1651, 1651, 1838, 1838, 1838, 1838,
+ 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1840, 1840, 1840,
+ 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1335,
+ 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335,
+ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ 1223, 170, 170, 2813, 170, 170, 170, 170, 170, 170,
+ 170, 170, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494,
+ 1494, 1494, 1494, 1665, 1665, 1665, 1665, 2813, 2813, 1665,
+
+ 2813, 2813, 1665, 1666, 1666, 1666, 1666, 2813, 2813, 1666,
+ 2813, 2813, 1666, 1667, 1667, 1667, 1667, 1667, 1667, 1667,
+ 1667, 1667, 1667, 1667, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1855, 1855, 1855, 1855, 1855,
+ 1855, 1855, 1855, 1855, 1855, 1855, 1672, 1672, 1672, 1672,
+ 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1501, 1501,
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1678,
+ 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
+ 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676,
+
+ 1676, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862,
+ 1862, 1862, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1871, 1871, 1871, 1871, 1871, 1871,
+ 1871, 1871, 1871, 1871, 1871, 1874, 1874, 1874, 1874, 1874,
+ 1874, 1874, 1874, 1874, 1874, 1874, 1686, 1686, 1686, 1686,
+ 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1879, 1879, 1879,
+ 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1511, 1511,
+ 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1690,
+ 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
+
+ 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515,
+ 1515, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1373, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
+ 1694, 1694, 1694, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1698, 1698, 1698, 1698, 1698, 1698,
+ 1698, 1698, 1698, 1698, 1698, 1521, 1521, 1521, 1521, 1521,
+ 1521, 1521, 1521, 1521, 1521, 1521, 1378, 1378, 1378, 1378,
+ 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1702, 1702, 1702,
+ 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1524, 1524,
+ 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1706,
+
+ 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
+ 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889,
+ 1889, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892,
+ 1892, 1892, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711,
+ 1711, 1711, 1711, 1897, 1897, 1897, 1897, 1897, 1897, 1897,
+ 1897, 1897, 1897, 1897, 1530, 1530, 1530, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1715, 1715, 1715, 1715,
+ 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1904, 1904,
+
+ 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910,
+ 1910, 1910, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387,
+ 1387, 1387, 1387, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
+ 1726, 1726, 1726, 1726, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1729, 1729, 1729, 1729, 1729,
+ 1729, 1729, 1729, 1729, 1729, 1729, 1913, 1913, 1913, 1913,
+ 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1398, 1398, 1398,
+
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1740, 1740,
+ 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927,
+ 1927, 1927, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753,
+ 1753, 1753, 1753, 1938, 1938, 1938, 1938, 1938, 1938, 1938,
+ 1938, 1938, 1938, 1938, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1758, 1758, 1758, 1758, 1758,
+ 1758, 1758, 1758, 1758, 1758, 1758, 1572, 1572, 1572, 1572,
+
+ 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1761, 1761, 1761,
+ 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765,
+ 1765, 1172, 1172, 2813, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
+ 1426, 1426, 1426, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1586, 1302, 1302, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1302, 1302, 1302, 1045, 1045, 1045, 1045, 1045,
+
+ 1045, 1045, 1045, 1045, 1045, 1045, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 1440, 1440,
+ 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1605,
+ 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 938, 938, 938, 938, 938, 938, 938, 938,
+ 938, 938, 938, 821, 821, 821, 821, 821, 821, 821,
+ 821, 821, 821, 821, 1803, 1803, 1803, 1803, 1803, 1803,
+
+ 1803, 1803, 1803, 1803, 1803, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1971, 1971, 1971,
+ 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 116, 116,
+ 2813, 116, 116, 116, 116, 116, 116, 116, 116, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817,
+ 1817, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
+ 1821, 1821, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982,
+ 1982, 1982, 1982, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+
+ 1985, 1985, 1985, 1985, 1830, 1830, 1830, 1830, 1830, 1830,
+ 1830, 1830, 1830, 1830, 1830, 1996, 1996, 1996, 1996, 1996,
+ 1996, 1996, 1996, 1996, 1996, 1996, 1641, 1641, 1641, 1641,
+ 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1840, 1840, 1840,
+ 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1838, 1838,
+ 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 2002,
+ 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002,
+ 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005,
+ 2005, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335,
+
+ 1335, 1335, 1335, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ 1223, 1223, 1223, 1223, 170, 170, 2813, 170, 170, 170,
+ 170, 170, 170, 170, 170, 1494, 1494, 1494, 1494, 1494,
+ 1494, 1494, 1494, 1494, 1494, 1494, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1667, 1667, 1667,
+ 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1855, 1855,
+ 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 2018,
+ 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018,
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+ 1501, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862,
+ 1862, 1862, 1862, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 2031, 2031, 2031, 2031,
+ 2031, 2031, 2031, 2031, 2031, 2031, 2031, 1678, 1678, 1678,
+ 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1871, 1871,
+ 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
+ 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874,
+
+ 1874, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034,
+ 2034, 2034, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511,
+ 1511, 1511, 1511, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
+ 1879, 1879, 1879, 1879, 1515, 1515, 1515, 1515, 1515, 1515,
+ 1515, 1515, 1515, 1515, 1515, 1690, 1690, 1690, 1690, 1690,
+ 1690, 1690, 1690, 1690, 1690, 1690, 1521, 1521, 1521, 1521,
+ 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1698, 1698, 1698,
+ 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1889, 1889,
+ 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1706,
+ 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
+
+ 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892,
+ 1892, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040,
+ 2040, 2040, 116, 116, 2813, 116, 116, 116, 116, 116,
+ 116, 116, 116, 1530, 1530, 1530, 1530, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1897, 1897, 1897, 1897, 1897, 1897,
+ 1897, 1897, 1897, 1897, 1897, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 2045, 2045, 2045, 2045,
+ 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 1904, 1904,
+ 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 2053,
+
+ 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910,
+ 1910, 1910, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 2055, 2055, 2055, 2055, 2055, 2055, 2055,
+ 2055, 2055, 2055, 2055, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2058, 2058, 2058, 1913, 1913, 1913, 1913, 1913,
+ 1913, 1913, 1913, 1913, 1913, 1913, 2062, 2062, 2062, 2062,
+ 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2064, 2064, 2064,
+ 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 1729, 1729,
+
+ 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1927, 1927, 1927, 1927, 1927, 1927, 1927,
+ 1927, 1927, 1927, 1927, 2073, 2073, 2073, 2073, 2073, 2073,
+ 2073, 2073, 2073, 2073, 2073, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1938, 1938, 1938, 1938,
+ 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1942, 1942, 1942,
+
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 2084, 2084,
+ 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2086,
+ 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086,
+ 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572,
+ 1572, 1172, 1172, 2813, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
+ 1426, 1426, 1426, 1302, 1302, 1302, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1302, 1302, 1045, 1045, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1045, 1045, 920, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 807, 807, 807, 807,
+
+ 807, 807, 807, 807, 807, 807, 807, 1440, 1440, 1440,
+ 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1067,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 938, 938, 938, 938, 938, 938, 938, 938, 938, 938,
+ 938, 821, 821, 821, 821, 821, 821, 821, 821, 821,
+ 821, 821, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
+ 1971, 1971, 1971, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 2108, 2110, 2110, 2110, 2110, 2110, 2110,
+ 2110, 2110, 2110, 2110, 2110, 1806, 1806, 1806, 1806, 1806,
+
+ 1806, 1806, 1806, 1806, 1806, 1806, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1982, 1982,
+ 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1821,
+ 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119,
+ 2119, 2119, 116, 116, 2813, 116, 116, 116, 116, 116,
+ 116, 116, 116, 1641, 1641, 1641, 1641, 1641, 1641, 1641,
+ 1641, 1641, 1641, 1641, 1996, 1996, 1996, 1996, 1996, 1996,
+
+ 1996, 1996, 1996, 1996, 1996, 2002, 2002, 2002, 2002, 2002,
+ 2002, 2002, 2002, 2002, 2002, 2002, 2131, 2131, 2131, 2131,
+ 2131, 2131, 2131, 2131, 2131, 2131, 2131, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 2005, 2005,
+ 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2135,
+ 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
+ 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
+ 1840, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335,
+ 1335, 1335, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ 1223, 1223, 1223, 170, 170, 2813, 170, 170, 170, 170,
+
+ 170, 170, 170, 170, 1494, 1494, 1494, 1494, 1494, 1494,
+ 1494, 1494, 1494, 1494, 1494, 2018, 2018, 2018, 2018, 2018,
+ 2018, 2018, 2018, 2018, 2018, 2018, 2152, 2152, 2152, 2152,
+ 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2154, 2154, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 1667, 1667,
+ 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862,
+ 1862, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157,
+
+ 2157, 2157, 2157, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
+ 1678, 1678, 1678, 1678, 2031, 2031, 2031, 2031, 2031, 2031,
+ 2031, 2031, 2031, 2031, 2031, 2034, 2034, 2034, 2034, 2034,
+ 2034, 2034, 2034, 2034, 2034, 2034, 2162, 2162, 2162, 2162,
+ 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 2040,
+ 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040,
+ 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167,
+ 2167, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
+
+ 2169, 2169, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
+ 1706, 1706, 1706, 2045, 2045, 2045, 2045, 2045, 2045, 2045,
+ 2045, 2045, 2045, 2045, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2172, 2172, 2172, 2172,
+ 2172, 2172, 2172, 2172, 2172, 2172, 2172, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 2053, 2053,
+ 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2055,
+ 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055,
+ 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
+
+ 2176, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541,
+ 1541, 1541, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2058, 2180, 2180, 2180, 2180, 2180, 2180, 2180,
+ 2180, 2180, 2180, 2180, 1910, 1910, 1910, 1910, 1910, 1910,
+ 1910, 1910, 1910, 1910, 1910, 2064, 2064, 2064, 2064, 2064,
+ 2064, 2064, 2064, 2064, 2064, 2064, 2062, 2062, 2062, 2062,
+ 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2184, 2184, 2184,
+ 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 1729,
+ 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729,
+
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
+ 2073, 2073, 2073, 2197, 2197, 2197, 2197, 2197, 2197, 2197,
+ 2197, 2197, 2197, 2197, 2199, 2199, 2199, 2199, 2199, 2199,
+ 2199, 2199, 2199, 2199, 2199, 1927, 1927, 1927, 1927, 1927,
+ 1927, 1927, 1927, 1927, 1927, 1927, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 2086, 2086,
+ 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2084,
+
+ 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 1172, 1172, 2813, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
+ 1426, 1426, 1426, 1426, 1302, 1302, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1302, 1302, 1302, 1045, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1045, 1045, 1045, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 1440, 1440,
+
+ 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 938, 938, 938, 938, 938, 938, 938, 938, 938,
+ 938, 938, 821, 821, 821, 821, 821, 821, 821, 821,
+ 821, 821, 821, 2110, 2110, 2110, 2110, 2110, 2110, 2110,
+ 2110, 2110, 2110, 2110, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 2108, 2108, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2228, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 1806, 1806, 1806,
+
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119,
+ 2119, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241,
+ 2241, 2241, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1821, 1821, 1821, 1821, 1821, 1821,
+ 1821, 1821, 1821, 1821, 1821, 1641, 1641, 1641, 1641, 1641,
+ 1641, 1641, 1641, 1641, 1641, 1641, 116, 116, 2813, 116,
+
+ 116, 116, 116, 116, 116, 116, 116, 2131, 2131, 2131,
+ 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2002, 2002,
+ 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 1840,
+ 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
+ 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
+ 2135, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005,
+ 2005, 2005, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1335, 1335, 1335, 1335, 1335, 1335, 1335,
+ 1335, 1335, 1335, 1335, 1223, 1223, 1223, 1223, 1223, 1223,
+ 1223, 1223, 1223, 1223, 1223, 170, 170, 2813, 170, 170,
+
+ 170, 170, 170, 170, 170, 170, 1494, 1494, 1494, 1494,
+ 1494, 1494, 1494, 1494, 1494, 1494, 1494, 2154, 2154, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2152, 2152,
+ 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2268,
+ 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268,
+ 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271,
+ 2271, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157,
+ 2157, 2157, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275,
+ 2275, 2275, 2275, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
+ 2277, 2277, 2277, 2277, 1862, 1862, 1862, 1862, 1862, 1862,
+
+ 1862, 1862, 1862, 1862, 1862, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2162, 2162, 2162, 2162,
+ 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2279, 2279, 2279,
+ 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2282, 2282,
+ 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2169,
+ 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
+ 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167,
+ 2167, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285,
+ 2285, 2285, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288,
+ 2288, 2288, 2288, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
+
+ 2172, 2172, 2172, 2172, 2292, 2292, 2292, 2292, 2292, 2292,
+ 2292, 2292, 2292, 2292, 2292, 2294, 2294, 2294, 2294, 2294,
+ 2294, 2294, 2294, 2294, 2294, 2294, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 2176, 2176, 2176,
+ 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2055, 2055,
+ 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 1910,
+ 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910,
+ 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180,
+ 2180, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184,
+
+ 2184, 2184, 2184, 2299, 2299, 2299, 2299, 2299, 2299, 2299,
+ 2299, 2299, 2299, 2299, 1729, 1729, 1729, 1729, 1729, 1729,
+ 1729, 1729, 1729, 1729, 1729, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2064, 2064, 2064,
+ 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1398,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199,
+ 2199, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197,
+
+ 2197, 2197, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317,
+ 2317, 2317, 2317, 2320, 2320, 2320, 2320, 2320, 2320, 2320,
+ 2320, 2320, 2320, 2320, 1927, 1927, 1927, 1927, 1927, 1927,
+ 1927, 1927, 1927, 1927, 1927, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2329, 2329,
+ 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 1761,
+ 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+
+ 2210, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333,
+ 2333, 2333, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086,
+ 2086, 2086, 2086, 1172, 1172, 2813, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1426, 1426, 1426, 1426, 1426, 1426,
+ 1426, 1426, 1426, 1426, 1426, 1302, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1302, 1302, 1302, 1302, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1045, 1045, 1045, 1045, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920, 1440, 1440,
+ 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 938, 938, 938, 938, 938, 938, 938, 938, 938,
+ 938, 938, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 1806, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1806, 1806, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2110, 2110, 2110,
+ 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241,
+ 2241, 2241, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2364, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2367, 2367, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1821, 1821, 1821, 1821, 1821,
+ 1821, 1821, 1821, 1821, 1821, 1821, 1641, 1641, 1641, 1641,
+ 1641, 1641, 1641, 1641, 1641, 1641, 1641, 116, 116, 2813,
+ 116, 116, 116, 116, 116, 116, 116, 116, 2002, 2002,
+
+ 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2131,
+ 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131,
+ 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
+ 1840, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335,
+ 1335, 1335, 1335, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ 1223, 1223, 1223, 1223, 1494, 1494, 1494, 1494, 1494, 1494,
+ 1494, 1494, 1494, 1494, 1494, 2268, 2268, 2268, 2268, 2268,
+ 2268, 2268, 2268, 2268, 2268, 2268, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 1855, 1855, 1855,
+
+ 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 2271, 2271,
+ 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2391,
+ 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391, 2391,
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
+ 2154, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
+ 2277, 2277, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275,
+ 2275, 2275, 2275, 2395, 2395, 2395, 2395, 2395, 2395, 2395,
+ 2395, 2395, 2395, 2395, 2398, 2398, 2398, 2398, 2398, 2398,
+ 2398, 2398, 2398, 2398, 2398, 2279, 2279, 2279, 2279, 2279,
+ 2279, 2279, 2279, 2279, 2279, 2279, 2401, 2401, 2401, 2401,
+
+ 2401, 2401, 2401, 2401, 2401, 2401, 2401, 1874, 1874, 1874,
+ 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 2282, 2282,
+ 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2405,
+ 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285,
+ 2285, 2285, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409,
+ 2409, 2409, 2409, 1892, 1892, 1892, 1892, 1892, 1892, 1892,
+ 1892, 1892, 1892, 1892, 2288, 2288, 2288, 2288, 2288, 2288,
+ 2288, 2288, 2288, 2288, 2288, 2413, 2413, 2413, 2413, 2413,
+
+ 2413, 2413, 2413, 2413, 2413, 2413, 2169, 2169, 2169, 2169,
+ 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2294, 2294, 2294,
+ 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2292, 2292,
+ 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2417,
+ 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417,
+ 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420,
+ 2420, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055,
+ 2055, 2055, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
+ 2176, 2176, 2176, 2299, 2299, 2299, 2299, 2299, 2299, 2299,
+ 2299, 2299, 2299, 2299, 2184, 2184, 2184, 2184, 2184, 2184,
+
+ 2184, 2184, 2184, 2184, 2184, 2064, 2064, 2064, 2064, 2064,
+ 2064, 2064, 2064, 2064, 2064, 2064, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 1729, 1729,
+ 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317,
+ 2317, 2317, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438,
+ 2438, 2438, 2438, 1927, 1927, 1927, 1927, 1927, 1927, 1927,
+
+ 1927, 1927, 1927, 1927, 2320, 2320, 2320, 2320, 2320, 2320,
+ 2320, 2320, 2320, 2320, 2320, 2442, 2442, 2442, 2442, 2442,
+ 2442, 2442, 2442, 2442, 2442, 2442, 2199, 2199, 2199, 2199,
+ 2199, 2199, 2199, 2199, 2199, 2199, 2199, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 2329,
+ 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086,
+ 2086, 2086, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333,
+
+ 2333, 2333, 2333, 1172, 1172, 2813, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1426, 1426, 1426, 1426, 1426, 1426,
+ 1426, 1426, 1426, 1426, 1426, 1302, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1302, 1302, 1302, 1302, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1440, 1440, 1440,
+ 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1067,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+
+ 2228, 2228, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110,
+ 2110, 2110, 2110, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1806, 1806, 1806, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 2364, 2364,
+ 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+
+ 1985, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 1821, 1821, 1821, 1821, 1821, 1821,
+ 1821, 1821, 1821, 1821, 1821, 1641, 1641, 1641, 1641, 1641,
+ 1641, 1641, 1641, 1641, 1641, 1641, 2002, 2002, 2002, 2002,
+ 2002, 2002, 2002, 2002, 2002, 2002, 2002, 1840, 1840, 1840,
+ 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1335,
+ 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335,
+
+ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ 1223, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494,
+ 1494, 1494, 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2268, 2268, 2268, 2268, 2268, 2268, 2268,
+ 2268, 2268, 2268, 2268, 2154, 2154, 2154, 2154, 2154, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2391, 2391, 2391, 2391, 2391,
+ 2391, 2391, 2391, 2391, 2391, 2391, 2271, 2271, 2271, 2271,
+ 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2395, 2395, 2395,
+ 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2026,
+
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398,
+ 2398, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
+ 2516, 2516, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
+ 2277, 2277, 2277, 2401, 2401, 2401, 2401, 2401, 2401, 2401,
+ 2401, 2401, 2401, 2401, 2279, 2279, 2279, 2279, 2279, 2279,
+ 2279, 2279, 2279, 2279, 2279, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2405, 2405, 2405, 2405,
+ 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2282, 2282, 2282,
+ 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2409, 2409,
+
+ 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2285,
+ 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285,
+ 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169,
+ 2169, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413,
+ 2413, 2413, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288,
+ 2288, 2288, 2288, 2417, 2417, 2417, 2417, 2417, 2417, 2417,
+ 2417, 2417, 2417, 2417, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2526, 2526, 2526, 2526, 2526, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2420, 2420, 2420, 2420,
+ 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2530, 2530, 2530,
+
+ 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2294, 2294,
+ 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2184,
+ 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184,
+ 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299, 2299,
+ 2299, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064,
+ 2064, 2064, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729,
+ 1729, 1729, 1729, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 1398, 1398, 2438, 2438, 2438, 2438, 2438,
+ 2438, 2438, 2438, 2438, 2438, 2438, 2317, 2317, 2317, 2317,
+
+ 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2199, 2199, 2199,
+ 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2442, 2442,
+ 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2320,
+ 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320,
+ 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927,
+ 1927, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1172, 1426, 1426, 1426, 1426, 1426,
+
+ 1426, 1426, 1426, 1426, 1426, 1426, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1440, 1440, 1440,
+ 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110,
+ 2110, 2110, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1458, 1458, 1458, 1458, 1458, 1458,
+
+ 1458, 1458, 1458, 1458, 1458, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2367,
+ 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
+ 1821, 1821, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641,
+ 1641, 1641, 1641, 2002, 2002, 2002, 2002, 2002, 2002, 2002,
+
+ 2002, 2002, 2002, 2002, 1840, 1840, 1840, 1840, 1840, 1840,
+ 1840, 1840, 1840, 1840, 1840, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1335, 1335, 1335, 1335,
+ 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1223, 1223, 1223,
+ 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1494, 1494,
+ 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 2268,
+ 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395,
+
+ 2395, 2395, 2395, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
+ 2277, 2277, 2277, 2277, 2516, 2516, 2516, 2516, 2516, 2516,
+ 2516, 2516, 2516, 2516, 2516, 2398, 2398, 2398, 2398, 2398,
+ 2398, 2398, 2398, 2398, 2398, 2398, 2279, 2279, 2279, 2279,
+ 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2401, 2401, 2401,
+ 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2285, 2285,
+ 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2409,
+ 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409,
+ 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2526, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417,
+
+ 2417, 2417, 2294, 2294, 2294, 2294, 2294, 2294, 2294, 2294,
+ 2294, 2294, 2294, 2530, 2530, 2530, 2530, 2530, 2530, 2530,
+ 2530, 2530, 2530, 2530, 2420, 2420, 2420, 2420, 2420, 2420,
+ 2420, 2420, 2420, 2420, 2420, 2184, 2184, 2184, 2184, 2184,
+ 2184, 2184, 2184, 2184, 2184, 2184, 2064, 2064, 2064, 2064,
+ 2064, 2064, 2064, 2064, 2064, 2064, 2064, 1729, 1729, 1729,
+ 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1398,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317, 2317,
+
+ 2317, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438,
+ 2438, 2438, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199,
+ 2199, 2199, 2199, 1927, 1927, 1927, 1927, 1927, 1927, 1927,
+ 1927, 1927, 1927, 1927, 1744, 1744, 1744, 1744, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1172, 1172, 2813, 1172,
+ 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1426, 1426, 1426,
+ 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1302, 1302,
+ 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1440,
+ 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
+
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110,
+ 2110, 2110, 2110, 1806, 1806, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1806, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 1985,
+
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
+ 1821, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641,
+ 1641, 1641, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002,
+ 2002, 2002, 2002, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
+ 1840, 1840, 1840, 1840, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1335, 1335, 1335, 1335, 1335,
+ 1335, 1335, 1335, 1335, 1335, 1335, 2395, 2395, 2395, 2395,
+ 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2417, 2417,
+
+ 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2526,
+ 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184,
+ 2184, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064,
+ 2064, 2064, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729,
+ 1729, 1729, 1729, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 1398, 1398, 2317, 2317, 2317, 2317, 2317,
+ 2317, 2317, 2317, 2317, 2317, 2317, 2199, 2199, 2199, 2199,
+ 2199, 2199, 2199, 2199, 2199, 2199, 2199, 1927, 1927, 1927,
+
+ 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1744, 1744,
+ 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426,
+ 1426, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302,
+ 1302, 1302, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
+ 1440, 1440, 1440, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1315, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2110, 2110, 2110, 2110, 2110,
+ 2110, 2110, 2110, 2110, 2110, 2110, 1806, 1806, 1806, 1806,
+
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 2364,
+ 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821,
+ 1821, 1821, 1821, 1641, 1641, 1641, 1641, 1641, 1641, 1641,
+ 1641, 1641, 1641, 1641, 2002, 2002, 2002, 2002, 2002, 2002,
+ 2002, 2002, 2002, 2002, 2002, 1840, 1840, 1840, 1840, 1840,
+
+ 1840, 1840, 1840, 1840, 1840, 1840, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 31, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813
+ } ;
+
+static yyconst flex_int16_t yy_chk[24688] =
+ { 0,
+ 0, 4, 1, 4, 1, 1, 0, 0, 2, 1,
+ 2, 2, 4, 24, 38, 2, 38, 38, 2, 4,
+ 24, 4, 40, 74, 39, 2, 39, 39, 42, 49,
+ 42, 49, 73, 190, 73, 73, 40, 74, 49, 82,
+ 2275, 82, 49, 1, 2197, 190, 4, 24, 4, 2,
+ 2162, 82, 2, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 83,
+ 2158, 83, 7, 2152, 7, 7, 458, 458, 11, 7,
+ 11, 11, 469, 469, 15, 11, 15, 15, 36, 2084,
+ 76, 15, 36, 2074, 76, 5, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 7, 8, 6, 8, 8, 2062, 11,
+ 117, 8, 117, 117, 8, 15, 36, 44, 76, 44,
+
+ 122, 8, 122, 521, 521, 124, 44, 124, 2035, 6,
+ 44, 98, 6, 25, 124, 25, 25, 526, 526, 27,
+ 25, 27, 27, 2019, 44, 8, 27, 98, 8, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 578, 578, 99, 12,
+ 44, 12, 12, 98, 25, 189, 12, 189, 189, 12,
+ 27, 29, 1943, 29, 29, 99, 12, 110, 29, 581,
+ 581, 110, 9, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 12, 99, 10, 12, 100, 55, 16, 55, 16, 16,
+
+ 582, 582, 29, 16, 55, 110, 16, 202, 55, 202,
+ 1914, 102, 100, 16, 1676, 55, 10, 1563, 102, 10,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 16, 100, 1509,
+ 16, 26, 55, 26, 26, 102, 93, 126, 26, 126,
+ 166, 26, 166, 1506, 103, 165, 126, 103, 26, 166,
+ 93, 1499, 196, 13, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 165, 26, 14, 103, 26, 93, 28, 196, 28,
+ 28, 592, 592, 127, 28, 127, 201, 28, 201, 203,
+
+ 215, 203, 127, 215, 28, 1410, 127, 14, 201, 1407,
+ 14, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 28, 1396,
+ 215, 28, 30, 1376, 30, 30, 251, 1371, 251, 30,
+ 1366, 333, 30, 333, 1359, 251, 170, 593, 593, 30,
+ 333, 633, 633, 170, 17, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 170, 30, 18, 60, 30, 60, 60, 170,
+ 634, 634, 95, 96, 143, 143, 143, 635, 635, 641,
+ 641, 1313, 95, 143, 96, 60, 143, 143, 18, 95,
+
+ 96, 18, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 95,
+ 1300, 96, 60, 642, 642, 95, 96, 132, 48, 132,
+ 48, 698, 698, 708, 708, 222, 132, 48, 746, 746,
+ 132, 48, 1283, 132, 222, 19, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 1276, 48, 20, 140, 136, 140, 136,
+ 132, 222, 751, 751, 214, 140, 136, 807, 807, 140,
+ 136, 1258, 368, 136, 368, 140, 810, 810, 214, 20,
+ 48, 368, 20, 21, 21, 21, 21, 21, 21, 21,
+
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 136, 146, 140, 146, 214, 1253, 147, 216, 147, 1196,
+ 146, 58, 1097, 58, 146, 147, 1030, 286, 1030, 147,
+ 58, 1097, 216, 146, 58, 147, 21, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 286, 58, 22, 282, 216, 282,
+ 146, 1183, 147, 323, 1151, 323, 282, 636, 873, 357,
+ 282, 357, 323, 1151, 636, 866, 323, 636, 357, 636,
+ 22, 58, 357, 22, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 43, 47, 43, 47, 376, 235, 51,
+ 97, 51, 43, 47, 297, 819, 43, 47, 51, 52,
+ 235, 52, 51, 79, 97, 79, 217, 805, 52, 218,
+ 43, 47, 52, 47, 376, 235, 97, 43, 752, 51,
+ 297, 217, 174, 47, 174, 53, 235, 53, 747, 52,
+
+ 97, 174, 218, 79, 53, 174, 43, 47, 53, 47,
+ 220, 174, 97, 43, 45, 51, 45, 217, 302, 47,
+ 709, 104, 302, 45, 104, 52, 53, 45, 218, 79,
+ 45, 221, 220, 59, 50, 59, 50, 45, 174, 225,
+ 699, 45, 59, 50, 45, 1221, 59, 50, 104, 302,
+ 225, 104, 53, 221, 1221, 50, 59, 45, 220, 157,
+ 1269, 157, 50, 50, 45, 296, 59, 45, 157, 1269,
+ 45, 46, 157, 46, 104, 294, 157, 225, 308, 221,
+ 46, 308, 50, 59, 46, 238, 56, 46, 50, 50,
+ 56, 46, 59, 410, 56, 46, 57, 459, 57, 459,
+
+ 56, 46, 128, 157, 128, 57, 56, 1328, 308, 57,
+ 459, 128, 57, 56, 46, 128, 1328, 56, 46, 57,
+ 410, 56, 46, 195, 229, 195, 56, 46, 54, 128,
+ 54, 164, 56, 164, 164, 219, 57, 54, 171, 57,
+ 101, 54, 219, 101, 54, 223, 57, 172, 229, 171,
+ 172, 164, 236, 195, 172, 128, 171, 101, 54, 388,
+ 101, 54, 57, 101, 54, 171, 213, 223, 1382, 219,
+ 101, 54, 1456, 172, 229, 171, 172, 1382, 164, 195,
+ 172, 1456, 171, 101, 54, 388, 101, 54, 401, 101,
+ 54, 61, 61, 223, 61, 61, 61, 61, 61, 61,
+
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 224,
+ 401, 62, 129, 62, 129, 61, 1424, 230, 1424, 61,
+ 62, 129, 61, 231, 62, 129, 298, 228, 209, 224,
+ 228, 205, 228, 226, 61, 61, 401, 230, 62, 198,
+ 62, 231, 61, 298, 226, 61, 129, 191, 61, 130,
+ 62, 130, 153, 299, 153, 224, 300, 228, 130, 228,
+ 303, 153, 130, 230, 62, 153, 62, 231, 153, 298,
+ 153, 226, 129, 299, 300, 303, 62, 64, 64, 130,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 142, 153, 142, 153, 185, 299,
+
+ 300, 303, 415, 142, 415, 130, 135, 142, 135, 390,
+ 180, 415, 390, 811, 811, 135, 770, 770, 770, 135,
+ 64, 67, 67, 142, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 150, 390,
+ 150, 135, 309, 159, 248, 159, 248, 150, 301, 142,
+ 1467, 150, 159, 248, 304, 301, 159, 248, 309, 1467,
+ 248, 304, 150, 159, 67, 71, 71, 135, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 301, 137, 309, 137, 311, 248, 304, 150,
+ 159, 176, 137, 138, 138, 138, 137, 312, 821, 821,
+
+ 311, 427, 138, 123, 312, 138, 138, 120, 71, 81,
+ 81, 137, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 311, 427, 399, 138,
+ 161, 312, 161, 267, 313, 267, 118, 137, 141, 161,
+ 141, 112, 267, 161, 108, 399, 267, 141, 313, 267,
+ 161, 141, 81, 85, 85, 138, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 163, 399, 163, 141, 313, 94, 267, 161, 87, 163,
+ 154, 306, 154, 163, 315, 402, 824, 824, 402, 154,
+ 84, 315, 306, 154, 163, 80, 85, 88, 88, 141,
+
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 241, 402, 241, 154, 315, 306,
+ 254, 163, 254, 241, 404, 825, 825, 241, 307, 254,
+ 70, 404, 241, 254, 404, 404, 404, 254, 66, 307,
+ 88, 105, 105, 154, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 310, 241,
+ 131, 133, 131, 133, 254, 105, 307, 392, 63, 131,
+ 133, 316, 105, 131, 133, 41, 134, 139, 134, 139,
+ 316, 317, 310, 392, 105, 134, 139, 131, 317, 134,
+ 139, 133, 105, 145, 131, 145, 314, 139, 105, 868,
+
+ 868, 144, 145, 144, 134, 134, 145, 316, 310, 392,
+ 144, 139, 34, 131, 144, 317, 434, 133, 227, 314,
+ 131, 389, 227, 291, 139, 145, 389, 148, 145, 148,
+ 134, 134, 144, 149, 291, 149, 148, 139, 227, 151,
+ 148, 151, 149, 434, 31, 314, 149, 148, 151, 227,
+ 291, 145, 151, 389, 145, 773, 773, 773, 144, 522,
+ 291, 522, 148, 151, 227, 0, 149, 292, 152, 151,
+ 152, 155, 522, 155, 148, 0, 377, 152, 289, 394,
+ 155, 152, 292, 377, 155, 152, 394, 156, 148, 156,
+ 151, 289, 149, 0, 292, 151, 156, 158, 155, 158,
+
+ 156, 152, 160, 377, 160, 289, 158, 0, 292, 377,
+ 158, 160, 152, 394, 318, 160, 162, 289, 162, 173,
+ 173, 173, 0, 319, 155, 162, 173, 152, 156, 162,
+ 158, 318, 0, 160, 432, 239, 162, 239, 319, 375,
+ 162, 318, 0, 375, 239, 173, 173, 173, 239, 244,
+ 319, 244, 173, 1584, 156, 1584, 158, 318, 244, 160,
+ 432, 0, 244, 162, 319, 239, 375, 162, 168, 168,
+ 375, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 244, 168, 168, 243, 250, 243, 250, 0,
+ 391, 239, 869, 869, 243, 250, 397, 398, 243, 250,
+
+ 1528, 240, 398, 240, 391, 243, 250, 397, 244, 1528,
+ 240, 168, 169, 169, 240, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 398,
+ 391, 240, 243, 250, 397, 242, 245, 242, 245, 0,
+ 169, 246, 433, 246, 242, 245, 0, 169, 242, 245,
+ 246, 324, 324, 324, 246, 169, 361, 240, 361, 1771,
+ 324, 1771, 242, 324, 324, 361, 169, 1535, 433, 361,
+ 245, 0, 246, 169, 177, 177, 1535, 177, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 177, 242, 177,
+ 177, 870, 870, 249, 400, 249, 245, 393, 246, 481,
+
+ 0, 481, 249, 247, 0, 247, 249, 0, 481, 400,
+ 475, 393, 247, 775, 775, 775, 247, 177, 178, 178,
+ 249, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+ 178, 178, 178, 178, 178, 400, 475, 393, 247, 256,
+ 258, 256, 258, 782, 782, 782, 249, 403, 256, 258,
+ 408, 0, 256, 258, 875, 875, 395, 408, 403, 256,
+ 258, 178, 181, 181, 247, 181, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 181, 395, 181, 181, 1639,
+ 255, 259, 255, 259, 408, 403, 256, 258, 1639, 255,
+ 259, 876, 876, 255, 259, 483, 2000, 483, 2000, 259,
+
+ 0, 430, 395, 430, 483, 181, 182, 182, 255, 182,
+ 182, 182, 182, 182, 182, 182, 182, 182, 182, 182,
+ 182, 182, 182, 257, 257, 257, 259, 430, 261, 430,
+ 261, 341, 257, 341, 255, 0, 257, 261, 877, 877,
+ 341, 261, 257, 0, 341, 436, 0, 257, 488, 182,
+ 186, 186, 341, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 261, 186, 186, 0, 263, 257,
+ 263, 325, 436, 325, 257, 488, 272, 263, 272, 341,
+ 325, 263, 920, 920, 325, 272, 476, 325, 0, 272,
+ 261, 477, 263, 186, 187, 187, 272, 187, 187, 187,
+
+ 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+ 187, 0, 476, 260, 325, 260, 264, 477, 264, 263,
+ 407, 0, 260, 272, 1652, 264, 260, 407, 0, 264,
+ 407, 407, 407, 1652, 478, 923, 923, 187, 199, 199,
+ 260, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+ 199, 199, 264, 199, 199, 265, 266, 265, 266, 406,
+ 478, 329, 329, 329, 265, 266, 260, 0, 265, 266,
+ 329, 925, 925, 329, 329, 0, 479, 480, 264, 406,
+ 266, 199, 200, 200, 265, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 268,
+
+ 0, 268, 479, 480, 274, 406, 274, 266, 268, 269,
+ 265, 269, 268, 274, 525, 1715, 525, 274, 269, 928,
+ 928, 492, 269, 525, 1715, 200, 206, 206, 268, 206,
+ 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
+ 274, 206, 206, 270, 1722, 270, 269, 492, 275, 320,
+ 275, 320, 270, 1722, 268, 503, 270, 275, 320, 0,
+ 503, 275, 320, 929, 929, 270, 274, 320, 275, 206,
+ 207, 207, 269, 207, 207, 207, 207, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 503, 276, 271,
+ 276, 271, 270, 0, 320, 275, 0, 276, 271, 930,
+
+ 930, 276, 271, 604, 0, 604, 502, 0, 276, 502,
+ 938, 938, 604, 207, 210, 210, 271, 210, 210, 210,
+ 210, 210, 210, 210, 210, 210, 210, 210, 547, 210,
+ 210, 277, 279, 277, 279, 276, 502, 337, 337, 337,
+ 277, 279, 271, 517, 277, 279, 337, 0, 517, 337,
+ 337, 277, 941, 941, 279, 547, 378, 210, 211, 211,
+ 378, 211, 211, 211, 211, 211, 211, 211, 211, 211,
+ 211, 211, 211, 211, 211, 517, 839, 273, 277, 273,
+ 281, 279, 281, 378, 839, 839, 273, 378, 0, 281,
+ 273, 504, 2129, 281, 2129, 505, 273, 486, 504, 486,
+
+ 281, 211, 232, 232, 273, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 505, 232, 232, 280,
+ 321, 280, 321, 273, 486, 504, 486, 281, 280, 321,
+ 273, 881, 280, 321, 506, 943, 943, 426, 321, 881,
+ 881, 506, 505, 0, 426, 232, 233, 233, 280, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 426, 409, 321, 409, 326, 506, 326,
+ 426, 946, 946, 409, 280, 0, 326, 409, 0, 278,
+ 326, 278, 783, 783, 783, 947, 947, 326, 278, 233,
+ 234, 234, 278, 234, 234, 234, 234, 234, 234, 234,
+
+ 234, 234, 234, 234, 234, 234, 234, 234, 262, 283,
+ 262, 283, 278, 290, 326, 396, 0, 262, 283, 948,
+ 948, 262, 283, 284, 396, 284, 0, 290, 262, 987,
+ 987, 396, 284, 234, 234, 285, 284, 285, 278, 305,
+ 290, 262, 283, 322, 285, 322, 305, 411, 285, 0,
+ 284, 396, 322, 290, 550, 262, 322, 396, 411, 305,
+ 0, 435, 327, 0, 327, 435, 0, 262, 283, 322,
+ 285, 327, 554, 305, 411, 327, 284, 328, 354, 328,
+ 354, 550, 988, 988, 411, 305, 328, 354, 435, 327,
+ 328, 354, 435, 328, 354, 322, 285, 287, 287, 554,
+
+ 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
+ 287, 287, 287, 287, 331, 327, 331, 330, 437, 330,
+ 328, 354, 335, 331, 335, 287, 330, 331, 437, 1838,
+ 330, 335, 0, 961, 584, 335, 584, 422, 1838, 422,
+ 287, 961, 961, 331, 330, 437, 422, 584, 0, 335,
+ 422, 287, 288, 288, 437, 288, 288, 288, 288, 288,
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 331,
+ 330, 422, 336, 288, 336, 335, 0, 340, 342, 340,
+ 342, 336, 540, 989, 989, 336, 340, 342, 991, 991,
+ 340, 342, 336, 992, 992, 288, 343, 422, 343, 494,
+
+ 288, 293, 293, 293, 293, 343, 0, 340, 540, 343,
+ 293, 342, 993, 993, 293, 344, 494, 344, 541, 336,
+ 293, 349, 293, 349, 344, 293, 494, 0, 344, 293,
+ 349, 343, 293, 340, 349, 293, 293, 342, 470, 344,
+ 470, 348, 494, 348, 541, 542, 510, 293, 349, 293,
+ 348, 345, 293, 345, 348, 293, 0, 343, 293, 348,
+ 345, 293, 293, 338, 345, 338, 344, 0, 510, 470,
+ 512, 542, 338, 512, 349, 345, 350, 350, 350, 338,
+ 338, 338, 338, 338, 0, 350, 348, 338, 350, 350,
+ 2251, 338, 2251, 338, 510, 470, 338, 338, 338, 507,
+
+ 512, 338, 345, 346, 0, 346, 338, 338, 338, 338,
+ 338, 509, 346, 555, 338, 507, 346, 338, 509, 338,
+ 0, 516, 338, 338, 338, 346, 347, 338, 347, 351,
+ 514, 351, 346, 996, 996, 347, 346, 514, 351, 347,
+ 555, 507, 351, 516, 352, 509, 352, 353, 0, 353,
+ 347, 556, 346, 352, 997, 997, 353, 352, 346, 351,
+ 353, 355, 346, 355, 514, 508, 356, 511, 356, 516,
+ 355, 365, 352, 365, 355, 356, 0, 347, 556, 356,
+ 365, 508, 353, 511, 365, 351, 0, 358, 358, 358,
+ 356, 365, 0, 360, 355, 360, 358, 559, 352, 358,
+
+ 358, 362, 360, 362, 431, 0, 360, 508, 353, 511,
+ 362, 431, 431, 467, 362, 467, 0, 356, 365, 362,
+ 355, 359, 467, 359, 559, 467, 360, 363, 363, 363,
+ 359, 431, 359, 359, 359, 359, 363, 431, 431, 363,
+ 363, 364, 359, 364, 0, 561, 362, 366, 366, 366,
+ 364, 513, 360, 599, 364, 359, 366, 543, 0, 366,
+ 366, 367, 367, 367, 998, 998, 369, 513, 369, 359,
+ 367, 364, 561, 367, 367, 369, 370, 523, 370, 369,
+ 599, 359, 371, 543, 371, 370, 369, 515, 0, 370,
+ 373, 371, 373, 513, 515, 371, 370, 364, 523, 373,
+
+ 0, 544, 371, 1000, 1000, 374, 374, 374, 0, 382,
+ 373, 382, 545, 369, 374, 546, 0, 374, 382, 1001,
+ 1001, 515, 382, 370, 523, 374, 385, 544, 385, 371,
+ 372, 372, 372, 372, 383, 385, 383, 373, 545, 385,
+ 384, 546, 384, 383, 0, 382, 428, 383, 549, 384,
+ 524, 372, 374, 384, 372, 383, 0, 428, 372, 385,
+ 428, 372, 552, 383, 372, 372, 386, 387, 386, 387,
+ 384, 382, 524, 428, 549, 386, 387, 553, 372, 386,
+ 387, 372, 383, 428, 372, 385, 428, 372, 552, 383,
+ 372, 372, 379, 379, 379, 379, 384, 405, 524, 405,
+
+ 1002, 1002, 386, 553, 557, 0, 405, 387, 405, 405,
+ 405, 405, 413, 379, 413, 527, 379, 527, 1016, 1016,
+ 379, 413, 412, 379, 412, 413, 379, 379, 386, 558,
+ 557, 412, 414, 387, 414, 412, 413, 595, 412, 595,
+ 379, 414, 527, 379, 527, 414, 379, 0, 417, 379,
+ 417, 414, 379, 379, 579, 558, 601, 417, 418, 418,
+ 418, 417, 580, 413, 597, 412, 417, 418, 595, 0,
+ 418, 418, 419, 420, 419, 420, 1020, 1020, 414, 598,
+ 579, 419, 420, 601, 0, 419, 420, 421, 580, 421,
+ 597, 610, 419, 417, 595, 429, 421, 420, 0, 429,
+
+ 421, 423, 424, 423, 424, 598, 785, 785, 785, 429,
+ 423, 424, 1041, 1041, 423, 424, 0, 421, 610, 419,
+ 600, 423, 429, 0, 420, 602, 429, 438, 438, 438,
+ 0, 424, 439, 439, 439, 429, 438, 0, 489, 438,
+ 438, 439, 489, 421, 439, 439, 600, 440, 423, 440,
+ 441, 602, 441, 442, 528, 442, 440, 424, 528, 441,
+ 440, 648, 442, 441, 623, 489, 442, 623, 1908, 489,
+ 443, 442, 443, 444, 441, 444, 440, 1908, 445, 443,
+ 445, 528, 444, 443, 617, 528, 444, 445, 648, 618,
+ 0, 445, 0, 444, 623, 446, 596, 446, 442, 596,
+
+ 626, 441, 440, 443, 446, 447, 617, 447, 446, 0,
+ 448, 618, 448, 445, 447, 449, 446, 449, 447, 448,
+ 444, 626, 596, 448, 449, 596, 448, 628, 449, 443,
+ 628, 451, 617, 451, 447, 449, 450, 618, 450, 445,
+ 451, 620, 622, 446, 451, 450, 452, 626, 452, 450,
+ 0, 451, 620, 448, 453, 452, 453, 628, 0, 452,
+ 447, 0, 449, 453, 622, 450, 452, 453, 454, 0,
+ 454, 519, 0, 519, 455, 659, 455, 454, 451, 620,
+ 519, 454, 519, 455, 454, 627, 456, 455, 456, 453,
+ 622, 450, 455, 452, 660, 456, 461, 456, 461, 627,
+
+ 0, 457, 659, 457, 462, 461, 462, 456, 0, 461,
+ 457, 454, 457, 462, 463, 453, 463, 462, 657, 455,
+ 456, 660, 457, 463, 464, 627, 464, 463, 607, 465,
+ 606, 465, 461, 464, 456, 457, 658, 464, 465, 0,
+ 462, 466, 465, 466, 657, 606, 456, 607, 463, 457,
+ 466, 471, 471, 471, 466, 607, 663, 606, 461, 464,
+ 471, 457, 658, 471, 471, 465, 462, 639, 472, 472,
+ 472, 606, 631, 607, 463, 1972, 466, 472, 639, 631,
+ 472, 472, 491, 663, 1972, 464, 473, 473, 473, 491,
+ 491, 465, 487, 487, 487, 473, 619, 0, 473, 473,
+
+ 0, 487, 466, 493, 487, 639, 631, 493, 495, 491,
+ 495, 496, 487, 496, 0, 491, 491, 495, 0, 493,
+ 496, 495, 619, 497, 496, 497, 548, 548, 548, 629,
+ 493, 498, 497, 498, 493, 548, 497, 495, 548, 487,
+ 498, 499, 497, 499, 498, 493, 496, 500, 619, 500,
+ 499, 629, 666, 520, 499, 520, 500, 529, 499, 529,
+ 500, 498, 520, 495, 520, 531, 529, 531, 0, 497,
+ 529, 624, 496, 530, 531, 530, 0, 629, 500, 666,
+ 0, 532, 530, 532, 531, 499, 530, 498, 630, 530,
+ 532, 624, 529, 533, 532, 533, 534, 532, 534, 0,
+
+ 672, 535, 533, 535, 500, 534, 533, 661, 630, 534,
+ 535, 531, 0, 536, 535, 536, 530, 624, 529, 1042,
+ 1042, 673, 536, 537, 532, 537, 536, 672, 533, 0,
+ 535, 536, 537, 661, 630, 534, 537, 538, 609, 538,
+ 539, 609, 539, 551, 551, 551, 538, 537, 673, 539,
+ 538, 0, 551, 539, 533, 551, 535, 0, 536, 560,
+ 562, 534, 562, 560, 609, 0, 674, 609, 563, 562,
+ 563, 0, 643, 562, 537, 539, 562, 563, 564, 643,
+ 564, 563, 643, 567, 643, 567, 560, 564, 0, 696,
+ 560, 564, 567, 674, 644, 565, 567, 565, 563, 662,
+
+ 711, 539, 564, 562, 565, 566, 664, 566, 565, 621,
+ 568, 621, 568, 644, 566, 565, 696, 0, 566, 568,
+ 0, 644, 621, 568, 563, 662, 568, 711, 569, 564,
+ 569, 570, 664, 570, 571, 571, 571, 569, 566, 644,
+ 570, 569, 565, 571, 570, 608, 571, 571, 0, 712,
+ 572, 2041, 572, 568, 608, 786, 786, 786, 570, 572,
+ 2041, 668, 569, 572, 566, 573, 572, 573, 574, 669,
+ 574, 0, 608, 577, 573, 577, 712, 574, 573, 670,
+ 608, 574, 577, 575, 570, 575, 577, 668, 569, 576,
+ 671, 576, 575, 572, 713, 669, 575, 583, 576, 583,
+
+ 573, 574, 576, 575, 0, 670, 583, 1043, 1043, 583,
+ 586, 583, 586, 1045, 1045, 714, 671, 576, 583, 586,
+ 585, 713, 585, 586, 675, 0, 573, 574, 716, 585,
+ 575, 583, 585, 585, 585, 587, 718, 587, 588, 586,
+ 588, 585, 714, 576, 587, 583, 0, 588, 587, 676,
+ 675, 588, 587, 0, 585, 716, 0, 583, 589, 589,
+ 589, 677, 588, 718, 590, 586, 590, 589, 585, 678,
+ 589, 589, 591, 590, 591, 676, 695, 590, 715, 587,
+ 585, 591, 594, 717, 594, 591, 722, 677, 611, 588,
+ 611, 594, 719, 767, 594, 678, 594, 611, 612, 590,
+
+ 612, 611, 695, 594, 715, 2108, 611, 612, 613, 717,
+ 613, 612, 722, 614, 2108, 614, 594, 613, 612, 719,
+ 767, 613, 614, 759, 0, 590, 614, 615, 729, 615,
+ 594, 729, 684, 611, 684, 614, 615, 616, 2120, 616,
+ 615, 684, 594, 0, 613, 612, 616, 2120, 645, 759,
+ 616, 637, 625, 637, 625, 768, 632, 616, 729, 735,
+ 615, 625, 614, 632, 637, 625, 632, 632, 632, 638,
+ 613, 645, 685, 735, 685, 645, 638, 765, 640, 638,
+ 638, 638, 768, 0, 616, 640, 615, 0, 640, 640,
+ 640, 646, 647, 646, 647, 721, 685, 645, 0, 735,
+
+ 646, 647, 685, 765, 646, 647, 649, 646, 649, 721,
+ 734, 646, 650, 734, 650, 649, 840, 0, 840, 649,
+ 0, 650, 721, 685, 652, 650, 652, 647, 685, 840,
+ 1048, 1048, 650, 652, 646, 721, 0, 652, 646, 730,
+ 734, 649, 654, 655, 654, 655, 730, 653, 656, 653,
+ 656, 654, 655, 647, 0, 654, 653, 656, 652, 650,
+ 653, 656, 749, 653, 656, 739, 2167, 649, 651, 667,
+ 651, 667, 654, 730, 655, 2167, 739, 651, 0, 651,
+ 651, 651, 651, 679, 652, 679, 749, 741, 667, 651,
+ 653, 656, 679, 667, 0, 680, 679, 680, 654, 745,
+
+ 655, 741, 651, 739, 680, 681, 745, 681, 680, 745,
+ 679, 745, 749, 0, 681, 667, 651, 737, 681, 737,
+ 667, 682, 682, 682, 680, 0, 737, 741, 651, 686,
+ 682, 686, 0, 682, 682, 687, 679, 687, 686, 742,
+ 681, 732, 686, 690, 687, 690, 742, 686, 687, 0,
+ 680, 689, 690, 689, 0, 691, 690, 691, 732, 687,
+ 689, 1050, 1050, 689, 691, 0, 681, 683, 691, 683,
+ 690, 769, 0, 742, 686, 691, 683, 0, 683, 683,
+ 683, 683, 689, 774, 732, 692, 687, 692, 683, 733,
+ 693, 733, 693, 0, 692, 777, 690, 769, 692, 693,
+
+ 781, 683, 691, 693, 694, 694, 694, 754, 689, 774,
+ 697, 754, 697, 694, 0, 683, 694, 694, 0, 697,
+ 733, 777, 697, 705, 697, 705, 781, 683, 688, 771,
+ 688, 697, 705, 701, 754, 701, 705, 688, 754, 688,
+ 688, 688, 688, 700, 697, 700, 733, 772, 702, 688,
+ 702, 778, 700, 700, 701, 700, 771, 700, 697, 882,
+ 705, 882, 688, 779, 700, 780, 703, 701, 703, 702,
+ 697, 2173, 882, 784, 772, 703, 688, 700, 778, 703,
+ 2173, 701, 702, 794, 703, 704, 705, 704, 688, 787,
+ 779, 700, 780, 701, 704, 0, 702, 706, 704, 706,
+
+ 784, 0, 788, 700, 789, 707, 706, 707, 702, 794,
+ 706, 703, 795, 710, 707, 710, 787, 707, 704, 707,
+ 0, 706, 710, 710, 798, 710, 707, 710, 723, 788,
+ 723, 789, 802, 724, 710, 724, 803, 723, 795, 707,
+ 2241, 723, 724, 725, 704, 725, 724, 710, 706, 2241,
+ 798, 828, 725, 707, 812, 812, 725, 887, 726, 802,
+ 726, 710, 803, 723, 829, 707, 724, 726, 743, 0,
+ 725, 726, 830, 710, 720, 743, 720, 828, 743, 743,
+ 743, 812, 862, 720, 887, 720, 720, 862, 720, 723,
+ 829, 726, 724, 831, 720, 720, 725, 727, 830, 727,
+
+ 728, 728, 728, 728, 0, 832, 727, 812, 720, 728,
+ 727, 1056, 1056, 728, 862, 0, 738, 726, 738, 831,
+ 0, 720, 720, 833, 731, 834, 731, 727, 0, 845,
+ 736, 832, 736, 731, 720, 731, 731, 731, 731, 736,
+ 738, 736, 736, 736, 736, 740, 738, 740, 0, 833,
+ 0, 834, 0, 727, 740, 845, 740, 740, 740, 740,
+ 856, 860, 854, 744, 871, 1057, 1057, 738, 0, 748,
+ 744, 871, 738, 744, 744, 744, 748, 748, 750, 748,
+ 2292, 748, 854, 0, 753, 750, 856, 860, 750, 2292,
+ 750, 753, 753, 755, 753, 755, 753, 756, 871, 756,
+
+ 813, 813, 755, 0, 755, 755, 756, 755, 854, 755,
+ 756, 757, 757, 757, 756, 835, 835, 835, 835, 758,
+ 757, 758, 0, 757, 757, 0, 861, 813, 758, 760,
+ 757, 760, 758, 892, 0, 761, 755, 761, 760, 758,
+ 0, 756, 760, 0, 761, 760, 836, 0, 761, 762,
+ 762, 762, 861, 813, 763, 0, 763, 757, 762, 836,
+ 892, 762, 762, 763, 1063, 1063, 758, 763, 761, 764,
+ 864, 764, 760, 836, 766, 894, 766, 0, 764, 790,
+ 0, 790, 764, 766, 776, 836, 776, 766, 790, 763,
+ 864, 791, 790, 791, 761, 0, 895, 792, 764, 792,
+
+ 791, 766, 894, 776, 791, 0, 792, 793, 776, 793,
+ 792, 0, 796, 853, 796, 763, 864, 853, 826, 826,
+ 797, 796, 797, 895, 764, 796, 792, 766, 0, 797,
+ 776, 793, 796, 797, 799, 776, 799, 793, 797, 801,
+ 800, 801, 800, 799, 853, 826, 0, 799, 801, 800,
+ 898, 801, 792, 800, 897, 897, 897, 899, 793, 796,
+ 804, 0, 804, 793, 0, 797, 806, 0, 806, 804,
+ 804, 826, 804, 800, 804, 806, 806, 898, 806, 0,
+ 806, 804, 808, 899, 808, 903, 902, 806, 809, 0,
+ 809, 808, 808, 814, 804, 814, 0, 809, 809, 800,
+
+ 806, 855, 814, 808, 904, 842, 814, 905, 804, 809,
+ 815, 903, 815, 902, 806, 857, 808, 855, 0, 815,
+ 804, 842, 809, 815, 913, 816, 806, 816, 814, 857,
+ 808, 904, 842, 905, 816, 0, 809, 0, 816, 916,
+ 815, 952, 808, 855, 817, 816, 817, 842, 809, 818,
+ 913, 818, 918, 817, 814, 857, 0, 817, 818, 818,
+ 0, 818, 846, 818, 846, 916, 815, 820, 952, 820,
+ 818, 846, 816, 817, 919, 846, 820, 820, 918, 820,
+ 843, 820, 822, 818, 822, 823, 846, 823, 820, 1064,
+ 1064, 822, 822, 953, 823, 823, 843, 818, 0, 817,
+
+ 919, 820, 0, 822, 827, 827, 823, 843, 847, 818,
+ 847, 1065, 1065, 846, 0, 820, 822, 847, 958, 823,
+ 953, 847, 843, 900, 900, 900, 837, 820, 837, 847,
+ 822, 827, 838, 823, 838, 837, 0, 837, 901, 901,
+ 901, 838, 822, 838, 958, 823, 884, 837, 884, 844,
+ 844, 844, 0, 838, 0, 884, 847, 827, 844, 884,
+ 837, 844, 848, 849, 848, 849, 838, 0, 850, 844,
+ 850, 848, 849, 884, 837, 848, 849, 850, 954, 849,
+ 838, 850, 848, 1067, 1067, 891, 837, 891, 851, 851,
+ 851, 851, 838, 859, 891, 859, 844, 851, 891, 884,
+
+ 858, 906, 906, 906, 850, 954, 849, 858, 863, 848,
+ 858, 858, 858, 0, 865, 863, 962, 859, 863, 863,
+ 863, 865, 865, 859, 865, 867, 865, 896, 878, 896,
+ 850, 872, 867, 867, 955, 867, 0, 867, 872, 872,
+ 874, 872, 962, 872, 859, 878, 896, 874, 874, 859,
+ 874, 879, 874, 879, 880, 878, 880, 885, 885, 885,
+ 879, 955, 879, 880, 0, 880, 885, 1070, 1070, 885,
+ 885, 878, 886, 896, 886, 888, 888, 888, 1072, 1072,
+ 890, 886, 890, 0, 888, 886, 963, 888, 888, 890,
+ 893, 886, 893, 890, 907, 907, 907, 926, 926, 893,
+
+ 890, 0, 956, 893, 908, 908, 908, 909, 910, 909,
+ 910, 957, 963, 911, 0, 911, 909, 910, 886, 889,
+ 0, 889, 911, 0, 926, 0, 911, 890, 889, 956,
+ 889, 889, 889, 889, 912, 0, 912, 910, 957, 915,
+ 889, 915, 0, 911, 912, 914, 914, 914, 915, 967,
+ 926, 967, 915, 889, 914, 971, 0, 914, 914, 917,
+ 0, 917, 967, 910, 912, 932, 932, 889, 917, 911,
+ 0, 921, 917, 921, 922, 0, 922, 927, 927, 889,
+ 921, 921, 971, 922, 922, 932, 933, 933, 964, 924,
+ 912, 924, 921, 978, 933, 922, 964, 964, 924, 924,
+
+ 934, 924, 934, 924, 927, 921, 965, 978, 922, 934,
+ 924, 932, 981, 934, 965, 965, 935, 0, 935, 921,
+ 0, 933, 922, 924, 934, 935, 931, 0, 931, 935,
+ 927, 921, 0, 978, 922, 931, 931, 924, 931, 981,
+ 931, 936, 0, 936, 937, 0, 937, 931, 0, 924,
+ 936, 934, 935, 937, 936, 984, 939, 937, 939, 940,
+ 931, 940, 1078, 1078, 937, 939, 939, 0, 940, 940,
+ 0, 944, 944, 1021, 931, 945, 945, 939, 935, 1023,
+ 940, 984, 1079, 1079, 1025, 970, 931, 942, 970, 942,
+ 939, 937, 0, 940, 950, 950, 942, 942, 944, 942,
+
+ 1021, 942, 945, 983, 939, 983, 1023, 940, 942, 951,
+ 951, 1025, 970, 983, 950, 970, 939, 951, 1005, 940,
+ 949, 942, 949, 1022, 944, 0, 1005, 1005, 945, 949,
+ 949, 0, 949, 983, 949, 942, 959, 959, 959, 959,
+ 950, 949, 0, 969, 951, 959, 1027, 942, 966, 1022,
+ 966, 1009, 969, 1009, 949, 1114, 1114, 966, 1006, 983,
+ 966, 0, 966, 968, 1009, 968, 1006, 1006, 949, 966,
+ 969, 0, 968, 1027, 0, 968, 968, 968, 969, 0,
+ 949, 960, 966, 960, 968, 974, 974, 974, 974, 0,
+ 960, 1007, 960, 960, 974, 960, 966, 968, 974, 1007,
+
+ 1007, 960, 960, 972, 973, 972, 973, 1024, 966, 1024,
+ 1026, 968, 972, 973, 1032, 960, 972, 973, 0, 1028,
+ 973, 1029, 975, 968, 975, 976, 1024, 976, 960, 960,
+ 1019, 975, 1019, 972, 976, 975, 1026, 0, 976, 1019,
+ 1032, 960, 977, 977, 977, 977, 1028, 973, 1029, 980,
+ 975, 980, 979, 1024, 979, 977, 1036, 0, 980, 972,
+ 976, 979, 980, 979, 979, 979, 979, 982, 1031, 1031,
+ 1031, 1038, 0, 985, 982, 1039, 975, 982, 982, 982,
+ 985, 986, 1036, 985, 985, 985, 976, 990, 986, 1117,
+ 1117, 986, 986, 986, 990, 990, 994, 990, 1038, 990,
+
+ 995, 0, 1039, 994, 994, 1091, 994, 995, 994, 999,
+ 995, 995, 995, 1091, 1091, 1003, 999, 999, 0, 999,
+ 1040, 999, 1003, 1003, 0, 1003, 0, 1003, 1004, 1004,
+ 0, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004,
+ 1004, 1004, 1004, 1004, 1004, 1008, 1040, 1083, 1037, 1010,
+ 1037, 1082, 1008, 1053, 1053, 1008, 1010, 1008, 1037, 1010,
+ 1010, 1010, 0, 1011, 0, 1011, 1012, 1012, 1012, 1123,
+ 1123, 1004, 1011, 1053, 1083, 1012, 1011, 1082, 1012, 1012,
+ 1013, 1013, 1013, 1011, 1014, 1015, 1014, 1015, 1017, 1013,
+ 1017, 1084, 1013, 1014, 1015, 1014, 1015, 1017, 1034, 1053,
+
+ 1034, 1017, 1018, 1018, 1018, 1014, 1015, 1033, 1034, 1033,
+ 1011, 1018, 1087, 0, 1018, 1018, 1033, 1084, 1014, 1015,
+ 1033, 1046, 0, 1046, 1085, 1044, 0, 1044, 1034, 0,
+ 1046, 1046, 1014, 1015, 1044, 1044, 1033, 1044, 1087, 1044,
+ 1051, 1051, 1046, 0, 1014, 1015, 1044, 0, 1052, 1052,
+ 0, 1085, 1054, 1054, 1034, 1046, 1047, 1094, 1047, 1044,
+ 1054, 0, 1033, 1088, 0, 1047, 1047, 1051, 0, 1046,
+ 1059, 1059, 1093, 1044, 1049, 1052, 1049, 1047, 1118, 1124,
+ 1124, 1046, 0, 1049, 1094, 1044, 1049, 1054, 1049, 1088,
+ 1047, 1058, 1058, 1051, 1059, 1049, 0, 1055, 1093, 1055,
+
+ 1058, 1052, 1073, 1073, 1047, 1118, 1055, 1055, 1049, 1055,
+ 1060, 1055, 1060, 1081, 1081, 1061, 1047, 1061, 1055, 1060,
+ 1059, 0, 1049, 1060, 1061, 1076, 1076, 1058, 1061, 1073,
+ 1062, 1055, 1062, 1076, 1049, 1125, 1125, 1081, 0, 1062,
+ 1060, 1121, 0, 1062, 1066, 1055, 1066, 1074, 1074, 0,
+ 1061, 1127, 1127, 1066, 1066, 1073, 1066, 1055, 1066, 1068,
+ 1076, 1068, 1069, 1081, 1069, 1066, 1060, 1121, 1068, 1068,
+ 0, 1069, 1069, 1166, 1074, 1164, 1061, 1071, 1066, 1071,
+ 1068, 1075, 1075, 1069, 1128, 1128, 1071, 1129, 1129, 1071,
+ 1165, 1071, 1066, 1068, 1080, 1080, 1069, 1096, 1071, 1166,
+
+ 1074, 1075, 1164, 1080, 1066, 1096, 1096, 1068, 1132, 1132,
+ 1069, 1071, 1133, 1133, 1077, 0, 1077, 1165, 1099, 1068,
+ 1099, 0, 1069, 1077, 1077, 1071, 1077, 1075, 1077, 1167,
+ 1080, 1086, 1086, 1086, 1086, 1077, 1089, 1071, 1089, 1099,
+ 1169, 1092, 1090, 1092, 1090, 1089, 0, 1089, 1077, 1111,
+ 1092, 1090, 1099, 1090, 1092, 1167, 1111, 1089, 1100, 1095,
+ 1100, 1095, 1077, 1090, 1178, 1120, 1099, 1169, 1095, 0,
+ 1089, 1095, 1120, 1095, 1077, 1120, 1090, 1120, 1099, 1100,
+ 1095, 1134, 1134, 1111, 1089, 1103, 1103, 1103, 1103, 0,
+ 1090, 1178, 1100, 1095, 0, 1104, 1089, 1104, 1108, 1108,
+
+ 1108, 1108, 1090, 1122, 1104, 1122, 1100, 1095, 1104, 1109,
+ 1109, 1109, 1109, 1122, 1106, 1106, 1106, 1106, 1100, 1095,
+ 1098, 1098, 1098, 1106, 1104, 1205, 1105, 1106, 1105, 1098,
+ 1098, 1112, 1098, 1112, 1098, 1105, 1135, 1135, 0, 1105,
+ 1112, 1098, 1112, 1168, 1105, 1110, 1110, 1110, 1110, 0,
+ 1104, 1107, 1205, 1107, 1098, 1136, 1136, 1116, 1110, 1116,
+ 1107, 1113, 0, 1113, 1107, 1115, 1116, 1115, 1098, 1168,
+ 1113, 1105, 1113, 1170, 1115, 1107, 1138, 1138, 1115, 0,
+ 1098, 1101, 1101, 1174, 1101, 1101, 1101, 1101, 1101, 1101,
+ 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1126, 1170,
+
+ 1101, 0, 1107, 1139, 1139, 1126, 1126, 1130, 1126, 1174,
+ 1126, 1140, 1140, 1131, 1130, 0, 1119, 1130, 1119, 1130,
+ 1131, 1131, 0, 1131, 1101, 1131, 1119, 1101, 1102, 1102,
+ 0, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1137, 1119, 1143, 1143, 1141,
+ 1144, 1144, 1137, 1137, 0, 1137, 1141, 1137, 1142, 1141,
+ 1208, 1141, 1102, 1154, 1154, 1142, 1142, 1145, 1142, 1145,
+ 1142, 1102, 1119, 1146, 0, 1146, 1145, 1147, 1145, 1155,
+ 1155, 1148, 1146, 1148, 1146, 1147, 1147, 1208, 1102, 1149,
+ 1148, 1156, 1156, 0, 1148, 1150, 1149, 1152, 1152, 1149,
+
+ 1153, 1149, 1153, 1150, 1150, 1152, 1152, 0, 1152, 1153,
+ 1152, 1210, 1157, 1153, 1157, 0, 1158, 0, 1158, 1159,
+ 1159, 1157, 1161, 1161, 1157, 1158, 1157, 1176, 1160, 1158,
+ 1160, 1162, 1162, 1157, 1171, 1171, 1171, 1160, 1210, 1179,
+ 1160, 1160, 1160, 1173, 1180, 1173, 1157, 1207, 1175, 1160,
+ 1175, 1181, 1181, 1176, 1177, 0, 1177, 1175, 1182, 1182,
+ 1157, 1175, 1160, 1219, 1177, 1179, 1184, 1184, 1175, 1218,
+ 1180, 0, 1157, 1207, 1173, 0, 1160, 1185, 1185, 1186,
+ 1186, 1187, 1187, 1188, 1188, 1190, 1190, 1186, 1160, 1219,
+ 1187, 0, 1189, 0, 1189, 1175, 1218, 1185, 1191, 1191,
+
+ 1173, 1189, 1189, 1192, 1189, 1192, 1189, 1188, 1194, 1194,
+ 0, 1190, 1192, 1189, 1186, 1249, 1192, 1187, 1193, 1191,
+ 1193, 1195, 1195, 1185, 1197, 1197, 1189, 1193, 1198, 1198,
+ 0, 1193, 1192, 1188, 0, 1199, 1199, 1190, 1201, 1201,
+ 1189, 1249, 1193, 1199, 1248, 1191, 1200, 1200, 1198, 1203,
+ 1203, 1202, 1189, 1202, 0, 1200, 1204, 1204, 1192, 1211,
+ 1202, 1202, 1201, 1202, 0, 1202, 1287, 1211, 1211, 1193,
+ 1199, 1248, 1202, 0, 1198, 1203, 0, 1204, 1209, 1209,
+ 1209, 1209, 1200, 1212, 0, 1202, 1213, 0, 1201, 1238,
+ 1238, 1212, 1212, 1287, 1213, 1213, 1214, 0, 1214, 1202,
+
+ 1215, 1203, 1215, 1204, 0, 1214, 1216, 0, 1214, 1215,
+ 1214, 1202, 1288, 1215, 1216, 1216, 1223, 1214, 1226, 1217,
+ 0, 1217, 1239, 1239, 1223, 1223, 1226, 1226, 1217, 0,
+ 1214, 1217, 1217, 1217, 1227, 0, 1224, 1224, 1224, 1288,
+ 1217, 1228, 1227, 1227, 1214, 1224, 1224, 1240, 1240, 1228,
+ 1228, 0, 1229, 1217, 1243, 1243, 1214, 1224, 1245, 1245,
+ 1229, 1229, 1246, 1246, 1225, 1225, 1225, 1217, 1251, 1251,
+ 1224, 1252, 1252, 1225, 1225, 0, 1228, 1254, 1254, 1217,
+ 1220, 1220, 1220, 0, 1224, 1225, 1242, 1229, 1242, 1220,
+ 1220, 1235, 1220, 1235, 1220, 1242, 1224, 0, 1225, 1242,
+
+ 1235, 1220, 1228, 0, 1235, 0, 1234, 1234, 1234, 1234,
+ 1237, 1235, 1225, 1229, 1220, 1234, 1236, 1237, 1236, 1234,
+ 1237, 1237, 1237, 1241, 1225, 1236, 1256, 1256, 1220, 1236,
+ 1241, 1257, 1257, 1241, 1285, 1241, 1293, 1244, 1235, 0,
+ 1220, 1222, 1222, 1222, 1244, 1236, 0, 1244, 1244, 1244,
+ 1222, 1222, 0, 1222, 1247, 1222, 0, 1250, 1264, 1250,
+ 1285, 1247, 1222, 1293, 1247, 1264, 1247, 1250, 1264, 1255,
+ 1264, 1236, 1259, 1259, 1261, 1222, 1255, 1255, 1260, 1255,
+ 0, 1255, 1261, 1261, 1262, 1260, 1260, 1263, 1260, 1222,
+ 1260, 1266, 1262, 1262, 1290, 1263, 1263, 1275, 1275, 1266,
+
+ 1266, 1222, 1230, 1230, 1296, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1265,
+ 1290, 1265, 0, 1267, 1278, 1278, 1279, 1279, 1265, 1298,
+ 1267, 1296, 1265, 1267, 1267, 1267, 1282, 1282, 1230, 1268,
+ 1268, 1284, 1284, 1299, 1299, 1230, 1271, 1268, 1268, 1272,
+ 1268, 1273, 1268, 0, 1271, 1271, 1298, 1272, 1272, 1273,
+ 1273, 1289, 1289, 1289, 1230, 1231, 1231, 1324, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1270, 1270, 1292, 1297, 1291, 0, 1291, 0,
+ 1270, 1270, 0, 1270, 1324, 1270, 1231, 1286, 1286, 1286,
+
+ 1294, 1294, 1294, 0, 1295, 0, 1295, 0, 1231, 1294,
+ 1292, 1297, 1294, 1294, 1295, 1291, 1286, 1301, 1301, 1302,
+ 1302, 0, 1231, 1232, 1232, 1232, 1232, 1232, 1232, 1232,
+ 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232,
+ 1274, 1291, 1274, 1286, 1303, 1303, 1309, 1309, 1277, 1274,
+ 1277, 0, 1274, 1414, 1274, 1232, 1416, 1277, 1277, 0,
+ 1277, 1274, 1277, 1280, 0, 1280, 1232, 1304, 1304, 1277,
+ 1305, 1305, 1280, 1309, 1274, 1280, 1304, 1280, 1306, 1306,
+ 1414, 1232, 1277, 1416, 1280, 1307, 1307, 0, 1274, 1310,
+ 1310, 1310, 1308, 1308, 1305, 1418, 1277, 1280, 1310, 1309,
+
+ 1274, 1310, 1310, 1304, 1306, 1325, 1307, 1308, 1277, 1312,
+ 1312, 1280, 1311, 1311, 1311, 1314, 1314, 1315, 1315, 0,
+ 1305, 1311, 1418, 1280, 1311, 1311, 1316, 1316, 1317, 1317,
+ 1306, 1325, 1307, 0, 1308, 1318, 1318, 1317, 0, 1319,
+ 1319, 1311, 1320, 1320, 1333, 1321, 1321, 1322, 1322, 1323,
+ 1323, 1323, 1323, 1327, 1334, 1358, 1358, 1361, 1361, 1318,
+ 1321, 1327, 1327, 1320, 1317, 1319, 0, 1311, 1330, 1326,
+ 1333, 1326, 1362, 1362, 1322, 0, 1330, 1330, 1326, 0,
+ 1334, 1326, 0, 1326, 1331, 1318, 1335, 1321, 1338, 1320,
+ 1326, 1319, 1331, 1331, 1335, 1335, 1338, 1338, 1340, 1332,
+
+ 1322, 1332, 1368, 1326, 1365, 1365, 1340, 1340, 1332, 1370,
+ 1370, 1332, 0, 1332, 1336, 1336, 1336, 1326, 1341, 0,
+ 1332, 1372, 1372, 1336, 1336, 0, 1341, 1341, 1368, 1326,
+ 1329, 1329, 1329, 1332, 0, 1336, 1337, 1337, 1337, 1329,
+ 1329, 1342, 1329, 0, 1329, 1337, 1337, 1332, 1336, 1342,
+ 1342, 1329, 1343, 1341, 1373, 1373, 1454, 1337, 1344, 1332,
+ 1343, 1343, 1336, 1345, 1329, 0, 1344, 1344, 1374, 1374,
+ 1337, 1345, 1345, 1347, 1336, 0, 1342, 1348, 1329, 1341,
+ 0, 1347, 1347, 1454, 1337, 1348, 1348, 1375, 1375, 0,
+ 1329, 1377, 1377, 1348, 1378, 1378, 1337, 1339, 1339, 1339,
+
+ 0, 1347, 1342, 1379, 1379, 0, 1339, 1339, 1381, 1339,
+ 0, 1339, 1353, 1353, 1353, 1353, 1381, 1381, 1339, 0,
+ 1348, 1353, 0, 1355, 1355, 1355, 1355, 1347, 1356, 1356,
+ 1356, 1339, 1355, 1398, 1398, 1355, 1355, 1356, 0, 1357,
+ 1356, 1356, 1369, 1363, 1369, 1339, 1357, 0, 1356, 1357,
+ 1363, 1357, 1369, 1363, 1360, 1363, 0, 1339, 1346, 1346,
+ 1346, 1360, 1360, 0, 1360, 1384, 1360, 1346, 1346, 0,
+ 1346, 1364, 1346, 1384, 1384, 1356, 0, 1367, 1364, 1346,
+ 0, 1364, 1385, 1364, 1367, 1367, 1380, 1367, 1420, 1367,
+ 1385, 1385, 1346, 1380, 1383, 1383, 1380, 0, 1380, 1401,
+
+ 1401, 1386, 1383, 1383, 0, 1383, 1346, 1383, 1386, 1402,
+ 1402, 1386, 1421, 1386, 1420, 1403, 1403, 1423, 1346, 1349,
+ 1349, 0, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349,
+ 1349, 1349, 1349, 1349, 1349, 1349, 0, 1387, 1421, 1388,
+ 0, 1389, 1403, 1423, 1349, 1387, 1387, 1388, 1388, 1389,
+ 1389, 0, 1390, 1390, 1406, 1406, 1409, 1409, 1391, 0,
+ 1390, 1390, 1349, 1390, 1425, 1390, 1391, 1391, 1403, 1404,
+ 1404, 1349, 1350, 1350, 0, 1350, 1350, 1350, 1350, 1350,
+ 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1392,
+ 1425, 1393, 0, 1394, 1394, 0, 1404, 1392, 1392, 1393,
+
+ 1393, 1394, 1394, 1419, 1394, 1419, 1394, 1411, 1411, 1350,
+ 1412, 1412, 1413, 1413, 0, 1350, 1415, 1415, 1415, 1417,
+ 1417, 1417, 1404, 1426, 1426, 1427, 1427, 1429, 1429, 1430,
+ 1430, 0, 1419, 1440, 1440, 1350, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1422, 1422, 1422, 1434, 1434, 1419, 1438,
+ 0, 1438, 1422, 1441, 1441, 1422, 1443, 1443, 1438, 1444,
+ 1444, 1434, 1501, 1501, 1432, 1432, 1437, 1437, 1470, 1351,
+ 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352,
+ 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1395, 1434, 1395,
+
+ 1432, 0, 1437, 1397, 1470, 1397, 1395, 1395, 0, 1395,
+ 1578, 1395, 1397, 1397, 1352, 1397, 1469, 1397, 1395, 0,
+ 1399, 0, 1399, 1352, 1397, 1400, 1432, 1400, 1437, 1399,
+ 1399, 1395, 1502, 1502, 1400, 1400, 1578, 1397, 0, 1458,
+ 1352, 1399, 0, 1469, 1581, 1395, 1400, 1458, 1458, 1448,
+ 1448, 1397, 1461, 1405, 1399, 1405, 1583, 1395, 0, 1400,
+ 1461, 1461, 1405, 1397, 1448, 1405, 1648, 1405, 1399, 1408,
+ 1581, 1408, 1514, 1400, 1405, 0, 1433, 1433, 1408, 1408,
+ 1399, 1408, 1583, 1408, 1428, 1400, 1428, 1405, 1435, 1435,
+ 1408, 1448, 1648, 1428, 1428, 0, 1428, 1433, 1428, 1514,
+
+ 1431, 1405, 1431, 1408, 0, 1428, 1436, 1436, 0, 1431,
+ 1431, 1462, 1431, 1405, 1431, 1435, 0, 1408, 1428, 1462,
+ 1462, 1431, 1439, 1433, 1439, 1503, 1503, 1436, 0, 1408,
+ 1582, 1439, 1428, 1504, 1431, 1439, 1585, 1442, 1768, 1442,
+ 1504, 1435, 1439, 1504, 1428, 1504, 1442, 1442, 1431, 1442,
+ 1649, 1442, 1445, 1436, 1445, 1446, 1446, 1582, 1442, 0,
+ 1431, 1445, 1445, 1585, 1445, 1768, 1445, 1447, 1447, 1439,
+ 0, 1442, 1769, 1445, 1449, 1449, 1649, 1450, 1450, 1451,
+ 1451, 1446, 1505, 1505, 0, 1442, 1445, 0, 1447, 1452,
+ 1452, 1452, 1452, 1453, 1453, 1453, 1453, 1442, 1450, 1769,
+
+ 1445, 1449, 1511, 1511, 0, 1451, 0, 1446, 0, 1459,
+ 1459, 1459, 1445, 1466, 1447, 1512, 1512, 1463, 1459, 1459,
+ 1464, 1466, 1466, 1770, 1450, 1463, 1463, 1449, 1464, 1464,
+ 1459, 1451, 1455, 1455, 1455, 1513, 1513, 0, 1460, 1460,
+ 1460, 1455, 1455, 1459, 1455, 1689, 1455, 1460, 1460, 1465,
+ 1770, 1465, 1463, 1455, 0, 1464, 1471, 1459, 1465, 1460,
+ 0, 1465, 1836, 1465, 1471, 1471, 1455, 1472, 0, 1459,
+ 1465, 1689, 1460, 1515, 1515, 1472, 1472, 0, 1463, 1473,
+ 1455, 1464, 1475, 1465, 1516, 1516, 1460, 1473, 1473, 1836,
+ 1475, 1475, 1455, 1457, 1457, 1457, 0, 1465, 1460, 1518,
+
+ 1518, 0, 1457, 1457, 1767, 1457, 0, 1457, 1478, 1465,
+ 1476, 1476, 1476, 1480, 1457, 1481, 1478, 1478, 0, 1476,
+ 1476, 1480, 1480, 1481, 1481, 0, 1482, 1457, 1519, 1519,
+ 1767, 1476, 1521, 1521, 1482, 1482, 1835, 1483, 1477, 1477,
+ 1477, 1457, 0, 1486, 1476, 1483, 1483, 1477, 1477, 0,
+ 1481, 1486, 1486, 1457, 1468, 1468, 1468, 1948, 1476, 1477,
+ 0, 1482, 1835, 1468, 1468, 1483, 1468, 0, 1468, 1487,
+ 1476, 1479, 1477, 1479, 0, 1468, 1481, 1487, 1487, 0,
+ 1479, 1489, 1881, 1479, 1948, 1479, 1477, 1482, 1468, 1489,
+ 1489, 1483, 1479, 1522, 1522, 1484, 1524, 1524, 1477, 1525,
+
+ 1525, 1488, 1468, 1484, 1484, 1479, 1548, 1548, 1881, 1488,
+ 1488, 1484, 0, 1489, 1468, 1474, 1474, 1474, 1488, 1479,
+ 1492, 1492, 1492, 1492, 1474, 1474, 1530, 1474, 2001, 1474,
+ 0, 1479, 1551, 1551, 1530, 1530, 1474, 0, 1484, 1489,
+ 1496, 1496, 1496, 1496, 2088, 1488, 1553, 1553, 0, 1474,
+ 1556, 1556, 1531, 1496, 2001, 1497, 1497, 1497, 1497, 1498,
+ 1531, 1531, 0, 1474, 1497, 1532, 1498, 1498, 1497, 1498,
+ 2088, 1498, 1500, 1532, 1532, 1474, 1485, 1485, 1485, 1500,
+ 1500, 0, 1500, 0, 1500, 1485, 1485, 2014, 1485, 2014,
+ 1485, 1507, 1557, 1557, 0, 1533, 2014, 1485, 1507, 1507,
+
+ 1534, 1507, 1533, 1507, 1508, 1533, 0, 1533, 1534, 1534,
+ 1485, 1508, 1508, 1510, 1508, 0, 1508, 1558, 1558, 1517,
+ 1510, 1510, 0, 1510, 1485, 1510, 1517, 1517, 0, 1517,
+ 0, 1517, 1554, 1554, 1565, 1565, 1485, 1490, 1490, 2213,
+ 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490,
+ 1490, 1490, 1490, 1490, 1520, 1568, 1568, 1569, 1569, 1554,
+ 0, 1520, 1520, 1523, 1520, 2213, 1520, 0, 1490, 1526,
+ 1523, 1523, 0, 1523, 1537, 1523, 1526, 1526, 1538, 1526,
+ 1490, 1526, 1537, 1537, 1539, 1554, 1538, 1538, 0, 1561,
+ 1561, 0, 1539, 1539, 1490, 1491, 1491, 1561, 1491, 1491,
+
+ 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491,
+ 1491, 1491, 1527, 1527, 1572, 1572, 1573, 1573, 1574, 1574,
+ 1527, 1527, 2130, 1527, 1561, 1527, 1529, 1529, 0, 1555,
+ 1555, 1491, 1536, 1536, 1529, 1529, 0, 1529, 1491, 1529,
+ 1536, 1536, 1541, 1536, 1542, 1536, 1543, 1575, 1575, 2130,
+ 1541, 1541, 1542, 1542, 1543, 1543, 1555, 1491, 1493, 1493,
+ 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493,
+ 1493, 1493, 0, 1493, 1493, 1540, 1540, 1576, 1576, 0,
+ 1544, 0, 1555, 1540, 1540, 1546, 1540, 1544, 1540, 1547,
+ 1544, 0, 1544, 1546, 1546, 1577, 1577, 1547, 1547, 1586,
+
+ 1586, 1493, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494,
+ 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1545,
+ 1545, 1560, 1560, 1579, 1579, 1579, 0, 1545, 1545, 0,
+ 1545, 0, 1545, 1580, 1580, 1580, 1587, 1587, 1590, 1590,
+ 0, 1560, 1591, 1591, 2335, 1494, 1495, 1495, 1495, 1495,
+ 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495,
+ 1495, 1495, 1495, 1549, 0, 1549, 1550, 1560, 1550, 1594,
+ 1594, 2335, 1549, 1549, 0, 1550, 1550, 1495, 1595, 1595,
+ 0, 1552, 0, 1552, 1549, 1570, 1570, 1550, 0, 1495,
+ 1552, 1552, 0, 1552, 0, 1552, 1559, 1549, 1559, 0,
+
+ 1550, 0, 1552, 1495, 0, 1559, 1559, 1604, 1559, 1604,
+ 1559, 1549, 1570, 0, 1550, 1552, 1604, 1559, 1571, 1571,
+ 1604, 1598, 1598, 1549, 0, 1562, 1550, 1562, 0, 1552,
+ 1559, 1602, 1602, 0, 1562, 1562, 1598, 1562, 1570, 1562,
+ 1564, 1552, 1564, 0, 1559, 1571, 1562, 1605, 1605, 1564,
+ 1564, 1602, 1564, 0, 1564, 1566, 1559, 1566, 1567, 1562,
+ 1567, 1564, 0, 1598, 1566, 1566, 0, 1567, 1567, 1603,
+ 1603, 1571, 0, 1562, 1564, 0, 1566, 1602, 0, 1567,
+ 1606, 1606, 1609, 1609, 1603, 1562, 1596, 1596, 1564, 1566,
+ 1610, 1610, 1567, 1613, 1613, 1588, 0, 1588, 1614, 1614,
+
+ 1564, 1667, 1667, 1566, 1588, 1588, 1567, 1588, 0, 1588,
+ 1589, 1603, 1589, 1596, 0, 1566, 1588, 0, 1567, 1589,
+ 1589, 0, 1589, 0, 1589, 1592, 0, 1592, 1593, 1588,
+ 1593, 1589, 1600, 1600, 1592, 1592, 0, 1593, 1593, 1596,
+ 1597, 1597, 0, 1588, 1589, 0, 1592, 1599, 1599, 1593,
+ 0, 1601, 1601, 1600, 0, 1588, 1668, 1668, 1589, 1592,
+ 1617, 1617, 1593, 0, 1615, 1615, 0, 1597, 1669, 1669,
+ 1589, 1616, 1616, 1592, 1599, 1617, 1593, 1601, 1624, 1600,
+ 1607, 0, 1607, 1671, 1671, 1592, 1624, 1624, 1593, 1607,
+ 1607, 1615, 1607, 1597, 1607, 1608, 0, 1608, 1616, 0,
+
+ 1599, 1607, 1617, 1601, 1608, 1608, 0, 1608, 0, 1608,
+ 1611, 0, 1611, 1612, 1607, 1612, 1608, 1615, 0, 1611,
+ 1611, 0, 1612, 1612, 1616, 1618, 1618, 0, 1607, 1608,
+ 1627, 1611, 1619, 1619, 1612, 0, 1620, 1620, 1627, 1627,
+ 1607, 1622, 1622, 1608, 1611, 1621, 1621, 1612, 1623, 1623,
+ 1623, 1623, 1618, 1619, 0, 1608, 1622, 0, 1611, 1672,
+ 1672, 1612, 1620, 1629, 0, 1621, 1625, 1625, 1625, 0,
+ 1611, 1629, 1629, 1612, 0, 1625, 1625, 0, 1618, 1619,
+ 0, 1630, 0, 1622, 1626, 1626, 1626, 1625, 1620, 1630,
+ 1630, 1621, 0, 1626, 1626, 1631, 1673, 1673, 1632, 0,
+
+ 1625, 1633, 0, 1631, 1631, 1626, 1632, 1632, 0, 1633,
+ 1633, 1634, 0, 1636, 1625, 1637, 1630, 0, 1626, 1634,
+ 1634, 1636, 1636, 1637, 1637, 1641, 1625, 1642, 1642, 1642,
+ 1631, 1637, 1626, 1641, 1641, 0, 1642, 1642, 1678, 1678,
+ 0, 1636, 1630, 1644, 1626, 1628, 1628, 1628, 1642, 1679,
+ 1679, 1644, 1644, 0, 1628, 1628, 1631, 1628, 1637, 1628,
+ 1645, 1642, 1643, 1643, 1643, 1646, 1628, 1636, 1645, 1645,
+ 0, 1643, 1643, 1646, 1646, 1642, 1647, 1680, 1680, 1628,
+ 1650, 0, 1651, 1643, 1647, 1647, 1653, 1642, 1650, 1650,
+ 1651, 1651, 0, 1628, 1653, 1653, 1643, 1681, 1681, 0,
+
+ 1646, 1682, 1682, 0, 1654, 1628, 1635, 1635, 1635, 0,
+ 1643, 1647, 1654, 1654, 0, 1635, 1635, 0, 1635, 0,
+ 1635, 1670, 1643, 1683, 1683, 0, 1646, 1635, 1670, 1670,
+ 1655, 1670, 1654, 1670, 1656, 0, 1659, 1647, 1655, 1655,
+ 1635, 0, 1656, 1656, 1659, 1659, 1655, 0, 1657, 1685,
+ 1685, 1656, 0, 1660, 1635, 0, 1657, 1657, 1654, 1686,
+ 1686, 1660, 1660, 1687, 1687, 0, 1635, 1638, 1638, 1638,
+ 1659, 1690, 1690, 1655, 1691, 1691, 1638, 1638, 1656, 1638,
+ 1657, 1638, 1660, 1664, 1664, 1664, 1664, 0, 1638, 1665,
+ 1665, 1665, 1665, 1694, 1694, 1674, 1659, 1666, 1666, 1666,
+
+ 1666, 1638, 1674, 1674, 1675, 1674, 1657, 1674, 1660, 0,
+ 1666, 1675, 1675, 1677, 1675, 1638, 1675, 1695, 1695, 0,
+ 1677, 1677, 0, 1677, 1684, 1677, 0, 1638, 1640, 1640,
+ 1640, 1684, 1684, 0, 1684, 0, 1684, 1640, 1640, 0,
+ 1640, 0, 1640, 1688, 1696, 1696, 1697, 1697, 0, 1640,
+ 1688, 1688, 0, 1688, 0, 1688, 1692, 1698, 1698, 1699,
+ 1699, 0, 1640, 1692, 1692, 1693, 1692, 0, 1692, 1702,
+ 1702, 1700, 1693, 1693, 0, 1693, 1640, 1693, 1700, 1700,
+ 0, 1700, 0, 1700, 0, 1701, 1703, 1703, 1640, 1658,
+ 1658, 1658, 1701, 1701, 0, 1701, 0, 1701, 1658, 1658,
+
+ 1706, 1658, 0, 1658, 1704, 1704, 1705, 1705, 1706, 1706,
+ 1658, 1707, 0, 1708, 1725, 1725, 1709, 1709, 0, 1707,
+ 1707, 1708, 1708, 1658, 1709, 1709, 1710, 1709, 0, 1709,
+ 1711, 0, 1712, 0, 1710, 1710, 1717, 1658, 1711, 1711,
+ 1712, 1712, 1726, 1726, 1717, 1717, 1727, 1727, 0, 1658,
+ 1661, 1661, 0, 1661, 1661, 1661, 1661, 1661, 1661, 1661,
+ 1661, 1661, 1661, 1661, 1661, 1661, 1661, 0, 1713, 1713,
+ 1729, 1729, 1732, 1732, 1714, 1714, 1713, 1713, 0, 1713,
+ 1661, 1713, 1714, 1714, 0, 1714, 1718, 1714, 1716, 1716,
+ 1734, 1734, 0, 1661, 1718, 1718, 1716, 1716, 0, 1716,
+
+ 0, 1716, 1740, 1740, 1741, 1741, 1661, 1662, 1662, 0,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 0, 1719, 0, 1720, 0, 1721,
+ 0, 1723, 1662, 1719, 1719, 1720, 1720, 1721, 1721, 1723,
+ 1723, 1744, 1744, 1724, 1724, 1747, 1747, 1738, 1738, 0,
+ 1662, 1724, 1724, 0, 1724, 1738, 1724, 1743, 1743, 1662,
+ 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
+ 1663, 1663, 1663, 1663, 1663, 1663, 1663, 0, 1728, 1663,
+ 1728, 1743, 1738, 0, 1730, 0, 1730, 1728, 1728, 0,
+ 1728, 0, 1728, 1730, 1730, 0, 1737, 1737, 0, 1728,
+
+ 1731, 0, 1731, 1663, 0, 1730, 1663, 1743, 0, 1731,
+ 1731, 0, 1728, 1735, 1735, 1733, 1737, 1733, 1730, 1736,
+ 1736, 1731, 1742, 1742, 1733, 0, 1728, 1733, 0, 1733,
+ 0, 1742, 1730, 0, 1731, 0, 1733, 0, 1728, 0,
+ 1735, 0, 1737, 1739, 1730, 1739, 1736, 0, 1731, 1733,
+ 1749, 1749, 1739, 1739, 0, 1739, 0, 1739, 1742, 1745,
+ 1731, 1745, 0, 1733, 1739, 0, 1735, 0, 1745, 1745,
+ 1750, 1750, 1736, 0, 1746, 1733, 1746, 1739, 1751, 1751,
+ 1745, 1752, 1752, 1746, 1746, 1753, 1753, 1754, 1754, 0,
+ 1748, 1739, 1748, 1745, 0, 1746, 0, 1750, 0, 1748,
+
+ 1748, 0, 1748, 1739, 1748, 1751, 0, 1745, 1746, 1756,
+ 1756, 1748, 0, 1757, 1757, 1758, 1758, 0, 1755, 1745,
+ 1755, 1757, 1746, 1750, 1748, 1759, 1759, 1755, 1755, 1756,
+ 1755, 1751, 1755, 0, 1746, 1760, 1760, 0, 1748, 1755,
+ 1761, 1761, 1762, 1762, 1764, 1764, 1765, 1765, 1757, 1772,
+ 1748, 1772, 1755, 1766, 1766, 1756, 1774, 1774, 1772, 1772,
+ 1775, 1775, 1776, 1776, 0, 1773, 1755, 1773, 1777, 1777,
+ 1772, 1780, 1780, 0, 1773, 1773, 1782, 1782, 1755, 1780,
+ 1779, 1779, 1778, 1772, 1778, 0, 1773, 1781, 1781, 1776,
+ 0, 1778, 1778, 0, 1778, 1777, 1778, 1772, 0, 1773,
+
+ 1779, 0, 1782, 1778, 1783, 1783, 1780, 0, 1781, 1772,
+ 1785, 0, 1785, 1773, 0, 1776, 1778, 1784, 1784, 1785,
+ 1785, 1777, 1789, 1789, 1783, 1773, 1779, 0, 1782, 0,
+ 1778, 1787, 1784, 1787, 1781, 1786, 1786, 1788, 0, 1788,
+ 1787, 1787, 1778, 1790, 1790, 0, 1788, 1788, 1791, 1791,
+ 1783, 0, 1787, 1792, 1792, 1786, 1796, 1796, 1788, 1784,
+ 0, 1795, 1795, 1797, 1797, 1787, 0, 1794, 1794, 1795,
+ 0, 1788, 1798, 1798, 1793, 1791, 1793, 1796, 0, 1787,
+ 1792, 1786, 0, 1793, 1793, 1788, 1793, 1794, 1793, 1797,
+ 0, 1787, 1798, 1851, 1851, 1793, 1795, 1788, 0, 1799,
+
+ 1799, 1791, 1800, 1796, 1800, 0, 1792, 0, 1793, 1801,
+ 1801, 1800, 1800, 1794, 1799, 1797, 1802, 0, 1798, 1803,
+ 1852, 1852, 1793, 1804, 1802, 1802, 0, 1803, 1803, 1801,
+ 1806, 1804, 1804, 0, 1793, 1809, 0, 1811, 1806, 1806,
+ 1817, 1799, 0, 1809, 1809, 1811, 1811, 0, 1817, 1817,
+ 1807, 1807, 1807, 1812, 0, 1801, 1805, 1805, 1805, 1807,
+ 1807, 1812, 1812, 1853, 1853, 1805, 1805, 1813, 1805, 0,
+ 1805, 1807, 1808, 1808, 1808, 1813, 1813, 1805, 1855, 1855,
+ 0, 1808, 1808, 1814, 1807, 0, 1818, 1810, 1812, 1810,
+ 1805, 1814, 1814, 1808, 1818, 1818, 1810, 0, 1807, 1810,
+
+ 0, 1810, 1813, 0, 1805, 0, 1808, 0, 1810, 1815,
+ 1807, 1814, 1856, 1856, 1812, 1821, 1805, 1815, 1815, 0,
+ 1808, 1810, 1819, 1821, 1821, 1815, 1857, 1857, 1813, 0,
+ 1819, 1819, 1808, 1824, 0, 1810, 1820, 1814, 0, 1819,
+ 0, 1824, 1824, 0, 1820, 1820, 0, 1810, 1822, 1822,
+ 1822, 1826, 1815, 1816, 1816, 1816, 0, 1822, 1822, 1826,
+ 1826, 0, 1816, 1816, 0, 1816, 1819, 1816, 1820, 1822,
+ 1823, 1823, 1823, 0, 1816, 1827, 0, 1828, 0, 1823,
+ 1823, 1829, 1822, 1827, 1827, 1828, 1828, 1816, 1858, 1829,
+ 1829, 1823, 1860, 1860, 1820, 1858, 1822, 1830, 1858, 0,
+
+ 1858, 1816, 1861, 1861, 1823, 1830, 1830, 1831, 1822, 0,
+ 1827, 1834, 1828, 1816, 1833, 1831, 1831, 1837, 1823, 1834,
+ 1834, 0, 1833, 1833, 0, 1837, 1837, 1834, 1862, 1862,
+ 1823, 1825, 1825, 1825, 1863, 1863, 1827, 0, 1828, 1839,
+ 1825, 1825, 1833, 1825, 0, 1825, 0, 1839, 1839, 1840,
+ 0, 1841, 1825, 1842, 1834, 1864, 1864, 1840, 1840, 1841,
+ 1841, 1842, 1842, 1843, 0, 1825, 0, 1845, 1833, 1844,
+ 1842, 1843, 1843, 0, 1854, 1845, 1845, 1844, 1844, 1825,
+ 1847, 1854, 1854, 0, 1854, 0, 1854, 0, 1847, 1847,
+ 0, 1825, 1832, 1832, 1832, 1843, 1845, 1842, 1866, 1866,
+
+ 1846, 1832, 1832, 1844, 1832, 0, 1832, 0, 1846, 1846,
+ 1867, 1867, 0, 1832, 0, 1847, 1868, 1868, 1870, 1870,
+ 1859, 1843, 1845, 1846, 1871, 1871, 1832, 1859, 1859, 1844,
+ 1859, 0, 1859, 1872, 1872, 1865, 1874, 1874, 1875, 1875,
+ 1832, 1847, 1865, 1865, 0, 1865, 0, 1865, 1876, 1876,
+ 1846, 0, 1832, 1848, 1848, 0, 1848, 1848, 1848, 1848,
+ 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848,
+ 1869, 1879, 1879, 1880, 1880, 0, 1873, 1869, 1869, 0,
+ 1869, 0, 1869, 1873, 1873, 0, 1873, 0, 1873, 1882,
+ 1882, 1883, 1883, 1885, 1885, 0, 1848, 1849, 1849, 0,
+
+ 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849,
+ 1849, 1849, 1849, 1849, 1877, 1886, 1886, 1912, 1912, 1913,
+ 1913, 1877, 1878, 0, 1877, 0, 1877, 1849, 0, 1878,
+ 1878, 1884, 1878, 0, 1878, 1915, 1915, 1887, 1884, 1884,
+ 1849, 1884, 1888, 1884, 1887, 1887, 0, 1887, 0, 1887,
+ 1888, 1888, 0, 1849, 1850, 1850, 1850, 1850, 1850, 1850,
+ 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850,
+ 1850, 1889, 0, 1890, 0, 1850, 1891, 1891, 0, 1889,
+ 1889, 1890, 1890, 1892, 1891, 1891, 1893, 1891, 0, 1891,
+ 1894, 1892, 1892, 1895, 1893, 1893, 0, 1850, 1894, 1894,
+
+ 1895, 1897, 1850, 1895, 1898, 1895, 1896, 1896, 0, 1897,
+ 1897, 0, 1898, 1898, 1896, 1896, 1899, 1896, 1900, 1896,
+ 1901, 0, 1902, 1902, 1899, 1899, 1900, 1900, 1901, 1901,
+ 1902, 1902, 1903, 1902, 1904, 1902, 1905, 0, 1906, 1906,
+ 1903, 1903, 1904, 1904, 1905, 1905, 1906, 1906, 1907, 1906,
+ 1909, 1906, 1910, 0, 1911, 0, 1907, 1907, 1909, 1909,
+ 1910, 1910, 1911, 1911, 1916, 1916, 1917, 1917, 1918, 1918,
+ 1919, 1919, 1921, 1921, 1917, 1922, 1922, 1918, 1920, 0,
+ 1920, 1923, 1923, 0, 1916, 1924, 1924, 1920, 1920, 0,
+ 1920, 0, 1920, 0, 1919, 0, 1922, 0, 1921, 1920,
+
+ 0, 1917, 1925, 1925, 1918, 1927, 1927, 1926, 0, 1926,
+ 1916, 0, 1920, 1930, 1930, 0, 1926, 1926, 0, 1926,
+ 1919, 1926, 1922, 1928, 1921, 1928, 1920, 1929, 1926, 1929,
+ 1932, 1932, 1928, 1928, 1935, 1935, 1929, 1929, 1920, 1933,
+ 1933, 1926, 1934, 1934, 1928, 1938, 1938, 0, 1929, 1939,
+ 1939, 1931, 0, 1931, 1935, 1926, 0, 1928, 1942, 1942,
+ 1931, 1929, 0, 1931, 0, 1931, 1933, 1926, 0, 1934,
+ 0, 1928, 1931, 1936, 1936, 1929, 1941, 1941, 1944, 1944,
+ 1935, 1936, 0, 1928, 1937, 1931, 1937, 1929, 1940, 1940,
+ 1945, 1945, 1933, 1937, 1937, 1934, 1937, 1940, 1937, 1931,
+
+ 1941, 1946, 0, 1946, 0, 1937, 1951, 1951, 1936, 0,
+ 1946, 1931, 0, 1946, 1951, 1946, 1952, 1952, 1937, 1947,
+ 1947, 1947, 1946, 0, 1940, 1952, 1941, 1949, 1949, 1949,
+ 1950, 1950, 1937, 1953, 1953, 1946, 1949, 0, 1956, 1949,
+ 1956, 1951, 1954, 1954, 1937, 1955, 1955, 1956, 1956, 1946,
+ 1950, 0, 1952, 1957, 1957, 0, 1958, 1953, 1958, 0,
+ 1955, 1946, 1954, 1959, 1959, 1958, 1958, 1961, 1961, 1960,
+ 1960, 1962, 1962, 1957, 1959, 1961, 1950, 1964, 1964, 0,
+ 1962, 1963, 1963, 1953, 1970, 1965, 1965, 1955, 1954, 1960,
+ 1967, 1967, 1970, 1970, 1966, 0, 1966, 1964, 0, 1957,
+
+ 1965, 1959, 1961, 1966, 1966, 1963, 0, 1962, 1971, 1968,
+ 1967, 1968, 1973, 1969, 1969, 1960, 1971, 1971, 1968, 1968,
+ 1973, 1973, 0, 1964, 1969, 1974, 0, 1965, 0, 1975,
+ 0, 1963, 1976, 1974, 1974, 1977, 1967, 1975, 1975, 1979,
+ 1976, 1976, 0, 1977, 1977, 1975, 1980, 1979, 1979, 1976,
+ 1981, 1969, 1982, 1974, 1980, 1980, 1983, 0, 1981, 1981,
+ 1982, 1982, 1985, 0, 1983, 1983, 0, 1977, 0, 1988,
+ 1985, 1985, 1975, 1979, 1990, 1980, 1976, 1988, 1988, 1974,
+ 2017, 2017, 1990, 1990, 2018, 2018, 2020, 2020, 1986, 1986,
+ 1986, 2022, 2022, 1977, 1978, 1978, 1978, 1986, 1986, 1979,
+
+ 0, 1980, 0, 1978, 1978, 1991, 1978, 0, 1978, 1986,
+ 1987, 1987, 1987, 1991, 1991, 1978, 2023, 2023, 0, 1987,
+ 1987, 1993, 1986, 0, 1996, 1989, 0, 1989, 1978, 1993,
+ 1993, 1987, 1996, 1996, 1989, 0, 1986, 1989, 0, 1989,
+ 1991, 0, 1978, 1992, 1987, 0, 1989, 0, 1986, 1993,
+ 0, 1992, 1992, 1997, 1978, 1984, 1984, 1984, 1987, 1989,
+ 0, 1997, 1997, 1994, 1984, 1984, 1991, 1984, 0, 1984,
+ 1987, 1994, 1994, 1989, 2021, 1993, 1984, 0, 1992, 1994,
+ 0, 2021, 2021, 1998, 2021, 1989, 2021, 1999, 0, 1984,
+ 2002, 1998, 1998, 2003, 0, 1999, 1999, 0, 2002, 2002,
+
+ 1998, 2003, 2003, 1984, 1992, 2005, 1994, 2024, 2024, 2026,
+ 2026, 0, 2006, 2005, 2005, 1984, 1995, 1995, 1995, 1999,
+ 2006, 2006, 0, 2008, 0, 1995, 1995, 1998, 1995, 0,
+ 1995, 2008, 2008, 2009, 0, 2010, 0, 1995, 2011, 0,
+ 2012, 2009, 2009, 2010, 2010, 1999, 2011, 2011, 2012, 2012,
+ 1995, 2027, 2027, 2025, 2028, 2028, 0, 2008, 2010, 2013,
+ 2025, 2025, 2009, 2025, 1995, 2025, 0, 2013, 2013, 2012,
+ 2031, 2031, 0, 2011, 2032, 2032, 1995, 2004, 2004, 2004,
+ 2033, 2033, 0, 2008, 0, 2010, 2004, 2004, 2009, 2004,
+ 2029, 2004, 0, 2013, 0, 2012, 2030, 2029, 2004, 2011,
+
+ 2029, 0, 2029, 2030, 2030, 0, 2030, 2039, 2030, 2034,
+ 2034, 2004, 2036, 2036, 2037, 2039, 2039, 2061, 2061, 2013,
+ 2038, 2037, 2037, 0, 2037, 2004, 2037, 2038, 2063, 2063,
+ 2038, 0, 2038, 2040, 0, 2042, 0, 2004, 2007, 2007,
+ 2007, 2040, 2040, 2042, 2042, 2043, 2043, 2007, 2007, 0,
+ 2007, 0, 2007, 2043, 2043, 2044, 2043, 2045, 2043, 2007,
+ 2046, 2064, 2064, 2044, 2044, 2045, 2045, 2048, 2046, 2046,
+ 2047, 2047, 2007, 2065, 2065, 2048, 2048, 0, 2047, 2047,
+ 2049, 2047, 2050, 2047, 0, 2051, 2007, 0, 2049, 2049,
+ 2050, 2050, 2051, 2068, 2068, 2051, 0, 2051, 2007, 2015,
+
+ 2015, 0, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015,
+ 2015, 2015, 2015, 2015, 2015, 2015, 2052, 2052, 0, 2068,
+ 2015, 0, 2053, 0, 2052, 2052, 2054, 2052, 2055, 2052,
+ 2053, 2053, 2056, 0, 2054, 2054, 2055, 2055, 2072, 2072,
+ 2056, 2056, 2015, 2067, 2067, 2068, 0, 2015, 2016, 2016,
+ 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
+ 2016, 2016, 2016, 2016, 2016, 2057, 2057, 2067, 2016, 2073,
+ 2073, 2058, 0, 2057, 2057, 2059, 2057, 0, 2057, 2058,
+ 2058, 2060, 2060, 2059, 2059, 2069, 2069, 2066, 2066, 2060,
+ 2060, 2016, 2060, 2067, 2060, 2016, 2066, 2070, 2070, 2071,
+
+ 2071, 2075, 2075, 0, 2076, 2076, 2069, 2077, 2077, 2078,
+ 2078, 0, 2070, 2079, 2079, 2077, 2083, 2083, 2078, 2080,
+ 0, 2080, 0, 2066, 2076, 0, 2071, 0, 2080, 2080,
+ 0, 2080, 2069, 2080, 2081, 2081, 0, 2079, 0, 2070,
+ 2080, 0, 2077, 2082, 2082, 2078, 2085, 2085, 2086, 2086,
+ 2076, 0, 2071, 2080, 2087, 2087, 2089, 2089, 2090, 2090,
+ 2081, 2091, 2091, 2079, 2082, 2089, 0, 2080, 2092, 2092,
+ 0, 2093, 0, 2093, 2094, 2094, 2101, 2101, 0, 2080,
+ 2093, 2093, 2090, 0, 2096, 2096, 2081, 2091, 0, 2092,
+ 2082, 2095, 2089, 2095, 2094, 2096, 2097, 2101, 2097, 0,
+
+ 2095, 2095, 2098, 2098, 0, 2097, 2097, 0, 2090, 2099,
+ 2099, 2098, 0, 2091, 0, 2092, 2100, 2100, 0, 2102,
+ 2094, 2102, 2096, 2101, 2103, 2103, 2105, 2105, 2102, 2102,
+ 2104, 0, 2104, 2099, 2151, 2151, 0, 2105, 2098, 2104,
+ 2104, 2106, 2100, 2106, 2103, 2107, 0, 2109, 0, 2110,
+ 2106, 2106, 2111, 2107, 2107, 2109, 2109, 2110, 2110, 2099,
+ 2111, 2111, 0, 2112, 2105, 2113, 0, 2114, 2100, 2115,
+ 2103, 2112, 2112, 2113, 2113, 2114, 2114, 2115, 2115, 2116,
+ 2112, 2117, 0, 2118, 0, 2119, 0, 2116, 2116, 2117,
+ 2117, 2118, 2118, 2119, 2119, 2121, 0, 2113, 2115, 0,
+
+ 2122, 2114, 2116, 2121, 2121, 2123, 0, 2112, 2122, 2122,
+ 0, 2125, 0, 2123, 2123, 0, 2117, 2124, 0, 2125,
+ 2125, 2123, 0, 2113, 2115, 2124, 2124, 2114, 2122, 2116,
+ 2127, 0, 2131, 0, 2124, 2153, 2153, 2128, 2127, 2127,
+ 2131, 2131, 2117, 2125, 2132, 2128, 2128, 2135, 2123, 2136,
+ 0, 2139, 2132, 2132, 2122, 2135, 2135, 2136, 2136, 2139,
+ 2139, 2124, 2154, 2154, 2127, 2140, 2128, 2155, 2155, 2125,
+ 2126, 2126, 2126, 2140, 2140, 0, 2137, 2137, 2137, 2126,
+ 2126, 0, 2126, 0, 2126, 2137, 2137, 2156, 2156, 0,
+ 2127, 2126, 2128, 2141, 2157, 2157, 0, 2137, 2143, 0,
+
+ 2145, 2141, 2141, 2142, 2126, 0, 2143, 2143, 2145, 2145,
+ 2137, 2142, 2142, 2138, 2138, 2138, 2159, 2159, 2126, 2161,
+ 2161, 2143, 2138, 2138, 2137, 2163, 2163, 0, 2141, 2145,
+ 2126, 2133, 2133, 2133, 2138, 0, 2137, 0, 2142, 0,
+ 2133, 2133, 2144, 2133, 0, 2133, 0, 2138, 2143, 2146,
+ 2144, 2144, 2133, 0, 2141, 2145, 0, 2146, 2146, 0,
+ 2147, 2138, 2148, 0, 2142, 2133, 2164, 2164, 2147, 2147,
+ 2148, 2148, 0, 2138, 2160, 2165, 2165, 2144, 0, 2133,
+ 0, 2160, 2160, 2146, 2160, 2148, 2160, 2166, 2147, 2168,
+ 0, 2133, 2134, 2134, 2134, 2166, 2166, 2168, 2168, 2169,
+
+ 0, 2134, 2134, 2144, 2134, 0, 2134, 2169, 2169, 2146,
+ 2170, 0, 2148, 2134, 2147, 2171, 2184, 2184, 2170, 2170,
+ 2172, 0, 2174, 2171, 2171, 0, 2134, 2176, 2172, 2172,
+ 2174, 2174, 0, 2175, 2175, 2176, 2176, 2185, 2185, 2177,
+ 2134, 2175, 2175, 0, 2175, 0, 2175, 2177, 2177, 2187,
+ 2187, 0, 2134, 2149, 2149, 0, 2149, 2149, 2149, 2149,
+ 2149, 2149, 2149, 2149, 2149, 2149, 2149, 2149, 2149, 2149,
+ 2178, 2178, 2188, 2188, 2196, 2196, 2179, 2179, 2178, 2178,
+ 0, 2178, 2180, 2178, 2179, 2179, 2181, 2179, 0, 2179,
+ 2180, 2180, 2190, 2190, 2181, 2181, 2149, 2150, 2150, 2150,
+
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2182, 0, 2183, 2186, 2190, 2186,
+ 2195, 2195, 2182, 2182, 2183, 2183, 2186, 2186, 0, 2186,
+ 0, 2186, 0, 2189, 2150, 2189, 2191, 2191, 2186, 0,
+ 2150, 0, 2189, 2189, 2190, 2189, 2195, 2189, 2192, 2192,
+ 0, 2186, 2193, 2193, 2189, 2194, 2194, 2191, 2198, 2198,
+ 2150, 2199, 2199, 2192, 0, 2186, 0, 2189, 2200, 2200,
+ 2202, 2202, 2195, 2201, 2201, 0, 2194, 2186, 0, 2193,
+ 0, 2189, 2201, 2191, 2203, 2203, 2204, 2204, 2205, 2205,
+ 2192, 2206, 2206, 2189, 2202, 2207, 2207, 2208, 2208, 2209,
+
+ 2209, 0, 2194, 2205, 0, 2193, 0, 2204, 0, 2201,
+ 2203, 2210, 2210, 2211, 2211, 2212, 2212, 0, 2206, 0,
+ 2202, 2214, 2214, 0, 2215, 2215, 2216, 2216, 2217, 2217,
+ 2205, 2221, 2221, 2204, 2268, 2268, 2203, 2219, 2219, 0,
+ 2218, 2216, 2218, 0, 2206, 2215, 0, 2214, 2219, 2218,
+ 2218, 2220, 0, 2220, 0, 2217, 0, 2221, 2222, 2222,
+ 2220, 2220, 2223, 2223, 2224, 2224, 2269, 2269, 2216, 2226,
+ 2226, 2215, 0, 2214, 0, 2219, 2225, 2223, 2225, 2222,
+ 2226, 2217, 0, 2221, 2228, 2225, 2225, 2227, 0, 2227,
+ 2229, 2224, 2228, 2228, 2231, 0, 2227, 2227, 2229, 2229,
+
+ 2232, 0, 2231, 2231, 2223, 2222, 2235, 2226, 2232, 2232,
+ 2271, 2271, 0, 2234, 2235, 2235, 0, 2224, 2230, 2230,
+ 2230, 2234, 2234, 2272, 2272, 2236, 0, 2230, 2230, 2237,
+ 2230, 0, 2230, 2236, 2236, 2235, 2240, 2237, 2237, 2230,
+ 0, 2238, 2274, 2274, 2240, 2240, 2242, 2234, 2236, 2238,
+ 2238, 2239, 2230, 0, 2242, 2242, 2276, 2276, 0, 2239,
+ 2239, 2235, 0, 2243, 2237, 0, 2230, 0, 2244, 0,
+ 2238, 2243, 2243, 2234, 2246, 2236, 2244, 2244, 2230, 2233,
+ 2233, 2233, 2246, 2246, 0, 2239, 2245, 0, 2233, 2233,
+ 2237, 2233, 0, 2233, 2245, 2245, 2238, 2277, 2277, 2247,
+
+ 2233, 2278, 2278, 2245, 2279, 2279, 2246, 2247, 2247, 2248,
+ 0, 2239, 2249, 2233, 2250, 0, 2254, 2248, 2248, 0,
+ 2249, 2249, 2250, 2250, 2254, 2254, 0, 2233, 2255, 0,
+ 2245, 0, 2246, 2247, 0, 2249, 2255, 2255, 2248, 2233,
+ 2280, 2280, 2252, 2252, 2252, 2253, 2253, 2253, 2256, 2250,
+ 0, 2252, 2252, 0, 2253, 2253, 2256, 2256, 0, 2247,
+ 2257, 0, 2249, 2252, 2248, 2261, 2253, 0, 2257, 2257,
+ 2282, 2282, 2259, 2261, 2261, 2250, 2252, 2262, 0, 2253,
+ 2259, 2259, 0, 2256, 0, 2262, 2262, 0, 2263, 0,
+ 2252, 2283, 2283, 2253, 2261, 2257, 2263, 2263, 2260, 0,
+
+ 2259, 0, 2252, 0, 2264, 2253, 2260, 2260, 0, 2256,
+ 2285, 2262, 2264, 2264, 2260, 0, 2263, 0, 2285, 2285,
+ 2261, 2257, 2258, 2258, 2258, 0, 2259, 2264, 2299, 2299,
+ 0, 2258, 2258, 0, 2258, 0, 2258, 2262, 2265, 2265,
+ 2265, 2260, 2263, 2258, 2266, 2300, 2300, 2265, 2265, 0,
+ 2270, 0, 2266, 2266, 2264, 2286, 2258, 2270, 2270, 2273,
+ 2270, 0, 2270, 2286, 2286, 2288, 2273, 2273, 2281, 2273,
+ 2258, 2273, 2266, 2288, 2288, 2281, 2281, 2284, 2281, 0,
+ 2281, 0, 2258, 2289, 2284, 2284, 2291, 2284, 2293, 2284,
+ 0, 2289, 2289, 0, 2291, 2291, 2293, 2293, 2266, 2267,
+
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2287, 2287, 2303, 2303,
+ 2304, 2304, 2307, 2307, 2287, 2287, 2294, 2287, 2295, 2287,
+ 2290, 2290, 0, 2267, 2294, 2294, 2295, 2295, 2290, 2290,
+ 2296, 2290, 2267, 2290, 2297, 2308, 2308, 0, 2296, 2296,
+ 2309, 2309, 2297, 2297, 2298, 2298, 2310, 2310, 0, 2267,
+ 2317, 2317, 2298, 2298, 2301, 2298, 2301, 2298, 2318, 2318,
+ 2302, 0, 2302, 2301, 2301, 0, 2301, 2309, 2301, 2302,
+ 2302, 0, 2302, 2310, 2302, 2301, 2305, 0, 2305, 2312,
+ 2312, 2302, 2306, 0, 2306, 2305, 2305, 0, 2301, 2311,
+
+ 2311, 2306, 2306, 2309, 2302, 2315, 2315, 2305, 0, 2310,
+ 2313, 2313, 2301, 2306, 2311, 0, 2312, 0, 2302, 0,
+ 2305, 2314, 2314, 0, 2301, 2315, 2306, 0, 2316, 2316,
+ 2302, 2313, 2320, 2320, 2305, 2321, 2321, 2329, 2329, 0,
+ 2306, 2311, 2312, 2316, 2330, 2330, 2305, 2314, 0, 2325,
+ 2325, 2315, 2306, 2319, 0, 2319, 0, 2313, 2323, 2323,
+ 2331, 2331, 2319, 2319, 2325, 2319, 0, 2319, 0, 2322,
+ 2316, 2322, 0, 2314, 2319, 2324, 2324, 0, 2322, 2322,
+ 0, 2322, 0, 2322, 2323, 2326, 2326, 2319, 2327, 2327,
+ 2322, 2325, 2328, 2328, 2332, 2332, 2324, 2333, 2333, 2334,
+
+ 2334, 2319, 0, 2322, 2336, 2336, 2337, 2337, 0, 2327,
+ 2323, 0, 2326, 2319, 0, 2338, 2338, 2322, 2328, 2336,
+ 2342, 2342, 2324, 2339, 2339, 0, 2341, 2341, 0, 2322,
+ 2340, 0, 2340, 2337, 0, 2327, 2338, 0, 2326, 2340,
+ 2340, 2341, 2343, 2343, 2328, 2346, 2336, 2342, 0, 2339,
+ 2344, 2344, 2347, 2346, 2346, 2345, 0, 2345, 2350, 2337,
+ 2347, 2347, 2338, 2343, 2345, 2345, 2350, 2350, 2341, 2351,
+ 0, 2354, 0, 2342, 2355, 2339, 2344, 2351, 2351, 2354,
+ 2354, 0, 2355, 2355, 2358, 2352, 2352, 2352, 2356, 2343,
+ 0, 2357, 2358, 2358, 2352, 2352, 2356, 2356, 0, 2357,
+
+ 2357, 2359, 2344, 2348, 2348, 2348, 2352, 2358, 0, 2359,
+ 2359, 0, 2348, 2348, 0, 2348, 0, 2348, 0, 2352,
+ 2353, 2353, 2353, 2356, 2348, 0, 2357, 2387, 2387, 2353,
+ 2353, 2360, 0, 2352, 2358, 2361, 2359, 2348, 0, 2360,
+ 2360, 2353, 0, 2361, 2361, 2352, 0, 2362, 0, 2356,
+ 2364, 2348, 2357, 0, 2353, 2362, 2362, 0, 2364, 2364,
+ 2360, 0, 2359, 2348, 2349, 2349, 2349, 0, 2353, 2361,
+ 2388, 2388, 0, 2349, 2349, 2362, 2349, 0, 2349, 2363,
+ 2353, 2365, 0, 2367, 0, 2349, 2360, 2363, 2363, 2365,
+ 2365, 2367, 2367, 2391, 2391, 2361, 2368, 0, 2349, 2370,
+
+ 0, 2362, 2363, 0, 2368, 2368, 2371, 2370, 2370, 0,
+ 2373, 0, 2349, 2372, 2371, 2371, 0, 2374, 2373, 2373,
+ 0, 2372, 2372, 0, 2349, 2374, 2374, 2392, 2392, 2363,
+ 2366, 2366, 2366, 2370, 0, 2371, 2372, 2393, 2393, 2366,
+ 2366, 2376, 2366, 0, 2366, 2373, 2374, 2375, 0, 2376,
+ 2376, 2366, 2394, 2394, 0, 2375, 2375, 2395, 2395, 2370,
+ 0, 2371, 0, 2372, 2366, 0, 2377, 2396, 2396, 2376,
+ 0, 2373, 2374, 0, 2377, 2377, 0, 2378, 2366, 2379,
+ 0, 2375, 2377, 2398, 2398, 2378, 2378, 2379, 2379, 2380,
+ 2366, 2369, 2369, 2369, 2378, 2376, 0, 2380, 2380, 0,
+
+ 2369, 2369, 0, 2369, 0, 2369, 2381, 2375, 0, 2377,
+ 0, 2379, 2369, 0, 2381, 2381, 0, 2380, 2382, 2382,
+ 2382, 2378, 2383, 2399, 2399, 2369, 0, 2382, 2382, 2381,
+ 2383, 2383, 2384, 2384, 2384, 0, 2385, 2379, 0, 2369,
+ 0, 2384, 2384, 2380, 2385, 2385, 2401, 2401, 2402, 2402,
+ 2383, 2369, 2389, 2405, 2405, 2385, 2381, 0, 2390, 2389,
+ 2389, 0, 2389, 0, 2389, 2390, 2390, 2397, 2390, 0,
+ 2390, 2406, 2406, 0, 2397, 2397, 2383, 2397, 0, 2397,
+ 2407, 2407, 2385, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
+ 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
+
+ 2400, 2408, 2408, 0, 2386, 0, 2403, 2400, 2400, 0,
+ 2400, 2409, 2400, 2403, 2403, 2404, 2403, 0, 2403, 2409,
+ 2409, 2410, 2404, 2404, 0, 2404, 2386, 2404, 2413, 2410,
+ 2410, 2386, 2411, 2411, 2425, 2425, 2413, 2413, 2412, 2412,
+ 2411, 2411, 0, 2411, 2414, 2411, 2412, 2412, 2415, 2412,
+ 2416, 2412, 2414, 2414, 2417, 0, 2415, 2415, 2416, 2416,
+ 2418, 0, 2417, 2417, 2419, 2419, 2426, 2426, 2418, 2418,
+ 2420, 0, 2419, 2419, 2421, 2419, 0, 2419, 2420, 2420,
+ 2422, 2422, 2421, 2421, 0, 2423, 0, 2423, 2422, 2422,
+ 2424, 2422, 2424, 2422, 2423, 2423, 2427, 2427, 0, 2424,
+
+ 2424, 2428, 2428, 0, 2432, 2432, 2423, 0, 2429, 0,
+ 2429, 2424, 2430, 2430, 2433, 2433, 0, 2429, 2429, 2423,
+ 2429, 0, 2429, 2427, 2424, 2432, 2431, 2431, 2428, 2429,
+ 2438, 2438, 2430, 2423, 2431, 2434, 2434, 0, 2424, 0,
+ 2433, 0, 2429, 2439, 2439, 2423, 0, 2435, 2435, 2427,
+ 2424, 2432, 2442, 2442, 2428, 2434, 2429, 0, 2430, 2437,
+ 2437, 2431, 2435, 2436, 0, 2436, 2433, 0, 2429, 2443,
+ 2443, 0, 2436, 2436, 2440, 0, 2440, 2446, 2446, 2437,
+ 0, 2434, 0, 2440, 2440, 0, 2440, 0, 2440, 2435,
+ 2441, 0, 2441, 2447, 2447, 2440, 2448, 2448, 0, 2441,
+
+ 2441, 0, 2441, 0, 2441, 2437, 0, 2444, 2440, 2444,
+ 2445, 2441, 2445, 2449, 2449, 0, 2444, 2444, 0, 2445,
+ 2445, 0, 2440, 2448, 2441, 2451, 2451, 0, 2444, 2456,
+ 2456, 2445, 2450, 2450, 2440, 2452, 2452, 0, 2441, 0,
+ 2449, 2444, 2453, 2453, 2445, 2454, 2454, 2450, 0, 2448,
+ 2441, 0, 2451, 2459, 2459, 2444, 2452, 0, 2445, 0,
+ 2455, 2455, 2457, 2457, 2457, 2454, 2449, 2444, 2453, 0,
+ 2445, 2458, 2458, 0, 2450, 2455, 2460, 2460, 2451, 2459,
+ 2462, 2462, 2452, 2461, 2461, 2463, 2463, 2464, 2464, 2465,
+ 2465, 2454, 2458, 0, 2453, 0, 2460, 0, 2461, 0,
+
+ 2468, 2462, 2455, 0, 2465, 2459, 0, 2464, 2468, 2468,
+ 0, 2463, 2509, 2509, 2466, 2466, 2466, 0, 2458, 2467,
+ 2467, 2467, 2460, 2466, 2466, 2461, 0, 2462, 2467, 2467,
+ 2469, 2465, 0, 2464, 2470, 2466, 2471, 2463, 2469, 2469,
+ 2467, 2474, 2470, 2470, 2471, 2471, 0, 2473, 2466, 2474,
+ 2474, 2475, 0, 2467, 0, 2473, 2473, 2474, 0, 2475,
+ 2475, 0, 2466, 0, 2477, 2510, 2510, 2467, 2476, 2470,
+ 0, 2471, 2477, 2477, 2466, 2473, 2476, 2476, 2481, 2467,
+ 2475, 2478, 2512, 2512, 2474, 2482, 2481, 2481, 0, 2478,
+ 2478, 0, 2477, 2482, 2482, 2470, 0, 2471, 2472, 2472,
+
+ 2472, 2473, 2476, 0, 2478, 0, 2475, 2472, 2472, 0,
+ 2472, 0, 2472, 2479, 2479, 2479, 2480, 0, 2477, 2472,
+ 0, 2485, 2479, 2479, 2480, 2480, 2486, 0, 2476, 2485,
+ 2485, 2478, 2472, 0, 2486, 2486, 2513, 2513, 0, 2489,
+ 2487, 2487, 2487, 2490, 2480, 0, 2472, 2489, 2489, 2487,
+ 2487, 2490, 2490, 0, 2500, 2488, 2488, 2488, 2472, 2491,
+ 0, 2487, 2500, 2500, 2488, 2488, 0, 2491, 2491, 2492,
+ 2480, 2483, 2483, 2483, 2487, 0, 2488, 2492, 2492, 0,
+ 2483, 2483, 2494, 2483, 0, 2483, 2500, 2493, 2487, 2488,
+ 2494, 2494, 2483, 2495, 2491, 2493, 2493, 0, 2497, 0,
+
+ 2487, 2495, 2495, 2488, 2492, 2483, 2497, 2497, 2516, 2516,
+ 2493, 0, 2500, 2517, 2517, 2488, 2496, 2494, 0, 2483,
+ 2491, 0, 2495, 0, 2496, 2496, 2497, 2501, 2518, 2518,
+ 2492, 2483, 2484, 2484, 2484, 2501, 2501, 2493, 2519, 2519,
+ 0, 2484, 2484, 2494, 2484, 0, 2484, 2498, 2495, 2502,
+ 2496, 2499, 2497, 2484, 0, 2498, 2498, 2502, 2502, 2499,
+ 2499, 2501, 2503, 2503, 2503, 2504, 2484, 0, 2499, 0,
+ 2498, 2503, 2503, 2504, 2504, 0, 2496, 2506, 2502, 0,
+ 2484, 2505, 2505, 2505, 0, 2506, 2506, 2501, 2520, 2520,
+ 2505, 2505, 2484, 2504, 0, 2499, 2506, 2498, 2507, 2507,
+
+ 2507, 0, 2511, 0, 2502, 2521, 2521, 2507, 2507, 2511,
+ 2511, 0, 2511, 2523, 2511, 2546, 2546, 2547, 2547, 2504,
+ 0, 2523, 2523, 2506, 2508, 2508, 2508, 2508, 2508, 2508,
+ 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508,
+ 2508, 2514, 2600, 2600, 2600, 2600, 0, 2515, 2514, 2514,
+ 0, 2514, 2524, 2514, 2515, 2515, 2522, 2515, 0, 2515,
+ 2524, 2524, 0, 2522, 2522, 2526, 2522, 2508, 2522, 2525,
+ 2525, 2537, 2537, 2526, 2526, 2527, 0, 2525, 2525, 2530,
+ 2525, 2531, 2525, 2527, 2527, 2528, 2528, 2530, 2530, 2531,
+ 2531, 2529, 2529, 2528, 2528, 2537, 2528, 2532, 2528, 2529,
+
+ 2529, 2533, 2529, 0, 2529, 2532, 2532, 2534, 2534, 2533,
+ 2533, 2535, 2535, 2536, 2536, 2538, 2538, 2539, 2539, 2535,
+ 0, 2537, 2536, 0, 2540, 0, 2540, 2534, 2541, 2541,
+ 2548, 2548, 2539, 2540, 2540, 2538, 2602, 2602, 2549, 2549,
+ 0, 2542, 0, 2542, 2543, 2543, 2535, 0, 2541, 2536,
+ 2542, 2542, 0, 2534, 2544, 2543, 2544, 2548, 2545, 2539,
+ 2545, 2538, 0, 2544, 2544, 2549, 0, 2545, 2545, 0,
+ 2551, 2551, 2552, 2552, 2541, 2544, 0, 2553, 2553, 2545,
+ 2552, 0, 2543, 2548, 2554, 2554, 0, 2550, 2544, 2550,
+ 2551, 2549, 2545, 2555, 2555, 0, 2550, 2550, 2553, 2550,
+
+ 0, 2550, 2544, 0, 2556, 2556, 2545, 2552, 2550, 0,
+ 2554, 2558, 2558, 2555, 2544, 0, 2551, 0, 2545, 2556,
+ 2557, 2550, 2557, 0, 2553, 2560, 2560, 2561, 2561, 2557,
+ 2557, 2558, 2563, 2563, 0, 2550, 2554, 2603, 2603, 2555,
+ 0, 2562, 2561, 2562, 0, 2560, 2556, 2550, 2564, 2564,
+ 2562, 2562, 2563, 2568, 0, 2565, 2565, 2558, 2569, 2567,
+ 2567, 2568, 2568, 2566, 0, 2566, 2569, 2569, 2564, 2561,
+ 2565, 2560, 2566, 2566, 2569, 2570, 0, 2571, 2563, 2567,
+ 2572, 2568, 0, 2570, 2570, 2571, 2571, 2573, 2572, 2572,
+ 2575, 0, 2570, 0, 2564, 2573, 2573, 2565, 2575, 2575,
+
+ 0, 2569, 2574, 2574, 2574, 2567, 0, 2568, 2572, 2571,
+ 2573, 2574, 2574, 2576, 2576, 2576, 0, 2577, 2575, 2570,
+ 2580, 0, 2576, 2576, 0, 2577, 2577, 0, 2580, 2580,
+ 2578, 2578, 2578, 2581, 2572, 2571, 2577, 2573, 0, 2578,
+ 2578, 2581, 2581, 0, 2575, 2579, 2579, 2579, 2582, 0,
+ 2583, 2578, 2585, 0, 2579, 2579, 2582, 2582, 2583, 2583,
+ 2585, 2585, 2587, 2577, 2578, 2586, 2579, 2588, 0, 0,
+ 2587, 2587, 0, 2586, 2586, 2588, 2588, 0, 2578, 2579,
+ 2585, 2586, 0, 2582, 0, 2583, 0, 2589, 0, 2593,
+ 2578, 2587, 2604, 2579, 0, 2589, 2589, 2593, 2593, 2604,
+
+ 2604, 2588, 2604, 0, 2604, 2579, 2585, 0, 2586, 2582,
+ 2592, 2583, 2584, 2584, 2584, 2589, 0, 2587, 2592, 2592,
+ 2590, 2584, 2584, 2593, 2584, 0, 2584, 2588, 2590, 2590,
+ 2591, 2591, 2591, 2584, 0, 0, 2594, 0, 2592, 2591,
+ 2591, 2589, 2596, 2590, 2594, 2594, 2584, 0, 2595, 2593,
+ 2596, 2596, 2597, 2597, 2597, 0, 2595, 2595, 0, 2598,
+ 2584, 2597, 2597, 0, 2592, 2594, 0, 2598, 2598, 0,
+ 2590, 2595, 2584, 2599, 2599, 2599, 2605, 2596, 2598, 2606,
+ 2608, 2608, 2599, 2599, 2605, 2605, 0, 2606, 2606, 2608,
+ 0, 2594, 0, 2607, 2607, 2609, 2609, 0, 2595, 2610,
+
+ 2610, 2607, 2607, 2596, 2607, 2598, 2607, 2611, 2611, 2613,
+ 2613, 2612, 0, 2612, 2617, 2617, 2608, 0, 0, 2609,
+ 2612, 2612, 2614, 0, 2614, 2610, 2615, 2615, 2611, 2613,
+ 0, 2614, 2614, 2616, 2617, 2616, 0, 2615, 2618, 2618,
+ 2619, 2619, 2616, 2616, 0, 2609, 2618, 2620, 2620, 2619,
+ 0, 2610, 2621, 2621, 2611, 2613, 2623, 0, 2623, 0,
+ 2617, 0, 2622, 2622, 2615, 2623, 2623, 2624, 2624, 2626,
+ 2626, 2620, 2621, 2618, 2628, 2628, 2619, 2622, 0, 2625,
+ 2626, 2625, 2627, 0, 2627, 2630, 2630, 2624, 2625, 2625,
+ 0, 2627, 2627, 2629, 2628, 2629, 2630, 2620, 2621, 2631,
+
+ 0, 2631, 2629, 2629, 2622, 2632, 2632, 2626, 2631, 2631,
+ 2635, 0, 2633, 2624, 2633, 2634, 2634, 0, 2635, 2635,
+ 2628, 2633, 2633, 2630, 2636, 2632, 2634, 2635, 2637, 0,
+ 2638, 0, 2636, 2636, 0, 2640, 2637, 2637, 2638, 2638,
+ 2639, 2639, 2639, 2640, 2640, 0, 0, 0, 0, 2639,
+ 2639, 2632, 2642, 2634, 2635, 0, 2636, 0, 0, 2638,
+ 2642, 2642, 2637, 2640, 2641, 2641, 2641, 2643, 2643, 2643,
+ 2645, 2642, 2644, 2641, 2641, 2646, 2643, 2643, 2645, 2645,
+ 2644, 2644, 2636, 2646, 2646, 2638, 2645, 2648, 2637, 2640,
+ 0, 0, 2646, 2647, 0, 2648, 2648, 2649, 2642, 0,
+
+ 2644, 2647, 2647, 2651, 0, 2649, 2649, 2650, 2650, 2650,
+ 0, 2651, 2651, 2645, 2653, 2648, 2650, 2650, 0, 2646,
+ 2649, 0, 2653, 2653, 0, 2647, 2644, 2652, 2652, 2652,
+ 2654, 2651, 0, 2653, 2655, 0, 2652, 2652, 2654, 2654,
+ 2657, 2648, 2655, 2655, 2660, 2660, 2656, 2649, 2657, 2657,
+ 0, 2647, 0, 2654, 2656, 2656, 0, 2651, 2659, 2659,
+ 2653, 2658, 2658, 2658, 0, 2660, 2661, 2661, 0, 2655,
+ 2658, 2658, 2662, 2662, 2657, 2656, 2663, 0, 2663, 0,
+ 2654, 2661, 2664, 2664, 2659, 2663, 2663, 2665, 0, 2665,
+ 0, 2660, 0, 2664, 0, 2655, 2665, 2665, 0, 2662,
+
+ 2657, 2656, 2666, 2666, 2667, 2667, 2668, 2668, 2661, 0,
+ 2659, 2666, 2669, 2669, 2670, 0, 2670, 2671, 2671, 0,
+ 2664, 0, 0, 2670, 2670, 2662, 2703, 2703, 2667, 2673,
+ 2673, 0, 2668, 2669, 2672, 0, 2672, 2671, 2666, 2674,
+ 2673, 2674, 0, 2672, 2672, 2676, 2676, 2703, 2674, 2674,
+ 0, 2675, 0, 2675, 2667, 2677, 2676, 2677, 2668, 2669,
+ 2675, 2675, 0, 2671, 2677, 2677, 2678, 2673, 2678, 2679,
+ 2679, 0, 2680, 2703, 2680, 2678, 2678, 2681, 0, 2682,
+ 2679, 2680, 2680, 2676, 2684, 2681, 2681, 2682, 2682, 2683,
+ 0, 0, 2684, 2684, 2685, 2685, 2685, 2683, 2683, 0,
+
+ 0, 2686, 0, 2685, 2685, 0, 0, 2679, 2682, 2686,
+ 2686, 2681, 2683, 2687, 2687, 2687, 2688, 0, 2689, 2684,
+ 2686, 2690, 2687, 2687, 2688, 2688, 2689, 2689, 0, 2690,
+ 2690, 0, 2691, 2688, 2682, 0, 0, 2681, 0, 2683,
+ 2691, 2691, 2692, 2692, 2692, 2684, 0, 2686, 0, 2693,
+ 2689, 2692, 2692, 0, 0, 2690, 0, 2693, 2693, 2695,
+ 2688, 2691, 2694, 2694, 2694, 0, 0, 2695, 2695, 0,
+ 0, 2694, 2694, 2696, 2696, 2696, 2689, 2693, 2695, 0,
+ 2697, 2690, 2696, 2696, 2698, 0, 2699, 2691, 2697, 2697,
+ 2702, 2702, 2698, 2698, 2699, 2699, 2701, 2701, 2700, 2704,
+
+ 2704, 2706, 2706, 2693, 0, 2695, 2700, 2700, 0, 2697,
+ 2705, 2701, 2705, 0, 2699, 2707, 2707, 2702, 2698, 2705,
+ 2705, 2700, 2708, 2708, 2710, 2704, 2710, 2706, 2709, 2709,
+ 2711, 2711, 0, 2710, 2710, 2697, 2707, 2708, 2701, 0,
+ 2699, 2711, 0, 2702, 2698, 0, 0, 2712, 2700, 2712,
+ 2713, 2704, 2713, 2706, 0, 2709, 2712, 2712, 2716, 2713,
+ 2713, 2714, 2707, 2714, 2708, 2715, 2716, 2716, 2711, 2717,
+ 2714, 2714, 0, 2715, 2715, 2718, 0, 2717, 2717, 0,
+ 0, 2709, 2720, 2718, 2718, 2719, 2719, 2719, 2715, 0,
+ 2720, 2720, 2721, 2716, 2719, 2719, 2723, 0, 2717, 2722,
+
+ 2721, 2721, 2727, 0, 2723, 2723, 0, 2722, 2722, 2718,
+ 2727, 2727, 0, 0, 0, 2715, 2720, 2732, 2732, 2716,
+ 0, 2721, 2722, 0, 2717, 2725, 0, 2724, 2724, 2724,
+ 2727, 2723, 2728, 2725, 2725, 2718, 2724, 2724, 2733, 2733,
+ 2728, 2728, 2720, 2732, 2725, 2731, 2731, 2721, 0, 2722,
+ 2726, 2726, 2726, 2730, 0, 2728, 2727, 2723, 2733, 2726,
+ 2726, 2730, 2730, 2729, 2729, 2729, 2731, 2736, 2736, 2732,
+ 0, 2725, 2729, 2729, 2734, 2734, 2735, 2735, 2737, 2737,
+ 0, 2730, 2728, 0, 2733, 2738, 2738, 2741, 2739, 2734,
+ 2739, 2735, 2731, 2740, 2736, 2741, 2741, 2739, 2739, 2737,
+
+ 2742, 2740, 2740, 0, 2745, 0, 2743, 2730, 2742, 2742,
+ 0, 2738, 2745, 2745, 2743, 2743, 2734, 0, 2735, 0,
+ 2736, 2741, 2740, 2744, 0, 2737, 2746, 0, 2742, 2743,
+ 0, 2744, 2744, 2747, 2746, 2746, 0, 2738, 0, 2745,
+ 0, 2747, 2747, 2748, 2748, 2748, 2744, 2741, 2740, 2749,
+ 2749, 2749, 2748, 2748, 2742, 2746, 2743, 0, 2749, 2749,
+ 2750, 2751, 2751, 2751, 0, 2745, 2752, 2747, 2750, 2750,
+ 2751, 2751, 0, 2744, 2752, 2752, 2753, 2753, 0, 2754,
+ 2754, 2746, 2755, 0, 2755, 2752, 2756, 2756, 2750, 2757,
+ 2757, 2755, 2755, 2747, 2754, 0, 2753, 2758, 2758, 2759,
+
+ 2759, 2760, 2760, 0, 0, 0, 2756, 0, 0, 2761,
+ 2757, 0, 2752, 0, 2750, 0, 2760, 2761, 2761, 2759,
+ 0, 2754, 2753, 2758, 0, 2762, 0, 0, 0, 2763,
+ 2763, 2763, 2756, 2762, 2762, 0, 2757, 2761, 2763, 2763,
+ 0, 0, 2764, 2760, 2765, 2759, 2766, 0, 2762, 2758,
+ 2764, 2764, 2765, 2765, 2766, 2766, 2767, 0, 2768, 2769,
+ 2769, 2769, 0, 2761, 2767, 2767, 2768, 2768, 2769, 2769,
+ 2764, 2773, 2773, 2765, 2770, 2762, 2771, 2771, 2771, 0,
+ 2766, 2768, 2770, 2770, 2767, 2771, 2771, 0, 2772, 0,
+ 2772, 2773, 2774, 2770, 2774, 0, 2764, 2772, 2772, 2765,
+
+ 0, 2774, 2774, 2775, 2775, 0, 2766, 0, 2768, 0,
+ 2767, 2776, 2776, 2778, 2775, 2778, 0, 2773, 2777, 2777,
+ 2770, 2781, 2778, 2778, 2779, 2779, 2780, 2780, 2780, 2781,
+ 2781, 2776, 0, 2777, 2783, 2780, 2780, 2782, 2782, 2782,
+ 0, 2775, 2783, 2783, 2779, 0, 2782, 2782, 0, 2781,
+ 2784, 2793, 2793, 2783, 2787, 0, 2785, 2776, 2784, 2784,
+ 2777, 0, 2787, 2787, 2785, 2785, 0, 2786, 2786, 2786,
+ 2779, 2793, 0, 0, 0, 2781, 2786, 2786, 2784, 2785,
+ 2783, 0, 2787, 2788, 2788, 2788, 2789, 0, 2789, 2790,
+ 2790, 0, 2788, 2788, 0, 2789, 2789, 2793, 2795, 2795,
+
+ 2790, 2791, 0, 2791, 2784, 2792, 2785, 2792, 2787, 2795,
+ 2791, 2791, 0, 0, 2792, 2792, 2794, 0, 2794, 2796,
+ 2796, 2796, 2797, 0, 0, 2794, 2794, 2790, 2796, 2796,
+ 2797, 2797, 0, 2798, 2798, 2798, 2795, 2799, 2799, 2799,
+ 0, 2797, 2798, 2798, 2800, 0, 2799, 2799, 2801, 2801,
+ 2801, 2802, 2800, 2800, 2803, 0, 2803, 2801, 2801, 2802,
+ 2802, 0, 0, 2803, 2803, 2804, 0, 2804, 2797, 2806,
+ 2802, 2806, 2800, 0, 2804, 2804, 2805, 2805, 2806, 2806,
+ 2807, 2807, 2807, 2808, 2808, 2808, 2809, 2805, 0, 2807,
+ 2807, 0, 2808, 2808, 2809, 2809, 0, 2802, 2800, 2810,
+
+ 2810, 2810, 2811, 0, 2811, 2809, 0, 0, 2810, 2810,
+ 0, 2811, 2811, 0, 2805, 2812, 2812, 2812, 0, 0,
+ 0, 0, 0, 0, 2812, 2812, 0, 0, 0, 0,
+ 0, 0, 2809, 2814, 2814, 2814, 2814, 2814, 2814, 2814,
+ 2814, 2814, 2814, 2814, 2815, 2815, 2815, 2815, 2815, 2815,
+ 2815, 2815, 2815, 2815, 2815, 2816, 2816, 2816, 2816, 2816,
+ 2816, 2816, 2816, 2816, 2816, 2816, 2817, 2817, 2817, 2817,
+ 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2820,
+
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 0, 2823, 2824, 2824, 0, 2824, 2824, 2824, 2824,
+ 2824, 2824, 2824, 2824, 2825, 2825, 2825, 2825, 2825, 2825,
+ 2825, 2825, 2825, 2825, 2825, 2826, 0, 2826, 0, 0,
+ 0, 0, 0, 0, 2826, 2827, 0, 2827, 0, 2827,
+ 0, 2827, 0, 0, 2827, 2828, 2828, 0, 2828, 2828,
+ 2828, 2828, 2828, 2828, 2828, 2828, 2829, 0, 0, 2829,
+
+ 2830, 2830, 0, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
+ 2830, 2831, 0, 0, 2831, 2832, 2832, 0, 2832, 2832,
+ 2832, 2832, 2832, 2832, 2832, 2832, 2833, 2833, 0, 2833,
+ 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2834, 0, 0,
+ 2834, 2835, 2835, 0, 2835, 2835, 2835, 2835, 2835, 2835,
+ 2835, 2835, 2836, 2836, 0, 2836, 2836, 2836, 2836, 2836,
+ 2836, 2836, 2836, 2837, 2837, 2837, 2837, 2837, 2837, 2837,
+ 2837, 2837, 2837, 2837, 2838, 2838, 0, 2838, 2838, 2838,
+ 2838, 2838, 2838, 2838, 2838, 2839, 0, 0, 2839, 2840,
+ 2840, 0, 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840,
+
+ 2841, 0, 0, 2841, 2842, 2842, 0, 2842, 2842, 2842,
+ 2842, 2842, 2842, 2842, 2842, 2843, 0, 0, 2843, 2844,
+ 2844, 0, 2844, 2844, 2844, 2844, 2844, 2844, 2844, 2844,
+ 2845, 0, 0, 2845, 2846, 2846, 0, 2846, 2846, 2846,
+ 2846, 2846, 2846, 2846, 2846, 2847, 2847, 2847, 2847, 2847,
+ 2847, 2847, 2847, 2847, 2847, 2847, 2848, 0, 0, 2848,
+ 2849, 0, 2849, 0, 2849, 0, 2849, 0, 0, 2849,
+ 2850, 2850, 0, 2850, 2850, 2850, 2850, 2850, 2850, 2850,
+ 2850, 2851, 0, 0, 2851, 2852, 0, 0, 2852, 2853,
+ 2853, 0, 2853, 2853, 2853, 2853, 2853, 2853, 2853, 2853,
+
+ 2854, 2854, 0, 2854, 2854, 2854, 2854, 2854, 2854, 2854,
+ 2854, 2855, 0, 0, 2855, 2856, 0, 0, 2856, 2857,
+ 2857, 0, 2857, 2857, 2857, 2857, 2857, 2857, 2857, 2857,
+ 2858, 2858, 0, 2858, 2858, 2858, 2858, 2858, 2858, 2858,
+ 2858, 2859, 2859, 0, 2859, 2859, 2859, 2859, 2859, 2859,
+ 2859, 2859, 2860, 0, 0, 2860, 2861, 0, 0, 2861,
+ 2862, 2862, 0, 2862, 2862, 2862, 2862, 2862, 2862, 2862,
+ 2862, 2863, 2863, 0, 2863, 2863, 2863, 2863, 2863, 2863,
+ 2863, 2863, 2864, 2864, 0, 2864, 2864, 2864, 2864, 2864,
+ 2864, 2864, 2864, 2865, 2865, 2865, 2865, 2865, 2865, 2865,
+
+ 2865, 2865, 2865, 2865, 2866, 2866, 0, 2866, 2866, 2866,
+ 2866, 2866, 2866, 2866, 2866, 2867, 0, 0, 2867, 2868,
+ 0, 0, 2868, 2869, 2869, 0, 2869, 2869, 2869, 2869,
+ 2869, 2869, 2869, 2869, 2870, 2870, 0, 2870, 2870, 2870,
+ 2870, 2870, 2870, 2870, 2870, 2871, 0, 0, 2871, 2872,
+ 0, 0, 2872, 2873, 2873, 0, 2873, 2873, 2873, 2873,
+ 2873, 2873, 2873, 2873, 2874, 2874, 0, 2874, 2874, 2874,
+ 2874, 2874, 2874, 2874, 2874, 2875, 0, 0, 2875, 2876,
+ 0, 0, 2876, 2877, 2877, 0, 2877, 2877, 2877, 2877,
+ 2877, 2877, 2877, 2877, 2878, 2878, 0, 2878, 2878, 2878,
+
+ 2878, 2878, 2878, 2878, 2878, 2879, 0, 0, 2879, 2880,
+ 0, 0, 2880, 2881, 2881, 0, 2881, 2881, 2881, 2881,
+ 2881, 2881, 2881, 2881, 2882, 2882, 0, 2882, 2882, 2882,
+ 2882, 2882, 2882, 2882, 2882, 2883, 2883, 2883, 2883, 2883,
+ 2883, 2883, 2883, 2883, 2883, 2883, 2884, 0, 0, 2884,
+ 2885, 0, 0, 2885, 2886, 0, 2886, 0, 2886, 0,
+ 2886, 0, 0, 2886, 2887, 2887, 0, 2887, 2887, 2887,
+ 2887, 2887, 2887, 2887, 2887, 2888, 2888, 0, 2888, 2888,
+ 2888, 2888, 2888, 2888, 2888, 2888, 2889, 2889, 2889, 2889,
+ 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2890, 2890, 2890,
+
+ 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2891, 2891,
+ 0, 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2891, 2892,
+ 2892, 0, 2892, 2892, 2892, 2892, 2892, 2892, 2892, 2892,
+ 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893,
+ 2893, 2894, 2894, 2894, 2894, 2894, 2894, 2894, 2894, 2894,
+ 2894, 2894, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895,
+ 2895, 2895, 2895, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2896, 2896, 2896, 2897, 2897, 2897, 2897, 2897, 2897,
+ 2897, 2897, 2897, 2897, 2897, 2898, 2898, 2898, 2898, 2898,
+ 2898, 2898, 2898, 2898, 2898, 2898, 2899, 2899, 2899, 2899,
+
+ 2899, 2899, 2899, 2899, 2899, 2899, 2899, 2900, 2900, 2900,
+ 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2901, 2901,
+ 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2901, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903, 2903,
+ 2903, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904,
+ 2904, 2904, 2905, 2905, 2905, 2905, 2905, 2905, 2905, 2905,
+ 2905, 2905, 2905, 2906, 2906, 2906, 2906, 2906, 2906, 2906,
+ 2906, 2906, 2906, 2906, 2907, 2907, 2907, 2907, 2907, 2907,
+ 2907, 2907, 2907, 2907, 2907, 2908, 2908, 2908, 2908, 2908,
+
+ 2908, 2908, 2908, 2908, 2908, 2908, 2909, 2909, 2909, 2909,
+ 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2910, 2910, 2910,
+ 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2911, 2911,
+ 2911, 2911, 2911, 2911, 2911, 2911, 2911, 2911, 2911, 2912,
+ 2912, 2912, 2912, 2912, 0, 0, 0, 0, 2912, 2913,
+ 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2913,
+ 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914,
+ 2914, 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915,
+ 2915, 2915, 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916,
+ 2916, 2916, 2916, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
+
+ 2917, 2917, 2917, 2917, 2918, 2918, 2918, 2918, 2918, 2918,
+ 2918, 2918, 2918, 2918, 2918, 2919, 2919, 2919, 2919, 2919,
+ 2919, 2919, 2919, 2919, 2919, 2919, 2920, 2920, 2920, 2920,
+ 2920, 2920, 2920, 2920, 2920, 2920, 2920, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2923,
+ 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2925, 2925, 2925, 2925, 0, 0, 2925, 0, 0,
+ 2925, 2926, 2926, 2926, 2926, 2926, 2926, 2926, 2926, 2926,
+
+ 2926, 2926, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2927, 2928, 2928, 2928, 2928, 2928, 2928, 2928,
+ 2928, 2928, 2928, 2928, 2929, 2929, 2929, 2929, 2929, 2929,
+ 2929, 2929, 2929, 2929, 2929, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 2931, 2931, 2931, 2931,
+ 2931, 2931, 2931, 2931, 2931, 2931, 2931, 2932, 2932, 2932,
+ 2932, 2932, 2932, 2932, 2932, 2932, 2932, 2932, 2933, 2933,
+ 2933, 2933, 2933, 2933, 2933, 2933, 2933, 2933, 2933, 2934,
+ 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934,
+ 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2935,
+
+ 2935, 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936,
+ 2936, 2936, 2937, 2937, 2937, 2937, 2937, 2937, 2937, 2937,
+ 2937, 2937, 2937, 2938, 2938, 0, 2938, 2938, 2938, 2938,
+ 2938, 2938, 2938, 2938, 2939, 2939, 2939, 2939, 2939, 2939,
+ 2939, 2939, 2939, 2939, 2939, 2940, 2940, 2940, 2940, 2940,
+ 2940, 2940, 2940, 2940, 2940, 2940, 2941, 2941, 2941, 2941,
+ 2941, 2941, 2941, 2941, 2941, 2941, 2941, 2942, 2942, 2942,
+ 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2943, 2943,
+ 0, 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2944,
+ 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944,
+
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945,
+ 2945, 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2946,
+ 2946, 2946, 2947, 2947, 2947, 2947, 2947, 2947, 2947, 2947,
+ 2947, 2947, 2947, 2948, 2948, 2948, 2948, 2948, 2948, 2948,
+ 2948, 2948, 2948, 2948, 2949, 2949, 2949, 2949, 2949, 2949,
+ 2949, 2949, 2949, 2949, 2949, 2950, 2950, 2950, 2950, 2950,
+ 2950, 2950, 2950, 2950, 2950, 2950, 2951, 2951, 2951, 2951,
+ 2951, 2951, 2951, 2951, 2951, 2951, 2951, 2952, 2952, 2952,
+ 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2953, 2953,
+ 2953, 2953, 2953, 2953, 2953, 2953, 2953, 2953, 2953, 2954,
+
+ 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954,
+ 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955,
+ 2955, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956,
+ 2956, 2956, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957,
+ 2957, 2957, 2957, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2959, 2959, 2959, 2959, 2959, 2959,
+ 2959, 2959, 2959, 2959, 2959, 2960, 2960, 0, 2960, 2960,
+ 2960, 2960, 2960, 2960, 2960, 2960, 2961, 2961, 2961, 2961,
+ 0, 0, 2961, 0, 0, 2961, 2962, 2962, 2962, 2962,
+ 0, 0, 2962, 0, 0, 2962, 2963, 0, 0, 2963,
+
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964,
+ 2964, 2965, 2965, 2965, 2965, 2965, 2965, 2965, 2965, 2965,
+ 2965, 2965, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
+ 2966, 2966, 2966, 2967, 2967, 2967, 2967, 2967, 2967, 2967,
+ 2967, 2967, 2967, 2967, 2968, 2968, 2968, 2968, 2968, 2968,
+ 2968, 2968, 2968, 2968, 2968, 2969, 2969, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2969, 2969, 2969, 2970, 2970, 2970, 2970,
+ 2970, 2970, 2970, 2970, 2970, 2970, 2970, 2971, 2971, 2971,
+ 2971, 2971, 2971, 2971, 2971, 2971, 2971, 2971, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2973,
+
+ 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2973, 2973,
+ 2974, 2974, 2974, 2974, 2974, 2974, 2974, 2974, 2974, 2974,
+ 2974, 2975, 2975, 2975, 2975, 2975, 2975, 2975, 2975, 2975,
+ 2975, 2975, 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976,
+ 2976, 2976, 2976, 2977, 2977, 2977, 2977, 2977, 2977, 2977,
+ 2977, 2977, 2977, 2977, 2978, 2978, 2978, 2978, 2978, 2978,
+ 2978, 2978, 2978, 2978, 2978, 2979, 2979, 2979, 2979, 2979,
+ 2979, 2979, 2979, 2979, 2979, 2979, 2980, 2980, 2980, 2980,
+ 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2981, 2981, 2981,
+ 2981, 2981, 2981, 2981, 2981, 2981, 2981, 2981, 2982, 2982,
+
+ 2982, 2982, 2982, 2982, 2982, 2982, 2982, 2982, 2982, 2983,
+ 2983, 2983, 2983, 2983, 2983, 2983, 2983, 2983, 2983, 2983,
+ 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+ 2985, 2985, 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986,
+ 2986, 2986, 2986, 2987, 2987, 0, 2987, 2987, 2987, 2987,
+ 2987, 2987, 2987, 2987, 2988, 2988, 2988, 2988, 2988, 2988,
+ 2988, 2988, 2988, 2988, 2988, 2989, 2989, 2989, 2989, 2989,
+ 2989, 2989, 2989, 2989, 2989, 2989, 2990, 2990, 2990, 2990,
+ 2990, 2990, 2990, 2990, 2990, 2990, 2990, 2991, 2991, 2991,
+
+ 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2992, 2992,
+ 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2993,
+ 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993,
+ 2994, 2994, 2994, 2994, 2994, 2994, 2994, 2994, 2994, 2994,
+ 2994, 2995, 2995, 2995, 2995, 2995, 2995, 2995, 2995, 2995,
+ 2995, 2995, 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2997, 2997, 2997, 2997, 2997, 2997, 2997,
+ 2997, 2997, 2997, 2997, 2998, 2998, 2998, 2998, 2998, 2998,
+ 2998, 2998, 2998, 2998, 2998, 2999, 2999, 2999, 2999, 2999,
+ 2999, 2999, 2999, 2999, 2999, 2999, 3000, 3000, 3000, 3000,
+
+ 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3001, 3001, 3001,
+ 3001, 3001, 3001, 3001, 3001, 3001, 3001, 3001, 3002, 3002,
+ 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3003,
+ 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003,
+ 3004, 3004, 3004, 3004, 3004, 3004, 3004, 3004, 3004, 3004,
+ 3004, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 3005, 3006, 3006, 3006, 3006, 3006, 3006, 3006, 3006,
+ 3006, 3006, 3006, 3007, 3007, 0, 3007, 3007, 3007, 3007,
+ 3007, 3007, 3007, 3007, 3008, 3008, 3008, 3008, 3008, 3008,
+ 3008, 3008, 3008, 3008, 3008, 3009, 0, 3009, 3009, 3009,
+
+ 3009, 0, 3009, 3010, 3010, 3010, 3010, 3010, 3010, 3010,
+ 3010, 3010, 3010, 3010, 3011, 3011, 3011, 3011, 3011, 3011,
+ 3011, 3011, 3011, 3011, 3011, 3012, 3012, 3012, 3012, 3012,
+ 3012, 3012, 3012, 3012, 3012, 3012, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3014, 3014, 3014,
+ 3014, 3014, 3014, 3014, 3014, 3014, 3014, 3014, 3015, 3015,
+ 3015, 3015, 3015, 3015, 3015, 3015, 3015, 3015, 3015, 3016,
+ 3016, 3016, 3016, 3016, 3016, 3016, 3016, 3016, 3016, 3016,
+ 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017, 3017,
+ 3017, 3018, 3018, 3018, 3018, 3018, 3018, 3018, 3018, 3018,
+
+ 3018, 3018, 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019,
+ 3019, 3019, 3019, 3020, 3020, 3020, 3020, 3020, 3020, 3020,
+ 3020, 3020, 3020, 3020, 3021, 3021, 3021, 3021, 3021, 3021,
+ 3021, 3021, 3021, 3021, 3021, 3022, 3022, 3022, 3022, 3022,
+ 3022, 3022, 3022, 3022, 3022, 3022, 3023, 3023, 3023, 3023,
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3025, 3025,
+ 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3025, 3026,
+ 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
+ 3027, 3027, 3027, 3027, 3027, 3027, 3027, 3027, 3027, 3027,
+
+ 3027, 3028, 3028, 3028, 3028, 3028, 3028, 3028, 3028, 3028,
+ 3028, 3028, 3029, 3029, 3029, 3029, 3029, 3029, 3029, 3029,
+ 3029, 3029, 3029, 3030, 3030, 3030, 3030, 3030, 3030, 3030,
+ 3030, 3030, 3030, 3030, 3031, 3031, 3031, 3031, 3031, 3031,
+ 3031, 3031, 3031, 3031, 3031, 3032, 3032, 3032, 3032, 3032,
+ 3032, 3032, 3032, 3032, 3032, 3032, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3034, 3034, 3034,
+ 3034, 3034, 3034, 3034, 3034, 3034, 3034, 3034, 3035, 3035,
+ 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3036,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+
+ 3037, 3037, 3037, 3037, 3037, 3037, 3037, 3037, 3037, 3037,
+ 3037, 3038, 3038, 0, 3038, 3038, 3038, 3038, 3038, 3038,
+ 3038, 3038, 3039, 3039, 3039, 0, 3039, 3039, 3039, 0,
+ 0, 3039, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3041, 3041, 3041, 3041, 3041, 3041, 3041,
+ 3041, 3041, 3041, 3041, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3043, 3043, 3043, 3043, 3043,
+ 3043, 3043, 3043, 3043, 3043, 3043, 3044, 3044, 3044, 3044,
+ 3044, 3044, 3044, 3044, 3044, 3044, 3044, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3046, 3046,
+
+ 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3046, 3047,
+ 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
+ 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048,
+ 3048, 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049,
+ 3049, 3049, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
+ 3050, 3050, 3050, 3051, 3051, 3051, 3051, 3051, 3051, 3051,
+ 3051, 3051, 3051, 3051, 3052, 3052, 3052, 3052, 3052, 3052,
+ 3052, 3052, 3052, 3052, 3052, 3053, 3053, 3053, 3053, 3053,
+ 3053, 3053, 3053, 3053, 3053, 3053, 3054, 3054, 0, 3054,
+ 3054, 3054, 3054, 3054, 3054, 3054, 3054, 3055, 3055, 3055,
+
+ 3055, 3055, 3055, 3055, 3055, 3055, 3055, 3055, 3056, 3056,
+ 3056, 3056, 3056, 3056, 3056, 3056, 3056, 3056, 3056, 3057,
+ 3057, 3057, 3057, 3057, 3057, 3057, 3057, 3057, 3057, 3057,
+ 3058, 3058, 3058, 3058, 3058, 3058, 3058, 3058, 3058, 3058,
+ 3058, 3059, 3059, 3059, 3059, 3059, 3059, 3059, 3059, 3059,
+ 3059, 3059, 3060, 3060, 3060, 3060, 3060, 3060, 3060, 3060,
+ 3060, 3060, 3060, 3061, 3061, 3061, 3061, 3061, 3061, 3061,
+ 3061, 3061, 3061, 3061, 3062, 3062, 3062, 3062, 3062, 3062,
+ 3062, 3062, 3062, 3062, 3062, 3063, 3063, 3063, 3063, 3063,
+ 3063, 3063, 3063, 3063, 3063, 3063, 3064, 3064, 3064, 3064,
+
+ 3064, 3064, 3064, 3064, 3064, 3064, 3064, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3065, 3066, 3066,
+ 0, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3066, 3067,
+ 3067, 3067, 3067, 3067, 3067, 3067, 3067, 3067, 3067, 3067,
+ 3068, 3068, 3068, 3068, 3068, 0, 0, 0, 0, 3068,
+ 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069,
+ 3069, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070, 3070,
+ 3070, 3070, 3071, 3071, 3071, 3071, 3071, 3071, 3071, 3071,
+ 3071, 3071, 3071, 3072, 3072, 3072, 3072, 3072, 3072, 3072,
+ 3072, 3072, 3072, 3072, 3073, 3073, 3073, 3073, 3073, 3073,
+
+ 3073, 3073, 3073, 3073, 3073, 3074, 3074, 3074, 3074, 3074,
+ 3074, 3074, 3074, 3074, 3074, 3074, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3076, 3076, 3076,
+ 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3077, 3077,
+ 3077, 3077, 3077, 3077, 3077, 3077, 3077, 3077, 3077, 3078,
+ 3078, 3078, 3078, 3078, 3078, 3078, 3078, 3078, 3078, 3078,
+ 3079, 3079, 3079, 3079, 3079, 3079, 3079, 3079, 3079, 3079,
+ 3079, 3080, 3080, 3080, 3080, 3080, 3080, 3080, 3080, 3080,
+ 3080, 3080, 3081, 3081, 3081, 3081, 3081, 3081, 3081, 3081,
+ 3081, 3081, 3081, 3082, 3082, 3082, 3082, 3082, 3082, 3082,
+
+ 3082, 3082, 3082, 3082, 3083, 3083, 3083, 3083, 3083, 3083,
+ 3083, 3083, 3083, 3083, 3083, 3084, 3084, 3084, 3084, 3084,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3085, 3085, 0, 3085,
+ 3085, 3085, 3085, 3085, 3085, 3085, 3085, 3086, 3086, 3086,
+ 3086, 3086, 3086, 3086, 3086, 3086, 3086, 3086, 3087, 3087,
+ 3087, 3087, 3087, 3087, 3087, 3087, 3087, 3087, 3087, 3088,
+ 3088, 3088, 3088, 3088, 3088, 3088, 3088, 3088, 3088, 3088,
+ 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089,
+ 3089, 3090, 3090, 3090, 3090, 3090, 3090, 3090, 3090, 3090,
+ 3090, 3090, 3091, 3091, 3091, 3091, 3091, 3091, 3091, 3091,
+
+ 3091, 3091, 3091, 3092, 3092, 3092, 3092, 3092, 3092, 3092,
+ 3092, 3092, 3092, 3092, 3093, 3093, 3093, 3093, 3093, 3093,
+ 3093, 3093, 3093, 3093, 3093, 3094, 3094, 3094, 3094, 3094,
+ 3094, 3094, 3094, 3094, 3094, 3094, 3095, 3095, 3095, 3095,
+ 3095, 3095, 3095, 3095, 3095, 3095, 3095, 3096, 3096, 3096,
+ 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3096, 3097, 3097,
+ 3097, 3097, 3097, 3097, 3097, 3097, 3097, 3097, 3097, 3098,
+ 3098, 3098, 3098, 3098, 3098, 3098, 3098, 3098, 3098, 3098,
+ 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099, 3099,
+ 3099, 3100, 3100, 3100, 3100, 3100, 3100, 3100, 3100, 3100,
+
+ 3100, 3100, 3101, 3101, 3101, 3101, 3101, 3101, 3101, 3101,
+ 3101, 3101, 3101, 3102, 3102, 3102, 3102, 3102, 3102, 3102,
+ 3102, 3102, 3102, 3102, 3103, 3103, 3103, 3103, 3103, 3103,
+ 3103, 3103, 3103, 3103, 3103, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3105, 3105, 3105, 3105,
+ 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3106, 3106, 3106,
+ 3106, 3106, 3106, 3106, 3106, 3106, 3106, 3106, 3107, 3107,
+ 3107, 3107, 3107, 3107, 3107, 3107, 3107, 3107, 3107, 3108,
+ 3108, 0, 3108, 3108, 3108, 3108, 3108, 3108, 3108, 3108,
+ 3109, 3109, 3109, 3109, 3109, 3109, 3109, 3109, 3109, 3109,
+
+ 3109, 3110, 3110, 3110, 3110, 3110, 3110, 3110, 3110, 3110,
+ 3110, 3110, 3111, 3111, 3111, 3111, 3111, 3111, 3111, 3111,
+ 3111, 3111, 3111, 3112, 3112, 3112, 3112, 3112, 3112, 3112,
+ 3112, 3112, 3112, 3112, 3113, 3113, 3113, 3113, 3113, 3113,
+ 3113, 3113, 3113, 3113, 3113, 3114, 3114, 3114, 3114, 3114,
+ 3114, 3114, 3114, 3114, 3114, 3114, 3115, 3115, 3115, 3115,
+ 3115, 3115, 3115, 3115, 3115, 3115, 3115, 3116, 3116, 3116,
+ 3116, 3116, 3116, 3116, 3116, 3116, 3116, 3116, 3117, 0,
+ 3117, 0, 3117, 0, 3117, 0, 0, 3117, 3118, 3118,
+ 3118, 3118, 3118, 3118, 3118, 3118, 3118, 3118, 3118, 3119,
+
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3120,
+ 3120, 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121, 3121,
+ 3121, 3121, 3122, 3122, 3122, 3122, 3122, 3122, 3122, 3122,
+ 3122, 3122, 3122, 3123, 3123, 3123, 3123, 3123, 3123, 3123,
+ 3123, 3123, 3123, 3123, 3124, 3124, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3125, 3125, 3125, 3125, 3125,
+ 3125, 3125, 3125, 3125, 3125, 3125, 3126, 3126, 3126, 3126,
+ 0, 0, 0, 0, 0, 3126, 3127, 3127, 3127, 3127,
+ 3127, 3127, 3127, 3127, 3127, 3127, 3127, 3128, 3128, 3128,
+
+ 3128, 3128, 3128, 3128, 3128, 3128, 3128, 3128, 3129, 3129,
+ 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3129, 3130,
+ 3130, 3130, 3130, 3130, 3130, 3130, 3130, 3130, 3130, 3130,
+ 3131, 3131, 0, 3131, 3131, 3131, 3131, 3131, 3131, 3131,
+ 3131, 3132, 3132, 3132, 3132, 3132, 3132, 3132, 3132, 3132,
+ 3132, 3132, 3133, 3133, 3133, 3133, 3133, 3133, 3133, 3133,
+ 3133, 3133, 3133, 3134, 3134, 3134, 3134, 3134, 3134, 3134,
+ 3134, 3134, 3134, 3134, 3135, 3135, 3135, 3135, 3135, 3135,
+ 3135, 3135, 3135, 3135, 3135, 3136, 3136, 3136, 3136, 3136,
+ 3136, 3136, 3136, 3136, 3136, 3136, 3137, 3137, 3137, 3137,
+
+ 3137, 3137, 3137, 3137, 3137, 3137, 3137, 3138, 3138, 3138,
+ 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3139, 3140,
+ 3140, 3140, 3140, 3140, 3140, 3140, 3140, 3140, 3140, 3140,
+ 3141, 3141, 0, 3141, 3141, 3141, 3141, 3141, 3141, 3141,
+ 3141, 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142, 3142,
+ 3142, 3142, 3143, 3143, 3143, 3143, 3143, 3143, 3143, 3143,
+ 3143, 3143, 3143, 3144, 3144, 3144, 3144, 3144, 3144, 3144,
+ 3144, 3144, 3144, 3144, 3145, 3145, 3145, 3145, 0, 0,
+ 3145, 0, 0, 3145, 3146, 3146, 3146, 3146, 3146, 0,
+
+ 3146, 0, 0, 3146, 3147, 3147, 3147, 3147, 3147, 3147,
+ 3147, 3147, 3147, 3147, 3147, 3148, 3148, 3148, 3148, 3148,
+ 3148, 3148, 3148, 3148, 3148, 3148, 3149, 3149, 3149, 3149,
+ 3149, 3149, 3149, 3149, 3149, 3149, 3149, 3150, 3150, 3150,
+ 3150, 3150, 3150, 3150, 3150, 3150, 3150, 3150, 3151, 3151,
+ 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3152,
+ 3152, 3152, 3152, 3152, 3152, 3152, 3152, 3152, 3152, 3152,
+ 3153, 3153, 3153, 3153, 3153, 3153, 3153, 3153, 3153, 3153,
+ 3153, 3154, 3154, 3154, 3154, 3154, 3154, 3154, 3154, 3154,
+ 3154, 3154, 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155,
+
+ 3155, 3155, 3155, 3156, 3156, 3156, 3156, 3156, 3156, 3156,
+ 3156, 3156, 3156, 3156, 3157, 3157, 3157, 3157, 3157, 3157,
+ 3157, 3157, 3157, 3157, 3157, 3158, 3158, 3158, 3158, 3158,
+ 3158, 3158, 3158, 3158, 3158, 3158, 3159, 3159, 3159, 3159,
+ 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3160, 3160, 3160,
+ 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3161, 3161,
+ 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3162,
+ 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162,
+ 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163,
+ 3163, 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3164, 3164,
+
+ 3164, 3164, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165,
+ 3165, 3165, 3165, 3166, 3166, 3166, 3166, 3166, 3166, 3166,
+ 3166, 3166, 3166, 3166, 3167, 3167, 3167, 3167, 3167, 3167,
+ 3167, 3167, 3167, 3167, 3167, 3168, 3168, 3168, 3168, 3168,
+ 3168, 3168, 3168, 3168, 3168, 3168, 3169, 3169, 3169, 3169,
+ 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3170, 3170, 3170,
+ 3170, 3170, 3170, 3170, 3170, 3170, 3170, 3170, 3171, 3171,
+ 3171, 3171, 3171, 3171, 3171, 3171, 3171, 3171, 3171, 3172,
+ 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172,
+ 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173,
+
+ 3173, 3174, 3174, 0, 3174, 3174, 3174, 3174, 3174, 3174,
+ 3174, 3174, 3175, 3175, 3175, 3175, 3175, 3175, 3175, 3175,
+ 3175, 3175, 3175, 3176, 3176, 3176, 3176, 3176, 3176, 3176,
+ 3176, 3176, 3176, 3176, 3177, 3177, 3177, 3177, 3177, 3177,
+ 3177, 3177, 3177, 3177, 3177, 3178, 3178, 3178, 3178, 3178,
+ 3178, 3178, 3178, 3178, 3178, 3178, 3179, 3179, 3179, 3179,
+ 3179, 3179, 3179, 3179, 3179, 3179, 3179, 3180, 3180, 3180,
+ 3180, 3180, 3180, 3180, 3180, 3180, 3180, 3180, 3181, 3181,
+ 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3182,
+ 3182, 3182, 3182, 3182, 3182, 3182, 3182, 3182, 3182, 3182,
+
+ 3183, 3183, 3183, 3183, 3183, 3183, 3183, 3183, 3183, 3183,
+ 3183, 3184, 3184, 3184, 3184, 3184, 3184, 3184, 3184, 3184,
+ 3184, 3184, 3185, 3185, 3185, 3185, 3185, 3185, 3185, 3185,
+ 3185, 3185, 3185, 3186, 3186, 3186, 3186, 3186, 3186, 3186,
+ 3186, 3186, 3186, 3186, 3187, 3187, 3187, 3187, 3187, 3187,
+ 3187, 3187, 3187, 3187, 3187, 3188, 3188, 3188, 3188, 3188,
+ 3188, 3188, 3188, 3188, 3188, 3188, 3189, 3189, 3189, 3189,
+ 3189, 3189, 3189, 3189, 3189, 3189, 3189, 3190, 3190, 3190,
+ 3190, 3190, 3190, 3190, 3190, 3190, 3190, 3190, 3191, 3191,
+ 3191, 3191, 3191, 3191, 3191, 3191, 3191, 3191, 3191, 3192,
+
+ 3192, 3192, 3192, 3192, 3192, 3192, 3192, 3192, 3192, 3192,
+ 3193, 3193, 3193, 3193, 3193, 3193, 3193, 3193, 3193, 3193,
+ 3193, 3194, 3194, 3194, 3194, 3194, 3194, 3194, 3194, 3194,
+ 3194, 3194, 3195, 3195, 3195, 3195, 3195, 3195, 3195, 3195,
+ 3195, 3195, 3195, 3196, 3196, 3196, 3196, 3196, 3196, 3196,
+ 3196, 3196, 3196, 3196, 3197, 3197, 3197, 3197, 3197, 3197,
+ 3197, 3197, 3197, 3197, 3197, 3198, 3198, 3198, 3198, 3198,
+ 3198, 3198, 3198, 3198, 3198, 3198, 3199, 3199, 3199, 3199,
+ 3199, 3199, 3199, 3199, 3199, 3199, 3199, 3200, 3200, 0,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3201, 3201,
+
+ 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3201, 3202,
+ 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202,
+ 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203,
+ 3203, 3204, 3204, 3204, 3204, 3204, 3204, 3204, 3204, 3204,
+ 3204, 3204, 3205, 3205, 3205, 3205, 3205, 3205, 3205, 3205,
+ 3205, 3205, 3205, 3206, 3206, 3206, 3206, 3206, 3206, 3206,
+ 3206, 3206, 3206, 3206, 3207, 3207, 3207, 3207, 3207, 3207,
+ 3207, 3207, 3207, 3207, 3207, 3208, 3208, 3208, 3208, 3208,
+ 3208, 3208, 3208, 3208, 3208, 3208, 3209, 0, 3209, 0,
+ 3209, 0, 3209, 0, 0, 3209, 3210, 3210, 3210, 3210,
+
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3211, 3211, 3211,
+ 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3212, 3212,
+ 3212, 3212, 3212, 3212, 3212, 3212, 3212, 3212, 3212, 3213,
+ 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213,
+ 3214, 3214, 3214, 3214, 3214, 3214, 3214, 3214, 3214, 3214,
+ 3214, 3215, 3215, 3215, 3215, 3215, 3215, 3215, 3215, 3215,
+ 3215, 3215, 3216, 3216, 3216, 3216, 3216, 3216, 3216, 3216,
+ 3216, 3216, 3216, 3217, 3217, 3217, 3217, 3217, 3217, 3217,
+ 3217, 3217, 3217, 3217, 3218, 3218, 3218, 3218, 3218, 3218,
+ 3218, 3218, 3218, 3218, 3218, 3219, 3219, 3219, 3219, 3219,
+
+ 3219, 3219, 3219, 3219, 3219, 3219, 3220, 3220, 3220, 3220,
+ 3220, 3220, 3220, 3220, 3220, 3220, 3220, 3221, 3221, 3221,
+ 3221, 3221, 3221, 3221, 3221, 3221, 3221, 3221, 3222, 3222,
+ 3222, 3222, 3222, 3222, 3222, 3222, 3222, 3222, 3222, 3223,
+ 3223, 3223, 3223, 3223, 3223, 3223, 3223, 3223, 3223, 3223,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ 3225, 3225, 3226, 3226, 3226, 3226, 3226, 3226, 3226, 3226,
+ 3226, 3226, 3226, 3227, 3227, 3227, 3227, 3227, 3227, 3227,
+ 3227, 3227, 3227, 3227, 3228, 3228, 0, 3228, 3228, 3228,
+
+ 3228, 3228, 3228, 3228, 3228, 3229, 3229, 3229, 3229, 3229,
+ 3229, 3229, 3229, 3229, 3229, 3229, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3232, 3232,
+ 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3232, 3233,
+ 3233, 3233, 3233, 3233, 3233, 3233, 3233, 3233, 3233, 3233,
+ 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234,
+ 3234, 3235, 3235, 0, 3235, 3235, 3235, 3235, 3235, 3235,
+ 3235, 3235, 3236, 3236, 3236, 3236, 3236, 3236, 3236, 3236,
+ 3236, 3236, 3236, 3237, 3237, 3237, 3237, 0, 0, 3237,
+
+ 0, 0, 3237, 3238, 3238, 3238, 3238, 0, 0, 3238,
+ 0, 0, 3238, 3239, 3239, 3239, 3239, 3239, 3239, 3239,
+ 3239, 3239, 3239, 3239, 3240, 3240, 3240, 3240, 3240, 3240,
+ 3240, 3240, 3240, 3240, 3240, 3241, 3241, 3241, 3241, 3241,
+ 3241, 3241, 3241, 3241, 3241, 3241, 3242, 3242, 3242, 3242,
+ 3242, 3242, 3242, 3242, 3242, 3242, 3242, 3243, 3243, 3243,
+ 3243, 3243, 3243, 3243, 3243, 3243, 3243, 3243, 3244, 3244,
+ 3244, 3244, 3244, 3244, 3244, 3244, 3244, 3244, 3244, 3245,
+ 3245, 3245, 3245, 3245, 3245, 3245, 3245, 3245, 3245, 3245,
+ 3246, 3246, 3246, 3246, 3246, 3246, 3246, 3246, 3246, 3246,
+
+ 3246, 3247, 3247, 3247, 3247, 3247, 3247, 3247, 3247, 3247,
+ 3247, 3247, 3248, 3248, 3248, 3248, 3248, 3248, 3248, 3248,
+ 3248, 3248, 3248, 3249, 3249, 3249, 3249, 3249, 3249, 3249,
+ 3249, 3249, 3249, 3249, 3250, 3250, 3250, 3250, 3250, 3250,
+ 3250, 3250, 3250, 3250, 3250, 3251, 3251, 3251, 3251, 3251,
+ 3251, 3251, 3251, 3251, 3251, 3251, 3252, 3252, 3252, 3252,
+ 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3253, 3253, 3253,
+ 3253, 3253, 3253, 3253, 3253, 3253, 3253, 3253, 3254, 3254,
+ 3254, 3254, 3254, 3254, 3254, 3254, 3254, 3254, 3254, 3255,
+ 3255, 3255, 3255, 3255, 3255, 3255, 3255, 3255, 3255, 3255,
+
+ 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256,
+ 3256, 3257, 3257, 3257, 3257, 3257, 3257, 3257, 3257, 3257,
+ 3257, 3257, 3258, 3258, 3258, 3258, 3258, 3258, 3258, 3258,
+ 3258, 3258, 3258, 3259, 3259, 3259, 3259, 3259, 3259, 3259,
+ 3259, 3259, 3259, 3259, 3260, 3260, 3260, 3260, 3260, 3260,
+ 3260, 3260, 3260, 3260, 3260, 3261, 3261, 3261, 3261, 3261,
+ 3261, 3261, 3261, 3261, 3261, 3261, 3262, 3262, 3262, 3262,
+ 3262, 3262, 3262, 3262, 3262, 3262, 3262, 3263, 3263, 3263,
+ 3263, 3263, 3263, 3263, 3263, 3263, 3263, 3263, 3264, 3264,
+ 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3265,
+
+ 3265, 3265, 3265, 3265, 3265, 3265, 3265, 3265, 3265, 3265,
+ 3266, 3266, 3266, 3266, 3266, 3266, 3266, 3266, 3266, 3266,
+ 3266, 3267, 3267, 3267, 3267, 3267, 3267, 3267, 3267, 3267,
+ 3267, 3267, 3268, 3268, 3268, 3268, 3268, 3268, 3268, 3268,
+ 3268, 3268, 3268, 3269, 3269, 3269, 3269, 3269, 3269, 3269,
+ 3269, 3269, 3269, 3269, 3270, 3270, 3270, 3270, 3270, 3270,
+ 3270, 3270, 3270, 3270, 3270, 3271, 3271, 3271, 3271, 3271,
+ 3271, 3271, 3271, 3271, 3271, 3271, 3272, 3272, 3272, 3272,
+ 3272, 3272, 3272, 3272, 3272, 3272, 3272, 3273, 3273, 3273,
+ 3273, 3273, 3273, 3273, 3273, 3273, 3273, 3273, 3274, 3274,
+
+ 3274, 3274, 3274, 3274, 3274, 3274, 3274, 3274, 3274, 3275,
+ 3275, 3275, 3275, 3275, 3275, 3275, 3275, 3275, 3275, 3275,
+ 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276, 3276,
+ 3276, 3277, 3277, 3277, 3277, 3277, 3277, 3277, 3277, 3277,
+ 3277, 3277, 3278, 3278, 3278, 3278, 3278, 3278, 3278, 3278,
+ 3278, 3278, 3278, 3279, 3279, 3279, 3279, 3279, 3279, 3279,
+ 3279, 3279, 3279, 3279, 3280, 3280, 3280, 3280, 3280, 3280,
+ 3280, 3280, 3280, 3280, 3280, 3281, 3281, 3281, 3281, 3281,
+ 3281, 3281, 3281, 3281, 3281, 3281, 3282, 3282, 3282, 3282,
+ 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3283, 3283, 3283,
+
+ 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3284, 3284,
+ 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3285,
+ 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285, 3285,
+ 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3286,
+ 3286, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287,
+ 3287, 3287, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288,
+ 3288, 3288, 3288, 3289, 3289, 3289, 3289, 3289, 3289, 3289,
+ 3289, 3289, 3289, 3289, 3290, 3290, 3290, 3290, 3290, 3290,
+ 3290, 3290, 3290, 3290, 3290, 3291, 3291, 3291, 3291, 3291,
+ 3291, 3291, 3291, 3291, 3291, 3291, 3292, 3292, 3292, 3292,
+
+ 3292, 3292, 3292, 3292, 3292, 3292, 3292, 3293, 3293, 3293,
+ 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3293, 3294, 3294,
+ 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3295,
+ 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295, 3295,
+ 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296,
+ 3296, 3297, 3297, 0, 3297, 3297, 3297, 3297, 3297, 3297,
+ 3297, 3297, 3298, 3298, 3298, 3298, 3298, 3298, 3298, 3298,
+ 3298, 3298, 3298, 3299, 3299, 3299, 3299, 3299, 3299, 3299,
+ 3299, 3299, 3299, 3299, 3300, 3300, 3300, 3300, 3300, 3300,
+ 3300, 3300, 3300, 3300, 3300, 3301, 3301, 3301, 3301, 3301,
+
+ 3301, 3301, 3301, 3301, 3301, 3301, 3302, 3302, 3302, 3302,
+ 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3303, 3303, 3303,
+ 3303, 3303, 3303, 3303, 3303, 3303, 3303, 3303, 3304, 3304,
+ 3304, 3304, 3304, 3304, 3304, 3304, 3304, 3304, 3304, 3305,
+ 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3305,
+ 3306, 3306, 3306, 3306, 3306, 3306, 3306, 3306, 3306, 3306,
+ 3306, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307,
+ 3307, 3307, 3308, 3308, 3308, 3308, 3308, 3308, 3308, 3308,
+ 3308, 3308, 3308, 3309, 3309, 3309, 3309, 3309, 3309, 3309,
+ 3309, 3309, 3309, 3309, 3310, 3310, 3310, 3310, 3310, 3310,
+
+ 3310, 3310, 3310, 3310, 3310, 3311, 3311, 3311, 3311, 3311,
+ 3311, 3311, 3311, 3311, 3311, 3311, 3312, 3312, 3312, 3312,
+ 3312, 3312, 3312, 3312, 3312, 3312, 3312, 3313, 3313, 3313,
+ 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3314, 3314,
+ 0, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3315,
+ 3315, 3315, 3315, 3315, 3315, 3315, 3315, 3315, 3315, 3315,
+ 3316, 3316, 3316, 3316, 3316, 3316, 3316, 3316, 3316, 3316,
+ 3316, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3317,
+ 3317, 3317, 3318, 3318, 3318, 3318, 3318, 3318, 3318, 3318,
+ 3318, 3318, 3318, 3319, 3319, 3319, 3319, 3319, 3319, 3319,
+
+ 3319, 3319, 3319, 3319, 3320, 3320, 3320, 3320, 3320, 3320,
+ 3320, 3320, 3320, 3320, 3320, 3321, 3321, 3321, 3321, 3321,
+ 3321, 3321, 3321, 3321, 3321, 3321, 3322, 3322, 3322, 3322,
+ 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3323, 3323, 3323,
+ 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3324, 3324,
+ 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3325,
+ 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325,
+ 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326,
+ 3326, 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3327,
+ 3327, 3327, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328,
+
+ 3328, 3328, 3328, 3329, 3329, 3329, 3329, 3329, 3329, 3329,
+ 3329, 3329, 3329, 3329, 3330, 3330, 0, 3330, 3330, 3330,
+ 3330, 3330, 3330, 3330, 3330, 3331, 3331, 3331, 3331, 3331,
+ 3331, 3331, 3331, 3331, 3331, 3331, 3332, 3332, 3332, 3332,
+ 3332, 3332, 3332, 3332, 3332, 3332, 3332, 3333, 3333, 3333,
+ 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3334, 3334,
+ 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3335,
+ 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335,
+ 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336,
+ 3336, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337,
+
+ 3337, 3337, 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338,
+ 3338, 3338, 3338, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3340, 3340, 3340, 3340, 3340, 3340,
+ 3340, 3340, 3340, 3340, 3340, 3341, 3341, 3341, 3341, 3341,
+ 3341, 3341, 3341, 3341, 3341, 3341, 3342, 3342, 3342, 3342,
+ 3342, 3342, 3342, 3342, 3342, 3342, 3342, 3343, 3343, 3343,
+ 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3344, 3344,
+ 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3345,
+ 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345,
+ 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346,
+
+ 3346, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347,
+ 3347, 3347, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348,
+ 3348, 3348, 3348, 3349, 3349, 3349, 3349, 3349, 3349, 3349,
+ 3349, 3349, 3349, 3349, 3350, 3350, 3350, 3350, 3350, 3350,
+ 3350, 3350, 3350, 3350, 3350, 3351, 3351, 3351, 3351, 3351,
+ 3351, 3351, 3351, 3351, 3351, 3351, 3352, 3352, 3352, 3352,
+ 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3353, 3353, 3353,
+ 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3354, 3354,
+ 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3355,
+ 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355,
+
+ 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356,
+ 3356, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357,
+ 3357, 3357, 3358, 3358, 0, 3358, 3358, 3358, 3358, 3358,
+ 3358, 3358, 3358, 3359, 3359, 3359, 3359, 3359, 3359, 3359,
+ 3359, 3359, 3359, 3359, 3360, 3360, 3360, 3360, 3360, 3360,
+ 3360, 3360, 3360, 3360, 3360, 3361, 3361, 3361, 3361, 3361,
+ 3361, 3361, 3361, 3361, 3361, 3361, 3362, 3362, 3362, 3362,
+ 3362, 3362, 3362, 3362, 3362, 3362, 3362, 3363, 3363, 3363,
+ 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3364, 3364,
+ 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3365,
+
+ 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365,
+ 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366,
+ 3366, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367,
+ 3367, 3367, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368,
+ 3368, 3368, 3368, 3369, 3369, 3369, 3369, 3369, 3369, 3369,
+ 3369, 3369, 3369, 3369, 3370, 3370, 3370, 3370, 3370, 3370,
+ 3370, 3370, 3370, 3370, 3370, 3371, 3371, 3371, 3371, 3371,
+ 3371, 3371, 3371, 3371, 3371, 3371, 3372, 3372, 3372, 3372,
+ 3372, 3372, 3372, 3372, 3372, 3372, 3372, 3373, 3373, 3373,
+ 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3374, 3374,
+
+ 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3375,
+ 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375,
+ 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376,
+ 3376, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377,
+ 3377, 3377, 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378,
+ 3378, 3378, 3378, 3379, 3379, 3379, 3379, 3379, 3379, 3379,
+ 3379, 3379, 3379, 3379, 3380, 3380, 3380, 3380, 3380, 3380,
+ 3380, 3380, 3380, 3380, 3380, 3381, 3381, 3381, 3381, 3381,
+ 3381, 3381, 3381, 3381, 3381, 3381, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3383, 3383, 3383,
+
+ 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3384, 3384,
+ 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3384, 3385,
+ 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385,
+ 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386,
+ 3386, 3387, 3387, 0, 3387, 3387, 3387, 3387, 3387, 3387,
+ 3387, 3387, 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388,
+ 3388, 3388, 3388, 3389, 3389, 3389, 3389, 3389, 3389, 3389,
+ 3389, 3389, 3389, 3389, 3390, 3390, 3390, 3390, 3390, 3390,
+ 3390, 3390, 3390, 3390, 3390, 3391, 3391, 3391, 3391, 3391,
+ 3391, 3391, 3391, 3391, 3391, 3391, 3392, 3392, 3392, 3392,
+
+ 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3393, 3393, 3393,
+ 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3393, 3394, 3394,
+ 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3395,
+ 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395, 3395,
+ 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396, 3396,
+ 3396, 3397, 3397, 3397, 3397, 3397, 3397, 3397, 3397, 3397,
+ 3397, 3397, 3398, 3398, 3398, 3398, 3398, 3398, 3398, 3398,
+ 3398, 3398, 3398, 3399, 3399, 3399, 3399, 3399, 3399, 3399,
+ 3399, 3399, 3399, 3399, 3400, 3400, 3400, 3400, 3400, 3400,
+ 3400, 3400, 3400, 3400, 3400, 3401, 3401, 3401, 3401, 3401,
+
+ 3401, 3401, 3401, 3401, 3401, 3401, 3402, 3402, 3402, 3402,
+ 3402, 3402, 3402, 3402, 3402, 3402, 3402, 3403, 3403, 3403,
+ 3403, 3403, 3403, 3403, 3403, 3403, 3403, 3403, 3404, 3404,
+ 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3405,
+ 3405, 3405, 3405, 3405, 3405, 3405, 3405, 3405, 3405, 3405,
+ 3406, 3406, 3406, 3406, 3406, 3406, 3406, 3406, 3406, 3406,
+ 3406, 3407, 3407, 3407, 3407, 3407, 3407, 3407, 3407, 3407,
+ 3407, 3407, 3408, 3408, 0, 3408, 3408, 3408, 3408, 3408,
+ 3408, 3408, 3408, 3409, 3409, 3409, 3409, 3409, 3409, 3409,
+ 3409, 3409, 3409, 3409, 3410, 3410, 3410, 3410, 3410, 3410,
+
+ 3410, 3410, 3410, 3410, 3410, 3411, 3411, 3411, 3411, 3411,
+ 3411, 3411, 3411, 3411, 3411, 3411, 3412, 3412, 3412, 3412,
+ 3412, 3412, 3412, 3412, 3412, 3412, 3412, 3413, 3413, 3413,
+ 3413, 3413, 3413, 3413, 3413, 3413, 3413, 3413, 3414, 3414,
+ 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3415,
+ 3415, 3415, 3415, 3415, 3415, 3415, 3415, 3415, 3415, 3415,
+ 3416, 3416, 3416, 3416, 3416, 3416, 3416, 3416, 3416, 3416,
+ 3416, 3417, 3417, 3417, 3417, 3417, 3417, 3417, 3417, 3417,
+ 3417, 3417, 3418, 3418, 3418, 3418, 3418, 3418, 3418, 3418,
+ 3418, 3418, 3418, 3419, 3419, 0, 3419, 3419, 3419, 3419,
+
+ 3419, 3419, 3419, 3419, 3420, 3420, 3420, 3420, 3420, 3420,
+ 3420, 3420, 3420, 3420, 3420, 3421, 3421, 3421, 3421, 3421,
+ 3421, 3421, 3421, 3421, 3421, 3421, 3422, 3422, 3422, 3422,
+ 3422, 3422, 3422, 3422, 3422, 3422, 3422, 3423, 3423, 3423,
+ 3423, 3423, 3423, 3423, 3423, 3423, 3423, 3423, 3424, 3424,
+ 3424, 3424, 3424, 3424, 3424, 3424, 3424, 3424, 3424, 3425,
+ 3425, 3425, 3425, 3425, 3425, 3425, 3425, 3425, 3425, 3425,
+ 3426, 3426, 3426, 3426, 3426, 3426, 3426, 3426, 3426, 3426,
+ 3426, 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427,
+ 3427, 3427, 3428, 3428, 3428, 3428, 3428, 3428, 3428, 3428,
+
+ 3428, 3428, 3428, 3429, 3429, 3429, 3429, 3429, 3429, 3429,
+ 3429, 3429, 3429, 3429, 3430, 3430, 3430, 3430, 3430, 3430,
+ 3430, 3430, 3430, 3430, 3430, 3431, 3431, 3431, 3431, 3431,
+ 3431, 3431, 3431, 3431, 3431, 3431, 3432, 3432, 3432, 3432,
+ 3432, 3432, 3432, 3432, 3432, 3432, 3432, 3433, 3433, 3433,
+ 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3434, 3434,
+ 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3435,
+ 3435, 3435, 3435, 3435, 3435, 3435, 3435, 3435, 3435, 3435,
+ 3436, 3436, 3436, 3436, 3436, 3436, 3436, 3436, 3436, 3436,
+ 3436, 3437, 3437, 3437, 3437, 3437, 3437, 3437, 3437, 3437,
+
+ 3437, 3437, 3438, 3438, 3438, 3438, 3438, 3438, 3438, 3438,
+ 3438, 3438, 3438, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3440, 3440, 3440, 3440, 3440, 3440,
+ 3440, 3440, 3440, 3440, 3440, 3441, 3441, 3441, 3441, 3441,
+ 3441, 3441, 3441, 3441, 3441, 3441, 3442, 3442, 3442, 3442,
+ 3442, 3442, 3442, 3442, 3442, 3442, 3442, 3443, 3443, 3443,
+ 3443, 3443, 3443, 3443, 3443, 3443, 3443, 3443, 3444, 3444,
+ 3444, 3444, 3444, 3444, 3444, 3444, 3444, 3444, 3444, 3445,
+ 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445,
+ 3446, 3446, 3446, 3446, 3446, 3446, 3446, 3446, 3446, 3446,
+
+ 3446, 3447, 3447, 3447, 3447, 3447, 3447, 3447, 3447, 3447,
+ 3447, 3447, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3448, 3448, 3448, 3449, 3449, 3449, 3449, 3449, 3449, 3449,
+ 3449, 3449, 3449, 3449, 3450, 3450, 3450, 3450, 3450, 3450,
+ 3450, 3450, 3450, 3450, 3450, 3451, 3451, 3451, 3451, 3451,
+ 3451, 3451, 3451, 3451, 3451, 3451, 3452, 3452, 3452, 3452,
+ 3452, 3452, 3452, 3452, 3452, 3452, 3452, 3453, 3453, 3453,
+ 3453, 3453, 3453, 3453, 3453, 3453, 3453, 3453, 3454, 3454,
+ 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3455,
+ 3455, 3455, 3455, 3455, 3455, 3455, 3455, 3455, 3455, 3455,
+
+ 3456, 3456, 3456, 3456, 3456, 3456, 3456, 3456, 3456, 3456,
+ 3456, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458,
+ 3458, 3458, 3458, 3459, 3459, 3459, 3459, 3459, 3459, 3459,
+ 3459, 3459, 3459, 3459, 3460, 3460, 3460, 3460, 3460, 3460,
+ 3460, 3460, 3460, 3460, 3460, 3461, 3461, 3461, 3461, 3461,
+ 3461, 3461, 3461, 3461, 3461, 3461, 3462, 3462, 3462, 3462,
+ 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3463, 3463, 3463,
+ 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3463, 3464, 3464,
+ 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3465,
+
+ 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465,
+ 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466,
+ 3466, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467,
+ 3467, 3467, 3468, 3468, 0, 3468, 3468, 3468, 3468, 3468,
+ 3468, 3468, 3468, 3469, 3469, 3469, 3469, 3469, 3469, 3469,
+ 3469, 3469, 3469, 3469, 3470, 3470, 3470, 3470, 3470, 3470,
+ 3470, 3470, 3470, 3470, 3470, 3471, 3471, 3471, 3471, 3471,
+ 3471, 3471, 3471, 3471, 3471, 3471, 3472, 3472, 3472, 3472,
+ 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3473, 3473, 3473,
+ 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3474, 3474,
+
+ 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3475,
+ 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475,
+ 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476,
+ 3476, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477,
+ 3477, 3477, 3478, 3478, 3478, 3478, 3478, 3478, 3478, 3478,
+ 3478, 3478, 3478, 3479, 3479, 3479, 3479, 3479, 3479, 3479,
+ 3479, 3479, 3479, 3479, 3480, 3480, 3480, 3480, 3480, 3480,
+ 3480, 3480, 3480, 3480, 3480, 3481, 3481, 3481, 3481, 3481,
+ 3481, 3481, 3481, 3481, 3481, 3481, 3482, 3482, 3482, 3482,
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3483, 3483, 3483,
+
+ 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3484, 3484,
+ 3484, 3484, 3484, 3484, 3484, 3484, 3484, 3484, 3484, 3485,
+ 3485, 3485, 3485, 3485, 3485, 3485, 3485, 3485, 3485, 3485,
+ 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486,
+ 3486, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487,
+ 3487, 3487, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488,
+ 3488, 3488, 3488, 3489, 3489, 3489, 3489, 3489, 3489, 3489,
+ 3489, 3489, 3489, 3489, 3490, 3490, 3490, 3490, 3490, 3490,
+ 3490, 3490, 3490, 3490, 3490, 3491, 3491, 3491, 3491, 3491,
+ 3491, 3491, 3491, 3491, 3491, 3491, 3492, 3492, 0, 3492,
+
+ 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3493, 3493, 3493,
+ 3493, 3493, 3493, 3493, 3493, 3493, 3493, 3493, 3494, 3494,
+ 3494, 3494, 3494, 3494, 3494, 3494, 3494, 3494, 3494, 3495,
+ 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3495,
+ 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496,
+ 3496, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497,
+ 3497, 3497, 3498, 3498, 3498, 3498, 3498, 3498, 3498, 3498,
+ 3498, 3498, 3498, 3499, 3499, 3499, 3499, 3499, 3499, 3499,
+ 3499, 3499, 3499, 3499, 3500, 3500, 3500, 3500, 3500, 3500,
+ 3500, 3500, 3500, 3500, 3500, 3501, 3501, 0, 3501, 3501,
+
+ 3501, 3501, 3501, 3501, 3501, 3501, 3502, 3502, 3502, 3502,
+ 3502, 3502, 3502, 3502, 3502, 3502, 3502, 3503, 3503, 3503,
+ 3503, 3503, 3503, 3503, 3503, 3503, 3503, 3503, 3504, 3504,
+ 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3505,
+ 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505,
+ 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506,
+ 3506, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507,
+ 3507, 3507, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508,
+ 3508, 3508, 3508, 3509, 3509, 3509, 3509, 3509, 3509, 3509,
+ 3509, 3509, 3509, 3509, 3510, 3510, 3510, 3510, 3510, 3510,
+
+ 3510, 3510, 3510, 3510, 3510, 3511, 3511, 3511, 3511, 3511,
+ 3511, 3511, 3511, 3511, 3511, 3511, 3512, 3512, 3512, 3512,
+ 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3513, 3513, 3513,
+ 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3514, 3514,
+ 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3515,
+ 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516,
+ 3516, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517,
+ 3517, 3517, 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3518,
+ 3518, 3518, 3518, 3519, 3519, 3519, 3519, 3519, 3519, 3519,
+
+ 3519, 3519, 3519, 3519, 3520, 3520, 3520, 3520, 3520, 3520,
+ 3520, 3520, 3520, 3520, 3520, 3521, 3521, 3521, 3521, 3521,
+ 3521, 3521, 3521, 3521, 3521, 3521, 3522, 3522, 3522, 3522,
+ 3522, 3522, 3522, 3522, 3522, 3522, 3522, 3523, 3523, 3523,
+ 3523, 3523, 3523, 3523, 3523, 3523, 3523, 3523, 3524, 3524,
+ 3524, 3524, 3524, 3524, 3524, 3524, 3524, 3524, 3524, 3525,
+ 3525, 3525, 3525, 3525, 3525, 3525, 3525, 3525, 3525, 3525,
+ 3526, 3526, 3526, 3526, 3526, 3526, 3526, 3526, 3526, 3526,
+ 3526, 3527, 3527, 3527, 3527, 3527, 3527, 3527, 3527, 3527,
+ 3527, 3527, 3528, 3528, 3528, 3528, 3528, 3528, 3528, 3528,
+
+ 3528, 3528, 3528, 3529, 3529, 3529, 3529, 3529, 3529, 3529,
+ 3529, 3529, 3529, 3529, 3530, 3530, 3530, 3530, 3530, 3530,
+ 3530, 3530, 3530, 3530, 3530, 3531, 3531, 3531, 3531, 3531,
+ 3531, 3531, 3531, 3531, 3531, 3531, 3532, 3532, 3532, 3532,
+ 3532, 3532, 3532, 3532, 3532, 3532, 3532, 3533, 3533, 3533,
+ 3533, 3533, 3533, 3533, 3533, 3533, 3533, 3533, 3534, 3534,
+ 3534, 3534, 3534, 3534, 3534, 3534, 3534, 3534, 3534, 3535,
+ 3535, 3535, 3535, 3535, 3535, 3535, 3535, 3535, 3535, 3535,
+ 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536,
+ 3536, 3537, 3537, 3537, 3537, 3537, 3537, 3537, 3537, 3537,
+
+ 3537, 3537, 3538, 3538, 3538, 3538, 3538, 3538, 3538, 3538,
+ 3538, 3538, 3538, 3539, 3539, 3539, 3539, 3539, 3539, 3539,
+ 3539, 3539, 3539, 3539, 3540, 3540, 3540, 3540, 3540, 3540,
+ 3540, 3540, 3540, 3540, 3540, 3541, 3541, 3541, 3541, 3541,
+ 3541, 3541, 3541, 3541, 3541, 3541, 3542, 3542, 3542, 3542,
+ 3542, 3542, 3542, 3542, 3542, 3542, 3542, 3543, 3543, 3543,
+ 3543, 3543, 3543, 3543, 3543, 3543, 3543, 3543, 3544, 3544,
+ 3544, 3544, 3544, 3544, 3544, 3544, 3544, 3544, 3544, 3545,
+ 3545, 3545, 3545, 3545, 3545, 3545, 3545, 3545, 3545, 3545,
+ 3546, 3546, 3546, 3546, 3546, 3546, 3546, 3546, 3546, 3546,
+
+ 3546, 3547, 3547, 3547, 3547, 3547, 3547, 3547, 3547, 3547,
+ 3547, 3547, 3548, 3548, 3548, 3548, 3548, 3548, 3548, 3548,
+ 3548, 3548, 3548, 3549, 3549, 0, 3549, 3549, 3549, 3549,
+ 3549, 3549, 3549, 3549, 3550, 3550, 3550, 3550, 3550, 3550,
+ 3550, 3550, 3550, 3550, 3550, 3551, 3551, 3551, 3551, 3551,
+ 3551, 3551, 3551, 3551, 3551, 3551, 3552, 3552, 3552, 3552,
+ 3552, 3552, 3552, 3552, 3552, 3552, 3552, 3553, 3553, 3553,
+ 3553, 3553, 3553, 3553, 3553, 3553, 3553, 3553, 3554, 3554,
+ 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3555,
+ 3555, 3555, 3555, 3555, 3555, 3555, 3555, 3555, 3555, 3555,
+
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556,
+ 3556, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557,
+ 3557, 3557, 3558, 3558, 3558, 3558, 3558, 3558, 3558, 3558,
+ 3558, 3558, 3558, 3559, 3559, 3559, 3559, 3559, 3559, 3559,
+ 3559, 3559, 3559, 3559, 3560, 3560, 3560, 3560, 3560, 3560,
+ 3560, 3560, 3560, 3560, 3560, 3561, 3561, 3561, 3561, 3561,
+ 3561, 3561, 3561, 3561, 3561, 3561, 3562, 3562, 3562, 3562,
+ 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3563, 3563, 3563,
+ 3563, 3563, 3563, 3563, 3563, 3563, 3563, 3563, 3564, 3564,
+ 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3565,
+
+ 3565, 3565, 3565, 3565, 3565, 3565, 3565, 3565, 3565, 3565,
+ 3566, 3566, 3566, 3566, 3566, 3566, 3566, 3566, 3566, 3566,
+ 3566, 3567, 3567, 3567, 3567, 3567, 3567, 3567, 3567, 3567,
+ 3567, 3567, 3568, 3568, 3568, 3568, 3568, 3568, 3568, 3568,
+ 3568, 3568, 3568, 3569, 3569, 3569, 3569, 3569, 3569, 3569,
+ 3569, 3569, 3569, 3569, 3570, 3570, 3570, 3570, 3570, 3570,
+ 3570, 3570, 3570, 3570, 3570, 3571, 3571, 3571, 3571, 3571,
+ 3571, 3571, 3571, 3571, 3571, 3571, 3572, 3572, 3572, 3572,
+ 3572, 3572, 3572, 3572, 3572, 3572, 3572, 3573, 3573, 0,
+ 3573, 3573, 3573, 3573, 3573, 3573, 3573, 3573, 3574, 3574,
+
+ 3574, 3574, 3574, 3574, 3574, 3574, 3574, 3574, 3574, 3575,
+ 3575, 3575, 3575, 3575, 3575, 3575, 3575, 3575, 3575, 3575,
+ 3576, 3576, 3576, 3576, 3576, 3576, 3576, 3576, 3576, 3576,
+ 3576, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577,
+ 3577, 3577, 3578, 3578, 3578, 3578, 3578, 3578, 3578, 3578,
+ 3578, 3578, 3578, 3579, 3579, 3579, 3579, 3579, 3579, 3579,
+ 3579, 3579, 3579, 3579, 3580, 3580, 3580, 3580, 3580, 3580,
+ 3580, 3580, 3580, 3580, 3580, 3581, 3581, 3581, 3581, 3581,
+ 3581, 3581, 3581, 3581, 3581, 3581, 3582, 3582, 3582, 3582,
+ 3582, 3582, 3582, 3582, 3582, 3582, 3582, 3583, 3583, 3583,
+
+ 3583, 3583, 3583, 3583, 3583, 3583, 3583, 3583, 3584, 3584,
+ 3584, 3584, 3584, 3584, 3584, 3584, 3584, 3584, 3584, 3585,
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585,
+ 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586,
+ 3586, 3587, 3587, 3587, 3587, 3587, 3587, 3587, 3587, 3587,
+ 3587, 3587, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588,
+ 3588, 3588, 3588, 3589, 3589, 3589, 3589, 3589, 3589, 3589,
+ 3589, 3589, 3589, 3589, 3590, 3590, 3590, 3590, 3590, 3590,
+ 3590, 3590, 3590, 3590, 3590, 3591, 3591, 3591, 3591, 3591,
+ 3591, 3591, 3591, 3591, 3591, 3591, 3592, 3592, 3592, 3592,
+
+ 3592, 3592, 3592, 3592, 3592, 3592, 3592, 3593, 3593, 3593,
+ 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3594, 3594,
+ 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3595,
+ 3595, 3595, 3595, 3595, 3595, 3595, 3595, 3595, 3595, 3595,
+ 3596, 3596, 3596, 3596, 3596, 3596, 3596, 3596, 3596, 3596,
+ 3596, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597,
+ 3597, 3597, 3598, 3598, 3598, 3598, 3598, 3598, 3598, 3598,
+ 3598, 3598, 3598, 3599, 3599, 3599, 3599, 3599, 3599, 3599,
+ 3599, 3599, 3599, 3599, 3600, 3600, 3600, 3600, 3600, 3600,
+ 3600, 3600, 3600, 3600, 3600, 3601, 3601, 3601, 3601, 3601,
+
+ 3601, 3601, 3601, 3601, 3601, 3601, 3602, 3602, 3602, 3602,
+ 3602, 3602, 3602, 3602, 3602, 3602, 3602, 3603, 3603, 3603,
+ 3603, 3603, 3603, 3603, 3603, 3603, 3603, 3603, 3604, 3604,
+ 3604, 3604, 3604, 3604, 3604, 3604, 3604, 3604, 3604, 3605,
+ 3605, 3605, 3605, 3605, 3605, 3605, 3605, 3605, 3605, 3605,
+ 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606, 3606,
+ 3606, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607, 3607,
+ 3607, 3607, 3608, 3608, 3608, 3608, 3608, 3608, 3608, 3608,
+ 3608, 3608, 3608, 3609, 3609, 3609, 3609, 3609, 3609, 3609,
+ 3609, 3609, 3609, 3609, 3610, 3610, 3610, 3610, 3610, 3610,
+
+ 3610, 3610, 3610, 3610, 3610, 3611, 3611, 3611, 3611, 3611,
+ 3611, 3611, 3611, 3611, 3611, 3611, 3612, 3612, 3612, 3612,
+ 3612, 3612, 3612, 3612, 3612, 3612, 3612, 3613, 3613, 3613,
+ 3613, 3613, 3613, 3613, 3613, 3613, 3613, 3613, 3614, 3614,
+ 3614, 3614, 3614, 3614, 3614, 3614, 3614, 3614, 3614, 3615,
+ 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615, 3615,
+ 3616, 3616, 3616, 3616, 3616, 3616, 3616, 3616, 3616, 3616,
+ 3616, 3617, 3617, 3617, 3617, 3617, 3617, 3617, 3617, 3617,
+ 3617, 3617, 3618, 3618, 3618, 3618, 3618, 3618, 3618, 3618,
+ 3618, 3618, 3618, 3619, 3619, 3619, 3619, 3619, 3619, 3619,
+
+ 3619, 3619, 3619, 3619, 3620, 3620, 3620, 3620, 3620, 3620,
+ 3620, 3620, 3620, 3620, 3620, 3621, 3621, 3621, 3621, 3621,
+ 3621, 3621, 3621, 3621, 3621, 3621, 3622, 3622, 3622, 3622,
+ 3622, 3622, 3622, 3622, 3622, 3622, 3622, 3623, 3623, 3623,
+ 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3624, 3624,
+ 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3625,
+ 3625, 3625, 3625, 3625, 3625, 3625, 3625, 3625, 3625, 3625,
+ 3626, 3626, 3626, 3626, 3626, 3626, 3626, 3626, 3626, 3626,
+ 3626, 3627, 3627, 3627, 3627, 3627, 3627, 3627, 3627, 3627,
+ 3627, 3627, 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628,
+
+ 3628, 3628, 3628, 3629, 3629, 0, 3629, 3629, 3629, 3629,
+ 3629, 3629, 3629, 3629, 3630, 3630, 3630, 3630, 3630, 3630,
+ 3630, 3630, 3630, 3630, 3630, 3631, 3631, 3631, 3631, 3631,
+ 3631, 3631, 3631, 3631, 3631, 3631, 3632, 3632, 3632, 3632,
+ 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3633, 3633, 3633,
+ 3633, 3633, 3633, 3633, 3633, 3633, 3633, 3633, 3634, 3634,
+ 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3635,
+ 3635, 3635, 3635, 3635, 3635, 3635, 3635, 3635, 3635, 3635,
+ 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636,
+ 3636, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637,
+
+ 3637, 3637, 3638, 3638, 3638, 3638, 3638, 3638, 3638, 3638,
+ 3638, 3638, 3638, 3639, 3639, 3639, 3639, 3639, 3639, 3639,
+ 3639, 3639, 3639, 3639, 3640, 3640, 3640, 3640, 3640, 3640,
+ 3640, 3640, 3640, 3640, 3640, 3641, 3641, 3641, 3641, 3641,
+ 3641, 3641, 3641, 3641, 3641, 3641, 3642, 3642, 3642, 3642,
+ 3642, 3642, 3642, 3642, 3642, 3642, 3642, 3643, 3643, 3643,
+ 3643, 3643, 3643, 3643, 3643, 3643, 3643, 3643, 3644, 3644,
+ 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3645,
+ 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645, 3645,
+ 3646, 3646, 3646, 3646, 3646, 3646, 3646, 3646, 3646, 3646,
+
+ 3646, 3647, 3647, 3647, 3647, 3647, 3647, 3647, 3647, 3647,
+ 3647, 3647, 3648, 3648, 3648, 3648, 3648, 3648, 3648, 3648,
+ 3648, 3648, 3648, 3649, 3649, 3649, 3649, 3649, 3649, 3649,
+ 3649, 3649, 3649, 3649, 3650, 3650, 3650, 3650, 3650, 3650,
+ 3650, 3650, 3650, 3650, 3650, 3651, 3651, 3651, 3651, 3651,
+ 3651, 3651, 3651, 3651, 3651, 3651, 3652, 3652, 3652, 3652,
+ 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3653, 3653, 3653,
+ 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3653, 3654, 3654,
+ 3654, 3654, 3654, 3654, 3654, 3654, 3654, 3654, 3654, 3655,
+ 3655, 3655, 3655, 3655, 3655, 3655, 3655, 3655, 3655, 3655,
+
+ 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656,
+ 3656, 3657, 3657, 3657, 3657, 3657, 3657, 3657, 3657, 3657,
+ 3657, 3657, 3658, 3658, 3658, 3658, 3658, 3658, 3658, 3658,
+ 3658, 3658, 3658, 3659, 3659, 3659, 3659, 3659, 3659, 3659,
+ 3659, 3659, 3659, 3659, 3660, 3660, 3660, 3660, 3660, 3660,
+ 3660, 3660, 3660, 3660, 3660, 3661, 3661, 3661, 3661, 3661,
+ 3661, 3661, 3661, 3661, 3661, 3661, 3662, 3662, 3662, 3662,
+ 3662, 3662, 3662, 3662, 3662, 3662, 3662, 3663, 3663, 3663,
+ 3663, 3663, 3663, 3663, 3663, 3663, 3663, 3663, 3664, 3664,
+ 3664, 3664, 3664, 3664, 3664, 3664, 3664, 3664, 3664, 3665,
+
+ 3665, 3665, 3665, 3665, 3665, 3665, 3665, 3665, 3665, 3665,
+ 3666, 3666, 3666, 3666, 3666, 3666, 3666, 3666, 3666, 3666,
+ 3666, 3667, 3667, 3667, 3667, 3667, 3667, 3667, 3667, 3667,
+ 3667, 3667, 3668, 3668, 3668, 3668, 3668, 3668, 3668, 3668,
+ 3668, 3668, 3668, 3669, 3669, 3669, 3669, 3669, 3669, 3669,
+ 3669, 3669, 3669, 3669, 3670, 3670, 3670, 3670, 3670, 3670,
+ 3670, 3670, 3670, 3670, 3670, 3671, 3671, 3671, 3671, 3671,
+ 3671, 3671, 3671, 3671, 3671, 3671, 3672, 3672, 3672, 3672,
+ 3672, 3672, 3672, 3672, 3672, 3672, 3672, 3673, 3673, 3673,
+ 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3674, 3674,
+
+ 3674, 3674, 3674, 3674, 3674, 3674, 3674, 3674, 3674, 3675,
+ 3675, 3675, 3675, 3675, 3675, 3675, 3675, 3675, 3675, 3675,
+ 3676, 3676, 3676, 3676, 3676, 3676, 3676, 3676, 3676, 3676,
+ 3676, 3677, 3677, 3677, 3677, 3677, 3677, 3677, 3677, 3677,
+ 3677, 3677, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678,
+ 3678, 3678, 3678, 3679, 3679, 3679, 3679, 3679, 3679, 3679,
+ 3679, 3679, 3679, 3679, 3680, 3680, 3680, 3680, 3680, 3680,
+ 3680, 3680, 3680, 3680, 3680, 3681, 3681, 3681, 3681, 3681,
+ 3681, 3681, 3681, 3681, 3681, 3681, 3682, 3682, 3682, 3682,
+ 3682, 3682, 3682, 3682, 3682, 3682, 3682, 3683, 3683, 3683,
+
+ 3683, 3683, 3683, 3683, 3683, 3683, 3683, 3683, 3684, 3684,
+ 3684, 3684, 3684, 3684, 3684, 3684, 3684, 3684, 3684, 3685,
+ 3685, 3685, 3685, 3685, 3685, 3685, 3685, 3685, 3685, 3685,
+ 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686,
+ 3686, 3687, 3687, 3687, 3687, 3687, 3687, 3687, 3687, 3687,
+ 3687, 3687, 3688, 3688, 3688, 3688, 3688, 3688, 3688, 3688,
+ 3688, 3688, 3688, 3689, 3689, 3689, 3689, 3689, 3689, 3689,
+ 3689, 3689, 3689, 3689, 3690, 3690, 3690, 3690, 3690, 3690,
+ 3690, 3690, 3690, 3690, 3690, 3691, 3691, 3691, 3691, 3691,
+ 3691, 3691, 3691, 3691, 3691, 3691, 3692, 3692, 3692, 3692,
+
+ 3692, 3692, 3692, 3692, 3692, 3692, 3692, 3693, 3693, 3693,
+ 3693, 3693, 3693, 3693, 3693, 3693, 3693, 3693, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3695,
+ 3695, 3695, 3695, 3695, 3695, 3695, 3695, 3695, 3695, 3695,
+ 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696,
+ 3696, 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697,
+ 3697, 3697, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698,
+ 3698, 3698, 3698, 3699, 3699, 3699, 3699, 3699, 3699, 3699,
+ 3699, 3699, 3699, 3699, 3700, 3700, 3700, 3700, 3700, 3700,
+ 3700, 3700, 3700, 3700, 3700, 3701, 3701, 3701, 3701, 3701,
+
+ 3701, 3701, 3701, 3701, 3701, 3701, 3702, 3702, 3702, 3702,
+ 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3703, 3703, 3703,
+ 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3704, 3704,
+ 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3705,
+ 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705,
+ 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706,
+ 3706, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707,
+ 3707, 3707, 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708,
+ 3708, 3708, 3708, 3709, 3709, 3709, 3709, 3709, 3709, 3709,
+ 3709, 3709, 3709, 3709, 3710, 3710, 3710, 3710, 3710, 3710,
+
+ 3710, 3710, 3710, 3710, 3710, 3711, 3711, 3711, 3711, 3711,
+ 3711, 3711, 3711, 3711, 3711, 3711, 3712, 3712, 3712, 3712,
+ 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3713, 3713, 3713,
+ 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3714, 3714,
+ 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3715,
+ 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715,
+ 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716,
+ 3716, 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717,
+ 3717, 3717, 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718,
+ 3718, 3718, 3718, 3719, 3719, 3719, 3719, 3719, 3719, 3719,
+
+ 3719, 3719, 3719, 3719, 3720, 3720, 3720, 3720, 3720, 3720,
+ 3720, 3720, 3720, 3720, 3720, 3721, 3721, 3721, 3721, 3721,
+ 3721, 3721, 3721, 3721, 3721, 3721, 3722, 3722, 3722, 3722,
+ 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3723, 3723, 3723,
+ 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3724, 3724,
+ 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3725,
+ 3725, 3725, 3725, 3725, 3725, 3725, 3725, 3725, 3725, 3725,
+ 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726,
+ 3726, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727,
+ 3727, 3727, 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728,
+
+ 3728, 3728, 3728, 3729, 3729, 3729, 3729, 3729, 3729, 3729,
+ 3729, 3729, 3729, 3729, 3730, 3730, 3730, 3730, 3730, 3730,
+ 3730, 3730, 3730, 3730, 3730, 3731, 3731, 3731, 3731, 3731,
+ 3731, 3731, 3731, 3731, 3731, 3731, 3732, 3732, 3732, 3732,
+ 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3733, 3733, 3733,
+ 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3734, 3734,
+ 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3735,
+ 3735, 3735, 3735, 3735, 3735, 3735, 3735, 3735, 3735, 3735,
+ 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736,
+ 3736, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737,
+
+ 3737, 3737, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738,
+ 3738, 3738, 3738, 3739, 3739, 3739, 3739, 3739, 3739, 3739,
+ 3739, 3739, 3739, 3739, 3740, 3740, 3740, 3740, 3740, 3740,
+ 3740, 3740, 3740, 3740, 3740, 3741, 3741, 3741, 3741, 3741,
+ 3741, 3741, 3741, 3741, 3741, 3741, 3742, 3742, 3742, 3742,
+ 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3743, 3743, 3743,
+ 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3744, 3744,
+ 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3745,
+ 3745, 3745, 3745, 3745, 3745, 3745, 3745, 3745, 3745, 3745,
+ 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746,
+
+ 3746, 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747,
+ 3747, 3747, 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748,
+ 3748, 3748, 3748, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+ 3749, 3749, 3749, 3749, 3750, 3750, 3750, 3750, 3750, 3750,
+ 3750, 3750, 3750, 3750, 3750, 3751, 3751, 3751, 3751, 3751,
+ 3751, 3751, 3751, 3751, 3751, 3751, 3752, 3752, 0, 3752,
+ 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3753, 3753, 3753,
+ 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3754, 3754,
+ 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3755,
+ 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755,
+
+ 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756,
+ 3756, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757,
+ 3757, 3757, 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3758, 3759, 3759, 3759, 3759, 3759, 3759, 3759,
+ 3759, 3759, 3759, 3759, 3760, 3760, 3760, 3760, 3760, 3760,
+ 3760, 3760, 3760, 3760, 3760, 3761, 3761, 3761, 3761, 3761,
+ 3761, 3761, 3761, 3761, 3761, 3761, 3762, 3762, 3762, 3762,
+ 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3763, 3763, 3763,
+ 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3764, 3764,
+ 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3765,
+
+ 3765, 3765, 3765, 3765, 3765, 3765, 3765, 3765, 3765, 3765,
+ 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766,
+ 3766, 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767,
+ 3767, 3767, 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768,
+ 3768, 3768, 3768, 3769, 3769, 3769, 3769, 3769, 3769, 3769,
+ 3769, 3769, 3769, 3769, 3770, 3770, 3770, 3770, 3770, 3770,
+ 3770, 3770, 3770, 3770, 3770, 3771, 3771, 3771, 3771, 3771,
+ 3771, 3771, 3771, 3771, 3771, 3771, 3772, 3772, 3772, 3772,
+ 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3773, 3773, 3773,
+ 3773, 3773, 3773, 3773, 3773, 3773, 3773, 3773, 3774, 3774,
+
+ 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3775,
+ 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775,
+ 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776,
+ 3776, 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777,
+ 3777, 3777, 3778, 3778, 3778, 3778, 3778, 3778, 3778, 3778,
+ 3778, 3778, 3778, 3779, 3779, 3779, 3779, 3779, 3779, 3779,
+ 3779, 3779, 3779, 3779, 3780, 3780, 3780, 3780, 3780, 3780,
+ 3780, 3780, 3780, 3780, 3780, 3781, 3781, 3781, 3781, 3781,
+ 3781, 3781, 3781, 3781, 3781, 3781, 3782, 3782, 3782, 3782,
+ 3782, 3782, 3782, 3782, 3782, 3782, 3782, 3783, 3783, 3783,
+
+ 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3784, 3784,
+ 3784, 3784, 3784, 3784, 3784, 3784, 3784, 3784, 3784, 3785,
+ 3785, 3785, 3785, 3785, 3785, 3785, 3785, 3785, 3785, 3785,
+ 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786,
+ 3786, 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3787,
+ 3787, 3787, 3788, 3788, 3788, 3788, 3788, 3788, 3788, 3788,
+ 3788, 3788, 3788, 3789, 3789, 3789, 3789, 3789, 3789, 3789,
+ 3789, 3789, 3789, 3789, 3790, 3790, 3790, 3790, 3790, 3790,
+ 3790, 3790, 3790, 3790, 3790, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3792, 3792, 3792, 3792,
+
+ 3792, 3792, 3792, 3792, 3792, 3792, 3792, 3793, 3793, 3793,
+ 3793, 3793, 3793, 3793, 3793, 3793, 3793, 3793, 3794, 3794,
+ 3794, 3794, 3794, 3794, 3794, 3794, 3794, 3794, 3794, 3795,
+ 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
+ 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
+ 3796, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797,
+ 3797, 3797, 3798, 3798, 3798, 3798, 3798, 3798, 3798, 3798,
+ 3798, 3798, 3798, 3799, 3799, 3799, 3799, 3799, 3799, 3799,
+ 3799, 3799, 3799, 3799, 3800, 3800, 3800, 3800, 3800, 3800,
+ 3800, 3800, 3800, 3800, 3800, 3801, 3801, 3801, 3801, 3801,
+
+ 3801, 3801, 3801, 3801, 3801, 3801, 3802, 3802, 3802, 3802,
+ 3802, 3802, 3802, 3802, 3802, 3802, 3802, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813,
+ 2813, 2813, 2813, 2813, 2813, 2813, 2813
+ } ;
+
+extern int fcodeYY_flex_debug;
+int fcodeYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up fcodeYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *fcodeYYtext;
+#line 1 "fortrancode.l"
+/******************************************************************************
+ *
+ * Parser for syntax hightlighting and references for Fortran90 F subset
+ *
+ * Copyright (C) by Anke Visser
+ * based on the work of Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/**
+ @todo - continutation lines not always recognized
+ - merging of use-statements with same module name and different only-names
+ - rename part of use-statement
+ - links to interface functions
+ - references to variables
+**/
+#line 28 "fortrancode.l"
+
+/*
+ * includes
+ */
+#include "qtbc.h"
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <qregexp.h>
+#include <qdir.h>
+#include <qstringlist.h>
+#include "entry.h"
+#include "doxygen.h"
+#include "message.h"
+#include "outputlist.h"
+#include "util.h"
+#include "membername.h"
+#include "searchindex.h"
+#include "defargs.h"
+
+#define YY_NEVER_INTERACTIVE 1
+#define YY_NO_TOP_STATE 1
+
+//--------------------------------------------------------------------------------
+
+/**
+ data of an use-statement
+*/
+class UseEntry
+{
+ public:
+ QCString module; // just for debug
+ QStringList onlyNames; /* entries of the ONLY-part */
+};
+
+/**
+ module name -> list of ONLY/remote entries
+ (module name = name of the module, which can be accessed via use-directive)
+*/
+class UseSDict : public SDict<UseEntry>
+{
+ public:
+ UseSDict() : SDict<UseEntry>(17) {}
+};
+
+/**
+ Contains names of used modules and names of local variables.
+*/
+class Scope
+{
+ public:
+ QStringList useNames; //!< contains names of used modules
+ QDict<void> localVars; //!< contains names of local variables
+
+ Scope() : localVars(7, FALSE /*caseSensitive*/) {}
+};
+
+/*===================================================================*/
+/*
+ * statics
+ */
+
+static QCString docBlock; //!< contents of all lines of a documentation block
+static QCString currentModule=0; //!< name of the current enclosing module
+static UseSDict *useMembers= new UseSDict; //!< info about used modules
+static UseEntry *useEntry = 0; //!< current use statement info
+static QList<Scope> scopeStack;
+// static QStringList *currentUseNames= new QStringList; //! contains names of used modules of current program unit
+static QCString str=""; //!> contents of fortran string
+
+static CodeOutputInterface * g_code;
+
+// TODO: is this still needed? if so, make it work
+static QCString g_parmType;
+static QCString g_parmName;
+
+static const char * g_inputString; //!< the code fragment as text
+static int g_inputPosition; //!< read offset during parsing
+static int g_inputLines; //!< number of line in the code fragment
+static int g_yyLineNr; //!< current line number
+static bool g_needsTermination;
+static bool g_isFixedForm;
+
+static bool g_insideBody; //!< inside subprog/program body? => create links
+static const char * g_currentFontClass;
+
+static bool g_exampleBlock;
+static QCString g_exampleName;
+static QCString g_exampleFile;
+
+static FileDef * g_sourceFileDef;
+static Definition * g_currentDefinition;
+static MemberDef * g_currentMemberDef;
+static bool g_includeCodeFragment;
+
+static char stringStartSymbol; // single or double quote
+// count in variable declaration to filter out
+// declared from referenced names
+static int bracketCount = 0;
+
+// simplified way to know if this is fixed form
+// duplicate in fortranscanner.l
+static bool recognizeFixedForm(const char* contents)
+{
+ int column=0;
+ bool skipLine=FALSE;
+
+ for (int i=0;;i++)
+ {
+ column++;
+
+ switch(contents[i])
+ {
+ case '\n':
+ column=0;
+ skipLine=FALSE;
+ break;
+ case ' ':
+ break;
+ case '\000':
+ return FALSE;
+ case 'C':
+ case 'c':
+ case '*':
+ if(column==1) return TRUE;
+ if(skipLine) break;
+ return FALSE;
+ case '!':
+ if(column>1 && column<7) return FALSE;
+ skipLine=TRUE;
+ break;
+ default:
+ if(skipLine) break;
+ if(column==7) return TRUE;
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+static void endFontClass()
+{
+ if (g_currentFontClass)
+ {
+ g_code->endFontClass();
+ g_currentFontClass=0;
+ }
+}
+
+static void startFontClass(const char *s)
+{
+ endFontClass();
+ g_code->startFontClass(s);
+ g_currentFontClass=s;
+}
+
+static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
+ }
+}
+
+static void addToSearchIndex(const char *text)
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->addWord(text,FALSE);
+ }
+}
+
+/*! start a new line of code, inserting a line number if g_sourceFileDef
+ * is TRUE. If a definition starts at the current line, then the line
+ * number is linked to the documentation of that definition.
+ */
+static void startCodeLine()
+{
+ if (g_sourceFileDef)
+ {
+ //QCString lineNumber,lineAnchor;
+ //lineNumber.sprintf("%05d",g_yyLineNr);
+ //lineAnchor.sprintf("l%05d",g_yyLineNr);
+
+ Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
+ //printf("startCodeLine %d d=%s\n", g_yyLineNr,d ? d->name().data() : "<null>");
+ if (!g_includeCodeFragment && d)
+ {
+ g_currentDefinition = d;
+ g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
+ g_insideBody = FALSE;
+ g_parmType.resize(0);
+ g_parmName.resize(0);
+ QCString lineAnchor;
+ lineAnchor.sprintf("l%05d",g_yyLineNr);
+ if (g_currentMemberDef)
+ {
+ g_code->writeLineNumber(g_currentMemberDef->getReference(),
+ g_currentMemberDef->getOutputFileBase(),
+ g_currentMemberDef->anchor(),g_yyLineNr);
+ setCurrentDoc(
+ g_currentMemberDef->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ else if (d->isLinkableInProject())
+ {
+ g_code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,g_yyLineNr);
+ setCurrentDoc(
+ d->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ }
+ else
+ {
+ g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ }
+ }
+ g_code->startCodeLine();
+ if (g_currentFontClass)
+ {
+ g_code->startFontClass(g_currentFontClass);
+ }
+}
+
+
+static void endFontClass();
+static void endCodeLine()
+{
+ endFontClass();
+ g_code->endCodeLine();
+}
+
+/*! write a code fragment `text' that may span multiple lines, inserting
+ * line numbers for each line.
+ */
+static void codifyLines(char *text)
+{
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ g_code->codify(sp);
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ startCodeLine();
+ }
+ }
+ else
+ {
+ g_code->codify(sp);
+ done=TRUE;
+ }
+ }
+}
+
+static void codifyLines(QCString str)
+{
+ char *tmp= (char *) malloc(str.length()+1);
+ strcpy(tmp, str);
+ codifyLines(tmp);
+ free(tmp);
+}
+
+/*! writes a link to a fragment \a text that may span multiple lines, inserting
+ * line numbers for each line. If \a text contains newlines, the link will be
+ * split into multiple links with the same destination, one for each line.
+ */
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const char *ref,const char *file,
+ const char *anchor,const char *text)
+{
+ bool done=FALSE;
+ char *p=(char *)text;
+ while (!done)
+ {
+ char *sp=p;
+ char c;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,0);
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ startCodeLine();
+ }
+ }
+ else
+ {
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,0);
+ done=TRUE;
+ }
+ }
+}
+
+/**
+ generates dictionay entries that are used if REFERENCED_BY_RELATION ... options are set
+ (e.g. the "referenced by ..." list after the function documentation)
+*/
+
+static void addDocCrossReference(MemberDef *src, MemberDef *dst)
+{
+ if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+ //printf("======= addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+ if ((Config_getBool("REFERENCED_BY_RELATION") || Config_getBool("CALLER_GRAPH")) &&
+ (src->isFunction()))
+ {
+ dst->addSourceReferencedBy(src);
+ }
+ if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) && (src->isFunction()))
+ {
+ src->addSourceReferences(dst);
+ }
+}
+
+//-------------------------------------------------------------------------------
+/**
+ searches for definition of a type
+ @param tname the name of the type
+ @param moduleName name of enclosing module or null, if global entry
+ @param cd the entry, if found or null
+ @param useDict dictionary of data of USE-statement
+ @returns true, if type is found
+*/
+static bool getFortranTypeDefs(const QCString &tname, const QCString &moduleName,
+ ClassDef *&cd, UseSDict *usedict=0)
+{
+ if (tname.isEmpty()) return FALSE; /* empty name => nothing to link */
+
+ //cout << "=== search for type: " << tname << endl;
+
+ // search for type
+ if ((cd=Doxygen::classSDict->find(tname)))
+ {
+ //cout << "=== type found in global module" << endl;
+ return TRUE;
+ }
+ else if (moduleName && (cd= Doxygen::classSDict->find(moduleName+"::"+tname)))
+ {
+ //cout << "=== type found in local module" << endl;
+ return TRUE;
+ }
+ else
+ {
+ UseEntry *use;
+ for (UseSDict::Iterator di(*usedict); (use=di.current()); ++di)
+ if ((cd= Doxygen::classSDict->find(use->module+"::"+tname)))
+ {
+ //cout << "=== type found in used module" << endl;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/**
+ searches for definition of function memberName
+ @param memberName the name of the function/variable
+ @param moduleName name of enclosing module or null, if global entry
+ @param md the entry, if found or null
+ @param usedict array of data of USE-statement
+ @returns true, if found
+*/
+static bool getFortranDefs(const QCString &memberName, const QCString &moduleName,
+ MemberDef *&md, UseSDict *usedict=0)
+{
+ if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */
+
+ // look in local variables
+ for (Scope *scope=scopeStack.last(); scope!=NULL; scope=scopeStack.prev())
+ {
+ if(scope->localVars.find(memberName))
+ return FALSE;
+ }
+
+ // search for function
+ MemberName *mn = Doxygen::functionNameSDict->find(memberName);
+
+ if (mn) // name is known
+ {
+ MemberListIterator mli(*mn);
+ for (mli.toFirst();(md=mli.current());++mli) // all found functions with given name
+ {
+ FileDef *fd=md->getFileDef();
+ GroupDef *gd=md->getGroupDef();
+
+ //cout << "found link with same name: " << fd->fileName() << " " << memberName;
+ //if (md->getNamespaceDef() != 0) cout << " in namespace " << md->getNamespaceDef()->name();cout << endl;
+
+ if ((gd && gd->isLinkable()) || (fd && fd->isLinkable()))
+ {
+ NamespaceDef *nspace= md->getNamespaceDef();
+
+ if (nspace == 0)
+ { // found function in global scope
+ return TRUE;
+ }
+ else if (moduleName == nspace->name())
+ { // found in local scope
+ return TRUE;
+ }
+ else
+ { // else search in used modules
+ QCString moduleName= nspace->name();
+ UseEntry *ue= usedict->find(moduleName);
+ if (ue)
+ {
+ // check if only-list exists and if current entry exists is this list
+ QStringList &only= ue->onlyNames;
+ if (only.isEmpty())
+ {
+ //cout << " found in module " << moduleName << " entry " << memberName << endl;
+ return TRUE; // whole module used
+ }
+ else
+ {
+ for ( QStringList::Iterator it = only.begin(); it != only.end(); ++it)
+ {
+ //cout << " search in only: " << moduleName << ":: " << memberName << "==" << (*it)<< endl;
+ if (memberName == (QCString)(*it))
+ return TRUE; // found in ONLY-part of use list
+ }
+ }
+ }
+ }
+ } // if linkable
+ } // for
+ }
+ return FALSE;
+}
+
+/**
+ gets the link to a generic procedure which depends not on the name, but on the parameter list
+ @todo implementation
+*/
+static bool getGenericProcedureLink(const ClassDef *cd,
+ const char *memberText,
+ CodeOutputInterface &ol)
+{
+ (void)cd;
+ (void)memberText;
+ (void)ol;
+ return FALSE;
+}
+
+static bool getLink(UseSDict *usedict, // dictonary with used modules
+ const char *memberText, // exact member text
+ CodeOutputInterface &ol,
+ const char *text)
+{
+ MemberDef *md;
+ QCString memberName= removeRedundantWhiteSpace(memberText);
+
+ if (getFortranDefs(memberName, currentModule, md, usedict) && md->isLinkable())
+ {
+ //if (md->isVariable()) return FALSE; // variables aren't handled yet
+
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ if (d && d->isLinkable())
+ {
+ if (g_currentDefinition && g_currentMemberDef && md!=g_currentMemberDef && g_insideBody)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ ol.linkableSymbol(g_yyLineNr,md->name(),md,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ text ? text : memberText);
+ addToSearchIndex(text ? text : memberText);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+static void generateLink(CodeOutputInterface &ol, char *lname)
+{
+ ClassDef *cd=0;
+
+ // check if lname is a linkable type or interface
+ if ( (getFortranTypeDefs(lname, currentModule, cd, useMembers)) && cd->isLinkable() )
+ {
+ if ( (cd->compoundType() == ClassDef::Class) && // was Entry::INTERFACE_SEC) &&
+ (getGenericProcedureLink(cd, lname, ol)) )
+ {
+ //cout << "=== generic procedure resolved" << endl;
+ }
+ else
+ { // write type or interface link
+ ol.linkableSymbol(g_yyLineNr, lname, cd, g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),lname);
+ addToSearchIndex(lname);
+ }
+ }
+ // check for function/variable
+ else if (getLink(useMembers, lname, ol, lname))
+ {
+ //cout << "=== found link for " << lname << endl;
+ }
+ else
+ {
+ // nothing found, just write out the word
+ ol.linkableSymbol(g_yyLineNr, lname, 0, g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ //startFontClass("charliteral"); //test
+ codifyLines(lname);
+ //endFontClass(); //test
+ addToSearchIndex(lname);
+ }
+}
+
+/*! counts the number of lines in the input */
+static int countLines()
+{
+ const char *p=g_inputString;
+ char c;
+ int count=1;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
+ }
+ if (p>g_inputString && *(p-1)!='\n')
+ { // last line does not end with a \n, so we add an extra
+ // line and explicitly terminate the line after parsing.
+ count++,
+ g_needsTermination=TRUE;
+ }
+ return count;
+}
+
+//----------------------------------------------------------------------------
+/** start scope */
+void startScope()
+{
+ // fprintf(stderr, "===> startScope %s",fcodeYYtext);
+ Scope *scope = new Scope;
+ scopeStack.append(scope);
+}
+
+/** end scope */
+void endScope()
+{
+ // fprintf(stderr,"===> endScope %s",fcodeYYtext);
+ if (scopeStack.isEmpty())
+ {
+ fprintf(stderr,"WARNING: fortrancode.l: stack empty!");
+ return;
+ //exit(-1);
+ }
+
+ Scope *scope = scopeStack.getLast();
+ scopeStack.removeLast();
+ for ( QStringList::Iterator it = scope->useNames.begin(); it != scope->useNames.end(); ++it)
+ {
+ useMembers->remove(*it);
+ }
+ delete scope;
+}
+
+void addUse(QString moduleName)
+{
+ if (!scopeStack.isEmpty())
+ scopeStack.last()->useNames.append(moduleName);
+}
+
+void addLocalVar(QString varName)
+{
+ if (!scopeStack.isEmpty())
+ scopeStack.last()->localVars.insert(varName, (void*)1);
+}
+
+//----------------------------------------------------------------------------
+
+/* -----------------------------------------------------------------*/
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+/* Assume that attribute statements are almost the same as attributes. */
+/* | */
+/*%option debug*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 7970 "<stdout>"
+
+#define INITIAL 0
+#define Start 1
+#define SubCall 2
+#define FuncDef 3
+#define ClassName 4
+#define ClassVar 5
+#define Subprog 6
+#define DocBlock 7
+#define Use 8
+#define UseOnly 9
+#define TypeDecl 10
+#define Declaration 11
+#define DeclContLine 12
+#define Parameterlist 13
+#define String 14
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int fcodeYYlex_destroy (void );
+
+int fcodeYYget_debug (void );
+
+void fcodeYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE fcodeYYget_extra (void );
+
+void fcodeYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *fcodeYYget_in (void );
+
+void fcodeYYset_in (FILE * in_str );
+
+FILE *fcodeYYget_out (void );
+
+void fcodeYYset_out (FILE * out_str );
+
+yy_size_t fcodeYYget_leng (void );
+
+char *fcodeYYget_text (void );
+
+int fcodeYYget_lineno (void );
+
+void fcodeYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int fcodeYYwrap (void );
+#else
+extern int fcodeYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+ static int yy_start_stack_ptr = 0;
+ static int yy_start_stack_depth = 0;
+ static int *yy_start_stack = NULL;
+
+ static void yy_push_state (int new_state );
+
+ static void yy_pop_state (void );
+
+ static int yy_top_state (void );
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( fcodeYYtext, fcodeYYleng, 1, fcodeYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( fcodeYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( fcodeYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, fcodeYYin))==0 && ferror(fcodeYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(fcodeYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int fcodeYYlex (void);
+
+#define YY_DECL int fcodeYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after fcodeYYtext and fcodeYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( fcodeYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (fcodeYYtext[fcodeYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 689 "fortrancode.l"
+
+ /*==================================================================*/
+
+ /*-------- ignore ------------------------------------------------------------*/
+
+#line 8185 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)fcodeYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in fcodeYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! fcodeYYin )
+ fcodeYYin = stdin;
+
+ if ( ! fcodeYYout )
+ fcodeYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ fcodeYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ fcodeYY_create_buffer(fcodeYYin,YY_BUF_SIZE );
+ }
+
+ fcodeYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of fcodeYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 2814 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 24618 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+*yy_cp = (yy_hold_char); /* undo effects of setting up fcodeYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 4;
+YY_DO_BEFORE_ACTION; /* set up fcodeYYtext again */
+YY_RULE_SETUP
+#line 694 "fortrancode.l"
+{ // do not search keywords, intrinsics... TODO: complete list
+ codifyLines(fcodeYYtext);
+ }
+ YY_BREAK
+/*-------- inner construct ---------------------------------------------------*/
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 699 "fortrancode.l"
+{ // hightlight rest of fortran statements
+ /* font class is defined e.g. in doxygen.css */
+ startFontClass("keyword");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 3:
+/* rule 3 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up fcodeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up fcodeYYtext again */
+YY_RULE_SETUP
+#line 705 "fortrancode.l"
+{
+ startFontClass("keyword");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+/*-------- use statement -------------------------------------------*/
+case 4:
+YY_RULE_SETUP
+#line 712 "fortrancode.l"
+{
+ codifyLines(fcodeYYtext);
+ yy_push_state(YY_START);
+ BEGIN(Use);
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 717 "fortrancode.l"
+{
+ startFontClass("keywordflow");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+
+ /* append module name to use dict */
+ useEntry = new UseEntry();
+ useEntry->module = fcodeYYtext;
+ useMembers->append(fcodeYYtext, useEntry);
+ addUse(fcodeYYtext);
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 728 "fortrancode.l"
+{ // TODO: rename
+ codifyLines(fcodeYYtext);
+ yy_push_state(YY_START);
+ BEGIN(UseOnly);
+ }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 733 "fortrancode.l"
+{ codifyLines(fcodeYYtext); }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 734 "fortrancode.l"
+{
+ codifyLines(fcodeYYtext);
+ useEntry->onlyNames.append(fcodeYYtext);
+ }
+ YY_BREAK
+case 9:
+/* rule 9 can match eol */
+YY_RULE_SETUP
+#line 738 "fortrancode.l"
+{
+ unput(*fcodeYYtext);
+ yy_pop_state();
+ }
+ YY_BREAK
+/*-------- fortran module -----------------------------------------*/
+case 10:
+/* rule 10 can match eol */
+YY_RULE_SETUP
+#line 744 "fortrancode.l"
+{ //
+ startScope();
+ startFontClass("keyword");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ yy_push_state(YY_START);
+ BEGIN(ClassName);
+ if (!stricmp(fcodeYYtext,"module")) currentModule="module";
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 753 "fortrancode.l"
+{
+ if (currentModule == "module") currentModule=fcodeYYtext;
+ generateLink(*g_code,fcodeYYtext);
+ yy_pop_state();
+ }
+ YY_BREAK
+case 12:
+/* rule 12 can match eol */
+YY_RULE_SETUP
+#line 758 "fortrancode.l"
+{ // interface may be without name
+ yy_pop_state();
+ REJECT;
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 762 "fortrancode.l"
+{ // just reset currentModule, rest is done in following rule
+ currentModule=0;
+ REJECT;
+ }
+ YY_BREAK
+case 14:
+/* rule 14 can match eol */
+YY_RULE_SETUP
+#line 766 "fortrancode.l"
+{ //
+ endScope();
+ startFontClass("keyword");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+/*-------- subprog definition -------------------------------------*/
+case 15:
+/* rule 15 can match eol */
+YY_RULE_SETUP
+#line 774 "fortrancode.l"
+{ // TYPE_SPEC is for old function style function result
+ startFontClass("keyword");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 779 "fortrancode.l"
+{ // Fortran subroutine or function found
+ startFontClass("keyword");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ yy_push_state(YY_START);
+ BEGIN(Subprog);
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 786 "fortrancode.l"
+{ // subroutine/function name
+ // fprintf(stderr, "===> start subprogram %s\n", fcodeYYtext);
+ startScope();
+ generateLink(*g_code,fcodeYYtext);
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 791 "fortrancode.l"
+{ // ignore rest of line
+ codifyLines(fcodeYYtext);
+ }
+ YY_BREAK
+case 19:
+/* rule 19 can match eol */
+YY_RULE_SETUP
+#line 794 "fortrancode.l"
+{ codifyLines(fcodeYYtext);
+ yy_pop_state();
+ }
+ YY_BREAK
+case 20:
+/* rule 20 can match eol */
+YY_RULE_SETUP
+#line 797 "fortrancode.l"
+{ // Fortran subroutine or function ends
+ //cout << "===> end function " << fcodeYYtext << endl;
+ endScope();
+ startFontClass("keyword");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+/*-------- variable declaration ----------------------------------*/
+case 21:
+YY_RULE_SETUP
+#line 805 "fortrancode.l"
+{
+ yy_push_state(YY_START);
+ BEGIN(TypeDecl);
+ startFontClass("keywordtype");
+ g_code->codify(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 812 "fortrancode.l"
+{ // link type
+ g_insideBody=TRUE;
+ generateLink(*g_code,fcodeYYtext);
+ g_insideBody=FALSE;
+ }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 817 "fortrancode.l"
+{
+ BEGIN(Declaration);
+ startFontClass("keywordtype");
+ g_code->codify(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 24:
+/* rule 24 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up fcodeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up fcodeYYtext again */
+YY_RULE_SETUP
+#line 823 "fortrancode.l"
+{
+ yy_push_state(YY_START);
+ BEGIN(Declaration);
+ startFontClass("keywordtype");
+ g_code->codify(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 830 "fortrancode.l"
+{
+ startFontClass("keywordtype");
+ g_code->codify(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 26:
+/* rule 26 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up fcodeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up fcodeYYtext again */
+YY_RULE_SETUP
+#line 835 "fortrancode.l"
+{ //| variable deklaration
+ startFontClass("keywordtype");
+ g_code->codify(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 840 "fortrancode.l"
+{ // local var
+ g_code->codify(fcodeYYtext);
+ if (g_currentMemberDef && g_currentMemberDef->isFunction())
+ addLocalVar(fcodeYYtext);
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 845 "fortrancode.l"
+{ // start of array specification
+ bracketCount++;
+ g_code->codify(fcodeYYtext);
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 850 "fortrancode.l"
+{ // end array specification
+ bracketCount--;
+ g_code->codify(fcodeYYtext);
+ }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 855 "fortrancode.l"
+{ // continuation line
+ yy_push_state(YY_START);
+ BEGIN(DeclContLine);
+ }
+ YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+#line 859 "fortrancode.l"
+{ // declaration not yet finished
+ codifyLines(fcodeYYtext);
+ bracketCount = 0;
+ yy_pop_state();
+ }
+ YY_BREAK
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 864 "fortrancode.l"
+{ // end declaration line
+ codifyLines(fcodeYYtext);
+ bracketCount = 0;
+ yy_pop_state();
+ }
+ YY_BREAK
+/*-------- subprog calls -----------------------------------------*/
+case 33:
+YY_RULE_SETUP
+#line 872 "fortrancode.l"
+{
+ codifyLines(fcodeYYtext);
+ yy_push_state(YY_START);
+ BEGIN(SubCall);
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 877 "fortrancode.l"
+{ // subroutine call
+ g_insideBody=TRUE;
+ generateLink(*g_code, fcodeYYtext);
+ g_insideBody=FALSE;
+ yy_pop_state();
+ }
+ YY_BREAK
+case 35:
+*yy_cp = (yy_hold_char); /* undo effects of setting up fcodeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up fcodeYYtext again */
+YY_RULE_SETUP
+#line 883 "fortrancode.l"
+{ // function call
+ g_insideBody=TRUE;
+ generateLink(*g_code, fcodeYYtext);
+ g_insideBody=FALSE;
+ }
+ YY_BREAK
+/*-------- comments ---------------------------------------------------*/
+case 36:
+/* rule 36 can match eol */
+YY_RULE_SETUP
+#line 890 "fortrancode.l"
+{ // start comment line or comment block
+ yy_push_state(YY_START);
+ BEGIN(DocBlock);
+ docBlock=fcodeYYtext;
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 896 "fortrancode.l"
+{ // contents of current comment line
+ docBlock+=fcodeYYtext;
+ }
+ YY_BREAK
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 899 "fortrancode.l"
+{ //| comment block (next line is also comment line)
+ docBlock+=fcodeYYtext;
+ }
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 902 "fortrancode.l"
+{ // comment block ends at the end of this line
+ docBlock+=fcodeYYtext;
+ // remove special comment (default config)
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr+=((QCString)docBlock).contains('\n');
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ startCodeLine();
+ }
+ }
+ else // do not remove comment
+ {
+ startFontClass("comment");
+ codifyLines(docBlock);
+ endFontClass();
+ }
+ yy_pop_state();
+ }
+ YY_BREAK
+case 40:
+*yy_cp = (yy_hold_char); /* undo effects of setting up fcodeYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up fcodeYYtext again */
+YY_RULE_SETUP
+#line 923 "fortrancode.l"
+{ // normal comment
+ if(YY_START == String) REJECT; // ignore in strings
+ startFontClass("comment");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 930 "fortrancode.l"
+{ // normal comment
+ if(! g_isFixedForm) REJECT;
+
+ startFontClass("comment");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+/*------ preprocessor --------------------------------------------*/
+case 42:
+/* rule 42 can match eol */
+YY_RULE_SETUP
+#line 939 "fortrancode.l"
+{ startFontClass("preprocessor");
+ codifyLines(fcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+/*------ variable references? -------------------------------------*/
+case 43:
+YY_RULE_SETUP
+#line 945 "fortrancode.l"
+{ // ignore references to elements
+ g_code->codify(fcodeYYtext);
+ }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 948 "fortrancode.l"
+{
+ g_insideBody=TRUE;
+ generateLink(*g_code, fcodeYYtext);
+ g_insideBody=FALSE;
+ }
+ YY_BREAK
+/*------ strings --------------------------------------------------*/
+case 45:
+YY_RULE_SETUP
+#line 954 "fortrancode.l"
+{ str+=fcodeYYtext; /* ignore \\ */}
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 955 "fortrancode.l"
+{ str+=fcodeYYtext; /* ignore \" */}
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 957 "fortrancode.l"
+{ // string ends with next quote without previous backspace
+ if(fcodeYYtext[0]!=stringStartSymbol) REJECT; // single vs double quote
+ str+=fcodeYYtext;
+ startFontClass("stringliteral");
+ codifyLines(str);
+ endFontClass();
+ yy_pop_state();
+ }
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 965 "fortrancode.l"
+{str+=fcodeYYtext;}
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 967 "fortrancode.l"
+{ /* string starts */
+ /* if(YY_START == StrIgnore) REJECT; // ignore in simple comments */
+ yy_push_state(YY_START);
+ stringStartSymbol=fcodeYYtext[0]; // single or double quote
+ BEGIN(String);
+ str=fcodeYYtext;
+ }
+ YY_BREAK
+/*-----------------------------------------------------------------------------*/
+case 50:
+/* rule 50 can match eol */
+YY_RULE_SETUP
+#line 976 "fortrancode.l"
+{
+ codifyLines(fcodeYYtext);
+ }
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 979 "fortrancode.l"
+{
+ g_code->codify(fcodeYYtext);
+ }
+ YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 982 "fortrancode.l"
+ECHO;
+ YY_BREAK
+#line 8819 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(Start):
+ case YY_STATE_EOF(SubCall):
+ case YY_STATE_EOF(FuncDef):
+ case YY_STATE_EOF(ClassName):
+ case YY_STATE_EOF(ClassVar):
+ case YY_STATE_EOF(Subprog):
+ case YY_STATE_EOF(DocBlock):
+ case YY_STATE_EOF(Use):
+ case YY_STATE_EOF(UseOnly):
+ case YY_STATE_EOF(TypeDecl):
+ case YY_STATE_EOF(Declaration):
+ case YY_STATE_EOF(DeclContLine):
+ case YY_STATE_EOF(Parameterlist):
+ case YY_STATE_EOF(String):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed fcodeYYin at a new source and called
+ * fcodeYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = fcodeYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( fcodeYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * fcodeYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of fcodeYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ fcodeYYrestart(fcodeYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) fcodeYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 2814 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 2814 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 2813);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up fcodeYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ fcodeYYrestart(fcodeYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( fcodeYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve fcodeYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void fcodeYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ fcodeYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ fcodeYY_create_buffer(fcodeYYin,YY_BUF_SIZE );
+ }
+
+ fcodeYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ fcodeYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void fcodeYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * fcodeYYpop_buffer_state();
+ * fcodeYYpush_buffer_state(new_buffer);
+ */
+ fcodeYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ fcodeYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (fcodeYYwrap()) processing, but the only time this flag
+ * is looked at is after fcodeYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void fcodeYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ fcodeYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE fcodeYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) fcodeYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in fcodeYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) fcodeYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in fcodeYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ fcodeYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with fcodeYY_create_buffer()
+ *
+ */
+ void fcodeYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ fcodeYYfree((void *) b->yy_ch_buf );
+
+ fcodeYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a fcodeYYrestart() or at EOF.
+ */
+ static void fcodeYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ fcodeYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then fcodeYY_init_buffer was _probably_
+ * called from fcodeYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void fcodeYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ fcodeYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void fcodeYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ fcodeYYensure_buffer_stack();
+
+ /* This block is copied from fcodeYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from fcodeYY_switch_to_buffer. */
+ fcodeYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void fcodeYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ fcodeYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ fcodeYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void fcodeYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)fcodeYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in fcodeYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)fcodeYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in fcodeYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE fcodeYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) fcodeYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in fcodeYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ fcodeYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to fcodeYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * fcodeYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE fcodeYY_scan_string (yyconst char * yystr )
+{
+
+ return fcodeYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to fcodeYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE fcodeYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) fcodeYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in fcodeYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = fcodeYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in fcodeYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+ static void yy_push_state (int new_state )
+{
+ if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) )
+ {
+ yy_size_t new_size;
+
+ (yy_start_stack_depth) += YY_START_STACK_INCR;
+ new_size = (yy_start_stack_depth) * sizeof( int );
+
+ if ( ! (yy_start_stack) )
+ (yy_start_stack) = (int *) fcodeYYalloc(new_size );
+
+ else
+ (yy_start_stack) = (int *) fcodeYYrealloc((void *) (yy_start_stack),new_size );
+
+ if ( ! (yy_start_stack) )
+ YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
+ }
+
+ (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START;
+
+ BEGIN(new_state);
+}
+
+ static void yy_pop_state (void)
+{
+ if ( --(yy_start_stack_ptr) < 0 )
+ YY_FATAL_ERROR( "start-condition stack underflow" );
+
+ BEGIN((yy_start_stack)[(yy_start_stack_ptr)]);
+}
+
+ static int yy_top_state (void)
+{
+ return (yy_start_stack)[(yy_start_stack_ptr) - 1];
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up fcodeYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ fcodeYYtext[fcodeYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = fcodeYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ fcodeYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int fcodeYYget_lineno (void)
+{
+
+ return fcodeYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *fcodeYYget_in (void)
+{
+ return fcodeYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *fcodeYYget_out (void)
+{
+ return fcodeYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t fcodeYYget_leng (void)
+{
+ return fcodeYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *fcodeYYget_text (void)
+{
+ return fcodeYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void fcodeYYset_lineno (int line_number )
+{
+
+ fcodeYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see fcodeYY_switch_to_buffer
+ */
+void fcodeYYset_in (FILE * in_str )
+{
+ fcodeYYin = in_str ;
+}
+
+void fcodeYYset_out (FILE * out_str )
+{
+ fcodeYYout = out_str ;
+}
+
+int fcodeYYget_debug (void)
+{
+ return fcodeYY_flex_debug;
+}
+
+void fcodeYYset_debug (int bdebug )
+{
+ fcodeYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from fcodeYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_start_stack_ptr) = 0;
+ (yy_start_stack_depth) = 0;
+ (yy_start_stack) = NULL;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ fcodeYYin = stdin;
+ fcodeYYout = stdout;
+#else
+ fcodeYYin = (FILE *) 0;
+ fcodeYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * fcodeYYlex_init()
+ */
+ return 0;
+}
+
+/* fcodeYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int fcodeYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ fcodeYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ fcodeYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ fcodeYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Destroy the start condition stack. */
+ fcodeYYfree((yy_start_stack) );
+ (yy_start_stack) = NULL;
+
+ fcodeYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * fcodeYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *fcodeYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *fcodeYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void fcodeYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see fcodeYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 982 "fortrancode.l"
+
+
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+/*===================================================================*/
+
+
+void resetFortranCodeParserState() {}
+
+void parseFortranCode(CodeOutputInterface &od,const char *className,const QCString &s,
+ bool exBlock, const char *exName,FileDef *fd,
+ int startLine,int endLine,bool inlineFragment,
+ MemberDef *memberDef,bool)
+{
+ //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd);
+
+ // used parameters
+ (void)memberDef;
+ (void)className;
+
+ if (s.isEmpty()) return;
+ g_code = &od;
+ g_inputString = s;
+ g_inputPosition = 0;
+ g_isFixedForm = recognizeFixedForm((const char*)s);
+ g_currentFontClass = 0;
+ g_needsTermination = FALSE;
+ if (endLine!=-1)
+ g_inputLines = endLine+1;
+ else
+ g_inputLines = countLines();
+
+ if (startLine!=-1)
+ g_yyLineNr = startLine;
+ else
+ g_yyLineNr = 1;
+
+ g_exampleBlock = exBlock;
+ g_exampleName = exName;
+ g_sourceFileDef = fd;
+ if (exBlock && fd==0)
+ {
+ // create a dummy filedef for the example
+ g_sourceFileDef = new FileDef("",exName);
+ }
+ if (g_sourceFileDef)
+ {
+ setCurrentDoc(g_sourceFileDef->name(),g_sourceFileDef->getSourceFileBase());
+ }
+ g_currentDefinition = 0;
+ g_currentMemberDef = 0;
+ if (!g_exampleName.isEmpty())
+ {
+ g_exampleFile = convertNameToFile(g_exampleName+"-example");
+ }
+ g_includeCodeFragment = inlineFragment;
+ startCodeLine();
+ g_parmName.resize(0);
+ g_parmType.resize(0);
+ fcodeYYrestart( fcodeYYin );
+ BEGIN( Start );
+ fcodeYYlex();
+ if (g_needsTermination)
+ {
+ endFontClass();
+ g_code->endCodeLine();
+ }
+ if (exBlock && g_sourceFileDef)
+ {
+ // delete the temporary file definition used for this example
+ delete g_sourceFileDef;
+ g_sourceFileDef=0;
+ }
+ return;
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void fcodeYYdummy() { yy_flex_realloc(0,0); }
+}
+#elif YY_FLEX_SUBMINOR_VERSION<33
+#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
+#else
+extern "C" { // some bogus code to keep the compiler happy
+ void fcodeYYdummy() { yy_top_state(); }
+}
+#endif
+
+
diff --git a/src/fortrancode.h b/src/fortrancode.h
new file mode 100644
index 0000000..d89d846
--- /dev/null
+++ b/src/fortrancode.h
@@ -0,0 +1,35 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef CODE_H
+#define CODE_H
+
+#include "qtbc.h"
+#include <stdio.h>
+
+class CodeOutputInterface;
+class FileDef;
+class MemberDef;
+
+void parseFortranCode(CodeOutputInterface &,const char *,const QCString &,
+ bool ,const char *,FileDef *fd=0,
+ int startLine=-1,int endLine=-1,bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,bool showLineNumbers=TRUE);
+void resetFortranCodeParserState();
+void codeFreeScanner();
+
+#endif
diff --git a/src/fortrancode.l b/src/fortrancode.l
new file mode 100644
index 0000000..aaacffb
--- /dev/null
+++ b/src/fortrancode.l
@@ -0,0 +1,1070 @@
+/******************************************************************************
+ *
+ * Parser for syntax hightlighting and references for Fortran90 F subset
+ *
+ * Copyright (C) by Anke Visser
+ * based on the work of Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/**
+ @todo - continutation lines not always recognized
+ - merging of use-statements with same module name and different only-names
+ - rename part of use-statement
+ - links to interface functions
+ - references to variables
+**/
+
+%{
+
+/*
+ * includes
+ */
+#include "qtbc.h"
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <qregexp.h>
+#include <qdir.h>
+#include <qstringlist.h>
+#include "entry.h"
+#include "doxygen.h"
+#include "message.h"
+#include "outputlist.h"
+#include "util.h"
+#include "membername.h"
+#include "searchindex.h"
+#include "defargs.h"
+
+#define YY_NEVER_INTERACTIVE 1
+#define YY_NO_TOP_STATE 1
+
+//--------------------------------------------------------------------------------
+
+/**
+ data of an use-statement
+*/
+class UseEntry
+{
+ public:
+ QCString module; // just for debug
+ QStringList onlyNames; /* entries of the ONLY-part */
+};
+
+/**
+ module name -> list of ONLY/remote entries
+ (module name = name of the module, which can be accessed via use-directive)
+*/
+class UseSDict : public SDict<UseEntry>
+{
+ public:
+ UseSDict() : SDict<UseEntry>(17) {}
+};
+
+/**
+ Contains names of used modules and names of local variables.
+*/
+class Scope
+{
+ public:
+ QStringList useNames; //!< contains names of used modules
+ QDict<void> localVars; //!< contains names of local variables
+
+ Scope() : localVars(7, FALSE /*caseSensitive*/) {}
+};
+
+/*===================================================================*/
+/*
+ * statics
+ */
+
+static QCString docBlock; //!< contents of all lines of a documentation block
+static QCString currentModule=0; //!< name of the current enclosing module
+static UseSDict *useMembers= new UseSDict; //!< info about used modules
+static UseEntry *useEntry = 0; //!< current use statement info
+static QList<Scope> scopeStack;
+// static QStringList *currentUseNames= new QStringList; //! contains names of used modules of current program unit
+static QCString str=""; //!> contents of fortran string
+
+static CodeOutputInterface * g_code;
+
+// TODO: is this still needed? if so, make it work
+static QCString g_parmType;
+static QCString g_parmName;
+
+static const char * g_inputString; //!< the code fragment as text
+static int g_inputPosition; //!< read offset during parsing
+static int g_inputLines; //!< number of line in the code fragment
+static int g_yyLineNr; //!< current line number
+static bool g_needsTermination;
+static bool g_isFixedForm;
+
+static bool g_insideBody; //!< inside subprog/program body? => create links
+static const char * g_currentFontClass;
+
+static bool g_exampleBlock;
+static QCString g_exampleName;
+static QCString g_exampleFile;
+
+static FileDef * g_sourceFileDef;
+static Definition * g_currentDefinition;
+static MemberDef * g_currentMemberDef;
+static bool g_includeCodeFragment;
+
+static char stringStartSymbol; // single or double quote
+// count in variable declaration to filter out
+// declared from referenced names
+static int bracketCount = 0;
+
+// simplified way to know if this is fixed form
+// duplicate in fortranscanner.l
+static bool recognizeFixedForm(const char* contents)
+{
+ int column=0;
+ bool skipLine=FALSE;
+
+ for (int i=0;;i++)
+ {
+ column++;
+
+ switch(contents[i])
+ {
+ case '\n':
+ column=0;
+ skipLine=FALSE;
+ break;
+ case ' ':
+ break;
+ case '\000':
+ return FALSE;
+ case 'C':
+ case 'c':
+ case '*':
+ if(column==1) return TRUE;
+ if(skipLine) break;
+ return FALSE;
+ case '!':
+ if(column>1 && column<7) return FALSE;
+ skipLine=TRUE;
+ break;
+ default:
+ if(skipLine) break;
+ if(column==7) return TRUE;
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+static void endFontClass()
+{
+ if (g_currentFontClass)
+ {
+ g_code->endFontClass();
+ g_currentFontClass=0;
+ }
+}
+
+static void startFontClass(const char *s)
+{
+ endFontClass();
+ g_code->startFontClass(s);
+ g_currentFontClass=s;
+}
+
+static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
+ }
+}
+
+static void addToSearchIndex(const char *text)
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->addWord(text,FALSE);
+ }
+}
+
+/*! start a new line of code, inserting a line number if g_sourceFileDef
+ * is TRUE. If a definition starts at the current line, then the line
+ * number is linked to the documentation of that definition.
+ */
+static void startCodeLine()
+{
+ if (g_sourceFileDef)
+ {
+ //QCString lineNumber,lineAnchor;
+ //lineNumber.sprintf("%05d",g_yyLineNr);
+ //lineAnchor.sprintf("l%05d",g_yyLineNr);
+
+ Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
+ //printf("startCodeLine %d d=%s\n", g_yyLineNr,d ? d->name().data() : "<null>");
+ if (!g_includeCodeFragment && d)
+ {
+ g_currentDefinition = d;
+ g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
+ g_insideBody = FALSE;
+ g_parmType.resize(0);
+ g_parmName.resize(0);
+ QCString lineAnchor;
+ lineAnchor.sprintf("l%05d",g_yyLineNr);
+ if (g_currentMemberDef)
+ {
+ g_code->writeLineNumber(g_currentMemberDef->getReference(),
+ g_currentMemberDef->getOutputFileBase(),
+ g_currentMemberDef->anchor(),g_yyLineNr);
+ setCurrentDoc(
+ g_currentMemberDef->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ else if (d->isLinkableInProject())
+ {
+ g_code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,g_yyLineNr);
+ setCurrentDoc(
+ d->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ }
+ else
+ {
+ g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ }
+ }
+ g_code->startCodeLine();
+ if (g_currentFontClass)
+ {
+ g_code->startFontClass(g_currentFontClass);
+ }
+}
+
+
+static void endFontClass();
+static void endCodeLine()
+{
+ endFontClass();
+ g_code->endCodeLine();
+}
+
+/*! write a code fragment `text' that may span multiple lines, inserting
+ * line numbers for each line.
+ */
+static void codifyLines(char *text)
+{
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ g_code->codify(sp);
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ startCodeLine();
+ }
+ }
+ else
+ {
+ g_code->codify(sp);
+ done=TRUE;
+ }
+ }
+}
+
+static void codifyLines(QCString str)
+{
+ char *tmp= (char *) malloc(str.length()+1);
+ strcpy(tmp, str);
+ codifyLines(tmp);
+ free(tmp);
+}
+
+/*! writes a link to a fragment \a text that may span multiple lines, inserting
+ * line numbers for each line. If \a text contains newlines, the link will be
+ * split into multiple links with the same destination, one for each line.
+ */
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const char *ref,const char *file,
+ const char *anchor,const char *text)
+{
+ bool done=FALSE;
+ char *p=(char *)text;
+ while (!done)
+ {
+ char *sp=p;
+ char c;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,0);
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ startCodeLine();
+ }
+ }
+ else
+ {
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,0);
+ done=TRUE;
+ }
+ }
+}
+
+/**
+ generates dictionay entries that are used if REFERENCED_BY_RELATION ... options are set
+ (e.g. the "referenced by ..." list after the function documentation)
+*/
+
+static void addDocCrossReference(MemberDef *src, MemberDef *dst)
+{
+ if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+ //printf("======= addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+ if ((Config_getBool("REFERENCED_BY_RELATION") || Config_getBool("CALLER_GRAPH")) &&
+ (src->isFunction()))
+ {
+ dst->addSourceReferencedBy(src);
+ }
+ if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) && (src->isFunction()))
+ {
+ src->addSourceReferences(dst);
+ }
+}
+
+//-------------------------------------------------------------------------------
+/**
+ searches for definition of a type
+ @param tname the name of the type
+ @param moduleName name of enclosing module or null, if global entry
+ @param cd the entry, if found or null
+ @param useDict dictionary of data of USE-statement
+ @returns true, if type is found
+*/
+static bool getFortranTypeDefs(const QCString &tname, const QCString &moduleName,
+ ClassDef *&cd, UseSDict *usedict=0)
+{
+ if (tname.isEmpty()) return FALSE; /* empty name => nothing to link */
+
+ //cout << "=== search for type: " << tname << endl;
+
+ // search for type
+ if ((cd=Doxygen::classSDict->find(tname)))
+ {
+ //cout << "=== type found in global module" << endl;
+ return TRUE;
+ }
+ else if (moduleName && (cd= Doxygen::classSDict->find(moduleName+"::"+tname)))
+ {
+ //cout << "=== type found in local module" << endl;
+ return TRUE;
+ }
+ else
+ {
+ UseEntry *use;
+ for (UseSDict::Iterator di(*usedict); (use=di.current()); ++di)
+ if ((cd= Doxygen::classSDict->find(use->module+"::"+tname)))
+ {
+ //cout << "=== type found in used module" << endl;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/**
+ searches for definition of function memberName
+ @param memberName the name of the function/variable
+ @param moduleName name of enclosing module or null, if global entry
+ @param md the entry, if found or null
+ @param usedict array of data of USE-statement
+ @returns true, if found
+*/
+static bool getFortranDefs(const QCString &memberName, const QCString &moduleName,
+ MemberDef *&md, UseSDict *usedict=0)
+{
+ if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */
+
+ // look in local variables
+ for (Scope *scope=scopeStack.last(); scope!=NULL; scope=scopeStack.prev())
+ {
+ if(scope->localVars.find(memberName))
+ return FALSE;
+ }
+
+ // search for function
+ MemberName *mn = Doxygen::functionNameSDict->find(memberName);
+
+ if (mn) // name is known
+ {
+ MemberListIterator mli(*mn);
+ for (mli.toFirst();(md=mli.current());++mli) // all found functions with given name
+ {
+ FileDef *fd=md->getFileDef();
+ GroupDef *gd=md->getGroupDef();
+
+ //cout << "found link with same name: " << fd->fileName() << " " << memberName;
+ //if (md->getNamespaceDef() != 0) cout << " in namespace " << md->getNamespaceDef()->name();cout << endl;
+
+ if ((gd && gd->isLinkable()) || (fd && fd->isLinkable()))
+ {
+ NamespaceDef *nspace= md->getNamespaceDef();
+
+ if (nspace == 0)
+ { // found function in global scope
+ return TRUE;
+ }
+ else if (moduleName == nspace->name())
+ { // found in local scope
+ return TRUE;
+ }
+ else
+ { // else search in used modules
+ QCString moduleName= nspace->name();
+ UseEntry *ue= usedict->find(moduleName);
+ if (ue)
+ {
+ // check if only-list exists and if current entry exists is this list
+ QStringList &only= ue->onlyNames;
+ if (only.isEmpty())
+ {
+ //cout << " found in module " << moduleName << " entry " << memberName << endl;
+ return TRUE; // whole module used
+ }
+ else
+ {
+ for ( QStringList::Iterator it = only.begin(); it != only.end(); ++it)
+ {
+ //cout << " search in only: " << moduleName << ":: " << memberName << "==" << (*it)<< endl;
+ if (memberName == (QCString)(*it))
+ return TRUE; // found in ONLY-part of use list
+ }
+ }
+ }
+ }
+ } // if linkable
+ } // for
+ }
+ return FALSE;
+}
+
+/**
+ gets the link to a generic procedure which depends not on the name, but on the parameter list
+ @todo implementation
+*/
+static bool getGenericProcedureLink(const ClassDef *cd,
+ const char *memberText,
+ CodeOutputInterface &ol)
+{
+ (void)cd;
+ (void)memberText;
+ (void)ol;
+ return FALSE;
+}
+
+static bool getLink(UseSDict *usedict, // dictonary with used modules
+ const char *memberText, // exact member text
+ CodeOutputInterface &ol,
+ const char *text)
+{
+ MemberDef *md;
+ QCString memberName= removeRedundantWhiteSpace(memberText);
+
+ if (getFortranDefs(memberName, currentModule, md, usedict) && md->isLinkable())
+ {
+ //if (md->isVariable()) return FALSE; // variables aren't handled yet
+
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ if (d && d->isLinkable())
+ {
+ if (g_currentDefinition && g_currentMemberDef && md!=g_currentMemberDef && g_insideBody)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ ol.linkableSymbol(g_yyLineNr,md->name(),md,
+ g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
+ writeMultiLineCodeLink(ol,md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ text ? text : memberText);
+ addToSearchIndex(text ? text : memberText);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+static void generateLink(CodeOutputInterface &ol, char *lname)
+{
+ ClassDef *cd=0;
+
+ // check if lname is a linkable type or interface
+ if ( (getFortranTypeDefs(lname, currentModule, cd, useMembers)) && cd->isLinkable() )
+ {
+ if ( (cd->compoundType() == ClassDef::Class) && // was Entry::INTERFACE_SEC) &&
+ (getGenericProcedureLink(cd, lname, ol)) )
+ {
+ //cout << "=== generic procedure resolved" << endl;
+ }
+ else
+ { // write type or interface link
+ ol.linkableSymbol(g_yyLineNr, lname, cd, g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),lname);
+ addToSearchIndex(lname);
+ }
+ }
+ // check for function/variable
+ else if (getLink(useMembers, lname, ol, lname))
+ {
+ //cout << "=== found link for " << lname << endl;
+ }
+ else
+ {
+ // nothing found, just write out the word
+ ol.linkableSymbol(g_yyLineNr, lname, 0, g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ //startFontClass("charliteral"); //test
+ codifyLines(lname);
+ //endFontClass(); //test
+ addToSearchIndex(lname);
+ }
+}
+
+/*! counts the number of lines in the input */
+static int countLines()
+{
+ const char *p=g_inputString;
+ char c;
+ int count=1;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
+ }
+ if (p>g_inputString && *(p-1)!='\n')
+ { // last line does not end with a \n, so we add an extra
+ // line and explicitly terminate the line after parsing.
+ count++,
+ g_needsTermination=TRUE;
+ }
+ return count;
+}
+
+//----------------------------------------------------------------------------
+/** start scope */
+void startScope()
+{
+ // fprintf(stderr, "===> startScope %s",yytext);
+ Scope *scope = new Scope;
+ scopeStack.append(scope);
+}
+
+/** end scope */
+void endScope()
+{
+ // fprintf(stderr,"===> endScope %s",yytext);
+ if (scopeStack.isEmpty())
+ {
+ fprintf(stderr,"WARNING: fortrancode.l: stack empty!");
+ return;
+ //exit(-1);
+ }
+
+ Scope *scope = scopeStack.getLast();
+ scopeStack.removeLast();
+ for ( QStringList::Iterator it = scope->useNames.begin(); it != scope->useNames.end(); ++it)
+ {
+ useMembers->remove(*it);
+ }
+ delete scope;
+}
+
+void addUse(QString moduleName)
+{
+ if (!scopeStack.isEmpty())
+ scopeStack.last()->useNames.append(moduleName);
+}
+
+void addLocalVar(QString varName)
+{
+ if (!scopeStack.isEmpty())
+ scopeStack.last()->localVars.insert(varName, (void*)1);
+}
+
+//----------------------------------------------------------------------------
+
+/* -----------------------------------------------------------------*/
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+%}
+
+IDSYM [a-z_A-Z0-9]
+ID [a-z_A-Z]+{IDSYM}*
+SUBPROG (subroutine|function)
+B [ \t]
+BS [ \t]*
+BS_ [ \t]+
+COMMA {BS},{BS}
+ARGS_L0 ("("[^)]*")")
+ARGS_L1a [^()]*"("[^)]*")"[^)]*
+ARGS_L1 ("("{ARGS_L1a}*")")
+ARGS_L2 "("({ARGS_L0}|[^()]|{ARGS_L1a}|{ARGS_L1})*")"
+ARGS {BS}({ARGS_L0}|{ARGS_L1}|{ARGS_L2})
+
+NUM_TYPE (complex|integer|logical|real)
+KIND {ARGS}
+CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
+TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}PRECISION|{CHAR}|TYPE{ARGS})
+
+INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
+ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL)
+ACCESS_SPEC (PRIVATE|PUBLIC)
+/* Assume that attribute statements are almost the same as attributes. */
+ATTR_STMT {ATTR_SPEC}|DIMENSION
+COMMANDS (BLOCK{BS}DATA|DO|SELECT|CASE|WHERE|IF|THEN|ELSE|MODULE{BS_}PROCEDURE|CONTAINS|IMPLICIT{BS}NONE|CONTAINS|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|DEALLOCATE|SIZE|END{BS}IF|END{BS}DO|WHILE|INQUIRE|OPEN|CLOSE|DATA)
+IGNORE (CALL)
+
+/* | */
+
+%option noyywrap
+%option stack
+%option caseless
+/*%option debug*/
+
+%x Start
+%x SubCall
+%x FuncDef
+%x ClassName
+%x ClassVar
+%x Subprog
+%x DocBlock
+%x Use
+%x UseOnly
+%x TypeDecl
+%x Declaration
+%x DeclContLine
+%x Parameterlist
+%x String
+
+%%
+ /*==================================================================*/
+
+ /*-------- ignore ------------------------------------------------------------*/
+
+<Start>{IGNORE}/{BS}"("? { // do not search keywords, intrinsics... TODO: complete list
+ codifyLines(yytext);
+ }
+ /*-------- inner construct ---------------------------------------------------*/
+
+<Start>{COMMANDS}/[,( \t\n].* { // hightlight rest of fortran statements
+ /* font class is defined e.g. in doxygen.css */
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+<Start>"end"({BS_}{COMMANDS})?/[ \t\n] {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+
+ /*-------- use statement -------------------------------------------*/
+<Start>"use"{BS_} {
+ codifyLines(yytext);
+ yy_push_state(YY_START);
+ BEGIN(Use);
+ }
+<Use>{ID} {
+ startFontClass("keywordflow");
+ codifyLines(yytext);
+ endFontClass();
+
+ /* append module name to use dict */
+ useEntry = new UseEntry();
+ useEntry->module = yytext;
+ useMembers->append(yytext, useEntry);
+ addUse(yytext);
+ }
+<Use>,{BS}"ONLY" { // TODO: rename
+ codifyLines(yytext);
+ yy_push_state(YY_START);
+ BEGIN(UseOnly);
+ }
+<UseOnly>{BS},{BS} { codifyLines(yytext); }
+<UseOnly>{ID} {
+ codifyLines(yytext);
+ useEntry->onlyNames.append(yytext);
+ }
+<Use,UseOnly>"\n" {
+ unput(*yytext);
+ yy_pop_state();
+ }
+
+ /*-------- fortran module -----------------------------------------*/
+<Start>("program"|"module"|"type"|"interface")/{BS_}|({COMMA}{ACCESS_SPEC})|\n { //
+ startScope();
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ yy_push_state(YY_START);
+ BEGIN(ClassName);
+ if (!stricmp(yytext,"module")) currentModule="module";
+ }
+<ClassName>{ID} {
+ if (currentModule == "module") currentModule=yytext;
+ generateLink(*g_code,yytext);
+ yy_pop_state();
+ }
+<ClassName>\n { // interface may be without name
+ yy_pop_state();
+ REJECT;
+ }
+<Start>"end"({BS_}"module").* { // just reset currentModule, rest is done in following rule
+ currentModule=0;
+ REJECT;
+ }
+<Start>^{BS}"end"({BS}("program"|"module"|"type"|"interface")({BS_}{ID})?)?{BS}/(\n|!) { //
+ endScope();
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+
+ /*-------- subprog definition -------------------------------------*/
+<Start>{TYPE_SPEC}{BS}/{SUBPROG}{BS_} { // TYPE_SPEC is for old function style function result
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+<Start>{SUBPROG}{BS_} { // Fortran subroutine or function found
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ yy_push_state(YY_START);
+ BEGIN(Subprog);
+ }
+<Subprog>{ID} { // subroutine/function name
+ // fprintf(stderr, "===> start subprogram %s\n", yytext);
+ startScope();
+ generateLink(*g_code,yytext);
+ }
+<Subprog>"(".* { // ignore rest of line
+ codifyLines(yytext);
+ }
+<Subprog>"\n" { codifyLines(yytext);
+ yy_pop_state();
+ }
+<Start>^{BS}"end"({BS}{SUBPROG}({BS_}{ID})?)?{BS}/(\n|!) { // Fortran subroutine or function ends
+ //cout << "===> end function " << yytext << endl;
+ endScope();
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+ }
+ /*-------- variable declaration ----------------------------------*/
+<Start>"TYPE"{BS}"(" {
+ yy_push_state(YY_START);
+ BEGIN(TypeDecl);
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<TypeDecl>{ID} { // link type
+ g_insideBody=TRUE;
+ generateLink(*g_code,yytext);
+ g_insideBody=FALSE;
+ }
+<TypeDecl>")" {
+ BEGIN(Declaration);
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<Start>{TYPE_SPEC}/[,:( ] {
+ yy_push_state(YY_START);
+ BEGIN(Declaration);
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<Start>{ATTR_SPEC} {
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<Declaration>({TYPE_SPEC}|{ATTR_SPEC})/[,:( ] { //| variable deklaration
+ startFontClass("keywordtype");
+ g_code->codify(yytext);
+ endFontClass();
+ }
+<Declaration>{ID} { // local var
+ g_code->codify(yytext);
+ if (g_currentMemberDef && g_currentMemberDef->isFunction())
+ addLocalVar(yytext);
+ }
+<Declaration>[(] { // start of array specification
+ bracketCount++;
+ g_code->codify(yytext);
+ }
+
+<Declaration>[)] { // end array specification
+ bracketCount--;
+ g_code->codify(yytext);
+ }
+
+<Declaration>"&" { // continuation line
+ yy_push_state(YY_START);
+ BEGIN(DeclContLine);
+ }
+<DeclContLine>"\n" { // declaration not yet finished
+ codifyLines(yytext);
+ bracketCount = 0;
+ yy_pop_state();
+ }
+<Declaration>"\n" { // end declaration line
+ codifyLines(yytext);
+ bracketCount = 0;
+ yy_pop_state();
+ }
+
+ /*-------- subprog calls -----------------------------------------*/
+
+<Start>"call"{BS_} {
+ codifyLines(yytext);
+ yy_push_state(YY_START);
+ BEGIN(SubCall);
+ }
+<SubCall>{ID} { // subroutine call
+ g_insideBody=TRUE;
+ generateLink(*g_code, yytext);
+ g_insideBody=FALSE;
+ yy_pop_state();
+ }
+<Start>{ID}{BS}/"(" { // function call
+ g_insideBody=TRUE;
+ generateLink(*g_code, yytext);
+ g_insideBody=FALSE;
+ }
+
+ /*-------- comments ---------------------------------------------------*/
+<Start>\n?{BS}"!>" { // start comment line or comment block
+ yy_push_state(YY_START);
+ BEGIN(DocBlock);
+ docBlock=yytext;
+ }
+
+<DocBlock>.* { // contents of current comment line
+ docBlock+=yytext;
+ }
+<DocBlock>"\n"{BS}("!>"|"!"+) { //| comment block (next line is also comment line)
+ docBlock+=yytext;
+ }
+<DocBlock>"\n" { // comment block ends at the end of this line
+ docBlock+=yytext;
+ // remove special comment (default config)
+ if (Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr+=((QCString)docBlock).contains('\n');
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ startCodeLine();
+ }
+ }
+ else // do not remove comment
+ {
+ startFontClass("comment");
+ codifyLines(docBlock);
+ endFontClass();
+ }
+ yy_pop_state();
+ }
+
+<*>"!"[^>\n].*|"!"$ { // normal comment
+ if(YY_START == String) REJECT; // ignore in strings
+ startFontClass("comment");
+ codifyLines(yytext);
+ endFontClass();
+ }
+
+<*>^[Cc*].* { // normal comment
+ if(! g_isFixedForm) REJECT;
+
+ startFontClass("comment");
+ codifyLines(yytext);
+ endFontClass();
+ }
+
+ /*------ preprocessor --------------------------------------------*/
+<Start>"#".*\n { startFontClass("preprocessor");
+ codifyLines(yytext);
+ endFontClass();
+ }
+ /*------ variable references? -------------------------------------*/
+
+<Start>"%"{BS}{ID} { // ignore references to elements
+ g_code->codify(yytext);
+ }
+<Start>{ID} {
+ g_insideBody=TRUE;
+ generateLink(*g_code, yytext);
+ g_insideBody=FALSE;
+ }
+ /*------ strings --------------------------------------------------*/
+<*>"\\\\" { str+=yytext; /* ignore \\ */}
+<*>"\\\""|\\\' { str+=yytext; /* ignore \" */}
+
+<String>\"|\' { // string ends with next quote without previous backspace
+ if(yytext[0]!=stringStartSymbol) REJECT; // single vs double quote
+ str+=yytext;
+ startFontClass("stringliteral");
+ codifyLines(str);
+ endFontClass();
+ yy_pop_state();
+ }
+<String>. {str+=yytext;}
+
+<*>\"|\' { /* string starts */
+ /* if(YY_START == StrIgnore) REJECT; // ignore in simple comments */
+ yy_push_state(YY_START);
+ stringStartSymbol=yytext[0]; // single or double quote
+ BEGIN(String);
+ str=yytext;
+ }
+ /*-----------------------------------------------------------------------------*/
+
+<*>\n {
+ codifyLines(yytext);
+ }
+<*>. {
+ g_code->codify(yytext);
+ }
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+/*===================================================================*/
+
+
+void resetFortranCodeParserState() {}
+
+void parseFortranCode(CodeOutputInterface &od,const char *className,const QCString &s,
+ bool exBlock, const char *exName,FileDef *fd,
+ int startLine,int endLine,bool inlineFragment,
+ MemberDef *memberDef,bool)
+{
+ //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd);
+
+ // used parameters
+ (void)memberDef;
+ (void)className;
+
+ if (s.isEmpty()) return;
+ g_code = &od;
+ g_inputString = s;
+ g_inputPosition = 0;
+ g_isFixedForm = recognizeFixedForm((const char*)s);
+ g_currentFontClass = 0;
+ g_needsTermination = FALSE;
+ if (endLine!=-1)
+ g_inputLines = endLine+1;
+ else
+ g_inputLines = countLines();
+
+ if (startLine!=-1)
+ g_yyLineNr = startLine;
+ else
+ g_yyLineNr = 1;
+
+ g_exampleBlock = exBlock;
+ g_exampleName = exName;
+ g_sourceFileDef = fd;
+ if (exBlock && fd==0)
+ {
+ // create a dummy filedef for the example
+ g_sourceFileDef = new FileDef("",exName);
+ }
+ if (g_sourceFileDef)
+ {
+ setCurrentDoc(g_sourceFileDef->name(),g_sourceFileDef->getSourceFileBase());
+ }
+ g_currentDefinition = 0;
+ g_currentMemberDef = 0;
+ if (!g_exampleName.isEmpty())
+ {
+ g_exampleFile = convertNameToFile(g_exampleName+"-example");
+ }
+ g_includeCodeFragment = inlineFragment;
+ startCodeLine();
+ g_parmName.resize(0);
+ g_parmType.resize(0);
+ fcodeYYrestart( fcodeYYin );
+ BEGIN( Start );
+ fcodeYYlex();
+ if (g_needsTermination)
+ {
+ endFontClass();
+ g_code->endCodeLine();
+ }
+ if (exBlock && g_sourceFileDef)
+ {
+ // delete the temporary file definition used for this example
+ delete g_sourceFileDef;
+ g_sourceFileDef=0;
+ }
+ return;
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void fcodeYYdummy() { yy_flex_realloc(0,0); }
+}
+#elif YY_FLEX_SUBMINOR_VERSION<33
+#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
+#else
+extern "C" { // some bogus code to keep the compiler happy
+ void fcodeYYdummy() { yy_top_state(); }
+}
+#endif
+
diff --git a/src/fortranscanner.cpp b/src/fortranscanner.cpp
new file mode 100644
index 0000000..8623b05
--- /dev/null
+++ b/src/fortranscanner.cpp
@@ -0,0 +1,27350 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer fscanYY_create_buffer
+#define yy_delete_buffer fscanYY_delete_buffer
+#define yy_flex_debug fscanYY_flex_debug
+#define yy_init_buffer fscanYY_init_buffer
+#define yy_flush_buffer fscanYY_flush_buffer
+#define yy_load_buffer_state fscanYY_load_buffer_state
+#define yy_switch_to_buffer fscanYY_switch_to_buffer
+#define yyin fscanYYin
+#define yyleng fscanYYleng
+#define yylex fscanYYlex
+#define yylineno fscanYYlineno
+#define yyout fscanYYout
+#define yyrestart fscanYYrestart
+#define yytext fscanYYtext
+#define yywrap fscanYYwrap
+#define yyalloc fscanYYalloc
+#define yyrealloc fscanYYrealloc
+#define yyfree fscanYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE fscanYYrestart(fscanYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t fscanYYleng;
+
+extern FILE *fscanYYin, *fscanYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up fscanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up fscanYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via fscanYYrestart()), so that the user can continue scanning by
+ * just pointing fscanYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when fscanYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t fscanYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow fscanYYwrap()'s to do buffer switches
+ * instead of setting up a fresh fscanYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void fscanYYrestart (FILE *input_file );
+void fscanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE fscanYY_create_buffer (FILE *file,int size );
+void fscanYY_delete_buffer (YY_BUFFER_STATE b );
+void fscanYY_flush_buffer (YY_BUFFER_STATE b );
+void fscanYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void fscanYYpop_buffer_state (void );
+
+static void fscanYYensure_buffer_stack (void );
+static void fscanYY_load_buffer_state (void );
+static void fscanYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER fscanYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE fscanYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE fscanYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE fscanYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *fscanYYalloc (yy_size_t );
+void *fscanYYrealloc (void *,yy_size_t );
+void fscanYYfree (void * );
+
+#define yy_new_buffer fscanYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ fscanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ fscanYY_create_buffer(fscanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ fscanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ fscanYY_create_buffer(fscanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define fscanYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *fscanYYin = (FILE *) 0, *fscanYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int fscanYYlineno;
+
+int fscanYYlineno = 1;
+
+extern char *fscanYYtext;
+#define yytext_ptr fscanYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up fscanYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ fscanYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 99
+#define YY_END_OF_BUFFER 100
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[5096] =
+ { 0,
+ 83, 83, 87, 87, 61, 61, 65, 65, 94, 94,
+ 92, 92, 100, 98, 99, 97, 99, 98, 99, 6,
+ 98, 99, 98, 99, 98, 99, 1, 97, 99, 98,
+ 99, 6, 98, 99, 98, 99, 83, 98, 99, 84,
+ 98, 99, 83, 98, 99, 84, 98, 99, 98, 99,
+ 98, 99, 98, 99, 98, 99, 98, 99, 98, 99,
+ 87, 98, 99, 89, 97, 99, 88, 98, 99, 85,
+ 98, 99, 86, 98, 99, 87, 98, 99, 87, 98,
+ 99, 1, 89, 97, 99, 88, 98, 99, 85, 98,
+ 99, 86, 98, 99, 87, 98, 99, 98, 99, 59,
+
+ 98, 99, 59, 98, 99, 59, 98, 99, 59, 98,
+ 99, 59, 98, 99, 59, 98, 99, 59, 98, 99,
+ 59, 98, 99, 59, 98, 99, 59, 98, 99, 59,
+ 98, 99, 59, 98, 99, 98, 99, 98, 99, 56,
+ 59, 98, 99, 98, 99, 56, 59, 98, 99, 56,
+ 59, 98, 99, 56, 59, 98, 99, 56, 59, 98,
+ 99, 56, 59, 98, 99, 56, 59, 98, 99, 56,
+ 59, 98, 99, 56, 59, 98, 99, 56, 59, 98,
+ 99, 56, 59, 98, 99, 56, 59, 98, 99, 56,
+ 59, 98, 99, 56, 59, 98, 99, 56, 59, 98,
+
+ 99, 98, 99, 98, 99, 98, 99, 98, 99, 98,
+ 99, 98, 99, 98, 99, 98, 99, 98, 99, 98,
+ 99, 98, 99, 98, 99, 98, 99, 59, 98, 99,
+ 59, 98, 99, 98, 99, 56, 59, 98, 99, 56,
+ 59, 98, 99, 56, 59, 98, 99, 56, 59, 98,
+ 99, 56, 59, 98, 99, 56, 59, 98, 99, 31,
+ 98, 99, 31, 98, 99, 32, 98, 99, 32, 98,
+ 99, 59, 98, 99, 98, 99, 56, 59, 98, 99,
+ 56, 59, 98, 99, 98, 99, 98, 99, 64, 98,
+ 99, 61, 64, 98, 99, 64, 98, 99, 6, 64,
+
+ 98, 99, 60, 64, 98, 99, 64, 98, 99, 64,
+ 98, 99, 64, 98, 99, 64, 98, 99, 64, 98,
+ 99, 64, 98, 99, 64, 98, 99, 64, 98, 99,
+ 64, 98, 99, 64, 98, 99, 64, 98, 99, 64,
+ 98, 99, 61, 64, 98, 99, 64, 98, 99, 6,
+ 64, 98, 99, 60, 64, 98, 99, 64, 98, 99,
+ 64, 98, 99, 64, 98, 99, 64, 98, 99, 64,
+ 98, 99, 64, 98, 99, 64, 98, 99, 64, 98,
+ 99, 64, 98, 99, 64, 98, 99, 64, 98, 99,
+ 65, 98, 99, 70, 97, 99, 98, 99, 66, 98,
+
+ 99, 98, 99, 68, 98, 99, 98, 99, 69, 98,
+ 99, 65, 98, 99, 1, 70, 97, 99, 98, 99,
+ 66, 98, 99, 98, 99, 68, 98, 99, 98, 99,
+ 69, 98, 99, 79, 98, 99, 79, 98, 99, 78,
+ 97, 99, 78, 79, 98, 99, 6, 79, 98, 99,
+ 75, 79, 98, 99, 76, 79, 98, 99, 77, 79,
+ 98, 99, 79, 98, 99, 79, 98, 99, 79, 98,
+ 99, 1, 78, 97, 99, 78, 79, 98, 99, 6,
+ 79, 98, 99, 75, 79, 98, 99, 76, 79, 98,
+ 99, 77, 79, 98, 99, 79, 98, 99, 74, 98,
+
+ 99, 74, 98, 99, 6, 74, 98, 99, 74, 98,
+ 99, 74, 98, 99, 74, 98, 99, 74, 98, 99,
+ 74, 98, 99, 6, 74, 98, 99, 74, 98, 99,
+ 74, 98, 99, 74, 98, 99, 98, 99, 43, 98,
+ 99, 36, 98, 99, 98, 99, 43, 98, 99, 43,
+ 98, 99, 43, 98, 99, 43, 98, 99, 98, 99,
+ 43, 98, 99, 36, 98, 99, 98, 99, 43, 98,
+ 99, 43, 98, 99, 43, 98, 99, 43, 98, 99,
+ 98, 99, 56, 59, 98, 99, 56, 59, 98, 99,
+ 56, 59, 98, 99, 56, 59, 98, 99, 56, 59,
+
+ 98, 99, 56, 59, 98, 99, 56, 59, 98, 99,
+ 56, 59, 98, 99, 56, 59, 98, 99, 56, 59,
+ 98, 99, 98, 99, 52, 97, 99, 50, 98, 99,
+ 47, 98, 99, 98, 99, 98, 99, 50, 98, 99,
+ 50, 98, 99, 50, 98, 99, 50, 98, 99, 50,
+ 98, 99, 50, 98, 99, 50, 98, 99, 50, 98,
+ 99, 50, 98, 99, 98, 99, 1, 52, 97, 99,
+ 50, 98, 99, 47, 98, 99, 98, 99, 98, 99,
+ 50, 98, 99, 50, 98, 99, 50, 98, 99, 50,
+ 98, 99, 50, 98, 99, 50, 98, 99, 50, 98,
+
+ 99, 50, 98, 99, 50, 98, 99, 50, 98, 99,
+ 50, 98, 99, 24, 98, 99, 24, 98, 99, 6,
+ 24, 98, 99, 24, 98, 99, 24, 98, 99, 24,
+ 98, 99, 24, 98, 99, 24, 98, 99, 6, 24,
+ 98, 99, 24, 98, 99, 24, 98, 99, 24, 98,
+ 99, 24, 98, 99, 24, 98, 99, 24, 98, 99,
+ 24, 98, 99, 24, 98, 99, 24, 98, 99, 24,
+ 98, 99, 24, 98, 99, 24, 98, 99, 9, 98,
+ 99, 8, 97, 99, 9, 98, 99, 6, 9, 98,
+ 99, 9, 98, 99, 9, 98, 99, 1, 8, 97,
+
+ 99, 9, 98, 99, 6, 9, 98, 99, 9, 98,
+ 99, 5, 98, 99, 5, 98, 99, 4, 5, 6,
+ 98, 99, 5, 98, 99, 5, 98, 99, 5, 98,
+ 99, 4, 5, 6, 98, 99, 5, 98, 99, 16,
+ 97, 99, 11, 98, 99, 98, 99, 1, 16, 97,
+ 99, 11, 98, 99, 98, 99, 98, 99, 15, 98,
+ 99, 14, 98, 99, 98, 99, 15, 98, 99, 14,
+ 98, 99, 23, 97, 99, 22, 98, 99, 1, 23,
+ 97, 99, 22, 98, 99, 94, 98, 99, 96, 97,
+ 99, 94, 98, 99, 6, 94, 98, 99, 94, 98,
+
+ 99, 94, 98, 99, 1, 96, 97, 99, 94, 98,
+ 99, 6, 94, 98, 99, 94, 98, 99, 92, 98,
+ 99, 92, 98, 99, 6, 92, 98, 99, 92, 98,
+ 99, 92, 98, 99, 92, 98, 99, 6, 92, 98,
+ 99, 92, 98, 99, 7, 3, 2, 1, 7, 3,
+ 2, 83, 84, 84, 84, 83, 84, 84, 84, 87,
+ 89, 87, 88, 88, 88, 87, 87, 1, 89, 87,
+ 88, 88, 88, 87, 91, 93, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 56, 56, 56, 56, 56, 56,
+
+ 56, 56, 56, 56, 56, 56, 91, 93, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 59, 59, 56, 56,
+ 56, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 31, 31, 31, 31, 31, 31, 32,
+ 32, 32, 32, 32, 32, 59, 59, 56, 56, 59,
+
+ 56, 59, 56, 59, 61, 60, 60, 63, 61, 60,
+ 60, 63, 65, 68, 69, 66, 66, 66, 67, 68,
+ 71, 65, 68, 69, 66, 66, 66, 1, 67, 68,
+ 1, 71, 77, 72, 77, 77, 72, 77, 73, 73,
+ 36, 43, 43, 43, 36, 37, 43, 43, 43, 43,
+ 43, 36, 43, 43, 43, 36, 37, 43, 43, 43,
+ 43, 43, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 47, 50, 50, 50, 47, 49, 51, 50,
+
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 47, 50, 50, 50, 47, 49, 51, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 8, 1, 8, 11, 12,
+ 11, 11, 11, 12, 11, 11, 14, 15, 15, 15,
+ 14, 14, 15, 15, 15, 14, 22, 22, 22, 22,
+ 22, 22, 94, 7, 94, 3, 94, 2, 94, 94,
+ 7, 94, 3, 94, 2, 94, 92, 7, 92, 3,
+ 92, 2, 92, 92, 7, 92, 3, 92, 2, 92,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+
+ 59, 59, 59, 59, 59, 59, 59, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 1, 56, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59,16438, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59,16438, 59, 59, 56, 56, 56, 56,
+
+ 59, 56, 59,16414, 56, 59, 56, 59, 56, 59,
+ 59, 59, 56, 56, 59, 56, 59, 56, 59,16414,
+ 67, 67, 67, 1, 67, 37, 43, 43, 43, 43,
+ 43, 37, 43, 43, 43, 43, 43, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 49,
+ 51, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 49, 51, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+
+ 50, 50, 50, 50, 50, 50, 50, 95, 95, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 16441,16442, 59, 59, 59, 59, 59,16441,16442, 59,
+ 10, 56, 56, 56, 56, 56, 56, 56, 56,16438,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 1, 56, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59,16438, 1, 8246, 8246, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+
+ 59,16441,16442, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59,16464, 56, 59, 56, 59,
+ 56, 59,16441,16442, 56, 59, 56, 59, 56, 59,
+ 10,16438,16464, 59, 59, 56, 56,16414, 56, 56,
+ 59,16414, 1, 8222, 8222, 56, 59, 56, 59, 56,
+ 59, 56, 59, 35, 56, 59, 59, 59, 56, 56,
+ 59, 56, 59, 56, 59,16414, 67, 67, 67, 1,
+ 67, 1, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 59, 56, 59, 56, 59, 56,
+
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 48, 50, 50, 50, 50,
+ 48, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 48, 50, 50, 50,
+ 50, 50, 48, 50, 50, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56,16464, 56, 56, 56, 56,
+ 56, 56, 1, 56, 1, 56, 59, 56, 59, 56,
+
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+ 59, 56, 59, 56, 59, 56, 59, 56, 59, 55,
+ 16464, 55, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59,16464, 59, 59, 56, 56, 56,
+ 35, 56, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 59, 59, 56, 56, 59, 56, 59, 56,
+ 59, 62, 62, 62, 62, 62, 62, 67, 67, 1,
+
+ 67, 1, 67, 43, 43, 43, 43, 43, 43, 43,
+ 43, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 55, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 45, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 13, 13, 59, 59, 59, 59,
+ 59, 59, 59, 59,16441,16442, 59, 59, 8249,16441,
+ 16442, 8250, 59, 59, 59,16441,16442, 59, 59,16441,
+
+ 16442, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 1, 56, 1, 56, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59,16441,16442, 56, 59, 56, 59,
+ 8249, 1, 56,16441,16442, 8250, 56, 59, 56, 59,
+ 56, 59, 56, 59,16441,16442,16464, 1, 56,16464,
+ 16464, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+
+ 59, 56, 59,16441,16442, 1, 56,16464, 1,16464,
+ 16464, 1,16464, 29, 59, 59, 56, 56, 56, 56,
+ 59, 56, 59, 56, 59, 29, 56, 59, 56, 59,
+ 59, 59,16441,16442, 56, 56, 59, 56, 59, 56,
+ 59,16441,16442, 1, 67, 67, 67, 1, 67, 1,
+ 67, 67, 1, 43, 43, 43, 40, 43, 43, 43,
+ 43, 40, 43, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 59, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59, 56, 59, 1, 56,
+ 1, 56, 50, 50, 50, 50, 50, 50, 50, 48,
+
+ 50, 50, 50, 48, 50, 50, 48, 50, 48, 50,
+ 45, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 48, 50, 50, 50, 1, 48, 50, 50, 50, 48,
+ 50, 48, 50, 59, 59, 59, 59, 59, 59, 59,
+ 59, 8249, 8249,16441,16442,16441,16442, 59,16441,16442,
+ 59,16441,16442, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 1, 56, 1, 56, 56, 56, 1, 56,
+ 59, 56, 59, 56, 59, 1, 56,16464, 56, 59,
+ 16464, 56, 59, 56, 59, 56, 59, 56, 59, 56,
+
+ 59, 56, 59, 56, 59, 56, 59, 56, 59,16464,
+ 56, 59, 56, 59, 56, 59,16464, 56, 59, 56,
+ 59, 56, 59, 8249, 8249, 56,16441,16442, 56,16441,
+ 16442, 1, 56,16441,16442, 56, 59,16441,16442, 56,
+ 59,16441,16442, 56, 59, 56,16464, 56,16464, 1,
+ 56,16464, 55,16464, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56,16464, 56,16464, 1, 56,16464, 1,
+ 16464,16464,16464,16464,16464,16464, 1,16464,16464,16464,
+ 16464, 1,16464, 59, 56, 56, 56, 56, 59, 56,
+ 59, 56, 59, 56, 59, 59,16441,16442, 34, 56,
+
+ 56, 59, 56, 59,16441,16442, 1, 34, 34, 1,
+ 67, 1, 67, 43, 42, 43, 41, 43, 43, 42,
+ 43, 41, 43, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 59, 1, 56, 56, 59, 56, 59, 56,
+ 59,16437, 56, 59, 56, 59, 56, 59, 56, 56,
+ 1, 56, 56, 56, 1, 56, 50, 50, 50, 50,
+ 50, 50, 50, 50, 48, 48, 48, 50, 48, 50,
+ 50, 50, 50, 50,16437, 50, 46, 50, 50, 50,
+ 50, 50, 48, 1, 48, 48, 50, 48, 50, 50,
+ 59, 59,16441,16442, 59, 59,16441,16442, 59, 59,
+
+ 59,16441,16442, 59,16441,16442,16441,16442, 90, 56,
+ 56, 56,16464, 56, 56, 56, 56, 56, 56,16464,
+ 56, 56,16464, 56, 56, 56, 56, 56, 56, 56,
+ 1, 56, 56, 56, 59, 56, 59, 56, 59, 56,
+ 16464, 56,16464, 1, 56,16464, 8219, 56, 59,16411,
+ 56, 59,16441,16442, 56, 59, 56, 59, 56, 59,
+ 56, 59, 56, 59,16441,16442, 56, 59, 56, 59,
+ 56, 59, 56, 59, 56, 59,16441,16442, 56, 59,
+ 56,16441,16442, 56,16441,16442, 56,16441,16442, 1,
+ 56,16441,16442, 1, 56, 59, 56,16464, 55,16464,
+
+ 55, 56,16464, 56,16464, 1, 56,16464, 55,16464,
+ 1, 55, 56, 59, 56, 59, 56, 59, 90, 56,
+ 59, 56,16464, 56,16464, 56,16464, 1, 56,16464,
+ 55,16464, 1, 55,16464,16464, 1,16464,16464,16464,
+ 16464,16464, 1,16464,16464, 1,16464,16464,16464, 1,
+ 16464,16464, 1, 29, 56, 56, 56, 8217, 56, 59,
+ 16409, 56, 59, 56, 59, 29, 33, 56, 8218, 56,
+ 59,16410, 1, 33, 33, 62, 62, 62, 1, 62,
+ 1, 62, 62, 1, 1, 38, 43, 38, 43, 56,
+ 56, 56, 56,16437, 56, 56, 56, 56, 59, 56,
+
+ 56, 1, 56, 8220, 56, 59,16412,16437,16437, 1,
+ 8245, 8245, 56, 59, 56, 56, 56, 1, 56, 55,
+ 1, 56, 56, 56, 1, 56, 55, 1, 50, 48,
+ 50, 50, 48, 50, 50, 50, 48, 50, 50, 48,
+ 48, 46, 50, 48, 50, 50,16437, 48, 50, 50,
+ 50, 48, 50, 50, 48, 1, 48, 1, 50, 81,
+ 81, 59, 59,16441,16442, 59,16441,16442, 59, 59,
+ 16441,16442,16441,16442, 8249,16441,16442, 8250, 90, 90,
+ 56, 56, 8219, 56,16411, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 1, 1, 56, 59, 56,
+
+ 59,16464, 56,16464, 56,16464, 56,16464, 1, 56,
+ 16464, 55,16464, 1, 55, 8219, 1, 8219, 8219, 56,
+ 59,16441,16442, 56, 59, 56, 59, 56, 59, 82,
+ 17, 56, 59, 56, 59,16441,16442, 56, 59, 56,
+ 59,16441,16442, 56,16441,16442, 1, 56,16441,16442,
+ 8249, 1, 56,16441,16442, 8250, 56, 59,16464, 56,
+ 16464, 55,16464, 55, 55,16464, 1, 56,16464, 55,
+ 16464, 1, 56,16464, 56, 59, 56, 59, 56, 59,
+ 90, 90, 56, 59, 56,16464, 55,16464, 55, 55,
+ 16464, 1, 56,16464, 55,16464, 1, 56,16464,16464,
+
+ 16464,16464,16464, 1,16464,16464, 1, 82,16464,16464,
+ 16464,16464, 1,16464, 1,16464,16464,16464,16464, 1,
+ 16464, 1,16464, 8217, 56,16409, 56, 56, 8217, 1,
+ 8217, 8217, 56, 59,16414, 56, 59, 8218, 56,16410,
+ 8218, 1, 8218, 8218,16414, 62, 62, 62, 62, 1,
+ 62, 62, 1, 67, 67, 1, 67, 1, 67, 39,
+ 1, 39, 56, 8220, 56,16412, 56, 56, 59, 56,
+ 56, 56, 1, 56, 55, 1, 8220, 1, 8220, 8220,
+ 16437, 56, 59, 56, 55, 55, 1, 56, 1, 56,
+ 56, 55, 55, 1, 56, 1, 56, 50, 50, 48,
+
+ 50, 50, 48, 50, 48, 48, 50, 50, 48, 50,
+ 50, 48, 50, 1, 48, 1, 48, 44, 50, 59,
+ 16441,16442, 59, 8249,16441,16442,16441,16442, 8250, 8249,
+ 8249,16441,16442, 56,16464, 56, 56, 56, 17, 56,
+ 56,16464, 56, 56, 56, 56, 1, 56, 1, 56,
+ 56, 59, 55,16464, 56,16464, 55,16464, 55, 55,
+ 16464, 1, 56,16464, 55,16464, 1, 56,16464, 56,
+ 59, 56, 59, 56,16441,16442, 56, 59, 56,16441,
+ 16442, 8249, 56,16441,16442, 8250, 8249, 1, 56,16441,
+ 16442, 1, 56,16441,16442, 8250, 8249, 8249, 56,16441,
+
+ 16442, 56,16441,16442, 1, 55,16464, 55,16464, 56,
+ 16464, 55,16464, 56,16464,16464, 1, 56,16464, 55,
+ 16464, 1, 56,16464, 55, 56,16464, 56,16464, 1,
+ 56, 59, 56, 59, 56, 59, 55,16464, 56,16464,
+ 55,16464, 56,16464,16464, 1, 56,16464, 55,16464,
+ 1, 56,16464, 55, 56,16464, 56,16464, 1,16464,
+ 16464,16464,16464, 1,16464, 1,16464,16464,16464,16464,
+ 16464, 1,16464,16464, 1,16464,16464,16464, 1,16464,
+ 16464,16464, 1,16464,16464, 1,16464,16464,16464, 1,
+ 56,16414, 56,16414, 56, 59,16414,16414,16414, 62,
+
+ 62, 62, 1, 62, 1, 62, 62, 1, 67, 67,
+ 1, 67, 67, 1, 39, 39, 39, 1, 39, 56,
+ 56, 55, 56, 55, 55, 1, 56, 1, 56,16437,
+ 16437,16437, 55, 55, 56, 56, 1, 56, 55, 1,
+ 56, 56, 56, 1, 55, 56, 56, 1, 56, 55,
+ 1, 56, 56, 56, 1, 50, 48, 50, 48, 48,
+ 48, 44, 50, 48, 50, 1, 48, 1, 48, 48,
+ 1, 59,16441,16442,16441,16442, 59, 8249, 8249, 8249,
+ 8250,16441,16442, 56, 56, 56, 56, 56, 56, 56,
+ 1, 56, 56, 56, 1, 56, 59,16441,16442,16464,
+
+ 1, 56,16464,16464, 55,16464, 56,16464, 55,16464,
+ 56,16464,16464, 1, 56,16464, 55,16464, 1, 56,
+ 16464, 55, 56,16464, 56,16464, 1, 1, 56,16441,
+ 16442, 56, 59,16438, 56, 59, 19, 56, 59, 8249,
+ 56,16441,16442, 56,16441,16442, 8250, 8249, 8249, 8249,
+ 8249, 8249, 1, 8250, 56,16441,16442, 56,16441,16442,
+ 16464, 1, 56,16464,16464, 56,16464, 55,16464, 56,
+ 16464, 55,16464, 1, 56,16464, 56,16464, 56, 59,
+ 56, 59,16464, 56,16464, 55,16464, 56,16464, 55,
+ 16464, 1, 56,16464, 56,16464, 1,16464,16464,16464,
+
+ 16464,16464, 1,16464,16464, 1,16464,16464,16464, 1,
+ 16438, 1,16464,16464,16464,16464, 1,16464,16464,16464,
+ 16464,16464, 1,16464,16464, 56,16414,16414, 1, 1,
+ 67, 67, 39, 39, 39, 1, 39, 1, 1, 56,
+ 55, 56, 56, 1, 56, 55, 1, 56, 56, 56,
+ 1, 1, 56, 56, 55, 56, 1, 56, 56, 56,
+ 55, 56, 1, 56, 56, 48, 50, 48, 50, 48,
+ 48, 50, 1, 48, 50, 1, 48, 1, 44,16441,
+ 16442,16441,16442, 59, 8249, 8249, 56,16438, 56, 56,
+ 56, 56, 56, 56, 56,16464, 56,16464, 1, 56,
+
+ 16464, 1,16464,16464, 56,16464, 55,16464, 56,16464,
+ 55,16464, 1, 56,16464, 56,16464, 56,16441,16442,
+ 56,16441,16442, 1, 56,16441,16442,16438, 56, 59,
+ 19, 19, 56, 59, 8249, 8249, 8249, 8250, 8249, 8249,
+ 1, 1, 56,16464, 56,16464, 1, 56,16464,16464,
+ 1, 1, 56, 59, 56, 59,16464, 1, 1,16464,
+ 16464, 1,16464, 1,16464,16464,16464,16464, 1,16464,
+ 16464,16438,16464,16464, 1,16464, 1, 1, 1, 1,
+ 16414,16414,16414, 1, 1, 1, 39, 39, 1, 39,
+ 1, 39, 56, 56, 1, 56, 1, 56, 55, 56,
+
+ 1, 56, 56, 56, 56, 1, 56, 1, 1, 1,
+ 1, 48, 48, 50, 48, 1, 48, 50, 1, 1,
+ 44, 44, 1, 44, 20,16441,16442,16441,16442, 59,
+ 16441,16442,16441,16442, 56, 56, 56, 56,16464, 56,
+ 16464, 56,16464, 1, 56,16464, 55,16464, 1, 55,
+ 16464,16464, 1,16464,16464, 1, 1, 56,16441,16442,
+ 56,16441,16442, 56,16441,16442, 1, 56,16441,16442,
+ 1,16438, 56, 59,16438, 1, 19, 56, 59, 8249,
+ 8249, 1, 56,16441,16442, 1, 56,16441,16442, 56,
+ 16464, 56,16464, 56,16464, 1, 56,16464, 55,16464,
+
+ 1, 55, 1, 56,16464, 1, 56,16464, 8272, 56,
+ 59, 1, 56,16464, 1, 56,16464,16464,16464,16464,
+ 1,16464,16464, 1,16464,16464, 1,16464, 1, 1,
+ 16438,16464,16464,16464, 1,16464,16464, 1, 1,16464,
+ 1,16464, 8272, 1,16464, 1,16464, 62, 62, 62,
+ 1, 62, 1, 62, 62, 1, 1, 39, 39, 39,
+ 1, 39, 1, 39, 39, 1, 56, 56, 56, 1,
+ 56, 55, 1, 1, 1, 1, 56, 56, 56, 1,
+ 56, 55, 1, 1, 56, 1, 56, 1, 56, 1,
+ 56, 48, 48, 50, 48, 48, 48, 1, 48, 1,
+
+ 50, 1, 48, 1, 48, 44, 44, 44, 1, 44,
+ 1,16441,16442, 8249,16441,16442, 8250, 59,16441,16442,
+ 16441,16442, 56,16438, 56, 56,16464, 55,16464, 55,
+ 55,16464, 1, 56,16464, 55,16464, 1, 56,16464,
+ 16464,16464,16464, 1,16464, 55,16464, 1, 55, 1,
+ 56,16464, 1, 56,16464, 56,16441,16442, 1, 56,
+ 16441,16442, 8249, 1, 56,16441,16442, 8250,16438,16438,
+ 16438, 19, 19, 1, 19, 56, 59, 56,16441,16442,
+ 56,16441,16442, 1, 56,16441,16442, 56,16441,16442,
+ 56,16441,16442, 1, 56,16464, 55,16464, 55, 55,
+
+ 16464, 1, 56,16464, 55,16464, 1, 56,16464, 56,
+ 16464, 56,16464, 1, 56,16464, 56,16464, 56,16464,
+ 1, 55,16464, 55, 56, 59, 56,16464, 56,16464,
+ 1, 56,16464, 56,16464, 56,16464, 1, 55,16464,
+ 55,16464,16464,16464, 1,16464, 1,16464,16464,16464,
+ 16464, 1,16464,16464, 1, 1,16464, 1,16464,16464,
+ 16464,16464, 1,16464, 1,16464,16464,16464, 1,16464,
+ 16464,16464, 1,16464,16464,16464, 1,16464,16464,16464,
+ 1,16464, 62, 62, 62, 62, 62, 62, 1, 62,
+ 62, 1, 1, 1, 62, 62, 39, 1, 39, 56,
+
+ 55, 55, 1, 56, 1, 56, 1, 55, 1, 1,
+ 56, 1, 56, 56, 55, 55, 1, 56, 1, 56,
+ 56, 56, 1, 56, 56, 56, 1, 55, 56, 56,
+ 1, 56, 56, 56, 1, 55, 48, 48, 50, 48,
+ 48, 1, 48, 1, 48, 50, 1, 48, 48, 1,
+ 44, 1, 44, 1, 44, 20, 8249,16441,16442,16441,
+ 16442, 8250, 8249, 8249,16441,16442, 59,16441,16442,16441,
+ 16442, 8249, 8250, 56, 55,16464, 56,16464, 55,16464,
+ 56,16464,16464, 1, 56,16464, 55,16464, 1, 56,
+ 16464, 55, 56,16464, 56,16464, 1,16464, 55,16464,
+
+ 55, 55,16464, 1,16464, 55,16464, 1,16464, 56,
+ 16464, 56,16464, 1, 56,16464, 56,16464, 56,16464,
+ 1, 55,16464, 55, 56,16441,16442, 8249, 56,16441,
+ 16442, 8250, 8249, 1, 56,16441,16442, 1, 56,16441,
+ 16442, 8250, 8249, 8249, 56,16441,16442, 56,16441,16442,
+ 1, 19, 19, 19, 1, 19, 1, 56, 59,16441,
+ 16442, 56,16441,16442, 56,16441,16442, 56,16441,16442,
+ 8249, 8250, 55,16464, 56,16464, 55,16464, 56,16464,
+ 16464, 1, 56,16464, 55,16464, 1, 56,16464, 55,
+ 56,16464, 56,16464, 1, 56,16464, 55,16464, 55,
+
+ 55,16464, 55, 56,16464, 56,16464,16464, 56,16464,
+ 55,16464, 55, 55,16464, 55, 56,16464, 56,16464,
+ 16464,16464,16464,16464, 1,16464,16464, 1,16464,16464,
+ 16464, 1,16464,16464,16464, 1,16464, 1,16464,16464,
+ 16464, 1,16464,16464,16464, 1,16464,16464,16464,16464,
+ 1,16464,16464, 1,16464,16464,16464, 1,16464,16464,
+ 16464,16464,16464,16464,16464,16464,16464,16464, 62, 62,
+ 62, 62, 62, 62, 1, 62, 1, 62, 62, 1,
+ 62, 62, 62, 42, 42, 1, 1, 55, 56, 56,
+ 1, 56, 55, 1, 56, 56, 56, 1, 55, 55,
+
+ 1, 1, 56, 56, 1, 56, 56, 56, 1, 55,
+ 55, 56, 56, 1, 56, 55, 1, 56, 56, 56,
+ 1, 56, 55, 55, 56, 56, 56, 55, 55, 56,
+ 56, 48, 48, 48, 48, 50, 48, 1, 48, 1,
+ 48, 48, 1, 48, 50, 48, 44, 44, 1, 44,
+ 1, 44, 44, 44, 1, 21, 20, 20, 21, 8249,
+ 8249, 8249, 8250,16441,16442, 8249, 8250, 8249, 8249,16464,
+ 56,16464, 55,16464, 56,16464, 55,16464, 1, 56,
+ 16464, 56,16464, 55,16464,16464, 55,16464,16464,16464,
+ 1,16464, 55,16464, 1,16464, 55,16464,16464, 1,
+
+ 56,16464, 55,16464, 55, 55,16464, 55, 56,16464,
+ 56,16464,16464, 8249, 56,16441,16442, 56,16441,16442,
+ 8250, 8249, 8249, 8249, 8249, 8249, 1, 8250, 56,16441,
+ 16442, 56,16441,16442,16464, 19, 1, 19, 1, 19,
+ 8249, 8250, 8249, 8250, 8249, 8249,16464, 56,16464, 55,
+ 16464, 56,16464, 55,16464, 1, 56,16464, 56,16464,
+ 55,16464, 55,16464, 8272,16464, 8272, 55,16464, 55,
+ 16464,16464, 8272,16464,16464,16464, 1,16464,16464,16464,
+ 16464,16464, 1,16464,16464, 1,16464,16464,16464, 1,
+ 16464,16464,16464,16464,16464,16464,16464,16464,16464, 1,
+
+ 16464,16464,16464, 8272,16464, 8272, 1, 39, 39, 1,
+ 39, 1, 39, 56, 55, 56, 1, 56, 56, 55,
+ 1, 55, 1, 1, 56, 55, 55, 56, 56, 56,
+ 55, 56, 1, 56, 56, 55, 55, 48, 1, 48,
+ 44, 44, 1, 44, 44, 8249, 8249, 8249, 8249,16464,
+ 1, 1,16464,16464, 55,16464,16464, 55,16464, 1,
+ 16464,16464, 55,16464, 55,16464,16464, 8272, 8249, 8249,
+ 8249, 8250, 8249, 8249, 1, 1, 19, 19, 1, 19,
+ 1, 19, 19, 19, 1, 8249, 8250, 8249, 8249, 8249,
+ 8249,16464, 1, 1,16464, 8272, 8272,16464, 8272, 8272,
+
+ 1, 1,16464,16464,16464, 1,16464,16464,16464, 8272,
+ 1, 1, 8272, 8272, 8272, 8272, 1, 1, 39, 39,
+ 1, 39, 39, 1, 1, 1, 55, 1, 55, 1,
+ 1, 1, 1, 1, 1,16441,16442,16441,16442, 18,
+ 1, 56,16464, 1, 56,16464,16464, 1, 1,16464,
+ 8272, 8272, 8249, 8249, 1, 56,16441,16442, 1, 56,
+ 16441,16442, 19, 19, 1, 19, 19, 8249, 8249, 1,
+ 56,16464, 1, 56,16464, 8272, 8272, 8272, 8272, 1,
+ 16464, 1,16464, 1, 1, 8272, 8272, 1,16464, 1,
+ 16464, 8272, 8272, 8272, 8272, 1, 1, 39, 39, 1,
+
+ 56, 1, 56, 1, 1, 1, 56, 1, 56, 48,
+ 48, 1, 48, 1, 48, 1, 44, 1, 44,16441,
+ 16442,16441,16442, 56,16464, 56,16464, 1, 56,16464,
+ 56,16464, 56,16464, 1, 55,16464, 55, 1,16464,
+ 1,16464, 8272, 8272, 56,16441,16442, 56,16441,16442,
+ 1, 56,16441,16442, 56,16441,16442, 56,16441,16442,
+ 1, 1, 1, 56,16464, 56,16464, 1, 56,16464,
+ 56,16464, 56,16464, 1, 55,16464, 55, 8272, 8272,
+ 16464,16464, 1,16464,16464,16464, 1,16464, 1,16464,
+ 1,16464, 8272, 8272,16464,16464, 1,16464,16464,16464,
+
+ 1,16464, 8272, 8272, 62, 62, 1, 1, 62, 62,
+ 56, 56, 1, 56, 56, 56, 1, 55, 1, 1,
+ 56, 56, 1, 56, 56, 56, 1, 55, 48, 48,
+ 1, 48, 48, 1, 44, 44, 1, 44, 44, 44,
+ 1,16441,16442, 8249, 8250, 56,16464, 55,16464, 55,
+ 55,16464, 55, 56,16464, 56,16464,16464,16464,16464,
+ 1,16464,16464,16464, 1, 55,16464, 55, 8272, 56,
+ 16441,16442, 56,16441,16442, 56,16441,16442, 8249, 8250,
+ 1, 19, 1, 19, 56,16464, 55,16464, 55, 55,
+ 16464, 55, 56,16464, 56,16464,16464,16464,16464,16464,
+
+ 16464,16464,16464,16464, 1,16464,16464,16464, 1,16464,
+ 8272,16464,16464,16464,16464,16464, 62, 62, 62, 62,
+ 62, 62, 56, 55, 55, 56, 56, 1, 1, 55,
+ 56, 55, 55, 56, 56, 48, 48, 44, 44, 44,
+ 8249, 8250, 8249, 8249, 55,16464, 55,16464,16464, 8272,
+ 16464, 55,16464, 55, 55,16464, 55,16464,16464,16464,
+ 8249, 8250, 8249, 8250, 8249, 8249, 19, 19, 1, 19,
+ 19, 19, 1, 55,16464, 55,16464,16464, 8272,16464,
+ 8272,16464,16464,16464,16464,16464,16464, 8272, 55, 55,
+ 55, 55, 8249, 8249,16464, 8272, 8272, 55,16464, 55,
+
+ 16464,16464, 8272, 8249, 8250, 8249, 8249, 8249, 8249, 19,
+ 19, 19,16464, 8272, 8272, 8272, 8272, 8272, 8272,16464,
+ 8272, 8272, 8272, 8272, 8272, 55, 8272, 8272,16464, 8272,
+ 8272, 8272, 8249, 8249, 8272, 8272, 8272, 8272, 8272, 8272,
+ 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272,
+ 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272,
+ 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272,
+ 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272,
+ 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272, 8272,
+ 8272, 8272, 8272, 8272, 8272
+
+ } ;
+
+static yyconst flex_int16_t yy_accept[8695] =
+ { 0,
+ 1, 1, 1, 2, 3, 3, 3, 4, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 6, 7, 8, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 10, 11, 12, 13, 13, 13, 14,
+ 16, 18, 20, 23, 25, 27, 30, 32, 35, 37,
+ 40, 43, 46, 49, 51, 53, 55, 57, 59, 61,
+ 64, 67, 70, 73, 76, 79, 82, 86, 89, 92,
+ 95, 98, 100, 103, 106, 109, 112, 115, 118, 121,
+
+ 124, 127, 130, 133, 136, 138, 140, 144, 146, 150,
+ 154, 158, 162, 166, 170, 174, 178, 182, 186, 190,
+ 194, 198, 202, 204, 206, 208, 210, 212, 214, 216,
+ 218, 220, 222, 224, 226, 228, 231, 234, 236, 240,
+ 244, 248, 252, 256, 260, 263, 266, 269, 272, 275,
+ 277, 281, 285, 287, 289, 292, 296, 299, 303, 307,
+ 310, 313, 316, 319, 322, 325, 328, 331, 334, 337,
+ 340, 343, 347, 350, 354, 358, 361, 364, 367, 370,
+ 373, 376, 379, 382, 385, 388, 391, 394, 397, 399,
+ 402, 404, 407, 409, 412, 415, 419, 421, 424, 426,
+
+ 429, 431, 434, 437, 440, 443, 447, 451, 455, 459,
+ 463, 466, 469, 472, 476, 480, 484, 488, 492, 496,
+ 499, 502, 505, 509, 512, 515, 518, 521, 524, 528,
+ 531, 534, 537, 539, 542, 545, 547, 550, 553, 556,
+ 559, 561, 564, 567, 569, 572, 575, 578, 581, 583,
+ 587, 591, 595, 599, 603, 607, 611, 615, 619, 623,
+ 625, 628, 631, 634, 636, 638, 641, 644, 647, 650,
+ 653, 656, 659, 662, 665, 667, 671, 674, 677, 679,
+ 681, 684, 687, 690, 693, 696, 699, 702, 705, 708,
+ 711, 714, 717, 720, 724, 727, 730, 733, 736, 739,
+
+ 743, 746, 749, 752, 755, 758, 761, 764, 767, 770,
+ 773, 776, 779, 782, 785, 788, 792, 795, 798, 802,
+ 805, 809, 812, 815, 818, 823, 826, 829, 832, 837,
+ 840, 843, 846, 848, 852, 855, 857, 859, 862, 865,
+ 867, 870, 873, 876, 879, 883, 886, 889, 892, 895,
+ 899, 902, 905, 909, 912, 916, 919, 922, 925, 929,
+ 932, 935, 938, 942, 945, 946, 947, 948, 948, 949,
+ 950, 951, 952, 953, 954, 955, 956, 957, 958, 959,
+ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960,
+ 960, 961, 962, 963, 964, 965, 966, 967, 968, 970,
+
+ 971, 972, 973, 974, 975, 976, 977, 978, 979, 980,
+ 981, 982, 983, 984, 985, 986, 987, 988, 989, 990,
+ 991, 992, 993, 994, 995, 995, 996, 996, 997, 998,
+ 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008,
+ 1009, 1009, 1011, 1011, 1013, 1015, 1015, 1015, 1017, 1019,
+ 1021, 1023, 1025, 1027, 1029, 1031, 1033, 1035, 1037, 1039,
+ 1041, 1043, 1045, 1047, 1049, 1051, 1053, 1055, 1057, 1059,
+ 1061, 1063, 1065, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067,
+ 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1068,
+
+ 1069, 1069, 1070, 1071, 1072, 1074, 1076, 1078, 1080, 1082,
+ 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093,
+ 1094, 1095, 1096, 1097, 1098, 1098, 1099, 1101, 1103, 1105,
+ 1105, 1105, 1105, 1106, 1107, 1108, 1109, 1109, 1109, 1109,
+ 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109,
+ 1110, 1111, 1112, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+ 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1114, 1114, 1115,
+ 1116, 1117, 1118, 1119, 1119, 1119, 1120, 1121, 1121, 1122,
+ 1123, 1123, 1124, 1125, 1126, 1127, 1128, 1128, 1129, 1129,
+ 1130, 1131, 1131, 1133, 1133, 1134, 1135, 1136, 1136, 1137,
+
+ 1138, 1139, 1140, 1141, 1141, 1142, 1142, 1143, 1144, 1145,
+ 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1152, 1153, 1153,
+ 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163,
+ 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1173,
+ 1175, 1177, 1179, 1181, 1183, 1185, 1187, 1189, 1191, 1193,
+ 1193, 1194, 1194, 1194, 1195, 1196, 1197, 1198, 1199, 1200,
+ 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210,
+ 1211, 1212, 1213, 1213, 1214, 1214, 1214, 1214, 1214, 1214,
+ 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223,
+ 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233,
+
+ 1234, 1235, 1236, 1236, 1236, 1236, 1236, 1236, 1237, 1239,
+ 1240, 1241, 1242, 1243, 1243, 1243, 1244, 1245, 1246, 1247,
+ 1247, 1247, 1247, 1248, 1249, 1250, 1251, 1252, 1252, 1253,
+ 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263,
+ 1264, 1264, 1264, 1266, 1268, 1270, 1271, 1273, 1275, 1277,
+ 1278, 1280, 1282, 1284, 1285, 1287, 1289, 1291, 1291, 1291,
+ 1291, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299,
+ 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309,
+ 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319,
+ 1320, 1321, 1322, 1323, 1324, 1325, 1325, 1326, 1326, 1327,
+
+ 1329, 1331, 1333, 1335, 1337, 1339, 1341, 1343, 1345, 1347,
+ 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368,
+ 1370, 1372, 1374, 1376, 1378, 1380, 1382, 1384, 1386, 1388,
+ 1390, 1392, 1394, 1394, 1394, 1394, 1394, 1394, 1395, 1395,
+ 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1396, 1397,
+ 1398, 1399, 1400, 1402, 1405, 1407, 1409, 1411, 1412, 1413,
+ 1414, 1416, 1418, 1420, 1421, 1421, 1421, 1421, 1421, 1421,
+ 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421,
+ 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421,
+ 1421, 1421, 1421, 1421, 1421, 1422, 1422, 1422, 1423, 1424,
+
+ 1424, 1425, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432,
+ 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442,
+ 1443, 1444, 1445, 1446, 1447, 1448, 1450, 1452, 1454, 1456,
+ 1458, 1460, 1462, 1464, 1466, 1468, 1470, 1471, 1472, 1473,
+ 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483,
+ 1484, 1485, 1486, 1487, 1487, 1487, 1487, 1487, 1488, 1489,
+ 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499,
+ 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1509, 1510, 1510, 1510, 1510, 1510,
+ 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520,
+
+ 1523, 1524, 1525, 1526, 1527, 1530, 1531, 1532, 1533, 1534,
+ 1535, 1536, 1537, 1538, 1539, 1541, 1542, 1543, 1544, 1545,
+ 1546, 1547, 1548, 1549, 1550, 1551, 1551, 1551, 1552, 1552,
+ 1553, 1553, 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568,
+ 1570, 1572, 1574, 1575, 1577, 1578, 1580, 1582, 1584, 1586,
+ 1588, 1590, 1592, 1594, 1596, 1598, 1600, 1604, 1606, 1608,
+ 1610, 1612, 1614, 1617, 1619, 1621, 1625, 1627, 1629, 1631,
+ 1632, 1632, 1632, 1632, 1632, 1632, 1633, 1633, 1633, 1633,
+ 1633, 1633, 1633, 1633, 1634, 1634, 1634, 1634, 1635, 1636,
+ 1637, 1639, 1640, 1642, 1643, 1645, 1646, 1648, 1650, 1652,
+
+ 1654, 1657, 1658, 1659, 1660, 1662, 1664, 1666, 1667, 1667,
+ 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667,
+ 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667,
+ 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667,
+ 1667, 1667, 1667, 1668, 1668, 1669, 1669, 1669, 1670, 1670,
+ 1671, 1672, 1672, 1673, 1673, 1674, 1675, 1676, 1677, 1678,
+ 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688,
+ 1689, 1690, 1691, 1692, 1693, 1694, 1696, 1698, 1700, 1702,
+ 1704, 1704, 1706, 1708, 1710, 1712, 1714, 1716, 1717, 1718,
+ 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1728, 1729,
+
+ 1730, 1731, 1733, 1734, 1734, 1734, 1734, 1734, 1735, 1736,
+ 1737, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745,
+ 1746, 1747, 1749, 1750, 1751, 1752, 1753, 1755, 1756, 1756,
+ 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1757,
+ 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1766,
+ 1766, 1766, 1767, 1768, 1769, 1770, 1770, 1771, 1772, 1773,
+ 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783,
+ 1784, 1785, 1787, 1788, 1789, 1790, 1790, 1790, 1791, 1792,
+ 1793, 1793, 1794, 1795, 1795, 1796, 1796, 1798, 1800, 1802,
+ 1804, 1806, 1808, 1810, 1812, 1814, 1816, 1818, 1820, 1822,
+
+ 1824, 1826, 1828, 1830, 1832, 1834, 1836, 1838, 1840, 1842,
+ 1842, 1842, 1842, 1844, 1846, 1848, 1850, 1850, 1852, 1852,
+ 1852, 1853, 1855, 1857, 1859, 1861, 1861, 1863, 1865, 1865,
+ 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865,
+ 1865, 1865, 1865, 1866, 1866, 1866, 1866, 1866, 1866, 1866,
+ 1866, 1866, 1867, 1868, 1869, 1870, 1871, 1873, 1875, 1877,
+ 1879, 1881, 1883, 1884, 1885, 1886, 1888, 1890, 1892, 1892,
+ 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892,
+ 1892, 1893, 1894, 1895, 1895, 1895, 1895, 1895, 1895, 1895,
+ 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1896, 1897,
+
+ 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1899, 1899, 1899,
+ 1900, 1900, 1901, 1901, 1902, 1902, 1903, 1903, 1904, 1905,
+ 1905, 1905, 1906, 1907, 1908, 1909, 1909, 1909, 1910, 1911,
+ 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921,
+ 1922, 1923, 1925, 1927, 1929, 1931, 1933, 1933, 1935, 1937,
+ 1939, 1941, 1942, 1942, 1942, 1942, 1942, 1943, 1944, 1945,
+ 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1952, 1952, 1953,
+ 1954, 1955, 1956, 1956, 1956, 1956, 1957, 1958, 1959, 1960,
+ 1961, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1970,
+ 1970, 1971, 1972, 1973, 1974, 1975, 1975, 1975, 1975, 1976,
+
+ 1977, 1977, 1977, 1977, 1977, 1978, 1979, 1980, 1981, 1982,
+ 1983, 1984, 1987, 1988, 1989, 1990, 1990, 1990, 1992, 1993,
+ 1994, 1995, 1998, 1999, 2002, 2003, 2004, 2005, 2006, 2007,
+ 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
+ 2018, 2019, 2020, 2020, 2021, 2021, 2021, 2021, 2022, 2022,
+ 2023, 2023, 2024, 2024, 2025, 2027, 2029, 2031, 2031, 2031,
+ 2033, 2035, 2037, 2039, 2041, 2043, 2045, 2047, 2049, 2051,
+ 2053, 2055, 2057, 2059, 2061, 2063, 2067, 2069, 2071, 2072,
+ 2072, 2073, 2073, 2076, 2077, 2079, 2081, 2083, 2087, 2087,
+ 2087, 2087, 2087, 2088, 2088, 2089, 2089, 2091, 2091, 2092,
+
+ 2094, 2096, 2098, 2100, 2102, 2106, 2106, 2107, 2107, 2109,
+ 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
+ 2109, 2109, 2109, 2110, 2110, 2111, 2111, 2112, 2112, 2112,
+ 2112, 2112, 2112, 2113, 2113, 2114, 2116, 2117, 2118, 2119,
+ 2120, 2122, 2124, 2126, 2129, 2131, 2132, 2135, 2136, 2138,
+ 2140, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2145, 2145, 2145, 2145,
+ 2145, 2145, 2145, 2145, 2145, 2146, 2146, 2146, 2147, 2148,
+
+ 2148, 2148, 2148, 2149, 2149, 2150, 2150, 2151, 2151, 2152,
+ 2153, 2153, 2154, 2154, 2155, 2155, 2155, 2156, 2157, 2159,
+ 2160, 2160, 2160, 2161, 2162, 2164, 2165, 2166, 2167, 2168,
+ 2169, 2170, 2171, 2172, 2173, 2175, 2175, 2175, 2177, 2179,
+ 2181, 2181, 2183, 2185, 2187, 2189, 2189, 2189, 2190, 2190,
+ 2191, 2191, 2191, 2191, 2192, 2192, 2193, 2194, 2195, 2196,
+ 2197, 2198, 2199, 2200, 2202, 2203, 2204, 2204, 2204, 2205,
+ 2206, 2207, 2209, 2211, 2212, 2212, 2212, 2213, 2214, 2215,
+ 2216, 2217, 2218, 2219, 2220, 2221, 2223, 2224, 2225, 2225,
+ 2226, 2226, 2227, 2228, 2229, 2230, 2232, 2234, 2234, 2234,
+
+ 2234, 2234, 2234, 2234, 2234, 2235, 2236, 2237, 2238, 2238,
+ 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2246, 2246, 2246,
+ 2248, 2251, 2254, 2254, 2254, 2255, 2256, 2257, 2258, 2259,
+ 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269,
+ 2270, 2271, 2271, 2271, 2272, 2272, 2272, 2273, 2273, 2274,
+ 2274, 2275, 2275, 2276, 2276, 2277, 2278, 2279, 2279, 2280,
+ 2280, 2282, 2284, 2286, 2286, 2287, 2287, 2289, 2292, 2294,
+ 2296, 2298, 2298, 2300, 2302, 2304, 2306, 2308, 2311, 2311,
+ 2311, 2313, 2315, 2318, 2320, 2322, 2324, 2325, 2326, 2329,
+ 2329, 2329, 2332, 2332, 2333, 2333, 2336, 2336, 2340, 2344,
+
+ 2346, 2346, 2346, 2346, 2346, 2348, 2348, 2348, 2350, 2350,
+ 2351, 2351, 2353, 2355, 2357, 2359, 2361, 2361, 2361, 2363,
+ 2365, 2365, 2365, 2367, 2367, 2368, 2368, 2370, 2370, 2370,
+ 2371, 2371, 2372, 2373, 2373, 2373, 2373, 2373, 2373, 2374,
+ 2375, 2375, 2376, 2376, 2376, 2377, 2377, 2378, 2378, 2379,
+ 2380, 2380, 2380, 2380, 2380, 2381, 2381, 2381, 2382, 2382,
+ 2383, 2383, 2384, 2385, 2386, 2387, 2388, 2390, 2392, 2394,
+ 2396, 2399, 2399, 2400, 2401, 2403, 2407, 2407, 2409, 2410,
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+
+ 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2412, 2412,
+ 2413, 2413, 2413, 2414, 2415, 2415, 2416, 2416, 2417, 2419,
+ 2420, 2420, 2421, 2421, 2422, 2424, 2425, 2426, 2427, 2428,
+ 2429, 2430, 2431, 2432, 2434, 2434, 2435, 2435, 2436, 2438,
+ 2440, 2440, 2440, 2443, 2445, 2447, 2449, 2450, 2450, 2450,
+ 2451, 2451, 2452, 2452, 2453, 2454, 2454, 2454, 2455, 2455,
+ 2456, 2456, 2457, 2458, 2459, 2460, 2461, 2461, 2461, 2462,
+ 2463, 2464, 2465, 2466, 2466, 2466, 2467, 2469, 2471, 2471,
+ 2471, 2472, 2473, 2474, 2476, 2477, 2479, 2479, 2479, 2480,
+
+ 2481, 2482, 2483, 2484, 2484, 2485, 2485, 2486, 2488, 2490,
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2492, 2495, 2496, 2499, 2499, 2499, 2499, 2500, 2501, 2504,
+ 2505, 2507, 2507, 2509, 2509, 2509, 2509, 2509, 2509, 2510,
+ 2511, 2512, 2514, 2515, 2516, 2517, 2518, 2519, 2521, 2522,
+ 2524, 2525, 2526, 2527, 2528, 2529, 2529, 2529, 2530, 2530,
+ 2530, 2531, 2531, 2531, 2531, 2532, 2532, 2532, 2533, 2534,
+ 2536, 2538, 2540, 2542, 2542, 2542, 2544, 2544, 2545, 2545,
+ 2547, 2551, 2555, 2557, 2557, 2559, 2561, 2563, 2567, 2569,
+ 2569, 2569, 2569, 2571, 2573, 2575, 2579, 2581, 2581, 2581,
+
+ 2584, 2587, 2590, 2590, 2591, 2594, 2594, 2594, 2595, 2595,
+ 2595, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2599, 2601,
+ 2602, 2602, 2602, 2604, 2606, 2606, 2607, 2609, 2609, 2611,
+ 2612, 2612, 2613, 2613, 2613, 2615, 2617, 2619, 2619, 2620,
+ 2622, 2622, 2622, 2624, 2626, 2628, 2628, 2629, 2631, 2631,
+ 2633, 2634, 2634, 2635, 2635, 2635, 2635, 2636, 2636, 2636,
+ 2637, 2637, 2638, 2638, 2639, 2639, 2639, 2639, 2639, 2639,
+ 2639, 2639, 2639, 2640, 2641, 2642, 2643, 2643, 2644, 2645,
+ 2645, 2646, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
+ 2647, 2647, 2648, 2649, 2650, 2650, 2651, 2652, 2652, 2653,
+
+ 2654, 2654, 2654, 2654, 2655, 2656, 2657, 2658, 2662, 2664,
+ 2666, 2667, 2667, 2668, 2669, 2673, 2673, 2675, 2676, 2676,
+ 2676, 2676, 2676, 2676, 2676, 2676, 2676, 2676, 2676, 2676,
+ 2676, 2676, 2676, 2676, 2676, 2677, 2677, 2678, 2679, 2679,
+ 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679, 2679,
+ 2679, 2679, 2680, 2680, 2681, 2682, 2683, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2685, 2685, 2685, 2686, 2686,
+ 2688, 2688, 2688, 2688, 2688, 2690, 2690, 2690, 2690, 2690,
+ 2691, 2692, 2693, 2695, 2696, 2697, 2698, 2700, 2701, 2701,
+ 2701, 2702, 2702, 2703, 2703, 2704, 2708, 2708, 2709, 2710,
+
+ 2712, 2713, 2715, 2715, 2715, 2716, 2717, 2718, 2718, 2719,
+ 2720, 2720, 2721, 2722, 2722, 2722, 2722, 2723, 2724, 2725,
+ 2725, 2726, 2727, 2727, 2728, 2729, 2729, 2730, 2732, 2733,
+ 2735, 2735, 2735, 2735, 2736, 2737, 2739, 2740, 2741, 2741,
+ 2742, 2742, 2742, 2743, 2743, 2744, 2746, 2747, 2748, 2750,
+ 2750, 2750, 2750, 2751, 2752, 2754, 2755, 2756, 2756, 2757,
+ 2758, 2758, 2759, 2759, 2760, 2760, 2760, 2760, 2761, 2761,
+ 2762, 2762, 2763, 2766, 2766, 2766, 2769, 2770, 2773, 2773,
+ 2773, 2773, 2775, 2775, 2776, 2776, 2776, 2778, 2779, 2780,
+ 2781, 2782, 2783, 2786, 2787, 2788, 2789, 2790, 2791, 2792,
+
+ 2793, 2794, 2795, 2796, 2796, 2796, 2796, 2796, 2796, 2796,
+ 2797, 2797, 2797, 2798, 2798, 2798, 2800, 2803, 2803, 2803,
+ 2805, 2807, 2809, 2809, 2810, 2812, 2812, 2814, 2815, 2815,
+ 2816, 2816, 2816, 2817, 2819, 2820, 2824, 2824, 2826, 2828,
+ 2830, 2831, 2831, 2831, 2834, 2838, 2840, 2844, 2844, 2847,
+ 2847, 2847, 2847, 2847, 2847, 2847, 2848, 2848, 2851, 2851,
+ 2852, 2852, 2853, 2853, 2856, 2857, 2860, 2860, 2860, 2860,
+ 2860, 2860, 2862, 2862, 2864, 2864, 2865, 2865, 2865, 2865,
+ 2865, 2865, 2867, 2868, 2868, 2870, 2871, 2871, 2871, 2872,
+ 2872, 2873, 2873, 2875, 2875, 2875, 2877, 2879, 2881, 2882,
+
+ 2883, 2885, 2885, 2887, 2887, 2889, 2889, 2890, 2890, 2890,
+ 2890, 2892, 2893, 2893, 2895, 2896, 2896, 2896, 2897, 2897,
+ 2898, 2898, 2900, 2900, 2900, 2901, 2901, 2901, 2902, 2903,
+ 2904, 2904, 2905, 2906, 2906, 2907, 2908, 2908, 2908, 2908,
+ 2908, 2908, 2908, 2908, 2909, 2910, 2910, 2911, 2911, 2912,
+ 2912, 2912, 2912, 2912, 2913, 2914, 2914, 2915, 2915, 2915,
+ 2915, 2916, 2916, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
+ 2917, 2918, 2918, 2919, 2919, 2919, 2919, 2919, 2920, 2921,
+ 2921, 2922, 2922, 2922, 2922, 2923, 2923, 2924, 2924, 2924,
+ 2927, 2928, 2929, 2930, 2932, 2933, 2936, 2938, 2941, 2942,
+
+ 2944, 2945, 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2946,
+ 2946, 2947, 2947, 2948, 2949, 2949, 2949, 2949, 2949, 2949,
+ 2949, 2949, 2949, 2949, 2949, 2949, 2950, 2951, 2952, 2953,
+ 2953, 2953, 2953, 2954, 2954, 2954, 2954, 2954, 2955, 2955,
+ 2955, 2956, 2956, 2957, 2957, 2958, 2958, 2959, 2959, 2960,
+ 2960, 2960, 2960, 2961, 2961, 2961, 2962, 2962, 2963, 2964,
+ 2967, 2968, 2970, 2970, 2970, 2971, 2972, 2973, 2973, 2974,
+ 2975, 2975, 2976, 2977, 2977, 2978, 2980, 2981, 2981, 2982,
+ 2984, 2984, 2985, 2985, 2986, 2986, 2986, 2987, 2988, 2988,
+ 2989, 2989, 2990, 2990, 2991, 2991, 2992, 2992, 2993, 2993,
+
+ 2993, 2994, 2995, 2995, 2996, 2996, 2997, 2997, 2998, 2999,
+ 3000, 3000, 3000, 3002, 3003, 3005, 3005, 3005, 3006, 3006,
+ 3006, 3007, 3007, 3008, 3009, 3009, 3009, 3011, 3012, 3014,
+ 3014, 3015, 3015, 3016, 3016, 3017, 3017, 3018, 3020, 3020,
+ 3020, 3020, 3020, 3020, 3021, 3021, 3021, 3021, 3023, 3023,
+ 3023, 3024, 3025, 3025, 3025, 3027, 3027, 3027, 3027, 3029,
+ 3029, 3030, 3031, 3032, 3034, 3034, 3034, 3036, 3037, 3038,
+ 3039, 3041, 3043, 3044, 3045, 3046, 3047, 3047, 3047, 3047,
+ 3047, 3047, 3048, 3048, 3049, 3049, 3050, 3050, 3051, 3051,
+ 3053, 3055, 3055, 3055, 3055, 3057, 3057, 3059, 3059, 3060,
+
+ 3060, 3060, 3060, 3062, 3063, 3063, 3065, 3066, 3066, 3066,
+ 3067, 3067, 3068, 3068, 3070, 3070, 3070, 3070, 3070, 3070,
+ 3070, 3072, 3074, 3074, 3077, 3077, 3077, 3077, 3079, 3079,
+ 3079, 3079, 3082, 3082, 3083, 3083, 3083, 3086, 3087, 3088,
+ 3088, 3089, 3089, 3092, 3092, 3092, 3093, 3093, 3096, 3096,
+ 3097, 3098, 3099, 3102, 3105, 3105, 3106, 3106, 3108, 3108,
+ 3108, 3108, 3108, 3108, 3108, 3110, 3110, 3112, 3113, 3113,
+ 3113, 3114, 3114, 3114, 3116, 3116, 3116, 3116, 3116, 3117,
+ 3117, 3118, 3118, 3120, 3120, 3122, 3123, 3123, 3125, 3126,
+ 3126, 3126, 3126, 3126, 3128, 3130, 3130, 3131, 3131, 3131,
+
+ 3131, 3133, 3135, 3135, 3137, 3137, 3139, 3139, 3141, 3142,
+ 3142, 3142, 3143, 3143, 3143, 3145, 3145, 3145, 3146, 3146,
+ 3147, 3147, 3149, 3149, 3151, 3152, 3152, 3154, 3155, 3155,
+ 3155, 3155, 3155, 3157, 3159, 3159, 3160, 3160, 3160, 3160,
+ 3161, 3161, 3161, 3161, 3162, 3162, 3163, 3163, 3163, 3163,
+ 3163, 3164, 3165, 3165, 3166, 3166, 3166, 3166, 3167, 3167,
+ 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3169, 3169, 3169,
+ 3170, 3170, 3171, 3171, 3171, 3171, 3171, 3172, 3172, 3172,
+ 3172, 3173, 3173, 3174, 3174, 3175, 3176, 3176, 3177, 3177,
+ 3177, 3177, 3177, 3178, 3179, 3179, 3180, 3180, 3180, 3180,
+
+ 3180, 3180, 3180, 3180, 3180, 3181, 3181, 3182, 3182, 3182,
+ 3182, 3182, 3183, 3183, 3183, 3183, 3184, 3184, 3185, 3185,
+ 3186, 3187, 3187, 3188, 3188, 3188, 3188, 3188, 3189, 3190,
+ 3190, 3191, 3191, 3191, 3191, 3193, 3194, 3195, 3198, 3199,
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ 3200, 3200, 3200, 3200, 3201, 3201, 3202, 3203, 3203, 3203,
+ 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203,
+ 3203, 3203, 3203, 3204, 3204, 3204, 3205, 3206, 3207, 3208,
+ 3208, 3208, 3209, 3209, 3209, 3209, 3210, 3211, 3211, 3211,
+ 3211, 3212, 3212, 3213, 3214, 3214, 3215, 3215, 3215, 3216,
+
+ 3216, 3216, 3217, 3217, 3218, 3218, 3219, 3219, 3220, 3221,
+ 3222, 3223, 3223, 3223, 3223, 3224, 3224, 3225, 3225, 3225,
+ 3226, 3227, 3227, 3228, 3228, 3229, 3229, 3230, 3230, 3231,
+ 3232, 3233, 3234, 3234, 3234, 3235, 3235, 3236, 3236, 3236,
+ 3237, 3237, 3238, 3238, 3239, 3239, 3240, 3241, 3241, 3242,
+ 3243, 3244, 3244, 3245, 3245, 3245, 3246, 3246, 3247, 3247,
+ 3247, 3248, 3248, 3249, 3249, 3250, 3250, 3251, 3252, 3252,
+ 3253, 3254, 3255, 3255, 3256, 3256, 3257, 3257, 3257, 3257,
+ 3258, 3258, 3258, 3259, 3259, 3259, 3260, 3260, 3260, 3261,
+ 3262, 3262, 3262, 3263, 3264, 3264, 3264, 3264, 3265, 3265,
+
+ 3265, 3266, 3266, 3267, 3267, 3268, 3268, 3269, 3269, 3270,
+ 3271, 3271, 3272, 3272, 3272, 3272, 3272, 3272, 3272, 3275,
+ 3275, 3275, 3277, 3277, 3277, 3278, 3279, 3280, 3281, 3281,
+ 3281, 3281, 3282, 3284, 3285, 3286, 3287, 3288, 3289, 3289,
+ 3289, 3290, 3290, 3290, 3291, 3291, 3292, 3292, 3293, 3294,
+ 3295, 3295, 3296, 3296, 3296, 3300, 3301, 3301, 3302, 3302,
+ 3304, 3304, 3304, 3305, 3305, 3307, 3307, 3309, 3310, 3310,
+ 3310, 3311, 3311, 3311, 3313, 3313, 3313, 3314, 3314, 3315,
+ 3315, 3317, 3317, 3319, 3320, 3320, 3322, 3323, 3323, 3323,
+ 3323, 3323, 3325, 3327, 3327, 3328, 3328, 3328, 3328, 3328,
+
+ 3329, 3329, 3332, 3332, 3335, 3337, 3337, 3337, 3338, 3340,
+ 3341, 3341, 3341, 3344, 3344, 3344, 3344, 3347, 3347, 3348,
+ 3349, 3350, 3350, 3350, 3351, 3352, 3353, 3353, 3354, 3354,
+ 3354, 3355, 3358, 3361, 3362, 3362, 3363, 3363, 3365, 3365,
+ 3365, 3365, 3365, 3365, 3366, 3366, 3366, 3368, 3368, 3370,
+ 3370, 3372, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373,
+ 3373, 3373, 3373, 3374, 3374, 3375, 3375, 3375, 3375, 3375,
+ 3375, 3375, 3377, 3379, 3379, 3379, 3381, 3383, 3384, 3384,
+ 3384, 3386, 3386, 3388, 3388, 3390, 3391, 3391, 3391, 3391,
+ 3391, 3391, 3391, 3391, 3391, 3392, 3392, 3393, 3393, 3393,
+
+ 3393, 3393, 3393, 3393, 3395, 3397, 3397, 3397, 3397, 3398,
+ 3398, 3399, 3399, 3399, 3400, 3400, 3401, 3401, 3402, 3402,
+ 3402, 3402, 3402, 3403, 3403, 3403, 3403, 3404, 3404, 3405,
+ 3405, 3406, 3407, 3407, 3408, 3408, 3408, 3408, 3408, 3409,
+ 3410, 3410, 3411, 3411, 3411, 3411, 3411, 3412, 3412, 3412,
+ 3413, 3413, 3414, 3414, 3414, 3415, 3415, 3416, 3416, 3417,
+ 3417, 3417, 3417, 3417, 3417, 3417, 3417, 3417, 3417, 3418,
+ 3418, 3418, 3418, 3418, 3418, 3418, 3419, 3420, 3420, 3420,
+ 3420, 3420, 3420, 3420, 3421, 3421, 3422, 3422, 3423, 3423,
+ 3423, 3423, 3423, 3423, 3423, 3423, 3423, 3423, 3424, 3424,
+
+ 3424, 3424, 3424, 3424, 3424, 3425, 3426, 3426, 3426, 3428,
+ 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429, 3429,
+ 3429, 3429, 3429, 3429, 3430, 3430, 3430, 3430, 3430, 3430,
+ 3430, 3430, 3430, 3430, 3431, 3431, 3431, 3431, 3432, 3433,
+ 3433, 3434, 3434, 3435, 3435, 3435, 3435, 3436, 3436, 3437,
+ 3438, 3438, 3439, 3439, 3439, 3439, 3440, 3440, 3441, 3441,
+ 3441, 3441, 3441, 3442, 3442, 3443, 3443, 3443, 3444, 3444,
+ 3445, 3445, 3446, 3446, 3447, 3448, 3448, 3449, 3450, 3451,
+ 3451, 3452, 3452, 3452, 3452, 3452, 3453, 3453, 3454, 3454,
+ 3454, 3455, 3455, 3456, 3456, 3457, 3457, 3457, 3457, 3458,
+
+ 3458, 3458, 3459, 3460, 3460, 3460, 3461, 3461, 3462, 3462,
+ 3463, 3463, 3463, 3463, 3464, 3464, 3464, 3465, 3466, 3468,
+ 3468, 3468, 3469, 3469, 3469, 3470, 3470, 3470, 3470, 3471,
+ 3473, 3473, 3474, 3474, 3475, 3475, 3475, 3476, 3476, 3477,
+ 3477, 3477, 3478, 3478, 3479, 3479, 3480, 3480, 3480, 3480,
+ 3482, 3482, 3482, 3484, 3484, 3485, 3486, 3487, 3487, 3487,
+ 3487, 3487, 3487, 3489, 3490, 3491, 3492, 3492, 3492, 3493,
+ 3493, 3493, 3494, 3495, 3495, 3497, 3497, 3497, 3499, 3499,
+ 3500, 3500, 3502, 3502, 3503, 3503, 3504, 3505, 3505, 3505,
+ 3507, 3507, 3509, 3509, 3511, 3512, 3512, 3512, 3512, 3512,
+
+ 3512, 3512, 3512, 3512, 3513, 3513, 3514, 3514, 3514, 3514,
+ 3514, 3514, 3514, 3516, 3518, 3518, 3518, 3521, 3521, 3521,
+ 3524, 3524, 3525, 3525, 3528, 3528, 3529, 3531, 3531, 3531,
+ 3531, 3532, 3533, 3535, 3536, 3537, 3538, 3538, 3538, 3538,
+ 3539, 3540, 3541, 3541, 3541, 3541, 3542, 3542, 3542, 3543,
+ 3543, 3545, 3545, 3545, 3547, 3547, 3548, 3548, 3550, 3550,
+ 3550, 3550, 3550, 3550, 3551, 3551, 3551, 3551, 3551, 3551,
+ 3551, 3551, 3551, 3551, 3551, 3551, 3551, 3551, 3551, 3552,
+ 3552, 3552, 3553, 3553, 3553, 3553, 3553, 3553, 3553, 3553,
+ 3555, 3557, 3558, 3558, 3558, 3558, 3558, 3558, 3558, 3558,
+
+ 3558, 3558, 3558, 3558, 3558, 3559, 3559, 3559, 3560, 3560,
+ 3560, 3560, 3560, 3560, 3560, 3560, 3561, 3561, 3561, 3562,
+ 3562, 3563, 3563, 3564, 3564, 3565, 3565, 3566, 3566, 3566,
+ 3567, 3567, 3568, 3568, 3569, 3569, 3569, 3569, 3569, 3569,
+ 3569, 3569, 3569, 3569, 3570, 3570, 3570, 3570, 3570, 3570,
+ 3570, 3571, 3572, 3572, 3572, 3572, 3573, 3573, 3574, 3574,
+ 3574, 3575, 3575, 3576, 3576, 3577, 3577, 3577, 3577, 3577,
+ 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3578, 3578,
+ 3578, 3579, 3579, 3579, 3579, 3579, 3579, 3579, 3579, 3579,
+ 3579, 3579, 3579, 3579, 3579, 3579, 3579, 3579, 3579, 3579,
+
+ 3579, 3579, 3579, 3580, 3580, 3580, 3581, 3581, 3581, 3581,
+ 3581, 3581, 3581, 3581, 3582, 3583, 3584, 3584, 3584, 3584,
+ 3584, 3584, 3584, 3584, 3584, 3584, 3584, 3584, 3584, 3584,
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3586, 3586, 3586,
+ 3587, 3587, 3587, 3587, 3587, 3587, 3588, 3588, 3588, 3589,
+ 3589, 3589, 3589, 3590, 3590, 3591, 3591, 3592, 3592, 3593,
+ 3594, 3594, 3594, 3595, 3595, 3596, 3596, 3597, 3597, 3598,
+ 3598, 3598, 3598, 3598, 3599, 3599, 3600, 3600, 3601, 3601,
+ 3601, 3601, 3602, 3602, 3602, 3603, 3604, 3604, 3605, 3605,
+ 3605, 3606, 3606, 3607, 3607, 3608, 3608, 3608, 3608, 3608,
+
+ 3608, 3608, 3609, 3609, 3609, 3610, 3610, 3610, 3610, 3610,
+ 3610, 3610, 3610, 3611, 3611, 3611, 3612, 3612, 3613, 3613,
+ 3613, 3614, 3614, 3615, 3615, 3615, 3615, 3615, 3615, 3616,
+ 3616, 3617, 3617, 3618, 3618, 3619, 3619, 3619, 3620, 3620,
+ 3620, 3621, 3621, 3622, 3622, 3622, 3623, 3623, 3624, 3624,
+ 3625, 3625, 3626, 3626, 3628, 3628, 3630, 3630, 3630, 3630,
+ 3630, 3631, 3631, 3631, 3633, 3633, 3633, 3635, 3636, 3637,
+ 3638, 3638, 3638, 3638, 3640, 3642, 3644, 3644, 3645, 3647,
+ 3647, 3649, 3650, 3650, 3651, 3651, 3651, 3652, 3652, 3652,
+ 3653, 3653, 3654, 3654, 3655, 3656, 3656, 3656, 3656, 3656,
+
+ 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3657, 3657,
+ 3657, 3658, 3658, 3658, 3658, 3658, 3658, 3658, 3658, 3658,
+ 3658, 3661, 3664, 3667, 3667, 3668, 3671, 3671, 3671, 3672,
+ 3672, 3672, 3672, 3673, 3676, 3676, 3677, 3677, 3678, 3680,
+ 3681, 3682, 3682, 3682, 3682, 3682, 3682, 3683, 3683, 3686,
+ 3686, 3687, 3687, 3690, 3690, 3690, 3692, 3694, 3696, 3696,
+ 3697, 3699, 3699, 3701, 3702, 3702, 3703, 3703, 3703, 3703,
+ 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703,
+ 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3704, 3704, 3706,
+ 3706, 3707, 3707, 3709, 3709, 3709, 3709, 3709, 3709, 3709,
+
+ 3710, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712,
+ 3712, 3712, 3712, 3713, 3713, 3715, 3715, 3716, 3716, 3718,
+ 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3719, 3720,
+ 3721, 3721, 3722, 3723, 3723, 3724, 3725, 3725, 3725, 3725,
+ 3726, 3726, 3726, 3727, 3727, 3728, 3728, 3729, 3729, 3729,
+ 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729,
+ 3730, 3730, 3730, 3731, 3731, 3731, 3731, 3731, 3731, 3731,
+ 3731, 3731, 3732, 3732, 3732, 3733, 3734, 3735, 3735, 3736,
+ 3737, 3737, 3738, 3739, 3739, 3739, 3739, 3739, 3739, 3739,
+ 3739, 3739, 3739, 3739, 3739, 3739, 3739, 3739, 3740, 3740,
+
+ 3741, 3741, 3742, 3742, 3743, 3743, 3743, 3743, 3743, 3743,
+ 3743, 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744,
+ 3744, 3744, 3744, 3744, 3745, 3745, 3746, 3746, 3747, 3747,
+ 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748,
+ 3749, 3749, 3750, 3751, 3751, 3751, 3751, 3751, 3751, 3751,
+ 3751, 3751, 3751, 3752, 3752, 3753, 3754, 3755, 3756, 3756,
+ 3756, 3757, 3757, 3757, 3757, 3758, 3758, 3758, 3758, 3758,
+ 3758, 3758, 3759, 3759, 3759, 3760, 3761, 3761, 3761, 3761,
+ 3761, 3761, 3762, 3762, 3763, 3763, 3764, 3764, 3765, 3766,
+ 3766, 3767, 3767, 3767, 3767, 3768, 3769, 3770, 3770, 3771,
+
+ 3772, 3772, 3773, 3774, 3774, 3774, 3774, 3774, 3774, 3774,
+ 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3776,
+ 3776, 3776, 3777, 3777, 3777, 3777, 3777, 3778, 3779, 3780,
+ 3780, 3781, 3782, 3782, 3783, 3784, 3784, 3784, 3784, 3784,
+ 3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787, 3788, 3788,
+ 3788, 3788, 3788, 3788, 3789, 3789, 3790, 3790, 3791, 3791,
+ 3792, 3793, 3793, 3794, 3794, 3794, 3795, 3795, 3795, 3796,
+ 3796, 3796, 3797, 3798, 3798, 3799, 3800, 3800, 3801, 3801,
+ 3802, 3802, 3803, 3803, 3804, 3804, 3805, 3805, 3806, 3806,
+ 3806, 3807, 3808, 3809, 3809, 3810, 3811, 3811, 3812, 3812,
+
+ 3812, 3812, 3812, 3812, 3812, 3812, 3814, 3814, 3815, 3815,
+ 3815, 3817, 3818, 3819, 3819, 3819, 3821, 3823, 3823, 3823,
+ 3823, 3823, 3825, 3826, 3826, 3826, 3828, 3828, 3830, 3830,
+ 3831, 3831, 3831, 3831, 3833, 3834, 3834, 3836, 3837, 3837,
+ 3837, 3838, 3838, 3839, 3839, 3841, 3841, 3841, 3841, 3841,
+ 3842, 3843, 3844, 3844, 3845, 3846, 3846, 3848, 3849, 3849,
+ 3850, 3850, 3850, 3850, 3850, 3850, 3850, 3850, 3850, 3850,
+ 3850, 3850, 3850, 3850, 3851, 3851, 3853, 3853, 3854, 3854,
+ 3856, 3856, 3856, 3856, 3856, 3856, 3856, 3856, 3859, 3859,
+ 3859, 3859, 3859, 3859, 3859, 3860, 3860, 3863, 3863, 3864,
+
+ 3864, 3865, 3865, 3868, 3869, 3869, 3870, 3871, 3872, 3873,
+ 3873, 3873, 3874, 3874, 3875, 3875, 3876, 3878, 3878, 3878,
+ 3881, 3881, 3881, 3884, 3884, 3885, 3885, 3888, 3891, 3894,
+ 3894, 3895, 3895, 3895, 3895, 3895, 3897, 3897, 3899, 3899,
+ 3900, 3900, 3900, 3900, 3902, 3903, 3903, 3905, 3906, 3906,
+ 3906, 3907, 3907, 3908, 3908, 3910, 3910, 3910, 3910, 3910,
+ 3910, 3910, 3910, 3910, 3910, 3912, 3912, 3912, 3914, 3914,
+ 3914, 3914, 3914, 3914, 3914, 3914, 3914, 3914, 3915, 3915,
+ 3917, 3919, 3921, 3921, 3922, 3922, 3924, 3925, 3925, 3925,
+ 3925, 3925, 3925, 3925, 3925, 3925, 3927, 3927, 3927, 3929,
+
+ 3929, 3929, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931,
+ 3932, 3932, 3934, 3936, 3938, 3938, 3939, 3939, 3941, 3942,
+ 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3943,
+ 3943, 3944, 3944, 3944, 3944, 3944, 3945, 3946, 3946, 3947,
+ 3947, 3947, 3947, 3948, 3948, 3949, 3949, 3949, 3949, 3949,
+ 3950, 3951, 3952, 3952, 3953, 3954, 3954, 3955, 3956, 3956,
+ 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+ 3956, 3956, 3956, 3957, 3957, 3958, 3958, 3959, 3959, 3960,
+ 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3961, 3961,
+ 3962, 3962, 3962, 3962, 3962, 3963, 3964, 3964, 3965, 3965,
+
+ 3965, 3965, 3966, 3966, 3967, 3967, 3967, 3967, 3967, 3968,
+ 3968, 3968, 3969, 3969, 3969, 3969, 3969, 3969, 3969, 3969,
+ 3970, 3970, 3971, 3972, 3973, 3973, 3974, 3974, 3975, 3975,
+ 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975,
+ 3976, 3976, 3976, 3977, 3977, 3977, 3977, 3977, 3977, 3977,
+ 3977, 3978, 3978, 3979, 3980, 3981, 3981, 3982, 3982, 3983,
+ 3983, 3983, 3983, 3983, 3983, 3983, 3983, 3983, 3984, 3984,
+ 3985, 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986,
+ 3986, 3986, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3992,
+ 3992, 3992, 3993, 3993, 3993, 3993, 3993, 3994, 3994, 3994,
+
+ 3994, 3994, 3995, 3995, 3996, 3997, 3997, 3997, 3997, 3997,
+ 3997, 3998, 3998, 3998, 3998, 3999, 3999, 3999, 4000, 4000,
+ 4001, 4001, 4002, 4002, 4002, 4003, 4004, 4004, 4005, 4005,
+ 4006, 4006, 4007, 4007, 4007, 4007, 4007, 4007, 4007, 4008,
+ 4008, 4008, 4009, 4010, 4010, 4010, 4010, 4010, 4010, 4010,
+ 4011, 4011, 4012, 4012, 4013, 4013, 4014, 4014, 4014, 4015,
+ 4015, 4016, 4016, 4016, 4017, 4018, 4018, 4019, 4019, 4020,
+ 4020, 4021, 4021, 4021, 4022, 4022, 4022, 4023, 4023, 4024,
+ 4024, 4025, 4026, 4027, 4027, 4028, 4028, 4029, 4029, 4029,
+ 4030, 4030, 4030, 4031, 4031, 4032, 4032, 4033, 4034, 4035,
+
+ 4035, 4036, 4036, 4037, 4037, 4037, 4038, 4038, 4038, 4039,
+ 4040, 4040, 4040, 4041, 4042, 4042, 4042, 4042, 4043, 4043,
+ 4044, 4044, 4045, 4045, 4046, 4047, 4047, 4048, 4048, 4049,
+ 4050, 4050, 4051, 4051, 4051, 4052, 4052, 4052, 4052, 4053,
+ 4053, 4054, 4054, 4055, 4055, 4056, 4056, 4057, 4057, 4058,
+ 4058, 4058, 4060, 4060, 4060, 4060, 4062, 4062, 4063, 4064,
+ 4065, 4067, 4067, 4067, 4070, 4070, 4070, 4072, 4073, 4074,
+ 4075, 4075, 4075, 4077, 4077, 4079, 4080, 4080, 4080, 4081,
+ 4081, 4081, 4083, 4083, 4083, 4084, 4084, 4085, 4085, 4087,
+ 4087, 4089, 4090, 4090, 4092, 4093, 4093, 4093, 4093, 4093,
+
+ 4095, 4097, 4097, 4098, 4098, 4098, 4098, 4098, 4099, 4099,
+ 4101, 4101, 4102, 4102, 4102, 4102, 4104, 4105, 4105, 4106,
+ 4107, 4107, 4107, 4108, 4108, 4109, 4109, 4110, 4110, 4110,
+ 4110, 4110, 4112, 4112, 4112, 4114, 4114, 4114, 4114, 4114,
+ 4114, 4114, 4114, 4115, 4115, 4117, 4119, 4121, 4121, 4122,
+ 4122, 4124, 4125, 4125, 4125, 4125, 4125, 4125, 4125, 4125,
+ 4125, 4125, 4125, 4125, 4128, 4128, 4129, 4129, 4129, 4132,
+ 4133, 4134, 4134, 4135, 4135, 4138, 4138, 4138, 4139, 4139,
+ 4142, 4142, 4143, 4144, 4145, 4148, 4151, 4151, 4152, 4152,
+ 4152, 4152, 4152, 4153, 4154, 4155, 4155, 4156, 4157, 4157,
+
+ 4158, 4158, 4162, 4162, 4162, 4165, 4165, 4165, 4165, 4165,
+ 4165, 4165, 4168, 4171, 4172, 4173, 4173, 4175, 4175, 4177,
+ 4178, 4178, 4178, 4179, 4179, 4179, 4181, 4181, 4181, 4182,
+ 4182, 4183, 4183, 4185, 4185, 4187, 4188, 4188, 4190, 4191,
+ 4191, 4191, 4191, 4191, 4193, 4195, 4195, 4196, 4196, 4196,
+ 4196, 4196, 4196, 4196, 4196, 4196, 4196, 4198, 4198, 4198,
+ 4200, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201,
+ 4201, 4201, 4203, 4204, 4204, 4204, 4206, 4208, 4209, 4209,
+ 4209, 4209, 4209, 4209, 4209, 4209, 4209, 4209, 4209, 4211,
+ 4211, 4211, 4213, 4214, 4214, 4214, 4214, 4214, 4214, 4214,
+
+ 4214, 4214, 4216, 4217, 4217, 4217, 4219, 4221, 4222, 4222,
+ 4222, 4222, 4222, 4222, 4222, 4222, 4222, 4222, 4223, 4223,
+ 4224, 4224, 4224, 4224, 4224, 4225, 4225, 4225, 4225, 4226,
+ 4226, 4227, 4227, 4228, 4229, 4229, 4230, 4230, 4230, 4230,
+ 4230, 4231, 4232, 4232, 4233, 4233, 4233, 4233, 4233, 4234,
+ 4234, 4235, 4235, 4235, 4235, 4235, 4236, 4237, 4237, 4238,
+ 4238, 4238, 4238, 4239, 4239, 4240, 4240, 4240, 4240, 4240,
+ 4241, 4241, 4241, 4242, 4242, 4242, 4242, 4242, 4242, 4242,
+ 4242, 4243, 4243, 4244, 4245, 4246, 4246, 4247, 4247, 4248,
+ 4248, 4248, 4248, 4248, 4248, 4248, 4248, 4248, 4248, 4248,
+
+ 4249, 4249, 4250, 4250, 4250, 4250, 4250, 4251, 4251, 4251,
+ 4251, 4252, 4252, 4253, 4253, 4254, 4255, 4255, 4256, 4256,
+ 4256, 4256, 4256, 4257, 4258, 4258, 4259, 4259, 4259, 4259,
+ 4259, 4259, 4260, 4260, 4260, 4261, 4261, 4261, 4261, 4261,
+ 4261, 4261, 4261, 4261, 4262, 4262, 4262, 4263, 4264, 4264,
+ 4264, 4264, 4264, 4264, 4264, 4264, 4264, 4264, 4264, 4265,
+ 4265, 4265, 4266, 4266, 4266, 4266, 4266, 4266, 4266, 4266,
+ 4266, 4267, 4267, 4267, 4268, 4269, 4269, 4269, 4269, 4269,
+ 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4270,
+ 4270, 4271, 4272, 4272, 4272, 4272, 4272, 4273, 4274, 4275,
+
+ 4275, 4275, 4275, 4275, 4275, 4276, 4276, 4276, 4277, 4278,
+ 4279, 4280, 4280, 4280, 4281, 4281, 4281, 4282, 4283, 4284,
+ 4284, 4284, 4285, 4285, 4285, 4285, 4285, 4285, 4285, 4286,
+ 4286, 4286, 4287, 4287, 4287, 4288, 4288, 4288, 4289, 4289,
+ 4290, 4290, 4290, 4291, 4291, 4292, 4292, 4293, 4293, 4294,
+ 4295, 4295, 4296, 4297, 4298, 4298, 4299, 4299, 4299, 4299,
+ 4299, 4300, 4300, 4300, 4301, 4302, 4302, 4302, 4302, 4303,
+ 4303, 4303, 4303, 4303, 4304, 4304, 4304, 4305, 4305, 4306,
+ 4306, 4307, 4308, 4309, 4309, 4310, 4310, 4311, 4311, 4311,
+ 4312, 4312, 4313, 4313, 4313, 4314, 4314, 4315, 4315, 4316,
+
+ 4316, 4317, 4318, 4318, 4319, 4320, 4321, 4321, 4322, 4322,
+ 4322, 4322, 4323, 4323, 4323, 4324, 4325, 4326, 4327, 4327,
+ 4327, 4328, 4328, 4328, 4329, 4330, 4331, 4332, 4332, 4332,
+ 4333, 4333, 4333, 4334, 4335, 4335, 4335, 4337, 4338, 4338,
+ 4339, 4339, 4340, 4340, 4341, 4341, 4342, 4343, 4343, 4344,
+ 4344, 4346, 4347, 4347, 4347, 4348, 4348, 4348, 4349, 4349,
+ 4350, 4350, 4351, 4351, 4352, 4352, 4353, 4354, 4355, 4355,
+ 4356, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4363,
+ 4363, 4363, 4364, 4366, 4367, 4368, 4369, 4370, 4370, 4371,
+ 4371, 4371, 4373, 4373, 4375, 4375, 4377, 4378, 4378, 4378,
+
+ 4378, 4378, 4378, 4378, 4378, 4378, 4379, 4379, 4380, 4380,
+ 4380, 4380, 4380, 4380, 4380, 4382, 4384, 4384, 4384, 4384,
+ 4386, 4386, 4387, 4388, 4388, 4388, 4389, 4389, 4389, 4390,
+ 4390, 4390, 4391, 4391, 4392, 4392, 4393, 4393, 4395, 4396,
+ 4396, 4397, 4398, 4398, 4398, 4398, 4398, 4399, 4400, 4400,
+ 4401, 4401, 4401, 4401, 4401, 4401, 4403, 4403, 4403, 4405,
+ 4406, 4406, 4406, 4406, 4406, 4406, 4406, 4406, 4406, 4408,
+ 4409, 4409, 4409, 4411, 4413, 4414, 4414, 4414, 4414, 4414,
+ 4414, 4414, 4414, 4414, 4415, 4415, 4415, 4418, 4418, 4418,
+ 4418, 4421, 4421, 4422, 4423, 4424, 4424, 4424, 4425, 4426,
+
+ 4427, 4427, 4428, 4428, 4428, 4429, 4432, 4435, 4436, 4436,
+ 4437, 4437, 4437, 4437, 4438, 4438, 4439, 4439, 4440, 4440,
+ 4441, 4441, 4441, 4442, 4443, 4444, 4445, 4446, 4447, 4448,
+ 4448, 4448, 4450, 4450, 4452, 4452, 4454, 4455, 4455, 4455,
+ 4455, 4455, 4455, 4455, 4455, 4455, 4456, 4456, 4457, 4457,
+ 4457, 4457, 4457, 4457, 4457, 4459, 4461, 4461, 4461, 4461,
+ 4461, 4461, 4463, 4464, 4464, 4464, 4465, 4465, 4465, 4465,
+ 4465, 4465, 4465, 4465, 4465, 4466, 4466, 4467, 4467, 4467,
+ 4467, 4467, 4467, 4467, 4467, 4467, 4468, 4468, 4470, 4471,
+ 4471, 4471, 4472, 4472, 4472, 4472, 4472, 4472, 4472, 4472,
+
+ 4472, 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473,
+ 4474, 4474, 4474, 4474, 4475, 4475, 4476, 4476, 4477, 4477,
+ 4477, 4477, 4477, 4477, 4477, 4477, 4477, 4477, 4478, 4478,
+ 4478, 4478, 4478, 4478, 4478, 4479, 4480, 4480, 4480, 4480,
+ 4481, 4481, 4482, 4482, 4482, 4482, 4482, 4483, 4483, 4483,
+ 4483, 4484, 4484, 4485, 4485, 4486, 4487, 4487, 4488, 4488,
+ 4488, 4488, 4488, 4489, 4490, 4490, 4491, 4491, 4491, 4491,
+ 4491, 4491, 4492, 4492, 4492, 4493, 4493, 4493, 4493, 4493,
+ 4493, 4493, 4493, 4493, 4494, 4494, 4494, 4495, 4496, 4496,
+ 4496, 4496, 4496, 4496, 4496, 4496, 4496, 4497, 4497, 4497,
+
+ 4498, 4498, 4499, 4499, 4500, 4500, 4500, 4500, 4500, 4500,
+ 4500, 4500, 4500, 4500, 4501, 4501, 4501, 4501, 4501, 4501,
+ 4501, 4502, 4503, 4503, 4503, 4504, 4504, 4504, 4504, 4504,
+ 4504, 4504, 4504, 4504, 4504, 4504, 4504, 4504, 4504, 4504,
+ 4504, 4504, 4504, 4504, 4505, 4505, 4506, 4506, 4506, 4506,
+ 4506, 4506, 4506, 4506, 4506, 4506, 4506, 4506, 4506, 4506,
+ 4506, 4506, 4506, 4506, 4506, 4507, 4507, 4507, 4507, 4507,
+ 4507, 4507, 4507, 4507, 4507, 4507, 4507, 4508, 4508, 4508,
+ 4508, 4508, 4508, 4509, 4509, 4509, 4510, 4510, 4511, 4511,
+ 4512, 4512, 4513, 4513, 4514, 4514, 4514, 4515, 4515, 4516,
+
+ 4516, 4517, 4517, 4517, 4517, 4518, 4518, 4518, 4519, 4520,
+ 4520, 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4522, 4522,
+ 4522, 4522, 4523, 4524, 4524, 4524, 4524, 4524, 4524, 4525,
+ 4525, 4525, 4525, 4526, 4526, 4526, 4527, 4528, 4529, 4530,
+ 4530, 4530, 4530, 4531, 4531, 4532, 4532, 4533, 4533, 4533,
+ 4533, 4534, 4534, 4534, 4535, 4536, 4537, 4538, 4538, 4538,
+ 4538, 4539, 4539, 4540, 4540, 4540, 4541, 4541, 4541, 4542,
+ 4542, 4542, 4543, 4543, 4543, 4543, 4544, 4544, 4544, 4545,
+ 4546, 4547, 4548, 4548, 4548, 4548, 4548, 4548, 4549, 4550,
+ 4550, 4551, 4551, 4551, 4551, 4551, 4551, 4551, 4551, 4551,
+
+ 4551, 4551, 4551, 4551, 4552, 4552, 4552, 4553, 4553, 4553,
+ 4553, 4553, 4553, 4553, 4553, 4554, 4554, 4554, 4555, 4555,
+ 4557, 4557, 4558, 4559, 4559, 4559, 4559, 4559, 4559, 4559,
+ 4559, 4559, 4560, 4560, 4561, 4561, 4561, 4561, 4561, 4561,
+ 4561, 4562, 4563, 4563, 4563, 4565, 4566, 4566, 4566, 4567,
+ 4567, 4567, 4567, 4567, 4567, 4567, 4567, 4567, 4568, 4568,
+ 4568, 4568, 4568, 4568, 4568, 4568, 4568, 4569, 4569, 4570,
+ 4571, 4572, 4572, 4572, 4572, 4573, 4574, 4575, 4575, 4575,
+ 4575, 4576, 4576, 4576, 4577, 4577, 4577, 4577, 4578, 4578,
+ 4578, 4579, 4579, 4580, 4580, 4581, 4581, 4582, 4582, 4583,
+
+ 4584, 4585, 4585, 4586, 4586, 4587, 4588, 4589, 4590, 4591,
+ 4592, 4593, 4593, 4593, 4593, 4593, 4593, 4593, 4593, 4593,
+ 4593, 4593, 4593, 4593, 4594, 4594, 4594, 4595, 4595, 4595,
+ 4595, 4595, 4595, 4595, 4595, 4595, 4595, 4596, 4596, 4596,
+ 4596, 4596, 4596, 4596, 4596, 4596, 4597, 4597, 4597, 4597,
+ 4597, 4597, 4597, 4597, 4597, 4598, 4598, 4598, 4599, 4599,
+ 4599, 4599, 4599, 4599, 4599, 4599, 4599, 4600, 4600, 4600,
+ 4600, 4600, 4600, 4600, 4600, 4601, 4601, 4601, 4601, 4601,
+ 4601, 4601, 4601, 4601, 4601, 4601, 4601, 4601, 4601, 4601,
+ 4602, 4602, 4602, 4603, 4603, 4603, 4603, 4603, 4603, 4603,
+
+ 4603, 4603, 4603, 4604, 4604, 4605, 4605, 4606, 4606, 4606,
+ 4606, 4606, 4606, 4606, 4606, 4606, 4606, 4607, 4607, 4607,
+ 4607, 4607, 4607, 4607, 4608, 4609, 4609, 4609, 4610, 4610,
+ 4610, 4610, 4610, 4610, 4610, 4610, 4610, 4610, 4610, 4610,
+ 4610, 4610, 4610, 4610, 4610, 4610, 4610, 4611, 4611, 4611,
+ 4611, 4611, 4611, 4611, 4611, 4611, 4611, 4611, 4611, 4611,
+ 4611, 4612, 4612, 4612, 4613, 4613, 4613, 4613, 4613, 4613,
+ 4613, 4613, 4613, 4613, 4613, 4613, 4613, 4613, 4613, 4613,
+ 4614, 4614, 4614, 4614, 4614, 4614, 4614, 4614, 4615, 4615,
+ 4615, 4615, 4615, 4615, 4615, 4615, 4615, 4615, 4615, 4616,
+
+ 4616, 4616, 4616, 4616, 4616, 4616, 4616, 4617, 4617, 4617,
+ 4617, 4617, 4617, 4617, 4617, 4617, 4617, 4618, 4618, 4618,
+ 4619, 4619, 4619, 4619, 4620, 4621, 4621, 4621, 4621, 4622,
+ 4622, 4623, 4624, 4624, 4625, 4625, 4625, 4625, 4625, 4625,
+ 4625, 4625, 4626, 4626, 4626, 4627, 4627, 4627, 4627, 4627,
+ 4627, 4628, 4628, 4628, 4628, 4628, 4628, 4629, 4629, 4629,
+ 4629, 4629, 4630, 4630, 4630, 4630, 4630, 4630, 4630, 4631,
+ 4631, 4631, 4632, 4632, 4632, 4632, 4632, 4632, 4632, 4632,
+ 4632, 4633, 4633, 4633, 4634, 4634, 4634, 4634, 4634, 4634,
+ 4634, 4634, 4635, 4635, 4635, 4636, 4636, 4636, 4636, 4638,
+
+ 4638, 4638, 4640, 4641, 4641, 4641, 4641, 4641, 4641, 4641,
+ 4641, 4641, 4641, 4641, 4641, 4642, 4642, 4644, 4644, 4645,
+ 4645, 4647, 4647, 4647, 4647, 4647, 4647, 4647, 4648, 4648,
+ 4648, 4648, 4648, 4648, 4648, 4648, 4648, 4648, 4648, 4648,
+ 4648, 4649, 4649, 4649, 4650, 4650, 4650, 4650, 4650, 4650,
+ 4650, 4650, 4651, 4651, 4651, 4651, 4651, 4651, 4651, 4651,
+ 4651, 4652, 4652, 4652, 4652, 4652, 4652, 4652, 4652, 4653,
+ 4653, 4653, 4654, 4655, 4655, 4655, 4655, 4655, 4655, 4656,
+ 4656, 4659, 4659, 4660, 4660, 4663, 4663, 4663, 4664, 4664,
+ 4664, 4665, 4665, 4665, 4665, 4666, 4666, 4666, 4667, 4668,
+
+ 4669, 4670, 4670, 4670, 4670, 4670, 4670, 4670, 4670, 4670,
+ 4670, 4670, 4670, 4671, 4671, 4673, 4673, 4674, 4674, 4676,
+ 4676, 4676, 4676, 4676, 4676, 4676, 4676, 4676, 4676, 4676,
+ 4676, 4676, 4676, 4677, 4677, 4677, 4677, 4677, 4677, 4677,
+ 4678, 4678, 4678, 4678, 4678, 4678, 4678, 4678, 4678, 4679,
+ 4679, 4679, 4679, 4679, 4679, 4679, 4680, 4680, 4680, 4680,
+ 4680, 4680, 4680, 4680, 4680, 4680, 4680, 4680, 4680, 4680,
+ 4681, 4681, 4682, 4682, 4683, 4683, 4684, 4684, 4684, 4684,
+ 4684, 4684, 4684, 4684, 4684, 4684, 4684, 4684, 4684, 4684,
+ 4684, 4684, 4684, 4684, 4684, 4685, 4685, 4685, 4686, 4686,
+
+ 4686, 4686, 4686, 4686, 4686, 4686, 4686, 4686, 4686, 4686,
+ 4686, 4686, 4686, 4686, 4687, 4687, 4687, 4687, 4687, 4687,
+ 4687, 4687, 4688, 4688, 4688, 4688, 4688, 4688, 4688, 4688,
+ 4688, 4688, 4688, 4688, 4688, 4688, 4689, 4689, 4690, 4690,
+ 4691, 4691, 4692, 4692, 4692, 4692, 4692, 4692, 4692, 4692,
+ 4692, 4692, 4692, 4692, 4692, 4693, 4693, 4693, 4693, 4693,
+ 4693, 4693, 4694, 4694, 4694, 4694, 4694, 4694, 4694, 4694,
+ 4694, 4695, 4695, 4695, 4695, 4695, 4695, 4695, 4696, 4696,
+ 4696, 4696, 4696, 4696, 4696, 4696, 4696, 4696, 4697, 4697,
+ 4697, 4697, 4698, 4698, 4698, 4699, 4700, 4700, 4700, 4700,
+
+ 4700, 4700, 4701, 4701, 4702, 4702, 4703, 4703, 4704, 4704,
+ 4704, 4704, 4704, 4704, 4704, 4705, 4705, 4705, 4706, 4706,
+ 4706, 4706, 4706, 4706, 4706, 4707, 4707, 4708, 4708, 4709,
+ 4709, 4710, 4710, 4710, 4711, 4711, 4711, 4712, 4712, 4713,
+ 4713, 4714, 4714, 4715, 4715, 4716, 4716, 4716, 4716, 4716,
+ 4716, 4717, 4717, 4718, 4718, 4719, 4719, 4720, 4720, 4720,
+ 4722, 4724, 4724, 4724, 4724, 4724, 4724, 4724, 4726, 4726,
+ 4726, 4728, 4728, 4728, 4728, 4728, 4728, 4728, 4728, 4729,
+ 4729, 4731, 4733, 4735, 4735, 4736, 4736, 4738, 4739, 4739,
+ 4739, 4739, 4739, 4739, 4739, 4739, 4739, 4739, 4739, 4739,
+
+ 4739, 4739, 4739, 4739, 4739, 4739, 4739, 4739, 4740, 4740,
+ 4741, 4741, 4742, 4742, 4743, 4743, 4743, 4743, 4743, 4743,
+ 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4744, 4744, 4744,
+ 4744, 4744, 4744, 4744, 4745, 4745, 4745, 4745, 4745, 4748,
+ 4748, 4748, 4751, 4751, 4752, 4752, 4755, 4758, 4761, 4761,
+ 4762, 4762, 4762, 4762, 4762, 4762, 4762, 4762, 4762, 4762,
+ 4763, 4763, 4763, 4764, 4764, 4764, 4764, 4766, 4766, 4766,
+ 4768, 4768, 4768, 4768, 4768, 4768, 4768, 4768, 4769, 4769,
+ 4771, 4773, 4775, 4775, 4776, 4776, 4778, 4779, 4779, 4779,
+ 4779, 4779, 4779, 4779, 4779, 4779, 4779, 4779, 4779, 4779,
+
+ 4779, 4780, 4780, 4780, 4780, 4780, 4780, 4780, 4780, 4780,
+ 4780, 4780, 4780, 4781, 4781, 4781, 4781, 4781, 4781, 4781,
+ 4781, 4781, 4781, 4782, 4782, 4782, 4783, 4783, 4783, 4783,
+ 4783, 4783, 4783, 4783, 4784, 4784, 4785, 4786, 4787, 4787,
+ 4788, 4788, 4789, 4789, 4789, 4789, 4789, 4789, 4789, 4789,
+ 4789, 4789, 4789, 4789, 4789, 4789, 4789, 4789, 4789, 4789,
+ 4789, 4789, 4790, 4790, 4791, 4791, 4792, 4792, 4793, 4793,
+ 4793, 4793, 4793, 4793, 4793, 4793, 4793, 4793, 4793, 4793,
+ 4793, 4794, 4794, 4794, 4794, 4794, 4794, 4794, 4795, 4795,
+ 4795, 4795, 4795, 4796, 4796, 4796, 4797, 4797, 4797, 4797,
+
+ 4797, 4797, 4797, 4797, 4798, 4798, 4799, 4800, 4801, 4801,
+ 4802, 4802, 4803, 4803, 4803, 4803, 4803, 4803, 4803, 4803,
+ 4803, 4803, 4803, 4803, 4803, 4804, 4804, 4804, 4804, 4804,
+ 4804, 4804, 4804, 4804, 4804, 4804, 4804, 4805, 4805, 4805,
+ 4805, 4805, 4805, 4805, 4805, 4805, 4805, 4805, 4805, 4805,
+ 4805, 4806, 4807, 4807, 4808, 4808, 4808, 4808, 4808, 4809,
+ 4809, 4810, 4811, 4811, 4811, 4812, 4812, 4812, 4813, 4813,
+ 4814, 4814, 4815, 4816, 4817, 4817, 4818, 4818, 4819, 4819,
+ 4819, 4819, 4819, 4819, 4820, 4820, 4820, 4820, 4821, 4821,
+ 4821, 4821, 4821, 4822, 4822, 4822, 4823, 4823, 4824, 4824,
+
+ 4825, 4826, 4827, 4827, 4828, 4828, 4829, 4829, 4829, 4830,
+ 4831, 4831, 4831, 4831, 4832, 4832, 4833, 4834, 4834, 4835,
+ 4835, 4835, 4835, 4836, 4836, 4836, 4837, 4837, 4838, 4838,
+ 4839, 4840, 4841, 4841, 4842, 4842, 4842, 4842, 4844, 4845,
+ 4846, 4846, 4846, 4848, 4848, 4848, 4850, 4851, 4851, 4851,
+ 4851, 4851, 4851, 4851, 4851, 4851, 4853, 4854, 4854, 4854,
+ 4856, 4858, 4859, 4859, 4859, 4859, 4859, 4859, 4859, 4859,
+ 4859, 4859, 4859, 4860, 4860, 4860, 4861, 4861, 4861, 4861,
+ 4861, 4861, 4861, 4861, 4862, 4862, 4863, 4864, 4865, 4865,
+ 4866, 4866, 4868, 4869, 4869, 4869, 4869, 4869, 4869, 4869,
+
+ 4869, 4869, 4869, 4869, 4869, 4869, 4870, 4870, 4870, 4870,
+ 4870, 4870, 4870, 4870, 4870, 4870, 4873, 4873, 4873, 4873,
+ 4873, 4873, 4873, 4876, 4879, 4880, 4881, 4881, 4881, 4881,
+ 4881, 4881, 4882, 4882, 4883, 4883, 4884, 4884, 4885, 4885,
+ 4885, 4887, 4887, 4887, 4889, 4890, 4890, 4890, 4890, 4890,
+ 4890, 4890, 4890, 4890, 4892, 4893, 4893, 4893, 4895, 4897,
+ 4898, 4898, 4898, 4898, 4898, 4898, 4898, 4898, 4898, 4898,
+ 4898, 4898, 4898, 4898, 4898, 4898, 4898, 4898, 4898, 4898,
+ 4898, 4898, 4898, 4898, 4898, 4898, 4898, 4898, 4898, 4899,
+ 4899, 4899, 4900, 4900, 4900, 4900, 4900, 4900, 4900, 4900,
+
+ 4900, 4901, 4901, 4901, 4902, 4903, 4903, 4903, 4903, 4903,
+ 4903, 4903, 4903, 4903, 4903, 4903, 4904, 4904, 4904, 4905,
+ 4905, 4905, 4905, 4905, 4905, 4905, 4905, 4906, 4906, 4907,
+ 4908, 4909, 4909, 4910, 4910, 4911, 4911, 4911, 4911, 4911,
+ 4911, 4911, 4911, 4911, 4911, 4911, 4911, 4911, 4912, 4912,
+ 4912, 4912, 4912, 4912, 4912, 4912, 4912, 4912, 4913, 4913,
+ 4913, 4914, 4914, 4914, 4914, 4914, 4914, 4914, 4914, 4914,
+ 4915, 4915, 4915, 4916, 4917, 4917, 4917, 4917, 4917, 4917,
+ 4917, 4917, 4917, 4917, 4917, 4917, 4917, 4917, 4917, 4917,
+ 4917, 4917, 4917, 4917, 4917, 4917, 4917, 4917, 4917, 4917,
+
+ 4917, 4918, 4919, 4920, 4920, 4921, 4922, 4923, 4923, 4923,
+ 4923, 4924, 4924, 4924, 4925, 4926, 4927, 4928, 4928, 4928,
+ 4928, 4928, 4928, 4928, 4928, 4929, 4929, 4929, 4929, 4929,
+ 4929, 4930, 4930, 4931, 4931, 4931, 4932, 4932, 4932, 4933,
+ 4934, 4935, 4936, 4937, 4938, 4938, 4938, 4939, 4939, 4939,
+ 4940, 4941, 4942, 4943, 4944, 4945, 4947, 4948, 4948, 4948,
+ 4949, 4949, 4949, 4949, 4949, 4949, 4949, 4949, 4949, 4950,
+ 4950, 4950, 4950, 4950, 4950, 4950, 4950, 4950, 4951, 4951,
+ 4951, 4951, 4952, 4952, 4952, 4954, 4955, 4955, 4955, 4955,
+ 4955, 4955, 4955, 4955, 4955, 4957, 4958, 4958, 4958, 4959,
+
+ 4960, 4961, 4961, 4961, 4961, 4961, 4961, 4961, 4961, 4961,
+ 4961, 4961, 4961, 4961, 4961, 4961, 4961, 4961, 4961, 4961,
+ 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4967, 4967, 4968,
+ 4968, 4968, 4969, 4969, 4970, 4970, 4971, 4972, 4973, 4973,
+ 4974, 4974, 4976, 4977, 4977, 4977, 4978, 4978, 4978, 4978,
+ 4978, 4978, 4978, 4978, 4978, 4979, 4979, 4979, 4979, 4979,
+ 4979, 4979, 4979, 4979, 4980, 4980, 4980, 4980, 4980, 4980,
+ 4980, 4980, 4980, 4980, 4980, 4980, 4980, 4980, 4980, 4980,
+ 4980, 4980, 4981, 4981, 4981, 4981, 4981, 4981, 4981, 4981,
+ 4981, 4981, 4981, 4981, 4981, 4981, 4981, 4981, 4981, 4981,
+
+ 4981, 4982, 4982, 4982, 4982, 4983, 4983, 4983, 4984, 4984,
+ 4984, 4984, 4984, 4984, 4984, 4984, 4984, 4985, 4985, 4985,
+ 4986, 4987, 4987, 4987, 4987, 4987, 4987, 4987, 4987, 4987,
+ 4987, 4987, 4987, 4987, 4987, 4987, 4987, 4987, 4987, 4988,
+ 4988, 4988, 4988, 4988, 4988, 4988, 4988, 4988, 4988, 4988,
+ 4988, 4988, 4988, 4988, 4988, 4988, 4988, 4988, 4989, 4989,
+ 4989, 4989, 4989, 4989, 4989, 4989, 4989, 4989, 4989, 4989,
+ 4989, 4989, 4989, 4989, 4989, 4989, 4990, 4990, 4990, 4990,
+ 4990, 4990, 4991, 4992, 4992, 4992, 4993, 4994, 4995, 4996,
+ 4996, 4996, 4996, 4996, 4996, 4996, 4996, 4996, 4997, 4997,
+
+ 4997, 4997, 4997, 4997, 4997, 4997, 4998, 4998, 4998, 5000,
+ 5001, 5001, 5001, 5002, 5002, 5002, 5002, 5002, 5002, 5002,
+ 5002, 5002, 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003,
+ 5003, 5004, 5004, 5004, 5004, 5004, 5004, 5004, 5004, 5004,
+ 5004, 5005, 5006, 5007, 5008, 5009, 5010, 5010, 5010, 5011,
+ 5011, 5011, 5012, 5013, 5014, 5014, 5014, 5014, 5014, 5014,
+ 5014, 5014, 5014, 5015, 5015, 5015, 5015, 5015, 5015, 5015,
+ 5015, 5016, 5016, 5016, 5016, 5016, 5016, 5016, 5016, 5016,
+ 5017, 5017, 5017, 5017, 5017, 5017, 5017, 5017, 5018, 5018,
+ 5018, 5018, 5018, 5018, 5018, 5018, 5018, 5018, 5019, 5019,
+
+ 5019, 5019, 5019, 5019, 5019, 5019, 5020, 5020, 5020, 5021,
+ 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5021,
+ 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5022, 5022,
+ 5022, 5022, 5022, 5022, 5022, 5022, 5022, 5022, 5022, 5022,
+ 5022, 5022, 5022, 5022, 5022, 5022, 5023, 5023, 5023, 5023,
+ 5023, 5023, 5023, 5023, 5024, 5024, 5024, 5024, 5024, 5024,
+ 5024, 5024, 5024, 5025, 5025, 5025, 5025, 5025, 5025, 5025,
+ 5025, 5026, 5026, 5027, 5027, 5027, 5027, 5027, 5027, 5027,
+ 5028, 5028, 5028, 5028, 5028, 5028, 5028, 5029, 5029, 5029,
+ 5030, 5030, 5030, 5030, 5030, 5030, 5030, 5030, 5030, 5031,
+
+ 5031, 5031, 5031, 5031, 5031, 5031, 5031, 5032, 5032, 5032,
+ 5032, 5032, 5032, 5032, 5032, 5032, 5033, 5033, 5034, 5035,
+ 5035, 5035, 5035, 5035, 5035, 5035, 5036, 5036, 5036, 5036,
+ 5036, 5036, 5036, 5037, 5037, 5037, 5037, 5037, 5038, 5038,
+ 5039, 5039, 5039, 5039, 5039, 5040, 5040, 5041, 5041, 5041,
+ 5041, 5041, 5041, 5041, 5041, 5041, 5042, 5042, 5042, 5042,
+ 5042, 5042, 5042, 5043, 5043, 5043, 5043, 5043, 5043, 5043,
+ 5043, 5043, 5043, 5043, 5044, 5044, 5044, 5044, 5044, 5044,
+ 5044, 5044, 5045, 5045, 5045, 5045, 5045, 5045, 5045, 5045,
+ 5045, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5047,
+
+ 5047, 5047, 5047, 5047, 5047, 5047, 5048, 5048, 5048, 5048,
+ 5048, 5049, 5049, 5050, 5050, 5050, 5050, 5050, 5051, 5051,
+ 5052, 5052, 5052, 5052, 5052, 5052, 5052, 5053, 5053, 5053,
+ 5053, 5053, 5053, 5053, 5053, 5053, 5053, 5053, 5053, 5053,
+ 5053, 5054, 5054, 5054, 5054, 5054, 5054, 5054, 5055, 5055,
+ 5055, 5055, 5055, 5056, 5056, 5057, 5057, 5057, 5057, 5057,
+ 5057, 5057, 5058, 5058, 5058, 5058, 5058, 5058, 5058, 5058,
+ 5059, 5059, 5059, 5059, 5060, 5060, 5060, 5060, 5060, 5060,
+ 5060, 5060, 5061, 5061, 5061, 5061, 5061, 5061, 5061, 5061,
+ 5061, 5061, 5061, 5061, 5061, 5061, 5062, 5062, 5062, 5062,
+
+ 5062, 5062, 5062, 5063, 5063, 5063, 5063, 5063, 5064, 5064,
+ 5065, 5065, 5065, 5065, 5065, 5065, 5065, 5066, 5066, 5066,
+ 5066, 5066, 5066, 5066, 5066, 5067, 5067, 5067, 5067, 5068,
+ 5068, 5068, 5068, 5068, 5068, 5068, 5068, 5068, 5068, 5068,
+ 5068, 5068, 5068, 5068, 5068, 5068, 5069, 5069, 5069, 5069,
+ 5069, 5069, 5069, 5069, 5070, 5070, 5070, 5070, 5070, 5070,
+ 5070, 5070, 5070, 5070, 5070, 5070, 5070, 5070, 5070, 5070,
+ 5070, 5070, 5070, 5070, 5070, 5070, 5070, 5070, 5070, 5070,
+ 5070, 5070, 5071, 5071, 5071, 5071, 5071, 5071, 5071, 5071,
+ 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072,
+
+ 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072,
+ 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072,
+ 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072,
+ 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072,
+ 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072,
+ 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072,
+ 5072, 5072, 5072, 5073, 5073, 5073, 5073, 5073, 5073, 5073,
+ 5073, 5073, 5073, 5073, 5073, 5073, 5073, 5073, 5073, 5074,
+ 5074, 5074, 5074, 5074, 5074, 5074, 5074, 5075, 5075, 5075,
+ 5075, 5075, 5075, 5075, 5075, 5075, 5075, 5075, 5075, 5075,
+
+ 5075, 5075, 5075, 5076, 5076, 5076, 5076, 5077, 5077, 5078,
+ 5078, 5078, 5078, 5078, 5078, 5078, 5078, 5078, 5079, 5079,
+ 5079, 5079, 5080, 5080, 5081, 5081, 5081, 5081, 5081, 5082,
+ 5082, 5083, 5083, 5083, 5083, 5083, 5083, 5083, 5083, 5083,
+ 5084, 5084, 5084, 5084, 5085, 5085, 5086, 5086, 5086, 5087,
+ 5087, 5087, 5087, 5087, 5087, 5088, 5088, 5089, 5089, 5089,
+ 5090, 5090, 5090, 5090, 5091, 5091, 5091, 5091, 5091, 5091,
+ 5092, 5092, 5093, 5093, 5093, 5094, 5094, 5094, 5094, 5094,
+ 5095, 5095, 5095, 5095, 5095, 5095, 5096, 5096, 5096, 5096,
+ 5096, 5096, 5096, 5096
+
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 4, 5, 1, 1, 6, 1, 7, 8,
+ 9, 10, 1, 11, 1, 1, 12, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 14, 15, 16,
+ 17, 18, 1, 1, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 28, 29, 30, 31, 32, 33,
+ 28, 34, 35, 36, 37, 38, 28, 39, 40, 28,
+ 1, 41, 1, 1, 42, 1, 43, 44, 45, 46,
+
+ 47, 48, 49, 50, 51, 28, 28, 52, 53, 54,
+ 55, 56, 28, 57, 58, 59, 60, 61, 28, 62,
+ 63, 28, 1, 64, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[65] =
+ { 0,
+ 1, 2, 3, 4, 1, 5, 1, 6, 7, 1,
+ 8, 1, 9, 10, 1, 11, 1, 11, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 1, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 7
+ } ;
+
+static yyconst flex_int32_t yy_base[12466] =
+ { 0,
+ 0, 5, 46, 110, 173, 230, 288, 352, 416, 480,
+ 11, 543, 35, 601, 25, 30, 660, 724, 788, 852,
+ 39, 128, 75, 84, 916, 980, 1044, 1108, 97, 160,
+ 138, 182, 1172, 1236, 33, 1299, 1359, 1423, 152, 1487,
+ 195, 206, 212, 221, 1551, 1615, 1679, 1743, 1807, 1871,
+ 235, 1934, 241, 253, 270, 276, 305, 0, 9781,85296,
+ 85296, 0,85296, 33, 9758,85296, 3, 9741, 317, 9728,
+ 7, 20, 1993, 283, 38, 92, 347, 100, 167, 74,
+ 85296, 11,85296,85296, 9714, 133,85296, 2057, 9686, 9673,
+ 23, 26, 30, 322, 546, 190, 141, 549, 574, 2116,
+
+ 366, 367, 371, 548, 2176, 204, 2240, 606, 2304, 659,
+ 2349, 597, 660, 661, 356, 664, 666, 2386, 296, 724,
+ 731, 598, 9655, 2445, 248, 782, 281, 718, 284, 283,
+ 560, 344, 86, 579, 209, 803, 149, 1892, 792, 725,
+ 851, 2486, 799, 1044, 237, 2546, 255, 2610, 721, 1895,
+ 852, 2656, 573, 845,85296, 0, 0,85296, 9649, 9598,
+ 189, 862, 276, 344, 351, 359, 1046, 555, 602, 544,
+ 9601, 137, 391, 9584, 81, 256, 846, 1047, 644, 663,
+ 727, 777, 1111, 743, 1300, 1064, 871,85296, 9545, 317,
+ 183, 9545, 9527,85296, 1125,85296, 607, 2716, 324, 394,
+
+ 9439, 9431,85296, 401,85296, 0,85296, 9409,85296, 9414,
+ 1061, 9410, 641,85296, 684, 9376, 695, 9371, 555, 1088,
+ 85296, 0,85296, 9349, 9350, 1297, 9344, 822, 9294, 745,
+ 260, 1308, 1130, 547, 9284, 9236, 1304, 1303, 1572, 1601,
+ 1136, 2780, 609, 331, 2844, 1550, 1537, 1552, 2907, 787,
+ 1616, 2947, 1551, 1620, 1621, 2984, 1111, 1554, 1679, 1150,
+ 85296, 760, 9243, 9217, 9202, 1633, 1779, 1664, 1708, 1646,
+ 1757, 3039, 807, 1694, 3098,85296, 3154, 884, 388, 637,
+ 3218, 1682, 1673, 863, 1052, 1277, 1686, 1735, 3264, 1746,
+ 1752,85296, 9175,85296, 845, 1300, 9182, 1780, 1074, 9174,
+
+ 1802, 1746, 1838, 1584, 1837, 1867, 1874, 1893, 1897, 1737,
+ 1097, 1725, 9155,85296, 9135, 9093, 1857, 9064,85296, 1651,
+ 9051, 1904,85296, 0,85296, 1854, 9048, 1770, 9046, 1918,
+ 85296, 899, 1917,85296, 3324, 1981, 828, 888, 9002, 1154,
+ 3388, 1167,85296, 1066,85296, 3452, 0, 813, 1135, 0,
+ 1919, 8989, 1323, 1826, 8986, 1971, 0, 1321, 0, 1936,
+ 8939, 1829, 8903, 2011,85296,85296,85296, 8871,85296, 8858,
+ 8826, 8821, 8806, 1578, 0, 1587, 1350, 3516, 3580, 3644,
+ 2052, 1542, 1739, 1746, 1115, 2053, 1911, 1929, 1984, 1890,
+ 1835,85296, 8739, 1704, 0, 1766, 8704, 1847,85296, 1833,
+
+ 3708, 3772, 3836, 1853,85296,85296, 2011, 0, 2013, 2073,
+ 2072, 2077, 2078, 2102, 2086, 2103, 2099, 2076, 2118, 2253,
+ 2091, 2262, 2323, 2100, 3900, 3964, 2280, 4028, 2308, 2240,
+ 2247, 2242, 2121, 2306, 2305, 2000, 2310, 2311, 8689, 8677,
+ 2019, 4092, 2022, 4156, 4220, 2341, 2356, 1808, 1923, 1820,
+ 1945, 2113, 2005, 1998, 2058, 2113, 2124, 2092, 2101, 2228,
+ 2236, 2238, 2229, 2332, 2247, 2352, 2351, 2392, 2337, 2333,
+ 2352, 2358, 2350, 4283, 2399, 2389, 2430, 2379, 2391, 2421,
+ 2452, 2409, 2380, 2431, 2492, 2497, 2457, 2461, 2460, 2522,
+ 2454, 2416, 2542, 2433, 2531, 2563, 2587, 2536, 2583, 2626,
+
+ 2633, 2616, 2550, 2621, 2483, 2549, 2551, 2548, 2555, 2466,
+ 2026, 0, 2027, 4342, 4406, 4470, 2029, 0, 2035, 4534,
+ 4598, 4662, 2646, 2666, 2866, 2715, 2652, 2711, 2613, 2689,
+ 2747, 2641, 2035, 8662, 8620,85296, 2490, 2553, 2556, 2678,
+ 2704, 2715, 2709, 2717, 2611, 2613, 2623, 2711, 2720, 2161,
+ 1899, 1901, 8611, 2750, 2691, 2770, 2804, 2806, 2836, 2807,
+ 2838, 2867, 2871, 2873, 2872, 2878, 2687, 2041, 8609,85296,
+ 2257, 0, 2283, 2072, 2085,85296, 8607, 8567,85296, 2803,
+ 2523, 2525, 8564, 4726, 4790, 4854, 2752, 2641, 2809, 8545,
+ 2801, 8514,85296, 2330, 8470,85296, 8461, 2813, 2823, 8424,
+
+ 2825,85296, 8421, 2820, 8387, 8371, 2464, 0, 2511, 8349,
+ 8347, 2865, 2893, 2878, 2933, 2962, 2969, 2827, 749, 4918,
+ 4982, 5046, 2830, 2833, 2845, 2851, 2868, 2786, 2857, 5109,
+ 2985, 2937, 2942, 2988, 2957, 2989, 2987, 2980, 2864, 2878,
+ 2995, 2878, 2910, 2979, 2936, 3023, 3010, 3032, 3014, 2976,
+ 8344, 8321, 8264, 2572, 0, 2624, 8250, 8246, 0, 3050,
+ 3056, 3053, 3051, 3054, 3085, 3071, 3180, 3122, 3123, 3075,
+ 3059, 3080, 5167, 2942, 1083, 3050, 3086, 3100, 3129, 3141,
+ 5223, 5287, 5351, 2946, 3122, 3175, 3056, 3129, 3081, 3158,
+ 3146, 3154, 3156, 3152, 3209, 3153, 3209, 3165, 3218, 3197,
+
+ 3152, 3214, 3229, 3255, 3243, 3257, 3258,85296,85296, 2690,
+ 85296, 8228, 3188, 3253, 3222, 5415, 8208, 5479, 5543, 3288,
+ 3246, 2986, 8197, 3120, 0, 3190, 8183, 3303, 3140, 5607,
+ 5671, 5735, 3204, 3196, 0, 3275, 5799, 5863, 5927, 0,
+ 1606, 27, 0, 0, 0, 8179, 8166, 8162, 8157, 0,
+ 0, 0, 0, 8147, 8089, 8029, 8008, 3241, 3230, 3341,
+ 3255, 3353, 3340, 3401, 3403, 4233, 3305, 3339, 3422, 3404,
+ 3477, 3482, 3433, 3485, 3414, 3532, 3490, 3348, 5991, 6055,
+ 6119, 3535, 3580, 3325, 3257, 3452, 3518, 3380, 3313, 3387,
+ 3386, 3443, 3581, 3583, 3446, 3361, 3301, 3365, 7994, 6183,
+
+ 6247, 3450, 3511, 3453, 3512, 3518, 3578, 3585, 3519, 3703,
+ 3581, 3587, 3640, 3579, 3325, 3588, 3637, 3646, 3635, 3644,
+ 3639, 3707, 3701, 3708, 3705, 3636, 3704, 3762, 3580, 3766,
+ 3769, 3763, 3763, 3764, 3767, 3790, 3766, 4023, 3726, 3808,
+ 3805, 3854, 4064, 3830, 3765, 3801, 4065, 4053, 4126, 3830,
+ 3961, 3646, 3771, 4020, 3830, 3963, 3840, 4076, 4117, 3838,
+ 3834, 3954, 3842, 4146, 3267, 3328, 3390, 3396, 3964, 7919,
+ 3786, 3962, 3971, 3517, 3649, 3955, 3965, 4031, 4030, 4083,
+ 4131, 4193, 4195, 4240, 1601, 4174, 4238, 4245, 4082, 4088,
+ 4080, 4152, 4246, 4250,85296, 3368, 7935, 3422, 7933, 3553,
+
+ 3424, 629, 3994, 7881, 4241, 4246, 4285, 4265, 4309, 3556,
+ 6311, 6375, 4098, 4340, 4160, 4344, 4345, 4155, 4223, 4279,
+ 4152, 4340, 4335, 4400, 4336, 4340, 4341, 4159, 4025, 4405,
+ 4398, 4404, 4399, 4407, 4412, 4247, 7868, 0, 4499, 4442,
+ 4485, 4486, 5059, 4427, 4484, 4378, 4487, 4553, 4563, 4557,
+ 4567, 4614, 4504, 4575, 4149, 4241, 4463, 3680, 4517, 6439,
+ 6503, 4106, 4658, 4160, 4539, 4172, 4599, 4481, 4542, 4601,
+ 4606, 4532, 4537, 4659, 4662, 4603, 4286, 4661, 4014, 4696,
+ 4651, 4095, 4693, 7818,85296, 4214, 4281, 4460, 4716, 4740,
+ 4746, 4756, 4752, 4757, 4762, 4819, 4815, 4820, 4823, 4628,
+
+ 4878, 4873, 4888, 4943, 4645, 4894, 7818, 4654, 4657, 4346,
+ 4660, 4666, 4918, 4719, 4977, 4919, 4855, 4787, 4981, 4920,
+ 4721, 4781, 4785, 4980, 7804, 3734, 3736,85296, 4119, 3819,
+ 1073, 4584, 4848, 4985, 4413, 4853, 4913, 4986, 4849, 4792,
+ 4918, 4981, 5065,85296, 7799, 4723, 4780, 4855, 4916, 5060,
+ 4982, 4987, 4469, 5043, 4719, 4990, 5072, 5103, 5047, 5065,
+ 5044, 5094, 6566, 5116, 5143, 5127, 4914, 5154, 5132, 3878,
+ 5160, 5116, 5190, 5191, 5199, 5276, 5207, 5208, 5214, 5257,
+ 5262, 5263, 3876, 5468, 5215, 5121, 3998, 5256, 5313, 5212,
+ 5341, 5290, 5295, 5381,85296, 7745, 4919, 5151, 5222, 5284,
+
+ 5380, 5064, 5447, 5217, 5358, 5420, 5285, 5509, 5317, 5339,
+ 4736, 4977, 4990, 5155, 5227, 4980, 5229, 5274, 5291, 5345,
+ 1655, 5343, 5062, 5057, 0, 5157, 5456, 5404, 5469, 5407,
+ 5532, 5537, 5470, 5464, 5534, 5538, 4062, 5406, 5584, 5575,
+ 7737, 5582, 4054, 7723, 4117, 4127, 4192, 4635, 2165, 7709,
+ 4890, 5378, 4312, 5397, 5627, 4249, 5636, 5561, 5641, 5549,
+ 5648, 5484, 5485, 5483, 5411, 5345, 5540, 5534, 5608, 5599,
+ 5668, 5604, 5672, 5601, 5673, 5678, 5667, 5672, 5735, 5677,
+ 5760, 5724, 5734, 5737, 5738, 5821, 5789, 5812, 5828, 5830,
+ 5889, 5893, 5771, 5894, 5824, 5949, 5895, 5441, 5951, 5877,
+
+ 5961, 4043, 5966, 5792, 5947, 6027, 6008, 5803, 5864, 5863,
+ 5853, 5991, 5929, 5930, 5992, 5993, 5618, 5928, 6052, 5996,
+ 5931, 6092, 6054, 5998, 5174, 5995, 5485, 5486, 5547, 6089,
+ 6049, 6109, 5537, 5660, 5668, 5600, 6090, 5855, 6136, 6146,
+ 6169, 6212, 6208, 6276, 6105, 6210, 6277, 6158, 4569, 4315,
+ 7677, 6223, 6274, 6157, 6335, 5630, 6336, 6047, 6315, 5670,
+ 6050, 6316, 6115, 6246, 5856, 6049, 6110, 6311, 6251, 6309,
+ 6172, 6521, 6174, 6180, 6400, 4505, 7636, 4507, 5772, 4548,
+ 2755, 7626, 5910, 5962, 4840, 6080, 6377, 6379, 6378, 6404,
+ 6382, 5993, 6242, 6243, 6437, 6179, 6307, 6383, 6431, 6121,
+
+ 6441, 6434, 6443, 6445, 6505, 6239, 6308, 6447, 6502, 6624,
+ 6148, 1766, 6504, 6506, 6508, 6507, 6687, 6643, 6410, 5836,
+ 7610, 6534, 6549, 6538, 6551, 6746, 6560, 6552, 4955, 6422,
+ 6602, 4958, 6552, 6555, 6619, 6627, 6640, 6641, 6646, 6651,
+ 6652, 3189, 6694, 6538, 6282, 6615, 6645, 6550, 6676, 5327,
+ 6653, 6653, 6759, 6747, 6648, 6629, 6765, 6742, 6685, 5679,
+ 6748, 6749, 6770, 6764, 6756, 6757, 6762, 6775, 6810, 6540,
+ 5937, 6183, 6366, 6441, 6438, 6757, 6763, 6780, 6785, 6190,
+ 85296, 3746, 4888, 6381, 6782, 6798, 6786, 6823, 6824, 6822,
+ 6828, 6825, 6831, 6830, 6832, 6833, 6846, 7579, 5516, 6716,
+
+ 6847, 6837, 6834, 6841, 5138, 5247, 5313, 5442, 5449, 5573,
+ 6843, 5705, 6845, 6880, 6889, 5763, 6896, 6898, 6859, 3804,
+ 6874, 6902, 6897, 6905, 6956, 5844, 6910, 7020, 6892, 6895,
+ 6828, 6874, 6894, 6957, 6949, 6945, 6895, 6960, 6959, 7037,
+ 6919, 7020, 7008, 6964, 7022, 7021, 6939, 6957, 7023, 7024,
+ 7028, 7078, 7082, 6351, 6479, 7084, 7083, 7088, 7092, 7093,
+ 7094, 7097, 7091, 7102, 7103, 7108, 3983, 5765, 7112, 7106,
+ 7127, 7107, 7129, 7120, 7133, 7181, 7245, 7104, 7145, 7110,
+ 6888, 7176, 7171, 7175, 7174, 7179, 7184, 7241, 6669, 7160,
+ 7242, 7183, 7244, 7246, 7235, 6902, 7236, 7270,85296, 7522,
+
+ 6954, 6955, 7265, 7241, 7268, 7299, 7301, 7300, 7056, 7302,
+ 7310, 6021, 7305, 7319, 4821, 6028, 6089, 253,85296, 7325,
+ 7328, 7348, 7334, 7363, 7310, 7328, 7356, 7348, 7339, 7349,
+ 7350, 7357, 7359, 7374, 7375, 7365, 7383, 7394, 7384, 7393,
+ 7024, 7399, 7505, 6283, 6297, 6604, 7167, 6608, 7217, 7440,
+ 7447, 6718, 7455, 7457, 7440, 7435, 7437, 7472, 7473, 7392,
+ 7446, 7456, 7457, 7436, 7451, 7472, 7465, 7483, 7179, 7473,
+ 7511, 7497, 7486, 7502, 7500, 7531, 7505, 7503, 7586, 7556,
+ 6866, 7564, 6933, 7495, 7519, 7582, 7524, 7604, 7341, 7574,
+ 7607, 7609, 7614, 7572, 7165, 7612, 7641, 7638, 7655, 7616,
+
+ 7641, 7650, 7631, 7587, 7678, 7675, 7274, 7685, 7695, 7664,
+ 7709, 7699, 7625, 7282, 7678, 7701, 7692, 7712, 7713, 7721,
+ 7402, 7726, 7437, 7733, 7736, 7718, 7752, 7725, 7336, 7724,
+ 7722, 7754, 7541, 7769, 7766, 4824, 7753, 7824, 7888, 7742,
+ 7754, 7761, 7764, 7255, 7750, 7837, 7842, 7825, 7826, 7830,
+ 7905, 7758, 7908, 7376, 7523, 7556, 7566, 4002, 7451, 7768,
+ 0, 7780, 7813, 4274, 7560, 7617, 7666, 0, 7825, 7831,
+ 0, 0, 7876, 7915, 7912, 7911, 7809, 7910, 7917, 7467,
+ 7913, 7914, 7861, 7858, 7865, 7878, 7918, 7434, 7919, 7920,
+ 7364, 7332, 7916, 7933, 7938, 7940, 7950,85296, 7957, 7961,
+
+ 7963, 7971, 7969, 7978, 7980, 7982, 7984, 7991, 7327, 7993,
+ 7995, 7997, 8004, 8002, 7993, 7973, 8004, 8003, 5112, 8062,
+ 8016, 8018, 8126, 7999, 7893, 8003, 8079, 8008, 8062, 8013,
+ 8060, 8063, 8069, 7909, 8062, 8050, 8087, 8113, 8068, 8116,
+ 8116, 8123, 8119, 8125, 7996, 8156, 8178, 8032, 8180, 8189,
+ 8160, 8191, 8198, 8034, 8205, 8207, 8206, 8209, 8210, 8211,
+ 8223, 8214, 8220, 5442, 8228, 8222, 8036, 8096,85296, 8232,
+ 8240, 5508, 5566, 7323, 8237, 8247, 8293, 8357, 8228, 8221,
+ 8293, 8239, 8268, 8290, 8236, 8267, 8298, 8295, 8319, 8187,
+ 8330, 7318, 8296, 8297, 8353, 8300, 8303, 8322, 8376, 8379,
+
+ 8066, 8305, 8374, 8380, 8382, 8380, 8378, 8390, 4774, 8390,
+ 8381, 8403, 8405, 8423, 0, 5584, 385, 8189, 7287, 8441,
+ 8438, 8452, 5197, 7268, 8393, 8425, 8434, 8431, 8446, 8442,
+ 8453, 8445, 8454, 8447, 8468, 8460, 8473, 8472, 8485, 8486,
+ 8494, 8265, 8269, 8512, 8514, 8516, 8519, 8533, 8526, 8535,
+ 8542, 8546, 8538, 8549, 7240, 8553, 8551, 8560, 8556, 8563,
+ 8572, 8636, 8572, 8589, 8585, 8593, 8654, 8711, 8639, 8581,
+ 8580, 8658, 8387, 8640, 8643, 8644, 8650, 8768, 8602, 8707,
+ 8684, 8699, 8825, 8651, 8688, 8701, 8883, 8947, 8604, 8608,
+ 8612, 1722, 8625, 8617, 5204, 8758, 9011, 8709, 8754, 8752,
+
+ 8730, 8698, 8762, 8772, 8799, 8621, 8663, 8817, 8781, 8728,
+ 5254, 9074, 8797, 8775, 8819, 8787, 8848, 9132, 8761, 8982,
+ 8755, 8834, 9031, 8855, 8858, 5851, 9195, 8856, 8869, 8861,
+ 8899, 8942, 9033, 8878, 8893, 8868, 8782, 8851, 9036, 9062,
+ 8912, 9045, 8901, 8905, 9071, 8913, 8909, 5894, 9152, 9154,
+ 8494, 8934, 8629, 8771, 9160, 8911, 8917, 9157, 8920, 8922,
+ 6217, 9166, 8682, 9253, 9317, 8945, 8952, 9071, 9044, 9109,
+ 8995, 8972,85296, 9071, 9164, 9230, 9381,85296, 7218, 9101,
+ 9058, 8440, 8921, 8092, 8127, 6220, 9184, 8951, 8223, 8368,
+ 8956, 0, 8924, 7195, 8932, 0, 0, 9031, 9148, 9185,
+
+ 9222, 9029, 9245, 9225, 9179, 9284, 9292, 7168, 9050, 8930,
+ 6934, 9104, 7146, 7143, 8964, 7062, 8972, 9108, 9118, 9156,
+ 6995, 9163, 9218, 9342, 8736,85296, 9244, 9277, 5814, 9445,
+ 9290, 7054, 9306, 9509, 7109, 9244, 9252, 9251, 9304, 9315,
+ 9306, 9313, 9307, 9357, 9348, 9171, 9399, 9403, 9401, 9445,
+ 9433, 9420, 9488, 9463, 9526, 9451, 9416, 9229, 9233, 3478,
+ 9423, 9337, 7533, 9530, 9426, 9360, 9362, 6589, 9430, 9416,
+ 8740, 9540, 9540, 9549, 9550, 9551, 8749, 9533, 9562, 9564,
+ 9568, 9579,85296, 9460, 6984, 9467, 6152, 6394, 9484, 9350,
+ 9626, 9690, 9544, 9707, 9450, 8961, 9598, 9620, 9545, 9624,
+
+ 9564, 9602, 6985, 9475, 9489, 8837, 9492, 9145, 9256, 9628,
+ 9681, 9315, 9681, 9684, 9685, 6981, 9563, 9576, 9710, 9712,
+ 9605, 9714, 9651, 9719, 9623, 9618, 9722, 9742, 9666, 9744,
+ 9757, 6930, 9771, 9600, 9801, 9606, 9652, 6932, 6455, 9865,
+ 9929, 9992, 9737, 9739, 9716, 9775, 9746,10049, 9800,10106,
+ 9797, 9803, 9802, 9861, 9805, 9714, 9725, 9779, 9781, 9783,
+ 85296, 9788, 9825, 9832, 9829, 9053, 9852, 9854, 9877,10164,
+ 10228, 9868, 9947, 9881, 9883, 9949, 9895, 9885, 9096,10291,
+ 9952, 9955, 9933, 9861, 9867, 9939, 9948, 9960, 9989,10010,
+ 10014,10017, 9991,10008, 9990,10042,10035, 9901, 6851, 9912,
+
+ 10073,10081, 9115, 6732,10091,10040,10349, 9907,10095,10110,
+ 10044,10082,10055,10103,10123, 9919, 6719,10249,10099,85296,
+ 9622, 9687,10412,10253, 9220, 6706,10469,10119,10320, 9970,
+ 10128,10130,10147,10187,10166,10165,10168,10527,10591,10167,
+ 9980, 6703,10371,10654,10416, 9307, 6690,10711,10140,10408,
+ 10022,10143,10191,10267,10271, 9964,10451,10062,10101,10285,
+ 10205,10136, 9490,10460,10159,10198,10262,10189,10156,10263,
+ 10195, 6676,10498,10346,10611,10613, 9549, 6648,10625,10214,
+ 10642,10210,10282,10309,10368,10278,10251,10293,10344,10244,
+ 6610,10673,10702,10730, 9904, 6573,10739,10316,10759,10326,
+
+ 10333,10430,10488, 6562,10817,10881,10355,10567,10411,10468,
+ 10384,10499,85296,10463,10650,10945,85296, 6530,10399,10438,
+ 9807, 0, 9695, 0,10522, 9869,10222, 9808,10264, 0,
+ 10340,10400, 6513,10441,10391,10511,10542, 0,10432, 6462,
+ 10558, 6423,10640,10585,10445,10671,10523, 6414,10583,10544,
+ 10071, 6356,10555,10557,10566,10573, 6354,10570, 6346,10575,
+ 10615,10617,10676,10112, 6328,10690,10698,10621,10715, 6477,
+ 10686,10252,10330,10678,11009,10725,10442,10741,10749,10743,
+ 10849,10741,10809,10913,10977,10533,10757,10778,10721,10725,
+ 8100,10795,10776,10456,10834,10900,10607,10806,11073,85296,
+
+ 6300,10821,10797, 6264,10862,10903,10917,10470, 6232,10927,
+ 10846,10871,10807,10931,10831, 6230,10962,10966,10981,10507,
+ 6197,10991,10995,11025,10838,11027,11025, 6724,11040, 6773,
+ 11005,10649,10736,11034,11036, 7210,11038,10858, 6153,10899,
+ 10958,10973, 6144,11005,11137,11201,10846,11265, 0,11065,
+ 11102,11061,10351,10875, 0,10944,11049,10706, 6105,11093,
+ 11100,10988,11103,10728,11011,11110,11104, 6104,10890,11097,
+ 11173,11169,11116,11168,11068,11158,11220,11160,11117,11329,
+ 11123,11177,11175,11393,11159,11179,11220,11184, 0, 7414,
+ 11457,11521,11228,11206,11257,11204,11193,11202,11263,11254,
+
+ 11260,11278,11262,11235, 6086,11237,11245,11243,10847, 6069,
+ 11295,11315,11247,11318,11361,11585,11649,11291, 6067,11667,
+ 11724,11710,11045, 6024,11781,11345,11696,11341,11348,11352,
+ 11376,11378,11363,85296, 5966,11739,11369,11767,11838,11895,
+ 11365,11421,11418,11796,11853,11953,11902, 5949,11423,11350,
+ 12011,11366,11368,11411,12075,11381,11432,11441,11475,12139,
+ 11439,11409,11443,11477,11479,11491,11493,11492,11388,11507,
+ 5913,11810,11494,11867,11496,11498,11505,11509,11206,11021,
+ 11540,11933,11500,11542,12202,11544,11567,11571,12046,11551,
+ 11503,11558,12259,11574,11603,12316,12373,11938,12433,12497,
+
+ 12560, 5900,12159,11511,12167,11548,11563,11608,11611,11621,
+ 12184,11601,11630,12617,11632,11677,11679,12221,11686,11613,
+ 11700,12674,11757,11720,11982,11634, 5896,12239,12256,12284,
+ 11114, 5879,12287,11743,12344,11684,11753,11777,11791,11770,
+ 11698,11581,11767,11708,11921, 5836,12301,11734,12353,11800,
+ 11834,11848,11824,12515,11814,11827,12517,11999,12035,11857,
+ 11870,11881,12519,12042,11990,11847,11835,11878,11897, 5833,
+ 12361,11874,12579,11909,12060,12098,11919,12588,11924,11962,
+ 12597,12100,12122,11986,11930,12038,12645,12181,12054,12732,
+ 12796,12091,12029,85296, 5783,12860,12924,12162,12058,85296,
+
+ 5757,11972,12168,11276,11161,12244,11397, 0,11517, 0,
+ 11950,11974,12056,12109,12091,12093,12113,12120,12006,12124,
+ 12363,11997, 5754,12169, 5752,12192,12154,12219,12230,12246,
+ 12263,12297,12169,12312,12320,12235,12243,12269,12273,12276,
+ 12293,12330,12304,12390,12397,12404,12348,12414,12417,11462,
+ 12381,12395,85296,12341,12421,12406,12449, 5715,12988,13052,
+ 12469,13116,12419, 5707,12451,12467,12475,11286, 5689,12648,
+ 12458,12479,12446,12482,12527,85296, 5661,12331,13180,13244,
+ 5642,12602,12455,12471,12485,12528,12537,12487,12539,12670,
+ 12548,12524,12550,12688, 5637,12699,12570,12577,12584,12621,
+
+ 12630,12593,12655,12703,12658,12626,12686,12716,12763,12749,
+ 12761,11522, 7565,11619, 7647,12634,12662,12678,12707,12712,
+ 12720,12771,13308,13372,12824,12720,11675,11728,11839,12750,
+ 12752,12763,12772,12774,12756,12781,12814,11851,11651,12413,
+ 12577, 5592,12765,12335,11964,12777,12826, 1851,12076, 7743,
+ 12874,13436,12779,12812,12822,12830,13500,12832, 3862,12836,
+ 12838,13564,13628,12840,12843,12874,13692,13756,12562,12314,
+ 5534,13471,12857,12197, 5525,12896, 5508,12877,12880,12882,
+ 12891,12884,12894,12901,12903,12905,12913,12941,12892,13820,
+ 13553,12944,12953, 5457,13838,12909,13842,12949,12951,12970,
+
+ 12972,12959,13856,12955,12966,13913,13005,13012,13034,13885,
+ 13008,12962,13015,13970,13081,13030,14028,13032,13070,14091,
+ 14150,13048,13105,12970,13101,13074,14214,13117,12974,14278,
+ 12977,13017,13072,14342,13019,13038,13138,13079,14406,13089,
+ 13087,13097,13141,13133,14470,13145,13156,13164,13165,13167,
+ 14534,14598,13197,13199,13201,13194,13209,13899,13211,13212,
+ 13895,12531,13228,13214,13917,13216,13999,13218,13227,13230,
+ 13958,13220,13224,14047,13273,13263,12623,12140,13961,13265,
+ 13232,13267,14661,13285,14082,13269,13288,14063,13292,13331,
+ 13333,13401,13391,14718,14185,13335,13271,13342,13350,13358,
+
+ 14776,14840, 5460,13042,13290,14249,13294,14441,13297,13397,
+ 13421,14523,13320,13322,14618,13466,13452,14632,13354,13324,
+ 13393,14903,13409,14649,13338,13411,14657,13413,13461,13485,
+ 13529,13582,14960,14714,13459,13346,13475,13541,13550,14700,
+ 13483,13395, 5435,14709,13356,14860,13415,13587,13590,13522,
+ 14862,13417,13525,14922,13611,13614,13539,13419,13543,14931,
+ 13657,13669,13646,11995,13622,13687,14940,13584,13457,14865,
+ 13481,14985,13675,13715,13515,13518,14988,13722,13734,13600,
+ 13527,13607,14997,13649,15026,13531,13653,13956,13779,13781,
+ 13845,13980,15045,15017,13672,13604,13712,13860,14018,13745,
+
+ 13682,12103,13652,13655,15054,13678,15062,13848,13902,13717,
+ 13720,15074,13922,13771,13736,13728,13790,15092,13793,15121,
+ 13738,13800,14274,13937,14059,14180,14125,15133,15129,13802,
+ 13777,13804,13947,14045,15191,15255,15319,15383,15447,13868,
+ 12731,12329,13786,13880, 0,12238, 8283,12807,13866,14080,
+ 13870,13978,14100,13990,13994,14003, 0,14167,14042,14051,
+ 14189,14070,14169,14308, 5437,13746,14061,14253,14171,14192,
+ 14194,14232,14072,14236,14239,14251,14092,14258, 5433,14260,
+ 14262,14114,14297,14123,14176,14197,14199,14229,14241,14305,
+ 14244,14312,14315,14322,14325,14293,14358,12987,85296,14295,
+
+ 5399,14318,14378, 5401,14361,14327,12377,14365,15511,15575,
+ 14369,14377,14385, 5386,14388,14329,14367,14383,14386,14423,
+ 14395,14425,14427,14436,14445,14448,14489,14445,14456,15639,
+ 15703,14459,14460,14485,14487,14493,14504,14496,14499,14508,
+ 14518,14515,14551,14553,14560,14569,14520,14571,14580,14622,
+ 14635,14581,14557,14584,14577,14587,14609,14680,14613,14639,
+ 14732,14690,14646,14692,14793,14728,14742,14669,14751,14795,
+ 14810,14814,14760,14678,14762,14814,12547,14704,14827,85296,
+ 12795, 9654,14913,14747,14765,14791,14802,14806,85296,14824,
+ 14826,14830,14875,15767,14877,14884,14983, 5390,14872,14913,
+
+ 15831,14893,14882,14941,14944,14964,14920,14973, 5388,15008,
+ 15064,14928,15082,14975,15096,12989,14900,14550,15105,14993,
+ 14995, 4129,12798, 9837,15141,15895,15959,16023,15005, 5369,
+ 15022,15031,15157,16087,16151,15107,15183,13429,15049,15051,
+ 15079,15105,15117,15140,15143,15164,15167,15177,15180,15203,
+ 15212,15205,15214,14647,16215,15290,15221,15217,15228,15418,
+ 15225,15232,16233,15235,15628,15237,16240,15239,15241,15243,
+ 15884,15245,15266,16258,15286,15268,16275,15278,15274,15281,
+ 16332,15296,16294,15298,15307,16325,15336,15343,15365,15350,
+ 15362,16389,16360,15346,15333,15353,15425,15410,15369,15355,
+
+ 15402,15412,14506,16447,15437,15471,15414,16511,15490,16575,
+ 15358,15367,15429,15399,16639,15427, 4621,15463,15473,16703,
+ 16767,15475,15477,16831,16895,16959,15487,15489,12573,15496,
+ 15528,15532,15530,16329,15539,15492,15542,16610,15507,13213,
+ 15560,15041,15568,16346,15494,15545,16977,15547,16377,15549,
+ 16978,15551,15561,15564,15604,15594,15553,15556,15651,15665,
+ 13233,13444,16692,15596,15559,12606,15619,15692,15658,15721,
+ 15729,17035,16997,15689,15732,17093,17157,16820,15598,15600,
+ 17177,15602,17032,15617,17028,15623,15625,15751,15796,15745,
+ 15656,15660,15785,15794,17191,15674,15662,12942,15681,15860,
+
+ 15913,15849,15881,17248,17195,15920,15946,15685,15718,15725,
+ 16018,15748,15749,16386,15783,17220,15787,17239,15943,15985,
+ 15789,15791,17256,16052,15938,15804,15801,15812,17268,15814,
+ 17286,15810,15851,16146,16007,16009,16054,15999,17315,17277,
+ 15853,15816,15870,16065,16116,16120,15862,13852,15872,15874,
+ 15917,16443,15879,15909,17329,15922,17334,15926,16506,16047,
+ 16072,16180,16166,15931,15935,16192,16281,15978,15975,13142,
+ 15982,16478,16250,16305,16476,17343,17346,16136,16292,14772,
+ 16187,15980,15987,17381,15989,17398,15996,16570,16406,16432,
+ 16231,16462,16005,16039,16357,16539,16062,16041,13153,16069,
+
+ 16606,16487,16550,16627,17400,17412,16623,16542,17470,17534,
+ 16043,16050, 0,13623,10123,13444,16103, 0,16105, 5324,
+ 16107,16118,16126,16122,16134, 5328,16271,16174,16268,16176,
+ 16188, 5312,16190,16197,13591,16200,16408,16296,16419, 3423,
+ 16311, 5250,16313,16336,16349,16403,16423,13670, 5187,16430,
+ 16465,16367,16490,16532,16494,16421,16535,16554,16598,16552,
+ 16660,16467,16496,16528,16667,16554,16558,16677,16595,16561,
+ 16599,16720,16614,16684,16611,16727,16735,16745,16688,16749,
+ 16656,16752,16736,16664,16783,16716,16785,16787,16724,16733,
+ 16795,16756,16787,16791,12558,16802,16804,16811,16807,13889,
+
+ 16815,16848,16852,16817,16844,16856,16865,16867,16871,14750,
+ 16873,16875,16882,16878,13929,16885,16912,16916,10625,16908,
+ 16920,85296,13696,10762,16935,16923, 5179,16925,16929,17598,
+ 16936,16934,16943, 5134,16360,16947,17662,16987,16949,14101,
+ 16995,17006,17019,16973,17045, 5118,13575,15004,17028, 4643,
+ 16975, 5094,17063,10860,17069,17726,17790,16985, 5015,17008,
+ 17010,17049,17854,17918,13750,14159,17052,17060,17070,17076,
+ 17079,17109,17083,15019,17936,17106,17111,17940,17113,17117,
+ 14126,17997,17120,17122,17124,17954,17715,17127,17129,17972,
+ 17131,17968,17133,17999,17135,17145,17209,17357,17169,17137,
+
+ 17140,17215,17273,18016,17147,17143,14375,17187,17409,17390,
+ 17422,17456,18073,18035,17494,17229,17178,17202,17225, 5971,
+ 17290,17258,14437,17490,16952,18131,18195,17377,17325,17353,
+ 18259,18323,18387,18451,18515,18579,17300, 5001,17311,17332,
+ 18643,18707,17429,17351,14511, 4935,17441,17486,17363,17497,
+ 18066,17366,17387,18102,17506,17418,14567,18770,17488,17184,
+ 16252,16079,16439,18054,17433, 4900,17443,17524,17548,17550,
+ 17520,17460,17564,14314,13782,17509,17445,14857, 4868,17513,
+ 17517,17453,17557,17573,17625,17561,17628,17698,17580,18828,
+ 18892,18248,17515, 4835,17553,17691,17641,17738,17752,17712,
+
+ 17756,17571,17576,14885, 4806,17618,17621,17578,17635,17807,
+ 17816,17776,17882,17824,17649,18070,17582,17614,18127,17638,
+ 17645,14951,18440,17681,17647,17684,18190,17686,17688,18632,
+ 17702,18727,17704,18128,17837,17839,17936,17769,17706,17710,
+ 17832,18052,17748,17744,15112,17766,18224,17897,17895,18285,
+ 18729,18732,18006,18162,17217,18956,17940,18319,17746,17772,
+ 18256,17814,17812,15158,18741,17821, 4775,17828,18352,17953,
+ 18058,18182,18243,18354,17835,17870,15288, 4757,17878,17880,
+ 17884,17893,18363,18413,18309,18481,18549,18373,17905,18068,
+ 17901, 4755,17903,18608,18300,18405,18437,18478,18546,18019,
+
+ 17944,15466, 4712,18030,18045,18027,18150,18532,18541,18502,
+ 18610,18679,18562,18152,19020,19084, 0,18083, 4695,18158,
+ 11126,14921,18087, 4691,18098,18102,18111, 4684,18165,18169,
+ 15620,18179,18217,18661,18220,15672, 4631,18232,18278,18171,
+ 18281, 4505, 337,18175,18213,18222,18235,18237,18245,18296,
+ 18344,18302,18307,18347,18349,18366,18370,18409,18416,18427,
+ 18426,18428,15939,18469,18431,15736,18471,18488,18491,18498,
+ 18600,18494,18500,18537,18534,18551,18554,17944,18558,18560,
+ 18601,18564,15740,18618,18621,18661,17590,18675,18597,18599,
+ 18409,18628,18665,16480,18689,18685, 4622,18687,18749,18693,
+
+ 16624, 4565,18751,18760,18718,18783,18737, 4563,18774,18792,
+ 18788,16674, 4555,18795,18799,18801,18803,85296,18805, 4493,
+ 18807,11188,18841,18811, 4485,18813,18815,18817, 4443,18847,
+ 18840,16742,18849,18857,19148,18859,16818, 4433,18862,18869,
+ 18855,18871, 4382,18867,18873,85296,18880,18878,16868,18908,
+ 13876,18888,15179,18910, 4373,18912,18919,19212,18921,18923,
+ 18949,18926,18930,18934,18932,18936,18973,19276,19340,18923,
+ 18736,18941, 4368,19358,19415,19362,16944, 4359,19472,18944,
+ 19009,18971,18980,18982,19005,19043,19183,18984,18986,19363,
+ 18995,18991,17302,19529,19406,18997, 4357,19001,19050,19062,
+
+ 19032,19110,19007,19114,19046,19039,17410, 4318,19060,19070,
+ 19066,19102,19126,19175,19134,19179,19246,19196,19099, 4302,
+ 19107,19124,19122,17642, 4257,19234,19171,19587,19104,19187,
+ 19236,17966,19651,19715,19243,19131,19254, 4242,19779,19843,
+ 19907, 4196,19164,19167,19192,19256,19194,19258,19293,19266,
+ 19262,19295,19306,19297, 4185,19434,19970,19476,17695, 4175,
+ 20027,19310,19501,19302,19313,19321,19324,19391,19333,14309,
+ 19336,19365,19372, 4107,19317,19326,19329,19382,19438,19429,
+ 19370,19425,19452,13922,14346,19459,19423,19490,20084,19505,
+ 19447,19513,20141,19520,19538,19557,19549,19615,19612,19542,
+
+ 20199, 4068,19462,19493,19497,19518,19572,19574,19617,19623,
+ 19636,19559,19509,19566,20262,19604,19546,19608,20319,19675,
+ 19682,19685,19698,19743,19740,19563, 4051,19832,19927,19929,
+ 17699, 4011,19941,19627,19958,19629,19631,19701,19763,19956,
+ 19633,19667,19840,19678,19671,17759,19999,19689, 3990,19691,
+ 19808,19733,19793,19869,19827,19873,19736,19694,17763, 3889,
+ 19751,19754,19756,19765,19924,19987,19938,19931,20016,20023,
+ 19995,19801,19761, 3805,20031,20056,20088,17767, 3741,20113,
+ 19803,20132,19801,19810,20045,20065, 3737,19813,19816,19818,
+ 19947,20069,20092,20062,20102,20122,19862,19820,19865,20221,
+
+ 19884,19824,19886,20224,20160,20130,20170,20183,20228,20241,
+ 19894,19980, 3723,19891,19893,20001,20149,20233,20226,20243,
+ 20230,20279,20286,20003,20293,20305,20296,20041,20303,20323,
+ 20315,20333,20341,20352,20361,20370,20377, 3677,20387,20098,
+ 20166,20175, 0,14609,20179,20245,20391,20283,20326,20394,
+ 20401,17976, 3675,20405,20412,20329,20414, 3663,20353,20416,
+ 20337,20423,20425,20427,20367,20434,20436, 566, 3617,20375,
+ 20432,20438,20440,20442,85296,20444,20446,20448,20456, 1791,
+ 20457,20454,20461,20464,20468,20466,20475, 3606,20477,20479,
+ 20481,20488,20484, 3568,20492,20496,20500,18049, 3559,20510,
+
+ 20514,20517,20507,20524,20526,20522,20526,19378,20533,20530,
+ 18114,20541,20537, 3554,20539,20548,20545,18292, 3551,20555,
+ 20557,20553,20564,20010,20560, 3538,20568,20572,20576,18294,
+ 3533,20586,20590,20593,20583,20600, 3502,20596,20598,20602,
+ 20609,20605,20612,20620,20616,20618,20627,20630, 3497,20634,
+ 20637,20639,20646,20642,20649,20657,20653,20655,20664,20667,
+ 20671, 3488,20674,20676,20678,20682,20681,20683,20685,20688,
+ 20690,20692,20699,18350, 3467,20701,20709,20697,20711,20734,
+ 20713,20715,20722,20724,20750,20720,20752,20759,20748, 3463,
+ 20756,20763,20761,18676, 3433,20770,20773,20775,20782,15245,
+
+ 20798,20042,20779,20862,20784,20815,20811,20926,20786,20788,
+ 20819,20822,20834,20826,20828,20836,20840,20843,20847,20990,
+ 20874,21054,21118,18680, 3375,20961,20850,21136,20852,20876,
+ 20885,20887,20883,21140,20881,20896,21197,20898,20911,20950,
+ 21144,20907,20889,20909,21254,20957,21009,20900, 3372,21172,
+ 21311,21201,18752, 3314,21368,20943,21226,20941,20953,20965,
+ 21013,21037, 3304,20946,20968,20970,21006,21080,21016,21084,
+ 21142,21039,21025,20972,21027,21425,21029,20974,21074,21482,
+ 21104,21158,21215,21230,21238,21245, 3275,21076,21033,21540,
+ 21035,21072,21093,21604,21095,21097,21274,21277,21668,21169,
+
+ 21100,21289,21292,21300,19203,21152,21732,21796, 3253,21102,
+ 21149,85296,21302,21208,18993,21315,21860,21218,21235,21319,
+ 21243,21263,21328,21323,21307,21331,21341,21349,21339,21353,
+ 21356,21364,21924,21372, 3245,21382,21379,21396,21386,21391,
+ 21401,21404,21399,21444,21406,21415,21987,21434,21462,21466,
+ 21511,21442,21413,21454,22044,21469,21557,21453,21463,21456,
+ 21478,21485,21486,21489,21895,21496,21499,21946,21503,21529,
+ 21559,21563,21570,21567,16219,15704,21524,21507,21579,22101,
+ 22158,21991,21582,21516,21586,21721,21589,21627,21629,21640,
+ 21651,21696,21654,21762,21830,22216,21520,21555,22016,21565,
+
+ 21619,22048,21717,21699,21871,21755,21786,21781,21631,21633,
+ 21643,22279,22336,22073,21647,21684,21692,22092,21694,21822,
+ 21884,21955,21886,21942,21977,21953,22034, 3243,22120,21706,
+ 22139,21708,22011,22082,21749,22236,21710,21752,22238,22115,
+ 22148,21759,21712,21769,22250,22000,22168,21766, 3191,22156,
+ 22267,22298,19036, 3172,22327,21777,22355,21773,21818,22258,
+ 22340, 3139,21775,21779,21811,22020,22080,22008,21959,22186,
+ 22241,21820,21826,21839,22364,21841,21837,21882,22384,22296,
+ 22373,22388,22398,22401,22408,19775, 3129,22412,21843,22416,
+ 21845,22418,22422,21902,22460,21847,21905,22463,22440,22472,
+
+ 21909,21891,21963,22488,22485,22308,21907,21967,22505,21969,
+ 22024,22517,22137,22444,22332,22494,22496,22525,22090,22061,
+ 22130,22535,22547,22564,22181,22068,22202,22578,22559,22595,
+ 22582,22598,22607,22615,22622,22634,22132,22145,22190,22632,
+ 22192,22194,22636,22639,22641,22549,22655,22657,22661,22539,
+ 22227,22669,22679,22697,22693,22701,22234,22710,22722,22726,
+ 22730,22741,22739,22750,22753,22757,22766,22246,22255,22301,
+ 22769,22304,22311,22315,22776,15901,22345,22360,22788,22792,
+ 22429,22437,22477,22569,22795,22612,22799,22806,22810,22813,
+ 22817,22619,22820,22824,22245,22827,22699,22831,22834,22838,
+
+ 22841,22714,22845,22848,22852, 3100,19867,22850, 3083,22854,
+ 22856, 2040,22864,22867,22863,19047,22871,22874, 3052,22876,
+ 22880,22883,22885,22892,22894,22890,22901,22903,22910,22899,
+ 22912,22920,22916, 3013,22924,22934,22938,19111, 2986,22948,
+ 22952,22955,22945,22962, 2942,22958,22960,22964,22971,22967,
+ 22974,22982,22978,22980,22989,22992,20163, 2910,23000,22996,
+ 23004,23007,23014,23016,23012,23023,23025,23032,23021,23034,
+ 23042,23038,23040,23050,23046,23054,23058,23062,23065,23072,
+ 23074,23084,23088,23097,23070,23100,23104,23102,23106,23114,
+ 23109,23111,23122,23118,23126,23129,23137,23141,23145,23154,
+
+ 23133,23157,23161,23159,23163,23165,23167,23169,23171,23175,
+ 23174,23176,23178,23181,23183,23185,23192,23188,23196,23199,
+ 23203,23201,23210,23212,23222,23238,23208,23240,23247,23249,
+ 23251,23253,23262, 2907,23258,23264,23266,23273,23269,23276,
+ 23280,23284,23282,23291,23293,16099,23302,22274,23366,23289,
+ 23313,23321,23316,23430,23318, 7385,23323,23325,23494,23558,
+ 23336,23331,23333,23345,23622,23340,23383,23686,23344,23750,
+ 20634,23347,23401,23352,23593,23354,23356,23390,23483,23378,
+ 23380,23768,23397,23409,23772,23387,23392,23405,23829,23412,
+ 23786,23403,23449,23798,23452,23478,23480,23459,23513,23886,
+
+ 23843,23461,23414,23469,23511,23520, 2877,23857,23457,23815,
+ 23465,23467,23518,23543,23534,23900,23471,23536,23957,23576,
+ 23583,23605,23904,23579,23516,23597,24014,23651,23641,23538,
+ 23540,23929,23581,23585,23961,23610,23675,23720,23671,23714,
+ 23777,23607,23588,23644,24071,24128,23986,23659,23603,23663,
+ 24005,23667,23712,23839,23866,23924,23946,23995,23775,24024,
+ 23647,24186,23649,23704,23702,24250,23665,23669,23724,23716,
+ 24314,23731,23727,23734,24033,23790,24378,23736,23852,23882,
+ 23911,23933,24442,24506,24056,23965,23942,23796,24003,19488,
+ 23810, 2829,23819,24047,23871,19398, 2810,24058,24068,23874,
+
+ 24075,24570,23914,23921,24079,23938,23948,24634,24082,24698,
+ 24089,24099,24102,24762,24091,23974,24116,23981,24124,24037,
+ 24106,24113,24349,24060,24119,24605,24138,24136,24431,24146,
+ 24149,24159,24825,24162,24669,24152,24175,24782,24202,24209,
+ 24211,24279,24229,24882,24790,24213,24198,24220,24290,24304,
+ 24939,20723,24375, 2806,24200,24216,24807,24222,24225,24811,
+ 24227,24235,24300,24453,24339,24409,24366,24494,24478, 2754,
+ 16328,24854,24267,24363,24489,24997,24868,24896,24535,24525,
+ 24600,24491,24665,24732,24275,24878,24231,24233,24899,24271,
+ 24277,24968,24281,24428,24531,24773,24555,24842,24597,24814,
+
+ 24778,24980,24293,24622,24658,25054,25011,25040,24940,24677,
+ 24863,24752,24947,25009,24337,25063,24295,25068,24297,25071,
+ 24683,25021,24333,24335,25099,24927,24714,24356,24341,24359,
+ 25119,24402,25128,24344,24412,25111,25088,25096,25141,24844,
+ 25172,25176,24421,24361,24460,25152,24533, 2733,25180,24395,
+ 25197,24404,25078,25102,24464,25233,24418,24467,25241,25200,
+ 25209,24482,24469,24543,25250,25162,25253,24473,24487,25269,
+ 24522,24545,25278,24943,25132,24781,25255,25193,25015,24552,
+ 24548,24590,25298,25316,25286,24592,24550,24609,25345,25329,
+ 25349,25364,25362,25352,25031,25373,25387,21314,24588,25404,
+
+ 24612,25408,25275,25341,24614,24618,25416,25354,25231,24661,
+ 24649,24680,25433,24721,25445,24717,24728,25447,25452,25464,
+ 25467,25476,25505,25502,24739,24724,24741,25514,25389,24737,
+ 24743,25507,24745,24748,25537,25491,25510,25436,25540,25379,
+ 25535,25525,25559,25572,25575,25579,25589,25597,25600,25549,
+ 25614,25625,25633,25635,24919,25648,24786,24835,25650,24906,
+ 24916,25658,25640,25662,25664,25667,25680,25687,25672,25701,
+ 25716,25728,25730,25745,25747,25754,25767,25769,25783,25791,
+ 25801,25804,25812,24929,24956,24937,25001,25044,25074,25076,
+ 25182, 0,25320,25205,25214, 0,25218,25258,25822,25824,
+
+ 25826,25838,25841,25845,25322,25848,25852,25855,25333,25859,
+ 2652,25862,25866,25411,25869, 2631,25873,25876,25880,25883,
+ 20079, 2588,25421, 2574,25450,25469,25581,25891, 2704,25894,
+ 19450, 2563,25896,25898,25593,25905,25606,25610,25617,25907,
+ 25705,25712,25915,25919,25721,25922,25930,25934,25937,25733,
+ 25944,25946,25953,25957,25966,25735,25969, 2524,25971,25750,
+ 25752,25775,25978,25980,25788,25987,25989,25996,25808,25998,
+ 26006,25828,25830,26010,25902,25911,26014,26023,25926,26026,
+ 26034,26038,26042,26030,25942,26051,26054,21335,25985,26002,
+ 26056,26059,26063,26066,26074,26078,26069,26081,26089,26093,
+
+ 26096,26071,26103,26105,26112,26116,26125,26085,26128,26101,
+ 26130,26133,26137,26140,26142,26149,26151,26159,26147,26155,
+ 26167,26163,26171,26174,26181,26183,26191,26179,26187,26195,
+ 26198,26200,85296,26202,26204,26206,11296,26208,26215,26211,
+ 26218,26222,26225,26227,26229, 2470,26236,26238,26234,26245,
+ 26254,26270,26241,26243,26266,26268,26272,26274,26281,26277,
+ 26284,26288,26291,26293,26295, 2459,26302,26298,26305,26307,
+ 26314,85296,26323,26387, 2439,26451,26515,26579,26311, 2417,
+ 26334,26336,26344,26643,26339,26707,26771,20801,26440,26341,
+ 26346,26789,26348,26696,26351,26790,26353,26369,26371,26376,
+
+ 26366,26357,26359,26405,26413,26807,26373,26361,19686,26408,
+ 26481,26493,26531,26437,26864,26850,26500,26545,26363,26821,
+ 26410,26878,26415,26435,26538,26882,26424,26426,26907,26608,
+ 26558,26925,26470,26428,26473,26982,26477,26944,26430,26496,
+ 26964,26535,26562,26603,26610,26622,27039,26996,26542,26498,
+ 26552,26682,26672,26502,26533,27025,26549,26554,27043,26560,
+ 26564,26628,26742,26693,26786,26731,26797,26799,27068,26600,
+ 26902,26911,27125,27096,27087,26955,26824,26868,27010,27109,
+ 26929,26624,27116,27183,26596,26606,26665,26620,27247,26626,
+ 7790,26662,26660,27311,27375,26669,26674,27439,27503,27567,
+
+ 26684,26686,19876,26725,26729,26733,26747,27218, 2390,26688,
+ 26691,26737,26749,26751,26831,26854,26942,26754,26973,26986,
+ 27631,26756,27695,26811,27759,27020,27823,27887,27300,26813,
+ 26845,27602,26873,27428,26885,27905,26887,27006,27048,27121,
+ 27017,26895,26916,27129,27147,27812,27056,26935,20060,27072,
+ 27214,27158,27222,27276,27962,27909,27106,27091,18948,21326,
+ 25267,27934,26961,27168,27232,27937,27149,27226,27298,27295,
+ 27341,27347,27160,27404, 2344,16218,27981,27469,27394,27480,
+ 27337,27532,27539,27204,27597,27206,27542,27979,26992,27359,
+ 27424,27998,27621,27451,27659,27490,27661,27729,27269,27685,
+
+ 28010,27724,27714,27798,27530,27854,27795,27272,27906,27287,
+ 27863,27163,27202,28039,27210,28041,27218,28036,27616,27681,
+ 27923,27583,27228,27230,27736,27745,27290,27264,20115,27329,
+ 27947,27918,27990,27808,28077,28094,27847,28022,27274,28096,
+ 27278,28098,28015,28053,27292,27333,28115,28061,27774,27354,
+ 27335,27356,28156,27396,28158,27352,27398,28172,28118,28140,
+ 28178,27971,28186,28203,27412,27361,27414,28194,28214,27400,
+ 27402,28217,27416,27418,28234,28074,28132,28237,28220,28000,
+ 27916,28241,28246,28275,28259,28278,28300,28292,28282,28309,
+ 28176,28323,28334,28336,27465,28338,28349,27420,27456,28366,
+
+ 27461,28369,27473,28365,28297,28312,28352,28371,27482,27484,
+ 28377,28190,27519,27488,20151,27521,28400,28417,28425,28402,
+ 28436,28433,28440,28447,28465,28443,28455,28457,28477,28469,
+ 28474,28487,28498,27544,28496,28511,28523,28526,28536,28543,
+ 28545,27552,28552,27593,28554,28567,28529,28550,28572,28570,
+ 28576,28586,28590,28596,27610,28603,28610,28629,28621,28643,
+ 28645,28647,27612,28659,27653,28662,27523, 0,27528, 2326,
+ 27548,27585,27614,27655, 2287,27670,27550,20252,27674,27677,
+ 27589,27657,27679,27711,27716,27720,27739,27722,27743,27781,
+ 27783,27741,27845,27865,27779,27787,27867,27800,27804,27836,
+
+ 21285,27843,27850,28064,27871,20265,28129,28678,28693,27904,
+ 27926,27939,28703,28100,28162,28713,28675,28251,28685,28717,
+ 28688,28726,28346,28729,28625,28737,28741,28733,28386,28750,
+ 28410,28421,28752,28500,28508,28608,28759,28762,28770,28658,
+ 28650,28748,28778,28766,28774,28782,21507,28785,28787,28794,
+ 28790,20275,28797,28805,28809,28801,28813,28816, 2271,28818,
+ 28820,28827,28823,20300,28830,28834,28832,28836,28838,28840,
+ 28842,85296,28844,28846,28853,28849,20363,28856,28860,28858,
+ 28869,28933,28880, 2268,28882,28884,28886,28997,29061,25336,
+ 28986,28888, 2149,28890,28898,28910,28947,28919,28923,28961,
+
+ 28900,28892,20398, 2145,28908,28912,28896,28954,28975,29023,
+ 28982,29027,29078,29046,29083,28904,28914,29086,28916,29111,
+ 28952,29112,28956,29090,29095,29107,29131,28958,28963,29039,
+ 29134,29154,28972,28978,20771,29014,29145,29163,29171,29179,
+ 29235,29206,29192,29195,29223,29016,29185,29197,29231,29188,
+ 29252,29244,29254,29260,29265,29031,29269,29295,29277,29298,
+ 29312,29302,29319,29329,29043,29331,29343,29279,29385,29449,
+ 29513,29019, 1964,29034,29081,29577,29641,29215,29100,20823,
+ 1956,29346,29355,29103,29357,29156,29176,29201,29286,29316,
+ 29339,29366,29359,29368,29375,29401,29373,29403, 1959,29405,
+
+ 29407,29414,29410,29421,29705,29412,29769,29833,29897,29961,
+ 29566,29419, 1937,29423,29437,29427,29461,29475,29499,29478,
+ 29430,29432,21017, 1924,29434,29469,29465,29472,29491,29539,
+ 29561,29607,29675,29563,21382,23983,29758,29480,29532,29590,
+ 29604,29734,29613,29493,29799,29495,29657, 1915,29682,29667,
+ 29689,29736,29535,29823,29547,29849,29600,29886,29862,29720,
+ 29847,29923,29927,29932,29537,29976,29551,29781,29979,29983,
+ 29986,29995,29623,30002,29625,30005,29665,29484, 1842,29553,
+ 29988,29909,30023,30007,30012,30026,29678,29596,21167, 1824,
+ 29685,29727,29598,29729,30046,30054,30057,30066,30069,29882,
+
+ 29621,29628,30071,29663,30099,29687,29988,30075,30077,30091,
+ 30095,29691,29725,30081,30109,29744,29741,21182,29748,30122,
+ 30124,30133,30143,30147,30156,30166,30164,30185,30101,30151,
+ 30154,30190,30175,30181,30204,30214,29753,30207,30218,30236,
+ 30239,30228,30243,30260,29792,30267,29794,30270,29750, 1774,
+ 29790,30246,30274,30280,30258,30287,30282,29806,29803,21186,
+ 1758,29810,29814,29812,29856,30299,30296,30319,30326,30323,
+ 30330,30332,30304,30343,30334,30348,30353,29858,30351,29867,
+ 30361,30368,30384,30391,30398,29878,30406,29943,30408,29946,
+ 30388,30412,30414,30417,30430,30420,29918,30435,30301,30425,
+
+ 30437,30454,30461,30470,30478,30482,30490,30492,30501,29816,
+ 1707,29853,29870,29874,30509,21228, 1697,30513,30520,29914,
+ 30523,29916,30029,30220,30357,30364,30459,30532,30467,30534,
+ 30541,30543,30545,30497,30552,30499, 1666,30525,30554,30550,
+ 21255, 1646,30561,30563,30559,30570,30566,30568,30578,30573,
+ 30575,30582,22513,30585,30587,30594,30590,21266,30597,30605,
+ 30609,30601,30613, 1638,30616,30623,30619,21270, 1628,30626,
+ 30630,30628,30637,30633, 1579,30635,30639,30641,30648,21426,
+ 1566,30650,30652,30654,30661,30657, 1331,30659,30668,30664,
+ 21473, 1305,30671,30675,30673,30682,30678,30680,30690,30685,
+
+ 30687,30698, 1159, 1137,30693,30700,30702,30705,30707,30709,
+ 30711,30719,30714,30721,30723,30730,30773,30739,30726,30746,
+ 30830,30750,30764,30753,30780,30782,30790,30821,30728, 902,
+ 30769,30793,30798,30807,30786,30826,30804,30802,30842,21590,
+ 899,30852,30855,30858,30865,30868,30872,30883,30890,30887,
+ 30894,30892,30874,30900,30902,30909,30917,30924,30928,30926,
+ 30944,30947,30955,30959,30969,30976,30979,30983,30987,30994,
+ 31004,31041,31105, 882,30951,30965,30990,31001,31010,31012,
+ 31021,31024,31017,31031,31058,31054,31056,31060,31062,31065,
+ 85296,31067,31069,31076,31072,21644,31080,31083,31085,31169,
+
+ 31233, 836,31087,31089,31091,31116,31093,31095,31127,31139,
+ 31131,31125,31121,31135,31296,31148,31133,31155,31353,31193,
+ 31200,31203,31216,31253,31255,22454,31144,31258,31260,31251,
+ 31186,31262,31190,31264,31205,31281,31292,31318,31272,31213,
+ 31325,31327,31304,31329,31314,31334,31218,31343,31351,31362,
+ 31373,31384,31375,31387,31391,31410,31413,31423, 832,31196,
+ 31209,31269,31394,31415,31397,31426,31432,31436,31439,31294,
+ 31454,31462,31458,31349,31466,31476,31479,31486,31495,31498,
+ 31505,31518,31371, 818,31444,31508,31520,31522,31468,31483,
+ 31524,31541,31446,21703, 814,31544,31560,31557,31567,31575,
+
+ 31577,31579,31586,31589,31596,31582,31599,31601,31592,31594,
+ 31615,31619,31621,31642,31645,31652,31654,31662,31669,31677,
+ 31673,31681,31691,31700, 714,31563,31565,31623,31697,31707,
+ 31687,31704,31717,31650,31725,31711,31740,31748,31744,31721,
+ 31752,31767,31771,31778,31781,31785,31789,31792,31795,31803,
+ 31805,31810,31769,31731,31815,31826,31818,31844,31847,31854,
+ 31858,31866,31868,31880,31876,31878,31884,31890,31892,31898,
+ 31902,31900,31917,31924,31931,31928,31941,31956,31945,31964,
+ 31723,31757,31948,31830,31850,31966,31968,31905,31979,31981,
+ 31988,31908,31990,31997,31933,31999, 673,31953,31972,31986,
+
+ 32001,32003,32010,32012,32019,32008,32021,32029,32025, 604,
+ 32027,32036,32033,21893, 317,32043,32045,32041,32052, 221,
+ 32048,32050,32054,32061,32057,32064,32072,32068,32070,32079,
+ 32082,32086,32089,32091,32093,32095,32097,32104,32100,32107,
+ 32111,32114,32116,32118,32125, 179,32121,32123,32127,32134,
+ 32130,32137,32141,32144,32146,32148,32155,32151,32153,32163,
+ 32165,32160,32167,32179,32190,32192,32194,32203,32198,32200,
+ 32217,32213,32207,32215,32221,32224,32227,32237,32239,32251,
+ 32285,32342,32281,32261,32259,32268,32299,32295,32303,32318,
+ 32310,32322,32333,32359,32361,32371, 157,32265,32276,32306,
+
+ 32363,32367,32377,32385,32394,32388,32396,32340,32403,32447,
+ 32411,32401,32420,32504,32424,32434,32443,32454,32456,32464,
+ 32471,32467,32445,32476,32488,32478,32517,32494,32525,32527,
+ 32490,32534,32541,32545,32548,32556,32422,32426,32558,32430,
+ 32460,32566,32573,32469,32580,32588,32590,32598,32600,32512,
+ 32602,32612,32628,32561, 144,32624,32631,32635,21970, 125,
+ 32638,32642,32640,32649,32646,32651,32654,32658,32661,32671,
+ 32663,32666,32682,32678,32675,32684,32702,32688,32705,32742,
+ 32799,32723,32715,32692,32732,32761,32746,32775,32779,32764,
+ 32789,32786,32796,32819,32821,32701,32828,32812,32752,32834,
+
+ 32766,32837,32850,32853,32860,32867,32874,32883,32857,32870,
+ 32880,32887,32903,32892,32919,32905,32926,32933,32935,32943,
+ 32708,32718,32952,32845,32909,32960,32965,32949,32940,32969,
+ 32971,32981,32989,32974,33004,33012,33029,33026,33036,33014,
+ 33040,33054,33043,33063,33082,33085,33073,33089,33098,33105,
+ 85,33033,33046,33050,33109,33087,33102,33107,33126,33118,
+ 33128,33059,33138,33155,33157,33111,33164,33167,33178,33180,
+ 33189,33191,33198,33202,33187,33209,33211,33213,33141,33215,
+ 33225,33233,33246,33241,33249,33256,33264,33276,33279,33287,
+ 33176,33254,33284,33266,33289,33301,33297,33303,33312,33306,
+
+ 33309,33314,33337,33319,33344,33352,33366,33369,33376,33321,
+ 33380,33394,33383,33403,33422,33425,33413,33429,33438,33445,
+ 33399,33442,33372,33447,33329,33452,33462,33473,33486,33495,
+ 33502,33506,33470,33458,33493,33508,33478,33510,33523,33527,
+ 33534,33531,33544,33556,33386,33513,33564,33566,33540,33547,
+ 33568,33573,33576,33579,33587,33589,33596,33598,33600,33607,
+ 33609,33611,33613,33615,33623,33618,33620,33631,33627,33635,
+ 33638,33646,33650,33654,33663,33642,33666,33670, 72,33668,
+ 33672,33674,33681,33677,33684,33692,33688,33690,33699,33702,
+ 33706,33709,33717,33712,33714,33725,33721,33729,33732,33740,
+
+ 33744,33748,33757,33736,33760,33764,33762,33766,33768,33770,
+ 33772,33774,33781,33777,33784,33788,33791,33795,33793,33802,
+ 33798,33800,33804,33806,33808,33810,33817,33813,33820,33824,
+ 33827,33829,33831,33833,33840,33849,33860,33868,33913,33836,
+ 33838,33863,33931,33870,33872,33935,33875,33897,33901,33884,
+ 33938,33940,33942,33954,33959,33979,33886,33988,33991,34050,
+ 34007,34021,34003,33888,34035,34032,34063,34072,34074,34084,
+ 33877,33879,34095,33890,33892,34120,34011,34041,34105,34102,
+ 34080,34112,34092,33894,34133,34177,34234,34149,34137,33944,
+ 34156,34174,34158,34166,34184,34187,34191,34202,34238,34221,
+
+ 34251,34231,34117,34253,34247,33956,34241,34024,34262,34278,
+ 34290,34292,34303,33965,33996,34312,34054,34207,34351,34209,
+ 34415,34315,34328,34325,34479,34300, 18,34211,34264,34268,
+ 34332,34308,34340,34367,34369,34338,34371,34378,34374,34376,
+ 34386,34381,34390,34497,34393,34398,34400,34495,34403,34443,
+ 34405,34446,34499,34509,34439,34464,34522,34581,34527,34545,
+ 34506,34568,34531,34565,34588,34599,34612,34591,34601,34519,
+ 34609,34622,34437,34624,34635,34645,34657,34653,34626,34638,
+ 34659,34441,34666,34669,34679,34688,34395,34453,34705,34457,
+ 34460,34714,34694,34711,34716,34718,34703,34728,34737,34733,
+
+ 34771,34748,34767,34790,34788,34774,34812,34808,34834,34836,
+ 34844,34852,34856,34462,34556,34849,34628,34681,34867,34826,
+ 34794,34780,34869,34871,34873,34880,34692,34891,34909,34911,
+ 34914,34928,34757,34931,34939,34942,34952,34967,34974,34977,
+ 34987,34990,34997,34945,34983,34957,35005,34792,35008,34896,
+ 35027,35019,35017,35044,35055,34801,34919,35058,35031,35042,
+ 35060,35062,35065,35077,35080,35068,35083,35089,35102,35124,
+ 35104,35128,35136,35154,35143,35146,35167,35177,35184,35192,
+ 35201,35208,35197,35212,35126,35199,35159,35220,35223,35237,
+ 35247,35233,35255,35225,35245,35268,35258,35270,35280,35291,
+
+ 35106,35277,35293,35300,35311,35313,35322,35324,35315,35327,
+ 35335,35330,35332,35339,35342,35350,35354,35346,35358,35367,
+ 35362,35364,35375,35371,35379,35382,35390,35394,35398,35407,
+ 35386,35410,35414,35412,35416,35424,35419,35421,35428,35431,
+ 35439,35443,35435,35452,35450,35454,35456,35458,35460,35467,
+ 35463,35476,35465,35540,35604,35529,35487,35499,35502,35622,
+ 35571,35489,35618,35564,35620,35625,35497,35627,35640,35629,
+ 35658,35676,35526,35683,35691,35510,35698,35512,35687,35492,
+ 35494,35711,35514,35516,35703,35518,35695,35707,35722,35731,
+ 35715,35745,35748,35755,35763,35558,35775,35777,35836,35808,
+
+ 35822,35787,35785,35845,35800,35855,35825,35566,35859,35864,
+ 35818,35768,35866,35576,35879,35890,35898,35909,35960,35562,
+ 36024,35580,36088,35583,36152,36216,35585,35587,35589,35631,
+ 35645,35647,35911,35654,35913,35924,35932,35663,35934,35700,
+ 35936,36141,35766,35887,35922,36234,35948,35946,35896,35984,
+ 35990,35995,35978,36053,36236,36055,36003,36066,36051,36117,
+ 36124,35986,36183,36005,36232,36238,36009,36241,36254,36245,
+ 36256,36007,36258,36243,36136,36265,36277,36294,36305,36047,
+ 36307,36309,36269,36312,36292,36165,36318,36322,36328,36326,
+ 36064,36331,36357,36360,36375,36367,36383,36390,36068,36394,
+
+ 36110,36386,35975,35988,36404,36043,36070,36421,36399,36407,
+ 36413,36410,36418,36445,36333,36434,36463,36475,36483,36491,
+ 36466,36494,36510,36514,36524,36528,36544,36113,36542,36547,
+ 36468,36532,36498,36115,36558,36567,36569,36577,36597,36554,
+ 36580,36426,36599,36584,36593,36602,36622,36126,36616,36633,
+ 36645,36654,36658,36669,36671,36128,36673,36138,36682,36651,
+ 36660,36685,36693,36700,36709,36175,36725,36716,36702,36732,
+ 36737,36744,36764,36179,36773,36072,36074,36130,36192,36171,
+ 36188,36196,36199,36781,36785,36202,36827,36891,36816,36749,
+ 36757,36705,36812,36857,36799,36343,36881,36480,36839,36907,
+
+ 36910,36914,36917,36803,36928,36814,36930,36850,36939,36204,
+ 36921,36934,36960,36948,36956,36977,36952,36981,36983,36642,
+ 36990,37014,36998,37011,37033,37037,37048,37050,36852,37057,
+ 36868,37060,36995,37039,37065,37016,37073,37081,36870,37083,
+ 37137,36279,37201,37265,37329,37393,36282,36346,36423,36487,
+ 36500,36734,36626,37190,37104,37113,37115,37122,37166,37173,
+ 36760,37231,36873,37213,37242,37250,37187,37287,37097,37294,
+ 37107,37305,37159,37296,37363,37157,37358,37161,37410,37185,
+ 37412,37408,37415,37175,37417,37224,37419,37226,37428,37424,
+ 37280,37347,37435,37437,37445,37235,37452,37247,37471,37478,
+
+ 37481,37290,37492,37307,37494,37309,37504,37351,37496,37314,
+ 37500,37502,37508,37513,37521,37527,37532,37355,37534,37558,
+ 37566,37569,37584,37576,37588,37373,37591,37375,37600,37593,
+ 37562,37596,37555,37623,37608,37377,37625,37611,37629,37643,
+ 37635,37649,37654,37468,37652,37666,37662,37681,37688,37691,
+ 37704,37708,37711,37721,37725,37729,37731,37743,37745,37735,
+ 37755,37752,37765,37768,37770,37772,37784,37779,37794,37804,
+ 37817,37808,36629,37800,37796,37820,37828,37830,37832,37840,
+ 37678,37842,37856,37858,37866,37868,37879,37886,37894,37876,
+ 37890,37898,37911,37914,37918,37927,37929,37921,37937,37932,
+
+ 37955,37957,37959,37974,37978,37981,37990,37993,38001,37999,
+ 38011,38013,38015,38023,38025,38034,38036,38083,38147,38057,
+ 38039,38046,37942,38049,38072,38059,38098,38062,38107,38114,
+ 38164,38133,38110,38171,38125,38123,38167,38169,38121,38181,
+ 38178,38194,38197,38199,38208,38204,38220,38211,38229,38227,
+ 38231,38233,38235,38247,38237,38252,38254,38262,38270,38272,
+ 38286,38294,38306,38302,38314,38276,38312,38291,38310,38326,
+ 38331,38274,38333,38343,38338,38357,38360,38367,38380,38388,
+ 38390,38398,38401,38411,38364,38407,38420,38422,38430,38433,
+ 38443,38446,38451,38448,38453,38458,38466,38469,38471,38462,
+
+ 38486,38483,38494,38507,38519,38522,38498,38530,38509,38528,
+ 38538,38542,38552,38554,38564,38562,38544,38572,38560,38582,
+ 38585,38594,38578,38591,38597,37658,38602,38604,38607,38617,
+ 38625,38627,38644,38647,38633,38609,38631,38649,38661,38652,
+ 38663,38665,38684,38686,38688,38699,38702,38715,38706,38725,
+ 38723,38667,38728,38732,38749,38751,38761,38740,38757,38759,
+ 38763,38773,38738,38775,38784,38787,38794,38798,38806,38811,
+ 38808,38819,38830,38828,38833,38842,38850,38837,38852,38854,
+ 38856,38866,38862,38870,38874,38883,38886,38894,38919,38879,
+ 38902,38890,38858,38906,38923,38931,38929,38942,38926,38939,
+
+ 38952,38955,38964,38966,38978,38982,38974,38991,38987,38999,
+ 39003,39014,38989,39010,39012,39021,39029,39024,39043,39032,
+ 39052,39059,39061,39070,39078,39076,39086,39098,39094,39096,
+ 39107,39119,39066,39102,39116,39121,39124,39128,39132,39141,
+ 39143,39145,39147,39150,39155,39165,39167,39176,39179,39190,
+ 39200,39202,39210,39214,39212,39231,39234,39217,39220,39237,
+ 39188,39254,39245,39257,39264,39275,39262,39273,39277,39280,
+ 39282,39288,39297,39300,39312,39304,39322,39302,39314,39325,
+ 39333,39342,39345,39354,39356,39369,39371,39378,39382,39358,
+ 39386,39380,39396,39388,39393,39402,39404,39414,39416,39433,
+
+ 39435,39443,39419,39447,39450,39409,39423,39452,39464,39472,
+ 39482,39493,39456,39478,39489,39500,39502,39511,39519,39522,
+ 39531,39504,39524,39533,39537,39543,39554,39572,39581,39564,
+ 39556,39541,39578,39588,39595,39604,39619,39611,39597,39593,
+ 39608,39625,39552,39635,39638,39642,39649,39627,39651,39662,
+ 39660,39672,39679,39686,39699,39708,39684,39677,39670,39710,
+ 39722,39726,39740,39737,39718,39743,39745,39747,39758,39760,
+ 39769,39782,39750,39774,39784,39786,39806,39797,39818,39815,
+ 39788,39821,39835,39823,39844,39847,39855,39857,39859,39825,
+ 39861,39866,39878,39880,39894,39891,39897,39902,39910,39912,
+
+ 39931,39927,39939,39941,39952,39915,39954,39929,39965,39962,
+ 39975,39971,39978,39987,39982,39990,40003,40012,40014,39992,
+ 39995,40022,40019,40030,40032,40042,40044,40039,40054,40050,
+ 40066,40068,40078,40074,40076,40086,40081,40098,40101,40111,
+ 40113,40090,40109,40121,40125,40135,40138,40148,40150,40145,
+ 40162,40171,40167,40157,40175,40173,40191,40194,40204,40196,
+ 40178,40206,40219,40221,40201,40224,40234,40236,40226,40238,
+ 40241,40250,40252,40260,40263,40258,40268,40276,40281,40284,
+ 40286,40289,40298,40294,40302,40306,40304,40314,40316,40326,
+ 40328,40330,85296,40351,40363,40375,40387,40399,40411,40423,
+
+ 40435,40447,40459,40471,40483,40495,40507,40519,40531,40543,
+ 40555,40567,40579,40591,40603,40615,40627,40639,40651,40663,
+ 40675,40687,40699,40711,40723,40735,40747,40755,40767,40775,
+ 40787,40795,40807,40815,40827,40835,40847,40855,40867,40879,
+ 40891,40903,40915,40923,40935,40943,40955,40963,40975,40983,
+ 40995,41003,41015,41027,41039,41051,41063,41075,41087,41099,
+ 41111,41119,41123,41135,41147,41155,41159,41171,41183,41191,
+ 41195,41207,41219,41231,41243,41251,41255,41267,41279,41287,
+ 41291,41303,41315,41327,41335,41339,41351,41363,41375,41387,
+ 41399,41411,41423,41431,41435,41447,41459,41467,41471,41483,
+
+ 41495,41507,41519,41527,41532,41544,41556,41564,41568,41580,
+ 41592,41600,41604,41616,41628,41640,41652,41664,41676,41684,
+ 41696,41708,41720,41732,41744,41756,41768,41780,41792,41804,
+ 41816,41828,41836,41848,41860,41868,41880,41892,41904,41916,
+ 41928,41940,41952,41964,41976,41988,42000,42011,42023,42035,
+ 42047,42059,42071,42083,42095,42107,42119,42131,42143,42155,
+ 42167,42179,42191,42203,42215,42227,42239,42251,42263,42275,
+ 42287,42299,42311,42319,42331,42343,42355,42363,42375,42387,
+ 42399,42407,42419,42431,42443,42455,42467,42479,42491,42503,
+ 42515,42527,42539,42551,42563,42575,42587,42599,42611,42623,
+
+ 42635,42647,42659,42671,42683,42695,42707,42719,42731,42743,
+ 42755,42767,42775,42787,42799,42811,42823,42835,42847,42859,
+ 42871,42883,42895,42907,42919,42931,42943,42955,42967,42979,
+ 42991,43003,43011,43023,43035,43047,43059,43071,43083,43095,
+ 43107,43115,43127,43139,43151,43163,43175,43183,43187,43195,
+ 43207,43219,43231,43242,43254,43266,43278,43290,43302,43314,
+ 43326,43338,43350,43362,43374,43386,43398,43410,43422,43434,
+ 43446,43458,43470,43482,43494,43506,43518,43530,43542,43554,
+ 43566,43578,43590,43602,43614,43626,43638,43650,43662,43674,
+ 43686,43698,43710,43722,43734,43746,43758,43770,43782,43794,
+
+ 43806,43818,43830,43841,43853,43864,43876,43888,43900,43912,
+ 43924,43936,43948,43960,43972,43984,43996,44008,44020,44032,
+ 44044,44056,44064,44076,44088,44100,44112,44124,44136,44148,
+ 44160,44172,44184,44196,44208,44220,44232,44240,44252,44264,
+ 44276,44288,44300,44312,44324,44332,44344,44356,44368,44380,
+ 44392,44403,44411,44423,44435,44447,44459,44471,44483,44495,
+ 44507,44519,44531,44543,44555,44567,44579,44591,44603,44615,
+ 44627,44639,44651,44663,44675,44687,44699,44711,44723,44735,
+ 44747,44759,44771,44783,44795,44807,44819,44831,44843,44855,
+ 44867,44879,44891,44903,44915,44927,44939,44951,44963,44975,
+
+ 44987,44999,45011,45023,45035,45047,45059,45071,45083,45095,
+ 45107,45119,45131,45143,45154,45166,45178,45190,45202,45214,
+ 45226,45238,45250,45262,45274,45286,45298,45310,45322,45334,
+ 45346,45358,45370,45382,45394,45406,45414,45426,45438,45450,
+ 45462,45474,45486,45498,45510,45522,45534,45546,45558,45570,
+ 45582,45594,45606,45618,45630,45642,45654,45666,45678,45690,
+ 45698,45710,45722,45734,45746,45758,45770,45782,45794,45806,
+ 45814,45826,45838,45850,45862,45874,45886,45898,45910,45914,
+ 45922,45934,45946,45958,45970,45982,45994,46006,46018,46030,
+ 46042,46054,46066,46078,46090,46102,46114,46126,46138,46150,
+
+ 46162,46174,46186,46198,46210,46222,46234,46246,46258,46270,
+ 46282,46294,46306,46318,46330,46342,46354,46366,46378,46390,
+ 46402,46414,46426,46438,46450,46462,46474,46486,46498,46510,
+ 46522,46534,46546,46558,46570,46582,46594,46606,46618,46630,
+ 46642,46654,46666,46678,46690,46702,46714,46726,46738,46750,
+ 46762,46774,46786,46798,46810,46822,46834,46846,46858,46870,
+ 46882,46894,46906,46918,46930,46942,46954,46966,46978,46990,
+ 47002,47014,47026,47038,47050,47062,47074,47086,47098,47110,
+ 47122,47134,47146,47158,47170,47182,47194,47206,47218,47230,
+ 47242,47254,47266,47278,47290,47302,47314,47326,47338,47350,
+
+ 47362,47374,47386,47398,47410,47422,47434,47446,47458,47470,
+ 47482,47494,47506,47518,47530,47542,47554,47566,47578,47590,
+ 47602,47614,47626,47634,47646,47658,47670,47682,47694,47706,
+ 47718,47730,47742,47754,47766,47778,47790,47798,47809,47821,
+ 47833,47845,47857,47869,47881,47893,47905,47917,47929,47941,
+ 47953,47965,47977,47989,48001,48013,48025,48037,48049,48061,
+ 48073,48085,48097,48109,48121,48133,48145,48157,48169,48181,
+ 48193,48205,48217,48229,48241,48253,48265,48277,48289,48301,
+ 48313,48325,48337,48349,48361,48373,48385,48397,48409,48421,
+ 48433,48445,48457,48469,48481,48493,48505,48517,48529,48541,
+
+ 48553,48565,48577,48589,48601,48613,48625,48637,48649,48661,
+ 48673,48685,48697,48709,48721,48733,48745,48757,48769,48781,
+ 48793,48805,48817,48829,48841,48853,48865,48877,48889,48901,
+ 48913,48925,48937,48949,48961,48973,48985,48997,49009,49021,
+ 49033,49045,49057,49069,49081,49093,49105,49117,49129,49141,
+ 49153,49165,49177,49189,49201,49213,49225,49237,49249,49261,
+ 49273,49285,49297,49309,49321,49333,49345,49357,49369,49381,
+ 49393,49405,49417,49429,49441,49453,49465,49477,49489,49501,
+ 49513,49525,49537,49549,49561,49573,49585,49597,49609,49621,
+ 49633,49645,49657,49669,49681,49693,49705,49717,49729,49741,
+
+ 49753,49765,49777,49789,49801,49813,49825,49837,49849,49861,
+ 49873,49885,49897,49909,49921,49933,49945,49957,49969,49981,
+ 49993,50005,50017,50029,50041,50053,50065,50077,50089,50101,
+ 50113,50125,50133,50145,50157,50169,50181,50193,50205,50217,
+ 50229,50241,50253,50265,50277,50289,50301,50313,50325,50336,
+ 50348,50360,50372,50384,50396,50408,50420,50432,50444,50456,
+ 50468,50480,50492,50504,50516,50528,50540,50552,50564,50576,
+ 50588,50600,50612,50624,50636,50648,50660,50672,50684,50696,
+ 50708,50720,50732,50744,50756,50768,50780,50792,50804,50816,
+ 50828,50840,50852,50864,50876,50888,50900,50912,50924,50936,
+
+ 50948,50960,50972,50984,50996,51008,51020,51032,51044,51056,
+ 51068,51080,51092,51104,51116,51128,51140,51152,51164,51176,
+ 51188,51200,51212,51224,51236,51248,51260,51272,51284,51296,
+ 51308,51320,51332,51344,51356,51368,51380,51392,51404,51416,
+ 51428,51440,51452,51464,51476,51488,51500,51512,51524,51536,
+ 51548,51560,51572,51584,51596,51608,51620,51632,51644,51656,
+ 51668,51680,51692,51704,51716,51728,51740,51752,51764,51776,
+ 51788,51800,51812,51824,51836,51848,51860,51872,51884,51896,
+ 51908,51920,51932,51944,51956,51968,51980,51992,52004,52016,
+ 52028,52040,52052,52064,52076,52088,52100,52112,52124,52136,
+
+ 52148,52160,52172,52184,52196,52208,52220,52232,52244,52256,
+ 52268,52280,52292,52304,52316,52328,52340,52352,52364,52376,
+ 52388,52400,52412,52424,52436,52448,52460,52472,52484,52496,
+ 52508,52520,52532,52544,52556,52568,52580,52592,52604,52616,
+ 52628,52640,52652,52664,52676,52684,52696,52708,52720,52732,
+ 52744,52756,52768,52780,52792,52804,52816,52828,52840,52852,
+ 52864,52876,52888,52900,52912,52920,52932,52944,52956,52968,
+ 52980,52992,53004,53016,53028,53040,53052,53064,53076,53088,
+ 53100,53112,53124,53136,53148,53160,53172,53184,53196,53208,
+ 53220,53232,53244,53256,53268,53280,53292,53304,53316,53328,
+
+ 53340,53352,53364,53376,53388,53400,53412,53424,53436,53448,
+ 53460,53472,53484,53496,53508,53520,53532,53544,53556,53568,
+ 53580,53592,53604,53616,53628,53640,53652,53664,53676,53688,
+ 53700,53712,53724,53736,53748,53760,53772,53784,53796,53808,
+ 53820,53832,53844,53856,53868,53880,53892,53904,53916,53928,
+ 53940,53952,53964,53976,53988,54000,54012,54024,54036,54048,
+ 54060,54072,54084,54096,54108,54120,54132,54144,54156,54168,
+ 54180,54192,54204,54216,54228,54240,54252,54264,54276,54288,
+ 54300,54312,54324,54336,54348,54360,54372,54384,54396,54408,
+ 54420,54432,54444,54456,54468,54480,54492,54504,54516,54528,
+
+ 54540,54552,54564,54576,54588,54600,54612,54624,54636,54648,
+ 54660,54672,54684,54696,54708,54720,54732,54744,54756,54768,
+ 54780,54792,54804,54816,54828,54840,54852,54864,54876,54888,
+ 54900,54912,54924,54936,54948,54960,54972,54984,54996,55008,
+ 55020,55032,55044,55056,55068,55080,55092,55104,55116,55128,
+ 55140,55152,55164,55176,55188,55200,55212,55224,55236,55248,
+ 55260,55272,55284,55296,55308,55320,55332,55344,55356,55368,
+ 55380,55392,55404,55416,55424,55436,55448,55460,55472,55484,
+ 55496,55508,55520,55532,55544,55556,55568,55580,55592,55604,
+ 55616,55628,55640,55652,55664,55676,55688,55696,55708,55720,
+
+ 55732,55744,55756,55768,55780,55792,55804,55816,55828,55840,
+ 55852,55864,55876,55888,55900,55912,55924,55936,55948,55960,
+ 55972,55984,55996,56008,56020,56032,56044,56056,56068,56080,
+ 56092,56104,56116,56128,56140,56152,56164,56176,56188,56200,
+ 56212,56224,56236,56248,56260,56272,56284,56296,56308,56320,
+ 56332,56344,56356,56368,56380,56392,56404,56416,56428,56440,
+ 56452,56464,56476,56488,56500,56512,56524,56536,56548,56560,
+ 56572,56584,56596,56608,56620,56632,56644,56656,56668,56680,
+ 56692,56704,56716,56728,56740,56752,56764,56776,56788,56800,
+ 56812,56824,56836,56848,56860,56872,56884,56896,56908,56920,
+
+ 56932,56944,56956,56968,56980,56992,57004,57016,57028,57040,
+ 57052,57064,57076,57088,57100,57112,57124,57136,57148,57160,
+ 57172,57184,57196,57208,57220,57232,57244,57256,57268,57280,
+ 57292,57304,57316,57328,57340,57352,57364,57376,57388,57400,
+ 57412,57424,57436,57448,57460,57472,57484,57496,57508,57520,
+ 57532,57544,57556,57568,57580,57592,57604,57616,57628,57640,
+ 57652,57664,57676,57688,57700,57712,57724,57736,57748,57760,
+ 57772,57784,57796,57808,57820,57832,57844,57856,57868,57880,
+ 57892,57904,57916,57928,57940,57952,57964,57976,57988,58000,
+ 58012,58024,58036,58048,58060,58072,58084,58096,58108,58120,
+
+ 58132,58144,58156,58168,58180,58192,58204,58216,58228,58240,
+ 58252,58264,58276,58288,58300,58312,58324,58336,58348,58360,
+ 58372,58384,58396,58408,58420,58432,58444,58456,58468,58480,
+ 58492,58504,58516,58528,58540,58552,58564,58576,58588,58600,
+ 58612,58624,58636,58648,58656,58668,58680,58692,58704,58716,
+ 58728,58740,58752,58764,58776,58788,58800,58812,58824,58836,
+ 58848,58860,58872,58884,58896,58908,58920,58932,58944,58956,
+ 58968,58980,58992,59004,59016,59028,59040,59052,59064,59072,
+ 59084,59096,59108,59120,59132,59144,59156,59168,59180,59192,
+ 59204,59216,59228,59240,59252,59264,59276,59288,59300,59312,
+
+ 59324,59336,59348,59360,59372,59384,59396,59408,59420,59432,
+ 59444,59456,59468,59480,59492,59504,59516,59528,59540,59552,
+ 59564,59576,59588,59600,59612,59624,59636,59648,59660,59672,
+ 59684,59696,59708,59720,59732,59744,59756,59768,59780,59792,
+ 59804,59816,59828,59840,59852,59864,59876,59888,59900,59912,
+ 59924,59936,59948,59960,59972,59984,59996,60008,60020,60032,
+ 60044,60056,60068,60080,60092,60104,60116,60128,60140,60152,
+ 60164,60176,60188,60200,60212,60224,60236,60248,60260,60272,
+ 60284,60296,60308,60320,60332,60344,60356,60368,60380,60392,
+ 60404,60416,60428,60440,60452,60464,60476,60488,60500,60512,
+
+ 60524,60536,60548,60560,60572,60584,60596,60608,60620,60632,
+ 60644,60656,60668,60680,60692,60704,60716,60728,60740,60752,
+ 60764,60776,60788,60800,60812,60824,60836,60848,60860,60872,
+ 60884,60896,60908,60920,60932,60944,60956,60968,60980,60992,
+ 61004,61016,61028,61040,61052,61064,61076,61088,61100,61112,
+ 61124,61136,61148,61160,61172,61184,61196,61208,61220,61232,
+ 61244,61256,61268,61280,61292,61304,61316,61328,61340,61352,
+ 61364,61376,61388,61400,61412,61424,61436,61448,61460,61472,
+ 61484,61496,61508,61520,61532,61544,61556,61568,61580,61592,
+ 61604,61616,61628,61640,61652,61664,61676,61688,61700,61712,
+
+ 61724,61736,61748,61760,61772,61784,61796,61808,61820,61832,
+ 61844,61856,61868,61880,61892,61904,61916,61928,61940,61952,
+ 61964,61976,61988,62000,62012,62024,62036,62048,62060,62072,
+ 62084,62096,62108,62120,62132,62144,62156,62168,62180,62192,
+ 62204,62216,62228,62240,62252,62264,62276,62288,62300,62312,
+ 62324,62336,62348,62360,62372,62384,62396,62408,62420,62432,
+ 62444,62456,62468,62480,62492,62500,62512,62524,62536,62548,
+ 62560,62572,62584,62596,62608,62620,62632,62644,62656,62668,
+ 62680,62692,62704,62716,62728,62740,62752,62764,62776,62788,
+ 62800,62812,62824,62836,62848,62860,62872,62884,62896,62908,
+
+ 62920,62932,62944,62955,62967,62979,62991,63003,63015,63027,
+ 63039,63051,63063,63075,63087,63099,63111,63123,63135,63147,
+ 63159,63171,63183,63195,63207,63219,63231,63243,63255,63267,
+ 63279,63291,63303,63315,63327,63339,63351,63363,63375,63387,
+ 63399,63411,63423,63435,63447,63459,63471,63483,63495,63507,
+ 63519,63531,63543,63555,63567,63579,63591,63603,63615,63627,
+ 63639,63651,63663,63675,63687,63699,63711,63723,63735,63747,
+ 63759,63771,63783,63795,63807,63819,63831,63843,63855,63867,
+ 63879,63891,63903,63915,63927,63939,63951,63963,63975,63987,
+ 63999,64011,64023,64035,64047,64059,64071,64083,64095,64107,
+
+ 64119,64131,64143,64155,64167,64179,64191,64203,64215,64227,
+ 64239,64251,64263,64275,64287,64299,64311,64323,64335,64347,
+ 64359,64371,64383,64395,64407,64419,64431,64443,64455,64467,
+ 64479,64491,64503,64515,64527,64539,64551,64563,64575,64587,
+ 64599,64611,64623,64635,64647,64659,64671,64683,64695,64707,
+ 64719,64731,64743,64755,64767,64779,64791,64803,64815,64827,
+ 64839,64851,64863,64875,64887,64899,64911,64923,64935,64947,
+ 64959,64971,64983,64995,65007,65019,65031,65043,65055,65067,
+ 65079,65091,65103,65115,65127,65139,65151,65163,65175,65187,
+ 65199,65211,65223,65235,65247,65259,65271,65283,65295,65307,
+
+ 65319,65331,65343,65355,65367,65379,65391,65403,65415,65427,
+ 65439,65451,65463,65475,65487,65499,65511,65523,65535,65547,
+ 65559,65571,65583,65595,65607,65619,65631,65643,65655,65667,
+ 65679,65691,65703,65715,65727,65739,65751,65763,65775,65787,
+ 65799,65811,65823,65835,65847,65859,65871,65883,65895,65907,
+ 65919,65931,65943,65955,65967,65979,65991,66003,66015,66027,
+ 66039,66051,66063,66075,66087,66099,66111,66123,66135,66147,
+ 66159,66171,66183,66195,66207,66219,66231,66243,66255,66267,
+ 66279,66291,66303,66315,66327,66339,66351,66363,66375,66383,
+ 66395,66407,66419,66431,66443,66455,66467,66479,66491,66503,
+
+ 66515,66527,66539,66551,66563,66575,66587,66599,66611,66623,
+ 66635,66647,66659,66671,66683,66695,66707,66719,66731,66743,
+ 66755,66767,66779,66791,66803,66815,66827,66839,66851,66863,
+ 66875,66887,66899,66911,66923,66935,66947,66959,66971,66983,
+ 66995,67007,67019,67031,67043,67055,67067,67079,67091,67103,
+ 67115,67127,67139,67151,67163,67175,67187,67199,67211,67223,
+ 67235,67247,67259,67271,67283,67295,67307,67319,67331,67343,
+ 67355,67367,67379,67391,67403,67415,67427,67439,67451,67463,
+ 67475,67487,67499,67511,67523,67535,67547,67559,67571,67583,
+ 67595,67607,67619,67631,67643,67655,67667,67679,67691,67703,
+
+ 67715,67727,67739,67751,67763,67775,67787,67799,67811,67823,
+ 67835,67847,67859,67871,67883,67895,67907,67919,67931,67943,
+ 67955,67967,67979,67991,68003,68015,68027,68039,68051,68063,
+ 68075,68087,68099,68111,68123,68135,68147,68159,68171,68183,
+ 68195,68207,68219,68231,68243,68255,68267,68279,68291,68303,
+ 68315,68327,68339,68351,68363,68375,68387,68399,68411,68423,
+ 68435,68447,68459,68471,68483,68495,68507,68519,68531,68543,
+ 68555,68567,68579,68591,68603,68615,68627,68639,68651,68663,
+ 68675,68687,68699,68711,68723,68735,68747,68759,68771,68783,
+ 68795,68807,68819,68831,68843,68855,68867,68879,68891,68903,
+
+ 68915,68927,68939,68951,68963,68975,68987,68999,69011,69023,
+ 69035,69047,69059,69071,69083,69095,69107,69119,69131,69143,
+ 69155,69167,69179,69191,69203,69215,69227,69239,69251,69263,
+ 69275,69287,69299,69311,69323,69335,69347,69359,69371,69383,
+ 69395,69407,69419,69431,69443,69455,69467,69479,69491,69503,
+ 69515,69527,69539,69551,69563,69575,69587,69599,69611,69623,
+ 69635,69647,69659,69671,69683,69695,69707,69719,69731,69743,
+ 69755,69767,69779,69791,69803,69815,69827,69839,69851,69863,
+ 69875,69887,69899,69911,69923,69935,69947,69959,69971,69983,
+ 69995,70007,70019,70031,70043,70055,70067,70079,70091,70103,
+
+ 70115,70127,70139,70151,70163,70175,70187,70199,70211,70223,
+ 70235,70247,70259,70271,70283,70295,70307,70319,70331,70343,
+ 70355,70367,70379,70391,70403,70415,70427,70439,70451,70463,
+ 70475,70487,70499,70511,70523,70535,70547,70559,70571,70583,
+ 70595,70607,70619,70631,70643,70655,70667,70679,70691,70703,
+ 70715,70727,70739,70751,70763,70775,70787,70799,70811,70823,
+ 70835,70847,70859,70871,70883,70895,70907,70919,70931,70943,
+ 70955,70967,70979,70991,71003,71015,71027,71039,71051,71063,
+ 71075,71087,71099,71111,71123,71135,71147,71159,71171,71183,
+ 71195,71207,71219,71231,71243,71255,71267,71279,71291,71303,
+
+ 71315,71327,71339,71351,71363,71375,71387,71399,71411,71423,
+ 71435,71447,71459,71471,71483,71495,71507,71519,71531,71543,
+ 71555,71567,71579,71591,71603,71615,71627,71639,71651,71663,
+ 71675,71687,71699,71711,71723,71735,71747,71759,71771,71783,
+ 71795,71807,71819,71831,71843,71855,71867,71879,71891,71903,
+ 71915,71927,71939,71951,71963,71975,71987,71999,72011,72023,
+ 72035,72047,72059,72071,72083,72095,72107,72119,72131,72143,
+ 72155,72167,72179,72191,72203,72215,72227,72239,72251,72263,
+ 72275,72287,72299,72311,72323,72335,72347,72359,72371,72383,
+ 72395,72407,72419,72431,72443,72455,72467,72479,72491,72503,
+
+ 72515,72527,72539,72551,72563,72575,72587,72599,72611,72623,
+ 72635,72647,72659,72671,72683,72695,72707,72719,72731,72743,
+ 72755,72767,72779,72791,72803,72815,72827,72839,72851,72863,
+ 72875,72887,72899,72911,72923,72935,72947,72959,72971,72983,
+ 72995,73007,73019,73031,73043,73055,73067,73079,73091,73103,
+ 73115,73127,73139,73151,73163,73175,73187,73199,73211,73223,
+ 73235,73247,73259,73271,73283,73295,73307,73319,73331,73343,
+ 73355,73367,73379,73391,73403,73415,73427,73439,73451,73463,
+ 73475,73487,73499,73511,73523,73535,73547,73559,73571,73583,
+ 73595,73607,73619,73631,73643,73655,73667,73679,73691,73703,
+
+ 73715,73727,73739,73751,73763,73775,73787,73799,73811,73823,
+ 73835,73847,73859,73871,73883,73895,73907,73919,73931,73943,
+ 73955,73967,73979,73991,74003,74015,74027,74039,74051,74063,
+ 74075,74087,74099,74111,74123,74135,74147,74159,74171,74183,
+ 74195,74207,74219,74231,74243,74255,74267,74279,74291,74303,
+ 74315,74327,74339,74351,74363,74375,74387,74399,74411,74423,
+ 74435,74447,74459,74471,74483,74495,74507,74519,74531,74543,
+ 74555,74567,74579,74591,74603,74615,74627,74639,74651,74663,
+ 74675,74687,74699,74711,74723,74735,74747,74759,74771,74783,
+ 74795,74807,74819,74831,74843,74855,74867,74879,74891,74903,
+
+ 74915,74927,74939,74951,74963,74975,74987,74999,75011,75023,
+ 75035,75047,75059,75071,75083,75095,75107,75119,75131,75143,
+ 75155,75167,75179,75191,75203,75215,75227,75239,75251,75263,
+ 75275,75287,75299,75311,75323,75335,75347,75359,75371,75383,
+ 75395,75407,75419,75431,75443,75455,75467,75479,75491,75503,
+ 75515,75527,75539,75551,75563,75575,75587,75599,75611,75623,
+ 75635,75647,75659,75671,75683,75695,75707,75719,75731,75743,
+ 75755,75767,75779,75791,75803,75815,75827,75839,75851,75863,
+ 75875,75887,75899,75911,75923,75935,75947,75959,75971,75983,
+ 75995,76007,76019,76031,76043,76055,76067,76079,76091,76103,
+
+ 76115,76127,76139,76151,76163,76175,76187,76199,76211,76223,
+ 76235,76247,76259,76271,76283,76295,76307,76319,76331,76343,
+ 76355,76367,76379,76391,76403,76415,76427,76439,76451,76463,
+ 76475,76487,76499,76511,76523,76535,76547,76559,76571,76583,
+ 76595,76607,76619,76631,76643,76655,76667,76679,76691,76703,
+ 76715,76727,76739,76751,76763,76775,76787,76799,76811,76823,
+ 76835,76847,76859,76871,76883,76895,76907,76919,76931,76943,
+ 76955,76967,76979,76991,77003,77015,77027,77039,77051,77063,
+ 77075,77087,77099,77111,77123,77135,77147,77159,77171,77183,
+ 77195,77207,77219,77231,77243,77255,77267,77279,77291,77303,
+
+ 77315,77327,77339,77351,77363,77375,77387,77399,77411,77423,
+ 77435,77447,77459,77471,77483,77495,77507,77519,77531,77543,
+ 77555,77567,77579,77591,77603,77615,77627,77639,77651,77663,
+ 77675,77687,77699,77711,77723,77735,77747,77759,77771,77783,
+ 77795,77807,77819,77831,77843,77855,77867,77879,77891,77903,
+ 77915,77927,77939,77951,77963,77975,77987,77999,78011,78023,
+ 78035,78047,78059,78071,78083,78095,78107,78119,78131,78143,
+ 78155,78167,78179,78191,78203,78215,78227,78239,78251,78263,
+ 78275,78287,78299,78311,78323,78335,78347,78359,78371,78383,
+ 78395,78407,78419,78431,78443,78455,78467,78479,78491,78503,
+
+ 78515,78527,78539,78551,78563,78575,78587,78599,78611,78623,
+ 78635,78647,78659,78671,78683,78695,78707,78719,78731,78743,
+ 78755,78767,78779,78791,78803,78815,78827,78839,78851,78863,
+ 78875,78887,78899,78911,78923,78935,78947,78959,78971,78983,
+ 78995,79007,79019,79031,79043,79055,79067,79079,79091,79103,
+ 79115,79127,79139,79151,79163,79175,79187,79199,79211,79223,
+ 79235,79247,79259,79271,79283,79295,79307,79319,79331,79343,
+ 79355,79367,79379,79391,79403,79415,79427,79439,79451,79463,
+ 79475,79487,79499,79511,79523,79535,79547,79559,79571,79583,
+ 79595,79607,79619,79631,79643,79655,79667,79679,79691,79703,
+
+ 79715,79727,79739,79751,79763,79775,79787,79799,79811,79823,
+ 79835,79847,79859,79871,79883,79895,79907,79919,79931,79943,
+ 79955,79967,79979,79991,80003,80015,80027,80039,80051,80063,
+ 80075,80087,80099,80111,80123,80135,80147,80159,80171,80183,
+ 80195,80207,80219,80231,80243,80255,80267,80279,80291,80303,
+ 80315,80327,80339,80351,80363,80375,80387,80399,80411,80423,
+ 80435,80447,80459,80471,80483,80495,80507,80519,80531,80543,
+ 80555,80567,80579,80591,80603,80615,80627,80639,80651,80663,
+ 80675,80687,80699,80711,80723,80735,80747,80759,80771,80783,
+ 80795,80807,80819,80831,80843,80855,80867,80879,80891,80903,
+
+ 80915,80927,80939,80951,80963,80975,80987,80999,81011,81023,
+ 81035,81047,81059,81071,81083,81095,81107,81119,81131,81143,
+ 81155,81167,81179,81191,81203,81215,81227,81239,81251,81263,
+ 81275,81287,81299,81311,81323,81335,81347,81359,81371,81383,
+ 81395,81407,81419,81431,81443,81455,81467,81479,81491,81503,
+ 81515,81527,81539,81551,81563,81575,81587,81599,81611,81623,
+ 81635,81647,81659,81671,81683,81695,81707,81719,81731,81743,
+ 81755,81767,81779,81791,81803,81815,81827,81839,81851,81863,
+ 81875,81887,81899,81911,81923,81935,81947,81959,81971,81983,
+ 81995,82007,82019,82031,82043,82055,82067,82079,82091,82103,
+
+ 82115,82127,82139,82151,82163,82175,82187,82199,82211,82223,
+ 82235,82247,82259,82271,82283,82295,82307,82319,82331,82343,
+ 82355,82367,82379,82391,82403,82415,82427,82439,82451,82463,
+ 82475,82487,82499,82511,82523,82535,82547,82559,82571,82583,
+ 82595,82607,82619,82631,82643,82655,82667,82679,82691,82703,
+ 82715,82727,82739,82751,82763,82775,82787,82799,82811,82823,
+ 82835,82847,82859,82871,82883,82895,82907,82919,82931,82943,
+ 82955,82967,82979,82991,83003,83015,83027,83039,83051,83063,
+ 83075,83087,83099,83111,83123,83135,83147,83159,83171,83183,
+ 83195,83207,83219,83231,83243,83255,83267,83279,83291,83303,
+
+ 83315,83327,83339,83351,83363,83375,83387,83399,83411,83423,
+ 83435,83447,83459,83471,83483,83495,83507,83519,83531,83543,
+ 83555,83567,83579,83591,83603,83615,83627,83639,83651,83663,
+ 83675,83687,83699,83711,83723,83735,83747,83759,83771,83783,
+ 83795,83807,83819,83831,83843,83855,83867,83879,83891,83903,
+ 83915,83927,83939,83951,83963,83975,83987,83999,84011,84023,
+ 84035,84047,84059,84071,84083,84095,84107,84119,84131,84143,
+ 84155,84167,84179,84191,84203,84215,84227,84239,84251,84263,
+ 84275,84287,84299,84311,84323,84335,84347,84359,84371,84383,
+ 84395,84407,84419,84431,84443,84455,84467,84479,84491,84503,
+
+ 84515,84527,84539,84551,84563,84575,84587,84599,84611,84623,
+ 84635,84647,84659,84671,84683,84695,84707,84719,84731,84743,
+ 84755,84767,84779,84791,84803,84815,84827,84839,84851,84863,
+ 84875,84887,84899,84911,84923,84935,84947,84959,84971,84983,
+ 84995,85007,85019,85031,85043,85055,85067,85079,85091,85103,
+ 85115,85127,85139,85151,85163,85175,85187,85199,85211,85223,
+ 85235,85247,85259,85271,85283
+ } ;
+
+static yyconst flex_int16_t yy_def[12466] =
+ { 0,
+ 8694, 8695, 8696, 8697, 8694, 8695, 8698, 8699, 8693, 8693,
+ 8694, 8695, 9, 10, 8694, 8695, 8700, 8701, 8702, 8703,
+ 9, 14, 8694, 12, 8693, 8693, 8704, 8705, 8706, 8707,
+ 8708, 8709, 8693, 8693, 9, 10, 8693, 8693, 8710, 8693,
+ 8711, 8712, 8713, 8714, 8715, 8716, 8717, 8718, 8719, 8720,
+ 8694, 12, 8721, 8722, 8723, 8724, 8694, 52, 8693, 8693,
+ 8693, 8725, 8693, 8693, 8726, 8693, 8727, 8726, 8726, 8693,
+ 8728, 8726, 8729, 8693, 8693, 8693, 8726, 8726, 8726, 8693,
+ 8693, 8730, 8693, 8693, 8693, 8726, 8693, 8731, 8726, 8726,
+ 8726, 8725, 8732, 8732, 8732, 8732, 8732, 8732, 8732, 8732,
+
+ 8732, 8732, 8732, 8732, 8693, 8727, 8733, 8726, 8733, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 8725, 8726, 8727, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8732, 100, 105, 109, 109,
+ 109, 109, 109, 109, 8734, 8735, 8736, 8737, 100, 105,
+ 109, 109, 124, 8726, 8693, 8693, 8725, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8726, 8726, 8727, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8693, 8693, 8725, 8738,
+ 8739, 8693, 8740, 8693, 8726, 8693, 8727, 8741, 8742, 8726,
+
+ 8743, 8726, 8693, 8693, 8693, 8725, 8693, 8693, 8693, 8693,
+ 8693, 8726, 8726, 8693, 8727, 8726, 8726, 8726, 8726, 8726,
+ 8693, 8725, 8693, 8693, 8693, 8693, 8726, 8727, 8726, 8726,
+ 8726, 8726, 8693, 8744, 8693, 8693, 8744, 8744, 8744, 8744,
+ 8726, 8745, 8726, 8726, 8745, 245, 245, 245, 105, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 8693,
+ 8693, 8746, 8693, 8693, 8693, 8746, 8746, 8746, 8746, 8746,
+ 8746, 8746, 8746, 8746, 8726, 8693, 8747, 8726, 8726, 8726,
+ 8747, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ 281, 8693, 8725, 8693, 8693, 8693, 8726, 124, 8727, 8726,
+
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8693, 8693, 8725, 8693, 8693, 8726, 8693, 8727,
+ 8726, 8726, 8693, 8725, 8693, 8693, 8726, 8727, 8726, 8726,
+ 8693, 8748, 8693, 8693, 8749, 8726, 8693, 8750, 8693, 8726,
+ 8751, 8726, 8693, 8752, 8693, 8753, 8754, 8693, 8755, 8754,
+ 8754, 8756, 8693, 8757, 8756, 8756, 8758, 8759, 8758, 8758,
+ 8760, 8761, 8760, 8760, 8693, 8693, 8693, 8726, 8693, 8726,
+ 8726, 8726, 8693, 8762, 8763, 8762, 8726, 8764, 8765, 8764,
+ 8693, 8693, 8693, 8693, 8693, 8726, 8726, 8726, 8726, 8726,
+ 8693, 8693, 8693, 8766, 8767, 8766, 8693, 8726, 8693, 8726,
+
+ 8768, 8769, 8768, 8726, 8693, 8693, 8770, 8771, 8770, 8770,
+ 8770, 8770, 8770, 8770, 8770, 8770, 8770, 8770, 8770, 8770,
+ 8770, 8770, 8770, 8770, 8693, 8772, 8726, 8772, 428, 428,
+ 428, 428, 428, 428, 428, 428, 428, 428, 8726, 8726,
+ 8726, 8773, 8774, 8775, 8773, 8726, 8726, 445, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 445, 445, 445, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8770, 8770,
+
+ 425, 428, 428, 428, 445, 445, 445, 445, 445, 445,
+ 8776, 8777, 8776, 8778, 8779, 8778, 8780, 8781, 8780, 8782,
+ 8783, 8782, 8770, 8770, 425, 428, 445, 445, 445, 474,
+ 8726, 8726, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8693, 8784, 8693, 8693,
+ 8785, 8786, 8785, 8784, 8787, 8693, 8693, 8788, 8693, 8726,
+ 8789, 8726, 8726, 8790, 8791, 8790, 8789, 8784, 8792, 8726,
+ 8726, 8793, 8693, 8693, 8693, 8693, 8693, 8726, 8726, 8726,
+
+ 8726, 8693, 8726, 8693, 8693, 8693, 8794, 8795, 8794, 8693,
+ 8693, 8794, 8794, 8794, 8794, 8794, 8726, 8726, 8726, 8796,
+ 8797, 8796, 8726, 8726, 622, 622, 622, 622, 622, 425,
+ 428, 428, 428, 428, 428, 428, 428, 428, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 8693,
+ 8693, 8693, 8693, 8798, 8799, 8798, 8693, 8693, 8800, 8798,
+ 8798, 8798, 8798, 8798, 8798, 8798, 8798, 8798, 8798, 8798,
+ 8798, 8798, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8801, 8802, 8801, 8726, 8726, 8803, 683, 683, 683, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+
+ 683, 683, 8693, 474, 8726, 8726, 8726, 8693, 8693, 8804,
+ 8693, 8805, 8804, 8693, 8693, 8806, 8726, 8807, 8806, 8726,
+ 8726, 8693, 8693, 8808, 8809, 8808, 8693, 8726, 8726, 8810,
+ 8811, 8810, 8726, 8812, 8813, 8812, 8814, 8815, 8814, 8816,
+ 8693, 8693, 8816, 8816, 8816, 8817, 8817, 8817, 8817, 8818,
+ 8818, 8818, 8818, 8819, 8819, 8819, 8819, 8693, 8693, 8726,
+ 8726, 8820, 8820, 8820, 8820, 8820, 8820, 8820, 8820, 8820,
+ 8820, 8820, 8820, 8820, 8820, 8820, 8820, 8820, 8821, 8822,
+ 8822, 781, 781, 781, 781, 781, 781, 781, 781, 781,
+ 781, 781, 781, 781, 781, 8823, 8824, 8825, 8726, 8826,
+
+ 8826, 801, 801, 801, 801, 801, 801, 801, 801, 801,
+ 801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
+ 801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
+ 801, 801, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8820, 8820, 781,
+ 781, 781, 801, 801, 801, 801, 801, 8820, 8820, 781,
+ 801, 801, 801, 8726, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8693, 8827, 8828, 8829, 8726, 8830,
+
+ 8827, 8831, 8832, 8693, 8833, 8833, 8833, 8833, 8833, 8726,
+ 8834, 8834, 912, 912, 912, 781, 781, 781, 781, 781,
+ 781, 781, 781, 781, 781, 801, 801, 801, 801, 801,
+ 801, 801, 801, 801, 801, 801, 8693, 8835, 8836, 8836,
+ 8836, 8836, 8836, 8836, 8836, 8836, 8836, 8836, 8836, 8836,
+ 8836, 8836, 8836, 8726, 8726, 8726, 8726, 8726, 8837, 8838,
+ 8838, 961, 961, 961, 961, 961, 961, 961, 961, 961,
+ 961, 961, 961, 961, 961, 961, 961, 961, 8693, 8726,
+ 8726, 8693, 8726, 8693, 8693, 8693, 8693, 8726, 8726, 8820,
+ 8820, 8820, 8820, 8820, 8820, 8820, 8820, 8820, 8820, 8820,
+
+ 8820, 8820, 8820, 8820, 8820, 8820, 8693, 781, 781, 781,
+ 781, 781, 781, 781, 781, 781, 781, 781, 781, 781,
+ 781, 781, 781, 781, 8726, 8824, 8839, 8693, 8825, 8839,
+ 8840, 8841, 801, 801, 801, 801, 801, 801, 801, 801,
+ 801, 801, 8726, 8693, 8726, 801, 801, 801, 801, 801,
+ 801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
+ 801, 801, 801, 801, 801, 801, 801, 801, 801, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8820, 8820, 781,
+ 781, 781, 801, 8726, 8693, 8726, 801, 801, 801, 801,
+
+ 801, 8820, 8820, 781, 801, 801, 801, 8726, 8726, 8726,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8842, 8693, 8693, 8693, 8842, 8693, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8843, 8726, 8726, 8726,
+ 8843, 8726, 8829, 8828, 8844, 8829, 8845, 8832, 8831, 8828,
+ 8846, 8832, 8829, 8847, 8833, 8833, 8833, 8833, 8833, 912,
+ 912, 912, 912, 912, 781, 781, 781, 781, 781, 781,
+ 781, 781, 781, 781, 781, 801, 801, 801, 801, 801,
+ 8726, 801, 801, 801, 801, 801, 801, 8836, 8836, 8836,
+ 8836, 8836, 8836, 8836, 8836, 8836, 8836, 8836, 8836, 8836,
+
+ 8836, 8836, 8836, 8726, 8726, 8726, 8726, 961, 961, 961,
+ 8726, 961, 961, 961, 961, 961, 961, 961, 961, 961,
+ 961, 961, 961, 961, 961, 961, 961, 961, 8693, 8726,
+ 8726, 8726, 8693, 8726, 8693, 8693, 8726, 8726, 8820, 8820,
+ 8820, 8820, 8820, 8820, 8820, 8820, 8820, 8820, 8848, 8849,
+ 8693, 8820, 8820, 8820, 8820, 8848, 8820, 781, 781, 781,
+ 781, 781, 781, 781, 781, 781, 781, 781, 781, 781,
+ 781, 781, 781, 781, 781, 8839, 8850, 8851, 8841, 8851,
+ 8840, 8850, 8852, 8841, 8851, 8853, 801, 801, 801, 801,
+ 801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
+
+ 801, 801, 801, 801, 801, 801, 801, 801, 801, 8854,
+ 8855, 8726, 801, 801, 801, 801, 8726, 8726, 8856, 8726,
+ 8726, 801, 801, 801, 801, 8854, 801, 801, 8726, 8857,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 1317, 8726, 8858, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8859, 8820, 8820, 781, 781, 781, 781, 801, 801, 801,
+ 801, 801, 8820, 8820, 781, 801, 801, 801, 8726, 8726,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8860, 8693, 8693, 8693, 8693, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8861,
+
+ 8726, 8726, 8726, 8726, 8862, 8863, 8864, 8865, 8866, 8867,
+ 8868, 8862, 8869, 8870, 8871, 8865, 8872, 8873, 8874, 8693,
+ 8693, 8874, 8874, 8874, 8875, 8726, 8726, 8875, 1428, 1428,
+ 781, 781, 781, 781, 781, 781, 781, 781, 781, 781,
+ 781, 801, 801, 801, 801, 801, 8726, 801, 801, 801,
+ 801, 8726, 8876, 8726, 8726, 8877, 8878, 8878, 8878, 8878,
+ 8878, 8878, 8878, 8878, 8878, 8878, 8693, 8879, 8878, 8878,
+ 8878, 8878, 8726, 8726, 8726, 8880, 8880, 1477, 1477, 1477,
+ 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 8726, 8881,
+ 1477, 1477, 1477, 1477, 1477, 8693, 8726, 8726, 8693, 8726,
+
+ 8693, 8693, 8726, 8726, 8820, 8820, 8820, 8820, 8820, 8820,
+ 8820, 8820, 8820, 8820, 8882, 8883, 8884, 8693, 8693, 8820,
+ 8820, 8820, 8820, 8820, 781, 781, 781, 781, 781, 781,
+ 781, 781, 781, 781, 781, 781, 781, 781, 781, 781,
+ 781, 781, 8885, 8886, 8887, 8888, 8889, 8886, 8890, 8891,
+ 8892, 8888, 8893, 8894, 801, 801, 801, 8726, 8895, 801,
+ 801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
+ 801, 801, 801, 801, 801, 801, 801, 801, 8896, 8897,
+ 8898, 8899, 8726, 8726, 801, 801, 801, 801, 8726, 8726,
+ 8726, 8726, 8726, 8900, 8901, 8902, 8726, 8726, 8726, 801,
+
+ 801, 801, 801, 801, 801, 8903, 8904, 8905, 8726, 8726,
+ 8726, 8906, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8907, 8908, 8909, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8910, 8911, 8912, 8726, 8913, 8913, 8914, 8914, 1639,
+ 801, 801, 801, 801, 801, 8913, 8913, 1639, 801, 801,
+ 801, 8726, 8726, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8915, 8693, 8693, 8693, 8916, 8916, 8917, 8915, 8693, 8693,
+ 8915, 8915, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8918,
+ 8726, 8726, 8726, 8919, 8919, 8916, 8920, 8918, 8726, 8726,
+ 8918, 8918, 8921, 8921, 8922, 8923, 8924, 8693, 8925, 8926,
+
+ 8926, 8927, 8921, 8927, 8928, 8929, 8923, 8930, 8726, 8931,
+ 8932, 8926, 8932, 8933, 8693, 8693, 8933, 8933, 8933, 8934,
+ 8726, 8726, 8934, 1723, 1723, 1639, 1639, 1639, 1639, 1639,
+ 1639, 1639, 1639, 1639, 801, 8726, 8935, 801, 801, 801,
+ 8726, 801, 801, 801, 801, 8726, 8936, 8937, 8938, 8726,
+ 8726, 8726, 8939, 8940, 8941, 8726, 8942, 8942, 8942, 8942,
+ 8942, 8942, 8942, 8942, 8942, 8942, 8943, 8944, 8693, 8942,
+ 8942, 8942, 8942, 8726, 8726, 8726, 8945, 8945, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 8946, 8943,
+ 8947, 8726, 1778, 1778, 1778, 1778, 1778, 8693, 8726, 8726,
+
+ 8693, 8693, 8726, 8726, 8948, 8948, 8948, 8948, 8693, 8693,
+ 8948, 8948, 8948, 8948, 8949, 8950, 8693, 8951, 8952, 8953,
+ 8948, 8948, 8693, 8954, 1639, 1639, 1639, 1639, 1639, 1639,
+ 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639,
+ 1639, 8955, 8956, 8957, 8958, 8959, 8960, 8961, 8956, 8961,
+ 8962, 8963, 8957, 8964, 8726, 8965, 8960, 8966, 8959, 8966,
+ 8967, 8967, 1862, 8968, 8969, 8970, 8726, 1862, 1862, 1862,
+ 1862, 8726, 1862, 1862, 1862, 1862, 1862, 1862, 8726, 8971,
+ 1862, 1862, 1862, 1862, 1862, 1862, 8972, 8973, 8726, 8974,
+ 8975, 8693, 8976, 8975, 8977, 8978, 8979, 1862, 1862, 1862,
+
+ 8726, 8726, 8726, 8726, 8726, 8980, 8981, 8693, 8982, 8981,
+ 8983, 8984, 8726, 1862, 1862, 1862, 8726, 8985, 1862, 8726,
+ 8986, 8987, 8693, 8988, 8987, 8989, 8990, 8726, 8991, 8992,
+ 8993, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8994, 8995, 8693, 8996, 8995, 8997, 8998, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8999, 9000, 8693, 9001, 9000,
+ 9002, 9003, 9004, 9005, 9005, 1965, 1862, 1862, 1862, 1862,
+ 9004, 9006, 8693, 1965, 1862, 1862, 8979, 8693, 8726, 8726,
+ 8726, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 9007, 9008, 9009, 9010, 9007, 9007, 8726, 8726, 8726,
+
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 9011, 9012, 9008,
+ 9013, 9014, 9011, 9011, 9015, 9016, 9017, 9018, 9019, 9015,
+ 9020, 9021, 9022, 9023, 8693, 8693, 8693, 9023, 9023, 9024,
+ 8726, 8726, 8726, 9024, 2034, 1965, 1965, 1965, 1965, 1965,
+ 1965, 1965, 1965, 1862, 9025, 9026, 9027, 8726, 1862, 1862,
+ 8726, 8726, 1862, 1862, 1862, 1862, 8726, 9028, 9029, 8693,
+ 9030, 9029, 9031, 9032, 8726, 9033, 9034, 8693, 9035, 9034,
+ 9036, 9037, 9038, 9038, 9038, 9038, 8693, 8693, 9038, 9038,
+ 9038, 9038, 8693, 9039, 9040, 9041, 9038, 9038, 8726, 8726,
+ 9042, 9042, 2092, 2092, 2092, 2092, 8726, 8726, 2092, 2092,
+
+ 2092, 2092, 8726, 9043, 9039, 9044, 9045, 2092, 2092, 2092,
+ 8693, 8693, 8726, 8726, 8726, 8693, 8693, 8726, 8726, 9046,
+ 9046, 9046, 9046, 8693, 8693, 8693, 9046, 9046, 9046, 9046,
+ 9047, 9048, 9049, 9047, 9050, 9051, 9047, 9052, 9053, 9054,
+ 9054, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141,
+ 2141, 2141, 2141, 2141, 2141, 9055, 9055, 9056, 9057, 9058,
+ 8693, 9059, 9059, 9060, 9058, 9061, 9062, 9063, 9056, 9064,
+ 9064, 2171, 8726, 9065, 9066, 8693, 9067, 9066, 9068, 9069,
+ 2171, 2171, 2171, 8726, 2171, 2171, 2171, 2171, 2171, 9070,
+ 9070, 9070, 2171, 2171, 2171, 2171, 2171, 9071, 9072, 9073,
+
+ 9074, 9073, 9075, 9072, 9076, 9074, 9077, 9073, 9078, 9074,
+ 2171, 8726, 8726, 8726, 8726, 9079, 9080, 9081, 8693, 8693,
+ 8693, 8693, 9082, 9081, 9083, 9080, 9084, 9082, 9082, 9081,
+ 9085, 9082, 9082, 9082, 2171, 2171, 2171, 9086, 9087, 2171,
+ 9088, 9089, 9090, 9091, 9090, 9092, 9089, 9093, 9091, 9091,
+ 9090, 9094, 9091, 9091, 9091, 8726, 8726, 9095, 9096, 8693,
+ 9097, 9096, 9098, 9099, 8726, 8726, 8726, 8726, 8726, 8726,
+ 9100, 9101, 9102, 8693, 9103, 9102, 9104, 9101, 9105, 9103,
+ 9103, 9102, 9106, 9103, 9103, 8726, 8726, 8726, 8726, 9107,
+ 9108, 9109, 9110, 9109, 9111, 9108, 9112, 9110, 9110, 9109,
+
+ 9113, 9110, 9110, 8693, 9114, 9114, 2306, 2171, 2171, 2171,
+ 8726, 9115, 8693, 2306, 2171, 9116, 8693, 8726, 8726, 8726,
+ 8693, 9117, 8693, 9117, 8693, 8693, 8693, 8693, 8693, 9117,
+ 8693, 9118, 9119, 9120, 9121, 9121, 9122, 9117, 8726, 9123,
+ 8726, 9123, 8726, 8726, 8726, 8726, 8726, 9123, 8726, 9124,
+ 9125, 9119, 9126, 9127, 9121, 9128, 9123, 9129, 9130, 9131,
+ 9129, 9132, 9133, 9134, 9130, 9135, 9133, 9129, 9136, 9137,
+ 8693, 8693, 8693, 9138, 9139, 8726, 8726, 8726, 9140, 2306,
+ 2306, 2306, 2306, 2306, 2306, 2306, 2171, 8726, 9141, 9142,
+ 8693, 9143, 9142, 9144, 9145, 2171, 8726, 8726, 9146, 8693,
+
+ 8726, 2171, 9147, 9148, 9149, 9150, 9149, 9151, 9148, 9152,
+ 9150, 9150, 9149, 9153, 9154, 9155, 9156, 9157, 9156, 9158,
+ 9155, 9159, 9157, 9157, 9156, 9160, 9161, 9161, 9161, 9161,
+ 8693, 8693, 8693, 9161, 9161, 9161, 9161, 9162, 9163, 9164,
+ 9162, 9165, 8726, 8726, 9166, 9166, 2446, 9146, 2446, 8726,
+ 8726, 8726, 2446, 2446, 2446, 2446, 9167, 9168, 9163, 9169,
+ 9167, 9162, 9170, 2446, 8693, 8726, 8726, 8693, 8693, 8726,
+ 8726, 9171, 9171, 8693, 8693, 9171, 9171, 9171, 9172, 9173,
+ 9174, 9175, 9172, 9176, 9177, 9178, 9179, 9179, 9180, 9181,
+ 9182, 9182, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492,
+
+ 2492, 2492, 2492, 9183, 9184, 9185, 9186, 9185, 9187, 9184,
+ 9188, 9186, 9185, 9189, 8726, 9190, 9190, 9191, 9192, 9193,
+ 9194, 9193, 9195, 9192, 9196, 9194, 9194, 9193, 9197, 9194,
+ 9194, 9194, 8726, 8693, 8726, 2517, 8726, 2517, 2517, 2517,
+ 8726, 9198, 9198, 2517, 2517, 2517, 2517, 9199, 9200, 9201,
+ 9202, 9203, 9201, 9204, 9205, 9200, 9206, 9207, 9204, 9208,
+ 9209, 9203, 9210, 9211, 9211, 2517, 8726, 8726, 8726, 8726,
+ 9212, 9213, 9214, 9214, 9215, 9214, 9214, 9214, 8693, 8693,
+ 9216, 9216, 9213, 9217, 9218, 9216, 9216, 9216, 9219, 9220,
+ 9215, 9221, 9219, 9219, 9219, 2517, 2517, 2517, 9222, 9223,
+
+ 2517, 9224, 9225, 9226, 9226, 9227, 9226, 9226, 9226, 9228,
+ 9228, 9225, 9229, 9230, 9228, 9228, 9228, 9231, 9232, 9227,
+ 9233, 9231, 9231, 9231, 8726, 9234, 9235, 9236, 9237, 9236,
+ 9238, 9235, 9239, 9237, 9237, 9236, 9240, 9237, 9237, 8726,
+ 8726, 8726, 8726, 8726, 8726, 9241, 9242, 9243, 9243, 9244,
+ 9243, 9243, 9245, 9245, 9242, 9246, 9247, 9245, 9245, 9248,
+ 9244, 9249, 9250, 9250, 9250, 8726, 8726, 8726, 8726, 9251,
+ 9252, 9253, 9253, 9254, 9253, 9253, 9255, 9255, 9252, 9256,
+ 9257, 9255, 9255, 9258, 9254, 9259, 9260, 9260, 9260, 9261,
+ 9261, 2691, 8726, 8693, 8726, 9262, 9262, 2691, 8726, 8693,
+
+ 8726, 8726, 8726, 8693, 8693, 8693, 8693, 9263, 8693, 9263,
+ 9264, 9264, 9265, 9266, 9267, 9267, 9268, 9269, 8726, 8726,
+ 8726, 8726, 9270, 8726, 9270, 9271, 9264, 9272, 9273, 9274,
+ 9275, 9275, 9267, 9276, 9277, 9278, 9279, 9280, 9281, 9282,
+ 9283, 9284, 9278, 9285, 9286, 9287, 9281, 9288, 9289, 8693,
+ 9290, 9291, 8693, 8726, 9292, 9290, 9293, 8726, 9294, 9294,
+ 2760, 9295, 9296, 9297, 9298, 9299, 9298, 9300, 9297, 9301,
+ 9299, 9299, 9298, 9302, 8726, 8693, 8726, 8726, 9303, 9295,
+ 9304, 9305, 9306, 9306, 9307, 9308, 9308, 9305, 9309, 9310,
+ 9311, 9307, 9312, 9313, 9314, 9315, 9316, 9316, 9317, 9318,
+
+ 9318, 9315, 9319, 9320, 9321, 9317, 9322, 9323, 9324, 9324,
+ 8693, 8693, 9324, 9324, 9324, 9325, 9326, 9327, 9328, 9329,
+ 9330, 8726, 9331, 9331, 8726, 8726, 2824, 2824, 2824, 9332,
+ 9325, 9333, 9334, 9335, 9328, 9336, 9337, 2824, 8693, 8726,
+ 8726, 8693, 8726, 9338, 9339, 9340, 8693, 8693, 8693, 8693,
+ 9338, 9341, 9342, 9342, 9343, 9344, 9345, 9346, 8693, 9344,
+ 9343, 9347, 9348, 9349, 9350, 9350, 9351, 9351, 2868, 2868,
+ 2868, 2868, 2868, 2868, 2868, 2868, 9352, 9353, 9354, 9355,
+ 9356, 9353, 9357, 9358, 9359, 9355, 9360, 9361, 8726, 9362,
+ 8726, 9363, 8726, 9364, 9365, 9366, 9366, 9367, 9366, 9366,
+
+ 9366, 9368, 9368, 9365, 9369, 9370, 9368, 9368, 9368, 9371,
+ 9372, 9367, 9373, 9371, 9371, 9371, 9374, 9375, 8726, 8726,
+ 9362, 2921, 9376, 8726, 9376, 9376, 9377, 2921, 9378, 9379,
+ 9380, 9381, 9378, 9382, 9383, 9384, 9385, 9385, 9386, 9387,
+ 9380, 9387, 9388, 9389, 9390, 9381, 9391, 8726, 9389, 9388,
+ 9392, 9393, 9394, 9385, 9395, 9384, 9395, 8726, 9396, 8726,
+ 2920, 8726, 8726, 9397, 9397, 9398, 9399, 9397, 9397, 9397,
+ 9400, 9401, 9402, 9400, 9400, 9400, 8693, 8693, 9403, 9404,
+ 9398, 9404, 9403, 9405, 9405, 9399, 9406, 8726, 9405, 9405,
+ 9405, 9403, 9403, 9407, 9400, 9408, 9402, 9408, 9407, 9407,
+
+ 9409, 9409, 2920, 3002, 9410, 9410, 9411, 9412, 9410, 9410,
+ 9410, 9413, 9414, 9415, 9413, 9413, 9413, 9416, 9417, 9411,
+ 9417, 9416, 9418, 9418, 9412, 9419, 8726, 9418, 9418, 9418,
+ 9416, 9416, 9420, 9413, 9421, 9415, 9421, 9420, 9420, 8726,
+ 9422, 8726, 9423, 9424, 9425, 9425, 9426, 9425, 9425, 9427,
+ 9427, 9424, 9428, 9429, 9427, 9427, 9430, 9426, 9431, 9432,
+ 9432, 9432, 8726, 2920, 8726, 8726, 8726, 9433, 9434, 9434,
+ 9435, 9436, 9434, 9434, 9437, 9438, 9439, 9439, 9439, 9440,
+ 9435, 9440, 9441, 9442, 9442, 9436, 9443, 8726, 9442, 9442,
+ 9441, 9441, 9444, 9439, 9445, 9438, 9445, 9444, 9444, 8726,
+
+ 8726, 2920, 8726, 9446, 9446, 9447, 9448, 9446, 9446, 9449,
+ 9450, 9451, 9451, 9451, 9452, 9447, 9452, 9453, 9454, 9454,
+ 9448, 9455, 8726, 9454, 9454, 9453, 9453, 9456, 9451, 9457,
+ 9450, 9457, 9456, 9456, 9458, 9458, 9459, 9460, 9459, 8726,
+ 8693, 8693, 9461, 8693, 9462, 8693, 8693, 8693, 9463, 9464,
+ 9463, 9463, 9465, 9466, 9466, 9467, 9462, 9468, 9469, 9469,
+ 8726, 8726, 9470, 8726, 9471, 8726, 8726, 8726, 9472, 9473,
+ 9474, 9473, 9463, 9473, 9475, 9476, 9466, 9477, 9471, 9478,
+ 9479, 9469, 9479, 9480, 9480, 9481, 9482, 9483, 9483, 9484,
+ 9480, 9484, 9485, 9486, 9487, 9483, 9487, 8693, 8693, 9488,
+
+ 9489, 9490, 8726, 8726, 9491, 9488, 9492, 9493, 9494, 9494,
+ 8726, 9495, 8726, 9496, 9497, 9498, 9498, 9499, 9500, 9500,
+ 9497, 9501, 9502, 9503, 9499, 9504, 9505, 8726, 8726, 9506,
+ 9507, 8726, 9508, 9509, 9509, 9510, 9511, 9512, 9513, 9514,
+ 9515, 9510, 9515, 9516, 9517, 9517, 9511, 9518, 8726, 9519,
+ 9514, 9520, 9513, 9520, 9521, 9521, 9522, 9523, 9524, 9525,
+ 9526, 9527, 9522, 9527, 9528, 9529, 9529, 9523, 9530, 8726,
+ 9531, 9526, 9532, 9525, 9532, 9533, 8693, 9534, 8693, 8693,
+ 8693, 8693, 9533, 9535, 9535, 9536, 9537, 9538, 8693, 9539,
+ 9540, 9540, 8726, 9541, 8726, 9542, 8726, 8726, 8726, 8726,
+
+ 9541, 9543, 9535, 9543, 9544, 9545, 9537, 9546, 8726, 9547,
+ 9548, 9540, 9548, 8726, 9549, 8693, 8726, 8726, 9550, 9551,
+ 9552, 8693, 8693, 8693, 9550, 9553, 9554, 9555, 9556, 9557,
+ 9558, 9559, 9560, 9561, 9561, 3335, 3335, 3335, 9562, 9563,
+ 9564, 9565, 9566, 9567, 9568, 9563, 9568, 9569, 9570, 9567,
+ 9571, 9566, 9571, 8726, 9572, 8726, 9573, 9574, 9575, 8726,
+ 8726, 9576, 8726, 9577, 9577, 9578, 9579, 9577, 9577, 9577,
+ 9580, 9581, 9582, 9580, 9580, 9580, 9583, 9584, 9578, 9584,
+ 9583, 9585, 9585, 9579, 9586, 8726, 9585, 9585, 9585, 9583,
+ 9583, 9587, 9580, 9588, 9582, 9588, 9587, 9587, 9589, 9590,
+
+ 9591, 8726, 8726, 9572, 3404, 9592, 9592, 9593, 3404, 9594,
+ 9595, 9595, 9596, 9597, 9598, 9599, 8693, 9597, 9596, 9600,
+ 9601, 9602, 9602, 9603, 9604, 9605, 9606, 9599, 9607, 9608,
+ 9609, 9610, 9596, 8726, 9611, 9612, 9613, 8726, 8726, 8726,
+ 8726, 8726, 8726, 9614, 9615, 9615, 9614, 9616, 9616, 9617,
+ 8693, 9616, 9616, 9616, 9614, 9614, 9618, 9618, 9619, 9619,
+ 8693, 8693, 9620, 9621, 9617, 9622, 9623, 9620, 9620, 9624,
+ 9624, 9624, 9614, 9625, 9625, 9626, 9626, 9627, 9628, 9628,
+ 9627, 9629, 9629, 9630, 8693, 9629, 9629, 9629, 9627, 9627,
+ 9631, 9631, 9632, 9632, 9633, 9634, 9630, 9635, 9636, 9633,
+
+ 9633, 9637, 9637, 9637, 9627, 9638, 9638, 9639, 9640, 9641,
+ 8726, 8726, 9642, 8726, 9643, 9643, 9644, 9645, 9643, 9643,
+ 9646, 9647, 9648, 9648, 9648, 9649, 9644, 9649, 9650, 9651,
+ 9651, 9645, 9652, 8726, 9651, 9651, 9650, 9650, 9653, 9648,
+ 9654, 9647, 9654, 9653, 9653, 8726, 8726, 8726, 9655, 9656,
+ 9657, 8726, 9658, 9658, 9659, 9660, 9660, 9661, 8693, 9660,
+ 9660, 9659, 9659, 9662, 9662, 9663, 9663, 9664, 9661, 9665,
+ 9666, 9667, 9667, 9668, 9668, 9668, 9659, 9669, 9669, 8726,
+ 8726, 9670, 9670, 9671, 9672, 9672, 9673, 8693, 9672, 9672,
+ 9671, 9671, 9674, 9674, 9675, 9675, 9676, 9673, 9677, 9678,
+
+ 9679, 9679, 9680, 9680, 9680, 9671, 9681, 9681, 9682, 9683,
+ 9684, 9685, 9686, 8693, 8693, 8693, 9687, 9686, 9687, 9688,
+ 9689, 9690, 9691, 9684, 9692, 9693, 8726, 8726, 8726, 9694,
+ 9695, 9693, 9695, 9687, 9696, 9697, 9698, 9699, 9700, 8693,
+ 9701, 9702, 9703, 9701, 9704, 8726, 9705, 9706, 9702, 9707,
+ 9705, 9701, 9708, 8726, 9709, 9710, 9711, 8726, 8726, 9712,
+ 8726, 9713, 9713, 9714, 9715, 9716, 9717, 9718, 9719, 9714,
+ 9719, 9720, 9721, 9721, 9715, 9722, 8726, 9723, 9718, 9724,
+ 9717, 9724, 8726, 8726, 9725, 9726, 9727, 8726, 9728, 9728,
+ 9729, 9730, 9730, 9731, 8693, 9732, 9732, 9733, 9731, 9734,
+
+ 9735, 9736, 9729, 9737, 9737, 9738, 9739, 9739, 9740, 8693,
+ 9741, 9741, 9742, 9740, 9743, 9744, 9745, 9738, 9746, 9747,
+ 9748, 8693, 8693, 8693, 9746, 9749, 9750, 9751, 9752, 9753,
+ 9754, 9747, 9755, 8726, 8726, 8726, 9753, 9756, 9749, 9757,
+ 9758, 9759, 9760, 9761, 9762, 8726, 8693, 8726, 8726, 8693,
+ 9763, 9764, 9765, 8693, 9766, 9767, 9768, 9769, 9770, 9771,
+ 9769, 9772, 9773, 9773, 3764, 3764, 9774, 9774, 9775, 9776,
+ 9776, 9777, 9775, 8726, 8726, 9778, 9779, 8693, 9780, 9779,
+ 9781, 9782, 9783, 9784, 9785, 8726, 9786, 9787, 9787, 9786,
+ 9788, 9788, 9789, 8693, 9788, 9788, 9788, 9786, 9786, 9790,
+
+ 9790, 9791, 9791, 9792, 9793, 9789, 9794, 9795, 9792, 9792,
+ 9796, 9796, 9796, 9786, 9797, 9797, 8726, 9798, 9799, 8693,
+ 9800, 9799, 9801, 9802, 8726, 9803, 9804, 9805, 8726, 9806,
+ 9807, 9808, 9804, 9809, 9810, 9811, 9812, 9813, 9814, 9815,
+ 9816, 9817, 9818, 9814, 9819, 9813, 9820, 9818, 9814, 9821,
+ 8726, 9822, 9823, 8693, 9824, 9823, 9825, 9826, 8726, 8726,
+ 8726, 8726, 8726, 9827, 9828, 9829, 9830, 9827, 9827, 9831,
+ 9831, 9832, 9832, 8693, 8693, 9833, 9830, 9834, 9829, 9835,
+ 9833, 9830, 9836, 9837, 9837, 9838, 9838, 9839, 9839, 9840,
+ 9840, 9841, 9842, 9843, 9844, 9841, 9841, 9845, 9845, 9846,
+
+ 9846, 9847, 9844, 9848, 9843, 9849, 9847, 9844, 9850, 9851,
+ 9851, 9852, 9852, 9853, 9853, 8726, 9854, 9855, 8693, 9856,
+ 9855, 9857, 9858, 9859, 9860, 9861, 8726, 9862, 9862, 9863,
+ 9864, 9864, 9865, 8693, 9864, 9864, 9863, 9863, 9866, 9866,
+ 9867, 9867, 9868, 9865, 9869, 9870, 9871, 9871, 9872, 9872,
+ 9872, 9863, 9873, 9873, 8726, 9874, 8726, 8726, 9875, 9876,
+ 8693, 9877, 9876, 9878, 9879, 9880, 9881, 9882, 9883, 9883,
+ 9884, 9884, 9885, 9885, 9886, 9882, 9887, 9881, 9888, 9886,
+ 9882, 9889, 9890, 9890, 9891, 9891, 9892, 9892, 8726, 8726,
+ 9893, 9894, 9895, 9896, 9896, 9897, 9897, 9898, 9898, 9899,
+
+ 9895, 9900, 9894, 9901, 9899, 9895, 9902, 9903, 9903, 9904,
+ 9904, 9905, 9905, 8726, 9906, 9907, 9908, 9909, 9910, 9911,
+ 8693, 8693, 9912, 9913, 9914, 9912, 9915, 9916, 9917, 9909,
+ 9918, 9919, 8726, 8726, 9920, 9921, 9913, 9922, 9920, 9912,
+ 9923, 8693, 8693, 9924, 9925, 9926, 9927, 9928, 9929, 8726,
+ 8726, 9930, 9924, 9931, 9932, 9933, 9927, 9934, 9935, 8726,
+ 9936, 9937, 8693, 9938, 9937, 9939, 9940, 9941, 9942, 9943,
+ 8726, 9944, 9944, 9945, 9946, 9946, 9947, 8693, 9948, 9948,
+ 9949, 9947, 9950, 9951, 9952, 9945, 8726, 8726, 9953, 9954,
+ 8693, 9955, 9954, 9956, 9957, 9958, 9959, 9960, 9961, 9960,
+
+ 9962, 9959, 9963, 9961, 9960, 9964, 9965, 9966, 9967, 9968,
+ 9967, 9969, 9966, 9970, 9968, 9967, 9971, 8693, 9972, 9973,
+ 9974, 8693, 9975, 9976, 9977, 9978, 9976, 9979, 8726, 9980,
+ 9972, 9981, 9982, 8726, 9983, 9984, 9985, 9977, 9986, 9984,
+ 9976, 9987, 8726, 9988, 9989, 8693, 9990, 9989, 9991, 9992,
+ 8693, 8726, 8726, 9993, 9994, 9995, 9993, 9996, 9997, 9993,
+ 9998, 9999,10000,10001,10002,10003,10004,10005,10005, 4169,
+ 8726,10006,10007,10008,10009,10008,10010,10007,10011,10009,
+ 10009,10008,10012,10009,10009,10009, 8726,10013,10014, 8693,
+ 10015,10014,10016,10017,10018,10019,10020,10021,10018,10018,
+
+ 10022,10022,10023,10023,10024,10021,10025,10020,10026,10024,
+ 10021,10027,10028,10028,10029,10029,10030,10030,10031,10032,
+ 10033,10034,10033,10035,10032,10036,10034,10037,10033,10038,
+ 10034, 8726,10039,10040,10041,10042,10043, 8726,10040,10044,
+ 10045,10046,10047,10048,10049,10050,10047,10051,10052,10053,
+ 10049,10054,10055,10056,10057,10058,10059,10058,10060,10057,
+ 10061,10059,10059,10058,10062,10059,10059,10059, 8726, 8726,
+ 8726, 8726, 8726,10063,10064,10065,10066,10067,10067,10068,
+ 10068,10069,10069, 8693, 8693,10070,10064,10071,10072,10073,
+ 10066,10074,10075,10072,10072,10076,10076,10077,10077, 8726,
+
+ 10078,10079,10080,10081,10082,10083,10083,10084,10084,10085,
+ 10085,10086,10080,10087,10088,10089,10082,10090,10091,10088,
+ 10088,10092,10092,10093,10093,10094,10095,10096,10097,10096,
+ 10098,10095,10099,10097,10097,10096,10100,10097,10097, 8726,
+ 10101,10102, 8693,10103,10102,10104,10105,10106,10107,10108,
+ 10109,10109,10110,10110,10111,10111,10112,10108,10113,10107,
+ 10114,10112,10108,10115,10116,10116,10117,10117,10118,10118,
+ 8726, 8726,10119,10120,10121,10122,10121,10123,10120,10124,
+ 10122,10122,10121,10125,10122,10122,10126,10127,10128,10129,
+ 10130,10130,10131,10131,10132,10132,10133,10127,10134,10135,
+
+ 10136,10129,10137,10138,10135,10135,10139,10139,10140,10140,
+ 8726, 8726,10141,10142,10143,10144,10145,10145,10146,10146,
+ 10147,10147,10148,10142,10149,10150,10151,10144,10152,10153,
+ 10150,10150,10154,10154,10155,10155,10156,10157,10158,10159,
+ 10159,10160,10161, 8693,10162,10163,10164,10165,10166,10167,
+ 10168,10169,10157,10170,10171,10159,10172,10173,10174,10175,
+ 10162,10176,10177,10178,10165,10179,10180, 8693,10181,10182,
+ 10182,10183,10184,10185, 8693,10186,10187,10187,10174,10188,
+ 10189,10182,10189,10190,10191,10184,10192,10174,10193,10194,
+ 10187,10194,10195,10196,10197,10198,10197,10199,10196,10200,
+
+ 10198,10198,10197,10201,10174,10202,10203, 8693,10204,10203,
+ 10205,10206,10207,10208,10209,10210,10209,10211,10208,10212,
+ 10210,10209,10213,10174,10214,10215,10216,10217,10216,10218,
+ 10215,10219,10217,10217,10216,10220,10221,10222,10223,10224,
+ 10225,10222,10226,10227,10228,10224,10229,10230,10231,10232,
+ 10233,10234,10235,10232,10236,10237,10238,10234,10239,10240,
+ 10241,10242,10243,10241,10244,10245,10246,10247,10248,10249,
+ 10250,10251,10252,10253,10242,10254,10252,10241,10255,10256,
+ 10257,10246,10258,10259,10260,10249,10261,10262,10263,10264,
+ 10265,10266,10265,10267,10264,10268,10266,10265,10269, 8693,
+
+ 10270,10271,10272,10273,10274,10275,10272,10276,10277,10278,
+ 10279,10279,10280,10281,10281,10282,10283,10284,10284,10285,
+ 10283,10286,10286,10271,10287,10288,10289,10289,10290,10289,
+ 10289,10289,10291,10291,10288,10292,10293,10291,10291,10291,
+ 10294,10295,10290,10296,10294,10294,10294,10297,10298,10299,
+ 10300,10299,10301,10298,10302,10300,10300,10299,10303,10300,
+ 10300,10300,10304,10305,10306,10307,10308,10308,10309,10309,
+ 10310,10310,10311,10305,10312,10313,10314,10307,10315,10316,
+ 10313,10313,10317,10317,10318,10318,10319,10320,10321,10322,
+ 10323,10321,10324,10325,10320,10326,10327,10324,10328,10329,
+
+ 10323,10330,10331,10331,10332,10332,10333,10334,10332,10335,
+ 10336, 8693,10337,10336,10338,10339,10340,10341,10342,10343,
+ 10344,10345,10346,10347,10342,10347,10348,10349,10346,10350,
+ 10345,10350,10351,10349,10352,10353,10354,10354,10355,10354,
+ 10354,10354,10356,10356,10353,10357,10358,10356,10356,10356,
+ 10359,10360,10355,10361,10359,10359,10359,10332,10332,10332,
+ 10332,10332,10362,10363,10364,10365,10366,10367,10364,10364,
+ 10368,10368,10369,10369, 8693, 8693,10370,10363,10370,10371,
+ 10372,10367,10373,10366,10373,10372,10372,10372,10372,10374,
+ 10374,10375,10375,10376,10376,10377,10378,10379,10380,10381,
+
+ 10382,10383,10380,10380,10384,10384,10385,10385,10386,10379,
+ 10386,10387,10388,10383,10389,10382,10389,10388,10388,10388,
+ 10388,10390,10390,10391,10391,10392,10392,10393,10394,10395,
+ 10395,10396,10395,10395,10397,10397,10394,10398,10399,10397,
+ 10397,10400,10396,10401,10402,10402,10402,10403,10404,10405,
+ 10406,10405,10407,10404,10408,10406,10406,10405,10409,10406,
+ 10406,10410,10411,10412,10413,10414,10414,10415,10415,10416,
+ 10416,10417,10411,10418,10419,10420,10413,10421,10422,10419,
+ 10419,10423,10423,10424,10424,10425,10426,10427,10428,10428,
+ 10429,10428,10428,10430,10430,10427,10431,10432,10430,10430,
+
+ 10433,10429,10434,10435,10435,10435,10436,10437,10438,10439,
+ 10440,10441,10438,10438,10442,10442,10443,10443,10444,10437,
+ 10444,10445,10446,10441,10447,10440,10447,10446,10446,10446,
+ 10448,10448,10449,10449,10450,10450,10425,10451,10452,10453,
+ 10454,10455,10456,10453,10453,10457,10457,10458,10458,10459,
+ 10452,10459,10460,10461,10456,10462,10455,10462,10461,10461,
+ 10461,10463,10463,10464,10464,10465,10465,10466,10466,10467,
+ 10468,10469,10469,10470,10471, 8693,10472,10472,10473,10474,
+ 10475,10475,10476,10477,10478,10466,10479,10480,10481,10482,
+ 10482,10469,10483,10484,10485,10486,10472,10486,10487,10488,
+
+ 10489,10475,10489,10490,10491,10492,10492,10493,10494,10495,
+ 10496,10497,10497,10498,10493,10499,10500,10501,10502,10503,
+ 10504,10504,10505,10506,10506,10503,10507,10508,10509,10505,
+ 10510,10511,10512,10513,10514,10515,10514,10516,10513,10517,
+ 10515,10515,10514,10518,10519,10520,10521,10522,10523,10520,
+ 10524,10525,10526,10522,10527,10528,10529,10530,10531,10532,
+ 10532,10533,10534,10534,10531,10535,10536,10537,10533,10538,
+ 10539,10540,10541,10542,10543,10544,10545,10546,10541,10546,
+ 10547,10548,10545,10549,10544,10549,10548,10550,10551,10552,
+ 10553,10554,10555,10556,10551,10556,10557,10558,10555,10559,
+
+ 10554,10559,10558,10560,10561,10562,10563,10564,10565,10566,
+ 10567,10567,10568,10569,10570,10570,10571,10560,10572,10573,
+ 10574,10563,10575,10576,10577,10578,10567,10578,10579,10580,
+ 10581,10570,10581,10582,10583,10584,10585,10586,10583,10587,
+ 10588,10589,10585,10590,10591, 8693,10592,10593,10594,10595,
+ 10595,10596,10597,10598,10599, 8693,10597,10596,10600,10601,
+ 10602,10603,10603,10604,10605,10606,10606,10607,10608,10609,
+ 10593,10610,10610,10611,10612,10610,10610,10610,10613,10614,
+ 10615,10613,10613,10613,10616,10617,10611,10617,10616,10618,
+ 10618,10612,10619,10593,10618,10618,10618,10616,10616,10620,
+
+ 10613,10621,10615,10621,10620,10620,10622,10623,10624,10624,
+ 10625,10624,10624,10624,10626,10626,10623,10627,10628,10626,
+ 10626,10626,10629,10630,10625,10631,10629,10629,10629,10632,
+ 10633,10634,10635,10636,10637,10634,10634,10638,10638,10639,
+ 10639,10640,10633,10640,10641,10642,10637,10643,10636,10643,
+ 10642,10642,10642,10642,10644,10644,10645,10645,10646,10646,
+ 10647,10648,10649,10650,10647,10651,10652,10653,10654,10654,
+ 10655,10656,10649,10656,10657,10658,10659,10650,10660,10661,
+ 10658,10657,10662,10663,10664,10654,10665,10653,10665,10661,
+ 10666,10667,10668,10669,10668,10670,10667,10671,10669,10668,
+
+ 10672,10673,10674,10674,10675,10676,10676,10677,10678,10679,
+ 10680,10680,10675,10681,10682,10683,10683,10684,10685,10683,
+ 10683,10683,10686,10687,10688,10686,10686,10686,10689,10690,
+ 10684,10690,10689,10691,10691,10685,10692,10661,10691,10691,
+ 10691,10689,10689,10693,10686,10694,10688,10694,10693,10693,
+ 10661,10661, 5351, 5351,10695,10695,10696,10697,10697,10698,
+ 10698,10698,10698,10699,10699,10700,10700,10701,10701, 8693,
+ 8693,10702,10702,10702,10702,10702,10696,10703,10703,10703,
+ 10704,10704,10705,10705,10706,10706,10707,10707,10708,10709,
+ 10709,10710,10710,10710,10710,10711,10711,10712,10712,10713,
+
+ 10713,10714,10714,10714,10714,10714,10708,10715,10715,10715,
+ 10716,10716,10717,10717,10718,10718,10719,10719,10720,10721,
+ 10719,10719,10722,10723,10724,10724,10724,10725,10720,10725,
+ 10726,10727,10727,10721,10728,10729,10727,10727,10726,10726,
+ 10730,10724,10731,10723,10731,10730,10730,10732,10733,10734,
+ 10734,10735,10734,10734,10736,10736,10733,10737,10738,10736,
+ 10736,10739,10735,10740,10741,10741,10741,10742,10743,10744,
+ 10745,10746,10747,10744,10744,10748,10748,10749,10749,10750,
+ 10743,10750,10751,10752,10747,10753,10746,10753,10752,10752,
+ 10752,10754,10754,10755,10755,10756,10756,10757,10758,10758,
+
+ 10759,10760,10758,10758,10761,10762,10763,10763,10763,10764,
+ 10759,10764,10765,10766,10766,10760,10767,10757,10766,10766,
+ 10765,10765,10768,10763,10769,10762,10769,10768,10768,10770,
+ 10770,10771,10772,10772,10773,10773,10773,10774,10774,10775,
+ 10775,10776,10776,10777,10777,10777,10777,10771,10778,10778,
+ 10779,10779,10780,10780,10781,10781,10782,10782,10783,10784,
+ 10784,10785,10785,10785,10786,10786,10787,10787,10788,10788,
+ 10789,10789,10789,10789,10783,10790,10790,10791,10791,10792,
+ 10792,10793,10793,10794,10795,10794,10794,10796,10797,10797,
+ 10798,10799,10800,10801,10801,10799,10802,10803,10804,10805,
+
+ 10806,10807,10808,10807,10794,10807,10809,10810,10797,10811,
+ 10812,10813,10814,10801,10814,10812,10815,10816,10817,10818,
+ 10819,10819,10820,10821,10822,10820,10823,10824,10824,10825,
+ 10826,10821,10827,10825,10820,10828,10829,10829,10830,10831,
+ 10832,10833,10834,10835,10830,10835,10836,10837,10837,10831,
+ 10838,10839,10840,10834,10841,10833,10841,10842,10843,10844,
+ 10844,10845,10846,10846,10843,10847,10848,10849,10845,10850,
+ 10851,10852,10853,10854,10855,10856,10857,10858,10853,10858,
+ 10859,10860,10857,10861,10856,10861,10860,10839,10862,10862,
+ 10863,10864,10865,10866,10867,10868,10863,10868,10869,10870,
+
+ 10870,10864,10871,10839,10872,10867,10873,10866,10873,10874,
+ 10874,10875,10876,10876,10877,10878,10878,10875,10879,10879,
+ 10880,10881,10881,10882,10883,10883,10880,10884,10884,10885,
+ 10886,10887, 8693,10888,10889,10889,10890,10891,10892,10884,
+ 10892,10893,10894,10886,10895,10839,10896,10897,10889,10897,
+ 10898,10899,10900,10901,10902,10903,10904,10905,10906,10901,
+ 10906,10907,10908,10902,10909,10839,10910,10905,10911,10904,
+ 10911, 8693,10912,10913,10839,10914,10915,10916,10917,10918,
+ 10919,10920,10921,10922,10923,10924,10925,10839,10926,10927,
+ 10927,10926,10928,10928,10929, 8693,10928,10928,10928,10926,
+
+ 10926,10930,10930,10931,10931,10932,10933,10929,10934,10935,
+ 10932,10932,10936,10936,10936,10926,10937,10937,10938,10938,
+ 10939,10940,10938,10938,10938,10941,10942,10943,10941,10941,
+ 10941,10944,10945,10939,10945,10944,10946,10946,10940,10947,
+ 10839,10946,10946,10946,10944,10944,10948,10941,10949,10943,
+ 10949,10948,10948,10950,10950,10951,10952,10952,10953,10953,
+ 10953,10953,10954,10954,10955,10955,10956,10956,10957,10957,
+ 10957,10957,10957,10951,10958,10958,10958,10959,10959,10960,
+ 10960,10961,10961,10962,10963,10963,10964,10965,10966,10967,
+ 8693,10965,10964,10968,10969,10970,10970,10971,10972,10973,
+
+ 10974,10967,10975,10976,10977,10978,10964,10979,10980,10981,
+ 10982,10983,10984,10981,10985,10986,10987,10983,10988,10989,
+ 10990,10991,10992,10993,10994,10995,10996,10997,10998,10999,
+ 10999,10998,11000,11000,11001, 8693,11000,11000,11000,10998,
+ 10998,11002,11002,11003,11003,11004,11005,11001,11006,11007,
+ 11004,11004,11008,11008,11008,10998,11009,11009,10979,10979,
+ 10979,11010,11010,11010,11010,11011,11011,11011,11012,11012,
+ 11013,11013,11014,11014, 8693, 8693,11015,11015,11015,11016,
+ 11016,11017,11017,11018,11018,11019,11019,11020,11020,11020,
+ 11020,11021,11021,11021,11022,11022,11023,11023,11024,11024,
+
+ 11025,11025,11025,11026,11026,11027,11027,11028,11028,11029,
+ 11029,11030,11030,11031,11032,11032,11033, 8693,11032,11032,
+ 11031,11031,11034,11034,11035,11035,11036,11033,11037,11038,
+ 11039,11039,11040,11040,11040,11031,11041,11041,11042,11042,
+ 11043,11044,11042,11042,11045,11046,11047,11047,11047,11048,
+ 11043,11048,11049,11050,11050,11044,11051,11052,11050,11050,
+ 11049,11049,11053,11047,11054,11046,11054,11053,11053,11055,
+ 11055,11056,11057,11057,11058,11058,11058,11059,11059,11060,
+ 11060,11061,11061,11062,11062,11062,11062,11056,11063,11063,
+ 11064,11064,11065,11065,11066,11066,11052,11067,11067,11068,
+
+ 11069,11069,11070, 8693,11069,11069,11068,11068,11071,11071,
+ 11072,11072,11073,11070,11074,11075,11076,11076,11077,11077,
+ 11077,11068,11078,11078,11079,11079,11079,11080,11080,11081,
+ 11081,11082,11082,11083,11083,11084,11084,11085,11085,11086,
+ 11086,11087,11087,11088,11088,11089,11089,11089,11090,11090,
+ 11091,11091,11092,11092,11093,11093,11094,11094,11095,11095,
+ 11096,11096,11097,11097,11098,11098,11099,11100,11099,11101,
+ 11102,11103,11104,11105,11106,11105,11099,11107,11108,11109,
+ 11110,11111,11112,11113,11114,11115,11116,11110,11117,11118,
+ 11119,11113,11120,11121,11122,11122,11123,11124,11124,11125,
+
+ 8693,11126,11126,11127,11125,11128,11129,11130,11123,11131,
+ 11131,11132,11133,11134,11135,11136,11137,11132,11137,11138,
+ 11139,11139,11133,11140,11141,11142,11136,11143,11135,11143,
+ 11144,11144,11145,11146,11146,11147,11148,11148,11145,11141,
+ 11149,11149,11150,11151,11151,11152, 8693,11153,11153,11154,
+ 11152,11155,11156,11157,11150,11158,11159,11160,11161,11162,
+ 11163,11164,11160,11165,11166,11167,11168,11168,11169,11170,
+ 11171, 8693,11172,11172,11173,11171,11174,11175,11176,11169,
+ 11177,11178,11179,11180,11181,11179,11182,11183,11184,11185,
+ 11186,11187,11188,11189,11186,11186,11190,11190,11191,11191,
+
+ 11192,11189,11193,11188,11194,11192,11189,11195,11196,11196,
+ 11197,11197,11198,11198,11199,11200,11200,11199,11201,11201,
+ 11202, 8693,11201,11201,11201,11199,11199,11203,11203,11204,
+ 11204,11205,11206,11202,11207,11208,11205,11205,11209,11209,
+ 11209,11199,11210,11210,11211,11211,11211,11211,11212,11212,
+ 11212,11213,11213,11214,11214,11215,11215,11216,11216,11216,
+ 11217,11217,11218,11218,11219,11219,11220,11220,11221,11222,
+ 11223,11224,11225,11226,11227,11228,11229,11230,11226,11231,
+ 11225,11232,11230,11226,11233,11234,11235,11236,11237,11238,
+ 11239,11240,11235,11240,11241,11242,11236,11243,11244,11245,
+
+ 11239,11246,11238,11246,11247,11248,11249,11250,11251,11252,
+ 11253,11254,11255,11256,11253,11253,11257,11257,11258,11258,
+ 11259,11256,11260,11255,11261,11259,11256,11262,11263,11263,
+ 11264,11264,11265,11265,11244,11244,11266,11266,11266,11267,
+ 11267,11268,11268,11269,11269,11270,11270, 8693,11271,11271,
+ 11272,11272,11273,11273,11274,11274,11275,11276,11276,11276,
+ 11277,11277,11278,11278,11279,11279,11280,11280,11281,11281,
+ 11282,11282,11283,11283,11284,11284,11285,11286,11287,11288,
+ 11289,11289,11290,11290,11291,11291,11292,11288,11293,11287,
+ 11294,11292,11288,11295,11296,11296,11297,11297,11298,11298,
+
+ 11299,11299,11300,11301,11301,11302, 8693,11301,11301,11300,
+ 11300,11303,11303,11304,11304,11305,11302,11306,11307,11308,
+ 11308,11309,11309,11309,11300,11310,11310,11311,11311,11311,
+ 11312,11312,11313,11313,11314,11314,11315,11315,11316,11316,
+ 11317,11317,11318,11318,11319,11319,11320,11320,11321,11322,
+ 11323,11324,11324,11325,11325,11326,11326,11327,11323,11328,
+ 11322,11329,11327,11323,11330,11331,11331,11332,11332,11333,
+ 11333,11334,11334,11335,11335,11336,11336,11337,11337,11338,
+ 11338,11339,11339,11340,11340,11341,11341,11342,11342,11343,
+ 11344,11344,11345,11345,11346,11346,11347,11347,11348,11348,
+
+ 11349,11349,11350,11350,11351,11351,11352,11352,11353,11354,
+ 11355,11356,11354,11357,11358,11359,11355,11360,11358,11354,
+ 11361,11362,11362,11363,11364,11365,11365,11366,11362,11366,
+ 11367,11368,11369,11365,11369,11370,11371,11372,11373,11372,
+ 11374,11371,11375,11373,11372,11376,11377,11377,11378,11379,
+ 11379,11380, 8693,11381,11381,11382,11380,11383,11384,11385,
+ 11378,11386,11387,11388,11389,11390,11389,11391,11388,11392,
+ 11390,11389,11393,11394,11395,11396,11394,11397,11398,11399,
+ 11395,11400,11398,11394,11401,11402,11403,11404,11405,11404,
+ 11406,11403,11407,11405,11404,11408,11409,11410,11411,11412,
+
+ 11413,11414,11415,11416,11417,11418,11419,11420,11420,11421,
+ 11421,11422,11422,11423,11417,11424,11425,11426,11419,11427,
+ 11428,11425,11425,11429,11429,11430,11430,11431,11432,11433,
+ 11434,11431,11431,11435,11435,11436,11436,11437,11434,11438,
+ 11433,11439,11437,11434,11440,11441,11441,11442,11442,11443,
+ 11443,11444,11444,11444,11445,11445,11446,11446,11447,11447,
+ 11448,11448,11449,11449,11450,11450,11451,11451,11452,11452,
+ 11453,11454,11455,11456,11457,11458,11459,11460,11457,11461,
+ 11462,11463,11459,11464,11465,11466,11466,11467,11468,11469,
+ 8693,11470,11470,11471,11469,11472,11473,11474,11467,11475,
+
+ 11476,11477,11478,11479,11480,11481,11481,11482,11482,11483,
+ 11483,11484,11478,11485,11486,11487,11480,11488,11489,11486,
+ 11486,11490,11490,11491,11491,11492,11493,11493,11494,11494,
+ 11495,11495,11496,11496,11497,11498,11498,11499,11499,11500,
+ 11500,11501,11502,11502,11503,11503,11504,11504,11505,11505,
+ 11506,11507,11507,11508,11508,11509,11509,11510,11511,11512,
+ 11513,11514,11515,11515,11516,11516,11517,11517,11518,11512,
+ 11519,11520,11521,11514,11522,11523,11520,11520,11524,11524,
+ 11525,11525,11526,11527,11528,11529,11529,11530,11530,11531,
+ 11531,11532,11528,11533,11527,11534,11532,11528,11535,11536,
+
+ 11536,11537,11537,11538,11538,11539,11539,11540,11540,11541,
+ 11541,11542,11542,11543,11543,11544,11544,11545,11545,11546,
+ 11546,11547,11547,11548,11549,11550,11551,11552,11553,11553,
+ 11554,11554,11555,11555,11556,11550,11557,11558,11559,11552,
+ 11560,11561,11558,11558,11562,11562,11563,11563,11564,11564,
+ 11565,11565,11566,11566,11567,11567,11568,11569,11569,11570,
+ 11570,11571,11571,11572,11573,11573,11574,11574,11575,11575,
+ 11576,11576,11577,11578,11578,11579,11579,11580,11580,11581,
+ 11582,11583,11584,11585,11586,11587,11588,11582,11589,11590,
+ 11591,11585,11592,11593,11594,11595,11596,11597,11598,11599,
+
+ 11600,11597,11601,11602,11603,11599,11604,11605,11606,11607,
+ 11608,11609,11608,11610,11607,11611,11609,11608,11612,11613,
+ 11614,11615,11616,11617,11614,11618,11619,11620,11616,11621,
+ 11622,11623,11624,11625,11626,11627,11628,11629,11623,11630,
+ 11631,11632,11626,11633,11634,11635,11636,11637,11638,11639,
+ 11636,11640,11641,11642,11638,11643,11644,11645,11645,11646,
+ 11647,11648,11648,11649,11647,11650,11651,11652,11653,11654,
+ 11655,11652,11652,11656,11656,11657,11657,11658,11651,11658,
+ 11659,11660,11655,11661,11654,11661,11660,11660,11660,11660,
+ 11662,11662,11663,11663,11664,11664,11665,11666,11667,11668,
+
+ 11669,11669,11670,11670,11671,11671,11672,11666,11673,11674,
+ 11675,11668,11676,11677,11674,11674,11678,11678,11679,11679,
+ 11680,11680,11681,11681,11682,11682,11683,11683,11684,11685,
+ 11685,11686,11686,11687,11687,11688,11689,11690,11691,11692,
+ 11693,11694,11695,11690,11695,11696,11697,11694,11698,11693,
+ 11698,11699,11697,11700,11701,11702,11703,11702,11704,11701,
+ 11705,11703,11702,11706,11707,11708,11709,11710,11711,11712,
+ 11709,11709,11713,11713,11714,11714,11715,11708,11715,11716,
+ 11717,11712,11718,11711,11718,11717,11717,11717,11717,11719,
+ 11719,11720,11720,11721,11721,11722,11723,11723,11724,11724,
+
+ 11725,11725,11726,11727,11727,11728,11728,11729,11730,11730,
+ 11731,11731,11732,11732,11733,11734,11734,11735,11735,11736,
+ 11737,11738,11739,11740,11741,11742,11739,11739,11743,11743,
+ 11744,11744,11745,11738,11745,11746,11747,11742,11748,11741,
+ 11748,11747,11747,11747,11749,11749,11750,11750,11751,11751,
+ 11752,11753,11754,11755,11756,11756,11757,11757,11758,11758,
+ 11759,11753,11760,11761,11762,11755,11763,11764,11761,11761,
+ 11765,11765,11766,11766,11767,11767,11768,11768,11769,11769,
+ 11770,11770,11771,11772,11772,11773,11773,11774,11774,11775,
+ 11776,11777,11778,11779,11780,11781,11778,11778,11782,11782,
+
+ 11783,11783,11784,11777,11784,11785,11786,11781,11787,11780,
+ 11787,11786,11786,11786,11788,11788,11789,11789,11790,11790,
+ 11791,11791,11792,11792,11793,11793,11794,11795,11795,11796,
+ 11796,11797,11798,11798,11799,11799,11800,11800,11801,11802,
+ 11802,11803,11803,11804,11805,11805,11806,11807,11808,11808,
+ 11809,11810,11811,11805,11811,11812,11813,11814,11808,11814,
+ 11815,11816,11817,11818,11819,11820,11821,11822,11823,11818,
+ 11823,11824,11825,11822,11826,11821,11826,11825,11827,11828,
+ 11829,11830,11831,11828,11832,11833,11834,11830,11835,11836,
+ 11837,11838,11839,11840,11841,11842,11843,11838,11843,11844,
+
+ 11845,11842,11846,11841,11846,11845,11847,11847,11848,11849,
+ 11850,11850,11851,11847,11851,11852,11853,11854,11850,11854,
+ 11855,11856,11857,11858,11859,11860,11861,11856,11861,11862,
+ 11863,11860,11864,11859,11864,11865,11866,11866,11867,11868,
+ 11869,11869,11870,11871,11871,11872,11872,11872,11872,11873,
+ 11873,11874,11874,11875,11875,11876,11876,11876,11876,11876,
+ 11870,11877,11877,11877,11878,11878,11879,11879,11880,11880,
+ 11881,11882,11883,11884,11885,11886,11883,11883,11887,11887,
+ 11888,11888,11889,11882,11889,11890,11891,11886,11892,11885,
+ 11892,11891,11891,11891,11891,11893,11893,11894,11894,11895,
+
+ 11895,11896,11896,11897,11897,11898,11898,11899,11900,11900,
+ 11901,11901,11902,11903,11903,11904,11905,11905,11906,11907,
+ 11908,11909,11909,11904,11910,11911,11912,11913,11914,11915,
+ 11916,11913,11917,11918,11919,11915,11920,11921,11922,11922,
+ 11923,11924,11924,11925,11925,11925,11925,11926,11926,11927,
+ 11927,11928,11928,11929,11929,11929,11929,11929,11923,11930,
+ 11930,11930,11931,11931,11932,11932,11933,11933,11934,11934,
+ 11935,11935,11936,11937,11937,11938,11938,11939,11939,11940,
+ 11940,11941,11942,11942,11943,11943,11944,11944,11945,11946,
+ 11946,11947,11947,11947,11948,11948,11949,11949,11950,11950,
+
+ 11951,11951,11951,11951,11945,11952,11952,11953,11953,11954,
+ 11954,11955,11955,11956,11957,11958,11959,11960,11961,11958,
+ 11958,11962,11962,11963,11963,11964,11957,11964,11965,11966,
+ 11961,11967,11960,11967,11966,11966,11966,11968,11968,11969,
+ 11969,11970,11970,11971,11971,11972,11972,11973,11973,11974,
+ 11975,11975,11976,11976,11977,11978,11978,11979,11980,11980,
+ 11981,11981,11981,11982,11982,11983,11983,11984,11984,11985,
+ 11985,11985,11985,11979,11986,11986,11987,11987,11988,11988,
+ 11989,11989,11990,11990,11991,11991,11992,11993,11993,11994,
+ 11994,11995,11995,11996,11996,11997,11998,11998,11999,11999,
+
+ 12000,12001,12002,12003,12004,12005,12006,12007,12008,12008,
+ 12009,12010,12010,12011,12012,12012,12009,12013,12014,12015,
+ 12016,12017,12018,12019,12014,12019,12020,12021,12018,12022,
+ 12017,12022,12021,12023,12023,12024,12025,12025,12026,12027,
+ 12027,12024,12028,12029,12030,12030,12031,12032,12032,12033,
+ 12031,12034,12035,12036,12037,12038,12038,12038,12038,12039,
+ 12039,12039,12040,12040,12041,12041,12042,12042,12043,12043,
+ 12043,12044,12044,12045,12045,12046,12046,12047,12047,12048,
+ 12048,12049,12050,12050,12051,12051,12051,12051,12052,12052,
+ 12053,12053,12054,12054,12055,12055,12055,12055,12055,12049,
+
+ 12056,12056,12056,12057,12057,12058,12058,12059,12059,12060,
+ 12060,12061,12061,12062,12063,12063,12064,12064,12065,12066,
+ 12067,12068,12069,12070,12071,12072,12073,12074,12075,12076,
+ 12077,12078,12079,12074,12079,12080,12081,12078,12082,12077,
+ 12082,12083,12083,12083,12083,12084,12084,12084,12085,12085,
+ 12086,12086,12087,12087,12088,12088,12088,12089,12089,12090,
+ 12090,12091,12091,12092,12092,12093,12093,12094,12094,12095,
+ 12095,12096,12096,12097,12097,12098,12098,12099,12099,12100,
+ 12100,12101,12101,12101,12102,12102,12103,12103,12104,12104,
+ 12105,12105,12106,12106,12107,12107,12108,12108,12109,12109,
+
+ 12110,12110,12111,12111,12112,12113,12113,12114,12114,12114,
+ 12115,12115,12116,12116,12117,12117,12118,12118,12118,12118,
+ 12112,12119,12119,12120,12120,12121,12121,12122,12122,12123,
+ 12123,12124,12124,12125,12126,12126,12127,12127,12128,12128,
+ 12128,12129,12129,12130,12130,12131,12131,12132,12132,12133,
+ 12133,12134,12134,12135,12135,12136,12136,12137,12137,12138,
+ 12138,12139,12139,12140,12140,12141,12141,12142,12142,12143,
+ 12143,12144,12144,12145,12145,12146,12147,12147,12148,12149,
+ 12149,12150,12151,12151,12148,12152,12153,12154,12155,12155,
+ 12155,12156,12156,12157,12157,12158,12158,12159,12159,12160,
+
+ 12160,12161,12161,12162,12162,12163,12163,12164,12165,12165,
+ 12165,12165,12166,12166,12166,12167,12167,12168,12168,12169,
+ 12169,12170,12170,12170,12171,12171,12172,12172,12173,12173,
+ 12174,12174,12175,12175,12176,12176,12177,12177,12178,12178,
+ 12179,12180,12181,12182,12183,12184,12185,12185,12186,12187,
+ 12187,12188,12186,12189,12189,12189,12190,12190,12191,12191,
+ 12192,12192,12193,12193,12194,12194,12195,12195,12196,12196,
+ 12197,12197,12198,12199,12199,12200,12200,12201,12201,12202,
+ 12202,12203,12203,12204,12204,12205,12205,12206,12206,12207,
+ 12207,12208,12208,12209,12209,12210,12210,12211,12211,12212,
+
+ 12212,12213,12213,12214,12214,12215,12215,12216,12217,12217,
+ 12217,12218,12218,12219,12219,12220,12220,12221,12221,12222,
+ 12222,12223,12223,12224,12224,12225,12225,12226,12226,12227,
+ 12227,12228,12228,12229,12229,12230,12230,12231,12231,12232,
+ 12232,12233,12233,12234,12234,12235,12235,12236,12236,12237,
+ 12237,12238,12238,12239,12239,12240,12241,12241,12242,12242,
+ 12243,12243,12244,12244,12245,12245,12246,12246,12247,12247,
+ 12248,12248,12249,12250,12250,12251,12251,12252,12252,12253,
+ 12253,12254,12255,12255,12256,12256,12257,12257,12258,12259,
+ 12259,12259,12260,12260,12261,12261,12262,12262,12263,12263,
+
+ 12264,12264,12265,12265,12266,12266,12267,12267,12268,12269,
+ 12269,12270,12270,12271,12271,12272,12272,12273,12274,12275,
+ 12275,12276,12276,12277,12277,12278,12278,12279,12280,12280,
+ 12281,12281,12282,12282,12283,12284,12284,12285,12285,12286,
+ 12286,12287,12288,12288,12289,12289,12290,12290,12291,12292,
+ 12292,12293,12293,12294,12294,12295,12295,12296,12297,12297,
+ 12298,12298,12299,12299,12300,12301,12301,12302,12302,12303,
+ 12303,12304,12304,12305,12305,12306,12306,12307,12307,12308,
+ 12308,12309,12309,12310,12311,12311,12312,12312,12313,12313,
+ 12314,12314,12315,12315,12316,12316,12317,12317,12318,12318,
+
+ 12319,12320,12320,12321,12321,12322,12322,12323,12324,12324,
+ 12325,12325,12326,12326,12327,12328,12328,12329,12329,12330,
+ 12330,12331,12332,12332,12333,12333,12334,12334,12335,12336,
+ 12336,12337,12337,12338,12339,12339,12340,12340,12341,12341,
+ 12342,12342,12343,12344,12344,12345,12345,12346,12346,12347,
+ 12348,12348,12349,12349,12350,12350,12351,12352,12352,12353,
+ 12353,12354,12354,12355,12356,12356,12357,12357,12358,12359,
+ 12359,12360,12361,12362,12362,12363,12364,12365,12365,12366,
+ 12366,12367,12367,12368,12369,12369,12370,12370,12371,12372,
+ 12372,12373,12373,12374,12374,12375,12375,12376,12377,12377,
+
+ 12378,12378,12379,12379,12380,12381,12381,12382,12382,12383,
+ 12383,12384,12385,12385,12386,12386,12387,12387,12388,12389,
+ 12389,12390,12390,12391,12392,12392,12393,12394,12395,12395,
+ 12396,12397,12398,12398,12399,12399,12400,12401,12401,12402,
+ 12402,12403,12403,12404,12404,12405,12405,12406,12407,12407,
+ 12408,12408,12409,12410,12410,12411,12412,12413,12413,12414,
+ 12414,12415,12416,12416,12417,12417,12418,12419,12420,12420,
+ 12421,12421,12422,12423,12423,12424,12424,12425,12425,12426,
+ 12426,12427,12427,12428,12429,12429,12430,12430,12431,12432,
+ 12432,12433,12434,12435,12435,12436,12436,12437,12438,12438,
+
+ 12439,12439,12440,12441,12442,12442,12443,12443,12444,12444,
+ 12445,12445,12446,12446,12447,12447,12448,12449,12449,12450,
+ 12450,12451,12452,12452,12453,12453,12454,12454,12455,12455,
+ 12456,12456,12457,12457,12458,12458,12459,12459,12460,12460,
+ 12461,12461,12462,12463,12463,12464,12464,12465,12435,12435,
+ 12436,12436,12438,12438,12439,12439,12442,12442,12443,12443,
+ 12444,12444,12445,12445,12446,12446,12447,12447,12449,12449,
+ 12450,12450,12452,12452,12453,12453,12454,12454,12455,12455,
+ 12456,12456,12457,12457,12458,12458,12459,12459,12460,12460,
+ 12461,12461,12463,12463,12464,12464,12435,12435,12436,12436,
+
+ 12438,12438,12439,12439,12442,12442,12443,12443,12444,12444,
+ 12445,12446,12446,12447,12447,12449,12449,12450,12450,12452,
+ 12452,12453,12453,12454,12454,12455,12456,12456,12457,12457,
+ 12458,12458,12459,12460,12460,12461,12461,12463,12463,12464,
+ 12464,12435,12435,12436,12436,12438,12438,12439,12442,12442,
+ 12443,12444,12446,12446,12447,12447,12449,12449,12450,12452,
+ 12452,12453,12454,12456,12456,12457,12458,12460,12460,12461,
+ 12461,12463,12463,12464,12435,12435,12436,12438,12442,12446,
+ 12446,12447,12449,12452,12456,12460,12460,12461,12463,12435,
+ 12446,12460, 0, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693
+ } ;
+
+static yyconst flex_int16_t yy_nxt[85361] =
+ { 0,
+ 8693, 533, 61, 62, 63, 369, 63, 66, 67, 68,
+ 534, 68, 374, 61, 123, 63, 394, 63, 368, 375,
+ 368, 377, 369, 395, 404, 369, 7528, 61, 62, 63,
+ 984, 63, 66, 67, 68, 407, 68, 366, 123, 366,
+ 64, 405, 408, 406, 985, 69, 60, 70, 61, 62,
+ 63, 64, 63, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 136, 64, 93, 137, 93, 93,
+ 69, 149, 93, 367, 384, 391, 392, 61, 123, 63,
+ 7380, 63, 552, 369, 393, 153, 64, 136, 369, 93,
+ 137, 93, 93, 7252, 149, 93, 65, 384, 204, 205,
+
+ 206, 207, 369, 207, 208, 209, 154, 210, 496, 60,
+ 65, 72, 66, 67, 68, 64, 68, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 385, 150,
+ 154, 106, 496, 7528, 398, 399, 389, 211, 550, 369,
+ 61, 222, 223, 400, 223, 224, 407, 551, 151, 225,
+ 69, 385, 7528, 408, 61, 293, 294, 107, 294, 389,
+ 152, 213, 214, 215, 216, 7098, 216, 217, 218, 369,
+ 219, 414, 151, 65, 74, 61, 62, 63, 226, 63,
+ 107, 295, 500, 152, 66, 228, 229, 7047, 229, 230,
+ 575, 576, 296, 231, 414, 407, 75, 314, 315, 316,
+
+ 220, 316, 408, 390, 295, 500, 369, 76, 319, 320,
+ 321, 369, 321, 64, 61, 324, 325, 537, 325, 439,
+ 75, 440, 232, 66, 328, 329, 390, 329, 413, 7021,
+ 76, 77, 66, 67, 68, 317, 68, 61, 62, 63,
+ 537, 63, 511, 348, 349, 350, 322, 350, 498, 512,
+ 369, 413, 326, 78, 1256, 353, 354, 355, 369, 355,
+ 517, 330, 369, 368, 79, 440, 1251, 518, 603, 553,
+ 69, 498, 61, 358, 359, 64, 359, 78, 66, 362,
+ 363, 351, 363, 369, 381, 369, 369, 79, 60, 80,
+ 81, 62, 63, 356, 63, 83, 84, 60, 85, 60,
+
+ 60, 60, 60, 60, 60, 60, 382, 61, 62, 63,
+ 360, 63, 488, 492, 540, 445, 364, 383, 468, 369,
+ 491, 371, 571, 371, 445, 7380, 588, 407, 64, 572,
+ 382, 589, 590, 369, 408, 488, 492, 540, 4468, 445,
+ 383, 4469, 468, 491, 624, 64, 369, 445, 386, 369,
+ 410, 60, 65, 86, 87, 67, 68, 372, 68, 89,
+ 90, 65, 91, 65, 65, 65, 65, 65, 65, 65,
+ 387, 407, 407, 410, 541, 445, 407, 494, 408, 408,
+ 495, 388, 542, 408, 445, 422, 1256, 461, 421, 423,
+ 369, 543, 69, 369, 387, 591, 369, 541, 1251, 445,
+
+ 494, 685, 594, 495, 388, 542, 368, 445, 368, 422,
+ 461, 595, 421, 423, 543, 65, 60, 60, 61, 92,
+ 63, 93, 63, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 94, 93, 93, 95, 96, 93,
+ 93, 93, 97, 93, 93, 93, 98, 99, 100, 101,
+ 102, 103, 104, 93, 93, 93, 64, 93, 94, 93,
+ 93, 95, 96, 93, 93, 93, 97, 93, 93, 98,
+ 99, 100, 101, 102, 103, 104, 93, 93, 93, 60,
+ 65, 105, 66, 106, 68, 107, 68, 65, 65, 65,
+ 65, 65, 108, 65, 65, 65, 65, 65, 109, 107,
+
+ 110, 111, 112, 113, 107, 107, 114, 107, 115, 107,
+ 116, 117, 118, 119, 120, 121, 122, 107, 107, 107,
+ 69, 107, 109, 107, 110, 111, 112, 113, 107, 107,
+ 114, 115, 107, 116, 117, 118, 119, 120, 121, 122,
+ 107, 107, 107, 65, 124, 66, 125, 68, 366, 68,
+ 366, 407, 607, 407, 407, 108, 601, 369, 408, 608,
+ 408, 408, 369, 126, 127, 128, 129, 4468, 411, 130,
+ 4469, 131, 412, 548, 530, 132, 133, 134, 135, 407,
+ 415, 369, 424, 69, 367, 368, 408, 126, 127, 128,
+ 129, 493, 411, 130, 131, 531, 412, 548, 132, 133,
+
+ 134, 135, 138, 415, 125, 424, 416, 446, 369, 369,
+ 623, 369, 7380, 65, 493, 497, 445, 445, 427, 531,
+ 549, 139, 439, 140, 368, 456, 445, 457, 447, 416,
+ 141, 1150, 473, 142, 143, 458, 144, 1151, 497, 369,
+ 445, 445, 598, 369, 549, 139, 369, 140, 456, 445,
+ 457, 599, 447, 141, 686, 473, 142, 143, 458, 144,
+ 60, 60, 61, 62, 63, 369, 63, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 445, 445,
+ 445, 6998, 557, 445, 450, 445, 369, 451, 445, 445,
+ 452, 460, 445, 558, 445, 462, 459, 369, 463, 368,
+
+ 64, 368, 445, 445, 445, 557, 600, 445, 450, 445,
+ 451, 445, 445, 452, 460, 445, 558, 445, 462, 459,
+ 369, 463, 6926, 60, 65, 65, 66, 67, 68, 369,
+ 68, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 469, 445, 445, 369, 489, 369, 490, 471,
+ 445, 369, 445, 456, 523, 506, 600, 524, 559, 445,
+ 470, 565, 624, 458, 69, 654, 469, 445, 445, 489,
+ 472, 490, 655, 471, 445, 445, 456, 523, 506, 369,
+ 524, 559, 445, 470, 369, 565, 458, 65, 60, 60,
+ 61, 62, 63, 472, 63, 60, 60, 60, 60, 60,
+
+ 60, 60, 60, 60, 60, 60, 445, 485, 407, 560,
+ 486, 445, 654, 487, 741, 408, 742, 450, 445, 655,
+ 451, 509, 7252, 505, 369, 671, 7252, 445, 64, 722,
+ 445, 485, 560, 486, 499, 445, 487, 368, 723, 368,
+ 6860, 450, 445, 451, 6803, 509, 505, 369, 369, 671,
+ 445, 60, 65, 65, 66, 67, 68, 499, 68, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 445, 445, 567, 489, 554, 532, 703, 450, 568, 445,
+ 451, 569, 507, 527, 538, 684, 369, 570, 539, 692,
+ 6775, 683, 69, 724, 445, 445, 489, 554, 532, 703,
+
+ 725, 450, 445, 451, 710, 507, 527, 7098, 538, 711,
+ 7098, 712, 539, 692, 683, 65, 155, 156, 61, 157,
+ 158, 155, 158, 155, 155, 155, 159, 155, 155, 160,
+ 155, 155, 155, 155, 161, 155, 155, 162, 163, 155,
+ 155, 155, 164, 155, 155, 155, 165, 166, 167, 155,
+ 168, 169, 155, 155, 155, 155, 170, 155, 161, 155,
+ 155, 162, 163, 155, 155, 155, 164, 155, 155, 165,
+ 166, 167, 155, 168, 169, 155, 155, 155, 155, 155,
+ 171, 172, 66, 173, 174, 171, 174, 171, 171, 171,
+ 175, 171, 171, 176, 171, 171, 171, 171, 177, 171,
+
+ 171, 178, 179, 171, 171, 171, 180, 171, 171, 171,
+ 181, 182, 183, 171, 184, 185, 171, 171, 171, 171,
+ 186, 171, 177, 171, 171, 178, 179, 171, 171, 171,
+ 180, 171, 171, 181, 182, 183, 171, 184, 185, 171,
+ 171, 171, 171, 171, 60, 187, 188, 189, 63, 369,
+ 63, 191, 60, 60, 192, 60, 60, 60, 193, 60,
+ 194, 60, 471, 445, 544, 366, 369, 366, 371, 555,
+ 371, 734, 445, 556, 693, 1282, 369, 545, 735, 546,
+ 683, 1283, 547, 510, 64, 369, 471, 445, 544, 368,
+ 369, 440, 371, 555, 371, 445, 685, 556, 693, 369,
+
+ 545, 367, 546, 683, 372, 547, 510, 60, 65, 195,
+ 196, 197, 68, 369, 68, 199, 65, 65, 200, 65,
+ 65, 65, 201, 65, 202, 65, 580, 369, 372, 561,
+ 445, 604, 581, 648, 759, 582, 498, 617, 369, 445,
+ 605, 583, 562, 606, 563, 6705, 618, 564, 69, 619,
+ 740, 650, 740, 561, 445, 728, 369, 648, 759, 498,
+ 651, 369, 445, 652, 729, 562, 653, 563, 733, 369,
+ 564, 65, 60, 233, 61, 62, 63, 234, 63, 60,
+ 60, 60, 235, 60, 60, 236, 60, 60, 60, 60,
+ 237, 238, 234, 234, 239, 234, 234, 234, 234, 234,
+
+ 234, 234, 234, 234, 240, 234, 234, 234, 234, 234,
+ 234, 234, 64, 234, 237, 238, 234, 234, 239, 234,
+ 234, 234, 234, 234, 234, 234, 234, 240, 234, 234,
+ 234, 234, 234, 234, 234, 60, 65, 241, 66, 67,
+ 68, 242, 68, 65, 65, 65, 243, 65, 65, 244,
+ 65, 65, 65, 65, 245, 246, 242, 242, 247, 242,
+ 242, 242, 242, 242, 242, 242, 242, 242, 248, 242,
+ 242, 242, 242, 242, 242, 242, 69, 242, 245, 246,
+ 242, 242, 247, 242, 242, 242, 242, 242, 242, 242,
+ 242, 248, 242, 242, 242, 242, 242, 242, 242, 65,
+
+ 249, 366, 369, 366, 366, 683, 366, 694, 607, 607,
+ 369, 65, 371, 7047, 371, 608, 608, 250, 566, 251,
+ 252, 253, 107, 612, 741, 254, 742, 255, 683, 613,
+ 694, 256, 257, 258, 259, 107, 750, 367, 750, 7047,
+ 367, 250, 566, 251, 252, 253, 107, 612, 372, 254,
+ 255, 377, 369, 613, 256, 257, 258, 259, 107, 60,
+ 260, 261, 123, 63, 262, 63, 60, 60, 60, 263,
+ 60, 60, 264, 60, 60, 265, 60, 266, 262, 262,
+ 267, 268, 262, 262, 262, 269, 262, 262, 262, 270,
+ 271, 272, 262, 273, 274, 262, 262, 262, 262, 64,
+
+ 262, 266, 262, 262, 267, 268, 262, 262, 262, 269,
+ 262, 262, 270, 271, 272, 262, 273, 274, 262, 262,
+ 262, 262, 60, 65, 275, 276, 125, 68, 277, 68,
+ 65, 65, 65, 278, 65, 65, 279, 65, 65, 280,
+ 65, 281, 277, 277, 282, 283, 284, 285, 277, 286,
+ 277, 277, 277, 287, 288, 289, 277, 290, 291, 277,
+ 277, 277, 277, 69, 277, 281, 277, 277, 282, 283,
+ 284, 285, 277, 286, 277, 277, 287, 288, 289, 277,
+ 290, 291, 277, 277, 277, 277, 65, 297, 298, 66,
+ 299, 300, 297, 300, 297, 297, 297, 297, 297, 297,
+
+ 297, 297, 297, 297, 297, 297, 297, 301, 302, 303,
+ 304, 297, 297, 305, 297, 306, 307, 297, 297, 308,
+ 309, 310, 311, 297, 297, 297, 297, 312, 297, 297,
+ 297, 301, 302, 303, 304, 297, 297, 305, 306, 307,
+ 297, 297, 308, 309, 310, 311, 297, 297, 297, 297,
+ 297, 60, 60, 331, 62, 63, 622, 63, 60, 60,
+ 60, 333, 60, 60, 60, 60, 60, 60, 60, 622,
+ 445, 622, 469, 445, 6676, 627, 626, 607, 384, 445,
+ 622, 643, 445, 374, 608, 628, 369, 6676, 629, 458,
+ 375, 64, 374, 622, 445, 622, 469, 445, 627, 375,
+
+ 626, 384, 445, 369, 643, 445, 607, 741, 628, 742,
+ 614, 629, 458, 608, 60, 65, 65, 334, 67, 68,
+ 491, 68, 65, 65, 65, 336, 65, 65, 65, 65,
+ 65, 65, 65, 614, 615, 445, 7021, 616, 654, 445,
+ 445, 639, 1133, 491, 640, 655, 7021, 641, 445, 445,
+ 644, 654, 645, 709, 6998, 69, 1382, 615, 655, 445,
+ 616, 660, 1383, 445, 445, 639, 368, 640, 368, 654,
+ 641, 445, 445, 644, 6998, 645, 655, 665, 65, 60,
+ 337, 331, 62, 63, 660, 63, 60, 60, 60, 339,
+ 60, 60, 60, 60, 60, 60, 60, 471, 445, 654,
+
+ 665, 683, 663, 690, 688, 6612, 655, 445, 689, 394,
+ 683, 691, 672, 654, 683, 6612, 395, 695, 649, 64,
+ 655, 471, 445, 1256, 683, 663, 690, 369, 688, 371,
+ 445, 371, 689, 683, 691, 1251, 672, 683, 664, 369,
+ 695, 649, 60, 65, 340, 334, 67, 68, 369, 68,
+ 65, 65, 65, 342, 65, 65, 65, 65, 65, 65,
+ 65, 664, 654, 683, 701, 372, 6926, 696, 369, 655,
+ 702, 394, 369, 497, 683, 385, 758, 488, 395, 1584,
+ 683, 704, 6926, 69, 654, 368, 683, 368, 701, 666,
+ 696, 655, 368, 369, 702, 5013, 497, 683, 385, 758,
+
+ 488, 661, 705, 683, 369, 662, 65, 60, 60, 343,
+ 62, 63, 666, 63, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 661, 705, 485, 369, 662,
+ 486, 369, 6860, 487, 404, 369, 391, 392, 802, 369,
+ 369, 746, 800, 746, 754, 393, 754, 64, 398, 399,
+ 6860, 485, 1256, 486, 404, 369, 487, 400, 366, 708,
+ 366, 366, 802, 366, 1251, 800, 489, 492, 706, 369,
+ 60, 65, 65, 345, 67, 68, 369, 68, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 489,
+ 492, 706, 369, 501, 367, 369, 525, 367, 493, 369,
+
+ 552, 369, 552, 369, 368, 707, 709, 368, 371, 761,
+ 371, 69, 502, 369, 503, 526, 5975, 503, 714, 496,
+ 369, 493, 371, 744, 371, 744, 494, 504, 707, 495,
+ 504, 369, 6803, 761, 65, 65, 502, 67, 503, 526,
+ 752, 503, 752, 496, 372, 6803, 65, 389, 715, 494,
+ 504, 801, 495, 504, 65, 65, 65, 65, 372, 745,
+ 65, 369, 65, 803, 6775, 390, 65, 65, 65, 65,
+ 389, 715, 6775, 369, 801, 748, 753, 748, 65, 65,
+ 65, 65, 720, 369, 65, 65, 369, 803, 390, 65,
+ 65, 65, 65, 368, 368, 369, 368, 368, 378, 368,
+
+ 368, 368, 368, 368, 368, 379, 368, 368, 368, 368,
+ 368, 749, 721, 369, 760, 756, 407, 756, 407, 780,
+ 441, 369, 793, 408, 797, 408, 443, 807, 806, 798,
+ 799, 511, 511, 368, 517, 721, 533, 760, 512, 512,
+ 517, 518, 369, 780, 5013, 534, 793, 518, 575, 576,
+ 807, 757, 806, 381, 386, 369, 368, 368, 368, 369,
+ 368, 368, 401, 368, 368, 368, 368, 368, 368, 402,
+ 368, 368, 368, 368, 368, 382, 387, 407, 407, 575,
+ 895, 407, 407, 407, 408, 408, 383, 388, 408, 408,
+ 408, 407, 897, 898, 808, 763, 407, 368, 408, 382,
+
+ 387, 762, 772, 408, 407, 407, 764, 407, 407, 383,
+ 388, 408, 408, 765, 408, 408, 767, 808, 768, 763,
+ 368, 407, 778, 407, 762, 775, 772, 811, 408, 764,
+ 408, 812, 770, 771, 417, 809, 765, 766, 769, 767,
+ 780, 768, 804, 805, 773, 810, 778, 418, 775, 419,
+ 811, 789, 420, 6705, 812, 770, 771, 6705, 417, 809,
+ 766, 769, 550, 369, 780, 804, 805, 1150, 773, 810,
+ 418, 551, 419, 1151, 789, 420, 368, 425, 369, 368,
+ 368, 426, 368, 368, 368, 368, 368, 368, 427, 368,
+ 368, 368, 368, 368, 428, 426, 429, 430, 431, 432,
+
+ 426, 426, 433, 426, 434, 426, 426, 426, 435, 436,
+ 437, 438, 426, 426, 426, 426, 368, 426, 428, 426,
+ 429, 430, 431, 432, 426, 426, 433, 434, 426, 426,
+ 426, 435, 436, 437, 438, 426, 426, 426, 426, 368,
+ 368, 441, 369, 368, 368, 442, 368, 443, 368, 368,
+ 368, 368, 444, 368, 368, 368, 368, 368, 407, 780,
+ 814, 780, 571, 813, 817, 408, 780, 407, 815, 572,
+ 816, 785, 774, 820, 408, 786, 6285, 787, 788, 6676,
+ 368, 446, 369, 780, 814, 780, 813, 817, 571, 369,
+ 780, 815, 427, 816, 785, 572, 774, 820, 786, 776,
+
+ 787, 788, 447, 368, 368, 441, 369, 368, 368, 442,
+ 368, 443, 368, 368, 368, 368, 444, 368, 368, 368,
+ 368, 368, 776, 448, 780, 780, 447, 780, 407, 780,
+ 780, 594, 449, 782, 6612, 408, 783, 790, 791, 784,
+ 595, 792, 446, 369, 368, 5975, 794, 448, 780, 780,
+ 795, 780, 829, 780, 780, 449, 777, 782, 369, 783,
+ 790, 791, 784, 447, 792, 818, 819, 368, 445, 794,
+ 823, 453, 832, 795, 828, 454, 829, 445, 821, 777,
+ 455, 369, 369, 822, 824, 830, 490, 447, 818, 819,
+ 831, 369, 445, 369, 823, 453, 832, 828, 5910, 454,
+
+ 445, 369, 821, 455, 464, 445, 822, 824, 830, 490,
+ 825, 369, 826, 831, 445, 491, 497, 465, 369, 466,
+ 488, 492, 467, 369, 485, 6285, 827, 486, 464, 445,
+ 487, 496, 369, 369, 825, 369, 826, 445, 491, 497,
+ 465, 369, 466, 488, 492, 467, 474, 369, 485, 827,
+ 486, 840, 493, 487, 369, 496, 369, 427, 489, 369,
+ 490, 369, 369, 369, 842, 475, 476, 477, 478, 607,
+ 498, 479, 369, 480, 840, 493, 608, 481, 482, 483,
+ 484, 489, 837, 490, 839, 494, 835, 842, 495, 475,
+ 476, 477, 478, 498, 369, 479, 480, 836, 857, 369,
+
+ 481, 482, 483, 484, 464, 445, 837, 839, 494, 835,
+ 833, 495, 804, 853, 445, 834, 607, 465, 865, 508,
+ 836, 857, 467, 608, 369, 588, 591, 369, 464, 445,
+ 589, 590, 5659, 369, 833, 804, 853, 445, 369, 834,
+ 465, 865, 508, 838, 369, 467, 368, 368, 369, 368,
+ 368, 514, 368, 368, 368, 368, 368, 368, 515, 368,
+ 368, 368, 368, 368, 843, 369, 841, 838, 847, 780,
+ 854, 5625, 855, 825, 821, 826, 866, 654, 786, 856,
+ 851, 844, 5625, 845, 655, 867, 368, 843, 407, 369,
+ 841, 847, 5007, 780, 854, 408, 855, 825, 821, 826,
+
+ 866, 786, 856, 851, 848, 844, 846, 845, 867, 368,
+ 368, 368, 369, 368, 368, 520, 368, 368, 368, 368,
+ 368, 368, 521, 368, 368, 368, 368, 368, 848, 654,
+ 846, 407, 863, 369, 501, 780, 655, 875, 408, 876,
+ 780, 782, 877, 369, 783, 368, 824, 850, 575, 895,
+ 368, 407, 773, 502, 369, 503, 863, 849, 408, 780,
+ 852, 875, 864, 876, 780, 782, 877, 783, 504, 824,
+ 850, 407, 858, 368, 464, 445, 773, 502, 408, 503,
+ 849, 804, 861, 852, 445, 859, 864, 465, 567, 528,
+ 530, 504, 529, 369, 568, 710, 858, 569, 464, 445,
+
+ 711, 368, 712, 570, 804, 861, 369, 445, 5013, 859,
+ 465, 531, 528, 868, 881, 529, 368, 368, 369, 368,
+ 368, 584, 368, 368, 368, 368, 368, 368, 585, 368,
+ 368, 368, 368, 368, 780, 531, 868, 862, 881, 869,
+ 782, 5449, 822, 783, 872, 870, 860, 871, 878, 369,
+ 873, 874, 369, 879, 588, 5975, 368, 1282, 780, 589,
+ 899, 862, 869, 1283, 782, 822, 783, 872, 870, 860,
+ 871, 878, 369, 873, 874, 489, 879, 532, 880, 368,
+ 368, 368, 369, 368, 368, 620, 368, 368, 368, 368,
+ 368, 368, 621, 368, 368, 368, 368, 368, 489, 882,
+
+ 532, 880, 591, 369, 580, 369, 369, 5354, 369, 369,
+ 581, 901, 914, 582, 598, 369, 902, 903, 5910, 583,
+ 368, 604, 882, 599, 601, 369, 601, 369, 623, 369,
+ 605, 623, 369, 606, 910, 369, 914, 5910, 369, 883,
+ 369, 884, 887, 368, 368, 368, 369, 368, 368, 620,
+ 368, 368, 368, 368, 368, 368, 621, 368, 368, 368,
+ 368, 368, 883, 625, 884, 887, 885, 525, 886, 369,
+ 607, 888, 889, 369, 369, 369, 915, 608, 368, 911,
+ 369, 912, 926, 607, 368, 5208, 526, 625, 503, 885,
+ 608, 886, 892, 890, 888, 889, 927, 891, 607, 905,
+
+ 915, 504, 911, 913, 912, 608, 926, 368, 630, 893,
+ 526, 894, 503, 907, 930, 5135, 892, 890, 5059, 368,
+ 927, 891, 905, 906, 504, 426, 913, 631, 632, 633,
+ 426, 931, 893, 634, 894, 635, 907, 930, 607, 636,
+ 637, 426, 638, 684, 369, 608, 906, 684, 369, 426,
+ 5046, 631, 632, 633, 426, 931, 780, 634, 635, 908,
+ 933, 780, 636, 637, 426, 638, 445, 607, 919, 453,
+ 617, 369, 920, 454, 608, 445, 780, 650, 642, 618,
+ 780, 909, 619, 908, 933, 780, 651, 722, 922, 652,
+ 445, 919, 653, 453, 5659, 920, 723, 454, 445, 780,
+
+ 780, 642, 464, 445, 780, 909, 780, 780, 780, 924,
+ 916, 922, 445, 917, 932, 465, 918, 646, 921, 925,
+ 647, 5659, 923, 780, 928, 929, 464, 445, 780, 823,
+ 780, 780, 780, 924, 916, 445, 917, 932, 465, 918,
+ 646, 921, 925, 647, 654, 923, 936, 928, 929, 821,
+ 935, 655, 369, 823, 934, 654, 654, 667, 654, 654,
+ 5020, 654, 655, 655, 654, 655, 655, 686, 655, 936,
+ 668, 655, 669, 821, 935, 670, 654, 934, 939, 940,
+ 654, 667, 941, 655, 960, 654, 942, 655, 369, 943,
+ 654, 5625, 655, 668, 951, 669, 952, 655, 670, 673,
+
+ 369, 939, 369, 940, 5007, 941, 946, 960, 674, 942,
+ 962, 675, 943, 953, 676, 944, 954, 945, 951, 952,
+ 677, 678, 679, 958, 369, 724, 955, 654, 654, 946,
+ 680, 369, 725, 962, 655, 655, 953, 4888, 944, 954,
+ 945, 733, 369, 369, 677, 678, 679, 4863, 949, 950,
+ 955, 956, 961, 680, 368, 368, 369, 368, 368, 681,
+ 368, 368, 368, 368, 368, 368, 682, 368, 368, 368,
+ 368, 368, 949, 950, 957, 956, 961, 369, 368, 963,
+ 5449, 964, 368, 368, 965, 654, 966, 967, 970, 977,
+ 1342, 973, 655, 710, 368, 724, 368, 957, 711, 5449,
+
+ 712, 734, 725, 963, 964, 733, 369, 965, 735, 966,
+ 967, 970, 977, 947, 948, 973, 976, 368, 368, 368,
+ 369, 368, 368, 681, 368, 368, 368, 368, 368, 368,
+ 682, 368, 368, 368, 368, 368, 947, 948, 368, 968,
+ 976, 969, 971, 972, 974, 369, 687, 978, 369, 975,
+ 979, 4829, 982, 4736, 714, 369, 704, 369, 368, 369,
+ 369, 986, 968, 987, 969, 971, 972, 368, 974, 687,
+ 978, 489, 975, 706, 979, 982, 983, 705, 980, 981,
+ 734, 368, 697, 4688, 715, 986, 987, 735, 989, 720,
+ 369, 780, 683, 1013, 489, 698, 706, 699, 1111, 983,
+
+ 700, 705, 980, 981, 728, 369, 697, 715, 1027, 1028,
+ 407, 989, 4664, 729, 780, 683, 1013, 408, 698, 721,
+ 699, 1111, 5208, 700, 368, 368, 369, 368, 368, 716,
+ 368, 368, 368, 368, 717, 368, 718, 368, 368, 368,
+ 368, 368, 721, 369, 407, 407, 996, 780, 1017, 1007,
+ 1112, 408, 408, 407, 1011, 1012, 445, 997, 407, 780,
+ 408, 988, 991, 797, 368, 408, 1053, 1030, 798, 1025,
+ 780, 1017, 1031, 1032, 1112, 897, 1143, 1011, 1012, 445,
+ 5208, 997, 780, 4626, 990, 988, 991, 368, 368, 368,
+ 369, 368, 368, 730, 368, 368, 368, 368, 368, 368,
+
+ 731, 368, 368, 368, 368, 368, 407, 990, 407, 407,
+ 1016, 1018, 1113, 408, 780, 408, 408, 1019, 1114, 407,
+ 780, 780, 999, 992, 4042, 993, 408, 407, 368, 1147,
+ 895, 897, 1143, 1016, 408, 1018, 1113, 780, 407, 4043,
+ 1019, 5135, 1114, 780, 780, 408, 999, 992, 998, 993,
+ 1004, 368, 368, 368, 369, 368, 368, 737, 368, 368,
+ 368, 368, 368, 368, 738, 368, 368, 368, 368, 368,
+ 1002, 5135, 998, 1004, 1014, 4563, 1020, 780, 1024, 2220,
+ 780, 445, 407, 1035, 445, 1037, 780, 407, 2220, 408,
+ 407, 2220, 368, 1002, 408, 407, 4563, 408, 1014, 1020,
+
+ 780, 1024, 408, 780, 445, 4550, 1035, 445, 1037, 780,
+ 4538, 1000, 1001, 1003, 1006, 368, 368, 368, 369, 368,
+ 368, 378, 368, 368, 368, 368, 368, 368, 379, 368,
+ 368, 368, 368, 368, 1000, 1001, 1003, 407, 1006, 1015,
+ 1039, 5059, 445, 445, 408, 1036, 5059, 1038, 1042, 445,
+ 445, 1121, 780, 1009, 1005, 901, 368, 910, 369, 5046,
+ 902, 1148, 5046, 1015, 1039, 445, 445, 5020, 1036, 780,
+ 1038, 1042, 445, 445, 1121, 780, 5020, 1009, 1005, 368,
+ 368, 368, 369, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 780, 368, 368, 368, 368, 368, 1010, 1021,
+
+ 1040, 1022, 1023, 1048, 1041, 1052, 1054, 1049, 369, 445,
+ 445, 445, 445, 1067, 780, 780, 445, 780, 445, 445,
+ 368, 5007, 1010, 1021, 1040, 1022, 1023, 1048, 1041, 1052,
+ 1054, 1049, 445, 445, 445, 445, 1067, 780, 780, 445,
+ 780, 445, 445, 368, 368, 368, 369, 368, 368, 378,
+ 368, 368, 368, 368, 368, 368, 379, 368, 368, 368,
+ 368, 368, 1050, 1055, 1056, 369, 445, 445, 445, 1057,
+ 445, 445, 1064, 1051, 1058, 445, 1059, 445, 1092, 1122,
+ 780, 958, 369, 4439, 368, 4439, 1050, 1055, 1056, 445,
+ 445, 445, 1057, 445, 445, 1064, 1051, 1058, 445, 1059,
+
+ 445, 1092, 1122, 780, 1043, 1044, 1045, 368, 368, 368,
+ 369, 368, 368, 401, 368, 368, 368, 368, 368, 368,
+ 402, 368, 368, 368, 368, 368, 1046, 1060, 369, 1061,
+ 1062, 4414, 445, 1063, 445, 445, 445, 1047, 445, 445,
+ 1065, 1027, 1028, 1277, 1278, 4388, 1079, 1664, 368, 4888,
+ 1046, 1060, 1061, 1665, 1062, 445, 1063, 445, 445, 445,
+ 1047, 445, 445, 1065, 1070, 369, 369, 369, 369, 369,
+ 1079, 368, 368, 368, 369, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 1066, 368, 368, 368, 368, 368,
+ 1068, 1069, 369, 445, 445, 1075, 1071, 445, 1072, 1073,
+
+ 445, 1085, 445, 369, 1118, 1420, 1093, 369, 1066, 1074,
+ 369, 1421, 368, 4888, 1068, 1069, 445, 445, 1075, 1071,
+ 445, 1072, 1073, 445, 1085, 445, 1277, 1280, 1118, 1093,
+ 1080, 1081, 369, 1074, 1086, 368, 368, 368, 369, 368,
+ 368, 401, 368, 368, 368, 368, 368, 368, 402, 368,
+ 368, 368, 368, 368, 1080, 1081, 369, 1086, 1084, 1011,
+ 1090, 445, 1101, 1256, 780, 445, 1099, 1011, 1104, 1105,
+ 1107, 445, 780, 445, 1082, 1251, 368, 1342, 369, 1070,
+ 369, 1084, 1011, 1090, 445, 443, 1101, 780, 445, 1099,
+ 1011, 1104, 1105, 1107, 445, 780, 445, 4863, 1082, 368,
+
+ 368, 425, 369, 368, 368, 426, 368, 368, 368, 368,
+ 368, 368, 427, 368, 368, 368, 368, 368, 428, 426,
+ 429, 430, 431, 432, 426, 426, 433, 426, 434, 426,
+ 426, 426, 435, 436, 437, 438, 426, 426, 426, 426,
+ 368, 426, 428, 426, 429, 430, 431, 432, 426, 426,
+ 433, 434, 426, 426, 426, 435, 436, 437, 438, 426,
+ 426, 426, 426, 368, 368, 441, 369, 368, 368, 426,
+ 368, 443, 368, 368, 368, 368, 779, 368, 368, 368,
+ 368, 368, 1091, 1060, 1467, 445, 1115, 1100, 1119, 1120,
+ 1468, 1106, 1123, 1124, 445, 780, 1153, 1116, 4863, 1350,
+
+ 369, 1154, 899, 1986, 368, 1351, 1091, 1060, 445, 1987,
+ 1115, 1100, 1119, 1120, 1106, 1123, 1124, 445, 780, 4829,
+ 1116, 1094, 1095, 1096, 1076, 1044, 1045, 368, 368, 441,
+ 369, 368, 368, 426, 368, 443, 368, 368, 368, 368,
+ 779, 368, 368, 368, 368, 368, 1077, 781, 654, 1097,
+ 1229, 445, 1098, 1125, 1126, 655, 445, 1078, 407, 4829,
+ 1179, 1147, 895, 1399, 369, 408, 369, 369, 368, 1400,
+ 1077, 781, 1097, 1229, 445, 1098, 4303, 1125, 1126, 445,
+ 1078, 407, 369, 1179, 369, 369, 1083, 1087, 408, 1088,
+ 369, 368, 368, 441, 369, 368, 368, 442, 368, 443,
+
+ 368, 368, 368, 368, 444, 368, 368, 368, 368, 368,
+ 1083, 1087, 1088, 1102, 1127, 4275, 1137, 1139, 1138, 622,
+ 1162, 1030, 407, 1233, 1406, 1407, 1031, 1279, 1210, 408,
+ 1256, 407, 368, 369, 1147, 895, 1102, 1127, 408, 1137,
+ 1139, 1138, 1251, 622, 1162, 1103, 1233, 1108, 1095, 1096,
+ 1089, 369, 1210, 1128, 369, 368, 368, 441, 369, 368,
+ 368, 368, 368, 443, 368, 368, 368, 368, 1103, 368,
+ 368, 368, 368, 368, 1089, 1109, 369, 1128, 1110, 1205,
+ 1140, 622, 1213, 4736, 1167, 1168, 780, 1171, 1164, 780,
+ 445, 1178, 1134, 4736, 1215, 369, 368, 369, 1109, 1409,
+
+ 1410, 1110, 1205, 1140, 4243, 622, 1213, 1167, 1168, 780,
+ 1171, 1164, 780, 445, 1178, 1129, 1134, 1130, 1215, 368,
+ 368, 441, 369, 368, 368, 442, 368, 443, 368, 368,
+ 368, 368, 444, 368, 368, 368, 368, 368, 407, 1129,
+ 369, 1130, 369, 369, 369, 408, 607, 369, 369, 1235,
+ 1420, 607, 369, 608, 607, 994, 1421, 780, 608, 1169,
+ 368, 608, 1131, 1136, 1135, 4688, 995, 1156, 1141, 1187,
+ 607, 1206, 1235, 1132, 1142, 1664, 1155, 608, 445, 994,
+ 780, 1665, 1169, 368, 474, 369, 1131, 1136, 1135, 995,
+ 607, 1156, 1141, 1187, 1206, 427, 1132, 608, 1142, 1155,
+
+ 1170, 445, 1158, 475, 476, 477, 478, 1157, 1227, 479,
+ 4688, 480, 1236, 780, 607, 481, 482, 483, 484, 1147,
+ 895, 608, 1517, 1518, 1170, 1158, 4664, 475, 476, 477,
+ 478, 1157, 1227, 479, 480, 1236, 780, 1159, 481, 482,
+ 483, 484, 368, 368, 369, 368, 368, 514, 368, 368,
+ 368, 368, 368, 368, 515, 368, 368, 368, 368, 368,
+ 1159, 622, 1165, 1166, 1172, 4664, 1173, 4626, 1175, 780,
+ 780, 445, 445, 1176, 780, 1177, 4626, 1163, 780, 780,
+ 1260, 4156, 368, 654, 369, 622, 1165, 1166, 1172, 1173,
+ 655, 1175, 780, 780, 445, 445, 1176, 780, 1177, 1181,
+
+ 1163, 780, 780, 1260, 1196, 368, 368, 368, 369, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 1174, 368,
+ 368, 368, 368, 368, 1180, 1184, 1183, 1185, 1196, 445,
+ 445, 1289, 654, 1182, 780, 445, 445, 1051, 445, 655,
+ 1186, 4126, 1174, 445, 445, 369, 368, 654, 1180, 1184,
+ 1183, 1185, 445, 445, 655, 1289, 1182, 780, 445, 445,
+ 1051, 445, 369, 1186, 1189, 369, 445, 445, 1194, 368,
+ 368, 368, 369, 368, 368, 514, 368, 368, 368, 368,
+ 368, 368, 515, 368, 368, 368, 368, 368, 1189, 654,
+ 654, 654, 654, 4126, 1207, 1237, 655, 655, 655, 655,
+
+ 1306, 4563, 1195, 683, 654, 1197, 4042, 1190, 1191, 654,
+ 368, 655, 1277, 1280, 1546, 1028, 655, 1207, 1237, 369,
+ 368, 4043, 1218, 1306, 368, 368, 1195, 683, 1203, 1197,
+ 1188, 1190, 1191, 368, 368, 368, 369, 368, 368, 520,
+ 368, 368, 368, 368, 368, 368, 521, 368, 368, 368,
+ 368, 368, 1203, 1188, 683, 1546, 1028, 1214, 654, 683,
+ 1219, 683, 654, 4550, 683, 655, 1222, 1223, 654, 655,
+ 1249, 4550, 654, 4538, 368, 655, 1250, 369, 683, 655,
+ 368, 1214, 1251, 683, 1219, 683, 1285, 1198, 683, 1222,
+ 1223, 1286, 1025, 1199, 1200, 1201, 1204, 368, 368, 368,
+
+ 369, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 1198, 368, 368, 368, 368, 368, 1199, 1200, 1201, 654,
+ 1204, 1216, 1256, 683, 1221, 683, 655, 1220, 683, 1249,
+ 4538, 1226, 1217, 407, 1251, 1250, 1202, 1153, 368, 4025,
+ 408, 1251, 1154, 899, 1256, 1216, 1256, 683, 1221, 683,
+ 407, 1220, 683, 369, 1226, 1217, 1251, 408, 1251, 1211,
+ 1202, 368, 368, 368, 369, 368, 368, 520, 368, 368,
+ 368, 368, 368, 368, 521, 368, 368, 368, 368, 368,
+ 683, 683, 1225, 683, 683, 1228, 369, 1232, 780, 1258,
+ 1259, 780, 1261, 1212, 780, 369, 1224, 1230, 369, 4025,
+
+ 780, 1262, 368, 4439, 683, 683, 1225, 683, 683, 1228,
+ 1232, 780, 1258, 1259, 780, 1261, 1212, 780, 369, 1224,
+ 4414, 1234, 1231, 780, 1262, 368, 368, 368, 369, 368,
+ 368, 584, 368, 368, 368, 368, 368, 368, 585, 368,
+ 368, 368, 368, 368, 1234, 407, 1231, 1238, 1264, 1272,
+ 1308, 407, 408, 780, 445, 780, 1371, 407, 408, 1297,
+ 1239, 407, 407, 4414, 408, 4388, 368, 407, 408, 408,
+ 1238, 1264, 1272, 1308, 408, 1809, 780, 445, 780, 1240,
+ 1371, 1810, 1297, 4388, 1239, 1242, 1241, 1243, 1244, 368,
+ 368, 368, 369, 368, 368, 368, 368, 368, 368, 368,
+
+ 368, 368, 1240, 368, 368, 368, 368, 368, 1242, 1241,
+ 1243, 445, 1244, 1269, 4303, 780, 1298, 1273, 1274, 780,
+ 407, 780, 1294, 445, 407, 407, 1515, 408, 407, 407,
+ 368, 408, 408, 1815, 445, 408, 408, 1269, 780, 1298,
+ 1273, 1274, 780, 4303, 780, 1294, 445, 1546, 1028, 1246,
+ 1245, 1247, 1248, 368, 368, 368, 369, 368, 368, 584,
+ 368, 368, 368, 368, 368, 368, 585, 368, 368, 368,
+ 368, 368, 1246, 1245, 1247, 1248, 4275, 1268, 407, 445,
+ 445, 1287, 1293, 407, 445, 408, 445, 1290, 1299, 780,
+ 408, 1253, 1412, 407, 368, 1667, 1668, 1413, 1414, 407,
+
+ 408, 1268, 445, 445, 1287, 1293, 408, 445, 4275, 445,
+ 1290, 1299, 780, 1252, 1254, 1253, 1257, 368, 368, 368,
+ 369, 368, 368, 620, 368, 368, 368, 368, 368, 368,
+ 621, 368, 368, 368, 368, 368, 1252, 1263, 1254, 1267,
+ 1257, 1291, 1271, 4243, 445, 1327, 1295, 445, 407, 445,
+ 1359, 1300, 780, 780, 780, 408, 1329, 369, 368, 1611,
+ 369, 1263, 1330, 1267, 1291, 1612, 1271, 445, 1327, 1295,
+ 445, 1255, 445, 1359, 1300, 780, 780, 780, 1043, 1044,
+ 1045, 368, 368, 368, 369, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 1255, 368, 368, 368, 368, 368,
+
+ 1265, 1270, 1275, 1296, 1292, 1288, 1376, 1305, 1304, 4243,
+ 1372, 1266, 445, 445, 780, 780, 445, 445, 445, 1309,
+ 1373, 445, 368, 3760, 1265, 1270, 1275, 1296, 1292, 1288,
+ 1376, 1305, 1304, 1372, 1266, 445, 445, 780, 780, 445,
+ 445, 445, 1309, 1373, 445, 368, 368, 368, 369, 368,
+ 368, 620, 368, 368, 368, 368, 368, 368, 621, 368,
+ 368, 368, 368, 368, 654, 1314, 1043, 1044, 1045, 407,
+ 1316, 655, 443, 1310, 445, 445, 408, 1307, 445, 1311,
+ 1385, 1192, 1363, 1386, 1301, 1312, 368, 1315, 1077, 1314,
+ 1302, 445, 1193, 1303, 1316, 1317, 445, 445, 445, 1078,
+
+ 1307, 445, 4156, 445, 1385, 1192, 1363, 1386, 1301, 368,
+ 630, 1315, 1077, 1302, 445, 1193, 1303, 607, 369, 445,
+ 369, 368, 1078, 369, 608, 445, 445, 426, 1326, 631,
+ 632, 633, 426, 1329, 445, 634, 369, 635, 1313, 1330,
+ 1312, 636, 637, 426, 638, 1406, 1407, 445, 445, 1324,
+ 1332, 426, 1349, 631, 632, 633, 426, 445, 445, 634,
+ 635, 1313, 369, 445, 636, 637, 426, 638, 673, 369,
+ 445, 1325, 1324, 1332, 445, 1349, 1328, 674, 1331, 1387,
+ 675, 445, 445, 676, 1360, 445, 445, 4126, 1374, 677,
+ 678, 679, 369, 369, 1325, 3643, 1493, 445, 1823, 680,
+
+ 1328, 369, 1331, 1387, 1824, 445, 2204, 1360, 445, 369,
+ 369, 1374, 2205, 677, 678, 679, 369, 369, 1333, 1334,
+ 1493, 1335, 680, 368, 368, 369, 368, 368, 681, 368,
+ 368, 368, 368, 368, 368, 682, 368, 368, 368, 368,
+ 368, 1333, 1334, 1336, 1337, 1335, 780, 1354, 1348, 1338,
+ 1361, 780, 1365, 445, 1694, 1695, 2226, 1375, 3643, 369,
+ 1377, 407, 2227, 368, 369, 369, 1336, 1337, 408, 780,
+ 1354, 1348, 1338, 1361, 780, 1365, 445, 1076, 1044, 1045,
+ 1375, 1339, 1340, 1377, 1352, 1341, 368, 368, 368, 369,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 1077,
+
+ 368, 368, 368, 368, 368, 1339, 1340, 1352, 1378, 1341,
+ 1078, 1368, 1357, 1358, 369, 445, 445, 1362, 407, 369,
+ 1697, 1698, 1379, 1077, 780, 408, 445, 368, 1350, 369,
+ 369, 1378, 4025, 1078, 1351, 1368, 1357, 1358, 445, 445,
+ 1362, 369, 1094, 1095, 1096, 1379, 1353, 780, 1369, 445,
+ 368, 368, 368, 369, 368, 368, 681, 368, 368, 368,
+ 368, 368, 368, 682, 368, 368, 368, 368, 368, 1353,
+ 1355, 1369, 1370, 1356, 1380, 780, 1366, 3760, 1384, 1432,
+ 1153, 1329, 1094, 1095, 1096, 1154, 899, 1330, 443, 445,
+ 369, 368, 369, 1355, 3215, 1370, 1356, 1380, 780, 1416,
+
+ 1366, 1384, 1432, 369, 1417, 1418, 369, 3643, 369, 369,
+ 1109, 445, 445, 1110, 368, 368, 368, 369, 368, 368,
+ 716, 368, 368, 368, 368, 717, 368, 718, 368, 368,
+ 368, 368, 368, 1109, 445, 369, 1110, 1389, 1367, 369,
+ 1391, 1401, 1467, 3044, 1431, 780, 654, 654, 1468, 1409,
+ 1699, 445, 407, 655, 655, 368, 1701, 1695, 369, 408,
+ 1389, 3003, 1367, 1391, 1401, 2895, 369, 1431, 780, 1343,
+ 369, 369, 369, 1364, 445, 1344, 1388, 1345, 368, 368,
+ 368, 369, 368, 368, 368, 368, 368, 368, 368, 717,
+ 368, 1346, 368, 368, 368, 368, 368, 1364, 1395, 1390,
+
+ 1388, 1394, 1347, 1429, 622, 622, 622, 683, 1495, 1430,
+ 1108, 1095, 1096, 654, 1428, 1346, 2878, 1683, 369, 368,
+ 655, 1395, 1390, 1684, 1394, 1347, 3003, 1429, 622, 622,
+ 622, 683, 1495, 1430, 369, 2927, 369, 1428, 1109, 369,
+ 369, 1110, 368, 368, 368, 369, 368, 368, 716, 368,
+ 368, 368, 368, 717, 368, 718, 368, 368, 368, 368,
+ 368, 1109, 1392, 1393, 1110, 1396, 607, 1397, 780, 1434,
+ 622, 654, 1433, 608, 780, 1496, 1499, 369, 655, 1423,
+ 1147, 895, 1425, 368, 369, 1392, 369, 1393, 1396, 1515,
+ 1397, 780, 1434, 2468, 622, 1433, 1815, 780, 1496, 1499,
+
+ 1181, 1403, 1402, 1423, 1404, 1425, 368, 368, 368, 369,
+ 368, 368, 730, 368, 368, 368, 368, 368, 368, 731,
+ 368, 368, 368, 368, 368, 1403, 1402, 1435, 1404, 1440,
+ 1438, 1256, 607, 780, 1436, 780, 1502, 8693, 780, 608,
+ 683, 607, 780, 1251, 1484, 2796, 607, 368, 608, 1426,
+ 2782, 1435, 1440, 608, 1438, 1427, 780, 1436, 780, 1502,
+ 1419, 780, 369, 369, 683, 780, 1422, 1424, 1484, 622,
+ 368, 368, 368, 369, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 1419, 368, 368, 368, 368, 368, 1422,
+ 1437, 1424, 1439, 622, 1501, 1441, 1442, 3215, 445, 1500,
+
+ 1444, 1443, 780, 445, 1527, 1446, 780, 780, 445, 445,
+ 1643, 368, 1406, 1407, 1437, 3215, 1439, 369, 1501, 1441,
+ 1442, 445, 1500, 1444, 1443, 780, 445, 1527, 1446, 780,
+ 780, 445, 445, 1643, 368, 368, 368, 369, 368, 368,
+ 730, 368, 368, 368, 368, 368, 368, 731, 368, 368,
+ 368, 368, 368, 1445, 369, 445, 369, 1450, 1449, 369,
+ 1451, 1181, 369, 1448, 1302, 445, 445, 443, 445, 445,
+ 1409, 1699, 1768, 1769, 1285, 368, 654, 1445, 445, 1286,
+ 1025, 1450, 1449, 655, 1451, 369, 1448, 1302, 445, 445,
+ 1455, 445, 445, 1211, 369, 1447, 1456, 1462, 368, 368,
+
+ 368, 369, 368, 368, 737, 368, 368, 368, 368, 368,
+ 368, 738, 368, 368, 368, 368, 368, 654, 1447, 607,
+ 445, 1462, 1452, 1476, 655, 683, 608, 1447, 1453, 654,
+ 1454, 1321, 1457, 654, 1321, 654, 655, 1598, 369, 368,
+ 655, 2671, 655, 445, 2647, 1426, 369, 1476, 1599, 683,
+ 1447, 1427, 445, 2247, 1211, 369, 1457, 369, 1464, 2248,
+ 1459, 1458, 368, 368, 368, 369, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 445, 368, 368, 368, 368,
+ 368, 1464, 654, 1459, 1458, 683, 683, 3044, 1447, 655,
+ 780, 1504, 1532, 1478, 654, 1470, 2278, 1477, 654, 654,
+
+ 654, 655, 2279, 368, 3044, 655, 655, 655, 2603, 683,
+ 683, 1447, 1548, 780, 1504, 1532, 1478, 1549, 1550, 1470,
+ 1477, 2572, 1460, 1461, 1466, 1463, 368, 368, 368, 369,
+ 368, 368, 737, 368, 368, 368, 368, 368, 368, 738,
+ 368, 368, 368, 368, 368, 1460, 1461, 1466, 1463, 369,
+ 683, 683, 683, 683, 654, 1654, 654, 2549, 1481, 1485,
+ 1488, 655, 1480, 655, 1285, 1473, 654, 368, 369, 1286,
+ 1025, 654, 1256, 655, 683, 683, 683, 683, 655, 1654,
+ 1465, 1481, 1485, 1488, 1251, 1480, 1469, 1471, 1472, 1473,
+ 368, 368, 441, 369, 368, 368, 368, 368, 443, 368,
+
+ 368, 368, 368, 1465, 368, 368, 368, 368, 368, 1469,
+ 369, 1471, 1472, 683, 683, 683, 1492, 683, 683, 1561,
+ 683, 1494, 1256, 1483, 445, 1482, 407, 1487, 1475, 369,
+ 1479, 368, 2895, 408, 1251, 1517, 1817, 683, 683, 683,
+ 1492, 683, 683, 1561, 683, 1494, 1483, 445, 1482, 1474,
+ 1487, 369, 1475, 1479, 368, 368, 441, 369, 368, 368,
+ 426, 368, 443, 368, 368, 368, 368, 779, 368, 368,
+ 368, 368, 368, 1474, 683, 2895, 683, 2878, 1528, 1497,
+ 1525, 780, 1552, 780, 780, 1533, 1486, 1553, 1554, 1491,
+ 1230, 369, 369, 1489, 2878, 368, 1819, 1820, 683, 1490,
+
+ 683, 1528, 1497, 1525, 780, 2468, 780, 780, 1533, 1486,
+ 407, 369, 1491, 2440, 683, 1231, 1503, 408, 368, 368,
+ 441, 369, 368, 368, 426, 368, 443, 368, 368, 368,
+ 368, 779, 368, 368, 368, 368, 368, 1498, 683, 1231,
+ 1503, 407, 1511, 1530, 780, 1534, 369, 1569, 408, 780,
+ 1581, 407, 445, 1008, 1505, 1582, 1583, 654, 408, 368,
+ 1498, 2440, 407, 407, 655, 1511, 1530, 780, 1534, 408,
+ 408, 1569, 780, 1317, 407, 445, 1008, 1522, 1505, 1506,
+ 1514, 408, 368, 368, 441, 369, 368, 368, 442, 368,
+ 443, 368, 368, 368, 368, 444, 368, 368, 368, 368,
+
+ 368, 1522, 1506, 1507, 1514, 2796, 780, 1541, 780, 1565,
+ 445, 1542, 1663, 407, 780, 407, 1655, 407, 1033, 2296,
+ 408, 1986, 408, 368, 408, 2297, 1507, 1987, 407, 780,
+ 1541, 780, 1565, 445, 1542, 408, 1663, 780, 2796, 1655,
+ 2782, 1033, 1508, 1509, 1512, 1520, 368, 368, 441, 369,
+ 368, 368, 442, 368, 443, 368, 368, 368, 368, 444,
+ 368, 368, 368, 368, 368, 1508, 1509, 1512, 1531, 1520,
+ 445, 1537, 2782, 445, 445, 1562, 1575, 1563, 1034, 407,
+ 780, 407, 407, 1626, 369, 780, 408, 368, 408, 408,
+ 1843, 1844, 1531, 445, 1627, 1537, 445, 445, 1562, 1575,
+
+ 1563, 1034, 369, 780, 1546, 1028, 1510, 1513, 780, 1521,
+ 368, 368, 368, 369, 368, 368, 620, 368, 368, 368,
+ 368, 368, 368, 621, 368, 368, 368, 368, 368, 1510,
+ 1513, 1538, 1521, 1526, 1529, 1535, 2360, 1566, 445, 445,
+ 407, 407, 1576, 780, 1536, 780, 1160, 408, 408, 780,
+ 780, 368, 1751, 369, 2360, 1538, 369, 1526, 1529, 1535,
+ 1566, 445, 445, 1752, 2334, 1576, 780, 1536, 780, 1160,
+ 1523, 1524, 780, 780, 368, 368, 368, 369, 368, 368,
+ 620, 368, 368, 368, 368, 368, 368, 621, 368, 368,
+ 368, 368, 368, 1523, 1524, 1555, 1161, 1556, 1557, 654,
+
+ 1656, 1329, 1567, 1669, 1560, 1558, 655, 1330, 445, 445,
+ 445, 1559, 1595, 445, 445, 368, 369, 1596, 1597, 1555,
+ 1161, 1556, 1557, 1656, 1607, 369, 1567, 1669, 1560, 1608,
+ 1609, 445, 445, 445, 780, 445, 445, 445, 368, 368,
+ 368, 369, 368, 368, 681, 368, 368, 368, 368, 368,
+ 368, 682, 368, 368, 368, 368, 368, 780, 445, 1564,
+ 2139, 1568, 445, 1570, 369, 445, 1572, 2489, 445, 1571,
+ 1208, 1657, 445, 1658, 445, 1573, 445, 1577, 445, 368,
+ 1455, 369, 607, 1564, 1568, 445, 1456, 1570, 445, 608,
+ 1572, 445, 1571, 1208, 1657, 445, 1658, 445, 1573, 445,
+
+ 1577, 445, 368, 368, 368, 369, 368, 368, 681, 368,
+ 368, 368, 368, 368, 368, 682, 368, 368, 368, 368,
+ 368, 2334, 1318, 1574, 1578, 1209, 1585, 1588, 1319, 1587,
+ 1320, 1321, 369, 445, 1321, 445, 445, 445, 445, 445,
+ 1623, 1586, 369, 368, 1539, 1624, 1625, 1574, 1578, 1209,
+ 1585, 1588, 369, 1587, 369, 1540, 445, 369, 445, 445,
+ 445, 445, 445, 2304, 1586, 445, 368, 1318, 1539, 445,
+ 1600, 1653, 1602, 1319, 1613, 1320, 1321, 1614, 1540, 1321,
+ 445, 2671, 445, 445, 1630, 1601, 1603, 1605, 445, 1322,
+ 2220, 445, 445, 1600, 1653, 1602, 1604, 445, 1613, 2220,
+
+ 1323, 1614, 2220, 445, 369, 445, 445, 1630, 1601, 1603,
+ 1605, 1846, 1847, 1322, 445, 1843, 1844, 369, 2671, 1604,
+ 445, 369, 1610, 1323, 368, 1310, 369, 368, 368, 369,
+ 368, 1311, 368, 368, 368, 368, 368, 1312, 368, 368,
+ 368, 368, 369, 369, 1593, 369, 1610, 369, 369, 1615,
+ 1319, 1628, 1320, 369, 369, 1633, 2647, 1616, 407, 1617,
+ 1634, 1635, 1640, 780, 368, 408, 1346, 1618, 1619, 1620,
+ 1489, 369, 1615, 1621, 1628, 1636, 1490, 1347, 369, 1639,
+ 1616, 1629, 780, 1617, 2647, 1640, 780, 368, 1317, 369,
+ 1346, 1618, 1619, 1620, 443, 1343, 369, 1621, 2603, 1636,
+
+ 1347, 1344, 1639, 1345, 1629, 780, 1642, 475, 476, 1589,
+ 478, 2603, 1631, 479, 2572, 480, 445, 1346, 1686, 1590,
+ 1591, 483, 484, 1687, 1688, 1846, 1857, 2572, 1347, 654,
+ 1642, 475, 476, 1589, 478, 1631, 655, 479, 480, 445,
+ 2549, 1346, 1590, 1592, 483, 484, 368, 1326, 369, 368,
+ 368, 1347, 368, 443, 368, 368, 368, 368, 368, 1312,
+ 368, 368, 368, 368, 407, 1638, 1329, 1645, 1641, 407,
+ 1644, 408, 1330, 445, 1648, 407, 408, 1637, 654, 445,
+ 445, 780, 408, 1649, 1647, 655, 368, 1659, 445, 1638,
+ 780, 1645, 1641, 445, 1644, 1651, 445, 1650, 1648, 780,
+
+ 1660, 1637, 445, 445, 780, 1646, 445, 1649, 1647, 368,
+ 1659, 445, 369, 780, 1661, 1662, 445, 1670, 1671, 1651,
+ 1650, 1672, 780, 1660, 369, 369, 369, 369, 1646, 445,
+ 369, 1652, 369, 369, 369, 369, 369, 1661, 1662, 369,
+ 1670, 1673, 1671, 369, 1672, 1412, 1726, 1703, 369, 369,
+ 1413, 1414, 1704, 1705, 1691, 1652, 1675, 1674, 1676, 2549,
+ 1677, 1678, 780, 1681, 607, 1673, 1680, 1679, 1682, 1689,
+ 1726, 608, 1690, 1891, 1892, 1715, 1692, 1714, 1691, 1675,
+ 1674, 1676, 1707, 1677, 1678, 780, 1681, 1708, 1709, 1680,
+ 1679, 1416, 1682, 1689, 1716, 1690, 1417, 1710, 1712, 1692,
+
+ 1153, 1714, 607, 1713, 1705, 1154, 899, 607, 1727, 608,
+ 607, 1721, 369, 622, 608, 1725, 622, 608, 1716, 1732,
+ 1455, 683, 1728, 1717, 1798, 1719, 1456, 1724, 780, 780,
+ 1722, 1727, 1718, 2138, 1897, 369, 2352, 622, 2133, 1725,
+ 622, 369, 2353, 1732, 683, 1728, 1312, 1717, 1798, 1719,
+ 1724, 780, 780, 780, 1722, 1718, 368, 368, 369, 368,
+ 368, 620, 368, 368, 368, 368, 368, 368, 621, 368,
+ 368, 368, 368, 368, 1720, 1729, 780, 1730, 1741, 780,
+ 1733, 1734, 2468, 780, 1731, 1801, 1738, 369, 445, 1742,
+ 1802, 780, 2440, 780, 780, 445, 368, 2365, 1720, 1729,
+
+ 1730, 1741, 780, 2366, 1733, 1734, 780, 1731, 1801, 1736,
+ 1738, 445, 1742, 1802, 780, 1737, 780, 780, 445, 368,
+ 368, 368, 369, 368, 368, 620, 368, 368, 368, 368,
+ 368, 368, 621, 368, 368, 368, 368, 368, 1452, 445,
+ 1735, 1723, 1744, 1740, 1453, 1743, 1454, 1321, 1739, 1745,
+ 1321, 445, 445, 445, 445, 445, 369, 1809, 1840, 445,
+ 368, 407, 445, 1810, 1735, 1723, 1744, 1740, 408, 1743,
+ 2360, 780, 1739, 1745, 445, 445, 445, 445, 445, 1746,
+ 369, 1840, 445, 368, 1748, 1453, 1754, 1454, 654, 1749,
+ 1750, 1755, 1756, 654, 780, 655, 654, 654, 654, 654,
+
+ 655, 1757, 654, 655, 655, 655, 655, 654, 654, 655,
+ 368, 654, 654, 654, 655, 655, 368, 654, 655, 655,
+ 655, 1758, 369, 1760, 655, 1757, 1759, 1762, 1763, 1761,
+ 1766, 369, 654, 1765, 1770, 369, 1764, 683, 1779, 655,
+ 1781, 1771, 1773, 683, 1758, 369, 1760, 1772, 369, 1759,
+ 1762, 1763, 1761, 1775, 1766, 1776, 1765, 1774, 1770, 1764,
+ 683, 1779, 1790, 1781, 1771, 1773, 683, 1791, 1792, 1548,
+ 369, 1772, 1907, 1908, 1549, 1550, 1775, 1780, 683, 1776,
+ 1774, 368, 368, 369, 368, 368, 681, 368, 368, 368,
+ 368, 368, 368, 682, 368, 368, 368, 368, 368, 1777,
+
+ 1780, 683, 1782, 2334, 683, 1784, 1783, 683, 683, 683,
+ 1877, 1785, 683, 1786, 1787, 654, 683, 683, 1794, 1849,
+ 369, 368, 655, 1777, 1850, 1851, 1782, 683, 1784, 1783,
+ 683, 683, 683, 1877, 1785, 683, 1786, 1787, 369, 683,
+ 683, 1794, 369, 369, 368, 368, 368, 369, 368, 368,
+ 681, 368, 368, 368, 368, 368, 368, 682, 368, 368,
+ 368, 368, 368, 1788, 1793, 1795, 1796, 369, 683, 2138,
+ 1797, 1799, 369, 407, 683, 683, 1804, 683, 1778, 683,
+ 408, 1922, 1923, 1934, 369, 368, 445, 1788, 1793, 1795,
+ 1796, 683, 1800, 1797, 1799, 2133, 1803, 683, 683, 1804,
+
+ 683, 1778, 683, 1805, 407, 407, 407, 407, 368, 445,
+ 407, 408, 408, 408, 408, 407, 1800, 408, 1808, 1803,
+ 369, 1806, 408, 1813, 407, 369, 1805, 1807, 1825, 369,
+ 407, 408, 1812, 407, 369, 1823, 1811, 408, 369, 407,
+ 408, 1824, 1808, 369, 780, 1806, 408, 1813, 1826, 1256,
+ 1822, 1807, 1825, 407, 1814, 1952, 1812, 1558, 1821, 1811,
+ 408, 1251, 780, 1559, 1256, 1828, 369, 780, 407, 1901,
+ 1827, 1829, 1826, 780, 1822, 408, 1251, 1814, 1832, 1952,
+ 1830, 1821, 780, 780, 780, 780, 1256, 1831, 1835, 1828,
+ 780, 780, 1901, 780, 1827, 1829, 780, 1834, 1251, 780,
+
+ 1833, 1836, 1832, 1830, 369, 780, 780, 780, 780, 780,
+ 1831, 1982, 1835, 780, 780, 1837, 780, 780, 780, 2139,
+ 1838, 1834, 780, 445, 1833, 1836, 2489, 780, 780, 1839,
+ 1868, 780, 780, 780, 1982, 1841, 369, 1872, 1941, 1837,
+ 780, 780, 1853, 1838, 1944, 1945, 445, 1854, 1855, 1552,
+ 780, 780, 1839, 1868, 1553, 1856, 780, 1859, 1841, 1285,
+ 1861, 1941, 1860, 1851, 1286, 1025, 445, 445, 445, 369,
+ 1862, 445, 1863, 1558, 369, 1865, 1869, 445, 1870, 1559,
+ 1866, 1867, 445, 1871, 1861, 1988, 1873, 445, 445, 445,
+ 445, 445, 1874, 1862, 445, 1863, 445, 369, 1875, 1869,
+
+ 445, 1876, 1870, 445, 445, 445, 1878, 1871, 1988, 1873,
+ 445, 445, 1879, 1544, 445, 1881, 1874, 445, 1880, 445,
+ 1882, 1875, 1884, 1885, 369, 1876, 445, 445, 445, 1878,
+ 1883, 445, 1326, 445, 445, 2409, 445, 445, 1886, 1881,
+ 445, 2410, 445, 1882, 1312, 1983, 1884, 1885, 1957, 1958,
+ 445, 445, 1898, 1883, 445, 445, 445, 445, 1581, 445,
+ 1900, 1886, 445, 1582, 1889, 445, 1894, 1667, 1668, 1983,
+ 654, 1895, 1896, 445, 1595, 1898, 369, 655, 445, 1596,
+ 1905, 369, 1984, 1900, 1985, 445, 368, 368, 369, 368,
+ 368, 1579, 368, 368, 368, 368, 368, 368, 1887, 368,
+
+ 368, 368, 368, 368, 1899, 1326, 1984, 494, 1985, 369,
+ 1902, 369, 369, 445, 1910, 1593, 369, 1312, 445, 1911,
+ 1912, 1319, 1919, 1320, 1667, 1992, 368, 369, 1899, 1903,
+ 494, 1904, 1917, 1902, 1544, 445, 445, 1346, 1918, 1598,
+ 369, 445, 1913, 369, 1544, 1919, 1914, 445, 1347, 368,
+ 1599, 1321, 654, 1903, 1321, 1904, 1913, 369, 445, 655,
+ 1915, 1346, 445, 1933, 1346, 1321, 369, 1599, 1321, 1914,
+ 445, 1347, 445, 1994, 1995, 1347, 1916, 1607, 1346, 1326,
+ 369, 445, 1608, 1920, 1915, 445, 1933, 1925, 1346, 1347,
+ 1519, 1312, 1926, 1927, 369, 445, 1913, 369, 1347, 1928,
+
+ 1916, 1930, 1346, 369, 445, 1321, 1931, 1932, 1321, 445,
+ 1611, 369, 1347, 1935, 369, 369, 1612, 1145, 1346, 1626,
+ 369, 1936, 1928, 369, 369, 1937, 369, 369, 1623, 1347,
+ 1627, 1145, 445, 1624, 1942, 1947, 1935, 1950, 369, 369,
+ 1948, 1949, 1346, 1938, 3324, 1936, 1939, 369, 1937, 1940,
+ 1953, 2848, 1347, 1950, 369, 1951, 1633, 1954, 407, 1346,
+ 369, 1634, 1955, 780, 1627, 408, 1938, 1950, 369, 1939,
+ 1347, 1960, 1940, 1966, 1953, 1346, 1961, 1962, 1951, 1970,
+ 1954, 445, 1963, 1346, 1967, 445, 1347, 780, 1969, 1346,
+ 1989, 1256, 445, 1347, 1980, 445, 1966, 1968, 1990, 1346,
+
+ 1347, 369, 1970, 1251, 445, 1963, 369, 1967, 445, 1347,
+ 2002, 369, 1969, 1346, 1989, 445, 2003, 1980, 445, 1007,
+ 1968, 984, 1990, 1347, 368, 441, 369, 368, 368, 426,
+ 368, 443, 368, 368, 368, 368, 779, 368, 368, 368,
+ 368, 368, 407, 1972, 1973, 1973, 780, 407, 1991, 408,
+ 1964, 1974, 1976, 1997, 408, 1251, 1975, 445, 1996, 1971,
+ 1686, 445, 1683, 369, 368, 1687, 1688, 1686, 1684, 937,
+ 780, 1991, 1687, 2008, 1964, 1974, 1976, 1997, 369, 1975,
+ 445, 1996, 904, 1971, 445, 1667, 1992, 368, 368, 441,
+ 369, 368, 368, 426, 368, 443, 368, 368, 368, 368,
+
+ 779, 368, 368, 368, 368, 368, 1977, 1978, 1979, 1965,
+ 369, 1998, 369, 369, 369, 369, 369, 369, 1312, 369,
+ 2010, 369, 369, 1694, 1695, 2011, 2012, 622, 368, 2001,
+ 2043, 2006, 1981, 1965, 1998, 369, 445, 1999, 2000, 2005,
+ 1694, 1695, 2014, 1145, 2004, 1406, 1407, 1697, 1698, 2007,
+ 622, 368, 2013, 2001, 2043, 2006, 1981, 2016, 2017, 445,
+ 1117, 1999, 2000, 2005, 1147, 895, 2014, 2004, 1701, 2018,
+ 1701, 1695, 2007, 1703, 2025, 2013, 1694, 1695, 1704, 1705,
+ 1703, 2026, 1412, 2027, 1707, 1704, 1705, 1413, 1414, 1708,
+ 1709, 1697, 1698, 2020, 1715, 1153, 369, 1712, 2021, 2022,
+
+ 1154, 899, 1713, 2023, 1701, 2018, 1712, 607, 607, 607,
+ 369, 1713, 1705, 1716, 608, 608, 608, 1721, 369, 2031,
+ 369, 2035, 2024, 2036, 780, 2029, 2032, 445, 2033, 780,
+ 2037, 369, 2056, 622, 780, 2039, 1722, 1716, 2028, 2059,
+ 2060, 2067, 2068, 1768, 2083, 2035, 2024, 2036, 780, 2029,
+ 445, 1736, 369, 780, 2037, 2056, 622, 1737, 780, 2039,
+ 1722, 2028, 368, 368, 369, 368, 368, 620, 368, 368,
+ 368, 368, 368, 368, 621, 368, 368, 368, 368, 368,
+ 1736, 780, 2030, 780, 780, 2041, 1737, 2042, 2038, 2046,
+ 780, 369, 2040, 445, 2047, 2048, 2116, 2044, 2050, 445,
+
+ 780, 2220, 368, 2085, 2086, 780, 2030, 780, 780, 2041,
+ 2220, 2042, 2038, 2220, 780, 2040, 445, 2051, 369, 2116,
+ 2044, 2050, 445, 2323, 780, 368, 368, 368, 369, 368,
+ 368, 620, 368, 368, 368, 368, 368, 368, 621, 368,
+ 368, 368, 368, 368, 445, 2053, 2323, 445, 2052, 369,
+ 445, 2049, 2054, 2055, 445, 2324, 445, 1746, 369, 369,
+ 2034, 1751, 369, 1453, 369, 1454, 368, 445, 369, 2053,
+ 445, 2052, 1752, 445, 2049, 2054, 2055, 445, 2324, 445,
+ 1748, 369, 2062, 2034, 727, 1749, 2057, 2063, 2064, 368,
+ 1321, 369, 1321, 369, 1768, 2083, 1819, 2131, 727, 1321,
+
+ 1754, 1321, 1321, 1752, 1321, 1755, 2065, 2070, 1321, 369,
+ 369, 654, 2071, 2072, 654, 654, 654, 1321, 655, 654,
+ 1321, 655, 655, 655, 2077, 654, 655, 654, 654, 2076,
+ 2078, 2074, 655, 654, 655, 655, 2075, 654, 711, 369,
+ 655, 2073, 2080, 2094, 655, 654, 2081, 937, 2079, 369,
+ 683, 657, 655, 2076, 2093, 2074, 2329, 2082, 2100, 2096,
+ 2075, 683, 2088, 2089, 2073, 2087, 2080, 2094, 2090, 2097,
+ 2081, 2079, 1843, 1844, 683, 2098, 2157, 2158, 2093, 2329,
+ 2082, 659, 2100, 2096, 3615, 683, 2088, 2089, 2087, 683,
+ 683, 3145, 2090, 368, 368, 369, 368, 368, 681, 368,
+
+ 368, 368, 368, 368, 368, 682, 368, 368, 368, 368,
+ 368, 2095, 683, 683, 683, 683, 2101, 683, 683, 2109,
+ 683, 1790, 683, 2111, 2099, 683, 1791, 2103, 2091, 2108,
+ 2102, 2117, 2105, 368, 658, 2095, 683, 2106, 2107, 683,
+ 2101, 683, 683, 2109, 683, 657, 683, 2099, 904, 683,
+ 610, 2091, 2108, 2102, 2112, 2117, 368, 368, 368, 369,
+ 368, 368, 681, 368, 368, 368, 368, 368, 368, 682,
+ 368, 368, 368, 368, 368, 683, 369, 2112, 369, 2092,
+ 2114, 369, 369, 407, 611, 407, 407, 407, 610, 2110,
+ 408, 2124, 408, 408, 408, 407, 2330, 368, 2113, 683,
+
+ 2120, 2121, 408, 2092, 2118, 2185, 2119, 2127, 407, 2122,
+ 407, 2115, 2110, 2140, 780, 408, 2125, 408, 2123, 2330,
+ 368, 2126, 2113, 369, 2120, 2121, 369, 2118, 407, 2185,
+ 2119, 2127, 2122, 2129, 2115, 408, 2128, 2140, 780, 1256,
+ 2125, 2123, 2135, 407, 2126, 2130, 780, 1872, 2136, 1817,
+ 408, 1251, 780, 1256, 2137, 780, 2129, 407, 2321, 2128,
+ 2141, 2143, 597, 780, 408, 1251, 780, 780, 780, 2130,
+ 780, 597, 2142, 2145, 780, 780, 780, 2144, 2146, 780,
+ 2148, 780, 2321, 2141, 2143, 2147, 2149, 780, 2150, 780,
+ 780, 780, 780, 780, 780, 2142, 369, 2145, 780, 780,
+
+ 2144, 2146, 2152, 2148, 2153, 780, 780, 780, 2147, 2151,
+ 2149, 2150, 2154, 780, 2286, 780, 593, 780, 780, 2160,
+ 2161, 1846, 1857, 2163, 2158, 2152, 1546, 1028, 2153, 2155,
+ 780, 780, 2151, 2157, 2158, 1849, 2154, 1849, 2286, 780,
+ 1850, 1851, 1850, 1851, 1548, 2160, 2161, 369, 1853, 1549,
+ 1550, 2165, 2155, 1854, 1855, 1285, 2166, 2167, 1546, 1028,
+ 1286, 1025, 1859, 2163, 2169, 1859, 369, 1860, 2168, 579,
+ 1860, 1851, 368, 441, 369, 368, 368, 442, 368, 443,
+ 368, 368, 368, 368, 444, 368, 368, 368, 368, 368,
+ 445, 1865, 2175, 2176, 2172, 2178, 1866, 2173, 445, 445,
+
+ 2179, 2180, 2182, 1879, 369, 1897, 369, 2170, 577, 1880,
+ 577, 2183, 368, 369, 445, 1891, 1892, 1312, 2172, 2199,
+ 2200, 535, 445, 445, 2199, 2202, 2182, 1894, 1907, 1908,
+ 2170, 369, 1895, 2201, 2183, 368, 368, 441, 369, 368,
+ 368, 442, 368, 443, 368, 368, 368, 368, 444, 368,
+ 368, 368, 368, 368, 2171, 1913, 369, 445, 445, 1872,
+ 369, 445, 445, 535, 1321, 443, 2288, 1321, 445, 445,
+ 2217, 2218, 2188, 2181, 2187, 2186, 368, 1346, 2171, 369,
+ 2189, 445, 445, 2304, 2195, 445, 445, 407, 1347, 2288,
+ 2184, 369, 445, 445, 408, 2188, 2181, 2187, 2186, 368,
+
+ 369, 1346, 445, 2189, 2193, 397, 445, 2195, 2190, 797,
+ 1326, 1347, 1318, 2184, 798, 799, 2196, 445, 1319, 445,
+ 1320, 1321, 1312, 2197, 1321, 2194, 445, 445, 2193, 445,
+ 445, 2213, 369, 2191, 1322, 2217, 2224, 2025, 2192, 2196,
+ 397, 445, 2421, 445, 2026, 1323, 2027, 2197, 2422, 2194,
+ 2077, 445, 2212, 445, 2213, 1326, 2078, 2191, 1322, 2207,
+ 2208, 2192, 1922, 1923, 369, 2209, 1889, 1312, 1323, 1318,
+ 445, 2210, 445, 369, 369, 1319, 2212, 1320, 1321, 445,
+ 844, 1321, 2214, 1910, 369, 2211, 445, 2240, 1911, 2223,
+ 844, 1322, 2215, 445, 445, 2235, 445, 2289, 1950, 369,
+
+ 1913, 369, 1323, 445, 844, 445, 2214, 373, 2211, 1321,
+ 445, 2240, 1321, 2268, 844, 1322, 2215, 445, 2219, 2235,
+ 1346, 2289, 1346, 369, 2237, 1323, 1318, 2220, 369, 445,
+ 2220, 1347, 1319, 1347, 1320, 1321, 2268, 445, 1321, 2459,
+ 2221, 2242, 2243, 445, 1346, 2460, 1346, 2237, 1322, 1917,
+ 369, 2222, 2236, 369, 1347, 1918, 1347, 1925, 369, 1323,
+ 369, 445, 1926, 2244, 2221, 2242, 2245, 445, 2259, 2260,
+ 369, 1930, 1322, 369, 2222, 2236, 1931, 2257, 2256, 1934,
+ 369, 2269, 1323, 368, 368, 369, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 369, 368, 368, 368, 368,
+
+ 368, 2262, 2256, 2267, 2269, 369, 2263, 2264, 1944, 1945,
+ 2265, 2266, 2272, 2273, 369, 1947, 2272, 2276, 1957, 1958,
+ 1948, 2275, 1960, 368, 2291, 2292, 2267, 1961, 2293, 2291,
+ 2294, 1994, 2332, 2265, 2336, 2266, 369, 1994, 2332, 2337,
+ 2338, 369, 2322, 1950, 369, 2270, 368, 368, 368, 369,
+ 368, 368, 1579, 368, 368, 368, 368, 368, 368, 1887,
+ 368, 368, 368, 368, 368, 1346, 2322, 2287, 2270, 2307,
+ 445, 2016, 2358, 1972, 1973, 1973, 1347, 2328, 2331, 2362,
+ 1698, 780, 683, 1913, 369, 1251, 2308, 368, 369, 1346,
+ 2287, 369, 1321, 2307, 445, 1321, 2312, 2313, 2313, 1347,
+
+ 407, 2328, 2331, 727, 780, 1346, 683, 408, 1251, 2308,
+ 368, 368, 1897, 369, 368, 368, 1347, 368, 368, 368,
+ 368, 368, 368, 368, 1312, 368, 368, 368, 368, 1346,
+ 2002, 369, 2219, 369, 1343, 369, 2003, 1343, 369, 1347,
+ 1344, 2220, 1345, 1344, 2220, 1345, 1950, 369, 369, 2339,
+ 369, 368, 2010, 709, 2221, 2510, 1346, 2011, 2350, 1346,
+ 369, 2511, 445, 1343, 369, 2222, 709, 1347, 1346, 1344,
+ 1347, 1345, 2274, 2339, 368, 2229, 2230, 2310, 2221, 1347,
+ 1346, 2231, 1905, 1346, 2232, 1346, 445, 2232, 2222, 445,
+ 1347, 2320, 1346, 1347, 2221, 708, 1347, 2233, 2524, 2309,
+
+ 2310, 2314, 1347, 369, 2525, 2222, 2355, 780, 2234, 1346,
+ 2311, 2356, 2357, 445, 2320, 1406, 1407, 2204, 2221, 1347,
+ 2020, 2233, 2309, 2205, 2314, 2021, 2363, 445, 2222, 2319,
+ 780, 2234, 796, 2238, 797, 796, 796, 708, 796, 798,
+ 799, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+ 369, 445, 2319, 2281, 2282, 1950, 369, 708, 2274, 2283,
+ 1942, 1950, 369, 2016, 2358, 2368, 683, 2299, 2300, 2340,
+ 2369, 1709, 796, 2301, 1955, 2284, 369, 1346, 2390, 2391,
+ 2221, 369, 445, 1346, 369, 2325, 2285, 369, 1347, 2302,
+ 683, 2222, 406, 2340, 1347, 796, 2250, 2251, 2315, 2284,
+
+ 2303, 1346, 2252, 1920, 2221, 2253, 445, 1346, 2253, 2285,
+ 2326, 1347, 2347, 2302, 2222, 2327, 2341, 1347, 2254, 659,
+ 1412, 2315, 2226, 2303, 369, 1413, 1414, 369, 2227, 2255,
+ 658, 2316, 2317, 2318, 2326, 2347, 2059, 2060, 2327, 2341,
+ 2404, 2405, 2254, 1312, 657, 2371, 2343, 369, 445, 611,
+ 2342, 2346, 2255, 368, 441, 369, 368, 368, 426, 368,
+ 443, 368, 368, 368, 368, 779, 368, 368, 368, 368,
+ 368, 2344, 445, 2342, 2372, 2346, 2345, 683, 2373, 2380,
+ 780, 2382, 607, 2305, 2374, 610, 369, 780, 780, 608,
+ 2381, 2031, 369, 368, 369, 2344, 369, 2372, 2032, 2345,
+
+ 2033, 683, 2380, 780, 2382, 2051, 2305, 2376, 369, 2247,
+ 780, 780, 2348, 2381, 2349, 2248, 368, 368, 441, 369,
+ 368, 368, 426, 368, 443, 368, 368, 368, 368, 779,
+ 368, 368, 368, 368, 368, 2348, 2377, 2383, 2349, 2384,
+ 780, 2385, 780, 2386, 2404, 2407, 369, 607, 2465, 780,
+ 2046, 780, 369, 2306, 608, 2047, 2388, 368, 602, 2377,
+ 596, 2383, 2384, 780, 2385, 780, 2386, 2067, 2068, 2416,
+ 2417, 2465, 780, 369, 780, 445, 2306, 2370, 369, 2387,
+ 368, 368, 1977, 1978, 1979, 368, 2444, 368, 443, 368,
+ 368, 368, 368, 368, 1312, 368, 368, 368, 368, 445,
+
+ 2370, 2393, 1452, 2387, 1321, 369, 2394, 2395, 1453, 2444,
+ 1454, 1321, 369, 1321, 1321, 597, 1321, 1321, 369, 445,
+ 596, 368, 369, 2416, 2419, 2062, 1321, 1321, 369, 1321,
+ 2063, 2406, 2070, 369, 2051, 369, 1321, 2071, 2418, 1321,
+ 443, 593, 2398, 445, 368, 368, 368, 369, 368, 368,
+ 620, 368, 368, 368, 368, 368, 368, 621, 368, 368,
+ 368, 368, 368, 445, 1452, 2397, 2398, 2085, 2438, 445,
+ 1453, 683, 1454, 1321, 2442, 2083, 1321, 2105, 2449, 2396,
+ 2375, 445, 2106, 2457, 2402, 368, 369, 445, 2397, 2399,
+ 2400, 2401, 2632, 445, 2462, 683, 2085, 2438, 2633, 2463,
+
+ 2103, 2449, 2396, 2375, 2443, 445, 445, 2402, 368, 368,
+ 2378, 369, 368, 368, 620, 368, 2379, 368, 368, 368,
+ 368, 621, 368, 368, 368, 368, 368, 1452, 2443, 579,
+ 445, 2412, 2413, 1453, 2431, 1454, 1321, 2414, 2057, 1321,
+ 2412, 2424, 2425, 2412, 445, 654, 577, 2426, 2065, 368,
+ 2424, 2278, 655, 2424, 654, 654, 654, 2279, 2427, 2432,
+ 405, 655, 655, 655, 2433, 683, 683, 654, 445, 654,
+ 2428, 2453, 368, 654, 655, 2447, 655, 2470, 369, 2430,
+ 655, 2429, 2427, 2432, 654, 683, 369, 2433, 2434, 683,
+ 683, 655, 2455, 2469, 2428, 2453, 2436, 2435, 2447, 2097,
+
+ 369, 2437, 2430, 369, 2429, 2098, 1256, 2136, 1817, 683,
+ 407, 536, 2434, 2486, 2487, 2455, 2469, 408, 1251, 2436,
+ 2435, 2450, 369, 683, 2456, 2437, 368, 368, 369, 368,
+ 368, 681, 368, 368, 368, 368, 368, 368, 682, 368,
+ 368, 368, 368, 368, 2445, 683, 2451, 683, 2456, 683,
+ 535, 2452, 1256, 2474, 2475, 3724, 407, 2454, 2579, 2136,
+ 1817, 2464, 3280, 408, 1251, 2488, 368, 1256, 2445, 683,
+ 2451, 407, 406, 683, 2452, 369, 2474, 2475, 408, 1251,
+ 2454, 2579, 2111, 369, 2464, 2114, 369, 369, 369, 368,
+ 368, 368, 369, 368, 368, 681, 368, 368, 368, 368,
+
+ 368, 368, 682, 368, 368, 368, 368, 368, 2448, 2400,
+ 2401, 2446, 369, 2112, 2466, 397, 2115, 407, 2467, 407,
+ 2124, 2157, 2158, 2580, 408, 2705, 408, 407, 683, 373,
+ 368, 2472, 2157, 2158, 408, 2446, 2112, 2466, 780, 2115,
+ 2471, 2467, 2476, 369, 2473, 2125, 2580, 407, 2705, 407,
+ 2126, 2495, 683, 368, 408, 2472, 408, 2494, 2135, 780,
+ 369, 780, 780, 2471, 2136, 1817, 2476, 2473, 780, 2125,
+ 2137, 2493, 2480, 2126, 2495, 2477, 2497, 2478, 2481, 2482,
+ 8693, 2494, 8693, 780, 2483, 780, 1843, 1844, 2160, 2161,
+ 2505, 2506, 780, 8693, 2493, 2163, 2169, 780, 2477, 2497,
+
+ 2478, 2134, 2135, 2134, 2134, 2134, 2496, 2134, 2136, 1817,
+ 2134, 2134, 2134, 2134, 2137, 2134, 2134, 2134, 2134, 780,
+ 2498, 780, 780, 2500, 780, 780, 2704, 780, 2708, 2496,
+ 2499, 2503, 2163, 2158, 2165, 2501, 2505, 2508, 3324, 2166,
+ 2507, 2134, 8693, 780, 2498, 2848, 780, 2500, 780, 780,
+ 2704, 780, 2708, 2499, 2513, 2503, 1548, 8693, 2501, 2514,
+ 1855, 1549, 1550, 369, 2134, 368, 441, 369, 368, 368,
+ 426, 368, 443, 368, 368, 368, 368, 779, 368, 368,
+ 368, 368, 368, 780, 1843, 1844, 445, 445, 2175, 2176,
+ 2519, 2520, 2519, 2522, 2537, 2538, 8693, 2178, 2502, 2706,
+
+ 2491, 2517, 2179, 2521, 8693, 368, 2296, 780, 2199, 2202,
+ 445, 445, 2297, 2551, 2552, 1892, 8693, 2537, 2538, 2552,
+ 1892, 2502, 2706, 2491, 2517, 2553, 2217, 2224, 368, 368,
+ 441, 369, 368, 368, 426, 368, 443, 368, 368, 368,
+ 368, 779, 368, 368, 368, 368, 368, 8693, 1913, 369,
+ 2219, 2492, 445, 2533, 2534, 2535, 1326, 1321, 445, 2220,
+ 1321, 1326, 2220, 2536, 8693, 2539, 369, 445, 1312, 368,
+ 1346, 445, 2221, 1312, 445, 2492, 445, 2575, 1908, 445,
+ 8693, 1347, 445, 2222, 2540, 8693, 2536, 2242, 2245, 2539,
+ 2541, 445, 368, 1318, 1346, 445, 2221, 2625, 445, 1319,
+
+ 8693, 1320, 1321, 445, 1347, 1321, 2222, 2540, 445, 445,
+ 445, 2190, 797, 2544, 780, 1539, 797, 798, 1025, 797,
+ 2625, 798, 1025, 2546, 798, 1025, 1540, 445, 2545, 2606,
+ 1923, 8693, 445, 445, 445, 8693, 2191, 2544, 780, 1539,
+ 8693, 2192, 2208, 1326, 2542, 8693, 2546, 2209, 1889, 1540,
+ 1318, 445, 2545, 2543, 445, 1312, 1319, 369, 1320, 1321,
+ 2191, 445, 1321, 445, 2192, 8693, 2566, 2542, 2547, 2259,
+ 2260, 780, 1539, 2352, 2207, 2208, 2543, 2568, 445, 2353,
+ 2209, 1889, 2551, 1540, 369, 445, 2210, 445, 2552, 1892,
+ 2566, 2547, 2555, 2556, 2553, 780, 1539, 2562, 2557, 2558,
+
+ 2274, 2568, 2563, 2564, 2559, 369, 1540, 1318, 2627, 2628,
+ 8693, 2567, 2208, 1319, 2365, 1320, 1321, 2209, 1889, 1321,
+ 2366, 2230, 2221, 2565, 3615, 369, 2231, 1905, 780, 1539,
+ 2591, 3145, 2230, 2222, 2567, 2592, 2593, 2231, 1905, 2569,
+ 1540, 8693, 2251, 2627, 2630, 2620, 2221, 2252, 1920, 2230,
+ 2621, 2622, 780, 1539, 2231, 1905, 2222, 2644, 369, 2570,
+ 8693, 369, 2569, 1540, 368, 2515, 369, 368, 368, 442,
+ 368, 443, 368, 368, 368, 368, 444, 368, 368, 368,
+ 368, 368, 2570, 2594, 445, 445, 445, 445, 8693, 2230,
+ 2598, 369, 2640, 2251, 2231, 1905, 2597, 2601, 2252, 1920,
+
+ 369, 2596, 2272, 2276, 368, 8693, 2594, 2262, 445, 445,
+ 445, 445, 2263, 2629, 2598, 2640, 2282, 2650, 1945, 2597,
+ 2601, 2283, 1942, 2595, 2596, 2643, 2641, 368, 368, 441,
+ 369, 368, 368, 442, 368, 443, 368, 368, 368, 368,
+ 444, 368, 368, 368, 368, 368, 2595, 2516, 2643, 2641,
+ 2574, 2291, 2294, 369, 2574, 8693, 2575, 1908, 2707, 2576,
+ 2575, 1908, 2576, 2576, 369, 369, 2576, 8693, 368, 2251,
+ 2750, 2516, 2577, 2251, 2252, 1920, 2577, 8693, 2252, 1920,
+ 369, 2707, 2667, 2578, 2661, 2645, 2274, 2578, 2642, 2662,
+ 2663, 368, 2527, 2528, 2750, 369, 2577, 2709, 2529, 2173,
+
+ 2577, 2530, 8693, 2623, 2530, 2667, 2578, 2624, 2221, 2645,
+ 2578, 2282, 2642, 2666, 2531, 2668, 2283, 1942, 2300, 2222,
+ 2709, 2589, 2230, 2301, 1955, 2532, 2623, 2231, 1905, 8693,
+ 2624, 2373, 2221, 2674, 1958, 2685, 2666, 2374, 2531, 2668,
+ 2686, 2687, 2222, 2233, 8693, 2664, 369, 2274, 2532, 2206,
+ 2207, 2208, 2206, 2206, 2234, 2206, 2209, 1889, 2206, 2206,
+ 2206, 2206, 2210, 2206, 2206, 2206, 2206, 2233, 2664, 2221,
+ 2282, 2827, 2605, 2710, 2669, 2283, 1942, 2234, 2606, 1923,
+ 2222, 2607, 8693, 780, 2607, 2311, 369, 8693, 2692, 2206,
+ 8693, 443, 8693, 2221, 2608, 2827, 2710, 2669, 2715, 1992,
+
+ 8693, 369, 2336, 2222, 2665, 2609, 780, 2337, 2338, 2618,
+ 2251, 2692, 2206, 2229, 2230, 2252, 1920, 2605, 2608, 2231,
+ 1905, 2702, 2232, 2606, 1923, 2232, 2607, 2665, 2609, 2607,
+ 445, 2254, 2300, 2696, 369, 2233, 8693, 2301, 1955, 2608,
+ 369, 8693, 2255, 2712, 369, 2702, 2234, 369, 2713, 2714,
+ 2609, 2719, 1950, 369, 445, 2254, 2703, 2696, 2769, 2233,
+ 2754, 2635, 2636, 2608, 2770, 2255, 2688, 2637, 2257, 2234,
+ 2582, 2583, 2409, 2609, 1346, 2719, 2584, 2585, 2410, 2586,
+ 2703, 2722, 2586, 2638, 2754, 1347, 2697, 445, 8693, 2688,
+ 2300, 780, 2587, 8693, 2639, 2301, 1955, 2698, 1346, 2649,
+
+ 2312, 2313, 2313, 2588, 2722, 2650, 1945, 2638, 1347, 2421,
+ 2697, 445, 1251, 8693, 780, 2422, 2587, 2639, 2715, 1992,
+ 2698, 2651, 8693, 2325, 2689, 369, 2588, 796, 2238, 797,
+ 796, 796, 2652, 796, 798, 1025, 796, 796, 796, 796,
+ 796, 796, 796, 796, 796, 2651, 2355, 2689, 2326, 2717,
+ 2718, 2356, 2357, 2327, 8693, 2652, 2724, 2727, 8693, 2355,
+ 369, 780, 2728, 2729, 2731, 2008, 2761, 796, 2693, 2694,
+ 2695, 8693, 2326, 2715, 1992, 2733, 2327, 2362, 1698, 2724,
+ 2734, 2735, 2737, 2738, 780, 369, 445, 369, 2720, 2761,
+ 796, 796, 796, 797, 796, 796, 2239, 796, 798, 1025,
+
+ 796, 796, 796, 2599, 796, 796, 796, 796, 796, 369,
+ 445, 2720, 2281, 2282, 2649, 2721, 2725, 8693, 2283, 1942,
+ 2650, 1945, 2362, 1698, 2740, 2741, 2654, 2655, 2362, 1698,
+ 654, 796, 2656, 2657, 2284, 8693, 2651, 655, 2721, 2725,
+ 2778, 2343, 369, 2281, 2282, 2285, 8693, 2652, 2658, 2283,
+ 1942, 2699, 2700, 2701, 796, 2250, 2251, 8693, 2284, 2659,
+ 2651, 2252, 1920, 2778, 2253, 2284, 2344, 2253, 2285, 445,
+ 2652, 2345, 2658, 369, 2673, 8693, 2285, 2254, 2368, 2811,
+ 2674, 1958, 2659, 2369, 1709, 2752, 2753, 2371, 2255, 2284,
+ 2344, 2723, 2743, 445, 2345, 8693, 2675, 2744, 2745, 2285,
+
+ 2368, 2254, 2811, 2299, 2300, 2369, 1709, 2676, 2459, 2301,
+ 1955, 2255, 2611, 2612, 2460, 2723, 2372, 2747, 2613, 2614,
+ 2675, 2615, 2748, 2749, 2615, 2302, 2376, 369, 2390, 2391,
+ 2676, 2673, 2764, 2765, 2616, 8693, 2303, 2674, 1958, 2372,
+ 2678, 2679, 2378, 369, 8693, 2617, 2680, 2681, 2379, 2302,
+ 2838, 2756, 8693, 2675, 8693, 2377, 2757, 2758, 2616, 2303,
+ 2299, 2300, 2682, 3724, 2676, 2759, 2301, 1955, 2617, 780,
+ 3280, 780, 2812, 2683, 2838, 2760, 445, 2675, 2377, 1321,
+ 369, 8693, 2302, 2764, 2767, 8693, 2682, 2676, 1321, 2759,
+ 2762, 1321, 780, 2303, 780, 2812, 2683, 2393, 2760, 8693,
+
+ 445, 8693, 2394, 2766, 2404, 2407, 2302, 2448, 2400, 2401,
+ 2399, 2400, 2401, 2762, 2785, 2060, 2303, 368, 441, 369,
+ 368, 368, 426, 368, 443, 368, 368, 368, 368, 779,
+ 368, 368, 368, 368, 368, 2772, 2773, 780, 2416, 2419,
+ 445, 2774, 2388, 2780, 2772, 2799, 2068, 2772, 2413, 2510,
+ 1452, 2690, 8693, 2414, 2057, 2511, 1453, 368, 1454, 1321,
+ 780, 3324, 1321, 2784, 445, 2442, 2083, 2780, 2848, 2785,
+ 2060, 8693, 2784, 2413, 2690, 2784, 2824, 780, 2414, 2057,
+ 368, 368, 441, 369, 368, 368, 426, 368, 443, 368,
+ 368, 368, 368, 779, 368, 368, 368, 368, 368, 2824,
+
+ 780, 2775, 2776, 2777, 2412, 2413, 2817, 2818, 2828, 2691,
+ 2414, 2057, 2842, 2412, 1452, 8693, 2412, 8693, 2784, 445,
+ 1453, 368, 1454, 1321, 2785, 2060, 1321, 2784, 2787, 2788,
+ 2784, 2828, 2691, 2792, 2789, 2790, 2842, 2787, 2793, 2794,
+ 2787, 780, 8693, 445, 368, 368, 2316, 2317, 2318, 368,
+ 8693, 368, 443, 368, 368, 368, 368, 368, 1312, 368,
+ 368, 368, 368, 2798, 780, 2442, 2083, 2424, 2425, 2799,
+ 2068, 8693, 2798, 2426, 2065, 2798, 2424, 2829, 1452, 2424,
+ 2820, 2821, 2798, 8693, 1453, 368, 1454, 1321, 2799, 2068,
+ 1321, 2798, 2801, 2802, 2798, 2442, 2083, 2425, 2803, 2804,
+
+ 2829, 2801, 2426, 2065, 2801, 780, 2431, 369, 368, 368,
+ 368, 369, 368, 368, 620, 368, 368, 368, 368, 368,
+ 368, 621, 368, 368, 368, 368, 368, 2425, 780, 2806,
+ 654, 2432, 2426, 2065, 2807, 2808, 2433, 655, 2822, 654,
+ 2978, 654, 2839, 654, 2809, 654, 655, 2524, 655, 368,
+ 655, 2462, 655, 2525, 2813, 2432, 2463, 2103, 8693, 2433,
+ 8693, 2822, 8693, 369, 2978, 2839, 2450, 369, 2809, 2814,
+ 2810, 2815, 368, 368, 2399, 2400, 2401, 368, 2813, 368,
+ 443, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 2451, 2814, 2810, 2815, 2831, 2452, 2826, 2470, 369,
+
+ 2832, 2833, 2462, 2850, 369, 2835, 369, 2463, 2103, 8693,
+ 2836, 2837, 369, 368, 8693, 2451, 2632, 2845, 8693, 2452,
+ 2826, 407, 2633, 2846, 2481, 2482, 2850, 3615, 408, 1251,
+ 2854, 2855, 2825, 2840, 3145, 2841, 368, 368, 368, 369,
+ 368, 368, 681, 368, 368, 368, 368, 368, 368, 682,
+ 368, 368, 368, 368, 368, 2825, 2823, 2840, 2841, 1256,
+ 8693, 1256, 3142, 407, 8693, 407, 2486, 2864, 3143, 2847,
+ 408, 1251, 408, 1251, 407, 369, 2848, 368, 2857, 8693,
+ 2823, 408, 2481, 2482, 2858, 2859, 2866, 2855, 2861, 3724,
+ 2860, 2136, 1817, 8693, 2541, 2843, 3280, 2844, 8693, 2849,
+
+ 368, 368, 368, 369, 368, 368, 681, 368, 368, 368,
+ 368, 368, 368, 682, 368, 368, 368, 368, 368, 2843,
+ 2844, 2135, 2849, 8693, 2871, 407, 780, 2136, 1817, 2533,
+ 2534, 2535, 408, 2137, 2868, 780, 2977, 780, 8693, 780,
+ 2870, 368, 2505, 2508, 2880, 2161, 2851, 2513, 2871, 780,
+ 2880, 2161, 2514, 1855, 2880, 2161, 8693, 2868, 780, 2977,
+ 780, 780, 780, 2870, 368, 368, 2448, 2400, 2401, 368,
+ 2851, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 2869, 780, 2872, 8693, 780, 2769, 2873,
+ 780, 2874, 2876, 780, 2770, 780, 780, 2882, 2519, 2522,
+
+ 2875, 654, 2883, 2884, 3141, 368, 8693, 2869, 655, 2872,
+ 780, 780, 2873, 780, 2874, 2876, 780, 2513, 780, 780,
+ 2886, 8693, 2514, 1855, 2875, 2887, 2888, 3141, 368, 2479,
+ 2480, 2479, 2479, 2479, 780, 2479, 2481, 2482, 2479, 2479,
+ 2479, 2479, 2483, 2479, 2479, 2479, 2479, 2528, 2898, 2176,
+ 2912, 8693, 2529, 2173, 2528, 2913, 2914, 2552, 1892, 2529,
+ 2173, 8693, 2515, 369, 2533, 369, 2541, 369, 443, 2479,
+ 443, 369, 443, 2936, 2937, 2552, 1892, 8693, 2528, 8693,
+ 2528, 2938, 8693, 2529, 2173, 2529, 2173, 2889, 2931, 2932,
+ 369, 2919, 2479, 2134, 2134, 2134, 2134, 2134, 2484, 2134,
+
+ 2136, 1817, 2134, 2134, 2134, 2862, 2134, 2134, 2134, 2134,
+ 2134, 2889, 2915, 2556, 2916, 2919, 2936, 2954, 2557, 2558,
+ 797, 2962, 2923, 797, 2930, 798, 1025, 8693, 798, 2924,
+ 2931, 2932, 3147, 2134, 2941, 2915, 2933, 2916, 8693, 2942,
+ 2943, 2562, 2945, 2946, 2962, 2956, 2563, 2953, 2947, 2948,
+ 2957, 2943, 2925, 2926, 2949, 3147, 2134, 368, 2515, 369,
+ 368, 368, 426, 368, 443, 368, 368, 368, 368, 779,
+ 368, 368, 368, 368, 368, 2925, 2926, 2556, 2207, 2208,
+ 8693, 2208, 2557, 2558, 2209, 1889, 2209, 1889, 2950, 8693,
+ 2210, 3198, 2958, 2961, 369, 369, 8693, 368, 2959, 8693,
+
+ 368, 2575, 1908, 2973, 2974, 2575, 1908, 2966, 2967, 369,
+ 2973, 2995, 2575, 1908, 3198, 2960, 2575, 1908, 2606, 1923,
+ 368, 368, 441, 369, 368, 368, 426, 368, 443, 368,
+ 368, 368, 368, 779, 368, 368, 368, 368, 368, 2960,
+ 2963, 2975, 2583, 3148, 2981, 2976, 2583, 2584, 2585, 2982,
+ 2983, 2584, 2585, 2591, 2867, 3014, 3015, 3282, 2592, 2994,
+ 2997, 368, 8693, 2963, 2975, 2998, 2983, 3148, 2976, 2583,
+ 2606, 1923, 8693, 2583, 2584, 2585, 2230, 2867, 2584, 2585,
+ 3282, 2231, 1905, 369, 368, 368, 441, 369, 368, 368,
+ 442, 368, 443, 368, 368, 368, 368, 444, 368, 368,
+
+ 368, 368, 368, 2992, 2999, 2230, 8693, 2993, 3007, 3008,
+ 2231, 1905, 3065, 2890, 8693, 2606, 1923, 8693, 2606, 1923,
+ 3014, 3034, 3000, 2612, 654, 368, 2992, 2999, 2613, 2614,
+ 2993, 655, 3020, 8693, 2612, 3065, 2890, 3021, 3022, 2613,
+ 2614, 2627, 2630, 8693, 3016, 3283, 3000, 3017, 368, 368,
+ 2891, 369, 368, 368, 442, 368, 2892, 368, 2893, 1321,
+ 368, 444, 1321, 368, 368, 368, 368, 3016, 2897, 3283,
+ 3017, 3316, 1322, 8693, 2898, 2176, 368, 2899, 8693, 2612,
+ 2899, 2612, 368, 1323, 2613, 2614, 2613, 2614, 2620, 368,
+ 2900, 3047, 2260, 2621, 3033, 3316, 1322, 2910, 2528, 3064,
+
+ 369, 2901, 3036, 2529, 2173, 8693, 1323, 3037, 3022, 2644,
+ 369, 2897, 368, 3031, 2900, 3032, 8693, 2898, 2176, 2531,
+ 2899, 8693, 2251, 2899, 2901, 2527, 2528, 2252, 1920, 368,
+ 2532, 2529, 2173, 2900, 2530, 368, 3031, 2530, 3032, 3039,
+ 2917, 2650, 1945, 2531, 2901, 2636, 2918, 2531, 368, 368,
+ 2637, 2257, 1312, 2532, 3301, 3058, 8693, 2900, 2532, 2251,
+ 3059, 3060, 445, 3039, 2252, 1920, 8693, 2901, 2920, 369,
+ 8693, 2531, 369, 445, 443, 8693, 368, 368, 3301, 2636,
+ 368, 2532, 2903, 2904, 2637, 2257, 445, 3038, 2905, 2906,
+ 445, 2907, 3063, 2636, 2907, 8693, 445, 2927, 2637, 2257,
+
+ 8693, 445, 3066, 443, 2908, 368, 368, 3076, 3077, 368,
+ 3038, 2965, 8693, 3061, 445, 2909, 3063, 2966, 2967, 445,
+ 2968, 3071, 3072, 2968, 445, 3066, 2655, 3062, 2908, 3081,
+ 445, 2656, 2657, 2969, 3082, 3083, 3061, 369, 2909, 441,
+ 368, 2650, 1945, 445, 2970, 443, 368, 368, 368, 369,
+ 3062, 368, 3314, 445, 1326, 2650, 1945, 2969, 3315, 2661,
+ 443, 445, 368, 368, 2662, 3093, 1312, 2970, 2971, 2921,
+ 3078, 3101, 445, 3100, 2575, 1908, 445, 3076, 3094, 3102,
+ 369, 2674, 1958, 3096, 3079, 445, 8693, 445, 3097, 3083,
+ 2577, 8693, 2921, 3078, 3101, 445, 441, 3100, 8693, 369,
+
+ 445, 2578, 443, 1326, 368, 368, 8693, 3079, 368, 443,
+ 445, 368, 368, 8693, 2577, 1312, 3111, 3112, 445, 3103,
+ 8693, 2679, 3067, 369, 2578, 445, 2680, 2681, 3068, 445,
+ 2922, 3106, 3107, 8693, 2979, 2583, 445, 3111, 3129, 3003,
+ 2584, 2585, 445, 3103, 1346, 443, 8693, 368, 368, 445,
+ 8693, 368, 445, 2922, 441, 1347, 2587, 3149, 3150, 445,
+ 443, 445, 368, 368, 3116, 2845, 368, 2588, 1346, 3117,
+ 3118, 2846, 445, 3139, 1095, 1096, 445, 1251, 1347, 2928,
+ 2587, 3149, 3150, 3040, 369, 445, 8693, 445, 2685, 3041,
+ 2588, 3042, 2282, 2686, 3128, 445, 3064, 2283, 1942, 369,
+
+ 445, 2655, 368, 2928, 8693, 1346, 2656, 2657, 369, 3099,
+ 445, 2550, 2551, 2550, 2550, 2550, 1347, 2550, 2552, 1892,
+ 2550, 2550, 2550, 2550, 2553, 2550, 2550, 2550, 2550, 1346,
+ 2693, 369, 3167, 3099, 3161, 3091, 443, 2655, 8693, 1347,
+ 3131, 8693, 2656, 2657, 2282, 3132, 3118, 2589, 2230, 2283,
+ 1942, 2550, 8693, 2231, 1905, 3167, 2300, 3161, 3091, 2699,
+ 369, 2301, 1955, 3152, 3153, 443, 8693, 2674, 1958, 2233,
+ 8693, 3092, 3098, 3134, 2550, 2554, 2555, 2556, 2554, 2554,
+ 2234, 2554, 2557, 2558, 2554, 2554, 2554, 2554, 2559, 2554,
+ 2554, 2554, 2554, 2233, 3092, 3098, 3113, 3134, 2717, 2718,
+
+ 2717, 3158, 2679, 2234, 3102, 2674, 1958, 2680, 2681, 3136,
+ 368, 3155, 3323, 780, 8693, 2554, 3156, 3157, 8693, 3113,
+ 3160, 3153, 2336, 8693, 2679, 3162, 369, 2337, 2338, 2680,
+ 2681, 3163, 8693, 3136, 3114, 3323, 3126, 780, 2554, 2206,
+ 2206, 2208, 2206, 2206, 2560, 2206, 2209, 1889, 2206, 2206,
+ 2206, 2951, 2206, 2206, 2206, 2206, 2206, 3114, 3127, 3126,
+ 3006, 3149, 3150, 2699, 2700, 2701, 3007, 3008, 3012, 3009,
+ 369, 369, 3009, 3462, 2606, 1923, 2717, 3158, 8693, 2206,
+ 8693, 3127, 3010, 2300, 780, 3018, 2612, 8693, 2301, 1955,
+ 2608, 2613, 2614, 3011, 2727, 3168, 3462, 3140, 441, 3170,
+
+ 3171, 2609, 2206, 2985, 2986, 8693, 3010, 2616, 780, 2987,
+ 2988, 3133, 2989, 8693, 2608, 2989, 3011, 8693, 2617, 3168,
+ 3140, 3173, 2618, 2251, 2609, 2990, 3174, 3175, 2252, 1920,
+ 8693, 2616, 3177, 3337, 3133, 8693, 2991, 3178, 3179, 8693,
+ 3046, 2617, 2737, 2738, 2254, 3144, 3047, 2260, 2355, 2990,
+ 3185, 3186, 3145, 2731, 2008, 2255, 3337, 2635, 2636, 2991,
+ 2229, 2230, 3048, 2637, 2257, 2733, 2231, 1905, 2254, 2232,
+ 2734, 2735, 2232, 3049, 3614, 3146, 1697, 1698, 2255, 2638,
+ 2740, 3187, 2233, 3189, 3186, 3046, 3048, 8693, 3051, 3052,
+ 2639, 3047, 2260, 2234, 3053, 3054, 3049, 3614, 3146, 2733,
+
+ 2362, 1698, 3070, 2638, 2734, 3180, 2233, 3048, 3071, 3072,
+ 3055, 2737, 2738, 2639, 3182, 441, 2234, 441, 3049, 3183,
+ 3175, 3056, 2355, 443, 3073, 368, 368, 2356, 2357, 368,
+ 3142, 3048, 2743, 369, 3055, 3074, 3143, 2744, 2745, 445,
+ 407, 3049, 3001, 369, 3056, 2635, 2636, 408, 3073, 3335,
+ 445, 2637, 2257, 3228, 2649, 2740, 3187, 3319, 3074, 8693,
+ 2650, 1945, 3105, 445, 3164, 369, 3001, 2638, 3106, 3107,
+ 3203, 3165, 3335, 445, 441, 8693, 2651, 3228, 2639, 3649,
+ 443, 3319, 368, 368, 3108, 3650, 368, 2652, 2752, 3199,
+ 8693, 2638, 3191, 3203, 3166, 3109, 445, 3192, 3193, 1707,
+
+ 2651, 2639, 3201, 3202, 1708, 1709, 2747, 445, 3108, 3002,
+ 2652, 2748, 3194, 2752, 3199, 369, 3196, 3166, 3109, 2368,
+ 445, 3197, 3193, 2756, 2369, 1709, 2764, 2767, 2757, 3204,
+ 445, 3317, 3002, 796, 796, 797, 796, 796, 796, 796,
+ 798, 1025, 796, 796, 796, 8693, 796, 796, 796, 796,
+ 796, 3206, 3217, 3218, 2391, 3317, 3207, 3208, 3218, 2391,
+ 2773, 3217, 2785, 2060, 3217, 2774, 2388, 8693, 2772, 2773,
+ 441, 369, 368, 796, 2774, 2388, 3217, 2772, 2785, 2060,
+ 2772, 2773, 3218, 2391, 3225, 3217, 2774, 2388, 3217, 3226,
+ 3227, 3210, 3239, 3240, 3236, 3237, 796, 796, 796, 797,
+
+ 796, 796, 2239, 796, 798, 1025, 796, 796, 796, 2599,
+ 796, 796, 796, 796, 796, 3210, 2654, 2655, 3085, 3086,
+ 2281, 2282, 2656, 2657, 3087, 3088, 2283, 1942, 2775, 369,
+ 2788, 3239, 3251, 369, 443, 2789, 2790, 796, 2658, 2788,
+ 3089, 3242, 2284, 8693, 2789, 2790, 3243, 3244, 3277, 2659,
+ 2792, 3090, 3253, 2285, 3278, 2793, 3250, 3254, 3244, 2220,
+ 796, 441, 2658, 441, 3089, 3442, 2284, 443, 2220, 368,
+ 368, 2220, 2659, 368, 3090, 3846, 2285, 2799, 2068, 369,
+ 2673, 3847, 3004, 445, 2799, 2068, 2674, 1958, 3442, 2678,
+ 2679, 3260, 3261, 3334, 445, 2680, 2681, 3318, 3120, 3121,
+
+ 3257, 3258, 2675, 3235, 3122, 3123, 3004, 445, 3879, 3236,
+ 3237, 2682, 3235, 2676, 3880, 3235, 3334, 445, 3024, 3025,
+ 3124, 3318, 2683, 2802, 3026, 3027, 2675, 3028, 2803, 2804,
+ 3028, 3125, 2802, 3260, 3272, 2682, 2676, 2803, 2804, 8693,
+ 3029, 2817, 2818, 3461, 3124, 2683, 2299, 2300, 8693, 3220,
+ 3221, 3030, 2301, 1955, 3125, 3222, 3223, 3263, 3220, 8693,
+ 2806, 3220, 3264, 3265, 3029, 2807, 3271, 3461, 2302, 3285,
+ 3286, 3246, 3247, 8693, 3030, 2250, 2251, 3248, 3249, 2303,
+ 3246, 2252, 1920, 3246, 2253, 3288, 3289, 2253, 3274, 2412,
+ 2413, 8693, 2302, 3275, 3265, 2414, 2057, 2254, 2412, 8693,
+
+ 3256, 2412, 2303, 8693, 3267, 3268, 3257, 3258, 2255, 3256,
+ 3269, 3270, 3256, 3267, 2820, 3290, 3267, 2424, 2425, 3292,
+ 3286, 2254, 369, 2426, 2065, 8693, 2424, 2442, 2083, 2424,
+ 8693, 2255, 368, 2693, 2694, 2695, 368, 426, 368, 443,
+ 368, 368, 368, 368, 779, 368, 368, 368, 368, 368,
+ 3277, 8693, 2831, 3145, 654, 3300, 3278, 2832, 2833, 2817,
+ 2818, 655, 3279, 2820, 3290, 3303, 2470, 369, 654, 3280,
+ 3304, 3305, 368, 369, 3307, 655, 2835, 3145, 3300, 3308,
+ 3309, 2836, 3310, 3312, 3321, 3322, 2854, 2855, 3313, 3305,
+ 8693, 3276, 3281, 3293, 8693, 368, 368, 441, 369, 368,
+
+ 368, 426, 368, 443, 368, 368, 368, 368, 779, 368,
+ 368, 368, 368, 368, 3276, 3281, 2462, 3293, 3135, 2854,
+ 2855, 2463, 2103, 2480, 8693, 3297, 369, 2847, 3616, 2481,
+ 2482, 3723, 3298, 3754, 2848, 2483, 368, 2858, 2859, 3330,
+ 3331, 2135, 3135, 2858, 2859, 2481, 2482, 2136, 1817, 3332,
+ 2866, 3333, 3616, 2137, 3723, 3299, 3754, 2849, 441, 368,
+ 368, 3137, 1095, 1096, 368, 442, 368, 443, 368, 368,
+ 368, 368, 444, 368, 368, 368, 368, 368, 3299, 407,
+ 2849, 2866, 2855, 3336, 3340, 3341, 408, 2880, 2161, 3343,
+ 3344, 3340, 3341, 2882, 369, 3325, 3346, 441, 2883, 2884,
+
+ 368, 3347, 3348, 1853, 8693, 2886, 8693, 3336, 1854, 1855,
+ 2887, 3349, 3343, 3350, 8693, 3352, 2898, 2176, 3338, 3325,
+ 3353, 3348, 3354, 368, 368, 441, 369, 368, 368, 442,
+ 368, 443, 368, 368, 368, 368, 444, 368, 368, 368,
+ 368, 368, 3338, 2513, 3905, 3354, 3358, 8693, 2514, 1855,
+ 3906, 3359, 3360, 3138, 3361, 369, 3373, 3374, 2898, 2176,
+ 3362, 2904, 3366, 3367, 368, 3363, 2905, 2906, 3379, 3373,
+ 3393, 1897, 369, 3380, 3381, 8693, 3138, 2898, 2176, 2898,
+ 2176, 2931, 2932, 1312, 3412, 3413, 8693, 368, 368, 441,
+ 369, 368, 368, 426, 368, 443, 368, 368, 368, 368,
+
+ 779, 368, 368, 368, 368, 368, 3375, 2904, 3376, 3640,
+ 2912, 3747, 2905, 2906, 2904, 2913, 3392, 3395, 3415, 2905,
+ 2906, 3209, 3396, 3381, 3416, 3417, 2936, 2954, 368, 3375,
+ 3418, 3376, 2528, 3640, 3400, 3747, 2904, 2529, 2173, 3401,
+ 3402, 2905, 2906, 2541, 3209, 3423, 3413, 8693, 3390, 3398,
+ 8693, 368, 368, 2775, 2776, 2777, 368, 426, 368, 443,
+ 368, 368, 368, 368, 779, 368, 368, 368, 368, 368,
+ 3391, 3390, 369, 3398, 3405, 3407, 797, 445, 445, 2931,
+ 2932, 798, 2924, 2528, 8693, 3419, 2552, 1892, 2529, 2173,
+ 3403, 2941, 368, 3391, 3412, 3413, 2942, 2943, 3405, 2941,
+
+ 445, 445, 8693, 797, 2942, 2943, 2923, 797, 798, 1025,
+ 8693, 3397, 798, 2924, 3403, 368, 368, 3211, 369, 368,
+ 368, 442, 368, 3212, 368, 3213, 1321, 368, 444, 1321,
+ 368, 368, 368, 368, 3397, 2946, 2925, 3406, 3409, 2551,
+ 2947, 2948, 2555, 2556, 3978, 2552, 1892, 445, 2557, 2558,
+ 3979, 2553, 3416, 3417, 2559, 4003, 368, 8693, 3428, 2925,
+ 3406, 4004, 3409, 3429, 3430, 1897, 369, 2946, 8693, 2556,
+ 445, 8693, 2947, 2948, 2557, 2558, 8693, 1312, 3431, 368,
+ 368, 3229, 2400, 2401, 368, 2779, 368, 368, 368, 368,
+ 368, 368, 3230, 368, 368, 368, 368, 368, 2207, 2208,
+
+ 2551, 3423, 3433, 2956, 2209, 1889, 2552, 1892, 2957, 3432,
+ 2210, 2956, 2553, 3436, 369, 369, 2957, 2943, 3437, 3438,
+ 368, 2966, 2967, 3446, 3447, 2966, 2967, 2973, 2995, 8693,
+ 369, 3458, 3447, 8693, 2966, 2967, 8693, 2966, 2967, 3446,
+ 3447, 3860, 3439, 368, 368, 3232, 369, 368, 368, 442,
+ 368, 3233, 368, 368, 1321, 368, 444, 1321, 368, 368,
+ 368, 368, 3443, 3455, 3860, 3439, 3456, 2981, 3874, 2981,
+ 2575, 1908, 2982, 2983, 2982, 2983, 3450, 3451, 3458, 3473,
+ 2575, 1908, 3460, 8693, 368, 3443, 3455, 2986, 8693, 3456,
+ 3465, 3874, 2987, 2988, 2986, 3466, 3467, 3007, 3008, 2987,
+
+ 2988, 3480, 3481, 3459, 3007, 3008, 3460, 368, 368, 368,
+ 369, 368, 368, 681, 368, 368, 368, 368, 368, 368,
+ 682, 368, 368, 368, 368, 368, 3459, 3014, 3034, 3492,
+ 3481, 3480, 3481, 2986, 8693, 2986, 3294, 2997, 2987, 2988,
+ 2987, 2988, 2998, 3472, 2997, 3484, 3485, 8693, 368, 2998,
+ 2983, 8693, 2230, 3492, 3505, 8693, 3020, 2231, 1905, 3294,
+ 2230, 3021, 3022, 3047, 2260, 2231, 1905, 3468, 8693, 3469,
+ 3474, 368, 368, 3295, 369, 368, 368, 681, 368, 3296,
+ 368, 368, 368, 368, 682, 368, 368, 368, 368, 368,
+ 3468, 3475, 3469, 2583, 3474, 3020, 3512, 369, 2584, 2585,
+
+ 3021, 3022, 3513, 2583, 3007, 3008, 8693, 3514, 2584, 2585,
+ 3471, 3025, 368, 3497, 3475, 3025, 3026, 3027, 3498, 3499,
+ 3026, 3027, 3522, 3523, 3517, 3518, 3522, 3540, 3007, 3008,
+ 2541, 3470, 8693, 3489, 3471, 368, 2479, 2479, 2479, 2479,
+ 2479, 2852, 2479, 2481, 2482, 2479, 2479, 2479, 3326, 2479,
+ 2479, 2479, 2479, 2479, 3470, 780, 3489, 3490, 8693, 2606,
+ 1923, 3036, 4022, 3025, 3071, 3072, 3037, 3504, 3026, 3027,
+ 8693, 3494, 2958, 2606, 1923, 3875, 2479, 3036, 2959, 780,
+ 3490, 1321, 3037, 3022, 1321, 3509, 4022, 3025, 3554, 3555,
+ 3510, 3511, 3026, 3027, 1539, 3494, 3493, 3500, 3875, 2479,
+
+ 2856, 2857, 2856, 2856, 2856, 1540, 2856, 2858, 2859, 2856,
+ 2856, 2856, 2856, 2860, 2856, 2856, 2856, 2856, 1539, 3493,
+ 3500, 3501, 3076, 3094, 3052, 3565, 3555, 3527, 1540, 3053,
+ 3054, 2612, 3528, 3529, 3554, 3555, 2613, 2614, 3558, 3559,
+ 2856, 3058, 8693, 2251, 3501, 3542, 3059, 3539, 2252, 1920,
+ 3543, 3529, 2251, 8693, 3356, 369, 8693, 2252, 1920, 3502,
+ 2892, 3506, 2893, 2856, 2134, 2134, 2134, 2134, 2134, 2134,
+ 2134, 2136, 1817, 2134, 2134, 2134, 1346, 2134, 2134, 2134,
+ 2134, 2134, 3502, 3507, 2612, 3506, 3550, 1347, 8693, 2613,
+ 2614, 3551, 3552, 4037, 3047, 2260, 4151, 3047, 2260, 4038,
+
+ 1346, 3503, 3081, 8693, 2134, 8693, 3507, 3082, 3083, 3081,
+ 1347, 3565, 3577, 3052, 3082, 3083, 3052, 8693, 3053, 3054,
+ 4151, 3053, 3054, 3524, 369, 3503, 3525, 2134, 2134, 2134,
+ 2134, 2134, 2134, 2484, 2134, 2136, 1817, 2134, 2134, 2134,
+ 2862, 2134, 2134, 2134, 2134, 2134, 3524, 3537, 369, 3525,
+ 3538, 3086, 3547, 2644, 369, 3569, 3087, 3088, 4021, 2636,
+ 3570, 3571, 3106, 3107, 2637, 2257, 3546, 8693, 2134, 8693,
+ 3537, 2636, 3649, 3538, 3096, 3547, 2637, 2257, 3650, 3097,
+ 3576, 4021, 3071, 3072, 369, 3583, 3584, 3544, 3545, 369,
+ 3546, 2134, 368, 2891, 369, 368, 368, 426, 368, 2892,
+
+ 368, 2893, 1321, 368, 779, 1321, 368, 368, 368, 368,
+ 3544, 3562, 3545, 3548, 3096, 1539, 8693, 3581, 8693, 3097,
+ 3083, 8693, 3071, 3072, 3111, 3129, 1540, 3594, 3584, 2650,
+ 1945, 4122, 368, 8693, 3562, 3583, 3584, 3548, 3116, 1539,
+ 3581, 2650, 1945, 3117, 3118, 3587, 3588, 369, 369, 1540,
+ 8693, 3563, 3566, 3567, 4122, 368, 368, 2920, 369, 368,
+ 368, 426, 368, 443, 368, 368, 368, 368, 779, 368,
+ 368, 368, 368, 368, 3563, 3566, 3580, 3567, 2674, 1958,
+ 4169, 3086, 3627, 3086, 3594, 3606, 3087, 3088, 3087, 3088,
+ 3596, 8693, 3116, 3612, 3613, 3121, 368, 3117, 3118, 3580,
+
+ 3122, 3123, 3598, 4169, 3131, 3627, 3131, 3599, 3600, 3132,
+ 3605, 3132, 3118, 8693, 3596, 3572, 8693, 3573, 4285, 368,
+ 368, 441, 369, 368, 368, 442, 368, 443, 368, 368,
+ 368, 368, 444, 368, 368, 368, 368, 368, 3572, 3365,
+ 3573, 4285, 3355, 3371, 8693, 3366, 3367, 2655, 3368, 2898,
+ 2176, 3368, 2656, 2657, 369, 3106, 3107, 3377, 2904, 8693,
+ 368, 3369, 2282, 2905, 2906, 2900, 3355, 2283, 1942, 3139,
+ 1095, 1096, 3370, 3152, 3153, 3574, 2901, 3152, 3153, 2908,
+ 3578, 3144, 3957, 368, 3591, 3369, 2910, 2528, 3145, 2900,
+ 2909, 4102, 2529, 2173, 8693, 3370, 2961, 4103, 3574, 2901,
+
+ 3434, 369, 368, 2908, 3578, 3957, 2959, 3591, 2531, 3106,
+ 3107, 3146, 4600, 2909, 3383, 3384, 8693, 3440, 3444, 2532,
+ 3385, 3386, 1346, 3387, 2966, 2967, 3387, 3441, 1592, 2674,
+ 1958, 4113, 2531, 1347, 3146, 4600, 3388, 4114, 3592, 3121,
+ 2969, 3440, 2532, 8693, 3122, 3123, 1346, 3389, 8693, 2300,
+ 3441, 2970, 3595, 4775, 2301, 1955, 1347, 1950, 369, 2971,
+ 3388, 3592, 2979, 2583, 2969, 2575, 1908, 3607, 2584, 2585,
+ 3389, 2527, 2528, 3601, 2970, 3595, 4775, 2529, 2173, 1346,
+ 2530, 2577, 2655, 2530, 2587, 3152, 3153, 2656, 2657, 8693,
+ 1347, 3607, 2578, 2531, 8693, 2588, 3601, 3617, 3618, 3575,
+
+ 3449, 3617, 3618, 1346, 2532, 2577, 3450, 3451, 2587, 3452,
+ 3620, 3621, 3452, 1347, 8693, 2578, 8693, 2531, 2588, 8693,
+ 2282, 8693, 3453, 3575, 8693, 2283, 1942, 2532, 368, 2917,
+ 369, 368, 368, 3454, 368, 2918, 368, 368, 368, 368,
+ 368, 1312, 368, 368, 368, 368, 3453, 2300, 2574, 3160,
+ 3622, 3579, 2301, 1955, 2575, 1908, 3454, 2576, 3160, 3153,
+ 2576, 3121, 3628, 369, 1913, 369, 3122, 3123, 368, 3165,
+ 2577, 3162, 369, 1321, 3579, 8693, 1321, 3163, 3608, 3152,
+ 3153, 2578, 3155, 3463, 2986, 8693, 1346, 3156, 3157, 2987,
+ 2988, 368, 2920, 369, 2577, 3602, 8693, 1347, 443, 3617,
+
+ 3618, 3608, 2712, 4138, 2578, 2990, 8693, 2713, 2714, 4139,
+ 1346, 475, 476, 1589, 478, 8693, 2991, 479, 3602, 480,
+ 1347, 3160, 3622, 1590, 1591, 483, 484, 2679, 4178, 2990,
+ 3185, 3186, 2680, 2681, 4179, 475, 476, 1589, 478, 2991,
+ 8693, 479, 480, 8693, 3604, 8693, 1590, 1592, 483, 484,
+ 368, 441, 369, 368, 368, 442, 368, 443, 368, 368,
+ 368, 368, 444, 368, 368, 368, 368, 368, 3604, 2336,
+ 8693, 3624, 8693, 2727, 2337, 2338, 3625, 3626, 3170, 3171,
+ 3404, 8693, 2679, 3185, 3186, 4170, 2574, 2680, 2681, 780,
+ 368, 369, 2575, 1908, 3173, 2576, 3177, 8693, 2576, 3174,
+
+ 3175, 3178, 3179, 3404, 2737, 2738, 2362, 1698, 2577, 4170,
+ 3603, 3165, 780, 368, 368, 2927, 369, 368, 368, 2578,
+ 368, 443, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 2577, 3603, 3173, 3165, 3189, 3638, 3173, 3174,
+ 3175, 2727, 2578, 3174, 3175, 8693, 2728, 2729, 3189, 3186,
+ 3478, 3185, 3186, 3177, 368, 369, 3007, 3008, 3631, 3632,
+ 3634, 8693, 2355, 8693, 3182, 3635, 3636, 2356, 2357, 3183,
+ 3637, 8693, 3010, 8693, 3629, 1950, 369, 368, 2929, 2930,
+ 2929, 2929, 2929, 3011, 2929, 2931, 2932, 2929, 2929, 2929,
+ 2929, 2933, 2929, 2929, 2929, 2929, 3010, 1346, 3629, 3182,
+
+ 3189, 3638, 3201, 3641, 3183, 3175, 3011, 3191, 1347, 3164,
+ 369, 369, 3192, 3193, 3191, 8693, 3165, 2743, 2929, 3192,
+ 3193, 1346, 2744, 2745, 2368, 3645, 3199, 3196, 8693, 2369,
+ 1709, 1347, 3197, 3639, 3201, 3641, 3218, 2391, 4759, 3166,
+ 4284, 2929, 2550, 2550, 2550, 2550, 2550, 2934, 2550, 2552,
+ 1892, 2550, 2550, 2550, 3420, 2550, 2550, 2550, 2550, 2550,
+ 3196, 4759, 3166, 3206, 4284, 3197, 3193, 3652, 3207, 3647,
+ 3654, 369, 3653, 3204, 3218, 2391, 3212, 4208, 3213, 3656,
+ 369, 4776, 2550, 4209, 3657, 3658, 3659, 369, 3221, 3663,
+ 3667, 3668, 3660, 3222, 3223, 3664, 3665, 3661, 3663, 8693,
+
+ 3646, 3663, 3664, 3665, 4776, 2550, 2554, 2554, 2556, 2554,
+ 2554, 2939, 2554, 2557, 2558, 2554, 2554, 2554, 3424, 2554,
+ 2554, 2554, 2554, 2554, 3646, 3221, 8693, 3670, 3674, 3675,
+ 3222, 3223, 3671, 3672, 3676, 3677, 8693, 3674, 3225, 4225,
+ 3674, 8693, 3483, 3226, 3678, 4226, 2554, 369, 3484, 3485,
+ 3681, 3486, 3667, 3679, 3486, 3682, 3672, 3229, 2400, 2401,
+ 3684, 369, 3686, 8693, 3487, 3683, 3233, 3687, 3688, 2554,
+ 2944, 2945, 2946, 2944, 2944, 3488, 2944, 2947, 2948, 2944,
+ 2944, 2944, 2944, 2949, 2944, 2944, 2944, 2944, 3487, 3683,
+ 2772, 2773, 3236, 3237, 3236, 3237, 2774, 2388, 3488, 2772,
+
+ 3690, 3691, 2772, 3239, 3251, 3693, 3697, 3691, 369, 2784,
+ 2944, 3694, 3695, 3846, 3693, 2785, 2060, 3693, 2784, 3847,
+ 3242, 2784, 3690, 3691, 3012, 3243, 3244, 3694, 3695, 8693,
+ 2606, 1923, 3825, 2944, 2206, 2206, 2208, 2206, 2206, 2206,
+ 2206, 2209, 1889, 2206, 2206, 2206, 2608, 2206, 2206, 2206,
+ 2206, 2206, 369, 3242, 2787, 2788, 3825, 2609, 3243, 3244,
+ 2789, 2790, 3247, 2787, 3697, 3703, 2787, 3248, 3249, 4260,
+ 2608, 3247, 3749, 3699, 2206, 4261, 3248, 3249, 3700, 3701,
+ 2609, 1321, 369, 3253, 3257, 3258, 3253, 8693, 3254, 3702,
+ 1321, 3254, 3244, 1321, 3257, 3258, 3749, 2206, 2206, 2206,
+
+ 2208, 2206, 2206, 2560, 2206, 2209, 1889, 2206, 2206, 2206,
+ 2951, 2206, 2206, 2206, 2206, 2206, 3705, 3706, 8693, 2605,
+ 3260, 3272, 8693, 2412, 2413, 2606, 1923, 8693, 2607, 2414,
+ 2057, 2607, 2412, 3018, 2612, 2412, 2784, 4976, 2206, 2613,
+ 2614, 2608, 2785, 2060, 8693, 2784, 3712, 3706, 2784, 369,
+ 3495, 3025, 2609, 3705, 3706, 2616, 3026, 3027, 1913, 369,
+ 4976, 2206, 2582, 2583, 8693, 2608, 2617, 1321, 2584, 2585,
+ 1321, 2586, 3029, 8693, 2586, 2609, 3709, 3710, 8693, 2616,
+ 1346, 3708, 3774, 3030, 2587, 3712, 3718, 3709, 3710, 2617,
+ 3708, 1347, 3263, 3708, 3263, 2588, 3029, 3264, 3265, 3264,
+
+ 3265, 3040, 369, 8693, 1346, 3774, 3030, 3041, 2587, 3042,
+ 3516, 3721, 3722, 8693, 1347, 2605, 3517, 3518, 2588, 2229,
+ 2230, 2606, 1923, 1346, 2607, 2231, 1905, 2607, 2232, 8693,
+ 3268, 2232, 3519, 2798, 1347, 3269, 3270, 2608, 8693, 2799,
+ 2068, 2233, 2798, 3520, 3268, 2798, 8693, 1346, 2609, 3269,
+ 3270, 2220, 2234, 3714, 3285, 3286, 3519, 1347, 3715, 3716,
+ 2220, 2608, 3274, 2220, 3274, 2233, 3520, 3275, 3717, 3275,
+ 3265, 2609, 3285, 3286, 369, 2234, 368, 441, 369, 368,
+ 368, 442, 368, 443, 368, 368, 368, 368, 444, 368,
+ 368, 368, 368, 368, 2801, 2802, 1321, 369, 2817, 2818,
+
+ 2803, 2804, 3989, 2801, 8693, 1321, 2801, 3476, 1321, 3288,
+ 3289, 2424, 2425, 3727, 3728, 2798, 368, 2426, 2065, 654,
+ 2424, 2799, 2068, 2424, 2798, 3989, 655, 2798, 3279, 8693,
+ 3476, 2442, 2083, 3292, 3729, 3280, 3719, 3292, 3286, 368,
+ 368, 441, 369, 368, 368, 442, 368, 443, 368, 368,
+ 368, 368, 444, 368, 368, 368, 368, 368, 3281, 3879,
+ 3719, 3046, 8693, 3051, 3052, 3880, 3070, 3047, 2260, 3053,
+ 3054, 8693, 3071, 3072, 369, 3477, 3314, 369, 3295, 369,
+ 368, 3281, 3315, 3048, 3296, 3055, 3732, 3905, 3073, 3285,
+ 3286, 3733, 3734, 3906, 3049, 3303, 3056, 8693, 3477, 3074,
+
+ 3304, 3305, 369, 368, 2611, 2612, 8693, 3048, 3735, 3055,
+ 2613, 2614, 3073, 2615, 3736, 369, 2615, 3049, 654, 3056,
+ 3748, 3298, 3074, 3531, 3532, 655, 2616, 3288, 3289, 3533,
+ 3534, 3735, 2635, 2636, 3725, 3292, 3729, 2617, 2637, 2257,
+ 4444, 3067, 369, 3303, 3748, 3535, 2831, 3068, 3304, 3305,
+ 2616, 2832, 2833, 4332, 2638, 8693, 3536, 8693, 3725, 4333,
+ 2617, 2250, 2251, 1346, 4444, 2639, 3307, 2252, 1920, 3535,
+ 2253, 3308, 3309, 2253, 1347, 3739, 3314, 369, 2638, 3536,
+ 3740, 3741, 3315, 2254, 3297, 369, 3557, 1346, 2639, 2649,
+ 8693, 3298, 3558, 3559, 2255, 2650, 1945, 1347, 2654, 2655,
+
+ 3321, 3750, 3752, 3753, 2656, 2657, 369, 2254, 3560, 8693,
+ 2462, 2651, 3330, 3758, 3299, 2463, 2103, 2255, 2649, 3561,
+ 2658, 369, 2652, 8693, 2650, 1945, 4152, 3085, 3086, 3762,
+ 2859, 2659, 3560, 3087, 3088, 2651, 8693, 3299, 2858, 2859,
+ 2651, 4171, 3561, 369, 2658, 2652, 2281, 2282, 8693, 3089,
+ 4152, 2652, 2283, 1942, 2659, 3105, 3340, 3341, 3768, 3769,
+ 3090, 3106, 3107, 3586, 2651, 4171, 3312, 3862, 2284, 3587,
+ 3588, 3313, 3742, 3089, 2652, 2673, 8693, 3108, 8693, 2285,
+ 8693, 2674, 1958, 3090, 3312, 3589, 2160, 2161, 3109, 3313,
+ 3305, 3862, 2284, 2678, 2679, 8693, 3590, 2675, 3744, 2680,
+
+ 2681, 3108, 2285, 3745, 3746, 8693, 1256, 8693, 2676, 3589,
+ 407, 3109, 3343, 3350, 4360, 2682, 8693, 408, 1251, 3590,
+ 4361, 2675, 3120, 3121, 3771, 3769, 2683, 8693, 3122, 3123,
+ 2673, 2676, 8693, 780, 2299, 2300, 2674, 1958, 3765, 2682,
+ 2301, 1955, 8693, 8693, 3124, 3346, 407, 2880, 2161, 2683,
+ 3347, 3348, 2675, 408, 8693, 3125, 2302, 780, 2480, 3755,
+ 4379, 3765, 8693, 2676, 2481, 2482, 4380, 2303, 3124, 3346,
+ 2483, 3768, 3769, 8693, 3347, 3348, 2675, 8693, 3125, 2882,
+ 2302, 369, 2513, 3755, 2883, 2884, 2676, 2514, 1855, 8693,
+ 2303, 368, 3137, 1095, 1096, 368, 426, 368, 443, 368,
+
+ 368, 368, 368, 779, 368, 368, 368, 368, 368, 780,
+ 2880, 2161, 3771, 3773, 3352, 4602, 3352, 8693, 3766, 3353,
+ 3772, 3353, 3348, 3358, 3777, 3778, 3361, 369, 3359, 3775,
+ 3780, 368, 3362, 780, 3784, 3781, 3782, 3363, 4602, 3785,
+ 3786, 3766, 3366, 3367, 3789, 3790, 3366, 3367, 3366, 3367,
+ 3366, 3367, 3373, 3393, 368, 368, 441, 369, 368, 368,
+ 426, 368, 443, 368, 368, 368, 368, 779, 368, 368,
+ 368, 368, 368, 3801, 3790, 2898, 2176, 3798, 5146, 3799,
+ 3379, 3789, 3790, 3379, 3609, 3380, 3381, 3803, 3380, 3381,
+ 3978, 3356, 369, 2898, 2176, 368, 3979, 2892, 3384, 2893,
+
+ 3798, 5146, 3799, 3385, 3386, 3793, 3794, 3609, 8693, 3806,
+ 8693, 3803, 8693, 1346, 3807, 3808, 3802, 8693, 368, 368,
+ 3137, 1095, 1096, 368, 1347, 368, 443, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 1346, 3384, 3802,
+ 3801, 3814, 8693, 3385, 3386, 3384, 8693, 1347, 3395, 8693,
+ 3385, 3386, 2904, 3396, 3813, 3395, 8693, 2905, 2906, 368,
+ 3396, 3381, 3819, 3820, 2904, 3412, 3413, 3384, 8693, 2905,
+ 2906, 3400, 3385, 3386, 3412, 3413, 3401, 3817, 8693, 3809,
+ 3811, 3812, 368, 368, 3137, 1095, 1096, 368, 442, 368,
+ 443, 368, 368, 368, 368, 444, 368, 368, 368, 368,
+
+ 368, 3810, 3809, 3811, 3822, 3812, 3416, 3417, 8693, 3823,
+ 3824, 8693, 2528, 1897, 369, 3407, 797, 2529, 2173, 1913,
+ 369, 798, 2924, 368, 3810, 1312, 8693, 2528, 1321, 8693,
+ 2930, 1321, 2529, 2173, 3838, 3839, 2931, 2932, 441, 369,
+ 368, 1346, 2933, 3816, 8693, 3815, 368, 368, 3139, 1095,
+ 1096, 368, 1347, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 1346, 3816, 3827, 4003, 3815,
+ 3416, 3417, 8693, 797, 4004, 1347, 3840, 8693, 798, 1025,
+ 2931, 2932, 3423, 3433, 3423, 3413, 8693, 368, 8693, 3428,
+ 3827, 441, 369, 368, 3429, 3843, 3838, 3844, 3849, 3853,
+
+ 3854, 3446, 3447, 3850, 2948, 8693, 3828, 8693, 3833, 369,
+ 368, 368, 3211, 369, 368, 368, 426, 368, 3212, 368,
+ 3213, 1321, 368, 779, 1321, 368, 368, 368, 368, 3828,
+ 2946, 2930, 3833, 2555, 2556, 2947, 2948, 2931, 2932, 2557,
+ 2558, 3436, 3859, 2933, 3856, 2559, 3437, 3851, 8693, 3857,
+ 3858, 368, 3446, 3447, 3450, 3451, 3866, 3867, 3450, 3451,
+ 3458, 3473, 369, 3458, 3447, 3859, 3866, 3877, 3450, 3451,
+ 369, 3450, 3451, 8693, 368, 368, 3232, 369, 368, 368,
+ 426, 368, 3233, 368, 368, 1321, 368, 779, 1321, 368,
+ 368, 368, 368, 494, 3863, 8693, 3861, 3868, 3465, 8693,
+
+ 3869, 2966, 2967, 3466, 3876, 3480, 3481, 3480, 3481, 3484,
+ 3485, 2966, 2967, 3871, 8693, 368, 494, 8693, 3863, 3861,
+ 3868, 3882, 4453, 3869, 3894, 3895, 3883, 2988, 4454, 3787,
+ 3484, 3485, 3484, 3485, 3870, 3366, 3367, 3871, 368, 368,
+ 3229, 2400, 2401, 368, 368, 368, 368, 368, 368, 368,
+ 368, 3369, 368, 368, 368, 368, 368, 3870, 2575, 1908,
+ 2986, 3896, 3370, 3492, 3505, 2987, 2988, 3492, 3481, 3894,
+ 3903, 3872, 2575, 1908, 4037, 3369, 3497, 3885, 8693, 368,
+ 4038, 3498, 3902, 3908, 3896, 3370, 8693, 3509, 3909, 3027,
+ 8693, 2230, 3510, 3916, 2986, 3872, 2231, 1905, 3873, 2987,
+
+ 2988, 3885, 368, 368, 3229, 2400, 2401, 368, 2779, 368,
+ 368, 368, 368, 368, 368, 3230, 368, 368, 368, 368,
+ 368, 3873, 3884, 2583, 3888, 3918, 3919, 3921, 2584, 2585,
+ 5371, 2583, 3922, 3923, 2230, 8693, 2584, 2585, 4499, 2231,
+ 1905, 3886, 4519, 368, 4500, 3884, 8693, 3888, 4520, 3512,
+ 369, 3925, 3007, 3008, 5371, 3513, 3926, 3927, 3484, 3485,
+ 3514, 8693, 3887, 3889, 3899, 3886, 368, 368, 368, 369,
+ 368, 368, 681, 368, 368, 368, 368, 368, 368, 682,
+ 368, 368, 368, 368, 368, 3887, 3889, 3897, 3899, 3730,
+ 3517, 3518, 2606, 1923, 3929, 3930, 3522, 3540, 3940, 3930,
+
+ 8693, 2606, 1923, 3007, 3008, 3900, 3527, 368, 3929, 3930,
+ 3897, 3528, 3529, 3730, 3527, 8693, 3532, 3933, 3934, 3528,
+ 3529, 3533, 3534, 3940, 3952, 8693, 3898, 3901, 8693, 3900,
+ 368, 368, 368, 369, 368, 368, 681, 368, 368, 368,
+ 368, 368, 368, 682, 368, 368, 368, 368, 368, 3898,
+ 3901, 2612, 3737, 3944, 8693, 3542, 2613, 2614, 3945, 3946,
+ 3543, 3951, 3025, 3956, 1044, 1045, 8693, 3026, 3027, 3912,
+ 8693, 368, 3542, 8693, 3550, 8693, 3737, 3543, 3529, 3551,
+ 3958, 3960, 3961, 2612, 8693, 3371, 3554, 3555, 2613, 2614,
+ 3910, 2898, 2176, 3912, 368, 2479, 2479, 2479, 2479, 2479,
+
+ 2479, 2479, 2481, 2482, 2479, 2479, 2479, 2900, 2479, 2479,
+ 2479, 2479, 2479, 3910, 3913, 3025, 3554, 3555, 2901, 3963,
+ 3026, 3027, 2251, 5596, 3964, 3965, 8693, 2252, 1920, 3558,
+ 3559, 2900, 3911, 3967, 3968, 2479, 8693, 3913, 3565, 3577,
+ 2220, 2901, 3565, 3555, 8693, 3047, 2260, 5596, 2251, 2220,
+ 3517, 3518, 2220, 2252, 1920, 3914, 3911, 3942, 2479, 2479,
+ 2479, 2479, 2479, 2479, 2852, 2479, 2481, 2482, 2479, 2479,
+ 2479, 3326, 2479, 2479, 2479, 2479, 2479, 3915, 3914, 3937,
+ 3569, 3942, 3967, 3976, 3981, 3570, 3975, 3583, 3584, 3982,
+ 3088, 8693, 3517, 3518, 3583, 3584, 3587, 3588, 8693, 2479,
+
+ 3915, 3052, 3937, 3992, 3993, 8693, 3053, 3054, 8693, 3532,
+ 8693, 3532, 3594, 3606, 3533, 3534, 3533, 3534, 3950, 1950,
+ 369, 3938, 2479, 2856, 2856, 2856, 2856, 2856, 3328, 2856,
+ 2858, 2859, 2856, 2856, 2856, 3756, 2856, 2856, 2856, 2856,
+ 2856, 1346, 3950, 3947, 3938, 3948, 3594, 3584, 3992, 4001,
+ 3612, 4017, 1347, 8693, 3558, 3559, 3052, 4019, 4020, 3047,
+ 2260, 3053, 3054, 2856, 3598, 1346, 3947, 2636, 3948, 3599,
+ 4000, 4006, 2637, 2257, 8693, 1347, 4007, 3123, 8693, 3558,
+ 3559, 369, 3941, 3969, 3949, 3953, 2856, 368, 441, 369,
+ 368, 368, 426, 368, 443, 368, 368, 368, 368, 779,
+
+ 368, 368, 368, 368, 368, 3941, 3969, 3949, 3970, 3953,
+ 3620, 3621, 3620, 4023, 4027, 3618, 4272, 3763, 2636, 8693,
+ 2712, 5772, 369, 2637, 2257, 2713, 2714, 368, 3624, 3612,
+ 4017, 3970, 8693, 3625, 4028, 8693, 4030, 8693, 2282, 4272,
+ 3763, 4031, 4032, 2283, 1942, 5772, 3955, 1950, 369, 3954,
+ 368, 368, 441, 369, 368, 368, 426, 368, 443, 368,
+ 368, 368, 368, 779, 368, 368, 368, 368, 368, 1346,
+ 3955, 3987, 3954, 3071, 3072, 3628, 369, 3764, 3177, 8693,
+ 1347, 8693, 3165, 3631, 3632, 3972, 8693, 3071, 3072, 369,
+ 3634, 368, 3634, 1346, 3987, 3635, 3636, 3635, 4035, 2650,
+
+ 1945, 3764, 4040, 1347, 3620, 4023, 8693, 4041, 3632, 3972,
+ 3971, 8693, 3973, 3990, 368, 368, 1326, 369, 368, 368,
+ 442, 368, 443, 368, 368, 368, 368, 444, 1312, 368,
+ 368, 368, 368, 3971, 1913, 369, 3973, 3990, 3106, 3107,
+ 6448, 3792, 8693, 1321, 8693, 3363, 1321, 3793, 3794, 5370,
+ 3795, 8693, 3086, 3795, 369, 368, 1346, 3087, 3088, 2897,
+ 8693, 3996, 8693, 3796, 6448, 2898, 2176, 1347, 2899, 3984,
+ 369, 2899, 5370, 369, 3797, 8693, 3377, 2904, 368, 8693,
+ 1346, 2900, 2905, 2906, 3996, 4271, 4034, 3796, 2650, 1945,
+ 1347, 8693, 2901, 3984, 2282, 3804, 3384, 3797, 2908, 2283,
+
+ 1942, 3385, 3386, 2737, 2738, 2900, 4033, 2655, 4271, 2909,
+ 4034, 8693, 2656, 2657, 3974, 2901, 8693, 3388, 3645, 3199,
+ 4045, 4046, 2908, 3988, 8693, 3985, 1913, 369, 3389, 4033,
+ 3434, 369, 2909, 2903, 2904, 1321, 2959, 3974, 1321, 2905,
+ 2906, 3388, 2907, 3645, 3199, 2907, 3988, 3444, 1346, 3985,
+ 8693, 3389, 1346, 2966, 2967, 2908, 4048, 4049, 5976, 1347,
+ 8693, 2897, 369, 1347, 2674, 1958, 2909, 2898, 2176, 2969,
+ 2899, 8693, 1346, 2899, 3645, 3199, 1346, 3998, 3864, 2908,
+ 2970, 5976, 1347, 2900, 3450, 3451, 1347, 1950, 369, 2909,
+ 2527, 2528, 8693, 2969, 2901, 4134, 2529, 2173, 3514, 2530,
+
+ 3453, 3998, 2530, 2970, 4050, 369, 8693, 2900, 8693, 1346,
+ 2727, 3454, 2531, 3587, 3588, 2728, 2729, 2901, 4134, 4051,
+ 1347, 2743, 8693, 2532, 3453, 3652, 2744, 2745, 4062, 4063,
+ 3653, 3204, 4053, 1346, 3454, 8693, 2531, 4054, 4055, 3587,
+ 3588, 369, 3994, 1347, 1950, 369, 2532, 368, 3826, 1044,
+ 1045, 368, 442, 368, 443, 368, 368, 368, 368, 444,
+ 368, 368, 368, 368, 368, 3994, 1346, 3652, 3995, 3106,
+ 3107, 8693, 3653, 3204, 3664, 3665, 4273, 1347, 2655, 8693,
+ 3086, 3997, 4531, 2656, 2657, 3087, 3088, 368, 4532, 3121,
+ 1346, 3995, 4057, 8693, 3122, 3123, 3656, 4058, 4059, 4273,
+
+ 1347, 3657, 4060, 3664, 3665, 3997, 4009, 2274, 3983, 3986,
+ 368, 368, 3829, 369, 368, 368, 3408, 368, 3830, 368,
+ 368, 368, 368, 3831, 368, 368, 368, 368, 368, 2221,
+ 4009, 3983, 3986, 3654, 369, 4073, 4074, 4065, 8693, 3212,
+ 2222, 3213, 4066, 4067, 2300, 8693, 2674, 1958, 8693, 2301,
+ 1955, 368, 2679, 2221, 4069, 1321, 369, 2680, 2681, 4070,
+ 4071, 3667, 3679, 2222, 1321, 4080, 4074, 1321, 4073, 4074,
+ 4010, 2274, 3999, 4013, 368, 2929, 2929, 2929, 2929, 2929,
+ 3410, 2929, 2931, 2932, 2929, 2929, 2929, 3834, 2929, 2929,
+ 2929, 2929, 2929, 2221, 4010, 3999, 4013, 3670, 8693, 3659,
+
+ 369, 3670, 3671, 3672, 2222, 3660, 3671, 3672, 3121, 8693,
+ 3661, 1913, 369, 3122, 3123, 2929, 3675, 2221, 4077, 4078,
+ 1321, 3676, 3677, 1321, 8693, 2300, 4102, 2222, 8693, 2679,
+ 2301, 1955, 4103, 1346, 2680, 2681, 4008, 8693, 2929, 3414,
+ 3415, 3414, 3414, 3414, 1347, 3414, 3416, 3417, 3414, 3414,
+ 3414, 3414, 3418, 3414, 3414, 3414, 3414, 1346, 4012, 4008,
+ 4011, 1321, 369, 4080, 4086, 3684, 369, 1347, 4076, 8693,
+ 1321, 3233, 3661, 1321, 4077, 4078, 4113, 4076, 3217, 3414,
+ 4076, 4012, 4114, 4011, 3218, 2391, 3675, 3217, 8693, 3217,
+ 3217, 3676, 3677, 3463, 2986, 3218, 2391, 8693, 3217, 2987,
+
+ 2988, 3217, 3414, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
+ 2552, 1892, 2550, 2550, 2550, 2990, 2550, 2550, 2550, 2550,
+ 2550, 3220, 3221, 4090, 4091, 8693, 2991, 3222, 3223, 4082,
+ 3220, 3690, 3691, 3220, 4083, 4084, 1321, 369, 369, 2990,
+ 3690, 3691, 8693, 2550, 4575, 1321, 2772, 2773, 1321, 2991,
+ 4576, 3681, 2774, 2388, 3681, 2772, 3682, 4085, 2772, 3682,
+ 3672, 8693, 4087, 3694, 3695, 8693, 2550, 2550, 2550, 2550,
+ 2550, 2550, 2934, 2550, 2552, 1892, 2550, 2550, 2550, 3420,
+ 2550, 2550, 2550, 2550, 2550, 3686, 4087, 4093, 1321, 369,
+ 3687, 4088, 4094, 4095, 3694, 3695, 3235, 1321, 4097, 4098,
+
+ 1321, 8693, 3236, 3237, 8693, 3235, 8693, 2550, 3235, 3697,
+ 3703, 3697, 3691, 3699, 4097, 4100, 8693, 4105, 3700, 4099,
+ 4138, 3478, 4106, 3249, 3705, 3706, 4139, 3007, 3008, 8693,
+ 2550, 2554, 2554, 2556, 2554, 2554, 2554, 2554, 2557, 2558,
+ 2554, 2554, 2554, 3010, 2554, 2554, 2554, 2554, 2554, 2787,
+ 2788, 3705, 3706, 3235, 3011, 2789, 2790, 3256, 2787, 3236,
+ 3237, 2787, 3235, 3257, 3258, 3235, 3256, 3010, 8693, 3256,
+ 4595, 2554, 3709, 3710, 3709, 3710, 4596, 3011, 4108, 4109,
+ 3712, 3718, 3712, 3706, 3714, 4108, 4111, 4116, 8693, 3715,
+ 4110, 8693, 4117, 3270, 2554, 2554, 2554, 2556, 2554, 2554,
+
+ 2939, 2554, 2557, 2558, 2554, 2554, 2554, 3424, 2554, 2554,
+ 2554, 2554, 2554, 2801, 2802, 3721, 4118, 3256, 8693, 2803,
+ 2804, 8693, 2801, 3257, 3258, 2801, 3256, 4120, 4121, 3256,
+ 3727, 4124, 4128, 3289, 8693, 2554, 2817, 2818, 3732, 8693,
+ 654, 3721, 4118, 3733, 4129, 4131, 4178, 655, 3736, 369,
+ 4132, 4133, 4179, 4123, 369, 3298, 3727, 4124, 2554, 2944,
+ 2944, 2946, 2944, 2944, 3426, 2944, 2947, 2948, 2944, 2944,
+ 2944, 3841, 2944, 2944, 2944, 2944, 2944, 4123, 2965, 2219,
+ 4145, 4146, 3752, 4154, 2966, 2967, 4232, 2968, 2220, 3739,
+ 2968, 2220, 3762, 2859, 3740, 4136, 8693, 4141, 2965, 2944,
+
+ 2969, 2221, 4142, 3309, 2966, 2967, 8693, 2968, 2831, 4232,
+ 2968, 2970, 2222, 2832, 2833, 4163, 4164, 3762, 2859, 8693,
+ 2969, 3744, 2944, 8693, 2969, 2221, 3745, 4143, 8693, 2219,
+ 369, 2970, 8693, 3892, 2970, 2222, 2582, 2583, 2220, 3484,
+ 3485, 2220, 2584, 2585, 2969, 2586, 8693, 4148, 2586, 4153,
+ 8693, 2221, 4149, 4150, 2970, 3487, 4166, 4167, 2587, 3768,
+ 3769, 8693, 2222, 8693, 4158, 8693, 3488, 3768, 3769, 2588,
+ 4159, 3750, 8693, 4153, 407, 2221, 4160, 3340, 3341, 3487,
+ 8693, 408, 2587, 3771, 3773, 2222, 3771, 3769, 4161, 3488,
+ 3340, 3341, 2588, 368, 441, 369, 368, 368, 442, 368,
+
+ 443, 368, 368, 368, 368, 444, 368, 368, 368, 368,
+ 368, 2882, 4161, 3777, 3778, 3780, 2883, 2884, 4173, 4174,
+ 3781, 4175, 3784, 3890, 4173, 4176, 4192, 3785, 4187, 4189,
+ 4190, 4193, 4194, 368, 3789, 3790, 3789, 3790, 3793, 3794,
+ 4197, 4198, 3793, 3794, 3801, 3814, 3890, 3801, 3790, 3806,
+ 4197, 4206, 3793, 3794, 3807, 4205, 368, 368, 441, 369,
+ 368, 368, 442, 368, 443, 368, 368, 368, 368, 444,
+ 368, 368, 368, 368, 368, 8693, 3366, 3367, 3006, 1897,
+ 369, 4199, 8693, 3891, 3007, 3008, 369, 3009, 4202, 4211,
+ 3009, 1312, 3495, 3025, 4212, 3386, 3006, 368, 3026, 3027,
+
+ 3010, 8693, 3007, 3008, 4199, 3009, 4270, 3891, 3009, 3819,
+ 3820, 3011, 4202, 8693, 3029, 8693, 3793, 3794, 3010, 369,
+ 368, 3516, 2898, 2176, 3010, 3030, 8693, 3517, 3518, 3011,
+ 4270, 2528, 4220, 4221, 3011, 4203, 2529, 2173, 3029, 8693,
+ 3932, 8693, 3010, 3519, 8693, 4200, 3933, 3934, 3030, 2611,
+ 2612, 4371, 3011, 8693, 3520, 2613, 2614, 3046, 2615, 4203,
+ 4218, 2615, 3935, 3047, 2260, 4220, 4223, 3519, 4200, 3051,
+ 3052, 2616, 8693, 3936, 4371, 3053, 3054, 3520, 3046, 3048,
+ 2898, 2176, 2617, 4218, 3047, 2260, 3935, 3531, 3532, 8693,
+ 3049, 3055, 3822, 3533, 3534, 2616, 3936, 3823, 4222, 8693,
+
+ 3048, 8693, 3056, 3048, 4654, 2617, 4204, 3838, 3844, 3535,
+ 4655, 3049, 8693, 3049, 8693, 3055, 2635, 2636, 4245, 3417,
+ 3536, 8693, 2637, 2257, 3048, 3056, 3829, 369, 8693, 4204,
+ 3070, 8693, 3830, 3535, 3049, 3557, 3071, 3072, 2638, 3416,
+ 3417, 3558, 3559, 3536, 2654, 2655, 8693, 3070, 8693, 2639,
+ 2656, 2657, 3073, 3071, 3072, 4236, 8693, 3560, 4245, 3417,
+ 4237, 4238, 2638, 3074, 3366, 3367, 2658, 8693, 3561, 3073,
+ 4245, 3417, 2639, 3853, 3854, 8693, 3073, 2659, 3407, 797,
+ 3074, 3560, 3105, 8693, 798, 2924, 3074, 4201, 3106, 3107,
+ 2658, 3561, 3384, 3073, 4255, 4256, 8693, 3385, 3386, 3586,
+
+ 2659, 2678, 2679, 3074, 3108, 3587, 3588, 2680, 2681, 4214,
+ 4201, 3384, 4208, 3105, 8693, 3109, 3385, 3386, 4209, 3106,
+ 3107, 3589, 8693, 2682, 2904, 4255, 4258, 8693, 3108, 2905,
+ 2906, 3849, 3590, 4214, 2683, 3108, 3850, 2948, 3109, 4213,
+ 3866, 3877, 4215, 4247, 8693, 3589, 3109, 2682, 4248, 4249,
+ 4277, 3451, 4277, 3451, 8693, 3590, 8693, 2683, 2904, 3108,
+ 4277, 3451, 4213, 2905, 2906, 8693, 4215, 2575, 1908, 3109,
+ 368, 3137, 1095, 1096, 368, 426, 368, 443, 368, 368,
+ 368, 368, 779, 368, 368, 368, 368, 368, 3849, 4216,
+ 369, 4228, 4229, 3850, 2948, 4282, 2528, 4230, 3817, 4251,
+
+ 8693, 2529, 2173, 4231, 4252, 4253, 4269, 8693, 3856, 8693,
+ 368, 3882, 4216, 3857, 4257, 4287, 3883, 2988, 4282, 3882,
+ 4288, 4289, 3894, 3903, 3883, 2988, 8693, 2966, 2967, 4217,
+ 4269, 3450, 3451, 368, 368, 4014, 1095, 1096, 368, 3610,
+ 368, 368, 368, 368, 368, 368, 4015, 368, 368, 368,
+ 368, 368, 4217, 4281, 4278, 3450, 3451, 2966, 2967, 4291,
+ 4305, 3485, 8693, 2583, 4292, 4293, 8693, 4279, 2584, 2585,
+ 4280, 2575, 1908, 3908, 368, 2986, 4281, 4278, 3909, 3027,
+ 2987, 2988, 2230, 4305, 3485, 4305, 3485, 2231, 1905, 3918,
+ 3919, 4279, 369, 4294, 4280, 4283, 4296, 368, 368, 368,
+
+ 369, 368, 368, 681, 368, 368, 368, 368, 368, 368,
+ 682, 368, 368, 368, 368, 368, 4299, 4294, 4283, 4296,
+ 4313, 4327, 4328, 3908, 4524, 4314, 4315, 2986, 3909, 3027,
+ 2583, 8693, 2987, 2988, 8693, 2584, 2585, 4317, 368, 4299,
+ 3921, 8693, 4318, 4319, 4225, 3922, 4329, 4524, 3484, 3485,
+ 4226, 2251, 4327, 4330, 4342, 4343, 2252, 1920, 4295, 4297,
+ 4307, 368, 368, 368, 369, 368, 368, 681, 368, 368,
+ 368, 368, 368, 368, 682, 368, 368, 368, 368, 368,
+ 4135, 4295, 4297, 3925, 4307, 4325, 4345, 8693, 3926, 4340,
+ 8693, 4346, 4347, 3929, 3930, 3929, 3930, 4260, 3484, 3485,
+
+ 2230, 4332, 368, 4261, 4135, 2231, 1905, 4333, 4325, 3933,
+ 3934, 4349, 4350, 3940, 3952, 8693, 3787, 3940, 3930, 2606,
+ 1923, 4306, 3366, 3367, 4298, 368, 2856, 2856, 2856, 2856,
+ 2856, 2856, 2856, 2858, 2859, 2856, 2856, 2856, 3369, 2856,
+ 2856, 2856, 2856, 2856, 4306, 3007, 3008, 4310, 4298, 3370,
+ 3944, 4349, 4358, 3960, 3961, 3945, 4357, 8693, 4308, 3007,
+ 3008, 4854, 3369, 2606, 1923, 4360, 2856, 4855, 4363, 4379,
+ 4310, 4361, 3370, 4364, 3534, 4380, 3517, 3518, 2612, 4374,
+ 4375, 8693, 4308, 2613, 2614, 4309, 8693, 4311, 4354, 2856,
+ 2856, 2856, 2856, 2856, 2856, 3328, 2856, 2858, 2859, 2856,
+
+ 2856, 2856, 3756, 2856, 2856, 2856, 2856, 2856, 4309, 3025,
+ 4311, 4322, 4354, 8693, 3026, 3027, 3963, 8693, 3025, 4374,
+ 4377, 3964, 4376, 3026, 3027, 8693, 2251, 4320, 3967, 3976,
+ 2856, 2252, 1920, 8693, 4322, 4390, 3559, 3981, 8693, 3047,
+ 2260, 8693, 3982, 3088, 3933, 3934, 3933, 3934, 8693, 4321,
+ 4324, 4320, 4355, 2856, 368, 3826, 1044, 1045, 368, 426,
+ 368, 443, 368, 368, 368, 368, 779, 368, 368, 368,
+ 368, 368, 4321, 4351, 4324, 4352, 4355, 4390, 3559, 8693,
+ 4398, 8693, 3981, 8693, 2612, 4399, 4400, 3982, 3088, 2613,
+ 2614, 4390, 3559, 8693, 368, 4402, 4351, 3052, 4352, 3532,
+
+ 4403, 4404, 3053, 3054, 3533, 3534, 4411, 369, 3992, 4001,
+ 4416, 3588, 8693, 4323, 8693, 4367, 4366, 368, 368, 441,
+ 369, 368, 368, 426, 368, 443, 368, 368, 368, 368,
+ 779, 368, 368, 368, 368, 368, 4323, 1913, 369, 4367,
+ 4366, 2219, 369, 3517, 3518, 2220, 1321, 8693, 4168, 1321,
+ 2220, 4416, 3588, 2220, 2220, 1913, 369, 2220, 368, 1346,
+ 3558, 3559, 4372, 2221, 1321, 8693, 4353, 1321, 369, 4195,
+ 1347, 4168, 4392, 3365, 2222, 3793, 3794, 1346, 4453, 3366,
+ 3367, 368, 3368, 1346, 4454, 3368, 4372, 2221, 1347, 4353,
+ 8693, 3796, 4705, 1347, 8693, 3369, 4392, 2222, 4181, 4182,
+
+ 2219, 1346, 3797, 8693, 4183, 3775, 3370, 4184, 2636, 2220,
+ 4184, 1347, 2220, 2637, 2257, 3796, 4705, 3804, 3384, 3369,
+ 4185, 4006, 2221, 3385, 3386, 3797, 4007, 3123, 8693, 3370,
+ 8693, 4186, 4424, 2222, 4416, 3588, 3365, 4425, 4426, 3388,
+ 8693, 4369, 3366, 3367, 4185, 3368, 2221, 4006, 3368, 8693,
+ 3389, 4499, 4007, 3123, 4186, 3864, 2222, 4500, 3369, 3047,
+ 2260, 3450, 3451, 3388, 4369, 3071, 3072, 1913, 369, 3370,
+ 369, 1950, 369, 3389, 2903, 2904, 1321, 3453, 4393, 1321,
+ 2905, 2906, 3369, 2907, 8693, 4356, 2907, 8693, 3454, 1346,
+ 4019, 4437, 3370, 1346, 4027, 3618, 2908, 8693, 4412, 8693,
+
+ 1347, 3453, 4393, 2219, 1347, 4446, 4447, 2909, 4356, 4027,
+ 3618, 3454, 2220, 1346, 8693, 2220, 5039, 1346, 4449, 4450,
+ 2908, 4412, 5040, 1347, 8693, 2221, 8693, 1347, 2274, 2274,
+ 2909, 368, 3826, 1044, 1045, 368, 2222, 368, 443, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 2221,
+ 2221, 2221, 4428, 4014, 1095, 1096, 8693, 4429, 4430, 2222,
+ 4441, 2222, 2222, 8693, 2636, 4442, 4443, 4030, 8693, 2637,
+ 2257, 368, 4031, 4451, 2221, 2221, 4019, 4437, 4027, 3618,
+ 8693, 4456, 4045, 4046, 2222, 2222, 4457, 4458, 8693, 3071,
+ 3072, 1950, 369, 4370, 368, 368, 441, 369, 368, 368,
+
+ 442, 368, 443, 368, 368, 368, 368, 444, 368, 368,
+ 368, 368, 368, 1346, 8693, 4394, 4370, 4234, 3628, 369,
+ 4471, 4472, 4040, 8693, 1347, 3165, 3532, 4041, 3632, 4474,
+ 4475, 3533, 3534, 8693, 4461, 368, 8693, 1346, 4394, 4462,
+ 4463, 4234, 4048, 4476, 4478, 4472, 8693, 1347, 8693, 3892,
+ 2650, 1945, 3645, 3199, 4365, 3484, 3485, 2274, 368, 368,
+ 3829, 369, 368, 368, 368, 368, 3830, 368, 368, 368,
+ 368, 3487, 368, 368, 368, 368, 368, 4365, 4395, 2221,
+ 4040, 8693, 3488, 4465, 8693, 4041, 3632, 3052, 4466, 4467,
+ 2222, 8693, 3053, 3054, 4519, 3487, 4531, 4050, 369, 368,
+
+ 4520, 4395, 4532, 2221, 4053, 3488, 8693, 3587, 3588, 4054,
+ 4055, 2655, 4051, 2222, 4045, 4046, 2656, 2657, 4368, 4418,
+ 1950, 369, 368, 368, 3829, 369, 368, 368, 3408, 368,
+ 3830, 368, 368, 368, 368, 3831, 368, 368, 368, 368,
+ 368, 4368, 1346, 4418, 4407, 4479, 369, 8693, 4480, 4482,
+ 8693, 4486, 4575, 1347, 4483, 4484, 4487, 4488, 4576, 3558,
+ 3559, 2650, 1945, 368, 8693, 3086, 1346, 4407, 4057, 8693,
+ 3087, 3088, 8693, 4058, 4489, 2282, 1347, 4048, 4476, 8693,
+ 2283, 1942, 4391, 4405, 8693, 4396, 368, 368, 441, 369,
+ 368, 368, 442, 368, 443, 368, 368, 368, 368, 444,
+
+ 368, 368, 368, 368, 368, 4391, 4239, 4405, 4396, 4410,
+ 2220, 4491, 3106, 3107, 8693, 3086, 4492, 4484, 3652, 2220,
+ 3087, 3088, 2220, 3653, 3204, 4419, 8693, 368, 1321, 369,
+ 4239, 8693, 4410, 4062, 4063, 4494, 4495, 1321, 4494, 4497,
+ 1321, 4335, 4336, 8693, 3106, 3107, 4406, 4337, 3916, 4419,
+ 368, 2929, 2929, 2929, 2929, 2929, 2929, 2929, 2931, 2932,
+ 2929, 2929, 2929, 4338, 2929, 2929, 2929, 2929, 2929, 4406,
+ 4420, 4065, 4502, 4503, 4339, 8693, 4066, 4496, 4504, 4060,
+ 8693, 4502, 8693, 2655, 4502, 2674, 1958, 4338, 2656, 2657,
+ 4069, 2929, 8693, 4420, 8693, 4070, 4505, 4339, 4507, 4508,
+
+ 4510, 4073, 4074, 8693, 2679, 4511, 4512, 4073, 4074, 2680,
+ 2681, 8693, 4408, 4421, 2929, 2929, 2929, 2929, 2929, 2929,
+ 3410, 2929, 2931, 2932, 2929, 2929, 2929, 3834, 2929, 2929,
+ 2929, 2929, 2929, 8693, 3121, 4408, 4421, 4433, 3663, 3122,
+ 3123, 4077, 4078, 3121, 3664, 3665, 8693, 3663, 3122, 3123,
+ 3663, 2282, 4431, 2674, 1958, 2929, 2283, 1942, 4077, 4078,
+ 4433, 4514, 4515, 8693, 2300, 4080, 4086, 4080, 4074, 2301,
+ 1955, 4514, 4517, 8693, 4432, 4409, 4431, 4422, 2929, 3414,
+ 3414, 3414, 3414, 3414, 3836, 3414, 3416, 3417, 3414, 3414,
+ 3414, 4240, 3414, 3414, 3414, 3414, 3414, 4432, 4436, 4409,
+
+ 4422, 1321, 369, 4082, 4090, 4091, 4526, 4527, 4083, 4516,
+ 1321, 8693, 2679, 1321, 8693, 3587, 3588, 2680, 2681, 3414,
+ 4522, 4436, 3220, 3221, 8693, 4523, 3677, 8693, 3222, 3223,
+ 4093, 3220, 8693, 3516, 3220, 4094, 4528, 8693, 4417, 3517,
+ 3518, 4434, 3414, 2944, 2944, 2946, 2944, 2944, 2944, 2944,
+ 2947, 2948, 2944, 2944, 2944, 3519, 2944, 2944, 2944, 2944,
+ 2944, 4417, 3663, 369, 4434, 8693, 3520, 8693, 3664, 3665,
+ 8693, 3663, 4526, 4529, 3663, 8693, 1321, 369, 4595, 3519,
+ 4459, 2300, 369, 2944, 4596, 1321, 2301, 1955, 1321, 3520,
+ 4534, 4535, 4097, 4100, 4540, 3695, 4536, 4088, 8693, 4534,
+
+ 4540, 3695, 4534, 5171, 4459, 4435, 2944, 2944, 2944, 2946,
+ 2944, 2944, 3426, 2944, 2947, 2948, 2944, 2944, 2944, 3841,
+ 2944, 2944, 2944, 2944, 2944, 4540, 3695, 5171, 3932, 4435,
+ 3051, 3052, 8693, 3516, 3933, 3934, 3053, 3054, 369, 3517,
+ 3518, 8693, 4382, 4383, 4108, 4111, 8693, 2944, 4384, 3958,
+ 3935, 4105, 3055, 4542, 4654, 3519, 4106, 3249, 4543, 4544,
+ 4655, 3936, 4105, 3056, 4385, 8693, 3520, 4106, 3249, 4624,
+ 2944, 4263, 4264, 8693, 3935, 4386, 3055, 4265, 3851, 3519,
+ 4266, 4552, 3710, 4266, 3936, 4546, 3056, 8693, 4385, 3520,
+ 4547, 4548, 4624, 4267, 4116, 4552, 3710, 4554, 4386, 4117,
+
+ 3270, 4116, 4555, 4556, 4268, 4558, 4117, 3270, 4552, 3710,
+ 4559, 4560, 4120, 4561, 4565, 4118, 8693, 4267, 4128, 3289,
+ 4568, 4569, 4128, 3289, 4571, 4572, 8693, 4268, 368, 4300,
+ 369, 368, 368, 442, 368, 443, 368, 368, 368, 368,
+ 444, 368, 368, 368, 368, 368, 654, 4120, 4561, 4131,
+ 8693, 4578, 8693, 655, 4132, 4573, 4579, 4129, 3736, 369,
+ 4566, 4141, 4128, 3289, 4582, 3298, 4142, 3309, 368, 4583,
+ 4584, 4141, 8693, 4586, 4145, 4146, 4142, 3309, 4587, 4588,
+ 4590, 4591, 4148, 8693, 4566, 4590, 4593, 4149, 4592, 4601,
+ 369, 368, 368, 441, 369, 368, 368, 442, 368, 443,
+
+ 368, 368, 368, 368, 444, 368, 368, 368, 368, 368,
+ 4598, 4158, 8693, 4604, 8693, 4599, 4143, 4159, 3750, 4605,
+ 4606, 8693, 4301, 4160, 441, 4607, 4159, 3750, 4610, 4611,
+ 4159, 3750, 368, 4163, 4164, 2857, 4612, 4615, 4616, 4166,
+ 4617, 2858, 2859, 4619, 4616, 4301, 4182, 2860, 4173, 4176,
+ 369, 4183, 3775, 4623, 407, 368, 368, 3956, 1044, 1045,
+ 368, 408, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 4620, 8693, 4623, 4613, 4629, 3778,
+ 3762, 2859, 4643, 6435, 4182, 8693, 4621, 4644, 4645, 4183,
+ 3775, 4189, 4190, 4649, 4650, 5297, 368, 4192, 4649, 4652,
+
+ 4613, 5298, 4193, 4651, 4197, 4206, 6435, 4182, 4666, 3794,
+ 4641, 4182, 4183, 3775, 2898, 2176, 4183, 3775, 8693, 368,
+ 368, 4014, 1095, 1096, 368, 368, 368, 368, 368, 368,
+ 368, 368, 4185, 368, 368, 368, 368, 368, 4854, 3366,
+ 3367, 4646, 4671, 4186, 4855, 4182, 4666, 3794, 4211, 5632,
+ 4183, 3775, 4669, 4212, 3386, 5633, 4185, 3793, 3794, 8693,
+ 368, 8693, 4674, 8693, 4646, 4671, 4186, 4675, 4676, 3793,
+ 3794, 8693, 4211, 4666, 3794, 8693, 4669, 4212, 3386, 4647,
+ 4667, 4668, 8693, 368, 368, 4014, 1095, 1096, 368, 3610,
+ 368, 368, 368, 368, 368, 368, 4015, 368, 368, 368,
+
+ 368, 368, 4647, 4667, 4678, 4668, 4220, 4223, 4690, 4679,
+ 4680, 4691, 3820, 5039, 4691, 3820, 8693, 3366, 3367, 5040,
+ 4692, 2898, 2176, 4690, 368, 4228, 4229, 8693, 3384, 4691,
+ 3820, 4230, 3817, 3385, 3386, 4692, 2904, 4231, 4711, 4712,
+ 8693, 2905, 2906, 4670, 8693, 4672, 4681, 368, 368, 368,
+ 369, 368, 368, 681, 368, 368, 368, 368, 368, 368,
+ 682, 368, 368, 368, 368, 368, 4670, 4580, 4672, 4683,
+ 4681, 4719, 4720, 4229, 4245, 3417, 8693, 3384, 4230, 3817,
+ 8693, 2904, 3385, 3386, 1913, 369, 2905, 2906, 368, 4701,
+ 8693, 4580, 4683, 1321, 4702, 4703, 1321, 8693, 2528, 4722,
+
+ 4723, 4719, 4720, 2529, 2173, 369, 1346, 8693, 4682, 8693,
+ 4684, 368, 4157, 4158, 4157, 4157, 4157, 1347, 4157, 4159,
+ 3750, 4157, 4157, 4157, 4157, 4160, 4157, 4157, 4157, 4157,
+ 1346, 4682, 4686, 4684, 5290, 4694, 4695, 8693, 4229, 8693,
+ 1347, 4696, 4697, 4230, 3817, 4236, 8693, 4698, 2528, 4704,
+ 4237, 4709, 4157, 2529, 2173, 4686, 4714, 5290, 4247, 8693,
+ 4725, 4715, 4716, 4248, 4249, 4726, 4727, 8693, 4251, 4722,
+ 4729, 8693, 4685, 4252, 4728, 4157, 368, 441, 369, 368,
+ 368, 426, 368, 443, 368, 368, 368, 368, 779, 368,
+ 368, 368, 368, 368, 2945, 2946, 4685, 4731, 4622, 8693,
+
+ 2947, 2948, 4732, 4727, 4255, 4258, 2949, 4733, 3849, 4739,
+ 3854, 8693, 4264, 3850, 2948, 4753, 368, 4265, 3851, 4734,
+ 4754, 4755, 4622, 4264, 4764, 4765, 4264, 8693, 4265, 3851,
+ 8693, 4265, 3851, 4277, 3451, 369, 4767, 4768, 369, 368,
+ 368, 4300, 369, 368, 368, 426, 368, 443, 368, 368,
+ 368, 368, 779, 368, 368, 368, 368, 368, 4760, 4628,
+ 4756, 4758, 8693, 4628, 2219, 4629, 3778, 369, 4630, 4629,
+ 3778, 4630, 4630, 2220, 369, 4630, 2220, 2966, 2967, 2220,
+ 368, 4631, 4760, 4756, 4758, 4631, 2221, 4761, 2220, 3450,
+ 3451, 2220, 4632, 4264, 4762, 8693, 4632, 2222, 4265, 3851,
+
+ 5297, 4772, 4769, 368, 8693, 4631, 5298, 4195, 8693, 4631,
+ 2221, 4761, 8693, 3793, 3794, 4632, 4181, 4182, 4762, 4632,
+ 2222, 8693, 4183, 3775, 4772, 4184, 4769, 4757, 4184, 3796,
+ 4764, 4765, 2575, 1908, 8693, 4738, 2966, 2967, 4185, 8693,
+ 3797, 4739, 3854, 8693, 4740, 3450, 3451, 4740, 8693, 4186,
+ 4757, 4773, 5632, 3796, 4767, 4782, 8693, 4741, 5633, 2575,
+ 1908, 4287, 4185, 3797, 4771, 8693, 4288, 4289, 4742, 4798,
+ 4799, 4770, 4186, 4634, 4635, 4773, 8693, 4738, 8693, 4636,
+ 4637, 4741, 4638, 4739, 3854, 4638, 4740, 4771, 4774, 4740,
+ 369, 4742, 4778, 8693, 4770, 4639, 8693, 4779, 4780, 4741,
+
+ 4305, 3485, 4751, 4264, 4801, 4802, 4640, 4291, 4265, 3851,
+ 4742, 4774, 4292, 4781, 8693, 4784, 4798, 4799, 5908, 4639,
+ 4785, 4780, 2986, 4741, 4267, 3484, 3485, 2987, 2988, 4640,
+ 4657, 4658, 8693, 4742, 8693, 4268, 4659, 4187, 4803, 4660,
+ 2986, 5908, 4660, 4300, 369, 2987, 2988, 8693, 4267, 443,
+ 8693, 2583, 4661, 4801, 4814, 4790, 2584, 2585, 4268, 2583,
+ 8693, 4313, 4803, 4662, 2584, 2585, 4314, 4315, 4810, 4791,
+ 4327, 4330, 8693, 4811, 4812, 8693, 4661, 8693, 4790, 3484,
+ 3485, 3007, 3008, 4792, 8693, 4793, 4662, 4227, 4228, 4229,
+ 4227, 4227, 4791, 4227, 4230, 3817, 4227, 4227, 4227, 4227,
+
+ 4231, 4227, 4227, 4227, 4227, 4804, 4317, 4792, 4793, 4805,
+ 4816, 4318, 4813, 8693, 2230, 4817, 4812, 2230, 8693, 2231,
+ 1905, 8693, 2231, 1905, 3007, 3008, 8693, 4227, 4804, 4336,
+ 2606, 1923, 4805, 4843, 4337, 3916, 4832, 3919, 4844, 4845,
+ 4342, 4343, 8693, 2606, 1923, 8693, 4794, 4795, 4806, 4807,
+ 4227, 368, 4706, 1044, 1045, 368, 4233, 368, 368, 368,
+ 368, 368, 368, 4707, 368, 368, 368, 368, 368, 4794,
+ 4795, 4806, 4808, 4807, 4849, 4850, 8693, 3025, 4849, 4852,
+ 4345, 8693, 3026, 3027, 3025, 4346, 4851, 2612, 6304, 3026,
+ 3027, 368, 2613, 2614, 6305, 4808, 4349, 4358, 4865, 3934,
+
+ 2612, 4865, 3934, 4336, 8693, 2613, 2614, 8693, 4337, 3916,
+ 4822, 4824, 8693, 4823, 368, 368, 3826, 1044, 1045, 368,
+ 442, 368, 443, 368, 368, 368, 368, 444, 368, 368,
+ 368, 368, 368, 4822, 4825, 4824, 4823, 4846, 4363, 8693,
+ 3933, 3934, 2251, 4364, 3534, 2251, 8693, 2252, 1920, 8693,
+ 2252, 1920, 4867, 4873, 8693, 368, 4363, 4825, 4874, 4875,
+ 4846, 4364, 3534, 4865, 3934, 4336, 8693, 4877, 4374, 4377,
+ 4337, 3916, 4878, 4879, 4826, 4827, 4867, 369, 368, 368,
+ 441, 369, 368, 368, 442, 368, 443, 368, 368, 368,
+ 368, 444, 368, 368, 368, 368, 368, 4826, 4827, 4847,
+
+ 3517, 3518, 3956, 1044, 1045, 4383, 5498, 4717, 4891, 3961,
+ 4384, 3958, 4902, 4868, 8693, 3933, 3934, 4903, 4904, 368,
+ 4908, 4909, 4847, 4390, 3559, 4911, 4912, 4908, 4909, 5498,
+ 4717, 4911, 4924, 4831, 3047, 2260, 8693, 4868, 4866, 4832,
+ 3919, 2274, 368, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
+ 3416, 3417, 3414, 3414, 3414, 4833, 3414, 3414, 3414, 3414,
+ 3414, 4866, 4870, 2221, 4398, 8693, 4834, 4920, 5621, 4399,
+ 4400, 5007, 4921, 4922, 2222, 5622, 3517, 3518, 6381, 4833,
+ 3047, 2260, 8693, 3414, 6382, 4870, 4402, 2221, 4926, 4834,
+ 8693, 4403, 4923, 4927, 4922, 4411, 369, 2222, 4939, 4940,
+
+ 4416, 3588, 4869, 8693, 4871, 8693, 3414, 3414, 3414, 3414,
+ 3414, 3414, 3836, 3414, 3416, 3417, 3414, 3414, 3414, 4240,
+ 3414, 3414, 3414, 3414, 3414, 4869, 3532, 4871, 4335, 4336,
+ 4831, 3533, 3534, 3052, 4337, 3916, 4832, 3919, 3053, 3054,
+ 3052, 8693, 4836, 4837, 4880, 3053, 3054, 3414, 4838, 4839,
+ 4338, 8693, 4833, 8693, 3558, 3559, 8693, 1950, 369, 4335,
+ 4336, 4339, 4883, 4834, 4840, 4337, 3916, 4913, 4880, 8693,
+ 3414, 4263, 4264, 4882, 4338, 4841, 4833, 4265, 3851, 1346,
+ 4266, 4338, 369, 4266, 4339, 4883, 4834, 8693, 4840, 3532,
+ 1347, 4913, 4339, 4267, 3533, 3534, 4882, 369, 4841, 8693,
+
+ 4857, 4858, 4937, 1346, 4268, 4338, 4859, 4340, 4942, 4943,
+ 4939, 4940, 369, 1347, 8693, 4339, 8693, 4267, 2636, 8693,
+ 4881, 4886, 4860, 2637, 2257, 2636, 4937, 4268, 4744, 4745,
+ 2637, 2257, 4890, 4861, 4746, 4747, 5057, 4748, 4891, 3961,
+ 4748, 8693, 4884, 4881, 369, 4886, 4860, 4383, 4942, 4955,
+ 4749, 8693, 4384, 3958, 4892, 8693, 4861, 4382, 4383, 4885,
+ 5057, 4750, 6424, 4384, 3958, 4893, 4884, 4383, 6425, 3071,
+ 3072, 8693, 4384, 3958, 4749, 5148, 3558, 3559, 4892, 4385,
+ 5621, 4905, 4885, 5007, 4750, 2985, 2986, 5622, 4893, 4890,
+ 4386, 2987, 2988, 4916, 2989, 4891, 3961, 2989, 5148, 3071,
+
+ 3072, 4906, 4914, 4385, 4905, 4972, 4017, 2990, 8693, 2650,
+ 1945, 4892, 8693, 4386, 4895, 4896, 4916, 6490, 2991, 8693,
+ 4897, 4898, 4893, 6491, 4906, 4914, 8693, 4915, 4917, 2650,
+ 1945, 2990, 3086, 4382, 4383, 4892, 4899, 3087, 3088, 4384,
+ 3958, 2991, 4786, 3882, 8693, 4893, 8693, 4900, 3883, 2988,
+ 4915, 4787, 4917, 6561, 4787, 4385, 3587, 3588, 4918, 6562,
+ 4899, 4932, 3086, 8693, 4788, 369, 4386, 3087, 3088, 4944,
+ 4900, 8693, 2655, 4972, 4017, 4789, 8693, 2656, 2657, 4385,
+ 8693, 4918, 4974, 4975, 4932, 2655, 4446, 4447, 4788, 4386,
+ 2656, 2657, 8693, 4944, 5688, 4931, 4933, 8693, 4789, 368,
+
+ 441, 369, 368, 368, 442, 368, 443, 368, 368, 368,
+ 368, 444, 368, 368, 368, 368, 368, 5688, 4931, 4934,
+ 4933, 4796, 3085, 3086, 8693, 4928, 3981, 8693, 3087, 3088,
+ 2282, 3982, 3088, 3106, 3107, 2283, 1942, 2674, 1958, 368,
+ 3587, 3588, 4934, 2282, 3089, 4796, 8693, 4929, 2283, 1942,
+ 3106, 3107, 4978, 4979, 6617, 3090, 4948, 8693, 4930, 4935,
+ 6618, 4946, 368, 3024, 3025, 8693, 4945, 6642, 3089, 3026,
+ 3027, 4929, 3028, 6643, 4947, 3028, 4936, 6669, 3090, 8693,
+ 4948, 4930, 4935, 6670, 4946, 3029, 2674, 1958, 4424, 4945,
+ 4449, 4980, 8693, 4425, 4426, 4951, 3030, 4947, 4428, 4936,
+
+ 4952, 4953, 6681, 4429, 4954, 4957, 3120, 3121, 6682, 3029,
+ 4958, 4953, 3122, 3123, 8693, 4949, 8693, 3121, 8693, 3030,
+ 4818, 3908, 3122, 3123, 4959, 4006, 3909, 3027, 3124, 4819,
+ 4007, 3123, 4819, 4982, 4979, 3121, 4972, 4017, 4949, 3125,
+ 3122, 3123, 4820, 2679, 4446, 4447, 4960, 8693, 2680, 2681,
+ 4962, 8693, 3124, 4821, 2679, 369, 8693, 4961, 8693, 2680,
+ 2681, 8693, 3125, 2300, 4963, 6692, 4820, 4964, 2301, 1955,
+ 4960, 6693, 2300, 4962, 4449, 4980, 4821, 2301, 1955, 4441,
+ 4961, 4995, 4471, 4472, 4442, 4443, 8693, 4963, 4965, 4969,
+ 8693, 4964, 4966, 3155, 4970, 4971, 4026, 8693, 3156, 3157,
+
+ 6304, 4984, 3157, 4456, 4995, 4967, 6305, 4986, 4457, 4458,
+ 8693, 4965, 4987, 4988, 4456, 4966, 4992, 8693, 4461, 4990,
+ 4028, 4993, 4994, 4462, 4463, 4997, 8693, 3177, 4967, 4465,
+ 4998, 4999, 3178, 3179, 4466, 5000, 5002, 8693, 4040, 4471,
+ 4472, 5003, 4999, 5005, 3179, 4045, 4046, 4474, 4475, 5009,
+ 5010, 3645, 3199, 4478, 5011, 4478, 4472, 4479, 369, 4482,
+ 4480, 4471, 4472, 4482, 4483, 4484, 4053, 8693, 4483, 4484,
+ 4486, 4054, 4055, 4474, 4475, 4487, 4488, 5015, 8693, 3652,
+ 8693, 4491, 5016, 5017, 3653, 3204, 4492, 5018, 4478, 5011,
+ 4491, 4494, 4497, 5022, 8693, 4492, 4484, 4502, 4503, 5023,
+
+ 4063, 5022, 5022, 4504, 4060, 5022, 4502, 5023, 4063, 4502,
+ 5022, 5025, 5026, 5022, 5023, 4063, 4503, 5027, 5028, 4503,
+ 5025, 4504, 4060, 5025, 4504, 4060, 5030, 1321, 369, 4507,
+ 4508, 5031, 5032, 5034, 5035, 4510, 1321, 5034, 5037, 1321,
+ 4511, 5036, 5042, 5043, 4514, 4517, 5048, 4078, 5044, 4505,
+ 4522, 5042, 5048, 4078, 5042, 4523, 3677, 5050, 8693, 4522,
+ 5048, 4078, 5051, 5052, 4523, 3677, 5054, 4526, 4529, 5061,
+ 8693, 5055, 5056, 4534, 4535, 5062, 4091, 5061, 5061, 4536,
+ 4088, 5061, 4534, 5062, 4091, 4534, 5061, 5064, 5065, 5061,
+ 5062, 4091, 4535, 5066, 5067, 4535, 5064, 4536, 4088, 5064,
+
+ 4536, 4088, 5069, 5073, 5074, 4540, 3695, 5070, 5071, 5076,
+ 5077, 4542, 5073, 5074, 5079, 8693, 4543, 4544, 4546, 5080,
+ 5081, 3246, 3247, 4547, 5082, 5076, 5083, 3248, 3249, 5085,
+ 3246, 5087, 4105, 3246, 5086, 5081, 369, 4106, 3249, 8693,
+ 5087, 5089, 5090, 5087, 4552, 3710, 5092, 5093, 4554, 5089,
+ 5090, 5095, 5788, 4555, 4556, 4558, 5096, 5097, 3267, 3268,
+ 4559, 5098, 5092, 5099, 3269, 3270, 5101, 3267, 5103, 4116,
+ 3267, 5102, 5097, 8693, 4117, 3270, 5788, 5103, 4565, 4118,
+ 5103, 5105, 5106, 4565, 4118, 5108, 5109, 654, 4568, 4569,
+ 5112, 5113, 3288, 3289, 655, 4571, 5114, 5116, 5113, 4128,
+
+ 3289, 4578, 8693, 5118, 4565, 4118, 4579, 4129, 5119, 5120,
+ 5110, 4578, 8693, 5122, 8693, 4582, 4579, 4129, 5123, 5124,
+ 4583, 4584, 4568, 4569, 5127, 369, 3307, 4571, 5114, 5128,
+ 5129, 3308, 3309, 5110, 368, 368, 369, 368, 368, 681,
+ 368, 368, 368, 368, 368, 368, 682, 368, 368, 368,
+ 368, 368, 4586, 5959, 5132, 4590, 4593, 4587, 5130, 5133,
+ 5129, 4141, 5125, 5137, 4146, 4598, 4142, 3309, 5137, 4146,
+ 4599, 4143, 5139, 6741, 368, 4598, 5959, 5140, 5141, 6742,
+ 4599, 4143, 5137, 4146, 5143, 5125, 4605, 4606, 8693, 5144,
+ 5145, 5151, 5152, 4610, 5161, 5163, 5152, 368, 368, 4601,
+
+ 369, 368, 368, 369, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 5154, 8693, 4605, 4606,
+ 4158, 6290, 5155, 5156, 5158, 6381, 4159, 3750, 5157, 4159,
+ 3750, 6382, 4160, 4615, 4616, 4615, 4616, 5165, 368, 407,
+ 8693, 4620, 8693, 4163, 4164, 6290, 408, 3762, 2859, 5166,
+ 4619, 5167, 8693, 4621, 4619, 4616, 5164, 4629, 3778, 5181,
+ 5182, 368, 4603, 4604, 4603, 4603, 4603, 8693, 4603, 4605,
+ 4606, 4603, 4603, 4603, 4603, 4607, 4603, 4603, 4603, 4603,
+ 5164, 3762, 2859, 4629, 3778, 4635, 8693, 5169, 5174, 5175,
+ 4636, 4637, 4629, 3778, 4629, 3778, 5181, 5201, 5187, 8693,
+
+ 4635, 8693, 4603, 5188, 5189, 4636, 4637, 4649, 4652, 4643,
+ 8693, 5203, 8693, 4635, 4644, 5200, 5204, 5189, 4636, 4637,
+ 8693, 5183, 8693, 5184, 8693, 4603, 4157, 4157, 4157, 4157,
+ 4157, 4608, 4157, 4159, 3750, 4157, 4157, 4157, 5159, 4157,
+ 4157, 4157, 4157, 4157, 5183, 4658, 5184, 5198, 5211, 4190,
+ 4659, 4187, 4635, 5231, 5232, 5225, 8693, 4636, 4637, 4182,
+ 5226, 5227, 5173, 8693, 4183, 3775, 4157, 4658, 5174, 5175,
+ 5198, 5176, 4659, 4187, 5176, 4666, 3794, 5234, 5235, 5231,
+ 5232, 5234, 5247, 8693, 5177, 8693, 5199, 5205, 8693, 4157,
+ 3761, 4620, 3761, 3761, 3761, 5178, 3761, 3762, 2859, 3761,
+
+ 3761, 3761, 3761, 4621, 3761, 3761, 3761, 3761, 5177, 5199,
+ 5205, 4182, 8693, 3793, 3794, 4658, 4183, 3775, 5178, 6424,
+ 4659, 4187, 8693, 3366, 3367, 6425, 5236, 4674, 5206, 5243,
+ 3761, 4678, 4675, 4676, 5244, 5245, 4679, 5246, 8693, 4658,
+ 4691, 3820, 5268, 5269, 4659, 4187, 2898, 2176, 8693, 5228,
+ 5236, 5238, 5206, 3761, 368, 3826, 1044, 1045, 368, 426,
+ 368, 443, 368, 368, 368, 368, 779, 368, 368, 368,
+ 368, 368, 5228, 5229, 5238, 5241, 5249, 5262, 8693, 4691,
+ 3820, 5250, 5245, 5263, 5264, 5270, 8693, 3793, 3794, 5265,
+ 8693, 3366, 3367, 8693, 368, 4695, 5229, 8693, 5241, 5273,
+
+ 4696, 4697, 5263, 5264, 5274, 5275, 3384, 5268, 5286, 4711,
+ 4712, 3385, 3386, 5237, 8693, 5239, 8693, 368, 368, 441,
+ 369, 368, 368, 426, 368, 443, 368, 368, 368, 368,
+ 779, 368, 368, 368, 368, 368, 5237, 5179, 5239, 5255,
+ 5170, 5185, 4635, 4629, 3778, 4641, 4182, 4636, 4637, 2898,
+ 2176, 4183, 3775, 4706, 1044, 1045, 5292, 5293, 368, 4631,
+ 3384, 8693, 5255, 4639, 5170, 3385, 3386, 4185, 5240, 6490,
+ 4632, 4701, 8693, 5210, 4640, 6491, 4702, 5285, 4186, 5211,
+ 4190, 368, 5212, 4631, 6895, 5212, 8693, 4639, 6561, 5256,
+ 6896, 4185, 5240, 4632, 6562, 5213, 8693, 4640, 5191, 5192,
+
+ 8693, 4186, 5210, 8693, 5193, 5194, 5214, 5195, 5211, 4190,
+ 5195, 5212, 5256, 8693, 5212, 5292, 5295, 2904, 8693, 5213,
+ 5196, 8693, 2905, 2906, 5213, 4719, 4720, 5223, 4658, 5214,
+ 6617, 5197, 2904, 4659, 4187, 5214, 6618, 2905, 2906, 8693,
+ 2528, 5257, 5304, 5305, 5196, 2529, 2173, 2528, 5213, 4661,
+ 4722, 4729, 2529, 2173, 5197, 4181, 4182, 6642, 5214, 8693,
+ 4662, 4183, 3775, 6643, 4184, 5257, 5258, 4184, 7015, 5259,
+ 5307, 5305, 6669, 4661, 7016, 5277, 5278, 4185, 6670, 4695,
+ 5260, 5279, 5280, 4662, 4696, 4697, 2220, 5281, 4186, 5258,
+ 5282, 5288, 5259, 4228, 4229, 2220, 5289, 5275, 2220, 4230,
+
+ 3817, 4185, 4229, 5260, 4714, 4231, 8693, 4230, 3817, 4715,
+ 5294, 4186, 4657, 4658, 5304, 5305, 369, 5300, 4659, 4187,
+ 3415, 4660, 5301, 4709, 4660, 4725, 3416, 3417, 369, 5308,
+ 4726, 4727, 3418, 4725, 4661, 4245, 3417, 369, 4726, 4727,
+ 5308, 5309, 5310, 4247, 6097, 4662, 4245, 3417, 4248, 4249,
+ 4733, 3849, 5309, 8693, 5311, 4731, 3850, 2948, 4661, 494,
+ 4732, 5312, 4734, 5307, 5313, 6240, 4731, 6097, 4662, 5216,
+ 5217, 4732, 4727, 8693, 3849, 5218, 5219, 8693, 5220, 3850,
+ 2948, 5220, 494, 5317, 369, 5315, 4739, 3854, 6240, 5318,
+ 5319, 5221, 5320, 5325, 5326, 5320, 8693, 5323, 4739, 3854,
+
+ 6826, 4745, 5222, 4739, 3854, 5321, 4746, 4747, 4739, 3854,
+ 8693, 4739, 3854, 5318, 5319, 5221, 5322, 5331, 8693, 4741,
+ 5325, 5345, 5332, 5333, 6826, 5222, 3383, 3384, 6681, 5321,
+ 4742, 8693, 3385, 3386, 6682, 3387, 4745, 5327, 3387, 5322,
+ 5328, 4746, 4747, 4741, 4753, 5329, 4745, 8693, 3388, 4754,
+ 5344, 4746, 4747, 4742, 5351, 369, 5347, 5353, 369, 3389,
+ 5327, 5348, 5333, 5328, 4745, 369, 8693, 4749, 4745, 4746,
+ 4747, 4264, 3388, 4746, 4747, 6692, 4265, 3851, 4750, 5354,
+ 369, 6693, 3389, 5251, 4211, 5352, 5353, 369, 8693, 4212,
+ 3386, 4749, 5252, 4764, 4765, 5252, 5356, 5357, 5342, 5349,
+
+ 8693, 4750, 5343, 4767, 4782, 5253, 5359, 5357, 2220, 5352,
+ 3450, 3451, 4751, 4264, 5356, 5357, 5254, 2220, 4265, 3851,
+ 2220, 5342, 5349, 5359, 5377, 5343, 4778, 4798, 4799, 5253,
+ 8693, 4779, 4780, 8693, 4267, 8693, 3450, 3451, 5364, 5254,
+ 4689, 4690, 4689, 4689, 4689, 4268, 4689, 4691, 3820, 4689,
+ 4689, 4689, 4689, 4692, 4689, 4689, 4689, 4689, 4267, 4264,
+ 5365, 5364, 5388, 5389, 4265, 3851, 2966, 2967, 4268, 8693,
+ 2966, 2967, 4801, 4814, 2575, 1908, 5350, 2575, 1908, 8693,
+ 4689, 4778, 8693, 5365, 4784, 5366, 4779, 4780, 4784, 4785,
+ 5376, 3882, 6741, 4785, 4780, 8693, 3883, 2988, 6742, 5367,
+
+ 5350, 5368, 5369, 4689, 4693, 4694, 4695, 4693, 4693, 5366,
+ 4693, 4696, 4697, 4693, 4693, 4693, 4693, 4698, 4693, 4693,
+ 4693, 4693, 5367, 8693, 5368, 5369, 5391, 5389, 8693, 3882,
+ 8693, 3882, 8693, 4810, 3883, 2988, 3883, 2988, 4811, 4812,
+ 5388, 5389, 2986, 8693, 4693, 4810, 7160, 2987, 2988, 4816,
+ 4811, 4812, 7161, 2986, 4817, 5406, 2583, 8693, 2987, 2988,
+ 8693, 2584, 2585, 5379, 8693, 5380, 5381, 4693, 4227, 4227,
+ 4229, 4227, 4227, 4699, 4227, 4230, 3817, 4227, 4227, 4227,
+ 5283, 4227, 4227, 4227, 4227, 4227, 5379, 5382, 5380, 5384,
+ 5381, 5391, 5407, 8693, 4816, 8693, 3908, 8693, 2583, 4817,
+
+ 4812, 3909, 3027, 2584, 2585, 6895, 3484, 3485, 4227, 8693,
+ 5382, 6896, 5384, 4832, 3919, 5424, 5425, 5419, 5420, 5424,
+ 5442, 8693, 5378, 3882, 3484, 3485, 8693, 5383, 3883, 2988,
+ 5397, 4227, 368, 4706, 1044, 1045, 368, 368, 368, 368,
+ 368, 368, 368, 368, 4788, 368, 368, 368, 368, 368,
+ 5383, 4837, 5396, 5397, 5429, 4789, 4838, 4839, 8693, 5430,
+ 5431, 4843, 3007, 3008, 2230, 8693, 4844, 5441, 4788, 2231,
+ 1905, 5444, 368, 4849, 4852, 5396, 5445, 5431, 4789, 4858,
+ 5452, 4343, 5469, 5470, 4859, 4340, 4865, 3934, 2606, 1923,
+ 8693, 5399, 5385, 2606, 1923, 368, 368, 4706, 1044, 1045,
+
+ 368, 4233, 368, 368, 368, 368, 368, 368, 4707, 368,
+ 368, 368, 368, 368, 5399, 5385, 5401, 5400, 5472, 5473,
+ 5463, 8693, 4873, 8693, 3908, 5464, 5465, 4874, 4875, 3909,
+ 3027, 8693, 2230, 5469, 5470, 8693, 368, 2231, 1905, 5401,
+ 5400, 5481, 8693, 4877, 5472, 5485, 5482, 5483, 4878, 5484,
+ 4891, 3961, 5506, 5507, 5501, 5502, 5386, 8693, 5409, 368,
+ 368, 441, 369, 368, 368, 442, 368, 443, 368, 368,
+ 368, 368, 444, 368, 368, 368, 368, 368, 3007, 3008,
+ 5386, 5409, 5302, 8693, 5487, 8693, 3908, 8693, 3025, 5488,
+ 5483, 3909, 3027, 3026, 3027, 7015, 3449, 5398, 5506, 5524,
+
+ 368, 7016, 3450, 3451, 4896, 3452, 5302, 5511, 3452, 4897,
+ 4898, 4902, 5512, 5513, 4908, 4909, 4903, 5523, 3453, 8693,
+ 5410, 5398, 5412, 368, 3848, 4733, 3849, 3848, 3848, 3454,
+ 3848, 3850, 2948, 3848, 3848, 3848, 3848, 4734, 3848, 3848,
+ 3848, 3848, 3453, 5410, 2612, 5412, 8693, 5360, 8693, 2613,
+ 2614, 8693, 3454, 4277, 3451, 2251, 5361, 3025, 8693, 5361,
+ 2252, 1920, 3026, 3027, 3848, 5526, 3517, 3518, 8693, 5362,
+ 5527, 5513, 7160, 5413, 5531, 5532, 4911, 4924, 7161, 2612,
+ 5363, 5411, 8693, 5415, 2613, 2614, 8693, 3848, 5335, 5336,
+ 5477, 8693, 5360, 5362, 5337, 5338, 5413, 5339, 4277, 3451,
+
+ 5339, 5361, 4336, 5363, 5361, 5411, 5415, 4337, 3916, 8693,
+ 5340, 8693, 5414, 5477, 5362, 3517, 3518, 3483, 4832, 3919,
+ 8693, 5341, 8693, 3484, 3485, 5363, 3486, 3933, 3934, 3486,
+ 5446, 5534, 5532, 8693, 5340, 5414, 2251, 8693, 5362, 3487,
+ 5474, 2252, 1920, 5476, 5341, 4263, 4264, 5426, 5363, 5392,
+ 3488, 4265, 3851, 5446, 4266, 4305, 3485, 4266, 5393, 8693,
+ 5416, 5393, 8693, 3487, 5474, 8693, 5476, 4267, 5531, 5532,
+ 5426, 5394, 8693, 3488, 5392, 5534, 5548, 8693, 4268, 8693,
+ 4305, 3485, 5395, 5393, 5416, 8693, 5393, 3933, 3934, 4832,
+ 3919, 4267, 4920, 5408, 3908, 5394, 5394, 4921, 4922, 3909,
+
+ 3027, 4268, 5372, 4287, 8693, 5395, 8693, 5395, 4288, 4289,
+ 8693, 5373, 8693, 5475, 5373, 4820, 8693, 4837, 5427, 8693,
+ 5394, 5418, 4838, 4839, 5374, 8693, 4821, 5419, 5420, 8693,
+ 5395, 8693, 4920, 4411, 369, 5375, 5475, 4921, 4922, 4820,
+ 4831, 5427, 8693, 5421, 3558, 3559, 4832, 3919, 5374, 4821,
+ 4837, 5439, 4939, 4940, 5422, 4838, 4839, 5451, 5375, 4786,
+ 3882, 8693, 4833, 5452, 4343, 3883, 2988, 5421, 4787, 8693,
+ 4336, 4787, 5538, 4834, 5439, 4337, 3916, 5422, 8693, 5453,
+ 8693, 4788, 8693, 4926, 5440, 8693, 4833, 5447, 4927, 5547,
+ 5454, 8693, 4789, 3047, 2260, 5538, 4834, 5558, 5559, 4942,
+
+ 4955, 5561, 5559, 5453, 4926, 4788, 8693, 5440, 8693, 4927,
+ 4922, 5447, 5478, 5454, 8693, 4789, 368, 4300, 369, 368,
+ 368, 442, 368, 443, 368, 368, 368, 368, 444, 368,
+ 368, 368, 368, 368, 5558, 5559, 5478, 4836, 4837, 5433,
+ 5434, 5561, 5575, 4838, 4839, 5435, 5436, 369, 3047, 2260,
+ 8693, 4335, 4336, 5584, 5585, 8693, 368, 4337, 3916, 4840,
+ 4858, 5437, 5584, 5585, 8693, 4859, 4340, 5616, 4857, 4858,
+ 4841, 8693, 5438, 4338, 4859, 4340, 369, 5479, 8693, 368,
+ 5402, 4313, 8693, 4840, 4339, 5437, 4314, 4315, 8693, 5403,
+ 4860, 5616, 5403, 4841, 5466, 5438, 5775, 4338, 3532, 5451,
+
+ 5479, 4861, 5404, 3533, 3534, 5452, 4343, 4339, 5587, 5588,
+ 4383, 4974, 4975, 5405, 4860, 4384, 3958, 5466, 4974, 5593,
+ 5775, 5453, 5595, 5588, 4861, 8693, 5404, 5529, 5456, 5457,
+ 8693, 5492, 5454, 8693, 5458, 5459, 5405, 4818, 3908, 3071,
+ 3072, 8693, 4858, 3909, 3027, 5453, 4819, 4859, 4340, 4819,
+ 5460, 5529, 4978, 4979, 5492, 5454, 4857, 4858, 5540, 4820,
+ 8693, 5461, 4859, 4340, 8693, 3531, 3532, 4978, 4979, 8693,
+ 4821, 3533, 3534, 8693, 5460, 3532, 5467, 8693, 4860, 8693,
+ 3533, 3534, 5540, 4820, 5461, 5489, 4363, 3535, 8693, 4861,
+ 3052, 4364, 3534, 4821, 8693, 3053, 3054, 8693, 3536, 5467,
+
+ 3052, 8693, 4860, 2636, 5493, 3053, 3054, 5490, 2637, 2257,
+ 2636, 3535, 4861, 5500, 5494, 2637, 2257, 4890, 5491, 5501,
+ 5502, 3536, 8693, 4891, 3961, 4891, 3961, 5493, 8693, 4891,
+ 3961, 5490, 5496, 8693, 5495, 5503, 4982, 5600, 5494, 4892,
+ 8693, 5491, 4896, 5497, 4982, 4979, 5504, 4897, 4898, 8693,
+ 4893, 3558, 3559, 8693, 5508, 5496, 369, 5495, 5509, 5503,
+ 8693, 4895, 4896, 4892, 5515, 5516, 5497, 4897, 4898, 5504,
+ 5517, 5518, 8693, 4893, 4896, 5539, 5521, 5508, 8693, 4897,
+ 4898, 5509, 7196, 4899, 4027, 3618, 5519, 4383, 8693, 4382,
+ 4383, 8693, 4384, 3958, 4900, 4384, 3958, 5520, 5539, 5521,
+
+ 8693, 3071, 3072, 2650, 1945, 7196, 3557, 4899, 5522, 8693,
+ 5519, 4385, 3558, 3559, 2220, 5528, 8693, 4900, 5535, 8693,
+ 5520, 8693, 4386, 2220, 4390, 3559, 2220, 5542, 3560, 8693,
+ 5541, 5522, 2650, 1945, 8693, 4385, 5544, 4398, 5528, 3561,
+ 5536, 4951, 4399, 4400, 8693, 4386, 4952, 4953, 4928, 3981,
+ 5542, 5537, 3560, 5541, 3982, 3088, 3106, 3107, 5545, 8693,
+ 5543, 3981, 3561, 8693, 5536, 5535, 3982, 3088, 8693, 5546,
+ 4929, 4390, 3559, 8693, 5537, 5567, 4449, 4450, 8693, 4928,
+ 3981, 4930, 5545, 5543, 3086, 3982, 3088, 5536, 8693, 3087,
+ 3088, 8693, 5546, 8693, 4929, 5549, 8693, 3981, 5537, 5567,
+
+ 3086, 4929, 3982, 3088, 4930, 3087, 3088, 8693, 5551, 2655,
+ 8693, 5536, 4930, 8693, 2656, 2657, 8693, 2655, 5549, 5584,
+ 5585, 5537, 2656, 2657, 2282, 4929, 4974, 5593, 8693, 2283,
+ 1942, 5550, 5551, 3586, 5552, 4930, 2282, 5562, 5553, 3587,
+ 3588, 2283, 1942, 4416, 3588, 8693, 3587, 3588, 3587, 3588,
+ 5554, 8693, 5555, 8693, 5550, 3589, 8693, 5552, 8693, 5563,
+ 5556, 5553, 3106, 3107, 2674, 1958, 3590, 8693, 2674, 1958,
+ 5564, 4951, 5566, 5554, 5565, 5555, 4952, 4953, 8693, 3589,
+ 5571, 4424, 8693, 5563, 5556, 8693, 4425, 4426, 5569, 3590,
+ 8693, 5568, 8693, 5564, 5562, 5566, 5570, 5565, 4959, 4006,
+
+ 4416, 3588, 5572, 4957, 4007, 3123, 4978, 4979, 4958, 5574,
+ 8693, 5569, 4957, 5573, 5568, 8693, 5563, 4958, 4953, 5570,
+ 4960, 4982, 5600, 4959, 4006, 8693, 5572, 5564, 4006, 4007,
+ 3123, 4961, 4006, 4007, 3123, 8693, 5573, 4007, 3123, 8693,
+ 5563, 3121, 8693, 3121, 4960, 4960, 3122, 3123, 3122, 3123,
+ 5564, 8693, 2679, 8693, 4961, 2679, 4961, 2680, 2681, 2300,
+ 2680, 2681, 5576, 8693, 2301, 1955, 5577, 5578, 2300, 4960,
+ 8693, 5590, 8693, 2301, 1955, 5579, 5591, 5592, 4441, 4961,
+ 8693, 5580, 8693, 4442, 4443, 5576, 8693, 5582, 5581, 5577,
+ 4445, 5578, 5583, 8693, 4026, 5598, 5599, 4986, 5579, 4984,
+
+ 3157, 5605, 5602, 5603, 5580, 8693, 5606, 5607, 5609, 8693,
+ 5582, 5581, 4456, 5610, 5611, 4992, 5583, 4990, 4028, 4992,
+ 4993, 4994, 5614, 8693, 4993, 5612, 4456, 5615, 5607, 4997,
+ 8693, 4457, 4458, 4997, 4998, 4999, 4461, 8693, 4998, 4999,
+ 4040, 5618, 5619, 5002, 8693, 5005, 3179, 5002, 5003, 5620,
+ 4040, 8693, 5003, 4999, 4465, 4041, 3632, 5009, 5623, 4466,
+ 4467, 5627, 4475, 4045, 4046, 5628, 369, 8693, 5013, 5015,
+ 5009, 5623, 5629, 5635, 5016, 5630, 4053, 5638, 5636, 4488,
+ 8693, 4054, 4055, 5639, 5640, 8693, 5638, 5023, 4063, 5638,
+ 5023, 4063, 5642, 5643, 5026, 8693, 5026, 5639, 5640, 5027,
+
+ 5028, 5027, 5028, 5645, 5649, 5650, 5642, 5654, 5646, 5647,
+ 5651, 5652, 5030, 5649, 5656, 8693, 5649, 5031, 5653, 5657,
+ 5647, 4502, 4503, 5034, 5037, 5661, 8693, 4504, 4060, 8693,
+ 4502, 5662, 4508, 4502, 5661, 5042, 5043, 5661, 8693, 5661,
+ 8693, 5044, 4505, 8693, 5042, 5662, 4508, 5042, 5661, 5664,
+ 5665, 5661, 5662, 4508, 5043, 5666, 5667, 5043, 5664, 5044,
+ 4505, 5664, 5044, 4505, 5669, 5673, 5674, 5048, 4078, 5670,
+ 5671, 5676, 5677, 5050, 5673, 5674, 5679, 8693, 5051, 5052,
+ 5054, 5680, 5681, 3674, 3675, 5055, 5682, 5676, 5683, 3676,
+ 3677, 5685, 3674, 5687, 4522, 3674, 5686, 5681, 8693, 4523,
+
+ 3677, 5690, 5687, 5062, 4091, 5687, 8693, 5691, 5692, 8693,
+ 5690, 5062, 4091, 5690, 5694, 5695, 5065, 8693, 5065, 5691,
+ 5692, 5066, 5067, 5066, 5067, 5697, 5701, 5702, 5694, 5706,
+ 5698, 5699, 5703, 5704, 5069, 5701, 5708, 8693, 5701, 5070,
+ 5705, 5709, 5699, 4534, 4535, 5073, 5074, 5711, 5712, 4536,
+ 4088, 3693, 4534, 5076, 5083, 4534, 8693, 3694, 3695, 5715,
+ 3693, 5714, 5712, 3693, 5079, 4540, 3695, 8693, 5715, 5080,
+ 5081, 5715, 5711, 5712, 5079, 5716, 4542, 5714, 5718, 5080,
+ 5081, 4543, 4544, 8693, 5716, 5087, 4105, 5716, 8693, 5715,
+ 8693, 4106, 3249, 8693, 5087, 4540, 3695, 5087, 5715, 5085,
+
+ 8693, 5715, 5085, 8693, 5086, 5717, 4105, 5086, 5081, 5089,
+ 5090, 4106, 3249, 5720, 5721, 3708, 5092, 5099, 5723, 5721,
+ 5095, 3709, 3710, 5724, 3708, 5096, 5097, 3708, 8693, 4552,
+ 3710, 5095, 5724, 5720, 5721, 5724, 5096, 5097, 5725, 4554,
+ 5723, 5727, 5103, 4116, 4555, 4556, 5724, 5725, 4117, 3270,
+ 5725, 5103, 4552, 3710, 5103, 5724, 5101, 8693, 5724, 5101,
+ 8693, 5102, 5726, 4116, 5102, 5097, 5105, 5106, 4117, 3270,
+ 5729, 5730, 5732, 5733, 5108, 5734, 5736, 5730, 4565, 4118,
+ 654, 5112, 5113, 5112, 5113, 4568, 4569, 655, 4128, 3289,
+ 5116, 5738, 5116, 5113, 5118, 5105, 5106, 5737, 5740, 5119,
+
+ 5120, 5744, 8693, 5741, 5742, 5122, 5745, 5746, 5108, 5734,
+ 5123, 5747, 5749, 8693, 4578, 5112, 5113, 5750, 5742, 4579,
+ 4129, 5737, 368, 368, 369, 368, 368, 681, 368, 368,
+ 368, 368, 368, 368, 682, 368, 368, 368, 368, 368,
+ 5127, 8693, 5127, 8693, 5751, 5128, 5129, 5128, 5129, 4582,
+ 8693, 4141, 8693, 5132, 4583, 4584, 4142, 3309, 5133, 5752,
+ 5116, 5738, 368, 8693, 5132, 5754, 5755, 8693, 5751, 5133,
+ 5129, 5137, 4146, 5757, 5758, 5139, 5754, 5755, 5760, 8693,
+ 5140, 5141, 5764, 5761, 5762, 368, 5143, 5765, 5766, 5757,
+ 5768, 5144, 5767, 5770, 8693, 4598, 5151, 5152, 5771, 5762,
+
+ 4599, 4143, 368, 368, 369, 368, 368, 5147, 368, 368,
+ 368, 368, 368, 368, 5773, 368, 368, 368, 368, 368,
+ 5151, 5152, 4604, 5155, 5156, 5780, 5781, 8693, 4605, 4606,
+ 5155, 5156, 4605, 4606, 4607, 8693, 5782, 4158, 5163, 5783,
+ 5163, 5152, 368, 4159, 3750, 8693, 1256, 4163, 4164, 4160,
+ 407, 3762, 2859, 5785, 5174, 5175, 8693, 408, 1251, 5791,
+ 5792, 5174, 5175, 5174, 5175, 368, 4603, 4603, 4603, 4603,
+ 4603, 5149, 4603, 4605, 4606, 4603, 4603, 4603, 5776, 4603,
+ 4603, 4603, 4603, 4603, 5165, 5181, 5201, 5803, 5792, 5187,
+ 4163, 4164, 5800, 8693, 5188, 5189, 5166, 5174, 5175, 5791,
+
+ 5792, 8693, 5789, 8693, 4629, 3778, 4603, 5187, 5174, 5175,
+ 5795, 5796, 5188, 5189, 5192, 5800, 4629, 3778, 8693, 5193,
+ 5194, 5803, 5816, 8693, 5177, 8693, 5801, 5804, 5805, 4603,
+ 5153, 5154, 5153, 5153, 5153, 5178, 5153, 5155, 5156, 5153,
+ 5153, 5153, 5153, 5157, 5153, 5153, 5153, 5153, 5177, 5801,
+ 5804, 5808, 5805, 8693, 5192, 8693, 5809, 5810, 5178, 5193,
+ 5194, 4635, 8693, 5203, 5211, 4190, 4636, 4637, 5204, 5815,
+ 5153, 5203, 5828, 5829, 5211, 4190, 5204, 5189, 5821, 5822,
+ 5192, 8693, 5192, 8693, 5179, 5193, 5194, 5193, 5194, 5813,
+ 4629, 3778, 8693, 5153, 4157, 4157, 4157, 4157, 4157, 4157,
+
+ 4157, 4159, 3750, 4157, 4157, 4157, 4631, 4157, 4157, 4157,
+ 4157, 4157, 5813, 4182, 5811, 4635, 5812, 4632, 4183, 3775,
+ 4636, 4637, 4182, 5828, 5848, 5211, 4190, 4183, 3775, 8693,
+ 4631, 5817, 5814, 8693, 4157, 8693, 5217, 5811, 5834, 5812,
+ 4632, 5218, 5219, 5835, 5836, 5231, 5232, 5855, 5856, 8693,
+ 5211, 4190, 8693, 5818, 5830, 5817, 5814, 4157, 4157, 4157,
+ 4157, 4157, 4157, 4608, 4157, 4159, 3750, 4157, 4157, 4157,
+ 5159, 4157, 4157, 4157, 4157, 4157, 5818, 5830, 5217, 5831,
+ 8693, 5225, 8693, 5218, 5219, 5217, 5226, 5847, 5234, 5247,
+ 5218, 5219, 5858, 5856, 5794, 5855, 5856, 8693, 4157, 5850,
+
+ 5795, 5796, 5831, 5797, 5851, 5836, 5797, 5217, 8693, 5243,
+ 5858, 5874, 5218, 5219, 5244, 5245, 5798, 3793, 3794, 5845,
+ 8693, 4157, 4162, 5165, 4162, 4162, 4162, 5799, 4162, 4163,
+ 4164, 4162, 4162, 4162, 4162, 5166, 4162, 4162, 4162, 4162,
+ 5798, 5846, 5845, 4658, 8693, 5863, 5243, 8693, 4659, 4187,
+ 5799, 5244, 5245, 4658, 5263, 5264, 5886, 5887, 4659, 4187,
+ 5853, 5249, 4162, 8693, 5846, 5249, 5250, 5873, 5863, 4211,
+ 5250, 5245, 5268, 5286, 4212, 3386, 5897, 5887, 3366, 3367,
+ 8693, 5852, 3793, 3794, 5853, 4162, 3761, 3761, 3761, 3761,
+ 3761, 5168, 3761, 3762, 2859, 3761, 3761, 3761, 5786, 3761,
+
+ 3761, 3761, 3761, 3761, 5852, 5889, 5864, 5866, 8693, 5263,
+ 5264, 5890, 5891, 8693, 4211, 5893, 8693, 5892, 8693, 4212,
+ 3386, 2898, 2176, 4691, 3820, 4690, 3761, 3366, 3367, 5864,
+ 5866, 4691, 3820, 5273, 5886, 5887, 5273, 4692, 5274, 5275,
+ 8693, 5274, 5275, 5890, 5891, 5867, 5865, 8693, 5876, 3761,
+ 368, 4300, 369, 368, 368, 426, 368, 443, 368, 368,
+ 368, 368, 779, 368, 368, 368, 368, 368, 5867, 4628,
+ 5865, 5876, 8693, 5185, 4635, 4629, 3778, 2528, 4630, 4636,
+ 4637, 4630, 2529, 2173, 2898, 2176, 8693, 5806, 5192, 8693,
+ 368, 4631, 5278, 5193, 5194, 4639, 8693, 5279, 5280, 1913,
+
+ 369, 8693, 4632, 5897, 5907, 5882, 4640, 8693, 1321, 5196,
+ 8693, 1321, 5868, 368, 8693, 4631, 5826, 5292, 5295, 4639,
+ 5197, 1346, 5211, 4190, 8693, 4632, 5912, 4712, 5882, 4640,
+ 4634, 4635, 1347, 5196, 8693, 5868, 4636, 4637, 5213, 4638,
+ 8693, 4211, 4638, 5197, 4628, 1346, 4212, 3386, 8693, 5214,
+ 4629, 3778, 4639, 4630, 5902, 1347, 4630, 8693, 5820, 5903,
+ 5904, 8693, 5213, 4640, 5821, 5822, 4631, 5823, 3384, 8693,
+ 5823, 8693, 5214, 3385, 3386, 5877, 4639, 4632, 5912, 4712,
+ 5824, 5912, 4712, 1897, 369, 8693, 4640, 4181, 4182, 8693,
+ 4631, 5825, 5878, 4183, 3775, 1312, 4184, 8693, 5877, 4184,
+
+ 4632, 5832, 5217, 8693, 5824, 5223, 4658, 5218, 5219, 4185,
+ 8693, 4659, 4187, 5278, 5825, 8693, 5878, 8693, 5279, 5280,
+ 4186, 5304, 5305, 5221, 5905, 8693, 3384, 4661, 5304, 5305,
+ 3792, 3385, 3386, 4185, 5222, 4695, 3793, 3794, 4662, 3795,
+ 4696, 4697, 3795, 4186, 5288, 5307, 5313, 5221, 2904, 5289,
+ 5906, 4661, 3796, 2905, 2906, 5307, 5305, 5222, 5838, 5839,
+ 5879, 4662, 5859, 3797, 5840, 5841, 4690, 5842, 4666, 3794,
+ 5842, 5860, 4691, 3820, 5860, 8693, 3796, 5880, 4692, 8693,
+ 5843, 5318, 5319, 5879, 5861, 369, 3797, 5859, 5931, 5932,
+ 8693, 5844, 8693, 4666, 3794, 5862, 5860, 2904, 8693, 5860,
+
+ 5880, 844, 2905, 2906, 5843, 5288, 5875, 4211, 5861, 5861,
+ 5289, 5275, 4212, 3386, 5844, 4657, 4658, 8693, 5862, 8693,
+ 5862, 4659, 4187, 8693, 4660, 844, 2528, 4660, 5253, 8693,
+ 5881, 2529, 2173, 5861, 4694, 4695, 8693, 4661, 8693, 5254,
+ 4696, 4697, 8693, 5862, 5318, 5319, 4698, 8693, 4662, 5300,
+ 5883, 8693, 5253, 5881, 5301, 4709, 8693, 4228, 4229, 8693,
+ 5914, 4661, 5254, 4230, 3817, 5915, 5916, 5325, 5345, 4231,
+ 5300, 4662, 5869, 4674, 5883, 5301, 4709, 5918, 4675, 4676,
+ 5921, 5870, 5919, 5920, 5870, 8693, 4719, 4720, 8693, 4245,
+ 3417, 4247, 5922, 3849, 5871, 5924, 4248, 4249, 3850, 2948,
+
+ 5310, 4247, 5926, 5921, 8693, 5872, 4248, 4249, 8693, 4719,
+ 4720, 8693, 5311, 5318, 5319, 5922, 8693, 5929, 5871, 8693,
+ 5318, 5319, 8693, 5318, 5319, 5934, 5943, 5932, 5872, 5251,
+ 4211, 5935, 5936, 8693, 5937, 4212, 3386, 5937, 5252, 5321,
+ 8693, 5252, 5940, 4739, 3854, 4739, 3854, 5938, 5331, 5941,
+ 5322, 5253, 8693, 5332, 5333, 5945, 5931, 5932, 5939, 5935,
+ 5936, 5331, 5254, 5321, 5336, 5940, 5332, 5333, 5944, 5337,
+ 5338, 5938, 5941, 5322, 8693, 5253, 8693, 5948, 8693, 5945,
+ 8693, 5939, 5949, 5950, 8693, 5254, 5261, 5262, 5261, 5261,
+ 5261, 5944, 5261, 5263, 5264, 5261, 5261, 5261, 5261, 5265,
+
+ 5261, 5261, 5261, 5261, 5336, 5943, 5956, 5356, 5357, 5337,
+ 5338, 5336, 8693, 5336, 8693, 5347, 5337, 5338, 5337, 5338,
+ 5348, 5955, 5347, 5356, 5357, 8693, 5261, 5348, 5333, 5359,
+ 5377, 4745, 5359, 5357, 4277, 3451, 4746, 4747, 5388, 5389,
+ 5388, 5389, 4277, 3451, 8693, 5951, 8693, 5952, 5954, 5261,
+ 4689, 4689, 4689, 4689, 4689, 5266, 4689, 4691, 3820, 4689,
+ 4689, 4689, 5894, 4689, 4689, 4689, 4689, 4689, 5951, 4287,
+ 5952, 5967, 5954, 8693, 4288, 4289, 5986, 2230, 5391, 5407,
+ 8693, 4745, 2231, 1905, 5391, 5389, 4746, 4747, 4305, 3485,
+ 4689, 8693, 4264, 8693, 5967, 4313, 8693, 4265, 3851, 8693,
+
+ 4314, 4315, 5419, 5420, 6013, 6014, 4264, 4277, 3451, 5953,
+ 5957, 4265, 3851, 4689, 4693, 4693, 4695, 4693, 4693, 5271,
+ 4693, 4696, 4697, 4693, 4693, 4693, 5898, 4693, 4693, 4693,
+ 4693, 4693, 5953, 8693, 5957, 8693, 5968, 5958, 6010, 2251,
+ 5424, 5442, 6024, 6014, 2252, 1920, 3450, 3451, 6013, 6014,
+ 5323, 6017, 6018, 8693, 4693, 8693, 4739, 3854, 5429, 5968,
+ 5958, 5429, 8693, 5430, 5431, 4287, 5430, 5431, 6024, 6036,
+ 4288, 4289, 4741, 2966, 2967, 5970, 5353, 4693, 5276, 5277,
+ 5278, 5276, 5276, 4742, 5276, 5279, 5280, 5276, 5276, 5276,
+ 5276, 5281, 5276, 5276, 5276, 5276, 4741, 368, 5970, 5978,
+
+ 8693, 5972, 5452, 4343, 5434, 8693, 4742, 5960, 5961, 5435,
+ 5436, 6046, 6047, 8693, 6028, 8693, 2966, 2967, 5276, 6029,
+ 6030, 368, 5978, 5444, 5972, 6041, 6042, 8693, 5445, 6035,
+ 5960, 5961, 5329, 4745, 8693, 4305, 3485, 8693, 4746, 4747,
+ 5971, 5276, 4227, 4227, 4229, 4227, 4227, 4227, 4227, 4230,
+ 3817, 4227, 4227, 4227, 4749, 4227, 4227, 4227, 4227, 4227,
+ 3450, 3451, 5444, 5971, 5993, 4750, 5457, 5445, 5431, 6051,
+ 8693, 5458, 5459, 8693, 6052, 6053, 6046, 6064, 4749, 5969,
+ 5469, 5470, 4227, 8693, 5463, 2575, 1908, 5993, 4750, 5464,
+ 6063, 4287, 8693, 2986, 6071, 6072, 4288, 4289, 2987, 2988,
+
+ 8693, 2575, 1908, 5969, 5974, 4227, 4227, 4227, 4229, 4227,
+ 4227, 4699, 4227, 4230, 3817, 4227, 4227, 4227, 5283, 4227,
+ 4227, 4227, 4227, 4227, 5973, 5979, 5983, 3882, 5974, 5472,
+ 5485, 8693, 3883, 2988, 8693, 4336, 8693, 3882, 4305, 3485,
+ 4337, 3916, 3883, 2988, 5981, 6066, 4227, 5973, 5979, 5983,
+ 6067, 6053, 6074, 6072, 5481, 6071, 6072, 6074, 6088, 5482,
+ 5483, 8693, 3484, 3485, 8693, 5980, 6038, 5994, 5981, 4227,
+ 368, 1326, 369, 368, 368, 442, 368, 443, 368, 368,
+ 368, 368, 444, 1312, 368, 368, 368, 368, 5980, 6038,
+ 5994, 5996, 5481, 8693, 5487, 5501, 5502, 5482, 5483, 5488,
+
+ 6087, 8693, 2986, 8693, 3007, 3008, 4738, 2987, 2988, 8693,
+ 368, 5487, 4739, 3854, 5996, 4740, 5488, 5483, 4740, 6099,
+ 6100, 5506, 5524, 8693, 4313, 6110, 6100, 8693, 4741, 4314,
+ 4315, 5982, 5998, 368, 4244, 5308, 4244, 4244, 4244, 4742,
+ 4244, 4245, 3417, 4244, 4244, 4244, 4244, 5309, 4244, 4244,
+ 4244, 4244, 4741, 8693, 5982, 5998, 6099, 6100, 6002, 8693,
+ 4313, 8693, 4742, 5511, 8693, 4314, 4315, 2583, 5512, 5513,
+ 5946, 5336, 2584, 2585, 4244, 8693, 5337, 5338, 8693, 3908,
+ 8693, 6002, 5511, 8693, 3909, 3027, 8693, 5512, 5513, 8693,
+ 5419, 5420, 5340, 8693, 6003, 5984, 6005, 4244, 4246, 5310,
+
+ 4247, 4246, 4246, 5341, 4246, 4248, 4249, 4246, 4246, 4246,
+ 4246, 5311, 4246, 4246, 4246, 4246, 5340, 6003, 5984, 6021,
+ 6005, 4832, 3919, 5516, 6103, 6104, 5341, 8693, 5517, 5518,
+ 6114, 6110, 6122, 6026, 2583, 6115, 6116, 8693, 4246, 2584,
+ 2585, 5526, 6021, 5526, 5531, 5532, 5527, 6121, 5527, 5513,
+ 5531, 5532, 5534, 5548, 3025, 5534, 5532, 6026, 5985, 3026,
+ 3027, 4246, 3848, 3848, 3849, 3848, 3848, 5314, 3848, 3850,
+ 2948, 3848, 3848, 3848, 5927, 3848, 3848, 3848, 3848, 3848,
+ 3484, 3485, 5985, 1913, 369, 2606, 1923, 6007, 3517, 3518,
+ 8693, 4738, 1321, 5558, 5559, 1321, 8693, 4739, 3854, 5995,
+
+ 4740, 8693, 3848, 4740, 6000, 1346, 8693, 6080, 5962, 8693,
+ 6007, 8693, 5966, 4741, 4764, 4765, 1347, 5963, 4277, 3451,
+ 5963, 2606, 1923, 5995, 4742, 3848, 4744, 4745, 6000, 1346,
+ 5964, 6080, 4746, 4747, 5362, 4748, 8693, 4741, 4748, 1347,
+ 8693, 5965, 5558, 5559, 5999, 5363, 4837, 4742, 4749, 3007,
+ 3008, 4838, 4839, 8693, 5964, 5977, 4287, 8693, 5362, 4750,
+ 8693, 4288, 4289, 6034, 5965, 3025, 8693, 5999, 5363, 5962,
+ 3026, 3027, 4749, 5997, 8693, 4764, 4765, 5374, 5963, 8693,
+ 2230, 5963, 4750, 4263, 4264, 2231, 1905, 6034, 5375, 4265,
+ 3851, 5964, 4266, 8693, 6006, 4266, 5997, 5378, 3882, 8693,
+
+ 5988, 5374, 5965, 3883, 2988, 4267, 4798, 4799, 5987, 5989,
+ 8693, 5375, 5989, 5561, 5575, 5964, 4268, 6006, 8693, 4788,
+ 6144, 2282, 5990, 5561, 5559, 5965, 2283, 1942, 8693, 4267,
+ 4789, 5987, 8693, 5991, 4832, 3919, 5587, 5588, 8693, 4268,
+ 5351, 369, 3908, 4788, 5587, 5588, 5990, 3909, 3027, 2612,
+ 3933, 3934, 8693, 4789, 2613, 2614, 5991, 6025, 5590, 475,
+ 476, 3440, 478, 5591, 5592, 479, 8693, 480, 8693, 5992,
+ 6004, 3441, 1592, 483, 484, 4305, 3485, 6008, 6078, 8693,
+ 6025, 6001, 4313, 475, 476, 3440, 478, 4314, 4315, 479,
+ 480, 5394, 8693, 6004, 3441, 1592, 483, 484, 5372, 4287,
+
+ 6008, 6078, 5395, 5404, 4288, 4289, 8693, 5373, 5587, 5588,
+ 5373, 2612, 5988, 8693, 5405, 5394, 2613, 2614, 4798, 4799,
+ 5374, 5989, 3047, 2260, 5989, 5395, 8693, 5404, 5419, 5420,
+ 8693, 5375, 8693, 3052, 5990, 6009, 8693, 5405, 3053, 3054,
+ 8693, 5408, 3908, 8693, 5374, 5991, 4969, 3909, 3027, 8693,
+ 6083, 4970, 4971, 8693, 5375, 5402, 4313, 6022, 5990, 6009,
+ 8693, 4314, 4315, 4820, 5403, 2251, 6094, 5403, 5991, 5418,
+ 2252, 1920, 6016, 6083, 4821, 5419, 5420, 5404, 6017, 6018,
+ 6022, 6167, 6168, 6167, 6168, 5452, 4343, 4820, 5405, 6094,
+ 5434, 5421, 8693, 6011, 6019, 5435, 5436, 4821, 5434, 8693,
+
+ 4831, 5404, 5422, 5435, 5436, 6020, 4832, 3919, 8693, 5452,
+ 4343, 5405, 1950, 369, 6048, 5421, 6011, 8693, 6019, 8693,
+ 4836, 4837, 4833, 8693, 6031, 5422, 4838, 4839, 6020, 5433,
+ 5434, 8693, 6032, 4834, 1346, 5435, 5436, 6048, 6049, 3933,
+ 3934, 8693, 4840, 4837, 8693, 1347, 4833, 6031, 4838, 4839,
+ 8693, 5437, 8693, 4841, 4336, 6032, 4834, 8693, 1346, 4337,
+ 3916, 6049, 5438, 6079, 4858, 8693, 4840, 8693, 1347, 4859,
+ 4340, 6033, 6037, 4335, 4336, 5437, 4841, 4831, 8693, 4337,
+ 3916, 6040, 8693, 4832, 3919, 5438, 6079, 6041, 6042, 6170,
+ 6171, 8693, 6068, 8693, 6033, 4338, 6037, 8693, 5451, 4833,
+
+ 3047, 2260, 5457, 6043, 5452, 4343, 4339, 5458, 5459, 8693,
+ 4834, 5457, 5595, 6172, 6044, 6068, 5458, 5459, 8693, 4338,
+ 5453, 5595, 5588, 4833, 6082, 4446, 4447, 6043, 8693, 4339,
+ 8693, 5454, 8693, 4834, 5456, 5457, 6061, 6044, 4891, 3961,
+ 5458, 5459, 6055, 6056, 5453, 6062, 8693, 6082, 6057, 6058,
+ 6112, 4857, 4858, 8693, 5454, 4858, 5460, 4859, 4340, 6061,
+ 4859, 4340, 3517, 3518, 6059, 4978, 4979, 5461, 6062, 369,
+ 3932, 8693, 6069, 4860, 6112, 6060, 3933, 3934, 8693, 6075,
+ 5460, 8693, 5501, 5502, 4861, 4865, 3934, 6075, 6059, 6436,
+ 5461, 6081, 3935, 4865, 3934, 8693, 6069, 4860, 6060, 6084,
+
+ 4873, 6076, 8693, 3936, 8693, 4874, 4875, 4861, 8693, 6076,
+ 8693, 6107, 6077, 6436, 6081, 8693, 3935, 5489, 4363, 8693,
+ 6077, 6085, 4441, 4364, 3534, 6076, 3936, 4442, 4443, 5587,
+ 5588, 4363, 6086, 6076, 6107, 6077, 4364, 3534, 369, 5490,
+ 6167, 6168, 8693, 6077, 8693, 6085, 5489, 4363, 5501, 5502,
+ 5491, 4363, 4364, 3534, 3052, 6086, 4364, 3534, 6703, 3053,
+ 3054, 4891, 3961, 5490, 3532, 6089, 3532, 8693, 5490, 3533,
+ 3534, 3533, 3534, 5491, 8693, 2636, 8693, 6108, 8693, 5491,
+ 2637, 2257, 6703, 6093, 6111, 6090, 3071, 3072, 6089, 2636,
+ 6091, 4383, 5490, 8693, 2637, 2257, 4384, 3958, 6092, 8693,
+
+ 6108, 8693, 5491, 6095, 8693, 5500, 6093, 6111, 6090, 6102,
+ 6132, 5501, 5502, 6096, 6091, 6103, 6104, 4890, 5595, 6172,
+ 8693, 6092, 6124, 4891, 3961, 8693, 6095, 5503, 5627, 4475,
+ 8693, 6105, 8693, 6132, 4895, 4896, 8693, 6096, 5504, 4892,
+ 4897, 4898, 6106, 3558, 3559, 6124, 5515, 5516, 1950, 369,
+ 4893, 5503, 5517, 5518, 5516, 6105, 4899, 6182, 6183, 5517,
+ 5518, 5504, 6130, 4892, 8693, 6106, 5516, 4900, 5519, 4896,
+ 1346, 5517, 5518, 4893, 4897, 4898, 5627, 4475, 4896, 5520,
+ 4899, 1347, 8693, 4897, 4898, 8693, 6130, 8693, 6117, 8693,
+ 4900, 8693, 5519, 8693, 1346, 6120, 8693, 6119, 4390, 3559,
+
+ 6118, 8693, 5520, 4890, 1347, 8693, 4382, 4383, 6125, 4891,
+ 3961, 6117, 4384, 3958, 4908, 4909, 4383, 4390, 3559, 6120,
+ 6119, 4384, 3958, 6118, 8693, 4892, 8693, 6128, 4385, 8693,
+ 6126, 8693, 2650, 1945, 6123, 8693, 4893, 8693, 5535, 4386,
+ 8693, 6127, 3071, 3072, 4390, 3559, 6129, 3558, 3559, 4892,
+ 6128, 3981, 4385, 8693, 6126, 6134, 3982, 3088, 6123, 4893,
+ 5536, 8693, 4386, 8693, 6127, 8693, 2650, 1945, 6139, 6129,
+ 6133, 5537, 8693, 5544, 4398, 8693, 6131, 4398, 6134, 4399,
+ 4400, 4398, 4399, 4400, 5536, 6135, 4399, 4400, 6185, 6186,
+ 5544, 4398, 6139, 6133, 5537, 5545, 4399, 4400, 6125, 6131,
+
+ 5627, 4475, 3981, 8693, 4908, 4909, 5546, 3982, 3088, 6135,
+ 8693, 6136, 5545, 5639, 5640, 6137, 3086, 5639, 5640, 5545,
+ 6126, 3087, 3088, 5546, 6196, 6197, 8693, 3086, 8693, 5546,
+ 6138, 6127, 3087, 3088, 6136, 2655, 5545, 2655, 6137, 8693,
+ 2656, 2657, 2656, 2657, 6126, 6140, 5546, 4416, 3588, 8693,
+ 2282, 6146, 8693, 6138, 6127, 2283, 1942, 4939, 4940, 5562,
+ 6141, 6143, 8693, 6142, 8693, 4416, 3588, 8693, 6140, 4416,
+ 3588, 3587, 3588, 6147, 3587, 3588, 6149, 8693, 6145, 2674,
+ 1958, 5563, 8693, 6141, 6148, 6143, 6142, 3106, 3107, 8693,
+ 6151, 8693, 5564, 8693, 3106, 3107, 8693, 6147, 6150, 6149,
+
+ 8693, 6145, 6155, 6152, 8693, 5563, 8693, 6148, 2674, 1958,
+ 8693, 6153, 5642, 5654, 6151, 5564, 8693, 5571, 4424, 6203,
+ 6197, 6150, 6154, 4425, 4426, 6155, 6152, 6156, 6196, 6197,
+ 4424, 8693, 4424, 8693, 6153, 4425, 4426, 4425, 4426, 5572,
+ 6200, 6201, 6203, 6209, 8693, 6154, 5571, 4424, 6146, 8693,
+ 5573, 6156, 4425, 4426, 4939, 4940, 4006, 5662, 4508, 5662,
+ 4508, 4007, 3123, 5572, 6157, 8693, 6158, 8693, 5572, 4006,
+ 6147, 3121, 8693, 5573, 4007, 3123, 3122, 3123, 8693, 5573,
+ 8693, 6148, 6215, 6216, 6159, 3121, 6160, 6157, 8693, 6158,
+ 3122, 3123, 5572, 2679, 6147, 6212, 6213, 8693, 2680, 2681,
+
+ 6161, 8693, 5573, 2679, 6148, 6165, 2300, 6159, 2680, 2681,
+ 6160, 2301, 1955, 8693, 2300, 6215, 6227, 8693, 6162, 2301,
+ 1955, 6163, 8693, 6161, 3155, 8693, 4445, 6164, 4986, 3156,
+ 3157, 5598, 5599, 5602, 5603, 5673, 5674, 6232, 6233, 8693,
+ 5605, 6162, 6166, 5609, 6163, 5606, 5607, 5605, 5610, 5611,
+ 5605, 6164, 5606, 5607, 4986, 5606, 5607, 5609, 8693, 4987,
+ 4988, 6177, 6174, 6175, 4456, 6166, 6178, 6179, 5614, 4457,
+ 4458, 5614, 8693, 5615, 6180, 4461, 5615, 5607, 4997, 8693,
+ 4462, 4463, 3177, 4998, 4999, 4461, 8693, 3178, 3179, 8693,
+ 5618, 5619, 5628, 369, 8693, 5013, 5635, 8693, 6188, 5629,
+
+ 5635, 5636, 4488, 6189, 6190, 5636, 4488, 6192, 6199, 5676,
+ 5683, 8693, 6193, 6194, 6200, 6201, 5022, 6199, 6235, 6233,
+ 6199, 5645, 5023, 4063, 5645, 5022, 5646, 5647, 5022, 5646,
+ 5647, 5025, 5026, 6232, 6233, 8693, 5650, 5027, 5028, 5650,
+ 5025, 5651, 5652, 5025, 5651, 5652, 6205, 1321, 369, 6235,
+ 6239, 6206, 6207, 8693, 4502, 4503, 1321, 8693, 5022, 1321,
+ 4504, 4060, 8693, 4502, 5023, 4063, 4502, 5022, 5656, 8693,
+ 5022, 5656, 6211, 5657, 6208, 8693, 5657, 5647, 6212, 6213,
+ 5665, 6211, 5665, 8693, 6211, 5666, 5667, 5666, 5667, 6218,
+ 6222, 6223, 5691, 5692, 6219, 6220, 6224, 6225, 5669, 6222,
+
+ 6229, 8693, 6222, 5670, 6226, 6230, 6220, 5042, 5043, 5691,
+ 5692, 4076, 8693, 5044, 4505, 6236, 5042, 4077, 4078, 5042,
+ 4076, 5048, 4078, 4076, 6236, 5679, 8693, 6236, 5679, 8693,
+ 5680, 5681, 5685, 5680, 5681, 6237, 5050, 5686, 6238, 5687,
+ 4522, 5051, 5052, 6236, 6237, 4523, 3677, 6237, 5687, 5048,
+ 4078, 5687, 6236, 5685, 8693, 6236, 4522, 8693, 5686, 5681,
+ 6245, 4523, 3677, 6242, 6243, 8693, 6246, 6247, 8693, 6245,
+ 5694, 5706, 6245, 6249, 6243, 5061, 6242, 6243, 6246, 6247,
+ 5697, 5062, 4091, 5697, 5061, 5698, 5699, 5061, 5698, 5699,
+ 5064, 5065, 6249, 6255, 8693, 5702, 5066, 5067, 5702, 5064,
+
+ 5703, 5704, 5064, 5703, 5704, 6251, 1321, 369, 5711, 5712,
+ 6252, 6253, 8693, 4534, 4535, 1321, 8693, 5061, 1321, 4536,
+ 4088, 8693, 4534, 5062, 4091, 4534, 5061, 5708, 8693, 5061,
+ 5708, 8693, 5709, 6254, 6256, 5709, 5699, 5711, 5712, 8693,
+ 5073, 5074, 8693, 6256, 5714, 5718, 6256, 5714, 5712, 4540,
+ 3695, 4542, 5716, 4542, 5720, 5721, 4543, 4544, 4543, 4544,
+ 6256, 5716, 5720, 5721, 5716, 8693, 5073, 5074, 6257, 6256,
+ 5723, 5727, 6256, 8693, 5089, 5090, 8693, 6257, 5723, 5721,
+ 6257, 4552, 3710, 4554, 5725, 4554, 5729, 5730, 4555, 4556,
+ 4555, 4556, 6257, 5725, 5729, 5730, 5725, 8693, 5089, 5090,
+
+ 8693, 6257, 5105, 5106, 6257, 5732, 5733, 6259, 6260, 4565,
+ 4118, 5736, 6261, 5736, 5730, 4568, 4569, 5740, 5729, 5730,
+ 5740, 8693, 5741, 5742, 5118, 5741, 5742, 5744, 8693, 5119,
+ 5120, 6263, 5745, 5746, 5732, 5733, 6264, 6265, 4578, 8693,
+ 5749, 5736, 6261, 4579, 4129, 5750, 6266, 5749, 5754, 5755,
+ 6268, 6269, 5750, 5742, 368, 368, 369, 368, 368, 681,
+ 368, 368, 368, 368, 368, 368, 682, 368, 368, 368,
+ 368, 368, 4582, 6271, 6272, 5757, 5768, 4583, 4584, 6274,
+ 6269, 5137, 4146, 5760, 6268, 6269, 5760, 8693, 5761, 5762,
+ 5139, 5761, 5762, 5764, 368, 5140, 5141, 6276, 5765, 5766,
+
+ 6271, 6272, 6277, 6278, 4598, 5137, 4146, 5770, 8693, 4599,
+ 4143, 8693, 5771, 6279, 6274, 6280, 5770, 368, 5780, 6283,
+ 8693, 5771, 5762, 368, 368, 369, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 8693, 368, 368, 368, 368,
+ 368, 6287, 5156, 5155, 5156, 4604, 4163, 4164, 5791, 5792,
+ 8693, 4605, 4606, 5791, 5792, 5795, 5796, 4607, 6293, 6294,
+ 5795, 5796, 8693, 368, 5803, 5816, 5803, 5792, 6293, 6302,
+ 5821, 5822, 8693, 5174, 5175, 5808, 5795, 5796, 5795, 5796,
+ 5809, 6301, 8693, 5174, 5175, 6298, 368, 368, 368, 369,
+ 368, 368, 5147, 368, 368, 368, 368, 368, 368, 5773,
+
+ 368, 368, 368, 368, 368, 6295, 6297, 6296, 8693, 6298,
+ 6307, 8693, 4629, 3778, 8693, 6308, 5194, 6317, 6318, 8693,
+ 4629, 3778, 5821, 5822, 8693, 6299, 8693, 368, 6295, 6297,
+ 6296, 5828, 5848, 6329, 6318, 6317, 6318, 6321, 6322, 4635,
+ 8693, 5789, 5821, 5822, 4636, 4637, 6300, 5174, 5175, 6299,
+ 368, 4603, 4603, 4603, 4603, 4603, 4603, 4603, 4605, 4606,
+ 4603, 4603, 4603, 5177, 4603, 4603, 4603, 4603, 4603, 6300,
+ 6312, 6326, 5834, 8693, 5178, 5834, 8693, 5835, 5836, 5839,
+ 5835, 5836, 8693, 5192, 5840, 5841, 8693, 5177, 5193, 5194,
+ 8693, 4603, 8693, 6312, 6326, 5192, 8693, 5178, 6334, 8693,
+
+ 5193, 5194, 4182, 6335, 6336, 6329, 6342, 4183, 3775, 5855,
+ 5856, 6309, 6310, 8693, 4603, 4603, 4603, 4603, 4603, 4603,
+ 5149, 4603, 4605, 4606, 4603, 4603, 4603, 5776, 4603, 4603,
+ 4603, 4603, 4603, 4635, 6309, 6313, 6310, 5839, 4636, 4637,
+ 5855, 5856, 5840, 5841, 5850, 5821, 5822, 4182, 8693, 5851,
+ 6341, 6311, 4183, 3775, 5850, 4603, 5858, 5874, 6313, 5851,
+ 5836, 5858, 5856, 8693, 5839, 5211, 4190, 4666, 3794, 5840,
+ 5841, 4666, 3794, 8693, 6327, 6311, 6314, 6331, 4603, 5153,
+ 5153, 5153, 5153, 5153, 5778, 5153, 5155, 5156, 5153, 5153,
+ 5153, 6281, 5153, 5153, 5153, 5153, 5153, 6327, 6337, 6314,
+
+ 6350, 6331, 4674, 5886, 5887, 5839, 8693, 4675, 4676, 8693,
+ 5840, 5841, 5217, 5886, 5887, 5211, 4190, 5218, 5219, 5153,
+ 8693, 6337, 8693, 6350, 5217, 6367, 2528, 5890, 5891, 5218,
+ 5219, 2529, 2173, 6373, 6374, 4666, 3794, 8693, 6330, 6338,
+ 6339, 6340, 5153, 4162, 4162, 4162, 4162, 4162, 5784, 4162,
+ 4163, 4164, 4162, 4162, 4162, 6288, 4162, 4162, 4162, 4162,
+ 4162, 6330, 6338, 6339, 6351, 6340, 5262, 5263, 5264, 5890,
+ 5891, 8693, 5263, 5264, 4658, 6375, 5897, 5907, 5265, 4659,
+ 4187, 5897, 5887, 4162, 4658, 8693, 5902, 6351, 8693, 4659,
+ 4187, 5903, 6378, 6373, 6379, 6387, 6388, 6291, 5912, 4712,
+
+ 3793, 3794, 6343, 5795, 5796, 6344, 4162, 3761, 3761, 3761,
+ 3761, 3761, 3761, 3761, 3762, 2859, 3761, 3761, 3761, 5798,
+ 3761, 3761, 3761, 3761, 3761, 8693, 6343, 6384, 6344, 6353,
+ 5799, 5278, 6385, 5280, 4694, 4695, 5279, 5280, 3366, 3367,
+ 4696, 4697, 8693, 5798, 6390, 6391, 4698, 3761, 5262, 3793,
+ 3794, 5914, 6353, 5799, 5263, 5264, 5915, 5916, 6387, 6388,
+ 5265, 6390, 6401, 4719, 4720, 8693, 6355, 8693, 6352, 6406,
+ 3761, 3761, 3761, 3761, 3761, 3761, 5168, 3761, 3762, 2859,
+ 3761, 3761, 3761, 5786, 3761, 3761, 3761, 3761, 3761, 6355,
+ 5173, 2219, 6352, 3366, 3367, 8693, 5174, 5175, 8693, 5176,
+
+ 2220, 8693, 5176, 2220, 2898, 2176, 2898, 2176, 5806, 5192,
+ 8693, 3761, 5177, 2221, 5193, 5194, 8693, 6354, 4245, 3417,
+ 5931, 5932, 6315, 5178, 2222, 6357, 4211, 6356, 5821, 5822,
+ 5196, 4212, 3386, 6393, 3761, 8693, 5177, 2221, 6394, 6395,
+ 6354, 5197, 8693, 6362, 5824, 8693, 5178, 2222, 8693, 6357,
+ 6356, 5173, 5931, 5932, 5196, 5825, 6397, 5174, 5175, 8693,
+ 5176, 6398, 6399, 5176, 5197, 4634, 4635, 6362, 5824, 8693,
+ 3384, 4636, 4637, 5177, 4638, 3385, 3386, 4638, 5825, 6320,
+ 5935, 5936, 8693, 5826, 5178, 6321, 6322, 4639, 6323, 5211,
+ 4190, 6323, 6413, 6414, 5935, 5936, 8693, 5177, 4640, 6363,
+
+ 8693, 6324, 5943, 5956, 4674, 5213, 8693, 5178, 5210, 4675,
+ 4676, 4639, 6325, 4674, 5211, 4190, 5214, 5212, 4675, 4676,
+ 5212, 4640, 6363, 5943, 5932, 6324, 5832, 5217, 8693, 5213,
+ 5213, 2904, 5218, 5219, 8693, 6325, 2905, 2906, 6359, 5214,
+ 8693, 5214, 6413, 6422, 5918, 6332, 5839, 6360, 5221, 5919,
+ 6400, 5840, 5841, 8693, 5213, 6366, 8693, 4211, 8693, 5222,
+ 8693, 6359, 4212, 3386, 5214, 1913, 369, 5843, 4764, 4765,
+ 6360, 8693, 5221, 8693, 1321, 6403, 8693, 1321, 5844, 6366,
+ 6404, 6395, 5222, 5216, 5217, 6361, 8693, 1346, 5300, 5218,
+ 5219, 5843, 5220, 5301, 4709, 5220, 8693, 5210, 1347, 4798,
+
+ 4799, 5844, 8693, 5211, 4190, 5221, 5212, 8693, 6361, 5212,
+ 8693, 1346, 3384, 5935, 5936, 8693, 5222, 3385, 3386, 5213,
+ 8693, 1347, 4247, 8693, 5318, 5319, 6345, 4248, 4249, 5221,
+ 5214, 8693, 5231, 5232, 8693, 6346, 6418, 8693, 6346, 5222,
+ 4657, 4658, 6415, 5213, 6349, 6364, 4659, 4187, 6347, 4660,
+ 4666, 3794, 4660, 5214, 8693, 5935, 5936, 8693, 5948, 6348,
+ 6418, 8693, 4661, 5949, 6421, 6415, 5861, 8693, 6364, 6358,
+ 4674, 8693, 6347, 4662, 6427, 4675, 4676, 5862, 8693, 6428,
+ 5338, 8693, 6348, 8693, 6416, 8693, 4661, 8693, 5875, 4211,
+ 5861, 5871, 8693, 4264, 4212, 3386, 4662, 6345, 4265, 3851,
+
+ 5862, 8693, 5872, 5231, 5232, 8693, 6346, 6416, 4264, 6346,
+ 5253, 2904, 8693, 4265, 3851, 5871, 2905, 2906, 2528, 6347,
+ 8693, 5254, 6434, 2529, 2173, 5872, 5869, 4674, 5318, 5319,
+ 6348, 8693, 4675, 4676, 5253, 5870, 4739, 3854, 5870, 6365,
+ 8693, 6433, 8693, 6347, 5254, 6434, 6368, 8693, 5871, 6419,
+ 8693, 6417, 8693, 6348, 4739, 3854, 4277, 3451, 8693, 5872,
+ 5336, 6446, 6365, 8693, 6433, 5337, 5338, 2575, 1908, 6368,
+ 6013, 6014, 5871, 6419, 6417, 4764, 4765, 6430, 8693, 6440,
+ 6420, 8693, 5872, 5261, 5261, 5261, 5261, 5261, 5884, 5261,
+ 5263, 5264, 5261, 5261, 5261, 6369, 5261, 5261, 5261, 5261,
+
+ 5261, 6430, 6440, 6420, 6438, 6455, 2583, 5986, 2230, 6013,
+ 6014, 2584, 2585, 2231, 1905, 8693, 5336, 6017, 6018, 1913,
+ 369, 5337, 5338, 5261, 4745, 6479, 6480, 6438, 1321, 4746,
+ 4747, 1321, 8693, 4277, 3451, 6024, 6036, 6024, 6014, 4764,
+ 4765, 1346, 6431, 8693, 6429, 6441, 5261, 5888, 5889, 5888,
+ 5888, 5888, 1347, 5888, 5890, 5891, 5888, 5888, 5888, 5888,
+ 5892, 5888, 5888, 5888, 5888, 1346, 6431, 6429, 6439, 6441,
+ 6467, 6479, 6488, 6475, 2612, 1347, 2606, 1923, 4745, 2613,
+ 2614, 6041, 6042, 4746, 4747, 6502, 6503, 5888, 6010, 2251,
+ 8693, 6439, 6028, 8693, 2252, 1920, 8693, 6029, 6487, 6046,
+
+ 6064, 5929, 3450, 3451, 8693, 3450, 3451, 5318, 5319, 6432,
+ 5888, 4689, 4689, 4689, 4689, 4689, 4689, 4689, 4691, 3820,
+ 4689, 4689, 4689, 5321, 4689, 4689, 4689, 4689, 4689, 6442,
+ 6443, 6493, 6432, 8693, 5322, 8693, 6494, 5436, 8693, 3882,
+ 6513, 6503, 6502, 6503, 3883, 2988, 8693, 5321, 2966, 2967,
+ 8693, 4689, 6442, 6443, 2966, 2967, 6051, 5322, 6051, 6506,
+ 6507, 6052, 6053, 6052, 6053, 8693, 4798, 4799, 6513, 6525,
+ 6452, 6444, 8693, 6445, 4689, 4689, 4689, 4689, 4689, 4689,
+ 5266, 4689, 4691, 3820, 4689, 4689, 4689, 5894, 4689, 4689,
+ 4689, 4689, 4689, 6452, 6444, 6459, 4287, 6445, 6056, 8693,
+
+ 6517, 4288, 4289, 6057, 6058, 6518, 6519, 6071, 6072, 6071,
+ 6072, 2575, 1908, 6450, 6066, 4689, 6066, 8693, 6459, 6067,
+ 6524, 6067, 6053, 6074, 6088, 6074, 6072, 6099, 6100, 6411,
+ 8693, 4798, 4799, 8693, 6447, 5935, 5936, 6450, 4689, 4693,
+ 4693, 4695, 4693, 4693, 4693, 4693, 4696, 4697, 4693, 4693,
+ 4693, 5938, 4693, 4693, 4693, 4693, 4693, 6447, 4305, 3485,
+ 6460, 8693, 5939, 6099, 6100, 8693, 6547, 2636, 6103, 6104,
+ 6462, 4287, 2637, 2257, 8693, 5938, 4288, 4289, 8693, 4693,
+ 6550, 6551, 3882, 6460, 8693, 5939, 8693, 3883, 2988, 6110,
+ 6122, 6110, 6100, 8693, 6462, 6550, 6559, 3484, 3485, 6449,
+
+ 6451, 8693, 4693, 4693, 4693, 4695, 4693, 4693, 5271, 4693,
+ 4696, 4697, 4693, 4693, 4693, 5898, 4693, 4693, 4693, 4693,
+ 4693, 6114, 6449, 6564, 6451, 6464, 6115, 6558, 6565, 5518,
+ 6170, 6171, 3908, 8693, 2986, 6170, 6610, 3909, 3027, 2987,
+ 2988, 2986, 8693, 4693, 2230, 6580, 2987, 2988, 6464, 2231,
+ 1905, 2650, 1945, 6588, 2655, 6614, 6168, 6170, 6610, 2656,
+ 2657, 8693, 6453, 6472, 6457, 6454, 4693, 5276, 5276, 5278,
+ 5276, 5276, 5900, 5276, 5279, 5280, 5276, 5276, 5276, 6376,
+ 5276, 5276, 5276, 5276, 5276, 6453, 6472, 4969, 6457, 6454,
+ 5419, 5420, 4970, 4971, 6144, 2282, 6182, 6183, 8693, 2583,
+
+ 2283, 1942, 6484, 5317, 2584, 2585, 8693, 5276, 8693, 5318,
+ 5319, 6599, 5320, 6607, 2679, 5320, 5609, 2674, 1958, 2680,
+ 2681, 6174, 6175, 6017, 6018, 5321, 6484, 6456, 4305, 3485,
+ 5276, 4718, 5921, 4718, 4718, 4718, 5322, 4718, 4719, 4720,
+ 4718, 4718, 4718, 4718, 5922, 4718, 4718, 4718, 4718, 5321,
+ 6456, 6461, 6481, 8693, 6165, 2300, 8693, 6177, 8693, 5322,
+ 2301, 1955, 6178, 6179, 6623, 6624, 3484, 3485, 3007, 3008,
+ 8693, 4718, 6177, 8693, 6461, 6481, 6620, 6178, 6615, 4986,
+ 8693, 6621, 6175, 8693, 4987, 4988, 4474, 4475, 6017, 6018,
+ 6463, 6465, 2606, 1923, 4718, 4244, 4244, 4244, 4244, 4244,
+
+ 5923, 4244, 4245, 3417, 4244, 4244, 4244, 6407, 4244, 4244,
+ 4244, 4244, 4244, 6463, 6465, 6468, 4313, 6482, 6185, 6625,
+ 8693, 4314, 4315, 6627, 6624, 8693, 4313, 5627, 4475, 6182,
+ 6183, 4314, 4315, 6470, 8693, 4244, 3007, 3008, 6468, 8693,
+ 6482, 6188, 8693, 4832, 3919, 6629, 6189, 6190, 6185, 6625,
+ 6630, 6631, 4832, 3919, 6469, 6466, 6485, 6470, 4244, 4246,
+ 4246, 4247, 4246, 4246, 5925, 4246, 4248, 4249, 4246, 4246,
+ 4246, 6409, 4246, 4246, 4246, 4246, 4246, 6469, 6486, 6466,
+ 6485, 5452, 4343, 4486, 8693, 6192, 6196, 6197, 4487, 4488,
+ 6193, 6632, 8693, 6515, 6196, 6197, 8693, 3025, 8693, 4246,
+
+ 3908, 6486, 3026, 3027, 8693, 3909, 3027, 6200, 6201, 8693,
+ 4837, 6200, 6201, 5946, 5336, 4838, 4839, 6515, 6471, 5337,
+ 5338, 6474, 4246, 3848, 3848, 3849, 3848, 3848, 3848, 3848,
+ 3850, 2948, 3848, 3848, 3848, 5340, 3848, 3848, 3848, 3848,
+ 3848, 6498, 6471, 6637, 6638, 6474, 5341, 6634, 8693, 4336,
+ 6203, 6209, 6635, 6631, 4337, 3916, 3025, 6203, 6197, 5340,
+ 8693, 3026, 3027, 3848, 6498, 2251, 8693, 5635, 5638, 5341,
+ 2252, 1920, 5636, 4488, 5639, 5640, 8693, 5638, 6637, 6640,
+ 5638, 8693, 6499, 8693, 6473, 6477, 3848, 3848, 3848, 3849,
+ 3848, 3848, 5314, 3848, 3850, 2948, 3848, 3848, 3848, 5927,
+
+ 3848, 3848, 3848, 3848, 3848, 6499, 2219, 6473, 2612, 6477,
+ 5317, 6212, 6213, 2613, 2614, 2220, 5318, 5319, 2220, 5320,
+ 5434, 8693, 5320, 3517, 3518, 5435, 5436, 3848, 2221, 8693,
+ 5419, 5420, 5321, 6212, 6213, 6437, 6476, 6496, 5966, 2222,
+ 8693, 4764, 4765, 5322, 4277, 3451, 6648, 6649, 8693, 5434,
+ 3848, 6536, 2221, 6483, 5435, 5436, 5321, 5964, 8693, 6476,
+ 5362, 6496, 2222, 4744, 4745, 8693, 5322, 8693, 5965, 4746,
+ 4747, 5363, 4748, 5457, 6536, 4748, 6483, 6495, 5458, 5459,
+ 6458, 5964, 5977, 4287, 5362, 4749, 4798, 4799, 4288, 4289,
+ 6523, 5965, 4837, 8693, 5363, 8693, 4750, 4838, 4839, 5992,
+
+ 6495, 8693, 5990, 8693, 5374, 4305, 3485, 3517, 3518, 4749,
+ 6497, 6001, 4313, 5991, 6523, 5375, 8693, 4314, 4315, 4750,
+ 8693, 5394, 6041, 6042, 4336, 8693, 5990, 8693, 5374, 4337,
+ 3916, 6535, 5395, 5404, 6497, 8693, 5991, 2274, 5375, 8693,
+ 5418, 8693, 6016, 8693, 5405, 5394, 5419, 5420, 6017, 6018,
+ 8693, 6510, 8693, 6500, 6535, 5395, 8693, 5404, 8693, 2221,
+ 6041, 6042, 5421, 8693, 6019, 8693, 6205, 5405, 5452, 4343,
+ 2222, 6206, 6639, 5422, 6510, 6020, 6500, 8693, 4836, 4837,
+ 8693, 4865, 3934, 2221, 4838, 4839, 5421, 8693, 6019, 6511,
+ 8693, 6514, 8693, 2222, 8693, 5418, 5422, 6040, 6020, 6505,
+
+ 4840, 5419, 5420, 6041, 6042, 6506, 6507, 6215, 6227, 8693,
+ 6531, 4841, 6511, 8693, 6514, 8693, 5451, 5421, 8693, 6043,
+ 6056, 6508, 5452, 4343, 4840, 6057, 6058, 8693, 5422, 8693,
+ 6044, 6645, 6509, 6531, 4841, 8693, 6646, 5652, 5453, 4865,
+ 3934, 5421, 6056, 6043, 8693, 6508, 8693, 6057, 6058, 5454,
+ 8693, 5422, 8693, 6044, 6520, 6509, 8693, 5456, 5457, 6055,
+ 6056, 8693, 5453, 5458, 5459, 6057, 6058, 8693, 6532, 6655,
+ 6649, 8693, 5454, 1950, 369, 8693, 6521, 6520, 3532, 5460,
+ 5457, 6059, 8693, 3533, 3534, 5458, 5459, 4857, 4858, 8693,
+ 5461, 6532, 6060, 4859, 4340, 1346, 4858, 4891, 3961, 6521,
+
+ 8693, 4859, 4340, 5460, 5451, 6059, 1347, 6543, 6522, 4860,
+ 5452, 4343, 8693, 5461, 6526, 6060, 4858, 8693, 6528, 1346,
+ 4861, 4859, 4340, 6557, 5469, 5470, 5453, 3933, 3934, 1347,
+ 6543, 6522, 8693, 4860, 8693, 6075, 8693, 5454, 6526, 8693,
+ 6529, 4865, 3934, 4861, 3933, 3934, 6557, 6527, 3047, 2260,
+ 5453, 6530, 8693, 3047, 2260, 8693, 6534, 6076, 6648, 6649,
+ 5454, 4873, 8693, 6533, 6529, 8693, 4874, 4875, 6077, 8693,
+ 6527, 6537, 6538, 8693, 6530, 8693, 6084, 4873, 8693, 6534,
+ 4873, 6076, 4874, 4875, 4363, 4874, 4875, 6533, 8693, 4364,
+ 3534, 6077, 8693, 6528, 6537, 6539, 6538, 8693, 6085, 5469,
+
+ 5470, 6084, 4873, 8693, 6103, 6104, 8693, 4874, 4875, 6086,
+ 8693, 4363, 6541, 8693, 6540, 6529, 4364, 3534, 6539, 6103,
+ 6104, 8693, 6085, 6085, 8693, 3532, 6530, 8693, 6542, 8693,
+ 3533, 3534, 6086, 6552, 6086, 6541, 3052, 6540, 3052, 6529,
+ 2636, 3053, 3054, 3053, 3054, 2637, 2257, 6085, 6553, 6530,
+ 1950, 369, 6542, 6652, 6653, 8693, 6552, 6086, 6544, 5501,
+ 5502, 8693, 6546, 8693, 6545, 8693, 2274, 5500, 6548, 8693,
+ 6102, 6553, 1346, 5501, 5502, 8693, 6103, 6104, 5501, 5502,
+ 8693, 6544, 6554, 1347, 4891, 3961, 6546, 6545, 2221, 5503,
+ 6555, 6548, 6105, 6655, 6661, 8693, 1346, 6556, 8693, 2222,
+
+ 5504, 8693, 5516, 6106, 4896, 6554, 1347, 5517, 5518, 4897,
+ 4898, 8693, 2221, 5503, 6555, 8693, 6105, 6232, 6233, 5516,
+ 8693, 6556, 2222, 5504, 5517, 5518, 6106, 4896, 6232, 6233,
+ 6566, 8693, 4897, 4898, 5500, 6569, 6567, 4895, 4896, 8693,
+ 5501, 5502, 4383, 4897, 4898, 6568, 8693, 4384, 3958, 4383,
+ 4908, 4909, 8693, 6566, 4384, 3958, 5503, 8693, 6569, 4899,
+ 6567, 8693, 4908, 4909, 4390, 3559, 6125, 5504, 8693, 6568,
+ 4900, 8693, 4908, 4909, 8693, 6570, 3558, 3559, 6571, 6572,
+ 5503, 3558, 3559, 4899, 4390, 3559, 8693, 6574, 6126, 8693,
+ 5504, 6573, 8693, 4900, 3071, 3072, 6575, 8693, 6570, 6127,
+
+ 6576, 6571, 6572, 2650, 1945, 3071, 3072, 6235, 6239, 6577,
+ 6574, 8693, 6126, 4398, 6573, 6235, 6233, 6578, 4399, 4400,
+ 6575, 8693, 6127, 6576, 6579, 4398, 6581, 8693, 3981, 8693,
+ 4399, 4400, 6577, 3982, 3088, 8693, 4939, 4940, 3981, 8693,
+ 6578, 6582, 6583, 3982, 3088, 3086, 6584, 3086, 6579, 6581,
+ 3087, 3088, 3087, 3088, 2655, 8693, 2282, 4939, 4940, 2656,
+ 2657, 2283, 1942, 8693, 6582, 6591, 6583, 8693, 6146, 6585,
+ 6584, 6587, 8693, 6586, 4939, 4940, 6590, 4416, 3588, 4416,
+ 3588, 8693, 6589, 3587, 3588, 8693, 6592, 8693, 6591, 6594,
+ 6147, 8693, 6585, 3587, 3588, 6587, 6586, 3106, 3107, 8693,
+
+ 6590, 6148, 6593, 3106, 3107, 6589, 8693, 6595, 8693, 6592,
+ 2674, 1958, 4424, 6594, 6147, 5048, 4078, 4425, 4426, 8693,
+ 6597, 6596, 6598, 4006, 6148, 6593, 1321, 369, 4007, 3123,
+ 6595, 4424, 8693, 6600, 8693, 1321, 4425, 4426, 1321, 8693,
+ 6601, 6603, 8693, 6597, 6596, 4006, 6598, 3121, 6602, 3121,
+ 4007, 3123, 3122, 3123, 3122, 3123, 6600, 6242, 6243, 1321,
+ 369, 2679, 8693, 6601, 2300, 6603, 2680, 2681, 1321, 2301,
+ 1955, 1321, 6602, 6606, 8693, 6605, 6604, 6218, 8693, 5025,
+ 5026, 8693, 6219, 6220, 6609, 5027, 5028, 6218, 5025, 6608,
+ 6223, 5025, 6219, 6220, 5638, 6224, 6225, 6606, 6605, 6604,
+
+ 5639, 5640, 8693, 5638, 6651, 8693, 5638, 8693, 6609, 8693,
+ 6652, 6653, 6608, 6651, 5661, 8693, 6651, 8693, 5664, 5665,
+ 5662, 4508, 8693, 5661, 5666, 5667, 5661, 5664, 6223, 8693,
+ 5664, 6657, 8693, 6224, 6225, 6229, 6658, 6659, 5042, 5043,
+ 6230, 6660, 5661, 8693, 5044, 4505, 8693, 5042, 5662, 4508,
+ 5042, 5661, 6229, 6662, 5661, 6242, 6243, 6230, 6220, 5673,
+ 5674, 5050, 6662, 6237, 5050, 6662, 5051, 5052, 8693, 5051,
+ 5052, 6662, 6237, 6246, 6247, 6237, 8693, 5673, 5674, 5690,
+ 6662, 6246, 6247, 6662, 8693, 5691, 5692, 8693, 5690, 6664,
+ 6665, 5690, 6249, 6255, 6249, 6243, 6251, 6664, 6667, 6672,
+
+ 8693, 6252, 6666, 8693, 6673, 5704, 5064, 5065, 5073, 5074,
+ 5690, 8693, 5066, 5067, 8693, 5064, 5691, 5692, 5064, 5690,
+ 5089, 5090, 5690, 6259, 6674, 6678, 5733, 5105, 5106, 6263,
+ 6259, 6674, 6684, 8693, 6264, 6679, 5118, 6685, 5746, 6268,
+ 6269, 5119, 5120, 6268, 6269, 5754, 5755, 6271, 6272, 6687,
+ 6688, 6274, 6280, 6274, 6269, 6276, 6687, 6690, 6695, 8693,
+ 6277, 6689, 5139, 6696, 5766, 5754, 5755, 5140, 5141, 5153,
+ 5153, 5153, 5153, 5153, 5153, 5153, 5155, 5156, 5153, 5153,
+ 5153, 8693, 5153, 5153, 5153, 5153, 5153, 6287, 5156, 6698,
+ 6699, 6287, 5156, 6701, 6702, 6293, 6302, 6707, 5796, 6707,
+
+ 5796, 8693, 6307, 6707, 5796, 5795, 5796, 6308, 5194, 5153,
+ 6715, 6317, 6318, 8693, 6307, 6716, 6717, 5795, 5796, 6308,
+ 5194, 6317, 6318, 6321, 6322, 8693, 5174, 5175, 6708, 6709,
+ 4629, 3778, 5153, 5153, 5153, 5153, 5153, 5153, 5778, 5153,
+ 5155, 5156, 5153, 5153, 5153, 6281, 5153, 5153, 5153, 5153,
+ 5153, 6708, 6711, 6709, 5174, 5175, 6719, 8693, 6712, 6730,
+ 6731, 6720, 6721, 6321, 6322, 6329, 6342, 6710, 4629, 3778,
+ 6329, 6318, 8693, 5153, 6334, 6711, 8693, 5192, 8693, 6335,
+ 6738, 6712, 5193, 5194, 4635, 6730, 6739, 6291, 8693, 4636,
+ 4637, 6710, 6713, 5795, 5796, 6722, 5153, 4162, 4162, 4162,
+
+ 4162, 4162, 4162, 4162, 4163, 4164, 4162, 4162, 4162, 5798,
+ 4162, 4162, 4162, 4162, 4162, 6713, 6744, 6724, 8693, 6722,
+ 5799, 6745, 5841, 5231, 5232, 5192, 6373, 6379, 8693, 4635,
+ 5193, 5194, 6761, 5798, 4636, 4637, 8693, 4162, 2898, 2176,
+ 6724, 6777, 5891, 5799, 6769, 2904, 5211, 4190, 4182, 8693,
+ 2905, 2906, 8693, 4183, 3775, 8693, 6723, 8693, 6725, 6736,
+ 4162, 4162, 4162, 4162, 4162, 4162, 5784, 4162, 4163, 4164,
+ 4162, 4162, 4162, 6288, 4162, 4162, 4162, 4162, 4162, 6723,
+ 4182, 6725, 6727, 6736, 6315, 4183, 3775, 5820, 5890, 5891,
+ 5821, 5822, 8693, 5821, 5822, 8693, 5823, 6321, 6322, 5823,
+
+ 8693, 4162, 6321, 6322, 6726, 6727, 5824, 6777, 5891, 5824,
+ 6777, 5891, 6728, 2219, 5821, 5822, 8693, 5825, 6321, 6322,
+ 5825, 8693, 2220, 8693, 4162, 2220, 6732, 8693, 6726, 8693,
+ 5824, 6733, 8693, 5824, 6324, 2221, 8693, 6734, 5821, 5822,
+ 5825, 5211, 4190, 5825, 8693, 6325, 2222, 5839, 8693, 6732,
+ 6735, 8693, 5840, 5841, 6733, 6332, 5839, 8693, 6324, 2221,
+ 6734, 5840, 5841, 6387, 6388, 5839, 8693, 6737, 6325, 2222,
+ 5840, 5841, 8693, 5217, 6735, 6746, 8693, 5843, 5218, 5219,
+ 8693, 5217, 6747, 6787, 6788, 8693, 5218, 5219, 5844, 8693,
+ 6737, 6748, 5231, 5232, 4658, 4666, 3794, 4658, 6746, 4659,
+
+ 4187, 5843, 4659, 4187, 5231, 5232, 6747, 5820, 6790, 6791,
+ 8693, 5844, 6749, 5821, 5822, 6748, 5823, 6384, 6755, 5823,
+ 8693, 6753, 6385, 5280, 6752, 8693, 6751, 6750, 8693, 5824,
+ 5231, 5232, 6349, 6754, 8693, 6749, 5216, 5217, 4666, 3794,
+ 5825, 6755, 5218, 5219, 6753, 5220, 6347, 8693, 5220, 6751,
+ 6750, 3793, 3794, 5824, 5861, 8693, 6754, 6348, 5221, 4666,
+ 3794, 3793, 3794, 5825, 8693, 5862, 8693, 3366, 3367, 5222,
+ 6347, 6756, 3366, 3367, 8693, 6757, 2898, 2176, 5861, 4674,
+ 6348, 2528, 5221, 8693, 4675, 4676, 2529, 2173, 5862, 6758,
+ 6759, 6760, 5222, 6390, 6401, 6756, 6358, 4674, 6757, 6762,
+
+ 4674, 6771, 4675, 4676, 4211, 4675, 4676, 6763, 8693, 4212,
+ 3386, 8693, 6758, 6759, 4211, 6760, 8693, 6764, 5871, 4212,
+ 3386, 3384, 6762, 6793, 6788, 6771, 3385, 3386, 8693, 5872,
+ 6763, 3384, 6765, 2904, 8693, 6766, 3385, 3386, 2905, 2906,
+ 8693, 6764, 5871, 8693, 6367, 2528, 5912, 4712, 6779, 6767,
+ 2529, 2173, 5872, 6780, 6781, 6768, 6765, 6384, 6766, 6783,
+ 8693, 6770, 6385, 5280, 6784, 6785, 6787, 6788, 6393, 8693,
+ 6393, 8693, 6767, 6394, 6395, 6394, 6395, 5914, 8693, 6768,
+ 6790, 6791, 5915, 5916, 6770, 5261, 5261, 5261, 5261, 5261,
+ 5261, 5261, 5263, 5264, 5261, 5261, 5261, 8693, 5261, 5261,
+
+ 5261, 5261, 5261, 6397, 8693, 6795, 8693, 5300, 6398, 6399,
+ 6796, 6797, 5301, 4709, 5912, 4712, 6403, 6793, 6799, 4719,
+ 4720, 6404, 6798, 6403, 8693, 5261, 6413, 6422, 6404, 6395,
+ 6805, 5936, 6427, 8693, 5935, 5936, 6813, 6428, 5338, 6805,
+ 5936, 6814, 6815, 8693, 5935, 5936, 6807, 8693, 5261, 5261,
+ 5261, 5261, 5261, 5261, 5884, 5261, 5263, 5264, 5261, 5261,
+ 5261, 6369, 5261, 5261, 5261, 5261, 5261, 6806, 5318, 5319,
+ 6807, 6427, 6805, 5936, 6817, 8693, 6428, 5338, 8693, 6818,
+ 6819, 6808, 5318, 5319, 8693, 4739, 3854, 4764, 4765, 5261,
+ 6806, 6479, 6488, 5336, 6833, 8693, 6446, 8693, 5337, 5338,
+
+ 2966, 2967, 2575, 1908, 8693, 6808, 4739, 3854, 6809, 6811,
+ 6827, 6820, 5261, 5888, 5888, 5888, 5888, 5888, 6371, 5888,
+ 5890, 5891, 5888, 5888, 5888, 6772, 5888, 5888, 5888, 5888,
+ 5888, 6809, 6811, 6827, 6810, 6820, 6840, 2986, 6849, 4764,
+ 4765, 5336, 2987, 2988, 3007, 3008, 5337, 5338, 6455, 2583,
+ 8693, 6828, 6467, 5888, 2584, 2585, 8693, 6810, 2606, 1923,
+ 6862, 6018, 8693, 4745, 8693, 4264, 8693, 6411, 4746, 4747,
+ 4265, 3851, 6821, 5935, 5936, 6828, 5888, 5276, 5276, 5278,
+ 5276, 5276, 5276, 5276, 5279, 5280, 5276, 5276, 5276, 5938,
+ 5276, 5276, 5276, 5276, 5276, 6821, 6822, 4277, 3451, 6825,
+
+ 5939, 5986, 2230, 6862, 6018, 6862, 6018, 2231, 1905, 4745,
+ 6829, 4277, 3451, 5938, 4746, 4747, 8693, 5276, 8693, 6822,
+ 3450, 3451, 6825, 5939, 6856, 3025, 6475, 2612, 6502, 6503,
+ 3026, 3027, 2613, 2614, 6829, 6502, 6503, 6830, 6823, 6832,
+ 5276, 5276, 5276, 5278, 5276, 5276, 5900, 5276, 5279, 5280,
+ 5276, 5276, 5276, 6376, 5276, 5276, 5276, 5276, 5276, 8693,
+ 6830, 6823, 8693, 6832, 2575, 1908, 6010, 2251, 8693, 4287,
+ 6506, 6507, 2252, 1920, 4288, 4289, 8693, 4264, 8693, 6835,
+ 6493, 5276, 4265, 3851, 4287, 6494, 5436, 6870, 8693, 4288,
+ 4289, 3882, 6871, 6872, 6884, 6885, 3883, 2988, 6513, 6525,
+
+ 6837, 6824, 6836, 6835, 5276, 4718, 4718, 4718, 4718, 4718,
+ 6405, 4718, 4719, 4720, 4718, 4718, 4718, 6800, 4718, 4718,
+ 4718, 4718, 4718, 6837, 6838, 6824, 6836, 4798, 4799, 6493,
+ 8693, 6874, 6513, 6503, 6494, 5436, 6875, 6876, 3882, 6844,
+ 8693, 3450, 3451, 3883, 2988, 4718, 6517, 6838, 6884, 6893,
+ 6898, 6518, 6892, 8693, 6914, 6899, 6058, 6550, 6559, 6437,
+ 3047, 2260, 8693, 6844, 6831, 4764, 4765, 6839, 4718, 4244,
+ 4244, 4244, 4244, 4244, 4244, 4244, 4245, 3417, 4244, 4244,
+ 4244, 5964, 4244, 4244, 4244, 4244, 4244, 6831, 2606, 1923,
+ 6839, 8693, 5965, 6922, 3052, 6547, 2636, 6928, 6104, 3053,
+
+ 3054, 2637, 2257, 6851, 8693, 5964, 2966, 2967, 6564, 4244,
+ 6928, 6104, 6936, 6565, 5518, 5965, 6564, 6937, 6938, 6928,
+ 6104, 6565, 5518, 6614, 6168, 2986, 8693, 6851, 8693, 6834,
+ 2987, 2988, 4244, 4244, 4244, 4244, 4244, 4244, 5923, 4244,
+ 4245, 3417, 4244, 4244, 4244, 6407, 4244, 4244, 4244, 4244,
+ 4244, 2583, 6834, 6841, 4305, 3485, 2584, 2585, 6940, 6955,
+ 6982, 6983, 8693, 6941, 6942, 3071, 3072, 6845, 6580, 4798,
+ 4799, 6842, 8693, 4244, 2650, 1945, 6841, 6614, 6168, 6962,
+ 3086, 6985, 6986, 8693, 4336, 3087, 3088, 6458, 8693, 4337,
+ 3916, 6845, 6843, 4798, 4799, 6842, 4244, 4246, 4246, 4247,
+
+ 4246, 4246, 4246, 4246, 4248, 4249, 4246, 4246, 4246, 5990,
+ 4246, 4246, 4246, 4246, 4246, 6843, 6017, 6018, 6882, 6971,
+ 5991, 6614, 6168, 6623, 6624, 3106, 3107, 8693, 6864, 8693,
+ 4305, 3485, 8693, 5990, 3484, 3485, 8693, 4246, 8693, 3484,
+ 3485, 6882, 8693, 5991, 6588, 2655, 8693, 6144, 2282, 8693,
+ 2656, 2657, 6864, 2283, 1942, 8693, 6846, 6847, 6848, 8693,
+ 4246, 4246, 4246, 4247, 4246, 4246, 5925, 4246, 4248, 4249,
+ 4246, 4246, 4246, 6409, 4246, 4246, 4246, 4246, 4246, 6846,
+ 6847, 4313, 6848, 3007, 3008, 4313, 4314, 4315, 3908, 2274,
+ 4314, 4315, 8693, 3909, 3027, 6017, 6018, 3908, 8693, 6852,
+
+ 8693, 4246, 3909, 3027, 3025, 8693, 6850, 2612, 8693, 3026,
+ 3027, 2221, 2613, 2614, 5419, 5420, 6853, 8693, 6863, 4832,
+ 3919, 6854, 2222, 6852, 4246, 8693, 6855, 6858, 8693, 6850,
+ 5419, 5420, 6857, 4832, 3919, 2221, 6623, 6624, 8693, 6853,
+ 6866, 6863, 8693, 6865, 6854, 2222, 8693, 6867, 5434, 6855,
+ 8693, 6858, 8693, 5435, 5436, 6857, 5434, 6868, 8693, 4837,
+ 8693, 5435, 5436, 6866, 4838, 4839, 6877, 6865, 4837, 8693,
+ 6867, 4336, 6040, 4838, 4839, 8693, 4337, 3916, 6041, 6042,
+ 6868, 8693, 6506, 6507, 6506, 6507, 8693, 6878, 5452, 4343,
+ 6877, 8693, 6879, 8693, 6043, 6881, 8693, 6880, 6041, 6042,
+
+ 6505, 6890, 6041, 6042, 8693, 6044, 6506, 6507, 5469, 5470,
+ 6878, 6886, 8693, 6887, 6889, 6879, 5452, 4343, 6043, 6881,
+ 6880, 6888, 6508, 8693, 6056, 6890, 6056, 8693, 6044, 6057,
+ 6058, 6057, 6058, 6509, 6886, 5457, 6887, 6906, 6889, 8693,
+ 5458, 5459, 6891, 6901, 6888, 5457, 6508, 8693, 5456, 5457,
+ 5458, 5459, 6900, 6902, 5458, 5459, 6509, 6040, 5469, 5470,
+ 6906, 4865, 3934, 6041, 6042, 6891, 4858, 6901, 4858, 8693,
+ 5460, 4859, 4340, 4859, 4340, 6900, 6903, 6902, 8693, 6043,
+ 8693, 5461, 3933, 3934, 6908, 8693, 6528, 6907, 3933, 3934,
+ 6044, 8693, 5469, 5470, 5460, 6905, 8693, 4865, 3934, 6903,
+
+ 8693, 6904, 8693, 6043, 5461, 8693, 6910, 6908, 6529, 6909,
+ 6907, 3517, 3518, 6044, 3047, 2260, 6911, 8693, 6905, 6530,
+ 4873, 3517, 3518, 8693, 6904, 4874, 4875, 6182, 6183, 6910,
+ 4363, 8693, 6529, 6909, 6912, 4364, 3534, 6915, 4873, 6911,
+ 6913, 4363, 6530, 4874, 4875, 3532, 4364, 3534, 6916, 8693,
+ 3533, 3534, 8693, 6103, 6104, 6917, 8693, 6912, 8693, 6918,
+ 6915, 6919, 3532, 8693, 6913, 5501, 5502, 3533, 3534, 3052,
+ 8693, 6916, 2636, 6920, 3053, 3054, 6929, 2637, 2257, 6917,
+ 8693, 6103, 6104, 6918, 6919, 8693, 6921, 5501, 5502, 4891,
+ 3961, 6932, 6924, 6930, 4891, 3961, 6920, 6923, 5516, 6929,
+
+ 6931, 5516, 6599, 5517, 5518, 8693, 5517, 5518, 2674, 1958,
+ 6921, 4908, 4909, 6934, 6932, 8693, 6924, 6930, 8693, 6943,
+ 6923, 4896, 6933, 6950, 6931, 4383, 4897, 4898, 4896, 6944,
+ 4384, 3958, 4383, 4897, 4898, 8693, 6934, 4384, 3958, 4908,
+ 4909, 4390, 3559, 6943, 8693, 6933, 8693, 6950, 8693, 6947,
+ 4390, 3559, 6944, 8693, 6945, 3558, 3559, 6946, 3071, 3072,
+ 3558, 3559, 6949, 6951, 5627, 4475, 6948, 6952, 2650, 1945,
+ 4398, 6627, 6995, 6947, 8693, 4399, 4400, 6945, 6953, 6954,
+ 6946, 6956, 8693, 6957, 8693, 6949, 4398, 6951, 6958, 6948,
+ 6952, 4399, 4400, 3981, 8693, 4939, 4940, 8693, 3982, 3088,
+
+ 3981, 6953, 8693, 6954, 6956, 3982, 3088, 6957, 3086, 8693,
+ 2655, 8693, 6958, 3087, 3088, 2656, 2657, 6959, 6965, 4939,
+ 4940, 4416, 3588, 8693, 4416, 3588, 6960, 3587, 3588, 6961,
+ 6964, 6966, 2674, 1958, 6967, 8693, 6963, 3587, 3588, 4424,
+ 6959, 6965, 3106, 3107, 4425, 4426, 6970, 6973, 8693, 6960,
+ 6968, 8693, 6961, 8693, 6964, 6966, 4424, 6974, 6967, 6963,
+ 6969, 4425, 4426, 4006, 8693, 6972, 6627, 6624, 4007, 3123,
+ 6970, 6973, 4006, 6968, 6623, 6624, 8693, 4007, 3123, 6978,
+ 3121, 6974, 8693, 6969, 3121, 3122, 3123, 6975, 6972, 3122,
+ 3123, 6607, 2679, 8693, 2679, 8693, 6976, 2680, 2681, 2680,
+
+ 2681, 6977, 6165, 2300, 6627, 6995, 6637, 6640, 2301, 1955,
+ 6975, 6620, 6979, 8693, 6980, 6988, 6621, 6175, 8693, 6976,
+ 6989, 6990, 6620, 8693, 6977, 6992, 8693, 6621, 6175, 8693,
+ 6993, 6994, 7000, 6201, 6629, 6979, 6629, 8693, 6980, 6630,
+ 6631, 6630, 6631, 6188, 8693, 5635, 8693, 6634, 6189, 6190,
+ 5636, 4488, 6635, 6996, 6634, 8693, 6645, 7000, 6201, 6635,
+ 6631, 6646, 5652, 7002, 8693, 6645, 7000, 6201, 7003, 7004,
+ 6646, 5652, 7006, 6648, 6649, 6648, 6649, 7007, 7008, 6211,
+ 6652, 6653, 6652, 6653, 8693, 6212, 6213, 8693, 6211, 7010,
+ 7011, 6211, 6655, 6661, 6655, 6649, 6657, 7010, 7013, 7018,
+
+ 8693, 6658, 7012, 8693, 7019, 6225, 5664, 5665, 5673, 5674,
+ 6211, 8693, 5666, 5667, 8693, 5664, 6212, 6213, 5664, 6211,
+ 6664, 6667, 6211, 7023, 6247, 6672, 7023, 6247, 7025, 8693,
+ 6673, 5704, 6672, 7026, 7027, 7023, 6247, 6673, 5704, 7029,
+ 6678, 5733, 7033, 7034, 7030, 7031, 6678, 5733, 7036, 7037,
+ 6684, 8693, 7039, 8693, 6684, 6685, 5746, 7040, 7041, 6685,
+ 5746, 6678, 5733, 7043, 6687, 6690, 7049, 6272, 7044, 7045,
+ 6695, 7049, 6272, 7051, 8693, 6696, 5766, 6695, 7052, 7053,
+ 7049, 6272, 6696, 5766, 7055, 6698, 6699, 7059, 7060, 7056,
+ 7057, 5154, 6701, 7061, 7063, 7060, 8693, 5155, 5156, 7064,
+
+ 7067, 7068, 8693, 5157, 8693, 6287, 5156, 6707, 5796, 7070,
+ 7071, 7065, 5795, 5796, 5795, 5796, 5174, 5175, 5174, 5175,
+ 8693, 4629, 3778, 6715, 8693, 7072, 4629, 3778, 6716, 6717,
+ 7067, 7068, 7079, 7070, 7083, 6730, 6739, 7080, 7081, 8693,
+ 7073, 6719, 7075, 8693, 7074, 7076, 6720, 7082, 7085, 7072,
+ 7077, 8693, 5192, 7086, 7081, 4635, 8693, 5193, 5194, 8693,
+ 4636, 4637, 8693, 7073, 8693, 7075, 5192, 7074, 8693, 7076,
+ 8693, 5193, 5194, 7077, 5191, 5192, 7100, 6322, 8693, 7093,
+ 5193, 5194, 4635, 5195, 4182, 7091, 5195, 4636, 4637, 4183,
+ 3775, 8693, 4182, 5821, 5822, 7092, 5196, 4183, 3775, 8693,
+
+ 6321, 6322, 8693, 7093, 6744, 6321, 6322, 5197, 7091, 6745,
+ 5841, 5211, 4190, 7095, 5821, 5822, 7094, 7102, 7092, 7104,
+ 5196, 8693, 6728, 7101, 8693, 7096, 8693, 7103, 6321, 6322,
+ 5197, 7087, 6307, 5211, 4190, 7106, 7095, 6308, 5194, 7094,
+ 7088, 7102, 7104, 7088, 6324, 8693, 7101, 8693, 7096, 7100,
+ 6322, 7103, 8693, 7089, 7108, 6325, 8693, 6744, 7106, 7109,
+ 7110, 7105, 6745, 5841, 7090, 7100, 6322, 7112, 6324, 8693,
+ 5839, 8693, 7113, 7114, 5839, 5840, 5841, 7089, 6325, 5840,
+ 5841, 5231, 5232, 8693, 7105, 5217, 8693, 7090, 7115, 4658,
+ 5218, 5219, 5217, 6752, 4659, 4187, 4658, 5218, 5219, 5231,
+
+ 5232, 4659, 4187, 8693, 7121, 7116, 8693, 5231, 5232, 4666,
+ 3794, 8693, 7115, 7119, 8693, 6347, 4666, 3794, 7117, 7122,
+ 8693, 7118, 7123, 8693, 3793, 3794, 6348, 7121, 7116, 7127,
+ 7120, 3793, 3794, 3366, 3367, 3366, 3367, 7119, 8693, 6347,
+ 8693, 7117, 7124, 7122, 7118, 6761, 7123, 7125, 8693, 6348,
+ 7126, 2898, 2176, 7120, 2898, 2176, 7128, 4674, 7138, 7139,
+ 8693, 4674, 4675, 4676, 8693, 7124, 4675, 4676, 8693, 7129,
+ 7125, 4211, 6777, 5891, 7126, 7130, 4212, 3386, 4211, 7128,
+ 7134, 3384, 8693, 4212, 3386, 3384, 3385, 3386, 6769, 2904,
+ 3385, 3386, 7131, 7129, 2905, 2906, 2904, 7141, 7142, 7130,
+
+ 8693, 2905, 2906, 6779, 7132, 6367, 2528, 7133, 6780, 6781,
+ 8693, 2529, 2173, 7135, 7144, 7131, 7136, 7138, 7139, 7145,
+ 7146, 8693, 5277, 5278, 7141, 7148, 6783, 7132, 5279, 5280,
+ 7133, 6784, 7147, 7150, 5281, 8693, 7135, 8693, 7151, 7146,
+ 7136, 5888, 5888, 5888, 5888, 5888, 5888, 5888, 5890, 5891,
+ 5888, 5888, 5888, 8693, 5888, 5888, 5888, 5888, 5888, 7152,
+ 6384, 6787, 6788, 6787, 6788, 6385, 5280, 6387, 6388, 6790,
+ 6791, 7153, 7155, 7156, 6793, 6799, 6793, 6788, 6795, 7155,
+ 7158, 5888, 7163, 6796, 7157, 5914, 8693, 7164, 6399, 8693,
+ 5915, 5916, 6387, 6388, 7166, 7167, 6805, 5936, 7169, 7170,
+
+ 5935, 5936, 5318, 5319, 5888, 5888, 5888, 5888, 5888, 5888,
+ 6371, 5888, 5890, 5891, 5888, 5888, 5888, 6772, 5888, 5888,
+ 5888, 5888, 5888, 5935, 5936, 8693, 7172, 6813, 7166, 7167,
+ 7173, 8693, 6814, 6815, 5318, 5319, 7171, 7178, 4739, 3854,
+ 7169, 7182, 7179, 7180, 8693, 5888, 4739, 3854, 8693, 7172,
+ 6817, 4764, 4765, 7173, 8693, 6818, 7181, 7184, 7174, 8693,
+ 7171, 8693, 7185, 7180, 7197, 7175, 8693, 7176, 5888, 4718,
+ 4718, 4718, 4718, 4718, 4718, 4718, 4719, 4720, 4718, 4718,
+ 4718, 7174, 4718, 4718, 4718, 4718, 4718, 7201, 7197, 7175,
+ 7176, 6833, 8693, 3450, 3451, 5336, 8693, 2966, 2967, 8693,
+
+ 5337, 5338, 5336, 7222, 7223, 4745, 6446, 5337, 5338, 4718,
+ 4746, 4747, 2575, 1908, 6840, 2986, 6862, 6018, 4745, 7213,
+ 2987, 2988, 8693, 4746, 4747, 3484, 3485, 8693, 7190, 7192,
+ 8693, 7191, 4718, 4718, 4718, 4718, 4718, 4718, 6405, 4718,
+ 4719, 4720, 4718, 4718, 4718, 6800, 4718, 4718, 4718, 4718,
+ 4718, 7190, 7193, 7192, 7191, 4264, 8693, 4264, 4277, 3451,
+ 4265, 3851, 4265, 3851, 8693, 4764, 4765, 4277, 3451, 3450,
+ 3451, 2966, 2967, 4718, 3882, 7193, 7225, 7226, 8693, 3883,
+ 2988, 8693, 7200, 4287, 7194, 8693, 7203, 8693, 4288, 4289,
+ 7195, 7198, 7202, 8693, 4287, 7199, 4718, 5335, 5336, 4288,
+
+ 4289, 7222, 7223, 5337, 5338, 7200, 5339, 7194, 7207, 5339,
+ 7203, 4798, 4799, 7195, 7198, 7202, 7204, 8693, 7199, 5340,
+ 3882, 4305, 3485, 7205, 7209, 3883, 2988, 2986, 6455, 2583,
+ 5341, 7207, 2987, 2988, 2584, 2585, 4798, 4799, 8693, 7204,
+ 8693, 4305, 3485, 5340, 7206, 8693, 7205, 7208, 7209, 7211,
+ 3484, 3485, 6849, 5341, 7186, 6427, 7225, 7238, 3007, 3008,
+ 6428, 5338, 7210, 7187, 8693, 7212, 7187, 8693, 7206, 3007,
+ 3008, 7208, 7211, 7214, 6467, 8693, 7188, 4313, 6884, 6893,
+ 2606, 1923, 4314, 4315, 7215, 7210, 4313, 7189, 7212, 3908,
+ 8693, 4314, 4315, 3908, 3909, 3027, 7214, 8693, 3909, 3027,
+
+ 7188, 6017, 6018, 8693, 5419, 5420, 7217, 8693, 7215, 8693,
+ 7189, 6856, 3025, 7218, 7227, 3025, 8693, 3026, 3027, 7216,
+ 3026, 3027, 6017, 6018, 6475, 2612, 8693, 7219, 8693, 7217,
+ 2613, 2614, 7229, 5419, 5420, 7220, 8693, 7218, 7227, 4832,
+ 3919, 6870, 7216, 4832, 3919, 8693, 6871, 6872, 7228, 8693,
+ 7219, 7254, 6507, 7254, 6507, 7229, 7234, 7230, 7231, 7220,
+ 6874, 7235, 7236, 5433, 5434, 6875, 7237, 8693, 7240, 5435,
+ 5436, 7228, 7232, 7241, 7236, 6041, 6042, 7242, 6493, 8693,
+ 7230, 5434, 7231, 6494, 5436, 5437, 5435, 5436, 5434, 8693,
+ 5452, 4343, 8693, 5435, 5436, 7232, 5438, 4837, 8693, 7243,
+
+ 4837, 7258, 4838, 4839, 8693, 4838, 4839, 4336, 8693, 5437,
+ 7244, 8693, 4337, 3916, 7245, 6506, 6507, 7246, 7259, 5438,
+ 4336, 7247, 8693, 7243, 7258, 4337, 3916, 6506, 6507, 6041,
+ 6042, 5452, 4343, 7244, 7248, 8693, 7249, 7245, 7255, 7256,
+ 7246, 7259, 7257, 6898, 8693, 7247, 7262, 8693, 6899, 6058,
+ 8693, 7263, 7264, 7250, 8693, 7260, 8693, 7248, 8693, 7249,
+ 8693, 7255, 6898, 7256, 7254, 6507, 7257, 6899, 6058, 7266,
+ 7292, 7293, 6928, 6104, 7267, 7268, 7250, 6056, 7260, 6056,
+ 8693, 5457, 6057, 6058, 6057, 6058, 5458, 5459, 5457, 5469,
+ 5470, 4858, 8693, 5458, 5459, 7269, 4859, 4340, 4858, 4865,
+
+ 3934, 3933, 3934, 4859, 4340, 8693, 5469, 5470, 4865, 3934,
+ 7270, 8693, 7275, 8693, 7271, 7273, 8693, 7272, 7276, 7269,
+ 7281, 7277, 3933, 3934, 7279, 7278, 3517, 3518, 3517, 3518,
+ 7295, 7296, 7274, 7270, 8693, 7275, 8693, 7271, 8693, 7273,
+ 7272, 7280, 7276, 6914, 8693, 7277, 8693, 7279, 7278, 3047,
+ 2260, 7282, 3047, 2260, 4873, 7274, 4873, 4891, 3961, 4874,
+ 4875, 4874, 4875, 8693, 4363, 7280, 8693, 7283, 8693, 4364,
+ 3534, 4363, 7284, 8693, 7282, 3532, 4364, 3534, 7288, 3532,
+ 3533, 3534, 6922, 3052, 3533, 3534, 7302, 7285, 3053, 3054,
+ 8693, 7283, 8693, 3052, 5501, 5502, 7284, 7286, 3053, 3054,
+
+ 7287, 6547, 2636, 7289, 6103, 6104, 8693, 2637, 2257, 7302,
+ 7285, 5501, 5502, 7290, 6103, 6104, 8693, 7297, 7292, 7293,
+ 7286, 8693, 7299, 7287, 4891, 3961, 7289, 6936, 7295, 7308,
+ 6982, 6983, 6937, 6938, 8693, 7300, 8693, 7290, 3558, 3559,
+ 7298, 7297, 7304, 7301, 8693, 7299, 6940, 7305, 7306, 5515,
+ 5516, 6941, 7307, 8693, 7310, 5517, 5518, 8693, 7300, 7311,
+ 7306, 7326, 8693, 7298, 7346, 7347, 8693, 7301, 7312, 6564,
+ 7325, 5519, 8693, 5516, 6565, 5518, 3558, 3559, 5517, 5518,
+ 5516, 8693, 5520, 4896, 7326, 5517, 5518, 4896, 4897, 4898,
+ 7313, 4383, 4897, 4898, 4383, 5519, 4384, 3958, 8693, 4384,
+
+ 3958, 7314, 4908, 4909, 8693, 5520, 7315, 7317, 8693, 7316,
+ 4908, 4909, 4390, 3559, 7313, 7321, 6955, 4390, 3559, 6580,
+ 7319, 7318, 3071, 3072, 7314, 2650, 1945, 7320, 8693, 7315,
+ 8693, 7317, 7316, 3071, 3072, 8693, 7322, 6985, 7348, 7321,
+ 7323, 7324, 8693, 7319, 7318, 8693, 4398, 8693, 7327, 4398,
+ 7320, 4399, 4400, 8693, 4399, 4400, 3981, 7350, 7347, 7322,
+ 3981, 3982, 3088, 7323, 7324, 3982, 3088, 6962, 3086, 8693,
+ 3086, 8693, 7327, 3087, 3088, 3087, 3088, 8693, 7329, 7328,
+ 7330, 6588, 2655, 4939, 4940, 4939, 4940, 2656, 2657, 8693,
+ 7332, 4416, 3588, 7337, 7331, 8693, 7333, 4416, 3588, 3587,
+
+ 3588, 7329, 7328, 6971, 7330, 3587, 3588, 3106, 3107, 3106,
+ 3107, 7334, 6982, 6983, 7332, 6985, 7348, 7331, 6599, 7335,
+ 7333, 7336, 7339, 8693, 2674, 1958, 4424, 8693, 7338, 8693,
+ 4006, 4425, 4426, 4424, 7334, 4007, 3123, 8693, 4425, 4426,
+ 6182, 6183, 7335, 4006, 7336, 8693, 7339, 3121, 4007, 3123,
+ 5590, 7338, 3122, 3123, 7342, 5591, 5592, 6978, 3121, 7340,
+ 7364, 7365, 7341, 3122, 3123, 6607, 2679, 7344, 6613, 8693,
+ 6988, 2680, 2681, 7352, 5592, 6989, 6990, 7343, 7342, 7000,
+ 6201, 7354, 7340, 5609, 8693, 7341, 7355, 7356, 5610, 5611,
+ 6992, 7344, 7359, 7367, 7368, 6993, 7357, 7360, 7356, 6620,
+
+ 7343, 6188, 8693, 7002, 7362, 5611, 6189, 6190, 7003, 7004,
+ 7364, 7365, 7370, 5649, 5650, 7367, 7374, 7371, 7372, 5651,
+ 5652, 7006, 5649, 7376, 8693, 5649, 7007, 7373, 7377, 7372,
+ 7378, 6645, 7010, 7013, 7382, 6653, 6646, 5652, 7018, 7378,
+ 7382, 6653, 7378, 7019, 6225, 7384, 8693, 7018, 7382, 6653,
+ 7385, 7386, 7019, 6225, 7388, 7392, 7393, 7023, 6247, 7389,
+ 7390, 7395, 7396, 7025, 7392, 7393, 7398, 8693, 7026, 7027,
+ 7029, 7399, 7400, 5701, 5702, 7030, 7401, 7395, 7402, 5703,
+ 5704, 7404, 5701, 7406, 6672, 5701, 7405, 7400, 8693, 6673,
+ 5704, 8693, 7406, 7033, 7034, 7406, 7408, 7409, 5732, 5733,
+
+ 7036, 7410, 7412, 7409, 6678, 5733, 7039, 7033, 7034, 7414,
+ 8693, 7040, 7041, 5744, 7415, 7416, 7043, 8693, 5745, 5746,
+ 7419, 7044, 7417, 7036, 7410, 7420, 7416, 6684, 7422, 7423,
+ 7049, 6272, 6685, 5746, 7425, 7426, 7051, 7422, 7423, 7428,
+ 8693, 7052, 7053, 5764, 7429, 7430, 7055, 8693, 5765, 5766,
+ 7434, 7056, 7431, 7425, 7432, 7435, 7430, 6695, 7059, 7060,
+ 7059, 7060, 6696, 5766, 7436, 8693, 7064, 7063, 7438, 8693,
+ 6698, 6699, 6287, 5156, 7063, 7060, 7437, 8693, 7065, 6286,
+ 7064, 6286, 6286, 6286, 8693, 6286, 6287, 5156, 6286, 6286,
+ 6286, 6286, 7065, 6286, 6286, 6286, 6286, 6287, 5156, 7067,
+
+ 7068, 7442, 7443, 7440, 5794, 7070, 7083, 7445, 7443, 8693,
+ 5795, 5796, 8693, 5797, 5795, 5796, 5797, 8693, 7446, 6286,
+ 5795, 5796, 5174, 5175, 6707, 5796, 5798, 7447, 5174, 5175,
+ 7447, 4629, 3778, 8693, 4629, 3778, 8693, 5799, 7451, 7079,
+ 7448, 7452, 6286, 8693, 7080, 7081, 7442, 7443, 7450, 8693,
+ 5798, 7449, 8693, 7079, 8693, 7454, 8693, 7453, 7080, 7081,
+ 5799, 7451, 7455, 7085, 7448, 7452, 7445, 7461, 7086, 7460,
+ 7085, 7450, 7472, 7473, 7449, 7086, 7081, 8693, 7454, 8693,
+ 7453, 8693, 7446, 7100, 6322, 7455, 7456, 6715, 6707, 5796,
+ 8693, 7447, 6716, 6717, 7447, 7457, 8693, 6307, 7457, 8693,
+
+ 7462, 6307, 6308, 5194, 7448, 6307, 6308, 5194, 7458, 8693,
+ 6308, 5194, 5192, 7475, 7476, 7449, 8693, 5193, 5194, 7459,
+ 6307, 8693, 7089, 8693, 5192, 6308, 5194, 8693, 7448, 5193,
+ 5194, 8693, 7458, 7090, 8693, 4635, 7465, 8693, 7449, 7463,
+ 4636, 4637, 7459, 7087, 6307, 8693, 7089, 7472, 7473, 6308,
+ 5194, 8693, 7088, 8693, 7464, 7088, 7090, 8693, 7466, 8693,
+ 7465, 4635, 7463, 4182, 7467, 7089, 4636, 4637, 4183, 3775,
+ 6321, 6322, 8693, 4182, 6321, 6322, 7090, 7464, 4183, 3775,
+ 8693, 7466, 8693, 7477, 5821, 5822, 8693, 7467, 8693, 7089,
+ 8693, 7469, 5821, 5822, 7468, 5211, 4190, 7470, 7108, 7090,
+
+ 7478, 5211, 4190, 7109, 7110, 7484, 8693, 7477, 7475, 7488,
+ 7485, 7486, 7479, 7112, 7469, 8693, 7480, 7468, 7113, 7487,
+ 7481, 7470, 7490, 7478, 7482, 8693, 5839, 7491, 7486, 7138,
+ 7139, 5840, 5841, 7515, 7516, 7479, 5839, 7141, 7148, 7480,
+ 8693, 5840, 5841, 8693, 7481, 5217, 8693, 7482, 5838, 5839,
+ 5218, 5219, 4666, 3794, 5840, 5841, 5217, 5842, 4658, 7496,
+ 5842, 5218, 5219, 4659, 4187, 7497, 4658, 7518, 7516, 7498,
+ 5843, 4659, 4187, 8693, 5231, 5232, 7515, 7516, 5231, 5232,
+ 7504, 5844, 7496, 4666, 3794, 3793, 3794, 7500, 7497, 7506,
+ 7499, 7502, 4674, 7498, 5843, 3793, 3794, 4675, 4676, 7501,
+
+ 7503, 3366, 3367, 7504, 5844, 7492, 6744, 7505, 7507, 8693,
+ 7500, 6745, 5841, 7499, 7493, 7502, 7508, 7493, 7127, 7518,
+ 7524, 7510, 7501, 7503, 3366, 3367, 6761, 7494, 8693, 4674,
+ 7505, 7507, 2898, 2176, 4675, 4676, 4211, 8693, 7495, 8693,
+ 7508, 4212, 3386, 4211, 7510, 8693, 7134, 3384, 4212, 3386,
+ 3384, 7494, 3385, 3386, 8693, 3385, 3386, 6769, 2904, 5889,
+ 7511, 7495, 7509, 2905, 2906, 5890, 5891, 7519, 7155, 7158,
+ 7513, 5892, 8693, 6777, 5891, 7144, 8693, 7512, 8693, 7520,
+ 7145, 7146, 7144, 8693, 7511, 7509, 8693, 7145, 7146, 7521,
+ 6779, 7152, 6384, 8693, 7513, 6780, 6781, 6385, 5280, 7519,
+
+ 7512, 7522, 7150, 7153, 7150, 6777, 5891, 7151, 7523, 7151,
+ 7146, 7520, 6383, 7152, 6384, 6383, 6383, 8693, 6383, 6385,
+ 5280, 6383, 6383, 6383, 6383, 7153, 6383, 6383, 6383, 6383,
+ 6384, 7530, 6791, 7163, 8693, 6385, 5280, 8693, 7164, 6399,
+ 7532, 7526, 7530, 6791, 7163, 7533, 7534, 7530, 6791, 7164,
+ 6399, 7536, 6383, 7166, 7167, 5934, 7537, 7538, 7540, 7541,
+ 8693, 5935, 5936, 8693, 5937, 7169, 7182, 5937, 7543, 7541,
+ 5935, 5936, 7544, 5935, 5936, 6383, 8693, 5938, 6805, 5936,
+ 8693, 7545, 4739, 3854, 7545, 5318, 5319, 8693, 5939, 5318,
+ 5319, 4739, 3854, 8693, 7546, 7540, 7541, 7549, 7548, 7543,
+
+ 7559, 5938, 5353, 369, 7178, 7547, 7552, 7178, 7550, 7179,
+ 7180, 5939, 7179, 7180, 7551, 7222, 7223, 7184, 7546, 7553,
+ 7549, 7548, 7185, 7558, 7544, 7588, 7589, 8693, 7547, 7552,
+ 6805, 5936, 7550, 7545, 7184, 8693, 7545, 7551, 8693, 7185,
+ 7180, 8693, 7553, 7554, 6813, 8693, 7546, 8693, 6427, 6814,
+ 6815, 8693, 7555, 6428, 5338, 7555, 8693, 7547, 8693, 4277,
+ 3451, 8693, 7560, 6427, 8693, 7556, 5336, 7201, 6428, 5338,
+ 7546, 5337, 5338, 3450, 3451, 8693, 7557, 6427, 7571, 8693,
+ 7547, 6427, 6428, 5338, 7188, 8693, 6428, 5338, 4745, 7556,
+ 7563, 5336, 8693, 4746, 4747, 7189, 5337, 5338, 4745, 7557,
+
+ 7186, 6427, 7571, 4746, 4747, 8693, 6428, 5338, 7188, 7187,
+ 8693, 7561, 7187, 8693, 7563, 7562, 8693, 7565, 7189, 4764,
+ 4765, 4264, 7188, 4264, 8693, 7564, 4265, 3851, 4265, 3851,
+ 8693, 7566, 8693, 7189, 7561, 4764, 4765, 8693, 7562, 8693,
+ 7565, 4277, 3451, 7570, 3450, 3451, 7188, 7568, 7564, 7567,
+ 8693, 6833, 7225, 7238, 7566, 4287, 7189, 2966, 2967, 7573,
+ 4288, 4289, 4287, 7569, 4798, 4799, 7570, 4288, 4289, 3882,
+ 7572, 7568, 7567, 8693, 3883, 2988, 3882, 4798, 4799, 7574,
+ 8693, 3883, 2988, 7573, 6840, 2986, 7569, 4305, 3485, 8693,
+ 2987, 2988, 7578, 7572, 4305, 3485, 7575, 8693, 7576, 3484,
+
+ 3485, 7579, 8693, 7574, 7213, 8693, 7580, 4313, 8693, 7577,
+ 3484, 3485, 4314, 4315, 7582, 7578, 7591, 7589, 8693, 7575,
+ 6849, 7576, 8693, 7581, 7579, 8693, 3007, 3008, 4313, 8693,
+ 7580, 7583, 7577, 4314, 4315, 3908, 8693, 3908, 7582, 8693,
+ 3909, 3027, 3909, 3027, 6856, 3025, 7581, 5419, 5420, 8693,
+ 3026, 3027, 8693, 6016, 8693, 7583, 6017, 6018, 8693, 6017,
+ 6018, 7592, 7584, 8693, 7585, 8693, 7597, 6862, 6018, 8693,
+ 7586, 8693, 6017, 6018, 8693, 6019, 5419, 5420, 4832, 3919,
+ 7596, 7588, 7589, 7593, 8693, 7584, 6020, 7585, 4832, 3919,
+ 7597, 7234, 8693, 7586, 7594, 8693, 7235, 7236, 8693, 6019,
+
+ 7595, 8693, 7599, 7596, 8693, 7598, 7234, 7593, 8693, 6020,
+ 8693, 7235, 7236, 7601, 6870, 8693, 7600, 7594, 8693, 6871,
+ 6872, 7591, 7605, 7595, 8693, 7599, 8693, 7592, 7598, 8693,
+ 7242, 6493, 8693, 6862, 6018, 7602, 6494, 5436, 7240, 7600,
+ 7615, 7616, 7240, 7241, 7604, 6493, 7603, 7241, 7236, 7593,
+ 6494, 5436, 7243, 7254, 6507, 7242, 6493, 7618, 7619, 7602,
+ 7594, 6494, 5436, 7244, 8693, 6493, 7615, 7616, 8693, 7603,
+ 6494, 5436, 8693, 7593, 8693, 4837, 7243, 7243, 8693, 7606,
+ 4838, 4839, 8693, 7594, 5434, 8693, 7244, 5434, 7244, 5435,
+ 5436, 4837, 5435, 5436, 6506, 6507, 4838, 4839, 8693, 7607,
+
+ 4336, 7243, 7606, 8693, 7610, 4337, 3916, 4336, 7608, 6041,
+ 6042, 7244, 4337, 3916, 6041, 6042, 6506, 6507, 7618, 7631,
+ 7621, 7609, 7607, 8693, 7611, 5452, 4343, 7610, 7612, 7620,
+ 7262, 7613, 7608, 5452, 4343, 7263, 7264, 7622, 7623, 8693,
+ 7627, 8693, 7648, 7621, 7609, 7628, 7629, 7611, 3933, 3934,
+ 8693, 7612, 7624, 7620, 7625, 7613, 6055, 6056, 8693, 7266,
+ 7622, 7623, 6057, 6058, 7267, 7630, 7633, 8693, 7635, 6898,
+ 8693, 7634, 7629, 8693, 6899, 6058, 7624, 7625, 6059, 8693,
+ 6056, 8693, 6056, 7292, 7293, 6057, 6058, 6057, 6058, 6060,
+ 7636, 5457, 8693, 5457, 5469, 5470, 5458, 5459, 5458, 5459,
+
+ 4858, 7637, 6059, 8693, 4858, 4859, 4340, 7644, 8693, 4859,
+ 4340, 7639, 6060, 7638, 7636, 7640, 5469, 5470, 4865, 3934,
+ 4865, 3934, 3933, 3934, 7637, 8693, 7281, 7641, 8693, 7642,
+ 8693, 7644, 3517, 3518, 7639, 8693, 7638, 7643, 8693, 7640,
+ 3517, 3518, 7645, 4873, 7647, 7649, 7646, 6914, 4874, 4875,
+ 7641, 4873, 7642, 3047, 2260, 7650, 4874, 4875, 4363, 8693,
+ 7643, 7657, 7658, 4364, 3534, 7645, 4363, 7647, 7649, 7646,
+ 8693, 4364, 3534, 7295, 7308, 8693, 7651, 7288, 3532, 7650,
+ 7652, 3532, 7653, 3533, 3534, 6102, 3533, 3534, 6922, 3052,
+ 8693, 6103, 6104, 8693, 3053, 3054, 7660, 7658, 8693, 7651,
+
+ 7654, 7655, 7661, 7652, 6103, 6104, 7653, 6105, 6928, 6104,
+ 6103, 6104, 8693, 5501, 5502, 8693, 4891, 3961, 6106, 5501,
+ 5502, 4891, 3961, 7654, 7662, 7655, 7657, 7658, 7660, 7674,
+ 7325, 6105, 7664, 8693, 7665, 7663, 3558, 3559, 7666, 7304,
+ 7668, 6106, 7667, 8693, 7305, 7306, 7304, 8693, 7662, 7669,
+ 8693, 7305, 7306, 7670, 6936, 7664, 8693, 7665, 7663, 6937,
+ 6938, 8693, 7666, 7668, 8693, 7667, 8693, 7312, 6564, 8693,
+ 7661, 8693, 7669, 6565, 5518, 7671, 6928, 6104, 7310, 4390,
+ 3559, 8693, 7310, 7311, 7673, 6564, 7672, 7311, 7306, 7313,
+ 6565, 5518, 7662, 7346, 7347, 7312, 6564, 8693, 7685, 7671,
+
+ 7314, 6565, 5518, 7663, 8693, 6564, 4908, 4909, 8693, 7672,
+ 6565, 5518, 8693, 7313, 8693, 4896, 7662, 7313, 8693, 7675,
+ 4897, 4898, 7685, 7314, 5516, 8693, 7663, 5516, 7314, 5517,
+ 5518, 4896, 5517, 5518, 7683, 8693, 4897, 4898, 8693, 7676,
+ 4383, 7313, 7675, 8693, 7679, 4384, 3958, 4383, 7677, 4908,
+ 4909, 7314, 4384, 3958, 4390, 3559, 8693, 7683, 8693, 3558,
+ 3559, 7678, 7676, 6955, 7680, 4939, 4940, 7679, 7681, 3071,
+ 3072, 7682, 7677, 7684, 7687, 4398, 8693, 4939, 4940, 7337,
+ 4399, 4400, 8693, 7686, 7678, 3587, 3588, 7680, 4398, 7693,
+ 8693, 7681, 8693, 4399, 4400, 7682, 7684, 3981, 7687, 7688,
+
+ 4416, 3588, 3982, 3088, 3981, 7692, 7686, 6962, 3086, 3982,
+ 3088, 8693, 7693, 3087, 3088, 4416, 3588, 3587, 3588, 7694,
+ 7346, 7347, 7689, 7688, 6971, 8693, 7690, 8693, 7692, 4424,
+ 3106, 3107, 7696, 4006, 4425, 4426, 4424, 7691, 4007, 3123,
+ 8693, 4425, 4426, 7694, 7695, 7689, 4006, 7350, 7704, 7690,
+ 8693, 4007, 3123, 7697, 7350, 7347, 7696, 6978, 3121, 8693,
+ 7691, 8693, 7699, 3122, 3123, 8693, 6981, 7695, 6613, 8693,
+ 7698, 7702, 7703, 7352, 5592, 6614, 6168, 7697, 7354, 7700,
+ 6985, 6986, 8693, 7355, 7356, 7699, 7346, 7347, 8693, 7354,
+ 8693, 6988, 8693, 7698, 7355, 7356, 7706, 7707, 6620, 8693,
+
+ 7359, 8693, 7700, 7362, 5611, 7360, 7708, 7350, 7704, 7359,
+ 8693, 6620, 8693, 6992, 7360, 7356, 6621, 6175, 6993, 6994,
+ 7364, 7365, 7710, 7711, 6199, 7367, 7374, 7713, 7711, 7370,
+ 6200, 6201, 7714, 6199, 7371, 7372, 6199, 8693, 7000, 6201,
+ 7370, 7714, 7710, 7711, 7714, 7371, 7372, 7715, 7002, 7713,
+ 7717, 7378, 6645, 7003, 7004, 7714, 7715, 6646, 5652, 7715,
+ 7378, 7000, 6201, 7378, 7714, 7376, 8693, 7714, 7376, 8693,
+ 7377, 7716, 6645, 7377, 7372, 7719, 7720, 6646, 5652, 7382,
+ 6653, 7722, 7723, 7384, 7719, 7720, 7725, 8693, 7385, 7386,
+ 7388, 7726, 7727, 6222, 6223, 7389, 7728, 7722, 7729, 6224,
+
+ 6225, 7731, 6222, 7733, 7018, 6222, 7732, 7727, 8693, 7019,
+ 6225, 8693, 7733, 7392, 7393, 7733, 7735, 7736, 6245, 7395,
+ 7402, 7738, 7736, 7398, 6246, 6247, 7739, 6245, 7399, 7400,
+ 6245, 8693, 7023, 6247, 7398, 7739, 7735, 7736, 7739, 7399,
+ 7400, 7740, 7025, 7738, 7742, 7406, 6672, 7026, 7027, 7739,
+ 7740, 6673, 5704, 7740, 7406, 7023, 6247, 7406, 7739, 7404,
+ 8693, 7739, 7404, 8693, 7405, 7741, 6672, 7405, 7400, 7408,
+ 7409, 6673, 5704, 7408, 7409, 7033, 7034, 6678, 5733, 7412,
+ 7743, 7412, 7409, 7414, 7408, 7409, 7414, 8693, 7415, 7416,
+ 7039, 7415, 7416, 6684, 8693, 7040, 7041, 7419, 6685, 5746,
+
+ 7412, 7743, 7420, 7744, 7419, 7422, 7423, 7746, 7747, 7420,
+ 7416, 6271, 6272, 7425, 7432, 7749, 7747, 7049, 6272, 7428,
+ 7746, 7747, 7428, 8693, 7429, 7430, 7051, 7429, 7430, 6695,
+ 8693, 7052, 7053, 7434, 6696, 5766, 7049, 6272, 7435, 7750,
+ 7749, 7751, 7434, 6287, 5156, 7442, 7443, 7435, 7430, 6697,
+ 7436, 6697, 6697, 6697, 8693, 6697, 6698, 6699, 6697, 6697,
+ 6697, 6697, 7437, 6697, 6697, 6697, 6697, 6698, 6699, 7436,
+ 7442, 7443, 8693, 7753, 8693, 6698, 6699, 7445, 7461, 7445,
+ 7443, 7437, 6707, 5796, 7472, 7473, 7781, 7782, 6715, 6697,
+ 6307, 5795, 5796, 6716, 6717, 6308, 5194, 7475, 7488, 7784,
+
+ 7782, 7781, 7782, 8693, 6707, 5796, 8693, 7773, 6707, 5796,
+ 7763, 8693, 6697, 6286, 6286, 6286, 6286, 6286, 7439, 6286,
+ 6287, 5156, 6286, 6286, 6286, 7754, 6286, 6286, 6286, 6286,
+ 6286, 7773, 7756, 7761, 7763, 8693, 7760, 7762, 7067, 7068,
+ 8693, 7757, 6707, 5796, 7757, 5795, 5796, 5174, 5175, 5174,
+ 5175, 7784, 7800, 6286, 7758, 8693, 7761, 7506, 7448, 8693,
+ 7762, 4629, 3778, 3793, 3794, 7759, 4629, 3778, 8693, 7449,
+ 8693, 7765, 7515, 7516, 7764, 8693, 6286, 7766, 7758, 8693,
+ 7769, 6715, 7448, 8693, 7767, 7768, 6716, 6717, 7759, 8693,
+ 6715, 8693, 7449, 6715, 7765, 6716, 6717, 7764, 6716, 6717,
+
+ 7766, 8693, 7458, 7515, 7516, 6307, 8693, 7767, 7756, 7768,
+ 6308, 5194, 8693, 7459, 7067, 7068, 8693, 7757, 6321, 6322,
+ 7757, 8693, 7462, 6307, 7770, 7127, 7458, 7771, 6308, 5194,
+ 7758, 3366, 3367, 7772, 5192, 8693, 7459, 5192, 8693, 5193,
+ 5194, 7759, 5193, 5194, 7089, 8693, 7789, 7770, 6321, 6322,
+ 7771, 7456, 6715, 8693, 7758, 7090, 7772, 6716, 6717, 8693,
+ 7457, 7518, 7524, 7457, 7759, 4635, 7774, 7775, 7089, 7789,
+ 4636, 4637, 7790, 7458, 4635, 7778, 4182, 8693, 7090, 4636,
+ 4637, 4183, 3775, 8693, 7459, 8693, 4182, 5211, 4190, 7774,
+ 7775, 4183, 3775, 7776, 7484, 7790, 6320, 7458, 7777, 7485,
+
+ 7486, 8693, 6321, 6322, 8693, 6323, 8693, 7459, 6323, 5821,
+ 5822, 7793, 5821, 5822, 7779, 8693, 7776, 8693, 6324, 5211,
+ 4190, 7785, 7777, 8693, 5231, 5232, 8693, 7100, 6322, 6325,
+ 7786, 7791, 8693, 7786, 7793, 7484, 8693, 7779, 7792, 7490,
+ 7485, 7486, 6324, 7787, 7491, 7799, 8693, 7794, 7811, 8693,
+ 7785, 8693, 6325, 8693, 7788, 7791, 7100, 6322, 7490, 7786,
+ 6744, 7792, 7786, 7491, 7486, 6745, 5841, 7787, 6744, 8693,
+ 7794, 7811, 7787, 6745, 5841, 7801, 6744, 7788, 7795, 7108,
+ 8693, 6745, 5841, 7788, 7109, 7110, 6744, 7796, 8693, 5839,
+ 7796, 6745, 5841, 5839, 5840, 5841, 7787, 7494, 5840, 5841,
+
+ 7797, 8693, 7802, 8693, 5217, 8693, 7788, 8693, 7495, 5218,
+ 5219, 7798, 8693, 7804, 7518, 7516, 6777, 5891, 7828, 7829,
+ 7803, 7494, 7822, 4658, 7797, 7802, 8693, 7805, 4659, 4187,
+ 8693, 7495, 8693, 7806, 7798, 7492, 6744, 7804, 5231, 5232,
+ 5217, 6745, 5841, 7803, 7493, 5218, 5219, 7493, 3793, 3794,
+ 7805, 7808, 8693, 4658, 4666, 3794, 7806, 7494, 4659, 4187,
+ 4666, 3794, 8693, 7814, 4674, 8693, 7810, 8693, 7495, 4675,
+ 4676, 7530, 6791, 7807, 7808, 7831, 7832, 7809, 8693, 7812,
+ 4674, 7494, 8693, 7813, 8693, 4675, 4676, 7814, 7815, 7810,
+ 8693, 7495, 4211, 8693, 4211, 8693, 7807, 4212, 3386, 4212,
+
+ 3386, 7809, 6384, 7812, 7134, 3384, 7813, 6385, 5280, 8693,
+ 3385, 3386, 7815, 7819, 7816, 7828, 7829, 6779, 8693, 7138,
+ 7139, 7817, 6780, 6781, 8693, 7820, 7819, 7818, 7824, 7521,
+ 6779, 8693, 7138, 7139, 7532, 6780, 6781, 7816, 7820, 7533,
+ 7534, 7522, 7834, 8693, 7817, 7831, 7838, 7835, 7836, 8693,
+ 7818, 6776, 7519, 6776, 6776, 6776, 8693, 6776, 6777, 5891,
+ 6776, 6776, 6776, 6776, 7520, 6776, 6776, 6776, 6776, 6397,
+ 8693, 7536, 8693, 7840, 6398, 6399, 7537, 7837, 7841, 7836,
+ 7163, 7540, 7541, 7540, 7541, 7164, 6399, 7842, 7543, 7559,
+ 8693, 6776, 8693, 7166, 7167, 8693, 7843, 7543, 7541, 7843,
+
+ 6805, 5936, 7588, 7589, 8693, 6805, 5936, 6805, 5936, 7844,
+ 5935, 5936, 5318, 5319, 6776, 6778, 7521, 6779, 6778, 6778,
+ 7845, 6778, 6780, 6781, 6778, 6778, 6778, 6778, 7522, 6778,
+ 6778, 6778, 6778, 7844, 7847, 8693, 7848, 8693, 7201, 7850,
+ 7852, 6813, 7213, 7845, 3450, 3451, 6814, 6815, 3484, 3485,
+ 5318, 5319, 8693, 4739, 3854, 6778, 8693, 7847, 8693, 7848,
+ 7588, 7589, 7850, 7852, 7591, 7605, 6813, 7591, 7589, 7615,
+ 7616, 6814, 6815, 8693, 7851, 8693, 7853, 8693, 6778, 6383,
+ 6383, 6384, 6383, 6383, 7525, 6383, 6385, 5280, 6383, 6383,
+ 6383, 7825, 6383, 6383, 6383, 6383, 6383, 7851, 7846, 7853,
+
+ 7856, 8693, 5935, 5936, 6805, 5936, 4739, 3854, 6427, 8693,
+ 7855, 6813, 8693, 6428, 5338, 8693, 6814, 6815, 8693, 6383,
+ 7546, 7849, 8693, 7856, 6813, 7854, 4764, 4765, 7842, 6814,
+ 6815, 7547, 7556, 5336, 7166, 7167, 7858, 7843, 5337, 5338,
+ 7843, 8693, 6383, 7557, 7546, 7849, 7560, 6427, 8693, 7854,
+ 7844, 8693, 6428, 5338, 7547, 7867, 7556, 8693, 7857, 7858,
+ 8693, 7845, 7860, 7904, 7905, 8693, 7557, 5336, 7188, 8693,
+ 6427, 8693, 5337, 5338, 7844, 6428, 5338, 8693, 7867, 7189,
+ 8693, 7857, 7554, 6813, 7845, 7860, 8693, 7859, 6814, 6815,
+ 4745, 7555, 7188, 4264, 7555, 4746, 4747, 8693, 4265, 3851,
+
+ 7861, 4745, 7189, 8693, 7556, 8693, 4746, 4747, 4764, 4765,
+ 8693, 7859, 8693, 7864, 4264, 7557, 4277, 3451, 7862, 4265,
+ 3851, 7865, 8693, 7861, 8693, 7863, 4287, 7866, 7556, 4277,
+ 3451, 4288, 4289, 4798, 4799, 7618, 7631, 4287, 7557, 8693,
+ 7868, 7862, 4288, 4289, 7865, 4305, 3485, 3882, 8693, 7863,
+ 8693, 7866, 3883, 2988, 8693, 7870, 8693, 7869, 8693, 3882,
+ 4798, 4799, 7875, 7868, 3883, 2988, 4305, 3485, 4313, 7876,
+ 7871, 4313, 8693, 4314, 4315, 7872, 4314, 4315, 7870, 7874,
+ 7869, 3908, 8693, 7873, 8693, 7875, 3909, 3027, 7907, 7905,
+ 3908, 8693, 7876, 7871, 7877, 3909, 3027, 7878, 7872, 7904,
+
+ 7905, 6862, 6018, 7874, 7879, 8693, 7882, 7873, 8693, 7880,
+ 5419, 5420, 7222, 7223, 7881, 7592, 8693, 7877, 6862, 6018,
+ 7878, 6862, 6018, 6017, 6018, 6017, 6018, 7879, 7883, 8693,
+ 7885, 8693, 7880, 8693, 7889, 5419, 5420, 7593, 7881, 7884,
+ 4832, 3919, 7887, 8693, 4832, 3919, 8693, 7886, 7594, 8693,
+ 6870, 8693, 7883, 7885, 7888, 6871, 6872, 7889, 8693, 7892,
+ 8693, 7593, 7884, 7890, 7907, 7921, 7887, 7891, 8693, 6870,
+ 7886, 7594, 7601, 6870, 6871, 6872, 6493, 7888, 6871, 6872,
+ 8693, 6494, 5436, 7892, 7893, 8693, 7890, 6041, 6042, 7882,
+ 7891, 7601, 6870, 7648, 7602, 7222, 7223, 6871, 6872, 3933,
+
+ 3934, 6506, 6507, 7894, 7895, 7603, 7913, 7893, 7657, 7658,
+ 5434, 7883, 8693, 7602, 6493, 5435, 5436, 8693, 7602, 6494,
+ 5436, 8693, 7884, 8693, 7603, 7912, 7894, 7895, 7603, 8693,
+ 7913, 7896, 8693, 6506, 6507, 7883, 5434, 7602, 4837, 7897,
+ 8693, 5435, 5436, 4838, 4839, 7884, 4837, 7603, 7912, 8693,
+ 6505, 4838, 4839, 7901, 4336, 7896, 6506, 6507, 4336, 4337,
+ 3916, 7911, 7897, 4337, 3916, 8693, 7899, 8693, 7908, 7898,
+ 7900, 8693, 6508, 8693, 7254, 6507, 6041, 6042, 5452, 4343,
+ 5452, 4343, 7627, 6509, 7911, 8693, 7902, 7628, 7629, 7899,
+ 7909, 8693, 7898, 7627, 7900, 8693, 6508, 7281, 7628, 7629,
+
+ 8693, 7910, 7915, 3517, 3518, 7914, 6509, 8693, 7916, 7902,
+ 7917, 7262, 7635, 6898, 7909, 7908, 7263, 7264, 6899, 6058,
+ 8693, 7254, 6507, 8693, 7910, 7915, 7657, 7658, 7914, 8693,
+ 7633, 7916, 7918, 7633, 7636, 7634, 7920, 7909, 7634, 7629,
+ 7635, 6898, 8693, 7919, 6898, 7637, 6899, 6058, 7910, 6899,
+ 6058, 8693, 5469, 5470, 6898, 8693, 7918, 8693, 7636, 6899,
+ 6058, 7909, 7636, 8693, 4865, 3934, 7919, 8693, 7637, 6056,
+ 8693, 7910, 8693, 7637, 6057, 6058, 6056, 8693, 7922, 5457,
+ 7930, 6057, 6058, 7932, 5458, 5459, 7636, 8693, 7923, 5457,
+ 5469, 5470, 4858, 7924, 5458, 5459, 7637, 4859, 4340, 4858,
+
+ 8693, 7922, 8693, 7930, 4859, 4340, 8693, 7932, 7926, 8693,
+ 7925, 7923, 4865, 3934, 7931, 3933, 3934, 7924, 8693, 4363,
+ 7928, 4873, 7927, 7929, 4364, 3534, 4874, 4875, 8693, 4873,
+ 7934, 7926, 8693, 7925, 4874, 4875, 8693, 7931, 7660, 7674,
+ 8693, 7933, 8693, 7928, 8693, 7927, 4363, 7929, 7937, 7660,
+ 7658, 4364, 3534, 7935, 7934, 7936, 7288, 3532, 8693, 7939,
+ 8693, 7661, 3533, 3534, 7933, 7292, 7293, 6928, 6104, 6928,
+ 6104, 7937, 6928, 6104, 8693, 5501, 5502, 7935, 7936, 7938,
+ 8693, 7940, 8693, 7662, 6103, 6104, 8693, 6103, 6104, 8693,
+ 5501, 5502, 7941, 8693, 7663, 8693, 4891, 3961, 7942, 7946,
+
+ 8693, 7943, 7938, 7944, 8693, 7940, 6936, 7662, 8693, 4891,
+ 3961, 6937, 6938, 6982, 6983, 7941, 7945, 7663, 7947, 7948,
+ 8693, 7942, 7946, 8693, 7943, 7670, 6936, 7944, 7949, 8693,
+ 6936, 6937, 6938, 4390, 3559, 6937, 6938, 7670, 6936, 7945,
+ 7950, 7947, 7948, 6937, 6938, 6564, 8693, 7671, 6564, 8693,
+ 6565, 5518, 7949, 6565, 5518, 7939, 8693, 7962, 7672, 7671,
+ 7325, 7292, 7293, 7950, 7951, 7953, 3558, 3559, 8693, 5516,
+ 7672, 7671, 8693, 7952, 5517, 5518, 8693, 7940, 8693, 5516,
+ 7962, 7672, 8693, 7671, 5517, 5518, 4896, 7951, 7941, 7953,
+ 8693, 4897, 4898, 7672, 4896, 8693, 7952, 8693, 7954, 4897,
+
+ 4898, 7940, 7958, 4383, 4908, 4909, 4390, 3559, 4384, 3958,
+ 4383, 7941, 7955, 8693, 7956, 4384, 3958, 8693, 7957, 4908,
+ 4909, 7954, 4398, 7960, 8693, 4398, 8693, 4399, 4400, 8693,
+ 4399, 4400, 4416, 3588, 7963, 7955, 8693, 7956, 7959, 3981,
+ 4939, 4940, 7957, 8693, 3982, 3088, 8693, 7960, 7961, 3981,
+ 8693, 7964, 4416, 3588, 3982, 3088, 7970, 7963, 7965, 7968,
+ 4424, 7959, 4939, 4940, 8693, 4425, 4426, 7966, 8693, 7337,
+ 8693, 7961, 4424, 7967, 7964, 3587, 3588, 4425, 4426, 7970,
+ 7971, 7965, 4006, 7968, 7346, 7347, 8693, 4007, 3123, 7972,
+ 7966, 7969, 8693, 4006, 8693, 5590, 8693, 7967, 4007, 3123,
+
+ 5591, 5592, 6981, 7971, 8693, 7973, 8693, 7702, 7703, 8693,
+ 7974, 8693, 7972, 6988, 7969, 7354, 8693, 7975, 6989, 6990,
+ 7355, 7356, 7710, 7711, 5609, 8693, 6988, 8693, 7973, 5610,
+ 5611, 7706, 7707, 7974, 7710, 7711, 7976, 7713, 7717, 7713,
+ 7711, 7975, 7364, 7365, 7002, 7976, 7000, 6201, 7976, 7003,
+ 7004, 7715, 7002, 7719, 7720, 7976, 8693, 7003, 7004, 8693,
+ 7715, 7364, 7365, 7715, 7976, 7978, 7979, 7976, 6651, 7722,
+ 7729, 7981, 7979, 7725, 6652, 6653, 7982, 6651, 7726, 7727,
+ 6651, 8693, 7382, 6653, 7725, 7982, 7978, 7979, 7982, 7726,
+ 7727, 7983, 7384, 7981, 7985, 7733, 7018, 7385, 7386, 7982,
+
+ 7983, 7019, 6225, 7983, 7733, 7382, 6653, 7733, 7982, 7731,
+ 8693, 7982, 7731, 8693, 7732, 7984, 7018, 7732, 7727, 7735,
+ 7736, 7019, 6225, 7735, 7736, 7986, 7738, 7742, 7738, 7736,
+ 8693, 7392, 7393, 7025, 7986, 7023, 6247, 7986, 7026, 7027,
+ 7740, 7025, 7033, 7034, 7986, 8693, 7026, 7027, 8693, 7740,
+ 7392, 7393, 7740, 7986, 7039, 8693, 7986, 7746, 7747, 7040,
+ 7041, 7746, 7747, 7422, 7423, 7749, 7751, 7749, 7747, 7051,
+ 7422, 7423, 6698, 6699, 7052, 7053, 6697, 6697, 6697, 6697,
+ 6697, 7752, 6697, 6698, 6699, 6697, 6697, 6697, 7987, 6697,
+ 6697, 6697, 6697, 6697, 7067, 7068, 6707, 5796, 7998, 7781,
+
+ 7782, 7781, 7782, 8693, 4629, 3778, 7067, 7068, 7993, 7067,
+ 7068, 8006, 4635, 7778, 4182, 8693, 6697, 4636, 4637, 4183,
+ 3775, 7784, 7800, 7784, 7782, 7100, 6322, 8693, 6307, 8693,
+ 7989, 8693, 7993, 6308, 5194, 7990, 7067, 7068, 7991, 6697,
+ 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6287, 5156, 6286,
+ 6286, 6286, 7758, 6286, 6286, 6286, 6286, 6286, 7990, 8003,
+ 7108, 7991, 8693, 7759, 8693, 7109, 7110, 8031, 4658, 7138,
+ 7139, 5795, 5796, 4659, 4187, 8042, 7758, 7506, 6707, 5796,
+ 6286, 8693, 8003, 3793, 3794, 6779, 7759, 6777, 5891, 8693,
+ 6780, 6781, 7828, 7829, 8048, 8049, 6790, 6791, 8693, 7995,
+
+ 8693, 7992, 8693, 6286, 6286, 6286, 6286, 6286, 6286, 7439,
+ 6286, 6287, 5156, 6286, 6286, 6286, 7754, 6286, 6286, 6286,
+ 6286, 6286, 7995, 7760, 7992, 5795, 5796, 5174, 5175, 6707,
+ 5796, 6715, 5174, 5175, 4629, 3778, 6716, 6717, 7831, 7838,
+ 8693, 7769, 6715, 8693, 6286, 7448, 8693, 6716, 6717, 7994,
+ 7996, 7997, 8051, 8049, 7530, 6791, 7449, 7999, 8693, 8000,
+ 6715, 8048, 8049, 7458, 8693, 6716, 6717, 6286, 8693, 7448,
+ 7530, 6791, 7994, 7996, 7459, 7997, 8693, 8001, 6307, 7449,
+ 7999, 8693, 8000, 6308, 5194, 5192, 8693, 7458, 8693, 4182,
+ 5193, 5194, 8693, 5192, 4183, 3775, 8002, 7459, 5193, 5194,
+
+ 4635, 8001, 7100, 6322, 8013, 4636, 4637, 8051, 8053, 8008,
+ 7100, 6322, 8009, 8004, 7100, 6322, 8693, 8005, 7472, 7473,
+ 8002, 8010, 5821, 5822, 8010, 8693, 7787, 8693, 8007, 6321,
+ 6322, 8014, 8693, 8008, 8011, 8693, 8004, 7788, 6321, 6322,
+ 8693, 8005, 8693, 8015, 8693, 8012, 8018, 8693, 8016, 8693,
+ 7787, 8007, 5821, 5822, 8014, 5211, 4190, 8693, 8011, 8693,
+ 7788, 8693, 5211, 4190, 8022, 7108, 8015, 8017, 8012, 8018,
+ 7109, 7110, 8016, 7166, 7167, 4666, 3794, 7108, 8020, 7108,
+ 8019, 8021, 7109, 7110, 7109, 7110, 7797, 6744, 8693, 6744,
+ 8017, 8693, 6745, 5841, 6745, 5841, 8693, 7798, 8693, 8035,
+
+ 8693, 8020, 5839, 8019, 8026, 8021, 8693, 5840, 5841, 8009,
+ 7797, 8023, 8693, 8024, 8693, 7472, 7473, 8025, 8010, 8693,
+ 7798, 8010, 8035, 7801, 6744, 5231, 5232, 5217, 8026, 6745,
+ 5841, 8011, 5218, 5219, 8023, 8028, 8024, 7795, 7108, 8693,
+ 8025, 8693, 8012, 7109, 7110, 7494, 7796, 5839, 8693, 7796,
+ 8693, 8030, 5840, 5841, 8034, 8011, 7495, 5217, 8028, 7797,
+ 8693, 4658, 5218, 5219, 8693, 8012, 4659, 4187, 8693, 7494,
+ 7798, 5231, 5232, 4666, 3794, 8030, 8027, 8034, 8693, 7495,
+ 8693, 4674, 8693, 7797, 8693, 8029, 4675, 4676, 8693, 8032,
+ 8033, 8693, 4674, 7798, 7166, 7167, 8693, 4675, 4676, 8027,
+
+ 4211, 8036, 8693, 5935, 5936, 4212, 3386, 8693, 8029, 8693,
+ 8037, 4211, 8032, 7834, 8033, 7834, 4212, 3386, 7835, 7836,
+ 7835, 7836, 8693, 8055, 8036, 8038, 7532, 8059, 8039, 7166,
+ 7167, 7533, 7534, 8037, 7163, 8040, 7840, 8693, 7840, 7164,
+ 6399, 7841, 8052, 7841, 7836, 8693, 8055, 8693, 8038, 8693,
+ 8059, 8039, 8693, 6805, 5936, 6805, 5936, 8693, 8056, 8040,
+ 7137, 7819, 7137, 7137, 7137, 8058, 7137, 7138, 7139, 7137,
+ 7137, 7137, 7137, 7820, 7137, 7137, 7137, 7137, 8057, 8063,
+ 8693, 8056, 7904, 7905, 8693, 4739, 3854, 8071, 4745, 8058,
+ 8693, 5935, 5936, 4746, 4747, 7904, 7905, 5318, 5319, 8693,
+
+ 7137, 8057, 5318, 5319, 8693, 6813, 7864, 4264, 8080, 3882,
+ 6814, 6815, 4265, 3851, 3883, 2988, 4764, 4765, 8693, 8060,
+ 8061, 8062, 8066, 7137, 6776, 6776, 6776, 6776, 6776, 7821,
+ 6776, 6777, 5891, 6776, 6776, 6776, 8043, 6776, 6776, 6776,
+ 6776, 6776, 8060, 8061, 8075, 8062, 8066, 8693, 8088, 3908,
+ 7907, 7921, 8693, 6427, 3909, 3027, 8693, 6813, 6428, 5338,
+ 4739, 3854, 6814, 6815, 6776, 8098, 8693, 8075, 6427, 8106,
+ 4837, 4832, 3919, 6428, 5338, 4838, 4839, 7907, 7905, 7364,
+ 7365, 7978, 7979, 8064, 8068, 8065, 8067, 6776, 6778, 6778,
+ 6779, 6778, 6778, 7823, 6778, 6780, 6781, 6778, 6778, 6778,
+
+ 8045, 6778, 6778, 6778, 6778, 6778, 8064, 8068, 8065, 8693,
+ 8067, 7901, 4336, 8693, 8128, 4858, 7648, 4337, 3916, 5336,
+ 4859, 4340, 3933, 3934, 5337, 5338, 5336, 8146, 6778, 8154,
+ 4896, 5337, 5338, 4891, 3961, 4897, 4898, 7978, 7979, 7958,
+ 4383, 8693, 8054, 4798, 4799, 4384, 3958, 8069, 7166, 7167,
+ 8070, 6778, 6383, 6383, 6384, 6383, 6383, 6383, 6383, 6385,
+ 5280, 6383, 6383, 6383, 7844, 6383, 6383, 6383, 6383, 6383,
+ 8069, 8083, 6862, 6018, 8070, 7845, 8163, 3981, 7981, 7985,
+ 8171, 4006, 3982, 3088, 8093, 4745, 4007, 3123, 7844, 8693,
+ 4746, 4747, 6383, 8173, 8083, 7981, 7979, 8693, 7845, 7719,
+
+ 7720, 7384, 8173, 7382, 6653, 8173, 7385, 7386, 8093, 7392,
+ 7393, 7472, 7473, 8072, 8693, 6383, 6383, 6383, 6384, 6383,
+ 6383, 7525, 6383, 6385, 5280, 6383, 6383, 6383, 7825, 6383,
+ 6383, 6383, 6383, 6383, 4264, 7846, 8072, 7855, 6813, 4265,
+ 3851, 6805, 5936, 6814, 6815, 4764, 4765, 4287, 4277, 3451,
+ 4798, 4799, 4288, 4289, 8073, 8693, 6383, 7546, 4287, 7556,
+ 3882, 4277, 3451, 4288, 4289, 3883, 2988, 8693, 7547, 8074,
+ 7557, 8076, 4305, 3485, 8082, 8078, 7222, 7223, 8073, 6383,
+ 8077, 7546, 8079, 7556, 4305, 3485, 7138, 7139, 8081, 8048,
+ 8049, 7547, 8074, 7557, 8076, 8084, 4313, 8082, 8078, 6862,
+
+ 6018, 4314, 4315, 8085, 8077, 8090, 8079, 4313, 8693, 3908,
+ 7882, 8081, 4314, 4315, 3909, 3027, 7222, 7223, 8084, 7222,
+ 7223, 8693, 8092, 8693, 8086, 6017, 6018, 8085, 8090, 6017,
+ 6018, 8087, 7883, 5419, 5420, 5419, 5420, 8089, 4832, 3919,
+ 5452, 4343, 8693, 7884, 8180, 8092, 8693, 8086, 8091, 8094,
+ 5174, 5175, 8097, 8048, 8049, 8087, 7883, 8095, 8096, 6870,
+ 8089, 8099, 6870, 8118, 6871, 6872, 7884, 6871, 6872, 6493,
+ 8693, 8091, 8094, 8693, 6494, 5436, 8097, 6493, 8693, 8101,
+ 8095, 8096, 6494, 5436, 8099, 5434, 8118, 8100, 4336, 8693,
+ 5435, 5436, 5434, 4337, 3916, 8102, 4837, 5435, 5436, 8693,
+
+ 8103, 4838, 4839, 8101, 8693, 8109, 7254, 6507, 8108, 8693,
+ 8100, 7615, 7616, 8104, 7254, 6507, 8105, 6506, 6507, 8102,
+ 6506, 6507, 7908, 8103, 8107, 6041, 6042, 8110, 7254, 6507,
+ 7828, 7829, 8108, 6928, 6104, 8112, 8104, 8693, 8111, 8114,
+ 8105, 5452, 4343, 8113, 7909, 8693, 8115, 8107, 8693, 8116,
+ 8693, 8110, 6041, 6042, 8693, 7910, 8140, 8693, 8112, 8693,
+ 8119, 8111, 8693, 8114, 7917, 7262, 8113, 8109, 7909, 8115,
+ 7263, 7264, 8116, 7615, 7616, 5469, 5470, 7262, 7910, 8140,
+ 8117, 7998, 7263, 7264, 8119, 7262, 7918, 4629, 3778, 8110,
+ 7263, 7264, 7917, 7262, 8051, 8053, 6898, 7919, 7263, 7264,
+
+ 8111, 6899, 6058, 8117, 8131, 4865, 3934, 8051, 8049, 8693,
+ 7918, 8120, 6898, 8110, 7918, 8693, 6056, 6899, 6058, 8121,
+ 7919, 6057, 6058, 8111, 8122, 7919, 6056, 8131, 8693, 8123,
+ 5457, 6057, 6058, 8133, 8120, 5458, 5459, 8693, 7918, 4865,
+ 3934, 8693, 8121, 8693, 4858, 8124, 5457, 8122, 7919, 4859,
+ 4340, 5458, 5459, 8123, 5469, 5470, 8133, 8693, 8126, 8125,
+ 4873, 7292, 7293, 8132, 8693, 4874, 4875, 8693, 8124, 4873,
+ 8127, 4363, 8129, 8130, 4874, 4875, 4364, 3534, 8693, 4363,
+ 8693, 8126, 8125, 8693, 4364, 3534, 8132, 7292, 7293, 8134,
+ 8138, 6103, 6104, 8693, 8127, 8129, 8693, 8130, 7939, 8136,
+
+ 6103, 6104, 8135, 8137, 7292, 7293, 6928, 6104, 8693, 5501,
+ 5502, 8693, 8134, 8138, 8693, 8142, 8139, 8693, 8141, 8693,
+ 7940, 8693, 8136, 4891, 3961, 8135, 8693, 8137, 8143, 5501,
+ 5502, 7941, 8144, 7828, 7829, 6936, 7719, 7720, 8142, 8139,
+ 6937, 6938, 8141, 8199, 7940, 8693, 8147, 6936, 8145, 5211,
+ 4190, 8143, 6937, 6938, 7941, 8144, 6564, 8693, 4908, 4909,
+ 6564, 6565, 5518, 8148, 8149, 6565, 5518, 4908, 4909, 8147,
+ 8693, 5516, 8145, 5516, 8150, 4896, 5517, 5518, 5517, 5518,
+ 4897, 4898, 8157, 8693, 4383, 8693, 8148, 8693, 8149, 4384,
+ 3958, 8151, 4390, 3559, 8693, 8158, 8693, 8153, 8150, 8152,
+
+ 4390, 3559, 4398, 8155, 8156, 8157, 8693, 4399, 4400, 4939,
+ 4940, 4398, 6707, 5796, 8151, 8159, 4399, 4400, 8158, 8160,
+ 8693, 8153, 8152, 4939, 4940, 8176, 8155, 3981, 8156, 8693,
+ 8161, 8693, 3982, 3088, 8693, 8162, 7532, 8166, 8159, 4416,
+ 3588, 7533, 7534, 8160, 4416, 3588, 4424, 8165, 8693, 8176,
+ 8693, 4425, 4426, 8161, 8693, 8164, 7067, 7068, 8693, 8162,
+ 8166, 8226, 8167, 8168, 7067, 7068, 4424, 5318, 5319, 8693,
+ 8165, 4425, 4426, 8693, 8169, 4006, 8175, 8693, 8164, 8174,
+ 4007, 3123, 7983, 7384, 8693, 8167, 8173, 8168, 7385, 7386,
+ 8170, 7983, 7719, 7720, 7983, 8173, 8693, 8169, 8173, 8693,
+
+ 8175, 8693, 8174, 8172, 8187, 5192, 5795, 5796, 8693, 8693,
+ 5193, 5194, 8693, 8693, 8170, 8006, 4635, 7989, 8693, 6707,
+ 5796, 4636, 4637, 7067, 7068, 8179, 8172, 6697, 6697, 6697,
+ 6697, 6697, 6697, 6697, 6698, 6699, 6697, 6697, 6697, 7758,
+ 6697, 6697, 6697, 6697, 6697, 8177, 4629, 3778, 8693, 8179,
+ 7759, 7778, 4182, 8207, 5217, 8693, 8693, 4183, 3775, 5218,
+ 5219, 8182, 8693, 7758, 5795, 5796, 8693, 6697, 8177, 8031,
+ 4658, 8216, 4211, 7759, 8063, 4659, 4187, 4212, 3386, 8693,
+ 4739, 3854, 8693, 8693, 8693, 8182, 8693, 8178, 5174, 5175,
+ 6697, 6697, 6697, 6697, 6697, 6697, 7752, 6697, 6698, 6699,
+
+ 6697, 6697, 6697, 7987, 6697, 6697, 6697, 6697, 6697, 6715,
+ 8178, 8181, 6715, 8693, 6716, 6717, 6307, 6716, 6717, 6307,
+ 8693, 6308, 5194, 8693, 6308, 5194, 8693, 8183, 7472, 7473,
+ 5192, 6697, 4635, 8693, 8181, 5193, 5194, 4636, 4637, 8693,
+ 8190, 7472, 7473, 8184, 8693, 8693, 7472, 7473, 8186, 8185,
+ 8693, 8183, 8189, 8693, 6697, 7100, 6322, 8191, 8188, 6321,
+ 6322, 8013, 8011, 7100, 6322, 8693, 8184, 7100, 6322, 8693,
+ 8192, 8186, 8185, 8012, 8693, 8194, 8189, 8693, 8193, 8693,
+ 8191, 8188, 8693, 7787, 6321, 6322, 8011, 8196, 5821, 5822,
+ 5821, 5822, 8693, 8192, 7788, 8693, 8012, 5211, 4190, 8194,
+
+ 7108, 8193, 5231, 5232, 8693, 7109, 7110, 7787, 8195, 8198,
+ 8196, 8197, 8693, 7108, 8693, 8022, 7108, 7788, 7109, 7110,
+ 8200, 7109, 7110, 4666, 3794, 8693, 8210, 8693, 8201, 8693,
+ 8202, 8195, 8693, 8198, 8197, 6744, 8693, 7797, 8693, 6744,
+ 6745, 5841, 8213, 8200, 6745, 5841, 5231, 5232, 7798, 8210,
+ 5839, 8201, 5839, 8203, 8202, 5840, 5841, 5840, 5841, 5217,
+ 8693, 7797, 4658, 8693, 5218, 5219, 8213, 4659, 4187, 8693,
+ 8204, 7798, 4666, 3794, 8211, 4674, 8206, 8203, 8205, 8693,
+ 4675, 4676, 8209, 4674, 8693, 4211, 8693, 8208, 4675, 4676,
+ 4212, 3386, 8693, 8204, 8693, 8212, 8693, 8211, 8233, 5336,
+
+ 8206, 8205, 8693, 8214, 5337, 5338, 8209, 8215, 8071, 4745,
+ 8208, 7166, 7167, 8217, 4746, 4747, 8693, 8693, 8212, 8693,
+ 7166, 7167, 6805, 5936, 8693, 8693, 8214, 8693, 8693, 6805,
+ 5936, 8215, 8221, 8693, 8220, 8222, 8217, 7137, 7137, 7137,
+ 7137, 7137, 8041, 7137, 7138, 7139, 7137, 7137, 7137, 8218,
+ 7137, 7137, 7137, 7137, 7137, 8223, 8221, 8220, 8238, 8222,
+ 7864, 4264, 8240, 4287, 4277, 3451, 4265, 3851, 4288, 4289,
+ 8693, 8693, 8693, 5935, 5936, 8693, 8245, 7137, 8223, 8693,
+ 5935, 5936, 4305, 3485, 8693, 8693, 8080, 3882, 8693, 6427,
+ 8693, 8054, 3883, 2988, 6428, 5338, 8224, 7166, 7167, 8225,
+
+ 7137, 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6777, 5891,
+ 6776, 6776, 6776, 7844, 6776, 6776, 6776, 6776, 6776, 8224,
+ 4739, 3854, 8231, 8225, 7845, 8247, 4313, 8088, 3908, 8693,
+ 8693, 4314, 4315, 3909, 3027, 8228, 8256, 7844, 5318, 5319,
+ 8693, 6776, 5419, 5420, 6813, 8231, 8693, 7845, 8098, 6814,
+ 6815, 8693, 6813, 8693, 4832, 3919, 8693, 6814, 6815, 8228,
+ 8693, 8227, 8229, 8693, 6776, 6776, 6776, 6776, 6776, 6776,
+ 7821, 6776, 6777, 5891, 6776, 6776, 6776, 8043, 6776, 6776,
+ 6776, 6776, 6776, 8230, 8227, 8693, 8229, 7222, 7223, 6427,
+ 8693, 8693, 6493, 8693, 6428, 5338, 5336, 6494, 5436, 8251,
+
+ 8693, 5337, 5338, 4764, 4765, 6776, 8230, 4745, 8263, 5434,
+ 8106, 4837, 4746, 4747, 5435, 5436, 4838, 4839, 8232, 8693,
+ 8693, 7615, 7616, 8251, 8234, 8261, 8236, 8235, 6776, 6778,
+ 6778, 6779, 6778, 6778, 6778, 6778, 6780, 6781, 6778, 6778,
+ 6778, 8232, 6778, 6778, 6778, 6778, 6778, 8234, 8261, 8236,
+ 8266, 8235, 7901, 4336, 6862, 6018, 8274, 8693, 4337, 3916,
+ 8693, 8693, 5452, 4343, 8693, 4277, 3451, 8252, 8693, 6778,
+ 4764, 4765, 8693, 8266, 8282, 5457, 8128, 4858, 8291, 4363,
+ 5458, 5459, 4859, 4340, 4364, 3534, 8693, 8693, 8239, 8237,
+ 8693, 8252, 6778, 6778, 6778, 6779, 6778, 6778, 7823, 6778,
+
+ 6780, 6781, 6778, 6778, 6778, 8045, 6778, 6778, 6778, 6778,
+ 6778, 8239, 4287, 8237, 3882, 4798, 4799, 4288, 4289, 3883,
+ 2988, 4313, 4798, 4799, 4305, 3485, 4314, 4315, 8693, 8693,
+ 3908, 7222, 7223, 6778, 8242, 3909, 3027, 8693, 8243, 8693,
+ 8241, 8244, 6862, 6018, 6017, 6018, 8693, 8246, 8693, 8248,
+ 8249, 8693, 6017, 6018, 8250, 8693, 6778, 8693, 8242, 5419,
+ 5420, 8243, 8693, 8241, 8693, 8244, 8693, 8254, 8253, 8299,
+ 8246, 8255, 8248, 8693, 8249, 5501, 5502, 8250, 4832, 3919,
+ 6870, 8693, 8257, 6870, 8693, 6871, 6872, 8693, 6871, 6872,
+ 8254, 8253, 8693, 8258, 6493, 8255, 5434, 8109, 8259, 6494,
+
+ 5436, 5435, 5436, 7615, 7616, 8257, 4837, 7615, 7616, 7254,
+ 6507, 4838, 4839, 8693, 8260, 7254, 6507, 8258, 8693, 8110,
+ 6506, 6507, 8259, 8262, 8264, 8693, 8265, 8269, 6506, 6507,
+ 8111, 8693, 8268, 8693, 6041, 6042, 8267, 8260, 8693, 6041,
+ 6042, 5452, 4343, 8110, 8270, 8693, 8262, 8264, 8693, 8693,
+ 8265, 8269, 8693, 8111, 8693, 8268, 8271, 8272, 8273, 8267,
+ 7262, 8693, 4865, 3934, 8275, 7263, 7264, 8270, 7262, 5469,
+ 5470, 6898, 8693, 7263, 7264, 8693, 6899, 6058, 6056, 8271,
+ 8272, 8288, 8273, 6057, 6058, 8277, 6898, 8275, 8276, 8278,
+ 6056, 6899, 6058, 5457, 8693, 6057, 6058, 8286, 5458, 5459,
+
+ 5469, 5470, 4858, 4865, 3934, 8288, 8280, 4859, 4340, 8277,
+ 4873, 8276, 8693, 8278, 8281, 4874, 4875, 8279, 7292, 7293,
+ 8286, 8283, 8284, 8693, 8285, 4873, 8287, 4363, 8693, 8280,
+ 4874, 4875, 4364, 3534, 8290, 8693, 7292, 7293, 8281, 8693,
+ 8279, 8293, 6928, 6104, 8283, 8693, 8284, 8285, 8294, 8287,
+ 6928, 6104, 8693, 8289, 8693, 8292, 6103, 6104, 8290, 5501,
+ 5502, 6103, 6104, 8295, 8293, 6707, 5796, 8146, 8296, 4891,
+ 3961, 8693, 8294, 4891, 3961, 8693, 8289, 8693, 8292, 8297,
+ 8298, 8693, 8300, 6936, 8301, 5174, 5175, 8295, 6937, 6938,
+ 6936, 8296, 8693, 6564, 8436, 6937, 6938, 8693, 6565, 5518,
+
+ 8329, 8302, 8297, 8693, 8298, 8300, 6564, 8693, 8301, 8306,
+ 5516, 6565, 5518, 5516, 8693, 5517, 5518, 8436, 5517, 5518,
+ 8693, 8303, 8154, 4896, 8329, 8302, 8304, 4896, 4897, 4898,
+ 7958, 4383, 4897, 4898, 8693, 8305, 4384, 3958, 4908, 4909,
+ 8693, 8307, 4390, 3559, 8303, 8693, 8311, 8308, 8693, 8304,
+ 4908, 4909, 4390, 3559, 4398, 8693, 8313, 4398, 8305, 4399,
+ 4400, 8309, 4399, 4400, 8307, 8312, 8163, 3981, 8693, 8310,
+ 3981, 8308, 3982, 3088, 8693, 3982, 3088, 4939, 4940, 4939,
+ 4940, 8693, 8314, 8693, 8309, 8318, 4416, 3588, 8312, 8693,
+ 8315, 4416, 3588, 8310, 8693, 8320, 4424, 8693, 8317, 8693,
+
+ 8316, 4425, 4426, 7067, 7068, 8314, 4424, 7067, 7068, 8319,
+ 4006, 4425, 4426, 8693, 8315, 4007, 3123, 8693, 8171, 4006,
+ 8323, 8693, 8317, 8316, 4007, 3123, 8693, 6707, 5796, 8324,
+ 8322, 8327, 8319, 8693, 8321, 6707, 5796, 5795, 5796, 5795,
+ 5796, 8180, 8693, 7998, 8323, 8693, 8693, 5174, 5175, 4629,
+ 3778, 8693, 8324, 8693, 8322, 8325, 8693, 8321, 6715, 8326,
+ 6715, 8693, 8328, 6716, 6717, 6716, 6717, 8693, 6307, 8693,
+ 6307, 8693, 8693, 6308, 5194, 6308, 5194, 8190, 8325, 8693,
+ 8187, 5192, 8326, 7472, 7473, 8328, 5193, 5194, 5192, 8331,
+ 8693, 8330, 8332, 5193, 5194, 8006, 4635, 7472, 7473, 8011,
+
+ 8693, 4636, 4637, 8693, 8333, 7472, 7473, 8693, 8334, 8693,
+ 8012, 8693, 8331, 8693, 8330, 8693, 8332, 8336, 7100, 6322,
+ 8335, 7100, 6322, 8011, 8693, 6321, 6322, 8333, 5821, 5822,
+ 8341, 8337, 8334, 8012, 6321, 6322, 5821, 5822, 8199, 5211,
+ 4190, 8336, 8693, 8335, 5211, 4190, 8693, 8338, 8339, 6805,
+ 5936, 8342, 8693, 8340, 8343, 8337, 8693, 7108, 8693, 7108,
+ 8693, 6744, 7109, 7110, 7109, 7110, 6745, 5841, 8693, 8693,
+ 8338, 8339, 8693, 8361, 8342, 8344, 6744, 8340, 8343, 8348,
+ 5839, 6745, 5841, 5839, 8693, 5840, 5841, 8693, 5840, 5841,
+ 8345, 8207, 5217, 8693, 8346, 5217, 8361, 5218, 5219, 8344,
+
+ 5218, 5219, 8031, 4658, 8693, 8347, 5231, 5232, 4659, 4187,
+ 8693, 8349, 8693, 8345, 8353, 8350, 8693, 8346, 5231, 5232,
+ 4666, 3794, 4666, 3794, 8355, 4674, 8693, 4674, 8347, 8351,
+ 4675, 4676, 4675, 4676, 8349, 8216, 4211, 8352, 4211, 8350,
+ 8693, 4212, 3386, 4212, 3386, 8354, 7166, 7167, 8693, 8693,
+ 8362, 8693, 8351, 6805, 5936, 8356, 5935, 5936, 8357, 8693,
+ 8226, 8352, 8693, 8063, 7166, 7167, 5318, 5319, 8354, 4739,
+ 3854, 8693, 8359, 8693, 8693, 8693, 8693, 8358, 8356, 5935,
+ 5936, 8360, 8357, 7137, 7137, 7137, 7137, 7137, 7137, 7137,
+ 7138, 7139, 7137, 7137, 7137, 8359, 7137, 7137, 7137, 7137,
+
+ 7137, 8358, 8363, 8693, 8360, 5318, 5319, 8693, 8693, 6813,
+ 8693, 8233, 5336, 8693, 6814, 6815, 6813, 5337, 5338, 8693,
+ 8364, 6814, 6815, 7137, 8370, 8363, 8071, 4745, 4277, 3451,
+ 4764, 4765, 4746, 4747, 8693, 6427, 8693, 8693, 8693, 8693,
+ 6428, 5338, 8365, 8372, 8364, 8366, 7137, 7137, 7137, 7137,
+ 7137, 7137, 8041, 7137, 7138, 7139, 7137, 7137, 7137, 8218,
+ 7137, 7137, 7137, 7137, 7137, 8365, 6427, 8372, 8366, 8368,
+ 8238, 6428, 5338, 5336, 4764, 4765, 4277, 3451, 5337, 5338,
+ 4287, 8693, 8240, 4287, 8693, 4288, 4289, 7137, 4288, 4289,
+ 8367, 8693, 8368, 8369, 8693, 8080, 3882, 8371, 8374, 8693,
+
+ 8373, 3883, 2988, 8693, 4798, 4799, 4798, 4799, 8693, 8245,
+ 7137, 4305, 3485, 4313, 8367, 4305, 3485, 8369, 4314, 4315,
+ 8371, 8247, 4313, 8693, 8373, 8693, 8376, 4314, 4315, 8375,
+ 8088, 3908, 8693, 8377, 7222, 7223, 3909, 3027, 7222, 7223,
+ 6862, 6018, 6862, 6018, 6017, 6018, 8693, 8378, 8382, 8693,
+ 8376, 8693, 8375, 8256, 6017, 6018, 8693, 8377, 8693, 5419,
+ 5420, 5419, 5420, 8098, 8379, 8693, 8381, 8383, 8380, 4832,
+ 3919, 8378, 6870, 8693, 6870, 8396, 8384, 6871, 6872, 6871,
+ 6872, 6041, 6042, 7615, 7616, 8693, 8693, 8379, 6493, 8381,
+ 8383, 8380, 8693, 6494, 5436, 8693, 6493, 8693, 7254, 6507,
+
+ 8384, 6494, 5436, 8386, 5434, 8385, 8390, 8263, 5434, 5435,
+ 5436, 8392, 8387, 5435, 5436, 8106, 4837, 7254, 6507, 7615,
+ 7616, 4838, 4839, 8693, 8389, 8693, 8386, 8693, 8385, 8390,
+ 8388, 8391, 8693, 6506, 6507, 8392, 8387, 8693, 6506, 6507,
+ 6041, 6042, 8693, 8393, 8274, 5452, 4343, 8693, 8389, 8693,
+ 5452, 4343, 8693, 8388, 8693, 8391, 8394, 8395, 8693, 7262,
+ 8398, 8693, 7262, 8397, 7263, 7264, 8393, 7263, 7264, 6898,
+ 8693, 5469, 5470, 8693, 6899, 6058, 8693, 8399, 8693, 8394,
+ 8693, 8395, 6898, 8693, 8398, 8693, 8397, 6899, 6058, 8403,
+ 6056, 8693, 6056, 8400, 8406, 6057, 6058, 6057, 6058, 8282,
+
+ 5457, 8399, 8401, 5457, 8693, 5458, 5459, 8693, 5458, 5459,
+ 8693, 8402, 8128, 4858, 5469, 5470, 8400, 8406, 4859, 4340,
+ 8404, 8408, 8693, 8405, 8693, 8401, 8693, 4865, 3934, 4865,
+ 3934, 8410, 4873, 8407, 8402, 4873, 8693, 4874, 4875, 8693,
+ 4874, 4875, 8693, 8404, 8291, 4363, 8693, 8405, 4363, 8693,
+ 4364, 3534, 8409, 4364, 3534, 7292, 7293, 8407, 7292, 7293,
+ 6928, 6104, 8693, 8411, 8693, 6928, 6104, 8417, 8412, 5501,
+ 5502, 8413, 8299, 6103, 6104, 8409, 6103, 6104, 5501, 5502,
+ 8693, 8414, 8693, 8693, 8419, 6936, 8411, 8146, 8415, 8416,
+ 6937, 6938, 8412, 4891, 3961, 8413, 6936, 8693, 8693, 8418,
+
+ 5516, 6937, 6938, 8693, 8414, 5517, 5518, 8693, 8419, 6564,
+ 8425, 8415, 8416, 8693, 6565, 5518, 4908, 4909, 8420, 8693,
+ 8424, 6564, 8418, 8306, 5516, 8421, 6565, 5518, 8693, 5517,
+ 5518, 8154, 4896, 8422, 8693, 4908, 4909, 4897, 4898, 8311,
+ 8693, 8420, 8693, 8693, 8424, 4390, 3559, 8693, 8421, 4390,
+ 3559, 4939, 4940, 8313, 4398, 8423, 4398, 8422, 8426, 4399,
+ 4400, 4399, 4400, 8429, 8427, 8163, 3981, 4416, 3588, 4939,
+ 4940, 3982, 3088, 8318, 8430, 8693, 8428, 8693, 8423, 4416,
+ 3588, 8426, 8431, 8320, 4424, 7067, 7068, 4424, 8427, 4425,
+ 4426, 8693, 4425, 4426, 8693, 8171, 4006, 8430, 7067, 7068,
+
+ 8428, 4007, 3123, 8327, 6707, 5796, 8431, 8432, 8180, 5795,
+ 5796, 5795, 5796, 8433, 5174, 5175, 7472, 7473, 8693, 6715,
+ 8693, 8693, 8434, 8435, 6716, 6717, 8437, 6715, 8693, 6307,
+ 8693, 8432, 6716, 6717, 6308, 5194, 8433, 8693, 7100, 6322,
+ 7472, 7473, 8443, 8438, 8693, 8434, 6307, 8435, 8187, 5192,
+ 8437, 6308, 5194, 8442, 5193, 5194, 7100, 6322, 8440, 6321,
+ 6322, 8439, 8446, 8693, 8341, 8443, 8444, 8438, 6321, 6322,
+ 5821, 5822, 5821, 5822, 5231, 5232, 8693, 8442, 8693, 8441,
+ 8445, 8440, 8447, 8693, 8439, 8199, 8693, 8448, 7108, 8444,
+ 7108, 5211, 4190, 7109, 7110, 7109, 7110, 8455, 8693, 8693,
+
+ 8693, 6744, 8441, 8445, 6744, 8447, 6745, 5841, 5839, 6745,
+ 5841, 8448, 8693, 5840, 5841, 8693, 8348, 5839, 8693, 8450,
+ 8455, 8449, 5840, 5841, 8454, 8451, 8207, 5217, 8453, 8353,
+ 5231, 5232, 5218, 5219, 8693, 4666, 3794, 8693, 8452, 4666,
+ 3794, 8693, 8450, 8693, 8449, 5935, 5936, 7166, 7167, 8451,
+ 8355, 4674, 8453, 4674, 8456, 8693, 4675, 4676, 4675, 4676,
+ 8462, 8452, 8216, 4211, 7166, 7167, 6805, 5936, 4212, 3386,
+ 6805, 5936, 8693, 8457, 8362, 8458, 8226, 8693, 8456, 8693,
+ 5935, 5936, 5318, 5319, 8462, 8460, 6813, 8693, 8459, 6813,
+ 8693, 6814, 6815, 8693, 6814, 6815, 6427, 8457, 8458, 8461,
+
+ 6427, 6428, 5338, 8693, 8693, 6428, 5338, 8233, 5336, 8460,
+ 8463, 8459, 8370, 5337, 5338, 4764, 4765, 8693, 4764, 4765,
+ 8238, 8693, 8461, 8464, 8693, 8465, 4277, 3451, 8693, 8374,
+ 8467, 8240, 4287, 8466, 8463, 4798, 4799, 4288, 4289, 8693,
+ 4798, 4799, 8693, 8245, 7222, 7223, 8464, 8693, 8465, 4305,
+ 3485, 8247, 4313, 8693, 8467, 8468, 8466, 4314, 4315, 7222,
+ 7223, 6862, 6018, 6862, 6018, 7254, 6507, 8382, 8693, 6017,
+ 6018, 8256, 8469, 6017, 6018, 8693, 6870, 5419, 5420, 8468,
+ 8471, 6871, 6872, 8470, 8473, 6870, 7615, 7616, 6493, 8481,
+ 6871, 6872, 8472, 6494, 5436, 8469, 6493, 7254, 6507, 8478,
+
+ 8474, 6494, 5436, 8693, 8471, 8693, 8470, 8482, 8473, 7615,
+ 7616, 8693, 8481, 6506, 6507, 8472, 8693, 8476, 8693, 8475,
+ 8263, 5434, 8693, 8478, 8474, 8480, 5435, 5436, 7262, 8477,
+ 6506, 6507, 8396, 7263, 7264, 8479, 6041, 6042, 6041, 6042,
+ 8476, 7262, 8475, 8274, 8693, 8693, 7263, 7264, 8480, 5452,
+ 4343, 8484, 8477, 8483, 6898, 8693, 8693, 6898, 8479, 6899,
+ 6058, 8485, 6899, 6058, 8693, 8403, 6056, 8693, 6056, 8693,
+ 8486, 6057, 6058, 6057, 6058, 8484, 8483, 8693, 8487, 8282,
+ 5457, 5469, 5470, 8490, 8485, 5458, 5459, 8693, 8489, 5469,
+ 5470, 8488, 8408, 8486, 4865, 3934, 7292, 7293, 4865, 3934,
+
+ 8410, 4873, 8487, 8693, 8491, 4873, 4874, 4875, 8693, 8492,
+ 4874, 4875, 8489, 8693, 8488, 8291, 4363, 7292, 7293, 6928,
+ 6104, 4364, 3534, 8693, 8494, 8493, 8693, 8491, 6928, 6104,
+ 8417, 6103, 6104, 8492, 6936, 8693, 6103, 6104, 8496, 6937,
+ 6938, 8495, 8693, 8693, 8299, 8693, 8498, 8494, 8693, 8493,
+ 5501, 5502, 8693, 8693, 6936, 8693, 8693, 8497, 8499, 6937,
+ 6938, 6564, 8496, 6564, 8495, 8693, 6565, 5518, 6565, 5518,
+ 8498, 8306, 5516, 7067, 7068, 8693, 8693, 5517, 5518, 8425,
+ 8497, 8693, 8499, 4908, 4909, 4908, 4909, 8311, 8500, 8693,
+ 8501, 8693, 8505, 4390, 3559, 8429, 8502, 8693, 8503, 8313,
+
+ 4398, 4939, 4940, 4939, 4940, 4399, 4400, 8693, 8318, 7067,
+ 7068, 8500, 8693, 8501, 4416, 3588, 8505, 8693, 8504, 8502,
+ 8320, 4424, 8503, 6707, 5796, 8327, 4425, 4426, 6707, 5796,
+ 6715, 5795, 5796, 8693, 6715, 6716, 6717, 8693, 8506, 6716,
+ 6717, 8693, 8504, 6307, 8693, 6307, 8693, 8507, 6308, 5194,
+ 6308, 5194, 7472, 7473, 7472, 7473, 8508, 7100, 6322, 8509,
+ 8693, 8506, 7100, 6322, 8693, 8693, 8446, 8510, 8693, 8512,
+ 8507, 8511, 6321, 6322, 6321, 6322, 8515, 8341, 8514, 8508,
+ 8513, 7108, 8509, 5821, 5822, 8693, 7109, 7110, 8693, 8517,
+ 8510, 8516, 7108, 8512, 8511, 6805, 5936, 7109, 7110, 8693,
+
+ 8515, 8514, 6744, 8513, 6744, 8518, 8693, 6745, 5841, 6745,
+ 5841, 8348, 5839, 8517, 8516, 8454, 8693, 5840, 5841, 5231,
+ 5232, 5231, 5232, 8526, 7166, 7167, 8519, 7166, 7167, 8518,
+ 8693, 8520, 8353, 8693, 8522, 8355, 4674, 8521, 4666, 3794,
+ 8693, 4675, 4676, 8523, 6805, 5936, 8526, 6813, 8693, 8519,
+ 8693, 8693, 6814, 6815, 8520, 8362, 8524, 8693, 8522, 6813,
+ 8521, 5935, 5936, 8370, 6814, 6815, 6427, 8523, 8525, 4764,
+ 4765, 6428, 5338, 8693, 8374, 8693, 8527, 6427, 8693, 8524,
+ 4798, 4799, 6428, 5338, 7222, 7223, 8693, 7222, 7223, 6862,
+ 6018, 8525, 8528, 8693, 8529, 6862, 6018, 8693, 8382, 8527,
+
+ 8693, 8530, 6870, 8531, 6017, 6018, 6493, 6871, 6872, 7615,
+ 7616, 6494, 5436, 8533, 6870, 8528, 8532, 8529, 8693, 6871,
+ 6872, 7615, 7616, 8534, 6493, 8530, 8693, 8531, 8693, 6494,
+ 5436, 8535, 7254, 6507, 8537, 8693, 8533, 8539, 8693, 8532,
+ 7254, 6507, 8693, 8482, 8693, 8540, 8534, 8536, 8538, 6506,
+ 6507, 8541, 6506, 6507, 8535, 8396, 8693, 8537, 7262, 8490,
+ 8539, 6041, 6042, 7263, 7264, 5469, 5470, 8543, 8540, 8542,
+ 8536, 7262, 8538, 6898, 8693, 8541, 7263, 7264, 6899, 6058,
+ 6898, 8408, 8544, 8403, 6056, 6899, 6058, 4865, 3934, 6057,
+ 6058, 8543, 8542, 5469, 5470, 7292, 7293, 8410, 4873, 8693,
+
+ 7292, 7293, 8546, 4874, 4875, 8545, 8544, 8693, 8548, 6928,
+ 6104, 6928, 6104, 8547, 8549, 8417, 7067, 7068, 6936, 8693,
+ 8425, 6103, 6104, 6937, 6938, 8546, 4908, 4909, 8545, 8550,
+ 6707, 5796, 8548, 8551, 8693, 6936, 8547, 6564, 8549, 8552,
+ 6937, 6938, 6565, 5518, 8558, 6564, 8693, 8553, 8429, 8693,
+ 6565, 5518, 8550, 8559, 4939, 4940, 8551, 7067, 7068, 6707,
+ 5796, 8693, 8552, 7472, 7473, 8555, 6715, 8558, 8554, 8556,
+ 8553, 6716, 6717, 8693, 6715, 8693, 8559, 8693, 8560, 6716,
+ 6717, 8557, 8565, 8563, 6307, 7472, 7473, 8693, 8555, 6308,
+ 5194, 8554, 8693, 8556, 8561, 6307, 7100, 6322, 8562, 8693,
+
+ 6308, 5194, 8560, 8446, 8557, 8454, 8565, 7100, 6322, 6321,
+ 6322, 5231, 5232, 7108, 8566, 8693, 8693, 8561, 7109, 7110,
+ 8567, 7108, 8562, 8564, 6744, 8693, 7109, 7110, 8693, 6745,
+ 5841, 7166, 7167, 6744, 8693, 8568, 8693, 8566, 6745, 5841,
+ 7166, 7167, 8569, 8567, 6805, 5936, 8564, 8693, 7222, 7223,
+ 6805, 5936, 8571, 8482, 8570, 8573, 6813, 8572, 8568, 6506,
+ 6507, 6814, 6815, 7222, 7223, 8569, 6427, 8575, 8574, 8576,
+ 8693, 6428, 5338, 8693, 6813, 8571, 8582, 8570, 8573, 6814,
+ 6815, 8572, 8579, 6427, 8577, 6862, 6018, 8581, 6428, 5338,
+ 8575, 8574, 8693, 8576, 8580, 6862, 6018, 6870, 8578, 8582,
+
+ 7615, 7616, 6871, 6872, 7615, 7616, 6870, 8577, 8583, 8693,
+ 8581, 6871, 6872, 6493, 8584, 7254, 6507, 8580, 6494, 5436,
+ 8587, 6493, 8578, 8589, 8693, 8585, 6494, 5436, 8490, 8590,
+ 8586, 8583, 7254, 6507, 5469, 5470, 8693, 7262, 8584, 8591,
+ 7262, 8588, 7263, 7264, 6898, 7263, 7264, 8589, 8585, 6899,
+ 6058, 6898, 8590, 8693, 8586, 8693, 6899, 6058, 7292, 7293,
+ 8592, 8693, 8591, 8693, 8588, 8693, 8593, 6928, 6104, 7292,
+ 7293, 8607, 8595, 8594, 8693, 8596, 8693, 6707, 5796, 6928,
+ 6104, 6936, 8597, 8592, 7067, 7068, 6937, 6938, 6936, 8593,
+ 8599, 7067, 7068, 6937, 6938, 8595, 8594, 8598, 8600, 8596,
+
+ 8603, 6564, 8693, 8606, 8693, 8597, 6565, 5518, 8693, 8601,
+ 6564, 8693, 8602, 8599, 8605, 6565, 5518, 6707, 5796, 8693,
+ 8598, 8693, 8600, 8609, 6715, 7472, 7473, 8606, 6715, 6716,
+ 6717, 8693, 8601, 6716, 6717, 8693, 8602, 8605, 8604, 6307,
+ 8608, 8563, 6307, 8693, 6308, 5194, 8693, 6308, 5194, 8612,
+ 7472, 7473, 7100, 6322, 7100, 6322, 8610, 7166, 7167, 8611,
+ 7108, 8604, 7108, 8608, 8693, 7109, 7110, 7109, 7110, 8693,
+ 8618, 6744, 8612, 8615, 8693, 8614, 6745, 5841, 8613, 8610,
+ 8620, 7166, 7167, 8611, 6744, 8622, 8617, 8693, 8616, 6745,
+ 5841, 6805, 5936, 6805, 5936, 7222, 7223, 8615, 8614, 6813,
+
+ 8621, 8613, 8693, 8620, 6814, 6815, 8693, 8624, 6813, 8693,
+ 8617, 8616, 8619, 6814, 6815, 8693, 8623, 6427, 8627, 8579,
+ 6427, 8693, 6428, 5338, 8621, 6428, 5338, 8625, 7222, 7223,
+ 6862, 6018, 7615, 7616, 8693, 8619, 8629, 8626, 8693, 8623,
+ 8693, 8627, 6862, 6018, 8693, 8631, 6870, 8628, 8693, 6870,
+ 8625, 6871, 6872, 8630, 6871, 6872, 8587, 6493, 8693, 6493,
+ 8635, 8626, 6494, 5436, 6494, 5436, 7615, 7616, 7254, 6507,
+ 8693, 8628, 8693, 7254, 6507, 8693, 8630, 8632, 8693, 8633,
+ 7262, 8693, 7262, 8635, 8693, 7263, 7264, 7263, 7264, 8693,
+ 8634, 8636, 8637, 6898, 8693, 8640, 6898, 8693, 6899, 6058,
+
+ 8632, 6899, 6058, 8633, 7292, 7293, 8639, 8693, 8638, 7292,
+ 7293, 8644, 8693, 8634, 8636, 8693, 8637, 6928, 6104, 6928,
+ 6104, 8641, 7067, 7068, 8693, 8693, 8693, 8642, 8643, 6936,
+ 8639, 8638, 8646, 6936, 6937, 6938, 6707, 5796, 6937, 6938,
+ 8603, 6564, 8645, 6564, 8641, 8650, 6565, 5518, 6565, 5518,
+ 8642, 8651, 8643, 8649, 8693, 8607, 8693, 8647, 8693, 7067,
+ 7068, 6707, 5796, 8648, 6715, 8645, 8609, 6715, 8650, 6716,
+ 6717, 8693, 6716, 6717, 8693, 8651, 8563, 6307, 7472, 7473,
+ 8647, 8693, 6308, 5194, 8652, 7472, 7473, 8648, 8655, 7100,
+ 6322, 8657, 7108, 8660, 7100, 6322, 8693, 7109, 7110, 7166,
+
+ 7167, 8653, 7166, 7167, 8654, 7108, 8693, 8693, 8652, 8693,
+ 7109, 7110, 8656, 8618, 6744, 8693, 6744, 8693, 8693, 6745,
+ 5841, 6745, 5841, 8622, 8653, 8661, 6805, 5936, 8654, 6805,
+ 5936, 8624, 6813, 8658, 6813, 8656, 8659, 6814, 6815, 6814,
+ 6815, 8662, 8693, 8579, 6427, 8664, 7222, 7223, 8661, 6428,
+ 5338, 7222, 7223, 8693, 8663, 8629, 8658, 6862, 6018, 8693,
+ 8659, 6862, 6018, 8693, 8693, 8662, 8693, 8631, 6870, 8665,
+ 6870, 8693, 8666, 6871, 6872, 6871, 6872, 8693, 8663, 8587,
+ 6493, 7615, 7616, 7615, 7616, 6494, 5436, 8670, 7254, 6507,
+ 8667, 8675, 8665, 7254, 6507, 8693, 8666, 7292, 7293, 8672,
+
+ 7262, 8693, 8669, 7262, 8668, 7263, 7264, 8693, 7263, 7264,
+ 8693, 8671, 8640, 6898, 8667, 6898, 7292, 7293, 6899, 6058,
+ 6899, 6058, 8644, 8693, 8693, 8693, 8669, 8668, 6928, 6104,
+ 8693, 8673, 6928, 6104, 8671, 8674, 8646, 6936, 8693, 8676,
+ 6936, 8693, 6937, 6938, 8693, 6937, 6938, 8677, 8693, 8603,
+ 6564, 8649, 7067, 7068, 8673, 6565, 5518, 7067, 7068, 8674,
+ 8678, 8693, 8676, 8607, 7472, 7473, 8693, 8679, 8680, 6707,
+ 5796, 8677, 8609, 6715, 7472, 7473, 8655, 8693, 6716, 6717,
+ 7100, 6322, 7100, 6322, 8678, 7166, 7167, 8681, 8693, 8693,
+ 8693, 8679, 8657, 7108, 8693, 8682, 7108, 8660, 7109, 7110,
+
+ 8684, 7109, 7110, 7166, 7167, 8618, 6744, 8622, 7222, 7223,
+ 8681, 6745, 5841, 6805, 5936, 8693, 8683, 8693, 8693, 8682,
+ 8624, 6813, 8664, 8685, 8684, 8629, 6814, 6815, 7222, 7223,
+ 8693, 6862, 6018, 7615, 7616, 8631, 6870, 8686, 8693, 8670,
+ 8683, 6871, 6872, 7615, 7616, 7254, 6507, 8685, 7254, 6507,
+ 8693, 8672, 7262, 8693, 7262, 8693, 8687, 7263, 7264, 7263,
+ 7264, 8640, 6898, 8688, 8675, 7292, 7293, 6899, 6058, 8644,
+ 7292, 7293, 8693, 8693, 8689, 6928, 6104, 8646, 6936, 8687,
+ 8690, 8693, 8649, 6937, 6938, 8680, 8693, 8688, 7067, 7068,
+ 8655, 7472, 7473, 7472, 7473, 8660, 7100, 6322, 8689, 8657,
+
+ 7108, 7166, 7167, 8664, 8690, 7109, 7110, 8686, 8691, 7222,
+ 7223, 7615, 7616, 7615, 7616, 8670, 8693, 8672, 7262, 8693,
+ 8693, 7254, 6507, 7263, 7264, 8693, 8692, 8675, 8693, 8680,
+ 8693, 8686, 8691, 7292, 7293, 7472, 7473, 7615, 7616, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8692, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 82,
+
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 88, 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 145, 145, 145, 145, 145, 145, 145,
+ 145, 145, 145, 145, 145, 146, 146, 146, 146, 146,
+ 146, 146, 146, 146, 146, 146, 146, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 198, 198, 198, 198, 198, 198, 198,
+ 198, 198, 198, 198, 198, 203, 203, 203, 203, 203,
+
+ 203, 203, 203, 203, 203, 203, 203, 212, 212, 212,
+ 212, 212, 212, 212, 212, 212, 212, 212, 212, 221,
+ 221, 221, 221, 221, 221, 221, 221, 221, 221, 221,
+ 221, 227, 227, 227, 227, 227, 227, 227, 227, 227,
+ 227, 227, 227, 292, 292, 292, 292, 292, 292, 292,
+ 292, 292, 292, 292, 292, 313, 313, 313, 313, 313,
+ 313, 313, 313, 313, 313, 313, 313, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318, 318, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 327, 327, 327, 327, 327, 327, 327, 327, 327,
+
+ 327, 327, 327, 332, 332, 332, 332, 332, 332, 332,
+ 332, 332, 332, 332, 332, 335, 335, 335, 335, 335,
+ 335, 335, 335, 335, 335, 335, 335, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 341,
+ 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
+ 341, 344, 344, 344, 344, 344, 344, 344, 344, 344,
+ 344, 344, 344, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 346, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 352, 352, 352,
+ 352, 352, 352, 352, 352, 352, 352, 352, 352, 357,
+
+ 357, 357, 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 361, 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 365, 365, 8693, 365, 365, 365, 365,
+ 365, 365, 365, 8693, 365, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 370, 370, 370,
+ 370, 370, 370, 370, 370, 370, 370, 370, 370, 376,
+ 8693, 8693, 8693, 376, 8693, 8693, 376, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380, 380, 396,
+ 8693, 8693, 8693, 396, 8693, 8693, 396, 403, 403, 403,
+ 403, 403, 403, 403, 403, 403, 403, 403, 403, 409,
+
+ 8693, 8693, 8693, 409, 8693, 8693, 409, 445, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 513,
+ 8693, 8693, 8693, 513, 8693, 8693, 513, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516, 516, 519,
+ 8693, 8693, 8693, 519, 8693, 8693, 519, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522, 522, 573,
+ 8693, 8693, 8693, 573, 8693, 8693, 573, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574, 574, 578,
+ 578, 578, 578, 578, 578, 578, 578, 578, 578, 578,
+ 578, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+
+ 586, 586, 586, 587, 587, 587, 587, 587, 587, 587,
+ 587, 587, 587, 587, 587, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 609, 8693, 8693,
+ 8693, 609, 8693, 8693, 609, 622, 622, 622, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 656, 8693, 8693,
+ 8693, 656, 8693, 8693, 656, 683, 683, 683, 683, 683,
+ 683, 683, 683, 683, 683, 683, 683, 713, 8693, 8693,
+ 713, 713, 8693, 8693, 713, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 726, 8693, 8693,
+ 8693, 726, 8693, 8693, 726, 732, 732, 732, 732, 732,
+
+ 732, 732, 732, 732, 732, 732, 732, 736, 8693, 8693,
+ 8693, 736, 8693, 8693, 736, 739, 739, 739, 739, 739,
+ 739, 739, 739, 739, 739, 739, 739, 740, 740, 8693,
+ 740, 740, 740, 740, 740, 740, 740, 740, 740, 743,
+ 743, 8693, 743, 743, 743, 743, 743, 743, 743, 743,
+ 743, 746, 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 750, 750, 8693, 750, 750,
+ 750, 750, 750, 750, 750, 750, 750, 751, 751, 8693,
+ 751, 751, 751, 751, 751, 751, 751, 751, 751, 754,
+
+ 754, 754, 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 755, 755, 755, 755, 755, 755, 755, 755, 755,
+ 755, 755, 755, 376, 8693, 8693, 8693, 376, 8693, 8693,
+ 376, 375, 8693, 8693, 375, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 379, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379, 379, 396,
+ 8693, 8693, 8693, 396, 8693, 8693, 396, 395, 8693, 8693,
+ 395, 403, 403, 403, 403, 403, 403, 403, 403, 403,
+ 403, 403, 403, 402, 402, 402, 402, 402, 402, 402,
+ 402, 402, 402, 402, 402, 409, 8693, 8693, 8693, 409,
+
+ 8693, 8693, 409, 408, 8693, 8693, 408, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 445, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+ 796, 796, 796, 444, 444, 444, 444, 444, 444, 444,
+ 444, 444, 444, 444, 444, 513, 8693, 8693, 8693, 513,
+ 8693, 8693, 513, 512, 8693, 8693, 512, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516, 516, 515,
+ 515, 515, 515, 515, 515, 515, 515, 515, 515, 515,
+ 515, 519, 8693, 8693, 8693, 519, 8693, 8693, 519, 518,
+
+ 8693, 8693, 518, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 521, 521, 521, 521, 521,
+ 521, 521, 521, 521, 521, 521, 521, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574, 574, 573,
+ 8693, 8693, 8693, 573, 8693, 8693, 573, 572, 8693, 8693,
+ 572, 896, 896, 896, 896, 896, 896, 896, 896, 896,
+ 896, 896, 896, 578, 578, 578, 578, 578, 578, 578,
+ 578, 578, 578, 578, 578, 587, 587, 587, 587, 587,
+ 587, 587, 587, 587, 587, 587, 587, 586, 586, 586,
+ 586, 586, 586, 586, 586, 586, 586, 586, 586, 585,
+
+ 585, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+ 585, 900, 900, 900, 900, 900, 900, 900, 900, 900,
+ 900, 900, 900, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 609, 8693, 8693, 8693, 609,
+ 8693, 8693, 609, 608, 8693, 8693, 608, 622, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 622, 622, 621,
+ 621, 621, 621, 621, 621, 621, 621, 621, 621, 621,
+ 621, 656, 8693, 8693, 8693, 656, 8693, 8693, 656, 655,
+ 8693, 8693, 655, 938, 938, 8693, 8693, 938, 8693, 8693,
+ 938, 938, 938, 938, 938, 683, 683, 683, 683, 683,
+
+ 683, 683, 683, 683, 683, 683, 683, 682, 682, 682,
+ 682, 682, 682, 682, 682, 682, 682, 682, 682, 959,
+ 959, 959, 959, 959, 959, 959, 959, 959, 959, 959,
+ 959, 713, 8693, 8693, 713, 713, 8693, 8693, 713, 712,
+ 712, 8693, 8693, 712, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 718, 718, 718, 718,
+ 718, 718, 718, 718, 718, 718, 718, 718, 726, 8693,
+ 8693, 8693, 726, 8693, 8693, 726, 725, 8693, 8693, 725,
+ 732, 732, 732, 732, 732, 732, 732, 732, 732, 732,
+ 732, 732, 731, 731, 731, 731, 731, 731, 731, 731,
+
+ 731, 731, 731, 731, 736, 8693, 8693, 8693, 736, 8693,
+ 8693, 736, 735, 8693, 8693, 735, 739, 739, 739, 739,
+ 739, 739, 739, 739, 739, 739, 739, 739, 738, 738,
+ 738, 738, 738, 738, 738, 738, 738, 738, 738, 738,
+ 740, 740, 8693, 740, 740, 740, 740, 740, 740, 740,
+ 740, 740, 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 750, 750, 8693, 750, 750, 750,
+ 750, 750, 750, 750, 750, 750, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754, 409, 8693,
+ 8693, 8693, 409, 8693, 8693, 409, 779, 779, 779, 779,
+
+ 779, 779, 779, 779, 779, 779, 779, 779, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 796, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+ 796, 796, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
+ 1026, 1026, 1026, 1026, 1029, 1029, 1029, 1029, 1029, 1029,
+ 1029, 1029, 1029, 1029, 1029, 1029, 445, 445, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 896, 896,
+ 896, 896, 896, 896, 896, 896, 896, 896, 896, 896,
+ 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144,
+ 1144, 1144, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+
+ 1146, 1146, 1146, 1146, 900, 900, 900, 900, 900, 900,
+ 900, 900, 900, 900, 900, 900, 1149, 1149, 1149, 1149,
+ 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1152, 1152,
+ 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152,
+ 609, 8693, 8693, 8693, 609, 8693, 8693, 609, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 622, 622, 622,
+ 938, 938, 8693, 8693, 938, 8693, 8693, 938, 938, 938,
+ 938, 938, 656, 8693, 8693, 8693, 656, 8693, 8693, 656,
+ 959, 959, 959, 959, 959, 959, 959, 959, 959, 959,
+ 959, 959, 683, 683, 683, 683, 683, 683, 683, 683,
+
+ 683, 683, 683, 683, 1276, 1276, 1276, 1276, 1276, 1276,
+ 1276, 1276, 1276, 1276, 1276, 1276, 1281, 1281, 1281, 1281,
+ 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1284, 1284,
+ 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284,
+ 1381, 1381, 8693, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 1398, 1405, 1405, 1405, 1405, 1405, 1405,
+ 1405, 1405, 1405, 1405, 1405, 1405, 1408, 1408, 1408, 1408,
+ 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1411, 1411,
+ 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411,
+
+ 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
+ 1415, 1415, 1515, 8693, 8693, 1515, 1515, 8693, 8693, 8693,
+ 1515, 8693, 1515, 1516, 1516, 1516, 1516, 1516, 1516, 1516,
+ 1516, 1516, 1516, 1516, 1516, 1543, 1543, 1543, 1543, 1543,
+ 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1545, 1545, 1545,
+ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1547,
+ 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
+ 1547, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551,
+ 1551, 1551, 1551, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
+ 1579, 1579, 1579, 1579, 1579, 1580, 1580, 1580, 1580, 1580,
+
+ 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1594, 1594, 1594,
+ 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1632, 1632, 1632, 1632, 1632, 1632, 1632,
+ 1632, 1632, 1632, 1632, 1632, 1666, 1666, 1666, 1666, 1666,
+ 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1405,
+ 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405,
+ 1405, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693,
+
+ 1693, 1693, 1693, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1408, 1408, 1408, 1408, 1408,
+ 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411,
+ 1411, 1411, 1411, 1702, 1702, 1702, 1702, 1702, 1702, 1702,
+ 1702, 1702, 1702, 1702, 1702, 1706, 1706, 1706, 1706, 1706,
+ 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1415, 1415, 1415,
+ 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1711,
+
+ 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711,
+ 1711, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152,
+ 1152, 1152, 1152, 609, 8693, 8693, 8693, 609, 8693, 8693,
+ 609, 622, 622, 622, 622, 622, 622, 622, 622, 622,
+ 622, 622, 622, 1747, 1747, 1747, 1747, 1747, 1747, 1747,
+ 1747, 1747, 1747, 1747, 1747, 1753, 1753, 1753, 1753, 1753,
+ 1753, 1753, 1753, 1753, 1753, 1753, 1753, 656, 8693, 8693,
+ 8693, 656, 8693, 8693, 656, 1767, 1767, 1767, 1767, 1767,
+ 1767, 1767, 1767, 1767, 1767, 1767, 1767, 683, 683, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 1789,
+
+ 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
+ 1789, 1816, 8693, 8693, 8693, 1816, 8693, 8693, 1816, 1516,
+ 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516,
+ 1516, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
+ 1818, 1818, 1818, 1543, 1543, 1543, 1543, 1543, 1543, 1543,
+ 1543, 1543, 1543, 1543, 1543, 1842, 1842, 1842, 1842, 1842,
+ 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1545, 1545, 1545,
+ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1845,
+ 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845,
+ 1845, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
+
+ 1547, 1547, 1547, 1848, 1848, 1848, 1848, 1848, 1848, 1848,
+ 1848, 1848, 1848, 1848, 1848, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1551, 1551, 1551,
+ 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1858,
+ 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858,
+ 1858, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284,
+ 1284, 1284, 1284, 1864, 1864, 1864, 1864, 1864, 1864, 1864,
+ 1864, 1864, 1864, 1864, 1864, 1888, 1888, 1888, 1888, 1888,
+ 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1580, 1580, 1580,
+ 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1890,
+
+ 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
+ 1890, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893,
+ 1893, 1893, 1893, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
+ 1594, 1594, 1594, 1594, 1594, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1909, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1606,
+ 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
+ 1606, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921,
+ 1921, 1921, 1921, 1924, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 1924, 1924, 1924, 1929, 1929, 1929, 1929, 1929,
+
+ 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1943,
+ 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943,
+ 1943, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946,
+ 1946, 1946, 1946, 1632, 1632, 1632, 1632, 1632, 1632, 1632,
+ 1632, 1632, 1632, 1632, 1632, 1956, 1956, 1956, 1956, 1956,
+ 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1959, 1959, 1959,
+ 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 409,
+ 8693, 8693, 8693, 409, 8693, 8693, 409, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 1381,
+
+ 1381, 8693, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
+ 1666, 1666, 1666, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
+ 1993, 1993, 1993, 1993, 1993, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 2009,
+ 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009,
+ 2009, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693,
+ 1693, 1693, 1693, 1405, 1405, 1405, 1405, 1405, 1405, 1405,
+ 1405, 1405, 1405, 1405, 1405, 1696, 1696, 1696, 1696, 1696,
+
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 2015, 2015, 2015,
+ 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1702, 1702, 1702, 1702, 1702, 1702, 1702,
+ 1702, 1702, 1702, 1702, 1702, 1411, 1411, 1411, 1411, 1411,
+ 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1706, 1706, 1706,
+ 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 2019,
+ 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,
+ 2019, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152,
+
+ 1152, 1152, 1152, 1711, 1711, 1711, 1711, 1711, 1711, 1711,
+ 1711, 1711, 1711, 1711, 1711, 609, 8693, 8693, 8693, 609,
+ 8693, 8693, 609, 622, 622, 622, 622, 622, 622, 622,
+ 622, 622, 622, 622, 622, 2045, 2045, 2045, 2045, 2045,
+ 2045, 2045, 2045, 2045, 2045, 2045, 2045, 1747, 1747, 1747,
+ 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 2058,
+ 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061,
+ 2061, 2061, 2061, 1753, 1753, 1753, 1753, 1753, 1753, 1753,
+ 1753, 1753, 1753, 1753, 1753, 2066, 2066, 2066, 2066, 2066,
+
+ 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2069, 2069, 2069,
+ 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 656,
+ 8693, 8693, 8693, 656, 8693, 8693, 656, 1767, 1767, 1767,
+ 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 2084,
+ 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
+ 2084, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+ 683, 683, 683, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
+ 1789, 1789, 1789, 1789, 1789, 2104, 2104, 2104, 2104, 2104,
+ 2104, 2104, 2104, 2104, 2104, 2104, 2104, 409, 8693, 8693,
+ 8693, 409, 8693, 8693, 409, 1815, 8693, 8693, 1815, 1816,
+
+ 8693, 8693, 8693, 1816, 8693, 8693, 1816, 1818, 1818, 1818,
+ 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 2132,
+ 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
+ 2132, 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
+ 2134, 2134, 2134, 2139, 8693, 8693, 2139, 8693, 8693, 8693,
+ 8693, 8693, 8693, 2139, 1842, 1842, 1842, 1842, 1842, 1842,
+ 1842, 1842, 1842, 1842, 1842, 1842, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2159, 2159,
+ 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
+ 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845,
+
+ 1845, 1845, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162,
+ 2162, 2162, 2162, 2162, 1545, 1545, 1545, 1545, 1545, 1545,
+ 1545, 1545, 1545, 1545, 1545, 1545, 1848, 1848, 1848, 1848,
+ 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1547, 1547,
+ 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
+ 1852, 1852, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 1284, 1284, 1284, 1284, 1284, 1284,
+ 1284, 1284, 1284, 1284, 1284, 1284, 1858, 1858, 1858, 1858,
+ 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 445, 445,
+
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864,
+ 1864, 1864, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174,
+ 2174, 2174, 2174, 2174, 2177, 2177, 2177, 2177, 2177, 2177,
+ 2177, 2177, 2177, 2177, 2177, 2177, 796, 796, 796, 796,
+ 796, 796, 796, 796, 796, 796, 796, 796, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888,
+ 1888, 1888, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
+ 1890, 1890, 1890, 1890, 2198, 2198, 2198, 2198, 2198, 2198,
+
+ 2198, 2198, 2198, 2198, 2198, 2198, 1893, 1893, 1893, 1893,
+ 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 2203, 2203,
+ 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203,
+ 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206,
+ 2206, 2206, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
+ 1579, 1579, 1579, 1579, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 1909, 1909,
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
+
+ 2225, 2225, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 2228, 2239, 2239, 2239, 2239, 2239, 2239,
+ 2239, 2239, 2239, 2239, 2239, 2239, 1921, 1921, 1921, 1921,
+ 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 2241, 2241,
+ 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241,
+ 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246,
+ 2246, 2246, 2246, 2246, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 2249, 1929, 1929, 1929, 1929,
+ 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 2258, 2258,
+
+ 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258,
+ 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261,
+ 2261, 2261, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943,
+ 1943, 1943, 1943, 1943, 2271, 2271, 2271, 2271, 2271, 2271,
+ 2271, 2271, 2271, 2271, 2271, 2271, 1946, 1946, 1946, 1946,
+ 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 2277, 2277,
+ 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
+ 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 2280, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956,
+ 1956, 1956, 1956, 1956, 2290, 2290, 2290, 2290, 2290, 2290,
+
+ 2290, 2290, 2290, 2290, 2290, 2290, 1959, 1959, 1959, 1959,
+ 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 2295, 2295,
+ 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 409, 8693, 8693, 409, 8693, 8693, 8693, 409,
+ 8693, 8693, 409, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 1515, 1515, 1515, 1515, 8693,
+ 8693, 8693, 8693, 1515, 8693, 1515, 1381, 1381, 8693, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1993, 1993,
+ 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
+
+ 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333,
+ 2333, 2333, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 1398, 1398, 1398, 2009, 2009, 2009, 2009,
+ 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354,
+ 2354, 2354, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015,
+ 2015, 2015, 2015, 2015, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 2359, 2359, 2361, 2361, 2361, 2361,
+
+ 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 1405, 1405,
+ 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405,
+ 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,
+ 2019, 2019, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2364, 2364, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2367, 2367, 2367, 2367, 1411, 1411, 1411, 1411,
+ 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 609, 8693,
+ 8693, 8693, 609, 8693, 8693, 609, 622, 622, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 622, 2045, 2045,
+ 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045,
+
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2058, 2058, 2058, 2058, 2403, 2403, 2403, 2403,
+ 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2061, 2061,
+ 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061,
+ 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408,
+ 2408, 2408, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2066, 2066, 2066, 2066, 2066, 2066,
+ 2066, 2066, 2066, 2066, 2066, 2066, 2415, 2415, 2415, 2415,
+
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2069, 2069,
+ 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069,
+ 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420,
+ 2420, 2420, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 656, 8693, 8693, 8693, 656, 8693,
+ 8693, 656, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
+ 2084, 2084, 2084, 2084, 2439, 2439, 2439, 2439, 2439, 2439,
+ 2439, 2439, 2439, 2439, 2439, 2439, 2441, 2441, 2441, 2441,
+ 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 683, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+
+ 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
+ 2104, 2104, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458,
+ 2458, 2458, 2458, 2458, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 409, 8693, 8693, 8693,
+ 409, 8693, 8693, 409, 2134, 2134, 2134, 2134, 2134, 2134,
+ 2134, 2134, 2134, 2134, 2134, 2134, 2132, 2132, 2132, 2132,
+ 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2479, 2479,
+ 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479,
+ 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484,
+ 2484, 2484, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+
+ 2485, 2485, 2485, 2485, 2139, 8693, 8693, 2139, 8693, 8693,
+ 8693, 8693, 8693, 8693, 2139, 2490, 8693, 8693, 8693, 2490,
+ 8693, 8693, 2490, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 2156, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 1842, 1842, 1842,
+ 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 2159,
+ 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
+ 2159, 2504, 2504, 2504, 2504, 2504, 2504, 2504, 2504, 2504,
+ 2504, 2504, 2504, 2162, 2162, 2162, 2162, 2162, 2162, 2162,
+ 2162, 2162, 2162, 2162, 2162, 2164, 2164, 2164, 2164, 2164,
+
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2509, 2509, 2509,
+ 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 2512, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
+ 1547, 1547, 1547, 445, 445, 445, 445, 445, 445, 445,
+ 445, 445, 445, 445, 445, 2174, 2174, 2174, 2174, 2174,
+ 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2518, 2518, 2518,
+ 2518, 2518, 2518, 2518, 2518, 2518, 2518, 2518, 2518, 2177,
+ 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177,
+ 2177, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523,
+
+ 2523, 2523, 2523, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2526, 2526, 2526, 2526, 2526, 796, 796, 796, 796, 796,
+ 796, 796, 796, 796, 796, 796, 796, 2198, 2198, 2198,
+ 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2548,
+ 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548,
+ 2548, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
+ 2550, 2550, 2550, 2206, 2206, 2206, 2206, 2206, 2206, 2206,
+ 2206, 2206, 2206, 2206, 2206, 2203, 2203, 2203, 2203, 2203,
+ 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2554, 2554, 2554,
+ 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2560,
+
+ 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560,
+ 2560, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561,
+ 2561, 2561, 2561, 2216, 2216, 2216, 2216, 2216, 2216, 2216,
+ 2216, 2216, 2216, 2216, 2216, 2571, 2571, 2571, 2571, 2571,
+ 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2573, 2573, 2573,
+ 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
+ 2225, 2225, 2225, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
+ 2581, 2581, 2581, 2581, 2581, 2590, 2590, 2590, 2590, 2590,
+
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2239, 2239, 2239,
+ 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241,
+ 2241, 2241, 2241, 2602, 2602, 2602, 2602, 2602, 2602, 2602,
+ 2602, 2602, 2602, 2602, 2602, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2246,
+ 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246,
+ 2246, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610,
+
+ 2610, 2610, 2610, 2619, 2619, 2619, 2619, 2619, 2619, 2619,
+ 2619, 2619, 2619, 2619, 2619, 2258, 2258, 2258, 2258, 2258,
+ 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2626, 2626, 2626,
+ 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2261,
+ 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261,
+ 2261, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
+ 2631, 2631, 2631, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2271, 2271, 2271, 2271, 2271,
+ 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2648,
+
+ 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
+ 2648, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 2280, 2280, 2277, 2277, 2277, 2277, 2277, 2277, 2277,
+ 2277, 2277, 2277, 2277, 2277, 2653, 2653, 2653, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2660, 2660, 2660,
+ 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2290,
+ 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290, 2290,
+ 2290, 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
+ 2670, 2670, 2670, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2298, 2298, 2298, 2298, 2298,
+
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2295, 2295, 2295,
+ 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 1515, 1515, 1515, 1515, 8693,
+ 8693, 8693, 8693, 1515, 8693, 1515, 1579, 1579, 1579, 1579,
+ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1381, 1381,
+ 8693, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+
+ 2335, 2335, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333,
+ 2333, 2333, 2333, 2333, 2711, 2711, 2711, 2711, 2711, 2711,
+ 2711, 2711, 2711, 2711, 2711, 2711, 2336, 2336, 2336, 2336,
+ 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2716, 2716,
+ 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354,
+ 2354, 2354, 2354, 2354, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2726, 2726, 2726, 2726,
+ 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2730, 2730,
+
+ 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
+ 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732,
+ 2732, 2732, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361,
+ 2361, 2361, 2361, 2361, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 2359, 2359, 2736, 2736, 2736, 2736,
+ 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2739, 2739,
+ 2739, 2739, 2739, 2739, 2739, 2739, 2739, 2739, 2739, 2739,
+ 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2364, 2364, 2364, 2364, 2364, 2364, 2364, 2364,
+ 2364, 2364, 2364, 2364, 2742, 2742, 2742, 2742, 2742, 2742,
+
+ 2742, 2742, 2742, 2742, 2742, 2742, 2746, 2746, 2746, 2746,
+ 2746, 2746, 2746, 2746, 2746, 2746, 2746, 2746, 609, 8693,
+ 8693, 8693, 609, 8693, 8693, 609, 2751, 2751, 2751, 2751,
+ 2751, 2751, 2751, 2751, 2751, 2751, 2751, 2751, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 622, 622, 622,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2763, 2763, 2763, 2763, 2763, 2763,
+ 2763, 2763, 2763, 2763, 2763, 2763, 2392, 2392, 2392, 2392,
+ 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2768, 2768,
+
+ 2768, 2768, 2768, 2768, 2768, 2768, 2768, 2768, 2768, 2768,
+ 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771,
+ 2771, 2771, 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
+ 2779, 2779, 2779, 2779, 2403, 2403, 2403, 2403, 2403, 2403,
+ 2403, 2403, 2403, 2403, 2403, 2403, 2781, 2781, 2781, 2781,
+ 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2783, 2783,
+ 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408,
+ 2408, 2408, 2408, 2408, 2786, 2786, 2786, 2786, 2786, 2786,
+
+ 2786, 2786, 2786, 2786, 2786, 2786, 2791, 2791, 2791, 2791,
+ 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795,
+ 2795, 2795, 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
+ 2797, 2797, 2797, 2797, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2420, 2420, 2420, 2420,
+ 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2800, 2800,
+ 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800,
+ 2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805,
+
+ 2805, 2805, 656, 8693, 8693, 8693, 656, 8693, 8693, 656,
+ 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
+ 2441, 2441, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439,
+ 2439, 2439, 2439, 2439, 2816, 2816, 2816, 2816, 2816, 2816,
+ 2816, 2816, 2816, 2816, 2816, 2816, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819, 683, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458,
+ 2458, 2458, 2458, 2458, 2830, 2830, 2830, 2830, 2830, 2830,
+
+ 2830, 2830, 2830, 2830, 2830, 2830, 2834, 2834, 2834, 2834,
+ 2834, 2834, 2834, 2834, 2834, 2834, 2834, 2834, 409, 8693,
+ 8693, 8693, 409, 8693, 8693, 409, 2479, 2479, 2479, 2479,
+ 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2852, 2852,
+ 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852,
+ 2853, 2853, 2853, 2853, 2853, 2853, 2853, 2853, 2853, 2853,
+ 2853, 2853, 2856, 2856, 2856, 2856, 2856, 2856, 2856, 2856,
+ 2856, 2856, 2856, 2856, 2863, 2863, 2863, 2863, 2863, 2863,
+ 2863, 2863, 2863, 2863, 2863, 2863, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2865, 2865,
+
+ 2865, 2865, 2865, 2865, 2865, 2865, 2865, 2865, 2865, 2865,
+ 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
+ 2134, 2134, 2489, 8693, 8693, 2489, 2490, 8693, 8693, 8693,
+ 2490, 8693, 8693, 2490, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 2504, 2504, 2504, 2504,
+ 2504, 2504, 2504, 2504, 2504, 2504, 2504, 2504, 2877, 2877,
+ 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877,
+ 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2509, 2509, 2509, 2509, 2509, 2509,
+
+ 2509, 2509, 2509, 2509, 2509, 2509, 2881, 2881, 2881, 2881,
+ 2881, 2881, 2881, 2881, 2881, 2881, 2881, 2881, 2885, 2885,
+ 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 445, 445, 2518, 2518, 2518, 2518, 2518, 2518, 2518, 2518,
+ 2518, 2518, 2518, 2518, 2894, 2894, 2894, 2894, 2894, 2894,
+ 2894, 2894, 2894, 2894, 2894, 2894, 2896, 2896, 2896, 2896,
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2526, 2526,
+ 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523,
+
+ 2523, 2523, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2902, 2911, 2911, 2911, 2911, 2911, 2911,
+ 2911, 2911, 2911, 2911, 2911, 2911, 796, 796, 796, 796,
+ 796, 796, 796, 796, 796, 796, 796, 796, 2548, 2548,
+ 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548,
+ 2929, 2929, 2929, 2929, 2929, 2929, 2929, 2929, 2929, 2929,
+ 2929, 2929, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
+ 2550, 2550, 2550, 2550, 2934, 2934, 2934, 2934, 2934, 2934,
+ 2934, 2934, 2934, 2934, 2934, 2934, 2935, 2935, 2935, 2935,
+ 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2554, 2554,
+
+ 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554,
+ 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2939,
+ 2939, 2939, 2940, 2940, 2940, 2940, 2940, 2940, 2940, 2940,
+ 2940, 2940, 2940, 2940, 2944, 2944, 2944, 2944, 2944, 2944,
+ 2944, 2944, 2944, 2944, 2944, 2944, 2952, 2952, 2952, 2952,
+ 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2561, 2561,
+ 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561, 2561,
+ 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955,
+ 2955, 2955, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206,
+ 2206, 2206, 2206, 2206, 2571, 2571, 2571, 2571, 2571, 2571,
+
+ 2571, 2571, 2571, 2571, 2571, 2571, 2964, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2573, 2573,
+ 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573,
+ 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
+ 2581, 2581, 2581, 2581, 2980, 2980, 2980, 2980, 2980, 2980,
+ 2980, 2980, 2980, 2980, 2980, 2980, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2228, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+
+ 2590, 2590, 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2599, 2599, 2599, 2599, 2599, 2599,
+ 2599, 2599, 2599, 2599, 2599, 2599, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2602, 2602,
+ 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602,
+ 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 3005, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 2610, 2610, 2610, 2610,
+ 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 3019, 3019,
+
+ 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019,
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
+ 3023, 3023, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2619, 2619, 2619, 2619, 2619, 2619,
+ 2619, 2619, 2619, 2619, 2619, 2619, 3035, 3035, 3035, 3035,
+ 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 2626, 2626,
+ 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
+ 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043,
+ 3043, 3043, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 2634, 2634, 2634, 2634, 2634, 2634,
+
+ 2634, 2634, 2634, 2634, 2634, 2634, 2631, 2631, 2631, 2631,
+ 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 3050, 3050,
+ 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
+ 3057, 3057, 3057, 3057, 3057, 3057, 3057, 3057, 3057, 3057,
+ 3057, 3057, 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 3069, 3069, 3069, 3069, 3069, 3069,
+ 3069, 3069, 3069, 3069, 3069, 3069, 2648, 2648, 2648, 2648,
+ 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3075,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
+
+ 2653, 2653, 3080, 3080, 3080, 3080, 3080, 3080, 3080, 3080,
+ 3080, 3080, 3080, 3080, 3084, 3084, 3084, 3084, 3084, 3084,
+ 3084, 3084, 3084, 3084, 3084, 3084, 2660, 2660, 2660, 2660,
+ 2660, 2660, 2660, 2660, 2660, 2660, 2660, 2660, 3095, 3095,
+ 3095, 3095, 3095, 3095, 3095, 3095, 3095, 3095, 3095, 3095,
+ 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 2280, 2670, 2670, 2670, 2670, 2670, 2670, 2670, 2670,
+ 2670, 2670, 2670, 2670, 3104, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 3110, 3110,
+
+ 3110, 3110, 3110, 3110, 3110, 3110, 3110, 3110, 3110, 3110,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 3115, 3115, 3115, 3115, 3115, 3115, 3115, 3115,
+ 3115, 3115, 3115, 3115, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684, 3130, 3130,
+ 3130, 3130, 3130, 3130, 3130, 3130, 3130, 3130, 3130, 3130,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 780, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 445, 445, 445, 445, 445, 445,
+
+ 445, 445, 445, 445, 445, 445, 1381, 1381, 8693, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 2712, 2712,
+ 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712,
+ 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151,
+ 3151, 3151, 3154, 3154, 3154, 3154, 3154, 3154, 3154, 3154,
+ 3154, 3154, 3154, 3154, 2716, 2716, 2716, 2716, 2716, 2716,
+ 2716, 2716, 2716, 2716, 2716, 2716, 3159, 3159, 3159, 3159,
+ 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+
+ 1398, 1398, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169,
+ 3169, 3169, 3169, 3169, 3172, 3172, 3172, 3172, 3172, 3172,
+ 3172, 3172, 3172, 3172, 3172, 3172, 3176, 3176, 3176, 3176,
+ 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176, 2730, 2730,
+ 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730, 2730,
+ 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732,
+ 2732, 2732, 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181,
+ 3181, 3181, 3181, 3181, 2354, 2354, 2354, 2354, 2354, 2354,
+ 2354, 2354, 2354, 2354, 2354, 2354, 2736, 2736, 2736, 2736,
+ 2736, 2736, 2736, 2736, 2736, 2736, 2736, 2736, 3184, 3184,
+
+ 3184, 3184, 3184, 3184, 3184, 3184, 3184, 3184, 3184, 3184,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 2739, 2739, 2739, 2739, 2739, 2739, 2739, 2739,
+ 2739, 2739, 2739, 2739, 3188, 3188, 3188, 3188, 3188, 3188,
+ 3188, 3188, 3188, 3188, 3188, 3188, 2361, 2361, 2361, 2361,
+ 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2361, 2742, 2742,
+ 2742, 2742, 2742, 2742, 2742, 2742, 2742, 2742, 2742, 2742,
+ 3190, 3190, 3190, 3190, 3190, 3190, 3190, 3190, 3190, 3190,
+ 3190, 3190, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
+ 1706, 1706, 1706, 1706, 2746, 2746, 2746, 2746, 2746, 2746,
+
+ 2746, 2746, 2746, 2746, 2746, 2746, 3195, 3195, 3195, 3195,
+ 3195, 3195, 3195, 3195, 3195, 3195, 3195, 3195, 2367, 2367,
+ 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2751, 2751, 2751, 2751, 2751, 2751, 2751, 2751, 2751, 2751,
+ 2751, 2751, 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200,
+ 3200, 3200, 3200, 3200, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 3205, 3205, 3205, 3205,
+ 3205, 3205, 3205, 3205, 3205, 3205, 3205, 3205, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+
+ 445, 445, 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763,
+ 2763, 2763, 2763, 2763, 3214, 3214, 3214, 3214, 3214, 3214,
+ 3214, 3214, 3214, 3214, 3214, 3214, 3216, 3216, 3216, 3216,
+ 3216, 3216, 3216, 3216, 3216, 3216, 3216, 3216, 2771, 2771,
+ 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771,
+ 2768, 2768, 2768, 2768, 2768, 2768, 2768, 2768, 2768, 2768,
+ 2768, 2768, 3219, 3219, 3219, 3219, 3219, 3219, 3219, 3219,
+ 3219, 3219, 3219, 3219, 3224, 3224, 3224, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231, 2781, 2781,
+
+ 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2781,
+ 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234,
+ 3234, 3234, 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783,
+ 2783, 2783, 2783, 2783, 3238, 3238, 3238, 3238, 3238, 3238,
+ 3238, 3238, 3238, 3238, 3238, 3238, 2786, 2786, 2786, 2786,
+ 2786, 2786, 2786, 2786, 2786, 2786, 2786, 2786, 3241, 3241,
+ 3241, 3241, 3241, 3241, 3241, 3241, 3241, 3241, 3241, 3241,
+ 3245, 3245, 3245, 3245, 3245, 3245, 3245, 3245, 3245, 3245,
+ 3245, 3245, 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
+ 2791, 2791, 2791, 2791, 3252, 3252, 3252, 3252, 3252, 3252,
+
+ 3252, 3252, 3252, 3252, 3252, 3252, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2795, 2795,
+ 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795, 2795,
+ 3255, 3255, 3255, 3255, 3255, 3255, 3255, 3255, 3255, 3255,
+ 3255, 3255, 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
+ 2797, 2797, 2797, 2797, 3259, 3259, 3259, 3259, 3259, 3259,
+ 3259, 3259, 3259, 3259, 3259, 3259, 2800, 2800, 2800, 2800,
+ 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 3262, 3262,
+ 3262, 3262, 3262, 3262, 3262, 3262, 3262, 3262, 3262, 3262,
+ 3266, 3266, 3266, 3266, 3266, 3266, 3266, 3266, 3266, 3266,
+
+ 3266, 3266, 2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805,
+ 2805, 2805, 2805, 2805, 3273, 3273, 3273, 3273, 3273, 3273,
+ 3273, 3273, 3273, 3273, 3273, 3273, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 656, 8693,
+ 8693, 8693, 656, 8693, 8693, 656, 2816, 2816, 2816, 2816,
+ 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 3284, 3284,
+ 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284,
+ 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287,
+ 3287, 3287, 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 3291, 3291, 3291, 3291, 3291, 3291,
+
+ 3291, 3291, 3291, 3291, 3291, 3291, 2441, 2441, 2441, 2441,
+ 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 683, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+ 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
+ 2830, 2830, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3302,
+ 3302, 3302, 3302, 3302, 3306, 3306, 3306, 3306, 3306, 3306,
+ 3306, 3306, 3306, 3306, 3306, 3306, 2834, 2834, 2834, 2834,
+ 2834, 2834, 2834, 2834, 2834, 2834, 2834, 2834, 3311, 3311,
+ 3311, 3311, 3311, 3311, 3311, 3311, 3311, 3311, 3311, 3311,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+
+ 2461, 2461, 409, 8693, 8693, 8693, 409, 8693, 8693, 409,
+ 1515, 8693, 8693, 1515, 1515, 8693, 8693, 8693, 1515, 8693,
+ 1515, 3320, 3320, 3320, 3320, 3320, 3320, 3320, 3320, 3320,
+ 3320, 3320, 3320, 3327, 3327, 3327, 3327, 3327, 3327, 3327,
+ 3327, 3327, 3327, 3327, 3327, 2853, 2853, 2853, 2853, 2853,
+ 2853, 2853, 2853, 2853, 2853, 2853, 2853, 2479, 2479, 2479,
+ 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2856,
+ 2856, 2856, 2856, 2856, 2856, 2856, 2856, 2856, 2856, 2856,
+ 2856, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328,
+ 3328, 3328, 3328, 3329, 3329, 3329, 3329, 3329, 3329, 3329,
+
+ 3329, 3329, 3329, 3329, 3329, 2862, 2862, 2862, 2862, 2862,
+ 2862, 2862, 2862, 2862, 2862, 2862, 2862, 2863, 2863, 2863,
+ 2863, 2863, 2863, 2863, 2863, 2863, 2863, 2863, 2863, 2134,
+ 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
+ 2134, 2865, 2865, 2865, 2865, 2865, 2865, 2865, 2865, 2865,
+ 2865, 2865, 2865, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 2877, 2877, 2877, 2877, 2877,
+ 2877, 2877, 2877, 2877, 2877, 2877, 2877, 3339, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 2879,
+ 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879,
+
+ 2879, 3342, 3342, 3342, 3342, 3342, 3342, 3342, 3342, 3342,
+ 3342, 3342, 3342, 2881, 2881, 2881, 2881, 2881, 2881, 2881,
+ 2881, 2881, 2881, 2881, 2881, 3345, 3345, 3345, 3345, 3345,
+ 3345, 3345, 3345, 3345, 3345, 3345, 3345, 1852, 1852, 1852,
+ 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 2885,
+ 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885,
+ 2885, 3351, 3351, 3351, 3351, 3351, 3351, 3351, 3351, 3351,
+ 3351, 3351, 3351, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 445, 445, 445, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 3357, 3357, 3357,
+
+ 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 2894,
+ 2894, 2894, 2894, 2894, 2894, 2894, 2894, 2894, 2894, 2894,
+ 2894, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 3364, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2896, 2896, 2896, 2896, 3372, 3372, 3372, 3372, 3372,
+ 3372, 3372, 3372, 3372, 3372, 3372, 3372, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 3378,
+ 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378,
+ 3378, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+
+ 2526, 2526, 2526, 2526, 2526, 2911, 2911, 2911, 2911, 2911,
+ 2911, 2911, 2911, 2911, 2911, 2911, 2911, 3394, 3394, 3394,
+ 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 1579,
+ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
+ 1579, 3399, 3399, 3399, 3399, 3399, 3399, 3399, 3399, 3399,
+ 3399, 3399, 3399, 796, 796, 796, 796, 796, 796, 796,
+ 796, 796, 796, 796, 796, 3408, 3408, 3408, 3408, 3408,
+ 3408, 3408, 3408, 3408, 3408, 3408, 3408, 2929, 2929, 2929,
+ 2929, 2929, 2929, 2929, 2929, 2929, 2929, 2929, 2929, 3410,
+ 3410, 3410, 3410, 3410, 3410, 3410, 3410, 3410, 3410, 3410,
+
+ 3410, 3411, 3411, 3411, 3411, 3411, 3411, 3411, 3411, 3411,
+ 3411, 3411, 3411, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
+ 3414, 3414, 3414, 3414, 3414, 3421, 3421, 3421, 3421, 3421,
+ 3421, 3421, 3421, 3421, 3421, 3421, 3421, 2935, 2935, 2935,
+ 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2935, 3422,
+ 3422, 3422, 3422, 3422, 3422, 3422, 3422, 3422, 3422, 3422,
+ 3422, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550,
+ 2550, 2550, 2550, 3425, 3425, 3425, 3425, 3425, 3425, 3425,
+ 3425, 3425, 3425, 3425, 3425, 2940, 2940, 2940, 2940, 2940,
+ 2940, 2940, 2940, 2940, 2940, 2940, 2940, 2554, 2554, 2554,
+
+ 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2944,
+ 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944,
+ 2944, 3426, 3426, 3426, 3426, 3426, 3426, 3426, 3426, 3426,
+ 3426, 3426, 3426, 3427, 3427, 3427, 3427, 3427, 3427, 3427,
+ 3427, 3427, 3427, 3427, 3427, 2951, 2951, 2951, 2951, 2951,
+ 2951, 2951, 2951, 2951, 2951, 2951, 2951, 2952, 2952, 2952,
+ 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2206,
+ 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206,
+ 2206, 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955,
+ 2955, 2955, 2955, 3435, 3435, 3435, 3435, 3435, 3435, 3435,
+
+ 3435, 3435, 3435, 3435, 3435, 2964, 2964, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 3445, 3445, 3445,
+ 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3448,
+ 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3448, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573,
+ 2573, 2573, 2573, 2972, 2972, 2972, 2972, 2972, 2972, 2972,
+ 2972, 2972, 2972, 2972, 2972, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 2581, 2581, 2581,
+ 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2980,
+ 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
+
+ 2980, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2984, 3464, 3464, 3464, 3464, 3464, 3464, 3464,
+ 3464, 3464, 3464, 3464, 3464, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2996, 2996, 2996,
+ 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996, 2996, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 445, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 3005, 3005, 3479, 3479, 3479, 3479, 3479, 3479, 3479,
+ 3479, 3479, 3479, 3479, 3479, 3482, 3482, 3482, 3482, 3482,
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 3013,
+ 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013, 3013,
+ 3013, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+ 3491, 3491, 3491, 2610, 2610, 2610, 2610, 2610, 2610, 2610,
+ 2610, 2610, 2610, 2610, 2610, 3019, 3019, 3019, 3019, 3019,
+ 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3023, 3023, 3023,
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3496,
+ 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496,
+ 3496, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 3035, 3035, 3035, 3035, 3035, 3035, 3035,
+
+ 3035, 3035, 3035, 3035, 3035, 3508, 3508, 3508, 3508, 3508,
+ 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3043, 3043, 3043,
+ 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3515,
+ 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3515, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3521, 3521, 3521, 3521, 3521, 3521, 3521,
+ 3521, 3521, 3521, 3521, 3521, 3050, 3050, 3050, 3050, 3050,
+ 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3526, 3526, 3526,
+ 3526, 3526, 3526, 3526, 3526, 3526, 3526, 3526, 3526, 3530,
+ 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530,
+
+ 3530, 3057, 3057, 3057, 3057, 3057, 3057, 3057, 3057, 3057,
+ 3057, 3057, 3057, 3541, 3541, 3541, 3541, 3541, 3541, 3541,
+ 3541, 3541, 3541, 3541, 3541, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 3549, 3549, 3549,
+ 3549, 3549, 3549, 3549, 3549, 3549, 3549, 3549, 3549, 3069,
+ 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069,
+ 3069, 3553, 3553, 3553, 3553, 3553, 3553, 3553, 3553, 3553,
+ 3553, 3553, 3553, 3556, 3556, 3556, 3556, 3556, 3556, 3556,
+ 3556, 3556, 3556, 3556, 3556, 3075, 3075, 3075, 3075, 3075,
+ 3075, 3075, 3075, 3075, 3075, 3075, 3075, 3564, 3564, 3564,
+
+ 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 2648,
+ 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
+ 2648, 3080, 3080, 3080, 3080, 3080, 3080, 3080, 3080, 3080,
+ 3080, 3080, 3080, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2653, 3084, 3084, 3084, 3084, 3084,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3568, 3568, 3568,
+ 3568, 3568, 3568, 3568, 3568, 3568, 3568, 3568, 3568, 2280,
+ 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 3095, 3095, 3095, 3095, 3095, 3095, 3095, 3095, 3095,
+ 3095, 3095, 3095, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+
+ 3104, 3104, 3104, 3104, 3104, 3582, 3582, 3582, 3582, 3582,
+ 3582, 3582, 3582, 3582, 3582, 3582, 3582, 3585, 3585, 3585,
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3110,
+ 3110, 3110, 3110, 3110, 3110, 3110, 3110, 3110, 3110, 3110,
+ 3110, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593,
+ 3593, 3593, 3593, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 3115, 3115, 3115, 3115, 3115,
+ 3115, 3115, 3115, 3115, 3115, 3115, 3115, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+
+ 3119, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597,
+ 3597, 3597, 3597, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 3130, 3130, 3130, 3130, 3130,
+ 3130, 3130, 3130, 3130, 3130, 3130, 3130, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 3610,
+ 3610, 3610, 3610, 3610, 3610, 3610, 3610, 3610, 3610, 3610,
+ 3610, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 445, 445, 445, 3611, 3611, 3611, 3611, 3611, 3611, 3611,
+ 3611, 3611, 3611, 3611, 3611, 1381, 1381, 8693, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 3151, 3151, 3151,
+
+ 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3154,
+ 3154, 3154, 3154, 3154, 3154, 3154, 3154, 3154, 3154, 3154,
+ 3154, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711,
+ 2711, 2711, 2711, 3155, 3155, 3155, 3155, 3155, 3155, 3155,
+ 3155, 3155, 3155, 3155, 3155, 3619, 3619, 3619, 3619, 3619,
+ 3619, 3619, 3619, 3619, 3619, 3619, 3619, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 3159,
+ 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159, 3159,
+ 3159, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623,
+ 3623, 3623, 3623, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+
+ 1398, 1398, 1398, 1398, 1398, 3169, 3169, 3169, 3169, 3169,
+ 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3172, 3172, 3172,
+ 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3176,
+ 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176,
+ 3176, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
+ 2726, 2726, 2726, 3630, 3630, 3630, 3630, 3630, 3630, 3630,
+ 3630, 3630, 3630, 3630, 3630, 3633, 3633, 3633, 3633, 3633,
+ 3633, 3633, 3633, 3633, 3633, 3633, 3633, 2354, 2354, 2354,
+ 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 3181,
+ 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181,
+
+ 3181, 3184, 3184, 3184, 3184, 3184, 3184, 3184, 3184, 3184,
+ 3184, 3184, 3184, 2736, 2736, 2736, 2736, 2736, 2736, 2736,
+ 2736, 2736, 2736, 2736, 2736, 2361, 2361, 2361, 2361, 2361,
+ 2361, 2361, 2361, 2361, 2361, 2361, 2361, 3188, 3188, 3188,
+ 3188, 3188, 3188, 3188, 3188, 3188, 3188, 3188, 3188, 3190,
+ 3190, 3190, 3190, 3190, 3190, 3190, 3190, 3190, 3190, 3190,
+ 3190, 2742, 2742, 2742, 2742, 2742, 2742, 2742, 2742, 2742,
+ 2742, 2742, 2742, 2367, 2367, 2367, 2367, 2367, 2367, 2367,
+ 2367, 2367, 2367, 2367, 2367, 3195, 3195, 3195, 3195, 3195,
+ 3195, 3195, 3195, 3195, 3195, 3195, 3195, 3200, 3200, 3200,
+
+ 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3200, 3642,
+ 3642, 3642, 3642, 3642, 3642, 3642, 3642, 3642, 3642, 3642,
+ 3642, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644,
+ 3644, 3644, 3644, 3205, 3205, 3205, 3205, 3205, 3205, 3205,
+ 3205, 3205, 3205, 3205, 3205, 3648, 3648, 3648, 3648, 3648,
+ 3648, 3648, 3648, 3648, 3648, 3648, 3648, 3651, 3651, 3651,
+ 3651, 3651, 3651, 3651, 3651, 3651, 3651, 3651, 3651, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 780, 3655, 3655, 3655, 3655, 3655, 3655, 3655, 3655, 3655,
+ 3655, 3655, 3655, 3214, 3214, 3214, 3214, 3214, 3214, 3214,
+
+ 3214, 3214, 3214, 3214, 3214, 3662, 3662, 3662, 3662, 3662,
+ 3662, 3662, 3662, 3662, 3662, 3662, 3662, 3216, 3216, 3216,
+ 3216, 3216, 3216, 3216, 3216, 3216, 3216, 3216, 3216, 3666,
+ 3666, 3666, 3666, 3666, 3666, 3666, 3666, 3666, 3666, 3666,
+ 3666, 3219, 3219, 3219, 3219, 3219, 3219, 3219, 3219, 3219,
+ 3219, 3219, 3219, 3669, 3669, 3669, 3669, 3669, 3669, 3669,
+ 3669, 3669, 3669, 3669, 3669, 3673, 3673, 3673, 3673, 3673,
+ 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3224, 3224, 3224,
+ 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3680,
+ 3680, 3680, 3680, 3680, 3680, 3680, 3680, 3680, 3680, 3680,
+
+ 3680, 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771,
+ 2771, 2771, 2771, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3685, 3685, 3685,
+ 3685, 3685, 3685, 3685, 3685, 3685, 3685, 3685, 3685, 3234,
+ 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234,
+ 3234, 3689, 3689, 3689, 3689, 3689, 3689, 3689, 3689, 3689,
+ 3689, 3689, 3689, 3692, 3692, 3692, 3692, 3692, 3692, 3692,
+ 3692, 3692, 3692, 3692, 3692, 3238, 3238, 3238, 3238, 3238,
+ 3238, 3238, 3238, 3238, 3238, 3238, 3238, 3696, 3696, 3696,
+
+ 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 2783,
+ 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783, 2783,
+ 2783, 3241, 3241, 3241, 3241, 3241, 3241, 3241, 3241, 3241,
+ 3241, 3241, 3241, 2786, 2786, 2786, 2786, 2786, 2786, 2786,
+ 2786, 2786, 2786, 2786, 2786, 3245, 3245, 3245, 3245, 3245,
+ 3245, 3245, 3245, 3245, 3245, 3245, 3245, 3698, 3698, 3698,
+ 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252,
+ 3252, 3252, 3252, 3255, 3255, 3255, 3255, 3255, 3255, 3255,
+
+ 3255, 3255, 3255, 3255, 3255, 3704, 3704, 3704, 3704, 3704,
+ 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3707, 3707, 3707,
+ 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3259,
+ 3259, 3259, 3259, 3259, 3259, 3259, 3259, 3259, 3259, 3259,
+ 3259, 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711,
+ 3711, 3711, 3711, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
+ 2797, 2797, 2797, 2797, 2797, 3262, 3262, 3262, 3262, 3262,
+ 3262, 3262, 3262, 3262, 3262, 3262, 3262, 2800, 2800, 2800,
+ 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 3266,
+ 3266, 3266, 3266, 3266, 3266, 3266, 3266, 3266, 3266, 3266,
+
+ 3266, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713,
+ 3713, 3713, 3713, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 3273, 3273, 3273, 3273, 3273,
+ 3273, 3273, 3273, 3273, 3273, 3273, 3273, 656, 8693, 8693,
+ 8693, 656, 8693, 8693, 656, 3720, 3720, 3720, 3720, 3720,
+ 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3284, 3284, 3284,
+ 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 3284, 2816,
+ 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816,
+ 2816, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287,
+ 3287, 3287, 3287, 3726, 3726, 3726, 3726, 3726, 3726, 3726,
+
+ 3726, 3726, 3726, 3726, 3726, 2441, 2441, 2441, 2441, 2441,
+ 2441, 2441, 2441, 2441, 2441, 2441, 2441, 3291, 3291, 3291,
+ 3291, 3291, 3291, 3291, 3291, 3291, 3291, 3291, 3291, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+ 683, 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731,
+ 3731, 3731, 3731, 3302, 3302, 3302, 3302, 3302, 3302, 3302,
+ 3302, 3302, 3302, 3302, 3302, 2830, 2830, 2830, 2830, 2830,
+ 2830, 2830, 2830, 2830, 2830, 2830, 2830, 3306, 3306, 3306,
+ 3306, 3306, 3306, 3306, 3306, 3306, 3306, 3306, 3306, 3738,
+ 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738,
+
+ 3738, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 3311, 3311, 3311, 3311, 3311, 3311, 3311,
+ 3311, 3311, 3311, 3311, 3311, 3743, 3743, 3743, 3743, 3743,
+ 3743, 3743, 3743, 3743, 3743, 3743, 3743, 409, 8693, 8693,
+ 409, 8693, 8693, 8693, 409, 409, 8693, 409, 3320, 3320,
+ 3320, 3320, 3320, 3320, 3320, 3320, 3320, 3320, 3320, 3320,
+ 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751,
+ 3751, 3751, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326,
+ 3326, 3326, 3326, 3326, 3327, 3327, 3327, 3327, 3327, 3327,
+ 3327, 3327, 3327, 3327, 3327, 3327, 3757, 3757, 3757, 3757,
+
+ 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3329, 3329,
+ 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329, 3329,
+ 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759,
+ 3759, 3759, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761,
+ 3761, 3761, 3761, 3761, 2856, 2856, 2856, 2856, 2856, 2856,
+ 2856, 2856, 2856, 2856, 2856, 2856, 2479, 2479, 2479, 2479,
+ 2479, 2479, 2479, 2479, 2479, 2479, 2479, 2479, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 3339, 3339, 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767,
+
+ 3767, 3767, 3767, 3767, 2159, 2159, 2159, 2159, 2159, 2159,
+ 2159, 2159, 2159, 2159, 2159, 2159, 3342, 3342, 3342, 3342,
+ 3342, 3342, 3342, 3342, 3342, 3342, 3342, 3342, 3770, 3770,
+ 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770,
+ 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879,
+ 2879, 2879, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345,
+ 3345, 3345, 3345, 3345, 2881, 2881, 2881, 2881, 2881, 2881,
+ 2881, 2881, 2881, 2881, 2881, 2881, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 3351, 3351,
+ 3351, 3351, 3351, 3351, 3351, 3351, 3351, 3351, 3351, 3351,
+
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 445, 445, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357,
+ 3357, 3357, 3357, 3357, 3776, 3776, 3776, 3776, 3776, 3776,
+ 3776, 3776, 3776, 3776, 3776, 3776, 3779, 3779, 3779, 3779,
+ 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3783, 3783,
+ 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783,
+ 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 3788, 3788, 3788, 3788, 3788, 3788, 3788, 3788,
+ 3788, 3788, 3788, 3788, 3791, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 2896, 2896, 2896, 2896,
+
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 3372, 3372,
+ 3372, 3372, 3372, 3372, 3372, 3372, 3372, 3372, 3372, 3372,
+ 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800,
+ 3800, 3800, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2902, 3378, 3378, 3378, 3378, 3378, 3378,
+ 3378, 3378, 3378, 3378, 3378, 3378, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3805, 3805,
+ 3805, 3805, 3805, 3805, 3805, 3805, 3805, 3805, 3805, 3805,
+ 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2526, 2526, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394,
+
+ 3394, 3394, 3394, 3394, 3399, 3399, 3399, 3399, 3399, 3399,
+ 3399, 3399, 3399, 3399, 3399, 3399, 3818, 3818, 3818, 3818,
+ 3818, 3818, 3818, 3818, 3818, 3818, 3818, 3818, 3821, 3821,
+ 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821,
+ 796, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+ 796, 796, 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832,
+ 3832, 3832, 3832, 3832, 3835, 3835, 3835, 3835, 3835, 3835,
+ 3835, 3835, 3835, 3835, 3835, 3835, 3411, 3411, 3411, 3411,
+ 3411, 3411, 3411, 3411, 3411, 3411, 3411, 3411, 2929, 2929,
+ 2929, 2929, 2929, 2929, 2929, 2929, 2929, 2929, 2929, 2929,
+
+ 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
+ 3414, 3414, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836,
+ 3836, 3836, 3836, 3836, 3837, 3837, 3837, 3837, 3837, 3837,
+ 3837, 3837, 3837, 3837, 3837, 3837, 3420, 3420, 3420, 3420,
+ 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3420, 3421, 3421,
+ 3421, 3421, 3421, 3421, 3421, 3421, 3421, 3421, 3421, 3421,
+ 3422, 3422, 3422, 3422, 3422, 3422, 3422, 3422, 3422, 3422,
+ 3422, 3422, 3424, 3424, 3424, 3424, 3424, 3424, 3424, 3424,
+ 3424, 3424, 3424, 3424, 3425, 3425, 3425, 3425, 3425, 3425,
+ 3425, 3425, 3425, 3425, 3425, 3425, 3842, 3842, 3842, 3842,
+
+ 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3427, 3427,
+ 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427, 3427,
+ 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845,
+ 3845, 3845, 3848, 3848, 3848, 3848, 3848, 3848, 3848, 3848,
+ 3848, 3848, 3848, 3848, 2944, 2944, 2944, 2944, 2944, 2944,
+ 2944, 2944, 2944, 2944, 2944, 2944, 2554, 2554, 2554, 2554,
+ 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 3435, 3435,
+ 3435, 3435, 3435, 3435, 3435, 3435, 3435, 3435, 3435, 3435,
+ 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852,
+ 3852, 3852, 3855, 3855, 3855, 3855, 3855, 3855, 3855, 3855,
+
+ 3855, 3855, 3855, 3855, 2964, 2964, 2964, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 3445, 3445, 3445, 3445,
+ 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3445, 3448, 3448,
+ 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3865, 3865, 3865, 3865, 3865, 3865, 3865, 3865, 3865, 3865,
+ 3865, 3865, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 2573, 2573, 2573, 2573, 2573, 2573,
+ 2573, 2573, 2573, 2573, 2573, 2573, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 3464, 3464,
+ 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464,
+
+ 3878, 3878, 3878, 3878, 3878, 3878, 3878, 3878, 3878, 3878,
+ 3878, 3878, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 2581, 2581, 2581, 2581, 2581, 2581,
+ 2581, 2581, 2581, 2581, 2581, 2581, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 3005, 3479, 3479, 3479, 3479, 3479, 3479, 3479, 3479,
+ 3479, 3479, 3479, 3479, 3482, 3482, 3482, 3482, 3482, 3482,
+ 3482, 3482, 3482, 3482, 3482, 3482, 3893, 3893, 3893, 3893,
+
+ 3893, 3893, 3893, 3893, 3893, 3893, 3893, 3893, 3491, 3491,
+ 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
+ 3023, 3023, 3023, 3023, 3496, 3496, 3496, 3496, 3496, 3496,
+ 3496, 3496, 3496, 3496, 3496, 3496, 3904, 3904, 3904, 3904,
+ 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3904, 3907, 3907,
+ 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907,
+ 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610,
+ 2610, 2610, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+
+ 2249, 2249, 2249, 2249, 3508, 3508, 3508, 3508, 3508, 3508,
+ 3508, 3508, 3508, 3508, 3508, 3508, 3917, 3917, 3917, 3917,
+ 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3920, 3920,
+ 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+ 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924,
+ 3924, 3924, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3515, 3515, 3515, 3515, 3928, 3928, 3928, 3928, 3928, 3928,
+ 3928, 3928, 3928, 3928, 3928, 3928, 3931, 3931, 3931, 3931,
+ 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3521, 3521,
+ 3521, 3521, 3521, 3521, 3521, 3521, 3521, 3521, 3521, 3521,
+
+ 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939,
+ 3939, 3939, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3526, 3526, 3526, 3526, 3526, 3526,
+ 3526, 3526, 3526, 3526, 3526, 3526, 3050, 3050, 3050, 3050,
+ 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3530, 3530,
+ 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530,
+ 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943,
+ 3943, 3943, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 3541, 3541, 3541, 3541, 3541, 3541,
+ 3541, 3541, 3541, 3541, 3541, 3541, 3549, 3549, 3549, 3549,
+
+ 3549, 3549, 3549, 3549, 3549, 3549, 3549, 3549, 3959, 3959,
+ 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959,
+ 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962,
+ 3962, 3962, 3553, 3553, 3553, 3553, 3553, 3553, 3553, 3553,
+ 3553, 3553, 3553, 3553, 3069, 3069, 3069, 3069, 3069, 3069,
+ 3069, 3069, 3069, 3069, 3069, 3069, 3556, 3556, 3556, 3556,
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3966, 3966,
+ 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966,
+ 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564,
+ 3564, 3564, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
+
+ 2648, 2648, 2648, 2648, 3568, 3568, 3568, 3568, 3568, 3568,
+ 3568, 3568, 3568, 3568, 3568, 3568, 3977, 3977, 3977, 3977,
+ 3977, 3977, 3977, 3977, 3977, 3977, 3977, 3977, 3980, 3980,
+ 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084,
+ 3084, 3084, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 2280, 2280, 2280, 2280, 2280, 3582, 3582, 3582, 3582,
+ 3582, 3582, 3582, 3582, 3582, 3582, 3582, 3582, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585,
+ 3585, 3585, 3991, 3991, 3991, 3991, 3991, 3991, 3991, 3991,
+ 3991, 3991, 3991, 3991, 3593, 3593, 3593, 3593, 3593, 3593,
+ 3593, 3593, 3593, 3593, 3593, 3593, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 3597, 3597,
+ 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597,
+ 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002,
+ 4002, 4002, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 2677, 2677, 2677, 2677,
+
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016,
+ 4016, 4016, 4016, 4016, 3611, 3611, 3611, 3611, 3611, 3611,
+ 3611, 3611, 3611, 3611, 3611, 3611, 4018, 4018, 4018, 4018,
+ 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, 1381, 1381,
+ 8693, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 3619, 3619, 3619, 3619, 3619, 3619, 3619, 3619, 3619, 3619,
+ 3619, 3619, 4024, 4024, 4024, 4024, 4024, 4024, 4024, 4024,
+
+ 4024, 4024, 4024, 4024, 4026, 4026, 4026, 4026, 4026, 4026,
+ 4026, 4026, 4026, 4026, 4026, 4026, 2711, 2711, 2711, 2711,
+ 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 3623, 3623,
+ 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623, 3623,
+ 4029, 4029, 4029, 4029, 4029, 4029, 4029, 4029, 4029, 4029,
+ 4029, 4029, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 1398, 3630, 3630, 3630, 3630, 3630, 3630,
+ 3630, 3630, 3630, 3630, 3630, 3630, 3633, 3633, 3633, 3633,
+ 3633, 3633, 3633, 3633, 3633, 3633, 3633, 3633, 4036, 4036,
+ 4036, 4036, 4036, 4036, 4036, 4036, 4036, 4036, 4036, 4036,
+
+ 4039, 4039, 4039, 4039, 4039, 4039, 4039, 4039, 4039, 4039,
+ 4039, 4039, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726,
+ 2726, 2726, 2726, 2726, 2736, 2736, 2736, 2736, 2736, 2736,
+ 2736, 2736, 2736, 2736, 2736, 2736, 2742, 2742, 2742, 2742,
+ 2742, 2742, 2742, 2742, 2742, 2742, 2742, 2742, 3644, 3644,
+ 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644,
+ 3642, 3642, 3642, 3642, 3642, 3642, 3642, 3642, 3642, 3642,
+ 3642, 3642, 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4044,
+ 4044, 4044, 4044, 4044, 4047, 4047, 4047, 4047, 4047, 4047,
+ 4047, 4047, 4047, 4047, 4047, 4047, 3651, 3651, 3651, 3651,
+
+ 3651, 3651, 3651, 3651, 3651, 3651, 3651, 3651, 3648, 3648,
+ 3648, 3648, 3648, 3648, 3648, 3648, 3648, 3648, 3648, 3648,
+ 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052,
+ 4052, 4052, 4056, 4056, 4056, 4056, 4056, 4056, 4056, 4056,
+ 4056, 4056, 4056, 4056, 3655, 3655, 3655, 3655, 3655, 3655,
+ 3655, 3655, 3655, 3655, 3655, 3655, 4061, 4061, 4061, 4061,
+ 4061, 4061, 4061, 4061, 4061, 4061, 4061, 4061, 4064, 4064,
+ 4064, 4064, 4064, 4064, 4064, 4064, 4064, 4064, 4064, 4064,
+ 4068, 4068, 4068, 4068, 4068, 4068, 4068, 4068, 4068, 4068,
+ 4068, 4068, 3662, 3662, 3662, 3662, 3662, 3662, 3662, 3662,
+
+ 3662, 3662, 3662, 3662, 4072, 4072, 4072, 4072, 4072, 4072,
+ 4072, 4072, 4072, 4072, 4072, 4072, 4075, 4075, 4075, 4075,
+ 4075, 4075, 4075, 4075, 4075, 4075, 4075, 4075, 3666, 3666,
+ 3666, 3666, 3666, 3666, 3666, 3666, 3666, 3666, 3666, 3666,
+ 4079, 4079, 4079, 4079, 4079, 4079, 4079, 4079, 4079, 4079,
+ 4079, 4079, 3216, 3216, 3216, 3216, 3216, 3216, 3216, 3216,
+ 3216, 3216, 3216, 3216, 3669, 3669, 3669, 3669, 3669, 3669,
+ 3669, 3669, 3669, 3669, 3669, 3669, 3219, 3219, 3219, 3219,
+ 3219, 3219, 3219, 3219, 3219, 3219, 3219, 3219, 3673, 3673,
+ 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3673,
+
+ 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081,
+ 4081, 4081, 2771, 2771, 2771, 2771, 2771, 2771, 2771, 2771,
+ 2771, 2771, 2771, 2771, 3680, 3680, 3680, 3680, 3680, 3680,
+ 3680, 3680, 3680, 3680, 3680, 3680, 3685, 3685, 3685, 3685,
+ 3685, 3685, 3685, 3685, 3685, 3685, 3685, 3685, 4089, 4089,
+ 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4089,
+ 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092,
+ 4092, 4092, 3689, 3689, 3689, 3689, 3689, 3689, 3689, 3689,
+ 3689, 3689, 3689, 3689, 3234, 3234, 3234, 3234, 3234, 3234,
+ 3234, 3234, 3234, 3234, 3234, 3234, 3692, 3692, 3692, 3692,
+
+ 3692, 3692, 3692, 3692, 3692, 3692, 3692, 3692, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696,
+ 3696, 3696, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698,
+ 3698, 3698, 3698, 3698, 4101, 4101, 4101, 4101, 4101, 4101,
+ 4101, 4101, 4101, 4101, 4101, 4101, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 2786, 2786,
+ 2786, 2786, 2786, 2786, 2786, 2786, 2786, 2786, 2786, 2786,
+ 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704,
+ 3704, 3704, 3255, 3255, 3255, 3255, 3255, 3255, 3255, 3255,
+
+ 3255, 3255, 3255, 3255, 3707, 3707, 3707, 3707, 3707, 3707,
+ 3707, 3707, 3707, 3707, 3707, 3707, 4107, 4107, 4107, 4107,
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 3711, 3711,
+ 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711,
+ 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713,
+ 3713, 3713, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112,
+ 4112, 4112, 4112, 4112, 4115, 4115, 4115, 4115, 4115, 4115,
+ 4115, 4115, 4115, 4115, 4115, 4115, 2800, 2800, 2800, 2800,
+ 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 656, 8693,
+ 8693, 8693, 656, 8693, 8693, 656, 3720, 3720, 3720, 3720,
+
+ 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720, 4119, 4119,
+ 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119,
+ 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726,
+ 3726, 3726, 4125, 4125, 4125, 4125, 4125, 4125, 4125, 4125,
+ 4125, 4125, 4125, 4125, 4127, 4127, 4127, 4127, 4127, 4127,
+ 4127, 4127, 4127, 4127, 4127, 4127, 2816, 2816, 2816, 2816,
+ 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 683, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+ 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731,
+ 3731, 3731, 4130, 4130, 4130, 4130, 4130, 4130, 4130, 4130,
+
+ 4130, 4130, 4130, 4130, 3738, 3738, 3738, 3738, 3738, 3738,
+ 3738, 3738, 3738, 3738, 3738, 3738, 4137, 4137, 4137, 4137,
+ 4137, 4137, 4137, 4137, 4137, 4137, 4137, 4137, 4140, 4140,
+ 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140,
+ 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830,
+ 2830, 2830, 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743,
+ 3743, 3743, 3743, 3743, 4144, 4144, 4144, 4144, 4144, 4144,
+ 4144, 4144, 4144, 4144, 4144, 4144, 4147, 4147, 4147, 4147,
+ 4147, 4147, 4147, 4147, 4147, 4147, 4147, 4147, 3751, 3751,
+ 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751,
+
+ 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4155,
+ 4155, 4155, 4157, 4157, 4157, 4157, 4157, 4157, 4157, 4157,
+ 4157, 4157, 4157, 4157, 409, 8693, 8693, 8693, 409, 8693,
+ 8693, 409, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756,
+ 3756, 3756, 3756, 3756, 3757, 3757, 3757, 3757, 3757, 3757,
+ 3757, 3757, 3757, 3757, 3757, 3757, 3761, 3761, 3761, 3761,
+ 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3759, 3759,
+ 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759,
+ 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162,
+ 4162, 4162, 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165,
+
+ 4165, 4165, 4165, 4165, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 3767, 3767, 3767, 3767,
+ 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3339, 3339,
+ 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3339,
+ 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770,
+ 3770, 3770, 2881, 2881, 2881, 2881, 2881, 2881, 2881, 2881,
+ 2881, 2881, 2881, 2881, 3776, 3776, 3776, 3776, 3776, 3776,
+ 3776, 3776, 3776, 3776, 3776, 3776, 4172, 4172, 4172, 4172,
+ 4172, 4172, 4172, 4172, 4172, 4172, 4172, 4172, 3779, 3779,
+ 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779,
+
+ 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177,
+ 4177, 4177, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180,
+ 4180, 4180, 4180, 4180, 3783, 3783, 3783, 3783, 3783, 3783,
+ 3783, 3783, 3783, 3783, 3783, 3783, 4188, 4188, 4188, 4188,
+ 4188, 4188, 4188, 4188, 4188, 4188, 4188, 4188, 4191, 4191,
+ 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191,
+ 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 3788, 3788, 3788, 3788, 3788, 3788, 3788, 3788,
+ 3788, 3788, 3788, 3788, 3791, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 4196, 4196, 4196, 4196,
+
+ 4196, 4196, 4196, 4196, 4196, 4196, 4196, 4196, 3800, 3800,
+ 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800,
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2896, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3805, 3805, 3805, 3805, 3805, 3805,
+ 3805, 3805, 3805, 3805, 3805, 3805, 4207, 4207, 4207, 4207,
+ 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4210, 4210,
+ 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210,
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2902, 2902, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+
+ 2526, 2526, 2526, 2526, 3818, 3818, 3818, 3818, 3818, 3818,
+ 3818, 3818, 3818, 3818, 3818, 3818, 4219, 4219, 4219, 4219,
+ 4219, 4219, 4219, 4219, 4219, 4219, 4219, 4219, 3821, 3821,
+ 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4227, 4227, 4227, 4227, 4227, 4227, 4227, 4227,
+ 4227, 4227, 4227, 4227, 4233, 4233, 4233, 4233, 4233, 4233,
+ 4233, 4233, 4233, 4233, 4233, 4233, 445, 445, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 796, 796,
+ 796, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+
+ 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235,
+ 4235, 4235, 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831,
+ 3831, 3831, 3831, 3831, 3832, 3832, 3832, 3832, 3832, 3832,
+ 3832, 3832, 3832, 3832, 3832, 3832, 3834, 3834, 3834, 3834,
+ 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3835, 3835,
+ 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835,
+ 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241,
+ 4241, 4241, 3837, 3837, 3837, 3837, 3837, 3837, 3837, 3837,
+ 3837, 3837, 3837, 3837, 4242, 4242, 4242, 4242, 4242, 4242,
+ 4242, 4242, 4242, 4242, 4242, 4242, 4244, 4244, 4244, 4244,
+
+ 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, 3414, 3414,
+ 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
+ 3841, 3841, 3841, 3841, 3841, 3841, 3841, 3841, 3841, 3841,
+ 3841, 3841, 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3842,
+ 3842, 3842, 3842, 3842, 3848, 3848, 3848, 3848, 3848, 3848,
+ 3848, 3848, 3848, 3848, 3848, 3848, 3845, 3845, 3845, 3845,
+ 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 4246, 4246,
+ 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246,
+ 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250,
+ 4250, 4250, 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852,
+
+ 3852, 3852, 3852, 3852, 4254, 4254, 4254, 4254, 4254, 4254,
+ 4254, 4254, 4254, 4254, 4254, 4254, 3855, 3855, 3855, 3855,
+ 3855, 3855, 3855, 3855, 3855, 3855, 3855, 3855, 4259, 4259,
+ 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259,
+ 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262,
+ 4262, 4262, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3448, 3448, 3448, 3448, 3865, 3865, 3865, 3865, 3865, 3865,
+ 3865, 3865, 3865, 3865, 3865, 3865, 4274, 4274, 4274, 4274,
+ 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4276, 4276,
+ 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964,
+ 2964, 2964, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573,
+ 2573, 2573, 2573, 2573, 3881, 3881, 3881, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3878, 3878, 3878, 3878,
+ 3878, 3878, 3878, 3878, 3878, 3878, 3878, 3878, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286,
+ 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4290,
+ 4290, 4290, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2984, 2984, 2581, 2581, 2581, 2581, 2581, 2581,
+ 2581, 2581, 2581, 2581, 2581, 2581, 2228, 2228, 2228, 2228,
+
+ 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482,
+ 3482, 3482, 3893, 3893, 3893, 3893, 3893, 3893, 3893, 3893,
+ 3893, 3893, 3893, 3893, 4302, 4302, 4302, 4302, 4302, 4302,
+ 4302, 4302, 4302, 4302, 4302, 4302, 4304, 4304, 4304, 4304,
+ 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 3005, 3005,
+ 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907,
+
+ 3907, 3907, 3907, 3907, 3904, 3904, 3904, 3904, 3904, 3904,
+ 3904, 3904, 3904, 3904, 3904, 3904, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4316, 4316,
+ 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316,
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
+ 3023, 3023, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610,
+ 2610, 2610, 2610, 2610, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 2249, 3917, 3917, 3917, 3917,
+ 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3917, 4326, 4326,
+ 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326,
+
+ 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+ 3920, 3920, 4331, 4331, 4331, 4331, 4331, 4331, 4331, 4331,
+ 4331, 4331, 4331, 4331, 4334, 4334, 4334, 4334, 4334, 4334,
+ 4334, 4334, 4334, 4334, 4334, 4334, 3924, 3924, 3924, 3924,
+ 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924, 4341, 4341,
+ 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341,
+ 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4344,
+ 4344, 4344, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+ 3928, 3928, 3928, 3928, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3515, 3515, 3515, 3515, 3515, 3515, 3931, 3931, 3931, 3931,
+
+ 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 4348, 4348,
+ 4348, 4348, 4348, 4348, 4348, 4348, 4348, 4348, 4348, 4348,
+ 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939,
+ 3939, 3939, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3943, 3943, 3943, 3943, 3943, 3943,
+ 3943, 3943, 3943, 3943, 3943, 3943, 4359, 4359, 4359, 4359,
+ 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4362, 4362,
+ 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362,
+ 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530,
+ 3530, 3530, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
+
+ 3050, 3050, 3050, 3050, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 4233, 4233, 4233, 4233,
+ 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4233, 3959, 3959,
+ 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959,
+ 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373,
+ 4373, 4373, 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962,
+ 3962, 3962, 3962, 3962, 4378, 4378, 4378, 4378, 4378, 4378,
+ 4378, 4378, 4378, 4378, 4378, 4378, 4381, 4381, 4381, 4381,
+ 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 3966, 3966,
+ 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966,
+
+ 4387, 4387, 4387, 4387, 4387, 4387, 4387, 4387, 4387, 4387,
+ 4387, 4387, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 3556, 3556, 3556, 3556, 3556, 3556,
+ 3556, 3556, 3556, 3556, 3556, 3556, 3069, 3069, 3069, 3069,
+ 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 2648, 2648,
+ 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
+ 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3977, 3977, 3977, 3977, 3977, 3977, 3977, 3977,
+ 3977, 3977, 3977, 3977, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 4397, 4397, 4397, 4401, 4401, 4401, 4401,
+
+ 4401, 4401, 4401, 4401, 4401, 4401, 4401, 4401, 3084, 3084,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
+ 2653, 2653, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 2280, 2280, 2280, 3991, 3991, 3991, 3991, 3991, 3991,
+ 3991, 3991, 3991, 3991, 3991, 3991, 4413, 4413, 4413, 4413,
+ 4413, 4413, 4413, 4413, 4413, 4413, 4413, 4413, 4415, 4415,
+ 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415,
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585,
+ 3585, 3585, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+
+ 3104, 3104, 3104, 3104, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4002, 4002,
+ 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002,
+ 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423,
+ 4423, 4423, 4427, 4427, 4427, 4427, 4427, 4427, 4427, 4427,
+ 4427, 4427, 4427, 4427, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016,
+ 4016, 4016, 4016, 4016, 1381, 1381, 8693, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 4018, 4018, 4018, 4018,
+ 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4438, 4438,
+ 4438, 4438, 4438, 4438, 4438, 4438, 4438, 4438, 4438, 4438,
+ 4440, 4440, 4440, 4440, 4440, 4440, 4440, 4440, 4440, 4440,
+ 4440, 4440, 4026, 4026, 4026, 4026, 4026, 4026, 4026, 4026,
+ 4026, 4026, 4026, 4026, 4024, 4024, 4024, 4024, 4024, 4024,
+ 4024, 4024, 4024, 4024, 4024, 4024, 4445, 4445, 4445, 4445,
+
+ 4445, 4445, 4445, 4445, 4445, 4445, 4445, 4445, 4448, 4448,
+ 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 4029, 4029, 4029, 4029, 4029, 4029, 4029, 4029,
+ 4029, 4029, 4029, 4029, 4452, 4452, 4452, 4452, 4452, 4452,
+ 4452, 4452, 4452, 4452, 4452, 4452, 4455, 4455, 4455, 4455,
+ 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4039, 4039,
+ 4039, 4039, 4039, 4039, 4039, 4039, 4039, 4039, 4039, 4039,
+ 4036, 4036, 4036, 4036, 4036, 4036, 4036, 4036, 4036, 4036,
+ 4036, 4036, 4460, 4460, 4460, 4460, 4460, 4460, 4460, 4460,
+
+ 4460, 4460, 4460, 4460, 4464, 4464, 4464, 4464, 4464, 4464,
+ 4464, 4464, 4464, 4464, 4464, 4464, 4044, 4044, 4044, 4044,
+ 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4470, 4470,
+ 4470, 4470, 4470, 4470, 4470, 4470, 4470, 4470, 4470, 4470,
+ 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473,
+ 4473, 4473, 4047, 4047, 4047, 4047, 4047, 4047, 4047, 4047,
+ 4047, 4047, 4047, 4047, 4477, 4477, 4477, 4477, 4477, 4477,
+ 4477, 4477, 4477, 4477, 4477, 4477, 3644, 3644, 3644, 3644,
+ 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 4052, 4052,
+ 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052,
+
+ 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481,
+ 4481, 4481, 4485, 4485, 4485, 4485, 4485, 4485, 4485, 4485,
+ 4485, 4485, 4485, 4485, 4056, 4056, 4056, 4056, 4056, 4056,
+ 4056, 4056, 4056, 4056, 4056, 4056, 4490, 4490, 4490, 4490,
+ 4490, 4490, 4490, 4490, 4490, 4490, 4490, 4490, 3651, 3651,
+ 3651, 3651, 3651, 3651, 3651, 3651, 3651, 3651, 3651, 3651,
+ 4061, 4061, 4061, 4061, 4061, 4061, 4061, 4061, 4061, 4061,
+ 4061, 4061, 4493, 4493, 4493, 4493, 4493, 4493, 4493, 4493,
+ 4493, 4493, 4493, 4493, 4064, 4064, 4064, 4064, 4064, 4064,
+ 4064, 4064, 4064, 4064, 4064, 4064, 4498, 4498, 4498, 4498,
+
+ 4498, 4498, 4498, 4498, 4498, 4498, 4498, 4498, 4501, 4501,
+ 4501, 4501, 4501, 4501, 4501, 4501, 4501, 4501, 4501, 4501,
+ 4068, 4068, 4068, 4068, 4068, 4068, 4068, 4068, 4068, 4068,
+ 4068, 4068, 4506, 4506, 4506, 4506, 4506, 4506, 4506, 4506,
+ 4506, 4506, 4506, 4506, 4509, 4509, 4509, 4509, 4509, 4509,
+ 4509, 4509, 4509, 4509, 4509, 4509, 4072, 4072, 4072, 4072,
+ 4072, 4072, 4072, 4072, 4072, 4072, 4072, 4072, 3662, 3662,
+ 3662, 3662, 3662, 3662, 3662, 3662, 3662, 3662, 3662, 3662,
+ 4075, 4075, 4075, 4075, 4075, 4075, 4075, 4075, 4075, 4075,
+ 4075, 4075, 4513, 4513, 4513, 4513, 4513, 4513, 4513, 4513,
+
+ 4513, 4513, 4513, 4513, 4079, 4079, 4079, 4079, 4079, 4079,
+ 4079, 4079, 4079, 4079, 4079, 4079, 4081, 4081, 4081, 4081,
+ 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4518, 4518,
+ 4518, 4518, 4518, 4518, 4518, 4518, 4518, 4518, 4518, 4518,
+ 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521,
+ 4521, 4521, 3219, 3219, 3219, 3219, 3219, 3219, 3219, 3219,
+ 3219, 3219, 3219, 3219, 4089, 4089, 4089, 4089, 4089, 4089,
+ 4089, 4089, 4089, 4089, 4089, 4089, 4525, 4525, 4525, 4525,
+ 4525, 4525, 4525, 4525, 4525, 4525, 4525, 4525, 4092, 4092,
+ 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092,
+
+ 4530, 4530, 4530, 4530, 4530, 4530, 4530, 4530, 4530, 4530,
+ 4530, 4530, 4533, 4533, 4533, 4533, 4533, 4533, 4533, 4533,
+ 4533, 4533, 4533, 4533, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4537, 4537, 4537, 4537,
+ 4537, 4537, 4537, 4537, 4537, 4537, 4537, 4537, 4539, 4539,
+ 4539, 4539, 4539, 4539, 4539, 4539, 4539, 4539, 4539, 4539,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4101, 4101, 4101, 4101, 4101, 4101, 4101, 4101,
+ 4101, 4101, 4101, 4101, 4541, 4541, 4541, 4541, 4541, 4541,
+ 4541, 4541, 4541, 4541, 4541, 4541, 4545, 4545, 4545, 4545,
+
+ 4545, 4545, 4545, 4545, 4545, 4545, 4545, 4545, 4107, 4107,
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ 4549, 4549, 4549, 4549, 4549, 4549, 4549, 4549, 4549, 4549,
+ 4549, 4549, 4551, 4551, 4551, 4551, 4551, 4551, 4551, 4551,
+ 4551, 4551, 4551, 4551, 4115, 4115, 4115, 4115, 4115, 4115,
+ 4115, 4115, 4115, 4115, 4115, 4115, 4112, 4112, 4112, 4112,
+ 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4553, 4553,
+ 4553, 4553, 4553, 4553, 4553, 4553, 4553, 4553, 4553, 4553,
+ 4557, 4557, 4557, 4557, 4557, 4557, 4557, 4557, 4557, 4557,
+ 4557, 4557, 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119,
+
+ 4119, 4119, 4119, 4119, 4562, 4562, 4562, 4562, 4562, 4562,
+ 4562, 4562, 4562, 4562, 4562, 4562, 4564, 4564, 4564, 4564,
+ 4564, 4564, 4564, 4564, 4564, 4564, 4564, 4564, 656, 8693,
+ 8693, 8693, 656, 8693, 8693, 656, 4127, 4127, 4127, 4127,
+ 4127, 4127, 4127, 4127, 4127, 4127, 4127, 4127, 4125, 4125,
+ 4125, 4125, 4125, 4125, 4125, 4125, 4125, 4125, 4125, 4125,
+ 4567, 4567, 4567, 4567, 4567, 4567, 4567, 4567, 4567, 4567,
+ 4567, 4567, 4570, 4570, 4570, 4570, 4570, 4570, 4570, 4570,
+ 4570, 4570, 4570, 4570, 4130, 4130, 4130, 4130, 4130, 4130,
+ 4130, 4130, 4130, 4130, 4130, 4130, 4574, 4574, 4574, 4574,
+
+ 4574, 4574, 4574, 4574, 4574, 4574, 4574, 4574, 4577, 4577,
+ 4577, 4577, 4577, 4577, 4577, 4577, 4577, 4577, 4577, 4577,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+ 683, 683, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140,
+ 4140, 4140, 4140, 4140, 4137, 4137, 4137, 4137, 4137, 4137,
+ 4137, 4137, 4137, 4137, 4137, 4137, 4581, 4581, 4581, 4581,
+ 4581, 4581, 4581, 4581, 4581, 4581, 4581, 4581, 4585, 4585,
+ 4585, 4585, 4585, 4585, 4585, 4585, 4585, 4585, 4585, 4585,
+ 4144, 4144, 4144, 4144, 4144, 4144, 4144, 4144, 4144, 4144,
+ 4144, 4144, 4589, 4589, 4589, 4589, 4589, 4589, 4589, 4589,
+
+ 4589, 4589, 4589, 4589, 4147, 4147, 4147, 4147, 4147, 4147,
+ 4147, 4147, 4147, 4147, 4147, 4147, 4594, 4594, 4594, 4594,
+ 4594, 4594, 4594, 4594, 4594, 4594, 4594, 4594, 4597, 4597,
+ 4597, 4597, 4597, 4597, 4597, 4597, 4597, 4597, 4597, 4597,
+ 4157, 4157, 4157, 4157, 4157, 4157, 4157, 4157, 4157, 4157,
+ 4157, 4157, 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4155,
+ 4155, 4155, 4155, 4155, 4603, 4603, 4603, 4603, 4603, 4603,
+ 4603, 4603, 4603, 4603, 4603, 4603, 4608, 4608, 4608, 4608,
+ 4608, 4608, 4608, 4608, 4608, 4608, 4608, 4608, 4609, 4609,
+ 4609, 4609, 4609, 4609, 4609, 4609, 4609, 4609, 4609, 4609,
+
+ 409, 8693, 8693, 8693, 409, 8693, 8693, 409, 4162, 4162,
+ 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162,
+ 4614, 4614, 4614, 4614, 4614, 4614, 4614, 4614, 4614, 4614,
+ 4614, 4614, 2856, 2856, 2856, 2856, 2856, 2856, 2856, 2856,
+ 2856, 2856, 2856, 2856, 4165, 4165, 4165, 4165, 4165, 4165,
+ 4165, 4165, 4165, 4165, 4165, 4165, 4618, 4618, 4618, 4618,
+ 4618, 4618, 4618, 4618, 4618, 4618, 4618, 4618, 3761, 3761,
+ 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 4172, 4172, 4172, 4172, 4172, 4172, 4172, 4172,
+
+ 4172, 4172, 4172, 4172, 4625, 4625, 4625, 4625, 4625, 4625,
+ 4625, 4625, 4625, 4625, 4625, 4625, 4627, 4627, 4627, 4627,
+ 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4180, 4180,
+ 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180,
+ 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177,
+ 4177, 4177, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633,
+ 4633, 4633, 4633, 4633, 4642, 4642, 4642, 4642, 4642, 4642,
+ 4642, 4642, 4642, 4642, 4642, 4642, 4188, 4188, 4188, 4188,
+ 4188, 4188, 4188, 4188, 4188, 4188, 4188, 4188, 4648, 4648,
+ 4648, 4648, 4648, 4648, 4648, 4648, 4648, 4648, 4648, 4648,
+
+ 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191,
+ 4191, 4191, 4653, 4653, 4653, 4653, 4653, 4653, 4653, 4653,
+ 4653, 4653, 4653, 4653, 4656, 4656, 4656, 4656, 4656, 4656,
+ 4656, 4656, 4656, 4656, 4656, 4656, 3791, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 4196, 4196,
+ 4196, 4196, 4196, 4196, 4196, 4196, 4196, 4196, 4196, 4196,
+ 4663, 4663, 4663, 4663, 4663, 4663, 4663, 4663, 4663, 4663,
+ 4663, 4663, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 3364, 3364, 3364, 3364, 2896, 2896, 2896, 2896,
+
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 4210, 4210,
+ 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210,
+ 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207,
+ 4207, 4207, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673,
+ 4673, 4673, 4673, 4673, 4677, 4677, 4677, 4677, 4677, 4677,
+ 4677, 4677, 4677, 4677, 4677, 4677, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 2902, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2526, 2526, 4219, 4219, 4219, 4219, 4219, 4219, 4219, 4219,
+
+ 4219, 4219, 4219, 4219, 4687, 4687, 4687, 4687, 4687, 4687,
+ 4687, 4687, 4687, 4687, 4687, 4687, 4689, 4689, 4689, 4689,
+ 4689, 4689, 4689, 4689, 4689, 4689, 4689, 4689, 4227, 4227,
+ 4227, 4227, 4227, 4227, 4227, 4227, 4227, 4227, 4227, 4227,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4693, 4693, 4693, 4693, 4693, 4693, 4693, 4693,
+ 4693, 4693, 4693, 4693, 4699, 4699, 4699, 4699, 4699, 4699,
+ 4699, 4699, 4699, 4699, 4699, 4699, 4700, 4700, 4700, 4700,
+ 4700, 4700, 4700, 4700, 4700, 4700, 4700, 4700, 4708, 4708,
+ 4708, 4708, 4708, 4708, 4708, 4708, 4708, 4708, 4708, 4708,
+
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 445, 445, 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235,
+ 4235, 4235, 4235, 4235, 4710, 4710, 4710, 4710, 4710, 4710,
+ 4710, 4710, 4710, 4710, 4710, 4710, 4713, 4713, 4713, 4713,
+ 4713, 4713, 4713, 4713, 4713, 4713, 4713, 4713, 4240, 4240,
+ 4240, 4240, 4240, 4240, 4240, 4240, 4240, 4240, 4240, 4240,
+ 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241,
+ 4241, 4241, 4242, 4242, 4242, 4242, 4242, 4242, 4242, 4242,
+ 4242, 4242, 4242, 4242, 4718, 4718, 4718, 4718, 4718, 4718,
+ 4718, 4718, 4718, 4718, 4718, 4718, 4244, 4244, 4244, 4244,
+
+ 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4721, 4721,
+ 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4721,
+ 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246,
+ 4246, 4246, 4724, 4724, 4724, 4724, 4724, 4724, 4724, 4724,
+ 4724, 4724, 4724, 4724, 2944, 2944, 2944, 2944, 2944, 2944,
+ 2944, 2944, 2944, 2944, 2944, 2944, 4250, 4250, 4250, 4250,
+ 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4730, 4730,
+ 4730, 4730, 4730, 4730, 4730, 4730, 4730, 4730, 4730, 4730,
+ 3848, 3848, 3848, 3848, 3848, 3848, 3848, 3848, 3848, 3848,
+ 3848, 3848, 4254, 4254, 4254, 4254, 4254, 4254, 4254, 4254,
+
+ 4254, 4254, 4254, 4254, 4735, 4735, 4735, 4735, 4735, 4735,
+ 4735, 4735, 4735, 4735, 4735, 4735, 4737, 4737, 4737, 4737,
+ 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4262, 4262,
+ 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262,
+ 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259,
+ 4259, 4259, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743,
+ 4743, 4743, 4743, 4743, 4752, 4752, 4752, 4752, 4752, 4752,
+ 4752, 4752, 4752, 4752, 4752, 4752, 4274, 4274, 4274, 4274,
+ 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4763, 4763,
+ 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+
+ 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4766, 4766, 4766, 4766, 4766, 4766, 4766, 4766,
+ 4766, 4766, 4766, 4766, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3448, 3448, 3448, 3448, 3448, 3448, 2964, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2573, 2573,
+ 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573,
+ 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286,
+ 4286, 4286, 4777, 4777, 4777, 4777, 4777, 4777, 4777, 4777,
+ 4777, 4777, 4777, 4777, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2984, 2984, 2984, 2984, 4290, 4290, 4290, 4290,
+
+ 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4783, 4783,
+ 4783, 4783, 4783, 4783, 4783, 4783, 4783, 4783, 4783, 4783,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881,
+ 3881, 3881, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
+ 2581, 2581, 2581, 2581, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2228, 445, 445, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 4302, 4302,
+ 4302, 4302, 4302, 4302, 4302, 4302, 4302, 4302, 4302, 4302,
+ 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797,
+ 4797, 4797, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304,
+
+ 4304, 4304, 4304, 4304, 4800, 4800, 4800, 4800, 4800, 4800,
+ 4800, 4800, 4800, 4800, 4800, 4800, 3482, 3482, 3482, 3482,
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3005, 3005,
+ 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4809, 4809, 4809, 4809, 4809, 4809,
+ 4809, 4809, 4809, 4809, 4809, 4809, 3023, 3023, 3023, 3023,
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 4316, 4316,
+ 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316,
+
+ 4815, 4815, 4815, 4815, 4815, 4815, 4815, 4815, 4815, 4815,
+ 4815, 4815, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907,
+ 3907, 3907, 3907, 3907, 2610, 2610, 2610, 2610, 2610, 2610,
+ 2610, 2610, 2610, 2610, 2610, 2610, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 4326, 4326,
+ 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326,
+ 4828, 4828, 4828, 4828, 4828, 4828, 4828, 4828, 4828, 4828,
+ 4828, 4828, 4830, 4830, 4830, 4830, 4830, 4830, 4830, 4830,
+ 4830, 4830, 4830, 4830, 4334, 4334, 4334, 4334, 4334, 4334,
+ 4334, 4334, 4334, 4334, 4334, 4334, 4331, 4331, 4331, 4331,
+
+ 4331, 4331, 4331, 4331, 4331, 4331, 4331, 4331, 4835, 4835,
+ 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835,
+ 4842, 4842, 4842, 4842, 4842, 4842, 4842, 4842, 4842, 4842,
+ 4842, 4842, 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341,
+ 4341, 4341, 4341, 4341, 4848, 4848, 4848, 4848, 4848, 4848,
+ 4848, 4848, 4848, 4848, 4848, 4848, 4344, 4344, 4344, 4344,
+ 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4853, 4853,
+ 4853, 4853, 4853, 4853, 4853, 4853, 4853, 4853, 4853, 4853,
+ 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856,
+ 4856, 4856, 4348, 4348, 4348, 4348, 4348, 4348, 4348, 4348,
+
+ 4348, 4348, 4348, 4348, 4862, 4862, 4862, 4862, 4862, 4862,
+ 4862, 4862, 4862, 4862, 4862, 4862, 4864, 4864, 4864, 4864,
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 3931, 3931,
+ 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931,
+ 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3515, 3515, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 4362, 4362, 4362, 4362, 4362, 4362,
+ 4362, 4362, 4362, 4362, 4362, 4362, 4359, 4359, 4359, 4359,
+ 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4872, 4872,
+ 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872,
+
+ 4876, 4876, 4876, 4876, 4876, 4876, 4876, 4876, 4876, 4876,
+ 4876, 4876, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530,
+ 3530, 3530, 3530, 3530, 3050, 3050, 3050, 3050, 3050, 3050,
+ 3050, 3050, 3050, 3050, 3050, 3050, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 4373, 4373,
+ 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373,
+ 4887, 4887, 4887, 4887, 4887, 4887, 4887, 4887, 4887, 4887,
+ 4887, 4887, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889,
+ 4889, 4889, 4889, 4889, 4381, 4381, 4381, 4381, 4381, 4381,
+ 4381, 4381, 4381, 4381, 4381, 4381, 4378, 4378, 4378, 4378,
+
+ 4378, 4378, 4378, 4378, 4378, 4378, 4378, 4378, 4894, 4894,
+ 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894,
+ 4901, 4901, 4901, 4901, 4901, 4901, 4901, 4901, 4901, 4901,
+ 4901, 4901, 4387, 4387, 4387, 4387, 4387, 4387, 4387, 4387,
+ 4387, 4387, 4387, 4387, 4907, 4907, 4907, 4907, 4907, 4907,
+ 4907, 4907, 4907, 4907, 4907, 4907, 4389, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4910, 4910,
+ 4910, 4910, 4910, 4910, 4910, 4910, 4910, 4910, 4910, 4910,
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556,
+ 3556, 3556, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069,
+
+ 3069, 3069, 3069, 3069, 2648, 2648, 2648, 2648, 2648, 2648,
+ 2648, 2648, 2648, 2648, 2648, 2648, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4919, 4919,
+ 4919, 4919, 4919, 4919, 4919, 4919, 4919, 4919, 4919, 4919,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084,
+ 3084, 3084, 4401, 4401, 4401, 4401, 4401, 4401, 4401, 4401,
+ 4401, 4401, 4401, 4401, 4925, 4925, 4925, 4925, 4925, 4925,
+ 4925, 4925, 4925, 4925, 4925, 4925, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
+
+ 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 2280, 4413, 4413, 4413, 4413, 4413, 4413, 4413, 4413,
+ 4413, 4413, 4413, 4413, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4938, 4938, 4938, 4938, 4938, 4415, 4415, 4415, 4415,
+ 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4941, 4941,
+ 4941, 4941, 4941, 4941, 4941, 4941, 4941, 4941, 4941, 4941,
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585,
+ 3585, 3585, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 4423, 4423, 4423, 4423,
+
+ 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4950, 4950,
+ 4950, 4950, 4950, 4950, 4950, 4950, 4950, 4950, 4950, 4950,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 4427, 4427, 4427, 4427, 4427, 4427, 4427, 4427,
+ 4427, 4427, 4427, 4427, 4956, 4956, 4956, 4956, 4956, 4956,
+ 4956, 4956, 4956, 4956, 4956, 4956, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 4440, 4440, 4440, 4440, 4440, 4440, 4440, 4440,
+
+ 4440, 4440, 4440, 4440, 4438, 4438, 4438, 4438, 4438, 4438,
+ 4438, 4438, 4438, 4438, 4438, 4438, 4968, 4968, 4968, 4968,
+ 4968, 4968, 4968, 4968, 4968, 4968, 4968, 4968, 4441, 4441,
+ 4441, 4441, 4441, 4441, 4441, 4441, 4441, 4441, 4441, 4441,
+ 4973, 4973, 4973, 4973, 4973, 4973, 4973, 4973, 4973, 4973,
+ 4973, 4973, 1381, 1381, 8693, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 4445, 4445, 4445, 4445, 4445, 4445,
+ 4445, 4445, 4445, 4445, 4445, 4445, 4977, 4977, 4977, 4977,
+ 4977, 4977, 4977, 4977, 4977, 4977, 4977, 4977, 3154, 3154,
+ 3154, 3154, 3154, 3154, 3154, 3154, 3154, 3154, 3154, 3154,
+
+ 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448,
+ 4448, 4448, 4981, 4981, 4981, 4981, 4981, 4981, 4981, 4981,
+ 4981, 4981, 4981, 4981, 4983, 4983, 4983, 4983, 4983, 4983,
+ 4983, 4983, 4983, 4983, 4983, 4983, 4455, 4455, 4455, 4455,
+ 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4452, 4452,
+ 4452, 4452, 4452, 4452, 4452, 4452, 4452, 4452, 4452, 4452,
+ 4985, 4985, 4985, 4985, 4985, 4985, 4985, 4985, 4985, 4985,
+ 4985, 4985, 4989, 4989, 4989, 4989, 4989, 4989, 4989, 4989,
+ 4989, 4989, 4989, 4989, 4991, 4991, 4991, 4991, 4991, 4991,
+ 4991, 4991, 4991, 4991, 4991, 4991, 1398, 1398, 1398, 1398,
+
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 4460, 4460, 4460, 4460, 4460, 4460, 4460, 4460, 4460, 4460,
+ 4460, 4460, 4996, 4996, 4996, 4996, 4996, 4996, 4996, 4996,
+ 4996, 4996, 4996, 4996, 3176, 3176, 3176, 3176, 3176, 3176,
+ 3176, 3176, 3176, 3176, 3176, 3176, 4464, 4464, 4464, 4464,
+ 4464, 4464, 4464, 4464, 4464, 4464, 4464, 4464, 5001, 5001,
+ 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5001,
+ 5004, 5004, 5004, 5004, 5004, 5004, 5004, 5004, 5004, 5004,
+ 5004, 5004, 5006, 5006, 8693, 5006, 5006, 5006, 5006, 5006,
+
+ 5006, 5006, 5006, 5006, 4470, 4470, 4470, 4470, 4470, 4470,
+ 4470, 4470, 4470, 4470, 4470, 4470, 4044, 4044, 4044, 4044,
+ 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4473, 4473,
+ 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473,
+ 5008, 5008, 5008, 5008, 5008, 5008, 5008, 5008, 5008, 5008,
+ 5008, 5008, 3644, 3644, 3644, 3644, 3644, 3644, 3644, 3644,
+ 3644, 3644, 3644, 3644, 4477, 4477, 4477, 4477, 4477, 4477,
+ 4477, 4477, 4477, 4477, 4477, 4477, 5012, 5012, 5012, 5012,
+ 5012, 5012, 5012, 5012, 5012, 5012, 5012, 5012, 4481, 4481,
+ 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481,
+
+ 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052, 4052,
+ 4052, 4052, 4485, 4485, 4485, 4485, 4485, 4485, 4485, 4485,
+ 4485, 4485, 4485, 4485, 5014, 5014, 5014, 5014, 5014, 5014,
+ 5014, 5014, 5014, 5014, 5014, 5014, 3651, 3651, 3651, 3651,
+ 3651, 3651, 3651, 3651, 3651, 3651, 3651, 3651, 4490, 4490,
+ 4490, 4490, 4490, 4490, 4490, 4490, 4490, 4490, 4490, 4490,
+ 4493, 4493, 4493, 4493, 4493, 4493, 4493, 4493, 4493, 4493,
+ 4493, 4493, 5019, 5019, 5019, 5019, 5019, 5019, 5019, 5019,
+ 5019, 5019, 5019, 5019, 5021, 5021, 5021, 5021, 5021, 5021,
+ 5021, 5021, 5021, 5021, 5021, 5021, 4501, 4501, 4501, 4501,
+
+ 4501, 4501, 4501, 4501, 4501, 4501, 4501, 4501, 4498, 4498,
+ 4498, 4498, 4498, 4498, 4498, 4498, 4498, 4498, 4498, 4498,
+ 5024, 5024, 5024, 5024, 5024, 5024, 5024, 5024, 5024, 5024,
+ 5024, 5024, 5029, 5029, 5029, 5029, 5029, 5029, 5029, 5029,
+ 5029, 5029, 5029, 5029, 4506, 4506, 4506, 4506, 4506, 4506,
+ 4506, 4506, 4506, 4506, 4506, 4506, 5033, 5033, 5033, 5033,
+ 5033, 5033, 5033, 5033, 5033, 5033, 5033, 5033, 4509, 4509,
+ 4509, 4509, 4509, 4509, 4509, 4509, 4509, 4509, 4509, 4509,
+ 5038, 5038, 5038, 5038, 5038, 5038, 5038, 5038, 5038, 5038,
+ 5038, 5038, 5041, 5041, 5041, 5041, 5041, 5041, 5041, 5041,
+
+ 5041, 5041, 5041, 5041, 4513, 4513, 4513, 4513, 4513, 4513,
+ 4513, 4513, 4513, 4513, 4513, 4513, 5045, 5045, 5045, 5045,
+ 5045, 5045, 5045, 5045, 5045, 5045, 5045, 5045, 5047, 5047,
+ 5047, 5047, 5047, 5047, 5047, 5047, 5047, 5047, 5047, 5047,
+ 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521,
+ 4521, 4521, 4518, 4518, 4518, 4518, 4518, 4518, 4518, 4518,
+ 4518, 4518, 4518, 4518, 5049, 5049, 5049, 5049, 5049, 5049,
+ 5049, 5049, 5049, 5049, 5049, 5049, 5053, 5053, 5053, 5053,
+ 5053, 5053, 5053, 5053, 5053, 5053, 5053, 5053, 4525, 4525,
+ 4525, 4525, 4525, 4525, 4525, 4525, 4525, 4525, 4525, 4525,
+
+ 5058, 5058, 5058, 5058, 5058, 5058, 5058, 5058, 5058, 5058,
+ 5058, 5058, 5060, 5060, 5060, 5060, 5060, 5060, 5060, 5060,
+ 5060, 5060, 5060, 5060, 4533, 4533, 4533, 4533, 4533, 4533,
+ 4533, 4533, 4533, 4533, 4533, 4533, 4530, 4530, 4530, 4530,
+ 4530, 4530, 4530, 4530, 4530, 4530, 4530, 4530, 5063, 5063,
+ 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5063,
+ 5068, 5068, 5068, 5068, 5068, 5068, 5068, 5068, 5068, 5068,
+ 5068, 5068, 4537, 4537, 4537, 4537, 4537, 4537, 4537, 4537,
+ 4537, 4537, 4537, 4537, 5072, 5072, 5072, 5072, 5072, 5072,
+ 5072, 5072, 5072, 5072, 5072, 5072, 4539, 4539, 4539, 4539,
+
+ 4539, 4539, 4539, 4539, 4539, 4539, 4539, 4539, 5075, 5075,
+ 5075, 5075, 5075, 5075, 5075, 5075, 5075, 5075, 5075, 5075,
+ 4541, 4541, 4541, 4541, 4541, 4541, 4541, 4541, 4541, 4541,
+ 4541, 4541, 5078, 5078, 5078, 5078, 5078, 5078, 5078, 5078,
+ 5078, 5078, 5078, 5078, 3245, 3245, 3245, 3245, 3245, 3245,
+ 3245, 3245, 3245, 3245, 3245, 3245, 4545, 4545, 4545, 4545,
+ 4545, 4545, 4545, 4545, 4545, 4545, 4545, 4545, 5084, 5084,
+ 5084, 5084, 5084, 5084, 5084, 5084, 5084, 5084, 5084, 5084,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+ 4104, 4104, 4549, 4549, 4549, 4549, 4549, 4549, 4549, 4549,
+
+ 4549, 4549, 4549, 4549, 5088, 5088, 5088, 5088, 5088, 5088,
+ 5088, 5088, 5088, 5088, 5088, 5088, 4551, 4551, 4551, 4551,
+ 4551, 4551, 4551, 4551, 4551, 4551, 4551, 4551, 5091, 5091,
+ 5091, 5091, 5091, 5091, 5091, 5091, 5091, 5091, 5091, 5091,
+ 4553, 4553, 4553, 4553, 4553, 4553, 4553, 4553, 4553, 4553,
+ 4553, 4553, 5094, 5094, 5094, 5094, 5094, 5094, 5094, 5094,
+ 5094, 5094, 5094, 5094, 3266, 3266, 3266, 3266, 3266, 3266,
+ 3266, 3266, 3266, 3266, 3266, 3266, 4557, 4557, 4557, 4557,
+ 4557, 4557, 4557, 4557, 4557, 4557, 4557, 4557, 5100, 5100,
+ 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100,
+
+ 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115,
+ 4115, 4115, 4564, 4564, 4564, 4564, 4564, 4564, 4564, 4564,
+ 4564, 4564, 4564, 4564, 4562, 4562, 4562, 4562, 4562, 4562,
+ 4562, 4562, 4562, 4562, 4562, 4562, 5104, 5104, 5104, 5104,
+ 5104, 5104, 5104, 5104, 5104, 5104, 5104, 5104, 5107, 5107,
+ 5107, 5107, 5107, 5107, 5107, 5107, 5107, 5107, 5107, 5107,
+ 656, 8693, 8693, 8693, 656, 8693, 8693, 656, 4567, 4567,
+ 4567, 4567, 4567, 4567, 4567, 4567, 4567, 4567, 4567, 4567,
+ 5111, 5111, 5111, 5111, 5111, 5111, 5111, 5111, 5111, 5111,
+ 5111, 5111, 3287, 3287, 3287, 3287, 3287, 3287, 3287, 3287,
+
+ 3287, 3287, 3287, 3287, 4570, 4570, 4570, 4570, 4570, 4570,
+ 4570, 4570, 4570, 4570, 4570, 4570, 5115, 5115, 5115, 5115,
+ 5115, 5115, 5115, 5115, 5115, 5115, 5115, 5115, 4127, 4127,
+ 4127, 4127, 4127, 4127, 4127, 4127, 4127, 4127, 4127, 4127,
+ 4577, 4577, 4577, 4577, 4577, 4577, 4577, 4577, 4577, 4577,
+ 4577, 4577, 4574, 4574, 4574, 4574, 4574, 4574, 4574, 4574,
+ 4574, 4574, 4574, 4574, 5117, 5117, 5117, 5117, 5117, 5117,
+ 5117, 5117, 5117, 5117, 5117, 5117, 5121, 5121, 5121, 5121,
+ 5121, 5121, 5121, 5121, 5121, 5121, 5121, 5121, 683, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+
+ 4581, 4581, 4581, 4581, 4581, 4581, 4581, 4581, 4581, 4581,
+ 4581, 4581, 5126, 5126, 5126, 5126, 5126, 5126, 5126, 5126,
+ 5126, 5126, 5126, 5126, 3306, 3306, 3306, 3306, 3306, 3306,
+ 3306, 3306, 3306, 3306, 3306, 3306, 4585, 4585, 4585, 4585,
+ 4585, 4585, 4585, 4585, 4585, 4585, 4585, 4585, 5131, 5131,
+ 5131, 5131, 5131, 5131, 5131, 5131, 5131, 5131, 5131, 5131,
+ 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140,
+ 4140, 4140, 4589, 4589, 4589, 4589, 4589, 4589, 4589, 4589,
+ 4589, 4589, 4589, 4589, 5134, 5134, 5134, 5134, 5134, 5134,
+ 5134, 5134, 5134, 5134, 5134, 5134, 5136, 5136, 5136, 5136,
+
+ 5136, 5136, 5136, 5136, 5136, 5136, 5136, 5136, 4597, 4597,
+ 4597, 4597, 4597, 4597, 4597, 4597, 4597, 4597, 4597, 4597,
+ 4594, 4594, 4594, 4594, 4594, 4594, 4594, 4594, 4594, 4594,
+ 4594, 4594, 5138, 5138, 5138, 5138, 5138, 5138, 5138, 5138,
+ 5138, 5138, 5138, 5138, 5142, 5142, 5142, 5142, 5142, 5142,
+ 5142, 5142, 5142, 5142, 5142, 5142, 5147, 5147, 5147, 5147,
+ 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 4603, 4603, 4603, 4603, 4603, 4603, 4603, 4603, 4603, 4603,
+ 4603, 4603, 5149, 5149, 5149, 5149, 5149, 5149, 5149, 5149,
+
+ 5149, 5149, 5149, 5149, 5150, 5150, 5150, 5150, 5150, 5150,
+ 5150, 5150, 5150, 5150, 5150, 5150, 5153, 5153, 5153, 5153,
+ 5153, 5153, 5153, 5153, 5153, 5153, 5153, 5153, 5160, 5160,
+ 5160, 5160, 5160, 5160, 5160, 5160, 5160, 5160, 5160, 5160,
+ 4609, 4609, 4609, 4609, 4609, 4609, 4609, 4609, 4609, 4609,
+ 4609, 4609, 5162, 5162, 5162, 5162, 5162, 5162, 5162, 5162,
+ 5162, 5162, 5162, 5162, 4157, 4157, 4157, 4157, 4157, 4157,
+ 4157, 4157, 4157, 4157, 4157, 4157, 409, 8693, 8693, 8693,
+ 409, 8693, 8693, 409, 4614, 4614, 4614, 4614, 4614, 4614,
+ 4614, 4614, 4614, 4614, 4614, 4614, 4162, 4162, 4162, 4162,
+
+ 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 3761, 3761,
+ 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761,
+ 4618, 4618, 4618, 4618, 4618, 4618, 4618, 4618, 4618, 4618,
+ 4618, 4618, 5168, 5168, 5168, 5168, 5168, 5168, 5168, 5168,
+ 5168, 5168, 5168, 5168, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 4625, 4625, 4625, 4625,
+ 4625, 4625, 4625, 4625, 4625, 4625, 4625, 4625, 5172, 5172,
+ 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172,
+ 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627,
+ 4627, 4627, 5180, 5180, 5180, 5180, 5180, 5180, 5180, 5180,
+
+ 5180, 5180, 5180, 5180, 4633, 4633, 4633, 4633, 4633, 4633,
+ 4633, 4633, 4633, 4633, 4633, 4633, 5186, 5186, 5186, 5186,
+ 5186, 5186, 5186, 5186, 5186, 5186, 5186, 5186, 5190, 5190,
+ 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190,
+ 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180,
+ 4180, 4180, 4642, 4642, 4642, 4642, 4642, 4642, 4642, 4642,
+ 4642, 4642, 4642, 4642, 5202, 5202, 5202, 5202, 5202, 5202,
+ 5202, 5202, 5202, 5202, 5202, 5202, 4648, 4648, 4648, 4648,
+ 4648, 4648, 4648, 4648, 4648, 4648, 4648, 4648, 5207, 5207,
+ 5207, 5207, 5207, 5207, 5207, 5207, 5207, 5207, 5207, 5207,
+
+ 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209,
+ 5209, 5209, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656,
+ 4656, 4656, 4656, 4656, 4653, 4653, 4653, 4653, 4653, 4653,
+ 4653, 4653, 4653, 4653, 4653, 4653, 5215, 5215, 5215, 5215,
+ 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5224, 5224,
+ 5224, 5224, 5224, 5224, 5224, 5224, 5224, 5224, 5224, 5224,
+ 4663, 4663, 4663, 4663, 4663, 4663, 4663, 4663, 4663, 4663,
+ 4663, 4663, 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 5230, 4665, 4665, 4665, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 4665, 4665, 5233, 5233, 5233, 5233,
+
+ 5233, 5233, 5233, 5233, 5233, 5233, 5233, 5233, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791,
+ 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2896, 2896, 2896, 4673, 4673, 4673, 4673, 4673, 4673,
+ 4673, 4673, 4673, 4673, 4673, 4673, 5242, 5242, 5242, 5242,
+ 5242, 5242, 5242, 5242, 5242, 5242, 5242, 5242, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
+ 4677, 4677, 4677, 4677, 4677, 4677, 4677, 4677, 4677, 4677,
+ 4677, 4677, 5248, 5248, 5248, 5248, 5248, 5248, 5248, 5248,
+
+ 5248, 5248, 5248, 5248, 4210, 4210, 4210, 4210, 4210, 4210,
+ 4210, 4210, 4210, 4210, 4210, 4210, 2902, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2526, 2526,
+ 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 4687, 4687, 4687, 4687, 4687, 4687, 4687, 4687, 4687, 4687,
+ 4687, 4687, 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261,
+ 5261, 5261, 5261, 5261, 4689, 4689, 4689, 4689, 4689, 4689,
+ 4689, 4689, 4689, 4689, 4689, 4689, 5266, 5266, 5266, 5266,
+ 5266, 5266, 5266, 5266, 5266, 5266, 5266, 5266, 5267, 5267,
+ 5267, 5267, 5267, 5267, 5267, 5267, 5267, 5267, 5267, 5267,
+
+ 4693, 4693, 4693, 4693, 4693, 4693, 4693, 4693, 4693, 4693,
+ 4693, 4693, 5271, 5271, 5271, 5271, 5271, 5271, 5271, 5271,
+ 5271, 5271, 5271, 5271, 5272, 5272, 5272, 5272, 5272, 5272,
+ 5272, 5272, 5272, 5272, 5272, 5272, 5276, 5276, 5276, 5276,
+ 5276, 5276, 5276, 5276, 5276, 5276, 5276, 5276, 5284, 5284,
+ 5284, 5284, 5284, 5284, 5284, 5284, 5284, 5284, 5284, 5284,
+ 4700, 4700, 4700, 4700, 4700, 4700, 4700, 4700, 4700, 4700,
+ 4700, 4700, 5287, 5287, 5287, 5287, 5287, 5287, 5287, 5287,
+ 5287, 5287, 5287, 5287, 4227, 4227, 4227, 4227, 4227, 4227,
+ 4227, 4227, 4227, 4227, 4227, 4227, 368, 368, 368, 368,
+
+ 368, 368, 368, 368, 368, 368, 368, 368, 4707, 4707,
+ 4707, 4707, 4707, 4707, 4707, 4707, 4707, 4707, 4707, 4707,
+ 4708, 4708, 4708, 4708, 4708, 4708, 4708, 4708, 4708, 4708,
+ 4708, 4708, 4710, 4710, 4710, 4710, 4710, 4710, 4710, 4710,
+ 4710, 4710, 4710, 4710, 5291, 5291, 5291, 5291, 5291, 5291,
+ 5291, 5291, 5291, 5291, 5291, 5291, 4713, 4713, 4713, 4713,
+ 4713, 4713, 4713, 4713, 4713, 4713, 4713, 4713, 5296, 5296,
+ 5296, 5296, 5296, 5296, 5296, 5296, 5296, 5296, 5296, 5296,
+ 5299, 5299, 5299, 5299, 5299, 5299, 5299, 5299, 5299, 5299,
+ 5299, 5299, 445, 445, 445, 445, 445, 445, 445, 445,
+
+ 445, 445, 445, 445, 4718, 4718, 4718, 4718, 4718, 4718,
+ 4718, 4718, 4718, 4718, 4718, 4718, 5303, 5303, 5303, 5303,
+ 5303, 5303, 5303, 5303, 5303, 5303, 5303, 5303, 3414, 3414,
+ 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414, 3414,
+ 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4721,
+ 4721, 4721, 5306, 5306, 5306, 5306, 5306, 5306, 5306, 5306,
+ 5306, 5306, 5306, 5306, 4244, 4244, 4244, 4244, 4244, 4244,
+ 4244, 4244, 4244, 4244, 4244, 4244, 4724, 4724, 4724, 4724,
+ 4724, 4724, 4724, 4724, 4724, 4724, 4724, 4724, 4246, 4246,
+ 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246,
+
+ 3848, 3848, 3848, 3848, 3848, 3848, 3848, 3848, 3848, 3848,
+ 3848, 3848, 4730, 4730, 4730, 4730, 4730, 4730, 4730, 4730,
+ 4730, 4730, 4730, 4730, 5314, 5314, 5314, 5314, 5314, 5314,
+ 5314, 5314, 5314, 5314, 5314, 5314, 4735, 4735, 4735, 4735,
+ 4735, 4735, 4735, 4735, 4735, 4735, 4735, 4735, 5316, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316,
+ 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737,
+ 4737, 4737, 5324, 5324, 5324, 5324, 5324, 5324, 5324, 5324,
+ 5324, 5324, 5324, 5324, 4743, 4743, 4743, 4743, 4743, 4743,
+ 4743, 4743, 4743, 4743, 4743, 4743, 5330, 5330, 5330, 5330,
+
+ 5330, 5330, 5330, 5330, 5330, 5330, 5330, 5330, 5334, 5334,
+ 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334,
+ 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262,
+ 4262, 4262, 4752, 4752, 4752, 4752, 4752, 4752, 4752, 4752,
+ 4752, 4752, 4752, 4752, 5346, 5346, 5346, 5346, 5346, 5346,
+ 5346, 5346, 5346, 5346, 5346, 5346, 4763, 4763, 4763, 4763,
+ 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 5355, 5355,
+ 5355, 5355, 5355, 5355, 5355, 5355, 5355, 5355, 5355, 5355,
+ 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3448, 3448, 4766, 4766, 4766, 4766, 4766, 4766, 4766, 4766,
+
+ 4766, 4766, 4766, 4766, 5358, 5358, 5358, 5358, 5358, 5358,
+ 5358, 5358, 5358, 5358, 5358, 5358, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964,
+ 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573,
+ 2573, 2573, 4777, 4777, 4777, 4777, 4777, 4777, 4777, 4777,
+ 4777, 4777, 4777, 4777, 4286, 4286, 4286, 4286, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 4286, 3881, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 4783, 4783,
+ 4783, 4783, 4783, 4783, 4783, 4783, 4783, 4783, 4783, 4783,
+
+ 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
+ 2581, 2581, 2581, 2581, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2228, 445, 445, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 4797, 4797,
+ 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797,
+ 5387, 5387, 5387, 5387, 5387, 5387, 5387, 5387, 5387, 5387,
+ 5387, 5387, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482,
+ 3482, 3482, 3482, 3482, 4800, 4800, 4800, 4800, 4800, 4800,
+ 4800, 4800, 4800, 4800, 4800, 4800, 5390, 5390, 5390, 5390,
+
+ 5390, 5390, 5390, 5390, 5390, 5390, 5390, 5390, 4304, 4304,
+ 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304,
+ 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 3005, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 4809, 4809, 4809, 4809, 4809, 4809,
+ 4809, 4809, 4809, 4809, 4809, 4809, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 3907, 3907,
+ 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907,
+ 4815, 4815, 4815, 4815, 4815, 4815, 4815, 4815, 4815, 4815,
+ 4815, 4815, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
+
+ 3023, 3023, 3023, 3023, 2610, 2610, 2610, 2610, 2610, 2610,
+ 2610, 2610, 2610, 2610, 2610, 2610, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 4828, 4828,
+ 4828, 4828, 4828, 4828, 4828, 4828, 4828, 4828, 4828, 4828,
+ 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417,
+ 5417, 5417, 4830, 4830, 4830, 4830, 4830, 4830, 4830, 4830,
+ 4830, 4830, 4830, 4830, 5423, 5423, 5423, 5423, 5423, 5423,
+ 5423, 5423, 5423, 5423, 5423, 5423, 4835, 4835, 4835, 4835,
+ 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 5428, 5428,
+ 5428, 5428, 5428, 5428, 5428, 5428, 5428, 5428, 5428, 5428,
+
+ 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432,
+ 5432, 5432, 4842, 4842, 4842, 4842, 4842, 4842, 4842, 4842,
+ 4842, 4842, 4842, 4842, 5443, 5443, 5443, 5443, 5443, 5443,
+ 5443, 5443, 5443, 5443, 5443, 5443, 4334, 4334, 4334, 4334,
+ 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4848, 4848,
+ 4848, 4848, 4848, 4848, 4848, 4848, 4848, 4848, 4848, 4848,
+ 5448, 5448, 5448, 5448, 5448, 5448, 5448, 5448, 5448, 5448,
+ 5448, 5448, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450,
+ 5450, 5450, 5450, 5450, 4856, 4856, 4856, 4856, 4856, 4856,
+ 4856, 4856, 4856, 4856, 4856, 4856, 4853, 4853, 4853, 4853,
+
+ 4853, 4853, 4853, 4853, 4853, 4853, 4853, 4853, 5455, 5455,
+ 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455,
+ 5462, 5462, 5462, 5462, 5462, 5462, 5462, 5462, 5462, 5462,
+ 5462, 5462, 4862, 4862, 4862, 4862, 4862, 4862, 4862, 4862,
+ 4862, 4862, 4862, 4862, 5468, 5468, 5468, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 4864, 4864, 4864, 4864,
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 5471, 5471,
+ 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471,
+ 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931,
+ 3931, 3931, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+
+ 3515, 3515, 3515, 3515, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3045, 3045, 4872, 4872, 4872, 4872,
+ 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 5480, 5480,
+ 5480, 5480, 5480, 5480, 5480, 5480, 5480, 5480, 5480, 5480,
+ 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530,
+ 3530, 3530, 4876, 4876, 4876, 4876, 4876, 4876, 4876, 4876,
+ 4876, 4876, 4876, 4876, 5486, 5486, 5486, 5486, 5486, 5486,
+ 5486, 5486, 5486, 5486, 5486, 5486, 4362, 4362, 4362, 4362,
+ 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 3050, 3050,
+ 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
+
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 4887, 4887, 4887, 4887, 4887, 4887,
+ 4887, 4887, 4887, 4887, 4887, 4887, 5499, 5499, 5499, 5499,
+ 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 4889, 4889,
+ 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889,
+ 5505, 5505, 5505, 5505, 5505, 5505, 5505, 5505, 5505, 5505,
+ 5505, 5505, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894,
+ 4894, 4894, 4894, 4894, 5510, 5510, 5510, 5510, 5510, 5510,
+ 5510, 5510, 5510, 5510, 5510, 5510, 5514, 5514, 5514, 5514,
+
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 4901, 4901,
+ 4901, 4901, 4901, 4901, 4901, 4901, 4901, 4901, 4901, 4901,
+ 5525, 5525, 5525, 5525, 5525, 5525, 5525, 5525, 5525, 5525,
+ 5525, 5525, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381,
+ 4381, 4381, 4381, 4381, 4907, 4907, 4907, 4907, 4907, 4907,
+ 4907, 4907, 4907, 4907, 4907, 4907, 5530, 5530, 5530, 5530,
+ 5530, 5530, 5530, 5530, 5530, 5530, 5530, 5530, 3556, 3556,
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556,
+ 4910, 4910, 4910, 4910, 4910, 4910, 4910, 4910, 4910, 4910,
+ 4910, 4910, 5533, 5533, 5533, 5533, 5533, 5533, 5533, 5533,
+
+ 5533, 5533, 5533, 5533, 4389, 4389, 4389, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 4389, 4389, 3069, 3069, 3069, 3069,
+ 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 2648, 2648,
+ 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
+ 4919, 4919, 4919, 4919, 4919, 4919, 4919, 4919, 4919, 4919,
+ 4919, 4919, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 4397, 3980, 3980, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3980, 3980, 3980, 3980, 4925, 4925, 4925, 4925,
+ 4925, 4925, 4925, 4925, 4925, 4925, 4925, 4925, 3084, 3084,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084,
+
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653,
+ 2653, 2653, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 2280, 2280, 2280, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4938, 4938, 4938, 4938, 4938, 5557, 5557, 5557, 5557,
+ 5557, 5557, 5557, 5557, 5557, 5557, 5557, 5557, 3585, 3585,
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585,
+ 4941, 4941, 4941, 4941, 4941, 4941, 4941, 4941, 4941, 4941,
+ 4941, 4941, 5560, 5560, 5560, 5560, 5560, 5560, 5560, 5560,
+ 5560, 5560, 5560, 5560, 4415, 4415, 4415, 4415, 4415, 4415,
+ 4415, 4415, 4415, 4415, 4415, 4415, 3104, 3104, 3104, 3104,
+
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 4950, 4950, 4950, 4950, 4950, 4950, 4950, 4950, 4950, 4950,
+ 4950, 4950, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423,
+ 4423, 4423, 4423, 4423, 4005, 4005, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 4005, 4005, 4956, 4956, 4956, 4956,
+ 4956, 4956, 4956, 4956, 4956, 4956, 4956, 4956, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+
+ 2298, 2298, 2298, 2298, 4969, 4969, 4969, 4969, 4969, 4969,
+ 4969, 4969, 4969, 4969, 4969, 4969, 5586, 5586, 5586, 5586,
+ 5586, 5586, 5586, 5586, 5586, 5586, 5586, 5586, 5589, 5589,
+ 5589, 5589, 5589, 5589, 5589, 5589, 5589, 5589, 5589, 5589,
+ 4973, 4973, 4973, 4973, 4973, 4973, 4973, 4973, 4973, 4973,
+ 4973, 4973, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594,
+ 5594, 5594, 5594, 5594, 4440, 4440, 4440, 4440, 4440, 4440,
+ 4440, 4440, 4440, 4440, 4440, 4440, 4977, 4977, 4977, 4977,
+ 4977, 4977, 4977, 4977, 4977, 4977, 4977, 4977, 5597, 5597,
+ 5597, 5597, 5597, 5597, 5597, 5597, 5597, 5597, 5597, 5597,
+
+ 4983, 4983, 4983, 4983, 4983, 4983, 4983, 4983, 4983, 4983,
+ 4983, 4983, 4981, 4981, 4981, 4981, 4981, 4981, 4981, 4981,
+ 4981, 4981, 4981, 4981, 4026, 4026, 4026, 4026, 4026, 4026,
+ 4026, 4026, 4026, 4026, 4026, 4026, 4448, 4448, 4448, 4448,
+ 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, 5601, 5601,
+ 5601, 5601, 5601, 5601, 5601, 5601, 5601, 5601, 5601, 5601,
+ 5604, 5604, 5604, 5604, 5604, 5604, 5604, 5604, 5604, 5604,
+ 5604, 5604, 5608, 5608, 5608, 5608, 5608, 5608, 5608, 5608,
+ 5608, 5608, 5608, 5608, 4989, 4989, 4989, 4989, 4989, 4989,
+ 4989, 4989, 4989, 4989, 4989, 4989, 4991, 4991, 4991, 4991,
+
+ 4991, 4991, 4991, 4991, 4991, 4991, 4991, 4991, 5613, 5613,
+ 5613, 5613, 5613, 5613, 5613, 5613, 5613, 5613, 5613, 5613,
+ 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
+ 4455, 4455, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 4996, 4996, 4996, 4996, 4996, 4996,
+ 4996, 4996, 4996, 4996, 4996, 4996, 5617, 5617, 5617, 5617,
+ 5617, 5617, 5617, 5617, 5617, 5617, 5617, 5617, 5004, 5004,
+ 5004, 5004, 5004, 5004, 5004, 5004, 5004, 5004, 5004, 5004,
+ 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5001,
+ 5001, 5001, 4039, 4039, 4039, 4039, 4039, 4039, 4039, 4039,
+
+ 4039, 4039, 4039, 4039, 4464, 4464, 4464, 4464, 4464, 4464,
+ 4464, 4464, 4464, 4464, 4464, 4464, 5006, 5006, 8693, 5006,
+ 5006, 5006, 5006, 5006, 5006, 5006, 5006, 5006, 5008, 5008,
+ 5008, 5008, 5008, 5008, 5008, 5008, 5008, 5008, 5008, 5008,
+ 5624, 5624, 5624, 5624, 5624, 5624, 5624, 5624, 5624, 5624,
+ 5624, 5624, 5626, 5626, 5626, 5626, 5626, 5626, 5626, 5626,
+ 5626, 5626, 5626, 5626, 4044, 4044, 4044, 4044, 4044, 4044,
+ 4044, 4044, 4044, 4044, 4044, 4044, 5012, 5012, 5012, 5012,
+ 5012, 5012, 5012, 5012, 5012, 5012, 5012, 5012, 5014, 5014,
+ 5014, 5014, 5014, 5014, 5014, 5014, 5014, 5014, 5014, 5014,
+
+ 5631, 5631, 5631, 5631, 5631, 5631, 5631, 5631, 5631, 5631,
+ 5631, 5631, 5634, 5634, 5634, 5634, 5634, 5634, 5634, 5634,
+ 5634, 5634, 5634, 5634, 4052, 4052, 4052, 4052, 4052, 4052,
+ 4052, 4052, 4052, 4052, 4052, 4052, 5019, 5019, 5019, 5019,
+ 5019, 5019, 5019, 5019, 5019, 5019, 5019, 5019, 5637, 5637,
+ 5637, 5637, 5637, 5637, 5637, 5637, 5637, 5637, 5637, 5637,
+ 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5021,
+ 5021, 5021, 5641, 5641, 5641, 5641, 5641, 5641, 5641, 5641,
+ 5641, 5641, 5641, 5641, 5024, 5024, 5024, 5024, 5024, 5024,
+ 5024, 5024, 5024, 5024, 5024, 5024, 5644, 5644, 5644, 5644,
+
+ 5644, 5644, 5644, 5644, 5644, 5644, 5644, 5644, 5648, 5648,
+ 5648, 5648, 5648, 5648, 5648, 5648, 5648, 5648, 5648, 5648,
+ 5029, 5029, 5029, 5029, 5029, 5029, 5029, 5029, 5029, 5029,
+ 5029, 5029, 5655, 5655, 5655, 5655, 5655, 5655, 5655, 5655,
+ 5655, 5655, 5655, 5655, 4501, 4501, 4501, 4501, 4501, 4501,
+ 4501, 4501, 4501, 4501, 4501, 4501, 5033, 5033, 5033, 5033,
+ 5033, 5033, 5033, 5033, 5033, 5033, 5033, 5033, 5658, 5658,
+ 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658,
+ 5660, 5660, 5660, 5660, 5660, 5660, 5660, 5660, 5660, 5660,
+ 5660, 5660, 5041, 5041, 5041, 5041, 5041, 5041, 5041, 5041,
+
+ 5041, 5041, 5041, 5041, 5038, 5038, 5038, 5038, 5038, 5038,
+ 5038, 5038, 5038, 5038, 5038, 5038, 5663, 5663, 5663, 5663,
+ 5663, 5663, 5663, 5663, 5663, 5663, 5663, 5663, 5668, 5668,
+ 5668, 5668, 5668, 5668, 5668, 5668, 5668, 5668, 5668, 5668,
+ 5045, 5045, 5045, 5045, 5045, 5045, 5045, 5045, 5045, 5045,
+ 5045, 5045, 5672, 5672, 5672, 5672, 5672, 5672, 5672, 5672,
+ 5672, 5672, 5672, 5672, 5047, 5047, 5047, 5047, 5047, 5047,
+ 5047, 5047, 5047, 5047, 5047, 5047, 5675, 5675, 5675, 5675,
+ 5675, 5675, 5675, 5675, 5675, 5675, 5675, 5675, 5049, 5049,
+ 5049, 5049, 5049, 5049, 5049, 5049, 5049, 5049, 5049, 5049,
+
+ 5678, 5678, 5678, 5678, 5678, 5678, 5678, 5678, 5678, 5678,
+ 5678, 5678, 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3673,
+ 3673, 3673, 3673, 3673, 5053, 5053, 5053, 5053, 5053, 5053,
+ 5053, 5053, 5053, 5053, 5053, 5053, 5684, 5684, 5684, 5684,
+ 5684, 5684, 5684, 5684, 5684, 5684, 5684, 5684, 4521, 4521,
+ 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 5058, 5058, 5058, 5058, 5058, 5058, 5058, 5058,
+ 5058, 5058, 5058, 5058, 5689, 5689, 5689, 5689, 5689, 5689,
+ 5689, 5689, 5689, 5689, 5689, 5689, 5060, 5060, 5060, 5060,
+
+ 5060, 5060, 5060, 5060, 5060, 5060, 5060, 5060, 5693, 5693,
+ 5693, 5693, 5693, 5693, 5693, 5693, 5693, 5693, 5693, 5693,
+ 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5063,
+ 5063, 5063, 5696, 5696, 5696, 5696, 5696, 5696, 5696, 5696,
+ 5696, 5696, 5696, 5696, 5700, 5700, 5700, 5700, 5700, 5700,
+ 5700, 5700, 5700, 5700, 5700, 5700, 5068, 5068, 5068, 5068,
+ 5068, 5068, 5068, 5068, 5068, 5068, 5068, 5068, 5707, 5707,
+ 5707, 5707, 5707, 5707, 5707, 5707, 5707, 5707, 5707, 5707,
+ 4533, 4533, 4533, 4533, 4533, 4533, 4533, 4533, 4533, 4533,
+ 4533, 4533, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072,
+
+ 5072, 5072, 5072, 5072, 5710, 5710, 5710, 5710, 5710, 5710,
+ 5710, 5710, 5710, 5710, 5710, 5710, 3692, 3692, 3692, 3692,
+ 3692, 3692, 3692, 3692, 3692, 3692, 3692, 3692, 5075, 5075,
+ 5075, 5075, 5075, 5075, 5075, 5075, 5075, 5075, 5075, 5075,
+ 5713, 5713, 5713, 5713, 5713, 5713, 5713, 5713, 5713, 5713,
+ 5713, 5713, 4539, 4539, 4539, 4539, 4539, 4539, 4539, 4539,
+ 4539, 4539, 4539, 4539, 5078, 5078, 5078, 5078, 5078, 5078,
+ 5078, 5078, 5078, 5078, 5078, 5078, 4541, 4541, 4541, 4541,
+ 4541, 4541, 4541, 4541, 4541, 4541, 4541, 4541, 4104, 4104,
+ 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104,
+
+ 5084, 5084, 5084, 5084, 5084, 5084, 5084, 5084, 5084, 5084,
+ 5084, 5084, 5088, 5088, 5088, 5088, 5088, 5088, 5088, 5088,
+ 5088, 5088, 5088, 5088, 5719, 5719, 5719, 5719, 5719, 5719,
+ 5719, 5719, 5719, 5719, 5719, 5719, 3707, 3707, 3707, 3707,
+ 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 5091, 5091,
+ 5091, 5091, 5091, 5091, 5091, 5091, 5091, 5091, 5091, 5091,
+ 5722, 5722, 5722, 5722, 5722, 5722, 5722, 5722, 5722, 5722,
+ 5722, 5722, 4551, 4551, 4551, 4551, 4551, 4551, 4551, 4551,
+ 4551, 4551, 4551, 4551, 5094, 5094, 5094, 5094, 5094, 5094,
+ 5094, 5094, 5094, 5094, 5094, 5094, 4553, 4553, 4553, 4553,
+
+ 4553, 4553, 4553, 4553, 4553, 4553, 4553, 4553, 4115, 4115,
+ 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115,
+ 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100, 5100,
+ 5100, 5100, 5104, 5104, 5104, 5104, 5104, 5104, 5104, 5104,
+ 5104, 5104, 5104, 5104, 5728, 5728, 5728, 5728, 5728, 5728,
+ 5728, 5728, 5728, 5728, 5728, 5728, 5731, 5731, 5731, 5731,
+ 5731, 5731, 5731, 5731, 5731, 5731, 5731, 5731, 5107, 5107,
+ 5107, 5107, 5107, 5107, 5107, 5107, 5107, 5107, 5107, 5107,
+ 5735, 5735, 5735, 5735, 5735, 5735, 5735, 5735, 5735, 5735,
+ 5735, 5735, 4564, 4564, 4564, 4564, 4564, 4564, 4564, 4564,
+
+ 4564, 4564, 4564, 4564, 656, 8693, 8693, 8693, 656, 8693,
+ 8693, 656, 5111, 5111, 5111, 5111, 5111, 5111, 5111, 5111,
+ 5111, 5111, 5111, 5111, 4567, 4567, 4567, 4567, 4567, 4567,
+ 4567, 4567, 4567, 4567, 4567, 4567, 4127, 4127, 4127, 4127,
+ 4127, 4127, 4127, 4127, 4127, 4127, 4127, 4127, 5115, 5115,
+ 5115, 5115, 5115, 5115, 5115, 5115, 5115, 5115, 5115, 5115,
+ 5117, 5117, 5117, 5117, 5117, 5117, 5117, 5117, 5117, 5117,
+ 5117, 5117, 5739, 5739, 5739, 5739, 5739, 5739, 5739, 5739,
+ 5739, 5739, 5739, 5739, 5743, 5743, 5743, 5743, 5743, 5743,
+ 5743, 5743, 5743, 5743, 5743, 5743, 5121, 5121, 5121, 5121,
+
+ 5121, 5121, 5121, 5121, 5121, 5121, 5121, 5121, 5748, 5748,
+ 5748, 5748, 5748, 5748, 5748, 5748, 5748, 5748, 5748, 5748,
+ 4577, 4577, 4577, 4577, 4577, 4577, 4577, 4577, 4577, 4577,
+ 4577, 4577, 683, 683, 683, 683, 683, 683, 683, 683,
+ 683, 683, 683, 683, 5126, 5126, 5126, 5126, 5126, 5126,
+ 5126, 5126, 5126, 5126, 5126, 5126, 4581, 4581, 4581, 4581,
+ 4581, 4581, 4581, 4581, 4581, 4581, 4581, 4581, 4140, 4140,
+ 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140,
+ 5131, 5131, 5131, 5131, 5131, 5131, 5131, 5131, 5131, 5131,
+ 5131, 5131, 5134, 5134, 5134, 5134, 5134, 5134, 5134, 5134,
+
+ 5134, 5134, 5134, 5134, 5753, 5753, 5753, 5753, 5753, 5753,
+ 5753, 5753, 5753, 5753, 5753, 5753, 5136, 5136, 5136, 5136,
+ 5136, 5136, 5136, 5136, 5136, 5136, 5136, 5136, 5756, 5756,
+ 5756, 5756, 5756, 5756, 5756, 5756, 5756, 5756, 5756, 5756,
+ 5138, 5138, 5138, 5138, 5138, 5138, 5138, 5138, 5138, 5138,
+ 5138, 5138, 5759, 5759, 5759, 5759, 5759, 5759, 5759, 5759,
+ 5759, 5759, 5759, 5759, 5763, 5763, 5763, 5763, 5763, 5763,
+ 5763, 5763, 5763, 5763, 5763, 5763, 5142, 5142, 5142, 5142,
+ 5142, 5142, 5142, 5142, 5142, 5142, 5142, 5142, 5769, 5769,
+ 5769, 5769, 5769, 5769, 5769, 5769, 5769, 5769, 5769, 5769,
+
+ 4597, 4597, 4597, 4597, 4597, 4597, 4597, 4597, 4597, 4597,
+ 4597, 4597, 5774, 5774, 5774, 5774, 5774, 5774, 5774, 5774,
+ 5774, 5774, 5774, 5774, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 5777, 5777, 5777, 5777,
+ 5777, 5777, 5777, 5777, 5777, 5777, 5777, 5777, 5150, 5150,
+ 5150, 5150, 5150, 5150, 5150, 5150, 5150, 5150, 5150, 5150,
+ 4603, 4603, 4603, 4603, 4603, 4603, 4603, 4603, 4603, 4603,
+ 4603, 4603, 5153, 5153, 5153, 5153, 5153, 5153, 5153, 5153,
+ 5153, 5153, 5153, 5153, 5778, 5778, 5778, 5778, 5778, 5778,
+ 5778, 5778, 5778, 5778, 5778, 5778, 5779, 5779, 5779, 5779,
+
+ 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5159, 5159,
+ 5159, 5159, 5159, 5159, 5159, 5159, 5159, 5159, 5159, 5159,
+ 5160, 5160, 5160, 5160, 5160, 5160, 5160, 5160, 5160, 5160,
+ 5160, 5160, 4157, 4157, 4157, 4157, 4157, 4157, 4157, 4157,
+ 4157, 4157, 4157, 4157, 5162, 5162, 5162, 5162, 5162, 5162,
+ 5162, 5162, 5162, 5162, 5162, 5162, 409, 8693, 8693, 409,
+ 8693, 8693, 8693, 409, 409, 8693, 409, 5784, 5784, 5784,
+ 5784, 5784, 5784, 5784, 5784, 5784, 5784, 5784, 5784, 4162,
+ 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162,
+ 4162, 5787, 5787, 5787, 5787, 5787, 5787, 5787, 5787, 5787,
+
+ 5787, 5787, 5787, 3761, 3761, 3761, 3761, 3761, 3761, 3761,
+ 3761, 3761, 3761, 3761, 3761, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 5172, 5172, 5172,
+ 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5790,
+ 5790, 5790, 5790, 5790, 5790, 5790, 5790, 5790, 5790, 5790,
+ 5790, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793,
+ 5793, 5793, 5793, 4627, 4627, 4627, 4627, 4627, 4627, 4627,
+ 4627, 4627, 4627, 4627, 4627, 5180, 5180, 5180, 5180, 5180,
+ 5180, 5180, 5180, 5180, 5180, 5180, 5180, 5802, 5802, 5802,
+ 5802, 5802, 5802, 5802, 5802, 5802, 5802, 5802, 5802, 4633,
+
+ 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633,
+ 4633, 5186, 5186, 5186, 5186, 5186, 5186, 5186, 5186, 5186,
+ 5186, 5186, 5186, 5190, 5190, 5190, 5190, 5190, 5190, 5190,
+ 5190, 5190, 5190, 5190, 5190, 5807, 5807, 5807, 5807, 5807,
+ 5807, 5807, 5807, 5807, 5807, 5807, 5807, 4180, 4180, 4180,
+ 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 5202,
+ 5202, 5202, 5202, 5202, 5202, 5202, 5202, 5202, 5202, 5202,
+ 5202, 5207, 5207, 5207, 5207, 5207, 5207, 5207, 5207, 5207,
+ 5207, 5207, 5207, 5819, 5819, 5819, 5819, 5819, 5819, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5209, 5209, 5209, 5209, 5209,
+
+ 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5827, 5827, 5827,
+ 5827, 5827, 5827, 5827, 5827, 5827, 5827, 5827, 5827, 5215,
+ 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215,
+ 5215, 5833, 5833, 5833, 5833, 5833, 5833, 5833, 5833, 5833,
+ 5833, 5833, 5833, 5837, 5837, 5837, 5837, 5837, 5837, 5837,
+ 5837, 5837, 5837, 5837, 5837, 4656, 4656, 4656, 4656, 4656,
+ 4656, 4656, 4656, 4656, 4656, 4656, 4656, 5224, 5224, 5224,
+ 5224, 5224, 5224, 5224, 5224, 5224, 5224, 5224, 5224, 5849,
+ 5849, 5849, 5849, 5849, 5849, 5849, 5849, 5849, 5849, 5849,
+ 5849, 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230,
+
+ 5230, 5230, 5230, 5854, 5854, 5854, 5854, 5854, 5854, 5854,
+ 5854, 5854, 5854, 5854, 5854, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3791, 5233, 5233, 5233,
+ 5233, 5233, 5233, 5233, 5233, 5233, 5233, 5233, 5233, 5857,
+ 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857,
+ 5857, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665,
+ 4665, 4665, 4665, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 3364, 3364, 3364, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 5242, 5242, 5242,
+ 5242, 5242, 5242, 5242, 5242, 5242, 5242, 5242, 5242, 4673,
+
+ 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673,
+ 4673, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210,
+ 4210, 4210, 4210, 5248, 5248, 5248, 5248, 5248, 5248, 5248,
+ 5248, 5248, 5248, 5248, 5248, 3382, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2526,
+ 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2526, 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261,
+ 5261, 5261, 5261, 5884, 5884, 5884, 5884, 5884, 5884, 5884,
+ 5884, 5884, 5884, 5884, 5884, 5885, 5885, 5885, 5885, 5885,
+
+ 5885, 5885, 5885, 5885, 5885, 5885, 5885, 5888, 5888, 5888,
+ 5888, 5888, 5888, 5888, 5888, 5888, 5888, 5888, 5888, 5895,
+ 5895, 5895, 5895, 5895, 5895, 5895, 5895, 5895, 5895, 5895,
+ 5895, 5267, 5267, 5267, 5267, 5267, 5267, 5267, 5267, 5267,
+ 5267, 5267, 5267, 5896, 5896, 5896, 5896, 5896, 5896, 5896,
+ 5896, 5896, 5896, 5896, 5896, 4689, 4689, 4689, 4689, 4689,
+ 4689, 4689, 4689, 4689, 4689, 4689, 4689, 5899, 5899, 5899,
+ 5899, 5899, 5899, 5899, 5899, 5899, 5899, 5899, 5899, 5272,
+ 5272, 5272, 5272, 5272, 5272, 5272, 5272, 5272, 5272, 5272,
+ 5272, 4693, 4693, 4693, 4693, 4693, 4693, 4693, 4693, 4693,
+
+ 4693, 4693, 4693, 5276, 5276, 5276, 5276, 5276, 5276, 5276,
+ 5276, 5276, 5276, 5276, 5276, 5900, 5900, 5900, 5900, 5900,
+ 5900, 5900, 5900, 5900, 5900, 5900, 5900, 5901, 5901, 5901,
+ 5901, 5901, 5901, 5901, 5901, 5901, 5901, 5901, 5901, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 5283, 5283, 5283, 5283, 5283, 5283, 5283, 5283, 5283,
+ 5283, 5283, 5283, 5284, 5284, 5284, 5284, 5284, 5284, 5284,
+ 5284, 5284, 5284, 5284, 5284, 4227, 4227, 4227, 4227, 4227,
+ 4227, 4227, 4227, 4227, 4227, 4227, 4227, 5287, 5287, 5287,
+ 5287, 5287, 5287, 5287, 5287, 5287, 5287, 5287, 5287, 5291,
+
+ 5291, 5291, 5291, 5291, 5291, 5291, 5291, 5291, 5291, 5291,
+ 5291, 5909, 5909, 5909, 5909, 5909, 5909, 5909, 5909, 5909,
+ 5909, 5909, 5909, 5911, 5911, 5911, 5911, 5911, 5911, 5911,
+ 5911, 5911, 5911, 5911, 5911, 5299, 5299, 5299, 5299, 5299,
+ 5299, 5299, 5299, 5299, 5299, 5299, 5299, 5296, 5296, 5296,
+ 5296, 5296, 5296, 5296, 5296, 5296, 5296, 5296, 5296, 5913,
+ 5913, 5913, 5913, 5913, 5913, 5913, 5913, 5913, 5913, 5913,
+ 5913, 5917, 5917, 5917, 5917, 5917, 5917, 5917, 5917, 5917,
+ 5917, 5917, 5917, 445, 445, 445, 445, 445, 445, 445,
+ 445, 445, 445, 445, 445, 5303, 5303, 5303, 5303, 5303,
+
+ 5303, 5303, 5303, 5303, 5303, 5303, 5303, 4718, 4718, 4718,
+ 4718, 4718, 4718, 4718, 4718, 4718, 4718, 4718, 4718, 5306,
+ 5306, 5306, 5306, 5306, 5306, 5306, 5306, 5306, 5306, 5306,
+ 5306, 5923, 5923, 5923, 5923, 5923, 5923, 5923, 5923, 5923,
+ 5923, 5923, 5923, 4244, 4244, 4244, 4244, 4244, 4244, 4244,
+ 4244, 4244, 4244, 4244, 4244, 5925, 5925, 5925, 5925, 5925,
+ 5925, 5925, 5925, 5925, 5925, 5925, 5925, 4246, 4246, 4246,
+ 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 5928,
+ 5928, 5928, 5928, 5928, 5928, 5928, 5928, 5928, 5928, 5928,
+ 5928, 3848, 3848, 3848, 3848, 3848, 3848, 3848, 3848, 3848,
+
+ 3848, 3848, 3848, 5316, 5316, 5316, 5316, 5316, 5316, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5930, 5930, 5930, 5930, 5930,
+ 5930, 5930, 5930, 5930, 5930, 5930, 5930, 5933, 5933, 5933,
+ 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 4737,
+ 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737,
+ 4737, 5324, 5324, 5324, 5324, 5324, 5324, 5324, 5324, 5324,
+ 5324, 5324, 5324, 5942, 5942, 5942, 5942, 5942, 5942, 5942,
+ 5942, 5942, 5942, 5942, 5942, 4743, 4743, 4743, 4743, 4743,
+ 4743, 4743, 4743, 4743, 4743, 4743, 4743, 5330, 5330, 5330,
+ 5330, 5330, 5330, 5330, 5330, 5330, 5330, 5330, 5330, 5334,
+
+ 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334,
+ 5334, 5947, 5947, 5947, 5947, 5947, 5947, 5947, 5947, 5947,
+ 5947, 5947, 5947, 4262, 4262, 4262, 4262, 4262, 4262, 4262,
+ 4262, 4262, 4262, 4262, 4262, 5346, 5346, 5346, 5346, 5346,
+ 5346, 5346, 5346, 5346, 5346, 5346, 5346, 5355, 5355, 5355,
+ 5355, 5355, 5355, 5355, 5355, 5355, 5355, 5355, 5355, 4763,
+ 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+ 4763, 5358, 5358, 5358, 5358, 5358, 5358, 5358, 5358, 5358,
+ 5358, 5358, 5358, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4276, 4276, 4276, 3448, 3448, 3448, 3448, 3448,
+
+ 3448, 3448, 3448, 3448, 3448, 3448, 3448, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2573,
+ 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573,
+ 2573, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286,
+ 4286, 4286, 4286, 3881, 3881, 3881, 3881, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2581, 2581, 2581,
+ 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2228,
+ 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 5387, 5387, 5387, 5387, 5387, 5387, 5387, 5387, 5387,
+
+ 5387, 5387, 5387, 4797, 4797, 4797, 4797, 4797, 4797, 4797,
+ 4797, 4797, 4797, 4797, 4797, 5390, 5390, 5390, 5390, 5390,
+ 5390, 5390, 5390, 5390, 5390, 5390, 5390, 4304, 4304, 4304,
+ 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 3482,
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482,
+ 3482, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 3005, 3005, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 4312, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4312, 4312, 4312, 3907, 3907, 3907,
+ 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3023,
+
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
+ 3023, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610,
+ 2610, 2610, 2610, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 5417, 5417, 5417, 5417, 5417,
+ 5417, 5417, 5417, 5417, 5417, 5417, 5417, 6012, 6012, 6012,
+ 6012, 6012, 6012, 6012, 6012, 6012, 6012, 6012, 6012, 6015,
+ 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015,
+ 6015, 5423, 5423, 5423, 5423, 5423, 5423, 5423, 5423, 5423,
+ 5423, 5423, 5423, 6023, 6023, 6023, 6023, 6023, 6023, 6023,
+ 6023, 6023, 6023, 6023, 6023, 4830, 4830, 4830, 4830, 4830,
+
+ 4830, 4830, 4830, 4830, 4830, 4830, 4830, 5428, 5428, 5428,
+ 5428, 5428, 5428, 5428, 5428, 5428, 5428, 5428, 5428, 4835,
+ 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835,
+ 4835, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432,
+ 5432, 5432, 5432, 6027, 6027, 6027, 6027, 6027, 6027, 6027,
+ 6027, 6027, 6027, 6027, 6027, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 4334, 4334, 4334,
+ 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, 5443,
+ 5443, 5443, 5443, 5443, 5443, 5443, 5443, 5443, 5443, 5443,
+ 5443, 5448, 5448, 5448, 5448, 5448, 5448, 5448, 5448, 5448,
+
+ 5448, 5448, 5448, 6039, 6039, 6039, 6039, 6039, 6039, 6039,
+ 6039, 6039, 6039, 6039, 6039, 5450, 5450, 5450, 5450, 5450,
+ 5450, 5450, 5450, 5450, 5450, 5450, 5450, 6045, 6045, 6045,
+ 6045, 6045, 6045, 6045, 6045, 6045, 6045, 6045, 6045, 5455,
+ 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455,
+ 5455, 6050, 6050, 6050, 6050, 6050, 6050, 6050, 6050, 6050,
+ 6050, 6050, 6050, 6054, 6054, 6054, 6054, 6054, 6054, 6054,
+ 6054, 6054, 6054, 6054, 6054, 5462, 5462, 5462, 5462, 5462,
+ 5462, 5462, 5462, 5462, 5462, 5462, 5462, 6065, 6065, 6065,
+ 6065, 6065, 6065, 6065, 6065, 6065, 6065, 6065, 6065, 4856,
+
+ 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856,
+ 4856, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468,
+ 5468, 5468, 5468, 6070, 6070, 6070, 6070, 6070, 6070, 6070,
+ 6070, 6070, 6070, 6070, 6070, 3931, 3931, 3931, 3931, 3931,
+ 3931, 3931, 3931, 3931, 3931, 3931, 3931, 5471, 5471, 5471,
+ 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, 6073,
+ 6073, 6073, 6073, 6073, 6073, 6073, 6073, 6073, 6073, 6073,
+ 6073, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864,
+ 4864, 4864, 4864, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3515, 3515, 3515, 3515, 3515, 3045, 3045, 3045, 3045, 3045,
+
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 5480, 5480, 5480,
+ 5480, 5480, 5480, 5480, 5480, 5480, 5480, 5480, 5480, 4872,
+ 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872,
+ 4872, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362,
+ 4362, 4362, 4362, 5486, 5486, 5486, 5486, 5486, 5486, 5486,
+ 5486, 5486, 5486, 5486, 5486, 3530, 3530, 3530, 3530, 3530,
+ 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3050, 3050, 3050,
+ 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+
+ 368, 368, 368, 5499, 5499, 5499, 5499, 5499, 5499, 5499,
+ 5499, 5499, 5499, 5499, 5499, 6098, 6098, 6098, 6098, 6098,
+ 6098, 6098, 6098, 6098, 6098, 6098, 6098, 6101, 6101, 6101,
+ 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 5505,
+ 5505, 5505, 5505, 5505, 5505, 5505, 5505, 5505, 5505, 5505,
+ 5505, 6109, 6109, 6109, 6109, 6109, 6109, 6109, 6109, 6109,
+ 6109, 6109, 6109, 4889, 4889, 4889, 4889, 4889, 4889, 4889,
+ 4889, 4889, 4889, 4889, 4889, 5510, 5510, 5510, 5510, 5510,
+ 5510, 5510, 5510, 5510, 5510, 5510, 5510, 4894, 4894, 4894,
+ 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 5514,
+
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514,
+ 5514, 6113, 6113, 6113, 6113, 6113, 6113, 6113, 6113, 6113,
+ 6113, 6113, 6113, 4381, 4381, 4381, 4381, 4381, 4381, 4381,
+ 4381, 4381, 4381, 4381, 4381, 5525, 5525, 5525, 5525, 5525,
+ 5525, 5525, 5525, 5525, 5525, 5525, 5525, 5530, 5530, 5530,
+ 5530, 5530, 5530, 5530, 5530, 5530, 5530, 5530, 5530, 4907,
+ 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907,
+ 4907, 5533, 5533, 5533, 5533, 5533, 5533, 5533, 5533, 5533,
+ 5533, 5533, 5533, 4389, 4389, 4389, 4389, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 4389, 3556, 3556, 3556, 3556, 3556,
+
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3069, 3069, 3069,
+ 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 2648,
+ 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
+ 2648, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 3980, 3980, 3980, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3980, 3980, 3980, 3084, 3084, 3084, 3084, 3084,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 2653, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2280,
+ 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 5557, 5557, 5557, 5557, 5557, 5557, 5557, 5557, 5557,
+
+ 5557, 5557, 5557, 4938, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4938, 4938, 4938, 4938, 5560, 5560, 5560, 5560, 5560,
+ 5560, 5560, 5560, 5560, 5560, 5560, 5560, 4415, 4415, 4415,
+ 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 3585,
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585,
+ 3585, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 4423, 4423, 4423, 4423, 4423,
+ 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 3119,
+
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 5586, 5586, 5586, 5586, 5586,
+ 5586, 5586, 5586, 5586, 5586, 5586, 5586, 5589, 5589, 5589,
+ 5589, 5589, 5589, 5589, 5589, 5589, 5589, 5589, 5589, 4968,
+ 4968, 4968, 4968, 4968, 4968, 4968, 4968, 4968, 4968, 4968,
+ 4968, 5590, 5590, 5590, 5590, 5590, 5590, 5590, 5590, 5590,
+ 5590, 5590, 5590, 6169, 6169, 6169, 6169, 6169, 6169, 6169,
+ 6169, 6169, 6169, 6169, 6169, 1381, 1381, 8693, 1381, 1381,
+
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 4440, 4440, 4440,
+ 4440, 4440, 4440, 4440, 4440, 4440, 4440, 4440, 4440, 5594,
+ 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594,
+ 5594, 4445, 4445, 4445, 4445, 4445, 4445, 4445, 4445, 4445,
+ 4445, 4445, 4445, 4977, 4977, 4977, 4977, 4977, 4977, 4977,
+ 4977, 4977, 4977, 4977, 4977, 3154, 3154, 3154, 3154, 3154,
+ 3154, 3154, 3154, 3154, 3154, 3154, 3154, 5597, 5597, 5597,
+ 5597, 5597, 5597, 5597, 5597, 5597, 5597, 5597, 5597, 5601,
+ 5601, 5601, 5601, 5601, 5601, 5601, 5601, 5601, 5601, 5601,
+ 5601, 5604, 5604, 5604, 5604, 5604, 5604, 5604, 5604, 5604,
+
+ 5604, 5604, 5604, 5608, 5608, 5608, 5608, 5608, 5608, 5608,
+ 5608, 5608, 5608, 5608, 5608, 4985, 4985, 4985, 4985, 4985,
+ 4985, 4985, 4985, 4985, 4985, 4985, 4985, 6173, 6173, 6173,
+ 6173, 6173, 6173, 6173, 6173, 6173, 6173, 6173, 6173, 6176,
+ 6176, 6176, 6176, 6176, 6176, 6176, 6176, 6176, 6176, 6176,
+ 6176, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 4455, 4455, 4455, 4455, 4455, 4455, 4455,
+ 4455, 4455, 4455, 4455, 4455, 5613, 5613, 5613, 5613, 5613,
+ 5613, 5613, 5613, 5613, 5613, 5613, 5613, 4460, 4460, 4460,
+ 4460, 4460, 4460, 4460, 4460, 4460, 4460, 4460, 4460, 4996,
+
+ 4996, 4996, 4996, 4996, 4996, 4996, 4996, 4996, 4996, 4996,
+ 4996, 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176, 3176,
+ 3176, 3176, 3176, 5617, 5617, 5617, 5617, 5617, 5617, 5617,
+ 5617, 5617, 5617, 5617, 5617, 5006, 5006, 8693, 5006, 5006,
+ 5006, 5006, 5006, 5006, 5006, 5006, 5006, 5626, 5626, 5626,
+ 5626, 5626, 5626, 5626, 5626, 5626, 5626, 5626, 5626, 5624,
+ 5624, 5624, 5624, 5624, 5624, 5624, 5624, 5624, 5624, 5624,
+ 5624, 6181, 6181, 6181, 6181, 6181, 6181, 6181, 6181, 6181,
+ 6181, 6181, 6181, 6184, 6184, 6184, 6184, 6184, 6184, 6184,
+ 6184, 6184, 6184, 6184, 6184, 5012, 5012, 5012, 5012, 5012,
+
+ 5012, 5012, 5012, 5012, 5012, 5012, 5012, 5634, 5634, 5634,
+ 5634, 5634, 5634, 5634, 5634, 5634, 5634, 5634, 5634, 5631,
+ 5631, 5631, 5631, 5631, 5631, 5631, 5631, 5631, 5631, 5631,
+ 5631, 6187, 6187, 6187, 6187, 6187, 6187, 6187, 6187, 6187,
+ 6187, 6187, 6187, 6191, 6191, 6191, 6191, 6191, 6191, 6191,
+ 6191, 6191, 6191, 6191, 6191, 5637, 5637, 5637, 5637, 5637,
+ 5637, 5637, 5637, 5637, 5637, 5637, 5637, 6195, 6195, 6195,
+ 6195, 6195, 6195, 6195, 6195, 6195, 6195, 6195, 6195, 6198,
+ 6198, 6198, 6198, 6198, 6198, 6198, 6198, 6198, 6198, 6198,
+ 6198, 5641, 5641, 5641, 5641, 5641, 5641, 5641, 5641, 5641,
+
+ 5641, 5641, 5641, 6202, 6202, 6202, 6202, 6202, 6202, 6202,
+ 6202, 6202, 6202, 6202, 6202, 5021, 5021, 5021, 5021, 5021,
+ 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5644, 5644, 5644,
+ 5644, 5644, 5644, 5644, 5644, 5644, 5644, 5644, 5644, 5024,
+ 5024, 5024, 5024, 5024, 5024, 5024, 5024, 5024, 5024, 5024,
+ 5024, 5648, 5648, 5648, 5648, 5648, 5648, 5648, 5648, 5648,
+ 5648, 5648, 5648, 6204, 6204, 6204, 6204, 6204, 6204, 6204,
+ 6204, 6204, 6204, 6204, 6204, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 4501, 4501, 4501,
+ 4501, 4501, 4501, 4501, 4501, 4501, 4501, 4501, 4501, 5655,
+
+ 5655, 5655, 5655, 5655, 5655, 5655, 5655, 5655, 5655, 5655,
+ 5655, 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658,
+ 5658, 5658, 5658, 6210, 6210, 6210, 6210, 6210, 6210, 6210,
+ 6210, 6210, 6210, 6210, 6210, 5660, 5660, 5660, 5660, 5660,
+ 5660, 5660, 5660, 5660, 5660, 5660, 5660, 6214, 6214, 6214,
+ 6214, 6214, 6214, 6214, 6214, 6214, 6214, 6214, 6214, 5663,
+ 5663, 5663, 5663, 5663, 5663, 5663, 5663, 5663, 5663, 5663,
+ 5663, 6217, 6217, 6217, 6217, 6217, 6217, 6217, 6217, 6217,
+ 6217, 6217, 6217, 6221, 6221, 6221, 6221, 6221, 6221, 6221,
+ 6221, 6221, 6221, 6221, 6221, 5668, 5668, 5668, 5668, 5668,
+
+ 5668, 5668, 5668, 5668, 5668, 5668, 5668, 6228, 6228, 6228,
+ 6228, 6228, 6228, 6228, 6228, 6228, 6228, 6228, 6228, 5041,
+ 5041, 5041, 5041, 5041, 5041, 5041, 5041, 5041, 5041, 5041,
+ 5041, 5672, 5672, 5672, 5672, 5672, 5672, 5672, 5672, 5672,
+ 5672, 5672, 5672, 6231, 6231, 6231, 6231, 6231, 6231, 6231,
+ 6231, 6231, 6231, 6231, 6231, 4075, 4075, 4075, 4075, 4075,
+ 4075, 4075, 4075, 4075, 4075, 4075, 4075, 5675, 5675, 5675,
+ 5675, 5675, 5675, 5675, 5675, 5675, 5675, 5675, 5675, 6234,
+ 6234, 6234, 6234, 6234, 6234, 6234, 6234, 6234, 6234, 6234,
+ 6234, 5047, 5047, 5047, 5047, 5047, 5047, 5047, 5047, 5047,
+
+ 5047, 5047, 5047, 5678, 5678, 5678, 5678, 5678, 5678, 5678,
+ 5678, 5678, 5678, 5678, 5678, 5049, 5049, 5049, 5049, 5049,
+ 5049, 5049, 5049, 5049, 5049, 5049, 5049, 4521, 4521, 4521,
+ 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521, 4521, 5684,
+ 5684, 5684, 5684, 5684, 5684, 5684, 5684, 5684, 5684, 5684,
+ 5684, 5689, 5689, 5689, 5689, 5689, 5689, 5689, 5689, 5689,
+ 5689, 5689, 5689, 6241, 6241, 6241, 6241, 6241, 6241, 6241,
+ 6241, 6241, 6241, 6241, 6241, 6244, 6244, 6244, 6244, 6244,
+ 6244, 6244, 6244, 6244, 6244, 6244, 6244, 5693, 5693, 5693,
+ 5693, 5693, 5693, 5693, 5693, 5693, 5693, 5693, 5693, 6248,
+
+ 6248, 6248, 6248, 6248, 6248, 6248, 6248, 6248, 6248, 6248,
+ 6248, 5060, 5060, 5060, 5060, 5060, 5060, 5060, 5060, 5060,
+ 5060, 5060, 5060, 5696, 5696, 5696, 5696, 5696, 5696, 5696,
+ 5696, 5696, 5696, 5696, 5696, 5063, 5063, 5063, 5063, 5063,
+ 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5700, 5700, 5700,
+ 5700, 5700, 5700, 5700, 5700, 5700, 5700, 5700, 5700, 6250,
+ 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250,
+ 6250, 4533, 4533, 4533, 4533, 4533, 4533, 4533, 4533, 4533,
+ 4533, 4533, 4533, 5707, 5707, 5707, 5707, 5707, 5707, 5707,
+ 5707, 5707, 5707, 5707, 5707, 5710, 5710, 5710, 5710, 5710,
+
+ 5710, 5710, 5710, 5710, 5710, 5710, 5710, 5072, 5072, 5072,
+ 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5713,
+ 5713, 5713, 5713, 5713, 5713, 5713, 5713, 5713, 5713, 5713,
+ 5713, 4539, 4539, 4539, 4539, 4539, 4539, 4539, 4539, 4539,
+ 4539, 4539, 4539, 4541, 4541, 4541, 4541, 4541, 4541, 4541,
+ 4541, 4541, 4541, 4541, 4541, 5719, 5719, 5719, 5719, 5719,
+ 5719, 5719, 5719, 5719, 5719, 5719, 5719, 5088, 5088, 5088,
+ 5088, 5088, 5088, 5088, 5088, 5088, 5088, 5088, 5088, 5722,
+ 5722, 5722, 5722, 5722, 5722, 5722, 5722, 5722, 5722, 5722,
+ 5722, 4551, 4551, 4551, 4551, 4551, 4551, 4551, 4551, 4551,
+
+ 4551, 4551, 4551, 4553, 4553, 4553, 4553, 4553, 4553, 4553,
+ 4553, 4553, 4553, 4553, 4553, 5728, 5728, 5728, 5728, 5728,
+ 5728, 5728, 5728, 5728, 5728, 5728, 5728, 5104, 5104, 5104,
+ 5104, 5104, 5104, 5104, 5104, 5104, 5104, 5104, 5104, 5731,
+ 5731, 5731, 5731, 5731, 5731, 5731, 5731, 5731, 5731, 5731,
+ 5731, 6258, 6258, 6258, 6258, 6258, 6258, 6258, 6258, 6258,
+ 6258, 6258, 6258, 4564, 4564, 4564, 4564, 4564, 4564, 4564,
+ 4564, 4564, 4564, 4564, 4564, 5735, 5735, 5735, 5735, 5735,
+ 5735, 5735, 5735, 5735, 5735, 5735, 5735, 656, 8693, 8693,
+ 8693, 656, 8693, 8693, 656, 4567, 4567, 4567, 4567, 4567,
+
+ 4567, 4567, 4567, 4567, 4567, 4567, 4567, 5739, 5739, 5739,
+ 5739, 5739, 5739, 5739, 5739, 5739, 5739, 5739, 5739, 5117,
+ 5117, 5117, 5117, 5117, 5117, 5117, 5117, 5117, 5117, 5117,
+ 5117, 5743, 5743, 5743, 5743, 5743, 5743, 5743, 5743, 5743,
+ 5743, 5743, 5743, 6262, 6262, 6262, 6262, 6262, 6262, 6262,
+ 6262, 6262, 6262, 6262, 6262, 4577, 4577, 4577, 4577, 4577,
+ 4577, 4577, 4577, 4577, 4577, 4577, 4577, 5748, 5748, 5748,
+ 5748, 5748, 5748, 5748, 5748, 5748, 5748, 5748, 5748, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+ 683, 4581, 4581, 4581, 4581, 4581, 4581, 4581, 4581, 4581,
+
+ 4581, 4581, 4581, 5753, 5753, 5753, 5753, 5753, 5753, 5753,
+ 5753, 5753, 5753, 5753, 5753, 6267, 6267, 6267, 6267, 6267,
+ 6267, 6267, 6267, 6267, 6267, 6267, 6267, 6270, 6270, 6270,
+ 6270, 6270, 6270, 6270, 6270, 6270, 6270, 6270, 6270, 5756,
+ 5756, 5756, 5756, 5756, 5756, 5756, 5756, 5756, 5756, 5756,
+ 5756, 6273, 6273, 6273, 6273, 6273, 6273, 6273, 6273, 6273,
+ 6273, 6273, 6273, 5136, 5136, 5136, 5136, 5136, 5136, 5136,
+ 5136, 5136, 5136, 5136, 5136, 5759, 5759, 5759, 5759, 5759,
+ 5759, 5759, 5759, 5759, 5759, 5759, 5759, 5138, 5138, 5138,
+ 5138, 5138, 5138, 5138, 5138, 5138, 5138, 5138, 5138, 5763,
+
+ 5763, 5763, 5763, 5763, 5763, 5763, 5763, 5763, 5763, 5763,
+ 5763, 6275, 6275, 6275, 6275, 6275, 6275, 6275, 6275, 6275,
+ 6275, 6275, 6275, 4597, 4597, 4597, 4597, 4597, 4597, 4597,
+ 4597, 4597, 4597, 4597, 4597, 5769, 5769, 5769, 5769, 5769,
+ 5769, 5769, 5769, 5769, 5769, 5769, 5769, 5773, 5773, 5773,
+ 5773, 5773, 5773, 5773, 5773, 5773, 5773, 5773, 5773, 5774,
+ 5774, 5774, 5774, 5774, 5774, 5774, 5774, 5774, 5774, 5774,
+ 5774, 5776, 5776, 5776, 5776, 5776, 5776, 5776, 5776, 5776,
+ 5776, 5776, 5776, 5777, 5777, 5777, 5777, 5777, 5777, 5777,
+ 5777, 5777, 5777, 5777, 5777, 6282, 6282, 6282, 6282, 6282,
+
+ 6282, 6282, 6282, 6282, 6282, 6282, 6282, 5779, 5779, 5779,
+ 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5779, 6284,
+ 6284, 6284, 6284, 6284, 6284, 6284, 6284, 6284, 6284, 6284,
+ 6284, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286,
+ 6286, 6286, 6286, 5153, 5153, 5153, 5153, 5153, 5153, 5153,
+ 5153, 5153, 5153, 5153, 5153, 4603, 4603, 4603, 4603, 4603,
+ 4603, 4603, 4603, 4603, 4603, 4603, 4603, 6289, 6289, 6289,
+ 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 4162,
+ 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4162,
+ 4162, 5786, 5786, 5786, 5786, 5786, 5786, 5786, 5786, 5786,
+
+ 5786, 5786, 5786, 5787, 5787, 5787, 5787, 5787, 5787, 5787,
+ 5787, 5787, 5787, 5787, 5787, 5172, 5172, 5172, 5172, 5172,
+ 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5790, 5790, 5790,
+ 5790, 5790, 5790, 5790, 5790, 5790, 5790, 5790, 5790, 5793,
+ 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793,
+ 5793, 6292, 6292, 6292, 6292, 6292, 6292, 6292, 6292, 6292,
+ 6292, 6292, 6292, 5802, 5802, 5802, 5802, 5802, 5802, 5802,
+ 5802, 5802, 5802, 5802, 5802, 4627, 4627, 4627, 4627, 4627,
+ 4627, 4627, 4627, 4627, 4627, 4627, 4627, 5190, 5190, 5190,
+ 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5807,
+
+ 5807, 5807, 5807, 5807, 5807, 5807, 5807, 5807, 5807, 5807,
+ 5807, 6303, 6303, 6303, 6303, 6303, 6303, 6303, 6303, 6303,
+ 6303, 6303, 6303, 6306, 6306, 6306, 6306, 6306, 6306, 6306,
+ 6306, 6306, 6306, 6306, 6306, 4633, 4633, 4633, 4633, 4633,
+ 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4180, 4180, 4180,
+ 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819,
+ 5819, 6316, 6316, 6316, 6316, 6316, 6316, 6316, 6316, 6316,
+ 6316, 6316, 6316, 6319, 6319, 6319, 6319, 6319, 6319, 6319,
+ 6319, 6319, 6319, 6319, 6319, 5209, 5209, 5209, 5209, 5209,
+
+ 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5827, 5827, 5827,
+ 5827, 5827, 5827, 5827, 5827, 5827, 5827, 5827, 5827, 6328,
+ 6328, 6328, 6328, 6328, 6328, 6328, 6328, 6328, 6328, 6328,
+ 6328, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215,
+ 5215, 5215, 5215, 5833, 5833, 5833, 5833, 5833, 5833, 5833,
+ 5833, 5833, 5833, 5833, 5833, 5837, 5837, 5837, 5837, 5837,
+ 5837, 5837, 5837, 5837, 5837, 5837, 5837, 6333, 6333, 6333,
+ 6333, 6333, 6333, 6333, 6333, 6333, 6333, 6333, 6333, 4656,
+ 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656,
+ 4656, 5849, 5849, 5849, 5849, 5849, 5849, 5849, 5849, 5849,
+
+ 5849, 5849, 5849, 5854, 5854, 5854, 5854, 5854, 5854, 5854,
+ 5854, 5854, 5854, 5854, 5854, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5857, 5857, 5857,
+ 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857, 4665,
+ 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665,
+ 4665, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 3364, 3364, 3364, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 4673, 4673, 4673,
+ 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4210,
+
+ 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210,
+ 4210, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2526, 2526, 2526, 2526, 2526,
+ 2526, 2526, 2526, 2526, 2526, 2526, 2526, 6370, 6370, 6370,
+ 6370, 6370, 6370, 6370, 6370, 6370, 6370, 6370, 6370, 5885,
+ 5885, 5885, 5885, 5885, 5885, 5885, 5885, 5885, 5885, 5885,
+ 5885, 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261,
+ 5261, 5261, 5261, 5888, 5888, 5888, 5888, 5888, 5888, 5888,
+ 5888, 5888, 5888, 5888, 5888, 6371, 6371, 6371, 6371, 6371,
+
+ 6371, 6371, 6371, 6371, 6371, 6371, 6371, 6372, 6372, 6372,
+ 6372, 6372, 6372, 6372, 6372, 6372, 6372, 6372, 6372, 5894,
+ 5894, 5894, 5894, 5894, 5894, 5894, 5894, 5894, 5894, 5894,
+ 5894, 5895, 5895, 5895, 5895, 5895, 5895, 5895, 5895, 5895,
+ 5895, 5895, 5895, 5896, 5896, 5896, 5896, 5896, 5896, 5896,
+ 5896, 5896, 5896, 5896, 5896, 5898, 5898, 5898, 5898, 5898,
+ 5898, 5898, 5898, 5898, 5898, 5898, 5898, 5899, 5899, 5899,
+ 5899, 5899, 5899, 5899, 5899, 5899, 5899, 5899, 5899, 6377,
+ 6377, 6377, 6377, 6377, 6377, 6377, 6377, 6377, 6377, 6377,
+ 6377, 5901, 5901, 5901, 5901, 5901, 5901, 5901, 5901, 5901,
+
+ 5901, 5901, 5901, 6380, 6380, 6380, 6380, 6380, 6380, 6380,
+ 6380, 6380, 6380, 6380, 6380, 6383, 6383, 6383, 6383, 6383,
+ 6383, 6383, 6383, 6383, 6383, 6383, 6383, 5276, 5276, 5276,
+ 5276, 5276, 5276, 5276, 5276, 5276, 5276, 5276, 5276, 4693,
+ 4693, 4693, 4693, 4693, 4693, 4693, 4693, 4693, 4693, 4693,
+ 4693, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 5909, 5909, 5909, 5909, 5909, 5909, 5909,
+ 5909, 5909, 5909, 5909, 5909, 6386, 6386, 6386, 6386, 6386,
+ 6386, 6386, 6386, 6386, 6386, 6386, 6386, 5911, 5911, 5911,
+ 5911, 5911, 5911, 5911, 5911, 5911, 5911, 5911, 5911, 6389,
+
+ 6389, 6389, 6389, 6389, 6389, 6389, 6389, 6389, 6389, 6389,
+ 6389, 5913, 5913, 5913, 5913, 5913, 5913, 5913, 5913, 5913,
+ 5913, 5913, 5913, 6392, 6392, 6392, 6392, 6392, 6392, 6392,
+ 6392, 6392, 6392, 6392, 6392, 6396, 6396, 6396, 6396, 6396,
+ 6396, 6396, 6396, 6396, 6396, 6396, 6396, 5917, 5917, 5917,
+ 5917, 5917, 5917, 5917, 5917, 5917, 5917, 5917, 5917, 6402,
+ 6402, 6402, 6402, 6402, 6402, 6402, 6402, 6402, 6402, 6402,
+ 6402, 5299, 5299, 5299, 5299, 5299, 5299, 5299, 5299, 5299,
+ 5299, 5299, 5299, 6405, 6405, 6405, 6405, 6405, 6405, 6405,
+ 6405, 6405, 6405, 6405, 6405, 4718, 4718, 4718, 4718, 4718,
+
+ 4718, 4718, 4718, 4718, 4718, 4718, 4718, 6408, 6408, 6408,
+ 6408, 6408, 6408, 6408, 6408, 6408, 6408, 6408, 6408, 4244,
+ 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244,
+ 4244, 6410, 6410, 6410, 6410, 6410, 6410, 6410, 6410, 6410,
+ 6410, 6410, 6410, 4246, 4246, 4246, 4246, 4246, 4246, 4246,
+ 4246, 4246, 4246, 4246, 4246, 5927, 5927, 5927, 5927, 5927,
+ 5927, 5927, 5927, 5927, 5927, 5927, 5927, 5928, 5928, 5928,
+ 5928, 5928, 5928, 5928, 5928, 5928, 5928, 5928, 5928, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316,
+ 5316, 5930, 5930, 5930, 5930, 5930, 5930, 5930, 5930, 5930,
+
+ 5930, 5930, 5930, 5933, 5933, 5933, 5933, 5933, 5933, 5933,
+ 5933, 5933, 5933, 5933, 5933, 6412, 6412, 6412, 6412, 6412,
+ 6412, 6412, 6412, 6412, 6412, 6412, 6412, 5942, 5942, 5942,
+ 5942, 5942, 5942, 5942, 5942, 5942, 5942, 5942, 5942, 4737,
+ 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737,
+ 4737, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334,
+ 5334, 5334, 5334, 5947, 5947, 5947, 5947, 5947, 5947, 5947,
+ 5947, 5947, 5947, 5947, 5947, 6423, 6423, 6423, 6423, 6423,
+ 6423, 6423, 6423, 6423, 6423, 6423, 6423, 6426, 6426, 6426,
+ 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 4743,
+
+ 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743,
+ 4743, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262,
+ 4262, 4262, 4262, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+ 4763, 4763, 4763, 4763, 4763, 4276, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4276, 4276, 4276, 4276, 4276, 3448, 3448, 3448,
+ 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964,
+ 2964, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573,
+ 2573, 2573, 2573, 4286, 4286, 4286, 4286, 4286, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 3881, 3881, 3881, 3881, 3881,
+
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 2984, 2984, 2984,
+ 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2581,
+ 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
+ 2581, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 4797, 4797, 4797, 4797, 4797, 4797, 4797,
+ 4797, 4797, 4797, 4797, 4797, 4304, 4304, 4304, 4304, 4304,
+ 4304, 4304, 4304, 4304, 4304, 4304, 4304, 3482, 3482, 3482,
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3005,
+ 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 4312, 4312, 4312, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4312, 3907, 3907, 3907, 3907, 3907,
+ 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3023, 3023, 3023,
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 2610,
+ 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610,
+ 2610, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 6012, 6012, 6012, 6012, 6012, 6012, 6012,
+ 6012, 6012, 6012, 6012, 6012, 5417, 5417, 5417, 5417, 5417,
+ 5417, 5417, 5417, 5417, 5417, 5417, 5417, 6015, 6015, 6015,
+ 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6478,
+
+ 6478, 6478, 6478, 6478, 6478, 6478, 6478, 6478, 6478, 6478,
+ 6478, 6023, 6023, 6023, 6023, 6023, 6023, 6023, 6023, 6023,
+ 6023, 6023, 6023, 4830, 4830, 4830, 4830, 4830, 4830, 4830,
+ 4830, 4830, 4830, 4830, 4830, 6027, 6027, 6027, 6027, 6027,
+ 6027, 6027, 6027, 6027, 6027, 6027, 6027, 6489, 6489, 6489,
+ 6489, 6489, 6489, 6489, 6489, 6489, 6489, 6489, 6489, 6492,
+ 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492,
+ 6492, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432,
+ 5432, 5432, 5432, 4835, 4835, 4835, 4835, 4835, 4835, 4835,
+ 4835, 4835, 4835, 4835, 4835, 4334, 4334, 4334, 4334, 4334,
+
+ 4334, 4334, 4334, 4334, 4334, 4334, 4334, 6039, 6039, 6039,
+ 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6501,
+ 6501, 6501, 6501, 6501, 6501, 6501, 6501, 6501, 6501, 6501,
+ 6501, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504,
+ 6504, 6504, 6504, 6045, 6045, 6045, 6045, 6045, 6045, 6045,
+ 6045, 6045, 6045, 6045, 6045, 6512, 6512, 6512, 6512, 6512,
+ 6512, 6512, 6512, 6512, 6512, 6512, 6512, 5450, 5450, 5450,
+ 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 6050,
+ 6050, 6050, 6050, 6050, 6050, 6050, 6050, 6050, 6050, 6050,
+ 6050, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455,
+
+ 5455, 5455, 5455, 6054, 6054, 6054, 6054, 6054, 6054, 6054,
+ 6054, 6054, 6054, 6054, 6054, 6516, 6516, 6516, 6516, 6516,
+ 6516, 6516, 6516, 6516, 6516, 6516, 6516, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 4856,
+ 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856,
+ 4856, 6065, 6065, 6065, 6065, 6065, 6065, 6065, 6065, 6065,
+ 6065, 6065, 6065, 6070, 6070, 6070, 6070, 6070, 6070, 6070,
+ 6070, 6070, 6070, 6070, 6070, 5468, 5468, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 5468, 6073, 6073, 6073,
+ 6073, 6073, 6073, 6073, 6073, 6073, 6073, 6073, 6073, 4864,
+
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864,
+ 4864, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931,
+ 3931, 3931, 3931, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3515, 3515, 3515, 3515, 3515, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 4872, 4872, 4872,
+ 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4362,
+ 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362,
+ 4362, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530,
+ 3530, 3530, 3530, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
+ 3050, 3050, 3050, 3050, 3050, 2634, 2634, 2634, 2634, 2634,
+
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 6098, 6098, 6098,
+ 6098, 6098, 6098, 6098, 6098, 6098, 6098, 6098, 6098, 5499,
+ 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499,
+ 5499, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101,
+ 6101, 6101, 6101, 6549, 6549, 6549, 6549, 6549, 6549, 6549,
+ 6549, 6549, 6549, 6549, 6549, 6109, 6109, 6109, 6109, 6109,
+ 6109, 6109, 6109, 6109, 6109, 6109, 6109, 4889, 4889, 4889,
+ 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 6113,
+ 6113, 6113, 6113, 6113, 6113, 6113, 6113, 6113, 6113, 6113,
+ 6113, 6560, 6560, 6560, 6560, 6560, 6560, 6560, 6560, 6560,
+
+ 6560, 6560, 6560, 6563, 6563, 6563, 6563, 6563, 6563, 6563,
+ 6563, 6563, 6563, 6563, 6563, 5514, 5514, 5514, 5514, 5514,
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 4894, 4894, 4894,
+ 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4381,
+ 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381,
+ 4381, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907,
+ 4907, 4907, 4907, 4389, 4389, 4389, 4389, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 4389, 3556, 3556, 3556, 3556, 3556,
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3069, 3069, 3069,
+ 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 2648,
+
+ 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
+ 2648, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 3980, 3980, 3980, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3980, 3980, 3980, 3084, 3084, 3084, 3084, 3084,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 2653, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2280,
+ 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4938, 4938, 4415, 4415, 4415, 4415, 4415, 4415, 4415,
+ 4415, 4415, 4415, 4415, 4415, 3585, 3585, 3585, 3585, 3585,
+
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423,
+ 4423, 4423, 4423, 4005, 4005, 4005, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 4005, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 6169, 6169, 6169, 6169, 6169, 6169, 6169, 6169, 6169,
+
+ 6169, 6169, 6169, 1381, 1381, 8693, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 6611, 6611, 6611, 6611, 6611,
+ 6611, 6611, 6611, 6611, 6611, 6611, 6611, 6613, 6613, 6613,
+ 6613, 6613, 6613, 6613, 6613, 6613, 6613, 6613, 6613, 4968,
+ 4968, 4968, 4968, 4968, 4968, 4968, 4968, 4968, 4968, 4968,
+ 4968, 6173, 6173, 6173, 6173, 6173, 6173, 6173, 6173, 6173,
+ 6173, 6173, 6173, 6176, 6176, 6176, 6176, 6176, 6176, 6176,
+ 6176, 6176, 6176, 6176, 6176, 1398, 1398, 1398, 1398, 1398,
+ 1398, 1398, 1398, 1398, 1398, 1398, 1398, 6616, 6616, 6616,
+ 6616, 6616, 6616, 6616, 6616, 6616, 6616, 6616, 6616, 6619,
+
+ 6619, 6619, 6619, 6619, 6619, 6619, 6619, 6619, 6619, 6619,
+ 6619, 4985, 4985, 4985, 4985, 4985, 4985, 4985, 4985, 4985,
+ 4985, 4985, 4985, 6181, 6181, 6181, 6181, 6181, 6181, 6181,
+ 6181, 6181, 6181, 6181, 6181, 6622, 6622, 6622, 6622, 6622,
+ 6622, 6622, 6622, 6622, 6622, 6622, 6622, 4473, 4473, 4473,
+ 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473, 4473, 6184,
+ 6184, 6184, 6184, 6184, 6184, 6184, 6184, 6184, 6184, 6184,
+ 6184, 6626, 6626, 6626, 6626, 6626, 6626, 6626, 6626, 6626,
+ 6626, 6626, 6626, 5626, 5626, 5626, 5626, 5626, 5626, 5626,
+ 5626, 5626, 5626, 5626, 5626, 6187, 6187, 6187, 6187, 6187,
+
+ 6187, 6187, 6187, 6187, 6187, 6187, 6187, 6628, 6628, 6628,
+ 6628, 6628, 6628, 6628, 6628, 6628, 6628, 6628, 6628, 4485,
+ 4485, 4485, 4485, 4485, 4485, 4485, 4485, 4485, 4485, 4485,
+ 4485, 6191, 6191, 6191, 6191, 6191, 6191, 6191, 6191, 6191,
+ 6191, 6191, 6191, 6633, 6633, 6633, 6633, 6633, 6633, 6633,
+ 6633, 6633, 6633, 6633, 6633, 5634, 5634, 5634, 5634, 5634,
+ 5634, 5634, 5634, 5634, 5634, 5634, 5634, 6195, 6195, 6195,
+ 6195, 6195, 6195, 6195, 6195, 6195, 6195, 6195, 6195, 5637,
+ 5637, 5637, 5637, 5637, 5637, 5637, 5637, 5637, 5637, 5637,
+ 5637, 6198, 6198, 6198, 6198, 6198, 6198, 6198, 6198, 6198,
+
+ 6198, 6198, 6198, 6636, 6636, 6636, 6636, 6636, 6636, 6636,
+ 6636, 6636, 6636, 6636, 6636, 6202, 6202, 6202, 6202, 6202,
+ 6202, 6202, 6202, 6202, 6202, 6202, 6202, 6204, 6204, 6204,
+ 6204, 6204, 6204, 6204, 6204, 6204, 6204, 6204, 6204, 6641,
+ 6641, 6641, 6641, 6641, 6641, 6641, 6641, 6641, 6641, 6641,
+ 6641, 6644, 6644, 6644, 6644, 6644, 6644, 6644, 6644, 6644,
+ 6644, 6644, 6644, 5024, 5024, 5024, 5024, 5024, 5024, 5024,
+ 5024, 5024, 5024, 5024, 5024, 6210, 6210, 6210, 6210, 6210,
+ 6210, 6210, 6210, 6210, 6210, 6210, 6210, 6647, 6647, 6647,
+ 6647, 6647, 6647, 6647, 6647, 6647, 6647, 6647, 6647, 6650,
+
+ 6650, 6650, 6650, 6650, 6650, 6650, 6650, 6650, 6650, 6650,
+ 6650, 6214, 6214, 6214, 6214, 6214, 6214, 6214, 6214, 6214,
+ 6214, 6214, 6214, 6654, 6654, 6654, 6654, 6654, 6654, 6654,
+ 6654, 6654, 6654, 6654, 6654, 5660, 5660, 5660, 5660, 5660,
+ 5660, 5660, 5660, 5660, 5660, 5660, 5660, 6217, 6217, 6217,
+ 6217, 6217, 6217, 6217, 6217, 6217, 6217, 6217, 6217, 5663,
+ 5663, 5663, 5663, 5663, 5663, 5663, 5663, 5663, 5663, 5663,
+ 5663, 6221, 6221, 6221, 6221, 6221, 6221, 6221, 6221, 6221,
+ 6221, 6221, 6221, 6656, 6656, 6656, 6656, 6656, 6656, 6656,
+ 6656, 6656, 6656, 6656, 6656, 368, 368, 368, 368, 368,
+
+ 368, 368, 368, 368, 368, 368, 368, 5041, 5041, 5041,
+ 5041, 5041, 5041, 5041, 5041, 5041, 5041, 5041, 5041, 6228,
+ 6228, 6228, 6228, 6228, 6228, 6228, 6228, 6228, 6228, 6228,
+ 6228, 6231, 6231, 6231, 6231, 6231, 6231, 6231, 6231, 6231,
+ 6231, 6231, 6231, 5672, 5672, 5672, 5672, 5672, 5672, 5672,
+ 5672, 5672, 5672, 5672, 5672, 6234, 6234, 6234, 6234, 6234,
+ 6234, 6234, 6234, 6234, 6234, 6234, 6234, 5047, 5047, 5047,
+ 5047, 5047, 5047, 5047, 5047, 5047, 5047, 5047, 5047, 5049,
+ 5049, 5049, 5049, 5049, 5049, 5049, 5049, 5049, 5049, 5049,
+ 5049, 6241, 6241, 6241, 6241, 6241, 6241, 6241, 6241, 6241,
+
+ 6241, 6241, 6241, 5689, 5689, 5689, 5689, 5689, 5689, 5689,
+ 5689, 5689, 5689, 5689, 5689, 6244, 6244, 6244, 6244, 6244,
+ 6244, 6244, 6244, 6244, 6244, 6244, 6244, 6663, 6663, 6663,
+ 6663, 6663, 6663, 6663, 6663, 6663, 6663, 6663, 6663, 6248,
+ 6248, 6248, 6248, 6248, 6248, 6248, 6248, 6248, 6248, 6248,
+ 6248, 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250, 6250,
+ 6250, 6250, 6250, 6668, 6668, 6668, 6668, 6668, 6668, 6668,
+ 6668, 6668, 6668, 6668, 6668, 6671, 6671, 6671, 6671, 6671,
+ 6671, 6671, 6671, 6671, 6671, 6671, 6671, 5063, 5063, 5063,
+ 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5063, 5072,
+
+ 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072, 5072,
+ 5072, 5088, 5088, 5088, 5088, 5088, 5088, 5088, 5088, 5088,
+ 5088, 5088, 5088, 6258, 6258, 6258, 6258, 6258, 6258, 6258,
+ 6258, 6258, 6258, 6258, 6258, 6675, 6675, 6675, 6675, 6675,
+ 6675, 6675, 6675, 6675, 6675, 6675, 6675, 6677, 6677, 6677,
+ 6677, 6677, 6677, 6677, 6677, 6677, 6677, 6677, 6677, 5104,
+ 5104, 5104, 5104, 5104, 5104, 5104, 5104, 5104, 5104, 5104,
+ 5104, 6262, 6262, 6262, 6262, 6262, 6262, 6262, 6262, 6262,
+ 6262, 6262, 6262, 6680, 6680, 6680, 6680, 6680, 6680, 6680,
+ 6680, 6680, 6680, 6680, 6680, 6683, 6683, 6683, 6683, 6683,
+
+ 6683, 6683, 6683, 6683, 6683, 6683, 6683, 5117, 5117, 5117,
+ 5117, 5117, 5117, 5117, 5117, 5117, 5117, 5117, 5117, 6267,
+ 6267, 6267, 6267, 6267, 6267, 6267, 6267, 6267, 6267, 6267,
+ 6267, 5753, 5753, 5753, 5753, 5753, 5753, 5753, 5753, 5753,
+ 5753, 5753, 5753, 6270, 6270, 6270, 6270, 6270, 6270, 6270,
+ 6270, 6270, 6270, 6270, 6270, 6686, 6686, 6686, 6686, 6686,
+ 6686, 6686, 6686, 6686, 6686, 6686, 6686, 6273, 6273, 6273,
+ 6273, 6273, 6273, 6273, 6273, 6273, 6273, 6273, 6273, 6275,
+ 6275, 6275, 6275, 6275, 6275, 6275, 6275, 6275, 6275, 6275,
+ 6275, 6691, 6691, 6691, 6691, 6691, 6691, 6691, 6691, 6691,
+
+ 6691, 6691, 6691, 6694, 6694, 6694, 6694, 6694, 6694, 6694,
+ 6694, 6694, 6694, 6694, 6694, 5138, 5138, 5138, 5138, 5138,
+ 5138, 5138, 5138, 5138, 5138, 5138, 5138, 6281, 6281, 6281,
+ 6281, 6281, 6281, 6281, 6281, 6281, 6281, 6281, 6281, 6282,
+ 6282, 6282, 6282, 6282, 6282, 6282, 6282, 6282, 6282, 6282,
+ 6282, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286,
+ 6286, 6286, 6286, 6284, 6284, 6284, 6284, 6284, 6284, 6284,
+ 6284, 6284, 6284, 6284, 6284, 6697, 6697, 6697, 6697, 6697,
+ 6697, 6697, 6697, 6697, 6697, 6697, 6697, 6700, 6700, 6700,
+ 6700, 6700, 6700, 6700, 6700, 6700, 6700, 6700, 6700, 6288,
+
+ 6288, 6288, 6288, 6288, 6288, 6288, 6288, 6288, 6288, 6288,
+ 6288, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289,
+ 6289, 6289, 6289, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 5793, 5793, 5793, 5793, 5793,
+ 5793, 5793, 5793, 5793, 5793, 5793, 5793, 6292, 6292, 6292,
+ 6292, 6292, 6292, 6292, 6292, 6292, 6292, 6292, 6292, 6704,
+ 6704, 6704, 6704, 6704, 6704, 6704, 6704, 6704, 6704, 6704,
+ 6704, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706,
+ 6706, 6706, 6706, 5172, 5172, 5172, 5172, 5172, 5172, 5172,
+ 5172, 5172, 5172, 5172, 5172, 4627, 4627, 4627, 4627, 4627,
+
+ 4627, 4627, 4627, 4627, 4627, 4627, 4627, 6306, 6306, 6306,
+ 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6303,
+ 6303, 6303, 6303, 6303, 6303, 6303, 6303, 6303, 6303, 6303,
+ 6303, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714,
+ 6714, 6714, 6714, 6718, 6718, 6718, 6718, 6718, 6718, 6718,
+ 6718, 6718, 6718, 6718, 6718, 5190, 5190, 5190, 5190, 5190,
+ 5190, 5190, 5190, 5190, 5190, 5190, 5190, 4633, 4633, 4633,
+ 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4180,
+ 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180,
+ 4180, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819,
+
+ 5819, 5819, 5819, 6316, 6316, 6316, 6316, 6316, 6316, 6316,
+ 6316, 6316, 6316, 6316, 6316, 6319, 6319, 6319, 6319, 6319,
+ 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6729, 6729, 6729,
+ 6729, 6729, 6729, 6729, 6729, 6729, 6729, 6729, 6729, 6328,
+ 6328, 6328, 6328, 6328, 6328, 6328, 6328, 6328, 6328, 6328,
+ 6328, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209,
+ 5209, 5209, 5209, 5837, 5837, 5837, 5837, 5837, 5837, 5837,
+ 5837, 5837, 5837, 5837, 5837, 6333, 6333, 6333, 6333, 6333,
+ 6333, 6333, 6333, 6333, 6333, 6333, 6333, 6740, 6740, 6740,
+ 6740, 6740, 6740, 6740, 6740, 6740, 6740, 6740, 6740, 6743,
+
+ 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743,
+ 6743, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215,
+ 5215, 5215, 5215, 4656, 4656, 4656, 4656, 4656, 4656, 4656,
+ 4656, 4656, 4656, 4656, 4656, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 5230, 5230, 5230, 5230, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 3364, 3364, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2896, 2896, 2896, 2896, 4673, 4673, 4673, 4673, 4673,
+
+ 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4210, 4210, 4210,
+ 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
+ 3382, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2526, 2526, 2526, 2526, 2526, 6369, 6369, 6369, 6369, 6369,
+ 6369, 6369, 6369, 6369, 6369, 6369, 6369, 6370, 6370, 6370,
+ 6370, 6370, 6370, 6370, 6370, 6370, 6370, 6370, 6370, 6773,
+ 6773, 6773, 6773, 6773, 6773, 6773, 6773, 6773, 6773, 6773,
+ 6773, 6372, 6372, 6372, 6372, 6372, 6372, 6372, 6372, 6372,
+
+ 6372, 6372, 6372, 6774, 6774, 6774, 6774, 6774, 6774, 6774,
+ 6774, 6774, 6774, 6774, 6774, 6776, 6776, 6776, 6776, 6776,
+ 6776, 6776, 6776, 6776, 6776, 6776, 6776, 5888, 5888, 5888,
+ 5888, 5888, 5888, 5888, 5888, 5888, 5888, 5888, 5888, 6376,
+ 6376, 6376, 6376, 6376, 6376, 6376, 6376, 6376, 6376, 6376,
+ 6376, 6377, 6377, 6377, 6377, 6377, 6377, 6377, 6377, 6377,
+ 6377, 6377, 6377, 6383, 6383, 6383, 6383, 6383, 6383, 6383,
+ 6383, 6383, 6383, 6383, 6383, 6380, 6380, 6380, 6380, 6380,
+ 6380, 6380, 6380, 6380, 6380, 6380, 6380, 6778, 6778, 6778,
+ 6778, 6778, 6778, 6778, 6778, 6778, 6778, 6778, 6778, 6782,
+
+ 6782, 6782, 6782, 6782, 6782, 6782, 6782, 6782, 6782, 6782,
+ 6782, 6386, 6386, 6386, 6386, 6386, 6386, 6386, 6386, 6386,
+ 6386, 6386, 6386, 6786, 6786, 6786, 6786, 6786, 6786, 6786,
+ 6786, 6786, 6786, 6786, 6786, 6789, 6789, 6789, 6789, 6789,
+ 6789, 6789, 6789, 6789, 6789, 6789, 6789, 6389, 6389, 6389,
+ 6389, 6389, 6389, 6389, 6389, 6389, 6389, 6389, 6389, 6792,
+ 6792, 6792, 6792, 6792, 6792, 6792, 6792, 6792, 6792, 6792,
+ 6792, 5911, 5911, 5911, 5911, 5911, 5911, 5911, 5911, 5911,
+ 5911, 5911, 5911, 6392, 6392, 6392, 6392, 6392, 6392, 6392,
+ 6392, 6392, 6392, 6392, 6392, 5913, 5913, 5913, 5913, 5913,
+
+ 5913, 5913, 5913, 5913, 5913, 5913, 5913, 6396, 6396, 6396,
+ 6396, 6396, 6396, 6396, 6396, 6396, 6396, 6396, 6396, 6794,
+ 6794, 6794, 6794, 6794, 6794, 6794, 6794, 6794, 6794, 6794,
+ 6794, 368, 368, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 5299, 5299, 5299, 5299, 5299, 5299, 5299,
+ 5299, 5299, 5299, 5299, 5299, 6402, 6402, 6402, 6402, 6402,
+ 6402, 6402, 6402, 6402, 6402, 6402, 6402, 6801, 6801, 6801,
+ 6801, 6801, 6801, 6801, 6801, 6801, 6801, 6801, 6801, 4718,
+ 4718, 4718, 4718, 4718, 4718, 4718, 4718, 4718, 4718, 4718,
+ 4718, 6407, 6407, 6407, 6407, 6407, 6407, 6407, 6407, 6407,
+
+ 6407, 6407, 6407, 6408, 6408, 6408, 6408, 6408, 6408, 6408,
+ 6408, 6408, 6408, 6408, 6408, 6409, 6409, 6409, 6409, 6409,
+ 6409, 6409, 6409, 6409, 6409, 6409, 6409, 6410, 6410, 6410,
+ 6410, 6410, 6410, 6410, 6410, 6410, 6410, 6410, 6410, 5933,
+ 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933,
+ 5933, 6412, 6412, 6412, 6412, 6412, 6412, 6412, 6412, 6412,
+ 6412, 6412, 6412, 6802, 6802, 6802, 6802, 6802, 6802, 6802,
+ 6802, 6802, 6802, 6802, 6802, 6804, 6804, 6804, 6804, 6804,
+ 6804, 6804, 6804, 6804, 6804, 6804, 6804, 5316, 5316, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 4737,
+
+ 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737,
+ 4737, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426,
+ 6426, 6426, 6426, 6423, 6423, 6423, 6423, 6423, 6423, 6423,
+ 6423, 6423, 6423, 6423, 6423, 6812, 6812, 6812, 6812, 6812,
+ 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6816, 6816, 6816,
+ 6816, 6816, 6816, 6816, 6816, 6816, 6816, 6816, 6816, 5334,
+ 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334,
+ 5334, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743,
+ 4743, 4743, 4743, 4262, 4262, 4262, 4262, 4262, 4262, 4262,
+ 4262, 4262, 4262, 4262, 4262, 4763, 4763, 4763, 4763, 4763,
+
+ 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4276, 4276, 4276,
+ 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 3448,
+ 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3448, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2573, 2573, 2573, 2573, 2573, 2573, 2573,
+ 2573, 2573, 2573, 2573, 2573, 4286, 4286, 4286, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 4286, 4286, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 2984,
+ 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
+
+ 2581, 2581, 2581, 2228, 2228, 2228, 2228, 2228, 2228, 2228,
+ 2228, 2228, 2228, 2228, 2228, 4797, 4797, 4797, 4797, 4797,
+ 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4304, 4304, 4304,
+ 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 3482,
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482,
+ 3482, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 3005, 3005, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 4312, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4312, 4312, 4312, 3907, 3907, 3907,
+ 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3023,
+
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
+ 3023, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610, 2610,
+ 2610, 2610, 2610, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 6478, 6478, 6478, 6478, 6478,
+ 6478, 6478, 6478, 6478, 6478, 6478, 6478, 6859, 6859, 6859,
+ 6859, 6859, 6859, 6859, 6859, 6859, 6859, 6859, 6859, 6861,
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861,
+ 6861, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015,
+ 6015, 6015, 6015, 5417, 5417, 5417, 5417, 5417, 5417, 5417,
+ 5417, 5417, 5417, 5417, 5417, 4830, 4830, 4830, 4830, 4830,
+
+ 4830, 4830, 4830, 4830, 4830, 4830, 4830, 6492, 6492, 6492,
+ 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6489,
+ 6489, 6489, 6489, 6489, 6489, 6489, 6489, 6489, 6489, 6489,
+ 6489, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869,
+ 6869, 6869, 6869, 6873, 6873, 6873, 6873, 6873, 6873, 6873,
+ 6873, 6873, 6873, 6873, 6873, 5432, 5432, 5432, 5432, 5432,
+ 5432, 5432, 5432, 5432, 5432, 5432, 5432, 4835, 4835, 4835,
+ 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4334,
+ 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334,
+ 4334, 6501, 6501, 6501, 6501, 6501, 6501, 6501, 6501, 6501,
+
+ 6501, 6501, 6501, 6039, 6039, 6039, 6039, 6039, 6039, 6039,
+ 6039, 6039, 6039, 6039, 6039, 6504, 6504, 6504, 6504, 6504,
+ 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6883, 6883, 6883,
+ 6883, 6883, 6883, 6883, 6883, 6883, 6883, 6883, 6883, 6512,
+ 6512, 6512, 6512, 6512, 6512, 6512, 6512, 6512, 6512, 6512,
+ 6512, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450,
+ 5450, 5450, 5450, 6516, 6516, 6516, 6516, 6516, 6516, 6516,
+ 6516, 6516, 6516, 6516, 6516, 6894, 6894, 6894, 6894, 6894,
+ 6894, 6894, 6894, 6894, 6894, 6894, 6894, 6897, 6897, 6897,
+ 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6054,
+
+ 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054,
+ 6054, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455,
+ 5455, 5455, 5455, 4856, 4856, 4856, 4856, 4856, 4856, 4856,
+ 4856, 4856, 4856, 4856, 4856, 5468, 5468, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 5468, 4864, 4864, 4864,
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 3931,
+ 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931,
+ 3931, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3515, 3515, 3515, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3045, 4872, 4872, 4872, 4872, 4872,
+
+ 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4362, 4362, 4362,
+ 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 3530,
+ 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530,
+ 3530, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
+ 3050, 3050, 3050, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 6549, 6549, 6549, 6549, 6549,
+ 6549, 6549, 6549, 6549, 6549, 6549, 6549, 6925, 6925, 6925,
+ 6925, 6925, 6925, 6925, 6925, 6925, 6925, 6925, 6925, 6927,
+ 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6927,
+ 6927, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101,
+
+ 6101, 6101, 6101, 5499, 5499, 5499, 5499, 5499, 5499, 5499,
+ 5499, 5499, 5499, 5499, 5499, 4889, 4889, 4889, 4889, 4889,
+ 4889, 4889, 4889, 4889, 4889, 4889, 4889, 6563, 6563, 6563,
+ 6563, 6563, 6563, 6563, 6563, 6563, 6563, 6563, 6563, 6560,
+ 6560, 6560, 6560, 6560, 6560, 6560, 6560, 6560, 6560, 6560,
+ 6560, 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935,
+ 6935, 6935, 6935, 6939, 6939, 6939, 6939, 6939, 6939, 6939,
+ 6939, 6939, 6939, 6939, 6939, 5514, 5514, 5514, 5514, 5514,
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 4894, 4894, 4894,
+ 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4381,
+
+ 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381,
+ 4381, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907,
+ 4907, 4907, 4907, 4389, 4389, 4389, 4389, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 4389, 3556, 3556, 3556, 3556, 3556,
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3069, 3069, 3069,
+ 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 2648,
+ 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
+ 2648, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 3980, 3980, 3980, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3980, 3980, 3980, 3084, 3084, 3084, 3084, 3084,
+
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 2653, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2280,
+ 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280,
+ 2280, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4938, 4938, 4415, 4415, 4415, 4415, 4415, 4415, 4415,
+ 4415, 4415, 4415, 4415, 4415, 3585, 3585, 3585, 3585, 3585,
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423,
+
+ 4423, 4423, 4423, 4005, 4005, 4005, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 4005, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 3119, 3119, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 6613, 6613, 6613, 6613, 6613, 6613, 6613, 6613, 6613,
+ 6613, 6613, 6613, 6611, 6611, 6611, 6611, 6611, 6611, 6611,
+ 6611, 6611, 6611, 6611, 6611, 6981, 6981, 6981, 6981, 6981,
+ 6981, 6981, 6981, 6981, 6981, 6981, 6981, 6984, 6984, 6984,
+ 6984, 6984, 6984, 6984, 6984, 6984, 6984, 6984, 6984, 6619,
+
+ 6619, 6619, 6619, 6619, 6619, 6619, 6619, 6619, 6619, 6619,
+ 6619, 6616, 6616, 6616, 6616, 6616, 6616, 6616, 6616, 6616,
+ 6616, 6616, 6616, 6987, 6987, 6987, 6987, 6987, 6987, 6987,
+ 6987, 6987, 6987, 6987, 6987, 6991, 6991, 6991, 6991, 6991,
+ 6991, 6991, 6991, 6991, 6991, 6991, 6991, 6622, 6622, 6622,
+ 6622, 6622, 6622, 6622, 6622, 6622, 6622, 6622, 6622, 6181,
+ 6181, 6181, 6181, 6181, 6181, 6181, 6181, 6181, 6181, 6181,
+ 6181, 5626, 5626, 5626, 5626, 5626, 5626, 5626, 5626, 5626,
+ 5626, 5626, 5626, 6626, 6626, 6626, 6626, 6626, 6626, 6626,
+ 6626, 6626, 6626, 6626, 6626, 6628, 6628, 6628, 6628, 6628,
+
+ 6628, 6628, 6628, 6628, 6628, 6628, 6628, 6187, 6187, 6187,
+ 6187, 6187, 6187, 6187, 6187, 6187, 6187, 6187, 6187, 5634,
+ 5634, 5634, 5634, 5634, 5634, 5634, 5634, 5634, 5634, 5634,
+ 5634, 6633, 6633, 6633, 6633, 6633, 6633, 6633, 6633, 6633,
+ 6633, 6633, 6633, 6636, 6636, 6636, 6636, 6636, 6636, 6636,
+ 6636, 6636, 6636, 6636, 6636, 6997, 6997, 6997, 6997, 6997,
+ 6997, 6997, 6997, 6997, 6997, 6997, 6997, 6999, 6999, 6999,
+ 6999, 6999, 6999, 6999, 6999, 6999, 6999, 6999, 6999, 6644,
+ 6644, 6644, 6644, 6644, 6644, 6644, 6644, 6644, 6644, 6644,
+ 6644, 6641, 6641, 6641, 6641, 6641, 6641, 6641, 6641, 6641,
+
+ 6641, 6641, 6641, 7001, 7001, 7001, 7001, 7001, 7001, 7001,
+ 7001, 7001, 7001, 7001, 7001, 7005, 7005, 7005, 7005, 7005,
+ 7005, 7005, 7005, 7005, 7005, 7005, 7005, 6647, 6647, 6647,
+ 6647, 6647, 6647, 6647, 6647, 6647, 6647, 6647, 6647, 6210,
+ 6210, 6210, 6210, 6210, 6210, 6210, 6210, 6210, 6210, 6210,
+ 6210, 6650, 6650, 6650, 6650, 6650, 6650, 6650, 6650, 6650,
+ 6650, 6650, 6650, 7009, 7009, 7009, 7009, 7009, 7009, 7009,
+ 7009, 7009, 7009, 7009, 7009, 6654, 6654, 6654, 6654, 6654,
+ 6654, 6654, 6654, 6654, 6654, 6654, 6654, 6656, 6656, 6656,
+ 6656, 6656, 6656, 6656, 6656, 6656, 6656, 6656, 6656, 7014,
+
+ 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014, 7014,
+ 7014, 7017, 7017, 7017, 7017, 7017, 7017, 7017, 7017, 7017,
+ 7017, 7017, 7017, 5663, 5663, 5663, 5663, 5663, 5663, 5663,
+ 5663, 5663, 5663, 5663, 5663, 5672, 5672, 5672, 5672, 5672,
+ 5672, 5672, 5672, 5672, 5672, 5672, 5672, 6663, 6663, 6663,
+ 6663, 6663, 6663, 6663, 6663, 6663, 6663, 6663, 6663, 7020,
+ 7020, 7020, 7020, 7020, 7020, 7020, 7020, 7020, 7020, 7020,
+ 7020, 7022, 7022, 7022, 7022, 7022, 7022, 7022, 7022, 7022,
+ 7022, 7022, 7022, 6671, 6671, 6671, 6671, 6671, 6671, 6671,
+ 6671, 6671, 6671, 6671, 6671, 6668, 6668, 6668, 6668, 6668,
+
+ 6668, 6668, 6668, 6668, 6668, 6668, 6668, 7024, 7024, 7024,
+ 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7028,
+ 7028, 7028, 7028, 7028, 7028, 7028, 7028, 7028, 7028, 7028,
+ 7028, 6677, 6677, 6677, 6677, 6677, 6677, 6677, 6677, 6677,
+ 6677, 6677, 6677, 6675, 6675, 6675, 6675, 6675, 6675, 6675,
+ 6675, 6675, 6675, 6675, 6675, 7032, 7032, 7032, 7032, 7032,
+ 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7035, 7035, 7035,
+ 7035, 7035, 7035, 7035, 7035, 7035, 7035, 7035, 7035, 6683,
+ 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683,
+ 6683, 6680, 6680, 6680, 6680, 6680, 6680, 6680, 6680, 6680,
+
+ 6680, 6680, 6680, 7038, 7038, 7038, 7038, 7038, 7038, 7038,
+ 7038, 7038, 7038, 7038, 7038, 7042, 7042, 7042, 7042, 7042,
+ 7042, 7042, 7042, 7042, 7042, 7042, 7042, 6686, 6686, 6686,
+ 6686, 6686, 6686, 6686, 6686, 6686, 6686, 6686, 6686, 7046,
+ 7046, 7046, 7046, 7046, 7046, 7046, 7046, 7046, 7046, 7046,
+ 7046, 7048, 7048, 7048, 7048, 7048, 7048, 7048, 7048, 7048,
+ 7048, 7048, 7048, 6694, 6694, 6694, 6694, 6694, 6694, 6694,
+ 6694, 6694, 6694, 6694, 6694, 6691, 6691, 6691, 6691, 6691,
+ 6691, 6691, 6691, 6691, 6691, 6691, 6691, 7050, 7050, 7050,
+ 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7054,
+
+ 7054, 7054, 7054, 7054, 7054, 7054, 7054, 7054, 7054, 7054,
+ 7054, 6697, 6697, 6697, 6697, 6697, 6697, 6697, 6697, 6697,
+ 6697, 6697, 6697, 7058, 7058, 7058, 7058, 7058, 7058, 7058,
+ 7058, 7058, 7058, 7058, 7058, 5153, 5153, 5153, 5153, 5153,
+ 5153, 5153, 5153, 5153, 5153, 5153, 5153, 6700, 6700, 6700,
+ 6700, 6700, 6700, 6700, 6700, 6700, 6700, 6700, 6700, 7062,
+ 7062, 7062, 7062, 7062, 7062, 7062, 7062, 7062, 7062, 7062,
+ 7062, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286,
+ 6286, 6286, 6286, 368, 368, 368, 368, 368, 368, 368,
+ 368, 368, 368, 368, 368, 6704, 6704, 6704, 6704, 6704,
+
+ 6704, 6704, 6704, 6704, 6704, 6704, 6704, 7066, 7066, 7066,
+ 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 6706,
+ 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706,
+ 6706, 7069, 7069, 7069, 7069, 7069, 7069, 7069, 7069, 7069,
+ 7069, 7069, 7069, 5793, 5793, 5793, 5793, 5793, 5793, 5793,
+ 5793, 5793, 5793, 5793, 5793, 5172, 5172, 5172, 5172, 5172,
+ 5172, 5172, 5172, 5172, 5172, 5172, 5172, 4627, 4627, 4627,
+ 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 6714,
+ 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714,
+ 6714, 7078, 7078, 7078, 7078, 7078, 7078, 7078, 7078, 7078,
+
+ 7078, 7078, 7078, 5190, 5190, 5190, 5190, 5190, 5190, 5190,
+ 5190, 5190, 5190, 5190, 5190, 6718, 6718, 6718, 6718, 6718,
+ 6718, 6718, 6718, 6718, 6718, 6718, 6718, 7084, 7084, 7084,
+ 7084, 7084, 7084, 7084, 7084, 7084, 7084, 7084, 7084, 6306,
+ 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306,
+ 6306, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633,
+ 4633, 4633, 4633, 4180, 4180, 4180, 4180, 4180, 4180, 4180,
+ 4180, 4180, 4180, 4180, 4180, 6319, 6319, 6319, 6319, 6319,
+ 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6729, 6729, 6729,
+ 6729, 6729, 6729, 6729, 6729, 6729, 6729, 6729, 6729, 7097,
+
+ 7097, 7097, 7097, 7097, 7097, 7097, 7097, 7097, 7097, 7097,
+ 7097, 7099, 7099, 7099, 7099, 7099, 7099, 7099, 7099, 7099,
+ 7099, 7099, 7099, 5819, 5819, 5819, 5819, 5819, 5819, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5209, 5209, 5209, 5209, 5209,
+ 5209, 5209, 5209, 5209, 5209, 5209, 5209, 6743, 6743, 6743,
+ 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6740,
+ 6740, 6740, 6740, 6740, 6740, 6740, 6740, 6740, 6740, 6740,
+ 6740, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107,
+ 7107, 7107, 7107, 7111, 7111, 7111, 7111, 7111, 7111, 7111,
+ 7111, 7111, 7111, 7111, 7111, 5837, 5837, 5837, 5837, 5837,
+
+ 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5215, 5215, 5215,
+ 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 4656,
+ 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656,
+ 4656, 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 4665, 4665, 4665, 4665, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 4665, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3364, 3364, 3364,
+ 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 2896,
+ 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+ 2896, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673,
+
+ 4673, 4673, 4673, 4210, 4210, 4210, 4210, 4210, 4210, 4210,
+ 4210, 4210, 4210, 4210, 4210, 3382, 3382, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 2902, 2902, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2526,
+ 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526,
+ 2526, 6772, 6772, 6772, 6772, 6772, 6772, 6772, 6772, 6772,
+ 6772, 6772, 6772, 6773, 6773, 6773, 6773, 6773, 6773, 6773,
+ 6773, 6773, 6773, 6773, 6773, 6774, 6774, 6774, 6774, 6774,
+ 6774, 6774, 6774, 6774, 6774, 6774, 6774, 7137, 7137, 7137,
+ 7137, 7137, 7137, 7137, 7137, 7137, 7137, 7137, 7137, 6776,
+
+ 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776,
+ 6776, 7140, 7140, 7140, 7140, 7140, 7140, 7140, 7140, 7140,
+ 7140, 7140, 7140, 6778, 6778, 6778, 6778, 6778, 6778, 6778,
+ 6778, 6778, 6778, 6778, 6778, 7143, 7143, 7143, 7143, 7143,
+ 7143, 7143, 7143, 7143, 7143, 7143, 7143, 5276, 5276, 5276,
+ 5276, 5276, 5276, 5276, 5276, 5276, 5276, 5276, 5276, 6782,
+ 6782, 6782, 6782, 6782, 6782, 6782, 6782, 6782, 6782, 6782,
+ 6782, 7149, 7149, 7149, 7149, 7149, 7149, 7149, 7149, 7149,
+ 7149, 7149, 7149, 6383, 6383, 6383, 6383, 6383, 6383, 6383,
+ 6383, 6383, 6383, 6383, 6383, 6786, 6786, 6786, 6786, 6786,
+
+ 6786, 6786, 6786, 6786, 6786, 6786, 6786, 6386, 6386, 6386,
+ 6386, 6386, 6386, 6386, 6386, 6386, 6386, 6386, 6386, 6789,
+ 6789, 6789, 6789, 6789, 6789, 6789, 6789, 6789, 6789, 6789,
+ 6789, 7154, 7154, 7154, 7154, 7154, 7154, 7154, 7154, 7154,
+ 7154, 7154, 7154, 6792, 6792, 6792, 6792, 6792, 6792, 6792,
+ 6792, 6792, 6792, 6792, 6792, 6794, 6794, 6794, 6794, 6794,
+ 6794, 6794, 6794, 6794, 6794, 6794, 6794, 7159, 7159, 7159,
+ 7159, 7159, 7159, 7159, 7159, 7159, 7159, 7159, 7159, 7162,
+ 7162, 7162, 7162, 7162, 7162, 7162, 7162, 7162, 7162, 7162,
+ 7162, 5913, 5913, 5913, 5913, 5913, 5913, 5913, 5913, 5913,
+
+ 5913, 5913, 5913, 6800, 6800, 6800, 6800, 6800, 6800, 6800,
+ 6800, 6800, 6800, 6800, 6800, 6801, 6801, 6801, 6801, 6801,
+ 6801, 6801, 6801, 6801, 6801, 6801, 6801, 6802, 6802, 6802,
+ 6802, 6802, 6802, 6802, 6802, 6802, 6802, 6802, 6802, 7165,
+ 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165,
+ 7165, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804,
+ 6804, 6804, 6804, 7168, 7168, 7168, 7168, 7168, 7168, 7168,
+ 7168, 7168, 7168, 7168, 7168, 5933, 5933, 5933, 5933, 5933,
+ 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5316, 5316, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 4737,
+
+ 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737,
+ 4737, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812,
+ 6812, 6812, 6812, 7177, 7177, 7177, 7177, 7177, 7177, 7177,
+ 7177, 7177, 7177, 7177, 7177, 5334, 5334, 5334, 5334, 5334,
+ 5334, 5334, 5334, 5334, 5334, 5334, 5334, 6816, 6816, 6816,
+ 6816, 6816, 6816, 6816, 6816, 6816, 6816, 6816, 6816, 7183,
+ 7183, 7183, 7183, 7183, 7183, 7183, 7183, 7183, 7183, 7183,
+ 7183, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426,
+ 6426, 6426, 6426, 4743, 4743, 4743, 4743, 4743, 4743, 4743,
+ 4743, 4743, 4743, 4743, 4743, 4262, 4262, 4262, 4262, 4262,
+
+ 4262, 4262, 4262, 4262, 4262, 4262, 4262, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 4763,
+ 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+ 4763, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4276, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3448, 3448, 3448, 3448, 3448, 2964, 2964, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2573, 2573, 2573,
+ 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 4286,
+ 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286,
+ 4286, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881,
+
+ 3881, 3881, 3881, 2984, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2984, 2984, 2984, 2581, 2581, 2581, 2581, 2581,
+ 2581, 2581, 2581, 2581, 2581, 2581, 2581, 4797, 4797, 4797,
+ 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4304,
+ 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304,
+ 4304, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482,
+ 3482, 3482, 3482, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 3005, 3005, 3005, 3005, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 3907,
+
+ 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907,
+ 3907, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
+ 3023, 3023, 3023, 2610, 2610, 2610, 2610, 2610, 2610, 2610,
+ 2610, 2610, 2610, 2610, 2610, 6859, 6859, 6859, 6859, 6859,
+ 6859, 6859, 6859, 6859, 6859, 6859, 6859, 7221, 7221, 7221,
+ 7221, 7221, 7221, 7221, 7221, 7221, 7221, 7221, 7221, 6861,
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861,
+ 6861, 7224, 7224, 7224, 7224, 7224, 7224, 7224, 7224, 7224,
+ 7224, 7224, 7224, 6015, 6015, 6015, 6015, 6015, 6015, 6015,
+ 6015, 6015, 6015, 6015, 6015, 5417, 5417, 5417, 5417, 5417,
+
+ 5417, 5417, 5417, 5417, 5417, 5417, 5417, 4830, 4830, 4830,
+ 4830, 4830, 4830, 4830, 4830, 4830, 4830, 4830, 4830, 6869,
+ 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869,
+ 6869, 7233, 7233, 7233, 7233, 7233, 7233, 7233, 7233, 7233,
+ 7233, 7233, 7233, 5432, 5432, 5432, 5432, 5432, 5432, 5432,
+ 5432, 5432, 5432, 5432, 5432, 6873, 6873, 6873, 6873, 6873,
+ 6873, 6873, 6873, 6873, 6873, 6873, 6873, 7239, 7239, 7239,
+ 7239, 7239, 7239, 7239, 7239, 7239, 7239, 7239, 7239, 6492,
+ 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492,
+ 6492, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835,
+
+ 4835, 4835, 4835, 4334, 4334, 4334, 4334, 4334, 4334, 4334,
+ 4334, 4334, 4334, 4334, 4334, 6883, 6883, 6883, 6883, 6883,
+ 6883, 6883, 6883, 6883, 6883, 6883, 6883, 7251, 7251, 7251,
+ 7251, 7251, 7251, 7251, 7251, 7251, 7251, 7251, 7251, 7253,
+ 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253,
+ 7253, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504,
+ 6504, 6504, 6504, 6039, 6039, 6039, 6039, 6039, 6039, 6039,
+ 6039, 6039, 6039, 6039, 6039, 5450, 5450, 5450, 5450, 5450,
+ 5450, 5450, 5450, 5450, 5450, 5450, 5450, 6897, 6897, 6897,
+ 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6894,
+
+ 6894, 6894, 6894, 6894, 6894, 6894, 6894, 6894, 6894, 6894,
+ 6894, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261,
+ 7261, 7261, 7261, 7265, 7265, 7265, 7265, 7265, 7265, 7265,
+ 7265, 7265, 7265, 7265, 7265, 6054, 6054, 6054, 6054, 6054,
+ 6054, 6054, 6054, 6054, 6054, 6054, 6054, 5455, 5455, 5455,
+ 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 4856,
+ 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856,
+ 4856, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468,
+ 5468, 5468, 5468, 4864, 4864, 4864, 4864, 4864, 4864, 4864,
+ 4864, 4864, 4864, 4864, 4864, 3931, 3931, 3931, 3931, 3931,
+
+ 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3515, 3515, 3515,
+ 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3045,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872,
+ 4872, 4872, 4872, 4362, 4362, 4362, 4362, 4362, 4362, 4362,
+ 4362, 4362, 4362, 4362, 4362, 3530, 3530, 3530, 3530, 3530,
+ 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3050, 3050, 3050,
+ 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 6925, 6925, 6925, 6925, 6925, 6925, 6925, 6925, 6925,
+
+ 6925, 6925, 6925, 7291, 7291, 7291, 7291, 7291, 7291, 7291,
+ 7291, 7291, 7291, 7291, 7291, 6927, 6927, 6927, 6927, 6927,
+ 6927, 6927, 6927, 6927, 6927, 6927, 6927, 7294, 7294, 7294,
+ 7294, 7294, 7294, 7294, 7294, 7294, 7294, 7294, 7294, 6101,
+ 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101,
+ 6101, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499,
+ 5499, 5499, 5499, 4889, 4889, 4889, 4889, 4889, 4889, 4889,
+ 4889, 4889, 4889, 4889, 4889, 6935, 6935, 6935, 6935, 6935,
+ 6935, 6935, 6935, 6935, 6935, 6935, 6935, 7303, 7303, 7303,
+ 7303, 7303, 7303, 7303, 7303, 7303, 7303, 7303, 7303, 5514,
+
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514,
+ 5514, 6939, 6939, 6939, 6939, 6939, 6939, 6939, 6939, 6939,
+ 6939, 6939, 6939, 7309, 7309, 7309, 7309, 7309, 7309, 7309,
+ 7309, 7309, 7309, 7309, 7309, 6563, 6563, 6563, 6563, 6563,
+ 6563, 6563, 6563, 6563, 6563, 6563, 6563, 4894, 4894, 4894,
+ 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4381,
+ 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381,
+ 4381, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907,
+ 4907, 4907, 4907, 4389, 4389, 4389, 4389, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 4389, 3556, 3556, 3556, 3556, 3556,
+
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3069, 3069, 3069,
+ 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 2648,
+ 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
+ 2648, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 3980, 3980, 3980, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3980, 3980, 3980, 3084, 3084, 3084, 3084, 3084,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 2653, 2653, 2653,
+ 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 2653, 4938,
+ 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415,
+
+ 4415, 4415, 4415, 3585, 3585, 3585, 3585, 3585, 3585, 3585,
+ 3585, 3585, 3585, 3585, 3585, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672, 4423,
+ 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423,
+ 4423, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 3119, 3119, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 6981, 6981, 6981,
+ 6981, 6981, 6981, 6981, 6981, 6981, 6981, 6981, 6981, 7345,
+
+ 7345, 7345, 7345, 7345, 7345, 7345, 7345, 7345, 7345, 7345,
+ 7345, 5589, 5589, 5589, 5589, 5589, 5589, 5589, 5589, 5589,
+ 5589, 5589, 5589, 6984, 6984, 6984, 6984, 6984, 6984, 6984,
+ 6984, 6984, 6984, 6984, 6984, 7349, 7349, 7349, 7349, 7349,
+ 7349, 7349, 7349, 7349, 7349, 7349, 7349, 7351, 7351, 7351,
+ 7351, 7351, 7351, 7351, 7351, 7351, 7351, 7351, 7351, 6987,
+ 6987, 6987, 6987, 6987, 6987, 6987, 6987, 6987, 6987, 6987,
+ 6987, 7353, 7353, 7353, 7353, 7353, 7353, 7353, 7353, 7353,
+ 7353, 7353, 7353, 5608, 5608, 5608, 5608, 5608, 5608, 5608,
+ 5608, 5608, 5608, 5608, 5608, 6991, 6991, 6991, 6991, 6991,
+
+ 6991, 6991, 6991, 6991, 6991, 6991, 6991, 7358, 7358, 7358,
+ 7358, 7358, 7358, 7358, 7358, 7358, 7358, 7358, 7358, 7361,
+ 7361, 7361, 7361, 7361, 7361, 7361, 7361, 7361, 7361, 7361,
+ 7361, 6181, 6181, 6181, 6181, 6181, 6181, 6181, 6181, 6181,
+ 6181, 6181, 6181, 6187, 6187, 6187, 6187, 6187, 6187, 6187,
+ 6187, 6187, 6187, 6187, 6187, 6997, 6997, 6997, 6997, 6997,
+ 6997, 6997, 6997, 6997, 6997, 6997, 6997, 7363, 7363, 7363,
+ 7363, 7363, 7363, 7363, 7363, 7363, 7363, 7363, 7363, 6999,
+ 6999, 6999, 6999, 6999, 6999, 6999, 6999, 6999, 6999, 6999,
+ 6999, 7366, 7366, 7366, 7366, 7366, 7366, 7366, 7366, 7366,
+
+ 7366, 7366, 7366, 7001, 7001, 7001, 7001, 7001, 7001, 7001,
+ 7001, 7001, 7001, 7001, 7001, 7369, 7369, 7369, 7369, 7369,
+ 7369, 7369, 7369, 7369, 7369, 7369, 7369, 5648, 5648, 5648,
+ 5648, 5648, 5648, 5648, 5648, 5648, 5648, 5648, 5648, 7005,
+ 7005, 7005, 7005, 7005, 7005, 7005, 7005, 7005, 7005, 7005,
+ 7005, 7375, 7375, 7375, 7375, 7375, 7375, 7375, 7375, 7375,
+ 7375, 7375, 7375, 6644, 6644, 6644, 6644, 6644, 6644, 6644,
+ 6644, 6644, 6644, 6644, 6644, 7009, 7009, 7009, 7009, 7009,
+ 7009, 7009, 7009, 7009, 7009, 7009, 7009, 7379, 7379, 7379,
+ 7379, 7379, 7379, 7379, 7379, 7379, 7379, 7379, 7379, 7381,
+
+ 7381, 7381, 7381, 7381, 7381, 7381, 7381, 7381, 7381, 7381,
+ 7381, 7017, 7017, 7017, 7017, 7017, 7017, 7017, 7017, 7017,
+ 7017, 7017, 7017, 7014, 7014, 7014, 7014, 7014, 7014, 7014,
+ 7014, 7014, 7014, 7014, 7014, 7383, 7383, 7383, 7383, 7383,
+ 7383, 7383, 7383, 7383, 7383, 7383, 7383, 7387, 7387, 7387,
+ 7387, 7387, 7387, 7387, 7387, 7387, 7387, 7387, 7387, 7020,
+ 7020, 7020, 7020, 7020, 7020, 7020, 7020, 7020, 7020, 7020,
+ 7020, 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7391,
+ 7391, 7391, 7391, 7022, 7022, 7022, 7022, 7022, 7022, 7022,
+ 7022, 7022, 7022, 7022, 7022, 7394, 7394, 7394, 7394, 7394,
+
+ 7394, 7394, 7394, 7394, 7394, 7394, 7394, 7024, 7024, 7024,
+ 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7397,
+ 7397, 7397, 7397, 7397, 7397, 7397, 7397, 7397, 7397, 7397,
+ 7397, 5700, 5700, 5700, 5700, 5700, 5700, 5700, 5700, 5700,
+ 5700, 5700, 5700, 7028, 7028, 7028, 7028, 7028, 7028, 7028,
+ 7028, 7028, 7028, 7028, 7028, 7403, 7403, 7403, 7403, 7403,
+ 7403, 7403, 7403, 7403, 7403, 7403, 7403, 6671, 6671, 6671,
+ 6671, 6671, 6671, 6671, 6671, 6671, 6671, 6671, 6671, 7032,
+ 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7032,
+ 7032, 7407, 7407, 7407, 7407, 7407, 7407, 7407, 7407, 7407,
+
+ 7407, 7407, 7407, 5731, 5731, 5731, 5731, 5731, 5731, 5731,
+ 5731, 5731, 5731, 5731, 5731, 7035, 7035, 7035, 7035, 7035,
+ 7035, 7035, 7035, 7035, 7035, 7035, 7035, 7411, 7411, 7411,
+ 7411, 7411, 7411, 7411, 7411, 7411, 7411, 7411, 7411, 6677,
+ 6677, 6677, 6677, 6677, 6677, 6677, 6677, 6677, 6677, 6677,
+ 6677, 7038, 7038, 7038, 7038, 7038, 7038, 7038, 7038, 7038,
+ 7038, 7038, 7038, 7413, 7413, 7413, 7413, 7413, 7413, 7413,
+ 7413, 7413, 7413, 7413, 7413, 5743, 5743, 5743, 5743, 5743,
+ 5743, 5743, 5743, 5743, 5743, 5743, 5743, 7042, 7042, 7042,
+ 7042, 7042, 7042, 7042, 7042, 7042, 7042, 7042, 7042, 7418,
+
+ 7418, 7418, 7418, 7418, 7418, 7418, 7418, 7418, 7418, 7418,
+ 7418, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683,
+ 6683, 6683, 6683, 7046, 7046, 7046, 7046, 7046, 7046, 7046,
+ 7046, 7046, 7046, 7046, 7046, 7421, 7421, 7421, 7421, 7421,
+ 7421, 7421, 7421, 7421, 7421, 7421, 7421, 7048, 7048, 7048,
+ 7048, 7048, 7048, 7048, 7048, 7048, 7048, 7048, 7048, 7424,
+ 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7424,
+ 7424, 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7050,
+ 7050, 7050, 7050, 7427, 7427, 7427, 7427, 7427, 7427, 7427,
+ 7427, 7427, 7427, 7427, 7427, 5763, 5763, 5763, 5763, 5763,
+
+ 5763, 5763, 5763, 5763, 5763, 5763, 5763, 7054, 7054, 7054,
+ 7054, 7054, 7054, 7054, 7054, 7054, 7054, 7054, 7054, 7433,
+ 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433,
+ 7433, 6694, 6694, 6694, 6694, 6694, 6694, 6694, 6694, 6694,
+ 6694, 6694, 6694, 7058, 7058, 7058, 7058, 7058, 7058, 7058,
+ 7058, 7058, 7058, 7058, 7058, 6697, 6697, 6697, 6697, 6697,
+ 6697, 6697, 6697, 6697, 6697, 6697, 6697, 6286, 6286, 6286,
+ 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 7062,
+ 7062, 7062, 7062, 7062, 7062, 7062, 7062, 7062, 7062, 7062,
+ 7062, 7439, 7439, 7439, 7439, 7439, 7439, 7439, 7439, 7439,
+
+ 7439, 7439, 7439, 7066, 7066, 7066, 7066, 7066, 7066, 7066,
+ 7066, 7066, 7066, 7066, 7066, 7441, 7441, 7441, 7441, 7441,
+ 7441, 7441, 7441, 7441, 7441, 7441, 7441, 5793, 5793, 5793,
+ 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 7069,
+ 7069, 7069, 7069, 7069, 7069, 7069, 7069, 7069, 7069, 7069,
+ 7069, 7444, 7444, 7444, 7444, 7444, 7444, 7444, 7444, 7444,
+ 7444, 7444, 7444, 6706, 6706, 6706, 6706, 6706, 6706, 6706,
+ 6706, 6706, 6706, 6706, 6706, 5172, 5172, 5172, 5172, 5172,
+ 5172, 5172, 5172, 5172, 5172, 5172, 5172, 4627, 4627, 4627,
+ 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 7078,
+
+ 7078, 7078, 7078, 7078, 7078, 7078, 7078, 7078, 7078, 7078,
+ 7078, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714,
+ 6714, 6714, 6714, 6306, 6306, 6306, 6306, 6306, 6306, 6306,
+ 6306, 6306, 6306, 6306, 6306, 7084, 7084, 7084, 7084, 7084,
+ 7084, 7084, 7084, 7084, 7084, 7084, 7084, 5190, 5190, 5190,
+ 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 4633,
+ 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633,
+ 4633, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180,
+ 4180, 4180, 4180, 7097, 7097, 7097, 7097, 7097, 7097, 7097,
+ 7097, 7097, 7097, 7097, 7097, 7471, 7471, 7471, 7471, 7471,
+
+ 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7099, 7099, 7099,
+ 7099, 7099, 7099, 7099, 7099, 7099, 7099, 7099, 7099, 7474,
+ 7474, 7474, 7474, 7474, 7474, 7474, 7474, 7474, 7474, 7474,
+ 7474, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319,
+ 6319, 6319, 6319, 5819, 5819, 5819, 5819, 5819, 5819, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5209, 5209, 5209, 5209, 5209,
+ 5209, 5209, 5209, 5209, 5209, 5209, 5209, 7107, 7107, 7107,
+ 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7483,
+ 7483, 7483, 7483, 7483, 7483, 7483, 7483, 7483, 7483, 7483,
+ 7483, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837,
+
+ 5837, 5837, 5837, 7111, 7111, 7111, 7111, 7111, 7111, 7111,
+ 7111, 7111, 7111, 7111, 7111, 7489, 7489, 7489, 7489, 7489,
+ 7489, 7489, 7489, 7489, 7489, 7489, 7489, 6743, 6743, 6743,
+ 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743, 5215,
+ 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215,
+ 5215, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656,
+ 4656, 4656, 4656, 5230, 5230, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 5230, 5230, 4665, 4665, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 4665, 4665, 4665, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3364,
+
+ 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+ 3364, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896, 2896,
+ 2896, 2896, 2896, 4673, 4673, 4673, 4673, 4673, 4673, 4673,
+ 4673, 4673, 4673, 4673, 4673, 4210, 4210, 4210, 4210, 4210,
+ 4210, 4210, 4210, 4210, 4210, 4210, 4210, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 2902,
+ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902,
+ 2902, 7137, 7137, 7137, 7137, 7137, 7137, 7137, 7137, 7137,
+ 7137, 7137, 7137, 7514, 7514, 7514, 7514, 7514, 7514, 7514,
+ 7514, 7514, 7514, 7514, 7514, 5888, 5888, 5888, 5888, 5888,
+
+ 5888, 5888, 5888, 5888, 5888, 5888, 5888, 7140, 7140, 7140,
+ 7140, 7140, 7140, 7140, 7140, 7140, 7140, 7140, 7140, 7517,
+ 7517, 7517, 7517, 7517, 7517, 7517, 7517, 7517, 7517, 7517,
+ 7517, 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776,
+ 6776, 6776, 6776, 7143, 7143, 7143, 7143, 7143, 7143, 7143,
+ 7143, 7143, 7143, 7143, 7143, 6778, 6778, 6778, 6778, 6778,
+ 6778, 6778, 6778, 6778, 6778, 6778, 6778, 6383, 6383, 6383,
+ 6383, 6383, 6383, 6383, 6383, 6383, 6383, 6383, 6383, 7149,
+ 7149, 7149, 7149, 7149, 7149, 7149, 7149, 7149, 7149, 7149,
+ 7149, 7525, 7525, 7525, 7525, 7525, 7525, 7525, 7525, 7525,
+
+ 7525, 7525, 7525, 7154, 7154, 7154, 7154, 7154, 7154, 7154,
+ 7154, 7154, 7154, 7154, 7154, 7527, 7527, 7527, 7527, 7527,
+ 7527, 7527, 7527, 7527, 7527, 7527, 7527, 7529, 7529, 7529,
+ 7529, 7529, 7529, 7529, 7529, 7529, 7529, 7529, 7529, 7162,
+ 7162, 7162, 7162, 7162, 7162, 7162, 7162, 7162, 7162, 7162,
+ 7162, 7159, 7159, 7159, 7159, 7159, 7159, 7159, 7159, 7159,
+ 7159, 7159, 7159, 7531, 7531, 7531, 7531, 7531, 7531, 7531,
+ 7531, 7531, 7531, 7531, 7531, 7535, 7535, 7535, 7535, 7535,
+ 7535, 7535, 7535, 7535, 7535, 7535, 7535, 7165, 7165, 7165,
+ 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7539,
+
+ 7539, 7539, 7539, 7539, 7539, 7539, 7539, 7539, 7539, 7539,
+ 7539, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933,
+ 5933, 5933, 5933, 7168, 7168, 7168, 7168, 7168, 7168, 7168,
+ 7168, 7168, 7168, 7168, 7168, 7542, 7542, 7542, 7542, 7542,
+ 7542, 7542, 7542, 7542, 7542, 7542, 7542, 6804, 6804, 6804,
+ 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316,
+ 5316, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737,
+ 4737, 4737, 4737, 7177, 7177, 7177, 7177, 7177, 7177, 7177,
+ 7177, 7177, 7177, 7177, 7177, 6812, 6812, 6812, 6812, 6812,
+
+ 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6426, 6426, 6426,
+ 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 7183,
+ 7183, 7183, 7183, 7183, 7183, 7183, 7183, 7183, 7183, 7183,
+ 7183, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334,
+ 5334, 5334, 5334, 4743, 4743, 4743, 4743, 4743, 4743, 4743,
+ 4743, 4743, 4743, 4743, 4743, 4262, 4262, 4262, 4262, 4262,
+ 4262, 4262, 4262, 4262, 4262, 4262, 4262, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 368, 368, 4763,
+ 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+ 4763, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+
+ 4276, 4276, 4276, 3448, 3448, 3448, 3448, 3448, 3448, 3448,
+ 3448, 3448, 3448, 3448, 3448, 2964, 2964, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 4286, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881,
+ 3881, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2984, 4797, 4797, 4797, 4797, 4797, 4797, 4797,
+ 4797, 4797, 4797, 4797, 4797, 4304, 4304, 4304, 4304, 4304,
+ 4304, 4304, 4304, 4304, 4304, 4304, 4304, 3482, 3482, 3482,
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3005,
+
+ 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,
+ 3005, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 3907, 3907, 3907, 3907, 3907, 3907, 3907,
+ 3907, 3907, 3907, 3907, 3907, 3023, 3023, 3023, 3023, 3023,
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 7221, 7221, 7221,
+ 7221, 7221, 7221, 7221, 7221, 7221, 7221, 7221, 7221, 7587,
+ 7587, 7587, 7587, 7587, 7587, 7587, 7587, 7587, 7587, 7587,
+ 7587, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015,
+ 6015, 6015, 6015, 7224, 7224, 7224, 7224, 7224, 7224, 7224,
+ 7224, 7224, 7224, 7224, 7224, 7590, 7590, 7590, 7590, 7590,
+
+ 7590, 7590, 7590, 7590, 7590, 7590, 7590, 6861, 6861, 6861,
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 5417,
+ 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417,
+ 5417, 4830, 4830, 4830, 4830, 4830, 4830, 4830, 4830, 4830,
+ 4830, 4830, 4830, 7233, 7233, 7233, 7233, 7233, 7233, 7233,
+ 7233, 7233, 7233, 7233, 7233, 6869, 6869, 6869, 6869, 6869,
+ 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6492, 6492, 6492,
+ 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 7239,
+ 7239, 7239, 7239, 7239, 7239, 7239, 7239, 7239, 7239, 7239,
+ 7239, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432,
+
+ 5432, 5432, 5432, 4835, 4835, 4835, 4835, 4835, 4835, 4835,
+ 4835, 4835, 4835, 4835, 4835, 4334, 4334, 4334, 4334, 4334,
+ 4334, 4334, 4334, 4334, 4334, 4334, 4334, 7251, 7251, 7251,
+ 7251, 7251, 7251, 7251, 7251, 7251, 7251, 7251, 7251, 7614,
+ 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7614,
+ 7614, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253,
+ 7253, 7253, 7253, 7617, 7617, 7617, 7617, 7617, 7617, 7617,
+ 7617, 7617, 7617, 7617, 7617, 6504, 6504, 6504, 6504, 6504,
+ 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6039, 6039, 6039,
+ 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 5450,
+
+ 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450,
+ 5450, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261,
+ 7261, 7261, 7261, 7626, 7626, 7626, 7626, 7626, 7626, 7626,
+ 7626, 7626, 7626, 7626, 7626, 6054, 6054, 6054, 6054, 6054,
+ 6054, 6054, 6054, 6054, 6054, 6054, 6054, 7265, 7265, 7265,
+ 7265, 7265, 7265, 7265, 7265, 7265, 7265, 7265, 7265, 7632,
+ 7632, 7632, 7632, 7632, 7632, 7632, 7632, 7632, 7632, 7632,
+ 7632, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897,
+ 6897, 6897, 6897, 5455, 5455, 5455, 5455, 5455, 5455, 5455,
+ 5455, 5455, 5455, 5455, 5455, 4856, 4856, 4856, 4856, 4856,
+
+ 4856, 4856, 4856, 4856, 4856, 4856, 4856, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 4864,
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864,
+ 4864, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931,
+ 3931, 3931, 3931, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3515, 3515, 3515, 3515, 3515, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 4872, 4872, 4872,
+ 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4362,
+ 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362,
+ 4362, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530,
+
+ 3530, 3530, 3530, 3050, 3050, 3050, 3050, 3050, 3050, 3050,
+ 3050, 3050, 3050, 3050, 3050, 7291, 7291, 7291, 7291, 7291,
+ 7291, 7291, 7291, 7291, 7291, 7291, 7291, 7656, 7656, 7656,
+ 7656, 7656, 7656, 7656, 7656, 7656, 7656, 7656, 7656, 6101,
+ 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101,
+ 6101, 7294, 7294, 7294, 7294, 7294, 7294, 7294, 7294, 7294,
+ 7294, 7294, 7294, 7659, 7659, 7659, 7659, 7659, 7659, 7659,
+ 7659, 7659, 7659, 7659, 7659, 6927, 6927, 6927, 6927, 6927,
+ 6927, 6927, 6927, 6927, 6927, 6927, 6927, 5499, 5499, 5499,
+ 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 4889,
+
+ 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889,
+ 4889, 7303, 7303, 7303, 7303, 7303, 7303, 7303, 7303, 7303,
+ 7303, 7303, 7303, 6935, 6935, 6935, 6935, 6935, 6935, 6935,
+ 6935, 6935, 6935, 6935, 6935, 6563, 6563, 6563, 6563, 6563,
+ 6563, 6563, 6563, 6563, 6563, 6563, 6563, 7309, 7309, 7309,
+ 7309, 7309, 7309, 7309, 7309, 7309, 7309, 7309, 7309, 5514,
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514,
+ 5514, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894,
+ 4894, 4894, 4894, 4381, 4381, 4381, 4381, 4381, 4381, 4381,
+ 4381, 4381, 4381, 4381, 4381, 4907, 4907, 4907, 4907, 4907,
+
+ 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 3556,
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556,
+ 3556, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069, 3069,
+ 3069, 3069, 3069, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 4397, 4397, 3980, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3084, 3084, 3084,
+ 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 4938,
+ 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415,
+
+ 4415, 4415, 4415, 3585, 3585, 3585, 3585, 3585, 3585, 3585,
+ 3585, 3585, 3585, 3585, 3585, 3104, 3104, 3104, 3104, 3104,
+ 3104, 3104, 3104, 3104, 3104, 3104, 3104, 4423, 4423, 4423,
+ 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4005,
+ 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005,
+ 4005, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119, 3119,
+ 3119, 3119, 3119, 7345, 7345, 7345, 7345, 7345, 7345, 7345,
+ 7345, 7345, 7345, 7345, 7345, 7701, 7701, 7701, 7701, 7701,
+ 7701, 7701, 7701, 7701, 7701, 7701, 7701, 7351, 7351, 7351,
+ 7351, 7351, 7351, 7351, 7351, 7351, 7351, 7351, 7351, 7349,
+
+ 7349, 7349, 7349, 7349, 7349, 7349, 7349, 7349, 7349, 7349,
+ 7349, 6613, 6613, 6613, 6613, 6613, 6613, 6613, 6613, 6613,
+ 6613, 6613, 6613, 6984, 6984, 6984, 6984, 6984, 6984, 6984,
+ 6984, 6984, 6984, 6984, 6984, 7353, 7353, 7353, 7353, 7353,
+ 7353, 7353, 7353, 7353, 7353, 7353, 7353, 7705, 7705, 7705,
+ 7705, 7705, 7705, 7705, 7705, 7705, 7705, 7705, 7705, 7361,
+ 7361, 7361, 7361, 7361, 7361, 7361, 7361, 7361, 7361, 7361,
+ 7361, 7358, 7358, 7358, 7358, 7358, 7358, 7358, 7358, 7358,
+ 7358, 7358, 7358, 6619, 6619, 6619, 6619, 6619, 6619, 6619,
+ 6619, 6619, 6619, 6619, 6619, 6991, 6991, 6991, 6991, 6991,
+
+ 6991, 6991, 6991, 6991, 6991, 6991, 6991, 7363, 7363, 7363,
+ 7363, 7363, 7363, 7363, 7363, 7363, 7363, 7363, 7363, 7709,
+ 7709, 7709, 7709, 7709, 7709, 7709, 7709, 7709, 7709, 7709,
+ 7709, 6198, 6198, 6198, 6198, 6198, 6198, 6198, 6198, 6198,
+ 6198, 6198, 6198, 7366, 7366, 7366, 7366, 7366, 7366, 7366,
+ 7366, 7366, 7366, 7366, 7366, 7712, 7712, 7712, 7712, 7712,
+ 7712, 7712, 7712, 7712, 7712, 7712, 7712, 6999, 6999, 6999,
+ 6999, 6999, 6999, 6999, 6999, 6999, 6999, 6999, 6999, 7369,
+ 7369, 7369, 7369, 7369, 7369, 7369, 7369, 7369, 7369, 7369,
+ 7369, 7001, 7001, 7001, 7001, 7001, 7001, 7001, 7001, 7001,
+
+ 7001, 7001, 7001, 6644, 6644, 6644, 6644, 6644, 6644, 6644,
+ 6644, 6644, 6644, 6644, 6644, 7375, 7375, 7375, 7375, 7375,
+ 7375, 7375, 7375, 7375, 7375, 7375, 7375, 7379, 7379, 7379,
+ 7379, 7379, 7379, 7379, 7379, 7379, 7379, 7379, 7379, 7718,
+ 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718,
+ 7718, 7381, 7381, 7381, 7381, 7381, 7381, 7381, 7381, 7381,
+ 7381, 7381, 7381, 7721, 7721, 7721, 7721, 7721, 7721, 7721,
+ 7721, 7721, 7721, 7721, 7721, 7383, 7383, 7383, 7383, 7383,
+ 7383, 7383, 7383, 7383, 7383, 7383, 7383, 7724, 7724, 7724,
+ 7724, 7724, 7724, 7724, 7724, 7724, 7724, 7724, 7724, 6221,
+
+ 6221, 6221, 6221, 6221, 6221, 6221, 6221, 6221, 6221, 6221,
+ 6221, 7387, 7387, 7387, 7387, 7387, 7387, 7387, 7387, 7387,
+ 7387, 7387, 7387, 7730, 7730, 7730, 7730, 7730, 7730, 7730,
+ 7730, 7730, 7730, 7730, 7730, 7017, 7017, 7017, 7017, 7017,
+ 7017, 7017, 7017, 7017, 7017, 7017, 7017, 7391, 7391, 7391,
+ 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7734,
+ 7734, 7734, 7734, 7734, 7734, 7734, 7734, 7734, 7734, 7734,
+ 7734, 6244, 6244, 6244, 6244, 6244, 6244, 6244, 6244, 6244,
+ 6244, 6244, 6244, 7394, 7394, 7394, 7394, 7394, 7394, 7394,
+ 7394, 7394, 7394, 7394, 7394, 7737, 7737, 7737, 7737, 7737,
+
+ 7737, 7737, 7737, 7737, 7737, 7737, 7737, 7022, 7022, 7022,
+ 7022, 7022, 7022, 7022, 7022, 7022, 7022, 7022, 7022, 7397,
+ 7397, 7397, 7397, 7397, 7397, 7397, 7397, 7397, 7397, 7397,
+ 7397, 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7024,
+ 7024, 7024, 7024, 6671, 6671, 6671, 6671, 6671, 6671, 6671,
+ 6671, 6671, 6671, 6671, 6671, 7403, 7403, 7403, 7403, 7403,
+ 7403, 7403, 7403, 7403, 7403, 7403, 7403, 7407, 7407, 7407,
+ 7407, 7407, 7407, 7407, 7407, 7407, 7407, 7407, 7407, 7032,
+ 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7032,
+ 7032, 6677, 6677, 6677, 6677, 6677, 6677, 6677, 6677, 6677,
+
+ 6677, 6677, 6677, 7411, 7411, 7411, 7411, 7411, 7411, 7411,
+ 7411, 7411, 7411, 7411, 7411, 7413, 7413, 7413, 7413, 7413,
+ 7413, 7413, 7413, 7413, 7413, 7413, 7413, 7038, 7038, 7038,
+ 7038, 7038, 7038, 7038, 7038, 7038, 7038, 7038, 7038, 6683,
+ 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683,
+ 6683, 7418, 7418, 7418, 7418, 7418, 7418, 7418, 7418, 7418,
+ 7418, 7418, 7418, 7421, 7421, 7421, 7421, 7421, 7421, 7421,
+ 7421, 7421, 7421, 7421, 7421, 7745, 7745, 7745, 7745, 7745,
+ 7745, 7745, 7745, 7745, 7745, 7745, 7745, 6270, 6270, 6270,
+ 6270, 6270, 6270, 6270, 6270, 6270, 6270, 6270, 6270, 7424,
+
+ 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7424,
+ 7424, 7748, 7748, 7748, 7748, 7748, 7748, 7748, 7748, 7748,
+ 7748, 7748, 7748, 7048, 7048, 7048, 7048, 7048, 7048, 7048,
+ 7048, 7048, 7048, 7048, 7048, 7427, 7427, 7427, 7427, 7427,
+ 7427, 7427, 7427, 7427, 7427, 7427, 7427, 7050, 7050, 7050,
+ 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7050, 6694,
+ 6694, 6694, 6694, 6694, 6694, 6694, 6694, 6694, 6694, 6694,
+ 6694, 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433,
+ 7433, 7433, 7433, 7752, 7752, 7752, 7752, 7752, 7752, 7752,
+ 7752, 7752, 7752, 7752, 7752, 6697, 6697, 6697, 6697, 6697,
+
+ 6697, 6697, 6697, 6697, 6697, 6697, 6697, 7755, 7755, 7755,
+ 7755, 7755, 7755, 7755, 7755, 7755, 7755, 7755, 7755, 6286,
+ 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286, 6286,
+ 6286, 7441, 7441, 7441, 7441, 7441, 7441, 7441, 7441, 7441,
+ 7441, 7441, 7441, 7066, 7066, 7066, 7066, 7066, 7066, 7066,
+ 7066, 7066, 7066, 7066, 7066, 7444, 7444, 7444, 7444, 7444,
+ 7444, 7444, 7444, 7444, 7444, 7444, 7444, 6706, 6706, 6706,
+ 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 5793,
+ 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793,
+ 5793, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172,
+
+ 5172, 5172, 5172, 4627, 4627, 4627, 4627, 4627, 4627, 4627,
+ 4627, 4627, 4627, 4627, 4627, 6714, 6714, 6714, 6714, 6714,
+ 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6306, 6306, 6306,
+ 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 5190,
+ 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190,
+ 5190, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633,
+ 4633, 4633, 4633, 4180, 4180, 4180, 4180, 4180, 4180, 4180,
+ 4180, 4180, 4180, 4180, 4180, 7471, 7471, 7471, 7471, 7471,
+ 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7780, 7780, 7780,
+ 7780, 7780, 7780, 7780, 7780, 7780, 7780, 7780, 7780, 6319,
+
+ 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319,
+ 6319, 7474, 7474, 7474, 7474, 7474, 7474, 7474, 7474, 7474,
+ 7474, 7474, 7474, 7783, 7783, 7783, 7783, 7783, 7783, 7783,
+ 7783, 7783, 7783, 7783, 7783, 7099, 7099, 7099, 7099, 7099,
+ 7099, 7099, 7099, 7099, 7099, 7099, 7099, 5819, 5819, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5209,
+ 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209,
+ 5209, 7483, 7483, 7483, 7483, 7483, 7483, 7483, 7483, 7483,
+ 7483, 7483, 7483, 7107, 7107, 7107, 7107, 7107, 7107, 7107,
+ 7107, 7107, 7107, 7107, 7107, 6743, 6743, 6743, 6743, 6743,
+
+ 6743, 6743, 6743, 6743, 6743, 6743, 6743, 7489, 7489, 7489,
+ 7489, 7489, 7489, 7489, 7489, 7489, 7489, 7489, 7489, 5837,
+ 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837,
+ 5837, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215,
+ 5215, 5215, 5215, 4656, 4656, 4656, 4656, 4656, 4656, 4656,
+ 4656, 4656, 4656, 4656, 4656, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 5230, 5230, 5230, 5230, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
+
+ 3364, 3364, 3364, 4673, 4673, 4673, 4673, 4673, 4673, 4673,
+ 4673, 4673, 4673, 4673, 4673, 4210, 4210, 4210, 4210, 4210,
+ 4210, 4210, 4210, 4210, 4210, 4210, 4210, 3382, 3382, 3382,
+ 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 3382, 7514,
+ 7514, 7514, 7514, 7514, 7514, 7514, 7514, 7514, 7514, 7514,
+ 7514, 7137, 7137, 7137, 7137, 7137, 7137, 7137, 7137, 7137,
+ 7137, 7137, 7137, 7517, 7517, 7517, 7517, 7517, 7517, 7517,
+ 7517, 7517, 7517, 7517, 7517, 7821, 7821, 7821, 7821, 7821,
+ 7821, 7821, 7821, 7821, 7821, 7821, 7821, 6776, 6776, 6776,
+ 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776, 7823,
+
+ 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823,
+ 7823, 6778, 6778, 6778, 6778, 6778, 6778, 6778, 6778, 6778,
+ 6778, 6778, 6778, 7826, 7826, 7826, 7826, 7826, 7826, 7826,
+ 7826, 7826, 7826, 7826, 7826, 6383, 6383, 6383, 6383, 6383,
+ 6383, 6383, 6383, 6383, 6383, 6383, 6383, 7527, 7527, 7527,
+ 7527, 7527, 7527, 7527, 7527, 7527, 7527, 7527, 7527, 7827,
+ 7827, 7827, 7827, 7827, 7827, 7827, 7827, 7827, 7827, 7827,
+ 7827, 7529, 7529, 7529, 7529, 7529, 7529, 7529, 7529, 7529,
+ 7529, 7529, 7529, 7830, 7830, 7830, 7830, 7830, 7830, 7830,
+ 7830, 7830, 7830, 7830, 7830, 7531, 7531, 7531, 7531, 7531,
+
+ 7531, 7531, 7531, 7531, 7531, 7531, 7531, 7833, 7833, 7833,
+ 7833, 7833, 7833, 7833, 7833, 7833, 7833, 7833, 7833, 6396,
+ 6396, 6396, 6396, 6396, 6396, 6396, 6396, 6396, 6396, 6396,
+ 6396, 7535, 7535, 7535, 7535, 7535, 7535, 7535, 7535, 7535,
+ 7535, 7535, 7535, 7839, 7839, 7839, 7839, 7839, 7839, 7839,
+ 7839, 7839, 7839, 7839, 7839, 7162, 7162, 7162, 7162, 7162,
+ 7162, 7162, 7162, 7162, 7162, 7162, 7162, 7539, 7539, 7539,
+ 7539, 7539, 7539, 7539, 7539, 7539, 7539, 7539, 7539, 7165,
+ 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165,
+ 7165, 7542, 7542, 7542, 7542, 7542, 7542, 7542, 7542, 7542,
+
+ 7542, 7542, 7542, 6804, 6804, 6804, 6804, 6804, 6804, 6804,
+ 6804, 6804, 6804, 6804, 6804, 5933, 5933, 5933, 5933, 5933,
+ 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5316, 5316, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 4737,
+ 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737,
+ 4737, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812,
+ 6812, 6812, 6812, 6426, 6426, 6426, 6426, 6426, 6426, 6426,
+ 6426, 6426, 6426, 6426, 6426, 5334, 5334, 5334, 5334, 5334,
+ 5334, 5334, 5334, 5334, 5334, 5334, 5334, 4743, 4743, 4743,
+ 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4262,
+
+ 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262,
+ 4262, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+ 4763, 4763, 4763, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4276, 4276, 4276, 3448, 3448, 3448, 3448, 3448,
+ 3448, 3448, 3448, 3448, 3448, 3448, 3448, 4286, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881,
+ 3881, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797,
+ 4797, 4797, 4797, 4304, 4304, 4304, 4304, 4304, 4304, 4304,
+ 4304, 4304, 4304, 4304, 4304, 3482, 3482, 3482, 3482, 3482,
+
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 3907,
+ 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907,
+ 3907, 7587, 7587, 7587, 7587, 7587, 7587, 7587, 7587, 7587,
+ 7587, 7587, 7587, 7221, 7221, 7221, 7221, 7221, 7221, 7221,
+ 7221, 7221, 7221, 7221, 7221, 7590, 7590, 7590, 7590, 7590,
+ 7590, 7590, 7590, 7590, 7590, 7590, 7590, 6861, 6861, 6861,
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6015,
+ 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015,
+ 6015, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417,
+
+ 5417, 5417, 5417, 4830, 4830, 4830, 4830, 4830, 4830, 4830,
+ 4830, 4830, 4830, 4830, 4830, 6869, 6869, 6869, 6869, 6869,
+ 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6492, 6492, 6492,
+ 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 5432,
+ 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432,
+ 5432, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835,
+ 4835, 4835, 4835, 4334, 4334, 4334, 4334, 4334, 4334, 4334,
+ 4334, 4334, 4334, 4334, 4334, 7614, 7614, 7614, 7614, 7614,
+ 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7903, 7903, 7903,
+ 7903, 7903, 7903, 7903, 7903, 7903, 7903, 7903, 7903, 6504,
+
+ 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504,
+ 6504, 7617, 7617, 7617, 7617, 7617, 7617, 7617, 7617, 7617,
+ 7617, 7617, 7617, 7906, 7906, 7906, 7906, 7906, 7906, 7906,
+ 7906, 7906, 7906, 7906, 7906, 7253, 7253, 7253, 7253, 7253,
+ 7253, 7253, 7253, 7253, 7253, 7253, 7253, 6039, 6039, 6039,
+ 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 5450,
+ 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450,
+ 5450, 7626, 7626, 7626, 7626, 7626, 7626, 7626, 7626, 7626,
+ 7626, 7626, 7626, 7261, 7261, 7261, 7261, 7261, 7261, 7261,
+ 7261, 7261, 7261, 7261, 7261, 6897, 6897, 6897, 6897, 6897,
+
+ 6897, 6897, 6897, 6897, 6897, 6897, 6897, 7632, 7632, 7632,
+ 7632, 7632, 7632, 7632, 7632, 7632, 7632, 7632, 7632, 6054,
+ 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054,
+ 6054, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455,
+ 5455, 5455, 5455, 4856, 4856, 4856, 4856, 4856, 4856, 4856,
+ 4856, 4856, 4856, 4856, 4856, 5468, 5468, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 5468, 4864, 4864, 4864,
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 3931,
+ 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931,
+ 3931, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+
+ 3515, 3515, 3515, 4872, 4872, 4872, 4872, 4872, 4872, 4872,
+ 4872, 4872, 4872, 4872, 4872, 4362, 4362, 4362, 4362, 4362,
+ 4362, 4362, 4362, 4362, 4362, 4362, 4362, 3530, 3530, 3530,
+ 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 3530, 7656,
+ 7656, 7656, 7656, 7656, 7656, 7656, 7656, 7656, 7656, 7656,
+ 7656, 7291, 7291, 7291, 7291, 7291, 7291, 7291, 7291, 7291,
+ 7291, 7291, 7291, 7659, 7659, 7659, 7659, 7659, 7659, 7659,
+ 7659, 7659, 7659, 7659, 7659, 6927, 6927, 6927, 6927, 6927,
+ 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6101, 6101, 6101,
+ 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 5499,
+
+ 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499,
+ 5499, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889,
+ 4889, 4889, 4889, 6935, 6935, 6935, 6935, 6935, 6935, 6935,
+ 6935, 6935, 6935, 6935, 6935, 6563, 6563, 6563, 6563, 6563,
+ 6563, 6563, 6563, 6563, 6563, 6563, 6563, 5514, 5514, 5514,
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 4894,
+ 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894,
+ 4894, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381,
+ 4381, 4381, 4381, 4907, 4907, 4907, 4907, 4907, 4907, 4907,
+ 4907, 4907, 4907, 4907, 4907, 4389, 4389, 4389, 4389, 4389,
+
+ 4389, 4389, 4389, 4389, 4389, 4389, 4389, 3556, 3556, 3556,
+ 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 3556, 4397,
+ 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3980, 4938, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4938, 4938, 4938, 4938, 4415, 4415, 4415, 4415, 4415,
+ 4415, 4415, 4415, 4415, 4415, 4415, 4415, 3585, 3585, 3585,
+ 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 3585, 4423,
+ 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423,
+ 4423, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005,
+
+ 4005, 4005, 4005, 6981, 6981, 6981, 6981, 6981, 6981, 6981,
+ 6981, 6981, 6981, 6981, 6981, 7345, 7345, 7345, 7345, 7345,
+ 7345, 7345, 7345, 7345, 7345, 7345, 7345, 5589, 5589, 5589,
+ 5589, 5589, 5589, 5589, 5589, 5589, 5589, 5589, 5589, 7701,
+ 7701, 7701, 7701, 7701, 7701, 7701, 7701, 7701, 7701, 7701,
+ 7701, 6987, 6987, 6987, 6987, 6987, 6987, 6987, 6987, 6987,
+ 6987, 6987, 6987, 7353, 7353, 7353, 7353, 7353, 7353, 7353,
+ 7353, 7353, 7353, 7353, 7353, 5608, 5608, 5608, 5608, 5608,
+ 5608, 5608, 5608, 5608, 5608, 5608, 5608, 7705, 7705, 7705,
+ 7705, 7705, 7705, 7705, 7705, 7705, 7705, 7705, 7705, 7709,
+
+ 7709, 7709, 7709, 7709, 7709, 7709, 7709, 7709, 7709, 7709,
+ 7709, 7363, 7363, 7363, 7363, 7363, 7363, 7363, 7363, 7363,
+ 7363, 7363, 7363, 7712, 7712, 7712, 7712, 7712, 7712, 7712,
+ 7712, 7712, 7712, 7712, 7712, 6999, 6999, 6999, 6999, 6999,
+ 6999, 6999, 6999, 6999, 6999, 6999, 6999, 7001, 7001, 7001,
+ 7001, 7001, 7001, 7001, 7001, 7001, 7001, 7001, 7001, 7718,
+ 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718,
+ 7718, 7977, 7977, 7977, 7977, 7977, 7977, 7977, 7977, 7977,
+ 7977, 7977, 7977, 6650, 6650, 6650, 6650, 6650, 6650, 6650,
+ 6650, 6650, 6650, 6650, 6650, 7721, 7721, 7721, 7721, 7721,
+
+ 7721, 7721, 7721, 7721, 7721, 7721, 7721, 7980, 7980, 7980,
+ 7980, 7980, 7980, 7980, 7980, 7980, 7980, 7980, 7980, 7381,
+ 7381, 7381, 7381, 7381, 7381, 7381, 7381, 7381, 7381, 7381,
+ 7381, 7724, 7724, 7724, 7724, 7724, 7724, 7724, 7724, 7724,
+ 7724, 7724, 7724, 7383, 7383, 7383, 7383, 7383, 7383, 7383,
+ 7383, 7383, 7383, 7383, 7383, 7017, 7017, 7017, 7017, 7017,
+ 7017, 7017, 7017, 7017, 7017, 7017, 7017, 7730, 7730, 7730,
+ 7730, 7730, 7730, 7730, 7730, 7730, 7730, 7730, 7730, 7734,
+ 7734, 7734, 7734, 7734, 7734, 7734, 7734, 7734, 7734, 7734,
+ 7734, 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7391,
+
+ 7391, 7391, 7391, 7737, 7737, 7737, 7737, 7737, 7737, 7737,
+ 7737, 7737, 7737, 7737, 7737, 7022, 7022, 7022, 7022, 7022,
+ 7022, 7022, 7022, 7022, 7022, 7022, 7022, 7024, 7024, 7024,
+ 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7024, 7032,
+ 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7032, 7032,
+ 7032, 7038, 7038, 7038, 7038, 7038, 7038, 7038, 7038, 7038,
+ 7038, 7038, 7038, 7745, 7745, 7745, 7745, 7745, 7745, 7745,
+ 7745, 7745, 7745, 7745, 7745, 7421, 7421, 7421, 7421, 7421,
+ 7421, 7421, 7421, 7421, 7421, 7421, 7421, 7748, 7748, 7748,
+ 7748, 7748, 7748, 7748, 7748, 7748, 7748, 7748, 7748, 7050,
+
+ 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7050, 7050,
+ 7050, 7988, 7988, 7988, 7988, 7988, 7988, 7988, 7988, 7988,
+ 7988, 7988, 7988, 6697, 6697, 6697, 6697, 6697, 6697, 6697,
+ 6697, 6697, 6697, 6697, 6697, 7754, 7754, 7754, 7754, 7754,
+ 7754, 7754, 7754, 7754, 7754, 7754, 7754, 7755, 7755, 7755,
+ 7755, 7755, 7755, 7755, 7755, 7755, 7755, 7755, 7755, 7066,
+ 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066,
+ 7066, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706,
+ 6706, 6706, 6706, 5793, 5793, 5793, 5793, 5793, 5793, 5793,
+ 5793, 5793, 5793, 5793, 5793, 5172, 5172, 5172, 5172, 5172,
+
+ 5172, 5172, 5172, 5172, 5172, 5172, 5172, 4627, 4627, 4627,
+ 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 6714,
+ 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714,
+ 6714, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306,
+ 6306, 6306, 6306, 5190, 5190, 5190, 5190, 5190, 5190, 5190,
+ 5190, 5190, 5190, 5190, 5190, 4633, 4633, 4633, 4633, 4633,
+ 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4180, 4180, 4180,
+ 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 7780,
+ 7780, 7780, 7780, 7780, 7780, 7780, 7780, 7780, 7780, 7780,
+ 7780, 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7471,
+
+ 7471, 7471, 7471, 7783, 7783, 7783, 7783, 7783, 7783, 7783,
+ 7783, 7783, 7783, 7783, 7783, 7099, 7099, 7099, 7099, 7099,
+ 7099, 7099, 7099, 7099, 7099, 7099, 7099, 6319, 6319, 6319,
+ 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819,
+ 5819, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209,
+ 5209, 5209, 5209, 7107, 7107, 7107, 7107, 7107, 7107, 7107,
+ 7107, 7107, 7107, 7107, 7107, 6743, 6743, 6743, 6743, 6743,
+ 6743, 6743, 6743, 6743, 6743, 6743, 6743, 5837, 5837, 5837,
+ 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5215,
+
+ 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215,
+ 5215, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656,
+ 4656, 4656, 4656, 5230, 5230, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 5230, 5230, 4665, 4665, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 4665, 4665, 4665, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 4673,
+ 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673,
+ 4673, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210,
+ 4210, 4210, 4210, 8041, 8041, 8041, 8041, 8041, 8041, 8041,
+ 8041, 8041, 8041, 8041, 8041, 7137, 7137, 7137, 7137, 7137,
+
+ 7137, 7137, 7137, 7137, 7137, 7137, 7137, 8044, 8044, 8044,
+ 8044, 8044, 8044, 8044, 8044, 8044, 8044, 8044, 8044, 6776,
+ 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776, 6776,
+ 6776, 8046, 8046, 8046, 8046, 8046, 8046, 8046, 8046, 8046,
+ 8046, 8046, 8046, 6778, 6778, 6778, 6778, 6778, 6778, 6778,
+ 6778, 6778, 6778, 6778, 6778, 7825, 7825, 7825, 7825, 7825,
+ 7825, 7825, 7825, 7825, 7825, 7825, 7825, 7826, 7826, 7826,
+ 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7827,
+ 7827, 7827, 7827, 7827, 7827, 7827, 7827, 7827, 7827, 7827,
+ 7827, 8047, 8047, 8047, 8047, 8047, 8047, 8047, 8047, 8047,
+
+ 8047, 8047, 8047, 6789, 6789, 6789, 6789, 6789, 6789, 6789,
+ 6789, 6789, 6789, 6789, 6789, 7830, 7830, 7830, 7830, 7830,
+ 7830, 7830, 7830, 7830, 7830, 7830, 7830, 8050, 8050, 8050,
+ 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 7529,
+ 7529, 7529, 7529, 7529, 7529, 7529, 7529, 7529, 7529, 7529,
+ 7529, 7833, 7833, 7833, 7833, 7833, 7833, 7833, 7833, 7833,
+ 7833, 7833, 7833, 7531, 7531, 7531, 7531, 7531, 7531, 7531,
+ 7531, 7531, 7531, 7531, 7531, 7162, 7162, 7162, 7162, 7162,
+ 7162, 7162, 7162, 7162, 7162, 7162, 7162, 7839, 7839, 7839,
+ 7839, 7839, 7839, 7839, 7839, 7839, 7839, 7839, 7839, 7165,
+
+ 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165,
+ 7165, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804,
+ 6804, 6804, 6804, 5933, 5933, 5933, 5933, 5933, 5933, 5933,
+ 5933, 5933, 5933, 5933, 5933, 5316, 5316, 5316, 5316, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5316, 5316, 4737, 4737, 4737,
+ 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 6812,
+ 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812,
+ 6812, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426,
+ 6426, 6426, 6426, 5334, 5334, 5334, 5334, 5334, 5334, 5334,
+ 5334, 5334, 5334, 5334, 5334, 4743, 4743, 4743, 4743, 4743,
+
+ 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4262, 4262, 4262,
+ 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4763,
+ 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+ 4763, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4276, 4286, 4286, 4286, 4286, 4286, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 3881, 3881, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 4797, 4797, 4797,
+ 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4304,
+ 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304,
+ 4304, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312,
+
+ 4312, 4312, 4312, 3907, 3907, 3907, 3907, 3907, 3907, 3907,
+ 3907, 3907, 3907, 3907, 3907, 7221, 7221, 7221, 7221, 7221,
+ 7221, 7221, 7221, 7221, 7221, 7221, 7221, 6861, 6861, 6861,
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6015,
+ 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015,
+ 6015, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417,
+ 5417, 5417, 5417, 4830, 4830, 4830, 4830, 4830, 4830, 4830,
+ 4830, 4830, 4830, 4830, 4830, 6869, 6869, 6869, 6869, 6869,
+ 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6492, 6492, 6492,
+ 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 5432,
+
+ 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432,
+ 5432, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835, 4835,
+ 4835, 4835, 4835, 4334, 4334, 4334, 4334, 4334, 4334, 4334,
+ 4334, 4334, 4334, 4334, 4334, 7903, 7903, 7903, 7903, 7903,
+ 7903, 7903, 7903, 7903, 7903, 7903, 7903, 7614, 7614, 7614,
+ 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7906,
+ 7906, 7906, 7906, 7906, 7906, 7906, 7906, 7906, 7906, 7906,
+ 7906, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253,
+ 7253, 7253, 7253, 6504, 6504, 6504, 6504, 6504, 6504, 6504,
+ 6504, 6504, 6504, 6504, 6504, 6039, 6039, 6039, 6039, 6039,
+
+ 6039, 6039, 6039, 6039, 6039, 6039, 6039, 5450, 5450, 5450,
+ 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 5450, 7261,
+ 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261,
+ 7261, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897,
+ 6897, 6897, 6897, 6054, 6054, 6054, 6054, 6054, 6054, 6054,
+ 6054, 6054, 6054, 6054, 6054, 5455, 5455, 5455, 5455, 5455,
+ 5455, 5455, 5455, 5455, 5455, 5455, 5455, 4856, 4856, 4856,
+ 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 4856, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468,
+ 5468, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864,
+
+ 4864, 4864, 4864, 3931, 3931, 3931, 3931, 3931, 3931, 3931,
+ 3931, 3931, 3931, 3931, 3931, 4872, 4872, 4872, 4872, 4872,
+ 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4362, 4362, 4362,
+ 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 7291,
+ 7291, 7291, 7291, 7291, 7291, 7291, 7291, 7291, 7291, 7291,
+ 7291, 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6927,
+ 6927, 6927, 6927, 6101, 6101, 6101, 6101, 6101, 6101, 6101,
+ 6101, 6101, 6101, 6101, 6101, 5499, 5499, 5499, 5499, 5499,
+ 5499, 5499, 5499, 5499, 5499, 5499, 5499, 4889, 4889, 4889,
+ 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 6935,
+
+ 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935,
+ 6935, 6563, 6563, 6563, 6563, 6563, 6563, 6563, 6563, 6563,
+ 6563, 6563, 6563, 5514, 5514, 5514, 5514, 5514, 5514, 5514,
+ 5514, 5514, 5514, 5514, 5514, 4894, 4894, 4894, 4894, 4894,
+ 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4381, 4381, 4381,
+ 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4381, 4907,
+ 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907,
+ 4907, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 4397, 4397, 3980, 3980, 3980, 3980, 3980,
+
+ 3980, 3980, 3980, 3980, 3980, 3980, 3980, 4938, 4938, 4938,
+ 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4415,
+ 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415,
+ 4415, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423,
+ 4423, 4423, 4423, 4005, 4005, 4005, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 4005, 7363, 7363, 7363, 7363, 7363,
+ 7363, 7363, 7363, 7363, 7363, 7363, 7363, 7977, 7977, 7977,
+ 7977, 7977, 7977, 7977, 7977, 7977, 7977, 7977, 7977, 7718,
+ 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718,
+ 7718, 7980, 7980, 7980, 7980, 7980, 7980, 7980, 7980, 7980,
+
+ 7980, 7980, 7980, 7381, 7381, 7381, 7381, 7381, 7381, 7381,
+ 7381, 7381, 7381, 7381, 7381, 7383, 7383, 7383, 7383, 7383,
+ 7383, 7383, 7383, 7383, 7383, 7383, 7383, 7391, 7391, 7391,
+ 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7391, 7987,
+ 7987, 7987, 7987, 7987, 7987, 7987, 7987, 7987, 7987, 7987,
+ 7987, 7988, 7988, 7988, 7988, 7988, 7988, 7988, 7988, 7988,
+ 7988, 7988, 7988, 7066, 7066, 7066, 7066, 7066, 7066, 7066,
+ 7066, 7066, 7066, 7066, 7066, 6706, 6706, 6706, 6706, 6706,
+ 6706, 6706, 6706, 6706, 6706, 6706, 6706, 5793, 5793, 5793,
+ 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5172,
+
+ 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172,
+ 5172, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627,
+ 4627, 4627, 4627, 6714, 6714, 6714, 6714, 6714, 6714, 6714,
+ 6714, 6714, 6714, 6714, 6714, 6306, 6306, 6306, 6306, 6306,
+ 6306, 6306, 6306, 6306, 6306, 6306, 6306, 5190, 5190, 5190,
+ 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 4633,
+ 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633,
+ 4633, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180, 4180,
+ 4180, 4180, 4180, 7471, 7471, 7471, 7471, 7471, 7471, 7471,
+ 7471, 7471, 7471, 7471, 7471, 7099, 7099, 7099, 7099, 7099,
+
+ 7099, 7099, 7099, 7099, 7099, 7099, 7099, 6319, 6319, 6319,
+ 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819,
+ 5819, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209,
+ 5209, 5209, 5209, 7107, 7107, 7107, 7107, 7107, 7107, 7107,
+ 7107, 7107, 7107, 7107, 7107, 6743, 6743, 6743, 6743, 6743,
+ 6743, 6743, 6743, 6743, 6743, 6743, 6743, 5837, 5837, 5837,
+ 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5215,
+ 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215,
+ 5215, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656,
+
+ 4656, 4656, 4656, 5230, 5230, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 5230, 5230, 4665, 4665, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4673, 4673, 4673,
+ 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4210,
+ 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210,
+ 4210, 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8219,
+ 8219, 8219, 8219, 7137, 7137, 7137, 7137, 7137, 7137, 7137,
+ 7137, 7137, 7137, 7137, 7137, 8043, 8043, 8043, 8043, 8043,
+ 8043, 8043, 8043, 8043, 8043, 8043, 8043, 8044, 8044, 8044,
+ 8044, 8044, 8044, 8044, 8044, 8044, 8044, 8044, 8044, 8045,
+
+ 8045, 8045, 8045, 8045, 8045, 8045, 8045, 8045, 8045, 8045,
+ 8045, 8046, 8046, 8046, 8046, 8046, 8046, 8046, 8046, 8046,
+ 8046, 8046, 8046, 8047, 8047, 8047, 8047, 8047, 8047, 8047,
+ 8047, 8047, 8047, 8047, 8047, 7827, 7827, 7827, 7827, 7827,
+ 7827, 7827, 7827, 7827, 7827, 7827, 7827, 8050, 8050, 8050,
+ 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 7531,
+ 7531, 7531, 7531, 7531, 7531, 7531, 7531, 7531, 7531, 7531,
+ 7531, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165,
+ 7165, 7165, 7165, 6804, 6804, 6804, 6804, 6804, 6804, 6804,
+ 6804, 6804, 6804, 6804, 6804, 5933, 5933, 5933, 5933, 5933,
+
+ 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5316, 5316, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 4737,
+ 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737,
+ 4737, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812,
+ 6812, 6812, 6812, 6426, 6426, 6426, 6426, 6426, 6426, 6426,
+ 6426, 6426, 6426, 6426, 6426, 5334, 5334, 5334, 5334, 5334,
+ 5334, 5334, 5334, 5334, 5334, 5334, 5334, 4743, 4743, 4743,
+ 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4262,
+ 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262,
+ 4262, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+
+ 4763, 4763, 4763, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4276, 4276, 4276, 4286, 4286, 4286, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 4286, 4286, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 4797,
+ 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797,
+ 4797, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304,
+ 4304, 4304, 4304, 4312, 4312, 4312, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4312, 3907, 3907, 3907, 3907, 3907,
+ 3907, 3907, 3907, 3907, 3907, 3907, 3907, 7221, 7221, 7221,
+ 7221, 7221, 7221, 7221, 7221, 7221, 7221, 7221, 7221, 6861,
+
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861,
+ 6861, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015,
+ 6015, 6015, 6015, 5417, 5417, 5417, 5417, 5417, 5417, 5417,
+ 5417, 5417, 5417, 5417, 5417, 4830, 4830, 4830, 4830, 4830,
+ 4830, 4830, 4830, 4830, 4830, 4830, 4830, 6869, 6869, 6869,
+ 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6492,
+ 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492,
+ 6492, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432,
+ 5432, 5432, 5432, 4835, 4835, 4835, 4835, 4835, 4835, 4835,
+ 4835, 4835, 4835, 4835, 4835, 4334, 4334, 4334, 4334, 4334,
+
+ 4334, 4334, 4334, 4334, 4334, 4334, 4334, 7614, 7614, 7614,
+ 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7253,
+ 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253,
+ 7253, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504,
+ 6504, 6504, 6504, 6039, 6039, 6039, 6039, 6039, 6039, 6039,
+ 6039, 6039, 6039, 6039, 6039, 5450, 5450, 5450, 5450, 5450,
+ 5450, 5450, 5450, 5450, 5450, 5450, 5450, 7261, 7261, 7261,
+ 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 6897,
+ 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897,
+ 6897, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054,
+
+ 6054, 6054, 6054, 5455, 5455, 5455, 5455, 5455, 5455, 5455,
+ 5455, 5455, 5455, 5455, 5455, 4856, 4856, 4856, 4856, 4856,
+ 4856, 4856, 4856, 4856, 4856, 4856, 4856, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 4864,
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864,
+ 4864, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872,
+ 4872, 4872, 4872, 4362, 4362, 4362, 4362, 4362, 4362, 4362,
+ 4362, 4362, 4362, 4362, 4362, 7291, 7291, 7291, 7291, 7291,
+ 7291, 7291, 7291, 7291, 7291, 7291, 7291, 6927, 6927, 6927,
+ 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6101,
+
+ 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101,
+ 6101, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499,
+ 5499, 5499, 5499, 4889, 4889, 4889, 4889, 4889, 4889, 4889,
+ 4889, 4889, 4889, 4889, 4889, 6935, 6935, 6935, 6935, 6935,
+ 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6563, 6563, 6563,
+ 6563, 6563, 6563, 6563, 6563, 6563, 6563, 6563, 6563, 5514,
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514,
+ 5514, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894,
+ 4894, 4894, 4894, 4381, 4381, 4381, 4381, 4381, 4381, 4381,
+ 4381, 4381, 4381, 4381, 4381, 4907, 4907, 4907, 4907, 4907,
+
+ 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4397,
+ 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980,
+ 3980, 3980, 3980, 4938, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4938, 4938, 4938, 4938, 4415, 4415, 4415, 4415, 4415,
+ 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4423, 4423, 4423,
+ 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4005,
+ 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005,
+ 4005, 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718, 7718,
+
+ 7718, 7718, 7718, 7066, 7066, 7066, 7066, 7066, 7066, 7066,
+ 7066, 7066, 7066, 7066, 7066, 6706, 6706, 6706, 6706, 6706,
+ 6706, 6706, 6706, 6706, 6706, 6706, 6706, 5793, 5793, 5793,
+ 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5172,
+ 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172, 5172,
+ 5172, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627, 4627,
+ 4627, 4627, 4627, 6714, 6714, 6714, 6714, 6714, 6714, 6714,
+ 6714, 6714, 6714, 6714, 6714, 6306, 6306, 6306, 6306, 6306,
+ 6306, 6306, 6306, 6306, 6306, 6306, 6306, 5190, 5190, 5190,
+ 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 4633,
+
+ 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633, 4633,
+ 4633, 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7471,
+ 7471, 7471, 7471, 7099, 7099, 7099, 7099, 7099, 7099, 7099,
+ 7099, 7099, 7099, 7099, 7099, 6319, 6319, 6319, 6319, 6319,
+ 6319, 6319, 6319, 6319, 6319, 6319, 6319, 5819, 5819, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5209,
+ 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209,
+ 5209, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107,
+ 7107, 7107, 7107, 6743, 6743, 6743, 6743, 6743, 6743, 6743,
+ 6743, 6743, 6743, 6743, 6743, 5837, 5837, 5837, 5837, 5837,
+
+ 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5215, 5215, 5215,
+ 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 4656,
+ 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656, 4656,
+ 4656, 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 4665, 4665, 4665, 4665, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 4665, 4673, 4673, 4673, 4673, 4673,
+ 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4210, 4210, 4210,
+ 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 4210, 8218,
+ 8218, 8218, 8218, 8218, 8218, 8218, 8218, 8218, 8218, 8218,
+ 8218, 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8219,
+
+ 8219, 8219, 8219, 7165, 7165, 7165, 7165, 7165, 7165, 7165,
+ 7165, 7165, 7165, 7165, 7165, 6804, 6804, 6804, 6804, 6804,
+ 6804, 6804, 6804, 6804, 6804, 6804, 6804, 5933, 5933, 5933,
+ 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5316,
+ 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316, 5316,
+ 5316, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737, 4737,
+ 4737, 4737, 4737, 6812, 6812, 6812, 6812, 6812, 6812, 6812,
+ 6812, 6812, 6812, 6812, 6812, 6426, 6426, 6426, 6426, 6426,
+ 6426, 6426, 6426, 6426, 6426, 6426, 6426, 5334, 5334, 5334,
+ 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 4743,
+
+ 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743, 4743,
+ 4743, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+ 4763, 4763, 4763, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4276, 4276, 4276, 4286, 4286, 4286, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 4286, 4286, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 4797,
+ 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797,
+ 4797, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304,
+ 4304, 4304, 4304, 4312, 4312, 4312, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 4312, 4312, 3907, 3907, 3907, 3907, 3907,
+
+ 3907, 3907, 3907, 3907, 3907, 3907, 3907, 7221, 7221, 7221,
+ 7221, 7221, 7221, 7221, 7221, 7221, 7221, 7221, 7221, 6861,
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861,
+ 6861, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015,
+ 6015, 6015, 6015, 5417, 5417, 5417, 5417, 5417, 5417, 5417,
+ 5417, 5417, 5417, 5417, 5417, 4830, 4830, 4830, 4830, 4830,
+ 4830, 4830, 4830, 4830, 4830, 4830, 4830, 6869, 6869, 6869,
+ 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6492,
+ 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492,
+ 6492, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432, 5432,
+
+ 5432, 5432, 5432, 4835, 4835, 4835, 4835, 4835, 4835, 4835,
+ 4835, 4835, 4835, 4835, 4835, 7614, 7614, 7614, 7614, 7614,
+ 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7253, 7253, 7253,
+ 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 6504,
+ 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504,
+ 6504, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039,
+ 6039, 6039, 6039, 5450, 5450, 5450, 5450, 5450, 5450, 5450,
+ 5450, 5450, 5450, 5450, 5450, 7261, 7261, 7261, 7261, 7261,
+ 7261, 7261, 7261, 7261, 7261, 7261, 7261, 6897, 6897, 6897,
+ 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6054,
+
+ 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054,
+ 6054, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455, 5455,
+ 5455, 5455, 5455, 4856, 4856, 4856, 4856, 4856, 4856, 4856,
+ 4856, 4856, 4856, 4856, 4856, 5468, 5468, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 5468, 4864, 4864, 4864,
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4872,
+ 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872,
+ 4872, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362,
+ 4362, 4362, 4362, 7291, 7291, 7291, 7291, 7291, 7291, 7291,
+ 7291, 7291, 7291, 7291, 7291, 6927, 6927, 6927, 6927, 6927,
+
+ 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6101, 6101, 6101,
+ 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 5499,
+ 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499,
+ 5499, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889,
+ 4889, 4889, 4889, 6935, 6935, 6935, 6935, 6935, 6935, 6935,
+ 6935, 6935, 6935, 6935, 6935, 6563, 6563, 6563, 6563, 6563,
+ 6563, 6563, 6563, 6563, 6563, 6563, 6563, 5514, 5514, 5514,
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 5514, 4894,
+ 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894, 4894,
+ 4894, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907,
+
+ 4907, 4907, 4907, 4389, 4389, 4389, 4389, 4389, 4389, 4389,
+ 4389, 4389, 4389, 4389, 4389, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 4397, 4397, 4397, 4397, 3980, 3980, 3980,
+ 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 4938,
+ 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4415,
+ 4415, 4415, 4415, 4423, 4423, 4423, 4423, 4423, 4423, 4423,
+ 4423, 4423, 4423, 4423, 4423, 4005, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 4005, 4005, 4005, 7066, 7066, 7066,
+ 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 6706,
+
+ 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706,
+ 6706, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793, 5793,
+ 5793, 5793, 5793, 5172, 5172, 5172, 5172, 5172, 5172, 5172,
+ 5172, 5172, 5172, 5172, 5172, 6714, 6714, 6714, 6714, 6714,
+ 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6306, 6306, 6306,
+ 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 5190,
+ 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190, 5190,
+ 5190, 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7471,
+ 7471, 7471, 7471, 7099, 7099, 7099, 7099, 7099, 7099, 7099,
+ 7099, 7099, 7099, 7099, 7099, 6319, 6319, 6319, 6319, 6319,
+
+ 6319, 6319, 6319, 6319, 6319, 6319, 6319, 5819, 5819, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5819, 5209,
+ 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209,
+ 5209, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107,
+ 7107, 7107, 7107, 6743, 6743, 6743, 6743, 6743, 6743, 6743,
+ 6743, 6743, 6743, 6743, 6743, 5837, 5837, 5837, 5837, 5837,
+ 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5215, 5215, 5215,
+ 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5215, 5230,
+ 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230, 5230,
+ 5230, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4665,
+
+ 4665, 4665, 4665, 4673, 4673, 4673, 4673, 4673, 4673, 4673,
+ 4673, 4673, 4673, 4673, 4673, 4210, 4210, 4210, 4210, 4210,
+ 4210, 4210, 4210, 4210, 4210, 4210, 4210, 7165, 7165, 7165,
+ 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 6804,
+ 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804,
+ 6804, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933, 5933,
+ 5933, 5933, 5933, 5316, 5316, 5316, 5316, 5316, 5316, 5316,
+ 5316, 5316, 5316, 5316, 5316, 6812, 6812, 6812, 6812, 6812,
+ 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6426, 6426, 6426,
+ 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 5334,
+
+ 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334, 5334,
+ 5334, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+ 4763, 4763, 4763, 4276, 4276, 4276, 4276, 4276, 4276, 4276,
+ 4276, 4276, 4276, 4276, 4276, 4286, 4286, 4286, 4286, 4286,
+ 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4797, 4797, 4797,
+ 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4304,
+ 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304,
+ 4304, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312,
+ 4312, 4312, 4312, 7221, 7221, 7221, 7221, 7221, 7221, 7221,
+ 7221, 7221, 7221, 7221, 7221, 6861, 6861, 6861, 6861, 6861,
+
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6015, 6015, 6015,
+ 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 5417,
+ 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417, 5417,
+ 5417, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869,
+ 6869, 6869, 6869, 6492, 6492, 6492, 6492, 6492, 6492, 6492,
+ 6492, 6492, 6492, 6492, 6492, 5432, 5432, 5432, 5432, 5432,
+ 5432, 5432, 5432, 5432, 5432, 5432, 5432, 7614, 7614, 7614,
+ 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7614, 7253,
+ 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253, 7253,
+ 7253, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504,
+
+ 6504, 6504, 6504, 6039, 6039, 6039, 6039, 6039, 6039, 6039,
+ 6039, 6039, 6039, 6039, 6039, 5450, 5450, 5450, 5450, 5450,
+ 5450, 5450, 5450, 5450, 5450, 5450, 5450, 7261, 7261, 7261,
+ 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 6897,
+ 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897,
+ 6897, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054, 6054,
+ 6054, 6054, 6054, 5455, 5455, 5455, 5455, 5455, 5455, 5455,
+ 5455, 5455, 5455, 5455, 5455, 5468, 5468, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 5468, 4864, 4864, 4864,
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4872,
+
+ 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872,
+ 4872, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362, 4362,
+ 4362, 4362, 4362, 7291, 7291, 7291, 7291, 7291, 7291, 7291,
+ 7291, 7291, 7291, 7291, 7291, 6927, 6927, 6927, 6927, 6927,
+ 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6101, 6101, 6101,
+ 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 5499,
+ 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499, 5499,
+ 5499, 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935,
+ 6935, 6935, 6935, 6563, 6563, 6563, 6563, 6563, 6563, 6563,
+ 6563, 6563, 6563, 6563, 6563, 5514, 5514, 5514, 5514, 5514,
+
+ 5514, 5514, 5514, 5514, 5514, 5514, 5514, 4907, 4907, 4907,
+ 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4907, 4389,
+ 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389, 4389,
+ 4389, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397,
+ 4397, 4397, 4397, 4938, 4938, 4938, 4938, 4938, 4938, 4938,
+ 4938, 4938, 4938, 4938, 4938, 4415, 4415, 4415, 4415, 4415,
+ 4415, 4415, 4415, 4415, 4415, 4415, 4415, 4423, 4423, 4423,
+ 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 7066,
+ 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066,
+ 7066, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706,
+
+ 6706, 6706, 6706, 5793, 5793, 5793, 5793, 5793, 5793, 5793,
+ 5793, 5793, 5793, 5793, 5793, 6714, 6714, 6714, 6714, 6714,
+ 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6306, 6306, 6306,
+ 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 6306, 7471,
+ 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7471,
+ 7471, 7099, 7099, 7099, 7099, 7099, 7099, 7099, 7099, 7099,
+ 7099, 7099, 7099, 6319, 6319, 6319, 6319, 6319, 6319, 6319,
+ 6319, 6319, 6319, 6319, 6319, 5819, 5819, 5819, 5819, 5819,
+ 5819, 5819, 5819, 5819, 5819, 5819, 5819, 7107, 7107, 7107,
+ 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 6743,
+
+ 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743, 6743,
+ 6743, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837, 5837,
+ 5837, 5837, 5837, 5230, 5230, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 5230, 5230, 4665, 4665, 4665, 4665, 4665,
+ 4665, 4665, 4665, 4665, 4665, 4665, 4665, 4673, 4673, 4673,
+ 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 4673, 7165,
+ 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165,
+ 7165, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804,
+ 6804, 6804, 6804, 5933, 5933, 5933, 5933, 5933, 5933, 5933,
+ 5933, 5933, 5933, 5933, 5933, 6812, 6812, 6812, 6812, 6812,
+
+ 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6426, 6426, 6426,
+ 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 6426, 4763,
+ 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763, 4763,
+ 4763, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797, 4797,
+ 4797, 4797, 4797, 7221, 7221, 7221, 7221, 7221, 7221, 7221,
+ 7221, 7221, 7221, 7221, 7221, 6861, 6861, 6861, 6861, 6861,
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6015, 6015, 6015,
+ 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6015, 6869,
+ 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869,
+ 6869, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492,
+
+ 6492, 6492, 6492, 7614, 7614, 7614, 7614, 7614, 7614, 7614,
+ 7614, 7614, 7614, 7614, 7614, 7253, 7253, 7253, 7253, 7253,
+ 7253, 7253, 7253, 7253, 7253, 7253, 7253, 6504, 6504, 6504,
+ 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6039,
+ 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039, 6039,
+ 6039, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261,
+ 7261, 7261, 7261, 6897, 6897, 6897, 6897, 6897, 6897, 6897,
+ 6897, 6897, 6897, 6897, 6897, 6054, 6054, 6054, 6054, 6054,
+ 6054, 6054, 6054, 6054, 6054, 6054, 6054, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 5468, 4864,
+
+ 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864,
+ 4864, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872,
+ 4872, 4872, 4872, 7291, 7291, 7291, 7291, 7291, 7291, 7291,
+ 7291, 7291, 7291, 7291, 7291, 6927, 6927, 6927, 6927, 6927,
+ 6927, 6927, 6927, 6927, 6927, 6927, 6927, 6101, 6101, 6101,
+ 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6101, 6935,
+ 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935, 6935,
+ 6935, 6563, 6563, 6563, 6563, 6563, 6563, 6563, 6563, 6563,
+ 6563, 6563, 6563, 4907, 4907, 4907, 4907, 4907, 4907, 4907,
+ 4907, 4907, 4907, 4907, 4907, 4938, 4938, 4938, 4938, 4938,
+
+ 4938, 4938, 4938, 4938, 4938, 4938, 4938, 7066, 7066, 7066,
+ 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 7066, 6706,
+ 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706, 6706,
+ 6706, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714, 6714,
+ 6714, 6714, 6714, 6306, 6306, 6306, 6306, 6306, 6306, 6306,
+ 6306, 6306, 6306, 6306, 6306, 7471, 7471, 7471, 7471, 7471,
+ 7471, 7471, 7471, 7471, 7471, 7471, 7471, 7099, 7099, 7099,
+ 7099, 7099, 7099, 7099, 7099, 7099, 7099, 7099, 7099, 6319,
+ 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319, 6319,
+ 6319, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107, 7107,
+
+ 7107, 7107, 7107, 6743, 6743, 6743, 6743, 6743, 6743, 6743,
+ 6743, 6743, 6743, 6743, 6743, 5230, 5230, 5230, 5230, 5230,
+ 5230, 5230, 5230, 5230, 5230, 5230, 5230, 7165, 7165, 7165,
+ 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 7165, 6804,
+ 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804, 6804,
+ 6804, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812, 6812,
+ 6812, 6812, 6812, 6426, 6426, 6426, 6426, 6426, 6426, 6426,
+ 6426, 6426, 6426, 6426, 6426, 7221, 7221, 7221, 7221, 7221,
+ 7221, 7221, 7221, 7221, 7221, 7221, 7221, 6861, 6861, 6861,
+ 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6861, 6869,
+
+ 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869, 6869,
+ 6869, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492, 6492,
+ 6492, 6492, 6492, 7614, 7614, 7614, 7614, 7614, 7614, 7614,
+ 7614, 7614, 7614, 7614, 7614, 7253, 7253, 7253, 7253, 7253,
+ 7253, 7253, 7253, 7253, 7253, 7253, 7253, 6504, 6504, 6504,
+ 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 6504, 7261,
+ 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261, 7261,
+ 7261, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897, 6897,
+ 6897, 6897, 6897, 5468, 5468, 5468, 5468, 5468, 5468, 5468,
+ 5468, 5468, 5468, 5468, 5468, 59, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693
+ } ;
+
+static yyconst flex_int16_t yy_chk[85361] =
+ { 0,
+ 0, 156, 1, 1, 1, 67, 1, 2, 2, 2,
+ 156, 2, 71, 11, 11, 11, 82, 11, 67, 71,
+ 67, 72, 72, 82, 91, 91, 7527, 15, 15, 15,
+ 742, 15, 16, 16, 16, 93, 16, 64, 13, 64,
+ 1, 92, 93, 92, 742, 2, 3, 3, 3, 3,
+ 3, 11, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 13, 15, 35, 13, 13, 35,
+ 16, 21, 21, 64, 75, 80, 80, 23, 23, 23,
+ 7379, 23, 175, 175, 80, 24, 3, 13, 133, 35,
+ 13, 13, 35, 7251, 21, 21, 24, 75, 29, 29,
+
+ 29, 29, 78, 29, 29, 29, 24, 29, 133, 3,
+ 4, 4, 4, 4, 4, 23, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 76, 22,
+ 24, 22, 133, 7160, 86, 86, 78, 29, 172, 172,
+ 31, 31, 31, 86, 31, 31, 97, 172, 22, 31,
+ 4, 76, 7155, 97, 39, 39, 39, 22, 39, 78,
+ 22, 30, 30, 30, 30, 7097, 30, 30, 30, 79,
+ 30, 97, 22, 4, 5, 5, 5, 5, 31, 5,
+ 22, 39, 137, 22, 32, 32, 32, 7046, 32, 32,
+ 191, 191, 39, 32, 97, 96, 5, 41, 41, 41,
+
+ 30, 41, 96, 79, 39, 137, 106, 5, 42, 42,
+ 42, 135, 42, 5, 43, 43, 43, 161, 43, 106,
+ 5, 106, 32, 44, 44, 44, 79, 44, 96, 7020,
+ 5, 6, 6, 6, 6, 41, 6, 51, 51, 51,
+ 161, 51, 145, 53, 53, 53, 42, 53, 135, 145,
+ 125, 96, 43, 6, 1518, 54, 54, 54, 176, 54,
+ 147, 44, 231, 125, 6, 125, 1518, 147, 231, 176,
+ 6, 135, 55, 55, 55, 51, 55, 6, 56, 56,
+ 56, 53, 56, 127, 74, 130, 129, 6, 7, 7,
+ 7, 7, 7, 54, 7, 7, 7, 7, 7, 7,
+
+ 7, 7, 7, 7, 7, 7, 74, 57, 57, 57,
+ 55, 57, 127, 130, 163, 119, 56, 74, 119, 69,
+ 129, 69, 190, 69, 119, 7015, 199, 94, 7, 190,
+ 74, 199, 199, 244, 94, 127, 130, 163, 4043, 119,
+ 74, 4043, 119, 129, 244, 57, 132, 119, 77, 77,
+ 94, 7, 8, 8, 8, 8, 8, 69, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 77, 101, 102, 94, 164, 115, 103, 132, 101, 102,
+ 132, 77, 165, 103, 115, 102, 1817, 115, 101, 103,
+ 279, 166, 8, 173, 77, 200, 200, 164, 1817, 115,
+
+ 132, 279, 204, 132, 77, 165, 173, 115, 173, 102,
+ 115, 204, 101, 103, 166, 8, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 12, 12, 12, 12, 170, 12,
+ 170, 95, 234, 104, 98, 12, 219, 219, 95, 234,
+ 104, 98, 131, 12, 12, 12, 12, 4468, 95, 12,
+ 4468, 12, 95, 168, 153, 12, 12, 12, 12, 99,
+ 98, 134, 104, 12, 170, 153, 99, 12, 12, 12,
+ 12, 131, 95, 12, 12, 153, 95, 168, 12, 12,
+
+ 12, 12, 14, 98, 14, 104, 99, 108, 108, 197,
+ 243, 243, 7010, 14, 131, 134, 112, 122, 108, 153,
+ 169, 14, 197, 14, 197, 112, 122, 112, 108, 99,
+ 14, 902, 122, 14, 14, 112, 14, 902, 134, 280,
+ 112, 122, 213, 213, 169, 14, 179, 14, 112, 122,
+ 112, 213, 108, 14, 280, 122, 14, 14, 112, 14,
+ 17, 17, 17, 17, 17, 180, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 110, 113,
+ 114, 6997, 179, 116, 110, 117, 215, 110, 113, 114,
+ 110, 114, 116, 180, 117, 116, 113, 217, 117, 215,
+
+ 17, 215, 110, 113, 114, 179, 217, 116, 110, 117,
+ 110, 113, 114, 110, 114, 116, 180, 117, 116, 113,
+ 128, 117, 6925, 17, 18, 18, 18, 18, 18, 181,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 120, 120, 140, 184, 128, 230, 128, 121,
+ 121, 619, 120, 140, 149, 140, 230, 149, 181, 121,
+ 120, 184, 619, 140, 18, 262, 120, 120, 140, 128,
+ 121, 128, 262, 121, 121, 120, 140, 149, 140, 182,
+ 149, 181, 121, 120, 126, 184, 140, 18, 19, 19,
+ 19, 19, 19, 121, 19, 19, 19, 19, 19, 19,
+
+ 19, 19, 19, 19, 19, 19, 250, 126, 136, 182,
+ 126, 139, 273, 126, 348, 136, 348, 139, 143, 273,
+ 139, 143, 6895, 139, 228, 273, 6884, 143, 19, 337,
+ 250, 126, 182, 126, 136, 139, 126, 228, 337, 228,
+ 6859, 139, 143, 139, 6802, 143, 139, 154, 177, 273,
+ 143, 19, 20, 20, 20, 20, 20, 136, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 141, 151, 187, 154, 177, 154, 295, 151, 187, 141,
+ 151, 187, 141, 151, 162, 278, 278, 187, 162, 284,
+ 6774, 284, 20, 338, 141, 151, 154, 177, 154, 295,
+
+ 338, 151, 141, 151, 332, 141, 151, 6741, 162, 332,
+ 6730, 332, 162, 284, 284, 20, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 27, 27, 27, 27, 27, 178,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 144, 144, 167, 211, 186, 211, 186, 178,
+ 186, 344, 144, 178, 285, 1031, 299, 167, 344, 167,
+ 285, 1031, 167, 144, 27, 675, 144, 144, 167, 299,
+ 220, 299, 220, 178, 220, 144, 675, 178, 285, 311,
+
+ 167, 211, 167, 285, 186, 167, 144, 27, 28, 28,
+ 28, 28, 28, 183, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 195, 195, 220, 183,
+ 257, 233, 195, 257, 385, 195, 311, 241, 241, 257,
+ 233, 195, 183, 233, 183, 6704, 241, 183, 28, 241,
+ 349, 260, 349, 183, 257, 340, 340, 257, 385, 311,
+ 260, 6703, 257, 260, 340, 183, 260, 183, 342, 342,
+ 183, 28, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+
+ 36, 226, 185, 226, 296, 286, 296, 286, 238, 237,
+ 232, 36, 232, 6692, 232, 238, 237, 36, 185, 36,
+ 36, 36, 36, 237, 353, 36, 353, 36, 286, 238,
+ 286, 36, 36, 36, 36, 36, 358, 226, 358, 6687,
+ 296, 36, 185, 36, 36, 36, 36, 237, 232, 36,
+ 36, 377, 377, 238, 36, 36, 36, 36, 36, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 45, 45, 45, 45, 45, 247, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 246,
+ 253, 248, 258, 258, 6681, 247, 246, 239, 382, 253,
+ 247, 253, 258, 374, 239, 248, 304, 6675, 248, 253,
+ 374, 45, 376, 246, 253, 248, 258, 258, 247, 376,
+
+ 246, 382, 253, 885, 253, 258, 240, 741, 248, 741,
+ 239, 248, 253, 240, 45, 46, 46, 46, 46, 46,
+ 304, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 239, 240, 251, 6669, 240, 266, 254,
+ 255, 251, 885, 304, 251, 266, 6664, 251, 254, 255,
+ 254, 270, 255, 320, 6642, 46, 1121, 240, 270, 251,
+ 240, 266, 1121, 254, 255, 251, 320, 251, 320, 268,
+ 251, 254, 255, 254, 6637, 255, 268, 270, 46, 47,
+ 47, 47, 47, 47, 266, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 259, 259, 274,
+
+ 270, 283, 268, 283, 282, 6617, 274, 259, 282, 394,
+ 282, 283, 274, 269, 287, 6611, 394, 287, 259, 47,
+ 269, 259, 259, 1892, 283, 268, 283, 312, 282, 312,
+ 259, 312, 282, 282, 283, 1892, 274, 287, 269, 310,
+ 287, 259, 47, 48, 48, 48, 48, 48, 302, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 269, 271, 288, 290, 312, 6561, 288, 1312, 271,
+ 291, 396, 328, 310, 290, 383, 384, 302, 396, 1312,
+ 291, 298, 6550, 48, 267, 328, 288, 328, 290, 271,
+ 288, 267, 298, 4480, 291, 4480, 310, 290, 383, 384,
+
+ 302, 267, 298, 291, 301, 267, 48, 49, 49, 49,
+ 49, 49, 271, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 267, 298, 301, 354, 267,
+ 301, 362, 6490, 301, 400, 400, 391, 391, 450, 305,
+ 303, 354, 448, 354, 362, 391, 362, 49, 398, 398,
+ 6479, 301, 2848, 301, 404, 404, 301, 398, 326, 317,
+ 326, 317, 450, 317, 2848, 448, 303, 305, 303, 306,
+ 49, 50, 50, 50, 50, 50, 307, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 303,
+ 305, 303, 390, 138, 326, 308, 150, 317, 306, 309,
+
+ 551, 551, 552, 552, 138, 307, 322, 150, 322, 390,
+ 322, 50, 138, 387, 138, 150, 6448, 150, 333, 309,
+ 330, 306, 330, 351, 330, 351, 308, 138, 307, 308,
+ 150, 388, 6424, 390, 50, 52, 138, 52, 138, 150,
+ 360, 150, 360, 309, 322, 6413, 52, 387, 333, 308,
+ 138, 449, 308, 150, 52, 52, 52, 52, 330, 351,
+ 52, 6399, 52, 451, 6381, 388, 52, 52, 52, 52,
+ 387, 333, 6373, 356, 449, 356, 360, 356, 52, 52,
+ 52, 52, 336, 336, 52, 52, 389, 451, 388, 52,
+ 52, 52, 52, 73, 73, 73, 73, 73, 73, 73,
+
+ 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 356, 336, 364, 389, 364, 407, 364, 409, 436,
+ 441, 441, 436, 407, 443, 409, 441, 454, 453, 443,
+ 443, 511, 513, 73, 517, 336, 533, 389, 511, 513,
+ 519, 517, 5012, 436, 5012, 533, 436, 519, 568, 568,
+ 454, 364, 453, 381, 386, 386, 73, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 381, 386, 411, 410, 574,
+ 574, 418, 412, 413, 411, 410, 381, 386, 418, 412,
+ 413, 415, 575, 575, 455, 411, 421, 88, 415, 381,
+
+ 386, 410, 418, 421, 417, 424, 412, 414, 416, 381,
+ 386, 417, 424, 413, 414, 416, 415, 455, 415, 411,
+ 88, 100, 424, 419, 410, 421, 418, 458, 100, 412,
+ 419, 459, 417, 417, 100, 456, 413, 414, 416, 415,
+ 433, 415, 452, 452, 419, 457, 424, 100, 421, 100,
+ 458, 433, 100, 6304, 459, 417, 417, 6293, 100, 456,
+ 414, 416, 550, 550, 433, 452, 452, 1149, 419, 457,
+ 100, 550, 100, 1149, 433, 100, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 107, 107, 107, 107, 107, 420, 430,
+ 461, 432, 571, 460, 463, 420, 431, 422, 462, 571,
+ 462, 430, 420, 465, 422, 431, 6284, 431, 432, 6259,
+ 107, 427, 427, 430, 461, 432, 460, 463, 573, 6175,
+ 431, 462, 427, 462, 430, 573, 420, 465, 431, 422,
+
+ 431, 432, 427, 107, 109, 109, 109, 109, 109, 109,
+ 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
+ 109, 109, 422, 109, 435, 434, 427, 429, 423, 437,
+ 438, 594, 109, 429, 6170, 423, 429, 434, 435, 429,
+ 594, 435, 446, 446, 109, 5975, 437, 109, 435, 434,
+ 438, 429, 470, 437, 438, 109, 423, 429, 447, 429,
+ 434, 435, 429, 446, 435, 464, 464, 109, 111, 437,
+ 467, 111, 473, 438, 469, 111, 470, 111, 466, 423,
+ 111, 478, 483, 466, 467, 471, 447, 446, 464, 464,
+ 472, 476, 111, 479, 467, 111, 473, 469, 5909, 111,
+
+ 111, 475, 466, 111, 118, 118, 466, 467, 471, 447,
+ 468, 482, 468, 472, 118, 478, 483, 118, 492, 118,
+ 476, 479, 118, 480, 475, 5780, 468, 475, 118, 118,
+ 475, 482, 477, 484, 468, 494, 468, 118, 478, 483,
+ 118, 5775, 118, 476, 479, 118, 124, 124, 475, 468,
+ 475, 492, 480, 475, 481, 482, 491, 124, 477, 487,
+ 477, 5766, 489, 488, 494, 124, 124, 124, 124, 607,
+ 484, 124, 5746, 124, 492, 480, 607, 124, 124, 124,
+ 124, 477, 489, 477, 491, 481, 487, 494, 481, 124,
+ 124, 124, 124, 484, 485, 124, 124, 488, 510, 486,
+
+ 124, 124, 124, 124, 142, 142, 489, 491, 481, 487,
+ 485, 481, 505, 505, 142, 486, 609, 142, 537, 142,
+ 488, 510, 142, 609, 490, 581, 582, 582, 142, 142,
+ 581, 581, 5658, 495, 485, 505, 505, 142, 498, 486,
+ 142, 537, 142, 490, 493, 142, 146, 146, 146, 146,
+ 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+ 146, 146, 146, 146, 495, 496, 493, 490, 498, 503,
+ 506, 5632, 507, 509, 508, 509, 538, 654, 503, 508,
+ 503, 496, 5624, 496, 654, 539, 146, 495, 499, 497,
+ 493, 498, 5622, 503, 506, 499, 507, 509, 508, 509,
+
+ 538, 503, 508, 503, 499, 496, 497, 496, 539, 146,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 499, 656,
+ 497, 500, 529, 5616, 501, 502, 656, 545, 500, 546,
+ 504, 502, 547, 532, 502, 501, 529, 502, 588, 588,
+ 148, 523, 500, 501, 5611, 501, 529, 500, 523, 502,
+ 504, 545, 532, 546, 504, 502, 547, 502, 501, 529,
+ 502, 524, 523, 148, 152, 152, 500, 501, 524, 501,
+ 500, 527, 527, 504, 152, 524, 532, 152, 567, 152,
+ 530, 501, 152, 555, 567, 710, 523, 567, 152, 152,
+
+ 710, 530, 710, 567, 527, 527, 5629, 152, 5629, 524,
+ 152, 530, 152, 540, 555, 152, 198, 198, 198, 198,
+ 198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
+ 198, 198, 198, 198, 526, 530, 540, 528, 555, 541,
+ 526, 5448, 528, 526, 543, 542, 526, 542, 548, 531,
+ 544, 544, 554, 549, 587, 5370, 198, 1281, 526, 587,
+ 587, 528, 541, 1281, 526, 528, 526, 543, 542, 526,
+ 542, 548, 556, 544, 544, 531, 549, 531, 554, 198,
+ 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
+ 242, 242, 242, 242, 242, 242, 242, 242, 531, 556,
+
+ 531, 554, 591, 591, 580, 580, 557, 5354, 558, 560,
+ 580, 589, 628, 580, 598, 598, 589, 589, 5297, 580,
+ 242, 604, 556, 598, 599, 599, 601, 601, 618, 618,
+ 604, 623, 623, 604, 624, 624, 628, 5292, 559, 557,
+ 561, 558, 560, 242, 245, 245, 245, 245, 245, 245,
+ 245, 245, 245, 245, 245, 245, 245, 245, 245, 245,
+ 245, 245, 557, 245, 558, 560, 559, 525, 559, 562,
+ 612, 561, 561, 563, 565, 564, 629, 612, 525, 625,
+ 566, 626, 639, 614, 245, 5207, 525, 245, 525, 559,
+ 614, 559, 564, 562, 561, 561, 640, 563, 613, 612,
+
+ 629, 525, 625, 627, 626, 613, 639, 245, 249, 565,
+ 525, 566, 525, 614, 642, 5134, 564, 562, 5058, 249,
+ 640, 563, 612, 613, 525, 249, 627, 249, 249, 249,
+ 249, 643, 565, 249, 566, 249, 614, 642, 615, 249,
+ 249, 249, 249, 674, 674, 615, 613, 684, 684, 249,
+ 5045, 249, 249, 249, 249, 643, 632, 249, 249, 615,
+ 645, 633, 249, 249, 249, 249, 252, 616, 632, 252,
+ 617, 617, 633, 252, 616, 252, 635, 650, 252, 617,
+ 632, 616, 617, 615, 645, 633, 650, 722, 635, 650,
+ 252, 632, 650, 252, 5039, 633, 722, 252, 252, 638,
+
+ 635, 252, 256, 256, 631, 616, 637, 634, 636, 637,
+ 631, 635, 256, 631, 644, 256, 631, 256, 634, 638,
+ 256, 5034, 636, 638, 641, 641, 256, 256, 631, 647,
+ 637, 634, 636, 637, 631, 256, 631, 644, 256, 631,
+ 256, 634, 638, 256, 272, 636, 649, 641, 641, 646,
+ 648, 272, 676, 647, 646, 660, 663, 272, 662, 664,
+ 5019, 661, 660, 663, 671, 662, 664, 676, 661, 649,
+ 272, 671, 272, 646, 648, 272, 666, 646, 660, 661,
+ 670, 272, 662, 666, 687, 672, 663, 670, 677, 664,
+ 665, 5009, 672, 272, 670, 272, 671, 665, 272, 275,
+
+ 275, 660, 678, 661, 5006, 662, 666, 687, 275, 663,
+ 689, 275, 664, 672, 275, 665, 677, 665, 670, 671,
+ 275, 275, 275, 685, 685, 724, 678, 668, 669, 666,
+ 275, 679, 724, 689, 668, 669, 672, 4887, 665, 677,
+ 665, 729, 729, 680, 275, 275, 275, 4862, 668, 669,
+ 678, 679, 688, 275, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 668, 669, 680, 679, 688, 686, 686, 690,
+ 4854, 691, 686, 686, 692, 667, 693, 694, 696, 701,
+ 1342, 698, 667, 713, 277, 726, 1342, 680, 713, 4849,
+
+ 713, 734, 726, 690, 691, 733, 733, 692, 734, 693,
+ 694, 696, 701, 667, 667, 698, 700, 277, 281, 281,
+ 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
+ 281, 281, 281, 281, 281, 281, 667, 667, 686, 695,
+ 700, 695, 697, 697, 699, 705, 281, 702, 721, 699,
+ 703, 4828, 715, 4735, 714, 4709, 704, 761, 281, 706,
+ 707, 758, 695, 759, 695, 697, 697, 704, 699, 281,
+ 702, 705, 699, 705, 703, 715, 721, 704, 706, 707,
+ 736, 281, 289, 4687, 714, 758, 759, 736, 761, 720,
+ 720, 785, 289, 785, 705, 289, 705, 289, 865, 721,
+
+ 289, 704, 706, 707, 728, 728, 289, 714, 797, 797,
+ 767, 761, 4663, 728, 785, 289, 785, 767, 289, 720,
+ 289, 865, 4654, 289, 335, 335, 335, 335, 335, 335,
+ 335, 335, 335, 335, 335, 335, 335, 335, 335, 335,
+ 335, 335, 720, 760, 768, 763, 767, 789, 789, 778,
+ 866, 768, 763, 778, 784, 784, 815, 768, 762, 784,
+ 778, 760, 763, 796, 335, 762, 815, 798, 796, 796,
+ 789, 789, 798, 798, 866, 896, 896, 784, 784, 815,
+ 4649, 768, 784, 4625, 762, 760, 763, 335, 341, 341,
+ 341, 341, 341, 341, 341, 341, 341, 341, 341, 341,
+
+ 341, 341, 341, 341, 341, 341, 764, 762, 765, 770,
+ 788, 790, 867, 764, 788, 765, 770, 791, 868, 775,
+ 791, 790, 770, 764, 3640, 765, 775, 769, 341, 898,
+ 898, 901, 901, 788, 769, 790, 867, 788, 773, 3640,
+ 791, 4595, 868, 791, 790, 773, 770, 764, 769, 765,
+ 775, 341, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 773, 4590, 769, 775, 786, 4575, 792, 792, 795, 2060,
+ 795, 802, 771, 802, 804, 804, 786, 772, 2060, 771,
+ 774, 2060, 346, 773, 772, 777, 4562, 774, 786, 792,
+
+ 792, 795, 777, 795, 802, 4549, 802, 804, 804, 786,
+ 4537, 771, 772, 774, 777, 346, 378, 378, 378, 378,
+ 378, 378, 378, 378, 378, 378, 378, 378, 378, 378,
+ 378, 378, 378, 378, 771, 772, 774, 776, 777, 787,
+ 806, 4531, 803, 805, 776, 803, 4526, 805, 809, 806,
+ 809, 874, 787, 782, 776, 900, 378, 910, 910, 4519,
+ 900, 900, 4514, 787, 806, 803, 805, 4499, 803, 782,
+ 805, 809, 806, 809, 874, 787, 4494, 782, 776, 378,
+ 379, 379, 379, 379, 379, 379, 379, 379, 379, 379,
+ 379, 379, 782, 379, 379, 379, 379, 379, 783, 793,
+
+ 807, 793, 794, 811, 808, 814, 816, 812, 4488, 807,
+ 814, 829, 811, 829, 783, 793, 808, 794, 812, 816,
+ 379, 4469, 783, 793, 807, 793, 794, 811, 808, 814,
+ 816, 812, 807, 814, 829, 811, 829, 783, 793, 808,
+ 794, 812, 816, 379, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 813, 817, 818, 4458, 819, 826, 817, 819,
+ 821, 813, 826, 813, 820, 820, 821, 818, 852, 875,
+ 852, 958, 958, 4453, 380, 4438, 813, 817, 818, 819,
+ 826, 817, 819, 821, 813, 826, 813, 820, 820, 821,
+
+ 818, 852, 875, 852, 810, 810, 810, 380, 401, 401,
+ 401, 401, 401, 401, 401, 401, 401, 401, 401, 401,
+ 401, 401, 401, 401, 401, 401, 810, 822, 839, 823,
+ 824, 4413, 823, 825, 810, 827, 825, 810, 822, 824,
+ 827, 1026, 1026, 1027, 1027, 4387, 839, 1382, 401, 4379,
+ 810, 822, 823, 1382, 824, 823, 825, 810, 827, 825,
+ 810, 822, 824, 827, 832, 833, 834, 845, 837, 835,
+ 839, 401, 402, 402, 402, 402, 402, 402, 402, 402,
+ 402, 402, 402, 402, 828, 402, 402, 402, 402, 402,
+ 830, 831, 836, 828, 832, 837, 833, 830, 834, 835,
+
+ 831, 845, 853, 846, 871, 1420, 853, 841, 828, 836,
+ 840, 1420, 402, 4374, 830, 831, 828, 832, 837, 833,
+ 830, 834, 835, 831, 845, 853, 1030, 1030, 871, 853,
+ 840, 841, 844, 836, 846, 402, 403, 403, 403, 403,
+ 403, 403, 403, 403, 403, 403, 403, 403, 403, 403,
+ 403, 403, 403, 403, 840, 841, 842, 846, 844, 850,
+ 850, 855, 857, 2859, 850, 861, 855, 860, 860, 861,
+ 863, 857, 860, 863, 842, 2859, 403, 1083, 1083, 1070,
+ 1070, 844, 850, 850, 855, 1070, 857, 850, 861, 855,
+ 860, 860, 861, 863, 857, 860, 863, 4360, 842, 403,
+
+ 425, 425, 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 851, 856, 1467, 862, 869, 856, 872, 873,
+ 1467, 862, 876, 877, 856, 851, 903, 869, 4349, 1087,
+
+ 1087, 903, 903, 1658, 426, 1087, 851, 856, 862, 1658,
+ 869, 856, 872, 873, 862, 876, 877, 856, 851, 4332,
+ 869, 854, 854, 854, 838, 838, 838, 426, 428, 428,
+ 428, 428, 428, 428, 428, 428, 428, 428, 428, 428,
+ 428, 428, 428, 428, 428, 428, 838, 428, 1202, 854,
+ 979, 854, 854, 878, 879, 1202, 929, 838, 848, 4327,
+ 929, 1143, 1143, 1137, 1137, 848, 843, 847, 428, 1137,
+ 838, 428, 854, 979, 854, 854, 4302, 878, 879, 929,
+ 838, 858, 891, 929, 889, 880, 843, 847, 858, 848,
+ 890, 428, 442, 442, 442, 442, 442, 442, 442, 442,
+
+ 442, 442, 442, 442, 442, 442, 442, 442, 442, 442,
+ 843, 847, 848, 858, 880, 4274, 889, 891, 890, 913,
+ 913, 1029, 859, 982, 1145, 1145, 1029, 1029, 962, 859,
+ 3322, 849, 442, 881, 1146, 1146, 858, 880, 849, 889,
+ 891, 890, 3322, 913, 913, 859, 982, 864, 864, 864,
+ 849, 955, 962, 881, 892, 442, 444, 444, 444, 444,
+ 444, 444, 444, 444, 444, 444, 444, 444, 859, 444,
+ 444, 444, 444, 444, 849, 864, 886, 881, 864, 955,
+ 892, 915, 964, 4260, 918, 918, 921, 921, 915, 918,
+ 928, 928, 886, 4255, 966, 882, 444, 883, 864, 1147,
+
+ 1147, 864, 955, 892, 4242, 915, 964, 918, 918, 921,
+ 921, 915, 918, 928, 928, 882, 886, 883, 966, 444,
+ 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
+ 445, 445, 445, 445, 445, 445, 445, 445, 766, 882,
+ 887, 883, 884, 956, 4238, 766, 905, 888, 893, 986,
+ 1156, 906, 894, 905, 1156, 766, 1156, 919, 906, 919,
+ 445, 1156, 884, 888, 887, 4225, 766, 906, 893, 936,
+ 908, 956, 986, 884, 894, 1664, 905, 908, 936, 766,
+ 919, 1664, 919, 445, 474, 474, 884, 888, 887, 766,
+ 907, 906, 893, 936, 956, 474, 884, 907, 894, 905,
+
+ 920, 936, 908, 474, 474, 474, 474, 907, 977, 474,
+ 4220, 474, 987, 920, 909, 474, 474, 474, 474, 1153,
+ 1153, 909, 1250, 1250, 920, 908, 4208, 474, 474, 474,
+ 474, 907, 977, 474, 474, 987, 920, 909, 474, 474,
+ 474, 474, 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514, 514, 514,
+ 909, 914, 916, 917, 922, 4197, 923, 4178, 925, 923,
+ 925, 926, 927, 926, 922, 927, 4173, 914, 916, 917,
+ 1010, 4155, 514, 946, 4143, 914, 916, 917, 922, 923,
+ 946, 925, 923, 925, 926, 927, 926, 922, 927, 931,
+
+ 914, 916, 917, 1010, 946, 514, 515, 515, 515, 515,
+ 515, 515, 515, 515, 515, 515, 515, 515, 924, 515,
+ 515, 515, 515, 515, 930, 933, 932, 934, 946, 931,
+ 933, 1035, 944, 931, 924, 932, 930, 932, 934, 944,
+ 935, 4138, 924, 935, 1035, 4129, 515, 940, 930, 933,
+ 932, 934, 931, 933, 940, 1035, 931, 924, 932, 930,
+ 932, 934, 988, 935, 940, 957, 935, 1035, 944, 515,
+ 516, 516, 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516, 940, 945,
+ 941, 942, 947, 4125, 957, 988, 945, 941, 942, 947,
+
+ 1053, 4120, 945, 968, 939, 947, 4042, 941, 942, 953,
+ 516, 939, 1276, 1276, 1278, 1278, 953, 957, 988, 959,
+ 959, 4042, 968, 1053, 959, 959, 945, 968, 953, 947,
+ 939, 941, 942, 516, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 953, 939, 972, 1280, 1280, 965, 948, 973,
+ 969, 965, 950, 4113, 969, 948, 972, 973, 949, 950,
+ 1249, 4108, 951, 4102, 520, 949, 1249, 954, 972, 951,
+ 959, 965, 1249, 973, 969, 965, 1032, 948, 969, 972,
+ 973, 1032, 1032, 949, 950, 951, 954, 520, 521, 521,
+
+ 521, 521, 521, 521, 521, 521, 521, 521, 521, 521,
+ 948, 521, 521, 521, 521, 521, 949, 950, 951, 952,
+ 954, 967, 3417, 970, 971, 976, 952, 970, 971, 1000,
+ 4097, 976, 967, 1000, 3417, 1000, 952, 1148, 521, 4037,
+ 1000, 1000, 1148, 1148, 3750, 967, 1005, 970, 971, 976,
+ 1005, 970, 971, 981, 976, 967, 3750, 1005, 1005, 963,
+ 952, 521, 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522, 522, 522,
+ 963, 974, 975, 978, 975, 978, 4028, 981, 1008, 1008,
+ 1009, 1009, 1011, 963, 1011, 983, 974, 980, 980, 4024,
+
+ 1012, 1012, 522, 4019, 963, 974, 975, 978, 975, 978,
+ 981, 1008, 1008, 1009, 1009, 1011, 963, 1011, 989, 974,
+ 4003, 983, 980, 1012, 1012, 522, 584, 584, 584, 584,
+ 584, 584, 584, 584, 584, 584, 584, 584, 584, 584,
+ 584, 584, 584, 584, 983, 990, 980, 989, 1014, 1021,
+ 1055, 991, 990, 1014, 1046, 1021, 1111, 993, 991, 1046,
+ 990, 992, 994, 3992, 993, 3978, 584, 995, 992, 994,
+ 989, 1014, 1021, 1055, 995, 1809, 1014, 1046, 1021, 991,
+ 1111, 1809, 1046, 3967, 990, 993, 992, 994, 995, 584,
+ 585, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+
+ 585, 585, 991, 585, 585, 585, 585, 585, 993, 992,
+ 994, 1047, 995, 1018, 3905, 1022, 1047, 1022, 1023, 1023,
+ 997, 1018, 1040, 1040, 996, 998, 1515, 997, 999, 1636,
+ 585, 996, 998, 1515, 1047, 999, 1636, 1018, 1022, 1047,
+ 1022, 1023, 1023, 3894, 1018, 1040, 1040, 1285, 1285, 997,
+ 996, 998, 999, 585, 586, 586, 586, 586, 586, 586,
+ 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+ 586, 586, 997, 996, 998, 999, 3879, 1017, 1002, 1033,
+ 1039, 1033, 1039, 1001, 1036, 1002, 1048, 1036, 1048, 1017,
+ 1001, 1002, 1151, 1003, 586, 1383, 1383, 1151, 1151, 1006,
+
+ 1003, 1017, 1033, 1039, 1033, 1039, 1006, 1036, 3866, 1048,
+ 1036, 1048, 1017, 1001, 1003, 1002, 1006, 586, 620, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620,
+ 620, 620, 620, 620, 620, 620, 1001, 1013, 1003, 1016,
+ 1006, 1037, 1020, 3846, 1037, 1067, 1041, 1049, 1004, 1041,
+ 1097, 1049, 1013, 1016, 1020, 1004, 1329, 1329, 620, 1332,
+ 1332, 1013, 1329, 1016, 1037, 1332, 1020, 1037, 1067, 1041,
+ 1049, 1004, 1041, 1097, 1049, 1013, 1016, 1020, 1015, 1015,
+ 1015, 620, 621, 621, 621, 621, 621, 621, 621, 621,
+ 621, 621, 621, 621, 1004, 621, 621, 621, 621, 621,
+
+ 1015, 1019, 1024, 1042, 1038, 1034, 1116, 1052, 1051, 3838,
+ 1112, 1015, 1042, 1051, 1024, 1019, 1034, 1038, 1052, 1056,
+ 1113, 1056, 621, 3759, 1015, 1019, 1024, 1042, 1038, 1034,
+ 1116, 1052, 1051, 1112, 1015, 1042, 1051, 1024, 1019, 1034,
+ 1038, 1052, 1056, 1113, 1056, 621, 622, 622, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 622, 622, 622,
+ 622, 622, 622, 622, 943, 1059, 1043, 1043, 1043, 1102,
+ 1061, 943, 1043, 1057, 1054, 1061, 1102, 1054, 1059, 1057,
+ 1123, 943, 1102, 1124, 1050, 1057, 622, 1060, 1043, 1059,
+ 1050, 1050, 943, 1050, 1061, 1062, 1060, 1054, 1061, 1043,
+
+ 1054, 1059, 3752, 1057, 1123, 943, 1102, 1124, 1050, 622,
+ 630, 1060, 1043, 1050, 1050, 943, 1050, 1719, 1072, 1060,
+ 3746, 630, 1043, 1086, 1719, 1062, 1057, 630, 1066, 630,
+ 630, 630, 630, 1069, 1058, 630, 3734, 630, 1058, 1069,
+ 1066, 630, 630, 630, 630, 1405, 1405, 1064, 1062, 1064,
+ 1072, 630, 1086, 630, 630, 630, 630, 1058, 1066, 630,
+ 630, 1058, 1071, 1069, 630, 630, 630, 630, 673, 673,
+ 1064, 1065, 1064, 1072, 1065, 1086, 1068, 673, 1071, 1126,
+ 673, 1066, 1098, 673, 1098, 1068, 1069, 3727, 1114, 673,
+ 673, 673, 1073, 1074, 1065, 3649, 1225, 1065, 1823, 673,
+
+ 1068, 1075, 1071, 1126, 1823, 1098, 1895, 1098, 1068, 1077,
+ 1078, 1114, 1895, 673, 673, 673, 1079, 1085, 1073, 1074,
+ 1225, 1075, 673, 681, 681, 681, 681, 681, 681, 681,
+ 681, 681, 681, 681, 681, 681, 681, 681, 681, 681,
+ 681, 1073, 1074, 1077, 1078, 1075, 1090, 1090, 1085, 1079,
+ 1099, 1104, 1104, 1099, 1406, 1406, 1911, 1115, 3642, 1080,
+ 1117, 1088, 1911, 681, 1081, 1082, 1077, 1078, 1088, 1090,
+ 1090, 1085, 1079, 1099, 1104, 1104, 1099, 1076, 1076, 1076,
+ 1115, 1080, 1081, 1117, 1088, 1082, 681, 682, 682, 682,
+ 682, 682, 682, 682, 682, 682, 682, 682, 682, 1076,
+
+ 682, 682, 682, 682, 682, 1080, 1081, 1088, 1118, 1082,
+ 1076, 1107, 1092, 1093, 3632, 1100, 1107, 1100, 1089, 1109,
+ 1407, 1407, 1119, 1076, 1092, 1089, 1093, 682, 1350, 1350,
+ 3626, 1118, 3620, 1076, 1350, 1107, 1092, 1093, 1100, 1107,
+ 1100, 1110, 1091, 1091, 1091, 1119, 1089, 1092, 1109, 1093,
+ 682, 683, 683, 683, 683, 683, 683, 683, 683, 683,
+ 683, 683, 683, 683, 683, 683, 683, 683, 683, 1089,
+ 1091, 1109, 1110, 1091, 1120, 1091, 1105, 3330, 1122, 1166,
+ 1152, 1101, 1094, 1094, 1094, 1152, 1152, 1101, 1094, 1105,
+ 3309, 683, 3298, 1091, 3214, 1110, 1091, 1120, 1091, 1154,
+
+ 1105, 1122, 1166, 3204, 1154, 1154, 1128, 3201, 1138, 1130,
+ 1094, 1101, 1105, 1094, 683, 716, 716, 716, 716, 716,
+ 716, 716, 716, 716, 716, 716, 716, 716, 716, 716,
+ 716, 716, 716, 1094, 1101, 3179, 1094, 1128, 1106, 3165,
+ 1130, 1138, 1198, 3043, 1165, 1165, 1198, 1764, 1198, 1408,
+ 1408, 1106, 1103, 1198, 1764, 716, 1409, 1409, 1127, 1103,
+ 1128, 3003, 1106, 1130, 1138, 2894, 1134, 1165, 1165, 1084,
+ 1084, 1129, 1133, 1103, 1106, 1084, 1127, 1084, 716, 718,
+ 718, 718, 718, 718, 718, 718, 718, 718, 718, 718,
+ 718, 1084, 718, 718, 718, 718, 718, 1103, 1134, 1129,
+
+ 1127, 1133, 1084, 1163, 1164, 1162, 1163, 1227, 1228, 1164,
+ 1108, 1108, 1108, 1772, 1162, 1084, 2877, 1399, 1399, 718,
+ 1772, 1134, 1129, 1399, 1133, 1084, 2875, 1163, 1164, 1162,
+ 1163, 1227, 1228, 1164, 1131, 2871, 1135, 1162, 1108, 1132,
+ 1136, 1108, 718, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 1108, 1131, 1132, 1108, 1135, 1158, 1136, 1168, 1168,
+ 1160, 1773, 1167, 1158, 1167, 1229, 1233, 1140, 1773, 1158,
+ 1410, 1410, 1160, 719, 1142, 1131, 1139, 1132, 1135, 1816,
+ 1136, 1168, 1168, 2842, 1160, 1167, 1816, 1167, 1229, 1233,
+
+ 1170, 1140, 1139, 1158, 1142, 1160, 719, 730, 730, 730,
+ 730, 730, 730, 730, 730, 730, 730, 730, 730, 730,
+ 730, 730, 730, 730, 730, 1140, 1139, 1169, 1142, 1174,
+ 1172, 1256, 1155, 1170, 1170, 1174, 1236, 1256, 1172, 1155,
+ 1217, 1157, 1169, 1256, 1217, 2795, 1159, 730, 1157, 1161,
+ 2781, 1169, 1174, 1159, 1172, 1161, 1170, 1170, 1174, 1236,
+ 1155, 1172, 1234, 2777, 1217, 1169, 1157, 1159, 1217, 1161,
+ 730, 731, 731, 731, 731, 731, 731, 731, 731, 731,
+ 731, 731, 731, 1155, 731, 731, 731, 731, 731, 1157,
+ 1171, 1159, 1173, 1161, 1235, 1175, 1176, 2769, 1177, 1234,
+
+ 1178, 1177, 1171, 1178, 1260, 1180, 1173, 1175, 1180, 1176,
+ 1360, 731, 1412, 1412, 1171, 2764, 1173, 2758, 1235, 1175,
+ 1176, 1177, 1234, 1178, 1177, 1171, 1178, 1260, 1180, 1173,
+ 1175, 1180, 1176, 1360, 731, 732, 732, 732, 732, 732,
+ 732, 732, 732, 732, 732, 732, 732, 732, 732, 732,
+ 732, 732, 732, 1179, 2725, 1182, 2723, 1184, 1183, 2701,
+ 1185, 1181, 1181, 1182, 1183, 1183, 1179, 1181, 1184, 1185,
+ 1416, 1416, 1468, 1468, 1279, 732, 1193, 1179, 1182, 1279,
+ 1279, 1184, 1183, 1193, 1185, 2695, 1182, 1183, 1183, 1179,
+ 1187, 1184, 1185, 1204, 1204, 1181, 1187, 1193, 732, 737,
+
+ 737, 737, 737, 737, 737, 737, 737, 737, 737, 737,
+ 737, 737, 737, 737, 737, 737, 737, 1188, 1181, 2029,
+ 1187, 1193, 1186, 1208, 1188, 1208, 2029, 1204, 1186, 1195,
+ 1186, 1186, 1188, 1189, 1186, 1190, 1195, 1320, 1320, 737,
+ 1189, 2670, 1190, 1187, 2646, 1426, 1426, 1208, 1320, 1208,
+ 1204, 1426, 1186, 1926, 1211, 1211, 1188, 1238, 1195, 1926,
+ 1190, 1189, 737, 738, 738, 738, 738, 738, 738, 738,
+ 738, 738, 738, 738, 738, 1186, 738, 738, 738, 738,
+ 738, 1195, 1200, 1190, 1189, 1210, 1209, 2632, 1211, 1200,
+ 1265, 1238, 1265, 1210, 1191, 1200, 1948, 1209, 1192, 1194,
+
+ 1197, 1191, 1948, 738, 2627, 1192, 1194, 1197, 2602, 1210,
+ 1209, 1211, 1283, 1265, 1238, 1265, 1210, 1283, 1283, 1200,
+ 1209, 2571, 1191, 1192, 1197, 1194, 738, 739, 739, 739,
+ 739, 739, 739, 739, 739, 739, 739, 739, 739, 739,
+ 739, 739, 739, 739, 739, 1191, 1192, 1197, 1194, 1205,
+ 1218, 1213, 1214, 1221, 1196, 1371, 1199, 2548, 1214, 1218,
+ 1221, 1196, 1213, 1199, 1284, 1205, 1201, 739, 2535, 1284,
+ 1284, 1203, 3820, 1201, 1218, 1213, 1214, 1221, 1203, 1371,
+ 1196, 1214, 1218, 1221, 3820, 1213, 1199, 1201, 1203, 1205,
+ 739, 779, 779, 779, 779, 779, 779, 779, 779, 779,
+
+ 779, 779, 779, 1196, 779, 779, 779, 779, 779, 1199,
+ 1207, 1201, 1203, 1212, 1215, 1216, 1224, 1226, 1220, 1292,
+ 1224, 1226, 1512, 1216, 1292, 1215, 1512, 1220, 1207, 1206,
+ 1212, 779, 2524, 1512, 1512, 1516, 1516, 1212, 1215, 1216,
+ 1224, 1226, 1220, 1292, 1224, 1226, 1216, 1292, 1215, 1206,
+ 1220, 1231, 1207, 1212, 779, 780, 780, 780, 780, 780,
+ 780, 780, 780, 780, 780, 780, 780, 780, 780, 780,
+ 780, 780, 780, 1206, 1219, 2519, 1223, 2510, 1261, 1231,
+ 1258, 1258, 1286, 1266, 1261, 1266, 1219, 1286, 1286, 1223,
+ 1230, 1230, 1237, 1222, 2505, 780, 1517, 1517, 1219, 1222,
+
+ 1223, 1261, 1231, 1258, 1258, 2468, 1266, 1261, 1266, 1219,
+ 1245, 1232, 1223, 2459, 1222, 1230, 1237, 1245, 780, 781,
+ 781, 781, 781, 781, 781, 781, 781, 781, 781, 781,
+ 781, 781, 781, 781, 781, 781, 781, 1232, 1222, 1230,
+ 1237, 1239, 1245, 1263, 1267, 1267, 2443, 1300, 1239, 1263,
+ 1311, 1240, 1300, 781, 1239, 1311, 1311, 2087, 1240, 781,
+ 1232, 2439, 1254, 1248, 2087, 1245, 1263, 1267, 1267, 1254,
+ 1248, 1300, 1263, 1271, 1241, 1300, 781, 1254, 1239, 1240,
+ 1248, 1241, 781, 800, 800, 800, 800, 800, 800, 800,
+ 800, 800, 800, 800, 800, 800, 800, 800, 800, 800,
+
+ 800, 1254, 1240, 1241, 1248, 2421, 1271, 1273, 1273, 1296,
+ 1296, 1274, 1380, 1243, 1274, 1246, 1372, 1242, 800, 1961,
+ 1243, 1986, 1246, 800, 1242, 1961, 1241, 1986, 1252, 1271,
+ 1273, 1273, 1296, 1296, 1274, 1252, 1380, 1274, 2416, 1372,
+ 2409, 800, 1242, 1243, 1246, 1252, 800, 801, 801, 801,
+ 801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
+ 801, 801, 801, 801, 801, 1242, 1243, 1246, 1264, 1252,
+ 1306, 1269, 2404, 1293, 1294, 1293, 1306, 1294, 801, 1253,
+ 1264, 1244, 1247, 1345, 1345, 1269, 1253, 801, 1244, 1247,
+ 1544, 1544, 1264, 1306, 1345, 1269, 1293, 1294, 1293, 1306,
+
+ 1294, 801, 2401, 1264, 1545, 1545, 1244, 1247, 1269, 1253,
+ 801, 911, 911, 911, 911, 911, 911, 911, 911, 911,
+ 911, 911, 911, 911, 911, 911, 911, 911, 911, 1244,
+ 1247, 1270, 1253, 1259, 1262, 1268, 2365, 1297, 1297, 1307,
+ 1255, 1257, 1307, 1270, 1268, 1268, 911, 1255, 1257, 1259,
+ 1262, 911, 1454, 1454, 2359, 1270, 2357, 1259, 1262, 1268,
+ 1297, 1297, 1307, 1454, 2352, 1307, 1270, 1268, 1268, 911,
+ 1255, 1257, 1259, 1262, 911, 912, 912, 912, 912, 912,
+ 912, 912, 912, 912, 912, 912, 912, 912, 912, 912,
+ 912, 912, 912, 1255, 1257, 1287, 912, 1288, 1289, 2088,
+
+ 1373, 1275, 1298, 1384, 1291, 1290, 2088, 1275, 1287, 1289,
+ 1288, 1290, 1319, 1291, 1298, 912, 2348, 1319, 1319, 1287,
+ 912, 1288, 1289, 1373, 1330, 2342, 1298, 1384, 1291, 1330,
+ 1330, 1287, 1289, 1288, 1275, 1290, 1291, 1298, 912, 960,
+ 960, 960, 960, 960, 960, 960, 960, 960, 960, 960,
+ 960, 960, 960, 960, 960, 960, 960, 1275, 1290, 1295,
+ 2139, 1299, 1299, 1301, 2340, 1302, 1303, 2139, 1295, 1302,
+ 960, 1374, 1301, 1375, 1303, 1304, 1304, 1308, 1308, 960,
+ 1455, 1455, 2370, 1295, 1299, 1299, 1455, 1301, 1302, 2370,
+ 1303, 1295, 1302, 960, 1374, 1301, 1375, 1303, 1304, 1304,
+
+ 1308, 1308, 960, 961, 961, 961, 961, 961, 961, 961,
+ 961, 961, 961, 961, 961, 961, 961, 961, 961, 961,
+ 961, 2333, 1272, 1305, 1309, 961, 1313, 1316, 1272, 1315,
+ 1272, 1272, 2318, 1309, 1272, 1313, 1305, 1314, 1316, 1315,
+ 1344, 1314, 1370, 961, 1272, 1344, 1344, 1305, 1309, 961,
+ 1313, 1316, 1348, 1315, 1333, 1272, 1309, 1334, 1313, 1305,
+ 1314, 1316, 1315, 2304, 1314, 1322, 961, 1063, 1272, 1324,
+ 1322, 1370, 1324, 1063, 1333, 1063, 1063, 1334, 1272, 1063,
+ 1323, 2296, 1325, 1328, 1348, 1323, 1325, 1328, 1322, 1063,
+ 2068, 1327, 1324, 1322, 1370, 1324, 1327, 1063, 1333, 2068,
+
+ 1063, 1334, 2068, 1323, 1331, 1325, 1328, 1348, 1323, 1325,
+ 1328, 1546, 1546, 1063, 1327, 1548, 1548, 1346, 2291, 1327,
+ 1063, 1335, 1331, 1063, 1310, 1310, 1310, 1310, 1310, 1336,
+ 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310,
+ 1310, 1310, 1337, 1338, 1318, 1318, 1331, 1347, 1339, 1335,
+ 1318, 1346, 1318, 1340, 1341, 1351, 2278, 1336, 1352, 1337,
+ 1351, 1351, 1356, 1356, 1310, 1352, 1318, 1338, 1339, 1340,
+ 1489, 1489, 1335, 1341, 1346, 1352, 1489, 1318, 1349, 1355,
+ 1336, 1347, 1355, 1337, 2272, 1356, 1356, 1310, 1317, 1317,
+ 1318, 1338, 1339, 1340, 1317, 1343, 1343, 1341, 2247, 1352,
+
+ 1318, 1343, 1355, 1343, 1347, 1355, 1359, 1317, 1317, 1317,
+ 1317, 2242, 1349, 1317, 2226, 1317, 1359, 1343, 1400, 1317,
+ 1317, 1317, 1317, 1400, 1400, 1552, 1552, 2217, 1343, 2428,
+ 1359, 1317, 1317, 1317, 1317, 1349, 2428, 1317, 1317, 1359,
+ 2204, 1343, 1317, 1317, 1317, 1317, 1326, 1326, 1326, 1326,
+ 1326, 1343, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1353, 1354, 1357, 1362, 1358, 1364,
+ 1361, 1353, 1357, 1358, 1365, 1363, 1364, 1353, 2430, 1361,
+ 1362, 1354, 1363, 1366, 1364, 2430, 1326, 1376, 1366, 1354,
+ 1365, 1362, 1358, 1367, 1361, 1368, 1358, 1367, 1365, 1357,
+
+ 1377, 1353, 1361, 1362, 1354, 1363, 1368, 1366, 1364, 1326,
+ 1376, 1366, 1369, 1365, 1378, 1379, 1367, 1385, 1386, 1368,
+ 1367, 1387, 1357, 1377, 1390, 1388, 1389, 1392, 1363, 1368,
+ 1391, 1369, 1394, 1393, 1395, 1396, 1403, 1378, 1379, 1402,
+ 1385, 1388, 1386, 1404, 1387, 1411, 1431, 1413, 1397, 1401,
+ 1411, 1411, 1413, 1413, 1403, 1369, 1390, 1389, 1391, 2199,
+ 1392, 1393, 1431, 1396, 1419, 1388, 1395, 1394, 1397, 1401,
+ 1431, 1419, 1402, 1581, 1581, 1421, 1404, 1419, 1403, 1390,
+ 1389, 1391, 1414, 1392, 1393, 1431, 1396, 1414, 1414, 1395,
+ 1394, 1415, 1397, 1401, 1421, 1402, 1415, 1415, 1417, 1404,
+
+ 1418, 1419, 1423, 1417, 1417, 1418, 1418, 1422, 1432, 1423,
+ 1424, 1427, 1427, 1429, 1422, 1430, 1430, 1424, 1421, 1437,
+ 1441, 1481, 1433, 1422, 1496, 1424, 1441, 1429, 1433, 1437,
+ 1427, 1432, 1423, 2138, 1583, 1583, 2011, 1429, 2132, 1430,
+ 1430, 1447, 2011, 1437, 1481, 1433, 1583, 1422, 1496, 1424,
+ 1429, 1433, 1437, 1441, 1427, 1423, 1425, 1425, 1425, 1425,
+ 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425,
+ 1425, 1425, 1425, 1425, 1425, 1434, 1441, 1435, 1447, 1436,
+ 1438, 1439, 2116, 1435, 1436, 1501, 1444, 2103, 1448, 1448,
+ 1502, 1434, 2085, 1439, 1438, 1444, 1425, 2021, 1425, 1434,
+
+ 1435, 1447, 1436, 2021, 1438, 1439, 1435, 1436, 1501, 1443,
+ 1444, 1448, 1448, 1502, 1434, 1443, 1439, 1438, 1444, 1425,
+ 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428,
+ 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1440, 1443,
+ 1442, 1428, 1450, 1446, 1440, 1449, 1440, 1440, 1445, 1451,
+ 1440, 1442, 1446, 1445, 1449, 1450, 2032, 1509, 1541, 1451,
+ 1428, 1509, 1443, 1509, 1442, 1428, 1450, 1446, 1509, 1449,
+ 2016, 1440, 1445, 1451, 1442, 1446, 1445, 1449, 1450, 1452,
+ 1452, 1541, 1451, 1428, 1453, 1452, 1456, 1452, 1457, 1453,
+ 1453, 1456, 1456, 1458, 1440, 1457, 1463, 1459, 1460, 1461,
+
+ 1458, 1457, 1462, 1463, 1459, 1460, 1461, 1464, 1465, 1462,
+ 2035, 1470, 1472, 1466, 1464, 1465, 2035, 1469, 1470, 1472,
+ 1466, 1458, 1474, 1460, 1469, 1457, 1459, 1462, 1463, 1461,
+ 1466, 1473, 1471, 1465, 1469, 1475, 1464, 1478, 1478, 1471,
+ 1480, 1470, 1472, 1480, 1458, 2014, 1460, 1471, 2013, 1459,
+ 1462, 1463, 1461, 1474, 1466, 1475, 1465, 1473, 1469, 1464,
+ 1478, 1478, 1490, 1480, 1470, 1472, 1480, 1490, 1490, 1547,
+ 2008, 1471, 1595, 1595, 1547, 1547, 1474, 1479, 1479, 1475,
+ 1473, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
+ 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
+
+ 1479, 1479, 1482, 1994, 1483, 1484, 1483, 1485, 1484, 1482,
+ 1569, 1485, 1486, 1486, 1487, 2436, 1492, 1487, 1492, 1549,
+ 1979, 1476, 2436, 1476, 1549, 1549, 1482, 1483, 1484, 1483,
+ 1485, 1484, 1482, 1569, 1485, 1486, 1486, 1487, 1497, 1492,
+ 1487, 1492, 1855, 1504, 1476, 1477, 1477, 1477, 1477, 1477,
+ 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477,
+ 1477, 1477, 1477, 1488, 1491, 1493, 1494, 1503, 1495, 1824,
+ 1495, 1497, 1498, 1505, 1488, 1491, 1504, 1493, 1477, 1494,
+ 1505, 1607, 1607, 1614, 1614, 1477, 1644, 1488, 1491, 1493,
+ 1494, 1495, 1498, 1495, 1497, 1819, 1503, 1488, 1491, 1504,
+
+ 1493, 1477, 1494, 1505, 1506, 1508, 1507, 1510, 1477, 1644,
+ 1513, 1506, 1508, 1507, 1510, 1511, 1498, 1513, 1508, 1503,
+ 1792, 1506, 1511, 1513, 1514, 1774, 1505, 1507, 1525, 1709,
+ 1520, 1514, 1511, 1521, 1692, 1523, 1510, 1520, 1629, 1523,
+ 1521, 1523, 1508, 1589, 1525, 1506, 1523, 1513, 1526, 1522,
+ 1521, 1507, 1525, 1522, 1514, 1629, 1511, 1527, 1520, 1510,
+ 1522, 1522, 1526, 1527, 1524, 1529, 1691, 1525, 1524, 1589,
+ 1528, 1530, 1526, 1529, 1521, 1524, 1524, 1514, 1533, 1629,
+ 1531, 1520, 1528, 1530, 1531, 1526, 5156, 1532, 1536, 1529,
+ 1527, 1532, 1589, 1533, 1528, 1530, 1529, 1535, 5156, 1536,
+
+ 1534, 1537, 1533, 1531, 1621, 1528, 1530, 1531, 1534, 1535,
+ 1532, 1654, 1536, 1527, 1532, 1538, 1533, 1537, 1539, 2490,
+ 1539, 1535, 1536, 1560, 1534, 1537, 2490, 1540, 1538, 1540,
+ 1560, 1534, 1535, 1542, 1654, 1542, 1688, 1564, 1621, 1538,
+ 1537, 1539, 1550, 1539, 1623, 1623, 1560, 1550, 1550, 1551,
+ 1540, 1538, 1540, 1560, 1551, 1551, 1542, 1553, 1542, 1554,
+ 1555, 1621, 1553, 1553, 1554, 1554, 1556, 1564, 1557, 1680,
+ 1556, 1555, 1557, 1558, 1558, 1559, 1561, 1561, 1562, 1558,
+ 1559, 1559, 1565, 1563, 1555, 1659, 1565, 1562, 1563, 1556,
+ 1564, 1557, 1566, 1556, 1555, 1557, 1567, 1584, 1567, 1561,
+
+ 1561, 1568, 1562, 1566, 1570, 1565, 1570, 1563, 1659, 1565,
+ 1562, 1563, 1571, 1543, 1568, 1572, 1566, 1573, 1571, 1567,
+ 1573, 1567, 1575, 1577, 1500, 1568, 1566, 1570, 1572, 1570,
+ 1574, 1575, 1576, 1574, 1578, 2063, 1577, 1568, 1578, 1572,
+ 1573, 2063, 1571, 1573, 1576, 1655, 1575, 1577, 1633, 1633,
+ 1585, 1572, 1585, 1574, 1575, 1587, 1574, 1578, 1580, 1577,
+ 1587, 1578, 1576, 1580, 1580, 1571, 1582, 1665, 1665, 1655,
+ 2813, 1582, 1582, 1585, 1594, 1585, 1590, 2813, 1587, 1594,
+ 1594, 1398, 1656, 1587, 1657, 1576, 1579, 1579, 1579, 1579,
+ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
+
+ 1579, 1579, 1579, 1579, 1586, 1588, 1656, 1590, 1657, 1591,
+ 1590, 1592, 1321, 1586, 1596, 1593, 1593, 1588, 1604, 1596,
+ 1596, 1593, 1604, 1593, 1666, 1666, 1579, 1613, 1586, 1591,
+ 1590, 1592, 1603, 1590, 1282, 1588, 1586, 1593, 1603, 1598,
+ 1598, 1604, 1597, 1597, 1277, 1604, 1600, 1600, 1593, 1579,
+ 1598, 1597, 2815, 1591, 1597, 1592, 1599, 1599, 1588, 2815,
+ 1601, 1593, 1603, 1613, 1597, 1599, 1610, 1599, 1599, 1600,
+ 1600, 1593, 1601, 1667, 1667, 1597, 1602, 1606, 1599, 1605,
+ 1615, 1602, 1606, 1606, 1601, 1603, 1613, 1608, 1597, 1599,
+ 1251, 1605, 1608, 1608, 1617, 1601, 1609, 1609, 1597, 1610,
+
+ 1602, 1612, 1599, 1616, 1602, 1609, 1612, 1612, 1609, 1605,
+ 1611, 1611, 1599, 1615, 1618, 1619, 1611, 1150, 1609, 1626,
+ 1626, 1616, 1610, 1620, 1631, 1617, 1630, 1628, 1622, 1609,
+ 1626, 1144, 1605, 1622, 1622, 1624, 1615, 1625, 1625, 1141,
+ 1624, 1624, 1609, 1618, 2850, 1616, 1619, 1096, 1617, 1620,
+ 1630, 2850, 1609, 1627, 1627, 1628, 1632, 1631, 1637, 1625,
+ 1652, 1632, 1632, 1640, 1627, 1637, 1618, 1635, 1635, 1619,
+ 1625, 1634, 1620, 1640, 1630, 1627, 1634, 1634, 1628, 1645,
+ 1631, 1645, 1637, 1625, 1641, 1641, 1627, 1640, 1643, 1635,
+ 1660, 5891, 1642, 1625, 1652, 1643, 1640, 1642, 1662, 1627,
+
+ 1635, 1045, 1645, 5891, 1645, 1637, 1025, 1641, 1641, 1627,
+ 1677, 1677, 1643, 1635, 1660, 1642, 1677, 1652, 1643, 1007,
+ 1642, 984, 1662, 1635, 1638, 1638, 1638, 1638, 1638, 1638,
+ 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638,
+ 1638, 1638, 1646, 1647, 1647, 1647, 1648, 1647, 1663, 1646,
+ 1638, 1648, 1650, 1670, 1647, 1647, 1649, 1649, 1669, 1646,
+ 1684, 1650, 1683, 1683, 1638, 1684, 1684, 1685, 1683, 937,
+ 1648, 1663, 1685, 1685, 1638, 1648, 1650, 1670, 1673, 1649,
+ 1649, 1669, 904, 1646, 1650, 1686, 1686, 1638, 1639, 1639,
+ 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639,
+
+ 1639, 1639, 1639, 1639, 1639, 1639, 1651, 1651, 1651, 1639,
+ 1653, 1673, 1678, 1676, 1675, 1681, 1682, 1674, 1651, 1679,
+ 1687, 1689, 1690, 1693, 1693, 1687, 1687, 1725, 1639, 1676,
+ 1734, 1681, 1653, 1639, 1673, 899, 1651, 1674, 1675, 1679,
+ 1694, 1694, 1690, 897, 1678, 1695, 1695, 1696, 1696, 1682,
+ 1725, 1639, 1689, 1676, 1734, 1681, 1653, 1697, 1697, 1651,
+ 870, 1674, 1675, 1679, 1699, 1699, 1690, 1678, 1700, 1700,
+ 1701, 1701, 1682, 1702, 1716, 1689, 1703, 1703, 1702, 1702,
+ 1704, 1716, 1705, 1716, 1706, 1704, 1704, 1705, 1705, 1706,
+ 1706, 1707, 1707, 1708, 1715, 1710, 799, 1711, 1708, 1708,
+
+ 1710, 1710, 1711, 1711, 1712, 1712, 1713, 1714, 1718, 1717,
+ 757, 1713, 1713, 1715, 1714, 1718, 1717, 1721, 1721, 1722,
+ 1722, 1724, 1714, 1726, 1726, 1718, 1722, 1745, 1722, 1728,
+ 1728, 756, 1745, 1724, 1730, 1730, 1721, 1715, 1717, 1748,
+ 1748, 1754, 1754, 1767, 1767, 1724, 1714, 1726, 1726, 1718,
+ 1745, 1736, 1736, 1728, 1728, 1745, 1724, 1736, 1730, 1730,
+ 1721, 1717, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
+ 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
+ 1727, 1731, 1720, 1729, 1732, 1732, 1727, 1733, 1729, 1737,
+ 1733, 755, 1731, 1735, 1737, 1737, 1801, 1735, 1739, 1739,
+
+ 1727, 2391, 1720, 1768, 1768, 1731, 1720, 1729, 1732, 1732,
+ 2391, 1733, 1729, 2391, 1733, 1731, 1735, 1740, 1741, 1801,
+ 1735, 1739, 1739, 1984, 1727, 1720, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1738, 1742, 1984, 1740, 1741, 754,
+ 1743, 1738, 1743, 1744, 1742, 1985, 1744, 1746, 1746, 749,
+ 1723, 1751, 1751, 1746, 748, 1746, 1723, 1738, 747, 1742,
+ 1740, 1741, 1751, 1743, 1738, 1743, 1744, 1742, 1985, 1744,
+ 1747, 746, 1749, 1723, 727, 1747, 1747, 1749, 1749, 1723,
+ 1750, 1750, 1752, 1752, 1790, 1790, 1818, 1818, 723, 1750,
+
+ 1753, 1752, 1750, 1752, 1752, 1753, 1753, 1755, 1756, 1756,
+ 717, 1757, 1755, 1755, 1758, 1759, 1760, 1756, 1757, 1762,
+ 1756, 1758, 1759, 1760, 1761, 1763, 1762, 1766, 1761, 1760,
+ 1761, 1758, 1763, 1765, 1766, 1761, 1759, 1770, 712, 1775,
+ 1765, 1757, 1763, 1780, 1770, 1771, 1765, 658, 1762, 1776,
+ 1779, 657, 1771, 1760, 1779, 1758, 1989, 1766, 1785, 1782,
+ 1759, 1782, 1771, 1775, 1757, 1770, 1763, 1780, 1776, 1783,
+ 1765, 1762, 1842, 1842, 1779, 1783, 1843, 1843, 1779, 1989,
+ 1766, 653, 1785, 1782, 3147, 1782, 1771, 1775, 1770, 1786,
+ 1783, 3147, 1776, 1777, 1777, 1777, 1777, 1777, 1777, 1777,
+
+ 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777,
+ 1777, 1781, 1784, 1786, 1783, 1781, 1787, 1788, 1793, 1794,
+ 1787, 1789, 1796, 1798, 1784, 1797, 1789, 1789, 1777, 1793,
+ 1788, 1802, 1791, 1777, 652, 1781, 1784, 1791, 1791, 1781,
+ 1787, 1788, 1793, 1794, 1787, 651, 1796, 1784, 611, 1797,
+ 610, 1777, 1793, 1788, 1798, 1802, 1777, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1795, 1803, 1798, 1799, 1778,
+ 1800, 1800, 1804, 1807, 606, 1806, 1811, 1805, 605, 1795,
+ 1807, 1810, 1806, 1811, 1805, 1808, 1990, 1778, 1799, 1795,
+
+ 1805, 1806, 1808, 1778, 1803, 1873, 1804, 1811, 1812, 1807,
+ 1813, 1800, 1795, 1825, 1825, 1812, 1810, 1813, 1808, 1990,
+ 1778, 1810, 1799, 603, 1805, 1806, 600, 1803, 1814, 1873,
+ 1804, 1811, 1807, 1813, 1800, 1814, 1812, 1825, 1825, 1821,
+ 1810, 1808, 1820, 1821, 1810, 1814, 1826, 1829, 1820, 1820,
+ 1821, 1821, 1828, 1822, 1820, 1827, 1813, 1822, 1982, 1812,
+ 1826, 1828, 597, 1830, 1822, 1822, 1832, 1829, 1834, 1814,
+ 1826, 595, 1827, 1831, 1831, 1833, 1828, 1830, 1832, 1827,
+ 1834, 1836, 1982, 1826, 1828, 1833, 1835, 1830, 1836, 1835,
+ 1832, 1829, 1834, 1838, 1837, 1827, 1951, 1831, 1831, 1833,
+
+ 1830, 1832, 1838, 1834, 1839, 1836, 1839, 1840, 1833, 1837,
+ 1835, 1836, 1840, 1835, 1951, 1841, 592, 1838, 1837, 1844,
+ 1844, 1845, 1845, 1846, 1846, 1838, 1847, 1847, 1839, 1841,
+ 1839, 1840, 1837, 1849, 1849, 1848, 1840, 1850, 1951, 1841,
+ 1848, 1848, 1850, 1850, 1851, 1853, 1853, 590, 1852, 1851,
+ 1851, 1854, 1841, 1852, 1852, 1856, 1854, 1854, 1857, 1857,
+ 1856, 1856, 1858, 1859, 1859, 1860, 583, 1858, 1858, 578,
+ 1860, 1860, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861,
+ 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861,
+ 1863, 1864, 1865, 1865, 1863, 1866, 1864, 1864, 1871, 1870,
+
+ 1866, 1866, 1870, 1879, 1879, 1889, 1889, 1861, 577, 1879,
+ 569, 1871, 1861, 553, 1863, 1890, 1890, 1889, 1863, 1891,
+ 1891, 535, 1871, 1870, 1894, 1894, 1870, 1893, 1906, 1906,
+ 1861, 1953, 1893, 1893, 1871, 1861, 1862, 1862, 1862, 1862,
+ 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862,
+ 1862, 1862, 1862, 1862, 1862, 1867, 1867, 1869, 1874, 1872,
+ 1872, 1875, 1876, 534, 1867, 1872, 1953, 1867, 1877, 1884,
+ 1907, 1907, 1876, 1869, 1875, 1874, 1862, 1867, 1862, 440,
+ 1877, 1869, 1874, 1963, 1884, 1875, 1876, 1963, 1867, 1953,
+ 1872, 439, 1877, 1884, 1963, 1876, 1869, 1875, 1874, 1862,
+
+ 1902, 1867, 1881, 1877, 1881, 397, 1885, 1884, 1880, 1880,
+ 1898, 1867, 1868, 1872, 1880, 1880, 1885, 1882, 1868, 1886,
+ 1868, 1868, 1898, 1886, 1868, 1882, 1881, 1898, 1881, 1868,
+ 1885, 1902, 1901, 1880, 1868, 1910, 1910, 2025, 1880, 1885,
+ 393, 1882, 2071, 1886, 2025, 1868, 2025, 1886, 2071, 1882,
+ 2077, 1898, 1901, 1868, 1902, 1899, 2077, 1880, 1868, 1896,
+ 1896, 1880, 1921, 1921, 1903, 1896, 1896, 1899, 1868, 1878,
+ 1900, 1896, 1899, 1954, 1904, 1878, 1901, 1878, 1878, 1919,
+ 1903, 1878, 1903, 1909, 1937, 1900, 1878, 1919, 1909, 1909,
+ 1904, 1878, 1904, 1914, 1900, 1914, 1899, 1954, 1913, 1913,
+
+ 1905, 1905, 1878, 1919, 1903, 1916, 1903, 373, 1900, 1905,
+ 1878, 1919, 1905, 1937, 1904, 1878, 1904, 1914, 1908, 1914,
+ 1913, 1954, 1905, 372, 1916, 1878, 1883, 1908, 371, 1916,
+ 1908, 1913, 1883, 1905, 1883, 1883, 1937, 1915, 1883, 2106,
+ 1908, 1922, 1922, 1883, 1913, 2106, 1905, 1916, 1883, 1917,
+ 1917, 1908, 1915, 1938, 1913, 1917, 1905, 1924, 1928, 1883,
+ 370, 1915, 1924, 1924, 1908, 1925, 1925, 1883, 1930, 1930,
+ 1936, 1929, 1883, 368, 1908, 1915, 1929, 1929, 1928, 1934,
+ 1934, 1938, 1883, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1935, 1887, 1887, 1887, 1887,
+
+ 1887, 1931, 1928, 1936, 1938, 363, 1931, 1931, 1943, 1943,
+ 1934, 1935, 1944, 1944, 1941, 1946, 1947, 1947, 1956, 1956,
+ 1946, 1946, 1959, 1887, 1957, 1957, 1936, 1959, 1959, 1960,
+ 1960, 1993, 1993, 1934, 1995, 1935, 1952, 2010, 2010, 1995,
+ 1995, 361, 1983, 1932, 1932, 1941, 1887, 1888, 1888, 1888,
+ 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888,
+ 1888, 1888, 1888, 1888, 1888, 1932, 1983, 1952, 1941, 1966,
+ 1967, 2015, 2015, 1972, 1972, 1972, 1932, 1988, 1991, 2017,
+ 2017, 1966, 2096, 1920, 1920, 1972, 1967, 1888, 355, 1932,
+ 1952, 352, 1920, 1966, 1967, 1920, 1971, 1971, 1971, 1932,
+
+ 1971, 1988, 1991, 339, 1966, 1920, 2096, 1971, 1971, 1967,
+ 1888, 1897, 1897, 1897, 1897, 1897, 1920, 1897, 1897, 1897,
+ 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1920,
+ 2002, 2002, 1923, 1998, 1933, 1933, 2002, 1939, 1939, 1920,
+ 1933, 1923, 1933, 1939, 1923, 1939, 1942, 1942, 329, 1998,
+ 327, 1897, 2009, 321, 1923, 2166, 1933, 2009, 2009, 1939,
+ 1981, 2166, 1969, 1940, 1940, 1923, 318, 1933, 1942, 1940,
+ 1939, 1940, 1945, 1998, 1897, 1912, 1912, 1969, 1923, 1942,
+ 1933, 1912, 1912, 1939, 1912, 1940, 1969, 1912, 1923, 1968,
+ 1933, 1981, 1942, 1939, 1945, 316, 1940, 1912, 2179, 1968,
+
+ 1969, 1974, 1942, 1980, 2179, 1945, 2012, 1974, 1912, 1940,
+ 1970, 2012, 2012, 1968, 1981, 2018, 2018, 2203, 1945, 1940,
+ 2019, 1912, 1968, 2203, 1974, 2019, 2019, 1970, 1945, 1980,
+ 1974, 1912, 1918, 1918, 1918, 1918, 1918, 315, 1918, 1918,
+ 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918,
+ 1999, 1970, 1980, 1949, 1949, 1950, 1950, 313, 1958, 1949,
+ 1949, 1955, 1955, 2020, 2020, 2022, 2108, 1962, 1962, 1999,
+ 2022, 2022, 1918, 1962, 1962, 1949, 300, 1950, 2046, 2046,
+ 1958, 2005, 1975, 1955, 297, 1987, 1949, 2000, 1950, 1962,
+ 2108, 1958, 293, 1999, 1955, 1918, 1927, 1927, 1975, 1949,
+
+ 1962, 1950, 1927, 1927, 1958, 1927, 1975, 1955, 1927, 1949,
+ 1987, 1950, 2005, 1962, 1958, 1987, 2000, 1955, 1927, 265,
+ 2023, 1975, 2225, 1962, 2001, 2023, 2023, 2004, 2225, 1927,
+ 264, 1976, 1976, 1976, 1987, 2005, 2058, 2058, 1987, 2000,
+ 2059, 2059, 1927, 1976, 263, 2027, 2003, 2003, 1976, 236,
+ 2001, 2004, 1927, 1964, 1964, 1964, 1964, 1964, 1964, 1964,
+ 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964,
+ 1964, 2003, 1976, 2001, 2027, 2004, 2003, 2109, 2028, 2036,
+ 2036, 2038, 2028, 1964, 2028, 235, 2006, 2038, 2037, 2028,
+ 2037, 2031, 2031, 1964, 2007, 2003, 229, 2027, 2031, 2003,
+
+ 2031, 2109, 2036, 2036, 2038, 2039, 1964, 2033, 2033, 2246,
+ 2038, 2037, 2006, 2037, 2007, 2246, 1964, 1965, 1965, 1965,
+ 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965,
+ 1965, 1965, 1965, 1965, 1965, 2006, 2033, 2040, 2007, 2041,
+ 2039, 2042, 2041, 2043, 2062, 2062, 227, 2024, 2112, 2042,
+ 2045, 2040, 2090, 1965, 2024, 2045, 2045, 1965, 225, 2033,
+ 224, 2040, 2041, 2039, 2042, 2041, 2043, 2066, 2066, 2067,
+ 2067, 2112, 2042, 218, 2040, 2044, 1965, 2024, 216, 2044,
+ 1965, 1977, 1977, 1977, 1977, 1977, 2090, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 2044,
+
+ 2024, 2047, 2049, 2044, 2048, 2048, 2047, 2047, 2049, 2090,
+ 2049, 2049, 212, 2048, 2049, 210, 2048, 2057, 2057, 2049,
+ 208, 1977, 2052, 2070, 2070, 2061, 2057, 2065, 2065, 2057,
+ 2061, 2061, 2069, 202, 2051, 2051, 2065, 2069, 2069, 2065,
+ 2051, 201, 2052, 2049, 1977, 2030, 2030, 2030, 2030, 2030,
+ 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030,
+ 2030, 2030, 2030, 2050, 2054, 2051, 2052, 2084, 2084, 2056,
+ 2054, 2095, 2054, 2054, 2086, 2086, 2054, 2104, 2095, 2050,
+ 2030, 2054, 2104, 2104, 2056, 2030, 2089, 2050, 2051, 2053,
+ 2053, 2053, 2263, 2056, 2107, 2095, 2105, 2105, 2263, 2107,
+
+ 2107, 2095, 2050, 2030, 2089, 2054, 2053, 2056, 2030, 2034,
+ 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034,
+ 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2055, 2089, 193,
+ 2053, 2064, 2064, 2055, 2078, 2055, 2055, 2064, 2064, 2055,
+ 2064, 2072, 2072, 2064, 2055, 2073, 192, 2072, 2072, 2034,
+ 2072, 2277, 2073, 2072, 2074, 2075, 2076, 2277, 2073, 2078,
+ 189, 2074, 2075, 2076, 2078, 2093, 2099, 2079, 2055, 2080,
+ 2074, 2099, 2034, 2081, 2079, 2093, 2080, 2118, 2118, 2076,
+ 2081, 2075, 2073, 2078, 2082, 2101, 174, 2078, 2079, 2093,
+ 2099, 2082, 2101, 2117, 2074, 2099, 2081, 2080, 2093, 2097,
+
+ 2097, 2082, 2076, 171, 2075, 2097, 2121, 2134, 2134, 2101,
+ 2121, 160, 2079, 2136, 2136, 2101, 2117, 2121, 2121, 2081,
+ 2080, 2098, 2098, 2102, 2102, 2082, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2100, 2098, 2102, 2102, 2110,
+ 159, 2098, 2123, 2125, 2126, 3282, 2123, 2100, 2221, 2137,
+ 2137, 2110, 3282, 2123, 2123, 2137, 2091, 2129, 2091, 2100,
+ 2098, 2129, 123, 2110, 2098, 90, 2125, 2126, 2129, 2129,
+ 2100, 2221, 2111, 2113, 2110, 2114, 2114, 2115, 89, 2091,
+ 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092,
+
+ 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2094, 2094,
+ 2094, 2092, 2119, 2111, 2113, 85, 2114, 2120, 2115, 2122,
+ 2124, 2156, 2156, 2222, 2120, 2323, 2122, 2127, 2094, 70,
+ 2092, 2120, 2157, 2157, 2127, 2092, 2111, 2113, 2145, 2114,
+ 2119, 2115, 2127, 68, 2122, 2124, 2222, 2128, 2323, 2130,
+ 2124, 2145, 2094, 2092, 2128, 2120, 2130, 2144, 2131, 2143,
+ 65, 2144, 2145, 2119, 2131, 2131, 2127, 2122, 2147, 2124,
+ 2131, 2143, 2133, 2124, 2145, 2128, 2147, 2130, 2133, 2133,
+ 59, 2144, 0, 2143, 2133, 2144, 2158, 2158, 2159, 2159,
+ 2160, 2160, 2147, 0, 2143, 2162, 2162, 2146, 2128, 2147,
+
+ 2130, 2135, 2135, 2135, 2135, 2135, 2146, 2135, 2135, 2135,
+ 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2151,
+ 2149, 2146, 2149, 2152, 2153, 2152, 2321, 2155, 2328, 2146,
+ 2151, 2155, 2163, 2163, 2164, 2153, 2165, 2165, 3324, 2164,
+ 2164, 2135, 0, 2151, 2149, 3324, 2149, 2152, 2153, 2152,
+ 2321, 2155, 2328, 2151, 2167, 2155, 2168, 0, 2153, 2167,
+ 2167, 2168, 2168, 2184, 2135, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2154, 2169, 2169, 2185, 2172, 2174, 2174,
+ 2175, 2175, 2178, 2178, 2184, 2185, 0, 2177, 2154, 2326,
+
+ 2140, 2172, 2177, 2177, 0, 2140, 2295, 2154, 2198, 2198,
+ 2185, 2172, 2295, 2200, 2208, 2208, 0, 2184, 2185, 2200,
+ 2200, 2154, 2326, 2140, 2172, 2200, 2216, 2216, 2140, 2141,
+ 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141,
+ 2141, 2141, 2141, 2141, 2141, 2141, 2141, 0, 2173, 2173,
+ 2176, 2141, 2183, 2181, 2181, 2181, 2182, 2173, 2186, 2176,
+ 2173, 2188, 2176, 2183, 0, 2186, 2256, 2187, 2182, 2141,
+ 2173, 2181, 2176, 2188, 2182, 2141, 2183, 2230, 2230, 2188,
+ 0, 2173, 2186, 2176, 2187, 0, 2183, 2241, 2241, 2186,
+ 2189, 2187, 2141, 2142, 2173, 2181, 2176, 2256, 2182, 2142,
+
+ 0, 2142, 2142, 2188, 2173, 2142, 2176, 2187, 2189, 2195,
+ 2193, 2190, 2190, 2193, 2142, 2142, 2191, 2190, 2190, 2192,
+ 2256, 2191, 2191, 2195, 2192, 2192, 2142, 2194, 2194, 2251,
+ 2251, 0, 2189, 2195, 2193, 0, 2190, 2193, 2142, 2142,
+ 0, 2190, 2206, 2196, 2191, 0, 2195, 2206, 2206, 2142,
+ 2148, 2194, 2194, 2192, 2197, 2196, 2148, 2213, 2148, 2148,
+ 2190, 2196, 2148, 2211, 2190, 0, 2211, 2191, 2197, 2258,
+ 2258, 2148, 2148, 2351, 2201, 2201, 2192, 2213, 2197, 2351,
+ 2201, 2201, 2202, 2148, 2212, 2196, 2201, 2211, 2202, 2202,
+ 2211, 2197, 2205, 2205, 2202, 2148, 2148, 2209, 2205, 2205,
+
+ 2219, 2213, 2209, 2209, 2205, 2214, 2148, 2150, 2259, 2259,
+ 0, 2212, 2210, 2150, 2364, 2150, 2150, 2210, 2210, 2150,
+ 2364, 2228, 2219, 2210, 3615, 2215, 2228, 2228, 2150, 2150,
+ 2231, 3615, 2232, 2219, 2212, 2231, 2231, 2232, 2232, 2214,
+ 2150, 0, 2249, 2262, 2262, 2252, 2219, 2249, 2249, 2233,
+ 2252, 2252, 2150, 2150, 2233, 2233, 2219, 2269, 2269, 2215,
+ 0, 2265, 2214, 2150, 2170, 2170, 2170, 2170, 2170, 2170,
+ 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170,
+ 2170, 2170, 2215, 2233, 2236, 2235, 2240, 2237, 0, 2234,
+ 2237, 2268, 2265, 2253, 2234, 2234, 2236, 2240, 2253, 2253,
+
+ 2266, 2235, 2271, 2271, 2170, 0, 2233, 2261, 2236, 2235,
+ 2240, 2237, 2261, 2261, 2237, 2265, 2280, 2282, 2282, 2236,
+ 2240, 2280, 2280, 2234, 2235, 2268, 2266, 2170, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2234, 2171, 2268, 2266,
+ 2218, 2290, 2290, 2287, 2224, 0, 2218, 2218, 2327, 2218,
+ 2224, 2224, 2218, 2224, 2267, 2270, 2224, 0, 2171, 2254,
+ 2372, 2171, 2218, 2255, 2254, 2254, 2224, 0, 2255, 2255,
+ 2286, 2327, 2287, 2218, 2283, 2270, 2260, 2224, 2267, 2283,
+ 2283, 2171, 2180, 2180, 2372, 2288, 2218, 2329, 2180, 2180,
+
+ 2224, 2180, 0, 2254, 2180, 2287, 2218, 2255, 2260, 2270,
+ 2224, 2284, 2267, 2286, 2180, 2288, 2284, 2284, 2298, 2260,
+ 2329, 2229, 2229, 2298, 2298, 2180, 2254, 2229, 2229, 0,
+ 2255, 2373, 2260, 2300, 2300, 2301, 2286, 2373, 2180, 2288,
+ 2301, 2301, 2260, 2229, 0, 2284, 2289, 2274, 2180, 2207,
+ 2207, 2207, 2207, 2207, 2229, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2229, 2284, 2274,
+ 2285, 2453, 2243, 2331, 2289, 2285, 2285, 2229, 2243, 2243,
+ 2274, 2243, 0, 2307, 2243, 2311, 2311, 0, 2307, 2207,
+ 0, 2311, 0, 2274, 2243, 2453, 2331, 2289, 2335, 2335,
+
+ 0, 2319, 2332, 2274, 2285, 2243, 2307, 2332, 2332, 2250,
+ 2250, 2307, 2207, 2223, 2223, 2250, 2250, 2245, 2243, 2223,
+ 2223, 2319, 2223, 2245, 2245, 2223, 2245, 2285, 2243, 2245,
+ 2309, 2250, 2302, 2309, 2339, 2223, 0, 2302, 2302, 2245,
+ 2320, 0, 2250, 2334, 2377, 2319, 2223, 2345, 2334, 2334,
+ 2245, 2339, 2257, 2257, 2309, 2250, 2320, 2309, 2394, 2223,
+ 2377, 2264, 2264, 2245, 2394, 2250, 2302, 2264, 2264, 2223,
+ 2227, 2227, 2408, 2245, 2257, 2339, 2227, 2227, 2408, 2227,
+ 2320, 2345, 2227, 2264, 2377, 2257, 2310, 2310, 0, 2302,
+ 2303, 2314, 2227, 0, 2264, 2303, 2303, 2314, 2257, 2273,
+
+ 2312, 2312, 2312, 2227, 2345, 2273, 2273, 2264, 2257, 2420,
+ 2310, 2310, 2312, 0, 2314, 2420, 2227, 2264, 2336, 2336,
+ 2314, 2273, 0, 2325, 2303, 2347, 2227, 2238, 2238, 2238,
+ 2238, 2238, 2273, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2273, 2350, 2303, 2325, 2337,
+ 2337, 2350, 2350, 2325, 0, 2273, 2347, 2353, 0, 2354,
+ 2341, 2386, 2353, 2353, 2354, 2354, 2386, 2238, 2308, 2308,
+ 2308, 0, 2325, 2355, 2355, 2356, 2325, 2358, 2358, 2347,
+ 2356, 2356, 2360, 2360, 2386, 2349, 2308, 2344, 2341, 2386,
+ 2238, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239,
+
+ 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2397,
+ 2308, 2341, 2275, 2275, 2276, 2344, 2349, 0, 2275, 2275,
+ 2276, 2276, 2361, 2361, 2362, 2362, 2279, 2279, 2368, 2368,
+ 3719, 2239, 2279, 2279, 2275, 0, 2276, 3719, 2344, 2349,
+ 2397, 2343, 2343, 2281, 2281, 2275, 0, 2276, 2279, 2281,
+ 2281, 2315, 2315, 2315, 2239, 2244, 2244, 0, 2275, 2279,
+ 2276, 2244, 2244, 2397, 2244, 2281, 2343, 2244, 2275, 2315,
+ 2276, 2343, 2279, 2346, 2292, 0, 2281, 2244, 2363, 2432,
+ 2292, 2292, 2279, 2363, 2363, 2374, 2374, 2371, 2244, 2281,
+ 2343, 2346, 2366, 2315, 2343, 0, 2292, 2366, 2366, 2281,
+
+ 2367, 2244, 2432, 2293, 2293, 2367, 2367, 2292, 2458, 2293,
+ 2293, 2244, 2248, 2248, 2458, 2346, 2371, 2369, 2248, 2248,
+ 2292, 2248, 2369, 2369, 2248, 2293, 2376, 2376, 2389, 2389,
+ 2292, 2294, 2390, 2390, 2248, 0, 2293, 2294, 2294, 2371,
+ 2297, 2297, 2378, 2378, 0, 2248, 2297, 2297, 2378, 2293,
+ 2464, 2379, 0, 2294, 0, 2376, 2379, 2379, 2248, 2293,
+ 2299, 2299, 2297, 3724, 2294, 2380, 2299, 2299, 2248, 2382,
+ 3724, 2380, 2433, 2297, 2464, 2382, 2387, 2294, 2376, 2388,
+ 2388, 0, 2299, 2393, 2393, 0, 2297, 2294, 2388, 2380,
+ 2387, 2388, 2382, 2299, 2380, 2433, 2297, 2392, 2382, 0,
+
+ 2387, 0, 2392, 2392, 2403, 2403, 2299, 2398, 2398, 2398,
+ 2383, 2383, 2383, 2387, 2413, 2413, 2299, 2305, 2305, 2305,
+ 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305, 2305,
+ 2305, 2305, 2305, 2305, 2305, 2395, 2395, 2383, 2415, 2415,
+ 2402, 2395, 2395, 2402, 2395, 2425, 2425, 2395, 2411, 2509,
+ 2381, 2305, 0, 2411, 2411, 2509, 2381, 2305, 2381, 2381,
+ 2383, 3754, 2381, 2405, 2402, 2438, 2438, 2402, 3754, 2405,
+ 2405, 0, 2405, 2412, 2305, 2405, 2447, 2381, 2412, 2412,
+ 2305, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306,
+ 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2306, 2447,
+
+ 2381, 2396, 2396, 2396, 2406, 2406, 2440, 2440, 2454, 2306,
+ 2406, 2406, 2469, 2406, 2384, 0, 2406, 0, 2407, 2396,
+ 2384, 2306, 2384, 2384, 2407, 2407, 2384, 2407, 2410, 2410,
+ 2407, 2454, 2306, 2414, 2410, 2410, 2469, 2410, 2414, 2414,
+ 2410, 2384, 0, 2396, 2306, 2316, 2316, 2316, 2316, 2316,
+ 0, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316, 2316,
+ 2316, 2316, 2316, 2417, 2384, 2441, 2441, 2418, 2418, 2417,
+ 2417, 0, 2417, 2418, 2418, 2417, 2418, 2456, 2385, 2418,
+ 2442, 2442, 2419, 0, 2385, 2316, 2385, 2385, 2419, 2419,
+ 2385, 2419, 2422, 2422, 2419, 2462, 2462, 2423, 2422, 2422,
+
+ 2456, 2422, 2423, 2423, 2422, 2385, 2431, 2444, 2316, 2375,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2375,
+ 2375, 2375, 2375, 2375, 2375, 2375, 2375, 2424, 2385, 2426,
+ 2427, 2431, 2424, 2424, 2426, 2426, 2431, 2427, 2444, 2434,
+ 2580, 2435, 2465, 2437, 2427, 2429, 2434, 2523, 2435, 2375,
+ 2437, 2457, 2429, 2523, 2434, 2431, 2457, 2457, 0, 2431,
+ 0, 2444, 0, 2452, 2580, 2465, 2450, 2450, 2427, 2435,
+ 2429, 2437, 2375, 2399, 2399, 2399, 2399, 2399, 2434, 2399,
+ 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399,
+ 2399, 2450, 2435, 2429, 2437, 2460, 2450, 2452, 2470, 2470,
+
+ 2460, 2460, 2461, 2475, 2451, 2463, 2467, 2461, 2461, 0,
+ 2463, 2463, 2466, 2399, 0, 2450, 2631, 2473, 0, 2450,
+ 2452, 2473, 2631, 2473, 2479, 2479, 2475, 4021, 2473, 2473,
+ 2481, 2481, 2451, 2466, 4021, 2467, 2399, 2445, 2445, 2445,
+ 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445,
+ 2445, 2445, 2445, 2445, 2445, 2451, 2445, 2466, 2467, 2476,
+ 0, 2478, 2705, 2476, 0, 2478, 2485, 2485, 2705, 2474,
+ 2476, 2476, 2478, 2478, 2472, 2471, 2474, 2445, 2482, 0,
+ 2445, 2472, 2483, 2483, 2482, 2482, 2486, 2486, 2483, 4122,
+ 2482, 2488, 2488, 0, 2497, 2471, 4122, 2472, 0, 2474,
+
+ 2445, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446,
+ 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2471,
+ 2472, 2487, 2474, 0, 2498, 2477, 2497, 2487, 2487, 2493,
+ 2493, 2493, 2477, 2487, 2494, 2498, 2579, 2496, 0, 2494,
+ 2496, 2446, 2504, 2504, 2506, 2506, 2477, 2507, 2498, 2497,
+ 2508, 2508, 2507, 2507, 2513, 2513, 0, 2494, 2498, 2579,
+ 2496, 2493, 2494, 2496, 2446, 2448, 2448, 2448, 2448, 2448,
+ 2477, 2448, 2448, 2448, 2448, 2448, 2448, 2448, 2448, 2448,
+ 2448, 2448, 2448, 2495, 2493, 2499, 0, 2500, 2768, 2500,
+ 2495, 2501, 2503, 2501, 2768, 2503, 2499, 2511, 2518, 2518,
+
+ 2502, 5737, 2511, 2511, 2704, 2448, 0, 2495, 5737, 2499,
+ 2500, 2502, 2500, 2495, 2501, 2503, 2501, 2512, 2503, 2499,
+ 2514, 0, 2512, 2512, 2502, 2514, 2514, 2704, 2448, 2480,
+ 2480, 2480, 2480, 2480, 2502, 2480, 2480, 2480, 2480, 2480,
+ 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2526, 2528, 2528,
+ 2529, 0, 2526, 2526, 2530, 2529, 2529, 2550, 2550, 2530,
+ 2530, 0, 2515, 2515, 2533, 2533, 2541, 2541, 2515, 2480,
+ 2533, 2537, 2541, 2552, 2552, 2553, 2553, 0, 2531, 0,
+ 2532, 2553, 0, 2531, 2531, 2532, 2532, 2515, 2556, 2556,
+ 2569, 2537, 2480, 2484, 2484, 2484, 2484, 2484, 2484, 2484,
+
+ 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484,
+ 2484, 2515, 2531, 2554, 2532, 2537, 2562, 2562, 2554, 2554,
+ 2543, 2569, 2542, 2542, 2549, 2543, 2543, 0, 2542, 2542,
+ 2549, 2549, 2707, 2484, 2557, 2531, 2549, 2532, 0, 2557,
+ 2557, 2561, 2558, 2558, 2569, 2563, 2561, 2561, 2558, 2558,
+ 2563, 2563, 2542, 2543, 2558, 2707, 2484, 2491, 2491, 2491,
+ 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491,
+ 2491, 2491, 2491, 2491, 2491, 2542, 2543, 2559, 2564, 2564,
+ 0, 2565, 2559, 2559, 2564, 2564, 2565, 2565, 2559, 0,
+ 2564, 2750, 2566, 2568, 2568, 2567, 0, 2491, 2566, 0,
+
+ 2566, 2573, 2573, 2575, 2575, 2576, 2576, 2583, 2583, 2570,
+ 2591, 2591, 2577, 2577, 2750, 2567, 2578, 2578, 2604, 2604,
+ 2491, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492,
+ 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2567,
+ 2570, 2577, 2581, 2709, 2584, 2578, 2586, 2581, 2581, 2584,
+ 2584, 2586, 2586, 2590, 2492, 2606, 2606, 2812, 2590, 2590,
+ 2592, 2492, 0, 2570, 2577, 2592, 2592, 2709, 2578, 2587,
+ 2607, 2607, 0, 2588, 2587, 2587, 2594, 2492, 2588, 2588,
+ 2812, 2594, 2594, 2642, 2492, 2516, 2516, 2516, 2516, 2516,
+ 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
+
+ 2516, 2516, 2516, 2587, 2594, 2595, 0, 2588, 2612, 2612,
+ 2595, 2595, 2642, 2516, 0, 2608, 2608, 0, 2609, 2609,
+ 2620, 2620, 2595, 2610, 2814, 2516, 2587, 2594, 2610, 2610,
+ 2588, 2814, 2613, 0, 2615, 2642, 2516, 2613, 2613, 2615,
+ 2615, 2626, 2626, 0, 2608, 2814, 2595, 2609, 2516, 2517,
+ 2517, 2517, 2517, 2517, 2517, 2517, 2517, 2517, 2517, 2517,
+ 2517, 2517, 2517, 2517, 2517, 2517, 2517, 2608, 2520, 2814,
+ 2609, 2839, 2517, 0, 2520, 2520, 2827, 2520, 0, 2616,
+ 2520, 2617, 2827, 2517, 2616, 2616, 2617, 2617, 2619, 2517,
+ 2520, 2636, 2636, 2619, 2619, 2839, 2517, 2527, 2527, 2641,
+
+ 2641, 2520, 2621, 2527, 2527, 0, 2517, 2621, 2621, 2644,
+ 2644, 2522, 2517, 2616, 2520, 2617, 0, 2522, 2522, 2527,
+ 2522, 0, 2624, 2522, 2520, 2521, 2521, 2624, 2624, 2828,
+ 2527, 2521, 2521, 2522, 2521, 2828, 2616, 2521, 2617, 2624,
+ 2536, 2648, 2648, 2527, 2522, 2634, 2536, 2521, 2536, 2536,
+ 2634, 2634, 2536, 2527, 2828, 2637, 0, 2522, 2521, 2623,
+ 2637, 2637, 2536, 2624, 2623, 2623, 0, 2522, 2538, 2643,
+ 0, 2521, 2640, 2536, 2538, 0, 2538, 2538, 2828, 2638,
+ 2538, 2521, 2525, 2525, 2638, 2638, 2536, 2623, 2525, 2525,
+ 2538, 2525, 2640, 2639, 2525, 0, 2536, 2544, 2639, 2639,
+
+ 0, 2538, 2643, 2544, 2525, 2544, 2544, 2650, 2650, 2544,
+ 2623, 2572, 0, 2638, 2538, 2525, 2640, 2572, 2572, 2544,
+ 2572, 2655, 2655, 2572, 2538, 2643, 2653, 2639, 2525, 2656,
+ 2544, 2653, 2653, 2572, 2656, 2656, 2638, 2667, 2525, 2539,
+ 2829, 2651, 2651, 2544, 2572, 2539, 2829, 2539, 2539, 2666,
+ 2639, 2539, 2838, 2544, 2545, 2652, 2652, 2572, 2838, 2660,
+ 2545, 2539, 2545, 2545, 2660, 2660, 2545, 2572, 2574, 2539,
+ 2651, 2667, 2539, 2666, 2574, 2574, 2545, 2661, 2661, 2668,
+ 2668, 2672, 2672, 2662, 2652, 2539, 0, 2545, 2662, 2662,
+ 2574, 0, 2539, 2651, 2667, 2539, 2540, 2666, 0, 2669,
+
+ 2545, 2574, 2540, 2547, 2540, 2540, 0, 2652, 2540, 2547,
+ 2545, 2547, 2547, 0, 2574, 2547, 2674, 2674, 2540, 2669,
+ 0, 2677, 2645, 2645, 2574, 2547, 2677, 2677, 2645, 2540,
+ 2540, 2679, 2679, 0, 2582, 2582, 2547, 2685, 2685, 2598,
+ 2582, 2582, 2540, 2669, 2645, 2598, 0, 2598, 2598, 2547,
+ 0, 2598, 2540, 2540, 2546, 2645, 2582, 2711, 2711, 2547,
+ 2546, 2598, 2546, 2546, 2680, 2845, 2546, 2582, 2645, 2680,
+ 2680, 2845, 2598, 2702, 2702, 2702, 2546, 2845, 2645, 2546,
+ 2582, 2712, 2712, 2625, 2625, 2598, 0, 2546, 2684, 2625,
+ 2582, 2625, 2665, 2684, 2684, 2598, 3064, 2665, 2665, 2722,
+
+ 2546, 2658, 3064, 2546, 0, 2625, 2658, 2658, 2719, 2665,
+ 2546, 2551, 2551, 2551, 2551, 2551, 2625, 2551, 2551, 2551,
+ 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2625,
+ 2693, 2693, 2722, 2665, 2719, 2658, 2693, 2659, 0, 2625,
+ 2686, 0, 2659, 2659, 2664, 2686, 2686, 2589, 2589, 2664,
+ 2664, 2551, 0, 2589, 2589, 2722, 2689, 2719, 2658, 2699,
+ 2699, 2689, 2689, 2713, 2713, 2699, 0, 2675, 2675, 2589,
+ 0, 2659, 2664, 2689, 2551, 2555, 2555, 2555, 2555, 2555,
+ 2589, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555,
+ 2555, 2555, 2555, 2589, 2659, 2664, 2675, 2689, 2715, 2715,
+
+ 2716, 2716, 2682, 2589, 3102, 2676, 2676, 2682, 2682, 2692,
+ 3102, 2714, 2849, 2692, 0, 2555, 2714, 2714, 0, 2675,
+ 2717, 2717, 2718, 0, 2683, 2720, 2720, 2718, 2718, 2683,
+ 2683, 2720, 0, 2692, 2676, 2849, 2682, 2692, 2555, 2560,
+ 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560,
+ 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2676, 2683, 2682,
+ 2603, 2727, 2727, 2698, 2698, 2698, 2603, 2603, 2605, 2603,
+ 2703, 2724, 2603, 2978, 2605, 2605, 2733, 2733, 0, 2560,
+ 0, 2683, 2603, 2688, 2698, 2611, 2611, 0, 2688, 2688,
+ 2605, 2611, 2611, 2603, 2726, 2724, 2978, 2703, 2874, 2726,
+
+ 2726, 2605, 2560, 2585, 2585, 0, 2603, 2611, 2698, 2585,
+ 2585, 2688, 2585, 0, 2605, 2585, 2603, 0, 2611, 2724,
+ 2703, 2728, 2618, 2618, 2605, 2585, 2728, 2728, 2618, 2618,
+ 0, 2611, 2729, 2874, 2688, 0, 2585, 2729, 2729, 0,
+ 2628, 2611, 2736, 2736, 2618, 2706, 2628, 2628, 2730, 2585,
+ 2737, 2737, 2706, 2730, 2730, 2618, 2874, 2629, 2629, 2585,
+ 2593, 2593, 2628, 2629, 2629, 2731, 2593, 2593, 2618, 2593,
+ 2731, 2731, 2593, 2628, 3146, 2706, 2738, 2738, 2618, 2629,
+ 2739, 2739, 2593, 2740, 2740, 2630, 2628, 0, 2633, 2633,
+ 2629, 2630, 2630, 2593, 2633, 2633, 2628, 3146, 2706, 2732,
+
+ 2741, 2741, 2647, 2629, 2732, 2732, 2593, 2630, 2647, 2647,
+ 2633, 2743, 2743, 2629, 2734, 2870, 2593, 2596, 2630, 2734,
+ 2734, 2633, 2735, 2596, 2647, 2596, 2596, 2735, 2735, 2596,
+ 3142, 2630, 2742, 2778, 2633, 2647, 3142, 2742, 2742, 2596,
+ 2844, 2630, 2596, 2754, 2633, 2635, 2635, 2844, 2647, 2870,
+ 2596, 2635, 2635, 2778, 2649, 2747, 2747, 2844, 2647, 0,
+ 2649, 2649, 2671, 2596, 2721, 2721, 2596, 2635, 2671, 2671,
+ 2754, 2721, 2870, 2596, 2597, 0, 2649, 2778, 2635, 3207,
+ 2597, 2844, 2597, 2597, 2671, 3207, 2597, 2649, 2751, 2751,
+ 0, 2635, 2744, 2754, 2721, 2671, 2597, 2744, 2744, 2745,
+
+ 2649, 2635, 2752, 2752, 2745, 2745, 2746, 2597, 2671, 2597,
+ 2649, 2746, 2746, 2756, 2756, 2840, 2748, 2721, 2671, 2749,
+ 2597, 2748, 2748, 2755, 2749, 2749, 2763, 2763, 2755, 2755,
+ 2597, 2840, 2597, 2599, 2599, 2599, 2599, 2599, 2599, 2599,
+ 2599, 2599, 2599, 2599, 2599, 0, 2599, 2599, 2599, 2599,
+ 2599, 2757, 2765, 2773, 2773, 2840, 2757, 2757, 2765, 2765,
+ 2771, 2765, 2783, 2783, 2765, 2771, 2771, 0, 2766, 2766,
+ 2761, 2761, 2761, 2599, 2766, 2766, 2767, 2766, 2784, 2784,
+ 2766, 2772, 2767, 2767, 2774, 2767, 2772, 2772, 2767, 2774,
+ 2774, 2761, 2785, 2785, 2788, 2788, 2599, 2600, 2600, 2600,
+
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2761, 2654, 2654, 2657, 2657,
+ 2663, 2663, 2654, 2654, 2657, 2657, 2663, 2663, 2775, 2775,
+ 2786, 2792, 2792, 2962, 2775, 2786, 2786, 2600, 2654, 2787,
+ 2657, 2789, 2663, 0, 2787, 2787, 2789, 2789, 3277, 2654,
+ 2791, 2657, 2793, 2663, 3277, 2791, 2791, 2793, 2793, 3695,
+ 2600, 2601, 2654, 2869, 2657, 2962, 2663, 2601, 3695, 2601,
+ 2601, 3695, 2654, 2601, 2657, 3429, 2663, 2797, 2797, 2841,
+ 2673, 3429, 2601, 2601, 2798, 2798, 2673, 2673, 2962, 2678,
+ 2678, 2799, 2799, 2869, 2601, 2678, 2678, 2841, 2681, 2681,
+
+ 2802, 2802, 2673, 2782, 2681, 2681, 2601, 2601, 3466, 2782,
+ 2782, 2678, 2782, 2673, 3466, 2782, 2869, 2601, 2614, 2614,
+ 2681, 2841, 2678, 2800, 2614, 2614, 2673, 2614, 2800, 2800,
+ 2614, 2681, 2801, 2806, 2806, 2678, 2673, 2801, 2801, 0,
+ 2614, 2816, 2816, 2977, 2681, 2678, 2687, 2687, 0, 2770,
+ 2770, 2614, 2687, 2687, 2681, 2770, 2770, 2803, 2770, 0,
+ 2805, 2770, 2803, 2803, 2614, 2805, 2805, 2977, 2687, 2817,
+ 2817, 2790, 2790, 0, 2614, 2622, 2622, 2790, 2790, 2687,
+ 2790, 2622, 2622, 2790, 2622, 2818, 2818, 2622, 2807, 2794,
+ 2794, 0, 2687, 2807, 2807, 2794, 2794, 2622, 2794, 0,
+
+ 2796, 2794, 2687, 0, 2804, 2804, 2796, 2796, 2622, 2796,
+ 2804, 2804, 2796, 2804, 2819, 2819, 2804, 2808, 2808, 2820,
+ 2820, 2622, 2826, 2808, 2808, 0, 2808, 2821, 2821, 2808,
+ 0, 2622, 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690,
+ 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690, 2690,
+ 2810, 0, 2830, 3141, 2810, 2826, 2810, 2830, 2830, 2831,
+ 2831, 2810, 2811, 2835, 2835, 2832, 2843, 2843, 2809, 2811,
+ 2832, 2832, 2690, 2822, 2833, 2809, 2834, 3141, 2826, 2833,
+ 2833, 2834, 2834, 2836, 2846, 2846, 2853, 2853, 2836, 2836,
+ 0, 2809, 2811, 2822, 0, 2690, 2691, 2691, 2691, 2691,
+
+ 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691,
+ 2691, 2691, 2691, 2691, 2809, 2811, 2837, 2822, 2691, 2854,
+ 2854, 2837, 2837, 2855, 0, 2825, 2825, 2847, 3148, 2855,
+ 2855, 3281, 2825, 3323, 2847, 2855, 2691, 2856, 2856, 2858,
+ 2858, 2864, 2691, 2860, 2860, 2861, 2861, 2864, 2864, 2860,
+ 2865, 2865, 3148, 2864, 3281, 2825, 3323, 2847, 2873, 2691,
+ 2696, 2696, 2696, 2696, 2696, 2696, 2696, 2696, 2696, 2696,
+ 2696, 2696, 2696, 2696, 2696, 2696, 2696, 2696, 2825, 2851,
+ 2847, 2866, 2866, 2873, 2878, 2878, 2851, 2879, 2879, 2880,
+ 2880, 2882, 2882, 2881, 2889, 2851, 2883, 2876, 2881, 2881,
+
+ 2696, 2883, 2883, 2884, 0, 2885, 0, 2873, 2884, 2884,
+ 2885, 2885, 2886, 2886, 0, 2887, 2896, 2896, 2876, 2851,
+ 2887, 2887, 2889, 2696, 2697, 2697, 2697, 2697, 2697, 2697,
+ 2697, 2697, 2697, 2697, 2697, 2697, 2697, 2697, 2697, 2697,
+ 2697, 2697, 2876, 2888, 3498, 2889, 2892, 0, 2888, 2888,
+ 3498, 2892, 2892, 2697, 2893, 2893, 2898, 2898, 2899, 2899,
+ 2893, 2902, 2904, 2904, 2697, 2893, 2902, 2902, 2905, 2912,
+ 2912, 2924, 2924, 2905, 2905, 0, 2697, 2900, 2900, 2901,
+ 2901, 2929, 2929, 2924, 2931, 2931, 0, 2697, 2759, 2759,
+ 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759, 2759,
+
+ 2759, 2759, 2759, 2759, 2759, 2759, 2900, 2907, 2901, 3198,
+ 2911, 3316, 2907, 2907, 2908, 2911, 2911, 2913, 2932, 2908,
+ 2908, 2759, 2913, 2913, 2932, 2932, 2935, 2935, 2759, 2900,
+ 2932, 2901, 2916, 3198, 2918, 3316, 2909, 2916, 2916, 2918,
+ 2918, 2909, 2909, 3004, 2759, 2936, 2936, 0, 2908, 2916,
+ 0, 2759, 2760, 2760, 2760, 2760, 2760, 2760, 2760, 2760,
+ 2760, 2760, 2760, 2760, 2760, 2760, 2760, 2760, 2760, 2760,
+ 2909, 2908, 2919, 2916, 2922, 2926, 2926, 3004, 2922, 2933,
+ 2933, 2926, 2926, 2915, 0, 2933, 2938, 2938, 2915, 2915,
+ 2919, 2940, 2760, 2909, 2941, 2941, 2940, 2940, 2922, 2942,
+
+ 3004, 2922, 0, 2925, 2942, 2942, 2923, 2923, 2925, 2925,
+ 0, 2915, 2923, 2923, 2919, 2760, 2762, 2762, 2762, 2762,
+ 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762, 2762,
+ 2762, 2762, 2762, 2762, 2915, 2944, 2923, 2925, 2928, 2937,
+ 2944, 2944, 2943, 2943, 3570, 2937, 2937, 2928, 2943, 2943,
+ 3570, 2937, 2946, 2946, 2943, 3599, 2762, 0, 2947, 2923,
+ 2925, 3599, 2928, 2947, 2947, 2948, 2948, 2949, 0, 2950,
+ 2928, 0, 2949, 2949, 2950, 2950, 0, 2948, 2949, 2762,
+ 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779,
+ 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2779, 2953, 2953,
+
+ 2954, 2956, 2956, 2955, 2953, 2953, 2954, 2954, 2955, 2955,
+ 2953, 2957, 2954, 2959, 2960, 3440, 2957, 2957, 2959, 2959,
+ 2779, 2964, 2964, 2966, 2966, 2968, 2968, 2972, 2972, 0,
+ 2963, 2973, 2973, 0, 2969, 2969, 0, 2970, 2970, 2981,
+ 2981, 3440, 2960, 2779, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780,
+ 2780, 2780, 2963, 2969, 3440, 2960, 2970, 2980, 3461, 2982,
+ 2976, 2976, 2980, 2980, 2982, 2982, 2986, 2986, 2997, 2997,
+ 2975, 2975, 2976, 0, 2780, 2963, 2969, 2984, 0, 2970,
+ 2987, 3461, 2984, 2984, 2989, 2987, 2987, 3005, 3005, 2989,
+
+ 2989, 3007, 3007, 2975, 3009, 3009, 2976, 2780, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2975, 3013, 3013, 3014,
+ 3014, 3020, 3020, 2990, 0, 2991, 2823, 2996, 2990, 2990,
+ 2991, 2991, 2996, 2996, 2998, 3025, 3025, 0, 2823, 2998,
+ 2998, 0, 2999, 3036, 3036, 0, 3019, 2999, 2999, 2823,
+ 3000, 3019, 3019, 3045, 3045, 3000, 3000, 2990, 0, 2991,
+ 2999, 2823, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824,
+ 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824,
+ 2990, 3000, 2991, 2993, 2999, 3021, 3042, 3042, 2993, 2993,
+
+ 3021, 3021, 3042, 2992, 3010, 3010, 0, 3042, 2992, 2992,
+ 2993, 3023, 2824, 3026, 3000, 3028, 3023, 3023, 3026, 3026,
+ 3028, 3028, 3047, 3047, 3052, 3052, 3058, 3058, 3011, 3011,
+ 3338, 2992, 0, 3010, 2993, 2824, 2852, 2852, 2852, 2852,
+ 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852,
+ 2852, 2852, 2852, 2852, 2992, 3338, 3010, 3011, 0, 3017,
+ 3017, 3035, 3616, 3029, 3069, 3069, 3035, 3035, 3029, 3029,
+ 0, 3017, 2872, 3016, 3016, 3462, 2852, 3037, 2872, 3338,
+ 3011, 2872, 3037, 3037, 2872, 3041, 3616, 3030, 3071, 3071,
+ 3041, 3041, 3030, 3030, 2872, 3017, 3016, 3029, 3462, 2852,
+
+ 2857, 2857, 2857, 2857, 2857, 2872, 2857, 2857, 2857, 2857,
+ 2857, 2857, 2857, 2857, 2857, 2857, 2857, 2857, 2872, 3016,
+ 3029, 3030, 3075, 3075, 3050, 3076, 3076, 3053, 2872, 3050,
+ 3050, 3031, 3053, 3053, 3081, 3081, 3031, 3031, 3086, 3086,
+ 2857, 3057, 0, 3038, 3030, 3059, 3057, 3057, 3038, 3038,
+ 3059, 3059, 3039, 0, 2891, 2891, 0, 3039, 3039, 3031,
+ 2891, 3038, 2891, 2857, 2862, 2862, 2862, 2862, 2862, 2862,
+ 2862, 2862, 2862, 2862, 2862, 2862, 2891, 2862, 2862, 2862,
+ 2862, 2862, 3031, 3039, 3032, 3038, 3068, 2891, 0, 3032,
+ 3032, 3068, 3068, 3635, 3048, 3048, 3747, 3049, 3049, 3635,
+
+ 2891, 3032, 3080, 0, 2862, 0, 3039, 3080, 3080, 3082,
+ 2891, 3096, 3096, 3055, 3082, 3082, 3056, 0, 3055, 3055,
+ 3747, 3056, 3056, 3048, 3065, 3032, 3049, 2862, 2863, 2863,
+ 2863, 2863, 2863, 2863, 2863, 2863, 2863, 2863, 2863, 2863,
+ 2863, 2863, 2863, 2863, 2863, 2863, 3048, 3055, 3063, 3049,
+ 3056, 3084, 3065, 3103, 3103, 3087, 3084, 3084, 3614, 3061,
+ 3087, 3087, 3104, 3104, 3061, 3061, 3063, 0, 2863, 0,
+ 3055, 3062, 3648, 3056, 3095, 3065, 3062, 3062, 3648, 3095,
+ 3095, 3614, 3073, 3073, 3101, 3106, 3106, 3061, 3062, 3066,
+ 3063, 2863, 2867, 2867, 2867, 2867, 2867, 2867, 2867, 2867,
+
+ 2867, 2867, 2867, 2867, 2867, 2867, 2867, 2867, 2867, 2867,
+ 3061, 3073, 3062, 3066, 3097, 2867, 0, 3101, 0, 3097,
+ 3097, 0, 3074, 3074, 3110, 3110, 2867, 3111, 3111, 3078,
+ 3078, 3723, 2867, 0, 3073, 3116, 3116, 3066, 3115, 2867,
+ 3101, 3079, 3079, 3115, 3115, 3121, 3121, 3100, 3166, 2867,
+ 0, 3074, 3078, 3079, 3723, 2867, 2868, 2868, 2868, 2868,
+ 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868,
+ 2868, 2868, 2868, 2868, 3074, 3078, 3100, 3079, 3114, 3114,
+ 3765, 3089, 3166, 3090, 3131, 3131, 3089, 3089, 3090, 3090,
+ 3114, 0, 3117, 3143, 3143, 3119, 2868, 3117, 3117, 3100,
+
+ 3119, 3119, 3122, 3765, 3130, 3166, 3132, 3122, 3122, 3130,
+ 3130, 3132, 3132, 0, 3114, 3089, 0, 3090, 3875, 2868,
+ 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890,
+ 2890, 2890, 2890, 2890, 2890, 2890, 2890, 2890, 3089, 2895,
+ 3090, 3875, 2890, 2897, 0, 2895, 2895, 3091, 2895, 2897,
+ 2897, 2895, 3091, 3091, 3548, 3108, 3108, 2903, 2903, 0,
+ 2890, 2895, 3098, 2903, 2903, 2897, 2890, 3098, 3098, 3140,
+ 3140, 3140, 2895, 3149, 3149, 3091, 2897, 3151, 3151, 2903,
+ 3098, 3144, 3548, 2890, 3108, 2895, 2910, 2910, 3144, 2897,
+ 2903, 3700, 2910, 2910, 0, 2895, 2961, 3700, 3091, 2897,
+
+ 2958, 2958, 2961, 2903, 3098, 3548, 2958, 3108, 2910, 3109,
+ 3109, 3144, 4151, 2903, 2906, 2906, 0, 2961, 2965, 2910,
+ 2906, 2906, 2958, 2906, 2965, 2965, 2906, 2961, 2961, 3113,
+ 3113, 3715, 2910, 2958, 3144, 4151, 2906, 3715, 3109, 3124,
+ 2965, 2961, 2910, 0, 3124, 3124, 2958, 2906, 0, 3133,
+ 2961, 2965, 3113, 4284, 3133, 3133, 2958, 3088, 3088, 2971,
+ 2906, 3109, 2979, 2979, 2965, 2971, 2971, 3133, 2979, 2979,
+ 2906, 2914, 2914, 3124, 2965, 3113, 4284, 2914, 2914, 3088,
+ 2914, 2971, 3092, 2914, 2979, 3152, 3152, 3092, 3092, 0,
+ 3088, 3133, 2971, 2914, 0, 2979, 3124, 3154, 3154, 3092,
+
+ 2967, 3155, 3155, 3088, 2914, 2971, 2967, 2967, 2979, 2967,
+ 3156, 3156, 2967, 3088, 0, 2971, 0, 2914, 2979, 0,
+ 3099, 0, 2967, 3092, 0, 3099, 3099, 2914, 2917, 2917,
+ 2917, 2917, 2917, 2967, 2917, 2917, 2917, 2917, 2917, 2917,
+ 2917, 2917, 2917, 2917, 2917, 2917, 2967, 3134, 2974, 3159,
+ 3159, 3099, 3134, 3134, 2974, 2974, 2967, 2974, 3160, 3160,
+ 2974, 3125, 3167, 3167, 2988, 2988, 3125, 3125, 2917, 3167,
+ 2974, 3162, 3162, 2988, 3099, 0, 2988, 3162, 3134, 3173,
+ 3173, 2974, 3150, 2985, 2985, 0, 2988, 3150, 3150, 2985,
+ 2985, 2917, 2920, 2920, 2974, 3125, 0, 2988, 2920, 3177,
+
+ 3177, 3134, 3153, 3740, 2974, 2985, 0, 3153, 3153, 3740,
+ 2988, 2920, 2920, 2920, 2920, 0, 2985, 2920, 3125, 2920,
+ 2988, 3182, 3182, 2920, 2920, 2920, 2920, 3127, 3781, 2985,
+ 3184, 3184, 3127, 3127, 3781, 2920, 2920, 2920, 2920, 2985,
+ 0, 2920, 2920, 0, 3127, 0, 2920, 2920, 2920, 2920,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921,
+ 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 3127, 3158,
+ 0, 3163, 0, 3169, 3158, 3158, 3163, 3163, 3169, 3169,
+ 2921, 0, 3126, 3185, 3185, 3766, 2995, 3126, 3126, 3766,
+ 2921, 3161, 2995, 2995, 3170, 2995, 3171, 0, 2995, 3170,
+
+ 3170, 3171, 3171, 2921, 3186, 3186, 3187, 3187, 2995, 3766,
+ 3126, 3161, 3766, 2921, 2927, 2927, 2927, 2927, 2927, 2995,
+ 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927,
+ 2927, 2927, 2995, 3126, 3172, 3161, 3188, 3188, 3174, 3172,
+ 3172, 3175, 2995, 3174, 3174, 0, 3175, 3175, 3189, 3189,
+ 3006, 3191, 3191, 3176, 2927, 3168, 3006, 3006, 3176, 3176,
+ 3178, 0, 3180, 0, 3181, 3178, 3178, 3180, 3180, 3181,
+ 3181, 0, 3006, 0, 3168, 3123, 3123, 2927, 2930, 2930,
+ 2930, 2930, 2930, 3006, 2930, 2930, 2930, 2930, 2930, 2930,
+ 2930, 2930, 2930, 2930, 2930, 2930, 3006, 3123, 3168, 3183,
+
+ 3196, 3196, 3200, 3200, 3183, 3183, 3006, 3190, 3123, 3164,
+ 3164, 4270, 3190, 3190, 3192, 0, 3164, 3193, 2930, 3192,
+ 3192, 3123, 3193, 3193, 3194, 3202, 3202, 3195, 0, 3194,
+ 3194, 3123, 3195, 3195, 3206, 3206, 3216, 3216, 4270, 3164,
+ 3874, 2930, 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934,
+ 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934,
+ 3197, 4270, 3164, 3205, 3874, 3197, 3197, 3208, 3205, 3205,
+ 3211, 3211, 3208, 3208, 3217, 3217, 3211, 3807, 3211, 3212,
+ 3203, 4285, 2934, 3807, 3212, 3212, 3213, 3213, 3219, 3215,
+ 3218, 3218, 3213, 3219, 3219, 3215, 3215, 3213, 3215, 0,
+
+ 3203, 3215, 3221, 3221, 4285, 2934, 2939, 2939, 2939, 2939,
+ 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2939,
+ 2939, 2939, 2939, 2939, 3203, 3220, 0, 3222, 3223, 3223,
+ 3220, 3220, 3222, 3222, 3223, 3223, 0, 3223, 3224, 3823,
+ 3223, 0, 3008, 3224, 3224, 3823, 2939, 3228, 3008, 3008,
+ 3226, 3008, 3225, 3225, 3008, 3226, 3226, 3229, 3229, 3229,
+ 3232, 3232, 3233, 0, 3008, 3228, 3232, 3233, 3233, 2939,
+ 2945, 2945, 2945, 2945, 2945, 3008, 2945, 2945, 2945, 2945,
+ 2945, 2945, 2945, 2945, 2945, 2945, 2945, 2945, 3008, 3228,
+ 3227, 3227, 3234, 3234, 3235, 3235, 3227, 3227, 3008, 3227,
+
+ 3236, 3236, 3227, 3238, 3238, 3237, 3239, 3239, 3403, 3240,
+ 2945, 3237, 3237, 3845, 3237, 3240, 3240, 3237, 3240, 3845,
+ 3241, 3240, 3242, 3242, 3012, 3241, 3241, 3247, 3247, 0,
+ 3012, 3012, 3403, 2945, 2951, 2951, 2951, 2951, 2951, 2951,
+ 2951, 2951, 2951, 2951, 2951, 2951, 3012, 2951, 2951, 2951,
+ 2951, 2951, 3318, 3243, 3244, 3244, 3403, 3012, 3243, 3243,
+ 3244, 3244, 3245, 3244, 3253, 3253, 3244, 3245, 3245, 3857,
+ 3012, 3246, 3318, 3248, 2951, 3857, 3246, 3246, 3248, 3248,
+ 3012, 3249, 3249, 3252, 3255, 3255, 3254, 0, 3252, 3252,
+ 3249, 3254, 3254, 3249, 3256, 3256, 3318, 2951, 2952, 2952,
+
+ 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952,
+ 2952, 2952, 2952, 2952, 2952, 2952, 3257, 3257, 0, 3015,
+ 3259, 3259, 0, 3250, 3250, 3015, 3015, 0, 3015, 3250,
+ 3250, 3015, 3250, 3018, 3018, 3250, 3251, 4444, 2952, 3018,
+ 3018, 3015, 3251, 3251, 0, 3251, 3260, 3260, 3251, 3354,
+ 3024, 3024, 3015, 3263, 3263, 3018, 3024, 3024, 3027, 3027,
+ 4444, 2952, 2983, 2983, 0, 3015, 3018, 3027, 2983, 2983,
+ 3027, 2983, 3024, 0, 2983, 3015, 3268, 3268, 0, 3018,
+ 3027, 3258, 3354, 3024, 2983, 3274, 3274, 3258, 3258, 3018,
+ 3258, 3027, 3262, 3258, 3264, 2983, 3024, 3262, 3262, 3264,
+
+ 3264, 3040, 3040, 0, 3027, 3354, 3024, 3040, 2983, 3040,
+ 3044, 3278, 3278, 0, 3027, 3034, 3044, 3044, 2983, 2994,
+ 2994, 3034, 3034, 3040, 3034, 2994, 2994, 3034, 2994, 0,
+ 3266, 2994, 3044, 3261, 3040, 3266, 3266, 3034, 0, 3261,
+ 3261, 2994, 3261, 3044, 3267, 3261, 0, 3040, 3034, 3267,
+ 3267, 3710, 2994, 3269, 3284, 3284, 3044, 3040, 3269, 3269,
+ 3710, 3034, 3273, 3710, 3275, 2994, 3044, 3273, 3273, 3275,
+ 3275, 3034, 3285, 3285, 3580, 2994, 3001, 3001, 3001, 3001,
+ 3001, 3001, 3001, 3001, 3001, 3001, 3001, 3001, 3001, 3001,
+ 3001, 3001, 3001, 3001, 3265, 3265, 3270, 3270, 3286, 3286,
+
+ 3265, 3265, 3580, 3265, 0, 3270, 3265, 3001, 3270, 3287,
+ 3287, 3271, 3271, 3288, 3288, 3272, 3001, 3271, 3271, 3276,
+ 3271, 3272, 3272, 3271, 3272, 3580, 3276, 3272, 3279, 0,
+ 3001, 3290, 3290, 3291, 3291, 3279, 3276, 3292, 3292, 3001,
+ 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002,
+ 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3279, 3878,
+ 3276, 3046, 0, 3051, 3051, 3878, 3070, 3046, 3046, 3051,
+ 3051, 0, 3070, 3070, 3299, 3002, 3293, 3293, 3295, 3295,
+ 3002, 3279, 3293, 3046, 3295, 3051, 3296, 3904, 3070, 3303,
+ 3303, 3296, 3296, 3904, 3046, 3302, 3051, 0, 3002, 3070,
+
+ 3302, 3302, 3317, 3002, 3022, 3022, 0, 3046, 3299, 3051,
+ 3022, 3022, 3070, 3022, 3300, 3300, 3022, 3046, 3283, 3051,
+ 3317, 3300, 3070, 3054, 3054, 3283, 3022, 3307, 3307, 3054,
+ 3054, 3299, 3060, 3060, 3283, 3312, 3312, 3022, 3060, 3060,
+ 4022, 3067, 3067, 3304, 3317, 3054, 3305, 3067, 3304, 3304,
+ 3022, 3305, 3305, 3922, 3060, 0, 3054, 0, 3283, 3922,
+ 3022, 3033, 3033, 3067, 4022, 3060, 3306, 3033, 3033, 3054,
+ 3033, 3306, 3306, 3033, 3067, 3308, 3314, 3314, 3060, 3054,
+ 3308, 3308, 3314, 3033, 3297, 3297, 3072, 3067, 3060, 3077,
+ 0, 3297, 3072, 3072, 3033, 3077, 3077, 3067, 3083, 3083,
+
+ 3320, 3320, 3321, 3321, 3083, 3083, 3748, 3033, 3072, 0,
+ 3310, 3077, 3329, 3329, 3297, 3310, 3310, 3033, 3094, 3072,
+ 3083, 3774, 3077, 0, 3094, 3094, 3748, 3085, 3085, 3331,
+ 3331, 3083, 3072, 3085, 3085, 3077, 0, 3297, 3332, 3332,
+ 3094, 3774, 3072, 3442, 3083, 3077, 3093, 3093, 0, 3085,
+ 3748, 3094, 3093, 3093, 3083, 3105, 3339, 3339, 3340, 3340,
+ 3085, 3105, 3105, 3107, 3094, 3774, 3311, 3442, 3093, 3107,
+ 3107, 3311, 3311, 3085, 3094, 3112, 0, 3105, 0, 3093,
+ 0, 3112, 3112, 3085, 3313, 3107, 3341, 3341, 3105, 3313,
+ 3313, 3442, 3093, 3118, 3118, 0, 3107, 3112, 3315, 3118,
+
+ 3118, 3105, 3093, 3315, 3315, 0, 3319, 0, 3112, 3107,
+ 3319, 3105, 3342, 3342, 3945, 3118, 0, 3319, 3319, 3107,
+ 3945, 3112, 3120, 3120, 3343, 3343, 3118, 0, 3120, 3120,
+ 3129, 3112, 0, 3336, 3128, 3128, 3129, 3129, 3336, 3118,
+ 3128, 3128, 3325, 0, 3120, 3345, 3325, 3344, 3344, 3118,
+ 3345, 3345, 3129, 3325, 3325, 3120, 3128, 3336, 3333, 3325,
+ 3964, 3336, 0, 3129, 3333, 3333, 3964, 3128, 3120, 3347,
+ 3333, 3346, 3346, 0, 3347, 3347, 3129, 0, 3120, 3348,
+ 3128, 4153, 3349, 3325, 3348, 3348, 3129, 3349, 3349, 0,
+ 3128, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3135,
+
+ 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3337,
+ 3350, 3350, 3352, 3352, 3351, 4153, 3353, 0, 3337, 3351,
+ 3351, 3353, 3353, 3357, 3358, 3358, 3361, 3361, 3357, 3357,
+ 3359, 3135, 3361, 3337, 3362, 3359, 3359, 3361, 4153, 3362,
+ 3362, 3337, 3364, 3364, 3366, 3366, 3368, 3368, 3369, 3369,
+ 3370, 3370, 3372, 3372, 3135, 3136, 3136, 3136, 3136, 3136,
+ 3136, 3136, 3136, 3136, 3136, 3136, 3136, 3136, 3136, 3136,
+ 3136, 3136, 3136, 3373, 3373, 3376, 3376, 3369, 4600, 3370,
+ 3378, 3379, 3379, 3380, 3136, 3378, 3378, 3376, 3380, 3380,
+ 3977, 3356, 3356, 3375, 3375, 3136, 3977, 3356, 3382, 3356,
+
+ 3369, 4600, 3370, 3382, 3382, 3384, 3384, 3136, 0, 3385,
+ 0, 3376, 0, 3356, 3385, 3385, 3375, 0, 3136, 3137,
+ 3137, 3137, 3137, 3137, 3356, 3137, 3137, 3137, 3137, 3137,
+ 3137, 3137, 3137, 3137, 3137, 3137, 3137, 3356, 3387, 3375,
+ 3395, 3395, 0, 3387, 3387, 3388, 0, 3356, 3394, 0,
+ 3388, 3388, 3390, 3394, 3394, 3396, 0, 3390, 3390, 3137,
+ 3396, 3396, 3400, 3400, 3391, 3411, 3411, 3389, 0, 3391,
+ 3391, 3399, 3389, 3389, 3412, 3412, 3399, 3399, 0, 3388,
+ 3390, 3391, 3137, 3138, 3138, 3138, 3138, 3138, 3138, 3138,
+ 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3138,
+
+ 3138, 3389, 3388, 3390, 3401, 3391, 3414, 3414, 0, 3401,
+ 3401, 0, 3398, 3402, 3402, 3407, 3407, 3398, 3398, 3360,
+ 3360, 3407, 3407, 3138, 3389, 3402, 0, 3397, 3360, 0,
+ 3413, 3360, 3397, 3397, 3416, 3416, 3413, 3413, 3405, 3405,
+ 3405, 3360, 3413, 3398, 0, 3397, 3138, 3139, 3139, 3139,
+ 3139, 3139, 3360, 3139, 3139, 3139, 3139, 3139, 3139, 3139,
+ 3139, 3139, 3139, 3139, 3139, 3360, 3398, 3405, 4002, 3397,
+ 3418, 3418, 0, 3406, 4002, 3360, 3418, 0, 3406, 3406,
+ 3419, 3419, 3422, 3422, 3423, 3423, 0, 3139, 0, 3427,
+ 3405, 3409, 3409, 3409, 3427, 3427, 3428, 3428, 3430, 3436,
+
+ 3436, 3445, 3445, 3430, 3430, 0, 3406, 0, 3409, 3439,
+ 3139, 3209, 3209, 3209, 3209, 3209, 3209, 3209, 3209, 3209,
+ 3209, 3209, 3209, 3209, 3209, 3209, 3209, 3209, 3209, 3406,
+ 3431, 3433, 3409, 3432, 3432, 3431, 3431, 3433, 3433, 3432,
+ 3432, 3435, 3439, 3433, 3437, 3432, 3435, 3435, 0, 3437,
+ 3437, 3209, 3446, 3446, 3448, 3448, 3450, 3450, 3452, 3452,
+ 3457, 3457, 3441, 3458, 3458, 3439, 3465, 3465, 3453, 3453,
+ 3443, 3454, 3454, 0, 3209, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210, 3210,
+ 3210, 3210, 3210, 3441, 3443, 0, 3441, 3453, 3464, 0,
+
+ 3454, 3456, 3456, 3464, 3464, 3479, 3479, 3480, 3480, 3482,
+ 3482, 3455, 3455, 3456, 0, 3210, 3441, 0, 3443, 3441,
+ 3453, 3467, 4031, 3454, 3484, 3484, 3467, 3467, 4031, 3365,
+ 3486, 3486, 3487, 3487, 3455, 3365, 3365, 3456, 3210, 3230,
+ 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230, 3230,
+ 3230, 3365, 3230, 3230, 3230, 3230, 3230, 3455, 3459, 3459,
+ 3469, 3487, 3365, 3491, 3491, 3469, 3469, 3492, 3492, 3497,
+ 3497, 3459, 3460, 3460, 4036, 3365, 3496, 3469, 0, 3230,
+ 4036, 3496, 3496, 3499, 3487, 3365, 0, 3508, 3499, 3499,
+ 0, 3474, 3508, 3508, 3468, 3459, 3474, 3474, 3460, 3468,
+
+ 3468, 3469, 3230, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231, 3231,
+ 3231, 3460, 3468, 3470, 3474, 3509, 3509, 3510, 3470, 3470,
+ 4776, 3471, 3510, 3510, 3475, 0, 3471, 3471, 4066, 3475,
+ 3475, 3470, 4083, 3231, 4066, 3468, 0, 3474, 4083, 3512,
+ 3512, 3513, 3490, 3490, 4776, 3512, 3513, 3513, 3488, 3488,
+ 3512, 0, 3471, 3475, 3490, 3470, 3231, 3294, 3294, 3294,
+ 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294, 3294,
+ 3294, 3294, 3294, 3294, 3294, 3471, 3475, 3488, 3490, 3294,
+ 3515, 3515, 3493, 3493, 3517, 3517, 3521, 3521, 3522, 3522,
+
+ 0, 3494, 3494, 3489, 3489, 3493, 3526, 3294, 3527, 3527,
+ 3488, 3526, 3526, 3294, 3528, 0, 3530, 3532, 3532, 3528,
+ 3528, 3530, 3530, 3542, 3542, 0, 3489, 3494, 0, 3493,
+ 3294, 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3301,
+ 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3301, 3489,
+ 3494, 3502, 3301, 3533, 0, 3541, 3502, 3502, 3533, 3533,
+ 3541, 3541, 3500, 3547, 3547, 3547, 0, 3500, 3500, 3502,
+ 0, 3301, 3543, 0, 3549, 0, 3301, 3543, 3543, 3549,
+ 3549, 3550, 3550, 3503, 0, 3371, 3553, 3553, 3503, 3503,
+ 3500, 3371, 3371, 3502, 3301, 3326, 3326, 3326, 3326, 3326,
+
+ 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3371, 3326, 3326,
+ 3326, 3326, 3326, 3500, 3503, 3501, 3554, 3554, 3371, 3551,
+ 3501, 3501, 3506, 4976, 3551, 3551, 0, 3506, 3506, 3556,
+ 3556, 3371, 3501, 3558, 3558, 3326, 0, 3503, 3564, 3564,
+ 4063, 3371, 3565, 3565, 0, 3525, 3525, 4976, 3507, 4063,
+ 3519, 3519, 4063, 3507, 3507, 3506, 3501, 3525, 3326, 3327,
+ 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3327,
+ 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3507, 3506, 3519,
+ 3568, 3525, 3569, 3569, 3571, 3568, 3568, 3582, 3582, 3571,
+ 3571, 0, 3520, 3520, 3583, 3583, 3585, 3585, 0, 3327,
+
+ 3507, 3538, 3519, 3587, 3587, 0, 3538, 3538, 0, 3535,
+ 0, 3536, 3593, 3593, 3535, 3535, 3536, 3536, 3538, 3511,
+ 3511, 3520, 3327, 3328, 3328, 3328, 3328, 3328, 3328, 3328,
+ 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328,
+ 3328, 3511, 3538, 3535, 3520, 3536, 3594, 3594, 3598, 3598,
+ 3611, 3611, 3511, 0, 3560, 3560, 3537, 3612, 3612, 3524,
+ 3524, 3537, 3537, 3328, 3597, 3511, 3535, 3544, 3536, 3597,
+ 3597, 3600, 3544, 3544, 0, 3511, 3600, 3600, 0, 3561,
+ 3561, 3862, 3524, 3560, 3537, 3544, 3328, 3334, 3334, 3334,
+ 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334,
+
+ 3334, 3334, 3334, 3334, 3334, 3524, 3560, 3537, 3561, 3544,
+ 3617, 3617, 3619, 3619, 3621, 3621, 3862, 3334, 3545, 0,
+ 3622, 5146, 3546, 3545, 3545, 3622, 3622, 3334, 3623, 3624,
+ 3624, 3561, 0, 3623, 3623, 0, 3625, 0, 3578, 3862,
+ 3334, 3625, 3625, 3578, 3578, 5146, 3546, 3534, 3534, 3545,
+ 3334, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335,
+ 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3534,
+ 3546, 3578, 3545, 3563, 3563, 3628, 3628, 3335, 3630, 0,
+ 3534, 0, 3628, 3630, 3630, 3563, 0, 3562, 3562, 3581,
+ 3631, 3335, 3633, 3534, 3578, 3631, 3631, 3633, 3633, 3566,
+
+ 3566, 3335, 3636, 3534, 3634, 3634, 0, 3636, 3636, 3563,
+ 3562, 0, 3566, 3581, 3335, 3355, 3355, 3355, 3355, 3355,
+ 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355,
+ 3355, 3355, 3355, 3562, 3363, 3363, 3566, 3581, 3591, 3591,
+ 5976, 3367, 0, 3363, 0, 3363, 3363, 3367, 3367, 4775,
+ 3367, 0, 3573, 3367, 3861, 3355, 3363, 3573, 3573, 3374,
+ 0, 3591, 0, 3367, 5976, 3374, 3374, 3363, 3374, 3573,
+ 3629, 3374, 4775, 3627, 3367, 0, 3377, 3377, 3355, 0,
+ 3363, 3374, 3377, 3377, 3591, 3861, 3629, 3367, 3567, 3567,
+ 3363, 0, 3374, 3573, 3579, 3383, 3383, 3367, 3377, 3579,
+
+ 3579, 3383, 3383, 3638, 3638, 3374, 3627, 3574, 3861, 3377,
+ 3629, 0, 3574, 3574, 3567, 3374, 0, 3383, 3641, 3641,
+ 3643, 3643, 3377, 3579, 0, 3574, 3386, 3386, 3383, 3627,
+ 3434, 3434, 3377, 3381, 3381, 3386, 3434, 3567, 3386, 3381,
+ 3381, 3383, 3381, 3644, 3644, 3381, 3579, 3444, 3386, 3574,
+ 0, 3383, 3434, 3444, 3444, 3381, 3645, 3645, 5371, 3386,
+ 0, 3393, 3735, 3434, 3595, 3595, 3381, 3393, 3393, 3444,
+ 3393, 0, 3386, 3393, 3652, 3652, 3434, 3595, 3449, 3381,
+ 3444, 5371, 3386, 3393, 3449, 3449, 3434, 3514, 3514, 3381,
+ 3392, 3392, 0, 3444, 3393, 3735, 3392, 3392, 3514, 3392,
+
+ 3449, 3595, 3392, 3444, 3646, 3646, 0, 3393, 0, 3514,
+ 3637, 3449, 3392, 3589, 3589, 3637, 3637, 3393, 3735, 3646,
+ 3514, 3639, 0, 3392, 3449, 3647, 3639, 3639, 3656, 3656,
+ 3647, 3647, 3650, 3514, 3449, 0, 3392, 3650, 3650, 3590,
+ 3590, 3863, 3589, 3514, 3552, 3552, 3392, 3404, 3404, 3404,
+ 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404,
+ 3404, 3404, 3404, 3404, 3404, 3589, 3552, 3651, 3590, 3592,
+ 3592, 0, 3651, 3651, 3662, 3662, 3863, 3552, 3575, 0,
+ 3572, 3592, 4094, 3575, 3575, 3572, 3572, 3404, 4094, 3602,
+ 3552, 3590, 3653, 0, 3602, 3602, 3655, 3653, 3653, 3863,
+
+ 3552, 3655, 3655, 3663, 3663, 3592, 3602, 3559, 3572, 3575,
+ 3404, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408,
+ 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3559,
+ 3602, 3572, 3575, 3654, 3654, 3664, 3664, 3657, 0, 3654,
+ 3559, 3654, 3657, 3657, 3608, 0, 3596, 3596, 0, 3608,
+ 3608, 3408, 3603, 3559, 3660, 3658, 3658, 3603, 3603, 3660,
+ 3660, 3666, 3666, 3559, 3658, 3667, 3667, 3658, 3670, 3670,
+ 3603, 3588, 3596, 3608, 3408, 3410, 3410, 3410, 3410, 3410,
+ 3410, 3410, 3410, 3410, 3410, 3410, 3410, 3410, 3410, 3410,
+ 3410, 3410, 3410, 3588, 3603, 3596, 3608, 3669, 0, 3659,
+
+ 3659, 3671, 3669, 3669, 3588, 3659, 3671, 3671, 3601, 0,
+ 3659, 3438, 3438, 3601, 3601, 3410, 3673, 3588, 3675, 3675,
+ 3438, 3673, 3673, 3438, 0, 3607, 4101, 3588, 0, 3604,
+ 3607, 3607, 4101, 3438, 3604, 3604, 3601, 0, 3410, 3415,
+ 3415, 3415, 3415, 3415, 3438, 3415, 3415, 3415, 3415, 3415,
+ 3415, 3415, 3415, 3415, 3415, 3415, 3415, 3438, 3607, 3601,
+ 3604, 3661, 3661, 3681, 3681, 3684, 3684, 3438, 3665, 0,
+ 3661, 3684, 3661, 3661, 3665, 3665, 4112, 3665, 3668, 3415,
+ 3665, 3607, 4112, 3604, 3668, 3668, 3674, 3668, 0, 3679,
+ 3668, 3674, 3674, 3463, 3463, 3679, 3679, 0, 3679, 3463,
+
+ 3463, 3679, 3415, 3420, 3420, 3420, 3420, 3420, 3420, 3420,
+ 3420, 3420, 3420, 3420, 3420, 3463, 3420, 3420, 3420, 3420,
+ 3420, 3672, 3672, 3686, 3686, 0, 3463, 3672, 3672, 3676,
+ 3672, 3689, 3689, 3672, 3676, 3676, 3677, 3677, 3683, 3463,
+ 3690, 3690, 0, 3420, 4132, 3677, 3678, 3678, 3677, 3463,
+ 4132, 3680, 3678, 3678, 3682, 3678, 3680, 3680, 3678, 3682,
+ 3682, 0, 3683, 3692, 3692, 0, 3420, 3421, 3421, 3421,
+ 3421, 3421, 3421, 3421, 3421, 3421, 3421, 3421, 3421, 3421,
+ 3421, 3421, 3421, 3421, 3421, 3685, 3683, 3687, 3688, 3688,
+ 3685, 3685, 3687, 3687, 3693, 3693, 3691, 3688, 3694, 3694,
+
+ 3688, 0, 3691, 3691, 0, 3691, 0, 3421, 3691, 3696,
+ 3696, 3697, 3697, 3698, 3699, 3699, 0, 3701, 3698, 3698,
+ 4137, 3478, 3701, 3701, 3704, 3704, 4137, 3478, 3478, 0,
+ 3421, 3424, 3424, 3424, 3424, 3424, 3424, 3424, 3424, 3424,
+ 3424, 3424, 3424, 3478, 3424, 3424, 3424, 3424, 3424, 3702,
+ 3702, 3705, 3705, 3703, 3478, 3702, 3702, 3706, 3702, 3703,
+ 3703, 3702, 3703, 3706, 3706, 3703, 3706, 3478, 0, 3706,
+ 4149, 3424, 3707, 3707, 3708, 3708, 4149, 3478, 3709, 3709,
+ 3711, 3711, 3712, 3712, 3713, 3714, 3714, 3716, 0, 3713,
+ 3713, 0, 3716, 3716, 3424, 3425, 3425, 3425, 3425, 3425,
+
+ 3425, 3425, 3425, 3425, 3425, 3425, 3425, 3425, 3425, 3425,
+ 3425, 3425, 3425, 3717, 3717, 3720, 3720, 3718, 0, 3717,
+ 3717, 0, 3717, 3718, 3718, 3717, 3718, 3721, 3721, 3718,
+ 3726, 3726, 3728, 3728, 0, 3425, 3729, 3729, 3731, 0,
+ 3725, 3732, 3732, 3731, 3731, 3733, 4177, 3725, 3736, 3736,
+ 3733, 3733, 4177, 3725, 3825, 3736, 3739, 3739, 3425, 3426,
+ 3426, 3426, 3426, 3426, 3426, 3426, 3426, 3426, 3426, 3426,
+ 3426, 3426, 3426, 3426, 3426, 3426, 3426, 3725, 3447, 3451,
+ 3744, 3744, 3751, 3751, 3447, 3447, 3825, 3447, 3451, 3738,
+ 3447, 3451, 3758, 3758, 3738, 3738, 0, 3741, 3473, 3426,
+
+ 3447, 3451, 3741, 3741, 3473, 3473, 0, 3473, 3742, 3825,
+ 3473, 3447, 3451, 3742, 3742, 3760, 3760, 3761, 3761, 0,
+ 3473, 3743, 3426, 0, 3447, 3451, 3743, 3743, 0, 3485,
+ 3749, 3473, 0, 3483, 3447, 3451, 3472, 3472, 3485, 3483,
+ 3483, 3485, 3472, 3472, 3473, 3472, 0, 3745, 3472, 3749,
+ 0, 3485, 3745, 3745, 3473, 3483, 3762, 3762, 3472, 3767,
+ 3767, 0, 3485, 0, 3753, 0, 3483, 3768, 3768, 3472,
+ 3753, 3753, 0, 3749, 3755, 3485, 3753, 3769, 3769, 3483,
+ 0, 3755, 3472, 3770, 3770, 3485, 3771, 3771, 3755, 3483,
+ 3773, 3773, 3472, 3476, 3476, 3476, 3476, 3476, 3476, 3476,
+
+ 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476,
+ 3476, 3772, 3755, 3776, 3776, 3779, 3772, 3772, 3777, 3777,
+ 3779, 3779, 3783, 3476, 3780, 3780, 3785, 3783, 3783, 3784,
+ 3784, 3785, 3785, 3476, 3788, 3788, 3789, 3789, 3791, 3791,
+ 3793, 3793, 3795, 3795, 3800, 3800, 3476, 3801, 3801, 3805,
+ 3806, 3806, 3796, 3796, 3805, 3805, 3476, 3477, 3477, 3477,
+ 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477,
+ 3477, 3477, 3477, 3477, 3477, 0, 3799, 3799, 3481, 3817,
+ 3817, 3796, 0, 3477, 3481, 3481, 3860, 3481, 3799, 3808,
+ 3481, 3817, 3495, 3495, 3808, 3808, 3505, 3477, 3495, 3495,
+
+ 3481, 0, 3505, 3505, 3796, 3505, 3860, 3477, 3505, 3818,
+ 3818, 3481, 3799, 0, 3495, 0, 3797, 3797, 3505, 3955,
+ 3477, 3516, 3802, 3802, 3481, 3495, 0, 3516, 3516, 3505,
+ 3860, 3816, 3819, 3819, 3481, 3802, 3816, 3816, 3495, 0,
+ 3518, 0, 3505, 3516, 0, 3797, 3518, 3518, 3495, 3504,
+ 3504, 3955, 3505, 0, 3516, 3504, 3504, 3523, 3504, 3802,
+ 3816, 3504, 3518, 3523, 3523, 3822, 3822, 3516, 3797, 3529,
+ 3529, 3504, 0, 3518, 3955, 3529, 3529, 3516, 3540, 3523,
+ 3803, 3803, 3504, 3816, 3540, 3540, 3518, 3531, 3531, 0,
+ 3523, 3529, 3821, 3531, 3531, 3504, 3518, 3821, 3821, 0,
+
+ 3540, 0, 3529, 3523, 4193, 3504, 3803, 3837, 3837, 3531,
+ 4193, 3540, 0, 3523, 0, 3529, 3539, 3539, 3839, 3839,
+ 3531, 0, 3539, 3539, 3540, 3529, 3829, 3829, 0, 3803,
+ 3555, 0, 3829, 3531, 3540, 3557, 3555, 3555, 3539, 3840,
+ 3840, 3557, 3557, 3531, 3576, 3576, 0, 3577, 0, 3539,
+ 3576, 3576, 3555, 3577, 3577, 3830, 0, 3557, 3844, 3844,
+ 3830, 3830, 3539, 3555, 3798, 3798, 3576, 0, 3557, 3577,
+ 3849, 3849, 3539, 3852, 3852, 0, 3555, 3576, 3828, 3828,
+ 3577, 3557, 3584, 0, 3828, 3828, 3555, 3798, 3584, 3584,
+ 3576, 3557, 3810, 3577, 3853, 3853, 0, 3810, 3810, 3586,
+
+ 3576, 3605, 3605, 3577, 3584, 3586, 3586, 3605, 3605, 3810,
+ 3798, 3809, 4207, 3606, 0, 3584, 3809, 3809, 4207, 3606,
+ 3606, 3586, 0, 3605, 3811, 3856, 3856, 0, 3584, 3811,
+ 3811, 3843, 3586, 3810, 3605, 3606, 3843, 3843, 3584, 3809,
+ 3865, 3865, 3811, 3847, 0, 3586, 3606, 3605, 3847, 3847,
+ 3867, 3867, 3877, 3877, 0, 3586, 0, 3605, 3812, 3606,
+ 3882, 3882, 3809, 3812, 3812, 0, 3811, 3872, 3872, 3606,
+ 3609, 3609, 3609, 3609, 3609, 3609, 3609, 3609, 3609, 3609,
+ 3609, 3609, 3609, 3609, 3609, 3609, 3609, 3609, 3848, 3812,
+ 3859, 3824, 3824, 3848, 3848, 3872, 3815, 3824, 3824, 3850,
+
+ 0, 3815, 3815, 3824, 3850, 3850, 3859, 0, 3855, 0,
+ 3609, 3876, 3812, 3855, 3855, 3880, 3876, 3876, 3872, 3881,
+ 3880, 3880, 3893, 3893, 3881, 3881, 0, 3871, 3871, 3815,
+ 3859, 3868, 3868, 3609, 3610, 3610, 3610, 3610, 3610, 3610,
+ 3610, 3610, 3610, 3610, 3610, 3610, 3610, 3610, 3610, 3610,
+ 3610, 3610, 3815, 3871, 3868, 3869, 3869, 3870, 3870, 3883,
+ 3895, 3895, 0, 3886, 3883, 3883, 0, 3869, 3886, 3886,
+ 3870, 3873, 3873, 3902, 3610, 3884, 3871, 3868, 3902, 3902,
+ 3884, 3884, 3889, 3903, 3903, 3908, 3908, 3889, 3889, 3917,
+ 3917, 3869, 4087, 3884, 3870, 3873, 3886, 3610, 3730, 3730,
+
+ 3730, 3730, 3730, 3730, 3730, 3730, 3730, 3730, 3730, 3730,
+ 3730, 3730, 3730, 3730, 3730, 3730, 3889, 3884, 3873, 3886,
+ 3906, 3918, 3918, 3907, 4087, 3906, 3906, 3885, 3907, 3907,
+ 3887, 0, 3885, 3885, 0, 3887, 3887, 3909, 3730, 3889,
+ 3920, 0, 3909, 3909, 4224, 3920, 3920, 4087, 3897, 3897,
+ 4224, 3915, 3921, 3921, 3925, 3925, 3915, 3915, 3885, 3887,
+ 3897, 3730, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737,
+ 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737,
+ 3737, 3885, 3887, 3924, 3897, 3915, 3926, 0, 3924, 3924,
+ 0, 3926, 3926, 3928, 3928, 3929, 3929, 4259, 3896, 3896,
+
+ 3888, 4331, 3737, 4259, 3737, 3888, 3888, 4331, 3915, 3931,
+ 3931, 3933, 3933, 3939, 3939, 0, 3787, 3940, 3940, 3900,
+ 3900, 3896, 3787, 3787, 3888, 3737, 3756, 3756, 3756, 3756,
+ 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3787, 3756,
+ 3756, 3756, 3756, 3756, 3896, 3898, 3898, 3900, 3888, 3787,
+ 3943, 3944, 3944, 3959, 3959, 3943, 3943, 0, 3898, 3899,
+ 3899, 4346, 3787, 3901, 3901, 4359, 3756, 4346, 3946, 4378,
+ 3900, 4359, 3787, 3946, 3946, 4378, 3938, 3938, 3912, 3960,
+ 3960, 0, 3898, 3912, 3912, 3899, 0, 3901, 3938, 3756,
+ 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757,
+
+ 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3899, 3910,
+ 3901, 3912, 3938, 0, 3910, 3910, 3962, 0, 3911, 3963,
+ 3963, 3962, 3962, 3911, 3911, 0, 3914, 3910, 3966, 3966,
+ 3757, 3914, 3914, 0, 3912, 3968, 3968, 3975, 0, 3941,
+ 3941, 0, 3975, 3975, 3935, 3935, 3936, 3936, 0, 3911,
+ 3914, 3910, 3941, 3757, 3763, 3763, 3763, 3763, 3763, 3763,
+ 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763,
+ 3763, 3763, 3911, 3935, 3914, 3936, 3941, 3976, 3976, 0,
+ 3979, 0, 3980, 0, 3913, 3979, 3979, 3980, 3980, 3913,
+ 3913, 3981, 3981, 0, 3763, 3982, 3935, 3949, 3936, 3948,
+
+ 3982, 3982, 3949, 3949, 3948, 3948, 3989, 3989, 3991, 3991,
+ 3993, 3993, 0, 3913, 0, 3949, 3948, 3763, 3764, 3764,
+ 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764,
+ 3764, 3764, 3764, 3764, 3764, 3764, 3913, 3775, 3775, 3949,
+ 3948, 3778, 3957, 3937, 3937, 4078, 3775, 0, 3764, 3775,
+ 3778, 4001, 4001, 3778, 4078, 3786, 3786, 4078, 3764, 3775,
+ 3970, 3970, 3957, 3778, 3786, 0, 3937, 3786, 4232, 3792,
+ 3775, 3764, 3970, 3790, 3778, 3792, 3792, 3786, 4452, 3790,
+ 3790, 3764, 3790, 3775, 4452, 3790, 3957, 3778, 3786, 3937,
+ 0, 3792, 4232, 3775, 0, 3790, 3970, 3778, 3782, 3782,
+
+ 3794, 3786, 3792, 0, 3782, 3782, 3790, 3782, 3953, 3794,
+ 3782, 3786, 3794, 3953, 3953, 3792, 4232, 3804, 3804, 3790,
+ 3782, 4000, 3794, 3804, 3804, 3792, 4000, 4000, 0, 3790,
+ 0, 3782, 4004, 3794, 4006, 4006, 3814, 4004, 4004, 3804,
+ 0, 3953, 3814, 3814, 3782, 3814, 3794, 4005, 3814, 0,
+ 3804, 4498, 4005, 4005, 3782, 3864, 3794, 4498, 3814, 3942,
+ 3942, 3864, 3864, 3804, 3953, 3971, 3971, 3851, 3851, 3814,
+ 3990, 3916, 3916, 3804, 3813, 3813, 3851, 3864, 3971, 3851,
+ 3813, 3813, 3814, 3813, 0, 3942, 3813, 0, 3864, 3851,
+ 4018, 4018, 3814, 3916, 4023, 4023, 3813, 0, 3990, 0,
+
+ 3851, 3864, 3971, 3854, 3916, 4025, 4025, 3813, 3942, 4026,
+ 4026, 3864, 3854, 3851, 0, 3854, 4511, 3916, 4027, 4027,
+ 3813, 3990, 4511, 3851, 0, 3854, 0, 3916, 3919, 3934,
+ 3813, 3826, 3826, 3826, 3826, 3826, 3854, 3826, 3826, 3826,
+ 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3854,
+ 3919, 3934, 4007, 4014, 4014, 4014, 0, 4007, 4007, 3854,
+ 4020, 3919, 3934, 0, 3954, 4020, 4020, 4029, 0, 3954,
+ 3954, 3826, 4029, 4029, 3919, 3934, 4030, 4030, 4040, 4040,
+ 0, 4032, 4044, 4044, 3919, 3934, 4032, 4032, 0, 3972,
+ 3972, 3927, 3927, 3954, 3826, 3827, 3827, 3827, 3827, 3827,
+
+ 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827,
+ 3827, 3827, 3827, 3927, 0, 3972, 3954, 3827, 4033, 4033,
+ 4045, 4045, 4035, 0, 3927, 4033, 3947, 4035, 4035, 4046,
+ 4046, 3947, 3947, 0, 4038, 3827, 0, 3927, 3972, 4038,
+ 4038, 3827, 4047, 4047, 4048, 4048, 0, 3927, 0, 3892,
+ 3973, 3973, 4049, 4049, 3947, 3892, 3892, 3961, 3827, 3831,
+ 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831,
+ 3831, 3892, 3831, 3831, 3831, 3831, 3831, 3947, 3973, 3961,
+ 4039, 0, 3892, 4041, 0, 4039, 4039, 3950, 4041, 4041,
+ 3961, 0, 3950, 3950, 4518, 3892, 4530, 4050, 4050, 3831,
+
+ 4518, 3973, 4530, 3961, 4052, 3892, 0, 3995, 3995, 4052,
+ 4052, 3985, 4050, 3961, 4053, 4053, 3985, 3985, 3950, 3995,
+ 3958, 3958, 3831, 3832, 3832, 3832, 3832, 3832, 3832, 3832,
+ 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832,
+ 3832, 3950, 3958, 3995, 3985, 4051, 4051, 0, 4051, 4054,
+ 0, 4055, 4574, 3958, 4054, 4054, 4055, 4055, 4574, 3969,
+ 3969, 3974, 3974, 3832, 0, 3983, 3958, 3985, 4056, 0,
+ 3983, 3983, 0, 4056, 4056, 3988, 3958, 4057, 4057, 0,
+ 3988, 3988, 3969, 3983, 0, 3974, 3832, 3833, 3833, 3833,
+ 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833,
+
+ 3833, 3833, 3833, 3833, 3833, 3969, 3833, 3983, 3974, 3988,
+ 4091, 4058, 3996, 3996, 0, 3984, 4058, 4058, 4059, 4091,
+ 3984, 3984, 4091, 4059, 4059, 3996, 0, 3833, 4060, 4060,
+ 3833, 0, 3988, 4061, 4061, 4062, 4062, 4060, 4065, 4065,
+ 4060, 3923, 3923, 0, 3997, 3997, 3984, 3923, 3923, 3996,
+ 3833, 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3834,
+ 3834, 3834, 3834, 3923, 3834, 3834, 3834, 3834, 3834, 3984,
+ 3997, 4064, 4067, 4067, 3923, 0, 4064, 4064, 4067, 4067,
+ 0, 4067, 0, 3986, 4067, 3998, 3998, 3923, 3986, 3986,
+ 4068, 3834, 0, 3997, 0, 4068, 4068, 3923, 4069, 4069,
+
+ 4070, 4072, 4072, 0, 4010, 4070, 4070, 4073, 4073, 4010,
+ 4010, 0, 3986, 3998, 3834, 3835, 3835, 3835, 3835, 3835,
+ 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835,
+ 3835, 3835, 3835, 0, 4008, 3986, 3998, 4010, 4074, 4008,
+ 4008, 4075, 4075, 4009, 4074, 4074, 0, 4074, 4009, 4009,
+ 4074, 3987, 4008, 3999, 3999, 3835, 3987, 3987, 4076, 4076,
+ 4010, 4077, 4077, 0, 4013, 4079, 4079, 4080, 4080, 4013,
+ 4013, 4082, 4082, 0, 4009, 3987, 4008, 3999, 3835, 3836,
+ 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836,
+ 3836, 3836, 3836, 3836, 3836, 3836, 3836, 4009, 4013, 3987,
+
+ 3999, 4071, 4071, 4081, 4089, 4089, 4090, 4090, 4081, 4081,
+ 4071, 0, 4011, 4071, 0, 3994, 3994, 4011, 4011, 3836,
+ 4084, 4013, 4085, 4085, 0, 4084, 4084, 0, 4085, 4085,
+ 4092, 4085, 0, 3930, 4085, 4092, 4092, 0, 3994, 3930,
+ 3930, 4011, 3836, 3841, 3841, 3841, 3841, 3841, 3841, 3841,
+ 3841, 3841, 3841, 3841, 3841, 3930, 3841, 3841, 3841, 3841,
+ 3841, 3994, 4086, 4034, 4011, 0, 3930, 0, 4086, 4086,
+ 0, 4086, 4093, 4093, 4086, 0, 4088, 4088, 4594, 3930,
+ 4034, 4012, 4624, 3841, 4594, 4088, 4012, 4012, 4088, 3930,
+ 4095, 4095, 4096, 4096, 4098, 4098, 4095, 4095, 0, 4095,
+
+ 4100, 4100, 4095, 4624, 4034, 4012, 3841, 3842, 3842, 3842,
+ 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3842,
+ 3842, 3842, 3842, 3842, 3842, 4105, 4105, 4624, 3932, 4012,
+ 3951, 3951, 0, 3952, 3932, 3932, 3951, 3951, 4171, 3952,
+ 3952, 0, 3965, 3965, 4107, 4107, 0, 3842, 3965, 3965,
+ 3932, 4099, 3951, 4103, 4653, 3952, 4099, 4099, 4103, 4103,
+ 4653, 3932, 4104, 3951, 3965, 0, 3952, 4104, 4104, 4171,
+ 3842, 3858, 3858, 0, 3932, 3965, 3951, 3858, 3858, 3952,
+ 3858, 4109, 4109, 3858, 3932, 4106, 3951, 0, 3965, 3952,
+ 4106, 4106, 4171, 3858, 4110, 4111, 4111, 4114, 3965, 4110,
+
+ 4110, 4115, 4114, 4114, 3858, 4117, 4115, 4115, 4116, 4116,
+ 4117, 4117, 4119, 4119, 4121, 4121, 0, 3858, 4124, 4124,
+ 4126, 4126, 4127, 4127, 4128, 4128, 0, 3858, 3890, 3890,
+ 3890, 3890, 3890, 3890, 3890, 3890, 3890, 3890, 3890, 3890,
+ 3890, 3890, 3890, 3890, 3890, 3890, 4123, 4131, 4131, 4130,
+ 0, 4133, 0, 4123, 4130, 4130, 4133, 4133, 4134, 4134,
+ 4123, 4136, 4141, 4141, 4139, 4134, 4136, 4136, 3890, 4139,
+ 4139, 4140, 0, 4142, 4144, 4144, 4140, 4140, 4142, 4142,
+ 4145, 4145, 4147, 0, 4123, 4148, 4148, 4147, 4147, 4152,
+ 4152, 3890, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891,
+
+ 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891,
+ 4150, 4154, 0, 4156, 0, 4150, 4150, 4154, 4154, 4156,
+ 4156, 0, 3891, 4154, 4170, 4156, 4157, 4157, 4159, 4159,
+ 4160, 4160, 3891, 4162, 4162, 4164, 4160, 4163, 4163, 4165,
+ 4165, 4164, 4164, 4166, 4166, 3891, 4180, 4164, 4172, 4172,
+ 5959, 4180, 4180, 4170, 4161, 3891, 3956, 3956, 3956, 3956,
+ 3956, 4161, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+ 3956, 3956, 3956, 3956, 4167, 0, 4170, 4161, 4182, 4182,
+ 4167, 4167, 4183, 5959, 4184, 0, 4167, 4183, 4183, 4184,
+ 4184, 4188, 4188, 4189, 4189, 4715, 3956, 4191, 4192, 4192,
+
+ 4161, 4715, 4191, 4191, 4196, 4196, 5959, 4185, 4198, 4198,
+ 4181, 4181, 4185, 4185, 4203, 4203, 4181, 4181, 0, 3956,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4181, 4015, 4015, 4015, 4015, 4015, 4853, 4201,
+ 4201, 4185, 4203, 4181, 4853, 4186, 4206, 4206, 4205, 5016,
+ 4186, 4186, 4201, 4205, 4205, 5016, 4181, 4199, 4199, 0,
+ 4015, 0, 4209, 0, 4185, 4203, 4181, 4209, 4209, 4200,
+ 4200, 0, 4210, 4211, 4211, 0, 4201, 4210, 4210, 4186,
+ 4199, 4200, 0, 4015, 4016, 4016, 4016, 4016, 4016, 4016,
+ 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016,
+
+ 4016, 4016, 4186, 4199, 4212, 4200, 4219, 4219, 4221, 4212,
+ 4212, 4229, 4229, 5038, 4221, 4221, 0, 4202, 4202, 5038,
+ 4221, 4204, 4204, 4223, 4016, 4222, 4222, 0, 4213, 4223,
+ 4223, 4222, 4222, 4213, 4213, 4223, 4215, 4222, 4236, 4236,
+ 0, 4215, 4215, 4202, 0, 4204, 4213, 4016, 4135, 4135,
+ 4135, 4135, 4135, 4135, 4135, 4135, 4135, 4135, 4135, 4135,
+ 4135, 4135, 4135, 4135, 4135, 4135, 4202, 4135, 4204, 4215,
+ 4213, 4243, 4243, 4227, 4244, 4244, 0, 4214, 4227, 4227,
+ 0, 4216, 4214, 4214, 4187, 4187, 4216, 4216, 4135, 4230,
+ 0, 4135, 4215, 4187, 4230, 4230, 4187, 0, 4218, 4245,
+
+ 4245, 4247, 4247, 4218, 4218, 4705, 4187, 0, 4214, 0,
+ 4216, 4135, 4158, 4158, 4158, 4158, 4158, 4187, 4158, 4158,
+ 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158,
+ 4187, 4214, 4218, 4216, 4705, 4226, 4226, 0, 4231, 0,
+ 4187, 4226, 4226, 4231, 4231, 4235, 0, 4226, 4217, 4231,
+ 4235, 4235, 4158, 4217, 4217, 4218, 4237, 4705, 4246, 0,
+ 4248, 4237, 4237, 4246, 4246, 4248, 4248, 0, 4250, 4251,
+ 4251, 0, 4217, 4250, 4250, 4158, 4168, 4168, 4168, 4168,
+ 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,
+ 4168, 4168, 4168, 4168, 4249, 4249, 4217, 4252, 4168, 0,
+
+ 4249, 4249, 4252, 4252, 4254, 4254, 4249, 4253, 4253, 4264,
+ 4264, 0, 4262, 4253, 4253, 4265, 4168, 4262, 4262, 4253,
+ 4265, 4265, 4168, 4266, 4275, 4275, 4267, 0, 4266, 4266,
+ 0, 4267, 4267, 4276, 4276, 4269, 4277, 4277, 4271, 4168,
+ 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4169,
+ 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4271, 4174,
+ 4267, 4269, 0, 4176, 4190, 4174, 4174, 4272, 4174, 4176,
+ 4176, 4174, 4176, 4190, 4273, 4176, 4190, 4281, 4281, 4508,
+ 4169, 4174, 4271, 4267, 4269, 4176, 4190, 4272, 4508, 4278,
+ 4278, 4508, 4174, 4268, 4273, 0, 4176, 4190, 4268, 4268,
+
+ 5296, 4281, 4278, 4169, 0, 4174, 5296, 4195, 0, 4176,
+ 4190, 4272, 0, 4195, 4195, 4174, 4175, 4175, 4273, 4176,
+ 4190, 0, 4175, 4175, 4281, 4175, 4278, 4268, 4175, 4195,
+ 4287, 4287, 4282, 4282, 0, 4256, 4280, 4280, 4175, 0,
+ 4195, 4256, 4256, 0, 4256, 4279, 4279, 4256, 0, 4175,
+ 4268, 4282, 5631, 4195, 4291, 4291, 0, 4256, 5631, 4283,
+ 4283, 4286, 4175, 4195, 4280, 0, 4286, 4286, 4256, 4303,
+ 4303, 4279, 4175, 4179, 4179, 4282, 0, 4258, 0, 4179,
+ 4179, 4256, 4179, 4258, 4258, 4179, 4258, 4280, 4283, 4258,
+ 5290, 4256, 4288, 0, 4279, 4179, 0, 4288, 4288, 4258,
+
+ 4304, 4304, 4263, 4263, 4305, 4305, 4179, 4290, 4263, 4263,
+ 4258, 4283, 4290, 4290, 0, 4292, 4313, 4313, 5290, 4179,
+ 4292, 4292, 4294, 4258, 4263, 4306, 4306, 4294, 4294, 4179,
+ 4194, 4194, 0, 4258, 0, 4263, 4194, 4194, 4306, 4194,
+ 4295, 5290, 4194, 4300, 4300, 4295, 4295, 0, 4263, 4300,
+ 0, 4297, 4194, 4317, 4317, 4294, 4297, 4297, 4263, 4296,
+ 0, 4312, 4306, 4194, 4296, 4296, 4312, 4312, 4314, 4295,
+ 4326, 4326, 0, 4314, 4314, 0, 4194, 0, 4294, 4307,
+ 4307, 4308, 4308, 4296, 0, 4297, 4194, 4228, 4228, 4228,
+ 4228, 4228, 4295, 4228, 4228, 4228, 4228, 4228, 4228, 4228,
+
+ 4228, 4228, 4228, 4228, 4228, 4307, 4316, 4296, 4297, 4308,
+ 4318, 4316, 4316, 0, 4299, 4318, 4318, 4298, 0, 4299,
+ 4299, 0, 4298, 4298, 4309, 4309, 0, 4228, 4307, 4334,
+ 4310, 4310, 4308, 4337, 4334, 4334, 4336, 4336, 4337, 4337,
+ 4341, 4341, 0, 4311, 4311, 0, 4298, 4299, 4309, 4310,
+ 4228, 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4233,
+ 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4298,
+ 4299, 4309, 4311, 4310, 4342, 4342, 0, 4320, 4345, 4345,
+ 4344, 0, 4320, 4320, 4321, 4344, 4344, 4322, 5809, 4321,
+ 4321, 4233, 4322, 4322, 5809, 4311, 4348, 4348, 4350, 4350,
+
+ 4323, 4358, 4358, 4338, 0, 4323, 4323, 0, 4338, 4338,
+ 4320, 4322, 0, 4321, 4233, 4234, 4234, 4234, 4234, 4234,
+ 4234, 4234, 4234, 4234, 4234, 4234, 4234, 4234, 4234, 4234,
+ 4234, 4234, 4234, 4320, 4323, 4322, 4321, 4338, 4357, 0,
+ 4352, 4352, 4325, 4357, 4357, 4324, 0, 4325, 4325, 0,
+ 4324, 4324, 4352, 4361, 0, 4234, 4362, 4323, 4361, 4361,
+ 4338, 4362, 4362, 4363, 4363, 4339, 0, 4364, 4373, 4373,
+ 4339, 4339, 4364, 4364, 4324, 4325, 4352, 4886, 4234, 4239,
+ 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4239,
+ 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4324, 4325, 4339,
+
+ 4353, 4353, 4372, 4372, 4372, 4381, 4886, 4239, 4383, 4383,
+ 4381, 4381, 4384, 4353, 0, 4351, 4351, 4384, 4384, 4239,
+ 4388, 4388, 4339, 4389, 4389, 4390, 4390, 4398, 4398, 4886,
+ 4239, 4402, 4402, 4328, 4355, 4355, 0, 4353, 4351, 4328,
+ 4328, 4343, 4239, 4240, 4240, 4240, 4240, 4240, 4240, 4240,
+ 4240, 4240, 4240, 4240, 4240, 4328, 4240, 4240, 4240, 4240,
+ 4240, 4351, 4355, 4343, 4397, 0, 4328, 4399, 5007, 4397,
+ 4397, 5007, 4399, 4399, 4343, 5007, 4354, 4354, 5903, 4328,
+ 4356, 4356, 0, 4240, 5903, 4355, 4401, 4343, 4403, 4328,
+ 0, 4401, 4401, 4403, 4403, 4411, 4411, 4343, 4414, 4414,
+
+ 4415, 4415, 4354, 0, 4356, 0, 4240, 4241, 4241, 4241,
+ 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241,
+ 4241, 4241, 4241, 4241, 4241, 4354, 4365, 4356, 4329, 4329,
+ 4330, 4365, 4365, 4368, 4329, 4329, 4330, 4330, 4368, 4368,
+ 4367, 0, 4333, 4333, 4365, 4367, 4367, 4241, 4333, 4333,
+ 4329, 0, 4330, 0, 4391, 4391, 0, 4340, 4340, 4335,
+ 4335, 4329, 4368, 4330, 4333, 4335, 4335, 4391, 4365, 0,
+ 4241, 4257, 4257, 4367, 4329, 4333, 4330, 4257, 4257, 4340,
+ 4257, 4335, 4412, 4257, 4329, 4368, 4330, 0, 4333, 4366,
+ 4340, 4391, 4335, 4257, 4366, 4366, 4367, 4371, 4333, 0,
+
+ 4347, 4347, 4412, 4340, 4257, 4335, 4347, 4347, 4416, 4416,
+ 4424, 4424, 4524, 4340, 0, 4335, 0, 4257, 4369, 0,
+ 4366, 4371, 4347, 4369, 4369, 4370, 4412, 4257, 4261, 4261,
+ 4370, 4370, 4375, 4347, 4261, 4261, 4524, 4261, 4375, 4375,
+ 4261, 0, 4369, 4366, 4602, 4371, 4347, 4385, 4428, 4428,
+ 4261, 0, 4385, 4385, 4375, 0, 4347, 4376, 4376, 4370,
+ 4524, 4261, 5949, 4376, 4376, 4375, 4369, 4386, 5949, 4394,
+ 4394, 0, 4386, 4386, 4261, 4602, 4392, 4392, 4375, 4376,
+ 5621, 4385, 4370, 5621, 4261, 4289, 4289, 5621, 4375, 4377,
+ 4376, 4289, 4289, 4394, 4289, 4377, 4377, 4289, 4602, 4393,
+
+ 4393, 4386, 4392, 4376, 4385, 4440, 4440, 4289, 0, 4395,
+ 4395, 4377, 0, 4376, 4380, 4380, 4394, 6029, 4289, 0,
+ 4380, 4380, 4377, 6029, 4386, 4392, 0, 4393, 4395, 4396,
+ 4396, 4289, 4406, 4382, 4382, 4377, 4380, 4406, 4406, 4382,
+ 4382, 4289, 4293, 4293, 0, 4377, 0, 4380, 4293, 4293,
+ 4393, 4293, 4395, 6115, 4293, 4382, 4417, 4417, 4396, 6115,
+ 4380, 4406, 4405, 0, 4293, 5057, 4382, 4405, 4405, 4417,
+ 4380, 0, 4407, 4441, 4441, 4293, 0, 4407, 4407, 4382,
+ 0, 4396, 4442, 4442, 4406, 4408, 4445, 4445, 4293, 4382,
+ 4408, 4408, 0, 4417, 5057, 4405, 4407, 0, 4293, 4301,
+
+ 4301, 4301, 4301, 4301, 4301, 4301, 4301, 4301, 4301, 4301,
+ 4301, 4301, 4301, 4301, 4301, 4301, 4301, 5057, 4405, 4408,
+ 4407, 4301, 4400, 4400, 0, 4404, 4404, 0, 4400, 4400,
+ 4409, 4404, 4404, 4419, 4419, 4409, 4409, 4421, 4421, 4301,
+ 4418, 4418, 4408, 4410, 4400, 4301, 0, 4404, 4410, 4410,
+ 4420, 4420, 4446, 4446, 6178, 4400, 4421, 0, 4404, 4409,
+ 6178, 4419, 4301, 4315, 4315, 0, 4418, 6206, 4400, 4315,
+ 4315, 4404, 4315, 6206, 4420, 4315, 4410, 6252, 4400, 0,
+ 4421, 4404, 4409, 6252, 4419, 4315, 4422, 4422, 4423, 4418,
+ 4448, 4448, 0, 4423, 4423, 4425, 4315, 4420, 4427, 4410,
+
+ 4425, 4425, 6264, 4427, 4427, 4429, 4426, 4426, 6264, 4315,
+ 4429, 4429, 4426, 4426, 0, 4422, 0, 4431, 0, 4315,
+ 4319, 4319, 4431, 4431, 4430, 4430, 4319, 4319, 4426, 4319,
+ 4430, 4430, 4319, 4449, 4449, 4432, 4456, 4456, 4422, 4426,
+ 4432, 4432, 4319, 4433, 4461, 4461, 4430, 0, 4433, 4433,
+ 4431, 0, 4426, 4319, 4434, 4459, 0, 4430, 0, 4434,
+ 4434, 0, 4426, 4435, 4432, 6277, 4319, 4433, 4435, 4435,
+ 4430, 6277, 4436, 4431, 4465, 4465, 4319, 4436, 4436, 4437,
+ 4430, 4459, 4470, 4470, 4437, 4437, 0, 4432, 4434, 4439,
+ 0, 4433, 4435, 4447, 4439, 4439, 4450, 0, 4447, 4447,
+
+ 6303, 4450, 4450, 4451, 4459, 4436, 6303, 4454, 4451, 4451,
+ 0, 4434, 4454, 4454, 4455, 4435, 4457, 0, 4460, 4455,
+ 4455, 4457, 4457, 4460, 4460, 4462, 0, 4463, 4436, 4464,
+ 4462, 4462, 4463, 4463, 4464, 4464, 4466, 0, 4467, 4471,
+ 4471, 4466, 4466, 4467, 4467, 4472, 4472, 4473, 4473, 4474,
+ 4474, 4476, 4476, 4477, 4477, 4478, 4478, 4479, 4479, 4481,
+ 4479, 4482, 4482, 4483, 4481, 4481, 4484, 0, 4483, 4483,
+ 4485, 4484, 4484, 4486, 4486, 4485, 4485, 4487, 0, 4489,
+ 0, 4490, 4487, 4487, 4489, 4489, 4490, 4490, 4491, 4491,
+ 4492, 4493, 4493, 4495, 0, 4492, 4492, 4496, 4496, 4495,
+
+ 4495, 4497, 4495, 4496, 4496, 4495, 4496, 4497, 4497, 4496,
+ 4497, 4500, 4500, 4497, 4503, 4503, 4501, 4500, 4500, 4502,
+ 4500, 4501, 4501, 4500, 4502, 4502, 4504, 4505, 4505, 4506,
+ 4506, 4504, 4504, 4507, 4507, 4509, 4505, 4510, 4510, 4505,
+ 4509, 4509, 4512, 4512, 4513, 4513, 4515, 4515, 4512, 4512,
+ 4516, 4512, 4517, 4517, 4512, 4516, 4516, 4520, 0, 4521,
+ 4522, 4522, 4520, 4520, 4521, 4521, 4523, 4525, 4525, 4527,
+ 0, 4523, 4523, 4528, 4528, 4527, 4527, 4529, 4527, 4528,
+ 4528, 4527, 4528, 4529, 4529, 4528, 4529, 4532, 4532, 4529,
+ 4535, 4535, 4533, 4532, 4532, 4534, 4532, 4533, 4533, 4532,
+
+ 4534, 4534, 4536, 4538, 4538, 4539, 4539, 4536, 4536, 4540,
+ 4540, 4541, 4542, 4542, 4543, 0, 4541, 4541, 4545, 4543,
+ 4543, 4544, 4544, 4545, 4545, 4546, 4546, 4544, 4544, 4547,
+ 4544, 4548, 4548, 4544, 4547, 4547, 5171, 4548, 4548, 0,
+ 4548, 4550, 4550, 4548, 4551, 4551, 4552, 4552, 4553, 4554,
+ 4554, 4555, 5171, 4553, 4553, 4557, 4555, 4555, 4556, 4556,
+ 4557, 4557, 4558, 4558, 4556, 4556, 4559, 4556, 4560, 4560,
+ 4556, 4559, 4559, 0, 4560, 4560, 5171, 4560, 4561, 4561,
+ 4560, 4563, 4563, 4564, 4564, 4565, 4565, 4566, 4567, 4567,
+ 4568, 4568, 4569, 4569, 4566, 4570, 4570, 4571, 4571, 4572,
+
+ 4572, 4573, 0, 4576, 4578, 4578, 4573, 4573, 4576, 4576,
+ 4566, 4577, 0, 4579, 0, 4581, 4577, 4577, 4579, 4579,
+ 4581, 4581, 4582, 4582, 4583, 5352, 4584, 4586, 4586, 4583,
+ 4583, 4584, 4584, 4566, 4580, 4580, 4580, 4580, 4580, 4580,
+ 4580, 4580, 4580, 4580, 4580, 4580, 4580, 4580, 4580, 4580,
+ 4580, 4580, 4585, 5352, 4587, 4589, 4589, 4585, 4585, 4587,
+ 4587, 4588, 4580, 4591, 4591, 4592, 4588, 4588, 4593, 4593,
+ 4592, 4592, 4596, 6335, 4580, 4597, 5352, 4596, 4596, 6335,
+ 4597, 4597, 4598, 4598, 4599, 4580, 4603, 4603, 0, 4599,
+ 4599, 4605, 4605, 4609, 4609, 4610, 4610, 4580, 4601, 4601,
+
+ 4601, 4601, 4601, 5788, 4601, 4601, 4601, 4601, 4601, 4601,
+ 4601, 4601, 4601, 4601, 4601, 4601, 4606, 0, 4607, 4607,
+ 4611, 5788, 4606, 4606, 4607, 6380, 4611, 4611, 4606, 4612,
+ 4612, 6380, 4611, 4614, 4614, 4615, 4615, 4616, 4601, 4613,
+ 0, 4617, 0, 4616, 4616, 5788, 4613, 4617, 4617, 4616,
+ 4618, 4618, 0, 4617, 4619, 4619, 4613, 4627, 4627, 4629,
+ 4629, 4601, 4604, 4604, 4604, 4604, 4604, 0, 4604, 4604,
+ 4604, 4604, 4604, 4604, 4604, 4604, 4604, 4604, 4604, 4604,
+ 4613, 4621, 4621, 4630, 4630, 4633, 0, 4621, 4635, 4635,
+ 4633, 4633, 4631, 4631, 4632, 4632, 4643, 4643, 4636, 0,
+
+ 4638, 0, 4604, 4636, 4636, 4638, 4638, 4648, 4648, 4642,
+ 0, 4644, 0, 4639, 4642, 4642, 4644, 4644, 4639, 4639,
+ 0, 4631, 0, 4632, 0, 4604, 4608, 4608, 4608, 4608,
+ 4608, 4608, 4608, 4608, 4608, 4608, 4608, 4608, 4608, 4608,
+ 4608, 4608, 4608, 4608, 4631, 4656, 4632, 4639, 4658, 4658,
+ 4656, 4656, 4640, 4664, 4664, 4659, 0, 4640, 4640, 4646,
+ 4659, 4659, 4626, 0, 4646, 4646, 4608, 4660, 4626, 4626,
+ 4639, 4626, 4660, 4660, 4626, 4665, 4665, 4666, 4666, 4674,
+ 4674, 4678, 4678, 0, 4626, 0, 4640, 4646, 0, 4608,
+ 4620, 4620, 4620, 4620, 4620, 4626, 4620, 4620, 4620, 4620,
+
+ 4620, 4620, 4620, 4620, 4620, 4620, 4620, 4620, 4626, 4640,
+ 4646, 4647, 0, 4667, 4667, 4661, 4647, 4647, 4626, 6423,
+ 4661, 4661, 0, 4669, 4669, 6423, 4667, 4673, 4647, 4675,
+ 4620, 4677, 4673, 4673, 4675, 4675, 4677, 4677, 0, 4662,
+ 4689, 4689, 4691, 4691, 4662, 4662, 4672, 4672, 0, 4661,
+ 4667, 4669, 4647, 4620, 4622, 4622, 4622, 4622, 4622, 4622,
+ 4622, 4622, 4622, 4622, 4622, 4622, 4622, 4622, 4622, 4622,
+ 4622, 4622, 4661, 4662, 4669, 4672, 4679, 4688, 0, 4692,
+ 4692, 4679, 4679, 4688, 4688, 4692, 0, 4668, 4668, 4688,
+ 0, 4670, 4670, 0, 4622, 4693, 4662, 0, 4672, 4696,
+
+ 4693, 4693, 4695, 4695, 4696, 4696, 4681, 4701, 4701, 4710,
+ 4710, 4681, 4681, 4668, 0, 4670, 0, 4622, 4623, 4623,
+ 4623, 4623, 4623, 4623, 4623, 4623, 4623, 4623, 4623, 4623,
+ 4623, 4623, 4623, 4623, 4623, 4623, 4668, 4628, 4670, 4681,
+ 4623, 4634, 4634, 4628, 4628, 4641, 4641, 4634, 4634, 4671,
+ 4671, 4641, 4641, 4706, 4706, 4706, 4711, 4711, 4623, 4628,
+ 4682, 0, 4681, 4634, 4623, 4682, 4682, 4641, 4671, 6489,
+ 4628, 4700, 0, 4650, 4634, 6489, 4700, 4700, 4641, 4650,
+ 4650, 4623, 4650, 4628, 6518, 4650, 0, 4634, 6560, 4682,
+ 6518, 4641, 4671, 4628, 6560, 4650, 0, 4634, 4637, 4637,
+
+ 0, 4641, 4652, 0, 4637, 4637, 4650, 4637, 4652, 4652,
+ 4637, 4652, 4682, 0, 4652, 4714, 4714, 4683, 0, 4650,
+ 4637, 0, 4683, 4683, 4652, 4718, 4718, 4657, 4657, 4650,
+ 6616, 4637, 4684, 4657, 4657, 4652, 6616, 4684, 4684, 0,
+ 4685, 4683, 4719, 4719, 4637, 4685, 4685, 4686, 4652, 4657,
+ 4721, 4721, 4686, 4686, 4637, 4645, 4645, 6641, 4652, 0,
+ 4657, 4645, 4645, 6641, 4645, 4683, 4684, 4645, 6658, 4685,
+ 4722, 4722, 6668, 4657, 6658, 4697, 4697, 4645, 6668, 4698,
+ 4686, 4697, 4697, 4657, 4698, 4698, 6201, 4697, 4645, 4684,
+ 4698, 4702, 4685, 4703, 4703, 6201, 4702, 4702, 6201, 4703,
+
+ 4703, 4645, 4704, 4686, 4713, 4703, 0, 4704, 4704, 4713,
+ 4713, 4645, 4651, 4651, 4725, 4725, 5498, 4716, 4651, 4651,
+ 4720, 4651, 4716, 4716, 4651, 4724, 4720, 4720, 5960, 4723,
+ 4724, 4724, 4720, 4726, 4651, 4723, 4723, 5688, 4726, 4726,
+ 4729, 4723, 4727, 4727, 5498, 4651, 4729, 4729, 4727, 4727,
+ 4728, 4728, 4729, 0, 4727, 4730, 4728, 4728, 4651, 5960,
+ 4730, 4730, 4728, 4731, 4731, 5688, 4732, 5498, 4651, 4655,
+ 4655, 4732, 4732, 0, 4734, 4655, 4655, 0, 4655, 4734,
+ 4734, 4655, 5960, 4736, 6435, 4734, 4737, 4737, 5688, 4736,
+ 4736, 4655, 4736, 4739, 4739, 4736, 0, 4738, 4740, 4740,
+
+ 6435, 4743, 4655, 4738, 4738, 4736, 4743, 4743, 4741, 4741,
+ 0, 4742, 4742, 4745, 4745, 4655, 4736, 4746, 0, 4738,
+ 4753, 4753, 4746, 4746, 6435, 4655, 4676, 4676, 6680, 4736,
+ 4738, 0, 4676, 4676, 6680, 4676, 4748, 4741, 4676, 4736,
+ 4742, 4748, 4748, 4738, 4752, 4744, 4744, 0, 4676, 4752,
+ 4752, 4744, 4744, 4738, 4758, 4758, 4754, 4760, 4760, 4676,
+ 4741, 4754, 4754, 4742, 4749, 4759, 0, 4744, 4750, 4749,
+ 4749, 4756, 4676, 4750, 4750, 6691, 4756, 4756, 4744, 4761,
+ 4761, 6691, 4676, 4680, 4680, 4759, 4762, 4762, 0, 4680,
+ 4680, 4744, 4680, 4763, 4763, 4680, 4764, 4764, 4749, 4756,
+
+ 0, 4744, 4750, 4766, 4766, 4680, 4767, 4767, 6247, 4759,
+ 4769, 4769, 4751, 4751, 4778, 4778, 4680, 6247, 4751, 4751,
+ 6247, 4749, 4756, 4784, 4784, 4750, 4777, 4797, 4797, 4680,
+ 0, 4777, 4777, 0, 4751, 0, 4770, 4770, 4769, 4680,
+ 4690, 4690, 4690, 4690, 4690, 4751, 4690, 4690, 4690, 4690,
+ 4690, 4690, 4690, 4690, 4690, 4690, 4690, 4690, 4751, 4757,
+ 4770, 4769, 4798, 4798, 4757, 4757, 4771, 4771, 4751, 0,
+ 4772, 4772, 4800, 4800, 4774, 4774, 4757, 4773, 4773, 0,
+ 4690, 4779, 0, 4770, 4783, 4771, 4779, 4779, 4785, 4783,
+ 4783, 4787, 6740, 4785, 4785, 0, 4787, 4787, 6740, 4772,
+
+ 4757, 4773, 4774, 4690, 4694, 4694, 4694, 4694, 4694, 4771,
+ 4694, 4694, 4694, 4694, 4694, 4694, 4694, 4694, 4694, 4694,
+ 4694, 4694, 4772, 0, 4773, 4774, 4801, 4801, 0, 4788,
+ 0, 4789, 0, 4809, 4788, 4788, 4789, 4789, 4809, 4809,
+ 4810, 4810, 4790, 0, 4694, 4811, 6796, 4790, 4790, 4815,
+ 4811, 4811, 6796, 4791, 4815, 4815, 4793, 0, 4791, 4791,
+ 0, 4793, 4793, 4788, 0, 4789, 4790, 4694, 4699, 4699,
+ 4699, 4699, 4699, 4699, 4699, 4699, 4699, 4699, 4699, 4699,
+ 4699, 4699, 4699, 4699, 4699, 4699, 4788, 4791, 4789, 4793,
+ 4790, 4816, 4816, 0, 4817, 0, 4819, 0, 4792, 4817,
+
+ 4817, 4819, 4819, 4792, 4792, 6894, 4804, 4804, 4699, 0,
+ 4791, 6894, 4793, 4830, 4830, 4832, 4832, 4837, 4837, 4843,
+ 4843, 0, 4786, 4786, 4803, 4803, 0, 4792, 4786, 4786,
+ 4804, 4699, 4707, 4707, 4707, 4707, 4707, 4707, 4707, 4707,
+ 4707, 4707, 4707, 4707, 4786, 4707, 4707, 4707, 4707, 4707,
+ 4792, 4835, 4803, 4804, 4838, 4786, 4835, 4835, 0, 4838,
+ 4838, 4842, 4806, 4806, 4794, 0, 4842, 4842, 4786, 4794,
+ 4794, 4844, 4707, 4848, 4848, 4803, 4844, 4844, 4786, 4856,
+ 4858, 4858, 4863, 4863, 4856, 4856, 4864, 4864, 4808, 4808,
+ 0, 4806, 4794, 4807, 4807, 4707, 4708, 4708, 4708, 4708,
+
+ 4708, 4708, 4708, 4708, 4708, 4708, 4708, 4708, 4708, 4708,
+ 4708, 4708, 4708, 4708, 4806, 4794, 4808, 4807, 4865, 4865,
+ 4859, 0, 4872, 0, 4820, 4859, 4859, 4872, 4872, 4820,
+ 4820, 0, 4795, 4873, 4873, 0, 4708, 4795, 4795, 4808,
+ 4807, 4874, 0, 4876, 4877, 4877, 4874, 4874, 4876, 4876,
+ 4889, 4889, 4891, 4891, 4896, 4896, 4795, 0, 4820, 4708,
+ 4717, 4717, 4717, 4717, 4717, 4717, 4717, 4717, 4717, 4717,
+ 4717, 4717, 4717, 4717, 4717, 4717, 4717, 4717, 4805, 4805,
+ 4795, 4820, 4717, 0, 4878, 0, 4821, 0, 4823, 4878,
+ 4878, 4821, 4821, 4823, 4823, 7014, 4765, 4805, 4902, 4902,
+
+ 4717, 7014, 4765, 4765, 4894, 4765, 4717, 4897, 4765, 4894,
+ 4894, 4901, 4897, 4897, 4907, 4907, 4901, 4901, 4765, 0,
+ 4821, 4805, 4823, 4717, 4733, 4733, 4733, 4733, 4733, 4765,
+ 4733, 4733, 4733, 4733, 4733, 4733, 4733, 4733, 4733, 4733,
+ 4733, 4733, 4765, 4821, 4824, 4823, 0, 4768, 0, 4824,
+ 4824, 0, 4765, 4768, 4768, 4826, 4768, 4822, 0, 4768,
+ 4826, 4826, 4822, 4822, 4733, 4903, 4869, 4869, 0, 4768,
+ 4903, 4903, 7159, 4824, 4908, 4908, 4910, 4910, 7159, 4825,
+ 4768, 4822, 0, 4826, 4825, 4825, 0, 4733, 4747, 4747,
+ 4869, 0, 4782, 4768, 4747, 4747, 4824, 4747, 4782, 4782,
+
+ 4747, 4782, 4846, 4768, 4782, 4822, 4826, 4846, 4846, 0,
+ 4747, 0, 4825, 4869, 4782, 4868, 4868, 4799, 4833, 4833,
+ 0, 4747, 0, 4799, 4799, 4782, 4799, 4866, 4866, 4799,
+ 4846, 4911, 4911, 0, 4747, 4825, 4827, 0, 4782, 4799,
+ 4866, 4827, 4827, 4868, 4747, 4755, 4755, 4833, 4782, 4802,
+ 4799, 4755, 4755, 4846, 4755, 4802, 4802, 4755, 4802, 0,
+ 4827, 4802, 0, 4799, 4866, 0, 4868, 4755, 4920, 4920,
+ 4833, 4802, 0, 4799, 4814, 4926, 4926, 0, 4755, 0,
+ 4814, 4814, 4802, 4814, 4827, 0, 4814, 4867, 4867, 4834,
+ 4834, 4755, 4919, 4818, 4818, 4802, 4814, 4919, 4919, 4818,
+
+ 4818, 4755, 4780, 4780, 0, 4802, 0, 4814, 4780, 4780,
+ 0, 4780, 0, 4867, 4780, 4818, 0, 4840, 4834, 0,
+ 4814, 4829, 4840, 4840, 4780, 0, 4818, 4829, 4829, 0,
+ 4814, 0, 4921, 4937, 4937, 4780, 4867, 4921, 4921, 4818,
+ 4831, 4834, 0, 4829, 4913, 4913, 4831, 4831, 4780, 4818,
+ 4841, 4840, 4938, 4938, 4829, 4841, 4841, 4850, 4780, 4781,
+ 4781, 0, 4831, 4850, 4850, 4781, 4781, 4829, 4781, 0,
+ 4847, 4781, 4913, 4831, 4840, 4847, 4847, 4829, 0, 4850,
+ 0, 4781, 0, 4925, 4841, 0, 4831, 4847, 4925, 4925,
+ 4850, 0, 4781, 4870, 4870, 4913, 4831, 4939, 4939, 4941,
+
+ 4941, 4942, 4942, 4850, 4927, 4781, 0, 4841, 0, 4927,
+ 4927, 4847, 4870, 4850, 0, 4781, 4796, 4796, 4796, 4796,
+ 4796, 4796, 4796, 4796, 4796, 4796, 4796, 4796, 4796, 4796,
+ 4796, 4796, 4796, 4796, 4951, 4951, 4870, 4836, 4836, 4839,
+ 4839, 4957, 4957, 4836, 4836, 4839, 4839, 4995, 4871, 4871,
+ 0, 4845, 4845, 4968, 4968, 0, 4796, 4845, 4845, 4836,
+ 4860, 4839, 4969, 4969, 0, 4860, 4860, 4995, 4851, 4851,
+ 4836, 0, 4839, 4845, 4851, 4851, 5148, 4871, 0, 4796,
+ 4812, 4812, 0, 4836, 4845, 4839, 4812, 4812, 0, 4812,
+ 4851, 4995, 4812, 4836, 4860, 4839, 5148, 4845, 4880, 4852,
+
+ 4871, 4851, 4812, 4880, 4880, 4852, 4852, 4845, 4970, 4970,
+ 4906, 4972, 4972, 4812, 4851, 4906, 4906, 4860, 4973, 4973,
+ 5148, 4852, 4974, 4974, 4851, 0, 4812, 4906, 4855, 4855,
+ 0, 4880, 4852, 0, 4855, 4855, 4812, 4813, 4813, 4915,
+ 4915, 0, 4861, 4813, 4813, 4852, 4813, 4861, 4861, 4813,
+ 4855, 4906, 4977, 4977, 4880, 4852, 4857, 4857, 4915, 4813,
+ 0, 4855, 4857, 4857, 0, 4875, 4875, 4978, 4978, 0,
+ 4813, 4875, 4875, 0, 4855, 4881, 4861, 0, 4857, 0,
+ 4881, 4881, 4915, 4813, 4855, 4879, 4879, 4875, 0, 4857,
+ 4882, 4879, 4879, 4813, 0, 4882, 4882, 0, 4875, 4861,
+
+ 4883, 0, 4857, 4884, 4881, 4883, 4883, 4879, 4884, 4884,
+ 4885, 4875, 4857, 4888, 4882, 4885, 4885, 4890, 4879, 4888,
+ 4888, 4875, 0, 4890, 4890, 4892, 4892, 4881, 0, 4893,
+ 4893, 4879, 4884, 0, 4883, 4888, 4981, 4981, 4882, 4890,
+ 0, 4879, 4899, 4885, 4982, 4982, 4888, 4899, 4899, 0,
+ 4890, 4914, 4914, 0, 4892, 4884, 6826, 4883, 4893, 4888,
+ 0, 4895, 4895, 4890, 4898, 4898, 4885, 4895, 4895, 4888,
+ 4898, 4898, 0, 4890, 4900, 4914, 4899, 4892, 0, 4900,
+ 4900, 4893, 6826, 4895, 4983, 4983, 4898, 4905, 0, 4904,
+ 4904, 0, 4905, 4905, 4895, 4904, 4904, 4898, 4914, 4899,
+
+ 0, 4916, 4916, 4917, 4917, 6826, 4909, 4895, 4900, 0,
+ 4898, 4904, 4909, 4909, 6653, 4905, 0, 4895, 4912, 0,
+ 4898, 0, 4904, 6653, 4912, 4912, 6653, 4917, 4909, 0,
+ 4916, 4900, 4918, 4918, 0, 4904, 4922, 4922, 4905, 4909,
+ 4912, 4950, 4922, 4922, 0, 4904, 4950, 4950, 4923, 4923,
+ 4917, 4912, 4909, 4916, 4923, 4923, 4946, 4946, 4922, 0,
+ 4918, 4929, 4909, 0, 4912, 4924, 4929, 4929, 0, 4922,
+ 4923, 4924, 4924, 0, 4912, 4946, 4984, 4984, 0, 4928,
+ 4928, 4923, 4922, 4918, 4931, 4928, 4928, 4924, 0, 4931,
+ 4931, 0, 4922, 0, 4923, 4929, 0, 4930, 4924, 4946,
+
+ 4932, 4928, 4930, 4930, 4923, 4932, 4932, 0, 4931, 4933,
+ 0, 4924, 4928, 0, 4933, 4933, 0, 4934, 4929, 4986,
+ 4986, 4924, 4934, 4934, 4935, 4928, 4992, 4992, 0, 4935,
+ 4935, 4930, 4931, 4940, 4932, 4928, 4936, 4943, 4933, 4940,
+ 4940, 4936, 4936, 4943, 4943, 0, 4944, 4944, 4945, 4945,
+ 4934, 0, 4935, 0, 4930, 4940, 0, 4932, 0, 4943,
+ 4936, 4933, 4947, 4947, 4948, 4948, 4940, 0, 4949, 4949,
+ 4943, 4952, 4945, 4934, 4944, 4935, 4952, 4952, 0, 4940,
+ 4953, 4953, 0, 4943, 4936, 0, 4953, 4953, 4948, 4940,
+ 0, 4947, 0, 4943, 4955, 4945, 4949, 4944, 4954, 4954,
+
+ 4955, 4955, 4953, 4956, 4954, 4954, 4997, 4997, 4956, 4956,
+ 0, 4948, 4958, 4953, 4947, 0, 4955, 4958, 4958, 4949,
+ 4954, 5002, 5002, 4959, 4959, 0, 4953, 4955, 4960, 4959,
+ 4959, 4954, 4961, 4960, 4960, 0, 4953, 4961, 4961, 0,
+ 4955, 4963, 0, 4962, 4954, 4959, 4963, 4963, 4962, 4962,
+ 4955, 0, 4964, 0, 4954, 4965, 4959, 4964, 4964, 4966,
+ 4965, 4965, 4960, 0, 4966, 4966, 4961, 4962, 4967, 4959,
+ 0, 4971, 0, 4967, 4967, 4963, 4971, 4971, 4975, 4959,
+ 0, 4964, 0, 4975, 4975, 4960, 0, 4966, 4965, 4961,
+ 4979, 4962, 4967, 0, 4980, 4979, 4979, 4985, 4963, 4980,
+
+ 4980, 4987, 4985, 4985, 4964, 0, 4987, 4987, 4988, 0,
+ 4966, 4965, 4989, 4988, 4988, 4990, 4967, 4989, 4989, 4991,
+ 4990, 4990, 4993, 0, 4991, 4991, 4994, 4993, 4993, 4996,
+ 0, 4994, 4994, 4998, 4996, 4996, 4999, 0, 4998, 4998,
+ 5000, 4999, 4999, 5001, 0, 5000, 5000, 5003, 5001, 5001,
+ 5004, 0, 5003, 5003, 5005, 5004, 5004, 5008, 5008, 5005,
+ 5005, 5010, 5010, 5011, 5011, 5013, 5013, 0, 5013, 5014,
+ 5015, 5015, 5013, 5017, 5014, 5014, 5018, 5020, 5017, 5017,
+ 0, 5018, 5018, 5020, 5020, 0, 5020, 5021, 5021, 5020,
+ 5022, 5022, 5023, 5023, 5024, 0, 5025, 5026, 5026, 5024,
+
+ 5024, 5025, 5025, 5027, 5028, 5028, 5030, 5030, 5027, 5027,
+ 5028, 5028, 5029, 5028, 5031, 0, 5028, 5029, 5029, 5031,
+ 5031, 5032, 5032, 5033, 5033, 5035, 0, 5032, 5032, 0,
+ 5032, 5035, 5035, 5032, 5035, 5036, 5036, 5035, 0, 5037,
+ 0, 5036, 5036, 0, 5036, 5037, 5037, 5036, 5037, 5040,
+ 5040, 5037, 5043, 5043, 5041, 5040, 5040, 5042, 5040, 5041,
+ 5041, 5040, 5042, 5042, 5044, 5046, 5046, 5047, 5047, 5044,
+ 5044, 5048, 5048, 5049, 5050, 5050, 5051, 0, 5049, 5049,
+ 5053, 5051, 5051, 5052, 5052, 5053, 5053, 5054, 5054, 5052,
+ 5052, 5055, 5052, 5056, 5056, 5052, 5055, 5055, 0, 5056,
+
+ 5056, 5059, 5056, 5060, 5060, 5056, 0, 5059, 5059, 0,
+ 5059, 5061, 5061, 5059, 5062, 5062, 5063, 0, 5064, 5065,
+ 5065, 5063, 5063, 5064, 5064, 5066, 5067, 5067, 5069, 5069,
+ 5066, 5066, 5067, 5067, 5068, 5067, 5070, 0, 5067, 5068,
+ 5068, 5070, 5070, 5071, 5071, 5072, 5072, 5073, 5073, 5071,
+ 5071, 5074, 5071, 5075, 5075, 5071, 0, 5074, 5074, 5077,
+ 5074, 5076, 5076, 5074, 5078, 5077, 5077, 0, 5077, 5078,
+ 5078, 5077, 5079, 5079, 5080, 5081, 5081, 5085, 5085, 5080,
+ 5080, 5081, 5081, 0, 5081, 5082, 5082, 5081, 0, 5083,
+ 0, 5082, 5082, 0, 5082, 5083, 5083, 5082, 5083, 5084,
+
+ 0, 5083, 5086, 0, 5084, 5084, 5087, 5086, 5086, 5088,
+ 5088, 5087, 5087, 5089, 5089, 5090, 5091, 5091, 5092, 5092,
+ 5094, 5090, 5090, 5093, 5090, 5094, 5094, 5090, 0, 5093,
+ 5093, 5096, 5093, 5095, 5095, 5093, 5096, 5096, 5097, 5097,
+ 5101, 5101, 5098, 5098, 5097, 5097, 5099, 5097, 5098, 5098,
+ 5097, 5098, 5099, 5099, 5098, 5099, 5100, 0, 5099, 5102,
+ 0, 5100, 5100, 5103, 5102, 5102, 5104, 5104, 5103, 5103,
+ 5105, 5105, 5106, 5106, 5107, 5107, 5108, 5108, 5109, 5109,
+ 5110, 5111, 5111, 5112, 5112, 5113, 5113, 5110, 5114, 5114,
+ 5115, 5115, 5116, 5116, 5117, 5118, 5118, 5110, 5119, 5117,
+
+ 5117, 5120, 0, 5119, 5119, 5121, 5120, 5120, 5122, 5122,
+ 5121, 5121, 5123, 0, 5124, 5127, 5127, 5123, 5123, 5124,
+ 5124, 5110, 5125, 5125, 5125, 5125, 5125, 5125, 5125, 5125,
+ 5125, 5125, 5125, 5125, 5125, 5125, 5125, 5125, 5125, 5125,
+ 5126, 0, 5128, 0, 5125, 5126, 5126, 5128, 5128, 5129,
+ 0, 5130, 0, 5131, 5129, 5129, 5130, 5130, 5131, 5131,
+ 5132, 5132, 5125, 0, 5133, 5135, 5135, 0, 5125, 5133,
+ 5133, 5136, 5136, 5137, 5137, 5138, 5139, 5139, 5140, 0,
+ 5138, 5138, 5141, 5140, 5140, 5125, 5142, 5141, 5141, 5143,
+ 5143, 5142, 5142, 5144, 0, 5145, 5150, 5150, 5144, 5144,
+
+ 5145, 5145, 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147,
+ 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147,
+ 5151, 5151, 5152, 5153, 5153, 5155, 5155, 0, 5152, 5152,
+ 5157, 5157, 5158, 5158, 5152, 0, 5157, 5161, 5162, 5162,
+ 5163, 5163, 5147, 5161, 5161, 0, 5164, 5166, 5166, 5161,
+ 5164, 5169, 5169, 5166, 5172, 5172, 0, 5164, 5164, 5174,
+ 5174, 5176, 5176, 5177, 5177, 5147, 5149, 5149, 5149, 5149,
+ 5149, 5149, 5149, 5149, 5149, 5149, 5149, 5149, 5149, 5149,
+ 5149, 5149, 5149, 5149, 5167, 5180, 5180, 5181, 5181, 5186,
+ 5167, 5167, 5177, 0, 5186, 5186, 5167, 5178, 5178, 5187,
+
+ 5187, 0, 5173, 0, 5183, 5183, 5149, 5188, 5173, 5173,
+ 5192, 5192, 5188, 5188, 5190, 5177, 5184, 5184, 0, 5190,
+ 5190, 5203, 5203, 0, 5173, 0, 5178, 5183, 5184, 5149,
+ 5154, 5154, 5154, 5154, 5154, 5173, 5154, 5154, 5154, 5154,
+ 5154, 5154, 5154, 5154, 5154, 5154, 5154, 5154, 5173, 5178,
+ 5183, 5193, 5184, 0, 5195, 0, 5193, 5193, 5173, 5195,
+ 5195, 5198, 0, 5202, 5209, 5209, 5198, 5198, 5202, 5202,
+ 5154, 5204, 5211, 5211, 5212, 5212, 5204, 5204, 5217, 5217,
+ 5196, 0, 5197, 0, 5179, 5196, 5196, 5197, 5197, 5198,
+ 5179, 5179, 0, 5154, 5159, 5159, 5159, 5159, 5159, 5159,
+
+ 5159, 5159, 5159, 5159, 5159, 5159, 5179, 5159, 5159, 5159,
+ 5159, 5159, 5198, 5205, 5196, 5199, 5197, 5179, 5205, 5205,
+ 5199, 5199, 5206, 5225, 5225, 5213, 5213, 5206, 5206, 0,
+ 5179, 5205, 5199, 0, 5159, 0, 5215, 5196, 5218, 5197,
+ 5179, 5215, 5215, 5218, 5218, 5230, 5230, 5231, 5231, 0,
+ 5214, 5214, 0, 5206, 5213, 5205, 5199, 5159, 5160, 5160,
+ 5160, 5160, 5160, 5160, 5160, 5160, 5160, 5160, 5160, 5160,
+ 5160, 5160, 5160, 5160, 5160, 5160, 5206, 5213, 5220, 5214,
+ 0, 5224, 0, 5220, 5220, 5221, 5224, 5224, 5233, 5233,
+ 5221, 5221, 5234, 5234, 5175, 5243, 5243, 0, 5160, 5226,
+
+ 5175, 5175, 5214, 5175, 5226, 5226, 5175, 5222, 0, 5242,
+ 5249, 5249, 5222, 5222, 5242, 5242, 5175, 5236, 5236, 5221,
+ 0, 5160, 5165, 5165, 5165, 5165, 5165, 5175, 5165, 5165,
+ 5165, 5165, 5165, 5165, 5165, 5165, 5165, 5165, 5165, 5165,
+ 5175, 5222, 5221, 5229, 0, 5236, 5244, 0, 5229, 5229,
+ 5175, 5244, 5244, 5228, 5261, 5261, 5263, 5263, 5228, 5228,
+ 5229, 5248, 5165, 0, 5222, 5250, 5248, 5248, 5236, 5252,
+ 5250, 5250, 5267, 5267, 5252, 5252, 5268, 5268, 5239, 5239,
+ 0, 5228, 5237, 5237, 5229, 5165, 5168, 5168, 5168, 5168,
+ 5168, 5168, 5168, 5168, 5168, 5168, 5168, 5168, 5168, 5168,
+
+ 5168, 5168, 5168, 5168, 5228, 5264, 5237, 5239, 0, 5265,
+ 5265, 5264, 5264, 0, 5253, 5265, 0, 5264, 0, 5253,
+ 5253, 5240, 5240, 5270, 5270, 5269, 5168, 5238, 5238, 5237,
+ 5239, 5269, 5269, 5272, 5273, 5273, 5274, 5269, 5272, 5272,
+ 0, 5274, 5274, 5278, 5278, 5240, 5238, 0, 5253, 5168,
+ 5170, 5170, 5170, 5170, 5170, 5170, 5170, 5170, 5170, 5170,
+ 5170, 5170, 5170, 5170, 5170, 5170, 5170, 5170, 5240, 5182,
+ 5238, 5253, 0, 5185, 5185, 5182, 5182, 5259, 5182, 5185,
+ 5185, 5182, 5259, 5259, 5241, 5241, 0, 5191, 5191, 0,
+ 5170, 5182, 5276, 5191, 5191, 5185, 0, 5276, 5276, 5194,
+
+ 5194, 0, 5182, 5288, 5288, 5259, 5185, 0, 5194, 5191,
+ 0, 5194, 5241, 5170, 0, 5182, 5210, 5291, 5291, 5185,
+ 5191, 5194, 5210, 5210, 0, 5182, 5293, 5293, 5259, 5185,
+ 5189, 5189, 5194, 5191, 0, 5241, 5189, 5189, 5210, 5189,
+ 0, 5254, 5189, 5191, 5201, 5194, 5254, 5254, 0, 5210,
+ 5201, 5201, 5189, 5201, 5279, 5194, 5201, 0, 5208, 5279,
+ 5279, 0, 5210, 5189, 5208, 5208, 5201, 5208, 5255, 0,
+ 5208, 0, 5210, 5255, 5255, 5254, 5189, 5201, 5295, 5295,
+ 5208, 5300, 5300, 5280, 5280, 0, 5189, 5200, 5200, 0,
+ 5201, 5208, 5255, 5200, 5200, 5280, 5200, 0, 5254, 5200,
+
+ 5201, 5216, 5216, 0, 5208, 5223, 5223, 5216, 5216, 5200,
+ 0, 5223, 5223, 5281, 5208, 0, 5255, 0, 5281, 5281,
+ 5200, 5303, 5303, 5216, 5281, 0, 5256, 5223, 5304, 5304,
+ 5232, 5256, 5256, 5200, 5216, 5282, 5232, 5232, 5223, 5232,
+ 5282, 5282, 5232, 5200, 5287, 5306, 5306, 5216, 5257, 5287,
+ 5287, 5223, 5232, 5257, 5257, 5307, 5307, 5216, 5219, 5219,
+ 5256, 5223, 5235, 5232, 5219, 5219, 5286, 5219, 5235, 5235,
+ 5219, 5235, 5286, 5286, 5235, 0, 5232, 5257, 5286, 0,
+ 5219, 5316, 5316, 5256, 5235, 6436, 5232, 5247, 5318, 5318,
+ 0, 5219, 0, 5247, 5247, 5235, 5247, 5258, 0, 5247,
+
+ 5257, 6436, 5258, 5258, 5219, 5289, 5251, 5251, 5235, 5247,
+ 5289, 5289, 5251, 5251, 5219, 5227, 5227, 0, 5235, 0,
+ 5247, 5227, 5227, 0, 5227, 6436, 5260, 5227, 5251, 0,
+ 5258, 5260, 5260, 5247, 5275, 5275, 0, 5227, 0, 5251,
+ 5275, 5275, 0, 5247, 5320, 5320, 5275, 0, 5227, 5294,
+ 5260, 0, 5251, 5258, 5294, 5294, 0, 5285, 5285, 0,
+ 5298, 5227, 5251, 5285, 5285, 5298, 5298, 5324, 5324, 5285,
+ 5299, 5227, 5245, 5245, 5260, 5299, 5299, 5301, 5245, 5245,
+ 5305, 5245, 5301, 5301, 5245, 0, 5305, 5305, 0, 5309,
+ 5309, 5311, 5305, 5315, 5245, 5309, 5311, 5311, 5315, 5315,
+
+ 5312, 5312, 5311, 5313, 0, 5245, 5312, 5312, 0, 5313,
+ 5313, 0, 5312, 5321, 5321, 5313, 0, 5317, 5245, 0,
+ 5322, 5322, 0, 5317, 5317, 5319, 5325, 5325, 5245, 5246,
+ 5246, 5319, 5319, 0, 5319, 5246, 5246, 5319, 5246, 5317,
+ 0, 5246, 5321, 5328, 5328, 5327, 5327, 5319, 5330, 5322,
+ 5317, 5246, 0, 5330, 5330, 5328, 5331, 5331, 5319, 5336,
+ 5336, 5332, 5246, 5317, 5334, 5321, 5332, 5332, 5327, 5334,
+ 5334, 5319, 5322, 5317, 0, 5246, 0, 5337, 0, 5328,
+ 0, 5319, 5337, 5337, 0, 5246, 5262, 5262, 5262, 5262,
+ 5262, 5327, 5262, 5262, 5262, 5262, 5262, 5262, 5262, 5262,
+
+ 5262, 5262, 5262, 5262, 5339, 5347, 5347, 5355, 5355, 5339,
+ 5339, 5340, 0, 5341, 0, 5346, 5340, 5340, 5341, 5341,
+ 5346, 5346, 5348, 5356, 5356, 0, 5262, 5348, 5348, 5358,
+ 5358, 5343, 5359, 5359, 5361, 5361, 5343, 5343, 5387, 5387,
+ 5388, 5388, 5362, 5362, 0, 5340, 0, 5341, 5343, 5262,
+ 5266, 5266, 5266, 5266, 5266, 5266, 5266, 5266, 5266, 5266,
+ 5266, 5266, 5266, 5266, 5266, 5266, 5266, 5266, 5340, 5373,
+ 5341, 5362, 5343, 0, 5373, 5373, 5385, 5385, 5390, 5390,
+ 0, 5342, 5385, 5385, 5391, 5391, 5342, 5342, 5393, 5393,
+ 5266, 0, 5349, 0, 5362, 5403, 0, 5349, 5349, 0,
+
+ 5403, 5403, 5417, 5417, 5419, 5419, 5350, 5363, 5363, 5342,
+ 5349, 5350, 5350, 5266, 5271, 5271, 5271, 5271, 5271, 5271,
+ 5271, 5271, 5271, 5271, 5271, 5271, 5271, 5271, 5271, 5271,
+ 5271, 5271, 5342, 0, 5349, 0, 5363, 5350, 5415, 5415,
+ 5423, 5423, 5424, 5424, 5415, 5415, 5365, 5365, 5429, 5429,
+ 5323, 5434, 5434, 0, 5271, 0, 5323, 5323, 5428, 5363,
+ 5350, 5430, 0, 5428, 5428, 5374, 5430, 5430, 5444, 5444,
+ 5374, 5374, 5323, 5367, 5367, 5365, 5353, 5271, 5277, 5277,
+ 5277, 5277, 5277, 5323, 5277, 5277, 5277, 5277, 5277, 5277,
+ 5277, 5277, 5277, 5277, 5277, 5277, 5323, 5353, 5365, 5374,
+
+ 0, 5367, 5450, 5450, 5432, 0, 5323, 5353, 5353, 5432,
+ 5432, 5452, 5452, 0, 5435, 0, 5366, 5366, 5277, 5435,
+ 5435, 5353, 5374, 5443, 5367, 5457, 5457, 0, 5443, 5443,
+ 5353, 5353, 5329, 5329, 0, 5394, 5394, 0, 5329, 5329,
+ 5366, 5277, 5283, 5283, 5283, 5283, 5283, 5283, 5283, 5283,
+ 5283, 5283, 5283, 5283, 5329, 5283, 5283, 5283, 5283, 5283,
+ 5364, 5364, 5445, 5366, 5394, 5329, 5455, 5445, 5445, 5458,
+ 0, 5455, 5455, 0, 5458, 5458, 5463, 5463, 5329, 5364,
+ 5468, 5468, 5283, 0, 5462, 5369, 5369, 5394, 5329, 5462,
+ 5462, 5375, 0, 5382, 5469, 5469, 5375, 5375, 5382, 5382,
+
+ 0, 5368, 5368, 5364, 5369, 5283, 5284, 5284, 5284, 5284,
+ 5284, 5284, 5284, 5284, 5284, 5284, 5284, 5284, 5284, 5284,
+ 5284, 5284, 5284, 5284, 5368, 5375, 5382, 5380, 5369, 5471,
+ 5471, 0, 5380, 5380, 0, 5447, 0, 5379, 5395, 5395,
+ 5447, 5447, 5379, 5379, 5380, 5464, 5284, 5368, 5375, 5382,
+ 5464, 5464, 5472, 5472, 5480, 5481, 5481, 5487, 5487, 5480,
+ 5480, 0, 5397, 5397, 0, 5379, 5447, 5395, 5380, 5284,
+ 5302, 5302, 5302, 5302, 5302, 5302, 5302, 5302, 5302, 5302,
+ 5302, 5302, 5302, 5302, 5302, 5302, 5302, 5302, 5379, 5447,
+ 5395, 5397, 5482, 0, 5486, 5499, 5499, 5482, 5482, 5486,
+
+ 5486, 0, 5381, 0, 5399, 5399, 5326, 5381, 5381, 0,
+ 5302, 5488, 5326, 5326, 5397, 5326, 5488, 5488, 5326, 5501,
+ 5501, 5505, 5505, 0, 5404, 5506, 5506, 0, 5326, 5404,
+ 5404, 5381, 5399, 5302, 5308, 5308, 5308, 5308, 5308, 5326,
+ 5308, 5308, 5308, 5308, 5308, 5308, 5308, 5308, 5308, 5308,
+ 5308, 5308, 5326, 0, 5381, 5399, 5511, 5511, 5404, 0,
+ 5405, 0, 5326, 5510, 0, 5405, 5405, 5383, 5510, 5510,
+ 5335, 5335, 5383, 5383, 5308, 0, 5335, 5335, 0, 5410,
+ 0, 5404, 5512, 0, 5410, 5410, 0, 5512, 5512, 0,
+ 5421, 5421, 5335, 0, 5405, 5383, 5410, 5308, 5310, 5310,
+
+ 5310, 5310, 5310, 5335, 5310, 5310, 5310, 5310, 5310, 5310,
+ 5310, 5310, 5310, 5310, 5310, 5310, 5335, 5405, 5383, 5421,
+ 5410, 5427, 5427, 5514, 5516, 5516, 5335, 0, 5514, 5514,
+ 5517, 5526, 5526, 5427, 5384, 5517, 5517, 0, 5310, 5384,
+ 5384, 5525, 5421, 5527, 5530, 5530, 5525, 5525, 5527, 5527,
+ 5531, 5531, 5533, 5533, 5412, 5534, 5534, 5427, 5384, 5412,
+ 5412, 5310, 5314, 5314, 5314, 5314, 5314, 5314, 5314, 5314,
+ 5314, 5314, 5314, 5314, 5314, 5314, 5314, 5314, 5314, 5314,
+ 5396, 5396, 5384, 5338, 5338, 5401, 5401, 5412, 5476, 5476,
+ 0, 5345, 5338, 5557, 5557, 5338, 0, 5345, 5345, 5396,
+
+ 5345, 0, 5314, 5345, 5401, 5338, 0, 5476, 5357, 0,
+ 5412, 0, 5360, 5345, 5357, 5357, 5338, 5357, 5360, 5360,
+ 5357, 5400, 5400, 5396, 5345, 5314, 5333, 5333, 5401, 5338,
+ 5357, 5476, 5333, 5333, 5360, 5333, 0, 5345, 5333, 5338,
+ 0, 5357, 5558, 5558, 5400, 5360, 5440, 5345, 5333, 5398,
+ 5398, 5440, 5440, 0, 5357, 5372, 5372, 0, 5360, 5333,
+ 0, 5372, 5372, 5440, 5357, 5411, 0, 5400, 5360, 5377,
+ 5411, 5411, 5333, 5398, 0, 5377, 5377, 5372, 5377, 0,
+ 5386, 5377, 5333, 5344, 5344, 5386, 5386, 5440, 5372, 5344,
+ 5344, 5377, 5344, 0, 5411, 5344, 5398, 5378, 5378, 0,
+
+ 5389, 5372, 5377, 5378, 5378, 5344, 5389, 5389, 5386, 5389,
+ 0, 5372, 5389, 5560, 5560, 5377, 5344, 5411, 0, 5378,
+ 5555, 5555, 5389, 5561, 5561, 5377, 5555, 5555, 0, 5344,
+ 5378, 5386, 0, 5389, 5426, 5426, 5584, 5584, 0, 5344,
+ 5351, 5351, 5409, 5378, 5586, 5586, 5389, 5409, 5409, 5413,
+ 5474, 5474, 0, 5378, 5413, 5413, 5389, 5426, 5585, 5351,
+ 5351, 5351, 5351, 5585, 5585, 5351, 0, 5351, 0, 5392,
+ 5409, 5351, 5351, 5351, 5351, 5392, 5392, 5413, 5474, 0,
+ 5426, 5402, 5402, 5351, 5351, 5351, 5351, 5402, 5402, 5351,
+ 5351, 5392, 0, 5409, 5351, 5351, 5351, 5351, 5376, 5376,
+
+ 5413, 5474, 5392, 5402, 5376, 5376, 0, 5376, 5587, 5587,
+ 5376, 5414, 5407, 0, 5402, 5392, 5414, 5414, 5407, 5407,
+ 5376, 5407, 5479, 5479, 5407, 5392, 0, 5402, 5422, 5422,
+ 0, 5376, 0, 5495, 5407, 5414, 0, 5402, 5495, 5495,
+ 0, 5408, 5408, 0, 5376, 5407, 5588, 5408, 5408, 0,
+ 5479, 5588, 5588, 0, 5376, 5406, 5406, 5422, 5407, 5414,
+ 0, 5406, 5406, 5408, 5406, 5416, 5495, 5406, 5407, 5418,
+ 5416, 5416, 5420, 5479, 5408, 5418, 5418, 5406, 5420, 5420,
+ 5422, 5589, 5589, 5590, 5590, 5453, 5453, 5408, 5406, 5495,
+ 5437, 5418, 0, 5416, 5420, 5437, 5437, 5408, 5438, 0,
+
+ 5425, 5406, 5418, 5438, 5438, 5420, 5425, 5425, 0, 5454,
+ 5454, 5406, 5436, 5436, 5453, 5418, 5416, 0, 5420, 0,
+ 5431, 5431, 5425, 0, 5437, 5418, 5431, 5431, 5420, 5433,
+ 5433, 0, 5438, 5425, 5436, 5433, 5433, 5453, 5454, 5475,
+ 5475, 0, 5431, 5439, 0, 5436, 5425, 5437, 5439, 5439,
+ 0, 5433, 0, 5431, 5446, 5438, 5425, 0, 5436, 5446,
+ 5446, 5454, 5433, 5475, 5466, 0, 5431, 0, 5436, 5466,
+ 5466, 5439, 5446, 5441, 5441, 5433, 5431, 5442, 0, 5441,
+ 5441, 5449, 0, 5442, 5442, 5433, 5475, 5449, 5449, 5591,
+ 5591, 0, 5466, 0, 5439, 5441, 5446, 0, 5451, 5442,
+
+ 5478, 5478, 5460, 5449, 5451, 5451, 5441, 5460, 5460, 0,
+ 5442, 5461, 5594, 5594, 5449, 5466, 5461, 5461, 0, 5441,
+ 5451, 5595, 5595, 5442, 5478, 5597, 5597, 5449, 0, 5441,
+ 0, 5451, 0, 5442, 5456, 5456, 5460, 5449, 5509, 5509,
+ 5456, 5456, 5459, 5459, 5451, 5461, 0, 5478, 5459, 5459,
+ 5509, 5465, 5465, 0, 5451, 5467, 5456, 5465, 5465, 5460,
+ 5467, 5467, 5477, 5477, 5459, 5598, 5598, 5456, 5461, 5961,
+ 5470, 0, 5467, 5465, 5509, 5459, 5470, 5470, 0, 5473,
+ 5456, 0, 5503, 5503, 5465, 5473, 5473, 5485, 5459, 5961,
+ 5456, 5477, 5470, 5485, 5485, 0, 5467, 5465, 5459, 5483,
+
+ 5483, 5473, 0, 5470, 0, 5483, 5483, 5465, 0, 5485,
+ 0, 5503, 5473, 5961, 5477, 0, 5470, 5484, 5484, 0,
+ 5485, 5483, 5593, 5484, 5484, 5473, 5470, 5593, 5593, 5605,
+ 5605, 5490, 5483, 5485, 5503, 5473, 5490, 5490, 6290, 5484,
+ 5609, 5609, 0, 5485, 0, 5483, 5489, 5489, 5504, 5504,
+ 5484, 5491, 5489, 5489, 5494, 5483, 5491, 5491, 6290, 5494,
+ 5494, 5508, 5508, 5484, 5493, 5490, 5492, 0, 5489, 5493,
+ 5493, 5492, 5492, 5484, 0, 5496, 0, 5504, 0, 5489,
+ 5496, 5496, 6290, 5494, 5508, 5491, 5540, 5540, 5490, 5497,
+ 5492, 5529, 5489, 0, 5497, 5497, 5529, 5529, 5493, 0,
+
+ 5504, 0, 5489, 5496, 0, 5500, 5494, 5508, 5491, 5502,
+ 5540, 5500, 5500, 5497, 5492, 5502, 5502, 5507, 5614, 5614,
+ 0, 5493, 5529, 5507, 5507, 0, 5496, 5500, 5623, 5623,
+ 0, 5502, 0, 5540, 5513, 5513, 0, 5497, 5500, 5507,
+ 5513, 5513, 5502, 5538, 5538, 5529, 5515, 5515, 5518, 5518,
+ 5507, 5500, 5515, 5515, 5519, 5502, 5513, 5625, 5625, 5519,
+ 5519, 5500, 5538, 5507, 0, 5502, 5520, 5513, 5515, 5521,
+ 5518, 5520, 5520, 5507, 5521, 5521, 5626, 5626, 5522, 5515,
+ 5513, 5518, 0, 5522, 5522, 0, 5538, 0, 5519, 0,
+ 5513, 0, 5515, 0, 5518, 5522, 0, 5521, 5536, 5536,
+
+ 5520, 0, 5515, 5524, 5518, 0, 5523, 5523, 5532, 5524,
+ 5524, 5519, 5523, 5523, 5532, 5532, 5528, 5537, 5537, 5522,
+ 5521, 5528, 5528, 5520, 0, 5524, 0, 5536, 5523, 0,
+ 5532, 0, 5542, 5542, 5528, 0, 5524, 0, 5535, 5523,
+ 0, 5532, 5541, 5541, 5535, 5535, 5537, 5539, 5539, 5524,
+ 5536, 5550, 5523, 0, 5532, 5542, 5550, 5550, 5528, 5524,
+ 5535, 0, 5523, 0, 5532, 0, 5543, 5543, 5550, 5537,
+ 5541, 5535, 0, 5544, 5544, 0, 5539, 5545, 5542, 5544,
+ 5544, 5546, 5545, 5545, 5535, 5543, 5546, 5546, 5627, 5627,
+ 5547, 5547, 5550, 5541, 5535, 5544, 5547, 5547, 5548, 5539,
+
+ 5635, 5635, 5549, 0, 5548, 5548, 5544, 5549, 5549, 5543,
+ 0, 5545, 5547, 5637, 5637, 5546, 5551, 5638, 5638, 5544,
+ 5548, 5551, 5551, 5547, 5639, 5639, 0, 5552, 0, 5544,
+ 5549, 5548, 5552, 5552, 5545, 5553, 5547, 5554, 5546, 0,
+ 5553, 5553, 5554, 5554, 5548, 5551, 5547, 5563, 5563, 0,
+ 5556, 5559, 0, 5549, 5548, 5556, 5556, 5559, 5559, 5562,
+ 5552, 5554, 0, 5553, 0, 5562, 5562, 0, 5551, 5564,
+ 5564, 5565, 5565, 5559, 5566, 5566, 5563, 0, 5556, 5569,
+ 5569, 5562, 0, 5552, 5559, 5554, 5553, 5567, 5567, 0,
+ 5565, 0, 5562, 0, 5568, 5568, 0, 5559, 5564, 5563,
+
+ 0, 5556, 5569, 5566, 0, 5562, 0, 5559, 5570, 5570,
+ 0, 5567, 5641, 5641, 5565, 5562, 0, 5571, 5571, 5642,
+ 5642, 5564, 5568, 5571, 5571, 5569, 5566, 5570, 5645, 5645,
+ 5572, 0, 5573, 0, 5567, 5572, 5572, 5573, 5573, 5571,
+ 5650, 5650, 5656, 5656, 0, 5568, 5574, 5574, 5575, 0,
+ 5571, 5570, 5574, 5574, 5575, 5575, 5576, 5660, 5660, 5661,
+ 5661, 5576, 5576, 5571, 5572, 0, 5573, 0, 5574, 5577,
+ 5575, 5578, 0, 5571, 5577, 5577, 5578, 5578, 0, 5574,
+ 0, 5575, 5662, 5662, 5576, 5579, 5577, 5572, 0, 5573,
+ 5579, 5579, 5574, 5580, 5575, 5665, 5665, 0, 5580, 5580,
+
+ 5578, 0, 5574, 5581, 5575, 5582, 5582, 5576, 5581, 5581,
+ 5577, 5582, 5582, 0, 5583, 5669, 5669, 0, 5579, 5583,
+ 5583, 5580, 0, 5578, 5599, 0, 5600, 5581, 5601, 5599,
+ 5599, 5600, 5600, 5601, 5601, 5672, 5672, 5673, 5673, 0,
+ 5602, 5579, 5583, 5603, 5580, 5602, 5602, 5604, 5603, 5603,
+ 5606, 5581, 5604, 5604, 5607, 5606, 5606, 5608, 0, 5607,
+ 5607, 5610, 5608, 5608, 5612, 5583, 5610, 5610, 5613, 5612,
+ 5612, 5615, 0, 5613, 5613, 5617, 5615, 5615, 5618, 0,
+ 5617, 5617, 5619, 5618, 5618, 5620, 0, 5619, 5619, 0,
+ 5620, 5620, 5628, 5628, 0, 5628, 5630, 0, 5633, 5628,
+
+ 5634, 5630, 5630, 5633, 5633, 5634, 5634, 5636, 5640, 5675,
+ 5675, 0, 5636, 5636, 5640, 5640, 5643, 5640, 5676, 5676,
+ 5640, 5644, 5643, 5643, 5646, 5643, 5644, 5644, 5643, 5646,
+ 5646, 5647, 5647, 5679, 5679, 0, 5648, 5647, 5647, 5649,
+ 5647, 5648, 5648, 5647, 5649, 5649, 5651, 5652, 5652, 5685,
+ 5685, 5651, 5651, 0, 5653, 5653, 5652, 0, 5654, 5652,
+ 5653, 5653, 0, 5653, 5654, 5654, 5653, 5654, 5655, 0,
+ 5654, 5657, 5659, 5655, 5655, 0, 5657, 5657, 5659, 5659,
+ 5663, 5659, 5664, 0, 5659, 5663, 5663, 5664, 5664, 5666,
+ 5667, 5667, 5689, 5689, 5666, 5666, 5667, 5667, 5668, 5667,
+
+ 5670, 0, 5667, 5668, 5668, 5670, 5670, 5671, 5671, 5690,
+ 5690, 5674, 0, 5671, 5671, 5677, 5671, 5674, 5674, 5671,
+ 5674, 5677, 5677, 5674, 5677, 5678, 0, 5677, 5680, 0,
+ 5678, 5678, 5684, 5680, 5680, 5681, 5681, 5684, 5684, 5682,
+ 5682, 5681, 5681, 5683, 5681, 5682, 5682, 5681, 5682, 5683,
+ 5683, 5682, 5683, 5686, 0, 5683, 5687, 0, 5686, 5686,
+ 5692, 5687, 5687, 5691, 5691, 0, 5692, 5692, 0, 5692,
+ 5693, 5693, 5692, 5694, 5694, 5695, 5697, 5697, 5702, 5702,
+ 5696, 5695, 5695, 5698, 5695, 5696, 5696, 5695, 5698, 5698,
+ 5699, 5699, 5708, 5708, 0, 5700, 5699, 5699, 5701, 5699,
+
+ 5700, 5700, 5699, 5701, 5701, 5703, 5704, 5704, 5710, 5710,
+ 5703, 5703, 0, 5705, 5705, 5704, 0, 5706, 5704, 5705,
+ 5705, 0, 5705, 5706, 5706, 5705, 5706, 5707, 0, 5706,
+ 5709, 0, 5707, 5707, 5712, 5709, 5709, 5711, 5711, 0,
+ 5712, 5712, 0, 5712, 5713, 5713, 5712, 5714, 5714, 5715,
+ 5715, 5716, 5717, 5717, 5719, 5719, 5716, 5716, 5717, 5717,
+ 5718, 5717, 5720, 5720, 5717, 0, 5718, 5718, 5721, 5718,
+ 5722, 5722, 5718, 0, 5721, 5721, 0, 5721, 5723, 5723,
+ 5721, 5724, 5724, 5725, 5726, 5726, 5728, 5728, 5725, 5725,
+ 5726, 5726, 5727, 5726, 5729, 5729, 5726, 0, 5727, 5727,
+
+ 0, 5727, 5730, 5730, 5727, 5731, 5731, 5732, 5732, 5734,
+ 5734, 5735, 5735, 5736, 5736, 5738, 5738, 5739, 5740, 5740,
+ 5741, 0, 5739, 5739, 5742, 5741, 5741, 5743, 0, 5742,
+ 5742, 5745, 5743, 5743, 5744, 5744, 5745, 5745, 5747, 0,
+ 5748, 5749, 5749, 5747, 5747, 5748, 5748, 5750, 5753, 5753,
+ 5754, 5754, 5750, 5750, 5751, 5751, 5751, 5751, 5751, 5751,
+ 5751, 5751, 5751, 5751, 5751, 5751, 5751, 5751, 5751, 5751,
+ 5751, 5751, 5752, 5755, 5755, 5756, 5756, 5752, 5752, 5757,
+ 5757, 5758, 5758, 5759, 5760, 5760, 5761, 0, 5759, 5759,
+ 5762, 5761, 5761, 5763, 5751, 5762, 5762, 5765, 5763, 5763,
+
+ 5764, 5764, 5765, 5765, 5767, 5768, 5768, 5769, 0, 5767,
+ 5767, 0, 5769, 5769, 5770, 5770, 5771, 5751, 5779, 5779,
+ 0, 5771, 5771, 5773, 5773, 5773, 5773, 5773, 5773, 5773,
+ 5773, 5773, 5773, 5773, 5773, 0, 5773, 5773, 5773, 5773,
+ 5773, 5781, 5781, 5782, 5782, 5783, 5785, 5785, 5790, 5790,
+ 0, 5783, 5783, 5791, 5791, 5793, 5793, 5783, 5795, 5795,
+ 5797, 5797, 0, 5773, 5802, 5802, 5803, 5803, 5808, 5808,
+ 5819, 5819, 0, 5801, 5801, 5807, 5798, 5798, 5799, 5799,
+ 5807, 5807, 0, 5800, 5800, 5801, 5773, 5774, 5774, 5774,
+ 5774, 5774, 5774, 5774, 5774, 5774, 5774, 5774, 5774, 5774,
+
+ 5774, 5774, 5774, 5774, 5774, 5798, 5800, 5799, 0, 5801,
+ 5810, 0, 5804, 5804, 0, 5810, 5810, 5821, 5821, 0,
+ 5805, 5805, 5823, 5823, 0, 5804, 0, 5774, 5798, 5800,
+ 5799, 5827, 5827, 5828, 5828, 5834, 5834, 5839, 5839, 5814,
+ 0, 5789, 5824, 5824, 5814, 5814, 5805, 5789, 5789, 5804,
+ 5774, 5776, 5776, 5776, 5776, 5776, 5776, 5776, 5776, 5776,
+ 5776, 5776, 5776, 5789, 5776, 5776, 5776, 5776, 5776, 5805,
+ 5814, 5824, 5833, 0, 5789, 5835, 0, 5833, 5833, 5837,
+ 5835, 5835, 0, 5811, 5837, 5837, 0, 5789, 5811, 5811,
+ 0, 5776, 0, 5814, 5824, 5812, 0, 5789, 5840, 0,
+
+ 5812, 5812, 5817, 5840, 5840, 5850, 5850, 5817, 5817, 5854,
+ 5854, 5811, 5812, 0, 5776, 5777, 5777, 5777, 5777, 5777,
+ 5777, 5777, 5777, 5777, 5777, 5777, 5777, 5777, 5777, 5777,
+ 5777, 5777, 5777, 5813, 5811, 5817, 5812, 5842, 5813, 5813,
+ 5855, 5855, 5842, 5842, 5849, 5825, 5825, 5818, 0, 5849,
+ 5849, 5813, 5818, 5818, 5851, 5777, 5857, 5857, 5817, 5851,
+ 5851, 5858, 5858, 0, 5843, 5831, 5831, 5860, 5860, 5843,
+ 5843, 5861, 5861, 0, 5825, 5813, 5818, 5831, 5777, 5778,
+ 5778, 5778, 5778, 5778, 5778, 5778, 5778, 5778, 5778, 5778,
+ 5778, 5778, 5778, 5778, 5778, 5778, 5778, 5825, 5843, 5818,
+
+ 5861, 5831, 5870, 5885, 5885, 5844, 0, 5870, 5870, 0,
+ 5844, 5844, 5845, 5886, 5886, 5830, 5830, 5845, 5845, 5778,
+ 0, 5843, 0, 5861, 5846, 5882, 5882, 5888, 5888, 5846,
+ 5846, 5882, 5882, 5890, 5890, 5862, 5862, 0, 5830, 5844,
+ 5845, 5846, 5778, 5784, 5784, 5784, 5784, 5784, 5784, 5784,
+ 5784, 5784, 5784, 5784, 5784, 5784, 5784, 5784, 5784, 5784,
+ 5784, 5830, 5844, 5845, 5862, 5846, 5887, 5893, 5893, 5892,
+ 5892, 0, 5887, 5887, 5853, 5892, 5896, 5896, 5887, 5853,
+ 5853, 5897, 5897, 5784, 5852, 0, 5901, 5862, 0, 5852,
+ 5852, 5901, 5901, 5902, 5902, 5910, 5910, 5794, 5911, 5911,
+
+ 5864, 5864, 5852, 5794, 5794, 5853, 5784, 5786, 5786, 5786,
+ 5786, 5786, 5786, 5786, 5786, 5786, 5786, 5786, 5786, 5794,
+ 5786, 5786, 5786, 5786, 5786, 0, 5852, 5904, 5853, 5864,
+ 5794, 5905, 5904, 5904, 5906, 5906, 5905, 5905, 5866, 5866,
+ 5906, 5906, 0, 5794, 5912, 5912, 5906, 5786, 5907, 5863,
+ 5863, 5913, 5864, 5794, 5907, 5907, 5913, 5913, 5914, 5914,
+ 5907, 5918, 5918, 5922, 5922, 0, 5866, 0, 5863, 5922,
+ 5786, 5787, 5787, 5787, 5787, 5787, 5787, 5787, 5787, 5787,
+ 5787, 5787, 5787, 5787, 5787, 5787, 5787, 5787, 5787, 5866,
+ 5792, 5796, 5863, 5865, 5865, 0, 5792, 5792, 0, 5792,
+
+ 5796, 0, 5792, 5796, 5867, 5867, 5868, 5868, 5806, 5806,
+ 0, 5787, 5792, 5796, 5806, 5806, 0, 5865, 5924, 5924,
+ 5930, 5930, 5820, 5792, 5796, 5868, 5877, 5867, 5820, 5820,
+ 5806, 5877, 5877, 5915, 5787, 0, 5792, 5796, 5915, 5915,
+ 5865, 5806, 0, 5877, 5820, 0, 5792, 5796, 0, 5868,
+ 5867, 5816, 5931, 5931, 5806, 5820, 5916, 5816, 5816, 0,
+ 5816, 5916, 5916, 5816, 5806, 5815, 5815, 5877, 5820, 0,
+ 5878, 5815, 5815, 5816, 5815, 5878, 5878, 5815, 5820, 5822,
+ 5933, 5933, 0, 5826, 5816, 5822, 5822, 5815, 5822, 5826,
+ 5826, 5822, 5935, 5935, 5937, 5937, 0, 5816, 5815, 5878,
+
+ 0, 5822, 5942, 5942, 5871, 5826, 0, 5816, 5829, 5871,
+ 5871, 5815, 5822, 5872, 5829, 5829, 5826, 5829, 5872, 5872,
+ 5829, 5815, 5878, 5943, 5943, 5822, 5832, 5832, 0, 5826,
+ 5829, 5881, 5832, 5832, 0, 5822, 5881, 5881, 5871, 5826,
+ 0, 5829, 5948, 5948, 5917, 5838, 5838, 5872, 5832, 5917,
+ 5917, 5838, 5838, 0, 5829, 5881, 0, 5876, 0, 5832,
+ 0, 5871, 5876, 5876, 5829, 5841, 5841, 5838, 5963, 5963,
+ 5872, 0, 5832, 0, 5841, 5919, 0, 5841, 5838, 5881,
+ 5919, 5919, 5832, 5836, 5836, 5876, 0, 5841, 5920, 5836,
+ 5836, 5838, 5836, 5920, 5920, 5836, 0, 5848, 5841, 5989,
+
+ 5989, 5838, 0, 5848, 5848, 5836, 5848, 0, 5876, 5848,
+ 0, 5841, 5879, 5938, 5938, 0, 5836, 5879, 5879, 5848,
+ 0, 5841, 5926, 0, 5941, 5941, 5856, 5926, 5926, 5836,
+ 5848, 0, 5856, 5856, 0, 5856, 5941, 0, 5856, 5836,
+ 5847, 5847, 5938, 5848, 5859, 5879, 5847, 5847, 5856, 5847,
+ 5859, 5859, 5847, 5848, 0, 5939, 5939, 0, 5947, 5856,
+ 5941, 0, 5847, 5947, 5947, 5938, 5859, 0, 5879, 5869,
+ 5869, 0, 5856, 5847, 5950, 5869, 5869, 5859, 0, 5950,
+ 5950, 0, 5856, 0, 5939, 0, 5847, 0, 5875, 5875,
+ 5859, 5869, 0, 5958, 5875, 5875, 5847, 5874, 5958, 5958,
+
+ 5859, 0, 5869, 5874, 5874, 0, 5874, 5939, 5957, 5874,
+ 5875, 5880, 0, 5957, 5957, 5869, 5880, 5880, 5883, 5874,
+ 0, 5875, 5958, 5883, 5883, 5869, 5873, 5873, 5940, 5940,
+ 5874, 0, 5873, 5873, 5875, 5873, 5944, 5944, 5873, 5880,
+ 0, 5957, 0, 5874, 5875, 5958, 5883, 0, 5873, 5944,
+ 0, 5940, 0, 5874, 5945, 5945, 5967, 5967, 0, 5873,
+ 5952, 5973, 5880, 0, 5957, 5952, 5952, 5973, 5973, 5883,
+ 6012, 6012, 5873, 5944, 5940, 5964, 5964, 5952, 0, 5967,
+ 5945, 0, 5873, 5884, 5884, 5884, 5884, 5884, 5884, 5884,
+ 5884, 5884, 5884, 5884, 5884, 5884, 5884, 5884, 5884, 5884,
+
+ 5884, 5952, 5967, 5945, 5964, 5984, 5984, 5986, 5986, 6013,
+ 6013, 5984, 5984, 5986, 5986, 0, 5951, 6015, 6015, 5908,
+ 5908, 5951, 5951, 5884, 5953, 6017, 6017, 5964, 5908, 5953,
+ 5953, 5908, 0, 5968, 5968, 6023, 6023, 6024, 6024, 5965,
+ 5965, 5908, 5953, 0, 5951, 5968, 5884, 5889, 5889, 5889,
+ 5889, 5889, 5908, 5889, 5889, 5889, 5889, 5889, 5889, 5889,
+ 5889, 5889, 5889, 5889, 5889, 5908, 5953, 5951, 5965, 5968,
+ 5999, 6028, 6028, 6008, 6008, 5908, 5999, 5999, 5954, 6008,
+ 6008, 6039, 6039, 5954, 5954, 6041, 6041, 5889, 6010, 6010,
+ 0, 5965, 6027, 0, 6010, 6010, 0, 6027, 6027, 6045,
+
+ 6045, 5929, 5970, 5970, 0, 5969, 5969, 5929, 5929, 5954,
+ 5889, 5894, 5894, 5894, 5894, 5894, 5894, 5894, 5894, 5894,
+ 5894, 5894, 5894, 5929, 5894, 5894, 5894, 5894, 5894, 5969,
+ 5970, 6030, 5954, 0, 5929, 0, 6030, 6030, 0, 5981,
+ 6046, 6046, 6051, 6051, 5981, 5981, 0, 5929, 5971, 5971,
+ 0, 5894, 5969, 5970, 5972, 5972, 6050, 5929, 6052, 6056,
+ 6056, 6050, 6050, 6052, 6052, 0, 5990, 5990, 6066, 6066,
+ 5981, 5971, 0, 5972, 5894, 5895, 5895, 5895, 5895, 5895,
+ 5895, 5895, 5895, 5895, 5895, 5895, 5895, 5895, 5895, 5895,
+ 5895, 5895, 5895, 5981, 5971, 5990, 5979, 5972, 6054, 0,
+
+ 6057, 5979, 5979, 6054, 6054, 6057, 6057, 6070, 6070, 6071,
+ 6071, 5974, 5974, 5979, 6065, 5895, 6067, 0, 5990, 6065,
+ 6065, 6067, 6067, 6073, 6073, 6074, 6074, 6098, 6098, 5934,
+ 0, 5991, 5991, 0, 5974, 5934, 5934, 5979, 5895, 5898,
+ 5898, 5898, 5898, 5898, 5898, 5898, 5898, 5898, 5898, 5898,
+ 5898, 5934, 5898, 5898, 5898, 5898, 5898, 5974, 5994, 5994,
+ 5991, 0, 5934, 6099, 6099, 0, 6095, 6095, 6101, 6101,
+ 5994, 5978, 6095, 6095, 0, 5934, 5978, 5978, 0, 5898,
+ 6103, 6103, 5980, 5991, 0, 5934, 0, 5980, 5980, 6109,
+ 6109, 6110, 6110, 0, 5994, 6114, 6114, 5996, 5996, 5978,
+
+ 5980, 0, 5898, 5899, 5899, 5899, 5899, 5899, 5899, 5899,
+ 5899, 5899, 5899, 5899, 5899, 5899, 5899, 5899, 5899, 5899,
+ 5899, 6113, 5978, 6116, 5980, 5996, 6113, 6113, 6116, 6116,
+ 6167, 6167, 6005, 0, 5982, 6169, 6169, 6005, 6005, 5982,
+ 5982, 5983, 0, 5899, 5987, 6134, 5983, 5983, 5996, 5987,
+ 5987, 6134, 6134, 6142, 6142, 6171, 6171, 6177, 6177, 6142,
+ 6142, 0, 5982, 6005, 5987, 5983, 5899, 5900, 5900, 5900,
+ 5900, 5900, 5900, 5900, 5900, 5900, 5900, 5900, 5900, 5900,
+ 5900, 5900, 5900, 5900, 5900, 5982, 6005, 6172, 5987, 5983,
+ 6022, 6022, 6172, 6172, 6144, 6144, 6181, 6181, 0, 5985,
+
+ 6144, 6144, 6022, 5932, 5985, 5985, 0, 5900, 0, 5932,
+ 5932, 6155, 5932, 6163, 6163, 5932, 6173, 6155, 6155, 6163,
+ 6163, 6173, 6173, 6019, 6019, 5932, 6022, 5985, 5993, 5993,
+ 5900, 5921, 5921, 5921, 5921, 5921, 5932, 5921, 5921, 5921,
+ 5921, 5921, 5921, 5921, 5921, 5921, 5921, 5921, 5921, 5932,
+ 5985, 5993, 6019, 0, 6165, 6165, 0, 6174, 0, 5932,
+ 6165, 6165, 6174, 6174, 6182, 6182, 5995, 5995, 5997, 5997,
+ 0, 5921, 6176, 0, 5993, 6019, 6179, 6176, 6176, 6180,
+ 0, 6179, 6179, 0, 6180, 6180, 6183, 6183, 6020, 6020,
+ 5995, 5997, 6000, 6000, 5921, 5923, 5923, 5923, 5923, 5923,
+
+ 5923, 5923, 5923, 5923, 5923, 5923, 5923, 5923, 5923, 5923,
+ 5923, 5923, 5923, 5995, 5997, 6000, 6003, 6020, 6184, 6184,
+ 0, 6003, 6003, 6185, 6185, 0, 6002, 6186, 6186, 6188,
+ 6188, 6002, 6002, 6003, 0, 5923, 5998, 5998, 6000, 0,
+ 6020, 6187, 0, 6025, 6025, 6189, 6187, 6187, 6192, 6192,
+ 6189, 6189, 6026, 6026, 6002, 5998, 6025, 6003, 5923, 5925,
+ 5925, 5925, 5925, 5925, 5925, 5925, 5925, 5925, 5925, 5925,
+ 5925, 5925, 5925, 5925, 5925, 5925, 5925, 6002, 6026, 5998,
+ 6025, 6049, 6049, 6190, 0, 6191, 6195, 6195, 6190, 6190,
+ 6191, 6191, 0, 6049, 6196, 6196, 0, 6007, 0, 5925,
+
+ 6004, 6026, 6007, 6007, 0, 6004, 6004, 6198, 6198, 0,
+ 6034, 6199, 6199, 5946, 5946, 6034, 6034, 6049, 6004, 5946,
+ 5946, 6007, 5925, 5927, 5927, 5927, 5927, 5927, 5927, 5927,
+ 5927, 5927, 5927, 5927, 5927, 5946, 5927, 5927, 5927, 5927,
+ 5927, 6034, 6004, 6200, 6200, 6007, 5946, 6193, 0, 6037,
+ 6202, 6202, 6193, 6193, 6037, 6037, 6006, 6203, 6203, 5946,
+ 0, 6006, 6006, 5927, 6034, 6011, 0, 6194, 6197, 5946,
+ 6011, 6011, 6194, 6194, 6197, 6197, 0, 6197, 6205, 6205,
+ 6197, 0, 6037, 0, 6006, 6011, 5927, 5928, 5928, 5928,
+ 5928, 5928, 5928, 5928, 5928, 5928, 5928, 5928, 5928, 5928,
+
+ 5928, 5928, 5928, 5928, 5928, 6037, 5936, 6006, 6009, 6011,
+ 5956, 6210, 6210, 6009, 6009, 5936, 5956, 5956, 5936, 5956,
+ 6032, 0, 5956, 6081, 6081, 6032, 6032, 5928, 5936, 0,
+ 6021, 6021, 5956, 6211, 6211, 5962, 6009, 6032, 5966, 5936,
+ 0, 5962, 5962, 5956, 5966, 5966, 6212, 6212, 0, 6031,
+ 5928, 6081, 5936, 6021, 6031, 6031, 5956, 5962, 0, 6009,
+ 5966, 6032, 5936, 5955, 5955, 0, 5956, 0, 5962, 5955,
+ 5955, 5966, 5955, 6062, 6081, 5955, 6021, 6031, 6062, 6062,
+ 5988, 5962, 5977, 5977, 5966, 5955, 5988, 5988, 5977, 5977,
+ 6062, 5962, 6033, 0, 5966, 0, 5955, 6033, 6033, 5992,
+
+ 6031, 0, 5988, 0, 5977, 5992, 5992, 6080, 6080, 5955,
+ 6033, 6001, 6001, 5988, 6062, 5977, 0, 6001, 6001, 5955,
+ 0, 5992, 6043, 6043, 6038, 0, 5988, 0, 5977, 6038,
+ 6038, 6080, 5992, 6001, 6033, 0, 5988, 6018, 5977, 0,
+ 6014, 0, 6016, 0, 6001, 5992, 6014, 6014, 6016, 6016,
+ 0, 6043, 0, 6038, 6080, 5992, 0, 6001, 0, 6018,
+ 6044, 6044, 6014, 0, 6016, 0, 6204, 6001, 6048, 6048,
+ 6018, 6204, 6204, 6014, 6043, 6016, 6038, 0, 6035, 6035,
+ 0, 6076, 6076, 6018, 6035, 6035, 6014, 0, 6016, 6044,
+ 0, 6048, 0, 6018, 0, 6036, 6014, 6040, 6016, 6042,
+
+ 6035, 6036, 6036, 6040, 6040, 6042, 6042, 6214, 6214, 0,
+ 6076, 6035, 6044, 0, 6048, 0, 6047, 6036, 0, 6040,
+ 6059, 6042, 6047, 6047, 6035, 6059, 6059, 0, 6036, 0,
+ 6040, 6207, 6042, 6076, 6035, 0, 6207, 6207, 6047, 6077,
+ 6077, 6036, 6060, 6040, 0, 6042, 0, 6060, 6060, 6047,
+ 0, 6036, 0, 6040, 6059, 6042, 0, 6053, 6053, 6055,
+ 6055, 0, 6047, 6053, 6053, 6055, 6055, 0, 6077, 6215,
+ 6215, 0, 6047, 6058, 6058, 0, 6060, 6059, 6091, 6053,
+ 6061, 6055, 0, 6091, 6091, 6061, 6061, 6063, 6063, 0,
+ 6053, 6077, 6055, 6063, 6063, 6058, 6068, 6112, 6112, 6060,
+
+ 0, 6068, 6068, 6053, 6064, 6055, 6058, 6091, 6061, 6063,
+ 6064, 6064, 0, 6053, 6068, 6055, 6069, 0, 6072, 6058,
+ 6063, 6069, 6069, 6112, 6072, 6072, 6064, 6079, 6079, 6058,
+ 6091, 6061, 0, 6063, 0, 6075, 0, 6064, 6068, 0,
+ 6072, 6075, 6075, 6063, 6078, 6078, 6112, 6069, 6082, 6082,
+ 6064, 6072, 0, 6083, 6083, 0, 6079, 6075, 6218, 6218,
+ 6064, 6085, 0, 6078, 6072, 0, 6085, 6085, 6075, 0,
+ 6069, 6082, 6083, 0, 6072, 0, 6084, 6084, 0, 6079,
+ 6086, 6075, 6084, 6084, 6089, 6086, 6086, 6078, 0, 6089,
+ 6089, 6075, 0, 6088, 6082, 6085, 6083, 0, 6084, 6088,
+
+ 6088, 6087, 6087, 0, 6105, 6105, 0, 6087, 6087, 6084,
+ 0, 6090, 6089, 0, 6086, 6088, 6090, 6090, 6085, 6106,
+ 6106, 0, 6084, 6087, 0, 6092, 6088, 0, 6090, 0,
+ 6092, 6092, 6084, 6105, 6087, 6089, 6093, 6086, 6094, 6088,
+ 6096, 6093, 6093, 6094, 6094, 6096, 6096, 6087, 6106, 6088,
+ 6097, 6097, 6090, 6223, 6223, 0, 6105, 6087, 6092, 6107,
+ 6107, 0, 6094, 0, 6093, 0, 6104, 6100, 6096, 0,
+ 6102, 6106, 6097, 6100, 6100, 0, 6102, 6102, 6108, 6108,
+ 0, 6092, 6107, 6097, 6111, 6111, 6094, 6093, 6104, 6100,
+ 6108, 6096, 6102, 6229, 6229, 0, 6097, 6111, 0, 6104,
+
+ 6100, 0, 6117, 6102, 6120, 6107, 6097, 6117, 6117, 6120,
+ 6120, 0, 6104, 6100, 6108, 0, 6102, 6231, 6231, 6118,
+ 0, 6111, 6104, 6100, 6118, 6118, 6102, 6119, 6232, 6232,
+ 6117, 0, 6119, 6119, 6122, 6120, 6118, 6121, 6121, 0,
+ 6122, 6122, 6123, 6121, 6121, 6119, 0, 6123, 6123, 6124,
+ 6126, 6126, 0, 6117, 6124, 6124, 6122, 0, 6120, 6121,
+ 6118, 0, 6127, 6127, 6128, 6128, 6125, 6122, 0, 6119,
+ 6121, 0, 6125, 6125, 0, 6123, 6130, 6130, 6124, 6126,
+ 6122, 6131, 6131, 6121, 6129, 6129, 0, 6128, 6125, 0,
+ 6122, 6127, 0, 6121, 6132, 6132, 6129, 0, 6123, 6125,
+
+ 6130, 6124, 6126, 6135, 6135, 6133, 6133, 6234, 6234, 6131,
+ 6128, 0, 6125, 6136, 6127, 6235, 6235, 6132, 6136, 6136,
+ 6129, 0, 6125, 6130, 6133, 6137, 6135, 0, 6138, 0,
+ 6137, 6137, 6131, 6138, 6138, 0, 6147, 6147, 6139, 0,
+ 6132, 6136, 6137, 6139, 6139, 6140, 6138, 6141, 6133, 6135,
+ 6140, 6140, 6141, 6141, 6143, 0, 6145, 6148, 6148, 6143,
+ 6143, 6145, 6145, 0, 6136, 6147, 6137, 0, 6146, 6139,
+ 6138, 6141, 0, 6140, 6146, 6146, 6145, 6150, 6150, 6149,
+ 6149, 0, 6143, 6151, 6151, 0, 6148, 0, 6147, 6150,
+ 6146, 0, 6139, 6152, 6152, 6141, 6140, 6153, 6153, 0,
+
+ 6145, 6146, 6149, 6154, 6154, 6143, 0, 6151, 0, 6148,
+ 6156, 6156, 6157, 6150, 6146, 6236, 6236, 6157, 6157, 0,
+ 6153, 6152, 6154, 6159, 6146, 6149, 6225, 6225, 6159, 6159,
+ 6151, 6158, 0, 6156, 0, 6225, 6158, 6158, 6225, 0,
+ 6157, 6159, 0, 6153, 6152, 6160, 6154, 6161, 6158, 6162,
+ 6160, 6160, 6161, 6161, 6162, 6162, 6156, 6241, 6241, 6240,
+ 6240, 6164, 0, 6157, 6166, 6159, 6164, 6164, 6240, 6166,
+ 6166, 6240, 6158, 6162, 0, 6161, 6160, 6217, 0, 6208,
+ 6208, 0, 6217, 6217, 6166, 6208, 6208, 6219, 6208, 6164,
+ 6221, 6208, 6219, 6219, 6209, 6221, 6221, 6162, 6161, 6160,
+
+ 6209, 6209, 0, 6209, 6213, 0, 6209, 0, 6166, 0,
+ 6213, 6213, 6164, 6213, 6216, 0, 6213, 0, 6220, 6220,
+ 6216, 6216, 0, 6216, 6220, 6220, 6216, 6220, 6222, 0,
+ 6220, 6224, 0, 6222, 6222, 6228, 6224, 6224, 6226, 6226,
+ 6228, 6228, 6227, 0, 6226, 6226, 0, 6226, 6227, 6227,
+ 6226, 6227, 6230, 6233, 6227, 6242, 6242, 6230, 6230, 6233,
+ 6233, 6237, 6233, 6238, 6238, 6233, 6237, 6237, 0, 6238,
+ 6238, 6239, 6238, 6244, 6244, 6238, 0, 6239, 6239, 6243,
+ 6239, 6245, 6245, 6239, 0, 6243, 6243, 0, 6243, 6246,
+ 6246, 6243, 6248, 6248, 6249, 6249, 6250, 6251, 6251, 6253,
+
+ 0, 6250, 6250, 0, 6253, 6253, 6254, 6254, 6256, 6256,
+ 6255, 0, 6254, 6254, 0, 6254, 6255, 6255, 6254, 6255,
+ 6257, 6257, 6255, 6258, 6258, 6260, 6260, 6261, 6261, 6262,
+ 6263, 6263, 6265, 0, 6262, 6262, 6266, 6265, 6265, 6267,
+ 6267, 6266, 6266, 6268, 6268, 6269, 6269, 6270, 6270, 6271,
+ 6271, 6273, 6273, 6274, 6274, 6275, 6276, 6276, 6278, 0,
+ 6275, 6275, 6279, 6278, 6278, 6280, 6280, 6279, 6279, 6281,
+ 6281, 6281, 6281, 6281, 6281, 6281, 6281, 6281, 6281, 6281,
+ 6281, 0, 6281, 6281, 6281, 6281, 6281, 6283, 6283, 6285,
+ 6285, 6286, 6286, 6287, 6287, 6292, 6292, 6294, 6294, 6302,
+
+ 6302, 0, 6301, 6307, 6307, 6295, 6295, 6301, 6301, 6281,
+ 6305, 6316, 6316, 0, 6306, 6305, 6305, 6296, 6296, 6306,
+ 6306, 6317, 6317, 6319, 6319, 0, 6298, 6298, 6295, 6296,
+ 6299, 6299, 6281, 6282, 6282, 6282, 6282, 6282, 6282, 6282,
+ 6282, 6282, 6282, 6282, 6282, 6282, 6282, 6282, 6282, 6282,
+ 6282, 6295, 6298, 6296, 6297, 6297, 6308, 0, 6299, 6321,
+ 6321, 6308, 6308, 6323, 6323, 6328, 6328, 6297, 6300, 6300,
+ 6329, 6329, 0, 6282, 6333, 6298, 0, 6309, 0, 6333,
+ 6333, 6299, 6309, 6309, 6311, 6334, 6334, 6291, 0, 6311,
+ 6311, 6297, 6300, 6291, 6291, 6309, 6282, 6288, 6288, 6288,
+
+ 6288, 6288, 6288, 6288, 6288, 6288, 6288, 6288, 6288, 6291,
+ 6288, 6288, 6288, 6288, 6288, 6300, 6336, 6311, 0, 6309,
+ 6291, 6336, 6336, 6346, 6346, 6310, 6372, 6372, 0, 6312,
+ 6310, 6310, 6356, 6291, 6312, 6312, 0, 6288, 6356, 6356,
+ 6311, 6374, 6374, 6291, 6365, 6365, 6330, 6330, 6314, 0,
+ 6365, 6365, 0, 6314, 6314, 0, 6310, 0, 6312, 6330,
+ 6288, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289,
+ 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6310,
+ 6313, 6312, 6314, 6330, 6315, 6313, 6313, 6318, 6375, 6375,
+ 6315, 6315, 0, 6318, 6318, 0, 6318, 6324, 6324, 6318,
+
+ 0, 6289, 6325, 6325, 6313, 6314, 6315, 6379, 6379, 6318,
+ 6384, 6384, 6320, 6322, 6326, 6326, 0, 6315, 6320, 6320,
+ 6318, 0, 6322, 0, 6289, 6322, 6324, 0, 6313, 0,
+ 6315, 6325, 0, 6318, 6320, 6322, 0, 6326, 6327, 6327,
+ 6315, 6331, 6331, 6318, 0, 6320, 6322, 6337, 0, 6324,
+ 6327, 0, 6337, 6337, 6325, 6332, 6332, 0, 6320, 6322,
+ 6326, 6332, 6332, 6386, 6386, 6338, 0, 6331, 6320, 6322,
+ 6338, 6338, 0, 6339, 6327, 6337, 0, 6332, 6339, 6339,
+ 0, 6340, 6338, 6387, 6387, 0, 6340, 6340, 6332, 0,
+ 6331, 6339, 6347, 6347, 6343, 6350, 6350, 6344, 6337, 6343,
+
+ 6343, 6332, 6344, 6344, 6348, 6348, 6338, 6342, 6388, 6388,
+ 0, 6332, 6340, 6342, 6342, 6339, 6342, 6378, 6350, 6342,
+ 0, 6347, 6378, 6378, 6345, 0, 6344, 6343, 0, 6342,
+ 6345, 6345, 6349, 6348, 0, 6340, 6341, 6341, 6349, 6349,
+ 6342, 6350, 6341, 6341, 6347, 6341, 6345, 0, 6341, 6344,
+ 6343, 6352, 6352, 6342, 6349, 0, 6348, 6345, 6341, 6351,
+ 6351, 6353, 6353, 6342, 0, 6349, 0, 6354, 6354, 6341,
+ 6345, 6351, 6355, 6355, 0, 6352, 6357, 6357, 6349, 6359,
+ 6345, 6368, 6341, 0, 6359, 6359, 6368, 6368, 6349, 6353,
+ 6354, 6355, 6341, 6389, 6389, 6351, 6358, 6358, 6352, 6357,
+
+ 6360, 6368, 6358, 6358, 6362, 6360, 6360, 6359, 0, 6362,
+ 6362, 0, 6353, 6354, 6361, 6355, 0, 6360, 6358, 6361,
+ 6361, 6363, 6357, 6390, 6390, 6368, 6363, 6363, 0, 6358,
+ 6359, 6364, 6361, 6366, 0, 6362, 6364, 6364, 6366, 6366,
+ 0, 6360, 6358, 0, 6367, 6367, 6391, 6391, 6382, 6363,
+ 6367, 6367, 6358, 6382, 6382, 6364, 6361, 6383, 6362, 6385,
+ 0, 6366, 6383, 6383, 6385, 6385, 6393, 6393, 6392, 0,
+ 6394, 0, 6363, 6392, 6392, 6394, 6394, 6395, 0, 6364,
+ 6397, 6397, 6395, 6395, 6366, 6369, 6369, 6369, 6369, 6369,
+ 6369, 6369, 6369, 6369, 6369, 6369, 6369, 0, 6369, 6369,
+
+ 6369, 6369, 6369, 6396, 0, 6398, 0, 6400, 6396, 6396,
+ 6398, 6398, 6400, 6400, 6401, 6401, 6402, 6403, 6403, 6406,
+ 6406, 6402, 6402, 6404, 0, 6369, 6412, 6412, 6404, 6404,
+ 6414, 6414, 6421, 0, 6416, 6416, 6425, 6421, 6421, 6422,
+ 6422, 6425, 6425, 0, 6415, 6415, 6416, 0, 6369, 6370,
+ 6370, 6370, 6370, 6370, 6370, 6370, 6370, 6370, 6370, 6370,
+ 6370, 6370, 6370, 6370, 6370, 6370, 6370, 6415, 6417, 6417,
+ 6416, 6426, 6427, 6427, 6428, 0, 6426, 6426, 0, 6428,
+ 6428, 6417, 6418, 6418, 0, 6420, 6420, 6438, 6438, 6370,
+ 6415, 6478, 6478, 6429, 6444, 0, 6446, 0, 6429, 6429,
+
+ 6444, 6444, 6446, 6446, 0, 6417, 6419, 6419, 6418, 6420,
+ 6438, 6429, 6370, 6371, 6371, 6371, 6371, 6371, 6371, 6371,
+ 6371, 6371, 6371, 6371, 6371, 6371, 6371, 6371, 6371, 6371,
+ 6371, 6418, 6420, 6438, 6419, 6429, 6453, 6453, 6465, 6439,
+ 6439, 6430, 6453, 6453, 6465, 6465, 6430, 6430, 6455, 6455,
+ 0, 6439, 6467, 6371, 6455, 6455, 0, 6419, 6467, 6467,
+ 6480, 6480, 0, 6431, 0, 6434, 0, 6411, 6431, 6431,
+ 6434, 6434, 6430, 6411, 6411, 6439, 6371, 6376, 6376, 6376,
+ 6376, 6376, 6376, 6376, 6376, 6376, 6376, 6376, 6376, 6411,
+ 6376, 6376, 6376, 6376, 6376, 6430, 6431, 6440, 6440, 6434,
+
+ 6411, 6457, 6457, 6488, 6488, 6493, 6493, 6457, 6457, 6432,
+ 6440, 6441, 6441, 6411, 6432, 6432, 0, 6376, 0, 6431,
+ 6443, 6443, 6434, 6411, 6473, 6473, 6475, 6475, 6501, 6501,
+ 6473, 6473, 6475, 6475, 6440, 6502, 6502, 6441, 6432, 6443,
+ 6376, 6377, 6377, 6377, 6377, 6377, 6377, 6377, 6377, 6377,
+ 6377, 6377, 6377, 6377, 6377, 6377, 6377, 6377, 6377, 0,
+ 6441, 6432, 0, 6443, 6447, 6447, 6477, 6477, 0, 6450,
+ 6504, 6504, 6477, 6477, 6450, 6450, 0, 6433, 0, 6447,
+ 6487, 6377, 6433, 6433, 6449, 6487, 6487, 6491, 0, 6449,
+ 6449, 6451, 6491, 6491, 6506, 6506, 6451, 6451, 6512, 6512,
+
+ 6450, 6433, 6449, 6447, 6377, 6405, 6405, 6405, 6405, 6405,
+ 6405, 6405, 6405, 6405, 6405, 6405, 6405, 6405, 6405, 6405,
+ 6405, 6405, 6405, 6450, 6451, 6433, 6449, 6460, 6460, 6492,
+ 0, 6494, 6513, 6513, 6492, 6492, 6494, 6494, 6452, 6460,
+ 0, 6442, 6442, 6452, 6452, 6405, 6516, 6451, 6517, 6517,
+ 6519, 6516, 6516, 0, 6537, 6519, 6519, 6549, 6549, 6437,
+ 6537, 6537, 0, 6460, 6442, 6437, 6437, 6452, 6405, 6407,
+ 6407, 6407, 6407, 6407, 6407, 6407, 6407, 6407, 6407, 6407,
+ 6407, 6437, 6407, 6407, 6407, 6407, 6407, 6442, 6468, 6468,
+ 6452, 0, 6437, 6545, 6545, 6547, 6547, 6551, 6551, 6545,
+
+ 6545, 6547, 6547, 6468, 0, 6437, 6445, 6445, 6558, 6407,
+ 6559, 6559, 6562, 6558, 6558, 6437, 6563, 6562, 6562, 6564,
+ 6564, 6563, 6563, 6610, 6610, 6454, 0, 6468, 0, 6445,
+ 6454, 6454, 6407, 6408, 6408, 6408, 6408, 6408, 6408, 6408,
+ 6408, 6408, 6408, 6408, 6408, 6408, 6408, 6408, 6408, 6408,
+ 6408, 6456, 6445, 6454, 6461, 6461, 6456, 6456, 6565, 6578,
+ 6612, 6612, 0, 6565, 6565, 6578, 6578, 6461, 6580, 6459,
+ 6459, 6456, 0, 6408, 6580, 6580, 6454, 6613, 6613, 6586,
+ 6586, 6614, 6614, 0, 6500, 6586, 6586, 6458, 0, 6500,
+ 6500, 6461, 6459, 6458, 6458, 6456, 6408, 6409, 6409, 6409,
+
+ 6409, 6409, 6409, 6409, 6409, 6409, 6409, 6409, 6409, 6458,
+ 6409, 6409, 6409, 6409, 6409, 6459, 6482, 6482, 6500, 6597,
+ 6458, 6620, 6620, 6622, 6622, 6597, 6597, 0, 6482, 0,
+ 6462, 6462, 0, 6458, 6463, 6463, 0, 6409, 0, 6464,
+ 6464, 6500, 0, 6458, 6588, 6588, 0, 6590, 6590, 0,
+ 6588, 6588, 6482, 6590, 6590, 0, 6462, 6463, 6464, 0,
+ 6409, 6410, 6410, 6410, 6410, 6410, 6410, 6410, 6410, 6410,
+ 6410, 6410, 6410, 6410, 6410, 6410, 6410, 6410, 6410, 6462,
+ 6463, 6469, 6464, 6466, 6466, 6470, 6469, 6469, 6471, 6507,
+ 6470, 6470, 0, 6471, 6471, 6481, 6481, 6472, 0, 6469,
+
+ 0, 6410, 6472, 6472, 6474, 0, 6466, 6476, 0, 6474,
+ 6474, 6507, 6476, 6476, 6484, 6484, 6470, 0, 6481, 6485,
+ 6485, 6471, 6507, 6469, 6410, 0, 6472, 6476, 0, 6466,
+ 6483, 6483, 6474, 6486, 6486, 6507, 6623, 6623, 0, 6470,
+ 6484, 6481, 0, 6483, 6471, 6507, 0, 6485, 6495, 6472,
+ 0, 6476, 0, 6495, 6495, 6474, 6496, 6486, 0, 6497,
+ 0, 6496, 6496, 6484, 6497, 6497, 6495, 6483, 6498, 0,
+ 6485, 6499, 6503, 6498, 6498, 0, 6499, 6499, 6503, 6503,
+ 6486, 0, 6508, 6508, 6509, 6509, 0, 6496, 6514, 6514,
+ 6495, 0, 6497, 0, 6503, 6499, 0, 6498, 6510, 6510,
+
+ 6505, 6514, 6511, 6511, 0, 6503, 6505, 6505, 6529, 6529,
+ 6496, 6508, 0, 6509, 6511, 6497, 6515, 6515, 6503, 6499,
+ 6498, 6510, 6505, 0, 6520, 6514, 6521, 0, 6503, 6520,
+ 6520, 6521, 6521, 6505, 6508, 6522, 6509, 6529, 6511, 0,
+ 6522, 6522, 6515, 6521, 6510, 6523, 6505, 0, 6524, 6524,
+ 6523, 6523, 6520, 6522, 6524, 6524, 6505, 6525, 6530, 6530,
+ 6529, 6531, 6531, 6525, 6525, 6515, 6527, 6521, 6526, 0,
+ 6524, 6527, 6527, 6526, 6526, 6520, 6523, 6522, 0, 6525,
+ 0, 6524, 6533, 6533, 6531, 0, 6528, 6530, 6534, 6534,
+ 6525, 0, 6528, 6528, 6524, 6527, 0, 6532, 6532, 6523,
+
+ 0, 6526, 0, 6525, 6524, 0, 6533, 6531, 6528, 6532,
+ 6530, 6535, 6535, 6525, 6538, 6538, 6534, 0, 6527, 6528,
+ 6539, 6536, 6536, 0, 6526, 6539, 6539, 6624, 6624, 6533,
+ 6542, 0, 6528, 6532, 6535, 6542, 6542, 6538, 6540, 6534,
+ 6536, 6541, 6528, 6540, 6540, 6543, 6541, 6541, 6539, 0,
+ 6543, 6543, 0, 6552, 6552, 6540, 0, 6535, 0, 6541,
+ 6538, 6542, 6544, 0, 6536, 6555, 6555, 6544, 6544, 6546,
+ 0, 6539, 6548, 6543, 6546, 6546, 6552, 6548, 6548, 6540,
+ 0, 6553, 6553, 6541, 6542, 0, 6544, 6554, 6554, 6557,
+ 6557, 6555, 6548, 6553, 6556, 6556, 6543, 6546, 6567, 6552,
+
+ 6554, 6566, 6599, 6567, 6567, 0, 6566, 6566, 6599, 6599,
+ 6544, 6573, 6573, 6557, 6555, 0, 6548, 6553, 0, 6566,
+ 6546, 6568, 6556, 6573, 6554, 6570, 6568, 6568, 6569, 6567,
+ 6570, 6570, 6571, 6569, 6569, 0, 6557, 6571, 6571, 6572,
+ 6572, 6575, 6575, 6566, 0, 6556, 0, 6573, 0, 6570,
+ 6574, 6574, 6567, 0, 6568, 6576, 6576, 6569, 6579, 6579,
+ 6577, 6577, 6572, 6574, 6625, 6625, 6571, 6575, 6581, 6581,
+ 6582, 6626, 6626, 6570, 0, 6582, 6582, 6568, 6576, 6577,
+ 6569, 6579, 0, 6581, 0, 6572, 6583, 6574, 6582, 6571,
+ 6575, 6583, 6583, 6584, 0, 6591, 6591, 0, 6584, 6584,
+
+ 6585, 6576, 0, 6577, 6579, 6585, 6585, 6581, 6587, 0,
+ 6589, 0, 6582, 6587, 6587, 6589, 6589, 6583, 6591, 6592,
+ 6592, 6593, 6593, 0, 6594, 6594, 6584, 6596, 6596, 6585,
+ 6589, 6592, 6600, 6600, 6593, 0, 6587, 6595, 6595, 6601,
+ 6583, 6591, 6598, 6598, 6601, 6601, 6596, 6600, 0, 6584,
+ 6594, 0, 6585, 0, 6589, 6592, 6602, 6601, 6593, 6587,
+ 6595, 6602, 6602, 6603, 0, 6598, 6627, 6627, 6603, 6603,
+ 6596, 6600, 6604, 6594, 6629, 6629, 0, 6604, 6604, 6605,
+ 6605, 6601, 0, 6595, 6606, 6605, 6605, 6602, 6598, 6606,
+ 6606, 6607, 6607, 0, 6608, 0, 6603, 6607, 6607, 6608,
+
+ 6608, 6604, 6609, 6609, 6634, 6634, 6636, 6636, 6609, 6609,
+ 6602, 6615, 6606, 0, 6608, 6618, 6615, 6615, 0, 6603,
+ 6618, 6618, 6619, 0, 6604, 6621, 0, 6619, 6619, 0,
+ 6621, 6621, 6638, 6638, 6628, 6606, 6630, 0, 6608, 6628,
+ 6628, 6630, 6630, 6631, 0, 6632, 0, 6633, 6631, 6631,
+ 6632, 6632, 6633, 6633, 6635, 0, 6639, 6640, 6640, 6635,
+ 6635, 6639, 6639, 6643, 0, 6644, 6645, 6645, 6643, 6643,
+ 6644, 6644, 6646, 6647, 6647, 6648, 6648, 6646, 6646, 6649,
+ 6650, 6650, 6651, 6651, 0, 6649, 6649, 0, 6649, 6652,
+ 6652, 6649, 6654, 6654, 6655, 6655, 6656, 6657, 6657, 6659,
+
+ 0, 6656, 6656, 0, 6659, 6659, 6660, 6660, 6662, 6662,
+ 6661, 0, 6660, 6660, 0, 6660, 6661, 6661, 6660, 6661,
+ 6663, 6663, 6661, 6665, 6665, 6666, 6667, 6667, 6670, 0,
+ 6666, 6666, 6671, 6670, 6670, 6672, 6672, 6671, 6671, 6673,
+ 6674, 6674, 6676, 6676, 6673, 6673, 6677, 6677, 6678, 6678,
+ 6679, 0, 6682, 0, 6683, 6679, 6679, 6682, 6682, 6683,
+ 6683, 6684, 6684, 6685, 6686, 6686, 6688, 6688, 6685, 6685,
+ 6689, 6690, 6690, 6693, 0, 6689, 6689, 6694, 6693, 6693,
+ 6695, 6695, 6694, 6694, 6696, 6697, 6697, 6698, 6698, 6696,
+ 6696, 6699, 6700, 6700, 6701, 6701, 0, 6699, 6699, 6702,
+
+ 6705, 6705, 0, 6699, 0, 6702, 6702, 6706, 6706, 6707,
+ 6707, 6702, 6708, 6708, 6709, 6709, 6710, 6710, 6711, 6711,
+ 0, 6713, 6713, 6714, 0, 6708, 6712, 6712, 6714, 6714,
+ 6715, 6715, 6716, 6719, 6719, 6729, 6729, 6716, 6716, 0,
+ 6709, 6718, 6711, 0, 6710, 6712, 6718, 6718, 6720, 6708,
+ 6713, 0, 6722, 6720, 6720, 6724, 0, 6722, 6722, 0,
+ 6724, 6724, 0, 6709, 0, 6711, 6723, 6710, 0, 6712,
+ 0, 6723, 6723, 6713, 6717, 6717, 6731, 6731, 0, 6724,
+ 6717, 6717, 6725, 6717, 6726, 6722, 6717, 6725, 6725, 6726,
+ 6726, 0, 6727, 6735, 6735, 6723, 6717, 6727, 6727, 0,
+
+ 6732, 6732, 0, 6724, 6738, 6733, 6733, 6717, 6722, 6738,
+ 6738, 6737, 6737, 6726, 6734, 6734, 6725, 6733, 6723, 6735,
+ 6717, 0, 6728, 6732, 0, 6727, 0, 6734, 6728, 6728,
+ 6717, 6721, 6721, 6736, 6736, 6737, 6726, 6721, 6721, 6725,
+ 6721, 6733, 6735, 6721, 6728, 0, 6732, 0, 6727, 6739,
+ 6739, 6734, 0, 6721, 6742, 6728, 0, 6743, 6737, 6742,
+ 6742, 6736, 6743, 6743, 6721, 6744, 6744, 6745, 6728, 0,
+ 6746, 0, 6745, 6745, 6747, 6746, 6746, 6721, 6728, 6747,
+ 6747, 6753, 6753, 0, 6736, 6748, 0, 6721, 6746, 6750,
+ 6748, 6748, 6749, 6752, 6750, 6750, 6751, 6749, 6749, 6752,
+
+ 6752, 6751, 6751, 0, 6753, 6747, 0, 6754, 6754, 6755,
+ 6755, 0, 6746, 6750, 0, 6752, 6756, 6756, 6748, 6754,
+ 0, 6749, 6755, 0, 6757, 6757, 6752, 6753, 6747, 6759,
+ 6751, 6758, 6758, 6760, 6760, 6759, 6759, 6750, 0, 6752,
+ 0, 6748, 6756, 6754, 6749, 6761, 6755, 6757, 0, 6752,
+ 6758, 6761, 6761, 6751, 6762, 6762, 6760, 6763, 6775, 6775,
+ 0, 6764, 6763, 6763, 0, 6756, 6764, 6764, 0, 6762,
+ 6757, 6765, 6776, 6776, 6758, 6763, 6765, 6765, 6766, 6760,
+ 6767, 6767, 0, 6766, 6766, 6768, 6767, 6767, 6769, 6769,
+ 6768, 6768, 6764, 6762, 6769, 6769, 6770, 6777, 6777, 6763,
+
+ 0, 6770, 6770, 6778, 6765, 6771, 6771, 6766, 6778, 6778,
+ 0, 6771, 6771, 6768, 6780, 6764, 6770, 6779, 6779, 6780,
+ 6780, 0, 6781, 6781, 6783, 6783, 6782, 6765, 6781, 6781,
+ 6766, 6782, 6782, 6784, 6781, 0, 6768, 0, 6784, 6784,
+ 6770, 6772, 6772, 6772, 6772, 6772, 6772, 6772, 6772, 6772,
+ 6772, 6772, 6772, 0, 6772, 6772, 6772, 6772, 6772, 6785,
+ 6785, 6786, 6786, 6787, 6787, 6785, 6785, 6788, 6788, 6789,
+ 6789, 6785, 6790, 6790, 6792, 6792, 6793, 6793, 6794, 6795,
+ 6795, 6772, 6797, 6794, 6794, 6798, 0, 6797, 6797, 0,
+ 6798, 6798, 6799, 6799, 6803, 6803, 6804, 6804, 6805, 6805,
+
+ 6807, 6807, 6808, 6808, 6772, 6773, 6773, 6773, 6773, 6773,
+ 6773, 6773, 6773, 6773, 6773, 6773, 6773, 6773, 6773, 6773,
+ 6773, 6773, 6773, 6806, 6806, 0, 6807, 6812, 6813, 6813,
+ 6808, 0, 6812, 6812, 6809, 6809, 6806, 6814, 6811, 6811,
+ 6817, 6817, 6814, 6814, 0, 6773, 6810, 6810, 0, 6807,
+ 6816, 6827, 6827, 6808, 0, 6816, 6816, 6818, 6809, 0,
+ 6806, 0, 6818, 6818, 6827, 6810, 0, 6811, 6773, 6800,
+ 6800, 6800, 6800, 6800, 6800, 6800, 6800, 6800, 6800, 6800,
+ 6800, 6809, 6800, 6800, 6800, 6800, 6800, 6831, 6827, 6810,
+ 6811, 6833, 0, 6831, 6831, 6820, 0, 6833, 6833, 0,
+
+ 6820, 6820, 6821, 6860, 6860, 6822, 6835, 6821, 6821, 6800,
+ 6822, 6822, 6835, 6835, 6840, 6840, 6861, 6861, 6823, 6847,
+ 6840, 6840, 0, 6823, 6823, 6847, 6847, 0, 6820, 6822,
+ 0, 6821, 6800, 6801, 6801, 6801, 6801, 6801, 6801, 6801,
+ 6801, 6801, 6801, 6801, 6801, 6801, 6801, 6801, 6801, 6801,
+ 6801, 6820, 6823, 6822, 6821, 6824, 0, 6825, 6830, 6830,
+ 6824, 6824, 6825, 6825, 0, 6828, 6828, 6829, 6829, 6832,
+ 6832, 6834, 6834, 6801, 6839, 6823, 6862, 6862, 0, 6839,
+ 6839, 0, 6830, 6836, 6824, 0, 6834, 0, 6836, 6836,
+ 6825, 6828, 6832, 0, 6837, 6829, 6801, 6815, 6815, 6837,
+
+ 6837, 6870, 6870, 6815, 6815, 6830, 6815, 6824, 6839, 6815,
+ 6834, 6843, 6843, 6825, 6828, 6832, 6836, 0, 6829, 6815,
+ 6838, 6845, 6845, 6837, 6843, 6838, 6838, 6841, 6842, 6842,
+ 6815, 6839, 6841, 6841, 6842, 6842, 6844, 6844, 0, 6836,
+ 0, 6846, 6846, 6815, 6838, 0, 6837, 6841, 6843, 6845,
+ 6848, 6848, 6849, 6815, 6819, 6819, 6874, 6874, 6849, 6849,
+ 6819, 6819, 6844, 6819, 0, 6846, 6819, 0, 6838, 6850,
+ 6850, 6841, 6845, 6848, 6851, 0, 6819, 6853, 6883, 6883,
+ 6851, 6851, 6853, 6853, 6850, 6844, 6852, 6819, 6846, 6854,
+ 0, 6852, 6852, 6855, 6854, 6854, 6848, 0, 6855, 6855,
+
+ 6819, 6863, 6863, 0, 6865, 6865, 6853, 0, 6850, 0,
+ 6819, 6856, 6856, 6854, 6863, 6857, 0, 6856, 6856, 6852,
+ 6857, 6857, 6864, 6864, 6858, 6858, 0, 6855, 0, 6853,
+ 6858, 6858, 6865, 6866, 6866, 6857, 0, 6854, 6863, 6867,
+ 6867, 6869, 6852, 6868, 6868, 0, 6869, 6869, 6864, 0,
+ 6855, 6885, 6885, 6893, 6893, 6865, 6871, 6866, 6867, 6857,
+ 6873, 6871, 6871, 6872, 6872, 6873, 6873, 0, 6875, 6872,
+ 6872, 6864, 6868, 6875, 6875, 6889, 6889, 6876, 6876, 0,
+ 6866, 6877, 6867, 6876, 6876, 6872, 6877, 6877, 6878, 0,
+ 6890, 6890, 0, 6878, 6878, 6868, 6872, 6879, 0, 6876,
+
+ 6880, 6889, 6879, 6879, 0, 6880, 6880, 6881, 0, 6872,
+ 6876, 0, 6881, 6881, 6877, 6886, 6886, 6878, 6890, 6872,
+ 6882, 6879, 0, 6876, 6889, 6882, 6882, 6887, 6887, 6888,
+ 6888, 6891, 6891, 6876, 6880, 0, 6881, 6877, 6886, 6887,
+ 6878, 6890, 6888, 6892, 0, 6879, 6896, 0, 6892, 6892,
+ 0, 6896, 6896, 6882, 0, 6891, 0, 6880, 0, 6881,
+ 0, 6886, 6897, 6887, 6898, 6898, 6888, 6897, 6897, 6899,
+ 6926, 6926, 6927, 6927, 6899, 6899, 6882, 6900, 6891, 6901,
+ 0, 6902, 6900, 6900, 6901, 6901, 6902, 6902, 6903, 6906,
+ 6906, 6904, 0, 6903, 6903, 6900, 6904, 6904, 6905, 6909,
+
+ 6909, 6910, 6910, 6905, 6905, 0, 6907, 6907, 6908, 6908,
+ 6901, 0, 6906, 0, 6902, 6904, 0, 6903, 6907, 6900,
+ 6912, 6908, 6911, 6911, 6910, 6909, 6912, 6912, 6913, 6913,
+ 6928, 6928, 6905, 6901, 0, 6906, 0, 6902, 0, 6904,
+ 6903, 6911, 6907, 6914, 0, 6908, 0, 6910, 6909, 6914,
+ 6914, 6913, 6915, 6915, 6916, 6905, 6917, 6934, 6934, 6916,
+ 6916, 6917, 6917, 0, 6918, 6911, 0, 6915, 0, 6918,
+ 6918, 6919, 6916, 0, 6913, 6921, 6919, 6919, 6920, 6920,
+ 6921, 6921, 6922, 6922, 6920, 6920, 6934, 6917, 6922, 6922,
+ 0, 6915, 0, 6923, 6931, 6931, 6916, 6918, 6923, 6923,
+
+ 6919, 6924, 6924, 6921, 6929, 6929, 0, 6924, 6924, 6934,
+ 6917, 6932, 6932, 6923, 6930, 6930, 0, 6929, 6936, 6936,
+ 6918, 0, 6931, 6919, 6933, 6933, 6921, 6935, 6940, 6940,
+ 6981, 6981, 6935, 6935, 0, 6932, 0, 6923, 6954, 6954,
+ 6930, 6929, 6937, 6933, 0, 6931, 6939, 6937, 6937, 6938,
+ 6938, 6939, 6939, 0, 6941, 6938, 6938, 0, 6932, 6941,
+ 6941, 6954, 0, 6930, 6982, 6982, 0, 6933, 6942, 6942,
+ 6953, 6938, 0, 6943, 6942, 6942, 6953, 6953, 6943, 6943,
+ 6944, 0, 6938, 6945, 6954, 6944, 6944, 6946, 6945, 6945,
+ 6942, 6947, 6946, 6946, 6948, 6938, 6947, 6947, 0, 6948,
+
+ 6948, 6942, 6949, 6949, 0, 6938, 6943, 6945, 0, 6944,
+ 6950, 6950, 6951, 6951, 6942, 6949, 6955, 6952, 6952, 6957,
+ 6947, 6946, 6955, 6955, 6942, 6957, 6957, 6948, 0, 6943,
+ 0, 6945, 6944, 6956, 6956, 0, 6950, 6984, 6984, 6949,
+ 6951, 6952, 0, 6947, 6946, 0, 6958, 0, 6956, 6959,
+ 6948, 6958, 6958, 0, 6959, 6959, 6960, 6985, 6985, 6950,
+ 6961, 6960, 6960, 6951, 6952, 6961, 6961, 6962, 6962, 0,
+ 6963, 0, 6956, 6962, 6962, 6963, 6963, 0, 6959, 6958,
+ 6960, 6964, 6964, 6965, 6965, 6966, 6966, 6964, 6964, 0,
+ 6963, 6967, 6967, 6969, 6961, 0, 6965, 6968, 6968, 6969,
+
+ 6969, 6959, 6958, 6971, 6960, 6970, 6970, 6972, 6972, 6971,
+ 6971, 6966, 6988, 6988, 6963, 6992, 6992, 6961, 6973, 6967,
+ 6965, 6968, 6972, 0, 6973, 6973, 6974, 0, 6970, 0,
+ 6976, 6974, 6974, 6975, 6966, 6976, 6976, 0, 6975, 6975,
+ 6995, 6995, 6967, 6977, 6968, 0, 6972, 6979, 6977, 6977,
+ 6983, 6970, 6979, 6979, 6976, 6983, 6983, 6978, 6978, 6974,
+ 6998, 6998, 6975, 6978, 6978, 6980, 6980, 6979, 6986, 0,
+ 6987, 6980, 6980, 6986, 6986, 6987, 6987, 6977, 6976, 6999,
+ 6999, 6989, 6974, 6990, 0, 6975, 6989, 6989, 6990, 6990,
+ 6991, 6979, 6993, 7000, 7000, 6991, 6991, 6993, 6993, 6994,
+
+ 6977, 6996, 0, 7001, 6994, 6994, 6996, 6996, 7001, 7001,
+ 7002, 7002, 7003, 7004, 7004, 7006, 7006, 7003, 7003, 7004,
+ 7004, 7005, 7004, 7007, 0, 7004, 7005, 7005, 7007, 7007,
+ 7008, 7008, 7009, 7009, 7011, 7011, 7008, 7008, 7012, 7008,
+ 7013, 7013, 7008, 7012, 7012, 7016, 0, 7017, 7018, 7018,
+ 7016, 7016, 7017, 7017, 7019, 7021, 7021, 7022, 7022, 7019,
+ 7019, 7023, 7023, 7024, 7025, 7025, 7026, 0, 7024, 7024,
+ 7028, 7026, 7026, 7027, 7027, 7028, 7028, 7029, 7029, 7027,
+ 7027, 7030, 7027, 7031, 7031, 7027, 7030, 7030, 0, 7031,
+ 7031, 0, 7031, 7032, 7032, 7031, 7033, 7033, 7034, 7034,
+
+ 7035, 7035, 7036, 7036, 7037, 7037, 7038, 7039, 7039, 7040,
+ 0, 7038, 7038, 7041, 7040, 7040, 7042, 0, 7041, 7041,
+ 7044, 7042, 7042, 7043, 7043, 7044, 7044, 7045, 7047, 7047,
+ 7048, 7048, 7045, 7045, 7049, 7049, 7050, 7051, 7051, 7052,
+ 0, 7050, 7050, 7053, 7052, 7052, 7054, 0, 7053, 7053,
+ 7056, 7054, 7054, 7055, 7055, 7056, 7056, 7057, 7058, 7058,
+ 7059, 7059, 7057, 7057, 7060, 0, 7061, 7062, 7062, 0,
+ 7060, 7060, 7061, 7061, 7063, 7063, 7060, 0, 7061, 7064,
+ 7064, 7064, 7064, 7064, 0, 7064, 7064, 7064, 7064, 7064,
+ 7064, 7064, 7064, 7064, 7064, 7064, 7064, 7065, 7065, 7066,
+
+ 7066, 7067, 7067, 7065, 7068, 7069, 7069, 7070, 7070, 0,
+ 7068, 7068, 0, 7068, 7073, 7073, 7068, 0, 7071, 7064,
+ 7072, 7072, 7074, 7074, 7071, 7071, 7068, 7071, 7075, 7075,
+ 7071, 7076, 7076, 0, 7077, 7077, 0, 7068, 7073, 7078,
+ 7071, 7074, 7064, 0, 7078, 7078, 7079, 7079, 7072, 0,
+ 7068, 7071, 0, 7080, 0, 7076, 0, 7075, 7080, 7080,
+ 7068, 7073, 7077, 7084, 7071, 7074, 7085, 7085, 7084, 7084,
+ 7086, 7072, 7098, 7098, 7071, 7086, 7086, 0, 7076, 0,
+ 7075, 0, 7083, 7099, 7099, 7077, 7081, 7081, 7083, 7083,
+ 0, 7083, 7081, 7081, 7083, 7081, 0, 7088, 7081, 0,
+
+ 7087, 7087, 7088, 7088, 7083, 7089, 7087, 7087, 7081, 0,
+ 7089, 7089, 7091, 7100, 7100, 7083, 0, 7091, 7091, 7081,
+ 7090, 0, 7087, 0, 7092, 7090, 7090, 0, 7083, 7092,
+ 7092, 0, 7081, 7087, 0, 7093, 7091, 0, 7083, 7089,
+ 7093, 7093, 7081, 7082, 7082, 0, 7087, 7108, 7108, 7082,
+ 7082, 0, 7082, 0, 7090, 7082, 7087, 0, 7092, 0,
+ 7091, 7094, 7089, 7095, 7093, 7082, 7094, 7094, 7095, 7095,
+ 7101, 7101, 0, 7096, 7102, 7102, 7082, 7090, 7096, 7096,
+ 0, 7092, 0, 7101, 7103, 7103, 0, 7093, 0, 7082,
+ 0, 7095, 7104, 7104, 7094, 7106, 7106, 7096, 7107, 7082,
+
+ 7102, 7105, 7105, 7107, 7107, 7109, 0, 7101, 7112, 7112,
+ 7109, 7109, 7103, 7111, 7095, 0, 7104, 7094, 7111, 7111,
+ 7105, 7096, 7113, 7102, 7106, 0, 7115, 7113, 7113, 7137,
+ 7137, 7115, 7115, 7138, 7138, 7103, 7116, 7140, 7140, 7104,
+ 0, 7116, 7116, 0, 7105, 7117, 0, 7106, 7110, 7110,
+ 7117, 7117, 7123, 7123, 7110, 7110, 7118, 7110, 7119, 7115,
+ 7110, 7118, 7118, 7119, 7119, 7116, 7120, 7141, 7141, 7117,
+ 7110, 7120, 7120, 0, 7122, 7122, 7144, 7144, 7121, 7121,
+ 7123, 7110, 7115, 7124, 7124, 7126, 7126, 7119, 7116, 7125,
+ 7118, 7121, 7131, 7117, 7110, 7125, 7125, 7131, 7131, 7120,
+
+ 7122, 7128, 7128, 7123, 7110, 7114, 7114, 7124, 7126, 0,
+ 7119, 7114, 7114, 7118, 7114, 7121, 7128, 7114, 7127, 7150,
+ 7150, 7131, 7120, 7122, 7127, 7127, 7129, 7114, 0, 7130,
+ 7124, 7126, 7129, 7129, 7130, 7130, 7132, 0, 7114, 0,
+ 7128, 7132, 7132, 7133, 7131, 0, 7134, 7134, 7133, 7133,
+ 7135, 7114, 7134, 7134, 0, 7135, 7135, 7136, 7136, 7139,
+ 7132, 7114, 7130, 7136, 7136, 7139, 7139, 7142, 7154, 7154,
+ 7135, 7139, 0, 7142, 7142, 7143, 0, 7133, 0, 7142,
+ 7143, 7143, 7145, 0, 7132, 7130, 0, 7145, 7145, 7146,
+ 7146, 7147, 7147, 0, 7135, 7146, 7146, 7147, 7147, 7148,
+
+ 7133, 7146, 7149, 7147, 7151, 7148, 7148, 7149, 7149, 7151,
+ 7151, 7148, 7152, 7152, 7152, 7152, 7152, 0, 7152, 7152,
+ 7152, 7152, 7152, 7152, 7152, 7152, 7152, 7152, 7152, 7152,
+ 7153, 7156, 7156, 7157, 0, 7153, 7153, 0, 7157, 7157,
+ 7161, 7153, 7158, 7158, 7162, 7161, 7161, 7163, 7163, 7162,
+ 7162, 7164, 7152, 7165, 7165, 7167, 7164, 7164, 7166, 7166,
+ 0, 7167, 7167, 0, 7167, 7168, 7168, 7167, 7169, 7169,
+ 7171, 7171, 7170, 7172, 7172, 7152, 0, 7167, 7170, 7170,
+ 0, 7170, 7175, 7175, 7170, 7174, 7174, 0, 7167, 7173,
+ 7173, 7176, 7176, 0, 7170, 7178, 7178, 7172, 7171, 7184,
+
+ 7184, 7167, 7196, 7196, 7177, 7170, 7175, 7179, 7173, 7177,
+ 7177, 7167, 7179, 7179, 7174, 7221, 7221, 7183, 7170, 7176,
+ 7172, 7171, 7183, 7183, 7182, 7222, 7222, 0, 7170, 7175,
+ 7182, 7182, 7173, 7182, 7185, 0, 7182, 7174, 0, 7185,
+ 7185, 0, 7176, 7180, 7180, 0, 7182, 0, 7187, 7180,
+ 7180, 0, 7180, 7187, 7187, 7180, 0, 7182, 0, 7199,
+ 7199, 0, 7186, 7186, 0, 7180, 7190, 7201, 7186, 7186,
+ 7182, 7190, 7190, 7201, 7201, 0, 7180, 7188, 7199, 0,
+ 7182, 7189, 7188, 7188, 7186, 0, 7189, 7189, 7192, 7180,
+ 7190, 7191, 0, 7192, 7192, 7186, 7191, 7191, 7193, 7180,
+
+ 7181, 7181, 7199, 7193, 7193, 0, 7181, 7181, 7186, 7181,
+ 0, 7188, 7181, 0, 7190, 7189, 0, 7192, 7186, 7198,
+ 7198, 7194, 7181, 7195, 0, 7191, 7194, 7194, 7195, 7195,
+ 0, 7193, 0, 7181, 7188, 7197, 7197, 0, 7189, 0,
+ 7192, 7200, 7200, 7198, 7202, 7202, 7181, 7195, 7191, 7194,
+ 0, 7203, 7224, 7224, 7193, 7204, 7181, 7203, 7203, 7202,
+ 7204, 7204, 7205, 7197, 7209, 7209, 7198, 7205, 7205, 7206,
+ 7200, 7195, 7194, 0, 7206, 7206, 7207, 7210, 7210, 7204,
+ 0, 7207, 7207, 7202, 7208, 7208, 7197, 7211, 7211, 0,
+ 7208, 7208, 7209, 7200, 7212, 7212, 7205, 0, 7206, 7214,
+
+ 7214, 7210, 0, 7204, 7213, 0, 7211, 7216, 0, 7207,
+ 7213, 7213, 7216, 7216, 7214, 7209, 7225, 7225, 0, 7205,
+ 7215, 7206, 0, 7212, 7210, 0, 7215, 7215, 7217, 0,
+ 7211, 7216, 7207, 7217, 7217, 7218, 0, 7219, 7214, 0,
+ 7218, 7218, 7219, 7219, 7220, 7220, 7212, 7229, 7229, 0,
+ 7220, 7220, 0, 7223, 0, 7216, 7228, 7228, 0, 7223,
+ 7223, 7226, 7217, 0, 7218, 0, 7229, 7226, 7226, 0,
+ 7219, 0, 7227, 7227, 0, 7223, 7230, 7230, 7231, 7231,
+ 7228, 7234, 7234, 7226, 0, 7217, 7223, 7218, 7232, 7232,
+ 7229, 7233, 0, 7219, 7226, 0, 7233, 7233, 0, 7223,
+
+ 7227, 0, 7231, 7228, 0, 7230, 7235, 7226, 0, 7223,
+ 0, 7235, 7235, 7236, 7236, 0, 7232, 7226, 0, 7236,
+ 7236, 7240, 7240, 7227, 0, 7231, 0, 7238, 7230, 0,
+ 7237, 7237, 0, 7238, 7238, 7236, 7237, 7237, 7239, 7232,
+ 7252, 7252, 7241, 7239, 7239, 7243, 7236, 7241, 7241, 7238,
+ 7243, 7243, 7237, 7253, 7253, 7242, 7242, 7254, 7254, 7236,
+ 7238, 7242, 7242, 7237, 0, 7244, 7262, 7262, 0, 7236,
+ 7244, 7244, 0, 7238, 0, 7247, 7237, 7242, 0, 7243,
+ 7247, 7247, 0, 7238, 7245, 0, 7237, 7246, 7242, 7245,
+ 7245, 7248, 7246, 7246, 7256, 7256, 7248, 7248, 0, 7244,
+
+ 7249, 7242, 7243, 0, 7247, 7249, 7249, 7250, 7245, 7257,
+ 7257, 7242, 7250, 7250, 7258, 7258, 7255, 7255, 7266, 7266,
+ 7256, 7246, 7244, 0, 7248, 7260, 7260, 7247, 7249, 7255,
+ 7261, 7250, 7245, 7259, 7259, 7261, 7261, 7257, 7258, 0,
+ 7263, 0, 7279, 7256, 7246, 7263, 7263, 7248, 7279, 7279,
+ 0, 7249, 7259, 7255, 7260, 7250, 7264, 7264, 0, 7265,
+ 7257, 7258, 7264, 7264, 7265, 7265, 7267, 0, 7268, 7268,
+ 0, 7267, 7267, 0, 7268, 7268, 7259, 7260, 7264, 0,
+ 7269, 0, 7270, 7291, 7291, 7269, 7269, 7270, 7270, 7264,
+ 7268, 7271, 0, 7272, 7275, 7275, 7271, 7271, 7272, 7272,
+
+ 7273, 7268, 7264, 0, 7274, 7273, 7273, 7275, 0, 7274,
+ 7274, 7270, 7264, 7269, 7268, 7271, 7276, 7276, 7277, 7277,
+ 7278, 7278, 7280, 7280, 7268, 0, 7281, 7272, 0, 7273,
+ 0, 7275, 7281, 7281, 7270, 0, 7269, 7274, 0, 7271,
+ 7282, 7282, 7276, 7284, 7278, 7280, 7277, 7283, 7284, 7284,
+ 7272, 7285, 7273, 7283, 7283, 7282, 7285, 7285, 7286, 0,
+ 7274, 7292, 7292, 7286, 7286, 7276, 7287, 7278, 7280, 7277,
+ 0, 7287, 7287, 7294, 7294, 0, 7284, 7288, 7288, 7282,
+ 7285, 7289, 7286, 7288, 7288, 7293, 7289, 7289, 7290, 7290,
+ 0, 7293, 7293, 0, 7290, 7290, 7295, 7295, 0, 7284,
+
+ 7287, 7289, 7296, 7285, 7297, 7297, 7286, 7293, 7296, 7296,
+ 7298, 7298, 0, 7300, 7300, 0, 7301, 7301, 7293, 7299,
+ 7299, 7302, 7302, 7287, 7296, 7289, 7304, 7304, 7310, 7310,
+ 7325, 7293, 7297, 0, 7298, 7296, 7325, 7325, 7299, 7303,
+ 7301, 7293, 7300, 0, 7303, 7303, 7305, 0, 7296, 7302,
+ 0, 7305, 7305, 7306, 7306, 7297, 0, 7298, 7296, 7306,
+ 7306, 0, 7299, 7301, 0, 7300, 0, 7307, 7307, 0,
+ 7308, 0, 7302, 7307, 7307, 7306, 7308, 7308, 7309, 7323,
+ 7323, 0, 7311, 7309, 7309, 7313, 7306, 7311, 7311, 7307,
+ 7313, 7313, 7308, 7345, 7345, 7312, 7312, 0, 7323, 7306,
+
+ 7307, 7312, 7312, 7308, 0, 7314, 7321, 7321, 0, 7306,
+ 7314, 7314, 0, 7307, 0, 7317, 7308, 7312, 0, 7313,
+ 7317, 7317, 7323, 7307, 7315, 0, 7308, 7316, 7312, 7315,
+ 7315, 7318, 7316, 7316, 7321, 0, 7318, 7318, 0, 7314,
+ 7319, 7312, 7313, 0, 7317, 7319, 7319, 7320, 7315, 7322,
+ 7322, 7312, 7320, 7320, 7324, 7324, 0, 7321, 0, 7326,
+ 7326, 7316, 7314, 7327, 7318, 7334, 7334, 7317, 7319, 7327,
+ 7327, 7320, 7315, 7322, 7326, 7328, 0, 7333, 7333, 7337,
+ 7328, 7328, 0, 7324, 7316, 7337, 7337, 7318, 7329, 7334,
+ 0, 7319, 0, 7329, 7329, 7320, 7322, 7330, 7326, 7328,
+
+ 7335, 7335, 7330, 7330, 7331, 7333, 7324, 7332, 7332, 7331,
+ 7331, 0, 7334, 7332, 7332, 7336, 7336, 7338, 7338, 7335,
+ 7346, 7346, 7329, 7328, 7339, 0, 7330, 0, 7333, 7340,
+ 7339, 7339, 7338, 7342, 7340, 7340, 7341, 7331, 7342, 7342,
+ 0, 7341, 7341, 7335, 7336, 7329, 7343, 7349, 7349, 7330,
+ 0, 7343, 7343, 7340, 7350, 7350, 7338, 7344, 7344, 0,
+ 7331, 0, 7342, 7344, 7344, 0, 7347, 7336, 7348, 0,
+ 7341, 7347, 7347, 7348, 7348, 7351, 7351, 7340, 7353, 7343,
+ 7352, 7352, 0, 7353, 7353, 7342, 7354, 7354, 0, 7355,
+ 0, 7356, 0, 7341, 7355, 7355, 7356, 7356, 7357, 0,
+
+ 7358, 0, 7343, 7357, 7357, 7358, 7358, 7359, 7359, 7360,
+ 0, 7361, 0, 7362, 7360, 7360, 7361, 7361, 7362, 7362,
+ 7363, 7363, 7364, 7364, 7365, 7366, 7366, 7367, 7367, 7369,
+ 7365, 7365, 7368, 7365, 7369, 7369, 7365, 0, 7368, 7368,
+ 7371, 7368, 7370, 7370, 7368, 7371, 7371, 7372, 7372, 7376,
+ 7376, 7373, 7373, 7372, 7372, 7374, 7372, 7373, 7373, 7372,
+ 7373, 7374, 7374, 7373, 7374, 7375, 0, 7374, 7377, 0,
+ 7375, 7375, 7378, 7377, 7377, 7380, 7380, 7378, 7378, 7381,
+ 7381, 7382, 7382, 7383, 7384, 7384, 7385, 0, 7383, 7383,
+ 7387, 7385, 7385, 7386, 7386, 7387, 7387, 7388, 7388, 7386,
+
+ 7386, 7389, 7386, 7390, 7390, 7386, 7389, 7389, 0, 7390,
+ 7390, 0, 7390, 7391, 7391, 7390, 7392, 7392, 7393, 7394,
+ 7394, 7395, 7395, 7397, 7393, 7393, 7396, 7393, 7397, 7397,
+ 7393, 0, 7396, 7396, 7399, 7396, 7398, 7398, 7396, 7399,
+ 7399, 7400, 7400, 7404, 7404, 7401, 7401, 7400, 7400, 7402,
+ 7400, 7401, 7401, 7400, 7401, 7402, 7402, 7401, 7402, 7403,
+ 0, 7402, 7405, 0, 7403, 7403, 7406, 7405, 7405, 7407,
+ 7407, 7406, 7406, 7408, 7408, 7409, 7409, 7410, 7410, 7411,
+ 7411, 7412, 7412, 7413, 7414, 7414, 7415, 0, 7413, 7413,
+ 7416, 7415, 7415, 7417, 0, 7416, 7416, 7418, 7417, 7417,
+
+ 7419, 7419, 7418, 7418, 7420, 7421, 7421, 7422, 7422, 7420,
+ 7420, 7423, 7423, 7424, 7424, 7425, 7425, 7426, 7426, 7427,
+ 7428, 7428, 7429, 0, 7427, 7427, 7430, 7429, 7429, 7431,
+ 0, 7430, 7430, 7433, 7431, 7431, 7432, 7432, 7433, 7433,
+ 7434, 7434, 7435, 7440, 7440, 7441, 7441, 7435, 7435, 7436,
+ 7436, 7436, 7436, 7436, 0, 7436, 7436, 7436, 7436, 7436,
+ 7436, 7436, 7436, 7436, 7436, 7436, 7436, 7437, 7437, 7438,
+ 7442, 7442, 0, 7437, 0, 7438, 7438, 7444, 7444, 7445,
+ 7445, 7438, 7447, 7447, 7471, 7471, 7472, 7472, 7457, 7436,
+ 7464, 7450, 7450, 7457, 7457, 7464, 7464, 7474, 7474, 7475,
+
+ 7475, 7484, 7484, 0, 7448, 7448, 0, 7464, 7449, 7449,
+ 7450, 0, 7436, 7439, 7439, 7439, 7439, 7439, 7439, 7439,
+ 7439, 7439, 7439, 7439, 7439, 7439, 7439, 7439, 7439, 7439,
+ 7439, 7464, 7443, 7448, 7450, 0, 7446, 7449, 7443, 7443,
+ 0, 7443, 7446, 7446, 7443, 7451, 7451, 7452, 7452, 7453,
+ 7453, 7490, 7490, 7439, 7443, 0, 7448, 7506, 7446, 0,
+ 7449, 7454, 7454, 7506, 7506, 7443, 7455, 7455, 0, 7446,
+ 0, 7452, 7514, 7514, 7451, 0, 7439, 7453, 7443, 0,
+ 7456, 7456, 7446, 0, 7454, 7455, 7456, 7456, 7443, 0,
+ 7458, 0, 7446, 7459, 7452, 7458, 7458, 7451, 7459, 7459,
+
+ 7453, 0, 7456, 7515, 7515, 7463, 0, 7454, 7461, 7455,
+ 7463, 7463, 0, 7456, 7461, 7461, 0, 7461, 7477, 7477,
+ 7461, 0, 7462, 7462, 7458, 7508, 7456, 7459, 7462, 7462,
+ 7461, 7508, 7508, 7463, 7466, 0, 7456, 7465, 0, 7466,
+ 7466, 7461, 7465, 7465, 7462, 0, 7477, 7458, 7478, 7478,
+ 7459, 7460, 7460, 0, 7461, 7462, 7463, 7460, 7460, 0,
+ 7460, 7517, 7517, 7460, 7461, 7467, 7465, 7466, 7462, 7477,
+ 7467, 7467, 7478, 7460, 7468, 7469, 7469, 0, 7462, 7468,
+ 7468, 7469, 7469, 0, 7460, 0, 7470, 7481, 7481, 7465,
+ 7466, 7470, 7470, 7467, 7483, 7478, 7473, 7460, 7468, 7483,
+
+ 7483, 0, 7473, 7473, 0, 7473, 0, 7460, 7473, 7480,
+ 7480, 7481, 7479, 7479, 7470, 0, 7467, 0, 7473, 7482,
+ 7482, 7476, 7468, 0, 7503, 7503, 0, 7476, 7476, 7473,
+ 7476, 7479, 0, 7476, 7481, 7485, 0, 7470, 7480, 7489,
+ 7485, 7485, 7473, 7476, 7489, 7489, 0, 7482, 7503, 0,
+ 7488, 0, 7473, 0, 7476, 7479, 7488, 7488, 7491, 7488,
+ 7493, 7480, 7488, 7491, 7491, 7493, 7493, 7476, 7494, 0,
+ 7482, 7503, 7488, 7494, 7494, 7492, 7492, 7476, 7486, 7486,
+ 0, 7492, 7492, 7488, 7486, 7486, 7495, 7486, 0, 7496,
+ 7486, 7495, 7495, 7497, 7496, 7496, 7488, 7492, 7497, 7497,
+
+ 7486, 0, 7494, 0, 7498, 0, 7488, 0, 7492, 7498,
+ 7498, 7486, 0, 7496, 7518, 7518, 7520, 7520, 7528, 7528,
+ 7495, 7492, 7520, 7500, 7486, 7494, 0, 7497, 7500, 7500,
+ 0, 7492, 0, 7498, 7486, 7487, 7487, 7496, 7502, 7502,
+ 7499, 7487, 7487, 7495, 7487, 7499, 7499, 7487, 7507, 7507,
+ 7497, 7500, 0, 7501, 7505, 7505, 7498, 7487, 7501, 7501,
+ 7504, 7504, 0, 7507, 7509, 0, 7502, 0, 7487, 7509,
+ 7509, 7529, 7529, 7499, 7500, 7530, 7530, 7501, 0, 7504,
+ 7510, 7487, 0, 7505, 0, 7510, 7510, 7507, 7509, 7502,
+ 0, 7487, 7511, 0, 7512, 0, 7499, 7511, 7511, 7512,
+
+ 7512, 7501, 7526, 7504, 7513, 7513, 7505, 7526, 7526, 0,
+ 7513, 7513, 7509, 7516, 7510, 7532, 7532, 7522, 0, 7516,
+ 7516, 7511, 7522, 7522, 0, 7516, 7524, 7512, 7522, 7523,
+ 7523, 0, 7524, 7524, 7531, 7523, 7523, 7510, 7524, 7531,
+ 7531, 7523, 7533, 0, 7511, 7536, 7536, 7533, 7533, 0,
+ 7512, 7519, 7519, 7519, 7519, 7519, 0, 7519, 7519, 7519,
+ 7519, 7519, 7519, 7519, 7519, 7519, 7519, 7519, 7519, 7534,
+ 0, 7535, 0, 7537, 7534, 7534, 7535, 7535, 7537, 7537,
+ 7538, 7539, 7539, 7540, 7540, 7538, 7538, 7541, 7542, 7542,
+ 0, 7519, 0, 7541, 7541, 0, 7541, 7543, 7543, 7541,
+
+ 7545, 7545, 7587, 7587, 0, 7546, 7546, 7547, 7547, 7541,
+ 7549, 7549, 7551, 7551, 7519, 7521, 7521, 7521, 7521, 7521,
+ 7541, 7521, 7521, 7521, 7521, 7521, 7521, 7521, 7521, 7521,
+ 7521, 7521, 7521, 7541, 7546, 0, 7547, 0, 7573, 7549,
+ 7551, 7555, 7582, 7541, 7573, 7573, 7555, 7555, 7582, 7582,
+ 7550, 7550, 0, 7552, 7552, 7521, 0, 7546, 0, 7547,
+ 7588, 7588, 7549, 7551, 7590, 7590, 7556, 7591, 7591, 7614,
+ 7614, 7556, 7556, 0, 7550, 0, 7552, 0, 7521, 7525,
+ 7525, 7525, 7525, 7525, 7525, 7525, 7525, 7525, 7525, 7525,
+ 7525, 7525, 7525, 7525, 7525, 7525, 7525, 7550, 7544, 7552,
+
+ 7556, 0, 7548, 7548, 7544, 7544, 7553, 7553, 7561, 0,
+ 7554, 7554, 0, 7561, 7561, 0, 7554, 7554, 0, 7525,
+ 7544, 7548, 0, 7556, 7557, 7553, 7570, 7570, 7559, 7557,
+ 7557, 7544, 7554, 7563, 7559, 7559, 7561, 7559, 7563, 7563,
+ 7559, 0, 7525, 7554, 7544, 7548, 7560, 7560, 0, 7553,
+ 7559, 0, 7560, 7560, 7544, 7570, 7554, 0, 7557, 7561,
+ 0, 7559, 7563, 7615, 7615, 0, 7554, 7564, 7560, 0,
+ 7562, 0, 7564, 7564, 7559, 7562, 7562, 0, 7570, 7560,
+ 0, 7557, 7558, 7558, 7559, 7563, 0, 7562, 7558, 7558,
+ 7565, 7558, 7560, 7568, 7558, 7565, 7565, 0, 7568, 7568,
+
+ 7564, 7566, 7560, 0, 7558, 0, 7566, 7566, 7569, 7569,
+ 0, 7562, 0, 7567, 7567, 7558, 7571, 7571, 7565, 7567,
+ 7567, 7568, 0, 7564, 0, 7566, 7574, 7569, 7558, 7572,
+ 7572, 7574, 7574, 7579, 7579, 7617, 7617, 7575, 7558, 0,
+ 7571, 7565, 7575, 7575, 7568, 7580, 7580, 7576, 0, 7566,
+ 0, 7569, 7576, 7576, 0, 7574, 0, 7572, 0, 7577,
+ 7578, 7578, 7579, 7571, 7577, 7577, 7581, 7581, 7583, 7580,
+ 7575, 7584, 0, 7583, 7583, 7576, 7584, 7584, 7574, 7578,
+ 7572, 7585, 0, 7577, 0, 7579, 7585, 7585, 7618, 7618,
+ 7586, 0, 7580, 7575, 7581, 7586, 7586, 7583, 7576, 7627,
+
+ 7627, 7593, 7593, 7578, 7584, 0, 7589, 7577, 0, 7585,
+ 7597, 7597, 7589, 7589, 7586, 7592, 0, 7581, 7594, 7594,
+ 7583, 7592, 7592, 7595, 7595, 7596, 7596, 7584, 7589, 0,
+ 7593, 0, 7585, 0, 7597, 7598, 7598, 7592, 7586, 7589,
+ 7600, 7600, 7595, 0, 7599, 7599, 0, 7594, 7592, 0,
+ 7602, 0, 7589, 7593, 7596, 7602, 7602, 7597, 0, 7600,
+ 0, 7592, 7589, 7598, 7633, 7633, 7595, 7599, 0, 7603,
+ 7594, 7592, 7601, 7601, 7603, 7603, 7606, 7596, 7601, 7601,
+ 0, 7606, 7606, 7600, 7602, 0, 7598, 7622, 7622, 7605,
+ 7599, 7604, 7604, 7648, 7601, 7605, 7605, 7604, 7604, 7648,
+
+ 7648, 7621, 7621, 7603, 7606, 7601, 7622, 7602, 7656, 7656,
+ 7608, 7605, 0, 7604, 7607, 7608, 7608, 0, 7601, 7607,
+ 7607, 0, 7605, 0, 7604, 7621, 7603, 7606, 7601, 0,
+ 7622, 7607, 0, 7620, 7620, 7605, 7609, 7604, 7610, 7608,
+ 0, 7609, 7609, 7610, 7610, 7605, 7611, 7604, 7621, 0,
+ 7616, 7611, 7611, 7612, 7612, 7607, 7616, 7616, 7613, 7612,
+ 7612, 7620, 7608, 7613, 7613, 0, 7610, 0, 7619, 7609,
+ 7611, 0, 7616, 0, 7619, 7619, 7623, 7623, 7624, 7624,
+ 7625, 7625, 7626, 7616, 7620, 0, 7613, 7626, 7626, 7610,
+ 7619, 0, 7609, 7628, 7611, 0, 7616, 7650, 7628, 7628,
+
+ 0, 7619, 7624, 7650, 7650, 7623, 7616, 0, 7625, 7613,
+ 7629, 7629, 7630, 7630, 7619, 7631, 7629, 7629, 7630, 7630,
+ 0, 7631, 7631, 0, 7619, 7624, 7657, 7657, 7623, 0,
+ 7632, 7625, 7629, 7634, 7630, 7632, 7632, 7631, 7634, 7634,
+ 7635, 7635, 0, 7629, 7636, 7630, 7635, 7635, 7631, 7636,
+ 7636, 0, 7644, 7644, 7637, 0, 7629, 0, 7630, 7637,
+ 7637, 7631, 7635, 0, 7646, 7646, 7629, 0, 7630, 7638,
+ 0, 7631, 0, 7635, 7638, 7638, 7639, 0, 7636, 7640,
+ 7644, 7639, 7639, 7646, 7640, 7640, 7635, 0, 7637, 7641,
+ 7645, 7645, 7642, 7638, 7641, 7641, 7635, 7642, 7642, 7643,
+
+ 0, 7636, 0, 7644, 7643, 7643, 0, 7646, 7640, 0,
+ 7639, 7637, 7647, 7647, 7645, 7649, 7649, 7638, 0, 7653,
+ 7642, 7652, 7641, 7643, 7653, 7653, 7652, 7652, 0, 7651,
+ 7649, 7640, 0, 7639, 7651, 7651, 0, 7645, 7659, 7659,
+ 0, 7647, 0, 7642, 0, 7641, 7654, 7643, 7653, 7660,
+ 7660, 7654, 7654, 7651, 7649, 7652, 7655, 7655, 0, 7658,
+ 0, 7661, 7655, 7655, 7647, 7658, 7658, 7661, 7661, 7662,
+ 7662, 7653, 7663, 7663, 0, 7666, 7666, 7651, 7652, 7654,
+ 0, 7658, 0, 7661, 7664, 7664, 0, 7665, 7665, 0,
+ 7667, 7667, 7658, 0, 7661, 0, 7668, 7668, 7662, 7666,
+
+ 0, 7663, 7654, 7664, 0, 7658, 7671, 7661, 0, 7669,
+ 7669, 7671, 7671, 7701, 7701, 7658, 7665, 7661, 7667, 7668,
+ 0, 7662, 7666, 0, 7663, 7670, 7670, 7664, 7669, 0,
+ 7672, 7670, 7670, 7685, 7685, 7672, 7672, 7673, 7673, 7665,
+ 7671, 7667, 7668, 7673, 7673, 7675, 0, 7670, 7676, 0,
+ 7675, 7675, 7669, 7676, 7676, 7674, 0, 7685, 7670, 7673,
+ 7687, 7674, 7674, 7671, 7672, 7676, 7687, 7687, 0, 7677,
+ 7673, 7670, 0, 7675, 7677, 7677, 0, 7674, 0, 7678,
+ 7685, 7670, 0, 7673, 7678, 7678, 7679, 7672, 7674, 7676,
+ 0, 7679, 7679, 7673, 7680, 0, 7675, 0, 7677, 7680,
+
+ 7680, 7674, 7681, 7681, 7683, 7683, 7686, 7686, 7681, 7681,
+ 7682, 7674, 7678, 0, 7679, 7682, 7682, 0, 7680, 7684,
+ 7684, 7677, 7688, 7683, 0, 7689, 0, 7688, 7688, 0,
+ 7689, 7689, 7694, 7694, 7686, 7678, 0, 7679, 7682, 7690,
+ 7692, 7692, 7680, 0, 7690, 7690, 0, 7683, 7684, 7691,
+ 0, 7688, 7695, 7695, 7691, 7691, 7694, 7686, 7689, 7692,
+ 7697, 7682, 7693, 7693, 0, 7697, 7697, 7690, 0, 7696,
+ 0, 7684, 7698, 7691, 7688, 7696, 7696, 7698, 7698, 7694,
+ 7695, 7689, 7699, 7692, 7702, 7702, 0, 7699, 7699, 7697,
+ 7690, 7693, 0, 7700, 0, 7703, 0, 7691, 7700, 7700,
+
+ 7703, 7703, 7704, 7695, 0, 7698, 0, 7704, 7704, 0,
+ 7699, 0, 7697, 7705, 7693, 7706, 0, 7700, 7705, 7705,
+ 7706, 7706, 7709, 7709, 7707, 0, 7708, 0, 7698, 7707,
+ 7707, 7708, 7708, 7699, 7710, 7710, 7711, 7712, 7712, 7713,
+ 7713, 7700, 7711, 7711, 7715, 7711, 7714, 7714, 7711, 7715,
+ 7715, 7716, 7716, 7718, 7718, 7717, 0, 7716, 7716, 0,
+ 7716, 7717, 7717, 7716, 7717, 7719, 7719, 7717, 7720, 7721,
+ 7721, 7722, 7722, 7724, 7720, 7720, 7723, 7720, 7724, 7724,
+ 7720, 0, 7723, 7723, 7726, 7723, 7725, 7725, 7723, 7726,
+ 7726, 7727, 7727, 7731, 7731, 7728, 7728, 7727, 7727, 7729,
+
+ 7727, 7728, 7728, 7727, 7728, 7729, 7729, 7728, 7729, 7730,
+ 0, 7729, 7732, 0, 7730, 7730, 7733, 7732, 7732, 7734,
+ 7734, 7733, 7733, 7735, 7735, 7736, 7737, 7737, 7738, 7738,
+ 0, 7736, 7736, 7740, 7736, 7739, 7739, 7736, 7740, 7740,
+ 7741, 7741, 7743, 7743, 7742, 0, 7741, 7741, 0, 7741,
+ 7742, 7742, 7741, 7742, 7744, 0, 7742, 7745, 7745, 7744,
+ 7744, 7746, 7746, 7747, 7747, 7748, 7748, 7749, 7749, 7750,
+ 7751, 7751, 7753, 7753, 7750, 7750, 7752, 7752, 7752, 7752,
+ 7752, 7752, 7752, 7752, 7752, 7752, 7752, 7752, 7752, 7752,
+ 7752, 7752, 7752, 7752, 7757, 7757, 7762, 7762, 7767, 7780,
+
+ 7780, 7781, 7781, 0, 7767, 7767, 7758, 7758, 7762, 7759,
+ 7759, 7776, 7776, 7778, 7778, 0, 7752, 7776, 7776, 7778,
+ 7778, 7783, 7783, 7784, 7784, 7786, 7786, 0, 7773, 0,
+ 7756, 0, 7762, 7773, 7773, 7758, 7756, 7756, 7759, 7752,
+ 7754, 7754, 7754, 7754, 7754, 7754, 7754, 7754, 7754, 7754,
+ 7754, 7754, 7756, 7754, 7754, 7754, 7754, 7754, 7758, 7773,
+ 7796, 7759, 0, 7756, 0, 7796, 7796, 7808, 7808, 7820,
+ 7820, 7764, 7764, 7808, 7808, 7820, 7756, 7814, 7761, 7761,
+ 7754, 0, 7773, 7814, 7814, 7824, 7756, 7822, 7822, 0,
+ 7824, 7824, 7827, 7827, 7828, 7828, 7829, 7829, 0, 7764,
+
+ 0, 7761, 0, 7754, 7755, 7755, 7755, 7755, 7755, 7755,
+ 7755, 7755, 7755, 7755, 7755, 7755, 7755, 7755, 7755, 7755,
+ 7755, 7755, 7764, 7760, 7761, 7763, 7763, 7765, 7765, 7760,
+ 7760, 7770, 7766, 7766, 7768, 7768, 7770, 7770, 7830, 7830,
+ 0, 7769, 7769, 0, 7755, 7760, 0, 7769, 7769, 7763,
+ 7765, 7766, 7831, 7831, 7832, 7832, 7760, 7768, 0, 7770,
+ 7771, 7834, 7834, 7769, 0, 7771, 7771, 7755, 0, 7760,
+ 7838, 7838, 7763, 7765, 7769, 7766, 0, 7771, 7772, 7760,
+ 7768, 0, 7770, 7772, 7772, 7774, 0, 7769, 0, 7779,
+ 7774, 7774, 0, 7775, 7779, 7779, 7772, 7769, 7775, 7775,
+
+ 7777, 7771, 7787, 7787, 7785, 7777, 7777, 7840, 7840, 7779,
+ 7785, 7785, 7782, 7774, 7788, 7788, 0, 7775, 7782, 7782,
+ 7772, 7782, 7791, 7791, 7782, 0, 7785, 0, 7777, 7789,
+ 7789, 7787, 0, 7779, 7782, 0, 7774, 7785, 7790, 7790,
+ 0, 7775, 0, 7788, 0, 7782, 7791, 0, 7789, 0,
+ 7785, 7777, 7792, 7792, 7787, 7793, 7793, 0, 7782, 0,
+ 7785, 0, 7794, 7794, 7795, 7795, 7788, 7790, 7782, 7791,
+ 7795, 7795, 7789, 7843, 7843, 7812, 7812, 7797, 7793, 7798,
+ 7792, 7794, 7797, 7797, 7798, 7798, 7795, 7803, 0, 7802,
+ 7790, 0, 7803, 7803, 7802, 7802, 0, 7795, 0, 7812,
+
+ 0, 7793, 7805, 7792, 7803, 7794, 0, 7805, 7805, 7800,
+ 7795, 7797, 0, 7798, 0, 7800, 7800, 7802, 7800, 0,
+ 7795, 7800, 7812, 7801, 7801, 7811, 7811, 7807, 7803, 7801,
+ 7801, 7800, 7807, 7807, 7797, 7805, 7798, 7799, 7799, 0,
+ 7802, 0, 7800, 7799, 7799, 7801, 7799, 7804, 0, 7799,
+ 0, 7807, 7804, 7804, 7811, 7800, 7801, 7806, 7805, 7799,
+ 0, 7809, 7806, 7806, 0, 7800, 7809, 7809, 0, 7801,
+ 7799, 7810, 7810, 7813, 7813, 7807, 7804, 7811, 0, 7801,
+ 0, 7815, 0, 7799, 0, 7806, 7815, 7815, 0, 7809,
+ 7810, 0, 7816, 7799, 7844, 7844, 0, 7816, 7816, 7804,
+
+ 7817, 7813, 0, 7849, 7849, 7817, 7817, 0, 7806, 0,
+ 7815, 7818, 7809, 7833, 7810, 7835, 7818, 7818, 7833, 7833,
+ 7835, 7835, 0, 7844, 7813, 7816, 7836, 7849, 7817, 7845,
+ 7845, 7836, 7836, 7815, 7837, 7818, 7839, 0, 7841, 7837,
+ 7837, 7839, 7839, 7841, 7841, 0, 7844, 0, 7816, 0,
+ 7849, 7817, 0, 7848, 7848, 7847, 7847, 0, 7845, 7818,
+ 7819, 7819, 7819, 7819, 7819, 7848, 7819, 7819, 7819, 7819,
+ 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7847, 7853,
+ 0, 7845, 7903, 7903, 0, 7853, 7853, 7862, 7862, 7848,
+ 0, 7850, 7850, 7862, 7862, 7904, 7904, 7851, 7851, 0,
+
+ 7819, 7847, 7852, 7852, 0, 7857, 7864, 7864, 7872, 7872,
+ 7857, 7857, 7864, 7864, 7872, 7872, 7867, 7867, 0, 7850,
+ 7851, 7852, 7857, 7819, 7821, 7821, 7821, 7821, 7821, 7821,
+ 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821,
+ 7821, 7821, 7850, 7851, 7867, 7852, 7857, 0, 7880, 7880,
+ 7906, 7906, 0, 7859, 7880, 7880, 0, 7856, 7859, 7859,
+ 7854, 7854, 7856, 7856, 7821, 7891, 0, 7867, 7858, 7899,
+ 7899, 7891, 7891, 7858, 7858, 7899, 7899, 7907, 7907, 7976,
+ 7976, 7977, 7977, 7854, 7859, 7856, 7858, 7821, 7823, 7823,
+ 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823,
+
+ 7823, 7823, 7823, 7823, 7823, 7823, 7854, 7859, 7856, 0,
+ 7858, 7901, 7901, 0, 7928, 7928, 7934, 7901, 7901, 7860,
+ 7928, 7928, 7934, 7934, 7860, 7860, 7861, 7948, 7823, 7956,
+ 7956, 7861, 7861, 7948, 7948, 7956, 7956, 7978, 7978, 7958,
+ 7958, 0, 7842, 7875, 7875, 7958, 7958, 7860, 7842, 7842,
+ 7861, 7823, 7825, 7825, 7825, 7825, 7825, 7825, 7825, 7825,
+ 7825, 7825, 7825, 7825, 7842, 7825, 7825, 7825, 7825, 7825,
+ 7860, 7875, 7886, 7886, 7861, 7842, 7966, 7966, 7980, 7980,
+ 7974, 7974, 7966, 7966, 7886, 7863, 7974, 7974, 7842, 0,
+ 7863, 7863, 7825, 7979, 7875, 7981, 7981, 0, 7842, 7979,
+
+ 7979, 7983, 7979, 7982, 7982, 7979, 7983, 7983, 7886, 7986,
+ 7986, 8010, 8010, 7863, 0, 7825, 7826, 7826, 7826, 7826,
+ 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826,
+ 7826, 7826, 7826, 7826, 7865, 7846, 7863, 7855, 7855, 7865,
+ 7865, 7846, 7846, 7855, 7855, 7866, 7866, 7870, 7868, 7868,
+ 7874, 7874, 7870, 7870, 7865, 0, 7826, 7846, 7871, 7855,
+ 7873, 7869, 7869, 7871, 7871, 7873, 7873, 0, 7846, 7866,
+ 7855, 7868, 7876, 7876, 7874, 7870, 7883, 7883, 7865, 7826,
+ 7869, 7846, 7871, 7855, 7877, 7877, 8042, 8042, 7873, 8047,
+ 8047, 7846, 7866, 7855, 7868, 7876, 7878, 7874, 7870, 7885,
+
+ 7885, 7878, 7878, 7877, 7869, 7883, 7871, 7879, 0, 7881,
+ 7882, 7873, 7879, 7879, 7881, 7881, 7882, 7882, 7876, 7884,
+ 7884, 0, 7885, 0, 7878, 7887, 7887, 7877, 7883, 7888,
+ 7888, 7879, 7882, 7890, 7890, 7889, 7889, 7881, 7892, 7892,
+ 7915, 7915, 0, 7882, 7996, 7885, 0, 7878, 7884, 7887,
+ 7996, 7996, 7890, 8048, 8048, 7879, 7882, 7888, 7889, 7893,
+ 7881, 7892, 7894, 7915, 7893, 7893, 7882, 7894, 7894, 7896,
+ 0, 7884, 7887, 0, 7896, 7896, 7890, 7895, 0, 7894,
+ 7888, 7889, 7895, 7895, 7892, 7897, 7915, 7893, 7902, 0,
+ 7897, 7897, 7898, 7902, 7902, 7895, 7900, 7898, 7898, 0,
+
+ 7896, 7900, 7900, 7894, 0, 7905, 7909, 7909, 7902, 0,
+ 7893, 7905, 7905, 7897, 7910, 7910, 7898, 7912, 7912, 7895,
+ 7911, 7911, 7908, 7896, 7900, 7913, 7913, 7905, 7908, 7908,
+ 8049, 8049, 7902, 7942, 7942, 7909, 7897, 0, 7905, 7911,
+ 7898, 7916, 7916, 7910, 7908, 0, 7912, 7900, 0, 7913,
+ 0, 7905, 7914, 7914, 0, 7908, 7942, 0, 7909, 0,
+ 7916, 7905, 0, 7911, 7917, 7917, 7910, 7921, 7908, 7912,
+ 7917, 7917, 7913, 7921, 7921, 7931, 7931, 7918, 7908, 7942,
+ 7914, 7998, 7918, 7918, 7916, 7919, 7917, 7998, 7998, 7921,
+ 7919, 7919, 7920, 7920, 8050, 8050, 7922, 7917, 7920, 7920,
+
+ 7921, 7922, 7922, 7914, 7931, 7933, 7933, 8051, 8051, 0,
+ 7917, 7918, 7923, 7921, 7920, 0, 7924, 7923, 7923, 7919,
+ 7917, 7924, 7924, 7921, 7922, 7920, 7925, 7931, 0, 7923,
+ 7926, 7925, 7925, 7933, 7918, 7926, 7926, 0, 7920, 7932,
+ 7932, 0, 7919, 0, 7929, 7924, 7927, 7922, 7920, 7929,
+ 7929, 7927, 7927, 7923, 7930, 7930, 7933, 0, 7926, 7925,
+ 7935, 7940, 7940, 7932, 0, 7935, 7935, 0, 7924, 7936,
+ 7927, 7937, 7929, 7930, 7936, 7936, 7937, 7937, 0, 7938,
+ 0, 7926, 7925, 0, 7938, 7938, 7932, 7941, 7941, 7935,
+ 7940, 7944, 7944, 0, 7927, 7929, 0, 7930, 7939, 7937,
+
+ 7945, 7945, 7936, 7938, 7939, 7939, 7943, 7943, 0, 7946,
+ 7946, 0, 7935, 7940, 0, 7944, 7941, 0, 7943, 0,
+ 7939, 0, 7937, 7949, 7949, 7936, 0, 7938, 7945, 7947,
+ 7947, 7939, 7946, 8053, 8053, 7950, 8173, 8173, 7944, 7941,
+ 7950, 7950, 7943, 8020, 7939, 0, 7949, 7951, 7947, 8020,
+ 8020, 7945, 7951, 7951, 7939, 7946, 7952, 0, 7960, 7960,
+ 7953, 7952, 7952, 7950, 7951, 7953, 7953, 7961, 7961, 7949,
+ 0, 7954, 7947, 7955, 7952, 7957, 7954, 7954, 7955, 7955,
+ 7957, 7957, 7960, 0, 7959, 0, 7950, 0, 7951, 7959,
+ 7959, 7953, 7962, 7962, 0, 7961, 0, 7955, 7952, 7954,
+
+ 7963, 7963, 7964, 7957, 7959, 7960, 0, 7964, 7964, 7969,
+ 7969, 7965, 7992, 7992, 7953, 7962, 7965, 7965, 7961, 7963,
+ 0, 7955, 7954, 7968, 7968, 7992, 7957, 7967, 7959, 0,
+ 7964, 0, 7967, 7967, 0, 7965, 8052, 7969, 7962, 7970,
+ 7970, 8052, 8052, 7963, 7971, 7971, 7972, 7968, 0, 7992,
+ 0, 7972, 7972, 7964, 0, 7967, 7990, 7990, 0, 7965,
+ 7969, 8061, 7970, 7971, 7991, 7991, 7973, 8061, 8061, 0,
+ 7968, 7973, 7973, 0, 7972, 7975, 7991, 0, 7967, 7990,
+ 7975, 7975, 7984, 7984, 0, 7970, 7985, 7971, 7984, 7984,
+ 7973, 7984, 7985, 7985, 7984, 7985, 0, 7972, 7985, 0,
+
+ 7991, 0, 7990, 7975, 8004, 8004, 7995, 7995, 0, 0,
+ 8004, 8004, 0, 0, 7973, 8006, 8006, 7989, 0, 7993,
+ 7993, 8006, 8006, 7989, 7989, 7995, 7975, 7987, 7987, 7987,
+ 7987, 7987, 7987, 7987, 7987, 7987, 7987, 7987, 7987, 7989,
+ 7987, 7987, 7987, 7987, 7987, 7993, 7999, 7999, 0, 7995,
+ 7989, 8008, 8008, 8029, 8029, 0, 0, 8008, 8008, 8029,
+ 8029, 7999, 0, 7989, 7994, 7994, 0, 7987, 7993, 8031,
+ 8031, 8039, 8039, 7989, 8063, 8031, 8031, 8039, 8039, 0,
+ 8063, 8063, 0, 0, 0, 7999, 0, 7994, 7997, 7997,
+ 7987, 7988, 7988, 7988, 7988, 7988, 7988, 7988, 7988, 7988,
+
+ 7988, 7988, 7988, 7988, 7988, 7988, 7988, 7988, 7988, 8000,
+ 7994, 7997, 8001, 0, 8000, 8000, 8002, 8001, 8001, 8003,
+ 0, 8002, 8002, 0, 8003, 8003, 0, 8000, 8011, 8011,
+ 8005, 7988, 8007, 0, 7997, 8005, 8005, 8007, 8007, 0,
+ 8009, 8012, 8012, 8001, 0, 0, 8009, 8009, 8003, 8002,
+ 0, 8000, 8007, 0, 7988, 8014, 8014, 8011, 8005, 8017,
+ 8017, 8013, 8009, 8015, 8015, 0, 8001, 8013, 8013, 0,
+ 8012, 8003, 8002, 8009, 0, 8015, 8007, 0, 8014, 0,
+ 8011, 8005, 0, 8013, 8016, 8016, 8009, 8017, 8018, 8018,
+ 8019, 8019, 0, 8012, 8013, 0, 8009, 8021, 8021, 8015,
+
+ 8023, 8014, 8033, 8033, 0, 8023, 8023, 8013, 8016, 8019,
+ 8017, 8018, 0, 8024, 0, 8022, 8022, 8013, 8024, 8024,
+ 8021, 8022, 8022, 8036, 8036, 0, 8033, 0, 8023, 0,
+ 8024, 8016, 0, 8019, 8018, 8025, 0, 8022, 0, 8026,
+ 8025, 8025, 8036, 8021, 8026, 8026, 8034, 8034, 8022, 8033,
+ 8027, 8023, 8028, 8025, 8024, 8027, 8027, 8028, 8028, 8030,
+ 0, 8022, 8032, 0, 8030, 8030, 8036, 8032, 8032, 0,
+ 8026, 8022, 8035, 8035, 8034, 8037, 8028, 8025, 8027, 0,
+ 8037, 8037, 8032, 8038, 0, 8040, 0, 8030, 8038, 8038,
+ 8040, 8040, 0, 8026, 0, 8035, 0, 8034, 8069, 8069,
+
+ 8028, 8027, 0, 8037, 8069, 8069, 8032, 8038, 8071, 8071,
+ 8030, 8055, 8055, 8040, 8071, 8071, 0, 0, 8035, 0,
+ 8056, 8056, 8057, 8057, 0, 0, 8037, 0, 0, 8058,
+ 8058, 8038, 8056, 0, 8055, 8057, 8040, 8041, 8041, 8041,
+ 8041, 8041, 8041, 8041, 8041, 8041, 8041, 8041, 8041, 8041,
+ 8041, 8041, 8041, 8041, 8041, 8058, 8056, 8055, 8076, 8057,
+ 8073, 8073, 8078, 8078, 8076, 8076, 8073, 8073, 8078, 8078,
+ 0, 0, 0, 8059, 8059, 0, 8084, 8041, 8058, 0,
+ 8060, 8060, 8084, 8084, 0, 0, 8080, 8080, 0, 8067,
+ 0, 8054, 8080, 8080, 8067, 8067, 8059, 8054, 8054, 8060,
+
+ 8041, 8043, 8043, 8043, 8043, 8043, 8043, 8043, 8043, 8043,
+ 8043, 8043, 8043, 8054, 8043, 8043, 8043, 8043, 8043, 8059,
+ 8064, 8064, 8067, 8060, 8054, 8086, 8086, 8088, 8088, 0,
+ 0, 8086, 8086, 8088, 8088, 8064, 8096, 8054, 8062, 8062,
+ 0, 8043, 8096, 8096, 8065, 8067, 0, 8054, 8098, 8065,
+ 8065, 0, 8066, 0, 8098, 8098, 0, 8066, 8066, 8064,
+ 0, 8062, 8065, 0, 8043, 8044, 8044, 8044, 8044, 8044,
+ 8044, 8044, 8044, 8044, 8044, 8044, 8044, 8044, 8044, 8044,
+ 8044, 8044, 8044, 8066, 8062, 0, 8065, 8091, 8091, 8068,
+ 0, 0, 8102, 0, 8068, 8068, 8070, 8102, 8102, 8091,
+
+ 0, 8070, 8070, 8074, 8074, 8044, 8066, 8072, 8104, 8104,
+ 8106, 8106, 8072, 8072, 8104, 8104, 8106, 8106, 8068, 0,
+ 0, 8110, 8110, 8091, 8070, 8102, 8074, 8072, 8044, 8045,
+ 8045, 8045, 8045, 8045, 8045, 8045, 8045, 8045, 8045, 8045,
+ 8045, 8068, 8045, 8045, 8045, 8045, 8045, 8070, 8102, 8074,
+ 8110, 8072, 8108, 8108, 8092, 8092, 8118, 0, 8108, 8108,
+ 0, 0, 8118, 8118, 0, 8077, 8077, 8092, 0, 8045,
+ 8075, 8075, 0, 8110, 8126, 8126, 8128, 8128, 8136, 8136,
+ 8126, 8126, 8128, 8128, 8136, 8136, 0, 0, 8077, 8075,
+ 0, 8092, 8045, 8046, 8046, 8046, 8046, 8046, 8046, 8046,
+
+ 8046, 8046, 8046, 8046, 8046, 8046, 8046, 8046, 8046, 8046,
+ 8046, 8077, 8079, 8075, 8081, 8082, 8082, 8079, 8079, 8081,
+ 8081, 8087, 8083, 8083, 8085, 8085, 8087, 8087, 0, 0,
+ 8089, 8090, 8090, 8046, 8081, 8089, 8089, 0, 8082, 0,
+ 8079, 8083, 8093, 8093, 8094, 8094, 0, 8085, 0, 8087,
+ 8089, 0, 8095, 8095, 8090, 0, 8046, 0, 8081, 8097,
+ 8097, 8082, 0, 8079, 0, 8083, 0, 8094, 8093, 8144,
+ 8085, 8095, 8087, 0, 8089, 8144, 8144, 8090, 8099, 8099,
+ 8100, 0, 8097, 8101, 0, 8100, 8100, 0, 8101, 8101,
+ 8094, 8093, 0, 8099, 8103, 8095, 8105, 8109, 8100, 8103,
+
+ 8103, 8105, 8105, 8109, 8109, 8097, 8107, 8111, 8111, 8112,
+ 8112, 8107, 8107, 0, 8101, 8113, 8113, 8099, 0, 8109,
+ 8114, 8114, 8100, 8103, 8105, 0, 8107, 8113, 8115, 8115,
+ 8109, 0, 8112, 0, 8116, 8116, 8111, 8101, 0, 8117,
+ 8117, 8119, 8119, 8109, 8114, 0, 8103, 8105, 0, 0,
+ 8107, 8113, 0, 8109, 0, 8112, 8115, 8116, 8117, 8111,
+ 8120, 0, 8133, 8133, 8119, 8120, 8120, 8114, 8121, 8131,
+ 8131, 8122, 0, 8121, 8121, 0, 8122, 8122, 8124, 8115,
+ 8116, 8133, 8117, 8124, 8124, 8121, 8123, 8119, 8120, 8122,
+ 8125, 8123, 8123, 8127, 0, 8125, 8125, 8131, 8127, 8127,
+
+ 8130, 8130, 8129, 8132, 8132, 8133, 8124, 8129, 8129, 8121,
+ 8135, 8120, 0, 8122, 8125, 8135, 8135, 8123, 8138, 8138,
+ 8131, 8127, 8129, 0, 8130, 8134, 8132, 8137, 0, 8124,
+ 8134, 8134, 8137, 8137, 8135, 0, 8139, 8139, 8125, 0,
+ 8123, 8138, 8141, 8141, 8127, 0, 8129, 8130, 8139, 8132,
+ 8140, 8140, 0, 8134, 0, 8137, 8142, 8142, 8135, 8145,
+ 8145, 8143, 8143, 8140, 8138, 8326, 8326, 8146, 8141, 8147,
+ 8147, 0, 8139, 8146, 8146, 0, 8134, 0, 8137, 8142,
+ 8143, 0, 8145, 8148, 8147, 8181, 8181, 8140, 8148, 8148,
+ 8149, 8141, 0, 8150, 8326, 8149, 8149, 0, 8150, 8150,
+
+ 8181, 8148, 8142, 0, 8143, 8145, 8151, 0, 8147, 8152,
+ 8152, 8151, 8151, 8153, 0, 8152, 8152, 8326, 8153, 8153,
+ 0, 8149, 8154, 8154, 8181, 8148, 8150, 8155, 8154, 8154,
+ 8156, 8156, 8155, 8155, 0, 8151, 8156, 8156, 8157, 8157,
+ 0, 8153, 8160, 8160, 8149, 0, 8159, 8155, 0, 8150,
+ 8158, 8158, 8159, 8159, 8162, 0, 8161, 8161, 8151, 8162,
+ 8162, 8157, 8161, 8161, 8153, 8160, 8163, 8163, 0, 8158,
+ 8164, 8155, 8163, 8163, 0, 8164, 8164, 8165, 8165, 8166,
+ 8166, 0, 8162, 0, 8157, 8167, 8168, 8168, 8160, 0,
+ 8164, 8167, 8167, 8158, 0, 8169, 8169, 0, 8166, 0,
+
+ 8165, 8169, 8169, 8175, 8175, 8162, 8170, 8174, 8174, 8168,
+ 8172, 8170, 8170, 0, 8164, 8172, 8172, 0, 8171, 8171,
+ 8174, 0, 8166, 8165, 8171, 8171, 0, 8176, 8176, 8175,
+ 8172, 8178, 8168, 0, 8170, 8177, 8177, 8178, 8178, 8179,
+ 8179, 8180, 0, 8182, 8174, 0, 0, 8180, 8180, 8182,
+ 8182, 0, 8175, 0, 8172, 8176, 0, 8170, 8183, 8177,
+ 8184, 0, 8179, 8183, 8183, 8184, 8184, 0, 8185, 0,
+ 8186, 0, 0, 8185, 8185, 8186, 8186, 8190, 8176, 0,
+ 8187, 8187, 8177, 8190, 8190, 8179, 8187, 8187, 8188, 8184,
+ 0, 8183, 8185, 8188, 8188, 8189, 8189, 8191, 8191, 8190,
+
+ 0, 8189, 8189, 0, 8186, 8192, 8192, 0, 8188, 0,
+ 8190, 0, 8184, 0, 8183, 0, 8185, 8192, 8193, 8193,
+ 8191, 8194, 8194, 8190, 0, 8195, 8195, 8186, 8198, 8198,
+ 8197, 8193, 8188, 8190, 8196, 8196, 8197, 8197, 8199, 8200,
+ 8200, 8192, 0, 8191, 8199, 8199, 0, 8194, 8195, 8223,
+ 8223, 8198, 0, 8196, 8200, 8193, 0, 8201, 0, 8202,
+ 0, 8203, 8201, 8201, 8202, 8202, 8203, 8203, 0, 0,
+ 8194, 8195, 0, 8223, 8198, 8201, 8204, 8196, 8200, 8205,
+ 8205, 8204, 8204, 8206, 0, 8205, 8205, 0, 8206, 8206,
+ 8202, 8207, 8207, 0, 8203, 8208, 8223, 8207, 8207, 8201,
+
+ 8208, 8208, 8209, 8209, 0, 8204, 8210, 8210, 8209, 8209,
+ 0, 8206, 0, 8202, 8212, 8208, 0, 8203, 8211, 8211,
+ 8212, 8212, 8213, 8213, 8214, 8214, 0, 8215, 8204, 8210,
+ 8214, 8214, 8215, 8215, 8206, 8216, 8216, 8211, 8217, 8208,
+ 0, 8216, 8216, 8217, 8217, 8213, 8221, 8221, 0, 0,
+ 8224, 0, 8210, 8222, 8222, 8215, 8224, 8224, 8217, 0,
+ 8226, 8211, 0, 8228, 8220, 8220, 8226, 8226, 8213, 8228,
+ 8228, 0, 8221, 0, 0, 0, 0, 8220, 8215, 8225,
+ 8225, 8222, 8217, 8218, 8218, 8218, 8218, 8218, 8218, 8218,
+ 8218, 8218, 8218, 8218, 8218, 8221, 8218, 8218, 8218, 8218,
+
+ 8218, 8220, 8225, 0, 8222, 8227, 8227, 0, 0, 8229,
+ 0, 8233, 8233, 0, 8229, 8229, 8230, 8233, 8233, 0,
+ 8227, 8230, 8230, 8218, 8236, 8225, 8235, 8235, 8239, 8239,
+ 8236, 8236, 8235, 8235, 0, 8232, 0, 0, 0, 0,
+ 8232, 8232, 8229, 8239, 8227, 8230, 8218, 8219, 8219, 8219,
+ 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8219,
+ 8219, 8219, 8219, 8219, 8219, 8229, 8231, 8239, 8230, 8232,
+ 8238, 8231, 8231, 8234, 8237, 8237, 8238, 8238, 8234, 8234,
+ 8241, 0, 8240, 8240, 0, 8241, 8241, 8219, 8240, 8240,
+ 8231, 0, 8232, 8234, 0, 8242, 8242, 8237, 8243, 0,
+
+ 8241, 8242, 8242, 0, 8243, 8243, 8244, 8244, 0, 8245,
+ 8219, 8246, 8246, 8248, 8231, 8245, 8245, 8234, 8248, 8248,
+ 8237, 8247, 8247, 0, 8241, 0, 8246, 8247, 8247, 8244,
+ 8249, 8249, 0, 8248, 8250, 8250, 8249, 8249, 8251, 8251,
+ 8252, 8252, 8253, 8253, 8255, 8255, 0, 8250, 8254, 0,
+ 8246, 0, 8244, 8256, 8254, 8254, 0, 8248, 0, 8256,
+ 8256, 8257, 8257, 8258, 8251, 0, 8253, 8255, 8252, 8258,
+ 8258, 8250, 8259, 0, 8260, 8272, 8257, 8259, 8259, 8260,
+ 8260, 8272, 8272, 8266, 8266, 0, 0, 8251, 8261, 8253,
+ 8255, 8252, 0, 8261, 8261, 0, 8262, 0, 8268, 8268,
+
+ 8257, 8262, 8262, 8260, 8264, 8259, 8266, 8263, 8263, 8264,
+ 8264, 8268, 8261, 8263, 8263, 8265, 8265, 8269, 8269, 8267,
+ 8267, 8265, 8265, 0, 8264, 0, 8260, 0, 8259, 8266,
+ 8262, 8267, 0, 8270, 8270, 8268, 8261, 0, 8271, 8271,
+ 8273, 8273, 0, 8269, 8274, 8275, 8275, 0, 8264, 0,
+ 8274, 8274, 0, 8262, 0, 8267, 8270, 8271, 0, 8276,
+ 8275, 0, 8277, 8273, 8276, 8276, 8269, 8277, 8277, 8278,
+ 0, 8285, 8285, 0, 8278, 8278, 0, 8276, 0, 8270,
+ 0, 8271, 8279, 0, 8275, 0, 8273, 8279, 8279, 8280,
+ 8280, 0, 8281, 8277, 8285, 8280, 8280, 8281, 8281, 8282,
+
+ 8282, 8276, 8278, 8283, 0, 8282, 8282, 0, 8283, 8283,
+ 0, 8279, 8284, 8284, 8286, 8286, 8277, 8285, 8284, 8284,
+ 8281, 8287, 0, 8283, 0, 8278, 0, 8287, 8287, 8288,
+ 8288, 8289, 8289, 8286, 8279, 8290, 0, 8289, 8289, 0,
+ 8290, 8290, 0, 8281, 8291, 8291, 0, 8283, 8292, 0,
+ 8291, 8291, 8288, 8292, 8292, 8294, 8294, 8286, 8293, 8293,
+ 8295, 8295, 0, 8290, 0, 8296, 8296, 8297, 8292, 8300,
+ 8300, 8293, 8299, 8297, 8297, 8288, 8298, 8298, 8299, 8299,
+ 0, 8294, 0, 0, 8300, 8302, 8290, 8301, 8295, 8296,
+ 8302, 8302, 8292, 8301, 8301, 8293, 8303, 0, 0, 8298,
+
+ 8307, 8303, 8303, 0, 8294, 8307, 8307, 0, 8300, 8304,
+ 8309, 8295, 8296, 0, 8304, 8304, 8309, 8309, 8302, 0,
+ 8307, 8305, 8298, 8306, 8306, 8303, 8305, 8305, 0, 8306,
+ 8306, 8308, 8308, 8304, 0, 8310, 8310, 8308, 8308, 8311,
+ 0, 8302, 0, 0, 8307, 8311, 8311, 0, 8303, 8312,
+ 8312, 8317, 8317, 8313, 8313, 8305, 8314, 8304, 8310, 8313,
+ 8313, 8314, 8314, 8316, 8312, 8315, 8315, 8319, 8319, 8316,
+ 8316, 8315, 8315, 8318, 8317, 0, 8314, 0, 8305, 8318,
+ 8318, 8310, 8319, 8320, 8320, 8323, 8323, 8321, 8312, 8320,
+ 8320, 0, 8321, 8321, 0, 8322, 8322, 8317, 8324, 8324,
+
+ 8314, 8322, 8322, 8327, 8325, 8325, 8319, 8321, 8329, 8327,
+ 8327, 8328, 8328, 8323, 8329, 8329, 8336, 8336, 0, 8330,
+ 0, 0, 8324, 8325, 8330, 8330, 8328, 8331, 0, 8332,
+ 0, 8321, 8331, 8331, 8332, 8332, 8323, 0, 8337, 8337,
+ 8335, 8335, 8336, 8330, 0, 8324, 8333, 8325, 8334, 8334,
+ 8328, 8333, 8333, 8335, 8334, 8334, 8338, 8338, 8332, 8340,
+ 8340, 8331, 8339, 0, 8341, 8336, 8337, 8330, 8339, 8339,
+ 8341, 8341, 8342, 8342, 8352, 8352, 0, 8335, 0, 8333,
+ 8338, 8332, 8340, 0, 8331, 8343, 0, 8342, 8344, 8337,
+ 8345, 8343, 8343, 8344, 8344, 8345, 8345, 8352, 0, 0,
+
+ 0, 8346, 8333, 8338, 8347, 8340, 8346, 8346, 8349, 8347,
+ 8347, 8342, 0, 8349, 8349, 0, 8348, 8348, 0, 8345,
+ 8352, 8344, 8348, 8348, 8351, 8346, 8350, 8350, 8349, 8353,
+ 8351, 8351, 8350, 8350, 0, 8353, 8353, 0, 8347, 8354,
+ 8354, 0, 8345, 0, 8344, 8363, 8363, 8358, 8358, 8346,
+ 8355, 8355, 8349, 8356, 8354, 0, 8355, 8355, 8356, 8356,
+ 8363, 8347, 8357, 8357, 8359, 8359, 8360, 8360, 8357, 8357,
+ 8361, 8361, 0, 8356, 8362, 8358, 8364, 0, 8354, 0,
+ 8362, 8362, 8364, 8364, 8363, 8360, 8365, 0, 8359, 8366,
+ 0, 8365, 8365, 0, 8366, 8366, 8367, 8356, 8358, 8361,
+
+ 8368, 8367, 8367, 0, 0, 8368, 8368, 8369, 8369, 8360,
+ 8365, 8359, 8370, 8369, 8369, 8371, 8371, 0, 8370, 8370,
+ 8372, 0, 8361, 8366, 0, 8367, 8372, 8372, 0, 8374,
+ 8371, 8373, 8373, 8368, 8365, 8374, 8374, 8373, 8373, 0,
+ 8375, 8375, 0, 8376, 8378, 8378, 8366, 0, 8367, 8376,
+ 8376, 8377, 8377, 0, 8371, 8375, 8368, 8377, 8377, 8379,
+ 8379, 8380, 8380, 8381, 8381, 8393, 8393, 8382, 0, 8383,
+ 8383, 8384, 8378, 8382, 8382, 0, 8385, 8384, 8384, 8375,
+ 8380, 8385, 8385, 8379, 8383, 8386, 8390, 8390, 8387, 8393,
+ 8386, 8386, 8381, 8387, 8387, 8378, 8388, 8392, 8392, 8390,
+
+ 8385, 8388, 8388, 0, 8380, 0, 8379, 8394, 8383, 8391,
+ 8391, 0, 8393, 8394, 8394, 8381, 0, 8387, 0, 8386,
+ 8389, 8389, 0, 8390, 8385, 8392, 8389, 8389, 8399, 8388,
+ 8395, 8395, 8396, 8399, 8399, 8391, 8397, 8397, 8396, 8396,
+ 8387, 8400, 8386, 8398, 0, 0, 8400, 8400, 8392, 8398,
+ 8398, 8397, 8388, 8395, 8401, 0, 0, 8402, 8391, 8401,
+ 8401, 8399, 8402, 8402, 0, 8403, 8403, 0, 8404, 0,
+ 8400, 8403, 8403, 8404, 8404, 8397, 8395, 0, 8401, 8405,
+ 8405, 8407, 8407, 8406, 8399, 8405, 8405, 0, 8404, 8406,
+ 8406, 8402, 8408, 8400, 8409, 8409, 8413, 8413, 8408, 8408,
+
+ 8410, 8410, 8401, 0, 8407, 8411, 8410, 8410, 0, 8409,
+ 8411, 8411, 8404, 0, 8402, 8412, 8412, 8414, 8414, 8415,
+ 8415, 8412, 8412, 0, 8413, 8411, 0, 8407, 8416, 8416,
+ 8417, 8418, 8418, 8409, 8420, 0, 8417, 8417, 8415, 8420,
+ 8420, 8414, 0, 0, 8419, 0, 8418, 8413, 0, 8411,
+ 8419, 8419, 0, 0, 8421, 0, 0, 8416, 8420, 8421,
+ 8421, 8422, 8415, 8423, 8414, 0, 8422, 8422, 8423, 8423,
+ 8418, 8424, 8424, 8433, 8433, 0, 0, 8424, 8424, 8425,
+ 8416, 0, 8420, 8426, 8426, 8425, 8425, 8427, 8421, 0,
+ 8422, 0, 8433, 8427, 8427, 8429, 8423, 0, 8426, 8428,
+
+ 8428, 8429, 8429, 8430, 8430, 8428, 8428, 0, 8431, 8434,
+ 8434, 8421, 0, 8422, 8431, 8431, 8433, 0, 8430, 8423,
+ 8432, 8432, 8426, 8435, 8435, 8437, 8432, 8432, 8436, 8436,
+ 8438, 8437, 8437, 0, 8439, 8438, 8438, 0, 8434, 8439,
+ 8439, 0, 8430, 8440, 0, 8441, 0, 8435, 8440, 8440,
+ 8441, 8441, 8442, 8442, 8443, 8443, 8436, 8444, 8444, 8438,
+ 0, 8434, 8445, 8445, 0, 0, 8446, 8439, 0, 8441,
+ 8435, 8440, 8446, 8446, 8447, 8447, 8444, 8448, 8443, 8436,
+ 8442, 8449, 8438, 8448, 8448, 0, 8449, 8449, 0, 8447,
+ 8439, 8445, 8450, 8441, 8440, 8461, 8461, 8450, 8450, 0,
+
+ 8444, 8443, 8451, 8442, 8452, 8449, 0, 8451, 8451, 8452,
+ 8452, 8453, 8453, 8447, 8445, 8454, 0, 8453, 8453, 8455,
+ 8455, 8454, 8454, 8461, 8458, 8458, 8450, 8459, 8459, 8449,
+ 0, 8451, 8456, 0, 8455, 8457, 8457, 8452, 8456, 8456,
+ 0, 8457, 8457, 8458, 8460, 8460, 8461, 8463, 0, 8450,
+ 0, 0, 8463, 8463, 8451, 8462, 8459, 0, 8455, 8464,
+ 8452, 8462, 8462, 8467, 8464, 8464, 8465, 8458, 8460, 8467,
+ 8467, 8465, 8465, 0, 8468, 0, 8463, 8466, 0, 8459,
+ 8468, 8468, 8466, 8466, 8469, 8469, 0, 8470, 8470, 8471,
+ 8471, 8460, 8464, 0, 8465, 8472, 8472, 0, 8473, 8463,
+
+ 0, 8466, 8474, 8469, 8473, 8473, 8476, 8474, 8474, 8478,
+ 8478, 8476, 8476, 8471, 8475, 8464, 8470, 8465, 0, 8475,
+ 8475, 8479, 8479, 8472, 8477, 8466, 0, 8469, 0, 8477,
+ 8477, 8474, 8480, 8480, 8476, 0, 8471, 8478, 0, 8470,
+ 8481, 8481, 0, 8482, 0, 8479, 8472, 8475, 8477, 8482,
+ 8482, 8480, 8483, 8483, 8474, 8484, 0, 8476, 8485, 8490,
+ 8478, 8484, 8484, 8485, 8485, 8490, 8490, 8483, 8479, 8481,
+ 8475, 8486, 8477, 8487, 0, 8480, 8486, 8486, 8487, 8487,
+ 8488, 8492, 8485, 8489, 8489, 8488, 8488, 8492, 8492, 8489,
+ 8489, 8483, 8481, 8491, 8491, 8494, 8494, 8493, 8493, 0,
+
+ 8495, 8495, 8487, 8493, 8493, 8486, 8485, 0, 8491, 8496,
+ 8496, 8497, 8497, 8488, 8494, 8498, 8506, 8506, 8499, 0,
+ 8503, 8498, 8498, 8499, 8499, 8487, 8503, 8503, 8486, 8495,
+ 8507, 8507, 8491, 8496, 0, 8500, 8488, 8501, 8494, 8497,
+ 8500, 8500, 8501, 8501, 8506, 8502, 0, 8499, 8504, 0,
+ 8502, 8502, 8495, 8507, 8504, 8504, 8496, 8505, 8505, 8508,
+ 8508, 0, 8497, 8513, 8513, 8501, 8509, 8506, 8500, 8502,
+ 8499, 8509, 8509, 0, 8510, 0, 8507, 0, 8508, 8510,
+ 8510, 8505, 8513, 8511, 8511, 8514, 8514, 0, 8501, 8511,
+ 8511, 8500, 0, 8502, 8509, 8512, 8515, 8515, 8510, 0,
+
+ 8512, 8512, 8508, 8517, 8505, 8522, 8513, 8516, 8516, 8517,
+ 8517, 8522, 8522, 8518, 8514, 0, 0, 8509, 8518, 8518,
+ 8515, 8519, 8510, 8512, 8520, 0, 8519, 8519, 0, 8520,
+ 8520, 8523, 8523, 8521, 0, 8516, 0, 8514, 8521, 8521,
+ 8524, 8524, 8518, 8515, 8525, 8525, 8512, 0, 8532, 8532,
+ 8526, 8526, 8520, 8543, 8519, 8523, 8527, 8521, 8516, 8543,
+ 8543, 8527, 8527, 8531, 8531, 8518, 8530, 8525, 8524, 8526,
+ 0, 8530, 8530, 0, 8528, 8520, 8532, 8519, 8523, 8528,
+ 8528, 8521, 8529, 8529, 8527, 8533, 8533, 8531, 8529, 8529,
+ 8525, 8524, 0, 8526, 8530, 8534, 8534, 8535, 8528, 8532,
+
+ 8540, 8540, 8535, 8535, 8539, 8539, 8536, 8527, 8533, 0,
+ 8531, 8536, 8536, 8538, 8534, 8541, 8541, 8530, 8538, 8538,
+ 8537, 8537, 8528, 8539, 0, 8535, 8537, 8537, 8548, 8540,
+ 8536, 8533, 8542, 8542, 8548, 8548, 0, 8544, 8534, 8541,
+ 8545, 8538, 8544, 8544, 8546, 8545, 8545, 8539, 8535, 8546,
+ 8546, 8547, 8540, 0, 8536, 0, 8547, 8547, 8549, 8549,
+ 8542, 0, 8541, 0, 8538, 0, 8544, 8551, 8551, 8550,
+ 8550, 8559, 8546, 8545, 0, 8547, 0, 8559, 8559, 8552,
+ 8552, 8553, 8549, 8542, 8558, 8558, 8553, 8553, 8554, 8544,
+ 8551, 8557, 8557, 8554, 8554, 8546, 8545, 8550, 8552, 8547,
+
+ 8555, 8555, 0, 8558, 0, 8549, 8555, 8555, 0, 8553,
+ 8556, 0, 8554, 8551, 8557, 8556, 8556, 8560, 8560, 0,
+ 8550, 0, 8552, 8561, 8561, 8565, 8565, 8558, 8562, 8561,
+ 8561, 0, 8553, 8562, 8562, 0, 8554, 8557, 8556, 8564,
+ 8560, 8563, 8563, 0, 8564, 8564, 0, 8563, 8563, 8565,
+ 8566, 8566, 8567, 8567, 8568, 8568, 8562, 8573, 8573, 8564,
+ 8569, 8556, 8570, 8560, 0, 8569, 8569, 8570, 8570, 0,
+ 8571, 8571, 8565, 8568, 0, 8567, 8571, 8571, 8566, 8562,
+ 8573, 8574, 8574, 8564, 8572, 8575, 8570, 0, 8569, 8572,
+ 8572, 8575, 8575, 8576, 8576, 8581, 8581, 8568, 8567, 8578,
+
+ 8574, 8566, 0, 8573, 8578, 8578, 0, 8577, 8577, 0,
+ 8570, 8569, 8572, 8577, 8577, 0, 8576, 8580, 8581, 8579,
+ 8579, 0, 8580, 8580, 8574, 8579, 8579, 8578, 8582, 8582,
+ 8584, 8584, 8590, 8590, 0, 8572, 8583, 8580, 0, 8576,
+ 0, 8581, 8583, 8583, 0, 8585, 8585, 8582, 0, 8586,
+ 8578, 8585, 8585, 8584, 8586, 8586, 8587, 8587, 0, 8588,
+ 8590, 8580, 8587, 8587, 8588, 8588, 8589, 8589, 8591, 8591,
+ 0, 8582, 0, 8592, 8592, 0, 8584, 8586, 0, 8588,
+ 8593, 0, 8594, 8590, 0, 8593, 8593, 8594, 8594, 0,
+ 8589, 8591, 8592, 8596, 0, 8595, 8595, 0, 8596, 8596,
+
+ 8586, 8595, 8595, 8588, 8597, 8597, 8594, 0, 8593, 8598,
+ 8598, 8599, 0, 8589, 8591, 0, 8592, 8599, 8599, 8600,
+ 8600, 8596, 8606, 8606, 0, 0, 0, 8597, 8598, 8602,
+ 8594, 8593, 8601, 8601, 8602, 8602, 8608, 8608, 8601, 8601,
+ 8603, 8603, 8600, 8604, 8596, 8606, 8603, 8603, 8604, 8604,
+ 8597, 8608, 8598, 8605, 0, 8607, 0, 8602, 0, 8605,
+ 8605, 8607, 8607, 8604, 8610, 8600, 8609, 8609, 8606, 8610,
+ 8610, 0, 8609, 8609, 0, 8608, 8611, 8611, 8612, 8612,
+ 8602, 0, 8611, 8611, 8610, 8613, 8613, 8604, 8614, 8615,
+ 8615, 8616, 8616, 8620, 8614, 8614, 0, 8616, 8616, 8620,
+
+ 8620, 8612, 8621, 8621, 8613, 8617, 0, 0, 8610, 0,
+ 8617, 8617, 8615, 8618, 8618, 0, 8619, 0, 0, 8618,
+ 8618, 8619, 8619, 8622, 8612, 8621, 8623, 8623, 8613, 8622,
+ 8622, 8624, 8624, 8617, 8625, 8615, 8619, 8624, 8624, 8625,
+ 8625, 8623, 0, 8626, 8626, 8627, 8628, 8628, 8621, 8626,
+ 8626, 8627, 8627, 0, 8625, 8629, 8617, 8630, 8630, 0,
+ 8619, 8629, 8629, 0, 0, 8623, 0, 8631, 8631, 8628,
+ 8632, 0, 8630, 8631, 8631, 8632, 8632, 0, 8625, 8633,
+ 8633, 8634, 8634, 8635, 8635, 8633, 8633, 8636, 8637, 8637,
+ 8632, 8642, 8628, 8636, 8636, 0, 8630, 8642, 8642, 8638,
+
+ 8638, 0, 8635, 8639, 8634, 8638, 8638, 0, 8639, 8639,
+ 0, 8637, 8640, 8640, 8632, 8641, 8643, 8643, 8640, 8640,
+ 8641, 8641, 8644, 0, 0, 0, 8635, 8634, 8644, 8644,
+ 0, 8639, 8645, 8645, 8637, 8641, 8646, 8646, 0, 8643,
+ 8647, 0, 8646, 8646, 0, 8647, 8647, 8645, 0, 8648,
+ 8648, 8649, 8650, 8650, 8639, 8648, 8648, 8649, 8649, 8641,
+ 8647, 0, 8643, 8651, 8654, 8654, 0, 8650, 8653, 8651,
+ 8651, 8645, 8652, 8652, 8653, 8653, 8655, 0, 8652, 8652,
+ 8656, 8656, 8655, 8655, 8647, 8661, 8661, 8654, 0, 0,
+ 0, 8650, 8657, 8657, 0, 8656, 8658, 8660, 8657, 8657,
+
+ 8661, 8658, 8658, 8660, 8660, 8659, 8659, 8662, 8665, 8665,
+ 8654, 8659, 8659, 8662, 8662, 0, 8658, 0, 0, 8656,
+ 8663, 8663, 8664, 8665, 8661, 8666, 8663, 8663, 8664, 8664,
+ 0, 8666, 8666, 8669, 8669, 8667, 8667, 8668, 0, 8670,
+ 8658, 8667, 8667, 8668, 8668, 8670, 8670, 8665, 8671, 8671,
+ 0, 8672, 8672, 0, 8673, 0, 8669, 8672, 8672, 8673,
+ 8673, 8674, 8674, 8671, 8675, 8676, 8676, 8674, 8674, 8677,
+ 8675, 8675, 0, 0, 8673, 8677, 8677, 8678, 8678, 8669,
+ 8676, 0, 8679, 8678, 8678, 8680, 0, 8671, 8679, 8679,
+ 8682, 8680, 8680, 8681, 8681, 8684, 8682, 8682, 8673, 8683,
+
+ 8683, 8684, 8684, 8685, 8676, 8683, 8683, 8686, 8681, 8685,
+ 8685, 8687, 8687, 8686, 8686, 8688, 0, 8689, 8689, 0,
+ 0, 8688, 8688, 8689, 8689, 0, 8687, 8690, 0, 8691,
+ 0, 8692, 8681, 8690, 8690, 8691, 8691, 8692, 8692, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8687, 8694, 8694, 8694, 8694, 8694, 8694, 8694, 8694, 8694,
+ 8694, 8694, 8694, 8695, 8695, 8695, 8695, 8695, 8695, 8695,
+ 8695, 8695, 8695, 8695, 8695, 8696, 8696, 8696, 8696, 8696,
+ 8696, 8696, 8696, 8696, 8696, 8696, 8696, 8697, 8697, 8697,
+ 8697, 8697, 8697, 8697, 8697, 8697, 8697, 8697, 8697, 8698,
+
+ 8698, 8698, 8698, 8698, 8698, 8698, 8698, 8698, 8698, 8698,
+ 8698, 8699, 8699, 8699, 8699, 8699, 8699, 8699, 8699, 8699,
+ 8699, 8699, 8699, 8700, 8700, 8700, 8700, 8700, 8700, 8700,
+ 8700, 8700, 8700, 8700, 8700, 8701, 8701, 8701, 8701, 8701,
+ 8701, 8701, 8701, 8701, 8701, 8701, 8701, 8702, 8702, 8702,
+ 8702, 8702, 8702, 8702, 8702, 8702, 8702, 8702, 8702, 8703,
+ 8703, 8703, 8703, 8703, 8703, 8703, 8703, 8703, 8703, 8703,
+ 8703, 8704, 8704, 8704, 8704, 8704, 8704, 8704, 8704, 8704,
+ 8704, 8704, 8704, 8705, 8705, 8705, 8705, 8705, 8705, 8705,
+ 8705, 8705, 8705, 8705, 8705, 8706, 8706, 8706, 8706, 8706,
+
+ 8706, 8706, 8706, 8706, 8706, 8706, 8706, 8707, 8707, 8707,
+ 8707, 8707, 8707, 8707, 8707, 8707, 8707, 8707, 8707, 8708,
+ 8708, 8708, 8708, 8708, 8708, 8708, 8708, 8708, 8708, 8708,
+ 8708, 8709, 8709, 8709, 8709, 8709, 8709, 8709, 8709, 8709,
+ 8709, 8709, 8709, 8710, 8710, 8710, 8710, 8710, 8710, 8710,
+ 8710, 8710, 8710, 8710, 8710, 8711, 8711, 8711, 8711, 8711,
+ 8711, 8711, 8711, 8711, 8711, 8711, 8711, 8712, 8712, 8712,
+ 8712, 8712, 8712, 8712, 8712, 8712, 8712, 8712, 8712, 8713,
+ 8713, 8713, 8713, 8713, 8713, 8713, 8713, 8713, 8713, 8713,
+ 8713, 8714, 8714, 8714, 8714, 8714, 8714, 8714, 8714, 8714,
+
+ 8714, 8714, 8714, 8715, 8715, 8715, 8715, 8715, 8715, 8715,
+ 8715, 8715, 8715, 8715, 8715, 8716, 8716, 8716, 8716, 8716,
+ 8716, 8716, 8716, 8716, 8716, 8716, 8716, 8717, 8717, 8717,
+ 8717, 8717, 8717, 8717, 8717, 8717, 8717, 8717, 8717, 8718,
+ 8718, 8718, 8718, 8718, 8718, 8718, 8718, 8718, 8718, 8718,
+ 8718, 8719, 8719, 8719, 8719, 8719, 8719, 8719, 8719, 8719,
+ 8719, 8719, 8719, 8720, 8720, 8720, 8720, 8720, 8720, 8720,
+ 8720, 8720, 8720, 8720, 8720, 8721, 8721, 8721, 8721, 8721,
+ 8721, 8721, 8721, 8721, 8721, 8721, 8721, 8722, 8722, 8722,
+ 8722, 8722, 8722, 8722, 8722, 8722, 8722, 8722, 8722, 8723,
+
+ 8723, 8723, 8723, 8723, 8723, 8723, 8723, 8723, 8723, 8723,
+ 8723, 8724, 8724, 8724, 8724, 8724, 8724, 8724, 8724, 8724,
+ 8724, 8724, 8724, 8725, 8725, 0, 8725, 8725, 8725, 8725,
+ 8725, 8725, 8725, 0, 8725, 8726, 8726, 8726, 8726, 8726,
+ 8726, 8726, 8726, 8726, 8726, 8726, 8726, 8727, 8727, 8727,
+ 8727, 8727, 8727, 8727, 8727, 8727, 8727, 8727, 8727, 8728,
+ 0, 0, 0, 8728, 0, 0, 8728, 8729, 8729, 8729,
+ 8729, 8729, 8729, 8729, 8729, 8729, 8729, 8729, 8729, 8730,
+ 0, 0, 0, 8730, 0, 0, 8730, 8731, 8731, 8731,
+ 8731, 8731, 8731, 8731, 8731, 8731, 8731, 8731, 8731, 8732,
+
+ 0, 0, 0, 8732, 0, 0, 8732, 8733, 8733, 8733,
+ 8733, 8733, 8733, 8733, 8733, 8733, 8733, 8733, 8733, 8734,
+ 0, 0, 0, 8734, 0, 0, 8734, 8735, 8735, 8735,
+ 8735, 8735, 8735, 8735, 8735, 8735, 8735, 8735, 8735, 8736,
+ 0, 0, 0, 8736, 0, 0, 8736, 8737, 8737, 8737,
+ 8737, 8737, 8737, 8737, 8737, 8737, 8737, 8737, 8737, 8738,
+ 0, 0, 0, 8738, 0, 0, 8738, 8739, 8739, 8739,
+ 8739, 8739, 8739, 8739, 8739, 8739, 8739, 8739, 8739, 8740,
+ 8740, 8740, 8740, 8740, 8740, 8740, 8740, 8740, 8740, 8740,
+ 8740, 8741, 8741, 8741, 8741, 8741, 8741, 8741, 8741, 8741,
+
+ 8741, 8741, 8741, 8742, 8742, 8742, 8742, 8742, 8742, 8742,
+ 8742, 8742, 8742, 8742, 8742, 8743, 8743, 8743, 8743, 8743,
+ 8743, 8743, 8743, 8743, 8743, 8743, 8743, 8744, 0, 0,
+ 0, 8744, 0, 0, 8744, 8745, 8745, 8745, 8745, 8745,
+ 8745, 8745, 8745, 8745, 8745, 8745, 8745, 8746, 0, 0,
+ 0, 8746, 0, 0, 8746, 8747, 8747, 8747, 8747, 8747,
+ 8747, 8747, 8747, 8747, 8747, 8747, 8747, 8748, 0, 0,
+ 8748, 8748, 0, 0, 8748, 8749, 8749, 8749, 8749, 8749,
+ 8749, 8749, 8749, 8749, 8749, 8749, 8749, 8750, 0, 0,
+ 0, 8750, 0, 0, 8750, 8751, 8751, 8751, 8751, 8751,
+
+ 8751, 8751, 8751, 8751, 8751, 8751, 8751, 8752, 0, 0,
+ 0, 8752, 0, 0, 8752, 8753, 8753, 8753, 8753, 8753,
+ 8753, 8753, 8753, 8753, 8753, 8753, 8753, 8754, 8754, 0,
+ 8754, 8754, 8754, 8754, 8754, 8754, 8754, 8754, 8754, 8755,
+ 8755, 0, 8755, 8755, 8755, 8755, 8755, 8755, 8755, 8755,
+ 8755, 8756, 8756, 8756, 8756, 8756, 8756, 8756, 8756, 8756,
+ 8756, 8756, 8756, 8757, 8757, 8757, 8757, 8757, 8757, 8757,
+ 8757, 8757, 8757, 8757, 8757, 8758, 8758, 0, 8758, 8758,
+ 8758, 8758, 8758, 8758, 8758, 8758, 8758, 8759, 8759, 0,
+ 8759, 8759, 8759, 8759, 8759, 8759, 8759, 8759, 8759, 8760,
+
+ 8760, 8760, 8760, 8760, 8760, 8760, 8760, 8760, 8760, 8760,
+ 8760, 8761, 8761, 8761, 8761, 8761, 8761, 8761, 8761, 8761,
+ 8761, 8761, 8761, 8762, 0, 0, 0, 8762, 0, 0,
+ 8762, 8763, 0, 0, 8763, 8764, 8764, 8764, 8764, 8764,
+ 8764, 8764, 8764, 8764, 8764, 8764, 8764, 8765, 8765, 8765,
+ 8765, 8765, 8765, 8765, 8765, 8765, 8765, 8765, 8765, 8766,
+ 0, 0, 0, 8766, 0, 0, 8766, 8767, 0, 0,
+ 8767, 8768, 8768, 8768, 8768, 8768, 8768, 8768, 8768, 8768,
+ 8768, 8768, 8768, 8769, 8769, 8769, 8769, 8769, 8769, 8769,
+ 8769, 8769, 8769, 8769, 8769, 8770, 0, 0, 0, 8770,
+
+ 0, 0, 8770, 8771, 0, 0, 8771, 8772, 8772, 8772,
+ 8772, 8772, 8772, 8772, 8772, 8772, 8772, 8772, 8772, 8773,
+ 8773, 8773, 8773, 8773, 8773, 8773, 8773, 8773, 8773, 8773,
+ 8773, 8774, 8774, 8774, 8774, 8774, 8774, 8774, 8774, 8774,
+ 8774, 8774, 8774, 8775, 8775, 8775, 8775, 8775, 8775, 8775,
+ 8775, 8775, 8775, 8775, 8775, 8776, 0, 0, 0, 8776,
+ 0, 0, 8776, 8777, 0, 0, 8777, 8778, 8778, 8778,
+ 8778, 8778, 8778, 8778, 8778, 8778, 8778, 8778, 8778, 8779,
+ 8779, 8779, 8779, 8779, 8779, 8779, 8779, 8779, 8779, 8779,
+ 8779, 8780, 0, 0, 0, 8780, 0, 0, 8780, 8781,
+
+ 0, 0, 8781, 8782, 8782, 8782, 8782, 8782, 8782, 8782,
+ 8782, 8782, 8782, 8782, 8782, 8783, 8783, 8783, 8783, 8783,
+ 8783, 8783, 8783, 8783, 8783, 8783, 8783, 8784, 8784, 8784,
+ 8784, 8784, 8784, 8784, 8784, 8784, 8784, 8784, 8784, 8785,
+ 0, 0, 0, 8785, 0, 0, 8785, 8786, 0, 0,
+ 8786, 8787, 8787, 8787, 8787, 8787, 8787, 8787, 8787, 8787,
+ 8787, 8787, 8787, 8788, 8788, 8788, 8788, 8788, 8788, 8788,
+ 8788, 8788, 8788, 8788, 8788, 8789, 8789, 8789, 8789, 8789,
+ 8789, 8789, 8789, 8789, 8789, 8789, 8789, 8790, 8790, 8790,
+ 8790, 8790, 8790, 8790, 8790, 8790, 8790, 8790, 8790, 8791,
+
+ 8791, 8791, 8791, 8791, 8791, 8791, 8791, 8791, 8791, 8791,
+ 8791, 8792, 8792, 8792, 8792, 8792, 8792, 8792, 8792, 8792,
+ 8792, 8792, 8792, 8793, 8793, 8793, 8793, 8793, 8793, 8793,
+ 8793, 8793, 8793, 8793, 8793, 8794, 0, 0, 0, 8794,
+ 0, 0, 8794, 8795, 0, 0, 8795, 8796, 8796, 8796,
+ 8796, 8796, 8796, 8796, 8796, 8796, 8796, 8796, 8796, 8797,
+ 8797, 8797, 8797, 8797, 8797, 8797, 8797, 8797, 8797, 8797,
+ 8797, 8798, 0, 0, 0, 8798, 0, 0, 8798, 8799,
+ 0, 0, 8799, 8800, 8800, 0, 0, 8800, 0, 0,
+ 8800, 8800, 8800, 8800, 8800, 8801, 8801, 8801, 8801, 8801,
+
+ 8801, 8801, 8801, 8801, 8801, 8801, 8801, 8802, 8802, 8802,
+ 8802, 8802, 8802, 8802, 8802, 8802, 8802, 8802, 8802, 8803,
+ 8803, 8803, 8803, 8803, 8803, 8803, 8803, 8803, 8803, 8803,
+ 8803, 8804, 0, 0, 8804, 8804, 0, 0, 8804, 8805,
+ 8805, 0, 0, 8805, 8806, 8806, 8806, 8806, 8806, 8806,
+ 8806, 8806, 8806, 8806, 8806, 8806, 8807, 8807, 8807, 8807,
+ 8807, 8807, 8807, 8807, 8807, 8807, 8807, 8807, 8808, 0,
+ 0, 0, 8808, 0, 0, 8808, 8809, 0, 0, 8809,
+ 8810, 8810, 8810, 8810, 8810, 8810, 8810, 8810, 8810, 8810,
+ 8810, 8810, 8811, 8811, 8811, 8811, 8811, 8811, 8811, 8811,
+
+ 8811, 8811, 8811, 8811, 8812, 0, 0, 0, 8812, 0,
+ 0, 8812, 8813, 0, 0, 8813, 8814, 8814, 8814, 8814,
+ 8814, 8814, 8814, 8814, 8814, 8814, 8814, 8814, 8815, 8815,
+ 8815, 8815, 8815, 8815, 8815, 8815, 8815, 8815, 8815, 8815,
+ 8816, 8816, 0, 8816, 8816, 8816, 8816, 8816, 8816, 8816,
+ 8816, 8816, 8817, 8817, 8817, 8817, 8817, 8817, 8817, 8817,
+ 8817, 8817, 8817, 8817, 8818, 8818, 0, 8818, 8818, 8818,
+ 8818, 8818, 8818, 8818, 8818, 8818, 8819, 8819, 8819, 8819,
+ 8819, 8819, 8819, 8819, 8819, 8819, 8819, 8819, 8820, 0,
+ 0, 0, 8820, 0, 0, 8820, 8821, 8821, 8821, 8821,
+
+ 8821, 8821, 8821, 8821, 8821, 8821, 8821, 8821, 8822, 8822,
+ 8822, 8822, 8822, 8822, 8822, 8822, 8822, 8822, 8822, 8822,
+ 8823, 8823, 8823, 8823, 8823, 8823, 8823, 8823, 8823, 8823,
+ 8823, 8823, 8824, 8824, 8824, 8824, 8824, 8824, 8824, 8824,
+ 8824, 8824, 8824, 8824, 8825, 8825, 8825, 8825, 8825, 8825,
+ 8825, 8825, 8825, 8825, 8825, 8825, 8826, 8826, 8826, 8826,
+ 8826, 8826, 8826, 8826, 8826, 8826, 8826, 8826, 8827, 8827,
+ 8827, 8827, 8827, 8827, 8827, 8827, 8827, 8827, 8827, 8827,
+ 8828, 8828, 8828, 8828, 8828, 8828, 8828, 8828, 8828, 8828,
+ 8828, 8828, 8829, 8829, 8829, 8829, 8829, 8829, 8829, 8829,
+
+ 8829, 8829, 8829, 8829, 8830, 8830, 8830, 8830, 8830, 8830,
+ 8830, 8830, 8830, 8830, 8830, 8830, 8831, 8831, 8831, 8831,
+ 8831, 8831, 8831, 8831, 8831, 8831, 8831, 8831, 8832, 8832,
+ 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832, 8832,
+ 8833, 0, 0, 0, 8833, 0, 0, 8833, 8834, 8834,
+ 8834, 8834, 8834, 8834, 8834, 8834, 8834, 8834, 8834, 8834,
+ 8835, 8835, 0, 0, 8835, 0, 0, 8835, 8835, 8835,
+ 8835, 8835, 8836, 0, 0, 0, 8836, 0, 0, 8836,
+ 8837, 8837, 8837, 8837, 8837, 8837, 8837, 8837, 8837, 8837,
+ 8837, 8837, 8838, 8838, 8838, 8838, 8838, 8838, 8838, 8838,
+
+ 8838, 8838, 8838, 8838, 8839, 8839, 8839, 8839, 8839, 8839,
+ 8839, 8839, 8839, 8839, 8839, 8839, 8840, 8840, 8840, 8840,
+ 8840, 8840, 8840, 8840, 8840, 8840, 8840, 8840, 8841, 8841,
+ 8841, 8841, 8841, 8841, 8841, 8841, 8841, 8841, 8841, 8841,
+ 8842, 8842, 0, 8842, 8842, 8842, 8842, 8842, 8842, 8842,
+ 8842, 8842, 8843, 8843, 8843, 8843, 8843, 8843, 8843, 8843,
+ 8843, 8843, 8843, 8843, 8844, 8844, 8844, 8844, 8844, 8844,
+ 8844, 8844, 8844, 8844, 8844, 8844, 8845, 8845, 8845, 8845,
+ 8845, 8845, 8845, 8845, 8845, 8845, 8845, 8845, 8846, 8846,
+ 8846, 8846, 8846, 8846, 8846, 8846, 8846, 8846, 8846, 8846,
+
+ 8847, 8847, 8847, 8847, 8847, 8847, 8847, 8847, 8847, 8847,
+ 8847, 8847, 8848, 0, 0, 8848, 8848, 0, 0, 0,
+ 8848, 0, 8848, 8849, 8849, 8849, 8849, 8849, 8849, 8849,
+ 8849, 8849, 8849, 8849, 8849, 8850, 8850, 8850, 8850, 8850,
+ 8850, 8850, 8850, 8850, 8850, 8850, 8850, 8851, 8851, 8851,
+ 8851, 8851, 8851, 8851, 8851, 8851, 8851, 8851, 8851, 8852,
+ 8852, 8852, 8852, 8852, 8852, 8852, 8852, 8852, 8852, 8852,
+ 8852, 8853, 8853, 8853, 8853, 8853, 8853, 8853, 8853, 8853,
+ 8853, 8853, 8853, 8854, 8854, 8854, 8854, 8854, 8854, 8854,
+ 8854, 8854, 8854, 8854, 8854, 8855, 8855, 8855, 8855, 8855,
+
+ 8855, 8855, 8855, 8855, 8855, 8855, 8855, 8856, 8856, 8856,
+ 8856, 8856, 8856, 8856, 8856, 8856, 8856, 8856, 8856, 8857,
+ 8857, 8857, 8857, 8857, 8857, 8857, 8857, 8857, 8857, 8857,
+ 8857, 8858, 8858, 8858, 8858, 8858, 8858, 8858, 8858, 8858,
+ 8858, 8858, 8858, 8859, 8859, 8859, 8859, 8859, 8859, 8859,
+ 8859, 8859, 8859, 8859, 8859, 8860, 8860, 8860, 8860, 8860,
+ 8860, 8860, 8860, 8860, 8860, 8860, 8860, 8861, 8861, 8861,
+ 8861, 8861, 8861, 8861, 8861, 8861, 8861, 8861, 8861, 8862,
+ 8862, 8862, 8862, 8862, 8862, 8862, 8862, 8862, 8862, 8862,
+ 8862, 8863, 8863, 8863, 8863, 8863, 8863, 8863, 8863, 8863,
+
+ 8863, 8863, 8863, 8864, 8864, 8864, 8864, 8864, 8864, 8864,
+ 8864, 8864, 8864, 8864, 8864, 8865, 8865, 8865, 8865, 8865,
+ 8865, 8865, 8865, 8865, 8865, 8865, 8865, 8866, 8866, 8866,
+ 8866, 8866, 8866, 8866, 8866, 8866, 8866, 8866, 8866, 8867,
+ 8867, 8867, 8867, 8867, 8867, 8867, 8867, 8867, 8867, 8867,
+ 8867, 8868, 8868, 8868, 8868, 8868, 8868, 8868, 8868, 8868,
+ 8868, 8868, 8868, 8869, 8869, 8869, 8869, 8869, 8869, 8869,
+ 8869, 8869, 8869, 8869, 8869, 8870, 8870, 8870, 8870, 8870,
+ 8870, 8870, 8870, 8870, 8870, 8870, 8870, 8871, 8871, 8871,
+ 8871, 8871, 8871, 8871, 8871, 8871, 8871, 8871, 8871, 8872,
+
+ 8872, 8872, 8872, 8872, 8872, 8872, 8872, 8872, 8872, 8872,
+ 8872, 8873, 8873, 8873, 8873, 8873, 8873, 8873, 8873, 8873,
+ 8873, 8873, 8873, 8874, 0, 0, 0, 8874, 0, 0,
+ 8874, 8875, 8875, 8875, 8875, 8875, 8875, 8875, 8875, 8875,
+ 8875, 8875, 8875, 8876, 8876, 8876, 8876, 8876, 8876, 8876,
+ 8876, 8876, 8876, 8876, 8876, 8877, 8877, 8877, 8877, 8877,
+ 8877, 8877, 8877, 8877, 8877, 8877, 8877, 8878, 0, 0,
+ 0, 8878, 0, 0, 8878, 8879, 8879, 8879, 8879, 8879,
+ 8879, 8879, 8879, 8879, 8879, 8879, 8879, 8880, 8880, 8880,
+ 8880, 8880, 8880, 8880, 8880, 8880, 8880, 8880, 8880, 8881,
+
+ 8881, 8881, 8881, 8881, 8881, 8881, 8881, 8881, 8881, 8881,
+ 8881, 8882, 0, 0, 0, 8882, 0, 0, 8882, 8883,
+ 8883, 8883, 8883, 8883, 8883, 8883, 8883, 8883, 8883, 8883,
+ 8883, 8884, 8884, 8884, 8884, 8884, 8884, 8884, 8884, 8884,
+ 8884, 8884, 8884, 8885, 8885, 8885, 8885, 8885, 8885, 8885,
+ 8885, 8885, 8885, 8885, 8885, 8886, 8886, 8886, 8886, 8886,
+ 8886, 8886, 8886, 8886, 8886, 8886, 8886, 8887, 8887, 8887,
+ 8887, 8887, 8887, 8887, 8887, 8887, 8887, 8887, 8887, 8888,
+ 8888, 8888, 8888, 8888, 8888, 8888, 8888, 8888, 8888, 8888,
+ 8888, 8889, 8889, 8889, 8889, 8889, 8889, 8889, 8889, 8889,
+
+ 8889, 8889, 8889, 8890, 8890, 8890, 8890, 8890, 8890, 8890,
+ 8890, 8890, 8890, 8890, 8890, 8891, 8891, 8891, 8891, 8891,
+ 8891, 8891, 8891, 8891, 8891, 8891, 8891, 8892, 8892, 8892,
+ 8892, 8892, 8892, 8892, 8892, 8892, 8892, 8892, 8892, 8893,
+ 8893, 8893, 8893, 8893, 8893, 8893, 8893, 8893, 8893, 8893,
+ 8893, 8894, 8894, 8894, 8894, 8894, 8894, 8894, 8894, 8894,
+ 8894, 8894, 8894, 8895, 8895, 8895, 8895, 8895, 8895, 8895,
+ 8895, 8895, 8895, 8895, 8895, 8896, 8896, 8896, 8896, 8896,
+ 8896, 8896, 8896, 8896, 8896, 8896, 8896, 8897, 8897, 8897,
+ 8897, 8897, 8897, 8897, 8897, 8897, 8897, 8897, 8897, 8898,
+
+ 8898, 8898, 8898, 8898, 8898, 8898, 8898, 8898, 8898, 8898,
+ 8898, 8899, 8899, 8899, 8899, 8899, 8899, 8899, 8899, 8899,
+ 8899, 8899, 8899, 8900, 8900, 8900, 8900, 8900, 8900, 8900,
+ 8900, 8900, 8900, 8900, 8900, 8901, 8901, 8901, 8901, 8901,
+ 8901, 8901, 8901, 8901, 8901, 8901, 8901, 8902, 8902, 8902,
+ 8902, 8902, 8902, 8902, 8902, 8902, 8902, 8902, 8902, 8903,
+ 8903, 8903, 8903, 8903, 8903, 8903, 8903, 8903, 8903, 8903,
+ 8903, 8904, 8904, 8904, 8904, 8904, 8904, 8904, 8904, 8904,
+ 8904, 8904, 8904, 8905, 8905, 8905, 8905, 8905, 8905, 8905,
+ 8905, 8905, 8905, 8905, 8905, 8906, 8906, 8906, 8906, 8906,
+
+ 8906, 8906, 8906, 8906, 8906, 8906, 8906, 8907, 8907, 8907,
+ 8907, 8907, 8907, 8907, 8907, 8907, 8907, 8907, 8907, 8908,
+ 8908, 8908, 8908, 8908, 8908, 8908, 8908, 8908, 8908, 8908,
+ 8908, 8909, 8909, 8909, 8909, 8909, 8909, 8909, 8909, 8909,
+ 8909, 8909, 8909, 8910, 8910, 8910, 8910, 8910, 8910, 8910,
+ 8910, 8910, 8910, 8910, 8910, 8911, 8911, 8911, 8911, 8911,
+ 8911, 8911, 8911, 8911, 8911, 8911, 8911, 8912, 8912, 8912,
+ 8912, 8912, 8912, 8912, 8912, 8912, 8912, 8912, 8912, 8913,
+ 0, 0, 0, 8913, 0, 0, 8913, 8914, 8914, 8914,
+ 8914, 8914, 8914, 8914, 8914, 8914, 8914, 8914, 8914, 8915,
+
+ 8915, 0, 8915, 8915, 8915, 8915, 8915, 8915, 8915, 8915,
+ 8915, 8916, 8916, 8916, 8916, 8916, 8916, 8916, 8916, 8916,
+ 8916, 8916, 8916, 8917, 8917, 8917, 8917, 8917, 8917, 8917,
+ 8917, 8917, 8917, 8917, 8917, 8918, 8918, 8918, 8918, 8918,
+ 8918, 8918, 8918, 8918, 8918, 8918, 8918, 8919, 8919, 8919,
+ 8919, 8919, 8919, 8919, 8919, 8919, 8919, 8919, 8919, 8920,
+ 8920, 8920, 8920, 8920, 8920, 8920, 8920, 8920, 8920, 8920,
+ 8920, 8921, 8921, 8921, 8921, 8921, 8921, 8921, 8921, 8921,
+ 8921, 8921, 8921, 8922, 8922, 8922, 8922, 8922, 8922, 8922,
+ 8922, 8922, 8922, 8922, 8922, 8923, 8923, 8923, 8923, 8923,
+
+ 8923, 8923, 8923, 8923, 8923, 8923, 8923, 8924, 8924, 8924,
+ 8924, 8924, 8924, 8924, 8924, 8924, 8924, 8924, 8924, 8925,
+ 8925, 8925, 8925, 8925, 8925, 8925, 8925, 8925, 8925, 8925,
+ 8925, 8926, 8926, 8926, 8926, 8926, 8926, 8926, 8926, 8926,
+ 8926, 8926, 8926, 8927, 8927, 8927, 8927, 8927, 8927, 8927,
+ 8927, 8927, 8927, 8927, 8927, 8928, 8928, 8928, 8928, 8928,
+ 8928, 8928, 8928, 8928, 8928, 8928, 8928, 8929, 8929, 8929,
+ 8929, 8929, 8929, 8929, 8929, 8929, 8929, 8929, 8929, 8930,
+ 8930, 8930, 8930, 8930, 8930, 8930, 8930, 8930, 8930, 8930,
+ 8930, 8931, 8931, 8931, 8931, 8931, 8931, 8931, 8931, 8931,
+
+ 8931, 8931, 8931, 8932, 8932, 8932, 8932, 8932, 8932, 8932,
+ 8932, 8932, 8932, 8932, 8932, 8933, 0, 0, 0, 8933,
+ 0, 0, 8933, 8934, 8934, 8934, 8934, 8934, 8934, 8934,
+ 8934, 8934, 8934, 8934, 8934, 8935, 8935, 8935, 8935, 8935,
+ 8935, 8935, 8935, 8935, 8935, 8935, 8935, 8936, 8936, 8936,
+ 8936, 8936, 8936, 8936, 8936, 8936, 8936, 8936, 8936, 8937,
+ 8937, 8937, 8937, 8937, 8937, 8937, 8937, 8937, 8937, 8937,
+ 8937, 8938, 8938, 8938, 8938, 8938, 8938, 8938, 8938, 8938,
+ 8938, 8938, 8938, 8939, 8939, 8939, 8939, 8939, 8939, 8939,
+ 8939, 8939, 8939, 8939, 8939, 8940, 8940, 8940, 8940, 8940,
+
+ 8940, 8940, 8940, 8940, 8940, 8940, 8940, 8941, 8941, 8941,
+ 8941, 8941, 8941, 8941, 8941, 8941, 8941, 8941, 8941, 8942,
+ 0, 0, 0, 8942, 0, 0, 8942, 8943, 8943, 8943,
+ 8943, 8943, 8943, 8943, 8943, 8943, 8943, 8943, 8943, 8944,
+ 8944, 8944, 8944, 8944, 8944, 8944, 8944, 8944, 8944, 8944,
+ 8944, 8945, 8945, 8945, 8945, 8945, 8945, 8945, 8945, 8945,
+ 8945, 8945, 8945, 8946, 8946, 8946, 8946, 8946, 8946, 8946,
+ 8946, 8946, 8946, 8946, 8946, 8947, 8947, 8947, 8947, 8947,
+ 8947, 8947, 8947, 8947, 8947, 8947, 8947, 8948, 0, 0,
+ 0, 8948, 0, 0, 8948, 8949, 0, 0, 8949, 8950,
+
+ 0, 0, 0, 8950, 0, 0, 8950, 8951, 8951, 8951,
+ 8951, 8951, 8951, 8951, 8951, 8951, 8951, 8951, 8951, 8952,
+ 8952, 8952, 8952, 8952, 8952, 8952, 8952, 8952, 8952, 8952,
+ 8952, 8953, 8953, 8953, 8953, 8953, 8953, 8953, 8953, 8953,
+ 8953, 8953, 8953, 8954, 0, 0, 8954, 0, 0, 0,
+ 0, 0, 0, 8954, 8955, 8955, 8955, 8955, 8955, 8955,
+ 8955, 8955, 8955, 8955, 8955, 8955, 8956, 8956, 8956, 8956,
+ 8956, 8956, 8956, 8956, 8956, 8956, 8956, 8956, 8957, 8957,
+ 8957, 8957, 8957, 8957, 8957, 8957, 8957, 8957, 8957, 8957,
+ 8958, 8958, 8958, 8958, 8958, 8958, 8958, 8958, 8958, 8958,
+
+ 8958, 8958, 8959, 8959, 8959, 8959, 8959, 8959, 8959, 8959,
+ 8959, 8959, 8959, 8959, 8960, 8960, 8960, 8960, 8960, 8960,
+ 8960, 8960, 8960, 8960, 8960, 8960, 8961, 8961, 8961, 8961,
+ 8961, 8961, 8961, 8961, 8961, 8961, 8961, 8961, 8962, 8962,
+ 8962, 8962, 8962, 8962, 8962, 8962, 8962, 8962, 8962, 8962,
+ 8963, 8963, 8963, 8963, 8963, 8963, 8963, 8963, 8963, 8963,
+ 8963, 8963, 8964, 8964, 8964, 8964, 8964, 8964, 8964, 8964,
+ 8964, 8964, 8964, 8964, 8965, 8965, 8965, 8965, 8965, 8965,
+ 8965, 8965, 8965, 8965, 8965, 8965, 8966, 8966, 8966, 8966,
+ 8966, 8966, 8966, 8966, 8966, 8966, 8966, 8966, 8967, 8967,
+
+ 8967, 8967, 8967, 8967, 8967, 8967, 8967, 8967, 8967, 8967,
+ 8968, 8968, 8968, 8968, 8968, 8968, 8968, 8968, 8968, 8968,
+ 8968, 8968, 8969, 8969, 8969, 8969, 8969, 8969, 8969, 8969,
+ 8969, 8969, 8969, 8969, 8970, 8970, 8970, 8970, 8970, 8970,
+ 8970, 8970, 8970, 8970, 8970, 8970, 8971, 8971, 8971, 8971,
+ 8971, 8971, 8971, 8971, 8971, 8971, 8971, 8971, 8972, 8972,
+ 8972, 8972, 8972, 8972, 8972, 8972, 8972, 8972, 8972, 8972,
+ 8973, 8973, 8973, 8973, 8973, 8973, 8973, 8973, 8973, 8973,
+ 8973, 8973, 8974, 8974, 8974, 8974, 8974, 8974, 8974, 8974,
+ 8974, 8974, 8974, 8974, 8975, 8975, 8975, 8975, 8975, 8975,
+
+ 8975, 8975, 8975, 8975, 8975, 8975, 8976, 8976, 8976, 8976,
+ 8976, 8976, 8976, 8976, 8976, 8976, 8976, 8976, 8977, 8977,
+ 8977, 8977, 8977, 8977, 8977, 8977, 8977, 8977, 8977, 8977,
+ 8978, 8978, 8978, 8978, 8978, 8978, 8978, 8978, 8978, 8978,
+ 8978, 8978, 8979, 8979, 8979, 8979, 8979, 8979, 8979, 8979,
+ 8979, 8979, 8979, 8979, 8980, 8980, 8980, 8980, 8980, 8980,
+ 8980, 8980, 8980, 8980, 8980, 8980, 8981, 8981, 8981, 8981,
+ 8981, 8981, 8981, 8981, 8981, 8981, 8981, 8981, 8982, 8982,
+ 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982, 8982,
+ 8983, 8983, 8983, 8983, 8983, 8983, 8983, 8983, 8983, 8983,
+
+ 8983, 8983, 8984, 8984, 8984, 8984, 8984, 8984, 8984, 8984,
+ 8984, 8984, 8984, 8984, 8985, 8985, 8985, 8985, 8985, 8985,
+ 8985, 8985, 8985, 8985, 8985, 8985, 8986, 8986, 8986, 8986,
+ 8986, 8986, 8986, 8986, 8986, 8986, 8986, 8986, 8987, 8987,
+ 8987, 8987, 8987, 8987, 8987, 8987, 8987, 8987, 8987, 8987,
+ 8988, 8988, 8988, 8988, 8988, 8988, 8988, 8988, 8988, 8988,
+ 8988, 8988, 8989, 8989, 8989, 8989, 8989, 8989, 8989, 8989,
+ 8989, 8989, 8989, 8989, 8990, 8990, 8990, 8990, 8990, 8990,
+ 8990, 8990, 8990, 8990, 8990, 8990, 8991, 8991, 8991, 8991,
+ 8991, 8991, 8991, 8991, 8991, 8991, 8991, 8991, 8992, 8992,
+
+ 8992, 8992, 8992, 8992, 8992, 8992, 8992, 8992, 8992, 8992,
+ 8993, 8993, 8993, 8993, 8993, 8993, 8993, 8993, 8993, 8993,
+ 8993, 8993, 8994, 8994, 8994, 8994, 8994, 8994, 8994, 8994,
+ 8994, 8994, 8994, 8994, 8995, 8995, 8995, 8995, 8995, 8995,
+ 8995, 8995, 8995, 8995, 8995, 8995, 8996, 8996, 8996, 8996,
+ 8996, 8996, 8996, 8996, 8996, 8996, 8996, 8996, 8997, 8997,
+ 8997, 8997, 8997, 8997, 8997, 8997, 8997, 8997, 8997, 8997,
+ 8998, 8998, 8998, 8998, 8998, 8998, 8998, 8998, 8998, 8998,
+ 8998, 8998, 8999, 8999, 8999, 8999, 8999, 8999, 8999, 8999,
+ 8999, 8999, 8999, 8999, 9000, 9000, 9000, 9000, 9000, 9000,
+
+ 9000, 9000, 9000, 9000, 9000, 9000, 9001, 9001, 9001, 9001,
+ 9001, 9001, 9001, 9001, 9001, 9001, 9001, 9001, 9002, 9002,
+ 9002, 9002, 9002, 9002, 9002, 9002, 9002, 9002, 9002, 9002,
+ 9003, 9003, 9003, 9003, 9003, 9003, 9003, 9003, 9003, 9003,
+ 9003, 9003, 9004, 0, 0, 9004, 0, 0, 0, 9004,
+ 0, 0, 9004, 9005, 9005, 9005, 9005, 9005, 9005, 9005,
+ 9005, 9005, 9005, 9005, 9005, 9006, 9006, 9006, 9006, 0,
+ 0, 0, 0, 9006, 0, 9006, 9007, 9007, 0, 9007,
+ 9007, 9007, 9007, 9007, 9007, 9007, 9007, 9007, 9008, 9008,
+ 9008, 9008, 9008, 9008, 9008, 9008, 9008, 9008, 9008, 9008,
+
+ 9009, 9009, 9009, 9009, 9009, 9009, 9009, 9009, 9009, 9009,
+ 9009, 9009, 9010, 9010, 9010, 9010, 9010, 9010, 9010, 9010,
+ 9010, 9010, 9010, 9010, 9011, 9011, 9011, 9011, 9011, 9011,
+ 9011, 9011, 9011, 9011, 9011, 9011, 9012, 9012, 9012, 9012,
+ 9012, 9012, 9012, 9012, 9012, 9012, 9012, 9012, 9013, 9013,
+ 9013, 9013, 9013, 9013, 9013, 9013, 9013, 9013, 9013, 9013,
+ 9014, 9014, 9014, 9014, 9014, 9014, 9014, 9014, 9014, 9014,
+ 9014, 9014, 9015, 9015, 9015, 9015, 9015, 9015, 9015, 9015,
+ 9015, 9015, 9015, 9015, 9016, 9016, 9016, 9016, 9016, 9016,
+ 9016, 9016, 9016, 9016, 9016, 9016, 9017, 9017, 9017, 9017,
+
+ 9017, 9017, 9017, 9017, 9017, 9017, 9017, 9017, 9018, 9018,
+ 9018, 9018, 9018, 9018, 9018, 9018, 9018, 9018, 9018, 9018,
+ 9019, 9019, 9019, 9019, 9019, 9019, 9019, 9019, 9019, 9019,
+ 9019, 9019, 9020, 9020, 9020, 9020, 9020, 9020, 9020, 9020,
+ 9020, 9020, 9020, 9020, 9021, 9021, 9021, 9021, 9021, 9021,
+ 9021, 9021, 9021, 9021, 9021, 9021, 9022, 9022, 9022, 9022,
+ 9022, 9022, 9022, 9022, 9022, 9022, 9022, 9022, 9023, 0,
+ 0, 0, 9023, 0, 0, 9023, 9024, 9024, 9024, 9024,
+ 9024, 9024, 9024, 9024, 9024, 9024, 9024, 9024, 9025, 9025,
+ 9025, 9025, 9025, 9025, 9025, 9025, 9025, 9025, 9025, 9025,
+
+ 9026, 9026, 9026, 9026, 9026, 9026, 9026, 9026, 9026, 9026,
+ 9026, 9026, 9027, 9027, 9027, 9027, 9027, 9027, 9027, 9027,
+ 9027, 9027, 9027, 9027, 9028, 9028, 9028, 9028, 9028, 9028,
+ 9028, 9028, 9028, 9028, 9028, 9028, 9029, 9029, 9029, 9029,
+ 9029, 9029, 9029, 9029, 9029, 9029, 9029, 9029, 9030, 9030,
+ 9030, 9030, 9030, 9030, 9030, 9030, 9030, 9030, 9030, 9030,
+ 9031, 9031, 9031, 9031, 9031, 9031, 9031, 9031, 9031, 9031,
+ 9031, 9031, 9032, 9032, 9032, 9032, 9032, 9032, 9032, 9032,
+ 9032, 9032, 9032, 9032, 9033, 9033, 9033, 9033, 9033, 9033,
+ 9033, 9033, 9033, 9033, 9033, 9033, 9034, 9034, 9034, 9034,
+
+ 9034, 9034, 9034, 9034, 9034, 9034, 9034, 9034, 9035, 9035,
+ 9035, 9035, 9035, 9035, 9035, 9035, 9035, 9035, 9035, 9035,
+ 9036, 9036, 9036, 9036, 9036, 9036, 9036, 9036, 9036, 9036,
+ 9036, 9036, 9037, 9037, 9037, 9037, 9037, 9037, 9037, 9037,
+ 9037, 9037, 9037, 9037, 9038, 0, 0, 0, 9038, 0,
+ 0, 9038, 9039, 9039, 9039, 9039, 9039, 9039, 9039, 9039,
+ 9039, 9039, 9039, 9039, 9040, 9040, 9040, 9040, 9040, 9040,
+ 9040, 9040, 9040, 9040, 9040, 9040, 9041, 9041, 9041, 9041,
+ 9041, 9041, 9041, 9041, 9041, 9041, 9041, 9041, 9042, 9042,
+ 9042, 9042, 9042, 9042, 9042, 9042, 9042, 9042, 9042, 9042,
+
+ 9043, 9043, 9043, 9043, 9043, 9043, 9043, 9043, 9043, 9043,
+ 9043, 9043, 9044, 9044, 9044, 9044, 9044, 9044, 9044, 9044,
+ 9044, 9044, 9044, 9044, 9045, 9045, 9045, 9045, 9045, 9045,
+ 9045, 9045, 9045, 9045, 9045, 9045, 9046, 0, 0, 0,
+ 9046, 0, 0, 9046, 9047, 9047, 9047, 9047, 9047, 9047,
+ 9047, 9047, 9047, 9047, 9047, 9047, 9048, 9048, 9048, 9048,
+ 9048, 9048, 9048, 9048, 9048, 9048, 9048, 9048, 9049, 9049,
+ 9049, 9049, 9049, 9049, 9049, 9049, 9049, 9049, 9049, 9049,
+ 9050, 9050, 9050, 9050, 9050, 9050, 9050, 9050, 9050, 9050,
+ 9050, 9050, 9051, 9051, 9051, 9051, 9051, 9051, 9051, 9051,
+
+ 9051, 9051, 9051, 9051, 9052, 0, 0, 9052, 0, 0,
+ 0, 0, 0, 0, 9052, 9053, 0, 0, 0, 9053,
+ 0, 0, 9053, 9054, 9054, 9054, 9054, 9054, 9054, 9054,
+ 9054, 9054, 9054, 9054, 9054, 9055, 9055, 9055, 9055, 9055,
+ 9055, 9055, 9055, 9055, 9055, 9055, 9055, 9056, 9056, 9056,
+ 9056, 9056, 9056, 9056, 9056, 9056, 9056, 9056, 9056, 9057,
+ 9057, 9057, 9057, 9057, 9057, 9057, 9057, 9057, 9057, 9057,
+ 9057, 9058, 9058, 9058, 9058, 9058, 9058, 9058, 9058, 9058,
+ 9058, 9058, 9058, 9059, 9059, 9059, 9059, 9059, 9059, 9059,
+ 9059, 9059, 9059, 9059, 9059, 9060, 9060, 9060, 9060, 9060,
+
+ 9060, 9060, 9060, 9060, 9060, 9060, 9060, 9061, 9061, 9061,
+ 9061, 9061, 9061, 9061, 9061, 9061, 9061, 9061, 9061, 9062,
+ 9062, 9062, 9062, 9062, 9062, 9062, 9062, 9062, 9062, 9062,
+ 9062, 9063, 9063, 9063, 9063, 9063, 9063, 9063, 9063, 9063,
+ 9063, 9063, 9063, 9064, 9064, 9064, 9064, 9064, 9064, 9064,
+ 9064, 9064, 9064, 9064, 9064, 9065, 9065, 9065, 9065, 9065,
+ 9065, 9065, 9065, 9065, 9065, 9065, 9065, 9066, 9066, 9066,
+ 9066, 9066, 9066, 9066, 9066, 9066, 9066, 9066, 9066, 9067,
+ 9067, 9067, 9067, 9067, 9067, 9067, 9067, 9067, 9067, 9067,
+ 9067, 9068, 9068, 9068, 9068, 9068, 9068, 9068, 9068, 9068,
+
+ 9068, 9068, 9068, 9069, 9069, 9069, 9069, 9069, 9069, 9069,
+ 9069, 9069, 9069, 9069, 9069, 9070, 9070, 9070, 9070, 9070,
+ 9070, 9070, 9070, 9070, 9070, 9070, 9070, 9071, 9071, 9071,
+ 9071, 9071, 9071, 9071, 9071, 9071, 9071, 9071, 9071, 9072,
+ 9072, 9072, 9072, 9072, 9072, 9072, 9072, 9072, 9072, 9072,
+ 9072, 9073, 9073, 9073, 9073, 9073, 9073, 9073, 9073, 9073,
+ 9073, 9073, 9073, 9074, 9074, 9074, 9074, 9074, 9074, 9074,
+ 9074, 9074, 9074, 9074, 9074, 9075, 9075, 9075, 9075, 9075,
+ 9075, 9075, 9075, 9075, 9075, 9075, 9075, 9076, 9076, 9076,
+ 9076, 9076, 9076, 9076, 9076, 9076, 9076, 9076, 9076, 9077,
+
+ 9077, 9077, 9077, 9077, 9077, 9077, 9077, 9077, 9077, 9077,
+ 9077, 9078, 9078, 9078, 9078, 9078, 9078, 9078, 9078, 9078,
+ 9078, 9078, 9078, 9079, 9079, 9079, 9079, 9079, 9079, 9079,
+ 9079, 9079, 9079, 9079, 9079, 9080, 9080, 9080, 9080, 9080,
+ 9080, 9080, 9080, 9080, 9080, 9080, 9080, 9081, 9081, 9081,
+ 9081, 9081, 9081, 9081, 9081, 9081, 9081, 9081, 9081, 9082,
+ 9082, 9082, 9082, 9082, 9082, 9082, 9082, 9082, 9082, 9082,
+ 9082, 9083, 9083, 9083, 9083, 9083, 9083, 9083, 9083, 9083,
+ 9083, 9083, 9083, 9084, 9084, 9084, 9084, 9084, 9084, 9084,
+ 9084, 9084, 9084, 9084, 9084, 9085, 9085, 9085, 9085, 9085,
+
+ 9085, 9085, 9085, 9085, 9085, 9085, 9085, 9086, 9086, 9086,
+ 9086, 9086, 9086, 9086, 9086, 9086, 9086, 9086, 9086, 9087,
+ 9087, 9087, 9087, 9087, 9087, 9087, 9087, 9087, 9087, 9087,
+ 9087, 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9089, 9089, 9089, 9089, 9089, 9089, 9089,
+ 9089, 9089, 9089, 9089, 9089, 9090, 9090, 9090, 9090, 9090,
+ 9090, 9090, 9090, 9090, 9090, 9090, 9090, 9091, 9091, 9091,
+ 9091, 9091, 9091, 9091, 9091, 9091, 9091, 9091, 9091, 9092,
+ 9092, 9092, 9092, 9092, 9092, 9092, 9092, 9092, 9092, 9092,
+ 9092, 9093, 9093, 9093, 9093, 9093, 9093, 9093, 9093, 9093,
+
+ 9093, 9093, 9093, 9094, 9094, 9094, 9094, 9094, 9094, 9094,
+ 9094, 9094, 9094, 9094, 9094, 9095, 9095, 9095, 9095, 9095,
+ 9095, 9095, 9095, 9095, 9095, 9095, 9095, 9096, 9096, 9096,
+ 9096, 9096, 9096, 9096, 9096, 9096, 9096, 9096, 9096, 9097,
+ 9097, 9097, 9097, 9097, 9097, 9097, 9097, 9097, 9097, 9097,
+ 9097, 9098, 9098, 9098, 9098, 9098, 9098, 9098, 9098, 9098,
+ 9098, 9098, 9098, 9099, 9099, 9099, 9099, 9099, 9099, 9099,
+ 9099, 9099, 9099, 9099, 9099, 9100, 9100, 9100, 9100, 9100,
+ 9100, 9100, 9100, 9100, 9100, 9100, 9100, 9101, 9101, 9101,
+ 9101, 9101, 9101, 9101, 9101, 9101, 9101, 9101, 9101, 9102,
+
+ 9102, 9102, 9102, 9102, 9102, 9102, 9102, 9102, 9102, 9102,
+ 9102, 9103, 9103, 9103, 9103, 9103, 9103, 9103, 9103, 9103,
+ 9103, 9103, 9103, 9104, 9104, 9104, 9104, 9104, 9104, 9104,
+ 9104, 9104, 9104, 9104, 9104, 9105, 9105, 9105, 9105, 9105,
+ 9105, 9105, 9105, 9105, 9105, 9105, 9105, 9106, 9106, 9106,
+ 9106, 9106, 9106, 9106, 9106, 9106, 9106, 9106, 9106, 9107,
+ 9107, 9107, 9107, 9107, 9107, 9107, 9107, 9107, 9107, 9107,
+ 9107, 9108, 9108, 9108, 9108, 9108, 9108, 9108, 9108, 9108,
+ 9108, 9108, 9108, 9109, 9109, 9109, 9109, 9109, 9109, 9109,
+ 9109, 9109, 9109, 9109, 9109, 9110, 9110, 9110, 9110, 9110,
+
+ 9110, 9110, 9110, 9110, 9110, 9110, 9110, 9111, 9111, 9111,
+ 9111, 9111, 9111, 9111, 9111, 9111, 9111, 9111, 9111, 9112,
+ 9112, 9112, 9112, 9112, 9112, 9112, 9112, 9112, 9112, 9112,
+ 9112, 9113, 9113, 9113, 9113, 9113, 9113, 9113, 9113, 9113,
+ 9113, 9113, 9113, 9114, 9114, 9114, 9114, 9114, 9114, 9114,
+ 9114, 9114, 9114, 9114, 9114, 9115, 9115, 9115, 9115, 0,
+ 0, 0, 0, 9115, 0, 9115, 9116, 9116, 9116, 9116,
+ 9116, 9116, 9116, 9116, 9116, 9116, 9116, 9116, 9117, 9117,
+ 0, 9117, 9117, 9117, 9117, 9117, 9117, 9117, 9117, 9117,
+ 9118, 9118, 9118, 9118, 9118, 9118, 9118, 9118, 9118, 9118,
+
+ 9118, 9118, 9119, 9119, 9119, 9119, 9119, 9119, 9119, 9119,
+ 9119, 9119, 9119, 9119, 9120, 9120, 9120, 9120, 9120, 9120,
+ 9120, 9120, 9120, 9120, 9120, 9120, 9121, 9121, 9121, 9121,
+ 9121, 9121, 9121, 9121, 9121, 9121, 9121, 9121, 9122, 9122,
+ 9122, 9122, 9122, 9122, 9122, 9122, 9122, 9122, 9122, 9122,
+ 9123, 9123, 9123, 9123, 9123, 9123, 9123, 9123, 9123, 9123,
+ 9123, 9123, 9124, 9124, 9124, 9124, 9124, 9124, 9124, 9124,
+ 9124, 9124, 9124, 9124, 9125, 9125, 9125, 9125, 9125, 9125,
+ 9125, 9125, 9125, 9125, 9125, 9125, 9126, 9126, 9126, 9126,
+ 9126, 9126, 9126, 9126, 9126, 9126, 9126, 9126, 9127, 9127,
+
+ 9127, 9127, 9127, 9127, 9127, 9127, 9127, 9127, 9127, 9127,
+ 9128, 9128, 9128, 9128, 9128, 9128, 9128, 9128, 9128, 9128,
+ 9128, 9128, 9129, 9129, 9129, 9129, 9129, 9129, 9129, 9129,
+ 9129, 9129, 9129, 9129, 9130, 9130, 9130, 9130, 9130, 9130,
+ 9130, 9130, 9130, 9130, 9130, 9130, 9131, 9131, 9131, 9131,
+ 9131, 9131, 9131, 9131, 9131, 9131, 9131, 9131, 9132, 9132,
+ 9132, 9132, 9132, 9132, 9132, 9132, 9132, 9132, 9132, 9132,
+ 9133, 9133, 9133, 9133, 9133, 9133, 9133, 9133, 9133, 9133,
+ 9133, 9133, 9134, 9134, 9134, 9134, 9134, 9134, 9134, 9134,
+ 9134, 9134, 9134, 9134, 9135, 9135, 9135, 9135, 9135, 9135,
+
+ 9135, 9135, 9135, 9135, 9135, 9135, 9136, 9136, 9136, 9136,
+ 9136, 9136, 9136, 9136, 9136, 9136, 9136, 9136, 9137, 0,
+ 0, 0, 9137, 0, 0, 9137, 9138, 9138, 9138, 9138,
+ 9138, 9138, 9138, 9138, 9138, 9138, 9138, 9138, 9139, 9139,
+ 9139, 9139, 9139, 9139, 9139, 9139, 9139, 9139, 9139, 9139,
+ 9140, 9140, 9140, 9140, 9140, 9140, 9140, 9140, 9140, 9140,
+ 9140, 9140, 9141, 9141, 9141, 9141, 9141, 9141, 9141, 9141,
+ 9141, 9141, 9141, 9141, 9142, 9142, 9142, 9142, 9142, 9142,
+ 9142, 9142, 9142, 9142, 9142, 9142, 9143, 9143, 9143, 9143,
+ 9143, 9143, 9143, 9143, 9143, 9143, 9143, 9143, 9144, 9144,
+
+ 9144, 9144, 9144, 9144, 9144, 9144, 9144, 9144, 9144, 9144,
+ 9145, 9145, 9145, 9145, 9145, 9145, 9145, 9145, 9145, 9145,
+ 9145, 9145, 9146, 9146, 9146, 9146, 9146, 9146, 9146, 9146,
+ 9146, 9146, 9146, 9146, 9147, 9147, 9147, 9147, 9147, 9147,
+ 9147, 9147, 9147, 9147, 9147, 9147, 9148, 9148, 9148, 9148,
+ 9148, 9148, 9148, 9148, 9148, 9148, 9148, 9148, 9149, 9149,
+ 9149, 9149, 9149, 9149, 9149, 9149, 9149, 9149, 9149, 9149,
+ 9150, 9150, 9150, 9150, 9150, 9150, 9150, 9150, 9150, 9150,
+ 9150, 9150, 9151, 9151, 9151, 9151, 9151, 9151, 9151, 9151,
+ 9151, 9151, 9151, 9151, 9152, 9152, 9152, 9152, 9152, 9152,
+
+ 9152, 9152, 9152, 9152, 9152, 9152, 9153, 9153, 9153, 9153,
+ 9153, 9153, 9153, 9153, 9153, 9153, 9153, 9153, 9154, 9154,
+ 9154, 9154, 9154, 9154, 9154, 9154, 9154, 9154, 9154, 9154,
+ 9155, 9155, 9155, 9155, 9155, 9155, 9155, 9155, 9155, 9155,
+ 9155, 9155, 9156, 9156, 9156, 9156, 9156, 9156, 9156, 9156,
+ 9156, 9156, 9156, 9156, 9157, 9157, 9157, 9157, 9157, 9157,
+ 9157, 9157, 9157, 9157, 9157, 9157, 9158, 9158, 9158, 9158,
+ 9158, 9158, 9158, 9158, 9158, 9158, 9158, 9158, 9159, 9159,
+ 9159, 9159, 9159, 9159, 9159, 9159, 9159, 9159, 9159, 9159,
+ 9160, 9160, 9160, 9160, 9160, 9160, 9160, 9160, 9160, 9160,
+
+ 9160, 9160, 9161, 0, 0, 0, 9161, 0, 0, 9161,
+ 9162, 9162, 9162, 9162, 9162, 9162, 9162, 9162, 9162, 9162,
+ 9162, 9162, 9163, 9163, 9163, 9163, 9163, 9163, 9163, 9163,
+ 9163, 9163, 9163, 9163, 9164, 9164, 9164, 9164, 9164, 9164,
+ 9164, 9164, 9164, 9164, 9164, 9164, 9165, 9165, 9165, 9165,
+ 9165, 9165, 9165, 9165, 9165, 9165, 9165, 9165, 9166, 9166,
+ 9166, 9166, 9166, 9166, 9166, 9166, 9166, 9166, 9166, 9166,
+ 9167, 9167, 9167, 9167, 9167, 9167, 9167, 9167, 9167, 9167,
+ 9167, 9167, 9168, 9168, 9168, 9168, 9168, 9168, 9168, 9168,
+ 9168, 9168, 9168, 9168, 9169, 9169, 9169, 9169, 9169, 9169,
+
+ 9169, 9169, 9169, 9169, 9169, 9169, 9170, 9170, 9170, 9170,
+ 9170, 9170, 9170, 9170, 9170, 9170, 9170, 9170, 9171, 0,
+ 0, 0, 9171, 0, 0, 9171, 9172, 9172, 9172, 9172,
+ 9172, 9172, 9172, 9172, 9172, 9172, 9172, 9172, 9173, 9173,
+ 9173, 9173, 9173, 9173, 9173, 9173, 9173, 9173, 9173, 9173,
+ 9174, 9174, 9174, 9174, 9174, 9174, 9174, 9174, 9174, 9174,
+ 9174, 9174, 9175, 9175, 9175, 9175, 9175, 9175, 9175, 9175,
+ 9175, 9175, 9175, 9175, 9176, 9176, 9176, 9176, 9176, 9176,
+ 9176, 9176, 9176, 9176, 9176, 9176, 9177, 9177, 9177, 9177,
+ 9177, 9177, 9177, 9177, 9177, 9177, 9177, 9177, 9178, 9178,
+
+ 9178, 9178, 9178, 9178, 9178, 9178, 9178, 9178, 9178, 9178,
+ 9179, 9179, 9179, 9179, 9179, 9179, 9179, 9179, 9179, 9179,
+ 9179, 9179, 9180, 0, 0, 9180, 9181, 0, 0, 0,
+ 9181, 0, 0, 9181, 9182, 9182, 9182, 9182, 9182, 9182,
+ 9182, 9182, 9182, 9182, 9182, 9182, 9183, 9183, 9183, 9183,
+ 9183, 9183, 9183, 9183, 9183, 9183, 9183, 9183, 9184, 9184,
+ 9184, 9184, 9184, 9184, 9184, 9184, 9184, 9184, 9184, 9184,
+ 9185, 9185, 9185, 9185, 9185, 9185, 9185, 9185, 9185, 9185,
+ 9185, 9185, 9186, 9186, 9186, 9186, 9186, 9186, 9186, 9186,
+ 9186, 9186, 9186, 9186, 9187, 9187, 9187, 9187, 9187, 9187,
+
+ 9187, 9187, 9187, 9187, 9187, 9187, 9188, 9188, 9188, 9188,
+ 9188, 9188, 9188, 9188, 9188, 9188, 9188, 9188, 9189, 9189,
+ 9189, 9189, 9189, 9189, 9189, 9189, 9189, 9189, 9189, 9189,
+ 9190, 9190, 9190, 9190, 9190, 9190, 9190, 9190, 9190, 9190,
+ 9190, 9190, 9191, 9191, 9191, 9191, 9191, 9191, 9191, 9191,
+ 9191, 9191, 9191, 9191, 9192, 9192, 9192, 9192, 9192, 9192,
+ 9192, 9192, 9192, 9192, 9192, 9192, 9193, 9193, 9193, 9193,
+ 9193, 9193, 9193, 9193, 9193, 9193, 9193, 9193, 9194, 9194,
+ 9194, 9194, 9194, 9194, 9194, 9194, 9194, 9194, 9194, 9194,
+ 9195, 9195, 9195, 9195, 9195, 9195, 9195, 9195, 9195, 9195,
+
+ 9195, 9195, 9196, 9196, 9196, 9196, 9196, 9196, 9196, 9196,
+ 9196, 9196, 9196, 9196, 9197, 9197, 9197, 9197, 9197, 9197,
+ 9197, 9197, 9197, 9197, 9197, 9197, 9198, 9198, 9198, 9198,
+ 9198, 9198, 9198, 9198, 9198, 9198, 9198, 9198, 9199, 9199,
+ 9199, 9199, 9199, 9199, 9199, 9199, 9199, 9199, 9199, 9199,
+ 9200, 9200, 9200, 9200, 9200, 9200, 9200, 9200, 9200, 9200,
+ 9200, 9200, 9201, 9201, 9201, 9201, 9201, 9201, 9201, 9201,
+ 9201, 9201, 9201, 9201, 9202, 9202, 9202, 9202, 9202, 9202,
+ 9202, 9202, 9202, 9202, 9202, 9202, 9203, 9203, 9203, 9203,
+ 9203, 9203, 9203, 9203, 9203, 9203, 9203, 9203, 9204, 9204,
+
+ 9204, 9204, 9204, 9204, 9204, 9204, 9204, 9204, 9204, 9204,
+ 9205, 9205, 9205, 9205, 9205, 9205, 9205, 9205, 9205, 9205,
+ 9205, 9205, 9206, 9206, 9206, 9206, 9206, 9206, 9206, 9206,
+ 9206, 9206, 9206, 9206, 9207, 9207, 9207, 9207, 9207, 9207,
+ 9207, 9207, 9207, 9207, 9207, 9207, 9208, 9208, 9208, 9208,
+ 9208, 9208, 9208, 9208, 9208, 9208, 9208, 9208, 9209, 9209,
+ 9209, 9209, 9209, 9209, 9209, 9209, 9209, 9209, 9209, 9209,
+ 9210, 9210, 9210, 9210, 9210, 9210, 9210, 9210, 9210, 9210,
+ 9210, 9210, 9211, 9211, 9211, 9211, 9211, 9211, 9211, 9211,
+ 9211, 9211, 9211, 9211, 9212, 9212, 9212, 9212, 9212, 9212,
+
+ 9212, 9212, 9212, 9212, 9212, 9212, 9213, 9213, 9213, 9213,
+ 9213, 9213, 9213, 9213, 9213, 9213, 9213, 9213, 9214, 9214,
+ 9214, 9214, 9214, 9214, 9214, 9214, 9214, 9214, 9214, 9214,
+ 9215, 9215, 9215, 9215, 9215, 9215, 9215, 9215, 9215, 9215,
+ 9215, 9215, 9216, 9216, 9216, 9216, 9216, 9216, 9216, 9216,
+ 9216, 9216, 9216, 9216, 9217, 9217, 9217, 9217, 9217, 9217,
+ 9217, 9217, 9217, 9217, 9217, 9217, 9218, 9218, 9218, 9218,
+ 9218, 9218, 9218, 9218, 9218, 9218, 9218, 9218, 9219, 9219,
+ 9219, 9219, 9219, 9219, 9219, 9219, 9219, 9219, 9219, 9219,
+ 9220, 9220, 9220, 9220, 9220, 9220, 9220, 9220, 9220, 9220,
+
+ 9220, 9220, 9221, 9221, 9221, 9221, 9221, 9221, 9221, 9221,
+ 9221, 9221, 9221, 9221, 9222, 9222, 9222, 9222, 9222, 9222,
+ 9222, 9222, 9222, 9222, 9222, 9222, 9223, 9223, 9223, 9223,
+ 9223, 9223, 9223, 9223, 9223, 9223, 9223, 9223, 9224, 9224,
+ 9224, 9224, 9224, 9224, 9224, 9224, 9224, 9224, 9224, 9224,
+ 9225, 9225, 9225, 9225, 9225, 9225, 9225, 9225, 9225, 9225,
+ 9225, 9225, 9226, 9226, 9226, 9226, 9226, 9226, 9226, 9226,
+ 9226, 9226, 9226, 9226, 9227, 9227, 9227, 9227, 9227, 9227,
+ 9227, 9227, 9227, 9227, 9227, 9227, 9228, 9228, 9228, 9228,
+ 9228, 9228, 9228, 9228, 9228, 9228, 9228, 9228, 9229, 9229,
+
+ 9229, 9229, 9229, 9229, 9229, 9229, 9229, 9229, 9229, 9229,
+ 9230, 9230, 9230, 9230, 9230, 9230, 9230, 9230, 9230, 9230,
+ 9230, 9230, 9231, 9231, 9231, 9231, 9231, 9231, 9231, 9231,
+ 9231, 9231, 9231, 9231, 9232, 9232, 9232, 9232, 9232, 9232,
+ 9232, 9232, 9232, 9232, 9232, 9232, 9233, 9233, 9233, 9233,
+ 9233, 9233, 9233, 9233, 9233, 9233, 9233, 9233, 9234, 9234,
+ 9234, 9234, 9234, 9234, 9234, 9234, 9234, 9234, 9234, 9234,
+ 9235, 9235, 9235, 9235, 9235, 9235, 9235, 9235, 9235, 9235,
+ 9235, 9235, 9236, 9236, 9236, 9236, 9236, 9236, 9236, 9236,
+ 9236, 9236, 9236, 9236, 9237, 9237, 9237, 9237, 9237, 9237,
+
+ 9237, 9237, 9237, 9237, 9237, 9237, 9238, 9238, 9238, 9238,
+ 9238, 9238, 9238, 9238, 9238, 9238, 9238, 9238, 9239, 9239,
+ 9239, 9239, 9239, 9239, 9239, 9239, 9239, 9239, 9239, 9239,
+ 9240, 9240, 9240, 9240, 9240, 9240, 9240, 9240, 9240, 9240,
+ 9240, 9240, 9241, 9241, 9241, 9241, 9241, 9241, 9241, 9241,
+ 9241, 9241, 9241, 9241, 9242, 9242, 9242, 9242, 9242, 9242,
+ 9242, 9242, 9242, 9242, 9242, 9242, 9243, 9243, 9243, 9243,
+ 9243, 9243, 9243, 9243, 9243, 9243, 9243, 9243, 9244, 9244,
+ 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244,
+ 9245, 9245, 9245, 9245, 9245, 9245, 9245, 9245, 9245, 9245,
+
+ 9245, 9245, 9246, 9246, 9246, 9246, 9246, 9246, 9246, 9246,
+ 9246, 9246, 9246, 9246, 9247, 9247, 9247, 9247, 9247, 9247,
+ 9247, 9247, 9247, 9247, 9247, 9247, 9248, 9248, 9248, 9248,
+ 9248, 9248, 9248, 9248, 9248, 9248, 9248, 9248, 9249, 9249,
+ 9249, 9249, 9249, 9249, 9249, 9249, 9249, 9249, 9249, 9249,
+ 9250, 9250, 9250, 9250, 9250, 9250, 9250, 9250, 9250, 9250,
+ 9250, 9250, 9251, 9251, 9251, 9251, 9251, 9251, 9251, 9251,
+ 9251, 9251, 9251, 9251, 9252, 9252, 9252, 9252, 9252, 9252,
+ 9252, 9252, 9252, 9252, 9252, 9252, 9253, 9253, 9253, 9253,
+ 9253, 9253, 9253, 9253, 9253, 9253, 9253, 9253, 9254, 9254,
+
+ 9254, 9254, 9254, 9254, 9254, 9254, 9254, 9254, 9254, 9254,
+ 9255, 9255, 9255, 9255, 9255, 9255, 9255, 9255, 9255, 9255,
+ 9255, 9255, 9256, 9256, 9256, 9256, 9256, 9256, 9256, 9256,
+ 9256, 9256, 9256, 9256, 9257, 9257, 9257, 9257, 9257, 9257,
+ 9257, 9257, 9257, 9257, 9257, 9257, 9258, 9258, 9258, 9258,
+ 9258, 9258, 9258, 9258, 9258, 9258, 9258, 9258, 9259, 9259,
+ 9259, 9259, 9259, 9259, 9259, 9259, 9259, 9259, 9259, 9259,
+ 9260, 9260, 9260, 9260, 9260, 9260, 9260, 9260, 9260, 9260,
+ 9260, 9260, 9261, 9261, 9261, 9261, 9261, 9261, 9261, 9261,
+ 9261, 9261, 9261, 9261, 9262, 9262, 9262, 9262, 9262, 9262,
+
+ 9262, 9262, 9262, 9262, 9262, 9262, 9263, 9263, 0, 9263,
+ 9263, 9263, 9263, 9263, 9263, 9263, 9263, 9263, 9264, 9264,
+ 9264, 9264, 9264, 9264, 9264, 9264, 9264, 9264, 9264, 9264,
+ 9265, 9265, 9265, 9265, 9265, 9265, 9265, 9265, 9265, 9265,
+ 9265, 9265, 9266, 9266, 9266, 9266, 9266, 9266, 9266, 9266,
+ 9266, 9266, 9266, 9266, 9267, 9267, 9267, 9267, 9267, 9267,
+ 9267, 9267, 9267, 9267, 9267, 9267, 9268, 9268, 9268, 9268,
+ 9268, 9268, 9268, 9268, 9268, 9268, 9268, 9268, 9269, 9269,
+ 9269, 9269, 9269, 9269, 9269, 9269, 9269, 9269, 9269, 9269,
+ 9270, 9270, 9270, 9270, 9270, 9270, 9270, 9270, 9270, 9270,
+
+ 9270, 9270, 9271, 9271, 9271, 9271, 9271, 9271, 9271, 9271,
+ 9271, 9271, 9271, 9271, 9272, 9272, 9272, 9272, 9272, 9272,
+ 9272, 9272, 9272, 9272, 9272, 9272, 9273, 9273, 9273, 9273,
+ 9273, 9273, 9273, 9273, 9273, 9273, 9273, 9273, 9274, 9274,
+ 9274, 9274, 9274, 9274, 9274, 9274, 9274, 9274, 9274, 9274,
+ 9275, 9275, 9275, 9275, 9275, 9275, 9275, 9275, 9275, 9275,
+ 9275, 9275, 9276, 9276, 9276, 9276, 9276, 9276, 9276, 9276,
+ 9276, 9276, 9276, 9276, 9277, 9277, 9277, 9277, 9277, 9277,
+ 9277, 9277, 9277, 9277, 9277, 9277, 9278, 9278, 9278, 9278,
+ 9278, 9278, 9278, 9278, 9278, 9278, 9278, 9278, 9279, 9279,
+
+ 9279, 9279, 9279, 9279, 9279, 9279, 9279, 9279, 9279, 9279,
+ 9280, 9280, 9280, 9280, 9280, 9280, 9280, 9280, 9280, 9280,
+ 9280, 9280, 9281, 9281, 9281, 9281, 9281, 9281, 9281, 9281,
+ 9281, 9281, 9281, 9281, 9282, 9282, 9282, 9282, 9282, 9282,
+ 9282, 9282, 9282, 9282, 9282, 9282, 9283, 9283, 9283, 9283,
+ 9283, 9283, 9283, 9283, 9283, 9283, 9283, 9283, 9284, 9284,
+ 9284, 9284, 9284, 9284, 9284, 9284, 9284, 9284, 9284, 9284,
+ 9285, 9285, 9285, 9285, 9285, 9285, 9285, 9285, 9285, 9285,
+ 9285, 9285, 9286, 9286, 9286, 9286, 9286, 9286, 9286, 9286,
+ 9286, 9286, 9286, 9286, 9287, 9287, 9287, 9287, 9287, 9287,
+
+ 9287, 9287, 9287, 9287, 9287, 9287, 9288, 9288, 9288, 9288,
+ 9288, 9288, 9288, 9288, 9288, 9288, 9288, 9288, 9289, 9289,
+ 9289, 9289, 9289, 9289, 9289, 9289, 9289, 9289, 9289, 9289,
+ 9290, 9290, 9290, 9290, 9290, 9290, 9290, 9290, 9290, 9290,
+ 9290, 9290, 9291, 9291, 9291, 9291, 9291, 9291, 9291, 9291,
+ 9291, 9291, 9291, 9291, 9292, 9292, 9292, 9292, 9292, 9292,
+ 9292, 9292, 9292, 9292, 9292, 9292, 9293, 9293, 9293, 9293,
+ 9293, 9293, 9293, 9293, 9293, 9293, 9293, 9293, 9294, 9294,
+ 9294, 9294, 9294, 9294, 9294, 9294, 9294, 9294, 9294, 9294,
+ 9295, 9295, 9295, 9295, 9295, 9295, 9295, 9295, 9295, 9295,
+
+ 9295, 9295, 9296, 9296, 9296, 9296, 9296, 9296, 9296, 9296,
+ 9296, 9296, 9296, 9296, 9297, 9297, 9297, 9297, 9297, 9297,
+ 9297, 9297, 9297, 9297, 9297, 9297, 9298, 9298, 9298, 9298,
+ 9298, 9298, 9298, 9298, 9298, 9298, 9298, 9298, 9299, 9299,
+ 9299, 9299, 9299, 9299, 9299, 9299, 9299, 9299, 9299, 9299,
+ 9300, 9300, 9300, 9300, 9300, 9300, 9300, 9300, 9300, 9300,
+ 9300, 9300, 9301, 9301, 9301, 9301, 9301, 9301, 9301, 9301,
+ 9301, 9301, 9301, 9301, 9302, 9302, 9302, 9302, 9302, 9302,
+ 9302, 9302, 9302, 9302, 9302, 9302, 9303, 9303, 9303, 9303,
+ 9303, 9303, 9303, 9303, 9303, 9303, 9303, 9303, 9304, 9304,
+
+ 9304, 9304, 9304, 9304, 9304, 9304, 9304, 9304, 9304, 9304,
+ 9305, 9305, 9305, 9305, 9305, 9305, 9305, 9305, 9305, 9305,
+ 9305, 9305, 9306, 9306, 9306, 9306, 9306, 9306, 9306, 9306,
+ 9306, 9306, 9306, 9306, 9307, 9307, 9307, 9307, 9307, 9307,
+ 9307, 9307, 9307, 9307, 9307, 9307, 9308, 9308, 9308, 9308,
+ 9308, 9308, 9308, 9308, 9308, 9308, 9308, 9308, 9309, 9309,
+ 9309, 9309, 9309, 9309, 9309, 9309, 9309, 9309, 9309, 9309,
+ 9310, 9310, 9310, 9310, 9310, 9310, 9310, 9310, 9310, 9310,
+ 9310, 9310, 9311, 9311, 9311, 9311, 9311, 9311, 9311, 9311,
+ 9311, 9311, 9311, 9311, 9312, 9312, 9312, 9312, 9312, 9312,
+
+ 9312, 9312, 9312, 9312, 9312, 9312, 9313, 9313, 9313, 9313,
+ 9313, 9313, 9313, 9313, 9313, 9313, 9313, 9313, 9314, 9314,
+ 9314, 9314, 9314, 9314, 9314, 9314, 9314, 9314, 9314, 9314,
+ 9315, 9315, 9315, 9315, 9315, 9315, 9315, 9315, 9315, 9315,
+ 9315, 9315, 9316, 9316, 9316, 9316, 9316, 9316, 9316, 9316,
+ 9316, 9316, 9316, 9316, 9317, 9317, 9317, 9317, 9317, 9317,
+ 9317, 9317, 9317, 9317, 9317, 9317, 9318, 9318, 9318, 9318,
+ 9318, 9318, 9318, 9318, 9318, 9318, 9318, 9318, 9319, 9319,
+ 9319, 9319, 9319, 9319, 9319, 9319, 9319, 9319, 9319, 9319,
+ 9320, 9320, 9320, 9320, 9320, 9320, 9320, 9320, 9320, 9320,
+
+ 9320, 9320, 9321, 9321, 9321, 9321, 9321, 9321, 9321, 9321,
+ 9321, 9321, 9321, 9321, 9322, 9322, 9322, 9322, 9322, 9322,
+ 9322, 9322, 9322, 9322, 9322, 9322, 9323, 9323, 9323, 9323,
+ 9323, 9323, 9323, 9323, 9323, 9323, 9323, 9323, 9324, 0,
+ 0, 0, 9324, 0, 0, 9324, 9325, 9325, 9325, 9325,
+ 9325, 9325, 9325, 9325, 9325, 9325, 9325, 9325, 9326, 9326,
+ 9326, 9326, 9326, 9326, 9326, 9326, 9326, 9326, 9326, 9326,
+ 9327, 9327, 9327, 9327, 9327, 9327, 9327, 9327, 9327, 9327,
+ 9327, 9327, 9328, 9328, 9328, 9328, 9328, 9328, 9328, 9328,
+ 9328, 9328, 9328, 9328, 9329, 9329, 9329, 9329, 9329, 9329,
+
+ 9329, 9329, 9329, 9329, 9329, 9329, 9330, 9330, 9330, 9330,
+ 9330, 9330, 9330, 9330, 9330, 9330, 9330, 9330, 9331, 9331,
+ 9331, 9331, 9331, 9331, 9331, 9331, 9331, 9331, 9331, 9331,
+ 9332, 9332, 9332, 9332, 9332, 9332, 9332, 9332, 9332, 9332,
+ 9332, 9332, 9333, 9333, 9333, 9333, 9333, 9333, 9333, 9333,
+ 9333, 9333, 9333, 9333, 9334, 9334, 9334, 9334, 9334, 9334,
+ 9334, 9334, 9334, 9334, 9334, 9334, 9335, 9335, 9335, 9335,
+ 9335, 9335, 9335, 9335, 9335, 9335, 9335, 9335, 9336, 9336,
+ 9336, 9336, 9336, 9336, 9336, 9336, 9336, 9336, 9336, 9336,
+ 9337, 9337, 9337, 9337, 9337, 9337, 9337, 9337, 9337, 9337,
+
+ 9337, 9337, 9338, 0, 0, 0, 9338, 0, 0, 9338,
+ 9339, 0, 0, 9339, 9339, 0, 0, 0, 9339, 0,
+ 9339, 9340, 9340, 9340, 9340, 9340, 9340, 9340, 9340, 9340,
+ 9340, 9340, 9340, 9341, 9341, 9341, 9341, 9341, 9341, 9341,
+ 9341, 9341, 9341, 9341, 9341, 9342, 9342, 9342, 9342, 9342,
+ 9342, 9342, 9342, 9342, 9342, 9342, 9342, 9343, 9343, 9343,
+ 9343, 9343, 9343, 9343, 9343, 9343, 9343, 9343, 9343, 9344,
+ 9344, 9344, 9344, 9344, 9344, 9344, 9344, 9344, 9344, 9344,
+ 9344, 9345, 9345, 9345, 9345, 9345, 9345, 9345, 9345, 9345,
+ 9345, 9345, 9345, 9346, 9346, 9346, 9346, 9346, 9346, 9346,
+
+ 9346, 9346, 9346, 9346, 9346, 9347, 9347, 9347, 9347, 9347,
+ 9347, 9347, 9347, 9347, 9347, 9347, 9347, 9348, 9348, 9348,
+ 9348, 9348, 9348, 9348, 9348, 9348, 9348, 9348, 9348, 9349,
+ 9349, 9349, 9349, 9349, 9349, 9349, 9349, 9349, 9349, 9349,
+ 9349, 9350, 9350, 9350, 9350, 9350, 9350, 9350, 9350, 9350,
+ 9350, 9350, 9350, 9351, 9351, 9351, 9351, 9351, 9351, 9351,
+ 9351, 9351, 9351, 9351, 9351, 9352, 9352, 9352, 9352, 9352,
+ 9352, 9352, 9352, 9352, 9352, 9352, 9352, 9353, 9353, 9353,
+ 9353, 9353, 9353, 9353, 9353, 9353, 9353, 9353, 9353, 9354,
+ 9354, 9354, 9354, 9354, 9354, 9354, 9354, 9354, 9354, 9354,
+
+ 9354, 9355, 9355, 9355, 9355, 9355, 9355, 9355, 9355, 9355,
+ 9355, 9355, 9355, 9356, 9356, 9356, 9356, 9356, 9356, 9356,
+ 9356, 9356, 9356, 9356, 9356, 9357, 9357, 9357, 9357, 9357,
+ 9357, 9357, 9357, 9357, 9357, 9357, 9357, 9358, 9358, 9358,
+ 9358, 9358, 9358, 9358, 9358, 9358, 9358, 9358, 9358, 9359,
+ 9359, 9359, 9359, 9359, 9359, 9359, 9359, 9359, 9359, 9359,
+ 9359, 9360, 9360, 9360, 9360, 9360, 9360, 9360, 9360, 9360,
+ 9360, 9360, 9360, 9361, 9361, 9361, 9361, 9361, 9361, 9361,
+ 9361, 9361, 9361, 9361, 9361, 9362, 9362, 9362, 9362, 9362,
+ 9362, 9362, 9362, 9362, 9362, 9362, 9362, 9363, 9363, 9363,
+
+ 9363, 9363, 9363, 9363, 9363, 9363, 9363, 9363, 9363, 9364,
+ 9364, 9364, 9364, 9364, 9364, 9364, 9364, 9364, 9364, 9364,
+ 9364, 9365, 9365, 9365, 9365, 9365, 9365, 9365, 9365, 9365,
+ 9365, 9365, 9365, 9366, 9366, 9366, 9366, 9366, 9366, 9366,
+ 9366, 9366, 9366, 9366, 9366, 9367, 9367, 9367, 9367, 9367,
+ 9367, 9367, 9367, 9367, 9367, 9367, 9367, 9368, 9368, 9368,
+ 9368, 9368, 9368, 9368, 9368, 9368, 9368, 9368, 9368, 9369,
+ 9369, 9369, 9369, 9369, 9369, 9369, 9369, 9369, 9369, 9369,
+ 9369, 9370, 9370, 9370, 9370, 9370, 9370, 9370, 9370, 9370,
+ 9370, 9370, 9370, 9371, 9371, 9371, 9371, 9371, 9371, 9371,
+
+ 9371, 9371, 9371, 9371, 9371, 9372, 9372, 9372, 9372, 9372,
+ 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9373, 9373, 9373,
+ 9373, 9373, 9373, 9373, 9373, 9373, 9373, 9373, 9373, 9374,
+ 9374, 9374, 9374, 9374, 9374, 9374, 9374, 9374, 9374, 9374,
+ 9374, 9375, 9375, 9375, 9375, 9375, 9375, 9375, 9375, 9375,
+ 9375, 9375, 9375, 9376, 9376, 9376, 9376, 9376, 9376, 9376,
+ 9376, 9376, 9376, 9376, 9376, 9377, 9377, 9377, 9377, 9377,
+ 9377, 9377, 9377, 9377, 9377, 9377, 9377, 9378, 9378, 9378,
+ 9378, 9378, 9378, 9378, 9378, 9378, 9378, 9378, 9378, 9379,
+ 9379, 9379, 9379, 9379, 9379, 9379, 9379, 9379, 9379, 9379,
+
+ 9379, 9380, 9380, 9380, 9380, 9380, 9380, 9380, 9380, 9380,
+ 9380, 9380, 9380, 9381, 9381, 9381, 9381, 9381, 9381, 9381,
+ 9381, 9381, 9381, 9381, 9381, 9382, 9382, 9382, 9382, 9382,
+ 9382, 9382, 9382, 9382, 9382, 9382, 9382, 9383, 9383, 9383,
+ 9383, 9383, 9383, 9383, 9383, 9383, 9383, 9383, 9383, 9384,
+ 9384, 9384, 9384, 9384, 9384, 9384, 9384, 9384, 9384, 9384,
+ 9384, 9385, 9385, 9385, 9385, 9385, 9385, 9385, 9385, 9385,
+ 9385, 9385, 9385, 9386, 9386, 9386, 9386, 9386, 9386, 9386,
+ 9386, 9386, 9386, 9386, 9386, 9387, 9387, 9387, 9387, 9387,
+ 9387, 9387, 9387, 9387, 9387, 9387, 9387, 9388, 9388, 9388,
+
+ 9388, 9388, 9388, 9388, 9388, 9388, 9388, 9388, 9388, 9389,
+ 9389, 9389, 9389, 9389, 9389, 9389, 9389, 9389, 9389, 9389,
+ 9389, 9390, 9390, 9390, 9390, 9390, 9390, 9390, 9390, 9390,
+ 9390, 9390, 9390, 9391, 9391, 9391, 9391, 9391, 9391, 9391,
+ 9391, 9391, 9391, 9391, 9391, 9392, 9392, 9392, 9392, 9392,
+ 9392, 9392, 9392, 9392, 9392, 9392, 9392, 9393, 9393, 9393,
+ 9393, 9393, 9393, 9393, 9393, 9393, 9393, 9393, 9393, 9394,
+ 9394, 9394, 9394, 9394, 9394, 9394, 9394, 9394, 9394, 9394,
+ 9394, 9395, 9395, 9395, 9395, 9395, 9395, 9395, 9395, 9395,
+ 9395, 9395, 9395, 9396, 9396, 9396, 9396, 9396, 9396, 9396,
+
+ 9396, 9396, 9396, 9396, 9396, 9397, 9397, 9397, 9397, 9397,
+ 9397, 9397, 9397, 9397, 9397, 9397, 9397, 9398, 9398, 9398,
+ 9398, 9398, 9398, 9398, 9398, 9398, 9398, 9398, 9398, 9399,
+ 9399, 9399, 9399, 9399, 9399, 9399, 9399, 9399, 9399, 9399,
+ 9399, 9400, 9400, 9400, 9400, 9400, 9400, 9400, 9400, 9400,
+ 9400, 9400, 9400, 9401, 9401, 9401, 9401, 9401, 9401, 9401,
+ 9401, 9401, 9401, 9401, 9401, 9402, 9402, 9402, 9402, 9402,
+ 9402, 9402, 9402, 9402, 9402, 9402, 9402, 9403, 9403, 9403,
+ 9403, 9403, 9403, 9403, 9403, 9403, 9403, 9403, 9403, 9404,
+ 9404, 9404, 9404, 9404, 9404, 9404, 9404, 9404, 9404, 9404,
+
+ 9404, 9405, 9405, 9405, 9405, 9405, 9405, 9405, 9405, 9405,
+ 9405, 9405, 9405, 9406, 9406, 9406, 9406, 9406, 9406, 9406,
+ 9406, 9406, 9406, 9406, 9406, 9407, 9407, 9407, 9407, 9407,
+ 9407, 9407, 9407, 9407, 9407, 9407, 9407, 9408, 9408, 9408,
+ 9408, 9408, 9408, 9408, 9408, 9408, 9408, 9408, 9408, 9409,
+ 9409, 9409, 9409, 9409, 9409, 9409, 9409, 9409, 9409, 9409,
+ 9409, 9410, 9410, 9410, 9410, 9410, 9410, 9410, 9410, 9410,
+ 9410, 9410, 9410, 9411, 9411, 9411, 9411, 9411, 9411, 9411,
+ 9411, 9411, 9411, 9411, 9411, 9412, 9412, 9412, 9412, 9412,
+ 9412, 9412, 9412, 9412, 9412, 9412, 9412, 9413, 9413, 9413,
+
+ 9413, 9413, 9413, 9413, 9413, 9413, 9413, 9413, 9413, 9414,
+ 9414, 9414, 9414, 9414, 9414, 9414, 9414, 9414, 9414, 9414,
+ 9414, 9415, 9415, 9415, 9415, 9415, 9415, 9415, 9415, 9415,
+ 9415, 9415, 9415, 9416, 9416, 9416, 9416, 9416, 9416, 9416,
+ 9416, 9416, 9416, 9416, 9416, 9417, 9417, 9417, 9417, 9417,
+ 9417, 9417, 9417, 9417, 9417, 9417, 9417, 9418, 9418, 9418,
+ 9418, 9418, 9418, 9418, 9418, 9418, 9418, 9418, 9418, 9419,
+ 9419, 9419, 9419, 9419, 9419, 9419, 9419, 9419, 9419, 9419,
+ 9419, 9420, 9420, 9420, 9420, 9420, 9420, 9420, 9420, 9420,
+ 9420, 9420, 9420, 9421, 9421, 9421, 9421, 9421, 9421, 9421,
+
+ 9421, 9421, 9421, 9421, 9421, 9422, 9422, 9422, 9422, 9422,
+ 9422, 9422, 9422, 9422, 9422, 9422, 9422, 9423, 9423, 9423,
+ 9423, 9423, 9423, 9423, 9423, 9423, 9423, 9423, 9423, 9424,
+ 9424, 9424, 9424, 9424, 9424, 9424, 9424, 9424, 9424, 9424,
+ 9424, 9425, 9425, 9425, 9425, 9425, 9425, 9425, 9425, 9425,
+ 9425, 9425, 9425, 9426, 9426, 9426, 9426, 9426, 9426, 9426,
+ 9426, 9426, 9426, 9426, 9426, 9427, 9427, 9427, 9427, 9427,
+ 9427, 9427, 9427, 9427, 9427, 9427, 9427, 9428, 9428, 9428,
+ 9428, 9428, 9428, 9428, 9428, 9428, 9428, 9428, 9428, 9429,
+ 9429, 9429, 9429, 9429, 9429, 9429, 9429, 9429, 9429, 9429,
+
+ 9429, 9430, 9430, 9430, 9430, 9430, 9430, 9430, 9430, 9430,
+ 9430, 9430, 9430, 9431, 9431, 9431, 9431, 9431, 9431, 9431,
+ 9431, 9431, 9431, 9431, 9431, 9432, 9432, 9432, 9432, 9432,
+ 9432, 9432, 9432, 9432, 9432, 9432, 9432, 9433, 9433, 9433,
+ 9433, 9433, 9433, 9433, 9433, 9433, 9433, 9433, 9433, 9434,
+ 9434, 9434, 9434, 9434, 9434, 9434, 9434, 9434, 9434, 9434,
+ 9434, 9435, 9435, 9435, 9435, 9435, 9435, 9435, 9435, 9435,
+ 9435, 9435, 9435, 9436, 9436, 9436, 9436, 9436, 9436, 9436,
+ 9436, 9436, 9436, 9436, 9436, 9437, 9437, 9437, 9437, 9437,
+ 9437, 9437, 9437, 9437, 9437, 9437, 9437, 9438, 9438, 9438,
+
+ 9438, 9438, 9438, 9438, 9438, 9438, 9438, 9438, 9438, 9439,
+ 9439, 9439, 9439, 9439, 9439, 9439, 9439, 9439, 9439, 9439,
+ 9439, 9440, 9440, 9440, 9440, 9440, 9440, 9440, 9440, 9440,
+ 9440, 9440, 9440, 9441, 9441, 9441, 9441, 9441, 9441, 9441,
+ 9441, 9441, 9441, 9441, 9441, 9442, 9442, 9442, 9442, 9442,
+ 9442, 9442, 9442, 9442, 9442, 9442, 9442, 9443, 9443, 9443,
+ 9443, 9443, 9443, 9443, 9443, 9443, 9443, 9443, 9443, 9444,
+ 9444, 9444, 9444, 9444, 9444, 9444, 9444, 9444, 9444, 9444,
+ 9444, 9445, 9445, 9445, 9445, 9445, 9445, 9445, 9445, 9445,
+ 9445, 9445, 9445, 9446, 9446, 9446, 9446, 9446, 9446, 9446,
+
+ 9446, 9446, 9446, 9446, 9446, 9447, 9447, 9447, 9447, 9447,
+ 9447, 9447, 9447, 9447, 9447, 9447, 9447, 9448, 9448, 9448,
+ 9448, 9448, 9448, 9448, 9448, 9448, 9448, 9448, 9448, 9449,
+ 9449, 9449, 9449, 9449, 9449, 9449, 9449, 9449, 9449, 9449,
+ 9449, 9450, 9450, 9450, 9450, 9450, 9450, 9450, 9450, 9450,
+ 9450, 9450, 9450, 9451, 9451, 9451, 9451, 9451, 9451, 9451,
+ 9451, 9451, 9451, 9451, 9451, 9452, 9452, 9452, 9452, 9452,
+ 9452, 9452, 9452, 9452, 9452, 9452, 9452, 9453, 9453, 9453,
+ 9453, 9453, 9453, 9453, 9453, 9453, 9453, 9453, 9453, 9454,
+ 9454, 9454, 9454, 9454, 9454, 9454, 9454, 9454, 9454, 9454,
+
+ 9454, 9455, 9455, 9455, 9455, 9455, 9455, 9455, 9455, 9455,
+ 9455, 9455, 9455, 9456, 9456, 9456, 9456, 9456, 9456, 9456,
+ 9456, 9456, 9456, 9456, 9456, 9457, 9457, 9457, 9457, 9457,
+ 9457, 9457, 9457, 9457, 9457, 9457, 9457, 9458, 9458, 9458,
+ 9458, 9458, 9458, 9458, 9458, 9458, 9458, 9458, 9458, 9459,
+ 9459, 9459, 9459, 9459, 9459, 9459, 9459, 9459, 9459, 9459,
+ 9459, 9460, 9460, 9460, 9460, 9460, 9460, 9460, 9460, 9460,
+ 9460, 9460, 9460, 9461, 9461, 9461, 9461, 9461, 9461, 9461,
+ 9461, 9461, 9461, 9461, 9461, 9462, 9462, 0, 9462, 9462,
+ 9462, 9462, 9462, 9462, 9462, 9462, 9462, 9463, 9463, 9463,
+
+ 9463, 9463, 9463, 9463, 9463, 9463, 9463, 9463, 9463, 9464,
+ 9464, 9464, 9464, 9464, 9464, 9464, 9464, 9464, 9464, 9464,
+ 9464, 9465, 9465, 9465, 9465, 9465, 9465, 9465, 9465, 9465,
+ 9465, 9465, 9465, 9466, 9466, 9466, 9466, 9466, 9466, 9466,
+ 9466, 9466, 9466, 9466, 9466, 9467, 9467, 9467, 9467, 9467,
+ 9467, 9467, 9467, 9467, 9467, 9467, 9467, 9468, 9468, 9468,
+ 9468, 9468, 9468, 9468, 9468, 9468, 9468, 9468, 9468, 9469,
+ 9469, 9469, 9469, 9469, 9469, 9469, 9469, 9469, 9469, 9469,
+ 9469, 9470, 9470, 9470, 9470, 9470, 9470, 9470, 9470, 9470,
+ 9470, 9470, 9470, 9471, 9471, 9471, 9471, 9471, 9471, 9471,
+
+ 9471, 9471, 9471, 9471, 9471, 9472, 9472, 9472, 9472, 9472,
+ 9472, 9472, 9472, 9472, 9472, 9472, 9472, 9473, 9473, 9473,
+ 9473, 9473, 9473, 9473, 9473, 9473, 9473, 9473, 9473, 9474,
+ 9474, 9474, 9474, 9474, 9474, 9474, 9474, 9474, 9474, 9474,
+ 9474, 9475, 9475, 9475, 9475, 9475, 9475, 9475, 9475, 9475,
+ 9475, 9475, 9475, 9476, 9476, 9476, 9476, 9476, 9476, 9476,
+ 9476, 9476, 9476, 9476, 9476, 9477, 9477, 9477, 9477, 9477,
+ 9477, 9477, 9477, 9477, 9477, 9477, 9477, 9478, 9478, 9478,
+ 9478, 9478, 9478, 9478, 9478, 9478, 9478, 9478, 9478, 9479,
+ 9479, 9479, 9479, 9479, 9479, 9479, 9479, 9479, 9479, 9479,
+
+ 9479, 9480, 9480, 9480, 9480, 9480, 9480, 9480, 9480, 9480,
+ 9480, 9480, 9480, 9481, 9481, 9481, 9481, 9481, 9481, 9481,
+ 9481, 9481, 9481, 9481, 9481, 9482, 9482, 9482, 9482, 9482,
+ 9482, 9482, 9482, 9482, 9482, 9482, 9482, 9483, 9483, 9483,
+ 9483, 9483, 9483, 9483, 9483, 9483, 9483, 9483, 9483, 9484,
+ 9484, 9484, 9484, 9484, 9484, 9484, 9484, 9484, 9484, 9484,
+ 9484, 9485, 9485, 9485, 9485, 9485, 9485, 9485, 9485, 9485,
+ 9485, 9485, 9485, 9486, 9486, 9486, 9486, 9486, 9486, 9486,
+ 9486, 9486, 9486, 9486, 9486, 9487, 9487, 9487, 9487, 9487,
+ 9487, 9487, 9487, 9487, 9487, 9487, 9487, 9488, 9488, 9488,
+
+ 9488, 9488, 9488, 9488, 9488, 9488, 9488, 9488, 9488, 9489,
+ 9489, 9489, 9489, 9489, 9489, 9489, 9489, 9489, 9489, 9489,
+ 9489, 9490, 9490, 9490, 9490, 9490, 9490, 9490, 9490, 9490,
+ 9490, 9490, 9490, 9491, 9491, 9491, 9491, 9491, 9491, 9491,
+ 9491, 9491, 9491, 9491, 9491, 9492, 9492, 9492, 9492, 9492,
+ 9492, 9492, 9492, 9492, 9492, 9492, 9492, 9493, 9493, 9493,
+ 9493, 9493, 9493, 9493, 9493, 9493, 9493, 9493, 9493, 9494,
+ 9494, 9494, 9494, 9494, 9494, 9494, 9494, 9494, 9494, 9494,
+ 9494, 9495, 9495, 9495, 9495, 9495, 9495, 9495, 9495, 9495,
+ 9495, 9495, 9495, 9496, 9496, 9496, 9496, 9496, 9496, 9496,
+
+ 9496, 9496, 9496, 9496, 9496, 9497, 9497, 9497, 9497, 9497,
+ 9497, 9497, 9497, 9497, 9497, 9497, 9497, 9498, 9498, 9498,
+ 9498, 9498, 9498, 9498, 9498, 9498, 9498, 9498, 9498, 9499,
+ 9499, 9499, 9499, 9499, 9499, 9499, 9499, 9499, 9499, 9499,
+ 9499, 9500, 9500, 9500, 9500, 9500, 9500, 9500, 9500, 9500,
+ 9500, 9500, 9500, 9501, 9501, 9501, 9501, 9501, 9501, 9501,
+ 9501, 9501, 9501, 9501, 9501, 9502, 9502, 9502, 9502, 9502,
+ 9502, 9502, 9502, 9502, 9502, 9502, 9502, 9503, 9503, 9503,
+ 9503, 9503, 9503, 9503, 9503, 9503, 9503, 9503, 9503, 9504,
+ 9504, 9504, 9504, 9504, 9504, 9504, 9504, 9504, 9504, 9504,
+
+ 9504, 9505, 9505, 9505, 9505, 9505, 9505, 9505, 9505, 9505,
+ 9505, 9505, 9505, 9506, 9506, 9506, 9506, 9506, 9506, 9506,
+ 9506, 9506, 9506, 9506, 9506, 9507, 9507, 9507, 9507, 9507,
+ 9507, 9507, 9507, 9507, 9507, 9507, 9507, 9508, 9508, 9508,
+ 9508, 9508, 9508, 9508, 9508, 9508, 9508, 9508, 9508, 9509,
+ 9509, 9509, 9509, 9509, 9509, 9509, 9509, 9509, 9509, 9509,
+ 9509, 9510, 9510, 9510, 9510, 9510, 9510, 9510, 9510, 9510,
+ 9510, 9510, 9510, 9511, 9511, 9511, 9511, 9511, 9511, 9511,
+ 9511, 9511, 9511, 9511, 9511, 9512, 9512, 9512, 9512, 9512,
+ 9512, 9512, 9512, 9512, 9512, 9512, 9512, 9513, 9513, 9513,
+
+ 9513, 9513, 9513, 9513, 9513, 9513, 9513, 9513, 9513, 9514,
+ 9514, 9514, 9514, 9514, 9514, 9514, 9514, 9514, 9514, 9514,
+ 9514, 9515, 9515, 9515, 9515, 9515, 9515, 9515, 9515, 9515,
+ 9515, 9515, 9515, 9516, 9516, 9516, 9516, 9516, 9516, 9516,
+ 9516, 9516, 9516, 9516, 9516, 9517, 9517, 9517, 9517, 9517,
+ 9517, 9517, 9517, 9517, 9517, 9517, 9517, 9518, 9518, 9518,
+ 9518, 9518, 9518, 9518, 9518, 9518, 9518, 9518, 9518, 9519,
+ 9519, 9519, 9519, 9519, 9519, 9519, 9519, 9519, 9519, 9519,
+ 9519, 9520, 9520, 9520, 9520, 9520, 9520, 9520, 9520, 9520,
+ 9520, 9520, 9520, 9521, 9521, 9521, 9521, 9521, 9521, 9521,
+
+ 9521, 9521, 9521, 9521, 9521, 9522, 9522, 9522, 9522, 9522,
+ 9522, 9522, 9522, 9522, 9522, 9522, 9522, 9523, 9523, 9523,
+ 9523, 9523, 9523, 9523, 9523, 9523, 9523, 9523, 9523, 9524,
+ 9524, 9524, 9524, 9524, 9524, 9524, 9524, 9524, 9524, 9524,
+ 9524, 9525, 9525, 9525, 9525, 9525, 9525, 9525, 9525, 9525,
+ 9525, 9525, 9525, 9526, 9526, 9526, 9526, 9526, 9526, 9526,
+ 9526, 9526, 9526, 9526, 9526, 9527, 9527, 9527, 9527, 9527,
+ 9527, 9527, 9527, 9527, 9527, 9527, 9527, 9528, 9528, 9528,
+ 9528, 9528, 9528, 9528, 9528, 9528, 9528, 9528, 9528, 9529,
+ 9529, 9529, 9529, 9529, 9529, 9529, 9529, 9529, 9529, 9529,
+
+ 9529, 9530, 9530, 9530, 9530, 9530, 9530, 9530, 9530, 9530,
+ 9530, 9530, 9530, 9531, 9531, 9531, 9531, 9531, 9531, 9531,
+ 9531, 9531, 9531, 9531, 9531, 9532, 9532, 9532, 9532, 9532,
+ 9532, 9532, 9532, 9532, 9532, 9532, 9532, 9533, 0, 0,
+ 0, 9533, 0, 0, 9533, 9534, 9534, 9534, 9534, 9534,
+ 9534, 9534, 9534, 9534, 9534, 9534, 9534, 9535, 9535, 9535,
+ 9535, 9535, 9535, 9535, 9535, 9535, 9535, 9535, 9535, 9536,
+ 9536, 9536, 9536, 9536, 9536, 9536, 9536, 9536, 9536, 9536,
+ 9536, 9537, 9537, 9537, 9537, 9537, 9537, 9537, 9537, 9537,
+ 9537, 9537, 9537, 9538, 9538, 9538, 9538, 9538, 9538, 9538,
+
+ 9538, 9538, 9538, 9538, 9538, 9539, 9539, 9539, 9539, 9539,
+ 9539, 9539, 9539, 9539, 9539, 9539, 9539, 9540, 9540, 9540,
+ 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9541,
+ 9541, 9541, 9541, 9541, 9541, 9541, 9541, 9541, 9541, 9541,
+ 9541, 9542, 9542, 9542, 9542, 9542, 9542, 9542, 9542, 9542,
+ 9542, 9542, 9542, 9543, 9543, 9543, 9543, 9543, 9543, 9543,
+ 9543, 9543, 9543, 9543, 9543, 9544, 9544, 9544, 9544, 9544,
+ 9544, 9544, 9544, 9544, 9544, 9544, 9544, 9545, 9545, 9545,
+ 9545, 9545, 9545, 9545, 9545, 9545, 9545, 9545, 9545, 9546,
+ 9546, 9546, 9546, 9546, 9546, 9546, 9546, 9546, 9546, 9546,
+
+ 9546, 9547, 9547, 9547, 9547, 9547, 9547, 9547, 9547, 9547,
+ 9547, 9547, 9547, 9548, 9548, 9548, 9548, 9548, 9548, 9548,
+ 9548, 9548, 9548, 9548, 9548, 9549, 9549, 9549, 9549, 9549,
+ 9549, 9549, 9549, 9549, 9549, 9549, 9549, 9550, 0, 0,
+ 9550, 0, 0, 0, 9550, 9550, 0, 9550, 9551, 9551,
+ 9551, 9551, 9551, 9551, 9551, 9551, 9551, 9551, 9551, 9551,
+ 9552, 9552, 9552, 9552, 9552, 9552, 9552, 9552, 9552, 9552,
+ 9552, 9552, 9553, 9553, 9553, 9553, 9553, 9553, 9553, 9553,
+ 9553, 9553, 9553, 9553, 9554, 9554, 9554, 9554, 9554, 9554,
+ 9554, 9554, 9554, 9554, 9554, 9554, 9555, 9555, 9555, 9555,
+
+ 9555, 9555, 9555, 9555, 9555, 9555, 9555, 9555, 9556, 9556,
+ 9556, 9556, 9556, 9556, 9556, 9556, 9556, 9556, 9556, 9556,
+ 9557, 9557, 9557, 9557, 9557, 9557, 9557, 9557, 9557, 9557,
+ 9557, 9557, 9558, 9558, 9558, 9558, 9558, 9558, 9558, 9558,
+ 9558, 9558, 9558, 9558, 9559, 9559, 9559, 9559, 9559, 9559,
+ 9559, 9559, 9559, 9559, 9559, 9559, 9560, 9560, 9560, 9560,
+ 9560, 9560, 9560, 9560, 9560, 9560, 9560, 9560, 9561, 9561,
+ 9561, 9561, 9561, 9561, 9561, 9561, 9561, 9561, 9561, 9561,
+ 9562, 9562, 9562, 9562, 9562, 9562, 9562, 9562, 9562, 9562,
+ 9562, 9562, 9563, 9563, 9563, 9563, 9563, 9563, 9563, 9563,
+
+ 9563, 9563, 9563, 9563, 9564, 9564, 9564, 9564, 9564, 9564,
+ 9564, 9564, 9564, 9564, 9564, 9564, 9565, 9565, 9565, 9565,
+ 9565, 9565, 9565, 9565, 9565, 9565, 9565, 9565, 9566, 9566,
+ 9566, 9566, 9566, 9566, 9566, 9566, 9566, 9566, 9566, 9566,
+ 9567, 9567, 9567, 9567, 9567, 9567, 9567, 9567, 9567, 9567,
+ 9567, 9567, 9568, 9568, 9568, 9568, 9568, 9568, 9568, 9568,
+ 9568, 9568, 9568, 9568, 9569, 9569, 9569, 9569, 9569, 9569,
+ 9569, 9569, 9569, 9569, 9569, 9569, 9570, 9570, 9570, 9570,
+ 9570, 9570, 9570, 9570, 9570, 9570, 9570, 9570, 9571, 9571,
+ 9571, 9571, 9571, 9571, 9571, 9571, 9571, 9571, 9571, 9571,
+
+ 9572, 9572, 9572, 9572, 9572, 9572, 9572, 9572, 9572, 9572,
+ 9572, 9572, 9573, 9573, 9573, 9573, 9573, 9573, 9573, 9573,
+ 9573, 9573, 9573, 9573, 9574, 9574, 9574, 9574, 9574, 9574,
+ 9574, 9574, 9574, 9574, 9574, 9574, 9575, 9575, 9575, 9575,
+ 9575, 9575, 9575, 9575, 9575, 9575, 9575, 9575, 9576, 9576,
+ 9576, 9576, 9576, 9576, 9576, 9576, 9576, 9576, 9576, 9576,
+ 9577, 9577, 9577, 9577, 9577, 9577, 9577, 9577, 9577, 9577,
+ 9577, 9577, 9578, 9578, 9578, 9578, 9578, 9578, 9578, 9578,
+ 9578, 9578, 9578, 9578, 9579, 9579, 9579, 9579, 9579, 9579,
+ 9579, 9579, 9579, 9579, 9579, 9579, 9580, 9580, 9580, 9580,
+
+ 9580, 9580, 9580, 9580, 9580, 9580, 9580, 9580, 9581, 9581,
+ 9581, 9581, 9581, 9581, 9581, 9581, 9581, 9581, 9581, 9581,
+ 9582, 9582, 9582, 9582, 9582, 9582, 9582, 9582, 9582, 9582,
+ 9582, 9582, 9583, 9583, 9583, 9583, 9583, 9583, 9583, 9583,
+ 9583, 9583, 9583, 9583, 9584, 9584, 9584, 9584, 9584, 9584,
+ 9584, 9584, 9584, 9584, 9584, 9584, 9585, 9585, 9585, 9585,
+ 9585, 9585, 9585, 9585, 9585, 9585, 9585, 9585, 9586, 9586,
+ 9586, 9586, 9586, 9586, 9586, 9586, 9586, 9586, 9586, 9586,
+ 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587,
+ 9587, 9587, 9588, 9588, 9588, 9588, 9588, 9588, 9588, 9588,
+
+ 9588, 9588, 9588, 9588, 9589, 9589, 9589, 9589, 9589, 9589,
+ 9589, 9589, 9589, 9589, 9589, 9589, 9590, 9590, 9590, 9590,
+ 9590, 9590, 9590, 9590, 9590, 9590, 9590, 9590, 9591, 9591,
+ 9591, 9591, 9591, 9591, 9591, 9591, 9591, 9591, 9591, 9591,
+ 9592, 9592, 9592, 9592, 9592, 9592, 9592, 9592, 9592, 9592,
+ 9592, 9592, 9593, 9593, 9593, 9593, 9593, 9593, 9593, 9593,
+ 9593, 9593, 9593, 9593, 9594, 9594, 9594, 9594, 9594, 9594,
+ 9594, 9594, 9594, 9594, 9594, 9594, 9595, 9595, 9595, 9595,
+ 9595, 9595, 9595, 9595, 9595, 9595, 9595, 9595, 9596, 9596,
+ 9596, 9596, 9596, 9596, 9596, 9596, 9596, 9596, 9596, 9596,
+
+ 9597, 9597, 9597, 9597, 9597, 9597, 9597, 9597, 9597, 9597,
+ 9597, 9597, 9598, 9598, 9598, 9598, 9598, 9598, 9598, 9598,
+ 9598, 9598, 9598, 9598, 9599, 9599, 9599, 9599, 9599, 9599,
+ 9599, 9599, 9599, 9599, 9599, 9599, 9600, 9600, 9600, 9600,
+ 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9600, 9601, 9601,
+ 9601, 9601, 9601, 9601, 9601, 9601, 9601, 9601, 9601, 9601,
+ 9602, 9602, 9602, 9602, 9602, 9602, 9602, 9602, 9602, 9602,
+ 9602, 9602, 9603, 9603, 9603, 9603, 9603, 9603, 9603, 9603,
+ 9603, 9603, 9603, 9603, 9604, 9604, 9604, 9604, 9604, 9604,
+ 9604, 9604, 9604, 9604, 9604, 9604, 9605, 9605, 9605, 9605,
+
+ 9605, 9605, 9605, 9605, 9605, 9605, 9605, 9605, 9606, 9606,
+ 9606, 9606, 9606, 9606, 9606, 9606, 9606, 9606, 9606, 9606,
+ 9607, 9607, 9607, 9607, 9607, 9607, 9607, 9607, 9607, 9607,
+ 9607, 9607, 9608, 9608, 9608, 9608, 9608, 9608, 9608, 9608,
+ 9608, 9608, 9608, 9608, 9609, 9609, 9609, 9609, 9609, 9609,
+ 9609, 9609, 9609, 9609, 9609, 9609, 9610, 9610, 9610, 9610,
+ 9610, 9610, 9610, 9610, 9610, 9610, 9610, 9610, 9611, 9611,
+ 9611, 9611, 9611, 9611, 9611, 9611, 9611, 9611, 9611, 9611,
+ 9612, 9612, 9612, 9612, 9612, 9612, 9612, 9612, 9612, 9612,
+ 9612, 9612, 9613, 9613, 9613, 9613, 9613, 9613, 9613, 9613,
+
+ 9613, 9613, 9613, 9613, 9614, 9614, 9614, 9614, 9614, 9614,
+ 9614, 9614, 9614, 9614, 9614, 9614, 9615, 9615, 9615, 9615,
+ 9615, 9615, 9615, 9615, 9615, 9615, 9615, 9615, 9616, 9616,
+ 9616, 9616, 9616, 9616, 9616, 9616, 9616, 9616, 9616, 9616,
+ 9617, 9617, 9617, 9617, 9617, 9617, 9617, 9617, 9617, 9617,
+ 9617, 9617, 9618, 9618, 9618, 9618, 9618, 9618, 9618, 9618,
+ 9618, 9618, 9618, 9618, 9619, 9619, 9619, 9619, 9619, 9619,
+ 9619, 9619, 9619, 9619, 9619, 9619, 9620, 9620, 9620, 9620,
+ 9620, 9620, 9620, 9620, 9620, 9620, 9620, 9620, 9621, 9621,
+ 9621, 9621, 9621, 9621, 9621, 9621, 9621, 9621, 9621, 9621,
+
+ 9622, 9622, 9622, 9622, 9622, 9622, 9622, 9622, 9622, 9622,
+ 9622, 9622, 9623, 9623, 9623, 9623, 9623, 9623, 9623, 9623,
+ 9623, 9623, 9623, 9623, 9624, 9624, 9624, 9624, 9624, 9624,
+ 9624, 9624, 9624, 9624, 9624, 9624, 9625, 9625, 9625, 9625,
+ 9625, 9625, 9625, 9625, 9625, 9625, 9625, 9625, 9626, 9626,
+ 9626, 9626, 9626, 9626, 9626, 9626, 9626, 9626, 9626, 9626,
+ 9627, 9627, 9627, 9627, 9627, 9627, 9627, 9627, 9627, 9627,
+ 9627, 9627, 9628, 9628, 9628, 9628, 9628, 9628, 9628, 9628,
+ 9628, 9628, 9628, 9628, 9629, 9629, 9629, 9629, 9629, 9629,
+ 9629, 9629, 9629, 9629, 9629, 9629, 9630, 9630, 9630, 9630,
+
+ 9630, 9630, 9630, 9630, 9630, 9630, 9630, 9630, 9631, 9631,
+ 9631, 9631, 9631, 9631, 9631, 9631, 9631, 9631, 9631, 9631,
+ 9632, 9632, 9632, 9632, 9632, 9632, 9632, 9632, 9632, 9632,
+ 9632, 9632, 9633, 9633, 9633, 9633, 9633, 9633, 9633, 9633,
+ 9633, 9633, 9633, 9633, 9634, 9634, 9634, 9634, 9634, 9634,
+ 9634, 9634, 9634, 9634, 9634, 9634, 9635, 9635, 9635, 9635,
+ 9635, 9635, 9635, 9635, 9635, 9635, 9635, 9635, 9636, 9636,
+ 9636, 9636, 9636, 9636, 9636, 9636, 9636, 9636, 9636, 9636,
+ 9637, 9637, 9637, 9637, 9637, 9637, 9637, 9637, 9637, 9637,
+ 9637, 9637, 9638, 9638, 9638, 9638, 9638, 9638, 9638, 9638,
+
+ 9638, 9638, 9638, 9638, 9639, 9639, 9639, 9639, 9639, 9639,
+ 9639, 9639, 9639, 9639, 9639, 9639, 9640, 9640, 9640, 9640,
+ 9640, 9640, 9640, 9640, 9640, 9640, 9640, 9640, 9641, 9641,
+ 9641, 9641, 9641, 9641, 9641, 9641, 9641, 9641, 9641, 9641,
+ 9642, 9642, 9642, 9642, 9642, 9642, 9642, 9642, 9642, 9642,
+ 9642, 9642, 9643, 9643, 9643, 9643, 9643, 9643, 9643, 9643,
+ 9643, 9643, 9643, 9643, 9644, 9644, 9644, 9644, 9644, 9644,
+ 9644, 9644, 9644, 9644, 9644, 9644, 9645, 9645, 9645, 9645,
+ 9645, 9645, 9645, 9645, 9645, 9645, 9645, 9645, 9646, 9646,
+ 9646, 9646, 9646, 9646, 9646, 9646, 9646, 9646, 9646, 9646,
+
+ 9647, 9647, 9647, 9647, 9647, 9647, 9647, 9647, 9647, 9647,
+ 9647, 9647, 9648, 9648, 9648, 9648, 9648, 9648, 9648, 9648,
+ 9648, 9648, 9648, 9648, 9649, 9649, 9649, 9649, 9649, 9649,
+ 9649, 9649, 9649, 9649, 9649, 9649, 9650, 9650, 9650, 9650,
+ 9650, 9650, 9650, 9650, 9650, 9650, 9650, 9650, 9651, 9651,
+ 9651, 9651, 9651, 9651, 9651, 9651, 9651, 9651, 9651, 9651,
+ 9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652,
+ 9652, 9652, 9653, 9653, 9653, 9653, 9653, 9653, 9653, 9653,
+ 9653, 9653, 9653, 9653, 9654, 9654, 9654, 9654, 9654, 9654,
+ 9654, 9654, 9654, 9654, 9654, 9654, 9655, 9655, 9655, 9655,
+
+ 9655, 9655, 9655, 9655, 9655, 9655, 9655, 9655, 9656, 9656,
+ 9656, 9656, 9656, 9656, 9656, 9656, 9656, 9656, 9656, 9656,
+ 9657, 9657, 9657, 9657, 9657, 9657, 9657, 9657, 9657, 9657,
+ 9657, 9657, 9658, 9658, 9658, 9658, 9658, 9658, 9658, 9658,
+ 9658, 9658, 9658, 9658, 9659, 9659, 9659, 9659, 9659, 9659,
+ 9659, 9659, 9659, 9659, 9659, 9659, 9660, 9660, 9660, 9660,
+ 9660, 9660, 9660, 9660, 9660, 9660, 9660, 9660, 9661, 9661,
+ 9661, 9661, 9661, 9661, 9661, 9661, 9661, 9661, 9661, 9661,
+ 9662, 9662, 9662, 9662, 9662, 9662, 9662, 9662, 9662, 9662,
+ 9662, 9662, 9663, 9663, 9663, 9663, 9663, 9663, 9663, 9663,
+
+ 9663, 9663, 9663, 9663, 9664, 9664, 9664, 9664, 9664, 9664,
+ 9664, 9664, 9664, 9664, 9664, 9664, 9665, 9665, 9665, 9665,
+ 9665, 9665, 9665, 9665, 9665, 9665, 9665, 9665, 9666, 9666,
+ 9666, 9666, 9666, 9666, 9666, 9666, 9666, 9666, 9666, 9666,
+ 9667, 9667, 9667, 9667, 9667, 9667, 9667, 9667, 9667, 9667,
+ 9667, 9667, 9668, 9668, 9668, 9668, 9668, 9668, 9668, 9668,
+ 9668, 9668, 9668, 9668, 9669, 9669, 9669, 9669, 9669, 9669,
+ 9669, 9669, 9669, 9669, 9669, 9669, 9670, 9670, 9670, 9670,
+ 9670, 9670, 9670, 9670, 9670, 9670, 9670, 9670, 9671, 9671,
+ 9671, 9671, 9671, 9671, 9671, 9671, 9671, 9671, 9671, 9671,
+
+ 9672, 9672, 9672, 9672, 9672, 9672, 9672, 9672, 9672, 9672,
+ 9672, 9672, 9673, 9673, 9673, 9673, 9673, 9673, 9673, 9673,
+ 9673, 9673, 9673, 9673, 9674, 9674, 9674, 9674, 9674, 9674,
+ 9674, 9674, 9674, 9674, 9674, 9674, 9675, 9675, 9675, 9675,
+ 9675, 9675, 9675, 9675, 9675, 9675, 9675, 9675, 9676, 9676,
+ 9676, 9676, 9676, 9676, 9676, 9676, 9676, 9676, 9676, 9676,
+ 9677, 9677, 9677, 9677, 9677, 9677, 9677, 9677, 9677, 9677,
+ 9677, 9677, 9678, 9678, 9678, 9678, 9678, 9678, 9678, 9678,
+ 9678, 9678, 9678, 9678, 9679, 9679, 9679, 9679, 9679, 9679,
+ 9679, 9679, 9679, 9679, 9679, 9679, 9680, 9680, 9680, 9680,
+
+ 9680, 9680, 9680, 9680, 9680, 9680, 9680, 9680, 9681, 9681,
+ 9681, 9681, 9681, 9681, 9681, 9681, 9681, 9681, 9681, 9681,
+ 9682, 9682, 9682, 9682, 9682, 9682, 9682, 9682, 9682, 9682,
+ 9682, 9682, 9683, 9683, 9683, 9683, 9683, 9683, 9683, 9683,
+ 9683, 9683, 9683, 9683, 9684, 9684, 9684, 9684, 9684, 9684,
+ 9684, 9684, 9684, 9684, 9684, 9684, 9685, 9685, 9685, 9685,
+ 9685, 9685, 9685, 9685, 9685, 9685, 9685, 9685, 9686, 9686,
+ 0, 9686, 9686, 9686, 9686, 9686, 9686, 9686, 9686, 9686,
+ 9687, 9687, 9687, 9687, 9687, 9687, 9687, 9687, 9687, 9687,
+ 9687, 9687, 9688, 9688, 9688, 9688, 9688, 9688, 9688, 9688,
+
+ 9688, 9688, 9688, 9688, 9689, 9689, 9689, 9689, 9689, 9689,
+ 9689, 9689, 9689, 9689, 9689, 9689, 9690, 9690, 9690, 9690,
+ 9690, 9690, 9690, 9690, 9690, 9690, 9690, 9690, 9691, 9691,
+ 9691, 9691, 9691, 9691, 9691, 9691, 9691, 9691, 9691, 9691,
+ 9692, 9692, 9692, 9692, 9692, 9692, 9692, 9692, 9692, 9692,
+ 9692, 9692, 9693, 9693, 9693, 9693, 9693, 9693, 9693, 9693,
+ 9693, 9693, 9693, 9693, 9694, 9694, 9694, 9694, 9694, 9694,
+ 9694, 9694, 9694, 9694, 9694, 9694, 9695, 9695, 9695, 9695,
+ 9695, 9695, 9695, 9695, 9695, 9695, 9695, 9695, 9696, 9696,
+ 9696, 9696, 9696, 9696, 9696, 9696, 9696, 9696, 9696, 9696,
+
+ 9697, 9697, 9697, 9697, 9697, 9697, 9697, 9697, 9697, 9697,
+ 9697, 9697, 9698, 9698, 9698, 9698, 9698, 9698, 9698, 9698,
+ 9698, 9698, 9698, 9698, 9699, 9699, 9699, 9699, 9699, 9699,
+ 9699, 9699, 9699, 9699, 9699, 9699, 9700, 9700, 9700, 9700,
+ 9700, 9700, 9700, 9700, 9700, 9700, 9700, 9700, 9701, 9701,
+ 9701, 9701, 9701, 9701, 9701, 9701, 9701, 9701, 9701, 9701,
+ 9702, 9702, 9702, 9702, 9702, 9702, 9702, 9702, 9702, 9702,
+ 9702, 9702, 9703, 9703, 9703, 9703, 9703, 9703, 9703, 9703,
+ 9703, 9703, 9703, 9703, 9704, 9704, 9704, 9704, 9704, 9704,
+ 9704, 9704, 9704, 9704, 9704, 9704, 9705, 9705, 9705, 9705,
+
+ 9705, 9705, 9705, 9705, 9705, 9705, 9705, 9705, 9706, 9706,
+ 9706, 9706, 9706, 9706, 9706, 9706, 9706, 9706, 9706, 9706,
+ 9707, 9707, 9707, 9707, 9707, 9707, 9707, 9707, 9707, 9707,
+ 9707, 9707, 9708, 9708, 9708, 9708, 9708, 9708, 9708, 9708,
+ 9708, 9708, 9708, 9708, 9709, 9709, 9709, 9709, 9709, 9709,
+ 9709, 9709, 9709, 9709, 9709, 9709, 9710, 9710, 9710, 9710,
+ 9710, 9710, 9710, 9710, 9710, 9710, 9710, 9710, 9711, 9711,
+ 9711, 9711, 9711, 9711, 9711, 9711, 9711, 9711, 9711, 9711,
+ 9712, 9712, 9712, 9712, 9712, 9712, 9712, 9712, 9712, 9712,
+ 9712, 9712, 9713, 9713, 9713, 9713, 9713, 9713, 9713, 9713,
+
+ 9713, 9713, 9713, 9713, 9714, 9714, 9714, 9714, 9714, 9714,
+ 9714, 9714, 9714, 9714, 9714, 9714, 9715, 9715, 9715, 9715,
+ 9715, 9715, 9715, 9715, 9715, 9715, 9715, 9715, 9716, 9716,
+ 9716, 9716, 9716, 9716, 9716, 9716, 9716, 9716, 9716, 9716,
+ 9717, 9717, 9717, 9717, 9717, 9717, 9717, 9717, 9717, 9717,
+ 9717, 9717, 9718, 9718, 9718, 9718, 9718, 9718, 9718, 9718,
+ 9718, 9718, 9718, 9718, 9719, 9719, 9719, 9719, 9719, 9719,
+ 9719, 9719, 9719, 9719, 9719, 9719, 9720, 9720, 9720, 9720,
+ 9720, 9720, 9720, 9720, 9720, 9720, 9720, 9720, 9721, 9721,
+ 9721, 9721, 9721, 9721, 9721, 9721, 9721, 9721, 9721, 9721,
+
+ 9722, 9722, 9722, 9722, 9722, 9722, 9722, 9722, 9722, 9722,
+ 9722, 9722, 9723, 9723, 9723, 9723, 9723, 9723, 9723, 9723,
+ 9723, 9723, 9723, 9723, 9724, 9724, 9724, 9724, 9724, 9724,
+ 9724, 9724, 9724, 9724, 9724, 9724, 9725, 9725, 9725, 9725,
+ 9725, 9725, 9725, 9725, 9725, 9725, 9725, 9725, 9726, 9726,
+ 9726, 9726, 9726, 9726, 9726, 9726, 9726, 9726, 9726, 9726,
+ 9727, 9727, 9727, 9727, 9727, 9727, 9727, 9727, 9727, 9727,
+ 9727, 9727, 9728, 9728, 9728, 9728, 9728, 9728, 9728, 9728,
+ 9728, 9728, 9728, 9728, 9729, 9729, 9729, 9729, 9729, 9729,
+ 9729, 9729, 9729, 9729, 9729, 9729, 9730, 9730, 9730, 9730,
+
+ 9730, 9730, 9730, 9730, 9730, 9730, 9730, 9730, 9731, 9731,
+ 9731, 9731, 9731, 9731, 9731, 9731, 9731, 9731, 9731, 9731,
+ 9732, 9732, 9732, 9732, 9732, 9732, 9732, 9732, 9732, 9732,
+ 9732, 9732, 9733, 9733, 9733, 9733, 9733, 9733, 9733, 9733,
+ 9733, 9733, 9733, 9733, 9734, 9734, 9734, 9734, 9734, 9734,
+ 9734, 9734, 9734, 9734, 9734, 9734, 9735, 9735, 9735, 9735,
+ 9735, 9735, 9735, 9735, 9735, 9735, 9735, 9735, 9736, 9736,
+ 9736, 9736, 9736, 9736, 9736, 9736, 9736, 9736, 9736, 9736,
+ 9737, 9737, 9737, 9737, 9737, 9737, 9737, 9737, 9737, 9737,
+ 9737, 9737, 9738, 9738, 9738, 9738, 9738, 9738, 9738, 9738,
+
+ 9738, 9738, 9738, 9738, 9739, 9739, 9739, 9739, 9739, 9739,
+ 9739, 9739, 9739, 9739, 9739, 9739, 9740, 9740, 9740, 9740,
+ 9740, 9740, 9740, 9740, 9740, 9740, 9740, 9740, 9741, 9741,
+ 9741, 9741, 9741, 9741, 9741, 9741, 9741, 9741, 9741, 9741,
+ 9742, 9742, 9742, 9742, 9742, 9742, 9742, 9742, 9742, 9742,
+ 9742, 9742, 9743, 9743, 9743, 9743, 9743, 9743, 9743, 9743,
+ 9743, 9743, 9743, 9743, 9744, 9744, 9744, 9744, 9744, 9744,
+ 9744, 9744, 9744, 9744, 9744, 9744, 9745, 9745, 9745, 9745,
+ 9745, 9745, 9745, 9745, 9745, 9745, 9745, 9745, 9746, 0,
+ 0, 0, 9746, 0, 0, 9746, 9747, 9747, 9747, 9747,
+
+ 9747, 9747, 9747, 9747, 9747, 9747, 9747, 9747, 9748, 9748,
+ 9748, 9748, 9748, 9748, 9748, 9748, 9748, 9748, 9748, 9748,
+ 9749, 9749, 9749, 9749, 9749, 9749, 9749, 9749, 9749, 9749,
+ 9749, 9749, 9750, 9750, 9750, 9750, 9750, 9750, 9750, 9750,
+ 9750, 9750, 9750, 9750, 9751, 9751, 9751, 9751, 9751, 9751,
+ 9751, 9751, 9751, 9751, 9751, 9751, 9752, 9752, 9752, 9752,
+ 9752, 9752, 9752, 9752, 9752, 9752, 9752, 9752, 9753, 9753,
+ 9753, 9753, 9753, 9753, 9753, 9753, 9753, 9753, 9753, 9753,
+ 9754, 9754, 9754, 9754, 9754, 9754, 9754, 9754, 9754, 9754,
+ 9754, 9754, 9755, 9755, 9755, 9755, 9755, 9755, 9755, 9755,
+
+ 9755, 9755, 9755, 9755, 9756, 9756, 9756, 9756, 9756, 9756,
+ 9756, 9756, 9756, 9756, 9756, 9756, 9757, 9757, 9757, 9757,
+ 9757, 9757, 9757, 9757, 9757, 9757, 9757, 9757, 9758, 9758,
+ 9758, 9758, 9758, 9758, 9758, 9758, 9758, 9758, 9758, 9758,
+ 9759, 9759, 9759, 9759, 9759, 9759, 9759, 9759, 9759, 9759,
+ 9759, 9759, 9760, 9760, 9760, 9760, 9760, 9760, 9760, 9760,
+ 9760, 9760, 9760, 9760, 9761, 9761, 9761, 9761, 9761, 9761,
+ 9761, 9761, 9761, 9761, 9761, 9761, 9762, 9762, 9762, 9762,
+ 9762, 9762, 9762, 9762, 9762, 9762, 9762, 9762, 9763, 9763,
+ 9763, 9763, 9763, 9763, 9763, 9763, 9763, 9763, 9763, 9763,
+
+ 9764, 9764, 9764, 9764, 9764, 9764, 9764, 9764, 9764, 9764,
+ 9764, 9764, 9765, 9765, 9765, 9765, 9765, 9765, 9765, 9765,
+ 9765, 9765, 9765, 9765, 9766, 0, 0, 0, 9766, 0,
+ 0, 9766, 9767, 9767, 9767, 9767, 9767, 9767, 9767, 9767,
+ 9767, 9767, 9767, 9767, 9768, 9768, 9768, 9768, 9768, 9768,
+ 9768, 9768, 9768, 9768, 9768, 9768, 9769, 9769, 9769, 9769,
+ 9769, 9769, 9769, 9769, 9769, 9769, 9769, 9769, 9770, 9770,
+ 9770, 9770, 9770, 9770, 9770, 9770, 9770, 9770, 9770, 9770,
+ 9771, 9771, 9771, 9771, 9771, 9771, 9771, 9771, 9771, 9771,
+ 9771, 9771, 9772, 9772, 9772, 9772, 9772, 9772, 9772, 9772,
+
+ 9772, 9772, 9772, 9772, 9773, 9773, 9773, 9773, 9773, 9773,
+ 9773, 9773, 9773, 9773, 9773, 9773, 9774, 9774, 9774, 9774,
+ 9774, 9774, 9774, 9774, 9774, 9774, 9774, 9774, 9775, 9775,
+ 9775, 9775, 9775, 9775, 9775, 9775, 9775, 9775, 9775, 9775,
+ 9776, 9776, 9776, 9776, 9776, 9776, 9776, 9776, 9776, 9776,
+ 9776, 9776, 9777, 9777, 9777, 9777, 9777, 9777, 9777, 9777,
+ 9777, 9777, 9777, 9777, 9778, 9778, 9778, 9778, 9778, 9778,
+ 9778, 9778, 9778, 9778, 9778, 9778, 9779, 9779, 9779, 9779,
+ 9779, 9779, 9779, 9779, 9779, 9779, 9779, 9779, 9780, 9780,
+ 9780, 9780, 9780, 9780, 9780, 9780, 9780, 9780, 9780, 9780,
+
+ 9781, 9781, 9781, 9781, 9781, 9781, 9781, 9781, 9781, 9781,
+ 9781, 9781, 9782, 9782, 9782, 9782, 9782, 9782, 9782, 9782,
+ 9782, 9782, 9782, 9782, 9783, 9783, 9783, 9783, 9783, 9783,
+ 9783, 9783, 9783, 9783, 9783, 9783, 9784, 9784, 9784, 9784,
+ 9784, 9784, 9784, 9784, 9784, 9784, 9784, 9784, 9785, 9785,
+ 9785, 9785, 9785, 9785, 9785, 9785, 9785, 9785, 9785, 9785,
+ 9786, 9786, 9786, 9786, 9786, 9786, 9786, 9786, 9786, 9786,
+ 9786, 9786, 9787, 9787, 9787, 9787, 9787, 9787, 9787, 9787,
+ 9787, 9787, 9787, 9787, 9788, 9788, 9788, 9788, 9788, 9788,
+ 9788, 9788, 9788, 9788, 9788, 9788, 9789, 9789, 9789, 9789,
+
+ 9789, 9789, 9789, 9789, 9789, 9789, 9789, 9789, 9790, 9790,
+ 9790, 9790, 9790, 9790, 9790, 9790, 9790, 9790, 9790, 9790,
+ 9791, 9791, 9791, 9791, 9791, 9791, 9791, 9791, 9791, 9791,
+ 9791, 9791, 9792, 9792, 9792, 9792, 9792, 9792, 9792, 9792,
+ 9792, 9792, 9792, 9792, 9793, 9793, 9793, 9793, 9793, 9793,
+ 9793, 9793, 9793, 9793, 9793, 9793, 9794, 9794, 9794, 9794,
+ 9794, 9794, 9794, 9794, 9794, 9794, 9794, 9794, 9795, 9795,
+ 9795, 9795, 9795, 9795, 9795, 9795, 9795, 9795, 9795, 9795,
+ 9796, 9796, 9796, 9796, 9796, 9796, 9796, 9796, 9796, 9796,
+ 9796, 9796, 9797, 9797, 9797, 9797, 9797, 9797, 9797, 9797,
+
+ 9797, 9797, 9797, 9797, 9798, 9798, 9798, 9798, 9798, 9798,
+ 9798, 9798, 9798, 9798, 9798, 9798, 9799, 9799, 9799, 9799,
+ 9799, 9799, 9799, 9799, 9799, 9799, 9799, 9799, 9800, 9800,
+ 9800, 9800, 9800, 9800, 9800, 9800, 9800, 9800, 9800, 9800,
+ 9801, 9801, 9801, 9801, 9801, 9801, 9801, 9801, 9801, 9801,
+ 9801, 9801, 9802, 9802, 9802, 9802, 9802, 9802, 9802, 9802,
+ 9802, 9802, 9802, 9802, 9803, 9803, 9803, 9803, 9803, 9803,
+ 9803, 9803, 9803, 9803, 9803, 9803, 9804, 9804, 9804, 9804,
+ 9804, 9804, 9804, 9804, 9804, 9804, 9804, 9804, 9805, 9805,
+ 9805, 9805, 9805, 9805, 9805, 9805, 9805, 9805, 9805, 9805,
+
+ 9806, 9806, 9806, 9806, 9806, 9806, 9806, 9806, 9806, 9806,
+ 9806, 9806, 9807, 9807, 9807, 9807, 9807, 9807, 9807, 9807,
+ 9807, 9807, 9807, 9807, 9808, 9808, 9808, 9808, 9808, 9808,
+ 9808, 9808, 9808, 9808, 9808, 9808, 9809, 9809, 9809, 9809,
+ 9809, 9809, 9809, 9809, 9809, 9809, 9809, 9809, 9810, 9810,
+ 9810, 9810, 9810, 9810, 9810, 9810, 9810, 9810, 9810, 9810,
+ 9811, 9811, 9811, 9811, 9811, 9811, 9811, 9811, 9811, 9811,
+ 9811, 9811, 9812, 9812, 9812, 9812, 9812, 9812, 9812, 9812,
+ 9812, 9812, 9812, 9812, 9813, 9813, 9813, 9813, 9813, 9813,
+ 9813, 9813, 9813, 9813, 9813, 9813, 9814, 9814, 9814, 9814,
+
+ 9814, 9814, 9814, 9814, 9814, 9814, 9814, 9814, 9815, 9815,
+ 9815, 9815, 9815, 9815, 9815, 9815, 9815, 9815, 9815, 9815,
+ 9816, 9816, 9816, 9816, 9816, 9816, 9816, 9816, 9816, 9816,
+ 9816, 9816, 9817, 9817, 9817, 9817, 9817, 9817, 9817, 9817,
+ 9817, 9817, 9817, 9817, 9818, 9818, 9818, 9818, 9818, 9818,
+ 9818, 9818, 9818, 9818, 9818, 9818, 9819, 9819, 9819, 9819,
+ 9819, 9819, 9819, 9819, 9819, 9819, 9819, 9819, 9820, 9820,
+ 9820, 9820, 9820, 9820, 9820, 9820, 9820, 9820, 9820, 9820,
+ 9821, 9821, 9821, 9821, 9821, 9821, 9821, 9821, 9821, 9821,
+ 9821, 9821, 9822, 9822, 9822, 9822, 9822, 9822, 9822, 9822,
+
+ 9822, 9822, 9822, 9822, 9823, 9823, 9823, 9823, 9823, 9823,
+ 9823, 9823, 9823, 9823, 9823, 9823, 9824, 9824, 9824, 9824,
+ 9824, 9824, 9824, 9824, 9824, 9824, 9824, 9824, 9825, 9825,
+ 9825, 9825, 9825, 9825, 9825, 9825, 9825, 9825, 9825, 9825,
+ 9826, 9826, 9826, 9826, 9826, 9826, 9826, 9826, 9826, 9826,
+ 9826, 9826, 9827, 9827, 9827, 9827, 9827, 9827, 9827, 9827,
+ 9827, 9827, 9827, 9827, 9828, 9828, 9828, 9828, 9828, 9828,
+ 9828, 9828, 9828, 9828, 9828, 9828, 9829, 9829, 9829, 9829,
+ 9829, 9829, 9829, 9829, 9829, 9829, 9829, 9829, 9830, 9830,
+ 9830, 9830, 9830, 9830, 9830, 9830, 9830, 9830, 9830, 9830,
+
+ 9831, 9831, 9831, 9831, 9831, 9831, 9831, 9831, 9831, 9831,
+ 9831, 9831, 9832, 9832, 9832, 9832, 9832, 9832, 9832, 9832,
+ 9832, 9832, 9832, 9832, 9833, 9833, 9833, 9833, 9833, 9833,
+ 9833, 9833, 9833, 9833, 9833, 9833, 9834, 9834, 9834, 9834,
+ 9834, 9834, 9834, 9834, 9834, 9834, 9834, 9834, 9835, 9835,
+ 9835, 9835, 9835, 9835, 9835, 9835, 9835, 9835, 9835, 9835,
+ 9836, 9836, 9836, 9836, 9836, 9836, 9836, 9836, 9836, 9836,
+ 9836, 9836, 9837, 9837, 9837, 9837, 9837, 9837, 9837, 9837,
+ 9837, 9837, 9837, 9837, 9838, 9838, 9838, 9838, 9838, 9838,
+ 9838, 9838, 9838, 9838, 9838, 9838, 9839, 9839, 9839, 9839,
+
+ 9839, 9839, 9839, 9839, 9839, 9839, 9839, 9839, 9840, 9840,
+ 9840, 9840, 9840, 9840, 9840, 9840, 9840, 9840, 9840, 9840,
+ 9841, 9841, 9841, 9841, 9841, 9841, 9841, 9841, 9841, 9841,
+ 9841, 9841, 9842, 9842, 9842, 9842, 9842, 9842, 9842, 9842,
+ 9842, 9842, 9842, 9842, 9843, 9843, 9843, 9843, 9843, 9843,
+ 9843, 9843, 9843, 9843, 9843, 9843, 9844, 9844, 9844, 9844,
+ 9844, 9844, 9844, 9844, 9844, 9844, 9844, 9844, 9845, 9845,
+ 9845, 9845, 9845, 9845, 9845, 9845, 9845, 9845, 9845, 9845,
+ 9846, 9846, 9846, 9846, 9846, 9846, 9846, 9846, 9846, 9846,
+ 9846, 9846, 9847, 9847, 9847, 9847, 9847, 9847, 9847, 9847,
+
+ 9847, 9847, 9847, 9847, 9848, 9848, 9848, 9848, 9848, 9848,
+ 9848, 9848, 9848, 9848, 9848, 9848, 9849, 9849, 9849, 9849,
+ 9849, 9849, 9849, 9849, 9849, 9849, 9849, 9849, 9850, 9850,
+ 9850, 9850, 9850, 9850, 9850, 9850, 9850, 9850, 9850, 9850,
+ 9851, 9851, 9851, 9851, 9851, 9851, 9851, 9851, 9851, 9851,
+ 9851, 9851, 9852, 9852, 9852, 9852, 9852, 9852, 9852, 9852,
+ 9852, 9852, 9852, 9852, 9853, 9853, 9853, 9853, 9853, 9853,
+ 9853, 9853, 9853, 9853, 9853, 9853, 9854, 9854, 9854, 9854,
+ 9854, 9854, 9854, 9854, 9854, 9854, 9854, 9854, 9855, 9855,
+ 9855, 9855, 9855, 9855, 9855, 9855, 9855, 9855, 9855, 9855,
+
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9857, 9857, 9857, 9857, 9857, 9857, 9857, 9857,
+ 9857, 9857, 9857, 9857, 9858, 9858, 9858, 9858, 9858, 9858,
+ 9858, 9858, 9858, 9858, 9858, 9858, 9859, 9859, 9859, 9859,
+ 9859, 9859, 9859, 9859, 9859, 9859, 9859, 9859, 9860, 9860,
+ 9860, 9860, 9860, 9860, 9860, 9860, 9860, 9860, 9860, 9860,
+ 9861, 9861, 9861, 9861, 9861, 9861, 9861, 9861, 9861, 9861,
+ 9861, 9861, 9862, 9862, 9862, 9862, 9862, 9862, 9862, 9862,
+ 9862, 9862, 9862, 9862, 9863, 9863, 9863, 9863, 9863, 9863,
+ 9863, 9863, 9863, 9863, 9863, 9863, 9864, 9864, 9864, 9864,
+
+ 9864, 9864, 9864, 9864, 9864, 9864, 9864, 9864, 9865, 9865,
+ 9865, 9865, 9865, 9865, 9865, 9865, 9865, 9865, 9865, 9865,
+ 9866, 9866, 9866, 9866, 9866, 9866, 9866, 9866, 9866, 9866,
+ 9866, 9866, 9867, 9867, 9867, 9867, 9867, 9867, 9867, 9867,
+ 9867, 9867, 9867, 9867, 9868, 9868, 9868, 9868, 9868, 9868,
+ 9868, 9868, 9868, 9868, 9868, 9868, 9869, 9869, 9869, 9869,
+ 9869, 9869, 9869, 9869, 9869, 9869, 9869, 9869, 9870, 9870,
+ 9870, 9870, 9870, 9870, 9870, 9870, 9870, 9870, 9870, 9870,
+ 9871, 9871, 9871, 9871, 9871, 9871, 9871, 9871, 9871, 9871,
+ 9871, 9871, 9872, 9872, 9872, 9872, 9872, 9872, 9872, 9872,
+
+ 9872, 9872, 9872, 9872, 9873, 9873, 9873, 9873, 9873, 9873,
+ 9873, 9873, 9873, 9873, 9873, 9873, 9874, 9874, 9874, 9874,
+ 9874, 9874, 9874, 9874, 9874, 9874, 9874, 9874, 9875, 9875,
+ 9875, 9875, 9875, 9875, 9875, 9875, 9875, 9875, 9875, 9875,
+ 9876, 9876, 9876, 9876, 9876, 9876, 9876, 9876, 9876, 9876,
+ 9876, 9876, 9877, 9877, 9877, 9877, 9877, 9877, 9877, 9877,
+ 9877, 9877, 9877, 9877, 9878, 9878, 9878, 9878, 9878, 9878,
+ 9878, 9878, 9878, 9878, 9878, 9878, 9879, 9879, 9879, 9879,
+ 9879, 9879, 9879, 9879, 9879, 9879, 9879, 9879, 9880, 9880,
+ 9880, 9880, 9880, 9880, 9880, 9880, 9880, 9880, 9880, 9880,
+
+ 9881, 9881, 9881, 9881, 9881, 9881, 9881, 9881, 9881, 9881,
+ 9881, 9881, 9882, 9882, 9882, 9882, 9882, 9882, 9882, 9882,
+ 9882, 9882, 9882, 9882, 9883, 9883, 9883, 9883, 9883, 9883,
+ 9883, 9883, 9883, 9883, 9883, 9883, 9884, 9884, 9884, 9884,
+ 9884, 9884, 9884, 9884, 9884, 9884, 9884, 9884, 9885, 9885,
+ 9885, 9885, 9885, 9885, 9885, 9885, 9885, 9885, 9885, 9885,
+ 9886, 9886, 9886, 9886, 9886, 9886, 9886, 9886, 9886, 9886,
+ 9886, 9886, 9887, 9887, 9887, 9887, 9887, 9887, 9887, 9887,
+ 9887, 9887, 9887, 9887, 9888, 9888, 9888, 9888, 9888, 9888,
+ 9888, 9888, 9888, 9888, 9888, 9888, 9889, 9889, 9889, 9889,
+
+ 9889, 9889, 9889, 9889, 9889, 9889, 9889, 9889, 9890, 9890,
+ 9890, 9890, 9890, 9890, 9890, 9890, 9890, 9890, 9890, 9890,
+ 9891, 9891, 9891, 9891, 9891, 9891, 9891, 9891, 9891, 9891,
+ 9891, 9891, 9892, 9892, 9892, 9892, 9892, 9892, 9892, 9892,
+ 9892, 9892, 9892, 9892, 9893, 9893, 9893, 9893, 9893, 9893,
+ 9893, 9893, 9893, 9893, 9893, 9893, 9894, 9894, 9894, 9894,
+ 9894, 9894, 9894, 9894, 9894, 9894, 9894, 9894, 9895, 9895,
+ 9895, 9895, 9895, 9895, 9895, 9895, 9895, 9895, 9895, 9895,
+ 9896, 9896, 9896, 9896, 9896, 9896, 9896, 9896, 9896, 9896,
+ 9896, 9896, 9897, 9897, 9897, 9897, 9897, 9897, 9897, 9897,
+
+ 9897, 9897, 9897, 9897, 9898, 9898, 9898, 9898, 9898, 9898,
+ 9898, 9898, 9898, 9898, 9898, 9898, 9899, 9899, 9899, 9899,
+ 9899, 9899, 9899, 9899, 9899, 9899, 9899, 9899, 9900, 9900,
+ 9900, 9900, 9900, 9900, 9900, 9900, 9900, 9900, 9900, 9900,
+ 9901, 9901, 9901, 9901, 9901, 9901, 9901, 9901, 9901, 9901,
+ 9901, 9901, 9902, 9902, 9902, 9902, 9902, 9902, 9902, 9902,
+ 9902, 9902, 9902, 9902, 9903, 9903, 9903, 9903, 9903, 9903,
+ 9903, 9903, 9903, 9903, 9903, 9903, 9904, 9904, 9904, 9904,
+ 9904, 9904, 9904, 9904, 9904, 9904, 9904, 9904, 9905, 9905,
+ 9905, 9905, 9905, 9905, 9905, 9905, 9905, 9905, 9905, 9905,
+
+ 9906, 9906, 9906, 9906, 9906, 9906, 9906, 9906, 9906, 9906,
+ 9906, 9906, 9907, 9907, 9907, 9907, 9907, 9907, 9907, 9907,
+ 9907, 9907, 9907, 9907, 9908, 9908, 0, 9908, 9908, 9908,
+ 9908, 9908, 9908, 9908, 9908, 9908, 9909, 9909, 9909, 9909,
+ 9909, 9909, 9909, 9909, 9909, 9909, 9909, 9909, 9910, 9910,
+ 9910, 9910, 9910, 9910, 9910, 9910, 9910, 9910, 9910, 9910,
+ 9911, 9911, 9911, 9911, 9911, 9911, 9911, 9911, 9911, 9911,
+ 9911, 9911, 9912, 9912, 9912, 9912, 9912, 9912, 9912, 9912,
+ 9912, 9912, 9912, 9912, 9913, 9913, 9913, 9913, 9913, 9913,
+ 9913, 9913, 9913, 9913, 9913, 9913, 9914, 9914, 9914, 9914,
+
+ 9914, 9914, 9914, 9914, 9914, 9914, 9914, 9914, 9915, 9915,
+ 9915, 9915, 9915, 9915, 9915, 9915, 9915, 9915, 9915, 9915,
+ 9916, 9916, 9916, 9916, 9916, 9916, 9916, 9916, 9916, 9916,
+ 9916, 9916, 9917, 9917, 9917, 9917, 9917, 9917, 9917, 9917,
+ 9917, 9917, 9917, 9917, 9918, 9918, 9918, 9918, 9918, 9918,
+ 9918, 9918, 9918, 9918, 9918, 9918, 9919, 9919, 9919, 9919,
+ 9919, 9919, 9919, 9919, 9919, 9919, 9919, 9919, 9920, 9920,
+ 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920,
+ 9921, 9921, 9921, 9921, 9921, 9921, 9921, 9921, 9921, 9921,
+ 9921, 9921, 9922, 9922, 9922, 9922, 9922, 9922, 9922, 9922,
+
+ 9922, 9922, 9922, 9922, 9923, 9923, 9923, 9923, 9923, 9923,
+ 9923, 9923, 9923, 9923, 9923, 9923, 9924, 9924, 9924, 9924,
+ 9924, 9924, 9924, 9924, 9924, 9924, 9924, 9924, 9925, 9925,
+ 9925, 9925, 9925, 9925, 9925, 9925, 9925, 9925, 9925, 9925,
+ 9926, 9926, 9926, 9926, 9926, 9926, 9926, 9926, 9926, 9926,
+ 9926, 9926, 9927, 9927, 9927, 9927, 9927, 9927, 9927, 9927,
+ 9927, 9927, 9927, 9927, 9928, 9928, 9928, 9928, 9928, 9928,
+ 9928, 9928, 9928, 9928, 9928, 9928, 9929, 9929, 9929, 9929,
+ 9929, 9929, 9929, 9929, 9929, 9929, 9929, 9929, 9930, 9930,
+ 9930, 9930, 9930, 9930, 9930, 9930, 9930, 9930, 9930, 9930,
+
+ 9931, 9931, 9931, 9931, 9931, 9931, 9931, 9931, 9931, 9931,
+ 9931, 9931, 9932, 9932, 9932, 9932, 9932, 9932, 9932, 9932,
+ 9932, 9932, 9932, 9932, 9933, 9933, 9933, 9933, 9933, 9933,
+ 9933, 9933, 9933, 9933, 9933, 9933, 9934, 9934, 9934, 9934,
+ 9934, 9934, 9934, 9934, 9934, 9934, 9934, 9934, 9935, 9935,
+ 9935, 9935, 9935, 9935, 9935, 9935, 9935, 9935, 9935, 9935,
+ 9936, 9936, 9936, 9936, 9936, 9936, 9936, 9936, 9936, 9936,
+ 9936, 9936, 9937, 9937, 9937, 9937, 9937, 9937, 9937, 9937,
+ 9937, 9937, 9937, 9937, 9938, 9938, 9938, 9938, 9938, 9938,
+ 9938, 9938, 9938, 9938, 9938, 9938, 9939, 9939, 9939, 9939,
+
+ 9939, 9939, 9939, 9939, 9939, 9939, 9939, 9939, 9940, 9940,
+ 9940, 9940, 9940, 9940, 9940, 9940, 9940, 9940, 9940, 9940,
+ 9941, 9941, 9941, 9941, 9941, 9941, 9941, 9941, 9941, 9941,
+ 9941, 9941, 9942, 9942, 9942, 9942, 9942, 9942, 9942, 9942,
+ 9942, 9942, 9942, 9942, 9943, 9943, 9943, 9943, 9943, 9943,
+ 9943, 9943, 9943, 9943, 9943, 9943, 9944, 9944, 9944, 9944,
+ 9944, 9944, 9944, 9944, 9944, 9944, 9944, 9944, 9945, 9945,
+ 9945, 9945, 9945, 9945, 9945, 9945, 9945, 9945, 9945, 9945,
+ 9946, 9946, 9946, 9946, 9946, 9946, 9946, 9946, 9946, 9946,
+ 9946, 9946, 9947, 9947, 9947, 9947, 9947, 9947, 9947, 9947,
+
+ 9947, 9947, 9947, 9947, 9948, 9948, 9948, 9948, 9948, 9948,
+ 9948, 9948, 9948, 9948, 9948, 9948, 9949, 9949, 9949, 9949,
+ 9949, 9949, 9949, 9949, 9949, 9949, 9949, 9949, 9950, 9950,
+ 9950, 9950, 9950, 9950, 9950, 9950, 9950, 9950, 9950, 9950,
+ 9951, 9951, 9951, 9951, 9951, 9951, 9951, 9951, 9951, 9951,
+ 9951, 9951, 9952, 9952, 9952, 9952, 9952, 9952, 9952, 9952,
+ 9952, 9952, 9952, 9952, 9953, 9953, 9953, 9953, 9953, 9953,
+ 9953, 9953, 9953, 9953, 9953, 9953, 9954, 9954, 9954, 9954,
+ 9954, 9954, 9954, 9954, 9954, 9954, 9954, 9954, 9955, 9955,
+ 9955, 9955, 9955, 9955, 9955, 9955, 9955, 9955, 9955, 9955,
+
+ 9956, 9956, 9956, 9956, 9956, 9956, 9956, 9956, 9956, 9956,
+ 9956, 9956, 9957, 9957, 9957, 9957, 9957, 9957, 9957, 9957,
+ 9957, 9957, 9957, 9957, 9958, 9958, 9958, 9958, 9958, 9958,
+ 9958, 9958, 9958, 9958, 9958, 9958, 9959, 9959, 9959, 9959,
+ 9959, 9959, 9959, 9959, 9959, 9959, 9959, 9959, 9960, 9960,
+ 9960, 9960, 9960, 9960, 9960, 9960, 9960, 9960, 9960, 9960,
+ 9961, 9961, 9961, 9961, 9961, 9961, 9961, 9961, 9961, 9961,
+ 9961, 9961, 9962, 9962, 9962, 9962, 9962, 9962, 9962, 9962,
+ 9962, 9962, 9962, 9962, 9963, 9963, 9963, 9963, 9963, 9963,
+ 9963, 9963, 9963, 9963, 9963, 9963, 9964, 9964, 9964, 9964,
+
+ 9964, 9964, 9964, 9964, 9964, 9964, 9964, 9964, 9965, 9965,
+ 9965, 9965, 9965, 9965, 9965, 9965, 9965, 9965, 9965, 9965,
+ 9966, 9966, 9966, 9966, 9966, 9966, 9966, 9966, 9966, 9966,
+ 9966, 9966, 9967, 9967, 9967, 9967, 9967, 9967, 9967, 9967,
+ 9967, 9967, 9967, 9967, 9968, 9968, 9968, 9968, 9968, 9968,
+ 9968, 9968, 9968, 9968, 9968, 9968, 9969, 9969, 9969, 9969,
+ 9969, 9969, 9969, 9969, 9969, 9969, 9969, 9969, 9970, 9970,
+ 9970, 9970, 9970, 9970, 9970, 9970, 9970, 9970, 9970, 9970,
+ 9971, 9971, 9971, 9971, 9971, 9971, 9971, 9971, 9971, 9971,
+ 9971, 9971, 9972, 9972, 9972, 9972, 9972, 9972, 9972, 9972,
+
+ 9972, 9972, 9972, 9972, 9973, 9973, 9973, 9973, 9973, 9973,
+ 9973, 9973, 9973, 9973, 9973, 9973, 9974, 9974, 9974, 9974,
+ 9974, 9974, 9974, 9974, 9974, 9974, 9974, 9974, 9975, 0,
+ 0, 0, 9975, 0, 0, 9975, 9976, 9976, 9976, 9976,
+ 9976, 9976, 9976, 9976, 9976, 9976, 9976, 9976, 9977, 9977,
+ 9977, 9977, 9977, 9977, 9977, 9977, 9977, 9977, 9977, 9977,
+ 9978, 9978, 9978, 9978, 9978, 9978, 9978, 9978, 9978, 9978,
+ 9978, 9978, 9979, 9979, 9979, 9979, 9979, 9979, 9979, 9979,
+ 9979, 9979, 9979, 9979, 9980, 9980, 9980, 9980, 9980, 9980,
+ 9980, 9980, 9980, 9980, 9980, 9980, 9981, 9981, 9981, 9981,
+
+ 9981, 9981, 9981, 9981, 9981, 9981, 9981, 9981, 9982, 9982,
+ 9982, 9982, 9982, 9982, 9982, 9982, 9982, 9982, 9982, 9982,
+ 9983, 9983, 9983, 9983, 9983, 9983, 9983, 9983, 9983, 9983,
+ 9983, 9983, 9984, 9984, 9984, 9984, 9984, 9984, 9984, 9984,
+ 9984, 9984, 9984, 9984, 9985, 9985, 9985, 9985, 9985, 9985,
+ 9985, 9985, 9985, 9985, 9985, 9985, 9986, 9986, 9986, 9986,
+ 9986, 9986, 9986, 9986, 9986, 9986, 9986, 9986, 9987, 9987,
+ 9987, 9987, 9987, 9987, 9987, 9987, 9987, 9987, 9987, 9987,
+ 9988, 9988, 9988, 9988, 9988, 9988, 9988, 9988, 9988, 9988,
+ 9988, 9988, 9989, 9989, 9989, 9989, 9989, 9989, 9989, 9989,
+
+ 9989, 9989, 9989, 9989, 9990, 9990, 9990, 9990, 9990, 9990,
+ 9990, 9990, 9990, 9990, 9990, 9990, 9991, 9991, 9991, 9991,
+ 9991, 9991, 9991, 9991, 9991, 9991, 9991, 9991, 9992, 9992,
+ 9992, 9992, 9992, 9992, 9992, 9992, 9992, 9992, 9992, 9992,
+ 9993, 9993, 9993, 9993, 9993, 9993, 9993, 9993, 9993, 9993,
+ 9993, 9993, 9994, 9994, 9994, 9994, 9994, 9994, 9994, 9994,
+ 9994, 9994, 9994, 9994, 9995, 9995, 9995, 9995, 9995, 9995,
+ 9995, 9995, 9995, 9995, 9995, 9995, 9996, 9996, 9996, 9996,
+ 9996, 9996, 9996, 9996, 9996, 9996, 9996, 9996, 9997, 9997,
+ 9997, 9997, 9997, 9997, 9997, 9997, 9997, 9997, 9997, 9997,
+
+ 9998, 0, 0, 0, 9998, 0, 0, 9998, 9999, 9999,
+ 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999,
+ 10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,
+ 10000,10000,10001,10001,10001,10001,10001,10001,10001,10001,
+ 10001,10001,10001,10001,10002,10002,10002,10002,10002,10002,
+ 10002,10002,10002,10002,10002,10002,10003,10003,10003,10003,
+ 10003,10003,10003,10003,10003,10003,10003,10003,10004,10004,
+ 10004,10004,10004,10004,10004,10004,10004,10004,10004,10004,
+ 10005,10005,10005,10005,10005,10005,10005,10005,10005,10005,
+ 10005,10005,10006,10006,10006,10006,10006,10006,10006,10006,
+
+ 10006,10006,10006,10006,10007,10007,10007,10007,10007,10007,
+ 10007,10007,10007,10007,10007,10007,10008,10008,10008,10008,
+ 10008,10008,10008,10008,10008,10008,10008,10008,10009,10009,
+ 10009,10009,10009,10009,10009,10009,10009,10009,10009,10009,
+ 10010,10010,10010,10010,10010,10010,10010,10010,10010,10010,
+ 10010,10010,10011,10011,10011,10011,10011,10011,10011,10011,
+ 10011,10011,10011,10011,10012,10012,10012,10012,10012,10012,
+ 10012,10012,10012,10012,10012,10012,10013,10013,10013,10013,
+ 10013,10013,10013,10013,10013,10013,10013,10013,10014,10014,
+ 10014,10014,10014,10014,10014,10014,10014,10014,10014,10014,
+
+ 10015,10015,10015,10015,10015,10015,10015,10015,10015,10015,
+ 10015,10015,10016,10016,10016,10016,10016,10016,10016,10016,
+ 10016,10016,10016,10016,10017,10017,10017,10017,10017,10017,
+ 10017,10017,10017,10017,10017,10017,10018,10018,10018,10018,
+ 10018,10018,10018,10018,10018,10018,10018,10018,10019,10019,
+ 10019,10019,10019,10019,10019,10019,10019,10019,10019,10019,
+ 10020,10020,10020,10020,10020,10020,10020,10020,10020,10020,
+ 10020,10020,10021,10021,10021,10021,10021,10021,10021,10021,
+ 10021,10021,10021,10021,10022,10022,10022,10022,10022,10022,
+ 10022,10022,10022,10022,10022,10022,10023,10023,10023,10023,
+
+ 10023,10023,10023,10023,10023,10023,10023,10023,10024,10024,
+ 10024,10024,10024,10024,10024,10024,10024,10024,10024,10024,
+ 10025,10025,10025,10025,10025,10025,10025,10025,10025,10025,
+ 10025,10025,10026,10026,10026,10026,10026,10026,10026,10026,
+ 10026,10026,10026,10026,10027,10027,10027,10027,10027,10027,
+ 10027,10027,10027,10027,10027,10027,10028,10028,10028,10028,
+ 10028,10028,10028,10028,10028,10028,10028,10028,10029,10029,
+ 10029,10029,10029,10029,10029,10029,10029,10029,10029,10029,
+ 10030,10030,10030,10030,10030,10030,10030,10030,10030,10030,
+ 10030,10030,10031,10031,10031,10031,10031,10031,10031,10031,
+
+ 10031,10031,10031,10031,10032,10032,10032,10032,10032,10032,
+ 10032,10032,10032,10032,10032,10032,10033,10033,10033,10033,
+ 10033,10033,10033,10033,10033,10033,10033,10033,10034,10034,
+ 10034,10034,10034,10034,10034,10034,10034,10034,10034,10034,
+ 10035,10035,10035,10035,10035,10035,10035,10035,10035,10035,
+ 10035,10035,10036,10036,10036,10036,10036,10036,10036,10036,
+ 10036,10036,10036,10036,10037,10037,10037,10037,10037,10037,
+ 10037,10037,10037,10037,10037,10037,10038,10038,10038,10038,
+ 10038,10038,10038,10038,10038,10038,10038,10038,10039,10039,
+ 10039,10039,10039,10039,10039,10039,10039,10039,10039,10039,
+
+ 10040,10040,10040,10040,10040,10040,10040,10040,10040,10040,
+ 10040,10040,10041,10041,10041,10041,10041,10041,10041,10041,
+ 10041,10041,10041,10041,10042,10042,10042,10042,10042,10042,
+ 10042,10042,10042,10042,10042,10042,10043,10043,10043,10043,
+ 10043,10043,10043,10043,10043,10043,10043,10043,10044,10044,
+ 10044,10044,10044,10044,10044,10044,10044,10044,10044,10044,
+ 10045,10045,10045,10045,10045,10045,10045,10045,10045,10045,
+ 10045,10045,10046,10046,10046,10046,10046,10046,10046,10046,
+ 10046,10046,10046,10046,10047,10047,10047,10047,10047,10047,
+ 10047,10047,10047,10047,10047,10047,10048,10048,10048,10048,
+
+ 10048,10048,10048,10048,10048,10048,10048,10048,10049,10049,
+ 10049,10049,10049,10049,10049,10049,10049,10049,10049,10049,
+ 10050,10050,10050,10050,10050,10050,10050,10050,10050,10050,
+ 10050,10050,10051,10051,10051,10051,10051,10051,10051,10051,
+ 10051,10051,10051,10051,10052,10052,10052,10052,10052,10052,
+ 10052,10052,10052,10052,10052,10052,10053,10053,10053,10053,
+ 10053,10053,10053,10053,10053,10053,10053,10053,10054,10054,
+ 10054,10054,10054,10054,10054,10054,10054,10054,10054,10054,
+ 10055,10055,10055,10055,10055,10055,10055,10055,10055,10055,
+ 10055,10055,10056,10056,10056,10056,10056,10056,10056,10056,
+
+ 10056,10056,10056,10056,10057,10057,10057,10057,10057,10057,
+ 10057,10057,10057,10057,10057,10057,10058,10058,10058,10058,
+ 10058,10058,10058,10058,10058,10058,10058,10058,10059,10059,
+ 10059,10059,10059,10059,10059,10059,10059,10059,10059,10059,
+ 10060,10060,10060,10060,10060,10060,10060,10060,10060,10060,
+ 10060,10060,10061,10061,10061,10061,10061,10061,10061,10061,
+ 10061,10061,10061,10061,10062,10062,10062,10062,10062,10062,
+ 10062,10062,10062,10062,10062,10062,10063,10063,10063,10063,
+ 10063,10063,10063,10063,10063,10063,10063,10063,10064,10064,
+ 10064,10064,10064,10064,10064,10064,10064,10064,10064,10064,
+
+ 10065,10065,10065,10065,10065,10065,10065,10065,10065,10065,
+ 10065,10065,10066,10066,10066,10066,10066,10066,10066,10066,
+ 10066,10066,10066,10066,10067,10067,10067,10067,10067,10067,
+ 10067,10067,10067,10067,10067,10067,10068,10068,10068,10068,
+ 10068,10068,10068,10068,10068,10068,10068,10068,10069,10069,
+ 10069,10069,10069,10069,10069,10069,10069,10069,10069,10069,
+ 10070,10070,10070,10070,10070,10070,10070,10070,10070,10070,
+ 10070,10070,10071,10071,10071,10071,10071,10071,10071,10071,
+ 10071,10071,10071,10071,10072,10072,10072,10072,10072,10072,
+ 10072,10072,10072,10072,10072,10072,10073,10073,10073,10073,
+
+ 10073,10073,10073,10073,10073,10073,10073,10073,10074,10074,
+ 10074,10074,10074,10074,10074,10074,10074,10074,10074,10074,
+ 10075,10075,10075,10075,10075,10075,10075,10075,10075,10075,
+ 10075,10075,10076,10076,10076,10076,10076,10076,10076,10076,
+ 10076,10076,10076,10076,10077,10077,10077,10077,10077,10077,
+ 10077,10077,10077,10077,10077,10077,10078,10078,10078,10078,
+ 10078,10078,10078,10078,10078,10078,10078,10078,10079,10079,
+ 10079,10079,10079,10079,10079,10079,10079,10079,10079,10079,
+ 10080,10080,10080,10080,10080,10080,10080,10080,10080,10080,
+ 10080,10080,10081,10081,10081,10081,10081,10081,10081,10081,
+
+ 10081,10081,10081,10081,10082,10082,10082,10082,10082,10082,
+ 10082,10082,10082,10082,10082,10082,10083,10083,10083,10083,
+ 10083,10083,10083,10083,10083,10083,10083,10083,10084,10084,
+ 10084,10084,10084,10084,10084,10084,10084,10084,10084,10084,
+ 10085,10085,10085,10085,10085,10085,10085,10085,10085,10085,
+ 10085,10085,10086,10086,10086,10086,10086,10086,10086,10086,
+ 10086,10086,10086,10086,10087,10087,10087,10087,10087,10087,
+ 10087,10087,10087,10087,10087,10087,10088,10088,10088,10088,
+ 10088,10088,10088,10088,10088,10088,10088,10088,10089,10089,
+ 10089,10089,10089,10089,10089,10089,10089,10089,10089,10089,
+
+ 10090,10090,10090,10090,10090,10090,10090,10090,10090,10090,
+ 10090,10090,10091,10091,10091,10091,10091,10091,10091,10091,
+ 10091,10091,10091,10091,10092,10092,10092,10092,10092,10092,
+ 10092,10092,10092,10092,10092,10092,10093,10093,10093,10093,
+ 10093,10093,10093,10093,10093,10093,10093,10093,10094,10094,
+ 10094,10094,10094,10094,10094,10094,10094,10094,10094,10094,
+ 10095,10095,10095,10095,10095,10095,10095,10095,10095,10095,
+ 10095,10095,10096,10096,10096,10096,10096,10096,10096,10096,
+ 10096,10096,10096,10096,10097,10097,10097,10097,10097,10097,
+ 10097,10097,10097,10097,10097,10097,10098,10098,10098,10098,
+
+ 10098,10098,10098,10098,10098,10098,10098,10098,10099,10099,
+ 10099,10099,10099,10099,10099,10099,10099,10099,10099,10099,
+ 10100,10100,10100,10100,10100,10100,10100,10100,10100,10100,
+ 10100,10100,10101,10101,10101,10101,10101,10101,10101,10101,
+ 10101,10101,10101,10101,10102,10102,10102,10102,10102,10102,
+ 10102,10102,10102,10102,10102,10102,10103,10103,10103,10103,
+ 10103,10103,10103,10103,10103,10103,10103,10103,10104,10104,
+ 10104,10104,10104,10104,10104,10104,10104,10104,10104,10104,
+ 10105,10105,10105,10105,10105,10105,10105,10105,10105,10105,
+ 10105,10105,10106,10106,10106,10106,10106,10106,10106,10106,
+
+ 10106,10106,10106,10106,10107,10107,10107,10107,10107,10107,
+ 10107,10107,10107,10107,10107,10107,10108,10108,10108,10108,
+ 10108,10108,10108,10108,10108,10108,10108,10108,10109,10109,
+ 10109,10109,10109,10109,10109,10109,10109,10109,10109,10109,
+ 10110,10110,10110,10110,10110,10110,10110,10110,10110,10110,
+ 10110,10110,10111,10111,10111,10111,10111,10111,10111,10111,
+ 10111,10111,10111,10111,10112,10112,10112,10112,10112,10112,
+ 10112,10112,10112,10112,10112,10112,10113,10113,10113,10113,
+ 10113,10113,10113,10113,10113,10113,10113,10113,10114,10114,
+ 10114,10114,10114,10114,10114,10114,10114,10114,10114,10114,
+
+ 10115,10115,10115,10115,10115,10115,10115,10115,10115,10115,
+ 10115,10115,10116,10116,10116,10116,10116,10116,10116,10116,
+ 10116,10116,10116,10116,10117,10117,10117,10117,10117,10117,
+ 10117,10117,10117,10117,10117,10117,10118,10118,10118,10118,
+ 10118,10118,10118,10118,10118,10118,10118,10118,10119,10119,
+ 10119,10119,10119,10119,10119,10119,10119,10119,10119,10119,
+ 10120,10120,10120,10120,10120,10120,10120,10120,10120,10120,
+ 10120,10120,10121,10121,10121,10121,10121,10121,10121,10121,
+ 10121,10121,10121,10121,10122,10122,10122,10122,10122,10122,
+ 10122,10122,10122,10122,10122,10122,10123,10123,10123,10123,
+
+ 10123,10123,10123,10123,10123,10123,10123,10123,10124,10124,
+ 10124,10124,10124,10124,10124,10124,10124,10124,10124,10124,
+ 10125,10125,10125,10125,10125,10125,10125,10125,10125,10125,
+ 10125,10125,10126,10126,10126,10126,10126,10126,10126,10126,
+ 10126,10126,10126,10126,10127,10127,10127,10127,10127,10127,
+ 10127,10127,10127,10127,10127,10127,10128,10128,10128,10128,
+ 10128,10128,10128,10128,10128,10128,10128,10128,10129,10129,
+ 10129,10129,10129,10129,10129,10129,10129,10129,10129,10129,
+ 10130,10130,10130,10130,10130,10130,10130,10130,10130,10130,
+ 10130,10130,10131,10131,10131,10131,10131,10131,10131,10131,
+
+ 10131,10131,10131,10131,10132,10132,10132,10132,10132,10132,
+ 10132,10132,10132,10132,10132,10132,10133,10133,10133,10133,
+ 10133,10133,10133,10133,10133,10133,10133,10133,10134,10134,
+ 10134,10134,10134,10134,10134,10134,10134,10134,10134,10134,
+ 10135,10135,10135,10135,10135,10135,10135,10135,10135,10135,
+ 10135,10135,10136,10136,10136,10136,10136,10136,10136,10136,
+ 10136,10136,10136,10136,10137,10137,10137,10137,10137,10137,
+ 10137,10137,10137,10137,10137,10137,10138,10138,10138,10138,
+ 10138,10138,10138,10138,10138,10138,10138,10138,10139,10139,
+ 10139,10139,10139,10139,10139,10139,10139,10139,10139,10139,
+
+ 10140,10140,10140,10140,10140,10140,10140,10140,10140,10140,
+ 10140,10140,10141,10141,10141,10141,10141,10141,10141,10141,
+ 10141,10141,10141,10141,10142,10142,10142,10142,10142,10142,
+ 10142,10142,10142,10142,10142,10142,10143,10143,10143,10143,
+ 10143,10143,10143,10143,10143,10143,10143,10143,10144,10144,
+ 10144,10144,10144,10144,10144,10144,10144,10144,10144,10144,
+ 10145,10145,10145,10145,10145,10145,10145,10145,10145,10145,
+ 10145,10145,10146,10146,10146,10146,10146,10146,10146,10146,
+ 10146,10146,10146,10146,10147,10147,10147,10147,10147,10147,
+ 10147,10147,10147,10147,10147,10147,10148,10148,10148,10148,
+
+ 10148,10148,10148,10148,10148,10148,10148,10148,10149,10149,
+ 10149,10149,10149,10149,10149,10149,10149,10149,10149,10149,
+ 10150,10150,10150,10150,10150,10150,10150,10150,10150,10150,
+ 10150,10150,10151,10151,10151,10151,10151,10151,10151,10151,
+ 10151,10151,10151,10151,10152,10152,10152,10152,10152,10152,
+ 10152,10152,10152,10152,10152,10152,10153,10153,10153,10153,
+ 10153,10153,10153,10153,10153,10153,10153,10153,10154,10154,
+ 10154,10154,10154,10154,10154,10154,10154,10154,10154,10154,
+ 10155,10155,10155,10155,10155,10155,10155,10155,10155,10155,
+ 10155,10155,10156,10156,10156,10156,10156,10156,10156,10156,
+
+ 10156,10156,10156,10156,10157,10157,10157,10157,10157,10157,
+ 10157,10157,10157,10157,10157,10157,10158,10158,10158,10158,
+ 10158,10158,10158,10158,10158,10158,10158,10158,10159,10159,
+ 10159,10159,10159,10159,10159,10159,10159,10159,10159,10159,
+ 10160,10160,10160,10160,10160,10160,10160,10160,10160,10160,
+ 10160,10160,10161,10161, 0,10161,10161,10161,10161,10161,
+ 10161,10161,10161,10161,10162,10162,10162,10162,10162,10162,
+ 10162,10162,10162,10162,10162,10162,10163,10163,10163,10163,
+ 10163,10163,10163,10163,10163,10163,10163,10163,10164,10164,
+ 10164,10164,10164,10164,10164,10164,10164,10164,10164,10164,
+
+ 10165,10165,10165,10165,10165,10165,10165,10165,10165,10165,
+ 10165,10165,10166,10166,10166,10166,10166,10166,10166,10166,
+ 10166,10166,10166,10166,10167,10167,10167,10167,10167,10167,
+ 10167,10167,10167,10167,10167,10167,10168,10168,10168,10168,
+ 10168,10168,10168,10168,10168,10168,10168,10168,10169,10169,
+ 10169,10169,10169,10169,10169,10169,10169,10169,10169,10169,
+ 10170,10170,10170,10170,10170,10170,10170,10170,10170,10170,
+ 10170,10170,10171,10171,10171,10171,10171,10171,10171,10171,
+ 10171,10171,10171,10171,10172,10172,10172,10172,10172,10172,
+ 10172,10172,10172,10172,10172,10172,10173,10173,10173,10173,
+
+ 10173,10173,10173,10173,10173,10173,10173,10173,10174,10174,
+ 10174,10174,10174,10174,10174,10174,10174,10174,10174,10174,
+ 10175,10175,10175,10175,10175,10175,10175,10175,10175,10175,
+ 10175,10175,10176,10176,10176,10176,10176,10176,10176,10176,
+ 10176,10176,10176,10176,10177,10177,10177,10177,10177,10177,
+ 10177,10177,10177,10177,10177,10177,10178,10178,10178,10178,
+ 10178,10178,10178,10178,10178,10178,10178,10178,10179,10179,
+ 10179,10179,10179,10179,10179,10179,10179,10179,10179,10179,
+ 10180,10180,10180,10180,10180,10180,10180,10180,10180,10180,
+ 10180,10180,10181,10181, 0,10181,10181,10181,10181,10181,
+
+ 10181,10181,10181,10181,10182,10182,10182,10182,10182,10182,
+ 10182,10182,10182,10182,10182,10182,10183,10183,10183,10183,
+ 10183,10183,10183,10183,10183,10183,10183,10183,10184,10184,
+ 10184,10184,10184,10184,10184,10184,10184,10184,10184,10184,
+ 10185,10185,10185,10185,10185,10185,10185,10185,10185,10185,
+ 10185,10185,10186,10186,10186,10186,10186,10186,10186,10186,
+ 10186,10186,10186,10186,10187,10187,10187,10187,10187,10187,
+ 10187,10187,10187,10187,10187,10187,10188,10188,10188,10188,
+ 10188,10188,10188,10188,10188,10188,10188,10188,10189,10189,
+ 10189,10189,10189,10189,10189,10189,10189,10189,10189,10189,
+
+ 10190,10190,10190,10190,10190,10190,10190,10190,10190,10190,
+ 10190,10190,10191,10191,10191,10191,10191,10191,10191,10191,
+ 10191,10191,10191,10191,10192,10192,10192,10192,10192,10192,
+ 10192,10192,10192,10192,10192,10192,10193,10193,10193,10193,
+ 10193,10193,10193,10193,10193,10193,10193,10193,10194,10194,
+ 10194,10194,10194,10194,10194,10194,10194,10194,10194,10194,
+ 10195,10195,10195,10195,10195,10195,10195,10195,10195,10195,
+ 10195,10195,10196,10196,10196,10196,10196,10196,10196,10196,
+ 10196,10196,10196,10196,10197,10197,10197,10197,10197,10197,
+ 10197,10197,10197,10197,10197,10197,10198,10198,10198,10198,
+
+ 10198,10198,10198,10198,10198,10198,10198,10198,10199,10199,
+ 10199,10199,10199,10199,10199,10199,10199,10199,10199,10199,
+ 10200,10200,10200,10200,10200,10200,10200,10200,10200,10200,
+ 10200,10200,10201,10201,10201,10201,10201,10201,10201,10201,
+ 10201,10201,10201,10201,10202,10202,10202,10202,10202,10202,
+ 10202,10202,10202,10202,10202,10202,10203,10203,10203,10203,
+ 10203,10203,10203,10203,10203,10203,10203,10203,10204,10204,
+ 10204,10204,10204,10204,10204,10204,10204,10204,10204,10204,
+ 10205,10205,10205,10205,10205,10205,10205,10205,10205,10205,
+ 10205,10205,10206,10206,10206,10206,10206,10206,10206,10206,
+
+ 10206,10206,10206,10206,10207,10207,10207,10207,10207,10207,
+ 10207,10207,10207,10207,10207,10207,10208,10208,10208,10208,
+ 10208,10208,10208,10208,10208,10208,10208,10208,10209,10209,
+ 10209,10209,10209,10209,10209,10209,10209,10209,10209,10209,
+ 10210,10210,10210,10210,10210,10210,10210,10210,10210,10210,
+ 10210,10210,10211,10211,10211,10211,10211,10211,10211,10211,
+ 10211,10211,10211,10211,10212,10212,10212,10212,10212,10212,
+ 10212,10212,10212,10212,10212,10212,10213,10213,10213,10213,
+ 10213,10213,10213,10213,10213,10213,10213,10213,10214,10214,
+ 10214,10214,10214,10214,10214,10214,10214,10214,10214,10214,
+
+ 10215,10215,10215,10215,10215,10215,10215,10215,10215,10215,
+ 10215,10215,10216,10216,10216,10216,10216,10216,10216,10216,
+ 10216,10216,10216,10216,10217,10217,10217,10217,10217,10217,
+ 10217,10217,10217,10217,10217,10217,10218,10218,10218,10218,
+ 10218,10218,10218,10218,10218,10218,10218,10218,10219,10219,
+ 10219,10219,10219,10219,10219,10219,10219,10219,10219,10219,
+ 10220,10220,10220,10220,10220,10220,10220,10220,10220,10220,
+ 10220,10220,10221,10221,10221,10221,10221,10221,10221,10221,
+ 10221,10221,10221,10221,10222,10222,10222,10222,10222,10222,
+ 10222,10222,10222,10222,10222,10222,10223,10223,10223,10223,
+
+ 10223,10223,10223,10223,10223,10223,10223,10223,10224,10224,
+ 10224,10224,10224,10224,10224,10224,10224,10224,10224,10224,
+ 10225,10225,10225,10225,10225,10225,10225,10225,10225,10225,
+ 10225,10225,10226,10226,10226,10226,10226,10226,10226,10226,
+ 10226,10226,10226,10226,10227,10227,10227,10227,10227,10227,
+ 10227,10227,10227,10227,10227,10227,10228,10228,10228,10228,
+ 10228,10228,10228,10228,10228,10228,10228,10228,10229,10229,
+ 10229,10229,10229,10229,10229,10229,10229,10229,10229,10229,
+ 10230,10230,10230,10230,10230,10230,10230,10230,10230,10230,
+ 10230,10230,10231,10231,10231,10231,10231,10231,10231,10231,
+
+ 10231,10231,10231,10231,10232,10232,10232,10232,10232,10232,
+ 10232,10232,10232,10232,10232,10232,10233,10233,10233,10233,
+ 10233,10233,10233,10233,10233,10233,10233,10233,10234,10234,
+ 10234,10234,10234,10234,10234,10234,10234,10234,10234,10234,
+ 10235,10235,10235,10235,10235,10235,10235,10235,10235,10235,
+ 10235,10235,10236,10236,10236,10236,10236,10236,10236,10236,
+ 10236,10236,10236,10236,10237,10237,10237,10237,10237,10237,
+ 10237,10237,10237,10237,10237,10237,10238,10238,10238,10238,
+ 10238,10238,10238,10238,10238,10238,10238,10238,10239,10239,
+ 10239,10239,10239,10239,10239,10239,10239,10239,10239,10239,
+
+ 10240,10240,10240,10240,10240,10240,10240,10240,10240,10240,
+ 10240,10240,10241,10241,10241,10241,10241,10241,10241,10241,
+ 10241,10241,10241,10241,10242,10242,10242,10242,10242,10242,
+ 10242,10242,10242,10242,10242,10242,10243,10243,10243,10243,
+ 10243,10243,10243,10243,10243,10243,10243,10243,10244,10244,
+ 10244,10244,10244,10244,10244,10244,10244,10244,10244,10244,
+ 10245, 0, 0, 0,10245, 0, 0,10245,10246,10246,
+ 10246,10246,10246,10246,10246,10246,10246,10246,10246,10246,
+ 10247,10247,10247,10247,10247,10247,10247,10247,10247,10247,
+ 10247,10247,10248,10248,10248,10248,10248,10248,10248,10248,
+
+ 10248,10248,10248,10248,10249,10249,10249,10249,10249,10249,
+ 10249,10249,10249,10249,10249,10249,10250,10250,10250,10250,
+ 10250,10250,10250,10250,10250,10250,10250,10250,10251,10251,
+ 10251,10251,10251,10251,10251,10251,10251,10251,10251,10251,
+ 10252,10252,10252,10252,10252,10252,10252,10252,10252,10252,
+ 10252,10252,10253,10253,10253,10253,10253,10253,10253,10253,
+ 10253,10253,10253,10253,10254,10254,10254,10254,10254,10254,
+ 10254,10254,10254,10254,10254,10254,10255,10255,10255,10255,
+ 10255,10255,10255,10255,10255,10255,10255,10255,10256,10256,
+ 10256,10256,10256,10256,10256,10256,10256,10256,10256,10256,
+
+ 10257,10257,10257,10257,10257,10257,10257,10257,10257,10257,
+ 10257,10257,10258,10258,10258,10258,10258,10258,10258,10258,
+ 10258,10258,10258,10258,10259,10259,10259,10259,10259,10259,
+ 10259,10259,10259,10259,10259,10259,10260,10260,10260,10260,
+ 10260,10260,10260,10260,10260,10260,10260,10260,10261,10261,
+ 10261,10261,10261,10261,10261,10261,10261,10261,10261,10261,
+ 10262,10262,10262,10262,10262,10262,10262,10262,10262,10262,
+ 10262,10262,10263,10263,10263,10263,10263,10263,10263,10263,
+ 10263,10263,10263,10263,10264,10264,10264,10264,10264,10264,
+ 10264,10264,10264,10264,10264,10264,10265,10265,10265,10265,
+
+ 10265,10265,10265,10265,10265,10265,10265,10265,10266,10266,
+ 10266,10266,10266,10266,10266,10266,10266,10266,10266,10266,
+ 10267,10267,10267,10267,10267,10267,10267,10267,10267,10267,
+ 10267,10267,10268,10268,10268,10268,10268,10268,10268,10268,
+ 10268,10268,10268,10268,10269,10269,10269,10269,10269,10269,
+ 10269,10269,10269,10269,10269,10269,10270,10270,10270,10270,
+ 10270,10270,10270,10270,10270,10270,10270,10270,10271,10271,
+ 10271,10271,10271,10271,10271,10271,10271,10271,10271,10271,
+ 10272,10272,10272,10272,10272,10272,10272,10272,10272,10272,
+ 10272,10272,10273,10273,10273,10273,10273,10273,10273,10273,
+
+ 10273,10273,10273,10273,10274,10274,10274,10274,10274,10274,
+ 10274,10274,10274,10274,10274,10274,10275,10275,10275,10275,
+ 10275,10275,10275,10275,10275,10275,10275,10275,10276,10276,
+ 10276,10276,10276,10276,10276,10276,10276,10276,10276,10276,
+ 10277,10277,10277,10277,10277,10277,10277,10277,10277,10277,
+ 10277,10277,10278,10278,10278,10278,10278,10278,10278,10278,
+ 10278,10278,10278,10278,10279,10279,10279,10279,10279,10279,
+ 10279,10279,10279,10279,10279,10279,10280, 0, 0, 0,
+ 10280, 0, 0,10280,10281,10281,10281,10281,10281,10281,
+ 10281,10281,10281,10281,10281,10281,10282,10282,10282,10282,
+
+ 10282,10282,10282,10282,10282,10282,10282,10282,10283,10283,
+ 10283,10283,10283,10283,10283,10283,10283,10283,10283,10283,
+ 10284,10284,10284,10284,10284,10284,10284,10284,10284,10284,
+ 10284,10284,10285,10285,10285,10285,10285,10285,10285,10285,
+ 10285,10285,10285,10285,10286,10286,10286,10286,10286,10286,
+ 10286,10286,10286,10286,10286,10286,10287,10287,10287,10287,
+ 10287,10287,10287,10287,10287,10287,10287,10287,10288,10288,
+ 10288,10288,10288,10288,10288,10288,10288,10288,10288,10288,
+ 10289,10289,10289,10289,10289,10289,10289,10289,10289,10289,
+ 10289,10289,10290,10290,10290,10290,10290,10290,10290,10290,
+
+ 10290,10290,10290,10290,10291,10291,10291,10291,10291,10291,
+ 10291,10291,10291,10291,10291,10291,10292,10292,10292,10292,
+ 10292,10292,10292,10292,10292,10292,10292,10292,10293,10293,
+ 10293,10293,10293,10293,10293,10293,10293,10293,10293,10293,
+ 10294,10294,10294,10294,10294,10294,10294,10294,10294,10294,
+ 10294,10294,10295,10295,10295,10295,10295,10295,10295,10295,
+ 10295,10295,10295,10295,10296,10296,10296,10296,10296,10296,
+ 10296,10296,10296,10296,10296,10296,10297,10297,10297,10297,
+ 10297,10297,10297,10297,10297,10297,10297,10297,10298,10298,
+ 10298,10298,10298,10298,10298,10298,10298,10298,10298,10298,
+
+ 10299,10299,10299,10299,10299,10299,10299,10299,10299,10299,
+ 10299,10299,10300,10300,10300,10300,10300,10300,10300,10300,
+ 10300,10300,10300,10300,10301,10301,10301,10301,10301,10301,
+ 10301,10301,10301,10301,10301,10301,10302,10302,10302,10302,
+ 10302,10302,10302,10302,10302,10302,10302,10302,10303,10303,
+ 10303,10303,10303,10303,10303,10303,10303,10303,10303,10303,
+ 10304,10304,10304,10304,10304,10304,10304,10304,10304,10304,
+ 10304,10304,10305,10305,10305,10305,10305,10305,10305,10305,
+ 10305,10305,10305,10305,10306,10306,10306,10306,10306,10306,
+ 10306,10306,10306,10306,10306,10306,10307,10307,10307,10307,
+
+ 10307,10307,10307,10307,10307,10307,10307,10307,10308,10308,
+ 10308,10308,10308,10308,10308,10308,10308,10308,10308,10308,
+ 10309,10309,10309,10309,10309,10309,10309,10309,10309,10309,
+ 10309,10309,10310,10310,10310,10310,10310,10310,10310,10310,
+ 10310,10310,10310,10310,10311,10311,10311,10311,10311,10311,
+ 10311,10311,10311,10311,10311,10311,10312,10312,10312,10312,
+ 10312,10312,10312,10312,10312,10312,10312,10312,10313,10313,
+ 10313,10313,10313,10313,10313,10313,10313,10313,10313,10313,
+ 10314,10314,10314,10314,10314,10314,10314,10314,10314,10314,
+ 10314,10314,10315,10315,10315,10315,10315,10315,10315,10315,
+
+ 10315,10315,10315,10315,10316,10316,10316,10316,10316,10316,
+ 10316,10316,10316,10316,10316,10316,10317,10317,10317,10317,
+ 10317,10317,10317,10317,10317,10317,10317,10317,10318,10318,
+ 10318,10318,10318,10318,10318,10318,10318,10318,10318,10318,
+ 10319,10319,10319,10319,10319,10319,10319,10319,10319,10319,
+ 10319,10319,10320,10320,10320,10320,10320,10320,10320,10320,
+ 10320,10320,10320,10320,10321,10321,10321,10321,10321,10321,
+ 10321,10321,10321,10321,10321,10321,10322,10322,10322,10322,
+ 10322,10322,10322,10322,10322,10322,10322,10322,10323,10323,
+ 10323,10323,10323,10323,10323,10323,10323,10323,10323,10323,
+
+ 10324,10324,10324,10324,10324,10324,10324,10324,10324,10324,
+ 10324,10324,10325,10325,10325,10325,10325,10325,10325,10325,
+ 10325,10325,10325,10325,10326,10326,10326,10326,10326,10326,
+ 10326,10326,10326,10326,10326,10326,10327,10327,10327,10327,
+ 10327,10327,10327,10327,10327,10327,10327,10327,10328,10328,
+ 10328,10328,10328,10328,10328,10328,10328,10328,10328,10328,
+ 10329,10329,10329,10329,10329,10329,10329,10329,10329,10329,
+ 10329,10329,10330,10330,10330,10330,10330,10330,10330,10330,
+ 10330,10330,10330,10330,10331,10331,10331,10331,10331,10331,
+ 10331,10331,10331,10331,10331,10331,10332,10332,10332,10332,
+
+ 10332,10332,10332,10332,10332,10332,10332,10332,10333,10333,
+ 10333,10333,10333,10333,10333,10333,10333,10333,10333,10333,
+ 10334,10334,10334,10334,10334,10334,10334,10334,10334,10334,
+ 10334,10334,10335,10335,10335,10335,10335,10335,10335,10335,
+ 10335,10335,10335,10335,10336,10336,10336,10336,10336,10336,
+ 10336,10336,10336,10336,10336,10336,10337,10337,10337,10337,
+ 10337,10337,10337,10337,10337,10337,10337,10337,10338,10338,
+ 10338,10338,10338,10338,10338,10338,10338,10338,10338,10338,
+ 10339,10339,10339,10339,10339,10339,10339,10339,10339,10339,
+ 10339,10339,10340,10340,10340,10340,10340,10340,10340,10340,
+
+ 10340,10340,10340,10340,10341,10341,10341,10341,10341,10341,
+ 10341,10341,10341,10341,10341,10341,10342,10342,10342,10342,
+ 10342,10342,10342,10342,10342,10342,10342,10342,10343,10343,
+ 10343,10343,10343,10343,10343,10343,10343,10343,10343,10343,
+ 10344,10344,10344,10344,10344,10344,10344,10344,10344,10344,
+ 10344,10344,10345,10345,10345,10345,10345,10345,10345,10345,
+ 10345,10345,10345,10345,10346,10346,10346,10346,10346,10346,
+ 10346,10346,10346,10346,10346,10346,10347,10347,10347,10347,
+ 10347,10347,10347,10347,10347,10347,10347,10347,10348,10348,
+ 10348,10348,10348,10348,10348,10348,10348,10348,10348,10348,
+
+ 10349,10349,10349,10349,10349,10349,10349,10349,10349,10349,
+ 10349,10349,10350,10350,10350,10350,10350,10350,10350,10350,
+ 10350,10350,10350,10350,10351,10351,10351,10351,10351,10351,
+ 10351,10351,10351,10351,10351,10351,10352,10352,10352,10352,
+ 10352,10352,10352,10352,10352,10352,10352,10352,10353,10353,
+ 10353,10353,10353,10353,10353,10353,10353,10353,10353,10353,
+ 10354,10354,10354,10354,10354,10354,10354,10354,10354,10354,
+ 10354,10354,10355,10355,10355,10355,10355,10355,10355,10355,
+ 10355,10355,10355,10355,10356,10356,10356,10356,10356,10356,
+ 10356,10356,10356,10356,10356,10356,10357,10357,10357,10357,
+
+ 10357,10357,10357,10357,10357,10357,10357,10357,10358,10358,
+ 10358,10358,10358,10358,10358,10358,10358,10358,10358,10358,
+ 10359,10359,10359,10359,10359,10359,10359,10359,10359,10359,
+ 10359,10359,10360,10360,10360,10360,10360,10360,10360,10360,
+ 10360,10360,10360,10360,10361,10361,10361,10361,10361,10361,
+ 10361,10361,10361,10361,10361,10361,10362,10362,10362,10362,
+ 10362,10362,10362,10362,10362,10362,10362,10362,10363,10363,
+ 10363,10363,10363,10363,10363,10363,10363,10363,10363,10363,
+ 10364,10364,10364,10364,10364,10364,10364,10364,10364,10364,
+ 10364,10364,10365,10365,10365,10365,10365,10365,10365,10365,
+
+ 10365,10365,10365,10365,10366,10366,10366,10366,10366,10366,
+ 10366,10366,10366,10366,10366,10366,10367,10367,10367,10367,
+ 10367,10367,10367,10367,10367,10367,10367,10367,10368,10368,
+ 10368,10368,10368,10368,10368,10368,10368,10368,10368,10368,
+ 10369,10369,10369,10369,10369,10369,10369,10369,10369,10369,
+ 10369,10369,10370,10370,10370,10370,10370,10370,10370,10370,
+ 10370,10370,10370,10370,10371,10371,10371,10371,10371,10371,
+ 10371,10371,10371,10371,10371,10371,10372,10372,10372,10372,
+ 10372,10372,10372,10372,10372,10372,10372,10372,10373,10373,
+ 10373,10373,10373,10373,10373,10373,10373,10373,10373,10373,
+
+ 10374,10374,10374,10374,10374,10374,10374,10374,10374,10374,
+ 10374,10374,10375,10375,10375,10375,10375,10375,10375,10375,
+ 10375,10375,10375,10375,10376,10376,10376,10376,10376,10376,
+ 10376,10376,10376,10376,10376,10376,10377,10377,10377,10377,
+ 10377,10377,10377,10377,10377,10377,10377,10377,10378,10378,
+ 10378,10378,10378,10378,10378,10378,10378,10378,10378,10378,
+ 10379,10379,10379,10379,10379,10379,10379,10379,10379,10379,
+ 10379,10379,10380,10380,10380,10380,10380,10380,10380,10380,
+ 10380,10380,10380,10380,10381,10381,10381,10381,10381,10381,
+ 10381,10381,10381,10381,10381,10381,10382,10382,10382,10382,
+
+ 10382,10382,10382,10382,10382,10382,10382,10382,10383,10383,
+ 10383,10383,10383,10383,10383,10383,10383,10383,10383,10383,
+ 10384,10384,10384,10384,10384,10384,10384,10384,10384,10384,
+ 10384,10384,10385,10385,10385,10385,10385,10385,10385,10385,
+ 10385,10385,10385,10385,10386,10386,10386,10386,10386,10386,
+ 10386,10386,10386,10386,10386,10386,10387,10387,10387,10387,
+ 10387,10387,10387,10387,10387,10387,10387,10387,10388,10388,
+ 10388,10388,10388,10388,10388,10388,10388,10388,10388,10388,
+ 10389,10389,10389,10389,10389,10389,10389,10389,10389,10389,
+ 10389,10389,10390,10390,10390,10390,10390,10390,10390,10390,
+
+ 10390,10390,10390,10390,10391,10391,10391,10391,10391,10391,
+ 10391,10391,10391,10391,10391,10391,10392,10392,10392,10392,
+ 10392,10392,10392,10392,10392,10392,10392,10392,10393,10393,
+ 10393,10393,10393,10393,10393,10393,10393,10393,10393,10393,
+ 10394,10394,10394,10394,10394,10394,10394,10394,10394,10394,
+ 10394,10394,10395,10395,10395,10395,10395,10395,10395,10395,
+ 10395,10395,10395,10395,10396,10396,10396,10396,10396,10396,
+ 10396,10396,10396,10396,10396,10396,10397,10397,10397,10397,
+ 10397,10397,10397,10397,10397,10397,10397,10397,10398,10398,
+ 10398,10398,10398,10398,10398,10398,10398,10398,10398,10398,
+
+ 10399,10399,10399,10399,10399,10399,10399,10399,10399,10399,
+ 10399,10399,10400,10400,10400,10400,10400,10400,10400,10400,
+ 10400,10400,10400,10400,10401,10401,10401,10401,10401,10401,
+ 10401,10401,10401,10401,10401,10401,10402,10402,10402,10402,
+ 10402,10402,10402,10402,10402,10402,10402,10402,10403,10403,
+ 10403,10403,10403,10403,10403,10403,10403,10403,10403,10403,
+ 10404,10404,10404,10404,10404,10404,10404,10404,10404,10404,
+ 10404,10404,10405,10405,10405,10405,10405,10405,10405,10405,
+ 10405,10405,10405,10405,10406,10406,10406,10406,10406,10406,
+ 10406,10406,10406,10406,10406,10406,10407,10407,10407,10407,
+
+ 10407,10407,10407,10407,10407,10407,10407,10407,10408,10408,
+ 10408,10408,10408,10408,10408,10408,10408,10408,10408,10408,
+ 10409,10409,10409,10409,10409,10409,10409,10409,10409,10409,
+ 10409,10409,10410,10410,10410,10410,10410,10410,10410,10410,
+ 10410,10410,10410,10410,10411,10411,10411,10411,10411,10411,
+ 10411,10411,10411,10411,10411,10411,10412,10412,10412,10412,
+ 10412,10412,10412,10412,10412,10412,10412,10412,10413,10413,
+ 10413,10413,10413,10413,10413,10413,10413,10413,10413,10413,
+ 10414,10414,10414,10414,10414,10414,10414,10414,10414,10414,
+ 10414,10414,10415,10415,10415,10415,10415,10415,10415,10415,
+
+ 10415,10415,10415,10415,10416,10416,10416,10416,10416,10416,
+ 10416,10416,10416,10416,10416,10416,10417,10417,10417,10417,
+ 10417,10417,10417,10417,10417,10417,10417,10417,10418,10418,
+ 10418,10418,10418,10418,10418,10418,10418,10418,10418,10418,
+ 10419,10419,10419,10419,10419,10419,10419,10419,10419,10419,
+ 10419,10419,10420,10420,10420,10420,10420,10420,10420,10420,
+ 10420,10420,10420,10420,10421,10421,10421,10421,10421,10421,
+ 10421,10421,10421,10421,10421,10421,10422,10422,10422,10422,
+ 10422,10422,10422,10422,10422,10422,10422,10422,10423,10423,
+ 10423,10423,10423,10423,10423,10423,10423,10423,10423,10423,
+
+ 10424,10424,10424,10424,10424,10424,10424,10424,10424,10424,
+ 10424,10424,10425,10425,10425,10425,10425,10425,10425,10425,
+ 10425,10425,10425,10425,10426,10426,10426,10426,10426,10426,
+ 10426,10426,10426,10426,10426,10426,10427,10427,10427,10427,
+ 10427,10427,10427,10427,10427,10427,10427,10427,10428,10428,
+ 10428,10428,10428,10428,10428,10428,10428,10428,10428,10428,
+ 10429,10429,10429,10429,10429,10429,10429,10429,10429,10429,
+ 10429,10429,10430,10430,10430,10430,10430,10430,10430,10430,
+ 10430,10430,10430,10430,10431,10431,10431,10431,10431,10431,
+ 10431,10431,10431,10431,10431,10431,10432,10432,10432,10432,
+
+ 10432,10432,10432,10432,10432,10432,10432,10432,10433,10433,
+ 10433,10433,10433,10433,10433,10433,10433,10433,10433,10433,
+ 10434,10434,10434,10434,10434,10434,10434,10434,10434,10434,
+ 10434,10434,10435,10435,10435,10435,10435,10435,10435,10435,
+ 10435,10435,10435,10435,10436,10436,10436,10436,10436,10436,
+ 10436,10436,10436,10436,10436,10436,10437,10437,10437,10437,
+ 10437,10437,10437,10437,10437,10437,10437,10437,10438,10438,
+ 10438,10438,10438,10438,10438,10438,10438,10438,10438,10438,
+ 10439,10439,10439,10439,10439,10439,10439,10439,10439,10439,
+ 10439,10439,10440,10440,10440,10440,10440,10440,10440,10440,
+
+ 10440,10440,10440,10440,10441,10441,10441,10441,10441,10441,
+ 10441,10441,10441,10441,10441,10441,10442,10442,10442,10442,
+ 10442,10442,10442,10442,10442,10442,10442,10442,10443,10443,
+ 10443,10443,10443,10443,10443,10443,10443,10443,10443,10443,
+ 10444,10444,10444,10444,10444,10444,10444,10444,10444,10444,
+ 10444,10444,10445,10445,10445,10445,10445,10445,10445,10445,
+ 10445,10445,10445,10445,10446,10446,10446,10446,10446,10446,
+ 10446,10446,10446,10446,10446,10446,10447,10447,10447,10447,
+ 10447,10447,10447,10447,10447,10447,10447,10447,10448,10448,
+ 10448,10448,10448,10448,10448,10448,10448,10448,10448,10448,
+
+ 10449,10449,10449,10449,10449,10449,10449,10449,10449,10449,
+ 10449,10449,10450,10450,10450,10450,10450,10450,10450,10450,
+ 10450,10450,10450,10450,10451,10451,10451,10451,10451,10451,
+ 10451,10451,10451,10451,10451,10451,10452,10452,10452,10452,
+ 10452,10452,10452,10452,10452,10452,10452,10452,10453,10453,
+ 10453,10453,10453,10453,10453,10453,10453,10453,10453,10453,
+ 10454,10454,10454,10454,10454,10454,10454,10454,10454,10454,
+ 10454,10454,10455,10455,10455,10455,10455,10455,10455,10455,
+ 10455,10455,10455,10455,10456,10456,10456,10456,10456,10456,
+ 10456,10456,10456,10456,10456,10456,10457,10457,10457,10457,
+
+ 10457,10457,10457,10457,10457,10457,10457,10457,10458,10458,
+ 10458,10458,10458,10458,10458,10458,10458,10458,10458,10458,
+ 10459,10459,10459,10459,10459,10459,10459,10459,10459,10459,
+ 10459,10459,10460,10460,10460,10460,10460,10460,10460,10460,
+ 10460,10460,10460,10460,10461,10461,10461,10461,10461,10461,
+ 10461,10461,10461,10461,10461,10461,10462,10462,10462,10462,
+ 10462,10462,10462,10462,10462,10462,10462,10462,10463,10463,
+ 10463,10463,10463,10463,10463,10463,10463,10463,10463,10463,
+ 10464,10464,10464,10464,10464,10464,10464,10464,10464,10464,
+ 10464,10464,10465,10465,10465,10465,10465,10465,10465,10465,
+
+ 10465,10465,10465,10465,10466,10466,10466,10466,10466,10466,
+ 10466,10466,10466,10466,10466,10466,10467,10467,10467,10467,
+ 10467,10467,10467,10467,10467,10467,10467,10467,10468,10468,
+ 10468,10468,10468,10468,10468,10468,10468,10468,10468,10468,
+ 10469,10469,10469,10469,10469,10469,10469,10469,10469,10469,
+ 10469,10469,10470,10470,10470,10470,10470,10470,10470,10470,
+ 10470,10470,10470,10470,10471,10471,10471,10471,10471,10471,
+ 10471,10471,10471,10471,10471,10471,10472,10472,10472,10472,
+ 10472,10472,10472,10472,10472,10472,10472,10472,10473,10473,
+ 10473,10473,10473,10473,10473,10473,10473,10473,10473,10473,
+
+ 10474,10474,10474,10474,10474,10474,10474,10474,10474,10474,
+ 10474,10474,10475,10475,10475,10475,10475,10475,10475,10475,
+ 10475,10475,10475,10475,10476,10476,10476,10476,10476,10476,
+ 10476,10476,10476,10476,10476,10476,10477,10477,10477,10477,
+ 10477,10477,10477,10477,10477,10477,10477,10477,10478,10478,
+ 10478,10478,10478,10478,10478,10478,10478,10478,10478,10478,
+ 10479,10479,10479,10479,10479,10479,10479,10479,10479,10479,
+ 10479,10479,10480,10480,10480,10480,10480,10480,10480,10480,
+ 10480,10480,10480,10480,10481,10481,10481,10481,10481,10481,
+ 10481,10481,10481,10481,10481,10481,10482,10482,10482,10482,
+
+ 10482,10482,10482,10482,10482,10482,10482,10482,10483,10483,
+ 10483,10483,10483,10483,10483,10483,10483,10483,10483,10483,
+ 10484,10484,10484,10484,10484,10484,10484,10484,10484,10484,
+ 10484,10484,10485,10485,10485,10485,10485,10485,10485,10485,
+ 10485,10485,10485,10485,10486,10486,10486,10486,10486,10486,
+ 10486,10486,10486,10486,10486,10486,10487,10487,10487,10487,
+ 10487,10487,10487,10487,10487,10487,10487,10487,10488,10488,
+ 10488,10488,10488,10488,10488,10488,10488,10488,10488,10488,
+ 10489,10489,10489,10489,10489,10489,10489,10489,10489,10489,
+ 10489,10489,10490,10490,10490,10490,10490,10490,10490,10490,
+
+ 10490,10490,10490,10490,10491,10491,10491,10491,10491,10491,
+ 10491,10491,10491,10491,10491,10491,10492,10492, 0,10492,
+ 10492,10492,10492,10492,10492,10492,10492,10492,10493,10493,
+ 10493,10493,10493,10493,10493,10493,10493,10493,10493,10493,
+ 10494,10494,10494,10494,10494,10494,10494,10494,10494,10494,
+ 10494,10494,10495,10495,10495,10495,10495,10495,10495,10495,
+ 10495,10495,10495,10495,10496,10496,10496,10496,10496,10496,
+ 10496,10496,10496,10496,10496,10496,10497,10497,10497,10497,
+ 10497,10497,10497,10497,10497,10497,10497,10497,10498,10498,
+ 10498,10498,10498,10498,10498,10498,10498,10498,10498,10498,
+
+ 10499,10499,10499,10499,10499,10499,10499,10499,10499,10499,
+ 10499,10499,10500,10500,10500,10500,10500,10500,10500,10500,
+ 10500,10500,10500,10500,10501,10501,10501,10501,10501,10501,
+ 10501,10501,10501,10501,10501,10501,10502,10502,10502,10502,
+ 10502,10502,10502,10502,10502,10502,10502,10502,10503,10503,
+ 10503,10503,10503,10503,10503,10503,10503,10503,10503,10503,
+ 10504,10504,10504,10504,10504,10504,10504,10504,10504,10504,
+ 10504,10504,10505,10505,10505,10505,10505,10505,10505,10505,
+ 10505,10505,10505,10505,10506,10506,10506,10506,10506,10506,
+ 10506,10506,10506,10506,10506,10506,10507,10507,10507,10507,
+
+ 10507,10507,10507,10507,10507,10507,10507,10507,10508,10508,
+ 10508,10508,10508,10508,10508,10508,10508,10508,10508,10508,
+ 10509,10509,10509,10509,10509,10509,10509,10509,10509,10509,
+ 10509,10509,10510,10510,10510,10510,10510,10510,10510,10510,
+ 10510,10510,10510,10510,10511,10511,10511,10511,10511,10511,
+ 10511,10511,10511,10511,10511,10511,10512,10512,10512,10512,
+ 10512,10512,10512,10512,10512,10512,10512,10512,10513,10513,
+ 10513,10513,10513,10513,10513,10513,10513,10513,10513,10513,
+ 10514,10514,10514,10514,10514,10514,10514,10514,10514,10514,
+ 10514,10514,10515,10515,10515,10515,10515,10515,10515,10515,
+
+ 10515,10515,10515,10515,10516,10516,10516,10516,10516,10516,
+ 10516,10516,10516,10516,10516,10516,10517,10517,10517,10517,
+ 10517,10517,10517,10517,10517,10517,10517,10517,10518,10518,
+ 10518,10518,10518,10518,10518,10518,10518,10518,10518,10518,
+ 10519,10519,10519,10519,10519,10519,10519,10519,10519,10519,
+ 10519,10519,10520,10520,10520,10520,10520,10520,10520,10520,
+ 10520,10520,10520,10520,10521,10521,10521,10521,10521,10521,
+ 10521,10521,10521,10521,10521,10521,10522,10522,10522,10522,
+ 10522,10522,10522,10522,10522,10522,10522,10522,10523,10523,
+ 10523,10523,10523,10523,10523,10523,10523,10523,10523,10523,
+
+ 10524,10524,10524,10524,10524,10524,10524,10524,10524,10524,
+ 10524,10524,10525,10525,10525,10525,10525,10525,10525,10525,
+ 10525,10525,10525,10525,10526,10526,10526,10526,10526,10526,
+ 10526,10526,10526,10526,10526,10526,10527,10527,10527,10527,
+ 10527,10527,10527,10527,10527,10527,10527,10527,10528,10528,
+ 10528,10528,10528,10528,10528,10528,10528,10528,10528,10528,
+ 10529,10529,10529,10529,10529,10529,10529,10529,10529,10529,
+ 10529,10529,10530,10530,10530,10530,10530,10530,10530,10530,
+ 10530,10530,10530,10530,10531,10531,10531,10531,10531,10531,
+ 10531,10531,10531,10531,10531,10531,10532,10532,10532,10532,
+
+ 10532,10532,10532,10532,10532,10532,10532,10532,10533,10533,
+ 10533,10533,10533,10533,10533,10533,10533,10533,10533,10533,
+ 10534,10534,10534,10534,10534,10534,10534,10534,10534,10534,
+ 10534,10534,10535,10535,10535,10535,10535,10535,10535,10535,
+ 10535,10535,10535,10535,10536,10536,10536,10536,10536,10536,
+ 10536,10536,10536,10536,10536,10536,10537,10537,10537,10537,
+ 10537,10537,10537,10537,10537,10537,10537,10537,10538,10538,
+ 10538,10538,10538,10538,10538,10538,10538,10538,10538,10538,
+ 10539,10539,10539,10539,10539,10539,10539,10539,10539,10539,
+ 10539,10539,10540,10540,10540,10540,10540,10540,10540,10540,
+
+ 10540,10540,10540,10540,10541,10541,10541,10541,10541,10541,
+ 10541,10541,10541,10541,10541,10541,10542,10542,10542,10542,
+ 10542,10542,10542,10542,10542,10542,10542,10542,10543,10543,
+ 10543,10543,10543,10543,10543,10543,10543,10543,10543,10543,
+ 10544,10544,10544,10544,10544,10544,10544,10544,10544,10544,
+ 10544,10544,10545,10545,10545,10545,10545,10545,10545,10545,
+ 10545,10545,10545,10545,10546,10546,10546,10546,10546,10546,
+ 10546,10546,10546,10546,10546,10546,10547,10547,10547,10547,
+ 10547,10547,10547,10547,10547,10547,10547,10547,10548,10548,
+ 10548,10548,10548,10548,10548,10548,10548,10548,10548,10548,
+
+ 10549,10549,10549,10549,10549,10549,10549,10549,10549,10549,
+ 10549,10549,10550,10550,10550,10550,10550,10550,10550,10550,
+ 10550,10550,10550,10550,10551,10551,10551,10551,10551,10551,
+ 10551,10551,10551,10551,10551,10551,10552,10552,10552,10552,
+ 10552,10552,10552,10552,10552,10552,10552,10552,10553,10553,
+ 10553,10553,10553,10553,10553,10553,10553,10553,10553,10553,
+ 10554,10554,10554,10554,10554,10554,10554,10554,10554,10554,
+ 10554,10554,10555,10555,10555,10555,10555,10555,10555,10555,
+ 10555,10555,10555,10555,10556,10556,10556,10556,10556,10556,
+ 10556,10556,10556,10556,10556,10556,10557,10557,10557,10557,
+
+ 10557,10557,10557,10557,10557,10557,10557,10557,10558,10558,
+ 10558,10558,10558,10558,10558,10558,10558,10558,10558,10558,
+ 10559,10559,10559,10559,10559,10559,10559,10559,10559,10559,
+ 10559,10559,10560,10560,10560,10560,10560,10560,10560,10560,
+ 10560,10560,10560,10560,10561,10561,10561,10561,10561,10561,
+ 10561,10561,10561,10561,10561,10561,10562,10562,10562,10562,
+ 10562,10562,10562,10562,10562,10562,10562,10562,10563,10563,
+ 10563,10563,10563,10563,10563,10563,10563,10563,10563,10563,
+ 10564,10564,10564,10564,10564,10564,10564,10564,10564,10564,
+ 10564,10564,10565,10565,10565,10565,10565,10565,10565,10565,
+
+ 10565,10565,10565,10565,10566, 0, 0, 0,10566, 0,
+ 0,10566,10567,10567,10567,10567,10567,10567,10567,10567,
+ 10567,10567,10567,10567,10568,10568,10568,10568,10568,10568,
+ 10568,10568,10568,10568,10568,10568,10569,10569,10569,10569,
+ 10569,10569,10569,10569,10569,10569,10569,10569,10570,10570,
+ 10570,10570,10570,10570,10570,10570,10570,10570,10570,10570,
+ 10571,10571,10571,10571,10571,10571,10571,10571,10571,10571,
+ 10571,10571,10572,10572,10572,10572,10572,10572,10572,10572,
+ 10572,10572,10572,10572,10573,10573,10573,10573,10573,10573,
+ 10573,10573,10573,10573,10573,10573,10574,10574,10574,10574,
+
+ 10574,10574,10574,10574,10574,10574,10574,10574,10575,10575,
+ 10575,10575,10575,10575,10575,10575,10575,10575,10575,10575,
+ 10576,10576,10576,10576,10576,10576,10576,10576,10576,10576,
+ 10576,10576,10577,10577,10577,10577,10577,10577,10577,10577,
+ 10577,10577,10577,10577,10578,10578,10578,10578,10578,10578,
+ 10578,10578,10578,10578,10578,10578,10579,10579,10579,10579,
+ 10579,10579,10579,10579,10579,10579,10579,10579,10580,10580,
+ 10580,10580,10580,10580,10580,10580,10580,10580,10580,10580,
+ 10581,10581,10581,10581,10581,10581,10581,10581,10581,10581,
+ 10581,10581,10582,10582,10582,10582,10582,10582,10582,10582,
+
+ 10582,10582,10582,10582,10583,10583,10583,10583,10583,10583,
+ 10583,10583,10583,10583,10583,10583,10584,10584,10584,10584,
+ 10584,10584,10584,10584,10584,10584,10584,10584,10585,10585,
+ 10585,10585,10585,10585,10585,10585,10585,10585,10585,10585,
+ 10586,10586,10586,10586,10586,10586,10586,10586,10586,10586,
+ 10586,10586,10587,10587,10587,10587,10587,10587,10587,10587,
+ 10587,10587,10587,10587,10588,10588,10588,10588,10588,10588,
+ 10588,10588,10588,10588,10588,10588,10589,10589,10589,10589,
+ 10589,10589,10589,10589,10589,10589,10589,10589,10590,10590,
+ 10590,10590,10590,10590,10590,10590,10590,10590,10590,10590,
+
+ 10591,10591,10591,10591,10591,10591,10591,10591,10591,10591,
+ 10591,10591,10592,10592,10592,10592,10592,10592,10592,10592,
+ 10592,10592,10592,10592,10593,10593,10593,10593,10593,10593,
+ 10593,10593,10593,10593,10593,10593,10594,10594,10594,10594,
+ 10594,10594,10594,10594,10594,10594,10594,10594,10595,10595,
+ 10595,10595,10595,10595,10595,10595,10595,10595,10595,10595,
+ 10596,10596,10596,10596,10596,10596,10596,10596,10596,10596,
+ 10596,10596,10597,10597,10597,10597,10597,10597,10597,10597,
+ 10597,10597,10597,10597,10598,10598,10598,10598,10598,10598,
+ 10598,10598,10598,10598,10598,10598,10599,10599,10599,10599,
+
+ 10599,10599,10599,10599,10599,10599,10599,10599,10600,10600,
+ 10600,10600,10600,10600,10600,10600,10600,10600,10600,10600,
+ 10601,10601,10601,10601,10601,10601,10601,10601,10601,10601,
+ 10601,10601,10602,10602,10602,10602,10602,10602,10602,10602,
+ 10602,10602,10602,10602,10603,10603,10603,10603,10603,10603,
+ 10603,10603,10603,10603,10603,10603,10604, 0, 0,10604,
+ 0, 0, 0,10604,10604, 0,10604,10605,10605,10605,
+ 10605,10605,10605,10605,10605,10605,10605,10605,10605,10606,
+ 10606,10606,10606,10606,10606,10606,10606,10606,10606,10606,
+ 10606,10607,10607,10607,10607,10607,10607,10607,10607,10607,
+
+ 10607,10607,10607,10608,10608,10608,10608,10608,10608,10608,
+ 10608,10608,10608,10608,10608,10609,10609,10609,10609,10609,
+ 10609,10609,10609,10609,10609,10609,10609,10610,10610,10610,
+ 10610,10610,10610,10610,10610,10610,10610,10610,10610,10611,
+ 10611,10611,10611,10611,10611,10611,10611,10611,10611,10611,
+ 10611,10612,10612,10612,10612,10612,10612,10612,10612,10612,
+ 10612,10612,10612,10613,10613,10613,10613,10613,10613,10613,
+ 10613,10613,10613,10613,10613,10614,10614,10614,10614,10614,
+ 10614,10614,10614,10614,10614,10614,10614,10615,10615,10615,
+ 10615,10615,10615,10615,10615,10615,10615,10615,10615,10616,
+
+ 10616,10616,10616,10616,10616,10616,10616,10616,10616,10616,
+ 10616,10617,10617,10617,10617,10617,10617,10617,10617,10617,
+ 10617,10617,10617,10618,10618,10618,10618,10618,10618,10618,
+ 10618,10618,10618,10618,10618,10619,10619,10619,10619,10619,
+ 10619,10619,10619,10619,10619,10619,10619,10620,10620,10620,
+ 10620,10620,10620,10620,10620,10620,10620,10620,10620,10621,
+ 10621,10621,10621,10621,10621,10621,10621,10621,10621,10621,
+ 10621,10622,10622,10622,10622,10622,10622,10622,10622,10622,
+ 10622,10622,10622,10623,10623,10623,10623,10623,10623,10623,
+ 10623,10623,10623,10623,10623,10624,10624,10624,10624,10624,
+
+ 10624,10624,10624,10624,10624,10624,10624,10625,10625,10625,
+ 10625,10625,10625,10625,10625,10625,10625,10625,10625,10626,
+ 10626,10626,10626,10626,10626,10626,10626,10626,10626,10626,
+ 10626,10627,10627,10627,10627,10627,10627,10627,10627,10627,
+ 10627,10627,10627,10628,10628,10628,10628,10628,10628,10628,
+ 10628,10628,10628,10628,10628,10629,10629,10629,10629,10629,
+ 10629,10629,10629,10629,10629,10629,10629,10630,10630,10630,
+ 10630,10630,10630,10630,10630,10630,10630,10630,10630,10631,
+ 10631,10631,10631,10631,10631,10631,10631,10631,10631,10631,
+ 10631,10632,10632,10632,10632,10632,10632,10632,10632,10632,
+
+ 10632,10632,10632,10633,10633,10633,10633,10633,10633,10633,
+ 10633,10633,10633,10633,10633,10634,10634,10634,10634,10634,
+ 10634,10634,10634,10634,10634,10634,10634,10635,10635,10635,
+ 10635,10635,10635,10635,10635,10635,10635,10635,10635,10636,
+ 10636,10636,10636,10636,10636,10636,10636,10636,10636,10636,
+ 10636,10637,10637,10637,10637,10637,10637,10637,10637,10637,
+ 10637,10637,10637,10638,10638,10638,10638,10638,10638,10638,
+ 10638,10638,10638,10638,10638,10639,10639,10639,10639,10639,
+ 10639,10639,10639,10639,10639,10639,10639,10640,10640,10640,
+ 10640,10640,10640,10640,10640,10640,10640,10640,10640,10641,
+
+ 10641,10641,10641,10641,10641,10641,10641,10641,10641,10641,
+ 10641,10642,10642,10642,10642,10642,10642,10642,10642,10642,
+ 10642,10642,10642,10643,10643,10643,10643,10643,10643,10643,
+ 10643,10643,10643,10643,10643,10644,10644,10644,10644,10644,
+ 10644,10644,10644,10644,10644,10644,10644,10645,10645,10645,
+ 10645,10645,10645,10645,10645,10645,10645,10645,10645,10646,
+ 10646,10646,10646,10646,10646,10646,10646,10646,10646,10646,
+ 10646,10647,10647,10647,10647,10647,10647,10647,10647,10647,
+ 10647,10647,10647,10648,10648,10648,10648,10648,10648,10648,
+ 10648,10648,10648,10648,10648,10649,10649,10649,10649,10649,
+
+ 10649,10649,10649,10649,10649,10649,10649,10650,10650,10650,
+ 10650,10650,10650,10650,10650,10650,10650,10650,10650,10651,
+ 10651,10651,10651,10651,10651,10651,10651,10651,10651,10651,
+ 10651,10652,10652,10652,10652,10652,10652,10652,10652,10652,
+ 10652,10652,10652,10653,10653,10653,10653,10653,10653,10653,
+ 10653,10653,10653,10653,10653,10654,10654,10654,10654,10654,
+ 10654,10654,10654,10654,10654,10654,10654,10655,10655,10655,
+ 10655,10655,10655,10655,10655,10655,10655,10655,10655,10656,
+ 10656,10656,10656,10656,10656,10656,10656,10656,10656,10656,
+ 10656,10657,10657,10657,10657,10657,10657,10657,10657,10657,
+
+ 10657,10657,10657,10658,10658,10658,10658,10658,10658,10658,
+ 10658,10658,10658,10658,10658,10659,10659,10659,10659,10659,
+ 10659,10659,10659,10659,10659,10659,10659,10660,10660,10660,
+ 10660,10660,10660,10660,10660,10660,10660,10660,10660,10661,
+ 10661,10661,10661,10661,10661,10661,10661,10661,10661,10661,
+ 10661,10662,10662,10662,10662,10662,10662,10662,10662,10662,
+ 10662,10662,10662,10663,10663,10663,10663,10663,10663,10663,
+ 10663,10663,10663,10663,10663,10664,10664,10664,10664,10664,
+ 10664,10664,10664,10664,10664,10664,10664,10665,10665,10665,
+ 10665,10665,10665,10665,10665,10665,10665,10665,10665,10666,
+
+ 10666,10666,10666,10666,10666,10666,10666,10666,10666,10666,
+ 10666,10667,10667,10667,10667,10667,10667,10667,10667,10667,
+ 10667,10667,10667,10668,10668,10668,10668,10668,10668,10668,
+ 10668,10668,10668,10668,10668,10669,10669,10669,10669,10669,
+ 10669,10669,10669,10669,10669,10669,10669,10670,10670,10670,
+ 10670,10670,10670,10670,10670,10670,10670,10670,10670,10671,
+ 10671,10671,10671,10671,10671,10671,10671,10671,10671,10671,
+ 10671,10672,10672,10672,10672,10672,10672,10672,10672,10672,
+ 10672,10672,10672,10673,10673,10673,10673,10673,10673,10673,
+ 10673,10673,10673,10673,10673,10674,10674,10674,10674,10674,
+
+ 10674,10674,10674,10674,10674,10674,10674,10675,10675,10675,
+ 10675,10675,10675,10675,10675,10675,10675,10675,10675,10676,
+ 10676,10676,10676,10676,10676,10676,10676,10676,10676,10676,
+ 10676,10677,10677,10677,10677,10677,10677,10677,10677,10677,
+ 10677,10677,10677,10678,10678,10678,10678,10678,10678,10678,
+ 10678,10678,10678,10678,10678,10679,10679,10679,10679,10679,
+ 10679,10679,10679,10679,10679,10679,10679,10680,10680,10680,
+ 10680,10680,10680,10680,10680,10680,10680,10680,10680,10681,
+ 10681,10681,10681,10681,10681,10681,10681,10681,10681,10681,
+ 10681,10682,10682,10682,10682,10682,10682,10682,10682,10682,
+
+ 10682,10682,10682,10683,10683,10683,10683,10683,10683,10683,
+ 10683,10683,10683,10683,10683,10684,10684,10684,10684,10684,
+ 10684,10684,10684,10684,10684,10684,10684,10685,10685,10685,
+ 10685,10685,10685,10685,10685,10685,10685,10685,10685,10686,
+ 10686,10686,10686,10686,10686,10686,10686,10686,10686,10686,
+ 10686,10687,10687,10687,10687,10687,10687,10687,10687,10687,
+ 10687,10687,10687,10688,10688,10688,10688,10688,10688,10688,
+ 10688,10688,10688,10688,10688,10689,10689,10689,10689,10689,
+ 10689,10689,10689,10689,10689,10689,10689,10690,10690,10690,
+ 10690,10690,10690,10690,10690,10690,10690,10690,10690,10691,
+
+ 10691,10691,10691,10691,10691,10691,10691,10691,10691,10691,
+ 10691,10692,10692,10692,10692,10692,10692,10692,10692,10692,
+ 10692,10692,10692,10693,10693,10693,10693,10693,10693,10693,
+ 10693,10693,10693,10693,10693,10694,10694,10694,10694,10694,
+ 10694,10694,10694,10694,10694,10694,10694,10695,10695,10695,
+ 10695,10695,10695,10695,10695,10695,10695,10695,10695,10696,
+ 10696,10696,10696,10696,10696,10696,10696,10696,10696,10696,
+ 10696,10697,10697,10697,10697,10697,10697,10697,10697,10697,
+ 10697,10697,10697,10698,10698,10698,10698,10698,10698,10698,
+ 10698,10698,10698,10698,10698,10699,10699,10699,10699,10699,
+
+ 10699,10699,10699,10699,10699,10699,10699,10700,10700,10700,
+ 10700,10700,10700,10700,10700,10700,10700,10700,10700,10701,
+ 10701,10701,10701,10701,10701,10701,10701,10701,10701,10701,
+ 10701,10702,10702,10702,10702,10702,10702,10702,10702,10702,
+ 10702,10702,10702,10703,10703,10703,10703,10703,10703,10703,
+ 10703,10703,10703,10703,10703,10704,10704,10704,10704,10704,
+ 10704,10704,10704,10704,10704,10704,10704,10705,10705,10705,
+ 10705,10705,10705,10705,10705,10705,10705,10705,10705,10706,
+ 10706,10706,10706,10706,10706,10706,10706,10706,10706,10706,
+ 10706,10707,10707,10707,10707,10707,10707,10707,10707,10707,
+
+ 10707,10707,10707,10708,10708,10708,10708,10708,10708,10708,
+ 10708,10708,10708,10708,10708,10709,10709,10709,10709,10709,
+ 10709,10709,10709,10709,10709,10709,10709,10710,10710,10710,
+ 10710,10710,10710,10710,10710,10710,10710,10710,10710,10711,
+ 10711,10711,10711,10711,10711,10711,10711,10711,10711,10711,
+ 10711,10712,10712,10712,10712,10712,10712,10712,10712,10712,
+ 10712,10712,10712,10713,10713,10713,10713,10713,10713,10713,
+ 10713,10713,10713,10713,10713,10714,10714,10714,10714,10714,
+ 10714,10714,10714,10714,10714,10714,10714,10715,10715,10715,
+ 10715,10715,10715,10715,10715,10715,10715,10715,10715,10716,
+
+ 10716,10716,10716,10716,10716,10716,10716,10716,10716,10716,
+ 10716,10717,10717,10717,10717,10717,10717,10717,10717,10717,
+ 10717,10717,10717,10718,10718,10718,10718,10718,10718,10718,
+ 10718,10718,10718,10718,10718,10719,10719,10719,10719,10719,
+ 10719,10719,10719,10719,10719,10719,10719,10720,10720,10720,
+ 10720,10720,10720,10720,10720,10720,10720,10720,10720,10721,
+ 10721,10721,10721,10721,10721,10721,10721,10721,10721,10721,
+ 10721,10722,10722,10722,10722,10722,10722,10722,10722,10722,
+ 10722,10722,10722,10723,10723,10723,10723,10723,10723,10723,
+ 10723,10723,10723,10723,10723,10724,10724,10724,10724,10724,
+
+ 10724,10724,10724,10724,10724,10724,10724,10725,10725,10725,
+ 10725,10725,10725,10725,10725,10725,10725,10725,10725,10726,
+ 10726,10726,10726,10726,10726,10726,10726,10726,10726,10726,
+ 10726,10727,10727,10727,10727,10727,10727,10727,10727,10727,
+ 10727,10727,10727,10728,10728,10728,10728,10728,10728,10728,
+ 10728,10728,10728,10728,10728,10729,10729,10729,10729,10729,
+ 10729,10729,10729,10729,10729,10729,10729,10730,10730,10730,
+ 10730,10730,10730,10730,10730,10730,10730,10730,10730,10731,
+ 10731,10731,10731,10731,10731,10731,10731,10731,10731,10731,
+ 10731,10732,10732,10732,10732,10732,10732,10732,10732,10732,
+
+ 10732,10732,10732,10733,10733,10733,10733,10733,10733,10733,
+ 10733,10733,10733,10733,10733,10734,10734,10734,10734,10734,
+ 10734,10734,10734,10734,10734,10734,10734,10735,10735,10735,
+ 10735,10735,10735,10735,10735,10735,10735,10735,10735,10736,
+ 10736,10736,10736,10736,10736,10736,10736,10736,10736,10736,
+ 10736,10737,10737,10737,10737,10737,10737,10737,10737,10737,
+ 10737,10737,10737,10738,10738,10738,10738,10738,10738,10738,
+ 10738,10738,10738,10738,10738,10739,10739,10739,10739,10739,
+ 10739,10739,10739,10739,10739,10739,10739,10740,10740,10740,
+ 10740,10740,10740,10740,10740,10740,10740,10740,10740,10741,
+
+ 10741,10741,10741,10741,10741,10741,10741,10741,10741,10741,
+ 10741,10742,10742,10742,10742,10742,10742,10742,10742,10742,
+ 10742,10742,10742,10743,10743,10743,10743,10743,10743,10743,
+ 10743,10743,10743,10743,10743,10744,10744,10744,10744,10744,
+ 10744,10744,10744,10744,10744,10744,10744,10745,10745,10745,
+ 10745,10745,10745,10745,10745,10745,10745,10745,10745,10746,
+ 10746,10746,10746,10746,10746,10746,10746,10746,10746,10746,
+ 10746,10747,10747,10747,10747,10747,10747,10747,10747,10747,
+ 10747,10747,10747,10748,10748,10748,10748,10748,10748,10748,
+ 10748,10748,10748,10748,10748,10749,10749,10749,10749,10749,
+
+ 10749,10749,10749,10749,10749,10749,10749,10750,10750,10750,
+ 10750,10750,10750,10750,10750,10750,10750,10750,10750,10751,
+ 10751,10751,10751,10751,10751,10751,10751,10751,10751,10751,
+ 10751,10752,10752,10752,10752,10752,10752,10752,10752,10752,
+ 10752,10752,10752,10753,10753,10753,10753,10753,10753,10753,
+ 10753,10753,10753,10753,10753,10754,10754,10754,10754,10754,
+ 10754,10754,10754,10754,10754,10754,10754,10755,10755,10755,
+ 10755,10755,10755,10755,10755,10755,10755,10755,10755,10756,
+ 10756,10756,10756,10756,10756,10756,10756,10756,10756,10756,
+ 10756,10757,10757,10757,10757,10757,10757,10757,10757,10757,
+
+ 10757,10757,10757,10758,10758,10758,10758,10758,10758,10758,
+ 10758,10758,10758,10758,10758,10759,10759,10759,10759,10759,
+ 10759,10759,10759,10759,10759,10759,10759,10760,10760,10760,
+ 10760,10760,10760,10760,10760,10760,10760,10760,10760,10761,
+ 10761,10761,10761,10761,10761,10761,10761,10761,10761,10761,
+ 10761,10762,10762,10762,10762,10762,10762,10762,10762,10762,
+ 10762,10762,10762,10763,10763,10763,10763,10763,10763,10763,
+ 10763,10763,10763,10763,10763,10764,10764,10764,10764,10764,
+ 10764,10764,10764,10764,10764,10764,10764,10765,10765,10765,
+ 10765,10765,10765,10765,10765,10765,10765,10765,10765,10766,
+
+ 10766,10766,10766,10766,10766,10766,10766,10766,10766,10766,
+ 10766,10767,10767,10767,10767,10767,10767,10767,10767,10767,
+ 10767,10767,10767,10768,10768,10768,10768,10768,10768,10768,
+ 10768,10768,10768,10768,10768,10769,10769,10769,10769,10769,
+ 10769,10769,10769,10769,10769,10769,10769,10770,10770,10770,
+ 10770,10770,10770,10770,10770,10770,10770,10770,10770,10771,
+ 10771,10771,10771,10771,10771,10771,10771,10771,10771,10771,
+ 10771,10772,10772,10772,10772,10772,10772,10772,10772,10772,
+ 10772,10772,10772,10773,10773,10773,10773,10773,10773,10773,
+ 10773,10773,10773,10773,10773,10774,10774,10774,10774,10774,
+
+ 10774,10774,10774,10774,10774,10774,10774,10775,10775,10775,
+ 10775,10775,10775,10775,10775,10775,10775,10775,10775,10776,
+ 10776,10776,10776,10776,10776,10776,10776,10776,10776,10776,
+ 10776,10777,10777,10777,10777,10777,10777,10777,10777,10777,
+ 10777,10777,10777,10778,10778,10778,10778,10778,10778,10778,
+ 10778,10778,10778,10778,10778,10779,10779,10779,10779,10779,
+ 10779,10779,10779,10779,10779,10779,10779,10780,10780,10780,
+ 10780,10780,10780,10780,10780,10780,10780,10780,10780,10781,
+ 10781,10781,10781,10781,10781,10781,10781,10781,10781,10781,
+ 10781,10782,10782,10782,10782,10782,10782,10782,10782,10782,
+
+ 10782,10782,10782,10783,10783,10783,10783,10783,10783,10783,
+ 10783,10783,10783,10783,10783,10784,10784,10784,10784,10784,
+ 10784,10784,10784,10784,10784,10784,10784,10785,10785,10785,
+ 10785,10785,10785,10785,10785,10785,10785,10785,10785,10786,
+ 10786,10786,10786,10786,10786,10786,10786,10786,10786,10786,
+ 10786,10787,10787,10787,10787,10787,10787,10787,10787,10787,
+ 10787,10787,10787,10788,10788,10788,10788,10788,10788,10788,
+ 10788,10788,10788,10788,10788,10789,10789,10789,10789,10789,
+ 10789,10789,10789,10789,10789,10789,10789,10790,10790,10790,
+ 10790,10790,10790,10790,10790,10790,10790,10790,10790,10791,
+
+ 10791,10791,10791,10791,10791,10791,10791,10791,10791,10791,
+ 10791,10792,10792,10792,10792,10792,10792,10792,10792,10792,
+ 10792,10792,10792,10793,10793,10793,10793,10793,10793,10793,
+ 10793,10793,10793,10793,10793,10794,10794,10794,10794,10794,
+ 10794,10794,10794,10794,10794,10794,10794,10795,10795,10795,
+ 10795,10795,10795,10795,10795,10795,10795,10795,10795,10796,
+ 10796,10796,10796,10796,10796,10796,10796,10796,10796,10796,
+ 10796,10797,10797,10797,10797,10797,10797,10797,10797,10797,
+ 10797,10797,10797,10798,10798,10798,10798,10798,10798,10798,
+ 10798,10798,10798,10798,10798,10799,10799, 0,10799,10799,
+
+ 10799,10799,10799,10799,10799,10799,10799,10800,10800,10800,
+ 10800,10800,10800,10800,10800,10800,10800,10800,10800,10801,
+ 10801,10801,10801,10801,10801,10801,10801,10801,10801,10801,
+ 10801,10802,10802,10802,10802,10802,10802,10802,10802,10802,
+ 10802,10802,10802,10803,10803,10803,10803,10803,10803,10803,
+ 10803,10803,10803,10803,10803,10804,10804,10804,10804,10804,
+ 10804,10804,10804,10804,10804,10804,10804,10805,10805,10805,
+ 10805,10805,10805,10805,10805,10805,10805,10805,10805,10806,
+ 10806,10806,10806,10806,10806,10806,10806,10806,10806,10806,
+ 10806,10807,10807,10807,10807,10807,10807,10807,10807,10807,
+
+ 10807,10807,10807,10808,10808,10808,10808,10808,10808,10808,
+ 10808,10808,10808,10808,10808,10809,10809,10809,10809,10809,
+ 10809,10809,10809,10809,10809,10809,10809,10810,10810,10810,
+ 10810,10810,10810,10810,10810,10810,10810,10810,10810,10811,
+ 10811,10811,10811,10811,10811,10811,10811,10811,10811,10811,
+ 10811,10812,10812,10812,10812,10812,10812,10812,10812,10812,
+ 10812,10812,10812,10813,10813,10813,10813,10813,10813,10813,
+ 10813,10813,10813,10813,10813,10814,10814,10814,10814,10814,
+ 10814,10814,10814,10814,10814,10814,10814,10815,10815,10815,
+ 10815,10815,10815,10815,10815,10815,10815,10815,10815,10816,
+
+ 10816,10816,10816,10816,10816,10816,10816,10816,10816,10816,
+ 10816,10817,10817,10817,10817,10817,10817,10817,10817,10817,
+ 10817,10817,10817,10818,10818,10818,10818,10818,10818,10818,
+ 10818,10818,10818,10818,10818,10819,10819, 0,10819,10819,
+ 10819,10819,10819,10819,10819,10819,10819,10820,10820,10820,
+ 10820,10820,10820,10820,10820,10820,10820,10820,10820,10821,
+ 10821,10821,10821,10821,10821,10821,10821,10821,10821,10821,
+ 10821,10822,10822,10822,10822,10822,10822,10822,10822,10822,
+ 10822,10822,10822,10823,10823,10823,10823,10823,10823,10823,
+ 10823,10823,10823,10823,10823,10824,10824,10824,10824,10824,
+
+ 10824,10824,10824,10824,10824,10824,10824,10825,10825,10825,
+ 10825,10825,10825,10825,10825,10825,10825,10825,10825,10826,
+ 10826,10826,10826,10826,10826,10826,10826,10826,10826,10826,
+ 10826,10827,10827,10827,10827,10827,10827,10827,10827,10827,
+ 10827,10827,10827,10828,10828,10828,10828,10828,10828,10828,
+ 10828,10828,10828,10828,10828,10829,10829,10829,10829,10829,
+ 10829,10829,10829,10829,10829,10829,10829,10830,10830,10830,
+ 10830,10830,10830,10830,10830,10830,10830,10830,10830,10831,
+ 10831,10831,10831,10831,10831,10831,10831,10831,10831,10831,
+ 10831,10832,10832,10832,10832,10832,10832,10832,10832,10832,
+
+ 10832,10832,10832,10833,10833,10833,10833,10833,10833,10833,
+ 10833,10833,10833,10833,10833,10834,10834,10834,10834,10834,
+ 10834,10834,10834,10834,10834,10834,10834,10835,10835,10835,
+ 10835,10835,10835,10835,10835,10835,10835,10835,10835,10836,
+ 10836,10836,10836,10836,10836,10836,10836,10836,10836,10836,
+ 10836,10837,10837,10837,10837,10837,10837,10837,10837,10837,
+ 10837,10837,10837,10838,10838,10838,10838,10838,10838,10838,
+ 10838,10838,10838,10838,10838,10839,10839,10839,10839,10839,
+ 10839,10839,10839,10839,10839,10839,10839,10840,10840,10840,
+ 10840,10840,10840,10840,10840,10840,10840,10840,10840,10841,
+
+ 10841,10841,10841,10841,10841,10841,10841,10841,10841,10841,
+ 10841,10842,10842,10842,10842,10842,10842,10842,10842,10842,
+ 10842,10842,10842,10843,10843,10843,10843,10843,10843,10843,
+ 10843,10843,10843,10843,10843,10844,10844,10844,10844,10844,
+ 10844,10844,10844,10844,10844,10844,10844,10845,10845,10845,
+ 10845,10845,10845,10845,10845,10845,10845,10845,10845,10846,
+ 10846,10846,10846,10846,10846,10846,10846,10846,10846,10846,
+ 10846,10847,10847,10847,10847,10847,10847,10847,10847,10847,
+ 10847,10847,10847,10848,10848,10848,10848,10848,10848,10848,
+ 10848,10848,10848,10848,10848,10849,10849,10849,10849,10849,
+
+ 10849,10849,10849,10849,10849,10849,10849,10850,10850,10850,
+ 10850,10850,10850,10850,10850,10850,10850,10850,10850,10851,
+ 10851,10851,10851,10851,10851,10851,10851,10851,10851,10851,
+ 10851,10852,10852,10852,10852,10852,10852,10852,10852,10852,
+ 10852,10852,10852,10853,10853,10853,10853,10853,10853,10853,
+ 10853,10853,10853,10853,10853,10854,10854,10854,10854,10854,
+ 10854,10854,10854,10854,10854,10854,10854,10855,10855,10855,
+ 10855,10855,10855,10855,10855,10855,10855,10855,10855,10856,
+ 10856,10856,10856,10856,10856,10856,10856,10856,10856,10856,
+ 10856,10857,10857,10857,10857,10857,10857,10857,10857,10857,
+
+ 10857,10857,10857,10858,10858,10858,10858,10858,10858,10858,
+ 10858,10858,10858,10858,10858,10859,10859,10859,10859,10859,
+ 10859,10859,10859,10859,10859,10859,10859,10860,10860,10860,
+ 10860,10860,10860,10860,10860,10860,10860,10860,10860,10861,
+ 10861,10861,10861,10861,10861,10861,10861,10861,10861,10861,
+ 10861,10862,10862,10862,10862,10862,10862,10862,10862,10862,
+ 10862,10862,10862,10863,10863,10863,10863,10863,10863,10863,
+ 10863,10863,10863,10863,10863,10864,10864,10864,10864,10864,
+ 10864,10864,10864,10864,10864,10864,10864,10865,10865,10865,
+ 10865,10865,10865,10865,10865,10865,10865,10865,10865,10866,
+
+ 10866,10866,10866,10866,10866,10866,10866,10866,10866,10866,
+ 10866,10867,10867,10867,10867,10867,10867,10867,10867,10867,
+ 10867,10867,10867,10868,10868,10868,10868,10868,10868,10868,
+ 10868,10868,10868,10868,10868,10869,10869,10869,10869,10869,
+ 10869,10869,10869,10869,10869,10869,10869,10870,10870,10870,
+ 10870,10870,10870,10870,10870,10870,10870,10870,10870,10871,
+ 10871,10871,10871,10871,10871,10871,10871,10871,10871,10871,
+ 10871,10872,10872,10872,10872,10872,10872,10872,10872,10872,
+ 10872,10872,10872,10873,10873,10873,10873,10873,10873,10873,
+ 10873,10873,10873,10873,10873,10874,10874,10874,10874,10874,
+
+ 10874,10874,10874,10874,10874,10874,10874,10875,10875,10875,
+ 10875,10875,10875,10875,10875,10875,10875,10875,10875,10876,
+ 10876,10876,10876,10876,10876,10876,10876,10876,10876,10876,
+ 10876,10877,10877,10877,10877,10877,10877,10877,10877,10877,
+ 10877,10877,10877,10878,10878,10878,10878,10878,10878,10878,
+ 10878,10878,10878,10878,10878,10879,10879,10879,10879,10879,
+ 10879,10879,10879,10879,10879,10879,10879,10880,10880,10880,
+ 10880,10880,10880,10880,10880,10880,10880,10880,10880,10881,
+ 10881,10881,10881,10881,10881,10881,10881,10881,10881,10881,
+ 10881,10882,10882,10882,10882,10882,10882,10882,10882,10882,
+
+ 10882,10882,10882,10883,10883,10883,10883,10883,10883,10883,
+ 10883,10883,10883,10883,10883,10884,10884,10884,10884,10884,
+ 10884,10884,10884,10884,10884,10884,10884,10885,10885,10885,
+ 10885,10885,10885,10885,10885,10885,10885,10885,10885,10886,
+ 10886,10886,10886,10886,10886,10886,10886,10886,10886,10886,
+ 10886,10887,10887,10887,10887,10887,10887,10887,10887,10887,
+ 10887,10887,10887,10888,10888,10888,10888,10888,10888,10888,
+ 10888,10888,10888,10888,10888,10889,10889,10889,10889,10889,
+ 10889,10889,10889,10889,10889,10889,10889,10890, 0, 0,
+ 0,10890, 0, 0,10890,10891,10891,10891,10891,10891,
+
+ 10891,10891,10891,10891,10891,10891,10891,10892,10892,10892,
+ 10892,10892,10892,10892,10892,10892,10892,10892,10892,10893,
+ 10893,10893,10893,10893,10893,10893,10893,10893,10893,10893,
+ 10893,10894,10894,10894,10894,10894,10894,10894,10894,10894,
+ 10894,10894,10894,10895,10895,10895,10895,10895,10895,10895,
+ 10895,10895,10895,10895,10895,10896,10896,10896,10896,10896,
+ 10896,10896,10896,10896,10896,10896,10896,10897,10897,10897,
+ 10897,10897,10897,10897,10897,10897,10897,10897,10897,10898,
+ 10898,10898,10898,10898,10898,10898,10898,10898,10898,10898,
+ 10898,10899,10899,10899,10899,10899,10899,10899,10899,10899,
+
+ 10899,10899,10899,10900,10900,10900,10900,10900,10900,10900,
+ 10900,10900,10900,10900,10900,10901,10901,10901,10901,10901,
+ 10901,10901,10901,10901,10901,10901,10901,10902,10902,10902,
+ 10902,10902,10902,10902,10902,10902,10902,10902,10902,10903,
+ 10903,10903,10903,10903,10903,10903,10903,10903,10903,10903,
+ 10903,10904,10904,10904,10904,10904,10904,10904,10904,10904,
+ 10904,10904,10904,10905,10905,10905,10905,10905,10905,10905,
+ 10905,10905,10905,10905,10905,10906,10906,10906,10906,10906,
+ 10906,10906,10906,10906,10906,10906,10906,10907,10907,10907,
+ 10907,10907,10907,10907,10907,10907,10907,10907,10907,10908,
+
+ 10908,10908,10908,10908,10908,10908,10908,10908,10908,10908,
+ 10908,10909,10909,10909,10909,10909,10909,10909,10909,10909,
+ 10909,10909,10909,10910,10910,10910,10910,10910,10910,10910,
+ 10910,10910,10910,10910,10910,10911,10911,10911,10911,10911,
+ 10911,10911,10911,10911,10911,10911,10911,10912,10912,10912,
+ 10912,10912,10912,10912,10912,10912,10912,10912,10912,10913,
+ 10913,10913,10913,10913,10913,10913,10913,10913,10913,10913,
+ 10913,10914,10914,10914,10914,10914,10914,10914,10914,10914,
+ 10914,10914,10914,10915,10915,10915,10915,10915,10915,10915,
+ 10915,10915,10915,10915,10915,10916,10916,10916,10916,10916,
+
+ 10916,10916,10916,10916,10916,10916,10916,10917,10917,10917,
+ 10917,10917,10917,10917,10917,10917,10917,10917,10917,10918,
+ 10918,10918,10918,10918,10918,10918,10918,10918,10918,10918,
+ 10918,10919,10919,10919,10919,10919,10919,10919,10919,10919,
+ 10919,10919,10919,10920,10920,10920,10920,10920,10920,10920,
+ 10920,10920,10920,10920,10920,10921,10921,10921,10921,10921,
+ 10921,10921,10921,10921,10921,10921,10921,10922,10922,10922,
+ 10922,10922,10922,10922,10922,10922,10922,10922,10922,10923,
+ 10923,10923,10923,10923,10923,10923,10923,10923,10923,10923,
+ 10923,10924,10924,10924,10924,10924,10924,10924,10924,10924,
+
+ 10924,10924,10924,10925,10925,10925,10925,10925,10925,10925,
+ 10925,10925,10925,10925,10925,10926,10926,10926,10926,10926,
+ 10926,10926,10926,10926,10926,10926,10926,10927,10927,10927,
+ 10927,10927,10927,10927,10927,10927,10927,10927,10927,10928,
+ 10928,10928,10928,10928,10928,10928,10928,10928,10928,10928,
+ 10928,10929,10929,10929,10929,10929,10929,10929,10929,10929,
+ 10929,10929,10929,10930,10930,10930,10930,10930,10930,10930,
+ 10930,10930,10930,10930,10930,10931,10931,10931,10931,10931,
+ 10931,10931,10931,10931,10931,10931,10931,10932,10932,10932,
+ 10932,10932,10932,10932,10932,10932,10932,10932,10932,10933,
+
+ 10933,10933,10933,10933,10933,10933,10933,10933,10933,10933,
+ 10933,10934,10934,10934,10934,10934,10934,10934,10934,10934,
+ 10934,10934,10934,10935,10935,10935,10935,10935,10935,10935,
+ 10935,10935,10935,10935,10935,10936,10936,10936,10936,10936,
+ 10936,10936,10936,10936,10936,10936,10936,10937,10937,10937,
+ 10937,10937,10937,10937,10937,10937,10937,10937,10937,10938,
+ 10938,10938,10938,10938,10938,10938,10938,10938,10938,10938,
+ 10938,10939,10939,10939,10939,10939,10939,10939,10939,10939,
+ 10939,10939,10939,10940,10940,10940,10940,10940,10940,10940,
+ 10940,10940,10940,10940,10940,10941,10941,10941,10941,10941,
+
+ 10941,10941,10941,10941,10941,10941,10941,10942,10942,10942,
+ 10942,10942,10942,10942,10942,10942,10942,10942,10942,10943,
+ 10943,10943,10943,10943,10943,10943,10943,10943,10943,10943,
+ 10943,10944,10944,10944,10944,10944,10944,10944,10944,10944,
+ 10944,10944,10944,10945,10945,10945,10945,10945,10945,10945,
+ 10945,10945,10945,10945,10945,10946,10946,10946,10946,10946,
+ 10946,10946,10946,10946,10946,10946,10946,10947,10947,10947,
+ 10947,10947,10947,10947,10947,10947,10947,10947,10947,10948,
+ 10948,10948,10948,10948,10948,10948,10948,10948,10948,10948,
+ 10948,10949,10949,10949,10949,10949,10949,10949,10949,10949,
+
+ 10949,10949,10949,10950,10950,10950,10950,10950,10950,10950,
+ 10950,10950,10950,10950,10950,10951,10951,10951,10951,10951,
+ 10951,10951,10951,10951,10951,10951,10951,10952,10952,10952,
+ 10952,10952,10952,10952,10952,10952,10952,10952,10952,10953,
+ 10953,10953,10953,10953,10953,10953,10953,10953,10953,10953,
+ 10953,10954,10954,10954,10954,10954,10954,10954,10954,10954,
+ 10954,10954,10954,10955,10955,10955,10955,10955,10955,10955,
+ 10955,10955,10955,10955,10955,10956,10956,10956,10956,10956,
+ 10956,10956,10956,10956,10956,10956,10956,10957,10957,10957,
+ 10957,10957,10957,10957,10957,10957,10957,10957,10957,10958,
+
+ 10958,10958,10958,10958,10958,10958,10958,10958,10958,10958,
+ 10958,10959,10959,10959,10959,10959,10959,10959,10959,10959,
+ 10959,10959,10959,10960,10960,10960,10960,10960,10960,10960,
+ 10960,10960,10960,10960,10960,10961,10961,10961,10961,10961,
+ 10961,10961,10961,10961,10961,10961,10961,10962,10962,10962,
+ 10962,10962,10962,10962,10962,10962,10962,10962,10962,10963,
+ 10963,10963,10963,10963,10963,10963,10963,10963,10963,10963,
+ 10963,10964,10964,10964,10964,10964,10964,10964,10964,10964,
+ 10964,10964,10964,10965,10965,10965,10965,10965,10965,10965,
+ 10965,10965,10965,10965,10965,10966,10966,10966,10966,10966,
+
+ 10966,10966,10966,10966,10966,10966,10966,10967,10967,10967,
+ 10967,10967,10967,10967,10967,10967,10967,10967,10967,10968,
+ 10968,10968,10968,10968,10968,10968,10968,10968,10968,10968,
+ 10968,10969,10969,10969,10969,10969,10969,10969,10969,10969,
+ 10969,10969,10969,10970,10970,10970,10970,10970,10970,10970,
+ 10970,10970,10970,10970,10970,10971,10971,10971,10971,10971,
+ 10971,10971,10971,10971,10971,10971,10971,10972,10972,10972,
+ 10972,10972,10972,10972,10972,10972,10972,10972,10972,10973,
+ 10973,10973,10973,10973,10973,10973,10973,10973,10973,10973,
+ 10973,10974,10974,10974,10974,10974,10974,10974,10974,10974,
+
+ 10974,10974,10974,10975,10975,10975,10975,10975,10975,10975,
+ 10975,10975,10975,10975,10975,10976,10976,10976,10976,10976,
+ 10976,10976,10976,10976,10976,10976,10976,10977,10977,10977,
+ 10977,10977,10977,10977,10977,10977,10977,10977,10977,10978,
+ 10978,10978,10978,10978,10978,10978,10978,10978,10978,10978,
+ 10978,10979,10979,10979,10979,10979,10979,10979,10979,10979,
+ 10979,10979,10979,10980,10980,10980,10980,10980,10980,10980,
+ 10980,10980,10980,10980,10980,10981,10981,10981,10981,10981,
+ 10981,10981,10981,10981,10981,10981,10981,10982,10982,10982,
+ 10982,10982,10982,10982,10982,10982,10982,10982,10982,10983,
+
+ 10983,10983,10983,10983,10983,10983,10983,10983,10983,10983,
+ 10983,10984,10984,10984,10984,10984,10984,10984,10984,10984,
+ 10984,10984,10984,10985,10985,10985,10985,10985,10985,10985,
+ 10985,10985,10985,10985,10985,10986,10986,10986,10986,10986,
+ 10986,10986,10986,10986,10986,10986,10986,10987,10987,10987,
+ 10987,10987,10987,10987,10987,10987,10987,10987,10987,10988,
+ 10988,10988,10988,10988,10988,10988,10988,10988,10988,10988,
+ 10988,10989,10989,10989,10989,10989,10989,10989,10989,10989,
+ 10989,10989,10989,10990,10990,10990,10990,10990,10990,10990,
+ 10990,10990,10990,10990,10990,10991,10991,10991,10991,10991,
+
+ 10991,10991,10991,10991,10991,10991,10991,10992,10992,10992,
+ 10992,10992,10992,10992,10992,10992,10992,10992,10992,10993,
+ 10993,10993,10993,10993,10993,10993,10993,10993,10993,10993,
+ 10993,10994,10994,10994,10994,10994,10994,10994,10994,10994,
+ 10994,10994,10994,10995,10995,10995,10995,10995,10995,10995,
+ 10995,10995,10995,10995,10995,10996,10996,10996,10996,10996,
+ 10996,10996,10996,10996,10996,10996,10996,10997,10997,10997,
+ 10997,10997,10997,10997,10997,10997,10997,10997,10997,10998,
+ 10998,10998,10998,10998,10998,10998,10998,10998,10998,10998,
+ 10998,10999,10999,10999,10999,10999,10999,10999,10999,10999,
+
+ 10999,10999,10999,11000,11000,11000,11000,11000,11000,11000,
+ 11000,11000,11000,11000,11000,11001,11001,11001,11001,11001,
+ 11001,11001,11001,11001,11001,11001,11001,11002,11002,11002,
+ 11002,11002,11002,11002,11002,11002,11002,11002,11002,11003,
+ 11003,11003,11003,11003,11003,11003,11003,11003,11003,11003,
+ 11003,11004,11004,11004,11004,11004,11004,11004,11004,11004,
+ 11004,11004,11004,11005,11005,11005,11005,11005,11005,11005,
+ 11005,11005,11005,11005,11005,11006,11006,11006,11006,11006,
+ 11006,11006,11006,11006,11006,11006,11006,11007,11007,11007,
+ 11007,11007,11007,11007,11007,11007,11007,11007,11007,11008,
+
+ 11008,11008,11008,11008,11008,11008,11008,11008,11008,11008,
+ 11008,11009,11009,11009,11009,11009,11009,11009,11009,11009,
+ 11009,11009,11009,11010,11010,11010,11010,11010,11010,11010,
+ 11010,11010,11010,11010,11010,11011,11011,11011,11011,11011,
+ 11011,11011,11011,11011,11011,11011,11011,11012,11012,11012,
+ 11012,11012,11012,11012,11012,11012,11012,11012,11012,11013,
+ 11013,11013,11013,11013,11013,11013,11013,11013,11013,11013,
+ 11013,11014,11014,11014,11014,11014,11014,11014,11014,11014,
+ 11014,11014,11014,11015,11015,11015,11015,11015,11015,11015,
+ 11015,11015,11015,11015,11015,11016,11016,11016,11016,11016,
+
+ 11016,11016,11016,11016,11016,11016,11016,11017,11017,11017,
+ 11017,11017,11017,11017,11017,11017,11017,11017,11017,11018,
+ 11018,11018,11018,11018,11018,11018,11018,11018,11018,11018,
+ 11018,11019,11019,11019,11019,11019,11019,11019,11019,11019,
+ 11019,11019,11019,11020,11020,11020,11020,11020,11020,11020,
+ 11020,11020,11020,11020,11020,11021,11021,11021,11021,11021,
+ 11021,11021,11021,11021,11021,11021,11021,11022,11022,11022,
+ 11022,11022,11022,11022,11022,11022,11022,11022,11022,11023,
+ 11023,11023,11023,11023,11023,11023,11023,11023,11023,11023,
+ 11023,11024,11024,11024,11024,11024,11024,11024,11024,11024,
+
+ 11024,11024,11024,11025,11025,11025,11025,11025,11025,11025,
+ 11025,11025,11025,11025,11025,11026,11026,11026,11026,11026,
+ 11026,11026,11026,11026,11026,11026,11026,11027,11027,11027,
+ 11027,11027,11027,11027,11027,11027,11027,11027,11027,11028,
+ 11028,11028,11028,11028,11028,11028,11028,11028,11028,11028,
+ 11028,11029,11029,11029,11029,11029,11029,11029,11029,11029,
+ 11029,11029,11029,11030,11030,11030,11030,11030,11030,11030,
+ 11030,11030,11030,11030,11030,11031,11031,11031,11031,11031,
+ 11031,11031,11031,11031,11031,11031,11031,11032,11032,11032,
+ 11032,11032,11032,11032,11032,11032,11032,11032,11032,11033,
+
+ 11033,11033,11033,11033,11033,11033,11033,11033,11033,11033,
+ 11033,11034,11034,11034,11034,11034,11034,11034,11034,11034,
+ 11034,11034,11034,11035,11035,11035,11035,11035,11035,11035,
+ 11035,11035,11035,11035,11035,11036,11036,11036,11036,11036,
+ 11036,11036,11036,11036,11036,11036,11036,11037,11037,11037,
+ 11037,11037,11037,11037,11037,11037,11037,11037,11037,11038,
+ 11038,11038,11038,11038,11038,11038,11038,11038,11038,11038,
+ 11038,11039,11039,11039,11039,11039,11039,11039,11039,11039,
+ 11039,11039,11039,11040,11040,11040,11040,11040,11040,11040,
+ 11040,11040,11040,11040,11040,11041,11041,11041,11041,11041,
+
+ 11041,11041,11041,11041,11041,11041,11041,11042,11042,11042,
+ 11042,11042,11042,11042,11042,11042,11042,11042,11042,11043,
+ 11043,11043,11043,11043,11043,11043,11043,11043,11043,11043,
+ 11043,11044,11044,11044,11044,11044,11044,11044,11044,11044,
+ 11044,11044,11044,11045,11045,11045,11045,11045,11045,11045,
+ 11045,11045,11045,11045,11045,11046,11046,11046,11046,11046,
+ 11046,11046,11046,11046,11046,11046,11046,11047,11047,11047,
+ 11047,11047,11047,11047,11047,11047,11047,11047,11047,11048,
+ 11048,11048,11048,11048,11048,11048,11048,11048,11048,11048,
+ 11048,11049,11049,11049,11049,11049,11049,11049,11049,11049,
+
+ 11049,11049,11049,11050,11050,11050,11050,11050,11050,11050,
+ 11050,11050,11050,11050,11050,11051,11051,11051,11051,11051,
+ 11051,11051,11051,11051,11051,11051,11051,11052,11052,11052,
+ 11052,11052,11052,11052,11052,11052,11052,11052,11052,11053,
+ 11053,11053,11053,11053,11053,11053,11053,11053,11053,11053,
+ 11053,11054,11054,11054,11054,11054,11054,11054,11054,11054,
+ 11054,11054,11054,11055,11055,11055,11055,11055,11055,11055,
+ 11055,11055,11055,11055,11055,11056,11056,11056,11056,11056,
+ 11056,11056,11056,11056,11056,11056,11056,11057,11057,11057,
+ 11057,11057,11057,11057,11057,11057,11057,11057,11057,11058,
+
+ 11058,11058,11058,11058,11058,11058,11058,11058,11058,11058,
+ 11058,11059,11059,11059,11059,11059,11059,11059,11059,11059,
+ 11059,11059,11059,11060,11060,11060,11060,11060,11060,11060,
+ 11060,11060,11060,11060,11060,11061,11061,11061,11061,11061,
+ 11061,11061,11061,11061,11061,11061,11061,11062,11062,11062,
+ 11062,11062,11062,11062,11062,11062,11062,11062,11062,11063,
+ 11063,11063,11063,11063,11063,11063,11063,11063,11063,11063,
+ 11063,11064,11064,11064,11064,11064,11064,11064,11064,11064,
+ 11064,11064,11064,11065,11065,11065,11065,11065,11065,11065,
+ 11065,11065,11065,11065,11065,11066,11066,11066,11066,11066,
+
+ 11066,11066,11066,11066,11066,11066,11066,11067,11067,11067,
+ 11067,11067,11067,11067,11067,11067,11067,11067,11067,11068,
+ 11068,11068,11068,11068,11068,11068,11068,11068,11068,11068,
+ 11068,11069,11069,11069,11069,11069,11069,11069,11069,11069,
+ 11069,11069,11069,11070,11070,11070,11070,11070,11070,11070,
+ 11070,11070,11070,11070,11070,11071,11071,11071,11071,11071,
+ 11071,11071,11071,11071,11071,11071,11071,11072,11072,11072,
+ 11072,11072,11072,11072,11072,11072,11072,11072,11072,11073,
+ 11073,11073,11073,11073,11073,11073,11073,11073,11073,11073,
+ 11073,11074,11074,11074,11074,11074,11074,11074,11074,11074,
+
+ 11074,11074,11074,11075,11075,11075,11075,11075,11075,11075,
+ 11075,11075,11075,11075,11075,11076,11076,11076,11076,11076,
+ 11076,11076,11076,11076,11076,11076,11076,11077,11077,11077,
+ 11077,11077,11077,11077,11077,11077,11077,11077,11077,11078,
+ 11078,11078,11078,11078,11078,11078,11078,11078,11078,11078,
+ 11078,11079,11079,11079,11079,11079,11079,11079,11079,11079,
+ 11079,11079,11079,11080,11080,11080,11080,11080,11080,11080,
+ 11080,11080,11080,11080,11080,11081,11081,11081,11081,11081,
+ 11081,11081,11081,11081,11081,11081,11081,11082,11082,11082,
+ 11082,11082,11082,11082,11082,11082,11082,11082,11082,11083,
+
+ 11083,11083,11083,11083,11083,11083,11083,11083,11083,11083,
+ 11083,11084,11084,11084,11084,11084,11084,11084,11084,11084,
+ 11084,11084,11084,11085,11085,11085,11085,11085,11085,11085,
+ 11085,11085,11085,11085,11085,11086,11086,11086,11086,11086,
+ 11086,11086,11086,11086,11086,11086,11086,11087,11087,11087,
+ 11087,11087,11087,11087,11087,11087,11087,11087,11087,11088,
+ 11088,11088,11088,11088,11088,11088,11088,11088,11088,11088,
+ 11088,11089,11089,11089,11089,11089,11089,11089,11089,11089,
+ 11089,11089,11089,11090,11090,11090,11090,11090,11090,11090,
+ 11090,11090,11090,11090,11090,11091,11091,11091,11091,11091,
+
+ 11091,11091,11091,11091,11091,11091,11091,11092,11092,11092,
+ 11092,11092,11092,11092,11092,11092,11092,11092,11092,11093,
+ 11093,11093,11093,11093,11093,11093,11093,11093,11093,11093,
+ 11093,11094,11094,11094,11094,11094,11094,11094,11094,11094,
+ 11094,11094,11094,11095,11095,11095,11095,11095,11095,11095,
+ 11095,11095,11095,11095,11095,11096,11096,11096,11096,11096,
+ 11096,11096,11096,11096,11096,11096,11096,11097,11097,11097,
+ 11097,11097,11097,11097,11097,11097,11097,11097,11097,11098,
+ 11098,11098,11098,11098,11098,11098,11098,11098,11098,11098,
+ 11098,11099,11099,11099,11099,11099,11099,11099,11099,11099,
+
+ 11099,11099,11099,11100,11100, 0,11100,11100,11100,11100,
+ 11100,11100,11100,11100,11100,11101,11101,11101,11101,11101,
+ 11101,11101,11101,11101,11101,11101,11101,11102,11102,11102,
+ 11102,11102,11102,11102,11102,11102,11102,11102,11102,11103,
+ 11103,11103,11103,11103,11103,11103,11103,11103,11103,11103,
+ 11103,11104,11104,11104,11104,11104,11104,11104,11104,11104,
+ 11104,11104,11104,11105,11105,11105,11105,11105,11105,11105,
+ 11105,11105,11105,11105,11105,11106,11106,11106,11106,11106,
+ 11106,11106,11106,11106,11106,11106,11106,11107,11107,11107,
+ 11107,11107,11107,11107,11107,11107,11107,11107,11107,11108,
+
+ 11108,11108,11108,11108,11108,11108,11108,11108,11108,11108,
+ 11108,11109,11109,11109,11109,11109,11109,11109,11109,11109,
+ 11109,11109,11109,11110,11110,11110,11110,11110,11110,11110,
+ 11110,11110,11110,11110,11110,11111,11111,11111,11111,11111,
+ 11111,11111,11111,11111,11111,11111,11111,11112,11112,11112,
+ 11112,11112,11112,11112,11112,11112,11112,11112,11112,11113,
+ 11113,11113,11113,11113,11113,11113,11113,11113,11113,11113,
+ 11113,11114,11114,11114,11114,11114,11114,11114,11114,11114,
+ 11114,11114,11114,11115,11115,11115,11115,11115,11115,11115,
+ 11115,11115,11115,11115,11115,11116,11116,11116,11116,11116,
+
+ 11116,11116,11116,11116,11116,11116,11116,11117,11117,11117,
+ 11117,11117,11117,11117,11117,11117,11117,11117,11117,11118,
+ 11118,11118,11118,11118,11118,11118,11118,11118,11118,11118,
+ 11118,11119,11119,11119,11119,11119,11119,11119,11119,11119,
+ 11119,11119,11119,11120,11120,11120,11120,11120,11120,11120,
+ 11120,11120,11120,11120,11120,11121,11121,11121,11121,11121,
+ 11121,11121,11121,11121,11121,11121,11121,11122,11122,11122,
+ 11122,11122,11122,11122,11122,11122,11122,11122,11122,11123,
+ 11123,11123,11123,11123,11123,11123,11123,11123,11123,11123,
+ 11123,11124,11124,11124,11124,11124,11124,11124,11124,11124,
+
+ 11124,11124,11124,11125,11125,11125,11125,11125,11125,11125,
+ 11125,11125,11125,11125,11125,11126,11126,11126,11126,11126,
+ 11126,11126,11126,11126,11126,11126,11126,11127,11127,11127,
+ 11127,11127,11127,11127,11127,11127,11127,11127,11127,11128,
+ 11128,11128,11128,11128,11128,11128,11128,11128,11128,11128,
+ 11128,11129,11129,11129,11129,11129,11129,11129,11129,11129,
+ 11129,11129,11129,11130,11130,11130,11130,11130,11130,11130,
+ 11130,11130,11130,11130,11130,11131,11131,11131,11131,11131,
+ 11131,11131,11131,11131,11131,11131,11131,11132,11132,11132,
+ 11132,11132,11132,11132,11132,11132,11132,11132,11132,11133,
+
+ 11133,11133,11133,11133,11133,11133,11133,11133,11133,11133,
+ 11133,11134,11134,11134,11134,11134,11134,11134,11134,11134,
+ 11134,11134,11134,11135,11135,11135,11135,11135,11135,11135,
+ 11135,11135,11135,11135,11135,11136,11136,11136,11136,11136,
+ 11136,11136,11136,11136,11136,11136,11136,11137,11137,11137,
+ 11137,11137,11137,11137,11137,11137,11137,11137,11137,11138,
+ 11138,11138,11138,11138,11138,11138,11138,11138,11138,11138,
+ 11138,11139,11139,11139,11139,11139,11139,11139,11139,11139,
+ 11139,11139,11139,11140,11140,11140,11140,11140,11140,11140,
+ 11140,11140,11140,11140,11140,11141,11141,11141,11141,11141,
+
+ 11141,11141,11141,11141,11141,11141,11141,11142,11142,11142,
+ 11142,11142,11142,11142,11142,11142,11142,11142,11142,11143,
+ 11143,11143,11143,11143,11143,11143,11143,11143,11143,11143,
+ 11143,11144,11144,11144,11144,11144,11144,11144,11144,11144,
+ 11144,11144,11144,11145,11145,11145,11145,11145,11145,11145,
+ 11145,11145,11145,11145,11145,11146,11146,11146,11146,11146,
+ 11146,11146,11146,11146,11146,11146,11146,11147,11147,11147,
+ 11147,11147,11147,11147,11147,11147,11147,11147,11147,11148,
+ 11148,11148,11148,11148,11148,11148,11148,11148,11148,11148,
+ 11148,11149,11149,11149,11149,11149,11149,11149,11149,11149,
+
+ 11149,11149,11149,11150,11150,11150,11150,11150,11150,11150,
+ 11150,11150,11150,11150,11150,11151,11151,11151,11151,11151,
+ 11151,11151,11151,11151,11151,11151,11151,11152,11152,11152,
+ 11152,11152,11152,11152,11152,11152,11152,11152,11152,11153,
+ 11153,11153,11153,11153,11153,11153,11153,11153,11153,11153,
+ 11153,11154,11154,11154,11154,11154,11154,11154,11154,11154,
+ 11154,11154,11154,11155,11155,11155,11155,11155,11155,11155,
+ 11155,11155,11155,11155,11155,11156,11156,11156,11156,11156,
+ 11156,11156,11156,11156,11156,11156,11156,11157,11157,11157,
+ 11157,11157,11157,11157,11157,11157,11157,11157,11157,11158,
+
+ 11158,11158,11158,11158,11158,11158,11158,11158,11158,11158,
+ 11158,11159,11159,11159,11159,11159,11159,11159,11159,11159,
+ 11159,11159,11159,11160,11160,11160,11160,11160,11160,11160,
+ 11160,11160,11160,11160,11160,11161,11161,11161,11161,11161,
+ 11161,11161,11161,11161,11161,11161,11161,11162,11162,11162,
+ 11162,11162,11162,11162,11162,11162,11162,11162,11162,11163,
+ 11163,11163,11163,11163,11163,11163,11163,11163,11163,11163,
+ 11163,11164,11164,11164,11164,11164,11164,11164,11164,11164,
+ 11164,11164,11164,11165,11165,11165,11165,11165,11165,11165,
+ 11165,11165,11165,11165,11165,11166,11166,11166,11166,11166,
+
+ 11166,11166,11166,11166,11166,11166,11166,11167,11167,11167,
+ 11167,11167,11167,11167,11167,11167,11167,11167,11167,11168,
+ 11168,11168,11168,11168,11168,11168,11168,11168,11168,11168,
+ 11168,11169,11169,11169,11169,11169,11169,11169,11169,11169,
+ 11169,11169,11169,11170,11170,11170,11170,11170,11170,11170,
+ 11170,11170,11170,11170,11170,11171,11171,11171,11171,11171,
+ 11171,11171,11171,11171,11171,11171,11171,11172,11172,11172,
+ 11172,11172,11172,11172,11172,11172,11172,11172,11172,11173,
+ 11173,11173,11173,11173,11173,11173,11173,11173,11173,11173,
+ 11173,11174,11174,11174,11174,11174,11174,11174,11174,11174,
+
+ 11174,11174,11174,11175,11175,11175,11175,11175,11175,11175,
+ 11175,11175,11175,11175,11175,11176,11176,11176,11176,11176,
+ 11176,11176,11176,11176,11176,11176,11176,11177,11177,11177,
+ 11177,11177,11177,11177,11177,11177,11177,11177,11177,11178,
+ 11178,11178,11178,11178,11178,11178,11178,11178,11178,11178,
+ 11178,11179,11179,11179,11179,11179,11179,11179,11179,11179,
+ 11179,11179,11179,11180,11180,11180,11180,11180,11180,11180,
+ 11180,11180,11180,11180,11180,11181,11181,11181,11181,11181,
+ 11181,11181,11181,11181,11181,11181,11181,11182,11182,11182,
+ 11182,11182,11182,11182,11182,11182,11182,11182,11182,11183,
+
+ 11183,11183,11183,11183,11183,11183,11183,11183,11183,11183,
+ 11183,11184,11184,11184,11184,11184,11184,11184,11184,11184,
+ 11184,11184,11184,11185,11185,11185,11185,11185,11185,11185,
+ 11185,11185,11185,11185,11185,11186,11186,11186,11186,11186,
+ 11186,11186,11186,11186,11186,11186,11186,11187,11187,11187,
+ 11187,11187,11187,11187,11187,11187,11187,11187,11187,11188,
+ 11188,11188,11188,11188,11188,11188,11188,11188,11188,11188,
+ 11188,11189,11189,11189,11189,11189,11189,11189,11189,11189,
+ 11189,11189,11189,11190,11190,11190,11190,11190,11190,11190,
+ 11190,11190,11190,11190,11190,11191,11191,11191,11191,11191,
+
+ 11191,11191,11191,11191,11191,11191,11191,11192,11192,11192,
+ 11192,11192,11192,11192,11192,11192,11192,11192,11192,11193,
+ 11193,11193,11193,11193,11193,11193,11193,11193,11193,11193,
+ 11193,11194,11194,11194,11194,11194,11194,11194,11194,11194,
+ 11194,11194,11194,11195,11195,11195,11195,11195,11195,11195,
+ 11195,11195,11195,11195,11195,11196,11196,11196,11196,11196,
+ 11196,11196,11196,11196,11196,11196,11196,11197,11197,11197,
+ 11197,11197,11197,11197,11197,11197,11197,11197,11197,11198,
+ 11198,11198,11198,11198,11198,11198,11198,11198,11198,11198,
+ 11198,11199,11199,11199,11199,11199,11199,11199,11199,11199,
+
+ 11199,11199,11199,11200,11200,11200,11200,11200,11200,11200,
+ 11200,11200,11200,11200,11200,11201,11201,11201,11201,11201,
+ 11201,11201,11201,11201,11201,11201,11201,11202,11202,11202,
+ 11202,11202,11202,11202,11202,11202,11202,11202,11202,11203,
+ 11203,11203,11203,11203,11203,11203,11203,11203,11203,11203,
+ 11203,11204,11204,11204,11204,11204,11204,11204,11204,11204,
+ 11204,11204,11204,11205,11205,11205,11205,11205,11205,11205,
+ 11205,11205,11205,11205,11205,11206,11206,11206,11206,11206,
+ 11206,11206,11206,11206,11206,11206,11206,11207,11207,11207,
+ 11207,11207,11207,11207,11207,11207,11207,11207,11207,11208,
+
+ 11208,11208,11208,11208,11208,11208,11208,11208,11208,11208,
+ 11208,11209,11209,11209,11209,11209,11209,11209,11209,11209,
+ 11209,11209,11209,11210,11210,11210,11210,11210,11210,11210,
+ 11210,11210,11210,11210,11210,11211,11211,11211,11211,11211,
+ 11211,11211,11211,11211,11211,11211,11211,11212,11212,11212,
+ 11212,11212,11212,11212,11212,11212,11212,11212,11212,11213,
+ 11213,11213,11213,11213,11213,11213,11213,11213,11213,11213,
+ 11213,11214,11214,11214,11214,11214,11214,11214,11214,11214,
+ 11214,11214,11214,11215,11215,11215,11215,11215,11215,11215,
+ 11215,11215,11215,11215,11215,11216,11216,11216,11216,11216,
+
+ 11216,11216,11216,11216,11216,11216,11216,11217,11217,11217,
+ 11217,11217,11217,11217,11217,11217,11217,11217,11217,11218,
+ 11218,11218,11218,11218,11218,11218,11218,11218,11218,11218,
+ 11218,11219,11219,11219,11219,11219,11219,11219,11219,11219,
+ 11219,11219,11219,11220,11220,11220,11220,11220,11220,11220,
+ 11220,11220,11220,11220,11220,11221,11221,11221,11221,11221,
+ 11221,11221,11221,11221,11221,11221,11221,11222,11222,11222,
+ 11222,11222,11222,11222,11222,11222,11222,11222,11222,11223,
+ 11223,11223,11223,11223,11223,11223,11223,11223,11223,11223,
+ 11223,11224,11224,11224,11224,11224,11224,11224,11224,11224,
+
+ 11224,11224,11224,11225,11225,11225,11225,11225,11225,11225,
+ 11225,11225,11225,11225,11225,11226,11226,11226,11226,11226,
+ 11226,11226,11226,11226,11226,11226,11226,11227,11227,11227,
+ 11227,11227,11227,11227,11227,11227,11227,11227,11227,11228,
+ 11228,11228,11228,11228,11228,11228,11228,11228,11228,11228,
+ 11228,11229,11229,11229,11229,11229,11229,11229,11229,11229,
+ 11229,11229,11229,11230,11230,11230,11230,11230,11230,11230,
+ 11230,11230,11230,11230,11230,11231,11231,11231,11231,11231,
+ 11231,11231,11231,11231,11231,11231,11231,11232,11232,11232,
+ 11232,11232,11232,11232,11232,11232,11232,11232,11232,11233,
+
+ 11233,11233,11233,11233,11233,11233,11233,11233,11233,11233,
+ 11233,11234,11234,11234,11234,11234,11234,11234,11234,11234,
+ 11234,11234,11234,11235,11235,11235,11235,11235,11235,11235,
+ 11235,11235,11235,11235,11235,11236,11236,11236,11236,11236,
+ 11236,11236,11236,11236,11236,11236,11236,11237,11237,11237,
+ 11237,11237,11237,11237,11237,11237,11237,11237,11237,11238,
+ 11238,11238,11238,11238,11238,11238,11238,11238,11238,11238,
+ 11238,11239,11239,11239,11239,11239,11239,11239,11239,11239,
+ 11239,11239,11239,11240,11240,11240,11240,11240,11240,11240,
+ 11240,11240,11240,11240,11240,11241,11241,11241,11241,11241,
+
+ 11241,11241,11241,11241,11241,11241,11241,11242,11242,11242,
+ 11242,11242,11242,11242,11242,11242,11242,11242,11242,11243,
+ 11243,11243,11243,11243,11243,11243,11243,11243,11243,11243,
+ 11243,11244,11244,11244,11244,11244,11244,11244,11244,11244,
+ 11244,11244,11244,11245,11245,11245,11245,11245,11245,11245,
+ 11245,11245,11245,11245,11245,11246,11246,11246,11246,11246,
+ 11246,11246,11246,11246,11246,11246,11246,11247,11247,11247,
+ 11247,11247,11247,11247,11247,11247,11247,11247,11247,11248,
+ 11248,11248,11248,11248,11248,11248,11248,11248,11248,11248,
+ 11248,11249,11249,11249,11249,11249,11249,11249,11249,11249,
+
+ 11249,11249,11249,11250,11250,11250,11250,11250,11250,11250,
+ 11250,11250,11250,11250,11250,11251,11251,11251,11251,11251,
+ 11251,11251,11251,11251,11251,11251,11251,11252,11252,11252,
+ 11252,11252,11252,11252,11252,11252,11252,11252,11252,11253,
+ 11253,11253,11253,11253,11253,11253,11253,11253,11253,11253,
+ 11253,11254,11254,11254,11254,11254,11254,11254,11254,11254,
+ 11254,11254,11254,11255,11255,11255,11255,11255,11255,11255,
+ 11255,11255,11255,11255,11255,11256,11256,11256,11256,11256,
+ 11256,11256,11256,11256,11256,11256,11256,11257,11257,11257,
+ 11257,11257,11257,11257,11257,11257,11257,11257,11257,11258,
+
+ 11258,11258,11258,11258,11258,11258,11258,11258,11258,11258,
+ 11258,11259,11259,11259,11259,11259,11259,11259,11259,11259,
+ 11259,11259,11259,11260,11260,11260,11260,11260,11260,11260,
+ 11260,11260,11260,11260,11260,11261,11261,11261,11261,11261,
+ 11261,11261,11261,11261,11261,11261,11261,11262,11262,11262,
+ 11262,11262,11262,11262,11262,11262,11262,11262,11262,11263,
+ 11263,11263,11263,11263,11263,11263,11263,11263,11263,11263,
+ 11263,11264,11264,11264,11264,11264,11264,11264,11264,11264,
+ 11264,11264,11264,11265,11265,11265,11265,11265,11265,11265,
+ 11265,11265,11265,11265,11265,11266,11266,11266,11266,11266,
+
+ 11266,11266,11266,11266,11266,11266,11266,11267,11267,11267,
+ 11267,11267,11267,11267,11267,11267,11267,11267,11267,11268,
+ 11268,11268,11268,11268,11268,11268,11268,11268,11268,11268,
+ 11268,11269,11269,11269,11269,11269,11269,11269,11269,11269,
+ 11269,11269,11269,11270,11270,11270,11270,11270,11270,11270,
+ 11270,11270,11270,11270,11270,11271,11271,11271,11271,11271,
+ 11271,11271,11271,11271,11271,11271,11271,11272,11272,11272,
+ 11272,11272,11272,11272,11272,11272,11272,11272,11272,11273,
+ 11273,11273,11273,11273,11273,11273,11273,11273,11273,11273,
+ 11273,11274,11274,11274,11274,11274,11274,11274,11274,11274,
+
+ 11274,11274,11274,11275,11275,11275,11275,11275,11275,11275,
+ 11275,11275,11275,11275,11275,11276,11276,11276,11276,11276,
+ 11276,11276,11276,11276,11276,11276,11276,11277,11277,11277,
+ 11277,11277,11277,11277,11277,11277,11277,11277,11277,11278,
+ 11278,11278,11278,11278,11278,11278,11278,11278,11278,11278,
+ 11278,11279,11279,11279,11279,11279,11279,11279,11279,11279,
+ 11279,11279,11279,11280,11280,11280,11280,11280,11280,11280,
+ 11280,11280,11280,11280,11280,11281,11281,11281,11281,11281,
+ 11281,11281,11281,11281,11281,11281,11281,11282,11282,11282,
+ 11282,11282,11282,11282,11282,11282,11282,11282,11282,11283,
+
+ 11283,11283,11283,11283,11283,11283,11283,11283,11283,11283,
+ 11283,11284,11284,11284,11284,11284,11284,11284,11284,11284,
+ 11284,11284,11284,11285,11285,11285,11285,11285,11285,11285,
+ 11285,11285,11285,11285,11285,11286,11286,11286,11286,11286,
+ 11286,11286,11286,11286,11286,11286,11286,11287,11287,11287,
+ 11287,11287,11287,11287,11287,11287,11287,11287,11287,11288,
+ 11288,11288,11288,11288,11288,11288,11288,11288,11288,11288,
+ 11288,11289,11289,11289,11289,11289,11289,11289,11289,11289,
+ 11289,11289,11289,11290,11290,11290,11290,11290,11290,11290,
+ 11290,11290,11290,11290,11290,11291,11291,11291,11291,11291,
+
+ 11291,11291,11291,11291,11291,11291,11291,11292,11292,11292,
+ 11292,11292,11292,11292,11292,11292,11292,11292,11292,11293,
+ 11293,11293,11293,11293,11293,11293,11293,11293,11293,11293,
+ 11293,11294,11294,11294,11294,11294,11294,11294,11294,11294,
+ 11294,11294,11294,11295,11295,11295,11295,11295,11295,11295,
+ 11295,11295,11295,11295,11295,11296,11296,11296,11296,11296,
+ 11296,11296,11296,11296,11296,11296,11296,11297,11297,11297,
+ 11297,11297,11297,11297,11297,11297,11297,11297,11297,11298,
+ 11298,11298,11298,11298,11298,11298,11298,11298,11298,11298,
+ 11298,11299,11299,11299,11299,11299,11299,11299,11299,11299,
+
+ 11299,11299,11299,11300,11300,11300,11300,11300,11300,11300,
+ 11300,11300,11300,11300,11300,11301,11301,11301,11301,11301,
+ 11301,11301,11301,11301,11301,11301,11301,11302,11302,11302,
+ 11302,11302,11302,11302,11302,11302,11302,11302,11302,11303,
+ 11303,11303,11303,11303,11303,11303,11303,11303,11303,11303,
+ 11303,11304,11304,11304,11304,11304,11304,11304,11304,11304,
+ 11304,11304,11304,11305,11305,11305,11305,11305,11305,11305,
+ 11305,11305,11305,11305,11305,11306,11306,11306,11306,11306,
+ 11306,11306,11306,11306,11306,11306,11306,11307,11307,11307,
+ 11307,11307,11307,11307,11307,11307,11307,11307,11307,11308,
+
+ 11308,11308,11308,11308,11308,11308,11308,11308,11308,11308,
+ 11308,11309,11309,11309,11309,11309,11309,11309,11309,11309,
+ 11309,11309,11309,11310,11310,11310,11310,11310,11310,11310,
+ 11310,11310,11310,11310,11310,11311,11311,11311,11311,11311,
+ 11311,11311,11311,11311,11311,11311,11311,11312,11312,11312,
+ 11312,11312,11312,11312,11312,11312,11312,11312,11312,11313,
+ 11313,11313,11313,11313,11313,11313,11313,11313,11313,11313,
+ 11313,11314,11314,11314,11314,11314,11314,11314,11314,11314,
+ 11314,11314,11314,11315,11315,11315,11315,11315,11315,11315,
+ 11315,11315,11315,11315,11315,11316,11316,11316,11316,11316,
+
+ 11316,11316,11316,11316,11316,11316,11316,11317,11317,11317,
+ 11317,11317,11317,11317,11317,11317,11317,11317,11317,11318,
+ 11318,11318,11318,11318,11318,11318,11318,11318,11318,11318,
+ 11318,11319,11319,11319,11319,11319,11319,11319,11319,11319,
+ 11319,11319,11319,11320,11320,11320,11320,11320,11320,11320,
+ 11320,11320,11320,11320,11320,11321,11321,11321,11321,11321,
+ 11321,11321,11321,11321,11321,11321,11321,11322,11322,11322,
+ 11322,11322,11322,11322,11322,11322,11322,11322,11322,11323,
+ 11323,11323,11323,11323,11323,11323,11323,11323,11323,11323,
+ 11323,11324,11324,11324,11324,11324,11324,11324,11324,11324,
+
+ 11324,11324,11324,11325,11325,11325,11325,11325,11325,11325,
+ 11325,11325,11325,11325,11325,11326,11326,11326,11326,11326,
+ 11326,11326,11326,11326,11326,11326,11326,11327,11327,11327,
+ 11327,11327,11327,11327,11327,11327,11327,11327,11327,11328,
+ 11328,11328,11328,11328,11328,11328,11328,11328,11328,11328,
+ 11328,11329,11329,11329,11329,11329,11329,11329,11329,11329,
+ 11329,11329,11329,11330,11330,11330,11330,11330,11330,11330,
+ 11330,11330,11330,11330,11330,11331,11331,11331,11331,11331,
+ 11331,11331,11331,11331,11331,11331,11331,11332,11332,11332,
+ 11332,11332,11332,11332,11332,11332,11332,11332,11332,11333,
+
+ 11333,11333,11333,11333,11333,11333,11333,11333,11333,11333,
+ 11333,11334,11334,11334,11334,11334,11334,11334,11334,11334,
+ 11334,11334,11334,11335,11335,11335,11335,11335,11335,11335,
+ 11335,11335,11335,11335,11335,11336,11336,11336,11336,11336,
+ 11336,11336,11336,11336,11336,11336,11336,11337,11337,11337,
+ 11337,11337,11337,11337,11337,11337,11337,11337,11337,11338,
+ 11338,11338,11338,11338,11338,11338,11338,11338,11338,11338,
+ 11338,11339,11339,11339,11339,11339,11339,11339,11339,11339,
+ 11339,11339,11339,11340,11340,11340,11340,11340,11340,11340,
+ 11340,11340,11340,11340,11340,11341,11341,11341,11341,11341,
+
+ 11341,11341,11341,11341,11341,11341,11341,11342,11342,11342,
+ 11342,11342,11342,11342,11342,11342,11342,11342,11342,11343,
+ 11343,11343,11343,11343,11343,11343,11343,11343,11343,11343,
+ 11343,11344,11344,11344,11344,11344,11344,11344,11344,11344,
+ 11344,11344,11344,11345,11345,11345,11345,11345,11345,11345,
+ 11345,11345,11345,11345,11345,11346,11346,11346,11346,11346,
+ 11346,11346,11346,11346,11346,11346,11346,11347,11347,11347,
+ 11347,11347,11347,11347,11347,11347,11347,11347,11347,11348,
+ 11348,11348,11348,11348,11348,11348,11348,11348,11348,11348,
+ 11348,11349,11349,11349,11349,11349,11349,11349,11349,11349,
+
+ 11349,11349,11349,11350,11350,11350,11350,11350,11350,11350,
+ 11350,11350,11350,11350,11350,11351,11351,11351,11351,11351,
+ 11351,11351,11351,11351,11351,11351,11351,11352,11352,11352,
+ 11352,11352,11352,11352,11352,11352,11352,11352,11352,11353,
+ 11353,11353,11353,11353,11353,11353,11353,11353,11353,11353,
+ 11353,11354,11354,11354,11354,11354,11354,11354,11354,11354,
+ 11354,11354,11354,11355,11355,11355,11355,11355,11355,11355,
+ 11355,11355,11355,11355,11355,11356,11356,11356,11356,11356,
+ 11356,11356,11356,11356,11356,11356,11356,11357,11357,11357,
+ 11357,11357,11357,11357,11357,11357,11357,11357,11357,11358,
+
+ 11358,11358,11358,11358,11358,11358,11358,11358,11358,11358,
+ 11358,11359,11359,11359,11359,11359,11359,11359,11359,11359,
+ 11359,11359,11359,11360,11360,11360,11360,11360,11360,11360,
+ 11360,11360,11360,11360,11360,11361,11361,11361,11361,11361,
+ 11361,11361,11361,11361,11361,11361,11361,11362,11362,11362,
+ 11362,11362,11362,11362,11362,11362,11362,11362,11362,11363,
+ 11363,11363,11363,11363,11363,11363,11363,11363,11363,11363,
+ 11363,11364,11364,11364,11364,11364,11364,11364,11364,11364,
+ 11364,11364,11364,11365,11365,11365,11365,11365,11365,11365,
+ 11365,11365,11365,11365,11365,11366,11366,11366,11366,11366,
+
+ 11366,11366,11366,11366,11366,11366,11366,11367,11367,11367,
+ 11367,11367,11367,11367,11367,11367,11367,11367,11367,11368,
+ 11368,11368,11368,11368,11368,11368,11368,11368,11368,11368,
+ 11368,11369,11369,11369,11369,11369,11369,11369,11369,11369,
+ 11369,11369,11369,11370,11370,11370,11370,11370,11370,11370,
+ 11370,11370,11370,11370,11370,11371,11371,11371,11371,11371,
+ 11371,11371,11371,11371,11371,11371,11371,11372,11372,11372,
+ 11372,11372,11372,11372,11372,11372,11372,11372,11372,11373,
+ 11373,11373,11373,11373,11373,11373,11373,11373,11373,11373,
+ 11373,11374,11374,11374,11374,11374,11374,11374,11374,11374,
+
+ 11374,11374,11374,11375,11375,11375,11375,11375,11375,11375,
+ 11375,11375,11375,11375,11375,11376,11376,11376,11376,11376,
+ 11376,11376,11376,11376,11376,11376,11376,11377,11377,11377,
+ 11377,11377,11377,11377,11377,11377,11377,11377,11377,11378,
+ 11378,11378,11378,11378,11378,11378,11378,11378,11378,11378,
+ 11378,11379,11379,11379,11379,11379,11379,11379,11379,11379,
+ 11379,11379,11379,11380,11380,11380,11380,11380,11380,11380,
+ 11380,11380,11380,11380,11380,11381,11381,11381,11381,11381,
+ 11381,11381,11381,11381,11381,11381,11381,11382,11382,11382,
+ 11382,11382,11382,11382,11382,11382,11382,11382,11382,11383,
+
+ 11383,11383,11383,11383,11383,11383,11383,11383,11383,11383,
+ 11383,11384,11384,11384,11384,11384,11384,11384,11384,11384,
+ 11384,11384,11384,11385,11385,11385,11385,11385,11385,11385,
+ 11385,11385,11385,11385,11385,11386,11386,11386,11386,11386,
+ 11386,11386,11386,11386,11386,11386,11386,11387,11387,11387,
+ 11387,11387,11387,11387,11387,11387,11387,11387,11387,11388,
+ 11388,11388,11388,11388,11388,11388,11388,11388,11388,11388,
+ 11388,11389,11389,11389,11389,11389,11389,11389,11389,11389,
+ 11389,11389,11389,11390,11390,11390,11390,11390,11390,11390,
+ 11390,11390,11390,11390,11390,11391,11391,11391,11391,11391,
+
+ 11391,11391,11391,11391,11391,11391,11391,11392,11392,11392,
+ 11392,11392,11392,11392,11392,11392,11392,11392,11392,11393,
+ 11393,11393,11393,11393,11393,11393,11393,11393,11393,11393,
+ 11393,11394,11394,11394,11394,11394,11394,11394,11394,11394,
+ 11394,11394,11394,11395,11395,11395,11395,11395,11395,11395,
+ 11395,11395,11395,11395,11395,11396,11396,11396,11396,11396,
+ 11396,11396,11396,11396,11396,11396,11396,11397,11397,11397,
+ 11397,11397,11397,11397,11397,11397,11397,11397,11397,11398,
+ 11398,11398,11398,11398,11398,11398,11398,11398,11398,11398,
+ 11398,11399,11399,11399,11399,11399,11399,11399,11399,11399,
+
+ 11399,11399,11399,11400,11400,11400,11400,11400,11400,11400,
+ 11400,11400,11400,11400,11400,11401,11401,11401,11401,11401,
+ 11401,11401,11401,11401,11401,11401,11401,11402,11402,11402,
+ 11402,11402,11402,11402,11402,11402,11402,11402,11402,11403,
+ 11403,11403,11403,11403,11403,11403,11403,11403,11403,11403,
+ 11403,11404,11404,11404,11404,11404,11404,11404,11404,11404,
+ 11404,11404,11404,11405,11405,11405,11405,11405,11405,11405,
+ 11405,11405,11405,11405,11405,11406,11406,11406,11406,11406,
+ 11406,11406,11406,11406,11406,11406,11406,11407,11407,11407,
+ 11407,11407,11407,11407,11407,11407,11407,11407,11407,11408,
+
+ 11408,11408,11408,11408,11408,11408,11408,11408,11408,11408,
+ 11408,11409,11409,11409,11409,11409,11409,11409,11409,11409,
+ 11409,11409,11409,11410,11410,11410,11410,11410,11410,11410,
+ 11410,11410,11410,11410,11410,11411,11411,11411,11411,11411,
+ 11411,11411,11411,11411,11411,11411,11411,11412,11412,11412,
+ 11412,11412,11412,11412,11412,11412,11412,11412,11412,11413,
+ 11413,11413,11413,11413,11413,11413,11413,11413,11413,11413,
+ 11413,11414,11414,11414,11414,11414,11414,11414,11414,11414,
+ 11414,11414,11414,11415,11415,11415,11415,11415,11415,11415,
+ 11415,11415,11415,11415,11415,11416,11416,11416,11416,11416,
+
+ 11416,11416,11416,11416,11416,11416,11416,11417,11417,11417,
+ 11417,11417,11417,11417,11417,11417,11417,11417,11417,11418,
+ 11418,11418,11418,11418,11418,11418,11418,11418,11418,11418,
+ 11418,11419,11419,11419,11419,11419,11419,11419,11419,11419,
+ 11419,11419,11419,11420,11420,11420,11420,11420,11420,11420,
+ 11420,11420,11420,11420,11420,11421,11421,11421,11421,11421,
+ 11421,11421,11421,11421,11421,11421,11421,11422,11422,11422,
+ 11422,11422,11422,11422,11422,11422,11422,11422,11422,11423,
+ 11423,11423,11423,11423,11423,11423,11423,11423,11423,11423,
+ 11423,11424,11424,11424,11424,11424,11424,11424,11424,11424,
+
+ 11424,11424,11424,11425,11425,11425,11425,11425,11425,11425,
+ 11425,11425,11425,11425,11425,11426,11426,11426,11426,11426,
+ 11426,11426,11426,11426,11426,11426,11426,11427,11427,11427,
+ 11427,11427,11427,11427,11427,11427,11427,11427,11427,11428,
+ 11428,11428,11428,11428,11428,11428,11428,11428,11428,11428,
+ 11428,11429,11429,11429,11429,11429,11429,11429,11429,11429,
+ 11429,11429,11429,11430,11430,11430,11430,11430,11430,11430,
+ 11430,11430,11430,11430,11430,11431,11431,11431,11431,11431,
+ 11431,11431,11431,11431,11431,11431,11431,11432,11432,11432,
+ 11432,11432,11432,11432,11432,11432,11432,11432,11432,11433,
+
+ 11433,11433,11433,11433,11433,11433,11433,11433,11433,11433,
+ 11433,11434,11434,11434,11434,11434,11434,11434,11434,11434,
+ 11434,11434,11434,11435,11435,11435,11435,11435,11435,11435,
+ 11435,11435,11435,11435,11435,11436,11436,11436,11436,11436,
+ 11436,11436,11436,11436,11436,11436,11436,11437,11437,11437,
+ 11437,11437,11437,11437,11437,11437,11437,11437,11437,11438,
+ 11438,11438,11438,11438,11438,11438,11438,11438,11438,11438,
+ 11438,11439,11439,11439,11439,11439,11439,11439,11439,11439,
+ 11439,11439,11439,11440,11440,11440,11440,11440,11440,11440,
+ 11440,11440,11440,11440,11440,11441,11441,11441,11441,11441,
+
+ 11441,11441,11441,11441,11441,11441,11441,11442,11442,11442,
+ 11442,11442,11442,11442,11442,11442,11442,11442,11442,11443,
+ 11443,11443,11443,11443,11443,11443,11443,11443,11443,11443,
+ 11443,11444,11444,11444,11444,11444,11444,11444,11444,11444,
+ 11444,11444,11444,11445,11445,11445,11445,11445,11445,11445,
+ 11445,11445,11445,11445,11445,11446,11446,11446,11446,11446,
+ 11446,11446,11446,11446,11446,11446,11446,11447,11447,11447,
+ 11447,11447,11447,11447,11447,11447,11447,11447,11447,11448,
+ 11448,11448,11448,11448,11448,11448,11448,11448,11448,11448,
+ 11448,11449,11449,11449,11449,11449,11449,11449,11449,11449,
+
+ 11449,11449,11449,11450,11450,11450,11450,11450,11450,11450,
+ 11450,11450,11450,11450,11450,11451,11451,11451,11451,11451,
+ 11451,11451,11451,11451,11451,11451,11451,11452,11452,11452,
+ 11452,11452,11452,11452,11452,11452,11452,11452,11452,11453,
+ 11453,11453,11453,11453,11453,11453,11453,11453,11453,11453,
+ 11453,11454,11454,11454,11454,11454,11454,11454,11454,11454,
+ 11454,11454,11454,11455,11455,11455,11455,11455,11455,11455,
+ 11455,11455,11455,11455,11455,11456,11456,11456,11456,11456,
+ 11456,11456,11456,11456,11456,11456,11456,11457,11457,11457,
+ 11457,11457,11457,11457,11457,11457,11457,11457,11457,11458,
+
+ 11458,11458,11458,11458,11458,11458,11458,11458,11458,11458,
+ 11458,11459,11459,11459,11459,11459,11459,11459,11459,11459,
+ 11459,11459,11459,11460,11460,11460,11460,11460,11460,11460,
+ 11460,11460,11460,11460,11460,11461,11461,11461,11461,11461,
+ 11461,11461,11461,11461,11461,11461,11461,11462,11462,11462,
+ 11462,11462,11462,11462,11462,11462,11462,11462,11462,11463,
+ 11463,11463,11463,11463,11463,11463,11463,11463,11463,11463,
+ 11463,11464,11464,11464,11464,11464,11464,11464,11464,11464,
+ 11464,11464,11464,11465,11465,11465,11465,11465,11465,11465,
+ 11465,11465,11465,11465,11465,11466,11466,11466,11466,11466,
+
+ 11466,11466,11466,11466,11466,11466,11466,11467,11467,11467,
+ 11467,11467,11467,11467,11467,11467,11467,11467,11467,11468,
+ 11468,11468,11468,11468,11468,11468,11468,11468,11468,11468,
+ 11468,11469,11469,11469,11469,11469,11469,11469,11469,11469,
+ 11469,11469,11469,11470,11470,11470,11470,11470,11470,11470,
+ 11470,11470,11470,11470,11470,11471,11471,11471,11471,11471,
+ 11471,11471,11471,11471,11471,11471,11471,11472,11472,11472,
+ 11472,11472,11472,11472,11472,11472,11472,11472,11472,11473,
+ 11473,11473,11473,11473,11473,11473,11473,11473,11473,11473,
+ 11473,11474,11474,11474,11474,11474,11474,11474,11474,11474,
+
+ 11474,11474,11474,11475,11475,11475,11475,11475,11475,11475,
+ 11475,11475,11475,11475,11475,11476,11476,11476,11476,11476,
+ 11476,11476,11476,11476,11476,11476,11476,11477,11477,11477,
+ 11477,11477,11477,11477,11477,11477,11477,11477,11477,11478,
+ 11478,11478,11478,11478,11478,11478,11478,11478,11478,11478,
+ 11478,11479,11479,11479,11479,11479,11479,11479,11479,11479,
+ 11479,11479,11479,11480,11480,11480,11480,11480,11480,11480,
+ 11480,11480,11480,11480,11480,11481,11481,11481,11481,11481,
+ 11481,11481,11481,11481,11481,11481,11481,11482,11482,11482,
+ 11482,11482,11482,11482,11482,11482,11482,11482,11482,11483,
+
+ 11483,11483,11483,11483,11483,11483,11483,11483,11483,11483,
+ 11483,11484,11484,11484,11484,11484,11484,11484,11484,11484,
+ 11484,11484,11484,11485,11485,11485,11485,11485,11485,11485,
+ 11485,11485,11485,11485,11485,11486,11486,11486,11486,11486,
+ 11486,11486,11486,11486,11486,11486,11486,11487,11487,11487,
+ 11487,11487,11487,11487,11487,11487,11487,11487,11487,11488,
+ 11488,11488,11488,11488,11488,11488,11488,11488,11488,11488,
+ 11488,11489,11489,11489,11489,11489,11489,11489,11489,11489,
+ 11489,11489,11489,11490,11490,11490,11490,11490,11490,11490,
+ 11490,11490,11490,11490,11490,11491,11491,11491,11491,11491,
+
+ 11491,11491,11491,11491,11491,11491,11491,11492,11492,11492,
+ 11492,11492,11492,11492,11492,11492,11492,11492,11492,11493,
+ 11493,11493,11493,11493,11493,11493,11493,11493,11493,11493,
+ 11493,11494,11494,11494,11494,11494,11494,11494,11494,11494,
+ 11494,11494,11494,11495,11495,11495,11495,11495,11495,11495,
+ 11495,11495,11495,11495,11495,11496,11496,11496,11496,11496,
+ 11496,11496,11496,11496,11496,11496,11496,11497,11497,11497,
+ 11497,11497,11497,11497,11497,11497,11497,11497,11497,11498,
+ 11498,11498,11498,11498,11498,11498,11498,11498,11498,11498,
+ 11498,11499,11499,11499,11499,11499,11499,11499,11499,11499,
+
+ 11499,11499,11499,11500,11500,11500,11500,11500,11500,11500,
+ 11500,11500,11500,11500,11500,11501,11501,11501,11501,11501,
+ 11501,11501,11501,11501,11501,11501,11501,11502,11502,11502,
+ 11502,11502,11502,11502,11502,11502,11502,11502,11502,11503,
+ 11503,11503,11503,11503,11503,11503,11503,11503,11503,11503,
+ 11503,11504,11504,11504,11504,11504,11504,11504,11504,11504,
+ 11504,11504,11504,11505,11505,11505,11505,11505,11505,11505,
+ 11505,11505,11505,11505,11505,11506,11506,11506,11506,11506,
+ 11506,11506,11506,11506,11506,11506,11506,11507,11507,11507,
+ 11507,11507,11507,11507,11507,11507,11507,11507,11507,11508,
+
+ 11508,11508,11508,11508,11508,11508,11508,11508,11508,11508,
+ 11508,11509,11509,11509,11509,11509,11509,11509,11509,11509,
+ 11509,11509,11509,11510,11510,11510,11510,11510,11510,11510,
+ 11510,11510,11510,11510,11510,11511,11511,11511,11511,11511,
+ 11511,11511,11511,11511,11511,11511,11511,11512,11512,11512,
+ 11512,11512,11512,11512,11512,11512,11512,11512,11512,11513,
+ 11513,11513,11513,11513,11513,11513,11513,11513,11513,11513,
+ 11513,11514,11514,11514,11514,11514,11514,11514,11514,11514,
+ 11514,11514,11514,11515,11515,11515,11515,11515,11515,11515,
+ 11515,11515,11515,11515,11515,11516,11516,11516,11516,11516,
+
+ 11516,11516,11516,11516,11516,11516,11516,11517,11517,11517,
+ 11517,11517,11517,11517,11517,11517,11517,11517,11517,11518,
+ 11518,11518,11518,11518,11518,11518,11518,11518,11518,11518,
+ 11518,11519,11519,11519,11519,11519,11519,11519,11519,11519,
+ 11519,11519,11519,11520,11520,11520,11520,11520,11520,11520,
+ 11520,11520,11520,11520,11520,11521,11521,11521,11521,11521,
+ 11521,11521,11521,11521,11521,11521,11521,11522,11522,11522,
+ 11522,11522,11522,11522,11522,11522,11522,11522,11522,11523,
+ 11523,11523,11523,11523,11523,11523,11523,11523,11523,11523,
+ 11523,11524,11524,11524,11524,11524,11524,11524,11524,11524,
+
+ 11524,11524,11524,11525,11525,11525,11525,11525,11525,11525,
+ 11525,11525,11525,11525,11525,11526,11526,11526,11526,11526,
+ 11526,11526,11526,11526,11526,11526,11526,11527,11527,11527,
+ 11527,11527,11527,11527,11527,11527,11527,11527,11527,11528,
+ 11528,11528,11528,11528,11528,11528,11528,11528,11528,11528,
+ 11528,11529,11529,11529,11529,11529,11529,11529,11529,11529,
+ 11529,11529,11529,11530,11530,11530,11530,11530,11530,11530,
+ 11530,11530,11530,11530,11530,11531,11531,11531,11531,11531,
+ 11531,11531,11531,11531,11531,11531,11531,11532,11532,11532,
+ 11532,11532,11532,11532,11532,11532,11532,11532,11532,11533,
+
+ 11533,11533,11533,11533,11533,11533,11533,11533,11533,11533,
+ 11533,11534,11534,11534,11534,11534,11534,11534,11534,11534,
+ 11534,11534,11534,11535,11535,11535,11535,11535,11535,11535,
+ 11535,11535,11535,11535,11535,11536,11536,11536,11536,11536,
+ 11536,11536,11536,11536,11536,11536,11536,11537,11537,11537,
+ 11537,11537,11537,11537,11537,11537,11537,11537,11537,11538,
+ 11538,11538,11538,11538,11538,11538,11538,11538,11538,11538,
+ 11538,11539,11539,11539,11539,11539,11539,11539,11539,11539,
+ 11539,11539,11539,11540,11540,11540,11540,11540,11540,11540,
+ 11540,11540,11540,11540,11540,11541,11541,11541,11541,11541,
+
+ 11541,11541,11541,11541,11541,11541,11541,11542,11542,11542,
+ 11542,11542,11542,11542,11542,11542,11542,11542,11542,11543,
+ 11543,11543,11543,11543,11543,11543,11543,11543,11543,11543,
+ 11543,11544,11544,11544,11544,11544,11544,11544,11544,11544,
+ 11544,11544,11544,11545,11545,11545,11545,11545,11545,11545,
+ 11545,11545,11545,11545,11545,11546,11546,11546,11546,11546,
+ 11546,11546,11546,11546,11546,11546,11546,11547,11547,11547,
+ 11547,11547,11547,11547,11547,11547,11547,11547,11547,11548,
+ 11548,11548,11548,11548,11548,11548,11548,11548,11548,11548,
+ 11548,11549,11549,11549,11549,11549,11549,11549,11549,11549,
+
+ 11549,11549,11549,11550,11550,11550,11550,11550,11550,11550,
+ 11550,11550,11550,11550,11550,11551,11551,11551,11551,11551,
+ 11551,11551,11551,11551,11551,11551,11551,11552,11552,11552,
+ 11552,11552,11552,11552,11552,11552,11552,11552,11552,11553,
+ 11553,11553,11553,11553,11553,11553,11553,11553,11553,11553,
+ 11553,11554,11554,11554,11554,11554,11554,11554,11554,11554,
+ 11554,11554,11554,11555,11555,11555,11555,11555,11555,11555,
+ 11555,11555,11555,11555,11555,11556,11556,11556,11556,11556,
+ 11556,11556,11556,11556,11556,11556,11556,11557,11557,11557,
+ 11557,11557,11557,11557,11557,11557,11557,11557,11557,11558,
+
+ 11558,11558,11558,11558,11558,11558,11558,11558,11558,11558,
+ 11558,11559,11559,11559,11559,11559,11559,11559,11559,11559,
+ 11559,11559,11559,11560,11560,11560,11560,11560,11560,11560,
+ 11560,11560,11560,11560,11560,11561,11561,11561,11561,11561,
+ 11561,11561,11561,11561,11561,11561,11561,11562,11562,11562,
+ 11562,11562,11562,11562,11562,11562,11562,11562,11562,11563,
+ 11563,11563,11563,11563,11563,11563,11563,11563,11563,11563,
+ 11563,11564,11564,11564,11564,11564,11564,11564,11564,11564,
+ 11564,11564,11564,11565,11565,11565,11565,11565,11565,11565,
+ 11565,11565,11565,11565,11565,11566,11566,11566,11566,11566,
+
+ 11566,11566,11566,11566,11566,11566,11566,11567,11567,11567,
+ 11567,11567,11567,11567,11567,11567,11567,11567,11567,11568,
+ 11568,11568,11568,11568,11568,11568,11568,11568,11568,11568,
+ 11568,11569,11569,11569,11569,11569,11569,11569,11569,11569,
+ 11569,11569,11569,11570,11570,11570,11570,11570,11570,11570,
+ 11570,11570,11570,11570,11570,11571,11571,11571,11571,11571,
+ 11571,11571,11571,11571,11571,11571,11571,11572,11572,11572,
+ 11572,11572,11572,11572,11572,11572,11572,11572,11572,11573,
+ 11573,11573,11573,11573,11573,11573,11573,11573,11573,11573,
+ 11573,11574,11574,11574,11574,11574,11574,11574,11574,11574,
+
+ 11574,11574,11574,11575,11575,11575,11575,11575,11575,11575,
+ 11575,11575,11575,11575,11575,11576,11576,11576,11576,11576,
+ 11576,11576,11576,11576,11576,11576,11576,11577,11577,11577,
+ 11577,11577,11577,11577,11577,11577,11577,11577,11577,11578,
+ 11578,11578,11578,11578,11578,11578,11578,11578,11578,11578,
+ 11578,11579,11579,11579,11579,11579,11579,11579,11579,11579,
+ 11579,11579,11579,11580,11580,11580,11580,11580,11580,11580,
+ 11580,11580,11580,11580,11580,11581,11581,11581,11581,11581,
+ 11581,11581,11581,11581,11581,11581,11581,11582,11582,11582,
+ 11582,11582,11582,11582,11582,11582,11582,11582,11582,11583,
+
+ 11583,11583,11583,11583,11583,11583,11583,11583,11583,11583,
+ 11583,11584,11584,11584,11584,11584,11584,11584,11584,11584,
+ 11584,11584,11584,11585,11585,11585,11585,11585,11585,11585,
+ 11585,11585,11585,11585,11585,11586,11586,11586,11586,11586,
+ 11586,11586,11586,11586,11586,11586,11586,11587,11587,11587,
+ 11587,11587,11587,11587,11587,11587,11587,11587,11587,11588,
+ 11588,11588,11588,11588,11588,11588,11588,11588,11588,11588,
+ 11588,11589,11589,11589,11589,11589,11589,11589,11589,11589,
+ 11589,11589,11589,11590,11590,11590,11590,11590,11590,11590,
+ 11590,11590,11590,11590,11590,11591,11591,11591,11591,11591,
+
+ 11591,11591,11591,11591,11591,11591,11591,11592,11592,11592,
+ 11592,11592,11592,11592,11592,11592,11592,11592,11592,11593,
+ 11593,11593,11593,11593,11593,11593,11593,11593,11593,11593,
+ 11593,11594,11594,11594,11594,11594,11594,11594,11594,11594,
+ 11594,11594,11594,11595,11595,11595,11595,11595,11595,11595,
+ 11595,11595,11595,11595,11595,11596,11596,11596,11596,11596,
+ 11596,11596,11596,11596,11596,11596,11596,11597,11597,11597,
+ 11597,11597,11597,11597,11597,11597,11597,11597,11597,11598,
+ 11598,11598,11598,11598,11598,11598,11598,11598,11598,11598,
+ 11598,11599,11599,11599,11599,11599,11599,11599,11599,11599,
+
+ 11599,11599,11599,11600,11600,11600,11600,11600,11600,11600,
+ 11600,11600,11600,11600,11600,11601,11601,11601,11601,11601,
+ 11601,11601,11601,11601,11601,11601,11601,11602,11602,11602,
+ 11602,11602,11602,11602,11602,11602,11602,11602,11602,11603,
+ 11603,11603,11603,11603,11603,11603,11603,11603,11603,11603,
+ 11603,11604,11604,11604,11604,11604,11604,11604,11604,11604,
+ 11604,11604,11604,11605,11605,11605,11605,11605,11605,11605,
+ 11605,11605,11605,11605,11605,11606,11606,11606,11606,11606,
+ 11606,11606,11606,11606,11606,11606,11606,11607,11607,11607,
+ 11607,11607,11607,11607,11607,11607,11607,11607,11607,11608,
+
+ 11608,11608,11608,11608,11608,11608,11608,11608,11608,11608,
+ 11608,11609,11609,11609,11609,11609,11609,11609,11609,11609,
+ 11609,11609,11609,11610,11610,11610,11610,11610,11610,11610,
+ 11610,11610,11610,11610,11610,11611,11611,11611,11611,11611,
+ 11611,11611,11611,11611,11611,11611,11611,11612,11612,11612,
+ 11612,11612,11612,11612,11612,11612,11612,11612,11612,11613,
+ 11613,11613,11613,11613,11613,11613,11613,11613,11613,11613,
+ 11613,11614,11614,11614,11614,11614,11614,11614,11614,11614,
+ 11614,11614,11614,11615,11615,11615,11615,11615,11615,11615,
+ 11615,11615,11615,11615,11615,11616,11616,11616,11616,11616,
+
+ 11616,11616,11616,11616,11616,11616,11616,11617,11617,11617,
+ 11617,11617,11617,11617,11617,11617,11617,11617,11617,11618,
+ 11618,11618,11618,11618,11618,11618,11618,11618,11618,11618,
+ 11618,11619,11619,11619,11619,11619,11619,11619,11619,11619,
+ 11619,11619,11619,11620,11620,11620,11620,11620,11620,11620,
+ 11620,11620,11620,11620,11620,11621,11621,11621,11621,11621,
+ 11621,11621,11621,11621,11621,11621,11621,11622,11622,11622,
+ 11622,11622,11622,11622,11622,11622,11622,11622,11622,11623,
+ 11623,11623,11623,11623,11623,11623,11623,11623,11623,11623,
+ 11623,11624,11624,11624,11624,11624,11624,11624,11624,11624,
+
+ 11624,11624,11624,11625,11625,11625,11625,11625,11625,11625,
+ 11625,11625,11625,11625,11625,11626,11626,11626,11626,11626,
+ 11626,11626,11626,11626,11626,11626,11626,11627,11627,11627,
+ 11627,11627,11627,11627,11627,11627,11627,11627,11627,11628,
+ 11628,11628,11628,11628,11628,11628,11628,11628,11628,11628,
+ 11628,11629,11629,11629,11629,11629,11629,11629,11629,11629,
+ 11629,11629,11629,11630,11630,11630,11630,11630,11630,11630,
+ 11630,11630,11630,11630,11630,11631,11631,11631,11631,11631,
+ 11631,11631,11631,11631,11631,11631,11631,11632,11632,11632,
+ 11632,11632,11632,11632,11632,11632,11632,11632,11632,11633,
+
+ 11633,11633,11633,11633,11633,11633,11633,11633,11633,11633,
+ 11633,11634,11634,11634,11634,11634,11634,11634,11634,11634,
+ 11634,11634,11634,11635,11635,11635,11635,11635,11635,11635,
+ 11635,11635,11635,11635,11635,11636,11636,11636,11636,11636,
+ 11636,11636,11636,11636,11636,11636,11636,11637,11637,11637,
+ 11637,11637,11637,11637,11637,11637,11637,11637,11637,11638,
+ 11638,11638,11638,11638,11638,11638,11638,11638,11638,11638,
+ 11638,11639,11639,11639,11639,11639,11639,11639,11639,11639,
+ 11639,11639,11639,11640,11640,11640,11640,11640,11640,11640,
+ 11640,11640,11640,11640,11640,11641,11641,11641,11641,11641,
+
+ 11641,11641,11641,11641,11641,11641,11641,11642,11642,11642,
+ 11642,11642,11642,11642,11642,11642,11642,11642,11642,11643,
+ 11643,11643,11643,11643,11643,11643,11643,11643,11643,11643,
+ 11643,11644,11644,11644,11644,11644,11644,11644,11644,11644,
+ 11644,11644,11644,11645,11645,11645,11645,11645,11645,11645,
+ 11645,11645,11645,11645,11645,11646,11646,11646,11646,11646,
+ 11646,11646,11646,11646,11646,11646,11646,11647,11647,11647,
+ 11647,11647,11647,11647,11647,11647,11647,11647,11647,11648,
+ 11648,11648,11648,11648,11648,11648,11648,11648,11648,11648,
+ 11648,11649,11649,11649,11649,11649,11649,11649,11649,11649,
+
+ 11649,11649,11649,11650,11650,11650,11650,11650,11650,11650,
+ 11650,11650,11650,11650,11650,11651,11651,11651,11651,11651,
+ 11651,11651,11651,11651,11651,11651,11651,11652,11652,11652,
+ 11652,11652,11652,11652,11652,11652,11652,11652,11652,11653,
+ 11653,11653,11653,11653,11653,11653,11653,11653,11653,11653,
+ 11653,11654,11654,11654,11654,11654,11654,11654,11654,11654,
+ 11654,11654,11654,11655,11655,11655,11655,11655,11655,11655,
+ 11655,11655,11655,11655,11655,11656,11656,11656,11656,11656,
+ 11656,11656,11656,11656,11656,11656,11656,11657,11657,11657,
+ 11657,11657,11657,11657,11657,11657,11657,11657,11657,11658,
+
+ 11658,11658,11658,11658,11658,11658,11658,11658,11658,11658,
+ 11658,11659,11659,11659,11659,11659,11659,11659,11659,11659,
+ 11659,11659,11659,11660,11660,11660,11660,11660,11660,11660,
+ 11660,11660,11660,11660,11660,11661,11661,11661,11661,11661,
+ 11661,11661,11661,11661,11661,11661,11661,11662,11662,11662,
+ 11662,11662,11662,11662,11662,11662,11662,11662,11662,11663,
+ 11663,11663,11663,11663,11663,11663,11663,11663,11663,11663,
+ 11663,11664,11664,11664,11664,11664,11664,11664,11664,11664,
+ 11664,11664,11664,11665,11665,11665,11665,11665,11665,11665,
+ 11665,11665,11665,11665,11665,11666,11666,11666,11666,11666,
+
+ 11666,11666,11666,11666,11666,11666,11666,11667,11667,11667,
+ 11667,11667,11667,11667,11667,11667,11667,11667,11667,11668,
+ 11668,11668,11668,11668,11668,11668,11668,11668,11668,11668,
+ 11668,11669,11669,11669,11669,11669,11669,11669,11669,11669,
+ 11669,11669,11669,11670,11670,11670,11670,11670,11670,11670,
+ 11670,11670,11670,11670,11670,11671,11671,11671,11671,11671,
+ 11671,11671,11671,11671,11671,11671,11671,11672,11672,11672,
+ 11672,11672,11672,11672,11672,11672,11672,11672,11672,11673,
+ 11673,11673,11673,11673,11673,11673,11673,11673,11673,11673,
+ 11673,11674,11674,11674,11674,11674,11674,11674,11674,11674,
+
+ 11674,11674,11674,11675,11675,11675,11675,11675,11675,11675,
+ 11675,11675,11675,11675,11675,11676,11676,11676,11676,11676,
+ 11676,11676,11676,11676,11676,11676,11676,11677,11677,11677,
+ 11677,11677,11677,11677,11677,11677,11677,11677,11677,11678,
+ 11678,11678,11678,11678,11678,11678,11678,11678,11678,11678,
+ 11678,11679,11679,11679,11679,11679,11679,11679,11679,11679,
+ 11679,11679,11679,11680,11680,11680,11680,11680,11680,11680,
+ 11680,11680,11680,11680,11680,11681,11681,11681,11681,11681,
+ 11681,11681,11681,11681,11681,11681,11681,11682,11682,11682,
+ 11682,11682,11682,11682,11682,11682,11682,11682,11682,11683,
+
+ 11683,11683,11683,11683,11683,11683,11683,11683,11683,11683,
+ 11683,11684,11684,11684,11684,11684,11684,11684,11684,11684,
+ 11684,11684,11684,11685,11685,11685,11685,11685,11685,11685,
+ 11685,11685,11685,11685,11685,11686,11686,11686,11686,11686,
+ 11686,11686,11686,11686,11686,11686,11686,11687,11687,11687,
+ 11687,11687,11687,11687,11687,11687,11687,11687,11687,11688,
+ 11688,11688,11688,11688,11688,11688,11688,11688,11688,11688,
+ 11688,11689,11689,11689,11689,11689,11689,11689,11689,11689,
+ 11689,11689,11689,11690,11690,11690,11690,11690,11690,11690,
+ 11690,11690,11690,11690,11690,11691,11691,11691,11691,11691,
+
+ 11691,11691,11691,11691,11691,11691,11691,11692,11692,11692,
+ 11692,11692,11692,11692,11692,11692,11692,11692,11692,11693,
+ 11693,11693,11693,11693,11693,11693,11693,11693,11693,11693,
+ 11693,11694,11694,11694,11694,11694,11694,11694,11694,11694,
+ 11694,11694,11694,11695,11695,11695,11695,11695,11695,11695,
+ 11695,11695,11695,11695,11695,11696,11696,11696,11696,11696,
+ 11696,11696,11696,11696,11696,11696,11696,11697,11697,11697,
+ 11697,11697,11697,11697,11697,11697,11697,11697,11697,11698,
+ 11698,11698,11698,11698,11698,11698,11698,11698,11698,11698,
+ 11698,11699,11699,11699,11699,11699,11699,11699,11699,11699,
+
+ 11699,11699,11699,11700,11700,11700,11700,11700,11700,11700,
+ 11700,11700,11700,11700,11700,11701,11701,11701,11701,11701,
+ 11701,11701,11701,11701,11701,11701,11701,11702,11702,11702,
+ 11702,11702,11702,11702,11702,11702,11702,11702,11702,11703,
+ 11703,11703,11703,11703,11703,11703,11703,11703,11703,11703,
+ 11703,11704,11704,11704,11704,11704,11704,11704,11704,11704,
+ 11704,11704,11704,11705,11705,11705,11705,11705,11705,11705,
+ 11705,11705,11705,11705,11705,11706,11706,11706,11706,11706,
+ 11706,11706,11706,11706,11706,11706,11706,11707,11707,11707,
+ 11707,11707,11707,11707,11707,11707,11707,11707,11707,11708,
+
+ 11708,11708,11708,11708,11708,11708,11708,11708,11708,11708,
+ 11708,11709,11709,11709,11709,11709,11709,11709,11709,11709,
+ 11709,11709,11709,11710,11710,11710,11710,11710,11710,11710,
+ 11710,11710,11710,11710,11710,11711,11711,11711,11711,11711,
+ 11711,11711,11711,11711,11711,11711,11711,11712,11712,11712,
+ 11712,11712,11712,11712,11712,11712,11712,11712,11712,11713,
+ 11713,11713,11713,11713,11713,11713,11713,11713,11713,11713,
+ 11713,11714,11714,11714,11714,11714,11714,11714,11714,11714,
+ 11714,11714,11714,11715,11715,11715,11715,11715,11715,11715,
+ 11715,11715,11715,11715,11715,11716,11716,11716,11716,11716,
+
+ 11716,11716,11716,11716,11716,11716,11716,11717,11717,11717,
+ 11717,11717,11717,11717,11717,11717,11717,11717,11717,11718,
+ 11718,11718,11718,11718,11718,11718,11718,11718,11718,11718,
+ 11718,11719,11719,11719,11719,11719,11719,11719,11719,11719,
+ 11719,11719,11719,11720,11720,11720,11720,11720,11720,11720,
+ 11720,11720,11720,11720,11720,11721,11721,11721,11721,11721,
+ 11721,11721,11721,11721,11721,11721,11721,11722,11722,11722,
+ 11722,11722,11722,11722,11722,11722,11722,11722,11722,11723,
+ 11723,11723,11723,11723,11723,11723,11723,11723,11723,11723,
+ 11723,11724,11724,11724,11724,11724,11724,11724,11724,11724,
+
+ 11724,11724,11724,11725,11725,11725,11725,11725,11725,11725,
+ 11725,11725,11725,11725,11725,11726,11726,11726,11726,11726,
+ 11726,11726,11726,11726,11726,11726,11726,11727,11727,11727,
+ 11727,11727,11727,11727,11727,11727,11727,11727,11727,11728,
+ 11728,11728,11728,11728,11728,11728,11728,11728,11728,11728,
+ 11728,11729,11729,11729,11729,11729,11729,11729,11729,11729,
+ 11729,11729,11729,11730,11730,11730,11730,11730,11730,11730,
+ 11730,11730,11730,11730,11730,11731,11731,11731,11731,11731,
+ 11731,11731,11731,11731,11731,11731,11731,11732,11732,11732,
+ 11732,11732,11732,11732,11732,11732,11732,11732,11732,11733,
+
+ 11733,11733,11733,11733,11733,11733,11733,11733,11733,11733,
+ 11733,11734,11734,11734,11734,11734,11734,11734,11734,11734,
+ 11734,11734,11734,11735,11735,11735,11735,11735,11735,11735,
+ 11735,11735,11735,11735,11735,11736,11736,11736,11736,11736,
+ 11736,11736,11736,11736,11736,11736,11736,11737,11737,11737,
+ 11737,11737,11737,11737,11737,11737,11737,11737,11737,11738,
+ 11738,11738,11738,11738,11738,11738,11738,11738,11738,11738,
+ 11738,11739,11739,11739,11739,11739,11739,11739,11739,11739,
+ 11739,11739,11739,11740,11740,11740,11740,11740,11740,11740,
+ 11740,11740,11740,11740,11740,11741,11741,11741,11741,11741,
+
+ 11741,11741,11741,11741,11741,11741,11741,11742,11742,11742,
+ 11742,11742,11742,11742,11742,11742,11742,11742,11742,11743,
+ 11743,11743,11743,11743,11743,11743,11743,11743,11743,11743,
+ 11743,11744,11744,11744,11744,11744,11744,11744,11744,11744,
+ 11744,11744,11744,11745,11745,11745,11745,11745,11745,11745,
+ 11745,11745,11745,11745,11745,11746,11746,11746,11746,11746,
+ 11746,11746,11746,11746,11746,11746,11746,11747,11747,11747,
+ 11747,11747,11747,11747,11747,11747,11747,11747,11747,11748,
+ 11748,11748,11748,11748,11748,11748,11748,11748,11748,11748,
+ 11748,11749,11749,11749,11749,11749,11749,11749,11749,11749,
+
+ 11749,11749,11749,11750,11750,11750,11750,11750,11750,11750,
+ 11750,11750,11750,11750,11750,11751,11751,11751,11751,11751,
+ 11751,11751,11751,11751,11751,11751,11751,11752,11752,11752,
+ 11752,11752,11752,11752,11752,11752,11752,11752,11752,11753,
+ 11753,11753,11753,11753,11753,11753,11753,11753,11753,11753,
+ 11753,11754,11754,11754,11754,11754,11754,11754,11754,11754,
+ 11754,11754,11754,11755,11755,11755,11755,11755,11755,11755,
+ 11755,11755,11755,11755,11755,11756,11756,11756,11756,11756,
+ 11756,11756,11756,11756,11756,11756,11756,11757,11757,11757,
+ 11757,11757,11757,11757,11757,11757,11757,11757,11757,11758,
+
+ 11758,11758,11758,11758,11758,11758,11758,11758,11758,11758,
+ 11758,11759,11759,11759,11759,11759,11759,11759,11759,11759,
+ 11759,11759,11759,11760,11760,11760,11760,11760,11760,11760,
+ 11760,11760,11760,11760,11760,11761,11761,11761,11761,11761,
+ 11761,11761,11761,11761,11761,11761,11761,11762,11762,11762,
+ 11762,11762,11762,11762,11762,11762,11762,11762,11762,11763,
+ 11763,11763,11763,11763,11763,11763,11763,11763,11763,11763,
+ 11763,11764,11764,11764,11764,11764,11764,11764,11764,11764,
+ 11764,11764,11764,11765,11765,11765,11765,11765,11765,11765,
+ 11765,11765,11765,11765,11765,11766,11766,11766,11766,11766,
+
+ 11766,11766,11766,11766,11766,11766,11766,11767,11767,11767,
+ 11767,11767,11767,11767,11767,11767,11767,11767,11767,11768,
+ 11768,11768,11768,11768,11768,11768,11768,11768,11768,11768,
+ 11768,11769,11769,11769,11769,11769,11769,11769,11769,11769,
+ 11769,11769,11769,11770,11770,11770,11770,11770,11770,11770,
+ 11770,11770,11770,11770,11770,11771,11771,11771,11771,11771,
+ 11771,11771,11771,11771,11771,11771,11771,11772,11772,11772,
+ 11772,11772,11772,11772,11772,11772,11772,11772,11772,11773,
+ 11773,11773,11773,11773,11773,11773,11773,11773,11773,11773,
+ 11773,11774,11774,11774,11774,11774,11774,11774,11774,11774,
+
+ 11774,11774,11774,11775,11775,11775,11775,11775,11775,11775,
+ 11775,11775,11775,11775,11775,11776,11776,11776,11776,11776,
+ 11776,11776,11776,11776,11776,11776,11776,11777,11777,11777,
+ 11777,11777,11777,11777,11777,11777,11777,11777,11777,11778,
+ 11778,11778,11778,11778,11778,11778,11778,11778,11778,11778,
+ 11778,11779,11779,11779,11779,11779,11779,11779,11779,11779,
+ 11779,11779,11779,11780,11780,11780,11780,11780,11780,11780,
+ 11780,11780,11780,11780,11780,11781,11781,11781,11781,11781,
+ 11781,11781,11781,11781,11781,11781,11781,11782,11782,11782,
+ 11782,11782,11782,11782,11782,11782,11782,11782,11782,11783,
+
+ 11783,11783,11783,11783,11783,11783,11783,11783,11783,11783,
+ 11783,11784,11784,11784,11784,11784,11784,11784,11784,11784,
+ 11784,11784,11784,11785,11785,11785,11785,11785,11785,11785,
+ 11785,11785,11785,11785,11785,11786,11786,11786,11786,11786,
+ 11786,11786,11786,11786,11786,11786,11786,11787,11787,11787,
+ 11787,11787,11787,11787,11787,11787,11787,11787,11787,11788,
+ 11788,11788,11788,11788,11788,11788,11788,11788,11788,11788,
+ 11788,11789,11789,11789,11789,11789,11789,11789,11789,11789,
+ 11789,11789,11789,11790,11790,11790,11790,11790,11790,11790,
+ 11790,11790,11790,11790,11790,11791,11791,11791,11791,11791,
+
+ 11791,11791,11791,11791,11791,11791,11791,11792,11792,11792,
+ 11792,11792,11792,11792,11792,11792,11792,11792,11792,11793,
+ 11793,11793,11793,11793,11793,11793,11793,11793,11793,11793,
+ 11793,11794,11794,11794,11794,11794,11794,11794,11794,11794,
+ 11794,11794,11794,11795,11795,11795,11795,11795,11795,11795,
+ 11795,11795,11795,11795,11795,11796,11796,11796,11796,11796,
+ 11796,11796,11796,11796,11796,11796,11796,11797,11797,11797,
+ 11797,11797,11797,11797,11797,11797,11797,11797,11797,11798,
+ 11798,11798,11798,11798,11798,11798,11798,11798,11798,11798,
+ 11798,11799,11799,11799,11799,11799,11799,11799,11799,11799,
+
+ 11799,11799,11799,11800,11800,11800,11800,11800,11800,11800,
+ 11800,11800,11800,11800,11800,11801,11801,11801,11801,11801,
+ 11801,11801,11801,11801,11801,11801,11801,11802,11802,11802,
+ 11802,11802,11802,11802,11802,11802,11802,11802,11802,11803,
+ 11803,11803,11803,11803,11803,11803,11803,11803,11803,11803,
+ 11803,11804,11804,11804,11804,11804,11804,11804,11804,11804,
+ 11804,11804,11804,11805,11805,11805,11805,11805,11805,11805,
+ 11805,11805,11805,11805,11805,11806,11806,11806,11806,11806,
+ 11806,11806,11806,11806,11806,11806,11806,11807,11807,11807,
+ 11807,11807,11807,11807,11807,11807,11807,11807,11807,11808,
+
+ 11808,11808,11808,11808,11808,11808,11808,11808,11808,11808,
+ 11808,11809,11809,11809,11809,11809,11809,11809,11809,11809,
+ 11809,11809,11809,11810,11810,11810,11810,11810,11810,11810,
+ 11810,11810,11810,11810,11810,11811,11811,11811,11811,11811,
+ 11811,11811,11811,11811,11811,11811,11811,11812,11812,11812,
+ 11812,11812,11812,11812,11812,11812,11812,11812,11812,11813,
+ 11813,11813,11813,11813,11813,11813,11813,11813,11813,11813,
+ 11813,11814,11814,11814,11814,11814,11814,11814,11814,11814,
+ 11814,11814,11814,11815,11815,11815,11815,11815,11815,11815,
+ 11815,11815,11815,11815,11815,11816,11816,11816,11816,11816,
+
+ 11816,11816,11816,11816,11816,11816,11816,11817,11817,11817,
+ 11817,11817,11817,11817,11817,11817,11817,11817,11817,11818,
+ 11818,11818,11818,11818,11818,11818,11818,11818,11818,11818,
+ 11818,11819,11819,11819,11819,11819,11819,11819,11819,11819,
+ 11819,11819,11819,11820,11820,11820,11820,11820,11820,11820,
+ 11820,11820,11820,11820,11820,11821,11821,11821,11821,11821,
+ 11821,11821,11821,11821,11821,11821,11821,11822,11822,11822,
+ 11822,11822,11822,11822,11822,11822,11822,11822,11822,11823,
+ 11823,11823,11823,11823,11823,11823,11823,11823,11823,11823,
+ 11823,11824,11824,11824,11824,11824,11824,11824,11824,11824,
+
+ 11824,11824,11824,11825,11825,11825,11825,11825,11825,11825,
+ 11825,11825,11825,11825,11825,11826,11826,11826,11826,11826,
+ 11826,11826,11826,11826,11826,11826,11826,11827,11827,11827,
+ 11827,11827,11827,11827,11827,11827,11827,11827,11827,11828,
+ 11828,11828,11828,11828,11828,11828,11828,11828,11828,11828,
+ 11828,11829,11829,11829,11829,11829,11829,11829,11829,11829,
+ 11829,11829,11829,11830,11830,11830,11830,11830,11830,11830,
+ 11830,11830,11830,11830,11830,11831,11831,11831,11831,11831,
+ 11831,11831,11831,11831,11831,11831,11831,11832,11832,11832,
+ 11832,11832,11832,11832,11832,11832,11832,11832,11832,11833,
+
+ 11833,11833,11833,11833,11833,11833,11833,11833,11833,11833,
+ 11833,11834,11834,11834,11834,11834,11834,11834,11834,11834,
+ 11834,11834,11834,11835,11835,11835,11835,11835,11835,11835,
+ 11835,11835,11835,11835,11835,11836,11836,11836,11836,11836,
+ 11836,11836,11836,11836,11836,11836,11836,11837,11837,11837,
+ 11837,11837,11837,11837,11837,11837,11837,11837,11837,11838,
+ 11838,11838,11838,11838,11838,11838,11838,11838,11838,11838,
+ 11838,11839,11839,11839,11839,11839,11839,11839,11839,11839,
+ 11839,11839,11839,11840,11840,11840,11840,11840,11840,11840,
+ 11840,11840,11840,11840,11840,11841,11841,11841,11841,11841,
+
+ 11841,11841,11841,11841,11841,11841,11841,11842,11842,11842,
+ 11842,11842,11842,11842,11842,11842,11842,11842,11842,11843,
+ 11843,11843,11843,11843,11843,11843,11843,11843,11843,11843,
+ 11843,11844,11844,11844,11844,11844,11844,11844,11844,11844,
+ 11844,11844,11844,11845,11845,11845,11845,11845,11845,11845,
+ 11845,11845,11845,11845,11845,11846,11846,11846,11846,11846,
+ 11846,11846,11846,11846,11846,11846,11846,11847,11847,11847,
+ 11847,11847,11847,11847,11847,11847,11847,11847,11847,11848,
+ 11848,11848,11848,11848,11848,11848,11848,11848,11848,11848,
+ 11848,11849,11849,11849,11849,11849,11849,11849,11849,11849,
+
+ 11849,11849,11849,11850,11850,11850,11850,11850,11850,11850,
+ 11850,11850,11850,11850,11850,11851,11851,11851,11851,11851,
+ 11851,11851,11851,11851,11851,11851,11851,11852,11852,11852,
+ 11852,11852,11852,11852,11852,11852,11852,11852,11852,11853,
+ 11853,11853,11853,11853,11853,11853,11853,11853,11853,11853,
+ 11853,11854,11854,11854,11854,11854,11854,11854,11854,11854,
+ 11854,11854,11854,11855,11855,11855,11855,11855,11855,11855,
+ 11855,11855,11855,11855,11855,11856,11856,11856,11856,11856,
+ 11856,11856,11856,11856,11856,11856,11856,11857,11857,11857,
+ 11857,11857,11857,11857,11857,11857,11857,11857,11857,11858,
+
+ 11858,11858,11858,11858,11858,11858,11858,11858,11858,11858,
+ 11858,11859,11859,11859,11859,11859,11859,11859,11859,11859,
+ 11859,11859,11859,11860,11860,11860,11860,11860,11860,11860,
+ 11860,11860,11860,11860,11860,11861,11861,11861,11861,11861,
+ 11861,11861,11861,11861,11861,11861,11861,11862,11862,11862,
+ 11862,11862,11862,11862,11862,11862,11862,11862,11862,11863,
+ 11863,11863,11863,11863,11863,11863,11863,11863,11863,11863,
+ 11863,11864,11864,11864,11864,11864,11864,11864,11864,11864,
+ 11864,11864,11864,11865,11865,11865,11865,11865,11865,11865,
+ 11865,11865,11865,11865,11865,11866,11866,11866,11866,11866,
+
+ 11866,11866,11866,11866,11866,11866,11866,11867,11867,11867,
+ 11867,11867,11867,11867,11867,11867,11867,11867,11867,11868,
+ 11868,11868,11868,11868,11868,11868,11868,11868,11868,11868,
+ 11868,11869,11869,11869,11869,11869,11869,11869,11869,11869,
+ 11869,11869,11869,11870,11870,11870,11870,11870,11870,11870,
+ 11870,11870,11870,11870,11870,11871,11871,11871,11871,11871,
+ 11871,11871,11871,11871,11871,11871,11871,11872,11872,11872,
+ 11872,11872,11872,11872,11872,11872,11872,11872,11872,11873,
+ 11873,11873,11873,11873,11873,11873,11873,11873,11873,11873,
+ 11873,11874,11874,11874,11874,11874,11874,11874,11874,11874,
+
+ 11874,11874,11874,11875,11875,11875,11875,11875,11875,11875,
+ 11875,11875,11875,11875,11875,11876,11876,11876,11876,11876,
+ 11876,11876,11876,11876,11876,11876,11876,11877,11877,11877,
+ 11877,11877,11877,11877,11877,11877,11877,11877,11877,11878,
+ 11878,11878,11878,11878,11878,11878,11878,11878,11878,11878,
+ 11878,11879,11879,11879,11879,11879,11879,11879,11879,11879,
+ 11879,11879,11879,11880,11880,11880,11880,11880,11880,11880,
+ 11880,11880,11880,11880,11880,11881,11881,11881,11881,11881,
+ 11881,11881,11881,11881,11881,11881,11881,11882,11882,11882,
+ 11882,11882,11882,11882,11882,11882,11882,11882,11882,11883,
+
+ 11883,11883,11883,11883,11883,11883,11883,11883,11883,11883,
+ 11883,11884,11884,11884,11884,11884,11884,11884,11884,11884,
+ 11884,11884,11884,11885,11885,11885,11885,11885,11885,11885,
+ 11885,11885,11885,11885,11885,11886,11886,11886,11886,11886,
+ 11886,11886,11886,11886,11886,11886,11886,11887,11887,11887,
+ 11887,11887,11887,11887,11887,11887,11887,11887,11887,11888,
+ 11888,11888,11888,11888,11888,11888,11888,11888,11888,11888,
+ 11888,11889,11889,11889,11889,11889,11889,11889,11889,11889,
+ 11889,11889,11889,11890,11890,11890,11890,11890,11890,11890,
+ 11890,11890,11890,11890,11890,11891,11891,11891,11891,11891,
+
+ 11891,11891,11891,11891,11891,11891,11891,11892,11892,11892,
+ 11892,11892,11892,11892,11892,11892,11892,11892,11892,11893,
+ 11893,11893,11893,11893,11893,11893,11893,11893,11893,11893,
+ 11893,11894,11894,11894,11894,11894,11894,11894,11894,11894,
+ 11894,11894,11894,11895,11895,11895,11895,11895,11895,11895,
+ 11895,11895,11895,11895,11895,11896,11896,11896,11896,11896,
+ 11896,11896,11896,11896,11896,11896,11896,11897,11897,11897,
+ 11897,11897,11897,11897,11897,11897,11897,11897,11897,11898,
+ 11898,11898,11898,11898,11898,11898,11898,11898,11898,11898,
+ 11898,11899,11899,11899,11899,11899,11899,11899,11899,11899,
+
+ 11899,11899,11899,11900,11900,11900,11900,11900,11900,11900,
+ 11900,11900,11900,11900,11900,11901,11901,11901,11901,11901,
+ 11901,11901,11901,11901,11901,11901,11901,11902,11902,11902,
+ 11902,11902,11902,11902,11902,11902,11902,11902,11902,11903,
+ 11903,11903,11903,11903,11903,11903,11903,11903,11903,11903,
+ 11903,11904,11904,11904,11904,11904,11904,11904,11904,11904,
+ 11904,11904,11904,11905,11905,11905,11905,11905,11905,11905,
+ 11905,11905,11905,11905,11905,11906,11906,11906,11906,11906,
+ 11906,11906,11906,11906,11906,11906,11906,11907,11907,11907,
+ 11907,11907,11907,11907,11907,11907,11907,11907,11907,11908,
+
+ 11908,11908,11908,11908,11908,11908,11908,11908,11908,11908,
+ 11908,11909,11909,11909,11909,11909,11909,11909,11909,11909,
+ 11909,11909,11909,11910,11910,11910,11910,11910,11910,11910,
+ 11910,11910,11910,11910,11910,11911,11911,11911,11911,11911,
+ 11911,11911,11911,11911,11911,11911,11911,11912,11912,11912,
+ 11912,11912,11912,11912,11912,11912,11912,11912,11912,11913,
+ 11913,11913,11913,11913,11913,11913,11913,11913,11913,11913,
+ 11913,11914,11914,11914,11914,11914,11914,11914,11914,11914,
+ 11914,11914,11914,11915,11915,11915,11915,11915,11915,11915,
+ 11915,11915,11915,11915,11915,11916,11916,11916,11916,11916,
+
+ 11916,11916,11916,11916,11916,11916,11916,11917,11917,11917,
+ 11917,11917,11917,11917,11917,11917,11917,11917,11917,11918,
+ 11918,11918,11918,11918,11918,11918,11918,11918,11918,11918,
+ 11918,11919,11919,11919,11919,11919,11919,11919,11919,11919,
+ 11919,11919,11919,11920,11920,11920,11920,11920,11920,11920,
+ 11920,11920,11920,11920,11920,11921,11921,11921,11921,11921,
+ 11921,11921,11921,11921,11921,11921,11921,11922,11922,11922,
+ 11922,11922,11922,11922,11922,11922,11922,11922,11922,11923,
+ 11923,11923,11923,11923,11923,11923,11923,11923,11923,11923,
+ 11923,11924,11924,11924,11924,11924,11924,11924,11924,11924,
+
+ 11924,11924,11924,11925,11925,11925,11925,11925,11925,11925,
+ 11925,11925,11925,11925,11925,11926,11926,11926,11926,11926,
+ 11926,11926,11926,11926,11926,11926,11926,11927,11927,11927,
+ 11927,11927,11927,11927,11927,11927,11927,11927,11927,11928,
+ 11928,11928,11928,11928,11928,11928,11928,11928,11928,11928,
+ 11928,11929,11929,11929,11929,11929,11929,11929,11929,11929,
+ 11929,11929,11929,11930,11930,11930,11930,11930,11930,11930,
+ 11930,11930,11930,11930,11930,11931,11931,11931,11931,11931,
+ 11931,11931,11931,11931,11931,11931,11931,11932,11932,11932,
+ 11932,11932,11932,11932,11932,11932,11932,11932,11932,11933,
+
+ 11933,11933,11933,11933,11933,11933,11933,11933,11933,11933,
+ 11933,11934,11934,11934,11934,11934,11934,11934,11934,11934,
+ 11934,11934,11934,11935,11935,11935,11935,11935,11935,11935,
+ 11935,11935,11935,11935,11935,11936,11936,11936,11936,11936,
+ 11936,11936,11936,11936,11936,11936,11936,11937,11937,11937,
+ 11937,11937,11937,11937,11937,11937,11937,11937,11937,11938,
+ 11938,11938,11938,11938,11938,11938,11938,11938,11938,11938,
+ 11938,11939,11939,11939,11939,11939,11939,11939,11939,11939,
+ 11939,11939,11939,11940,11940,11940,11940,11940,11940,11940,
+ 11940,11940,11940,11940,11940,11941,11941,11941,11941,11941,
+
+ 11941,11941,11941,11941,11941,11941,11941,11942,11942,11942,
+ 11942,11942,11942,11942,11942,11942,11942,11942,11942,11943,
+ 11943,11943,11943,11943,11943,11943,11943,11943,11943,11943,
+ 11943,11944,11944,11944,11944,11944,11944,11944,11944,11944,
+ 11944,11944,11944,11945,11945,11945,11945,11945,11945,11945,
+ 11945,11945,11945,11945,11945,11946,11946,11946,11946,11946,
+ 11946,11946,11946,11946,11946,11946,11946,11947,11947,11947,
+ 11947,11947,11947,11947,11947,11947,11947,11947,11947,11948,
+ 11948,11948,11948,11948,11948,11948,11948,11948,11948,11948,
+ 11948,11949,11949,11949,11949,11949,11949,11949,11949,11949,
+
+ 11949,11949,11949,11950,11950,11950,11950,11950,11950,11950,
+ 11950,11950,11950,11950,11950,11951,11951,11951,11951,11951,
+ 11951,11951,11951,11951,11951,11951,11951,11952,11952,11952,
+ 11952,11952,11952,11952,11952,11952,11952,11952,11952,11953,
+ 11953,11953,11953,11953,11953,11953,11953,11953,11953,11953,
+ 11953,11954,11954,11954,11954,11954,11954,11954,11954,11954,
+ 11954,11954,11954,11955,11955,11955,11955,11955,11955,11955,
+ 11955,11955,11955,11955,11955,11956,11956,11956,11956,11956,
+ 11956,11956,11956,11956,11956,11956,11956,11957,11957,11957,
+ 11957,11957,11957,11957,11957,11957,11957,11957,11957,11958,
+
+ 11958,11958,11958,11958,11958,11958,11958,11958,11958,11958,
+ 11958,11959,11959,11959,11959,11959,11959,11959,11959,11959,
+ 11959,11959,11959,11960,11960,11960,11960,11960,11960,11960,
+ 11960,11960,11960,11960,11960,11961,11961,11961,11961,11961,
+ 11961,11961,11961,11961,11961,11961,11961,11962,11962,11962,
+ 11962,11962,11962,11962,11962,11962,11962,11962,11962,11963,
+ 11963,11963,11963,11963,11963,11963,11963,11963,11963,11963,
+ 11963,11964,11964,11964,11964,11964,11964,11964,11964,11964,
+ 11964,11964,11964,11965,11965,11965,11965,11965,11965,11965,
+ 11965,11965,11965,11965,11965,11966,11966,11966,11966,11966,
+
+ 11966,11966,11966,11966,11966,11966,11966,11967,11967,11967,
+ 11967,11967,11967,11967,11967,11967,11967,11967,11967,11968,
+ 11968,11968,11968,11968,11968,11968,11968,11968,11968,11968,
+ 11968,11969,11969,11969,11969,11969,11969,11969,11969,11969,
+ 11969,11969,11969,11970,11970,11970,11970,11970,11970,11970,
+ 11970,11970,11970,11970,11970,11971,11971,11971,11971,11971,
+ 11971,11971,11971,11971,11971,11971,11971,11972,11972,11972,
+ 11972,11972,11972,11972,11972,11972,11972,11972,11972,11973,
+ 11973,11973,11973,11973,11973,11973,11973,11973,11973,11973,
+ 11973,11974,11974,11974,11974,11974,11974,11974,11974,11974,
+
+ 11974,11974,11974,11975,11975,11975,11975,11975,11975,11975,
+ 11975,11975,11975,11975,11975,11976,11976,11976,11976,11976,
+ 11976,11976,11976,11976,11976,11976,11976,11977,11977,11977,
+ 11977,11977,11977,11977,11977,11977,11977,11977,11977,11978,
+ 11978,11978,11978,11978,11978,11978,11978,11978,11978,11978,
+ 11978,11979,11979,11979,11979,11979,11979,11979,11979,11979,
+ 11979,11979,11979,11980,11980,11980,11980,11980,11980,11980,
+ 11980,11980,11980,11980,11980,11981,11981,11981,11981,11981,
+ 11981,11981,11981,11981,11981,11981,11981,11982,11982,11982,
+ 11982,11982,11982,11982,11982,11982,11982,11982,11982,11983,
+
+ 11983,11983,11983,11983,11983,11983,11983,11983,11983,11983,
+ 11983,11984,11984,11984,11984,11984,11984,11984,11984,11984,
+ 11984,11984,11984,11985,11985,11985,11985,11985,11985,11985,
+ 11985,11985,11985,11985,11985,11986,11986,11986,11986,11986,
+ 11986,11986,11986,11986,11986,11986,11986,11987,11987,11987,
+ 11987,11987,11987,11987,11987,11987,11987,11987,11987,11988,
+ 11988,11988,11988,11988,11988,11988,11988,11988,11988,11988,
+ 11988,11989,11989,11989,11989,11989,11989,11989,11989,11989,
+ 11989,11989,11989,11990,11990,11990,11990,11990,11990,11990,
+ 11990,11990,11990,11990,11990,11991,11991,11991,11991,11991,
+
+ 11991,11991,11991,11991,11991,11991,11991,11992,11992,11992,
+ 11992,11992,11992,11992,11992,11992,11992,11992,11992,11993,
+ 11993,11993,11993,11993,11993,11993,11993,11993,11993,11993,
+ 11993,11994,11994,11994,11994,11994,11994,11994,11994,11994,
+ 11994,11994,11994,11995,11995,11995,11995,11995,11995,11995,
+ 11995,11995,11995,11995,11995,11996,11996,11996,11996,11996,
+ 11996,11996,11996,11996,11996,11996,11996,11997,11997,11997,
+ 11997,11997,11997,11997,11997,11997,11997,11997,11997,11998,
+ 11998,11998,11998,11998,11998,11998,11998,11998,11998,11998,
+ 11998,11999,11999,11999,11999,11999,11999,11999,11999,11999,
+
+ 11999,11999,11999,12000,12000,12000,12000,12000,12000,12000,
+ 12000,12000,12000,12000,12000,12001,12001,12001,12001,12001,
+ 12001,12001,12001,12001,12001,12001,12001,12002,12002,12002,
+ 12002,12002,12002,12002,12002,12002,12002,12002,12002,12003,
+ 12003,12003,12003,12003,12003,12003,12003,12003,12003,12003,
+ 12003,12004,12004,12004,12004,12004,12004,12004,12004,12004,
+ 12004,12004,12004,12005,12005,12005,12005,12005,12005,12005,
+ 12005,12005,12005,12005,12005,12006,12006,12006,12006,12006,
+ 12006,12006,12006,12006,12006,12006,12006,12007,12007,12007,
+ 12007,12007,12007,12007,12007,12007,12007,12007,12007,12008,
+
+ 12008,12008,12008,12008,12008,12008,12008,12008,12008,12008,
+ 12008,12009,12009,12009,12009,12009,12009,12009,12009,12009,
+ 12009,12009,12009,12010,12010,12010,12010,12010,12010,12010,
+ 12010,12010,12010,12010,12010,12011,12011,12011,12011,12011,
+ 12011,12011,12011,12011,12011,12011,12011,12012,12012,12012,
+ 12012,12012,12012,12012,12012,12012,12012,12012,12012,12013,
+ 12013,12013,12013,12013,12013,12013,12013,12013,12013,12013,
+ 12013,12014,12014,12014,12014,12014,12014,12014,12014,12014,
+ 12014,12014,12014,12015,12015,12015,12015,12015,12015,12015,
+ 12015,12015,12015,12015,12015,12016,12016,12016,12016,12016,
+
+ 12016,12016,12016,12016,12016,12016,12016,12017,12017,12017,
+ 12017,12017,12017,12017,12017,12017,12017,12017,12017,12018,
+ 12018,12018,12018,12018,12018,12018,12018,12018,12018,12018,
+ 12018,12019,12019,12019,12019,12019,12019,12019,12019,12019,
+ 12019,12019,12019,12020,12020,12020,12020,12020,12020,12020,
+ 12020,12020,12020,12020,12020,12021,12021,12021,12021,12021,
+ 12021,12021,12021,12021,12021,12021,12021,12022,12022,12022,
+ 12022,12022,12022,12022,12022,12022,12022,12022,12022,12023,
+ 12023,12023,12023,12023,12023,12023,12023,12023,12023,12023,
+ 12023,12024,12024,12024,12024,12024,12024,12024,12024,12024,
+
+ 12024,12024,12024,12025,12025,12025,12025,12025,12025,12025,
+ 12025,12025,12025,12025,12025,12026,12026,12026,12026,12026,
+ 12026,12026,12026,12026,12026,12026,12026,12027,12027,12027,
+ 12027,12027,12027,12027,12027,12027,12027,12027,12027,12028,
+ 12028,12028,12028,12028,12028,12028,12028,12028,12028,12028,
+ 12028,12029,12029,12029,12029,12029,12029,12029,12029,12029,
+ 12029,12029,12029,12030,12030,12030,12030,12030,12030,12030,
+ 12030,12030,12030,12030,12030,12031,12031,12031,12031,12031,
+ 12031,12031,12031,12031,12031,12031,12031,12032,12032,12032,
+ 12032,12032,12032,12032,12032,12032,12032,12032,12032,12033,
+
+ 12033,12033,12033,12033,12033,12033,12033,12033,12033,12033,
+ 12033,12034,12034,12034,12034,12034,12034,12034,12034,12034,
+ 12034,12034,12034,12035,12035,12035,12035,12035,12035,12035,
+ 12035,12035,12035,12035,12035,12036,12036,12036,12036,12036,
+ 12036,12036,12036,12036,12036,12036,12036,12037,12037,12037,
+ 12037,12037,12037,12037,12037,12037,12037,12037,12037,12038,
+ 12038,12038,12038,12038,12038,12038,12038,12038,12038,12038,
+ 12038,12039,12039,12039,12039,12039,12039,12039,12039,12039,
+ 12039,12039,12039,12040,12040,12040,12040,12040,12040,12040,
+ 12040,12040,12040,12040,12040,12041,12041,12041,12041,12041,
+
+ 12041,12041,12041,12041,12041,12041,12041,12042,12042,12042,
+ 12042,12042,12042,12042,12042,12042,12042,12042,12042,12043,
+ 12043,12043,12043,12043,12043,12043,12043,12043,12043,12043,
+ 12043,12044,12044,12044,12044,12044,12044,12044,12044,12044,
+ 12044,12044,12044,12045,12045,12045,12045,12045,12045,12045,
+ 12045,12045,12045,12045,12045,12046,12046,12046,12046,12046,
+ 12046,12046,12046,12046,12046,12046,12046,12047,12047,12047,
+ 12047,12047,12047,12047,12047,12047,12047,12047,12047,12048,
+ 12048,12048,12048,12048,12048,12048,12048,12048,12048,12048,
+ 12048,12049,12049,12049,12049,12049,12049,12049,12049,12049,
+
+ 12049,12049,12049,12050,12050,12050,12050,12050,12050,12050,
+ 12050,12050,12050,12050,12050,12051,12051,12051,12051,12051,
+ 12051,12051,12051,12051,12051,12051,12051,12052,12052,12052,
+ 12052,12052,12052,12052,12052,12052,12052,12052,12052,12053,
+ 12053,12053,12053,12053,12053,12053,12053,12053,12053,12053,
+ 12053,12054,12054,12054,12054,12054,12054,12054,12054,12054,
+ 12054,12054,12054,12055,12055,12055,12055,12055,12055,12055,
+ 12055,12055,12055,12055,12055,12056,12056,12056,12056,12056,
+ 12056,12056,12056,12056,12056,12056,12056,12057,12057,12057,
+ 12057,12057,12057,12057,12057,12057,12057,12057,12057,12058,
+
+ 12058,12058,12058,12058,12058,12058,12058,12058,12058,12058,
+ 12058,12059,12059,12059,12059,12059,12059,12059,12059,12059,
+ 12059,12059,12059,12060,12060,12060,12060,12060,12060,12060,
+ 12060,12060,12060,12060,12060,12061,12061,12061,12061,12061,
+ 12061,12061,12061,12061,12061,12061,12061,12062,12062,12062,
+ 12062,12062,12062,12062,12062,12062,12062,12062,12062,12063,
+ 12063,12063,12063,12063,12063,12063,12063,12063,12063,12063,
+ 12063,12064,12064,12064,12064,12064,12064,12064,12064,12064,
+ 12064,12064,12064,12065,12065,12065,12065,12065,12065,12065,
+ 12065,12065,12065,12065,12065,12066,12066,12066,12066,12066,
+
+ 12066,12066,12066,12066,12066,12066,12066,12067,12067,12067,
+ 12067,12067,12067,12067,12067,12067,12067,12067,12067,12068,
+ 12068,12068,12068,12068,12068,12068,12068,12068,12068,12068,
+ 12068,12069,12069,12069,12069,12069,12069,12069,12069,12069,
+ 12069,12069,12069,12070,12070,12070,12070,12070,12070,12070,
+ 12070,12070,12070,12070,12070,12071,12071,12071,12071,12071,
+ 12071,12071,12071,12071,12071,12071,12071,12072,12072,12072,
+ 12072,12072,12072,12072,12072,12072,12072,12072,12072,12073,
+ 12073,12073,12073,12073,12073,12073,12073,12073,12073,12073,
+ 12073,12074,12074,12074,12074,12074,12074,12074,12074,12074,
+
+ 12074,12074,12074,12075,12075,12075,12075,12075,12075,12075,
+ 12075,12075,12075,12075,12075,12076,12076,12076,12076,12076,
+ 12076,12076,12076,12076,12076,12076,12076,12077,12077,12077,
+ 12077,12077,12077,12077,12077,12077,12077,12077,12077,12078,
+ 12078,12078,12078,12078,12078,12078,12078,12078,12078,12078,
+ 12078,12079,12079,12079,12079,12079,12079,12079,12079,12079,
+ 12079,12079,12079,12080,12080,12080,12080,12080,12080,12080,
+ 12080,12080,12080,12080,12080,12081,12081,12081,12081,12081,
+ 12081,12081,12081,12081,12081,12081,12081,12082,12082,12082,
+ 12082,12082,12082,12082,12082,12082,12082,12082,12082,12083,
+
+ 12083,12083,12083,12083,12083,12083,12083,12083,12083,12083,
+ 12083,12084,12084,12084,12084,12084,12084,12084,12084,12084,
+ 12084,12084,12084,12085,12085,12085,12085,12085,12085,12085,
+ 12085,12085,12085,12085,12085,12086,12086,12086,12086,12086,
+ 12086,12086,12086,12086,12086,12086,12086,12087,12087,12087,
+ 12087,12087,12087,12087,12087,12087,12087,12087,12087,12088,
+ 12088,12088,12088,12088,12088,12088,12088,12088,12088,12088,
+ 12088,12089,12089,12089,12089,12089,12089,12089,12089,12089,
+ 12089,12089,12089,12090,12090,12090,12090,12090,12090,12090,
+ 12090,12090,12090,12090,12090,12091,12091,12091,12091,12091,
+
+ 12091,12091,12091,12091,12091,12091,12091,12092,12092,12092,
+ 12092,12092,12092,12092,12092,12092,12092,12092,12092,12093,
+ 12093,12093,12093,12093,12093,12093,12093,12093,12093,12093,
+ 12093,12094,12094,12094,12094,12094,12094,12094,12094,12094,
+ 12094,12094,12094,12095,12095,12095,12095,12095,12095,12095,
+ 12095,12095,12095,12095,12095,12096,12096,12096,12096,12096,
+ 12096,12096,12096,12096,12096,12096,12096,12097,12097,12097,
+ 12097,12097,12097,12097,12097,12097,12097,12097,12097,12098,
+ 12098,12098,12098,12098,12098,12098,12098,12098,12098,12098,
+ 12098,12099,12099,12099,12099,12099,12099,12099,12099,12099,
+
+ 12099,12099,12099,12100,12100,12100,12100,12100,12100,12100,
+ 12100,12100,12100,12100,12100,12101,12101,12101,12101,12101,
+ 12101,12101,12101,12101,12101,12101,12101,12102,12102,12102,
+ 12102,12102,12102,12102,12102,12102,12102,12102,12102,12103,
+ 12103,12103,12103,12103,12103,12103,12103,12103,12103,12103,
+ 12103,12104,12104,12104,12104,12104,12104,12104,12104,12104,
+ 12104,12104,12104,12105,12105,12105,12105,12105,12105,12105,
+ 12105,12105,12105,12105,12105,12106,12106,12106,12106,12106,
+ 12106,12106,12106,12106,12106,12106,12106,12107,12107,12107,
+ 12107,12107,12107,12107,12107,12107,12107,12107,12107,12108,
+
+ 12108,12108,12108,12108,12108,12108,12108,12108,12108,12108,
+ 12108,12109,12109,12109,12109,12109,12109,12109,12109,12109,
+ 12109,12109,12109,12110,12110,12110,12110,12110,12110,12110,
+ 12110,12110,12110,12110,12110,12111,12111,12111,12111,12111,
+ 12111,12111,12111,12111,12111,12111,12111,12112,12112,12112,
+ 12112,12112,12112,12112,12112,12112,12112,12112,12112,12113,
+ 12113,12113,12113,12113,12113,12113,12113,12113,12113,12113,
+ 12113,12114,12114,12114,12114,12114,12114,12114,12114,12114,
+ 12114,12114,12114,12115,12115,12115,12115,12115,12115,12115,
+ 12115,12115,12115,12115,12115,12116,12116,12116,12116,12116,
+
+ 12116,12116,12116,12116,12116,12116,12116,12117,12117,12117,
+ 12117,12117,12117,12117,12117,12117,12117,12117,12117,12118,
+ 12118,12118,12118,12118,12118,12118,12118,12118,12118,12118,
+ 12118,12119,12119,12119,12119,12119,12119,12119,12119,12119,
+ 12119,12119,12119,12120,12120,12120,12120,12120,12120,12120,
+ 12120,12120,12120,12120,12120,12121,12121,12121,12121,12121,
+ 12121,12121,12121,12121,12121,12121,12121,12122,12122,12122,
+ 12122,12122,12122,12122,12122,12122,12122,12122,12122,12123,
+ 12123,12123,12123,12123,12123,12123,12123,12123,12123,12123,
+ 12123,12124,12124,12124,12124,12124,12124,12124,12124,12124,
+
+ 12124,12124,12124,12125,12125,12125,12125,12125,12125,12125,
+ 12125,12125,12125,12125,12125,12126,12126,12126,12126,12126,
+ 12126,12126,12126,12126,12126,12126,12126,12127,12127,12127,
+ 12127,12127,12127,12127,12127,12127,12127,12127,12127,12128,
+ 12128,12128,12128,12128,12128,12128,12128,12128,12128,12128,
+ 12128,12129,12129,12129,12129,12129,12129,12129,12129,12129,
+ 12129,12129,12129,12130,12130,12130,12130,12130,12130,12130,
+ 12130,12130,12130,12130,12130,12131,12131,12131,12131,12131,
+ 12131,12131,12131,12131,12131,12131,12131,12132,12132,12132,
+ 12132,12132,12132,12132,12132,12132,12132,12132,12132,12133,
+
+ 12133,12133,12133,12133,12133,12133,12133,12133,12133,12133,
+ 12133,12134,12134,12134,12134,12134,12134,12134,12134,12134,
+ 12134,12134,12134,12135,12135,12135,12135,12135,12135,12135,
+ 12135,12135,12135,12135,12135,12136,12136,12136,12136,12136,
+ 12136,12136,12136,12136,12136,12136,12136,12137,12137,12137,
+ 12137,12137,12137,12137,12137,12137,12137,12137,12137,12138,
+ 12138,12138,12138,12138,12138,12138,12138,12138,12138,12138,
+ 12138,12139,12139,12139,12139,12139,12139,12139,12139,12139,
+ 12139,12139,12139,12140,12140,12140,12140,12140,12140,12140,
+ 12140,12140,12140,12140,12140,12141,12141,12141,12141,12141,
+
+ 12141,12141,12141,12141,12141,12141,12141,12142,12142,12142,
+ 12142,12142,12142,12142,12142,12142,12142,12142,12142,12143,
+ 12143,12143,12143,12143,12143,12143,12143,12143,12143,12143,
+ 12143,12144,12144,12144,12144,12144,12144,12144,12144,12144,
+ 12144,12144,12144,12145,12145,12145,12145,12145,12145,12145,
+ 12145,12145,12145,12145,12145,12146,12146,12146,12146,12146,
+ 12146,12146,12146,12146,12146,12146,12146,12147,12147,12147,
+ 12147,12147,12147,12147,12147,12147,12147,12147,12147,12148,
+ 12148,12148,12148,12148,12148,12148,12148,12148,12148,12148,
+ 12148,12149,12149,12149,12149,12149,12149,12149,12149,12149,
+
+ 12149,12149,12149,12150,12150,12150,12150,12150,12150,12150,
+ 12150,12150,12150,12150,12150,12151,12151,12151,12151,12151,
+ 12151,12151,12151,12151,12151,12151,12151,12152,12152,12152,
+ 12152,12152,12152,12152,12152,12152,12152,12152,12152,12153,
+ 12153,12153,12153,12153,12153,12153,12153,12153,12153,12153,
+ 12153,12154,12154,12154,12154,12154,12154,12154,12154,12154,
+ 12154,12154,12154,12155,12155,12155,12155,12155,12155,12155,
+ 12155,12155,12155,12155,12155,12156,12156,12156,12156,12156,
+ 12156,12156,12156,12156,12156,12156,12156,12157,12157,12157,
+ 12157,12157,12157,12157,12157,12157,12157,12157,12157,12158,
+
+ 12158,12158,12158,12158,12158,12158,12158,12158,12158,12158,
+ 12158,12159,12159,12159,12159,12159,12159,12159,12159,12159,
+ 12159,12159,12159,12160,12160,12160,12160,12160,12160,12160,
+ 12160,12160,12160,12160,12160,12161,12161,12161,12161,12161,
+ 12161,12161,12161,12161,12161,12161,12161,12162,12162,12162,
+ 12162,12162,12162,12162,12162,12162,12162,12162,12162,12163,
+ 12163,12163,12163,12163,12163,12163,12163,12163,12163,12163,
+ 12163,12164,12164,12164,12164,12164,12164,12164,12164,12164,
+ 12164,12164,12164,12165,12165,12165,12165,12165,12165,12165,
+ 12165,12165,12165,12165,12165,12166,12166,12166,12166,12166,
+
+ 12166,12166,12166,12166,12166,12166,12166,12167,12167,12167,
+ 12167,12167,12167,12167,12167,12167,12167,12167,12167,12168,
+ 12168,12168,12168,12168,12168,12168,12168,12168,12168,12168,
+ 12168,12169,12169,12169,12169,12169,12169,12169,12169,12169,
+ 12169,12169,12169,12170,12170,12170,12170,12170,12170,12170,
+ 12170,12170,12170,12170,12170,12171,12171,12171,12171,12171,
+ 12171,12171,12171,12171,12171,12171,12171,12172,12172,12172,
+ 12172,12172,12172,12172,12172,12172,12172,12172,12172,12173,
+ 12173,12173,12173,12173,12173,12173,12173,12173,12173,12173,
+ 12173,12174,12174,12174,12174,12174,12174,12174,12174,12174,
+
+ 12174,12174,12174,12175,12175,12175,12175,12175,12175,12175,
+ 12175,12175,12175,12175,12175,12176,12176,12176,12176,12176,
+ 12176,12176,12176,12176,12176,12176,12176,12177,12177,12177,
+ 12177,12177,12177,12177,12177,12177,12177,12177,12177,12178,
+ 12178,12178,12178,12178,12178,12178,12178,12178,12178,12178,
+ 12178,12179,12179,12179,12179,12179,12179,12179,12179,12179,
+ 12179,12179,12179,12180,12180,12180,12180,12180,12180,12180,
+ 12180,12180,12180,12180,12180,12181,12181,12181,12181,12181,
+ 12181,12181,12181,12181,12181,12181,12181,12182,12182,12182,
+ 12182,12182,12182,12182,12182,12182,12182,12182,12182,12183,
+
+ 12183,12183,12183,12183,12183,12183,12183,12183,12183,12183,
+ 12183,12184,12184,12184,12184,12184,12184,12184,12184,12184,
+ 12184,12184,12184,12185,12185,12185,12185,12185,12185,12185,
+ 12185,12185,12185,12185,12185,12186,12186,12186,12186,12186,
+ 12186,12186,12186,12186,12186,12186,12186,12187,12187,12187,
+ 12187,12187,12187,12187,12187,12187,12187,12187,12187,12188,
+ 12188,12188,12188,12188,12188,12188,12188,12188,12188,12188,
+ 12188,12189,12189,12189,12189,12189,12189,12189,12189,12189,
+ 12189,12189,12189,12190,12190,12190,12190,12190,12190,12190,
+ 12190,12190,12190,12190,12190,12191,12191,12191,12191,12191,
+
+ 12191,12191,12191,12191,12191,12191,12191,12192,12192,12192,
+ 12192,12192,12192,12192,12192,12192,12192,12192,12192,12193,
+ 12193,12193,12193,12193,12193,12193,12193,12193,12193,12193,
+ 12193,12194,12194,12194,12194,12194,12194,12194,12194,12194,
+ 12194,12194,12194,12195,12195,12195,12195,12195,12195,12195,
+ 12195,12195,12195,12195,12195,12196,12196,12196,12196,12196,
+ 12196,12196,12196,12196,12196,12196,12196,12197,12197,12197,
+ 12197,12197,12197,12197,12197,12197,12197,12197,12197,12198,
+ 12198,12198,12198,12198,12198,12198,12198,12198,12198,12198,
+ 12198,12199,12199,12199,12199,12199,12199,12199,12199,12199,
+
+ 12199,12199,12199,12200,12200,12200,12200,12200,12200,12200,
+ 12200,12200,12200,12200,12200,12201,12201,12201,12201,12201,
+ 12201,12201,12201,12201,12201,12201,12201,12202,12202,12202,
+ 12202,12202,12202,12202,12202,12202,12202,12202,12202,12203,
+ 12203,12203,12203,12203,12203,12203,12203,12203,12203,12203,
+ 12203,12204,12204,12204,12204,12204,12204,12204,12204,12204,
+ 12204,12204,12204,12205,12205,12205,12205,12205,12205,12205,
+ 12205,12205,12205,12205,12205,12206,12206,12206,12206,12206,
+ 12206,12206,12206,12206,12206,12206,12206,12207,12207,12207,
+ 12207,12207,12207,12207,12207,12207,12207,12207,12207,12208,
+
+ 12208,12208,12208,12208,12208,12208,12208,12208,12208,12208,
+ 12208,12209,12209,12209,12209,12209,12209,12209,12209,12209,
+ 12209,12209,12209,12210,12210,12210,12210,12210,12210,12210,
+ 12210,12210,12210,12210,12210,12211,12211,12211,12211,12211,
+ 12211,12211,12211,12211,12211,12211,12211,12212,12212,12212,
+ 12212,12212,12212,12212,12212,12212,12212,12212,12212,12213,
+ 12213,12213,12213,12213,12213,12213,12213,12213,12213,12213,
+ 12213,12214,12214,12214,12214,12214,12214,12214,12214,12214,
+ 12214,12214,12214,12215,12215,12215,12215,12215,12215,12215,
+ 12215,12215,12215,12215,12215,12216,12216,12216,12216,12216,
+
+ 12216,12216,12216,12216,12216,12216,12216,12217,12217,12217,
+ 12217,12217,12217,12217,12217,12217,12217,12217,12217,12218,
+ 12218,12218,12218,12218,12218,12218,12218,12218,12218,12218,
+ 12218,12219,12219,12219,12219,12219,12219,12219,12219,12219,
+ 12219,12219,12219,12220,12220,12220,12220,12220,12220,12220,
+ 12220,12220,12220,12220,12220,12221,12221,12221,12221,12221,
+ 12221,12221,12221,12221,12221,12221,12221,12222,12222,12222,
+ 12222,12222,12222,12222,12222,12222,12222,12222,12222,12223,
+ 12223,12223,12223,12223,12223,12223,12223,12223,12223,12223,
+ 12223,12224,12224,12224,12224,12224,12224,12224,12224,12224,
+
+ 12224,12224,12224,12225,12225,12225,12225,12225,12225,12225,
+ 12225,12225,12225,12225,12225,12226,12226,12226,12226,12226,
+ 12226,12226,12226,12226,12226,12226,12226,12227,12227,12227,
+ 12227,12227,12227,12227,12227,12227,12227,12227,12227,12228,
+ 12228,12228,12228,12228,12228,12228,12228,12228,12228,12228,
+ 12228,12229,12229,12229,12229,12229,12229,12229,12229,12229,
+ 12229,12229,12229,12230,12230,12230,12230,12230,12230,12230,
+ 12230,12230,12230,12230,12230,12231,12231,12231,12231,12231,
+ 12231,12231,12231,12231,12231,12231,12231,12232,12232,12232,
+ 12232,12232,12232,12232,12232,12232,12232,12232,12232,12233,
+
+ 12233,12233,12233,12233,12233,12233,12233,12233,12233,12233,
+ 12233,12234,12234,12234,12234,12234,12234,12234,12234,12234,
+ 12234,12234,12234,12235,12235,12235,12235,12235,12235,12235,
+ 12235,12235,12235,12235,12235,12236,12236,12236,12236,12236,
+ 12236,12236,12236,12236,12236,12236,12236,12237,12237,12237,
+ 12237,12237,12237,12237,12237,12237,12237,12237,12237,12238,
+ 12238,12238,12238,12238,12238,12238,12238,12238,12238,12238,
+ 12238,12239,12239,12239,12239,12239,12239,12239,12239,12239,
+ 12239,12239,12239,12240,12240,12240,12240,12240,12240,12240,
+ 12240,12240,12240,12240,12240,12241,12241,12241,12241,12241,
+
+ 12241,12241,12241,12241,12241,12241,12241,12242,12242,12242,
+ 12242,12242,12242,12242,12242,12242,12242,12242,12242,12243,
+ 12243,12243,12243,12243,12243,12243,12243,12243,12243,12243,
+ 12243,12244,12244,12244,12244,12244,12244,12244,12244,12244,
+ 12244,12244,12244,12245,12245,12245,12245,12245,12245,12245,
+ 12245,12245,12245,12245,12245,12246,12246,12246,12246,12246,
+ 12246,12246,12246,12246,12246,12246,12246,12247,12247,12247,
+ 12247,12247,12247,12247,12247,12247,12247,12247,12247,12248,
+ 12248,12248,12248,12248,12248,12248,12248,12248,12248,12248,
+ 12248,12249,12249,12249,12249,12249,12249,12249,12249,12249,
+
+ 12249,12249,12249,12250,12250,12250,12250,12250,12250,12250,
+ 12250,12250,12250,12250,12250,12251,12251,12251,12251,12251,
+ 12251,12251,12251,12251,12251,12251,12251,12252,12252,12252,
+ 12252,12252,12252,12252,12252,12252,12252,12252,12252,12253,
+ 12253,12253,12253,12253,12253,12253,12253,12253,12253,12253,
+ 12253,12254,12254,12254,12254,12254,12254,12254,12254,12254,
+ 12254,12254,12254,12255,12255,12255,12255,12255,12255,12255,
+ 12255,12255,12255,12255,12255,12256,12256,12256,12256,12256,
+ 12256,12256,12256,12256,12256,12256,12256,12257,12257,12257,
+ 12257,12257,12257,12257,12257,12257,12257,12257,12257,12258,
+
+ 12258,12258,12258,12258,12258,12258,12258,12258,12258,12258,
+ 12258,12259,12259,12259,12259,12259,12259,12259,12259,12259,
+ 12259,12259,12259,12260,12260,12260,12260,12260,12260,12260,
+ 12260,12260,12260,12260,12260,12261,12261,12261,12261,12261,
+ 12261,12261,12261,12261,12261,12261,12261,12262,12262,12262,
+ 12262,12262,12262,12262,12262,12262,12262,12262,12262,12263,
+ 12263,12263,12263,12263,12263,12263,12263,12263,12263,12263,
+ 12263,12264,12264,12264,12264,12264,12264,12264,12264,12264,
+ 12264,12264,12264,12265,12265,12265,12265,12265,12265,12265,
+ 12265,12265,12265,12265,12265,12266,12266,12266,12266,12266,
+
+ 12266,12266,12266,12266,12266,12266,12266,12267,12267,12267,
+ 12267,12267,12267,12267,12267,12267,12267,12267,12267,12268,
+ 12268,12268,12268,12268,12268,12268,12268,12268,12268,12268,
+ 12268,12269,12269,12269,12269,12269,12269,12269,12269,12269,
+ 12269,12269,12269,12270,12270,12270,12270,12270,12270,12270,
+ 12270,12270,12270,12270,12270,12271,12271,12271,12271,12271,
+ 12271,12271,12271,12271,12271,12271,12271,12272,12272,12272,
+ 12272,12272,12272,12272,12272,12272,12272,12272,12272,12273,
+ 12273,12273,12273,12273,12273,12273,12273,12273,12273,12273,
+ 12273,12274,12274,12274,12274,12274,12274,12274,12274,12274,
+
+ 12274,12274,12274,12275,12275,12275,12275,12275,12275,12275,
+ 12275,12275,12275,12275,12275,12276,12276,12276,12276,12276,
+ 12276,12276,12276,12276,12276,12276,12276,12277,12277,12277,
+ 12277,12277,12277,12277,12277,12277,12277,12277,12277,12278,
+ 12278,12278,12278,12278,12278,12278,12278,12278,12278,12278,
+ 12278,12279,12279,12279,12279,12279,12279,12279,12279,12279,
+ 12279,12279,12279,12280,12280,12280,12280,12280,12280,12280,
+ 12280,12280,12280,12280,12280,12281,12281,12281,12281,12281,
+ 12281,12281,12281,12281,12281,12281,12281,12282,12282,12282,
+ 12282,12282,12282,12282,12282,12282,12282,12282,12282,12283,
+
+ 12283,12283,12283,12283,12283,12283,12283,12283,12283,12283,
+ 12283,12284,12284,12284,12284,12284,12284,12284,12284,12284,
+ 12284,12284,12284,12285,12285,12285,12285,12285,12285,12285,
+ 12285,12285,12285,12285,12285,12286,12286,12286,12286,12286,
+ 12286,12286,12286,12286,12286,12286,12286,12287,12287,12287,
+ 12287,12287,12287,12287,12287,12287,12287,12287,12287,12288,
+ 12288,12288,12288,12288,12288,12288,12288,12288,12288,12288,
+ 12288,12289,12289,12289,12289,12289,12289,12289,12289,12289,
+ 12289,12289,12289,12290,12290,12290,12290,12290,12290,12290,
+ 12290,12290,12290,12290,12290,12291,12291,12291,12291,12291,
+
+ 12291,12291,12291,12291,12291,12291,12291,12292,12292,12292,
+ 12292,12292,12292,12292,12292,12292,12292,12292,12292,12293,
+ 12293,12293,12293,12293,12293,12293,12293,12293,12293,12293,
+ 12293,12294,12294,12294,12294,12294,12294,12294,12294,12294,
+ 12294,12294,12294,12295,12295,12295,12295,12295,12295,12295,
+ 12295,12295,12295,12295,12295,12296,12296,12296,12296,12296,
+ 12296,12296,12296,12296,12296,12296,12296,12297,12297,12297,
+ 12297,12297,12297,12297,12297,12297,12297,12297,12297,12298,
+ 12298,12298,12298,12298,12298,12298,12298,12298,12298,12298,
+ 12298,12299,12299,12299,12299,12299,12299,12299,12299,12299,
+
+ 12299,12299,12299,12300,12300,12300,12300,12300,12300,12300,
+ 12300,12300,12300,12300,12300,12301,12301,12301,12301,12301,
+ 12301,12301,12301,12301,12301,12301,12301,12302,12302,12302,
+ 12302,12302,12302,12302,12302,12302,12302,12302,12302,12303,
+ 12303,12303,12303,12303,12303,12303,12303,12303,12303,12303,
+ 12303,12304,12304,12304,12304,12304,12304,12304,12304,12304,
+ 12304,12304,12304,12305,12305,12305,12305,12305,12305,12305,
+ 12305,12305,12305,12305,12305,12306,12306,12306,12306,12306,
+ 12306,12306,12306,12306,12306,12306,12306,12307,12307,12307,
+ 12307,12307,12307,12307,12307,12307,12307,12307,12307,12308,
+
+ 12308,12308,12308,12308,12308,12308,12308,12308,12308,12308,
+ 12308,12309,12309,12309,12309,12309,12309,12309,12309,12309,
+ 12309,12309,12309,12310,12310,12310,12310,12310,12310,12310,
+ 12310,12310,12310,12310,12310,12311,12311,12311,12311,12311,
+ 12311,12311,12311,12311,12311,12311,12311,12312,12312,12312,
+ 12312,12312,12312,12312,12312,12312,12312,12312,12312,12313,
+ 12313,12313,12313,12313,12313,12313,12313,12313,12313,12313,
+ 12313,12314,12314,12314,12314,12314,12314,12314,12314,12314,
+ 12314,12314,12314,12315,12315,12315,12315,12315,12315,12315,
+ 12315,12315,12315,12315,12315,12316,12316,12316,12316,12316,
+
+ 12316,12316,12316,12316,12316,12316,12316,12317,12317,12317,
+ 12317,12317,12317,12317,12317,12317,12317,12317,12317,12318,
+ 12318,12318,12318,12318,12318,12318,12318,12318,12318,12318,
+ 12318,12319,12319,12319,12319,12319,12319,12319,12319,12319,
+ 12319,12319,12319,12320,12320,12320,12320,12320,12320,12320,
+ 12320,12320,12320,12320,12320,12321,12321,12321,12321,12321,
+ 12321,12321,12321,12321,12321,12321,12321,12322,12322,12322,
+ 12322,12322,12322,12322,12322,12322,12322,12322,12322,12323,
+ 12323,12323,12323,12323,12323,12323,12323,12323,12323,12323,
+ 12323,12324,12324,12324,12324,12324,12324,12324,12324,12324,
+
+ 12324,12324,12324,12325,12325,12325,12325,12325,12325,12325,
+ 12325,12325,12325,12325,12325,12326,12326,12326,12326,12326,
+ 12326,12326,12326,12326,12326,12326,12326,12327,12327,12327,
+ 12327,12327,12327,12327,12327,12327,12327,12327,12327,12328,
+ 12328,12328,12328,12328,12328,12328,12328,12328,12328,12328,
+ 12328,12329,12329,12329,12329,12329,12329,12329,12329,12329,
+ 12329,12329,12329,12330,12330,12330,12330,12330,12330,12330,
+ 12330,12330,12330,12330,12330,12331,12331,12331,12331,12331,
+ 12331,12331,12331,12331,12331,12331,12331,12332,12332,12332,
+ 12332,12332,12332,12332,12332,12332,12332,12332,12332,12333,
+
+ 12333,12333,12333,12333,12333,12333,12333,12333,12333,12333,
+ 12333,12334,12334,12334,12334,12334,12334,12334,12334,12334,
+ 12334,12334,12334,12335,12335,12335,12335,12335,12335,12335,
+ 12335,12335,12335,12335,12335,12336,12336,12336,12336,12336,
+ 12336,12336,12336,12336,12336,12336,12336,12337,12337,12337,
+ 12337,12337,12337,12337,12337,12337,12337,12337,12337,12338,
+ 12338,12338,12338,12338,12338,12338,12338,12338,12338,12338,
+ 12338,12339,12339,12339,12339,12339,12339,12339,12339,12339,
+ 12339,12339,12339,12340,12340,12340,12340,12340,12340,12340,
+ 12340,12340,12340,12340,12340,12341,12341,12341,12341,12341,
+
+ 12341,12341,12341,12341,12341,12341,12341,12342,12342,12342,
+ 12342,12342,12342,12342,12342,12342,12342,12342,12342,12343,
+ 12343,12343,12343,12343,12343,12343,12343,12343,12343,12343,
+ 12343,12344,12344,12344,12344,12344,12344,12344,12344,12344,
+ 12344,12344,12344,12345,12345,12345,12345,12345,12345,12345,
+ 12345,12345,12345,12345,12345,12346,12346,12346,12346,12346,
+ 12346,12346,12346,12346,12346,12346,12346,12347,12347,12347,
+ 12347,12347,12347,12347,12347,12347,12347,12347,12347,12348,
+ 12348,12348,12348,12348,12348,12348,12348,12348,12348,12348,
+ 12348,12349,12349,12349,12349,12349,12349,12349,12349,12349,
+
+ 12349,12349,12349,12350,12350,12350,12350,12350,12350,12350,
+ 12350,12350,12350,12350,12350,12351,12351,12351,12351,12351,
+ 12351,12351,12351,12351,12351,12351,12351,12352,12352,12352,
+ 12352,12352,12352,12352,12352,12352,12352,12352,12352,12353,
+ 12353,12353,12353,12353,12353,12353,12353,12353,12353,12353,
+ 12353,12354,12354,12354,12354,12354,12354,12354,12354,12354,
+ 12354,12354,12354,12355,12355,12355,12355,12355,12355,12355,
+ 12355,12355,12355,12355,12355,12356,12356,12356,12356,12356,
+ 12356,12356,12356,12356,12356,12356,12356,12357,12357,12357,
+ 12357,12357,12357,12357,12357,12357,12357,12357,12357,12358,
+
+ 12358,12358,12358,12358,12358,12358,12358,12358,12358,12358,
+ 12358,12359,12359,12359,12359,12359,12359,12359,12359,12359,
+ 12359,12359,12359,12360,12360,12360,12360,12360,12360,12360,
+ 12360,12360,12360,12360,12360,12361,12361,12361,12361,12361,
+ 12361,12361,12361,12361,12361,12361,12361,12362,12362,12362,
+ 12362,12362,12362,12362,12362,12362,12362,12362,12362,12363,
+ 12363,12363,12363,12363,12363,12363,12363,12363,12363,12363,
+ 12363,12364,12364,12364,12364,12364,12364,12364,12364,12364,
+ 12364,12364,12364,12365,12365,12365,12365,12365,12365,12365,
+ 12365,12365,12365,12365,12365,12366,12366,12366,12366,12366,
+
+ 12366,12366,12366,12366,12366,12366,12366,12367,12367,12367,
+ 12367,12367,12367,12367,12367,12367,12367,12367,12367,12368,
+ 12368,12368,12368,12368,12368,12368,12368,12368,12368,12368,
+ 12368,12369,12369,12369,12369,12369,12369,12369,12369,12369,
+ 12369,12369,12369,12370,12370,12370,12370,12370,12370,12370,
+ 12370,12370,12370,12370,12370,12371,12371,12371,12371,12371,
+ 12371,12371,12371,12371,12371,12371,12371,12372,12372,12372,
+ 12372,12372,12372,12372,12372,12372,12372,12372,12372,12373,
+ 12373,12373,12373,12373,12373,12373,12373,12373,12373,12373,
+ 12373,12374,12374,12374,12374,12374,12374,12374,12374,12374,
+
+ 12374,12374,12374,12375,12375,12375,12375,12375,12375,12375,
+ 12375,12375,12375,12375,12375,12376,12376,12376,12376,12376,
+ 12376,12376,12376,12376,12376,12376,12376,12377,12377,12377,
+ 12377,12377,12377,12377,12377,12377,12377,12377,12377,12378,
+ 12378,12378,12378,12378,12378,12378,12378,12378,12378,12378,
+ 12378,12379,12379,12379,12379,12379,12379,12379,12379,12379,
+ 12379,12379,12379,12380,12380,12380,12380,12380,12380,12380,
+ 12380,12380,12380,12380,12380,12381,12381,12381,12381,12381,
+ 12381,12381,12381,12381,12381,12381,12381,12382,12382,12382,
+ 12382,12382,12382,12382,12382,12382,12382,12382,12382,12383,
+
+ 12383,12383,12383,12383,12383,12383,12383,12383,12383,12383,
+ 12383,12384,12384,12384,12384,12384,12384,12384,12384,12384,
+ 12384,12384,12384,12385,12385,12385,12385,12385,12385,12385,
+ 12385,12385,12385,12385,12385,12386,12386,12386,12386,12386,
+ 12386,12386,12386,12386,12386,12386,12386,12387,12387,12387,
+ 12387,12387,12387,12387,12387,12387,12387,12387,12387,12388,
+ 12388,12388,12388,12388,12388,12388,12388,12388,12388,12388,
+ 12388,12389,12389,12389,12389,12389,12389,12389,12389,12389,
+ 12389,12389,12389,12390,12390,12390,12390,12390,12390,12390,
+ 12390,12390,12390,12390,12390,12391,12391,12391,12391,12391,
+
+ 12391,12391,12391,12391,12391,12391,12391,12392,12392,12392,
+ 12392,12392,12392,12392,12392,12392,12392,12392,12392,12393,
+ 12393,12393,12393,12393,12393,12393,12393,12393,12393,12393,
+ 12393,12394,12394,12394,12394,12394,12394,12394,12394,12394,
+ 12394,12394,12394,12395,12395,12395,12395,12395,12395,12395,
+ 12395,12395,12395,12395,12395,12396,12396,12396,12396,12396,
+ 12396,12396,12396,12396,12396,12396,12396,12397,12397,12397,
+ 12397,12397,12397,12397,12397,12397,12397,12397,12397,12398,
+ 12398,12398,12398,12398,12398,12398,12398,12398,12398,12398,
+ 12398,12399,12399,12399,12399,12399,12399,12399,12399,12399,
+
+ 12399,12399,12399,12400,12400,12400,12400,12400,12400,12400,
+ 12400,12400,12400,12400,12400,12401,12401,12401,12401,12401,
+ 12401,12401,12401,12401,12401,12401,12401,12402,12402,12402,
+ 12402,12402,12402,12402,12402,12402,12402,12402,12402,12403,
+ 12403,12403,12403,12403,12403,12403,12403,12403,12403,12403,
+ 12403,12404,12404,12404,12404,12404,12404,12404,12404,12404,
+ 12404,12404,12404,12405,12405,12405,12405,12405,12405,12405,
+ 12405,12405,12405,12405,12405,12406,12406,12406,12406,12406,
+ 12406,12406,12406,12406,12406,12406,12406,12407,12407,12407,
+ 12407,12407,12407,12407,12407,12407,12407,12407,12407,12408,
+
+ 12408,12408,12408,12408,12408,12408,12408,12408,12408,12408,
+ 12408,12409,12409,12409,12409,12409,12409,12409,12409,12409,
+ 12409,12409,12409,12410,12410,12410,12410,12410,12410,12410,
+ 12410,12410,12410,12410,12410,12411,12411,12411,12411,12411,
+ 12411,12411,12411,12411,12411,12411,12411,12412,12412,12412,
+ 12412,12412,12412,12412,12412,12412,12412,12412,12412,12413,
+ 12413,12413,12413,12413,12413,12413,12413,12413,12413,12413,
+ 12413,12414,12414,12414,12414,12414,12414,12414,12414,12414,
+ 12414,12414,12414,12415,12415,12415,12415,12415,12415,12415,
+ 12415,12415,12415,12415,12415,12416,12416,12416,12416,12416,
+
+ 12416,12416,12416,12416,12416,12416,12416,12417,12417,12417,
+ 12417,12417,12417,12417,12417,12417,12417,12417,12417,12418,
+ 12418,12418,12418,12418,12418,12418,12418,12418,12418,12418,
+ 12418,12419,12419,12419,12419,12419,12419,12419,12419,12419,
+ 12419,12419,12419,12420,12420,12420,12420,12420,12420,12420,
+ 12420,12420,12420,12420,12420,12421,12421,12421,12421,12421,
+ 12421,12421,12421,12421,12421,12421,12421,12422,12422,12422,
+ 12422,12422,12422,12422,12422,12422,12422,12422,12422,12423,
+ 12423,12423,12423,12423,12423,12423,12423,12423,12423,12423,
+ 12423,12424,12424,12424,12424,12424,12424,12424,12424,12424,
+
+ 12424,12424,12424,12425,12425,12425,12425,12425,12425,12425,
+ 12425,12425,12425,12425,12425,12426,12426,12426,12426,12426,
+ 12426,12426,12426,12426,12426,12426,12426,12427,12427,12427,
+ 12427,12427,12427,12427,12427,12427,12427,12427,12427,12428,
+ 12428,12428,12428,12428,12428,12428,12428,12428,12428,12428,
+ 12428,12429,12429,12429,12429,12429,12429,12429,12429,12429,
+ 12429,12429,12429,12430,12430,12430,12430,12430,12430,12430,
+ 12430,12430,12430,12430,12430,12431,12431,12431,12431,12431,
+ 12431,12431,12431,12431,12431,12431,12431,12432,12432,12432,
+ 12432,12432,12432,12432,12432,12432,12432,12432,12432,12433,
+
+ 12433,12433,12433,12433,12433,12433,12433,12433,12433,12433,
+ 12433,12434,12434,12434,12434,12434,12434,12434,12434,12434,
+ 12434,12434,12434,12435,12435,12435,12435,12435,12435,12435,
+ 12435,12435,12435,12435,12435,12436,12436,12436,12436,12436,
+ 12436,12436,12436,12436,12436,12436,12436,12437,12437,12437,
+ 12437,12437,12437,12437,12437,12437,12437,12437,12437,12438,
+ 12438,12438,12438,12438,12438,12438,12438,12438,12438,12438,
+ 12438,12439,12439,12439,12439,12439,12439,12439,12439,12439,
+ 12439,12439,12439,12440,12440,12440,12440,12440,12440,12440,
+ 12440,12440,12440,12440,12440,12441,12441,12441,12441,12441,
+
+ 12441,12441,12441,12441,12441,12441,12441,12442,12442,12442,
+ 12442,12442,12442,12442,12442,12442,12442,12442,12442,12443,
+ 12443,12443,12443,12443,12443,12443,12443,12443,12443,12443,
+ 12443,12444,12444,12444,12444,12444,12444,12444,12444,12444,
+ 12444,12444,12444,12445,12445,12445,12445,12445,12445,12445,
+ 12445,12445,12445,12445,12445,12446,12446,12446,12446,12446,
+ 12446,12446,12446,12446,12446,12446,12446,12447,12447,12447,
+ 12447,12447,12447,12447,12447,12447,12447,12447,12447,12448,
+ 12448,12448,12448,12448,12448,12448,12448,12448,12448,12448,
+ 12448,12449,12449,12449,12449,12449,12449,12449,12449,12449,
+
+ 12449,12449,12449,12450,12450,12450,12450,12450,12450,12450,
+ 12450,12450,12450,12450,12450,12451,12451,12451,12451,12451,
+ 12451,12451,12451,12451,12451,12451,12451,12452,12452,12452,
+ 12452,12452,12452,12452,12452,12452,12452,12452,12452,12453,
+ 12453,12453,12453,12453,12453,12453,12453,12453,12453,12453,
+ 12453,12454,12454,12454,12454,12454,12454,12454,12454,12454,
+ 12454,12454,12454,12455,12455,12455,12455,12455,12455,12455,
+ 12455,12455,12455,12455,12455,12456,12456,12456,12456,12456,
+ 12456,12456,12456,12456,12456,12456,12456,12457,12457,12457,
+ 12457,12457,12457,12457,12457,12457,12457,12457,12457,12458,
+
+ 12458,12458,12458,12458,12458,12458,12458,12458,12458,12458,
+ 12458,12459,12459,12459,12459,12459,12459,12459,12459,12459,
+ 12459,12459,12459,12460,12460,12460,12460,12460,12460,12460,
+ 12460,12460,12460,12460,12460,12461,12461,12461,12461,12461,
+ 12461,12461,12461,12461,12461,12461,12461,12462,12462,12462,
+ 12462,12462,12462,12462,12462,12462,12462,12462,12462,12463,
+ 12463,12463,12463,12463,12463,12463,12463,12463,12463,12463,
+ 12463,12464,12464,12464,12464,12464,12464,12464,12464,12464,
+ 12464,12464,12464,12465,12465,12465,12465,12465,12465,12465,
+ 12465,12465,12465,12465,12465, 8693, 8693, 8693, 8693, 8693,
+
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693,
+ 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693, 8693
+ } ;
+
+extern int fscanYY_flex_debug;
+int fscanYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up fscanYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *fscanYYtext;
+#line 1 "fortranscanner.l"
+/* -*- mode: fundamental; indent-tabs-mode: 1; -*- */
+/*****************************************************************************
+ * Parser for Fortran90 F subset
+ *
+ * Copyright (C) by Anke Visser
+ * based on the work of Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/* Developer notes.
+ *
+ * - Consider using startScope(), endScope() functions with module, program,
+ * subroutine or any other scope in fortran program.
+ *
+ * - Symbol modifiers (attributes) are collected using SymbolModifiers |= operator during
+ * substructure parsing. When substructure ends all modifiers are applied to actual
+ * entries in applyModifiers() functions.
+ *
+ * - How case insensitiveness should be handled in code?
+ * On one side we have arg->name and entry->name, on another side modifierMap[name].
+ * In entries and arguments case is the same as in code, in modifier map case is lowered and
+ * then it is compared to lowered entry/argument names.
+ *
+ * - Do not like constructs like aa{BS} or {BS}bb. Should try to handle blank space
+ * with separate rule?: It seems it is often necessary, because we may parse something like
+ * "functionA" or "MyInterface". So constructs like `(^|[ \t])interface({BS_}{ID})?/[ \t\n]'
+ * are desired.
+ *
+ * - Must track yyLineNr when using REJECT, unput() or similar commands.
+ */
+#line 42 "fortranscanner.l"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qregexp.h>
+#include <unistd.h>
+#include <qfile.h>
+#include <qmap.h>
+
+#include "fortranscanner.h"
+#include "entry.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+#include "defargs.h"
+#include "language.h"
+#include "commentscan.h"
+#include "fortrancode.h"
+#include "pre.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+enum ScanVar { V_IGNORE, V_VARIABLE, V_PARAMETER};
+enum InterfaceType { IF_NONE, IF_SPECIFIC, IF_GENERIC, IF_ABSTRACT };
+
+// {{{ ----- Helper structs -----
+//! Holds modifiers (ie attributes) for one symbol (variable, function, etc)
+struct SymbolModifiers {
+ enum Protection {NONE_P, PUBLIC, PRIVATE};
+ enum Direction {NONE_D, IN, OUT, INOUT};
+
+ //!< This is only used with function return value.
+ QCString type, returnName;
+ Protection protection;
+ Direction direction;
+ bool optional;
+ QCString dimension;
+ bool allocatable;
+ bool external;
+ bool intrinsic;
+ bool parameter;
+ bool pointer;
+ bool target;
+ bool save;
+ bool deferred;
+ bool nonoverridable;
+ bool nopass;
+ bool pass;
+ QCString passVar;
+
+ SymbolModifiers() : type(), returnName(), protection(NONE_P), direction(NONE_D),
+ optional(FALSE), dimension(), allocatable(FALSE),
+ external(FALSE), intrinsic(FALSE), parameter(FALSE),
+ pointer(FALSE), target(FALSE), save(FALSE), deferred(FALSE), nonoverridable(FALSE),
+ nopass(FALSE), pass(FALSE), passVar() {}
+
+ SymbolModifiers& operator|=(const SymbolModifiers &mdfs);
+ SymbolModifiers& operator|=(QCString mdfrString);
+};
+
+//ostream& operator<<(ostream& out, const SymbolModifiers& mdfs);
+
+static const char *directionStrs[] =
+{
+ "", "intent(in)", "intent(out)", "intent(inout)"
+};
+
+// }}}
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+static ParserInterface *g_thisParser;
+static const char * inputString;
+static int inputPosition;
+static bool isFixedForm;
+static QCString inputStringPrepass; ///< Input string for prepass of line cont. '&'
+static QCString inputStringSemi; ///< Input string after command separetor ';'
+static unsigned int inputPositionPrepass;
+static int lineCountPrepass = 0;
+
+struct CommentInPrepass {
+ int column;
+ QCString str;
+ CommentInPrepass(int column, QCString str) : column(column), str(str) {}
+};
+static QList<CommentInPrepass> comments;
+
+#define MAX_INCLUDE_DEPTH 10
+YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
+int include_stack_ptr = 0;
+
+static QFile inputFile;
+static QCString yyFileName;
+static int yyLineNr = 1 ;
+static int yyColNr = 0 ;
+static Entry* current_root = 0 ;
+static Entry* global_root = 0 ;
+static Entry* file_root = 0 ;
+static Entry* current = 0 ;
+static Entry* last_entry = 0 ;
+static ScanVar v_type = V_IGNORE; // type of parsed variable
+static QList<Entry> moduleProcedures; // list of all interfaces which contain unresolved
+ // module procedures
+static QCString docBlock;
+static QCString docBlockName;
+static bool docBlockInBody;
+static bool docBlockJavaStyle;
+
+static MethodTypes mtype;
+static bool gstat;
+static Specifier virt;
+
+static QCString debugStr;
+static QCString result; // function result
+static Argument *parameter; // element of parameter list
+static QCString argType; // fortran type of an argument of a parameter list
+static QCString argName; // last identifier name in variable list
+static QCString initializer; // initial value of a variable
+static int initializerArrayScope; // number if nested array scopes in initializer
+static int initializerScope; // number if nested function calls in initializer
+static QCString useModuleName; // name of module in the use statement
+static Protection defaultProtection;
+static InterfaceType ifType = IF_NONE;
+
+static char stringStartSymbol; // single or double quote
+
+//! Accumulated modifiers of current statement, eg variable declaration.
+static SymbolModifiers currentModifiers;
+//! Holds program scope->symbol name->symbol modifiers.
+static QMap<Entry*,QMap<QCString,SymbolModifiers> > modifiers;
+
+//-----------------------------------------------------------------------------
+
+static int yyread(char *buf,int max_size);
+static void startCommentBlock(bool);
+static void handleCommentBlock(const QCString &doc,bool brief);
+static void addCurrentEntry();
+static void addModule(const char *name, bool isModule=FALSE);
+static void addSubprogram(const char *text);
+static void addInterface(QCString name, InterfaceType type);
+static Argument *getParameter(const QCString &name);
+static void scanner_abort();
+
+static void startScope(Entry *scope);
+static bool endScope(Entry *scope, bool isGlobalRoot=FALSE);
+static QCString getFullName(Entry *e);
+static bool isTypeName(QCString name);
+static void resolveModuleProcedures(QList<Entry> &moduleProcedures, Entry *current_root);
+static int getAmpersandAtTheStart(const char *buf, int length);
+static int getAmpOrExclAtTheEnd(const char *buf, int length);
+static void truncatePrepass(int index);
+static void pushBuffer(QCString &buffer);
+static void popBuffer();
+//static void extractPrefix(QCString& text);
+static QCString extractFromParens(const QCString name);
+static CommentInPrepass* locatePrepassComment(int from, int to);
+static void updateVariablePrepassComment(int from, int to);
+static void newLine();
+
+//-----------------------------------------------------------------------------
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+#define YY_USER_ACTION yyColNr+=fscanYYleng;
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+/* Assume that attribute statements are almost the same as attributes. */
+/*%option debug */
+//---------------------------------------------------------------------------------
+/** fortran parsing states */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/** comment parsing states */
+
+
+
+#line 23773 "<stdout>"
+
+#define INITIAL 0
+#define Subprog 1
+#define SubprogPrefix 2
+#define Parameterlist 3
+#define SubprogBody 4
+#define SubprogBodyContains 5
+#define Start 6
+#define Comment 7
+#define Module 8
+#define Program 9
+#define ModuleBody 10
+#define ModuleBodyContains 11
+#define AttributeList 12
+#define Variable 13
+#define Initialization 14
+#define ArrayInitializer 15
+#define Typedef 16
+#define TypedefBody 17
+#define TypedefBodyContains 18
+#define InterfaceBody 19
+#define StrIgnore 20
+#define String 21
+#define Use 22
+#define UseOnly 23
+#define ModuleProcedure 24
+#define Prepass 25
+#define DocBlock 26
+#define DocBackLine 27
+#define EndDoc 28
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int fscanYYlex_destroy (void );
+
+int fscanYYget_debug (void );
+
+void fscanYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE fscanYYget_extra (void );
+
+void fscanYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *fscanYYget_in (void );
+
+void fscanYYset_in (FILE * in_str );
+
+FILE *fscanYYget_out (void );
+
+void fscanYYset_out (FILE * out_str );
+
+yy_size_t fscanYYget_leng (void );
+
+char *fscanYYget_text (void );
+
+int fscanYYget_lineno (void );
+
+void fscanYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int fscanYYwrap (void );
+#else
+extern int fscanYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+ static int yy_start_stack_ptr = 0;
+ static int yy_start_stack_depth = 0;
+ static int *yy_start_stack = NULL;
+
+ static void yy_push_state (int new_state );
+
+ static void yy_pop_state (void );
+
+ static int yy_top_state (void );
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( fscanYYtext, fscanYYleng, 1, fscanYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( fscanYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( fscanYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, fscanYYin))==0 && ferror(fscanYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(fscanYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int fscanYYlex (void);
+
+#define YY_DECL int fscanYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after fscanYYtext and fscanYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( fscanYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (fscanYYtext[fscanYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 292 "fortranscanner.l"
+
+
+ /*-----------------------------------------------------------------------------------*/
+
+#line 24001 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)fscanYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in fscanYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! fscanYYin )
+ fscanYYin = stdin;
+
+ if ( ! fscanYYout )
+ fscanYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ fscanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ fscanYY_create_buffer(fscanYYin,YY_BUF_SIZE );
+ }
+
+ fscanYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of fscanYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 8694 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 85296 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+#line 296 "fortranscanner.l"
+{ // prepass: look for line continuations
+
+ //fprintf(stderr, "---%s", fscanYYtext);
+
+ int indexStart = getAmpersandAtTheStart(fscanYYtext, fscanYYleng);
+ int indexEnd = getAmpOrExclAtTheEnd(fscanYYtext, fscanYYleng);
+ if (indexEnd>=0 && fscanYYtext[indexEnd]!='&') //we are only interested in amp
+ indexEnd=-1;
+
+ if(indexEnd<0){ // ----- no ampersand as line continuation
+ if(YY_START == Prepass) { // last line in "continuation"
+
+ // Only take input after initial ampersand
+ inputStringPrepass+=(const char*)(fscanYYtext+(indexStart+1));
+
+ //printf("BUFFER:%s\n", (const char*)inputStringPrepass);
+ pushBuffer(inputStringPrepass);
+ yyColNr = 0;
+ yy_pop_state();
+ } else { // simple line
+ yyColNr = 0;
+ REJECT;
+ }
+
+ } else { // ----- line with continuation
+ if(YY_START != Prepass) {
+ comments.setAutoDelete(TRUE);
+ comments.clear();
+ yy_push_state(Prepass);
+ }
+
+ int length = inputStringPrepass.length();
+
+ // Only take input after initial ampersand
+ inputStringPrepass+=(const char*)(fscanYYtext+(indexStart+1));
+ lineCountPrepass ++;
+
+ // cut off & and remove following comment if present
+ truncatePrepass(length+indexEnd-(indexStart+1));
+ }
+
+ }
+ YY_BREAK
+/*------ ignore strings that are not initialization strings */
+case 2:
+YY_RULE_SETUP
+#line 341 "fortranscanner.l"
+{ if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=fscanYYtext;
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 345 "fortranscanner.l"
+{ if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=fscanYYtext;
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 349 "fortranscanner.l"
+{ // string ends with next quote without previous backspace
+ if (fscanYYtext[0]!=stringStartSymbol) { yyColNr -= fscanYYleng; REJECT; } // single vs double quote
+ if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=fscanYYtext;
+ yy_pop_state();
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 356 "fortranscanner.l"
+{ if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=fscanYYtext;
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 360 "fortranscanner.l"
+{ /* string starts */
+ if (YY_START == StrIgnore) { yyColNr -= fscanYYleng; REJECT; }; // ignore in simple comments
+ yy_push_state(YY_START);
+ if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=fscanYYtext;
+ stringStartSymbol=fscanYYtext[0]; // single or double quote
+ BEGIN(String);
+ }
+ YY_BREAK
+/*------ ignore simple comment (not documentation comments) */
+case 7:
+*yy_cp = (yy_hold_char); /* undo effects of setting up fscanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up fscanYYtext again */
+YY_RULE_SETUP
+#line 372 "fortranscanner.l"
+{ if (YY_START == String) { yyColNr -= fscanYYleng; REJECT; } // "!" is ignored in strings
+ // skip comment line (without docu comments "!>" "!<" )
+ /* ignore further "!" and ignore comments in Strings */
+ if ((YY_START != StrIgnore) && (YY_START != String))
+ {
+ yy_push_state(YY_START);
+ BEGIN(StrIgnore);
+ debugStr="*!";
+ //fprintf(stderr,"start comment %d\n",yyLineNr);
+ }
+ }
+ YY_BREAK
+case 8:
+/* rule 8 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up fscanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up fscanYYtext again */
+YY_RULE_SETUP
+#line 383 "fortranscanner.l"
+{ yy_pop_state(); // comment ends with endline character
+ //fprintf(stderr,"end comment %d %s\n",yyLineNr,debugStr.data());
+ } // comment line ends
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 386 "fortranscanner.l"
+{ debugStr+=fscanYYtext; }
+ YY_BREAK
+/*------ use handling ------------------------------------------------------------*/
+case 10:
+YY_RULE_SETUP
+#line 391 "fortranscanner.l"
+{
+ if(YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBody); //anon program
+ }
+ yy_push_state(Use);
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 399 "fortranscanner.l"
+{
+ //fprintf(stderr,"using dir %s\n",fscanYYtext);
+ current->name=fscanYYtext;
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ current->lang = SrcLangExt_F90;
+ yy_pop_state();
+ }
+ YY_BREAK
+case 12:
+*yy_cp = (yy_hold_char); /* undo effects of setting up fscanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up fscanYYtext again */
+YY_RULE_SETUP
+#line 409 "fortranscanner.l"
+{
+ useModuleName=fscanYYtext;
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 412 "fortranscanner.l"
+{ BEGIN(UseOnly);
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 414 "fortranscanner.l"
+{}
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 415 "fortranscanner.l"
+{
+ current->name= useModuleName+"::"+fscanYYtext;
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ current->lang = SrcLangExt_F90;
+ }
+ YY_BREAK
+case 16:
+/* rule 16 can match eol */
+YY_RULE_SETUP
+#line 423 "fortranscanner.l"
+{
+ yyColNr -= 1;
+ unput(*fscanYYtext);
+ yy_pop_state();
+ }
+ YY_BREAK
+/* INTERFACE definitions */
+
+case 17:
+YY_RULE_SETUP
+#line 431 "fortranscanner.l"
+{ ifType = IF_SPECIFIC;
+ yy_push_state(InterfaceBody);
+ // do not start a scope here, every
+ // interface body is a scope of its own
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 437 "fortranscanner.l"
+{ ifType = IF_ABSTRACT;
+ yy_push_state(InterfaceBody);
+ // do not start a scope here, every
+ // interface body is a scope of its own
+ }
+ YY_BREAK
+case 19:
+/* rule 19 can match eol */
+YY_RULE_SETUP
+#line 443 "fortranscanner.l"
+{ ifType = IF_GENERIC;
+ yy_push_state(InterfaceBody);
+
+ // extract generic name
+ QCString name = QCString(fscanYYtext).stripWhiteSpace();
+ name = name.right(name.length() - 9).stripWhiteSpace();
+ addInterface(name, ifType);
+
+ startScope(last_entry);
+ }
+ YY_BREAK
+
+case 20:
+YY_RULE_SETUP
+#line 455 "fortranscanner.l"
+{
+ // end scope only if GENERIC interface
+ if (ifType == IF_GENERIC && !endScope(current_root))
+ yyterminate();
+
+ ifType = IF_NONE;
+ yy_pop_state();
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 463 "fortranscanner.l"
+{ yy_push_state(YY_START);
+ BEGIN(ModuleProcedure);
+ }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 466 "fortranscanner.l"
+{ if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ {
+ addInterface(fscanYYtext, ifType);
+ startScope(last_entry);
+ }
+
+ current->section = Entry::FUNCTION_SEC ;
+ current->name = fscanYYtext;
+ moduleProcedures.append(current);
+ addCurrentEntry();
+ }
+ YY_BREAK
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+#line 477 "fortranscanner.l"
+{ yyColNr -= 1;
+ unput(*fscanYYtext);
+ yy_pop_state();
+ }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 481 "fortranscanner.l"
+{}
+ YY_BREAK
+/*-- Contains handling --*/
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 484 "fortranscanner.l"
+{
+ if(YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBodyContains); //anon program
+ }
+ }
+ YY_BREAK
+case 26:
+/* rule 26 can match eol */
+YY_RULE_SETUP
+#line 491 "fortranscanner.l"
+{ BEGIN(ModuleBodyContains); }
+ YY_BREAK
+case 27:
+/* rule 27 can match eol */
+YY_RULE_SETUP
+#line 492 "fortranscanner.l"
+{ BEGIN(SubprogBodyContains); }
+ YY_BREAK
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+#line 493 "fortranscanner.l"
+{ BEGIN(TypedefBodyContains); }
+ YY_BREAK
+/*------ module handling ------------------------------------------------------------*/
+case 29:
+YY_RULE_SETUP
+#line 496 "fortranscanner.l"
+{ //
+ if(fscanYYtext[0]=='m' || fscanYYtext[0]=='M')
+ yy_push_state(Module);
+ else
+ yy_push_state(Program);
+ defaultProtection = Public;
+ }
+ YY_BREAK
+case 30:
+/* rule 30 can match eol */
+YY_RULE_SETUP
+#line 503 "fortranscanner.l"
+{ // end module
+ resolveModuleProcedures(moduleProcedures, current_root);
+ if (!endScope(current_root))
+ yyterminate();
+ defaultProtection = Public;
+ yy_pop_state();
+ }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 510 "fortranscanner.l"
+{
+ addModule(fscanYYtext, TRUE);
+ BEGIN(ModuleBody);
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 515 "fortranscanner.l"
+{
+ addModule(fscanYYtext, FALSE);
+ BEGIN(ModuleBody);
+ }
+ YY_BREAK
+/*------- access specification --------------------------------------------------------------------------*/
+case 33:
+/* rule 33 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up fscanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 7;
+YY_DO_BEFORE_ACTION; /* set up fscanYYtext again */
+YY_RULE_SETUP
+#line 522 "fortranscanner.l"
+{ defaultProtection = Private; }
+ YY_BREAK
+case 34:
+/* rule 34 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up fscanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 6;
+YY_DO_BEFORE_ACTION; /* set up fscanYYtext again */
+YY_RULE_SETUP
+#line 523 "fortranscanner.l"
+{ defaultProtection = Public; }
+ YY_BREAK
+/*------- type definition -------------------------------------------------------------------------------*/
+case 35:
+YY_RULE_SETUP
+#line 527 "fortranscanner.l"
+{
+ if(YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBody); //anon program
+ }
+
+ yy_push_state(Typedef);
+ current->protection = defaultProtection;
+ }
+ YY_BREAK
+
+case 36:
+YY_RULE_SETUP
+#line 538 "fortranscanner.l"
+{}
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 540 "fortranscanner.l"
+{}
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 542 "fortranscanner.l"
+{
+ current->spec |= Entry::AbstractClass;
+ }
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 545 "fortranscanner.l"
+{
+ QCString basename = extractFromParens(fscanYYtext);
+ current->extends->append(new BaseInfo(basename, Public, Normal));
+ }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 549 "fortranscanner.l"
+{
+ current->protection = Public;
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 552 "fortranscanner.l"
+{
+ current->protection = Private;
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 555 "fortranscanner.l"
+{
+ /* ignored for now */
+ }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 558 "fortranscanner.l"
+{ /* type name found */
+ current->section = Entry::CLASS_SEC;
+ current->spec |= Entry::Struct;
+ current->name = fscanYYtext;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr;
+
+ /* if type is part of a module, mod name is necessary for output */
+ if ((current_root) &&
+ (current_root->section == Entry::CLASS_SEC
+ || current_root->section == Entry::NAMESPACE_SEC))
+ {
+ current->name = current_root->name + "::" + current->name;
+ }
+
+ addCurrentEntry();
+ startScope(last_entry);
+ BEGIN(TypedefBody);
+ }
+ YY_BREAK
+
+/* Type Bound Procedures */
+case 44:
+/* rule 44 can match eol */
+YY_RULE_SETUP
+#line 580 "fortranscanner.l"
+{
+ current->type = QCString(fscanYYtext).simplifyWhiteSpace();
+ }
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 583 "fortranscanner.l"
+{
+ current->spec |= Entry::Final;
+ current->type = QCString(fscanYYtext).simplifyWhiteSpace();
+ }
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 587 "fortranscanner.l"
+{
+ current->type = QCString(fscanYYtext).simplifyWhiteSpace();
+ }
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 590 "fortranscanner.l"
+{
+ }
+ YY_BREAK
+case 48:
+/* rule 48 can match eol */
+YY_RULE_SETUP
+#line 592 "fortranscanner.l"
+{
+ currentModifiers |= QCString(fscanYYtext);
+ }
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 595 "fortranscanner.l"
+{
+ }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 597 "fortranscanner.l"
+{
+ QCString name = fscanYYtext;
+ modifiers[current_root][name.lower()] |= currentModifiers;
+ current->section = Entry::FUNCTION_SEC;
+ current->name = name;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr;
+ addCurrentEntry();
+ }
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 606 "fortranscanner.l"
+{ /* Specific bindings come after the ID. */
+ last_entry->args = fscanYYtext;
+ }
+ YY_BREAK
+case 52:
+/* rule 52 can match eol */
+YY_RULE_SETUP
+#line 609 "fortranscanner.l"
+{
+ currentModifiers = SymbolModifiers();
+ newLine();
+ docBlock.resize(0);
+ }
+ YY_BREAK
+
+
+case 53:
+/* rule 53 can match eol */
+YY_RULE_SETUP
+#line 618 "fortranscanner.l"
+{ /* end type definition */
+ if (!endScope(current_root))
+ yyterminate();
+ yy_pop_state();
+ }
+ YY_BREAK
+
+/*------- module/global/typedef variable ---------------------------------------------------*/
+case 54:
+/* rule 54 can match eol */
+YY_RULE_SETUP
+#line 627 "fortranscanner.l"
+{
+ //
+ // ABSTRACT and specific interfaces are stored
+ // in a scope of their own, even if multiple
+ // are group in one INTERFACE/END INTERFACE block.
+ //
+ if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ endScope(current_root);
+
+ if (!endScope(current_root))
+ yyterminate();
+ yy_pop_state() ;
+ }
+ YY_BREAK
+
+case 55:
+/* rule 55 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up fscanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up fscanYYtext again */
+YY_RULE_SETUP
+#line 641 "fortranscanner.l"
+{
+ /* variable declaration starts */
+ if(YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBody); //anon program
+ }
+ argType = QCString(fscanYYtext).simplifyWhiteSpace();
+ yy_push_state(AttributeList);
+ }
+ YY_BREAK
+case 56:
+/* rule 56 can match eol */
+YY_RULE_SETUP
+#line 651 "fortranscanner.l"
+{ /* check for preprocessor symbol expand to type */
+ QCString str = fscanYYtext;
+ str = str.stripWhiteSpace();
+ DefineDict* defines = getGlobalDefineDict();
+ QCString name;
+ int index = str.find("(");
+ if (index != -1)
+ name = str.left(index).stripWhiteSpace();
+ else
+ name = str;
+
+ Define *define = (*defines)[name];
+ if (define != 0 && isTypeName(define->definition))
+ {
+ argType = str;
+ yy_push_state(AttributeList);
+ }
+ else
+ {
+ yyColNr -= fscanYYleng;
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 57:
+/* rule 57 can match eol */
+#line 675 "fortranscanner.l"
+case 58:
+/* rule 58 can match eol */
+YY_RULE_SETUP
+#line 675 "fortranscanner.l"
+{
+ /* attribute statement starts */
+ //fprintf(stderr,"5=========> Attribute statement: %s\n", fscanYYtext);
+ QCString tmp = fscanYYtext;
+ currentModifiers |= tmp.stripWhiteSpace();
+ argType="";
+ yy_push_state(YY_START);
+ BEGIN( AttributeList ) ;
+ }
+ YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 684 "fortranscanner.l"
+{
+ }
+ YY_BREAK
+
+
+case 60:
+YY_RULE_SETUP
+#line 688 "fortranscanner.l"
+{}
+ YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 689 "fortranscanner.l"
+{}
+ YY_BREAK
+case 62:
+/* rule 62 can match eol */
+YY_RULE_SETUP
+#line 690 "fortranscanner.l"
+{ /* update current modifierswhen it is an ATTR_SPEC and not a variable name */
+ /* bug_625519 */
+ QChar chr = fscanYYtext[fscanYYleng-1];
+ if (chr.isLetter() || chr.isDigit() || (chr == '_'))
+ {
+ yyColNr -= fscanYYleng;
+ REJECT;
+ }
+ else
+ {
+ QCString tmp = fscanYYtext;
+ tmp = tmp.left(tmp.length() - 1);
+ yyColNr -= 1;
+ unput(fscanYYtext[fscanYYleng-1]);
+ currentModifiers |= (tmp);
+ }
+ }
+ YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 707 "fortranscanner.l"
+{ /* end attribute list */
+ BEGIN( Variable );
+ }
+ YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 710 "fortranscanner.l"
+{ /* unknown attribute, consider variable name */
+ //cout<<"start variables, unput "<<*fscanYYtext<<endl;
+ yyColNr -= 1;
+ unput(*fscanYYtext);
+ BEGIN( Variable );
+ }
+ YY_BREAK
+
+case 65:
+YY_RULE_SETUP
+#line 718 "fortranscanner.l"
+{ }
+ YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 719 "fortranscanner.l"
+{ /* parse variable declaration */
+ //cout << "5=========> got variable: " << argType << "::" << fscanYYtext << endl;
+ /* work around for bug in QCString.replace (QCString works) */
+ QCString name=fscanYYtext;
+ /* remember attributes for the symbol */
+ modifiers[current_root][name.lower()] |= currentModifiers;
+ argName= name;
+
+ v_type= V_IGNORE;
+ if (!argType.isEmpty() && current_root->section!=Entry::FUNCTION_SEC)
+ { // new variable entry
+ v_type = V_VARIABLE;
+ current->section = Entry::VARIABLE_SEC;
+ current->name = argName;
+ current->type = argType;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr; // used for source reference
+ addCurrentEntry();
+ }
+ else if (!argType.isEmpty())
+ { // deklaration of parameter list: add type for corr. parameter
+ parameter = getParameter(argName);
+ if (parameter) {
+ v_type= V_PARAMETER;
+ if (!argType.isNull())
+ parameter->type=argType.stripWhiteSpace();
+ if (!docBlock.isNull()) {
+ parameter->docs += "\n";
+ parameter->docs += docBlock;
+ }
+ }
+ // save, it may be function return type
+ modifiers[current_root][name.lower()].type = argType;
+ // any accumulated doc for argument should be emptied,
+ // because it is handled other way and this doc can be
+ // unexpectedly passed to the next member.
+ current->doc.resize(0);
+ current->brief.resize(0);
+ }
+ }
+ YY_BREAK
+case 67:
+/* rule 67 can match eol */
+YY_RULE_SETUP
+#line 759 "fortranscanner.l"
+{ /* dimension of the previous entry. */
+ QCString name(argName);
+ QCString attr("dimension");
+ attr += fscanYYtext;
+ modifiers[current_root][name] |= attr;
+ }
+ YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 765 "fortranscanner.l"
+{ //printf("COMMA: %d<=..<=%d\n", yyColNr-fscanYYleng, yyColNr);
+ // locate !< comment
+ updateVariablePrepassComment(yyColNr-fscanYYleng, yyColNr);
+ }
+ YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 769 "fortranscanner.l"
+{ yy_push_state(YY_START);
+ initializer="";
+ initializerScope = initializerArrayScope = 0;
+ BEGIN(Initialization);
+ }
+ YY_BREAK
+case 70:
+/* rule 70 can match eol */
+YY_RULE_SETUP
+#line 774 "fortranscanner.l"
+{ currentModifiers = SymbolModifiers();
+ yy_pop_state(); // end variable deklaration list
+ newLine();
+ docBlock.resize(0);
+ }
+ YY_BREAK
+case 71:
+/* rule 71 can match eol */
+YY_RULE_SETUP
+#line 779 "fortranscanner.l"
+{ currentModifiers = SymbolModifiers();
+ yy_pop_state(); // end variable deklaration list
+ docBlock.resize(0);
+ inputStringSemi =(const char*)(fscanYYtext+1);
+ pushBuffer(inputStringSemi);
+ }
+ YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 786 "fortranscanner.l"
+{ initializer+=fscanYYtext;
+ initializerArrayScope++;
+ BEGIN(ArrayInitializer); // initializer may contain comma
+ }
+ YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 790 "fortranscanner.l"
+{ initializer+=fscanYYtext;
+ initializerArrayScope--;
+ if(initializerArrayScope<=0)
+ {
+ initializerArrayScope = 0; // just in case
+ BEGIN(Initialization);
+ }
+ }
+ YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 798 "fortranscanner.l"
+{ initializer+=fscanYYtext; }
+ YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 799 "fortranscanner.l"
+{ initializerScope++;
+ initializer+=fscanYYtext;
+ }
+ YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 802 "fortranscanner.l"
+{ initializerScope--;
+ initializer+=fscanYYtext;
+ }
+ YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 805 "fortranscanner.l"
+{ if (initializerScope == 0)
+ {
+ updateVariablePrepassComment(yyColNr-fscanYYleng, yyColNr);
+ yy_pop_state(); // end initialization
+ if (v_type == V_VARIABLE) last_entry->initializer= initializer;
+ }
+ else
+ initializer+=", ";
+ }
+ YY_BREAK
+case 78:
+/* rule 78 can match eol */
+YY_RULE_SETUP
+#line 814 "fortranscanner.l"
+{ //|
+ yy_pop_state(); // end initialization
+ if (v_type == V_VARIABLE) last_entry->initializer= initializer;
+ yyColNr -= 1;
+ unput(*fscanYYtext);
+ }
+ YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 820 "fortranscanner.l"
+{ initializer+=fscanYYtext; }
+ YY_BREAK
+/*------ fortran subroutine/function handling ------------------------------------------------------------*/
+/* Start is initial condition */
+case 80:
+/* rule 80 can match eol */
+YY_RULE_SETUP
+#line 825 "fortranscanner.l"
+{
+ if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ {
+ addInterface("$interface$", ifType);
+ startScope(last_entry);
+ }
+
+ // TYPE_SPEC is for old function style function result
+ result = QCString(fscanYYtext).stripWhiteSpace();
+ current->type = result;
+ yy_push_state(SubprogPrefix);
+ }
+ YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 838 "fortranscanner.l"
+{
+ // Fortran subroutine or function found
+ addSubprogram(fscanYYtext);
+ BEGIN(Subprog);
+ }
+ YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 844 "fortranscanner.l"
+{
+ // Fortran subroutine or function found
+ if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ {
+ addInterface("$interface$", ifType);
+ startScope(last_entry);
+ }
+
+ result = QCString(fscanYYtext).stripWhiteSpace();
+ addSubprogram(result);
+ yy_push_state(Subprog);
+ }
+ YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 857 "fortranscanner.l"
+{ /* ignore white space */ }
+ YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 858 "fortranscanner.l"
+{ current->name = fscanYYtext;
+ //cout << "1a==========> got " << current->type << " " << fscanYYtext << " " << yyLineNr << endl;
+ modifiers[current_root][current->name.lower()].returnName = current->name;
+
+ if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ {
+ current_root->name.replace(QRegExp("\\$interface\\$"), fscanYYtext);
+ }
+
+ BEGIN(Parameterlist);
+ }
+ YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 869 "fortranscanner.l"
+{ current->args = "("; }
+ YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 870 "fortranscanner.l"
+{
+ current->args += ")";
+ current->args = removeRedundantWhiteSpace(current->args);
+ addCurrentEntry();
+ startScope(last_entry);
+ BEGIN(SubprogBody);
+ }
+ YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 877 "fortranscanner.l"
+{ current->args += fscanYYtext;
+ CommentInPrepass *c = locatePrepassComment(yyColNr-fscanYYleng, yyColNr);
+ if (c!=NULL) {
+ if(current->argList->count()>0) {
+ current->argList->at(current->argList->count()-1)->docs = c->str;
+ }
+ }
+ }
+ YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 885 "fortranscanner.l"
+{
+ //current->type not yet available
+ QCString param = fscanYYtext;
+ // std::cout << "3=========> got parameter " << param << std::endl;
+ current->args += param;
+ Argument *arg = new Argument;
+ arg->name = param;
+ arg->type = "";
+ current->argList->append(arg);
+ }
+ YY_BREAK
+case 89:
+/* rule 89 can match eol */
+YY_RULE_SETUP
+#line 895 "fortranscanner.l"
+{
+ newLine();
+ //printf("3=========> without parameterlist \n");
+ //current->argList = ;
+ addCurrentEntry();
+ startScope(last_entry);
+ BEGIN(SubprogBody);
+}
+ YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 903 "fortranscanner.l"
+{
+ result= fscanYYtext;
+ result= result.right(result.length()-result.find("(")-1);
+ result= result.stripWhiteSpace();
+ modifiers[current_root->parent()][current_root->name.lower()].returnName = result;
+ //cout << "=====> got result " << result << endl;
+ }
+ YY_BREAK
+/*---- documentation comments --------------------------------------------------------------------*/
+case 91:
+YY_RULE_SETUP
+#line 913 "fortranscanner.l"
+{ /* backward docu comment (only one line) */
+ if (v_type != V_IGNORE) {
+ current->docLine = yyLineNr;
+ docBlockJavaStyle = FALSE;
+ docBlock.resize(0);
+ docBlockJavaStyle = Config_getBool("JAVADOC_AUTOBRIEF");
+ startCommentBlock(TRUE);
+ yy_push_state(DocBackLine);
+ }
+ }
+ YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 923 "fortranscanner.l"
+{ // contents of current comment line
+ docBlock=fscanYYtext;
+ if (v_type == V_VARIABLE)
+ {
+ Entry *tmp_entry = current;
+ current = last_entry; // temporarily switch to the previous entry
+ handleCommentBlock(docBlock,TRUE);
+ current=tmp_entry;
+ }
+ else if (v_type == V_PARAMETER)
+ {
+ parameter->docs+=docBlock;
+ }
+ yy_pop_state();
+ }
+ YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 939 "fortranscanner.l"
+{
+ yy_push_state(YY_START);
+ current->docLine = yyLineNr;
+ docBlockJavaStyle = FALSE;
+ docBlock.resize(0);
+ docBlockJavaStyle = Config_getBool("JAVADOC_AUTOBRIEF");
+ startCommentBlock(TRUE);
+ BEGIN(DocBlock);
+ //cout << "start DocBlock " << endl;
+ }
+ YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 950 "fortranscanner.l"
+{ // contents of current comment line
+ docBlock+=fscanYYtext;
+ }
+ YY_BREAK
+case 95:
+/* rule 95 can match eol */
+YY_RULE_SETUP
+#line 953 "fortranscanner.l"
+{ // comment block (next line is also comment line)
+ docBlock+="\n"; // \n is necessary for lists
+ newLine();
+ }
+ YY_BREAK
+case 96:
+/* rule 96 can match eol */
+YY_RULE_SETUP
+#line 957 "fortranscanner.l"
+{ // comment block ends at the end of this line
+ //cout <<"3=========> comment block : "<< docBlock << endl;
+ yyColNr -= 1;
+ unput(*fscanYYtext);
+ handleCommentBlock(docBlock,TRUE);
+ yy_pop_state();
+ }
+ YY_BREAK
+/*------------------------------------------------------------------------------------------------*/
+case 97:
+/* rule 97 can match eol */
+YY_RULE_SETUP
+#line 967 "fortranscanner.l"
+{
+ newLine();
+ //if (debugStr.stripWhiteSpace().length() > 0) cout << "ignored text: " << debugStr << " state: " <<YY_START << endl;
+ debugStr="";
+ }
+ YY_BREAK
+/*---- error: EOF in wrong state --------------------------------------------------------------------*/
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(Subprog):
+case YY_STATE_EOF(SubprogPrefix):
+case YY_STATE_EOF(Parameterlist):
+case YY_STATE_EOF(SubprogBody):
+case YY_STATE_EOF(SubprogBodyContains):
+case YY_STATE_EOF(Start):
+case YY_STATE_EOF(Comment):
+case YY_STATE_EOF(Module):
+case YY_STATE_EOF(Program):
+case YY_STATE_EOF(ModuleBody):
+case YY_STATE_EOF(ModuleBodyContains):
+case YY_STATE_EOF(AttributeList):
+case YY_STATE_EOF(Variable):
+case YY_STATE_EOF(Initialization):
+case YY_STATE_EOF(ArrayInitializer):
+case YY_STATE_EOF(Typedef):
+case YY_STATE_EOF(TypedefBody):
+case YY_STATE_EOF(TypedefBodyContains):
+case YY_STATE_EOF(InterfaceBody):
+case YY_STATE_EOF(StrIgnore):
+case YY_STATE_EOF(String):
+case YY_STATE_EOF(Use):
+case YY_STATE_EOF(UseOnly):
+case YY_STATE_EOF(ModuleProcedure):
+case YY_STATE_EOF(Prepass):
+case YY_STATE_EOF(DocBlock):
+case YY_STATE_EOF(DocBackLine):
+case YY_STATE_EOF(EndDoc):
+#line 976 "fortranscanner.l"
+{
+ if ( include_stack_ptr <= 0 ) {
+ if (YY_START!=INITIAL && YY_START!=Start) {
+ //fprintf(stderr,"==== Error: EOF reached in wrong state (end missing)");
+ scanner_abort();
+ }
+ yyterminate();
+ } else {
+ popBuffer();
+ }
+ }
+ YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 987 "fortranscanner.l"
+{
+ //debugStr+=fscanYYtext;
+ //printf("I:%c\n", *fscanYYtext);
+ } // ignore remaining text
+ YY_BREAK
+/**********************************************************************************/
+/**********************************************************************************/
+/**********************************************************************************/
+case 99:
+YY_RULE_SETUP
+#line 995 "fortranscanner.l"
+ECHO;
+ YY_BREAK
+#line 25250 "<stdout>"
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed fscanYYin at a new source and called
+ * fscanYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = fscanYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( fscanYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * fscanYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of fscanYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ fscanYYrestart(fscanYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) fscanYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 8694 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 8694 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 8693);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up fscanYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ fscanYYrestart(fscanYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( fscanYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve fscanYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void fscanYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ fscanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ fscanYY_create_buffer(fscanYYin,YY_BUF_SIZE );
+ }
+
+ fscanYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ fscanYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void fscanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * fscanYYpop_buffer_state();
+ * fscanYYpush_buffer_state(new_buffer);
+ */
+ fscanYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ fscanYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (fscanYYwrap()) processing, but the only time this flag
+ * is looked at is after fscanYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void fscanYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ fscanYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE fscanYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) fscanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in fscanYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) fscanYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in fscanYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ fscanYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with fscanYY_create_buffer()
+ *
+ */
+ void fscanYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ fscanYYfree((void *) b->yy_ch_buf );
+
+ fscanYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a fscanYYrestart() or at EOF.
+ */
+ static void fscanYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ fscanYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then fscanYY_init_buffer was _probably_
+ * called from fscanYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void fscanYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ fscanYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void fscanYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ fscanYYensure_buffer_stack();
+
+ /* This block is copied from fscanYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from fscanYY_switch_to_buffer. */
+ fscanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void fscanYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ fscanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ fscanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void fscanYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)fscanYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in fscanYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)fscanYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in fscanYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE fscanYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) fscanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in fscanYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ fscanYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to fscanYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * fscanYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE fscanYY_scan_string (yyconst char * yystr )
+{
+
+ return fscanYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to fscanYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE fscanYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) fscanYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in fscanYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = fscanYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in fscanYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+ static void yy_push_state (int new_state )
+{
+ if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) )
+ {
+ yy_size_t new_size;
+
+ (yy_start_stack_depth) += YY_START_STACK_INCR;
+ new_size = (yy_start_stack_depth) * sizeof( int );
+
+ if ( ! (yy_start_stack) )
+ (yy_start_stack) = (int *) fscanYYalloc(new_size );
+
+ else
+ (yy_start_stack) = (int *) fscanYYrealloc((void *) (yy_start_stack),new_size );
+
+ if ( ! (yy_start_stack) )
+ YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
+ }
+
+ (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START;
+
+ BEGIN(new_state);
+}
+
+ static void yy_pop_state (void)
+{
+ if ( --(yy_start_stack_ptr) < 0 )
+ YY_FATAL_ERROR( "start-condition stack underflow" );
+
+ BEGIN((yy_start_stack)[(yy_start_stack_ptr)]);
+}
+
+ static int yy_top_state (void)
+{
+ return (yy_start_stack)[(yy_start_stack_ptr) - 1];
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up fscanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ fscanYYtext[fscanYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = fscanYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ fscanYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int fscanYYget_lineno (void)
+{
+
+ return fscanYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *fscanYYget_in (void)
+{
+ return fscanYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *fscanYYget_out (void)
+{
+ return fscanYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t fscanYYget_leng (void)
+{
+ return fscanYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *fscanYYget_text (void)
+{
+ return fscanYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void fscanYYset_lineno (int line_number )
+{
+
+ fscanYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see fscanYY_switch_to_buffer
+ */
+void fscanYYset_in (FILE * in_str )
+{
+ fscanYYin = in_str ;
+}
+
+void fscanYYset_out (FILE * out_str )
+{
+ fscanYYout = out_str ;
+}
+
+int fscanYYget_debug (void)
+{
+ return fscanYY_flex_debug;
+}
+
+void fscanYYset_debug (int bdebug )
+{
+ fscanYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from fscanYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_start_stack_ptr) = 0;
+ (yy_start_stack_depth) = 0;
+ (yy_start_stack) = NULL;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ fscanYYin = stdin;
+ fscanYYout = stdout;
+#else
+ fscanYYin = (FILE *) 0;
+ fscanYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * fscanYYlex_init()
+ */
+ return 0;
+}
+
+/* fscanYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int fscanYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ fscanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ fscanYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ fscanYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Destroy the start condition stack. */
+ fscanYYfree((yy_start_stack) );
+ (yy_start_stack) = NULL;
+
+ fscanYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * fscanYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *fscanYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *fscanYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void fscanYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see fscanYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 995 "fortranscanner.l"
+
+
+//----------------------------------------------------------------------------
+
+#if 0
+static void extractPrefix(QCString &text)
+{
+ int prefixIndex = 0;
+ int curIndex = 0;
+ bool cont = TRUE;
+ const char* pre[] = {"RECURSIVE","PURE","ELEMENTAL"};
+ while(cont)
+ {
+ cont = FALSE;
+ for(unsigned int i=0; i<3; i++)
+ {
+ if((prefixIndex=text.find(pre[i], curIndex, FALSE))==0)
+ {
+ text.remove(0,strlen(pre[i]));
+ text.stripWhiteSpace();
+ cont = TRUE;
+ }
+ }
+ }
+}
+#endif
+
+static void newLine() {
+ yyLineNr++;
+ yyLineNr+=lineCountPrepass;
+ lineCountPrepass=0;
+ comments.clear();
+}
+
+static CommentInPrepass* locatePrepassComment(int from, int to) {
+ //printf("Locate %d-%d\n", from, to);
+ for(uint i=0; i<comments.count(); i++) { // todo: optimize
+ int c = comments.at(i)->column;
+ //printf("Candidate %d\n", c);
+ if (c>=from && c<=to) {
+ // comment for previous variable or parameter
+ return comments.at(i);
+ }
+ }
+ return NULL;
+}
+
+static void updateVariablePrepassComment(int from, int to) {
+ CommentInPrepass *c = locatePrepassComment(from, to);
+ if (c!=NULL && v_type == V_VARIABLE) {
+ last_entry->brief = c->str;
+ } else if (c!=NULL && v_type == V_PARAMETER) {
+ Argument *parameter = getParameter(argName);
+ if (parameter) parameter->docs = c->str;
+ }
+}
+
+static int getAmpersandAtTheStart(const char *buf, int length)
+{
+ for(int i=0; i<length; i++) {
+ switch(buf[i]) {
+ case ' ':
+ case '\t':
+ break;
+ case '&':
+ return i;
+ default:
+ return -1;
+ }
+ }
+ return -1;
+}
+
+/* Returns ampersand index, comment start index or -1 if neither exist.*/
+static int getAmpOrExclAtTheEnd(const char *buf, int length)
+{
+ // Avoid ampersands in string and comments
+ int parseState = Start;
+ char quoteSymbol = 0;
+ int ampIndex = -1;
+ int commentIndex = -1;
+
+ for(int i=0; i<length && parseState!=Comment; i++)
+ {
+ // When in string, skip backslashes
+ // Legacy code, not sure whether this is correct?
+ if(parseState==String)
+ {
+ if(buf[i]=='\\') i++;
+ }
+
+ switch(buf[i])
+ {
+ case '\'':
+ case '"':
+ // Close string, if quote symbol matches.
+ // Quote symbol is set iff parseState==String
+ if(buf[i]==quoteSymbol)
+ {
+ parseState = Start;
+ quoteSymbol = 0;
+ }
+ // Start new string, if not already in string or comment
+ else if(parseState==Start)
+ {
+ parseState = String;
+ quoteSymbol = buf[i];
+ }
+ ampIndex = -1; // invalidate prev ampersand
+ break;
+ case '!':
+ // When in string or comment, ignore exclamation mark
+ if(parseState==Start)
+ {
+ parseState = Comment;
+ commentIndex = i;
+ }
+ break;
+ case ' ': // ignore whitespace
+ case '\t':
+ case '\n': // this may be at the end of line
+ break;
+ case '&':
+ ampIndex = i;
+ break;
+ default:
+ ampIndex = -1; // invalidate prev ampersand
+ }
+ }
+
+ if (ampIndex>=0)
+ return ampIndex;
+ else
+ return commentIndex;
+}
+
+/* Although comments at the end of continuation line are grabbed by this function,
+* we still do not know how to use them later in parsing.
+*/
+void truncatePrepass(int index)
+{
+ int length = inputStringPrepass.length();
+ for (int i=index+1; i<length; i++) {
+ if (inputStringPrepass[i]=='!' && i<length-1 && inputStringPrepass[i+1]=='<') { // save comment
+ struct CommentInPrepass *c=new CommentInPrepass(index, inputStringPrepass.right(length-i-2));
+ comments.append(c);
+ }
+ }
+ inputStringPrepass.truncate(index);
+}
+
+// simplified way to know if this is fixed form
+// duplicate in fortrancode.l
+static bool recognizeFixedForm(const char* contents)
+{
+ int column=0;
+ bool skipLine=FALSE;
+
+ for(int i=0;;i++) {
+ column++;
+
+ switch(contents[i]) {
+ case '\n':
+ column=0;
+ skipLine=FALSE;
+ break;
+ case ' ':
+ break;
+ case '\000':
+ return FALSE;
+ case 'C':
+ case 'c':
+ case '*':
+ if(column==1) return TRUE;
+ if(skipLine) break;
+ return FALSE;
+ case '!':
+ if(column>1 && column<7) return FALSE;
+ skipLine=TRUE;
+ break;
+ default:
+ if(skipLine) break;
+ if(column==7) return TRUE;
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+/* This function assumes that contents has at least size=length+1 */
+static void insertCharacter(char *contents, int length, int pos, char c)
+{
+ // shift tail by one character
+ for(int i=length; i>pos; i--)
+ contents[i]=contents[i-1];
+ // set the character
+ contents[pos] = c;
+}
+
+/* change comments and bring line continuation character to previous line */
+static const char* prepassFixedForm(const char* contents)
+{
+ int column=0;
+ int prevLineLength=0;
+ int prevLineAmpOrExclIndex=-1;
+ bool emptyLabel=TRUE;
+ int newContentsSize = strlen(contents)+2; // \000 and one spare character (to avoid reallocation)
+ char* newContents = (char*)malloc(newContentsSize);
+
+ for(int i=0, j=0;;i++,j++) {
+ if(j>=newContentsSize-1) { // check for one spare character, which may be eventually used below (by &)
+ newContents = (char*)realloc(newContents, newContentsSize+1000);
+ newContentsSize = newContentsSize+1000;
+ }
+
+ column++;
+ char c = contents[i];
+ switch(c) {
+ case '\n':
+ prevLineLength=column;
+ prevLineAmpOrExclIndex=getAmpOrExclAtTheEnd(&contents[i-prevLineLength+1], prevLineLength);
+ column=0;
+ emptyLabel=TRUE;
+ newContents[j]=c;
+ break;
+ case ' ':
+ newContents[j]=c;
+ break;
+ case '\000':
+ newContents[j]='\000';
+ return newContents;
+ case 'C':
+ case 'c':
+ case '*':
+ emptyLabel=FALSE;
+ if(column==1)
+ newContents[j]='!';
+ else
+ newContents[j]=c;
+ break;
+ default:
+ if(column==6 && emptyLabel) { // continuation
+ newContents[j]=' ';
+
+ if(prevLineAmpOrExclIndex==-1) { // add & just before end of previous line
+ insertCharacter(newContents, j+1, (j+1)-6-1, '&');
+ j++;
+ } else { // add & just before end of previous line comment
+ insertCharacter(newContents, j+1, (j+1)-6-prevLineLength+prevLineAmpOrExclIndex, '&');
+ j++;
+ }
+ } else {
+ newContents[j]=c;
+ emptyLabel=FALSE;
+ }
+ break;
+ }
+ }
+ return newContents;
+}
+
+static void pushBuffer(QCString& buffer)
+{
+ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
+ {
+ fprintf( stderr, "Stack buffers nested too deeply" );
+ exit( 1 );
+ }
+ include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
+ fscanYY_switch_to_buffer(fscanYY_scan_string(buffer));
+
+ //fprintf(stderr, "--PUSH--%s", (const char *)buffer);
+ buffer = NULL;
+}
+
+static void popBuffer() {
+ //fprintf(stderr, "--POP--");
+ include_stack_ptr --;
+ fscanYY_delete_buffer(YY_CURRENT_BUFFER );
+ fscanYY_switch_to_buffer(include_stack[include_stack_ptr] );
+}
+
+/** used to copy entry to an interface module procedure */
+static void copyEntry(Entry *dest, Entry *src)
+{
+ dest->type = src->type;
+ dest->fileName = src->fileName;
+ dest->bodyLine = src->bodyLine;
+ dest->args = src->args;
+ dest->argList = new ArgumentList(*src->argList);
+ dest->doc = src->doc;
+ dest->brief = src->brief;
+}
+
+/** fill empty interface module procedures with info from
+ corresponding module subprogs
+ @TODO: handle procedures in used modules
+*/
+void resolveModuleProcedures(QList<Entry> &moduleProcedures, Entry *current_root)
+{
+ if (moduleProcedures.isEmpty()) return;
+
+ EntryListIterator eli1(moduleProcedures);
+ // for all module procedures
+ for (Entry *ce1; (ce1=eli1.current()); ++eli1)
+ {
+ // check all entries in this module
+ EntryListIterator eli2(*current_root->children());
+ for (Entry *ce2; (ce2=eli2.current()); ++eli2)
+ {
+ if (ce1->name == ce2->name)
+ {
+ copyEntry(ce1, ce2);
+ }
+ } // for procedures in current module
+ } // for all interface module procedures
+ moduleProcedures.clear();
+}
+
+static bool isTypeName(QCString name)
+{
+ name = name.lower();
+ return name=="integer" || name == "real" ||
+ name=="complex" || name == "logical";
+}
+
+/*! Extracts string which resides within parentheses of provided string. */
+static QCString extractFromParens(const QCString name)
+{
+ QCString extracted = name;
+ int start = extracted.find("(");
+ if (start != -1)
+ {
+ extracted.remove(0, start+1);
+ }
+ int end = extracted.findRev(")");
+ if (end != -1)
+ {
+ int length = extracted.length();
+ extracted.remove(end, length);
+ }
+ extracted = extracted.stripWhiteSpace();
+
+ return extracted;
+}
+
+/*! Adds passed modifiers to these modifiers.*/
+SymbolModifiers& SymbolModifiers::operator|=(const SymbolModifiers &mdfs)
+{
+ if (mdfs.protection!=NONE_P) protection = mdfs.protection;
+ if (mdfs.direction!=NONE_D) direction = mdfs.direction;
+ optional |= mdfs.optional;
+ if (!mdfs.dimension.isNull()) dimension = mdfs.dimension;
+ allocatable |= mdfs.allocatable;
+ external |= mdfs.external;
+ intrinsic |= mdfs.intrinsic;
+ parameter |= mdfs.parameter;
+ pointer |= mdfs.pointer;
+ target |= mdfs.target;
+ save |= mdfs.save;
+ deferred |= mdfs.deferred;
+ nonoverridable |= mdfs.nonoverridable;
+ nopass |= mdfs.nopass;
+ pass |= mdfs.pass;
+ passVar = mdfs.passVar;
+ return *this;
+}
+
+/*! Extracts and adds passed modifier to these modifiers.*/
+SymbolModifiers& SymbolModifiers::operator|=(QCString mdfString)
+{
+ mdfString = mdfString.lower();
+ SymbolModifiers newMdf;
+
+ if (mdfString.find("dimension")==0)
+ {
+ newMdf.dimension=mdfString;
+ }
+ else if (mdfString.contains("intent"))
+ {
+ QCString tmp = extractFromParens(mdfString);
+ bool isin = tmp.contains("in");
+ bool isout = tmp.contains("out");
+ if (isin && isout) newMdf.direction = SymbolModifiers::INOUT;
+ else if (isin) newMdf.direction = SymbolModifiers::IN;
+ else if (isout) newMdf.direction = SymbolModifiers::OUT;
+ }
+ else if (mdfString=="public")
+ {
+ newMdf.protection = SymbolModifiers::PUBLIC;
+ }
+ else if (mdfString=="private")
+ {
+ newMdf.protection = SymbolModifiers::PRIVATE;
+ }
+ else if (mdfString=="optional")
+ {
+ newMdf.optional = TRUE;
+ }
+ else if (mdfString=="allocatable")
+ {
+ newMdf.allocatable = TRUE;
+ }
+ else if (mdfString=="external")
+ {
+ newMdf.external = TRUE;
+ }
+ else if (mdfString=="intrinsic")
+ {
+ newMdf.intrinsic = TRUE;
+ }
+ else if (mdfString=="parameter")
+ {
+ newMdf.parameter = TRUE;
+ }
+ else if (mdfString=="pointer")
+ {
+ newMdf.pointer = TRUE;
+ }
+ else if (mdfString=="target")
+ {
+ newMdf.target = TRUE;
+ }
+ else if (mdfString=="save")
+ {
+ newMdf.save = TRUE;
+ }
+ else if (mdfString=="nopass")
+ {
+ newMdf.nopass = TRUE;
+ }
+ else if (mdfString=="deferred")
+ {
+ newMdf.deferred = TRUE;
+ }
+ else if (mdfString=="non_overridable")
+ {
+ newMdf.nonoverridable = TRUE;
+ }
+ else if (mdfString.contains("pass"))
+ {
+ newMdf.pass = TRUE;
+ if (mdfString.contains("("))
+ newMdf.passVar = extractFromParens(mdfString);
+ else
+ newMdf.passVar = "";
+ }
+
+ (*this) |= newMdf;
+ return *this;
+}
+
+/*! For debugging purposes. */
+//ostream& operator<<(ostream& out, const SymbolModifiers& mdfs)
+//{
+// out<<mdfs.protection<<", "<<mdfs.direction<<", "<<mdfs.optional<<
+// ", "<<(mdfs.dimension.isNull() ? "" : mdfs.dimension.latin1())<<
+// ", "<<mdfs.allocatable<<", "<<mdfs.external<<", "<<mdfs.intrinsic;
+//
+// return out;
+//}
+
+/*! Find argument with given name in \a subprog entry. */
+static Argument *findArgument(Entry* subprog, QCString name, bool byTypeName = FALSE)
+{
+ QCString cname(name.lower());
+ for (unsigned int i=0; i<subprog->argList->count(); i++)
+ {
+ Argument *arg = subprog->argList->at(i);
+ if ((!byTypeName && arg->name.lower() == cname) ||
+ (byTypeName && arg->type.lower() == cname)
+ )
+ {
+ return arg;
+ }
+ }
+ return 0;
+}
+
+/*! Find function with given name in \a entry. */
+#if 0
+static Entry *findFunction(Entry* entry, QCString name)
+{
+ QCString cname(name.lower());
+
+ EntryListIterator eli(*entry->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (ce->section != Entry::FUNCTION_SEC)
+ continue;
+
+ if (ce->name.lower() == cname)
+ return ce;
+ }
+
+ return 0;
+}
+#endif
+
+/*! Apply modifiers stored in \a mdfs to the \a typeName string. */
+static QCString applyModifiers(QCString typeName, SymbolModifiers& mdfs)
+{
+ if (!mdfs.dimension.isNull())
+ {
+ typeName += ",";
+ typeName += mdfs.dimension;
+ }
+ if (mdfs.direction!=SymbolModifiers::NONE_D)
+ {
+ typeName += ",";
+ typeName += directionStrs[mdfs.direction];
+ }
+ if (mdfs.optional)
+ {
+ typeName += ",";
+ typeName += "optional";
+ }
+ if (mdfs.allocatable)
+ {
+ typeName += ",";
+ typeName += "allocatable";
+ }
+ if (mdfs.external)
+ {
+ typeName += ",";
+ typeName += "external";
+ }
+ if (mdfs.intrinsic)
+ {
+ typeName += ",";
+ typeName += "intrinsic";
+ }
+ if (mdfs.parameter)
+ {
+ typeName += ",";
+ typeName += "parameter";
+ }
+ if (mdfs.pointer)
+ {
+ typeName += ",";
+ typeName += "pointer";
+ }
+ if (mdfs.target)
+ {
+ typeName += ",";
+ typeName += "target";
+ }
+ if (mdfs.save)
+ {
+ typeName += ",";
+ typeName += "save";
+ }
+ if (mdfs.deferred)
+ {
+ typeName += ",";
+ typeName += "deferred";
+ }
+ if (mdfs.nonoverridable)
+ {
+ typeName += ",";
+ typeName += "non_overridable";
+ }
+ if (mdfs.nopass)
+ {
+ typeName += ",";
+ typeName += "nopass";
+ }
+ if (mdfs.pass)
+ {
+ typeName += ",";
+ typeName += "pass";
+ if (!mdfs.passVar.isEmpty())
+ typeName += "(" + mdfs.passVar + ")";
+ }
+ if (mdfs.protection == SymbolModifiers::PUBLIC)
+ {
+ typeName += ",";
+ typeName += "public";
+ }
+ else if (mdfs.protection == SymbolModifiers::PRIVATE)
+ {
+ typeName += ",";
+ typeName += "private";
+ }
+
+ return typeName;
+}
+
+/*! Apply modifiers stored in \a mdfs to the \a arg argument. */
+static void applyModifiers(Argument *arg, SymbolModifiers& mdfs)
+{
+ QCString tmp = arg->type;
+ arg->type = applyModifiers(tmp, mdfs);
+}
+
+/*! Apply modifiers stored in \a mdfs to the \a ent entry. */
+static void applyModifiers(Entry *ent, SymbolModifiers& mdfs)
+{
+ QCString tmp = ent->type;
+ ent->type = applyModifiers(tmp, mdfs);
+
+ if (mdfs.protection == SymbolModifiers::PUBLIC)
+ ent->protection = Public;
+ else if (mdfs.protection == SymbolModifiers::PRIVATE)
+ ent->protection = Private;
+}
+
+/*! Starts the new scope in fortran program. Consider using this function when
+ * starting module, interface, function or other program block.
+ * \see endScope()
+ */
+static void startScope(Entry *scope)
+{
+ //cout<<"start scope: "<<scope->name<<endl;
+ current_root= scope; /* start substructure */
+
+ QMap<QCString,SymbolModifiers> mdfMap;
+ modifiers.insert(scope, mdfMap);
+}
+
+/*! Ends scope in fortran program: may update subprogram arguments or module variable attributes.
+ * \see startScope()
+ */
+static bool endScope(Entry *scope, bool isGlobalRoot)
+{
+ //cout<<"end scope: "<<scope->name<<endl;
+ if (current_root->parent() || isGlobalRoot)
+ {
+ current_root= current_root->parent(); /* end substructure */
+ }
+ else
+ {
+ fprintf(stderr,"parse error in end <scopename>");
+ scanner_abort();
+ return FALSE;
+ }
+
+ // update variables or subprogram arguments with modifiers
+ QMap<QCString,SymbolModifiers>& mdfsMap = modifiers[scope];
+
+ if (scope->section == Entry::FUNCTION_SEC)
+ {
+ // iterate all symbol modifiers of the scope
+ for (QMap<QCString,SymbolModifiers>::Iterator it=mdfsMap.begin(); it!=mdfsMap.end(); it++)
+ {
+ //cout<<it.key()<<": "<<it.data()<<endl;
+ Argument *arg = findArgument(scope, it.key());
+
+ if (arg)
+ applyModifiers(arg, it.data());
+ }
+
+ // find return type for function
+ //cout<<"RETURN NAME "<<modifiers[current_root][scope->name.lower()].returnName<<endl;
+ QCString returnName = modifiers[current_root][scope->name.lower()].returnName.lower();
+ if (modifiers[scope].contains(returnName))
+ {
+ scope->type = modifiers[scope][returnName].type; // returning type works
+ applyModifiers(scope, modifiers[scope][returnName]); // returning array works
+ }
+
+ }
+ if (scope->section == Entry::CLASS_SEC)
+ { // was INTERFACE_SEC
+ if (scope->parent()->section == Entry::FUNCTION_SEC)
+ { // interface within function
+ // iterate functions of interface and
+ // try to find types for dummy(ie. argument) procedures.
+ //cout<<"Search in "<<scope->name<<endl;
+ EntryListIterator eli(*scope->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (ce->section != Entry::FUNCTION_SEC)
+ continue;
+
+ Argument *arg = findArgument(scope->parent(), ce->name, TRUE);
+ if (arg != 0)
+ {
+ // set type of dummy procedure argument to interface
+ arg->name = arg->type;
+ arg->type = scope->name;
+ }
+ }
+ }
+ }
+ if (scope->section!=Entry::FUNCTION_SEC)
+ { // not function section
+ // iterate variables: get and apply modifiers
+ EntryListIterator eli(*scope->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (ce->section != Entry::VARIABLE_SEC && ce->section != Entry::FUNCTION_SEC)
+ continue;
+
+ //cout<<ce->name<<", "<<mdfsMap.contains(ce->name.lower())<<mdfsMap.count()<<endl;
+ if (mdfsMap.contains(ce->name.lower()))
+ applyModifiers(ce, mdfsMap[ce->name.lower()]);
+ }
+ }
+
+ // clear all modifiers of the scope
+ modifiers.remove(scope);
+
+ return TRUE;
+}
+
+//! Return full name of the entry. Sometimes we must combine several names recursively.
+static QCString getFullName(Entry *e)
+{
+ QCString name = e->name;
+ if (e->section == Entry::CLASS_SEC // || e->section == Entry::INTERFACE_SEC
+ || !e->parent() || e->parent()->name.isEmpty())
+ return name;
+
+ return getFullName(e->parent())+"::"+name;
+}
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+
+ while ( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+static void initParser()
+{
+ last_entry = 0;
+}
+
+static void initEntry()
+{
+ current->protection = defaultProtection ;
+ current->mtype = mtype;
+ current->virt = virt;
+ current->stat = gstat;
+ current->lang = SrcLangExt_F90;
+ initGroupInfo(current);
+}
+
+/**
+ adds current entry to current_root and creates new current
+*/
+static void addCurrentEntry()
+{
+ //printf("===Adding entry %s to %s\n", current->name.data(), current_root->name.data());
+ current_root->addSubEntry(current);
+ last_entry = current;
+ current = new Entry ;
+ initEntry();
+}
+
+static int max(int a, int b) {return a>b?a:b;}
+
+static void addModule(const char *name, bool isModule)
+{
+ //fprintf(stderr, "0=========> got module %s\n", name);
+
+ if (isModule)
+ current->section = Entry::NAMESPACE_SEC;
+ else
+ current->section = Entry::FUNCTION_SEC;
+
+ if (name!=NULL)
+ {
+ current->name = name;
+ }
+ else
+ {
+ QCString fname = yyFileName;
+ int index = max(fname.findRev('/'), fname.findRev('\\'));
+ fname = fname.right(fname.length()-index-1);
+ fname = fname.prepend("__").append("__");
+ current->name = fname;
+ }
+ current->type = "program";
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr; // used for source reference
+ current->protection = Public ;
+ addCurrentEntry();
+ startScope(last_entry);
+}
+
+
+static void addSubprogram(const char *text)
+{
+ //fprintf(stderr,"1=========> got subprog, type: %s\n",text);
+ current->section = Entry::FUNCTION_SEC ;
+ QCString subtype = text; subtype=subtype.lower().stripWhiteSpace();
+ if (!current->type) current->type = subtype;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr; // used for source reference
+ current->startLine = -1; // ??? what is startLine for?
+ current->args.resize(0);
+ current->argList->clear();
+ docBlock.resize(0);
+}
+
+/*! Adds interface to the root entry.
+ * \note Code was brought to this procedure from the parser,
+ * because there was/is idea to use it in several parts of the parser.
+ */
+static void addInterface(QCString name, InterfaceType type)
+{
+ if (YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBody); //anon program
+ }
+
+ current->section = Entry::CLASS_SEC; // was Entry::INTERFACE_SEC;
+ current->spec = Entry::Interface;
+ current->name = name;
+
+ switch (type)
+ {
+ case IF_ABSTRACT:
+ current->type = "abstract";
+ break;
+
+ case IF_GENERIC:
+ current->type = "generic";
+ break;
+
+ case IF_SPECIFIC:
+ case IF_NONE:
+ default:
+ current->type = "";
+ }
+
+ /* if type is part of a module, mod name is necessary for output */
+ if ((current_root) &&
+ (current_root->section == Entry::CLASS_SEC ||
+ current_root->section == Entry::NAMESPACE_SEC))
+ {
+ current->name= current_root->name + "::" + current->name;
+ }
+
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr;
+ addCurrentEntry();
+}
+
+
+//-----------------------------------------------------------------------------
+
+/*! Get the argument \a name.
+ */
+static Argument* getParameter(const QCString &name)
+{
+ // std::cout<<"addFortranParameter(): "<<name<<" DOCS:"<<(docs.isNull()?QCString("null"):docs)<<std::endl;
+ Argument *ret = 0;
+ if (current_root->argList==0) return 0;
+ ArgumentListIterator ali(*current_root->argList);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (a->name.lower()==name.lower())
+ {
+ ret=a;
+ //printf("parameter found: %s\n",(const char*)name);
+ break;
+ }
+ } // for
+ return ret;
+}
+
+ //----------------------------------------------------------------------------
+static void startCommentBlock(bool brief)
+{
+ if (brief)
+ {
+ current->briefFile = yyFileName;
+ current->briefLine = yyLineNr;
+ }
+ else
+ {
+ current->docFile = yyFileName;
+ current->docLine = yyLineNr;
+ }
+}
+
+ //----------------------------------------------------------------------------
+static void handleCommentBlock(const QCString &doc,bool brief)
+{
+ docBlockInBody = FALSE;
+ bool needsEntry = FALSE;
+ static bool hideInBodyDocs = Config_getBool("HIDE_IN_BODY_DOCS");
+ int position=0;
+ if (docBlockInBody && hideInBodyDocs) return;
+ //fprintf(stderr,"call parseCommentBlock [%s]\n",doc.data());
+ int lineNr = brief ? current->briefLine : current->docLine;
+ while (parseCommentBlock(
+ g_thisParser,
+ docBlockInBody ? last_entry : current,
+ doc, // text
+ yyFileName, // file
+ lineNr,
+ docBlockInBody ? FALSE : brief,
+ docBlockInBody ? FALSE : docBlockJavaStyle,
+ docBlockInBody,
+ defaultProtection,
+ position,
+ needsEntry
+ ))
+ {
+ //fprintf(stderr,"parseCommentBlock position=%d [%s] needsEntry=%d\n",position,doc.data()+position,needsEntry);
+ if (needsEntry) addCurrentEntry();
+ }
+ //fprintf(stderr,"parseCommentBlock position=%d [%s] needsEntry=%d\n",position,doc.data()+position,needsEntry);
+
+ if (needsEntry) addCurrentEntry();
+}
+
+//----------------------------------------------------------------------------
+static int level=0;
+static void debugCompounds(Entry *rt) // print Entry structure (for debugging)
+{
+ level++;
+ printf("%d) debugCompounds(%s) line %d\n",level, rt->name.data(), rt->bodyLine);
+ EntryListIterator eli(*rt->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ debugCompounds(ce);
+ }
+level--;
+}
+
+
+static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+{
+ initParser();
+
+ defaultProtection = Public;
+ inputString = fileBuf;
+ inputPosition = 0;
+ inputStringPrepass = NULL;
+ inputPositionPrepass = 0;
+
+ //anonCount = 0; // don't reset per file
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ current_root = rt;
+ global_root = rt;
+ inputFile.setName(fileName);
+ if (inputFile.open(IO_ReadOnly))
+ {
+ isFixedForm = recognizeFixedForm(fileBuf);
+
+ if (isFixedForm) {
+ printf("Prepassing fixed form of %s\n", fileName);
+ //printf("---strlen=%d\n", strlen(fileBuf));
+ //clock_t start=clock();
+
+ inputString = prepassFixedForm(fileBuf);
+
+ //clock_t end=clock();
+ //printf("CPU time used=%f\n", ((double) (end-start))/CLOCKS_PER_SEC);
+ }
+
+ yyLineNr= 1 ;
+ yyFileName = fileName;
+ msg("Parsing file %s...\n",yyFileName.data());
+
+ startScope(rt); // implies current_root = rt
+ initParser();
+ groupEnterFile(yyFileName,yyLineNr);
+
+ current = new Entry;
+ current->lang = SrcLangExt_F90;
+ current->name = yyFileName;
+ current->section = Entry::SOURCE_SEC;
+ current_root->addSubEntry(current);
+ file_root = current;
+ current = new Entry;
+ current->lang = SrcLangExt_F90;
+
+ fscanYYrestart( fscanYYin );
+ {
+ BEGIN( Start );
+ }
+
+ fscanYYlex();
+ groupLeaveFile(yyFileName,yyLineNr);
+
+ endScope(current_root, TRUE); // TRUE - global root
+
+ //debugCompounds(rt); //debug
+
+ rt->program.resize(0);
+ delete current; current=0;
+ moduleProcedures.clear();
+ if (isFixedForm) {
+ free((char*)inputString);
+ inputString=NULL;
+ }
+
+ inputFile.close();
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void FortranLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+{
+ g_thisParser = this;
+ ::parseMain(fileName,fileBuf,root);
+}
+
+void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
+ const char * scopeName,
+ const QCString & input,
+ bool isExampleBlock,
+ const char * exampleName,
+ FileDef * fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ MemberDef *memberDef,
+ bool showLineNumbers
+ )
+{
+ ::parseFortranCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
+ fileDef,startLine,endLine,inlineFragment,memberDef,
+ showLineNumbers);
+}
+
+bool FortranLanguageScanner::needsPreprocessing(const QCString &extension)
+{
+ return !(extension==".f"||extension==".f90"||
+ extension==".f95"||extension==".f03");
+}
+void FortranLanguageScanner::resetCodeParserState()
+{
+ ::resetFortranCodeParserState();
+}
+
+void FortranLanguageScanner::parsePrototype(const char *text)
+{
+ (void)text;
+}
+
+static void scanner_abort()
+{
+ fprintf(stderr,"********************************************************************\n");
+ fprintf(stderr,"Error in file %s line: %d, state: %d\n",yyFileName.data(),yyLineNr,YY_START);
+ fprintf(stderr,"********************************************************************\n");
+
+ EntryListIterator eli(*global_root->children());
+ Entry *ce;
+ bool start=FALSE;
+
+ for (;(ce=eli.current());++eli)
+ {
+ if (ce == file_root) start=TRUE;
+ if (start) ce->reset();
+ }
+
+ // dummy call to avoid compiler warning
+ (void)yy_top_state();
+
+ return;
+ //exit(-1);
+}
+
+//----------------------------------------------------------------------------
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void fscannerYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
+
diff --git a/src/fortranscanner.h b/src/fortranscanner.h
new file mode 100644
index 0000000..02cf6e0
--- /dev/null
+++ b/src/fortranscanner.h
@@ -0,0 +1,51 @@
+/******************************************************************************
+ *
+ * $Id: fortranscanner.h,v 1.1 2006/08/23 07:44:03 zdv058 Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SCANNER_FORTRAN_H
+#define SCANNER_FORTRAN_H
+
+#include "parserintf.h"
+
+/** \brief Fortran language parser using state-based lexical scanning.
+ *
+ * This is the Fortran language parser for doxygen.
+ */
+class FortranLanguageScanner : public ParserInterface
+{
+ public:
+ virtual ~FortranLanguageScanner() {}
+ void parseInput(const char *fileName,
+ const char *fileBuf,
+ Entry *root);
+ bool needsPreprocessing(const QCString &extension);
+ void parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName=0,
+ FileDef *fileDef=0,
+ int startLine=-1,
+ int endLine=-1,
+ bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,
+ bool showLineNumbers=TRUE
+ );
+ void resetCodeParserState();
+ void parsePrototype(const char *text);
+};
+
+#endif
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
new file mode 100644
index 0000000..c53a723
--- /dev/null
+++ b/src/fortranscanner.l
@@ -0,0 +1,2076 @@
+/* -*- mode: fundamental; indent-tabs-mode: 1; -*- */
+/*****************************************************************************
+ * Parser for Fortran90 F subset
+ *
+ * Copyright (C) by Anke Visser
+ * based on the work of Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/* Developer notes.
+ *
+ * - Consider using startScope(), endScope() functions with module, program,
+ * subroutine or any other scope in fortran program.
+ *
+ * - Symbol modifiers (attributes) are collected using SymbolModifiers |= operator during
+ * substructure parsing. When substructure ends all modifiers are applied to actual
+ * entries in applyModifiers() functions.
+ *
+ * - How case insensitiveness should be handled in code?
+ * On one side we have arg->name and entry->name, on another side modifierMap[name].
+ * In entries and arguments case is the same as in code, in modifier map case is lowered and
+ * then it is compared to lowered entry/argument names.
+ *
+ * - Do not like constructs like aa{BS} or {BS}bb. Should try to handle blank space
+ * with separate rule?: It seems it is often necessary, because we may parse something like
+ * "functionA" or "MyInterface". So constructs like `(^|[ \t])interface({BS_}{ID})?/[ \t\n]'
+ * are desired.
+ *
+ * - Must track yyLineNr when using REJECT, unput() or similar commands.
+ */
+
+%{
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qregexp.h>
+#include <unistd.h>
+#include <qfile.h>
+#include <qmap.h>
+
+#include "fortranscanner.h"
+#include "entry.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+#include "defargs.h"
+#include "language.h"
+#include "commentscan.h"
+#include "fortrancode.h"
+#include "pre.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+enum ScanVar { V_IGNORE, V_VARIABLE, V_PARAMETER};
+enum InterfaceType { IF_NONE, IF_SPECIFIC, IF_GENERIC, IF_ABSTRACT };
+
+// {{{ ----- Helper structs -----
+//! Holds modifiers (ie attributes) for one symbol (variable, function, etc)
+struct SymbolModifiers {
+ enum Protection {NONE_P, PUBLIC, PRIVATE};
+ enum Direction {NONE_D, IN, OUT, INOUT};
+
+ //!< This is only used with function return value.
+ QCString type, returnName;
+ Protection protection;
+ Direction direction;
+ bool optional;
+ QCString dimension;
+ bool allocatable;
+ bool external;
+ bool intrinsic;
+ bool parameter;
+ bool pointer;
+ bool target;
+ bool save;
+ bool deferred;
+ bool nonoverridable;
+ bool nopass;
+ bool pass;
+ QCString passVar;
+
+ SymbolModifiers() : type(), returnName(), protection(NONE_P), direction(NONE_D),
+ optional(FALSE), dimension(), allocatable(FALSE),
+ external(FALSE), intrinsic(FALSE), parameter(FALSE),
+ pointer(FALSE), target(FALSE), save(FALSE), deferred(FALSE), nonoverridable(FALSE),
+ nopass(FALSE), pass(FALSE), passVar() {}
+
+ SymbolModifiers& operator|=(const SymbolModifiers &mdfs);
+ SymbolModifiers& operator|=(QCString mdfrString);
+};
+
+//ostream& operator<<(ostream& out, const SymbolModifiers& mdfs);
+
+static const char *directionStrs[] =
+{
+ "", "intent(in)", "intent(out)", "intent(inout)"
+};
+
+// }}}
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+static ParserInterface *g_thisParser;
+static const char * inputString;
+static int inputPosition;
+static bool isFixedForm;
+static QCString inputStringPrepass; ///< Input string for prepass of line cont. '&'
+static QCString inputStringSemi; ///< Input string after command separetor ';'
+static unsigned int inputPositionPrepass;
+static int lineCountPrepass = 0;
+
+struct CommentInPrepass {
+ int column;
+ QCString str;
+ CommentInPrepass(int column, QCString str) : column(column), str(str) {}
+};
+static QList<CommentInPrepass> comments;
+
+#define MAX_INCLUDE_DEPTH 10
+YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
+int include_stack_ptr = 0;
+
+static QFile inputFile;
+static QCString yyFileName;
+static int yyLineNr = 1 ;
+static int yyColNr = 0 ;
+static Entry* current_root = 0 ;
+static Entry* global_root = 0 ;
+static Entry* file_root = 0 ;
+static Entry* current = 0 ;
+static Entry* last_entry = 0 ;
+static ScanVar v_type = V_IGNORE; // type of parsed variable
+static QList<Entry> moduleProcedures; // list of all interfaces which contain unresolved
+ // module procedures
+static QCString docBlock;
+static QCString docBlockName;
+static bool docBlockInBody;
+static bool docBlockJavaStyle;
+
+static MethodTypes mtype;
+static bool gstat;
+static Specifier virt;
+
+static QCString debugStr;
+static QCString result; // function result
+static Argument *parameter; // element of parameter list
+static QCString argType; // fortran type of an argument of a parameter list
+static QCString argName; // last identifier name in variable list
+static QCString initializer; // initial value of a variable
+static int initializerArrayScope; // number if nested array scopes in initializer
+static int initializerScope; // number if nested function calls in initializer
+static QCString useModuleName; // name of module in the use statement
+static Protection defaultProtection;
+static InterfaceType ifType = IF_NONE;
+
+static char stringStartSymbol; // single or double quote
+
+//! Accumulated modifiers of current statement, eg variable declaration.
+static SymbolModifiers currentModifiers;
+//! Holds program scope->symbol name->symbol modifiers.
+static QMap<Entry*,QMap<QCString,SymbolModifiers> > modifiers;
+
+//-----------------------------------------------------------------------------
+
+static int yyread(char *buf,int max_size);
+static void startCommentBlock(bool);
+static void handleCommentBlock(const QCString &doc,bool brief);
+static void addCurrentEntry();
+static void addModule(const char *name, bool isModule=FALSE);
+static void addSubprogram(const char *text);
+static void addInterface(QCString name, InterfaceType type);
+static Argument *getParameter(const QCString &name);
+static void scanner_abort();
+
+static void startScope(Entry *scope);
+static bool endScope(Entry *scope, bool isGlobalRoot=FALSE);
+static QCString getFullName(Entry *e);
+static bool isTypeName(QCString name);
+static void resolveModuleProcedures(QList<Entry> &moduleProcedures, Entry *current_root);
+static int getAmpersandAtTheStart(const char *buf, int length);
+static int getAmpOrExclAtTheEnd(const char *buf, int length);
+static void truncatePrepass(int index);
+static void pushBuffer(QCString &buffer);
+static void popBuffer();
+//static void extractPrefix(QCString& text);
+static QCString extractFromParens(const QCString name);
+static CommentInPrepass* locatePrepassComment(int from, int to);
+static void updateVariablePrepassComment(int from, int to);
+static void newLine();
+
+//-----------------------------------------------------------------------------
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+#define YY_USER_ACTION yyColNr+=yyleng;
+//-----------------------------------------------------------------------------
+
+%}
+
+ //-----------------------------------------------------------------------------
+ //-----------------------------------------------------------------------------
+IDSYM [a-z_A-Z0-9]
+NOTIDSYM [^a-z_A-Z0-9]
+SEPARATE [:, \t]
+ID [a-z_A-Z%]+{IDSYM}*
+PP_ID {ID}
+LABELID [a-z_A-Z]+[a-z_A-Z0-9\-]*
+SUBPROG (subroutine|function)
+B [ \t]
+BS [ \t]*
+BS_ [ \t]+
+COMMA {BS},{BS}
+ARGS_L0 ("("[^)]*")")
+ARGS_L1a [^()]*"("[^)]*")"[^)]*
+ARGS_L1 ("("{ARGS_L1a}*")")
+ARGS_L2 "("({ARGS_L0}|[^()]|{ARGS_L1a}|{ARGS_L1})*")"
+ARGS {BS}({ARGS_L0}|{ARGS_L1}|{ARGS_L2})
+NOARGS {BS}"\n"
+
+NUM_TYPE (complex|integer|logical|real)
+KIND {ARGS}
+CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
+TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}PRECISION|{CHAR}|TYPE{ARGS}|CLASS{ARGS}|PROCEDURE{ARGS}?)
+
+INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
+ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE)
+ACCESS_SPEC (PRIVATE|PUBLIC)
+LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")"
+/* Assume that attribute statements are almost the same as attributes. */
+ATTR_STMT {ATTR_SPEC}|DIMENSION|{ACCESS_SPEC}
+
+CONTAINS CONTAINS
+PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTAL)?
+
+%option noyywrap
+%option stack
+%option caseless
+/*%option debug */
+
+ //---------------------------------------------------------------------------------
+
+ /** fortran parsing states */
+%x Subprog
+%x SubprogPrefix
+%x Parameterlist
+%x SubprogBody
+%x SubprogBodyContains
+%x Start
+%x Comment
+%x Module
+%x Program
+%x ModuleBody
+%x ModuleBodyContains
+%x AttributeList
+%x Variable
+%x Initialization
+%x ArrayInitializer
+%x Typedef
+%x TypedefBody
+%x TypedefBodyContains
+%x InterfaceBody
+%x StrIgnore
+%x String
+%x Use
+%x UseOnly
+%x ModuleProcedure
+
+%x Prepass
+
+ /** comment parsing states */
+%x DocBlock
+%x DocBackLine
+%x EndDoc
+
+%%
+
+ /*-----------------------------------------------------------------------------------*/
+
+<*>^.*\n { // prepass: look for line continuations
+
+ //fprintf(stderr, "---%s", yytext);
+
+ int indexStart = getAmpersandAtTheStart(yytext, yyleng);
+ int indexEnd = getAmpOrExclAtTheEnd(yytext, yyleng);
+ if (indexEnd>=0 && yytext[indexEnd]!='&') //we are only interested in amp
+ indexEnd=-1;
+
+ if(indexEnd<0){ // ----- no ampersand as line continuation
+ if(YY_START == Prepass) { // last line in "continuation"
+
+ // Only take input after initial ampersand
+ inputStringPrepass+=(const char*)(yytext+(indexStart+1));
+
+ //printf("BUFFER:%s\n", (const char*)inputStringPrepass);
+ pushBuffer(inputStringPrepass);
+ yyColNr = 0;
+ yy_pop_state();
+ } else { // simple line
+ yyColNr = 0;
+ REJECT;
+ }
+
+ } else { // ----- line with continuation
+ if(YY_START != Prepass) {
+ comments.setAutoDelete(TRUE);
+ comments.clear();
+ yy_push_state(Prepass);
+ }
+
+ int length = inputStringPrepass.length();
+
+ // Only take input after initial ampersand
+ inputStringPrepass+=(const char*)(yytext+(indexStart+1));
+ lineCountPrepass ++;
+
+ // cut off & and remove following comment if present
+ truncatePrepass(length+indexEnd-(indexStart+1));
+ }
+
+ }
+
+
+ /*------ ignore strings that are not initialization strings */
+<*>"\\\\" { if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=yytext;
+ }
+<*>"\\\""|\\\' { if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=yytext;
+ }
+<String>\"|\' { // string ends with next quote without previous backspace
+ if (yytext[0]!=stringStartSymbol) { yyColNr -= yyleng; REJECT; } // single vs double quote
+ if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=yytext;
+ yy_pop_state();
+ }
+<String>. { if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=yytext;
+ }
+<*>\"|\' { /* string starts */
+ if (YY_START == StrIgnore) { yyColNr -= yyleng; REJECT; }; // ignore in simple comments
+ yy_push_state(YY_START);
+ if (yy_top_state() == Initialization
+ || yy_top_state() == ArrayInitializer)
+ initializer+=yytext;
+ stringStartSymbol=yytext[0]; // single or double quote
+ BEGIN(String);
+ }
+
+ /*------ ignore simple comment (not documentation comments) */
+
+<*>"!"/[^<>\n] { if (YY_START == String) { yyColNr -= yyleng; REJECT; } // "!" is ignored in strings
+ // skip comment line (without docu comments "!>" "!<" )
+ /* ignore further "!" and ignore comments in Strings */
+ if ((YY_START != StrIgnore) && (YY_START != String))
+ {
+ yy_push_state(YY_START);
+ BEGIN(StrIgnore);
+ debugStr="*!";
+ //fprintf(stderr,"start comment %d\n",yyLineNr);
+ }
+ }
+<StrIgnore>.?/\n { yy_pop_state(); // comment ends with endline character
+ //fprintf(stderr,"end comment %d %s\n",yyLineNr,debugStr.data());
+ } // comment line ends
+<StrIgnore>. { debugStr+=yytext; }
+
+
+ /*------ use handling ------------------------------------------------------------*/
+
+<Start,ModuleBody,SubprogBody>"use"{BS_} {
+ if(YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBody); //anon program
+ }
+ yy_push_state(Use);
+ }
+<Use>{ID} {
+ //fprintf(stderr,"using dir %s\n",yytext);
+ current->name=yytext;
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ current->lang = SrcLangExt_F90;
+ yy_pop_state();
+ }
+<Use>{ID}/, {
+ useModuleName=yytext;
+ }
+<Use>,{BS}"ONLY" { BEGIN(UseOnly);
+ }
+<UseOnly>{BS},{BS} {}
+<UseOnly>{ID} {
+ current->name= useModuleName+"::"+yytext;
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ current->lang = SrcLangExt_F90;
+ }
+<Use,UseOnly>"\n" {
+ yyColNr -= 1;
+ unput(*yytext);
+ yy_pop_state();
+ }
+
+ /* INTERFACE definitions */
+<Start,ModuleBody,SubprogBody>{
+^{BS}interface { ifType = IF_SPECIFIC;
+ yy_push_state(InterfaceBody);
+ // do not start a scope here, every
+ // interface body is a scope of its own
+ }
+
+^{BS}abstract{BS_}interface { ifType = IF_ABSTRACT;
+ yy_push_state(InterfaceBody);
+ // do not start a scope here, every
+ // interface body is a scope of its own
+ }
+
+^{BS}interface{BS_}{ID}{ARGS}? { ifType = IF_GENERIC;
+ yy_push_state(InterfaceBody);
+
+ // extract generic name
+ QCString name = QCString(yytext).stripWhiteSpace();
+ name = name.right(name.length() - 9).stripWhiteSpace();
+ addInterface(name, ifType);
+
+ startScope(last_entry);
+ }
+}
+
+<InterfaceBody>^{BS}end{BS}interface({BS_}{ID})? {
+ // end scope only if GENERIC interface
+ if (ifType == IF_GENERIC && !endScope(current_root))
+ yyterminate();
+
+ ifType = IF_NONE;
+ yy_pop_state();
+ }
+<InterfaceBody>module{BS}procedure { yy_push_state(YY_START);
+ BEGIN(ModuleProcedure);
+ }
+<ModuleProcedure>{ID} { if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ {
+ addInterface(yytext, ifType);
+ startScope(last_entry);
+ }
+
+ current->section = Entry::FUNCTION_SEC ;
+ current->name = yytext;
+ moduleProcedures.append(current);
+ addCurrentEntry();
+ }
+<ModuleProcedure>"\n" { yyColNr -= 1;
+ unput(*yytext);
+ yy_pop_state();
+ }
+<InterfaceBody>. {}
+
+ /*-- Contains handling --*/
+<Start>^{BS}{CONTAINS}/({BS}|\n|!) {
+ if(YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBodyContains); //anon program
+ }
+ }
+<ModuleBody>^{BS}{CONTAINS}/({BS}|\n|!) { BEGIN(ModuleBodyContains); }
+<SubprogBody>^{BS}{CONTAINS}/({BS}|\n|!) { BEGIN(SubprogBodyContains); }
+<TypedefBody>^{BS}{CONTAINS}/({BS}|\n|!) { BEGIN(TypedefBodyContains); }
+
+ /*------ module handling ------------------------------------------------------------*/
+<Start>module|program{BS_} { //
+ if(yytext[0]=='m' || yytext[0]=='M')
+ yy_push_state(Module);
+ else
+ yy_push_state(Program);
+ defaultProtection = Public;
+ }
+<Start,ModuleBody,ModuleBodyContains>^{BS}"end"({BS}(module|program)({BS_}{ID})?)?{BS}/(\n|!) { // end module
+ resolveModuleProcedures(moduleProcedures, current_root);
+ if (!endScope(current_root))
+ yyterminate();
+ defaultProtection = Public;
+ yy_pop_state();
+ }
+<Module>{ID} {
+ addModule(yytext, TRUE);
+ BEGIN(ModuleBody);
+ }
+
+<Program>{ID} {
+ addModule(yytext, FALSE);
+ BEGIN(ModuleBody);
+ }
+
+ /*------- access specification --------------------------------------------------------------------------*/
+
+<ModuleBody>private/{BS}(\n|"!") { defaultProtection = Private; }
+<ModuleBody>public/{BS}(\n|"!") { defaultProtection = Public; }
+
+ /*------- type definition -------------------------------------------------------------------------------*/
+
+<Start,ModuleBody>^{BS}type {
+ if(YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBody); //anon program
+ }
+
+ yy_push_state(Typedef);
+ current->protection = defaultProtection;
+ }
+<Typedef>{
+{COMMA} {}
+
+{BS}"::"{BS} {}
+
+abstract {
+ current->spec |= Entry::AbstractClass;
+ }
+extends{ARGS} {
+ QCString basename = extractFromParens(yytext);
+ current->extends->append(new BaseInfo(basename, Public, Normal));
+ }
+public {
+ current->protection = Public;
+ }
+private {
+ current->protection = Private;
+ }
+{LANGUAGE_BIND_SPEC} {
+ /* ignored for now */
+ }
+{ID} { /* type name found */
+ current->section = Entry::CLASS_SEC;
+ current->spec |= Entry::Struct;
+ current->name = yytext;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr;
+
+ /* if type is part of a module, mod name is necessary for output */
+ if ((current_root) &&
+ (current_root->section == Entry::CLASS_SEC
+ || current_root->section == Entry::NAMESPACE_SEC))
+ {
+ current->name = current_root->name + "::" + current->name;
+ }
+
+ addCurrentEntry();
+ startScope(last_entry);
+ BEGIN(TypedefBody);
+ }
+}
+
+<TypedefBodyContains>{ /* Type Bound Procedures */
+^{BS}PROCEDURE{ARGS}? {
+ current->type = QCString(yytext).simplifyWhiteSpace();
+ }
+^{BS}final {
+ current->spec |= Entry::Final;
+ current->type = QCString(yytext).simplifyWhiteSpace();
+ }
+^{BS}generic {
+ current->type = QCString(yytext).simplifyWhiteSpace();
+ }
+{COMMA} {
+ }
+{ATTR_SPEC} {
+ currentModifiers |= QCString(yytext);
+ }
+{BS}"::"{BS} {
+ }
+{ID} {
+ QCString name = yytext;
+ modifiers[current_root][name.lower()] |= currentModifiers;
+ current->section = Entry::FUNCTION_SEC;
+ current->name = name;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr;
+ addCurrentEntry();
+ }
+{BS}"=>"[^(\n|\!)]* { /* Specific bindings come after the ID. */
+ last_entry->args = yytext;
+ }
+"\n" {
+ currentModifiers = SymbolModifiers();
+ newLine();
+ docBlock.resize(0);
+ }
+}
+
+
+<TypedefBody,TypedefBodyContains>{
+^{BS}"end"{BS}"type"({BS_}{ID})?{BS}/(\n|!) { /* end type definition */
+ if (!endScope(current_root))
+ yyterminate();
+ yy_pop_state();
+ }
+}
+
+ /*------- module/global/typedef variable ---------------------------------------------------*/
+
+<SubprogBody,SubprogBodyContains>^{BS}[0-9]*{BS}"end"({BS}{SUBPROG}({BS_}{ID})?)?{BS}/(\n|!) {
+ //
+ // ABSTRACT and specific interfaces are stored
+ // in a scope of their own, even if multiple
+ // are group in one INTERFACE/END INTERFACE block.
+ //
+ if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ endScope(current_root);
+
+ if (!endScope(current_root))
+ yyterminate();
+ yy_pop_state() ;
+ }
+<Start,ModuleBody,TypedefBody,SubprogBody>{
+^{BS}{TYPE_SPEC}/{SEPARATE} {
+ /* variable declaration starts */
+ if(YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBody); //anon program
+ }
+ argType = QCString(yytext).simplifyWhiteSpace();
+ yy_push_state(AttributeList);
+ }
+^{BS}{PP_ID}{KIND}? { /* check for preprocessor symbol expand to type */
+ QCString str = yytext;
+ str = str.stripWhiteSpace();
+ DefineDict* defines = getGlobalDefineDict();
+ QCString name;
+ int index = str.find("(");
+ if (index != -1)
+ name = str.left(index).stripWhiteSpace();
+ else
+ name = str;
+
+ Define *define = (*defines)[name];
+ if (define != 0 && isTypeName(define->definition))
+ {
+ argType = str;
+ yy_push_state(AttributeList);
+ }
+ else
+ {
+ yyColNr -= yyleng;
+ REJECT;
+ }
+ }
+{ATTR_STMT}/{BS_}{ID} |
+{ATTR_STMT}/{BS}"::" {
+ /* attribute statement starts */
+ //fprintf(stderr,"5=========> Attribute statement: %s\n", yytext);
+ QCString tmp = yytext;
+ currentModifiers |= tmp.stripWhiteSpace();
+ argType="";
+ yy_push_state(YY_START);
+ BEGIN( AttributeList ) ;
+ }
+{ID} {
+ }
+}
+<AttributeList>{
+{COMMA} {}
+{BS} {}
+{ATTR_SPEC}. { /* update current modifierswhen it is an ATTR_SPEC and not a variable name */
+ /* bug_625519 */
+ QChar chr = yytext[yyleng-1];
+ if (chr.isLetter() || chr.isDigit() || (chr == '_'))
+ {
+ yyColNr -= yyleng;
+ REJECT;
+ }
+ else
+ {
+ QCString tmp = yytext;
+ tmp = tmp.left(tmp.length() - 1);
+ yyColNr -= 1;
+ unput(yytext[yyleng-1]);
+ currentModifiers |= (tmp);
+ }
+ }
+"::" { /* end attribute list */
+ BEGIN( Variable );
+ }
+. { /* unknown attribute, consider variable name */
+ //cout<<"start variables, unput "<<*yytext<<endl;
+ yyColNr -= 1;
+ unput(*yytext);
+ BEGIN( Variable );
+ }
+}
+
+<Variable>{BS} { }
+<Variable>{ID} { /* parse variable declaration */
+ //cout << "5=========> got variable: " << argType << "::" << yytext << endl;
+ /* work around for bug in QCString.replace (QCString works) */
+ QCString name=yytext;
+ /* remember attributes for the symbol */
+ modifiers[current_root][name.lower()] |= currentModifiers;
+ argName= name;
+
+ v_type= V_IGNORE;
+ if (!argType.isEmpty() && current_root->section!=Entry::FUNCTION_SEC)
+ { // new variable entry
+ v_type = V_VARIABLE;
+ current->section = Entry::VARIABLE_SEC;
+ current->name = argName;
+ current->type = argType;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr; // used for source reference
+ addCurrentEntry();
+ }
+ else if (!argType.isEmpty())
+ { // deklaration of parameter list: add type for corr. parameter
+ parameter = getParameter(argName);
+ if (parameter) {
+ v_type= V_PARAMETER;
+ if (!argType.isNull())
+ parameter->type=argType.stripWhiteSpace();
+ if (!docBlock.isNull()) {
+ parameter->docs += "\n";
+ parameter->docs += docBlock;
+ }
+ }
+ // save, it may be function return type
+ modifiers[current_root][name.lower()].type = argType;
+ // any accumulated doc for argument should be emptied,
+ // because it is handled other way and this doc can be
+ // unexpectedly passed to the next member.
+ current->doc.resize(0);
+ current->brief.resize(0);
+ }
+ }
+<Variable>{ARGS} { /* dimension of the previous entry. */
+ QCString name(argName);
+ QCString attr("dimension");
+ attr += yytext;
+ modifiers[current_root][name] |= attr;
+ }
+<Variable>{COMMA} { //printf("COMMA: %d<=..<=%d\n", yyColNr-yyleng, yyColNr);
+ // locate !< comment
+ updateVariablePrepassComment(yyColNr-yyleng, yyColNr);
+ }
+<Variable>{BS}"=" { yy_push_state(YY_START);
+ initializer="";
+ initializerScope = initializerArrayScope = 0;
+ BEGIN(Initialization);
+ }
+<Variable>"\n" { currentModifiers = SymbolModifiers();
+ yy_pop_state(); // end variable deklaration list
+ newLine();
+ docBlock.resize(0);
+ }
+<Variable>";".*"\n" { currentModifiers = SymbolModifiers();
+ yy_pop_state(); // end variable deklaration list
+ docBlock.resize(0);
+ inputStringSemi =(const char*)(yytext+1);
+ pushBuffer(inputStringSemi);
+ }
+
+<Initialization,ArrayInitializer>"(/" { initializer+=yytext;
+ initializerArrayScope++;
+ BEGIN(ArrayInitializer); // initializer may contain comma
+ }
+<ArrayInitializer>"/)" { initializer+=yytext;
+ initializerArrayScope--;
+ if(initializerArrayScope<=0)
+ {
+ initializerArrayScope = 0; // just in case
+ BEGIN(Initialization);
+ }
+ }
+<ArrayInitializer>. { initializer+=yytext; }
+<Initialization>"(" { initializerScope++;
+ initializer+=yytext;
+ }
+<Initialization>")" { initializerScope--;
+ initializer+=yytext;
+ }
+<Initialization>{COMMA} { if (initializerScope == 0)
+ {
+ updateVariablePrepassComment(yyColNr-yyleng, yyColNr);
+ yy_pop_state(); // end initialization
+ if (v_type == V_VARIABLE) last_entry->initializer= initializer;
+ }
+ else
+ initializer+=", ";
+ }
+<Initialization>"\n"|"!" { //|
+ yy_pop_state(); // end initialization
+ if (v_type == V_VARIABLE) last_entry->initializer= initializer;
+ yyColNr -= 1;
+ unput(*yytext);
+ }
+<Initialization>. { initializer+=yytext; }
+
+ /*------ fortran subroutine/function handling ------------------------------------------------------------*/
+ /* Start is initial condition */
+
+<Start,ModuleBody,SubprogBody,InterfaceBody,ModuleBodyContains,SubprogBodyContains>^{BS}({PREFIX}{BS_})?{TYPE_SPEC}{BS}/{SUBPROG}{BS_} {
+ if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ {
+ addInterface("$interface$", ifType);
+ startScope(last_entry);
+ }
+
+ // TYPE_SPEC is for old function style function result
+ result = QCString(yytext).stripWhiteSpace();
+ current->type = result;
+ yy_push_state(SubprogPrefix);
+ }
+
+<SubprogPrefix>{BS}{SUBPROG}{BS_} {
+ // Fortran subroutine or function found
+ addSubprogram(yytext);
+ BEGIN(Subprog);
+ }
+
+<Start,ModuleBody,SubprogBody,InterfaceBody,ModuleBodyContains,SubprogBodyContains>^{BS}({PREFIX}{BS_})?{SUBPROG}{BS_} {
+ // Fortran subroutine or function found
+ if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ {
+ addInterface("$interface$", ifType);
+ startScope(last_entry);
+ }
+
+ result = QCString(yytext).stripWhiteSpace();
+ addSubprogram(result);
+ yy_push_state(Subprog);
+ }
+
+<Subprog>{BS} { /* ignore white space */ }
+<Subprog>{ID} { current->name = yytext;
+ //cout << "1a==========> got " << current->type << " " << yytext << " " << yyLineNr << endl;
+ modifiers[current_root][current->name.lower()].returnName = current->name;
+
+ if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
+ {
+ current_root->name.replace(QRegExp("\\$interface\\$"), yytext);
+ }
+
+ BEGIN(Parameterlist);
+ }
+<Parameterlist>"(" { current->args = "("; }
+<Parameterlist>")" {
+ current->args += ")";
+ current->args = removeRedundantWhiteSpace(current->args);
+ addCurrentEntry();
+ startScope(last_entry);
+ BEGIN(SubprogBody);
+ }
+<Parameterlist>{COMMA}|{BS} { current->args += yytext;
+ CommentInPrepass *c = locatePrepassComment(yyColNr-yyleng, yyColNr);
+ if (c!=NULL) {
+ if(current->argList->count()>0) {
+ current->argList->at(current->argList->count()-1)->docs = c->str;
+ }
+ }
+ }
+<Parameterlist>{ID} {
+ //current->type not yet available
+ QCString param = yytext;
+ // std::cout << "3=========> got parameter " << param << std::endl;
+ current->args += param;
+ Argument *arg = new Argument;
+ arg->name = param;
+ arg->type = "";
+ current->argList->append(arg);
+ }
+<Parameterlist>{NOARGS} {
+ newLine();
+ //printf("3=========> without parameterlist \n");
+ //current->argList = ;
+ addCurrentEntry();
+ startScope(last_entry);
+ BEGIN(SubprogBody);
+}
+<SubprogBody>result{BS}\({BS}{ID} {
+ result= yytext;
+ result= result.right(result.length()-result.find("(")-1);
+ result= result.stripWhiteSpace();
+ modifiers[current_root->parent()][current_root->name.lower()].returnName = result;
+ //cout << "=====> got result " << result << endl;
+ }
+
+ /*---- documentation comments --------------------------------------------------------------------*/
+
+<Variable,SubprogBody,ModuleBody,TypedefBody>"!<" { /* backward docu comment (only one line) */
+ if (v_type != V_IGNORE) {
+ current->docLine = yyLineNr;
+ docBlockJavaStyle = FALSE;
+ docBlock.resize(0);
+ docBlockJavaStyle = Config_getBool("JAVADOC_AUTOBRIEF");
+ startCommentBlock(TRUE);
+ yy_push_state(DocBackLine);
+ }
+ }
+<DocBackLine>.* { // contents of current comment line
+ docBlock=yytext;
+ if (v_type == V_VARIABLE)
+ {
+ Entry *tmp_entry = current;
+ current = last_entry; // temporarily switch to the previous entry
+ handleCommentBlock(docBlock,TRUE);
+ current=tmp_entry;
+ }
+ else if (v_type == V_PARAMETER)
+ {
+ parameter->docs+=docBlock;
+ }
+ yy_pop_state();
+ }
+
+<Start,SubprogBody,ModuleBody,TypedefBody,InterfaceBody,ModuleBodyContains,SubprogBodyContains,TypedefBodyContains>"!>" {
+ yy_push_state(YY_START);
+ current->docLine = yyLineNr;
+ docBlockJavaStyle = FALSE;
+ docBlock.resize(0);
+ docBlockJavaStyle = Config_getBool("JAVADOC_AUTOBRIEF");
+ startCommentBlock(TRUE);
+ BEGIN(DocBlock);
+ //cout << "start DocBlock " << endl;
+ }
+
+<DocBlock>.* { // contents of current comment line
+ docBlock+=yytext;
+ }
+<DocBlock>"\n"{BS}"!"(">"|"!"+) { // comment block (next line is also comment line)
+ docBlock+="\n"; // \n is necessary for lists
+ newLine();
+ }
+<DocBlock>"\n" { // comment block ends at the end of this line
+ //cout <<"3=========> comment block : "<< docBlock << endl;
+ yyColNr -= 1;
+ unput(*yytext);
+ handleCommentBlock(docBlock,TRUE);
+ yy_pop_state();
+ }
+
+ /*------------------------------------------------------------------------------------------------*/
+
+<*>"\n" {
+ newLine();
+ //if (debugStr.stripWhiteSpace().length() > 0) cout << "ignored text: " << debugStr << " state: " <<YY_START << endl;
+ debugStr="";
+ }
+
+
+ /*---- error: EOF in wrong state --------------------------------------------------------------------*/
+
+<*><<EOF>> {
+ if ( include_stack_ptr <= 0 ) {
+ if (YY_START!=INITIAL && YY_START!=Start) {
+ //fprintf(stderr,"==== Error: EOF reached in wrong state (end missing)");
+ scanner_abort();
+ }
+ yyterminate();
+ } else {
+ popBuffer();
+ }
+ }
+ <*>. {
+ //debugStr+=yytext;
+ //printf("I:%c\n", *yytext);
+ } // ignore remaining text
+
+ /**********************************************************************************/
+ /**********************************************************************************/
+ /**********************************************************************************/
+%%
+//----------------------------------------------------------------------------
+
+#if 0
+static void extractPrefix(QCString &text)
+{
+ int prefixIndex = 0;
+ int curIndex = 0;
+ bool cont = TRUE;
+ const char* pre[] = {"RECURSIVE","PURE","ELEMENTAL"};
+ while(cont)
+ {
+ cont = FALSE;
+ for(unsigned int i=0; i<3; i++)
+ {
+ if((prefixIndex=text.find(pre[i], curIndex, FALSE))==0)
+ {
+ text.remove(0,strlen(pre[i]));
+ text.stripWhiteSpace();
+ cont = TRUE;
+ }
+ }
+ }
+}
+#endif
+
+static void newLine() {
+ yyLineNr++;
+ yyLineNr+=lineCountPrepass;
+ lineCountPrepass=0;
+ comments.clear();
+}
+
+static CommentInPrepass* locatePrepassComment(int from, int to) {
+ //printf("Locate %d-%d\n", from, to);
+ for(uint i=0; i<comments.count(); i++) { // todo: optimize
+ int c = comments.at(i)->column;
+ //printf("Candidate %d\n", c);
+ if (c>=from && c<=to) {
+ // comment for previous variable or parameter
+ return comments.at(i);
+ }
+ }
+ return NULL;
+}
+
+static void updateVariablePrepassComment(int from, int to) {
+ CommentInPrepass *c = locatePrepassComment(from, to);
+ if (c!=NULL && v_type == V_VARIABLE) {
+ last_entry->brief = c->str;
+ } else if (c!=NULL && v_type == V_PARAMETER) {
+ Argument *parameter = getParameter(argName);
+ if (parameter) parameter->docs = c->str;
+ }
+}
+
+static int getAmpersandAtTheStart(const char *buf, int length)
+{
+ for(int i=0; i<length; i++) {
+ switch(buf[i]) {
+ case ' ':
+ case '\t':
+ break;
+ case '&':
+ return i;
+ default:
+ return -1;
+ }
+ }
+ return -1;
+}
+
+/* Returns ampersand index, comment start index or -1 if neither exist.*/
+static int getAmpOrExclAtTheEnd(const char *buf, int length)
+{
+ // Avoid ampersands in string and comments
+ int parseState = Start;
+ char quoteSymbol = 0;
+ int ampIndex = -1;
+ int commentIndex = -1;
+
+ for(int i=0; i<length && parseState!=Comment; i++)
+ {
+ // When in string, skip backslashes
+ // Legacy code, not sure whether this is correct?
+ if(parseState==String)
+ {
+ if(buf[i]=='\\') i++;
+ }
+
+ switch(buf[i])
+ {
+ case '\'':
+ case '"':
+ // Close string, if quote symbol matches.
+ // Quote symbol is set iff parseState==String
+ if(buf[i]==quoteSymbol)
+ {
+ parseState = Start;
+ quoteSymbol = 0;
+ }
+ // Start new string, if not already in string or comment
+ else if(parseState==Start)
+ {
+ parseState = String;
+ quoteSymbol = buf[i];
+ }
+ ampIndex = -1; // invalidate prev ampersand
+ break;
+ case '!':
+ // When in string or comment, ignore exclamation mark
+ if(parseState==Start)
+ {
+ parseState = Comment;
+ commentIndex = i;
+ }
+ break;
+ case ' ': // ignore whitespace
+ case '\t':
+ case '\n': // this may be at the end of line
+ break;
+ case '&':
+ ampIndex = i;
+ break;
+ default:
+ ampIndex = -1; // invalidate prev ampersand
+ }
+ }
+
+ if (ampIndex>=0)
+ return ampIndex;
+ else
+ return commentIndex;
+}
+
+/* Although comments at the end of continuation line are grabbed by this function,
+* we still do not know how to use them later in parsing.
+*/
+void truncatePrepass(int index)
+{
+ int length = inputStringPrepass.length();
+ for (int i=index+1; i<length; i++) {
+ if (inputStringPrepass[i]=='!' && i<length-1 && inputStringPrepass[i+1]=='<') { // save comment
+ struct CommentInPrepass *c=new CommentInPrepass(index, inputStringPrepass.right(length-i-2));
+ comments.append(c);
+ }
+ }
+ inputStringPrepass.truncate(index);
+}
+
+// simplified way to know if this is fixed form
+// duplicate in fortrancode.l
+static bool recognizeFixedForm(const char* contents)
+{
+ int column=0;
+ bool skipLine=FALSE;
+
+ for(int i=0;;i++) {
+ column++;
+
+ switch(contents[i]) {
+ case '\n':
+ column=0;
+ skipLine=FALSE;
+ break;
+ case ' ':
+ break;
+ case '\000':
+ return FALSE;
+ case 'C':
+ case 'c':
+ case '*':
+ if(column==1) return TRUE;
+ if(skipLine) break;
+ return FALSE;
+ case '!':
+ if(column>1 && column<7) return FALSE;
+ skipLine=TRUE;
+ break;
+ default:
+ if(skipLine) break;
+ if(column==7) return TRUE;
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+/* This function assumes that contents has at least size=length+1 */
+static void insertCharacter(char *contents, int length, int pos, char c)
+{
+ // shift tail by one character
+ for(int i=length; i>pos; i--)
+ contents[i]=contents[i-1];
+ // set the character
+ contents[pos] = c;
+}
+
+/* change comments and bring line continuation character to previous line */
+static const char* prepassFixedForm(const char* contents)
+{
+ int column=0;
+ int prevLineLength=0;
+ int prevLineAmpOrExclIndex=-1;
+ bool emptyLabel=TRUE;
+ int newContentsSize = strlen(contents)+2; // \000 and one spare character (to avoid reallocation)
+ char* newContents = (char*)malloc(newContentsSize);
+
+ for(int i=0, j=0;;i++,j++) {
+ if(j>=newContentsSize-1) { // check for one spare character, which may be eventually used below (by &)
+ newContents = (char*)realloc(newContents, newContentsSize+1000);
+ newContentsSize = newContentsSize+1000;
+ }
+
+ column++;
+ char c = contents[i];
+ switch(c) {
+ case '\n':
+ prevLineLength=column;
+ prevLineAmpOrExclIndex=getAmpOrExclAtTheEnd(&contents[i-prevLineLength+1], prevLineLength);
+ column=0;
+ emptyLabel=TRUE;
+ newContents[j]=c;
+ break;
+ case ' ':
+ newContents[j]=c;
+ break;
+ case '\000':
+ newContents[j]='\000';
+ return newContents;
+ case 'C':
+ case 'c':
+ case '*':
+ emptyLabel=FALSE;
+ if(column==1)
+ newContents[j]='!';
+ else
+ newContents[j]=c;
+ break;
+ default:
+ if(column==6 && emptyLabel) { // continuation
+ newContents[j]=' ';
+
+ if(prevLineAmpOrExclIndex==-1) { // add & just before end of previous line
+ insertCharacter(newContents, j+1, (j+1)-6-1, '&');
+ j++;
+ } else { // add & just before end of previous line comment
+ insertCharacter(newContents, j+1, (j+1)-6-prevLineLength+prevLineAmpOrExclIndex, '&');
+ j++;
+ }
+ } else {
+ newContents[j]=c;
+ emptyLabel=FALSE;
+ }
+ break;
+ }
+ }
+ return newContents;
+}
+
+static void pushBuffer(QCString& buffer)
+{
+ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
+ {
+ fprintf( stderr, "Stack buffers nested too deeply" );
+ exit( 1 );
+ }
+ include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer(yy_scan_string(buffer));
+
+ //fprintf(stderr, "--PUSH--%s", (const char *)buffer);
+ buffer = NULL;
+}
+
+static void popBuffer() {
+ //fprintf(stderr, "--POP--");
+ include_stack_ptr --;
+ yy_delete_buffer( YY_CURRENT_BUFFER );
+ yy_switch_to_buffer( include_stack[include_stack_ptr] );
+}
+
+/** used to copy entry to an interface module procedure */
+static void copyEntry(Entry *dest, Entry *src)
+{
+ dest->type = src->type;
+ dest->fileName = src->fileName;
+ dest->bodyLine = src->bodyLine;
+ dest->args = src->args;
+ dest->argList = new ArgumentList(*src->argList);
+ dest->doc = src->doc;
+ dest->brief = src->brief;
+}
+
+/** fill empty interface module procedures with info from
+ corresponding module subprogs
+ @TODO: handle procedures in used modules
+*/
+void resolveModuleProcedures(QList<Entry> &moduleProcedures, Entry *current_root)
+{
+ if (moduleProcedures.isEmpty()) return;
+
+ EntryListIterator eli1(moduleProcedures);
+ // for all module procedures
+ for (Entry *ce1; (ce1=eli1.current()); ++eli1)
+ {
+ // check all entries in this module
+ EntryListIterator eli2(*current_root->children());
+ for (Entry *ce2; (ce2=eli2.current()); ++eli2)
+ {
+ if (ce1->name == ce2->name)
+ {
+ copyEntry(ce1, ce2);
+ }
+ } // for procedures in current module
+ } // for all interface module procedures
+ moduleProcedures.clear();
+}
+
+static bool isTypeName(QCString name)
+{
+ name = name.lower();
+ return name=="integer" || name == "real" ||
+ name=="complex" || name == "logical";
+}
+
+/*! Extracts string which resides within parentheses of provided string. */
+static QCString extractFromParens(const QCString name)
+{
+ QCString extracted = name;
+ int start = extracted.find("(");
+ if (start != -1)
+ {
+ extracted.remove(0, start+1);
+ }
+ int end = extracted.findRev(")");
+ if (end != -1)
+ {
+ int length = extracted.length();
+ extracted.remove(end, length);
+ }
+ extracted = extracted.stripWhiteSpace();
+
+ return extracted;
+}
+
+/*! Adds passed modifiers to these modifiers.*/
+SymbolModifiers& SymbolModifiers::operator|=(const SymbolModifiers &mdfs)
+{
+ if (mdfs.protection!=NONE_P) protection = mdfs.protection;
+ if (mdfs.direction!=NONE_D) direction = mdfs.direction;
+ optional |= mdfs.optional;
+ if (!mdfs.dimension.isNull()) dimension = mdfs.dimension;
+ allocatable |= mdfs.allocatable;
+ external |= mdfs.external;
+ intrinsic |= mdfs.intrinsic;
+ parameter |= mdfs.parameter;
+ pointer |= mdfs.pointer;
+ target |= mdfs.target;
+ save |= mdfs.save;
+ deferred |= mdfs.deferred;
+ nonoverridable |= mdfs.nonoverridable;
+ nopass |= mdfs.nopass;
+ pass |= mdfs.pass;
+ passVar = mdfs.passVar;
+ return *this;
+}
+
+/*! Extracts and adds passed modifier to these modifiers.*/
+SymbolModifiers& SymbolModifiers::operator|=(QCString mdfString)
+{
+ mdfString = mdfString.lower();
+ SymbolModifiers newMdf;
+
+ if (mdfString.find("dimension")==0)
+ {
+ newMdf.dimension=mdfString;
+ }
+ else if (mdfString.contains("intent"))
+ {
+ QCString tmp = extractFromParens(mdfString);
+ bool isin = tmp.contains("in");
+ bool isout = tmp.contains("out");
+ if (isin && isout) newMdf.direction = SymbolModifiers::INOUT;
+ else if (isin) newMdf.direction = SymbolModifiers::IN;
+ else if (isout) newMdf.direction = SymbolModifiers::OUT;
+ }
+ else if (mdfString=="public")
+ {
+ newMdf.protection = SymbolModifiers::PUBLIC;
+ }
+ else if (mdfString=="private")
+ {
+ newMdf.protection = SymbolModifiers::PRIVATE;
+ }
+ else if (mdfString=="optional")
+ {
+ newMdf.optional = TRUE;
+ }
+ else if (mdfString=="allocatable")
+ {
+ newMdf.allocatable = TRUE;
+ }
+ else if (mdfString=="external")
+ {
+ newMdf.external = TRUE;
+ }
+ else if (mdfString=="intrinsic")
+ {
+ newMdf.intrinsic = TRUE;
+ }
+ else if (mdfString=="parameter")
+ {
+ newMdf.parameter = TRUE;
+ }
+ else if (mdfString=="pointer")
+ {
+ newMdf.pointer = TRUE;
+ }
+ else if (mdfString=="target")
+ {
+ newMdf.target = TRUE;
+ }
+ else if (mdfString=="save")
+ {
+ newMdf.save = TRUE;
+ }
+ else if (mdfString=="nopass")
+ {
+ newMdf.nopass = TRUE;
+ }
+ else if (mdfString=="deferred")
+ {
+ newMdf.deferred = TRUE;
+ }
+ else if (mdfString=="non_overridable")
+ {
+ newMdf.nonoverridable = TRUE;
+ }
+ else if (mdfString.contains("pass"))
+ {
+ newMdf.pass = TRUE;
+ if (mdfString.contains("("))
+ newMdf.passVar = extractFromParens(mdfString);
+ else
+ newMdf.passVar = "";
+ }
+
+ (*this) |= newMdf;
+ return *this;
+}
+
+/*! For debugging purposes. */
+//ostream& operator<<(ostream& out, const SymbolModifiers& mdfs)
+//{
+// out<<mdfs.protection<<", "<<mdfs.direction<<", "<<mdfs.optional<<
+// ", "<<(mdfs.dimension.isNull() ? "" : mdfs.dimension.latin1())<<
+// ", "<<mdfs.allocatable<<", "<<mdfs.external<<", "<<mdfs.intrinsic;
+//
+// return out;
+//}
+
+/*! Find argument with given name in \a subprog entry. */
+static Argument *findArgument(Entry* subprog, QCString name, bool byTypeName = FALSE)
+{
+ QCString cname(name.lower());
+ for (unsigned int i=0; i<subprog->argList->count(); i++)
+ {
+ Argument *arg = subprog->argList->at(i);
+ if ((!byTypeName && arg->name.lower() == cname) ||
+ (byTypeName && arg->type.lower() == cname)
+ )
+ {
+ return arg;
+ }
+ }
+ return 0;
+}
+
+/*! Find function with given name in \a entry. */
+#if 0
+static Entry *findFunction(Entry* entry, QCString name)
+{
+ QCString cname(name.lower());
+
+ EntryListIterator eli(*entry->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (ce->section != Entry::FUNCTION_SEC)
+ continue;
+
+ if (ce->name.lower() == cname)
+ return ce;
+ }
+
+ return 0;
+}
+#endif
+
+/*! Apply modifiers stored in \a mdfs to the \a typeName string. */
+static QCString applyModifiers(QCString typeName, SymbolModifiers& mdfs)
+{
+ if (!mdfs.dimension.isNull())
+ {
+ typeName += ",";
+ typeName += mdfs.dimension;
+ }
+ if (mdfs.direction!=SymbolModifiers::NONE_D)
+ {
+ typeName += ",";
+ typeName += directionStrs[mdfs.direction];
+ }
+ if (mdfs.optional)
+ {
+ typeName += ",";
+ typeName += "optional";
+ }
+ if (mdfs.allocatable)
+ {
+ typeName += ",";
+ typeName += "allocatable";
+ }
+ if (mdfs.external)
+ {
+ typeName += ",";
+ typeName += "external";
+ }
+ if (mdfs.intrinsic)
+ {
+ typeName += ",";
+ typeName += "intrinsic";
+ }
+ if (mdfs.parameter)
+ {
+ typeName += ",";
+ typeName += "parameter";
+ }
+ if (mdfs.pointer)
+ {
+ typeName += ",";
+ typeName += "pointer";
+ }
+ if (mdfs.target)
+ {
+ typeName += ",";
+ typeName += "target";
+ }
+ if (mdfs.save)
+ {
+ typeName += ",";
+ typeName += "save";
+ }
+ if (mdfs.deferred)
+ {
+ typeName += ",";
+ typeName += "deferred";
+ }
+ if (mdfs.nonoverridable)
+ {
+ typeName += ",";
+ typeName += "non_overridable";
+ }
+ if (mdfs.nopass)
+ {
+ typeName += ",";
+ typeName += "nopass";
+ }
+ if (mdfs.pass)
+ {
+ typeName += ",";
+ typeName += "pass";
+ if (!mdfs.passVar.isEmpty())
+ typeName += "(" + mdfs.passVar + ")";
+ }
+ if (mdfs.protection == SymbolModifiers::PUBLIC)
+ {
+ typeName += ",";
+ typeName += "public";
+ }
+ else if (mdfs.protection == SymbolModifiers::PRIVATE)
+ {
+ typeName += ",";
+ typeName += "private";
+ }
+
+ return typeName;
+}
+
+/*! Apply modifiers stored in \a mdfs to the \a arg argument. */
+static void applyModifiers(Argument *arg, SymbolModifiers& mdfs)
+{
+ QCString tmp = arg->type;
+ arg->type = applyModifiers(tmp, mdfs);
+}
+
+/*! Apply modifiers stored in \a mdfs to the \a ent entry. */
+static void applyModifiers(Entry *ent, SymbolModifiers& mdfs)
+{
+ QCString tmp = ent->type;
+ ent->type = applyModifiers(tmp, mdfs);
+
+ if (mdfs.protection == SymbolModifiers::PUBLIC)
+ ent->protection = Public;
+ else if (mdfs.protection == SymbolModifiers::PRIVATE)
+ ent->protection = Private;
+}
+
+/*! Starts the new scope in fortran program. Consider using this function when
+ * starting module, interface, function or other program block.
+ * \see endScope()
+ */
+static void startScope(Entry *scope)
+{
+ //cout<<"start scope: "<<scope->name<<endl;
+ current_root= scope; /* start substructure */
+
+ QMap<QCString,SymbolModifiers> mdfMap;
+ modifiers.insert(scope, mdfMap);
+}
+
+/*! Ends scope in fortran program: may update subprogram arguments or module variable attributes.
+ * \see startScope()
+ */
+static bool endScope(Entry *scope, bool isGlobalRoot)
+{
+ //cout<<"end scope: "<<scope->name<<endl;
+ if (current_root->parent() || isGlobalRoot)
+ {
+ current_root= current_root->parent(); /* end substructure */
+ }
+ else
+ {
+ fprintf(stderr,"parse error in end <scopename>");
+ scanner_abort();
+ return FALSE;
+ }
+
+ // update variables or subprogram arguments with modifiers
+ QMap<QCString,SymbolModifiers>& mdfsMap = modifiers[scope];
+
+ if (scope->section == Entry::FUNCTION_SEC)
+ {
+ // iterate all symbol modifiers of the scope
+ for (QMap<QCString,SymbolModifiers>::Iterator it=mdfsMap.begin(); it!=mdfsMap.end(); it++)
+ {
+ //cout<<it.key()<<": "<<it.data()<<endl;
+ Argument *arg = findArgument(scope, it.key());
+
+ if (arg)
+ applyModifiers(arg, it.data());
+ }
+
+ // find return type for function
+ //cout<<"RETURN NAME "<<modifiers[current_root][scope->name.lower()].returnName<<endl;
+ QCString returnName = modifiers[current_root][scope->name.lower()].returnName.lower();
+ if (modifiers[scope].contains(returnName))
+ {
+ scope->type = modifiers[scope][returnName].type; // returning type works
+ applyModifiers(scope, modifiers[scope][returnName]); // returning array works
+ }
+
+ }
+ if (scope->section == Entry::CLASS_SEC)
+ { // was INTERFACE_SEC
+ if (scope->parent()->section == Entry::FUNCTION_SEC)
+ { // interface within function
+ // iterate functions of interface and
+ // try to find types for dummy(ie. argument) procedures.
+ //cout<<"Search in "<<scope->name<<endl;
+ EntryListIterator eli(*scope->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (ce->section != Entry::FUNCTION_SEC)
+ continue;
+
+ Argument *arg = findArgument(scope->parent(), ce->name, TRUE);
+ if (arg != 0)
+ {
+ // set type of dummy procedure argument to interface
+ arg->name = arg->type;
+ arg->type = scope->name;
+ }
+ }
+ }
+ }
+ if (scope->section!=Entry::FUNCTION_SEC)
+ { // not function section
+ // iterate variables: get and apply modifiers
+ EntryListIterator eli(*scope->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (ce->section != Entry::VARIABLE_SEC && ce->section != Entry::FUNCTION_SEC)
+ continue;
+
+ //cout<<ce->name<<", "<<mdfsMap.contains(ce->name.lower())<<mdfsMap.count()<<endl;
+ if (mdfsMap.contains(ce->name.lower()))
+ applyModifiers(ce, mdfsMap[ce->name.lower()]);
+ }
+ }
+
+ // clear all modifiers of the scope
+ modifiers.remove(scope);
+
+ return TRUE;
+}
+
+//! Return full name of the entry. Sometimes we must combine several names recursively.
+static QCString getFullName(Entry *e)
+{
+ QCString name = e->name;
+ if (e->section == Entry::CLASS_SEC // || e->section == Entry::INTERFACE_SEC
+ || !e->parent() || e->parent()->name.isEmpty())
+ return name;
+
+ return getFullName(e->parent())+"::"+name;
+}
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+
+ while ( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+static void initParser()
+{
+ last_entry = 0;
+}
+
+static void initEntry()
+{
+ current->protection = defaultProtection ;
+ current->mtype = mtype;
+ current->virt = virt;
+ current->stat = gstat;
+ current->lang = SrcLangExt_F90;
+ initGroupInfo(current);
+}
+
+/**
+ adds current entry to current_root and creates new current
+*/
+static void addCurrentEntry()
+{
+ //printf("===Adding entry %s to %s\n", current->name.data(), current_root->name.data());
+ current_root->addSubEntry(current);
+ last_entry = current;
+ current = new Entry ;
+ initEntry();
+}
+
+static int max(int a, int b) {return a>b?a:b;}
+
+static void addModule(const char *name, bool isModule)
+{
+ //fprintf(stderr, "0=========> got module %s\n", name);
+
+ if (isModule)
+ current->section = Entry::NAMESPACE_SEC;
+ else
+ current->section = Entry::FUNCTION_SEC;
+
+ if (name!=NULL)
+ {
+ current->name = name;
+ }
+ else
+ {
+ QCString fname = yyFileName;
+ int index = max(fname.findRev('/'), fname.findRev('\\'));
+ fname = fname.right(fname.length()-index-1);
+ fname = fname.prepend("__").append("__");
+ current->name = fname;
+ }
+ current->type = "program";
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr; // used for source reference
+ current->protection = Public ;
+ addCurrentEntry();
+ startScope(last_entry);
+}
+
+
+static void addSubprogram(const char *text)
+{
+ //fprintf(stderr,"1=========> got subprog, type: %s\n",text);
+ current->section = Entry::FUNCTION_SEC ;
+ QCString subtype = text; subtype=subtype.lower().stripWhiteSpace();
+ if (!current->type) current->type = subtype;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr; // used for source reference
+ current->startLine = -1; // ??? what is startLine for?
+ current->args.resize(0);
+ current->argList->clear();
+ docBlock.resize(0);
+}
+
+/*! Adds interface to the root entry.
+ * \note Code was brought to this procedure from the parser,
+ * because there was/is idea to use it in several parts of the parser.
+ */
+static void addInterface(QCString name, InterfaceType type)
+{
+ if (YY_START == Start)
+ {
+ addModule(NULL);
+ yy_push_state(ModuleBody); //anon program
+ }
+
+ current->section = Entry::CLASS_SEC; // was Entry::INTERFACE_SEC;
+ current->spec = Entry::Interface;
+ current->name = name;
+
+ switch (type)
+ {
+ case IF_ABSTRACT:
+ current->type = "abstract";
+ break;
+
+ case IF_GENERIC:
+ current->type = "generic";
+ break;
+
+ case IF_SPECIFIC:
+ case IF_NONE:
+ default:
+ current->type = "";
+ }
+
+ /* if type is part of a module, mod name is necessary for output */
+ if ((current_root) &&
+ (current_root->section == Entry::CLASS_SEC ||
+ current_root->section == Entry::NAMESPACE_SEC))
+ {
+ current->name= current_root->name + "::" + current->name;
+ }
+
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr;
+ addCurrentEntry();
+}
+
+
+//-----------------------------------------------------------------------------
+
+/*! Get the argument \a name.
+ */
+static Argument* getParameter(const QCString &name)
+{
+ // std::cout<<"addFortranParameter(): "<<name<<" DOCS:"<<(docs.isNull()?QCString("null"):docs)<<std::endl;
+ Argument *ret = 0;
+ if (current_root->argList==0) return 0;
+ ArgumentListIterator ali(*current_root->argList);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (a->name.lower()==name.lower())
+ {
+ ret=a;
+ //printf("parameter found: %s\n",(const char*)name);
+ break;
+ }
+ } // for
+ return ret;
+}
+
+ //----------------------------------------------------------------------------
+static void startCommentBlock(bool brief)
+{
+ if (brief)
+ {
+ current->briefFile = yyFileName;
+ current->briefLine = yyLineNr;
+ }
+ else
+ {
+ current->docFile = yyFileName;
+ current->docLine = yyLineNr;
+ }
+}
+
+ //----------------------------------------------------------------------------
+static void handleCommentBlock(const QCString &doc,bool brief)
+{
+ docBlockInBody = FALSE;
+ bool needsEntry = FALSE;
+ static bool hideInBodyDocs = Config_getBool("HIDE_IN_BODY_DOCS");
+ int position=0;
+ if (docBlockInBody && hideInBodyDocs) return;
+ //fprintf(stderr,"call parseCommentBlock [%s]\n",doc.data());
+ int lineNr = brief ? current->briefLine : current->docLine;
+ while (parseCommentBlock(
+ g_thisParser,
+ docBlockInBody ? last_entry : current,
+ doc, // text
+ yyFileName, // file
+ lineNr,
+ docBlockInBody ? FALSE : brief,
+ docBlockInBody ? FALSE : docBlockJavaStyle,
+ docBlockInBody,
+ defaultProtection,
+ position,
+ needsEntry
+ ))
+ {
+ //fprintf(stderr,"parseCommentBlock position=%d [%s] needsEntry=%d\n",position,doc.data()+position,needsEntry);
+ if (needsEntry) addCurrentEntry();
+ }
+ //fprintf(stderr,"parseCommentBlock position=%d [%s] needsEntry=%d\n",position,doc.data()+position,needsEntry);
+
+ if (needsEntry) addCurrentEntry();
+}
+
+//----------------------------------------------------------------------------
+static int level=0;
+static void debugCompounds(Entry *rt) // print Entry structure (for debugging)
+{
+ level++;
+ printf("%d) debugCompounds(%s) line %d\n",level, rt->name.data(), rt->bodyLine);
+ EntryListIterator eli(*rt->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ debugCompounds(ce);
+ }
+level--;
+}
+
+
+static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+{
+ initParser();
+
+ defaultProtection = Public;
+ inputString = fileBuf;
+ inputPosition = 0;
+ inputStringPrepass = NULL;
+ inputPositionPrepass = 0;
+
+ //anonCount = 0; // don't reset per file
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ current_root = rt;
+ global_root = rt;
+ inputFile.setName(fileName);
+ if (inputFile.open(IO_ReadOnly))
+ {
+ isFixedForm = recognizeFixedForm(fileBuf);
+
+ if (isFixedForm) {
+ printf("Prepassing fixed form of %s\n", fileName);
+ //printf("---strlen=%d\n", strlen(fileBuf));
+ //clock_t start=clock();
+
+ inputString = prepassFixedForm(fileBuf);
+
+ //clock_t end=clock();
+ //printf("CPU time used=%f\n", ((double) (end-start))/CLOCKS_PER_SEC);
+ }
+
+ yyLineNr= 1 ;
+ yyFileName = fileName;
+ msg("Parsing file %s...\n",yyFileName.data());
+
+ startScope(rt); // implies current_root = rt
+ initParser();
+ groupEnterFile(yyFileName,yyLineNr);
+
+ current = new Entry;
+ current->lang = SrcLangExt_F90;
+ current->name = yyFileName;
+ current->section = Entry::SOURCE_SEC;
+ current_root->addSubEntry(current);
+ file_root = current;
+ current = new Entry;
+ current->lang = SrcLangExt_F90;
+
+ fscanYYrestart( fscanYYin );
+ {
+ BEGIN( Start );
+ }
+
+ fscanYYlex();
+ groupLeaveFile(yyFileName,yyLineNr);
+
+ endScope(current_root, TRUE); // TRUE - global root
+
+ //debugCompounds(rt); //debug
+
+ rt->program.resize(0);
+ delete current; current=0;
+ moduleProcedures.clear();
+ if (isFixedForm) {
+ free((char*)inputString);
+ inputString=NULL;
+ }
+
+ inputFile.close();
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void FortranLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+{
+ g_thisParser = this;
+ ::parseMain(fileName,fileBuf,root);
+}
+
+void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
+ const char * scopeName,
+ const QCString & input,
+ bool isExampleBlock,
+ const char * exampleName,
+ FileDef * fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ MemberDef *memberDef,
+ bool showLineNumbers
+ )
+{
+ ::parseFortranCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
+ fileDef,startLine,endLine,inlineFragment,memberDef,
+ showLineNumbers);
+}
+
+bool FortranLanguageScanner::needsPreprocessing(const QCString &extension)
+{
+ return !(extension==".f"||extension==".f90"||
+ extension==".f95"||extension==".f03");
+}
+void FortranLanguageScanner::resetCodeParserState()
+{
+ ::resetFortranCodeParserState();
+}
+
+void FortranLanguageScanner::parsePrototype(const char *text)
+{
+ (void)text;
+}
+
+static void scanner_abort()
+{
+ fprintf(stderr,"********************************************************************\n");
+ fprintf(stderr,"Error in file %s line: %d, state: %d\n",yyFileName.data(),yyLineNr,YY_START);
+ fprintf(stderr,"********************************************************************\n");
+
+ EntryListIterator eli(*global_root->children());
+ Entry *ce;
+ bool start=FALSE;
+
+ for (;(ce=eli.current());++eli)
+ {
+ if (ce == file_root) start=TRUE;
+ if (start) ce->reset();
+ }
+
+ // dummy call to avoid compiler warning
+ (void)yy_top_state();
+
+ return;
+ //exit(-1);
+}
+
+//----------------------------------------------------------------------------
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void fscannerYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
diff --git a/src/ftextstream.cpp b/src/ftextstream.cpp
new file mode 100644
index 0000000..f72185f
--- /dev/null
+++ b/src/ftextstream.cpp
@@ -0,0 +1,259 @@
+#include "ftextstream.h"
+#include <qfile.h>
+
+//----------------------------------------------------------------------------
+
+class QGStringBuffer : public QIODevice
+{
+ public:
+ QGStringBuffer( QGString* str );
+ ~QGStringBuffer();
+ bool open( int m );
+ void close();
+ void flush();
+ uint size() const;
+ int at() const;
+ bool at( int pos );
+ int readBlock( char *, uint) { return -1; }
+ int writeBlock( const char *p, uint len );
+ int getch() { return -1; }
+ int putch( int ch );
+ int ungetch( int ) { return -1; }
+
+ protected:
+ QGString* m_str;
+
+ private: // Disabled copy constructor and operator=
+ QGStringBuffer( const QGStringBuffer & );
+ QGStringBuffer &operator=( const QGStringBuffer & );
+};
+
+QGStringBuffer::QGStringBuffer( QGString* str ) : m_str(str)
+{
+ //printf("QGStringBuffer::QGStringBuffer(%p)\n",str);
+}
+
+QGStringBuffer::~QGStringBuffer()
+{
+}
+
+bool QGStringBuffer::open( int m )
+{
+ if ( !m_str )
+ {
+#if defined(CHECK_STATE)
+ qWarning( "QGStringBuffer::open: No string" );
+#endif
+ return FALSE;
+ }
+ if ( isOpen() )
+ { // buffer already open
+#if defined(CHECK_STATE)
+ qWarning( "QGStringBuffer::open: Buffer already open" );
+#endif
+ return FALSE;
+ }
+ setMode( m );
+ if ( m & IO_Truncate )
+ { // truncate buffer
+ m_str->truncate( 0 );
+ }
+ if ( m & IO_Append )
+ { // append to end of buffer
+ ioIndex = m_str->length();
+ }
+ else
+ {
+ ioIndex = 0;
+ }
+ setState( IO_Open );
+ setStatus( 0 );
+ return TRUE;
+}
+
+void QGStringBuffer::close()
+{
+ if ( isOpen() )
+ {
+ setFlags( IO_Direct );
+ ioIndex = 0;
+ }
+}
+
+void QGStringBuffer::flush()
+{
+}
+
+uint QGStringBuffer::size() const
+{
+ return m_str ? m_str->length() : 0;
+}
+
+int QGStringBuffer::at() const
+{
+ return ioIndex;
+}
+
+bool QGStringBuffer::at( int pos )
+{
+#if defined(CHECK_STATE)
+ if ( !isOpen() )
+ {
+ qWarning( "QGStringBuffer::at: Buffer is not open" );
+ return FALSE;
+ }
+#endif
+ if ( (uint)pos >= m_str->length() )
+ {
+#if defined(CHECK_RANGE)
+ qWarning( "QGStringBuffer::at: Index %d out of range", pos );
+#endif
+ return FALSE;
+ }
+
+ ioIndex = pos;
+ return TRUE;
+}
+
+int QGStringBuffer::writeBlock( const char *p, uint len )
+{
+ //printf("QGStringBuffer::writeBlock(%p,%d) m_str=%p ioIndex=%d\n",p,len,
+ // m_str,ioIndex);
+ m_str->enlarge(ioIndex+len+1);
+ memcpy(m_str->data()+ioIndex,p,len);
+ ioIndex+=len;
+ m_str->data()[ioIndex]='\0';
+ m_str->setLen(ioIndex);
+ return len;
+}
+
+int QGStringBuffer::putch( int ch )
+{
+ //printf("QGStringBuffer::putch(%d) m_str=%p ioIndex=%d\n",
+ // ch,m_str,ioIndex);
+ m_str->enlarge(ioIndex+2);
+ m_str->data()[ioIndex] = (char)ch;
+ ioIndex++;
+ m_str->data()[ioIndex] = '\0';
+ m_str->setLen(ioIndex);
+ return ch;
+}
+
+
+//----------------------------------------------------------------------------
+
+FTextStream::FTextStream()
+{
+ m_dev = 0;
+ m_owndev = FALSE;
+}
+
+FTextStream::FTextStream( QIODevice *dev )
+{
+ m_dev = dev;
+ m_owndev = FALSE;
+}
+
+FTextStream::FTextStream( QGString *s )
+{
+ m_dev = new QGStringBuffer(s);
+ ((QGStringBuffer*)m_dev)->open( IO_WriteOnly );
+ m_owndev = TRUE;
+}
+
+FTextStream::FTextStream( FILE *fh )
+{
+ m_dev = new QFile;
+ ((QFile *)m_dev)->open( IO_WriteOnly, fh);
+}
+
+FTextStream::~FTextStream()
+{
+ if (m_owndev) delete m_dev;
+ m_dev = 0;
+}
+
+QIODevice *FTextStream::device() const
+{
+ return m_dev;
+}
+
+void FTextStream::setDevice( QIODevice *dev )
+{
+ if (m_owndev)
+ {
+ delete m_dev;
+ m_owndev = FALSE;
+ }
+ m_dev = dev;
+}
+
+void FTextStream::unsetDevice()
+{
+ setDevice(0);
+}
+
+FTextStream &FTextStream::output_int( ulong n, bool neg )
+{
+ char buf[20];
+ char *p = &buf[19];
+ *p = '\0';
+ if ( neg )
+ {
+ n = (ulong)(-(long)n);
+ }
+ do
+ {
+ *--p = ((int)(n%10)) + '0';
+ n /= 10;
+ } while ( n );
+ if ( neg ) *--p = '-';
+ return operator<<(p);
+}
+
+FTextStream &FTextStream::operator<<( signed short i )
+{
+ return output_int( i, i < 0 );
+}
+
+FTextStream &FTextStream::operator<<( unsigned short i )
+{
+ return output_int( i, FALSE );
+}
+
+FTextStream &FTextStream::operator<<( signed int i )
+{
+ return output_int( i, i < 0 );
+}
+
+FTextStream &FTextStream::operator<<( unsigned int i )
+{
+ return output_int( i, FALSE );
+}
+
+FTextStream &FTextStream::operator<<( signed long i )
+{
+ return output_int( i, i < 0 );
+}
+
+FTextStream &FTextStream::operator<<( unsigned long i )
+{
+ return output_int( i, FALSE );
+}
+
+FTextStream &FTextStream::operator<<( float f )
+{
+ return *this << (double)f;
+}
+
+FTextStream &FTextStream::operator<<( double d )
+{
+ char buf[64];
+ sprintf(buf,"%f",d);
+ return *this << buf;
+}
+
+
+
+
+
diff --git a/src/ftextstream.h b/src/ftextstream.h
new file mode 100644
index 0000000..63ef244
--- /dev/null
+++ b/src/ftextstream.h
@@ -0,0 +1,82 @@
+#ifndef FTEXTSTREAM_H
+#define FTEXTSTREAM_H
+
+#include "qtbc.h"
+#include "qiodevice.h"
+#include "qstring.h"
+#include "qgstring.h"
+#include <stdio.h>
+
+/** @brief Simplified and optimized version of QTextStream */
+class FTextStream
+{
+ public:
+ FTextStream();
+ FTextStream( QIODevice * );
+ FTextStream( QGString * );
+ FTextStream( FILE * );
+ virtual ~FTextStream();
+
+ QIODevice *device() const;
+ void setDevice( QIODevice * );
+ void unsetDevice();
+
+ FTextStream &operator<<( char );
+ FTextStream &operator<<( const char *);
+ FTextStream &operator<<( const QString & );
+ FTextStream &operator<<( const QCString & );
+ FTextStream &operator<<( signed short );
+ FTextStream &operator<<( unsigned short );
+ FTextStream &operator<<( signed int );
+ FTextStream &operator<<( unsigned int );
+ FTextStream &operator<<( signed long );
+ FTextStream &operator<<( unsigned long );
+ FTextStream &operator<<( float );
+ FTextStream &operator<<( double );
+
+ private:
+ QIODevice *m_dev;
+ bool m_owndev;
+ FTextStream &output_int( ulong n, bool neg );
+
+ private: // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+ FTextStream( const FTextStream & );
+ FTextStream &operator=( const FTextStream & );
+#endif
+};
+
+inline FTextStream &FTextStream::operator<<( char c)
+{
+ m_dev->putch(c);
+ return *this;
+}
+
+inline FTextStream &FTextStream::operator<<( const char* s)
+{
+ uint len = qstrlen( s );
+ m_dev->writeBlock( s, len );
+ return *this;
+}
+
+inline FTextStream &FTextStream::operator<<( const QString & s)
+{
+ return operator<<(s.data());
+}
+
+inline FTextStream &FTextStream::operator<<( const QCString &s)
+{
+ return operator<<(s.data());
+}
+
+typedef FTextStream & (*FTSFUNC)(FTextStream &);// manipulator function
+
+inline FTextStream &operator<<( FTextStream &s, FTSFUNC f )
+{ return (*f)( s ); }
+
+inline FTextStream &endl( FTextStream & s)
+{
+ return s << '\n';
+}
+
+#endif // FTEXTSTREAM_H
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
new file mode 100644
index 0000000..b86a85b
--- /dev/null
+++ b/src/ftvhelp.cpp
@@ -0,0 +1,1364 @@
+/******************************************************************************
+ * ftvhelp.cpp,v 1.0 2000/09/06 16:09:00
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Contributed by Kenney Wong <kwong@ea.com>
+ * Modified by Dimitri van Heesch
+ *
+ * Folder Tree View for offline help on browsers that do not support HTML Help.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <qlist.h>
+#include <qdict.h>
+#include <qfileinfo.h>
+
+#include "ftvhelp.h"
+#include "config.h"
+#include "message.h"
+#include "doxygen.h"
+#include "language.h"
+#include "htmlgen.h"
+#include "layout.h"
+
+#define MAX_INDENT 1024
+
+
+static const char navtree_script[]=
+#include "navtree_js.h"
+;
+
+static const char resize_script[]=
+#include "resize_js.h"
+;
+
+#if 0
+static const char jquery_script1[]=
+#include "jquery_js.h"
+;
+static const char jquery_script2[]=
+#include "sizzle_js.h"
+;
+static const char jquery_script3[]=
+#include "jquery_ui_js.h"
+;
+#endif
+
+static const char navtree_css[]=
+#include "navtree_css.h"
+;
+
+
+#if 0
+unsigned char ftv2blank_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
+ 0x01, 0x00, 0x00, 0x00, 0x01, 0x96, 0xd6, 0x11, 0x47, 0x00, 0x00, 0x00,
+ 0x02, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x01, 0x01, 0x94, 0xfd, 0xae, 0x00,
+ 0x00, 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77,
+ 0x61, 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20,
+ 0x32, 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00,
+ 0x25, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74,
+ 0x00, 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53,
+ 0x6d, 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65,
+ 0x72, 0x20, 0x32, 0x2e, 0x30, 0x21, 0xf8, 0xd7, 0x5e, 0x53, 0x00, 0x00,
+ 0x00, 0x14, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x38, 0xc0, 0x80,
+ 0x80, 0x1f, 0x30, 0xe0, 0x7f, 0x42, 0x90, 0x00, 0x02, 0x00, 0x78, 0x3c,
+ 0x32, 0xcb, 0x72, 0x8f, 0x7c, 0x12, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
+ 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2doc_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x16,
+ 0x04, 0x03, 0x00, 0x00, 0x01, 0x5f, 0x54, 0x71, 0x2d, 0x00, 0x00, 0x00,
+ 0x15, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff,
+ 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0xb3, 0xbd, 0xfb, 0xc8, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52,
+ 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74,
+ 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00,
+ 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e,
+ 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x76, 0x49, 0x44, 0x41,
+ 0x54, 0x78, 0xda, 0x63, 0x60, 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x64,
+ 0x00, 0x01, 0x27, 0x30, 0x62, 0x71, 0x01, 0xe2, 0x24, 0x06, 0x38, 0x60,
+ 0x71, 0x00, 0xca, 0x27, 0x33, 0x30, 0x30, 0x01, 0x31, 0xa3, 0x32, 0x03,
+ 0x0a, 0x70, 0x54, 0x32, 0x01, 0x53, 0x69, 0x60, 0x71, 0x27, 0x08, 0x15,
+ 0x1a, 0x1a, 0xca, 0x80, 0x01, 0x5c, 0x5c, 0xc0, 0x94, 0xa2, 0x90, 0x02,
+ 0x88, 0x52, 0x4b, 0x52, 0x05, 0x53, 0x69, 0xc8, 0x94, 0x18, 0x84, 0x52,
+ 0x52, 0x12, 0xc5, 0x69, 0x0a, 0x36, 0xe0, 0xa4, 0xa4, 0xa4, 0x68, 0x82,
+ 0xc4, 0x51, 0x82, 0x6b, 0x04, 0x71, 0x14, 0x4d, 0x61, 0x4e, 0x55, 0x04,
+ 0xf2, 0x60, 0x1c, 0x27, 0x45, 0x24, 0x19, 0x90, 0x01, 0x70, 0x19, 0x67,
+ 0x63, 0x20, 0x30, 0xc5, 0x6f, 0x23, 0x00, 0xf5, 0xd0, 0x11, 0xe0, 0x55,
+ 0x83, 0x47, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
+ 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2folderclosed_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x16,
+ 0x04, 0x03, 0x00, 0x00, 0x01, 0x5f, 0x54, 0x71, 0x2d, 0x00, 0x00, 0x00,
+ 0x12, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
+ 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x42,
+ 0xee, 0x40, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00,
+ 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74, 0x45, 0x58, 0x74,
+ 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x67, 0x69, 0x66,
+ 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e,
+ 0x47, 0x0e, 0x00, 0x00, 0x00, 0x7d, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda,
+ 0x8d, 0x8e, 0xc1, 0x0a, 0x84, 0x30, 0x10, 0x43, 0x23, 0x8c, 0x77, 0x0f,
+ 0xfb, 0x03, 0x42, 0xbd, 0x2b, 0xf8, 0x01, 0x65, 0x6d, 0xef, 0xa2, 0xcd,
+ 0xff, 0xff, 0x8a, 0x33, 0xad, 0xee, 0x5a, 0xf6, 0xb0, 0x06, 0xda, 0xf0,
+ 0x86, 0xa6, 0x13, 0x00, 0x88, 0x40, 0x03, 0x53, 0x02, 0x82, 0x9a, 0xd7,
+ 0x51, 0x42, 0x25, 0xae, 0x7a, 0x76, 0xa0, 0xed, 0xea, 0x79, 0x79, 0x17,
+ 0x49, 0x73, 0xe1, 0xf2, 0x32, 0x14, 0x8f, 0x5f, 0x49, 0xb9, 0xed, 0x23,
+ 0x60, 0x20, 0xcd, 0x36, 0x66, 0xe4, 0x40, 0x4b, 0xb4, 0xdb, 0xdb, 0xe5,
+ 0x16, 0xee, 0x16, 0x78, 0x20, 0xf9, 0x96, 0x15, 0x6d, 0xc2, 0x8b, 0xa2,
+ 0x6e, 0xf9, 0x50, 0x64, 0xa6, 0x70, 0xb6, 0x50, 0x0a, 0xd3, 0x78, 0x86,
+ 0x98, 0xa6, 0xde, 0x5d, 0x9d, 0x25, 0xcd, 0xfe, 0xdf, 0xc6, 0x03, 0xa0,
+ 0x13, 0x15, 0x98, 0x60, 0xbd, 0x81, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x49,
+ 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2folderopen_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x16,
+ 0x04, 0x03, 0x00, 0x00, 0x01, 0x5f, 0x54, 0x71, 0x2d, 0x00, 0x00, 0x00,
+ 0x15, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff,
+ 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80,
+ 0x00, 0x80, 0x92, 0x32, 0x8c, 0xe5, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52,
+ 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74,
+ 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00,
+ 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e,
+ 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x7c, 0x49, 0x44, 0x41,
+ 0x54, 0x78, 0xda, 0x85, 0x8d, 0x41, 0x0e, 0x82, 0x30, 0x10, 0x45, 0x5f,
+ 0x08, 0xf5, 0x1e, 0x2d, 0x53, 0xd6, 0xc6, 0x18, 0xd7, 0x8d, 0x18, 0xd7,
+ 0x06, 0xd2, 0x1e, 0xa0, 0xb1, 0xde, 0xff, 0x08, 0x3a, 0x20, 0x21, 0x10,
+ 0xa2, 0x6f, 0xf3, 0xfe, 0xff, 0x8b, 0x19, 0x80, 0x0a, 0x6a, 0x14, 0x81,
+ 0x3c, 0x06, 0x2a, 0x61, 0xc5, 0xd3, 0x43, 0x69, 0xc1, 0xb4, 0xab, 0xf9,
+ 0x70, 0xac, 0x83, 0xca, 0xbb, 0xfb, 0xa4, 0x8b, 0xae, 0x26, 0x46, 0xb6,
+ 0x4c, 0x0f, 0xe8, 0xc3, 0x18, 0xfa, 0xb3, 0x7d, 0xa8, 0x1a, 0xeb, 0x17,
+ 0xa5, 0x46, 0x54, 0x46, 0x4e, 0x2a, 0xe2, 0xce, 0x95, 0x3d, 0xba, 0xb0,
+ 0x64, 0x93, 0x85, 0x9b, 0x0b, 0x73, 0x71, 0x83, 0x75, 0xd7, 0xf2, 0xa7,
+ 0x90, 0xf2, 0x20, 0x9d, 0xfb, 0x16, 0xd2, 0xeb, 0x43, 0xf9, 0xfd, 0xf2,
+ 0x0d, 0xa4, 0x29, 0x14, 0xcb, 0xda, 0x47, 0xac, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2lastnode_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
+ 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
+ 0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x18, 0xd3, 0xa0, 0x90, 0x00, 0x00, 0x00,
+ 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
+ 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
+ 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
+ 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x26,
+ 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00,
+ 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
+ 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x20, 0x32, 0x2e, 0x30, 0x69, 0x01, 0x6f, 0x3f, 0xcd, 0x06, 0x00, 0x00,
+ 0x00, 0x13, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x18, 0x30,
+ 0xc0, 0x4f, 0x0c, 0x03, 0x04, 0xc8, 0x33, 0x1e, 0x00, 0x24, 0xa7, 0x00,
+ 0x88, 0x10, 0xca, 0x33, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
+ 0x44, 0xae, 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2link_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x16,
+ 0x04, 0x03, 0x00, 0x00, 0x01, 0x5f, 0x54, 0x71, 0x2d, 0x00, 0x00, 0x00,
+ 0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xff, 0x00, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7e, 0x9b, 0x08, 0x00, 0x00, 0x00,
+ 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
+ 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
+ 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
+ 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x26,
+ 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00,
+ 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
+ 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x20, 0x32, 0x2e, 0x30, 0x19, 0x02, 0xd9, 0x09, 0xe5, 0x4a, 0x00, 0x00,
+ 0x00, 0x90, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x7d, 0x8c, 0xb1, 0x0a,
+ 0xc2, 0x30, 0x14, 0x45, 0x6f, 0x33, 0xb4, 0x63, 0x7e, 0xa1, 0x53, 0x57,
+ 0x8b, 0x7e, 0x80, 0x6e, 0xae, 0x16, 0x5a, 0xb2, 0xbe, 0x3a, 0x64, 0x35,
+ 0xb8, 0x64, 0xec, 0x2f, 0x07, 0x05, 0x1d, 0x9f, 0x79, 0x8d, 0x21, 0x50,
+ 0xd0, 0x03, 0xc9, 0xcd, 0xe1, 0xbe, 0x17, 0x00, 0xa8, 0x00, 0x82, 0xe0,
+ 0x81, 0x66, 0x7d, 0xc0, 0x9e, 0x51, 0x70, 0x40, 0x1d, 0xcf, 0xad, 0x07,
+ 0x18, 0x1b, 0x74, 0x90, 0xdb, 0x1c, 0x62, 0x0f, 0xe2, 0x20, 0xc1, 0xcc,
+ 0x61, 0x3b, 0x06, 0x6a, 0xbb, 0x14, 0x3b, 0xe9, 0x68, 0xba, 0xac, 0x51,
+ 0x9d, 0x24, 0xec, 0xdc, 0x4b, 0x68, 0xed, 0xd2, 0x5e, 0x1b, 0x7e, 0xfd,
+ 0x92, 0xa8, 0x6d, 0x84, 0xb2, 0x28, 0x28, 0x38, 0xca, 0xd2, 0x4c, 0x46,
+ 0x2d, 0x59, 0xcc, 0x38, 0x5c, 0x8b, 0xcc, 0xe3, 0xfe, 0x2b, 0x71, 0xfa,
+ 0x79, 0xbc, 0x67, 0x79, 0x85, 0x07, 0x54, 0x69, 0xde, 0xde, 0x2f, 0xf8,
+ 0xcf, 0x07, 0x71, 0x95, 0x2b, 0xa1, 0x10, 0x78, 0xd0, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2mlastnode_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
+ 0x02, 0x03, 0x00, 0x00, 0x01, 0xc3, 0xc3, 0xc4, 0x79, 0x00, 0x00, 0x00,
+ 0x09, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x00,
+ 0x00, 0x00, 0x3c, 0x5e, 0xbb, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52,
+ 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74,
+ 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00,
+ 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e,
+ 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x23, 0x49, 0x44, 0x41,
+ 0x54, 0x78, 0xda, 0x63, 0x60, 0x20, 0x0b, 0x08, 0x08, 0x20, 0x10, 0x0a,
+ 0x60, 0x84, 0x11, 0x8c, 0xa1, 0xa1, 0x20, 0x06, 0x90, 0xc9, 0xa8, 0xb5,
+ 0x50, 0x10, 0xca, 0x02, 0x89, 0x61, 0x01, 0x00, 0x6d, 0x17, 0x02, 0xba,
+ 0xc0, 0xdc, 0x69, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
+ 0xae, 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2mnode_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
+ 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
+ 0x24, 0x50, 0x4c, 0x54, 0x45, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x53, 0xbe, 0x1e, 0x99, 0x00, 0x00, 0x00,
+ 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
+ 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
+ 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
+ 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x2a,
+ 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0xa0, 0x2e, 0xe0, 0x06,
+ 0x42, 0x74, 0x02, 0xa7, 0x52, 0x54, 0x06, 0xf7, 0x6e, 0x20, 0x80, 0xf1,
+ 0xc1, 0x62, 0xdc, 0x4c, 0x4a, 0x4a, 0xdc, 0xdc, 0xdc, 0xc8, 0x22, 0x30,
+ 0x35, 0x98, 0xda, 0xd1, 0x19, 0x00, 0xb7, 0x79, 0x07, 0x27, 0xaa, 0xf7,
+ 0x96, 0x03, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+ 0x60, 0x82
+};
+
+unsigned char ftv2node_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
+ 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
+ 0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x18, 0xd3, 0xa0, 0x90, 0x00, 0x00, 0x00,
+ 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
+ 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
+ 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
+ 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x26,
+ 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00,
+ 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
+ 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x20, 0x32, 0x2e, 0x30, 0x69, 0x01, 0x6f, 0x3f, 0xcd, 0x06, 0x00, 0x00,
+ 0x00, 0x15, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x18, 0x30,
+ 0xc0, 0x4f, 0x0c, 0x03, 0x04, 0x88, 0x56, 0x8c, 0xc2, 0x00, 0x00, 0x2e,
+ 0x52, 0x00, 0xe2, 0xfa, 0x45, 0x3a, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x49,
+ 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2plastnode_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
+ 0x02, 0x03, 0x00, 0x00, 0x01, 0xc3, 0xc3, 0xc4, 0x79, 0x00, 0x00, 0x00,
+ 0x09, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x00,
+ 0x00, 0x00, 0x3c, 0x5e, 0xbb, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52,
+ 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74,
+ 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00,
+ 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e,
+ 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x28, 0x49, 0x44, 0x41,
+ 0x54, 0x78, 0xda, 0x63, 0x60, 0x20, 0x0b, 0x08, 0x08, 0x30, 0x08, 0x81,
+ 0x11, 0x90, 0x81, 0x02, 0x18, 0x61, 0x04, 0x63, 0x68, 0x28, 0x90, 0x60,
+ 0x02, 0x32, 0x19, 0xb5, 0x16, 0x0a, 0x42, 0x59, 0x20, 0x31, 0x2c, 0x00,
+ 0x00, 0x6e, 0xc1, 0x02, 0xc2, 0xe5, 0xed, 0x75, 0xa7, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2pnode_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
+ 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
+ 0x24, 0x50, 0x4c, 0x54, 0x45, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x53, 0xbe, 0x1e, 0x99, 0x00, 0x00, 0x00,
+ 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
+ 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
+ 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
+ 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x30,
+ 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0xa0, 0x2e, 0xe0, 0x06,
+ 0x42, 0x06, 0x6e, 0x26, 0x38, 0x01, 0xe2, 0xe2, 0x54, 0x8a, 0xca, 0xe0,
+ 0xde, 0x0d, 0x04, 0x10, 0x3e, 0x13, 0x44, 0x8c, 0x9b, 0x49, 0x49, 0x89,
+ 0x9b, 0x9b, 0x1b, 0x59, 0x04, 0xa6, 0x06, 0x53, 0x3b, 0x3a, 0x03, 0x00,
+ 0xba, 0x6b, 0x07, 0x2f, 0xaa, 0xcb, 0x1f, 0x6f, 0x00, 0x00, 0x00, 0x00,
+ 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+
+unsigned char ftv2vertline_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
+ 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
+ 0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x18, 0xd3, 0xa0, 0x90, 0x00, 0x00, 0x00,
+ 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
+ 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
+ 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
+ 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x26,
+ 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00,
+ 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
+ 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x20, 0x32, 0x2e, 0x30, 0x69, 0x01, 0x6f, 0x3f, 0xcd, 0x06, 0x00, 0x00,
+ 0x00, 0x0f, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x18, 0x30,
+ 0xc0, 0x4f, 0x5b, 0x06, 0x00, 0x21, 0x14, 0x00, 0xa6, 0xe5, 0x3c, 0xe8,
+ 0x3a, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
+ 0x82
+};
+#endif
+
+
+static unsigned char blank_png[352] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static unsigned char folderopen_png[528] =
+{
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,228,195,193,190,187,218,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,195,215,221,225,225,178,176,176,175,176,178,180,255,255,255,255,255,255,
+ 255,255,255,255,255,255,189,206,215,219,226,220,214,212,207,204,200,176,255,255,255,255,255,255,
+ 255,255,255,255,168,154,153,153,152,152,151,149,150,150,149,147,146,145,145,167,255,255,255,255,
+ 255,255,255,255,146,187,187,188,187,187,185,183,183,182,179,178,175,173,174,145,255,255,255,255,
+ 255,255,255,255,146,180,182,182,181,181,179,178,176,174,173,171,169,170,168,144,255,255,255,255,
+ 255,255,255,255,144,173,176,176,177,175,175,174,171,170,168,168,166,166,164,143,255,255,255,255,
+ 255,255,255,255,142,168,170,171,170,170,169,168,166,166,165,163,163,164,162,142,255,255,255,255,
+ 255,255,255,255,141,162,166,164,164,165,163,163,161,161,161,161,161,160,159,141,255,255,255,255,
+ 255,255,255,255,138,157,159,159,158,158,158,157,157,157,157,156,157,157,155,138,255,255,255,255,
+ 255,255,255,255,137,154,153,154,154,153,154,154,154,153,154,154,154,154,154,137,255,255,255,255,
+ 255,255,255,255,137,154,154,154,154,154,154,154,153,154,154,153,153,153,154,137,255,255,255,255,
+ 255,255,255,255,137,125,125,125,125,124,125,124,124,125,124,124,125,124,125,138,255,255,255,255,
+ 255,255,255,255,212,209,204,199,193,190,186,183,180,181,185,188,192,197,202,203,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+};
+
+static unsigned char folderopen_a_png[528] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static unsigned char folderclosed_png[528] =
+{
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,197,155,155,155,155,196,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,155,191,191,191,192,155,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,168,144,180,180,181,180,145,145,146,145,146,146,146,146,145,167,255,255,255,255,
+ 255,255,255,255,147,225,226,226,225,226,225,221,221,219,215,214,212,211,213,145,255,255,255,255,
+ 255,255,255,255,147,212,211,211,210,211,210,205,206,205,201,201,199,196,201,145,255,255,255,255,
+ 255,255,255,255,146,204,203,204,203,203,202,200,200,197,197,196,195,194,196,145,255,255,255,255,
+ 255,255,255,255,146,202,200,201,201,200,199,198,198,195,194,194,193,192,194,145,255,255,255,255,
+ 255,255,255,255,145,200,196,196,196,195,195,193,192,192,190,189,189,189,191,143,255,255,255,255,
+ 255,255,255,255,143,192,191,190,190,189,189,188,186,187,186,185,185,185,187,142,255,255,255,255,
+ 255,255,255,255,142,186,184,183,182,183,182,183,180,181,181,181,181,181,182,141,255,255,255,255,
+ 255,255,255,255,138,177,175,176,176,177,177,176,175,174,175,175,175,174,176,138,255,255,255,255,
+ 255,255,255,255,138,173,169,170,168,170,169,170,170,169,171,171,171,171,174,137,255,255,255,255,
+ 255,255,255,255,138,166,163,163,162,162,162,162,162,162,164,163,163,163,166,137,255,255,255,255,
+ 255,255,255,255,137,124,124,124,125,124,124,124,125,125,124,124,125,124,125,138,255,255,255,255,
+ 255,255,255,255,231,231,228,225,222,220,218,216,214,215,217,219,221,224,227,226,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+};
+
+static unsigned char folderclosed_a_png[528] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static unsigned char doc_png[528] =
+{
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,218,214,208,208,204,191,179,190,197,209,231,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,195,224,226,226,222,214,204,181,203,229,188,225,255,255,255,255,255,255,255,
+ 255,255,255,255,255,198,226,228,227,227,224,215,203,180,252,229,184,224,255,255,255,255,255,255,
+ 255,255,255,255,255,198,229,230,229,229,228,224,214,154,252,252,229,187,235,255,255,255,255,255,
+ 255,255,255,255,255,198,232,233,233,232,231,230,223,176,154,144,165,177,216,255,255,255,255,255,
+ 255,255,255,255,255,198,236,236,216,226,238,219,232,225,209,190,189,166,193,255,255,255,255,255,
+ 255,255,255,255,255,198,239,240,178,177,230,175,169,184,188,219,208,189,187,255,255,255,255,255,
+ 255,255,255,255,255,198,241,242,240,218,237,236,240,235,241,244,221,208,182,255,255,255,255,255,
+ 255,255,255,255,255,198,243,243,188,154,183,158,166,140,185,198,231,219,177,255,255,255,255,255,
+ 255,255,255,255,255,198,243,245,248,228,241,241,226,249,237,227,239,232,177,255,255,255,255,255,
+ 255,255,255,255,255,198,244,246,213,172,163,149,171,200,167,149,242,239,177,255,255,255,255,255,
+ 255,255,255,255,255,198,249,248,240,218,237,236,240,235,241,244,244,242,177,255,255,255,255,255,
+ 255,255,255,255,255,198,249,251,188,155,184,158,166,140,185,198,246,244,177,255,255,255,255,255,
+ 255,255,255,255,255,198,251,253,248,228,241,241,226,249,237,227,249,246,177,255,255,255,255,255,
+ 255,255,255,255,255,196,253,252,252,252,252,251,251,250,250,249,249,248,175,255,255,255,255,255,
+ 255,255,255,255,255,194, 64, 30, 37, 37, 37, 37, 37, 37, 37, 37, 30, 64,188,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+};
+
+static unsigned char doc_a_png[528] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static unsigned char arrow_right_png[352] =
+{
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,152,152,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,152,152,152,152,255,255,255,255,255,255,255,255,255,
+ 255,255,255,152,152,152,152,152,255,255,255,255,255,255,255,255,
+ 255,255,255,152,152,152,152,152,152,152,255,255,255,255,255,255,
+ 255,255,255,152,152,152,152,152,152,152,152,255,255,255,255,255,
+ 255,255,255,152,152,152,152,152,152,152,255,255,255,255,255,255,
+ 255,255,255,152,152,152,152,152,255,255,255,255,255,255,255,255,
+ 255,255,255,152,152,152,152,255,255,255,255,255,255,255,255,255,
+ 255,255,255,152,152,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+};
+
+static unsigned char arrow_right_a_png[352] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,223, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,176, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,248,117, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,211, 60, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,255,255, 77, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,211, 60, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,248,117, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,176, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,223, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static unsigned char arrow_down_png[352] =
+{
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,152,152,152,152,152,152,152,152,152,255,255,255,255,
+ 255,255,255,152,152,152,152,152,152,152,152,152,255,255,255,255,
+ 255,255,255,255,152,152,152,152,152,152,152,255,255,255,255,255,
+ 255,255,255,255,152,152,152,152,152,152,152,255,255,255,255,255,
+ 255,255,255,255,255,152,152,152,152,152,255,255,255,255,255,255,
+ 255,255,255,255,255,255,152,152,152,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,152,152,152,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,152,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+};
+
+static unsigned char arrow_down_a_png[352] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,231,255,255,255,255,255,255,255,216, 0, 0, 0, 0,
+ 0, 0, 0, 87,255,255,255,255,255,255,255, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0,186,255,255,255,255,255,164, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 38,251,255,255,255,241, 25, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,127,255,255,255,107, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,221,255,204, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 72,253, 52, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+#define SPLITBAR_LINE 170,242,224,202,183,170
+#define SPLITBAR_BLOCK2 SPLITBAR_LINE , SPLITBAR_LINE
+#define SPLITBAR_BLOCK4 SPLITBAR_BLOCK2 , SPLITBAR_BLOCK2
+#define SPLITBAR_BLOCK8 SPLITBAR_BLOCK4 , SPLITBAR_BLOCK4
+#define SPLITBAR_BLOCK16 SPLITBAR_BLOCK8 , SPLITBAR_BLOCK8
+#define SPLITBAR_BLOCK32 SPLITBAR_BLOCK16 , SPLITBAR_BLOCK16
+
+#define SPLITBAR_ALTLINE1 170,242,170,202,170,170
+#define SPLITBAR_ALTLINE2 170,243,224,255,183,255
+#define SPLITBAR_ALTBLOCK2 SPLITBAR_ALTLINE1 , SPLITBAR_ALTLINE2
+#define SPLITBAR_ALTBLOCK4 SPLITBAR_ALTBLOCK2 , SPLITBAR_ALTBLOCK2
+#define SPLITBAR_ALTBLOCK8 SPLITBAR_ALTBLOCK4 , SPLITBAR_ALTBLOCK4
+
+static unsigned char splitbar_png[32*32*6] =
+{
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK8,
+ SPLITBAR_BLOCK8,
+ SPLITBAR_ALTBLOCK8,
+ SPLITBAR_BLOCK8,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32,
+ SPLITBAR_BLOCK32
+};
+
+struct FTVImageInfo
+{
+ const char *alt;
+ const char *name;
+ const unsigned char *data;
+ unsigned int len;
+ unsigned short width, height;
+};
+
+//extern FTVImageInfo image_info[];
+
+#define FTVIMG_blank 0
+#define FTVIMG_doc 1
+#define FTVIMG_folderclosed 2
+#define FTVIMG_folderopen 3
+#define FTVIMG_lastnode 4
+#define FTVIMG_link 5
+#define FTVIMG_mlastnode 6
+#define FTVIMG_mnode 7
+#define FTVIMG_node 8
+#define FTVIMG_plastnode 9
+#define FTVIMG_pnode 10
+#define FTVIMG_vertline 11
+
+#define FTV_S(name) #name
+#define FTV_ICON_FILE(name) "ftv2" FTV_S(name) ".png"
+#define FTVIMG_INDEX(name) FTVIMG_ ## name
+#define FTV_INFO(name) ( image_info[FTVIMG_INDEX(name)] )
+#define FTV_IMGATTRIBS(name) \
+ "src=\"" FTV_ICON_FILE(name) "\" " \
+ "alt=\"" << FTV_INFO(name).alt << "\" " \
+ "width=\"" << FTV_INFO(name).width << "\" " \
+ "height=\"" << FTV_INFO(name).height << "\" "
+
+
+static FTVImageInfo image_info[] =
+{
+ { "&#160;", "ftv2blank.png", 0 /*ftv2blank_png*/ ,174,16,22 },
+ { "*", "ftv2doc.png", 0 /*ftv2doc_png*/ ,255,24,22 },
+ { "+", "ftv2folderclosed.png", 0 /*ftv2folderclosed_png*/ ,259,24,22 },
+ { "-", "ftv2folderopen.png", 0 /*ftv2folderopen_png*/ ,261,24,22 },
+ { "\\", "ftv2lastnode.png", 0 /*ftv2lastnode_png*/ ,233,16,22 },
+ { "-", "ftv2link.png", 0 /*ftv2link_png*/ ,358,24,22 },
+ { "\\", "ftv2mlastnode.png", 0 /*ftv2mlastnode_png*/ ,160,16,22 },
+ { "o", "ftv2mnode.png", 0 /*ftv2mnode_png*/ ,194,16,22 },
+ { "o", "ftv2node.png", 0 /*ftv2node_png*/ ,235,16,22 },
+ { "\\", "ftv2plastnode.png", 0 /*ftv2plastnode_png*/ ,165,16,22 },
+ { "o", "ftv2pnode.png", 0 /*ftv2pnode_png*/ ,200,16,22 },
+ { "|", "ftv2vertline.png", 0 /*ftv2vertline_png*/ ,229,16,22 },
+ { 0, 0, 0, 0, 0, 0 }
+};
+
+static ColoredImgDataItem ftv_image_data[] =
+{
+ { "ftv2blank.png", 16, 22, blank_png, blank_png },
+ { "ftv2doc.png", 24, 22, doc_png, doc_a_png },
+ { "ftv2folderclosed.png", 24, 22, folderclosed_png, folderclosed_a_png },
+ { "ftv2folderopen.png", 24, 22, folderopen_png, folderopen_a_png },
+ { "ftv2lastnode.png", 16, 22, blank_png, blank_png },
+ { "ftv2link.png", 24, 22, doc_png, doc_a_png },
+ { "ftv2mlastnode.png", 16, 22, arrow_down_png, arrow_down_a_png },
+ { "ftv2mnode.png", 16, 22, arrow_down_png, arrow_down_a_png },
+ { "ftv2node.png", 16, 22, blank_png, blank_png },
+ { "ftv2plastnode.png", 16, 22, arrow_right_png, arrow_right_a_png },
+ { "ftv2pnode.png", 16, 22, arrow_right_png, arrow_right_a_png },
+ { "ftv2vertline.png", 16, 22, blank_png, blank_png },
+ { "ftv2splitbar.png", 6,1024, splitbar_png, 0 },
+ { 0, 0, 0, 0, 0 }
+};
+
+struct FTVNode
+{
+ FTVNode(bool dir,const char *r,const char *f,const char *a,const char *n)
+ : isLast(TRUE), isDir(dir),ref(r),file(f),anchor(a),name(n),
+ parent(0) { children.setAutoDelete(TRUE); }
+ bool isLast;
+ bool isDir;
+ QCString ref;
+ QCString file;
+ QCString anchor;
+ QCString name;
+ QList<FTVNode> children;
+ FTVNode *parent;
+};
+
+
+//----------------------------------------------------------------------------
+
+/*! Constructs an ftv help object.
+ * The object has to be \link initialize() initialized\endlink before it can
+ * be used.
+ */
+FTVHelp::FTVHelp(bool TLI)
+{
+ /* initial depth */
+ m_indentNodes = new QList<FTVNode>[MAX_INDENT];
+ m_indentNodes[0].setAutoDelete(TRUE);
+ m_indent=0;
+ m_topLevelIndex = TLI;
+}
+
+FTVHelp::~FTVHelp()
+{
+ delete[] m_indentNodes;
+}
+
+/*! This will create a folder tree view table of contents file (tree.js).
+ * \sa finalize()
+ */
+void FTVHelp::initialize()
+{
+}
+
+/*! Finalizes the FTV help. This will finish and close the
+ * contents file (index.js).
+ * \sa initialize()
+ */
+void FTVHelp::finalize()
+{
+ generateTreeView();
+}
+
+/*! Increase the level of the contents hierarchy.
+ * This will start a new sublist in contents file.
+ * \sa decContentsDepth()
+ */
+void FTVHelp::incContentsDepth()
+{
+ m_indent++;
+ ASSERT(m_indent<MAX_INDENT);
+}
+
+/*! Decrease the level of the contents hierarchy.
+ * This will end the current sublist.
+ * \sa incContentsDepth()
+ */
+void FTVHelp::decContentsDepth()
+{
+ ASSERT(m_indent>0);
+ if (m_indent>0)
+ {
+ m_indent--;
+ QList<FTVNode> *nl = &m_indentNodes[m_indent];
+ FTVNode *parent = nl->getLast();
+ QList<FTVNode> *children = &m_indentNodes[m_indent+1];
+ while (!children->isEmpty())
+ {
+ parent->children.append(children->take(0));
+ }
+ }
+}
+
+/*! Add a list item to the contents file.
+ * \param isDir TRUE if the item is a directory, FALSE if it is a text
+ * \param ref the URL of to the item.
+ * \param file the file containing the definition of the item
+ * \param anchor the anchor within the file.
+ * \param name the name of the item.
+ */
+void FTVHelp::addContentsItem(bool isDir,
+ const char *name,
+ const char *ref,
+ const char *file,
+ const char *anchor
+ )
+{
+ QList<FTVNode> *nl = &m_indentNodes[m_indent];
+ FTVNode *newNode = new FTVNode(isDir,ref,file,anchor,name);
+ if (!nl->isEmpty())
+ {
+ nl->getLast()->isLast=FALSE;
+ }
+ nl->append(newNode);
+ if (m_indent>0)
+ {
+ QList<FTVNode> *pnl = &m_indentNodes[m_indent-1];
+ newNode->parent = pnl->getLast();
+ }
+
+}
+
+static int folderId=1;
+
+void FTVHelp::generateIndent(FTextStream &t, FTVNode *n,int level)
+{
+ if (n->parent)
+ {
+ generateIndent(t,n->parent,level+1);
+ }
+ // from the root up to node n do...
+ if (level==0) // item before a dir or document
+ {
+ if (n->isLast)
+ {
+ if (n->isDir)
+ {
+ t << "<img " << FTV_IMGATTRIBS(plastnode) << "onclick=\"toggleFolder('folder" << folderId << "', this)\"/>";
+ }
+ else
+ {
+ t << "<img " << FTV_IMGATTRIBS(lastnode) << "/>";
+ }
+ }
+ else
+ {
+ if (n->isDir)
+ {
+ t << "<img " << FTV_IMGATTRIBS(pnode) << "onclick=\"toggleFolder('folder" << folderId << "', this)\"/>";
+ }
+ else
+ {
+ t << "<img " << FTV_IMGATTRIBS(node) << "/>";
+ }
+ }
+ }
+ else // item at another level
+ {
+ if (n->isLast)
+ {
+ t << "<img " << FTV_IMGATTRIBS(blank) << "/>";
+ }
+ else
+ {
+ t << "<img " << FTV_IMGATTRIBS(vertline) << "/>";
+ }
+ }
+}
+
+void FTVHelp::generateLink(FTextStream &t,FTVNode *n)
+{
+ //printf("FTVHelp::generateLink(ref=%s,file=%s,anchor=%s\n",
+ // n->ref.data(),n->file.data(),n->anchor.data());
+ if (n->file.isEmpty()) // no link
+ {
+ t << "<b>" << convertToHtml(n->name) << "</b>";
+ }
+ else // link into other frame
+ {
+ if (!n->ref.isEmpty()) // link to entity imported via tag file
+ {
+ t << "<a class=\"elRef\" ";
+ t << externalLinkTarget() << externalRef("",n->ref,FALSE);
+ }
+ else // local link
+ {
+ t << "<a class=\"el\" ";
+ }
+ t << "href=\"";
+ t << externalRef("",n->ref,TRUE);
+ t << n->file << Doxygen::htmlFileExtension;
+ if (!n->anchor.isEmpty()) t << "#" << n->anchor;
+ if (m_topLevelIndex)
+ t << "\" target=\"basefrm\">";
+ else
+ t << "\" target=\"_self\">";
+ t << convertToHtml(n->name);
+ t << "</a>";
+ if (!n->ref.isEmpty())
+ {
+ t << "&#160;[external]";
+ }
+ }
+}
+
+void FTVHelp::generateJSLink(FTextStream &t,FTVNode *n)
+{
+ if (n->file.isEmpty()) // no link
+ {
+ t << "\"" << convertToJSString(n->name) << "\", null, ";
+ }
+ else // link into other page
+ {
+ // TODO: external links with installdox
+ // TODO: use m_topLevelIndex
+ t << "\"" << convertToJSString(n->name) << "\", \"";
+ t << externalRef("",n->ref,TRUE);
+ t << n->file << Doxygen::htmlFileExtension;
+ if (!n->anchor.isEmpty()) t << "#" << n->anchor;
+ t << "\", ";
+ }
+}
+
+void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level)
+{
+ QCString spaces;
+ spaces.fill(' ',level*2+8);
+ QListIterator<FTVNode> nli(nl);
+ FTVNode *n;
+ for (nli.toFirst();(n=nli.current());++nli)
+ {
+ t << spaces << "<p>";
+ generateIndent(t,n,0);
+ if (n->isDir)
+ {
+ t << "<img " << FTV_IMGATTRIBS(folderclosed) << "onclick=\"toggleFolder('folder" << folderId << "', this)\"/>";
+ generateLink(t,n);
+ t << "</p>\n";
+ t << spaces << "<div id=\"folder" << folderId << "\">\n";
+ folderId++;
+ generateTree(t,n->children,level+1);
+ t << spaces << "</div>\n";
+ }
+ else
+ {
+ t << "<img " << FTV_IMGATTRIBS(doc) << "/>";
+ generateLink(t,n);
+ t << "</p>\n";
+ }
+ }
+}
+
+bool FTVHelp::generateJSTree(FTextStream &t, const QList<FTVNode> &nl,int level,bool &first)
+{
+ QCString indentStr;
+ indentStr.fill(' ',level*2);
+ bool found=FALSE;
+ QListIterator<FTVNode> nli(nl);
+ FTVNode *n;
+ for (nli.toFirst();(n=nli.current());++nli)
+ {
+ // terminate previous entry
+ if (!first) t << "," << endl;
+ first=FALSE;
+
+ // start entry
+ if (!found)
+ {
+ t << "[" << endl;
+ }
+ found=TRUE;
+
+ bool firstChild=TRUE;
+ t << indentStr << " [ ";
+ generateJSLink(t,n);
+ bool emptySection = !generateJSTree(t,n->children,level+1,firstChild);
+ if (emptySection)
+ t << "null ]";
+ else
+ t << endl << indentStr << " ] ]";
+ }
+ return found;
+}
+
+
+#if 0
+void FTVHelp::generateTreeViewImages()
+{
+ static bool done=FALSE;
+ if (done) return;
+ done=TRUE;
+
+ // Generate tree view images
+ FTVImageInfo *p = image_info;
+ while (p->name)
+ {
+ QCString fileName=Config_getString("HTML_OUTPUT")+"/"+p->name;
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ {
+ f.writeBlock((char *)p->data,p->len);
+ }
+ else
+ {
+ fprintf(stderr,"warning: Cannot open file %s for writing\n",fileName.data());
+ }
+ f.close();
+ p++;
+ }
+}
+#endif
+
+// new style images
+void FTVHelp::generateTreeViewImages()
+{
+ QCString dname=Config_getString("HTML_OUTPUT");
+ writeColoredImgData(dname,ftv_image_data);
+}
+
+// new style scripts
+void FTVHelp::generateTreeViewScripts()
+{
+ // generate navtree.js
+ {
+ QFile f(Config_getString("HTML_OUTPUT")+"/navtree.js");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << "var NAVTREE =" << endl;
+ t << "[" << endl;
+ t << " [ ";
+ QCString &projName = Config_getString("PROJECT_NAME");
+ if (projName.isEmpty())
+ {
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::MainPage);
+ t << "\"" << convertToJSString(lne->title()) << "\", ";
+ }
+ else
+ {
+ t << "\"" << convertToJSString(projName) << "\", ";
+ }
+ t << "\"index" << Doxygen::htmlFileExtension << "\", ";
+
+ bool first=TRUE;
+ generateJSTree(t,m_indentNodes[0],1,first);
+ if (first) t << "]";
+
+ t << endl << " ] ]" << endl;
+ t << "];" << endl;
+ t << endl << navtree_script;
+ }
+ }
+ // generate resize.js
+ {
+ QFile f(Config_getString("HTML_OUTPUT")+"/resize.js");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << resize_script;
+ }
+ }
+#if 0
+ // generate jquery.js
+ {
+ QFile f(Config_getString("HTML_OUTPUT")+"/jquery.js");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << jquery_script1 << jquery_script2 << jquery_script3;
+ }
+ }
+#endif
+ // generate navtree.css
+ {
+ QFile f(Config_getString("HTML_OUTPUT")+"/navtree.css");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << replaceColorMarkers(navtree_css);
+ }
+ }
+}
+
+// old style script (used for inline trees)
+void FTVHelp::generateScript(FTextStream &t)
+{
+ t << " <script type=\"text/javascript\">\n";
+ t << " <!-- // Hide script from old browsers\n";
+ t << " \n";
+
+ /* User has clicked on a node (folder or +/-) in the tree */
+ t << " function toggleFolder(id, imageNode) \n";
+ t << " {\n";
+ t << " var folder = document.getElementById(id);\n";
+ t << " var l = imageNode.src.length;\n";
+ /* If the user clicks on the book icon, we move left one image so
+ * the code (below) will also adjust the '+' icon.
+ */
+ t << " if (imageNode.src.substring(l-20,l)==\"" FTV_ICON_FILE(folderclosed) "\" || \n";
+ t << " imageNode.src.substring(l-18,l)==\"" FTV_ICON_FILE(folderopen) "\")\n";
+ t << " {\n";
+ t << " imageNode = imageNode.previousSibling;\n";
+ t << " l = imageNode.src.length;\n";
+ t << " }\n";
+ t << " if (folder == null) \n";
+ t << " {\n";
+ t << " } \n";
+ /* Node controls a open section, we need to close it */
+ t << " else if (folder.style.display == \"block\") \n";
+ t << " {\n";
+ t << " if (imageNode != null) \n";
+ t << " {\n";
+ t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderclosed) "\";\n";
+ t << " if (imageNode.src.substring(l-13,l) == \"" FTV_ICON_FILE(mnode) "\")\n";
+ t << " {\n";
+ t << " imageNode.src = \"" FTV_ICON_FILE(pnode) "\";\n";
+ t << " }\n";
+ t << " else if (imageNode.src.substring(l-17,l) == \"" FTV_ICON_FILE(mlastnode) "\")\n";
+ t << " {\n";
+ t << " imageNode.src = \"" FTV_ICON_FILE(plastnode) "\";\n";
+ t << " }\n";
+ t << " }\n";
+ t << " folder.style.display = \"none\";\n";
+ t << " } \n";
+ t << " else \n"; /* section is closed, we need to open it */
+ t << " {\n";
+ t << " if (imageNode != null) \n";
+ t << " {\n";
+ t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderopen) "\";\n";
+ t << " if (imageNode.src.substring(l-13,l) == \"" FTV_ICON_FILE(pnode) "\")\n";
+ t << " {\n";
+ t << " imageNode.src = \"" FTV_ICON_FILE(mnode) "\";\n";
+ t << " }\n";
+ t << " else if (imageNode.src.substring(l-17,l) == \"" FTV_ICON_FILE(plastnode) "\")\n";
+ t << " {\n";
+ t << " imageNode.src = \"" FTV_ICON_FILE(mlastnode) "\";\n";
+ t << " }\n";
+ t << " }\n";
+ t << " folder.style.display = \"block\";\n";
+ t << " }\n";
+ t << " }\n";
+ t << "\n";
+ t << " // End script hiding --> \n";
+ t << " </script>\n";
+}
+
+// write tree inside page
+void FTVHelp::generateTreeViewInline(FTextStream &t)
+{
+ generateScript(t);
+ t << " <div class=\"directory-alt\">\n";
+ t << " <br/>\n";
+ t << " <div style=\"display: block;\">\n";
+
+ generateTree(t,m_indentNodes[0],0);
+
+ t << " </div>\n";
+ t << " </div>\n";
+}
+
+// write old style index.html and tree.html
+void FTVHelp::generateTreeView()
+{
+ generateTreeViewImages();
+ generateTreeViewScripts();
+#if 0
+ QCString fileName;
+ QFile f;
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
+
+ fileName=Config_getString("HTML_OUTPUT")+"/index"+Doxygen::htmlFileExtension;
+ f.setName(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ else
+ {
+ FTextStream t(&f);
+ //t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">\n";
+ t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">\n";
+ t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n";
+ t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n";
+ t << "<title>";
+ if (Config_getString("PROJECT_NAME").isEmpty())
+ {
+ t << "Doxygen Documentation";
+ }
+ else
+ {
+ t << Config_getString("PROJECT_NAME");
+ }
+ t << "</title>\n</head>" << endl;
+ t << "<frameset cols=\"" << Config_getInt("TREEVIEW_WIDTH") << ",*\">" << endl;
+ t << " <frame src=\"tree" << Doxygen::htmlFileExtension << "\" name=\"treefrm\"/>" << endl;
+ t << " <frame src=\"main" << Doxygen::htmlFileExtension << "\" name=\"basefrm\"/>" << endl;
+ t << " <noframes>" << endl;
+ t << " <body>" << endl;
+ t << " <a href=\"main" << Doxygen::htmlFileExtension << "\">Frames are disabled. Click here to go to the main page.</a>" << endl;
+ t << " </body>" << endl;
+ t << " </noframes>" << endl;
+ t << "</frameset>" << endl;
+ t << "</html>" << endl;
+ f.close();
+ }
+
+ // Generate tree view
+ fileName=Config_getString("HTML_OUTPUT")+"/tree"+Doxygen::htmlFileExtension;
+ f.setName(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ else
+ {
+ FTextStream t(&f);
+
+ //if (searchEngine)
+ //{
+ // t << "<!-- This comment will put IE 6, 7 and 8 in quirks mode -->" << endl;
+ //}
+ t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
+ t << "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n";
+ t << " <head>\n";
+ t << " <meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n";
+ t << " <meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n";
+ t << " <meta http-equiv=\"Content-Language\" content=\"en\" />\n";
+ if (searchEngine)
+ {
+ t << " <link href=\"search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>" << endl;
+ t << " <script type=\"text/javaScript\" src=\"search/search.js\"></script>" << endl;
+ }
+ t << " <link rel=\"stylesheet\" href=\"";
+ QCString cssname=Config_getString("HTML_STYLESHEET");
+ if (cssname.isEmpty())
+ {
+ t << "doxygen.css";
+ }
+ else
+ {
+ QFileInfo cssfi(cssname);
+ if (!cssfi.exists())
+ {
+ err("Error: user specified HTML style sheet file does not exist!\n");
+ }
+ t << cssfi.fileName();
+ }
+ t << "\"/>" << endl;
+ t << " <title>TreeView</title>\n";
+ generateScript(t);
+ t << " </head>\n";
+ t << "\n";
+ t << " <body class=\"ftvtree\"";
+ if (searchEngine && !serverBasedSearch)
+ {
+ t << " onload='searchBox.OnSelectItem(0);'";
+ }
+ t << ">\n";
+ if (searchEngine)
+ {
+ t << " <script type=\"text/javascript\"><!--\n";
+ t << " var searchBox = new SearchBox(\"searchBox\", \"search\", true, '"
+ << theTranslator->trSearch() << "');\n";
+ t << " --></script>\n";
+ if (!serverBasedSearch)
+ {
+ t << " <div class=\"tabsearch\">\n";
+ t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
+ t << " <span class=\"left\">\n";
+ t << " <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\">"
+ << "<img id=\"MSearchCloseImg\" border=\"0\" src=\"search/close.png\" alt=\"\"/></a>\n";
+ t << " <input type=\"text\" id=\"MSearchField\" value=\""
+ << theTranslator->trSearch() << "\" accesskey=\"S\"\n";
+ t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
+ t << " onblur=\"searchBox.OnSearchFieldFocus(false)\" \n";
+ t << " onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n";
+ t << " </span><span class=\"right\">\n";
+ t << " <img id=\"MSearchSelect\" src=\"search/mag_sel.png\"\n";
+ t << " onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
+ t << " onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
+ t << " alt=\"\"/>\n";
+ t << " </span>\n";
+ t << " </div>\n";
+ t << " </div>\n";
+ HtmlGenerator::writeSearchFooter(t,QCString());
+ }
+ else
+ {
+ t << " <div class=\"tabsearch\">\n";
+ t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
+ t << " <span class=\"left\">\n";
+ t << " <form id=\"FSearchBox\" action=\"search.php\" method=\"get\" target=\"basefrm\">\n";
+ t << " <img id=\"MSearchSelect\" src=\"search/mag.png\" alt=\"\"/>\n";
+ t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\""
+ << theTranslator->trSearch() << "\" size=\"20\" accesskey=\"S\" \n";
+ t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
+ t << " onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
+ t << " </form>\n";
+ t << " </span><span class=\"right\"></span>\n";
+ t << " </div>\n";
+ t << " </div>\n";
+ }
+ }
+ t << " <div class=\"directory\">\n";
+ t << " <h3 class=\"swap\"><span>";
+ QCString &projName = Config_getString("PROJECT_NAME");
+ if (projName.isEmpty())
+ {
+ t << "Root";
+ }
+ else
+ {
+ t << projName;
+ }
+ t << "</span></h3>\n";
+ t << " <div style=\"display: block;\">\n";
+
+ generateTree(t,m_indentNodes[0],0);
+
+ t << " </div>\n";
+ t << " </div>\n";
+
+ t << " </body>\n";
+ t << "</html>\n";
+
+ f.close();
+ }
+#endif
+}
+
diff --git a/src/ftvhelp.h b/src/ftvhelp.h
new file mode 100644
index 0000000..5ec0d0d
--- /dev/null
+++ b/src/ftvhelp.h
@@ -0,0 +1,77 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/******************************************************************************
+ * ftvhelp.h,v 1.0 2000/09/06 16:09:00
+ *
+ * Kenney Wong <kwong@ea.com>
+ *
+ * Folder Tree View for offline help on browsers that do not support HTML Help.
+ */
+
+#ifndef FTVHELP_H
+#define FTVHELP_H
+
+#include "qtbc.h"
+#include <qtextstream.h>
+#include <qlist.h>
+#include "index.h"
+
+class QFile;
+struct FTVNode;
+class FTextStream;
+
+/*! A class that generates a dynamic tree view side panel.
+ */
+class FTVHelp : public IndexIntf
+{
+ public:
+ FTVHelp(bool LTI);
+ ~FTVHelp();
+ void initialize();
+ void finalize();
+ void incContentsDepth();
+ void decContentsDepth();
+ void addContentsItem(bool isDir,
+ const char *name,
+ const char *ref,
+ const char *file,
+ const char *anchor);
+ //void addIndexItem(const char *, const char *,
+ // const char *, const char *,
+ // const char *, const MemberDef *) {}
+ void addIndexItem(Definition *,MemberDef *,const char *) {}
+ void addIndexFile(const char *) {}
+ void addImageFile(const char *) {}
+ void addStyleSheetFile(const char *) {}
+ void generateTreeView();
+ void generateTreeViewInline(FTextStream &t);
+ static void generateTreeViewImages();
+ void generateTreeViewScripts();
+ private:
+ void generateScript(FTextStream &t);
+ void generateTree(FTextStream &t,const QList<FTVNode> &nl,int level);
+ bool generateJSTree(FTextStream &t,const QList<FTVNode> &nl,int level,bool &first);
+ void generateIndent(FTextStream &t,FTVNode *n,int level);
+ void generateLink(FTextStream &t,FTVNode *n);
+ void generateJSLink(FTextStream &t,FTVNode *n);
+ QList<FTVNode> *m_indentNodes;
+ int m_indent;
+ bool m_topLevelIndex;
+};
+
+
+#endif /* FTVHELP_H */
+
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
new file mode 100644
index 0000000..41a1a8a
--- /dev/null
+++ b/src/groupdef.cpp
@@ -0,0 +1,1437 @@
+/******************************************************************************
+ *
+ * $Id: groupdef.cpp,v 1.29 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <ctype.h>
+#include <qregexp.h>
+#include "qtbc.h"
+#include "groupdef.h"
+#include "classdef.h"
+#include "filedef.h"
+#include "classlist.h"
+#include "outputlist.h"
+#include "namespacedef.h"
+#include "language.h"
+#include "util.h"
+#include "memberlist.h"
+#include "message.h"
+#include "membergroup.h"
+#include "doxygen.h"
+#include "pagedef.h"
+#include "docparser.h"
+#include "searchindex.h"
+#include "dot.h"
+#include "vhdldocgen.h"
+#include "layout.h"
+
+//---------------------------------------------------------------------------
+
+GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t,
+ const char *refFileName) : Definition(df,dl,na)
+{
+ fileList = new FileList;
+ classSDict = new ClassSDict(17);
+ groupList = new GroupList;
+ namespaceSDict = new NamespaceSDict(17);
+ pageDict = new PageSDict(17);
+ exampleDict = new PageSDict(17);
+ dirList = new DirList;
+ allMemberNameInfoSDict = new MemberNameInfoSDict(17);
+ if (refFileName)
+ {
+ fileName=stripExtension(refFileName);
+ }
+ else
+ {
+ fileName = (QCString)"group_"+na;
+ }
+ setGroupTitle( t );
+ memberGroupSDict = new MemberGroupSDict;
+ memberGroupSDict->setAutoDelete(TRUE);
+
+ allMemberList = new MemberList(MemberList::allMembersList);
+
+ visited = 0;
+ groupScope = 0;
+}
+
+GroupDef::~GroupDef()
+{
+ delete fileList;
+ delete classSDict;
+ delete groupList;
+ delete namespaceSDict;
+ delete pageDict;
+ delete exampleDict;
+ delete allMemberList;
+ delete allMemberNameInfoSDict;
+ delete memberGroupSDict;
+ delete dirList;
+}
+
+void GroupDef::setGroupTitle( const char *t )
+{
+ if ( t && strlen(t) )
+ {
+ title = t;
+ titleSet = TRUE;
+ }
+ else
+ {
+ title = name();
+ title.at(0)=toupper(title.at(0));
+ titleSet = FALSE;
+ }
+}
+
+
+void GroupDef::distributeMemberGroupDocumentation()
+{
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->distributeMemberGroupDocumentation();
+ }
+}
+
+void GroupDef::findSectionsInDocumentation()
+{
+ docFindSections(documentation(),this,0,docFile());
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->findSectionsInDocumentation();
+ }
+
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::declarationLists)
+ {
+ ml->findSectionsInDocumentation();
+ }
+ }
+}
+
+void GroupDef::addFile(const FileDef *def)
+{
+ static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
+ if (def->isHidden()) return;
+ if (sortBriefDocs)
+ fileList->inSort(def);
+ else
+ fileList->append(def);
+}
+
+bool GroupDef::addClass(const ClassDef *cd)
+{
+ static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
+ if (cd->isHidden()) return FALSE;
+ if (classSDict->find(cd->qualifiedName())==0)
+ {
+ //printf("addClass %s sort=%d\n",cd->qualifiedName().data(),sortBriefDocs);
+ if (sortBriefDocs)
+ classSDict->inSort(cd->qualifiedName(),cd);
+ else
+ classSDict->append(cd->qualifiedName(),cd);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool GroupDef::addNamespace(const NamespaceDef *def)
+{
+ static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
+ if (def->isHidden()) return FALSE;
+ if (namespaceSDict->find(def->name())==0)
+ {
+ if (sortBriefDocs)
+ namespaceSDict->inSort(def->name(),def);
+ else
+ namespaceSDict->append(def->name(),def);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void GroupDef::addDir(const DirDef *def)
+{
+ if (def->isHidden()) return;
+ if (Config_getBool("SORT_BRIEF_DOCS"))
+ dirList->inSort(def);
+ else
+ dirList->append(def);
+}
+
+void GroupDef::addPage(PageDef *def)
+{
+ if (def->isHidden()) return;
+ //printf("Making page %s part of a group\n",def->name.data());
+ pageDict->append(def->name(),def);
+ def->makePartOfGroup(this);
+}
+
+void GroupDef::addExample(const PageDef *def)
+{
+ if (def->isHidden()) return;
+ exampleDict->append(def->name(),def);
+}
+
+
+void GroupDef::addMembersToMemberGroup()
+{
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::declarationLists)
+ {
+ ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
+ }
+ }
+
+ //printf("GroupDef::addMembersToMemberGroup() memberGroupList=%d\n",memberGroupList->count());
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->setInGroup(TRUE);
+ }
+}
+
+
+bool GroupDef::insertMember(MemberDef *md,bool docOnly)
+{
+ if (md->isHidden()) return FALSE;
+ //printf("GroupDef(%s)::insertMember(%s)\n", title.data(), md->name().data());
+ MemberNameInfo *mni=0;
+ if ((mni=(*allMemberNameInfoSDict)[md->name()]))
+ { // member with this name already found
+ MemberNameInfoIterator srcMnii(*mni);
+ MemberInfo *srcMi;
+ for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
+ {
+ MemberDef *srcMd = srcMi->memberDef;
+ if (srcMd==md) return FALSE; // already added before!
+
+ bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
+ // both inside a file => definition and declaration do not have to be in the same file
+ (srcMd->getOuterScope()->definitionType()==Definition::TypeFile &&
+ md->getOuterScope()->definitionType()==Definition::TypeFile);
+
+ LockingPtr<ArgumentList> srcMdAl = srcMd->argumentList();
+ LockingPtr<ArgumentList> mdAl = md->argumentList();
+
+ if (srcMd->isFunction() && md->isFunction() &&
+ matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl.pointer(),
+ md->getOuterScope(),md->getFileDef(),mdAl.pointer(),
+ TRUE
+ ) &&
+ sameScope
+ )
+ {
+ if (srcMd->getGroupAlias()==0)
+ {
+ md->setGroupAlias(srcMd);
+ }
+ else
+ {
+ md->setGroupAlias(srcMd->getGroupAlias());
+ }
+ return FALSE; // member is the same as one that is already added
+ }
+ }
+ mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
+ }
+ else
+ {
+ mni = new MemberNameInfo(md->name());
+ mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
+ allMemberNameInfoSDict->append(mni->memberName(),mni);
+ }
+ //printf("Added member!\n");
+ allMemberList->append(md);
+ switch(md->memberType())
+ {
+ case MemberDef::Variable:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decVarMembers,md);
+ }
+ addMemberToList(MemberList::docVarMembers,md);
+ break;
+ case MemberDef::Function:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decFuncMembers,md);
+ }
+ addMemberToList(MemberList::docFuncMembers,md);
+ break;
+ case MemberDef::Typedef:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decTypedefMembers,md);
+ }
+ addMemberToList(MemberList::docTypedefMembers,md);
+ break;
+ case MemberDef::Enumeration:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decEnumMembers,md);
+ }
+ addMemberToList(MemberList::docEnumMembers,md);
+ break;
+ case MemberDef::EnumValue:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decEnumValMembers,md);
+ }
+ addMemberToList(MemberList::docEnumValMembers,md);
+ break;
+ case MemberDef::Define:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decDefineMembers,md);
+ }
+ addMemberToList(MemberList::docDefineMembers,md);
+ break;
+ case MemberDef::Signal:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decSignalMembers,md);
+ }
+ addMemberToList(MemberList::docSignalMembers,md);
+ break;
+ case MemberDef::Slot:
+ if (md->protection()==Public)
+ {
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decPubSlotMembers,md);
+ }
+ addMemberToList(MemberList::docPubSlotMembers,md);
+ }
+ else if (md->protection()==Protected)
+ {
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decProSlotMembers,md);
+ }
+ addMemberToList(MemberList::docProSlotMembers,md);
+ }
+ else
+ {
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decPriSlotMembers,md);
+ }
+ addMemberToList(MemberList::docPriSlotMembers,md);
+ }
+ break;
+ case MemberDef::Event:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decEventMembers,md);
+ }
+ addMemberToList(MemberList::docEventMembers,md);
+ break;
+ case MemberDef::Property:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decPropMembers,md);
+ }
+ addMemberToList(MemberList::docPropMembers,md);
+ break;
+ case MemberDef::Friend:
+ if (!docOnly)
+ {
+ addMemberToList(MemberList::decFriendMembers,md);
+ }
+ addMemberToList(MemberList::docFriendMembers,md);
+ break;
+ default:
+ err("GroupDef::insertMembers(): "
+ "member `%s' (typeid=%d) with scope `%s' inserted in group scope `%s'!\n",
+ md->name().data(),md->memberType(),
+ md->getClassDef() ? md->getClassDef()->name().data() : "",
+ name().data());
+ }
+ return TRUE;
+}
+
+void GroupDef::removeMember(MemberDef *md)
+{
+ // fprintf(stderr, "GroupDef(%s)::removeMember( %s )\n", title.data(), md->name().data());
+ MemberNameInfo *mni = allMemberNameInfoSDict->find(md->name());
+ if (mni)
+ {
+ MemberNameInfoIterator mnii(*mni);
+ while( mnii.current() )
+ {
+ if( mnii.current()->memberDef == md )
+ {
+ mni->remove(mnii.current());
+ break;
+ }
+ ++mnii;
+ }
+ if( mni->isEmpty() )
+ {
+ allMemberNameInfoSDict->remove(md->name());
+ delete mni;
+ }
+
+ removeMemberFromList(MemberList::allMembersList,md);
+ switch(md->memberType())
+ {
+ case MemberDef::Variable:
+ removeMemberFromList(MemberList::decVarMembers,md);
+ removeMemberFromList(MemberList::docVarMembers,md);
+ break;
+ case MemberDef::Function:
+ removeMemberFromList(MemberList::decFuncMembers,md);
+ removeMemberFromList(MemberList::docFuncMembers,md);
+ break;
+ case MemberDef::Typedef:
+ removeMemberFromList(MemberList::decTypedefMembers,md);
+ removeMemberFromList(MemberList::docTypedefMembers,md);
+ break;
+ case MemberDef::Enumeration:
+ removeMemberFromList(MemberList::decEnumMembers,md);
+ removeMemberFromList(MemberList::docEnumMembers,md);
+ break;
+ case MemberDef::EnumValue:
+ removeMemberFromList(MemberList::decEnumValMembers,md);
+ removeMemberFromList(MemberList::docEnumValMembers,md);
+ break;
+ case MemberDef::Define:
+ removeMemberFromList(MemberList::decDefineMembers,md);
+ removeMemberFromList(MemberList::docDefineMembers,md);
+ break;
+ case MemberDef::Signal:
+ removeMemberFromList(MemberList::decSignalMembers,md);
+ removeMemberFromList(MemberList::docSignalMembers,md);
+ break;
+ case MemberDef::Slot:
+ if (md->protection()==Public)
+ {
+ removeMemberFromList(MemberList::decPubSlotMembers,md);
+ removeMemberFromList(MemberList::docPubSlotMembers,md);
+ }
+ else if (md->protection()==Protected)
+ {
+ removeMemberFromList(MemberList::decProSlotMembers,md);
+ removeMemberFromList(MemberList::docProSlotMembers,md);
+ }
+ else
+ {
+ removeMemberFromList(MemberList::decPriSlotMembers,md);
+ removeMemberFromList(MemberList::docPriSlotMembers,md);
+ }
+ break;
+ case MemberDef::Event:
+ removeMemberFromList(MemberList::decEventMembers,md);
+ removeMemberFromList(MemberList::docEventMembers,md);
+ break;
+ case MemberDef::Property:
+ removeMemberFromList(MemberList::decPropMembers,md);
+ removeMemberFromList(MemberList::docPropMembers,md);
+ break;
+ case MemberDef::Friend:
+ removeMemberFromList(MemberList::decFriendMembers,md);
+ removeMemberFromList(MemberList::docFriendMembers,md);
+ break;
+ default:
+ err("GroupDef::removeMember(): unexpected member remove in file!\n");
+ }
+ }
+}
+
+bool GroupDef::containsGroup(const GroupDef *def)
+{
+ return this==def || groupList->find(def) >= 0;
+}
+
+void GroupDef::addGroup(const GroupDef *def)
+{
+ //printf("adding group `%s' to group `%s'\n",def->name().data(),name().data());
+ //if (Config_getBool("SORT_MEMBER_DOCS"))
+ // groupList->inSort(def);
+ //else
+ groupList->append(def);
+}
+
+bool GroupDef::isASubGroup() const
+{
+ LockingPtr<GroupList> groups = partOfGroups();
+ return groups!=0 && groups->count()!=0;
+}
+
+int GroupDef::countMembers() const
+{
+ return fileList->count()+
+ classSDict->count()+
+ namespaceSDict->count()+
+ groupList->count()+
+ allMemberList->count()+
+ pageDict->count()+
+ exampleDict->count();
+}
+
+/*! Compute the HTML anchor names for all members in the group */
+void GroupDef::computeAnchors()
+{
+ //printf("GroupDef::computeAnchors()\n");
+ setAnchors(0,'a',allMemberList);
+}
+
+void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title)
+{
+ if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
+ || !documentation().isEmpty() || !inbodyDocumentation().isEmpty()
+ )
+ {
+ if (pageDict->count()!=countMembers()) // not only pages -> classical layout
+ {
+ ol.writeRuler();
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeAnchor(0,"details");
+ ol.popGeneratorState();
+ ol.startGroupHeader();
+ ol.parseText(title);
+ ol.endGroupHeader();
+ }
+
+ // repeat brief description
+ if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
+ {
+ ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ }
+ // write separator between brief and details
+ if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
+ !documentation().isEmpty())
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::RTF);
+ // ol.newParagraph(); // FIXME:PARA
+ ol.enableAll();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.writeString("\n\n");
+ ol.popGeneratorState();
+ }
+
+ // write detailed documentation
+ if (!documentation().isEmpty())
+ {
+ ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ }
+
+ // write inbody documentation
+ if (!inbodyDocumentation().isEmpty())
+ {
+ ol.parseDoc(inbodyFile(),inbodyLine(),this,0,inbodyDocumentation()+"\n",TRUE,FALSE);
+ }
+ }
+}
+
+void GroupDef::writeBriefDescription(OutputList &ol)
+{
+ if (!briefDescription().isEmpty())
+ {
+ ol.startParagraph();
+ ol.parseDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.writeString(" \n");
+ ol.enable(OutputGenerator::RTF);
+
+ if (Config_getBool("REPEAT_BRIEF") ||
+ !documentation().isEmpty()
+ )
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startTextLink(0,"details");
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ }
+ ol.popGeneratorState();
+
+ //ol.pushGeneratorState();
+ //ol.disable(OutputGenerator::RTF);
+ //ol.newParagraph();
+ //ol.popGeneratorState();
+ ol.endParagraph();
+ }
+}
+
+void GroupDef::writeGroupGraph(OutputList &ol)
+{
+ if (Config_getBool("HAVE_DOT") /*&& Config_getBool("GROUP_GRAPHS")*/ )
+ {
+ DotGroupCollaboration graph(this);
+ if (!graph.isTrivial())
+ {
+ msg("Generating dependency graph for group %s\n",qualifiedName().data());
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ //ol.startParagraph();
+ ol.startGroupCollaboration();
+ ol.parseText(theTranslator->trCollaborationDiagram(title));
+ ol.endGroupCollaboration(graph);
+ //ol.endParagraph();
+ ol.popGeneratorState();
+ }
+ }
+}
+
+void GroupDef::writeFiles(OutputList &ol,const QCString &title)
+{
+ // write list of files
+ if (fileList->count()>0)
+ {
+ ol.startMemberHeader("files");
+ ol.parseText(title);
+ ol.endMemberHeader();
+ ol.startMemberList();
+ FileDef *fd=fileList->first();
+ while (fd)
+ {
+ ol.startMemberItem(0);
+ ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
+ ol.insertMemberAlign();
+ ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl;
+ }
+ ol.endMemberItem();
+ if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+ {
+ ol.startParagraph();
+ ol.startMemberDescription();
+ ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE);
+ ol.endMemberDescription();
+ ol.endParagraph();
+ }
+ fd=fileList->next();
+ }
+ ol.endMemberList();
+ }
+}
+
+void GroupDef::writeNamespaces(OutputList &ol,const QCString &title)
+{
+ // write list of namespaces
+ namespaceSDict->writeDeclaration(ol,title);
+}
+
+void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
+{
+ // write list of groups
+ if (groupList->count()>0)
+ {
+ ol.startMemberHeader("groups");
+ ol.parseText(title);
+ ol.endMemberHeader();
+ ol.startMemberList();
+ GroupDef *gd=groupList->first();
+ while (gd)
+ {
+ ol.startMemberItem(0);
+ //ol.docify(theTranslator->trGroup(FALSE,TRUE));
+ //ol.docify(" ");
+ ol.insertMemberAlign();
+ ol.writeObjectLink(gd->getReference(),gd->getOutputFileBase(),0,gd->groupTitle());
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <subgroup>" << convertToXML(gd->name()) << "</subgroup>" << endl;
+ }
+ ol.endMemberItem();
+ if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+ {
+ ol.startParagraph();
+ ol.startMemberDescription();
+ ol.parseDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE);
+ ol.endMemberDescription();
+ ol.endParagraph();
+ }
+ gd=groupList->next();
+ }
+ ol.endMemberList();
+ }
+}
+
+void GroupDef::writeDirs(OutputList &ol,const QCString &title)
+{
+ // write list of directories
+ if (dirList->count()>0)
+ {
+ ol.startMemberHeader("dirs");
+ ol.parseText(title);
+ ol.endMemberHeader();
+ ol.startMemberList();
+ DirDef *dd=dirList->first();
+ while (dd)
+ {
+ ol.startMemberItem(0);
+ ol.parseText(theTranslator->trDir(FALSE,TRUE));
+ ol.insertMemberAlign();
+ ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName());
+ ol.endMemberItem();
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
+ }
+ if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+ {
+ ol.startParagraph();
+ ol.startMemberDescription();
+ ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE);
+ ol.endMemberDescription();
+ ol.endParagraph();
+ }
+ dd=dirList->next();
+ }
+
+ ol.endMemberList();
+ }
+}
+
+void GroupDef::writeClasses(OutputList &ol,const QCString &title)
+{
+ // write list of classes
+ classSDict->writeDeclaration(ol,0,title,FALSE);
+}
+
+void GroupDef::writeInlineClasses(OutputList &ol)
+{
+ classSDict->writeDocumentation(ol);
+}
+
+void GroupDef::writePageDocumentation(OutputList &ol)
+{
+ PageDef *pd=0;
+ PageSDict::Iterator pdi(*pageDict);
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ if (!pd->isReference())
+ {
+ QCString pageName = pd->getOutputFileBase();
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <page>" << convertToXML(pageName) << "</page>" << endl;
+ }
+
+ SectionInfo *si=0;
+ if (!pd->title().isEmpty() && !pd->name().isEmpty() &&
+ (si=Doxygen::sectionDict[pd->name()])!=0)
+ {
+ ol.startSection(si->label,si->title,SectionInfo::Subsection);
+ ol.docify(si->title);
+ ol.endSection(si->label,SectionInfo::Subsection);
+ }
+ ol.startTextBlock();
+ ol.parseDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE);
+ ol.endTextBlock();
+ }
+ }
+}
+
+void GroupDef::writeMemberGroups(OutputList &ol)
+{
+ /* write user defined member groups */
+ if (memberGroupSDict)
+ {
+ memberGroupSDict->sort();
+ /* write user defined member groups */
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->writeDeclarations(ol,0,0,0,this);
+ }
+ }
+}
+
+void GroupDef::startMemberDeclarations(OutputList &ol)
+{
+ ol.startMemberSections();
+}
+
+void GroupDef::endMemberDeclarations(OutputList &ol)
+{
+ ol.endMemberSections();
+}
+
+void GroupDef::startMemberDocumentation(OutputList &ol)
+{
+ //printf("** GroupDef::startMemberDocumentation()\n");
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ Doxygen::suppressDocWarnings = TRUE;
+ }
+}
+
+void GroupDef::endMemberDocumentation(OutputList &ol)
+{
+ //printf("** GroupDef::endMemberDocumentation()\n");
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ ol.popGeneratorState();
+ Doxygen::suppressDocWarnings = FALSE;
+ }
+}
+
+void GroupDef::writeAuthorSection(OutputList &ol)
+{
+ // write Author section (Man only)
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.startGroupHeader();
+ ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
+ ol.endGroupHeader();
+ ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
+ ol.popGeneratorState();
+}
+
+void GroupDef::writeSummaryLinks(OutputList &ol)
+{
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::Group));
+ LayoutDocEntry *lde;
+ bool first=TRUE;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ if ((lde->kind()==LayoutDocEntry::GroupClasses && classSDict->declVisible()) ||
+ (lde->kind()==LayoutDocEntry::GroupNamespaces && namespaceSDict->declVisible()) ||
+ (lde->kind()==LayoutDocEntry::GroupFiles && fileList->count()>0) ||
+ (lde->kind()==LayoutDocEntry::GroupNestedGroups && groupList->count()>0) ||
+ (lde->kind()==LayoutDocEntry::GroupDirs && dirList->count()>0)
+ )
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
+ lde->kind()==LayoutDocEntry::GroupNamespaces ? "namespaces" :
+ lde->kind()==LayoutDocEntry::GroupFiles ? "files" :
+ lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups" :
+ "dirs";
+ writeSummaryLink(ol,label,ls->title,first);
+ }
+ else if (lde->kind()==LayoutDocEntry::MemberDecl)
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ MemberList * ml = getMemberList(lmd->type);
+ if (ml && ml->declVisible())
+ {
+ writeSummaryLink(ol,ml->listTypeAsString(),lmd->title,first);
+ }
+ }
+ }
+ if (!first)
+ {
+ ol.writeString(" </div>\n");
+ }
+ ol.popGeneratorState();
+}
+
+void GroupDef::writeDocumentation(OutputList &ol)
+{
+ //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ ol.pushGeneratorState();
+ startFile(ol,getOutputFileBase(),name(),title);
+
+ ol.startHeaderSection();
+ writeSummaryLinks(ol);
+ ol.startTitleHead(getOutputFileBase());
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.parseText(title);
+ ol.popGeneratorState();
+ ol.endTitleHead(getOutputFileBase(),title);
+ addGroupListToTitle(ol,this);
+ ol.endHeaderSection();
+ ol.startContents();
+
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(title,getOutputFileBase());
+ static QRegExp we("[a-zA-Z_][-a-zA-Z_0-9]*");
+ int i=0,p=0,l=0;
+ while ((i=we.match(title,p,&l))!=-1) // foreach word in the title
+ {
+ Doxygen::searchIndex->addWord(title.mid(i,l),TRUE);
+ p=i+l;
+ }
+ }
+
+ Doxygen::indexList.addIndexItem(this,0,title);
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <compound kind=\"group\">" << endl;
+ Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
+ Doxygen::tagFile << " <title>" << convertToXML(title) << "</title>" << endl;
+ Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
+ }
+
+
+ //---------------------------------------- start flexible part -------------------------------
+
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::Group));
+ LayoutDocEntry *lde;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ switch (lde->kind())
+ {
+ case LayoutDocEntry::BriefDesc:
+ writeBriefDescription(ol);
+ break;
+ case LayoutDocEntry::MemberDeclStart:
+ startMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::GroupClasses:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeClasses(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::GroupInlineClasses:
+ {
+ writeInlineClasses(ol);
+ }
+ break;
+ case LayoutDocEntry::GroupNamespaces:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeNamespaces(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::MemberGroups:
+ writeMemberGroups(ol);
+ break;
+ case LayoutDocEntry::MemberDecl:
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ writeMemberDeclarations(ol,lmd->type,lmd->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
+ endMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::DetailedDesc:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeDetailedDescription(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDefStart:
+ startMemberDocumentation(ol);
+ break;
+ case LayoutDocEntry::MemberDef:
+ {
+ LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+ writeMemberDocumentation(ol,lmd->type,lmd->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDefEnd:
+ endMemberDocumentation(ol);
+ break;
+ case LayoutDocEntry::GroupNestedGroups:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeNestedGroups(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::GroupPageDocs:
+ writePageDocumentation(ol);
+ break;
+ case LayoutDocEntry::GroupDirs:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeDirs(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::GroupFiles:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeFiles(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::GroupGraph:
+ writeGroupGraph(ol);
+ break;
+ case LayoutDocEntry::AuthorSection:
+ writeAuthorSection(ol);
+ break;
+ case LayoutDocEntry::ClassIncludes:
+ case LayoutDocEntry::ClassInheritanceGraph:
+ case LayoutDocEntry::ClassNestedClasses:
+ case LayoutDocEntry::ClassCollaborationGraph:
+ case LayoutDocEntry::ClassAllMembersLink:
+ case LayoutDocEntry::ClassUsedFiles:
+ case LayoutDocEntry::NamespaceNestedNamespaces:
+ case LayoutDocEntry::NamespaceClasses:
+ case LayoutDocEntry::FileClasses:
+ case LayoutDocEntry::FileNamespaces:
+ case LayoutDocEntry::FileIncludes:
+ case LayoutDocEntry::FileIncludeGraph:
+ case LayoutDocEntry::FileIncludedByGraph:
+ case LayoutDocEntry::FileSourceLink:
+ case LayoutDocEntry::DirSubDirs:
+ case LayoutDocEntry::DirFiles:
+ case LayoutDocEntry::DirGraph:
+ err("Internal inconsistency: member %d should not be part of "
+ "LayoutDocManager::Group entry list\n",lde->kind());
+ break;
+ }
+ }
+
+ //---------------------------------------- end flexible part -------------------------------
+
+ endFile(ol);
+
+ ol.popGeneratorState();
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ writeDocAnchorsToTagFile();
+ Doxygen::tagFile << " </compound>" << endl;
+ }
+
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ allMemberList->sort();
+ writeMemberPages(ol);
+ }
+
+}
+
+void GroupDef::writeMemberPages(OutputList &ol)
+{
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::documentationLists)
+ {
+ ml->writeDocumentationPage(ol,name(),this);
+ }
+ }
+
+ ol.popGeneratorState();
+}
+
+void GroupDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
+{
+ static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
+
+ ol.writeString(" <div class=\"navtab\">\n");
+ ol.writeString(" <table>\n");
+
+ MemberListIterator mli(*allMemberList);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ if (md->getGroupDef()==this && md->isLinkable())
+ {
+ ol.writeString(" <tr><td class=\"navtab\">");
+ if (md->isLinkableInProject())
+ {
+ if (md==currentMd) // selected item => highlight
+ {
+ ol.writeString("<a class=\"qindexHL\" ");
+ }
+ else
+ {
+ ol.writeString("<a class=\"qindex\" ");
+ }
+ ol.writeString("href=\"");
+ if (createSubDirs) ol.writeString("../../");
+ ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
+ ol.writeString("\">");
+ ol.writeString(md->localName());
+ ol.writeString("</a>");
+ }
+ ol.writeString("</td></tr>\n");
+ }
+ }
+
+ ol.writeString(" </table>\n");
+ ol.writeString(" </div>\n");
+}
+
+
+
+//---- helper functions ------------------------------------------------------
+
+void addClassToGroups(Entry *root,ClassDef *cd)
+{
+ QListIterator<Grouping> gli(*root->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ GroupDef *gd=0;
+ if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
+ {
+ if (gd->addClass(cd))
+ {
+ cd->makePartOfGroup(gd);
+ }
+ //printf("Compound %s: in group %s\n",cd->name().data(),gd->groupTitle());
+ }
+ }
+}
+
+void addNamespaceToGroups(Entry *root,NamespaceDef *nd)
+{
+ //printf("root->groups->count()=%d\n",root->groups->count());
+ QListIterator<Grouping> gli(*root->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ GroupDef *gd=0;
+ //printf("group `%s'\n",s->data());
+ if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
+ {
+ if (gd->addNamespace(nd)) nd->makePartOfGroup(gd);
+ //printf("Namespace %s: in group %s\n",nd->name().data(),s->data());
+ }
+ }
+}
+
+void addDirToGroups(Entry *root,DirDef *dd)
+{
+ //printf("*** root->groups->count()=%d\n",root->groups->count());
+ QListIterator<Grouping> gli(*root->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ GroupDef *gd=0;
+ //printf("group `%s'\n",g->groupname.data());
+ if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
+ {
+ gd->addDir(dd);
+ dd->makePartOfGroup(gd);
+ //printf("Dir %s: in group %s\n",dd->name().data(),g->groupname.data());
+ }
+ }
+}
+
+void addGroupToGroups(Entry *root,GroupDef *subGroup)
+{
+ //printf("addGroupToGroups for %s groups=%d\n",root->name.data(),
+ // root->groups?root->groups->count():-1);
+ QListIterator<Grouping> gli(*root->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ GroupDef *gd=0;
+ if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)) &&
+ !gd->containsGroup(subGroup) )
+ {
+ gd->addGroup(subGroup);
+ subGroup->makePartOfGroup(gd);
+ }
+ else if (gd==subGroup)
+ {
+ warn(root->fileName,root->startLine,"Trying to add group %s to itself!",
+ gd->name().data());
+ }
+ }
+}
+
+/*! Add a member to the group with the highest priority */
+void addMemberToGroups(Entry *root,MemberDef *md)
+{
+// static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+// //printf("addMembersToGroups: %s: %s\n",md->name().data(),md->getClassDef()?md->getClassDef()->name().data():"<none>");
+// if (inlineGroupedClasses && // member part of a grouped class?
+// !md->getGroupDef() &&
+// md->getClassDef() &&
+// md->getClassDef()->partOfGroups()!=0 &&
+// md->getClassDef()->partOfGroups()->count()>0)
+// {
+// GroupDef *gd = md->getClassDef()->partOfGroups()->at(0);
+// //printf("-> add to group '%s'\n",gd->name().data());
+// bool success = gd->insertMember(md);
+// if (success)
+// {
+// md->setGroupDef(gd,
+// Grouping::GROUPING_LOWEST,root->fileName,root->startLine,
+// !root->doc.isEmpty());
+// }
+// }
+// else // add if the member was explicitly added to a group
+ {
+
+ //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%d\n",
+ // root, root->name.data(), md, md->name().data(), root->groups->count() );
+ QListIterator<Grouping> gli(*root->groups);
+ Grouping *g;
+
+ // Search entry's group list for group with highest pri.
+ Grouping::GroupPri_t pri = Grouping::GROUPING_LOWEST;
+ GroupDef *fgd=0;
+ for (;(g=gli.current());++gli)
+ {
+ GroupDef *gd=0;
+ if (!g->groupname.isEmpty() &&
+ (gd=Doxygen::groupSDict->find(g->groupname)) &&
+ g->pri >= pri)
+ {
+ if (fgd && gd!=fgd && g->pri==pri)
+ {
+ warn(root->fileName.data(), root->startLine,
+ "warning: Member %s found in multiple %s groups! "
+ "The member will be put in group %s, and not in group %s",
+ md->name().data(), Grouping::getGroupPriName( pri ),
+ gd->name().data(), fgd->name().data()
+ );
+ }
+
+ fgd = gd;
+ pri = g->pri;
+ }
+ }
+ //printf("fgd=%p\n",fgd);
+
+ // put member into group defined by this entry?
+ if (fgd)
+ {
+ GroupDef *mgd = md->getGroupDef();
+ //printf("mgd=%p\n",mgd);
+ bool insertit = FALSE;
+ if (mgd==0)
+ {
+ insertit = TRUE;
+ }
+ else if (mgd!=fgd)
+ {
+ bool moveit = FALSE;
+
+ // move member from one group to another if
+ // - the new one has a higher priority
+ // - the new entry has the same priority, but with docs where the old one had no docs
+ if (md->getGroupPri()<pri)
+ {
+ moveit = TRUE;
+ }
+ else
+ {
+ if (md->getGroupPri()==pri)
+ {
+ if (!root->doc.isEmpty() && !md->getGroupHasDocs())
+ {
+ moveit = TRUE;
+ }
+ else if (!root->doc.isEmpty() && md->getGroupHasDocs())
+ {
+ warn(md->getGroupFileName(),md->getGroupStartLine(),
+ "warning: Member documentation for %s found several times in %s groups!\n"
+ "%s:%d: The member will remain in group %s, and won't be put into group %s",
+ md->name().data(), Grouping::getGroupPriName( pri ),
+ root->fileName.data(), root->startLine,
+ mgd->name().data(),
+ fgd->name().data()
+ );
+ }
+ }
+ }
+
+ if (moveit)
+ {
+ //printf("removeMember\n");
+ mgd->removeMember(md);
+ insertit = TRUE;
+ }
+ }
+
+ if (insertit)
+ {
+ //printf("insertMember found at %s line %d\n",md->getDefFileName().data(),md->getDefLine());
+ bool success = fgd->insertMember(md);
+ if (success)
+ {
+ //printf("insertMember successful\n");
+ md->setGroupDef(fgd,pri,root->fileName,root->startLine,
+ !root->doc.isEmpty());
+ ClassDef *cd = md->getClassDefOfAnonymousType();
+ if (cd)
+ {
+ cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
+ }
+ }
+ }
+ }
+ }
+}
+
+
+void addExampleToGroups(Entry *root,PageDef *eg)
+{
+ QListIterator<Grouping> gli(*root->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ GroupDef *gd=0;
+ if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
+ {
+ gd->addExample(eg);
+ eg->makePartOfGroup(gd);
+ //printf("Example %s: in group %s\n",eg->name().data(),s->data());
+ }
+ }
+}
+
+QCString GroupDef::getOutputFileBase() const
+{
+ if (isReference())
+ {
+ return fileName;
+ }
+ else
+ {
+ return convertNameToFile(fileName);
+ }
+}
+
+void GroupDef::addListReferences()
+{
+ {
+ LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
+ addRefItem(xrefItems.pointer(),
+ getOutputFileBase(),
+ theTranslator->trGroup(TRUE,TRUE),
+ getOutputFileBase(),name(),
+ 0
+ );
+ }
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->addListReferences(this);
+ }
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::documentationLists)
+ {
+ ml->addListReferences(this);
+ }
+ }
+}
+
+MemberList *GroupDef::createMemberList(MemberList::ListType lt)
+{
+ m_memberLists.setAutoDelete(TRUE);
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()==lt)
+ {
+ return ml;
+ }
+ }
+ // not found, create a new member list
+ ml = new MemberList(lt);
+ m_memberLists.append(ml);
+ ml->setInGroup(TRUE);
+ return ml;
+}
+
+void GroupDef::addMemberToList(MemberList::ListType lt,MemberDef *md)
+{
+ static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
+ static bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");
+ MemberList *ml = createMemberList(lt);
+ ml->setNeedsSorting(
+ ((ml->listType()&MemberList::declarationLists) && sortBriefDocs) ||
+ ((ml->listType()&MemberList::documentationLists) && sortMemberDocs));
+ ml->append(md);
+}
+
+void GroupDef::sortMemberLists()
+{
+ MemberList *ml = m_memberLists.first();
+ while (ml)
+ {
+ if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
+ ml = m_memberLists.next();
+ }
+}
+
+
+MemberList *GroupDef::getMemberList(MemberList::ListType lt) const
+{
+ GroupDef *that = (GroupDef*)this;
+ MemberList *ml = that->m_memberLists.first();
+ while (ml)
+ {
+ if (ml->listType()==lt)
+ {
+ return ml;
+ }
+ ml = that->m_memberLists.next();
+ }
+ return 0;
+}
+
+void GroupDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title)
+{
+ static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+
+ MemberList * ml = getMemberList(lt);
+ if (optimizeVhdl && ml)
+ {
+ VhdlDocGen::writeVhdlDeclarations(ml,ol,this,0,0);
+ return;
+ }
+ if (ml)
+ {
+ ml->writeDeclarations(ol,0,0,0,this,title,0);
+ }
+}
+
+void GroupDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title)
+{
+ MemberList * ml = getMemberList(lt);
+ if (ml) ml->writeDocumentation(ol,name(),this,title);
+}
+
+void GroupDef::removeMemberFromList(MemberList::ListType lt,MemberDef *md)
+{
+ MemberList *ml = getMemberList(lt);
+ if (ml) ml->remove(md);
+}
+
diff --git a/src/groupdef.h b/src/groupdef.h
new file mode 100644
index 0000000..3c88ce8
--- /dev/null
+++ b/src/groupdef.h
@@ -0,0 +1,193 @@
+/******************************************************************************
+ *
+ * $Id: groupdef.h,v 1.18 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef GROUPDEF_H
+#define GROUPDEF_H
+
+#include "qtbc.h"
+#include "sortdict.h"
+#include "definition.h"
+#include "memberlist.h"
+#include "memberdef.h"
+#include "htmlhelp.h"
+
+class FileList;
+class ClassSDict;
+class FileDef;
+class ClassDef;
+class NamespaceDef;
+class GroupList;
+class OutputList;
+class NamespaceSDict;
+class MemberGroupSDict;
+class MemberNameInfoSDict;
+class PageSDict;
+class PageDef;
+class DirDef;
+class DirList;
+class FTVHelp;
+
+class GroupDef : public Definition
+{
+ public:
+ GroupDef(const char *fileName,int line,const char *name,const char *title,const char *refFileName=0);
+ ~GroupDef();
+ DefType definitionType() const { return TypeGroup; }
+ QCString getOutputFileBase() const;
+ const char *groupTitle() const { return title; }
+ void setGroupTitle( const char *newtitle );
+ bool hasGroupTitle( ) { return titleSet; }
+ void addFile(const FileDef *def);
+ bool addClass(const ClassDef *def);
+ bool addNamespace(const NamespaceDef *def);
+ void addGroup(const GroupDef *def);
+ void addParentGroup(const GroupDef *def);
+ void addPage(PageDef *def);
+ void addExample(const PageDef *def);
+ void addDir(const DirDef *dd);
+ bool insertMember(MemberDef *def,bool docOnly=FALSE);
+ void removeMember(MemberDef *md);
+ bool containsGroup(const GroupDef *def); // true if def is already a subgroup
+ void writeDocumentation(OutputList &ol);
+ void writeMemberPages(OutputList &ol);
+ void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
+ int countMembers() const;
+ bool isLinkableInProject() const
+ {
+ return !isReference();
+ }
+ bool isLinkable() const
+ {
+ return TRUE;
+ }
+ bool isASubGroup() const;
+ void computeAnchors();
+
+ void addMembersToMemberGroup();
+ void distributeMemberGroupDocumentation();
+ void findSectionsInDocumentation();
+
+ void addListReferences();
+ void sortMemberLists();
+
+ bool visited; // number of times accessed for output - KPW
+
+ friend void writeGroupTreeNode(OutputList&, GroupDef*, int, FTVHelp*);
+ // make accessible for writing tree view of group in index.cpp - KPW
+
+ void setGroupScope(Definition *d) { groupScope = d; }
+ Definition *getGroupScope() const { return groupScope; }
+
+ MemberList *getMemberList(MemberList::ListType lt) const;
+ const QList<MemberList> &getMemberLists() const { return m_memberLists; }
+
+ /* user defined member groups */
+ MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
+
+ FileList * getFiles() const { return fileList; }
+ ClassSDict * getClasses() const { return classSDict; }
+ NamespaceSDict * getNamespaces() const { return namespaceSDict; }
+ GroupList * getSubGroups() const { return groupList; }
+ PageSDict * getPages() const { return pageDict; }
+ DirList * getDirs() const { return dirList; }
+ //MemberList* getMembers() const { return allMemberList; }
+
+ protected:
+ void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
+
+ private:
+ MemberList *createMemberList(MemberList::ListType lt);
+ void addMemberToList(MemberList::ListType lt,MemberDef *md);
+ void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title);
+ void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title);
+ void removeMemberFromList(MemberList::ListType lt,MemberDef *md);
+ void writeGroupGraph(OutputList &ol);
+ void writeFiles(OutputList &ol,const QCString &title);
+ void writeNamespaces(OutputList &ol,const QCString &title);
+ void writeNestedGroups(OutputList &ol,const QCString &title);
+ void writeDirs(OutputList &ol,const QCString &title);
+ void writeClasses(OutputList &ol,const QCString &title);
+ void writeInlineClasses(OutputList &ol);
+ void writePageDocumentation(OutputList &ol);
+ void writeDetailedDescription(OutputList &ol,const QCString &title);
+ void writeBriefDescription(OutputList &ol);
+ void writeMemberGroups(OutputList &ol);
+ void startMemberDeclarations(OutputList &ol);
+ void endMemberDeclarations(OutputList &ol);
+ void startMemberDocumentation(OutputList &ol);
+ void endMemberDocumentation(OutputList &ol);
+ void writeAuthorSection(OutputList &ol);
+ void writeSummaryLinks(OutputList &ol);
+
+ QCString title; // title of the group
+ bool titleSet; // true if title is not the same as the name
+ QCString fileName; // base name of the generated file
+ FileList *fileList; // list of files in the group
+ ClassSDict *classSDict; // list of classes in the group
+ NamespaceSDict *namespaceSDict; // list of namespaces in the group
+ GroupList *groupList; // list of sub groups.
+ PageSDict *pageDict; // list of pages in the group
+ PageSDict *exampleDict; // list of examples in the group
+ DirList *dirList; // list of directories in the group
+
+ MemberList *allMemberList;
+ MemberNameInfoSDict *allMemberNameInfoSDict;
+
+ Definition *groupScope;
+
+ QList<MemberList> m_memberLists;
+ MemberGroupSDict *memberGroupSDict;
+
+};
+
+class GroupSDict : public SDict<GroupDef>
+{
+ public:
+ GroupSDict(uint size) : SDict<GroupDef>(size) {}
+ virtual ~GroupSDict() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ return strcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+ }
+};
+
+class GroupList : public QList<GroupDef>
+{
+ public:
+ int compareItems(GCI item1,GCI item2)
+ {
+ return strcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+ }
+};
+
+class GroupListIterator : public QListIterator<GroupDef>
+{
+ public:
+ GroupListIterator(const GroupList &l) : QListIterator<GroupDef>(l) {}
+ virtual ~GroupListIterator() {}
+};
+
+void addClassToGroups(Entry *root,ClassDef *cd);
+void addNamespaceToGroups(Entry *root,NamespaceDef *nd);
+void addGroupToGroups(Entry *root,GroupDef *subGroup);
+void addMemberToGroups(Entry *root,MemberDef *md);
+void addPageToGroups(Entry *root,PageDef *pd);
+void addExampleToGroups(Entry *root,PageDef *eg);
+void addDirToGroups(Entry *root,DirDef *dd);
+
+#endif
+
diff --git a/src/htags.cpp b/src/htags.cpp
new file mode 100644
index 0000000..036dcc9
--- /dev/null
+++ b/src/htags.cpp
@@ -0,0 +1,179 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdio.h>
+
+#include <qdir.h>
+#include <qdict.h>
+
+#include "qtbc.h"
+#include "htags.h"
+#include "util.h"
+#include "message.h"
+#include "config.h"
+#include "portable.h"
+
+
+bool Htags::useHtags = FALSE;
+
+static QDir g_inputDir;
+static QDict<QCString> g_symbolDict(10007);
+
+/*! constructs command line of htags(1) and executes it.
+ * \retval TRUE success
+ * \retval FALSE an error has occured.
+ */
+bool Htags::execute(const QCString &htmldir)
+{
+ static QStrList &inputSource = Config_getList("INPUT");
+ static bool quiet = Config_getBool("QUIET");
+ static bool warnings = Config_getBool("WARNINGS");
+ static QCString htagsOptions = ""; //Config_getString("HTAGS_OPTIONS");
+ static QCString projectName = Config_getString("PROJECT_NAME");
+ static QCString projectNumber = Config_getString("PROJECT_NUMBER");
+
+ QCString cwd = convertToQCString(QDir::currentDirPath());
+ if (inputSource.isEmpty())
+ {
+ g_inputDir.setPath(cwd);
+ }
+ else if (inputSource.count()==1)
+ {
+ g_inputDir.setPath(inputSource.first());
+ if (!g_inputDir.exists())
+ err("error: Cannot find directory %s. "
+ "Check the value of the INPUT tag in the configuration file.\n",
+ inputSource.first()
+ );
+ }
+ else
+ {
+ err("error: If you use USE_HTAGS then INPUT should specific a single directory. \n");
+ return FALSE;
+ }
+
+ /*
+ * Construct command line for htags(1).
+ */
+ QCString commandLine = " -g -s -a -n ";
+ if (!quiet) commandLine += "-v ";
+ if (warnings) commandLine += "-w ";
+ if (!htagsOptions.isEmpty())
+ {
+ commandLine += ' ';
+ commandLine += htagsOptions;
+ }
+ if (!projectName.isEmpty())
+ {
+ commandLine += "-t \"";
+ commandLine += projectName;
+ if (!projectNumber.isEmpty())
+ {
+ commandLine += '-';
+ commandLine += projectNumber;
+ }
+ commandLine += "\" ";
+ }
+ commandLine += " \"" + htmldir + "\"";
+ QCString oldDir = convertToQCString(QDir::currentDirPath());
+ QDir::setCurrent(g_inputDir.absPath());
+ //printf("CommandLine=[%s]\n",commandLine.data());
+ portable_sysTimerStart();
+ bool result=portable_system("htags",commandLine,FALSE)==0;
+ portable_sysTimerStop();
+ QDir::setCurrent(oldDir);
+ return result;
+}
+
+
+/*! load filemap and make index.
+ * \param htmlDir of HTML directory generated by htags(1).
+ * \retval TRUE success
+ * \retval FALSE error
+ */
+bool Htags::loadFilemap(const QCString &htmlDir)
+{
+ QCString fileMapName = htmlDir+"/HTML/FILEMAP";
+ QCString fileMap;
+ QFileInfo fi(fileMapName);
+ /*
+ * Construct FILEMAP dictionary using QDict.
+ *
+ * In FILEMAP, URL includes 'html' suffix but we cut it off according
+ * to the method of FileDef class.
+ *
+ * FILEMAP format:
+ * <NAME>\t<HREF>.html\n
+ * QDICT:
+ * dict[<NAME>] = <HREF>
+ */
+ if (fi.exists() && fi.isReadable())
+ {
+ QFile f(fileMapName);
+ const int maxlen = 8192;
+ QCString line(maxlen+1);
+ line.at(maxlen)='\0';
+ if (f.open(IO_ReadOnly))
+ {
+ while (f.readLine(line.data(),maxlen)>0)
+ {
+ //printf("Read line: %s",line.data());
+ int sep = line.find('\t');
+ if (sep!=-1)
+ {
+ QCString key = line.left(sep).stripWhiteSpace();
+ QCString value = line.mid(sep+1).stripWhiteSpace();
+ int ext=value.findRev('.');
+ if (ext!=-1) value=value.left(ext); // strip extension
+ g_symbolDict.setAutoDelete(TRUE);
+ g_symbolDict.insert(key,new QCString(value));
+ //printf("Key/Value=(%s,%s)\n",key.data(),value.data());
+ }
+ }
+ return TRUE;
+ }
+ else
+ {
+ err("error: file %s cannot be opened\n",fileMapName.data());
+ }
+ }
+ return FALSE;
+}
+
+/*! convert path name into the url in the hypertext generated by htags.
+ * \param path path name
+ * \returns URL NULL: not found.
+ */
+QCString Htags::path2URL(const QCString &path)
+{
+ QCString url,symName=path;
+ QCString dir = convertToQCString(g_inputDir.absPath());
+ int dl=dir.length();
+ if ((int)symName.length()>dl+1)
+ {
+ symName = symName.mid(dl+1);
+ }
+ if (!symName.isEmpty())
+ {
+ QCString *result = g_symbolDict[symName];
+ //printf("path2URL=%s symName=%s result=%p\n",path.data(),symName.data(),result);
+ if (result)
+ {
+ url = "HTML/" + *result;
+ }
+ }
+ return url;
+}
+
diff --git a/src/htags.h b/src/htags.h
new file mode 100644
index 0000000..cb6d58f
--- /dev/null
+++ b/src/htags.h
@@ -0,0 +1,28 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#ifndef HTAGS_H
+#define HTAGS_H
+
+class QCString;
+
+struct Htags
+{
+ static bool useHtags;
+ static bool loadFilemap(const QCString &htmldir);
+ static QCString path2URL(const QCString &path);
+ static bool execute(const QCString &htmldir);
+};
+
+#endif /* HTAGS_H */
diff --git a/src/htmlattrib.h b/src/htmlattrib.h
new file mode 100644
index 0000000..ef6a7ba
--- /dev/null
+++ b/src/htmlattrib.h
@@ -0,0 +1,65 @@
+/******************************************************************************
+ *
+ * $Id: htmlattrib.h,v 1.2 2001/01/01 10:15:18 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef _HTMLATTRIB_H
+#define _HTMLATTRIB_H
+
+/*! A Html option. A name, value pair */
+struct HtmlAttrib
+{
+ QCString name;
+ QCString value;
+};
+
+/*! @brief A list of Html attributes.
+ *
+ * The Html attributes are deeply copied into the list.
+ */
+class HtmlAttribList : public QList<HtmlAttrib>
+{
+ public:
+ HtmlAttribList() : QList<HtmlAttrib>() { setAutoDelete(TRUE); }
+ ~HtmlAttribList() { clear(); }
+ HtmlAttribList(const HtmlAttribList &l) : QList<HtmlAttrib>()
+ { operator=(l); }
+ HtmlAttribList &operator=(const HtmlAttribList &l)
+ { clear(); QList<HtmlAttrib>::operator=(l); return *this; }
+ QCString toString() const
+ {
+ HtmlAttribList *that = (HtmlAttribList *)this;
+ QCString result;
+ HtmlAttrib *attr=that->first();
+ while (attr)
+ {
+ result+=" "+attr->name+"=\""+attr->value+"\"";
+ attr=that->next();
+ }
+ return result;
+ }
+ private:
+ QCollection::Item newItem( QCollection::Item d )
+ { return (QCollection::Item)new HtmlAttrib(*(HtmlAttrib *)d); }
+ void deleteItem(QCollection::Item d)
+ { delete (HtmlAttrib *)d; }
+};
+
+/*! @brief Html attribute list iterator */
+class HtmlAttribListIterator : public QListIterator<HtmlAttrib>
+{
+ public:
+ HtmlAttribListIterator(const HtmlAttribList &l) : QListIterator<HtmlAttrib>(l) {}
+};
+
+#endif
+
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
new file mode 100644
index 0000000..b1242f3
--- /dev/null
+++ b/src/htmldocvisitor.cpp
@@ -0,0 +1,1751 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <qdir.h>
+#include "htmldocvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "dot.h"
+#include "message.h"
+#include "config.h"
+#include "htmlgen.h"
+#include "parserintf.h"
+#include "msc.h"
+#include "util.h"
+
+
+static const int NUM_HTML_LIST_TYPES = 4;
+static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
+
+static QCString convertIndexWordToAnchor(const QString &word)
+{
+ static char hex[] = "0123456789abcdef";
+ uint i;
+ QCString result;
+ for (i=0;i<word.length();i++)
+ {
+ int c = word.at(i);
+ if (isId(c))
+ {
+ result+=c;
+ }
+ else if (isspace(c))
+ {
+ result+="_";
+ }
+ else
+ {
+ char cs[3];
+ cs[0]=hex[c>>4];
+ cs[1]=hex[c&0xf];
+ cs[2]=0;
+ result+=cs;
+ }
+ }
+ return result;
+}
+
+static bool mustBeOutsideParagraph(DocNode *n)
+{
+ switch (n->kind())
+ {
+ /* <ul> */
+ case DocNode::Kind_HtmlList:
+ case DocNode::Kind_SimpleList:
+ case DocNode::Kind_AutoList:
+ /* <dl> */
+ case DocNode::Kind_SimpleSect:
+ case DocNode::Kind_ParamSect:
+ case DocNode::Kind_HtmlDescList:
+ case DocNode::Kind_XRefItem:
+ /* <table> */
+ case DocNode::Kind_HtmlTable:
+ /* <h?> */
+ case DocNode::Kind_Section:
+ case DocNode::Kind_HtmlHeader:
+ /* \internal */
+ case DocNode::Kind_Internal:
+ /* <div> */
+ case DocNode::Kind_Verbatim:
+ case DocNode::Kind_Include:
+ case DocNode::Kind_Image:
+ case DocNode::Kind_SecRefList:
+ /* <hr> */
+ case DocNode::Kind_HorRuler:
+ /* CopyDoc gets paragraph markers from the wrapping DocPara node,
+ * but needs to insert them for all documentation being copied to
+ * preserve formatting.
+ */
+ case DocNode::Kind_Copy:
+ return TRUE;
+ case DocNode::Kind_StyleChange:
+ return ((DocStyleChange*)n)->style()==DocStyleChange::Preformatted ||
+ ((DocStyleChange*)n)->style()==DocStyleChange::Div ||
+ ((DocStyleChange*)n)->style()==DocStyleChange::Center;
+ case DocNode::Kind_Formula:
+ return !((DocFormula*)n)->isInline();
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+
+
+static QString htmlAttribsToString(const HtmlAttribList &attribs)
+{
+ QString result;
+ HtmlAttribListIterator li(attribs);
+ HtmlAttrib *att;
+ for (li.toFirst();(att=li.current());++li)
+ {
+ if (!att->value.isEmpty()) // ignore attribute without values as they
+ // are not XHTML compliant
+ {
+ result+=" ";
+ result+=att->name;
+ result+="=\""+convertToXML(att->value)+"\"";
+ }
+ }
+ return result;
+}
+
+//-------------------------------------------------------------------------
+
+HtmlDocVisitor::HtmlDocVisitor(FTextStream &t,CodeOutputInterface &ci,
+ const char *langExt)
+ : DocVisitor(DocVisitor_Html), m_t(t), m_ci(ci), m_insidePre(FALSE),
+ m_hide(FALSE), m_langExt(langExt)
+{
+}
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+void HtmlDocVisitor::visit(DocWord *w)
+{
+ //printf("word: %s\n",w->word().data());
+ if (m_hide) return;
+ filter(w->word());
+}
+
+void HtmlDocVisitor::visit(DocLinkedWord *w)
+{
+ if (m_hide) return;
+ startLink(w->ref(),w->file(),w->relPath(),w->anchor(),w->tooltip());
+ filter(w->word());
+ endLink();
+}
+
+void HtmlDocVisitor::visit(DocWhiteSpace *w)
+{
+ if (m_hide) return;
+ if (m_insidePre)
+ {
+ m_t << w->chars();
+ }
+ else
+ {
+ m_t << " ";
+ }
+}
+
+void HtmlDocVisitor::visit(DocSymbol *s)
+{
+ if (m_hide) return;
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "\\"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: m_t << "&lt;"; break;
+ case DocSymbol::Greater: m_t << "&gt;"; break;
+ case DocSymbol::Amp: m_t << "&amp;"; break;
+ case DocSymbol::Dollar: m_t << "$"; break;
+ case DocSymbol::Hash: m_t << "#"; break;
+ case DocSymbol::DoubleColon: m_t << "::"; break;
+ case DocSymbol::Percent: m_t << "%"; break;
+ case DocSymbol::Copy: m_t << "&copy;"; break;
+ case DocSymbol::Tm: m_t << "&trade;"; break;
+ case DocSymbol::Reg: m_t << "&reg;"; break;
+ case DocSymbol::Apos: m_t << "'"; break;
+ case DocSymbol::Quot: m_t << "\""; break;
+ case DocSymbol::Lsquo: m_t << "&lsquo;"; break;
+ case DocSymbol::Rsquo: m_t << "&rsquo;"; break;
+ case DocSymbol::Ldquo: m_t << "&ldquo;"; break;
+ case DocSymbol::Rdquo: m_t << "&rdquo;"; break;
+ case DocSymbol::Ndash: m_t << "&ndash;"; break;
+ case DocSymbol::Mdash: m_t << "&mdash;"; break;
+ case DocSymbol::Uml: m_t << "&" << s->letter() << "uml;"; break;
+ case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break;
+ case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break;
+ case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break;
+ case DocSymbol::Slash: m_t << "&" << s->letter() << "slash;"; break;
+ case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break;
+ case DocSymbol::Szlig: m_t << "&szlig;"; break;
+ case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedil;"; break;
+ case DocSymbol::Ring: m_t << "&" << s->letter() << "ring;"; break;
+ case DocSymbol::Nbsp: m_t << "&#160;"; break;
+ case DocSymbol::AElig: m_t << "&AElig;"; break;
+ case DocSymbol::Aelig: m_t << "&aelig;"; break;
+ default:
+ err("error: unknown symbol found\n");
+ }
+}
+
+void HtmlDocVisitor::visit(DocURL *u)
+{
+ if (m_hide) return;
+ m_t << "<a href=\"";
+ if (u->isEmail()) m_t << "mailto:";
+ m_t << u->url() << "\">";
+ filter(u->url());
+ m_t << "</a>";
+}
+
+void HtmlDocVisitor::visit(DocLineBreak *)
+{
+ if (m_hide) return;
+ m_t << "<br/>\n";
+}
+
+void HtmlDocVisitor::visit(DocHorRuler *)
+{
+ if (m_hide) return;
+ m_t << "<hr/>\n";
+}
+
+void HtmlDocVisitor::visit(DocStyleChange *s)
+{
+ if (m_hide) return;
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) m_t << "<b" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</b>";
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) m_t << "<em" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</em>";
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) m_t << "<code" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</code>";
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) m_t << "<sub" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</sub>";
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) m_t << "<sup" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</sup>";
+ break;
+ case DocStyleChange::Center:
+ if (s->enable())
+ {
+ forceEndParagraph(s);
+ m_t << "<center" << htmlAttribsToString(s->attribs()) << ">";
+ }
+ else
+ {
+ m_t << "</center>";
+ forceStartParagraph(s);
+ }
+ break;
+ case DocStyleChange::Small:
+ if (s->enable()) m_t << "<small" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</small>";
+ break;
+ case DocStyleChange::Preformatted:
+ if (s->enable())
+ {
+ forceEndParagraph(s);
+ m_t << "<pre" << htmlAttribsToString(s->attribs()) << ">";
+ m_insidePre=TRUE;
+ }
+ else
+ {
+ m_insidePre=FALSE;
+ m_t << "</pre>";
+ forceStartParagraph(s);
+ }
+ break;
+ case DocStyleChange::Div:
+ if (s->enable())
+ {
+ forceEndParagraph(s);
+ m_t << "<div" << htmlAttribsToString(s->attribs()) << ">";
+ }
+ else
+ {
+ m_t << "</div>";
+ forceStartParagraph(s);
+ }
+ break;
+ case DocStyleChange::Span:
+ if (s->enable()) m_t << "<span" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</span>";
+ break;
+
+ }
+}
+
+
+void HtmlDocVisitor::visit(DocVerbatim *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocVerbatim::Code:
+ forceEndParagraph(s);
+ m_t << PREFRAG_START;
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,s->context(),s->text(),
+ s->isExample(),s->exampleFile());
+ m_t << PREFRAG_END;
+ forceStartParagraph(s);
+ break;
+ case DocVerbatim::Verbatim:
+ forceEndParagraph(s);
+ m_t << PREFRAG_START;
+ filter(s->text());
+ m_t << PREFRAG_END;
+ forceStartParagraph(s);
+ break;
+ case DocVerbatim::HtmlOnly:
+ m_t << s->text();
+ break;
+ case DocVerbatim::ManOnly:
+ case DocVerbatim::LatexOnly:
+ case DocVerbatim::XmlOnly:
+ /* nothing */
+ break;
+
+ case DocVerbatim::Dot:
+ {
+ static int dotindex = 1;
+ QCString fileName(4096);
+
+ fileName.sprintf("%s%d%s",
+ (Config_getString("HTML_OUTPUT")+"/inline_dotgraph_").data(),
+ dotindex++,
+ ".dot"
+ );
+ QFile file(fileName);
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",fileName.data());
+ }
+ file.writeBlock( s->text(), s->text().length() );
+ file.close();
+
+ forceEndParagraph(s);
+ m_t << "<div align=\"center\">" << endl;
+ writeDotFile(fileName,s->relPath(),s->context());
+ m_t << "</div>" << endl;
+ forceStartParagraph(s);
+
+ if (Config_getBool("DOT_CLEANUP")) file.remove();
+ }
+ break;
+ case DocVerbatim::Msc:
+ {
+ static int mscindex = 1;
+ QCString baseName(4096);
+
+ baseName.sprintf("%s%d",
+ (Config_getString("HTML_OUTPUT")+"/inline_mscgraph_").data(),
+ mscindex++
+ );
+ QFile file(baseName+".msc");
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s.msc for writing\n",baseName.data());
+ }
+ QCString text = "msc {";
+ text+=s->text();
+ text+="}";
+ file.writeBlock( text, text.length() );
+ file.close();
+
+ forceEndParagraph(s);
+ m_t << "<div align=\"center\">" << endl;
+ writeMscFile(baseName+".msc",s->relPath(),s->context());
+ m_t << "</div>" << endl;
+ forceStartParagraph(s);
+
+ if (Config_getBool("DOT_CLEANUP")) file.remove();
+ }
+ break;
+ }
+}
+
+void HtmlDocVisitor::visit(DocAnchor *anc)
+{
+ if (m_hide) return;
+ m_t << "<a class=\"anchor\" id=\"" << anc->anchor() << "\"></a>";
+}
+
+void HtmlDocVisitor::visit(DocInclude *inc)
+{
+ if (m_hide) return;
+ switch(inc->type())
+ {
+ case DocInclude::Include:
+ forceEndParagraph(inc);
+ m_t << PREFRAG_START;
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,
+ inc->context(),
+ inc->text(),
+ inc->isExample(),
+ inc->exampleFile(),
+ 0, // fd
+ -1, // startLine
+ -1, // endLine
+ TRUE // inlineFragment
+ );
+ m_t << PREFRAG_END;
+ forceStartParagraph(inc);
+ break;
+ case DocInclude::IncWithLines:
+ {
+ forceEndParagraph(inc);
+ m_t << PREFRAG_START;
+ QFileInfo cfi( inc->file() );
+ FileDef fd( cfi.dirPath(), cfi.fileName() );
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,
+ inc->context(),
+ inc->text(),
+ inc->isExample(),
+ inc->exampleFile(), &fd);
+ m_t << PREFRAG_END;
+ forceStartParagraph(inc);
+ }
+ break;
+ case DocInclude::DontInclude:
+ break;
+ case DocInclude::HtmlInclude:
+ m_t << inc->text();
+ break;
+ case DocInclude::VerbInclude:
+ forceEndParagraph(inc);
+ m_t << PREFRAG_START;
+ filter(inc->text());
+ m_t << PREFRAG_END;
+ forceStartParagraph(inc);
+ break;
+ }
+}
+
+void HtmlDocVisitor::visit(DocIncOperator *op)
+{
+ //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
+ // op->type(),op->isFirst(),op->isLast(),op->text().data());
+ if (op->isFirst())
+ {
+ if (!m_hide) m_t << PREFRAG_START;
+ pushEnabled();
+ m_hide=TRUE;
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ popEnabled();
+ if (!m_hide)
+ {
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,op->context(),
+ op->text(),op->isExample(),
+ op->exampleFile());
+ }
+ pushEnabled();
+ m_hide=TRUE;
+ }
+ if (op->isLast())
+ {
+ popEnabled();
+ if (!m_hide) m_t << PREFRAG_END;
+ }
+ else
+ {
+ if (!m_hide) m_t << endl;
+ }
+}
+
+void HtmlDocVisitor::visit(DocFormula *f)
+{
+ if (m_hide) return;
+ bool bDisplay = !f->isInline();
+ if (bDisplay)
+ {
+ forceEndParagraph(f);
+ m_t << "<p class=\"formulaDsp\">" << endl;
+ }
+
+ if (Config_getBool("USE_MATHJAX"))
+ {
+ QCString text = f->text();
+ bool closeInline = FALSE;
+ if (!bDisplay && !text.isEmpty() && text.at(0)=='$' &&
+ text.at(text.length()-1)=='$')
+ {
+ closeInline=TRUE;
+ text = text.mid(1,text.length()-2);
+ m_t << "\\(";
+ }
+ m_t << convertToHtml(text);
+ if (closeInline)
+ {
+ m_t << "\\)";
+ }
+ }
+ else
+ {
+ m_t << "<img class=\"formula"
+ << (bDisplay ? "Dsp" : "Inl");
+ m_t << "\" alt=\"";
+ filterQuotedCdataAttr(f->text());
+ m_t << "\"";
+ /// @todo cache image dimensions on formula generation and give height/width
+ /// for faster preloading and better rendering of the page
+ m_t << " src=\"" << f->relPath() << f->name() << ".png\"/>";
+
+ }
+ if (bDisplay)
+ {
+ m_t << endl << "</p>" << endl;
+ forceStartParagraph(f);
+ }
+}
+
+void HtmlDocVisitor::visit(DocIndexEntry *e)
+{
+ QCString anchor = convertIndexWordToAnchor(e->entry());
+ if (e->member())
+ {
+ anchor.prepend(e->member()->anchor()+"_");
+ }
+ m_t << "<a name=\"" << anchor << "\"></a>";
+ //printf("*** DocIndexEntry: word='%s' scope='%s' member='%s'\n",
+ // e->entry().data(),
+ // e->scope() ? e->scope()->name().data() : "<null>",
+ // e->member() ? e->member()->name().data() : "<null>"
+ // );
+ Doxygen::indexList.addIndexItem(e->scope(),e->member(),e->entry());
+}
+
+void HtmlDocVisitor::visit(DocSimpleSectSep *)
+{
+ m_t << "</dd>" << endl;
+ m_t << "<dd>" << endl;
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+
+void HtmlDocVisitor::visitPre(DocAutoList *l)
+{
+ //printf("DocAutoList::visitPre\n");
+ if (m_hide) return;
+ forceEndParagraph(l);
+ if (l->isEnumList())
+ {
+ //
+ // Do list type based on depth:
+ // 1.
+ // a.
+ // i.
+ // A.
+ // 1. (repeat)...
+ //
+ m_t << "<ol type=\"" << types[l->depth() % NUM_HTML_LIST_TYPES] << "\">";
+ }
+ else
+ {
+ m_t << "<ul>";
+ }
+ if (!l->isPreformatted()) m_t << "\n";
+}
+
+void HtmlDocVisitor::visitPost(DocAutoList *l)
+{
+ //printf("DocAutoList::visitPost\n");
+ if (m_hide) return;
+ if (l->isEnumList())
+ {
+ m_t << "</ol>";
+ }
+ else
+ {
+ m_t << "</ul>";
+ }
+ if (!l->isPreformatted()) m_t << "\n";
+ forceStartParagraph(l);
+}
+
+void HtmlDocVisitor::visitPre(DocAutoListItem *)
+{
+ if (m_hide) return;
+ m_t << "<li>";
+}
+
+void HtmlDocVisitor::visitPost(DocAutoListItem *li)
+{
+ if (m_hide) return;
+ m_t << "</li>";
+ if (!li->isPreformatted()) m_t << "\n";
+}
+
+template<class T>
+bool isFirstChildNode(T *parent, DocNode *node)
+{
+ return parent->children().getFirst()==node;
+}
+
+template<class T>
+bool isLastChildNode(T *parent, DocNode *node)
+{
+ return parent->children().getLast()==node;
+}
+
+bool isSeparatedParagraph(DocSimpleSect *parent,DocPara *par)
+{
+ QList<DocNode> nodes = parent->children();
+ int i = nodes.findRef(par);
+ if (i==-1) return FALSE;
+ int count = parent->children().count();
+ if (count>1 && i==0)
+ {
+ if (nodes.at(i+1)->kind()==DocNode::Kind_SimpleSectSep)
+ {
+ return TRUE;
+ }
+ }
+ else if (count>1 && i==count-1)
+ {
+ if (nodes.at(i-1)->kind()==DocNode::Kind_SimpleSectSep)
+ {
+ return TRUE;
+ }
+ }
+ else if (count>2 && i>0 && i<count-1)
+ {
+ if (nodes.at(i-1)->kind()==DocNode::Kind_SimpleSectSep &&
+ nodes.at(i+1)->kind()==DocNode::Kind_SimpleSectSep)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast)
+{
+ int t=0;
+ isFirst=FALSE;
+ isLast=FALSE;
+ if (p && p->parent())
+ {
+ switch (p->parent()->kind())
+ {
+ case DocNode::Kind_AutoListItem:
+ isFirst=TRUE;
+ isLast =TRUE;
+ t=1; // not used
+ break;
+ case DocNode::Kind_SimpleListItem:
+ isFirst=TRUE;
+ isLast =TRUE;
+ t=1; // not used
+ break;
+ case DocNode::Kind_ParamList:
+ isFirst=TRUE;
+ isLast =TRUE;
+ t=1; // not used
+ break;
+ case DocNode::Kind_HtmlListItem:
+ isFirst=isFirstChildNode((DocHtmlListItem*)p->parent(),p);
+ isLast =isLastChildNode ((DocHtmlListItem*)p->parent(),p);
+ if (isFirst) t=1;
+ if (isLast) t=3;
+ break;
+ case DocNode::Kind_SecRefItem:
+ isFirst=isFirstChildNode((DocSecRefItem*)p->parent(),p);
+ isLast =isLastChildNode ((DocSecRefItem*)p->parent(),p);
+ if (isFirst) t=1;
+ if (isLast) t=3;
+ break;
+ case DocNode::Kind_HtmlDescData:
+ isFirst=isFirstChildNode((DocHtmlDescData*)p->parent(),p);
+ isLast =isLastChildNode ((DocHtmlDescData*)p->parent(),p);
+ if (isFirst) t=2;
+ if (isLast) t=4;
+ break;
+ case DocNode::Kind_XRefItem:
+ isFirst=isFirstChildNode((DocXRefItem*)p->parent(),p);
+ isLast =isLastChildNode ((DocXRefItem*)p->parent(),p);
+ if (isFirst) t=2;
+ if (isLast) t=4;
+ break;
+ case DocNode::Kind_HtmlCell:
+ isFirst=isFirstChildNode((DocHtmlCell*)p->parent(),p);
+ isLast =isLastChildNode ((DocHtmlCell*)p->parent(),p);
+ if (isFirst) t=5;
+ if (isLast) t=6;
+ break;
+ case DocNode::Kind_SimpleSect:
+ isFirst=isFirstChildNode((DocSimpleSect*)p->parent(),p);
+ isLast =isLastChildNode ((DocSimpleSect*)p->parent(),p);
+ if (isFirst) t=2;
+ if (isLast) t=4;
+ if (isSeparatedParagraph((DocSimpleSect*)p->parent(),p))
+ // if the paragraph is enclosed with separators it will
+ // be included in <dd>..</dd> so avoid addition paragraph
+ // markers
+ {
+ isFirst=isLast=TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+ //printf("para=%p parent()->kind=%d isFirst=%d isLast=%d t=%d\n",
+ // p,p->parent()->kind(),isFirst,isLast,t);
+ }
+ return t;
+}
+
+void HtmlDocVisitor::visitPre(DocPara *p)
+{
+ if (m_hide) return;
+
+ //printf("DocPara::visitPre: parent of kind %d ",
+ // p->parent() ? p->parent()->kind() : -1);
+
+ bool needsTag = FALSE;
+ if (p && p->parent())
+ {
+ switch (p->parent()->kind())
+ {
+ case DocNode::Kind_Section:
+ case DocNode::Kind_Internal:
+ case DocNode::Kind_HtmlListItem:
+ case DocNode::Kind_HtmlDescData:
+ case DocNode::Kind_HtmlCell:
+ case DocNode::Kind_SimpleListItem:
+ case DocNode::Kind_AutoListItem:
+ case DocNode::Kind_SimpleSect:
+ case DocNode::Kind_XRefItem:
+ case DocNode::Kind_Copy:
+ needsTag = TRUE;
+ break;
+ case DocNode::Kind_Root:
+ needsTag = !((DocRoot*)p->parent())->singleLine();
+ break;
+ default:
+ needsTag = FALSE;
+ }
+ }
+
+ // if the first element of a paragraph is something that should be outside of
+ // the paragraph (<ul>,<dl>,<table>,..) then that will already started the
+ // paragraph and we don't need to do it here
+ uint nodeIndex = 0;
+ if (p && nodeIndex<p->children().count())
+ {
+ while (nodeIndex<p->children().count() &&
+ p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace)
+ {
+ nodeIndex++;
+ }
+ if (nodeIndex<p->children().count())
+ {
+ DocNode *n = p->children().at(nodeIndex);
+ if (mustBeOutsideParagraph(n))
+ {
+ needsTag = FALSE;
+ }
+ }
+ }
+
+ // check if this paragraph is the first or last child of a <li> or <dd>.
+ // this allows us to mark the tag with a special class so we can
+ // fix the otherwise ugly spacing.
+ int t;
+ static const char *contexts[7] =
+ { "", // 0
+ " class=\"startli\"", // 1
+ " class=\"startdd\"", // 2
+ " class=\"endli\"", // 3
+ " class=\"enddd\"", // 4
+ " class=\"starttd\"", // 5
+ " class=\"endtd\"" // 6
+ };
+ bool isFirst;
+ bool isLast;
+ t = getParagraphContext(p,isFirst,isLast);
+ //printf("startPara first=%d last=%d\n",isFirst,isLast);
+ if (isFirst && isLast) needsTag=FALSE;
+
+ //printf(" needsTag=%d\n",needsTag);
+ // write the paragraph tag (if needed)
+ if (needsTag) m_t << "<p" << contexts[t] << ">";
+}
+
+void HtmlDocVisitor::visitPost(DocPara *p)
+{
+// if (m_hide) return;
+// if (!p->isLast() && // omit <p> for last paragraph
+// !(p->parent() && // and for parameter sections
+// p->parent()->kind()==DocNode::Kind_ParamSect
+// )
+// )
+// {
+// m_t << "<p>\n";
+// }
+
+ bool needsTag = FALSE;
+ if (p && p->parent())
+ {
+ switch (p->parent()->kind())
+ {
+ case DocNode::Kind_Section:
+ case DocNode::Kind_Internal:
+ case DocNode::Kind_HtmlListItem:
+ case DocNode::Kind_HtmlDescData:
+ case DocNode::Kind_HtmlCell:
+ case DocNode::Kind_SimpleListItem:
+ case DocNode::Kind_AutoListItem:
+ case DocNode::Kind_SimpleSect:
+ case DocNode::Kind_XRefItem:
+ case DocNode::Kind_Copy:
+ needsTag = TRUE;
+ break;
+ case DocNode::Kind_Root:
+ needsTag = !((DocRoot*)p->parent())->singleLine();
+ break;
+ default:
+ needsTag = FALSE;
+ }
+ }
+
+ QCString context;
+ // if the last element of a paragraph is something that should be outside of
+ // the paragraph (<ul>,<dl>,<table>) then that will already have ended the
+ // paragraph and we don't need to do it here
+ int nodeIndex = p->children().count()-1;
+ if (p && nodeIndex>=0)
+ {
+ while (nodeIndex>=0 && p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace)
+ {
+ nodeIndex--;
+ }
+ if (nodeIndex>=0)
+ {
+ DocNode *n = p->children().at(nodeIndex);
+ if (mustBeOutsideParagraph(n))
+ {
+ needsTag = FALSE;
+ }
+ }
+ }
+
+ bool isFirst;
+ bool isLast;
+ getParagraphContext(p,isFirst,isLast);
+ //printf("endPara first=%d last=%d\n",isFirst,isLast);
+ if (isFirst && isLast) needsTag=FALSE;
+
+ //printf("DocPara::visitPost needsTag=%d\n",needsTag);
+
+ if (needsTag) m_t << "</p>\n";
+
+}
+
+void HtmlDocVisitor::visitPre(DocRoot *)
+{
+}
+
+void HtmlDocVisitor::visitPost(DocRoot *)
+{
+}
+
+void HtmlDocVisitor::visitPre(DocSimpleSect *s)
+{
+ if (m_hide) return;
+ forceEndParagraph(s);
+ m_t << "<dl class=\"" << s->typeString() << "\"><dt><b>";
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ m_t << theTranslator->trSeeAlso(); break;
+ case DocSimpleSect::Return:
+ m_t << theTranslator->trReturns(); break;
+ case DocSimpleSect::Author:
+ m_t << theTranslator->trAuthor(TRUE,TRUE); break;
+ case DocSimpleSect::Authors:
+ m_t << theTranslator->trAuthor(TRUE,FALSE); break;
+ case DocSimpleSect::Version:
+ m_t << theTranslator->trVersion(); break;
+ case DocSimpleSect::Since:
+ m_t << theTranslator->trSince(); break;
+ case DocSimpleSect::Date:
+ m_t << theTranslator->trDate(); break;
+ case DocSimpleSect::Note:
+ m_t << theTranslator->trNote(); break;
+ case DocSimpleSect::Warning:
+ m_t << theTranslator->trWarning(); break;
+ case DocSimpleSect::Pre:
+ m_t << theTranslator->trPrecondition(); break;
+ case DocSimpleSect::Post:
+ m_t << theTranslator->trPostcondition(); break;
+ case DocSimpleSect::Invar:
+ m_t << theTranslator->trInvariant(); break;
+ case DocSimpleSect::Remark:
+ m_t << theTranslator->trRemarks(); break;
+ case DocSimpleSect::Attention:
+ m_t << theTranslator->trAttention(); break;
+ case DocSimpleSect::User: break;
+ case DocSimpleSect::Rcs: break;
+ case DocSimpleSect::Unknown: break;
+ }
+
+ // special case 1: user defined title
+ if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
+ {
+ m_t << ":</b></dt><dd>";
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocSimpleSect *s)
+{
+ if (m_hide) return;
+ m_t << "</dd></dl>\n";
+ forceStartParagraph(s);
+}
+
+void HtmlDocVisitor::visitPre(DocTitle *)
+{
+}
+
+void HtmlDocVisitor::visitPost(DocTitle *)
+{
+ if (m_hide) return;
+ m_t << "</b></dt><dd>";
+}
+
+void HtmlDocVisitor::visitPre(DocSimpleList *sl)
+{
+ if (m_hide) return;
+ forceEndParagraph(sl);
+ m_t << "<ul>";
+ if (!sl->isPreformatted()) m_t << "\n";
+
+}
+
+void HtmlDocVisitor::visitPost(DocSimpleList *sl)
+{
+ if (m_hide) return;
+ m_t << "</ul>";
+ if (!sl->isPreformatted()) m_t << "\n";
+ forceStartParagraph(sl);
+}
+
+void HtmlDocVisitor::visitPre(DocSimpleListItem *)
+{
+ if (m_hide) return;
+ m_t << "<li>";
+}
+
+void HtmlDocVisitor::visitPost(DocSimpleListItem *li)
+{
+ if (m_hide) return;
+ m_t << "</li>";
+ if (!li->isPreformatted()) m_t << "\n";
+}
+
+void HtmlDocVisitor::visitPre(DocSection *s)
+{
+ if (m_hide) return;
+ forceEndParagraph(s);
+ m_t << "<h" << s->level()+1 << ">";
+ m_t << "<a class=\"anchor\" id=\"" << s->anchor();
+ m_t << "\"></a>" << endl;
+ filter(convertCharEntitiesToUTF8(s->title().data()));
+ m_t << "</h" << s->level()+1 << ">\n";
+}
+
+void HtmlDocVisitor::visitPost(DocSection *s)
+{
+ forceStartParagraph(s);
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlList *s)
+{
+ if (m_hide) return;
+ forceEndParagraph(s);
+ if (s->type()==DocHtmlList::Ordered)
+ {
+ m_t << "<ol" << htmlAttribsToString(s->attribs()) << ">\n";
+ }
+ else
+ {
+ m_t << "<ul" << htmlAttribsToString(s->attribs()) << ">\n";
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlList *s)
+{
+ if (m_hide) return;
+ if (s->type()==DocHtmlList::Ordered)
+ {
+ m_t << "</ol>";
+ }
+ else
+ {
+ m_t << "</ul>";
+ }
+ if (!s->isPreformatted()) m_t << "\n";
+ forceStartParagraph(s);
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlListItem *i)
+{
+ if (m_hide) return;
+ m_t << "<li" << htmlAttribsToString(i->attribs()) << ">";
+ if (!i->isPreformatted()) m_t << "\n";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlListItem *)
+{
+ if (m_hide) return;
+ m_t << "</li>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlDescList *dl)
+{
+ if (m_hide) return;
+ forceEndParagraph(dl);
+ m_t << "<dl" << htmlAttribsToString(dl->attribs()) << ">\n";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlDescList *dl)
+{
+ if (m_hide) return;
+ m_t << "</dl>\n";
+ forceStartParagraph(dl);
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlDescTitle *dt)
+{
+ if (m_hide) return;
+ m_t << "<dt" << htmlAttribsToString(dt->attribs()) << ">";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ m_t << "</dt>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlDescData *dd)
+{
+ if (m_hide) return;
+ m_t << "<dd" << htmlAttribsToString(dd->attribs()) << ">";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlDescData *)
+{
+ if (m_hide) return;
+ m_t << "</dd>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlTable *t)
+{
+ if (m_hide) return;
+
+ forceEndParagraph(t);
+
+ QString attrs = htmlAttribsToString(t->attribs());
+ if (attrs.isEmpty())
+ {
+ m_t << "<table class=\"doxtable\">\n";
+ }
+ else
+ {
+ m_t << "<table " << htmlAttribsToString(t->attribs()) << ">\n";
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlTable *t)
+{
+ if (m_hide) return;
+ m_t << "</table>\n";
+ forceStartParagraph(t);
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlRow *tr)
+{
+ if (m_hide) return;
+ m_t << "<tr" << htmlAttribsToString(tr->attribs()) << ">\n";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlRow *)
+{
+ if (m_hide) return;
+ m_t << "</tr>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlCell *c)
+{
+ if (m_hide) return;
+ if (c->isHeading())
+ {
+ m_t << "<th" << htmlAttribsToString(c->attribs()) << ">";
+ }
+ else
+ {
+ m_t << "<td" << htmlAttribsToString(c->attribs()) << ">";
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlCell *c)
+{
+ if (m_hide) return;
+ if (c->isHeading()) m_t << "</th>"; else m_t << "</td>";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlCaption *c)
+{
+ if (m_hide) return;
+ bool hasAlign = FALSE;
+ HtmlAttribListIterator li(c->attribs());
+ HtmlAttrib *att;
+ for (li.toFirst();(att=li.current());++li)
+ {
+ if (att->name=="align") hasAlign=TRUE;
+ }
+ m_t << "<caption" << htmlAttribsToString(c->attribs());
+ if (!hasAlign) m_t << " align=\"bottom\"";
+ m_t << ">";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlCaption *)
+{
+ if (m_hide) return;
+ m_t << "</caption>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocInternal *)
+{
+ if (m_hide) return;
+ //forceEndParagraph(i);
+ //m_t << "<p><b>" << theTranslator->trForInternalUseOnly() << "</b></p>" << endl;
+}
+
+void HtmlDocVisitor::visitPost(DocInternal *)
+{
+ if (m_hide) return;
+ //forceStartParagraph(i);
+}
+
+void HtmlDocVisitor::visitPre(DocHRef *href)
+{
+ if (m_hide) return;
+ m_t << "<a href=\"" << convertToXML(href->url()) << "\""
+ << htmlAttribsToString(href->attribs()) << ">";
+}
+
+void HtmlDocVisitor::visitPost(DocHRef *)
+{
+ if (m_hide) return;
+ m_t << "</a>";
+}
+
+void HtmlDocVisitor::visitPre(DocHtmlHeader *header)
+{
+ if (m_hide) return;
+ forceEndParagraph(header);
+ m_t << "<h" << header->level()
+ << htmlAttribsToString(header->attribs()) << ">";
+}
+
+void HtmlDocVisitor::visitPost(DocHtmlHeader *header)
+{
+ if (m_hide) return;
+ m_t << "</h" << header->level() << ">\n";
+ forceStartParagraph(header);
+}
+
+void HtmlDocVisitor::visitPre(DocImage *img)
+{
+ if (img->type()==DocImage::Html)
+ {
+ forceEndParagraph(img);
+ if (m_hide) return;
+ QString baseName=img->name();
+ int i;
+ if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ m_t << "<div class=\"image\">" << endl;
+ m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\""
+ << baseName << "\"" << htmlAttribsToString(img->attribs())
+ << "/>" << endl;
+ if (img->hasCaption())
+ {
+ m_t << "<div class=\"caption\">" << endl;
+ }
+ }
+ else // other format -> skip
+ {
+ pushEnabled();
+ m_hide=TRUE;
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocImage *img)
+{
+ if (img->type()==DocImage::Html)
+ {
+ if (m_hide) return;
+ if (img->hasCaption())
+ {
+ m_t << "</div>";
+ }
+ m_t << "</div>" << endl;
+ forceStartParagraph(img);
+ }
+ else // other format
+ {
+ popEnabled();
+ }
+}
+
+void HtmlDocVisitor::visitPre(DocDotFile *df)
+{
+ if (m_hide) return;
+ m_t << "<div class=\"dotgraph\">" << endl;
+ writeDotFile(df->file(),df->relPath(),df->context());
+ if (df->hasCaption())
+ {
+ m_t << "<div class=\"caption\">" << endl;
+ }
+}
+
+void HtmlDocVisitor::visitPost(DocDotFile *df)
+{
+ if (m_hide) return;
+ if (df->hasCaption())
+ {
+ m_t << "</div>" << endl;
+ }
+ m_t << "</div>" << endl;
+}
+
+void HtmlDocVisitor::visitPre(DocMscFile *df)
+{
+ if (m_hide) return;
+ m_t << "<div class=\"mscgraph\">" << endl;
+ writeMscFile(df->file(),df->relPath(),df->context());
+ if (df->hasCaption())
+ {
+ m_t << "<div class=\"caption\">" << endl;
+ }
+}
+void HtmlDocVisitor::visitPost(DocMscFile *df)
+{
+ if (m_hide) return;
+ if (df->hasCaption())
+ {
+ m_t << "</div>" << endl;
+ }
+ m_t << "</div>" << endl;
+}
+
+void HtmlDocVisitor::visitPre(DocLink *lnk)
+{
+ if (m_hide) return;
+ startLink(lnk->ref(),lnk->file(),lnk->relPath(),lnk->anchor());
+}
+
+void HtmlDocVisitor::visitPost(DocLink *)
+{
+ if (m_hide) return;
+ endLink();
+}
+
+void HtmlDocVisitor::visitPre(DocRef *ref)
+{
+ if (m_hide) return;
+ if (!ref->file().isEmpty())
+ {
+ startLink(ref->ref(),ref->file(),ref->relPath(),ref->anchor());
+ }
+ if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void HtmlDocVisitor::visitPost(DocRef *ref)
+{
+ if (m_hide) return;
+ if (!ref->file().isEmpty()) endLink();
+ //m_t << " ";
+}
+
+void HtmlDocVisitor::visitPre(DocSecRefItem *ref)
+{
+ if (m_hide) return;
+ QString refName=ref->file();
+ if (refName.right(Doxygen::htmlFileExtension.length())!=
+ QString(Doxygen::htmlFileExtension))
+ {
+ refName+=Doxygen::htmlFileExtension;
+ }
+ m_t << "<li><a href=\"" << refName << "#" << ref->anchor() << "\">";
+
+}
+
+void HtmlDocVisitor::visitPost(DocSecRefItem *)
+{
+ if (m_hide) return;
+ m_t << "</a></li>\n";
+}
+
+void HtmlDocVisitor::visitPre(DocSecRefList *s)
+{
+ if (m_hide) return;
+ forceEndParagraph(s);
+ m_t << "<div class=\"multicol\">" << endl;
+ m_t << "<ul>" << endl;
+}
+
+void HtmlDocVisitor::visitPost(DocSecRefList *s)
+{
+ if (m_hide) return;
+ m_t << "</ul>" << endl;
+ m_t << "</div>" << endl;
+ forceStartParagraph(s);
+}
+
+//void HtmlDocVisitor::visitPre(DocLanguage *l)
+//{
+// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
+// if (l->id().lower()!=langId.lower())
+// {
+// pushEnabled();
+// m_hide = TRUE;
+// }
+//}
+//
+//void HtmlDocVisitor::visitPost(DocLanguage *l)
+//{
+// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
+// if (l->id().lower()!=langId.lower())
+// {
+// popEnabled();
+// }
+//}
+
+void HtmlDocVisitor::visitPre(DocParamSect *s)
+{
+ if (m_hide) return;
+ forceEndParagraph(s);
+ m_t << "<dl><dt><b>";
+ QCString className;
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ m_t << theTranslator->trParameters();
+ className="params";
+ break;
+ case DocParamSect::RetVal:
+ m_t << theTranslator->trReturnValues();
+ className="retval";
+ break;
+ case DocParamSect::Exception:
+ m_t << theTranslator->trExceptions();
+ className="exception";
+ break;
+ case DocParamSect::TemplateParam:
+ /* TODO: add this
+ m_t << theTranslator->trTemplateParam(); break;
+ */
+ m_t << "Template Parameters"; break;
+ className="tparams";
+ default:
+ ASSERT(0);
+ }
+ m_t << ":";
+ m_t << "</b></dt><dd>" << endl;
+ m_t << " <table class=\"" << className << "\">" << endl;
+}
+
+void HtmlDocVisitor::visitPost(DocParamSect *s)
+{
+ if (m_hide) return;
+ m_t << " </table>" << endl;
+ m_t << " </dd>" << endl;
+ m_t << "</dl>" << endl;
+ forceStartParagraph(s);
+}
+
+void HtmlDocVisitor::visitPre(DocParamList *pl)
+{
+ //printf("DocParamList::visitPre\n");
+ if (m_hide) return;
+ m_t << " <tr>";
+ DocParamSect *sect = 0;
+ if (pl->parent()->kind()==DocNode::Kind_ParamSect)
+ {
+ sect=(DocParamSect*)pl->parent();
+ }
+ if (sect && sect->hasInOutSpecifier())
+ {
+ m_t << "<td class=\"paramdir\">";
+ if (pl->direction()!=DocParamSect::Unspecified)
+ {
+ m_t << "[";
+ if (pl->direction()==DocParamSect::In)
+ {
+ m_t << "in";
+ }
+ else if (pl->direction()==DocParamSect::Out)
+ {
+ m_t << "out";
+ }
+ else if (pl->direction()==DocParamSect::InOut)
+ {
+ m_t << "in,out";
+ }
+ m_t << "]";
+ }
+ m_t << "</td>";
+ }
+ if (sect && sect->hasTypeSpecifier())
+ {
+ m_t << "<td class=\"paramtype\">";
+ QListIterator<DocNode> li(pl->paramTypes());
+ DocNode *type;
+ bool first=TRUE;
+ for (li.toFirst();(type=li.current());++li)
+ {
+ if (!first) m_t << "&#160;|&#160;"; else first=FALSE;
+ if (type->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)type);
+ }
+ else if (type->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)type);
+ }
+ }
+ m_t << "</td>";
+ }
+ m_t << "<td class=\"paramname\">";
+ //QStrListIterator li(pl->parameters());
+ //const char *s;
+ QListIterator<DocNode> li(pl->parameters());
+ DocNode *param;
+ bool first=TRUE;
+ for (li.toFirst();(param=li.current());++li)
+ {
+ if (!first) m_t << ","; else first=FALSE;
+ if (param->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)param);
+ }
+ else if (param->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)param);
+ }
+ }
+ m_t << "</td><td>";
+}
+
+void HtmlDocVisitor::visitPost(DocParamList *)
+{
+ //printf("DocParamList::visitPost\n");
+ if (m_hide) return;
+ m_t << "</td></tr>" << endl;
+}
+
+void HtmlDocVisitor::visitPre(DocXRefItem *x)
+{
+ if (m_hide) return;
+ forceEndParagraph(x);
+ bool anonymousEnum = x->file()=="@";
+ if (!anonymousEnum)
+ {
+ m_t << "<dl class=\"" << x->key() << "\"><dt><b><a class=\"el\" href=\""
+ << x->relPath() << x->file() << Doxygen::htmlFileExtension
+ << "#" << x->anchor() << "\">";
+ }
+ else
+ {
+ m_t << "<dl class=\"" << x->key() << "\"><dt><b>";
+ }
+ filter(x->title());
+ m_t << ":";
+ if (!anonymousEnum) m_t << "</a>";
+ m_t << "</b></dt><dd>";
+}
+
+void HtmlDocVisitor::visitPost(DocXRefItem *x)
+{
+ if (m_hide) return;
+ m_t << "</dd></dl>" << endl;
+ forceStartParagraph(x);
+}
+
+void HtmlDocVisitor::visitPre(DocInternalRef *ref)
+{
+ if (m_hide) return;
+ startLink(0,ref->file(),ref->relPath(),ref->anchor());
+}
+
+void HtmlDocVisitor::visitPost(DocInternalRef *)
+{
+ if (m_hide) return;
+ endLink();
+ m_t << " ";
+}
+
+void HtmlDocVisitor::visitPre(DocCopy *)
+{
+}
+
+void HtmlDocVisitor::visitPost(DocCopy *)
+{
+}
+
+void HtmlDocVisitor::visitPre(DocText *)
+{
+}
+
+void HtmlDocVisitor::visitPost(DocText *)
+{
+}
+
+void HtmlDocVisitor::filter(const char *str)
+{
+ if (str==0) return;
+ const char *p=str;
+ char c;
+ while (*p)
+ {
+ c=*p++;
+ switch(c)
+ {
+ case '<': m_t << "&lt;"; break;
+ case '>': m_t << "&gt;"; break;
+ case '&': m_t << "&amp;"; break;
+ default: m_t << c;
+ }
+ }
+}
+
+/// Escape basic entities to produce a valid CDATA attribute value,
+/// assume that the outer quoting will be using the double quote &quot;
+void HtmlDocVisitor::filterQuotedCdataAttr(const char* str)
+{
+ if (str==0) return;
+ const char *p=str;
+ char c;
+ while (*p)
+ {
+ c=*p++;
+ switch(c)
+ {
+ case '&': m_t << "&amp;"; break;
+ case '"': m_t << "&quot;"; break;
+ // For SGML compliance, and given the SGML declaration for HTML syntax,
+ // it's enough to replace these two, provided that the declaration
+ // for the HTML version we generate (and as supported by the browser)
+ // specifies that all the other symbols used in rawVal are
+ // within the right charachter class (i.e., they're not
+ // some multinational weird charachters not in the BASESET).
+ // We assume that 1) the browser will support whatever is remaining
+ // in the formula and 2) the TeX formulae are generally governed
+ // by even stricter charachter restrictions so it should be enough.
+ //
+ // On some incompliant browsers, additional translation of
+ // '>' and '<' into "&gt;" and "&lt;", respectively, might be needed;
+ // but I'm unaware of particular modern (last 4 years) versions
+ // with such problems, so let's not do it for performance.
+ // Also, some brousers will (wrongly) not process the entity references
+ // inside the attribute value and show the &...; form instead,
+ // so we won't create entites unless necessary to minimize clutter there.
+ // --vassilii
+ default: m_t << c;
+ }
+ }
+}
+
+void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file,
+ const QCString &relPath,const QCString &anchor,
+ const QCString &tooltip)
+{
+ if (!ref.isEmpty()) // link to entity imported via tag file
+ {
+ m_t << "<a class=\"elRef\" ";
+ m_t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
+ }
+ else // local link
+ {
+ m_t << "<a class=\"el\" ";
+ }
+ m_t << "href=\"";
+ m_t << externalRef(relPath,ref,TRUE);
+ if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
+ if (!anchor.isEmpty()) m_t << "#" << anchor;
+ m_t << "\"";
+ if (!tooltip.isEmpty()) m_t << " title=\"" << tooltip << "\"";
+ m_t << ">";
+}
+
+void HtmlDocVisitor::endLink()
+{
+ m_t << "</a>";
+}
+
+void HtmlDocVisitor::pushEnabled()
+{
+ m_enabled.push(new bool(m_hide));
+}
+
+void HtmlDocVisitor::popEnabled()
+{
+ bool *v=m_enabled.pop();
+ ASSERT(v!=0);
+ m_hide = *v;
+ delete v;
+}
+
+void HtmlDocVisitor::writeDotFile(const QCString &fn,const QCString &relPath,
+ const QCString &context)
+{
+ QCString baseName=fn;
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ if ((i=baseName.find('.'))!=-1) // strip extension
+ {
+ baseName=baseName.left(i);
+ }
+ baseName.prepend("dot_");
+ QCString outDir = Config_getString("HTML_OUTPUT");
+ writeDotGraphFromFile(fn,outDir,baseName,BITMAP);
+ writeDotImageMapFromFile(m_t,fn,outDir,relPath,baseName,context);
+}
+
+void HtmlDocVisitor::writeMscFile(const QCString &fileName,const QCString &relPath,
+ const QCString &context)
+{
+ QCString baseName=fileName;
+ int i;
+ if ((i=baseName.findRev('/'))!=-1) // strip path
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ if ((i=baseName.find('.'))!=-1) // strip extension
+ {
+ baseName=baseName.left(i);
+ }
+ baseName.prepend("msc_");
+ QCString outDir = Config_getString("HTML_OUTPUT");
+ writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
+ writeMscImageMapFromFile(m_t,fileName,outDir,relPath,baseName,context);
+}
+
+/** Used for items found inside a paragraph, which due to XHTML restrictions
+ * have to be outside of the paragraph. This method will forcefully end
+ * the current paragraph and forceStartParagraph() will restart it.
+ */
+void HtmlDocVisitor::forceEndParagraph(DocNode *n)
+{
+ //printf("forceEndParagraph(%p) %d\n",n,n->kind());
+ if (n->parent() && n->parent()->kind()==DocNode::Kind_Para)
+ {
+ DocPara *para = (DocPara*)n->parent();
+ int nodeIndex = para->children().findRef(n);
+ nodeIndex--;
+ if (nodeIndex<0) return; // first node
+ while (nodeIndex>=0 &&
+ para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
+ )
+ {
+ nodeIndex--;
+ }
+ if (nodeIndex>=0)
+ {
+ DocNode *n = para->children().at(nodeIndex);
+ //printf("n=%p kind=%d outside=%d\n",n,n->kind(),mustBeOutsideParagraph(n));
+ if (mustBeOutsideParagraph(n)) return;
+ }
+
+ bool isFirst;
+ bool isLast;
+ getParagraphContext(para,isFirst,isLast);
+ //printf("forceEnd first=%d last=%d\n",isFirst,isLast);
+ if (isFirst && isLast) return;
+
+ m_t << "</p>" << endl;
+ }
+}
+
+/** Used for items found inside a paragraph, which due to XHTML restrictions
+ * have to be outside of the paragraph. This method will forcefully start
+ * the paragraph, that was previously ended by forceEndParagraph().
+ */
+void HtmlDocVisitor::forceStartParagraph(DocNode *n)
+{
+ //printf("forceStartParagraph(%p) %d\n",n,n->kind());
+ if (n->parent() && n->parent()->kind()==DocNode::Kind_Para) // if we are inside a paragraph
+ {
+ DocPara *para = (DocPara*)n->parent();
+ int nodeIndex = para->children().findRef(n);
+ int numNodes = para->children().count();
+ nodeIndex++;
+ if (nodeIndex==numNodes) return; // last node
+ while (nodeIndex<numNodes &&
+ para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
+ )
+ {
+ nodeIndex++;
+ }
+ if (nodeIndex<numNodes)
+ {
+ DocNode *n = para->children().at(nodeIndex);
+ if (mustBeOutsideParagraph(n)) return;
+ }
+ else
+ {
+ return; // only whitespace at the end!
+ }
+
+ bool isFirst;
+ bool isLast;
+ getParagraphContext(para,isFirst,isLast);
+ //printf("forceStart first=%d last=%d\n",isFirst,isLast);
+ if (isFirst && isLast) return;
+
+ m_t << "<p>";
+ }
+}
+
diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h
new file mode 100644
index 0000000..b6af24b
--- /dev/null
+++ b/src/htmldocvisitor.h
@@ -0,0 +1,162 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _HTMLDOCVISITOR_H
+#define _HTMLDOCVISITOR_H
+
+#include "docvisitor.h"
+#include <qstack.h>
+#include <qcstring.h>
+
+class DocNode;
+class FTextStream;
+class CodeOutputInterface;
+
+/*! @brief Concrete visitor implementation for HTML output. */
+class HtmlDocVisitor : public DocVisitor
+{
+ public:
+ HtmlDocVisitor(FTextStream &t,CodeOutputInterface &ci,const char *langExt);
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
+ void visit(DocIndexEntry *);
+ void visit(DocSimpleSectSep *);
+
+ //--------------------------------------
+ // visitor functions for compound nodes
+ //--------------------------------------
+
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *) ;
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *);
+ void visitPost(DocHtmlList *) ;
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *);
+ void visitPost(DocHtmlTable *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *);
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+ void visitPre(DocMscFile *);
+ void visitPost(DocMscFile *);
+ void visitPre(DocLink *);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
+ void visitPre(DocText *);
+ void visitPost(DocText *);
+
+ private:
+
+ //--------------------------------------
+ // helper functions
+ //--------------------------------------
+
+ void filter(const char *str);
+ void filterQuotedCdataAttr(const char* str);
+ void startLink(const QCString &ref,const QCString &file,
+ const QCString &relPath,const QCString &anchor,
+ const QCString &tooltip = "");
+ void endLink();
+ void writeDotFile(const QCString &fileName,const QCString &relPath,const QCString &context);
+ void writeMscFile(const QCString &fileName,const QCString &relPath,const QCString &context);
+
+ void pushEnabled();
+ void popEnabled();
+
+ void forceEndParagraph(DocNode *n);
+ void forceStartParagraph(DocNode *n);
+
+ //--------------------------------------
+ // state variables
+ //--------------------------------------
+
+ FTextStream &m_t;
+ CodeOutputInterface &m_ci;
+ bool m_insidePre;
+ bool m_hide;
+ QStack<bool> m_enabled;
+ QCString m_langExt;
+};
+
+#endif
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
new file mode 100644
index 0000000..2fb3670
--- /dev/null
+++ b/src/htmlgen.cpp
@@ -0,0 +1,3206 @@
+/******************************************************************************
+ *
+ * $Id: htmlgen.cpp,v 1.56 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "qtbc.h"
+#include <qdir.h>
+#include <qregexp.h>
+#include "message.h"
+#include "htmlgen.h"
+#include "config.h"
+#include "util.h"
+#include "doxygen.h"
+#include "logos.h"
+#include "diagram.h"
+#include "version.h"
+#include "dot.h"
+#include "language.h"
+#include "htmlhelp.h"
+#include "docparser.h"
+#include "htmldocvisitor.h"
+#include "index.h"
+#include "pagedef.h"
+#include "debug.h"
+#include "dirdef.h"
+#include "vhdldocgen.h"
+#include "layout.h"
+#include "image.h"
+
+
+//#define DBG_HTML(x) x;
+#define DBG_HTML(x)
+
+static const char defaultStyleSheet[] =
+#include "doxygen_css.h"
+;
+
+static const char search_script[]=
+#include "search_php.h"
+;
+
+static const char search_styleSheet[] =
+#include "search_css.h"
+;
+
+static const char search_jquery_script1[]=
+#include "jquery_js.h"
+;
+static const char search_jquery_script2[]=
+#include "sizzle_js.h"
+;
+static const char search_jquery_script3[]=
+#include "jquery_ui_js.h"
+;
+
+
+static QCString g_header;
+static QCString g_footer;
+
+//------------------------- Pictures for the Tabs ------------------------
+
+// active
+static unsigned char tab_a_png[36] =
+{
+ 31, 42, 59, 69, 73, 74, 75, 77, 77,
+ 77, 79, 80, 80, 82, 81, 83, 84, 86,
+ 87, 88, 89, 90, 91, 91, 93, 94, 94,
+ 96, 96, 97, 98, 98, 99, 99, 99, 100
+};
+
+// normal background
+static unsigned char tab_b_png[36] =
+{
+ 240, 239, 238, 237, 235, 234, 234, 232, 231,
+ 229, 228, 227, 224, 224, 221, 219, 218, 217,
+ 214, 212, 210, 209, 206, 203, 202, 200, 198,
+ 196, 195, 193, 192, 190, 189, 188, 188, 188
+};
+
+// shadowed header
+static unsigned char header_png[12] =
+{
+ 255, 240, 241, 242, 243, 244,
+ 245, 246, 247, 248, 249, 250
+};
+
+// function header
+static unsigned char func_header_png[56] =
+{
+ 248, 247, 246, 245, 244, 243, 242, 241,
+ 240, 239, 238, 237, 236, 235, 234, 233,
+ 232, 231, 230, 229, 228, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 223,
+ 224, 224, 224, 224, 225, 225, 225, 225,
+ 225, 226, 226, 226, 227, 227, 227, 227,
+ 228, 228, 228, 229, 229, 229, 229, 229
+};
+
+// hovering
+static unsigned char tab_h_png[36] =
+{
+ 199, 198, 196, 196, 195, 194, 193, 192, 189,
+ 188, 187, 184, 184, 181, 180, 178, 176, 173,
+ 171, 169, 166, 164, 163, 161, 159, 156, 155,
+ 153, 152, 149, 148, 147, 145, 145, 150, 161
+};
+
+// separator
+static unsigned char tab_s_png[36] =
+{
+ 187, 186, 185, 183, 182, 181, 180, 178, 176,
+ 174, 173, 171, 169, 167, 164, 163, 161, 158,
+ 156, 154, 152, 150, 148, 145, 143, 141, 140,
+ 138, 136, 134, 131, 131, 128, 126, 125, 124
+};
+
+
+static unsigned char bc_s_png[240] =
+{
+ 150,187,187,148,148,148,148,148,
+ 147,175,186,147,147,147,147,147,
+ 146,153,185,185,146,146,146,146,
+ 144,144,177,183,144,144,144,144,
+ 144,144,159,182,144,144,144,144,
+ 143,143,144,179,181,143,143,143,
+ 142,142,142,165,180,142,142,142,
+ 141,141,141,144,178,178,141,141,
+ 139,139,139,139,167,176,139,139,
+ 137,137,137,137,146,174,137,137,
+ 137,137,137,137,137,169,173,137,
+ 135,135,135,135,135,150,171,135,
+ 133,133,133,133,133,135,167,169,
+ 132,132,132,132,132,132,154,167,
+ 129,129,129,129,129,129,140,164,
+ 129,129,129,129,129,129,154,163,
+ 127,127,127,127,127,128,161,161,
+ 125,125,125,125,125,141,158,125,
+ 123,123,123,123,123,152,156,123,
+ 121,121,121,121,129,154,121,121,
+ 120,120,120,120,143,152,120,120,
+ 118,118,118,120,150,150,118,118,
+ 117,117,117,132,148,117,117,117,
+ 114,114,114,142,145,114,114,114,
+ 113,113,120,143,113,113,113,113,
+ 111,111,133,141,111,111,111,111,
+ 110,112,140,140,110,110,110,110,
+ 109,124,138,109,109,109,109,109,
+ 107,133,136,107,107,107,107,107,
+ 111,134,106,106,106,106,106,106
+};
+
+static unsigned char bc_s_a_png[240] =
+{
+ 241,241, 21, 0, 0, 0, 0, 0,
+ 162,205,117, 0, 0, 0, 0, 0,
+ 54,231,225, 3, 0, 0, 0, 0,
+ 0,198,215, 78, 0, 0, 0, 0,
+ 0, 93,211,186, 0, 0, 0, 0,
+ 0, 6,232,235, 42, 0, 0, 0,
+ 0, 0,132,203,147, 0, 0, 0,
+ 0, 0, 27,242,241, 15, 0, 0,
+ 0, 0, 0,168,205,108, 0, 0,
+ 0, 0, 0, 63,228,219, 0, 0,
+ 0, 0, 0, 0,207,221, 72, 0,
+ 0, 0, 0, 0,102,208,177, 0,
+ 0, 0, 0, 0, 9,238,240, 36,
+ 0, 0, 0, 0, 0,138,201,138,
+ 0, 0, 0, 0, 0, 77,187,158,
+ 0, 0, 0, 0, 0,159,204,120,
+ 0, 0, 0, 0, 15,241,241, 21,
+ 0, 0, 0, 0,111,208,171, 0,
+ 0, 0, 0, 0,210,222, 66, 0,
+ 0, 0, 0, 60,227,219, 0, 0,
+ 0, 0, 0,162,204,114, 0, 0,
+ 0, 0, 18,238,238, 21, 0, 0,
+ 0, 0,114,205,165, 0, 0, 0,
+ 0, 0,216,225, 60, 0, 0, 0,
+ 0, 66,226,216, 0, 0, 0, 0,
+ 0,165,204,111, 0, 0, 0, 0,
+ 21,241,241, 18, 0, 0, 0, 0,
+ 117,203,159, 0, 0, 0, 0, 0,
+ 219,227, 57, 0, 0, 0, 0, 0,
+ 211,201, 0, 0, 0, 0, 0, 0
+};
+
+static unsigned char doxygen_png[3224] =
+{
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,255,255,255,255,255,255,255,255,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 91, 91, 91, 91, 32, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,255,255,255,255, 32, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,253,253,253,253, 32, 32,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,255,255,255,255,255,255,255,255,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,251,251,251,251, 32, 32,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,255,255,255,255,255,255,255,255,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,249,249,249,249, 32, 32,249,249,249,249, 32, 32, 32, 32, 32, 32,249,249,249,249, 32, 32, 32, 32, 32, 32,249,249,249,249, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,249,249,249, 32, 32, 32, 32, 32,249,249,249,249, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,249,249,249,249,249,249, 32, 32, 32, 32, 32, 32, 32,249,249,249,249,249, 32, 32, 32, 32, 32,249, 32, 32, 32, 32, 32,255,255,255,
+ 32, 32, 32, 32, 46,132,190,190,147, 61,247,247,247,247, 32, 32,247,247, 32, 32,118,161,190,190,161,118, 32, 32,247, 32, 46, 89, 89, 89, 89, 46, 32,247,247, 32, 89, 89, 89, 89, 61, 89, 89, 89, 89, 46, 32,247, 32, 46, 89, 89, 89, 89, 32,247, 32, 32,118,175,190,161, 89, 61, 89, 89, 89, 61, 32,247,247,247, 32, 32,104,147,190,190,190,132, 89, 32, 32,247,247, 32, 46, 89, 89, 89, 75, 32, 89,161,190,161, 75, 32,255,255,
+ 32, 32, 32, 74,230,244,244,244,244,244,244,244,244,244, 32, 32,244, 32, 74,216,244,244,244,244,244,244,216, 74, 32,244, 32,187,244,244,244,159, 32,244, 32,117,244,244,244,230, 46,173,244,244,244,131, 32,244, 32,131,244,244,244,173, 32, 32, 46,173,244,244,244,244,244,230,244,244,244,131, 32,244,244, 32, 74,202,244,244,244,244,244,244,244,173, 46, 32,244, 32, 89,244,244,244,187,145,244,244,244,244,244, 89, 32,255,
+ 32, 32, 46,213,241,241,241,241,241,241,241,241,241,241, 32, 32, 32, 60,227,241,241,241,241,241,241,241,241,227, 60, 32, 32, 46,227,241,241,241,102, 32, 60,227,241,241,241, 88, 32,116,241,241,241,199, 32,241, 32,185,241,241,241,116, 32, 32,143,241,241,241,241,241,241,241,241,241,241,130, 32,241, 32, 74,227,241,241,241,199,185,241,241,241,241,171, 32,241, 32, 88,241,241,241,241,241,241,241,241,241,241,199, 32,255,
+ 32, 32,128,237,237,237,223,128, 87,128,237,237,237,237, 32, 32, 32,182,237,237,237,196,100,100,196,237,237,237,182, 32,237, 32,100,237,237,237,223, 59,196,237,237,237,141, 32, 32, 46,237,237,237,237, 59, 32, 46,237,237,237,237, 46, 32, 59,237,237,237,237,169, 87, 87,182,237,237,237,128, 32,237, 32,196,237,237,237, 87, 32, 32, 73,223,237,237,237, 73, 32, 32, 87,237,237,237,237,223,182,223,237,237,237,237, 46, 32,
+ 32, 32,207,234,234,234,113, 32, 32, 32,234,234,234,234, 32, 32, 59,234,234,234,221, 45, 32, 32, 45,221,234,234,234, 59, 32,234, 32,140,234,234,234,221,234,234,234,194, 32, 32,234, 32,167,234,234,234,126, 32, 99,234,234,234,167, 32, 32,126,234,234,234,180, 32, 32, 32,126,234,234,234,126, 32, 32, 99,234,234,234,167, 32, 32, 32, 32,153,234,234,234,126, 32, 32, 86,234,234,234,207, 45, 32, 45,234,234,234,234, 86, 32,
+ 32, 45,231,231,231,218, 32, 32, 32, 32,231,231,231,231, 32, 32, 98,231,231,231,165, 32,231,231, 32,165,231,231,231, 98, 32,231, 32, 45,191,231,231,231,231,231,218, 72, 32,231,231, 32, 98,231,231,231,165, 32,151,231,231,231,112, 32, 32,165,231,231,231,112, 32,231, 32,125,231,231,231,125, 32, 32,138,231,231,231,178,125,125,125,125,178,231,231,231,178, 32, 32, 85,231,231,231,178, 32,255, 32,191,231,231,231, 85, 32,
+ 32, 84,227,227,227,175, 32, 32, 32, 32,227,227,227,227, 32, 32,123,227,227,227,123, 32,227,227, 32,123,227,227,227,123, 32,227,227, 32, 71,227,227,227,227,227,123, 32,227,227,227,227, 32,214,227,227,227, 45,201,227,227,227, 45, 32, 32,175,227,227,227, 84, 32,227, 32,123,227,227,227,123, 32, 32,175,227,227,227,227,227,227,227,227,227,227,227,227,175, 32, 32, 84,227,227,227,175, 32,255, 32,175,227,227,227, 84, 32,
+ 32, 83,223,223,223,172, 32, 32, 32, 32,223,223,223,223, 32, 32,121,223,223,223,121, 32,223,223, 32,121,223,223,223,121, 32,223,223,223, 32,172,223,223,223,210, 45, 32,223,223,223,223, 32,147,223,223,223,134,223,223,223,147, 32,223, 32,172,223,223,223, 83, 32,223, 32,121,223,223,223,121, 32, 32,172,223,223,223,223,223,223,223,223,223,223,223,223,172, 32, 32, 83,223,223,223,172, 32,255, 32,172,223,223,223, 83, 32,
+ 32, 82,220,220,220,170, 32, 32, 32, 32,220,220,220,220, 32, 32,120,220,220,220,120, 32,220,220, 32,120,220,220,220,120, 32,220,220, 32, 95,220,220,220,220,220,132, 32,220,220,220,220, 32, 95,220,220,220,207,220,220,220, 95, 32,220, 32,170,220,220,220,107, 32,220, 32,120,220,220,220,120, 32, 32,170,220,220,220,132, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 82,220,220,220,170, 32,255, 32,170,220,220,220, 82, 32,
+ 32, 57,216,216,216,216, 32, 32, 32, 32,216,216,216,216, 32, 32, 81,216,216,216,167, 32,216,216, 32,155,216,216,216, 81, 32,216, 32, 57,204,216,216,216,216,216,216, 93, 32,216,216,216,216, 32,204,216,216,216,216,216,204, 32,216,216, 32,118,216,216,216,167, 32, 32, 32,130,216,216,216,118, 32, 32,118,216,216,216,191, 32, 32,216,216,216, 32, 32, 44, 57, 32, 32, 81,216,216,216,167, 32,255, 32,167,216,216,216, 81, 32,
+ 32, 32,189,213,213,213,116, 32, 32, 80,213,213,213,213, 32, 32, 44,201,213,213,213, 68, 32, 32, 68,213,213,213,213, 44, 32, 32, 32,165,213,213,213,165,213,213,213,201, 44, 32,213,213,213, 32,129,213,213,213,213,213,141, 32,213,213, 32, 80,213,213,213,213,165,116,153,213,213,213,213,116, 32, 32, 56,213,213,213,213,153, 56, 32, 32, 32, 44,104,189,116, 32, 32, 80,213,213,213,165, 32,255, 32,165,213,213,213, 80, 32,
+ 32, 32,139,210,210,210,210,174,174,210,210,210,210,210, 32, 32, 32,127,210,210,210,198,127,127,198,210,210,210,127, 32,210, 32,115,210,210,210,174, 44,139,210,210,210,163, 32, 32,210,210, 32, 68,210,210,210,210,210, 91, 32,210,210,210, 32,174,210,210,210,210,210,210,210,210,210,210,115, 32,210, 32,127,210,210,210,210,210,174,163,163,210,210,210,115, 32, 32, 79,210,210,210,163, 32,255, 32,163,210,210,210, 79, 32,
+ 32, 32, 55,194,206,206,206,206,206,194,206,206,206,206, 32, 32, 32, 44,171,206,206,206,206,206,206,206,206,171, 44, 32, 32, 67,206,206,206,206, 67, 32, 44,183,206,206,206,113, 32,206,206,206, 32,183,206,206,206,194, 32,206,206,206,206, 32, 67,194,206,206,206,206,206,171,206,206,206,113, 32,206, 32, 32,136,206,206,206,206,206,206,206,206,206,206,113, 32, 32, 78,206,206,206,160, 32,255, 32,160,206,206,206, 78, 32,
+ 32, 32, 32,100,192,203,203,203,157, 55,203,203,203,203, 32, 32,203, 32, 43,135,203,203,203,203,203,203,135, 43, 32, 32, 43,180,203,203,203,112, 32,203, 32, 66,203,203,203,203, 66, 32,203,203, 32,157,203,203,203,135, 32,203,203,203,203,203, 32, 43,112,157,157,123, 55,112,203,203,203,112, 32,203,203, 32, 32, 78,146,203,203,203,203,203,203,169,123, 55, 32, 32, 78,203,203,203,157, 32,255, 32,157,203,203,203, 78, 32,
+ 32, 32, 32, 32, 54,110,110, 88, 32, 32, 32, 32, 32, 32, 32, 32,200,200, 32, 32, 54, 99,110,110, 99, 54, 32, 32,200,200, 32, 32, 32, 32, 32, 32, 32,200,200, 32, 32, 32, 32, 32, 32,200,200, 32, 54,200,200,200,200, 77, 32,200,200,200,200,200, 32, 32, 32, 32, 32, 32, 32,166,200,200,200, 88, 32,200,200,200,200, 32, 32, 32, 66, 77, 77, 77, 32, 32, 32, 32,200,200, 32, 32, 32, 32, 32, 32,255, 32, 32, 32, 32, 32, 32,255,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,198,198,198,198, 32, 32, 32, 32, 32, 32,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198, 32,109,198,198,198,176, 32,198,198,198,198,198, 32, 98,121, 76, 32, 32, 54,109,198,198,198,198, 43, 32,198,198,198,198,198,198,198, 32, 32, 32, 32,198,198,198,198,198,198,198,198,198,198,198,198,255,255,255,255,255,255,255,255,
+ 32, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 33,159,191,191,191,117, 36, 41, 41, 41, 41, 41, 34,108,191,191,191,191,191,191,191,191,191,117, 36, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,255,
+ 32, 41, 97,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 78, 38, 64,190,192,192,192, 66, 66, 41, 41, 85,128, 65, 34,107,190,192,192,192,192,192,192,192,139, 48, 39, 41, 41,105,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 97, 41,255,
+ 32, 41, 97,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 96, 36, 95,147,148,148,139, 55, 41, 41, 85,121,128, 91, 38, 75,137,158,190,190,190,170,139, 97, 49, 37, 41, 41,105,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 97, 41,255,
+ 32, 41, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 41, 36, 45, 45, 45, 48, 38, 41, 41, 76, 76, 76, 76, 76, 37, 34, 42, 33, 33, 33, 39, 48, 59, 41, 41, 41, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 41,255,
+ 32, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+};
+
+static unsigned char doxygen_a_png[3224] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 66, 66, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,145,247,247,247,247,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,247,247,247,247,247,247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,247,247,247,247,247,247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,247,247,247,247,247,247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,115,181,181,132,247,247,247,247,247,247, 0, 0, 0, 0, 0, 99,148,181,181,148, 99, 0, 0, 0, 0, 16, 66, 66, 66, 66, 16, 0, 0, 0, 0, 66, 66, 66, 66, 33, 66, 66, 66, 66, 16, 0, 0, 0, 16, 66, 66, 66, 66, 0, 0, 0, 0, 99,165,181,148, 66, 33, 66, 66, 66, 33, 0, 0, 0, 0, 0, 0, 82,132,181,181,181,115, 66, 0, 0, 0, 0, 0, 16, 66, 66, 66, 49, 0, 66,148,181,148, 49, 0, 0, 0,
+ 0, 0, 0,129,247,247,247,247,247,247,247,247,247,247,247, 0, 0, 0,112,214,247,247,247,247,247,247,214,112, 0, 16,247,247,247,247,247,247, 46, 0, 0,145,247,247,247,247,247,247,247,247,247,247, 16, 0, 16,247,247,247,247,247, 66, 0, 63,165,247,247,247,247,247,247,247,247,247,247, 33, 0, 0, 0, 96,198,247,247,247,247,247,247,247,165, 63, 0, 0, 16,247,247,247,247,247,145,247,247,247,247,247,145, 0, 0,
+ 0, 0,112,247,247,247,247,247,247,247,247,247,247,247,247, 0, 0,129,247,247,247,247,247,247,247,247,247,247,129, 0,181,247,247,247,247,247,148, 0,129,247,247,247,247,247,247,247,247,247,247,247,115, 0,115,247,247,247,247,247,165, 30,247,247,247,247,247,247,247,247,247,247,247,247,115, 0, 0,129,247,247,247,247,247,247,247,247,247,247,247, 63, 0, 66,247,247,247,247,247,247,247,247,247,247,247,247, 96, 0,
+ 0, 16,247,247,247,247,247,247,247,247,247,247,247,247,247, 0, 79,247,247,247,247,247,247,247,247,247,247,247,247, 79, 79,247,247,247,247,247,247,129,247,247,247,247,247,247,129,247,247,247,247,247,198, 0,181,247,247,247,247,247, 99,145,247,247,247,247,247,247,247,247,247,247,247,247,115, 0, 96,247,247,247,247,247,247,247,247,247,247,247,247,165, 0, 66,247,247,247,247,247,247,247,247,247,247,247,247,198, 0,
+ 0,115,247,247,247,247,247,247,247,247,247,247,247,247,247, 0,181,247,247,247,247,247,247,247,247,247,247,247,247,181, 0,129,247,247,247,247,247,247,247,247,247,247,247,145, 16,247,247,247,247,247,247, 33,247,247,247,247,247,247, 33,247,247,247,247,247,247,247,247,247,247,247,247,247,115, 0,198,247,247,247,247,247,198,181,247,247,247,247,247,247, 49, 66,247,247,247,247,247,247,247,247,247,247,247,247,247, 16,
+ 0,214,247,247,247,247,247,129, 66,247,247,247,247,247,247, 33,247,247,247,247,247,247, 96, 96,247,247,247,247,247,247, 33, 0,145,247,247,247,247,247,247,247,247,247,198, 30, 0,165,247,247,247,247,247,115,247,247,247,247,247,165,115,247,247,247,247,247,181, 66,115,247,247,247,247,247,115, 82,247,247,247,247,247,165,115,115,148,247,247,247,247,247,115, 66,247,247,247,247,247,247,181,247,247,247,247,247,247, 66,
+ 16,247,247,247,247,247,231, 0, 0,247,247,247,247,247,247, 82,247,247,247,247,247,165, 0, 0,165,247,247,247,247,247, 82, 0, 30,247,247,247,247,247,247,247,247,247, 96, 0, 0, 82,247,247,247,247,247,165,247,247,247,247,247, 99,165,247,247,247,247,247, 99, 0,115,247,247,247,247,247,115,132,247,247,247,247,247,247,247,247,247,247,247,247,247,247,181, 66,247,247,247,247,247,181, 0,198,247,247,247,247,247, 66,
+ 66,247,247,247,247,247,181, 0, 0,247,247,247,247,247,247,115,247,247,247,247,247,115, 0, 0,115,247,247,247,247,247,115, 0, 0, 96,247,247,247,247,247,247,247,129, 0, 0, 0, 0,231,247,247,247,247,247,247,247,247,247,247, 16,181,247,247,247,247,247, 66, 0,115,247,247,247,247,247,115,181,247,247,247,247,247,247,247,247,247,247,247,247,247,247,181, 66,247,247,247,247,247,181, 0,181,247,247,247,247,247, 66,
+ 66,247,247,247,247,247,181, 0, 0,247,247,247,247,247,247,115,247,247,247,247,247,115, 0, 0,115,247,247,247,247,247,115, 0, 0, 0,181,247,247,247,247,247,247, 30, 0, 0, 0, 0,148,247,247,247,247,247,247,247,247,247,148, 0,181,247,247,247,247,247, 66, 0,115,247,247,247,247,247,115,181,247,247,247,247,247,247,247,247,247,247,247,247,247,247,181, 66,247,247,247,247,247,181, 0,181,247,247,247,247,247, 66,
+ 66,247,247,247,247,247,181, 0, 0,247,247,247,247,247,247,115,247,247,247,247,247,115, 0, 0,115,247,247,247,247,247,115, 0, 0,129,247,247,247,247,247,247,247,145, 0, 0, 0, 0, 82,247,247,247,247,247,247,247,247,247, 82, 0,181,247,247,247,247,247, 99, 0,115,247,247,247,247,247,115,181,247,247,247,247,247,247,247,247,247,247,247,247,247,181, 79, 66,247,247,247,247,247,181, 0,181,247,247,247,247,247, 66,
+ 33,247,247,247,247,247,247, 14, 0,247,247,247,247,247,247, 66,247,247,247,247,247,181, 0, 0,165,247,247,247,247,247, 66, 0, 79,247,247,247,247,247,247,247,247,247,129, 0, 0, 0, 0,231,247,247,247,247,247,247,247,231, 0, 0,115,247,247,247,247,247,181,115,165,247,247,247,247,247,115,115,247,247,247,247,247,214, 63, 0, 0, 0, 16,112,247,247, 33, 66,247,247,247,247,247,181, 0,181,247,247,247,247,247, 66,
+ 0,214,247,247,247,247,247,198,198,247,247,247,247,247,247, 16,247,247,247,247,247,247,132,132,247,247,247,247,247,247, 16, 14,181,247,247,247,247,247,247,247,247,247,247, 79, 0, 0, 0,132,247,247,247,247,247,247,247,148, 0, 0, 66,247,247,247,247,247,247,247,247,247,247,247,247,247,115, 33,247,247,247,247,247,247,247,198,181,181,247,247,247,247,115, 66,247,247,247,247,247,181, 0,181,247,247,247,247,247, 66,
+ 0,148,247,247,247,247,247,247,247,247,247,247,247,247,247, 0,132,247,247,247,247,247,247,247,247,247,247,247,247,145, 0,145,247,247,247,247,247,247,247,247,247,247,247,181, 14, 0, 0, 49,247,247,247,247,247,247,247, 82, 0, 0, 0,198,247,247,247,247,247,247,247,247,247,247,247,247,115, 0,145,247,247,247,247,247,247,247,247,247,247,247,247,247,115, 66,247,247,247,247,247,181, 0,181,247,247,247,247,247, 66,
+ 0, 46,247,247,247,247,247,247,247,247,247,247,247,247,247, 0, 30,247,247,247,247,247,247,247,247,247,247,247,247, 30,112,247,247,247,247,247,247, 96,247,247,247,247,247,247,145, 0, 0, 0,214,247,247,247,247,247,231, 0, 0, 0, 0, 96,247,247,247,247,247,247,247,247,247,247,247,247,115, 0, 30,148,247,247,247,247,247,247,247,247,247,247,247,247,115, 66,247,247,247,247,247,181, 0,181,247,247,247,247,247, 66,
+ 0, 0,129,247,247,247,247,247,247,247,247,247,247,247,247, 0, 0, 96,247,247,247,247,247,247,247,247,247,247, 96, 16,247,247,247,247,247,247,145, 0,112,247,247,247,247,247,247, 49, 0, 0,181,247,247,247,247,247,148, 0, 0, 0, 0, 0,129,247,247,247,247,247,247,247,247,247,247,247,115, 0, 0, 46,148,247,247,247,247,247,247,247,247,247,247,247, 33, 66,247,247,247,247,247,181, 0,181,247,247,247,247,247, 66,
+ 0, 0, 0,129,247,247,247,247,181,145,247,247,247,247,145, 0, 0, 0, 46,148,247,247,247,247,247,247,148, 46, 0, 0,112,214,247,247,247,145, 14, 0, 0,145,247,247,247,247,145, 0, 0, 33,247,247,247,247,247,247, 66, 0, 0, 0, 0, 0, 99,132,115,181,181,132,198,247,247,247,247,247, 82, 0, 0, 0, 0, 66,165,247,247,247,247,247,247,198,132, 33, 0, 0,145,247,247,247,181, 79, 0, 79,181,247,247,247,145, 0,
+ 0, 0, 0, 0, 33,115,115, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 99,115,115, 99, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115,247,247,247,247,247,214, 0, 0, 0, 0, 0, 99,247,247,247,247,247,247,247,247,247,247,247,247, 16, 0, 0, 0, 0, 0, 0, 0, 49, 66, 66, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,165,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,108,224,255,255,255,255,255,255,101,164,255,255,255,143,250,255,255,255,255,255,255,255,255,255,255,255, 98,170,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,165, 0,
+ 0,165,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,136,251,255,255,255,255,255,255,101,130,255,255,255,153,250,255,255,255,255,255,255,255,255,255,255,121, 98,189,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,165, 0,
+ 0,165,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,198,252,255,255,255,255,255,164,164,255,255,255,255,176,249,251,255,255,255,255,255,255,255,255,150, 86,192,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,165, 0,
+ 0,165,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,164,198,255,255,255,255,201,133,164,255,255,255,255,255,145,203,255,255,255,255,255,255,255,117, 79,194,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,165, 0,
+ 0, 66,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 73, 73,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 47, 70,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 66, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+unsigned char mag_sel_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0x90, 0x8c, 0x2d, 0xb5, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48,
+ 0x52, 0x4d, 0x00, 0x00, 0x6d, 0x98, 0x00, 0x00, 0x73, 0x8e, 0x00, 0x00,
+ 0xe0, 0x38, 0x00, 0x00, 0x82, 0xd5, 0x00, 0x00, 0x7a, 0x07, 0x00, 0x00,
+ 0xca, 0xb4, 0x00, 0x00, 0x33, 0x44, 0x00, 0x00, 0x1c, 0x76, 0x84, 0x36,
+ 0x2a, 0xbd, 0x00, 0x00, 0x01, 0xb9, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda,
+ 0xe4, 0x94, 0xbb, 0x8a, 0x22, 0x41, 0x14, 0x86, 0xbf, 0xda, 0x16, 0x3a,
+ 0x10, 0xba, 0x03, 0x2f, 0x78, 0x03, 0x51, 0x11, 0x4c, 0xd4, 0x40, 0xd4,
+ 0x37, 0x30, 0x31, 0x30, 0xe9, 0x07, 0xf0, 0x15, 0x14, 0x7c, 0x1e, 0x31,
+ 0x37, 0x33, 0x11, 0x73, 0xe9, 0x56, 0x44, 0x84, 0x36, 0xe9, 0x40, 0x50,
+ 0x54, 0x14, 0xc4, 0xc0, 0xa8, 0x6d, 0x50, 0x6a, 0x92, 0x1d, 0xd9, 0x9d,
+ 0x99, 0x75, 0x0d, 0x26, 0x58, 0xd8, 0x3f, 0xaa, 0xe2, 0xfc, 0xf5, 0xd5,
+ 0x39, 0x9c, 0x53, 0x25, 0xa4, 0x94, 0x7c, 0xa7, 0x7e, 0xf0, 0xcd, 0xfa,
+ 0xf7, 0x81, 0xbe, 0xf7, 0xc5, 0xf9, 0x7c, 0x96, 0x93, 0xc9, 0x84, 0xe5,
+ 0x72, 0xc9, 0x66, 0xb3, 0x21, 0x99, 0x4c, 0x92, 0xcf, 0xe7, 0xa9, 0x54,
+ 0x2a, 0x04, 0x02, 0x01, 0xf1, 0x2a, 0x50, 0x48, 0x29, 0x39, 0x9d, 0x4e,
+ 0x72, 0x30, 0x18, 0x60, 0x59, 0xd6, 0x27, 0x43, 0xb5, 0x5a, 0xa5, 0xd1,
+ 0x68, 0x10, 0x0c, 0x06, 0xc5, 0xcb, 0x19, 0x4e, 0xa7, 0x53, 0x2c, 0xcb,
+ 0x22, 0x95, 0x4a, 0x51, 0x2a, 0x95, 0xc8, 0x64, 0x32, 0xac, 0x56, 0x2b,
+ 0x66, 0xb3, 0x19, 0x93, 0xc9, 0x84, 0x48, 0x24, 0x42, 0xbd, 0x5e, 0x7f,
+ 0xbd, 0x64, 0xdb, 0xb6, 0x01, 0x28, 0x97, 0xcb, 0x54, 0x2a, 0x15, 0x34,
+ 0x4d, 0x13, 0xa1, 0x50, 0x48, 0x2a, 0x8a, 0xc2, 0x7a, 0xbd, 0xc6, 0xb6,
+ 0x6d, 0xea, 0xf5, 0x3a, 0xa3, 0xd1, 0x48, 0xf6, 0xfb, 0xfd, 0xc7, 0x61,
+ 0xc3, 0x30, 0xa8, 0xd5, 0x6a, 0xe2, 0x53, 0x53, 0xb6, 0xdb, 0x2d, 0x00,
+ 0xc5, 0x62, 0x11, 0x4d, 0xd3, 0x04, 0x80, 0xa6, 0x69, 0xa2, 0x50, 0x28,
+ 0xf0, 0x6b, 0x1c, 0x10, 0x86, 0x61, 0x3c, 0x60, 0x80, 0xf8, 0xb2, 0xcb,
+ 0x89, 0x44, 0x02, 0x00, 0xc7, 0x71, 0x00, 0xde, 0x27, 0x5d, 0xfe, 0xdc,
+ 0x3f, 0xe2, 0x1f, 0xa0, 0xe2, 0x8f, 0x63, 0x93, 0xcb, 0xe5, 0x00, 0x18,
+ 0x8f, 0xc7, 0x98, 0xa6, 0x89, 0xeb, 0xba, 0xd2, 0x34, 0x4d, 0xc6, 0xe3,
+ 0x31, 0x00, 0xe9, 0x74, 0x1a, 0x80, 0x5a, 0xad, 0xf6, 0x80, 0x3e, 0xed,
+ 0xf2, 0x7a, 0xbd, 0x96, 0xc3, 0xe1, 0x90, 0xf9, 0x7c, 0xfe, 0xa5, 0x29,
+ 0x1c, 0x0e, 0xd3, 0xe9, 0x74, 0xd0, 0x75, 0x5d, 0x00, 0x8c, 0x46, 0xa3,
+ 0x8f, 0x17, 0xfc, 0x0e, 0xf4, 0x3c, 0x4f, 0xee, 0x76, 0x3b, 0x16, 0x8b,
+ 0x05, 0x8e, 0xe3, 0xb0, 0xdf, 0xef, 0x89, 0xc7, 0xe3, 0xa4, 0xd3, 0x69,
+ 0x6c, 0xdb, 0xe6, 0x74, 0x3a, 0x11, 0x8d, 0x46, 0x69, 0xb7, 0xdb, 0x0f,
+ 0xe8, 0xd3, 0x0c, 0x01, 0x3c, 0xcf, 0x93, 0xae, 0xeb, 0xe2, 0x79, 0x1e,
+ 0xb7, 0xdb, 0x0d, 0x9f, 0xcf, 0x87, 0xa2, 0x28, 0x5c, 0x2e, 0x17, 0x7a,
+ 0xbd, 0x1e, 0xc7, 0xe3, 0x91, 0x58, 0x2c, 0x46, 0xab, 0xd5, 0x7a, 0x0a,
+ 0x7d, 0xbc, 0x14, 0x55, 0x55, 0x85, 0xaa, 0xaa, 0x9f, 0x0c, 0x7e, 0xbf,
+ 0x5f, 0x36, 0x9b, 0x4d, 0xba, 0xdd, 0x2e, 0xd7, 0xeb, 0x95, 0xeb, 0xf5,
+ 0x8a, 0xae, 0xeb, 0x7f, 0xcf, 0xf0, 0x99, 0x5c, 0xd7, 0x95, 0x87, 0xc3,
+ 0x81, 0xfb, 0xfd, 0x4e, 0x36, 0x9b, 0x7d, 0xad, 0xe4, 0xff, 0xe7, 0xfb,
+ 0x7a, 0x1b, 0x00, 0x59, 0xa8, 0xba, 0x68, 0xca, 0x4f, 0xc5, 0xa7, 0x00,
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned int mag_sel_png_len = 563;
+
+unsigned char mag_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0x90, 0x8c, 0x2d, 0xb5, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48,
+ 0x52, 0x4d, 0x00, 0x00, 0x6d, 0x98, 0x00, 0x00, 0x73, 0x8e, 0x00, 0x00,
+ 0xe0, 0x38, 0x00, 0x00, 0x82, 0xd5, 0x00, 0x00, 0x7a, 0x07, 0x00, 0x00,
+ 0xca, 0xb4, 0x00, 0x00, 0x33, 0x44, 0x00, 0x00, 0x1c, 0x76, 0x84, 0x36,
+ 0x2a, 0xbd, 0x00, 0x00, 0x01, 0x92, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda,
+ 0xe4, 0x94, 0xbb, 0xaa, 0xea, 0x50, 0x10, 0x86, 0xbf, 0xec, 0x08, 0x29,
+ 0x36, 0x24, 0x85, 0x17, 0xbc, 0x81, 0x18, 0x11, 0x6c, 0xd4, 0x42, 0x8c,
+ 0x0f, 0x61, 0xe1, 0x2b, 0xf8, 0x0a, 0x0a, 0x3e, 0x8f, 0xf8, 0x0c, 0x36,
+ 0x62, 0x1f, 0x92, 0x88, 0x88, 0x10, 0x9b, 0x14, 0x42, 0x44, 0x45, 0x41,
+ 0x2c, 0xac, 0x92, 0x80, 0xb2, 0x4e, 0x73, 0x94, 0x03, 0xfb, 0xb0, 0x4d,
+ 0xb1, 0x8b, 0x03, 0xe7, 0xaf, 0xd6, 0x62, 0xfe, 0xf5, 0x31, 0xc3, 0xcc,
+ 0x1a, 0x49, 0x08, 0xc1, 0x4f, 0xea, 0x83, 0x1f, 0xd6, 0xbf, 0x0f, 0x4c,
+ 0x3c, 0x0f, 0xd7, 0xeb, 0x55, 0x38, 0x8e, 0xc3, 0x66, 0xb3, 0x61, 0xb7,
+ 0xdb, 0x51, 0x2a, 0x95, 0xa8, 0xd7, 0xeb, 0x18, 0x86, 0x41, 0x32, 0x99,
+ 0x94, 0xe2, 0x02, 0x25, 0x21, 0x04, 0x97, 0xcb, 0x45, 0x4c, 0xa7, 0x53,
+ 0x6c, 0xdb, 0xfe, 0x62, 0xe8, 0x74, 0x3a, 0xf4, 0x7a, 0x3d, 0x52, 0xa9,
+ 0x94, 0x14, 0x3b, 0xc3, 0xc5, 0x62, 0x81, 0x6d, 0xdb, 0x94, 0xcb, 0x65,
+ 0x5a, 0xad, 0x16, 0x95, 0x4a, 0x85, 0xed, 0x76, 0xcb, 0x72, 0xb9, 0xc4,
+ 0x71, 0x1c, 0xb2, 0xd9, 0x2c, 0xdd, 0x6e, 0x37, 0x7e, 0xc9, 0xae, 0xeb,
+ 0x02, 0xd0, 0x6e, 0xb7, 0x31, 0x0c, 0x03, 0x55, 0x55, 0xa5, 0x74, 0x3a,
+ 0x2d, 0x64, 0x59, 0xc6, 0xf7, 0x7d, 0x5c, 0xd7, 0x8d, 0x0d, 0xfc, 0x00,
+ 0xd8, 0xef, 0xf7, 0x00, 0x34, 0x9b, 0x4d, 0x54, 0x55, 0x95, 0x00, 0x54,
+ 0x55, 0x95, 0x1a, 0x8d, 0x06, 0x7f, 0xc6, 0x63, 0x03, 0x8b, 0xc5, 0x22,
+ 0x00, 0x9e, 0xe7, 0x01, 0x3c, 0x27, 0x5d, 0xfc, 0xbe, 0xbf, 0xe2, 0xb1,
+ 0x81, 0xb5, 0x5a, 0x0d, 0x00, 0xd3, 0x34, 0xb1, 0x2c, 0x8b, 0x20, 0x08,
+ 0x84, 0x65, 0x59, 0x98, 0xa6, 0x09, 0x80, 0xae, 0xeb, 0xaf, 0x07, 0xf3,
+ 0xf9, 0xfc, 0x7d, 0x97, 0x7d, 0xdf, 0x17, 0xb3, 0xd9, 0x8c, 0xd5, 0x6a,
+ 0xf5, 0x57, 0x53, 0x26, 0x93, 0x61, 0x34, 0x1a, 0xa1, 0x69, 0x9a, 0x14,
+ 0x6b, 0x6c, 0xa2, 0x28, 0x12, 0x87, 0xc3, 0x81, 0xf5, 0x7a, 0x8d, 0xe7,
+ 0x79, 0x1c, 0x8f, 0x47, 0x0a, 0x85, 0x02, 0xba, 0xae, 0xe3, 0xba, 0x2e,
+ 0x97, 0xcb, 0x85, 0x5c, 0x2e, 0xc7, 0x70, 0x38, 0x7c, 0x0b, 0x95, 0x9e,
+ 0xcb, 0x21, 0x8a, 0x22, 0x11, 0x04, 0x01, 0x51, 0x14, 0x71, 0xbf, 0xdf,
+ 0x49, 0x24, 0x12, 0xc8, 0xb2, 0xcc, 0xed, 0x76, 0x63, 0x32, 0x99, 0x70,
+ 0x3e, 0x9f, 0xc9, 0xe7, 0xf3, 0x0c, 0x06, 0x83, 0x6f, 0xa1, 0xaf, 0x9f,
+ 0xa2, 0x28, 0x8a, 0xa4, 0x28, 0xca, 0x17, 0xc3, 0xe7, 0xe7, 0xa7, 0xe8,
+ 0xf7, 0xfb, 0x8c, 0xc7, 0x63, 0xc2, 0x30, 0x24, 0x0c, 0x43, 0x34, 0x4d,
+ 0x7b, 0x9f, 0xe1, 0x77, 0x0a, 0x82, 0x40, 0x9c, 0x4e, 0x27, 0x1e, 0x8f,
+ 0x07, 0xd5, 0x6a, 0x35, 0x5e, 0xc9, 0xff, 0xcf, 0xfa, 0xfa, 0x35, 0x00,
+ 0x70, 0xf3, 0xae, 0xcb, 0x89, 0xcd, 0xd2, 0x46, 0x00, 0x00, 0x00, 0x00,
+ 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned int mag_png_len = 524;
+
+unsigned char search_l_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0x90, 0x8c, 0x2d, 0xb5, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48,
+ 0x52, 0x4d, 0x00, 0x00, 0x6d, 0x98, 0x00, 0x00, 0x73, 0x8e, 0x00, 0x00,
+ 0xe0, 0x38, 0x00, 0x00, 0x82, 0xd5, 0x00, 0x00, 0x7a, 0x07, 0x00, 0x00,
+ 0xca, 0xb4, 0x00, 0x00, 0x33, 0x44, 0x00, 0x00, 0x1c, 0x76, 0x84, 0x36,
+ 0x2a, 0xbd, 0x00, 0x00, 0x01, 0xe2, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda,
+ 0xac, 0x54, 0x3d, 0xab, 0xda, 0x50, 0x18, 0x7e, 0xce, 0xc9, 0x39, 0x31,
+ 0x4d, 0xfc, 0x40, 0x30, 0x46, 0x14, 0xec, 0x50, 0x44, 0x17, 0x2f, 0x9d,
+ 0xba, 0x15, 0xda, 0xd1, 0xa1, 0x2e, 0xdd, 0x3b, 0x14, 0x4a, 0xa1, 0x7f,
+ 0xa6, 0x74, 0xbd, 0x43, 0xff, 0x84, 0xfd, 0x05, 0x82, 0xda, 0xa5, 0x83,
+ 0x1d, 0xdc, 0x8a, 0x88, 0xa0, 0x44, 0x83, 0xc6, 0x28, 0xad, 0x1f, 0x49,
+ 0xde, 0x2e, 0x8d, 0x78, 0x6f, 0xaf, 0x34, 0x68, 0x9f, 0xed, 0xbc, 0x70,
+ 0x1e, 0x9e, 0x8f, 0xf7, 0x1c, 0x46, 0x44, 0x38, 0x45, 0xaf, 0xd7, 0x63,
+ 0xb6, 0x6d, 0xe7, 0x6d, 0xdb, 0x6e, 0xba, 0xae, 0xfb, 0x6e, 0xb3, 0xd9,
+ 0xdc, 0x6c, 0xb7, 0xdb, 0x04, 0xe7, 0x1c, 0x8c, 0x31, 0xfc, 0x0b, 0x2c,
+ 0x22, 0xec, 0x76, 0xbb, 0xcc, 0xf3, 0xbc, 0xcc, 0x68, 0x34, 0x7a, 0xed,
+ 0xba, 0xee, 0x87, 0x6c, 0x36, 0x7b, 0x93, 0xcb, 0xe5, 0x44, 0x3a, 0x9d,
+ 0x86, 0xa6, 0x69, 0x50, 0x14, 0x25, 0x3e, 0x61, 0xa7, 0xd3, 0x61, 0xf3,
+ 0xf9, 0xfc, 0xc9, 0x78, 0x3c, 0xbe, 0xd5, 0x75, 0xfd, 0x79, 0xa5, 0x52,
+ 0x11, 0xa6, 0x69, 0x22, 0x95, 0x4a, 0x41, 0xd3, 0x34, 0x08, 0x21, 0xc0,
+ 0x18, 0x8b, 0x45, 0x28, 0x00, 0x60, 0xb5, 0x5a, 0xa5, 0x27, 0x93, 0xc9,
+ 0xa7, 0x62, 0xb1, 0xf8, 0xb2, 0x5a, 0xad, 0x22, 0x9f, 0xcf, 0xc3, 0x30,
+ 0x0c, 0x48, 0x29, 0xc1, 0x39, 0x47, 0x5c, 0xbb, 0x00, 0x20, 0xda, 0xed,
+ 0x36, 0x9f, 0x4e, 0xa7, 0xaf, 0x4c, 0xd3, 0x7c, 0x51, 0xaf, 0xd7, 0x61,
+ 0x59, 0x16, 0x74, 0x5d, 0x87, 0x94, 0x12, 0x97, 0x40, 0x2c, 0x16, 0x0b,
+ 0x93, 0x88, 0xde, 0xd6, 0x6a, 0x35, 0xdd, 0xb2, 0x2c, 0x18, 0x86, 0x01,
+ 0x21, 0x04, 0x2e, 0x05, 0xf7, 0x3c, 0xaf, 0x59, 0x2e, 0x97, 0x9f, 0x45,
+ 0xca, 0x38, 0xe7, 0xb8, 0x06, 0x3c, 0x08, 0x82, 0x46, 0xa1, 0x50, 0x78,
+ 0x74, 0xad, 0xb2, 0x23, 0xa1, 0x94, 0xf2, 0x69, 0x26, 0x93, 0xe1, 0x51,
+ 0x66, 0xf7, 0xf7, 0xd2, 0xf7, 0xfd, 0x07, 0x2f, 0x9e, 0x9b, 0x73, 0x55,
+ 0x55, 0xb3, 0x91, 0x55, 0xc6, 0x18, 0xc2, 0x30, 0xbc, 0x1b, 0xf2, 0x19,
+ 0xd5, 0xe7, 0xe6, 0x5c, 0x4a, 0x39, 0x06, 0x70, 0x5c, 0x8b, 0xb8, 0xeb,
+ 0x71, 0xd6, 0x32, 0x11, 0x75, 0xf6, 0xfb, 0xfd, 0xd1, 0xea, 0xd5, 0xa5,
+ 0x10, 0xd1, 0xb7, 0xf5, 0x7a, 0x1d, 0x84, 0x61, 0x08, 0x22, 0xba, 0x9e,
+ 0x50, 0x51, 0x94, 0xaf, 0x8e, 0xe3, 0xfc, 0xdc, 0xed, 0x76, 0xf8, 0x1f,
+ 0xe0, 0x89, 0x44, 0xe2, 0xc7, 0x72, 0xb9, 0xfc, 0xee, 0x38, 0x0e, 0x7c,
+ 0xdf, 0x3f, 0x5a, 0xbf, 0xdf, 0x76, 0x6c, 0xc2, 0x46, 0xa3, 0xf1, 0x2b,
+ 0x08, 0x82, 0xdb, 0xe1, 0x70, 0xe8, 0x2c, 0x16, 0x0b, 0x04, 0x41, 0x00,
+ 0x22, 0xba, 0xb8, 0x1c, 0xfe, 0x67, 0x05, 0xbe, 0x78, 0x9e, 0xf7, 0x79,
+ 0x30, 0x18, 0x8c, 0x67, 0xb3, 0x19, 0x45, 0x25, 0x9d, 0x53, 0x49, 0x44,
+ 0x38, 0x1c, 0x0e, 0x38, 0x2d, 0xf3, 0xce, 0x6f, 0x03, 0x60, 0x29, 0x84,
+ 0xf8, 0xe8, 0x79, 0x9e, 0xdb, 0xef, 0xf7, 0xdf, 0x97, 0x4a, 0xa5, 0xc7,
+ 0xd1, 0x53, 0x54, 0x55, 0x15, 0x52, 0xca, 0xbf, 0x14, 0x0b, 0x21, 0x1e,
+ 0x8c, 0x87, 0x9d, 0x1e, 0x5a, 0xad, 0x96, 0x00, 0x50, 0x27, 0xa2, 0x37,
+ 0xaa, 0xaa, 0x36, 0x0d, 0xc3, 0x28, 0x26, 0x93, 0x49, 0xa1, 0x69, 0x9a,
+ 0xc2, 0x39, 0x8f, 0x95, 0xc1, 0xef, 0x01, 0x00, 0x35, 0xe5, 0xd5, 0x5e,
+ 0xd0, 0xed, 0x0c, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
+ 0xae, 0x42, 0x60, 0x82
+};
+unsigned int search_l_png_len = 604;
+
+unsigned char search_m_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13,
+ 0x08, 0x02, 0x00, 0x00, 0x00, 0x35, 0x5e, 0x4b, 0x4d, 0x00, 0x00, 0x00,
+ 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xd6, 0xd8, 0xd4, 0x4f, 0x58,
+ 0x32, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66,
+ 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20,
+ 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9,
+ 0x65, 0x3c, 0x00, 0x00, 0x00, 0x30, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda,
+ 0x62, 0x2c, 0x2f, 0x2f, 0x67, 0x60, 0x60, 0x60, 0x3c, 0x7e, 0xfc, 0x38,
+ 0x88, 0xfa, 0xf8, 0xf1, 0x23, 0x88, 0xfa, 0xff, 0xff, 0x3f, 0x90, 0x62,
+ 0x62, 0x00, 0x03, 0x5a, 0x50, 0x2c, 0x10, 0x1b, 0x58, 0x6e, 0xdd, 0xba,
+ 0x05, 0xa4, 0x00, 0x02, 0x0c, 0x00, 0xa5, 0x07, 0x0f, 0x3c, 0x7e, 0xe1,
+ 0x45, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+ 0x60, 0x82
+};
+unsigned int search_m_png_len = 158;
+
+unsigned char search_r_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0x9d, 0x92, 0x5d, 0xf2, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48,
+ 0x52, 0x4d, 0x00, 0x00, 0x6d, 0x98, 0x00, 0x00, 0x73, 0x8e, 0x00, 0x00,
+ 0xe0, 0x38, 0x00, 0x00, 0x82, 0xd5, 0x00, 0x00, 0x7a, 0x07, 0x00, 0x00,
+ 0xca, 0xb4, 0x00, 0x00, 0x33, 0x44, 0x00, 0x00, 0x1c, 0x76, 0x84, 0x36,
+ 0x2a, 0xbd, 0x00, 0x00, 0x01, 0xea, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda,
+ 0xa4, 0xd4, 0xbf, 0xaa, 0x1a, 0x41, 0x14, 0x06, 0xf0, 0x6f, 0xf6, 0x9f,
+ 0xb2, 0x0a, 0x6b, 0xa5, 0x56, 0x8b, 0xa4, 0x92, 0xd4, 0x69, 0x7c, 0x03,
+ 0xb1, 0x59, 0x49, 0x11, 0x52, 0xdf, 0xbc, 0x43, 0xcc, 0x2b, 0xa4, 0x4c,
+ 0x97, 0x67, 0x08, 0xa4, 0x11, 0x2c, 0x52, 0x5c, 0x42, 0x24, 0x60, 0x8a,
+ 0x34, 0x29, 0x42, 0x50, 0x41, 0x21, 0xa0, 0x97, 0xd5, 0x55, 0xb3, 0xbb,
+ 0xee, 0xb2, 0xce, 0xee, 0xcc, 0x49, 0x91, 0x28, 0xc2, 0x0d, 0xe6, 0xaa,
+ 0xa7, 0x9d, 0xc3, 0x8f, 0x73, 0x98, 0xf9, 0x86, 0x75, 0x3a, 0x1d, 0xc2,
+ 0x89, 0x12, 0x42, 0x24, 0xf9, 0x7c, 0x7e, 0x5a, 0x2c, 0x16, 0x3f, 0x96,
+ 0x4a, 0xa5, 0x5e, 0xb5, 0x5a, 0xfd, 0x52, 0x2e, 0x97, 0xfd, 0x46, 0xa3,
+ 0x21, 0x8e, 0xfb, 0xd8, 0x60, 0x30, 0x38, 0x09, 0x65, 0x59, 0x86, 0x24,
+ 0x49, 0x10, 0x04, 0x81, 0xf0, 0x3c, 0x6f, 0xb3, 0xd9, 0x6c, 0x7e, 0x58,
+ 0x96, 0x75, 0x5b, 0xab, 0xd5, 0xde, 0x34, 0x9b, 0xcd, 0x5f, 0x07, 0xc8,
+ 0xf7, 0xfd, 0x93, 0x90, 0x94, 0xf2, 0x80, 0x85, 0x61, 0x88, 0xe5, 0x72,
+ 0x49, 0xe3, 0xf1, 0x58, 0xc6, 0x71, 0xfc, 0xc1, 0xb6, 0xed, 0xe7, 0x8e,
+ 0xe3, 0x84, 0x00, 0xc0, 0xa4, 0x94, 0x27, 0x21, 0x22, 0x82, 0x94, 0x12,
+ 0x52, 0x4a, 0xa4, 0x69, 0x8a, 0x28, 0x8a, 0xb0, 0x58, 0x2c, 0x30, 0x1c,
+ 0x0e, 0x85, 0xeb, 0xba, 0xef, 0x6b, 0xb5, 0xda, 0x4d, 0xab, 0xd5, 0x8a,
+ 0x34, 0xc6, 0xd8, 0x29, 0x07, 0x8c, 0x31, 0x28, 0x8a, 0x02, 0x22, 0x82,
+ 0xae, 0xeb, 0x30, 0x0c, 0x03, 0xb9, 0x5c, 0x0e, 0x86, 0x61, 0xa8, 0x52,
+ 0xca, 0xa7, 0xf3, 0xf9, 0xfc, 0x67, 0xbf, 0xdf, 0x7f, 0xa5, 0xe0, 0x81,
+ 0xc5, 0x18, 0x03, 0x63, 0x0c, 0x9a, 0xa6, 0xa1, 0x50, 0x28, 0xa0, 0x52,
+ 0xa9, 0xa0, 0x5e, 0xaf, 0x6b, 0x00, 0x5e, 0xac, 0xd7, 0xeb, 0x47, 0x0f,
+ 0x86, 0x8e, 0x41, 0x55, 0x55, 0x61, 0x9a, 0x26, 0x2a, 0x95, 0x0a, 0x6c,
+ 0xdb, 0xb6, 0x82, 0x20, 0x78, 0x76, 0x36, 0xb4, 0xc7, 0xf6, 0x93, 0x55,
+ 0xab, 0x55, 0x26, 0x84, 0x78, 0xac, 0x1c, 0x5f, 0xf3, 0xb9, 0xa5, 0xeb,
+ 0x3a, 0x2c, 0xcb, 0x82, 0xae, 0xeb, 0xbb, 0x03, 0xa4, 0x69, 0xda, 0xd9,
+ 0x53, 0x29, 0x8a, 0x02, 0xd3, 0x34, 0x99, 0x61, 0x18, 0xcb, 0x8b, 0x56,
+ 0x3b, 0xc6, 0xfe, 0x4e, 0x76, 0x77, 0x15, 0x44, 0x44, 0xe0, 0x9c, 0x0b,
+ 0x22, 0xfa, 0xaa, 0x5c, 0x83, 0x48, 0x29, 0x11, 0x86, 0xe1, 0x86, 0x88,
+ 0xbe, 0x5f, 0x35, 0xd1, 0x6e, 0xb7, 0x83, 0xe7, 0x79, 0x3d, 0x55, 0x55,
+ 0x7d, 0xd0, 0x05, 0x25, 0xa5, 0x24, 0xce, 0x39, 0x4d, 0x26, 0x93, 0x45,
+ 0xb7, 0xdb, 0x7d, 0x42, 0x44, 0x50, 0x2e, 0x59, 0x49, 0x08, 0x81, 0xf5,
+ 0x7a, 0x9d, 0x4c, 0xa7, 0xd3, 0x77, 0x42, 0x88, 0x6f, 0x00, 0xa0, 0xed,
+ 0x0f, 0xb3, 0x2c, 0x3b, 0xe4, 0xe9, 0x5f, 0xf9, 0x23, 0xfa, 0x93, 0x6d,
+ 0xce, 0x39, 0x56, 0xab, 0x95, 0x18, 0x0e, 0x87, 0x9f, 0x82, 0x20, 0x78,
+ 0xdd, 0x6e, 0xb7, 0xd3, 0x7b, 0xe9, 0x27, 0xa2, 0x7b, 0x08, 0x11, 0x21,
+ 0x4d, 0x53, 0x70, 0xce, 0x11, 0xc7, 0xb1, 0x74, 0x5d, 0xd7, 0x9f, 0xcd,
+ 0x66, 0x3d, 0xce, 0xf9, 0x4b, 0xc7, 0x71, 0xee, 0x0e, 0xef, 0x70, 0x34,
+ 0x1a, 0xe1, 0x7f, 0xff, 0x51, 0x92, 0x24, 0xd8, 0x6e, 0xb7, 0x61, 0x14,
+ 0x45, 0x9f, 0x39, 0xe7, 0x6f, 0x19, 0x63, 0xb7, 0x8e, 0xe3, 0x44, 0xc7,
+ 0x7d, 0xbf, 0x07, 0x00, 0x5f, 0x77, 0x46, 0x8c, 0x30, 0x2c, 0xd8, 0x9d,
+ 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned int search_r_png_len = 612;
+
+static unsigned char close_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xa9, 0xac, 0x77, 0x26, 0x00, 0x00, 0x00,
+ 0xd8, 0x49, 0x44, 0x41, 0x54, 0x18, 0x19, 0x75, 0x51, 0xbd, 0x12, 0x46,
+ 0x40, 0x0c, 0xdc, 0x18, 0x15, 0x0a, 0x14, 0x14, 0x1a, 0x43, 0xeb, 0x35,
+ 0xbc, 0x7f, 0xa7, 0x43, 0x67, 0x06, 0x33, 0x28, 0xd0, 0xde, 0x77, 0x7b,
+ 0x23, 0x2a, 0xdf, 0x16, 0x97, 0x9f, 0xdb, 0xcb, 0x26, 0x39, 0xc1, 0x83,
+ 0x7d, 0xdf, 0xcd, 0xb2, 0x2c, 0xd8, 0xb6, 0x0d, 0xe7, 0x79, 0x22, 0x8a,
+ 0x22, 0xc4, 0x71, 0x8c, 0x3c, 0xcf, 0x91, 0xa6, 0xa9, 0x90, 0xe6, 0x8e,
+ 0x69, 0x9a, 0xcc, 0x38, 0x8e, 0xb8, 0xae, 0x4b, 0xdf, 0xbe, 0x36, 0x0c,
+ 0x43, 0x94, 0x65, 0x89, 0xa2, 0x28, 0xc4, 0x3b, 0x8e, 0xe3, 0x2f, 0x91,
+ 0x2f, 0xa8, 0xc2, 0x42, 0x56, 0xd1, 0x78, 0xf3, 0x3c, 0xbb, 0x04, 0x2f,
+ 0xda, 0xb6, 0x45, 0x55, 0x55, 0x74, 0x9d, 0x65, 0x2c, 0x22, 0xb8, 0xef,
+ 0x1b, 0xeb, 0xba, 0xc2, 0x67, 0x8f, 0x4c, 0x10, 0x7d, 0xdf, 0xa3, 0xae,
+ 0x6b, 0xe7, 0xd3, 0x32, 0x56, 0x90, 0xe7, 0x53, 0x46, 0x31, 0x0c, 0x83,
+ 0x73, 0x95, 0xa8, 0x31, 0x93, 0x9c, 0xc7, 0xe3, 0xd4, 0x0a, 0xb6, 0xa0,
+ 0x44, 0x5a, 0xc6, 0xc6, 0x18, 0x77, 0xcd, 0x41, 0xbd, 0x24, 0x49, 0x94,
+ 0xfb, 0x12, 0x59, 0x51, 0x5b, 0xd2, 0x16, 0xed, 0xfa, 0x20, 0xdc, 0x6f,
+ 0xd7, 0x75, 0x9f, 0x6b, 0xd3, 0x2a, 0x41, 0x10, 0xa0, 0x69, 0x1a, 0x57,
+ 0x59, 0x28, 0x47, 0x99, 0x2f, 0x30, 0xcf, 0x7b, 0xfb, 0x41, 0xcf, 0x1a,
+ 0x2c, 0xeb, 0xeb, 0x07, 0x29, 0x9d, 0x65, 0x19, 0x6c, 0xab, 0x6e, 0x5d,
+ 0x3f, 0x07, 0x0a, 0x79, 0x90, 0x0e, 0x11, 0x45, 0xc2, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+static unsigned int close_png_len = 273;
+
+#if 0
+unsigned char open_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x09, 0x00, 0x09, 0x00, 0xf0, 0x00,
+ 0x00, 0x8e, 0xaf, 0xc4, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00,
+ 0x00, 0x01, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,
+ 0x00, 0x02, 0x0d, 0x8c, 0x8f, 0xa9, 0xcb, 0xe0, 0xff, 0x02, 0x8c, 0x66,
+ 0x26, 0x7a, 0x51, 0x01, 0x00, 0x3b
+};
+unsigned int open_gif_len = 54;
+
+unsigned char closed_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x09, 0x00, 0x09, 0x00, 0xf0, 0x00,
+ 0x00, 0x8e, 0xaf, 0xc4, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00,
+ 0x00, 0x01, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,
+ 0x00, 0x02, 0x10, 0x8c, 0x03, 0xa7, 0x98, 0xcb, 0xad, 0x80, 0x84, 0x66,
+ 0xca, 0x38, 0x57, 0xd6, 0xf4, 0xd0, 0x02, 0x00, 0x3b
+};
+unsigned int closed_gif_len = 57;
+#endif
+
+static unsigned char closed_png[81] =
+{
+ 0, 0, 0, 0,142, 0, 0, 0, 0,
+ 0, 0, 0, 0,142,142, 0, 0, 0,
+ 0, 0, 0, 0,142,142,142, 0, 0,
+ 0, 0, 0, 0,142,142,142,142, 0,
+ 0, 0, 0, 0,142,142,142,142,142,
+ 0, 0, 0, 0,142,142,142,142, 0,
+ 0, 0, 0, 0,142,142,142, 0, 0,
+ 0, 0, 0, 0,142,142, 0, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0
+};
+
+static unsigned char closed_a_png[81] =
+{
+ 0, 0, 0, 0,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255, 0, 0,
+ 0, 0, 0, 0,255,255,255,255, 0,
+ 0, 0, 0, 0,255,255,255,255,255,
+ 0, 0, 0, 0,255,255,255,255, 0,
+ 0, 0, 0, 0,255,255,255, 0, 0,
+ 0, 0, 0, 0,255,255, 0, 0, 0,
+ 0, 0, 0, 0,255, 0, 0, 0, 0
+};
+
+static unsigned char open_png[81] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 142,142,142,142,142,142,142,142,142,
+ 0,142,142,142,142,142,142,142, 0,
+ 0, 0,142,142,142,142,142, 0, 0,
+ 0, 0, 0,142,142,142, 0, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0
+};
+
+static unsigned char open_a_png[81] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 255,255,255,255,255,255,255,255,255,
+ 0,255,255,255,255,255,255,255, 0,
+ 0, 0,255,255,255,255,255, 0, 0,
+ 0, 0, 0,255,255,255, 0, 0, 0,
+ 0, 0, 0, 0,255, 0, 0, 0, 0
+};
+
+
+
+//------------------------------------------------------------------------
+
+static const char tabs_css[] =
+".tabs, .tabs2, .tabs3 {\n"
+" background-image: url('tab_b.png');\n"
+" width: 100%;\n"
+" z-index: 101;\n"
+" font-size: 13px;\n"
+"}\n"
+"\n"
+".tabs2 {\n"
+" font-size: 10px;\n"
+"}\n"
+".tabs3 {\n"
+" font-size: 9px;\n"
+"}\n"
+"\n"
+".tablist {\n"
+" margin: 0;\n"
+" padding: 0;\n"
+" display: table;\n"
+"}\n"
+"\n"
+".tablist li {\n"
+" float: left;\n"
+" display: table-cell;\n"
+" background-image: url('tab_b.png');\n"
+" line-height: 36px;\n"
+" list-style: none;\n"
+"}\n"
+"\n"
+".tablist a {\n"
+" display: block;\n"
+" padding: 0 20px;\n"
+" font-weight: bold;\n"
+" background-image:url('tab_s.png');\n"
+" background-repeat:no-repeat;\n"
+" background-position:right;\n"
+" color: ##30;\n"
+" text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);\n"
+" text-decoration: none;\n"
+" outline: none;\n"
+"}\n"
+"\n"
+".tabs3 .tablist a {\n"
+" padding: 0 10px;\n"
+"}\n"
+"\n"
+".tablist a:hover {\n"
+" background-image: url('tab_h.png');\n"
+" background-repeat:repeat-x;\n"
+" color: #fff;\n"
+" text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);\n"
+" text-decoration: none;\n"
+"}\n"
+"\n"
+".tablist li.current a {\n"
+" background-image: url('tab_a.png');\n"
+" background-repeat:repeat-x;\n"
+" color: #fff;\n"
+" text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);\n"
+"}\n"
+;
+
+struct img_data_item
+{
+ const char *name;
+ unsigned char *content;
+ unsigned int len;
+};
+
+
+static void writeImgData(const char *dir,img_data_item *data)
+{
+ while (data->name)
+ {
+ QCString fileName;
+ fileName=(QCString)dir+"/"+data->name;
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ {
+ f.writeBlock((char*)data->content,
+ data->len>0 ? data->len : strlen((char*)data->content));
+ }
+ else
+ {
+ fprintf(stderr,"Warning: Cannot open file %s for writing\n",data->name);
+ }
+ Doxygen::indexList.addImageFile(QCString("/search/")+data->name);
+ data++;
+ }
+}
+
+static ColoredImgDataItem colored_tab_data[] =
+{
+ { "tab_a.png", 1, 36, tab_a_png, 0 },
+ { "tab_b.png", 1, 36, tab_b_png, 0 },
+ { "tab_h.png", 1, 36, tab_h_png, 0 },
+ { "tab_s.png", 1, 36, tab_s_png, 0 },
+ { "nav_h.png", 1, 12, header_png, 0 },
+ { "nav_f.png", 1, 56, func_header_png, 0 },
+ { "bc_s.png", 8, 32, bc_s_png, bc_s_a_png },
+ { "doxygen.png", 104,31, doxygen_png, doxygen_a_png },
+ { "closed.png", 9, 9, closed_png, closed_a_png },
+ { "open.png", 9, 9, open_png, open_a_png },
+ { 0, 0, 0, 0, 0 }
+};
+
+static img_data_item search_client_data[] =
+{
+ { "mag_sel.png", mag_sel_png, mag_sel_png_len },
+ { "search_l.png", search_l_png, search_l_png_len },
+ { "search_m.png", search_m_png, search_m_png_len },
+ { "search_r.png", search_r_png, search_r_png_len },
+ { "close.png", close_png, close_png_len },
+ { 0, 0, 0 }
+};
+
+static img_data_item search_server_data[] =
+{
+ { "mag.png", mag_png, mag_png_len },
+ { "search_l.png", search_l_png, search_l_png_len },
+ { "search_m.png", search_m_png, search_m_png_len },
+ { "search_r.png", search_r_png, search_r_png_len },
+ { 0, 0, 0 }
+};
+
+//------------------------------------------------------------------------
+
+static void writeClientSearchBox(FTextStream &t,const char *relPath)
+{
+ t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
+ t << " <span class=\"left\">\n";
+ t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag_sel.png\"\n";
+ t << " onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
+ t << " onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
+ t << " alt=\"\"/>\n";
+ t << " <input type=\"text\" id=\"MSearchField\" value=\""
+ << theTranslator->trSearch() << "\" accesskey=\"S\"\n";
+ t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
+ t << " onblur=\"searchBox.OnSearchFieldFocus(false)\" \n";
+ t << " onkeyup=\"searchBox.OnSearchFieldChange(event)\"/>\n";
+ t << " </span><span class=\"right\">\n";
+ t << " <a id=\"MSearchClose\" href=\"javascript:searchBox.CloseResultsWindow()\">"
+ << "<img id=\"MSearchCloseImg\" border=\"0\" src=\"" << relPath << "search/close.png\" alt=\"\"/></a>\n";
+ t << " </span>\n";
+ t << " </div>\n";
+}
+
+static void writeServerSearchBox(FTextStream &t,const char *relPath,bool highlightSearch)
+{
+ t << " <div id=\"MSearchBox\" class=\"MSearchBoxInactive\">\n";
+ t << " <span class=\"left\">\n";
+ t << " <form id=\"FSearchBox\" action=\"" << relPath << "search.php\" method=\"get\">\n";
+ t << " <img id=\"MSearchSelect\" src=\"" << relPath << "search/mag.png\" alt=\"\"/>\n";
+ if (!highlightSearch)
+ {
+ t << " <input type=\"text\" id=\"MSearchField\" name=\"query\" value=\""
+ << theTranslator->trSearch() << "\" size=\"20\" accesskey=\"S\" \n";
+ t << " onfocus=\"searchBox.OnSearchFieldFocus(true)\" \n";
+ t << " onblur=\"searchBox.OnSearchFieldFocus(false)\"/>\n";
+ t << " </form>\n";
+ t << " </span><span class=\"right\"></span>\n";
+ t << " </div>\n";
+ }
+}
+
+static QCString getLogoName(const char *projectLogo)
+{
+ if (projectLogo==0) return "";
+ if (projectLogo[0]=='$') return projectLogo; // marker is used
+ QFileInfo fi(projectLogo);
+ if (fi.exists())
+ {
+ return fi.fileName().data();
+ }
+ return "";
+}
+
+static void writeTitleArea(FTextStream &t,const char *relPath,
+ const char *projectName,const char *projectBrief,
+ const char *projectNumber,const char *projectLogo)
+{
+ QCString logoName = getLogoName(projectLogo);
+ static bool disableIndex = Config_getBool("DISABLE_INDEX");
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
+ if (!(logoName.isEmpty() && QCString(projectName).isEmpty() &&
+ QCString(projectBrief).isEmpty()) ||
+ (disableIndex && searchEngine))
+ {
+ t << "<div id=\"titlearea\">" << endl;
+ t << "<table cellspacing=\"0\" cellpadding=\"0\">" << endl;
+ t << " <tbody>" << endl;
+ t << " <tr style=\"height: 56px;\">" << endl;
+ if (!logoName.isEmpty())
+ {
+ t << " <td id=\"projectlogo\"><img alt=\"Logo\" src=\"" << relPath << logoName << "\"/></td>" << endl;
+ }
+ if (!(QCString(projectName).isEmpty() && QCString(projectBrief).isEmpty()))
+ {
+ t << " <td style=\"padding-left: 0.5em;\">" << endl;
+ if (!QCString(projectName).isEmpty())
+ {
+ t << " <div id=\"projectname\">" << projectName;
+ if (!QCString(projectNumber).isEmpty())
+ {
+ t << "&#160;<span id=\"projectnumber\">" << projectNumber << "</span>";
+ }
+ t << "</div>" << endl;
+ }
+ if (!QCString(projectBrief).isEmpty())
+ {
+ t << " <div id=\"projectbrief\">" << projectBrief << "</div>" << endl;
+ }
+ t << " </td>" << endl;
+ }
+ if (disableIndex && searchEngine)
+ {
+ t << " <td>" << endl;
+ if (serverBasedSearch)
+ {
+ writeServerSearchBox(t,relPath,FALSE);
+ }
+ else
+ {
+ writeClientSearchBox(t,relPath);
+ }
+ t << " </td>" << endl;
+ }
+ t << " </tr>" << endl;
+ t << " </tbody>" << endl;
+ t << "</table>" << endl;
+ t << "</div>" << endl;
+ }
+}
+
+//------------------------------------------------------------------------
+
+/// substitute all occurrences of \a src in \a s by \a dst
+QCString substitute(const char *s,const char *src,const char *dst)
+{
+ if (s==0 || src==0) return s;
+ const char *p, *q;
+ int srcLen = strlen(src);
+ int dstLen = dst ? strlen(dst) : 0;
+ int resLen;
+ if (srcLen!=dstLen)
+ {
+ int count;
+ for (count=0, p=s; (q=strstr(p,src))!=0; p=q+srcLen) count++;
+ resLen = p-s+strlen(p)+count*(dstLen-srcLen);
+ }
+ else // result has same size as s
+ {
+ resLen = strlen(s);
+ }
+ QCString result(resLen+1);
+ char *r;
+ for (r=result.data(), p=s; (q=strstr(p,src))!=0; p=q+srcLen)
+ {
+ int l = (int)(q-p);
+ memcpy(r,p,l);
+ r+=l;
+ if (dst) memcpy(r,dst,dstLen);
+ r+=dstLen;
+ }
+ strcpy(r,p);
+ //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data());
+ return result;
+}
+//----------------------------------------------------------------------
+
+/// Clear a text block \a s from \a begin to end \a markers
+QCString clearBlock(const char *s,const char *begin,const char *end)
+{
+ if (s==0 || begin==0 || end==0) return s;
+ const char *p, *q;
+ int beginLen = strlen(begin);
+ int endLen = strlen(end);
+ int resLen = 0;
+ for(p=s; (q=strstr(p,begin))!=0; p=q+endLen)
+ {
+ resLen+=q-p;
+ p=q+beginLen;
+ if((q=strstr(p,end))==0)
+ {
+ resLen+=beginLen;
+ break;
+ }
+ }
+ resLen+=strlen(p);
+
+ QCString result(resLen+1);
+ char *r;
+ for (r=result.data(), p=s; (q=strstr(p,begin))!=0; p=q+endLen)
+ {
+ int l = (int)(q-p);
+ memcpy(r,p,l);
+ r+=l;
+ p=q+beginLen;
+ if((q=strstr(p,end))==0)
+ {
+ memcpy(r,begin,beginLen);
+ r+=beginLen;
+ break;
+ }
+ }
+ strcpy(r,p);
+ return result;
+}
+//----------------------------------------------------------------------
+
+QCString selectBlock(const QCString& s,const QCString &name,bool which)
+{
+ const QCString begin = "<!--BEGIN " + name + "-->";
+ const QCString end = "<!--END " + name + "-->";
+ const QCString nobegin = "<!--BEGIN !" + name + "-->";
+ const QCString noend = "<!--END !" + name + "-->";
+
+ QCString result = s;
+ if (which)
+ {
+ result = substitute(result, begin, "");
+ result = substitute(result, end, "");
+ result = clearBlock(result, nobegin, noend);
+ }
+ else
+ {
+ result = substitute(result, nobegin, "");
+ result = substitute(result, noend, "");
+ result = clearBlock(result, begin, end);
+ }
+
+ return result;
+}
+
+static QCString getSearchBox(bool serverSide, QCString relPath, bool highlightSearch)
+{
+ QGString result;
+ FTextStream t(&result);
+ if (serverSide) {
+ writeServerSearchBox(t, relPath, highlightSearch);
+ }
+ else {
+ writeClientSearchBox(t, relPath);
+ }
+ return QCString(result);
+}
+
+
+static QCString substituteHtmlKeywords(const QCString &s,const char *title,
+ const QCString &relPath)
+{
+ // Build CSS/Javascript tags depending on treeview, search engine settings
+ QCString treeViewCssJs;
+ QCString searchCssJs;
+ QCString searchBox;
+ QCString mathJaxJs;
+ static bool treeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
+ static bool mathJax = Config_getBool("USE_MATHJAX");
+ static bool disableIndex = Config_getBool("DISABLE_INDEX");
+ static bool hasProjectName = !Config_getString("PROJECT_NAME").isEmpty();
+ static bool hasProjectNumber = !Config_getString("PROJECT_NUMBER").isEmpty();
+ static bool hasProjectBrief = !Config_getString("PROJECT_BRIEF").isEmpty();
+ static bool hasProjectLogo = !Config_getString("PROJECT_LOGO").isEmpty();
+ static bool titleArea = (hasProjectName || hasProjectBrief || hasProjectLogo || (disableIndex && searchEngine));
+
+ if (treeView)
+ {
+ treeViewCssJs = "<link href=\"$relpath$navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
+ "<script type=\"text/javascript\" src=\"$relpath$jquery.js\"></script>\n"
+ "<script type=\"text/javascript\" src=\"$relpath$resize.js\"></script>\n"
+ "<script type=\"text/javascript\" src=\"$relpath$navtree.js\"></script>\n"
+ "<script type=\"text/javascript\">\n"
+ " $(document).ready(initResizable);\n"
+ "</script>";
+ }
+
+ if (searchEngine)
+ {
+ searchCssJs = "<link href=\"$relpath$search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ if (!Config_getBool("GENERATE_TREEVIEW"))
+ {
+ searchCssJs += "<script type=\"text/javascript\" src=\"$relpath$jquery.js\"></script>\n";
+ }
+ searchCssJs += "<script type=\"text/javascript\" src=\"$relpath$search/search.js\"></script>\n";
+
+ if (!serverBasedSearch)
+ {
+ searchCssJs += "<script type=\"text/javascript\">\n"
+ " $(document).ready(function() { searchBox.OnSelectItem(0); });\n"
+ "</script>";
+ }
+ else
+ {
+ searchCssJs += "<script type=\"text/javascript\">\n"
+ " $(document).ready(function() {\n"
+ " if ($('.searchresults').length > 0) { searchBox.DOMSearchField().focus(); }\n"
+ " });\n"
+ "</script>";
+ }
+ searchBox = getSearchBox(serverBasedSearch, relPath, FALSE);
+ }
+
+ if (mathJax)
+ {
+ mathJaxJs = "<script src=\"$relpath$MathJax.js\">\n"
+ " MathJax.Hub.Config({\n"
+ " extensions: [\"tex2jax.js\"],\n"
+ " jax: [\"input/TeX\",\"output/HTML-CSS\"],\n"
+ "});\n"
+ "</script>\n";
+ }
+
+ // first substitute generic keywords
+ QCString result = substituteKeywords(s,title);
+
+ // additional HTML only keywords
+ result = substitute(result,"$treeview",treeViewCssJs);
+ result = substitute(result,"$search",searchCssJs);
+ result = substitute(result,"$searchbox",searchBox);
+ result = substitute(result,"$mathjax",mathJaxJs);
+ result = substitute(result,"$relpath$",relPath); //<-- must be last
+
+ // additional HTML only conditional blocks
+ result = selectBlock(result,"DISABLE_INDEX",disableIndex);
+ result = selectBlock(result,"GENERATE_TREEVIEW",treeView);
+ result = selectBlock(result,"SEARCHENGINE",searchEngine);
+ result = selectBlock(result,"TITLEAREA",titleArea);
+ result = selectBlock(result,"PROJECT_NAME",hasProjectName);
+ result = selectBlock(result,"PROJECT_NUMBER",hasProjectNumber);
+ result = selectBlock(result,"PROJECT_BRIEF",hasProjectBrief);
+ result = selectBlock(result,"PROJECT_LOGO",hasProjectLogo);
+
+ return result;
+}
+
+//------------------------- Pictures for the Tabs ------------------------
+
+HtmlGenerator::HtmlGenerator() : OutputGenerator()
+{
+ dir=Config_getString("HTML_OUTPUT");
+ col=0;
+}
+
+HtmlGenerator::~HtmlGenerator()
+{
+ //printf("HtmlGenerator::~HtmlGenerator()\n");
+}
+
+void HtmlGenerator::init()
+{
+ QCString dname=Config_getString("HTML_OUTPUT");
+ QDir d(dname);
+ if (!d.exists() && !d.mkdir(dname))
+ {
+ err("Could not create output directory %s\n",dname.data());
+ exit(1);
+ }
+ //writeLogo(dname);
+ if (!Config_getString("HTML_HEADER").isEmpty())
+ {
+ g_header=fileToString(Config_getString("HTML_HEADER"));
+ //printf("g_header='%s'\n",g_header.data());
+ }
+ if (!Config_getString("HTML_FOOTER").isEmpty())
+ {
+ g_footer=fileToString(Config_getString("HTML_FOOTER"));
+ //printf("g_footer='%s'\n",g_footer.data());
+ }
+ createSubDirs(d);
+
+ QCString fileName=dname+"/tabs.css";
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << replaceColorMarkers(tabs_css);
+ }
+ else
+ {
+ fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data());
+ }
+
+ {
+ QFile f(dname+"/jquery.js");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << search_jquery_script1 << search_jquery_script2 << search_jquery_script3;
+ }
+ }
+}
+
+/// Additional initialization after indices have been created
+void HtmlGenerator::writeTabData()
+{
+ Doxygen::indexList.addStyleSheetFile("tabs.css");
+ QCString dname=Config_getString("HTML_OUTPUT");
+ writeColoredImgData(dname,colored_tab_data);
+}
+
+void HtmlGenerator::writeSearchData(const char *dir)
+{
+ static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
+ writeImgData(dir,serverBasedSearch ? search_server_data : search_client_data);
+ QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search";
+ QFile f(searchDirName+"/search.css");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << replaceColorMarkers(search_styleSheet);
+ }
+ Doxygen::indexList.addStyleSheetFile("search/search.css");
+}
+
+
+
+void HtmlGenerator::writeStyleSheetFile(QFile &file)
+{
+ FTextStream t(&file);
+ t << replaceColorMarkers(defaultStyleSheet);
+}
+
+static void writeDefaultNavTree(FTextStream &t,const char *relPathStr)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ if (generateTreeView)
+ {
+ t << "<link href=\"" << relPathStr << "navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ t << "<script type=\"text/javascript\" src=\"" << relPathStr << "jquery.js\"></script>\n";
+ t << "<script type=\"text/javascript\" src=\"" << relPathStr << "navtree.js\"></script>\n";
+ t << "<script type=\"text/javascript\" src=\"" << relPathStr << "resize.js\"></script>\n";
+ t << "<script type=\"text/javascript\">" << endl;
+ t << "$(document).ready(initResizable);" << endl;
+ t << "</script>" << endl;
+ }
+}
+
+static void writeDefaultHeaderFile(FTextStream &t, const char *name,
+ const char *title,
+ const char *relPath,bool usePathCmd,
+ bool searchPage=FALSE)
+{
+ QString relPathStr;
+ if (usePathCmd)
+ relPathStr="$relpath$";
+ else
+ relPathStr=relPath;
+
+ QCString id = name;
+ if (id.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
+ {
+ id=id.left(id.length()-Doxygen::htmlFileExtension.length());
+ }
+
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
+ //if (searchEngine && !generateTreeView)
+ //{
+ // t << "<!-- This comment will put IE 6, 7 and 8 in quirks mode -->" << endl;
+ //}
+ // t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
+ // t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
+ t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
+ t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"
+ "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n"
+ "<title>";
+ t << convertToHtml(title);
+ t << "</title>\n";
+
+ t << "<link href=\"" << relPathStr << "tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ if (searchEngine /* && !generateTreeView*/ )
+ {
+ t << "<link href=\"" << relPathStr << "search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ t << "<script type=\"text/javascript\" src=\"" << relPathStr << "search/search.js\"></script>\n";
+ }
+
+ writeDefaultNavTree(t,relPathStr);
+
+ if (Config_getBool("USE_MATHJAX"))
+ {
+ QCString path = Config_getString("MATHJAX_RELPATH");
+ if (!path.isEmpty() && path.at(path.length()-1)!='/')
+ {
+ path+="/";
+ }
+ if (path.isEmpty() || path.left(2)=="..") // relative path
+ {
+ path.prepend(relPathStr);
+ }
+ t << "<script src=\"" << path << "MathJax.js\">\n";
+ t << " MathJax.Hub.Config({\n";
+ t << " extensions: [\"tex2jax.js\"],\n";
+ t << " jax: [\"input/TeX\",\"output/HTML-CSS\"],\n";
+ t << "});\n";
+ t << "</script>\n";
+ }
+ t << "<link ";
+ t << "href=\"";
+ QCString cssname=Config_getString("HTML_STYLESHEET");
+ if (cssname.isEmpty())
+ {
+ t << relPathStr << "doxygen.css";
+ }
+ else
+ {
+ if (usePathCmd)
+ {
+ t << relPathStr << cssname;
+ }
+ else
+ {
+ QFileInfo cssfi(cssname);
+ if (!cssfi.exists())
+ {
+ err("error: user specified HTML style sheet file does not exist!\n");
+ }
+ t << relPathStr << cssfi.fileName();
+ }
+ }
+
+ t << "\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ t << "</head>\n";
+ if (searchEngine && /*!generateTreeView &&*/ !serverBasedSearch)
+ {
+ // for the javascript based search select the default filter
+ t << "<body onload='searchBox.OnSelectItem(0);'>\n";
+ }
+ else
+ {
+ if (searchPage) // keep focus on search result's box when loading
+ // search results page
+ {
+ t << "<body onload='searchBox.DOMSearchField().focus()'>\n";
+ }
+ else
+ {
+ t << "<body>\n";
+ }
+ }
+}
+
+
+void HtmlGenerator::writeHeaderFile(QFile &file, const char *cssname)
+{
+ FTextStream t(&file);
+
+ // writeDefaultHeaderFile(t,file.name(),"$title",relativePathToRoot(0),TRUE);
+
+ QString relPathStr = "$relpath$";
+
+ QCString id(file.name());
+ if (id.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
+ {
+ id=id.left(id.length()-Doxygen::htmlFileExtension.length());
+ }
+
+ t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
+ t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"
+ "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n"
+ "<title>$title</title>\n";
+ t << "<link href=\"$relpath$tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ t << "<link href=\"$relpath$" << cssname << "\" rel=\"stylesheet\" type=\"text/css\" />\n";
+ t << "$treeview\n";
+ t << "$search\n";
+ t << "$mathjax\n";
+ t << "</head>\n";
+ t << "<body>\n";
+ t << "<div id=\"top\"><!-- do not remove this div! -->\n";
+
+ t << "<!--BEGIN TITLEAREA-->\n";
+ t << "<div id=\"titlearea\">\n";
+ t << "<table cellspacing=\"0\" cellpadding=\"0\">\n";
+ t << " <tbody>\n";
+ t << " <tr style=\"height: 56px;\">\n";
+ t << " <!--BEGIN PROJECT_LOGO-->\n";
+ t << " <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath$$projectlogo\"></td>\n";
+ t << " <!--END PROJECT_LOGO-->\n";
+ t << " <!--BEGIN PROJECT_NAME-->\n";
+ t << " <td style=\"padding-left: 0.5em;\">\n";
+ t << " <div id=\"projectname\">$projectname\n";
+ t << " <!--BEGIN PROJECT_NUMBER-->&#160;<span id=\"projectnumber\">$projectnumber</span><!--END PROJECT_NUMBER-->\n";
+ t << " </div>\n";
+ t << " <!--BEGIN PROJECT_BRIEF--><div id=\"projectbrief\">$projectbrief</div><!--END PROJECT_BRIEF-->\n";
+ t << " </td>\n";
+ t << " <!--END PROJECT_NAME-->\n";
+ t << " <!--BEGIN !PROJECT_NAME-->\n";
+ t << " <!--BEGIN PROJECT_BRIEF-->\n";
+ t << " <td style=\"padding-left: 0.5em;\">\n";
+ t << " <div id=\"projectbrief\">$projectbrief</div>\n";
+ t << " </td>\n";
+ t << " <!--END PROJECT_BRIEF-->\n";
+ t << " <!--END !PROJECT_NAME-->\n";
+ t << " <!--BEGIN DISABLE_INDEX-->\n";
+ t << " <!--BEGIN SEARCHENGINE-->\n";
+ t << " <td>$searchbox</td>\n";
+ t << " <!--END SEARCHENGINE-->\n";
+ t << " <!--END DISABLE_INDEX-->\n";
+ t << " </tr>\n";
+ t << " </tbody>\n";
+ t << "</table>\n";
+ t << "</div>\n";
+ t << "<!--END TITLEAREA-->\n";
+}
+
+void HtmlGenerator::writeFooterFile(QFile &file)
+{
+ FTextStream t(&file);
+
+ t << "<!--BEGIN GENERATE_TREEVIEW-->\n";
+ t << " <li class=\"footer\">";
+ t << theTranslator->trGeneratedAt( "$datetime", "$projectname" ) << endl;
+ t << " <a href=\"http://www.doxygen.org/index.html\">\n";
+ t << " <img class=\"footer\" src=\"doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n";
+ t << " </ul>\n";
+ t << " </div>\n";
+ t << "<!--END GENERATE_TREEVIEW-->\n";
+ t << "<!--BEGIN !GENERATE_TREEVIEW-->\n";
+ t << "<hr class=\"footer\"/><address class=\"footer\"><small>\n";
+ t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
+ t << "&#160;<a href=\"http://www.doxygen.org/index.html\">"
+ << "<img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/>"
+ << "</a> $doxygenversion";
+ t << "</small></address>\n";
+ t << "<!--END !GENERATE_TREEVIEW-->\n";
+
+ t << "</body>\n"
+ << "</html>\n";
+}
+
+static void generateDynamicSections(FTextStream &t,const QCString &relPath)
+{
+ if (Config_getBool("HTML_DYNAMIC_SECTIONS"))
+ {
+ t <<
+#if 0
+ "<script type=\"text/javascript\">\n"
+ "<!--\n"
+ "function changeDisplayState (e){\n"
+ " var num=this.id.replace(/[^[0-9]/g,'');\n"
+ " var button=this.firstChild;\n"
+ " var sectionDiv=document.getElementById('dynsection'+num);\n"
+ " if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){\n"
+ " sectionDiv.style.display='block';\n"
+ " button.src='" << relPath << "open.png';\n"
+ " }else{\n"
+ " sectionDiv.style.display='none';\n"
+ " button.src='" << relPath << "closed.png';\n"
+ " }\n"
+ "}\n"
+ "function initDynSections(){\n"
+ " var divs=document.getElementsByTagName('div');\n"
+ " var sectionCounter=1;\n"
+ " for(var i=0;i<divs.length-1;i++){\n"
+ " if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){\n"
+ " var header=divs[i];\n"
+ " var section=divs[i+1];\n"
+ " var button=header.firstChild;\n"
+ " if (button!='IMG'){\n"
+ " divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);\n"
+ " button=document.createElement('img');\n"
+ " divs[i].insertBefore(button,divs[i].firstChild);\n"
+ " }\n"
+ " header.style.cursor='pointer';\n"
+ " header.onclick=changeDisplayState;\n"
+ " header.id='dynheader'+sectionCounter;\n"
+ " button.src='" << relPath << "closed.png';\n"
+ " section.id='dynsection'+sectionCounter;\n"
+ " section.style.display='none';\n"
+ " section.style.marginLeft='14px';\n"
+ " sectionCounter++;\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "window.onload = initDynSections;\n"
+ "-->\n"
+ "</script>\n";
+#endif
+ "<script type=\"text/javascript\">\n"
+ "function hasClass(ele,cls) {\n"
+ " return ele.className.match(new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)'));\n"
+ "}\n"
+ "\n"
+ "function addClass(ele,cls) {\n"
+ " if (!this.hasClass(ele,cls)) ele.className += \" \"+cls;\n"
+ "}\n"
+ "\n"
+ "function removeClass(ele,cls) {\n"
+ " if (hasClass(ele,cls)) {\n"
+ " var reg = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n"
+ " ele.className=ele.className.replace(reg,' ');\n"
+ " }\n"
+ "}\n"
+ "\n"
+ "function toggleVisibility(linkObj) {\n"
+ " var base = linkObj.getAttribute('id');\n"
+ " var summary = document.getElementById(base + '-summary');\n"
+ " var content = document.getElementById(base + '-content');\n"
+ " var trigger = document.getElementById(base + '-trigger');\n"
+ " if ( hasClass(linkObj,'closed') ) {\n"
+ " summary.style.display = 'none';\n"
+ " content.style.display = 'block';\n"
+ " trigger.src = '" << relPath << "open.png';\n"
+ " removeClass(linkObj,'closed');\n"
+ " addClass(linkObj,'opened');\n"
+ " } else if ( hasClass(linkObj,'opened') ) {\n"
+ " summary.style.display = 'block';\n"
+ " content.style.display = 'none';\n"
+ " trigger.src = '" << relPath << "closed.png';\n"
+ " removeClass(linkObj,'opened');\n"
+ " addClass(linkObj,'closed');\n"
+ " }\n"
+ " return false;\n"
+ "}\n"
+ "</script>\n";
+ }
+}
+
+
+void HtmlGenerator::startFile(const char *name,const char *,
+ const char *title)
+{
+ //printf("HtmlGenerator::startFile(%s)\n",name);
+ QCString fileName=name;
+ lastTitle=title;
+ relPath = relativePathToRoot(fileName);
+
+ if (fileName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension)
+ {
+ fileName+=Doxygen::htmlFileExtension;
+ }
+ startPlainFile(fileName);
+ Doxygen::indexList.addIndexFile(fileName);
+ //if (Config_getBool("GENERATE_HTMLHELP"))
+ //{
+ // HtmlHelp::getInstance()->addIndexFile(fileName);
+ //}
+
+ QCString dispTitle = title;
+ QCString projName = Config_getString("PROJECT_NAME");
+ if (!projName.isEmpty())
+ {
+ dispTitle.prepend(projName+": ");
+ }
+
+ lastFile = fileName;
+ if (g_header.isEmpty())
+ {
+ writeDefaultHeaderFile(t,name,dispTitle,relPath,FALSE);
+ }
+ else
+ {
+ t << substituteHtmlKeywords(g_header,convertToHtml(dispTitle),relPath);
+ }
+ t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
+ << versionString << " -->" << endl;
+ //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ if (searchEngine /*&& !generateTreeView*/)
+ {
+ t << "<script type=\"text/javascript\"><!--\n";
+ t << "var searchBox = new SearchBox(\"searchBox\", \""
+ << relPath<< "search\",false,'" << theTranslator->trSearch() << "');\n";
+ t << "--></script>\n";
+ }
+ generateDynamicSections(t,relPath);
+ m_sectionCount=0;
+}
+
+void HtmlGenerator::writeSearchFooter(FTextStream &t,const QCString &relPath)
+{
+ (void)relPath;
+ t << "<!-- window showing the filter options -->\n";
+ t << "<div id=\"MSearchSelectWindow\"\n";
+ t << " onmouseover=\"return searchBox.OnSearchSelectShow()\"\n";
+ t << " onmouseout=\"return searchBox.OnSearchSelectHide()\"\n";
+ t << " onkeydown=\"return searchBox.OnSearchSelectKey(event)\">\n";
+ writeSearchCategories(t);
+ t << "</div>\n";
+ t << "\n";
+ t << "<!-- iframe showing the search results (closed by default) -->\n";
+ t << "<div id=\"MSearchResultsWindow\">\n";
+ t << "<iframe src=\"javascript:void(0)\" frameborder=\"0\" \n";
+ t << " name=\"MSearchResults\" id=\"MSearchResults\">\n";
+ t << "</iframe>\n";
+ t << "</div>\n";
+ t << "\n";
+}
+
+
+QCString HtmlGenerator::writeLogoAsString(const char *path)
+{
+ static bool timeStamp = Config_getBool("HTML_TIMESTAMP");
+ QCString result;
+ if (timeStamp)
+ {
+ result += theTranslator->trGeneratedAt(
+ dateToString(TRUE),
+ Config_getString("PROJECT_NAME")
+ );
+ }
+ else
+ {
+ result += theTranslator->trGeneratedBy();
+ }
+ result += "&#160;\n<a href=\"http://www.doxygen.org/index.html\">\n"
+ "<img class=\"footer\" src=\"";
+ result += path;
+ result += "doxygen.png\" alt=\"doxygen\"/></a> ";
+ result += versionString;
+ result += " ";
+ return result;
+}
+
+void HtmlGenerator::writeLogo()
+{
+ t << writeLogoAsString(relPath);
+}
+
+void HtmlGenerator::writePageFooter(FTextStream &t,const QCString &lastTitle,const QCString &relPath)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
+ if (searchEngine /*&& !generateTreeView*/ && !serverBasedSearch)
+ {
+ HtmlGenerator::writeSearchFooter(t,relPath);
+ }
+ if (g_footer.isEmpty())
+ {
+ if (!generateTreeView)
+ {
+ t << "<hr class=\"footer\"/><address class=\"footer\"><small>";
+ t << writeLogoAsString(relPath);
+ t << "</small></address>";
+ if (Debug::isFlagSet(Debug::Validate))
+ {
+ t << "<p><a href=\"http://validator.w3.org/check/referer\">"
+ "<img class=\"footer\" src=\"http://www.w3.org/Icons/valid-html401\""
+ " height=\"31\" width=\"88\" alt=\"This page is Valid HTML 4.01 "
+ "Transitional!\"></a><a href=\"http://jigsaw.w3.org/css-validator/\">"
+ "<img class=\"footer\" style=\"border:0;width:88px;height:31px\" "
+ "src=\"http://jigsaw.w3.org/css-validator/images/vcss\" "
+ "alt=\"This page uses valid CSS!\"/></a></p>";
+ }
+ }
+ t << "\n</body>\n</html>\n";
+ }
+ else
+ {
+ t << substituteHtmlKeywords(g_footer,convertToHtml(lastTitle),relPath);
+ }
+}
+
+void HtmlGenerator::writeFooter()
+{
+ writePageFooter(t,lastTitle,relPath);
+}
+
+void HtmlGenerator::endFile()
+{
+ endPlainFile();
+}
+
+void HtmlGenerator::startProjectNumber()
+{
+ t << "<h3 class=\"version\">";
+}
+
+void HtmlGenerator::endProjectNumber()
+{
+ t << "</h3>";
+}
+
+void HtmlGenerator::writeStyleInfo(int part)
+{
+ //printf("writeStyleInfo(%d)\n",part);
+ if (part==0)
+ {
+ if (Config_getString("HTML_STYLESHEET").isEmpty()) // write default style sheet
+ {
+ //printf("write doxygen.css\n");
+ startPlainFile("doxygen.css");
+
+ // alternative, cooler looking titles
+ //t << "H1 { text-align: center; border-width: thin none thin none;" << endl;
+ //t << " border-style : double; border-color : blue; padding-left : 1em; padding-right : 1em }" << endl;
+
+ t << replaceColorMarkers(defaultStyleSheet);
+ endPlainFile();
+ Doxygen::indexList.addStyleSheetFile("doxygen.css");
+ }
+ else // write user defined style sheet
+ {
+ QCString cssname=Config_getString("HTML_STYLESHEET");
+ QFileInfo cssfi(cssname);
+ if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
+ {
+ err("error: style sheet %s does not exist or is not readable!", Config_getString("HTML_STYLESHEET").data());
+ }
+ else
+ {
+ // convert style sheet to string
+ QCString fileStr = fileToString(cssname);
+ // write the string into the output dir
+ startPlainFile(cssfi.fileName());
+ t << fileStr;
+ endPlainFile();
+ }
+ Doxygen::indexList.addStyleSheetFile(cssfi.fileName());
+ }
+ }
+}
+
+void HtmlGenerator::startDoxyAnchor(const char *,const char *,
+ const char *anchor, const char *name,
+ const char *args)
+{
+ t << "<a class=\"anchor\" id=\"" << anchor << "\"></a>";
+ t << "<!-- doxytag: member=\"";
+ docify(name,TRUE);
+ t << "\" ref=\"";
+ docify(anchor,TRUE);
+ t << "\" args=\"";
+ docify(args,TRUE);
+ t << "\" -->";
+}
+
+void HtmlGenerator::endDoxyAnchor(const char *,const char *)
+{
+}
+
+//void HtmlGenerator::newParagraph()
+//{
+// t << endl << "<p>" << endl;
+//}
+
+void HtmlGenerator::startParagraph()
+{
+ t << endl << "<p>";
+}
+
+void HtmlGenerator::endParagraph()
+{
+ t << "</p>" << endl;
+}
+
+void HtmlGenerator::writeString(const char *text)
+{
+ t << text;
+}
+
+void HtmlGenerator::startIndexListItem()
+{
+ t << "<li>";
+}
+
+void HtmlGenerator::endIndexListItem()
+{
+ t << "</li>" << endl;
+}
+
+void HtmlGenerator::startIndexItem(const char *ref,const char *f)
+{
+ //printf("HtmlGenerator::startIndexItem(%s,%s)\n",ref,f);
+ if (ref || f)
+ {
+ if (ref)
+ {
+ t << "<a class=\"elRef\" ";
+ t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
+ }
+ else
+ {
+ t << "<a class=\"el\" ";
+ }
+ t << "href=\"";
+ t << externalRef(relPath,ref,TRUE);
+ if (f) t << f << Doxygen::htmlFileExtension << "\">";
+ }
+ else
+ {
+ t << "<b>";
+ }
+}
+
+void HtmlGenerator::endIndexItem(const char *ref,const char *f)
+{
+ //printf("HtmlGenerator::endIndexItem(%s,%s,%s)\n",ref,f,name);
+ if (ref || f)
+ {
+ t << "</a>";
+ }
+ else
+ {
+ t << "</b>";
+ }
+}
+
+void HtmlGenerator::writeStartAnnoItem(const char *,const char *f,
+ const char *path,const char *name)
+{
+ t << "<li>";
+ if (path) docify(path);
+ t << "<a class=\"el\" href=\"" << f << Doxygen::htmlFileExtension << "\">";
+ docify(name);
+ t << "</a> ";
+}
+
+void HtmlGenerator::writeObjectLink(const char *ref,const char *f,
+ const char *anchor, const char *name)
+{
+ if (ref)
+ {
+ t << "<a class=\"elRef\" ";
+ t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
+ }
+ else
+ {
+ t << "<a class=\"el\" ";
+ }
+ t << "href=\"";
+ t << externalRef(relPath,ref,TRUE);
+ if (f) t << f << Doxygen::htmlFileExtension;
+ if (anchor) t << "#" << anchor;
+ t << "\">";
+ docify(name);
+ t << "</a>";
+}
+
+void HtmlGenerator::writeCodeLink(const char *ref,const char *f,
+ const char *anchor, const char *name,
+ const char *tooltip)
+{
+ //printf("writeCodeLink(ref=%s,f=%s,anchor=%s,name=%s,tooltip=%s)\n",ref,f,anchor,name,tooltip);
+ if (ref)
+ {
+ t << "<a class=\"codeRef\" ";
+ t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
+ }
+ else
+ {
+ t << "<a class=\"code\" ";
+ }
+ t << "href=\"";
+ t << externalRef(relPath,ref,TRUE);
+ if (f) t << f << Doxygen::htmlFileExtension;
+ if (anchor) t << "#" << anchor;
+ t << "\"";
+ if (tooltip) t << " title=\"" << tooltip << "\"";
+ t << ">";
+ docify(name);
+ t << "</a>";
+ col+=strlen(name);
+}
+
+void HtmlGenerator::startTextLink(const char *f,const char *anchor)
+{
+ t << "<a href=\"";
+ if (f) t << relPath << f << Doxygen::htmlFileExtension;
+ if (anchor) t << "#" << anchor;
+ t << "\">";
+}
+
+void HtmlGenerator::endTextLink()
+{
+ t << "</a>";
+}
+
+void HtmlGenerator::startHtmlLink(const char *url)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ t << "<a ";
+ if (generateTreeView) t << "target=\"top\" ";
+ t << "href=\"";
+ if (url) t << url;
+ t << "\">";
+}
+
+void HtmlGenerator::endHtmlLink()
+{
+ t << "</a>";
+}
+
+void HtmlGenerator::startGroupHeader(int extraIndentLevel)
+{
+ if (extraIndentLevel==2)
+ {
+ t << "<h4>";
+ }
+ else if (extraIndentLevel==1)
+ {
+ t << "<h3>";
+ }
+ else // extraIndentLevel==0
+ {
+ t << "<h2>";
+ }
+}
+
+void HtmlGenerator::endGroupHeader(int extraIndentLevel)
+{
+ if (extraIndentLevel==2)
+ {
+ t << "</h4>" << endl;
+ }
+ else if (extraIndentLevel==1)
+ {
+ t << "</h3>" << endl;
+ }
+ else
+ {
+ t << "</h2>" << endl;
+ }
+}
+
+void HtmlGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type)
+{
+ switch(type)
+ {
+ case SectionInfo::Page: t << "\n\n<h1>"; break;
+ case SectionInfo::Section: t << "\n\n<h2>"; break;
+ case SectionInfo::Subsection: t << "\n\n<h3>"; break;
+ case SectionInfo::Subsubsection: t << "\n\n<h4>"; break;
+ case SectionInfo::Paragraph: t << "\n\n<h5>"; break;
+ default: ASSERT(0); break;
+ }
+ t << "<a class=\"anchor\" id=\"" << lab << "\"></a>";
+}
+
+void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type)
+{
+ switch(type)
+ {
+ case SectionInfo::Page: t << "</h1>"; break;
+ case SectionInfo::Section: t << "</h2>"; break;
+ case SectionInfo::Subsection: t << "</h3>"; break;
+ case SectionInfo::Subsubsection: t << "</h4>"; break;
+ case SectionInfo::Paragraph: t << "</h5>"; break;
+ default: ASSERT(0); break;
+ }
+}
+
+void HtmlGenerator::docify(const char *str)
+{
+ docify(str,FALSE);
+}
+
+void HtmlGenerator::docify(const char *str,bool inHtmlComment)
+{
+ if (str)
+ {
+ const char *p=str;
+ char c;
+ while (*p)
+ {
+ c=*p++;
+ switch(c)
+ {
+ case '<': t << "&lt;"; break;
+ case '>': t << "&gt;"; break;
+ case '&': t << "&amp;"; break;
+ case '"': t << "&quot;"; break;
+ case '-': if (inHtmlComment) t << "&#45;"; else t << "-"; break;
+ case '\\':
+ if (*p=='<')
+ { t << "&lt;"; p++; }
+ else if (*p=='>')
+ { t << "&gt;"; p++; }
+ else
+ t << "\\";
+ break;
+ default: t << c;
+ }
+ }
+ }
+}
+
+void HtmlGenerator::codify(const char *str)
+{
+ //docify(str);
+ //static char spaces[]=" ";
+ if (str)
+ {
+ const char *p=str;
+ char c;
+ int spacesToNextTabStop;
+ while (*p)
+ {
+ c=*p++;
+ switch(c)
+ {
+ case '\t': spacesToNextTabStop =
+ Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
+ t << Doxygen::spaces.left(spacesToNextTabStop);
+ col+=spacesToNextTabStop;
+ break;
+ case '\n': t << "\n"; col=0;
+ break;
+ //case '\n': t << "<br>"; col=0;
+ // break;
+ case '\r': break;
+ case '<': t << "&lt;"; col++;
+ break;
+ case '>': t << "&gt;"; col++;
+ break;
+ case '&': t << "&amp;"; col++;
+ break;
+ case '\'': t << "&#39;"; col++; // &apos; is not valid HTML
+ break;
+ case '"': t << "&quot;"; col++;
+ break;
+ //case ' ': t << "&#160;"; col++;
+ // break;
+ case '\\':
+ if (*p=='<')
+ { t << "&lt;"; p++; }
+ else if (*p=='>')
+ { t << "&gt;"; p++; }
+ else
+ t << "\\";
+ col++;
+ break;
+ default: t << c;
+ col++;
+ break;
+ }
+ }
+ }
+}
+
+void HtmlGenerator::writeChar(char c)
+{
+ char cs[2];
+ cs[0]=c;
+ cs[1]=0;
+ docify(cs);
+}
+
+//--- helper function for dynamic sections -------------------------
+
+static void startSectionHeader(FTextStream &t,
+ const QCString &relPath,int sectionCount)
+{
+ //t << "<!-- startSectionHeader -->";
+ static bool dynamicSections = Config_getBool("HTML_DYNAMIC_SECTIONS");
+ if (dynamicSections)
+ {
+ t << "<div id=\"dynsection-" << sectionCount << "\" "
+ "onclick=\"return toggleVisibility(this)\" "
+ "class=\"dynheader closed\" "
+ "style=\"cursor:pointer;\">" << endl;
+ t << " <img id=\"dynsection-" << sectionCount << "-trigger\" src=\""
+ << relPath << "closed.png\"/> ";
+ }
+ else
+ {
+ t << "<div class=\"dynheader\">" << endl;
+ }
+}
+
+static void endSectionHeader(FTextStream &t)
+{
+ //t << "<!-- endSectionHeader -->";
+ t << "</div>" << endl;
+}
+
+static void startSectionSummary(FTextStream &t,int sectionCount)
+{
+ //t << "<!-- startSectionSummary -->";
+ static bool dynamicSections = Config_getBool("HTML_DYNAMIC_SECTIONS");
+ if (dynamicSections)
+ {
+ t << "<div id=\"dynsection-" << sectionCount << "-summary\" "
+ "class=\"dynsummary\" "
+ "style=\"display:block;\">" << endl;
+ }
+}
+
+static void endSectionSummary(FTextStream &t)
+{
+ //t << "<!-- endSectionSummary -->";
+ static bool dynamicSections = Config_getBool("HTML_DYNAMIC_SECTIONS");
+ if (dynamicSections)
+ {
+ t << "</div>" << endl;
+ }
+}
+
+static void startSectionContent(FTextStream &t,int sectionCount)
+{
+ //t << "<!-- startSectionContent -->";
+ static bool dynamicSections = Config_getBool("HTML_DYNAMIC_SECTIONS");
+ if (dynamicSections)
+ {
+ t << "<div id=\"dynsection-" << sectionCount << "-content\" "
+ "class=\"dyncontent\" "
+ "style=\"display:none;\">" << endl;
+ }
+ else
+ {
+ t << "<div class=\"dyncontent\">" << endl;
+ }
+}
+
+static void endSectionContent(FTextStream &t)
+{
+ //t << "<!-- endSectionContent -->";
+ t << "</div>" << endl;
+}
+
+//----------------------------
+
+void HtmlGenerator::startClassDiagram()
+{
+ startSectionHeader(t,relPath,m_sectionCount);
+}
+
+void HtmlGenerator::endClassDiagram(const ClassDiagram &d,
+ const char *fileName,const char *name)
+{
+ endSectionHeader(t);
+ startSectionSummary(t,m_sectionCount);
+ endSectionSummary(t);
+ startSectionContent(t,m_sectionCount);
+ t << " <div class=\"center\">" << endl;
+ t << " <img src=\"";
+ t << relPath << fileName << ".png\" usemap=\"#";
+ docify(name);
+ t << "_map\" alt=\"\"/>" << endl;
+ t << " <map id=\"";
+ docify(name);
+ t << "_map\" name=\"";
+ docify(name);
+ t << "_map\">" << endl;
+
+ d.writeImage(t,dir,relPath,fileName);
+ t << " </div>";
+ endSectionContent(t);
+ m_sectionCount++;
+}
+
+
+void HtmlGenerator::startMemberList()
+{
+ DBG_HTML(t << "<!-- startMemberList -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ }
+ else
+ {
+ t << "<ul>" << endl;
+ }
+}
+
+void HtmlGenerator::endMemberList()
+{
+ DBG_HTML(t << "<!-- endMemberList -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ }
+ else
+ {
+ t << "</ul>" << endl;
+ }
+}
+
+// anonymous type:
+// 0 = single column right aligned
+// 1 = double column left aligned
+// 2 = single column left aligned
+void HtmlGenerator::startMemberItem(int annoType)
+{
+ DBG_HTML(t << "<!-- startMemberItem() -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ t << "<tr>";
+ switch(annoType)
+ {
+ case 0: t << "<td class=\"memItemLeft\" align=\"right\" valign=\"top\">"; break;
+ case 1: t << "<td class=\"memItemLeft\" >"; break;
+ case 2: t << "<td class=\"memItemLeft\" valign=\"top\">"; break;
+ default: t << "<td class=\"memTemplParams\" colspan=\"2\">"; break;
+ }
+ }
+ else
+ {
+ t << "<li>";
+ }
+}
+
+void HtmlGenerator::endMemberItem()
+{
+ //DBG_HTML(t << "<!-- endMemberItem(" << (int)inGroup << "," << fileName << "," << headerName << " -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ t << "</td></tr>";
+ }
+ t << endl;
+}
+
+void HtmlGenerator::startMemberTemplateParams()
+{
+}
+
+void HtmlGenerator::endMemberTemplateParams()
+{
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ t << "</td></tr>" << endl;
+ t << "<tr><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">";
+ }
+}
+
+
+void HtmlGenerator::insertMemberAlign(bool templ)
+{
+ DBG_HTML(t << "<!-- insertMemberAlign -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ QCString className = templ ? "memTemplItemRight" : "memItemRight";
+ t << "&#160;</td><td class=\"" << className << "\" valign=\"bottom\">";
+ }
+}
+
+void HtmlGenerator::startMemberDescription()
+{
+ DBG_HTML(t << "<!-- startMemberDescription -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ t << "<tr><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">";
+ }
+ else
+ {
+ t << "<dl class=\"el\"><dd class=\"mdescRight\">";
+ }
+}
+
+void HtmlGenerator::endMemberDescription()
+{
+ DBG_HTML(t << "<!-- endMemberDescription -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ t << "<br/></td></tr>" << endl;
+ }
+ else
+ {
+ t << "<br/></dl>";
+ }
+}
+
+void HtmlGenerator::startMemberSections()
+{
+ DBG_HTML(t << "<!-- startMemberSections -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ t << "<table class=\"memberdecls\">" << endl;
+ // HTML is not recursively decomposable, sorry
+ //t << "<tr><td></td></tr>" << endl;
+ }
+}
+
+void HtmlGenerator::endMemberSections()
+{
+ DBG_HTML(t << "<!-- endMemberSections -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ t << "</table>" << endl;
+ }
+}
+
+void HtmlGenerator::startMemberHeader(const char *anchor)
+{
+ DBG_HTML(t << "<!-- startMemberHeader -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ t << "<tr><td colspan=\"2\"><h2>";
+ }
+ else
+ {
+ startGroupHeader(FALSE);
+ }
+ if (anchor)
+ {
+ t << "<a name=\"" << anchor << "\"></a>" << endl;
+ }
+}
+
+void HtmlGenerator::endMemberHeader()
+{
+ DBG_HTML(t << "<!-- endMemberHeader -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS"))
+ {
+ t << "</h2></td></tr>" << endl;
+ }
+ else
+ {
+ endGroupHeader(FALSE);
+ }
+}
+
+void HtmlGenerator::startMemberSubtitle()
+{
+ DBG_HTML(t << "<!-- startMemberSubtitle -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<tr><td class=\"ititle\" colspan=\"2\">";
+}
+
+void HtmlGenerator::endMemberSubtitle()
+{
+ DBG_HTML(t << "<!-- endMemberSubtitle -->" << endl)
+ if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "</td></tr>" << endl;
+}
+
+void HtmlGenerator::startIndexList()
+{
+ t << "<table>" << endl;
+}
+
+void HtmlGenerator::endIndexList()
+{
+ t << "</table>" << endl;
+}
+
+void HtmlGenerator::startIndexKey()
+{
+ // inserted 'class = ...', 02 jan 2002, jh
+ t << " <tr><td class=\"indexkey\">";
+}
+
+void HtmlGenerator::endIndexKey()
+{
+ t << "</td>";
+}
+
+void HtmlGenerator::startIndexValue(bool)
+{
+ // inserted 'class = ...', 02 jan 2002, jh
+ t << "<td class=\"indexvalue\">";
+}
+
+void HtmlGenerator::endIndexValue(const char *,bool)
+{
+ t << "</td></tr>" << endl;
+}
+
+void HtmlGenerator::startMemberDocList()
+{
+ DBG_HTML(t << "<!-- startMemberDocList -->" << endl;)
+}
+
+void HtmlGenerator::endMemberDocList()
+{
+ DBG_HTML(t << "<!-- endMemberDocList -->" << endl;)
+}
+
+void HtmlGenerator::startMemberDoc(const char *,const char *,const char *,const char *,bool)
+{
+ DBG_HTML(t << "<!-- startMemberDoc -->" << endl;)
+
+ t << "\n<div class=\"memitem\">" << endl;
+ t << "<div class=\"memproto\">" << endl;
+}
+
+void HtmlGenerator::startMemberDocPrefixItem()
+{
+ DBG_HTML(t << "<!-- startMemberDocPrefixItem -->" << endl;)
+ t << "<div class=\"memtemplate\">" << endl;
+}
+
+void HtmlGenerator::endMemberDocPrefixItem()
+{
+ DBG_HTML(t << "<!-- endMemberDocPrefixItem -->" << endl;)
+ t << "</div>" << endl;
+}
+
+void HtmlGenerator::startMemberDocName(bool /*align*/)
+{
+ DBG_HTML(t << "<!-- startMemberDocName -->" << endl;)
+
+ t << " <table class=\"memname\">" << endl;
+
+ t << " <tr>" << endl;
+ t << " <td class=\"memname\">";
+}
+
+void HtmlGenerator::endMemberDocName()
+{
+ DBG_HTML(t << "<!-- endMemberDocName -->" << endl;)
+ t << "</td>" << endl;
+}
+
+void HtmlGenerator::startParameterList(bool openBracket)
+{
+ DBG_HTML(t << "<!-- startParameterList -->" << endl;)
+ t << " <td>";
+ if (openBracket) t << "(";
+ t << "</td>" << endl;
+}
+
+void HtmlGenerator::startParameterType(bool first,const char *key)
+{
+ if (first)
+ {
+ DBG_HTML(t << "<!-- startFirstParameterType -->" << endl;)
+ t << " <td class=\"paramtype\">";
+ }
+ else
+ {
+ DBG_HTML(t << "<!-- startParameterType -->" << endl;)
+ t << " <tr>" << endl;
+ t << " <td class=\"paramkey\">";
+ if (key) t << key;
+ t << "</td>" << endl;
+ t << " <td></td>" << endl;
+ t << " <td class=\"paramtype\">";
+ }
+}
+
+void HtmlGenerator::endParameterType()
+{
+ DBG_HTML(t << "<!-- endParameterType -->" << endl;)
+ t << "&#160;</td>" << endl;
+}
+
+void HtmlGenerator::startParameterName(bool /*oneArgOnly*/)
+{
+ DBG_HTML(t << "<!-- startParameterName -->" << endl;)
+ t << " <td class=\"paramname\">";
+}
+
+void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket)
+{
+ DBG_HTML(t << "<!-- endParameterName -->" << endl;)
+ if (last)
+ {
+ if (emptyList)
+ {
+ if (closeBracket) t << "</td><td>)";
+ t << "</td>" << endl;
+ t << " <td>";
+ }
+ else
+ {
+ t << "&#160;</td>" << endl;
+ t << " </tr>" << endl;
+ t << " <tr>" << endl;
+ t << " <td></td>" << endl;
+ t << " <td>";
+ if (closeBracket) t << ")";
+ t << "</td>" << endl;
+ t << " <td></td><td>";
+ }
+ }
+ else
+ {
+ t << "</td>" << endl;
+ t << " </tr>" << endl;
+ }
+}
+
+void HtmlGenerator::endParameterList()
+{
+ DBG_HTML(t << "<!-- endParameterList -->" << endl;)
+ t << "</td>" << endl;
+ t << " </tr>" << endl;
+}
+
+void HtmlGenerator::endMemberDoc(bool hasArgs)
+{
+ DBG_HTML(t << "<!-- endMemberDoc -->" << endl;)
+ if (!hasArgs)
+ {
+ t << " </tr>" << endl;
+ }
+ t << " </table>" << endl;
+ t << "</div>" << endl;
+}
+
+void HtmlGenerator::startDotGraph()
+{
+ startSectionHeader(t,relPath,m_sectionCount);
+}
+
+void HtmlGenerator::endDotGraph(const DotClassGraph &g)
+{
+ endSectionHeader(t);
+ startSectionSummary(t,m_sectionCount);
+ endSectionSummary(t);
+ startSectionContent(t,m_sectionCount);
+
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
+ if (Config_getBool("GENERATE_LEGEND"))
+ {
+ t << "<center><span class=\"legend\">[";
+ startHtmlLink(relPath+"graph_legend"+Doxygen::htmlFileExtension);
+ t << theTranslator->trLegend();
+ endHtmlLink();
+ t << "]</span></center>";
+ }
+
+ endSectionContent(t);
+ m_sectionCount++;
+}
+
+void HtmlGenerator::startInclDepGraph()
+{
+ startSectionHeader(t,relPath,m_sectionCount);
+}
+
+void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g)
+{
+ endSectionHeader(t);
+ startSectionSummary(t,m_sectionCount);
+ endSectionSummary(t);
+ startSectionContent(t,m_sectionCount);
+
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
+
+ endSectionContent(t);
+ m_sectionCount++;
+}
+
+void HtmlGenerator::startGroupCollaboration()
+{
+ startSectionHeader(t,relPath,m_sectionCount);
+}
+
+void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
+{
+ endSectionHeader(t);
+ startSectionSummary(t,m_sectionCount);
+ endSectionSummary(t);
+ startSectionContent(t,m_sectionCount);
+
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
+
+ endSectionContent(t);
+ m_sectionCount++;
+}
+
+void HtmlGenerator::startCallGraph()
+{
+ startSectionHeader(t,relPath,m_sectionCount);
+}
+
+void HtmlGenerator::endCallGraph(const DotCallGraph &g)
+{
+ endSectionHeader(t);
+ startSectionSummary(t,m_sectionCount);
+ endSectionSummary(t);
+ startSectionContent(t,m_sectionCount);
+
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
+
+ endSectionContent(t);
+ m_sectionCount++;
+}
+
+void HtmlGenerator::startDirDepGraph()
+{
+ startSectionHeader(t,relPath,m_sectionCount);
+}
+
+void HtmlGenerator::endDirDepGraph(const DotDirDeps &g)
+{
+ endSectionHeader(t);
+ startSectionSummary(t,m_sectionCount);
+ endSectionSummary(t);
+ startSectionContent(t,m_sectionCount);
+
+ g.writeGraph(t,BITMAP,dir,fileName,relPath);
+
+ endSectionContent(t);
+ m_sectionCount++;
+}
+
+void HtmlGenerator::writeGraphicalHierarchy(const DotGfxHierarchyTable &g)
+{
+ g.writeGraph(t,dir,fileName);
+}
+
+void HtmlGenerator::startMemberGroupHeader(bool)
+{
+ t << "<tr><td colspan=\"2\"><div class=\"groupHeader\">";
+}
+
+void HtmlGenerator::endMemberGroupHeader()
+{
+ t << "</div></td></tr>" << endl;
+}
+
+void HtmlGenerator::startMemberGroupDocs()
+{
+ t << "<tr><td colspan=\"2\"><div class=\"groupText\">";
+}
+
+void HtmlGenerator::endMemberGroupDocs()
+{
+ t << "</div></td></tr>" << endl;
+}
+
+void HtmlGenerator::startMemberGroup()
+{
+}
+
+void HtmlGenerator::endMemberGroup(bool)
+{
+}
+
+void HtmlGenerator::startIndent()
+{
+ DBG_HTML(t << "<!-- startIndent -->" << endl;)
+
+ t << "<div class=\"memdoc\">\n";
+}
+
+void HtmlGenerator::endIndent()
+{
+ DBG_HTML(t << "<!-- endIndent -->" << endl;)
+ t << endl << "</div>" << endl << "</div>" << endl;
+}
+
+void HtmlGenerator::addIndexItem(const char *,const char *)
+{
+}
+
+void HtmlGenerator::writeNonBreakableSpace(int n)
+{
+ int i;
+ for (i=0;i<n;i++)
+ {
+ t << "&#160;";
+ }
+}
+
+void HtmlGenerator::writeLineNumber(const char *ref,const char *filename,
+ const char *anchor,int l)
+{
+ QCString lineNumber,lineAnchor;
+ lineNumber.sprintf("%05d",l);
+ lineAnchor.sprintf("l%05d",l);
+
+ if (filename)
+ {
+ startCodeAnchor(lineAnchor);
+ writeCodeLink(ref,filename,anchor,lineNumber,0);
+ endCodeAnchor();
+ }
+ else
+ {
+ startCodeAnchor(lineAnchor);
+ codify(lineNumber);
+ endCodeAnchor();
+ }
+ codify(" ");
+}
+
+void HtmlGenerator::startSimpleSect(SectionTypes,
+ const char *filename,const char *anchor,
+ const char *title)
+{
+ t << "<dl><dt><b>";
+ if (filename)
+ {
+ writeObjectLink(0,filename,anchor,title);
+ }
+ else
+ {
+ docify(title);
+ }
+ t << "</b></dt>";
+}
+
+void HtmlGenerator::endSimpleSect()
+{
+ t << "</dl>";
+}
+
+void HtmlGenerator::startParamList(ParamListTypes,
+ const char *title)
+{
+ t << "<dl><dt><b>";
+ docify(title);
+ t << "</b></dt>";
+}
+
+void HtmlGenerator::endParamList()
+{
+ t << "</dl>";
+}
+
+void HtmlGenerator::printDoc(DocNode *n,const char *langExt)
+{
+ HtmlDocVisitor *visitor = new HtmlDocVisitor(t,*this,langExt);
+ n->accept(visitor);
+ delete visitor;
+}
+
+//---------------- helpers for index generation -----------------------------
+
+static void startQuickIndexList(FTextStream &t,bool compact,bool topLevel=TRUE)
+{
+ if (compact)
+ {
+ if (topLevel)
+ {
+ t << " <div id=\"navrow1\" class=\"tabs\">\n";
+ }
+ else
+ {
+ t << " <div id=\"navrow2\" class=\"tabs2\">\n";
+ }
+ t << " <ul class=\"tablist\">\n";
+ }
+ else
+ {
+ t << "<ul>";
+ }
+}
+
+static void endQuickIndexList(FTextStream &t,bool compact)
+{
+ if (compact)
+ {
+ t << " </ul>\n";
+ t << " </div>\n";
+ }
+ else
+ {
+ t << "</ul>\n";
+ }
+}
+
+static void startQuickIndexItem(FTextStream &t,const char *l,
+ bool hl,bool /*compact*/,
+ const QCString &relPath)
+{
+ //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ t << " <li";
+ if (hl)
+ {
+ t << " class=\"current\"";
+ //if (generateTreeView)
+ //{
+ // t << " onmouseover=\"return navShow('" << l << "')\"";
+ //}
+ }
+ t << "><a ";
+ t << "href=\"" << relPath << l << "\">";
+ t << "<span>";
+}
+
+static void endQuickIndexItem(FTextStream &t)
+{
+ t << "</span>";
+ t << "</a>";
+ t << "</li>\n";
+}
+
+static QCString fixSpaces(const QCString &s)
+{
+ return substitute(s," ","&#160;");
+}
+
+static bool quickLinkVisible(LayoutNavEntry::Kind kind)
+{
+ switch (kind)
+ {
+ case LayoutNavEntry::MainPage: return TRUE;
+ case LayoutNavEntry::Pages: return indexedPages>0;
+ case LayoutNavEntry::Modules: return documentedGroups>0;
+ case LayoutNavEntry::Namespaces: return documentedNamespaces>0;
+ case LayoutNavEntry::NamespaceMembers: return documentedNamespaceMembers[NMHL_All]>0;
+ case LayoutNavEntry::Classes: return annotatedClasses>0;
+ case LayoutNavEntry::ClassAnnotated: return annotatedClasses>0;
+ case LayoutNavEntry::ClassHierarchy: return hierarchyClasses>0;
+ case LayoutNavEntry::ClassMembers: return documentedClassMembers[CMHL_All]>0;
+ case LayoutNavEntry::Files: return documentedHtmlFiles>0;
+ case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0;
+ case LayoutNavEntry::Dirs: return documentedDirs>0;
+ case LayoutNavEntry::Examples: return Doxygen::exampleSDict->count()>0;
+ }
+ return FALSE;
+}
+
+static void renderQuickLinksAsTree(FTextStream &t,const QCString &relPath,LayoutNavEntry *root)
+
+{
+ QListIterator<LayoutNavEntry> li(root->children());
+ LayoutNavEntry *entry;
+ int count=0;
+ for (li.toFirst();(entry=li.current());++li)
+ {
+ if (entry->visible() && quickLinkVisible(entry->kind())) count++;
+ }
+ if (count>0) // at least one item is visible
+ {
+ startQuickIndexList(t,FALSE);
+ for (li.toFirst();(entry=li.current());++li)
+ {
+ if (entry->visible() && quickLinkVisible(entry->kind()))
+ {
+ startQuickIndexItem(t,entry->baseFile()+Doxygen::htmlFileExtension,
+ FALSE,FALSE,relPath);
+ t << fixSpaces(entry->title());
+ // recursive into child list
+ renderQuickLinksAsTree(t,relPath,entry);
+ endQuickIndexItem(t);
+ }
+ }
+ endQuickIndexList(t,FALSE);
+ }
+}
+
+
+static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath,
+ LayoutNavEntry *hlEntry,LayoutNavEntry::Kind kind,
+ bool highlightParent,bool highlightSearch)
+{
+ //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ if (hlEntry->parent()) // first draw the tabs for the parent of hlEntry
+ {
+ renderQuickLinksAsTabs(t,relPath,hlEntry->parent(),kind,highlightParent,highlightSearch);
+ }
+ if (hlEntry->parent() && hlEntry->parent()->children().count()>0) // draw tabs for row containing hlEntry
+ {
+ bool topLevel = hlEntry->parent()->parent()==0;
+ QListIterator<LayoutNavEntry> li(hlEntry->parent()->children());
+ LayoutNavEntry *entry;
+
+ int count=0;
+ for (li.toFirst();(entry=li.current());++li)
+ {
+ if (entry->visible() && quickLinkVisible(entry->kind())) count++;
+ }
+ if (count>0) // at least one item is visible
+ {
+ startQuickIndexList(t,TRUE,topLevel);
+ for (li.toFirst();(entry=li.current());++li)
+ {
+ if (entry->visible() && quickLinkVisible(entry->kind()))
+ {
+ startQuickIndexItem(t,entry->baseFile()+Doxygen::htmlFileExtension,
+ entry==hlEntry &&
+ (entry->children().count()>0 ||
+ (entry->kind()==kind && !highlightParent)
+ ),
+ TRUE,relPath);
+ t << fixSpaces(entry->title());
+ endQuickIndexItem(t);
+ }
+ }
+ if (hlEntry->parent()==LayoutDocManager::instance().rootNavEntry())
+ {
+ //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
+ if (searchEngine /* && !generateTreeView */)
+ {
+ if (!serverBasedSearch) // pure client side search
+ {
+ t << " <li id=\"searchli\">\n";
+ writeClientSearchBox(t,relPath);
+ t << " </li>\n";
+ }
+ else // if (!generateTreeView) // server based search
+ {
+ t << " <li id=\"searchli\">\n";
+ writeServerSearchBox(t,relPath,highlightSearch);
+ if (!highlightSearch)
+ {
+ t << " </li>\n";
+ }
+ }
+ }
+ if (!highlightSearch) // on the search page the page will be ended by the
+ // page itself
+ {
+ endQuickIndexList(t,TRUE);
+ }
+ }
+ else // normal case
+ {
+ endQuickIndexList(t,TRUE);
+ }
+ }
+#if 0
+ if (generateTreeView)
+ {
+ // add empty rows for the dynamic menus (max 4 levels)
+ t << " <div id=\"navrow2\" class=\"tabs2\">\n";
+ t << " </div>\n";
+ t << " <div id=\"navrow3\" class=\"tabs3\">\n";
+ t << " </div>\n";
+ t << " <div id=\"navrow4\" class=\"tabs3\">\n";
+ t << " </div>\n";
+ }
+#endif
+ }
+}
+
+static void writeDefaultQuickLinks(FTextStream &t,bool compact,
+ HighlightedItem hli,const QCString &relPath)
+{
+ LayoutNavEntry *root = LayoutDocManager::instance().rootNavEntry();
+ LayoutNavEntry::Kind kind = (LayoutNavEntry::Kind)-1;
+ bool highlightParent=FALSE;
+ switch (hli) // map HLI enums to LayoutNavEntry::Kind enums
+ {
+ case HLI_Main: kind = LayoutNavEntry::MainPage; break;
+ case HLI_Modules: kind = LayoutNavEntry::Modules; break;
+ case HLI_Directories: kind = LayoutNavEntry::Dirs; break;
+ case HLI_Namespaces: kind = LayoutNavEntry::Namespaces; break;
+ case HLI_Hierarchy: kind = LayoutNavEntry::ClassHierarchy; break;
+ case HLI_Classes: kind = LayoutNavEntry::Classes; break;
+ case HLI_Annotated: kind = LayoutNavEntry::ClassAnnotated; break;
+ case HLI_Files: kind = LayoutNavEntry::Files; break;
+ case HLI_NamespaceMembers: kind = LayoutNavEntry::NamespaceMembers; break;
+ case HLI_Functions: kind = LayoutNavEntry::ClassMembers; break;
+ case HLI_Globals: kind = LayoutNavEntry::FileGlobals; break;
+ case HLI_Pages: kind = LayoutNavEntry::Pages; break;
+ case HLI_Examples: kind = LayoutNavEntry::Examples; break;
+ case HLI_ClassVisible: kind = LayoutNavEntry::Classes; highlightParent = TRUE; break;
+ case HLI_NamespaceVisible: kind = LayoutNavEntry::Namespaces; highlightParent = TRUE; break;
+ case HLI_FileVisible: kind = LayoutNavEntry::Files; highlightParent = TRUE; break;
+ case HLI_None: break;
+ case HLI_Search: break;
+ }
+
+ if (compact)
+ {
+ // find highlighted index item
+ LayoutNavEntry *hlEntry = root->find(kind);
+ if (!hlEntry) // highlighted item not found in the index! -> just show the level 1 index...
+ {
+ highlightParent=TRUE;
+ hlEntry = root->children().getFirst();
+ if (hlEntry==0)
+ {
+ return; // argl, empty index!
+ }
+ }
+ renderQuickLinksAsTabs(t,relPath,hlEntry,kind,highlightParent,hli==HLI_Search);
+ }
+ else
+ {
+ renderQuickLinksAsTree(t,relPath,root);
+ }
+}
+
+void HtmlGenerator::startQuickIndices()
+{
+ static bool customHeader = !Config_getString("HTML_HEADER").isEmpty();
+ static QCString projectName = Config_getString("PROJECT_NAME");
+ static QCString projectBrief = Config_getString("PROJECT_BRIEF");
+ static QCString projectNumber = Config_getString("PROJECT_NUMBER");
+ static QCString projectLogo = Config_getString("PROJECT_LOGO");
+
+ if (!customHeader)
+ {
+ t << "<div id=\"top\"";
+ //if (generateTreeView)
+ //{
+ // t << " onmouseout=\"return navLeave()\" onmouseover=\"navEnter()\"";
+ //}
+ t << ">" << endl;
+ writeTitleArea(t,relPath,projectName,projectBrief,projectNumber,projectLogo);
+ }
+}
+
+void HtmlGenerator::endQuickIndices()
+{
+ t << "</div>" << endl;
+}
+
+QCString HtmlGenerator::writeSplitBarAsString(const char *name,const char *relpath)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ QCString result;
+ // write split bar
+ if (generateTreeView)
+ {
+ result = QCString(
+ "<div id=\"side-nav\" class=\"ui-resizable side-nav-resizable\">\n"
+ " <div id=\"nav-tree\">\n"
+ " <div id=\"nav-tree-contents\">\n"
+ " </div>\n"
+ " </div>\n"
+ " <div id=\"splitbar\" style=\"-moz-user-select:none;\" \n"
+ " class=\"ui-resizable-handle\">\n"
+ " </div>\n"
+ "</div>\n"
+ "<script type=\"text/javascript\">\n"
+ " initNavTree('") +
+ QCString(name) + Doxygen::htmlFileExtension +
+ QCString("','") + relpath +
+ QCString("');\n"
+ "</script>\n"
+ "<div id=\"doc-content\">\n");
+ }
+ return result;
+}
+
+void HtmlGenerator::writeSplitBar(const char *name)
+{
+ t << writeSplitBarAsString(name,relPath);
+}
+
+void HtmlGenerator::startContents()
+{
+ t << "<div class=\"contents\">" << endl;
+}
+
+void HtmlGenerator::endContents()
+{
+ t << "</div>" << endl;
+}
+
+void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli)
+{
+ writeDefaultQuickLinks(t,compact,hli,relPath);
+}
+
+// PHP based search script
+void HtmlGenerator::writeSearchPage()
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static QCString projectName = Config_getString("PROJECT_NAME");
+ static QCString projectBrief = Config_getString("PROJECT_BRIEF");
+ static QCString projectNumber = Config_getString("PROJECT_NUMBER");
+ static QCString projectLogo = Config_getString("PROJECT_LOGO");
+ QCString fileName = Config_getString("HTML_OUTPUT")+"/search.php";
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ if (g_header.isEmpty())
+ {
+ writeDefaultHeaderFile(t,"search",theTranslator->trSearch().data(),0,FALSE,TRUE);
+ }
+ else
+ {
+ t << substituteHtmlKeywords(g_header,"Search","");
+ }
+
+ t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
+ << versionString << " -->" << endl;
+ //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ if (searchEngine /* && !generateTreeView*/)
+ {
+ t << "<script type=\"text/javascript\"><!--\n";
+ t << "var searchBox = new SearchBox(\"searchBox\", \""
+ << "search\",false,'" << theTranslator->trSearch() << "');\n";
+ t << "--></script>\n";
+ }
+ t << "<div id=\"top\">" << endl;
+ writeTitleArea(t,"",projectName,projectBrief,projectNumber,projectLogo);
+ if (!Config_getBool("DISABLE_INDEX"))
+ {
+ writeDefaultQuickLinks(t,TRUE,HLI_Search,"");
+ }
+ else
+ {
+ //t << "&#160;\n<div class=\"qindex\">\n";
+ //t << " <form class=\"search\" action=\"search.php\" "
+ // << "method=\"get\">\n";
+ t << "</div>" << endl;
+ }
+
+ t << "\n<script language=\"php\">\n\n";
+ t << "function search_results()\n";
+ t << "{\n";
+ t << " return \"" << theTranslator->trSearchResultsTitle() << "\";\n";
+ t << "}\n";
+ t << "\n";
+ t << "function matches_text($num)\n";
+ t << "{\n";
+ t << " if ($num==0)\n";
+ t << " {\n";
+ t << " return \"" << theTranslator->trSearchResults(0) << "\";\n";
+ t << " }\n";
+ t << " else if ($num==1)\n";
+ t << " {\n";
+ t << " return \"" << theTranslator->trSearchResults(1) << "\";\n";
+ t << " }\n";
+ t << " else // $num>1\n";
+ t << " {\n";
+ t << " return \"" << theTranslator->trSearchResults(2) << "\";\n";
+ t << " }\n";
+ t << "}\n";
+ t << "\n";
+ t << "function report_matches()\n";
+ t << "{\n";
+ t << " return \"" << theTranslator->trSearchMatches() << " \";\n";
+ t << "}\n";
+ t << "function end_form($value)\n";
+ t << "{\n";
+ t << " echo \"";
+ if (!Config_getBool("DISABLE_INDEX"))
+ {
+ t << " <input type=\\\"text\\\" id=\\\"MSearchField\\\" name=\\\"query\\\" value=\\\"$value\\\" size=\\\"20\\\" accesskey=\\\"S\\\" "
+ << "onfocus=\\\"searchBox.OnSearchFieldFocus(true)\\\" "
+ << "onblur=\\\"searchBox.OnSearchFieldFocus(false)\\\"/>\\n"
+ << " </form>\\n"
+ << " </span><span class=\\\"right\\\"></span>\\n"
+ << " </div>\\n"
+ << " </li>\\n"
+ << " </ul>\\n"
+ << " </div>\\n";
+ t << "</div>\\n";
+ }
+ if (generateTreeView)
+ {
+ t << substitute(substitute(writeSplitBarAsString("",""),
+ "\"","\\\""),
+ "\n","\\n");
+ }
+ t << "\";\n";
+ t << "}\n";
+ t << "function end_page()\n";
+ t << "{\n";
+ t << " echo \"";
+ if (generateTreeView)
+ {
+ t << "</div>\\n";
+ t << "<div id=\\\"nav-path\\\" class=\\\"navpath\\\">\\n";
+ t << " <ul>\\n";
+ t << " <li class=\\\"footer\\\">";
+ t << substitute(substitute(writeLogoAsString(""),
+ "\"","\\\""),
+ "\n","\\n");
+ t << "</li>\\n";
+ t << " </ul>\\n";
+ t << "</div>\\n";
+ }
+ t << "</body></html>\";\n";
+ t << "}\n";
+ t << "\n";
+ t << search_script;
+ t << "\n";
+ t << "</script>\n";
+ writePageFooter(t,"Search","");
+ }
+ QCString scriptName = Config_getString("HTML_OUTPUT")+"/search/search.js";
+ QFile sf(scriptName);
+ if (sf.open(IO_WriteOnly))
+ {
+ FTextStream t(&sf);
+ t << "function SearchBox(name, resultsPath, inFrame, label)\n";
+ t << "{\n";
+ t << " this.searchLabel = label;\n";
+ t << " this.DOMSearchField = function()\n";
+ t << " { return document.getElementById(\"MSearchField\"); }\n";
+ t << " this.DOMSearchBox = function()\n";
+ t << " { return document.getElementById(\"MSearchBox\"); }\n";
+ t << " this.OnSearchFieldFocus = function(isActive)\n";
+ t << " {\n";
+ t << " if (isActive)\n";
+ t << " {\n";
+ t << " this.DOMSearchBox().className = 'MSearchBoxActive';\n";
+ t << " var searchField = this.DOMSearchField();\n";
+ t << " if (searchField.value == this.searchLabel) \n";
+ t << " {\n";
+ t << " searchField.value = '';\n";
+ t << " }\n";
+ t << " }\n";
+ t << " else\n";
+ t << " {\n";
+ t << " this.DOMSearchBox().className = 'MSearchBoxInactive';\n";
+ t << " this.DOMSearchField().value = this.searchLabel;\n";
+ t << " }\n";
+ t << " }\n";
+ t << "}\n";
+ }
+ else
+ {
+ err("Failed to open file '%s' for writing...\n",scriptName.data());
+ }
+
+}
+
+#if 0
+void HtmlGenerator::generateSectionImages()
+{
+ {
+ QCString fileName = Config_getString("HTML_OUTPUT")+"/open.png";
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ {
+ f.writeBlock((char*)open_gif,open_gif_len);
+ }
+ Doxygen::indexList.addImageFile("open.png");
+ }
+ {
+ QCString fileName = Config_getString("HTML_OUTPUT")+"/closed.png";
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ {
+ f.writeBlock((char*)closed_gif,closed_gif_len);
+ }
+ Doxygen::indexList.addImageFile("closed.png");
+ }
+}
+#endif
+
+void HtmlGenerator::startConstraintList(const char *header)
+{
+ t << "<div class=\"typeconstraint\">" << endl;
+ t << "<dl><dt><b>" << header << "</b><dt><dd>" << endl;
+ t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl;
+}
+
+void HtmlGenerator::startConstraintParam()
+{
+ t << "<tr><td valign=\"top\"><em>";
+}
+
+void HtmlGenerator::endConstraintParam()
+{
+ t << "</em></td>";
+}
+
+void HtmlGenerator::startConstraintType()
+{
+ t << "<td>&#160;:</td><td valign=\"top\"><em>";
+}
+
+void HtmlGenerator::endConstraintType()
+{
+ t << "</em></td>";
+}
+
+void HtmlGenerator::startConstraintDocs()
+{
+ t << "<td>&#160;";
+}
+
+void HtmlGenerator::endConstraintDocs()
+{
+ t << "</td></tr>" << endl;
+}
+
+void HtmlGenerator::endConstraintList()
+{
+ t << "</table>" << endl;
+ t << "</dl>" << endl;
+ t << "</div>" << endl;
+}
+
+void HtmlGenerator::lineBreak(const char *style)
+{
+ if (style)
+ {
+ t << "<br class=\"" << style << "\"/>" << endl;
+ }
+ else
+ {
+ t << "<br/>" << endl;
+ }
+}
+
+void HtmlGenerator::startHeaderSection()
+{
+ t << "<div class=\"header\">" << endl;
+}
+
+void HtmlGenerator::startTitleHead(const char *)
+{
+ t << " <div class=\"headertitle\">" << endl;
+ startTitle();
+}
+
+void HtmlGenerator::endTitleHead(const char *,const char *)
+{
+ endTitle();
+ t << " </div>" << endl;
+}
+
+void HtmlGenerator::endHeaderSection()
+{
+ t << "</div>" << endl;
+}
+
+void HtmlGenerator::startInlineDescription()
+{
+ t << "<tr><td colspan=\"2\">";
+}
+
+void HtmlGenerator::endInlineDescription()
+{
+ t << "</td></tr>" << endl;
+}
+
+void HtmlGenerator::startInlineHeader()
+{
+ t << "<tr><td colspan=\"2\"><h3>";
+}
+
+void HtmlGenerator::endInlineHeader()
+{
+ t << "</h3></td></tr>" << endl;
+}
+
+
diff --git a/src/htmlgen.h b/src/htmlgen.h
new file mode 100644
index 0000000..49e07e5
--- /dev/null
+++ b/src/htmlgen.h
@@ -0,0 +1,281 @@
+/******************************************************************************
+ *
+ * $Id: htmlgen.h,v 1.51 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef HTMLGEN_H
+#define HTMLGEN_H
+
+#include "qtbc.h"
+#include "outputgen.h"
+
+#define PREFRAG_START "<div class=\"fragment\"><pre class=\"fragment\">"
+#define PREFRAG_END "</pre></div>"
+
+class QFile;
+class FTextStream;
+
+class HtmlGenerator : public OutputGenerator
+{
+ public:
+ HtmlGenerator();
+ virtual ~HtmlGenerator();
+ static void init();
+ static void writeStyleSheetFile(QFile &f);
+ static void writeHeaderFile(QFile &f, const char *cssname);
+ static void writeFooterFile(QFile &f);
+ static void writeTabData();
+ static void writeSearchFooter(FTextStream &t,const QCString &relPath);
+ static void writeSearchData(const char *dir);
+ static void writeSearchPage();
+ static QCString writeLogoAsString(const char *path);
+ static QCString writeSplitBarAsString(const char *name,const char *relpath);
+
+ void enable()
+ { if (genStack->top()) active=*genStack->top(); else active=TRUE; }
+ void disable() { active=FALSE; }
+ void enableIf(OutputType o) { if (o==Html) active=TRUE; }
+ void disableIf(OutputType o) { if (o==Html) active=FALSE; }
+ void disableIfNot(OutputType o) { if (o!=Html) active=FALSE; }
+ bool isEnabled(OutputType o) { return (o==Html && active); }
+ OutputGenerator *get(OutputType o) { return (o==Html) ? this : 0; }
+
+ void printDoc(DocNode *,const char *);
+
+ void startFile(const char *name,const char *manName,const char *title);
+ void writeFooter();
+ void endFile();
+ void clearBuffer();
+
+ void startIndexSection(IndexSections) {}
+ void endIndexSection(IndexSections) {}
+ void writePageLink(const char *,bool) {}
+ void startProjectNumber();
+ void endProjectNumber();
+ void writeStyleInfo(int part);
+ void startTitleHead(const char *);
+ void endTitleHead(const char *,const char *);
+ void startTitle() { t << "<div class=\"title\">"; }
+ void endTitle() { t << "</div>"; }
+
+ void startParagraph();
+ void endParagraph();
+ void writeString(const char *text);
+ void startIndexListItem();
+ void endIndexListItem();
+ void startIndexList();
+ void endIndexList();
+ void startIndexKey();
+ void endIndexKey();
+ void startIndexValue(bool);
+ void endIndexValue(const char *,bool);
+ void startItemList() { t << "<ul>" << endl; }
+ void endItemList() { t << "</ul>" << endl; }
+ void startIndexItem(const char *ref,const char *file);
+ void endIndexItem(const char *ref,const char *file);
+ void docify(const char *text);
+ void codify(const char *text);
+ void writeObjectLink(const char *ref,const char *file,
+ const char *anchor,const char *name);
+ void writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip);
+ void startTextLink(const char *file,const char *anchor);
+ void endTextLink();
+ void startHtmlLink(const char *url);
+ void endHtmlLink();
+ void startTypewriter() { t << "<code>"; }
+ void endTypewriter() { t << "</code>"; }
+ void startGroupHeader(int);
+ void endGroupHeader(int);
+ void startItemListItem() { t << "<li>"; }
+ void endItemListItem() { t << "</li>\n"; }
+
+ void startMemberSections();
+ void endMemberSections();
+ void startHeaderSection();
+ void endHeaderSection();
+ void startMemberHeader(const char *);
+ void endMemberHeader();
+ void startMemberSubtitle();
+ void endMemberSubtitle();
+ void startMemberDocList();
+ void endMemberDocList();
+ void startMemberList();
+ void endMemberList();
+ void startInlineDescription();
+ void endInlineDescription();
+ void startInlineHeader();
+ void endInlineHeader();
+ void startAnonTypeScope(int) {}
+ void endAnonTypeScope(int) {}
+ void startMemberItem(int);
+ void endMemberItem();
+ void startMemberTemplateParams();
+ void endMemberTemplateParams();
+
+ void startMemberGroupHeader(bool);
+ void endMemberGroupHeader();
+ void startMemberGroupDocs();
+ void endMemberGroupDocs();
+ void startMemberGroup();
+ void endMemberGroup(bool);
+
+ void insertMemberAlign(bool);
+ void startMemberDescription();
+ void endMemberDescription();
+
+ void writeRuler() { t << "<hr/>"; }
+ void writeAnchor(const char *,const char *name)
+ { t << "<a name=\"" << name <<"\" id=\"" << name << "\"></a>"; }
+ void startCodeFragment() { t << PREFRAG_START; }
+ void endCodeFragment() { t << PREFRAG_END; }
+ void writeLineNumber(const char *,const char *,const char *,int);
+ void startCodeLine() { col=0; }
+ void endCodeLine() { codify("\n"); }
+ void startEmphasis() { t << "<em>"; }
+ void endEmphasis() { t << "</em>"; }
+ void startBold() { t << "<b>"; }
+ void endBold() { t << "</b>"; }
+ void startDescription() { t << endl << "<dl>" << endl; }
+ void endDescription() { t << endl << "</dl>\n" << endl; }
+ void startDescItem() { t << "<dt>"; }
+ void endDescItem() { t << "</dt>"; }
+ void startDescForItem() { t << "<dd>"; }
+ void endDescForItem() { t << "</dd>\n"; }
+ void lineBreak(const char *style);
+ void writeChar(char c);
+ void startMemberDoc(const char *,const char *,const char *,const char *,bool);
+ void endMemberDoc(bool);
+ void startDoxyAnchor(const char *fName,const char *manName,
+ const char *anchor,const char *name,
+ const char *args);
+ void endDoxyAnchor(const char *fName,const char *anchor);
+ void startCodeAnchor(const char *label) { t << "<a name=\"" << label << "\"></a>"; }
+ void endCodeAnchor() { }
+ void writeLatexSpacing() {}
+ void writeStartAnnoItem(const char *type,const char *file,
+ const char *path,const char *name);
+ void writeEndAnnoItem(const char *) { t << endl; }
+ void startSubsection() { t << "<h2>"; }
+ void endSubsection() { t << "</h2>" << endl; }
+ void startSubsubsection() { t << "<h3>"; }
+ void endSubsubsection() { t << "</h3>" << endl; }
+ void startCenter() { t << "<center>" << endl; }
+ void endCenter() { t << "</center>" << endl; }
+ void startSmall() { t << "<small>" << endl; }
+ void endSmall() { t << "</small>" << endl; }
+ //void startDescList(SectionTypes) { t << "<dl compact><dt><b>" << endl; }
+ //void endDescList() { t << "</dl>"; }
+ void startSimpleSect(SectionTypes,const char *,const char *,const char *);
+ void endSimpleSect();
+ void startParamList(ParamListTypes,const char *);
+ void endParamList();
+ //void writeDescItem() { t << "<dd>" << endl; }
+ void startSection(const char *,const char *,SectionInfo::SectionType);
+ void endSection(const char *,SectionInfo::SectionType);
+ void addIndexItem(const char *,const char *);
+ void startIndent();
+ void endIndent();
+ void writeSynopsis() {}
+ void startClassDiagram();
+ void endClassDiagram(const ClassDiagram &,const char *,const char *);
+ void startPageRef() {}
+ void endPageRef(const char *,const char *) {}
+ void startQuickIndices();
+ void endQuickIndices();
+ void writeSplitBar(const char *name);
+ void writeLogo();
+ void writeQuickLinks(bool compact,HighlightedItem hli);
+ void startContents();
+ void endContents();
+ void writeNonBreakableSpace(int);
+
+ void startDescTable()
+ { t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; }
+ void endDescTable()
+ { t << "</table>" << endl; }
+ void startDescTableTitle()
+ { t << "<tr><td valign=\"top\"><em>"; }
+ void endDescTableTitle()
+ { t << "</em>&nbsp;</td>"; }
+ void startDescTableData()
+ { t << "<td>" << endl; }
+ void endDescTableData()
+ { t << "</td></tr>" << endl; }
+
+ void startDotGraph();
+ void endDotGraph(const DotClassGraph &g);
+ void startInclDepGraph();
+ void endInclDepGraph(const DotInclDepGraph &g);
+ void startGroupCollaboration();
+ void endGroupCollaboration(const DotGroupCollaboration &g);
+ void startCallGraph();
+ void endCallGraph(const DotCallGraph &g);
+ void startDirDepGraph();
+ void endDirDepGraph(const DotDirDeps &g);
+ void writeGraphicalHierarchy(const DotGfxHierarchyTable &g);
+
+ void startTextBlock(bool)
+ { t << "<div class=\"textblock\">"; }
+ void endTextBlock(bool)
+ { t << "</div>"; }
+ void lastIndexPage() {}
+
+ void startMemberDocPrefixItem();
+ void endMemberDocPrefixItem();
+ void startMemberDocName(bool);
+ void endMemberDocName();
+ void startParameterType(bool first,const char *key);
+ void endParameterType();
+ void startParameterName(bool);
+ void endParameterName(bool last,bool emptyList,bool closeBracket);
+ void startParameterList(bool);
+ void endParameterList();
+
+ void startConstraintList(const char *);
+ void startConstraintParam();
+ void endConstraintParam();
+ void startConstraintType();
+ void endConstraintType();
+ void startConstraintDocs();
+ void endConstraintDocs();
+ void endConstraintList();
+
+ void startFontClass(const char *s) { t << "<span class=\"" << s << "\">"; }
+ void endFontClass() { t << "</span>"; }
+
+
+ void writeCodeAnchor(const char *anchor)
+ { t << "<a name=\"" << anchor << "\"></a>"; }
+ void linkableSymbol(int,const char *,Definition *,Definition *) {}
+
+ //static void generateSectionImages();
+
+ private:
+ static void writePageFooter(FTextStream &t,const QCString &,const QCString &);
+ QCString lastTitle;
+ QCString lastFile;
+ QCString relPath;
+ void docify(const char *text,bool inHtmlComment);
+
+ HtmlGenerator &operator=(const HtmlGenerator &g);
+ HtmlGenerator(const HtmlGenerator &g);
+
+ int col;
+ int m_sectionCount;
+};
+
+#endif
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
new file mode 100644
index 0000000..4d16c14
--- /dev/null
+++ b/src/htmlhelp.cpp
@@ -0,0 +1,704 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * The code is this file is largely based on a contribution from
+ * Harm van der Heijden <H.v.d.Heijden@phys.tue.nl>
+ * Please send thanks to him and bug reports to me :-)
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <qlist.h>
+#include <qdict.h>
+#include <qregexp.h>
+#include "qtextcodec.h"
+#include "sortdict.h"
+
+#include "htmlhelp.h"
+#include "config.h"
+#include "message.h"
+#include "doxygen.h"
+#include "language.h"
+#include "portable.h"
+
+//----------------------------------------------------------------------------
+
+struct IndexField
+{
+ QCString name;
+ QCString url;
+ QCString anchor;
+ bool link;
+ bool reversed;
+};
+
+class IndexFieldSDict : public SDict<IndexField>
+{
+ public:
+ IndexFieldSDict() : SDict<IndexField>(17) {}
+ ~IndexFieldSDict() {}
+ int compareItems(GCI item1, GCI item2)
+ {
+ return stricmp(((IndexField *)item1)->name,((IndexField *)item2)->name);
+ }
+};
+
+/*! A helper class for HtmlHelp that manages a two level index in
+ * alphabetical order
+ */
+class HtmlHelpIndex
+{
+ public:
+ HtmlHelpIndex();
+ ~HtmlHelpIndex();
+ void addItem(const char *first,const char *second,
+ const char *url, const char *anchor,
+ bool hasLink,bool reversed);
+ void writeFields(FTextStream &t);
+ private:
+ IndexFieldSDict *dict;
+};
+
+/*! Constructs a new HtmlHelp index */
+HtmlHelpIndex::HtmlHelpIndex()
+{
+ dict = new IndexFieldSDict;
+ dict->setAutoDelete(TRUE);
+}
+
+/*! Destroys the HtmlHelp index */
+HtmlHelpIndex::~HtmlHelpIndex()
+{
+ delete dict;
+}
+
+/*! Stores an item in the index if it is not already present.
+ * Items are stored in alphetical order, by sorting on the
+ * concatenation of \a level1 and \a level2 (if present).
+ *
+ * \param level1 the string at level 1 in the index.
+ * \param level2 the string at level 2 in the index (or 0 if not applicable).
+ * \param url the url of the documentation (without .html extension).
+ * \param anchor the anchor of the documentation within the page.
+ * \param hasLink if true, the url (without anchor) can be used in the
+ * level1 item, when writing the header of a list of level2 items.
+ * \param reversed TRUE if level1 is the member name and level2 the compound
+ * name.
+ */
+void HtmlHelpIndex::addItem(const char *level1,const char *level2,
+ const char *url,const char *anchor,bool hasLink,
+ bool reversed)
+{
+ QCString key = level1;
+ if (level2) key+= (QCString)"?" + level2;
+ if (key.find(QRegExp("@[0-9]+"))!=-1) // skip anonymous stuff
+ {
+ return;
+ }
+ if (dict->find(key)==0) // new key
+ {
+ //printf(">>>>>>>>> HtmlHelpIndex::addItem(%s,%s,%s,%s)\n",
+ // level1,level2,url,anchor);
+ IndexField *f = new IndexField;
+ f->name = key;
+ f->url = url;
+ f->anchor = anchor;
+ f->link = hasLink;
+ f->reversed = reversed;
+ dict->append(key,f);
+ }
+}
+
+/*! Writes the sorted list of index items into a html like list.
+ *
+ * An list of calls with <code>name = level1,level2</code> as follows:
+ * <pre>
+ * a1,b1
+ * a1,b2
+ * a2,b1
+ * a2,b2
+ * a3
+ * a4,b1
+ * </pre>
+ *
+ * Will result in the following list:
+ *
+ * <pre>
+ * a1 -> link to url if hasLink==TRUE
+ * b1 -> link to url#anchor
+ * b2 -> link to url#anchor
+ * a2 -> link to url if hasLink==TRUE
+ * b1 -> link to url#anchor
+ * b2 -> link to url#anchor
+ * a3 -> link to url if hasLink==TRUE
+ * a4 -> link to url if hasLink==TRUE
+ * b1 -> link to url#anchor
+ * </pre>
+ */
+void HtmlHelpIndex::writeFields(FTextStream &t)
+{
+ dict->sort();
+ IndexFieldSDict::Iterator ifli(*dict);
+ IndexField *f;
+ QCString lastLevel1;
+ bool level2Started=FALSE;
+ for (;(f=ifli.current());++ifli)
+ {
+ QCString level1,level2;
+ int i;
+ if ((i=f->name.find('?'))!=-1)
+ {
+ level1 = f->name.left(i);
+ level2 = f->name.right(f->name.length()-i-1);
+ }
+ else
+ {
+ level1 = f->name.copy();
+ }
+
+ if (level1!=lastLevel1)
+ { // finish old list at level 2
+ if (level2Started) t << " </UL>" << endl;
+ level2Started=FALSE;
+
+ // <Antony>
+ // Added this code so that an item with only one subitem is written
+ // without any subitem.
+ // For example:
+ // a1, b1 -> will create only a1, not separate subitem for b1
+ // a2, b2
+ // a2, b3
+ QCString nextLevel1;
+ IndexField* fnext = ++ifli;
+ if (fnext)
+ {
+ nextLevel1 = fnext->name.left(fnext->name.find('?'));
+ --ifli;
+ }
+ if (level1 != nextLevel1)
+ {
+ level2 = "";
+ }
+ // </Antony>
+
+ if (level2.isEmpty())
+ {
+ t << " <LI><OBJECT type=\"text/sitemap\">";
+ t << "<param name=\"Local\" value=\"" << f->url << Doxygen::htmlFileExtension;
+ if (!f->anchor.isEmpty() && f->reversed) t << "#" << f->anchor;
+ t << "\">";
+ t << "<param name=\"Name\" value=\"" << level1 << "\">"
+ "</OBJECT>\n";
+ }
+ else
+ {
+ if (f->link)
+ {
+ t << " <LI><OBJECT type=\"text/sitemap\">";
+ t << "<param name=\"Local\" value=\"" << f->url << Doxygen::htmlFileExtension;
+ if (!f->anchor.isEmpty() && f->reversed) t << "#" << f->anchor;
+ t << "\">";
+ t << "<param name=\"Name\" value=\"" << level1 << "\">"
+ "</OBJECT>\n";
+ }
+ else
+ {
+ t << " <LI><OBJECT type=\"text/sitemap\">";
+ t << "<param name=\"See Also\" value=\"" << level1 << "\">";
+ t << "<param name=\"Name\" value=\"" << level1 << "\">"
+ "</OBJECT>\n";
+ }
+ }
+ }
+ if (!level2Started && !level2.isEmpty())
+ { // start new list at level 2
+ t << " <UL>" << endl;
+ level2Started=TRUE;
+ }
+ else if (level2Started && level2.isEmpty())
+ { // end list at level 2
+ t << " </UL>" << endl;
+ level2Started=FALSE;
+ }
+ if (level2Started)
+ {
+ t << " <LI><OBJECT type=\"text/sitemap\">";
+ t << "<param name=\"Local\" value=\"" << f->url << Doxygen::htmlFileExtension;
+ if (!f->anchor.isEmpty()) t << "#" << f->anchor;
+ t << "\">";
+ t << "<param name=\"Name\" value=\"" << level2 << "\">"
+ "</OBJECT>\n";
+ }
+ lastLevel1 = level1.copy();
+ }
+ if (level2Started) t << " </UL>" << endl;
+}
+
+//----------------------------------------------------------------------------
+
+HtmlHelp *HtmlHelp::theInstance = 0;
+
+/*! Constructs an html object.
+ * The object has to be \link initialize() initialized\endlink before it can
+ * be used.
+ */
+HtmlHelp::HtmlHelp() : indexFileDict(1009)
+{
+ /* initial depth */
+ dc = 0;
+ cf = kf = 0;
+ index = new HtmlHelpIndex;
+ m_fromUtf8 = (void *)(-1);
+}
+
+HtmlHelp::~HtmlHelp()
+{
+ if (m_fromUtf8!=(void *)(-1)) portable_iconv_close(m_fromUtf8);
+}
+#if 0
+/*! return a reference to the one and only instance of this class.
+ */
+HtmlHelp *HtmlHelp::getInstance()
+{
+ if (theInstance==0) theInstance = new HtmlHelp;
+ return theInstance;
+}
+#endif
+
+static QDict<QCString> s_languageDict;
+
+/*! This will create a contents file (index.hhc) and a index file (index.hhk)
+ * and write the header of those files.
+ * It also creates a project file (index.hhp)
+ * \sa finalize()
+ */
+void HtmlHelp::initialize()
+{
+ const char *str = Config_getString("CHM_INDEX_ENCODING");
+ if (!str) str = "CP1250"; // use safe and likely default
+ m_fromUtf8 = portable_iconv_open(str,"UTF-8");
+ if (m_fromUtf8==(void *)(-1))
+ {
+ err("Error: unsupported character conversion for CHM_INDEX_ENCODING: '%s'->'UTF-8'\n", str);
+ exit(1);
+ }
+
+ /* open the contents file */
+ QCString fName = Config_getString("HTML_OUTPUT") + "/index.hhc";
+ cf = new QFile(fName);
+ if (!cf->open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",fName.data());
+ exit(1);
+ }
+ /* Write the header of the contents file */
+ cts.setDevice(cf);
+ cts << "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n"
+ "<HTML><HEAD></HEAD><BODY>\n"
+ "<OBJECT type=\"text/site properties\">\n"
+ "<param name=\"FrameName\" value=\"right\">\n"
+ "</OBJECT>\n"
+ "<UL>\n";
+
+ /* open the contents file */
+ fName = Config_getString("HTML_OUTPUT") + "/index.hhk";
+ kf = new QFile(fName);
+ if (!kf->open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",fName.data());
+ exit(1);
+ }
+ /* Write the header of the contents file */
+ kts.setDevice(kf);
+ kts << "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n"
+ "<HTML><HEAD></HEAD><BODY>\n"
+ "<OBJECT type=\"text/site properties\">\n"
+ "<param name=\"FrameName\" value=\"right\">\n"
+ "</OBJECT>\n"
+ "<UL>\n";
+
+ /* language codes for Html help
+ 0x405 Czech
+ 0x406 Danish
+ 0x413 Dutch
+ 0xC09 English (Australia)
+ 0x809 English (Britain)
+ 0x1009 English (Canada)
+ 0x1809 English (Ireland)
+ 0x1409 English (New Zealand)
+ 0x1C09 English (South Africa)
+ 0x409 English (United States)
+ 0x40B Finnish
+ 0x40C French
+ 0x407 German
+ 0x408 Greece
+ 0x40E Hungarian
+ 0x410 Italian
+ 0x814 Norwegian
+ 0x415 Polish
+ 0x816 Portuguese(Portugal)
+ 0x416 Portuguese(Brazil)
+ 0x419 Russian
+ 0x80A Spanish(Mexico)
+ 0xC0A Spanish(Modern Sort)
+ 0x40A Spanish(Traditional Sort)
+ 0x41D Swedish
+ 0x41F Turkey
+ 0x411 Japanese
+ 0x412 Korean
+ 0x804 Chinese (PRC)
+ 0x404 Chinese (Taiwan)
+
+ New LCIDs:
+ 0x421 Indonesian
+ 0x41A Croatian
+ 0x418 Romanian
+ 0x424 Slovenian
+ 0x41B Slovak
+ 0x422 Ukrainian
+ 0x81A Serbian (Serbia, Latin)
+ 0x403 Catalan
+ 0x427 Lithuanian
+ 0x436 Afrikaans
+ 0x42A Vietnamese
+ 0x429 Persian (Iran)
+ 0xC01 Arabic (Egypt) - I don't know which version of arabic is used inside translator_ar.h ,
+ so I have chosen Egypt at random
+
+ */
+ s_languageDict.setAutoDelete(TRUE);
+ s_languageDict.clear();
+ s_languageDict.insert("czech", new QCString("0x405 Czech"));
+ s_languageDict.insert("danish", new QCString("0x406 Danish"));
+ s_languageDict.insert("dutch", new QCString("0x413 Dutch"));
+ s_languageDict.insert("finnish", new QCString("0x40B Finnish"));
+ s_languageDict.insert("french", new QCString("0x40C French"));
+ s_languageDict.insert("german", new QCString("0x407 German"));
+ s_languageDict.insert("greek", new QCString("0x408 Greece"));
+ s_languageDict.insert("hungarian", new QCString("0x40E Hungarian"));
+ s_languageDict.insert("italian", new QCString("0x410 Italian"));
+ s_languageDict.insert("norwegian", new QCString("0x814 Norwegian"));
+ s_languageDict.insert("polish", new QCString("0x415 Polish"));
+ s_languageDict.insert("portuguese", new QCString("0x816 Portuguese(Portugal)"));
+ s_languageDict.insert("brazil", new QCString("0x416 Portuguese(Brazil)"));
+ s_languageDict.insert("russian", new QCString("0x419 Russian"));
+ s_languageDict.insert("spanish", new QCString("0x40A Spanish(Traditional Sort)"));
+ s_languageDict.insert("swedish", new QCString("0x41D Swedish"));
+ s_languageDict.insert("turkish", new QCString("0x41F Turkey"));
+ s_languageDict.insert("japanese", new QCString("0x411 Japanese"));
+ s_languageDict.insert("japanese-en", new QCString("0x411 Japanese"));
+ s_languageDict.insert("korean", new QCString("0x412 Korean"));
+ s_languageDict.insert("korean-en", new QCString("0x412 Korean"));
+ s_languageDict.insert("chinese", new QCString("0x804 Chinese (PRC)"));
+ s_languageDict.insert("chinese-traditional", new QCString("0x404 Chinese (Taiwan)"));
+
+ // new LCIDs
+ s_languageDict.insert("indonesian", new QCString("0x412 Indonesian"));
+ s_languageDict.insert("croatian", new QCString("0x41A Croatian"));
+ s_languageDict.insert("romanian", new QCString("0x418 Romanian"));
+ s_languageDict.insert("slovene", new QCString("0x424 Slovenian"));
+ s_languageDict.insert("slovak", new QCString("0x41B Slovak"));
+ s_languageDict.insert("ukrainian", new QCString("0x422 Ukrainian"));
+ s_languageDict.insert("serbian", new QCString("0x81A Serbian (Serbia, Latin)"));
+ s_languageDict.insert("catalan", new QCString("0x403 Catalan"));
+ s_languageDict.insert("lithuanian", new QCString("0x427 Lithuanian"));
+ s_languageDict.insert("afrikaans", new QCString("0x436 Afrikaans"));
+ s_languageDict.insert("vietnamese", new QCString("0x42A Vietnamese"));
+ s_languageDict.insert("persian", new QCString("0x429 Persian (Iran)"));
+ s_languageDict.insert("arabic", new QCString("0xC01 Arabic (Egypt)"));
+}
+
+
+static QCString getLanguageString()
+{
+ if (!theTranslator->idLanguage().isEmpty())
+ {
+ QCString *s = s_languageDict[theTranslator->idLanguage()];
+ if (s)
+ {
+ return *s;
+ }
+ }
+ // default language
+ return "0x409 English (United States)";
+}
+
+
+
+void HtmlHelp::createProjectFile()
+{
+ /* Write the project file */
+ QCString fName = Config_getString("HTML_OUTPUT") + "/index.hhp";
+ QFile f(fName);
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+
+ QCString indexName="index"+Doxygen::htmlFileExtension;
+ //if (Config_getBool("GENERATE_TREEVIEW")) indexName="main"+Doxygen::htmlFileExtension;
+ t << "[OPTIONS]\n";
+ if (!Config_getString("CHM_FILE").isEmpty())
+ {
+ t << "Compiled file=" << Config_getString("CHM_FILE") << "\n";
+ }
+ t << "Compatibility=1.1\n"
+ "Full-text search=Yes\n"
+ "Contents file=index.hhc\n"
+ "Default Window=main\n"
+ "Default topic=" << indexName << "\n"
+ "Index file=index.hhk\n"
+ "Language=" << getLanguageString() << endl;
+ if (Config_getBool("BINARY_TOC")) t << "Binary TOC=YES\n";
+ if (Config_getBool("GENERATE_CHI")) t << "Create CHI file=YES\n";
+ t << "Title=" << recode(Config_getString("PROJECT_NAME")) << endl << endl;
+
+ t << "[WINDOWS]" << endl;
+
+ // NOTE: the 0x10387e number is a set of bits specifying the buttons
+ // which should appear in the CHM viewer; that specific value
+ // means "show all buttons including the font-size one";
+ // the font-size one is not normally settable by the HTML Help Workshop
+ // utility but the way to set it is described here:
+ // http://support.microsoft.com/?scid=kb%3Ben-us%3B240062&x=17&y=18
+ t << "main=\"" << recode(Config_getString("PROJECT_NAME")) << "\",\"index.hhc\","
+ "\"index.hhk\",\"" << indexName << "\",\"" <<
+ indexName << "\",,,,,0x23520,,0x10387e,,,,,,,,0" << endl << endl;
+
+ t << "[FILES]" << endl;
+ char *s = indexFiles.first();
+ while (s)
+ {
+ t << s << endl;
+ s = indexFiles.next();
+ }
+#if 0
+ // items not found by the html help compiler scan.
+ t << "tabs.css" << endl;
+ t << "tab_a.png" << endl;
+ t << "tab_b.png" << endl;
+ t << "tab_h.png" << endl;
+ t << "tab_s.png" << endl;
+ t << "nav_h.png" << endl;
+ t << "nav_f.png" << endl;
+ t << "bc_s.png" << endl;
+ if (Config_getBool("HTML_DYNAMIC_SECTIONS"))
+ {
+ t << "open.png" << endl;
+ t << "closed.png" << endl;
+ }
+ if (Config_getBool("GENERATE_HTMLHELP"))
+ {
+ t << "ftv2blank.png" << endl;
+ t << "ftv2doc.png" << endl;
+ t << "ftv2folderclosed.png" << endl;
+ t << "ftv2folderopen.png" << endl;
+ t << "ftv2lastnode.png" << endl;
+ t << "ftv2link.png" << endl;
+ t << "ftv2mlastnode.png" << endl;
+ t << "ftv2mnode.png" << endl;
+ t << "ftv2node.png" << endl;
+ t << "ftv2plastnode.png" << endl;
+ t << "ftv2pnode.png" << endl;
+ t << "ftv2vertline.png" << endl;
+ }
+ if (Config_getBool("SEARCHENGINE"))
+ {
+ t << "search_l.png" << endl;
+ t << "search_m.png" << endl;
+ t << "search_r.png" << endl;
+ if (Config_getBool("SERVER_BASED_SEARCH"))
+ {
+ t << "mag.png" << endl;
+ }
+ else
+ {
+ t << "mag_sel.png" << endl;
+ t << "close.png" << endl;
+ }
+ }
+#endif
+ uint i;
+ for (i=0;i<imageFiles.count();i++)
+ {
+ t << imageFiles.at(i) << endl;
+ }
+ f.close();
+ }
+ else
+ {
+ err("Could not open file %s for writing\n",fName.data());
+ }
+}
+
+void HtmlHelp::addIndexFile(const char *s)
+{
+ if (indexFileDict.find(s)==0)
+ {
+ indexFiles.append(s);
+ indexFileDict.insert(s,(void *)0x8);
+ }
+}
+
+/*! Finalizes the HTML help. This will finish and close the
+ * contents file (index.hhc) and the index file (index.hhk).
+ * \sa initialize()
+ */
+void HtmlHelp::finalize()
+{
+ // end the contents file
+ cts << "</UL>\n";
+ cts << "</BODY>\n";
+ cts << "</HTML>\n";
+ cts.unsetDevice();
+ cf->close();
+ delete cf;
+
+ index->writeFields(kts);
+
+ // end the index file
+ kts << "</UL>\n";
+ kts << "</BODY>\n";
+ kts << "</HTML>\n";
+ kts.unsetDevice();
+ kf->close();
+ delete kf;
+
+ createProjectFile();
+ s_languageDict.clear();
+}
+
+/*! Increase the level of the contents hierarchy.
+ * This will start a new unnumbered HTML list in contents file.
+ * \sa decContentsDepth()
+ */
+void HtmlHelp::incContentsDepth()
+{
+ int i; for (i=0;i<dc+1;i++) cts << " ";
+ cts << "<UL>\n";
+ ++dc;
+}
+
+/*! Decrease the level of the contents hierarchy.
+ * This will end the unnumber HTML list.
+ * \sa incContentsDepth()
+ */
+void HtmlHelp::decContentsDepth()
+{
+ int i; for (i=0;i<dc;i++) cts << " ";
+ cts << "</UL>\n";
+ --dc;
+}
+
+QCString HtmlHelp::recode(const QCString &s)
+{
+ int iSize = s.length();
+ int oSize = iSize*4+1;
+ QCString output(oSize);
+ size_t iLeft = iSize;
+ size_t oLeft = oSize;
+ const char *iPtr = s.data();
+ char *oPtr = output.data();
+ if (!portable_iconv(m_fromUtf8,&iPtr,&iLeft,&oPtr,&oLeft))
+ {
+ oSize -= oLeft;
+ output.resize(oSize+1);
+ output.at(oSize)='\0';
+ return output;
+ }
+ else
+ {
+ return s;
+ }
+}
+
+/*! Add an list item to the contents file.
+ * \param isDir boolean indicating if this is a dir or file entry
+ * \param name the name of the item.
+ * \param ref the URL of to the item.
+ * \param file the file in which the item is defined.
+ * \param anchor the anchor of the item.
+ */
+void HtmlHelp::addContentsItem(bool isDir,
+ const char *name,
+ const char * /*ref*/,
+ const char *file,
+ const char *anchor)
+{
+ // If we're using a binary toc then folders cannot have links.
+ if(Config_getBool("BINARY_TOC") && isDir)
+ {
+ file = 0;
+ anchor = 0;
+ }
+ int i; for (i=0;i<dc;i++) cts << " ";
+ cts << "<LI><OBJECT type=\"text/sitemap\">";
+ cts << "<param name=\"Name\" value=\"" << recode(name) << "\">";
+ if (file) // made file optional param - KPW
+ {
+ cts << "<param name=\"Local\" value=\"" << file << Doxygen::htmlFileExtension;
+ if (anchor) cts << "#" << anchor;
+ cts << "\">";
+ }
+ cts << "<param name=\"ImageNumber\" value=\"";
+ if (isDir) // added - KPW
+ {
+ cts << (int)BOOK_CLOSED ;
+ }
+ else
+ {
+ cts << (int)TEXT;
+ }
+ cts << "\">";
+ cts << "</OBJECT>\n";
+}
+
+
+void HtmlHelp::addIndexItem(Definition *context,MemberDef *md,
+ const char *word)
+{
+ if (md)
+ {
+ static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
+ if (context==0) // global member
+ {
+ if (md->getGroupDef())
+ context = md->getGroupDef();
+ else if (md->getFileDef())
+ context = md->getFileDef();
+ }
+ if (context==0) return; // should not happen
+
+ QCString cfname = md->getOutputFileBase();
+ QCString cfiname = context->getOutputFileBase();
+ QCString level1 = context->name();
+ QCString level2 = md->name();
+ QCString contRef = separateMemberPages ? cfname : cfiname;
+ QCString memRef = cfname;
+ QCString anchor = md->anchor();
+ index->addItem(level1,level2,contRef,anchor,TRUE,FALSE);
+ index->addItem(level2,level1,memRef,anchor,TRUE,TRUE);
+ }
+ else if (context)
+ {
+ QCString level1 = word ? QCString(word) : context->name();
+ index->addItem(level1,0,context->getOutputFileBase(),0,TRUE,FALSE);
+ }
+}
+
+void HtmlHelp::addImageFile(const char *fileName)
+{
+ imageFiles.append(fileName);
+}
+
diff --git a/src/htmlhelp.h b/src/htmlhelp.h
new file mode 100644
index 0000000..f739f90
--- /dev/null
+++ b/src/htmlhelp.h
@@ -0,0 +1,101 @@
+/******************************************************************************
+ *
+ * $Id: htmlhelp.h,v 1.7 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * The code is this file is largely based on a contribution from
+ * Harm van der Heijden <H.v.d.Heijden@phys.tue.nl>
+ * Please send thanks to him and bug reports to me :-)
+ */
+
+#ifndef HTMLHELP_H
+#define HTMLHELP_H
+
+#include "qtbc.h"
+#include <qstrlist.h>
+#include "index.h"
+#include "ftextstream.h"
+
+class QFile;
+class HtmlHelpIndex;
+
+/*! A class that generated the HTML Help specific files.
+ * These files can be used with the Microsoft HTML Help workshop
+ * to generate compressed HTML files (.chm).
+ */
+class HtmlHelp : public IndexIntf
+{
+ /*! used in imageNumber param of HTMLHelp::addContentsItem() function
+ to specify document icon in tree view.
+ Writes \<param name="ImageNumber" value="xx"\> in .HHC file. */
+ enum ImageNumber {
+ BOOK_CLOSED=1, BOOK_OPEN,
+ BOOK_CLOSED_NEW, BOOK_OPEN_NEW,
+ FOLDER_CLOSED, FOLDER_OPEN,
+ FOLDER_CLOSED_NEW,FOLDER_OPEN_NEW,
+ QUERY, QUERY_NEW,
+ TEXT, TEXT_NEW,
+ WEB_DOC, WEB_DOC_NEW,
+ WEB_LINK, WEB_LINK_NEW,
+ INFO, INFO_NEW,
+ LINK, LINK_NEW,
+ BOOKLET, BOOKLET_NEW,
+ EMAIL, EMAIL_NEW,
+ EMAIL2, EMAIL2_NEW,
+ IMAGE, IMAGE_NEW,
+ AUDIO, AUDIO_NEW,
+ MUSIC, MUSIC_NEW,
+ VIDEO, VIDEO_NEW,
+ INDEX, INDEX_NEW,
+ IDEA, IDEA_NEW,
+ NOTE, NOTE_NEW,
+ TOOL, TOOL_NEW
+ };
+ public:
+ //static HtmlHelp *getInstance();
+ HtmlHelp();
+ ~HtmlHelp();
+ void initialize();
+ void finalize();
+ void incContentsDepth();
+ void decContentsDepth();
+ void addContentsItem(bool isDir,
+ const char *name,
+ const char *ref = 0,
+ const char *file = 0,
+ const char *anchor = 0);
+ //void addIndexItem(const char *level1, const char *level2,
+ // const char *contRef, const char *memRef,
+ // const char *anchor,const MemberDef *md);
+ void addIndexItem(Definition *context,MemberDef *md,const char *title);
+ void addIndexFile(const char *name);
+ void addImageFile(const char *);
+ void addStyleSheetFile(const char *) {}
+
+ private:
+ void createProjectFile();
+
+ QFile *cf,*kf;
+ FTextStream cts,kts;
+ HtmlHelpIndex *index;
+ int dc;
+ QStrList indexFiles;
+ QStrList imageFiles;
+ QDict<void> indexFileDict;
+ static HtmlHelp *theInstance;
+ QCString recode(const QCString &s);
+ void *m_fromUtf8;
+};
+
+#endif /* HTMLHELP_H */
+
diff --git a/src/image.cpp b/src/image.cpp
new file mode 100644
index 0000000..03fd766
--- /dev/null
+++ b/src/image.cpp
@@ -0,0 +1,540 @@
+/******************************************************************************
+ *
+ * $Id: image.cpp,v 1.14 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include "image.h"
+#include <qfile.h>
+#include <math.h>
+#include "lodepng.h"
+#include "config.h"
+
+typedef unsigned char Byte;
+
+struct Color
+{
+ Byte red;
+ Byte green;
+ Byte blue;
+ Byte alpha;
+};
+
+const int charSetWidth=80;
+const int charHeight=12;
+const int numChars=96;
+
+unsigned short charPos[numChars] =
+ {
+ 0, 5, 8, 13, 20, 27, 38, 47,
+ 50, 54, 58, 65, 72, 76, 83, 87,
+ 91, 98,105,112,119,126,133,140,
+ 147,154,161,164,167,174,181,188,
+ 195,207,216,224,233,242,250,258,
+ 267,276,279,286,294,301,312,321,
+ 331,339,349,357,365,372,380,389,
+ 400,409,418,427,430,434,437,443,
+ 450,453,460,467,474,481,488,492,
+ 499,506,509,512,518,521,530,537,
+ 544,551,557,562,568,571,578,585,
+ 594,600,607,613,617,620,624,631
+ };
+
+unsigned char charWidth[numChars] =
+ {
+ 5, 3, 5, 7, 7,11, 9, 3,
+ 4, 4, 7, 7, 4, 7, 4, 4,
+
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 3, 3, 7, 7, 7, 7,
+ 12, 9, 8, 9, 9, 8, 8, 9,
+ 9, 3, 7, 8, 7,11, 9,10,
+ 8,10, 8, 8, 7, 8, 9,11,
+ 9, 9, 9, 3, 4, 3, 6, 7,
+ 3, 7, 7, 7, 7, 7, 4, 7,
+ 7, 3, 3, 6, 3, 9, 7, 7,
+ 7, 6, 5, 6, 3, 7, 7, 9,
+ 6, 7, 6, 4, 3, 4, 7, 5
+ };
+
+unsigned char fontRaw[charSetWidth*charHeight] = {
+ 0x02, 0x50, 0x01, 0x06, 0x20, 0x60, 0xc6, 0x04, 0x00, 0x00, 0x00, 0x27,
+ 0x04, 0x1c, 0x38, 0x11, 0xf1, 0xc7, 0xc7, 0x0e, 0x00, 0x00, 0x00, 0x03,
+ 0x81, 0xf0, 0x10, 0x7c, 0x1e, 0x3e, 0x1f, 0x9f, 0x87, 0x88, 0x24, 0x09,
+ 0x09, 0x02, 0x02, 0x41, 0x0f, 0x0f, 0x83, 0xc3, 0xe1, 0xe7, 0xf4, 0x24,
+ 0x12, 0x22, 0x41, 0x20, 0x9f, 0xce, 0x30, 0x00, 0x10, 0x04, 0x00, 0x01,
+ 0x00, 0x30, 0x08, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0x00, 0x00, 0x02, 0x51, 0x43, 0x89,
+ 0x40, 0x90, 0x49, 0x15, 0x00, 0x00, 0x00, 0x28, 0x9c, 0x22, 0x44, 0x31,
+ 0x02, 0x20, 0x48, 0x91, 0x00, 0x00, 0x00, 0x04, 0x46, 0x08, 0x28, 0x42,
+ 0x21, 0x21, 0x10, 0x10, 0x08, 0x48, 0x24, 0x09, 0x11, 0x03, 0x06, 0x61,
+ 0x10, 0x88, 0x44, 0x22, 0x12, 0x10, 0x84, 0x24, 0x12, 0x22, 0x22, 0x20,
+ 0x80, 0x4a, 0x11, 0x00, 0x20, 0x04, 0x00, 0x01, 0x00, 0x40, 0x08, 0x00,
+ 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x22, 0x00, 0x00, 0x02, 0x51, 0x45, 0x49, 0x40, 0x90, 0x89, 0x0a,
+ 0x00, 0x00, 0x00, 0x48, 0x84, 0x02, 0x04, 0x51, 0x02, 0x00, 0x88, 0x91,
+ 0x00, 0x00, 0x00, 0x04, 0x44, 0xd4, 0x28, 0x42, 0x40, 0x20, 0x90, 0x10,
+ 0x10, 0x08, 0x24, 0x09, 0x21, 0x03, 0x06, 0x51, 0x20, 0x48, 0x48, 0x12,
+ 0x12, 0x00, 0x84, 0x22, 0x22, 0x22, 0x22, 0x11, 0x00, 0x89, 0x12, 0x80,
+ 0x31, 0xc5, 0x87, 0x0d, 0x1c, 0xe3, 0x4b, 0x12, 0x49, 0x29, 0x16, 0x1c,
+ 0x58, 0x69, 0x4c, 0xe8, 0x91, 0x44, 0x61, 0x44, 0xf2, 0x22, 0x00, 0x00,
+ 0x02, 0x07, 0xe5, 0x06, 0x80, 0x60, 0x10, 0x95, 0x08, 0x00, 0x00, 0x48,
+ 0x84, 0x04, 0x18, 0x51, 0xe2, 0xc0, 0x87, 0x11, 0x24, 0x18, 0x03, 0x00,
+ 0x89, 0x24, 0x44, 0x42, 0x40, 0x20, 0x90, 0x10, 0x10, 0x08, 0x24, 0x09,
+ 0x41, 0x02, 0x8a, 0x51, 0x20, 0x48, 0x48, 0x12, 0x11, 0x80, 0x84, 0x22,
+ 0x21, 0x24, 0x14, 0x11, 0x01, 0x09, 0x14, 0x40, 0x02, 0x26, 0x48, 0x93,
+ 0x22, 0x44, 0xcc, 0x92, 0x51, 0x36, 0x99, 0x22, 0x64, 0x99, 0x92, 0x48,
+ 0x91, 0x44, 0x52, 0x44, 0x12, 0x22, 0x00, 0x00, 0x02, 0x01, 0x43, 0x80,
+ 0x80, 0xa0, 0x10, 0x84, 0x08, 0x00, 0x00, 0x88, 0x84, 0x08, 0x04, 0x90,
+ 0x13, 0x21, 0x08, 0x8f, 0x00, 0x61, 0xf0, 0xc0, 0x8a, 0x24, 0x44, 0x7c,
+ 0x40, 0x20, 0x9f, 0x9f, 0x11, 0xcf, 0xe4, 0x09, 0xc1, 0x02, 0x8a, 0x49,
+ 0x20, 0x4f, 0x88, 0x13, 0xe0, 0x60, 0x84, 0x22, 0x21, 0x54, 0x08, 0x0a,
+ 0x02, 0x08, 0x90, 0x00, 0x00, 0x24, 0x48, 0x11, 0x22, 0x44, 0x48, 0x92,
+ 0x61, 0x24, 0x91, 0x22, 0x44, 0x89, 0x10, 0x48, 0x91, 0x24, 0x8c, 0x44,
+ 0x22, 0x22, 0x64, 0x00, 0x02, 0x07, 0xe1, 0x41, 0x31, 0x14, 0x10, 0x80,
+ 0x3e, 0x07, 0xc0, 0x88, 0x84, 0x10, 0x05, 0x10, 0x12, 0x21, 0x08, 0x81,
+ 0x01, 0x80, 0x00, 0x31, 0x0a, 0x24, 0x7c, 0x42, 0x40, 0x20, 0x90, 0x10,
+ 0x10, 0x48, 0x24, 0x09, 0x21, 0x02, 0x52, 0x45, 0x20, 0x48, 0x08, 0x92,
+ 0x20, 0x10, 0x84, 0x21, 0x41, 0x54, 0x14, 0x04, 0x04, 0x08, 0x90, 0x00,
+ 0x01, 0xe4, 0x48, 0x11, 0x3e, 0x44, 0x48, 0x92, 0x61, 0x24, 0x91, 0x22,
+ 0x44, 0x89, 0x0c, 0x48, 0x8a, 0x24, 0x8c, 0x48, 0x44, 0x21, 0x98, 0x00,
+ 0x02, 0x02, 0x85, 0x41, 0x49, 0x08, 0x10, 0x80, 0x08, 0x00, 0x00, 0x88,
+ 0x84, 0x20, 0x45, 0xf9, 0x12, 0x21, 0x08, 0x81, 0x00, 0x61, 0xf0, 0xc1,
+ 0x0a, 0x68, 0x82, 0x42, 0x40, 0x20, 0x90, 0x10, 0x10, 0x48, 0x24, 0x89,
+ 0x11, 0x02, 0x52, 0x45, 0x20, 0x48, 0x08, 0x52, 0x12, 0x10, 0x84, 0x21,
+ 0x40, 0x88, 0x22, 0x04, 0x08, 0x08, 0x90, 0x00, 0x02, 0x24, 0x48, 0x11,
+ 0x20, 0x44, 0x48, 0x92, 0x51, 0x24, 0x91, 0x22, 0x44, 0x89, 0x02, 0x48,
+ 0x8a, 0x2a, 0x92, 0x28, 0x42, 0x22, 0x00, 0x00, 0x00, 0x02, 0x85, 0x41,
+ 0x49, 0x18, 0x10, 0x80, 0x08, 0x00, 0x01, 0x08, 0x84, 0x20, 0x44, 0x11,
+ 0x12, 0x22, 0x08, 0x91, 0x00, 0x18, 0x03, 0x00, 0x09, 0xb0, 0x82, 0x42,
+ 0x21, 0x21, 0x10, 0x10, 0x08, 0xc8, 0x24, 0x89, 0x09, 0x02, 0x22, 0x43,
+ 0x10, 0x88, 0x04, 0x22, 0x12, 0x10, 0x84, 0x20, 0x80, 0x88, 0x22, 0x04,
+ 0x10, 0x08, 0x50, 0x00, 0x02, 0x26, 0x48, 0x93, 0x22, 0x44, 0xc8, 0x92,
+ 0x49, 0x24, 0x91, 0x22, 0x64, 0x99, 0x12, 0x49, 0x84, 0x11, 0x21, 0x28,
+ 0x82, 0x22, 0x00, 0x00, 0x02, 0x02, 0x83, 0x82, 0x30, 0xe4, 0x10, 0x80,
+ 0x00, 0x20, 0x05, 0x07, 0x04, 0x3e, 0x38, 0x10, 0xe1, 0xc2, 0x07, 0x0e,
+ 0x24, 0x00, 0x00, 0x01, 0x04, 0x00, 0x82, 0x7c, 0x1e, 0x3e, 0x1f, 0x90,
+ 0x07, 0x48, 0x24, 0x71, 0x05, 0xf2, 0x22, 0x41, 0x0f, 0x08, 0x03, 0xd2,
+ 0x11, 0xe0, 0x83, 0xc0, 0x80, 0x88, 0x41, 0x04, 0x1f, 0xc8, 0x50, 0x00,
+ 0x01, 0xd5, 0x87, 0x0d, 0x1c, 0x43, 0x48, 0x92, 0x45, 0x24, 0x91, 0x1c,
+ 0x58, 0x69, 0x0c, 0x66, 0x84, 0x11, 0x21, 0x10, 0xf2, 0x22, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x02, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x09, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x10, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
+ 0x02, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0xac, 0x00, 0x00
+};
+
+static Color palette[] =
+{
+ { 0xff, 0xff, 0xff, 0x00 },
+ { 0x00, 0x00, 0x00, 0xff },
+ { 0xff, 0xff, 0xc0, 0xff },
+ { 0x9f, 0x9f, 0x60, 0xff },
+ { 0x90, 0x00, 0x00, 0xff },
+ { 0x00, 0x90, 0x00, 0xff },
+ { 0x00, 0x00, 0x90, 0xff },
+ { 0xc0, 0xc0, 0xc0, 0xff }
+};
+
+// for alpha we use x^(1/1.3)
+static Color palette2[] =
+{
+ { 0x00, 0x00, 0x00, 0x00 },
+ { 0x00, 0x00, 0x00, 0x2e },
+ { 0x00, 0x00, 0x00, 0x48 },
+ { 0x00, 0x00, 0x00, 0x5d },
+ { 0x00, 0x00, 0x00, 0x6f },
+ { 0x00, 0x00, 0x00, 0x80 },
+ { 0x00, 0x00, 0x00, 0x8f },
+ { 0x00, 0x00, 0x00, 0x9e },
+ { 0x00, 0x00, 0x00, 0xac },
+ { 0x00, 0x00, 0x00, 0xb9 },
+ { 0x00, 0x00, 0x00, 0xc5 },
+ { 0x00, 0x00, 0x00, 0xd2 },
+ { 0x00, 0x00, 0x00, 0xdd },
+ { 0x00, 0x00, 0x00, 0xe9 },
+ { 0x00, 0x00, 0x00, 0xf4 },
+ { 0x00, 0x00, 0x00, 0xff }
+};
+
+static Color palette3[] =
+{
+ { 0xff, 0xff, 0xff, 0xff },
+ { 0xe0, 0xe0, 0xe0, 0xff },
+ { 0xd0, 0xd0, 0xd0, 0xff },
+ { 0xc0, 0xc0, 0xc0, 0xff },
+ { 0xb0, 0xb0, 0xb0, 0xff },
+ { 0xa0, 0xa0, 0xa0, 0xff },
+ { 0x90, 0x90, 0x90, 0xff },
+ { 0x80, 0x80, 0x80, 0xff },
+ { 0x70, 0x70, 0x70, 0xff },
+ { 0x60, 0x60, 0x60, 0xff },
+ { 0x50, 0x50, 0x50, 0xff },
+ { 0x40, 0x40, 0x40, 0xff },
+ { 0x30, 0x30, 0x30, 0xff },
+ { 0x20, 0x20, 0x20, 0xff },
+ { 0x10, 0x10, 0x10, 0xff },
+ { 0x00, 0x00, 0x00, 0xff }
+};
+
+
+Image::Image(int w,int h)
+{
+ static int hue = Config_getInt("HTML_COLORSTYLE_HUE");
+ static int sat = Config_getInt("HTML_COLORSTYLE_SAT");
+ static int gamma = Config_getInt("HTML_COLORSTYLE_GAMMA");
+
+ double red1,green1,blue1;
+ double red2,green2,blue2;
+
+ ColoredImage::hsl2rgb(hue/360.0, // hue
+ sat/255.0, // saturation
+ pow(235/255.0,gamma/100.0), // luma (gamma corrected)
+ &red1,&green1,&blue1
+ );
+
+ ColoredImage::hsl2rgb(hue/360.0, // hue
+ sat/255.0, // saturation
+ pow(138/255.0,gamma/100.0), // luma (gamma corrected)
+ &red2,&green2,&blue2
+ );
+
+ palette[2].red = (int)(red1 * 255.0);
+ palette[2].green = (int)(green1 * 255.0);
+ palette[2].blue = (int)(blue1 * 255.0);
+
+ palette[3].red = (int)(red2 * 255.0);
+ palette[3].green = (int)(green2 * 255.0);
+ palette[3].blue = (int)(blue2 * 255.0);
+
+ data = new uchar[w*h];
+ memset(data,0,w*h);
+ width = w;
+ height = h;
+}
+
+Image::~Image()
+{
+ delete[] data;
+}
+
+void Image::setPixel(int x,int y,uchar val)
+{
+ if (x>=0 && x<width && y>=0 && y<height)
+ data[y*width+x] = val;
+}
+
+uchar Image::getPixel(int x,int y) const
+{
+ if (x>=0 && x<width && y>=0 && y<height)
+ return data[y*width+x];
+ else
+ return 0;
+}
+
+void Image::writeChar(int x,int y,char c,uchar fg)
+{
+ if (c>=' ')
+ {
+ int xf,yf,ci=c-' ';
+ int rowOffset=0;
+ int cw = charWidth[ci];
+ int cp = charPos[ci];
+ for (yf=0;yf<charHeight;yf++)
+ {
+ unsigned short bitPattern=0;
+ int bitsLeft=cw;
+ int byteOffset = rowOffset+(cp>>3);
+ int bitOffset = cp&7;
+ // get the bit pattern for row yf of the character from the font data
+ while (bitsLeft>0)
+ {
+ int bits=8-bitOffset;
+ if (bits>bitsLeft) bits=bitsLeft;
+ bitPattern<<=bits;
+ bitPattern|=((fontRaw[byteOffset]<<bitOffset)&0xff)>>(8-bits);
+ bitsLeft-=bits;
+ bitOffset=0;
+ byteOffset++;
+ }
+ int mask=1<<(cw-1);
+ // draw character row yf
+ for (xf=0;xf<cw;xf++)
+ {
+ setPixel(x+xf,y+yf,(bitPattern&mask) ? fg : getPixel(x+xf,y+yf));
+ mask>>=1;
+ }
+ rowOffset+=charSetWidth;
+ }
+ }
+}
+
+void Image::writeString(int x,int y,const char *s,uchar fg)
+{
+ if (s)
+ {
+ char c;
+ while ((c=*s++))
+ {
+ writeChar(x,y,c,fg);
+ x+=charWidth[c-' '];
+ }
+ }
+}
+
+uint Image::stringLength(const char *s)
+{
+ int w=0;
+ if (s)
+ {
+ char c;
+ while ((c=*s++)) w+=charWidth[c-' '];
+ }
+ return w;
+}
+
+void Image::drawHorzLine(int y,int xs,int xe,uchar colIndex,uint mask)
+{
+ int x,i=0,j=0;
+ for (x=xs;x<=xe;x++,j++)
+ {
+ if (j&1) i++;
+ if (mask&(1<<(i&0x1f))) setPixel(x,y,colIndex);
+ }
+}
+
+void Image::drawHorzArrow(int y,int xs,int xe,uchar colIndex,uint mask)
+{
+ drawHorzLine(y,xs,xe,colIndex,mask);
+ int i;
+ for (i=0;i<6;i++)
+ {
+ int h=i>>1;
+ drawVertLine(xe-i,y-h,y+h,colIndex,0xffffffff);
+ }
+}
+
+void Image::drawVertLine(int x,int ys,int ye,uchar colIndex,uint mask)
+{
+ int y,i=0;
+ for (y=ys;y<=ye;y++,i++)
+ {
+ if (mask&(1<<(i&0x1f))) setPixel(x,y,colIndex);
+ }
+}
+
+void Image::drawVertArrow(int x,int ys,int ye,uchar colIndex,uint mask)
+{
+ drawVertLine(x,ys,ye,colIndex,mask);
+ int i;
+ for (i=0;i<6;i++)
+ {
+ int h=i>>1;
+ drawHorzLine(ys+i,x-h,x+h,colIndex,0xffffffff);
+ }
+}
+
+void Image::drawRect(int x,int y,int w,int h,uchar colIndex,uint mask)
+{
+ drawHorzLine(y,x,x+w-1,colIndex,mask);
+ drawHorzLine(y+h-1,x,x+w-1,colIndex,mask);
+ drawVertLine(x,y,y+h-1,colIndex,mask);
+ drawVertLine(x+w-1,y,y+h-1,colIndex,mask);
+}
+
+void Image::fillRect(int x,int y,int lwidth,int lheight,uchar colIndex,uint mask)
+{
+ int xp,yp,xi,yi;
+ for (yp=y,yi=0;yp<y+lheight;yp++,yi++)
+ for (xp=x,xi=0;xp<x+lwidth;xp++,xi++)
+ if (mask&(1<<((xi+yi)&0x1f)))
+ setPixel(xp,yp,colIndex);
+}
+
+bool Image::save(const char *fileName,int mode)
+{
+#if 0
+ GifEncoder gifenc(data,
+ mode==0 ? palette : palette2,
+ width,height,
+ mode==0 ? 3 : 4,
+ 0);
+ QFile file(fileName);
+ if (file.open(IO_WriteOnly))
+ {
+ gifenc.writeGIF(file);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+#endif
+ static bool useTransparency = Config_getBool("FORMULA_TRANSPARENT");
+ uchar* buffer;
+ size_t bufferSize;
+ LodePNG_Encoder encoder;
+ LodePNG_Encoder_init(&encoder);
+ int numCols = mode==0 ? 8 : 16;
+ Color *pPal = mode==0 ? palette :
+ useTransparency ? palette2 :
+ palette3 ;
+ int i;
+ for (i=0;i<numCols;i++,pPal++)
+ {
+ LodePNG_InfoColor_addPalette(&encoder.infoPng.color,
+ pPal->red,pPal->green,pPal->blue,pPal->alpha);
+ }
+ encoder.infoPng.color.colorType = 3;
+ encoder.infoRaw.color.colorType = 3;
+ LodePNG_encode(&encoder, &buffer, &bufferSize, data, width, height);
+ LodePNG_saveFile(buffer, bufferSize, fileName);
+ free(buffer);
+ LodePNG_Encoder_cleanup(&encoder);
+ return TRUE;
+}
+
+//----------------------------------------------------------------
+
+void ColoredImage::hsl2rgb(double h,double s,double l,
+ double *pRed,double *pGreen,double *pBlue)
+{
+ double v;
+ double r,g,b;
+
+ r = l; // default to gray
+ g = l;
+ b = l;
+ v = (l <= 0.5) ? (l * (1.0 + s)) : (l + s - l * s);
+ if (v > 0)
+ {
+ double m;
+ double sv;
+ int sextant;
+ double fract, vsf, mid1, mid2;
+
+ m = l + l - v;
+ sv = (v - m ) / v;
+ h *= 6.0;
+ sextant = (int)h;
+ fract = h - sextant;
+ vsf = v * sv * fract;
+ mid1 = m + vsf;
+ mid2 = v - vsf;
+ switch (sextant)
+ {
+ case 0:
+ r = v;
+ g = mid1;
+ b = m;
+ break;
+ case 1:
+ r = mid2;
+ g = v;
+ b = m;
+ break;
+ case 2:
+ r = m;
+ g = v;
+ b = mid1;
+ break;
+ case 3:
+ r = m;
+ g = mid2;
+ b = v;
+ break;
+ case 4:
+ r = mid1;
+ g = m;
+ b = v;
+ break;
+ case 5:
+ r = v;
+ g = m;
+ b = mid2;
+ break;
+ }
+ }
+ *pRed = r;
+ *pGreen = g;
+ *pBlue = b;
+}
+
+ColoredImage::ColoredImage(int width,int height,
+ const uchar *greyLevels,const uchar *alphaLevels,
+ int saturation,int hue,int gamma)
+{
+ m_hasAlpha = alphaLevels!=0;
+ m_width = width;
+ m_height = height;
+ m_data = (uchar*)malloc(width*height*4);
+ int i;
+ for (i=0;i<width*height;i++)
+ {
+ uchar r,g,b,a;
+ double red,green,blue;
+ hsl2rgb(hue/360.0, // hue
+ saturation/255.0, // saturation
+ pow(greyLevels[i]/255.0,gamma/100.0), // luma (gamma corrected)
+ &red,&green,&blue);
+ r = (int)(red *255.0);
+ g = (int)(green*255.0);
+ b = (int)(blue *255.0);
+ a = alphaLevels ? alphaLevels[i] : 255;
+ m_data[i*4+0]=r;
+ m_data[i*4+1]=g;
+ m_data[i*4+2]=b;
+ m_data[i*4+3]=a;
+ }
+}
+
+ColoredImage::~ColoredImage()
+{
+ free(m_data);
+}
+
+bool ColoredImage::save(const char *fileName)
+{
+ uchar *buffer;
+ size_t bufferSize;
+ LodePNG_Encoder encoder;
+ LodePNG_Encoder_init(&encoder);
+ encoder.infoPng.color.colorType = m_hasAlpha ? 6 : 2; // 2=RGB 24 bit, 6=RGBA 32 bit
+ encoder.infoRaw.color.colorType = 6; // 6=RGBA 32 bit
+ LodePNG_encode(&encoder, &buffer, &bufferSize, m_data, m_width, m_height);
+ LodePNG_saveFile(buffer, bufferSize, fileName);
+ LodePNG_Encoder_cleanup(&encoder);
+ free(buffer);
+ return TRUE;
+}
+
+
diff --git a/src/image.h b/src/image.h
new file mode 100644
index 0000000..c655482
--- /dev/null
+++ b/src/image.h
@@ -0,0 +1,69 @@
+/******************************************************************************
+ *
+ * $Id: image.h,v 1.7 2001/03/19 19:27:40 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _IMAGE_H
+#define _IMAGE_H
+#include <qglobal.h>
+
+class Image
+{
+ public:
+ Image(int w,int h);
+ ~Image();
+
+ void setPixel(int x,int y,uchar val);
+ uchar getPixel(int x,int y) const;
+ void writeChar(int x,int y,char c,uchar fg);
+ void writeString(int x,int y,const char *s,uchar fg);
+ void drawHorzLine(int y,int xs,int xe,uchar colIndex,uint mask);
+ void drawHorzArrow(int y,int xs,int xe,uchar colIndex,uint mask);
+ void drawVertLine(int x,int ys,int ye,uchar colIndex,uint mask);
+ void drawVertArrow(int x,int ys,int ye,uchar colIndex,uint mask);
+ void drawRect(int x,int y,int width,int height,uchar colIndex,uint mask);
+ void fillRect(int x,int y,int width,int height,uchar colIndex,uint mask);
+ bool save(const char *fileName,int mode=0);
+ friend uint stringLength(const char *s);
+ uint getWidth() const { return width; }
+ uint getHeight() const { return height; }
+ uchar *getData() const { return data; }
+ static uint stringLength(const char *s);
+
+ private:
+ int width;
+ int height;
+ uchar *data;
+};
+
+class ColoredImage
+{
+ public:
+ ColoredImage(int width,int height,
+ const uchar *greyLevels,const uchar *alphaLevels,
+ int saturation,int hue,int gamma);
+ ~ColoredImage();
+ bool save(const char *fileName);
+ static void hsl2rgb(double h,double s,double l,
+ double *pRed,double *pGreen,double *pBlue);
+ private:
+ int m_width;
+ int m_height;
+ uchar *m_data;
+ bool m_hasAlpha;
+};
+
+#endif
diff --git a/src/increasebuffer.pl b/src/increasebuffer.pl
new file mode 100644
index 0000000..109f9ad
--- /dev/null
+++ b/src/increasebuffer.pl
@@ -0,0 +1,9 @@
+# Since the internal token buffer of a generated flex file is hardcoded
+# to 16K, this script is used to increase the buffer size of a flex
+# generated scanner to 256K.
+while (<>)
+{
+ s/YY_BUF_SIZE 16384/YY_BUF_SIZE 262144/g;
+ s/YY_READ_BUF_SIZE 8192/YY_READ_BUF_SIZE 262144/g;
+ print $_;
+}
diff --git a/src/index.cpp b/src/index.cpp
new file mode 100644
index 0000000..1c1c9f7
--- /dev/null
+++ b/src/index.cpp
@@ -0,0 +1,4179 @@
+/******************************************************************************
+ *
+ * $Id: index.cpp,v 1.63 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/** @file
+ * @brief This file contains functions for the various index pages.
+ */
+
+#include <stdlib.h>
+
+#include <qtextstream.h>
+#include <qdatetime.h>
+#include <qdir.h>
+#include <qregexp.h>
+
+#include "message.h"
+#include "index.h"
+#include "doxygen.h"
+#include "config.h"
+#include "filedef.h"
+#include "outputlist.h"
+#include "util.h"
+#include "groupdef.h"
+#include "language.h"
+#include "htmlgen.h"
+#include "htmlhelp.h"
+#include "ftvhelp.h"
+#include "dot.h"
+#include "pagedef.h"
+#include "dirdef.h"
+#include "vhdldocgen.h"
+#include "layout.h"
+
+#define MAX_ITEMS_BEFORE_MULTIPAGE_INDEX 200
+#define MAX_ITEMS_BEFORE_QUICK_INDEX 30
+
+static const char search_script[]=
+#include "search_js.h"
+;
+
+//static const char navindex_script[]=
+//#include "navindex_js.h"
+//;
+
+int annotatedClasses;
+int annotatedClassesPrinted;
+int hierarchyClasses;
+int documentedFiles;
+int documentedGroups;
+int documentedNamespaces;
+int indexedPages;
+int documentedClassMembers[CMHL_Total];
+int documentedFileMembers[FMHL_Total];
+int documentedNamespaceMembers[NMHL_Total];
+int documentedHtmlFiles;
+int documentedPages;
+int documentedDirs;
+
+int countClassHierarchy();
+int countClassMembers(int filter=CMHL_All);
+int countFileMembers(int filter=FMHL_All);
+void countFiles(int &htmlFiles,int &files);
+int countGroups();
+int countDirs();
+int countNamespaces();
+int countAnnotatedClasses(int *cp);
+int countNamespaceMembers(int filter=NMHL_All);
+int countIncludeFiles();
+void countRelatedPages(int &docPages,int &indexPages);
+
+void countDataStructures()
+{
+ annotatedClasses = countAnnotatedClasses(&annotatedClassesPrinted); // "classes" + "annotated"
+ hierarchyClasses = countClassHierarchy(); // "hierarchy"
+ countFiles(documentedHtmlFiles,documentedFiles); // "files"
+ countRelatedPages(documentedPages,indexedPages); // "pages"
+ documentedGroups = countGroups(); // "modules"
+ documentedNamespaces = countNamespaces(); // "namespaces"
+ documentedDirs = countDirs(); // "dirs"
+ // "globals"
+ // "namespacemembers"
+ // "functions"
+}
+
+static void startIndexHierarchy(OutputList &ol,int level)
+{
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Html);
+ if (level<6) ol.startIndexList();
+ ol.enableAll();
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ ol.startItemList();
+ ol.popGeneratorState();
+}
+
+static void endIndexHierarchy(OutputList &ol,int level)
+{
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Html);
+ if (level<6) ol.endIndexList();
+ ol.enableAll();
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ ol.endItemList();
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+class MemberIndexList : public QList<MemberDef>
+{
+ public:
+ MemberIndexList() : QList<MemberDef>() {}
+ ~MemberIndexList() {}
+ int compareItems(GCI item1, GCI item2)
+ {
+ MemberDef *md1=(MemberDef *)item1;
+ MemberDef *md2=(MemberDef *)item2;
+ return stricmp(md1->name(),md2->name());
+ }
+};
+
+#define MEMBER_INDEX_ENTRIES 256
+
+static MemberIndexList g_memberIndexLetterUsed[CMHL_Total][MEMBER_INDEX_ENTRIES];
+static MemberIndexList g_fileIndexLetterUsed[FMHL_Total][MEMBER_INDEX_ENTRIES];
+static MemberIndexList g_namespaceIndexLetterUsed[NMHL_Total][MEMBER_INDEX_ENTRIES];
+
+static bool g_classIndexLetterUsed[CHL_Total][256];
+
+const int maxItemsBeforeQuickIndex = MAX_ITEMS_BEFORE_QUICK_INDEX;
+
+//----------------------------------------------------------------------------
+
+// strips w from s iff s starts with w
+bool stripWord(QCString &s,QCString w)
+{
+ bool success=FALSE;
+ if (s.left(w.length())==w)
+ {
+ success=TRUE;
+ s=s.right(s.length()-w.length());
+ }
+ return success;
+}
+
+//----------------------------------------------------------------------------
+// some quasi intelligent brief description abbreviator :^)
+QCString abbreviate(const char *s,const char *name)
+{
+ QCString scopelessName=name;
+ int i=scopelessName.findRev("::");
+ if (i!=-1) scopelessName=scopelessName.mid(i+2);
+ QCString result=s;
+ result=result.stripWhiteSpace();
+ // strip trailing .
+ if (!result.isEmpty() && result.at(result.length()-1)=='.')
+ result=result.left(result.length()-1);
+
+ // strip any predefined prefix
+ QStrList &briefDescAbbrev = Config_getList("ABBREVIATE_BRIEF");
+ const char *p = briefDescAbbrev.first();
+ while (p)
+ {
+ QCString s = p;
+ s.replace(QRegExp("\\$name"), scopelessName); // replace $name with entity name
+ s += " ";
+ stripWord(result,s);
+ p = briefDescAbbrev.next();
+ }
+
+ // capitalize first word
+ if (!result.isEmpty())
+ {
+ int c=result[0];
+ if (c>='a' && c<='z') c+='A'-'a';
+ result[0]=c;
+ }
+ return result;
+}
+
+//----------------------------------------------------------------------------
+
+static void startQuickIndexList(OutputList &ol,bool letterTabs=FALSE)
+{
+ bool fancyTabs = TRUE;
+ if (fancyTabs)
+ {
+ if (letterTabs)
+ {
+ ol.writeString(" <div id=\"navrow4\" class=\"tabs3\">\n");
+ }
+ else
+ {
+ ol.writeString(" <div id=\"navrow3\" class=\"tabs2\">\n");
+ }
+ ol.writeString(" <ul class=\"tablist\">\n");
+ }
+ else
+ {
+ ol.writeString(" <div class=\"qindex\">");
+ }
+}
+
+static void endQuickIndexList(OutputList &ol)
+{
+ bool fancyTabs = TRUE;
+ if (fancyTabs)
+ {
+ ol.writeString(" </ul>\n");
+ }
+ ol.writeString(" </div>\n");
+}
+
+static void startQuickIndexItem(OutputList &ol,const char *l,
+ bool hl,bool compact,bool &first)
+{
+ bool fancyTabs = TRUE;
+ if (!first && compact && !fancyTabs) ol.writeString(" | ");
+ first=FALSE;
+ if (fancyTabs)
+ {
+ ol.writeString(" <li");
+ if (hl) ol.writeString(" class=\"current\"");
+ ol.writeString("><a ");
+ }
+ else
+ {
+ if (!compact) ol.writeString("<li>");
+ if (hl && compact)
+ {
+ ol.writeString("<a class=\"qindexHL\" ");
+ }
+ else
+ {
+ ol.writeString("<a class=\"qindex\" ");
+ }
+ }
+ ol.writeString("href=\"");
+ ol.writeString(l);
+ ol.writeString("\">");
+ if (fancyTabs)
+ {
+ ol.writeString("<span>");
+ }
+}
+
+static void endQuickIndexItem(OutputList &ol)
+{
+ bool fancyTabs=TRUE;
+ if (fancyTabs) ol.writeString("</span>");
+ ol.writeString("</a>");
+ if (fancyTabs) ol.writeString("</li>\n");
+}
+
+
+static QCString fixSpaces(const QCString &s)
+{
+ return substitute(s," ","&#160;");
+}
+
+
+void startTitle(OutputList &ol,const char *fileName,Definition *def)
+{
+ ol.startHeaderSection();
+ if (def) def->writeSummaryLinks(ol);
+ ol.startTitleHead(fileName);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+}
+
+void endTitle(OutputList &ol,const char *fileName,const char *name)
+{
+ ol.popGeneratorState();
+ ol.endTitleHead(fileName,name);
+ ol.endHeaderSection();
+}
+
+void startFile(OutputList &ol,const char *name,const char *manName,
+ const char *title,HighlightedItem hli,bool additionalIndices,
+ const char *altSidebarName)
+{
+ static bool disableIndex = Config_getBool("DISABLE_INDEX");
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ ol.startFile(name,manName,title);
+ ol.startQuickIndices();
+ if (!disableIndex)
+ {
+ ol.writeQuickLinks(TRUE,hli);
+ }
+ if (!additionalIndices)
+ {
+ ol.endQuickIndices();
+ }
+ if (generateTreeView)
+ {
+ ol.writeSplitBar(altSidebarName ? altSidebarName : name);
+ }
+}
+
+void endFile(OutputList &ol,bool skipNavIndex)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool hasCustomFooter = !Config_getString("HTML_FOOTER").isEmpty();
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ if (!skipNavIndex)
+ {
+ ol.endContents();
+ if (generateTreeView)
+ {
+ ol.writeString("</div>\n");
+ ol.writeString(" <div id=\"nav-path\" class=\"navpath\">\n");
+ ol.writeString(" <ul>\n");
+ if (!hasCustomFooter)
+ {
+ ol.writeString(" <li class=\"footer\">");
+ ol.writeLogo();
+ ol.writeString("</li>\n");
+ ol.writeString(" </ul>\n");
+ ol.writeString(" </div>\n");
+ }
+ }
+ }
+ ol.writeFooter(); // write the footer
+ ol.popGeneratorState();
+ ol.endFile();
+}
+
+//----------------------------------------------------------------------------
+
+static bool classHasVisibleChildren(ClassDef *cd)
+{
+ bool vhdl=Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+
+ BaseClassList *bcl;
+
+ if (vhdl) // reverse baseClass/subClass relation
+ {
+ if (cd->baseClasses()==0) return FALSE;
+ bcl=cd->baseClasses();
+ }
+ else
+ {
+ if (cd->subClasses()==0) return FALSE;
+ bcl=cd->subClasses();
+ }
+
+ BaseClassListIterator bcli(*bcl);
+ for ( ; bcli.current() ; ++bcli)
+ {
+ if (bcli.current()->classDef->isVisibleInHierarchy())
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level,FTVHelp* ftv)
+{
+ static bool vhdl=Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+
+ if (bcl==0) return;
+ BaseClassListIterator bcli(*bcl);
+ bool started=FALSE;
+ for ( ; bcli.current() ; ++bcli)
+ {
+ ClassDef *cd=bcli.current()->classDef;
+ bool b;
+ if (vhdl)
+ {
+ b=hasVisibleRoot(cd->subClasses());
+ }
+ else
+ {
+ b=hasVisibleRoot(cd->baseClasses());
+ }
+
+ if (cd->isVisibleInHierarchy() && b) // hasVisibleRoot(cd->baseClasses()))
+ {
+ if (!started)
+ {
+ startIndexHierarchy(ol,level);
+ Doxygen::indexList.incContentsDepth();
+ if (ftv)
+ ftv->incContentsDepth();
+ started=TRUE;
+ }
+ ol.startIndexListItem();
+ //printf("Passed...\n");
+ bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd);
+ //printf("tree4: Has children %s: %d\n",cd->name().data(),hasChildren);
+ if (cd->isLinkable())
+ {
+ //printf("Writing class %s\n",cd->displayName().data());
+ ol.startIndexItem(cd->getReference(),cd->getOutputFileBase());
+ ol.parseText(cd->displayName());
+ ol.endIndexItem(cd->getReference(),cd->getOutputFileBase());
+ if (cd->isReference())
+ {
+ ol.startTypewriter();
+ ol.docify(" [external]");
+ ol.endTypewriter();
+ }
+ Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor());
+ if (ftv)
+ ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor());
+ }
+ else
+ {
+ ol.startIndexItem(0,0);
+ ol.parseText(cd->name());
+ ol.endIndexItem(0,0);
+ Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),0,0,0);
+ if (ftv)
+ ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0);
+ }
+ if (hasChildren)
+ {
+ //printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited);
+ bool wasVisited=cd->visited;
+ cd->visited=TRUE;
+ if (vhdl)
+ {
+ writeClassTree(ol,cd->baseClasses(),wasVisited,level+1,ftv);
+ }
+ else
+ {
+ writeClassTree(ol,cd->subClasses(),wasVisited,level+1,ftv);
+ }
+ }
+ ol.endIndexListItem();
+ }
+ }
+ if (started)
+ {
+ endIndexHierarchy(ol,level);
+ Doxygen::indexList.decContentsDepth();
+ if (ftv)
+ ftv->decContentsDepth();
+ }
+}
+
+
+//----------------------------------------------------------------------------
+/*! Generates HTML Help tree of classes */
+
+void writeClassTree(BaseClassList *cl,int level)
+{
+ if (cl==0) return;
+ BaseClassListIterator cli(*cl);
+ bool started=FALSE;
+ for ( ; cli.current() ; ++cli)
+ {
+ ClassDef *cd=cli.current()->classDef;
+ if (cd->isVisibleInHierarchy() && hasVisibleRoot(cd->baseClasses()))
+ //if (cd->isVisibleInHierarchy() && !cd->visited)
+ {
+ if (!started)
+ {
+ Doxygen::indexList.incContentsDepth();
+ started=TRUE;
+ }
+ bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
+ //printf("tree2: Has children %s: %d\n",cd->name().data(),hasChildren);
+ if (cd->isLinkable())
+ {
+ Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor());
+ }
+ if (hasChildren)
+ {
+ writeClassTree(cd->subClasses(),level+1);
+ }
+ cd->visited=TRUE;
+ }
+ }
+ if (started)
+ {
+ Doxygen::indexList.decContentsDepth();
+ }
+}
+
+//----------------------------------------------------------------------------
+/*! Generates HTML Help tree of classes */
+
+void writeClassTreeNode(ClassDef *cd,bool &started,int level)
+{
+ //printf("writeClassTreeNode(%s) visited=%d\n",cd->name().data(),cd->visited);
+ static bool vhdl=Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+
+ if (cd->isVisibleInHierarchy() && !cd->visited)
+ {
+ if (!started)
+ {
+ started=TRUE;
+ }
+ bool hasChildren = classHasVisibleChildren(cd);
+ //printf("node: Has children %s: %d\n",cd->name().data(),hasChildren);
+ if (cd->isLinkable())
+ {
+ Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor());
+ }
+ if (hasChildren)
+ {
+ if (vhdl)
+ {
+ writeClassTree(cd->baseClasses(),level+1);
+ }
+ else
+ {
+ writeClassTree(cd->subClasses(),level+1);
+ }
+ }
+ cd->visited=TRUE;
+ }
+}
+
+void writeClassTree(ClassList *cl,int level)
+{
+ if (cl==0) return;
+ ClassListIterator cli(*cl);
+ bool started=FALSE;
+ for ( cli.toFirst() ; cli.current() ; ++cli)
+ {
+ cli.current()->visited=FALSE;
+ }
+ for ( cli.toFirst() ; cli.current() ; ++cli)
+ {
+ writeClassTreeNode(cli.current(),started,level);
+ }
+}
+
+void writeClassTree(ClassSDict *d,int level)
+{
+ if (d==0) return;
+ ClassSDict::Iterator cli(*d);
+ bool started=FALSE;
+ for ( cli.toFirst() ; cli.current() ; ++cli)
+ {
+ cli.current()->visited=FALSE;
+ }
+ for ( cli.toFirst() ; cli.current() ; ++cli)
+ {
+ writeClassTreeNode(cli.current(),started,level);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FTVHelp* ftv)
+{
+ static bool vhdl=Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ ClassSDict::Iterator cli(*cl);
+ for (;cli.current(); ++cli)
+ {
+ ClassDef *cd=cli.current();
+ //printf("class %s hasVisibleRoot=%d isVisibleInHierarchy=%d\n",
+ // cd->name().data(),
+ // hasVisibleRoot(cd->baseClasses()),
+ // cd->isVisibleInHierarchy()
+ // );
+ bool b;
+ if (vhdl)
+ {
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
+ (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
+ {
+ continue;
+ }
+ b=!hasVisibleRoot(cd->subClasses());
+ }
+ else
+ {
+ b=!hasVisibleRoot(cd->baseClasses());
+ }
+
+ if (b) //filter on root classes
+ {
+ if (cd->isVisibleInHierarchy()) // should it be visible
+ {
+ if (!started)
+ {
+ startIndexHierarchy(ol,0);
+ Doxygen::indexList.incContentsDepth();
+ started=TRUE;
+ }
+ ol.startIndexListItem();
+ bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
+ //printf("list: Has children %s: %d\n",cd->name().data(),hasChildren);
+ if (cd->isLinkable())
+ {
+ //printf("Writing class %s isLinkable()=%d isLinkableInProject()=%d cd->templateMaster()=%p\n",
+ // cd->displayName().data(),cd->isLinkable(),cd->isLinkableInProject(),cd->templateMaster());
+ ol.startIndexItem(cd->getReference(),cd->getOutputFileBase());
+ ol.parseText(cd->displayName());
+ ol.endIndexItem(cd->getReference(),cd->getOutputFileBase());
+ if (cd->isReference())
+ {
+ ol.startTypewriter();
+ ol.docify(" [external]");
+ ol.endTypewriter();
+ }
+ Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor());
+ if (ftv)
+ ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor());
+ }
+ else
+ {
+ ol.startIndexItem(0,0);
+ ol.parseText(cd->displayName());
+ ol.endIndexItem(0,0);
+ Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),0,0,0);
+ if (ftv)
+ ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0);
+ }
+ if (vhdl && hasChildren)
+ {
+ writeClassTree(ol,cd->baseClasses(),cd->visited,1,ftv);
+ cd->visited=TRUE;
+ }
+ else if (hasChildren)
+ {
+ writeClassTree(ol,cd->subClasses(),cd->visited,1,ftv);
+ cd->visited=TRUE;
+ }
+ ol.endIndexListItem();
+ }
+ }
+ }
+}
+
+void writeClassHierarchy(OutputList &ol, FTVHelp* ftv)
+{
+ initClassHierarchy(Doxygen::classSDict);
+ initClassHierarchy(Doxygen::hiddenClasses);
+ if (ftv)
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ }
+ bool started=FALSE;
+ writeClassTreeForList(ol,Doxygen::classSDict,started,ftv);
+ writeClassTreeForList(ol,Doxygen::hiddenClasses,started,ftv);
+ if (started)
+ {
+ endIndexHierarchy(ol,0);
+ Doxygen::indexList.decContentsDepth();
+ }
+ if (ftv)
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+static int countClassesInTreeList(const ClassSDict &cl)
+{
+ int count=0;
+ ClassSDict::Iterator cli(cl);
+ for (;cli.current(); ++cli)
+ {
+ ClassDef *cd=cli.current();
+ if (!hasVisibleRoot(cd->baseClasses())) // filter on root classes
+ {
+ if (cd->isVisibleInHierarchy()) // should it be visible
+ {
+ if (cd->subClasses()) // should have sub classes
+ {
+ count++;
+ }
+ }
+ }
+ }
+ return count;
+}
+
+int countClassHierarchy()
+{
+ int count=0;
+ initClassHierarchy(Doxygen::classSDict);
+ initClassHierarchy(Doxygen::hiddenClasses);
+ count+=countClassesInTreeList(*Doxygen::classSDict);
+ count+=countClassesInTreeList(*Doxygen::hiddenClasses);
+ return count;
+}
+
+//----------------------------------------------------------------------------
+
+void writeHierarchicalIndex(OutputList &ol)
+{
+ if (hierarchyClasses==0) return;
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassHierarchy);
+ QCString title = lne->title();
+ startFile(ol,"hierarchy",0, title, HLI_Hierarchy);
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ Doxygen::indexList.addContentsItem(TRUE,title,0,"hierarchy",0);
+ if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY"))
+ {
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ ol.startParagraph();
+ ol.startTextLink("inherits",0);
+ ol.parseText(theTranslator->trGotoGraphicalHierarchy());
+ ol.endTextLink();
+ ol.endParagraph();
+ ol.enable(OutputGenerator::Latex);
+ ol.enable(OutputGenerator::RTF);
+ }
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+
+ FTVHelp* ftv = 0;
+ bool treeView=Config_getBool("USE_INLINE_TREES");
+ if (treeView)
+ {
+ ftv = new FTVHelp(FALSE);
+ }
+
+ writeClassHierarchy(ol,ftv);
+
+ if (ftv)
+ {
+ QGString outStr;
+ FTextStream t(&outStr);
+ ftv->generateTreeViewInline(t);
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeString(outStr);
+ ol.popGeneratorState();
+ delete ftv;
+ }
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+void writeGraphicalClassHierarchy(OutputList &ol)
+{
+ if (hierarchyClasses==0) return;
+ ol.disableAllBut(OutputGenerator::Html);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassHierarchy);
+ QCString title = lne->title();
+ startFile(ol,"inherits",0,title,HLI_Hierarchy,FALSE,"hierarchy");
+ startTitle(ol,0);
+ //if (!Config_getString("PROJECT_NAME").isEmpty())
+ //{
+ // title.prepend(Config_getString("PROJECT_NAME")+" ");
+ //}
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ //Doxygen::indexList.addContentsItem(FALSE,theTranslator->trGraphicalHierarchy(),0,"inherits",0);
+ ol.startParagraph();
+ ol.startTextLink("hierarchy",0);
+ ol.parseText(theTranslator->trGotoTextualHierarchy());
+ ol.endTextLink();
+ ol.endParagraph();
+ //parseText(ol,theTranslator->trClassHierarchyDescription());
+ //ol.newParagraph();
+ ol.endTextBlock();
+ DotGfxHierarchyTable g;
+ ol.writeGraphicalHierarchy(g);
+ endFile(ol);
+ ol.enableAll();
+}
+
+//----------------------------------------------------------------------------
+
+void countFiles(int &htmlFiles,int &files)
+{
+ htmlFiles=0;
+ files=0;
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ bool doc = fd->isLinkableInProject();
+ bool src = fd->generateSourceFile();
+ bool nameOk = !fd->isDocumentationFile();
+ if (nameOk)
+ {
+ if (doc || src)
+ {
+ htmlFiles++;
+ }
+ if (doc)
+ {
+ files++;
+ }
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void writeFileIndex(OutputList &ol)
+{
+ if (documentedHtmlFiles==0) return;
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ if (documentedFiles==0) ol.disableAllBut(OutputGenerator::Html);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files);
+ QCString title = lne->title();
+ startFile(ol,"files",0,title,HLI_Files);
+ startTitle(ol,0);
+ //if (!Config_getString("PROJECT_NAME").isEmpty())
+ //{
+ // title.prepend(Config_getString("PROJECT_NAME")+" ");
+ //}
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ Doxygen::indexList.addContentsItem(TRUE,title,0,"files",0);
+ Doxygen::indexList.incContentsDepth();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+
+ OutputNameDict outputNameDict(1009);
+ OutputNameList outputNameList;
+ outputNameList.setAutoDelete(TRUE);
+
+ if (Config_getBool("FULL_PATH_NAMES"))
+ {
+ // re-sort input files in (dir,file) output order instead of (file,dir) input order
+ FileName *fn=Doxygen::inputNameList->first();
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ QCString path=fd->getPath();
+ if (path.isEmpty()) path="[external]";
+ FileList *fl = outputNameDict.find(path);
+ if (fl)
+ {
+ fl->inSort(fd);
+ //printf("+ inserting %s---%s\n",fd->getPath().data(),fd->name().data());
+ }
+ else
+ {
+ //printf("o inserting %s---%s\n",fd->getPath().data(),fd->name().data());
+ fl = new FileList(path);
+ fl->inSort(fd);
+ outputNameList.inSort(fl);
+ outputNameDict.insert(path,fl);
+ }
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ }
+
+ ol.startIndexList();
+ FileList *fl=0;
+ if (Config_getBool("FULL_PATH_NAMES"))
+ {
+ fl = outputNameList.first();
+ }
+ else
+ {
+ fl = Doxygen::inputNameList->first();
+ }
+ while (fl)
+ {
+ FileDef *fd=fl->first();
+ while (fd)
+ {
+ //printf("Found filedef %s\n",fd->name().data());
+ bool doc = fd->isLinkableInProject();
+ bool src = fd->generateSourceFile();
+ bool nameOk = !fd->isDocumentationFile();
+ if (nameOk && (doc || src) &&
+ !fd->isReference())
+ {
+ QCString path;
+ if (Config_getBool("FULL_PATH_NAMES"))
+ {
+ path=stripFromPath(fd->getPath().copy());
+ }
+ QCString fullName=fd->name();
+ if (!path.isEmpty())
+ {
+ if (path.at(path.length()-1)!='/') fullName.prepend("/");
+ fullName.prepend(path);
+ }
+
+ ol.startIndexKey();
+ ol.docify(path);
+ if (doc)
+ {
+ ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name());
+ Doxygen::indexList.addContentsItem(FALSE,fullName,fd->getReference(),fd->getOutputFileBase(),0);
+ }
+ else
+ {
+ ol.startBold();
+ ol.docify(fd->name());
+ ol.endBold();
+ Doxygen::indexList.addContentsItem(FALSE,fullName,0,0,0);
+ }
+ if (src)
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.docify(" ");
+ ol.startTextLink(fd->includeName(),0);
+ ol.docify("[");
+ ol.parseText(theTranslator->trCode());
+ ol.docify("]");
+ ol.endTextLink();
+ ol.popGeneratorState();
+ }
+ ol.endIndexKey();
+ bool hasBrief = !fd->briefDescription().isEmpty();
+ ol.startIndexValue(hasBrief);
+ if (hasBrief)
+ {
+ //ol.docify(" (");
+ ol.parseDoc(
+ fd->briefFile(),fd->briefLine(),
+ fd,0,
+ abbreviate(fd->briefDescription(),fd->name()),
+ FALSE, // index words
+ FALSE, // isExample
+ 0, // example name
+ TRUE, // single line
+ TRUE // link from index
+ );
+ //ol.docify(")");
+ }
+ ol.endIndexValue(fd->getOutputFileBase(),hasBrief);
+ //ol.popGeneratorState();
+ // --------------------------------------------------------
+ }
+ fd=fl->next();
+ }
+ if (Config_getBool("FULL_PATH_NAMES"))
+ {
+ fl=outputNameList.next();
+ }
+ else
+ {
+ fl=Doxygen::inputNameList->next();
+ }
+ }
+ ol.endIndexList();
+ Doxygen::indexList.decContentsDepth();
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+int countNamespaces()
+{
+ int count=0;
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for (;(nd=nli.current());++nli)
+ {
+ if (nd->isLinkableInProject()) count++;
+ }
+ return count;
+}
+
+//----------------------------------------------------------------------------
+
+void writeNamespaceIndex(OutputList &ol)
+{
+ if (documentedNamespaces==0) return;
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Namespaces);
+ QCString title = lne->title();
+ startFile(ol,"namespaces",0,title,HLI_Namespaces);
+ startTitle(ol,0);
+ //if (!Config_getString("PROJECT_NAME").isEmpty())
+ //{
+ // longTitle.prepend(Config_getString("PROJECT_NAME")+" ");
+ //}
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ Doxygen::indexList.addContentsItem(TRUE,title,0,"namespaces",0);
+ Doxygen::indexList.incContentsDepth();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+
+ bool first=TRUE;
+
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ if (nd->isLinkableInProject())
+ {
+ if (first)
+ {
+ ol.startIndexList();
+ first=FALSE;
+ }
+ //ol.writeStartAnnoItem("namespace",nd->getOutputFileBase(),0,nd->name());
+ ol.startIndexKey();
+ ol.writeObjectLink(0,nd->getOutputFileBase(),0,nd->displayName());
+ ol.endIndexKey();
+ bool hasBrief = !nd->briefDescription().isEmpty();
+ ol.startIndexValue(hasBrief);
+ if (hasBrief)
+ {
+ //ol.docify(" (");
+ ol.parseDoc(
+ nd->briefFile(),nd->briefLine(),
+ nd,0,
+ abbreviate(nd->briefDescription(),nd->displayName()),
+ FALSE, // index words
+ FALSE, // isExample
+ 0, // example name
+ TRUE, // single line
+ TRUE // link from index
+ );
+ //ol.docify(")");
+ }
+ ol.endIndexValue(nd->getOutputFileBase(),hasBrief);
+ //ol.writeEndAnnoItem(nd->getOutputFileBase());
+ Doxygen::indexList.addContentsItem(FALSE,nd->displayName(),nd->getReference(),nd->getOutputFileBase(),0);
+ }
+ }
+ if (!first) ol.endIndexList();
+ Doxygen::indexList.decContentsDepth();
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+int countAnnotatedClasses(int *cp)
+{
+ int count=0;
+ int countPrinted=0;
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for (;(cd=cli.current());++cli)
+ {
+ if (cd->isLinkableInProject() && cd->templateMaster()==0)
+ {
+ if (!cd->isEmbeddedInGroupDocs())
+ {
+ countPrinted++;
+ }
+ count++;
+ }
+ }
+ *cp = countPrinted;
+ return count;
+}
+
+
+//----------------------------------------------------------------------
+
+void writeAnnotatedClassList(OutputList &ol)
+{
+ ol.startIndexList();
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+
+ // clear index
+ int x,y;
+ for (y=0;y<CHL_Total;y++)
+ {
+ for (x=0;x<256;x++)
+ {
+ g_classIndexLetterUsed[y][x]=FALSE;
+ }
+ }
+
+ // see which elements are in use
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (cd->isLinkableInProject() && cd->templateMaster()==0)
+ {
+ QCString dispName = cd->displayName();
+ int c = dispName.at(getPrefixIndex(dispName));
+ g_classIndexLetterUsed[CHL_All][c]=TRUE;
+ switch(cd->compoundType())
+ {
+ case ClassDef::Class:
+ g_classIndexLetterUsed[CHL_Classes][c]=TRUE;
+ break;
+ case ClassDef::Struct:
+ g_classIndexLetterUsed[CHL_Structs][c]=TRUE;
+ break;
+ case ClassDef::Union:
+ g_classIndexLetterUsed[CHL_Unions][c]=TRUE;
+ break;
+ case ClassDef::Interface:
+ g_classIndexLetterUsed[CHL_Interfaces][c]=TRUE;
+ break;
+ case ClassDef::Protocol:
+ g_classIndexLetterUsed[CHL_Protocols][c]=TRUE;
+ break;
+ case ClassDef::Category:
+ g_classIndexLetterUsed[CHL_Categories][c]=TRUE;
+ break;
+ case ClassDef::Exception:
+ g_classIndexLetterUsed[CHL_Exceptions][c]=TRUE;
+ break;
+
+ }
+ }
+ }
+
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ ol.pushGeneratorState();
+ if (cd->isEmbeddedInGroupDocs())
+ {
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ }
+ if (cd->isLinkableInProject() && cd->templateMaster()==0)
+ {
+ QCString type=cd->compoundTypeString();
+ ol.startIndexKey();
+ static bool vhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ if (vhdl)
+ {
+ QCString prot= VhdlDocGen::getProtectionName((VhdlDocGen::VhdlClasses)cd->protection());
+ ol.docify(prot.data());
+ ol.writeString(" ");
+ ol.insertMemberAlign();
+ }
+ ol.writeObjectLink(0,cd->getOutputFileBase(),cd->anchor(),cd->displayName());
+ ol.endIndexKey();
+ bool hasBrief = !cd->briefDescription().isEmpty();
+ ol.startIndexValue(hasBrief);
+ if (hasBrief)
+ {
+ ol.parseDoc(
+ cd->briefFile(),cd->briefLine(),
+ cd,0,
+ abbreviate(cd->briefDescription(),cd->displayName()),
+ FALSE, // indexWords
+ FALSE, // isExample
+ 0, // example name
+ TRUE, // single line
+ TRUE // link from index
+ );
+ }
+ ol.endIndexValue(cd->getOutputFileBase(),hasBrief);
+ //ol.writeEndAnnoItem(cd->getOutputFileBase());
+ Doxygen::indexList.addContentsItem(FALSE,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor());
+ }
+ ol.popGeneratorState();
+ }
+ ol.endIndexList();
+}
+
+static QCString letterToLabel(char startLetter)
+{
+ QCString s(5);
+ if (isId(startLetter))
+ {
+ s[0]=startLetter; s[1]=0;
+ }
+ else
+ {
+ const char hex[]="0123456789abcdef";
+ s[0]='0';
+ s[1]='x';
+ s[2]=hex[startLetter>>4];
+ s[3]=hex[startLetter&0xF];
+ s[4]=0;
+ }
+ return s;
+}
+
+//----------------------------------------------------------------------------
+
+class PrefixIgnoreClassList : public ClassList
+{
+public:
+ virtual int compareItems(GCI item1, GCI item2)
+ {
+ ClassDef *c1=(ClassDef *)item1;
+ ClassDef *c2=(ClassDef *)item2;
+
+ QCString n1 = c1->className();
+ n1.remove (0, getPrefixIndex(n1));
+ QCString n2 = c2->className();
+ n2.remove (0, getPrefixIndex(n2));
+
+ return stricmp (n1, n2);
+ }
+};
+
+// write an alphabetical index of all class with a header for each letter
+void writeAlphabeticalClassList(OutputList &ol)
+{
+ //ol.startAlphabeticalIndexList();
+ // What starting letters are used
+ bool indexLetterUsed[256];
+ memset (indexLetterUsed, 0, sizeof (indexLetterUsed));
+
+ // first count the number of headers
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ uint startLetter=0;
+ int headerItems=0;
+ for (;(cd=cli.current());++cli)
+ {
+ if (cd->isLinkableInProject() && cd->templateMaster()==0)
+ {
+ int index = getPrefixIndex(cd->className());
+ //printf("name=%s index=%d\n",cd->className().data(),index);
+ startLetter=toupper(cd->className().at(index))&0xFF;
+ indexLetterUsed[startLetter] = true;
+ }
+ }
+
+ QCString alphaLinks = "<div class=\"qindex\">";
+ int l;
+ for (l = 0; l < 256; l++)
+ {
+ if (indexLetterUsed[l])
+ {
+ if (headerItems) alphaLinks += "&#160;|&#160;";
+ headerItems++;
+ alphaLinks += (QCString)"<a class=\"qindex\" href=\"#letter_" +
+ (char)l + "\">" +
+ (char)l + "</a>";
+ }
+ }
+
+ alphaLinks += "</div>\n";
+ ol.writeString(alphaLinks);
+
+ ol.writeString("<table align=\"center\" width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
+
+ // the number of columns in the table
+ const int columns = Config_getInt("COLS_IN_ALPHA_INDEX");
+
+ int i,j;
+ int totalItems = headerItems + annotatedClasses; // number of items in the table
+ int rows = (totalItems + columns - 1)/columns; // number of rows in the table
+ int itemsInLastRow = (totalItems + columns -1)%columns + 1; // number of items in the last row
+
+ //printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n",
+ // headerItems,totalItems,columns,rows,itemsInLastRow);
+
+ // Keep a list of classes for each starting letter
+ PrefixIgnoreClassList classesByLetter[256];
+
+ // fill the columns with the class list (row elements in each column,
+ // expect for the columns with number >= itemsInLastRow, which get on
+ // item less.
+ //int icount=0;
+ startLetter=0;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (cd->isLinkableInProject() && cd->templateMaster()==0)
+ {
+ int index = getPrefixIndex(cd->className());
+ startLetter=toupper(cd->className().at(index))&0xFF;
+ // Do some sorting again, since the classes are sorted by name with
+ // prefix, which should be ignored really.
+ classesByLetter[startLetter].inSort (cd);
+ }
+ }
+
+ // create one class list for each column
+ ClassList *colList = new ClassList[columns];
+
+ // fill the columns with the class list (row elements in each column,
+ // expect for the columns with number >= itemsInLastRow, which get on
+ // item less.
+ int col=0,row=0;
+ //int icount=0;
+ startLetter=0;
+ for (l = 0; l < 256; l++)
+ {
+ if (!indexLetterUsed[l]) continue;
+
+ // insert a new header using a dummy class pointer.
+ colList[col].append((ClassDef *)8); // insert dummy for the header
+ row++;
+ if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1))
+ {
+ // if the header is the last item in the row, we add an extra
+ // row to make it easier to find the text of the header (this
+ // is then contained in the next cell)
+ colList[col].append(classesByLetter[l].at (0));
+ col++;
+ row=0;
+ }
+ uint i;
+ for (i = 0; i < classesByLetter[l].count(); i++)
+ {
+ // add the class definition to the correct column list
+ colList[col].append (classesByLetter[l].at (i));
+ row++;
+ if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1)) { col++; row=0; }
+ }
+ }
+
+ // create iterators for each column
+ ClassListIterator **colIterators = new ClassListIterator*[columns];
+ for (i=0;i<columns;i++)
+ {
+ colIterators[i] = new ClassListIterator(colList[i]);
+ }
+
+ // generate table
+ for (i=0;i<rows;i++) // foreach table row
+ {
+ //ol.nextTableRow();
+ ol.writeString("<tr>");
+ // the last column may contain less items then the others
+ int colsInRow = (i<rows-1) ? columns : itemsInLastRow;
+ //printf("row [%d]\n",i);
+ for (j=0;j<colsInRow;j++) // foreach table column
+ {
+ ol.writeString("<td>");
+ ClassDef *cd = colIterators[j]->current();
+ //printf("columns [%d] cd=%p\n",j,cd);
+ if (cd==(ClassDef *)8) // the class pointer is really a header
+ {
+ cd=++(*colIterators[j]); // get the next item
+ if (cd)
+ {
+ //printf("head ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
+ int index = getPrefixIndex(cd->className());
+ startLetter=toupper(cd->className().at(index));
+ QCString s = letterToLabel(startLetter);
+ //ol.writeIndexHeading(s);
+ ol.writeString("<a name=\"letter_");
+ ol.writeString(s);
+ ol.writeString("\"></a>");
+ ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
+ "<tr>"
+ "<td><div class=\"ah\">&#160;&#160;");
+ ol.writeString(s);
+ ol.writeString( "&#160;&#160;</div>"
+ "</td>"
+ "</tr>"
+ "</table>\n");
+
+ }
+ }
+ else if (cd) // a real class, insert a link
+ {
+ QCString namesp,cname;
+ //if (cd->getNamespaceDef()) namesp=cd->getNamespaceDef()->displayName();
+ //QCString cname=cd->className();
+ extractNamespaceName(cd->name(),cname,namesp);
+ QCString nsDispName;
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ nsDispName=substitute(namesp,"::",".");
+ }
+ else
+ {
+ nsDispName=namesp.copy();
+ }
+ if (cname.right(2)=="-g" || cname.right(2)=="-p")
+ {
+ cname = cname.left(cname.length()-2);
+ }
+
+ ol.writeObjectLink(cd->getReference(),
+ cd->getOutputFileBase(),cd->anchor(),cname);
+ if (!namesp.isEmpty())
+ {
+ ol.docify(" (");
+ NamespaceDef *nd = getResolvedNamespace(namesp);
+ if (nd && nd->isLinkable())
+ {
+ ol.writeObjectLink(nd->getReference(),
+ nd->getOutputFileBase(),0,nsDispName);
+ }
+ else
+ {
+ ol.docify(nsDispName);
+ }
+ ol.docify(")");
+ }
+ ol.writeNonBreakableSpace(3);
+ //printf("item ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
+ ++(*colIterators[j]);
+ }
+ //ol.endTableColumn();
+ ol.writeString("</td>");
+ //if (j<colsInRow-1) ol.nextTableColumn();
+ }
+ //ol.endTableRow();
+ ol.writeString("</tr>");
+ }
+ //ol.endAlphabeticalIndexList();
+ ol.writeString("</table>");
+
+ ol.writeString(alphaLinks);
+
+ // release the temporary memory
+ for (i=0;i<columns;i++)
+ {
+ delete colIterators[i];
+ }
+ delete[] colIterators;
+ delete[] colList;
+}
+
+//----------------------------------------------------------------------------
+
+void writeAlphabeticalIndex(OutputList &ol)
+{
+ if (annotatedClasses==0) return;
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Classes);
+ QCString title = lne->title();
+ startFile(ol,"classes",0,title,HLI_Classes);
+ startTitle(ol,0);
+ ol.parseText(title);
+ Doxygen::indexList.addContentsItem(TRUE,title,0,"classes",0);
+ //ol.parseText(/*Config_getString("PROJECT_NAME")+" "+*/
+ // (fortranOpt ? theTranslator->trCompoundIndexFortran() :
+ // vhdlOpt ? VhdlDocGen::trDesignUnitIndex() :
+ // theTranslator->trCompoundIndex()
+ // ));
+ endTitle(ol,0,0);
+ ol.startContents();
+ writeAlphabeticalClassList(ol);
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+void writeAnnotatedIndex(OutputList &ol)
+{
+ //printf("writeAnnotatedIndex: count=%d printed=%d\n",
+ // annotatedClasses,annotatedClassesPrinted);
+ if (annotatedClasses==0) return;
+
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ if (annotatedClassesPrinted==0)
+ {
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ }
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassAnnotated);
+ QCString title = lne->title();
+ startFile(ol,"annotated",0,title,HLI_Annotated);
+ startTitle(ol,0);
+ //QCString longTitle = title;
+ //if (!Config_getString("PROJECT_NAME").isEmpty())
+ //{
+ // longTitle.prepend(Config_getString("PROJECT_NAME")+" ");
+ //}
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ Doxygen::indexList.addContentsItem(TRUE,title,0,"annotated",0);
+ Doxygen::indexList.incContentsDepth();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+ writeAnnotatedClassList(ol);
+ Doxygen::indexList.decContentsDepth();
+
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+static void writeClassLinkForMember(OutputList &ol,MemberDef *md,const char *separator,
+ QCString &prevClassName)
+{
+ ClassDef *cd=md->getClassDef();
+ if ( cd && prevClassName!=cd->displayName())
+ {
+ ol.docify(separator);
+ ol.writeObjectLink(md->getReference(),md->getOutputFileBase(),md->anchor(),
+ cd->displayName());
+ ol.writeString("\n");
+ prevClassName = cd->displayName();
+ }
+}
+
+static void writeFileLinkForMember(OutputList &ol,MemberDef *md,const char *separator,
+ QCString &prevFileName)
+{
+ FileDef *fd=md->getFileDef();
+ if (fd && prevFileName!=fd->name())
+ {
+ ol.docify(separator);
+ ol.writeObjectLink(md->getReference(),md->getOutputFileBase(),md->anchor(),
+ fd->name());
+ ol.writeString("\n");
+ prevFileName = fd->name();
+ }
+}
+
+static void writeNamespaceLinkForMember(OutputList &ol,MemberDef *md,const char *separator,
+ QCString &prevNamespaceName)
+{
+ NamespaceDef *nd=md->getNamespaceDef();
+ if (nd && prevNamespaceName!=nd->name())
+ {
+ ol.docify(separator);
+ ol.writeObjectLink(md->getReference(),md->getOutputFileBase(),md->anchor(),
+ nd->name());
+ ol.writeString("\n");
+ prevNamespaceName = nd->name();
+ }
+}
+
+static void writeMemberList(OutputList &ol,bool useSections,int page,
+ MemberIndexList memberLists[MEMBER_INDEX_ENTRIES],
+ DefinitionIntf::DefType type)
+{
+ int pi;
+ // page==-1 => write all member indices to one page (used when total members is small)
+ // page!=-1 => write all member for this page only (used when total member is large)
+ int startIndex = page==-1 ? 0 : page;
+ int endIndex = page==-1 ? MEMBER_INDEX_ENTRIES-1 : page;
+ ASSERT((int)type<3);
+
+ typedef void (*writeLinkForMember_t)(OutputList &ol,MemberDef *md,const char *separator,
+ QCString &prevNamespaceName);
+
+ // each index tab has its own write function
+ static writeLinkForMember_t writeLinkForMemberMap[3] =
+ {
+ &writeClassLinkForMember,
+ &writeFileLinkForMember,
+ &writeNamespaceLinkForMember
+ };
+ QCString prevName;
+ QCString prevDefName;
+ bool first=TRUE;
+ bool firstSection=TRUE;
+ bool firstItem=TRUE;
+ for (pi=startIndex; pi<=endIndex; pi++) // page==-1 => pi=[0..127], page!=-1 => pi=page
+ {
+ MemberIndexList *ml = &memberLists[pi];
+ if (ml->count()==0) continue;
+ ml->sort();
+ QListIterator<MemberDef> mli(*ml);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ const char *sep;
+ bool isFunc=!md->isObjCMethod() &&
+ (md->isFunction() || md->isSlot() || md->isSignal());
+ QCString name=md->name();
+ int startIndex = getPrefixIndex(name);
+ if (QCString(name.data()+startIndex)!=prevName) // new entry
+ {
+ if ((prevName.isEmpty() ||
+ tolower(name.at(startIndex))!=tolower(prevName.at(0))) &&
+ useSections) // new section
+ {
+ if (!firstItem) ol.endItemListItem();
+ if (!firstSection) ol.endItemList();
+ char cl[2];
+ cl[0] = tolower(name.at(startIndex));
+ cl[1] = 0;
+ QCString cs = letterToLabel(cl[0]);
+ QCString anchor=(QCString)"index_"+cs;
+ QCString title=(QCString)"- "+cl+" -";
+ ol.startSection(anchor,title,SectionInfo::Subsection);
+ ol.docify(title);
+ ol.endSection(anchor,SectionInfo::Subsection);
+ ol.startItemList();
+ firstSection=FALSE;
+ firstItem=TRUE;
+ }
+ else if (!useSections && first)
+ {
+ ol.startItemList();
+ first=FALSE;
+ }
+
+ // member name
+ if (!firstItem) ol.endItemListItem();
+ ol.startItemListItem();
+ firstItem=FALSE;
+ ol.docify(name);
+ if (isFunc) ol.docify("()");
+ ol.writeString("\n");
+
+ // link to class
+ prevDefName="";
+ sep = ": ";
+ prevName = name.data()+startIndex;
+ }
+ else // same entry
+ {
+ sep = ", ";
+ // link to class for other members with the same name
+ }
+ // write the link for the specific list type
+ writeLinkForMemberMap[(int)type](ol,md,sep,prevDefName);
+ }
+ }
+ if (!firstItem) ol.endItemListItem();
+ ol.endItemList();
+}
+
+//----------------------------------------------------------------------------
+
+void initClassMemberIndices()
+{
+ int i=0;
+ int j=0;
+ for (j=0;j<CMHL_Total;j++)
+ {
+ documentedClassMembers[j]=0;
+ for (i=0;i<MEMBER_INDEX_ENTRIES;i++)
+ {
+ g_memberIndexLetterUsed[j][i].clear();
+ }
+ }
+}
+
+void addClassMemberNameToIndex(MemberDef *md)
+{
+ static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ ClassDef *cd=0;
+
+ if (vhdlOpt && (VhdlDocGen::isRecord(md) || VhdlDocGen::isUnit(md)))
+ {
+ VhdlDocGen::adjustRecordMember(md);
+ }
+
+ if (md->isLinkableInProject() &&
+ (cd=md->getClassDef()) &&
+ cd->isLinkableInProject() &&
+ cd->templateMaster()==0)
+ {
+ QCString n = md->name();
+ int index = getPrefixIndex(n);
+ uchar charCode = (uchar)n.at(index);
+ uint letter = charCode<128 ? tolower(charCode) : charCode;
+ if (!n.isEmpty())
+ {
+ bool isFriendToHide = hideFriendCompounds &&
+ (QCString(md->typeString())=="friend class" ||
+ QCString(md->typeString())=="friend struct" ||
+ QCString(md->typeString())=="friend union");
+ if (!(md->isFriend() && isFriendToHide))
+ {
+ g_memberIndexLetterUsed[CMHL_All][letter].append(md);
+ documentedClassMembers[CMHL_All]++;
+ }
+ if (md->isFunction() || md->isSlot() || md->isSignal())
+ {
+ g_memberIndexLetterUsed[CMHL_Functions][letter].append(md);
+ documentedClassMembers[CMHL_Functions]++;
+ }
+ else if (md->isVariable())
+ {
+ g_memberIndexLetterUsed[CMHL_Variables][letter].append(md);
+ documentedClassMembers[CMHL_Variables]++;
+ }
+ else if (md->isTypedef())
+ {
+ g_memberIndexLetterUsed[CMHL_Typedefs][letter].append(md);
+ documentedClassMembers[CMHL_Typedefs]++;
+ }
+ else if (md->isEnumerate())
+ {
+ g_memberIndexLetterUsed[CMHL_Enums][letter].append(md);
+ documentedClassMembers[CMHL_Enums]++;
+ }
+ else if (md->isEnumValue())
+ {
+ g_memberIndexLetterUsed[CMHL_EnumValues][letter].append(md);
+ documentedClassMembers[CMHL_EnumValues]++;
+ }
+ else if (md->isProperty())
+ {
+ g_memberIndexLetterUsed[CMHL_Properties][letter].append(md);
+ documentedClassMembers[CMHL_Properties]++;
+ }
+ else if (md->isEvent())
+ {
+ g_memberIndexLetterUsed[CMHL_Events][letter].append(md);
+ documentedClassMembers[CMHL_Events]++;
+ }
+ else if (md->isRelated() || md->isForeign() ||
+ (md->isFriend() && !isFriendToHide))
+ {
+ g_memberIndexLetterUsed[CMHL_Related][letter].append(md);
+ documentedClassMembers[CMHL_Related]++;
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void initNamespaceMemberIndices()
+{
+ int i=0;
+ int j=0;
+ for (j=0;j<NMHL_Total;j++)
+ {
+ documentedNamespaceMembers[j]=0;
+ for (i=0;i<MEMBER_INDEX_ENTRIES;i++)
+ {
+ g_namespaceIndexLetterUsed[j][i].clear();
+ }
+ }
+}
+
+void addNamespaceMemberNameToIndex(MemberDef *md)
+{
+ NamespaceDef *nd=md->getNamespaceDef();
+ if (nd && nd->isLinkableInProject() && md->isLinkableInProject())
+ {
+ QCString n = md->name();
+ int index = getPrefixIndex(n);
+ uchar charCode = (uchar)n.at(index);
+ uint letter = charCode<128 ? tolower(charCode) : charCode;
+ if (!n.isEmpty())
+ {
+ g_namespaceIndexLetterUsed[NMHL_All][letter].append(md);
+ documentedNamespaceMembers[NMHL_All]++;
+
+ if (md->isFunction())
+ {
+ g_namespaceIndexLetterUsed[NMHL_Functions][letter].append(md);
+ documentedNamespaceMembers[NMHL_Functions]++;
+ }
+ else if (md->isVariable())
+ {
+ g_namespaceIndexLetterUsed[NMHL_Variables][letter].append(md);
+ documentedNamespaceMembers[NMHL_Variables]++;
+ }
+ else if (md->isTypedef())
+ {
+ g_namespaceIndexLetterUsed[NMHL_Typedefs][letter].append(md);
+ documentedNamespaceMembers[NMHL_Typedefs]++;
+ }
+ else if (md->isEnumerate())
+ {
+ g_namespaceIndexLetterUsed[NMHL_Enums][letter].append(md);
+ documentedNamespaceMembers[NMHL_Enums]++;
+ }
+ else if (md->isEnumValue())
+ {
+ g_namespaceIndexLetterUsed[NMHL_EnumValues][letter].append(md);
+ documentedNamespaceMembers[NMHL_EnumValues]++;
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void initFileMemberIndices()
+{
+ int i=0;
+ int j=0;
+ for (j=0;j<NMHL_Total;j++)
+ {
+ documentedFileMembers[j]=0;
+ for (i=0;i<MEMBER_INDEX_ENTRIES;i++)
+ {
+ g_fileIndexLetterUsed[j][i].clear();
+ }
+ }
+}
+
+void addFileMemberNameToIndex(MemberDef *md)
+{
+ FileDef *fd=md->getFileDef();
+ if (fd && fd->isLinkableInProject() && md->isLinkableInProject())
+ {
+ QCString n = md->name();
+ int index = getPrefixIndex(n);
+ uchar charCode = (uchar)n.at(index);
+ uint letter = charCode<128 ? tolower(charCode) : charCode;
+ if (!n.isEmpty())
+ {
+ g_fileIndexLetterUsed[FMHL_All][letter].append(md);
+ documentedFileMembers[FMHL_All]++;
+
+ if (md->isFunction())
+ {
+ g_fileIndexLetterUsed[FMHL_Functions][letter].append(md);
+ documentedFileMembers[FMHL_Functions]++;
+ }
+ else if (md->isVariable())
+ {
+ g_fileIndexLetterUsed[FMHL_Variables][letter].append(md);
+ documentedFileMembers[FMHL_Variables]++;
+ }
+ else if (md->isTypedef())
+ {
+ g_fileIndexLetterUsed[FMHL_Typedefs][letter].append(md);
+ documentedFileMembers[FMHL_Typedefs]++;
+ }
+ else if (md->isEnumerate())
+ {
+ g_fileIndexLetterUsed[FMHL_Enums][letter].append(md);
+ documentedFileMembers[FMHL_Enums]++;
+ }
+ else if (md->isEnumValue())
+ {
+ g_fileIndexLetterUsed[FMHL_EnumValues][letter].append(md);
+ documentedFileMembers[FMHL_EnumValues]++;
+ }
+ else if (md->isDefine())
+ {
+ g_fileIndexLetterUsed[FMHL_Defines][letter].append(md);
+ documentedFileMembers[FMHL_Defines]++;
+ }
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void writeQuickMemberIndex(OutputList &ol,
+ MemberIndexList charUsed[MEMBER_INDEX_ENTRIES],int page,
+ QCString fullName,bool multiPage)
+{
+ bool first=TRUE;
+ int i;
+ startQuickIndexList(ol,TRUE);
+ for (i=33;i<127;i++)
+ {
+ char is[2];is[0]=(char)i;is[1]='\0';
+ QCString ci = letterToLabel((char)i);
+ if (charUsed[i].count()>0)
+ {
+ QCString anchor;
+ QCString extension=Doxygen::htmlFileExtension;
+ if (!multiPage)
+ anchor="#index_";
+ else if (first)
+ anchor=fullName+extension+"#index_";
+ else
+ anchor=fullName+QCString().sprintf("_0x%02x",i)+extension+"#index_";
+ startQuickIndexItem(ol,anchor+ci,i==page,TRUE,first);
+ ol.writeString(is);
+ endQuickIndexItem(ol);
+ first=FALSE;
+ }
+ }
+ endQuickIndexList(ol);
+}
+
+//----------------------------------------------------------------------------
+
+struct CmhlInfo
+{
+ CmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {}
+ const char *fname;
+ QCString title;
+};
+
+static const CmhlInfo *getCmhlInfo(int hl)
+{
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ static CmhlInfo cmhlInfo[] =
+ {
+ CmhlInfo("functions", theTranslator->trAll()),
+ CmhlInfo("functions_func",
+ fortranOpt ? theTranslator->trSubprograms() :
+ vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
+ theTranslator->trFunctions()),
+ CmhlInfo("functions_vars",theTranslator->trVariables()),
+ CmhlInfo("functions_type",theTranslator->trTypedefs()),
+ CmhlInfo("functions_enum",theTranslator->trEnumerations()),
+ CmhlInfo("functions_eval",theTranslator->trEnumerationValues()),
+ CmhlInfo("functions_prop",theTranslator->trProperties()),
+ CmhlInfo("functions_evnt",theTranslator->trEvents()),
+ CmhlInfo("functions_rela",theTranslator->trRelatedFunctions())
+ };
+ return &cmhlInfo[hl];
+}
+
+static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight hl)
+{
+ if (documentedClassMembers[hl]==0) return;
+
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool disableIndex = Config_getBool("DISABLE_INDEX");
+
+ bool multiPageIndex=FALSE;
+ int numPages=1;
+ if (documentedClassMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX)
+ {
+ multiPageIndex=TRUE;
+ numPages=127;
+ }
+
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QCString extension=Doxygen::htmlFileExtension;
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassMembers);
+ QCString title = lne->title();
+ if (hl!=CMHL_All) title+=(QCString)" - "+getCmhlInfo(hl)->title;
+
+ int page;
+ bool first=TRUE;
+ for (page=0;page<numPages;page++)
+ {
+ if (!multiPageIndex || g_memberIndexLetterUsed[hl][page].count()>0)
+ {
+ QCString fileName = getCmhlInfo(hl)->fname;
+ if (multiPageIndex && !first)
+ {
+ fileName+=QCString().sprintf("_0x%02x",page);
+ }
+ bool quickIndex = documentedClassMembers[hl]>maxItemsBeforeQuickIndex;
+
+ ol.startFile(fileName+extension,0,title);
+ ol.startQuickIndices();
+ if (!disableIndex)
+ {
+ ol.writeQuickLinks(TRUE,HLI_Functions);
+ }
+ startQuickIndexList(ol);
+
+ // index item for global member list
+ startQuickIndexItem(ol,
+ getCmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==CMHL_All,TRUE,first);
+ ol.writeString(fixSpaces(getCmhlInfo(0)->title));
+ endQuickIndexItem(ol);
+
+ // index items per category member lists
+ int i;
+ for (i=1;i<CMHL_Total;i++)
+ {
+ if (documentedClassMembers[i]>0)
+ {
+ startQuickIndexItem(ol,getCmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first);
+ ol.writeString(fixSpaces(getCmhlInfo(i)->title));
+ //printf("multiPageIndex=%d first=%d fileName=%s file=%s title=%s\n",
+ // multiPageIndex,first,fileName.data(),getCmhlInfo(i)->fname,getCmhlInfo(i)->title.data());
+ endQuickIndexItem(ol);
+ }
+ }
+
+ endQuickIndexList(ol);
+
+ // quick alphabetical index
+ if (quickIndex)
+ {
+ writeQuickMemberIndex(ol,g_memberIndexLetterUsed[hl],page,
+ getCmhlInfo(hl)->fname,multiPageIndex);
+ }
+ ol.endQuickIndices();
+
+ if (generateTreeView)
+ {
+ ol.writeSplitBar(getCmhlInfo(0)->fname);
+ }
+
+ ol.startContents();
+
+ if (hl==CMHL_All)
+ {
+ ol.startTextBlock();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+ }
+ else
+ {
+ // hack to work around a mozilla bug, which refuses to switch to
+ // normal lists otherwise
+ ol.writeString("&#160;");
+ }
+ //ol.newParagraph(); // FIXME:PARA
+ writeMemberList(ol,quickIndex,
+ multiPageIndex?page:-1,
+ g_memberIndexLetterUsed[hl],
+ Definition::TypeClass);
+ endFile(ol);
+ first=FALSE;
+ }
+ }
+
+ ol.popGeneratorState();
+}
+
+void writeClassMemberIndex(OutputList &ol)
+{
+ //bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ writeClassMemberIndexFiltered(ol,CMHL_All);
+ writeClassMemberIndexFiltered(ol,CMHL_Functions);
+ writeClassMemberIndexFiltered(ol,CMHL_Variables);
+ writeClassMemberIndexFiltered(ol,CMHL_Typedefs);
+ writeClassMemberIndexFiltered(ol,CMHL_Enums);
+ writeClassMemberIndexFiltered(ol,CMHL_EnumValues);
+ writeClassMemberIndexFiltered(ol,CMHL_Properties);
+ writeClassMemberIndexFiltered(ol,CMHL_Events);
+ writeClassMemberIndexFiltered(ol,CMHL_Related);
+
+ if (documentedClassMembers[CMHL_All]>0)
+ {
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassMembers);
+ Doxygen::indexList.addContentsItem(FALSE,lne->title(),0,"functions",0);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+struct FmhlInfo
+{
+ FmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {}
+ const char *fname;
+ QCString title;
+};
+
+static const FmhlInfo *getFmhlInfo(int hl)
+{
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ static FmhlInfo fmhlInfo[] =
+ {
+ FmhlInfo("globals", theTranslator->trAll()),
+ FmhlInfo("globals_func",
+ fortranOpt ? theTranslator->trSubprograms() :
+ vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
+ theTranslator->trFunctions()),
+ FmhlInfo("globals_vars",theTranslator->trVariables()),
+ FmhlInfo("globals_type",theTranslator->trTypedefs()),
+ FmhlInfo("globals_enum",theTranslator->trEnumerations()),
+ FmhlInfo("globals_eval",theTranslator->trEnumerationValues()),
+ FmhlInfo("globals_defs",theTranslator->trDefines())
+ };
+ return &fmhlInfo[hl];
+}
+
+static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl)
+{
+ if (documentedFileMembers[hl]==0) return;
+
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ //static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ static bool disableIndex = Config_getBool("DISABLE_INDEX");
+
+ bool multiPageIndex=FALSE;
+ int numPages=1;
+ if (documentedFileMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX)
+ {
+ multiPageIndex=TRUE;
+ numPages=127;
+ }
+
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QCString extension=Doxygen::htmlFileExtension;
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::FileGlobals);
+ QCString title = lne->title();
+
+ int page;
+ bool first=TRUE;
+ for (page=0;page<numPages;page++)
+ {
+ if (!multiPageIndex || g_fileIndexLetterUsed[hl][page].count()>0)
+ {
+ QCString fileName = getFmhlInfo(hl)->fname;
+ if (multiPageIndex && !first)
+ {
+ fileName+=QCString().sprintf("_0x%02x",page);
+ }
+ bool quickIndex = documentedFileMembers[hl]>maxItemsBeforeQuickIndex;
+
+ ol.startFile(fileName+extension,0,title);
+ ol.startQuickIndices();
+ if (!disableIndex)
+ {
+ ol.writeQuickLinks(TRUE,HLI_Globals);
+ }
+ startQuickIndexList(ol);
+
+ // index item for all member lists
+ startQuickIndexItem(ol,
+ getFmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==FMHL_All,TRUE,first);
+ ol.writeString(fixSpaces(getFmhlInfo(0)->title));
+ endQuickIndexItem(ol);
+
+ int i;
+ // index items for per category member lists
+ for (i=1;i<FMHL_Total;i++)
+ {
+ if (documentedFileMembers[i]>0)
+ {
+ startQuickIndexItem(ol,
+ getFmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first);
+ ol.writeString(fixSpaces(getFmhlInfo(i)->title));
+ endQuickIndexItem(ol);
+ }
+ }
+
+ endQuickIndexList(ol);
+
+ if (quickIndex)
+ {
+ writeQuickMemberIndex(ol,g_fileIndexLetterUsed[hl],page,
+ getFmhlInfo(hl)->fname,multiPageIndex);
+ }
+ ol.endQuickIndices();
+
+ if (generateTreeView)
+ {
+ ol.writeSplitBar(getFmhlInfo(0)->fname);
+ }
+
+ ol.startContents();
+
+ if (hl==FMHL_All)
+ {
+ ol.startTextBlock();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+ }
+ else
+ {
+ // hack to work around a mozilla bug, which refuses to switch to
+ // normal lists otherwise
+ ol.writeString("&#160;");
+ }
+ //ol.newParagraph(); // FIXME:PARA
+ //writeFileMemberList(ol,quickIndex,hl,page);
+ writeMemberList(ol,quickIndex,
+ multiPageIndex?page:-1,
+ g_fileIndexLetterUsed[hl],
+ Definition::TypeFile);
+ endFile(ol);
+ first=FALSE;
+ }
+ }
+ ol.popGeneratorState();
+}
+
+void writeFileMemberIndex(OutputList &ol)
+{
+ writeFileMemberIndexFiltered(ol,FMHL_All);
+ writeFileMemberIndexFiltered(ol,FMHL_Functions);
+ writeFileMemberIndexFiltered(ol,FMHL_Variables);
+ writeFileMemberIndexFiltered(ol,FMHL_Typedefs);
+ writeFileMemberIndexFiltered(ol,FMHL_Enums);
+ writeFileMemberIndexFiltered(ol,FMHL_EnumValues);
+ writeFileMemberIndexFiltered(ol,FMHL_Defines);
+
+ if (documentedFileMembers[FMHL_All]>0)
+ {
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::FileGlobals);
+ Doxygen::indexList.addContentsItem(FALSE,lne->title(),0,"globals",0);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+struct NmhlInfo
+{
+ NmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {}
+ const char *fname;
+ QCString title;
+};
+
+static const NmhlInfo *getNmhlInfo(int hl)
+{
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ static NmhlInfo nmhlInfo[] =
+ {
+ NmhlInfo("namespacemembers", theTranslator->trAll()),
+ NmhlInfo("namespacemembers_func",
+ fortranOpt ? theTranslator->trSubprograms() :
+ vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
+ theTranslator->trFunctions()),
+ NmhlInfo("namespacemembers_vars",theTranslator->trVariables()),
+ NmhlInfo("namespacemembers_type",theTranslator->trTypedefs()),
+ NmhlInfo("namespacemembers_enum",theTranslator->trEnumerations()),
+ NmhlInfo("namespacemembers_eval",theTranslator->trEnumerationValues())
+ };
+ return &nmhlInfo[hl];
+}
+
+//----------------------------------------------------------------------------
+
+static void writeNamespaceMemberIndexFiltered(OutputList &ol,
+ NamespaceMemberHighlight hl)
+{
+ if (documentedNamespaceMembers[hl]==0) return;
+
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool disableIndex = Config_getBool("DISABLE_INDEX");
+
+ bool multiPageIndex=FALSE;
+ int numPages=1;
+ if (documentedNamespaceMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX)
+ {
+ multiPageIndex=TRUE;
+ numPages=127;
+ }
+
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QCString extension=Doxygen::htmlFileExtension;
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::NamespaceMembers);
+ QCString title = lne->title();
+
+ int page;
+ bool first=TRUE;
+ for (page=0;page<numPages;page++)
+ {
+ if (!multiPageIndex || g_namespaceIndexLetterUsed[hl][page].count()>0)
+ {
+ QCString fileName = getNmhlInfo(hl)->fname;
+ if (multiPageIndex && !first)
+ {
+ fileName+=QCString().sprintf("_0x%02x",page);
+ }
+ bool quickIndex = documentedNamespaceMembers[hl]>maxItemsBeforeQuickIndex;
+
+ ol.startFile(fileName+extension,0,title);
+ ol.startQuickIndices();
+ if (!disableIndex)
+ {
+ ol.writeQuickLinks(TRUE,HLI_NamespaceMembers);
+ }
+ startQuickIndexList(ol);
+
+ startQuickIndexItem(ol,
+ getNmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==NMHL_All,TRUE,first);
+ ol.writeString(fixSpaces(getNmhlInfo(0)->title));
+ endQuickIndexItem(ol);
+
+ int i;
+ for (i=1;i<NMHL_Total;i++)
+ {
+ if (documentedNamespaceMembers[i]>0)
+ {
+ startQuickIndexItem(ol,
+ getNmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first);
+ ol.writeString(fixSpaces(getNmhlInfo(i)->title));
+ endQuickIndexItem(ol);
+ }
+ }
+
+ endQuickIndexList(ol);
+
+ if (quickIndex)
+ {
+ writeQuickMemberIndex(ol,g_namespaceIndexLetterUsed[hl],page,
+ getNmhlInfo(hl)->fname,multiPageIndex);
+ }
+
+ ol.endQuickIndices();
+
+ if (generateTreeView)
+ {
+ ol.writeSplitBar(getNmhlInfo(0)->fname);
+ }
+
+ ol.startContents();
+
+ if (hl==NMHL_All)
+ {
+ ol.startTextBlock();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+ }
+ else
+ {
+ // hack to work around a mozilla bug, which refuses to switch to
+ // normal lists otherwise
+ ol.writeString("&#160;");
+ }
+ //ol.newParagraph(); // FIXME:PARA
+
+ //writeNamespaceMemberList(ol,quickIndex,hl,page);
+ writeMemberList(ol,quickIndex,
+ multiPageIndex?page:-1,
+ g_namespaceIndexLetterUsed[hl],
+ Definition::TypeNamespace);
+ endFile(ol);
+ }
+ }
+ ol.popGeneratorState();
+}
+
+void writeNamespaceMemberIndex(OutputList &ol)
+{
+ //bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ writeNamespaceMemberIndexFiltered(ol,NMHL_All);
+ writeNamespaceMemberIndexFiltered(ol,NMHL_Functions);
+ writeNamespaceMemberIndexFiltered(ol,NMHL_Variables);
+ writeNamespaceMemberIndexFiltered(ol,NMHL_Typedefs);
+ writeNamespaceMemberIndexFiltered(ol,NMHL_Enums);
+ writeNamespaceMemberIndexFiltered(ol,NMHL_EnumValues);
+
+ if (documentedNamespaceMembers[NMHL_All]>0)
+ {
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::NamespaceMembers);
+ Doxygen::indexList.addContentsItem(FALSE,lne->title(),0,"namespacemembers",0);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+#define NUM_SEARCH_INDICES 13
+#define SEARCH_INDEX_ALL 0
+#define SEARCH_INDEX_CLASSES 1
+#define SEARCH_INDEX_NAMESPACES 2
+#define SEARCH_INDEX_FILES 3
+#define SEARCH_INDEX_FUNCTIONS 4
+#define SEARCH_INDEX_VARIABLES 5
+#define SEARCH_INDEX_TYPEDEFS 6
+#define SEARCH_INDEX_ENUMS 7
+#define SEARCH_INDEX_ENUMVALUES 8
+#define SEARCH_INDEX_PROPERTIES 9
+#define SEARCH_INDEX_EVENTS 10
+#define SEARCH_INDEX_RELATED 11
+#define SEARCH_INDEX_DEFINES 12
+
+class SearchIndexList : public SDict< QList<Definition> >
+{
+ public:
+ SearchIndexList(int size=17) : SDict< QList<Definition> >(size,FALSE)
+ {
+ setAutoDelete(TRUE);
+ }
+ ~SearchIndexList() {}
+ void append(Definition *d)
+ {
+ QList<Definition> *l = find(d->name());
+ if (l==0)
+ {
+ l=new QList<Definition>;
+ SDict< QList<Definition> >::append(d->name(),l);
+ }
+ l->append(d);
+ }
+ int compareItems(GCI item1, GCI item2)
+ {
+ QList<Definition> *md1=(QList<Definition> *)item1;
+ QList<Definition> *md2=(QList<Definition> *)item2;
+ QCString n1 = md1->first()->localName();
+ QCString n2 = md2->first()->localName();
+ return stricmp(n1.data(),n2.data());
+ }
+};
+
+static void addMemberToSearchIndex(
+ SearchIndexList symbols[NUM_SEARCH_INDICES][MEMBER_INDEX_ENTRIES],
+ int symbolCount[NUM_SEARCH_INDICES],
+ MemberDef *md)
+{
+ static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS");
+ bool isLinkable = md->isLinkable();
+ ClassDef *cd=0;
+ NamespaceDef *nd=0;
+ FileDef *fd=0;
+ if (isLinkable &&
+ (cd=md->getClassDef()) &&
+ cd->isLinkable() &&
+ cd->templateMaster()==0)
+ {
+ QCString n = md->name();
+ uchar charCode = (uchar)n.at(0);
+ uint letter = charCode<128 ? tolower(charCode) : charCode;
+ if (!n.isEmpty())
+ {
+ bool isFriendToHide = hideFriendCompounds &&
+ (QCString(md->typeString())=="friend class" ||
+ QCString(md->typeString())=="friend struct" ||
+ QCString(md->typeString())=="friend union");
+ if (!(md->isFriend() && isFriendToHide))
+ {
+ symbols[SEARCH_INDEX_ALL][letter].append(md);
+ symbolCount[SEARCH_INDEX_ALL]++;
+ }
+ if (md->isFunction() || md->isSlot() || md->isSignal())
+ {
+ symbols[SEARCH_INDEX_FUNCTIONS][letter].append(md);
+ symbolCount[SEARCH_INDEX_FUNCTIONS]++;
+ }
+ else if (md->isVariable())
+ {
+ symbols[SEARCH_INDEX_VARIABLES][letter].append(md);
+ symbolCount[SEARCH_INDEX_VARIABLES]++;
+ }
+ else if (md->isTypedef())
+ {
+ symbols[SEARCH_INDEX_TYPEDEFS][letter].append(md);
+ symbolCount[SEARCH_INDEX_TYPEDEFS]++;
+ }
+ else if (md->isEnumerate())
+ {
+ symbols[SEARCH_INDEX_ENUMS][letter].append(md);
+ symbolCount[SEARCH_INDEX_ENUMS]++;
+ }
+ else if (md->isEnumValue())
+ {
+ symbols[SEARCH_INDEX_ENUMVALUES][letter].append(md);
+ symbolCount[SEARCH_INDEX_ENUMVALUES]++;
+ }
+ else if (md->isProperty())
+ {
+ symbols[SEARCH_INDEX_PROPERTIES][letter].append(md);
+ symbolCount[SEARCH_INDEX_PROPERTIES]++;
+ }
+ else if (md->isEvent())
+ {
+ symbols[SEARCH_INDEX_EVENTS][letter].append(md);
+ symbolCount[SEARCH_INDEX_EVENTS]++;
+ }
+ else if (md->isRelated() || md->isForeign() ||
+ (md->isFriend() && !isFriendToHide))
+ {
+ symbols[SEARCH_INDEX_RELATED][letter].append(md);
+ symbolCount[SEARCH_INDEX_RELATED]++;
+ }
+ }
+ }
+ else if (isLinkable &&
+ (((nd=md->getNamespaceDef()) && nd->isLinkable()) ||
+ ((fd=md->getFileDef()) && fd->isLinkable())
+ )
+ )
+ {
+ QCString n = md->name();
+ uchar charCode = (uchar)n.at(0);
+ uint letter = charCode<128 ? tolower(charCode) : charCode;
+ if (!n.isEmpty())
+ {
+ symbols[SEARCH_INDEX_ALL][letter].append(md);
+ symbolCount[SEARCH_INDEX_ALL]++;
+
+ if (md->isFunction())
+ {
+ symbols[SEARCH_INDEX_FUNCTIONS][letter].append(md);
+ symbolCount[SEARCH_INDEX_FUNCTIONS]++;
+ }
+ else if (md->isVariable())
+ {
+ symbols[SEARCH_INDEX_VARIABLES][letter].append(md);
+ symbolCount[SEARCH_INDEX_VARIABLES]++;
+ }
+ else if (md->isTypedef())
+ {
+ symbols[SEARCH_INDEX_TYPEDEFS][letter].append(md);
+ symbolCount[SEARCH_INDEX_TYPEDEFS]++;
+ }
+ else if (md->isEnumerate())
+ {
+ symbols[SEARCH_INDEX_ENUMS][letter].append(md);
+ symbolCount[SEARCH_INDEX_ENUMS]++;
+ }
+ else if (md->isEnumValue())
+ {
+ symbols[SEARCH_INDEX_ENUMVALUES][letter].append(md);
+ symbolCount[SEARCH_INDEX_ENUMVALUES]++;
+ }
+ else if (md->isDefine())
+ {
+ symbols[SEARCH_INDEX_DEFINES][letter].append(md);
+ symbolCount[SEARCH_INDEX_DEFINES]++;
+ }
+ }
+ }
+}
+
+static QCString searchId(const QCString &s)
+{
+ int c;
+ uint i;
+ QCString result;
+ for (i=0;i<s.length();i++)
+ {
+ c=s.at(i);
+ if ((c>='0' && c<='9') || (c>='A' && c<='Z') || (c>='a' && c<='z'))
+ {
+ result+=(char)tolower(c);
+ }
+ else
+ {
+ char val[4];
+ sprintf(val,"_%02x",(uchar)c);
+ result+=val;
+ }
+ }
+ return result;
+}
+
+static int g_searchIndexCount[NUM_SEARCH_INDICES];
+static SearchIndexList g_searchIndexSymbols[NUM_SEARCH_INDICES][MEMBER_INDEX_ENTRIES];
+static const char *g_searchIndexName[NUM_SEARCH_INDICES] =
+{
+ "all",
+ "classes",
+ "namespaces",
+ "files",
+ "functions",
+ "variables",
+ "typedefs",
+ "enums",
+ "enumvalues",
+ "properties",
+ "events",
+ "related",
+ "defines"
+};
+
+
+class SearchIndexCategoryMapping
+{
+ public:
+ SearchIndexCategoryMapping()
+ {
+ categoryLabel[SEARCH_INDEX_ALL] = theTranslator->trAll();
+ categoryLabel[SEARCH_INDEX_CLASSES] = theTranslator->trClasses();
+ categoryLabel[SEARCH_INDEX_NAMESPACES] = theTranslator->trNamespace(TRUE,FALSE);
+ categoryLabel[SEARCH_INDEX_FILES] = theTranslator->trFile(TRUE,FALSE);
+ categoryLabel[SEARCH_INDEX_FUNCTIONS] = theTranslator->trFunctions();
+ categoryLabel[SEARCH_INDEX_VARIABLES] = theTranslator->trVariables();
+ categoryLabel[SEARCH_INDEX_TYPEDEFS] = theTranslator->trTypedefs();
+ categoryLabel[SEARCH_INDEX_ENUMS] = theTranslator->trEnumerations();
+ categoryLabel[SEARCH_INDEX_ENUMVALUES] = theTranslator->trEnumerationValues();
+ categoryLabel[SEARCH_INDEX_PROPERTIES] = theTranslator->trProperties();
+ categoryLabel[SEARCH_INDEX_EVENTS] = theTranslator->trEvents();
+ categoryLabel[SEARCH_INDEX_RELATED] = theTranslator->trFriends();
+ categoryLabel[SEARCH_INDEX_DEFINES] = theTranslator->trDefines();
+ }
+ QCString categoryLabel[NUM_SEARCH_INDICES];
+};
+
+void writeJavascriptSearchIndex()
+{
+ if (!Config_getBool("GENERATE_HTML")) return;
+ //static bool treeView = Config_getBool("GENERATE_TREEVIEW");
+
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for (;(cd=cli.current());++cli)
+ {
+ uchar charCode = (uchar)cd->localName().at(0);
+ uint letter = charCode<128 ? tolower(charCode) : charCode;
+ if (cd->isLinkable() && isId(letter))
+ {
+ g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(cd);
+ g_searchIndexSymbols[SEARCH_INDEX_CLASSES][letter].append(cd);
+ g_searchIndexCount[SEARCH_INDEX_ALL]++;
+ g_searchIndexCount[SEARCH_INDEX_CLASSES]++;
+ }
+ }
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for (;(nd=nli.current());++nli)
+ {
+ uchar charCode = (uchar)nd->name().at(0);
+ uint letter = charCode<128 ? tolower(charCode) : charCode;
+ if (nd->isLinkable() && isId(letter))
+ {
+ g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(nd);
+ g_searchIndexSymbols[SEARCH_INDEX_NAMESPACES][letter].append(nd);
+ g_searchIndexCount[SEARCH_INDEX_ALL]++;
+ g_searchIndexCount[SEARCH_INDEX_NAMESPACES]++;
+ }
+ }
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ uchar charCode = (uchar)fd->name().at(0);
+ uint letter = charCode<128 ? tolower(charCode) : charCode;
+ if (fd->isLinkable() && isId(letter))
+ {
+ g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(fd);
+ g_searchIndexSymbols[SEARCH_INDEX_FILES][letter].append(fd);
+ g_searchIndexCount[SEARCH_INDEX_ALL]++;
+ g_searchIndexCount[SEARCH_INDEX_FILES]++;
+ }
+ }
+ }
+ {
+ MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
+ MemberName *mn;
+ // for each member name
+ for (mnli.toFirst();(mn=mnli.current());++mnli)
+ {
+ MemberDef *md;
+ MemberNameIterator mni(*mn);
+ // for each member definition
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ addMemberToSearchIndex(g_searchIndexSymbols,g_searchIndexCount,md);
+ }
+ }
+ }
+ {
+ MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
+ MemberName *mn;
+ // for each member name
+ for (fnli.toFirst();(mn=fnli.current());++fnli)
+ {
+ MemberDef *md;
+ MemberNameIterator mni(*mn);
+ // for each member definition
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ addMemberToSearchIndex(g_searchIndexSymbols,g_searchIndexCount,md);
+ }
+ }
+ }
+
+ int i,p;
+ for (i=0;i<NUM_SEARCH_INDICES;i++)
+ {
+ for (p=0;p<MEMBER_INDEX_ENTRIES;p++)
+ {
+ if (g_searchIndexSymbols[i][p].count()>0)
+ {
+ g_searchIndexSymbols[i][p].sort();
+ }
+ }
+ }
+
+ QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search";
+
+ for (i=0;i<NUM_SEARCH_INDICES;i++)
+ {
+ for (p=0;p<MEMBER_INDEX_ENTRIES;p++)
+ {
+ if (g_searchIndexSymbols[i][p].count()>0)
+ {
+ QCString fileName;
+ fileName.sprintf("/%s_%02x.html",g_searchIndexName[i],p);
+ fileName.prepend(searchDirName);
+ QFile outFile(fileName);
+ if (outFile.open(IO_WriteOnly))
+ {
+ FTextStream t(&outFile);
+ t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
+ " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
+ t << "<html><head><title></title>" << endl;
+ t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
+ t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl;
+ t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl;
+ t << "</head>" << endl;
+ t << "<body class=\"SRPage\">" << endl;
+ t << "<div id=\"SRIndex\">" << endl;
+ t << "<div class=\"SRStatus\" id=\"Loading\">" << theTranslator->trLoading() << "</div>" << endl;
+
+ SDict<QList<Definition> >::Iterator li(g_searchIndexSymbols[i][p]);
+ QList<Definition> *dl;
+ int itemCount=0;
+ for (li.toFirst();(dl=li.current());++li)
+ {
+ Definition *d = dl->first();
+ QCString id = d->localName();
+ t << "<div class=\"SRResult\" id=\"SR_"
+ << searchId(d->localName()) << "\">" << endl;
+ t << " <div class=\"SREntry\">\n";
+ if (dl->count()==1) // item with a unique name
+ {
+ MemberDef *md = 0;
+ bool isMemberDef = d->definitionType()==Definition::TypeMember;
+ if (isMemberDef) md = (MemberDef*)d;
+ t << " <a id=\"Item" << itemCount << "\" "
+ << "onkeydown=\""
+ << "return searchResults.Nav(event," << itemCount << ")\" "
+ << "onkeypress=\""
+ << "return searchResults.Nav(event," << itemCount << ")\" "
+ << "onkeyup=\""
+ << "return searchResults.Nav(event," << itemCount << ")\" "
+ << "class=\"SRSymbol\" ";
+ t << externalLinkTarget() << "href=\"" << externalRef("../",d->getReference(),TRUE);
+ t << d->getOutputFileBase() << Doxygen::htmlFileExtension;
+ if (isMemberDef)
+ {
+ t << "#" << ((MemberDef *)d)->anchor();
+ }
+ t << "\"";
+ static bool extLinksInWindow = Config_getBool("EXT_LINKS_IN_WINDOW");
+ if (!extLinksInWindow || d->getReference().isEmpty())
+ {
+ t << " target=\"";
+ /*if (treeView) t << "basefrm"; else*/ t << "_parent";
+ t << "\"";
+ }
+ t << ">";
+ t << convertToXML(d->localName());
+ t << "</a>" << endl;
+ if (d->getOuterScope()!=Doxygen::globalScope)
+ {
+ t << " <span class=\"SRScope\">"
+ << convertToXML(d->getOuterScope()->name())
+ << "</span>" << endl;
+ }
+ else if (isMemberDef)
+ {
+ FileDef *fd = ((MemberDef *)d)->getBodyDef();
+ if (fd==0) fd = ((MemberDef *)d)->getFileDef();
+ if (fd)
+ {
+ t << " <span class=\"SRScope\">"
+ << convertToXML(fd->localName())
+ << "</span>" << endl;
+ }
+ }
+ }
+ else // multiple items with the same name
+ {
+ t << " <a id=\"Item" << itemCount << "\" "
+ << "onkeydown=\""
+ << "return searchResults.Nav(event," << itemCount << ")\" "
+ << "onkeypress=\""
+ << "return searchResults.Nav(event," << itemCount << ")\" "
+ << "onkeyup=\""
+ << "return searchResults.Nav(event," << itemCount << ")\" "
+ << "class=\"SRSymbol\" "
+ << "href=\"javascript:searchResults.Toggle('SR_"
+ << searchId(d->localName()) << "')\">"
+ << convertToXML(d->localName()) << "</a>" << endl;
+ t << " <div class=\"SRChildren\">" << endl;
+
+ QListIterator<Definition> di(*dl);
+ bool overloadedFunction = FALSE;
+ Definition *prevScope = 0;
+ int childCount=0;
+ for (di.toFirst();(d=di.current());)
+ {
+ ++di;
+ Definition *scope = d->getOuterScope();
+ Definition *next = di.current();
+ Definition *nextScope = 0;
+ MemberDef *md = 0;
+ bool isMemberDef = d->definitionType()==Definition::TypeMember;
+ if (isMemberDef) md = (MemberDef*)d;
+ if (next) nextScope = next->getOuterScope();
+
+ t << " <a id=\"Item" << itemCount << "_c"
+ << childCount << "\" "
+ << "onkeydown=\""
+ << "return searchResults.NavChild(event,"
+ << itemCount << "," << childCount << ")\" "
+ << "onkeypress=\""
+ << "return searchResults.NavChild(event,"
+ << itemCount << "," << childCount << ")\" "
+ << "onkeyup=\""
+ << "return searchResults.NavChild(event,"
+ << itemCount << "," << childCount << ")\" "
+ << "class=\"SRScope\" ";
+ if (!d->getReference().isEmpty())
+ {
+ t << externalLinkTarget() << externalRef("../",d->getReference(),FALSE);
+ }
+ t << "href=\"" << externalRef("../",d->getReference(),TRUE);
+ t << d->getOutputFileBase() << Doxygen::htmlFileExtension;
+ if (isMemberDef)
+ {
+ t << "#" << ((MemberDef *)d)->anchor();
+ }
+ t << "\"";
+ static bool extLinksInWindow = Config_getBool("EXT_LINKS_IN_WINDOW");
+ if (!extLinksInWindow || d->getReference().isEmpty())
+ {
+ t << " target=\"";
+ /*if (treeView) t << "basefrm"; else*/ t << "_parent";
+ t << "\"";
+ }
+ t << ">";
+ bool found=FALSE;
+ overloadedFunction = ((prevScope!=0 && scope==prevScope) ||
+ (scope && scope==nextScope)
+ ) && md &&
+ (md->isFunction() || md->isSlot());
+ QCString prefix;
+ if (md) prefix=convertToXML(md->localName());
+ if (overloadedFunction) // overloaded member function
+ {
+ prefix+=convertToXML(md->argsString());
+ // show argument list to disambiguate overloaded functions
+ }
+ else if (md) // unique member function
+ {
+ prefix+="()"; // only to show it is a function
+ }
+ if (d->definitionType()==Definition::TypeClass)
+ {
+ t << convertToXML(((ClassDef*)d)->displayName());
+ found = TRUE;
+ }
+ else if (d->definitionType()==Definition::TypeNamespace)
+ {
+ t << convertToXML(((NamespaceDef*)d)->displayName());
+ found = TRUE;
+ }
+ else if (scope==0 || scope==Doxygen::globalScope) // in global scope
+ {
+ if (md)
+ {
+ FileDef *fd = md->getBodyDef();
+ if (fd==0) fd = md->getFileDef();
+ if (fd)
+ {
+ if (!prefix.isEmpty()) prefix+=":&#160;";
+ t << prefix << convertToXML(fd->localName());
+ found = TRUE;
+ }
+ }
+ }
+ else if (md && (md->getClassDef() || md->getNamespaceDef()))
+ // member in class or namespace scope
+ {
+ static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ t << convertToXML(d->getOuterScope()->qualifiedName()) << (optimizeOutputJava ? "." : "::");
+ t << prefix;
+ found = TRUE;
+ }
+ else if (scope) // some thing else? -> show scope
+ {
+ t << prefix << convertToXML(scope->name());
+ found = TRUE;
+ }
+ if (!found) // fallback
+ {
+ t << prefix << "("+theTranslator->trGlobalNamespace()+")";
+ }
+ t << "</a>" << endl;
+ prevScope = scope;
+ childCount++;
+ }
+ t << " </div>" << endl; // SRChildren
+ }
+ t << " </div>" << endl; // SREntry
+ t << "</div>" << endl; // SRResult
+ itemCount++;
+ }
+ t << "<div class=\"SRStatus\" id=\"Searching\">"
+ << theTranslator->trSearching() << "</div>" << endl;
+ t << "<div class=\"SRStatus\" id=\"NoMatches\">"
+ << theTranslator->trNoMatches() << "</div>" << endl;
+
+ t << "<script type=\"text/javascript\"><!--" << endl;
+ t << "document.getElementById(\"Loading\").style.display=\"none\";" << endl;
+ t << "document.getElementById(\"NoMatches\").style.display=\"none\";" << endl;
+ t << "var searchResults = new SearchResults(\"searchResults\");" << endl;
+ t << "searchResults.Search();" << endl;
+ t << "--></script>" << endl;
+
+ t << "</div>" << endl; // SRIndex
+
+ t << "</body>" << endl;
+ t << "</html>" << endl;
+
+ }
+ else
+ {
+ err("Failed to open file '%s' for writing...\n",fileName.data());
+ }
+ }
+ }
+ }
+ //ol.popGeneratorState();
+
+ {
+ QFile f(searchDirName+"/search.js");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << "// Search script generated by doxygen" << endl;
+ t << "// Copyright (C) 2009 by Dimitri van Heesch." << endl << endl;
+ t << "// The code in this file is loosly based on main.js, part of Natural Docs," << endl;
+ t << "// which is Copyright (C) 2003-2008 Greg Valure" << endl;
+ t << "// Natural Docs is licensed under the GPL." << endl << endl;
+ t << "var indexSectionsWithContent =" << endl;
+ t << "{" << endl;
+ bool first=TRUE;
+ int j=0;
+ for (i=0;i<NUM_SEARCH_INDICES;i++)
+ {
+ if (g_searchIndexCount[i]>0)
+ {
+ if (!first) t << "," << endl;
+ t << " " << j << ": \"";
+ for (p=0;p<MEMBER_INDEX_ENTRIES;p++)
+ {
+ t << (g_searchIndexSymbols[i][p].count()>0 ? "1" : "0");
+ }
+ t << "\"";
+ first=FALSE;
+ j++;
+ }
+ }
+ if (!first) t << "\n";
+ t << "};" << endl << endl;
+ t << "var indexSectionNames =" << endl;
+ t << "{" << endl;
+ first=TRUE;
+ j=0;
+ for (i=0;i<NUM_SEARCH_INDICES;i++)
+ {
+ if (g_searchIndexCount[i]>0)
+ {
+ if (!first) t << "," << endl;
+ t << " " << j << ": \"" << g_searchIndexName[i] << "\"";
+ first=FALSE;
+ j++;
+ }
+ }
+ if (!first) t << "\n";
+ t << "};" << endl << endl;
+ t << search_script;
+ }
+ }
+ {
+ QFile f(searchDirName+"/nomatches.html");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" "
+ "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
+ t << "<html><head><title></title>" << endl;
+ t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
+ t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl;
+ t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl;
+ t << "</head>" << endl;
+ t << "<body class=\"SRPage\">" << endl;
+ t << "<div id=\"SRIndex\">" << endl;
+ t << "<div class=\"SRStatus\" id=\"NoMatches\">"
+ << theTranslator->trNoMatches() << "</div>" << endl;
+ t << "</div>" << endl;
+ t << "</body>" << endl;
+ t << "</html>" << endl;
+ }
+ }
+ Doxygen::indexList.addStyleSheetFile("search/search.js");
+}
+
+void writeSearchCategories(FTextStream &t)
+{
+ static SearchIndexCategoryMapping map;
+ int i,j=0;
+ for (i=0;i<NUM_SEARCH_INDICES;i++)
+ {
+ if (g_searchIndexCount[i]>0)
+ {
+ t << "<a class=\"SelectItem\" href=\"javascript:void(0)\" "
+ << "onclick=\"searchBox.OnSelectItem(" << j << ")\">"
+ << "<span class=\"SelectionMark\">&#160;</span>"
+ << convertToXML(map.categoryLabel[i])
+ << "</a>";
+ j++;
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void writeExampleIndex(OutputList &ol)
+{
+ if (Doxygen::exampleSDict->count()==0) return;
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Examples);
+ QCString title = lne->title();
+ startFile(ol,"examples",0,title,HLI_Examples);
+ startTitle(ol,0);
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ Doxygen::indexList.addContentsItem(TRUE,title,0,"examples",0);
+ Doxygen::indexList.incContentsDepth();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+ ol.startItemList();
+ PageSDict::Iterator pdi(*Doxygen::exampleSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ ol.startItemListItem();
+ QCString n=pd->getOutputFileBase();
+ if (!pd->title().isEmpty())
+ {
+ ol.writeObjectLink(0,n,0,pd->title());
+ Doxygen::indexList.addContentsItem(FALSE,filterTitle(pd->title()),pd->getReference(),n,0);
+ }
+ else
+ {
+ ol.writeObjectLink(0,n,0,pd->name());
+ Doxygen::indexList.addContentsItem(FALSE,pd->name(),pd->getReference(),n,0);
+ }
+ ol.endItemListItem();
+ ol.writeString("\n");
+ }
+ ol.endItemList();
+ Doxygen::indexList.decContentsDepth();
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+
+//----------------------------------------------------------------------------
+
+template<typename T>
+bool writeMemberNavIndex(FTextStream &t,
+ int indent,
+ int n,
+ int documentedMembers[],
+ MemberIndexList indexLetterUsed[][MEMBER_INDEX_ENTRIES],
+ const T *(*getInfo)(int),
+ bool &first
+ )
+
+{
+ bool found=FALSE;
+ QCString indentStr;
+ indentStr.fill(' ',indent*2);
+ // index items per category member lists
+ int i;
+ for (i=0;i<n;i++)
+ {
+ bool hasIndex = documentedMembers[i]>0;
+ bool quickIndex = documentedMembers[i]>maxItemsBeforeQuickIndex;
+ bool multiIndexPage = documentedMembers[i]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX;
+ if (hasIndex)
+ {
+ // terminate previous entry
+ if (!first) t << "," << endl;
+ first = FALSE;
+
+ // start entry
+ if (!found)
+ {
+ t << "[" << endl;
+ }
+ found = TRUE;
+
+ t << indentStr << " [ ";
+ t << "\"" << fixSpaces(getInfo(i)->title) << "\", ";
+ t << "\"" << getInfo(i)->fname << Doxygen::htmlFileExtension << "\", ";
+ bool firstPage=TRUE;
+ if (quickIndex)
+ {
+ t << "[ " << endl;
+ int j;
+ for (j=33;j<127;j++)
+ {
+ if (indexLetterUsed[i][j].count()>0)
+ {
+ if (!firstPage) t << "," << endl;
+ QCString fullName = getInfo(i)->fname;
+ QCString extension = Doxygen::htmlFileExtension;
+ QCString anchor;
+ if (firstPage || !multiIndexPage)
+ anchor=fullName+extension+"#index_";
+ else
+ anchor=fullName+QCString().sprintf("_0x%02x",j)+extension+"#index_";
+ char is[2];is[0]=(char)j;is[1]='\0';
+ QCString ci = letterToLabel((char)j);
+ t << indentStr << " [ ";
+ t << "\"" << is << "\", ";
+ t << "\"" << anchor << ci << "\", null ]";
+ firstPage=FALSE;
+ }
+ }
+ t << endl << indentStr << " ] ]";
+ }
+ else
+ {
+ t << "null" << " ]";
+ }
+ }
+ }
+ return found;
+}
+
+//----------------------------------------------------------------------------
+
+bool writeFullNavIndex(FTextStream &t, LayoutNavEntry *root,int indent,bool &first)
+{
+ static struct NavEntryCountMap
+ {
+ LayoutNavEntry::Kind kind;
+ bool hasItems;
+ } navEntryCountMap[] =
+ {
+ { LayoutNavEntry::MainPage, TRUE },
+ { LayoutNavEntry::Pages, indexedPages>0 },
+ { LayoutNavEntry::Modules, documentedGroups>0 },
+ { LayoutNavEntry::Namespaces, documentedNamespaces>0 },
+ { LayoutNavEntry::NamespaceMembers, documentedNamespaceMembers[NMHL_All]>0 },
+ { LayoutNavEntry::Classes, annotatedClasses>0 },
+ { LayoutNavEntry::ClassAnnotated, annotatedClasses>0 },
+ { LayoutNavEntry::ClassHierarchy, hierarchyClasses>0 },
+ { LayoutNavEntry::ClassMembers, documentedClassMembers[CMHL_All]>0 },
+ { LayoutNavEntry::Files, documentedFiles>0 },
+ { LayoutNavEntry::FileGlobals, documentedFileMembers[FMHL_All]>0 },
+ { LayoutNavEntry::Dirs, documentedDirs>0 },
+ { LayoutNavEntry::Examples, Doxygen::exampleSDict->count()>0 }
+ };
+
+ QCString indentStr;
+ indentStr.fill(' ',indent*2);
+ bool found=FALSE;
+ if (root->children().count()>0)
+ {
+ QListIterator<LayoutNavEntry> li(root->children());
+ LayoutNavEntry *entry;
+ for (li.toFirst();(entry=li.current());++li)
+ {
+ if (navEntryCountMap[entry->kind()].hasItems && entry->visible())
+ {
+ // terminate previous entry
+ if (!first) t << "," << endl;
+ first = FALSE;
+
+ // start entry
+ if (!found)
+ {
+ t << "[" << endl;
+ }
+ found = TRUE;
+
+ bool emptySection=TRUE;
+ t << indentStr << " [ ";
+ t << "\"" << fixSpaces(entry->title()) << "\", ";
+ t << "\"" << entry->baseFile() << Doxygen::htmlFileExtension << "\", ";
+
+ // write children (if any)
+ bool firstChild=TRUE;
+ if (entry->kind()==LayoutNavEntry::ClassMembers)
+ {
+ emptySection = !writeMemberNavIndex(t,indent+1,CMHL_Total,documentedClassMembers,g_memberIndexLetterUsed,&getCmhlInfo,firstChild);
+ }
+ else if (entry->kind()==LayoutNavEntry::NamespaceMembers)
+ {
+ emptySection = !writeMemberNavIndex(t,indent+1,NMHL_Total,documentedNamespaceMembers,g_namespaceIndexLetterUsed,&getNmhlInfo,firstChild);
+ }
+ else if (entry->kind()==LayoutNavEntry::FileGlobals)
+ {
+ emptySection = !writeMemberNavIndex(t,indent+1,FMHL_Total,documentedFileMembers,g_fileIndexLetterUsed,&getFmhlInfo,firstChild);
+ }
+ else
+ {
+ emptySection = !writeFullNavIndex(t,entry,indent+1,firstChild);
+ }
+ // end entry
+ if (emptySection) // entry without children
+ t << "null ]";
+ else // entry with children
+ t << endl << indentStr << " ] ]";
+ }
+ }
+ }
+ return found;
+}
+
+//----------------------------------------------------------------------------
+
+void countRelatedPages(int &docPages,int &indexPages)
+{
+ docPages=indexPages=0;
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ if ( pd->visibleInIndex())
+ {
+ indexPages++;
+ }
+ if ( pd->documentedPage())
+ {
+ docPages++;
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void writeSubPages(PageDef *pd)
+{
+ //printf("Write subpages(%s #=%d)\n",pd->name().data(),pd->getSubPages() ? pd->getSubPages()->count() : 0 );
+ Doxygen::indexList.incContentsDepth();
+
+ PageSDict *subPages = pd->getSubPages();
+ if (subPages)
+ {
+ PageSDict::Iterator pi(*subPages);
+ PageDef *subPage;
+ for (pi.toFirst();(subPage=pi.current());++pi)
+ {
+ QCString pageTitle;
+
+ if (subPage->title().isEmpty())
+ pageTitle=subPage->name();
+ else
+ pageTitle=subPage->title();
+
+ bool hasSubPages = subPage->hasSubPages();
+
+ Doxygen::indexList.addContentsItem(hasSubPages,pageTitle,subPage->getReference(),subPage->getOutputFileBase(),0);
+ writeSubPages(subPage);
+ }
+ }
+ Doxygen::indexList.decContentsDepth();
+
+}
+
+void writePageIndex(OutputList &ol)
+{
+ if (indexedPages==0) return;
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Pages);
+ QCString title = lne->title();
+ startFile(ol,"pages",0,title,HLI_Pages);
+ startTitle(ol,0);
+ //if (!Config_getString("PROJECT_NAME").isEmpty())
+ //{
+ // title.prepend(Config_getString("PROJECT_NAME")+" ");
+ //}
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ Doxygen::indexList.addContentsItem(TRUE,title,0,"pages",0);
+ Doxygen::indexList.incContentsDepth();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+ startIndexHierarchy(ol,0);
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ if ( pd->visibleInIndex())
+ {
+ QCString pageTitle;
+
+ if (pd->title().isEmpty())
+ pageTitle=pd->name();
+ else
+ pageTitle=pd->title();
+
+ bool hasSubPages = pd->hasSubPages();
+
+ ol.startIndexListItem();
+ ol.startIndexItem(pd->getReference(),pd->getOutputFileBase());
+ ol.parseText(pageTitle);
+ ol.endIndexItem(pd->getReference(),pd->getOutputFileBase());
+ if (pd->isReference())
+ {
+ ol.startTypewriter();
+ ol.docify(" [external]");
+ ol.endTypewriter();
+ }
+ ol.writeString("\n");
+ Doxygen::indexList.addContentsItem(hasSubPages,filterTitle(pageTitle),pd->getReference(),pd->getOutputFileBase(),0);
+ writeSubPages(pd);
+ ol.endIndexListItem();
+ }
+ }
+ endIndexHierarchy(ol,0);
+ Doxygen::indexList.decContentsDepth();
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+int countGroups()
+{
+ int count=0;
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ if (!gd->isReference())
+ {
+ gd->visited=FALSE;
+ count++;
+ }
+ }
+ return count;
+}
+
+//----------------------------------------------------------------------------
+
+int countDirs()
+{
+ int count=0;
+ SDict<DirDef>::Iterator dli(*Doxygen::directories);
+ DirDef *dd;
+ for (dli.toFirst();(dd=dli.current());++dli)
+ {
+ if (dd->isLinkableInProject())
+ {
+ dd->visited=FALSE;
+ count++;
+ }
+ }
+ return count;
+}
+
+
+//----------------------------------------------------------------------------
+
+void writeGraphInfo(OutputList &ol)
+{
+ if (!Config_getBool("HAVE_DOT") || !Config_getBool("GENERATE_HTML")) return;
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ generateGraphLegend(Config_getString("HTML_OUTPUT"));
+ startFile(ol,"graph_legend",0,theTranslator->trLegendTitle().data());
+ startTitle(ol,0);
+ ol.parseText(theTranslator->trLegendTitle());
+ endTitle(ol,0,0);
+ ol.startContents();
+ bool &stripCommentsStateRef = Config_getBool("STRIP_CODE_COMMENTS");
+ bool oldStripCommentsState = stripCommentsStateRef;
+ // temporarily disable the stripping of comments for our own code example!
+ stripCommentsStateRef = FALSE;
+ QCString legendDocs = theTranslator->trLegendDocs();
+ int s = legendDocs.find("<center>");
+ int e = legendDocs.find("</center>");
+ if (Config_getEnum("DOT_IMAGE_FORMAT")=="svg" && s!=-1 && e!=-1)
+ {
+ legendDocs = legendDocs.left(s+8) + "[!-- SVG 0 --]\n" + legendDocs.mid(e);
+ //printf("legendDocs=%s\n",legendDocs.data());
+ }
+ ol.parseDoc("graph_legend",1,0,0,legendDocs,FALSE,FALSE);
+ stripCommentsStateRef = oldStripCommentsState;
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+void writeGroupIndexItem(GroupDef *gd,MemberList *ml,const QCString &title)
+{
+ if (ml && ml->count()>0)
+ {
+ bool first=TRUE;
+ MemberDef *md=ml->first();
+ while (md)
+ {
+ if (md->isDetailedSectionVisible(TRUE,FALSE))
+ {
+ if (first)
+ {
+ first=FALSE;
+ Doxygen::indexList.addContentsItem(TRUE, convertToHtml(title,TRUE), gd->getReference(), gd->getOutputFileBase(), 0);
+ Doxygen::indexList.incContentsDepth();
+ }
+ Doxygen::indexList.addContentsItem(FALSE,md->name(),md->getReference(),md->getOutputFileBase(),md->anchor());
+ }
+ md=ml->next();
+ }
+
+ if (!first)
+ {
+ Doxygen::indexList.decContentsDepth();
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+/*!
+ * write groups as hierarchical trees
+ */
+void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv)
+{
+ bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ if (level>20)
+ {
+ warn(gd->getDefFileName(),gd->getDefLine(),
+ "warning: maximum nesting level exceeded for group %s: check for possible recursive group relation!\n",gd->name().data()
+ );
+ return;
+ }
+
+ /* Some groups should appear twice under different parent-groups.
+ * That is why we should not check if it was visited
+ */
+ if (/*!gd->visited &&*/ (!gd->isASubGroup() || level>0) &&
+ (!gd->isReference() || Config_getBool("EXTERNAL_GROUPS")) // hide external groups by default
+ )
+ {
+ //printf("gd->name()=%s #members=%d\n",gd->name().data(),gd->countMembers());
+ // write group info
+ bool hasSubGroups = gd->groupList->count()>0;
+ bool hasSubPages = gd->pageDict->count()>0;
+ int numSubItems = 0;
+ if ( Config_getBool("TOC_EXPAND"))
+ {
+ QListIterator<MemberList> mli(gd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::documentationLists)
+ {
+ numSubItems += ml->count();
+ }
+ }
+ numSubItems += gd->namespaceSDict->count();
+ numSubItems += gd->classSDict->count();
+ numSubItems += gd->fileList->count();
+ numSubItems += gd->exampleDict->count();
+ }
+
+ bool isDir = hasSubGroups || hasSubPages || numSubItems>0;
+ //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count());
+ Doxygen::indexList.addContentsItem(isDir,gd->groupTitle(),gd->getReference(),gd->getOutputFileBase(),0);
+ Doxygen::indexList.incContentsDepth();
+ if (ftv)
+ {
+ ftv->addContentsItem(isDir,gd->groupTitle(),gd->getReference(),gd->getOutputFileBase(),0);
+ ftv->incContentsDepth();
+ }
+
+ //ol.writeListItem();
+ //ol.startTextLink(gd->getOutputFileBase(),0);
+ //parseText(ol,gd->groupTitle());
+ //ol.endTextLink();
+
+ ol.startIndexListItem();
+ ol.startIndexItem(gd->getReference(),gd->getOutputFileBase());
+ ol.parseText(gd->groupTitle());
+ ol.endIndexItem(gd->getReference(),gd->getOutputFileBase());
+ if (gd->isReference())
+ {
+ ol.startTypewriter();
+ ol.docify(" [external]");
+ ol.endTypewriter();
+ }
+
+
+ // write pages
+ PageSDict::Iterator pli(*gd->pageDict);
+ PageDef *pd = 0;
+ for (pli.toFirst();(pd=pli.current());++pli)
+ {
+ SectionInfo *si=0;
+ if (!pd->name().isEmpty()) si=Doxygen::sectionDict[pd->name()];
+ Doxygen::indexList.addContentsItem(FALSE,
+ convertToHtml(pd->title(),TRUE),
+ gd->getReference(),
+ gd->getOutputFileBase(),
+ si ? si->label.data() : 0);
+ }
+
+ // write subgroups
+ if (hasSubGroups)
+ {
+ startIndexHierarchy(ol,level+1);
+ if (Config_getBool("SORT_GROUP_NAMES"))
+ gd->groupList->sort();
+ QListIterator<GroupDef> gli(*gd->groupList);
+ GroupDef *subgd = 0;
+ for (gli.toFirst();(subgd=gli.current());++gli)
+ {
+ writeGroupTreeNode(ol,subgd,level+1,ftv);
+ }
+ endIndexHierarchy(ol,level+1);
+ }
+
+
+ if (Config_getBool("TOC_EXPAND"))
+ {
+ writeGroupIndexItem(gd,gd->getMemberList(MemberList::docDefineMembers),
+ theTranslator->trDefines());
+ writeGroupIndexItem(gd,gd->getMemberList(MemberList::docTypedefMembers),
+ theTranslator->trTypedefs());
+ writeGroupIndexItem(gd,gd->getMemberList(MemberList::docEnumMembers),
+ theTranslator->trEnumerations());
+ writeGroupIndexItem(gd,gd->getMemberList(MemberList::docFuncMembers),
+ fortranOpt ? theTranslator->trSubprograms() :
+ vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
+ theTranslator->trFunctions()
+ );
+ writeGroupIndexItem(gd,gd->getMemberList(MemberList::docVarMembers),
+ theTranslator->trVariables());
+ writeGroupIndexItem(gd,gd->getMemberList(MemberList::docProtoMembers),
+ theTranslator->trFuncProtos());
+
+ // write namespaces
+ NamespaceSDict *namespaceSDict=gd->namespaceSDict;
+ if (namespaceSDict->count()>0)
+ {
+ Doxygen::indexList.addContentsItem(TRUE,convertToHtml(fortranOpt?theTranslator->trModules():theTranslator->trNamespaces(),TRUE),gd->getReference(), gd->getOutputFileBase(), 0);
+ Doxygen::indexList.incContentsDepth();
+
+ NamespaceSDict::Iterator ni(*namespaceSDict);
+ NamespaceDef *nsd;
+ for (ni.toFirst();(nsd=ni.current());++ni)
+ {
+ Doxygen::indexList.addContentsItem(FALSE, convertToHtml(nsd->name(),TRUE), nsd->getReference(), nsd->getOutputFileBase(), 0);
+ }
+ Doxygen::indexList.decContentsDepth();
+ }
+
+ // write classes
+ if (gd->classSDict->count()>0)
+ {
+ Doxygen::indexList.addContentsItem(TRUE,convertToHtml(fortranOpt?theTranslator->trDataTypes():theTranslator->trClasses(),TRUE), gd->getReference(), gd->getOutputFileBase(), 0);
+ Doxygen::indexList.incContentsDepth();
+
+ ClassDef *cd;
+ ClassSDict::Iterator cdi(*gd->classSDict);
+ for (cdi.toFirst();(cd=cdi.current());++cdi)
+ {
+ if (cd->isLinkable())
+ {
+ //printf("node: Has children %s\n",cd->name().data());
+ Doxygen::indexList.addContentsItem(FALSE,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor());
+ }
+ }
+
+ //writeClassTree(gd->classSDict,1);
+ Doxygen::indexList.decContentsDepth();
+ }
+
+ // write file list
+ FileList *fileList=gd->fileList;
+ if (fileList->count()>0)
+ {
+ Doxygen::indexList.addContentsItem(TRUE,
+ theTranslator->trFile(TRUE,FALSE),
+ gd->getReference(),
+ gd->getOutputFileBase(), 0);
+ Doxygen::indexList.incContentsDepth();
+
+ FileDef *fd=fileList->first();
+ while (fd)
+ {
+ Doxygen::indexList.addContentsItem(FALSE, convertToHtml(fd->name(),TRUE),fd->getReference(), fd->getOutputFileBase(), 0);
+ fd=fileList->next();
+ }
+ Doxygen::indexList.decContentsDepth();
+ }
+
+ // write examples
+ if (gd->exampleDict->count()>0)
+ {
+ Doxygen::indexList.addContentsItem(TRUE, convertToHtml(theTranslator->trExamples(),TRUE),gd->getReference(), gd->getOutputFileBase(), 0);
+ Doxygen::indexList.incContentsDepth();
+
+ PageSDict::Iterator eli(*(gd->exampleDict));
+ PageDef *pd=eli.toFirst();
+ while (pd)
+ {
+ Doxygen::indexList.addContentsItem(FALSE,pd->name(),pd->getReference(),pd->getOutputFileBase(),0);
+ pd=++eli;
+ }
+
+ Doxygen::indexList.decContentsDepth();
+ }
+ }
+ ol.endIndexListItem();
+
+ Doxygen::indexList.decContentsDepth();
+ if (ftv)
+ ftv->decContentsDepth();
+ //gd->visited=TRUE;
+ }
+}
+
+void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv)
+{
+ if (ftv)
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ }
+ startIndexHierarchy(ol,0);
+ if (Config_getBool("SORT_GROUP_NAMES"))
+ Doxygen::groupSDict->sort();
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ writeGroupTreeNode(ol,gd,0,ftv);
+ }
+ endIndexHierarchy(ol,0);
+ if (ftv)
+ {
+ ol.popGeneratorState();
+ }
+}
+
+//----------------------------------------------------------------------------
+void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv)
+{
+ if (level>20)
+ {
+ warn(dd->getDefFileName(),dd->getDefLine(),
+ "warning: maximum nesting level exceeded for directory %s: "
+ "check for possible recursive directory relation!\n",dd->name().data()
+ );
+ return;
+ }
+
+ static bool tocExpand = Config_getBool("TOC_EXPAND");
+ bool isDir = dd->subDirs().count()>0 || // there are subdirs
+ (tocExpand && // or toc expand and
+ dd->getFiles() && dd->getFiles()->count()>0 // there are files
+ );
+ //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count());
+ Doxygen::indexList.addContentsItem(isDir,dd->shortName(),dd->getReference(),dd->getOutputFileBase(),0);
+ Doxygen::indexList.incContentsDepth();
+ if (ftv)
+ {
+ ftv->addContentsItem(isDir,dd->shortName(),dd->getReference(),dd->getOutputFileBase(),0);
+ ftv->incContentsDepth();
+ }
+
+ ol.startIndexListItem();
+ ol.startIndexItem(dd->getReference(),dd->getOutputFileBase());
+ ol.parseText(dd->shortName());
+ ol.endIndexItem(dd->getReference(),dd->getOutputFileBase());
+ if (dd->isReference())
+ {
+ ol.startTypewriter();
+ ol.docify(" [external]");
+ ol.endTypewriter();
+ }
+
+ // write sub directories
+ if (dd->subDirs().count()>0)
+ {
+ startIndexHierarchy(ol,level+1);
+ QListIterator<DirDef> dli(dd->subDirs());
+ DirDef *subdd = 0;
+ for (dli.toFirst();(subdd=dli.current());++dli)
+ {
+ writeDirTreeNode(ol,subdd,level+1,ftv);
+ }
+ endIndexHierarchy(ol,level+1);
+ }
+
+ if (tocExpand)
+ {
+ // write files of this directory
+ FileList *fileList=dd->getFiles();
+ if (fileList && fileList->count()>0)
+ {
+ FileDef *fd=fileList->first();
+ while (fd)
+ {
+ Doxygen::indexList.addContentsItem(FALSE, convertToHtml(fd->name(),TRUE),fd->getReference(), fd->getOutputFileBase(), 0);
+ fd=fileList->next();
+ }
+ }
+ }
+ ol.endIndexListItem();
+
+ Doxygen::indexList.decContentsDepth();
+ if (ftv)
+ ftv->decContentsDepth();
+}
+
+void writeDirHierarchy(OutputList &ol, FTVHelp* ftv)
+{
+ if (ftv)
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ }
+ startIndexHierarchy(ol,0);
+ SDict<DirDef>::Iterator dli(*Doxygen::directories);
+ DirDef *dd;
+ for (dli.toFirst();(dd=dli.current());++dli)
+ {
+ if (dd->getOuterScope()==Doxygen::globalScope) writeDirTreeNode(ol,dd,0,ftv);
+ }
+ endIndexHierarchy(ol,0);
+ if (ftv)
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+void writeGroupIndex(OutputList &ol)
+{
+ if (documentedGroups==0) return;
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Modules);
+ QCString title = lne->title();
+ startFile(ol,"modules",0,title,HLI_Modules);
+ startTitle(ol,0);
+ //QCString title = theTranslator->trModules();
+ //if (!Config_getString("PROJECT_NAME").isEmpty())
+ //{
+ // title.prepend(Config_getString("PROJECT_NAME")+" ");
+ //}
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ Doxygen::indexList.addContentsItem(TRUE,title,0,"modules",0);
+ Doxygen::indexList.incContentsDepth();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+
+ FTVHelp* ftv = 0;
+ bool treeView=Config_getBool("USE_INLINE_TREES");
+ if (treeView)
+ {
+ ftv = new FTVHelp(FALSE);
+ }
+
+ writeGroupHierarchy(ol,ftv);
+
+ Doxygen::indexList.decContentsDepth();
+ if (ftv)
+ {
+ QGString outStr;
+ FTextStream t(&outStr);
+ ftv->generateTreeViewInline(t);
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeString(outStr);
+ ol.popGeneratorState();
+ delete ftv;
+ }
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+void writeDirIndex(OutputList &ol)
+{
+ if (documentedDirs==0) return;
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Dirs);
+ QCString title = lne->title();
+ startFile(ol,"dirs",0,title,HLI_Directories);
+ startTitle(ol,0);
+ //if (!Config_getString("PROJECT_NAME").isEmpty())
+ //{
+ // title.prepend(Config_getString("PROJECT_NAME")+" ");
+ //}
+ ol.parseText(title);
+ endTitle(ol,0,0);
+ ol.startContents();
+ ol.startTextBlock();
+ Doxygen::indexList.addContentsItem(TRUE,title,0,"dirs",0);
+ Doxygen::indexList.incContentsDepth();
+ ol.parseText(lne->intro());
+ ol.endTextBlock();
+
+ FTVHelp* ftv = 0;
+ bool treeView=Config_getBool("USE_INLINE_TREES");
+ if (treeView)
+ {
+ ftv = new FTVHelp(FALSE);
+ }
+
+ writeDirHierarchy(ol,ftv);
+
+ if (ftv)
+ {
+ QGString outStr;
+ FTextStream t(&outStr);
+ ftv->generateTreeViewInline(t);
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeString(outStr);
+ ol.popGeneratorState();
+ delete ftv;
+ }
+ Doxygen::indexList.decContentsDepth();
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+static bool mainPageHasTitle()
+{
+ if (Doxygen::mainPage==0) return FALSE;
+ if (Doxygen::mainPage->title().isEmpty()) return FALSE;
+ if (Doxygen::mainPage->title().lower()=="notitle") return FALSE;
+ return TRUE;
+}
+
+//----------------------------------------------------------------------------
+
+void writeIndex(OutputList &ol)
+{
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ // save old generator state
+ ol.pushGeneratorState();
+
+ QCString projPrefix;
+ if (!Config_getString("PROJECT_NAME").isEmpty())
+ {
+ projPrefix=Config_getString("PROJECT_NAME")+" ";
+ }
+
+#if 0
+ {
+ QFile f(Config_getString("HTML_OUTPUT")+"/navindex.js");
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << "var NAVINDEX =" << endl;
+ LayoutNavEntry *layout = LayoutDocManager::instance().rootNavEntry();
+ bool first=TRUE;
+ writeFullNavIndex(t,layout,0,first);
+ t << endl << "];" << endl;
+ t << endl << navindex_script;
+ }
+ }
+#endif
+
+ //--------------------------------------------------------------------
+ // write HTML index
+ //--------------------------------------------------------------------
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QCString defFileName =
+ Doxygen::mainPage ? Doxygen::mainPage->getDefFileName().data() : "[generated]";
+ int defLine =
+ Doxygen::mainPage ? Doxygen::mainPage->getDefLine() : -1;
+
+ QCString title;
+ if (!mainPageHasTitle())
+ {
+ title = theTranslator->trMainPage();
+ }
+ else
+ {
+ title = filterTitle(Doxygen::mainPage->title());
+ }
+
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ //QCString indexName=Config_getBool("GENERATE_TREEVIEW")?"main":"index";
+ QCString indexName="index";
+ ol.startFile(indexName,0,title);
+
+ if (Doxygen::mainPage)
+ {
+ Doxygen::indexList.addContentsItem(Doxygen::mainPage->hasSubPages(),title,0,indexName,0);
+
+ if (Doxygen::mainPage->hasSubPages())
+ {
+ writeSubPages(Doxygen::mainPage);
+ }
+ }
+
+ ol.startQuickIndices();
+ if (!Config_getBool("DISABLE_INDEX"))
+ {
+ ol.writeQuickLinks(TRUE,HLI_Main);
+ }
+ ol.endQuickIndices();
+ if (generateTreeView)
+ {
+ ol.writeSplitBar(indexName);
+ }
+ bool headerWritten=FALSE;
+ if (Doxygen::mainPage && !Doxygen::mainPage->title().isEmpty())
+ {
+ if (Doxygen::mainPage->title().lower()!="notitle")
+ {
+ ol.startHeaderSection();
+ ol.startTitleHead(0);
+ ol.parseDoc(Doxygen::mainPage->docFile(),Doxygen::mainPage->docLine(),
+ Doxygen::mainPage,0,Doxygen::mainPage->title(),
+ TRUE,FALSE,0,TRUE,FALSE);
+ headerWritten = TRUE;
+ }
+ }
+ else
+ {
+ if (!Config_getString("PROJECT_NAME").isEmpty())
+ {
+ ol.startHeaderSection();
+ ol.startTitleHead(0);
+ ol.parseText(projPrefix+theTranslator->trDocumentation());
+ headerWritten = TRUE;
+ }
+ }
+ if (headerWritten)
+ {
+ ol.endTitleHead(0,0);
+ ol.endHeaderSection();
+ }
+ ol.startContents();
+#if 0
+ // ol.newParagraph(); // FIXME:PARA
+ if (!Config_getString("PROJECT_NUMBER").isEmpty())
+ {
+ ol.startProjectNumber();
+ ol.parseDoc(defFileName,defLine,
+ Doxygen::mainPage,0,
+ Config_getString("PROJECT_NUMBER"),
+ TRUE,FALSE,0,
+ TRUE,FALSE);
+ ol.endProjectNumber();
+ }
+#endif
+ if (Config_getBool("DISABLE_INDEX") && Doxygen::mainPage==0)
+ {
+ ol.writeQuickLinks(FALSE,HLI_Main);
+ }
+
+ if (Doxygen::mainPage)
+ {
+ Doxygen::insideMainPage=TRUE;
+ ol.startTextBlock();
+ ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
+ Doxygen::mainPage->documentation(),TRUE,FALSE
+ /*,Doxygen::mainPage->sectionDict*/);
+ ol.endTextBlock();
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <compound kind=\"page\">" << endl
+ << " <name>"
+ << convertToXML(Doxygen::mainPage->name())
+ << "</name>" << endl
+ << " <title>"
+ << convertToXML(Doxygen::mainPage->title())
+ << "</title>" << endl
+ << " <filename>"
+ << convertToXML(Doxygen::mainPage->getOutputFileBase())
+ << "</filename>" << endl;
+
+ Doxygen::mainPage->writeDocAnchorsToTagFile();
+ Doxygen::tagFile << " </compound>" << endl;
+ }
+ Doxygen::insideMainPage=FALSE;
+ }
+
+ endFile(ol);
+ ol.disable(OutputGenerator::Html);
+
+ //--------------------------------------------------------------------
+ // write LaTeX/RTF index
+ //--------------------------------------------------------------------
+ ol.enable(OutputGenerator::Latex);
+ ol.enable(OutputGenerator::RTF);
+
+ ol.startFile("refman",0,0);
+ ol.startIndexSection(isTitlePageStart);
+ if (!Config_getString("LATEX_HEADER").isEmpty())
+ {
+ ol.disable(OutputGenerator::Latex);
+ }
+
+ if (projPrefix.isEmpty())
+ {
+ ol.parseText(theTranslator->trReferenceManual());
+ }
+ else
+ {
+ ol.parseText(projPrefix);
+ }
+
+ if (!Config_getString("PROJECT_NUMBER").isEmpty())
+ {
+ ol.startProjectNumber();
+ ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE);
+ ol.endProjectNumber();
+ }
+ ol.endIndexSection(isTitlePageStart);
+ ol.startIndexSection(isTitlePageAuthor);
+ ol.parseText(theTranslator->trGeneratedBy());
+ ol.endIndexSection(isTitlePageAuthor);
+ ol.enable(OutputGenerator::Latex);
+
+ ol.lastIndexPage();
+ if (Doxygen::mainPage)
+ {
+ ol.startIndexSection(isMainPage);
+ if (mainPageHasTitle())
+ {
+ ol.parseText(Doxygen::mainPage->title());
+ }
+ else
+ {
+ ol.parseText(/*projPrefix+*/theTranslator->trMainPage());
+ }
+ ol.endIndexSection(isMainPage);
+ }
+ if (documentedPages>0)
+ {
+ //ol.parseText(projPrefix+theTranslator->trPageDocumentation());
+ //ol.endIndexSection(isPageDocumentation);
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=pdi.toFirst();
+ bool first=Doxygen::mainPage==0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ if (!pd->getGroupDef() && !pd->isReference() &&
+ (!pd->hasParentPage() || // not inside other page
+ (Doxygen::mainPage==pd->getOuterScope())) // or inside main page
+ )
+ {
+ QCString title = pd->title();
+ if (title.isEmpty()) title=pd->name();
+ ol.startIndexSection(isPageDocumentation);
+ ol.parseText(title);
+ ol.endIndexSection(isPageDocumentation);
+ ol.pushGeneratorState(); // write TOC title (RTF only)
+ ol.disableAllBut(OutputGenerator::RTF);
+ ol.startIndexSection(isPageDocumentation2);
+ ol.parseText(title);
+ ol.endIndexSection(isPageDocumentation2);
+ ol.popGeneratorState();
+ ol.writeAnchor(0,pd->name());
+
+ ol.writePageLink(pd->getOutputFileBase(),first);
+ first=FALSE;
+ }
+ }
+ }
+
+ if (!Config_getBool("LATEX_HIDE_INDICES"))
+ {
+ //if (indexedPages>0)
+ //{
+ // ol.startIndexSection(isPageIndex);
+ // ol.parseText(/*projPrefix+*/ theTranslator->trPageIndex());
+ // ol.endIndexSection(isPageIndex);
+ //}
+ if (documentedGroups>0)
+ {
+ ol.startIndexSection(isModuleIndex);
+ ol.parseText(/*projPrefix+*/ theTranslator->trModuleIndex());
+ ol.endIndexSection(isModuleIndex);
+ }
+ if (Config_getBool("SHOW_DIRECTORIES") && documentedDirs>0)
+ {
+ ol.startIndexSection(isDirIndex);
+ ol.parseText(/*projPrefix+*/ theTranslator->trDirIndex());
+ ol.endIndexSection(isDirIndex);
+ }
+ if (documentedNamespaces>0)
+ {
+ ol.startIndexSection(isNamespaceIndex);
+ ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trModulesIndex():theTranslator->trNamespaceIndex()));
+ ol.endIndexSection(isNamespaceIndex);
+ }
+ if (hierarchyClasses>0)
+ {
+ ol.startIndexSection(isClassHierarchyIndex);
+ ol.parseText(/*projPrefix+*/
+ (fortranOpt ? theTranslator->trCompoundIndexFortran() :
+ vhdlOpt ? VhdlDocGen::trDesignUnitIndex() :
+ theTranslator->trCompoundIndex()
+ ));
+ ol.endIndexSection(isClassHierarchyIndex);
+ }
+ if (annotatedClassesPrinted>0)
+ {
+ ol.startIndexSection(isCompoundIndex);
+ ol.parseText(/*projPrefix+*/
+ (fortranOpt ? theTranslator->trCompoundIndexFortran() :
+ vhdlOpt ? VhdlDocGen::trDesignUnitIndex() :
+ theTranslator->trCompoundIndex()
+ ));
+ ol.endIndexSection(isCompoundIndex);
+ }
+ if (documentedFiles>0)
+ {
+ ol.startIndexSection(isFileIndex);
+ ol.parseText(/*projPrefix+*/theTranslator->trFileIndex());
+ ol.endIndexSection(isFileIndex);
+ }
+ }
+ if (documentedGroups>0)
+ {
+ ol.startIndexSection(isModuleDocumentation);
+ ol.parseText(/*projPrefix+*/theTranslator->trModuleDocumentation());
+ ol.endIndexSection(isModuleDocumentation);
+ }
+ if (Config_getBool("SHOW_DIRECTORIES") && documentedDirs>0)
+ {
+ ol.startIndexSection(isDirDocumentation);
+ ol.parseText(/*projPrefix+*/theTranslator->trDirDocumentation());
+ ol.endIndexSection(isDirDocumentation);
+ }
+ if (documentedNamespaces>0)
+ {
+ ol.startIndexSection(isNamespaceDocumentation);
+ ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trModuleDocumentation():theTranslator->trNamespaceDocumentation()));
+ ol.endIndexSection(isNamespaceDocumentation);
+ }
+ if (annotatedClasses>0)
+ {
+ ol.startIndexSection(isClassDocumentation);
+ ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trTypeDocumentation():theTranslator->trClassDocumentation()));
+ ol.endIndexSection(isClassDocumentation);
+ }
+ if (documentedFiles>0)
+ {
+ ol.startIndexSection(isFileDocumentation);
+ ol.parseText(/*projPrefix+*/theTranslator->trFileDocumentation());
+ ol.endIndexSection(isFileDocumentation);
+ }
+ if (Doxygen::exampleSDict->count()>0)
+ {
+ ol.startIndexSection(isExampleDocumentation);
+ ol.parseText(/*projPrefix+*/theTranslator->trExampleDocumentation());
+ ol.endIndexSection(isExampleDocumentation);
+ }
+ ol.endIndexSection(isEndIndex);
+ endFile(ol);
+
+ if (Doxygen::mainPage)
+ {
+ Doxygen::insideMainPage=TRUE;
+ ol.disable(OutputGenerator::Man);
+ startFile(ol,Doxygen::mainPage->name(),0,Doxygen::mainPage->title());
+ ol.startContents();
+ ol.startTextBlock();
+ ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
+ Doxygen::mainPage->documentation(),FALSE,FALSE
+ );
+ ol.endTextBlock();
+ endFile(ol);
+ ol.enable(OutputGenerator::Man);
+ Doxygen::insideMainPage=FALSE;
+ }
+
+ ol.popGeneratorState();
+}
+
+
+
diff --git a/src/index.h b/src/index.h
new file mode 100644
index 0000000..baaf140
--- /dev/null
+++ b/src/index.h
@@ -0,0 +1,278 @@
+/******************************************************************************
+ *
+ * $Id: index.h,v 1.28 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef INDEX_H
+#define INDEX_H
+
+#include "qtbc.h"
+#include <qfile.h>
+#include <qlist.h>
+
+class Definition;
+class MemberDef;
+class OutputList;
+class FTextStream;
+
+/** \brief Abstract interface for index generators. */
+class IndexIntf
+{
+ public:
+ virtual ~IndexIntf() {}
+ virtual void initialize() = 0;
+ virtual void finalize() = 0;
+ virtual void incContentsDepth() = 0;
+ virtual void decContentsDepth() = 0;
+ virtual void addContentsItem(bool isDir, const char *name, const char *ref = 0,
+ const char *file = 0, const char *anchor = 0) = 0;
+ virtual void addIndexItem(Definition *context,MemberDef *md,const char *title) = 0;
+ virtual void addIndexFile(const char *name) = 0;
+ virtual void addImageFile(const char *name) = 0;
+ virtual void addStyleSheetFile(const char *name) = 0;
+};
+
+/** \brief A list of index interfaces.
+ *
+ * This class itself implements all methods of IndexIntf and
+ * just forwards the calls to all items in the list.
+ */
+class IndexList : public IndexIntf
+{
+ private:
+ QList<IndexIntf> m_intfs;
+
+ // --- foreach implementations for various number of arguments
+
+ void foreach(void (IndexIntf::*methodPtr)())
+ {
+ QListIterator<IndexIntf> li(m_intfs);
+ for (li.toFirst();li.current();++li) (li.current()->*methodPtr)();
+ }
+
+ template<typename A1>
+ void foreach(void (IndexIntf::*methodPtr)(A1),A1 a1)
+ {
+ QListIterator<IndexIntf> li(m_intfs);
+ for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1);
+ }
+
+ template<typename A1,typename A2,typename A3>
+ void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3),A1 a1,A2 a2,A3 a3)
+ {
+ QListIterator<IndexIntf> li(m_intfs);
+ for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3);
+ }
+
+ template<typename A1,typename A2,typename A3,typename A4>
+ void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4),A1 a1,A2 a2,A3 a3,A4 a4)
+ {
+ QListIterator<IndexIntf> li(m_intfs);
+ for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4);
+ }
+
+ template<typename A1,typename A2,typename A3,typename A4,typename A5>
+ void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4,A5),A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)
+ {
+ QListIterator<IndexIntf> li(m_intfs);
+ for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5);
+ }
+
+ public:
+ /** Creates a list of indexes */
+ IndexList() { m_intfs.setAutoDelete(TRUE); }
+ /** Add an index generator to the list */
+ void addIndex(IndexIntf *intf)
+ { m_intfs.append(intf); }
+
+ // IndexIntf implementation
+ void initialize()
+ { foreach(&IndexIntf::initialize); }
+ void finalize()
+ { foreach(&IndexIntf::finalize); }
+ void incContentsDepth()
+ { foreach(&IndexIntf::incContentsDepth); }
+ void decContentsDepth()
+ { foreach(&IndexIntf::decContentsDepth); }
+ void addContentsItem(bool isDir, const char *name, const char *ref = 0,
+ const char *file = 0, const char *anchor = 0)
+ { foreach<bool,const char *,const char *,const char *,const char*>
+ (&IndexIntf::addContentsItem,isDir,name,ref,file,anchor); }
+ void addIndexItem(Definition *context,MemberDef *md,const char *title=0)
+ { foreach<Definition *,MemberDef *>
+ (&IndexIntf::addIndexItem,context,md,title); }
+ void addIndexFile(const char *name)
+ { foreach<const char *>(&IndexIntf::addIndexFile,name); }
+ void addImageFile(const char *name)
+ { foreach<const char *>(&IndexIntf::addImageFile,name); }
+ void addStyleSheetFile(const char *name)
+ { foreach<const char *>(&IndexIntf::addStyleSheetFile,name); }
+
+};
+
+
+enum IndexSections
+{
+ isTitlePageStart,
+ isTitlePageAuthor,
+ isMainPage,
+ isModuleIndex,
+ isDirIndex,
+ isNamespaceIndex,
+ isClassHierarchyIndex,
+ isCompoundIndex,
+ isFileIndex,
+ isPageIndex,
+ isModuleDocumentation,
+ isDirDocumentation,
+ isNamespaceDocumentation,
+ isClassDocumentation,
+ isFileDocumentation,
+ isExampleDocumentation,
+ isPageDocumentation,
+ isPageDocumentation2,
+ isEndIndex
+};
+
+enum HighlightedItem
+{
+ HLI_None=0,
+ HLI_Main,
+ HLI_Modules,
+ HLI_Directories,
+ HLI_Namespaces,
+ HLI_Hierarchy,
+ HLI_Classes,
+ HLI_Annotated,
+ HLI_Files,
+ HLI_NamespaceMembers,
+ HLI_Functions,
+ HLI_Globals,
+ HLI_Pages,
+ HLI_Examples,
+ HLI_Search,
+
+ HLI_ClassVisible,
+ HLI_NamespaceVisible,
+ HLI_FileVisible
+};
+
+enum ClassMemberHighlight
+{
+ CMHL_All = 0,
+ CMHL_Functions,
+ CMHL_Variables,
+ CMHL_Typedefs,
+ CMHL_Enums,
+ CMHL_EnumValues,
+ CMHL_Properties,
+ CMHL_Events,
+ CMHL_Related,
+ CMHL_Total = CMHL_Related+1
+};
+
+enum FileMemberHighlight
+{
+ FMHL_All = 0,
+ FMHL_Functions,
+ FMHL_Variables,
+ FMHL_Typedefs,
+ FMHL_Enums,
+ FMHL_EnumValues,
+ FMHL_Defines,
+ FMHL_Total = FMHL_Defines+1
+};
+
+enum NamespaceMemberHighlight
+{
+ NMHL_All = 0,
+ NMHL_Functions,
+ NMHL_Variables,
+ NMHL_Typedefs,
+ NMHL_Enums,
+ NMHL_EnumValues,
+ NMHL_Total = NMHL_EnumValues+1
+};
+
+enum ClassHighlight
+{
+ CHL_All = 0,
+ CHL_Classes,
+ CHL_Structs,
+ CHL_Unions,
+ CHL_Interfaces,
+ CHL_Protocols,
+ CHL_Categories,
+ CHL_Exceptions,
+ CHL_Total = CHL_Exceptions+1
+};
+
+void writeIndex(OutputList &ol);
+void writeHierarchicalIndex(OutputList &ol);
+void writeAlphabeticalIndex(OutputList &ol);
+void writeClassHierarchy(OutputList &ol);
+void writeAnnotatedIndex(OutputList &ol);
+void writeAnnotatedClassList(OutputList &ol);
+void writeMemberList(OutputList &ol,bool useSections);
+void writeSourceIndex(OutputList &ol);
+void writeHeaderIndex(OutputList &ol);
+void writeHeaderFileList(OutputList &ol);
+void writeExampleIndex(OutputList &ol);
+void writePageIndex(OutputList &ol);
+void writeFileIndex(OutputList &ol);
+void writeNamespaceIndex(OutputList &ol);
+void writeGroupIndex(OutputList &ol);
+void writeDirIndex(OutputList &ol);
+void writePackageIndex(OutputList &ol);
+void writeClassMemberIndex(OutputList &ol);
+void writeFileMemberIndex(OutputList &ol);
+void writeNamespaceMemberIndex(OutputList &ol);
+void writeGraphicalClassHierarchy(OutputList &ol);
+void writeGraphInfo(OutputList &ol);
+
+void countDataStructures();
+
+extern int annotatedClasses;
+extern int hierarchyClasses;
+extern int documentedFiles;
+extern int documentedGroups;
+extern int documentedNamespaces;
+extern int indexedPages;
+extern int documentedClassMembers[CMHL_Total];
+extern int documentedFileMembers[FMHL_Total];
+extern int documentedNamespaceMembers[NMHL_Total];
+extern int documentedHtmlFiles;
+extern int documentedPages;
+extern int documentedDirs;
+
+void startTitle(OutputList &ol,const char *fileName,Definition *def=0);
+void endTitle(OutputList &ol,const char *fileName,const char *name);
+void startFile(OutputList &ol,const char *name,const char *manName,
+ const char *title,HighlightedItem hli=HLI_None,
+ bool additionalIndices=FALSE,const char *altSidebarName=0);
+void endFile(OutputList &ol,bool skipNavIndex=FALSE);
+
+void initClassMemberIndices();
+void initFileMemberIndices();
+void initNamespaceMemberIndices();
+void addClassMemberNameToIndex(MemberDef *md);
+void addFileMemberNameToIndex(MemberDef *md);
+void addNamespaceMemberNameToIndex(MemberDef *md);
+
+// search engine
+void writeJavascriptSearchIndex();
+void writeSearchCategories(FTextStream &t);
+
+#endif
diff --git a/src/index.xsd b/src/index.xsd
new file mode 100644
index 0000000..d7ab2a9
--- /dev/null
+++ b/src/index.xsd
@@ -0,0 +1,66 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:element name="doxygenindex" type="DoxygenType"/>
+
+ <xsd:complexType name="DoxygenType">
+ <xsd:sequence>
+ <xsd:element name="compound" type="CompoundType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="version" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="CompoundType">
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string"/>
+ <xsd:element name="member" type="MemberType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="refid" type="xsd:string" use="required"/>
+ <xsd:attribute name="kind" type="CompoundKind" use="required"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="MemberType">
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string"/>
+ </xsd:sequence>
+ <xsd:attribute name="refid" type="xsd:string" use="required"/>
+ <xsd:attribute name="kind" type="MemberKind" use="required"/>
+ </xsd:complexType>
+
+ <xsd:simpleType name="CompoundKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="class"/>
+ <xsd:enumeration value="struct"/>
+ <xsd:enumeration value="union"/>
+ <xsd:enumeration value="interface"/>
+ <xsd:enumeration value="protocol"/>
+ <xsd:enumeration value="category"/>
+ <xsd:enumeration value="exception"/>
+ <xsd:enumeration value="file"/>
+ <xsd:enumeration value="namespace"/>
+ <xsd:enumeration value="group"/>
+ <xsd:enumeration value="page"/>
+ <xsd:enumeration value="example"/>
+ <xsd:enumeration value="dir"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="MemberKind">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="define"/>
+ <xsd:enumeration value="property"/>
+ <xsd:enumeration value="event"/>
+ <xsd:enumeration value="variable"/>
+ <xsd:enumeration value="typedef"/>
+ <xsd:enumeration value="enum"/>
+ <xsd:enumeration value="enumvalue"/>
+ <xsd:enumeration value="function"/>
+ <xsd:enumeration value="signal"/>
+ <xsd:enumeration value="prototype"/>
+ <xsd:enumeration value="friend"/>
+ <xsd:enumeration value="dcop"/>
+ <xsd:enumeration value="slot"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+</xsd:schema>
+
diff --git a/src/index_xsd.h b/src/index_xsd.h
new file mode 100644
index 0000000..2f5d0c5
--- /dev/null
+++ b/src/index_xsd.h
@@ -0,0 +1,66 @@
+"<?xml version='1.0' encoding='utf-8' ?>\n"
+"<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n"
+" <xsd:element name=\"doxygenindex\" type=\"DoxygenType\"/>\n"
+"\n"
+" <xsd:complexType name=\"DoxygenType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"compound\" type=\"CompoundType\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"version\" type=\"xsd:string\" use=\"required\"/>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"CompoundType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"name\" type=\"xsd:string\"/>\n"
+" <xsd:element name=\"member\" type=\"MemberType\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"required\"/>\n"
+" <xsd:attribute name=\"kind\" type=\"CompoundKind\" use=\"required\"/>\n"
+" </xsd:complexType>\n"
+"\n"
+" <xsd:complexType name=\"MemberType\">\n"
+" <xsd:sequence>\n"
+" <xsd:element name=\"name\" type=\"xsd:string\"/>\n"
+" </xsd:sequence>\n"
+" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"required\"/>\n"
+" <xsd:attribute name=\"kind\" type=\"MemberKind\" use=\"required\"/>\n"
+" </xsd:complexType>\n"
+" \n"
+" <xsd:simpleType name=\"CompoundKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"class\"/>\n"
+" <xsd:enumeration value=\"struct\"/>\n"
+" <xsd:enumeration value=\"union\"/>\n"
+" <xsd:enumeration value=\"interface\"/>\n"
+" <xsd:enumeration value=\"protocol\"/>\n"
+" <xsd:enumeration value=\"category\"/>\n"
+" <xsd:enumeration value=\"exception\"/>\n"
+" <xsd:enumeration value=\"file\"/>\n"
+" <xsd:enumeration value=\"namespace\"/>\n"
+" <xsd:enumeration value=\"group\"/>\n"
+" <xsd:enumeration value=\"page\"/>\n"
+" <xsd:enumeration value=\"example\"/>\n"
+" <xsd:enumeration value=\"dir\"/>\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+" <xsd:simpleType name=\"MemberKind\">\n"
+" <xsd:restriction base=\"xsd:string\">\n"
+" <xsd:enumeration value=\"define\"/>\n"
+" <xsd:enumeration value=\"property\"/>\n"
+" <xsd:enumeration value=\"event\"/>\n"
+" <xsd:enumeration value=\"variable\"/>\n"
+" <xsd:enumeration value=\"typedef\"/>\n"
+" <xsd:enumeration value=\"enum\"/>\n"
+" <xsd:enumeration value=\"enumvalue\"/>\n"
+" <xsd:enumeration value=\"function\"/>\n"
+" <xsd:enumeration value=\"signal\"/>\n"
+" <xsd:enumeration value=\"prototype\"/>\n"
+" <xsd:enumeration value=\"friend\"/>\n"
+" <xsd:enumeration value=\"dcop\"/>\n"
+" <xsd:enumeration value=\"slot\"/>\n"
+" </xsd:restriction>\n"
+" </xsd:simpleType>\n"
+"\n"
+"</xsd:schema>\n"
+"\n"
diff --git a/src/indexlog.cpp b/src/indexlog.cpp
new file mode 100644
index 0000000..5fb67f5
--- /dev/null
+++ b/src/indexlog.cpp
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2008 by Sebastian Pipping.
+ * Copyright (C) 2008 Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Sebastian Pipping <sebastian@pipping.org>
+ */
+
+#include "indexlog.h"
+#include "message.h"
+#include "config.h"
+
+#include <qstring.h>
+#include <qfile.h>
+
+
+IndexLog::IndexLog()
+{
+}
+
+IndexLog::~IndexLog()
+{
+}
+
+void IndexLog::initialize()
+{
+ char const * const attributes[] =
+ { "xmlns",
+ "http://doxygen.org/xmlns/indexlog/1/0/",
+ NULL
+ };
+ m_out.open("log", attributes);
+
+ openMethodCall("initialize");
+ closeMethodCall();
+}
+
+void IndexLog::finalize()
+{
+ openMethodCall("finalize");
+ closeMethodCall();
+ m_out.close("log");
+ QCString fileName = Config_getString("HTML_OUTPUT")+"/index.log.xml";
+ QFile file(fileName);
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n", fileName.data());
+ exit(1);
+ }
+ m_out.dumpTo(file);
+ file.flush();
+ file.close();
+}
+
+void IndexLog::incContentsDepth()
+{
+ openMethodCall("incContentsDepth");
+ closeMethodCall();
+}
+
+void IndexLog::decContentsDepth()
+{
+ openMethodCall("decContentsDepth");
+ closeMethodCall();
+}
+
+void IndexLog::addContentsItem(bool isDir, char const * name,
+ char const * ref, char const * file,
+ char const * anchor)
+{
+ openMethodCall("addContentsItem");
+ addBoolParameter("isDir", isDir);
+ addStringParameter("name", name);
+ addStringParameter("ref", ref);
+ addStringParameter("file", file);
+ addStringParameter("anchor", anchor);
+ closeMethodCall();
+}
+
+void IndexLog::addIndexItem(char const * level1, char const * level2,
+ char const * contRef, char const * memRef,
+ char const * anchor, const MemberDef * md)
+{
+ openMethodCall("addIndexItem");
+ addStringParameter("level1", level1);
+ addStringParameter("level2", level2);
+ addStringParameter("contRef", contRef);
+ addStringParameter("memRef", memRef);
+ addStringParameter("anchor", anchor);
+ addMemberDefParameter("md", md);
+ closeMethodCall();
+}
+
+void IndexLog::addIndexFile(char const * name)
+{
+ openMethodCall("addIndexFile");
+ addStringParameter("name", name);
+ closeMethodCall();
+}
+
+void IndexLog::openMethodCall(char const * methodName)
+{
+ m_out.setCompressionEnabled(true);
+ m_out.open("call");
+ m_out.openCloseContent("method", methodName);
+}
+
+void IndexLog::addPrimitiveParameter(char const * parameterName,
+ char const * value)
+{
+ m_out.open("param");
+ m_out.openCloseContent("name", parameterName);
+ if (value != NULL)
+ {
+ m_out.openCloseContent("value", value);
+ }
+ m_out.close("param");
+}
+
+void IndexLog::addBoolParameter(char const * parameterName, bool value)
+{
+ addPrimitiveParameter(parameterName, value ? "true" : "false");
+}
+
+void IndexLog::addStringParameter(char const * parameterName,
+ char const * value)
+{
+ addPrimitiveParameter(parameterName, value);
+}
+
+void IndexLog::addMemberDefParameter(char const * parameterName,
+ const MemberDef * /*value*/)
+{
+ m_out.open("param");
+ m_out.openCloseContent("name", parameterName);
+ m_out.close("param");
+}
+
+void IndexLog::closeMethodCall()
+{
+ m_out.setCompressionEnabled(false);
+ m_out.close("call");
+}
+
diff --git a/src/indexlog.h b/src/indexlog.h
new file mode 100644
index 0000000..6875971
--- /dev/null
+++ b/src/indexlog.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2008 by Sebastian Pipping.
+ * Copyright (C) 2008 Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Sebastian Pipping <sebastian@pipping.org>
+ */
+
+#ifndef INDEXLOG_H
+#define INDEXLOG_H
+
+#include "index.h"
+#include "qhpxmlwriter.h"
+
+class IndexLog : public IndexIntf
+{
+ public:
+ IndexLog();
+ ~IndexLog();
+
+ // BEGIN IndexIntf
+ void initialize();
+ void finalize();
+ void incContentsDepth();
+ void decContentsDepth();
+ void addContentsItem(bool isDir, const char *name, const char *ref,
+ const char *file, const char *anchor);
+ void addIndexItem(const char *level1, const char *level2,
+ const char *contRef, const char *memRef,
+ const char *anchor, const MemberDef * md);
+ void addIndexFile(const char *name);
+ // END IndexIntf
+
+ private:
+ void openMethodCall(char const * methodName);
+ void addPrimitiveParameter(char const * parameterName,
+ char const * value);
+ void addBoolParameter(char const * parameterName, bool value);
+ void addStringParameter(char const * parameterName,
+ char const * value);
+ void addMemberDefParameter(char const * parameterName,
+ const MemberDef * value);
+ void closeMethodCall();
+
+ QhpXmlWriter m_out;
+};
+
+#endif // INDEXLOG_H
+
diff --git a/src/instdox.cpp b/src/instdox.cpp
new file mode 100644
index 0000000..08eb41e
--- /dev/null
+++ b/src/instdox.cpp
@@ -0,0 +1,180 @@
+/******************************************************************************
+ *
+ * $Id: instdox.cpp,v 1.16 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "qtbc.h"
+#include <qfile.h>
+#include <qfileinfo.h>
+
+#include "instdox.h"
+#include "doxygen.h"
+#include "config.h"
+#include "message.h"
+
+void writeInstallScript()
+{
+ QCString fileName=Config_getString("HTML_OUTPUT")+"/installdox";
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ {
+ FTextStream t(&f);
+ t << "#!" << Config_getString("PERL_PATH") << endl << endl << "%subst = ( ";
+
+ char *s=Config_getList("TAGFILES").first();
+ while (s)
+ {
+ QCString tagLine=s;
+ QCString fileName;
+ int eqPos = tagLine.find('=');
+ if (eqPos!=-1) // strip destination part
+ {
+ fileName = tagLine.left(eqPos).stripWhiteSpace();
+ }
+ else
+ {
+ fileName = tagLine;
+ }
+ QFileInfo fi(fileName);
+ t << "\"" << fi.fileName() << "\", \"\"";
+ s=Config_getList("TAGFILES").next();
+ if (s) t << ", ";
+ }
+
+ t << ");\n";
+ t << "$quiet = 0;\n";
+ t << "\n";
+ t << "while ( @ARGV ) {\n";
+ t << " $_ = shift @ARGV;\n";
+ t << " if ( s/^-// ) {\n";
+ t << " if ( /^l(.*)/ ) {\n";
+ t << " $v = ($1 eq \"\") ? shift @ARGV : $1;\n";
+ t << " ($v =~ /\\/$/) || ($v .= \"/\");\n";
+ t << " $_ = $v;\n";
+ t << " if ( /(.+)\\@(.+)/ ) {\n";
+ t << " if ( exists $subst{$1} ) {\n";
+ t << " $subst{$1} = $2;\n";
+ t << " } else {\n";
+ t << " print STDERR \"Unknown tag file $1 given with option -l\\n\";\n";
+ t << " &usage();\n";
+ t << " }\n";
+ t << " } else {\n";
+ t << " print STDERR \"Argument $_ is invalid for option -l\\n\";\n";
+ t << " &usage();\n";
+ t << " }\n";
+ t << " }\n";
+ t << " elsif ( /^q/ ) {\n";
+ t << " $quiet = 1;\n";
+ t << " }\n";
+ t << " elsif ( /^\\?|^h/ ) {\n";
+ t << " &usage();\n";
+ t << " }\n";
+ t << " else {\n";
+ t << " print STDERR \"Illegal option -$_\\n\";\n";
+ t << " &usage();\n";
+ t << " }\n";
+ t << " }\n";
+ t << " else {\n";
+ t << " push (@files, $_ );\n";
+ t << " }\n";
+ t << "}\n";
+ t << "\n";
+ t << "foreach $sub (keys %subst)\n";
+ t << "{\n";
+ t << " if ( $subst{$sub} eq \"\" ) \n";
+ t << " {\n";
+ t << " print STDERR \"No substitute given for tag file `$sub'\\n\";\n";
+ t << " &usage();\n";
+ t << " }\n";
+ t << " elsif ( ! $quiet && $sub ne \"_doc\" && $sub ne \"_cgi\" )\n";
+ t << " {\n";
+ t << " print \"Substituting $subst{$sub} for each occurrence of tag file $sub\\n\"; \n";
+ t << " }\n";
+ t << "}\n";
+ t << "\n";
+ t << "if ( ! @files ) {\n";
+ t << " if (opendir(D,\".\")) {\n";
+ t << " foreach $file ( readdir(D) ) {\n";
+ t << " $match = \"" << Config_getString("HTML_FILE_EXTENSION") << "\";\n";
+ t << " next if ( $file =~ /^\\.\\.?$/ );\n";
+ t << " ($file =~ /$match/) && (push @files, $file);\n";
+ t << " ($file =~ /\\.svg/) && (push @files, $file);\n";
+ t << " ($file =~ \"navtree.js\") && (push @files, $file);\n";
+ t << " }\n";
+ t << " closedir(D);\n";
+ t << " }\n";
+ t << "}\n";
+ t << "\n";
+ t << "if ( ! @files ) {\n";
+ t << " print STDERR \"Warning: No input files given and none found!\\n\";\n";
+ t << "}\n";
+ t << "\n";
+ t << "foreach $f (@files)\n";
+ t << "{\n";
+ t << " if ( ! $quiet ) {\n";
+ t << " print \"Editing: $f...\\n\";\n";
+ t << " }\n";
+ t << " $oldf = $f;\n";
+ t << " $f .= \".bak\";\n";
+ t << " unless (rename $oldf,$f) {\n";
+ t << " print STDERR \"Error: cannot rename file $oldf\\n\";\n";
+ t << " exit 1;\n";
+ t << " }\n";
+ t << " if (open(F,\"<$f\")) {\n";
+ t << " unless (open(G,\">$oldf\")) {\n";
+ t << " print STDERR \"Error: opening file $oldf for writing\\n\";\n";
+ t << " exit 1;\n";
+ t << " }\n";
+ t << " if ($oldf ne \"tree.js\") {\n";
+ t << " while (<F>) {\n";
+ t << " s/doxygen\\=\\\"([^ \\\"\\:\\t\\>\\<]*)\\:([^ \\\"\\t\\>\\<]*)\\\" (xlink:href|href|src)=\\\"\\2/doxygen\\=\\\"$1:$subst{$1}\\\" \\3=\\\"$subst{$1}/g;\n";
+ t << " print G \"$_\";\n";
+ t << " }\n";
+ t << " }\n";
+ t << " else {\n";
+ t << " while (<F>) {\n";
+ t << " s/\\\"([^ \\\"\\:\\t\\>\\<]*)\\:([^ \\\"\\t\\>\\<]*)\\\", \\\"\\2/\\\"$1:$subst{$1}\\\" ,\\\"$subst{$1}/g;\n";
+ t << " print G \"$_\";\n";
+ t << " }\n";
+ t << " }\n";
+ t << " } \n";
+ t << " else {\n";
+ t << " print STDERR \"Warning file $f does not exist\\n\";\n";
+ t << " }\n";
+ t << " unlink $f;\n";
+ t << "}\n";
+ t << "\n";
+ t << "sub usage {\n";
+ t << " print STDERR \"Usage: installdox [options] [html-file [html-file ...]]\\n\";\n";
+ t << " print STDERR \"Options:\\n\";\n";
+ t << " print STDERR \" -l tagfile\\@linkName tag file + URL or directory \\n\";\n";
+ t << " print STDERR \" -q Quiet mode\\n\\n\";\n";
+ t << " exit 1;\n";
+ t << "}\n";
+ }
+ else
+ {
+ err("Error: Cannot open file %s for writing\n",fileName.data());
+ }
+ f.close();
+ struct stat stat_struct;
+ stat(fileName,&stat_struct);
+#if !defined(_WIN32)
+ chmod(fileName,stat_struct.st_mode|S_IXUSR|S_IXGRP|S_IXOTH);
+#endif
+}
diff --git a/src/instdox.h b/src/instdox.h
new file mode 100644
index 0000000..9f7543c
--- /dev/null
+++ b/src/instdox.h
@@ -0,0 +1,23 @@
+/******************************************************************************
+ *
+ * $Id: instdox.h,v 1.6 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef INSTDOX_H
+#define INSTDOX_H
+
+extern void writeInstallScript();
+
+#endif
diff --git a/src/jquery.js b/src/jquery.js
new file mode 100644
index 0000000..60894d0
--- /dev/null
+++ b/src/jquery.js
@@ -0,0 +1,13 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){
+var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
diff --git a/src/jquery_js.h b/src/jquery_js.h
new file mode 100644
index 0000000..220d20e
--- /dev/null
+++ b/src/jquery_js.h
@@ -0,0 +1,13 @@
+"/*\n"
+" * jQuery JavaScript Library v1.3.2\n"
+" * http://jquery.com/\n"
+" *\n"
+" * Copyright (c) 2009 John Resig\n"
+" * Dual licensed under the MIT and GPL licenses.\n"
+" * http://docs.jquery.com/License\n"
+" *\n"
+" * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)\n"
+" * Revision: 6246\n"
+" */\n"
+"(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\\s)+>)[^>]*$|^#([\\w-]+)$/,f=/^.[^:#\\[\\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E===\"string\"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:\"\",jquery:\"1.3.2\",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H===\"find\"){G.selector=this.selector+(this.selector?\" \":\"\")+E}else{if(H){G.selector=this.selector+\".\"+H+\"(\"+E+\")\"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F===\"string\"){if(H===g){return this[0]&&o[G||\"attr\"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E==\"width\"||E==\"height\")&&parseFloat(F)<0){F=g}return this.attr(E,F,\"curCSS\")},text:function(F){if(typeof F!==\"object\"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E=\"\";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],\"find\",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),\"find\",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement(\"div\");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\\d+=\"(?:\\d+|null)\"/g,\"\").replace(/^\\s*/,\"\")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find(\"*\").andSelf(),F=0;E.find(\"*\").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],\"events\");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),\"filter\",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,\"closest\",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E===\"string\"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),\"not\",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E===\"string\"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is(\".\"+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,\"option\")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,\"select\")){var I=E.selectedIndex,L=[],M=E.options,H=E.type==\"select-one\";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||\"\").replace(/\\r/g,\"\")}return g}if(typeof K===\"number\"){K+=\"\"}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,\"select\")){var N=o.makeArray(K);o(\"option\",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\\d+=\"(?:\\d+|null)\"/g,\"\"):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),\"slice\",Array.prototype.slice.call(arguments).join(\",\"))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,\"table\")&&o.nodeName(O,\"tr\")?(N.getElementsByTagName(\"tbody\")[0]||N.appendChild(N.ownerDocument.createElement(\"tbody\"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:\"script\"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||\"\")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J===\"boolean\"){E=J;J=arguments[1]||{};H=2}if(typeof J!==\"object\"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L===\"object\"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)===\"[object Function]\"},isArray:function(E){return s.call(E)===\"[object Array]\"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!==\"HTML\"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\\S/.test(G)){var F=document.getElementsByTagName(\"head\")[0]||document.documentElement,E=document.createElement(\"script\");E.type=\"text/javascript\";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I===\"number\"&&G==\"curCSS\"&&!b.test(E)?I+\"px\":I},className:{add:function(E,F){o.each((F||\"\").split(/\\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?\" \":\"\")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\\s+/),function(G){return !o.className.has(F,G)}).join(\" \"):\"\"}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F==\"width\"||F==\"height\"){var L,G={position:\"absolute\",visibility:\"hidden\",display:\"block\"},K=F==\"width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"];function I(){L=F==\"width\"?H.offsetWidth:H.offsetHeight;if(E===\"border\"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,\"padding\"+this,true))||0}if(E===\"margin\"){L+=parseFloat(o.curCSS(H,\"margin\"+this,true))||0}else{L-=parseFloat(o.curCSS(H,\"border\"+this+\"Width\",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F==\"opacity\"&&!o.support.opacity){L=o.attr(E,\"opacity\");return L==\"\"?\"1\":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F=\"float\"}F=F.replace(/([A-Z])/g,\"-$1\").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F==\"opacity\"&&L==\"\"){L=\"1\"}}else{if(I.currentStyle){var J=F.replace(/\\-(\\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\\d+(px)?$/i.test(L)&&/^\\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+\"px\";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement===\"undefined\"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]===\"string\"){var H=/^<(\\w+)\\s*\\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement(\"div\");o.each(F,function(P,S){if(typeof S===\"number\"){S+=\"\"}if(!S){return}if(typeof S===\"string\"){S=S.replace(/(<(\\w+)[^>]*?)\\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+\"></\"+T+\">\"});var O=S.replace(/^\\s+/,\"\").substring(0,10).toLowerCase();var Q=!O.indexOf(\"<opt\")&&[1,\"<select multiple='multiple'>\",\"</select>\"]||!O.indexOf(\"<leg\")&&[1,\"<fieldset>\",\"</fieldset>\"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,\"<table>\",\"</table>\"]||!O.indexOf(\"<tr\")&&[2,\"<table><tbody>\",\"</tbody></table>\"]||(!O.indexOf(\"<td\")||!O.indexOf(\"<th\"))&&[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"]||!O.indexOf(\"<col\")&&[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"]||!o.support.htmlSerialize&&[1,\"div<div>\",\"</div>\"]||[0,\"\",\"\"];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf(\"<table\")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]==\"<table>\"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],\"tbody\")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],\"script\")&&(!G[J].type||G[J].type.toLowerCase()===\"text/javascript\")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName(\"script\"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G==\"selected\"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G==\"type\"&&o.nodeName(J,\"input\")&&J.parentNode){throw\"type property can't be changed\"}J[G]=K}if(o.nodeName(J,\"form\")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G==\"tabIndex\"){var I=J.getAttributeNode(\"tabIndex\");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G==\"style\"){return o.attr(J.style,\"cssText\",K)}if(L){J.setAttribute(G,\"\"+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G==\"opacity\"){if(L){J.zoom=1;J.filter=(J.filter||\"\").replace(/alpha\\([^)]*\\)/,\"\")+(parseInt(K)+\"\"==\"NaN\"?\"\":\"alpha(opacity=\"+K*100+\")\")}return J.filter&&J.filter.indexOf(\"opacity=\")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+\"\":\"\"}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||\"\").replace(/^\\s+|\\s+$/g,\"\")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G===\"string\"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\\/: ]([\\d.]+)/)||[0,\"0\"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,\"parentNode\")},next:function(E){return o.nth(E,2,\"nextSibling\")},prev:function(E){return o.nth(E,2,\"previousSibling\")},nextAll:function(E){return o.dir(E,\"nextSibling\")},prevAll:function(E){return o.dir(E,\"previousSibling\")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,\"iframe\")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G==\"string\"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){\n"
+"var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,\"\");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!==\"boolean\"){E=!o.className.has(this,F)}o.className[E?\"add\":\"remove\"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o(\"*\",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h=\"jQuery\"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E=\"\";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||\"fx\")+\"queue\";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G===\"fx\"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(\".\");H[1]=H[1]?\".\"+H[1]:\"\";if(G===g){var F=this.triggerHandler(\"getData\"+H[1]+\"!\",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger(\"setData\"+H[1]+\"!\",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!==\"string\"){F=E;E=\"fx\"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E==\"fx\"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});\n"
diff --git a/src/jquery_ui.js b/src/jquery_ui.js
new file mode 100644
index 0000000..facb8dd
--- /dev/null
+++ b/src/jquery_ui.js
@@ -0,0 +1,32 @@
+/*
+ * jQuery UI 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * ui.core.js
+ */
+(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d="ui-resizable-"+h;var g=c('<div class="ui-resizable-handle '+d+'"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],h=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(":hidden")||c(f).parents(":hidden").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0))
+{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
+ * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
+ * Date: 2/8/2008
+ * @author Ariel Flesler
+ * @version 1.3.2
+ */
+;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+
diff --git a/src/jquery_ui_js.h b/src/jquery_ui_js.h
new file mode 100644
index 0000000..3b90c22
--- /dev/null
+++ b/src/jquery_ui_js.h
@@ -0,0 +1,32 @@
+"/*\n"
+" * jQuery UI 1.7.2\n"
+" *\n"
+" * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)\n"
+" * Dual licensed under the MIT (MIT-LICENSE.txt)\n"
+" * and GPL (GPL-LICENSE.txt) licenses.\n"
+" *\n"
+" * http://docs.jquery.com/UI\n"
+" */\n"
+"jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:\"1.7.2\",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css(\"overflow\")==\"hidden\"){return false}var j=(k&&k==\"left\")?\"scrollLeft\":\"scrollTop\",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h=\"http://www.w3.org/2005/07/aaa\",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j==\"role\"?(m?f.call(this,k,j,\"wairole:\"+l):(f.apply(this,arguments)||\"\").replace(b,\"\")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,\"aaa:\"),l):f.call(this,k,j.replace(a,\"aaa:\"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,\"\"))}):e.call(this,j))}}c.fn.extend({remove:function(){c(\"*\",this).add(this).each(function(){c(this).triggerHandler(\"remove\")});return i.apply(this,arguments)},enableSelection:function(){return this.attr(\"unselectable\",\"off\").css(\"MozUserSelect\",\"\").unbind(\"selectstart.ui\")},disableSelection:function(){return this.attr(\"unselectable\",\"on\").css(\"MozUserSelect\",\"none\").bind(\"selectstart.ui\",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css(\"position\")))||(/absolute/).test(this.css(\"position\"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,\"position\",1))&&(/(auto|scroll)/).test(c.curCSS(this,\"overflow\",1)+c.curCSS(this,\"overflow-y\",1)+c.curCSS(this,\"overflow-x\",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,\"overflow\",1)+c.curCSS(this,\"overflow-y\",1)+c.curCSS(this,\"overflow-x\",1))}).eq(0)}return(/fixed/).test(this.css(\"position\"))||!j.length?c(document):j}});c.extend(c.expr[\":\"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,\"tabindex\");return(/input|select|textarea|button|object/.test(l)?!k.disabled:\"a\"==l||\"area\"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)[\"area\"==l?\"parents\":\"closest\"](\":hidden\").length},tabbable:function(k){var j=c.attr(k,\"tabindex\");return(isNaN(j)||j>=0)&&c(k).is(\":focusable\")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p==\"string\"?p.split(/,?\\s+/):p)}var j=k(\"getter\");if(l.length==1&&typeof l[0]==\"string\"){j=j.concat(k(\"getterSetter\"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(\".\")[0];k=k.split(\".\")[1];c.fn[k]=function(p){var n=(typeof p==\"string\"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)==\"_\"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+\"-\"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind(\"setData.\"+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind(\"getData.\"+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind(\"remove\",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter=\"option\"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+\"-disabled \"+this.namespace+\"-state-disabled\").removeAttr(\"aria-disabled\")},option:function(l,m){var k=l,j=this;if(typeof l==\"string\"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j==\"disabled\"){this.element[k?\"addClass\":\"removeClass\"](this.widgetBaseClass+\"-disabled \"+this.namespace+\"-state-disabled\").attr(\"aria-disabled\",k)}},enable:function(){this._setData(\"disabled\",false)},disable:function(){this._setData(\"disabled\",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind(\"mousedown.\"+this.widgetName,function(k){return j._mouseDown(k)}).bind(\"click.\"+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr(\"unselectable\");this.element.attr(\"unselectable\",\"on\")}this.started=false},_mouseDestroy:function(){this.element.unbind(\".\"+this.widgetName);(c.browser.msie&&this.element.attr(\"unselectable\",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel==\"string\"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).bind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2\n"
+" *\n"
+" * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)\n"
+" * Dual licensed under the MIT (MIT-LICENSE.txt)\n"
+" * and GPL (GPL-LICENSE.txt) licenses.\n"
+" *\n"
+" * http://docs.jquery.com/UI/Resizables\n"
+" *\n"
+" * Depends:\n"
+" * ui.core.js\n"
+" */\n"
+"(function(c){c.widget(\"ui.resizable\",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass(\"ui-resizable\");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||\"ui-resizable-helper\":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css(\"position\"))&&c.browser.opera){this.element.css({position:\"relative\",top:\"auto\",left:\"auto\"})}this.element.wrap(c('<div class=\"ui-wrapper\" style=\"overflow: hidden;\"></div>').css({position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")}));this.element=this.element.parent().data(\"resizable\",this.element.data(\"resizable\"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css(\"marginLeft\"),marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css(\"resize\");this.originalElement.css(\"resize\",\"none\");this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"}));this.originalElement.css({margin:this.originalElement.css(\"margin\")});this._proportionallyResize()}this.handles=j.handles||(!c(\".ui-resizable-handle\",this.element).length?\"e,s,se\":{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"});if(this.handles.constructor==String){if(this.handles==\"all\"){this.handles=\"n,e,s,w,se,sw,ne,nw\"}var k=this.handles.split(\",\");this.handles={};for(var f=0;f<k.length;f++){var h=c.trim(k[f]),d=\"ui-resizable-\"+h;var g=c('<div class=\"ui-resizable-handle '+d+'\"></div>');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if(\"se\"==h){g.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\")}this.handles[h]=\".ui-resizable-\"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=[\"padding\",/ne|nw|n/.test(m)?\"Top\":/se|sw|s/.test(m)?\"Bottom\":/^e$/.test(m)?\"Right\":\"Left\"].join(\"\");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(\".ui-resizable-handle\",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:\"se\"}});if(j.autoHide){this._handles.hide();c(this.element).addClass(\"ui-resizable-autohide\").hover(function(){c(this).removeClass(\"ui-resizable-autohide\");e._handles.show()},function(){if(!e.resizing){c(this).addClass(\"ui-resizable-autohide\");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\").removeData(\"resizable\").unbind(\".resizable\").find(\".ui-resizable-handle\").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css(\"position\"),width:e.outerWidth(),height:e.outerHeight(),top:e.css(\"top\"),left:e.css(\"left\")})).end().remove()}this.originalElement.css(\"resize\",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(\".ui-draggable\")||(/absolute/).test(d.css(\"position\"))){d.css({position:\"absolute\",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css(\"position\"))){d.css({position:\"relative\",top:\"auto\",left:\"auto\"})}this._renderProxy();var j=b(this.helper.css(\"left\")),g=b(this.helper.css(\"top\"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio==\"number\")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(\".ui-resizable-\"+this.axis).css(\"cursor\");c(\"body\").css(\"cursor\",h==\"auto\"?this.axis+\"-resize\":h);d.addClass(\"ui-resizable-resizing\");this._propagate(\"start\",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate(\"resize\",d);g.css({top:this.position.top+\"px\",left:this.position.left+\"px\",width:this.size.width+\"px\",height:this.size.height+\"px\"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger(\"resize\",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],\"left\")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css(\"left\"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css(\"top\"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c(\"body\").css(\"cursor\",\"auto\");this.element.removeClass(\"ui-resizable-resizing\");this._propagate(\"stop\",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d==\"sw\"){g.left=i.left+(e.width-g.width);g.top=null}if(d==\"nw\"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidth<k.width),l=a(k.height)&&h.maxHeight&&(h.maxHeight<k.height),g=a(k.width)&&h.minWidth&&(h.minWidth>k.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e<this._proportionallyResizeElements.length;e++){var g=this._proportionallyResizeElements[e];if(!this.borderDif){var d=[g.css(\"borderTopWidth\"),g.css(\"borderRightWidth\"),g.css(\"borderBottomWidth\"),g.css(\"borderLeftWidth\")],h=[g.css(\"paddingTop\"),g.css(\"paddingRight\"),g.css(\"paddingBottom\"),g.css(\"paddingLeft\")];this.borderDif=c.map(d,function(k,m){var l=parseInt(k,10)||0,n=parseInt(h[m],10)||0;return l+n})}if(c.browser.msie&&!(!(c(f).is(\":hidden\")||c(f).parents(\":hidden\").length))){continue}g.css({height:(f.height()-this.borderDif[0]-this.borderDif[2])||0,width:(f.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var e=this.element,h=this.options;this.elementOffset=e.offset();if(this._helper){this.helper=this.helper||c('<div style=\"overflow:hidden;\"></div>');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:\"absolute\",left:this.elementOffset.left-f+\"px\",top:this.elementOffset.top-f+\"px\",zIndex:++h.zIndex});this.helper.appendTo(\"body\").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!=\"resize\"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:\"1.7.2\",eventPrefix:\"resize\",defaults:{alsoResize:false,animate:false,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:false,autoHide:false,cancel:\":input,option\",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:\"e,s,se\",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function(e,f){var d=c(this).data(\"resizable\"),g=d.options;_store=function(h){c(h).each(function(){c(this).data(\"resizable-alsoresize\",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css(\"left\"),10),top:parseInt(c(this).css(\"top\"),10)})})};if(typeof(g.alsoResize)==\"object\"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data(\"resizable\"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data(\"resizable-alsoresize\"),o={},n=m&&m.length?m:[\"width\",\"height\",\"top\",\"left\"];c.each(n||[\"width\",\"height\",\"top\",\"left\"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css(\"position\"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:\"absolute\",top:\"auto\",left:\"auto\"})}p.css(o)})};if(typeof(i.alsoResize)==\"object\"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data(\"resizable\");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:\"relative\"})}c(this).removeData(\"resizable-alsoresize-start\")}});c.ui.plugin.add(\"resizable\",\"animate\",{stop:function(h,m){var n=c(this).data(\"resizable\"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],\"left\")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css(\"left\"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css(\"top\"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css(\"width\"),10),height:parseInt(n.element.css(\"height\"),10),top:parseInt(n.element.css(\"top\"),10),left:parseInt(n.element.css(\"left\"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate(\"resize\",h)}})}});c.ui.plugin.add(\"resizable\",\"containment\",{start:function(e,q){var s=c(this).data(\"resizable\"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(p,o){h[p]=b(m.css(\"padding\"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,\"left\")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data(\"resizable\"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css(\"position\"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0))\n"
+"{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css(\"position\"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data(\"resizable\"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css(\"position\"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css(\"position\"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add(\"resizable\",\"ghost\",{start:function(f,g){var d=c(this).data(\"resizable\"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:\"block\",position:\"relative\",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass(\"ui-resizable-ghost\").addClass(typeof h.ghost==\"string\"?h.ghost:\"\");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data(\"resizable\"),g=d.options;if(d.ghost){d.ghost.css({position:\"relative\",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data(\"resizable\"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add(\"resizable\",\"grid\",{resize:function(d,l){var n=c(this).data(\"resizable\"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid==\"number\"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;\n"
+"/**\n"
+" * jQuery.ScrollTo - Easy element scrolling using jQuery.\n"
+" * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com\n"
+" * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).\n"
+" * Date: 2/8/2008\n"
+" * @author Ariel Flesler\n"
+" * @version 1.3.2\n"
+" */\n"
+";(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);\n"
+"\n"
diff --git a/src/lang_cfg.h b/src/lang_cfg.h
new file mode 100644
index 0000000..99be35e
--- /dev/null
+++ b/src/lang_cfg.h
@@ -0,0 +1,39 @@
+#define LANG_NL
+#define LANG_SV
+#define LANG_CZ
+#define LANG_FR
+#define LANG_ID
+#define LANG_IT
+#define LANG_DE
+#define LANG_JP
+#define LANG_JE
+#define LANG_ES
+#define LANG_FI
+#define LANG_RU
+#define LANG_HR
+#define LANG_PL
+#define LANG_PT
+#define LANG_HU
+#define LANG_KR
+#define LANG_KE
+#define LANG_RO
+#define LANG_SI
+#define LANG_CN
+#define LANG_NO
+#define LANG_MK
+#define LANG_BR
+#define LANG_DK
+#define LANG_SK
+#define LANG_UA
+#define LANG_GR
+#define LANG_TW
+#define LANG_SR
+#define LANG_CA
+#define LANG_LT
+#define LANG_ZA
+#define LANG_AR
+#define LANG_FA
+#define LANG_SC
+#define LANG_VI
+#define LANG_TR
+#define LANG_EO
diff --git a/src/language.cpp b/src/language.cpp
new file mode 100644
index 0000000..1264bdd
--- /dev/null
+++ b/src/language.cpp
@@ -0,0 +1,413 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "message.h"
+#include "language.h"
+#include "lang_cfg.h"
+#include "translator.h"
+#include "translatordecoder.h"
+#include "translator_en.h"
+#if !defined(ENGLISH_ONLY)
+#include "translator_adapter.h"
+#ifdef LANG_NL
+#include "translator_nl.h"
+#endif
+#ifdef LANG_SV
+#include "translator_sv.h"
+#endif
+#ifdef LANG_CZ
+#include "translator_cz.h"
+#endif
+#ifdef LANG_FR
+#include "translator_fr.h"
+#endif
+#ifdef LANG_ID
+#include "translator_id.h"
+#endif
+#ifdef LANG_IT
+#include "translator_it.h"
+#endif
+#ifdef LANG_DE
+#include "translator_de.h"
+#endif
+#ifdef LANG_JP
+#include "translator_jp.h"
+#endif
+#ifdef LANG_JE
+#include "translator_je.h"
+#endif
+#ifdef LANG_ES
+#include "translator_es.h"
+#endif
+#ifdef LANG_EO
+#include "translator_eo.h"
+#endif
+#ifdef LANG_FI
+#include "translator_fi.h"
+#endif
+#ifdef LANG_RU
+#include "translator_ru.h"
+#endif
+#ifdef LANG_HR
+#include "translator_hr.h"
+#endif
+#ifdef LANG_PL
+#include "translator_pl.h"
+#endif
+#ifdef LANG_PT
+#include "translator_pt.h"
+#endif
+#ifdef LANG_HU
+#include "translator_hu.h"
+#endif
+#ifdef LANG_KE
+#include "translator_ke.h"
+#endif
+#ifdef LANG_KR
+#include "translator_kr.h"
+#endif
+#ifdef LANG_RO
+#include "translator_ro.h"
+#endif
+#ifdef LANG_SI
+#include "translator_si.h"
+#endif
+#ifdef LANG_CN
+#include "translator_cn.h"
+#endif
+#ifdef LANG_TW
+#include "translator_tw.h"
+#endif
+#ifdef LANG_NO
+#include "translator_no.h"
+#endif
+#ifdef LANG_BR
+#include "translator_br.h"
+#endif
+#ifdef LANG_DK
+#include "translator_dk.h"
+#endif
+#ifdef LANG_SK
+#include "translator_sk.h"
+#endif
+#ifdef LANG_UA
+#include "translator_ua.h"
+#endif
+#ifdef LANG_GR
+#include "translator_gr.h"
+#endif
+#ifdef LANG_SR
+#include "translator_sr.h"
+#endif
+#ifdef LANG_CA
+#include "translator_ca.h"
+#endif
+//#ifdef LANG_JS
+//#include "translator_js.h"
+//#endif
+#ifdef LANG_LT
+#include "translator_lt.h"
+#endif
+#ifdef LANG_ZA
+#include "translator_za.h"
+#endif
+#ifdef LANG_AR
+#include "translator_ar.h"
+#endif
+#ifdef LANG_FA
+#include "translator_fa.h"
+#endif
+#ifdef LANG_MK
+#include "translator_mk.h"
+#endif
+#ifdef LANG_SC
+#include "translator_sc.h"
+#endif
+#ifdef LANG_VI
+#include "translator_vi.h"
+#endif
+#ifdef LANG_TR
+#include "translator_tr.h"
+#endif
+#endif // !ENGLISH_ONLY
+
+#define L_EQUAL(a) !stricmp(langName,a)
+
+Translator *theTranslator=0;
+
+static const char obsoleteMsg[] =
+ "---------\n"
+ "ERROR: The selected language is no longer supported!\n"
+ "If you want doxygen to produce output in this language \n"
+ "you are kindly requested to help bringing the documentation \n"
+ "up to date. Please read the development section of the manual \n"
+ "for more information or contact Petr Prikryl (Prikryl@skil.cz).\n"
+ "Thanks in advance!\n"
+ "---------\n";
+
+bool setTranslator(const char *langName)
+{
+ if (L_EQUAL("english"))
+ {
+ theTranslator=new TranslatorEnglish;
+ }
+#if !defined(ENGLISH_ONLY)
+#ifdef LANG_NL
+ else if (L_EQUAL("dutch"))
+ {
+ theTranslator=new TranslatorDutch;
+ }
+#endif
+#ifdef LANG_SV
+ else if (L_EQUAL("swedish"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorSwedish);
+ }
+#endif
+#ifdef LANG_CZ
+ else if (L_EQUAL("czech"))
+ {
+ theTranslator=new TranslatorCzech;
+ }
+#endif
+#ifdef LANG_FR
+ else if (L_EQUAL("french"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorFrench);
+ }
+#endif
+#ifdef LANG_ID
+ else if (L_EQUAL("indonesian"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorIndonesian);
+ }
+#endif
+#ifdef LANG_IT
+ else if (L_EQUAL("italian"))
+ {
+ theTranslator=new TranslatorItalian;
+ }
+#endif
+#ifdef LANG_DE
+ else if (L_EQUAL("german"))
+ {
+ theTranslator=new TranslatorGerman;
+ }
+#endif
+#ifdef LANG_JP
+ else if (L_EQUAL("japanese"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorJapanese);
+ }
+#endif
+#ifdef LANG_JE
+ else if (L_EQUAL("japanese-en"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorJapaneseEn);
+ }
+#endif
+#ifdef LANG_ES
+ else if (L_EQUAL("spanish"))
+ {
+ theTranslator=new TranslatorSpanish;
+ }
+#endif
+#ifdef LANG_FI
+ else if (L_EQUAL("finnish"))
+ {
+ theTranslator=new TranslatorFinnish;
+ }
+#endif
+#ifdef LANG_RU
+ else if (L_EQUAL("russian"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorRussian);
+ }
+#endif
+#ifdef LANG_HR
+ else if (L_EQUAL("croatian"))
+ {
+ theTranslator=new TranslatorCroatian;
+ }
+#endif
+#ifdef LANG_PL
+ else if (L_EQUAL("polish"))
+ {
+ theTranslator=new TranslatorPolish;
+ }
+#endif
+#ifdef LANG_PT
+ else if (L_EQUAL("portuguese"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorPortuguese);
+ }
+#endif
+#ifdef LANG_HU
+ else if (L_EQUAL("hungarian"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorHungarian);
+ }
+#endif
+#ifdef LANG_KR
+ else if (L_EQUAL("korean"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorKorean);
+ }
+#endif
+#ifdef LANG_KE
+ else if (L_EQUAL("korean-en"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorKoreanEn);
+ }
+#endif
+#ifdef LANG_RO
+ else if (L_EQUAL("romanian"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorRomanian);
+ }
+#endif
+#ifdef LANG_SI
+ else if (L_EQUAL("slovene"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorSlovene);
+ }
+#endif
+#ifdef LANG_CN
+ else if (L_EQUAL("chinese"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorChinese);
+ }
+#endif
+#ifdef LANG_TW
+ else if (L_EQUAL("chinese-traditional"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorChinesetraditional);
+ }
+#endif
+#ifdef LANG_NO
+ else if (L_EQUAL("norwegian"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorNorwegian);
+ }
+#endif
+#ifdef LANG_BR
+ else if (L_EQUAL("brazilian"))
+ {
+ theTranslator=new TranslatorBrazilian;
+ }
+#endif
+#ifdef LANG_DK
+ else if (L_EQUAL("danish"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorDanish);
+ }
+#endif
+#ifdef LANG_SK
+ else if (L_EQUAL("slovak"))
+ {
+ theTranslator=new TranslatorSlovak;
+ }
+#endif
+#ifdef LANG_UA
+ else if (L_EQUAL("ukrainian"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorUkrainian);
+ }
+#endif
+#ifdef LANG_GR
+ else if (L_EQUAL("greek"))
+ {
+ theTranslator=new TranslatorGreek;
+ }
+#endif
+#ifdef LANG_SR
+ else if (L_EQUAL("serbian"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorSerbian);
+ }
+#endif
+#ifdef LANG_SC
+ else if (L_EQUAL("serbian-cyrilic"))
+ {
+ theTranslator=new TranslatorSerbian;
+ }
+#endif
+#ifdef LANG_CA
+ else if (L_EQUAL("catalan"))
+ {
+ theTranslator=new TranslatorCatalan;
+ }
+#endif
+#ifdef LANG_LT
+ else if (L_EQUAL("lithuanian"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorLithuanian);
+ }
+#endif
+#ifdef LANG_ZA
+ else if (L_EQUAL("afrikaans"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorAfrikaans);
+ }
+#endif
+#ifdef LANG_AR
+ else if (L_EQUAL("arabic"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorArabic);
+ }
+#endif
+#ifdef LANG_FA
+ else if (L_EQUAL("persian") || L_EQUAL("farsi"))
+ {
+ theTranslator=new TranslatorPersian;
+ }
+#endif
+#ifdef LANG_MK
+ else if (L_EQUAL("macedonian"))
+ {
+ theTranslator=new TranslatorMacedonian;
+ }
+#endif
+#ifdef LANG_VI
+ else if (L_EQUAL("vietnamese"))
+ {
+ theTranslator=new TranslatorVietnamese;
+ }
+#endif
+#ifdef LANG_TR
+ else if (L_EQUAL("turkish"))
+ {
+ theTranslator=new TranslatorTurkish;
+ }
+#endif
+#ifdef LANG_EO
+ else if (L_EQUAL("esperanto"))
+ {
+ theTranslator=new TranslatorEsperanto;
+ }
+#endif
+#endif // ENGLISH_ONLY
+ else // use the default language (i.e. english)
+ {
+ theTranslator=new TranslatorEnglish;
+ return FALSE;
+ }
+
+ QCString msg = theTranslator->updateNeededMessage();
+ if (!msg.isEmpty()) err(msg);
+ return TRUE;
+}
diff --git a/src/language.h b/src/language.h
new file mode 100644
index 0000000..6c86f70
--- /dev/null
+++ b/src/language.h
@@ -0,0 +1,26 @@
+/******************************************************************************
+ *
+ * $Id: language.h,v 1.4 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef LANGUAGE_H
+#define LANGUAGE_H
+
+#include "translator.h"
+
+extern Translator *theTranslator;
+extern bool setTranslator(const char *languageName);
+
+#endif
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
new file mode 100644
index 0000000..59ebc3b
--- /dev/null
+++ b/src/latexdocvisitor.cpp
@@ -0,0 +1,1520 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#include <qfileinfo.h>
+#include "latexdocvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "dot.h"
+#include "util.h"
+#include "message.h"
+#include "parserintf.h"
+#include "msc.h"
+#include "htmlattrib.h"
+
+static QCString escapeLabelName(const char *s)
+{
+ QCString result;
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '%': result+="\\%"; break;
+ case '|': result+="\\texttt{\"|}"; break;
+ case '!': result+="\"!"; break;
+ default: result+=c;
+ }
+ }
+ return result;
+}
+
+const int maxLevels=5;
+static const char *secLabels[maxLevels] =
+ { "section","subsection","subsubsection","paragraph","subparagraph" };
+
+static const char *getSectionName(int level)
+{
+ int l = level;
+ if (Config_getBool("COMPACT_LATEX")) l++;
+ if (Doxygen::insideMainPage) l--;
+ return secLabels[QMIN(maxLevels-1,l)];
+}
+
+static int rowspan(DocHtmlCell *cell)
+{
+ int retval = 0;
+ HtmlAttribList attrs = cell->attribs ();
+ for (unsigned int i = 0; i < attrs.count(); ++i)
+ {
+ if ("rowspan" == attrs.at(i)->name.lower())
+ {
+ retval = attrs.at(i)->value.toInt();
+ break;
+ }
+ }
+ return retval;
+}
+
+QCString LatexDocVisitor::escapeMakeIndexChars(const char *s)
+{
+ QCString result;
+ const char *p=s;
+ char str[2]; str[1]=0;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '!': m_t << "\"!"; break;
+ case '"': m_t << "\"\""; break;
+ case '@': m_t << "\"@"; break;
+ case '|': m_t << "\\texttt{\"|}"; break;
+ case '[': m_t << "["; break;
+ case ']': m_t << "]"; break;
+ default: str[0]=c; filter(str); break;
+ }
+ }
+ return result;
+}
+
+
+LatexDocVisitor::LatexDocVisitor(FTextStream &t,CodeOutputInterface &ci,
+ const char *langExt,bool insideTabbing)
+ : DocVisitor(DocVisitor_Latex), m_t(t), m_ci(ci), m_insidePre(FALSE),
+ m_insideItem(FALSE), m_hide(FALSE), m_insideTabbing(insideTabbing),
+ m_langExt(langExt), m_currentColumn(0), m_inRowspan(FALSE)
+{
+}
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+void LatexDocVisitor::visit(DocWord *w)
+{
+ if (m_hide) return;
+ filter(w->word());
+}
+
+void LatexDocVisitor::visit(DocLinkedWord *w)
+{
+ if (m_hide) return;
+ startLink(w->ref(),w->file(),w->anchor());
+ filter(w->word());
+ endLink(w->ref(),w->file(),w->anchor());
+}
+
+void LatexDocVisitor::visit(DocWhiteSpace *w)
+{
+ if (m_hide) return;
+ if (m_insidePre)
+ {
+ m_t << w->chars();
+ }
+ else
+ {
+ m_t << " ";
+ }
+}
+
+void LatexDocVisitor::visit(DocSymbol *s)
+{
+ if (m_hide) return;
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "$\\backslash$"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: if (m_insidePre) m_t << "<"; else m_t << "$<$";
+ break;
+ case DocSymbol::Greater: if (m_insidePre) m_t << ">"; else m_t << "$>$"; break;
+ case DocSymbol::Amp: m_t << "\\&"; break;
+ case DocSymbol::Dollar: m_t << "\\$"; break;
+ case DocSymbol::Hash: m_t << "\\#"; break;
+ case DocSymbol::DoubleColon: m_t << "::"; break;
+ case DocSymbol::Percent: m_t << "\\%"; break;
+ case DocSymbol::Copy: m_t << "\\copyright"; break;
+ case DocSymbol::Tm: m_t << "\\texttrademark"; break;
+ case DocSymbol::Reg: m_t << "\\textregistered"; break;
+ case DocSymbol::Apos: m_t << "'"; break;
+ case DocSymbol::Quot: m_t << "\""; break;
+ case DocSymbol::Lsquo: m_t << "`"; break;
+ case DocSymbol::Rsquo: m_t << "'"; break;
+ case DocSymbol::Ldquo: m_t << "``"; break;
+ case DocSymbol::Rdquo: m_t << "''"; break;
+ case DocSymbol::Ndash: m_t << "--"; break;
+ case DocSymbol::Mdash: m_t << "---"; break;
+ case DocSymbol::Uml:
+ if (s->letter()=='i')
+ m_t << "\\\"{\\i}";
+ else
+ m_t << "\\\"{" << s->letter() << "}";
+ break;
+ case DocSymbol::Acute:
+ if (s->letter()=='i')
+ m_t << "\\'{\\i}";
+ else
+ m_t << "\\'{" << s->letter() << "}";
+ break;
+ case DocSymbol::Grave:
+ if (s->letter()=='i')
+ m_t << "\\`{\\i}";
+ else
+ m_t << "\\`{" << s->letter() << "}";
+ break;
+ case DocSymbol::Circ:
+ if (s->letter()=='i')
+ m_t << "\\^{\\i}";
+ else
+ m_t << "\\^{" << s->letter() << "}";
+ break;
+ case DocSymbol::Slash: if (tolower(s->letter())=='o')
+ m_t << "{\\" << s->letter() << "}";
+ else
+ m_t << s->letter();
+ break;
+ case DocSymbol::Tilde: m_t << "\\~{" << s->letter() << "}"; break;
+ case DocSymbol::Szlig: m_t << "{\\ss}"; break;
+ case DocSymbol::Cedil: m_t << "\\c{" << s->letter() << "}"; break;
+ case DocSymbol::Ring: m_t << "\\" << s->letter() << s->letter(); break;
+ case DocSymbol::Nbsp: m_t << "~"; break;
+ case DocSymbol::AElig: m_t << "{\\AE}"; break;
+ case DocSymbol::Aelig: m_t << "{\\ae}"; break;
+ default:
+ err("error: unknown symbol found\n");
+ }
+}
+
+void LatexDocVisitor::visit(DocURL *u)
+{
+ if (m_hide) return;
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\href{";
+ if (u->isEmail()) m_t << "mailto:";
+ m_t << u->url() << "}";
+ }
+ m_t << "{\\tt ";
+ filter(u->url());
+ m_t << "}";
+}
+
+void LatexDocVisitor::visit(DocLineBreak *)
+{
+ if (m_hide) return;
+ m_t << "\\par\n";
+}
+
+void LatexDocVisitor::visit(DocHorRuler *)
+{
+ if (m_hide) return;
+ m_t << "\n\n";
+}
+
+void LatexDocVisitor::visit(DocStyleChange *s)
+{
+ if (m_hide) return;
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) m_t << "{\\bfseries "; else m_t << "}";
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) m_t << "{\\itshape "; else m_t << "\\/}";
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) m_t << "{\\ttfamily "; else m_t << "}";
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) m_t << "$_{\\mbox{"; else m_t << "}}$ ";
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) m_t << "$^{\\mbox{"; else m_t << "}}$ ";
+ break;
+ case DocStyleChange::Center:
+ if (s->enable()) m_t << "\\begin{center}"; else m_t << "\\end{center} ";
+ break;
+ case DocStyleChange::Small:
+ if (s->enable()) m_t << "\n\\footnotesize "; else m_t << "\n\\normalsize ";
+ break;
+ case DocStyleChange::Preformatted:
+ if (s->enable())
+ {
+ m_t << "\n\\begin{DoxyPre}";
+ m_insidePre=TRUE;
+ }
+ else
+ {
+ m_insidePre=FALSE;
+ m_t << "\\end{DoxyPre}\n";
+ }
+ break;
+ case DocStyleChange::Div: /* HTML only */ break;
+ case DocStyleChange::Span: /* HTML only */ break;
+ }
+}
+
+void LatexDocVisitor::visit(DocVerbatim *s)
+{
+ //static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocVerbatim::Code:
+ //if (latexSourceCode)
+ //{
+ // m_t << "\n\n\\begin{footnotesize}\\begin{alltt}" << endl;
+ //}
+ //else
+ {
+ m_t << "\n\\begin{DoxyCode}\n";
+ }
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,s->context(),s->text(),
+ s->isExample(),s->exampleFile());
+ //if (latexSourceCode)
+ //{
+ // m_t << "\\end{alltt}\\end{footnotesize}" << endl;
+ //}
+ //else
+ {
+ m_t << "\\end{DoxyCode}\n";
+ }
+ break;
+ case DocVerbatim::Verbatim:
+ m_t << "\\begin{DoxyVerb}";
+ m_t << s->text();
+ m_t << "\\end{DoxyVerb}\n";
+ break;
+ case DocVerbatim::HtmlOnly:
+ case DocVerbatim::XmlOnly:
+ case DocVerbatim::ManOnly:
+ /* nothing */
+ break;
+ case DocVerbatim::LatexOnly:
+ m_t << s->text();
+ break;
+ case DocVerbatim::Dot:
+ {
+ static int dotindex = 1;
+ QCString fileName(4096);
+
+ fileName.sprintf("%s%d%s",
+ (Config_getString("LATEX_OUTPUT")+"/inline_dotgraph_").data(),
+ dotindex++,
+ ".dot"
+ );
+ QFile file(fileName);
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",fileName.data());
+ }
+ file.writeBlock( s->text(), s->text().length() );
+ file.close();
+
+ m_t << "\\begin{center}\n";
+ startDotFile(fileName,"","",FALSE);
+ endDotFile(FALSE);
+ m_t << "\\end{center}\n";
+
+ if (Config_getBool("DOT_CLEANUP")) file.remove();
+ }
+ break;
+ case DocVerbatim::Msc:
+ {
+ static int mscindex = 1;
+ QCString baseName(4096);
+
+ baseName.sprintf("%s%d",
+ (Config_getString("LATEX_OUTPUT")+"/inline_mscgraph_").data(),
+ mscindex++
+ );
+ QFile file(baseName+".msc");
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s.msc for writing\n",baseName.data());
+ }
+ QCString text = "msc {";
+ text+=s->text();
+ text+="}";
+ file.writeBlock( text, text.length() );
+ file.close();
+
+ m_t << "\\begin{center}\n";
+ writeMscFile(baseName);
+ m_t << "\\end{center}\n";
+
+ if (Config_getBool("DOT_CLEANUP")) file.remove();
+ }
+ break;
+ }
+}
+
+void LatexDocVisitor::visit(DocAnchor *anc)
+{
+ if (m_hide) return;
+ m_t << "\\label{" << anc->file() << "_" << anc->anchor() << "}" << endl;
+ if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor()
+ << "}{}" << endl;
+ }
+}
+
+void LatexDocVisitor::visit(DocInclude *inc)
+{
+ if (m_hide) return;
+ switch(inc->type())
+ {
+ case DocInclude::IncWithLines:
+ {
+ m_t << "\n\\begin{DoxyCodeInclude}\n";
+ QFileInfo cfi( inc->file() );
+ FileDef fd( cfi.dirPath(), cfi.fileName() );
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),
+ inc->isExample(),
+ inc->exampleFile(), &fd);
+ m_t << "\\end{DoxyCodeInclude}" << endl;
+ }
+ break;
+ case DocInclude::Include:
+ m_t << "\n\\begin{DoxyCodeInclude}\n";
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),inc->isExample(),
+ inc->exampleFile());
+ m_t << "\\end{DoxyCodeInclude}\n";
+ break;
+ case DocInclude::DontInclude:
+ break;
+ case DocInclude::HtmlInclude:
+ break;
+ case DocInclude::VerbInclude:
+ m_t << "\n\\begin{DoxyVerbInclude}\n";
+ m_t << inc->text();
+ m_t << "\\end{DoxyVerbInclude}\n";
+ break;
+ }
+}
+
+void LatexDocVisitor::visit(DocIncOperator *op)
+{
+ //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
+ // op->type(),op->isFirst(),op->isLast(),op->text().data());
+ if (op->isFirst())
+ {
+ if (!m_hide) m_t << "\n\\begin{DoxyCodeInclude}\n";
+ pushEnabled();
+ m_hide = TRUE;
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ popEnabled();
+ if (!m_hide)
+ {
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,op->context(),op->text(),
+ op->isExample(),op->exampleFile());
+ }
+ pushEnabled();
+ m_hide=TRUE;
+ }
+ if (op->isLast())
+ {
+ popEnabled();
+ if (!m_hide) m_t << "\n\\end{DoxyCodeInclude}\n";
+ }
+ else
+ {
+ if (!m_hide) m_t << endl;
+ }
+}
+
+void LatexDocVisitor::visit(DocFormula *f)
+{
+ if (m_hide) return;
+ m_t << f->text();
+}
+
+void LatexDocVisitor::visit(DocIndexEntry *i)
+{
+ if (m_hide) return;
+ m_t << "\\index{" << escapeLabelName(i->entry()) << "@{";
+ escapeMakeIndexChars(i->entry());
+ m_t << "}}";
+}
+
+void LatexDocVisitor::visit(DocSimpleSectSep *)
+{
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void LatexDocVisitor::visitPre(DocAutoList *l)
+{
+ if (m_hide) return;
+ if (l->isEnumList())
+ {
+ m_t << "\n\\begin{DoxyEnumerate}";
+ }
+ else
+ {
+ m_t << "\n\\begin{DoxyItemize}";
+ }
+}
+
+void LatexDocVisitor::visitPost(DocAutoList *l)
+{
+ if (m_hide) return;
+ if (l->isEnumList())
+ {
+ m_t << "\n\\end{DoxyEnumerate}";
+ }
+ else
+ {
+ m_t << "\n\\end{DoxyItemize}";
+ }
+}
+
+void LatexDocVisitor::visitPre(DocAutoListItem *)
+{
+ if (m_hide) return;
+ m_t << "\n\\item ";
+}
+
+void LatexDocVisitor::visitPost(DocAutoListItem *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocPara *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocPara *p)
+{
+ if (m_hide) return;
+ if (!p->isLast() && // omit <p> for last paragraph
+ !(p->parent() && // and for parameter sections
+ p->parent()->kind()==DocNode::Kind_ParamSect
+ )
+ ) m_t << endl << endl;
+}
+
+void LatexDocVisitor::visitPre(DocRoot *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocRoot *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocSimpleSect *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ m_t << "\\begin{DoxySeeAlso}{";
+ filter(theTranslator->trSeeAlso());
+ break;
+ case DocSimpleSect::Return:
+ m_t << "\\begin{DoxyReturn}{";
+ filter(theTranslator->trReturns());
+ break;
+ case DocSimpleSect::Author:
+ m_t << "\\begin{DoxyAuthor}{";
+ filter(theTranslator->trAuthor(TRUE,TRUE));
+ break;
+ case DocSimpleSect::Authors:
+ m_t << "\\begin{DoxyAuthor}{";
+ filter(theTranslator->trAuthor(TRUE,FALSE));
+ break;
+ case DocSimpleSect::Version:
+ m_t << "\\begin{DoxyVersion}{";
+ filter(theTranslator->trVersion());
+ break;
+ case DocSimpleSect::Since:
+ m_t << "\\begin{DoxySince}{";
+ filter(theTranslator->trSince());
+ break;
+ case DocSimpleSect::Date:
+ m_t << "\\begin{DoxyDate}{";
+ filter(theTranslator->trDate());
+ break;
+ case DocSimpleSect::Note:
+ m_t << "\\begin{DoxyNote}{";
+ filter(theTranslator->trNote());
+ break;
+ case DocSimpleSect::Warning:
+ m_t << "\\begin{DoxyWarning}{";
+ filter(theTranslator->trWarning());
+ break;
+ case DocSimpleSect::Pre:
+ m_t << "\\begin{DoxyPrecond}{";
+ filter(theTranslator->trPrecondition());
+ break;
+ case DocSimpleSect::Post:
+ m_t << "\\begin{DoxyPostcond}{";
+ filter(theTranslator->trPostcondition());
+ break;
+ case DocSimpleSect::Invar:
+ m_t << "\\begin{DoxyInvariant}{";
+ filter(theTranslator->trInvariant());
+ break;
+ case DocSimpleSect::Remark:
+ m_t << "\\begin{DoxyRemark}{";
+ filter(theTranslator->trRemarks());
+ break;
+ case DocSimpleSect::Attention:
+ m_t << "\\begin{DoxyAttention}{";
+ filter(theTranslator->trAttention());
+ break;
+ case DocSimpleSect::User:
+ m_t << "\\begin{DoxyParagraph}{";
+ break;
+ case DocSimpleSect::Rcs:
+ m_t << "\\begin{DoxyParagraph}{";
+ break;
+ case DocSimpleSect::Unknown: break;
+ }
+
+ // special case 1: user defined title
+ if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
+ {
+ m_t << "}\n";
+ }
+ else
+ {
+ m_insideItem=TRUE;
+ }
+}
+
+void LatexDocVisitor::visitPost(DocSimpleSect *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ m_t << "\n\\end{DoxySeeAlso}\n";
+ break;
+ case DocSimpleSect::Return:
+ m_t << "\n\\end{DoxyReturn}\n";
+ break;
+ case DocSimpleSect::Author:
+ m_t << "\n\\end{DoxyAuthor}\n";
+ break;
+ case DocSimpleSect::Authors:
+ m_t << "\n\\end{DoxyAuthor}\n";
+ break;
+ case DocSimpleSect::Version:
+ m_t << "\n\\end{DoxyVersion}\n";
+ break;
+ case DocSimpleSect::Since:
+ m_t << "\n\\end{DoxySince}\n";
+ break;
+ case DocSimpleSect::Date:
+ m_t << "\n\\end{DoxyDate}\n";
+ break;
+ case DocSimpleSect::Note:
+ m_t << "\n\\end{DoxyNote}\n";
+ break;
+ case DocSimpleSect::Warning:
+ m_t << "\n\\end{DoxyWarning}\n";
+ break;
+ case DocSimpleSect::Pre:
+ m_t << "\n\\end{DoxyPrecond}\n";
+ break;
+ case DocSimpleSect::Post:
+ m_t << "\n\\end{DoxyPostcond}\n";
+ break;
+ case DocSimpleSect::Invar:
+ m_t << "\n\\end{DoxyInvariant}\n";
+ break;
+ case DocSimpleSect::Remark:
+ m_t << "\n\\end{DoxyRemark}\n";
+ break;
+ case DocSimpleSect::Attention:
+ m_t << "\n\\end{DoxyAttention}\n";
+ break;
+ case DocSimpleSect::User:
+ m_t << "\n\\end{DoxyParagraph}\n";
+ break;
+ case DocSimpleSect::Rcs:
+ m_t << "\n\\end{DoxyParagraph}\n";
+ break;
+ default:
+ break;
+ }
+}
+
+void LatexDocVisitor::visitPre(DocTitle *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocTitle *)
+{
+ if (m_hide) return;
+ m_insideItem=FALSE;
+ m_t << "}\n";
+}
+
+void LatexDocVisitor::visitPre(DocSimpleList *)
+{
+ if (m_hide) return;
+ m_t << "\\begin{DoxyItemize}" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocSimpleList *)
+{
+ if (m_hide) return;
+ m_t << "\\end{DoxyItemize}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocSimpleListItem *)
+{
+ if (m_hide) return;
+ m_t << "\\item ";
+}
+
+void LatexDocVisitor::visitPost(DocSimpleListItem *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocSection *s)
+{
+ if (m_hide) return;
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\hypertarget{" << s->file() << "_" << s->anchor() << "}{}";
+ }
+ m_t << "\\" << getSectionName(s->level()) << "{";
+ filter(convertCharEntitiesToUTF8(s->title().data()));
+ m_t << "}\\label{" << s->file() << "_" << s->anchor() << "}" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocSection *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocHtmlList *s)
+{
+ if (m_hide) return;
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "\n\\begin{DoxyEnumerate}";
+ else
+ m_t << "\n\\begin{DoxyItemize}";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlList *s)
+{
+ if (m_hide) return;
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "\n\\end{DoxyEnumerate}";
+ else
+ m_t << "\n\\end{DoxyItemize}";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlListItem *)
+{
+ if (m_hide) return;
+ m_t << "\n\\item ";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlListItem *)
+{
+}
+
+//void LatexDocVisitor::visitPre(DocHtmlPre *)
+//{
+// m_t << "\\small\\begin{alltt}";
+// m_insidePre=TRUE;
+//}
+
+//void LatexDocVisitor::visitPost(DocHtmlPre *)
+//{
+// m_insidePre=FALSE;
+// m_t << "\\end{alltt}\\normalsize " << endl;
+//}
+
+void LatexDocVisitor::visitPre(DocHtmlDescList *)
+{
+ if (m_hide) return;
+ m_t << "\n\\begin{DoxyDescription}";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlDescList *)
+{
+ if (m_hide) return;
+ m_t << "\n\\end{DoxyDescription}";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ m_t << "\n\\item[";
+ m_insideItem=TRUE;
+}
+
+void LatexDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ m_insideItem=FALSE;
+ m_t << "]";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlDescData *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocHtmlDescData *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocHtmlTable *t)
+{
+ m_rowspanIndices.clear();
+ if (m_hide) return;
+ if (t->hasCaption())
+ {
+ m_t << "\\begin{table}[h]";
+ }
+ m_t << "\\begin{TabularC}{" << t->numCols() << "}\n\\hline\n";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlTable *t)
+{
+ if (m_hide) return;
+ if (t->hasCaption())
+ {
+ m_t << "\\end{table}\n";
+ }
+ else
+ {
+ m_t << "\\end{TabularC}\n";
+ }
+}
+
+void LatexDocVisitor::visitPre(DocHtmlCaption *)
+{
+ if (m_hide) return;
+ m_t << "\\end{TabularC}\n\\centering\n\\caption{";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlCaption *)
+{
+ if (m_hide) return;
+ m_t << "}\n";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlRow *)
+{
+ m_currentColumn = 0;
+}
+
+void LatexDocVisitor::visitPost(DocHtmlRow *)
+{
+ if (m_hide) return;
+
+ m_t << "\\\\";
+
+ QMap<int, int>::Iterator it;
+ int col = 1;
+ for (it = m_rowspanIndices.begin(); it != m_rowspanIndices.end(); ++it)
+ {
+ it.data()--;
+ if (it.data () <= 0)
+ m_rowspanIndices.remove (it);
+ else if (0 < it.data() - col)
+ m_t << "\\cline{" << col << "-" << it.data() - col << "}";
+
+ col = 1 + it.data ();
+ }
+
+ if (col <= m_currentColumn)
+ m_t << "\\cline{" << col << "-" << m_currentColumn << "}";
+
+ m_t << "\n";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlCell *cell)
+{
+ if (m_hide) return;
+
+ m_currentColumn++;
+ //Skip columns that span from above.
+ QMap<int, int>::Iterator it = m_rowspanIndices.find(m_currentColumn);
+ while (0 < it.data() && it != m_rowspanIndices.end())
+ {
+ m_t << "&";
+ m_currentColumn++;
+ it++;
+ }
+
+ int rs = rowspan(cell);
+ if (0 < rs)
+ {
+ m_inRowspan = TRUE;
+ m_rowspanIndices[m_currentColumn] = rs;
+ m_t << "\\multirow{" << rs << "}{\\linewidth}{";
+ }
+}
+
+void LatexDocVisitor::visitPost(DocHtmlCell *c)
+{
+ if (m_hide) return;
+ if (m_inRowspan)
+ {
+ m_inRowspan = FALSE;
+ m_t << "}";
+ }
+ if (!c->isLast()) m_t << "&";
+}
+
+void LatexDocVisitor::visitPre(DocInternal *)
+{
+ if (m_hide) return;
+ //m_t << "\\begin{DoxyInternal}{";
+ //filter(theTranslator->trForInternalUseOnly());
+ //m_t << "}\n";
+}
+
+void LatexDocVisitor::visitPost(DocInternal *)
+{
+ if (m_hide) return;
+ //m_t << "\\end{DoxyInternal}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocHRef *href)
+{
+ if (m_hide) return;
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "\\href{";
+ m_t << href->url();
+ m_t << "}";
+ }
+ m_t << "{\\tt ";
+}
+
+void LatexDocVisitor::visitPost(DocHRef *)
+{
+ if (m_hide) return;
+ m_t << "}";
+}
+
+void LatexDocVisitor::visitPre(DocHtmlHeader *header)
+{
+ if (m_hide) return;
+ m_t << "\\" << getSectionName(header->level()) << "*{";
+}
+
+void LatexDocVisitor::visitPost(DocHtmlHeader *)
+{
+ if (m_hide) return;
+ m_t << "}";
+}
+
+void LatexDocVisitor::visitPre(DocImage *img)
+{
+ if (img->type()==DocImage::Latex)
+ {
+ if (m_hide) return;
+ if (img->hasCaption())
+ {
+ m_t << "\n\\begin{DoxyImage}\n";
+ }
+ else
+ {
+ m_t << "\n\\begin{DoxyImageNoCaption}\n"
+ " \\mbox{";
+ }
+ QCString gfxName = img->name();
+ if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf")
+ {
+ gfxName=gfxName.left(gfxName.length()-4);
+ }
+ m_t << "\\includegraphics";
+ if (!img->width().isEmpty())
+ {
+ m_t << "[width=" << img->width() << "]";
+ }
+ else if (!img->height().isEmpty())
+ {
+ m_t << "[height=" << img->height() << "]";
+ }
+ m_t << "{" << gfxName << "}";
+ if (img->hasCaption())
+ {
+ m_t << "\n\\caption{";
+ }
+ }
+ else // other format -> skip
+ {
+ pushEnabled();
+ m_hide=TRUE;
+ }
+}
+
+void LatexDocVisitor::visitPost(DocImage *img)
+{
+ if (img->type()==DocImage::Latex)
+ {
+ if (m_hide) return;
+ m_t << "}\n"; // end mbox or caption
+ if (img->hasCaption())
+ {
+ m_t << "\\end{DoxyImage}\n";
+ }
+ else{
+ m_t << "\\end{DoxyImageNoCaption}\n";
+ }
+ }
+ else // other format
+ {
+ popEnabled();
+ }
+}
+
+void LatexDocVisitor::visitPre(DocDotFile *df)
+{
+ if (m_hide) return;
+ startDotFile(df->file(),df->width(),df->height(),df->hasCaption());
+}
+
+void LatexDocVisitor::visitPost(DocDotFile *df)
+{
+ if (m_hide) return;
+ endDotFile(df->hasCaption());
+}
+void LatexDocVisitor::visitPre(DocMscFile *df)
+{
+ if (m_hide) return;
+ startMscFile(df->file(),df->width(),df->height(),df->hasCaption());
+}
+
+void LatexDocVisitor::visitPost(DocMscFile *df)
+{
+ if (m_hide) return;
+ endMscFile(df->hasCaption());
+}
+void LatexDocVisitor::visitPre(DocLink *lnk)
+{
+ if (m_hide) return;
+ startLink(lnk->ref(),lnk->file(),lnk->anchor());
+}
+
+void LatexDocVisitor::visitPost(DocLink *lnk)
+{
+ if (m_hide) return;
+ endLink(lnk->ref(),lnk->file(),lnk->anchor());
+}
+
+void LatexDocVisitor::visitPre(DocRef *ref)
+{
+ if (m_hide) return;
+ if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
+ if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void LatexDocVisitor::visitPost(DocRef *ref)
+{
+ if (m_hide) return;
+ if (!ref->file().isEmpty()) endLink(ref->ref(),ref->file(),ref->anchor());
+}
+
+void LatexDocVisitor::visitPre(DocSecRefItem *)
+{
+ if (m_hide) return;
+ m_t << "\\item \\contentsline{section}{";
+}
+
+void LatexDocVisitor::visitPost(DocSecRefItem *ref)
+{
+ if (m_hide) return;
+ m_t << "}{\\ref{" << ref->file() << "_" << ref->anchor() << "}}{}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocSecRefList *)
+{
+ if (m_hide) return;
+ m_t << "\\footnotesize" << endl;
+ m_t << "\\begin{multicols}{2}" << endl;
+ m_t << "\\begin{DoxyCompactList}" << endl;
+}
+
+void LatexDocVisitor::visitPost(DocSecRefList *)
+{
+ if (m_hide) return;
+ m_t << "\\end{DoxyCompactList}" << endl;
+ m_t << "\\end{multicols}" << endl;
+ m_t << "\\normalsize" << endl;
+}
+
+//void LatexDocVisitor::visitPre(DocLanguage *l)
+//{
+// QCString langId = Config_getEnum("OUTPUT_LANGUAGE");
+// if (l->id().lower()!=langId.lower())
+// {
+// pushEnabled();
+// m_hide = TRUE;
+// }
+//}
+//
+//void LatexDocVisitor::visitPost(DocLanguage *l)
+//{
+// QCString langId = Config_getEnum("OUTPUT_LANGUAGE");
+// if (l->id().lower()!=langId.lower())
+// {
+// popEnabled();
+// }
+//}
+
+void LatexDocVisitor::visitPre(DocParamSect *s)
+{
+ if (m_hide) return;
+ bool hasInOutSpecs = s->hasInOutSpecifier();
+ bool hasTypeSpecs = s->hasTypeSpecifier();
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ m_t << "\n\\begin{DoxyParams}";
+ if (hasInOutSpecs && hasTypeSpecs) m_t << "[2]"; // 2 extra cols
+ else if (hasInOutSpecs || hasTypeSpecs) m_t << "[1]"; // 1 extra col
+ m_t << "{";
+ filter(theTranslator->trParameters());
+ break;
+ case DocParamSect::RetVal:
+ m_t << "\n\\begin{DoxyRetVals}{";
+ filter(theTranslator->trReturnValues());
+ break;
+ case DocParamSect::Exception:
+ m_t << "\n\\begin{DoxyExceptions}{";
+ filter(theTranslator->trExceptions());
+ break;
+ case DocParamSect::TemplateParam:
+ /* TODO: add this
+ filter(theTranslator->trTemplateParam()); break;
+ */
+ m_t << "\n\\begin{DoxyTemplParams}{";
+ filter("Template Parameters");
+ break;
+ default:
+ ASSERT(0);
+ }
+ m_t << "}\n";
+}
+
+void LatexDocVisitor::visitPost(DocParamSect *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ m_t << "\\end{DoxyParams}\n";
+ break;
+ case DocParamSect::RetVal:
+ m_t << "\\end{DoxyRetVals}\n";
+ break;
+ case DocParamSect::Exception:
+ m_t << "\\end{DoxyExceptions}\n";
+ break;
+ case DocParamSect::TemplateParam:
+ m_t << "\\end{DoxyTemplParams}\n";
+ break;
+ default:
+ ASSERT(0);
+ }
+}
+
+void LatexDocVisitor::visitPre(DocParamList *pl)
+{
+ if (m_hide) return;
+ DocParamSect::Type parentType = DocParamSect::Unknown;
+ DocParamSect *sect = 0;
+ if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect)
+ {
+ parentType = ((DocParamSect*)pl->parent())->type();
+ sect=(DocParamSect*)pl->parent();
+ }
+ bool useTable = parentType==DocParamSect::Param ||
+ parentType==DocParamSect::RetVal ||
+ parentType==DocParamSect::Exception ||
+ parentType==DocParamSect::TemplateParam;
+ if (!useTable)
+ {
+ m_t << "\\item[";
+ }
+ if (sect && sect->hasInOutSpecifier())
+ {
+ if (pl->direction()!=DocParamSect::Unspecified)
+ {
+ m_t << "\\mbox{\\tt ";
+ if (pl->direction()==DocParamSect::In)
+ {
+ m_t << "in";
+ }
+ else if (pl->direction()==DocParamSect::Out)
+ {
+ m_t << "out";
+ }
+ else if (pl->direction()==DocParamSect::InOut)
+ {
+ m_t << "in,out";
+ }
+ m_t << "} ";
+ }
+ if (useTable) m_t << " & ";
+ }
+ if (sect && sect->hasTypeSpecifier())
+ {
+ QListIterator<DocNode> li(pl->paramTypes());
+ DocNode *type;
+ bool first=TRUE;
+ for (li.toFirst();(type=li.current());++li)
+ {
+ if (!first) m_t << " | "; else first=FALSE;
+ if (type->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)type);
+ }
+ else if (type->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)type);
+ }
+ }
+ if (useTable) m_t << " & ";
+ }
+ m_t << "{\\em ";
+ //QStrListIterator li(pl->parameters());
+ //const char *s;
+ QListIterator<DocNode> li(pl->parameters());
+ DocNode *param;
+ bool first=TRUE;
+ for (li.toFirst();(param=li.current());++li)
+ {
+ if (!first) m_t << ","; else first=FALSE;
+ m_insideItem=TRUE;
+ if (param->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)param);
+ }
+ else if (param->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)param);
+ }
+ m_insideItem=FALSE;
+ }
+ m_t << "}";
+ if (useTable)
+ {
+ m_t << " & ";
+ }
+ else
+ {
+ m_t << "]";
+ }
+}
+
+void LatexDocVisitor::visitPost(DocParamList *pl)
+{
+ if (m_hide) return;
+ DocParamSect::Type parentType = DocParamSect::Unknown;
+ if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect)
+ {
+ parentType = ((DocParamSect*)pl->parent())->type();
+ }
+ bool useTable = parentType==DocParamSect::Param ||
+ parentType==DocParamSect::RetVal ||
+ parentType==DocParamSect::Exception ||
+ parentType==DocParamSect::TemplateParam;
+ if (useTable)
+ {
+ m_t << "\\\\" << endl
+ << "\\hline" << endl;
+ }
+}
+
+void LatexDocVisitor::visitPre(DocXRefItem *x)
+{
+ if (m_hide) return;
+ m_t << "\\begin{Desc}" << endl;
+ bool anonymousEnum = x->file()=="@";
+ m_t << "\\item[";
+ if (Config_getBool("PDF_HYPERLINKS") && !anonymousEnum)
+ {
+ m_t << "\\hyperlink{" << stripPath(x->file()) << "_" << x->anchor() << "}{";
+ }
+ else
+ {
+ m_t << "{\\bf ";
+ }
+ m_insideItem=TRUE;
+ filter(x->title());
+ m_insideItem=FALSE;
+ m_t << "}]";
+}
+
+void LatexDocVisitor::visitPost(DocXRefItem *)
+{
+ if (m_hide) return;
+ m_t << "\\end{Desc}" << endl;
+}
+
+void LatexDocVisitor::visitPre(DocInternalRef *ref)
+{
+ if (m_hide) return;
+ startLink(0,ref->file(),ref->anchor());
+}
+
+void LatexDocVisitor::visitPost(DocInternalRef *ref)
+{
+ if (m_hide) return;
+ endLink(0,ref->file(),ref->anchor());
+}
+
+void LatexDocVisitor::visitPre(DocCopy *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocCopy *)
+{
+}
+
+void LatexDocVisitor::visitPre(DocText *)
+{
+}
+
+void LatexDocVisitor::visitPost(DocText *)
+{
+}
+
+void LatexDocVisitor::filter(const char *str)
+{
+ filterLatexString(m_t,str,m_insideTabbing,m_insidePre,m_insideItem);
+}
+
+void LatexDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor)
+{
+ if (ref.isEmpty() && Config_getBool("PDF_HYPERLINKS")) // internal PDF link
+ {
+ if (ref.isEmpty()) {
+ m_t << "\\hyperlink{";
+ if (!file.isEmpty()) m_t << stripPath(file);
+ if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_";
+ if (!anchor.isEmpty()) m_t << anchor;
+ m_t << "}{";
+ }
+ else
+ {
+ QCString *dest;
+ m_t << "\\href{";
+ if ((dest=Doxygen::tagDestinationDict[ref])) m_t << *dest << "/";
+ if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
+ if (!anchor.isEmpty()) m_t << "#" << anchor;
+ m_t << "}{";
+ }
+ }
+ else if (ref.isEmpty()) // internal non-PDF link
+ {
+ m_t << "\\doxyref{";
+ }
+ else // external link
+ {
+ m_t << "{\\bf ";
+ }
+}
+
+void LatexDocVisitor::endLink(const QCString &ref,const QCString &file,const QCString &anchor)
+{
+ m_t << "}";
+ if (ref.isEmpty() && !Config_getBool("PDF_HYPERLINKS"))
+ {
+ m_t << "{";
+ filter(theTranslator->trPageAbbreviation());
+ m_t << "}{" << file;
+ if (!anchor.isEmpty()) m_t << "_" << anchor;
+ m_t << "}";
+ }
+}
+
+void LatexDocVisitor::pushEnabled()
+{
+ m_enabled.push(new bool(m_hide));
+}
+
+void LatexDocVisitor::popEnabled()
+{
+ bool *v=m_enabled.pop();
+ ASSERT(v!=0);
+ m_hide = *v;
+ delete v;
+}
+
+void LatexDocVisitor::startDotFile(const QCString &fileName,
+ const QCString &width,
+ const QCString &height,
+ bool hasCaption
+ )
+{
+ QCString baseName=fileName;
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ if ((i=baseName.find('.'))!=-1)
+ {
+ baseName=baseName.left(i);
+ }
+ baseName.prepend("dot_");
+ QCString outDir = Config_getString("LATEX_OUTPUT");
+ QCString name = fileName;
+ writeDotGraphFromFile(name,outDir,baseName,EPS);
+ if (hasCaption)
+ {
+ m_t << "\n\\begin{DoxyImage}\n";
+ }
+ else
+ {
+ m_t << "\n\\begin{DoxyImageNoCaption}\n"
+ " \\mbox{";
+ }
+ m_t << "\\includegraphics";
+ if (!width.isEmpty())
+ {
+ m_t << "[width=" << width << "]";
+ }
+ else if (!height.isEmpty())
+ {
+ m_t << "[height=" << height << "]";
+ }
+ else
+ {
+ m_t << "[width=\\textwidth]";
+ }
+ m_t << "{" << baseName << "}";
+
+ if (hasCaption)
+ {
+ m_t << "\n\\caption{";
+ }
+}
+
+void LatexDocVisitor::endDotFile(bool hasCaption)
+{
+ if (m_hide) return;
+ m_t << "}\n"; // end caption or mbox
+ if (hasCaption)
+ {
+ m_t << "\\end{DoxyImage}\n";
+ }
+ else
+ {
+ m_t << "\\end{DoxyImageNoCaption}\n";
+ }
+}
+
+void LatexDocVisitor::startMscFile(const QCString &fileName,
+ const QCString &width,
+ const QCString &height,
+ bool hasCaption
+ )
+{
+ QCString baseName=fileName;
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ if ((i=baseName.find('.'))!=-1)
+ {
+ baseName=baseName.left(i);
+ }
+ baseName.prepend("msc_");
+
+ QCString outDir = Config_getString("LATEX_OUTPUT");
+ QCString name = fileName;
+ writeMscGraphFromFile(name,outDir,baseName,MSC_EPS);
+ if (hasCaption)
+ {
+ m_t << "\n\\begin{DoxyImage}\n";
+ }
+ else
+ {
+ m_t << "\n\\begin{DoxyImageNoCaption}\n"
+ " \\mbox{";
+ }
+ m_t << "\\includegraphics";
+ if (!width.isEmpty())
+ {
+ m_t << "[width=" << width << "]";
+ }
+ else if (!height.isEmpty())
+ {
+ m_t << "[height=" << height << "]";
+ }
+ else
+ {
+ m_t << "[width=\\textwidth]";
+ }
+ m_t << "{" << baseName << "}";
+
+ if (hasCaption)
+ {
+ m_t << "\n\\caption{";
+ }
+}
+
+void LatexDocVisitor::endMscFile(bool hasCaption)
+{
+ if (m_hide) return;
+ m_t << "}\n"; // end caption or mbox
+ if (hasCaption)
+ {
+ m_t << "\\end{DoxyImage}\n";
+ }
+ else
+ {
+ m_t << "\\end{DoxyImageNoCaption}\n";
+ }
+}
+
+
+void LatexDocVisitor::writeMscFile(const QCString &baseName)
+{
+ QCString shortName = baseName;
+ int i;
+ if ((i=shortName.findRev('/'))!=-1)
+ {
+ shortName=shortName.right(shortName.length()-i-1);
+ }
+ QCString outDir = Config_getString("LATEX_OUTPUT");
+ writeMscGraphFromFile(baseName,outDir,shortName,MSC_EPS);
+ m_t << "\n\\begin{DoxyImageNoCaption}"
+ " \\mbox{\\includegraphics";
+ m_t << "{" << shortName << "}";
+ m_t << "}\n"; // end mbox
+ m_t << "\\end{DoxyImageNoCaption}\n";
+}
+
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
new file mode 100644
index 0000000..c36f1a6
--- /dev/null
+++ b/src/latexdocvisitor.h
@@ -0,0 +1,175 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _LATEXDOCVISITOR_H
+#define _LATEXDOCVISITOR_H
+
+#include "docvisitor.h"
+#include <qstack.h>
+#include <qcstring.h>
+#include <qmap.h>
+
+class FTextStream;
+class CodeOutputInterface;
+
+/*! @brief Concrete visitor implementation for LaTeX output. */
+class LatexDocVisitor : public DocVisitor
+{
+ public:
+ LatexDocVisitor(FTextStream &t,CodeOutputInterface &ci,
+ const char *langExt,bool insideTabbing);
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
+ void visit(DocIndexEntry *);
+ void visit(DocSimpleSectSep *);
+
+ //--------------------------------------
+ // visitor functions for compound nodes
+ //--------------------------------------
+
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *);
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *s);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *s);
+ void visitPost(DocHtmlList *s);
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ //void visitPre(DocHtmlPre *);
+ //void visitPost(DocHtmlPre *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *t);
+ void visitPost(DocHtmlTable *t);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *) ;
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+ void visitPre(DocMscFile *);
+ void visitPost(DocMscFile *);
+ void visitPre(DocLink *lnk);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *ref);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ //void visitPre(DocLanguage *);
+ //void visitPost(DocLanguage *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
+ void visitPre(DocText *);
+ void visitPost(DocText *);
+
+ private:
+
+ //--------------------------------------
+ // helper functions
+ //--------------------------------------
+
+ void filter(const char *str);
+ void startLink(const QCString &ref,const QCString &file,
+ const QCString &anchor);
+ void endLink(const QCString &ref,const QCString &file,
+ const QCString &anchor);
+ QCString escapeMakeIndexChars(const char *s);
+ void startDotFile(const QCString &fileName,const QCString &width,
+ const QCString &height, bool hasCaption);
+ void endDotFile(bool hasCaption);
+
+ void startMscFile(const QCString &fileName,const QCString &width,
+ const QCString &height, bool hasCaption);
+ void endMscFile(bool hasCaption);
+ void writeMscFile(const QCString &fileName);
+
+ void pushEnabled();
+ void popEnabled();
+
+ //--------------------------------------
+ // state variables
+ //--------------------------------------
+
+ FTextStream &m_t;
+ CodeOutputInterface &m_ci;
+ bool m_insidePre;
+ bool m_insideItem;
+ bool m_hide;
+ bool m_insideTabbing;
+ QStack<bool> m_enabled;
+ QCString m_langExt;
+ QMap<int, int> m_rowspanIndices;
+ int m_currentColumn;
+ bool m_inRowspan;
+};
+
+#endif
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
new file mode 100644
index 0000000..0b4bc20
--- /dev/null
+++ b/src/latexgen.cpp
@@ -0,0 +1,2368 @@
+/******************************************************************************
+ *
+ * $Id: latexgen.cpp,v 1.58 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "qtbc.h"
+#include <qdir.h>
+#include "latexgen.h"
+#include "config.h"
+#include "message.h"
+#include "doxygen.h"
+#include "util.h"
+#include "diagram.h"
+#include "language.h"
+#include "version.h"
+#include "dot.h"
+#include "pagedef.h"
+#include "docparser.h"
+#include "latexdocvisitor.h"
+#include "dirdef.h"
+
+//static QCString filterTitle(const char *s)
+//{
+// QCString tmp=s,result;
+// uint i;for (i=0;i<tmp.length();i++)
+// {
+// char c=tmp.at(i);
+// switch(c)
+// {
+// case '#': result+="\\#"; break;
+// case '"': result+="\\\""; break;
+// case '%': result+="\\%"; break;
+// case '[': result+="{"; break;
+// case ']': result+="}"; break;
+// default: result+=c; break;
+// }
+// }
+// return result;
+//}
+
+
+
+LatexGenerator::LatexGenerator() : OutputGenerator()
+{
+ dir=Config_getString("LATEX_OUTPUT");
+ col=0;
+ //printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");
+ insideTabbing=FALSE;
+ firstDescItem=TRUE;
+ disableLinks=FALSE;
+ m_indent=0;
+ templateMemberItem = FALSE;
+ m_prettyCode=Config_getBool("LATEX_SOURCE_CODE");
+}
+
+LatexGenerator::~LatexGenerator()
+{
+}
+
+void LatexGenerator::init()
+{
+ QCString dir=Config_getString("LATEX_OUTPUT");
+ QDir d(dir);
+ if (!d.exists() && !d.mkdir(dir))
+ {
+ err("Could not create output directory %s\n",dir.data());
+ exit(1);
+ }
+
+ QCString fileName=dir+"/Makefile";
+ QFile file(fileName);
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",fileName.data());
+ exit(1);
+ }
+ // inserted by KONNO Akihisa <konno@researchers.jp> 2002-03-05
+ QCString latex_command = Config_getString("LATEX_CMD_NAME");
+ QCString mkidx_command = Config_getString("MAKEINDEX_CMD_NAME");
+ // end insertion by KONNO Akihisa <konno@researchers.jp> 2002-03-05
+ FTextStream t(&file);
+ if (!Config_getBool("USE_PDFLATEX")) // use plain old latex
+ {
+ t << "all: refman.dvi" << endl
+ << endl
+ << "ps: refman.ps" << endl
+ << endl
+ << "pdf: refman.pdf" << endl
+ << endl
+ << "ps_2on1: refman_2on1.ps" << endl
+ << endl
+ << "pdf_2on1: refman_2on1.pdf" << endl
+ << endl
+ << "refman.ps: refman.dvi" << endl
+ << "\tdvips -o refman.ps refman.dvi" << endl
+ << endl;
+ t << "refman.pdf: refman.ps" << endl;
+#if defined(_MSC_VER)
+ // ps2pdf.bat does not work properly from a makefile using GNU make!
+ t << "\tgswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
+ "-sOutputFile=refman.pdf -c save pop -f refman.ps" << endl << endl;
+#else
+ t << "\tps2pdf refman.ps refman.pdf" << endl << endl;
+#endif
+ t << "refman.dvi: clean refman.tex doxygen.sty" << endl
+ << "\techo \"Running latex...\"" << endl
+ << "\t" << latex_command << " refman.tex" << endl
+ << "\techo \"Running makeindex...\"" << endl
+ << "\t" << mkidx_command << " refman.idx" << endl
+ << "\techo \"Rerunning latex....\"" << endl
+ << "\t" << latex_command << " refman.tex" << endl
+ << "\tlatex_count=5 ; \\" << endl
+ << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl
+ << "\t do \\" << endl
+ << "\t echo \"Rerunning latex....\" ;\\" << endl
+ << "\t " << latex_command << " refman.tex ;\\" << endl
+ << "\t latex_count=`expr $$latex_count - 1` ;\\" << endl
+ << "\t done" << endl << endl
+ << "refman_2on1.ps: refman.ps" << endl
+ << "\tpsnup -2 refman.ps >refman_2on1.ps" << endl
+ << endl
+ << "refman_2on1.pdf: refman_2on1.ps" << endl
+#if defined(_MSC_VER)
+ // ps2pdf.bat does not work properly from a makefile using GNU make!
+ << "\tgswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
+ "-sOutputFile=refman_2on1.pdf -c save pop -f refman_2on1.ps" << endl;
+#else
+ << "\tps2pdf refman_2on1.ps refman_2on1.pdf" << endl;
+#endif
+ }
+ else // use pdflatex for higher quality output
+ {
+ t << "all: refman.pdf" << endl << endl
+ << "pdf: refman.pdf" << endl << endl;
+ t << "refman.pdf: clean refman.tex" << endl;
+ t << "\tpdflatex refman.tex" << endl;
+ t << "\tmakeindex refman.idx" << endl;
+ t << "\tpdflatex refman.tex" << endl
+ << "\tlatex_count=5 ; \\" << endl
+ << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl
+ << "\t do \\" << endl
+ << "\t echo \"Rerunning latex....\" ;\\" << endl
+ << "\t pdflatex refman.tex ;\\" << endl
+ << "\t latex_count=`expr $$latex_count - 1` ;\\" << endl
+ << "\t done" << endl << endl;
+ }
+
+ t << endl
+ << "clean:" << endl
+#if defined(_MSC_VER)
+ << "\tdel /s/y "
+#else
+ << "\trm -f "
+#endif
+ << "*.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf" << endl;
+
+ createSubDirs(d);
+}
+
+static void writeDefaultHeaderPart1(FTextStream &t)
+{
+ // part 1
+
+ QCString paperName;
+ if (Config_getBool("LATEX_BATCHMODE")) t << "\\batchmode" << endl;
+ QCString &paperType=Config_getEnum("PAPER_TYPE");
+ if (paperType=="a4wide")
+ paperName="a4";
+ else
+ paperName=paperType;
+ t << "\\documentclass[" << paperName << "paper";
+ //if (Config_getBool("PDF_HYPERLINKS")) t << ",ps2pdf";
+ t << "]{";
+ if (Config_getBool("COMPACT_LATEX")) t << "article"; else t << "book";
+ t << "}\n";
+ // the next package is obsolete (see bug 563698)
+ //if (paperType=="a4wide") t << "\\usepackage{a4wide}\n";
+ t << "\\usepackage{makeidx}\n"
+ "\\usepackage{graphicx}\n"
+ "\\usepackage{multicol}\n"
+ "\\usepackage{float}\n"
+ "\\usepackage{listings}\n"
+ "\\usepackage{color}\n"
+ "\\usepackage{ifthen}\n"
+ "\\usepackage[table]{xcolor}\n"
+ "\\usepackage{textcomp}\n"
+ "\\usepackage{alltt}\n"
+ //"\\usepackage{ae,aecompl,aeguill}\n"
+ ;
+ //if (Config_getBool("USE_PDFLATEX"))
+ //{
+ // t << "\\usepackage{times}" << endl;
+ //}
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ t << "\\usepackage{ifpdf}" << endl
+ << "\\ifpdf" << endl
+ << "\\usepackage[pdftex," << endl
+ << " pagebackref=true," << endl
+ << " colorlinks=true," << endl
+ << " linkcolor=blue," << endl
+ << " unicode" << endl
+ << " ]{hyperref}" << endl
+ << "\\else" << endl
+ << "\\usepackage[ps2pdf," << endl
+ << " pagebackref=true," << endl
+ << " colorlinks=true," << endl
+ << " linkcolor=blue," << endl
+ << " unicode" << endl
+ << " ]{hyperref}" << endl
+ << "\\usepackage{pspicture}" << endl
+ << "\\fi" << endl;
+ }
+ // Try to get the command for switching on the language
+ // support
+ t << "\\usepackage[utf8]{inputenc}" << endl;
+ QCString sLanguageSupportCommand(
+ theTranslator->latexLanguageSupportCommand());
+
+ if (!sLanguageSupportCommand.isEmpty())
+ {
+ // The command is not empty. Put it to the output.
+ // if the command is empty, no output is needed.
+ t << sLanguageSupportCommand << endl;
+ }
+ t << "\\usepackage{mathptmx}\n";
+ t << "\\usepackage[scaled=.90]{helvet}\n";
+ t << "\\usepackage{courier}\n";
+ t << "\\usepackage{sectsty}\n";
+ t << "\\usepackage[titles]{tocloft}\n";
+ t << "\\usepackage{doxygen}\n";
+
+ // define option for listings
+ t << "\\lstset{language=C++,"
+ "inputencoding=utf8,"
+ "basicstyle=\\footnotesize,"
+ "breaklines=true,"
+ "breakatwhitespace=true,"
+ "tabsize=" << Config_getInt("TAB_SIZE") <<","
+ "numbers=left }" << endl;
+
+ QStrList &extraPackages = Config_getList("EXTRA_PACKAGES");
+ const char *s=extraPackages.first();
+ while (s)
+ {
+ t << "\\usepackage{" << s << "}\n";
+ s=extraPackages.next();
+ }
+ t << "\\makeindex\n"
+ "\\setcounter{tocdepth}{3}\n"
+ "\\renewcommand{\\footrulewidth}{0.4pt}\n"
+ "\\renewcommand{\\familydefault}{\\sfdefault}\n"
+ "\\begin{document}\n";
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ if (pdfHyperlinks && usePDFLatex)
+ {
+ // to avoid duplicate page anchors due to reuse of same numbers for
+ // the index (be it as roman numbers)
+ t << "\\hypersetup{pageanchor=false}" << endl;
+ }
+ if (theTranslator->idLanguage()=="greek") t << "\\selectlanguage{greek}\n";
+ t << "\\begin{titlepage}\n"
+ "\\vspace*{7cm}\n"
+ "\\begin{center}\n"
+ "{\\Large ";
+
+}
+
+static void writeDefaultHeaderPart2(FTextStream &t)
+{
+ // part 2
+ t << "}\\\\" << endl
+ << "\\vspace*{1cm}" << endl
+ << "{\\large ";
+}
+
+static void writeDefaultHeaderPart3(FTextStream &t)
+{
+ // part 3
+ t << " Doxygen " << versionString << "}\\\\" << endl
+ << "\\vspace*{0.5cm}" << endl
+ << "{\\small " << dateToString(TRUE) << "}\\\\" << endl
+ << "\\end{center}" << endl
+ << "\\end{titlepage}" << endl;
+ if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";
+ t << "\\pagenumbering{roman}\n";
+ t << "\\tableofcontents\n";
+ if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";
+ t << "\\pagenumbering{arabic}\n";
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ if (pdfHyperlinks && usePDFLatex)
+ {
+ t << "\\hypersetup{pageanchor=true}" << endl;
+ }
+}
+
+static void writeDefaultStyleSheetPart1(FTextStream &t)
+{
+ // part 1
+ t << "\\NeedsTeXFormat{LaTeX2e}\n"
+ "\\ProvidesPackage{doxygen}\n\n";
+ t << "% Packages used by this style file\n"
+ "\\RequirePackage{alltt}\n"
+ "\\RequirePackage{array}\n"
+ "\\RequirePackage{calc}\n"
+ "\\RequirePackage{color}\n"
+ "\\RequirePackage{fancyhdr}\n"
+ "\\RequirePackage{longtable}\n"
+ "\\RequirePackage{verbatim}\n"
+ "\\RequirePackage{ifthen}\n"
+ "\\RequirePackage[table]{xcolor}\n\n";
+
+ t << "% Use helvetica font instead of times roman\n"
+ "\\RequirePackage{helvet}\n"
+ "\\RequirePackage{sectsty}\n"
+ "\\RequirePackage{tocloft}\n"
+// "\\allsectionsfont{\\usefont{OT1}{phv}{bc}{n}\\selectfont}\n"
+// "\\providecommand{\\cftchapfont}{%\n"
+// " \\fontsize{11}{13}\\usefont{OT1}{phv}{bc}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cftchappagefont}{%\n"
+// " \\fontsize{11}{13}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cftsecfont}{%\n"
+// " \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cftsecpagefont}{%\n"
+// " \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cftsubsecfont}{%\n"
+// " \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cftsubsecpagefont}{%\n"
+// " \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cftsubsubsecfont}{%\n"
+// " \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cftsubsubsecpagefont}{%\n"
+// " \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cftparafont}{%\n"
+// " \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cftparapagefont}{%\n"
+// " \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
+// "}\n"
+// "\\providecommand{\\cfttoctitlefont}{%\n"
+// " \\fontsize{20}{22}\\usefont{OT1}{phv}{b}{n}\\selectfont\n"
+// "}\n"
+ "\\providecommand{\\rmdefault}{phv}\n"
+ "\\providecommand{\\bfdefault}{bc}\n"
+ "\n\n";
+
+ t << "% Setup fancy headings\n"
+ "\\pagestyle{fancyplain}\n"
+ "\\newcommand{\\clearemptydoublepage}{%\n"
+ " \\newpage{\\pagestyle{empty}\\cleardoublepage}%\n"
+ "}\n";
+ if (!Config_getBool("COMPACT_LATEX"))
+ t << "\\renewcommand{\\chaptermark}[1]{%\n"
+ " \\markboth{#1}{}%\n"
+ "}\n";
+ t << "\\renewcommand{\\sectionmark}[1]{%\n"
+ " \\markright{\\thesection\\ #1}%\n"
+ "}\n";
+
+ //t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]{%\n"
+ // " \\fancyplain{}{\\bfseries\\rightmark}%\n"
+ // "}\n";
+ //t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]{%\n"
+ // " \\fancyplain{}{\\bfseries\\thepage}%\n"
+ // "}\n";
+ //t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize%\n ";
+ t << "\\fancyhead[LE]{\\fancyplain{}{\\bfseries\\thepage}}\n";
+ t << "\\fancyhead[CE]{\\fancyplain{}{}}\n";
+ t << "\\fancyhead[RE]{\\fancyplain{}{\\bfseries\\leftmark}}\n";
+ t << "\\fancyhead[LO]{\\fancyplain{}{\\bfseries\\rightmark}}\n";
+ t << "\\fancyhead[CO]{\\fancyplain{}{}}\n";
+ t << "\\fancyhead[RO]{\\fancyplain{}{\\bfseries\\thepage}}\n";
+
+ t << "\\fancyfoot[LE]{\\fancyplain{}{}}\n";
+ t << "\\fancyfoot[CE]{\\fancyplain{}{}}\n";
+ t << "\\fancyfoot[RE]{\\fancyplain{}{\\bfseries\\scriptsize ";
+}
+
+static void writeDefaultStyleSheetPart2(FTextStream &t)
+{
+ t << "}}\n";
+ t << "\\fancyfoot[LO]{\\fancyplain{}{\\bfseries\\scriptsize ";
+ //t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize%\n ";
+
+}
+
+static void writeDefaultStyleSheetPart3(FTextStream &t)
+{
+ static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
+ t << "}}\n";
+ //t << "\\cfoot{}\n\n";
+ t << "\\fancyfoot[CO]{\\fancyplain{}{}}\n";
+ t << "\\fancyfoot[RO]{\\fancyplain{}{}}\n";
+
+ t << "%---------- Internal commands used in this style file ----------------\n\n";
+ t << "% Generic environment used by all paragraph-based environments defined\n"
+ "% below. Note that the command \\title{...} needs to be defined inside\n"
+ "% those environments!\n"
+ "\\newenvironment{DoxyDesc}[1]{%\n"
+ " \\begin{list}{}%\n"
+ " {%\n"
+ " \\settowidth{\\labelwidth}{40pt}%\n"
+ " \\setlength{\\leftmargin}{\\labelwidth}%\n"
+ " \\setlength{\\parsep}{0pt}%\n"
+ " \\setlength{\\itemsep}{-4pt}%\n"
+ " \\renewcommand{\\makelabel}{\\entrylabel}%\n"
+ " }%\n"
+ " \\item[#1]%\n"
+ "}{%\n"
+ " \\end{list}%\n"
+ "}\n\n";
+ t << "%---------- Commands used by doxygen LaTeX output generator ----------\n\n";
+ t << "% Used by <pre> ... </pre>\n"
+ "\\newenvironment{DoxyPre}{%\n"
+ " \\small%\n"
+ " \\begin{alltt}%\n"
+ "}{%\n"
+ " \\end{alltt}%\n"
+ " \\normalsize%\n"
+ "}\n\n";
+ t << "% Used by @code ... @endcode\n"
+ "\\newenvironment{DoxyCode}{%\n";
+ if (latexSourceCode)
+ {
+ t << "\n\n\\begin{footnotesize}\\begin{alltt}%" << endl;
+ }
+ else
+ {
+ t << " \\footnotesize%\n"
+ " \\verbatim%\n";
+ }
+ t << "}{%\n";
+ if (latexSourceCode)
+ {
+ t << "\\end{alltt}\\end{footnotesize}%" << endl;
+ }
+ else
+ {
+ t << " \\endverbatim%\n"
+ " \\normalsize%\n";
+ }
+ t << "}\n\n";
+ t << "% Used by @example, @include, @includelineno and @dontinclude\n"
+ "\\newenvironment{DoxyCodeInclude}{%\n"
+ " \\DoxyCode%\n"
+ "}{%\n"
+ " \\endDoxyCode%\n"
+ "}\n\n";
+ t << "% Used by @verbatim ... @endverbatim\n"
+ "\\newenvironment{DoxyVerb}{%\n"
+ " \\footnotesize%\n"
+ " \\verbatim%\n"
+ "}{%\n"
+ " \\endverbatim%\n"
+ " \\normalsize%\n"
+ "}\n\n";
+ t << "% Used by @verbinclude\n"
+ "\\newenvironment{DoxyVerbInclude}{%\n"
+ " \\DoxyVerb%\n"
+ "}{%\n"
+ " \\endDoxyVerb%\n"
+ "}\n\n";
+ t << "% Used by numbered lists (using '-#' or <ol> ... </ol>)\n"
+ "\\newenvironment{DoxyEnumerate}{%\n"
+ " \\enumerate%\n"
+ "}{%\n"
+ " \\endenumerate%\n"
+ "}\n\n";
+ t << "% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)\n"
+ "\\newenvironment{DoxyItemize}{%\n"
+ " \\itemize%\n"
+ "}{%\n"
+ " \\enditemize%\n"
+ "}\n\n";
+ t << "% Used by description lists (using <dl> ... </dl>)\n"
+ "\\newenvironment{DoxyDescription}{%\n"
+ " \\description%\n"
+ "}{%\n"
+ " \\enddescription%\n"
+ "}\n\n";
+ t << "% Used by @image, @dotfile, and @dot ... @enddot\n"
+ "% (only if caption is specified)\n"
+ "\\newenvironment{DoxyImage}{%\n"
+ " \\begin{figure}[H]%\n"
+ " \\begin{center}%\n"
+ "}{%\n"
+ " \\end{center}%\n"
+ " \\end{figure}%\n"
+ "}\n\n";
+ t << "% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc\n"
+ "% (only if no caption is specified)\n"
+ "\\newenvironment{DoxyImageNoCaption}{%\n"
+ "}{%\n"
+ "}\n\n";
+ t << "% Used by @attention\n"
+ "\\newenvironment{DoxyAttention}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @author and @authors\n"
+ "\\newenvironment{DoxyAuthor}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @date\n"
+ "\\newenvironment{DoxyDate}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @invariant\n"
+ "\\newenvironment{DoxyInvariant}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @note\n"
+ "\\newenvironment{DoxyNote}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @post\n"
+ "\\newenvironment{DoxyPostcond}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @pre\n"
+ "\\newenvironment{DoxyPrecond}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @remark\n"
+ "\\newenvironment{DoxyRemark}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @return\n"
+ "\\newenvironment{DoxyReturn}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @since\n"
+ "\\newenvironment{DoxySince}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @see\n"
+ "\\newenvironment{DoxySeeAlso}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @version\n"
+ "\\newenvironment{DoxyVersion}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @warning\n"
+ "\\newenvironment{DoxyWarning}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ "}{%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by @internal\n"
+ "\\newenvironment{DoxyInternal}[1]{%\n"
+ " \\paragraph*{#1}%\n"
+ "}{%\n"
+ "}\n\n";
+ t << "% Used by @par and @paragraph\n"
+ "\\newenvironment{DoxyParagraph}[1]{%\n"
+ " \\begin{list}{}%\n"
+ " {%\n"
+ " \\settowidth{\\labelwidth}{40pt}%\n"
+ " \\setlength{\\leftmargin}{\\labelwidth}%\n"
+ " \\setlength{\\parsep}{0pt}%\n"
+ " \\setlength{\\itemsep}{-4pt}%\n"
+ " \\renewcommand{\\makelabel}{\\entrylabel}%\n"
+ " }%\n"
+ " \\item[#1]%\n"
+ "}{%\n"
+ " \\end{list}%\n"
+ "}\n\n";
+ t << "% Used by parameter lists\n"
+ "\\newenvironment{DoxyParams}[2][]{%\n"
+ " \\begin{DoxyDesc}{#2}%\n"
+ " \\begin{description}%\n"
+ " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
+ " \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
+ " \\rowcolors{1}{white}{tableShade}%\n"
+ " \\arrayrulecolor{gray}%\n"
+ " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
+ " \\ifthenelse{\\equal{#1}{}}\n" // default: name, docs columns
+ " {\\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+ " p{0.87\\textwidth}|}}%\n"
+ " {\\ifthenelse{\\equal{#1}{1}}%\n" // inout, name, docs columns, or type, name, docs columns
+ " {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n"
+ " >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+ " p{0.75\\textwidth}|}}%\n"
+ " {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n" // inout, type, name, docs columns
+ " >{\\centering\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+ " >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+ " p{0.58\\textwidth}|}}%\n"
+ " }\\hline%\n"
+ "}{%\n"
+ " \\end{longtable}%\n"
+ " \\end{description}%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% is used for parameters within a detailed function description\n"
+ "\\newenvironment{DoxyParamCaption}{%\n"
+ " \\renewcommand{\\item}[2][]{##1 {\\em ##2}}%\n"
+ " }{%\n"
+ "}\n\n";
+ t << "% Used by return value lists\n"
+ "\\newenvironment{DoxyRetVals}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ " \\begin{description}%\n"
+ " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
+ " \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
+ " \\rowcolors{1}{white}{tableShade}%\n"
+ " \\arrayrulecolor{gray}%\n"
+ " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
+ " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
+ " p{0.77\\textwidth}|}%\n"
+ " \\hline%\n"
+ "}{%\n"
+ " \\end{longtable}%\n"
+ " \\end{description}%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by exception lists\n"
+ "\\newenvironment{DoxyExceptions}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ " \\begin{description}%\n"
+ " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
+ " \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
+ " \\rowcolors{1}{white}{tableShade}%\n"
+ " \\arrayrulecolor{gray}%\n"
+ " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
+ " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
+ " p{0.77\\textwidth}|}%\n"
+ " \\hline%\n"
+ "}{%\n"
+ " \\end{longtable}%\n"
+ " \\end{description}%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "% Used by template parameter lists\n"
+ "\\newenvironment{DoxyTemplParams}[1]{%\n"
+ " \\begin{DoxyDesc}{#1}%\n"
+ " \\begin{description}%\n"
+ " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
+ " \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
+ " \\rowcolors{1}{white}{tableShade}%\n"
+ " \\arrayrulecolor{gray}%\n"
+ " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
+ " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
+ " p{0.77\\textwidth}|}%\n"
+ " \\hline%\n"
+ "}{%\n"
+ " \\end{longtable}%\n"
+ " \\end{description}%\n"
+ " \\end{DoxyDesc}%\n"
+ "}\n\n";
+ t << "\\newcommand{\\doxyref}[3]{\\textbf{#1} (\\textnormal{#2}\\,\\pageref{#3})}\n";
+ t << "\\newenvironment{DoxyCompactList}\n";
+ t << "{\\begin{list}{}{\n";
+ t << " \\setlength{\\leftmargin}{0.5cm}\n";
+ t << " \\setlength{\\itemsep}{0pt}\n";
+ t << " \\setlength{\\parsep}{0pt}\n";
+ t << " \\setlength{\\topsep}{0pt}\n";
+ t << " \\renewcommand{\\makelabel}{\\hfill}}}\n";
+ t << "{\\end{list}}\n";
+ t << "\\newenvironment{DoxyCompactItemize}\n";
+ t << "{\n";
+ t << " \\begin{itemize}\n";
+ t << " \\setlength{\\itemsep}{-3pt}\n";
+ t << " \\setlength{\\parsep}{0pt}\n";
+ t << " \\setlength{\\topsep}{0pt}\n";
+ t << " \\setlength{\\partopsep}{0pt}\n";
+ t << "}\n";
+ t << "{\\end{itemize}}\n";
+ t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n";
+ t << "\\newlength{\\tmplength}\n";
+ t << "\\newenvironment{TabularC}[1]\n";
+ t << "{\n";
+ t << "\\setlength{\\tmplength}\n";
+ t << " {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n";
+ t << " \\par\\begin{tabular*}{\\linewidth}\n";
+ t << " {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n";
+ t << "}\n";
+ t << "{\\end{tabular*}\\par}\n";
+ t << "\\newcommand{\\entrylabel}[1]{\n";
+ t << " {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\vspace{1.5\\baselineskip}}}}\n";
+ t << "\\newenvironment{Desc}\n";
+ t << "{\\begin{list}{}\n";
+ t << " {\n";
+ t << " \\settowidth{\\labelwidth}{40pt}\n";
+ t << " \\setlength{\\leftmargin}{\\labelwidth}\n";
+ t << " \\setlength{\\parsep}{0pt}\n";
+ t << " \\setlength{\\itemsep}{-4pt}\n";
+ t << " \\renewcommand{\\makelabel}{\\entrylabel}\n";
+ t << " }\n";
+ t << "}\n";
+ t << "{\\end{list}}\n";
+
+ t << "\\newenvironment{Indent}\n";
+ t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";
+ t << " \\item[]\\ignorespaces}\n";
+ t << " {\\unskip\\end{list}}\n";
+
+ t << "\\setlength{\\parindent}{0cm}\n";
+ t << "\\setlength{\\parskip}{0.2cm}\n";
+ t << "\\addtocounter{secnumdepth}{2}\n";
+ // \sloppy should not be used, see bug 563698
+ //t << "\\sloppy\n";
+ t << "\\usepackage[T1]{fontenc}\n";
+ t << "\\makeatletter\n";
+ t << "\\renewcommand{\\paragraph}{\\@startsection{paragraph}{4}{0ex}%\n";
+ t << " {-1.0ex}%\n";
+ t << " {1.0ex}%\n";
+ t << " {\\usefont{OT1}{phv}{bc}{n}\\color{darkgray}}}\n";
+ t << "\\renewcommand{\\subparagraph}{\\@startsection{subparagraph}{5}{0ex}%\n";
+ t << " {-1.0ex}%\n";
+ t << " {1.0ex}%\n";
+ t << " {\\usefont{OT1}{phv}{bc}{n}\\color{darkgray}}}\n";
+ t << "\\makeatother\n";
+ t << "\\allsectionsfont{\\usefont{OT1}{phv}{bc}{n}\\selectfont\\color{darkgray}}\n";
+ t << "\\stepcounter{secnumdepth}\n";
+ t << "\\stepcounter{tocdepth}\n";
+ t << "\\definecolor{comment}{rgb}{0.5,0.0,0.0}\n";
+ t << "\\definecolor{keyword}{rgb}{0.0,0.5,0.0}\n";
+ t << "\\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}\n";
+ t << "\\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}\n";
+ t << "\\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}\n";
+ t << "\\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}\n";
+ t << "\\definecolor{charliteral}{rgb}{0.0,0.5,0.5}\n";
+ t << "\\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}\n";
+ t << "\\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}\n";
+ t << "\\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}\n";
+ t << "\\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}\n";
+}
+
+static void writeDefaultFooter(FTextStream &t)
+{
+ t << "\\printindex\n";
+ t << "\\end{document}\n";
+}
+
+void LatexGenerator::writeHeaderFile(QFile &f)
+{
+ FTextStream t(&f);
+ writeDefaultHeaderPart1(t);
+ t << "Your title here";
+ writeDefaultHeaderPart2(t);
+ t << "Generated by";
+ writeDefaultHeaderPart3(t);
+}
+
+void LatexGenerator::writeFooterFile(QFile &f)
+{
+ FTextStream t(&f);
+ writeDefaultFooter(t);
+}
+
+void LatexGenerator::writeStyleSheetFile(QFile &f)
+{
+ FTextStream t(&f);
+
+ writeDefaultStyleSheetPart1(t);
+ QCString &projectName = Config_getString("PROJECT_NAME");
+
+ t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );
+ t << " doxygen";
+ //t << " " << theTranslator->trWrittenBy() << " ";
+ //t << "Dimitri van Heesch \\copyright~1997-2011";
+ writeDefaultStyleSheetPart2(t);
+ t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );
+ t << " doxygen";
+ //t << " << theTranslator->trWrittenBy() << " ";
+ //t << "Dimitri van Heesch \\copyright~1997-2011";
+ writeDefaultStyleSheetPart3(t);
+}
+
+void LatexGenerator::startFile(const char *name,const char *,const char *)
+{
+#if 0
+ setEncoding(Config_getString("LATEX_OUTPUT_ENCODING"));
+#endif
+ QCString fileName=name;
+ relPath = relativePathToRoot(fileName);
+ sourceFileName = stripPath(fileName);
+ if (fileName.right(4)!=".tex" && fileName.right(4)!=".sty") fileName+=".tex";
+ startPlainFile(fileName);
+}
+
+void LatexGenerator::endFile()
+{
+ endPlainFile();
+ sourceFileName.resize(0);
+}
+
+//void LatexGenerator::writeIndex()
+//{
+// startFile("refman.tex");
+//}
+
+void LatexGenerator::startProjectNumber()
+{
+ t << "\\\\[1ex]\\large ";
+}
+
+void LatexGenerator::startIndexSection(IndexSections is)
+{
+ bool &compactLatex = Config_getBool("COMPACT_LATEX");
+ QCString &latexHeader = Config_getString("LATEX_HEADER");
+ switch (is)
+ {
+ case isTitlePageStart:
+ {
+ if (latexHeader.isEmpty())
+ {
+ writeDefaultHeaderPart1(t);
+ }
+ else
+ {
+ QCString header = fileToString(latexHeader);
+ t << substituteKeywords(header,0);
+ }
+ }
+ break;
+ case isTitlePageAuthor:
+ if (latexHeader.isEmpty())
+ {
+ writeDefaultHeaderPart2(t);
+ }
+ break;
+ case isMainPage:
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Introduction}\n"
+ break;
+ //case isPackageIndex:
+ // if (compactLatex) t << "\\section"; else t << "\\chapter";
+ // t << "{"; //Package Index}\n"
+ // break;
+ case isModuleIndex:
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Module Index}\n"
+ break;
+ case isDirIndex:
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Directory Index}\n"
+ break;
+ case isNamespaceIndex:
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Namespace Index}\"
+ break;
+ case isClassHierarchyIndex:
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Hierarchical Index}\n"
+ break;
+ case isCompoundIndex:
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Annotated Compound Index}\n"
+ break;
+ case isFileIndex:
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Annotated File Index}\n"
+ break;
+ case isPageIndex:
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Annotated Page Index}\n"
+ break;
+ case isModuleDocumentation:
+ {
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ bool found=FALSE;
+ for (gli.toFirst();(gd=gli.current()) && !found;++gli)
+ {
+ if (!gd->isReference())
+ {
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Module Documentation}\n";
+ found=TRUE;
+ }
+ }
+ }
+ break;
+ case isDirDocumentation:
+ {
+ SDict<DirDef>::Iterator dli(*Doxygen::directories);
+ DirDef *dd;
+ bool found=FALSE;
+ for (dli.toFirst();(dd=dli.current()) && !found;++dli)
+ {
+ if (dd->isLinkableInProject())
+ {
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Module Documentation}\n";
+ found=TRUE;
+ }
+ }
+ }
+ break;
+ case isNamespaceDocumentation:
+ {
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ bool found=FALSE;
+ for (nli.toFirst();(nd=nli.current()) && !found;++nli)
+ {
+ if (nd->isLinkableInProject())
+ {
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; // Namespace Documentation}\n":
+ found=TRUE;
+ }
+ }
+ }
+ break;
+ case isClassDocumentation:
+ {
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+ bool found=FALSE;
+ for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ {
+ if (cd->isLinkableInProject() &&
+ cd->templateMaster()==0 &&
+ !cd->isEmbeddedInGroupDocs()
+ )
+ {
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Compound Documentation}\n";
+ found=TRUE;
+ }
+ }
+ }
+ break;
+ case isFileDocumentation:
+ {
+ bool isFirst=TRUE;
+ FileName *fn=Doxygen::inputNameList->first();
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ if (fd->isLinkableInProject())
+ {
+ if (isFirst)
+ {
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //File Documentation}\n";
+ isFirst=FALSE;
+ break;
+ }
+ }
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ }
+ break;
+ case isExampleDocumentation:
+ {
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Example Documentation}\n";
+ }
+ break;
+ case isPageDocumentation:
+ {
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Page Documentation}\n";
+ }
+ break;
+ case isPageDocumentation2:
+ break;
+ case isEndIndex:
+ break;
+ }
+}
+
+void LatexGenerator::endIndexSection(IndexSections is)
+{
+ //static bool compactLatex = Config_getBool("COMPACT_LATEX");
+ static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
+ static QCString latexHeader = Config_getString("LATEX_HEADER");
+ static QCString latexFooter = Config_getString("LATEX_FOOTER");
+ switch (is)
+ {
+ case isTitlePageStart:
+ break;
+ case isTitlePageAuthor:
+ if (latexHeader.isEmpty())
+ {
+ writeDefaultHeaderPart3(t);
+ }
+ break;
+ case isMainPage:
+ {
+ QCString indexName=Config_getBool("GENERATE_TREEVIEW")?"main":"index";
+ t << "}\n\\label{index}";
+ if (Config_getBool("PDF_HYPERLINKS")) t << "\\hypertarget{index}{}";
+ t << "\\input{" << indexName << "}\n";
+ }
+ break;
+ case isModuleIndex:
+ t << "}\n\\input{modules}\n";
+ break;
+ case isDirIndex:
+ t << "}\n\\input{dirs}\n";
+ break;
+ case isNamespaceIndex:
+ t << "}\n\\input{namespaces}\n";
+ break;
+ case isClassHierarchyIndex:
+ t << "}\n\\input{hierarchy}\n";
+ break;
+ case isCompoundIndex:
+ t << "}\n\\input{annotated}\n";
+ break;
+ case isFileIndex:
+ t << "}\n\\input{files}\n";
+ break;
+ case isPageIndex:
+ t << "}\n\\input{pages}\n";
+ break;
+ case isModuleDocumentation:
+ {
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ bool found=FALSE;
+ for (gli.toFirst();(gd=gli.current()) && !found;++gli)
+ {
+ if (!gd->isReference())
+ {
+ t << "}\n\\input{" << gd->getOutputFileBase() << "}\n";
+ found=TRUE;
+ }
+ }
+ for (;(gd=gli.current());++gli)
+ {
+ if (!gd->isReference())
+ {
+ //if (compactLatex) t << "\\input"; else t << "\\include";
+ t << "\\input";
+ t << "{" << gd->getOutputFileBase() << "}\n";
+ }
+ }
+ }
+ break;
+ case isDirDocumentation:
+ {
+ SDict<DirDef>::Iterator dli(*Doxygen::directories);
+ DirDef *dd;
+ bool found=FALSE;
+ for (dli.toFirst();(dd=dli.current()) && !found;++dli)
+ {
+ if (dd->isLinkableInProject())
+ {
+ t << "}\n\\input{" << dd->getOutputFileBase() << "}\n";
+ found=TRUE;
+ }
+ }
+ for (;(dd=dli.current());++dli)
+ {
+ if (dd->isLinkableInProject())
+ {
+ //if (compactLatex) t << "\\input"; else t << "\\include";
+ t << "\\input";
+ t << "{" << dd->getOutputFileBase() << "}\n";
+ }
+ }
+ }
+ break;
+ case isNamespaceDocumentation:
+ {
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ bool found=FALSE;
+ for (nli.toFirst();(nd=nli.current()) && !found;++nli)
+ {
+ if (nd->isLinkableInProject())
+ {
+ t << "}\n\\input{" << nd->getOutputFileBase() << "}\n";
+ found=TRUE;
+ }
+ }
+ while ((nd=nli.current()))
+ {
+ if (nd->isLinkableInProject())
+ {
+ //if (compactLatex) t << "\\input"; else t << "\\include";
+ t << "\\input";
+ t << "{" << nd->getOutputFileBase() << "}\n";
+ }
+ ++nli;
+ }
+ }
+ break;
+ case isClassDocumentation:
+ {
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+ bool found=FALSE;
+ for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ {
+ if (cd->isLinkableInProject() &&
+ cd->templateMaster()==0 &&
+ !cd->isEmbeddedInGroupDocs()
+ )
+ {
+ t << "}\n\\input{" << cd->getOutputFileBase() << "}\n";
+ found=TRUE;
+ }
+ }
+ for (;(cd=cli.current());++cli)
+ {
+ if (cd->isLinkableInProject() &&
+ cd->templateMaster()==0 &&
+ !cd->isEmbeddedInGroupDocs()
+ )
+ {
+ //if (compactLatex) t << "\\input"; else t << "\\include";
+ t << "\\input";
+ t << "{" << cd->getOutputFileBase() << "}\n";
+ }
+ }
+ }
+ break;
+ case isFileDocumentation:
+ {
+ bool isFirst=TRUE;
+ FileName *fn=Doxygen::inputNameList->first();
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ if (fd->isLinkableInProject())
+ {
+ if (isFirst)
+ {
+ t << "}\n\\input{" << fd->getOutputFileBase() << "}\n";
+ if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
+ {
+ //t << "\\include{" << fd->getSourceFileBase() << "}\n";
+ t << "\\input{" << fd->getSourceFileBase() << "}\n";
+ }
+ isFirst=FALSE;
+ }
+ else
+ {
+ //if (compactLatex) t << "\\input" ; else t << "\\include";
+ t << "\\input" ;
+ t << "{" << fd->getOutputFileBase() << "}\n";
+ if (sourceBrowser && m_prettyCode && fd->generateSourceFile())
+ {
+ //t << "\\include{" << fd->getSourceFileBase() << "}\n";
+ t << "\\input{" << fd->getSourceFileBase() << "}\n";
+ }
+ }
+ }
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ }
+ break;
+ case isExampleDocumentation:
+ {
+ t << "}\n";
+ PageSDict::Iterator pdi(*Doxygen::exampleSDict);
+ PageDef *pd=pdi.toFirst();
+ if (pd)
+ {
+ t << "\\input{" << pd->getOutputFileBase() << "}\n";
+ }
+ for (++pdi;(pd=pdi.current());++pdi)
+ {
+ //if (compactLatex) t << "\\input" ; else t << "\\include";
+ t << "\\input";
+ t << "{" << pd->getOutputFileBase() << "}\n";
+ }
+ }
+ break;
+ case isPageDocumentation:
+ {
+ t << "}\n";
+#if 0
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=pdi.toFirst();
+ bool first=TRUE;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ if (!pd->getGroupDef() && !pd->isReference())
+ {
+ if (compactLatex) t << "\\section"; else t << "\\chapter";
+ t << "{" << pd->title();
+ t << "}\n";
+
+ if (compactLatex || first) t << "\\input" ; else t << "\\include";
+ t << "{" << pd->getOutputFileBase() << "}\n";
+ first=FALSE;
+ }
+ }
+#endif
+ }
+ break;
+ case isPageDocumentation2:
+ break;
+ case isEndIndex:
+ if (latexFooter.isEmpty())
+ {
+ writeDefaultFooter(t);
+ }
+ else
+ {
+ QCString footer = fileToString(latexFooter);
+ t << substituteKeywords(footer,0);
+ }
+ break;
+ }
+}
+
+void LatexGenerator::writePageLink(const char *name, bool /*first*/)
+{
+ //bool &compactLatex = Config_getBool("COMPACT_LATEX");
+ // next is remove for bug615957
+ //if (compactLatex || first) t << "\\input" ; else t << "\\include";
+ t << "\\input" ;
+ t << "{" << name << "}\n";
+}
+
+
+void LatexGenerator::writeStyleInfo(int part)
+{
+ switch(part)
+ {
+ case 0:
+ {
+ //QCString pname=Config_getString("PROJECT_NAME").stripWhiteSpace();
+ startPlainFile("doxygen.sty");
+ writeDefaultStyleSheetPart1(t);
+ }
+ break;
+ case 1:
+ case 3:
+ t << " Doxygen ";
+ break;
+ case 2:
+ {
+ writeDefaultStyleSheetPart2(t);
+ }
+ break;
+ case 4:
+ {
+ writeDefaultStyleSheetPart3(t);
+ endPlainFile();
+ }
+ break;
+ }
+}
+
+void LatexGenerator::newParagraph()
+{
+ t << endl << endl;
+}
+
+void LatexGenerator::startParagraph()
+{
+ t << endl << endl;
+}
+
+void LatexGenerator::endParagraph()
+{
+ t << endl << endl;
+}
+
+void LatexGenerator::writeString(const char *text)
+{
+ t << text;
+}
+
+void LatexGenerator::startIndexItem(const char *ref,const char *fn)
+{
+ t << "\\item ";
+ if (!ref && fn)
+ {
+ t << "\\contentsline{section}{";
+ }
+}
+
+void LatexGenerator::endIndexItem(const char *ref,const char *fn)
+{
+ if (!ref && fn)
+ {
+ t << "}{\\pageref{" << fn << "}}{}" << endl;
+ }
+}
+
+//void LatexGenerator::writeIndexFileItem(const char *,const char *text)
+//{
+// t << "\\item\\contentsline{section}{";
+// docify(text);
+// t << "}{\\pageref{" << text << "}}" << endl;
+//}
+
+
+void LatexGenerator::startHtmlLink(const char *url)
+{
+ if (Config_getBool("PDF_HYPERLINKS"))
+ {
+ t << "\\href{";
+ t << url;
+ t << "}";
+ }
+ t << "{\\tt ";
+}
+
+void LatexGenerator::endHtmlLink()
+{
+ t << "}";
+}
+
+//void LatexGenerator::writeMailLink(const char *url)
+//{
+// if (Config_getBool("PDF_HYPERLINKS"))
+// {
+// t << "\\href{mailto:";
+// t << url;
+// t << "}";
+// }
+// t << "{\\tt ";
+// docify(url);
+// t << "}";
+//}
+
+void LatexGenerator::writeStartAnnoItem(const char *,const char *,
+ const char *path,const char *name)
+{
+ t << "\\item\\contentsline{section}{\\bf ";
+ if (path) docify(path);
+ docify(name);
+ t << "} ";
+}
+
+void LatexGenerator::writeEndAnnoItem(const char *name)
+{
+ t << "}{\\pageref{" << name << "}}{}" << endl;
+}
+
+void LatexGenerator::startIndexKey()
+{
+ t << "\\item\\contentsline{section}{";
+}
+
+void LatexGenerator::endIndexKey()
+{
+}
+
+void LatexGenerator::startIndexValue(bool hasBrief)
+{
+ t << " ";
+ if (hasBrief) t << "(";
+}
+
+void LatexGenerator::endIndexValue(const char *name,bool hasBrief)
+{
+ if (hasBrief) t << ")";
+ t << "}{\\pageref{" << name << "}}{}" << endl;
+}
+
+//void LatexGenerator::writeClassLink(const char *,const char *,
+// const char *,const char *name)
+//{
+// t << "{\\bf ";
+// docify(name);
+// t << "}";
+//}
+
+void LatexGenerator::startTextLink(const char *f,const char *anchor)
+{
+ if (!disableLinks && Config_getBool("PDF_HYPERLINKS"))
+ {
+ t << "\\hyperlink{";
+ if (f) t << stripPath(f);
+ if (anchor) t << "_" << anchor;
+ t << "}{";
+ }
+ else
+ {
+ t << "{\\bf ";
+ }
+}
+
+void LatexGenerator::endTextLink()
+{
+ t << "}";
+}
+
+void LatexGenerator::writeObjectLink(const char *ref, const char *f,
+ const char *anchor, const char *text)
+{
+ if (!disableLinks && !ref && Config_getBool("PDF_HYPERLINKS"))
+ {
+ t << "\\hyperlink{";
+ if (f) t << stripPath(f);
+ if (f && anchor) t << "_";
+ if (anchor) t << anchor;
+ t << "}{";
+ docify(text);
+ t << "}";
+ }
+ else
+ {
+ t << "{\\bf ";
+ docify(text);
+ t << "}";
+ }
+}
+
+void LatexGenerator::startPageRef()
+{
+ t << " \\doxyref{}{";
+}
+
+void LatexGenerator::endPageRef(const char *clname, const char *anchor)
+{
+ t << "}{";
+ if (clname) t << clname;
+ if (anchor) t << "_" << anchor;
+ t << "}";
+}
+
+void LatexGenerator::writeCodeLink(const char *ref,const char *f,
+ const char *anchor,const char *name,
+ const char *)
+{
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ int l = strlen(name);
+ if (col+l>80)
+ {
+ t << "\n ";
+ col=0;
+ }
+ if (m_prettyCode && !disableLinks && !ref && usePDFLatex && pdfHyperlinks)
+ {
+ t << "\\hyperlink{";
+ if (f) t << stripPath(f);
+ if (f && anchor) t << "_";
+ if (anchor) t << anchor;
+ t << "}{" << name << "}";
+ }
+ else
+ {
+ t << name;
+ }
+ col+=l;
+}
+
+void LatexGenerator::startTitleHead(const char *fileName)
+{
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ if (usePDFLatex && pdfHyperlinks && fileName)
+ {
+ t << "\\hypertarget{" << stripPath(fileName) << "}{" << endl;
+ }
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ t << "\\subsection{";
+ }
+ else
+ {
+ t << "\\section{";
+ }
+}
+
+void LatexGenerator::endTitleHead(const char *fileName,const char *name)
+{
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ t << "}" << endl;
+ if (name)
+ {
+ t << "\\label{" << fileName << "}\\index{";
+ escapeLabelName(name);
+ t << "@{";
+ escapeMakeIndexChars(name);
+ t << "}}" << endl;
+ }
+ if (usePDFLatex && pdfHyperlinks && fileName)
+ {
+ t << "}" << endl;
+ }
+}
+
+void LatexGenerator::startTitle()
+{
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ t << "\\subsection{";
+ }
+ else
+ {
+ t << "\\section{";
+ }
+}
+
+void LatexGenerator::startGroupHeader(int extraIndentLevel)
+{
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ extraIndentLevel++;
+ }
+
+ if (extraIndentLevel==3)
+ {
+ t << "\\subparagraph*{";
+ }
+ else if (extraIndentLevel==2)
+ {
+ t << "\\paragraph{";
+ }
+ else if (extraIndentLevel==1)
+ {
+ t << "\\subsubsection{";
+ }
+ else // extraIndentLevel==0
+ {
+ t << "\\subsection{";
+ }
+ disableLinks=TRUE;
+}
+
+void LatexGenerator::endGroupHeader(int)
+{
+ disableLinks=FALSE;
+ t << "}" << endl;
+}
+
+void LatexGenerator::startMemberHeader(const char *)
+{
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ t << "\\subsubsection*{";
+ }
+ else
+ {
+ t << "\\subsection*{";
+ }
+ disableLinks=TRUE;
+}
+
+void LatexGenerator::endMemberHeader()
+{
+ disableLinks=FALSE;
+ t << "}" << endl;
+}
+
+void LatexGenerator::startMemberDoc(const char *clname,
+ const char *memname,
+ const char *,
+ const char *title,
+ bool showInline)
+{
+ if (memname && memname[0]!='@')
+ {
+ t << "\\index{";
+ if (clname)
+ {
+ escapeLabelName(clname);
+ t << "@{";
+ escapeMakeIndexChars(clname);
+ t << "}!";
+ }
+ escapeLabelName(memname);
+ t << "@{";
+ escapeMakeIndexChars(memname);
+ t << "}}" << endl;
+
+ t << "\\index{";
+ escapeLabelName(memname);
+ t << "@{";
+ escapeMakeIndexChars(memname);
+ t << "}";
+ if (clname)
+ {
+ t << "!" << clname << "@{";
+ docify(clname);
+ t << "}";
+ }
+ t << "}" << endl;
+ }
+ static const char *levelLab[] = { "subsubsection","paragraph","subparagraph", "subparagraph" };
+ static bool compactLatex = Config_getBool("COMPACT_LATEX");
+ int level=0;
+ if (showInline) level+=2;
+ if (compactLatex) level++;
+ t << "\\" << levelLab[level];
+
+ //if (Config_getBool("PDF_HYPERLINKS") && memname)
+ //{
+ // t << "[";
+ // escapeMakeIndexChars(this,t,memname);
+ // t << "]";
+ //}
+ t << "[{";
+ escapeMakeIndexChars(title);
+ t << "}]";
+ t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
+ disableLinks=TRUE;
+}
+
+void LatexGenerator::endMemberDoc(bool)
+{
+ disableLinks=FALSE;
+ t << "}";
+ //if (Config_getBool("COMPACT_LATEX")) t << "\\hfill";
+}
+
+void LatexGenerator::startDoxyAnchor(const char *fName,const char *,
+ const char *anchor, const char *,
+ const char *)
+{
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ if (usePDFLatex && pdfHyperlinks)
+ {
+ t << "\\hypertarget{";
+ if (fName) t << stripPath(fName);
+ if (anchor) t << "_" << anchor;
+ t << "}{" << endl;
+ }
+}
+
+void LatexGenerator::endDoxyAnchor(const char *fName,const char *anchor)
+{
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ if (usePDFLatex && pdfHyperlinks)
+ {
+ t << "}" << endl;
+ }
+ t << "\\label{";
+ if (fName) t << fName;
+ if (anchor) t << "_" << anchor;
+ t << "}" << endl;
+}
+
+void LatexGenerator::writeAnchor(const char *fName,const char *name)
+{
+ //printf("LatexGenerator::writeAnchor(%s,%s)\n",fName,name);
+ t << "\\label{" << name << "}" << endl;
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ if (usePDFLatex && pdfHyperlinks)
+ {
+ if (fName)
+ {
+ t << "\\hypertarget{" << stripPath(fName) << "_" << name << "}{}" << endl;
+ }
+ else
+ {
+ t << "\\hypertarget{" << name << "}{}" << endl;
+ }
+ }
+}
+
+
+//void LatexGenerator::writeLatexLabel(const char *clName,const char *anchor)
+//{
+// writeDoxyAnchor(0,clName,anchor,0);
+//}
+
+void LatexGenerator::addIndexItem(const char *s1,const char *s2)
+{
+ if (s1)
+ {
+ t << "\\index{";
+ escapeLabelName(s1);
+ t << "@{";
+ escapeMakeIndexChars(s1);
+ t << "}";
+ if (s2)
+ {
+ t << "!";
+ escapeLabelName(s2);
+ t << "@{";
+ escapeMakeIndexChars(s2);
+ t << "}";
+ }
+ t << "}";
+ }
+}
+
+
+void LatexGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type)
+{
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ if (usePDFLatex && pdfHyperlinks)
+ {
+ t << "\\hypertarget{" << stripPath(lab) << "}{}";
+ }
+ t << "\\";
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ switch(type)
+ {
+ case SectionInfo::Page: t << "subsection"; break;
+ case SectionInfo::Section: t << "subsubsection"; break;
+ case SectionInfo::Subsection: t << "paragraph"; break;
+ case SectionInfo::Subsubsection: t << "subparagraph"; break;
+ case SectionInfo::Paragraph: t << "subparagraph"; break;
+ default: ASSERT(0); break;
+ }
+ t << "{";
+ }
+ else
+ {
+ switch(type)
+ {
+ case SectionInfo::Page: t << "section"; break;
+ case SectionInfo::Section: t << "subsection"; break;
+ case SectionInfo::Subsection: t << "subsubsection"; break;
+ case SectionInfo::Subsubsection: t << "paragraph"; break;
+ case SectionInfo::Paragraph: t << "subparagraph"; break;
+ default: ASSERT(0); break;
+ }
+ t << "{";
+ }
+}
+
+void LatexGenerator::endSection(const char *lab,SectionInfo::SectionType)
+{
+ t << "}\\label{" << lab << "}" << endl;
+}
+
+
+void LatexGenerator::docify(const char *str)
+{
+ filterLatexString(t,str,insideTabbing,FALSE);
+}
+
+void LatexGenerator::codify(const char *str)
+{
+ if (str)
+ {
+ const char *p=str;
+ char c;
+ char cs[5];
+ int spacesToNextTabStop;
+ static int tabSize = Config_getInt("TAB_SIZE");
+ while (*p)
+ {
+ //static bool MultiByte = FALSE;
+ c=*p++;
+
+ switch(c)
+ {
+ case 0x0c: break; // remove ^L
+ case '\t': spacesToNextTabStop =
+ tabSize - (col%tabSize);
+ t << Doxygen::spaces.left(spacesToNextTabStop);
+ col+=spacesToNextTabStop;
+ break;
+ case '\n': t << '\n'; col=0; break;
+ default: cs[0]=c;
+ cs[1]=0;
+ int bytes=1;
+ if (c<0) // multibyte utf-8 character
+ {
+ bytes++; // 1xxx.xxxx: >=2 byte character
+ cs[1]=*p;
+ cs[2]=0;
+ if (((uchar)c&0xE0)==0xE0)
+ {
+ bytes++; // 111x.xxxx: >=3 byte character
+ cs[2]=*(p+1);
+ cs[3]=0;
+ }
+ if (((uchar)c&0xF0)==0xF0)
+ {
+ bytes++; // 1111.xxxx: 4 byte character
+ cs[2]=*(p+2);
+ cs[4]=0;
+ }
+ }
+ if (m_prettyCode)
+ {
+ filterLatexString(t,cs,insideTabbing,TRUE);
+ }
+ else
+ {
+ t << cs;
+ }
+ if (col>=80)
+ {
+ t << "\n ";
+ col=0;
+ }
+ else
+ {
+ col++;
+ }
+ p+=(bytes-1); // skip to next character
+ break;
+ }
+ }
+ }
+}
+
+void LatexGenerator::writeChar(char c)
+{
+ char cs[2];
+ cs[0]=c;
+ cs[1]=0;
+ docify(cs);
+}
+
+void LatexGenerator::startClassDiagram()
+{
+ //if (Config_getBool("COMPACT_LATEX")) t << "\\subsubsection"; else t << "\\subsection";
+ //t << "{";
+}
+
+void LatexGenerator::endClassDiagram(const ClassDiagram &d,
+ const char *fileName,const char *)
+{
+ d.writeFigure(t,dir,fileName);
+}
+
+
+void LatexGenerator::startAnonTypeScope(int indent)
+{
+ if (indent==0)
+ {
+ t << "\\begin{tabbing}" << endl;
+ t << "xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=\\kill" << endl;
+ insideTabbing=TRUE;
+ }
+ m_indent=indent;
+}
+
+void LatexGenerator::endAnonTypeScope(int indent)
+{
+ if (indent==0)
+ {
+ t << endl << "\\end{tabbing}";
+ insideTabbing=FALSE;
+ }
+ m_indent=indent;
+}
+
+void LatexGenerator::startMemberTemplateParams()
+{
+ if (templateMemberItem)
+ {
+ t << "{\\footnotesize ";
+ }
+}
+
+void LatexGenerator::endMemberTemplateParams()
+{
+ if (templateMemberItem)
+ {
+ t << "}\\\\";
+ }
+}
+
+void LatexGenerator::startMemberItem(int annoType)
+{
+ //printf("LatexGenerator::startMemberItem(%d)\n",annType);
+ if (!insideTabbing)
+ {
+ t << "\\item " << endl;
+ templateMemberItem = (annoType == 3);
+ }
+}
+
+void LatexGenerator::endMemberItem()
+{
+ if (insideTabbing)
+ {
+ t << "\\\\";
+ }
+ templateMemberItem = FALSE;
+ t << endl;
+}
+
+void LatexGenerator::startMemberDescription()
+{
+ if (!insideTabbing)
+ {
+ t << "\\begin{DoxyCompactList}\\small\\item\\em ";
+ }
+ else
+ {
+ for (int i=0;i<m_indent+2;i++) t << "\\>";
+ t << "{\\em ";
+ }
+}
+
+void LatexGenerator::endMemberDescription()
+{
+ if (!insideTabbing)
+ {
+ //t << "\\item\\end{DoxyCompactList}";
+ t << "\\end{DoxyCompactList}";
+ }
+ else
+ {
+ t << "}\\\\\n";
+ }
+}
+
+
+void LatexGenerator::writeNonBreakableSpace(int)
+{
+ //printf("writeNonBreakbleSpace()\n");
+ if (insideTabbing)
+ {
+ t << "\\>";
+ }
+ else
+ t << "~";
+}
+
+void LatexGenerator::startMemberList()
+{
+ if (!insideTabbing)
+ {
+ t << "\\begin{DoxyCompactItemize}" << endl;
+ }
+}
+
+void LatexGenerator::endMemberList()
+{
+ //printf("LatexGenerator::endMemberList(%d)\n",insideTabbing);
+ if (!insideTabbing)
+ {
+ t << "\\end{DoxyCompactItemize}" << endl;
+ }
+}
+
+
+void LatexGenerator::startMemberGroupHeader(bool hasHeader)
+{
+ if (hasHeader) t << "\\begin{Indent}";
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ t << "\\subparagraph*{";
+ }
+ else
+ {
+ t << "\\paragraph*{";
+ }
+}
+
+void LatexGenerator::endMemberGroupHeader()
+{
+ t << "}" << endl;
+}
+
+void LatexGenerator::startMemberGroupDocs()
+{
+ t << "{\\em ";
+}
+
+void LatexGenerator::endMemberGroupDocs()
+{
+ t << "}";
+}
+
+void LatexGenerator::startMemberGroup()
+{
+}
+
+void LatexGenerator::endMemberGroup(bool hasHeader)
+{
+ if (hasHeader)t << "\\end{Indent}";
+ t << endl;
+}
+
+void LatexGenerator::startDotGraph()
+{
+ newParagraph();
+}
+
+void LatexGenerator::endDotGraph(const DotClassGraph &g)
+{
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+}
+
+void LatexGenerator::startInclDepGraph()
+{
+}
+
+void LatexGenerator::endInclDepGraph(const DotInclDepGraph &g)
+{
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+}
+
+void LatexGenerator::startGroupCollaboration()
+{
+}
+
+void LatexGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
+{
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+}
+
+void LatexGenerator::startCallGraph()
+{
+}
+
+void LatexGenerator::endCallGraph(const DotCallGraph &g)
+{
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+}
+
+void LatexGenerator::startDirDepGraph()
+{
+}
+
+void LatexGenerator::endDirDepGraph(const DotDirDeps &g)
+{
+ g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath);
+}
+
+void LatexGenerator::startDescription()
+{
+ t << "\\begin{description}" << endl;
+}
+
+void LatexGenerator::endDescription()
+{
+ t << "\\end{description}" << endl;
+ firstDescItem=TRUE;
+}
+
+void LatexGenerator::startDescItem()
+{
+ firstDescItem=TRUE;
+ t << "\\item[";
+}
+
+void LatexGenerator::endDescItem()
+{
+ if (firstDescItem)
+ {
+ t << "]" << endl;
+ firstDescItem=FALSE;
+ }
+ else
+ {
+ lineBreak();
+ }
+}
+
+void LatexGenerator::startSimpleSect(SectionTypes,const char *file,
+ const char *anchor,const char *title)
+{
+ t << "\\begin{Desc}\n\\item[";
+ if (file)
+ {
+ writeObjectLink(0,file,anchor,title);
+ }
+ else
+ {
+ docify(title);
+ }
+ t << "]";
+}
+
+void LatexGenerator::endSimpleSect()
+{
+ t << "\\end{Desc}" << endl;
+}
+
+void LatexGenerator::startParamList(ParamListTypes,const char *title)
+{
+ t << "\\begin{Desc}\n\\item[";
+ docify(title);
+ t << "]";
+}
+
+void LatexGenerator::endParamList()
+{
+ t << "\\end{Desc}" << endl;
+}
+
+void LatexGenerator::startParameterList(bool openBracket)
+{
+ /* start of ParameterType ParameterName list */
+ if (openBracket) t << "(";
+ t << endl << "\\begin{DoxyParamCaption}" << endl;
+}
+
+void LatexGenerator::endParameterList()
+{
+}
+
+
+void LatexGenerator::startParameterType(bool /*first*/,const char *key)
+{
+ t << "\\item[{";
+ t << key;
+// if (!first)
+// {
+// t << "\\/ " << key << " ";
+// }
+}
+
+void LatexGenerator::endParameterType()
+{
+ t << "}]";
+}
+
+void LatexGenerator::startParameterName(bool /*oneArgOnly*/)
+{
+ t << "{";
+}
+
+void LatexGenerator::endParameterName(bool last,bool /* emptyList */,bool closeBracket)
+{
+ t << "}" << endl;
+
+ if (last)
+ {
+ t << "\\end{DoxyParamCaption}" << endl;
+ if (closeBracket) t << ")";
+ }
+}
+
+
+void LatexGenerator::printDoc(DocNode *n,const char *langExt)
+{
+ LatexDocVisitor *visitor = new LatexDocVisitor(t,*this,langExt,insideTabbing);
+ n->accept(visitor);
+ delete visitor;
+}
+
+void LatexGenerator::startConstraintList(const char *header)
+{
+ t << "\\begin{Desc}\n\\item[";
+ docify(header);
+ t << "]";
+ t << "\\begin{description}" << endl;
+}
+
+void LatexGenerator::startConstraintParam()
+{
+ t << "\\item[{\\em ";
+}
+
+void LatexGenerator::endConstraintParam()
+{
+}
+
+void LatexGenerator::startConstraintType()
+{
+ t << "} : {\\em ";
+}
+
+void LatexGenerator::endConstraintType()
+{
+ t << "}]";
+}
+
+void LatexGenerator::startConstraintDocs()
+{
+}
+
+void LatexGenerator::endConstraintDocs()
+{
+}
+
+void LatexGenerator::endConstraintList()
+{
+ t << "\\end{description}" << endl;
+ t << "\\end{Desc}" << endl;
+}
+
+void LatexGenerator::escapeLabelName(const char *s)
+{
+ const char *p=s;
+ char str[2];
+ str[1]=0;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '%': t << "\\%"; break;
+ //case '|': t << "\\tt{\"|}"; break;
+ //case '!': t << "\"!"; break;
+ default: str[0]=c; docify(str); break;
+ }
+ }
+}
+
+void LatexGenerator::escapeMakeIndexChars(const char *s)
+{
+ const char *p=s;
+ char str[2];
+ str[1]=0;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ //case '!': t << "\"!"; break;
+ case '"': t << "\"\""; break;
+ case '@': t << "\"@"; break;
+ //case '|': t << "\\tt{\"|}"; break;
+ case '[': t << "["; break;
+ case ']': t << "]"; break;
+ default: str[0]=c; docify(str); break;
+ }
+ }
+}
+
+void LatexGenerator::startCodeFragment()
+{
+ //if (m_prettyCode)
+ //{
+ // t << endl << endl;
+ // t << "\\begin{footnotesize}\\begin{alltt}\n";
+ //}
+ //else
+ //{
+ t << "\n\\begin{DoxyCode}\n";
+ //}
+}
+
+void LatexGenerator::endCodeFragment()
+{
+ //if (m_prettyCode)
+ //{
+ // t << "\\end{alltt}\\end{footnotesize}" << endl;
+ //}
+ //else
+ //{
+ t << "\\end{DoxyCode}\n";
+ //}
+}
+
+void LatexGenerator::writeLineNumber(const char *ref,const char *fileName,const char *anchor,int l)
+{
+ if (m_prettyCode)
+ {
+ QCString lineNumber;
+ lineNumber.sprintf("%05d",l);
+
+ if (fileName && !sourceFileName.isEmpty())
+ {
+ QCString lineAnchor;
+ lineAnchor.sprintf("_l%05d",l);
+ lineAnchor.prepend(sourceFileName);
+ startCodeAnchor(lineAnchor);
+ writeCodeLink(ref,fileName,anchor,lineNumber,0);
+ endCodeAnchor();
+ }
+ else
+ {
+ codify(lineNumber);
+ }
+ t << " ";
+ }
+ else
+ {
+ t << l << " ";
+ }
+}
+
+void LatexGenerator::startCodeLine()
+{
+ col=0;
+}
+
+void LatexGenerator::endCodeLine()
+{
+ codify("\n");
+}
+
+void LatexGenerator::startFontClass(const char *name)
+{
+ if (!m_prettyCode) return;
+ t << "\\textcolor{" << name << "}{";
+}
+
+void LatexGenerator::endFontClass()
+{
+ if (!m_prettyCode) return;
+ t << "}";
+}
+
+void LatexGenerator::startCodeAnchor(const char *name)
+{
+ static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ if (!m_prettyCode) return;
+ if (usePDFLatex && pdfHyperlinks)
+ {
+ t << "\\hypertarget{" << stripPath(name) << "}{}";
+ }
+}
+
+void LatexGenerator::endCodeAnchor()
+{
+}
+
+void LatexGenerator::startInlineHeader()
+{
+ if (Config_getBool("COMPACT_LATEX"))
+ {
+ t << "\\paragraph*{";
+ }
+ else
+ {
+ t << "\\subsubsection*{";
+ }
+}
+
+void LatexGenerator::endInlineHeader()
+{
+ t << "}" << endl;
+}
+
diff --git a/src/latexgen.h b/src/latexgen.h
new file mode 100644
index 0000000..55dfbab
--- /dev/null
+++ b/src/latexgen.h
@@ -0,0 +1,264 @@
+/******************************************************************************
+ *
+ * $Id: latexgen.h,v 1.50 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef LATEXGEN_H
+#define LATEXGEN_H
+
+#include "outputgen.h"
+
+class QFile;
+
+class LatexGenerator : public OutputGenerator
+{
+ public:
+ LatexGenerator();
+ ~LatexGenerator();
+ static void init();
+ static void writeStyleSheetFile(QFile &f);
+ static void writeHeaderFile(QFile &f);
+ static void writeFooterFile(QFile &f);
+
+ //OutputGenerator *copy();
+ //OutputGenerator *clone() { return new LatexGenerator(*this); }
+ //void append(const OutputGenerator *o);
+ void enable()
+ { if (genStack->top()) active=*genStack->top(); else active=TRUE; }
+ void disable() { active=FALSE; }
+ void enableIf(OutputType o) { if (o==Latex) active=TRUE; }
+ void disableIf(OutputType o) { if (o==Latex) active=FALSE; }
+ void disableIfNot(OutputType o) { if (o!=Latex) active=FALSE; }
+ bool isEnabled(OutputType o) { return (o==Latex && active); }
+ OutputGenerator *get(OutputType o) { return (o==Latex) ? this : 0; }
+
+ void printDoc(DocNode *,const char *);
+
+ void startFile(const char *name,const char *manName,const char *title);
+ void writeFooter() {}
+ void endFile();
+ void clearBuffer();
+
+ void startIndexSection(IndexSections);
+ void endIndexSection(IndexSections);
+ void writePageLink(const char *,bool);
+ void startProjectNumber();
+ void endProjectNumber() {}
+ void writeStyleInfo(int part);
+ void startTitleHead(const char *);
+ void startTitle();
+ void endTitleHead(const char *,const char *name);
+ void endTitle() { t << "}"; }
+
+ void newParagraph();
+ void startParagraph();
+ void endParagraph();
+ void writeString(const char *text);
+ void startIndexListItem() {}
+ void endIndexListItem() {}
+ void startIndexList() { t << "\\begin{DoxyCompactList}" << endl; }
+ void endIndexList() { t << "\\end{DoxyCompactList}" << endl; }
+ void startIndexKey();
+ void endIndexKey();
+ void startIndexValue(bool);
+ void endIndexValue(const char *,bool);
+ void startItemList() { t << "\\begin{DoxyCompactItemize}" << endl; }
+ void endItemList() { t << "\\end{DoxyCompactItemize}" << endl; }
+ void startIndexItem(const char *ref,const char *file);
+ void endIndexItem(const char *ref,const char *file);
+ void docify(const char *text);
+ void codify(const char *text);
+ void writeObjectLink(const char *ref,const char *file,
+ const char *anchor,const char *name);
+ void writeCodeLink(const char *ref, const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip);
+ void startTextLink(const char *,const char *);
+ void endTextLink();
+ void startHtmlLink(const char *url);
+ void endHtmlLink();
+ void startTypewriter() { t << "{\\ttfamily "; }
+ void endTypewriter() { t << "}"; }
+ void startGroupHeader(int);
+ void endGroupHeader(int);
+ void startItemListItem() { t << "\\item " << endl; }
+ void endItemListItem() {}
+
+ void startMemberSections() {}
+ void endMemberSections() {}
+ void startHeaderSection() {}
+ void endHeaderSection() {}
+ void startMemberHeader(const char *);
+ void endMemberHeader();
+ void startMemberSubtitle() {}
+ void endMemberSubtitle() {}
+ void startMemberDocList() {}
+ void endMemberDocList() {}
+ void startMemberList();
+ void endMemberList();
+ void startInlineDescription() {}
+ void endInlineDescription() {}
+ void startInlineHeader();
+ void endInlineHeader();
+ void startAnonTypeScope(int);
+ void endAnonTypeScope(int);
+ void startMemberItem(int);
+ void endMemberItem();
+ void startMemberTemplateParams();
+ void endMemberTemplateParams();
+
+ void startMemberGroupHeader(bool);
+ void endMemberGroupHeader();
+ void startMemberGroupDocs();
+ void endMemberGroupDocs();
+ void startMemberGroup();
+ void endMemberGroup(bool);
+
+ void insertMemberAlign(bool) {}
+
+ void writeRuler() { t << endl << endl; }
+ void writeAnchor(const char *fileName,const char *name);
+ void startCodeFragment();
+ void endCodeFragment();
+ void writeLineNumber(const char *,const char *,const char *,int l);
+ void startCodeLine();
+ void endCodeLine();
+ void startEmphasis() { t << "{\\em "; }
+ void endEmphasis() { t << "}"; }
+ void startBold() { t << "{\\bfseries "; }
+ void endBold() { t << "}"; }
+ void startDescription();
+ void endDescription();
+ void startDescItem();
+ void endDescItem();
+ void lineBreak(const char *style=0) { (void)style; t << "\\par\n"; }
+ void startMemberDoc(const char *,const char *,const char *,const char *,bool);
+ void endMemberDoc(bool);
+ void startDoxyAnchor(const char *,const char *,const char *,const char *,const char *);
+ void endDoxyAnchor(const char *,const char *);
+ void startCodeAnchor(const char *);
+ void endCodeAnchor();
+ void writeChar(char c);
+ void writeLatexSpacing() { t << "\\hspace{0.3cm}"; }
+ void writeStartAnnoItem(const char *type,const char *file,
+ const char *path,const char *name);
+ void writeEndAnnoItem(const char *name);
+ void startSubsection() { t << "\\subsection*{"; }
+ void endSubsection() { t << "}" << endl; }
+ void startSubsubsection() { t << "\\subsubsection*{"; }
+ void endSubsubsection() { t << "}" << endl; }
+ void startCenter() { t << "\\begin{center}" << endl; }
+ void endCenter() { t << "\\end{center}" << endl; }
+ void startSmall() { t << "\\footnotesize "; }
+ void endSmall() { t << "\\normalsize "; }
+ void startMemberDescription();
+ void endMemberDescription();
+ void startDescList(SectionTypes) { t << "\\begin{Desc}\n\\item["; }
+ void endDescList() { t << "\\end{Desc}" << endl; }
+ void startSimpleSect(SectionTypes,const char *,const char *,const char *);
+ void endSimpleSect();
+ void startParamList(ParamListTypes,const char *title);
+ void endParamList();
+ void startDescForItem() { t << "\\par" << endl; }
+ void endDescForItem() {}
+ void startSection(const char *,const char *,SectionInfo::SectionType);
+ void endSection(const char *,SectionInfo::SectionType);
+ void addIndexItem(const char *,const char *);
+ void startIndent() {}
+ void endIndent() {}
+ void writeSynopsis() {}
+ void startClassDiagram();
+ void endClassDiagram(const ClassDiagram &,const char *,const char *);
+ void startPageRef();
+ void endPageRef(const char *,const char *);
+ void startQuickIndices() {}
+ void endQuickIndices() {}
+ void writeSplitBar(const char *) {}
+ void writeLogo() {}
+ void writeQuickLinks(bool,HighlightedItem) {}
+ void startContents() {}
+ void endContents() {}
+ void writeNonBreakableSpace(int);
+
+ void startDescTable()
+ { t << "\\begin{description}" << endl; }
+ void endDescTable()
+ { t << "\\end{description}" << endl; }
+ void startDescTableTitle()
+ { t << "\\item[{\\em " << endl; }
+ void endDescTableTitle()
+ { t << "}]"; }
+ void startDescTableData() {}
+ void endDescTableData() {}
+ void lastIndexPage() {}
+
+ void startDotGraph();
+ void endDotGraph(const DotClassGraph &);
+ void startInclDepGraph();
+ void endInclDepGraph(const DotInclDepGraph &);
+ void startCallGraph();
+ void startGroupCollaboration();
+ void endGroupCollaboration(const DotGroupCollaboration &g);
+ void endCallGraph(const DotCallGraph &);
+ void startDirDepGraph();
+ void endDirDepGraph(const DotDirDeps &g);
+ void writeGraphicalHierarchy(const DotGfxHierarchyTable &) {}
+
+ void startTextBlock(bool) {}
+ void endTextBlock(bool) {}
+
+ void startMemberDocPrefixItem() {}
+ void endMemberDocPrefixItem() {}
+ void startMemberDocName(bool) {}
+ void endMemberDocName() {}
+ void startParameterType(bool,const char *);
+ void endParameterType();
+ void startParameterName(bool);
+ void endParameterName(bool,bool,bool);
+ void startParameterList(bool);
+ void endParameterList();
+
+ void startConstraintList(const char *);
+ void startConstraintParam();
+ void endConstraintParam();
+ void startConstraintType();
+ void endConstraintType();
+ void startConstraintDocs();
+ void endConstraintDocs();
+ void endConstraintList();
+
+ void startFontClass(const char *); // {}
+ void endFontClass(); // {}
+
+ void writeCodeAnchor(const char *) {}
+ void linkableSymbol(int,const char *,Definition *,Definition *) {}
+
+ private:
+ LatexGenerator(const LatexGenerator &);
+ LatexGenerator &operator=(const LatexGenerator &);
+ void escapeLabelName(const char *s);
+ void escapeMakeIndexChars(const char *s);
+ int col;
+ bool insideTabbing;
+ bool firstDescItem;
+ bool disableLinks;
+ QCString relPath;
+ QCString sourceFileName;
+ int m_indent;
+ bool templateMemberItem;
+ bool m_prettyCode;
+};
+
+#endif
diff --git a/src/layout.cpp b/src/layout.cpp
new file mode 100644
index 0000000..8c49761
--- /dev/null
+++ b/src/layout.cpp
@@ -0,0 +1,1224 @@
+/******************************************************************************
+ *
+ * $Id: layout.cpp,v 1.2 2001/03/19 19:27:41 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "layout.h"
+#include "message.h"
+#include "language.h"
+#include "vhdldocgen.h"
+#include "util.h"
+
+#include <qxml.h>
+#include <qfile.h>
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+
+static const char layout_default[] =
+#include "layout_default.h"
+;
+
+static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE)
+{
+ QCString visible = convertToQCString(attrib.value("visible"));
+ if (visible.isEmpty()) return defVal;
+ if (visible.at(0)=='$' && visible.length()>1)
+ {
+ QCString id = visible.mid(1);
+ ConfigOption *opt = Config::instance()->get(id);
+ if (opt && opt->kind()==ConfigOption::O_Bool)
+ {
+ return *((ConfigBool *)opt)->valueRef();
+ }
+ else if (!opt)
+ {
+ err("error: found unsupported value %s for visible attribute in layout file\n",
+ visible.data());
+ }
+ }
+ return visible!="no" && visible!="0";
+}
+
+//---------------------------------------------------------------------------------
+
+LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind) const
+{
+ LayoutNavEntry *result=0;
+ QListIterator<LayoutNavEntry> li(m_children);
+ LayoutNavEntry *entry;
+ for (li.toFirst();(entry=li.current());++li)
+ {
+ // depth first search, needed to find the entry furthest from the
+ // root in case an entry is in the tree twice
+ result = entry->find(kind);
+ if (result) return result;
+ if (entry->kind()==kind)
+ {
+ return entry;
+ }
+ }
+ return result;
+}
+
+//---------------------------------------------------------------------------------
+
+class LayoutParser : public QXmlDefaultHandler
+{
+ private:
+ class StartElementHandler
+ {
+ typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib);
+ public:
+ StartElementHandler(LayoutParser *parent, Handler h)
+ : m_parent(parent), m_handler(h) {}
+ virtual ~StartElementHandler() {}
+ virtual void operator()(const QXmlAttributes &attrib)
+ {
+ (m_parent->*m_handler)(attrib);
+ }
+ protected:
+ StartElementHandler() : m_parent(0), m_handler(0) {}
+ private:
+ LayoutParser *m_parent;
+ Handler m_handler;
+ };
+
+ class StartElementHandlerKind : public StartElementHandler
+ {
+ typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
+ const QXmlAttributes &attrib);
+ public:
+ StartElementHandlerKind(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h)
+ : m_parent(parent), m_kind(k), m_handler(h) {}
+ void operator()(const QXmlAttributes &attrib)
+ {
+ (m_parent->*m_handler)(m_kind,attrib);
+ }
+ private:
+ LayoutParser *m_parent;
+ LayoutDocEntry::Kind m_kind;
+ Handler m_handler;
+ };
+
+ class StartElementHandlerSection : public StartElementHandler
+ {
+ typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
+ const QXmlAttributes &attrib,
+ const QCString &title);
+ public:
+ StartElementHandlerSection(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h,
+ const QCString &title)
+ : m_parent(parent), m_kind(k), m_handler(h), m_title(title) {}
+ void operator()(const QXmlAttributes &attrib)
+ {
+ (m_parent->*m_handler)(m_kind,attrib,m_title);
+ }
+ private:
+ LayoutParser *m_parent;
+ LayoutDocEntry::Kind m_kind;
+ Handler m_handler;
+ QCString m_title;
+ };
+
+ class StartElementHandlerMember : public StartElementHandler
+ {
+ typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib,
+ MemberList::ListType type,
+ const QCString &title,
+ const QCString &subtitle);
+ public:
+ StartElementHandlerMember(LayoutParser *parent,
+ Handler h,
+ MemberList::ListType type,
+ const QCString &tl,
+ const QCString &ss = QCString()
+ )
+ : m_parent(parent), m_handler(h), m_type(type),
+ m_title(tl), m_subscript(ss) {}
+ void operator()(const QXmlAttributes &attrib)
+ {
+ (m_parent->*m_handler)(attrib,m_type,m_title,m_subscript);
+ }
+ private:
+ LayoutParser *m_parent;
+ Handler m_handler;
+ MemberList::ListType m_type;
+ QCString m_title;
+ QCString m_subscript;
+ };
+
+ class StartElementHandlerNavEntry : public StartElementHandler
+ {
+ typedef void (LayoutParser::*Handler)(LayoutNavEntry::Kind kind,
+ const QXmlAttributes &attrib,
+ const QCString &title);
+ public:
+ StartElementHandlerNavEntry(LayoutParser *parent,
+ LayoutNavEntry::Kind kind,
+ Handler h,
+ const QCString &tl
+ )
+ : m_parent(parent), m_kind(kind), m_handler(h), m_title(tl) {}
+ void operator()(const QXmlAttributes &attrib)
+ {
+ (m_parent->*m_handler)(m_kind,attrib,m_title);
+ }
+ private:
+ LayoutParser *m_parent;
+ LayoutNavEntry::Kind m_kind;
+ Handler m_handler;
+ QCString m_title;
+ };
+
+ class EndElementHandler
+ {
+ typedef void (LayoutParser::*Handler)();
+ public:
+ EndElementHandler(LayoutParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
+ void operator()() { (m_parent->*m_handler)(); }
+ private:
+ LayoutParser *m_parent;
+ Handler m_handler;
+ };
+
+
+ public:
+ static LayoutParser &instance()
+ {
+ static LayoutParser *theInstance = new LayoutParser;
+ return *theInstance;
+ }
+ void init()
+ {
+ m_sHandler.setAutoDelete(TRUE);
+ m_eHandler.setAutoDelete(TRUE);
+ m_part = -1; // invalid
+ m_rootNav = 0;
+
+ bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+
+ // start & end handlers
+ m_sHandler.insert("doxygenlayout",
+ new StartElementHandler(this,&LayoutParser::startLayout));
+ m_eHandler.insert("doxygenlayout",
+ new EndElementHandler(this,&LayoutParser::endLayout));
+
+ // class layout handlers
+ m_sHandler.insert("navindex",
+ new StartElementHandler(this,&LayoutParser::startNavIndex));
+ m_sHandler.insert("navindex/tab",
+ new StartElementHandler(this,&LayoutParser::startNavEntry));
+ m_eHandler.insert("navindex/tab",
+ new EndElementHandler(this,&LayoutParser::endNavEntry));
+ m_eHandler.insert("navindex",
+ new EndElementHandler(this,&LayoutParser::endNavIndex));
+
+ // class layout handlers
+ m_sHandler.insert("class",
+ new StartElementHandler(this,&LayoutParser::startClass));
+ m_sHandler.insert("class/briefdescription",
+ new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("class/detaileddescription",
+ new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+ theTranslator->trDetailedDescription()));
+ m_sHandler.insert("class/authorsection",
+ new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("class/includes",
+ new StartElementHandlerKind(this,LayoutDocEntry::ClassIncludes,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("class/inheritancegraph",
+ new StartElementHandlerKind(this,LayoutDocEntry::ClassInheritanceGraph,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("class/collaborationgraph",
+ new StartElementHandlerKind(this,LayoutDocEntry::ClassCollaborationGraph,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("class/allmemberslink",
+ new StartElementHandlerKind(this,LayoutDocEntry::ClassAllMembersLink,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("class/usedfiles",
+ new StartElementHandlerKind(this,LayoutDocEntry::ClassUsedFiles,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("class/memberdecl",
+ new StartElementHandler(this,&LayoutParser::startMemberDecl));
+ m_sHandler.insert("class/memberdecl/membergroups",
+ new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("class/memberdecl/nestedclasses",
+ new StartElementHandlerSection(this,LayoutDocEntry::ClassNestedClasses,&LayoutParser::startSectionEntry,
+ vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
+ fortranOpt ? theTranslator->trDataTypes() :
+ theTranslator->trCompounds()
+ ));
+ m_sHandler.insert("class/memberdecl/publictypes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pubTypes,theTranslator->trPublicTypes()));
+ m_sHandler.insert("class/memberdecl/publicslots",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pubSlots,theTranslator->trPublicSlots()));
+ m_sHandler.insert("class/memberdecl/signals",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::signals,theTranslator->trSignals()));
+ m_sHandler.insert("class/memberdecl/publicmethods",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pubMethods,theTranslator->trPublicMembers()));
+ m_sHandler.insert("class/memberdecl/publicstaticmethods",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pubStaticMethods,theTranslator->trStaticPublicMembers()));
+ m_sHandler.insert("class/memberdecl/publicattributes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pubAttribs,theTranslator->trPublicAttribs()));
+ m_sHandler.insert("class/memberdecl/publicstaticattributes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pubStaticAttribs,theTranslator->trStaticPublicAttribs()));
+ m_sHandler.insert("class/memberdecl/protectedtypes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::proTypes,theTranslator->trProtectedTypes()));
+ m_sHandler.insert("class/memberdecl/protectedslots",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::proSlots,theTranslator->trProtectedSlots()));
+ m_sHandler.insert("class/memberdecl/protectedmethods",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::proMethods,theTranslator->trProtectedMembers()));
+ m_sHandler.insert("class/memberdecl/protectedstaticmethods",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::proStaticMethods,theTranslator->trStaticProtectedMembers()));
+ m_sHandler.insert("class/memberdecl/protectedattributes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::proAttribs,theTranslator->trProtectedAttribs()));
+ m_sHandler.insert("class/memberdecl/protectedstaticattributes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::proStaticAttribs,theTranslator->trStaticProtectedAttribs()));
+ m_sHandler.insert("class/memberdecl/packagetypes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pacTypes,theTranslator->trPackageTypes()));
+ m_sHandler.insert("class/memberdecl/packagemethods",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pacMethods,theTranslator->trPackageMembers()));
+ m_sHandler.insert("class/memberdecl/packagestaticmethods",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pacStaticMethods,theTranslator->trStaticPackageMembers()));
+ m_sHandler.insert("class/memberdecl/packageattributes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pacAttribs,theTranslator->trPackageAttribs()));
+ m_sHandler.insert("class/memberdecl/packagestaticattributes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::pacStaticAttribs,theTranslator->trStaticPackageAttribs()));
+ m_sHandler.insert("class/memberdecl/properties",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::properties,theTranslator->trProperties()));
+ m_sHandler.insert("class/memberdecl/events",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::events,theTranslator->trEvents()));
+ m_sHandler.insert("class/memberdecl/privatetypes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::priTypes,theTranslator->trPrivateTypes()));
+ m_sHandler.insert("class/memberdecl/privateslots",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::priSlots,theTranslator->trPrivateSlots()));
+ m_sHandler.insert("class/memberdecl/privatemethods",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::priMethods,theTranslator->trPrivateMembers()));
+ m_sHandler.insert("class/memberdecl/privatestaticmethods",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::priStaticMethods,theTranslator->trStaticPrivateMembers()));
+ m_sHandler.insert("class/memberdecl/privateattributes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::priAttribs,theTranslator->trPrivateAttribs()));
+ m_sHandler.insert("class/memberdecl/privatestaticattributes",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::priStaticAttribs,theTranslator->trStaticPrivateAttribs()));
+ m_sHandler.insert("class/memberdecl/friends",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::friends,theTranslator->trFriends()));
+ m_sHandler.insert("class/memberdecl/related",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::related,theTranslator->trRelatedFunctions(),
+ theTranslator->trRelatedSubscript()));
+ m_eHandler.insert("class/memberdecl",
+ new EndElementHandler(this,&LayoutParser::endMemberDecl));
+ m_sHandler.insert("class/memberdef",
+ new StartElementHandler(this,&LayoutParser::startMemberDef));
+ m_sHandler.insert("class/memberdef/typedefs",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::typedefMembers,theTranslator->trMemberTypedefDocumentation()));
+ m_sHandler.insert("class/memberdef/enums",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::enumMembers,theTranslator->trMemberEnumerationDocumentation()));
+ m_sHandler.insert("class/memberdef/constructors",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::constructors,theTranslator->trConstructorDocumentation()));
+ m_sHandler.insert("class/memberdef/functions",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::functionMembers,
+ fortranOpt ?
+ theTranslator->trMemberFunctionDocumentationFortran() :
+ theTranslator->trMemberFunctionDocumentation()));
+ m_sHandler.insert("class/memberdef/related",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::relatedMembers,theTranslator->trRelatedFunctionDocumentation()));
+ m_sHandler.insert("class/memberdef/variables",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::variableMembers,theTranslator->trMemberDataDocumentation()));
+ m_sHandler.insert("class/memberdef/properties",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::propertyMembers,theTranslator->trPropertyDocumentation()));
+ m_sHandler.insert("class/memberdef/events",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::eventMembers,theTranslator->trEventDocumentation()));
+ m_eHandler.insert("class/memberdef",
+ new EndElementHandler(this,&LayoutParser::endMemberDef));
+ m_eHandler.insert("class",
+ new EndElementHandler(this,&LayoutParser::endClass));
+
+
+ // namespace layout handlers
+ m_sHandler.insert("namespace",
+ new StartElementHandler(this,&LayoutParser::startNamespace));
+ m_sHandler.insert("namespace/briefdescription",
+ new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("namespace/detaileddescription",
+ new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+ theTranslator->trDetailedDescription()));
+ m_sHandler.insert("namespace/authorsection",
+ new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("namespace/memberdecl",
+ new StartElementHandler(this,&LayoutParser::startMemberDecl));
+ m_sHandler.insert("namespace/memberdecl/nestednamespaces",
+ new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedNamespaces,&LayoutParser::startSectionEntry,
+ javaOpt ? theTranslator->trPackages() :
+ fortranOpt ? theTranslator->trModules() :
+ theTranslator->trNamespaces()
+ ));
+ m_sHandler.insert("namespace/memberdecl/classes",
+ new StartElementHandlerSection(this,LayoutDocEntry::NamespaceClasses,&LayoutParser::startSectionEntry,
+ vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
+ fortranOpt ? theTranslator->trDataTypes() :
+ theTranslator->trCompounds()
+ ));
+ m_sHandler.insert("namespace/memberdecl/membergroups",
+ new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("namespace/memberdecl/typedefs",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decTypedefMembers,theTranslator->trTypedefs()));
+ m_sHandler.insert("namespace/memberdecl/enums",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decEnumMembers,theTranslator->trEnumerations()));
+ m_sHandler.insert("namespace/memberdecl/functions",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decFuncMembers,
+ fortranOpt ? theTranslator->trSubprograms() :
+ vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
+ theTranslator->trFunctions()));
+ m_sHandler.insert("namespace/memberdecl/variables",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decVarMembers,theTranslator->trVariables()));
+ m_eHandler.insert("namespace/memberdecl",
+ new EndElementHandler(this,&LayoutParser::endMemberDecl));
+ m_sHandler.insert("namespace/memberdef",
+ new StartElementHandler(this,&LayoutParser::startMemberDef));
+ m_sHandler.insert("namespace/memberdef/typedefs",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
+ m_sHandler.insert("namespace/memberdef/enums",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
+ m_sHandler.insert("namespace/memberdef/functions",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docFuncMembers,
+ fortranOpt ?
+ theTranslator->trSubprogramDocumentation() :
+ theTranslator->trFunctionDocumentation()));
+ m_sHandler.insert("namespace/memberdef/variables",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
+ m_eHandler.insert("namespace/memberdef",
+ new EndElementHandler(this,&LayoutParser::endMemberDef));
+ m_eHandler.insert("namespace",
+ new EndElementHandler(this,&LayoutParser::endNamespace));
+
+ // file layout handlers
+ m_sHandler.insert("file",
+ new StartElementHandler(this,&LayoutParser::startFile));
+ m_sHandler.insert("file/briefdescription",
+ new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("file/detaileddescription",
+ new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+ theTranslator->trDetailedDescription()));
+ m_sHandler.insert("file/authorsection",
+ new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("file/includes",
+ new StartElementHandlerKind(this,LayoutDocEntry::FileIncludes,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("file/includegraph",
+ new StartElementHandlerKind(this,LayoutDocEntry::FileIncludeGraph,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("file/includedbygraph",
+ new StartElementHandlerKind(this,LayoutDocEntry::FileIncludedByGraph,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("file/sourcelink",
+ new StartElementHandlerKind(this,LayoutDocEntry::FileSourceLink,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("file/memberdecl/membergroups",
+ new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("file/memberdecl",
+ new StartElementHandler(this,&LayoutParser::startMemberDecl));
+ m_sHandler.insert("file/memberdecl/classes",
+ new StartElementHandlerSection(this,LayoutDocEntry::FileClasses,&LayoutParser::startSectionEntry,
+ vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
+ fortranOpt ? theTranslator->trDataTypes() :
+ theTranslator->trCompounds()
+ ));
+ m_sHandler.insert("file/memberdecl/namespaces",
+ new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry,
+ javaOpt ? theTranslator->trPackages() :
+ fortranOpt ? theTranslator->trModules() :
+ theTranslator->trNamespaces()
+ ));
+ m_sHandler.insert("file/memberdecl/defines",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decDefineMembers,theTranslator->trDefines()));
+ m_sHandler.insert("file/memberdecl/typedefs",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decTypedefMembers,theTranslator->trTypedefs()));
+ m_sHandler.insert("file/memberdecl/enums",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decEnumMembers,theTranslator->trEnumerations()));
+ m_sHandler.insert("file/memberdecl/functions",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decFuncMembers,
+ fortranOpt ? theTranslator->trSubprograms() :
+ vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
+ theTranslator->trFunctions())) ;
+ m_sHandler.insert("file/memberdecl/variables",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decVarMembers,theTranslator->trVariables()));
+
+ m_eHandler.insert("file/memberdecl",
+ new EndElementHandler(this,&LayoutParser::endMemberDecl));
+ m_sHandler.insert("file/memberdef",
+ new StartElementHandler(this,&LayoutParser::startMemberDef));
+ m_sHandler.insert("file/memberdef/defines",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docDefineMembers,theTranslator->trDefineDocumentation()));
+ m_sHandler.insert("file/memberdef/typedefs",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
+ m_sHandler.insert("file/memberdef/enums",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
+ m_sHandler.insert("file/memberdef/functions",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docFuncMembers,theTranslator->trFunctionDocumentation()));
+ m_sHandler.insert("file/memberdef/variables",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
+ m_eHandler.insert("file/memberdef",
+ new EndElementHandler(this,&LayoutParser::endMemberDef));
+ m_eHandler.insert("file",
+ new EndElementHandler(this,&LayoutParser::endFile));
+
+ // group layout handlers
+ m_sHandler.insert("group",
+ new StartElementHandler(this,&LayoutParser::startGroup));
+ m_sHandler.insert("group/briefdescription",
+ new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("group/detaileddescription",
+ new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+ theTranslator->trDetailedDescription()));
+ m_sHandler.insert("group/authorsection",
+ new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("group/groupgraph",
+ new StartElementHandlerKind(this,LayoutDocEntry::GroupGraph,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("group/memberdecl/membergroups",
+ new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("group/memberdecl",
+ new StartElementHandler(this,&LayoutParser::startMemberDecl));
+ m_sHandler.insert("group/memberdecl/classes",
+ new StartElementHandlerSection(this,LayoutDocEntry::GroupClasses,&LayoutParser::startSectionEntry,
+ vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
+ fortranOpt ? theTranslator->trDataTypes() :
+ theTranslator->trCompounds()
+ ));
+ m_sHandler.insert("group/memberdecl/namespaces",
+ new StartElementHandlerSection(this,LayoutDocEntry::GroupNamespaces,&LayoutParser::startSectionEntry,
+ javaOpt ? theTranslator->trPackages() :
+ fortranOpt ? theTranslator->trModules() :
+ theTranslator->trNamespaces()
+ ));
+ m_sHandler.insert("group/memberdecl/dirs",
+ new StartElementHandlerSection(this,LayoutDocEntry::GroupDirs,&LayoutParser::startSectionEntry,
+ theTranslator->trDirectories()
+ ));
+ m_sHandler.insert("group/memberdecl/nestedgroups",
+ new StartElementHandlerSection(this,LayoutDocEntry::GroupNestedGroups,&LayoutParser::startSectionEntry,
+ theTranslator->trModules()
+ ));
+ m_sHandler.insert("group/memberdecl/files",
+ new StartElementHandlerSection(this,LayoutDocEntry::GroupFiles,&LayoutParser::startSectionEntry,
+ theTranslator->trFile(TRUE,FALSE)
+ ));
+
+ m_sHandler.insert("group/memberdecl/defines",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decDefineMembers,theTranslator->trDefines()));
+ m_sHandler.insert("group/memberdecl/typedefs",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decTypedefMembers,theTranslator->trTypedefs()));
+ m_sHandler.insert("group/memberdecl/enums",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decEnumMembers,theTranslator->trEnumerations()));
+ m_sHandler.insert("group/memberdecl/enumvalues",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decEnumValMembers,theTranslator->trEnumerationValues()));
+ m_sHandler.insert("group/memberdecl/functions",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decFuncMembers,
+ fortranOpt ? theTranslator->trSubprograms() :
+ vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
+ theTranslator->trFunctions()));
+ m_sHandler.insert("group/memberdecl/variables",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decVarMembers,theTranslator->trVariables()));
+ m_sHandler.insert("group/memberdecl/signals",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decSignalMembers,theTranslator->trSignals()));
+ m_sHandler.insert("group/memberdecl/publicslots",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decPubSlotMembers,theTranslator->trPublicSlots()));
+ m_sHandler.insert("group/memberdecl/protectedslots",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decProSlotMembers,theTranslator->trProtectedSlots()));
+ m_sHandler.insert("group/memberdecl/privateslots",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decPriSlotMembers,theTranslator->trPrivateSlots()));
+ m_sHandler.insert("group/memberdecl/events",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decEventMembers,theTranslator->trEvents()));
+ m_sHandler.insert("group/memberdecl/properties",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decPropMembers,theTranslator->trProperties()));
+ m_sHandler.insert("group/memberdecl/friends",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberList::decFriendMembers,theTranslator->trFriends()));
+ m_eHandler.insert("group/memberdecl",
+ new EndElementHandler(this,&LayoutParser::endMemberDecl));
+ m_sHandler.insert("group/memberdef",
+ new StartElementHandler(this,&LayoutParser::startMemberDef));
+ m_sHandler.insert("group/memberdef/pagedocs",
+ new StartElementHandlerKind(this,LayoutDocEntry::GroupPageDocs,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("group/memberdef/inlineclasses",
+ new StartElementHandlerSection(this,LayoutDocEntry::GroupInlineClasses,&LayoutParser::startSectionEntry,
+ fortranOpt ? theTranslator->trTypeDocumentation() :
+ theTranslator->trClassDocumentation()
+ ));
+ m_sHandler.insert("group/memberdef/defines",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docDefineMembers,theTranslator->trDefineDocumentation()));
+ m_sHandler.insert("group/memberdef/typedefs",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
+ m_sHandler.insert("group/memberdef/enums",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
+ m_sHandler.insert("group/memberdef/enumvalues",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docEnumValMembers,theTranslator->trEnumerationValueDocumentation()));
+ m_sHandler.insert("group/memberdef/functions",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docFuncMembers,
+ fortranOpt?
+ theTranslator->trSubprogramDocumentation():
+ theTranslator->trFunctionDocumentation()));
+ m_sHandler.insert("group/memberdef/variables",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
+ m_sHandler.insert("group/memberdef/signals",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docSignalMembers,theTranslator->trSignals()));
+ m_sHandler.insert("group/memberdef/publicslots",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docPubSlotMembers,theTranslator->trPublicSlots()));
+ m_sHandler.insert("group/memberdef/protectedslots",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docProSlotMembers,theTranslator->trProtectedSlots()));
+ m_sHandler.insert("group/memberdef/privateslots",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docPriSlotMembers,theTranslator->trPrivateSlots()));
+ m_sHandler.insert("group/memberdef/events",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docEventMembers,theTranslator->trEvents()));
+ m_sHandler.insert("group/memberdef/properties",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docPropMembers,theTranslator->trProperties()));
+ m_sHandler.insert("group/memberdef/friends",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberList::docFriendMembers,theTranslator->trFriends()));
+ m_eHandler.insert("group/memberdef",
+ new EndElementHandler(this,&LayoutParser::endMemberDef));
+ m_eHandler.insert("group",
+ new EndElementHandler(this,&LayoutParser::endGroup));
+
+ // directory layout handlers
+ m_sHandler.insert("directory",
+ new StartElementHandler(this,&LayoutParser::startDirectory));
+ m_sHandler.insert("directory/briefdescription",
+ new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("directory/detaileddescription",
+ new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+ theTranslator->trDetailedDescription()));
+ m_sHandler.insert("directory/directorygraph",
+ new StartElementHandlerKind(this,LayoutDocEntry::DirGraph,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("directory/memberdecl",
+ new StartElementHandler(this,&LayoutParser::startMemberDecl));
+ m_sHandler.insert("directory/memberdecl/dirs",
+ new StartElementHandlerKind(this,LayoutDocEntry::DirSubDirs,&LayoutParser::startSimpleEntry));
+ m_sHandler.insert("directory/memberdecl/files",
+ new StartElementHandlerKind(this,LayoutDocEntry::DirFiles,&LayoutParser::startSimpleEntry));
+ m_eHandler.insert("directory/memberdecl",
+ new EndElementHandler(this,&LayoutParser::endMemberDecl));
+ m_eHandler.insert("directory",
+ new EndElementHandler(this,&LayoutParser::endDirectory));
+ }
+
+ void startSimpleEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib)
+ {
+ bool isVisible = elemIsVisible(attrib);
+ if (m_part!=-1 && isVisible)
+ {
+ LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+ new LayoutDocEntrySimple(k));
+ }
+ }
+
+ void startSectionEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib,
+ const QCString &title)
+ {
+ bool isVisible = elemIsVisible(attrib);
+ QCString userTitle = convertToQCString(attrib.value("title"));
+ //printf("startSectionEntry: title='%s' userTitle='%s'\n",
+ // title.data(),userTitle.data());
+ if (userTitle.isEmpty()) userTitle = title;
+ if (m_part!=-1 && isVisible)
+ {
+ LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+ new LayoutDocEntrySection(k,userTitle));
+ }
+ }
+
+
+ void startMemberDeclEntry(const QXmlAttributes &attrib,MemberList::ListType type,
+ const QCString &title,const QCString &subscript)
+ {
+ //QCString visible = convertToQCString(attrib.value("visible"));
+ //bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0");
+ QCString userTitle = convertToQCString(attrib.value("title"));
+ QCString userSubscript = convertToQCString(attrib.value("subtitle"));
+ if (userTitle.isEmpty()) userTitle = title;
+ if (userSubscript.isEmpty()) userSubscript = subscript;
+ //printf("memberdecl: %s\n",userTitle.data());
+ if (m_part!=-1 /*&& isVisible*/)
+ {
+ LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+ new LayoutDocEntryMemberDecl(type,userTitle,userSubscript));
+ }
+ }
+
+ void startMemberDefEntry(const QXmlAttributes &attrib,MemberList::ListType type,
+ const QCString &title,const QCString &)
+ {
+ QCString userTitle = convertToQCString(attrib.value("title"));
+ if (userTitle.isEmpty()) userTitle = title;
+ //printf("memberdef: %s\n",userTitle.data());
+ if (m_part!=-1 /*&& isVisible*/)
+ {
+ LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+ new LayoutDocEntryMemberDef(type,userTitle));
+ }
+ }
+
+ void startLayout(const QXmlAttributes &)
+ {
+ }
+
+ void endLayout()
+ {
+ }
+
+ void startNavIndex(const QXmlAttributes &)
+ {
+ m_scope="navindex/";
+ m_rootNav = LayoutDocManager::instance().rootNavEntry();
+ m_rootNav->clear();
+ }
+
+ void endNavIndex()
+ {
+ m_scope="";
+ if (!m_rootNav->find(LayoutNavEntry::MainPage))
+ {
+ // no MainPage node... add one the first item of the root node...
+ new LayoutNavEntry(m_rootNav,LayoutNavEntry::MainPage, TRUE,
+ /*Config_getBool("GENERATE_TREEVIEW") ? "main" :*/ "index",
+ theTranslator->trMainPage(),TRUE);
+ }
+ }
+
+ void startNavEntry(const QXmlAttributes &attrib)
+ {
+ static bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ static bool hasGraphicalHierarchy = Config_getBool("HAVE_DOT") &&
+ Config_getBool("GRAPHICAL_HIERARCHY");
+ static bool extractAll = Config_getBool("EXTRACT_ALL");
+ static struct NavEntryMap
+ {
+ const char *typeStr; // type attribute name in the XML file
+ LayoutNavEntry::Kind kind; // corresponding enum name
+ QCString mainName; // default title for an item if it has children
+ QCString subName; // optional name for an item if it is rendered as a child
+ QCString intro; // introduction text to be put on the index page
+ QCString baseFile; // base name of the file containing the index page
+ } mapping[] =
+ {
+ { "mainpage",
+ LayoutNavEntry::MainPage,
+ theTranslator->trMainPage(),
+ QCString(),
+ QCString(),
+ "index"
+ },
+ { "pages",
+ LayoutNavEntry::Pages,
+ theTranslator->trRelatedPages(),
+ QCString(),
+ theTranslator->trRelatedPagesDescription(),
+ "pages"
+ },
+ { "modules",
+ LayoutNavEntry::Modules,
+ theTranslator->trModules(),
+ QCString(),
+ theTranslator->trModulesDescription(),
+ "modules"
+ },
+ { "namespaces",
+ LayoutNavEntry::Namespaces,
+ javaOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModules() : theTranslator->trNamespaces(),
+ javaOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(),
+ javaOpt ? theTranslator->trPackageListDescription() : fortranOpt ? theTranslator->trModulesListDescription(extractAll) : theTranslator->trNamespaceListDescription(extractAll),
+ "namespaces"
+ },
+ { "namespacemembers",
+ LayoutNavEntry::NamespaceMembers,
+ javaOpt ? theTranslator->trPackageMembers() : fortranOpt ? theTranslator->trModulesMembers() : theTranslator->trNamespaceMembers(),
+ QCString(),
+ fortranOpt ? theTranslator->trModulesMemberDescription(extractAll) : theTranslator->trNamespaceMemberDescription(extractAll),
+ "namespacemembers"
+ },
+ { "classindex",
+ LayoutNavEntry::Classes,
+ fortranOpt ? theTranslator->trDataTypes() : vhdlOpt ? VhdlDocGen::trDesignUnits() : theTranslator->trCompoundIndex(),
+ QCString(),
+ QCString(),
+ "classes"
+ },
+ { "classes",
+ LayoutNavEntry::ClassAnnotated,
+ fortranOpt ? theTranslator->trCompoundListFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitList() : theTranslator->trClasses(),
+ theTranslator->trCompoundList(),
+ fortranOpt ? theTranslator->trCompoundListDescriptionFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitListDescription() : theTranslator->trCompoundListDescription(),
+ "annotated"
+ },
+ { "hierarchy",
+ LayoutNavEntry::ClassHierarchy,
+ vhdlOpt ? VhdlDocGen::trDesignUnitHierarchy() : theTranslator->trClassHierarchy(),
+ QCString(),
+ theTranslator->trClassHierarchyDescription(),
+ hasGraphicalHierarchy ? "inherits" : "hierarchy"
+ },
+ { "classmembers",
+ LayoutNavEntry::ClassMembers,
+ fortranOpt ? theTranslator->trCompoundMembersFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitMembers() : theTranslator->trCompoundMembers(),
+ QCString(),
+ fortranOpt ? theTranslator->trCompoundMembersDescriptionFortran(extractAll) : theTranslator->trCompoundMembersDescription(extractAll),
+ "functions"
+ },
+ { "files",
+ LayoutNavEntry::Files,
+ theTranslator->trFile(TRUE,FALSE),
+ theTranslator->trFileList(),
+ theTranslator->trFileListDescription(extractAll),
+ "files"
+ },
+ { "globals",
+ LayoutNavEntry::FileGlobals,
+ theTranslator->trFileMembers(),
+ QCString(),
+ theTranslator->trFileMembersDescription(extractAll),
+ "globals"
+ },
+ { "dirs",
+ LayoutNavEntry::Dirs,
+ theTranslator->trDirectories(),
+ QCString(),
+ theTranslator->trDirDescription(),
+ "dirs"
+ },
+ { "examples",
+ LayoutNavEntry::Examples,
+ theTranslator->trExamples(),
+ QCString(),
+ theTranslator->trExamplesDescription(),
+ "examples"
+ },
+ { 0, // end of list
+ (LayoutNavEntry::Kind)0,
+ QCString(),
+ QCString(),
+ QCString(),
+ QCString()
+ }
+ };
+ LayoutNavEntry::Kind kind;
+ // find type in the table
+ int i=0;
+ QString type = attrib.value("type");
+ while (mapping[i].typeStr)
+ {
+ if (mapping[i].typeStr==type)
+ {
+ kind = mapping[i].kind;
+ break;
+ }
+ i++;
+ }
+ if (mapping[i].typeStr==0)
+ {
+ if (type.isEmpty())
+ {
+ err("error: an entry tag within a navindex has no type attribute! Check your layout file!\n");
+ }
+ else
+ {
+ err("error: the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n");
+ }
+ return;
+ }
+ QCString baseFile = mapping[i].baseFile;
+ QCString title = convertToQCString(attrib.value("title"));
+ bool isVisible = elemIsVisible(attrib);
+ if (title.isEmpty()) // use default title
+ {
+ title = mapping[i].mainName; // use title for main row
+ if (m_rootNav!=LayoutDocManager::instance().rootNavEntry() && !mapping[i].subName.isEmpty())
+ {
+ title = mapping[i].subName; // if this is a child of another row, use the subName if available
+ // this is mainly done to get compatible naming with older versions.
+ }
+ }
+ QCString intro = convertToQCString(attrib.value("intro"));
+ if (intro.isEmpty()) // use default intro text
+ {
+ intro = mapping[i].intro;
+ }
+ // create new item and make it the new root
+ m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title,intro);
+ }
+
+ void endNavEntry()
+ {
+ // set the root back to the parent
+ m_rootNav = m_rootNav->parent();
+ }
+
+ void startClass(const QXmlAttributes &)
+ {
+ LayoutDocManager::instance().clear(LayoutDocManager::Class);
+ m_scope="class/";
+ m_part = (int)LayoutDocManager::Class;
+ }
+
+ void endClass()
+ {
+ m_scope="";
+ m_part = -1;
+ }
+
+ void startNamespace(const QXmlAttributes &)
+ {
+ LayoutDocManager::instance().clear(LayoutDocManager::Namespace);
+ m_scope="namespace/";
+ m_part = (int)LayoutDocManager::Namespace;
+ }
+
+ void endNamespace()
+ {
+ m_scope="";
+ m_part = -1;
+ }
+
+ void startFile(const QXmlAttributes &)
+ {
+ LayoutDocManager::instance().clear(LayoutDocManager::File);
+ m_scope="file/";
+ m_part = (int)LayoutDocManager::File;
+ }
+
+ void endFile()
+ {
+ m_scope="";
+ m_part = -1;
+ }
+
+ void startGroup(const QXmlAttributes &)
+ {
+ LayoutDocManager::instance().clear(LayoutDocManager::Group);
+ m_scope="group/";
+ m_part = (int)LayoutDocManager::Group;
+ }
+
+ void endGroup()
+ {
+ m_scope="";
+ m_part = -1;
+ }
+
+ void startDirectory(const QXmlAttributes &)
+ {
+ LayoutDocManager::instance().clear(LayoutDocManager::Directory);
+ m_scope="directory/";
+ m_part = (int)LayoutDocManager::Directory;
+ }
+
+ void endDirectory()
+ {
+ m_scope="";
+ m_part = -1;
+ }
+
+ void startMemberDef(const QXmlAttributes &)
+ {
+ m_scope+="memberdef/";
+ if (m_part!=-1)
+ {
+ LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+ new LayoutDocEntrySimple(LayoutDocEntry::MemberDefStart));
+ }
+ }
+
+ void endMemberDef()
+ {
+ int i=m_scope.findRev("memberdef/");
+ if (i!=-1)
+ {
+ m_scope=m_scope.left(i);
+ if (m_part!=-1)
+ {
+ LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+ new LayoutDocEntrySimple(LayoutDocEntry::MemberDefEnd));
+ }
+ }
+ }
+
+ void startMemberDecl(const QXmlAttributes &)
+ {
+ m_scope+="memberdecl/";
+ if (m_part!=-1)
+ {
+ LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+ new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclStart));
+ }
+ }
+
+ void endMemberDecl()
+ {
+ int i=m_scope.findRev("memberdecl/");
+ if (i!=-1)
+ {
+ m_scope=m_scope.left(i);
+ if (m_part!=-1)
+ {
+ LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+ new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclEnd));
+ }
+ }
+ }
+
+ // reimplemented from QXmlDefaultHandler
+ bool startElement( const QString&, const QString&,
+ const QString& name, const QXmlAttributes& attrib )
+ {
+ //printf("startElement [%s]::[%s]\n",m_scope.data(),name.data());
+ StartElementHandler *handler = m_sHandler[m_scope+name];
+ if (handler)
+ {
+ (*handler)(attrib);
+ }
+ else
+ {
+ err("error: Unexpected start tag `%s' found in scope='%s'!\n",
+ name.data(),m_scope.data());
+ }
+ return TRUE;
+ }
+ bool endElement( const QString&, const QString&, const QString& name )
+ {
+ //printf("endElement [%s]::[%s]\n",m_scope.data(),name.data());
+ EndElementHandler *handler;
+ if (!m_scope.isEmpty() && m_scope.right(name.length()+1)==name+"/")
+ { // element ends current scope
+ handler = m_eHandler[m_scope.left(m_scope.length()-1)];
+ }
+ else // continue with current scope
+ {
+ handler = m_eHandler[m_scope+name];
+ }
+ if (handler)
+ {
+ (*handler)();
+ }
+ return TRUE;
+ }
+ bool startDocument()
+ {
+ return TRUE;
+ }
+
+ private:
+ LayoutParser() : m_sHandler(163), m_eHandler(17) { }
+
+ QDict<StartElementHandler> m_sHandler;
+ QDict<EndElementHandler> m_eHandler;
+ QString m_scope;
+ int m_part;
+ LayoutNavEntry *m_rootNav;
+};
+
+//---------------------------------------------------------------------------------
+
+class LayoutErrorHandler : public QXmlErrorHandler
+{
+ public:
+ bool warning( const QXmlParseException &exception )
+ {
+ err("error: at line %d column %d: %s\n",
+ exception.lineNumber(),exception.columnNumber(),
+ exception.message().data());
+ return FALSE;
+ }
+ bool error( const QXmlParseException &exception )
+ {
+ err("error: at line %d column %d: %s\n",
+ exception.lineNumber(),exception.columnNumber(),
+ exception.message().data());
+ return FALSE;
+ }
+ bool fatalError( const QXmlParseException &exception )
+ {
+ err("error: at line %d column %d: %s\n",
+ exception.lineNumber(),exception.columnNumber(),
+ exception.message().data());
+ return FALSE;
+ }
+ QString errorString() { return ""; }
+
+ private:
+ QString errorMsg;
+};
+
+//---------------------------------------------------------------------------------
+
+class LayoutDocManager::Private
+{
+ public:
+ QList<LayoutDocEntry> docEntries[LayoutDocManager::NrParts];
+ LayoutNavEntry *rootNav;
+};
+
+LayoutDocManager::LayoutDocManager()
+{
+ d = new Private;
+ int i;
+ for (i=0;i<LayoutDocManager::NrParts;i++)
+ {
+ d->docEntries[i].setAutoDelete(TRUE);
+ }
+ d->rootNav = new LayoutNavEntry;
+ LayoutParser::instance().init();
+}
+
+
+void LayoutDocManager::init()
+{
+ // parse the default layout
+ LayoutErrorHandler errorHandler;
+ QXmlInputSource source;
+ source.setData( layout_default );
+ QXmlSimpleReader reader;
+ reader.setContentHandler( &LayoutParser::instance() );
+ reader.setErrorHandler( &errorHandler );
+ reader.parse( source );
+}
+
+LayoutDocManager::~LayoutDocManager()
+{
+ delete d->rootNav;
+ delete d;
+}
+
+LayoutDocManager & LayoutDocManager::instance()
+{
+ static LayoutDocManager *theInstance = new LayoutDocManager;
+ return *theInstance;
+}
+
+const QList<LayoutDocEntry> &LayoutDocManager::docEntries(LayoutDocManager::LayoutPart part) const
+{
+ return d->docEntries[(int)part];
+}
+
+LayoutNavEntry* LayoutDocManager::rootNavEntry() const
+{
+ return d->rootNav;
+}
+
+void LayoutDocManager::addEntry(LayoutDocManager::LayoutPart p,LayoutDocEntry *e)
+{
+ d->docEntries[(int)p].append(e);
+}
+
+void LayoutDocManager::clear(LayoutDocManager::LayoutPart p)
+{
+ d->docEntries[(int)p].clear();
+}
+
+void LayoutDocManager::parse(QTextStream &t)
+{
+ LayoutErrorHandler errorHandler;
+ QXmlInputSource source( t );
+ QXmlSimpleReader reader;
+ reader.setContentHandler( &LayoutParser::instance() );
+ reader.setErrorHandler( &errorHandler );
+ reader.parse( source );
+}
+
+//---------------------------------------------------------------------------------
+
+void writeDefaultLayoutFile(const char *fileName)
+{
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Failed to open file %s for writing!\n",fileName);
+ return;
+ }
+ QTextStream t(&f);
+ t << layout_default;
+}
diff --git a/src/layout.h b/src/layout.h
new file mode 100644
index 0000000..dc3e92d
--- /dev/null
+++ b/src/layout.h
@@ -0,0 +1,190 @@
+/******************************************************************************
+ *
+ * $Id: layout.h,v 1.2 2001/03/19 19:27:41 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef LAYOUT_H
+#define LAYOUT_H
+
+#include "qtbc.h"
+#include "memberlist.h"
+#include <qlist.h>
+
+class LayoutParser;
+
+/** @brief Base class representing a piece of a documentation page */
+struct LayoutDocEntry
+{
+ virtual ~LayoutDocEntry() {}
+ enum Kind {
+ // Generic items for all pages
+ MemberGroups,
+ MemberDeclStart, MemberDeclEnd, MemberDecl,
+ MemberDefStart, MemberDefEnd, MemberDef,
+ BriefDesc, DetailedDesc,
+ AuthorSection,
+
+ // Class specific items
+ ClassIncludes,
+ ClassInheritanceGraph, ClassNestedClasses,
+ ClassCollaborationGraph, ClassAllMembersLink,
+ ClassUsedFiles,
+
+ // Namespace specific items
+ NamespaceNestedNamespaces, NamespaceClasses,
+
+ // File specific items
+ FileClasses, FileNamespaces,
+ FileIncludes, FileIncludeGraph,
+ FileIncludedByGraph, FileSourceLink,
+
+ // Group specific items
+ GroupClasses, GroupInlineClasses, GroupNamespaces,
+ GroupDirs, GroupNestedGroups, GroupFiles,
+ GroupGraph, GroupPageDocs,
+
+ // Directory specific items
+ DirSubDirs, DirFiles, DirGraph
+
+ };
+ virtual Kind kind() const = 0;
+};
+
+/** @brief Represents of a piece of a documentation page without configurable parts */
+struct LayoutDocEntrySimple : LayoutDocEntry
+{
+ public:
+ LayoutDocEntrySimple(Kind k) : m_kind(k) {}
+ Kind kind() const { return m_kind; }
+ private:
+ Kind m_kind;
+};
+
+struct LayoutDocEntrySection: public LayoutDocEntrySimple
+{
+ LayoutDocEntrySection(Kind k,const QCString &tl) :
+ LayoutDocEntrySimple(k), title(tl) {}
+ QCString title;
+};
+
+/** @brief Represents of a member declaration list with configurable title and subtitle. */
+struct LayoutDocEntryMemberDecl: public LayoutDocEntry
+{
+ LayoutDocEntryMemberDecl(MemberList::ListType tp,
+ const QCString &tl,const QCString &ss)
+ : type(tp), title(tl),subscript(ss) {}
+
+ Kind kind() const { return MemberDecl; }
+ MemberList::ListType type;
+ QCString title;
+ QCString subscript;
+};
+
+/** @brief Represents of a member definition list with configurable title. */
+struct LayoutDocEntryMemberDef: public LayoutDocEntry
+{
+ LayoutDocEntryMemberDef(MemberList::ListType tp,const QCString &tl)
+ : type(tp), title(tl) {}
+
+ Kind kind() const { return MemberDef; }
+ MemberList::ListType type;
+ QCString title;
+};
+
+/** @brief Base class for the layout of a navigation item at the top of the HTML pages. */
+struct LayoutNavEntry
+{
+ public:
+ enum Kind {
+ MainPage,
+ Pages,
+ Modules,
+ Namespaces,
+ NamespaceMembers,
+ Classes,
+ ClassAnnotated,
+ ClassHierarchy,
+ ClassMembers,
+ Files,
+ FileGlobals,
+ Dirs,
+ Examples
+ };
+ LayoutNavEntry(LayoutNavEntry *parent,Kind k,bool vs,const QCString &bf,
+ const QCString &tl,const QCString &intro,bool prepend=FALSE)
+ : m_parent(parent), m_kind(k), m_visible(vs), m_baseFile(bf), m_title(tl), m_intro(intro)
+ { m_children.setAutoDelete(TRUE);
+ if (parent) { if (prepend) parent->prependChild(this); else parent->addChild(this); }
+ }
+ LayoutNavEntry *parent() const { return m_parent; }
+ Kind kind() const { return m_kind; }
+ QCString baseFile() const { return m_baseFile; }
+ QCString title() const { return m_title; }
+ QCString intro() const { return m_intro; }
+ bool visible() { return m_visible; }
+ void clear() { m_children.clear(); }
+ void addChild(LayoutNavEntry *e) { m_children.append(e); }
+ void prependChild(LayoutNavEntry *e) { m_children.prepend(e); }
+ const QList<LayoutNavEntry> &children() const { return m_children; }
+ LayoutNavEntry *find(LayoutNavEntry::Kind k) const;
+
+ private:
+ LayoutNavEntry() : m_parent(0) {}
+ LayoutNavEntry *m_parent;
+ Kind m_kind;
+ bool m_visible;
+ QCString m_baseFile;
+ QCString m_title;
+ QCString m_intro;
+ QList<LayoutNavEntry> m_children;
+ friend class LayoutDocManager;
+};
+
+/** @brief Singleton providing access to the (user configurable) layout of the documentation */
+class LayoutDocManager
+{
+ class Private;
+ public:
+ enum LayoutPart
+ {
+ Class, Namespace, File, Group, Directory,
+ NrParts
+ };
+ /** Returns a reference to this singleton. */
+ static LayoutDocManager &instance();
+
+ /** Returns the list of LayoutDocEntry's in representation order for a given page identified by @a part. */
+ const QList<LayoutDocEntry> &docEntries(LayoutPart part) const;
+
+ /** returns the (invisible) root of the navigation tree. */
+ LayoutNavEntry *rootNavEntry() const;
+
+ /** Parses a user provided layout */
+ void parse(QTextStream &t);
+ void init();
+ private:
+ void addEntry(LayoutPart p,LayoutDocEntry*e);
+ void clear(LayoutPart p);
+ LayoutDocManager();
+ ~LayoutDocManager();
+ Private *d;
+ friend class LayoutParser;
+};
+
+void writeDefaultLayoutFile(const char *fileName);
+
+#endif
+
diff --git a/src/layout_default.h b/src/layout_default.h
new file mode 100644
index 0000000..377ac52
--- /dev/null
+++ b/src/layout_default.h
@@ -0,0 +1,185 @@
+"<doxygenlayout version=\"1.0\">\n"
+" <!-- Navigation index tabs for HTML output -->\n"
+" <navindex>\n"
+" <tab type=\"mainpage\" visible=\"yes\" title=\"\"/>\n"
+" <tab type=\"pages\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" <tab type=\"modules\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" <tab type=\"namespaces\" visible=\"yes\" title=\"\">\n"
+" <tab type=\"namespaces\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" <tab type=\"namespacemembers\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" </tab>\n"
+" <tab type=\"classes\" visible=\"yes\" title=\"\">\n"
+" <tab type=\"classes\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" <tab type=\"classindex\" visible=\"$ALPHABETICAL_INDEX\" title=\"\"/> \n"
+" <tab type=\"hierarchy\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" <tab type=\"classmembers\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" </tab>\n"
+" <tab type=\"files\" visible=\"yes\" title=\"\">\n"
+" <tab type=\"files\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" <tab type=\"globals\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" </tab>\n"
+" <tab type=\"dirs\" visible=\"yes\" title=\"\" intro=\"\"/>\n"
+" <tab type=\"examples\" visible=\"yes\" title=\"\" intro=\"\"/> \n"
+" </navindex>\n"
+"\n"
+" <!-- Layout definition for a class page -->\n"
+" <class>\n"
+" <briefdescription visible=\"yes\"/>\n"
+" <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n"
+" <inheritancegraph visible=\"$CLASS_GRAPH\"/>\n"
+" <collaborationgraph visible=\"$COLLABORATION_GRAPH\"/>\n"
+" <allmemberslink visible=\"yes\"/>\n"
+" <memberdecl>\n"
+" <nestedclasses visible=\"yes\" title=\"\"/>\n"
+" <publictypes title=\"\"/>\n"
+" <publicslots title=\"\"/>\n"
+" <signals title=\"\"/>\n"
+" <publicmethods title=\"\"/>\n"
+" <publicstaticmethods title=\"\"/>\n"
+" <publicattributes title=\"\"/>\n"
+" <publicstaticattributes title=\"\"/>\n"
+" <protectedtypes title=\"\"/>\n"
+" <protectedslots title=\"\"/>\n"
+" <protectedmethods title=\"\"/>\n"
+" <protectedstaticmethods title=\"\"/>\n"
+" <protectedattributes title=\"\"/>\n"
+" <protectedstaticattributes title=\"\"/>\n"
+" <packagetypes title=\"\"/>\n"
+" <packagemethods title=\"\"/>\n"
+" <packagestaticmethods title=\"\"/>\n"
+" <packageattributes title=\"\"/>\n"
+" <packagestaticattributes title=\"\"/>\n"
+" <properties title=\"\"/>\n"
+" <events title=\"\"/>\n"
+" <privatetypes title=\"\"/>\n"
+" <privateslots title=\"\"/>\n"
+" <privatemethods title=\"\"/>\n"
+" <privatestaticmethods title=\"\"/>\n"
+" <privateattributes title=\"\"/>\n"
+" <privatestaticattributes title=\"\"/>\n"
+" <friends title=\"\"/>\n"
+" <related title=\"\" subtitle=\"\"/>\n"
+" <membergroups visible=\"yes\"/>\n"
+" </memberdecl>\n"
+" <detaileddescription title=\"\"/>\n"
+" <memberdef>\n"
+" <typedefs title=\"\"/>\n"
+" <enums title=\"\"/>\n"
+" <constructors title=\"\"/>\n"
+" <functions title=\"\"/>\n"
+" <related title=\"\"/>\n"
+" <variables title=\"\"/>\n"
+" <properties title=\"\"/>\n"
+" <events title=\"\"/>\n"
+" </memberdef>\n"
+" <usedfiles visible=\"$SHOW_USED_FILES\"/>\n"
+" <authorsection visible=\"yes\"/>\n"
+" </class>\n"
+"\n"
+" <!-- Layout definition for a namespace page -->\n"
+" <namespace>\n"
+" <briefdescription visible=\"yes\"/>\n"
+" <memberdecl>\n"
+" <nestednamespaces visible=\"yes\" title=\"\"/>\n"
+" <classes visible=\"yes\" title=\"\"/>\n"
+" <typedefs title=\"\"/>\n"
+" <enums title=\"\"/>\n"
+" <functions title=\"\"/>\n"
+" <variables title=\"\"/>\n"
+" <membergroups visible=\"yes\"/>\n"
+" </memberdecl>\n"
+" <detaileddescription title=\"\"/>\n"
+" <memberdef>\n"
+" <typedefs title=\"\"/>\n"
+" <enums title=\"\"/>\n"
+" <functions title=\"\"/>\n"
+" <variables title=\"\"/>\n"
+" </memberdef>\n"
+" <authorsection visible=\"yes\"/>\n"
+" </namespace>\n"
+"\n"
+" <!-- Layout definition for a file page -->\n"
+" <file>\n"
+" <briefdescription visible=\"yes\"/>\n"
+" <includes visible=\"$SHOW_INCLUDE_FILES\"/>\n"
+" <includegraph visible=\"$INCLUDE_GRAPH\"/>\n"
+" <includedbygraph visible=\"$INCLUDED_BY_GRAPH\"/>\n"
+" <sourcelink visible=\"yes\"/>\n"
+" <memberdecl>\n"
+" <classes visible=\"yes\" title=\"\"/>\n"
+" <namespaces visible=\"yes\" title=\"\"/>\n"
+" <defines title=\"\"/>\n"
+" <typedefs title=\"\"/>\n"
+" <enums title=\"\"/>\n"
+" <functions title=\"\"/>\n"
+" <variables title=\"\"/>\n"
+" <membergroups visible=\"yes\"/>\n"
+" </memberdecl>\n"
+" <detaileddescription title=\"\"/>\n"
+" <memberdef>\n"
+" <defines title=\"\"/>\n"
+" <typedefs title=\"\"/>\n"
+" <enums title=\"\"/>\n"
+" <functions title=\"\"/>\n"
+" <variables title=\"\"/>\n"
+" </memberdef>\n"
+" <authorsection/>\n"
+" </file>\n"
+"\n"
+" <!-- Layout definition for a group page -->\n"
+" <group>\n"
+" <briefdescription visible=\"yes\"/>\n"
+" <groupgraph visible=\"$GROUP_GRAPHS\"/>\n"
+" <memberdecl>\n"
+" <classes visible=\"yes\" title=\"\"/>\n"
+" <namespaces visible=\"yes\" title=\"\"/>\n"
+" <dirs visible=\"yes\" title=\"\"/>\n"
+" <nestedgroups visible=\"yes\" title=\"\"/>\n"
+" <files visible=\"yes\" title=\"\"/>\n"
+" <defines title=\"\"/>\n"
+" <typedefs title=\"\"/>\n"
+" <enums title=\"\"/>\n"
+" <enumvalues title=\"\"/>\n"
+" <functions title=\"\"/>\n"
+" <variables title=\"\"/>\n"
+" <signals title=\"\"/>\n"
+" <publicslots title=\"\"/>\n"
+" <protectedslots title=\"\"/>\n"
+" <privateslots title=\"\"/>\n"
+" <events title=\"\"/>\n"
+" <properties title=\"\"/>\n"
+" <friends title=\"\"/>\n"
+" <membergroups visible=\"yes\"/>\n"
+" </memberdecl>\n"
+" <detaileddescription title=\"\"/>\n"
+" <memberdef>\n"
+" <pagedocs/>\n"
+" <inlineclasses title=\"\"/>\n"
+" <defines title=\"\"/>\n"
+" <typedefs title=\"\"/>\n"
+" <enums title=\"\"/>\n"
+" <enumvalues title=\"\"/>\n"
+" <functions title=\"\"/>\n"
+" <variables title=\"\"/>\n"
+" <signals title=\"\"/>\n"
+" <publicslots title=\"\"/>\n"
+" <protectedslots title=\"\"/>\n"
+" <privateslots title=\"\"/>\n"
+" <events title=\"\"/>\n"
+" <properties title=\"\"/>\n"
+" <friends title=\"\"/>\n"
+" </memberdef>\n"
+" <authorsection visible=\"yes\"/>\n"
+" </group>\n"
+"\n"
+" <!-- Layout definition for a directory page -->\n"
+" <directory>\n"
+" <briefdescription visible=\"yes\"/>\n"
+" <directorygraph visible=\"yes\"/>\n"
+" <memberdecl>\n"
+" <dirs visible=\"yes\"/>\n"
+" <files visible=\"yes\"/>\n"
+" </memberdecl>\n"
+" <detaileddescription title=\"\"/>\n"
+" </directory>\n"
+"</doxygenlayout>\n"
diff --git a/src/layout_default.xml b/src/layout_default.xml
new file mode 100644
index 0000000..e8faa6d
--- /dev/null
+++ b/src/layout_default.xml
@@ -0,0 +1,185 @@
+<doxygenlayout version="1.0">
+ <!-- Navigation index tabs for HTML output -->
+ <navindex>
+ <tab type="mainpage" visible="yes" title=""/>
+ <tab type="pages" visible="yes" title="" intro=""/>
+ <tab type="modules" visible="yes" title="" intro=""/>
+ <tab type="namespaces" visible="yes" title="">
+ <tab type="namespaces" visible="yes" title="" intro=""/>
+ <tab type="namespacemembers" visible="yes" title="" intro=""/>
+ </tab>
+ <tab type="classes" visible="yes" title="">
+ <tab type="classes" visible="yes" title="" intro=""/>
+ <tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
+ <tab type="hierarchy" visible="yes" title="" intro=""/>
+ <tab type="classmembers" visible="yes" title="" intro=""/>
+ </tab>
+ <tab type="files" visible="yes" title="">
+ <tab type="files" visible="yes" title="" intro=""/>
+ <tab type="globals" visible="yes" title="" intro=""/>
+ </tab>
+ <tab type="dirs" visible="yes" title="" intro=""/>
+ <tab type="examples" visible="yes" title="" intro=""/>
+ </navindex>
+
+ <!-- Layout definition for a class page -->
+ <class>
+ <briefdescription visible="yes"/>
+ <includes visible="$SHOW_INCLUDE_FILES"/>
+ <inheritancegraph visible="$CLASS_GRAPH"/>
+ <collaborationgraph visible="$COLLABORATION_GRAPH"/>
+ <allmemberslink visible="yes"/>
+ <memberdecl>
+ <nestedclasses visible="yes" title=""/>
+ <publictypes title=""/>
+ <publicslots title=""/>
+ <signals title=""/>
+ <publicmethods title=""/>
+ <publicstaticmethods title=""/>
+ <publicattributes title=""/>
+ <publicstaticattributes title=""/>
+ <protectedtypes title=""/>
+ <protectedslots title=""/>
+ <protectedmethods title=""/>
+ <protectedstaticmethods title=""/>
+ <protectedattributes title=""/>
+ <protectedstaticattributes title=""/>
+ <packagetypes title=""/>
+ <packagemethods title=""/>
+ <packagestaticmethods title=""/>
+ <packageattributes title=""/>
+ <packagestaticattributes title=""/>
+ <properties title=""/>
+ <events title=""/>
+ <privatetypes title=""/>
+ <privateslots title=""/>
+ <privatemethods title=""/>
+ <privatestaticmethods title=""/>
+ <privateattributes title=""/>
+ <privatestaticattributes title=""/>
+ <friends title=""/>
+ <related title="" subtitle=""/>
+ <membergroups visible="yes"/>
+ </memberdecl>
+ <detaileddescription title=""/>
+ <memberdef>
+ <typedefs title=""/>
+ <enums title=""/>
+ <constructors title=""/>
+ <functions title=""/>
+ <related title=""/>
+ <variables title=""/>
+ <properties title=""/>
+ <events title=""/>
+ </memberdef>
+ <usedfiles visible="$SHOW_USED_FILES"/>
+ <authorsection visible="yes"/>
+ </class>
+
+ <!-- Layout definition for a namespace page -->
+ <namespace>
+ <briefdescription visible="yes"/>
+ <memberdecl>
+ <nestednamespaces visible="yes" title=""/>
+ <classes visible="yes" title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ <membergroups visible="yes"/>
+ </memberdecl>
+ <detaileddescription title=""/>
+ <memberdef>
+ <typedefs title=""/>
+ <enums title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ </memberdef>
+ <authorsection visible="yes"/>
+ </namespace>
+
+ <!-- Layout definition for a file page -->
+ <file>
+ <briefdescription visible="yes"/>
+ <includes visible="$SHOW_INCLUDE_FILES"/>
+ <includegraph visible="$INCLUDE_GRAPH"/>
+ <includedbygraph visible="$INCLUDED_BY_GRAPH"/>
+ <sourcelink visible="yes"/>
+ <memberdecl>
+ <classes visible="yes" title=""/>
+ <namespaces visible="yes" title=""/>
+ <defines title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ <membergroups visible="yes"/>
+ </memberdecl>
+ <detaileddescription title=""/>
+ <memberdef>
+ <defines title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ </memberdef>
+ <authorsection/>
+ </file>
+
+ <!-- Layout definition for a group page -->
+ <group>
+ <briefdescription visible="yes"/>
+ <groupgraph visible="$GROUP_GRAPHS"/>
+ <memberdecl>
+ <classes visible="yes" title=""/>
+ <namespaces visible="yes" title=""/>
+ <dirs visible="yes" title=""/>
+ <nestedgroups visible="yes" title=""/>
+ <files visible="yes" title=""/>
+ <defines title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <enumvalues title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ <signals title=""/>
+ <publicslots title=""/>
+ <protectedslots title=""/>
+ <privateslots title=""/>
+ <events title=""/>
+ <properties title=""/>
+ <friends title=""/>
+ <membergroups visible="yes"/>
+ </memberdecl>
+ <detaileddescription title=""/>
+ <memberdef>
+ <pagedocs/>
+ <inlineclasses title=""/>
+ <defines title=""/>
+ <typedefs title=""/>
+ <enums title=""/>
+ <enumvalues title=""/>
+ <functions title=""/>
+ <variables title=""/>
+ <signals title=""/>
+ <publicslots title=""/>
+ <protectedslots title=""/>
+ <privateslots title=""/>
+ <events title=""/>
+ <properties title=""/>
+ <friends title=""/>
+ </memberdef>
+ <authorsection visible="yes"/>
+ </group>
+
+ <!-- Layout definition for a directory page -->
+ <directory>
+ <briefdescription visible="yes"/>
+ <directorygraph visible="yes"/>
+ <memberdecl>
+ <dirs visible="yes"/>
+ <files visible="yes"/>
+ </memberdecl>
+ <detaileddescription title=""/>
+ </directory>
+</doxygenlayout>
diff --git a/src/libdoxycfg.pro b/src/libdoxycfg.pro
new file mode 100644
index 0000000..5097261
--- /dev/null
+++ b/src/libdoxycfg.pro
@@ -0,0 +1,32 @@
+#
+# This file was generated from libdoxycfg.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+#
+# $Id: libdoxycfg.pro.in,v 1.1 2001/03/19 19:27:41 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+# TMake project file for doxygen
+
+TEMPLATE = libdoxycfg.t
+CONFIG = console warn_on staticlib debug
+HEADERS = config.h configoptions.h portable.h
+SOURCES = config.cpp configoptions.cpp portable.cpp portable_c.c
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
+INCLUDEPATH += ../qtools
+win32:INCLUDEPATH += .
+DESTDIR = ../lib
+TARGET = doxycfg
+OBJECTS_DIR = ../objects
+TMAKE_MOC = /usr/bin/moc
diff --git a/src/libdoxycfg.pro.in b/src/libdoxycfg.pro.in
new file mode 100644
index 0000000..33fc208
--- /dev/null
+++ b/src/libdoxycfg.pro.in
@@ -0,0 +1,27 @@
+#
+# $Id: libdoxycfg.pro.in,v 1.1 2001/03/19 19:27:41 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+# TMake project file for doxygen
+
+TEMPLATE = libdoxycfg.t
+CONFIG = console warn_on staticlib $extraopts
+HEADERS = config.h configoptions.h portable.h
+SOURCES = config.cpp configoptions.cpp portable.cpp portable_c.c
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
+INCLUDEPATH += ../qtools
+win32:INCLUDEPATH += .
+DESTDIR = ../lib
+TARGET = doxycfg
+OBJECTS_DIR = ../objects
diff --git a/src/libdoxycfg.t b/src/libdoxycfg.t
new file mode 100644
index 0000000..2445d72
--- /dev/null
+++ b/src/libdoxycfg.t
@@ -0,0 +1,52 @@
+#
+# $Id: libdoxycfg.t,v 1.1 2001/03/19 19:27:41 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#!
+#! doxygen.t: This is a custom template for building Doxygen
+#!
+#$ IncludeTemplate("lib.t");
+
+LEX = flex
+YACC = bison
+
+#${
+sub GenerateDep {
+ my($obj,$src,$dep) = @_;
+ my(@objv,$srcv,$i,$s,$o,$d,$c);
+ @objv = split(/\s+/,$obj);
+ @srcv = split(/\s+/,$src);
+ for $i ( 0..$#objv ) {
+ $s = $srcv[$i];
+ $o = $objv[$i];
+ next if $s eq "";
+ $text .= $o . ": " . $s;
+ $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
+ if ( $moc_output{$s} ne "" ) {
+ $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
+ }
+ $d = &make_depend($s);
+ $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
+ $text .= "\n";
+ }
+ chop $text;
+}
+#$}
+
+####################
+
+#$ GenerateDep("config.cpp","config.l");
+ $(LEX) -PconfigYY -t config.l >config.cpp
+
+configoptions.cpp: config.xml
+ python configgen.py config.xml >configoptions.cpp
+
diff --git a/src/libdoxygen.pro b/src/libdoxygen.pro
new file mode 100644
index 0000000..135ed2e
--- /dev/null
+++ b/src/libdoxygen.pro
@@ -0,0 +1,265 @@
+#
+# This file was generated from libdoxygen.pro.in on Mon Mar 28 15:09:00 CEST 2011
+#
+
+#
+# $Id: libdoxygen.pro.in,v 1.1 2001/03/19 19:27:41 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+# TMake project file for doxygen
+
+TEMPLATE = libdoxygen.t
+CONFIG = console warn_on staticlib debug
+HEADERS = bufstr.h \
+ classdef.h \
+ classlist.h \
+ cmdmapper.h \
+ code.h \
+ commentcnv.h \
+ commentscan.h \
+ compound_xsd.h \
+ config.h \
+ constexp.h \
+ cppvalue.h \
+ debug.h \
+ declinfo.h \
+ defargs.h \
+ defgen.h \
+ define.h \
+ definition.h \
+ diagram.h \
+ dirdef.h \
+ docparser.h \
+ docsets.h \
+ doctokenizer.h \
+ docvisitor.h \
+ dot.h \
+ doxygen.h \
+ doxygen_css.h \
+ eclipsehelp.h \
+ entry.h \
+ example.h \
+ filedef.h \
+ filename.h \
+ formula.h \
+ ftextstream.h \
+ ftvhelp.h \
+ groupdef.h \
+ htags.h \
+ htmlattrib.h \
+ htmldocvisitor.h \
+ htmlgen.h \
+ htmlhelp.h \
+ indexlog.h \
+ image.h \
+ index.h \
+ index_xsd.h \
+ instdox.h \
+ jquery_js.h \
+ jquery_ui_js.h \
+ sizzle_js.h \
+ language.h \
+ latexdocvisitor.h \
+ latexgen.h \
+ layout.h \
+ layout_default.h \
+ lockingptr.h \
+ logos.h \
+ mandocvisitor.h \
+ mangen.h \
+ marshal.h \
+ memberdef.h \
+ membergroup.h \
+ memberlist.h \
+ membername.h \
+ message.h \
+ msc.h \
+ namespacedef.h \
+ navtree_css.h \
+ navtree_js.h \
+ objcache.h \
+ outputgen.h \
+ outputlist.h \
+ pagedef.h \
+ perlmodgen.h \
+ lodepng.h \
+ pre.h \
+ printdocvisitor.h \
+ pycode.h \
+ pyscanner.h \
+ fortrancode.h \
+ fortranscanner.h \
+ dbusxmlscanner.h \
+ qhp.h \
+ qhpxmlwriter.h \
+ qtbc.h \
+ reflist.h \
+ resize_js.h \
+ rtfdocvisitor.h \
+ rtfgen.h \
+ rtfstyle.h \
+ scanner.h \
+ searchindex.h \
+ search_css.h \
+ search_js.h \
+ search_php.h \
+ section.h \
+ sortdict.h \
+ store.h \
+ tagreader.h \
+ textdocvisitor.h \
+ translator.h \
+ translator_adapter.h \
+ translator_br.h \
+ translator_ca.h \
+ translator_cn.h \
+ translator_cz.h \
+ translator_de.h \
+ translator_dk.h \
+ translator_en.h \
+ translator_es.h \
+ translator_fi.h \
+ translator_fr.h \
+ translator_gr.h \
+ translator_hr.h \
+ translator_hu.h \
+ translator_id.h \
+ translator_it.h \
+ translator_je.h \
+ translator_jp.h \
+ translator_ke.h \
+ translator_kr.h \
+ translator_nl.h \
+ translator_no.h \
+ translator_mk.h \
+ translator_pl.h \
+ translator_pt.h \
+ translator_ro.h \
+ translator_ru.h \
+ translator_se.h \
+ translator_si.h \
+ translator_sk.h \
+ translator_sr.h \
+ translator_tw.h \
+ translator_ua.h \
+ translator_vi.h \
+ translator_za.h \
+ unistd.h \
+ util.h \
+ version.h \
+ vhdlcode.h \
+ vhdldocgen.h \
+ vhdlscanner.h \
+ xmldocvisitor.h \
+ xmlgen.h
+
+SOURCES = ce_lex.cpp \
+ ce_parse.cpp \
+ classdef.cpp \
+ classlist.cpp \
+ cmdmapper.cpp \
+ code.cpp \
+ commentcnv.cpp \
+ commentscan.cpp \
+ cppvalue.cpp \
+ debug.cpp \
+ defgen.cpp \
+ declinfo.cpp \
+ defargs.cpp \
+ define.cpp \
+ definition.cpp \
+ diagram.cpp \
+ dirdef.cpp \
+ docparser.cpp \
+ docsets.cpp \
+ doctokenizer.cpp \
+ dot.cpp \
+ doxygen.cpp \
+ eclipsehelp.cpp \
+ entry.cpp \
+ filedef.cpp \
+ filename.cpp \
+ formula.cpp \
+ ftextstream.cpp \
+ ftvhelp.cpp \
+ fortrancode.cpp \
+ fortranscanner.cpp \
+ groupdef.cpp \
+ htags.cpp \
+ htmldocvisitor.cpp \
+ htmlgen.cpp \
+ htmlhelp.cpp \
+ indexlog.cpp \
+ image.cpp \
+ index.cpp \
+ instdox.cpp \
+ language.cpp \
+ latexdocvisitor.cpp \
+ latexgen.cpp \
+ layout.cpp \
+ lodepng.cpp \
+ logos.cpp \
+ mandocvisitor.cpp \
+ mangen.cpp \
+ marshal.cpp \
+ memberdef.cpp \
+ membergroup.cpp \
+ memberlist.cpp \
+ membername.cpp \
+ message.cpp \
+ msc.cpp \
+ namespacedef.cpp \
+ objcache.cpp \
+ outputgen.cpp \
+ outputlist.cpp \
+ pagedef.cpp \
+ perlmodgen.cpp \
+ pre.cpp \
+ pycode.cpp \
+ pyscanner.cpp \
+ qhp.cpp \
+ qhpxmlwriter.cpp \
+ reflist.cpp \
+ rtfdocvisitor.cpp \
+ rtfgen.cpp \
+ rtfstyle.cpp \
+ scanner.cpp \
+ searchindex.cpp \
+ store.cpp \
+ tagreader.cpp \
+ textdocvisitor.cpp \
+ translator.cpp \
+ util.cpp \
+ version.cpp \
+ vhdlcode.cpp \
+ vhdldocgen.cpp \
+ vhdlscanner.cpp \
+ xmldocvisitor.cpp \
+ xmlgen.cpp \
+ dbusxmlscanner.cpp \
+
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+win32-msvc:TMAKE_CXXFLAGS += -Zm200
+win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
+linux-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
+INCLUDEPATH += ../qtools
+#INCLUDEPATH += ../libpng
+INCLUDEPATH += ../libmd5
+win32:INCLUDEPATH += .
+#win32-g++:INCLUDEPATH = ../qtools /usr/include/libpng12 ../libmd5
+win32-g++:INCLUDEPATH = ../qtools ../libmd5
+DESTDIR = ../lib
+TARGET = doxygen
+OBJECTS_DIR = ../objects
+
+TMAKE_MOC = /usr/bin/moc
diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in
new file mode 100644
index 0000000..ff6536f
--- /dev/null
+++ b/src/libdoxygen.pro.in
@@ -0,0 +1,260 @@
+#
+# $Id: libdoxygen.pro.in,v 1.1 2001/03/19 19:27:41 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#
+# TMake project file for doxygen
+
+TEMPLATE = libdoxygen.t
+CONFIG = console warn_on staticlib $extraopts
+HEADERS = bufstr.h \
+ classdef.h \
+ classlist.h \
+ cmdmapper.h \
+ code.h \
+ commentcnv.h \
+ commentscan.h \
+ compound_xsd.h \
+ config.h \
+ constexp.h \
+ cppvalue.h \
+ debug.h \
+ declinfo.h \
+ defargs.h \
+ defgen.h \
+ define.h \
+ definition.h \
+ diagram.h \
+ dirdef.h \
+ docparser.h \
+ docsets.h \
+ doctokenizer.h \
+ docvisitor.h \
+ dot.h \
+ doxygen.h \
+ doxygen_css.h \
+ eclipsehelp.h \
+ entry.h \
+ example.h \
+ filedef.h \
+ filename.h \
+ formula.h \
+ ftextstream.h \
+ ftvhelp.h \
+ groupdef.h \
+ htags.h \
+ htmlattrib.h \
+ htmldocvisitor.h \
+ htmlgen.h \
+ htmlhelp.h \
+ indexlog.h \
+ image.h \
+ index.h \
+ index_xsd.h \
+ instdox.h \
+ jquery_js.h \
+ jquery_ui_js.h \
+ sizzle_js.h \
+ language.h \
+ latexdocvisitor.h \
+ latexgen.h \
+ layout.h \
+ layout_default.h \
+ lockingptr.h \
+ logos.h \
+ mandocvisitor.h \
+ mangen.h \
+ marshal.h \
+ memberdef.h \
+ membergroup.h \
+ memberlist.h \
+ membername.h \
+ message.h \
+ msc.h \
+ namespacedef.h \
+ navtree_css.h \
+ navtree_js.h \
+ objcache.h \
+ outputgen.h \
+ outputlist.h \
+ pagedef.h \
+ perlmodgen.h \
+ lodepng.h \
+ pre.h \
+ printdocvisitor.h \
+ pycode.h \
+ pyscanner.h \
+ fortrancode.h \
+ fortranscanner.h \
+ dbusxmlscanner.h \
+ qhp.h \
+ qhpxmlwriter.h \
+ qtbc.h \
+ reflist.h \
+ resize_js.h \
+ rtfdocvisitor.h \
+ rtfgen.h \
+ rtfstyle.h \
+ scanner.h \
+ searchindex.h \
+ search_css.h \
+ search_js.h \
+ search_php.h \
+ section.h \
+ sortdict.h \
+ store.h \
+ tagreader.h \
+ textdocvisitor.h \
+ translator.h \
+ translator_adapter.h \
+ translator_br.h \
+ translator_ca.h \
+ translator_cn.h \
+ translator_cz.h \
+ translator_de.h \
+ translator_dk.h \
+ translator_en.h \
+ translator_es.h \
+ translator_fi.h \
+ translator_fr.h \
+ translator_gr.h \
+ translator_hr.h \
+ translator_hu.h \
+ translator_id.h \
+ translator_it.h \
+ translator_je.h \
+ translator_jp.h \
+ translator_ke.h \
+ translator_kr.h \
+ translator_nl.h \
+ translator_no.h \
+ translator_mk.h \
+ translator_pl.h \
+ translator_pt.h \
+ translator_ro.h \
+ translator_ru.h \
+ translator_se.h \
+ translator_si.h \
+ translator_sk.h \
+ translator_sr.h \
+ translator_tw.h \
+ translator_ua.h \
+ translator_vi.h \
+ translator_za.h \
+ unistd.h \
+ util.h \
+ version.h \
+ vhdlcode.h \
+ vhdldocgen.h \
+ vhdlscanner.h \
+ xmldocvisitor.h \
+ xmlgen.h
+
+SOURCES = ce_lex.cpp \
+ ce_parse.cpp \
+ classdef.cpp \
+ classlist.cpp \
+ cmdmapper.cpp \
+ code.cpp \
+ commentcnv.cpp \
+ commentscan.cpp \
+ cppvalue.cpp \
+ debug.cpp \
+ defgen.cpp \
+ declinfo.cpp \
+ defargs.cpp \
+ define.cpp \
+ definition.cpp \
+ diagram.cpp \
+ dirdef.cpp \
+ docparser.cpp \
+ docsets.cpp \
+ doctokenizer.cpp \
+ dot.cpp \
+ doxygen.cpp \
+ eclipsehelp.cpp \
+ entry.cpp \
+ filedef.cpp \
+ filename.cpp \
+ formula.cpp \
+ ftextstream.cpp \
+ ftvhelp.cpp \
+ fortrancode.cpp \
+ fortranscanner.cpp \
+ groupdef.cpp \
+ htags.cpp \
+ htmldocvisitor.cpp \
+ htmlgen.cpp \
+ htmlhelp.cpp \
+ indexlog.cpp \
+ image.cpp \
+ index.cpp \
+ instdox.cpp \
+ language.cpp \
+ latexdocvisitor.cpp \
+ latexgen.cpp \
+ layout.cpp \
+ lodepng.cpp \
+ logos.cpp \
+ mandocvisitor.cpp \
+ mangen.cpp \
+ marshal.cpp \
+ memberdef.cpp \
+ membergroup.cpp \
+ memberlist.cpp \
+ membername.cpp \
+ message.cpp \
+ msc.cpp \
+ namespacedef.cpp \
+ objcache.cpp \
+ outputgen.cpp \
+ outputlist.cpp \
+ pagedef.cpp \
+ perlmodgen.cpp \
+ pre.cpp \
+ pycode.cpp \
+ pyscanner.cpp \
+ qhp.cpp \
+ qhpxmlwriter.cpp \
+ reflist.cpp \
+ rtfdocvisitor.cpp \
+ rtfgen.cpp \
+ rtfstyle.cpp \
+ scanner.cpp \
+ searchindex.cpp \
+ store.cpp \
+ tagreader.cpp \
+ textdocvisitor.cpp \
+ translator.cpp \
+ util.cpp \
+ version.cpp \
+ vhdlcode.cpp \
+ vhdldocgen.cpp \
+ vhdlscanner.cpp \
+ xmldocvisitor.cpp \
+ xmlgen.cpp \
+ dbusxmlscanner.cpp \
+
+win32:TMAKE_CXXFLAGS += -DQT_NODLL
+win32-msvc:TMAKE_CXXFLAGS += -Zm200
+win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
+linux-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
+INCLUDEPATH += ../qtools
+#INCLUDEPATH += ../libpng
+INCLUDEPATH += ../libmd5
+win32:INCLUDEPATH += .
+#win32-g++:INCLUDEPATH = ../qtools /usr/include/libpng12 ../libmd5
+win32-g++:INCLUDEPATH = ../qtools ../libmd5
+DESTDIR = ../lib
+TARGET = doxygen
+OBJECTS_DIR = ../objects
+
diff --git a/src/libdoxygen.t b/src/libdoxygen.t
new file mode 100644
index 0000000..0597ad5
--- /dev/null
+++ b/src/libdoxygen.t
@@ -0,0 +1,145 @@
+#
+# $Id: libdoxygen.t,v 1.1 2001/03/19 19:27:41 root Exp $
+#
+# Copyright (C) 1997-2011 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# Documents produced by Doxygen are derivative works derived from the
+# input used in their production; they are not affected by this license.
+#!
+#! doxygen.t: This is a custom template for building Doxygen
+#!
+#$ IncludeTemplate("lib.t");
+
+LEX = flex
+YACC = bison
+INCBUFSIZE = $(PERL) increasebuffer.pl
+
+#${
+sub GenerateDep {
+ my($obj,$src,$dep) = @_;
+ my(@objv,$srcv,$i,$s,$o,$d,$c);
+ @objv = split(/\s+/,$obj);
+ @srcv = split(/\s+/,$src);
+ for $i ( 0..$#objv ) {
+ $s = $srcv[$i];
+ $o = $objv[$i];
+ next if $s eq "";
+ $text .= $o . ": " . $s;
+ $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
+ if ( $moc_output{$s} ne "" ) {
+ $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
+ }
+ $d = &make_depend($s);
+ $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
+ $text .= "\n";
+ }
+ chop $text;
+}
+#$}
+
+####################
+
+#$ GenerateDep("scanner.cpp","scanner.l");
+ $(LEX) -PscanYY -t scanner.l | $(INCBUFSIZE) >scanner.cpp
+
+#$ GenerateDep("code.cpp","code.l");
+ $(LEX) -PcodeYY -t code.l | $(INCBUFSIZE) >code.cpp
+
+#$ GenerateDep("pyscanner.cpp","pyscanner.l");
+ $(LEX) -PpyscanYY -t pyscanner.l | $(INCBUFSIZE) >pyscanner.cpp
+
+#$ GenerateDep("pycode.cpp","pycode.l");
+ $(LEX) -PpycodeYY -t pycode.l | $(INCBUFSIZE) >pycode.cpp
+
+#$ GenerateDep("fortranscanner.cpp","fortranscanner.l");
+ $(LEX) -i -PfscanYY -t fortranscanner.l | $(INCBUFSIZE) >fortranscanner.cpp
+
+#$ GenerateDep("fortrancode.cpp","fortrancode.l");
+ $(LEX) -i -PfcodeYY -t fortrancode.l | $(INCBUFSIZE) >fortrancode.cpp
+
+#$ GenerateDep("vhdlscanner.cpp","vhdlscanner.l");
+ $(LEX) -i -PvhdlscanYY -t vhdlscanner.l | $(INCBUFSIZE) >vhdlscanner.cpp
+
+#$ GenerateDep("vhdlcode.cpp","vhdlcode.l");
+ $(LEX) -i -PvhdlcodeYY -t vhdlcode.l | $(INCBUFSIZE) >vhdlcode.cpp
+
+#$ GenerateDep("pre.cpp","pre.l");
+ $(LEX) -PpreYY -t pre.l | $(INCBUFSIZE) >pre.cpp
+
+#$ GenerateDep("declinfo.cpp","declinfo.l");
+ $(LEX) -PdeclinfoYY -t declinfo.l | $(INCBUFSIZE) >declinfo.cpp
+
+#$ GenerateDep("defargs.cpp","defargs.l");
+ $(LEX) -PdefargsYY -t defargs.l | $(INCBUFSIZE) >defargs.cpp
+
+#$ GenerateDep("doctokenizer.cpp","doctokenizer.l");
+ $(LEX) -PdoctokenizerYY -t doctokenizer.l | $(INCBUFSIZE) >doctokenizer.cpp
+
+#$ GenerateDep("commentcnv.cpp","commentcnv.l");
+ $(LEX) -PcommentcnvYY -t commentcnv.l | $(INCBUFSIZE) >commentcnv.cpp
+
+#$ GenerateDep("commentscan.cpp","commentscan.l");
+ $(LEX) -PcommentScanYY -t commentscan.l | $(INCBUFSIZE) >commentscan.cpp
+
+#$ GenerateDep("ce_lex.cpp","constexp.l","ce_parse.h");
+ $(LEX) -PcppExpYY -t constexp.l | $(INCBUFSIZE) >ce_lex.cpp
+
+#$ GenerateDep("ce_parse.cpp","constexp.y");
+ $(YACC) -l -p cppExpYY constexp.y -o ce_parse.cpp
+
+#$ GenerateDep("ce_parse.h","constexp.y");
+ $(YACC) -l -d -p cppExpYY constexp.y -o ce_parse.c
+ -rm ce_parse.c
+
+#$ GenerateDep("layout.cpp","layout_default.h");
+
+TO_C_CMD=sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g"
+
+index_xsd.h: index.xsd
+ cat index.xsd | $(TO_C_CMD) >index_xsd.h
+
+compound_xsd.h: compound.xsd
+ cat compound.xsd | $(TO_C_CMD) >compound_xsd.h
+
+layout_default.h: layout_default.xml
+ cat layout_default.xml | $(TO_C_CMD) >layout_default.h
+
+search_php.h: search.php
+ cat search.php | $(TO_C_CMD) >search_php.h
+
+search_js.h: search.js
+ cat search.js | $(TO_C_CMD) >search_js.h
+
+search_css.h: search.css
+ cat search.css | $(TO_C_CMD) >search_css.h
+
+doxygen_css.h: doxygen.css
+ cat doxygen.css | $(TO_C_CMD) >doxygen_css.h
+
+navtree_js.h: navtree.js
+ cat navtree.js | $(TO_C_CMD) >navtree_js.h
+
+navindex_js.h: navindex.js
+ cat navindex.js | $(TO_C_CMD) >navindex_js.h
+
+resize_js.h: resize.js
+ cat resize.js | $(TO_C_CMD) >resize_js.h
+
+jquery_js.h: jquery.js
+ cat jquery.js | $(TO_C_CMD) >jquery_js.h
+
+jquery_ui_js.h: jquery_ui.js
+ cat jquery_ui.js | $(TO_C_CMD) >jquery_ui_js.h
+
+sizzle_js.h: sizzle.js
+ cat sizzle.js | $(TO_C_CMD) >sizzle_js.h
+
+navtree_css.h: navtree.css
+ cat navtree.css | $(TO_C_CMD) >navtree_css.h
+
diff --git a/src/lockingptr.h b/src/lockingptr.h
new file mode 100644
index 0000000..24263e0
--- /dev/null
+++ b/src/lockingptr.h
@@ -0,0 +1,162 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef LOCKINGPTR_H
+#define LOCKINGPTR_H
+
+/*! @brief Abstract interface for lockable objects.
+ *
+ * By implementing this interface, a smart pointer can be created which
+ * will lock this object. This is used to prevent that an internal pointer
+ * owned by a lockable object would become invalid when the object is removed from
+ * memory, leaving the client with an invalid pointer. By letting the client use
+ * a smart pointer instead of the real object the object will be locked into
+ * memory until the pointer is no longer used, at which point the owner object will be
+ * unlock and can be removed from memory.
+ */
+class LockableObj
+{
+ public:
+ LockableObj() : m_lockCount(0) {}
+ virtual ~LockableObj() {}
+
+ /*! Returns TRUE if the object is currently locked. */
+ bool isLocked() const { return m_lockCount>0; }
+
+//VC++6.0 workaround
+// protected:
+ /*! Called when the object is locked. */
+ virtual void lock() const = 0;
+
+ /*! Called when the object is unlocked. */
+ virtual void unlock() const = 0;
+
+//VC++6.0 workaround
+// private:
+// template<class T> friend class LockingPtr;
+ int m_lockCount;
+};
+
+/*! @brief Smart pointer which keeps a lock on the owner of the pointer.
+ *
+ * With the pointer an owner object derived from LockableObj is associated.
+ * As long as the smart object exists it will keep a lock on the obj by calling
+ * LockableObj::lock(). Smart pointers can be copied and passed by value. As
+ * soon as there or no more smart pointer references to the object,
+ * LockableObj::unlock() will be called automatically.
+ */
+template<class T> class LockingPtr
+{
+ LockableObj *m_owner;
+ const T *m_ptr;
+
+ public:
+ /*! Creates a smart pointer for pointer \a p owned by object \a o.
+ */
+ LockingPtr(const LockableObj *o,const T* p)
+ {
+ if (o->m_lockCount==0) o->lock();
+ m_owner = (LockableObj *)o;
+ m_owner->m_lockCount++;
+ m_ptr = p;
+ }
+
+ /*! Copies the smart pointer \a lp
+ */
+ LockingPtr(const LockingPtr &lp)
+ {
+ m_ptr = lp.m_ptr;
+ m_owner = lp.m_owner;
+ m_owner->m_lockCount++;
+ }
+
+ /*! Assigns the smart pointer \a lp
+ */
+ LockingPtr &operator=(const LockingPtr &lp)
+ {
+ m_owner->m_lockCount--;
+ if (m_owner->m_lockCount==0) // no more references
+ {
+ m_owner->unlock();
+ }
+ m_ptr = lp.m_ptr;
+ m_owner = lp.m_owner;
+ m_owner->m_lockCount++;
+ return *this;
+ }
+
+ /*! Destroys the smart pointer, will unlock the owner.
+ */
+ ~LockingPtr()
+ {
+ m_owner->m_lockCount--;
+ if (m_owner->m_lockCount==0) // no more references
+ {
+ m_owner->unlock();
+ }
+ }
+
+ bool isNull() const
+ {
+ return m_ptr==0;
+ }
+
+ bool operator!() const
+ {
+ return !m_ptr;
+ }
+
+ bool operator==(T *p) const
+ {
+ return m_ptr==p;
+ }
+
+ bool operator==(const LockingPtr &lp) const
+ {
+ return m_ptr==lp.m_ptr;
+ }
+
+ bool operator!=(T *p) const
+ {
+ return m_ptr!=p;
+ }
+
+ bool operator!=(const LockingPtr &lp) const
+ {
+ return m_ptr!=lp.m_ptr;
+ }
+
+ /*! Dereference operator */
+ const T& operator* () const
+ {
+ return *m_ptr;
+ }
+
+ T* pointer() const
+ {
+ return (T*)m_ptr;
+ }
+
+ /*! Pointer operator */
+ T* operator-> () const
+ {
+ return (T*)m_ptr;
+ }
+};
+
+#endif // LOCKINGPTR_H
+
diff --git a/src/lodepng.cpp b/src/lodepng.cpp
new file mode 100644
index 0000000..8da4293
--- /dev/null
+++ b/src/lodepng.cpp
@@ -0,0 +1,4095 @@
+/*
+LodePNG version 20080927
+
+Copyright (c) 2005-2008 Lode Vandevenne
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+*/
+
+/*
+The manual and changelog can be found in the header file "lodepng.h"
+You are free to name this file lodepng.cpp or lodepng.c depending on your usage.
+*/
+
+#include "lodepng.h"
+#include "portable.h"
+
+#define VERSION_STRING "20080927"
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Tools For C / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/*
+About these tools (vector, uivector, ucvector and string):
+-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version.
+-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated.
+-They're not used in the interface, only internally in this file, so all their functions are made static.
+*/
+
+#ifdef LODEPNG_COMPILE_ZLIB
+#ifdef LODEPNG_COMPILE_ENCODER
+
+typedef struct vector /*this one is used only by the deflate compressor*/
+{
+ void* data;
+ size_t size; /*in groups of bytes depending on type*/
+ size_t allocsize; /*in bytes*/
+ unsigned typesize; /*sizeof the type you store in data*/
+} vector;
+
+static unsigned vector_resize(vector* p, size_t size) /*returns 1 if success, 0 if failure ==> nothing done*/
+{
+ if(size * p->typesize > p->allocsize)
+ {
+ size_t newsize = size * p->typesize * 2;
+ void* data = realloc(p->data, newsize);
+ if(data)
+ {
+ p->allocsize = newsize;
+ p->data = data;
+ p->size = size;
+ }
+ else return 0;
+ }
+ else p->size = size;
+ return 1;
+}
+
+static unsigned vector_resized(vector* p, size_t size, void dtor(void*)) /*resize and use destructor on elements if it gets smaller*/
+{
+ size_t i;
+ if(size < p->size) for(i = size; i < p->size; i++) dtor(&((char*)(p->data))[i * p->typesize]);
+ return vector_resize(p, size);
+}
+
+static void vector_cleanup(void* p)
+{
+ ((vector*)p)->size = ((vector*)p)->allocsize = 0;
+ free(((vector*)p)->data);
+ ((vector*)p)->data = NULL;
+}
+
+static void vector_cleanupd(vector* p, void dtor(void*)) /*clear and use destructor on elements*/
+{
+ vector_resized(p, 0, dtor);
+ vector_cleanup(p);
+}
+
+static void vector_init(vector* p, unsigned typesize)
+{
+ p->data = NULL;
+ p->size = p->allocsize = 0;
+ p->typesize = typesize;
+}
+
+static void vector_swap(vector* p, vector* q) /*they're supposed to have the same typesize*/
+{
+ size_t tmp;
+ void* tmpp;
+ tmp = p->size; p->size = q->size; q->size = tmp;
+ tmp = p->allocsize; p->allocsize = q->allocsize; q->allocsize = tmp;
+ tmpp = p->data; p->data = q->data; q->data = tmpp;
+}
+
+static void* vector_get(vector* p, size_t index)
+{
+ return &((char*)p->data)[index * p->typesize];
+}
+#endif /*LODEPNG_COMPILE_ENCODER*/
+#endif /*LODEPNG_COMPILE_ZLIB*/
+
+/* /////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_ZLIB
+typedef struct uivector
+{
+ unsigned* data;
+ size_t size; /*size in number of unsigned longs*/
+ size_t allocsize; /*allocated size in bytes*/
+} uivector;
+
+static void uivector_cleanup(void* p)
+{
+ ((uivector*)p)->size = ((uivector*)p)->allocsize = 0;
+ free(((uivector*)p)->data);
+ ((uivector*)p)->data = NULL;
+}
+
+static unsigned uivector_resize(uivector* p, size_t size) /*returns 1 if success, 0 if failure ==> nothing done*/
+{
+ if(size * sizeof(unsigned) > p->allocsize)
+ {
+ size_t newsize = size * sizeof(unsigned) * 2;
+ void* data = realloc(p->data, newsize);
+ if(data)
+ {
+ p->allocsize = newsize;
+ p->data = (unsigned*)data;
+ p->size = size;
+ }
+ else return 0;
+ }
+ else p->size = size;
+ return 1;
+}
+
+static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) /*resize and give all new elements the value*/
+{
+ size_t oldsize = p->size, i;
+ if(!uivector_resize(p, size)) return 0;
+ for(i = oldsize; i < size; i++) p->data[i] = value;
+ return 1;
+}
+
+static void uivector_init(uivector* p)
+{
+ p->data = NULL;
+ p->size = p->allocsize = 0;
+}
+
+#ifdef LODEPNG_COMPILE_ENCODER
+static unsigned uivector_push_back(uivector* p, unsigned c) /*returns 1 if success, 0 if failure ==> nothing done*/
+{
+ if(!uivector_resize(p, p->size + 1)) return 0;
+ p->data[p->size - 1] = c;
+ return 1;
+}
+
+static unsigned uivector_copy(uivector* p, const uivector* q) /*copy q to p, returns 1 if success, 0 if failure ==> nothing done*/
+{
+ size_t i;
+ if(!uivector_resize(p, q->size)) return 0;
+ for(i = 0; i < q->size; i++) p->data[i] = q->data[i];
+ return 1;
+}
+
+static void uivector_swap(uivector* p, uivector* q)
+{
+ size_t tmp;
+ unsigned* tmpp;
+ tmp = p->size; p->size = q->size; q->size = tmp;
+ tmp = p->allocsize; p->allocsize = q->allocsize; q->allocsize = tmp;
+ tmpp = p->data; p->data = q->data; q->data = tmpp;
+}
+#endif /*LODEPNG_COMPILE_ENCODER*/
+#endif /*LODEPNG_COMPILE_ZLIB*/
+
+/* /////////////////////////////////////////////////////////////////////////// */
+
+typedef struct ucvector
+{
+ unsigned char* data;
+ size_t size; /*used size*/
+ size_t allocsize; /*allocated size*/
+} ucvector;
+
+static void ucvector_cleanup(void* p)
+{
+ ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0;
+ free(((ucvector*)p)->data);
+ ((ucvector*)p)->data = NULL;
+}
+
+static unsigned ucvector_resize(ucvector* p, size_t size) /*returns 1 if success, 0 if failure ==> nothing done*/
+{
+ if(size * sizeof(unsigned) > p->allocsize)
+ {
+ size_t newsize = size * sizeof(unsigned) * 2;
+ void* data = realloc(p->data, newsize);
+ if(data)
+ {
+ p->allocsize = newsize;
+ p->data = (unsigned char*)data;
+ p->size = size;
+ }
+ else return 0; /*error: not enough memory*/
+ }
+ else p->size = size;
+ return 1;
+}
+
+#ifdef LODEPNG_COMPILE_DECODER
+#ifdef LODEPNG_COMPILE_PNG
+static unsigned ucvector_resizev(ucvector* p, size_t size, unsigned char value) /*resize and give all new elements the value*/
+{
+ size_t oldsize = p->size, i;
+ if(!ucvector_resize(p, size)) return 0;
+ for(i = oldsize; i < size; i++) p->data[i] = value;
+ return 1;
+}
+#endif /*LODEPNG_COMPILE_PNG*/
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+static void ucvector_init(ucvector* p)
+{
+ p->data = NULL;
+ p->size = p->allocsize = 0;
+}
+
+#ifdef LODEPNG_COMPILE_ZLIB
+/*you can both convert from vector to buffer&size and vica versa*/
+static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size)
+{
+ p->data = buffer;
+ p->allocsize = p->size = size;
+}
+#endif /*LODEPNG_COMPILE_ZLIB*/
+
+static unsigned ucvector_push_back(ucvector* p, unsigned char c) /*returns 1 if success, 0 if failure ==> nothing done*/
+{
+ if(!ucvector_resize(p, p->size + 1)) return 0;
+ p->data[p->size - 1] = c;
+ return 1;
+}
+
+/* /////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_PNG
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+static unsigned string_resize(char** out, size_t size) /*returns 1 if success, 0 if failure ==> nothing done*/
+{
+ char* data = (char*)realloc(*out, size + 1);
+ if(data)
+ {
+ data[size] = 0; /*null termination char*/
+ *out = data;
+ }
+ return data != 0;
+}
+
+static void string_init(char** out) /*init a {char*, size_t} pair for use as string*/
+{
+ *out = NULL;
+ string_resize(out, 0);
+}
+
+static void string_cleanup(char** out) /*free the above pair again*/
+{
+ free(*out);
+ *out = NULL;
+}
+
+static void string_set(char** out, const char* in)
+{
+ size_t insize = strlen(in), i = 0;
+ if(string_resize(out, insize)) for(i = 0; i < insize; i++) (*out)[i] = in[i];
+}
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+#endif /*LODEPNG_COMPILE_PNG*/
+
+#ifdef LODEPNG_COMPILE_ZLIB
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Reading and writing single bits and bytes from/to stream for Deflate / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_ENCODER
+static void addBitToStream(size_t* bitpointer, ucvector* bitstream, unsigned char bit)
+{
+ if((*bitpointer) % 8 == 0) ucvector_push_back(bitstream, 0); /*add a new byte at the end*/
+ (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7)); /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/
+ (*bitpointer)++;
+}
+
+static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits)
+{
+ size_t i;
+ for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1));
+}
+
+static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits)
+{
+ size_t i;
+ for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1));
+}
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+#ifdef LODEPNG_COMPILE_DECODER
+static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream)
+{
+ unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> ((*bitpointer) & 0x7)) & 1);
+ (*bitpointer)++;
+ return result;
+}
+
+static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits)
+{
+ unsigned result = 0, i;
+ for(i = 0; i < nbits; i++) result += ((unsigned)readBitFromStream(bitpointer, bitstream)) << i;
+ return result;
+}
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Deflate - Huffman / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#define FIRST_LENGTH_CODE_INDEX 257
+#define LAST_LENGTH_CODE_INDEX 285
+#define NUM_DEFLATE_CODE_SYMBOLS 288 /*256 literals, the end code, some length codes, and 2 unused codes*/
+#define NUM_DISTANCE_SYMBOLS 32 /*the distance codes have their own symbols, 30 used, 2 unused*/
+#define NUM_CODE_LENGTH_CODES 19 /*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/
+
+static const unsigned LENGTHBASE[29] /*the base lengths represented by codes 257-285*/
+ = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258};
+static const unsigned LENGTHEXTRA[29] /*the extra bits used by codes 257-285 (added to base length)*/
+ = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0};
+static const unsigned DISTANCEBASE[30] /*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/
+ = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577};
+static const unsigned DISTANCEEXTRA[30] /*the extra bits of backwards distances (added to base)*/
+ = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
+static const unsigned CLCL[NUM_CODE_LENGTH_CODES] /*the order in which "code length alphabet code lengths" are stored, out of this the huffman tree of the dynamic huffman tree lengths is generated*/
+ = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+/* /////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_ENCODER
+/*terminology used for the package-merge algorithm and the coin collector's problem*/
+typedef struct Coin /*a coin can be multiple coins (when they're merged)*/
+{
+ uivector symbols;
+ float weight; /*the sum of all weights in this coin*/
+} Coin;
+
+static void Coin_init(Coin* c)
+{
+ uivector_init(&c->symbols);
+}
+
+static void Coin_cleanup(void* c) /*void* so that this dtor can be given as function pointer to the vector resize function*/
+{
+ uivector_cleanup(&((Coin*)c)->symbols);
+}
+
+static void Coin_copy(Coin* c1, const Coin* c2)
+{
+ c1->weight = c2->weight;
+ uivector_copy(&c1->symbols, &c2->symbols);
+}
+
+static void addCoins(Coin* c1, const Coin* c2)
+{
+ unsigned i;
+ for(i = 0; i < c2->symbols.size; i++) uivector_push_back(&c1->symbols, c2->symbols.data[i]);
+ c1->weight += c2->weight;
+}
+
+static void Coin_sort(Coin* data, size_t amount) /*combsort*/
+{
+ size_t gap = amount;
+ unsigned char swapped = 0;
+ while(gap > 1 || swapped)
+ {
+ size_t i;
+ gap = (gap * 10) / 13; /*shrink factor 1.3*/
+ if(gap == 9 || gap == 10) gap = 11; /*combsort11*/
+ if(gap < 1) gap = 1;
+ swapped = 0;
+ for(i = 0; i < amount - gap; i++)
+ {
+ size_t j = i + gap;
+ if(data[j].weight < data[i].weight)
+ {
+ float temp = data[j].weight; data[j].weight = data[i].weight; data[i].weight = temp;
+ uivector_swap(&data[i].symbols, &data[j].symbols);
+ swapped = 1;
+ }
+ }
+ }
+}
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+typedef struct HuffmanTree
+{
+ uivector tree2d;
+ uivector tree1d;
+ uivector lengths; /*the lengths of the codes of the 1d-tree*/
+ unsigned maxbitlen; /*maximum number of bits a single code can get*/
+ unsigned numcodes; /*number of symbols in the alphabet = number of codes*/
+} HuffmanTree;
+
+/*function used for debug purposes*/
+/*#include <iostream>
+static void HuffmanTree_draw(HuffmanTree* tree)
+{
+ std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl;
+ for(size_t i = 0; i < tree->tree1d.size; i++)
+ {
+ if(tree->lengths.data[i])
+ std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl;
+ }
+ std::cout << std::endl;
+}*/
+
+static void HuffmanTree_init(HuffmanTree* tree)
+{
+ uivector_init(&tree->tree2d);
+ uivector_init(&tree->tree1d);
+ uivector_init(&tree->lengths);
+}
+
+static void HuffmanTree_cleanup(HuffmanTree* tree)
+{
+ uivector_cleanup(&tree->tree2d);
+ uivector_cleanup(&tree->tree1d);
+ uivector_cleanup(&tree->lengths);
+}
+
+/*the tree representation used by the decoder. return value is error*/
+static unsigned HuffmanTree_make2DTree(HuffmanTree* tree)
+{
+ unsigned nodefilled = 0; /*up to which node it is filled*/
+ unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/
+ unsigned n, i;
+
+ if(!uivector_resize(&tree->tree2d, tree->numcodes * 2)) return 9901; /*if failed return not enough memory error*/
+ /*convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means uninited, a value >= numcodes is an address to another bit, a value < numcodes is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as many columns as codes - 1
+ a good huffmann tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. Here, the internal nodes are stored (what their 0 and 1 option point to). There is only memory for such good tree currently, if there are more nodes (due to too long length codes), error 55 will happen*/
+ for(n = 0; n < tree->numcodes * 2; n++) tree->tree2d.data[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/
+
+ for(n = 0; n < tree->numcodes; n++) /*the codes*/
+ for(i = 0; i < tree->lengths.data[n]; i++) /*the bits for this code*/
+ {
+ unsigned char bit = (unsigned char)((tree->tree1d.data[n] >> (tree->lengths.data[n] - i - 1)) & 1);
+ if(treepos > tree->numcodes - 2) return 55; /*error 55: oversubscribed; see description in header*/
+ if(tree->tree2d.data[2 * treepos + bit] == 32767) /*not yet filled in*/
+ {
+ if(i + 1 == tree->lengths.data[n]) /*last bit*/
+ {
+ tree->tree2d.data[2 * treepos + bit] = n; /*put the current code in it*/
+ treepos = 0;
+ }
+ else /*put address of the next step in here, first that address has to be found of course (it's just nodefilled + 1)...*/
+ {
+ nodefilled++;
+ tree->tree2d.data[2 * treepos + bit] = nodefilled + tree->numcodes; /*addresses encoded with numcodes added to it*/
+ treepos = nodefilled;
+ }
+ }
+ else treepos = tree->tree2d.data[2 * treepos + bit] - tree->numcodes;
+ }
+ for(n = 0; n < tree->numcodes * 2; n++) if(tree->tree2d.data[n] == 32767) tree->tree2d.data[n] = 0; /*remove possible remaining 32767's*/
+
+ return 0;
+}
+
+static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) /*given that numcodes, lengths and maxbitlen are already filled in correctly. return value is error.*/
+{
+ uivector blcount;
+ uivector nextcode;
+ unsigned bits, n, error = 0;
+
+ uivector_init(&blcount);
+ uivector_init(&nextcode);
+ if(!uivector_resize(&tree->tree1d, tree->numcodes)
+ || !uivector_resizev(&blcount, tree->maxbitlen + 1, 0)
+ || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0))
+ error = 9902;
+
+ if(!error)
+ {
+ /*step 1: count number of instances of each code length*/
+ for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths.data[bits]]++;
+ /*step 2: generate the nextcode values*/
+ for(bits = 1; bits <= tree->maxbitlen; bits++) nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1;
+ /*step 3: generate all the codes*/
+ for(n = 0; n < tree->numcodes; n++) if(tree->lengths.data[n] != 0) tree->tree1d.data[n] = nextcode.data[tree->lengths.data[n]]++;
+ }
+
+ uivector_cleanup(&blcount);
+ uivector_cleanup(&nextcode);
+
+ if(!error) return HuffmanTree_make2DTree(tree);
+ else return error;
+}
+
+/*given the code lengths (as stored in the PNG file), generate the tree as defined by Deflate. maxbitlen is the maximum bits that a code in the tree can have. return value is error.*/
+static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, size_t numcodes, unsigned maxbitlen)
+{
+ unsigned i;
+ if(!uivector_resize(&tree->lengths, numcodes)) return 9903;
+ for(i = 0; i < numcodes; i++) tree->lengths.data[i] = bitlen[i];
+ tree->numcodes = (unsigned)numcodes; /*number of symbols*/
+ tree->maxbitlen = maxbitlen;
+ return HuffmanTree_makeFromLengths2(tree);
+}
+
+#ifdef LODEPNG_COMPILE_ENCODER
+static unsigned HuffmanTree_fillInCoins(vector* coins, const unsigned* frequencies, unsigned numcodes, size_t sum)
+{
+ unsigned i;
+ for(i = 0; i < numcodes; i++)
+ {
+ Coin* coin;
+ if(frequencies[i] == 0) continue; /*it's important to exclude symbols that aren't present*/
+ if(!vector_resize(coins, coins->size + 1)) { vector_cleanup(coins); return 9904; }
+ coin = (Coin*)(vector_get(coins, coins->size - 1));
+ Coin_init(coin);
+ coin->weight = frequencies[i] / (float)sum;
+ uivector_push_back(&coin->symbols, i);
+ }
+ if(coins->size) Coin_sort((Coin*)coins->data, coins->size);
+ return 0;
+}
+
+static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, size_t numcodes, unsigned maxbitlen)
+{
+ unsigned i, j;
+ size_t sum = 0, numpresent = 0;
+ unsigned error = 0;
+
+ vector prev_row; /*type Coin, the previous row of coins*/
+ vector coins; /*type Coin, the coins of the currently calculated row*/
+
+ tree->maxbitlen = maxbitlen;
+
+ for(i = 0; i < numcodes; i++)
+ {
+ if(frequencies[i] > 0)
+ {
+ numpresent++;
+ sum += frequencies[i];
+ }
+ }
+
+ if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/
+ tree->numcodes = (unsigned)numcodes; /*number of symbols*/
+ uivector_resize(&tree->lengths, 0);
+ if(!uivector_resizev(&tree->lengths, tree->numcodes, 0)) return 9905;
+
+ if(numpresent == 0) /*there are no symbols at all, in that case add one symbol of value 0 to the tree (see RFC 1951 section 3.2.7) */
+ {
+ tree->lengths.data[0] = 1;
+ return HuffmanTree_makeFromLengths2(tree);
+ }
+ else if(numpresent == 1) /*the package merge algorithm gives wrong results if there's only one symbol (theoretically 0 bits would then suffice, but we need a proper symbol for zlib)*/
+ {
+ for(i = 0; i < numcodes; i++) if(frequencies[i]) tree->lengths.data[i] = 1;
+ return HuffmanTree_makeFromLengths2(tree);
+ }
+
+ vector_init(&coins, sizeof(Coin));
+ vector_init(&prev_row, sizeof(Coin));
+
+ /*Package-Merge algorithm represented by coin collector's problem
+ For every symbol, maxbitlen coins will be created*/
+
+ /*first row, lowest denominator*/
+ error = HuffmanTree_fillInCoins(&coins, frequencies, tree->numcodes, sum);
+ if(!error)
+ {
+ for(j = 1; j <= maxbitlen && !error; j++) /*each of the remaining rows*/
+ {
+ vector_swap(&coins, &prev_row); /*swap instead of copying*/
+ if(!vector_resized(&coins, 0, Coin_cleanup)) { error = 9906; break; }
+
+ for(i = 0; i + 1 < prev_row.size; i += 2)
+ {
+ if(!vector_resize(&coins, coins.size + 1)) { error = 9907; break; }
+ Coin_init((Coin*)vector_get(&coins, coins.size - 1));
+ Coin_copy((Coin*)vector_get(&coins, coins.size - 1), (Coin*)vector_get(&prev_row, i));
+ addCoins((Coin*)vector_get(&coins, coins.size - 1), (Coin*)vector_get(&prev_row, i + 1)); /*merge the coins into packages*/
+ }
+ if(j < maxbitlen)
+ {
+ error = HuffmanTree_fillInCoins(&coins, frequencies, tree->numcodes, sum);
+ }
+ }
+ }
+
+ if(!error)
+ {
+ /*keep the coins with lowest weight, so that they add up to the amount of symbols - 1*/
+ vector_resized(&coins, numpresent - 1, Coin_cleanup);
+
+ /*calculate the lenghts of each symbol, as the amount of times a coin of each symbol is used*/
+ for(i = 0; i < coins.size; i++)
+ {
+ Coin* coin = (Coin*)vector_get(&coins, i);
+ for(j = 0; j < coin->symbols.size; j++) tree->lengths.data[coin->symbols.data[j]]++;
+ }
+
+ error = HuffmanTree_makeFromLengths2(tree);
+ }
+
+ vector_cleanupd(&coins, Coin_cleanup);
+ vector_cleanupd(&prev_row, Coin_cleanup);
+
+ return error;
+}
+
+static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index) { return tree->tree1d.data[index]; }
+static unsigned HuffmanTree_getLength(const HuffmanTree* tree, unsigned index) { return tree->lengths.data[index]; }
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+/*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/
+static unsigned generateFixedTree(HuffmanTree* tree)
+{
+ unsigned i, error = 0;
+ uivector bitlen;
+ uivector_init(&bitlen);
+ if(!uivector_resize(&bitlen, NUM_DEFLATE_CODE_SYMBOLS)) error = 9909;
+
+ if(!error)
+ {
+ /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/
+ for(i = 0; i <= 143; i++) bitlen.data[i] = 8;
+ for(i = 144; i <= 255; i++) bitlen.data[i] = 9;
+ for(i = 256; i <= 279; i++) bitlen.data[i] = 7;
+ for(i = 280; i <= 287; i++) bitlen.data[i] = 8;
+
+ error = HuffmanTree_makeFromLengths(tree, bitlen.data, NUM_DEFLATE_CODE_SYMBOLS, 15);
+ }
+
+ uivector_cleanup(&bitlen);
+ return error;
+}
+
+static unsigned generateDistanceTree(HuffmanTree* tree)
+{
+ unsigned i, error = 0;
+ uivector bitlen;
+ uivector_init(&bitlen);
+ if(!uivector_resize(&bitlen, NUM_DISTANCE_SYMBOLS)) error = 9910;
+
+ /*there are 32 distance codes, but 30-31 are unused*/
+ if(!error)
+ {
+ for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen.data[i] = 5;
+ error = HuffmanTree_makeFromLengths(tree, bitlen.data, NUM_DISTANCE_SYMBOLS, 15);
+ }
+ uivector_cleanup(&bitlen);
+ return error;
+}
+
+#ifdef LODEPNG_COMPILE_DECODER
+/*Decodes a symbol from the tree
+if decoded is true, then result contains the symbol, otherwise it contains something unspecified (because the symbol isn't fully decoded yet)
+bit is the bit that was just read from the stream
+you have to decode a full symbol (let the decode function return true) before you can try to decode another one, otherwise the state isn't reset
+return value is error.*/
+static unsigned HuffmanTree_decode(const HuffmanTree* tree, unsigned* decoded, unsigned* result, unsigned* treepos, unsigned char bit)
+{
+ if((*treepos) >= tree->numcodes) return 11; /*error: it appeared outside the codetree*/
+
+ (*result) = tree->tree2d.data[2 * (*treepos) + bit];
+ (*decoded) = ((*result) < tree->numcodes);
+
+ if(*decoded) (*treepos) = 0;
+ else (*treepos) = (*result) - tree->numcodes;
+
+ return 0;
+}
+
+static unsigned huffmanDecodeSymbol(unsigned int* error, const unsigned char* in, size_t* bp, const HuffmanTree* codetree, size_t inlength)
+{
+ unsigned treepos = 0, decoded, ct;
+ for(;;)
+ {
+ unsigned char bit;
+ if(((*bp) & 0x07) == 0 && ((*bp) >> 3) > inlength) { *error = 10; return 0; } /*error: end of input memory reached without endcode*/
+ bit = readBitFromStream(bp, in);
+ *error = HuffmanTree_decode(codetree, &decoded, &ct, &treepos, bit);
+ if(*error) return 0; /*stop, an error happened*/
+ if(decoded) return ct;
+ }
+}
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+#ifdef LODEPNG_COMPILE_DECODER
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Inflator / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/
+static void getTreeInflateFixed(HuffmanTree* tree, HuffmanTree* treeD)
+{
+ /*error checking not done, this is fixed stuff, it works, it doesn't depend on the image*/
+ generateFixedTree(tree);
+ generateDistanceTree(treeD);
+}
+
+/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/
+static unsigned getTreeInflateDynamic(HuffmanTree* codetree, HuffmanTree* codetreeD, HuffmanTree* codelengthcodetree,
+ const unsigned char* in, size_t* bp, size_t inlength)
+{
+ /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/
+ /*C-code note: use no "return" between ctor and dtor of an uivector!*/
+ unsigned error = 0;
+ unsigned n, HLIT, HDIST, HCLEN, i;
+ uivector bitlen;
+ uivector bitlenD;
+ uivector codelengthcode;
+
+ if((*bp) >> 3 >= inlength - 2) { return 49; } /*the bit pointer is or will go past the memory*/
+
+ HLIT = readBitsFromStream(bp, in, 5) + 257; /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/
+ HDIST = readBitsFromStream(bp, in, 5) + 1; /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/
+ HCLEN = readBitsFromStream(bp, in, 4) + 4; /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/
+
+ /*read the code length codes out of 3 * (amount of code length codes) bits*/
+ uivector_init(&codelengthcode);
+ if(!uivector_resize(&codelengthcode, NUM_CODE_LENGTH_CODES)) error = 9911;
+
+ if(!error)
+ {
+ for(i = 0; i < NUM_CODE_LENGTH_CODES; i++)
+ {
+ if(i < HCLEN) codelengthcode.data[CLCL[i]] = readBitsFromStream(bp, in, 3);
+ else codelengthcode.data[CLCL[i]] = 0; /*if not, it must stay 0*/
+ }
+
+ error = HuffmanTree_makeFromLengths(codelengthcodetree, codelengthcode.data, codelengthcode.size, 7);
+ }
+
+ uivector_cleanup(&codelengthcode);
+ if(error) return error;
+
+ /*now we can use this tree to read the lengths for the tree that this function will return*/
+ uivector_init(&bitlen);
+ uivector_resizev(&bitlen, NUM_DEFLATE_CODE_SYMBOLS, 0);
+ uivector_init(&bitlenD);
+ uivector_resizev(&bitlenD, NUM_DISTANCE_SYMBOLS, 0);
+ i = 0;
+ if(!bitlen.data || !bitlenD.data) error = 9912;
+ else while(i < HLIT + HDIST) /*i is the current symbol we're reading in the part that contains the code lengths of lit/len codes and dist codes*/
+ {
+ unsigned code = huffmanDecodeSymbol(&error, in, bp, codelengthcodetree, inlength);
+ if(error) break;
+
+ if(code <= 15) /*a length code*/
+ {
+ if(i < HLIT) bitlen.data[i] = code;
+ else bitlenD.data[i - HLIT] = code;
+ i++;
+ }
+ else if(code == 16) /*repeat previous*/
+ {
+ unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/
+ unsigned value; /*set value to the previous code*/
+
+ if((*bp) >> 3 >= inlength) { error = 50; break; } /*error, bit pointer jumps past memory*/
+
+ replength += readBitsFromStream(bp, in, 2);
+
+ if((i - 1) < HLIT) value = bitlen.data[i - 1];
+ else value = bitlenD.data[i - HLIT - 1];
+ /*repeat this value in the next lengths*/
+ for(n = 0; n < replength; n++)
+ {
+ if(i >= HLIT + HDIST) { error = 13; break; } /*error: i is larger than the amount of codes*/
+ if(i < HLIT) bitlen.data[i] = value;
+ else bitlenD.data[i - HLIT] = value;
+ i++;
+ }
+ }
+ else if(code == 17) /*repeat "0" 3-10 times*/
+ {
+ unsigned replength = 3; /*read in the bits that indicate repeat length*/
+ if((*bp) >> 3 >= inlength) { error = 50; break; } /*error, bit pointer jumps past memory*/
+
+ replength += readBitsFromStream(bp, in, 3);
+
+ /*repeat this value in the next lengths*/
+ for(n = 0; n < replength; n++)
+ {
+ if(i >= HLIT + HDIST) { error = 14; break; } /*error: i is larger than the amount of codes*/
+ if(i < HLIT) bitlen.data[i] = 0;
+ else bitlenD.data[i - HLIT] = 0;
+ i++;
+ }
+ }
+ else if(code == 18) /*repeat "0" 11-138 times*/
+ {
+ unsigned replength = 11; /*read in the bits that indicate repeat length*/
+ if((*bp) >> 3 >= inlength) { error = 50; break; } /*error, bit pointer jumps past memory*/
+ replength += readBitsFromStream(bp, in, 7);
+
+ /*repeat this value in the next lengths*/
+ for(n = 0; n < replength; n++)
+ {
+ if(i >= HLIT + HDIST) { error = 15; break; } /*error: i is larger than the amount of codes*/
+ if(i < HLIT) bitlen.data[i] = 0;
+ else bitlenD.data[i - HLIT] = 0;
+ i++;
+ }
+ }
+ else { error = 16; break; } /*error: somehow an unexisting code appeared. This can never happen.*/
+ }
+
+ if(!error && bitlen.data[256] == 0) { error = 64; } /*the length of the end code 256 must be larger than 0*/
+
+ /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/
+ if(!error) error = HuffmanTree_makeFromLengths(codetree, &bitlen.data[0], bitlen.size, 15);
+ if(!error) error = HuffmanTree_makeFromLengths(codetreeD, &bitlenD.data[0], bitlenD.size, 15);
+
+ uivector_cleanup(&bitlen);
+ uivector_cleanup(&bitlenD);
+
+ return error;
+}
+
+/*inflate a block with dynamic of fixed Huffman tree*/
+static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength, unsigned btype)
+{
+ unsigned endreached = 0, error = 0;
+ HuffmanTree codetree; /*287, the code tree for Huffman codes*/
+ HuffmanTree codetreeD; /*31, the code tree for distance codes*/
+
+ HuffmanTree_init(&codetree);
+ HuffmanTree_init(&codetreeD);
+
+ if(btype == 1) getTreeInflateFixed(&codetree, &codetreeD);
+ else if(btype == 2)
+ {
+ HuffmanTree codelengthcodetree; /*18, the code tree for code length codes*/
+ HuffmanTree_init(&codelengthcodetree);
+ error = getTreeInflateDynamic(&codetree, &codetreeD, &codelengthcodetree, in, bp, inlength);
+ HuffmanTree_cleanup(&codelengthcodetree);
+ }
+
+ while(!endreached && !error)
+ {
+ unsigned code = huffmanDecodeSymbol(&error, in, bp, &codetree, inlength);
+ if(error) break; /*some error happened in the above function*/
+ if(code == 256) endreached = 1; /*end code*/
+ else if(code <= 255) /*literal symbol*/
+ {
+ if((*pos) >= out->size) ucvector_resize(out, ((*pos) + 1) * 2); /*reserve more room at once*/
+ if((*pos) >= out->size) { error = 9913; break; } /*not enough memory*/
+ out->data[(*pos)] = (unsigned char)(code);
+ (*pos)++;
+ }
+ else if(code >= FIRST_LENGTH_CODE_INDEX && code <= LAST_LENGTH_CODE_INDEX) /*length code*/
+ {
+ /*part 1: get length base*/
+ size_t length = LENGTHBASE[code - FIRST_LENGTH_CODE_INDEX];
+ unsigned codeD, distance, numextrabitsD;
+ size_t start, forward, backward, numextrabits;
+
+ /*part 2: get extra bits and add the value of that to length*/
+ numextrabits = LENGTHEXTRA[code - FIRST_LENGTH_CODE_INDEX];
+ if(((*bp) >> 3) >= inlength) { error = 51; break; } /*error, bit pointer will jump past memory*/
+ length += readBitsFromStream(bp, in, numextrabits);
+
+ /*part 3: get distance code*/
+ codeD = huffmanDecodeSymbol(&error, in, bp, &codetreeD, inlength);
+ if(error) break;
+ if(codeD > 29) { error = 18; break; } /*error: invalid distance code (30-31 are never used)*/
+ distance = DISTANCEBASE[codeD];
+
+ /*part 4: get extra bits from distance*/
+ numextrabitsD = DISTANCEEXTRA[codeD];
+ if(((*bp) >> 3) >= inlength) { error = 51; break; } /*error, bit pointer will jump past memory*/
+ distance += readBitsFromStream(bp, in, numextrabitsD);
+
+ /*part 5: fill in all the out[n] values based on the length and dist*/
+ start = (*pos);
+ backward = start - distance;
+ if((*pos) + length >= out->size) ucvector_resize(out, ((*pos) + length) * 2); /*reserve more room at once*/
+ if((*pos) + length >= out->size) { error = 9914; break; } /*not enough memory*/
+
+ for(forward = 0; forward < length; forward++)
+ {
+ out->data[(*pos)] = out->data[backward];
+ (*pos)++;
+ backward++;
+ if(backward >= start) backward = start - distance;
+ }
+ }
+ }
+
+ HuffmanTree_cleanup(&codetree);
+ HuffmanTree_cleanup(&codetreeD);
+
+ return error;
+}
+
+static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength)
+{
+ /*go to first boundary of byte*/
+ size_t p;
+ unsigned LEN, NLEN, n, error = 0;
+ while(((*bp) & 0x7) != 0) (*bp)++;
+ p = (*bp) / 8; /*byte position*/
+
+ /*read LEN (2 bytes) and NLEN (2 bytes)*/
+ if(p >= inlength - 4) return 52; /*error, bit pointer will jump past memory*/
+ LEN = in[p] + 256 * in[p + 1]; p += 2;
+ NLEN = in[p] + 256 * in[p + 1]; p += 2;
+
+ /*check if 16-bit NLEN is really the one's complement of LEN*/
+ if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/
+
+ if((*pos) + LEN >= out->size) { if(!ucvector_resize(out, (*pos) + LEN)) return 9915; }
+
+ /*read the literal data: LEN bytes are now stored in the out buffer*/
+ if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/
+ for(n = 0; n < LEN; n++) out->data[(*pos)++] = in[p++];
+
+ (*bp) = p * 8;
+
+ return error;
+}
+
+/*inflate the deflated data (cfr. deflate spec); return value is the error*/
+unsigned LodeFlate_inflate(ucvector* out, const unsigned char* in, size_t insize, size_t inpos)
+{
+ size_t bp = 0; /*bit pointer in the "in" data, current byte is bp >> 3, current bit is bp & 0x7 (from lsb to msb of the byte)*/
+ unsigned BFINAL = 0;
+ size_t pos = 0; /*byte position in the out buffer*/
+
+ unsigned error = 0;
+
+ while(!BFINAL)
+ {
+ unsigned BTYPE;
+ if((bp >> 3) >= insize) return 52; /*error, bit pointer will jump past memory*/
+ BFINAL = readBitFromStream(&bp, &in[inpos]);
+ BTYPE = 1 * readBitFromStream(&bp, &in[inpos]); BTYPE += 2 * readBitFromStream(&bp, &in[inpos]);
+
+ if(BTYPE == 3) return 20; /*error: invalid BTYPE*/
+ else if(BTYPE == 0) error = inflateNoCompression(out, &in[inpos], &bp, &pos, insize); /*no compression*/
+ else error = inflateHuffmanBlock(out, &in[inpos], &bp, &pos, insize, BTYPE); /*compression, BTYPE 01 or 10*/
+ if(error) return error;
+ }
+
+ if(!ucvector_resize(out, pos)) error = 9916; /*Only now we know the true size of out, resize it to that*/
+
+ return error;
+}
+
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+#ifdef LODEPNG_COMPILE_ENCODER
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Deflator / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258;
+
+/*bitlen is the size in bits of the code*/
+static void addHuffmanSymbol(size_t* bp, ucvector* compressed, unsigned code, unsigned bitlen)
+{
+ addBitsToStreamReversed(bp, compressed, code, bitlen);
+}
+
+/*search the index in the array, that has the largest value smaller than or equal to the given value, given array must be sorted (if no value is smaller, it returns the size of the given array)*/
+static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value)
+{
+ /*linear search implementation*/
+ /*for(size_t i = 1; i < array_size; i++) if(array[i] > value) return i - 1;
+ return array_size - 1;*/
+
+ /*binary search implementation (not that much faster) (precondition: array_size > 0)*/
+ size_t left = 1;
+ size_t right = array_size - 1;
+ while(left <= right)
+ {
+ size_t mid = (left + right) / 2;
+ if(array[mid] <= value) left = mid + 1; /*the value to find is more to the right*/
+ else if(array[mid - 1] > value) right = mid - 1; /*the value to find is more to the left*/
+ else return mid - 1;
+ }
+ return array_size - 1;
+}
+
+static void addLengthDistance(uivector* values, size_t length, size_t distance)
+{
+ /*values in encoded vector are those used by deflate:
+ 0-255: literal bytes
+ 256: end
+ 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits)
+ 286-287: invalid*/
+
+ unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length);
+ unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]);
+ unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance);
+ unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]);
+
+ uivector_push_back(values, length_code + FIRST_LENGTH_CODE_INDEX);
+ uivector_push_back(values, extra_length);
+ uivector_push_back(values, dist_code);
+ uivector_push_back(values, extra_distance);
+}
+
+#if 0
+/*the "brute force" version of the encodeLZ7 algorithm, not used anymore, kept here for reference*/
+static void encodeLZ77_brute(uivector* out, const unsigned char* in, size_t size, unsigned windowSize)
+{
+ size_t pos;
+ /*using pointer instead of vector for input makes it faster when NOT using optimization when compiling; no influence if optimization is used*/
+ for(pos = 0; pos < size; pos++)
+ {
+ size_t length = 0, offset = 0; /*the length and offset found for the current position*/
+ size_t max_offset = pos < windowSize ? pos : windowSize; /*how far back to test*/
+ size_t current_offset;
+
+ /**search for the longest string**/
+ for(current_offset = 1; current_offset < max_offset; current_offset++) /*search backwards through all possible distances (=offsets)*/
+ {
+ size_t backpos = pos - current_offset;
+ if(in[backpos] == in[pos])
+ {
+ /*test the next characters*/
+ size_t current_length = 1;
+ size_t backtest = backpos + 1;
+ size_t foretest = pos + 1;
+ while(foretest < size && in[backtest] == in[foretest] && current_length < MAX_SUPPORTED_DEFLATE_LENGTH) /*maximum supporte length by deflate is max length*/
+ {
+ if(backpos >= pos) backpos -= current_offset; /*continue as if we work on the decoded bytes after pos by jumping back before pos*/
+ current_length++;
+ backtest++;
+ foretest++;
+ }
+ if(current_length > length)
+ {
+ length = current_length; /*the longest length*/
+ offset = current_offset; /*the offset that is related to this longest length*/
+ if(current_length == MAX_SUPPORTED_DEFLATE_LENGTH) break; /*you can jump out of this for loop once a length of max length is found (gives significant speed gain)*/
+ }
+ }
+ }
+
+ /**encode it as length/distance pair or literal value**/
+ if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/
+ {
+ uivector_push_back(out, in[pos]);
+ }
+ else
+ {
+ addLengthDistance(out, length, offset);
+ pos += (length - 1);
+ }
+ } /*end of the loop through each character of input*/
+}
+#endif
+
+static const unsigned HASH_NUM_VALUES = 65536;
+static const unsigned HASH_NUM_CHARACTERS = 6;
+static const unsigned HASH_SHIFT = 2;
+/*
+Good and fast values: HASH_NUM_VALUES=65536, HASH_NUM_CHARACTERS=6, HASH_SHIFT=2
+making HASH_NUM_CHARACTERS larger (like 8), makes the file size larger but is a bit faster
+making HASH_NUM_CHARACTERS smaller (like 3), makes the file size smaller but is slower
+*/
+
+static unsigned getHash(const unsigned char* data, size_t size, size_t pos)
+{
+ unsigned result = 0;
+ size_t amount, i;
+ if(pos >= size) return 0;
+ amount = HASH_NUM_CHARACTERS; if(pos + amount >= size) amount = size - pos;
+ for(i = 0; i < amount; i++) result ^= (data[pos + i] << (i * HASH_SHIFT));
+ return result % HASH_NUM_VALUES;
+}
+
+/*LZ77-encode the data using a hash table technique to let it encode faster. Return value is error code*/
+static unsigned encodeLZ77(uivector* out, const unsigned char* in, size_t size, unsigned windowSize)
+{
+ /**generate hash table**/
+ vector table; /*HASH_NUM_VALUES uivectors; this represents what would be an std::vector<std::vector<unsigned> > in C++*/
+ uivector tablepos1, tablepos2;
+ unsigned pos, i, error = 0;
+
+ vector_init(&table, sizeof(uivector));
+ if(!vector_resize(&table, HASH_NUM_VALUES)) return 9917;
+ for(i = 0; i < HASH_NUM_VALUES; i++)
+ {
+ uivector* v = (uivector*)vector_get(&table, i);
+ uivector_init(v);
+ }
+
+ /*remember start and end positions in the tables to searching in*/
+ uivector_init(&tablepos1);
+ uivector_init(&tablepos2);
+ if(!uivector_resizev(&tablepos1, HASH_NUM_VALUES, 0)) error = 9918;
+ if(!uivector_resizev(&tablepos2, HASH_NUM_VALUES, 0)) error = 9919;
+
+ if(!error)
+ {
+ for(pos = 0; pos < size; pos++)
+ {
+ unsigned length = 0, offset = 0; /*the length and offset found for the current position*/
+ unsigned max_offset = pos < windowSize ? pos : windowSize; /*how far back to test*/
+ unsigned tablepos;
+
+ /*/search for the longest string*/
+ /*first find out where in the table to start (the first value that is in the range from "pos - max_offset" to "pos")*/
+ unsigned hash = getHash(in, size, pos);
+ if(!uivector_push_back((uivector*)vector_get(&table, hash), pos)) { error = 9920; break; }
+
+ while(((uivector*)vector_get(&table, hash))->data[tablepos1.data[hash]] < pos - max_offset) tablepos1.data[hash]++; /*it now points to the first value in the table for which the index is larger than or equal to pos - max_offset*/
+ while(((uivector*)vector_get(&table, hash))->data[tablepos2.data[hash]] < pos) tablepos2.data[hash]++; /*it now points to the first value in the table for which the index is larger than or equal to pos*/
+
+ for(tablepos = tablepos2.data[hash] - 1; tablepos >= tablepos1.data[hash] && tablepos < tablepos2.data[hash]; tablepos--)
+ {
+ unsigned backpos = ((uivector*)vector_get(&table, hash))->data[tablepos];
+ unsigned current_offset = pos - backpos;
+
+ /*test the next characters*/
+ unsigned current_length = 0;
+ unsigned backtest = backpos;
+ unsigned foretest = pos;
+ while(foretest < size && in[backtest] == in[foretest] && current_length < MAX_SUPPORTED_DEFLATE_LENGTH) /*maximum supporte length by deflate is max length*/
+ {
+ if(backpos >= pos) backpos -= current_offset; /*continue as if we work on the decoded bytes after pos by jumping back before pos*/
+ current_length++;
+ backtest++;
+ foretest++;
+ }
+ if(current_length > length)
+ {
+ length = current_length; /*the longest length*/
+ offset = current_offset; /*the offset that is related to this longest length*/
+ if(current_length == MAX_SUPPORTED_DEFLATE_LENGTH) break; /*you can jump out of this for loop once a length of max length is found (gives significant speed gain)*/
+ }
+ }
+
+ /**encode it as length/distance pair or literal value**/
+ if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/
+ {
+ if(!uivector_push_back(out, in[pos])) { error = 9921; break; }
+ }
+ else
+ {
+ unsigned j;
+ addLengthDistance(out, length, offset);
+ for(j = 0; j < length - 1; j++)
+ {
+ pos++;
+ if(!uivector_push_back((uivector*)vector_get(&table, getHash(in, size, pos)), pos)) { error = 9922; break; }
+ }
+ }
+ } /*end of the loop through each character of input*/
+ } /*end of "if(!error)"*/
+
+ /*cleanup*/
+ for(i = 0; i < table.size; i++)
+ {
+ uivector* v = (uivector*)vector_get(&table, i);
+ uivector_cleanup(v);
+ }
+ vector_cleanup(&table);
+ uivector_cleanup(&tablepos1);
+ uivector_cleanup(&tablepos2);
+ return error;
+}
+
+/* /////////////////////////////////////////////////////////////////////////// */
+
+static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize)
+{
+ /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/
+
+ size_t i, j, numdeflateblocks = datasize / 65536 + 1;
+ unsigned datapos = 0;
+ for(i = 0; i < numdeflateblocks; i++)
+ {
+ unsigned BFINAL, BTYPE, LEN, NLEN;
+ unsigned char firstbyte;
+
+ BFINAL = (i == numdeflateblocks - 1);
+ BTYPE = 0;
+
+ firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1) << 1) + ((BTYPE & 2) << 1));
+ ucvector_push_back(out, firstbyte);
+
+ LEN = 65535;
+ if(datasize - datapos < 65535) LEN = (unsigned)datasize - datapos;
+ NLEN = 65535 - LEN;
+
+ ucvector_push_back(out, (unsigned char)(LEN % 256));
+ ucvector_push_back(out, (unsigned char)(LEN / 256));
+ ucvector_push_back(out, (unsigned char)(NLEN % 256));
+ ucvector_push_back(out, (unsigned char)(NLEN / 256));
+
+ /*Decompressed data*/
+ for(j = 0; j < 65535 && datapos < datasize; j++)
+ {
+ ucvector_push_back(out, data[datapos++]);
+ }
+ }
+
+ return 0;
+}
+
+/*write the encoded data, using lit/len as well as distance codes*/
+static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encoded, const HuffmanTree* codes, const HuffmanTree* codesD)
+{
+ size_t i = 0;
+ for(i = 0; i < lz77_encoded->size; i++)
+ {
+ unsigned val = lz77_encoded->data[i];
+ addHuffmanSymbol(bp, out, HuffmanTree_getCode(codes, val), HuffmanTree_getLength(codes, val));
+ if(val > 256) /*for a length code, 3 more things have to be added*/
+ {
+ unsigned length_index = val - FIRST_LENGTH_CODE_INDEX;
+ unsigned n_length_extra_bits = LENGTHEXTRA[length_index];
+ unsigned length_extra_bits = lz77_encoded->data[++i];
+
+ unsigned distance_code = lz77_encoded->data[++i];
+
+ unsigned distance_index = distance_code;
+ unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index];
+ unsigned distance_extra_bits = lz77_encoded->data[++i];
+
+ addBitsToStream(bp, out, length_extra_bits, n_length_extra_bits);
+ addHuffmanSymbol(bp, out, HuffmanTree_getCode(codesD, distance_code), HuffmanTree_getLength(codesD, distance_code));
+ addBitsToStream(bp, out, distance_extra_bits, n_distance_extra_bits);
+ }
+ }
+}
+
+static unsigned deflateDynamic(ucvector* out, const unsigned char* data, size_t datasize, const LodeZlib_DeflateSettings* settings)
+{
+ /*
+ after the BFINAL and BTYPE, the dynamic block consists out of the following:
+ - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN
+ - (HCLEN+4)*3 bits code lengths of code length alphabet
+ - HLIT + 257 code lenghts of lit/length alphabet (encoded using the code length alphabet, + possible repetition codes 16, 17, 18)
+ - HDIST + 1 code lengths of distance alphabet (encoded using the code length alphabet, + possible repetition codes 16, 17, 18)
+ - compressed data
+ - 256 (end code)
+ */
+
+ unsigned error = 0;
+
+ uivector lz77_encoded;
+ HuffmanTree codes; /*tree for literal values and length codes*/
+ HuffmanTree codesD; /*tree for distance codes*/
+ HuffmanTree codelengthcodes;
+ uivector frequencies;
+ uivector frequenciesD;
+ uivector amounts; /*the amounts in the "normal" order*/
+ uivector lldl;
+ uivector lldll; /*lit/len & dist code lenghts*/
+ uivector clcls;
+
+ unsigned BFINAL = 1; /*make only one block... the first and final one*/
+ size_t numcodes, numcodesD, i, bp = 0; /*the bit pointer*/
+ unsigned HLIT, HDIST, HCLEN;
+
+ uivector_init(&lz77_encoded);
+ HuffmanTree_init(&codes);
+ HuffmanTree_init(&codesD);
+ HuffmanTree_init(&codelengthcodes);
+ uivector_init(&frequencies);
+ uivector_init(&frequenciesD);
+ uivector_init(&amounts);
+ uivector_init(&lldl);
+ uivector_init(&lldll);
+ uivector_init(&clcls);
+
+ while(!error) /*the goto-avoiding while construct: break out to go to the cleanup phase, a break at the end makes sure the while is never repeated*/
+ {
+ if(settings->useLZ77)
+ {
+ error = encodeLZ77(&lz77_encoded, data, datasize, settings->windowSize); /*LZ77 encoded*/
+ if(error) break;
+ }
+ else
+ {
+ if(!uivector_resize(&lz77_encoded, datasize)) { error = 9923; break; }
+ for(i = 0; i < datasize; i++) lz77_encoded.data[i] = data[i]; /*no LZ77, but still will be Huffman compressed*/
+ }
+
+ if(!uivector_resizev(&frequencies, 286, 0)) { error = 9924; break; }
+ if(!uivector_resizev(&frequenciesD, 30, 0)) { error = 9925; break; }
+ for(i = 0; i < lz77_encoded.size; i++)
+ {
+ unsigned symbol = lz77_encoded.data[i];
+ frequencies.data[symbol]++;
+ if(symbol > 256)
+ {
+ unsigned dist = lz77_encoded.data[i + 2];
+ frequenciesD.data[dist]++;
+ i += 3;
+ }
+ }
+ frequencies.data[256] = 1; /*there will be exactly 1 end code, at the end of the block*/
+
+ error = HuffmanTree_makeFromFrequencies(&codes, frequencies.data, frequencies.size, 15);
+ if(error) break;
+ error = HuffmanTree_makeFromFrequencies(&codesD, frequenciesD.data, frequenciesD.size, 15);
+ if(error) break;
+
+ addBitToStream(&bp, out, BFINAL);
+ addBitToStream(&bp, out, 0); /*first bit of BTYPE "dynamic"*/
+ addBitToStream(&bp, out, 1); /*second bit of BTYPE "dynamic"*/
+
+ numcodes = codes.numcodes; if(numcodes > 286) numcodes = 286;
+ numcodesD = codesD.numcodes; if(numcodesD > 30) numcodesD = 30;
+ for(i = 0; i < numcodes; i++) uivector_push_back(&lldll, HuffmanTree_getLength(&codes, (unsigned)i));
+ for(i = 0; i < numcodesD; i++) uivector_push_back(&lldll, HuffmanTree_getLength(&codesD, (unsigned)i));
+
+ /*make lldl smaller by using repeat codes 16 (copy length 3-6 times), 17 (3-10 zeroes), 18 (11-138 zeroes)*/
+ for(i = 0; i < (unsigned)lldll.size; i++)
+ {
+ unsigned j = 0;
+ while(i + j + 1 < (unsigned)lldll.size && lldll.data[i + j + 1] == lldll.data[i]) j++;
+
+ if(lldll.data[i] == 0 && j >= 2)
+ {
+ j++; /*include the first zero*/
+ if(j <= 10) { uivector_push_back(&lldl, 17); uivector_push_back(&lldl, j - 3); }
+ else
+ {
+ if(j > 138) j = 138;
+ uivector_push_back(&lldl, 18); uivector_push_back(&lldl, j - 11);
+ }
+ i += (j - 1);
+ }
+ else if(j >= 3)
+ {
+ size_t k;
+ unsigned num = j / 6, rest = j % 6;
+ uivector_push_back(&lldl, lldll.data[i]);
+ for(k = 0; k < num; k++) { uivector_push_back(&lldl, 16); uivector_push_back(&lldl, 6 - 3); }
+ if(rest >= 3) { uivector_push_back(&lldl, 16); uivector_push_back(&lldl, rest - 3); }
+ else j -= rest;
+ i += j;
+ }
+ else uivector_push_back(&lldl, lldll.data[i]);
+ }
+
+ /*generate huffmantree for the length codes of lit/len and dist codes*/
+ if(!uivector_resizev(&amounts, 19, 0)) { error = 9926; break; } /*16 possible lengths (0-15) and 3 repeat codes (16, 17 and 18)*/
+ for(i = 0; i < lldl.size; i++)
+ {
+ amounts.data[lldl.data[i]]++;
+ if(lldl.data[i] >= 16) i++; /*after a repeat code come the bits that specify the amount, those don't need to be in the amounts calculation*/
+ }
+
+ error = HuffmanTree_makeFromFrequencies(&codelengthcodes, amounts.data, amounts.size, 7);
+ if(error) break;
+
+ if(!uivector_resize(&clcls, 19)) { error = 9927; break; }
+ for(i = 0; i < 19; i++) clcls.data[i] = HuffmanTree_getLength(&codelengthcodes, CLCL[i]); /*lenghts of code length tree is in the order as specified by deflate*/
+ while(clcls.data[clcls.size - 1] == 0 && clcls.size > 4)
+ {
+ if(!uivector_resize(&clcls, clcls.size - 1)) { error = 9928; break; } /*remove zeros at the end, but minimum size must be 4*/
+ }
+ if(error) break;
+
+ /*write the HLIT, HDIST and HCLEN values*/
+ HLIT = (unsigned)(numcodes - 257);
+ HDIST = (unsigned)(numcodesD - 1);
+ HCLEN = (unsigned)clcls.size - 4;
+ addBitsToStream(&bp, out, HLIT, 5);
+ addBitsToStream(&bp, out, HDIST, 5);
+ addBitsToStream(&bp, out, HCLEN, 4);
+
+ /*write the code lenghts of the code length alphabet*/
+ for(i = 0; i < HCLEN + 4; i++) addBitsToStream(&bp, out, clcls.data[i], 3);
+
+ /*write the lenghts of the lit/len AND the dist alphabet*/
+ for(i = 0; i < lldl.size; i++)
+ {
+ addHuffmanSymbol(&bp, out, HuffmanTree_getCode(&codelengthcodes, lldl.data[i]), HuffmanTree_getLength(&codelengthcodes, lldl.data[i]));
+ /*extra bits of repeat codes*/
+ if(lldl.data[i] == 16) addBitsToStream(&bp, out, lldl.data[++i], 2);
+ else if(lldl.data[i] == 17) addBitsToStream(&bp, out, lldl.data[++i], 3);
+ else if(lldl.data[i] == 18) addBitsToStream(&bp, out, lldl.data[++i], 7);
+ }
+
+ /*write the compressed data symbols*/
+ writeLZ77data(&bp, out, &lz77_encoded, &codes, &codesD);
+ if(HuffmanTree_getLength(&codes, 256) == 0) { error = 64; break; } /*the length of the end code 256 must be larger than 0*/
+ addHuffmanSymbol(&bp, out, HuffmanTree_getCode(&codes, 256), HuffmanTree_getLength(&codes, 256)); /*end code*/
+
+ break; /*end of error-while*/
+ }
+
+ /*cleanup*/
+ uivector_cleanup(&lz77_encoded);
+ HuffmanTree_cleanup(&codes);
+ HuffmanTree_cleanup(&codesD);
+ HuffmanTree_cleanup(&codelengthcodes);
+ uivector_cleanup(&frequencies);
+ uivector_cleanup(&frequenciesD);
+ uivector_cleanup(&amounts);
+ uivector_cleanup(&lldl);
+ uivector_cleanup(&lldll);
+ uivector_cleanup(&clcls);
+
+ return error;
+}
+
+static unsigned deflateFixed(ucvector* out, const unsigned char* data, size_t datasize, const LodeZlib_DeflateSettings* settings)
+{
+ HuffmanTree codes; /*tree for literal values and length codes*/
+ HuffmanTree codesD; /*tree for distance codes*/
+
+ unsigned BFINAL = 1; /*make only one block... the first and final one*/
+ unsigned error = 0;
+ size_t i, bp = 0; /*the bit pointer*/
+
+ HuffmanTree_init(&codes);
+ HuffmanTree_init(&codesD);
+
+ generateFixedTree(&codes);
+ generateDistanceTree(&codesD);
+
+ addBitToStream(&bp, out, BFINAL);
+ addBitToStream(&bp, out, 1); /*first bit of BTYPE*/
+ addBitToStream(&bp, out, 0); /*second bit of BTYPE*/
+
+ if(settings->useLZ77) /*LZ77 encoded*/
+ {
+ uivector lz77_encoded;
+ uivector_init(&lz77_encoded);
+ error = encodeLZ77(&lz77_encoded, data, datasize, settings->windowSize);
+ if(!error) writeLZ77data(&bp, out, &lz77_encoded, &codes, &codesD);
+ uivector_cleanup(&lz77_encoded);
+ }
+ else /*no LZ77, but still will be Huffman compressed*/
+ {
+ for(i = 0; i < datasize; i++) addHuffmanSymbol(&bp, out, HuffmanTree_getCode(&codes, data[i]), HuffmanTree_getLength(&codes, data[i]));
+ }
+ if(!error) addHuffmanSymbol(&bp, out, HuffmanTree_getCode(&codes, 256), HuffmanTree_getLength(&codes, 256)); /*"end" code*/
+
+ /*cleanup*/
+ HuffmanTree_cleanup(&codes);
+ HuffmanTree_cleanup(&codesD);
+
+ return error;
+}
+
+unsigned LodeFlate_deflate(ucvector* out, const unsigned char* data, size_t datasize, const LodeZlib_DeflateSettings* settings)
+{
+ unsigned error = 0;
+ if(settings->btype == 0) error = deflateNoCompression(out, data, datasize);
+ else if(settings->btype == 1) error = deflateFixed(out, data, datasize, settings);
+ else if(settings->btype == 2) error = deflateDynamic(out, data, datasize, settings);
+ else error = 61;
+ return error;
+}
+
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Adler32 */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len)
+{
+ unsigned s1 = adler & 0xffff;
+ unsigned s2 = (adler >> 16) & 0xffff;
+
+ while(len > 0)
+ {
+ /*at least 5550 sums can be done before the sums overflow, saving us from a lot of module divisions*/
+ unsigned amount = len > 5550 ? 5550 : len;
+ len -= amount;
+ while(amount > 0)
+ {
+ s1 = (s1 + *data++);
+ s2 = (s2 + s1);
+ amount--;
+ }
+ s1 %= 65521;
+ s2 %= 65521;
+ }
+
+ return (s2 << 16) | s1;
+}
+
+/*Return the adler32 of the bytes data[0..len-1]*/
+static unsigned adler32(const unsigned char* data, unsigned len)
+{
+ return update_adler32(1L, data, len);
+}
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Reading and writing single bits and bytes from/to stream for Zlib / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_ENCODER
+void LodeZlib_add32bitInt(ucvector* buffer, unsigned value)
+{
+ ucvector_push_back(buffer, (unsigned char)((value >> 24) & 0xff));
+ ucvector_push_back(buffer, (unsigned char)((value >> 16) & 0xff));
+ ucvector_push_back(buffer, (unsigned char)((value >> 8) & 0xff));
+ ucvector_push_back(buffer, (unsigned char)((value ) & 0xff));
+}
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+unsigned LodeZlib_read32bitInt(const unsigned char* buffer)
+{
+ return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];
+}
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Zlib / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_DECODER
+
+unsigned LodeZlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodeZlib_DecompressSettings* settings)
+{
+ unsigned error = 0;
+ unsigned CM, CINFO, FDICT;
+ ucvector outv;
+
+ if(insize < 2) { error = 53; return error; } /*error, size of zlib data too small*/
+ /*read information from zlib header*/
+ if((in[0] * 256 + in[1]) % 31 != 0) { error = 24; return error; } /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/
+
+ CM = in[0] & 15;
+ CINFO = (in[0] >> 4) & 15;
+ /*FCHECK = in[1] & 31; //FCHECK is already tested above*/
+ FDICT = (in[1] >> 5) & 1;
+ /*FLEVEL = (in[1] >> 6) & 3; //not really important, all it does it to give a compiler warning about unused variable, we don't care what encoding setting the encoder used*/
+
+ if(CM != 8 || CINFO > 7) { error = 25; return error; } /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/
+ if(FDICT != 0) { error = 26; return error; } /*error: the specification of PNG says about the zlib stream: "The additional flags shall not specify a preset dictionary."*/
+
+ ucvector_init_buffer(&outv, *out, *outsize); /*ucvector-controlled version of the output buffer, for dynamic array*/
+ error = LodeFlate_inflate(&outv, in, insize, 2);
+ *out = outv.data;
+ *outsize = outv.size;
+ if(error) return error;
+
+ if(!settings->ignoreAdler32)
+ {
+ unsigned ADLER32 = LodeZlib_read32bitInt(&in[insize - 4]);
+ unsigned checksum = adler32(outv.data, (unsigned)outv.size);
+ if(checksum != ADLER32) { error = 58; return error; }
+ }
+
+ return error;
+}
+
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+#ifdef LODEPNG_COMPILE_ENCODER
+
+unsigned LodeZlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodeZlib_DeflateSettings* settings)
+{
+ /*initially, *out must be NULL and outsize 0, if you just give some random *out that's pointing to a non allocated buffer, this'll crash*/
+ ucvector deflatedata, outv;
+ size_t i;
+ unsigned error;
+
+ unsigned ADLER32;
+ /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/
+ unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/
+ unsigned FLEVEL = 0;
+ unsigned FDICT = 0;
+ unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64;
+ unsigned FCHECK = 31 - CMFFLG % 31;
+ CMFFLG += FCHECK;
+
+ ucvector_init_buffer(&outv, *out, *outsize); /*ucvector-controlled version of the output buffer, for dynamic array*/
+
+ ucvector_push_back(&outv, (unsigned char)(CMFFLG / 256));
+ ucvector_push_back(&outv, (unsigned char)(CMFFLG % 256));
+
+ ucvector_init(&deflatedata);
+ error = LodeFlate_deflate(&deflatedata, in, insize, settings);
+
+ if(!error)
+ {
+ ADLER32 = adler32(in, (unsigned)insize);
+ for(i = 0; i < deflatedata.size; i++) ucvector_push_back(&outv, deflatedata.data[i]);
+ ucvector_cleanup(&deflatedata);
+ LodeZlib_add32bitInt(&outv, ADLER32);
+ }
+
+ *out = outv.data;
+ *outsize = outv.size;
+
+ return error;
+}
+
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+#endif /*LODEPNG_COMPILE_ZLIB*/
+
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_ENCODER
+
+void LodeZlib_DeflateSettings_init(LodeZlib_DeflateSettings* settings)
+{
+ settings->btype = 2; /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/
+ settings->useLZ77 = 1;
+ settings->windowSize = 2048; /*this is a good tradeoff between speed and compression ratio*/
+}
+
+const LodeZlib_DeflateSettings LodeZlib_defaultDeflateSettings = {2, 1, 2048};
+
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+#ifdef LODEPNG_COMPILE_DECODER
+
+void LodeZlib_DecompressSettings_init(LodeZlib_DecompressSettings* settings)
+{
+ settings->ignoreAdler32 = 0;
+}
+
+const LodeZlib_DecompressSettings LodeZlib_defaultDecompressSettings = {0};
+
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* ////////////////////////////////////////////////////////////////////////// */
+/* ////////////////////////////////////////////////////////////////////////// */
+/* ////////////////////////////////////////////////////////////////////////// */
+/* ////////////////////////////////////////////////////////////////////////// */
+/* // End of Zlib related code, now comes the PNG related code that uses it// */
+/* ////////////////////////////////////////////////////////////////////////// */
+/* ////////////////////////////////////////////////////////////////////////// */
+/* ////////////////////////////////////////////////////////////////////////// */
+/* ////////////////////////////////////////////////////////////////////////// */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_PNG
+
+/*
+The two functions below (LodePNG_decompress and LodePNG_compress) directly call the
+LodeZlib_decompress and LodeZlib_compress functions. The only purpose of the functions
+below, is to provide the ability to let LodePNG use a different Zlib encoder by only
+changing the two functions below, instead of changing it inside the vareous places
+in the other LodePNG functions.
+
+*out must be NULL and *outsize must be 0 initially, and after the function is done,
+*out must point to the decompressed data, *outsize must be the size of it, and must
+be the size of the useful data in bytes, not the alloc size.
+*/
+
+#ifdef LODEPNG_COMPILE_DECODER
+static unsigned LodePNG_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodeZlib_DecompressSettings* settings)
+{
+ return LodeZlib_decompress(out, outsize, in, insize, settings);
+}
+#endif /*LODEPNG_COMPILE_DECODER*/
+#ifdef LODEPNG_COMPILE_ENCODER
+static unsigned LodePNG_compress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodeZlib_DeflateSettings* settings)
+{
+ return LodeZlib_compress(out, outsize, in, insize, settings);
+}
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / CRC32 / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+static unsigned Crc32_crc_table_computed = 0;
+static unsigned Crc32_crc_table[256];
+
+/*Make the table for a fast CRC.*/
+static void Crc32_make_crc_table(void)
+{
+ unsigned c, k, n;
+ for(n = 0; n < 256; n++)
+ {
+ c = n;
+ for(k = 0; k < 8; k++)
+ {
+ if(c & 1) c = 0xedb88320L ^ (c >> 1);
+ else c = c >> 1;
+ }
+ Crc32_crc_table[n] = c;
+ }
+ Crc32_crc_table_computed = 1;
+}
+
+/*Update a running CRC with the bytes buf[0..len-1]--the CRC should be
+initialized to all 1's, and the transmitted value is the 1's complement of the
+final running CRC (see the crc() routine below).*/
+static unsigned Crc32_update_crc(const unsigned char* buf, unsigned crc, size_t len)
+{
+ unsigned c = crc;
+ size_t n;
+
+ if(!Crc32_crc_table_computed) Crc32_make_crc_table();
+ for(n = 0; n < len; n++)
+ {
+ c = Crc32_crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
+ }
+ return c;
+}
+
+/*Return the CRC of the bytes buf[0..len-1].*/
+static unsigned Crc32_crc(const unsigned char* buf, size_t len)
+{
+ return Crc32_update_crc(buf, 0xffffffffL, len) ^ 0xffffffffL;
+}
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Reading and writing single bits and bytes from/to stream for LodePNG / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream)
+{
+ unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1);
+ (*bitpointer)++;
+ return result;
+}
+
+static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits)
+{
+ unsigned result = 0;
+ size_t i;
+ for(i = nbits - 1; i < nbits; i--) result += (unsigned)readBitFromReversedStream(bitpointer, bitstream) << i;
+ return result;
+}
+
+#ifdef LODEPNG_COMPILE_DECODER
+static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream, unsigned char bit)
+{
+ /*the current bit in bitstream must be 0 for this to work*/
+ if(bit) bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7))); /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/
+ (*bitpointer)++;
+}
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit)
+{
+ /*the current bit in bitstream may be 0 or 1 for this to work*/
+ if(bit == 0) bitstream[(*bitpointer) >> 3] &= (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7))));
+ else bitstream[(*bitpointer) >> 3] |= (1 << (7 - ((*bitpointer) & 0x7)));
+ (*bitpointer)++;
+}
+
+static unsigned LodePNG_read32bitInt(const unsigned char* buffer)
+{
+ return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];
+}
+
+static void LodePNG_set32bitInt(unsigned char* buffer, unsigned value) /*buffer must have at least 4 allocated bytes available*/
+{
+ buffer[0] = (unsigned char)((value >> 24) & 0xff);
+ buffer[1] = (unsigned char)((value >> 16) & 0xff);
+ buffer[2] = (unsigned char)((value >> 8) & 0xff);
+ buffer[3] = (unsigned char)((value ) & 0xff);
+}
+
+#ifdef LODEPNG_COMPILE_ENCODER
+static void LodePNG_add32bitInt(ucvector* buffer, unsigned value)
+{
+ ucvector_resize(buffer, buffer->size + 4);
+ LodePNG_set32bitInt(&buffer->data[buffer->size - 4], value);
+}
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / PNG chunks / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+unsigned LodePNG_chunk_length(const unsigned char* chunk) /*get the length of the data of the chunk. Total chunk length has 12 bytes more.*/
+{
+ return LodePNG_read32bitInt(&chunk[0]);
+}
+
+void LodePNG_chunk_type(char type[5], const unsigned char* chunk) /*puts the 4-byte type in null terminated string*/
+{
+ unsigned i;
+ for(i = 0; i < 4; i++) type[i] = chunk[4 + i];
+ type[4] = 0; /*null termination char*/
+}
+
+unsigned char LodePNG_chunk_type_equals(const unsigned char* chunk, const char* type) /*check if the type is the given type*/
+{
+ if(strlen(type) != 4) return 0;
+ return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]);
+}
+
+/*properties of PNG chunks gotten from capitalization of chunk type name, as defined by the standard*/
+unsigned char LodePNG_chunk_critical(const unsigned char* chunk) /*0: ancillary chunk, 1: it's one of the critical chunk types*/
+{
+ return((chunk[4] & 32) == 0);
+}
+
+unsigned char LodePNG_chunk_private(const unsigned char* chunk) /*0: public, 1: private*/
+{
+ return((chunk[6] & 32) != 0);
+}
+
+unsigned char LodePNG_chunk_safetocopy(const unsigned char* chunk) /*0: the chunk is unsafe to copy, 1: the chunk is safe to copy*/
+{
+ return((chunk[7] & 32) != 0);
+}
+
+unsigned char* LodePNG_chunk_data(unsigned char* chunk) /*get pointer to the data of the chunk*/
+{
+ return &chunk[8];
+}
+
+const unsigned char* LodePNG_chunk_data_const(const unsigned char* chunk) /*get pointer to the data of the chunk*/
+{
+ return &chunk[8];
+}
+
+unsigned LodePNG_chunk_check_crc(const unsigned char* chunk) /*returns 0 if the crc is correct, error code if it's incorrect*/
+{
+ unsigned length = LodePNG_chunk_length(chunk);
+ unsigned CRC = LodePNG_read32bitInt(&chunk[length + 8]);
+ unsigned checksum = Crc32_crc(&chunk[4], length + 4); /*the CRC is taken of the data and the 4 chunk type letters, not the length*/
+ if(CRC != checksum) return 1;
+ else return 0;
+}
+
+void LodePNG_chunk_generate_crc(unsigned char* chunk) /*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/
+{
+ unsigned length = LodePNG_chunk_length(chunk);
+ unsigned CRC = Crc32_crc(&chunk[4], length + 4);
+ LodePNG_set32bitInt(chunk + 8 + length, CRC);
+}
+
+unsigned char* LodePNG_chunk_next(unsigned char* chunk) /*don't use on IEND chunk, as there is no next chunk then*/
+{
+ unsigned total_chunk_length = LodePNG_chunk_length(chunk) + 12;
+ return &chunk[total_chunk_length];
+}
+
+const unsigned char* LodePNG_chunk_next_const(const unsigned char* chunk) /*don't use on IEND chunk, as there is no next chunk then*/
+{
+ unsigned total_chunk_length = LodePNG_chunk_length(chunk) + 12;
+ return &chunk[total_chunk_length];
+}
+
+unsigned LodePNG_append_chunk(unsigned char** out, size_t* outlength, const unsigned char* chunk) /*appends chunk that was already created, to the data. Returns error code.*/
+{
+ unsigned i;
+ unsigned total_chunk_length = LodePNG_chunk_length(chunk) + 12;
+ unsigned char *chunk_start, *new_buffer;
+ size_t new_length = (*outlength) + total_chunk_length;
+ if(new_length < total_chunk_length || new_length < (*outlength)) return 77; /*integer overflow happened*/
+
+ new_buffer = (unsigned char*)realloc(*out, new_length);
+ if(!new_buffer) return 9929;
+ (*out) = new_buffer;
+ (*outlength) = new_length;
+ chunk_start = &(*out)[new_length - total_chunk_length];
+
+ for(i = 0; i < total_chunk_length; i++) chunk_start[i] = chunk[i];
+
+ return 0;
+}
+
+unsigned LodePNG_create_chunk(unsigned char** out, size_t* outlength, unsigned length, const char* type, const unsigned char* data) /*appends new chunk to out. Returns error code; may change memory address of out buffer*/
+{
+ unsigned i;
+ unsigned char *chunk, *new_buffer;
+ size_t new_length = (*outlength) + length + 12;
+ if(new_length < length + 12 || new_length < (*outlength)) return 77; /*integer overflow happened*/
+ new_buffer = (unsigned char*)realloc(*out, new_length);
+ if(!new_buffer) return 9930;
+ (*out) = new_buffer;
+ (*outlength) = new_length;
+ chunk = &(*out)[(*outlength) - length - 12];
+
+ /*1: length*/
+ LodePNG_set32bitInt(chunk, (unsigned)length);
+
+ /*2: chunk name (4 letters)*/
+ chunk[4] = type[0];
+ chunk[5] = type[1];
+ chunk[6] = type[2];
+ chunk[7] = type[3];
+
+ /*3: the data*/
+ for(i = 0; i < length; i++) chunk[8 + i] = data[i];
+
+ /*4: CRC (of the chunkname characters and the data)*/
+ LodePNG_chunk_generate_crc(chunk);
+
+ return 0;
+}
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / Color types and such / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/*return type is a LodePNG error code*/
+static unsigned checkColorValidity(unsigned colorType, unsigned bd) /*bd = bitDepth*/
+{
+ switch(colorType)
+ {
+ case 0: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; /*grey*/
+ case 2: if(!( bd == 8 || bd == 16)) return 37; break; /*RGB*/
+ case 3: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; /*palette*/
+ case 4: if(!( bd == 8 || bd == 16)) return 37; break; /*grey + alpha*/
+ case 6: if(!( bd == 8 || bd == 16)) return 37; break; /*RGBA*/
+ default: return 31;
+ }
+ return 0; /*allowed color type / bits combination*/
+}
+
+static unsigned getNumColorChannels(unsigned colorType)
+{
+ switch(colorType)
+ {
+ case 0: return 1; /*grey*/
+ case 2: return 3; /*RGB*/
+ case 3: return 1; /*palette*/
+ case 4: return 2; /*grey + alpha*/
+ case 6: return 4; /*RGBA*/
+ }
+ return 0; /*unexisting color type*/
+}
+
+static unsigned getBpp(unsigned colorType, unsigned bitDepth)
+{
+ return getNumColorChannels(colorType) * bitDepth; /*bits per pixel is amount of channels * bits per channel*/
+}
+
+/* ////////////////////////////////////////////////////////////////////////// */
+
+void LodePNG_InfoColor_init(LodePNG_InfoColor* info)
+{
+ info->key_defined = 0;
+ info->key_r = info->key_g = info->key_b = 0;
+ info->colorType = 6;
+ info->bitDepth = 8;
+ info->palette = 0;
+ info->palettesize = 0;
+}
+
+void LodePNG_InfoColor_cleanup(LodePNG_InfoColor* info)
+{
+ LodePNG_InfoColor_clearPalette(info);
+}
+
+void LodePNG_InfoColor_clearPalette(LodePNG_InfoColor* info)
+{
+ if(info->palette) free(info->palette);
+ info->palettesize = 0;
+}
+
+unsigned LodePNG_InfoColor_addPalette(LodePNG_InfoColor* info, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
+{
+ unsigned char* data;
+ /*the same resize technique as C++ std::vectors is used, and here it's made so that for a palette with the max of 256 colors, it'll have the exact alloc size*/
+ if(!(info->palettesize & (info->palettesize - 1))) /*if palettesize is 0 or a power of two*/
+ {
+ /*allocated data must be at least 4* palettesize (for 4 color bytes)*/
+ size_t alloc_size = info->palettesize == 0 ? 4 : info->palettesize * 4 * 2;
+ data = (unsigned char*)realloc(info->palette, alloc_size);
+ if(!data) return 9931;
+ else info->palette = data;
+ }
+ info->palette[4 * info->palettesize + 0] = r;
+ info->palette[4 * info->palettesize + 1] = g;
+ info->palette[4 * info->palettesize + 2] = b;
+ info->palette[4 * info->palettesize + 3] = a;
+ info->palettesize++;
+ return 0;
+}
+
+unsigned LodePNG_InfoColor_getBpp(const LodePNG_InfoColor* info) { return getBpp(info->colorType, info->bitDepth); } /*calculate bits per pixel out of colorType and bitDepth*/
+unsigned LodePNG_InfoColor_getChannels(const LodePNG_InfoColor* info) { return getNumColorChannels(info->colorType); }
+unsigned LodePNG_InfoColor_isGreyscaleType(const LodePNG_InfoColor* info) { return info->colorType == 0 || info->colorType == 4; }
+unsigned LodePNG_InfoColor_isAlphaType(const LodePNG_InfoColor* info) { return (info->colorType & 4) != 0; }
+
+unsigned LodePNG_InfoColor_equal(const LodePNG_InfoColor* info1, const LodePNG_InfoColor* info2)
+{
+ return info1->colorType == info2->colorType
+ && info1->bitDepth == info2->bitDepth; /*palette and color key not compared*/
+}
+
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+
+void LodePNG_UnknownChunks_init(LodePNG_UnknownChunks* chunks)
+{
+ unsigned i;
+ for(i = 0; i < 3; i++) chunks->data[i] = 0;
+ for(i = 0; i < 3; i++) chunks->datasize[i] = 0;
+}
+
+void LodePNG_UnknownChunks_cleanup(LodePNG_UnknownChunks* chunks)
+{
+ unsigned i;
+ for(i = 0; i < 3; i++) free(chunks->data[i]);
+}
+
+unsigned LodePNG_UnknownChunks_copy(LodePNG_UnknownChunks* dest, const LodePNG_UnknownChunks* src)
+{
+ unsigned i;
+
+ LodePNG_UnknownChunks_cleanup(dest);
+
+ for(i = 0; i < 3; i++)
+ {
+ size_t j;
+ dest->datasize[i] = src->datasize[i];
+ dest->data[i] = (unsigned char*)malloc(src->datasize[i]);
+ if(!dest->data[i] && dest->datasize[i]) return 9932;
+ for(j = 0; j < src->datasize[i]; j++) dest->data[i][j] = src->data[i][j];
+ }
+
+ return 0;
+}
+
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+
+void LodePNG_Text_init(LodePNG_Text* text)
+{
+ text->num = 0;
+ text->keys = NULL;
+ text->strings = NULL;
+}
+
+void LodePNG_Text_cleanup(LodePNG_Text* text)
+{
+ LodePNG_Text_clear(text);
+}
+
+unsigned LodePNG_Text_copy(LodePNG_Text* dest, const LodePNG_Text* source)
+{
+ size_t i = 0;
+ dest->keys = 0;
+ dest->strings = 0;
+ dest->num = 0;
+ for(i = 0; i < source->num; i++)
+ {
+ unsigned error = LodePNG_Text_add(dest, source->keys[i], source->strings[i]);
+ if(error) return error;
+ }
+ return 0;
+}
+
+void LodePNG_Text_clear(LodePNG_Text* text)
+{
+ size_t i;
+ for(i = 0; i < text->num; i++)
+ {
+ string_cleanup(&text->keys[i]);
+ string_cleanup(&text->strings[i]);
+ }
+ free(text->keys);
+ free(text->strings);
+}
+
+unsigned LodePNG_Text_add(LodePNG_Text* text, const char* key, const char* str)
+{
+ char** new_keys = (char**)(realloc(text->keys, sizeof(char*) * (text->num + 1)));
+ char** new_strings = (char**)(realloc(text->strings, sizeof(char*) * (text->num + 1)));
+ if(!new_keys || !new_strings)
+ {
+ free(new_keys);
+ free(new_strings);
+ return 9933;
+ }
+
+ text->num++;
+ text->keys = new_keys;
+ text->strings = new_strings;
+
+ string_init(&text->keys[text->num - 1]);
+ string_set(&text->keys[text->num - 1], key);
+
+ string_init(&text->strings[text->num - 1]);
+ string_set(&text->strings[text->num - 1], str);
+
+ return 0;
+}
+
+/******************************************************************************/
+
+void LodePNG_IText_init(LodePNG_IText* text)
+{
+ text->num = 0;
+ text->keys = NULL;
+ text->langtags = NULL;
+ text->transkeys = NULL;
+ text->strings = NULL;
+}
+
+void LodePNG_IText_cleanup(LodePNG_IText* text)
+{
+ LodePNG_IText_clear(text);
+}
+
+unsigned LodePNG_IText_copy(LodePNG_IText* dest, const LodePNG_IText* source)
+{
+ size_t i = 0;
+ dest->keys = 0;
+ dest->langtags = 0;
+ dest->transkeys = 0;
+ dest->strings = 0;
+ dest->num = 0;
+ for(i = 0; i < source->num; i++)
+ {
+ unsigned error = LodePNG_IText_add(dest, source->keys[i], source->langtags[i], source->transkeys[i], source->strings[i]);
+ if(error) return error;
+ }
+ return 0;
+}
+
+void LodePNG_IText_clear(LodePNG_IText* text)
+{
+ size_t i;
+ for(i = 0; i < text->num; i++)
+ {
+ string_cleanup(&text->keys[i]);
+ string_cleanup(&text->langtags[i]);
+ string_cleanup(&text->transkeys[i]);
+ string_cleanup(&text->strings[i]);
+ }
+ free(text->keys);
+ free(text->langtags);
+ free(text->transkeys);
+ free(text->strings);
+}
+
+unsigned LodePNG_IText_add(LodePNG_IText* text, const char* key, const char* langtag, const char* transkey, const char* str)
+{
+ char** new_keys = (char**)(realloc(text->keys, sizeof(char*) * (text->num + 1)));
+ char** new_langtags = (char**)(realloc(text->langtags, sizeof(char*) * (text->num + 1)));
+ char** new_transkeys = (char**)(realloc(text->transkeys, sizeof(char*) * (text->num + 1)));
+ char** new_strings = (char**)(realloc(text->strings, sizeof(char*) * (text->num + 1)));
+ if(!new_keys || !new_langtags || !new_transkeys || !new_strings)
+ {
+ free(new_keys);
+ free(new_langtags);
+ free(new_transkeys);
+ free(new_strings);
+ return 9934;
+ }
+
+ text->num++;
+ text->keys = new_keys;
+ text->langtags = new_langtags;
+ text->transkeys = new_transkeys;
+ text->strings = new_strings;
+
+ string_init(&text->keys[text->num - 1]);
+ string_set(&text->keys[text->num - 1], key);
+
+ string_init(&text->langtags[text->num - 1]);
+ string_set(&text->langtags[text->num - 1], langtag);
+
+ string_init(&text->transkeys[text->num - 1]);
+ string_set(&text->transkeys[text->num - 1], transkey);
+
+ string_init(&text->strings[text->num - 1]);
+ string_set(&text->strings[text->num - 1], str);
+
+ return 0;
+}
+
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+
+void LodePNG_InfoPng_init(LodePNG_InfoPng* info)
+{
+ info->width = info->height = 0;
+ LodePNG_InfoColor_init(&info->color);
+ info->interlaceMethod = 0;
+ info->compressionMethod = 0;
+ info->filterMethod = 0;
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ info->background_defined = 0;
+ info->background_r = info->background_g = info->background_b = 0;
+
+ LodePNG_Text_init(&info->text);
+ LodePNG_IText_init(&info->itext);
+
+ info->time_defined = 0;
+ info->phys_defined = 0;
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ LodePNG_UnknownChunks_init(&info->unknown_chunks);
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+}
+
+void LodePNG_InfoPng_cleanup(LodePNG_InfoPng* info)
+{
+ LodePNG_InfoColor_cleanup(&info->color);
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ LodePNG_Text_cleanup(&info->text);
+ LodePNG_IText_cleanup(&info->itext);
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ LodePNG_UnknownChunks_cleanup(&info->unknown_chunks);
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+}
+
+unsigned LodePNG_InfoPng_copy(LodePNG_InfoPng* dest, const LodePNG_InfoPng* source)
+{
+ unsigned error = 0;
+ LodePNG_InfoPng_cleanup(dest);
+ *dest = *source;
+ LodePNG_InfoColor_init(&dest->color);
+ error = LodePNG_InfoColor_copy(&dest->color, &source->color); if(error) return error;
+
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ error = LodePNG_Text_copy(&dest->text, &source->text); if(error) return error;
+ error = LodePNG_IText_copy(&dest->itext, &source->itext); if(error) return error;
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ LodePNG_UnknownChunks_init(&dest->unknown_chunks);
+ error = LodePNG_UnknownChunks_copy(&dest->unknown_chunks, &source->unknown_chunks); if(error) return error;
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+ return error;
+}
+
+void LodePNG_InfoPng_swap(LodePNG_InfoPng* a, LodePNG_InfoPng* b)
+{
+ LodePNG_InfoPng temp = *a;
+ *a = *b;
+ *b = temp;
+}
+
+unsigned LodePNG_InfoColor_copy(LodePNG_InfoColor* dest, const LodePNG_InfoColor* source)
+{
+ size_t i;
+ LodePNG_InfoColor_cleanup(dest);
+ *dest = *source;
+ dest->palette = (unsigned char*)malloc(source->palettesize * 4);
+ if(!dest->palette && source->palettesize) return 9935;
+ for(i = 0; i < source->palettesize * 4; i++) dest->palette[i] = source->palette[i];
+ return 0;
+}
+
+void LodePNG_InfoRaw_init(LodePNG_InfoRaw* info)
+{
+ LodePNG_InfoColor_init(&info->color);
+}
+
+void LodePNG_InfoRaw_cleanup(LodePNG_InfoRaw* info)
+{
+ LodePNG_InfoColor_cleanup(&info->color);
+}
+
+unsigned LodePNG_InfoRaw_copy(LodePNG_InfoRaw* dest, const LodePNG_InfoRaw* source)
+{
+ unsigned error = 0;
+ LodePNG_InfoRaw_cleanup(dest);
+ *dest = *source;
+ LodePNG_InfoColor_init(&dest->color);
+ error = LodePNG_InfoColor_copy(&dest->color, &source->color); if(error) return error;
+ return error;
+}
+
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/*
+converts from any color type to 24-bit or 32-bit (later maybe more supported). return value = LodePNG error code
+the out buffer must have (w * h * bpp + 7) / 8 bytes, where bpp is the bits per pixel of the output color type (LodePNG_InfoColor_getBpp)
+for < 8 bpp images, there may _not_ be padding bits at the end of scanlines.
+*/
+unsigned LodePNG_convert(unsigned char* out, const unsigned char* in, LodePNG_InfoColor* infoOut, LodePNG_InfoColor* infoIn, unsigned w, unsigned h)
+{
+ const size_t numpixels = w * h; /*amount of pixels*/
+ const unsigned OUT_BYTES = LodePNG_InfoColor_getBpp(infoOut) / 8; /*bytes per pixel in the output image*/
+ const unsigned OUT_ALPHA = LodePNG_InfoColor_isAlphaType(infoOut); /*use 8-bit alpha channel*/
+ size_t i, c, bp = 0; /*bitpointer, used by less-than-8-bit color types*/
+
+ /*cases where in and out already have the same format*/
+ if(LodePNG_InfoColor_equal(infoIn, infoOut))
+ {
+ size_t i, size = (w * h * LodePNG_InfoColor_getBpp(infoIn) + 7) / 8;
+ for(i = 0; i < size; i++) out[i] = in[i];
+ return 0;
+ }
+
+ if((infoOut->colorType == 2 || infoOut->colorType == 6) && infoOut->bitDepth == 8)
+ {
+ if(infoIn->bitDepth == 8)
+ {
+ switch(infoIn->colorType)
+ {
+ case 0: /*greyscale color*/
+ for(i = 0; i < numpixels; i++)
+ {
+ if(OUT_ALPHA) out[OUT_BYTES * i + 3] = 255;
+ out[OUT_BYTES * i + 0] = out[OUT_BYTES * i + 1] = out[OUT_BYTES * i + 2] = in[i];
+ if(OUT_ALPHA && infoIn->key_defined && in[i] == infoIn->key_r) out[OUT_BYTES * i + 3] = 0;
+ }
+ break;
+ case 2: /*RGB color*/
+ for(i = 0; i < numpixels; i++)
+ {
+ if(OUT_ALPHA) out[OUT_BYTES * i + 3] = 255;
+ for(c = 0; c < 3; c++) out[OUT_BYTES * i + c] = in[3 * i + c];
+ if(OUT_ALPHA && infoIn->key_defined == 1 && in[3 * i + 0] == infoIn->key_r && in[3 * i + 1] == infoIn->key_g && in[3 * i + 2] == infoIn->key_b) out[OUT_BYTES * i + 3] = 0;
+ }
+ break;
+ case 3: /*indexed color (palette)*/
+ for(i = 0; i < numpixels; i++)
+ {
+ if(OUT_ALPHA) out[OUT_BYTES * i + 3] = 255;
+ if(in[i] >= infoIn->palettesize) return 46;
+ for(c = 0; c < OUT_BYTES; c++) out[OUT_BYTES * i + c] = infoIn->palette[4 * in[i] + c]; /*get rgb colors from the palette*/
+ }
+ break;
+ case 4: /*greyscale with alpha*/
+ for(i = 0; i < numpixels; i++)
+ {
+ out[OUT_BYTES * i + 0] = out[OUT_BYTES * i + 1] = out[OUT_BYTES * i + 2] = in[2 * i + 0];
+ if(OUT_ALPHA) out[OUT_BYTES * i + 3] = in[2 * i + 1];
+ }
+ break;
+ case 6: /*RGB with alpha*/
+ for(i = 0; i < numpixels; i++)
+ {
+ for(c = 0; c < OUT_BYTES; c++) out[OUT_BYTES * i + c] = in[4 * i + c];
+ }
+ break;
+ default: break;
+ }
+ }
+ else if(infoIn->bitDepth == 16)
+ {
+ switch(infoIn->colorType)
+ {
+ case 0: /*greyscale color*/
+ for(i = 0; i < numpixels; i++)
+ {
+ if(OUT_ALPHA) out[OUT_BYTES * i + 3] = 255;
+ out[OUT_BYTES * i + 0] = out[OUT_BYTES * i + 1] = out[OUT_BYTES * i + 2] = in[2 * i];
+ if(OUT_ALPHA && infoIn->key_defined && 256U * in[i] + in[i + 1] == infoIn->key_r) out[OUT_BYTES * i + 3] = 0;
+ }
+ break;
+ case 2: /*RGB color*/
+ for(i = 0; i < numpixels; i++)
+ {
+ if(OUT_ALPHA) out[OUT_BYTES * i + 3] = 255;
+ for(c = 0; c < 3; c++) out[OUT_BYTES * i + c] = in[6 * i + 2 * c];
+ if(OUT_ALPHA && infoIn->key_defined && 256U * in[6 * i + 0] + in[6 * i + 1] == infoIn->key_r && 256U * in[6 * i + 2] + in[6 * i + 3] == infoIn->key_g && 256U * in[6 * i + 4] + in[6 * i + 5] == infoIn->key_b) out[OUT_BYTES * i + 3] = 0;
+ }
+ break;
+ case 4: /*greyscale with alpha*/
+ for(i = 0; i < numpixels; i++)
+ {
+ out[OUT_BYTES * i + 0] = out[OUT_BYTES * i + 1] = out[OUT_BYTES * i + 2] = in[4 * i]; /*most significant byte*/
+ if(OUT_ALPHA) out[OUT_BYTES * i + 3] = in[4 * i + 2];
+ }
+ break;
+ case 6: /*RGB with alpha*/
+ for(i = 0; i < numpixels; i++)
+ {
+ for(c = 0; c < OUT_BYTES; c++) out[OUT_BYTES * i + c] = in[8 * i + 2 * c];
+ }
+ break;
+ default: break;
+ }
+ }
+ else /*infoIn->bitDepth is less than 8 bit per channel*/
+ {
+ switch(infoIn->colorType)
+ {
+ case 0: /*greyscale color*/
+ for(i = 0; i < numpixels; i++)
+ {
+ unsigned value = readBitsFromReversedStream(&bp, in, infoIn->bitDepth);
+ if(OUT_ALPHA) out[OUT_BYTES * i + 3] = 255;
+ if(OUT_ALPHA && infoIn->key_defined && value && ((1U << infoIn->bitDepth) - 1U) == infoIn->key_r && ((1U << infoIn->bitDepth) - 1U)) out[OUT_BYTES * i + 3] = 0;
+ value = (value * 255) / ((1 << infoIn->bitDepth) - 1); /*scale value from 0 to 255*/
+ out[OUT_BYTES * i + 0] = out[OUT_BYTES * i + 1] = out[OUT_BYTES * i + 2] = (unsigned char)(value);
+ }
+ break;
+ case 3: /*indexed color (palette)*/
+ for(i = 0; i < numpixels; i++)
+ {
+ unsigned value = readBitsFromReversedStream(&bp, in, infoIn->bitDepth);
+ if(OUT_ALPHA) out[OUT_BYTES * i + 3] = 255;
+ if(value >= infoIn->palettesize) return 47;
+ for(c = 0; c < OUT_BYTES; c++) out[OUT_BYTES * i + c] = infoIn->palette[4 * value + c]; /*get rgb colors from the palette*/
+ }
+ break;
+ default: break;
+ }
+ }
+ }
+ else if(LodePNG_InfoColor_isGreyscaleType(infoOut) && infoOut->bitDepth == 8) /*conversion from greyscale to greyscale*/
+ {
+ if(!LodePNG_InfoColor_isGreyscaleType(infoIn)) return 62;
+ if(infoIn->bitDepth == 8)
+ {
+ switch(infoIn->colorType)
+ {
+ case 0: /*greyscale color*/
+ for(i = 0; i < numpixels; i++)
+ {
+ if(OUT_ALPHA) out[OUT_BYTES * i + 1] = 255;
+ out[OUT_BYTES * i] = in[i];
+ if(OUT_ALPHA && infoIn->key_defined && in[i] == infoIn->key_r) out[OUT_BYTES * i + 1] = 0;
+ }
+ break;
+ case 4: /*greyscale with alpha*/
+ for(i = 0; i < numpixels; i++)
+ {
+ out[OUT_BYTES * i + 0] = in[2 * i + 0];
+ if(OUT_ALPHA) out[OUT_BYTES * i + 1] = in[2 * i + 1];
+ }
+ break;
+ default: return 31;
+ }
+ }
+ else if(infoIn->bitDepth == 16)
+ {
+ switch(infoIn->colorType)
+ {
+ case 0: /*greyscale color*/
+ for(i = 0; i < numpixels; i++)
+ {
+ if(OUT_ALPHA) out[OUT_BYTES * i + 1] = 255;
+ out[OUT_BYTES * i] = in[2 * i];
+ if(OUT_ALPHA && infoIn->key_defined && 256U * in[i] + in[i + 1] == infoIn->key_r) out[OUT_BYTES * i + 1] = 0;
+ }
+ break;
+ case 4: /*greyscale with alpha*/
+ for(i = 0; i < numpixels; i++)
+ {
+ out[OUT_BYTES * i] = in[4 * i]; /*most significant byte*/
+ if(OUT_ALPHA) out[OUT_BYTES * i + 1] = in[4 * i + 2]; /*most significant byte*/
+ }
+ break;
+ default: return 31;
+ }
+ }
+ else /*infoIn->bitDepth is less than 8 bit per channel*/
+ {
+ if(infoIn->colorType != 0) return 31; /*colorType 0 is the only greyscale type with < 8 bits per channel*/
+ for(i = 0; i < numpixels; i++)
+ {
+ unsigned value = readBitsFromReversedStream(&bp, in, infoIn->bitDepth);
+ if(OUT_ALPHA) out[OUT_BYTES * i + 1] = 255;
+ if(OUT_ALPHA && infoIn->key_defined && value && ((1U << infoIn->bitDepth) - 1U) == infoIn->key_r && ((1U << infoIn->bitDepth) - 1U)) out[OUT_BYTES * i + 1] = 0;
+ value = (value * 255) / ((1 << infoIn->bitDepth) - 1); /*scale value from 0 to 255*/
+ out[OUT_BYTES * i] = (unsigned char)(value);
+ }
+ }
+ }
+ else return 59;
+
+ return 0;
+}
+
+/*Paeth predicter, used by PNG filter type 4*/
+static int paethPredictor(int a, int b, int c)
+{
+ int p = a + b - c;
+ int pa = p > a ? p - a : a - p;
+ int pb = p > b ? p - b : b - p;
+ int pc = p > c ? p - c : c - p;
+
+ if(pa <= pb && pa <= pc) return a;
+ else if(pb <= pc) return b;
+ else return c;
+}
+
+/*shared values used by multiple Adam7 related functions*/
+
+static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/
+static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/
+static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/
+static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/
+
+static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp)
+{
+ /*the passstart values have 8 values: the 8th one actually indicates the byte after the end of the 7th (= last) pass*/
+ unsigned i;
+
+ /*calculate width and height in pixels of each pass*/
+ for(i = 0; i < 7; i++)
+ {
+ passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i];
+ passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i];
+ if(passw[i] == 0) passh[i] = 0;
+ if(passh[i] == 0) passw[i] = 0;
+ }
+
+ filter_passstart[0] = padded_passstart[0] = passstart[0] = 0;
+ for(i = 0; i < 7; i++)
+ {
+ filter_passstart[i + 1] = filter_passstart[i] + ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0); /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/
+ padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8); /*bits padded if needed to fill full byte at end of each scanline*/
+ passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8; /*only padded at end of reduced image*/
+ }
+}
+
+#ifdef LODEPNG_COMPILE_DECODER
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / PNG Decoder / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/*read the information from the header and store it in the LodePNG_Info. return value is error*/
+void LodePNG_inspect(LodePNG_Decoder* decoder, const unsigned char* in, size_t inlength)
+{
+ if(inlength == 0 || in == 0) { decoder->error = 48; return; } /*the given data is empty*/
+ if(inlength < 29) { decoder->error = 27; return; } /*error: the data length is smaller than the length of the header*/
+
+ /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/
+ LodePNG_InfoPng_cleanup(&decoder->infoPng);
+ LodePNG_InfoPng_init(&decoder->infoPng);
+ decoder->error = 0;
+
+ if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) { decoder->error = 28; return; } /*error: the first 8 bytes are not the correct PNG signature*/
+ if(in[12] != 'I' || in[13] != 'H' || in[14] != 'D' || in[15] != 'R') { decoder->error = 29; return; } /*error: it doesn't start with a IHDR chunk!*/
+
+ /*read the values given in the header*/
+ decoder->infoPng.width = LodePNG_read32bitInt(&in[16]);
+ decoder->infoPng.height = LodePNG_read32bitInt(&in[20]);
+ decoder->infoPng.color.bitDepth = in[24];
+ decoder->infoPng.color.colorType = in[25];
+ decoder->infoPng.compressionMethod = in[26];
+ decoder->infoPng.filterMethod = in[27];
+ decoder->infoPng.interlaceMethod = in[28];
+
+ if(!decoder->settings.ignoreCrc)
+ {
+ unsigned CRC = LodePNG_read32bitInt(&in[29]);
+ unsigned checksum = Crc32_crc(&in[12], 17);
+ if(CRC != checksum) { decoder->error = 57; return; }
+ }
+
+ if(decoder->infoPng.compressionMethod != 0) { decoder->error = 32; return; } /*error: only compression method 0 is allowed in the specification*/
+ if(decoder->infoPng.filterMethod != 0) { decoder->error = 33; return; } /*error: only filter method 0 is allowed in the specification*/
+ if(decoder->infoPng.interlaceMethod > 1) { decoder->error = 34; return; } /*error: only interlace methods 0 and 1 exist in the specification*/
+
+ decoder->error = checkColorValidity(decoder->infoPng.color.colorType, decoder->infoPng.color.bitDepth);
+}
+
+static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, size_t bytewidth, unsigned char filterType, size_t length)
+{
+ /*
+ For PNG filter method 0
+ unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, the filter works byte per byte (bytewidth = 1)
+ precon is the previous unfiltered scanline, recon the result, scanline the current one
+ the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead
+ recon and scanline MAY be the same memory address! precon must be disjoint.
+ */
+
+ size_t i;
+ switch(filterType)
+ {
+ case 0:
+ for(i = 0; i < length; i++) recon[i] = scanline[i];
+ break;
+ case 1:
+ for(i = 0; i < bytewidth; i++) recon[i] = scanline[i];
+ for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth];
+ break;
+ case 2:
+ if(precon) for(i = 0; i < length; i++) recon[i] = scanline[i] + precon[i];
+ else for(i = 0; i < length; i++) recon[i] = scanline[i];
+ break;
+ case 3:
+ if(precon)
+ {
+ for(i = 0; i < bytewidth; i++) recon[i] = scanline[i] + precon[i] / 2;
+ for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) / 2);
+ }
+ else
+ {
+ for(i = 0; i < bytewidth; i++) recon[i] = scanline[i];
+ for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth] / 2;
+ }
+ break;
+ case 4:
+ if(precon)
+ {
+ for(i = 0; i < bytewidth; i++) recon[i] = (unsigned char)(scanline[i] + paethPredictor(0, precon[i], 0));
+ for(i = bytewidth; i < length; i++) recon[i] = (unsigned char)(scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth]));
+ }
+ else
+ {
+ for(i = 0; i < bytewidth; i++) recon[i] = scanline[i];
+ for(i = bytewidth; i < length; i++) recon[i] = (unsigned char)(scanline[i] + paethPredictor(recon[i - bytewidth], 0, 0));
+ }
+ break;
+ default: return 36; /*error: unexisting filter type given*/
+ }
+ return 0;
+}
+
+static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp)
+{
+ /*
+ For PNG filter method 0
+ this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 it's called 7 times)
+ out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline
+ w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel
+ in and out are allowed to be the same memory address!
+ */
+
+ unsigned y;
+ unsigned char* prevline = 0;
+
+ size_t bytewidth = (bpp + 7) / 8; /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/
+ size_t linebytes = (w * bpp + 7) / 8;
+
+ for(y = 0; y < h; y++)
+ {
+ size_t outindex = linebytes * y;
+ size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/
+ unsigned char filterType = in[inindex];
+
+ unsigned error = unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes);
+ if(error) return error;
+
+ prevline = &out[outindex];
+ }
+
+ return 0;
+}
+
+static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp)
+{
+ /*Note: this function works on image buffers WITHOUT padding bits at end of scanlines with non-multiple-of-8 bit amounts, only between reduced images is padding
+ out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation (because that's likely a little bit faster)*/
+ unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
+ unsigned i;
+
+ Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
+
+ if(bpp >= 8)
+ {
+ for(i = 0; i < 7; i++)
+ {
+ unsigned x, y, b;
+ size_t bytewidth = bpp / 8;
+ for(y = 0; y < passh[i]; y++)
+ for(x = 0; x < passw[i]; x++)
+ {
+ size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth;
+ size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth;
+ for(b = 0; b < bytewidth; b++)
+ {
+ out[pixeloutstart + b] = in[pixelinstart + b];
+ }
+ }
+ }
+ }
+ else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/
+ {
+ for(i = 0; i < 7; i++)
+ {
+ unsigned x, y, b;
+ unsigned ilinebits = bpp * passw[i];
+ unsigned olinebits = bpp * w;
+ size_t obp, ibp; /*bit pointers (for out and in buffer)*/
+ for(y = 0; y < passh[i]; y++)
+ for(x = 0; x < passw[i]; x++)
+ {
+ ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp);
+ obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp;
+ for(b = 0; b < bpp; b++)
+ {
+ unsigned char bit = readBitFromReversedStream(&ibp, in);
+ setBitOfReversedStream0(&obp, out, bit); /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/
+ }
+ }
+ }
+ }
+}
+
+static void removePaddingBits(unsigned char* out, const unsigned char* in, size_t olinebits, size_t ilinebits, unsigned h)
+{
+ /*
+ After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers for the Adam7 code, the color convert code and the output to the user.
+ in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits
+ also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7
+ only useful if (ilinebits - olinebits) is a value in the range 1..7
+ */
+ unsigned y;
+ size_t diff = ilinebits - olinebits;
+ size_t obp = 0, ibp = 0; /*bit pointers*/
+ for(y = 0; y < h; y++)
+ {
+ size_t x;
+ for(x = 0; x < olinebits; x++)
+ {
+ unsigned char bit = readBitFromReversedStream(&ibp, in);
+ setBitOfReversedStream(&obp, out, bit);
+ }
+ ibp += diff;
+ }
+}
+
+/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from the IDAT chunks*/
+static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, const LodePNG_InfoPng* infoPng) /*return value is error*/
+{
+ /*
+ This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. Steps:
+ *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8)
+ *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace
+ NOTE: the in buffer will be overwritten with intermediate data!
+ */
+ unsigned bpp = LodePNG_InfoColor_getBpp(&infoPng->color);
+ unsigned w = infoPng->width;
+ unsigned h = infoPng->height;
+ unsigned error = 0;
+ if(bpp == 0) return 31; /*error: invalid colortype*/
+
+ if(infoPng->interlaceMethod == 0)
+ {
+ if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8)
+ {
+ error = unfilter(in, in, w, h, bpp);
+ if(error) return error;
+ removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h);
+ }
+ else error = unfilter(out, in, w, h, bpp); /*we can immediatly filter into the out buffer, no other steps needed*/
+ }
+ else /*interlaceMethod is 1 (Adam7)*/
+ {
+ unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
+ unsigned i;
+
+ Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
+
+ for(i = 0; i < 7; i++)
+ {
+ error = unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp);
+ if(error) return error;
+ if(bpp < 8) /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, move bytes instead of bits or move not at all*/
+ {
+ /*remove padding bits in scanlines; after this there still may be padding bits between the different reduced images: each reduced image still starts nicely at a byte*/
+ removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, ((passw[i] * bpp + 7) / 8) * 8, passh[i]);
+ }
+ }
+
+ Adam7_deinterlace(out, in, w, h, bpp);
+ }
+
+ return error;
+}
+
+/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/
+static void decodeGeneric(LodePNG_Decoder* decoder, unsigned char** out, size_t* outsize, const unsigned char* in, size_t size)
+{
+ unsigned char IEND = 0;
+ const unsigned char* chunk;
+ size_t i;
+ ucvector idat; /*the data from idat chunks*/
+
+ /*for unknown chunk order*/
+ unsigned unknown = 0;
+ unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/
+
+ /*provide some proper output values if error will happen*/
+ *out = 0;
+ *outsize = 0;
+
+ if(size == 0 || in == 0) { decoder->error = 48; return; } /*the given data is empty*/
+
+ LodePNG_inspect(decoder, in, size); /*reads header and resets other parameters in decoder->infoPng*/
+ if(decoder->error) return;
+
+ ucvector_init(&idat);
+
+ chunk = &in[33]; /*first byte of the first chunk after the header*/
+
+ while(!IEND) /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. IDAT data is put at the start of the in buffer*/
+ {
+ unsigned chunkLength;
+ const unsigned char* data; /*the data in the chunk*/
+
+ if((size_t)((chunk - in) + 12) > size || chunk < in) { decoder->error = 30; break; } /*error: size of the in buffer too small to contain next chunk*/
+ chunkLength = LodePNG_chunk_length(chunk); /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/
+ if(chunkLength > 2147483647) { decoder->error = 63; break; }
+ if((size_t)((chunk - in) + chunkLength + 12) > size || (chunk + chunkLength + 12) < in) { decoder->error = 35; break; } /*error: size of the in buffer too small to contain next chunk*/
+ data = LodePNG_chunk_data_const(chunk);
+
+ /*IDAT chunk, containing compressed image data*/
+ if(LodePNG_chunk_type_equals(chunk, "IDAT"))
+ {
+ size_t oldsize = idat.size;
+ if(!ucvector_resize(&idat, oldsize + chunkLength)) { decoder->error = 9936; break; }
+ for(i = 0; i < chunkLength; i++) idat.data[oldsize + i] = data[i];
+ critical_pos = 3;
+ }
+ /*IEND chunk*/
+ else if(LodePNG_chunk_type_equals(chunk, "IEND"))
+ {
+ IEND = 1;
+ }
+ /*palette chunk (PLTE)*/
+ else if(LodePNG_chunk_type_equals(chunk, "PLTE"))
+ {
+ unsigned pos = 0;
+ if(decoder->infoPng.color.palette) free(decoder->infoPng.color.palette);
+ decoder->infoPng.color.palettesize = chunkLength / 3;
+ decoder->infoPng.color.palette = (unsigned char*)malloc(4 * decoder->infoPng.color.palettesize);
+ if(!decoder->infoPng.color.palette && decoder->infoPng.color.palettesize) { decoder->error = 9937; break; }
+ if(!decoder->infoPng.color.palette) decoder->infoPng.color.palettesize = 0; /*malloc failed...*/
+ if(decoder->infoPng.color.palettesize > 256) { decoder->error = 38; break; } /*error: palette too big*/
+ for(i = 0; i < decoder->infoPng.color.palettesize; i++)
+ {
+ decoder->infoPng.color.palette[4 * i + 0] = data[pos++]; /*R*/
+ decoder->infoPng.color.palette[4 * i + 1] = data[pos++]; /*G*/
+ decoder->infoPng.color.palette[4 * i + 2] = data[pos++]; /*B*/
+ decoder->infoPng.color.palette[4 * i + 3] = 255; /*alpha*/
+ }
+ critical_pos = 2;
+ }
+ /*palette transparency chunk (tRNS)*/
+ else if(LodePNG_chunk_type_equals(chunk, "tRNS"))
+ {
+ if(decoder->infoPng.color.colorType == 3)
+ {
+ if(chunkLength > decoder->infoPng.color.palettesize) { decoder->error = 39; break; } /*error: more alpha values given than there are palette entries*/
+ for(i = 0; i < chunkLength; i++) decoder->infoPng.color.palette[4 * i + 3] = data[i];
+ }
+ else if(decoder->infoPng.color.colorType == 0)
+ {
+ if(chunkLength != 2) { decoder->error = 40; break; } /*error: this chunk must be 2 bytes for greyscale image*/
+ decoder->infoPng.color.key_defined = 1;
+ decoder->infoPng.color.key_r = decoder->infoPng.color.key_g = decoder->infoPng.color.key_b = 256 * data[0] + data[1];
+ }
+ else if(decoder->infoPng.color.colorType == 2)
+ {
+ if(chunkLength != 6) { decoder->error = 41; break; } /*error: this chunk must be 6 bytes for RGB image*/
+ decoder->infoPng.color.key_defined = 1;
+ decoder->infoPng.color.key_r = 256 * data[0] + data[1];
+ decoder->infoPng.color.key_g = 256 * data[2] + data[3];
+ decoder->infoPng.color.key_b = 256 * data[4] + data[5];
+ }
+ else { decoder->error = 42; break; } /*error: tRNS chunk not allowed for other color models*/
+ }
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ /*background color chunk (bKGD)*/
+ else if(LodePNG_chunk_type_equals(chunk, "bKGD"))
+ {
+ if(decoder->infoPng.color.colorType == 3)
+ {
+ if(chunkLength != 1) { decoder->error = 43; break; } /*error: this chunk must be 1 byte for indexed color image*/
+ decoder->infoPng.background_defined = 1;
+ decoder->infoPng.background_r = decoder->infoPng.background_g = decoder->infoPng.background_g = data[0];
+ }
+ else if(decoder->infoPng.color.colorType == 0 || decoder->infoPng.color.colorType == 4)
+ {
+ if(chunkLength != 2) { decoder->error = 44; break; } /*error: this chunk must be 2 bytes for greyscale image*/
+ decoder->infoPng.background_defined = 1;
+ decoder->infoPng.background_r = decoder->infoPng.background_g = decoder->infoPng.background_b = 256 * data[0] + data[1];
+ }
+ else if(decoder->infoPng.color.colorType == 2 || decoder->infoPng.color.colorType == 6)
+ {
+ if(chunkLength != 6) { decoder->error = 45; break; } /*error: this chunk must be 6 bytes for greyscale image*/
+ decoder->infoPng.background_defined = 1;
+ decoder->infoPng.background_r = 256 * data[0] + data[1];
+ decoder->infoPng.background_g = 256 * data[2] + data[3];
+ decoder->infoPng.background_b = 256 * data[4] + data[5];
+ }
+ }
+ /*text chunk (tEXt)*/
+ else if(LodePNG_chunk_type_equals(chunk, "tEXt"))
+ {
+ if(decoder->settings.readTextChunks)
+ {
+ char *key = 0, *str = 0;
+
+ while(!decoder->error) /*not really a while loop, only used to break on error*/
+ {
+ unsigned length, string2_begin;
+
+ for(length = 0; length < chunkLength && data[length] != 0; length++) ;
+ if(length + 1 >= chunkLength) { decoder->error = 75; break; }
+ key = (char*)malloc(length + 1);
+ if(!key) { decoder->error = 9938; break; }
+ key[length] = 0;
+ for(i = 0; i < length; i++) key[i] = data[i];
+
+ string2_begin = length + 1;
+ if(string2_begin > chunkLength) { decoder->error = 75; break; }
+ length = chunkLength - string2_begin;
+ str = (char*)malloc(length + 1);
+ if(!str) { decoder->error = 9939; break; }
+ str[length] = 0;
+ for(i = 0; i < length; i++) str[i] = data[string2_begin + i];
+
+ decoder->error = LodePNG_Text_add(&decoder->infoPng.text, key, str);
+
+ break;
+ }
+
+ free(key);
+ free(str);
+ }
+ }
+ /*compressed text chunk (zTXt)*/
+ else if(LodePNG_chunk_type_equals(chunk, "zTXt"))
+ {
+ if(decoder->settings.readTextChunks)
+ {
+ unsigned length, string2_begin;
+ char *key = 0;
+ ucvector decoded;
+
+ ucvector_init(&decoded);
+
+ while(!decoder->error) /*not really a while loop, only used to break on error*/
+ {
+ for(length = 0; length < chunkLength && data[length] != 0; length++) ;
+ if(length + 2 >= chunkLength) { decoder->error = 75; break; }
+ key = (char*)malloc(length + 1);
+ if(!key) { decoder->error = 9940; break; }
+ key[length] = 0;
+ for(i = 0; i < length; i++) key[i] = data[i];
+
+ if(data[length + 1] != 0) { decoder->error = 72; break; } /*the 0 byte indicating compression must be 0*/
+
+ string2_begin = length + 2;
+ if(string2_begin > chunkLength) { decoder->error = 75; break; }
+ length = chunkLength - string2_begin;
+ decoder->error = LodePNG_decompress(&decoded.data, &decoded.size, (unsigned char*)(&data[string2_begin]), length, &decoder->settings.zlibsettings);
+ if(decoder->error) break;
+ ucvector_push_back(&decoded, 0);
+
+ decoder->error = LodePNG_Text_add(&decoder->infoPng.text, key, (char*)decoded.data);
+
+ break;
+ }
+
+ free(key);
+ ucvector_cleanup(&decoded);
+ if(decoder->error) break;
+ }
+ }
+ /*international text chunk (iTXt)*/
+ else if(LodePNG_chunk_type_equals(chunk, "iTXt"))
+ {
+ if(decoder->settings.readTextChunks)
+ {
+ unsigned length, begin, compressed;
+ char *key = 0, *langtag = 0, *transkey = 0;
+ ucvector decoded;
+ ucvector_init(&decoded);
+
+ while(!decoder->error) /*not really a while loop, only used to break on error*/
+ {
+ if(chunkLength < 5) { decoder->error = 76; break; }
+ for(length = 0; length < chunkLength && data[length] != 0; length++) ;
+ if(length + 2 >= chunkLength) { decoder->error = 75; break; }
+ key = (char*)malloc(length + 1);
+ if(!key) { decoder->error = 9941; break; }
+ key[length] = 0;
+ for(i = 0; i < length; i++) key[i] = data[i];
+
+ compressed = data[length + 1];
+ if(data[length + 2] != 0) { decoder->error = 72; break; } /*the 0 byte indicating compression must be 0*/
+
+ begin = length + 3;
+ length = 0;
+ for(i = begin; i < chunkLength && data[i] != 0; i++) length++;
+ if(begin + length + 1 >= chunkLength) { decoder->error = 75; break; }
+ langtag = (char*)malloc(length + 1);
+ if(!langtag) { decoder->error = 9942; break; }
+ langtag[length] = 0;
+ for(i = 0; i < length; i++) langtag[i] = data[begin + i];
+
+ begin += length + 1;
+ length = 0;
+ for(i = begin; i < chunkLength && data[i] != 0; i++) length++;
+ if(begin + length + 1 >= chunkLength) { decoder->error = 75; break; }
+ transkey = (char*)malloc(length + 1);
+ if(!transkey) { decoder->error = 9943; break; }
+ transkey[length] = 0;
+ for(i = 0; i < length; i++) transkey[i] = data[begin + i];
+
+ begin += length + 1;
+ if(begin > chunkLength) { decoder->error = 75; break; }
+ length = chunkLength - begin;
+
+ if(compressed)
+ {
+ decoder->error = LodePNG_decompress(&decoded.data, &decoded.size, (unsigned char*)(&data[begin]), length, &decoder->settings.zlibsettings);
+ if(decoder->error) break;
+ ucvector_push_back(&decoded, 0);
+ }
+ else
+ {
+ if(!ucvector_resize(&decoded, length + 1)) { decoder->error = 9944; break; }
+ decoded.data[length] = 0;
+ for(i = 0; i < length; i++) decoded.data[i] = data[begin + i];
+ }
+
+ decoder->error = LodePNG_IText_add(&decoder->infoPng.itext, key, langtag, transkey, (char*)decoded.data);
+
+ break;
+ }
+
+ free(key);
+ free(langtag);
+ free(transkey);
+ ucvector_cleanup(&decoded);
+ if(decoder->error) break;
+ }
+ }
+ else if(LodePNG_chunk_type_equals(chunk, "tIME"))
+ {
+ if(chunkLength != 7) { decoder->error = 73; break; }
+ decoder->infoPng.time_defined = 1;
+ decoder->infoPng.time.year = 256 * data[0] + data[+ 1];
+ decoder->infoPng.time.month = data[2];
+ decoder->infoPng.time.day = data[3];
+ decoder->infoPng.time.hour = data[4];
+ decoder->infoPng.time.minute = data[5];
+ decoder->infoPng.time.second = data[6];
+ }
+ else if(LodePNG_chunk_type_equals(chunk, "pHYs"))
+ {
+ if(chunkLength != 9) { decoder->error = 74; break; }
+ decoder->infoPng.phys_defined = 1;
+ decoder->infoPng.phys_x = 16777216 * data[0] + 65536 * data[1] + 256 * data[2] + data[3];
+ decoder->infoPng.phys_y = 16777216 * data[4] + 65536 * data[5] + 256 * data[6] + data[7];
+ decoder->infoPng.phys_unit = data[8];
+ }
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+ else /*it's not an implemented chunk type, so ignore it: skip over the data*/
+ {
+ if(LodePNG_chunk_critical(chunk)) { decoder->error = 69; break; } /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/
+ unknown = 1;
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ if(decoder->settings.rememberUnknownChunks)
+ {
+ LodePNG_UnknownChunks* unknown = &decoder->infoPng.unknown_chunks;
+ decoder->error = LodePNG_append_chunk(&unknown->data[critical_pos - 1], &unknown->datasize[critical_pos - 1], chunk);
+ if(decoder->error) break;
+ }
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+ }
+
+ if(!decoder->settings.ignoreCrc && !unknown) /*check CRC if wanted, only on known chunk types*/
+ {
+ if(LodePNG_chunk_check_crc(chunk)) { decoder->error = 57; break; }
+ }
+
+ if(!IEND) chunk = LodePNG_chunk_next_const(chunk);
+ }
+
+ if(!decoder->error)
+ {
+ ucvector scanlines;
+ ucvector_init(&scanlines);
+ if(!ucvector_resize(&scanlines, ((decoder->infoPng.width * (decoder->infoPng.height * LodePNG_InfoColor_getBpp(&decoder->infoPng.color) + 7)) / 8) + decoder->infoPng.height)) decoder->error = 9945; /*maximum final image length is already reserved in the vector's length - this is not really necessary*/
+ if(!decoder->error) decoder->error = LodePNG_decompress(&scanlines.data, &scanlines.size, idat.data, idat.size, &decoder->settings.zlibsettings); /*decompress with the Zlib decompressor*/
+
+ if(!decoder->error)
+ {
+ ucvector outv;
+ ucvector_init(&outv);
+ if(!ucvector_resizev(&outv, (decoder->infoPng.height * decoder->infoPng.width * LodePNG_InfoColor_getBpp(&decoder->infoPng.color) + 7) / 8, 0)) decoder->error = 9946;
+ if(!decoder->error) decoder->error = postProcessScanlines(outv.data, scanlines.data, &decoder->infoPng);
+ *out = outv.data;
+ *outsize = outv.size;
+ }
+ ucvector_cleanup(&scanlines);
+ }
+
+ ucvector_cleanup(&idat);
+}
+
+void LodePNG_decode(LodePNG_Decoder* decoder, unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize)
+{
+ *out = 0;
+ *outsize = 0;
+ decodeGeneric(decoder, out, outsize, in, insize);
+ if(decoder->error) return;
+ if(!decoder->settings.color_convert || LodePNG_InfoColor_equal(&decoder->infoRaw.color, &decoder->infoPng.color))
+ {
+ /*same color type, no copying or converting of data needed*/
+ /*store the infoPng color settings on the infoRaw so that the infoRaw still reflects what colorType
+ the raw image has to the end user*/
+ if(!decoder->settings.color_convert)
+ {
+ decoder->error = LodePNG_InfoColor_copy(&decoder->infoRaw.color, &decoder->infoPng.color);
+ if(decoder->error) return;
+ }
+ }
+ else
+ {
+ /*color conversion needed; sort of copy of the data*/
+ unsigned char* data = *out;
+
+ /*TODO: check if this works according to the statement in the documentation: "The converter can convert from greyscale input color type, to 8-bit greyscale or greyscale with alpha"*/
+ if(!(decoder->infoRaw.color.colorType == 2 || decoder->infoRaw.color.colorType == 6) && !(decoder->infoRaw.color.bitDepth == 8)) { decoder->error = 56; return; }
+
+ *outsize = (decoder->infoPng.width * decoder->infoPng.height * LodePNG_InfoColor_getBpp(&decoder->infoRaw.color) + 7) / 8;
+ *out = (unsigned char*)malloc(*outsize);
+ if(!(*out))
+ {
+ decoder->error = 9947;
+ *outsize = 0;
+ }
+ else decoder->error = LodePNG_convert(*out, data, &decoder->infoRaw.color, &decoder->infoPng.color, decoder->infoPng.width, decoder->infoPng.height);
+ free(data);
+ }
+}
+
+unsigned LodePNG_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize)
+{
+ unsigned error;
+ size_t dummy_size;
+ LodePNG_Decoder decoder;
+ LodePNG_Decoder_init(&decoder);
+ LodePNG_decode(&decoder, out, &dummy_size, in, insize);
+ error = decoder.error;
+ *w = decoder.infoPng.width;
+ *h = decoder.infoPng.height;
+ LodePNG_Decoder_cleanup(&decoder);
+ return error;
+}
+
+#ifdef LODEPNG_COMPILE_DISK
+unsigned LodePNG_decode32f(unsigned char** out, unsigned* w, unsigned* h, const char* filename)
+{
+ unsigned char* buffer;
+ size_t buffersize;
+ unsigned error;
+ error = LodePNG_loadFile(&buffer, &buffersize, filename);
+ if(!error) error = LodePNG_decode32(out, w, h, buffer, buffersize);
+ free(buffer);
+ return error;
+}
+#endif /*LODEPNG_COMPILE_DISK*/
+
+void LodePNG_DecodeSettings_init(LodePNG_DecodeSettings* settings)
+{
+ settings->color_convert = 1;
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ settings->readTextChunks = 1;
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+ settings->ignoreCrc = 0;
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ settings->rememberUnknownChunks = 0;
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+ LodeZlib_DecompressSettings_init(&settings->zlibsettings);
+}
+
+void LodePNG_Decoder_init(LodePNG_Decoder* decoder)
+{
+ LodePNG_DecodeSettings_init(&decoder->settings);
+ LodePNG_InfoRaw_init(&decoder->infoRaw);
+ LodePNG_InfoPng_init(&decoder->infoPng);
+ decoder->error = 1;
+}
+
+void LodePNG_Decoder_cleanup(LodePNG_Decoder* decoder)
+{
+ LodePNG_InfoRaw_cleanup(&decoder->infoRaw);
+ LodePNG_InfoPng_cleanup(&decoder->infoPng);
+}
+
+void LodePNG_Decoder_copy(LodePNG_Decoder* dest, const LodePNG_Decoder* source)
+{
+ LodePNG_Decoder_cleanup(dest);
+ *dest = *source;
+ LodePNG_InfoRaw_init(&dest->infoRaw);
+ LodePNG_InfoPng_init(&dest->infoPng);
+ dest->error = LodePNG_InfoRaw_copy(&dest->infoRaw, &source->infoRaw); if(dest->error) return;
+ dest->error = LodePNG_InfoPng_copy(&dest->infoPng, &source->infoPng); if(dest->error) return;
+}
+
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+#ifdef LODEPNG_COMPILE_ENCODER
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / PNG Encoder / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/*chunkName must be string of 4 characters*/
+static unsigned addChunk(ucvector* out, const char* chunkName, const unsigned char* data, size_t length)
+{
+ unsigned error = LodePNG_create_chunk(&out->data, &out->size, (unsigned)length, chunkName, data);
+ if(error) return error;
+ out->allocsize = out->size; /*fix the allocsize again*/
+ return 0;
+}
+
+static void writeSignature(ucvector* out)
+{
+ /*8 bytes PNG signature*/
+ ucvector_push_back(out, 137);
+ ucvector_push_back(out, 80);
+ ucvector_push_back(out, 78);
+ ucvector_push_back(out, 71);
+ ucvector_push_back(out, 13);
+ ucvector_push_back(out, 10);
+ ucvector_push_back(out, 26);
+ ucvector_push_back(out, 10);
+}
+
+static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, unsigned bitDepth, unsigned colorType, unsigned interlaceMethod)
+{
+ unsigned error = 0;
+ ucvector header;
+ ucvector_init(&header);
+
+ LodePNG_add32bitInt(&header, w); /*width*/
+ LodePNG_add32bitInt(&header, h); /*height*/
+ ucvector_push_back(&header, (unsigned char)bitDepth); /*bit depth*/
+ ucvector_push_back(&header, (unsigned char)colorType); /*color type*/
+ ucvector_push_back(&header, 0); /*compression method*/
+ ucvector_push_back(&header, 0); /*filter method*/
+ ucvector_push_back(&header, interlaceMethod); /*interlace method*/
+
+ error = addChunk(out, "IHDR", header.data, header.size);
+ ucvector_cleanup(&header);
+
+ return error;
+}
+
+static unsigned addChunk_PLTE(ucvector* out, const LodePNG_InfoColor* info)
+{
+ unsigned error = 0;
+ size_t i;
+ ucvector PLTE;
+ ucvector_init(&PLTE);
+ for(i = 0; i < info->palettesize * 4; i++) if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]); /*add all channels except alpha channel*/
+ error = addChunk(out, "PLTE", PLTE.data, PLTE.size);
+ ucvector_cleanup(&PLTE);
+
+ return error;
+}
+
+static unsigned addChunk_tRNS(ucvector* out, const LodePNG_InfoColor* info)
+{
+ unsigned error = 0;
+ size_t i;
+ ucvector tRNS;
+ ucvector_init(&tRNS);
+ if(info->colorType == 3)
+ {
+ for(i = 0; i < info->palettesize; i++) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); /*add only alpha channel*/
+ }
+ else if(info->colorType == 0)
+ {
+ if(info->key_defined)
+ {
+ ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256));
+ ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256));
+ }
+ }
+ else if(info->colorType == 2)
+ {
+ if(info->key_defined)
+ {
+ ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256));
+ ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256));
+ ucvector_push_back(&tRNS, (unsigned char)(info->key_g / 256));
+ ucvector_push_back(&tRNS, (unsigned char)(info->key_g % 256));
+ ucvector_push_back(&tRNS, (unsigned char)(info->key_b / 256));
+ ucvector_push_back(&tRNS, (unsigned char)(info->key_b % 256));
+ }
+ }
+
+ error = addChunk(out, "tRNS", tRNS.data, tRNS.size);
+ ucvector_cleanup(&tRNS);
+
+ return error;
+}
+
+static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, LodeZlib_DeflateSettings* zlibsettings)
+{
+ ucvector zlibdata;
+ unsigned error = 0;
+
+ /*compress with the Zlib compressor*/
+ ucvector_init(&zlibdata);
+ error = LodePNG_compress(&zlibdata.data, &zlibdata.size, data, datasize, zlibsettings);
+ if(!error) error = addChunk(out, "IDAT", zlibdata.data, zlibdata.size);
+ ucvector_cleanup(&zlibdata);
+
+ return error;
+}
+
+static unsigned addChunk_IEND(ucvector* out)
+{
+ unsigned error = 0;
+ error = addChunk(out, "IEND", 0, 0);
+ return error;
+}
+
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+
+static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) /*add text chunk*/
+{
+ unsigned error = 0;
+ size_t i;
+ ucvector text;
+ ucvector_init(&text);
+ for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&text, (unsigned char)keyword[i]);
+ ucvector_push_back(&text, 0);
+ for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&text, (unsigned char)textstring[i]);
+ error = addChunk(out, "tEXt", text.data, text.size);
+ ucvector_cleanup(&text);
+
+ return error;
+}
+
+static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, LodeZlib_DeflateSettings* zlibsettings)
+{
+ unsigned error = 0;
+ ucvector data, compressed;
+ size_t i, textsize = strlen(textstring);
+
+ ucvector_init(&data);
+ ucvector_init(&compressed);
+ for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]);
+ ucvector_push_back(&data, 0); /* 0 termination char*/
+ ucvector_push_back(&data, 0); /*compression method: 0*/
+
+ error = LodePNG_compress(&compressed.data, &compressed.size, (unsigned char*)textstring, textsize, zlibsettings);
+ if(!error)
+ {
+ for(i = 0; i < compressed.size; i++) ucvector_push_back(&data, compressed.data[i]);
+ error = addChunk(out, "zTXt", data.data, data.size);
+ }
+
+ ucvector_cleanup(&compressed);
+ ucvector_cleanup(&data);
+ return error;
+}
+
+static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* keyword, const char* langtag, const char* transkey, const char* textstring, LodeZlib_DeflateSettings* zlibsettings)
+{
+ unsigned error = 0;
+ ucvector data, compressed_data;
+ size_t i, textsize = strlen(textstring);
+
+ ucvector_init(&data);
+
+ for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]);
+ ucvector_push_back(&data, 0); /*null termination char*/
+ ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/
+ ucvector_push_back(&data, 0); /*compression method*/
+ for(i = 0; langtag[i] != 0; i++) ucvector_push_back(&data, (unsigned char)langtag[i]);
+ ucvector_push_back(&data, 0); /*null termination char*/
+ for(i = 0; transkey[i] != 0; i++) ucvector_push_back(&data, (unsigned char)transkey[i]);
+ ucvector_push_back(&data, 0); /*null termination char*/
+
+ if(compressed)
+ {
+ ucvector_init(&compressed_data);
+ error = LodePNG_compress(&compressed_data.data, &compressed_data.size, (unsigned char*)textstring, textsize, zlibsettings);
+ if(!error)
+ {
+ for(i = 0; i < compressed_data.size; i++) ucvector_push_back(&data, compressed_data.data[i]);
+ for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&data, (unsigned char)textstring[i]);
+ }
+ }
+ else /*not compressed*/
+ {
+ for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&data, (unsigned char)textstring[i]);
+ }
+
+ if(!error) error = addChunk(out, "iTXt", data.data, data.size);
+ ucvector_cleanup(&data);
+ return error;
+}
+
+static unsigned addChunk_bKGD(ucvector* out, const LodePNG_InfoPng* info)
+{
+ unsigned error = 0;
+ ucvector bKGD;
+ ucvector_init(&bKGD);
+ if(info->color.colorType == 0 || info->color.colorType == 4)
+ {
+ ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256));
+ ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256));
+ }
+ else if(info->color.colorType == 2 || info->color.colorType == 6)
+ {
+ ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256));
+ ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256));
+ ucvector_push_back(&bKGD, (unsigned char)(info->background_g / 256));
+ ucvector_push_back(&bKGD, (unsigned char)(info->background_g % 256));
+ ucvector_push_back(&bKGD, (unsigned char)(info->background_b / 256));
+ ucvector_push_back(&bKGD, (unsigned char)(info->background_b % 256));
+ }
+ else if(info->color.colorType == 3)
+ {
+ ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); /*palette index*/
+ }
+
+ error = addChunk(out, "bKGD", bKGD.data, bKGD.size);
+ ucvector_cleanup(&bKGD);
+
+ return error;
+}
+
+static unsigned addChunk_tIME(ucvector* out, const LodePNG_Time* time)
+{
+ unsigned error = 0;
+ unsigned char* data = (unsigned char*)malloc(7);
+ if(!data) return 9948;
+ data[0] = (unsigned char)(time->year / 256);
+ data[1] = (unsigned char)(time->year % 256);
+ data[2] = time->month;
+ data[3] = time->day;
+ data[4] = time->hour;
+ data[5] = time->minute;
+ data[6] = time->second;
+ error = addChunk(out, "tIME", data, 7);
+ free(data);
+ return error;
+}
+
+static unsigned addChunk_pHYs(ucvector* out, const LodePNG_InfoPng* info)
+{
+ unsigned error = 0;
+ ucvector data;
+ ucvector_init(&data);
+
+ LodePNG_add32bitInt(&data, info->phys_x);
+ LodePNG_add32bitInt(&data, info->phys_y);
+ ucvector_push_back(&data, info->phys_unit);
+
+ error = addChunk(out, "pHYs", data.data, data.size);
+ ucvector_cleanup(&data);
+
+ return error;
+}
+
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+
+static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, size_t length, size_t bytewidth, unsigned char filterType)
+{
+ size_t i;
+ switch(filterType)
+ {
+ case 0:
+ if(prevline) for(i = 0; i < length; i++) out[i] = scanline[i];
+ else for(i = 0; i < length; i++) out[i] = scanline[i];
+ break;
+ case 1:
+ if(prevline)
+ {
+ for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
+ for(i = bytewidth; i < length ; i++) out[i] = scanline[i] - scanline[i - bytewidth];
+ }
+ else
+ {
+ for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
+ for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth];
+ }
+ break;
+ case 2:
+ if(prevline) for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i];
+ else for(i = 0; i < length; i++) out[i] = scanline[i];
+ break;
+ case 3:
+ if(prevline)
+ {
+ for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2;
+ for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2);
+ }
+ else
+ {
+ for(i = 0; i < length; i++) out[i] = scanline[i];
+ for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2;
+ }
+ break;
+ case 4:
+ if(prevline)
+ {
+ for(i = 0; i < bytewidth; i++) out[i] = (unsigned char)(scanline[i] - paethPredictor(0, prevline[i], 0));
+ for(i = bytewidth; i < length; i++) out[i] = (unsigned char)(scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth]));
+ }
+ else
+ {
+ for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
+ for(i = bytewidth; i < length; i++) out[i] = (unsigned char)(scanline[i] - paethPredictor(scanline[i - bytewidth], 0, 0));
+ }
+ break;
+ default: return; /*unexisting filter type given*/
+ }
+}
+
+static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, const LodePNG_InfoColor* info)
+{
+ /*
+ For PNG filter method 0
+ out must be a buffer with as size: h + (w * h * bpp + 7) / 8, because there are the scanlines with 1 extra byte per scanline
+
+ There is a nice heuristic described here: http://www.cs.toronto.edu/~cosmin/pngtech/optipng.html. It says:
+ * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. use fixed filtering, with the filter None).
+ * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply all five filters and select the filter that produces the smallest sum of absolute values per row.
+
+ Here the above method is used mostly. Note though that it appears to be better to use the adaptive filtering on the plasma 8-bit palette example, but that image isn't the best reference for palette images in general.
+ */
+
+ unsigned bpp = LodePNG_InfoColor_getBpp(info);
+ size_t linebytes = (w * bpp + 7) / 8; /*the width of a scanline in bytes, not including the filter type*/
+ size_t bytewidth = (bpp + 7) / 8; /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/
+ const unsigned char* prevline = 0;
+ unsigned x, y;
+ unsigned heuristic;
+ unsigned error = 0;
+
+ if(bpp == 0) return 31; /*invalid color type*/
+
+ /*choose heuristic as described above*/
+ if(info->colorType == 3 || info->bitDepth < 8) heuristic = 0;
+ else heuristic = 1;
+
+ if(heuristic == 0) /*None filtertype for everything*/
+ {
+ for(y = 0; y < h; y++)
+ {
+ size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/
+ size_t inindex = linebytes * y;
+ const unsigned TYPE = 0;
+ out[outindex] = TYPE; /*filter type byte*/
+ filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, TYPE);
+ prevline = &in[inindex];
+ }
+ }
+ else if(heuristic == 1) /*adaptive filtering*/
+ {
+ size_t sum[5];
+ ucvector attempt[5]; /*five filtering attempts, one for each filter type*/
+ size_t smallest = 0;
+ unsigned type, bestType = 0;
+
+ for(type = 0; type < 5; type++) ucvector_init(&attempt[type]);
+ for(type = 0; type < 5; type++)
+ {
+ if(!ucvector_resize(&attempt[type], linebytes)) { error = 9949; break; }
+ }
+
+ if(!error)
+ {
+ for(y = 0; y < h; y++)
+ {
+ /*try the 5 filter types*/
+ for(type = 0; type < 5; type++)
+ {
+ filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type);
+
+ /*calculate the sum of the result*/
+ sum[type] = 0;
+ for(x = 0; x < attempt[type].size; x+=3) sum[type] += attempt[type].data[x]; /*note that not all pixels are checked to speed this up while still having probably the best choice*/
+
+ /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/
+ if(type == 0 || sum[type] < smallest)
+ {
+ bestType = type;
+ smallest = sum[type];
+ }
+ }
+
+ prevline = &in[y * linebytes];
+
+ /*now fill the out values*/
+ out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/
+ for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x];
+ }
+ }
+
+ for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]);
+ }
+ #if 0 /*deflate the scanline with a fixed tree after every filter attempt to see which one deflates best. This is slow, and _does not work as expected_: the heuristic gives smaller result!*/
+ else if(heuristic == 2) /*adaptive filtering by using deflate*/
+ {
+ size_t size[5];
+ ucvector attempt[5]; /*five filtering attempts, one for each filter type*/
+ size_t smallest;
+ unsigned type = 0, bestType = 0;
+ unsigned char* dummy;
+ LodeZlib_DeflateSettings deflatesettings = LodeZlib_defaultDeflateSettings;
+ deflatesettings.btype = 1; /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, to simulate the true case where the tree is the same for the whole image*/
+ for(type = 0; type < 5; type++) { ucvector_init(&attempt[type]); ucvector_resize(&attempt[type], linebytes); }
+ for(y = 0; y < h; y++) /*try the 5 filter types*/
+ {
+ for(type = 0; type < 5; type++)
+ {
+ filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type);
+ size[type] = 0; dummy = 0;
+ LodePNG_compress(&dummy, &size[type], attempt[type].data, attempt[type].size, &deflatesettings);
+ free(dummy);
+ /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/
+ if(type == 0 || size[type] < smallest) { bestType = type; smallest = size[type]; }
+ }
+ prevline = &in[y * linebytes];
+ out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/
+ for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x];
+ }
+ for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]);
+ }
+ #endif
+
+ return error;
+}
+
+static void addPaddingBits(unsigned char* out, const unsigned char* in, size_t olinebits, size_t ilinebits, unsigned h)
+{
+ /*The opposite of the removePaddingBits function
+ olinebits must be >= ilinebits*/
+ unsigned y;
+ size_t diff = olinebits - ilinebits;
+ size_t obp = 0, ibp = 0; /*bit pointers*/
+ for(y = 0; y < h; y++)
+ {
+ size_t x;
+ for(x = 0; x < ilinebits; x++)
+ {
+ unsigned char bit = readBitFromReversedStream(&ibp, in);
+ setBitOfReversedStream(&obp, out, bit);
+ }
+ /*obp += diff; --> no, fill in some value in the padding bits too, to avoid "Use of uninitialised value of size ###" warning from valgrind*/
+ for(x = 0; x < diff; x++) setBitOfReversedStream(&obp, out, 0);
+ }
+}
+
+static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp)
+{
+ /*Note: this function works on image buffers WITHOUT padding bits at end of scanlines with non-multiple-of-8 bit amounts, only between reduced images is padding*/
+ unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
+ unsigned i;
+
+ Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
+
+ if(bpp >= 8)
+ {
+ for(i = 0; i < 7; i++)
+ {
+ unsigned x, y, b;
+ size_t bytewidth = bpp / 8;
+ for(y = 0; y < passh[i]; y++)
+ for(x = 0; x < passw[i]; x++)
+ {
+ size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth;
+ size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth;
+ for(b = 0; b < bytewidth; b++)
+ {
+ out[pixeloutstart + b] = in[pixelinstart + b];
+ }
+ }
+ }
+ }
+ else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/
+ {
+ for(i = 0; i < 7; i++)
+ {
+ unsigned x, y, b;
+ unsigned ilinebits = bpp * passw[i];
+ unsigned olinebits = bpp * w;
+ size_t obp, ibp; /*bit pointers (for out and in buffer)*/
+ for(y = 0; y < passh[i]; y++)
+ for(x = 0; x < passw[i]; x++)
+ {
+ ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp;
+ obp = (8 * passstart[i]) + (y * ilinebits + x * bpp);
+ for(b = 0; b < bpp; b++)
+ {
+ unsigned char bit = readBitFromReversedStream(&ibp, in);
+ setBitOfReversedStream(&obp, out, bit);
+ }
+ }
+ }
+ }
+}
+
+/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image*/
+static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, const LodePNG_InfoPng* infoPng) /*return value is error*/
+{
+ /*
+ This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps:
+ *) if no Adam7: 1) add padding bits (= posible extra bits per scanline if bpp < 8) 2) filter
+ *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter
+ */
+ unsigned bpp = LodePNG_InfoColor_getBpp(&infoPng->color);
+ unsigned w = infoPng->width;
+ unsigned h = infoPng->height;
+ unsigned error = 0;
+
+ if(infoPng->interlaceMethod == 0)
+ {
+ *outsize = h + (h * ((w * bpp + 7) / 8)); /*image size plus an extra byte per scanline + possible padding bits*/
+ *out = (unsigned char*)malloc(*outsize);
+ if(!(*out) && (*outsize)) error = 9950;
+
+ if(!error)
+ {
+ if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) /*non multiple of 8 bits per scanline, padding bits needed per scanline*/
+ {
+ ucvector padded;
+ ucvector_init(&padded);
+ if(!ucvector_resize(&padded, h * ((w * bpp + 7) / 8))) error = 9951;
+ if(!error)
+ {
+ addPaddingBits(padded.data, in, ((w * bpp + 7) / 8) * 8, w * bpp, h);
+ error = filter(*out, padded.data, w, h, &infoPng->color);
+ }
+ ucvector_cleanup(&padded);
+ }
+ else error = filter(*out, in, w, h, &infoPng->color); /*we can immediatly filter into the out buffer, no other steps needed*/
+ }
+ }
+ else /*interlaceMethod is 1 (Adam7)*/
+ {
+ unsigned char* adam7 = (unsigned char*)malloc((h * w * bpp + 7) / 8);
+ if(!adam7 && ((h * w * bpp + 7) / 8)) error = 9952; /*malloc failed*/
+
+ while(!error) /*not a real while loop, used to break out to cleanup to avoid a goto*/
+ {
+ unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8];
+ unsigned i;
+
+ Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp);
+
+ *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/
+ *out = (unsigned char*)malloc(*outsize);
+ if(!(*out) && (*outsize)) { error = 9953; break; }
+
+ Adam7_interlace(adam7, in, w, h, bpp);
+
+ for(i = 0; i < 7; i++)
+ {
+ if(bpp < 8)
+ {
+ ucvector padded;
+ ucvector_init(&padded);
+ if(!ucvector_resize(&padded, h * ((w * bpp + 7) / 8))) error = 9954;
+ if(!error)
+ {
+ addPaddingBits(&padded.data[padded_passstart[i]], &adam7[passstart[i]], ((passw[i] * bpp + 7) / 8) * 8, passw[i] * bpp, passh[i]);
+ error = filter(&(*out)[filter_passstart[i]], &padded.data[padded_passstart[i]], passw[i], passh[i], &infoPng->color);
+ }
+
+ ucvector_cleanup(&padded);
+ }
+ else
+ {
+ error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], passw[i], passh[i], &infoPng->color);
+ }
+ }
+
+ break;
+ }
+
+ free(adam7);
+ }
+
+ return error;
+}
+
+/*palette must have 4 * palettesize bytes allocated*/
+static unsigned isPaletteFullyOpaque(const unsigned char* palette, size_t palettesize) /*palette given in format RGBARGBARGBARGBA...*/
+{
+ size_t i;
+ for(i = 0; i < palettesize; i++)
+ {
+ if(palette[4 * i + 3] != 255) return 0;
+ }
+ return 1;
+}
+
+/*this function checks if the input image given by the user has no transparent pixels*/
+static unsigned isFullyOpaque(const unsigned char* image, unsigned w, unsigned h, const LodePNG_InfoColor* info)
+{
+ /*TODO: When the user specified a color key for the input image, then this function must also check for pixels that are the same as the color key and treat those as transparent.*/
+
+ unsigned i, numpixels = w * h;
+ if(info->colorType == 6)
+ {
+ if(info->bitDepth == 8)
+ {
+ for(i = 0; i < numpixels; i++) if(image[i * 4 + 3] != 255) return 0;
+ }
+ else
+ {
+ for(i = 0; i < numpixels; i++) if(image[i * 8 + 6] != 255 || image[i * 8 + 7] != 255) return 0;
+ }
+ return 1; /*no single pixel with alpha channel other than 255 found*/
+ }
+ else if(info->colorType == 4)
+ {
+ if(info->bitDepth == 8)
+ {
+ for(i = 0; i < numpixels; i++) if(image[i * 2 + 1] != 255) return 0;
+ }
+ else
+ {
+ for(i = 0; i < numpixels; i++) if(image[i * 4 + 2] != 255 || image[i * 4 + 3] != 255) return 0;
+ }
+ return 1; /*no single pixel with alpha channel other than 255 found*/
+ }
+ else if(info->colorType == 3)
+ {
+ /*when there's a palette, we could check every pixel for translucency, but much quicker is to just check the palette*/
+ return(isPaletteFullyOpaque(info->palette, info->palettesize));
+ }
+
+ return 0; /*color type that isn't supported by this function yet, so assume there is transparency to be safe*/
+}
+
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize)
+{
+ unsigned char* inchunk = data;
+ while((size_t)(inchunk - data) < datasize)
+ {
+ unsigned error = LodePNG_append_chunk(&out->data, &out->size, inchunk);
+ if(error) return error; /*error: not enough memory*/
+ out->allocsize = out->size; /*fix the allocsize again*/
+ inchunk = LodePNG_chunk_next(inchunk);
+ }
+ return 0;
+}
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+
+void LodePNG_encode(LodePNG_Encoder* encoder, unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h)
+{
+ LodePNG_InfoPng info;
+ ucvector outv;
+ unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/
+ size_t datasize = 0;
+
+ /*provide some proper output values if error will happen*/
+ *out = 0;
+ *outsize = 0;
+ encoder->error = 0;
+
+ info = encoder->infoPng; /*UNSAFE copy to avoid having to cleanup! but we will only change primitive parameters, and not invoke the cleanup function nor touch the palette's buffer so we use it safely*/
+ info.width = w;
+ info.height = h;
+
+ if(encoder->settings.autoLeaveOutAlphaChannel && isFullyOpaque(image, w, h, &encoder->infoRaw.color))
+ {
+ /*go to a color type without alpha channel*/
+ if(info.color.colorType == 6) info.color.colorType = 2;
+ else if(info.color.colorType == 4) info.color.colorType = 0;
+ }
+
+ if(encoder->settings.zlibsettings.windowSize > 32768) { encoder->error = 60; return; } /*error: windowsize larger than allowed*/
+ if(encoder->settings.zlibsettings.btype > 2) { encoder->error = 61; return; } /*error: unexisting btype*/
+ if(encoder->infoPng.interlaceMethod > 1) { encoder->error = 71; return; } /*error: unexisting interlace mode*/
+ if((encoder->error = checkColorValidity(info.color.colorType, info.color.bitDepth))) return; /*error: unexisting color type given*/
+ if((encoder->error = checkColorValidity(encoder->infoRaw.color.colorType, encoder->infoRaw.color.bitDepth))) return; /*error: unexisting color type given*/
+
+ if(!LodePNG_InfoColor_equal(&encoder->infoRaw.color, &info.color))
+ {
+ unsigned char* converted;
+ size_t size = (w * h * LodePNG_InfoColor_getBpp(&info.color) + 7) / 8;
+
+ if((info.color.colorType != 6 && info.color.colorType != 2) || (info.color.bitDepth != 8)) { encoder->error = 59; return; } /*for the output image, only these types are supported*/
+ converted = (unsigned char*)malloc(size);
+ if(!converted && size) encoder->error = 9955; /*error: malloc failed*/
+ if(!encoder->error) encoder->error = LodePNG_convert(converted, image, &info.color, &encoder->infoRaw.color, w, h);
+ if(!encoder->error) preProcessScanlines(&data, &datasize, converted, &info);/*filter(data.data, converted.data, w, h, LodePNG_InfoColor_getBpp(&info.color));*/
+ free(converted);
+ }
+ else preProcessScanlines(&data, &datasize, image, &info);/*filter(data.data, image, w, h, LodePNG_InfoColor_getBpp(&info.color));*/
+
+ ucvector_init(&outv);
+ while(!encoder->error) /*not really a while loop, this is only used to break out if an error happens to avoid goto's to do the ucvector cleanup*/
+ {
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ size_t i;
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+ /*write signature and chunks*/
+ writeSignature(&outv);
+ /*IHDR*/
+ addChunk_IHDR(&outv, w, h, info.color.bitDepth, info.color.colorType, info.interlaceMethod);
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ /*unknown chunks between IHDR and PLTE*/
+ if(info.unknown_chunks.data[0]) { encoder->error = addUnknownChunks(&outv, info.unknown_chunks.data[0], info.unknown_chunks.datasize[0]); if(encoder->error) break; }
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+ /*PLTE*/
+ if(info.color.colorType == 3)
+ {
+ if(info.color.palettesize == 0 || info.color.palettesize > 256) { encoder->error = 68; break; }
+ addChunk_PLTE(&outv, &info.color);
+ }
+ if(encoder->settings.force_palette && (info.color.colorType == 2 || info.color.colorType == 6))
+ {
+ if(info.color.palettesize == 0 || info.color.palettesize > 256) { encoder->error = 68; break; }
+ addChunk_PLTE(&outv, &info.color);
+ }
+ /*tRNS*/
+ if(info.color.colorType == 3 && !isPaletteFullyOpaque(info.color.palette, info.color.palettesize)) addChunk_tRNS(&outv, &info.color);
+ if((info.color.colorType == 0 || info.color.colorType == 2) && info.color.key_defined) addChunk_tRNS(&outv, &info.color);
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ /*bKGD (must come between PLTE and the IDAt chunks*/
+ if(info.background_defined) addChunk_bKGD(&outv, &info);
+ /*pHYs (must come before the IDAT chunks)*/
+ if(info.phys_defined) addChunk_pHYs(&outv, &info);
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ /*unknown chunks between PLTE and IDAT*/
+ if(info.unknown_chunks.data[1]) { encoder->error = addUnknownChunks(&outv, info.unknown_chunks.data[1], info.unknown_chunks.datasize[1]); if(encoder->error) break; }
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+ /*IDAT (multiple IDAT chunks must be consecutive)*/
+ encoder->error = addChunk_IDAT(&outv, data, datasize, &encoder->settings.zlibsettings);
+ if(encoder->error) break;
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ /*tIME*/
+ if(info.time_defined) addChunk_tIME(&outv, &info.time);
+ /*tEXt and/or zTXt*/
+ for(i = 0; i < info.text.num; i++)
+ {
+ if(strlen(info.text.keys[i]) > 79) { encoder->error = 66; break; }
+ if(strlen(info.text.keys[i]) < 1) { encoder->error = 67; break; }
+ if(encoder->settings.text_compression)
+ addChunk_zTXt(&outv, info.text.keys[i], info.text.strings[i], &encoder->settings.zlibsettings);
+ else
+ addChunk_tEXt(&outv, info.text.keys[i], info.text.strings[i]);
+ }
+ /*LodePNG version id in text chunk*/
+ if(encoder->settings.add_id)
+ {
+ unsigned alread_added_id_text = 0;
+ for(i = 0; i < info.text.num; i++)
+ if(!strcmp(info.text.keys[i], "LodePNG")) { alread_added_id_text = 1; break; }
+ if(alread_added_id_text == 0)
+ addChunk_tEXt(&outv, "LodePNG", VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/
+ }
+ /*iTXt*/
+ for(i = 0; i < info.itext.num; i++)
+ {
+ if(strlen(info.itext.keys[i]) > 79) { encoder->error = 66; break; }
+ if(strlen(info.itext.keys[i]) < 1) { encoder->error = 67; break; }
+ addChunk_iTXt(&outv, encoder->settings.text_compression,
+ info.itext.keys[i], info.itext.langtags[i], info.itext.transkeys[i], info.itext.strings[i],
+ &encoder->settings.zlibsettings);
+ }
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ /*unknown chunks between IDAT and IEND*/
+ if(info.unknown_chunks.data[2]) { encoder->error = addUnknownChunks(&outv, info.unknown_chunks.data[2], info.unknown_chunks.datasize[2]); if(encoder->error) break; }
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+ /*IEND*/
+ addChunk_IEND(&outv);
+
+ break; /*this isn't really a while loop; no error happened so break out now!*/
+ }
+
+ free(data);
+ /*instead of cleaning the vector up, give it to the output*/
+ *out = outv.data;
+ *outsize = outv.size;
+}
+
+unsigned LodePNG_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h)
+{
+ unsigned error;
+ LodePNG_Encoder encoder;
+ LodePNG_Encoder_init(&encoder);
+ LodePNG_encode(&encoder, out, outsize, image, w, h);
+ error = encoder.error;
+ LodePNG_Encoder_cleanup(&encoder);
+ return error;
+}
+
+#ifdef LODEPNG_COMPILE_DISK
+unsigned LodePNG_encode32f(const char* filename, const unsigned char* image, unsigned w, unsigned h)
+{
+ unsigned char* buffer;
+ size_t buffersize;
+ unsigned error = LodePNG_encode32(&buffer, &buffersize, image, w, h);
+ LodePNG_saveFile(buffer, buffersize, filename);
+ free(buffer);
+ return error;
+}
+#endif /*LODEPNG_COMPILE_DISK*/
+
+void LodePNG_EncodeSettings_init(LodePNG_EncodeSettings* settings)
+{
+ LodeZlib_DeflateSettings_init(&settings->zlibsettings);
+ settings->autoLeaveOutAlphaChannel = 1;
+ settings->force_palette = 0;
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ settings->add_id = 1;
+ settings->text_compression = 0;
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+}
+
+void LodePNG_Encoder_init(LodePNG_Encoder* encoder)
+{
+ LodePNG_EncodeSettings_init(&encoder->settings);
+ LodePNG_InfoPng_init(&encoder->infoPng);
+ LodePNG_InfoRaw_init(&encoder->infoRaw);
+ encoder->error = 1;
+}
+
+void LodePNG_Encoder_cleanup(LodePNG_Encoder* encoder)
+{
+ LodePNG_InfoPng_cleanup(&encoder->infoPng);
+ LodePNG_InfoRaw_cleanup(&encoder->infoRaw);
+}
+
+void LodePNG_Encoder_copy(LodePNG_Encoder* dest, const LodePNG_Encoder* source)
+{
+ LodePNG_Encoder_cleanup(dest);
+ *dest = *source;
+ LodePNG_InfoPng_init(&dest->infoPng);
+ LodePNG_InfoRaw_init(&dest->infoRaw);
+ dest->error = LodePNG_InfoPng_copy(&dest->infoPng, &source->infoPng); if(dest->error) return;
+ dest->error = LodePNG_InfoRaw_copy(&dest->infoRaw, &source->infoRaw); if(dest->error) return;
+}
+
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+#endif /*LODEPNG_COMPILE_PNG*/
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* / File IO / */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_DISK
+
+unsigned LodePNG_loadFile(unsigned char** out, size_t* outsize, const char* filename) /*designed for loading files from hard disk in a dynamically allocated buffer*/
+{
+ FILE* file;
+ long size;
+
+ /*provide some proper output values if error will happen*/
+ *out = 0;
+ *outsize = 0;
+
+ file = portable_fopen(filename, "rb");
+ if(!file) return 78;
+
+ /*get filesize:*/
+ fseek(file , 0 , SEEK_END);
+ size = ftell(file);
+ rewind(file);
+
+ /*read contents of the file into the vector*/
+ *outsize = 0;
+ *out = (unsigned char*)malloc((size_t)size);
+ if(size && (*out)) (*outsize) = fread(*out, 1, (size_t)size, file);
+
+ fclose(file);
+ if(!(*out) && size) return 80; /*the above malloc failed*/
+ return 0;
+}
+
+/*write given buffer to the file, overwriting the file, it doesn't append to it.*/
+unsigned LodePNG_saveFile(const unsigned char* buffer, size_t buffersize, const char* filename)
+{
+ FILE* file;
+ file = portable_fopen(filename, "wb" );
+ if(!file) return 79;
+ fwrite((char*)buffer , 1 , buffersize, file);
+ fclose(file);
+ return 0;
+}
+
+#endif /*LODEPNG_COMPILE_DISK*/
+
diff --git a/src/lodepng.h b/src/lodepng.h
new file mode 100644
index 0000000..bbf40dc
--- /dev/null
+++ b/src/lodepng.h
@@ -0,0 +1,1575 @@
+/*
+LodePNG version 20080927
+
+Copyright (c) 2005-2008 Lode Vandevenne
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+*/
+
+#ifndef LODEPNG_H
+#define LODEPNG_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* Code Sections */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/*The following defines can be commented disable code sections. Gives potential faster compile and smaller binary.*/
+
+#define LODEPNG_COMPILE_ZLIB /*deflate&zlib encoder and deflate&zlib decoder*/
+#define LODEPNG_COMPILE_PNG /*png encoder and png decoder*/
+//#define LODEPNG_COMPILE_DECODER /*deflate&zlib decoder and png decoder*/
+#define LODEPNG_COMPILE_ENCODER /*deflate&zlib encoder and png encoder*/
+#define LODEPNG_COMPILE_DISK /*the optional built in harddisk file loading and saving functions*/
+//#define LODEPNG_COMPILE_ANCILLARY_CHUNKS /*any code or struct datamember related to chunks other than IHDR, IDAT, PLTE, tRNS, IEND*/
+//#define LODEPNG_COMPILE_UNKNOWN_CHUNKS /*handling of unknown chunks*/
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* LodeFlate & LodeZlib Setting structs */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_DECODER
+typedef struct LodeZlib_DecompressSettings
+{
+ unsigned ignoreAdler32;
+} LodeZlib_DecompressSettings;
+
+extern const LodeZlib_DecompressSettings LodeZlib_defaultDecompressSettings;
+void LodeZlib_DecompressSettings_init(LodeZlib_DecompressSettings* settings);
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+#ifdef LODEPNG_COMPILE_ENCODER
+typedef struct LodeZlib_DeflateSettings /*deflate = compress*/
+{
+ /*LZ77 related settings*/
+ unsigned btype; /*the block type for LZ*/
+ unsigned useLZ77; /*whether or not to use LZ77*/
+ unsigned windowSize; /*the maximum is 32768*/
+} LodeZlib_DeflateSettings;
+
+extern const LodeZlib_DeflateSettings LodeZlib_defaultDeflateSettings;
+void LodeZlib_DeflateSettings_init(LodeZlib_DeflateSettings* settings);
+#endif /*LODEPNG_COMPILE_ENCODER*/
+
+#ifdef LODEPNG_COMPILE_ZLIB
+/* ////////////////////////////////////////////////////////////////////////// */
+/* LodeFlate & LodeZlib */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#ifdef LODEPNG_COMPILE_DECODER
+/*This function reallocates the out buffer and appends the data.
+Either, *out must be NULL and *outsize must be 0, or, *out must be a valid buffer and *outsize its size in bytes.*/
+unsigned LodeZlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodeZlib_DecompressSettings* settings);
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+#ifdef LODEPNG_COMPILE_ENCODER
+/*This function reallocates the out buffer and appends the data.
+Either, *out must be NULL and *outsize must be 0, or, *out must be a valid buffer and *outsize its size in bytes.*/
+unsigned LodeZlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize, const LodeZlib_DeflateSettings* settings);
+#endif /*LODEPNG_COMPILE_ENCODER*/
+#endif /*LODEPNG_COMPILE_ZLIB*/
+
+#ifdef LODEPNG_COMPILE_PNG
+
+/* ////////////////////////////////////////////////////////////////////////// */
+/* LodePNG */
+/* ////////////////////////////////////////////////////////////////////////// */
+
+/*LodePNG_chunk functions: These functions need as input a large enough amount of allocated memory.*/
+
+unsigned LodePNG_chunk_length(const unsigned char* chunk); /*get the length of the data of the chunk. Total chunk length has 12 bytes more.*/
+
+void LodePNG_chunk_type(char type[5], const unsigned char* chunk); /*puts the 4-byte type in null terminated string*/
+unsigned char LodePNG_chunk_type_equals(const unsigned char* chunk, const char* type); /*check if the type is the given type*/
+
+/*properties of PNG chunks gotten from capitalization of chunk type name, as defined by the standard*/
+unsigned char LodePNG_chunk_critical(const unsigned char* chunk); /*0: ancillary chunk, 1: it's one of the critical chunk types*/
+unsigned char LodePNG_chunk_private(const unsigned char* chunk); /*0: public, 1: private*/
+unsigned char LodePNG_chunk_safetocopy(const unsigned char* chunk); /*0: the chunk is unsafe to copy, 1: the chunk is safe to copy*/
+
+unsigned char* LodePNG_chunk_data(unsigned char* chunk); /*get pointer to the data of the chunk*/
+const unsigned char* LodePNG_chunk_data_const(const unsigned char* chunk); /*get pointer to the data of the chunk*/
+
+unsigned LodePNG_chunk_check_crc(const unsigned char* chunk); /*returns 0 if the crc is correct, 1 if it's incorrect*/
+void LodePNG_chunk_generate_crc(unsigned char* chunk); /*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/
+
+/*iterate to next chunks.*/
+unsigned char* LodePNG_chunk_next(unsigned char* chunk);
+const unsigned char* LodePNG_chunk_next_const(const unsigned char* chunk);
+
+/*add chunks to out buffer. It reallocs the buffer to append the data. returns error code*/
+unsigned LodePNG_append_chunk(unsigned char** out, size_t* outlength, const unsigned char* chunk); /*appends chunk that was already created, to the data. Returns pointer to start of appended chunk, or NULL if error happened*/
+unsigned LodePNG_create_chunk(unsigned char** out, size_t* outlength, unsigned length, const char* type, const unsigned char* data); /*appends new chunk to out. Returns pointer to start of appended chunk, or NULL if error happened; may change memory address of out buffer*/
+
+typedef struct LodePNG_InfoColor /*info about the color type of an image*/
+{
+ /*header (IHDR)*/
+ unsigned colorType; /*color type*/
+ unsigned bitDepth; /*bits per sample*/
+
+ /*palette (PLTE)*/
+ unsigned char* palette; /*palette in RGBARGBA... order*/
+ size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/
+
+ /*transparent color key (tRNS)*/
+ unsigned key_defined; /*is a transparent color key given?*/
+ unsigned key_r; /*red component of color key*/
+ unsigned key_g; /*green component of color key*/
+ unsigned key_b; /*blue component of color key*/
+} LodePNG_InfoColor;
+
+void LodePNG_InfoColor_init(LodePNG_InfoColor* info);
+void LodePNG_InfoColor_cleanup(LodePNG_InfoColor* info);
+unsigned LodePNG_InfoColor_copy(LodePNG_InfoColor* dest, const LodePNG_InfoColor* source);
+
+/*Use these functions instead of allocating palette manually*/
+void LodePNG_InfoColor_clearPalette(LodePNG_InfoColor* info);
+unsigned LodePNG_InfoColor_addPalette(LodePNG_InfoColor* info, unsigned char r, unsigned char g, unsigned char b, unsigned char a); /*add 1 color to the palette*/
+
+/*additional color info*/
+unsigned LodePNG_InfoColor_getBpp(const LodePNG_InfoColor* info); /*bits per pixel*/
+unsigned LodePNG_InfoColor_getChannels(const LodePNG_InfoColor* info); /*amount of channels*/
+unsigned LodePNG_InfoColor_isGreyscaleType(const LodePNG_InfoColor* info); /*is it a greyscale type? (colorType 0 or 4)*/
+unsigned LodePNG_InfoColor_isAlphaType(const LodePNG_InfoColor* info); /*has it an alpha channel? (colorType 2 or 6)*/
+
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+typedef struct LodePNG_Time /*LodePNG's encoder does not generate the current time. To make it add a time chunk the correct time has to be provided*/
+{
+ unsigned year; /*2 bytes*/
+ unsigned char month; /*1-12*/
+ unsigned char day; /*1-31*/
+ unsigned char hour; /*0-23*/
+ unsigned char minute; /*0-59*/
+ unsigned char second; /*0-60 (to allow for leap seconds)*/
+} LodePNG_Time;
+
+typedef struct LodePNG_Text /*non-international text*/
+{
+ size_t num;
+ char** keys; /*the keyword of a text chunk (e.g. "Comment")*/
+ char** strings; /*the actual text*/
+} LodePNG_Text;
+
+void LodePNG_Text_init(LodePNG_Text* text);
+void LodePNG_Text_cleanup(LodePNG_Text* text);
+unsigned LodePNG_Text_copy(LodePNG_Text* dest, const LodePNG_Text* source);
+
+/*Use these functions instead of allocating the char**s manually*/
+void LodePNG_Text_clear(LodePNG_Text* text);
+unsigned LodePNG_Text_add(LodePNG_Text* text, const char* key, const char* str); /*push back both texts at once*/
+
+
+typedef struct LodePNG_IText /*international text*/
+{
+ size_t num;
+ char** keys; /*the English keyword of the text chunk (e.g. "Comment")*/
+ char** langtags; /*the language tag for this text's international language, ISO/IEC 646 string, e.g. ISO 639 language tag*/
+ char** transkeys; /*keyword translated to the international language - UTF-8 string*/
+ char** strings; /*the actual international text - UTF-8 string*/
+} LodePNG_IText;
+
+void LodePNG_IText_init(LodePNG_IText* text);
+void LodePNG_IText_cleanup(LodePNG_IText* text);
+unsigned LodePNG_IText_copy(LodePNG_IText* dest, const LodePNG_IText* source);
+
+/*Use these functions instead of allocating the char**s manually*/
+void LodePNG_IText_clear(LodePNG_IText* text);
+unsigned LodePNG_IText_add(LodePNG_IText* text, const char* key, const char* langtag, const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+typedef struct LodePNG_UnknownChunks /*unknown chunks read from the PNG, or extra chunks the user wants to have added in the encoded PNG*/
+{
+ /*There are 3 buffers, one for each position in the PNG where unknown chunks can appear
+ each buffer contains all unknown chunks for that position consecutively
+ The 3 buffers are the unknown chunks between certain critical chunks:
+ 0: IHDR-PLTE, 1: PLTE-IDAT, 2: IDAT-IEND*/
+ unsigned char* data[3];
+ size_t datasize[3]; /*size in bytes of the unknown chunks, given for protection*/
+
+} LodePNG_UnknownChunks;
+
+void LodePNG_UnknownChunks_init(LodePNG_UnknownChunks* chunks);
+void LodePNG_UnknownChunks_cleanup(LodePNG_UnknownChunks* chunks);
+unsigned LodePNG_UnknownChunks_copy(LodePNG_UnknownChunks* dest, const LodePNG_UnknownChunks* src);
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+
+typedef struct LodePNG_InfoPng /*information about the PNG image, except pixels and sometimes except width and height*/
+{
+ /*header (IHDR), palette (PLTE) and transparency (tRNS)*/
+ unsigned width; /*width of the image in pixels (ignored by encoder, but filled in by decoder)*/
+ unsigned height; /*height of the image in pixels (ignored by encoder, but filled in by decoder)*/
+ unsigned compressionMethod; /*compression method of the original file*/
+ unsigned filterMethod; /*filter method of the original file*/
+ unsigned interlaceMethod; /*interlace method of the original file*/
+ LodePNG_InfoColor color; /*color type and bits, palette, transparency*/
+
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+
+ /*suggested background color (bKGD)*/
+ unsigned background_defined; /*is a suggested background color given?*/
+ unsigned background_r; /*red component of suggested background color*/
+ unsigned background_g; /*green component of suggested background color*/
+ unsigned background_b; /*blue component of suggested background color*/
+
+ /*non-international text chunks (tEXt and zTXt)*/
+ LodePNG_Text text;
+
+ /*international text chunks (iTXt)*/
+ LodePNG_IText itext;
+
+ /*time chunk (tIME)*/
+ unsigned char time_defined; /*if 0, no tIME chunk was or will be generated in the PNG image*/
+ LodePNG_Time time;
+
+ /*phys chunk (pHYs)*/
+ unsigned phys_defined; /*is pHYs chunk defined?*/
+ unsigned phys_x;
+ unsigned phys_y;
+ unsigned char phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/
+
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ /*unknown chunks*/
+ LodePNG_UnknownChunks unknown_chunks;
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+
+} LodePNG_InfoPng;
+
+void LodePNG_InfoPng_init(LodePNG_InfoPng* info);
+void LodePNG_InfoPng_cleanup(LodePNG_InfoPng* info);
+unsigned LodePNG_InfoPng_copy(LodePNG_InfoPng* dest, const LodePNG_InfoPng* source);
+
+typedef struct LodePNG_InfoRaw /*contains user-chosen information about the raw image data, which is independent of the PNG image*/
+{
+ LodePNG_InfoColor color;
+} LodePNG_InfoRaw;
+
+void LodePNG_InfoRaw_init(LodePNG_InfoRaw* info);
+void LodePNG_InfoRaw_cleanup(LodePNG_InfoRaw* info);
+unsigned LodePNG_InfoRaw_copy(LodePNG_InfoRaw* dest, const LodePNG_InfoRaw* source);
+
+/*
+LodePNG_convert: Converts from any color type to 24-bit or 32-bit (later maybe more supported). return value = LodePNG error code
+The out buffer must have (w * h * bpp + 7) / 8, where bpp is the bits per pixel of the output color type (LodePNG_InfoColor_getBpp)
+*/
+unsigned LodePNG_convert(unsigned char* out, const unsigned char* in, LodePNG_InfoColor* infoOut, LodePNG_InfoColor* infoIn, unsigned w, unsigned h);
+
+#ifdef LODEPNG_COMPILE_DECODER
+
+typedef struct LodePNG_DecodeSettings
+{
+ LodeZlib_DecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/
+
+ unsigned ignoreCrc; /*ignore CRC checksums*/
+ unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/
+
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ unsigned readTextChunks; /*if false but rememberUnknownChunks is true, they're stored in the unknown chunks*/
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+
+#ifdef LODEPNG_COMPILE_UNKNOWN_CHUNKS
+ unsigned rememberUnknownChunks; /*store all bytes from unknown chunks in the InfoPng (off by default, useful for a png editor)*/
+#endif /*LODEPNG_COMPILE_UNKNOWN_CHUNKS*/
+} LodePNG_DecodeSettings;
+
+void LodePNG_DecodeSettings_init(LodePNG_DecodeSettings* settings);
+
+typedef struct LodePNG_Decoder
+{
+ LodePNG_DecodeSettings settings;
+ LodePNG_InfoRaw infoRaw;
+ LodePNG_InfoPng infoPng; /*info of the PNG image obtained after decoding*/
+ unsigned error;
+} LodePNG_Decoder;
+
+void LodePNG_Decoder_init(LodePNG_Decoder* decoder);
+void LodePNG_Decoder_cleanup(LodePNG_Decoder* decoder);
+void LodePNG_Decoder_copy(LodePNG_Decoder* dest, const LodePNG_Decoder* source);
+
+/*decoding functions*/
+/*This function allocates the out buffer and stores the size in *outsize.*/
+void LodePNG_decode(LodePNG_Decoder* decoder, unsigned char** out, size_t* outsize, const unsigned char* in, size_t insize);
+unsigned LodePNG_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize); /*return value is error*/
+#ifdef LODEPNG_COMPILE_DISK
+unsigned LodePNG_decode32f(unsigned char** out, unsigned* w, unsigned* h, const char* filename);
+#endif /*LODEPNG_COMPILE_DISK*/
+void LodePNG_inspect(LodePNG_Decoder* decoder, const unsigned char* in, size_t size); /*read the png header*/
+
+#endif /*LODEPNG_COMPILE_DECODER*/
+
+#ifdef LODEPNG_COMPILE_ENCODER
+
+typedef struct LodePNG_EncodeSettings
+{
+ LodeZlib_DeflateSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/
+
+ unsigned autoLeaveOutAlphaChannel; /*automatically use color type without alpha instead of given one, if given image is opaque*/
+ unsigned force_palette; /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). If colortype is 3, PLTE is _always_ created.*/
+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
+ unsigned add_id; /*add LodePNG version as text chunk*/
+ unsigned text_compression; /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/
+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
+} LodePNG_EncodeSettings;
+
+void LodePNG_EncodeSettings_init(LodePNG_EncodeSettings* settings);
+
+typedef struct LodePNG_Encoder
+{
+ LodePNG_EncodeSettings settings;
+ LodePNG_InfoPng infoPng; /*the info specified by the user may not be changed by the encoder. The encoder will try to generate a PNG close to the given info.*/
+ LodePNG_InfoRaw infoRaw; /*put the properties of the input raw image in here*/
+ unsigned error;
+} LodePNG_Encoder;
+
+void LodePNG_Encoder_init(LodePNG_Encoder* encoder);
+void LodePNG_Encoder_cleanup(LodePNG_Encoder* encoder);
+void LodePNG_Encoder_copy(LodePNG_Encoder* dest, const LodePNG_Encoder* source);
+
+/*This function allocates the out buffer and stores the size in *outsize.*/
+void LodePNG_encode(LodePNG_Encoder* encoder, unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h);
+unsigned LodePNG_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h); /*return value is error*/
+#ifdef LODEPNG_COMPILE_DISK
+unsigned LodePNG_encode32f(const char* filename, const unsigned char* image, unsigned w, unsigned h);
+#endif /*LODEPNG_COMPILE_DISK*/
+#endif /*LODEPNG_COMPILE_ENCODER*/
+#endif /*LODEPNG_COMPILE_PNG*/
+
+#ifdef LODEPNG_COMPILE_DISK
+/*free functions allowing to load and save a file from/to harddisk*/
+/*This function allocates the out buffer and stores the size in *outsize.*/
+unsigned LodePNG_loadFile(unsigned char** out, size_t* outsize, const char* filename);
+unsigned LodePNG_saveFile(const unsigned char* buffer, size_t buffersize, const char* filename);
+#endif /*LODEPNG_COMPILE_DISK*/
+
+
+/*
+TODO:
+[ ] test if there are no memory leaks or security exploits - done a lot but needs to be checked often
+[ ] LZ77 encoder more like the one described in zlib - to make sure it's patentfree
+[ ] converting color to 16-bit types
+[ ] read all public PNG chunk types (but never let the color profile and gamma ones ever touch RGB values, that is very annoying for textures as well as images in a browser)
+[ ] make sure encoder generates no chunks with size > (2^31)-1
+[ ] partial decoding (stream processing)
+[ ] let the "isFullyOpaque" function check color keys and transparent palettes too
+[ ] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl"
+[ ] check compatibility with vareous compilers - done but needs to be redone for every newer version
+[ ] don't stop decoding on errors like 69, 57, 58 (make warnings that the decoder stores in the error at the very end? and make some errors just let it stop with this one chunk but still do the next ones)
+[ ] make option to choose if the raw image with non multiple of 8 bits per scanline should have padding bits or not, if people like storing raw images that way
+*/
+
+#endif
+
+/*
+LodePNG Documentation
+---------------------
+
+0. table of contents
+--------------------
+
+ 1. about
+ 1.1. supported features
+ 1.2. features not supported
+ 2. C and C++ version
+ 3. A note about security!
+ 4. simple functions
+ 4.1 C Simple Functions
+ 4.2 C++ Simple Functions
+ 5. decoder
+ 6. encoder
+ 7. color conversions
+ 8. info values
+ 9. error values
+ 10. file IO
+ 11. chunks and PNG editing
+ 12. compiler support
+ 13. examples
+ 13.1. decoder example
+ 13.2. encoder example
+ 14. LodeZlib
+ 15. changes
+ 16. contact information
+
+
+1. about
+--------
+
+PNG is a file format to store raster images losslessly with good compression,
+supporting different color types. It can be implemented in a patent-free way.
+
+LodePNG is a PNG codec according to the Portable Network Graphics (PNG)
+Specification (Second Edition) - W3C Recommendation 10 November 2003.
+
+The specifications used are:
+
+*) Portable Network Graphics (PNG) Specification (Second Edition):
+ http://www.w3.org/TR/2003/REC-PNG-20031110
+*) RFC 1950 ZLIB Compressed Data Format version 3.3:
+ http://www.gzip.org/zlib/rfc-zlib.html
+*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3:
+ http://www.gzip.org/zlib/rfc-deflate.html
+
+The most recent version of LodePNG can currently be found at
+http://members.gamedev.net/lode/projects/LodePNG/
+
+LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds
+extra functionality.
+
+LodePNG exists out of two files:
+-lodepng.h: the header file for both C and C++
+-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp depending on your usage
+
+If you want to start using LodePNG right away without reading this doc, get the
+files lodepng_examples.c or lodepng_examples.cpp to see how to use it in code,
+or check the (smaller) examples in chapter 13 here.
+
+LodePNG is simple but only supports the basic requirements. To achieve
+simplicity, the following design choices were made: There are no dependencies
+on any external library. To decode PNGs, there's a Decoder struct or class that
+can convert any PNG file data into an RGBA image buffer with a single function
+call. To encode PNGs, there's an Encoder struct or class that can convert image
+data into PNG file data with a single function call. To read and write files,
+there are simple functions to convert the files to/from buffers in memory.
+
+This all makes LodePNG suitable for loading textures in games, demoscene
+productions, saving a screenshot, images in programs that require them for simple
+usage, ... It's less suitable for full fledged image editors, loading PNGs
+over network (it requires all the image data to be available before decoding can
+begin), life-critical systems, ...
+LodePNG has a standards conformant decoder and encoder, and supports the ability
+to make a somewhat conformant editor.
+
+1.1. supported features
+-----------------------
+
+The following features are supported by the decoder:
+
+*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, or the same color type as the PNG
+*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image
+*) Adam7 interlace and deinterlace for any color type
+*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk
+*) support for alpha channels, including RGBA color model, translucent palettes and color keying
+*) zlib decompression (inflate)
+*) zlib compression (deflate)
+*) CRC32 and ADLER32 checksums
+*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks.
+*) the following chunks are supported (generated/interpreted) by both encoder and decoder:
+ IHDR: header information
+ PLTE: color palette
+ IDAT: pixel data
+ IEND: the final chunk
+ tRNS: transparency for palettized images
+ tEXt: textual information
+ zTXt: compressed textual information
+ iTXt: international textual information
+ bKGD: suggested background color
+ pHYs: physical dimensions
+ tIME: modification time
+
+1.2. features not supported
+---------------------------
+
+The following features are _not_ supported:
+
+*) some features needed to make a conformant PNG-Editor might be still missing.
+*) partial loading/stream processing. All data must be available and is processed in one call.
+*) The following public chunks are not supported but treated as unknown chunks by LodePNG
+ cHRM, gAMA, iCCP, sRGB, sBIT, hIST, sPLT
+
+
+2. C and C++ version
+--------------------
+
+The C version uses buffers allocated with alloc instead that you need to free()
+yourself. On top of that, you need to use init and cleanup functions for each
+struct whenever using a struct from the C version to avoid exploits and memory leaks.
+
+The C++ version has constructors and destructors that take care of these things,
+and uses std::vectors in the interface for storing data.
+
+Both the C and the C++ version are contained in this file! The C++ code depends on
+the C code, the C code works on its own.
+
+These files work without modification for both C and C++ compilers because all the
+additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers ignore
+it, and the C code is made to compile both with strict ISO C90 and C++.
+
+To use the C++ version, you need to rename the source file to lodepng.cpp (instead
+of lodepng.c), and compile it with a C++ compiler.
+
+To use the C version, you need to rename the source file to lodepng.c (instead
+of lodepng.cpp), and compile it with a C compiler.
+
+
+3. A note about security!
+-------------------------
+
+Despite being used already and having received bug fixes whenever bugs were reported,
+LodePNG may still contain possible exploits.
+
+If you discover a possible exploit, please let me know, and it will be eliminated.
+
+When using LodePNG, care has to be taken with the C version of LodePNG, as well as the C-style
+structs when working with C++. The following conventions are used for all C-style structs:
+
+-if a struct has a corresponding init function, always call the init function when making a new one, to avoid exploits
+-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks
+-if a struct has a corresponding copy function, use the copy function instead of "=". The destination must be inited already!
+
+
+4. "Simple" Functions
+---------------------
+
+For the most simple usage cases of loading and saving a PNG image, there
+are some simple functions that do everything in 1 call (instead of you
+having to instantiate a struct or class).
+
+The simple versions always use 32-bit RGBA color for the raw image, but
+still support loading arbitrary-colortype PNG images.
+
+The later sections of this manual are devoted to the complex versions, where
+you can use other color types and conversions.
+
+4.1 C Simple Functions
+----------------------
+
+The C simple functions have a "32" or "32f" in their name, and don't take a struct as
+parameter, unlike the non-simple ones (see more down in the documentation).
+
+unsigned LodePNG_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize);
+
+Load PNG from given buffer.
+As input, give an unsigned char* buffer gotten by loading the .png file and its size.
+As output, you get a dynamically allocated buffer of large enough size, and the width and height of the image.
+The buffer's size is w * h * 4. The image is in RGBA format.
+The return value is the error (0 if ok).
+You need to do free(out) after usage to clean up the memory.
+
+unsigned LodePNG_decode32f(unsigned char** out, unsigned* w, unsigned* h, const char* filename);
+
+Load PNG from disk, from file with given name.
+Same as decode32, except you give a filename instead of an input buffer.
+
+unsigned LodePNG_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h);
+
+Encode PNG into buffer.
+As input, give a image buffer of size w * h * 4, in RGBA format.
+As output, you get a dynamically allocated buffer and its size, which is a PNG file that can
+directly be saved in this form to the harddisk.
+The return value is the error (0 if ok).
+You need to do free(out) after usage to clean up the memory.
+
+unsigned LodePNG_encode32f(const char* filename, const unsigned char* image, unsigned w, unsigned h);
+
+Encode PNG into file on disk with given name.
+If the file exists, it's overwritten without warning!
+Same parameters as encode2, except the result is stored in a file instead of a dynamic buffer.
+
+4.2 C++ Simple Functions
+------------------------
+
+For decoding a PNG there are:
+
+unsigned LodePNG::decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const unsigned char* in, unsigned size);
+unsigned LodePNG::decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const std::vector<unsigned char>& in);
+unsigned LodePNG::decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const std::string& filename);
+
+These store the pixel data as 32-bit RGBA color in the out vector, and the width
+and height of the image in w and h.
+The 3 functions each have a different input type: The first as unsigned char
+buffer, the second as std::vector buffer, and the third allows you to give the
+filename in case you want to load the PNG from disk instead of from a buffer.
+The return value is the error (0 if ok).
+
+For encoding a PNG there are:
+
+unsigned LodePNG::encode(std::vector<unsigned char>& out, const unsigned char* in, unsigned w, unsigned h);
+unsigned LodePNG::encode(std::vector<unsigned char>& out, const std::vector<unsigned char>& in, unsigned w, unsigned h);
+unsigned LodePNG::encode(const std::string& filename, const std::vector<unsigned char>& in, unsigned w, unsigned h);
+unsigned LodePNG::encode(const std::string& filename, const unsigned char* in, unsigned w, unsigned h);
+
+Specify the width and height of the input image with w and h.
+You can choose to get the output in an std::vector or stored in a file, and
+the input can come from an std::vector or an unsigned char* buffer. The input
+buffer must be in RGBA format and the size must be w * h * 4 bytes.
+
+The first two functions append to the out buffer, they don't clear it, clear it
+first before encoding into a buffer that you expect to only contain this result.
+
+On the other hand, the functions that encode to a file will completely overwrite
+the original file without warning if it exists.
+
+The return value is the error (0 if ok).
+
+5. Decoder
+----------
+
+This is about the LodePNG_Decoder struct in the C version, and the
+LodePNG::Decoder class in the C++ version. The C++ version inherits
+from the C struct and adds functions in the interface.
+
+The Decoder class can be used to convert a PNG image to a raw image.
+
+Usage:
+
+-in C++:
+ declare a LodePNG::Decoder
+ call its decode member function with the parameters described below
+
+-in C more needs to be done due to the lack of constructors and destructors:
+ declare a LodePNG_Decoder struct
+ call LodePNG_Decoder_init with the struct as parameter
+ call LodePNG_Decode with the parameters described below
+ after usage, call LodePNG_Decoder_cleanup with the struct as parameter
+ after usage, free() the out buffer with image data that was created by the decode function
+
+The other parameters of the decode function are:
+*) out: this buffer will be filled with the raw image pixels
+*) in: pointer to the PNG image data or std::vector with the data
+*) size: the size of the PNG image data (not needed for std::vector version)
+
+After decoding you need to read the width and height of the image from the
+decoder, see further down in this manual to see how.
+
+There's also an optional function "inspect". It has the same parameters as decode except
+the "out" parameter. This function will read only the header chunk of the PNG
+image, and store the information from it in the LodePNG_InfoPng (see below).
+This allows knowing information about the image without decoding it. Only the
+header (IHDR) information is read by this, not text chunks, not the palette, ...
+
+During the decoding it's possible that an error can happen, for example if the
+PNG image was corrupted. To check if an error happened during the last decoding,
+check the value error, which is a member of the decoder struct.
+In the C++ version, use hasError() and getError() of the Decoder.
+The error codes are explained in another section.
+
+Now about colors and settings...
+
+The Decoder contains 3 components:
+*) LodePNG_InfoPng: it stores information about the PNG (the input) in an LodePNG_InfoPng struct, don't modify this one yourself
+*) Settings: you can specify a few other settings for the decoder to use
+*) LodePNG_InfoRaw: here you can say what type of raw image (the output) you want to get
+
+Some of the parameters described below may be inside the sub-struct "LodePNG_InfoColor color".
+In the C and C++ version, when using Info structs outside of the decoder or encoder, you need to use their
+init and cleanup functions, but normally you use the ones in the decoder that are already handled
+in the init and cleanup functions of the decoder itself.
+
+=LodePNG_InfoPng=
+
+This contains information such as the original color type of the PNG image, text
+comments, suggested background color, etc... More details about the LodePNG_InfoPng struct
+are in another section.
+
+Because the dimensions of the image are important, there are shortcuts to get them in the
+C++ version: use decoder.getWidth() and decoder.getHeight().
+In the C version, use decoder.infoPng.width and decoder.infoPng.height.
+
+=LodePNG_InfoRaw=
+
+In the LodePNG_InfoRaw struct of the Decoder, you can specify which color type you want
+the resulting raw image to be. If this is different from the colorType of the
+PNG, then the decoder will automatically convert the result to your LodePNG_InfoRaw
+settings. Currently the following options are supported to convert to:
+-colorType 6, bitDepth 8: 32-bit RGBA
+-colorType 2, bitDepth 8: 24-bit RGB
+-other color types if it's exactly the same as that in the PNG image
+
+Palette of LodePNG_InfoRaw isn't used by the Decoder, when converting from palette color
+to palette color, the values of the pixels are left untouched so that the colors
+will change if the palette is different. Color key of LodePNG_InfoRaw is not used by the
+Decoder. If setting color_convert is false then LodePNG_InfoRaw is completely ignored,
+but it will be modified to match the color type of the PNG so will be overwritten.
+
+By default, 32-bit color is used for the result.
+
+=Settings=
+
+The Settings can be used to ignore the errors created by invalid CRC and Adler32
+chunks, and to disable the decoding of tEXt chunks.
+
+There's also a setting color_convert, true by default. If false, no conversion
+is done, the resulting data will be as it was in the PNG (after decompression)
+and you'll have to puzzle the colors of the pixels together yourself using the
+color type information in the LodePNG_InfoPng.
+
+
+6. Encoder
+----------
+
+This is about the LodePNG_Encoder struct in the C version, and the
+LodePNG::Encoder class in the C++ version.
+
+The Encoder class can be used to convert raw image data into a PNG image.
+
+The PNG part of the encoder is working good, the zlib compression part is
+becoming quite fine but not as good as the official zlib yet, because it's not
+as fast and doesn't provide an as high compression ratio.
+
+Usage:
+
+-in C++:
+ declare a LodePNG::Encoder
+ call its encode member function with the parameters described below
+
+-in C more needs to be done due to the lack of constructors and destructors:
+ declare a LodePNG_Encoder struct
+ call LodePNG_Encoder_init with the struct as parameter
+ call LodePNG_Encode with the parameters described below
+ after usage, call LodePNG_Encoder_cleanup with the struct as parameter
+ after usage, free() the out buffer with PNG data that was created by the encode function
+
+The raw image given to the encoder is an unsigned char* buffer. You also have to
+specify the width and height of the raw image. The result is stored in a given
+buffer. These buffers can be unsigned char* pointers, std::vectors or dynamically
+allocated unsigned char* buffers that you have to free() yourself, depending on
+which you use.
+
+The parameters of the encode function are:
+*) out: in this buffer the PNG file data will be stored (it will be appended)
+*) in: vector of or pointer to a buffer containing the raw image
+*) w and h: the width and height of the raw image in pixels
+
+Make sure that the in buffer you provide, is big enough to contain w * h pixels
+of the color type specified by the LodePNG_InfoRaw.
+
+In the C version, you need to free() the out buffer after usage to avoid memory leaks.
+In the C version, you need to use the LodePNG_Encoder_init function before using the decoder,
+and the LodePNG_Encoder_cleanup function after using it.
+In the C++ version, you don't need to do this since RAII takes care of it.
+
+The encoder generates some errors but not for everything, because, unlike when
+decoding a PNG, when encoding one there aren't so much parameters of the input
+that can be corrupted. It's the responsibility of the user to make sure that all
+preconditions are satesfied, such as giving a correct window size, giving an
+existing btype, making sure the given buffer is large enough to contain an image
+with the given width and height and colortype, ... The encoder can generate
+some errors, see the section with the explanations of errors for those.
+
+Like the Decoder, the Encoder has 3 components:
+*) LodePNG_InfoRaw: here you say what color type of the raw image (the input) has
+*) Settings: you can specify a few settings for the encoder to use
+*) LodePNG_InfoPng: the same LodePNG_InfoPng struct as created by the Decoder. For the encoder,
+with this you specify how you want the PNG (the output) to be.
+
+Some of the parameters described below may be inside the sub-struct "LodePNG_InfoColor color".
+In the C and C++ version, when using Info structs outside of the decoder or encoder, you need to use their
+init and cleanup functions, but normally you use the ones in the encoder that are already handled
+in the init and cleanup functions of the decoder itself.
+
+=LodePNG_InfoPng=
+
+The Decoder class stores information about the PNG image in an LodePNG_InfoPng object. With
+the Encoder you can do the opposite: you give it an LodePNG_InfoPng object, and it'll try
+to match the LodePNG_InfoPng you give as close as possible in the PNG it encodes. For
+example in the LodePNG_InfoPng you can specify the color type you want to use, possible
+tEXt chunks you want the PNG to contain, etc... For an explanation of all the
+values in LodePNG_InfoPng see a further section. Not all PNG color types are supported
+by the Encoder.
+
+Note that the encoder will only TRY to match the LodePNG_InfoPng struct you give.
+Some things are ignored by the encoder. The width and height of LodePNG_InfoPng are
+ignored as well, because instead the width and height of the raw image you give
+in the input are used. In fact the encoder currently uses only the following
+settings from it:
+-colorType: the ones it supports
+-text chunks, that you can add to the LodePNG_InfoPng with "addText"
+-the color key, if applicable for the given color type
+-the palette, if you encode to a PNG with colorType 3
+-the background color: it'll add a bKGD chunk to the PNG if one is given
+-the interlaceMethod: None (0) or Adam7 (1)
+
+When encoding to a PNG with colorType 3, the encoder will generate a PLTE chunk.
+If the palette contains any colors for which the alpha channel is not 255 (so
+there are translucent colors in the palette), it'll add a tRNS chunk.
+
+=LodePNG_InfoRaw=
+
+You specify the color type of the raw image that you give to the input here,
+including a possible transparent color key and palette you happen to be using in
+your raw image data.
+
+By default, 32-bit color is assumed, meaning your input has to be in RGBA
+format with 4 bytes (unsigned chars) per pixel.
+
+=Settings=
+
+The following settings are supported (some are in sub-structs):
+*) autoLeaveOutAlphaChannel: when this option is enabled, when you specify a PNG
+color type with alpha channel (not to be confused with the color type of the raw
+image you specify!!), but the encoder detects that all pixels of the given image
+are opaque, then it'll automatically use the corresponding type without alpha
+channel, resulting in a smaller PNG image.
+*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, 2 = dynamic huffman tree (best compression)
+*) useLZ77: whether or not to use LZ77 for compressed block types
+*) windowSize: the window size used by the LZ77 encoder (1 - 32768)
+*) force_palette: if colorType is 2 or 6, you can make the encoder write a PLTE
+ chunk if force_palette is true. This can used as suggested palette to convert
+ to by viewers that don't support more than 256 colors (if those still exist)
+*) add_id: add text chunk "Encoder: LodePNG <version>" to the image.
+*) text_compression: default 0. If 1, it'll store texts as zTXt instead of tEXt chunks.
+ zTXt chunks use zlib compression on the text. This gives a smaller result on
+ large texts but a larger result on small texts (such as a single program name).
+ It's all tEXt or all zTXt though, there's no separate setting per text yet.
+
+
+7. color conversions
+--------------------
+
+For trickier usage of LodePNG, you need to understand about PNG color types and
+about how and when LodePNG uses the settings in LodePNG_InfoPng, LodePNG_InfoRaw and Settings.
+
+=PNG color types=
+
+A PNG image can have many color types, ranging from 1-bit color to 64-bit color,
+as well as palettized color modes. After the zlib decompression and unfiltering
+in the PNG image is done, the raw pixel data will have that color type and thus
+a certain amount of bits per pixel. If you want the output raw image after
+decoding to have another color type, a conversion is done by LodePNG.
+
+The PNG specification mentions the following color types:
+
+0: greyscale, bit depths 1, 2, 4, 8, 16
+2: RGB, bit depths 8 and 16
+3: palette, bit depths 1, 2, 4 and 8
+4: greyscale with alpha, bit depths 8 and 16
+6: RGBA, bit depths 8 and 16
+
+Bit depth is the amount of bits per color channel.
+
+=Default Behaviour of LodePNG=
+
+By default, the Decoder will convert the data from the PNG to 32-bit RGBA color,
+no matter what color type the PNG has, so that the result can be used directly
+as a texture in OpenGL etc... without worries about what color type the original
+image has.
+
+The Encoder assumes by default that the raw input you give it is a 32-bit RGBA
+buffer and will store the PNG as either 32 bit or 24 bit depending on whether
+or not any translucent pixels were detected in it.
+
+To get the default behaviour, don't change the values of LodePNG_InfoRaw and LodePNG_InfoPng of
+the encoder, and don't change the values of LodePNG_InfoRaw of the decoder.
+
+=Color Conversions=
+
+As explained in the sections about the Encoder and Decoder, you can specify
+color types and bit depths in LodePNG_InfoPng and LodePNG_InfoRaw, to change the default behaviour
+explained above. (for the Decoder you can only specify the LodePNG_InfoRaw, because the
+LodePNG_InfoPng contains what the PNG file has).
+
+To avoid some confusion:
+-the Decoder converts from PNG to raw image
+-the Encoder converts from raw image to PNG
+-the color type and bit depth in LodePNG_InfoRaw, are those of the raw image
+-the color type and bit depth in LodePNG_InfoPng, are those of the PNG
+-if the color type of the LodePNG_InfoRaw and PNG image aren't the same, a conversion
+between the color types is done if the color types are supported
+
+Supported color types:
+-It's possible to load PNGs from any colortype and to save PNGs of any colorType.
+-Both encoder and decoder use the same converter. So both encoder and decoder
+suport the same color types at the input and the output. So the decoder supports
+any type of PNG image and can convert it to certain types of raw image, while the
+encoder supports any type of raw data but only certain color types for the output PNG.
+-The converter can convert from _any_ input color type, to 24-bit RGB or 32-bit RGBA
+-The converter can convert from greyscale input color type, to 8-bit greyscale or greyscale with alpha
+-If both color types are the same, conversion from anything to anything is possible
+-Color types that are invalid according to the PNG specification are not allowed
+-When converting from a type with alpha channel to one without, the alpha channel information is discarded
+-When converting from a type without alpha channel to one with, the result will be opaque except pixels that have the same color as the color key of the input if one was given
+-When converting from 16-bit bitDepth to 8-bit bitDepth, the 16-bit precision information is lost, only the most significant byte is kept
+-Converting from color to greyscale is not supported on purpose: choosing what kind of color to greyscale conversion to do is not a decision a PNG codec should make
+-Converting from/to a palette type, only keeps the indices, it ignores the colors defined in the palette
+
+No conversion needed...:
+-If the color type of the PNG image and raw image are the same, then no
+conversion is done, and all color types are supported.
+-In the encoder, you can make it save a PNG with any color by giving the
+LodePNG_InfoRaw and LodePNG_InfoPng the same color type.
+-In the decoder, you can make it store the pixel data in the same color type
+as the PNG has, by setting the color_convert setting to false. Settings in
+infoRaw are then ignored.
+
+The function LodePNG_convert does this, which is available in the interface but
+normally isn't needed since the encoder and decoder already call it.
+
+=More Notes=
+
+In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines
+have a bit amount that isn't a multiple of 8, then padding bits are used so that each
+scanline starts at a fresh byte.
+However: The input image you give to the encoder, and the output image you get from the decoder
+will NOT have these padding bits in that case, e.g. in the case of a 1-bit image with a width
+of 7 pixels, the first pixel of the second scanline will the the 8th bit of the first byte,
+not the first bit of a new byte.
+
+8. info values
+--------------
+
+Both the encoder and decoder use a variable of type LodePNG_InfoPng and LodePNG_InfoRaw, which
+both also contain a LodePNG_InfoColor. Here's a list of each of the values stored in them:
+
+*) info from the PNG header (IHDR chunk):
+
+width: width of the image in pixels
+height: height of the image in pixels
+colorType: color type of the original PNG file
+bitDepth: bits per sample
+compressionMethod: compression method of the original file. Always 0.
+filterMethod: filter method of the original file. Always 0.
+interlaceMethod: interlace method of the original file. 0 is no interlace, 1 is adam7 interlace.
+
+Note: width and height are only used as information of a decoded PNG image. When encoding one, you don't have
+to specify width and height in an LodePNG_Info struct, but you give them as parameters of the encode function.
+The rest of the LodePNG_Info struct IS used by the encoder though!
+
+*) palette:
+
+This is a dynamically allocated unsigned char array with the colors of the palette. The value palettesize
+indicates the amount of colors in the palette. The allocated size of the buffer is 4 * palettesize bytes,
+because there are 4 values per color: R, G, B and A. Even if less color channels are used, the palette
+is always in RGBA format, in the order RGBARGBARGBA.....
+
+When encoding a PNG, to store your colors in the palette of the LodePNG_InfoRaw, first use
+LodePNG_InfoColor_clearPalette, then for each color use LodePNG_InfoColor_addPalette.
+In the C++ version the Encoder class also has the above functions available directly in its interface.
+
+Note that the palette information from the tRNS chunk is also already included in this palette vector.
+
+If you encode an image with palette, don't forget that you have to set the alpha channels (A) of the palette
+too, set them to 255 for an opaque palette. If you leave them at zero, the image will be encoded as
+fully invisible. This both for the palette in the infoRaw and the infoPng if the png is to have a palette.
+
+*) transparent color key
+
+key_defined: is a transparent color key given?
+key_r: red/greyscale component of color key
+key_g: green component of color key
+key_b: blue component of color key
+
+For greyscale PNGs, r, g and b will all 3 be set to the same.
+
+This color is 8-bit for 8-bit PNGs, 16-bit for 16-bit per channel PNGs.
+
+*) suggested background color
+
+background_defined: is a suggested background color given?
+background_r: red component of sugg. background color
+background_g: green component of sugg. background color
+background_b: blue component of sugg. background color
+
+This color is 8-bit for 8-bit PNGs, 16-bit for 16-bit PNGs
+
+For greyscale PNGs, r, g and b will all 3 be set to the same. When encoding
+the encoder writes the red one away.
+For palette PNGs: When decoding, the RGB value will be stored, no a palette
+index. But when encoding, specify the index of the palette in background_r,
+the other two are then ignored.
+
+The decoder pretty much ignores this background color, after all if you make a
+PNG translucent normally you intend it to be used against any background, on
+websites, as translucent textures in games, ... But you can get the color this
+way if needed.
+
+*) text and itext
+
+Non-international text:
+
+-text.keys: a char** buffer containing the keywords (see below)
+-text.strings: a char** buffer containing the texts (see below)
+-text.num: the amount of texts in the above char** buffers (there may be more texts in itext)
+-LodePNG_InfoText_clearText: use this to clear the texts again after you filled them in
+-LodePNG_InfoText_addText: this function is used to push back a keyword and text
+
+International text: This is stored in separate arrays! The sum text.num and itext.num is the real amount of texts.
+
+-itext.keys: keyword in English
+-itext.langtags: ISO 639 letter code for the language
+-itext.transkeys: keyword in this language
+-itext.strings: the text in this language, in UTF-8
+-itext.num: the amount of international texts in this PNG
+-LodePNG_InfoIText_clearText: use this to clear the itexts again after you filled them in
+-LodePNG_InfoIText_addText: this function is used to push back all 4 parts of an itext
+
+Don't allocate these text buffers yourself. Use the init/cleanup functions
+correctly and use addText and clearText.
+
+In the C++ version the Encoder class also has the above functions available directly in its interface.
+The char** buffers are used like the argv parameter of a main() function, and (i)text.num takes the role
+of argc.
+
+In a text, there must be as much keys as strings because they always form pairs. In an itext,
+there must always be as much keys, langtags, transkeys and strings.
+
+They keyword of text chunks gives a short description what the actual text
+represents. There are a few standard standard keywords recognised
+by many programs: Title, Author, Description, Copyright, Creation Time,
+Software, Disclaimer, Warning, Source, Comment. It's allowed to use other keys.
+
+The keyword is minimum 1 character and maximum 79 characters long. It's
+discouraged to use a single line length longer than 79 characters for texts.
+
+*) additional color info
+
+These functions are available with longer names in the C version, and directly
+in the Decoder's interface in the C++ version.
+
+getBpp(): bits per pixel of the PNG image
+getChannels(): amount of color channels of the PNG image
+isGreyscaleType(): its color type 0 or 4
+isAlphaType(): its color type 2 or 6
+
+These values are calculated out of color type and bit depth of InfoColor.
+
+The difference between bits per pixel and bit depth is that bit depth is the
+number of bits per color channel, while a pixel can have multiple channels.
+
+*) pHYs chunk (image dimensions)
+
+phys_defined: if 0, there is no pHYs chunk and the values are undefined, if 1 else there is one
+phys_x: pixels per unit in x direction
+phys_y: pixels per unit in y direction
+phys_unit: the unit, 0 is no unit (x and y only give the ratio), 1 is metre
+
+*) tIME chunk (modification time)
+
+time_defined: if 0, there is no tIME chunk and the values are undefined, if 1 there is one
+time: this struct contains year as a 2-byte number (0-65535), month, day, hour, minute,
+second as 1-byte numbers that must be in the correct range
+
+Note: to make the encoder add a time chunk, set time_defined to 1 and fill in
+the correct values in all the time parameters, LodePNG will not fill the current
+time in these values itself, all it does is copy them over into the chunk bytes.
+
+
+9. error values
+---------------
+
+The meanings of the LodePNG error values:
+
+*) 0: no error, everything went ok
+*) 1: the Encoder/Decoder has done nothing yet, so error checking makes no sense yet
+*) 10: while huffman decoding: end of input memory reached without endcode
+*) 11: while huffman decoding: error in code tree made it jump outside of tree
+*) 13: problem while processing dynamic deflate block
+*) 14: problem while processing dynamic deflate block
+*) 15: problem while processing dynamic deflate block
+*) 16: unexisting code while processing dynamic deflate block
+*) 17: while inflating: end of out buffer memory reached
+*) 18: while inflating: invalid distance code
+*) 19: while inflating: end of out buffer memory reached
+*) 20: invalid deflate block BTYPE encountered while decoding
+*) 21: NLEN is not ones complement of LEN in a deflate block
+*) 22: while inflating: end of out buffer memory reached.
+ This can happen if the inflated deflate data is longer than the amount of bytes required to fill up
+ all the pixels of the image, given the color depth and image dimensions. Something that doesn't
+ happen in a normal, well encoded, PNG image.
+*) 23: while inflating: end of in buffer memory reached
+*) 24: invalid FCHECK in zlib header
+*) 25: invalid compression method in zlib header
+*) 26: FDICT encountered in zlib header while it's not used for PNG
+*) 27: PNG file is smaller than a PNG header
+*) 28: incorrect PNG signature (the first 8 bytes of the PNG file)
+ Maybe it's not a PNG, or a PNG file that got corrupted so that the header indicates the corruption.
+*) 29: first chunk is not the header chunk
+*) 30: chunk length too large, chunk broken off at end of file
+*) 31: illegal PNG color type or bpp
+*) 32: illegal PNG compression method
+*) 33: illegal PNG filter method
+*) 34: illegal PNG interlace method
+*) 35: chunk length of a chunk is too large or the chunk too small
+*) 36: illegal PNG filter type encountered
+*) 37: illegal bit depth for this color type given
+*) 38: the palette is too big (more than 256 colors)
+*) 39: more palette alpha values given in tRNS, than there are colors in the palette
+*) 40: tRNS chunk has wrong size for greyscale image
+*) 41: tRNS chunk has wrong size for RGB image
+*) 42: tRNS chunk appeared while it was not allowed for this color type
+*) 43: bKGD chunk has wrong size for palette image
+*) 44: bKGD chunk has wrong size for greyscale image
+*) 45: bKGD chunk has wrong size for RGB image
+*) 46: value encountered in indexed image is larger than the palette size (bitdepth == 8). Is the palette too small?
+*) 47: value encountered in indexed image is larger than the palette size (bitdepth < 8). Is the palette too small?
+*) 48: the input data is empty. Maybe a PNG file you tried to load doesn't exist or is in the wrong path.
+*) 49: jumped past memory while generating dynamic huffman tree
+*) 50: jumped past memory while generating dynamic huffman tree
+*) 51: jumped past memory while inflating huffman block
+*) 52: jumped past memory while inflating
+*) 53: size of zlib data too small
+*) 55: jumped past tree while generating huffman tree, this could be when the
+ tree will have more leaves than symbols after generating it out of the
+ given lengths. They call this an oversubscribed dynamic bit lengths tree in zlib.
+*) 56: given output image colorType or bitDepth not supported for color conversion
+*) 57: invalid CRC encountered (checking CRC can be disabled)
+*) 58: invalid ADLER32 encountered (checking ADLER32 can be disabled)
+*) 59: conversion to unexisting or unsupported color type or bit depth requested by encoder or decoder
+*) 60: invalid window size given in the settings of the encoder (must be 0-32768)
+*) 61: invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)
+*) 62: conversion from non-greyscale color to greyscale color requested by encoder or decoder. LodePNG
+ leaves the choice of RGB to greyscale conversion formula to the user.
+*) 63: length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk (2^31-1)
+*) 64: the length of the "end" symbol 256 in the Huffman tree is 0, resulting in the inability of a deflated
+ block to ever contain an end code. It must be at least 1.
+*) 66: the length of a text chunk keyword given to the encoder is longer than the maximum 79 bytes.
+*) 67: the length of a text chunk keyword given to the encoder is smaller than the minimum 1 byte.
+*) 68: tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors
+*) 69: unknown chunk type with "critical" flag encountered by the decoder
+*) 71: unexisting interlace mode given to encoder (must be 0 or 1)
+*) 72: while decoding, unexisting compression method encountering in zTXt or iTXt chunk (it must be 0)
+*) 73: invalid tIME chunk size
+*) 74: invalid pHYs chunk size
+*) 75: no null termination char found while decoding any kind of text chunk, or wrong length
+*) 76: iTXt chunk too short to contain required bytes
+*) 77: integer overflow in buffer size happened somewhere
+*) 78: file doesn't exist or couldn't be opened for reading
+*) 79: file couldn't be opened for writing
+*) 80: tried creating a tree for 0 symbols
+*) 9900-9999: out of memory while allocating chunk of memory somewhere
+
+
+10. file IO
+-----------
+
+For cases where you want to load the PNG image from a file, you can use your own
+file loading code, or the file loading and saving functions provided with
+LodePNG. These use the same unsigned char format used by the Decoder and Encoder.
+
+The loadFile function fills the given buffer up with the file from harddisk
+with the given name.
+
+The saveFile function saves the contents of the given buffer to the file
+with given name. Warning: this overwrites the contents that were previously in
+the file if it already existed, without warning.
+
+Note that you don't have to decode a PNG image from a file, you can as well
+retrieve the buffer another way in your code, because the decode function takes
+a buffer as parameter, not a filename.
+
+Both C and C++ versions of the loadFile and saveFile functions are available.
+For the C version of loadFile, you need to free() the buffer after use. The
+C++ versions use std::vectors so they clean themselves automatically.
+
+
+11. chunks and PNG editing
+--------------------------
+
+If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG
+editor that should follow the rules about handling of unknown chunks, or if you
+program is able to read other types of chunks than the ones handled by LodePNG,
+then that's possible with the chunk functions of LodePNG.
+
+A PNG chunk has the following layout:
+
+4 bytes length
+4 bytes type name
+length bytes data
+4 bytes CRC
+
+
+11.1 iterating through chunks
+-----------------------------
+
+If you have a buffer containing the PNG image data, then the first chunk (the
+IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the
+signature of the PNG and are not part of a chunk. But if you start at byte 8
+then you have a chunk, and can check the following things of it.
+
+NOTE: none of these functions check for memory buffer boundaries. To avoid
+exploits, always make sure the buffer contains all the data of the chunks.
+When using LodePNG_chunk_next, make sure the returned value is within the
+allocated memory.
+
+unsigned LodePNG_chunk_length(const unsigned char* chunk):
+
+Get the length of the chunk's data. The total chunk length is this length + 12.
+
+void LodePNG_chunk_type(char type[5], const unsigned char* chunk):
+unsigned char LodePNG_chunk_type_equals(const unsigned char* chunk, const char* type):
+
+Get the type of the chunk or compare if it's a certain type
+
+unsigned char LodePNG_chunk_critical(const unsigned char* chunk):
+unsigned char LodePNG_chunk_private(const unsigned char* chunk):
+unsigned char LodePNG_chunk_safetocopy(const unsigned char* chunk):
+
+Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are).
+Check if the chunk is private (public chunks are part of the standard, private ones not).
+Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical
+chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your
+program doesn't handle that type of unknown chunk.
+
+unsigned char* LodePNG_chunk_data(unsigned char* chunk):
+const unsigned char* LodePNG_chunk_data_const(const unsigned char* chunk):
+
+Get a pointer to the start of the data of the chunk.
+
+unsigned LodePNG_chunk_check_crc(const unsigned char* chunk):
+void LodePNG_chunk_generate_crc(unsigned char* chunk):
+
+Check if the crc is correct or generate a correct one.
+
+unsigned char* LodePNG_chunk_next(unsigned char* chunk):
+const unsigned char* LodePNG_chunk_next_const(const unsigned char* chunk):
+
+Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these
+functions do no boundary checking of the allocated data whatsoever, so make sure there is enough
+data available in the buffer to be able to go to the next chunk.
+
+unsigned LodePNG_append_chunk(unsigned char** out, size_t* outlength, const unsigned char* chunk):
+unsigned LodePNG_create_chunk(unsigned char** out, size_t* outlength, unsigned length, const char* type, const unsigned char* data):
+
+These functions are used to create new chunks that are appended to the data in *out that has
+length *outlength. The append function appends an existing chunk to the new data. The create
+function creates a new chunk with the given parameters and appends it. Type is the 4-letter
+name of the chunk.
+
+
+11.2 chunks in infoPng
+----------------------
+
+The LodePNG_InfoPng struct contains a struct LodePNG_UnknownChunks in it. This
+struct has 3 buffers (each with size) to contain 3 types of unknown chunks:
+the ones that come before the PLTE chunk, the ones that come between the PLTE
+and the IDAT chunks, and the ones that come after the IDAT chunks.
+It's necessary to make the distionction between these 3 cases because the PNG
+standard forces to keep the ordering of unknown chunks compared to the critical
+chunks, but does not force any other ordering rules.
+
+infoPng.unknown_chunks.data[0] is the chunks before PLTE
+infoPng.unknown_chunks.data[1] is the chunks after PLTE, before IDAT
+infoPng.unknown_chunks.data[2] is the chunks after IDAT
+
+The chunks in these 3 buffers can be iterated through and read by using the same
+way described in the previous subchapter.
+
+When using the decoder to decode a PNG, you can make it store all unknown chunks
+if you set the option settings.rememberUnknownChunks to 1. By default, this option
+is off and is 0.
+
+The encoder will always encode unknown chunks that are stored in the infoPng. If
+you need it to add a particular chunk that isn't known by LodePNG, you can use
+LodePNG_append_chunk or LodePNG_create_chunk to the chunk data in
+infoPng.unknown_chunks.data[x].
+
+Chunks that are known by LodePNG should not be added in that way. E.g. to make
+LodePNG add a bKGD chunk, set background_defined to true and add the correct
+parameters there and LodePNG will generate the chunk.
+
+
+12. compiler support
+--------------------
+
+No libraries other than the current standard C library are needed to compile
+LodePNG. For the C++ version, only the standard C++ library is needed on top.
+Add the files lodepng.c(pp) and lodepng.h to your project, include
+lodepng.h where needed, and your program can read/write PNG files.
+
+Use optimization! For both the encoder and decoder, compiling with the best
+optimizations makes a large difference.
+
+Make sure that LodePNG is compiled with the same compiler of the same version
+and with the same settings as the rest of the program, or the interfaces with
+std::vectors and std::strings in C++ can be incompatible resulting in bad things.
+
+CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets.
+
+*) gcc and g++
+
+LodePNG is developed in gcc so this compiler is natively supported. It gives no
+warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++
+version 4.2.2 on Linux.
+
+*) Mingw and Bloodshed DevC++
+
+The Mingw compiler (a port of gcc) used by Bloodshed DevC++ for Windows is fully
+supported by LodePNG.
+
+*) Visual Studio 2005 and Visual C++ 2005 Express Edition
+
+Versions 20070604 up to 20080107 have been tested on VS2005 and work. There are no
+warnings, except two warnings about 'fopen' being deprecated. 'fopen' is a function
+required by the C standard, so this warning is the fault of VS2005, it's nice of
+them to enforce secure code, however the multiplatform LodePNG can't follow their
+non-standard extensions. LodePNG is fully ISO C90 compliant.
+
+If you're using LodePNG in VS2005 and don't want to see the deprecated warnings,
+put this on top of lodepng.h before the inclusions: #define _CRT_SECURE_NO_DEPRECATE
+
+*) Visual Studio 6.0
+
+The C++ version of LodePNG was not supported by Visual Studio 6.0 because Visual
+Studio 6.0 doesn't follow the C++ standard and implements it incorrectly.
+The current C version of LodePNG has not been tested in VS6 but may work now.
+
+*) Comeau C/C++
+
+Vesion 20070107 compiles without problems on the Comeau C/C++ Online Test Drive
+at http://www.comeaucomputing.com/tryitout in both C90 and C++ mode.
+
+*) Compilers on Macintosh
+
+I'd love to support Macintosh but don't have one available to test it on.
+If it doesn't work with your compiler, maybe it can be gotten to work with the
+gcc compiler for Macintosh. Someone reported that it doesn't work well at all
+for Macintosh. All information on attempts to get it to work on Mac is welcome.
+
+*) Other Compilers
+
+If you encounter problems on other compilers, I'm happy to help out make LodePNG
+support the compiler if it supports the ISO C90 and C++ standard well enough. If
+the required modification to support the compiler requires using non standard or
+lesser C/C++ code or headers, I won't support it.
+
+
+13. examples
+------------
+
+This decoder and encoder example show the most basic usage of LodePNG (using the
+classes, not the simple functions, which would be trivial)
+
+More complex examples can be found in:
+-lodepng_examples.c: 9 different examples in C, such as showing the image with SDL, ...
+-lodepng_examples.cpp: the exact same examples in C++ using the C++ wrapper of LodePNG
+
+
+13.1. decoder C++ example
+-------------------------
+
+////////////////////////////////////////////////////////////////////////////////
+#include "lodepng.h"
+#include <iostream>
+
+int main(int argc, char *argv[])
+{
+ const char* filename = argc > 1 ? argv[1] : "test.png";
+
+ //load and decode
+ std::vector<unsigned char> buffer, image;
+ LodePNG::loadFile(buffer, filename); //load the image file with given filename
+ LodePNG::Decoder decoder;
+ decoder.decode(image, buffer.size() ? &buffer[0] : 0, (unsigned)buffer.size()); //decode the png
+
+ //if there's an error, display it
+ if(decoder.hasError()) std::cout << "error: " << decoder.getError() << std::endl;
+
+ //the pixels are now in the vector "image", use it as texture, draw it, ...
+}
+
+//alternative version using the "simple" function
+int main(int argc, char *argv[])
+{
+ const char* filename = argc > 1 ? argv[1] : "test.png";
+
+ //load and decode
+ std::vector<unsigned char> image;
+ unsigned w, h;
+ unsigned error = LodePNG::decode(image, w, h, filename);
+
+ //if there's an error, display it
+ if(error != 0) std::cout << "error: " << error << std::endl;
+
+ //the pixels are now in the vector "image", use it as texture, draw it, ...
+}
+////////////////////////////////////////////////////////////////////////////////
+
+
+13.2 encoder C++ example
+------------------------
+
+////////////////////////////////////////////////////////////////////////////////
+#include "lodepng.h"
+#include <iostream>
+
+int main(int argc, char *argv[])
+{
+ //check if user gave a filename
+ if(argc <= 1)
+ {
+ std::cout << "please provide a filename to save to\n";
+ return 0;
+ }
+
+ //generate some image
+ std::vector<unsigned char> image;
+ image.resize(512 * 512 * 4);
+ for(unsigned y = 0; y < 512; y++)
+ for(unsigned x = 0; x < 512; x++)
+ {
+ image[4 * 512 * y + 4 * x + 0] = 255 * !(x & y);
+ image[4 * 512 * y + 4 * x + 1] = x ^ y;
+ image[4 * 512 * y + 4 * x + 2] = x | y;
+ image[4 * 512 * y + 4 * x + 3] = 255;
+ }
+
+ //encode and save
+ std::vector<unsigned char> buffer;
+ LodePNG::Encoder encoder;
+ encoder.encode(buffer, image, 512, 512);
+ LodePNG::saveFile(buffer, argv[1]);
+
+ //the same as the 4 lines of code above, but in 1 call:
+ //LodePNG::encode(argv[1], image, 512, 512);
+}
+////////////////////////////////////////////////////////////////////////////////
+
+
+13.3 Decoder C example
+----------------------
+
+This example loads the PNG in 1 function call
+
+#include "lodepng.h"
+
+int main(int argc, char *argv[])
+{
+ unsigned error;
+ unsigned char* image;
+ size_t w, h;
+
+ if(argc <= 1) return 0;
+
+ error = LodePNG_decode3(&image, &w, &h, filename);
+
+ free(image);
+}
+
+
+14. LodeZlib
+------------
+
+Also available in the interface is LodeZlib. Both C and C++ versions of these
+functions are available. The interface is similar to that of the "simple" PNG
+encoding and decoding functions.
+
+LodeZlib can be used to zlib compress and decompress a buffer. It cannot be
+used to create gzip files however. Also, it only supports the part of zlib
+that is required for PNG, it does not support compression and decompression
+with dictionaries.
+
+
+15. changes
+-----------
+
+The version number of LodePNG is the date of the change given in the format
+yyyymmdd.
+
+Some changes aren't backwards compatible. Those are indicated with a (!)
+symbol.
+
+*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could
+ read by ignoring the problem but windows apps couldn't.
+*) 06 jun 2008: added more error checks for out of memory cases.
+*) 26 apr 2008: added a few more checks here and there to ensure more safety.
+*) 06 mar 2008: crash with encoding of strings fixed
+*) 02 feb 2008: support for international text chunks added (iTXt)
+*) 23 jan 2008: small cleanups, and #defines to divide code in sections
+*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor.
+*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder.
+*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added
+ Also vareous fixes, such as in the deflate and the padding bits code.
+*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved
+ filtering code of encoder.
+*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A
+ C++ wrapper around this provides an interface almost identical to before.
+ Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code
+ are together in these files but it works both for C and C++ compilers.
+*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks
+*) 30 aug 2007: bug fixed which makes this Borland C++ compatible
+*) 09 aug 2007: some VS2005 warnings removed again
+*) 21 jul 2007: deflate code placed in new namespace separate from zlib code
+*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images
+*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing
+ invalid std::vector element [0] fixed, and level 3 and 4 warnings removed
+*) 02 jun 2007: made the encoder add a tag with version by default
+*) 27 may 2007: zlib and png code separated (but still in the same file),
+ simple encoder/decoder functions added for more simple usage cases
+*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69),
+ moved some examples from here to lodepng_examples.cpp
+*) 12 may 2007: palette decoding bug fixed
+*) 24 apr 2007: changed the license from BSD to the zlib license
+*) 11 mar 2007: very simple addition: ability to encode bKGD chunks.
+*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding
+ palettized PNG images. Plus little interface change with palette and texts.
+*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes.
+ Fixed a bug where the end code of a block had length 0 in the Huffman tree.
+*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented
+ and supported by the encoder, resulting in smaller PNGs at the output.
+*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone.
+*) 24 jan 2007: gave encoder an error interface. Added color conversion from any
+ greyscale type to 8-bit greyscale with or without alpha.
+*) 21 jan 2007: (!) Totally changed the interface. It allows more color types
+ to convert to and is more uniform. See the manual for how it works now.
+*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days:
+ encode/decode custom tEXt chunks, separate classes for zlib & deflate, and
+ at last made the decoder give errors for incorrect Adler32 or Crc.
+*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel.
+*) 29 dec 2006: Added support for encoding images without alpha channel, and
+ cleaned out code as well as making certain parts faster.
+*) 28 dec 2006: Added "Settings" to the encoder.
+*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now.
+ Removed some code duplication in the decoder. Fixed little bug in an example.
+*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter.
+ Fixed a bug of the decoder with 16-bit per color.
+*) 15 okt 2006: Changed documentation structure
+*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the
+ given image buffer, however for now it's not compressed.
+*) 08 sep 2006: (!) Changed to interface with a Decoder class
+*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different
+ way. Renamed decodePNG to decodePNGGeneric.
+*) 29 jul 2006: (!) Changed the interface: image info is now returned as a
+ struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy.
+*) 28 jul 2006: Cleaned the code and added new error checks.
+ Corrected terminology "deflate" into "inflate".
+*) 23 jun 2006: Added SDL example in the documentation in the header, this
+ example allows easy debugging by displaying the PNG and its transparency.
+*) 22 jun 2006: (!) Changed way to obtain error value. Added
+ loadFile function for convenience. Made decodePNG32 faster.
+*) 21 jun 2006: (!) Changed type of info vector to unsigned.
+ Changed position of palette in info vector. Fixed an important bug that
+ happened on PNGs with an uncompressed block.
+*) 16 jun 2006: Internally changed unsigned into unsigned where
+ needed, and performed some optimizations.
+*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them
+ in LodePNG namespace. Changed the order of the parameters. Rewrote the
+ documentation in the header. Renamed files to lodepng.cpp and lodepng.h
+*) 22 apr 2006: Optimized and improved some code
+*) 07 sep 2005: (!) Changed to std::vector interface
+*) 12 aug 2005: Initial release
+
+
+16. contact information
+-----------------------
+
+Feel free to contact me with suggestions, problems, comments, ... concerning
+LodePNG. If you encounter a PNG image that doesn't work properly with this
+decoder, feel free to send it and I'll use it to find and fix the problem.
+
+My email address is (puzzle the account and domain together with an @ symbol):
+Domain: gmail dot com.
+Account: lode dot vandevenne.
+
+
+Copyright (c) 2005-2008 Lode Vandevenne
+*/
diff --git a/src/logos.cpp b/src/logos.cpp
new file mode 100644
index 0000000..c9e32be
--- /dev/null
+++ b/src/logos.cpp
@@ -0,0 +1,1986 @@
+/******************************************************************************
+ *
+ * $Id: logos.cpp,v 1.12 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdio.h>
+
+#include "qtbc.h"
+#include <qfile.h>
+#include <qdir.h>
+
+// Stripped version of FreeSans.ttf part of FreeFonts package,
+// see http://www.nongnu.org/freefont for more info
+unsigned char FreeSans_ttf[] = {
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x00, 0x03, 0x00, 0x70,
+ 0x47, 0x44, 0x45, 0x46, 0x01, 0x0a, 0x00, 0xe3, 0x00, 0x00, 0x48, 0x28,
+ 0x00, 0x00, 0x00, 0x2a, 0x47, 0x50, 0x4f, 0x53, 0x9d, 0x1a, 0x99, 0x8a,
+ 0x00, 0x00, 0x49, 0x50, 0x00, 0x00, 0x10, 0x42, 0x47, 0x53, 0x55, 0x42,
+ 0xa8, 0x85, 0x92, 0x0c, 0x00, 0x00, 0x48, 0x54, 0x00, 0x00, 0x00, 0xfc,
+ 0x4f, 0x53, 0x2f, 0x32, 0x67, 0x3f, 0xcf, 0x10, 0x00, 0x00, 0x01, 0x78,
+ 0x00, 0x00, 0x00, 0x56, 0x63, 0x6d, 0x61, 0x70, 0xe6, 0xd7, 0x91, 0x3d,
+ 0x00, 0x00, 0x04, 0xec, 0x00, 0x00, 0x01, 0x8a, 0x63, 0x76, 0x74, 0x20,
+ 0x00, 0x21, 0x02, 0x79, 0x00, 0x00, 0x06, 0x78, 0x00, 0x00, 0x00, 0x04,
+ 0x67, 0x61, 0x73, 0x70, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x48, 0x20,
+ 0x00, 0x00, 0x00, 0x08, 0x67, 0x6c, 0x79, 0x66, 0xb3, 0x58, 0xaf, 0x41,
+ 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x37, 0xca, 0x68, 0x65, 0x61, 0x64,
+ 0xe7, 0x18, 0xbe, 0xac, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x36,
+ 0x68, 0x68, 0x65, 0x61, 0x10, 0xbb, 0x06, 0xf2, 0x00, 0x00, 0x01, 0x34,
+ 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, 0x55, 0x0d, 0x49, 0xe2,
+ 0x00, 0x00, 0x01, 0xd0, 0x00, 0x00, 0x03, 0x1a, 0x6c, 0x6f, 0x63, 0x61,
+ 0x1f, 0xdd, 0x2c, 0xb6, 0x00, 0x00, 0x06, 0x7c, 0x00, 0x00, 0x01, 0x94,
+ 0x6d, 0x61, 0x78, 0x70, 0x01, 0x16, 0x00, 0xb3, 0x00, 0x00, 0x01, 0x58,
+ 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x85, 0x1f, 0xf3, 0x73,
+ 0x00, 0x00, 0x3f, 0xdc, 0x00, 0x00, 0x06, 0x69, 0x70, 0x6f, 0x73, 0x74,
+ 0x46, 0xf5, 0x10, 0xd8, 0x00, 0x00, 0x46, 0x48, 0x00, 0x00, 0x01, 0xd6,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xc2, 0x8f, 0x00, 0x8a, 0xba, 0xad,
+ 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x0b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x44, 0xd8, 0x89, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x44, 0xd8, 0x89,
+ 0xff, 0xd3, 0xfe, 0x3d, 0x07, 0x9c, 0x07, 0xd1, 0x00, 0x00, 0x00, 0x08,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x07, 0xd1, 0xfe, 0x3d, 0x01, 0x78, 0x08, 0x1e, 0xff, 0xd3, 0xff, 0xd2,
+ 0x07, 0x9c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0xc9, 0x00, 0x66, 0x00, 0x05, 0x00, 0x49, 0x00, 0x04, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x03, 0x87, 0x01, 0x90, 0x00, 0x05,
+ 0x00, 0x00, 0x05, 0x33, 0x05, 0x99, 0x00, 0x00, 0x03, 0xd7, 0x05, 0x33,
+ 0x05, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x02, 0x12, 0x00, 0x00,
+ 0x02, 0x0b, 0x05, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00,
+ 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x50, 0x66, 0x45, 0x64, 0x00, 0x40, 0x00, 0x0d, 0x02, 0xdc,
+ 0x06, 0x66, 0xfe, 0x66, 0x00, 0x00, 0x07, 0xd1, 0x01, 0xc3, 0x80, 0x02,
+ 0x00, 0xbf, 0xdf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x89,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0xb2, 0x00, 0x00,
+ 0x02, 0x39, 0x00, 0x00, 0x02, 0x39, 0x00, 0xfe, 0x02, 0xd7, 0x00, 0x6a,
+ 0x04, 0x72, 0x00, 0x1d, 0x04, 0x72, 0x00, 0x44, 0x07, 0x1c, 0x00, 0x3b,
+ 0x05, 0x56, 0x00, 0x6a, 0x01, 0x87, 0x00, 0x62, 0x02, 0xa9, 0x00, 0x96,
+ 0x02, 0xa9, 0x00, 0x4e, 0x03, 0x1c, 0x00, 0x52, 0x04, 0xac, 0x00, 0x66,
+ 0x02, 0x39, 0x00, 0xb2, 0x02, 0xa9, 0x00, 0x5e, 0x02, 0x39, 0x00, 0xb2,
+ 0x02, 0x39, 0xff, 0xf0, 0x04, 0x72, 0x00, 0x58, 0x04, 0x72, 0x00, 0xd1,
+ 0x04, 0x72, 0x00, 0x46, 0x04, 0x72, 0x00, 0x42, 0x04, 0x72, 0x00, 0x39,
+ 0x04, 0x72, 0x00, 0x48, 0x04, 0x72, 0x00, 0x58, 0x04, 0x72, 0x00, 0x5e,
+ 0x04, 0x72, 0x00, 0x4c, 0x04, 0x72, 0x00, 0x4e, 0x02, 0x39, 0x00, 0xe1,
+ 0x02, 0x39, 0x00, 0xe1, 0x04, 0xac, 0x00, 0x5c, 0x04, 0xac, 0x00, 0x66,
+ 0x04, 0xac, 0x00, 0x66, 0x04, 0x72, 0x00, 0x9e, 0x08, 0x1e, 0x00, 0x46,
+ 0x05, 0x56, 0x00, 0x23, 0x05, 0x56, 0x00, 0xa2, 0x05, 0xc6, 0x00, 0x62,
+ 0x05, 0xc6, 0x00, 0xb6, 0x05, 0x56, 0x00, 0xb8, 0x04, 0xe3, 0x00, 0xb8,
+ 0x06, 0x39, 0x00, 0x5a, 0x05, 0xc6, 0x00, 0xaa, 0x02, 0x39, 0x00, 0xcd,
+ 0x04, 0x00, 0x00, 0x23, 0x05, 0x56, 0x00, 0xa2, 0x04, 0x72, 0x00, 0xa4,
+ 0x06, 0xa9, 0x00, 0x9a, 0x05, 0xc6, 0x00, 0x9c, 0x06, 0x39, 0x00, 0x4e,
+ 0x05, 0x56, 0x00, 0xba, 0x06, 0x39, 0x00, 0x4e, 0x05, 0xc6, 0x00, 0xbe,
+ 0x05, 0x56, 0x00, 0x62, 0x04, 0xe3, 0x00, 0x2b, 0x05, 0xc6, 0x00, 0xae,
+ 0x05, 0x56, 0x00, 0x3d, 0x07, 0x8d, 0x00, 0x2d, 0x05, 0x56, 0x00, 0x2d,
+ 0x05, 0x56, 0x00, 0x1b, 0x04, 0xe3, 0x00, 0x39, 0x02, 0x39, 0x00, 0x83,
+ 0x02, 0x39, 0xff, 0xf0, 0x02, 0x39, 0x00, 0x2f, 0x03, 0xc0, 0x00, 0x5a,
+ 0x04, 0x72, 0xff, 0xd3, 0x02, 0xa9, 0x00, 0x2d, 0x04, 0x72, 0x00, 0x56,
+ 0x04, 0x72, 0x00, 0x6f, 0x04, 0x00, 0x00, 0x3f, 0x04, 0x72, 0x00, 0x35,
+ 0x04, 0x72, 0x00, 0x52, 0x02, 0x39, 0x00, 0x25, 0x04, 0x72, 0x00, 0x3b,
+ 0x04, 0x72, 0x00, 0x8f, 0x01, 0xc6, 0x00, 0x87, 0x01, 0xc6, 0xff, 0xdb,
+ 0x04, 0x00, 0x00, 0x77, 0x01, 0xc6, 0x00, 0x8b, 0x06, 0xa9, 0x00, 0x8f,
+ 0x04, 0x72, 0x00, 0x8f, 0x04, 0x72, 0x00, 0x4a, 0x04, 0x72, 0x00, 0x6f,
+ 0x04, 0x72, 0x00, 0x35, 0x02, 0xa9, 0x00, 0x8d, 0x04, 0x00, 0x00, 0x46,
+ 0x02, 0x39, 0x00, 0x1d, 0x04, 0x72, 0x00, 0x85, 0x04, 0x00, 0x00, 0x14,
+ 0x05, 0xc6, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x29,
+ 0x04, 0x00, 0x00, 0x3f, 0x02, 0xac, 0x00, 0x58, 0x02, 0x14, 0x00, 0xcd,
+ 0x02, 0xac, 0x00, 0x3b, 0x04, 0xac, 0x00, 0x9a, 0x02, 0x39, 0x00, 0x00,
+ 0x02, 0x39, 0x00, 0xfa, 0x04, 0x72, 0x00, 0x6a, 0x04, 0x72, 0x00, 0x35,
+ 0x04, 0x72, 0x00, 0x89, 0x04, 0x72, 0x00, 0x17, 0x02, 0x14, 0x00, 0xcd,
+ 0x04, 0x72, 0x00, 0x58, 0x02, 0xa9, 0x00, 0x3d, 0x05, 0xe5, 0xff, 0xe5,
+ 0x02, 0xf5, 0x00, 0x4c, 0x04, 0x72, 0x00, 0xc9, 0x04, 0xac, 0x00, 0x52,
+ 0x02, 0xa9, 0x00, 0x5e, 0x05, 0xe5, 0xff, 0xe5, 0x02, 0xa9, 0x00, 0x39,
+ 0x04, 0xd9, 0x01, 0x35, 0x04, 0xac, 0x00, 0x66, 0x02, 0xce, 0x00, 0x27,
+ 0x02, 0xce, 0x00, 0x21, 0x02, 0xa9, 0x00, 0xbc, 0x04, 0x72, 0x00, 0x85,
+ 0x04, 0x4b, 0x00, 0x62, 0x02, 0x39, 0x00, 0xb2, 0x02, 0xa9, 0x00, 0x50,
+ 0x02, 0xce, 0x00, 0x7d, 0x02, 0xeb, 0x00, 0x52, 0x04, 0x72, 0x00, 0xc9,
+ 0x06, 0xf3, 0x00, 0x7d, 0x06, 0xf3, 0x00, 0x7d, 0x06, 0xf3, 0x00, 0x21,
+ 0x04, 0x72, 0x00, 0xc5, 0x05, 0x56, 0x00, 0x23, 0x05, 0x56, 0x00, 0x23,
+ 0x05, 0x56, 0x00, 0x23, 0x05, 0x56, 0x00, 0x23, 0x05, 0x56, 0x00, 0x23,
+ 0x05, 0x56, 0x00, 0x23, 0x08, 0x00, 0x00, 0x17, 0x05, 0xc6, 0x00, 0x62,
+ 0x05, 0x56, 0x00, 0xb8, 0x05, 0x56, 0x00, 0xb8, 0x05, 0x56, 0x00, 0xb8,
+ 0x05, 0x56, 0x00, 0xb8, 0x02, 0x39, 0x00, 0xcd, 0x02, 0x39, 0x00, 0xcd,
+ 0x02, 0x39, 0x00, 0xcd, 0x02, 0x39, 0x00, 0x1c, 0x05, 0xc6, 0x00, 0x29,
+ 0x05, 0xc6, 0x00, 0x9c, 0x06, 0x39, 0x00, 0x4e, 0x06, 0x39, 0x00, 0x4e,
+ 0x06, 0x39, 0x00, 0x4e, 0x06, 0x39, 0x00, 0x4e, 0x06, 0x39, 0x00, 0x4e,
+ 0x04, 0xac, 0x00, 0xc3, 0x06, 0x39, 0x00, 0x3d, 0x05, 0xc6, 0x00, 0xae,
+ 0x05, 0xc6, 0x00, 0xae, 0x05, 0xc6, 0x00, 0xae, 0x05, 0xc6, 0x00, 0xae,
+ 0x05, 0x56, 0x00, 0x1b, 0x05, 0x53, 0x00, 0xba, 0x04, 0xe3, 0x00, 0x89,
+ 0x04, 0x72, 0x00, 0x56, 0x04, 0x72, 0x00, 0x56, 0x04, 0x72, 0x00, 0x56,
+ 0x04, 0x72, 0x00, 0x56, 0x04, 0x72, 0x00, 0x56, 0x04, 0x72, 0x00, 0x56,
+ 0x07, 0x1c, 0x00, 0x46, 0x04, 0x00, 0x00, 0x3f, 0x04, 0x72, 0x00, 0x52,
+ 0x04, 0x72, 0x00, 0x52, 0x04, 0x72, 0x00, 0x52, 0x04, 0x72, 0x00, 0x52,
+ 0x02, 0x39, 0x00, 0x00, 0x02, 0x39, 0x00, 0x00, 0x02, 0x39, 0x00, 0x00,
+ 0x02, 0x39, 0x00, 0x06, 0x04, 0x72, 0x00, 0x4a, 0x04, 0x72, 0x00, 0x8f,
+ 0x04, 0x72, 0x00, 0x4a, 0x04, 0x72, 0x00, 0x4a, 0x04, 0x72, 0x00, 0x4a,
+ 0x04, 0x72, 0x00, 0x4a, 0x04, 0x72, 0x00, 0x4a, 0x04, 0xac, 0x00, 0x66,
+ 0x04, 0xe3, 0x00, 0x25, 0x04, 0x72, 0x00, 0x85, 0x04, 0x72, 0x00, 0x85,
+ 0x04, 0x72, 0x00, 0x85, 0x04, 0x72, 0x00, 0x85, 0x04, 0x00, 0x00, 0x29,
+ 0x04, 0x70, 0x00, 0x6f, 0x04, 0x00, 0x00, 0x29, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1c,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x68, 0x00, 0x00, 0x00, 0x16,
+ 0x00, 0x10, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0e,
+ 0x00, 0x7e, 0x00, 0xff, 0x01, 0x31, 0x02, 0xc6, 0x02, 0xcb, 0x02, 0xda,
+ 0x02, 0xdc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0e,
+ 0x00, 0x20, 0x00, 0xa0, 0x01, 0x31, 0x02, 0xc6, 0x02, 0xca, 0x02, 0xda,
+ 0x02, 0xdc, 0xff, 0xff, 0x00, 0x01, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xe4,
+ 0xff, 0xc3, 0xff, 0x92, 0xfd, 0xfe, 0xfd, 0xfb, 0xfd, 0xed, 0xfd, 0xec,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x93, 0xb3, 0x00, 0x00, 0x00,
+ 0x00, 0xa0, 0xc0, 0x02, 0x00, 0xa1, 0xc1, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x7f, 0x7c, 0x81, 0x76, 0x75, 0x69, 0x70, 0x9a,
+ 0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
+ 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
+ 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+ 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d,
+ 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
+ 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61,
+ 0x62, 0x00, 0x87, 0x88, 0x8a, 0x8c, 0x94, 0x99, 0x9f, 0xa4, 0xa3, 0xa5,
+ 0xa7, 0xa6, 0xa8, 0xaa, 0xac, 0xab, 0xad, 0xae, 0xb0, 0xaf, 0xb1, 0xb2,
+ 0xb4, 0xb6, 0xb5, 0xb7, 0xb9, 0xb8, 0xbd, 0xbc, 0xbe, 0xbf, 0x00, 0x73,
+ 0x65, 0x66, 0x6a, 0x00, 0x79, 0xa2, 0x71, 0x6c, 0x00, 0x77, 0x6b, 0x00,
+ 0x89, 0x9b, 0x00, 0x74, 0x00, 0x00, 0x68, 0x78, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x6d, 0x7d, 0x00, 0xa9, 0xbb, 0x82, 0x64, 0x6f, 0x00, 0x00, 0x00,
+ 0x00, 0x6e, 0x7e, 0x00, 0x63, 0x83, 0x86, 0x98, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xba, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x85, 0x8d, 0x84, 0x8e, 0x8b,
+ 0x90, 0x91, 0x92, 0x8f, 0x96, 0x97, 0x00, 0x95, 0x9d, 0x9e, 0x9c, 0x00,
+ 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x21, 0x02, 0x79, 0x00, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16,
+ 0x00, 0x16, 0x00, 0x16, 0x00, 0x2e, 0x00, 0x48, 0x00, 0x7f, 0x00, 0xe5,
+ 0x01, 0x5d, 0x01, 0xc9, 0x01, 0xd9, 0x01, 0xfd, 0x02, 0x20, 0x02, 0x3e,
+ 0x02, 0x56, 0x02, 0x6c, 0x02, 0x79, 0x02, 0x85, 0x02, 0x93, 0x02, 0xc3,
+ 0x02, 0xda, 0x03, 0x16, 0x03, 0x63, 0x03, 0x80, 0x03, 0xbe, 0x04, 0x0c,
+ 0x04, 0x2a, 0x04, 0x84, 0x04, 0xd4, 0x04, 0xe6, 0x05, 0x03, 0x05, 0x17,
+ 0x05, 0x2b, 0x05, 0x3f, 0x05, 0x7d, 0x06, 0x10, 0x06, 0x2c, 0x06, 0x6d,
+ 0x06, 0xaa, 0x06, 0xd3, 0x06, 0xec, 0x07, 0x02, 0x07, 0x50, 0x07, 0x68,
+ 0x07, 0x76, 0x07, 0x99, 0x07, 0xb5, 0x07, 0xc6, 0x07, 0xe2, 0x07, 0xfa,
+ 0x08, 0x47, 0x08, 0x72, 0x08, 0xc7, 0x09, 0x08, 0x09, 0x57, 0x09, 0x6a,
+ 0x09, 0x8f, 0x09, 0xa2, 0x09, 0xc1, 0x09, 0xe0, 0x09, 0xf7, 0x0a, 0x0e,
+ 0x0a, 0x20, 0x0a, 0x2f, 0x0a, 0x41, 0x0a, 0x54, 0x0a, 0x61, 0x0a, 0x70,
+ 0x0a, 0xd1, 0x0b, 0x0b, 0x0b, 0x3e, 0x0b, 0x79, 0x0b, 0xba, 0x0b, 0xdc,
+ 0x0c, 0x34, 0x0c, 0x5b, 0x0c, 0x6f, 0x0c, 0x91, 0x0c, 0xae, 0x0c, 0xbc,
+ 0x0c, 0xfb, 0x0d, 0x21, 0x0d, 0x55, 0x0d, 0x8c, 0x0d, 0xc6, 0x0d, 0xe3,
+ 0x0e, 0x2f, 0x0e, 0x55, 0x0e, 0x7b, 0x0e, 0x8e, 0x0e, 0xaa, 0x0e, 0xc9,
+ 0x0e, 0xec, 0x0f, 0x03, 0x0f, 0x43, 0x0f, 0x50, 0x0f, 0x8f, 0x0f, 0xc0,
+ 0x0f, 0xc8, 0x0f, 0xd2, 0x10, 0x13, 0x10, 0x73, 0x10, 0xbe, 0x10, 0xe8,
+ 0x10, 0xfb, 0x11, 0x77, 0x11, 0x89, 0x12, 0x03, 0x12, 0x5c, 0x12, 0x78,
+ 0x12, 0x88, 0x12, 0x95, 0x13, 0x17, 0x13, 0x24, 0x13, 0x55, 0x13, 0x74,
+ 0x13, 0xb1, 0x13, 0xf8, 0x14, 0x06, 0x14, 0x38, 0x14, 0x5a, 0x14, 0x68,
+ 0x14, 0x99, 0x14, 0xb1, 0x14, 0xea, 0x15, 0x07, 0x15, 0x3d, 0x15, 0x94,
+ 0x15, 0xf9, 0x16, 0x03, 0x16, 0x0f, 0x16, 0x1b, 0x16, 0x27, 0x16, 0x33,
+ 0x16, 0x3f, 0x16, 0x4b, 0x16, 0x72, 0x16, 0xdc, 0x16, 0xe8, 0x16, 0xf4,
+ 0x17, 0x00, 0x17, 0x0c, 0x17, 0x18, 0x17, 0x24, 0x17, 0x30, 0x17, 0x3c,
+ 0x17, 0x70, 0x17, 0x7c, 0x17, 0x88, 0x17, 0x94, 0x17, 0xa0, 0x17, 0xac,
+ 0x17, 0xb8, 0x17, 0xd9, 0x18, 0x2e, 0x18, 0x3a, 0x18, 0x46, 0x18, 0x52,
+ 0x18, 0x5e, 0x18, 0x6a, 0x18, 0x95, 0x18, 0xdf, 0x18, 0xeb, 0x18, 0xf7,
+ 0x19, 0x03, 0x19, 0x0f, 0x19, 0x1b, 0x19, 0x27, 0x19, 0xa9, 0x1a, 0x05,
+ 0x1a, 0x11, 0x1a, 0x1d, 0x1a, 0x29, 0x1a, 0x35, 0x1a, 0x40, 0x1a, 0x4b,
+ 0x1a, 0x56, 0x1a, 0x61, 0x1a, 0xb5, 0x1a, 0xc1, 0x1a, 0xcd, 0x1a, 0xd9,
+ 0x1a, 0xe5, 0x1a, 0xf1, 0x1a, 0xfd, 0x1b, 0x17, 0x1b, 0x60, 0x1b, 0x6c,
+ 0x1b, 0x78, 0x1b, 0x84, 0x1b, 0x90, 0x1b, 0x9c, 0x1b, 0xd7, 0x1b, 0xe3,
+ 0x1b, 0xe3, 0x1b, 0xe3, 0x1b, 0xe3, 0x1b, 0xe3, 0x1b, 0xe3, 0x1b, 0xe3,
+ 0x00, 0x02, 0x00, 0x89, 0x00, 0x00, 0x03, 0xbe, 0x07, 0xd1, 0x00, 0x03,
+ 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x05, 0x21, 0x11, 0x21,
+ 0x03, 0xbe, 0xfc, 0xcb, 0x02, 0xac, 0xfd, 0xdd, 0x02, 0x23, 0x07, 0xd1,
+ 0xf8, 0x2f, 0x07, 0xd1, 0x89, 0xf9, 0x41, 0x00, 0x00, 0x02, 0x00, 0xfe,
+ 0x00, 0x00, 0x01, 0xaa, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00,
+ 0x01, 0x11, 0x03, 0x23, 0x03, 0x11, 0x13, 0x15, 0x23, 0x35, 0x01, 0xaa,
+ 0x2d, 0x50, 0x2d, 0xaa, 0xac, 0x05, 0xd5, 0xfd, 0x4c, 0xfe, 0x37, 0x01,
+ 0xc9, 0x02, 0xb4, 0xfb, 0x00, 0xd5, 0xd5, 0x00, 0x00, 0x02, 0x00, 0x6a,
+ 0x03, 0xb6, 0x02, 0x71, 0x05, 0xac, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00,
+ 0x13, 0x33, 0x15, 0x03, 0x23, 0x03, 0x25, 0x33, 0x15, 0x03, 0x23, 0x03,
+ 0x6a, 0xbf, 0x37, 0x50, 0x38, 0x01, 0x48, 0xbf, 0x38, 0x50, 0x37, 0x05,
+ 0xac, 0xe3, 0xfe, 0xed, 0x01, 0x13, 0xe3, 0xe3, 0xfe, 0xed, 0x01, 0x13,
+ 0x00, 0x02, 0x00, 0x1d, 0xff, 0xd7, 0x04, 0x56, 0x05, 0x93, 0x00, 0x1b,
+ 0x00, 0x1f, 0x00, 0x00, 0x01, 0x03, 0x33, 0x15, 0x23, 0x03, 0x33, 0x15,
+ 0x23, 0x03, 0x23, 0x13, 0x23, 0x03, 0x23, 0x13, 0x23, 0x35, 0x33, 0x13,
+ 0x23, 0x35, 0x33, 0x13, 0x33, 0x03, 0x21, 0x13, 0x03, 0x23, 0x03, 0x21,
+ 0x03, 0xe1, 0x49, 0xbe, 0xd9, 0x40, 0xd7, 0xef, 0x50, 0x9c, 0x4e, 0xfe,
+ 0x50, 0x9b, 0x4e, 0xcf, 0xe9, 0x40, 0xde, 0xf8, 0x4a, 0x9c, 0x4a, 0x01,
+ 0x00, 0x48, 0x63, 0xfe, 0x41, 0x01, 0x00, 0x05, 0x93, 0xfe, 0x6f, 0x8b,
+ 0xfe, 0x9b, 0x8b, 0xfe, 0x50, 0x01, 0xb0, 0xfe, 0x50, 0x01, 0xb0, 0x8b,
+ 0x01, 0x65, 0x8b, 0x01, 0x91, 0xfe, 0x6f, 0x01, 0x91, 0xfd, 0xe4, 0xfe,
+ 0x9b, 0x00, 0x00, 0x03, 0x00, 0x44, 0xfe, 0xfe, 0x04, 0x25, 0x06, 0x29,
+ 0x00, 0x2f, 0x00, 0x38, 0x00, 0x41, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06,
+ 0x07, 0x15, 0x23, 0x35, 0x24, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x16, 0x17,
+ 0x16, 0x17, 0x16, 0x17, 0x11, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34,
+ 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x15, 0x23, 0x26,
+ 0x27, 0x26, 0x27, 0x11, 0x17, 0x16, 0x17, 0x16, 0x01, 0x11, 0x06, 0x07,
+ 0x06, 0x15, 0x14, 0x17, 0x16, 0x13, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27,
+ 0x26, 0x27, 0x04, 0x25, 0xb0, 0x6a, 0xa1, 0x78, 0xfe, 0xec, 0x66, 0x34,
+ 0xa1, 0x0b, 0x12, 0x2e, 0x9b, 0x13, 0x14, 0xab, 0x3e, 0x0c, 0x0d, 0x92,
+ 0xcc, 0x54, 0x74, 0x78, 0xdb, 0x69, 0x4a, 0xa2, 0x02, 0x59, 0x3c, 0x55,
+ 0x8a, 0xde, 0x3c, 0x17, 0xfd, 0xcd, 0xa9, 0x33, 0x12, 0xbe, 0x16, 0x92,
+ 0xbd, 0x3e, 0x18, 0x41, 0x3c, 0x96, 0x01, 0x8f, 0xf9, 0x74, 0x46, 0x0b,
+ 0xd3, 0xd3, 0x12, 0xbd, 0x61, 0x86, 0x23, 0x77, 0x31, 0x7d, 0x20, 0x04,
+ 0x03, 0x02, 0x2d, 0x33, 0x27, 0x08, 0x09, 0x68, 0xc3, 0xf8, 0x68, 0x2b,
+ 0x0e, 0x6f, 0x6f, 0x10, 0x8f, 0x64, 0x90, 0x85, 0x49, 0x32, 0x04, 0xfe,
+ 0x02, 0x27, 0x49, 0xa1, 0x3f, 0x01, 0x60, 0x01, 0xec, 0x17, 0x7a, 0x2d,
+ 0x36, 0xa6, 0x43, 0x08, 0xfd, 0x1a, 0x17, 0x89, 0x36, 0x43, 0x69, 0x39,
+ 0x33, 0x2d, 0x00, 0x05, 0x00, 0x3b, 0xff, 0xd7, 0x06, 0xdf, 0x05, 0xac,
+ 0x00, 0x15, 0x00, 0x25, 0x00, 0x29, 0x00, 0x3f, 0x00, 0x4f, 0x00, 0x00,
+ 0x01, 0x32, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22,
+ 0x27, 0x26, 0x27, 0x34, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x17, 0x22,
+ 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34,
+ 0x27, 0x26, 0x25, 0x33, 0x01, 0x23, 0x01, 0x32, 0x17, 0x16, 0x17, 0x14,
+ 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x34, 0x35, 0x34,
+ 0x37, 0x36, 0x37, 0x36, 0x17, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16,
+ 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0x98, 0x91, 0x65,
+ 0x65, 0x03, 0x60, 0x60, 0x87, 0x0b, 0x0a, 0x8d, 0x66, 0x65, 0x07, 0x62,
+ 0x60, 0x88, 0x0a, 0x09, 0x5e, 0x3e, 0x33, 0x48, 0x3b, 0x4e, 0x5c, 0x3f,
+ 0x33, 0x48, 0x3a, 0x02, 0xf9, 0x87, 0xfc, 0xd7, 0x87, 0x03, 0xcb, 0x93,
+ 0x65, 0x64, 0x02, 0x61, 0x5f, 0x85, 0x0b, 0x0c, 0x8c, 0x65, 0x65, 0x08,
+ 0x61, 0x60, 0x88, 0x0a, 0x09, 0x5e, 0x3e, 0x33, 0x48, 0x3b, 0x4e, 0x5d,
+ 0x3f, 0x33, 0x4a, 0x39, 0x05, 0x7b, 0x65, 0x6b, 0x92, 0x89, 0x65, 0x64,
+ 0x08, 0x01, 0x62, 0x61, 0x8a, 0x09, 0x09, 0x8b, 0x66, 0x65, 0x07, 0x01,
+ 0x8f, 0x47, 0x3b, 0x4d, 0x5d, 0x3f, 0x33, 0x46, 0x3a, 0x4d, 0x61, 0x3e,
+ 0x32, 0xc0, 0xfa, 0x2b, 0x02, 0xbc, 0x65, 0x69, 0x92, 0x88, 0x65, 0x63,
+ 0x09, 0x01, 0x62, 0x60, 0x89, 0x0a, 0x09, 0x8b, 0x65, 0x64, 0x07, 0x01,
+ 0x8f, 0x47, 0x3a, 0x4c, 0x5e, 0x3e, 0x33, 0x47, 0x39, 0x4b, 0x62, 0x3e,
+ 0x31, 0x00, 0x00, 0x03, 0x00, 0x6a, 0xff, 0xd1, 0x05, 0x19, 0x05, 0xac,
+ 0x00, 0x29, 0x00, 0x39, 0x00, 0x46, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06,
+ 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26,
+ 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06,
+ 0x07, 0x01, 0x36, 0x37, 0x34, 0x3d, 0x01, 0x33, 0x14, 0x07, 0x06, 0x07,
+ 0x13, 0x23, 0x01, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22,
+ 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x09, 0x01, 0x06, 0x07, 0x06, 0x15,
+ 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x03, 0xba, 0x4a, 0x27, 0x8e,
+ 0xad, 0xc8, 0x74, 0x68, 0x49, 0x46, 0xbd, 0x7c, 0x1c, 0x0e, 0x65, 0x66,
+ 0x94, 0x9c, 0x5e, 0x53, 0x4b, 0x3f, 0x90, 0x01, 0x10, 0x3a, 0x06, 0xa4,
+ 0x6d, 0x05, 0x05, 0xfa, 0xe0, 0xfe, 0x0f, 0x8f, 0x29, 0x1b, 0x46, 0x2f,
+ 0x3e, 0x67, 0x2f, 0x1a, 0x1f, 0x1b, 0x01, 0x66, 0xfe, 0xb8, 0xa9, 0x31,
+ 0x1f, 0x53, 0x4e, 0x6b, 0x75, 0x6e, 0x27, 0xa0, 0x49, 0x1d, 0x69, 0x7b,
+ 0x6e, 0xae, 0x8e, 0x5d, 0x5c, 0x6e, 0x9c, 0x56, 0x2b, 0x30, 0x86, 0x5d,
+ 0x5f, 0x65, 0x59, 0x84, 0x79, 0x53, 0x46, 0x52, 0xfe, 0xb2, 0x68, 0x73,
+ 0x09, 0x08, 0x08, 0xb4, 0xb3, 0x08, 0x08, 0xfe, 0xcb, 0x03, 0x73, 0x5a,
+ 0x40, 0x2b, 0x37, 0x5a, 0x32, 0x22, 0x4c, 0x2b, 0x39, 0x3a, 0x32, 0x2c,
+ 0xfd, 0x44, 0x01, 0x99, 0x6c, 0x57, 0x36, 0x42, 0x70, 0x4d, 0x49, 0x5b,
+ 0x1f, 0x00, 0x00, 0x01, 0x00, 0x62, 0x03, 0xb6, 0x01, 0x23, 0x05, 0xac,
+ 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x15, 0x03, 0x23, 0x03, 0x62, 0xc1,
+ 0x37, 0x52, 0x38, 0x05, 0xac, 0xe3, 0xfe, 0xed, 0x01, 0x13, 0x00, 0x01,
+ 0x00, 0x96, 0xfe, 0x4e, 0x02, 0x54, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00,
+ 0x01, 0x33, 0x02, 0x03, 0x06, 0x15, 0x10, 0x13, 0x16, 0x17, 0x23, 0x26,
+ 0x03, 0x26, 0x35, 0x10, 0x13, 0x36, 0x01, 0xe3, 0x71, 0xd3, 0x36, 0x10,
+ 0xb3, 0x2e, 0x38, 0x71, 0xbe, 0x58, 0x37, 0x89, 0x51, 0x05, 0xd5, 0xfe,
+ 0xab, 0xfe, 0x77, 0x74, 0x71, 0xfe, 0x76, 0xfe, 0x82, 0x61, 0x5b, 0xfa,
+ 0x01, 0x47, 0xc9, 0xba, 0x01, 0x31, 0x01, 0x3f, 0xbd, 0x00, 0x00, 0x01,
+ 0x00, 0x4e, 0xfe, 0x4e, 0x02, 0x0c, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00,
+ 0x13, 0x23, 0x12, 0x13, 0x36, 0x35, 0x10, 0x03, 0x26, 0x27, 0x33, 0x16,
+ 0x13, 0x16, 0x15, 0x10, 0x03, 0x06, 0xbe, 0x70, 0xd2, 0x36, 0x10, 0xb4,
+ 0x2d, 0x37, 0x70, 0xbf, 0x59, 0x36, 0x89, 0x52, 0xfe, 0x4e, 0x01, 0x53,
+ 0x01, 0x8a, 0x74, 0x71, 0x01, 0x8e, 0x01, 0x7e, 0x60, 0x59, 0xfa, 0xfe,
+ 0xb9, 0xca, 0xba, 0xfe, 0xd1, 0xfe, 0xc2, 0xbe, 0x00, 0x01, 0x00, 0x52,
+ 0x03, 0x87, 0x02, 0xbe, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x33,
+ 0x07, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37,
+ 0x17, 0x01, 0x48, 0x81, 0x0b, 0xda, 0x26, 0xdd, 0x90, 0x69, 0x7f, 0x81,
+ 0x66, 0x8d, 0xdd, 0x27, 0xd9, 0x05, 0xd5, 0xe5, 0x4d, 0x78, 0x3e, 0xb6,
+ 0x4a, 0xbf, 0xbf, 0x4a, 0xb6, 0x3e, 0x78, 0x4d, 0x00, 0x01, 0x00, 0x66,
+ 0xff, 0xec, 0x04, 0x46, 0x03, 0xcb, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x15,
+ 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x04, 0x46,
+ 0xfe, 0x58, 0x90, 0xfe, 0x58, 0x01, 0xa8, 0x90, 0x02, 0x23, 0x90, 0xfe,
+ 0x59, 0x01, 0xa7, 0x90, 0x01, 0xa8, 0xfe, 0x58, 0x00, 0x01, 0x00, 0xb2,
+ 0xfe, 0xd3, 0x01, 0x89, 0x00, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x37, 0x33,
+ 0x15, 0x10, 0x23, 0x35, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x23, 0xb2, 0xd7,
+ 0xd7, 0x4c, 0x19, 0x16, 0x7b, 0xd5, 0xf6, 0xfe, 0xf4, 0x4e, 0x03, 0x2c,
+ 0x27, 0x64, 0x25, 0x00, 0x00, 0x01, 0x00, 0x5e, 0x01, 0xec, 0x02, 0x46,
+ 0x02, 0x7f, 0x00, 0x03, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x02, 0x46,
+ 0xfe, 0x18, 0x02, 0x7f, 0x93, 0x93, 0x00, 0x01, 0x00, 0xb2, 0x00, 0x00,
+ 0x01, 0x87, 0x00, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x25, 0x15, 0x23, 0x35,
+ 0x01, 0x87, 0xd5, 0xd5, 0xd5, 0xd5, 0x00, 0x01, 0xff, 0xf0, 0xff, 0xd7,
+ 0x02, 0x46, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23,
+ 0x01, 0xd5, 0x71, 0xfe, 0x1a, 0x70, 0x05, 0xd5, 0xfa, 0x02, 0x00, 0x02,
+ 0x00, 0x58, 0xff, 0xd1, 0x04, 0x0e, 0x05, 0xac, 0x00, 0x0f, 0x00, 0x19,
+ 0x00, 0x00, 0x13, 0x10, 0x25, 0x36, 0x33, 0x20, 0x13, 0x16, 0x15, 0x10,
+ 0x07, 0x06, 0x23, 0x20, 0x03, 0x26, 0x01, 0x20, 0x11, 0x10, 0x21, 0x32,
+ 0x13, 0x36, 0x35, 0x10, 0x58, 0x01, 0x24, 0x52, 0x65, 0x01, 0x7d, 0x4c,
+ 0x12, 0xd1, 0x6c, 0x9e, 0xfe, 0xcf, 0x6f, 0x3b, 0x01, 0xdb, 0xfe, 0xdd,
+ 0x01, 0x1f, 0xc7, 0x3f, 0x21, 0x02, 0xbe, 0x02, 0x43, 0x86, 0x25, 0xfe,
+ 0x10, 0x77, 0x93, 0xfe, 0x27, 0xae, 0x5a, 0x01, 0x44, 0xab, 0x03, 0x4c,
+ 0xfd, 0xb0, 0xfd, 0xaa, 0x01, 0x06, 0x86, 0xd1, 0x02, 0x49, 0x00, 0x01,
+ 0x00, 0xd1, 0x00, 0x00, 0x02, 0xc7, 0x05, 0xac, 0x00, 0x0a, 0x00, 0x00,
+ 0x01, 0x21, 0x35, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x33, 0x11, 0x23, 0x02,
+ 0x12, 0xfe, 0xbf, 0xb3, 0x7f, 0x24, 0x12, 0x17, 0x77, 0xb5, 0x04, 0x0a,
+ 0x81, 0x16, 0x43, 0x50, 0x29, 0x4f, 0xfa, 0x54, 0x00, 0x01, 0x00, 0x46,
+ 0x00, 0x00, 0x04, 0x17, 0x05, 0xac, 0x00, 0x23, 0x00, 0x00, 0x13, 0x12,
+ 0x21, 0x32, 0x17, 0x16, 0x15, 0x10, 0x05, 0x06, 0x0f, 0x01, 0x06, 0x07,
+ 0x06, 0x07, 0x21, 0x15, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3f, 0x01,
+ 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x20, 0x03, 0x06, 0x07, 0x66, 0x0f,
+ 0x01, 0xd1, 0xd0, 0x82, 0x7f, 0xfe, 0xec, 0x0f, 0x11, 0xcc, 0xa8, 0x37,
+ 0x1d, 0x0b, 0x02, 0xfc, 0xfc, 0x3a, 0x0b, 0x48, 0x45, 0xa7, 0x28, 0x30,
+ 0xbd, 0xc4, 0x5b, 0x51, 0x73, 0xfe, 0xfe, 0x1f, 0x02, 0x01, 0x03, 0xb4,
+ 0x01, 0xf8, 0x79, 0x76, 0xbb, 0xff, 0x00, 0xa4, 0x09, 0x09, 0x6f, 0x5a,
+ 0x5e, 0x31, 0x42, 0xb2, 0xe0, 0x7d, 0x78, 0x6b, 0x1a, 0x1b, 0x6a, 0x70,
+ 0xaf, 0x7c, 0x4f, 0x45, 0xfe, 0xcd, 0x12, 0x15, 0x00, 0x01, 0x00, 0x42,
+ 0xff, 0xd1, 0x04, 0x0c, 0x05, 0xac, 0x00, 0x32, 0x00, 0x00, 0x01, 0x22,
+ 0x07, 0x06, 0x07, 0x23, 0x12, 0x25, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15,
+ 0x14, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x20, 0x03,
+ 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34,
+ 0x27, 0x26, 0x23, 0x07, 0x23, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27,
+ 0x26, 0x02, 0x29, 0xd2, 0x32, 0x0f, 0x02, 0xb4, 0x07, 0x01, 0x1a, 0x4a,
+ 0x5c, 0xf3, 0x75, 0x52, 0xca, 0xa3, 0x34, 0x1e, 0x8e, 0x85, 0xd8, 0xfe,
+ 0xa3, 0x5f, 0x1c, 0x07, 0xb4, 0x0d, 0xa0, 0x38, 0x4c, 0xb3, 0x4d, 0x2d,
+ 0xff, 0x16, 0x18, 0x4c, 0x16, 0xc4, 0x4b, 0x55, 0x6b, 0x3e, 0x05, 0x0e,
+ 0xb3, 0x36, 0x4e, 0x01, 0x70, 0x50, 0x15, 0x8f, 0x65, 0x9b, 0xde, 0x4f,
+ 0x38, 0x77, 0x45, 0x66, 0xd6, 0x7c, 0x73, 0x01, 0x18, 0x52, 0x6b, 0xea,
+ 0x38, 0x13, 0x77, 0x46, 0x65, 0xf3, 0x14, 0x02, 0x02, 0x99, 0x03, 0x2b,
+ 0x32, 0x84, 0x93, 0x40, 0x24, 0x00, 0x00, 0x02, 0x00, 0x39, 0x00, 0x00,
+ 0x04, 0x29, 0x05, 0xac, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21,
+ 0x35, 0x01, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x19, 0x01, 0x01,
+ 0x02, 0x9e, 0xfd, 0x9b, 0x02, 0x94, 0x85, 0xd7, 0xd7, 0xb4, 0xfe, 0x39,
+ 0x01, 0x5c, 0xbf, 0x03, 0x91, 0xfc, 0x52, 0xa2, 0xfe, 0xa4, 0x01, 0xfe,
+ 0x02, 0x7b, 0xfd, 0x85, 0x00, 0x01, 0x00, 0x48, 0xff, 0xd1, 0x04, 0x1b,
+ 0x05, 0xac, 0x00, 0x26, 0x00, 0x00, 0x01, 0x15, 0x21, 0x03, 0x36, 0x37,
+ 0x32, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x20, 0x03,
+ 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34,
+ 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x13, 0x03, 0xcf, 0xfd,
+ 0xa4, 0x3a, 0x7c, 0x91, 0xcf, 0x82, 0x83, 0x01, 0x85, 0x82, 0xce, 0x0e,
+ 0x0f, 0xfe, 0x71, 0x4d, 0x02, 0x03, 0xb4, 0x3d, 0xd5, 0x0b, 0x0c, 0xb0,
+ 0x54, 0x39, 0x74, 0x51, 0x78, 0x71, 0x4d, 0x24, 0x28, 0xa6, 0x6c, 0x05,
+ 0xac, 0xb2, 0xfe, 0x6a, 0x56, 0x02, 0x84, 0x86, 0xd9, 0xe0, 0x91, 0x8c,
+ 0x0a, 0x01, 0x01, 0x7b, 0x06, 0x12, 0xe7, 0x0b, 0x01, 0x7c, 0x55, 0x7f,
+ 0xbe, 0x5d, 0x41, 0x3b, 0x1d, 0x2f, 0x03, 0x16, 0x00, 0x02, 0x00, 0x58,
+ 0xff, 0xd1, 0x04, 0x1b, 0x05, 0xac, 0x00, 0x22, 0x00, 0x32, 0x00, 0x00,
+ 0x13, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27,
+ 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17,
+ 0x14, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x20, 0x03, 0x26, 0x25,
+ 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35,
+ 0x34, 0x27, 0x26, 0x58, 0x01, 0x17, 0x69, 0x88, 0xc8, 0x72, 0x4d, 0x15,
+ 0xb4, 0x20, 0x76, 0x2b, 0x33, 0xc2, 0x51, 0x30, 0x01, 0x76, 0xd8, 0xbf,
+ 0x7c, 0x7e, 0x04, 0x7d, 0x7b, 0xc1, 0x11, 0x12, 0xfe, 0x42, 0x26, 0x03,
+ 0x01, 0xf0, 0x93, 0x55, 0x45, 0x5d, 0x53, 0x77, 0x81, 0x53, 0x4c, 0x6f,
+ 0x46, 0x02, 0x96, 0x02, 0x33, 0xa5, 0x3e, 0x8d, 0x5f, 0x8f, 0x9b, 0x2f,
+ 0x11, 0xdb, 0x84, 0xc8, 0xa2, 0x7c, 0x7e, 0xc7, 0x06, 0x06, 0xcd, 0x89,
+ 0x86, 0x0c, 0x01, 0x02, 0x56, 0x35, 0x8b, 0x65, 0x52, 0x7a, 0x93, 0x5e,
+ 0x54, 0x60, 0x59, 0x82, 0xb4, 0x53, 0x34, 0x00, 0x00, 0x01, 0x00, 0x5e,
+ 0x00, 0x00, 0x04, 0x29, 0x05, 0xac, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x15,
+ 0x00, 0x03, 0x06, 0x07, 0x23, 0x12, 0x13, 0x12, 0x13, 0x21, 0x35, 0x04,
+ 0x29, 0xfe, 0xa5, 0x94, 0x3c, 0x23, 0xc0, 0x56, 0x8b, 0x7e, 0xf5, 0xfc,
+ 0xef, 0x05, 0xac, 0x98, 0xfe, 0x33, 0xfe, 0x3c, 0xba, 0xc9, 0x01, 0x7a,
+ 0x01, 0x20, 0x01, 0x03, 0x01, 0x5d, 0xb2, 0x00, 0x00, 0x03, 0x00, 0x4c,
+ 0xff, 0xd1, 0x04, 0x1b, 0x05, 0xac, 0x00, 0x1c, 0x00, 0x2c, 0x00, 0x3c,
+ 0x00, 0x00, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x22, 0x23, 0x22,
+ 0x27, 0x26, 0x27, 0x34, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33,
+ 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x22, 0x07, 0x06, 0x15,
+ 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03,
+ 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35,
+ 0x34, 0x27, 0x26, 0x03, 0x21, 0xfa, 0x83, 0x85, 0xd5, 0x05, 0x06, 0xd7,
+ 0x88, 0x85, 0x03, 0xf8, 0x7e, 0x29, 0x1e, 0xf4, 0xc0, 0xc8, 0x7a, 0x72,
+ 0x3e, 0x2c, 0xfe, 0xb6, 0x8b, 0x44, 0x2d, 0x5e, 0x41, 0x5d, 0x8b, 0x45,
+ 0x2c, 0x63, 0x3f, 0x5a, 0x99, 0x54, 0x42, 0x63, 0x51, 0x77, 0x9f, 0x55,
+ 0x3f, 0x66, 0x51, 0x02, 0xfc, 0x77, 0xf4, 0xc2, 0x7c, 0x7e, 0x04, 0x7d,
+ 0x83, 0xc2, 0xf1, 0x78, 0x4f, 0x4d, 0x3a, 0x57, 0xaa, 0xd9, 0x73, 0x6b,
+ 0xa5, 0x78, 0x49, 0x34, 0x01, 0xd8, 0x59, 0x3a, 0x52, 0x7a, 0x3e, 0x2b,
+ 0x58, 0x39, 0x50, 0x82, 0x3e, 0x27, 0xfd, 0xa0, 0x62, 0x4c, 0x6f, 0x8c,
+ 0x51, 0x41, 0x65, 0x4b, 0x6e, 0x8e, 0x50, 0x3f, 0x00, 0x02, 0x00, 0x4e,
+ 0xff, 0xd1, 0x04, 0x12, 0x05, 0xac, 0x00, 0x22, 0x00, 0x32, 0x00, 0x00,
+ 0x01, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x33, 0x16, 0x17,
+ 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27,
+ 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x20, 0x13, 0x16, 0x01,
+ 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35,
+ 0x34, 0x27, 0x26, 0x04, 0x12, 0xfe, 0xea, 0x6a, 0x8a, 0xc7, 0x72, 0x4d,
+ 0x15, 0xb4, 0x1e, 0x72, 0x2d, 0x36, 0xc2, 0x51, 0x30, 0x01, 0x6e, 0x8e,
+ 0x25, 0x2b, 0xc2, 0x7d, 0x7d, 0x02, 0x7d, 0x7a, 0xc1, 0x11, 0x12, 0x01,
+ 0x9e, 0x40, 0x0b, 0xfe, 0x15, 0x83, 0x53, 0x4b, 0x6e, 0x47, 0x66, 0x8f,
+ 0x55, 0x49, 0x5d, 0x53, 0x02, 0xe7, 0xfd, 0xd0, 0xa6, 0x40, 0x8c, 0x5f,
+ 0x90, 0x97, 0x31, 0x13, 0xdb, 0x84, 0xc8, 0x84, 0x18, 0x06, 0x7e, 0x86,
+ 0xc9, 0xcd, 0x89, 0x86, 0x0c, 0x01, 0xfe, 0x01, 0x5b, 0x01, 0xbc, 0x62,
+ 0x58, 0x83, 0xb3, 0x53, 0x35, 0x62, 0x53, 0x7c, 0x95, 0x5e, 0x54, 0x00,
+ 0x00, 0x02, 0x00, 0xe1, 0x00, 0x00, 0x01, 0xb6, 0x04, 0x31, 0x00, 0x03,
+ 0x00, 0x07, 0x00, 0x00, 0x25, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x35,
+ 0x01, 0xb6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0x03, 0x5c, 0xd5, 0xd5,
+ 0x00, 0x02, 0x00, 0xe1, 0xfe, 0xd3, 0x01, 0xb8, 0x04, 0x31, 0x00, 0x03,
+ 0x00, 0x0f, 0x00, 0x00, 0x01, 0x15, 0x23, 0x35, 0x03, 0x33, 0x15, 0x10,
+ 0x23, 0x35, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x23, 0x01, 0xb8, 0xd5, 0x02,
+ 0xd7, 0xd7, 0x4d, 0x18, 0x16, 0x7b, 0x04, 0x31, 0xd5, 0xd5, 0xfc, 0xa4,
+ 0xf6, 0xfe, 0xf4, 0x4e, 0x03, 0x2c, 0x27, 0x64, 0x25, 0x00, 0x00, 0x01,
+ 0x00, 0x5c, 0xff, 0xee, 0x04, 0x46, 0x03, 0xcb, 0x00, 0x06, 0x00, 0x00,
+ 0x13, 0x35, 0x01, 0x15, 0x09, 0x01, 0x15, 0x5c, 0x03, 0xea, 0xfc, 0xd9,
+ 0x03, 0x27, 0x01, 0x96, 0x8d, 0x01, 0xa8, 0xa2, 0xfe, 0xb6, 0xfe, 0xb0,
+ 0xa1, 0x00, 0x00, 0x02, 0x00, 0x66, 0x00, 0xe3, 0x04, 0x46, 0x02, 0xd3,
+ 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x01, 0x15,
+ 0x21, 0x35, 0x04, 0x46, 0xfc, 0x20, 0x03, 0xe0, 0xfc, 0x20, 0x02, 0xd3,
+ 0x8f, 0x8f, 0xfe, 0xa0, 0x90, 0x90, 0x00, 0x01, 0x00, 0x66, 0xff, 0xee,
+ 0x04, 0x50, 0x03, 0xcb, 0x00, 0x06, 0x00, 0x00, 0x01, 0x15, 0x01, 0x35,
+ 0x09, 0x01, 0x35, 0x04, 0x50, 0xfc, 0x16, 0x03, 0x27, 0xfc, 0xd9, 0x02,
+ 0x23, 0x8d, 0xfe, 0x58, 0xa1, 0x01, 0x4a, 0x01, 0x50, 0xa2, 0x00, 0x02,
+ 0x00, 0x9e, 0x00, 0x00, 0x04, 0x12, 0x05, 0xee, 0x00, 0x23, 0x00, 0x27,
+ 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x1d, 0x01,
+ 0x23, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27,
+ 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x23, 0x10, 0x25, 0x36, 0x33, 0x32,
+ 0x17, 0x16, 0x01, 0x15, 0x23, 0x35, 0x04, 0x12, 0x6e, 0x1a, 0x5b, 0x58,
+ 0x1c, 0x17, 0xb8, 0x66, 0x14, 0x5d, 0x61, 0x1f, 0x17, 0x5f, 0x44, 0x63,
+ 0xc4, 0x31, 0x13, 0xae, 0x01, 0x1f, 0x48, 0x59, 0xdc, 0x77, 0x61, 0xfe,
+ 0x92, 0xb8, 0x04, 0x64, 0x99, 0x7a, 0x1c, 0x51, 0x50, 0x3a, 0x2e, 0x34,
+ 0x60, 0x70, 0x78, 0x6f, 0x15, 0x58, 0x5a, 0x43, 0x33, 0x38, 0x7b, 0x41,
+ 0x2e, 0xa2, 0x3f, 0x5f, 0x01, 0x7c, 0x50, 0x14, 0x80, 0x68, 0xfb, 0xcf,
+ 0xd5, 0xd5, 0x00, 0x02, 0x00, 0x46, 0xfe, 0xdd, 0x07, 0x9c, 0x05, 0xee,
+ 0x00, 0x51, 0x00, 0x65, 0x00, 0x00, 0x01, 0x33, 0x03, 0x06, 0x15, 0x14,
+ 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26,
+ 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16,
+ 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x20, 0x27, 0x26, 0x27,
+ 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x20, 0x17,
+ 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27,
+ 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37,
+ 0x36, 0x33, 0x32, 0x17, 0x01, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34,
+ 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16,
+ 0x05, 0x52, 0xaa, 0xb8, 0x19, 0x2e, 0x1a, 0x1e, 0x6f, 0x62, 0x65, 0x1b,
+ 0x07, 0x92, 0x8c, 0xd9, 0x6a, 0x6f, 0xfd, 0xd4, 0xc1, 0x59, 0x3a, 0x9e,
+ 0x97, 0xf1, 0x69, 0x71, 0xa3, 0xe8, 0x39, 0xe6, 0xe9, 0xfe, 0xc9, 0xf6,
+ 0xd9, 0x60, 0x3d, 0x8d, 0x4c, 0x6a, 0xb6, 0xfc, 0x7e, 0x7a, 0x01, 0x1e,
+ 0xe9, 0xcd, 0x5b, 0x3a, 0x7b, 0x18, 0x1d, 0x9b, 0xe2, 0xc5, 0x1d, 0x75,
+ 0x7f, 0x17, 0x18, 0x8d, 0x5f, 0x61, 0x78, 0x6d, 0x9e, 0x45, 0x46, 0xac,
+ 0x4e, 0xfe, 0x7b, 0x79, 0x5f, 0x4e, 0x14, 0x05, 0x47, 0x33, 0x46, 0x72,
+ 0x5f, 0x61, 0x14, 0x04, 0x48, 0x39, 0x04, 0x02, 0xfd, 0xc3, 0x45, 0x22,
+ 0x2f, 0x1c, 0x0f, 0x6e, 0x72, 0x9f, 0x2c, 0x2c, 0xcf, 0xa9, 0xa1, 0x3e,
+ 0x1e, 0x9a, 0x8d, 0xd8, 0x8d, 0x95, 0xf3, 0xb9, 0xb0, 0x3d, 0x1b, 0x41,
+ 0x89, 0x56, 0xa1, 0x8e, 0xdf, 0x8c, 0x99, 0x01, 0x07, 0xee, 0x80, 0x60,
+ 0xa6, 0x42, 0x21, 0x99, 0x86, 0xce, 0x82, 0x8b, 0xcc, 0xb7, 0x25, 0x21,
+ 0xb6, 0x9d, 0x7f, 0x11, 0x03, 0x6a, 0x6c, 0xa1, 0xbc, 0x9f, 0x90, 0x35,
+ 0x17, 0xb2, 0xfd, 0x87, 0x99, 0x7e, 0x98, 0x23, 0x1e, 0x5b, 0x36, 0x27,
+ 0x6c, 0x6f, 0x9c, 0x20, 0x1f, 0x72, 0x48, 0x38, 0x00, 0x02, 0x00, 0x23,
+ 0x00, 0x00, 0x05, 0x39, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x00,
+ 0x01, 0x21, 0x03, 0x23, 0x01, 0x33, 0x01, 0x23, 0x0b, 0x02, 0x03, 0xcb,
+ 0xfd, 0xc0, 0x9d, 0xcb, 0x02, 0x14, 0xf6, 0x02, 0x0c, 0xd5, 0xce, 0xe6,
+ 0xf6, 0x01, 0xc1, 0xfe, 0x3f, 0x05, 0xd5, 0xfa, 0x2b, 0x02, 0x60, 0x02,
+ 0xa8, 0xfd, 0x58, 0x00, 0x00, 0x03, 0x00, 0xa2, 0x00, 0x00, 0x04, 0xfc,
+ 0x05, 0xd5, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x00, 0x01, 0x14,
+ 0x07, 0x06, 0x23, 0x21, 0x11, 0x21, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07,
+ 0x16, 0x17, 0x16, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32,
+ 0x37, 0x36, 0x03, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x21,
+ 0x11, 0x04, 0xfc, 0x82, 0x77, 0xbf, 0xfd, 0x5e, 0x02, 0x5e, 0x01, 0x17,
+ 0x6d, 0x36, 0xce, 0xbd, 0x37, 0x1c, 0xff, 0x00, 0xd0, 0x29, 0x32, 0xfe,
+ 0x8f, 0x01, 0x71, 0xf7, 0x2b, 0x09, 0xcb, 0xb8, 0x3d, 0x17, 0x67, 0x42,
+ 0x63, 0xfe, 0x2f, 0x01, 0xaa, 0xc7, 0x76, 0x6d, 0x05, 0xd5, 0xb4, 0x59,
+ 0x6e, 0xe4, 0x62, 0x48, 0x85, 0x43, 0x02, 0x3b, 0xc9, 0x1f, 0x06, 0xfe,
+ 0x25, 0x9f, 0x23, 0xfc, 0x94, 0x8c, 0x35, 0x3f, 0x92, 0x44, 0x2c, 0xfd,
+ 0xfe, 0x00, 0x00, 0x01, 0x00, 0x62, 0xff, 0xd1, 0x05, 0x6a, 0x05, 0xee,
+ 0x00, 0x23, 0x00, 0x00, 0x13, 0x34, 0x37, 0x12, 0x25, 0x36, 0x33, 0x20,
+ 0x13, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x11,
+ 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x02, 0x21, 0x20,
+ 0x03, 0x26, 0x03, 0x26, 0x62, 0x65, 0x92, 0x01, 0x3a, 0x3a, 0x3f, 0x01,
+ 0xa2, 0x7c, 0x15, 0x0d, 0xc3, 0x2f, 0xb2, 0x4c, 0x66, 0xde, 0x7e, 0x79,
+ 0x91, 0x81, 0xd3, 0xec, 0x66, 0x36, 0x18, 0xc4, 0x43, 0xfd, 0xdd, 0xfe,
+ 0x8f, 0xb1, 0x76, 0x09, 0x01, 0x02, 0xd9, 0xfc, 0xc5, 0x01, 0x1d, 0x2e,
+ 0x09, 0xfe, 0x9b, 0x3c, 0x47, 0xe6, 0x3f, 0x1b, 0xad, 0xa5, 0xfe, 0xe7,
+ 0xfe, 0xd9, 0xa6, 0x95, 0xb2, 0x5e, 0x98, 0xfd, 0xb0, 0x01, 0x1d, 0xbc,
+ 0x01, 0x08, 0x14, 0x00, 0x00, 0x02, 0x00, 0xb6, 0x00, 0x00, 0x05, 0x56,
+ 0x05, 0xd5, 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x33, 0x11, 0x21, 0x20,
+ 0x00, 0x11, 0x10, 0x07, 0x06, 0x21, 0x25, 0x21, 0x20, 0x13, 0x36, 0x35,
+ 0x10, 0x25, 0x26, 0x23, 0x21, 0xb6, 0x02, 0x40, 0x01, 0x1b, 0x01, 0x45,
+ 0xaf, 0xa2, 0xfe, 0xf1, 0xfe, 0x7f, 0x01, 0x60, 0x01, 0x2f, 0x65, 0x2f,
+ 0xff, 0x00, 0x55, 0x6e, 0xfe, 0xa0, 0x05, 0xd5, 0xfe, 0x72, 0xfe, 0xa5,
+ 0xfe, 0x95, 0xc9, 0xb8, 0xa8, 0x01, 0x10, 0x7d, 0xb4, 0x01, 0xaf, 0x70,
+ 0x25, 0x00, 0x00, 0x01, 0x00, 0xb8, 0x00, 0x00, 0x04, 0xe7, 0x05, 0xd5,
+ 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15,
+ 0x21, 0x11, 0x21, 0x15, 0x01, 0x77, 0x03, 0x70, 0xfb, 0xd1, 0x04, 0x0b,
+ 0xfc, 0xb4, 0x03, 0x2d, 0x02, 0xa8, 0xfe, 0x00, 0xa8, 0x05, 0xd5, 0xa8,
+ 0xfe, 0x23, 0xa8, 0x00, 0x00, 0x01, 0x00, 0xb8, 0x00, 0x00, 0x04, 0xa2,
+ 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x15,
+ 0x21, 0x11, 0x21, 0x15, 0x01, 0x77, 0xbf, 0x03, 0xea, 0xfc, 0xd5, 0x02,
+ 0xc8, 0x02, 0xa8, 0xfd, 0x58, 0x05, 0xd5, 0xa8, 0xfe, 0x23, 0xa8, 0x00,
+ 0x00, 0x01, 0x00, 0x5a, 0xff, 0xd1, 0x05, 0xac, 0x05, 0xee, 0x00, 0x31,
+ 0x00, 0x00, 0x01, 0x14, 0x17, 0x16, 0x05, 0x32, 0x33, 0x32, 0x37, 0x36,
+ 0x37, 0x36, 0x3d, 0x01, 0x21, 0x35, 0x21, 0x11, 0x23, 0x27, 0x06, 0x07,
+ 0x06, 0x23, 0x20, 0x27, 0x26, 0x03, 0x26, 0x35, 0x34, 0x37, 0x12, 0x25,
+ 0x36, 0x33, 0x20, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x23, 0x22,
+ 0x07, 0x06, 0x03, 0x14, 0x01, 0x19, 0x58, 0x88, 0x01, 0x28, 0x07, 0x07,
+ 0xc6, 0x84, 0x81, 0x09, 0x01, 0xfe, 0x39, 0x02, 0x6f, 0x79, 0x2f, 0xbe,
+ 0xfb, 0x22, 0x23, 0xfe, 0xf7, 0xb7, 0xb4, 0x2c, 0x0c, 0x61, 0x8d, 0x01,
+ 0x30, 0x52, 0x5d, 0x01, 0x35, 0xaa, 0x72, 0x20, 0xc3, 0x24, 0x95, 0x6a,
+ 0x8d, 0xe5, 0x8f, 0x93, 0x05, 0x02, 0xe5, 0xd1, 0xa0, 0xf5, 0x06, 0x7b,
+ 0x79, 0xbc, 0x0e, 0x0d, 0x29, 0xa7, 0xfc, 0xe4, 0xc6, 0xd3, 0x17, 0x03,
+ 0xab, 0xa7, 0x01, 0x17, 0x4e, 0x53, 0xea, 0xc0, 0x01, 0x19, 0x3f, 0x11,
+ 0xb2, 0x76, 0xb6, 0xaa, 0x52, 0x3a, 0x9d, 0xa2, 0xfe, 0xef, 0x08, 0x00,
+ 0x00, 0x01, 0x00, 0xaa, 0x00, 0x00, 0x05, 0x27, 0x05, 0xd5, 0x00, 0x0b,
+ 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33,
+ 0x11, 0x23, 0x04, 0x68, 0xfd, 0x00, 0xbe, 0xbe, 0x03, 0x00, 0xbf, 0xbf,
+ 0x02, 0xa8, 0xfd, 0x58, 0x05, 0xd5, 0xfd, 0x7b, 0x02, 0x85, 0xfa, 0x2b,
+ 0x00, 0x01, 0x00, 0xcd, 0x00, 0x00, 0x01, 0x8d, 0x05, 0xd5, 0x00, 0x03,
+ 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x8d, 0xc0, 0x05, 0xd5, 0xfa,
+ 0x2b, 0x05, 0xd5, 0x00, 0x00, 0x01, 0x00, 0x23, 0xff, 0xd1, 0x03, 0x68,
+ 0x05, 0xd5, 0x00, 0x15, 0x00, 0x00, 0x25, 0x32, 0x37, 0x36, 0x35, 0x11,
+ 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33,
+ 0x15, 0x14, 0x17, 0x16, 0x01, 0xc5, 0xa7, 0x2c, 0x12, 0xbe, 0x88, 0x6f,
+ 0xae, 0xd6, 0x71, 0x59, 0xc2, 0x80, 0x2a, 0x71, 0xa0, 0x42, 0x67, 0x04,
+ 0x1b, 0xfb, 0xa0, 0xd6, 0x72, 0x5c, 0x83, 0x67, 0xa1, 0x83, 0x60, 0xc6,
+ 0x36, 0x12, 0x00, 0x01, 0x00, 0xa2, 0x00, 0x00, 0x05, 0x44, 0x05, 0xd5,
+ 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33,
+ 0x09, 0x01, 0x23, 0x01, 0x01, 0x60, 0xbe, 0xbe, 0x02, 0xe8, 0xf5, 0xfd,
+ 0xa0, 0x02, 0x67, 0xe2, 0xfd, 0xf2, 0x02, 0x0a, 0xfd, 0xf6, 0x05, 0xd5,
+ 0xfd, 0x0c, 0x02, 0xf4, 0xfd, 0xa0, 0xfc, 0x8b, 0x02, 0xfe, 0x00, 0x01,
+ 0x00, 0xa4, 0x00, 0x00, 0x04, 0x44, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00,
+ 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x62, 0x02, 0xe2, 0xfc, 0x60,
+ 0x05, 0xd5, 0xfa, 0xd3, 0xa8, 0x05, 0xd5, 0x00, 0x00, 0x01, 0x00, 0x9a,
+ 0x00, 0x00, 0x06, 0x17, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x21, 0x23,
+ 0x01, 0x11, 0x23, 0x11, 0x21, 0x09, 0x01, 0x21, 0x11, 0x23, 0x11, 0x03,
+ 0xbe, 0xc8, 0xfe, 0x58, 0xb4, 0x01, 0x08, 0x01, 0xba, 0x01, 0xb2, 0x01,
+ 0x09, 0xb5, 0x04, 0xe3, 0xfb, 0x1d, 0x05, 0xd5, 0xfa, 0xec, 0x05, 0x14,
+ 0xfa, 0x2b, 0x04, 0xe3, 0x00, 0x01, 0x00, 0x9c, 0x00, 0x00, 0x05, 0x2b,
+ 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x01, 0x11, 0x23,
+ 0x11, 0x33, 0x01, 0x11, 0x05, 0x2b, 0xd7, 0xfc, 0xfc, 0xb4, 0xce, 0x03,
+ 0x0d, 0x05, 0xd5, 0xfa, 0x2b, 0x04, 0xba, 0xfb, 0x46, 0x05, 0xd5, 0xfb,
+ 0x3b, 0x04, 0xc5, 0x00, 0x00, 0x02, 0x00, 0x4e, 0xff, 0xd1, 0x05, 0xf0,
+ 0x05, 0xee, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x10, 0x00, 0x07,
+ 0x06, 0x23, 0x20, 0x27, 0x26, 0x03, 0x26, 0x35, 0x10, 0x37, 0x36, 0x25,
+ 0x36, 0x33, 0x20, 0x17, 0x16, 0x13, 0x16, 0x01, 0x22, 0x07, 0x06, 0x03,
+ 0x06, 0x15, 0x10, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37,
+ 0x36, 0x35, 0x10, 0x27, 0x26, 0x05, 0xf0, 0xfe, 0xd4, 0xfc, 0x51, 0x58,
+ 0xfe, 0xe0, 0xc1, 0xbd, 0x29, 0x0a, 0xa8, 0x9d, 0x01, 0x03, 0x41, 0x46,
+ 0x01, 0x2d, 0xc2, 0xbf, 0x20, 0x05, 0xfd, 0x2d, 0xe2, 0x90, 0x94, 0x0a,
+ 0x01, 0x8f, 0x88, 0xdd, 0x0f, 0x10, 0xde, 0x91, 0x93, 0x0f, 0x01, 0x94,
+ 0x96, 0x02, 0xd3, 0xfe, 0xe0, 0xfe, 0x66, 0x36, 0x12, 0xb0, 0xac, 0x01,
+ 0x20, 0x47, 0x4b, 0x01, 0x3f, 0xd3, 0xc6, 0x2c, 0x0b, 0xb9, 0xb8, 0xfe,
+ 0xc7, 0x37, 0x02, 0x39, 0x9a, 0x9f, 0xfe, 0xf7, 0x12, 0x13, 0xfe, 0xf0,
+ 0xa9, 0xa1, 0x0b, 0x01, 0x97, 0x98, 0xfc, 0x19, 0x1a, 0x01, 0x1e, 0xab,
+ 0xa3, 0x00, 0x00, 0x02, 0x00, 0xba, 0x00, 0x00, 0x04, 0xf0, 0x05, 0xd5,
+ 0x00, 0x0c, 0x00, 0x17, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x23, 0x21,
+ 0x11, 0x23, 0x11, 0x21, 0x20, 0x17, 0x16, 0x01, 0x21, 0x32, 0x37, 0x36,
+ 0x35, 0x34, 0x27, 0x26, 0x23, 0x21, 0x04, 0xf0, 0x7e, 0x72, 0xb2, 0xfe,
+ 0x2b, 0xbf, 0x02, 0x69, 0x01, 0x17, 0x73, 0x43, 0xfc, 0x89, 0x01, 0x8d,
+ 0xb1, 0x4a, 0x28, 0x77, 0x46, 0x66, 0xfe, 0x73, 0x04, 0x1f, 0xc7, 0x75,
+ 0x6a, 0xfd, 0x87, 0x05, 0xd5, 0xb1, 0x69, 0xfe, 0x66, 0x71, 0x3e, 0x57,
+ 0x9b, 0x43, 0x28, 0x00, 0x00, 0x02, 0x00, 0x4e, 0xff, 0x87, 0x05, 0xf0,
+ 0x05, 0xee, 0x00, 0x18, 0x00, 0x33, 0x00, 0x00, 0x05, 0x07, 0x27, 0x06,
+ 0x23, 0x20, 0x27, 0x26, 0x03, 0x26, 0x35, 0x10, 0x37, 0x36, 0x25, 0x36,
+ 0x33, 0x20, 0x17, 0x16, 0x13, 0x16, 0x15, 0x10, 0x07, 0x01, 0x17, 0x36,
+ 0x11, 0x10, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x03, 0x06,
+ 0x15, 0x10, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x27,
+ 0x05, 0xdd, 0x60, 0xd7, 0xb1, 0xd6, 0xfe, 0xe0, 0xc1, 0xbd, 0x29, 0x0a,
+ 0xa8, 0x9e, 0x01, 0x04, 0x41, 0x46, 0x01, 0x1f, 0xc2, 0xbb, 0x2a, 0x0b,
+ 0xd3, 0xfe, 0xbc, 0xb6, 0xa2, 0x8e, 0x87, 0xdc, 0x10, 0x11, 0xe4, 0x90,
+ 0x94, 0x0a, 0x01, 0x8f, 0x89, 0xdf, 0x0d, 0x0d, 0x75, 0x6f, 0x08, 0x09,
+ 0x97, 0x02, 0x77, 0xb2, 0x68, 0xb0, 0xac, 0x01, 0x20, 0x47, 0x4b, 0x01,
+ 0x3f, 0xd3, 0xc6, 0x2c, 0x0b, 0xaf, 0xaa, 0xfe, 0xe3, 0x48, 0x4d, 0xfe,
+ 0xa1, 0xe8, 0x01, 0x08, 0x96, 0xb6, 0x01, 0x1d, 0x01, 0x0f, 0xa8, 0xa1,
+ 0x0c, 0x01, 0x9b, 0x9f, 0xfe, 0xf6, 0x11, 0x12, 0xfe, 0xee, 0xa9, 0xa1,
+ 0x09, 0x01, 0x31, 0x04, 0x04, 0x7f, 0x00, 0x02, 0x00, 0xbe, 0x00, 0x00,
+ 0x05, 0x6f, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x00, 0x01, 0x16,
+ 0x17, 0x16, 0x07, 0x06, 0x17, 0x16, 0x17, 0x15, 0x23, 0x26, 0x3d, 0x01,
+ 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x21, 0x20, 0x17, 0x16,
+ 0x15, 0x14, 0x07, 0x06, 0x03, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21,
+ 0x32, 0x37, 0x36, 0x04, 0x4a, 0x9d, 0x23, 0x0e, 0x02, 0x02, 0x14, 0x15,
+ 0x32, 0xe8, 0x29, 0x7b, 0x32, 0x49, 0xfe, 0x15, 0xbf, 0x02, 0xb1, 0x01,
+ 0x28, 0x6a, 0x34, 0x67, 0x32, 0x2d, 0xa6, 0x35, 0x4a, 0xfe, 0x33, 0x01,
+ 0xcd, 0xdb, 0x36, 0x14, 0x02, 0xe1, 0x44, 0x91, 0x3d, 0x89, 0x81, 0x39,
+ 0x3a, 0x23, 0x2f, 0x60, 0x94, 0x85, 0xc3, 0x32, 0x15, 0xfd, 0x7d, 0x05,
+ 0xd5, 0xb6, 0x5a, 0x7f, 0xab, 0x62, 0x30, 0x01, 0x22, 0xc9, 0x2b, 0x0e,
+ 0xfd, 0xfe, 0x86, 0x32, 0x00, 0x01, 0x00, 0x62, 0xff, 0xd1, 0x04, 0xf8,
+ 0x05, 0xee, 0x00, 0x32, 0x00, 0x00, 0x25, 0x20, 0x37, 0x36, 0x35, 0x34,
+ 0x27, 0x26, 0x27, 0x25, 0x24, 0x11, 0x34, 0x37, 0x36, 0x33, 0x20, 0x17,
+ 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14,
+ 0x17, 0x16, 0x17, 0x05, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x21,
+ 0x20, 0x27, 0x26, 0x27, 0x33, 0x15, 0x14, 0x17, 0x16, 0x02, 0xbc, 0x01,
+ 0x22, 0x47, 0x14, 0xa5, 0x2f, 0x3e, 0xfe, 0x8d, 0xfe, 0xdb, 0x9e, 0x8d,
+ 0xe8, 0x01, 0x31, 0x8e, 0x63, 0x01, 0xb5, 0x02, 0xa5, 0x54, 0x79, 0xb2,
+ 0x5c, 0x40, 0x4b, 0x37, 0x74, 0x01, 0x76, 0xd2, 0x4a, 0x22, 0x62, 0x97,
+ 0xfe, 0xb1, 0xfe, 0xe4, 0x9c, 0x93, 0x03, 0xb5, 0x74, 0x6c, 0x79, 0xa8,
+ 0x2f, 0x37, 0x87, 0x47, 0x14, 0x10, 0x62, 0x4c, 0x01, 0x10, 0xd7, 0x76,
+ 0x6a, 0xa7, 0x74, 0xb4, 0xc1, 0x49, 0x25, 0x5e, 0x41, 0x5d, 0x62, 0x35,
+ 0x27, 0x1f, 0x65, 0x39, 0x9d, 0x49, 0x57, 0x9f, 0x75, 0xb5, 0x8d, 0x86,
+ 0xf7, 0x0a, 0xa7, 0x5c, 0x55, 0x00, 0x00, 0x01, 0x00, 0x2b, 0x00, 0x00,
+ 0x04, 0xbe, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11,
+ 0x21, 0x35, 0x21, 0x15, 0x02, 0xd5, 0xbe, 0xfe, 0x14, 0x04, 0x93, 0x05,
+ 0x2d, 0xfa, 0xd3, 0x05, 0x2d, 0xa8, 0xa8, 0x00, 0x00, 0x01, 0x00, 0xae,
+ 0xff, 0xd1, 0x05, 0x29, 0x05, 0xd5, 0x00, 0x15, 0x00, 0x00, 0x01, 0x33,
+ 0x11, 0x14, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11,
+ 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x04, 0x6a, 0xbf, 0x9d,
+ 0x9d, 0xfe, 0xfa, 0xfe, 0xe0, 0x9a, 0x81, 0xbf, 0xae, 0x56, 0x78, 0xd9,
+ 0x66, 0x42, 0x05, 0xd5, 0xfb, 0xe7, 0xe1, 0x86, 0x84, 0x9a, 0x81, 0xd0,
+ 0x04, 0x19, 0xfb, 0xe7, 0xd0, 0x4d, 0x26, 0x7b, 0x50, 0x78, 0x00, 0x01,
+ 0x00, 0x3d, 0x00, 0x00, 0x05, 0x29, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00,
+ 0x21, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33, 0x03, 0x23, 0xcd, 0xfd, 0xe7,
+ 0xcd, 0x01, 0xb7, 0x01, 0x9d, 0xcb, 0x05, 0xd5, 0xfb, 0x10, 0x04, 0xf0,
+ 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x07, 0x6f, 0x05, 0xd5, 0x00, 0x0c,
+ 0x00, 0x00, 0x21, 0x23, 0x09, 0x01, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33,
+ 0x09, 0x01, 0x33, 0x05, 0xf4, 0xd1, 0xfe, 0xa8, 0xfe, 0xb2, 0xd1, 0xfe,
+ 0x81, 0xd5, 0x01, 0x19, 0x01, 0x4b, 0xcd, 0x01, 0x54, 0x01, 0x13, 0xd5,
+ 0x04, 0xcb, 0xfb, 0x35, 0x05, 0xd5, 0xfb, 0x44, 0x04, 0xbc, 0xfb, 0x44,
+ 0x04, 0xbc, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x31, 0x05, 0xd5,
+ 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01,
+ 0x33, 0x09, 0x01, 0x33, 0x03, 0x21, 0x02, 0x10, 0xeb, 0xfe, 0x68, 0xfe,
+ 0x66, 0xe7, 0x02, 0x10, 0xfe, 0x11, 0xe7, 0x01, 0x7f, 0x01, 0x81, 0xe4,
+ 0x02, 0xfe, 0xfd, 0x02, 0x02, 0x6f, 0xfd, 0x91, 0x02, 0xfe, 0x02, 0xd7,
+ 0xfd, 0xb6, 0x02, 0x4a, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x05, 0x4a,
+ 0x05, 0xd5, 0x00, 0x08, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x33,
+ 0x09, 0x01, 0x33, 0x03, 0x19, 0xbf, 0xfd, 0xc1, 0xeb, 0x01, 0xb6, 0x01,
+ 0xaa, 0xe4, 0x02, 0x4a, 0xfd, 0xb6, 0x02, 0x4a, 0x03, 0x8b, 0xfd, 0x29,
+ 0x02, 0xd7, 0x00, 0x01, 0x00, 0x39, 0x00, 0x00, 0x04, 0xaa, 0x05, 0xd5,
+ 0x00, 0x09, 0x00, 0x00, 0x01, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01,
+ 0x21, 0x35, 0x04, 0xa6, 0xfc, 0x83, 0x03, 0x81, 0xfb, 0x8f, 0x03, 0x81,
+ 0xfc, 0xb9, 0x05, 0xd5, 0xac, 0xfb, 0x7f, 0xa8, 0xa8, 0x04, 0x85, 0xa8,
+ 0x00, 0x01, 0x00, 0x83, 0xfe, 0x4e, 0x02, 0x00, 0x05, 0xd5, 0x00, 0x07,
+ 0x00, 0x00, 0x01, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x11, 0x02, 0x00,
+ 0xd3, 0xd3, 0xfe, 0x83, 0x05, 0xd5, 0x93, 0xf9, 0x9f, 0x93, 0x07, 0x87,
+ 0x00, 0x01, 0xff, 0xf0, 0xff, 0xd7, 0x02, 0x46, 0x05, 0xd5, 0x00, 0x03,
+ 0x00, 0x00, 0x13, 0x01, 0x23, 0x01, 0x60, 0x01, 0xe6, 0x71, 0xfe, 0x1b,
+ 0x05, 0xd5, 0xfa, 0x02, 0x05, 0xfe, 0x00, 0x01, 0x00, 0x2f, 0xfe, 0x4e,
+ 0x01, 0xac, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x13, 0x35, 0x33, 0x11,
+ 0x23, 0x35, 0x21, 0x11, 0x2f, 0xd3, 0xd3, 0x01, 0x7d, 0xfe, 0x4e, 0x93,
+ 0x06, 0x61, 0x93, 0xf8, 0x79, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x02, 0xa2,
+ 0x03, 0x66, 0x05, 0xac, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23,
+ 0x0b, 0x01, 0x23, 0x01, 0x93, 0x96, 0x01, 0x3d, 0x8d, 0xfa, 0xf8, 0x8d,
+ 0x05, 0xac, 0xfc, 0xf6, 0x02, 0x66, 0xfd, 0x9a, 0x00, 0x01, 0xff, 0xd3,
+ 0xfe, 0x98, 0x04, 0xa0, 0xfe, 0xfe, 0x00, 0x03, 0x00, 0x00, 0x01, 0x15,
+ 0x21, 0x35, 0x04, 0xa0, 0xfb, 0x33, 0xfe, 0xfe, 0x66, 0x66, 0x00, 0x01,
+ 0x00, 0x2d, 0x04, 0xbc, 0x01, 0xd9, 0x05, 0xec, 0x00, 0x03, 0x00, 0x00,
+ 0x01, 0x13, 0x23, 0x01, 0x01, 0x14, 0xc5, 0x7b, 0xfe, 0xcf, 0x05, 0xec,
+ 0xfe, 0xd0, 0x01, 0x30, 0x00, 0x02, 0x00, 0x56, 0xff, 0xd1, 0x04, 0x48,
+ 0x04, 0x50, 0x00, 0x31, 0x00, 0x40, 0x00, 0x00, 0x13, 0x12, 0x25, 0x36,
+ 0x33, 0x20, 0x17, 0x16, 0x15, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37,
+ 0x15, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22,
+ 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36,
+ 0x3d, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x13, 0x32,
+ 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17,
+ 0x16, 0x85, 0x0a, 0x01, 0x43, 0x2e, 0x33, 0x01, 0x31, 0x4c, 0x17, 0x46,
+ 0x0a, 0x0c, 0x12, 0x13, 0x48, 0x2d, 0x7f, 0x23, 0x0a, 0x04, 0x90, 0x94,
+ 0x23, 0x26, 0xc0, 0x5e, 0x42, 0x77, 0x54, 0xc6, 0x25, 0x5e, 0x84, 0x20,
+ 0x0f, 0x82, 0x30, 0x3e, 0xb7, 0x31, 0x0f, 0x05, 0xaa, 0x9b, 0x61, 0x46,
+ 0x38, 0x98, 0x9c, 0x3c, 0x6d, 0x66, 0x2e, 0x02, 0xf4, 0x01, 0x30, 0x27,
+ 0x05, 0xae, 0x34, 0x43, 0xfd, 0x89, 0x48, 0x0a, 0x02, 0x04, 0x81, 0x12,
+ 0x5e, 0x1c, 0x24, 0x84, 0x15, 0x05, 0x74, 0x51, 0x78, 0xb0, 0x4c, 0x36,
+ 0x1d, 0x06, 0x0c, 0x10, 0x2d, 0x16, 0x23, 0x2d, 0x72, 0x22, 0x0c, 0x70,
+ 0x21, 0x2d, 0xfd, 0x72, 0x5d, 0x43, 0x4c, 0xc0, 0x19, 0x17, 0x17, 0x1b,
+ 0x31, 0x6d, 0x70, 0x29, 0x13, 0x00, 0x00, 0x02, 0x00, 0x6f, 0xff, 0xd1,
+ 0x04, 0x2f, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x24, 0x00, 0x00, 0x13, 0x33,
+ 0x11, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x10, 0x07, 0x06,
+ 0x23, 0x22, 0x27, 0x26, 0x27, 0x15, 0x23, 0x01, 0x22, 0x07, 0x06, 0x15,
+ 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x6f,
+ 0xaa, 0x68, 0xb6, 0x16, 0x17, 0xdd, 0x7c, 0x72, 0x8a, 0x7e, 0xcb, 0xd5,
+ 0x77, 0x04, 0x04, 0x99, 0x01, 0xd5, 0x91, 0x53, 0x47, 0x6b, 0x4d, 0x73,
+ 0x90, 0x57, 0x52, 0x6e, 0x51, 0x05, 0xd5, 0xfd, 0xcb, 0x9f, 0x0f, 0x02,
+ 0xa3, 0x96, 0xfa, 0xfe, 0xe8, 0xa1, 0x93, 0xac, 0x06, 0x06, 0x89, 0x03,
+ 0xb0, 0x81, 0x6f, 0xb0, 0xdb, 0x72, 0x52, 0x78, 0x71, 0xb0, 0xdd, 0x73,
+ 0x56, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xff, 0xd1, 0x03, 0xd1, 0x04, 0x50,
+ 0x00, 0x1f, 0x00, 0x00, 0x01, 0x23, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07,
+ 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x13, 0x33, 0x06, 0x07, 0x06,
+ 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16,
+ 0x03, 0xc5, 0xac, 0x18, 0x83, 0x2c, 0x37, 0xa5, 0x4d, 0x37, 0x7a, 0x49,
+ 0x6a, 0xdb, 0x2b, 0xac, 0x13, 0xa3, 0x69, 0x97, 0xde, 0x81, 0x7d, 0x8b,
+ 0x82, 0xd1, 0xf3, 0x6d, 0x3d, 0x02, 0xc9, 0xa9, 0x30, 0x10, 0x99, 0x6c,
+ 0xa7, 0xf0, 0x69, 0x3e, 0x01, 0x02, 0xf0, 0x6b, 0x45, 0x9d, 0x99, 0x00,
+ 0xff, 0x01, 0x14, 0xa1, 0x95, 0xa5, 0x5c, 0x00, 0x00, 0x02, 0x00, 0x35,
+ 0xff, 0xd1, 0x03, 0xf6, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x24, 0x00, 0x00,
+ 0x01, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11,
+ 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x11, 0x01, 0x22, 0x07,
+ 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27,
+ 0x26, 0x03, 0xf6, 0x98, 0x62, 0x85, 0x32, 0x3d, 0xe2, 0x7e, 0x73, 0x87,
+ 0x7d, 0xc9, 0xd4, 0x6e, 0x04, 0x04, 0xfe, 0xd3, 0x93, 0x57, 0x4e, 0x6b,
+ 0x53, 0x7c, 0x8f, 0x53, 0x49, 0x6e, 0x4d, 0x05, 0xd5, 0xfa, 0x2b, 0x8d,
+ 0x8e, 0x21, 0x0d, 0xaa, 0x9b, 0x01, 0x05, 0x01, 0x0a, 0x9c, 0x8f, 0x9a,
+ 0x06, 0x06, 0x02, 0x2b, 0xfd, 0xdb, 0x7d, 0x71, 0xb2, 0xd2, 0x73, 0x5a,
+ 0x7d, 0x6f, 0xaf, 0xe2, 0x72, 0x50, 0x00, 0x02, 0x00, 0x52, 0xff, 0xd1,
+ 0x04, 0x1b, 0x04, 0x50, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x00, 0x01, 0x21,
+ 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x33, 0x06,
+ 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x32,
+ 0x17, 0x16, 0x17, 0x16, 0x05, 0x21, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23,
+ 0x22, 0x07, 0x06, 0x04, 0x1b, 0xfc, 0xe9, 0x02, 0x28, 0x07, 0x08, 0x4f,
+ 0x90, 0x11, 0x12, 0xd2, 0x47, 0xac, 0x27, 0xa3, 0x6d, 0x94, 0xec, 0x83,
+ 0x78, 0x8d, 0x85, 0xd9, 0xc5, 0x83, 0x46, 0x25, 0x2b, 0xfc, 0xed, 0x02,
+ 0x5a, 0x02, 0x5a, 0x55, 0x7a, 0x95, 0x56, 0x3e, 0x01, 0xdf, 0x84, 0x48,
+ 0x0d, 0x0c, 0x7b, 0x0e, 0x02, 0xd7, 0xd3, 0x61, 0x41, 0xa6, 0x97, 0xfc,
+ 0x01, 0x11, 0x9f, 0x96, 0x7c, 0x42, 0x5d, 0x73, 0x58, 0x05, 0x08, 0x88,
+ 0x5c, 0x57, 0x74, 0x55, 0x00, 0x01, 0x00, 0x25, 0x00, 0x00, 0x02, 0x10,
+ 0x05, 0xdb, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11,
+ 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26,
+ 0x23, 0x22, 0x1d, 0x01, 0x02, 0x10, 0xb2, 0xaa, 0x8f, 0x8f, 0x72, 0x3a,
+ 0x50, 0x2f, 0x31, 0x27, 0x14, 0x77, 0x04, 0x31, 0x8b, 0xfc, 0x5a, 0x03,
+ 0xa6, 0x8b, 0xb6, 0x9a, 0x3c, 0x1e, 0x0a, 0x8d, 0x02, 0x6d, 0xa8, 0x00,
+ 0x00, 0x02, 0x00, 0x3b, 0xfe, 0x42, 0x03, 0xe9, 0x04, 0x50, 0x00, 0x2a,
+ 0x00, 0x3a, 0x00, 0x00, 0x05, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x10,
+ 0x37, 0x36, 0x37, 0x32, 0x33, 0x32, 0x17, 0x16, 0x17, 0x35, 0x33, 0x11,
+ 0x10, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x33, 0x16,
+ 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x03,
+ 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35,
+ 0x10, 0x27, 0x26, 0x01, 0xf6, 0xac, 0x79, 0x89, 0x0c, 0x01, 0x80, 0x78,
+ 0xbf, 0x09, 0x09, 0xc4, 0x7e, 0x03, 0x03, 0x9d, 0x45, 0x5a, 0xf0, 0x26,
+ 0x2a, 0xf3, 0x70, 0x3f, 0x0a, 0xae, 0x18, 0xa2, 0x22, 0x28, 0xbe, 0x41,
+ 0x2c, 0x64, 0x73, 0x32, 0x1b, 0x99, 0x50, 0x40, 0x78, 0x49, 0x6a, 0x9b,
+ 0x4d, 0x3a, 0x80, 0x44, 0x2f, 0x81, 0x91, 0xf8, 0x15, 0x16, 0x01, 0x07,
+ 0xa3, 0x98, 0x08, 0xb1, 0x04, 0x05, 0x9b, 0xfc, 0x7f, 0xfe, 0xe3, 0x87,
+ 0xb0, 0x16, 0x04, 0x89, 0x4c, 0x6e, 0x92, 0x1c, 0x06, 0x82, 0x58, 0xaf,
+ 0x37, 0x8d, 0x24, 0x0f, 0x03, 0xe1, 0x89, 0x6d, 0xac, 0xf4, 0x6c, 0x41,
+ 0x8d, 0x69, 0xa5, 0x01, 0x09, 0x68, 0x37, 0x00, 0x00, 0x01, 0x00, 0x8f,
+ 0x00, 0x00, 0x03, 0xe3, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34,
+ 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11,
+ 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x23, 0x03, 0x39,
+ 0x79, 0x2f, 0x35, 0x91, 0x50, 0x42, 0xaa, 0xaa, 0x5e, 0x67, 0x3e, 0x55,
+ 0xbe, 0x59, 0x3b, 0xaa, 0x02, 0xe7, 0x90, 0x30, 0x13, 0x75, 0x61, 0x94,
+ 0xfd, 0xb0, 0x05, 0xd5, 0xfd, 0xc9, 0x7a, 0x23, 0x15, 0x70, 0x4a, 0x6b,
+ 0xfc, 0xd5, 0x00, 0x02, 0x00, 0x87, 0x00, 0x00, 0x01, 0x33, 0x05, 0xd5,
+ 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x23, 0x35, 0x13, 0x11,
+ 0x23, 0x11, 0x01, 0x33, 0xac, 0xac, 0xa9, 0x05, 0xd5, 0xd7, 0xd7, 0xfe,
+ 0x5c, 0xfb, 0xcf, 0x04, 0x31, 0x00, 0x00, 0x02, 0xff, 0xdb, 0xfe, 0x42,
+ 0x01, 0x39, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x13, 0x00, 0x00, 0x01, 0x15,
+ 0x23, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35,
+ 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x01, 0x39, 0xaa, 0xaa, 0xce, 0x28,
+ 0x2f, 0x1a, 0x1f, 0x23, 0x06, 0x5d, 0x1c, 0x12, 0x05, 0xd5, 0xd7, 0xd7,
+ 0xfe, 0x5c, 0xfa, 0xf0, 0xb9, 0x20, 0x06, 0x06, 0x91, 0x02, 0x2e, 0x1f,
+ 0x40, 0x00, 0x00, 0x01, 0x00, 0x77, 0x00, 0x00, 0x04, 0x04, 0x05, 0xd5,
+ 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01,
+ 0x07, 0x11, 0x23, 0x11, 0x01, 0x21, 0x01, 0xc6, 0xdc, 0xfe, 0x8b, 0x01,
+ 0xb6, 0xd3, 0xfe, 0x96, 0xa6, 0xaa, 0x05, 0xd5, 0xfc, 0x95, 0x01, 0xc7,
+ 0xfe, 0x8d, 0xfd, 0x42, 0x02, 0x46, 0xa4, 0xfe, 0x5e, 0x05, 0xd5, 0x00,
+ 0x00, 0x01, 0x00, 0x8b, 0x00, 0x00, 0x01, 0x37, 0x05, 0xd5, 0x00, 0x03,
+ 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x37, 0xac, 0x05, 0xd5, 0xfa,
+ 0x2b, 0x05, 0xd5, 0x00, 0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x06, 0x19,
+ 0x04, 0x50, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x33, 0x15, 0x36, 0x37, 0x36,
+ 0x33, 0x32, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16,
+ 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15,
+ 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11,
+ 0x23, 0x8f, 0x9e, 0x5d, 0x72, 0x36, 0x45, 0x9d, 0x54, 0x1a, 0x16, 0x5e,
+ 0x62, 0x3a, 0x4f, 0xd4, 0x46, 0x1e, 0xac, 0x62, 0x2b, 0x3a, 0x6c, 0x4a,
+ 0x46, 0xac, 0x71, 0x25, 0x31, 0x6c, 0x4a, 0x46, 0xac, 0x04, 0x31, 0x97,
+ 0x83, 0x22, 0x11, 0x5e, 0x1e, 0x28, 0x71, 0x20, 0x13, 0x95, 0x40, 0x56,
+ 0xfc, 0xdb, 0x02, 0xe3, 0x8e, 0x32, 0x17, 0x56, 0x51, 0x71, 0xfd, 0x5e,
+ 0x02, 0xe3, 0x9c, 0x2c, 0x0f, 0x56, 0x51, 0x71, 0xfd, 0x5e, 0x00, 0x01,
+ 0x00, 0x8f, 0x00, 0x00, 0x03, 0xe5, 0x04, 0x50, 0x00, 0x17, 0x00, 0x00,
+ 0x13, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11,
+ 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23,
+ 0x8f, 0x9e, 0x5d, 0x7a, 0x3d, 0x50, 0xb6, 0x5d, 0x41, 0xaa, 0x5c, 0x35,
+ 0x4c, 0x91, 0x50, 0x42, 0xac, 0x04, 0x31, 0xb4, 0x94, 0x2a, 0x15, 0x6b,
+ 0x4b, 0x6f, 0xfc, 0xd5, 0x02, 0xe7, 0x7a, 0x38, 0x21, 0x75, 0x61, 0x94,
+ 0xfd, 0xb0, 0x00, 0x02, 0x00, 0x4a, 0xff, 0xd1, 0x04, 0x14, 0x04, 0x50,
+ 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x15, 0x10,
+ 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x17, 0x22,
+ 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34,
+ 0x27, 0x26, 0x02, 0x2d, 0x01, 0x08, 0x7f, 0x60, 0x9a, 0x7f, 0xcc, 0xf9,
+ 0x81, 0x6b, 0xa0, 0x7c, 0xc9, 0x9f, 0x53, 0x41, 0x77, 0x4c, 0x70, 0x9d,
+ 0x53, 0x43, 0x7e, 0x4a, 0x04, 0x50, 0xc3, 0x95, 0xf0, 0xfe, 0xde, 0x98,
+ 0x7d, 0xb4, 0x95, 0xf6, 0x01, 0x2f, 0x99, 0x78, 0x9e, 0x8a, 0x6d, 0xab,
+ 0xee, 0x6d, 0x46, 0x86, 0x6c, 0xa9, 0xfd, 0x6c, 0x3f, 0x00, 0x00, 0x02,
+ 0x00, 0x6f, 0xfe, 0x42, 0x04, 0x2f, 0x04, 0x50, 0x00, 0x11, 0x00, 0x21,
+ 0x00, 0x00, 0x13, 0x11, 0x33, 0x15, 0x36, 0x20, 0x17, 0x16, 0x11, 0x10,
+ 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x11, 0x01, 0x22, 0x07, 0x06,
+ 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26,
+ 0x6f, 0x9d, 0x7a, 0x01, 0xb8, 0x7d, 0x74, 0x88, 0x7c, 0xc7, 0xa9, 0x72,
+ 0x17, 0x17, 0x01, 0x2b, 0x91, 0x53, 0x47, 0x6b, 0x4d, 0x73, 0x91, 0x57,
+ 0x4f, 0x6d, 0x51, 0xfe, 0x42, 0x05, 0xef, 0xa2, 0xc1, 0xa7, 0x9d, 0xfe,
+ 0xfa, 0xfe, 0xf5, 0x9c, 0x8e, 0x6d, 0x17, 0x1c, 0xfd, 0xd1, 0x05, 0x6e,
+ 0x81, 0x6f, 0xb0, 0xdb, 0x72, 0x52, 0x7a, 0x70, 0xaf, 0xdc, 0x73, 0x57,
+ 0x00, 0x02, 0x00, 0x35, 0xfe, 0x42, 0x03, 0xf6, 0x04, 0x50, 0x00, 0x14,
+ 0x00, 0x24, 0x00, 0x00, 0x01, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22,
+ 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x35,
+ 0x33, 0x05, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37,
+ 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0xf6, 0xaa, 0x60, 0x9d, 0x25, 0x2a,
+ 0xdd, 0x7c, 0x72, 0x89, 0x7f, 0xcb, 0xc3, 0x7a, 0x0d, 0x0c, 0x98, 0xfe,
+ 0x2b, 0x94, 0x57, 0x4f, 0x6b, 0x53, 0x7c, 0x8f, 0x53, 0x49, 0x6d, 0x4d,
+ 0xfe, 0x42, 0x02, 0x39, 0x8d, 0x17, 0x06, 0xa3, 0x96, 0xfa, 0x01, 0x15,
+ 0xa2, 0x95, 0x8e, 0x0f, 0x11, 0x8f, 0x81, 0x7d, 0x71, 0xb2, 0xd2, 0x73,
+ 0x5a, 0x7d, 0x6e, 0xae, 0xe3, 0x73, 0x50, 0x00, 0x00, 0x01, 0x00, 0x8d,
+ 0x00, 0x00, 0x02, 0x91, 0x04, 0x50, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x06,
+ 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33,
+ 0x32, 0x17, 0x02, 0x91, 0xb0, 0x4e, 0x5a, 0xac, 0x9e, 0x64, 0x5f, 0x2d,
+ 0x35, 0x17, 0x2a, 0x03, 0x9c, 0x03, 0x49, 0x55, 0xce, 0xfd, 0xd3, 0x04,
+ 0x31, 0xc2, 0xa2, 0x2b, 0x14, 0x06, 0x00, 0x01, 0x00, 0x46, 0xff, 0xd1,
+ 0x03, 0xac, 0x04, 0x50, 0x00, 0x32, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33,
+ 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26,
+ 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27,
+ 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16,
+ 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x20, 0x27, 0x26, 0x27, 0xfa,
+ 0x0f, 0x7e, 0x79, 0x93, 0x42, 0x25, 0x4f, 0x22, 0x35, 0xa0, 0xd4, 0x48,
+ 0x38, 0x80, 0x6f, 0xad, 0xfc, 0x5c, 0x2c, 0x01, 0xb4, 0x05, 0xa3, 0x16,
+ 0x19, 0x8f, 0x3a, 0x1b, 0x65, 0x28, 0x3a, 0xa4, 0xd1, 0x3e, 0x20, 0x88,
+ 0x76, 0xbc, 0xfe, 0xa4, 0x41, 0x0d, 0x02, 0x01, 0x3f, 0x72, 0x5e, 0x4a,
+ 0x28, 0x36, 0x50, 0x27, 0x11, 0x0d, 0x27, 0x33, 0x52, 0x41, 0x6f, 0xa1,
+ 0x5a, 0x4d, 0x9a, 0x49, 0x67, 0x96, 0x13, 0x03, 0x4d, 0x25, 0x30, 0x50,
+ 0x2b, 0x10, 0x0e, 0x27, 0x32, 0x6d, 0x3a, 0x52, 0xa6, 0x5d, 0x51, 0xfc,
+ 0x34, 0x3e, 0x00, 0x01, 0x00, 0x1d, 0xff, 0xd1, 0x02, 0x08, 0x05, 0x58,
+ 0x00, 0x17, 0x00, 0x00, 0x01, 0x15, 0x23, 0x11, 0x14, 0x17, 0x16, 0x33,
+ 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35,
+ 0x33, 0x11, 0x33, 0x11, 0x02, 0x08, 0xb0, 0x1f, 0x14, 0x2b, 0x36, 0x1c,
+ 0x50, 0x3b, 0x9e, 0x26, 0x0b, 0x91, 0x91, 0xaa, 0x04, 0x31, 0x8b, 0xfd,
+ 0x21, 0x45, 0x11, 0x0b, 0x09, 0x90, 0x0e, 0x69, 0x1d, 0x24, 0x03, 0x2b,
+ 0x8b, 0x01, 0x27, 0xfe, 0xd9, 0x00, 0x00, 0x01, 0x00, 0x85, 0xff, 0xd1,
+ 0x03, 0xdb, 0x04, 0x31, 0x00, 0x17, 0x00, 0x00, 0x21, 0x23, 0x35, 0x06,
+ 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17,
+ 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x03, 0xdb, 0x99, 0x60,
+ 0x71, 0x41, 0x55, 0xb9, 0x5c, 0x41, 0xaa, 0x5c, 0x35, 0x4c, 0x93, 0x50,
+ 0x42, 0xaa, 0x96, 0x87, 0x28, 0x16, 0x6c, 0x4b, 0x6e, 0x03, 0x3b, 0xfd,
+ 0x08, 0x7a, 0x38, 0x21, 0x76, 0x61, 0x94, 0x02, 0x60, 0x00, 0x00, 0x01,
+ 0x00, 0x14, 0x00, 0x00, 0x03, 0xe3, 0x04, 0x31, 0x00, 0x06, 0x00, 0x00,
+ 0x21, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x48, 0xbb, 0xfe, 0x87,
+ 0xc1, 0x01, 0x1f, 0x01, 0x2f, 0xc0, 0x04, 0x31, 0xfc, 0x9a, 0x03, 0x66,
+ 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x05, 0xaa, 0x04, 0x31, 0x00, 0x0c,
+ 0x00, 0x00, 0x21, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x33, 0x1b, 0x01, 0x33,
+ 0x1b, 0x01, 0x33, 0x04, 0x6f, 0xc3, 0xd9, 0xcf, 0xc0, 0xfe, 0xc8, 0xbd,
+ 0xdb, 0xcd, 0xd1, 0xd2, 0xd5, 0xc1, 0x03, 0x4a, 0xfc, 0xb6, 0x04, 0x31,
+ 0xfc, 0xbd, 0x03, 0x43, 0xfc, 0xbd, 0x03, 0x43, 0x00, 0x01, 0x00, 0x23,
+ 0x00, 0x00, 0x03, 0xc9, 0x04, 0x31, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01,
+ 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x56,
+ 0x01, 0x73, 0xc7, 0xfe, 0xf4, 0xfe, 0xef, 0xc2, 0x01, 0x7b, 0xfe, 0x99,
+ 0xc3, 0x01, 0x02, 0x01, 0x02, 0xc0, 0x02, 0x2b, 0xfd, 0xd5, 0x01, 0x9c,
+ 0xfe, 0x64, 0x02, 0x23, 0x02, 0x0e, 0xfe, 0x7b, 0x01, 0x85, 0x00, 0x01,
+ 0x00, 0x29, 0xfe, 0x42, 0x03, 0xd3, 0x04, 0x31, 0x00, 0x11, 0x00, 0x00,
+ 0x01, 0x33, 0x01, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37,
+ 0x36, 0x3f, 0x01, 0x01, 0x33, 0x01, 0x03, 0x1b, 0xb8, 0xfe, 0x23, 0x54,
+ 0xc1, 0x41, 0x31, 0x3b, 0x1f, 0x4c, 0x24, 0x0d, 0x0c, 0x41, 0xfe, 0x96,
+ 0xb6, 0x01, 0x13, 0x04, 0x31, 0xfa, 0xee, 0xdd, 0x1a, 0x9a, 0x0d, 0x36,
+ 0x15, 0x1e, 0xaa, 0x04, 0x35, 0xfc, 0xbd, 0x00, 0x00, 0x01, 0x00, 0x3f,
+ 0x00, 0x00, 0x03, 0xa8, 0x04, 0x31, 0x00, 0x09, 0x00, 0x00, 0x01, 0x15,
+ 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x35, 0x03, 0x8b, 0xfd, 0x83,
+ 0x02, 0x9a, 0xfc, 0x97, 0x02, 0x82, 0xfd, 0xa9, 0x04, 0x31, 0x97, 0xfc,
+ 0xfc, 0x96, 0x9a, 0x03, 0x02, 0x95, 0x00, 0x01, 0x00, 0x58, 0xfe, 0x4e,
+ 0x02, 0x35, 0x05, 0xd5, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22,
+ 0x07, 0x06, 0x15, 0x11, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15,
+ 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35,
+ 0x11, 0x34, 0x27, 0x26, 0x27, 0x35, 0x36, 0x37, 0x36, 0x35, 0x11, 0x34,
+ 0x37, 0x36, 0x33, 0x02, 0x35, 0x1e, 0x55, 0x19, 0x13, 0x3d, 0x25, 0x46,
+ 0x8b, 0x18, 0x05, 0x25, 0x1b, 0x41, 0x1e, 0x5e, 0x8e, 0x36, 0x1b, 0x32,
+ 0x23, 0x4b, 0x5e, 0x22, 0x20, 0x6f, 0x30, 0x40, 0x05, 0xd5, 0x85, 0x26,
+ 0x1e, 0x45, 0xfe, 0x8d, 0xae, 0x4a, 0x2e, 0x1c, 0x41, 0xad, 0x27, 0x2e,
+ 0xfe, 0x8d, 0x5b, 0x1a, 0x14, 0x85, 0x7a, 0x3d, 0x55, 0x01, 0x56, 0xa6,
+ 0x3c, 0x2a, 0x0f, 0x8d, 0x13, 0x41, 0x3d, 0x8a, 0x01, 0x56, 0xb3, 0x3e,
+ 0x1b, 0x00, 0x00, 0x01, 0x00, 0xcd, 0xfe, 0x4e, 0x01, 0x48, 0x05, 0xd5,
+ 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xcd, 0x7b, 0x7b, 0x05,
+ 0xd5, 0xf8, 0x79, 0x00, 0x00, 0x01, 0x00, 0x3b, 0xfe, 0x4e, 0x02, 0x19,
+ 0x05, 0xd5, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x35, 0x33, 0x32, 0x37, 0x36,
+ 0x35, 0x11, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x11, 0x34,
+ 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14,
+ 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x15, 0x11, 0x14, 0x07, 0x06,
+ 0x23, 0x3b, 0x21, 0x56, 0x1a, 0x13, 0x79, 0x15, 0x1a, 0x8f, 0x15, 0x04,
+ 0x25, 0x1c, 0x42, 0x21, 0x61, 0x92, 0x35, 0x1a, 0x33, 0x22, 0x47, 0x5d,
+ 0x21, 0x1e, 0x71, 0x30, 0x40, 0xfe, 0x4e, 0x85, 0x26, 0x1d, 0x46, 0x01,
+ 0x73, 0xd4, 0x53, 0x0f, 0x0b, 0x43, 0xb7, 0x22, 0x28, 0x01, 0x73, 0x5b,
+ 0x1a, 0x14, 0x85, 0x7d, 0x3c, 0x53, 0xfe, 0xaa, 0xa7, 0x3c, 0x29, 0x0f,
+ 0x8d, 0x14, 0x44, 0x3e, 0x85, 0xfe, 0xaa, 0xb4, 0x3e, 0x1a, 0x00, 0x01,
+ 0x00, 0x9a, 0x02, 0x25, 0x04, 0x10, 0x03, 0x81, 0x00, 0x1f, 0x00, 0x00,
+ 0x01, 0x22, 0x07, 0x06, 0x15, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x1f,
+ 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x07,
+ 0x06, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x01, 0x73, 0x5e, 0x0e,
+ 0x01, 0x6c, 0x0c, 0x87, 0x22, 0x28, 0x39, 0x35, 0xf0, 0x39, 0x2d, 0x51,
+ 0x12, 0x06, 0x6c, 0x59, 0x35, 0x49, 0x4f, 0x57, 0xc8, 0x28, 0x28, 0x05,
+ 0x02, 0xf8, 0x95, 0x05, 0x06, 0xea, 0x32, 0x0d, 0x21, 0x8d, 0x23, 0x4d,
+ 0x1b, 0x27, 0x0b, 0x21, 0x96, 0x45, 0x29, 0x35, 0x81, 0x17, 0x05, 0x01,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x06,
+ 0x00, 0x04, 0x00, 0x00, 0xff, 0xff, 0x00, 0xfa, 0xfe, 0x5c, 0x01, 0xa6,
+ 0x04, 0x31, 0x10, 0x0f, 0x00, 0x05, 0x02, 0xa4, 0x04, 0x31, 0xc0, 0x00,
+ 0x00, 0x02, 0x00, 0x6a, 0xff, 0x0a, 0x04, 0x14, 0x05, 0x06, 0x00, 0x1e,
+ 0x00, 0x27, 0x00, 0x00, 0x01, 0x11, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06,
+ 0x07, 0x15, 0x23, 0x35, 0x26, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37,
+ 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x03,
+ 0x11, 0x06, 0x03, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0x7f, 0xc6, 0x23,
+ 0xac, 0x0c, 0x8f, 0x65, 0x95, 0x56, 0xe0, 0x78, 0x67, 0x96, 0x73, 0xb6,
+ 0x56, 0xef, 0x62, 0x32, 0x06, 0xac, 0x0f, 0x6b, 0x2c, 0x8d, 0xe7, 0x20,
+ 0x05, 0x80, 0x3b, 0x03, 0xb2, 0xfc, 0xbb, 0x15, 0xef, 0xd8, 0x71, 0x50,
+ 0x07, 0xc7, 0xc9, 0x14, 0xac, 0x93, 0xe0, 0x01, 0x1a, 0xa0, 0x7b, 0x13,
+ 0xb8, 0xb6, 0x11, 0xa9, 0x56, 0x77, 0x93, 0x3a, 0x18, 0xfc, 0xc3, 0x03,
+ 0x3f, 0x2b, 0xfe, 0xdf, 0x2c, 0x32, 0xef, 0x69, 0x31, 0x00, 0x00, 0x01,
+ 0x00, 0x35, 0xff, 0xd1, 0x04, 0x48, 0x05, 0xd5, 0x00, 0x41, 0x00, 0x00,
+ 0x01, 0x14, 0x1f, 0x01, 0x16, 0x17, 0x21, 0x15, 0x21, 0x16, 0x15, 0x14,
+ 0x07, 0x06, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17,
+ 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07,
+ 0x27, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x26, 0x27,
+ 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17,
+ 0x23, 0x02, 0x21, 0x22, 0x07, 0x06, 0x01, 0x2d, 0x34, 0x3e, 0x04, 0x03,
+ 0x01, 0x48, 0xfe, 0xe9, 0x1f, 0x4f, 0x35, 0x6e, 0x79, 0x81, 0x45, 0x72,
+ 0x60, 0x33, 0x4f, 0x5b, 0x56, 0x67, 0x7b, 0x15, 0x16, 0x58, 0x82, 0x75,
+ 0x36, 0x17, 0x16, 0x6d, 0x72, 0x62, 0xb3, 0x31, 0x1c, 0x31, 0xe2, 0xa6,
+ 0x54, 0x0f, 0x09, 0x7a, 0x7a, 0xba, 0x1c, 0x1d, 0xf8, 0x74, 0x54, 0x03,
+ 0xb5, 0x09, 0xfe, 0xf3, 0x9a, 0x50, 0x37, 0x04, 0x2f, 0x56, 0x5d, 0x6d,
+ 0x06, 0x07, 0x71, 0x57, 0x3a, 0x5f, 0x6c, 0x49, 0x6f, 0x50, 0x23, 0x1d,
+ 0x3e, 0x87, 0x65, 0x0c, 0x02, 0x2c, 0x29, 0x06, 0x03, 0x4c, 0x87, 0x9a,
+ 0x6e, 0x3d, 0x43, 0x4c, 0x53, 0x71, 0x8b, 0x3a, 0x24, 0x34, 0xac, 0x7b,
+ 0x7a, 0x12, 0x03, 0xa1, 0x76, 0xc4, 0x01, 0x3b, 0x61, 0x43, 0x00, 0x02,
+ 0x00, 0x89, 0x01, 0x10, 0x03, 0xe9, 0x04, 0x68, 0x00, 0x1f, 0x00, 0x2f,
+ 0x00, 0x00, 0x01, 0x07, 0x27, 0x06, 0x23, 0x22, 0x27, 0x07, 0x27, 0x37,
+ 0x26, 0x27, 0x34, 0x35, 0x34, 0x37, 0x36, 0x37, 0x27, 0x37, 0x17, 0x36,
+ 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x17, 0x14, 0x07, 0x01, 0x22,
+ 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34,
+ 0x27, 0x26, 0x03, 0xe1, 0x77, 0x6c, 0x52, 0x7b, 0x6e, 0x52, 0x69, 0x72,
+ 0x62, 0x3c, 0x06, 0x3f, 0x01, 0x02, 0x6f, 0x73, 0x71, 0x59, 0x6d, 0x77,
+ 0x52, 0x79, 0x74, 0x70, 0x32, 0x03, 0x3b, 0xfe, 0xbe, 0x62, 0x41, 0x36,
+ 0x4a, 0x3e, 0x53, 0x5e, 0x42, 0x39, 0x4b, 0x3d, 0x01, 0x85, 0x6e, 0x6c,
+ 0x3d, 0x33, 0x69, 0x75, 0x64, 0x52, 0x6e, 0x09, 0x08, 0x71, 0x5b, 0x03,
+ 0x02, 0x71, 0x6c, 0x70, 0x35, 0x39, 0x6c, 0x77, 0x70, 0x57, 0x68, 0x67,
+ 0x5f, 0x01, 0x9b, 0x49, 0x3d, 0x51, 0x5f, 0x40, 0x36, 0x47, 0x3d, 0x4f,
+ 0x64, 0x41, 0x34, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x04, 0x5c,
+ 0x05, 0xac, 0x00, 0x16, 0x00, 0x00, 0x01, 0x15, 0x21, 0x15, 0x21, 0x15,
+ 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x01,
+ 0x33, 0x09, 0x01, 0x33, 0x01, 0x03, 0xf6, 0xfe, 0xa4, 0x01, 0x5c, 0xfe,
+ 0xa4, 0xb5, 0xfe, 0xa0, 0x01, 0x60, 0xfe, 0xa0, 0x01, 0x35, 0xfe, 0x5d,
+ 0xae, 0x01, 0x7a, 0x01, 0x6f, 0xae, 0xfe, 0x65, 0x02, 0xd5, 0x68, 0x9e,
+ 0x69, 0xfe, 0x9a, 0x01, 0x66, 0x69, 0x9e, 0x68, 0x02, 0xd7, 0xfd, 0x6d,
+ 0x02, 0x93, 0xfd, 0x29, 0x00, 0x02, 0x00, 0xcd, 0xfe, 0x4e, 0x01, 0x48,
+ 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23,
+ 0x11, 0x33, 0x11, 0x23, 0xcd, 0x7b, 0x7b, 0x7b, 0x7b, 0x05, 0xd5, 0xfc,
+ 0xcb, 0xfe, 0xe3, 0xfc, 0xcb, 0x00, 0x00, 0x02, 0x00, 0x58, 0xfe, 0x4c,
+ 0x04, 0x0c, 0x05, 0xd5, 0x00, 0x45, 0x00, 0x55, 0x00, 0x00, 0x05, 0x14,
+ 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x25,
+ 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35,
+ 0x34, 0x37, 0x36, 0x37, 0x32, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x23,
+ 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16,
+ 0x17, 0x05, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x15,
+ 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x13, 0x05, 0x36, 0x37,
+ 0x36, 0x35, 0x34, 0x27, 0x25, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16,
+ 0x01, 0x4c, 0x92, 0x1d, 0x22, 0x6d, 0x36, 0x21, 0x54, 0x0d, 0x0f, 0xfe,
+ 0xa3, 0x91, 0x20, 0x0b, 0x71, 0x2a, 0x3c, 0x4d, 0x0a, 0x03, 0x68, 0x6b,
+ 0x9d, 0x06, 0x05, 0xac, 0x63, 0x57, 0xac, 0x54, 0x30, 0x42, 0x60, 0x34,
+ 0x23, 0x3b, 0x17, 0x23, 0x01, 0x2b, 0x90, 0x2e, 0x21, 0xdf, 0x56, 0x11,
+ 0x06, 0x6c, 0x6d, 0xa6, 0xc0, 0x64, 0x59, 0xe3, 0x01, 0x54, 0x7b, 0x16,
+ 0x04, 0x95, 0xfe, 0xb6, 0x6b, 0x1a, 0x0c, 0x27, 0x1c, 0x1d, 0xcc, 0x26,
+ 0x08, 0x49, 0x2c, 0x3c, 0x5b, 0x44, 0x0a, 0x0b, 0xef, 0x65, 0x7d, 0x2c,
+ 0x34, 0x93, 0x5e, 0x22, 0x20, 0x5a, 0x4f, 0x13, 0x15, 0x89, 0x61, 0x64,
+ 0x04, 0x71, 0x63, 0x97, 0x39, 0x35, 0x7a, 0x37, 0x20, 0x44, 0x2d, 0x3d,
+ 0x3e, 0x34, 0x14, 0x17, 0xc1, 0x5c, 0x5c, 0x41, 0x5d, 0xec, 0x53, 0x62,
+ 0x4e, 0x1e, 0x24, 0x92, 0x62, 0x64, 0x75, 0x68, 0xba, 0x01, 0xf2, 0xfc,
+ 0x41, 0x69, 0x13, 0x14, 0x7e, 0x67, 0xe0, 0x47, 0x42, 0x20, 0x26, 0x48,
+ 0x2f, 0x22, 0x00, 0x02, 0x00, 0x3d, 0x04, 0xe5, 0x02, 0x5e, 0x05, 0xb8,
+ 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x23, 0x35, 0x21, 0x15,
+ 0x23, 0x35, 0x01, 0x12, 0xd5, 0x02, 0x21, 0xd5, 0x05, 0xb8, 0xd3, 0xd3,
+ 0xd3, 0xd3, 0x00, 0x03, 0xff, 0xe5, 0xff, 0xd3, 0x06, 0x02, 0x05, 0xf0,
+ 0x00, 0x21, 0x00, 0x39, 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06,
+ 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16,
+ 0x17, 0x23, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17,
+ 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x03, 0x20, 0x17, 0x16, 0x17, 0x16,
+ 0x15, 0x10, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26,
+ 0x35, 0x10, 0x37, 0x36, 0x37, 0x36, 0x17, 0x22, 0x07, 0x06, 0x07, 0x06,
+ 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36,
+ 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x04, 0x6a, 0x1c, 0x28, 0x5e, 0xc8,
+ 0xaf, 0x6f, 0x6f, 0x79, 0x6e, 0xac, 0xd7, 0x56, 0x18, 0x0f, 0x91, 0x24,
+ 0x4d, 0x24, 0x34, 0x84, 0x46, 0x36, 0x51, 0x46, 0x69, 0x96, 0x35, 0x08,
+ 0x06, 0xe5, 0x01, 0x04, 0xd0, 0xbf, 0x4f, 0x2c, 0x9f, 0x92, 0xe8, 0x7b,
+ 0x85, 0xf8, 0xcd, 0xbc, 0x52, 0x31, 0x9c, 0x8e, 0xe0, 0x7e, 0x87, 0xde,
+ 0xaf, 0xa4, 0x39, 0x19, 0x88, 0x7e, 0xc0, 0x58, 0x5d, 0xe7, 0xb1, 0xa6,
+ 0x37, 0x16, 0x8b, 0x80, 0xc5, 0x58, 0x02, 0x7f, 0x8a, 0x49, 0xaa, 0x83,
+ 0x84, 0xd2, 0xe2, 0x86, 0x79, 0xc4, 0x35, 0x44, 0x89, 0x24, 0x11, 0x78,
+ 0x5c, 0x8c, 0xa2, 0x64, 0x56, 0xbc, 0x1f, 0x23, 0x03, 0x71, 0x9c, 0x8e,
+ 0xdf, 0x7e, 0x86, 0xfe, 0xf6, 0xd1, 0xc0, 0x4c, 0x29, 0x99, 0x8c, 0xdb,
+ 0x83, 0x8b, 0x01, 0x04, 0xd0, 0xbf, 0x4f, 0x2d, 0x7f, 0x8d, 0x83, 0xcb,
+ 0x58, 0x5d, 0xdf, 0xb3, 0xa5, 0x3c, 0x1c, 0x8f, 0x86, 0xcf, 0x54, 0x59,
+ 0xe2, 0xb2, 0xa6, 0x3a, 0x1a, 0x00, 0x00, 0x03, 0x00, 0x4c, 0x02, 0x6d,
+ 0x02, 0xaa, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x2d, 0x00, 0x3c, 0x00, 0x00,
+ 0x01, 0x15, 0x21, 0x35, 0x25, 0x15, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27,
+ 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37,
+ 0x36, 0x3d, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23,
+ 0x36, 0x37, 0x36, 0x33, 0x32, 0x15, 0x11, 0x14, 0x33, 0x32, 0x27, 0x06,
+ 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36,
+ 0x35, 0x02, 0x8f, 0xfd, 0xc9, 0x02, 0x52, 0x20, 0x22, 0x50, 0x17, 0x06,
+ 0x03, 0x65, 0x72, 0x81, 0x37, 0x1d, 0x4b, 0x4a, 0xac, 0x4f, 0x10, 0x06,
+ 0x54, 0x18, 0x1e, 0x53, 0x1d, 0x12, 0x09, 0x79, 0x05, 0xab, 0x29, 0x30,
+ 0xf9, 0x30, 0x09, 0xad, 0x25, 0x6a, 0x63, 0x20, 0x1d, 0x4e, 0x11, 0x15,
+ 0x5b, 0x39, 0x27, 0x02, 0xd5, 0x68, 0x68, 0xc3, 0x5b, 0x0c, 0x38, 0x0e,
+ 0x12, 0x58, 0x57, 0x2f, 0x3f, 0x6b, 0x30, 0x2f, 0x0d, 0x06, 0x1d, 0x0c,
+ 0x14, 0x1b, 0x44, 0x11, 0x05, 0x27, 0x19, 0x33, 0xb2, 0x24, 0x08, 0xc1,
+ 0xfe, 0x92, 0x30, 0xfa, 0x10, 0x0f, 0x0e, 0x1b, 0x1a, 0x2d, 0x4c, 0x10,
+ 0x04, 0x36, 0x25, 0x2c, 0x00, 0x02, 0x00, 0xc9, 0x00, 0xd9, 0x03, 0xa4,
+ 0x03, 0x81, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x35, 0x25, 0x15,
+ 0x07, 0x17, 0x15, 0x37, 0x35, 0x25, 0x15, 0x07, 0x17, 0x15, 0xc9, 0x01,
+ 0x37, 0xd9, 0xd9, 0x6d, 0x01, 0x37, 0xd9, 0xd9, 0x01, 0xd1, 0xb6, 0xfa,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xf8, 0xb6, 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00,
+ 0x00, 0x01, 0x00, 0x52, 0x00, 0xb0, 0x04, 0x5a, 0x03, 0x00, 0x00, 0x05,
+ 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x52, 0x04, 0x08, 0x8f,
+ 0xfc, 0x87, 0x03, 0x00, 0xfd, 0xb0, 0x01, 0xc1, 0x00, 0x01, 0x00, 0x5e,
+ 0x01, 0xec, 0x02, 0x46, 0x02, 0x7f, 0x00, 0x03, 0x00, 0x00, 0x01, 0x15,
+ 0x21, 0x35, 0x02, 0x46, 0xfe, 0x18, 0x02, 0x7f, 0x93, 0x93, 0x00, 0x04,
+ 0xff, 0xe5, 0xff, 0xd3, 0x06, 0x02, 0x05, 0xf0, 0x00, 0x1a, 0x00, 0x25,
+ 0x00, 0x3d, 0x00, 0x55, 0x00, 0x00, 0x01, 0x16, 0x1f, 0x01, 0x16, 0x17,
+ 0x15, 0x23, 0x26, 0x3f, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x23,
+ 0x11, 0x21, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x25, 0x21, 0x32,
+ 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x21, 0x13, 0x20, 0x17, 0x16,
+ 0x17, 0x16, 0x15, 0x10, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26,
+ 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x36, 0x17, 0x22, 0x07, 0x06,
+ 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36,
+ 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x03, 0xf6, 0x55, 0x07,
+ 0x01, 0x05, 0x29, 0xa2, 0x22, 0x04, 0x02, 0x45, 0x1a, 0x25, 0xfe, 0xee,
+ 0x8f, 0x01, 0xa6, 0x01, 0x07, 0x17, 0x02, 0x2b, 0x17, 0xfe, 0x0b, 0x01,
+ 0x08, 0x7f, 0x16, 0x05, 0x4d, 0x1f, 0x2e, 0xfe, 0xf8, 0xc7, 0x01, 0x04,
+ 0xd0, 0xbf, 0x4f, 0x2c, 0x9f, 0x92, 0xe8, 0x7b, 0x85, 0xf8, 0xcd, 0xbc,
+ 0x52, 0x31, 0x9c, 0x8e, 0xe0, 0x7e, 0x87, 0xde, 0xaf, 0xa4, 0x39, 0x19,
+ 0x88, 0x7e, 0xc0, 0x58, 0x5d, 0xe7, 0xb1, 0xa6, 0x37, 0x16, 0x8b, 0x80,
+ 0xc5, 0x58, 0x02, 0xe1, 0x37, 0x6c, 0x8d, 0x41, 0x1e, 0x33, 0x51, 0x4c,
+ 0x52, 0x6b, 0x18, 0x09, 0xfe, 0x85, 0x03, 0x8f, 0xd5, 0x15, 0x18, 0x5a,
+ 0x35, 0x1c, 0x1a, 0x59, 0x15, 0x1b, 0x66, 0x19, 0x0a, 0x01, 0xc3, 0x9c,
+ 0x8e, 0xdf, 0x7e, 0x86, 0xfe, 0xf6, 0xd1, 0xc0, 0x4c, 0x29, 0x99, 0x8c,
+ 0xdb, 0x83, 0x8b, 0x01, 0x04, 0xd0, 0xbf, 0x4f, 0x2d, 0x7f, 0x8d, 0x83,
+ 0xcb, 0x58, 0x5d, 0xdf, 0xb3, 0xa5, 0x3c, 0x1c, 0x8f, 0x86, 0xcf, 0x54,
+ 0x59, 0xe2, 0xb2, 0xa6, 0x3a, 0x1a, 0x00, 0x01, 0x00, 0x39, 0x05, 0x0c,
+ 0x02, 0x6a, 0x05, 0x9c, 0x00, 0x03, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35,
+ 0x02, 0x6a, 0xfd, 0xcf, 0x05, 0x9c, 0x90, 0x90, 0x00, 0x02, 0x01, 0x35,
+ 0x03, 0x10, 0x03, 0xa2, 0x05, 0x7d, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x00,
+ 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26,
+ 0x27, 0x34, 0x36, 0x17, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33,
+ 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x02, 0x6d, 0x80, 0x5b, 0x5a,
+ 0x5e, 0x5b, 0x81, 0x7c, 0x5a, 0x5b, 0x02, 0xb7, 0x81, 0x59, 0x3c, 0x2e,
+ 0x44, 0x36, 0x44, 0x5f, 0x3a, 0x2c, 0x45, 0x35, 0x05, 0x7d, 0x5b, 0x5b,
+ 0x7f, 0x84, 0x5b, 0x59, 0x5a, 0x60, 0x7e, 0x80, 0xb5, 0x75, 0x45, 0x36,
+ 0x45, 0x59, 0x3c, 0x2e, 0x47, 0x35, 0x47, 0x5a, 0x39, 0x2d, 0x00, 0x02,
+ 0x00, 0x66, 0xff, 0xe9, 0x04, 0x46, 0x04, 0xfc, 0x00, 0x0b, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11,
+ 0x33, 0x11, 0x01, 0x15, 0x21, 0x35, 0x04, 0x46, 0xfe, 0x58, 0x90, 0xfe,
+ 0x58, 0x01, 0xa8, 0x90, 0x01, 0xa8, 0xfc, 0x20, 0x03, 0x54, 0x8f, 0xfe,
+ 0x58, 0x01, 0xa8, 0x8f, 0x01, 0xa8, 0xfe, 0x58, 0xfd, 0x25, 0x90, 0x90,
+ 0x00, 0x01, 0x00, 0x27, 0x02, 0x46, 0x02, 0x9c, 0x05, 0xac, 0x00, 0x25,
+ 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33,
+ 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06,
+ 0x07, 0x21, 0x15, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x36,
+ 0x35, 0x34, 0x27, 0x26, 0x01, 0x6d, 0x8b, 0x1e, 0x07, 0x03, 0x7f, 0x08,
+ 0xc6, 0x2e, 0x3a, 0x96, 0x55, 0x40, 0xaa, 0x0d, 0x0e, 0x81, 0x59, 0x21,
+ 0x10, 0x0b, 0x01, 0xd5, 0xfd, 0x91, 0x08, 0x35, 0x34, 0x8f, 0x02, 0x02,
+ 0x77, 0x79, 0x43, 0x2f, 0x05, 0x3f, 0x85, 0x1c, 0x29, 0xfe, 0x2e, 0x0b,
+ 0x5b, 0x44, 0x63, 0x9b, 0x5f, 0x07, 0x07, 0x42, 0x2f, 0x36, 0x1a, 0x25,
+ 0x76, 0x96, 0x4e, 0x4c, 0x4d, 0x01, 0x01, 0x3f, 0x41, 0x61, 0x4e, 0x2d,
+ 0x1e, 0x00, 0x00, 0x01, 0x00, 0x21, 0x02, 0x29, 0x02, 0x93, 0x05, 0xac,
+ 0x00, 0x30, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x23, 0x12, 0x37,
+ 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x07,
+ 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x33, 0x16, 0x17, 0x16, 0x33, 0x32,
+ 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x35, 0x32, 0x37,
+ 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0x5a, 0x7e, 0x1d, 0x0b, 0x81, 0x06,
+ 0xf4, 0x16, 0x17, 0xa7, 0x4a, 0x2c, 0x75, 0x91, 0x6d, 0x53, 0x7d, 0xc8,
+ 0x49, 0x24, 0x7f, 0x07, 0x61, 0x22, 0x30, 0x7d, 0x2a, 0x11, 0x3f, 0x18,
+ 0x1f, 0x1f, 0x69, 0x99, 0x2b, 0x1e, 0x4d, 0x22, 0x05, 0x3f, 0x5d, 0x23,
+ 0x36, 0x01, 0x0b, 0x16, 0x02, 0x65, 0x3c, 0x55, 0x78, 0x36, 0x31, 0x9c,
+ 0x8d, 0x4b, 0x3a, 0x87, 0x41, 0x5b, 0x8b, 0x20, 0x0b, 0x56, 0x22, 0x2d,
+ 0x51, 0x29, 0x10, 0x06, 0x04, 0x68, 0x26, 0x1b, 0x3c, 0x5a, 0x22, 0x0f,
+ 0x00, 0x01, 0x00, 0xbc, 0x04, 0xbc, 0x02, 0x68, 0x05, 0xec, 0x00, 0x03,
+ 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x01, 0x81, 0xe7, 0xfe, 0xcf, 0x7b,
+ 0x05, 0xec, 0xfe, 0xd0, 0x00, 0x01, 0x00, 0x85, 0xfe, 0x3d, 0x04, 0x5a,
+ 0x04, 0x31, 0x00, 0x20, 0x00, 0x00, 0x25, 0x15, 0x06, 0x23, 0x22, 0x27,
+ 0x26, 0x27, 0x06, 0x23, 0x22, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x14,
+ 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17,
+ 0x16, 0x33, 0x32, 0x04, 0x5a, 0x44, 0x31, 0x8f, 0x1a, 0x06, 0x01, 0x78,
+ 0xd6, 0x6f, 0x49, 0xaa, 0xaa, 0x5a, 0x36, 0x4b, 0x93, 0x50, 0x42, 0xaa,
+ 0x4f, 0x06, 0x07, 0x11, 0x64, 0x81, 0x12, 0x74, 0x18, 0x1e, 0xaa, 0x35,
+ 0xfe, 0x37, 0x05, 0xf4, 0xfd, 0x08, 0x79, 0x39, 0x21, 0x76, 0x61, 0x94,
+ 0x02, 0x60, 0xfc, 0x83, 0x4d, 0x06, 0x01, 0x00, 0x00, 0x01, 0x00, 0x62,
+ 0xfe, 0x96, 0x04, 0x2d, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x01, 0x26,
+ 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x21, 0x15, 0x23,
+ 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x02, 0x0a, 0xd1, 0x75, 0x62, 0x75,
+ 0x6f, 0xa8, 0x1f, 0x20, 0x02, 0x00, 0x75, 0x83, 0xa8, 0x83, 0x02, 0x12,
+ 0x0b, 0x98, 0x7f, 0xb5, 0xc1, 0x8b, 0x84, 0x18, 0x04, 0x83, 0xf9, 0x44,
+ 0x06, 0xbc, 0xf9, 0x44, 0x00, 0x01, 0x00, 0xb2, 0x02, 0x6a, 0x01, 0xb0,
+ 0x03, 0x6a, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0xb0,
+ 0xfe, 0x03, 0x6a, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50,
+ 0xfe, 0x4a, 0x02, 0x4c, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x17,
+ 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07,
+ 0x27, 0x37, 0x33, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07,
+ 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x7b, 0x6e, 0x2e, 0x2d, 0x43, 0x1e,
+ 0x0d, 0x3c, 0x0f, 0x13, 0x1f, 0x21, 0x18, 0x56, 0x4e, 0x2f, 0x1a, 0x1f,
+ 0x7a, 0x1f, 0x09, 0x67, 0x3d, 0x58, 0x50, 0x58, 0x22, 0x36, 0xfe, 0xe1,
+ 0x32, 0x11, 0x2e, 0x15, 0x19, 0x3a, 0x0e, 0x04, 0x11, 0x0f, 0xbc, 0x73,
+ 0x04, 0x54, 0x18, 0x1d, 0x6f, 0x31, 0x1e, 0x21, 0x0d, 0x17, 0x00, 0x01,
+ 0x00, 0x7d, 0x02, 0x46, 0x01, 0xc7, 0x05, 0xac, 0x00, 0x0b, 0x00, 0x00,
+ 0x01, 0x23, 0x35, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x33, 0x11, 0x23,
+ 0x01, 0x48, 0xcb, 0x1f, 0x6c, 0x4a, 0x18, 0x03, 0x02, 0x58, 0x7f, 0x04,
+ 0xa4, 0x5e, 0x02, 0x0a, 0x38, 0x56, 0x07, 0x09, 0xfc, 0x9a, 0x00, 0x03,
+ 0x00, 0x52, 0x02, 0x6d, 0x02, 0x98, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x13,
+ 0x00, 0x23, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x01, 0x32, 0x17, 0x16,
+ 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36,
+ 0x17, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36,
+ 0x35, 0x34, 0x27, 0x26, 0x02, 0x83, 0xfd, 0xe5, 0x01, 0x0d, 0xbb, 0x45,
+ 0x23, 0x79, 0x46, 0x64, 0xb1, 0x49, 0x29, 0x82, 0x43, 0x5e, 0x68, 0x2c,
+ 0x18, 0x56, 0x25, 0x31, 0x65, 0x2d, 0x1a, 0x5b, 0x23, 0x02, 0xd5, 0x68,
+ 0x68, 0x03, 0x1b, 0xa1, 0x51, 0x73, 0xcf, 0x58, 0x33, 0x92, 0x54, 0x7a,
+ 0xde, 0x55, 0x2c, 0x6b, 0x68, 0x3a, 0x52, 0xa2, 0x3a, 0x19, 0x64, 0x3a,
+ 0x53, 0xaa, 0x38, 0x16, 0x00, 0x02, 0x00, 0xc9, 0x00, 0xd9, 0x03, 0x9c,
+ 0x03, 0x81, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x15, 0x05, 0x35,
+ 0x37, 0x27, 0x35, 0x05, 0x15, 0x05, 0x35, 0x37, 0x27, 0x35, 0x02, 0x04,
+ 0xfe, 0xc5, 0xdd, 0xdd, 0x02, 0xd3, 0xfe, 0xc4, 0xdd, 0xdd, 0x02, 0x89,
+ 0xb6, 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xf8, 0xb6, 0xfa, 0xaa, 0xaa, 0xaa,
+ 0xaa, 0x00, 0x00, 0x04, 0x00, 0x7d, 0xff, 0xd7, 0x06, 0xcb, 0x05, 0xac,
+ 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x23,
+ 0x35, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x33, 0x11, 0x23, 0x01, 0x33,
+ 0x01, 0x23, 0x25, 0x21, 0x35, 0x01, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15,
+ 0x23, 0x19, 0x01, 0x01, 0x01, 0x48, 0xcb, 0x1f, 0x6c, 0x4a, 0x18, 0x03,
+ 0x02, 0x58, 0x7f, 0x03, 0xdd, 0x77, 0xfc, 0x62, 0x77, 0x04, 0x3c, 0xfe,
+ 0x7f, 0x01, 0xa1, 0x5f, 0x89, 0x89, 0x7f, 0xfe, 0xf7, 0x04, 0xa4, 0x5e,
+ 0x02, 0x0a, 0x38, 0x56, 0x07, 0x09, 0xfc, 0x9a, 0x03, 0x66, 0xfa, 0x2b,
+ 0xf6, 0x79, 0x02, 0x20, 0xfd, 0xd3, 0x6c, 0xcd, 0x01, 0x39, 0x01, 0x5d,
+ 0xfe, 0xa3, 0x00, 0x03, 0x00, 0x7d, 0xff, 0xd7, 0x06, 0xc1, 0x05, 0xac,
+ 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x35, 0x00, 0x00, 0x01, 0x23, 0x35, 0x37,
+ 0x3e, 0x01, 0x37, 0x36, 0x37, 0x33, 0x11, 0x23, 0x01, 0x33, 0x01, 0x23,
+ 0x01, 0x22, 0x07, 0x06, 0x07, 0x23, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17,
+ 0x16, 0x15, 0x14, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x07, 0x21,
+ 0x15, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x36, 0x35, 0x34,
+ 0x27, 0x26, 0x01, 0x48, 0xcb, 0x1f, 0x6c, 0x4a, 0x18, 0x03, 0x02, 0x58,
+ 0x7f, 0x03, 0xac, 0x76, 0xfc, 0x63, 0x77, 0x04, 0x3b, 0x8f, 0x1c, 0x05,
+ 0x02, 0x7f, 0x07, 0xd3, 0x2a, 0x32, 0x96, 0x55, 0x40, 0xaa, 0x0d, 0x0e,
+ 0x81, 0x59, 0x21, 0x10, 0x0c, 0x01, 0xd5, 0xfd, 0x92, 0x08, 0x35, 0x34,
+ 0x8d, 0x03, 0x03, 0x77, 0x78, 0x43, 0x2e, 0x04, 0xa4, 0x5e, 0x02, 0x0a,
+ 0x38, 0x56, 0x07, 0x09, 0xfc, 0x9a, 0x03, 0x66, 0xfa, 0x2b, 0x03, 0x23,
+ 0x8e, 0x1a, 0x23, 0x01, 0x06, 0x29, 0x08, 0x5b, 0x44, 0x63, 0x9a, 0x60,
+ 0x07, 0x07, 0x41, 0x2f, 0x36, 0x1a, 0x25, 0x77, 0x97, 0x4d, 0x4d, 0x4b,
+ 0x01, 0x02, 0x3f, 0x40, 0x62, 0x4e, 0x2d, 0x1f, 0x00, 0x04, 0x00, 0x21,
+ 0xff, 0xd7, 0x06, 0xcb, 0x05, 0xac, 0x00, 0x30, 0x00, 0x34, 0x00, 0x3f,
+ 0x00, 0x42, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x23, 0x12, 0x37,
+ 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x07,
+ 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x33, 0x16, 0x17, 0x16, 0x33, 0x32,
+ 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x35, 0x32, 0x37,
+ 0x36, 0x35, 0x34, 0x27, 0x26, 0x25, 0x33, 0x01, 0x23, 0x25, 0x21, 0x35,
+ 0x01, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x19, 0x01, 0x01, 0x01,
+ 0x5a, 0x7e, 0x1d, 0x0b, 0x81, 0x06, 0xf4, 0x16, 0x17, 0xa7, 0x4a, 0x2c,
+ 0x75, 0x91, 0x6d, 0x53, 0x7d, 0xc8, 0x49, 0x24, 0x7f, 0x07, 0x61, 0x22,
+ 0x30, 0x7d, 0x2a, 0x11, 0x3f, 0x18, 0x1f, 0x1f, 0x69, 0x99, 0x2b, 0x1e,
+ 0x4d, 0x22, 0x03, 0xb2, 0x77, 0xfc, 0x62, 0x76, 0x04, 0x27, 0xfe, 0x7f,
+ 0x01, 0xa1, 0x5f, 0x89, 0x89, 0x7f, 0xfe, 0xf7, 0x05, 0x3f, 0x5d, 0x23,
+ 0x36, 0x01, 0x0b, 0x16, 0x02, 0x65, 0x3c, 0x55, 0x78, 0x36, 0x31, 0x9c,
+ 0x8d, 0x4b, 0x3a, 0x87, 0x41, 0x5b, 0x8b, 0x20, 0x0b, 0x56, 0x22, 0x2d,
+ 0x51, 0x29, 0x10, 0x06, 0x04, 0x68, 0x26, 0x1b, 0x3c, 0x5a, 0x22, 0x0f,
+ 0x6d, 0xfa, 0x2b, 0xf6, 0x79, 0x02, 0x20, 0xfd, 0xd3, 0x6c, 0xcd, 0x01,
+ 0x39, 0x01, 0x5d, 0xfe, 0xa3, 0x00, 0xff, 0xff, 0x00, 0xc5, 0xfe, 0x43,
+ 0x04, 0x39, 0x04, 0x31, 0x10, 0x0f, 0x00, 0x23, 0x04, 0xd7, 0x04, 0x31,
+ 0xc0, 0x00, 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, 0x05, 0x39, 0x05, 0xd5,
+ 0x10, 0x27, 0x00, 0xc6, 0x01, 0x58, 0x01, 0x98, 0x10, 0x06, 0x00, 0x25,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, 0x05, 0x39, 0x05, 0xd5,
+ 0x10, 0x27, 0x00, 0xc5, 0x01, 0x75, 0x01, 0x98, 0x10, 0x06, 0x00, 0x25,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, 0x05, 0x39, 0x05, 0xd5,
+ 0x10, 0x27, 0x00, 0xc4, 0x01, 0x60, 0x01, 0x98, 0x10, 0x06, 0x00, 0x25,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, 0x05, 0x39, 0x05, 0xd5,
+ 0x10, 0x27, 0x00, 0xc8, 0x01, 0x66, 0x01, 0x81, 0x10, 0x06, 0x00, 0x25,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, 0x05, 0x39, 0x07, 0x3b,
+ 0x10, 0x27, 0x00, 0x6b, 0x01, 0x64, 0x01, 0x83, 0x10, 0x06, 0x00, 0x25,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x23, 0x00, 0x00, 0x05, 0x39, 0x05, 0xd5,
+ 0x10, 0x27, 0x00, 0xc7, 0x01, 0x58, 0x01, 0x98, 0x10, 0x06, 0x00, 0x25,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x00, 0x00, 0x07, 0x9a, 0x05, 0xd5,
+ 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x21, 0x03, 0x23, 0x01, 0x21,
+ 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x19, 0x01,
+ 0x23, 0x01, 0x03, 0xbe, 0xfd, 0xda, 0xaf, 0xd2, 0x02, 0x64, 0x04, 0xfa,
+ 0xfd, 0x08, 0x02, 0xd1, 0xfd, 0x2f, 0x03, 0x1d, 0xfc, 0x24, 0xcc, 0xfe,
+ 0xe5, 0x01, 0xb6, 0xfe, 0x4a, 0x05, 0xd5, 0xa8, 0xfe, 0x23, 0xa8, 0xfe,
+ 0x00, 0xa8, 0x02, 0x5e, 0x02, 0xcf, 0xfd, 0x31, 0x00, 0x01, 0x00, 0x62,
+ 0xfe, 0x4a, 0x05, 0x6a, 0x05, 0xee, 0x00, 0x46, 0x00, 0x00, 0x25, 0x32,
+ 0x37, 0x36, 0x37, 0x33, 0x02, 0x05, 0x06, 0x23, 0x07, 0x36, 0x33, 0x32,
+ 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37,
+ 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22,
+ 0x07, 0x27, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34,
+ 0x37, 0x12, 0x25, 0x36, 0x33, 0x20, 0x13, 0x16, 0x17, 0x23, 0x26, 0x27,
+ 0x26, 0x23, 0x22, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x03, 0x06, 0xdf,
+ 0x66, 0x3f, 0x1c, 0xc4, 0x3f, 0xfe, 0x31, 0x29, 0x2b, 0x1a, 0x1a, 0x1f,
+ 0x7a, 0x1f, 0x09, 0x65, 0x3e, 0x59, 0x53, 0x5d, 0x21, 0x2f, 0x2b, 0x68,
+ 0x32, 0x2f, 0x43, 0x1e, 0x0d, 0x3c, 0x0f, 0x13, 0x1f, 0x21, 0x16, 0x3f,
+ 0x9a, 0x4f, 0x21, 0x27, 0xb7, 0x49, 0x27, 0x65, 0x92, 0x01, 0x3a, 0x3a,
+ 0x3f, 0x01, 0xa2, 0x7c, 0x15, 0x0d, 0xc3, 0x2d, 0xa3, 0x50, 0x71, 0xe0,
+ 0x7e, 0x79, 0x91, 0x82, 0x77, 0x9d, 0x61, 0xac, 0xfd, 0xe0, 0x2c, 0x04,
+ 0x44, 0x04, 0x54, 0x18, 0x1d, 0x6d, 0x32, 0x1f, 0x24, 0x0c, 0x15, 0x52,
+ 0x30, 0x13, 0x2e, 0x15, 0x19, 0x3a, 0x0e, 0x04, 0x11, 0x0f, 0x8d, 0x16,
+ 0x28, 0x11, 0x1b, 0x84, 0xfc, 0x86, 0x98, 0xfc, 0xc5, 0x01, 0x1d, 0x2e,
+ 0x09, 0xfe, 0x9b, 0x3c, 0x47, 0xdd, 0x42, 0x21, 0xae, 0xa5, 0xfe, 0xe8,
+ 0xfe, 0xd6, 0xa6, 0x94, 0xff, 0xff, 0x00, 0xb8, 0x00, 0x00, 0x04, 0xe7,
+ 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc6, 0x01, 0x7b, 0x01, 0x98, 0x10, 0x06,
+ 0x00, 0x29, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb8, 0x00, 0x00, 0x04, 0xe7,
+ 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc5, 0x01, 0x6d, 0x01, 0x98, 0x10, 0x06,
+ 0x00, 0x29, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb8, 0x00, 0x00, 0x04, 0xe7,
+ 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc4, 0x01, 0x73, 0x01, 0x96, 0x10, 0x06,
+ 0x00, 0x29, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb8, 0x00, 0x00, 0x04, 0xe7,
+ 0x07, 0x3b, 0x10, 0x27, 0x00, 0x6b, 0x01, 0x71, 0x01, 0x83, 0x10, 0x06,
+ 0x00, 0x29, 0x00, 0x00, 0xff, 0xff, 0x00, 0xcd, 0x00, 0x00, 0x01, 0x8d,
+ 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc6, 0xff, 0xd3, 0x01, 0x98, 0x10, 0x06,
+ 0x00, 0x2d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xcd, 0x00, 0x00, 0x01, 0x8d,
+ 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc5, 0xff, 0xd5, 0x01, 0x98, 0x10, 0x06,
+ 0x00, 0x2d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xcd, 0x00, 0x00, 0x01, 0x8d,
+ 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc4, 0xff, 0xd5, 0x01, 0x98, 0x10, 0x06,
+ 0x00, 0x2d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x02, 0x3d,
+ 0x07, 0x3b, 0x10, 0x27, 0x00, 0x6b, 0xff, 0xdf, 0x01, 0x83, 0x10, 0x06,
+ 0x00, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x00, 0x05, 0x56,
+ 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x23, 0x35, 0x33,
+ 0x11, 0x21, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x29, 0x01, 0x13,
+ 0x11, 0x21, 0x20, 0x13, 0x36, 0x35, 0x10, 0x27, 0x26, 0x23, 0x21, 0x11,
+ 0x21, 0x15, 0xb6, 0x8d, 0x8d, 0x02, 0x42, 0x01, 0x19, 0xa2, 0xa3, 0xb0,
+ 0xa1, 0xfe, 0xf3, 0xfd, 0xbe, 0xbf, 0x01, 0x62, 0x01, 0x37, 0x61, 0x29,
+ 0xf2, 0x58, 0x77, 0xfe, 0x9e, 0x01, 0x5e, 0x02, 0xb6, 0x89, 0x02, 0x96,
+ 0xc6, 0xc7, 0xfe, 0xa4, 0xfe, 0x93, 0xc9, 0xb6, 0x02, 0xb6, 0xfd, 0xf2,
+ 0x01, 0x20, 0x7a, 0xaa, 0x01, 0xa0, 0x76, 0x2b, 0xfe, 0x12, 0x89, 0x00,
+ 0xff, 0xff, 0x00, 0x9c, 0x00, 0x00, 0x05, 0x2b, 0x05, 0xd5, 0x10, 0x27,
+ 0x00, 0xc8, 0x01, 0x98, 0x01, 0x81, 0x10, 0x06, 0x00, 0x32, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x4e, 0xff, 0xd1, 0x05, 0xf0, 0x05, 0xee, 0x10, 0x27,
+ 0x00, 0xc6, 0x01, 0xcb, 0x01, 0x98, 0x10, 0x06, 0x00, 0x33, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x4e, 0xff, 0xd1, 0x05, 0xf0, 0x05, 0xee, 0x10, 0x27,
+ 0x00, 0xc5, 0x01, 0xd5, 0x01, 0x98, 0x10, 0x06, 0x00, 0x33, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x4e, 0xff, 0xd1, 0x05, 0xf0, 0x05, 0xee, 0x10, 0x27,
+ 0x00, 0xc4, 0x01, 0xd1, 0x01, 0x98, 0x10, 0x06, 0x00, 0x33, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x4e, 0xff, 0xd1, 0x05, 0xf0, 0x05, 0xee, 0x10, 0x27,
+ 0x00, 0xc8, 0x01, 0xd1, 0x01, 0x81, 0x10, 0x06, 0x00, 0x33, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x4e, 0xff, 0xd1, 0x05, 0xf0, 0x07, 0x3b, 0x10, 0x27,
+ 0x00, 0x6b, 0x01, 0xcf, 0x01, 0x83, 0x10, 0x06, 0x00, 0x33, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0xc3, 0x00, 0x46, 0x03, 0xe7, 0x03, 0x6a, 0x00, 0x0b,
+ 0x00, 0x00, 0x01, 0x17, 0x09, 0x01, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01,
+ 0x37, 0x01, 0x03, 0x81, 0x64, 0xfe, 0xd5, 0x01, 0x2d, 0x66, 0xfe, 0xd3,
+ 0xfe, 0xd5, 0x66, 0x01, 0x2d, 0xfe, 0xd5, 0x64, 0x01, 0x2b, 0x03, 0x6a,
+ 0x66, 0xfe, 0xd5, 0xfe, 0xd3, 0x66, 0x01, 0x2d, 0xfe, 0xd5, 0x64, 0x01,
+ 0x2d, 0x01, 0x2b, 0x64, 0xfe, 0xd7, 0x00, 0x03, 0x00, 0x3d, 0xff, 0xd1,
+ 0x05, 0xf4, 0x06, 0x0a, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x31, 0x00, 0x00,
+ 0x3f, 0x01, 0x26, 0x11, 0x10, 0x37, 0x36, 0x25, 0x36, 0x33, 0x20, 0x17,
+ 0x37, 0x17, 0x07, 0x16, 0x13, 0x16, 0x15, 0x10, 0x07, 0x06, 0x05, 0x06,
+ 0x23, 0x20, 0x27, 0x07, 0x13, 0x01, 0x26, 0x23, 0x22, 0x07, 0x06, 0x03,
+ 0x06, 0x15, 0x14, 0x09, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x36,
+ 0x35, 0x34, 0x3d, 0xa6, 0x9b, 0xa8, 0x9e, 0x01, 0x05, 0x41, 0x45, 0x01,
+ 0x17, 0xc0, 0xb2, 0x52, 0xb7, 0x92, 0x16, 0x04, 0xa8, 0x9e, 0xfe, 0xfb,
+ 0x40, 0x45, 0xfe, 0xd9, 0xc7, 0x9e, 0xd7, 0x03, 0x13, 0x97, 0xc7, 0xe4,
+ 0x90, 0x94, 0x0a, 0x01, 0x03, 0xb8, 0xfc, 0xe8, 0x97, 0xdc, 0xe2, 0x91,
+ 0x93, 0x0b, 0x01, 0x27, 0xb6, 0xdb, 0x01, 0x29, 0x01, 0x3e, 0xd2, 0xc7,
+ 0x2b, 0x0b, 0xa6, 0xc2, 0x49, 0xc7, 0xb7, 0xfe, 0xf1, 0x2b, 0x2c, 0xfe,
+ 0xc2, 0xd2, 0xc6, 0x2b, 0x0b, 0xb8, 0xac, 0x01, 0x8b, 0x03, 0x5b, 0x83,
+ 0x9b, 0x9e, 0xfe, 0xf8, 0x12, 0x12, 0xd4, 0x02, 0x62, 0xfc, 0xa1, 0x97,
+ 0x9a, 0x9e, 0x01, 0x06, 0x13, 0x13, 0xea, 0x00, 0xff, 0xff, 0x00, 0xae,
+ 0xff, 0xd1, 0x05, 0x29, 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc6, 0x01, 0x98,
+ 0x01, 0x98, 0x10, 0x06, 0x00, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae,
+ 0xff, 0xd1, 0x05, 0x29, 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc5, 0x01, 0x98,
+ 0x01, 0x98, 0x10, 0x06, 0x00, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae,
+ 0xff, 0xd1, 0x05, 0x29, 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc4, 0x01, 0x9e,
+ 0x01, 0x96, 0x10, 0x06, 0x00, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae,
+ 0xff, 0xd1, 0x05, 0x29, 0x07, 0x3b, 0x10, 0x27, 0x00, 0x6b, 0x01, 0x9e,
+ 0x01, 0x83, 0x10, 0x06, 0x00, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b,
+ 0x00, 0x00, 0x05, 0x4a, 0x05, 0xd5, 0x10, 0x27, 0x00, 0xc5, 0x01, 0x6a,
+ 0x01, 0x98, 0x10, 0x06, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xba,
+ 0x00, 0x00, 0x04, 0xee, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x00,
+ 0x01, 0x11, 0x23, 0x11, 0x33, 0x15, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14,
+ 0x07, 0x06, 0x23, 0x25, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26,
+ 0x23, 0x21, 0x01, 0x79, 0xbf, 0xbf, 0x01, 0xaa, 0xf0, 0x7b, 0x60, 0x77,
+ 0x74, 0xb5, 0xfe, 0x2b, 0x01, 0x8d, 0xae, 0x47, 0x26, 0x77, 0x43, 0x61,
+ 0xfe, 0x73, 0x01, 0x83, 0xfe, 0x7d, 0x05, 0xd5, 0xf6, 0x90, 0x71, 0xb1,
+ 0xbd, 0x78, 0x75, 0xa8, 0x72, 0x3e, 0x56, 0x9e, 0x43, 0x25, 0x00, 0x01,
+ 0x00, 0x89, 0xff, 0xe1, 0x04, 0x91, 0x05, 0xd3, 0x00, 0x31, 0x00, 0x00,
+ 0x01, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06,
+ 0x15, 0x11, 0x23, 0x11, 0x34, 0x37, 0x36, 0x33, 0x20, 0x17, 0x16, 0x15,
+ 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x10, 0x07, 0x06, 0x23,
+ 0x22, 0x27, 0x35, 0x16, 0x33, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26,
+ 0x2b, 0x01, 0x02, 0x5a, 0x01, 0x0e, 0x29, 0x07, 0x71, 0x4e, 0x79, 0xd1,
+ 0x39, 0x19, 0xb4, 0x8b, 0x7d, 0xd1, 0x01, 0x00, 0x85, 0x65, 0x97, 0x03,
+ 0x0e, 0x71, 0x46, 0x36, 0xdf, 0x79, 0xac, 0x31, 0x3b, 0x2d, 0x2d, 0x01,
+ 0x23, 0x30, 0x09, 0xec, 0x32, 0x3e, 0x21, 0x03, 0x6a, 0xac, 0x1c, 0x20,
+ 0x7e, 0x3d, 0x2a, 0x87, 0x3c, 0x60, 0xfb, 0xec, 0x04, 0x42, 0xc2, 0x6d,
+ 0x62, 0x7e, 0x60, 0x93, 0xbe, 0x66, 0x02, 0x09, 0x1f, 0x7a, 0x5e, 0x5d,
+ 0xfe, 0xbf, 0x7b, 0x42, 0x0f, 0x99, 0x06, 0xda, 0x29, 0x30, 0xef, 0x27,
+ 0x09, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xd1, 0x04, 0x48, 0x04, 0x50,
+ 0x10, 0x27, 0x00, 0xc6, 0x00, 0xec, 0x00, 0x00, 0x10, 0x06, 0x00, 0x45,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xd1, 0x04, 0x48, 0x04, 0x50,
+ 0x10, 0x27, 0x00, 0xc5, 0x00, 0xec, 0xff, 0xfe, 0x10, 0x06, 0x00, 0x45,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xd1, 0x04, 0x48, 0x04, 0x50,
+ 0x10, 0x27, 0x00, 0xc4, 0x00, 0xe5, 0x00, 0x00, 0x10, 0x06, 0x00, 0x45,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xd1, 0x04, 0x48, 0x04, 0x50,
+ 0x10, 0x27, 0x00, 0xc8, 0x00, 0xe7, 0xff, 0xe3, 0x10, 0x06, 0x00, 0x45,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xd1, 0x04, 0x48, 0x05, 0x9d,
+ 0x10, 0x27, 0x00, 0x6b, 0x00, 0xe5, 0xff, 0xe5, 0x10, 0x06, 0x00, 0x45,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0xff, 0xd1, 0x04, 0x48, 0x04, 0x50,
+ 0x10, 0x27, 0x00, 0xc7, 0x00, 0xdd, 0x00, 0x00, 0x10, 0x06, 0x00, 0x45,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x46, 0xff, 0xd1, 0x06, 0xc3, 0x04, 0x50,
+ 0x00, 0x3c, 0x00, 0x4d, 0x00, 0x56, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16,
+ 0x33, 0x32, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x2f,
+ 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36,
+ 0x25, 0x36, 0x33, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x26, 0x23,
+ 0x22, 0x07, 0x06, 0x07, 0x23, 0x12, 0x25, 0x36, 0x33, 0x20, 0x17, 0x36,
+ 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x01, 0x32, 0x37,
+ 0x36, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14,
+ 0x17, 0x16, 0x01, 0x21, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x03,
+ 0xac, 0x05, 0xa7, 0x41, 0x4e, 0xd1, 0x4a, 0xac, 0x26, 0x9f, 0x6e, 0x96,
+ 0xb7, 0x77, 0x24, 0x1a, 0x21, 0xa2, 0x97, 0x3d, 0x44, 0xb3, 0x5e, 0x47,
+ 0x98, 0x70, 0x01, 0x02, 0x05, 0x05, 0x7e, 0x20, 0x14, 0xa4, 0x23, 0x2a,
+ 0xb7, 0x31, 0x0d, 0x05, 0xac, 0x0a, 0x01, 0x20, 0x3a, 0x46, 0x01, 0x07,
+ 0x5f, 0x51, 0x96, 0x3c, 0x3f, 0xc0, 0x83, 0x48, 0x26, 0x2b, 0xfb, 0x02,
+ 0x9e, 0x6a, 0x36, 0x08, 0x01, 0x43, 0x9f, 0x94, 0x37, 0x67, 0x5b, 0x30,
+ 0x02, 0x2d, 0x02, 0x5a, 0x63, 0x4f, 0x75, 0x93, 0x56, 0x41, 0x01, 0xdf,
+ 0xfe, 0x52, 0x20, 0xd7, 0xcf, 0x62, 0x44, 0x65, 0x1f, 0x26, 0x37, 0xa8,
+ 0x29, 0x10, 0x6e, 0x53, 0x7c, 0xbc, 0x50, 0x3b, 0x17, 0x01, 0x0b, 0x27,
+ 0x18, 0x2e, 0x2d, 0x82, 0x19, 0x05, 0x73, 0x20, 0x2b, 0x01, 0x1e, 0x34,
+ 0x0a, 0xa8, 0x72, 0x27, 0x0f, 0x79, 0x44, 0x5e, 0x73, 0xe3, 0xfe, 0x87,
+ 0x6f, 0x38, 0x2d, 0x05, 0x03, 0xce, 0x1d, 0x17, 0x16, 0x18, 0x2e, 0x6e,
+ 0x69, 0x2c, 0x17, 0x02, 0x04, 0xa2, 0x5c, 0x4a, 0x72, 0x55, 0x00, 0x01,
+ 0x00, 0x3f, 0xfe, 0x4a, 0x03, 0xd1, 0x04, 0x50, 0x00, 0x3e, 0x00, 0x00,
+ 0x05, 0x24, 0x03, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16,
+ 0x17, 0x23, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17,
+ 0x16, 0x33, 0x32, 0x13, 0x33, 0x06, 0x07, 0x06, 0x23, 0x07, 0x36, 0x33,
+ 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27,
+ 0x37, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23,
+ 0x22, 0x07, 0x27, 0x01, 0xcd, 0xfe, 0xf2, 0x59, 0x27, 0x8b, 0x82, 0xd1,
+ 0xf3, 0x6d, 0x3d, 0x0b, 0xac, 0x18, 0x83, 0x2c, 0x37, 0xa5, 0x4e, 0x36,
+ 0x7a, 0x49, 0x6a, 0xda, 0x2c, 0xac, 0x0c, 0x8b, 0x72, 0xab, 0x1b, 0x1d,
+ 0x1c, 0x77, 0x21, 0x0a, 0x67, 0x3d, 0x58, 0x4f, 0x53, 0x24, 0x3a, 0x2b,
+ 0x69, 0x31, 0x2f, 0x42, 0x1f, 0x0e, 0x3d, 0x0f, 0x13, 0x20, 0x1f, 0x19,
+ 0x2b, 0x32, 0x01, 0x05, 0x70, 0x8a, 0x01, 0x14, 0xa1, 0x95, 0xa5, 0x5c,
+ 0x86, 0xa9, 0x30, 0x10, 0x9b, 0x6c, 0xa7, 0xf0, 0x69, 0x3e, 0x01, 0x04,
+ 0xd3, 0x71, 0x5c, 0x44, 0x04, 0x51, 0x19, 0x1f, 0x6f, 0x31, 0x1e, 0x1e,
+ 0x0c, 0x19, 0x54, 0x30, 0x13, 0x2e, 0x15, 0x19, 0x3a, 0x0e, 0x04, 0x11,
+ 0x0f, 0x00, 0xff, 0xff, 0x00, 0x52, 0xff, 0xd1, 0x04, 0x1b, 0x04, 0x50,
+ 0x10, 0x27, 0x00, 0xc6, 0x00, 0xf2, 0x00, 0x00, 0x10, 0x06, 0x00, 0x49,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0xff, 0xd1, 0x04, 0x1b, 0x04, 0x50,
+ 0x10, 0x27, 0x00, 0xc5, 0x00, 0xf6, 0xff, 0xfe, 0x10, 0x06, 0x00, 0x49,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0xff, 0xd1, 0x04, 0x1b, 0x04, 0x50,
+ 0x10, 0x27, 0x00, 0xc4, 0x00, 0xfc, 0x00, 0x02, 0x10, 0x06, 0x00, 0x49,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0xff, 0xd1, 0x04, 0x1b, 0x05, 0x9d,
+ 0x10, 0x27, 0x00, 0x6b, 0x00, 0xf0, 0xff, 0xe5, 0x10, 0x06, 0x00, 0x49,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x26, 0x00, 0xc6, 0xcb, 0xfc, 0x10, 0x06, 0x00, 0xc3, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x26,
+ 0x00, 0xc5, 0xc9, 0xfe, 0x10, 0x06, 0x00, 0xc3, 0x00, 0x00, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x26, 0x00, 0xc4,
+ 0xc9, 0x00, 0x10, 0x06, 0x00, 0xc3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06,
+ 0x04, 0xca, 0x02, 0x27, 0x05, 0x9d, 0x10, 0x26, 0x00, 0x6b, 0xc9, 0xe5,
+ 0x10, 0x06, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4a, 0xff, 0xd1,
+ 0x04, 0x14, 0x05, 0xf2, 0x00, 0x24, 0x00, 0x34, 0x00, 0x00, 0x13, 0x10,
+ 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x27, 0x26, 0x27, 0x07, 0x27, 0x37,
+ 0x26, 0x27, 0x26, 0x27, 0x37, 0x16, 0x17, 0x16, 0x17, 0x37, 0x17, 0x07,
+ 0x16, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x20, 0x27, 0x26, 0x01,
+ 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35,
+ 0x34, 0x27, 0x26, 0x4a, 0xc7, 0x6d, 0x8a, 0x33, 0x4e, 0x48, 0x64, 0x0b,
+ 0x11, 0xc7, 0x4a, 0xae, 0x38, 0x64, 0x05, 0x07, 0x5a, 0x45, 0x5f, 0x19,
+ 0x27, 0xc6, 0x52, 0xb8, 0x99, 0x57, 0xd0, 0xb7, 0x77, 0xb7, 0xfe, 0xf3,
+ 0x7d, 0x5b, 0x01, 0xe5, 0x9f, 0x53, 0x41, 0x75, 0x4c, 0x72, 0x9d, 0x53,
+ 0x43, 0x7e, 0x4a, 0x02, 0x10, 0x01, 0x5d, 0x90, 0x4f, 0x1b, 0x4a, 0x54,
+ 0x09, 0x0f, 0x5c, 0x50, 0x52, 0x2b, 0x39, 0x03, 0x04, 0x5a, 0x1d, 0x3b,
+ 0x10, 0x19, 0x5c, 0x4c, 0x54, 0x75, 0x6a, 0xfb, 0xfe, 0xbf, 0xfe, 0xb1,
+ 0x92, 0x60, 0xc7, 0x91, 0x02, 0x89, 0x8a, 0x6d, 0xab, 0xea, 0x6e, 0x49,
+ 0x86, 0x6c, 0xa9, 0xfd, 0x6c, 0x3f, 0xff, 0xff, 0x00, 0x8f, 0x00, 0x00,
+ 0x03, 0xe5, 0x04, 0x50, 0x10, 0x27, 0x00, 0xc8, 0x00, 0xee, 0xff, 0xe3,
+ 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4a, 0xff, 0xd1,
+ 0x04, 0x14, 0x04, 0x50, 0x10, 0x27, 0x00, 0xc6, 0x00, 0xdf, 0x00, 0x02,
+ 0x10, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4a, 0xff, 0xd1,
+ 0x04, 0x14, 0x04, 0x50, 0x10, 0x27, 0x00, 0xc5, 0x00, 0xe1, 0x00, 0x00,
+ 0x10, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4a, 0xff, 0xd1,
+ 0x04, 0x14, 0x04, 0x50, 0x10, 0x27, 0x00, 0xc4, 0x00, 0xe1, 0x00, 0x02,
+ 0x10, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4a, 0xff, 0xd1,
+ 0x04, 0x14, 0x04, 0x50, 0x10, 0x27, 0x00, 0xc8, 0x00, 0xe1, 0xff, 0xe3,
+ 0x10, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4a, 0xff, 0xd1,
+ 0x04, 0x14, 0x05, 0x9d, 0x10, 0x27, 0x00, 0x6b, 0x00, 0xdf, 0xff, 0xe5,
+ 0x10, 0x06, 0x00, 0x53, 0x00, 0x00, 0x00, 0x03, 0x00, 0x66, 0x00, 0x00,
+ 0x04, 0x46, 0x03, 0xc7, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00,
+ 0x01, 0x15, 0x21, 0x35, 0x01, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x35,
+ 0x04, 0x46, 0xfc, 0x20, 0x02, 0x5b, 0xd5, 0xd5, 0xd5, 0x02, 0x2b, 0x8f,
+ 0x8f, 0xfe, 0xaa, 0xd5, 0xd5, 0x02, 0xf2, 0xd5, 0xd5, 0x00, 0x00, 0x03,
+ 0x00, 0x25, 0xff, 0xc3, 0x04, 0x3b, 0x04, 0x50, 0x00, 0x17, 0x00, 0x20,
+ 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x16, 0x15, 0x10, 0x07, 0x06, 0x23,
+ 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x32,
+ 0x17, 0x16, 0x17, 0x37, 0x03, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35,
+ 0x34, 0x09, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14,
+ 0x04, 0x3b, 0x81, 0x5a, 0xa1, 0x7c, 0xc6, 0xd2, 0x7c, 0x7d, 0x41, 0x87,
+ 0x62, 0xa1, 0x7d, 0xc7, 0xc6, 0x81, 0x07, 0x06, 0x77, 0xbd, 0xfe, 0x19,
+ 0x58, 0x81, 0xa3, 0x52, 0x3e, 0xfd, 0xc5, 0x01, 0xe9, 0x49, 0x79, 0x0f,
+ 0x10, 0x9f, 0x53, 0x41, 0x04, 0x17, 0x92, 0x94, 0xe1, 0xfe, 0xce, 0x98,
+ 0x75, 0x7f, 0x8d, 0x39, 0x97, 0x92, 0xeb, 0x01, 0x31, 0x98, 0x77, 0x78,
+ 0x07, 0x06, 0x85, 0xfe, 0xa8, 0xfd, 0xd9, 0x62, 0x8e, 0x6b, 0xa8, 0x89,
+ 0xfe, 0x88, 0x02, 0x27, 0x5c, 0x0c, 0x02, 0x8a, 0x6d, 0xab, 0x8c, 0x00,
+ 0xff, 0xff, 0x00, 0x85, 0xff, 0xd1, 0x03, 0xdb, 0x04, 0x31, 0x10, 0x27,
+ 0x00, 0xc6, 0x00, 0xdd, 0xff, 0xfe, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x85, 0xff, 0xd1, 0x03, 0xdb, 0x04, 0x31, 0x10, 0x27,
+ 0x00, 0xc5, 0x00, 0xdd, 0x00, 0x00, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x85, 0xff, 0xd1, 0x03, 0xdb, 0x04, 0x31, 0x10, 0x27,
+ 0x00, 0xc4, 0x00, 0xe3, 0x00, 0x02, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x85, 0xff, 0xd1, 0x03, 0xdb, 0x05, 0x9d, 0x10, 0x27,
+ 0x00, 0x6b, 0x00, 0xe1, 0xff, 0xe5, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x29, 0xfe, 0x42, 0x03, 0xd3, 0x04, 0x31, 0x10, 0x27,
+ 0x00, 0xc5, 0x00, 0xa6, 0xff, 0xfe, 0x10, 0x06, 0x00, 0x5d, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x6f, 0xfe, 0x42, 0x04, 0x2d, 0x05, 0xb6, 0x00, 0x14,
+ 0x00, 0x24, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x33,
+ 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27,
+ 0x11, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37,
+ 0x36, 0x35, 0x34, 0x27, 0x26, 0x6f, 0xaa, 0x59, 0x9f, 0x27, 0x2a, 0xd0,
+ 0x7c, 0x7f, 0x88, 0x7c, 0xc7, 0xa9, 0x72, 0x17, 0x17, 0x01, 0x2b, 0x91,
+ 0x53, 0x47, 0x6b, 0x4d, 0x73, 0x91, 0x57, 0x4f, 0x6d, 0x51, 0xfe, 0x42,
+ 0x07, 0x74, 0xfd, 0xf6, 0x7f, 0x1e, 0x07, 0x9d, 0xa0, 0xfe, 0xf3, 0xfe,
+ 0xf5, 0x9c, 0x8e, 0x6d, 0x17, 0x1c, 0xfd, 0xd1, 0x05, 0x6e, 0x81, 0x6f,
+ 0xb0, 0xdb, 0x72, 0x52, 0x7a, 0x70, 0xaf, 0xdc, 0x73, 0x57, 0xff, 0xff,
+ 0x00, 0x29, 0xfe, 0x42, 0x03, 0xd3, 0x05, 0x9d, 0x10, 0x27, 0x00, 0x6b,
+ 0x00, 0xb0, 0xff, 0xe5, 0x10, 0x06, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x01, 0x9e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x9c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0xb7, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4a, 0x00, 0xcc, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x01, 0x3e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x34, 0x01, 0x5c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, 0x01, 0xad, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x8c, 0x01, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x48, 0x02, 0x9d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x58, 0x03, 0x0c, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x68, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0xae, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0xc5, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x25, 0x01, 0x18, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x01, 0x52, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x1a, 0x01, 0x92, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x01, 0xbf, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x46, 0x02, 0x56, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x24, 0x02, 0xe7, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x2c, 0x03, 0x66, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x10, 0x00, 0x9c, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x0c, 0x00, 0xb7, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x4a, 0x00, 0xcc, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x12, 0x01, 0x3e, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x34, 0x01, 0x5c, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x10, 0x01, 0xad, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x0d, 0x00, 0x8c, 0x01, 0xc8, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x0e, 0x00, 0x48, 0x02, 0x9d, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x09, 0x00, 0x13, 0x00, 0x58, 0x03, 0x0c, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x24, 0x00, 0x02, 0x00, 0x0e, 0x03, 0x93, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x24, 0x00, 0x0d, 0x00, 0x86, 0x03, 0xa3, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x24, 0x00, 0x0e, 0x00, 0x48, 0x04, 0x2b, 0x00, 0x03,
+ 0x00, 0x01, 0x04, 0x24, 0x00, 0x13, 0x00, 0x54, 0x04, 0x75, 0x00, 0x43,
+ 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x66,
+ 0x00, 0x74, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x32,
+ 0x00, 0x2c, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x33,
+ 0x00, 0x2c, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x35,
+ 0x00, 0x20, 0x00, 0x46, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20,
+ 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61,
+ 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x75,
+ 0x00, 0x6e, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f,
+ 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x00, 0x43, 0x6f, 0x70, 0x79, 0x6c, 0x65,
+ 0x66, 0x74, 0x20, 0x32, 0x30, 0x30, 0x32, 0x2c, 0x20, 0x32, 0x30, 0x30,
+ 0x33, 0x2c, 0x20, 0x32, 0x30, 0x30, 0x35, 0x20, 0x46, 0x72, 0x65, 0x65,
+ 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x46, 0x6f,
+ 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x00, 0x00, 0x46,
+ 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e,
+ 0x00, 0x73, 0x00, 0x00, 0x46, 0x72, 0x65, 0x65, 0x53, 0x61, 0x6e, 0x73,
+ 0x00, 0x00, 0x4d, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x75, 0x00,
+ 0x6d, 0x00, 0x00, 0x4d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x00, 0x00, 0x46,
+ 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x72,
+ 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x30,
+ 0x00, 0x20, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x46, 0x00, 0x72, 0x00, 0x65,
+ 0x00, 0x65, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73,
+ 0x00, 0x20, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x32, 0x00, 0x36, 0x00, 0x2d,
+ 0x00, 0x31, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x36,
+ 0x00, 0x00, 0x46, 0x6f, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x67, 0x65, 0x20,
+ 0x31, 0x2e, 0x30, 0x20, 0x3a, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53,
+ 0x61, 0x6e, 0x73, 0x20, 0x3a, 0x20, 0x32, 0x36, 0x2d, 0x31, 0x2d, 0x32,
+ 0x30, 0x30, 0x36, 0x00, 0x00, 0x46, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65,
+ 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x00,
+ 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x00, 0x00, 0x56,
+ 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e,
+ 0x00, 0x20, 0x00, 0x24, 0x00, 0x52, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69,
+ 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x3a, 0x00, 0x20,
+ 0x00, 0x31, 0x00, 0x2e, 0x00, 0x37, 0x00, 0x36, 0x00, 0x20, 0x00, 0x24,
+ 0x00, 0x20, 0x00, 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20,
+ 0x24, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x31,
+ 0x2e, 0x37, 0x36, 0x20, 0x24, 0x20, 0x00, 0x00, 0x46, 0x00, 0x72, 0x00,
+ 0x65, 0x00, 0x65, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00,
+ 0x00, 0x46, 0x72, 0x65, 0x65, 0x53, 0x61, 0x6e, 0x73, 0x00, 0x00, 0x54,
+ 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65,
+ 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68,
+ 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e,
+ 0x00, 0x74, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x67,
+ 0x00, 0x72, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64,
+ 0x00, 0x20, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x65,
+ 0x00, 0x63, 0x00, 0x74, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20,
+ 0x00, 0x47, 0x00, 0x4e, 0x00, 0x55, 0x00, 0x20, 0x00, 0x47, 0x00, 0x65,
+ 0x00, 0x6e, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20,
+ 0x00, 0x50, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63,
+ 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e,
+ 0x00, 0x73, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x00, 0x54, 0x68, 0x65, 0x20,
+ 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e,
+ 0x74, 0x65, 0x64, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x74, 0x6f, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69,
+ 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x00, 0x00, 0x68, 0x00, 0x74, 0x00,
+ 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00,
+ 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x75, 0x00,
+ 0x2e, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2f, 0x00, 0x63, 0x00,
+ 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x66, 0x00,
+ 0x74, 0x00, 0x2f, 0x00, 0x67, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x2e, 0x00,
+ 0x68, 0x00, 0x74, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x00, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6e, 0x75, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x6f, 0x70, 0x79, 0x6c, 0x65, 0x66, 0x74,
+ 0x2f, 0x67, 0x70, 0x6c, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x00, 0x00, 0x54,
+ 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x71, 0x00, 0x75, 0x00, 0x69,
+ 0x00, 0x63, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x62, 0x00, 0x72, 0x00, 0x6f,
+ 0x00, 0x77, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x78,
+ 0x00, 0x20, 0x00, 0x6a, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x73,
+ 0x00, 0x20, 0x00, 0x6f, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20,
+ 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61,
+ 0x00, 0x7a, 0x00, 0x79, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x67,
+ 0x00, 0x2e, 0x00, 0x00, 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
+ 0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, 0x78, 0x20,
+ 0x6a, 0x75, 0x6d, 0x70, 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20, 0x64, 0x6f, 0x67, 0x2e,
+ 0x00, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x76, 0x00, 0x61, 0x00, 0x64, 0x00,
+ 0x6e, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x44, 0x00, 0x6f, 0x00, 0x76, 0x00,
+ 0x6f, 0x00, 0x6c, 0x00, 0x6a, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x61, 0x00,
+ 0x20, 0x00, 0x6a, 0x00, 0x65, 0x00, 0x20, 0x00, 0x75, 0x00, 0x70, 0x00,
+ 0x6f, 0x00, 0x72, 0x00, 0x61, 0x00, 0x62, 0x00, 0x61, 0x00, 0x20, 0x00,
+ 0x76, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x61, 0x00,
+ 0x64, 0x00, 0x75, 0x00, 0x20, 0x00, 0x7a, 0x00, 0x20, 0x00, 0x6c, 0x00,
+ 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x6f, 0x00,
+ 0x20, 0x00, 0x47, 0x00, 0x4e, 0x00, 0x55, 0x00, 0x20, 0x00, 0x47, 0x00,
+ 0x65, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6c, 0x00,
+ 0x20, 0x00, 0x50, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00,
+ 0x63, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00,
+ 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x68, 0x00,
+ 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00,
+ 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, 0x67, 0x00, 0x6e, 0x00,
+ 0x75, 0x00, 0x2e, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2f, 0x00,
+ 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x6c, 0x00, 0x65, 0x00,
+ 0x66, 0x00, 0x74, 0x00, 0x2f, 0x00, 0x67, 0x00, 0x70, 0x00, 0x6c, 0x00,
+ 0x2e, 0x00, 0x68, 0x00, 0x74, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x00, 0x01,
+ 0x60, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x66, 0x00, 0x20, 0x00,
+ 0x62, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x7a, 0x00, 0x61, 0x00, 0x20, 0x00,
+ 0x76, 0x00, 0x61, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x73, 0x00,
+ 0x70, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6b, 0x00, 0x75, 0x00,
+ 0x68, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00,
+ 0x6d, 0x00, 0x61, 0x01, 0x0d, 0x00, 0x65, 0x00, 0x20, 0x01, 0x7e, 0x00,
+ 0x67, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x65, 0x00, 0x2e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfe, 0xcb, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x01, 0x02, 0x00, 0x03,
+ 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09,
+ 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f,
+ 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15,
+ 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b,
+ 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21,
+ 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27,
+ 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d,
+ 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33,
+ 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39,
+ 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f,
+ 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45,
+ 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b,
+ 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51,
+ 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57,
+ 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d,
+ 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0xac, 0x00, 0xa3,
+ 0x00, 0x84, 0x00, 0x85, 0x00, 0xbd, 0x00, 0x96, 0x00, 0xe8, 0x00, 0x86,
+ 0x00, 0x8e, 0x00, 0x8b, 0x00, 0x9d, 0x00, 0xa9, 0x00, 0xa4, 0x01, 0x03,
+ 0x00, 0x8a, 0x00, 0xda, 0x00, 0x83, 0x00, 0x93, 0x00, 0xf2, 0x00, 0xf3,
+ 0x00, 0x8d, 0x00, 0x97, 0x00, 0x88, 0x00, 0xc3, 0x00, 0xde, 0x00, 0xf1,
+ 0x00, 0x9e, 0x00, 0xaa, 0x00, 0xf5, 0x00, 0xf4, 0x00, 0xf6, 0x00, 0xa2,
+ 0x00, 0xad, 0x00, 0xc9, 0x00, 0xc7, 0x00, 0xae, 0x00, 0x62, 0x00, 0x63,
+ 0x00, 0x90, 0x00, 0x64, 0x00, 0xcb, 0x00, 0x65, 0x00, 0xc8, 0x00, 0xca,
+ 0x00, 0xcf, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xe9, 0x00, 0x66,
+ 0x00, 0xd3, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xaf, 0x00, 0x67, 0x00, 0xf0,
+ 0x00, 0x91, 0x00, 0xd6, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x68, 0x00, 0xeb,
+ 0x00, 0xed, 0x00, 0x89, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6d,
+ 0x00, 0x6c, 0x00, 0x6e, 0x00, 0xa0, 0x00, 0x6f, 0x00, 0x71, 0x00, 0x70,
+ 0x00, 0x72, 0x00, 0x73, 0x00, 0x75, 0x00, 0x74, 0x00, 0x76, 0x00, 0x77,
+ 0x00, 0xea, 0x00, 0x78, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x7b, 0x00, 0x7d,
+ 0x00, 0x7c, 0x00, 0xb8, 0x00, 0xa1, 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x80,
+ 0x00, 0x81, 0x00, 0xec, 0x00, 0xee, 0x00, 0xba, 0x00, 0xd7, 0x00, 0xd8,
+ 0x01, 0x04, 0x01, 0x05, 0x00, 0xdd, 0x00, 0xd9, 0x06, 0x67, 0x6c, 0x79,
+ 0x70, 0x68, 0x33, 0x0a, 0x73, 0x6f, 0x66, 0x74, 0x68, 0x79, 0x70, 0x68,
+ 0x65, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x41, 0x07, 0x75,
+ 0x6e, 0x69, 0x30, 0x32, 0x43, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0xff, 0xff, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
+ 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x6a,
+ 0x00, 0x01, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x03, 0x00, 0x6c, 0x00, 0x02,
+ 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x8e, 0x00, 0x9c, 0x00, 0x08,
+ 0x44, 0x46, 0x4c, 0x54, 0x00, 0x32, 0x61, 0x72, 0x6d, 0x6e, 0x00, 0x3c,
+ 0x62, 0x65, 0x6e, 0x67, 0x00, 0x46, 0x64, 0x65, 0x76, 0x61, 0x00, 0x50,
+ 0x67, 0x75, 0x6a, 0x72, 0x00, 0x5a, 0x67, 0x75, 0x72, 0x75, 0x00, 0x64,
+ 0x68, 0x65, 0x62, 0x72, 0x00, 0x6e, 0x6c, 0x61, 0x74, 0x6e, 0x00, 0x78,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x63, 0x63, 0x6d, 0x70, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0x02,
+ 0x00, 0x12, 0x00, 0x1a, 0x00, 0x22, 0x00, 0x22, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x4d, 0x00, 0x4e,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01,
+ 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x01, 0x00, 0x06, 0x00, 0x76, 0x00, 0x01, 0x00, 0x01, 0x00, 0x4d,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x90, 0x00, 0xaa, 0x00, 0x08,
+ 0x44, 0x46, 0x4c, 0x54, 0x00, 0x32, 0x61, 0x72, 0x6d, 0x6e, 0x00, 0x3e,
+ 0x62, 0x65, 0x6e, 0x67, 0x00, 0x48, 0x64, 0x65, 0x76, 0x61, 0x00, 0x52,
+ 0x67, 0x75, 0x6a, 0x72, 0x00, 0x5c, 0x67, 0x75, 0x72, 0x75, 0x00, 0x66,
+ 0x68, 0x65, 0x62, 0x72, 0x00, 0x70, 0x6c, 0x61, 0x74, 0x6e, 0x00, 0x7a,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x02, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x0e, 0x6b, 0x65, 0x72, 0x6e,
+ 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e,
+ 0x00, 0x01, 0x00, 0x7a, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12,
+ 0x00, 0x20, 0x00, 0x46, 0x00, 0x54, 0x00, 0x03, 0xff, 0xff, 0xff, 0x33,
+ 0xff, 0xff, 0xff, 0xac, 0xff, 0xff, 0xff, 0x9a, 0x00, 0x09, 0x00, 0x25,
+ 0xff, 0xf2, 0x00, 0x38, 0xff, 0x5c, 0x00, 0x3a, 0xff, 0xa2, 0x00, 0x3b,
+ 0xff, 0xd9, 0x00, 0x3d, 0xff, 0x44, 0x00, 0x84, 0xff, 0xf2, 0x00, 0x87,
+ 0xff, 0xf2, 0x00, 0x88, 0xff, 0xf2, 0x00, 0x89, 0xff, 0xe9, 0x00, 0x03,
+ 0xff, 0xff, 0xff, 0x31, 0xff, 0xff, 0xff, 0xac, 0xff, 0xff, 0xff, 0x98,
+ 0x00, 0x09, 0x00, 0x25, 0xff, 0x9a, 0x00, 0x38, 0xfe, 0xfe, 0x00, 0x3a,
+ 0xff, 0x42, 0x00, 0x3b, 0xff, 0x79, 0x00, 0x3d, 0xfe, 0xf0, 0x00, 0x84,
+ 0xff, 0x9a, 0x00, 0x87, 0xff, 0x9a, 0x00, 0x88, 0xff, 0x9a, 0x00, 0x89,
+ 0xff, 0x91, 0x00, 0x01, 0x00, 0x04, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12,
+ 0x00, 0x7e, 0x00, 0x01, 0x0e, 0x92, 0x00, 0x04, 0x00, 0x00, 0x00, 0x48,
+ 0x00, 0x9a, 0x01, 0x34, 0x01, 0x7a, 0x01, 0xa4, 0x01, 0xda, 0x02, 0x50,
+ 0x02, 0x82, 0x02, 0x94, 0x02, 0xe6, 0x03, 0x5c, 0x03, 0xae, 0x03, 0xd8,
+ 0x04, 0x2e, 0x04, 0xa4, 0x04, 0xce, 0x05, 0x8c, 0x05, 0xc2, 0x06, 0x5c,
+ 0x06, 0xee, 0x07, 0x18, 0x07, 0xaa, 0x07, 0xb4, 0x07, 0xca, 0x07, 0xd8,
+ 0x07, 0xe2, 0x07, 0xfc, 0x08, 0x42, 0x08, 0x5c, 0x08, 0x66, 0x08, 0x70,
+ 0x08, 0xae, 0x08, 0xb4, 0x08, 0xc6, 0x08, 0xe0, 0x08, 0xfe, 0x09, 0x08,
+ 0x09, 0x12, 0x09, 0xc0, 0x09, 0xca, 0x0a, 0x08, 0x0a, 0x0e, 0x0a, 0x78,
+ 0x0a, 0xde, 0x0a, 0xf8, 0x0b, 0x62, 0x0b, 0x90, 0x0c, 0x02, 0x0c, 0x30,
+ 0x0c, 0x5e, 0x0c, 0xd0, 0x0d, 0x46, 0x0d, 0x4c, 0x0d, 0x5a, 0x0d, 0x70,
+ 0x0d, 0x7e, 0x0d, 0x8c, 0x0d, 0xa6, 0x0d, 0xac, 0x0d, 0xb2, 0x0d, 0xd0,
+ 0x0d, 0xd6, 0x0d, 0xf8, 0x0e, 0x06, 0x0e, 0x14, 0x0e, 0x22, 0x0e, 0x30,
+ 0x0e, 0x3e, 0x0e, 0x4c, 0x0e, 0x5a, 0x0e, 0x68, 0x0e, 0x76, 0x0e, 0x7c,
+ 0x00, 0x26, 0xff, 0xff, 0xff, 0xae, 0xff, 0xff, 0xff, 0x8d, 0xff, 0xff,
+ 0xff, 0x7b, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff, 0xff, 0xb6, 0x00, 0x10,
+ 0x00, 0x0a, 0x00, 0x11, 0xff, 0xfa, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x27,
+ 0xff, 0xb6, 0x00, 0x2b, 0xff, 0xb8, 0x00, 0x33, 0xff, 0xbc, 0x00, 0x35,
+ 0xff, 0xbe, 0x00, 0x38, 0xff, 0x42, 0x00, 0x39, 0xff, 0xb4, 0x00, 0x3a,
+ 0xff, 0x66, 0x00, 0x3b, 0xff, 0x98, 0x00, 0x3d, 0xff, 0x35, 0x00, 0x45,
+ 0xff, 0xf8, 0x00, 0x46, 0x00, 0x08, 0x00, 0x47, 0xff, 0xe9, 0x00, 0x48,
+ 0xff, 0xf0, 0x00, 0x49, 0xff, 0xdf, 0x00, 0x4b, 0xff, 0xec, 0x00, 0x53,
+ 0xff, 0xe5, 0x00, 0x55, 0xff, 0xf0, 0x00, 0x58, 0xff, 0xdf, 0x00, 0x59,
+ 0xff, 0xe7, 0x00, 0x5a, 0xff, 0xc1, 0x00, 0x5b, 0xff, 0xd5, 0x00, 0x5d,
+ 0xff, 0xba, 0x00, 0x6e, 0xff, 0xa6, 0x00, 0x8a, 0xff, 0xb6, 0x00, 0x99,
+ 0xff, 0xbc, 0x00, 0x9c, 0xff, 0xb4, 0x00, 0x9d, 0xff, 0xb4, 0x00, 0x9e,
+ 0xff, 0xb4, 0x00, 0x9f, 0xff, 0xb4, 0x00, 0xaa, 0xff, 0xec, 0x00, 0x11,
+ 0xff, 0xff, 0xff, 0xf6, 0x00, 0x25, 0xff, 0xd5, 0x00, 0x33, 0xff, 0xf2,
+ 0x00, 0x3a, 0xff, 0xac, 0x00, 0x3b, 0xff, 0xcd, 0x00, 0x3d, 0xff, 0xa6,
+ 0x00, 0x84, 0xff, 0xd5, 0x00, 0x85, 0xff, 0xd5, 0x00, 0x86, 0xff, 0xd5,
+ 0x00, 0x87, 0xff, 0xd5, 0x00, 0x88, 0xff, 0xd5, 0x00, 0x89, 0xff, 0xd5,
+ 0x00, 0x95, 0xff, 0xf2, 0x00, 0x96, 0xff, 0xf2, 0x00, 0x97, 0xff, 0xf2,
+ 0x00, 0x99, 0xff, 0xf2, 0x00, 0x9b, 0xff, 0xfe, 0x00, 0x0a, 0x00, 0x25,
+ 0xff, 0xbe, 0x00, 0x2c, 0xff, 0xe7, 0x00, 0x2f, 0xff, 0xec, 0x00, 0x33,
+ 0xff, 0xf0, 0x00, 0x84, 0xff, 0xbe, 0x00, 0x87, 0xff, 0xbe, 0x00, 0x88,
+ 0xff, 0xbe, 0x00, 0x89, 0xff, 0xbc, 0x00, 0x96, 0xff, 0xf0, 0x00, 0x99,
+ 0xff, 0xf0, 0x00, 0x0d, 0x00, 0x25, 0xff, 0xaa, 0x00, 0x2e, 0xff, 0xf6,
+ 0x00, 0x38, 0xff, 0xa4, 0x00, 0x3a, 0xff, 0x98, 0x00, 0x3b, 0xff, 0xc5,
+ 0x00, 0x3c, 0xff, 0x93, 0x00, 0x3d, 0xff, 0x7f, 0x00, 0x83, 0xff, 0xaa,
+ 0x00, 0x84, 0xff, 0xaa, 0x00, 0x85, 0xff, 0xaa, 0x00, 0x86, 0xff, 0xaa,
+ 0x00, 0x87, 0xff, 0xaa, 0x00, 0x88, 0xff, 0xaa, 0x00, 0x1d, 0xff, 0xff,
+ 0xff, 0xd1, 0x00, 0x10, 0xff, 0x23, 0x00, 0x11, 0xff, 0xe3, 0x00, 0x12,
+ 0xff, 0x23, 0x00, 0x25, 0xff, 0x73, 0x00, 0x2e, 0xff, 0x98, 0x00, 0x33,
+ 0xff, 0xd3, 0x00, 0x45, 0xff, 0xbc, 0x00, 0x49, 0xff, 0xcf, 0x00, 0x4d,
+ 0xff, 0xec, 0x00, 0x4e, 0xff, 0xe7, 0x00, 0x53, 0xff, 0xd5, 0x00, 0x56,
+ 0xff, 0xb8, 0x00, 0x59, 0xff, 0xbc, 0x00, 0x83, 0xff, 0x73, 0x00, 0x84,
+ 0xff, 0x73, 0x00, 0x85, 0xff, 0x73, 0x00, 0x86, 0xff, 0x73, 0x00, 0x87,
+ 0xff, 0x73, 0x00, 0x88, 0xff, 0x73, 0x00, 0x99, 0xff, 0xd3, 0x00, 0xa4,
+ 0xff, 0xbc, 0x00, 0xa7, 0xff, 0xbc, 0x00, 0xa8, 0xff, 0xbc, 0x00, 0xa9,
+ 0xff, 0xc5, 0x00, 0xac, 0xff, 0xcf, 0x00, 0xb6, 0xff, 0xd5, 0x00, 0xb9,
+ 0xff, 0xd5, 0x00, 0xbb, 0xff, 0xd5, 0x00, 0x0c, 0x00, 0x25, 0xff, 0xf4,
+ 0x00, 0x38, 0xff, 0xa6, 0x00, 0x3a, 0xff, 0x9a, 0x00, 0x3b, 0xff, 0xc7,
+ 0x00, 0x3d, 0xff, 0x81, 0x00, 0x83, 0xff, 0xf4, 0x00, 0x84, 0xff, 0xf4,
+ 0x00, 0x85, 0xff, 0xf4, 0x00, 0x86, 0xff, 0xf4, 0x00, 0x87, 0xff, 0xf4,
+ 0x00, 0x88, 0xff, 0xf4, 0x00, 0x89, 0xff, 0xfa, 0x00, 0x04, 0x00, 0x25,
+ 0xff, 0xbe, 0x00, 0x87, 0xff, 0xbe, 0x00, 0x88, 0xff, 0xbe, 0x00, 0x89,
+ 0xff, 0xc1, 0x00, 0x14, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x11, 0xff, 0xa0,
+ 0x00, 0x27, 0xff, 0x98, 0x00, 0x2b, 0xff, 0x98, 0x00, 0x33, 0xff, 0x9e,
+ 0x00, 0x37, 0xff, 0xb2, 0x00, 0x38, 0x00, 0x29, 0x00, 0x45, 0xff, 0xe9,
+ 0x00, 0x49, 0xff, 0xbe, 0x00, 0x53, 0xff, 0xc5, 0x00, 0x59, 0xff, 0xd9,
+ 0x00, 0x5d, 0xff, 0x81, 0x00, 0x96, 0xff, 0x9e, 0x00, 0x99, 0xff, 0x9e,
+ 0x00, 0xa7, 0xff, 0xe9, 0x00, 0xa8, 0xff, 0xe9, 0x00, 0xa9, 0xff, 0xf2,
+ 0x00, 0xb6, 0xff, 0xc5, 0x00, 0xb9, 0xff, 0xc5, 0x00, 0xbf, 0xff, 0xd9,
+ 0x00, 0x1d, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xfe, 0xcf, 0xff, 0xff,
+ 0xff, 0xd9, 0xff, 0xff, 0xff, 0xac, 0x00, 0x11, 0xff, 0x00, 0x00, 0x25,
+ 0x00, 0x23, 0x00, 0x27, 0xff, 0xac, 0x00, 0x2b, 0xff, 0xaa, 0x00, 0x33,
+ 0xff, 0xac, 0x00, 0x37, 0xff, 0xd9, 0x00, 0x38, 0xff, 0x29, 0x00, 0x39,
+ 0xff, 0xb8, 0x00, 0x3a, 0xff, 0x29, 0x00, 0x3b, 0xff, 0x75, 0x00, 0x3d,
+ 0xff, 0x08, 0x00, 0x59, 0xff, 0xf2, 0x00, 0x5d, 0xff, 0x8d, 0x00, 0x84,
+ 0x00, 0x23, 0x00, 0x87, 0x00, 0x23, 0x00, 0x88, 0x00, 0x23, 0x00, 0x89,
+ 0x00, 0x29, 0x00, 0x8a, 0xff, 0xb4, 0x00, 0x95, 0xff, 0xac, 0x00, 0x96,
+ 0xff, 0xac, 0x00, 0x97, 0xff, 0xac, 0x00, 0x98, 0xff, 0xac, 0x00, 0x99,
+ 0xff, 0xac, 0x00, 0x9f, 0xff, 0xb8, 0x00, 0xbf, 0xff, 0xf2, 0x00, 0x14,
+ 0xff, 0xff, 0xff, 0xfa, 0x00, 0x10, 0xff, 0xf2, 0x00, 0x12, 0xff, 0xf2,
+ 0x00, 0x25, 0xff, 0xee, 0x00, 0x27, 0xff, 0xfa, 0x00, 0x2b, 0xff, 0xfc,
+ 0x00, 0x45, 0xff, 0xf6, 0x00, 0x53, 0x00, 0x04, 0x00, 0x84, 0xff, 0xee,
+ 0x00, 0x87, 0xff, 0xee, 0x00, 0x88, 0xff, 0xee, 0x00, 0x89, 0xff, 0xf4,
+ 0x00, 0x8a, 0xff, 0xfa, 0x00, 0xa4, 0xff, 0xf6, 0x00, 0xa7, 0xff, 0xf6,
+ 0x00, 0xa8, 0xff, 0xf6, 0x00, 0xa9, 0xff, 0xfc, 0x00, 0xb6, 0x00, 0x04,
+ 0x00, 0xb9, 0x00, 0x04, 0x00, 0xbb, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x25,
+ 0xff, 0xb8, 0x00, 0x38, 0xff, 0xaa, 0x00, 0x3a, 0xff, 0xa4, 0x00, 0x3b,
+ 0xff, 0xd1, 0x00, 0x3c, 0xff, 0xa2, 0x00, 0x3d, 0xff, 0x87, 0x00, 0x84,
+ 0xff, 0xb8, 0x00, 0x87, 0xff, 0xb8, 0x00, 0x88, 0xff, 0xb8, 0x00, 0x89,
+ 0xff, 0xb0, 0x00, 0x15, 0xff, 0xff, 0xff, 0xc7, 0x00, 0x10, 0xfe, 0xec,
+ 0x00, 0x11, 0xff, 0xae, 0x00, 0x12, 0xfe, 0xec, 0x00, 0x25, 0xff, 0x60,
+ 0x00, 0x2e, 0xff, 0x60, 0x00, 0x45, 0xff, 0xc7, 0x00, 0x49, 0xff, 0xc1,
+ 0x00, 0x53, 0xff, 0xc9, 0x00, 0x84, 0xff, 0x60, 0x00, 0x87, 0xff, 0x60,
+ 0x00, 0x88, 0xff, 0x60, 0x00, 0x89, 0xff, 0x50, 0x00, 0xa4, 0xff, 0xc7,
+ 0x00, 0xa7, 0xff, 0xc7, 0x00, 0xa8, 0xff, 0xc7, 0x00, 0xa9, 0xff, 0xcf,
+ 0x00, 0xac, 0xff, 0xc1, 0x00, 0xb6, 0xff, 0xc9, 0x00, 0xb9, 0xff, 0xc9,
+ 0x00, 0xbb, 0xff, 0xc9, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff,
+ 0xff, 0xe9, 0x00, 0x11, 0xff, 0xfc, 0x00, 0x27, 0xff, 0xdf, 0x00, 0x2b,
+ 0xff, 0xe1, 0x00, 0x33, 0xff, 0xe5, 0x00, 0x38, 0xff, 0xd1, 0x00, 0x39,
+ 0xff, 0xdd, 0x00, 0x3a, 0xff, 0xb0, 0x00, 0x3b, 0xff, 0xc9, 0x00, 0x3d,
+ 0xff, 0xa8, 0x00, 0x45, 0xff, 0xe1, 0x00, 0x49, 0xff, 0xe7, 0x00, 0x53,
+ 0xff, 0xee, 0x00, 0x59, 0xff, 0xee, 0x00, 0x5d, 0xff, 0xf0, 0x00, 0x8a,
+ 0xff, 0xdf, 0x00, 0x96, 0xff, 0xe5, 0x00, 0x99, 0xff, 0xe5, 0x00, 0x9f,
+ 0xff, 0xdd, 0x00, 0xa4, 0xff, 0xe1, 0x00, 0xa7, 0xff, 0xe1, 0x00, 0xa8,
+ 0xff, 0xe1, 0x00, 0xa9, 0xff, 0xe7, 0x00, 0xac, 0xff, 0xe7, 0x00, 0xb6,
+ 0xff, 0xee, 0x00, 0xb9, 0xff, 0xee, 0x00, 0xbd, 0xff, 0xee, 0x00, 0xbf,
+ 0xff, 0xee, 0x00, 0x0a, 0x00, 0x25, 0xff, 0xd3, 0x00, 0x38, 0xff, 0xc7,
+ 0x00, 0x3a, 0xff, 0xaa, 0x00, 0x3b, 0xff, 0xc7, 0x00, 0x3d, 0xff, 0x9e,
+ 0x00, 0x58, 0xff, 0xfa, 0x00, 0x84, 0xff, 0xd3, 0x00, 0x87, 0xff, 0xd3,
+ 0x00, 0x88, 0xff, 0xd3, 0x00, 0x89, 0xff, 0xd3, 0x00, 0x2f, 0xff, 0xff,
+ 0xff, 0x10, 0xff, 0xff, 0xff, 0x85, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff,
+ 0xff, 0xb8, 0x00, 0x10, 0xff, 0x33, 0x00, 0x11, 0xff, 0x62, 0x00, 0x12,
+ 0xff, 0x33, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x1f, 0xfe, 0xf8, 0x00, 0x25,
+ 0xff, 0x3d, 0x00, 0x27, 0xff, 0xa6, 0x00, 0x2b, 0xff, 0xa4, 0x00, 0x2e,
+ 0xff, 0x33, 0x00, 0x33, 0xff, 0xaa, 0x00, 0x37, 0xff, 0xcf, 0x00, 0x3a,
+ 0x00, 0x19, 0x00, 0x3b, 0x00, 0x21, 0x00, 0x3d, 0x00, 0x29, 0x00, 0x45,
+ 0xff, 0x33, 0x00, 0x47, 0xff, 0x48, 0x00, 0x49, 0xff, 0x3d, 0x00, 0x4b,
+ 0xff, 0x4a, 0x00, 0x4d, 0xff, 0xfa, 0x00, 0x4e, 0xff, 0xf6, 0x00, 0x53,
+ 0xff, 0x44, 0x00, 0x56, 0xff, 0x44, 0x00, 0x57, 0xff, 0x44, 0x00, 0x59,
+ 0xff, 0x46, 0x00, 0x5a, 0xff, 0x3d, 0x00, 0x5b, 0xff, 0x42, 0x00, 0x5d,
+ 0xff, 0x33, 0x00, 0x6e, 0xff, 0x08, 0x00, 0x83, 0xff, 0x3d, 0x00, 0x84,
+ 0xff, 0x3d, 0x00, 0x85, 0xff, 0x3d, 0x00, 0x86, 0xff, 0x3d, 0x00, 0x87,
+ 0xff, 0x3d, 0x00, 0x88, 0xff, 0x3d, 0x00, 0x89, 0xff, 0x39, 0x00, 0x95,
+ 0xff, 0xaa, 0x00, 0x96, 0xff, 0xaa, 0x00, 0x97, 0xff, 0xaa, 0x00, 0x98,
+ 0xff, 0xaa, 0x00, 0x99, 0xff, 0xaa, 0x00, 0x9b, 0xff, 0xac, 0x00, 0xa9,
+ 0xff, 0x39, 0x00, 0xbb, 0xff, 0x4e, 0x00, 0x0d, 0x00, 0x10, 0xff, 0xc9,
+ 0x00, 0x12, 0xff, 0xcd, 0x00, 0x25, 0xff, 0xb6, 0x00, 0x51, 0xff, 0xf8,
+ 0x00, 0x52, 0xff, 0xf8, 0x00, 0x54, 0x00, 0x06, 0x00, 0x56, 0xff, 0xf8,
+ 0x00, 0x84, 0xff, 0xb6, 0x00, 0x85, 0xff, 0xb6, 0x00, 0x86, 0xff, 0xb6,
+ 0x00, 0x87, 0xff, 0xb6, 0x00, 0x88, 0xff, 0xb6, 0x00, 0x89, 0xff, 0xb0,
+ 0x00, 0x26, 0xff, 0xff, 0xff, 0x5c, 0xff, 0xff, 0xff, 0xb8, 0xff, 0xff,
+ 0xff, 0xa8, 0x00, 0x10, 0xff, 0x4a, 0x00, 0x11, 0xff, 0xb2, 0x00, 0x12,
+ 0xff, 0x4a, 0x00, 0x1e, 0xff, 0x79, 0x00, 0x1f, 0xff, 0x79, 0x00, 0x25,
+ 0xff, 0x6f, 0x00, 0x27, 0xff, 0xa8, 0x00, 0x2b, 0xff, 0xaa, 0x00, 0x33,
+ 0xff, 0xae, 0x00, 0x37, 0xff, 0xb8, 0x00, 0x38, 0x00, 0x1f, 0x00, 0x45,
+ 0xff, 0x87, 0x00, 0x49, 0xff, 0x8b, 0x00, 0x4b, 0xff, 0x9a, 0x00, 0x4d,
+ 0xff, 0xf6, 0x00, 0x53, 0xff, 0x91, 0x00, 0x56, 0xff, 0xaa, 0x00, 0x59,
+ 0xff, 0xac, 0x00, 0x5d, 0xff, 0xd7, 0x00, 0x6e, 0xff, 0x56, 0x00, 0x83,
+ 0xff, 0x6f, 0x00, 0x84, 0xff, 0x6f, 0x00, 0x85, 0xff, 0x6f, 0x00, 0x86,
+ 0xff, 0x6f, 0x00, 0x87, 0xff, 0x6f, 0x00, 0x88, 0xff, 0x6f, 0x00, 0x89,
+ 0xff, 0x60, 0x00, 0x95, 0xff, 0xae, 0x00, 0x96, 0xff, 0xae, 0x00, 0x97,
+ 0xff, 0xae, 0x00, 0x98, 0xff, 0xae, 0x00, 0x99, 0xff, 0xae, 0x00, 0x9b,
+ 0xff, 0xbc, 0x00, 0xa9, 0xff, 0x8f, 0x00, 0xbb, 0xff, 0x9a, 0x00, 0x24,
+ 0xff, 0xff, 0xff, 0x91, 0x00, 0x10, 0xff, 0x8d, 0x00, 0x11, 0xff, 0xe5,
+ 0x00, 0x12, 0xff, 0x8d, 0x00, 0x1e, 0xff, 0x96, 0x00, 0x1f, 0xff, 0x93,
+ 0x00, 0x25, 0xff, 0x9a, 0x00, 0x27, 0xff, 0xd1, 0x00, 0x2b, 0xff, 0xd3,
+ 0x00, 0x33, 0xff, 0xd7, 0x00, 0x37, 0xff, 0xcf, 0x00, 0x38, 0x00, 0x27,
+ 0x00, 0x45, 0xff, 0xb2, 0x00, 0x49, 0xff, 0xbe, 0x00, 0x4b, 0xff, 0xcd,
+ 0x00, 0x4d, 0xff, 0xfe, 0x00, 0x53, 0xff, 0xc5, 0x00, 0x56, 0xff, 0xc7,
+ 0x00, 0x59, 0xff, 0xc7, 0x00, 0x5d, 0xff, 0xf4, 0x00, 0x6e, 0xff, 0x89,
+ 0x00, 0x83, 0xff, 0x9a, 0x00, 0x84, 0xff, 0x9a, 0x00, 0x85, 0xff, 0x9a,
+ 0x00, 0x86, 0xff, 0x9a, 0x00, 0x87, 0xff, 0x9a, 0x00, 0x88, 0xff, 0x9a,
+ 0x00, 0x89, 0xff, 0x8d, 0x00, 0x95, 0xff, 0xd7, 0x00, 0x96, 0xff, 0xd7,
+ 0x00, 0x97, 0xff, 0xd7, 0x00, 0x98, 0xff, 0xd7, 0x00, 0x99, 0xff, 0xd7,
+ 0x00, 0x9b, 0xff, 0xe5, 0x00, 0xa9, 0xff, 0xba, 0x00, 0xbb, 0xff, 0xcd,
+ 0x00, 0x0a, 0x00, 0x11, 0xff, 0x98, 0x00, 0x27, 0xff, 0x9e, 0x00, 0x33,
+ 0xff, 0xa4, 0x00, 0x35, 0xff, 0xa6, 0x00, 0x45, 0xff, 0xe1, 0x00, 0x49,
+ 0xff, 0xb6, 0x00, 0x53, 0xff, 0xbc, 0x00, 0x59, 0xff, 0xcf, 0x00, 0x5d,
+ 0xff, 0x83, 0x00, 0x99, 0xff, 0xa4, 0x00, 0x24, 0xff, 0xff, 0xff, 0x0c,
+ 0x00, 0x10, 0xff, 0x1d, 0x00, 0x11, 0xff, 0x54, 0x00, 0x12, 0xff, 0x1d,
+ 0x00, 0x1e, 0xff, 0x4e, 0x00, 0x1f, 0xff, 0x4c, 0x00, 0x25, 0xff, 0x3b,
+ 0x00, 0x27, 0xff, 0x89, 0x00, 0x2b, 0xff, 0x89, 0x00, 0x33, 0xff, 0x8d,
+ 0x00, 0x37, 0xff, 0xac, 0x00, 0x38, 0x00, 0x2f, 0x00, 0x45, 0xff, 0x4c,
+ 0x00, 0x49, 0xff, 0x4a, 0x00, 0x4b, 0xff, 0x56, 0x00, 0x4d, 0x00, 0x06,
+ 0x00, 0x53, 0xff, 0x50, 0x00, 0x54, 0xff, 0x91, 0x00, 0x59, 0xff, 0x7f,
+ 0x00, 0x5a, 0xff, 0xb6, 0x00, 0x6e, 0xff, 0x04, 0x00, 0x83, 0xff, 0x3b,
+ 0x00, 0x84, 0xff, 0x3b, 0x00, 0x85, 0xff, 0x3b, 0x00, 0x86, 0xff, 0x3b,
+ 0x00, 0x87, 0xff, 0x3b, 0x00, 0x88, 0xff, 0x3b, 0x00, 0x89, 0xff, 0x2d,
+ 0x00, 0x95, 0xff, 0x8d, 0x00, 0x96, 0xff, 0x8d, 0x00, 0x97, 0xff, 0x8d,
+ 0x00, 0x98, 0xff, 0x8d, 0x00, 0x99, 0xff, 0x8d, 0x00, 0x9b, 0xff, 0x91,
+ 0x00, 0xa9, 0xff, 0x54, 0x00, 0xbb, 0xff, 0x58, 0x00, 0x02, 0x00, 0x5a,
+ 0xff, 0xbc, 0x00, 0x5d, 0xff, 0xb2, 0x00, 0x05, 0xff, 0xff, 0xff, 0xd1,
+ 0x00, 0x4e, 0xff, 0xf8, 0x00, 0x5a, 0xff, 0xd5, 0x00, 0x5b, 0xff, 0xe5,
+ 0x00, 0x5d, 0xff, 0xcb, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xe9, 0x00, 0x5b,
+ 0xff, 0xfa, 0x00, 0x5d, 0xff, 0xe1, 0x00, 0x02, 0x00, 0x4c, 0x00, 0x02,
+ 0x00, 0x4f, 0x00, 0x0e, 0x00, 0x06, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x58,
+ 0xff, 0xec, 0x00, 0x5a, 0xff, 0xe1, 0x00, 0x5b, 0xff, 0xee, 0x00, 0x5c,
+ 0xff, 0xc9, 0x00, 0x5d, 0xff, 0xd9, 0x00, 0x11, 0xff, 0xff, 0xff, 0xe7,
+ 0x00, 0x45, 0xff, 0xee, 0x00, 0x49, 0xff, 0xe1, 0x00, 0x4a, 0x00, 0x2d,
+ 0x00, 0x4d, 0xff, 0xfc, 0x00, 0x4e, 0xff, 0xf8, 0x00, 0x50, 0xff, 0xfa,
+ 0x00, 0x53, 0xff, 0xec, 0x00, 0x58, 0x00, 0x31, 0x00, 0xa4, 0xff, 0xee,
+ 0x00, 0xa7, 0xff, 0xee, 0x00, 0xa8, 0xff, 0xee, 0x00, 0xa9, 0xff, 0xf6,
+ 0x00, 0xac, 0xff, 0xe1, 0x00, 0xb6, 0xff, 0xec, 0x00, 0xb9, 0xff, 0xec,
+ 0x00, 0xbb, 0xff, 0xee, 0x00, 0x06, 0x00, 0x45, 0xff, 0xf6, 0x00, 0xa7,
+ 0xff, 0xf6, 0x00, 0xa8, 0xff, 0xf6, 0x00, 0xa9, 0xff, 0xfe, 0x00, 0xb6,
+ 0x00, 0x06, 0x00, 0xb9, 0x00, 0x06, 0x00, 0x02, 0xff, 0xff, 0xff, 0xe1,
+ 0x00, 0x5d, 0xff, 0xdb, 0x00, 0x02, 0x00, 0x38, 0xff, 0xf2, 0x00, 0x4e,
+ 0xff, 0xfa, 0x00, 0x0f, 0x00, 0x11, 0xff, 0xac, 0x00, 0x45, 0xff, 0xfc,
+ 0x00, 0x49, 0xff, 0xd5, 0x00, 0x4b, 0xff, 0xdf, 0x00, 0x53, 0xff, 0xd9,
+ 0x00, 0x57, 0xff, 0xfa, 0x00, 0x59, 0xff, 0xe9, 0x00, 0xa4, 0xff, 0xfc,
+ 0x00, 0xa7, 0xff, 0xfc, 0x00, 0xa8, 0xff, 0xfc, 0x00, 0xa9, 0x00, 0x04,
+ 0x00, 0xac, 0xff, 0xd5, 0x00, 0xb6, 0xff, 0xd9, 0x00, 0xb9, 0xff, 0xd9,
+ 0x00, 0xbf, 0xff, 0xf4, 0x00, 0x01, 0x00, 0x5d, 0xff, 0xf6, 0x00, 0x04,
+ 0x00, 0x54, 0x00, 0x0a, 0x00, 0x5a, 0xff, 0xe5, 0x00, 0x5b, 0xff, 0xf2,
+ 0x00, 0x5d, 0xff, 0xdb, 0x00, 0x06, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x38,
+ 0xff, 0x3b, 0x00, 0x54, 0x00, 0x0a, 0x00, 0x5a, 0xff, 0xe5, 0x00, 0x5b,
+ 0xff, 0xf2, 0x00, 0x5d, 0xff, 0xdb, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd5,
+ 0x00, 0x38, 0xff, 0x35, 0x00, 0x58, 0xff, 0xec, 0x00, 0x5a, 0xff, 0xdb,
+ 0x00, 0x5b, 0xff, 0xec, 0x00, 0x5c, 0xff, 0xc9, 0x00, 0x5d, 0xff, 0xd3,
+ 0x00, 0x02, 0x00, 0x58, 0xff, 0xf8, 0x00, 0x5d, 0xff, 0xdf, 0x00, 0x02,
+ 0x00, 0x47, 0x00, 0x10, 0x00, 0x59, 0x00, 0x08, 0x00, 0x2b, 0xff, 0xff,
+ 0x00, 0x02, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x10,
+ 0xff, 0x73, 0x00, 0x11, 0xff, 0xa0, 0x00, 0x12, 0xff, 0x73, 0x00, 0x1e,
+ 0xff, 0xd3, 0x00, 0x1f, 0xff, 0xd3, 0x00, 0x45, 0xff, 0xf6, 0x00, 0x47,
+ 0xff, 0xf4, 0x00, 0x48, 0xff, 0xfe, 0x00, 0x49, 0xff, 0xe9, 0x00, 0x4a,
+ 0x00, 0x35, 0x00, 0x4b, 0xff, 0xf8, 0x00, 0x4d, 0x00, 0x02, 0x00, 0x4f,
+ 0x00, 0x0c, 0x00, 0x50, 0x00, 0x02, 0x00, 0x53, 0xff, 0xf4, 0x00, 0x54,
+ 0x00, 0x10, 0x00, 0x55, 0xff, 0xfa, 0x00, 0x57, 0x00, 0x08, 0x00, 0x58,
+ 0x00, 0x39, 0x00, 0x59, 0x00, 0x04, 0x00, 0x5a, 0x00, 0x3b, 0x00, 0x5b,
+ 0x00, 0x3f, 0x00, 0x5c, 0x00, 0x29, 0x00, 0x5d, 0x00, 0x31, 0x00, 0x5e,
+ 0x00, 0x12, 0x00, 0xa3, 0xff, 0xf6, 0x00, 0xa4, 0xff, 0xf6, 0x00, 0xa5,
+ 0xff, 0xf6, 0x00, 0xa7, 0xff, 0xf6, 0x00, 0xa8, 0xff, 0xf6, 0x00, 0xa9,
+ 0xff, 0xfe, 0x00, 0xaa, 0xff, 0xee, 0x00, 0xab, 0xff, 0xe9, 0x00, 0xac,
+ 0xff, 0xe9, 0x00, 0xad, 0xff, 0xe9, 0x00, 0xb5, 0xff, 0xf4, 0x00, 0xb6,
+ 0xff, 0xf4, 0x00, 0xb7, 0xff, 0xf4, 0x00, 0xb9, 0xff, 0xf4, 0x00, 0xbb,
+ 0xff, 0xf4, 0x00, 0x02, 0xff, 0xff, 0xff, 0xd3, 0x00, 0x58, 0xff, 0xfa,
+ 0x00, 0x0f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x1e, 0xff, 0xc7, 0x00, 0x1f,
+ 0xff, 0xc7, 0x00, 0x37, 0xff, 0xf0, 0x00, 0x45, 0xff, 0xfe, 0x00, 0x49,
+ 0xff, 0xe3, 0x00, 0x4c, 0xff, 0xfa, 0x00, 0x53, 0xff, 0xe7, 0x00, 0xa4,
+ 0xff, 0xfe, 0x00, 0xa7, 0xff, 0xfe, 0x00, 0xa8, 0xff, 0xfe, 0x00, 0xa9,
+ 0x00, 0x04, 0x00, 0xac, 0xff, 0xe3, 0x00, 0xb6, 0xff, 0xe7, 0x00, 0xb9,
+ 0xff, 0xe7, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1a, 0xff, 0xff,
+ 0xff, 0xdf, 0x00, 0x10, 0xff, 0x73, 0x00, 0x11, 0xff, 0xe7, 0x00, 0x12,
+ 0xff, 0x73, 0x00, 0x1e, 0xff, 0xd1, 0x00, 0x1f, 0xff, 0xd1, 0x00, 0x45,
+ 0xff, 0xdb, 0x00, 0x47, 0xff, 0xdf, 0x00, 0x49, 0xff, 0xd5, 0x00, 0x4b,
+ 0xff, 0xe3, 0x00, 0x53, 0xff, 0xdd, 0x00, 0x57, 0xff, 0xee, 0x00, 0xa3,
+ 0xff, 0xdb, 0x00, 0xa4, 0xff, 0xdb, 0x00, 0xa5, 0xff, 0xdb, 0x00, 0xa6,
+ 0xff, 0xdb, 0x00, 0xa7, 0xff, 0xdb, 0x00, 0xa8, 0xff, 0xdb, 0x00, 0xa9,
+ 0xff, 0xe3, 0x00, 0xab, 0xff, 0xd5, 0x00, 0xac, 0xff, 0xd5, 0x00, 0xad,
+ 0xff, 0xd5, 0x00, 0xb5, 0xff, 0xdd, 0x00, 0xb6, 0xff, 0xdd, 0x00, 0xb9,
+ 0xff, 0xdd, 0x00, 0xbb, 0xff, 0xdd, 0x00, 0x19, 0x00, 0x10, 0xff, 0x9a,
+ 0x00, 0x11, 0xff, 0xfe, 0x00, 0x12, 0xff, 0x9a, 0x00, 0x1e, 0xff, 0xd1,
+ 0x00, 0x1f, 0xff, 0xd1, 0x00, 0x45, 0xff, 0xe1, 0x00, 0x47, 0xff, 0xf2,
+ 0x00, 0x49, 0xff, 0xe7, 0x00, 0x4b, 0xff, 0xf4, 0x00, 0x53, 0xff, 0xee,
+ 0x00, 0x57, 0xff, 0xf6, 0x00, 0xa3, 0xff, 0xe1, 0x00, 0xa4, 0xff, 0xe1,
+ 0x00, 0xa5, 0xff, 0xe1, 0x00, 0xa6, 0xff, 0xe1, 0x00, 0xa7, 0xff, 0xe1,
+ 0x00, 0xa8, 0xff, 0xe1, 0x00, 0xa9, 0xff, 0xe9, 0x00, 0xab, 0xff, 0xe7,
+ 0x00, 0xac, 0xff, 0xe7, 0x00, 0xad, 0xff, 0xe7, 0x00, 0xb5, 0xff, 0xee,
+ 0x00, 0xb6, 0xff, 0xee, 0x00, 0xb9, 0xff, 0xee, 0x00, 0xbb, 0xff, 0xf4,
+ 0x00, 0x06, 0x00, 0x45, 0xff, 0xdd, 0x00, 0x47, 0xff, 0xd1, 0x00, 0x49,
+ 0xff, 0xc7, 0x00, 0x53, 0xff, 0xcd, 0x00, 0x55, 0xff, 0xd7, 0x00, 0xac,
+ 0xff, 0xc7, 0x00, 0x1a, 0x00, 0x10, 0xff, 0x71, 0x00, 0x11, 0xff, 0xe3,
+ 0x00, 0x12, 0xff, 0x71, 0x00, 0x1e, 0xff, 0xc9, 0x00, 0x1f, 0xff, 0xc9,
+ 0x00, 0x45, 0xff, 0xd3, 0x00, 0x47, 0xff, 0xd9, 0x00, 0x49, 0xff, 0xcf,
+ 0x00, 0x4b, 0xff, 0xdd, 0x00, 0x50, 0xff, 0xf8, 0x00, 0x53, 0xff, 0xd7,
+ 0x00, 0x57, 0xff, 0xe7, 0x00, 0xa3, 0xff, 0xd3, 0x00, 0xa4, 0xff, 0xd3,
+ 0x00, 0xa5, 0xff, 0xd3, 0x00, 0xa6, 0xff, 0xd3, 0x00, 0xa7, 0xff, 0xd3,
+ 0x00, 0xa8, 0xff, 0xd3, 0x00, 0xa9, 0xff, 0xdb, 0x00, 0xab, 0xff, 0xcf,
+ 0x00, 0xac, 0xff, 0xcf, 0x00, 0xad, 0xff, 0xcf, 0x00, 0xb5, 0xff, 0xd7,
+ 0x00, 0xb6, 0xff, 0xd7, 0x00, 0xb9, 0xff, 0xd7, 0x00, 0xbb, 0xff, 0xd9,
+ 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x27,
+ 0xff, 0xb6, 0x00, 0x2b, 0xff, 0xb8, 0x00, 0x33, 0xff, 0xbc, 0x00, 0x35,
+ 0xff, 0xbe, 0x00, 0x38, 0xff, 0x42, 0x00, 0x39, 0xff, 0xb4, 0x00, 0x3a,
+ 0xff, 0x66, 0x00, 0x3b, 0xff, 0x98, 0x00, 0x3d, 0xff, 0x35, 0x00, 0x1c,
+ 0xff, 0xff, 0xff, 0xae, 0xff, 0xff, 0xff, 0x7b, 0x00, 0x10, 0x00, 0x0a,
+ 0x00, 0x11, 0xff, 0xfa, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x27, 0xff, 0xb6,
+ 0x00, 0x2b, 0xff, 0xb8, 0x00, 0x33, 0xff, 0xbc, 0x00, 0x35, 0xff, 0xbe,
+ 0x00, 0x38, 0xff, 0x42, 0x00, 0x39, 0xff, 0xb4, 0x00, 0x3a, 0xff, 0x66,
+ 0x00, 0x3b, 0xff, 0x98, 0x00, 0x3d, 0xff, 0x35, 0x00, 0x45, 0xff, 0xf8,
+ 0x00, 0x46, 0x00, 0x08, 0x00, 0x47, 0xff, 0xe9, 0x00, 0x48, 0xff, 0xf0,
+ 0x00, 0x49, 0xff, 0xdf, 0x00, 0x4b, 0xff, 0xec, 0x00, 0x53, 0xff, 0xe5,
+ 0x00, 0x55, 0xff, 0xf0, 0x00, 0x58, 0xff, 0xdf, 0x00, 0x59, 0xff, 0xe7,
+ 0x00, 0x5a, 0xff, 0xc1, 0x00, 0x5b, 0xff, 0xd5, 0x00, 0x5d, 0xff, 0xba,
+ 0x00, 0x6e, 0xff, 0xa6, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x12,
+ 0x00, 0x0a, 0x00, 0x27, 0xff, 0xb6, 0x00, 0x2b, 0xff, 0xb8, 0x00, 0x33,
+ 0xff, 0xbc, 0x00, 0x35, 0xff, 0xbe, 0x00, 0x38, 0xff, 0x42, 0x00, 0x39,
+ 0xff, 0xb4, 0x00, 0x3a, 0xff, 0x66, 0x00, 0x3b, 0xff, 0x98, 0x00, 0x3d,
+ 0xff, 0x35, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0a,
+ 0x00, 0x27, 0xff, 0xb6, 0x00, 0x2b, 0xff, 0xb8, 0x00, 0x33, 0xff, 0xbc,
+ 0x00, 0x35, 0xff, 0xbe, 0x00, 0x38, 0xff, 0x42, 0x00, 0x39, 0xff, 0xb4,
+ 0x00, 0x3a, 0xff, 0x66, 0x00, 0x3b, 0xff, 0x98, 0x00, 0x3d, 0xff, 0x35,
+ 0x00, 0x1c, 0xff, 0xff, 0xff, 0xae, 0xff, 0xff, 0xff, 0x8d, 0xff, 0xff,
+ 0xff, 0x7b, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x11, 0xff, 0xfa, 0x00, 0x12,
+ 0x00, 0x0a, 0x00, 0x27, 0xff, 0xb6, 0x00, 0x2b, 0xff, 0xb8, 0x00, 0x33,
+ 0xff, 0xbc, 0x00, 0x35, 0xff, 0xbe, 0x00, 0x38, 0xff, 0x42, 0x00, 0x39,
+ 0xff, 0xb4, 0x00, 0x3a, 0xff, 0x66, 0x00, 0x3b, 0xff, 0x98, 0x00, 0x3d,
+ 0xff, 0x35, 0x00, 0x45, 0xff, 0xf8, 0x00, 0x46, 0x00, 0x08, 0x00, 0x47,
+ 0xff, 0xe9, 0x00, 0x48, 0xff, 0xf0, 0x00, 0x4b, 0xff, 0xec, 0x00, 0x53,
+ 0xff, 0xe5, 0x00, 0x55, 0xff, 0xf0, 0x00, 0x58, 0xff, 0xdf, 0x00, 0x59,
+ 0xff, 0xe7, 0x00, 0x5a, 0xff, 0xc1, 0x00, 0x5b, 0xff, 0xd5, 0x00, 0x5d,
+ 0xff, 0xba, 0x00, 0x6e, 0xff, 0xa6, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xae,
+ 0xff, 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff, 0x7b, 0x00, 0x10, 0x00, 0x0a,
+ 0x00, 0x11, 0xff, 0xfa, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x27, 0xff, 0xb6,
+ 0x00, 0x2b, 0xff, 0xb8, 0x00, 0x33, 0xff, 0xbc, 0x00, 0x35, 0xff, 0xbe,
+ 0x00, 0x38, 0xff, 0x42, 0x00, 0x39, 0xff, 0xb4, 0x00, 0x3a, 0xff, 0x66,
+ 0x00, 0x3b, 0xff, 0x98, 0x00, 0x3d, 0xff, 0x35, 0x00, 0x45, 0xff, 0xf8,
+ 0x00, 0x46, 0x00, 0x08, 0x00, 0x47, 0xff, 0xe9, 0x00, 0x48, 0xff, 0xf0,
+ 0x00, 0x49, 0xff, 0xdf, 0x00, 0x4b, 0xff, 0xec, 0x00, 0x53, 0xff, 0xe5,
+ 0x00, 0x55, 0xff, 0xf0, 0x00, 0x58, 0xff, 0xdf, 0x00, 0x59, 0xff, 0xe7,
+ 0x00, 0x5a, 0xff, 0xc1, 0x00, 0x5b, 0xff, 0xd5, 0x00, 0x5d, 0xff, 0xba,
+ 0x00, 0x6e, 0xff, 0xa6, 0x00, 0x01, 0x00, 0x25, 0xff, 0xc1, 0x00, 0x03,
+ 0x00, 0x38, 0xff, 0xaa, 0x00, 0x3a, 0xff, 0xa4, 0x00, 0x3d, 0xff, 0x87,
+ 0x00, 0x05, 0x00, 0x25, 0xff, 0xb8, 0x00, 0x38, 0xff, 0xaa, 0x00, 0x3a,
+ 0xff, 0xa4, 0x00, 0x3b, 0xff, 0xd1, 0x00, 0x3d, 0xff, 0x87, 0x00, 0x03,
+ 0x00, 0x38, 0xff, 0xaa, 0x00, 0x3a, 0xff, 0xa4, 0x00, 0x3d, 0xff, 0x87,
+ 0x00, 0x03, 0x00, 0x38, 0xff, 0xaa, 0x00, 0x3a, 0xff, 0xa4, 0x00, 0x3d,
+ 0xff, 0x87, 0x00, 0x06, 0x00, 0x25, 0xff, 0xb8, 0x00, 0x38, 0xff, 0xaa,
+ 0x00, 0x3a, 0xff, 0xa4, 0x00, 0x3b, 0xff, 0xd1, 0x00, 0x3c, 0xff, 0xa2,
+ 0x00, 0x3d, 0xff, 0x87, 0x00, 0x01, 0x00, 0x25, 0xff, 0xbc, 0x00, 0x01,
+ 0x00, 0x25, 0xff, 0xb6, 0x00, 0x07, 0x00, 0x10, 0xff, 0xc9, 0x00, 0x12,
+ 0xff, 0xcd, 0x00, 0x25, 0xff, 0xb6, 0x00, 0x51, 0xff, 0xf8, 0x00, 0x52,
+ 0xff, 0xf8, 0x00, 0x54, 0x00, 0x06, 0x00, 0x56, 0xff, 0xf8, 0x00, 0x01,
+ 0x00, 0x25, 0xff, 0xb6, 0x00, 0x08, 0x00, 0x10, 0xff, 0xc9, 0x00, 0x12,
+ 0xff, 0xcd, 0x00, 0x25, 0xff, 0xb6, 0x00, 0x46, 0x00, 0x06, 0x00, 0x51,
+ 0xff, 0xf8, 0x00, 0x52, 0xff, 0xf8, 0x00, 0x54, 0x00, 0x06, 0x00, 0x56,
+ 0xff, 0xf8, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xd5, 0x00, 0x5b, 0xff, 0xe5,
+ 0x00, 0x5d, 0xff, 0xcb, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xd5, 0x00, 0x5b,
+ 0xff, 0xe5, 0x00, 0x5d, 0xff, 0xcb, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xd5,
+ 0x00, 0x5b, 0xff, 0xe5, 0x00, 0x5d, 0xff, 0xcb, 0x00, 0x03, 0x00, 0x5a,
+ 0xff, 0xd5, 0x00, 0x5b, 0xff, 0xe5, 0x00, 0x5d, 0xff, 0xcb, 0x00, 0x03,
+ 0x00, 0x5a, 0xff, 0xdf, 0x00, 0x5b, 0xff, 0xec, 0x00, 0x5d, 0xff, 0xd7,
+ 0x00, 0x03, 0x00, 0x5a, 0xff, 0xe1, 0x00, 0x5b, 0xff, 0xee, 0x00, 0x5d,
+ 0xff, 0xd9, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xe1, 0x00, 0x5b, 0xff, 0xee,
+ 0x00, 0x5d, 0xff, 0xd9, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xdb, 0x00, 0x5b,
+ 0xff, 0xec, 0x00, 0x5d, 0xff, 0xd3, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xdb,
+ 0x00, 0x5b, 0xff, 0xec, 0x00, 0x5d, 0xff, 0xd3, 0x00, 0x01, 0x00, 0x58,
+ 0xff, 0xec, 0x00, 0x05, 0x00, 0x58, 0xff, 0xec, 0x00, 0x5a, 0xff, 0xdb,
+ 0x00, 0x5b, 0xff, 0xec, 0x00, 0x5c, 0xff, 0xc9, 0x00, 0x5d, 0xff, 0xd3,
+ 0x00, 0x02, 0x00, 0x11, 0x00, 0x25, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a,
+ 0x00, 0x2b, 0x00, 0x04, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x06, 0x00, 0x32,
+ 0x00, 0x34, 0x00, 0x09, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x0c, 0x00, 0x45,
+ 0x00, 0x47, 0x00, 0x15, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x18, 0x00, 0x4f,
+ 0x00, 0x5d, 0x00, 0x1d, 0x00, 0x83, 0x00, 0x88, 0x00, 0x2c, 0x00, 0x8a,
+ 0x00, 0x8a, 0x00, 0x32, 0x00, 0x95, 0x00, 0x99, 0x00, 0x33, 0x00, 0x9b,
+ 0x00, 0x9f, 0x00, 0x38, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0x3d, 0x00, 0xa7,
+ 0x00, 0xa9, 0x00, 0x3f, 0x00, 0xac, 0x00, 0xad, 0x00, 0x42, 0x00, 0xb5,
+ 0x00, 0xb7, 0x00, 0x44, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0x47, 0x00, 0x00
+};
+unsigned int FreeSans_ttf_len = 22932;
+
+#if 0
+void writeLogo(const char *dir)
+{
+ QCString fileName=(QCString)dir+"/doxygen.png";
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ f.writeBlock((char *)doxygen_png_data,doxygen_png_len);
+ else
+ {
+ fprintf(stderr,"warning: Cannot open file %s for writing\n",fileName.data());
+ }
+ f.close();
+}
+
+void writeSearchButton(const char *dir)
+{
+ QCString fileName=(QCString)dir+"/search.png";
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ f.writeBlock((char *)search_png,search_png_len);
+ else
+ {
+ fprintf(stderr,"warning: Cannot open file %s for writing\n",fileName.data());
+ }
+ f.close();
+}
+#endif
+
+void writeDoxFont(const char *dir)
+{
+ QCString fileName=(QCString)dir+"/FreeSans.ttf";
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ f.writeBlock((char *)FreeSans_ttf,FreeSans_ttf_len);
+ else
+ {
+ fprintf(stderr,"error: Cannot open file %s for writing\n",fileName.data());
+ }
+ f.close();
+}
+
+void removeDoxFont(const char *dir)
+{
+ QDir d(dir);
+ d.remove("FreeSans.ttf");
+}
diff --git a/src/logos.h b/src/logos.h
new file mode 100644
index 0000000..b3c6fc7
--- /dev/null
+++ b/src/logos.h
@@ -0,0 +1,27 @@
+/******************************************************************************
+ *
+ * $Id: logos.h,v 1.9 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef LOGOS_H
+#define LOGOS_H
+
+extern void writeLogo(const char *dir);
+//extern void writeNullImage(const char *dir);
+extern void writeSearchButton(const char *dir);
+extern void writeDoxFont(const char *dir);
+extern void removeDoxFont(const char *dir);
+
+#endif
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..9bf7f88
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,41 @@
+/******************************************************************************
+ *
+ * $Id: main.cpp,v 1.86 2001/01/01 10:15:16 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "doxygen.h"
+
+/*! \file
+ * \brief main entry point for doxygen
+ *
+ * This file contains main()
+ */
+
+/*! Default main. The idea of separating this from the rest of doxygen,
+ * is to make it possible to write your own main, with a different
+ * generateOutput() function for instance.
+ */
+int main(int argc,char **argv)
+{
+ initDoxygen();
+ readConfiguration(argc,argv);
+ checkConfiguration();
+ adjustConfiguration();
+ parseInput();
+ generateOutput();
+ return 0;
+}
+
diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp
new file mode 100644
index 0000000..37c75cc
--- /dev/null
+++ b/src/mandocvisitor.cpp
@@ -0,0 +1,959 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "mandocvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "code.h"
+#include "dot.h"
+#include "util.h"
+#include "message.h"
+#include <qfileinfo.h>
+#include "parserintf.h"
+
+ManDocVisitor::ManDocVisitor(FTextStream &t,CodeOutputInterface &ci,
+ const char *langExt)
+ : DocVisitor(DocVisitor_Man), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE), m_firstCol(TRUE),
+ m_indent(0), m_langExt(langExt)
+{
+}
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+void ManDocVisitor::visit(DocWord *w)
+{
+ if (m_hide) return;
+ filter(w->word());
+ m_firstCol=FALSE;
+}
+
+void ManDocVisitor::visit(DocLinkedWord *w)
+{
+ if (m_hide) return;
+ m_t << "\\fB";
+ filter(w->word());
+ m_t << "\\fP";
+ m_firstCol=FALSE;
+}
+
+void ManDocVisitor::visit(DocWhiteSpace *w)
+{
+ if (m_hide) return;
+ if (m_insidePre)
+ {
+ m_t << w->chars();
+ m_firstCol=w->chars().at(w->chars().length()-1)=='\n';
+ }
+ else
+ {
+ m_t << " ";
+ m_firstCol=FALSE;
+ }
+}
+
+void ManDocVisitor::visit(DocSymbol *s)
+{
+ if (m_hide) return;
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "\\\\"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: m_t << "<"; break;
+ case DocSymbol::Greater: m_t << ">"; break;
+ case DocSymbol::Amp: m_t << "&"; break;
+ case DocSymbol::Dollar: m_t << "$"; break;
+ case DocSymbol::Hash: m_t << "#"; break;
+ case DocSymbol::DoubleColon: m_t << "::"; break;
+ case DocSymbol::Percent: m_t << "%"; break;
+ case DocSymbol::Copy: m_t << "(C)"; break;
+ case DocSymbol::Tm: m_t << "(TM)"; break;
+ case DocSymbol::Reg: m_t << "(R)"; break;
+ case DocSymbol::Apos: m_t << "'"; break;
+ case DocSymbol::Quot: m_t << "\""; break;
+ case DocSymbol::Lsquo: m_t << "`"; break;
+ case DocSymbol::Rsquo: m_t << "'"; break;
+ case DocSymbol::Ldquo: m_t << "``"; break;
+ case DocSymbol::Rdquo: m_t << "''"; break;
+ case DocSymbol::Ndash: m_t << "--"; break;
+ case DocSymbol::Mdash: m_t << "---"; break;
+ case DocSymbol::Uml: m_t << s->letter() << "\\*(4"; break;
+ case DocSymbol::Acute: m_t << s->letter() << "\\*(`"; break;
+ case DocSymbol::Grave: m_t << s->letter() << "\\*:"; break;
+ case DocSymbol::Circ: m_t << s->letter() << "\\*^"; break;
+ case DocSymbol::Slash: m_t << s->letter(); break; /* todo: implement this */
+ case DocSymbol::Tilde: m_t << s->letter() << "\\*~"; break;
+ case DocSymbol::Szlig: m_t << "s\\*:"; break;
+ case DocSymbol::Cedil: m_t << s->letter() << "\\*,"; break;
+ case DocSymbol::Ring: m_t << s->letter() << "\\*o"; break;
+ case DocSymbol::Nbsp: m_t << " "; break;
+ default:
+ err("error: unknown symbol found\n");
+ }
+ m_firstCol=FALSE;
+}
+
+void ManDocVisitor::visit(DocURL *u)
+{
+ if (m_hide) return;
+ m_t << u->url();
+ m_firstCol=FALSE;
+}
+
+void ManDocVisitor::visit(DocLineBreak *)
+{
+ if (m_hide) return;
+ m_t << endl << ".br" << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visit(DocHorRuler *)
+{
+ if (m_hide) return;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visit(DocStyleChange *s)
+{
+ if (m_hide) return;
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) m_t << "\\fB"; else m_t << "\\fP";
+ m_firstCol=FALSE;
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) m_t << "\\fI"; else m_t << "\\fP";
+ m_firstCol=FALSE;
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) m_t << "\\fC"; else m_t << "\\fP";
+ m_firstCol=FALSE;
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) m_t << "\\*<"; else m_t << "\\*> ";
+ m_firstCol=FALSE;
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) m_t << "\\*{"; else m_t << "\\*} ";
+ m_firstCol=FALSE;
+ break;
+ case DocStyleChange::Center:
+ /* not supported */
+ break;
+ case DocStyleChange::Small:
+ /* not supported */
+ break;
+ case DocStyleChange::Preformatted:
+ if (s->enable())
+ {
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_t << ".nf" << endl;
+ m_insidePre=TRUE;
+ }
+ else
+ {
+ m_insidePre=FALSE;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".fi" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+ }
+ break;
+ case DocStyleChange::Div: /* HTML only */ break;
+ case DocStyleChange::Span: /* HTML only */ break;
+ }
+}
+
+void ManDocVisitor::visit(DocVerbatim *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocVerbatim::Code: // fall though
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_t << ".nf" << endl;
+ Doxygen::parserManager->getParser(0/*TODO*/)
+ ->parseCode(m_ci,s->context(),s->text(),
+ s->isExample(),s->exampleFile());
+ if (!m_firstCol) m_t << endl;
+ m_t << ".fi" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+ break;
+ case DocVerbatim::Verbatim:
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_t << ".nf" << endl;
+ m_t << s->text();
+ if (!m_firstCol) m_t << endl;
+ m_t << ".fi" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+ break;
+ case DocVerbatim::ManOnly:
+ m_t << s->text();
+ break;
+ case DocVerbatim::HtmlOnly:
+ case DocVerbatim::XmlOnly:
+ case DocVerbatim::LatexOnly:
+ case DocVerbatim::Dot:
+ case DocVerbatim::Msc:
+ /* nothing */
+ break;
+ }
+}
+
+void ManDocVisitor::visit(DocAnchor *)
+{
+ /* no support for anchors in man pages */
+}
+
+void ManDocVisitor::visit(DocInclude *inc)
+{
+ if (m_hide) return;
+ switch(inc->type())
+ {
+ case DocInclude::IncWithLines:
+ {
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_t << ".nf" << endl;
+ QFileInfo cfi( inc->file() );
+ FileDef fd( cfi.dirPath(), cfi.fileName() );
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),
+ inc->isExample(),
+ inc->exampleFile(), &fd);
+ if (!m_firstCol) m_t << endl;
+ m_t << ".fi" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+ }
+ break;
+ case DocInclude::Include:
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_t << ".nf" << endl;
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),inc->isExample(),
+ inc->exampleFile());
+ if (!m_firstCol) m_t << endl;
+ m_t << ".fi" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+ break;
+ case DocInclude::DontInclude:
+ break;
+ case DocInclude::HtmlInclude:
+ break;
+ case DocInclude::VerbInclude:
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_t << ".nf" << endl;
+ m_t << inc->text();
+ if (!m_firstCol) m_t << endl;
+ m_t << ".fi" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+ break;
+ }
+}
+
+void ManDocVisitor::visit(DocIncOperator *op)
+{
+ //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
+ // op->type(),op->isFirst(),op->isLast(),op->text().data());
+ if (op->isFirst())
+ {
+ if (!m_hide)
+ {
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_t << ".nf" << endl;
+ }
+ pushEnabled();
+ m_hide = TRUE;
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ popEnabled();
+ if (!m_hide)
+ {
+ Doxygen::parserManager->getParser(0/*TODO*/)
+ ->parseCode(m_ci,op->context(),op->text(),
+ op->isExample(),op->exampleFile());
+ }
+ pushEnabled();
+ m_hide=TRUE;
+ }
+ if (op->isLast())
+ {
+ popEnabled();
+ if (!m_hide)
+ {
+ if (!m_firstCol) m_t << endl;
+ m_t << ".fi" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+ }
+ }
+ else
+ {
+ if (!m_hide) m_t << endl;
+ }
+}
+
+void ManDocVisitor::visit(DocFormula *f)
+{
+ if (m_hide) return;
+ m_t << f->text();
+}
+
+void ManDocVisitor::visit(DocIndexEntry *)
+{
+}
+
+void ManDocVisitor::visit(DocSimpleSectSep *)
+{
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void ManDocVisitor::visitPre(DocAutoList *)
+{
+ if (m_hide) return;
+ m_indent+=2;
+}
+
+void ManDocVisitor::visitPost(DocAutoList *)
+{
+ if (m_hide) return;
+ m_indent-=2;
+ m_t << ".PP" << endl;
+}
+
+void ManDocVisitor::visitPre(DocAutoListItem *li)
+{
+ if (m_hide) return;
+ QCString ws;
+ ws.fill(' ',m_indent-2);
+ if (!m_firstCol) m_t << endl;
+ m_t << ".IP \"" << ws;
+ if (((DocAutoList *)li->parent())->isEnumList())
+ {
+ m_t << li->itemNumber() << ".\" " << m_indent+2;
+ }
+ else // bullet list
+ {
+ m_t << "\\(bu\" " << m_indent;
+ }
+ m_t << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPost(DocAutoListItem *)
+{
+ if (m_hide) return;
+ m_t << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocPara *)
+{
+}
+
+void ManDocVisitor::visitPost(DocPara *p)
+{
+ if (m_hide) return;
+ if (!p->isLast() && // omit <p> for last paragraph
+ !(p->parent() && // and for parameter sections
+ p->parent()->kind()==DocNode::Kind_ParamSect
+ )
+ )
+ {
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+ }
+}
+
+void ManDocVisitor::visitPre(DocRoot *)
+{
+}
+
+void ManDocVisitor::visitPost(DocRoot *)
+{
+}
+
+void ManDocVisitor::visitPre(DocSimpleSect *s)
+{
+ if (m_hide) return;
+ if (!m_firstCol)
+ {
+ m_t << endl;
+ m_t << ".PP" << endl;
+ }
+ m_t << "\\fB";
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ m_t << theTranslator->trSeeAlso(); break;
+ case DocSimpleSect::Return:
+ m_t << theTranslator->trReturns(); break;
+ case DocSimpleSect::Author:
+ m_t << theTranslator->trAuthor(TRUE,TRUE); break;
+ case DocSimpleSect::Authors:
+ m_t << theTranslator->trAuthor(TRUE,FALSE); break;
+ case DocSimpleSect::Version:
+ m_t << theTranslator->trVersion(); break;
+ case DocSimpleSect::Since:
+ m_t << theTranslator->trSince(); break;
+ case DocSimpleSect::Date:
+ m_t << theTranslator->trDate(); break;
+ case DocSimpleSect::Note:
+ m_t << theTranslator->trNote(); break;
+ case DocSimpleSect::Warning:
+ m_t << theTranslator->trWarning(); break;
+ case DocSimpleSect::Pre:
+ m_t << theTranslator->trPrecondition(); break;
+ case DocSimpleSect::Post:
+ m_t << theTranslator->trPostcondition(); break;
+ case DocSimpleSect::Invar:
+ m_t << theTranslator->trInvariant(); break;
+ case DocSimpleSect::Remark:
+ m_t << theTranslator->trRemarks(); break;
+ case DocSimpleSect::Attention:
+ m_t << theTranslator->trAttention(); break;
+ case DocSimpleSect::User: break;
+ case DocSimpleSect::Rcs: break;
+ case DocSimpleSect::Unknown: break;
+ }
+
+ // special case 1: user defined title
+ if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
+ {
+ m_t << ":\\fP" << endl;
+ m_t << ".RS 4" << endl;
+ }
+}
+
+void ManDocVisitor::visitPost(DocSimpleSect *)
+{
+ if (m_hide) return;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".RE" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocTitle *)
+{
+}
+
+void ManDocVisitor::visitPost(DocTitle *)
+{
+ if (m_hide) return;
+ m_t << "\\fP" << endl;
+ m_t << ".RS 4" << endl;
+}
+
+void ManDocVisitor::visitPre(DocSimpleList *)
+{
+ if (m_hide) return;
+ m_indent+=2;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PD 0" << endl;
+}
+
+void ManDocVisitor::visitPost(DocSimpleList *)
+{
+ if (m_hide) return;
+ m_indent-=2;
+ m_t << ".PP" << endl;
+}
+
+void ManDocVisitor::visitPre(DocSimpleListItem *)
+{
+ if (m_hide) return;
+ QCString ws;
+ ws.fill(' ',m_indent-2);
+ if (!m_firstCol) m_t << endl;
+ m_t << ".IP \"" << ws << "\\(bu\" " << m_indent << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPost(DocSimpleListItem *)
+{
+ if (m_hide) return;
+ m_t << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocSection *s)
+{
+ if (m_hide) return;
+ if (!m_firstCol) m_t << endl;
+ if (s->level()==1) m_t << ".SH"; else m_t << ".SS";
+ m_t << " \"";
+ filter(s->title());
+ m_t << "\"" << endl;
+ if (s->level()==1) m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPost(DocSection *)
+{
+}
+
+void ManDocVisitor::visitPre(DocHtmlList *)
+{
+ if (m_hide) return;
+ m_indent+=2;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PD 0" << endl;
+}
+
+void ManDocVisitor::visitPost(DocHtmlList *)
+{
+ if (m_hide) return;
+ m_indent-=2;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+}
+
+void ManDocVisitor::visitPre(DocHtmlListItem *li)
+{
+ if (m_hide) return;
+ QCString ws;
+ ws.fill(' ',m_indent-2);
+ if (!m_firstCol) m_t << endl;
+ m_t << ".IP \"" << ws;
+ if (((DocHtmlList *)li->parent())->type()==DocHtmlList::Ordered)
+ {
+ m_t << li->itemNumber() << ".\" " << m_indent+2;
+ }
+ else // bullet list
+ {
+ m_t << "\\(bu\" " << m_indent;
+ }
+ m_t << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPost(DocHtmlListItem *)
+{
+ if (m_hide) return;
+ m_t << endl;
+ m_firstCol=TRUE;
+}
+
+//void ManDocVisitor::visitPre(DocHtmlPre *)
+//{
+// if (!m_firstCol) m_t << endl;
+// m_t << ".PP" << endl;
+// m_t << ".nf" << endl;
+// m_insidePre=TRUE;
+//}
+//
+//void ManDocVisitor::visitPost(DocHtmlPre *)
+//{
+// m_insidePre=FALSE;
+// if (!m_firstCol) m_t << endl;
+// m_t << ".fi" << endl;
+// m_t << ".PP" << endl;
+// m_firstCol=TRUE;
+//}
+
+void ManDocVisitor::visitPre(DocHtmlDescList *)
+{
+}
+
+void ManDocVisitor::visitPost(DocHtmlDescList *)
+{
+ if (m_hide) return;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".IP \"\\fB";
+ m_firstCol=FALSE;
+}
+
+void ManDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ m_t << "\\fP\" 1c" << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocHtmlDescData *)
+{
+}
+
+void ManDocVisitor::visitPost(DocHtmlDescData *)
+{
+}
+
+void ManDocVisitor::visitPre(DocHtmlTable *)
+{
+}
+
+void ManDocVisitor::visitPost(DocHtmlTable *)
+{
+}
+
+void ManDocVisitor::visitPre(DocHtmlCaption *)
+{
+}
+
+void ManDocVisitor::visitPost(DocHtmlCaption *)
+{
+}
+
+void ManDocVisitor::visitPre(DocHtmlRow *)
+{
+}
+
+void ManDocVisitor::visitPost(DocHtmlRow *)
+{
+}
+
+void ManDocVisitor::visitPre(DocHtmlCell *)
+{
+}
+
+void ManDocVisitor::visitPost(DocHtmlCell *)
+{
+}
+
+void ManDocVisitor::visitPre(DocInternal *)
+{
+ if (m_hide) return;
+ //if (!m_firstCol) m_t << endl;
+ //m_t << ".PP" << endl;
+ //m_t << "\\fB" << theTranslator->trForInternalUseOnly() << "\\fP" << endl;
+ //m_t << ".RS 4" << endl;
+}
+
+void ManDocVisitor::visitPost(DocInternal *)
+{
+ if (m_hide) return;
+ //if (!m_firstCol) m_t << endl;
+ //m_t << ".RE" << endl;
+ //m_t << ".PP" << endl;
+ //m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocHRef *)
+{
+ if (m_hide) return;
+ m_t << "\\fC";
+}
+
+void ManDocVisitor::visitPost(DocHRef *)
+{
+ if (m_hide) return;
+ m_t << "\\fP";
+}
+
+void ManDocVisitor::visitPre(DocHtmlHeader *header)
+{
+ if (m_hide) return;
+ if (!m_firstCol) m_t << endl;
+ if (header->level()==1) m_t << ".SH"; else m_t << ".SS";
+ m_t << " \"";
+}
+
+void ManDocVisitor::visitPost(DocHtmlHeader *header)
+{
+ if (m_hide) return;
+ m_t << "\"" << endl;
+ if (header->level()==1) m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocImage *)
+{
+}
+
+void ManDocVisitor::visitPost(DocImage *)
+{
+}
+
+void ManDocVisitor::visitPre(DocDotFile *)
+{
+}
+
+void ManDocVisitor::visitPost(DocDotFile *)
+{
+}
+void ManDocVisitor::visitPre(DocMscFile *)
+{
+}
+
+void ManDocVisitor::visitPost(DocMscFile *)
+{
+}
+
+
+void ManDocVisitor::visitPre(DocLink *)
+{
+ if (m_hide) return;
+ m_t << "\\fB";
+}
+
+void ManDocVisitor::visitPost(DocLink *)
+{
+ if (m_hide) return;
+ m_t << "\\fP";
+}
+
+void ManDocVisitor::visitPre(DocRef *ref)
+{
+ if (m_hide) return;
+ m_t << "\\fB";
+ if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void ManDocVisitor::visitPost(DocRef *)
+{
+ if (m_hide) return;
+ m_t << "\\fP";
+}
+
+void ManDocVisitor::visitPre(DocSecRefItem *)
+{
+ if (m_hide) return;
+ QCString ws;
+ ws.fill(' ',m_indent-2);
+ if (!m_firstCol) m_t << endl;
+ m_t << ".IP \"" << ws << "\\(bu\" " << m_indent << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPost(DocSecRefItem *)
+{
+ if (m_hide) return;
+ m_t << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocSecRefList *)
+{
+ if (m_hide) return;
+ m_indent+=2;
+}
+
+void ManDocVisitor::visitPost(DocSecRefList *)
+{
+ if (m_hide) return;
+ m_indent-=2;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".PP" << endl;
+}
+
+//void ManDocVisitor::visitPre(DocLanguage *l)
+//{
+// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
+// if (l->id().lower()!=langId.lower())
+// {
+// pushEnabled();
+// m_hide = TRUE;
+// }
+//}
+//
+//void ManDocVisitor::visitPost(DocLanguage *l)
+//{
+// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
+// if (l->id().lower()!=langId.lower())
+// {
+// popEnabled();
+// }
+//}
+
+void ManDocVisitor::visitPre(DocParamSect *s)
+{
+ if (m_hide) return;
+ if (!m_firstCol)
+ {
+ m_t << endl;
+ m_t << ".PP" << endl;
+ }
+ m_t << "\\fB";
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ m_t << theTranslator->trParameters(); break;
+ case DocParamSect::RetVal:
+ m_t << theTranslator->trReturnValues(); break;
+ case DocParamSect::Exception:
+ m_t << theTranslator->trExceptions(); break;
+ case DocParamSect::TemplateParam:
+ /* TODO: add this
+ m_t << theTranslator->trTemplateParam(); break;
+ */
+ m_t << "Template Parameters"; break;
+ default:
+ ASSERT(0);
+ }
+ m_t << ":\\fP" << endl;
+ m_t << ".RS 4" << endl;
+}
+
+void ManDocVisitor::visitPost(DocParamSect *)
+{
+ if (m_hide) return;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".RE" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocParamList *pl)
+{
+ if (m_hide) return;
+ m_t << "\\fI";
+ //QStrListIterator li(pl->parameters());
+ //const char *s;
+ QListIterator<DocNode> li(pl->parameters());
+ DocNode *param;
+ bool first=TRUE;
+ for (li.toFirst();(param=li.current());++li)
+ {
+ if (!first) m_t << ","; else first=FALSE;
+ if (param->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)param);
+ }
+ else if (param->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)param);
+ }
+ }
+ m_t << "\\fP ";
+}
+
+void ManDocVisitor::visitPost(DocParamList *pl)
+{
+ if (m_hide) return;
+ if (!pl->isLast())
+ {
+ if (!m_firstCol) m_t << endl;
+ m_t << ".br" << endl;
+ }
+}
+
+void ManDocVisitor::visitPre(DocXRefItem *x)
+{
+ if (m_hide) return;
+ if (!m_firstCol)
+ {
+ m_t << endl;
+ m_t << ".PP" << endl;
+ }
+ m_t << "\\fB";
+ filter(x->title());
+ m_t << "\\fP" << endl;
+ m_t << ".RS 4" << endl;
+}
+
+void ManDocVisitor::visitPost(DocXRefItem *)
+{
+ if (m_hide) return;
+ if (!m_firstCol) m_t << endl;
+ m_t << ".RE" << endl;
+ m_t << ".PP" << endl;
+ m_firstCol=TRUE;
+}
+
+void ManDocVisitor::visitPre(DocInternalRef *)
+{
+ if (m_hide) return;
+ m_t << "\\fB";
+}
+
+void ManDocVisitor::visitPost(DocInternalRef *)
+{
+ if (m_hide) return;
+ m_t << "\\fP";
+}
+
+void ManDocVisitor::visitPre(DocCopy *)
+{
+}
+
+void ManDocVisitor::visitPost(DocCopy *)
+{
+}
+
+void ManDocVisitor::visitPre(DocText *)
+{
+}
+
+void ManDocVisitor::visitPost(DocText *)
+{
+}
+
+void ManDocVisitor::filter(const char *str)
+{
+ if (str)
+ {
+ const char *p=str;
+ char c=0;
+ while ((c=*p++))
+ {
+ switch(c)
+ {
+ case '\\': m_t << "\\\\"; break;
+ case '"': c = '\''; // fall through
+ default: m_t << c; break;
+ }
+ }
+ }
+}
+
+void ManDocVisitor::pushEnabled()
+{
+ m_enabled.push(new bool(m_hide));
+}
+
+void ManDocVisitor::popEnabled()
+{
+ bool *v=m_enabled.pop();
+ ASSERT(v!=0);
+ m_hide = *v;
+ delete v;
+}
+
diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h
new file mode 100644
index 0000000..706e844
--- /dev/null
+++ b/src/mandocvisitor.h
@@ -0,0 +1,157 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _MANDOCVISITOR_H
+#define _MANDOCVISITOR_H
+
+#include "docvisitor.h"
+#include <qstack.h>
+#include <qcstring.h>
+
+class FTextStream;
+class CodeOutputInterface;
+
+/*! @brief Concrete visitor implementation for LaTeX output. */
+class ManDocVisitor : public DocVisitor
+{
+ public:
+ ManDocVisitor(FTextStream &t,CodeOutputInterface &ci,const char *langExt);
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
+ void visit(DocIndexEntry *);
+ void visit(DocSimpleSectSep *);
+
+ //--------------------------------------
+ // visitor functions for compound nodes
+ //--------------------------------------
+
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *);
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *s);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *s);
+ void visitPost(DocHtmlList *s);
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ //void visitPre(DocHtmlPre *);
+ //void visitPost(DocHtmlPre *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *t);
+ void visitPost(DocHtmlTable *t);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *) ;
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+ void visitPre(DocMscFile *);
+ void visitPost(DocMscFile *);
+ void visitPre(DocLink *lnk);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *ref);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ //void visitPre(DocLanguage *);
+ //void visitPost(DocLanguage *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
+ void visitPre(DocText *);
+ void visitPost(DocText *);
+
+ private:
+
+ //--------------------------------------
+ // helper functions
+ //--------------------------------------
+
+ void filter(const char *str);
+
+ void pushEnabled();
+ void popEnabled();
+
+ //--------------------------------------
+ // state variables
+ //--------------------------------------
+
+ FTextStream &m_t;
+ CodeOutputInterface &m_ci;
+ bool m_insidePre;
+ bool m_hide;
+ bool m_firstCol;
+ int m_indent;
+ QStack<bool> m_enabled;
+ QCString m_langExt;
+};
+
+#endif
diff --git a/src/mangen.cpp b/src/mangen.cpp
new file mode 100644
index 0000000..33495fd
--- /dev/null
+++ b/src/mangen.cpp
@@ -0,0 +1,742 @@
+/******************************************************************************
+ *
+ * $Id: htmlgen.cpp,v 1.17 1998/11/28 11:33:19 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/* http://www.cubic.org/source/archive/fileform/txt/man/ has some
+ nice introductions to groff and man pages. */
+
+#include <stdlib.h>
+
+#include "qtbc.h"
+#include <qdir.h>
+#include "message.h"
+#include "mangen.h"
+#include "config.h"
+#include "util.h"
+#include "doxygen.h"
+#include <string.h>
+#include "docparser.h"
+#include "mandocvisitor.h"
+
+static QCString getExtension()
+{
+ QCString ext = Config_getString("MAN_EXTENSION");
+ if( ext.length() >= 2 &&
+ ext.data()[0] == '.')
+ {
+ ext = ext.mid(1, ext.length()-1);
+ }
+ else
+ {
+ ext = "3";
+ }
+ return ext;
+}
+
+ManGenerator::ManGenerator() : OutputGenerator()
+{
+ dir=Config_getString("MAN_OUTPUT")+"/man" + getExtension();
+ firstCol=TRUE;
+ paragraph=FALSE;
+ col=0;
+ upperCase=FALSE;
+ insideTabbing=FALSE;
+ inHeader=FALSE;
+}
+
+ManGenerator::~ManGenerator()
+{
+}
+
+//void ManGenerator::append(const OutputGenerator *g)
+//{
+// QCString r=g->getContents();
+// if (upperCase)
+// t << r.upper();
+// else
+// t << r;
+// if (!r.isEmpty())
+// firstCol = r.at(r.length()-1)=='\n';
+// else
+// firstCol = ((ManGenerator *)g)->firstCol;
+// col+=((ManGenerator *)g)->col;
+// inHeader=((ManGenerator *)g)->inHeader;
+// paragraph=FALSE;
+//}
+
+void ManGenerator::init()
+{
+ QCString ext = getExtension();
+ QCString &manOutput = Config_getString("MAN_OUTPUT");
+
+ QDir d(manOutput);
+ if (!d.exists() && !d.mkdir(manOutput))
+ {
+ err("Could not create output directory %s\n",manOutput.data());
+ exit(1);
+ }
+ d.setPath(manOutput+"/man"+ext);
+ if (!d.exists() && !d.mkdir(manOutput+"/man"+ext))
+ {
+ err("Could not create output directory %s/man%s\n",manOutput.data(),ext.data());
+ exit(1);
+ }
+ createSubDirs(d);
+}
+
+static QCString buildFileName(const char *name)
+{
+ QCString fileName;
+ if (name==0) return "noname";
+
+ const char *p=name;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case ':':
+ fileName+="_";
+ if (*p==':') p++;
+ break;
+ case '<':
+ case '>':
+ case '&':
+ case '*':
+ case '!':
+ case '^':
+ case '~':
+ case '%':
+ case '+':
+ case '/':
+ fileName+="_";
+ break;
+ default:
+ fileName+=c;
+ }
+ }
+
+ QCString &manExtension = Config_getString("MAN_EXTENSION");
+ if (convertToQCString(fileName.right(2))!=manExtension)
+ {
+ fileName+=manExtension;
+ }
+
+ return fileName;
+}
+
+void ManGenerator::startFile(const char *,const char *manName,const char *)
+{
+ startPlainFile( buildFileName( manName ) );
+ firstCol=TRUE;
+}
+
+void ManGenerator::endFile()
+{
+ t << endl;
+ endPlainFile();
+}
+
+void ManGenerator::endTitleHead(const char *,const char *name)
+{
+ t << ".TH \"" << name << "\" " << getExtension() << " \""
+ << dateToString(FALSE) << "\" \"";
+ if (!Config_getString("PROJECT_NUMBER").isEmpty())
+ t << "Version " << Config_getString("PROJECT_NUMBER") << "\" \"";
+ if (Config_getString("PROJECT_NAME").isEmpty())
+ t << "Doxygen";
+ else
+ t << Config_getString("PROJECT_NAME");
+ t << "\" \\\" -*- nroff -*-" << endl;
+ t << ".ad l" << endl;
+ t << ".nh" << endl;
+ t << ".SH NAME" << endl;
+ t << name << " \\- ";
+ firstCol=FALSE;
+ inHeader=TRUE;
+}
+
+void ManGenerator::newParagraph()
+{
+ if (!paragraph)
+ {
+ if (!firstCol) t << endl;
+ t << ".PP" << endl;
+ firstCol=TRUE;
+ }
+ paragraph=TRUE;
+}
+
+void ManGenerator::startParagraph()
+{
+ if (!paragraph)
+ {
+ if (!firstCol) t << endl;
+ t << ".PP" << endl;
+ firstCol=TRUE;
+ }
+ paragraph=TRUE;
+}
+
+void ManGenerator::endParagraph()
+{
+}
+
+void ManGenerator::writeString(const char *text)
+{
+ docify(text);
+}
+
+void ManGenerator::startIndexItem(const char *,const char *)
+{
+}
+
+void ManGenerator::endIndexItem(const char *,const char *)
+{
+}
+
+void ManGenerator::writeStartAnnoItem(const char *,const char *,
+ const char *,const char *)
+{
+}
+
+void ManGenerator::writeObjectLink(const char *,const char *,
+ const char *, const char *name)
+{
+ startBold(); docify(name); endBold();
+}
+
+void ManGenerator::writeCodeLink(const char *,const char *,
+ const char *, const char *name,
+ const char *)
+{
+ docify(name);
+}
+
+void ManGenerator::startHtmlLink(const char *)
+{
+}
+
+void ManGenerator::endHtmlLink()
+{
+}
+
+//void ManGenerator::writeMailLink(const char *url)
+//{
+// docify(url);
+//}
+
+void ManGenerator::startGroupHeader(int)
+{
+ if (!firstCol) t << endl;
+ t << ".SH \"";
+ upperCase=TRUE;
+ firstCol=FALSE;
+}
+
+void ManGenerator::endGroupHeader(int)
+{
+ t << "\"\n.PP " << endl;
+ firstCol=TRUE;
+ paragraph=TRUE;
+ upperCase=FALSE;
+}
+
+void ManGenerator::startMemberHeader(const char *)
+{
+ if (!firstCol) t << endl;
+ t << ".SS \"";
+}
+
+void ManGenerator::endMemberHeader()
+{
+ t << "\"\n";
+ firstCol=TRUE;
+ paragraph=FALSE;
+}
+
+void ManGenerator::docify(const char *str)
+{
+ if (str)
+ {
+ const char *p=str;
+ char c=0;
+ while ((c=*p++))
+ {
+ switch(c)
+ {
+ case '\\': t << "\\\\"; col++; break;
+ case '\n': t << "\n"; col=0; break;
+ case '\"': c = '\''; // no break!
+ default: t << c; col++; break;
+ }
+ }
+ firstCol=(c=='\n');
+ //printf("%s",str);fflush(stdout);
+ }
+ paragraph=FALSE;
+}
+
+void ManGenerator::codify(const char *str)
+{
+ //static char spaces[]=" ";
+ if (str)
+ {
+ const char *p=str;
+ char c;
+ int spacesToNextTabStop;
+ while (*p)
+ {
+ c=*p++;
+ switch(c)
+ {
+ case '\t': spacesToNextTabStop =
+ Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
+ t << Doxygen::spaces.left(spacesToNextTabStop);
+ col+=spacesToNextTabStop;
+ break;
+ case '\n': t << "\n"; firstCol=TRUE; col=0; break;
+ case '\\': t << "\\"; col++; break;
+ case '\"': c = '\''; // no break!
+ default: t << c; firstCol=FALSE; col++; break;
+ }
+ }
+ //printf("%s",str);fflush(stdout);
+ }
+ paragraph=FALSE;
+}
+
+void ManGenerator::writeChar(char c)
+{
+ firstCol=(c=='\n');
+ if (firstCol) col=0; else col++;
+ switch (c)
+ {
+ case '\\': t << "\\\\"; break;
+ case '\"': c = '\''; // no break!
+ default: t << c; break;
+ }
+ //printf("%c",c);fflush(stdout);
+ paragraph=FALSE;
+}
+
+void ManGenerator::startDescList(SectionTypes)
+{
+ if (!firstCol)
+ { t << endl << ".PP" << endl;
+ firstCol=TRUE; paragraph=TRUE;
+ col=0;
+ }
+ paragraph=FALSE;
+ startBold();
+}
+
+void ManGenerator::startTitle()
+{
+ if (!firstCol) t << endl;
+ t << ".SH \"";
+ firstCol=FALSE;
+ paragraph=FALSE;
+}
+
+void ManGenerator::endTitle()
+{
+ t << "\"";
+}
+
+void ManGenerator::startItemListItem()
+{
+ if (!firstCol) t << endl;
+ t << ".TP" << endl;
+ firstCol=TRUE;
+ paragraph=FALSE;
+ col=0;
+}
+
+void ManGenerator::endItemListItem()
+{
+}
+
+void ManGenerator::startCodeFragment()
+{
+ newParagraph();
+ t << ".nf" << endl;
+ firstCol=TRUE;
+ paragraph=FALSE;
+}
+
+void ManGenerator::endCodeFragment()
+{
+ if (!firstCol) t << endl;
+ t << ".fi" << endl;
+ firstCol=TRUE;
+ paragraph=FALSE;
+ col=0;
+}
+
+void ManGenerator::startMemberDoc(const char *,const char *,const char *,const char *,bool)
+{
+ if (!firstCol) t << endl;
+ t << ".SS \"";
+ firstCol=FALSE;
+ paragraph=FALSE;
+}
+
+void ManGenerator::startDoxyAnchor(const char *,const char *manName,
+ const char *, const char *name,
+ const char *)
+{
+ // something to be done?
+ if( !Config_getBool("MAN_LINKS") )
+ {
+ return; // no
+ }
+
+ // the name of the link file is derived from the name of the anchor:
+ // - truncate after an (optional) ::
+ QCString baseName = name;
+ int i=baseName.findRev("::");
+ if (i!=-1) baseName=baseName.right(baseName.length()-i-2);
+
+ //printf("Converting man link '%s'->'%s'->'%s'\n",
+ // name,baseName.data(),buildFileName(baseName).data());
+
+ // - remove dangerous characters and append suffix, then add dir prefix
+ QCString fileName=dir+"/"+buildFileName( baseName );
+ QFile linkfile( fileName );
+ // - only create file if it doesn't exist already
+ if ( !linkfile.open( IO_ReadOnly ) )
+ {
+ if ( linkfile.open( IO_WriteOnly ) )
+ {
+ FTextStream linkstream;
+ linkstream.setDevice(&linkfile);
+ //linkstream.setEncoding(QTextStream::UnicodeUTF8);
+ linkstream << ".so man" << getExtension() << "/" << buildFileName( manName ) << endl;
+ }
+ }
+ linkfile.close();
+}
+
+void ManGenerator::endMemberDoc(bool)
+{
+ t << "\"";
+}
+
+void ManGenerator::startSubsection()
+{
+ if (!firstCol) t << endl;
+ t << ".SS \"";
+ firstCol=FALSE;
+ paragraph=FALSE;
+}
+
+void ManGenerator::endSubsection()
+{
+ t << "\"";
+}
+
+
+void ManGenerator::startSubsubsection()
+{
+ if (!firstCol) t << endl;
+ t << "\n.SS \"";
+ firstCol=FALSE;
+ paragraph=FALSE;
+}
+
+void ManGenerator::endSubsubsection()
+{
+ t << "\"";
+}
+
+void ManGenerator::writeSynopsis()
+{
+ if (!firstCol) t << endl;
+ t << ".SH SYNOPSIS\n.br\n.PP\n";
+ firstCol=TRUE;
+ paragraph=FALSE;
+}
+
+void ManGenerator::startDescItem()
+{
+ if (!firstCol) t << endl;
+ t << ".IP \"";
+ firstCol=FALSE;
+}
+
+//void ManGenerator::endDescTitle()
+//{
+// endBold();
+// paragraph=TRUE;
+//}
+
+void ManGenerator::startDescForItem()
+{
+ if (!firstCol) t << endl;
+ if (!paragraph) t << ".in -1c" << endl;
+ t << ".in +1c" << endl;
+ firstCol=TRUE;
+ paragraph=FALSE;
+ col=0;
+}
+
+void ManGenerator::endDescForItem()
+{
+}
+
+void ManGenerator::endDescItem()
+{
+ t << "\" 1c" << endl;
+ firstCol=TRUE;
+}
+
+void ManGenerator::startAnonTypeScope(int indentLevel)
+{
+ if (indentLevel==0)
+ {
+ insideTabbing=TRUE;
+ }
+}
+
+void ManGenerator::endAnonTypeScope(int indentLevel)
+{
+ if (indentLevel==0)
+ {
+ insideTabbing=FALSE;
+ }
+}
+
+
+void ManGenerator::startMemberItem(int)
+{
+ if (firstCol && !insideTabbing) t << ".in +1c\n";
+ t << "\n.ti -1c\n.RI \"";
+ firstCol=FALSE;
+}
+
+void ManGenerator::endMemberItem()
+{
+ t << "\"\n.br";
+}
+
+void ManGenerator::startMemberList()
+{
+ if (!insideTabbing)
+ {
+ t << "\n.in +1c"; firstCol=FALSE;
+ }
+}
+
+void ManGenerator::endMemberList()
+{
+ if (!insideTabbing)
+ {
+ t << "\n.in -1c"; firstCol=FALSE;
+ }
+}
+
+void ManGenerator::startMemberGroupHeader(bool)
+{
+ t << "\n.PP\n.RI \"\\fB";
+}
+
+void ManGenerator::endMemberGroupHeader()
+{
+ t << "\\fP\"\n.br\n";
+ firstCol=TRUE;
+}
+
+void ManGenerator::startMemberGroupDocs()
+{
+}
+
+void ManGenerator::endMemberGroupDocs()
+{
+ t << "\n.PP";
+}
+
+void ManGenerator::startMemberGroup()
+{
+ t << "\n.in +1c";
+}
+
+void ManGenerator::endMemberGroup(bool)
+{
+ t << "\n.in -1c";
+ firstCol=FALSE;
+}
+
+void ManGenerator::startSection(const char *,const char *,SectionInfo::SectionType type)
+{
+ if( !inHeader )
+ {
+ switch(type)
+ {
+ case SectionInfo::Page: startGroupHeader(FALSE); break;
+ case SectionInfo::Section: startGroupHeader(FALSE); break;
+ case SectionInfo::Subsection: startMemberHeader(0); break;
+ case SectionInfo::Subsubsection: startMemberHeader(0); break;
+ case SectionInfo::Paragraph: startMemberHeader(0); break;
+ default: ASSERT(0); break;
+ }
+ }
+}
+
+void ManGenerator::endSection(const char *,SectionInfo::SectionType type)
+{
+ if( !inHeader )
+ {
+ switch(type)
+ {
+ case SectionInfo::Page: endGroupHeader(0); break;
+ case SectionInfo::Section: endGroupHeader(0); break;
+ case SectionInfo::Subsection: endMemberHeader(); break;
+ case SectionInfo::Subsubsection: endMemberHeader(); break;
+ case SectionInfo::Paragraph: endMemberHeader(); break;
+ default: ASSERT(0); break;
+ }
+ }
+ else
+ {
+ t << "\n";
+ firstCol=TRUE;
+ paragraph=FALSE;
+ inHeader=FALSE;
+ }
+}
+
+void ManGenerator::startSimpleSect(SectionTypes,const char *,
+ const char *,const char *title)
+{
+ if (!firstCol)
+ { t << endl << ".PP" << endl;
+ firstCol=TRUE; paragraph=TRUE;
+ col=0;
+ }
+ paragraph=FALSE;
+ startBold();
+ docify(title);
+ endBold();
+ paragraph=TRUE;
+}
+
+void ManGenerator::endSimpleSect()
+{
+}
+
+void ManGenerator::startParamList(ParamListTypes,const char *title)
+{
+ if (!firstCol)
+ { t << endl << ".PP" << endl;
+ firstCol=TRUE; paragraph=TRUE;
+ col=0;
+ }
+ paragraph=FALSE;
+ startBold();
+ docify(title);
+ endBold();
+ paragraph=TRUE;
+}
+
+void ManGenerator::endParamList()
+{
+}
+
+void ManGenerator::printDoc(DocNode *n,const char *langExt)
+{
+ ManDocVisitor *visitor = new ManDocVisitor(t,*this,langExt);
+ n->accept(visitor);
+ delete visitor;
+ firstCol=FALSE;
+ paragraph = FALSE;
+}
+
+void ManGenerator::startConstraintList(const char *header)
+{
+ if (!firstCol)
+ { t << endl << ".PP" << endl;
+ firstCol=TRUE; paragraph=TRUE;
+ col=0;
+ }
+ paragraph=FALSE;
+ startBold();
+ docify(header);
+ endBold();
+ paragraph=TRUE;
+}
+
+void ManGenerator::startConstraintParam()
+{
+ startItemListItem();
+ startEmphasis();
+}
+
+void ManGenerator::endConstraintParam()
+{
+ endEmphasis();
+ endItemListItem();
+ t << " : ";
+}
+
+void ManGenerator::startConstraintType()
+{
+ startEmphasis();
+}
+
+void ManGenerator::endConstraintType()
+{
+ endEmphasis();
+}
+
+void ManGenerator::startConstraintDocs()
+{
+}
+
+void ManGenerator::endConstraintDocs()
+{
+ t << endl; firstCol=TRUE;
+}
+
+void ManGenerator::endConstraintList()
+{
+}
+
+void ManGenerator::startInlineDescription()
+{
+}
+
+void ManGenerator::endInlineDescription()
+{
+}
+
+void ManGenerator::startInlineHeader()
+{
+ if (!firstCol)
+ {
+ t << endl << ".PP" << endl << ".in -1c" << endl;
+ }
+ t << ".RI \"\\fB";
+}
+
+void ManGenerator::endInlineHeader()
+{
+ t << "\\fP\"" << endl << ".in +1c" << endl;
+ firstCol = FALSE;
+}
+
+
+
diff --git a/src/mangen.h b/src/mangen.h
new file mode 100644
index 0000000..42c7bc1
--- /dev/null
+++ b/src/mangen.h
@@ -0,0 +1,253 @@
+/******************************************************************************
+ *
+ * $Id: htmlgen.h,v 1.15 1998/11/28 11:33:19 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef MANGEN_H
+#define MANGEN_H
+
+#include "outputgen.h"
+
+class QFile;
+
+class ManGenerator : public OutputGenerator
+{
+ public:
+ ManGenerator();
+ ~ManGenerator();
+
+ //OutputGenerator *copy() { return new ManGenerator; }
+ //OutputGenerator *clone() { return new ManGenerator(*this); }
+ //void append(const OutputGenerator *o);
+ void enable()
+ { if (genStack->top()) active=*genStack->top(); else active=TRUE; }
+ void disable() { active=FALSE; }
+ void enableIf(OutputType o) { if (o==Man) active=TRUE; }
+ void disableIf(OutputType o) { if (o==Man) active=FALSE; }
+ void disableIfNot(OutputType o) { if (o!=Man) active=FALSE; }
+ bool isEnabled(OutputType o) { return (o==Man && active); }
+ OutputGenerator *get(OutputType o) { return (o==Man) ? this : 0; }
+
+ void printDoc(DocNode *,const char *);
+
+ static void init();
+ void startFile(const char *name,const char *manName,const char *title);
+ void writeFooter() {}
+ void endFile();
+ void clearBuffer();
+
+ void startIndexSection(IndexSections) {}
+ void endIndexSection(IndexSections) {}
+ void writePageLink(const char *,bool) {}
+ void startProjectNumber() {}
+ void endProjectNumber() {}
+ void writeStyleInfo(int) {}
+ void startTitleHead(const char *) {}
+ void endTitleHead(const char *,const char *);
+ void startTitle();
+ void endTitle();
+
+ void newParagraph();
+ void startParagraph();
+ void endParagraph();
+ void writeString(const char *text);
+ void startIndexListItem() {}
+ void endIndexListItem() {}
+ void startIndexList() {}
+ void endIndexList() { newParagraph(); }
+ void startIndexKey() {}
+ void endIndexKey() {}
+ void startIndexValue(bool) {}
+ void endIndexValue(const char *,bool) {}
+ void startItemList() {}
+ void endItemList() { newParagraph(); }
+ void startIndexItem(const char *ref,const char *file);
+ void endIndexItem(const char *ref,const char *file);
+ void docify(const char *text);
+ void codify(const char *text);
+ void writeObjectLink(const char *ref,const char *file,
+ const char *anchor,const char *name);
+ void writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip);
+ void startTextLink(const char *,const char *) {}
+ void endTextLink() {}
+ void startHtmlLink(const char *url);
+ void endHtmlLink();
+ void startTypewriter() { t << "\\fC"; firstCol=FALSE; }
+ void endTypewriter() { t << "\\fP"; firstCol=FALSE; }
+ void startGroupHeader(int);
+ void endGroupHeader(int);
+ void startMemberSections() {}
+ void endMemberSections() {}
+ void startHeaderSection() {}
+ void endHeaderSection() {}
+ void startMemberHeader(const char *);
+ void endMemberHeader();
+ void insertMemberAlign(bool) {}
+ void startMemberSubtitle() {}
+ void endMemberSubtitle() {}
+ //void writeListItem();
+ void startItemListItem();
+ void endItemListItem();
+ void startMemberDocList() {}
+ void endMemberDocList() {}
+ void startMemberList();
+ void endMemberList();
+ void startInlineDescription();
+ void endInlineDescription();
+ void startInlineHeader();
+ void endInlineHeader();
+ void startAnonTypeScope(int);
+ void endAnonTypeScope(int);
+ void startMemberItem(int);
+ void endMemberItem();
+ void startMemberTemplateParams() {}
+ void endMemberTemplateParams() {}
+
+ void startMemberGroupHeader(bool);
+ void endMemberGroupHeader();
+ void startMemberGroupDocs();
+ void endMemberGroupDocs();
+ void startMemberGroup();
+ void endMemberGroup(bool);
+
+ void writeRuler() {}
+ void writeAnchor(const char *,const char *) {}
+ void startCodeFragment();
+ void endCodeFragment();
+ void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; }
+ void startCodeLine() {}
+ void endCodeLine() { codify("\n"); col=0; }
+ void startEmphasis() { t << "\\fI"; firstCol=FALSE; }
+ void endEmphasis() { t << "\\fP"; firstCol=FALSE; }
+ void startBold() { t << "\\fB"; firstCol=FALSE; }
+ void endBold() { t << "\\fP"; firstCol=FALSE; }
+ void startDescription() {}
+ void endDescription() {}
+ void startDescItem();
+ void endDescItem();
+ void lineBreak(const char *) { t << "\n.br" << endl; }
+ void writeChar(char c);
+ void startMemberDoc(const char *,const char *,const char *,const char *,bool);
+ void endMemberDoc(bool);
+ void startDoxyAnchor(const char *,const char *,const char *,const char *,const char *);
+ void endDoxyAnchor(const char *,const char *) {}
+ void startCodeAnchor(const char *) {}
+ void endCodeAnchor() {}
+ void writeLatexSpacing() {}
+ void writeStartAnnoItem(const char *type,const char *file,
+ const char *path,const char *name);
+ void writeEndAnnoItem(const char *) { t << endl; firstCol=TRUE; }
+ void startSubsection();
+ void endSubsection();
+ void startSubsubsection();
+ void endSubsubsection();
+ void startCenter() {}
+ void endCenter() {}
+ void startSmall() {}
+ void endSmall() {}
+ void startMemberDescription() { t << "\n.RI \"\\fI"; firstCol=FALSE; }
+ void endMemberDescription() { t << "\\fP\""; firstCol=FALSE; }
+ void startDescList(SectionTypes);
+ void endDescList() {}
+ void startSimpleSect(SectionTypes,const char *,const char *,const char *);
+ void endSimpleSect();
+ void startParamList(ParamListTypes,const char *title);
+ void endParamList();
+ //void writeDescItem();
+ void startDescForItem();
+ void endDescForItem();
+ void startSection(const char *,const char *,SectionInfo::SectionType);
+ void endSection(const char *,SectionInfo::SectionType);
+ void addIndexItem(const char *,const char *) {}
+ void startIndent() {}
+ void endIndent() {}
+ void writeSynopsis();
+ void startClassDiagram() {}
+ void endClassDiagram(const ClassDiagram &,const char *,const char *) {}
+ void startPageRef() {}
+ void endPageRef(const char *,const char *) {}
+ void startQuickIndices() {}
+ void endQuickIndices() {}
+ void writeSplitBar(const char *) {}
+ void writeLogo() {}
+ void writeQuickLinks(bool,HighlightedItem) {}
+ void startContents() {}
+ void endContents() {}
+ void writeNonBreakableSpace(int n) { int i; for (i=0;i<n;i++) t << " "; }
+
+ void startDescTable() {}
+ void endDescTable() {}
+ void startDescTableTitle() { startItemListItem(); startBold(); startEmphasis(); endItemListItem(); }
+ void endDescTableTitle() { endEmphasis(); endBold(); }
+ void startDescTableData() { t << endl; firstCol=TRUE; }
+ void endDescTableData() {}
+
+ void startDotGraph() {}
+ void endDotGraph(const DotClassGraph &) {}
+ void startInclDepGraph() {}
+ void endInclDepGraph(const DotInclDepGraph &) {}
+ void startGroupCollaboration() {}
+ void endGroupCollaboration(const DotGroupCollaboration &) {}
+ void startCallGraph() {}
+ void endCallGraph(const DotCallGraph &) {}
+ void startDirDepGraph() {}
+ void endDirDepGraph(const DotDirDeps &) {}
+ void writeGraphicalHierarchy(const DotGfxHierarchyTable &) {}
+
+ void startTextBlock(bool) {}
+ void endTextBlock(bool) {}
+ void lastIndexPage() {}
+
+ void startMemberDocPrefixItem() {}
+ void endMemberDocPrefixItem() {}
+ void startMemberDocName(bool) {}
+ void endMemberDocName() {}
+ void startParameterType(bool,const char *) {}
+ void endParameterType() {}
+ void startParameterName(bool) {}
+ void endParameterName(bool,bool,bool) {}
+ void startParameterList(bool) {}
+ void endParameterList() {}
+
+ void startFontClass(const char *) {}
+ void endFontClass() {}
+
+ void startConstraintList(const char *);
+ void startConstraintParam();
+ void endConstraintParam();
+ void startConstraintType();
+ void endConstraintType();
+ void startConstraintDocs();
+ void endConstraintDocs();
+ void endConstraintList();
+
+ void writeCodeAnchor(const char *) {}
+ void linkableSymbol(int,const char *,Definition *,Definition *) {}
+
+ private:
+ bool firstCol;
+ bool paragraph;
+ int col;
+ bool upperCase;
+ bool insideTabbing;
+ bool inHeader;
+
+ ManGenerator(const ManGenerator &g);
+ ManGenerator &operator=(const ManGenerator &g);
+};
+
+#endif
diff --git a/src/marshal.cpp b/src/marshal.cpp
new file mode 100644
index 0000000..4f01aa4
--- /dev/null
+++ b/src/marshal.cpp
@@ -0,0 +1,826 @@
+#include <qfile.h>
+#include <assert.h>
+
+#include "sortdict.h"
+#include "marshal.h"
+#include "entry.h"
+#include "section.h"
+#include "memberlist.h"
+#include "definition.h"
+#include "groupdef.h"
+#include "example.h"
+
+#define HEADER ('D'<<24)+('O'<<16)+('X'<<8)+'!'
+
+void marshalInt(StorageIntf *s,int v)
+{
+ uchar b[4];
+ b[0]=((uint)v)>>24;
+ b[1]=(((uint)v)>>16)&0xff;
+ b[2]=(((uint)v)>>8)&0xff;
+ b[3]=v&0xff;
+ s->write((const char *)b,4);
+}
+
+void marshalUInt(StorageIntf *s,uint v)
+{
+ uchar b[4];
+ b[0]=v>>24;
+ b[1]=(v>>16)&0xff;
+ b[2]=(v>>8)&0xff;
+ b[3]=v&0xff;
+ s->write((const char *)b,4);
+}
+
+void marshalBool(StorageIntf *s,bool b)
+{
+ char c = b;
+ s->write(&c,sizeof(char));
+}
+
+void marshalQCString(StorageIntf *s,const QCString &str)
+{
+ uint l=str.length();
+ marshalUInt(s,l);
+ if (l>0) s->write(str.data(),l);
+}
+
+void marshalQGString(StorageIntf *s,const QGString &str)
+{
+ uint l=str.length();
+ marshalUInt(s,l);
+ if (l>0) s->write(str.data(),l);
+}
+
+void marshalArgumentList(StorageIntf *s,ArgumentList *argList)
+{
+ if (argList==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,argList->count());
+ if (argList->count()>0)
+ {
+ ArgumentListIterator ali(*argList);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ marshalQCString(s,a->attrib);
+ marshalQCString(s,a->type);
+ marshalQCString(s,a->canType);
+ marshalQCString(s,a->name);
+ marshalQCString(s,a->array);
+ marshalQCString(s,a->defval);
+ marshalQCString(s,a->docs);
+ }
+ }
+ marshalBool(s,argList->constSpecifier);
+ marshalBool(s,argList->volatileSpecifier);
+ marshalBool(s,argList->pureSpecifier);
+ }
+}
+
+void marshalArgumentLists(StorageIntf *s,QList<ArgumentList> *argLists)
+{
+ if (argLists==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,argLists->count());
+ QListIterator<ArgumentList> ali(*argLists);
+ ArgumentList *al;
+ for (ali.toFirst();(al=ali.current());++ali)
+ {
+ marshalArgumentList(s,al);
+ }
+ }
+}
+
+void marshalBaseInfoList(StorageIntf *s, QList<BaseInfo> *baseList)
+{
+ if (baseList==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,baseList->count());
+ QListIterator<BaseInfo> bli(*baseList);
+ BaseInfo *bi;
+ for (bli.toFirst();(bi=bli.current());++bli)
+ {
+ marshalQCString(s,bi->name);
+ marshalInt(s,(int)bi->prot);
+ marshalInt(s,(int)bi->virt);
+ }
+ }
+}
+
+void marshalGroupingList(StorageIntf *s, QList<Grouping> *groups)
+{
+ if (groups==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,groups->count());
+ QListIterator<Grouping> gli(*groups);
+ Grouping *g;
+ for (gli.toFirst();(g=gli.current());++gli)
+ {
+ marshalQCString(s,g->groupname);
+ marshalInt(s,(int)g->pri);
+ }
+ }
+}
+
+void marshalSectionInfoList(StorageIntf *s, QList<SectionInfo> *anchors)
+{
+ if (anchors==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,anchors->count());
+ QListIterator<SectionInfo> sli(*anchors);
+ SectionInfo *si;
+ for (sli.toFirst();(si=sli.current());++sli)
+ {
+ marshalQCString(s,si->label);
+ marshalQCString(s,si->title);
+ marshalQCString(s,si->ref);
+ marshalInt(s,(int)si->type);
+ marshalQCString(s,si->fileName);
+ }
+ }
+}
+
+void marshalItemInfoList(StorageIntf *s, QList<ListItemInfo> *sli)
+{
+ if (sli==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,sli->count());
+ QListIterator<ListItemInfo> liii(*sli);
+ ListItemInfo *lii;
+ for (liii.toFirst();(lii=liii.current());++liii)
+ {
+ marshalQCString(s,lii->type);
+ marshalInt(s,lii->itemId);
+ }
+ }
+}
+
+void marshalObjPointer(StorageIntf *s,void *obj)
+{
+ char *b = (char *)&obj;
+ s->write(b,sizeof(void *));
+}
+
+void marshalSectionDict(StorageIntf *s,SectionDict *sections)
+{
+ if (sections==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,sections->count());
+ QDictIterator<SectionInfo> sli(*sections);
+ SectionInfo *si;
+ for (sli.toFirst();(si=sli.current());++sli)
+ {
+ marshalQCString(s,sli.currentKey());
+ marshalObjPointer(s,si);
+ }
+ }
+}
+
+void marshalMemberSDict(StorageIntf *s,MemberSDict *memberSDict)
+{
+ if (memberSDict==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,memberSDict->count());
+ //printf(" marshalMemberSDict: items=%d\n",memberSDict->count());
+ SDict<MemberDef>::IteratorDict mdi(*memberSDict);
+ MemberDef *md;
+ int count=0;
+ for (mdi.toFirst();(md=mdi.current());++mdi)
+ {
+ //printf(" marshalMemberSDict: %d: key=%s value=%p\n",count,mdi.currentKey().data(),md);
+ marshalQCString(s,mdi.currentKey());
+ marshalObjPointer(s,md);
+ count++;
+ }
+ assert(count==memberSDict->count());
+ }
+}
+
+void marshalDocInfo(StorageIntf *s,DocInfo *docInfo)
+{
+ if (docInfo==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,1);
+ marshalQCString(s,docInfo->doc);
+ marshalInt(s,docInfo->line);
+ marshalQCString(s,docInfo->file);
+ }
+}
+
+void marshalBriefInfo(StorageIntf *s,BriefInfo *briefInfo)
+{
+ if (briefInfo==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,1);
+ marshalQCString(s,briefInfo->doc);
+ marshalQCString(s,briefInfo->tooltip);
+ marshalInt(s,briefInfo->line);
+ marshalQCString(s,briefInfo->file);
+ }
+}
+
+void marshalBodyInfo(StorageIntf *s,BodyInfo *bodyInfo)
+{
+ if (bodyInfo==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,1);
+ marshalInt(s,bodyInfo->startLine);
+ marshalInt(s,bodyInfo->endLine);
+ marshalObjPointer(s,bodyInfo->fileDef);
+ }
+}
+
+void marshalGroupList(StorageIntf *s,GroupList *groupList)
+{
+ if (groupList==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,groupList->count());
+ QListIterator<GroupDef> gli(*groupList);
+ GroupDef *gd=0;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ marshalObjPointer(s,gd);
+ }
+ }
+}
+
+void marshalMemberList(StorageIntf *s,MemberList *ml)
+{
+ if (ml==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,ml->count());
+ MemberListIterator mli(*ml);
+ MemberDef *md;
+ uint count=0;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ marshalObjPointer(s,md);
+ count++;
+ }
+ assert(count==ml->count());
+
+ ml->marshal(s);
+ }
+}
+
+void marshalExampleSDict(StorageIntf *s,ExampleSDict *ed)
+{
+ if (ed==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,ed->count());
+ //printf(" marshalMemberSDict: items=%d\n",memberSDict->count());
+ SDict<Example>::IteratorDict edi(*ed);
+ Example *e;
+ for (edi.toFirst();(e=edi.current());++edi)
+ {
+ //printf(" marshalMemberSDict: %d: key=%s value=%p\n",count,mdi.currentKey().data(),md);
+ marshalQCString(s,edi.currentKey());
+ marshalQCString(s,e->anchor);
+ marshalQCString(s,e->name);
+ marshalQCString(s,e->file);
+ }
+ }
+}
+
+void marshalMemberLists(StorageIntf *s,SDict<MemberList> *mls)
+{
+ if (mls==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,mls->count());
+ //printf(" marshalMemberSDict: items=%d\n",memberSDict->count());
+ SDict<MemberList>::IteratorDict mli(*mls);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ //printf(" marshalMemberSDict: %d: key=%s value=%p\n",count,mdi.currentKey().data(),md);
+ marshalQCString(s,mli.currentKey());
+ marshalObjPointer(s,ml); // assume we are not owner of the list
+ }
+ }
+}
+
+void marshalEntry(StorageIntf *s,Entry *e)
+{
+ marshalUInt(s,HEADER);
+ marshalQCString(s,e->name);
+ marshalQCString(s,e->type);
+ marshalInt(s,e->section);
+ marshalInt(s,(int)e->protection);
+ marshalInt(s,(int)e->mtype);
+ marshalInt(s,e->spec);
+ marshalInt(s,e->initLines);
+ marshalBool(s,e->stat);
+ marshalBool(s,e->explicitExternal);
+ marshalBool(s,e->proto);
+ marshalBool(s,e->subGrouping);
+ marshalBool(s,e->callGraph);
+ marshalBool(s,e->callerGraph);
+ marshalInt(s,(int)e->virt);
+ marshalQCString(s,e->args);
+ marshalQCString(s,e->bitfields);
+ marshalArgumentList(s,e->argList);
+ marshalArgumentLists(s,e->tArgLists);
+ marshalQGString(s,e->program);
+ marshalQGString(s,e->initializer);
+ marshalQCString(s,e->includeFile);
+ marshalQCString(s,e->includeName);
+ marshalQCString(s,e->doc);
+ marshalInt(s,e->docLine);
+ marshalQCString(s,e->docFile);
+ marshalQCString(s,e->brief);
+ marshalInt(s,e->briefLine);
+ marshalQCString(s,e->briefFile);
+ marshalQCString(s,e->inbodyDocs);
+ marshalInt(s,e->inbodyLine);
+ marshalQCString(s,e->inbodyFile);
+ marshalQCString(s,e->relates);
+ marshalInt(s,e->relatesType);
+ marshalQCString(s,e->read);
+ marshalQCString(s,e->write);
+ marshalQCString(s,e->inside);
+ marshalQCString(s,e->exception);
+ marshalArgumentList(s,e->typeConstr);
+ marshalInt(s,e->bodyLine);
+ marshalInt(s,e->endBodyLine);
+ marshalInt(s,e->mGrpId);
+ marshalBaseInfoList(s,e->extends);
+ marshalGroupingList(s,e->groups);
+ marshalSectionInfoList(s,e->anchors);
+ marshalQCString(s,e->fileName);
+ marshalInt(s,e->startLine);
+ marshalItemInfoList(s,e->sli);
+ marshalInt(s,(int)e->lang);
+ marshalBool(s,e->hidden);
+ marshalBool(s,e->artificial);
+ marshalInt(s,(int)e->groupDocType);
+}
+
+void marshalEntryTree(StorageIntf *s,Entry *e)
+{
+ marshalEntry(s,e);
+ marshalUInt(s,e->children()->count());
+ QListIterator<Entry> eli(*e->children());
+ Entry *child;
+ for (eli.toFirst();(child=eli.current());++eli)
+ {
+ marshalEntryTree(s,child);
+ }
+}
+
+//------------------------------------------------------------------
+
+int unmarshalInt(StorageIntf *s)
+{
+ uchar b[4];
+ s->read((char *)b,4);
+ int result=(int)((((uint)b[0])<<24)+((uint)b[1]<<16)+((uint)b[2]<<8)+(uint)b[3]);
+ //printf("unmarshalInt: %x %x %x %x: %x offset=%llx\n",b[0],b[1],b[2],b[3],result,f.pos());
+ return result;
+}
+
+uint unmarshalUInt(StorageIntf *s)
+{
+ uchar b[4];
+ s->read((char *)b,4);
+ uint result=(((uint)b[0])<<24)+((uint)b[1]<<16)+((uint)b[2]<<8)+(uint)b[3];
+ //printf("unmarshalUInt: %x %x %x %x: %x offset=%llx\n",b[0],b[1],b[2],b[3],result,f.pos());
+ return result;
+}
+
+bool unmarshalBool(StorageIntf *s)
+{
+ char result;
+ s->read(&result,sizeof(result));
+ //printf("unmarshalBool: %x offset=%llx\n",result,f.pos());
+ return result;
+}
+
+QCString unmarshalQCString(StorageIntf *s)
+{
+ uint len = unmarshalUInt(s);
+ //printf("unmarshalQCString: len=%d offset=%llx\n",len,f.pos());
+ QCString result(len+1);
+ result.at(len)='\0';
+ if (len>0)
+ {
+ s->read(result.data(),len);
+ }
+ //printf("unmarshalQCString: result=%s\n",result.data());
+ return result;
+}
+
+QGString unmarshalQGString(StorageIntf *s)
+{
+ uint len = unmarshalUInt(s);
+ //printf("unmarshalQCString: len=%d offset=%llx\n",len,f.pos());
+ QGString result(len+1);
+ result.at(len)='\0';
+ if (len>0)
+ {
+ s->read(result.data(),len);
+ }
+ //printf("unmarshalQCString: result=%s\n",result.data());
+ return result;
+}
+
+ArgumentList *unmarshalArgumentList(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0; // null list
+ ArgumentList *result = new ArgumentList;
+ assert(count<1000000);
+ //printf("unmarshalArgumentList: %d\n",count);
+ for (i=0;i<count;i++)
+ {
+ Argument *a = new Argument;
+ a->attrib = unmarshalQCString(s);
+ a->type = unmarshalQCString(s);
+ a->canType = unmarshalQCString(s);
+ a->name = unmarshalQCString(s);
+ a->array = unmarshalQCString(s);
+ a->defval = unmarshalQCString(s);
+ a->docs = unmarshalQCString(s);
+ result->append(a);
+ }
+ result->constSpecifier = unmarshalBool(s);
+ result->volatileSpecifier = unmarshalBool(s);
+ result->pureSpecifier = unmarshalBool(s);
+ return result;
+}
+
+QList<ArgumentList> *unmarshalArgumentLists(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0; // null list
+ QList<ArgumentList> *result = new QList<ArgumentList>;
+ result->setAutoDelete(TRUE);
+ assert(count<1000000);
+ //printf("unmarshalArgumentLists: %d\n",count);
+ for (i=0;i<count;i++)
+ {
+ result->append(unmarshalArgumentList(s));
+ }
+ return result;
+}
+
+QList<BaseInfo> *unmarshalBaseInfoList(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0; // null list
+ QList<BaseInfo> *result = new QList<BaseInfo>;
+ result->setAutoDelete(TRUE);
+ assert(count<1000000);
+ for (i=0;i<count;i++)
+ {
+ QCString name = unmarshalQCString(s);
+ Protection prot = (Protection)unmarshalInt(s);
+ Specifier virt = (Specifier)unmarshalInt(s);
+ result->append(new BaseInfo(name,prot,virt));
+ }
+ return result;
+}
+
+QList<Grouping> *unmarshalGroupingList(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0; // null list
+ QList<Grouping> *result = new QList<Grouping>;
+ result->setAutoDelete(TRUE);
+ assert(count<1000000);
+ for (i=0;i<count;i++)
+ {
+ QCString name = unmarshalQCString(s);
+ Grouping::GroupPri_t prio = (Grouping::GroupPri_t)unmarshalInt(s);
+ result->append(new Grouping(name,prio));
+ }
+ return result;
+}
+
+QList<SectionInfo> *unmarshalSectionInfoList(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0; // null list
+ QList<SectionInfo> *result = new QList<SectionInfo>;
+ result->setAutoDelete(TRUE);
+ assert(count<1000000);
+ for (i=0;i<count;i++)
+ {
+ QCString label = unmarshalQCString(s);
+ QCString title = unmarshalQCString(s);
+ QCString ref = unmarshalQCString(s);
+ SectionInfo::SectionType type = (SectionInfo::SectionType)unmarshalInt(s);
+ QCString fileName = unmarshalQCString(s);
+ result->append(new SectionInfo(fileName,label,title,type,ref));
+ }
+ return result;
+}
+
+QList<ListItemInfo> *unmarshalItemInfoList(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0; // null list
+ QList<ListItemInfo> *result = new QList<ListItemInfo>;
+ result->setAutoDelete(TRUE);
+ assert(count<1000000);
+ for (i=0;i<count;i++)
+ {
+ ListItemInfo *lii = new ListItemInfo;
+ lii->type = unmarshalQCString(s);
+ lii->itemId = unmarshalInt(s);
+ result->append(lii);
+ }
+ return result;
+}
+
+void *unmarshalObjPointer(StorageIntf *s)
+{
+ void *result;
+ s->read((char *)&result,sizeof(void*));
+ return result;
+}
+
+SectionDict *unmarshalSectionDict(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ //printf("unmarshalSectionDict count=%d\n",count);
+ if (count==NULL_LIST) return 0; // null list
+ SectionDict *result = new SectionDict(17);
+ assert(count<1000000);
+ for (i=0;i<count;i++)
+ {
+ QCString key = unmarshalQCString(s);
+ SectionInfo *si = (SectionInfo *)unmarshalObjPointer(s);
+ //printf(" unmarshalSectionDict i=%d key=%s si=%s\n",count,key.data(),si->label.data());
+ result->insert(key,si);
+ }
+ return result;
+}
+
+MemberSDict *unmarshalMemberSDict(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ //printf("--- unmarshalMemberSDict count=%d\n",count);
+ if (count==NULL_LIST)
+ {
+ //printf("--- end unmarshalMemberSDict\n");
+ return 0; // null list
+ }
+ MemberSDict *result = new MemberSDict;
+ assert(count<1000000);
+ //printf("Reading %d key-value pairs\n",count);
+ for (i=0;i<count;i++)
+ {
+ //printf(" unmarshaling pair %d\n",i);
+ QCString key = unmarshalQCString(s);
+ //printf(" unmarshaling key %s\n",key.data());
+ MemberDef *md = (MemberDef *)unmarshalObjPointer(s);
+ //printf(" unmarshalMemberSDict i=%d key=%s md=%p\n",i,key.data(),md);
+ result->inSort(key,md); // note: this can lead to unmarshalling another object!
+ }
+ //printf("--- end unmarshalMemberSDict\n");
+ return result;
+}
+
+DocInfo *unmarshalDocInfo(StorageIntf *s)
+{
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0;
+ DocInfo *result = new DocInfo;
+ result->doc = unmarshalQCString(s);
+ result->line = unmarshalInt(s);
+ result->file = unmarshalQCString(s);
+ return result;
+}
+
+BriefInfo *unmarshalBriefInfo(StorageIntf *s)
+{
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0;
+ BriefInfo *result = new BriefInfo;
+ result->doc = unmarshalQCString(s);
+ result->tooltip = unmarshalQCString(s);
+ result->line = unmarshalInt(s);
+ result->file = unmarshalQCString(s);
+ return result;
+}
+
+BodyInfo *unmarshalBodyInfo(StorageIntf *s)
+{
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0;
+ BodyInfo *result = new BodyInfo;
+ result->startLine = unmarshalInt(s);
+ result->endLine = unmarshalInt(s);
+ result->fileDef = (FileDef*)unmarshalObjPointer(s);
+ return result;
+}
+
+GroupList *unmarshalGroupList(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0; // null list
+ assert(count<1000000);
+ GroupList *result = new GroupList;
+ for (i=0;i<count;i++)
+ {
+ GroupDef *gd = (GroupDef *)unmarshalObjPointer(s);
+ result->append(gd);
+ }
+ return result;
+}
+
+MemberList *unmarshalMemberList(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0;
+ MemberList *result = new MemberList;
+ assert(count<1000000);
+ for (i=0;i<count;i++)
+ {
+ MemberDef *md = (MemberDef*)unmarshalObjPointer(s);
+ result->append(md);
+ }
+ result->unmarshal(s);
+ return result;
+}
+
+ExampleSDict *unmarshalExampleSDict(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0;
+ ExampleSDict *result = new ExampleSDict;
+ assert(count<1000000);
+ for (i=0;i<count;i++)
+ {
+ QCString key = unmarshalQCString(s);
+ Example *e = new Example;
+ e->anchor = unmarshalQCString(s);
+ e->name = unmarshalQCString(s);
+ e->file = unmarshalQCString(s);
+ result->inSort(key,e);
+ }
+ return result;
+}
+
+SDict<MemberList> *unmarshalMemberLists(StorageIntf *s)
+{
+ uint i;
+ uint count = unmarshalUInt(s);
+ if (count==NULL_LIST) return 0;
+ SDict<MemberList> *result = new SDict<MemberList>(7);
+ assert(count<1000000);
+ for (i=0;i<count;i++)
+ {
+ QCString key = unmarshalQCString(s);
+ MemberList *ml = (MemberList *)unmarshalObjPointer(s);
+ result->append(key,ml);
+ }
+ return result;
+}
+
+Entry * unmarshalEntry(StorageIntf *s)
+{
+ Entry *e = new Entry;
+ uint header=unmarshalUInt(s);
+ ASSERT(header==HEADER);
+ e->name = unmarshalQCString(s);
+ e->type = unmarshalQCString(s);
+ e->section = unmarshalInt(s);
+ e->protection = (Protection)unmarshalInt(s);
+ e->mtype = (MethodTypes)unmarshalInt(s);
+ e->spec = unmarshalInt(s);
+ e->initLines = unmarshalInt(s);
+ e->stat = unmarshalBool(s);
+ e->explicitExternal = unmarshalBool(s);
+ e->proto = unmarshalBool(s);
+ e->subGrouping = unmarshalBool(s);
+ e->callGraph = unmarshalBool(s);
+ e->callerGraph = unmarshalBool(s);
+ e->virt = (Specifier)unmarshalInt(s);
+ e->args = unmarshalQCString(s);
+ e->bitfields = unmarshalQCString(s);
+ delete e->argList;
+ e->argList = unmarshalArgumentList(s);
+ e->tArgLists = unmarshalArgumentLists(s);
+ e->program = unmarshalQGString(s);
+ e->initializer = unmarshalQGString(s);
+ e->includeFile = unmarshalQCString(s);
+ e->includeName = unmarshalQCString(s);
+ e->doc = unmarshalQCString(s);
+ e->docLine = unmarshalInt(s);
+ e->docFile = unmarshalQCString(s);
+ e->brief = unmarshalQCString(s);
+ e->briefLine = unmarshalInt(s);
+ e->briefFile = unmarshalQCString(s);
+ e->inbodyDocs = unmarshalQCString(s);
+ e->inbodyLine = unmarshalInt(s);
+ e->inbodyFile = unmarshalQCString(s);
+ e->relates = unmarshalQCString(s);
+ e->relatesType = (RelatesType)unmarshalInt(s);
+ e->read = unmarshalQCString(s);
+ e->write = unmarshalQCString(s);
+ e->inside = unmarshalQCString(s);
+ e->exception = unmarshalQCString(s);
+ e->typeConstr = unmarshalArgumentList(s);
+ e->bodyLine = unmarshalInt(s);
+ e->endBodyLine = unmarshalInt(s);
+ e->mGrpId = unmarshalInt(s);
+ delete e->extends;
+ e->extends = unmarshalBaseInfoList(s);
+ delete e->groups;
+ e->groups = unmarshalGroupingList(s);
+ delete e->anchors;
+ e->anchors = unmarshalSectionInfoList(s);
+ e->fileName = unmarshalQCString(s);
+ e->startLine = unmarshalInt(s);
+ e->sli = unmarshalItemInfoList(s);
+ e->lang = (SrcLangExt)unmarshalInt(s);
+ e->hidden = unmarshalBool(s);
+ e->artificial = unmarshalBool(s);
+ e->groupDocType = (Entry::GroupDocType)unmarshalInt(s);
+ return e;
+}
+
+Entry * unmarshalEntryTree(StorageIntf *s)
+{
+ Entry *e = unmarshalEntry(s);
+ uint count = unmarshalUInt(s);
+ uint i;
+ for (i=0;i<count;i++)
+ {
+ e->addSubEntry(unmarshalEntryTree(s));
+ }
+ return e;
+}
diff --git a/src/marshal.h b/src/marshal.h
new file mode 100644
index 0000000..a30c431
--- /dev/null
+++ b/src/marshal.h
@@ -0,0 +1,132 @@
+#ifndef MARSHAL_H
+#define MARSHAL_H
+
+#include <qlist.h>
+#include <qfile.h>
+#include "sortdict.h"
+#include "store.h"
+
+class ArgumentList;
+struct BaseInfo;
+struct Grouping;
+struct SectionInfo;
+struct ListItemInfo;
+class QCString;
+class QGString;
+class SectionDict;
+class MemberSDict;
+class GroupList;
+struct BodyInfo;
+struct DocInfo;
+struct BriefInfo;
+class MemberList;
+class ExampleSDict;
+class Entry;
+
+#define NULL_LIST 0xffffffff
+
+class FileStorage : public QFile, public StorageIntf
+{
+ public:
+ FileStorage() : QFile() {}
+ FileStorage( const QString &name) : QFile(name) {}
+ int read(char *buf,uint size) { return QFile::readBlock(buf,size); }
+ int write(const char *buf,uint size) { return QFile::writeBlock(buf,size); }
+};
+
+class StreamStorage : public StorageIntf
+{
+ public:
+ StreamStorage()
+ {
+ m_data=0;
+ m_offset=0;
+ m_len=0;
+ }
+ ~StreamStorage()
+ {
+ delete m_data;
+ }
+ StreamStorage(char *data,uint len)
+ {
+ m_data=data;
+ m_offset=0;
+ m_len=len;
+ }
+ int read(char *buf,uint size)
+ {
+ int bytesLeft = QMIN((int)size,m_len-m_offset);
+ if (bytesLeft>0) memcpy(buf,m_data,bytesLeft);
+ m_offset+=bytesLeft;
+ return bytesLeft;
+ }
+ int write(const char *buf,uint size)
+ {
+ m_data=(char *)realloc(m_data,m_offset+size);
+ memcpy(m_data+m_offset,buf,size);
+ m_offset+=size;
+ m_len+=size;
+ return size;
+ }
+ void rewind() { m_offset=0; }
+ char *data() const { return m_data; }
+ int size() { return m_len; }
+ private:
+ char *m_data;
+ int m_offset;
+ int m_len;
+};
+
+//----- marshaling function: datatype -> byte stream --------------------
+
+void marshalInt(StorageIntf *s,int v);
+void marshalUInt(StorageIntf *s,uint v);
+void marshalBool(StorageIntf *s,bool b);
+void marshalQCString(StorageIntf *s,const QCString &str);
+void marshalQGString(StorageIntf *s,const QGString &str);
+void marshalArgumentList(StorageIntf *s,ArgumentList *argList);
+void marshalArgumentLists(StorageIntf *s,QList<ArgumentList> *argLists);
+void marshalBaseInfoList(StorageIntf *s, QList<BaseInfo> *baseList);
+void marshalGroupingList(StorageIntf *s, QList<Grouping> *groups);
+void marshalSectionInfoList(StorageIntf *s, QList<SectionInfo> *anchors);
+void marshalItemInfoList(StorageIntf *s, QList<ListItemInfo> *sli);
+void marshalObjPointer(StorageIntf *s,void *obj);
+void marshalSectionDict(StorageIntf *s,SectionDict *sections);
+void marshalMemberSDict(StorageIntf *s,MemberSDict *memberSDict);
+void marshalDocInfo(StorageIntf *s,DocInfo *docInfo);
+void marshalBriefInfo(StorageIntf *s,BriefInfo *briefInfo);
+void marshalBodyInfo(StorageIntf *s,BodyInfo *bodyInfo);
+void marshalGroupList(StorageIntf *s,GroupList *groupList);
+void marshalMemberList(StorageIntf *s,MemberList *ml);
+void marshalExampleSDict(StorageIntf *s,ExampleSDict *ed);
+void marshalMemberLists(StorageIntf *s,SDict<MemberList> *mls);
+void marshalEntry(StorageIntf *s,Entry *e);
+void marshalEntryTree(StorageIntf *s,Entry *e);
+
+//----- unmarshaling function: byte stream -> datatype ------------------
+
+int unmarshalInt(StorageIntf *s);
+uint unmarshalUInt(StorageIntf *s);
+bool unmarshalBool(StorageIntf *s);
+QCString unmarshalQCString(StorageIntf *s);
+QGString unmarshalQGString(StorageIntf *s);
+ArgumentList * unmarshalArgumentList(StorageIntf *s);
+QList<ArgumentList> *unmarshalArgumentLists(StorageIntf *s);
+QList<BaseInfo> * unmarshalBaseInfoList(StorageIntf *s);
+QList<Grouping> * unmarshalGroupingList(StorageIntf *s);
+QList<SectionInfo> * unmarshalSectionInfoList(StorageIntf *s);
+QList<ListItemInfo> *unmarshalItemInfoList(StorageIntf *s);
+void * unmarshalObjPointer(StorageIntf *s);
+SectionDict * unmarshalSectionDict(StorageIntf *s);
+MemberSDict * unmarshalMemberSDict(StorageIntf *s);
+DocInfo * unmarshalDocInfo(StorageIntf *s);
+BriefInfo * unmarshalBriefInfo(StorageIntf *s);
+BodyInfo * unmarshalBodyInfo(StorageIntf *s);
+GroupList * unmarshalGroupList(StorageIntf *s);
+MemberList * unmarshalMemberList(StorageIntf *s);
+ExampleSDict * unmarshalExampleSDict(StorageIntf *s);
+SDict<MemberList> * unmarshalMemberLists(StorageIntf *s);
+Entry * unmarshalEntry(StorageIntf *s);
+Entry * unmarshalEntryTree(StorageIntf *s);
+
+#endif
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
new file mode 100644
index 0000000..8479370
--- /dev/null
+++ b/src/memberdef.cpp
@@ -0,0 +1,4296 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdio.h>
+#include <qregexp.h>
+#include <assert.h>
+#include "md5.h"
+#include "memberdef.h"
+#include "membername.h"
+#include "doxygen.h"
+#include "util.h"
+#include "code.h"
+#include "message.h"
+#include "htmlhelp.h"
+#include "language.h"
+#include "outputlist.h"
+#include "example.h"
+#include "membergroup.h"
+#include "groupdef.h"
+#include "defargs.h"
+#include "docparser.h"
+#include "dot.h"
+#include "searchindex.h"
+#include "parserintf.h"
+#include "marshal.h"
+#include "objcache.h"
+#include "vhdlscanner.h"
+#include "vhdldocgen.h"
+
+#define START_MARKER 0x4D454D5B // MEM[
+#define END_MARKER 0x4D454D5D // MEM]
+
+//-----------------------------------------------------------------------------
+
+int MemberDef::s_indentLevel = 0;
+
+//-----------------------------------------------------------------------------
+
+static QCString addTemplateNames(const QCString &s,const QCString &n,const QCString &t)
+{
+ QCString result;
+ QCString clRealName=n;
+ int p=0,i;
+ if ((i=clRealName.find('<'))!=-1)
+ {
+ clRealName=clRealName.left(i); // strip template specialization
+ }
+ if ((i=clRealName.findRev("::"))!=-1)
+ {
+ clRealName=clRealName.right(clRealName.length()-i-2);
+ }
+ while ((i=s.find(clRealName,p))!=-1)
+ {
+ result+=s.mid(p,i-p);
+ uint j=clRealName.length()+i;
+ if (s.length()==j || (s.at(j)!='<' && !isId(s.at(j))))
+ { // add template names
+ //printf("Adding %s+%s\n",clRealName.data(),t.data());
+ result+=clRealName+t;
+ }
+ else
+ { // template names already present
+ //printf("Adding %s\n",clRealName.data());
+ result+=clRealName;
+ }
+ p=i+clRealName.length();
+ }
+ result+=s.right(s.length()-p);
+ //printf("addTemplateNames(%s,%s,%s)=%s\n",s.data(),n.data(),t.data(),result.data());
+ return result;
+}
+
+static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
+ const QCString & /*scopeName*/,MemberDef *md)
+{
+ LockingPtr<ArgumentList> defArgList=(md->isDocsForDefinition()) ?
+ md->argumentList() : md->declArgumentList();
+ //printf("writeDefArgumentList `%s' isDocsForDefinition()=%d\n",md->name().data(),md->isDocsForDefinition());
+ if (defArgList==0 || md->isProperty())
+ {
+ return FALSE; // member has no function like argument list
+ }
+ if (!md->isDefine()) ol.docify(" ");
+
+ //printf("writeDefArgList(%d)\n",defArgList->count());
+ ol.pushGeneratorState();
+ //ol.disableAllBut(OutputGenerator::Html);
+ bool htmlOn = ol.isEnabled(OutputGenerator::Html);
+ bool latexOn = ol.isEnabled(OutputGenerator::Latex);
+ {
+ // html and latex
+ if (htmlOn) ol.enable(OutputGenerator::Html);
+ if (latexOn) ol.enable(OutputGenerator::Latex);
+ ol.endMemberDocName();
+ ol.startParameterList(!md->isObjCMethod());
+ }
+ ol.enableAll();
+ ol.disable(OutputGenerator::Html);
+ ol.disable(OutputGenerator::Latex);
+ {
+ // other formats
+ if (!md->isObjCMethod()) ol.docify("("); // start argument list
+ ol.endMemberDocName();
+ }
+ ol.popGeneratorState();
+ //printf("===> name=%s isDefine=%d\n",md->name().data(),md->isDefine());
+
+ Argument *a=defArgList->first();
+ QCString cName;
+ if (cd)
+ {
+ cName=cd->name();
+ int il=cName.find('<');
+ int ir=cName.findRev('>');
+ if (il!=-1 && ir!=-1 && ir>il)
+ {
+ cName=cName.mid(il,ir-il+1);
+ //printf("1. cName=%s\n",cName.data());
+ }
+ else if (cd->templateArguments())
+ {
+ cName=tempArgListToString(cd->templateArguments());
+ //printf("2. cName=%s\n",cName.data());
+ }
+ else // no template specifier
+ {
+ cName.resize(0);
+ }
+ }
+ //printf("~~~ %s cName=%s\n",md->name().data(),cName.data());
+
+ bool first=TRUE;
+ bool paramTypeStarted=FALSE;
+ bool isDefine = md->isDefine();
+ while (a)
+ {
+ if (isDefine || first)
+ {
+ ol.startParameterType(first,md->isObjCMethod()?"dummy":0);
+ paramTypeStarted=TRUE;
+ if (isDefine)
+ {
+ ol.endParameterType();
+ ol.startParameterName(TRUE);
+ }
+ }
+ QRegExp re(")("),res("(.*\\*");
+ int vp=a->type.find(re);
+ int wp=a->type.find(res);
+
+ // use the following to put the function pointer type before the name
+ bool hasFuncPtrType=FALSE;
+
+ if (!a->attrib.isEmpty() && !md->isObjCMethod()) // argument has an IDL attribute
+ {
+ ol.docify(a->attrib+" ");
+ }
+ if (hasFuncPtrType) // argument type is a function pointer
+ {
+ //printf("a->type=`%s' a->name=`%s'\n",a->type.data(),a->name.data());
+ QCString n=a->type.left(vp);
+ if (hasFuncPtrType) n=a->type.left(wp);
+ if (md->isObjCMethod()) { n.prepend("("); n.append(")"); }
+ if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName);
+ linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n);
+ }
+ else // non-function pointer type
+ {
+ QCString n=a->type;
+ if (md->isObjCMethod()) { n.prepend("("); n.append(")"); }
+ if (a->type!="...")
+ {
+ if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName);
+ linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n);
+ }
+ }
+ if (!isDefine)
+ {
+ if (paramTypeStarted)
+ {
+ ol.endParameterType();
+ paramTypeStarted=FALSE;
+ }
+ ol.startParameterName(defArgList->count()<2);
+ }
+ if (hasFuncPtrType)
+ {
+ ol.docify(a->type.mid(wp,vp-wp));
+ }
+ if (!a->name.isEmpty() || (a->name.isEmpty() && a->type=="...")) // argument has a name
+ {
+ //if (!hasFuncPtrType)
+ //{
+ // ol.docify(" ");
+ //}
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Latex);
+ ol.startEmphasis();
+ ol.enable(OutputGenerator::Man);
+ if (latexOn) ol.enable(OutputGenerator::Latex);
+ if (a->name.isEmpty()) ol.docify(a->type); else ol.docify(a->name);
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Latex);
+ ol.endEmphasis();
+ ol.enable(OutputGenerator::Man);
+ if (latexOn) ol.enable(OutputGenerator::Latex);
+ }
+ if (!a->array.isEmpty())
+ {
+ ol.docify(a->array);
+ }
+ if (hasFuncPtrType) // write the part of the argument type
+ // that comes after the name
+ {
+ linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),
+ md->name(),a->type.right(a->type.length()-vp));
+ }
+ if (!a->defval.isEmpty()) // write the default value
+ {
+ QCString n=a->defval;
+ if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName);
+ ol.docify(" = ");
+
+ ol.startTypewriter();
+ linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n,FALSE,TRUE,TRUE);
+ ol.endTypewriter();
+
+ }
+ a=defArgList->next();
+ if (a)
+ {
+ if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments
+ if (!isDefine)
+ {
+ QCString key;
+ if (md->isObjCMethod() && a->attrib.length()>=2)
+ {
+ //printf("Found parameter keyword %s\n",a->attrib.data());
+ // strip [ and ]
+ key=a->attrib.mid(1,a->attrib.length()-2);
+ if (key!=",") key+=":"; // for normal keywords add colon
+ }
+ ol.endParameterName(FALSE,FALSE,!md->isObjCMethod());
+ if (paramTypeStarted)
+ {
+ ol.endParameterType();
+ }
+ ol.startParameterType(FALSE,key);
+ paramTypeStarted=TRUE;
+ }
+ else // isDefine
+ {
+ ol.endParameterName(FALSE,FALSE,TRUE);
+ }
+ }
+ first=FALSE;
+ }
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Html);
+ ol.disable(OutputGenerator::Latex);
+ if (!md->isObjCMethod()) ol.docify(")"); // end argument list
+ ol.enableAll();
+ if (htmlOn) ol.enable(OutputGenerator::Html);
+ if (latexOn) ol.enable(OutputGenerator::Latex);
+ if (first) ol.startParameterName(defArgList->count()<2);
+ ol.endParameterName(TRUE,defArgList->count()<2,!md->isObjCMethod());
+ ol.popGeneratorState();
+ if (md->extraTypeChars())
+ {
+ ol.docify(md->extraTypeChars());
+ }
+ if (defArgList->constSpecifier)
+ {
+ ol.docify(" const");
+ }
+ if (defArgList->volatileSpecifier)
+ {
+ ol.docify(" volatile");
+ }
+ return TRUE;
+}
+
+static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
+{
+ ol.docify("template<");
+ Argument *a=al->first();
+ while (a)
+ {
+ ol.docify(a->type);
+ ol.docify(" ");
+ ol.docify(a->name);
+ if (a->defval.length()!=0)
+ {
+ ol.docify(" = ");
+ ol.docify(a->defval);
+ }
+ a=al->next();
+ if (a) ol.docify(", ");
+ }
+ ol.docify("> ");
+}
+
+QCString extractDirection(QCString &docs)
+{
+ QRegExp re("\\[[^\\]]+\\]"); // [...]
+ int l=0;
+ if (re.match(docs,0,&l)==0)
+ {
+ int inPos = docs.find("in", 1,FALSE);
+ int outPos = docs.find("out",1,FALSE);
+ bool input = inPos!=-1 && inPos<l;
+ bool output = outPos!=-1 && outPos<l;
+ if (input || output) // in,out attributes
+ {
+ docs = docs.mid(l); // strip attributes
+ if (input && output) return "[in,out]";
+ else if (input) return "[in]";
+ else if (output) return "[out]";
+ }
+ }
+ return QCString();
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+class MemberDefImpl
+{
+ public:
+ MemberDefImpl();
+ ~MemberDefImpl();
+ void init(Definition *def,const char *t,const char *a,const char *e,
+ Protection p,Specifier v,bool s,Relationship r,
+ MemberDef::MemberType mt,const ArgumentList *tal,
+ const ArgumentList *al
+ );
+
+ ClassDef *classDef; // member of or related to
+ FileDef *fileDef; // member of file definition
+ NamespaceDef *nspace; // the namespace this member is in.
+
+ MemberDef *enumScope; // the enclosing scope, if this is an enum field
+ MemberDef *annEnumType; // the anonymous enum that is the type of this member
+ MemberList *enumFields; // enumeration fields
+
+ MemberDef *redefines; // the members that this member redefines
+ MemberList *redefinedBy; // the list of members that redefine this one
+
+ MemberDef *memDef; // member definition for this declaration
+ MemberDef *memDec; // member declaration for this definition
+ ClassDef *relatedAlso; // points to class marked by relatedAlso
+
+ ExampleSDict *exampleSDict; // a dictionary of all examples for quick access
+
+ QCString type; // return type
+ QCString args; // function arguments/variable array specifiers
+ QCString def; // member definition in code (fully qualified name)
+ QCString anc; // HTML anchor name
+ Specifier virt; // normal/virtual/pure virtual
+ Protection prot; // protection type [Public/Protected/Private]
+ QCString decl; // member declaration in class
+
+ QCString bitfields; // struct member bitfields
+ QCString read; // property read accessor
+ QCString write; // property write accessor
+ QCString exception; // exceptions that can be thrown
+ QCString initializer; // initializer
+ QCString extraTypeChars; // extra type info found after the argument list
+ int initLines; // number of lines in the initializer
+
+ int memSpec; // The specifiers present for this member
+ MemberDef::MemberType mtype; // returns the kind of member
+ int maxInitLines; // when the initializer will be displayed
+ int userInitLines; // result of explicit \hideinitializer or \showinitializer
+ MemberDef *annMemb;
+
+ ArgumentList *defArgList; // argument list of this member definition
+ ArgumentList *declArgList; // argument list of this member declaration
+
+ ArgumentList *tArgList; // template argument list of function template
+ ArgumentList *typeConstraints; // type constraints for template parameters
+ MemberDef *templateMaster;
+ QList<ArgumentList> *defTmpArgLists; // lists of template argument lists
+ // (for template functions in nested template classes)
+
+ ClassDef *cachedAnonymousType; // if the member has an anonymous compound
+ // as its type then this is computed by
+ // getClassDefOfAnonymousType() and
+ // cached here.
+ SDict<MemberList> *classSectionSDict; // not accessible
+
+ MemberDef *groupAlias; // Member containing the definition
+ int grpId; // group id
+ MemberGroup *memberGroup; // group's member definition
+ GroupDef *group; // group in which this member is in
+ Grouping::GroupPri_t grouppri; // priority of this definition
+ QCString groupFileName; // file where this grouping was defined
+ int groupStartLine; // line " " " " "
+ MemberDef *groupMember;
+
+ bool isTypedefValCached;
+ ClassDef *cachedTypedefValue;
+ QCString cachedTypedefTemplSpec;
+ QCString cachedResolvedType;
+
+ // inbody documentation
+ //int inbodyLine;
+ //QCString inbodyFile;
+ //QCString inbodyDocs;
+
+ // documentation inheritance
+ MemberDef *docProvider;
+
+ // to store the output file base from tag files
+ QCString explicitOutputFileBase;
+
+ // objective-c
+ bool implOnly; // function found in implementation but not
+ // in the interface
+ bool hasDocumentedParams;
+ bool hasDocumentedReturnType;
+ bool isDMember;
+ Relationship related; // relationship of this to the class
+ bool stat; // is it a static function?
+ bool proto; // is it a prototype;
+ bool docEnumValues; // is an enum with documented enum values.
+ bool annScope; // member is part of an annoymous scope
+ bool annUsed;
+ bool hasCallGraph;
+ bool hasCallerGraph;
+ bool explExt; // member was explicitly declared external
+ bool tspec; // member is a template specialization
+ bool groupHasDocs; // true if the entry that caused the grouping was documented
+ bool docsForDefinition; // TRUE => documentation block is put before
+ // definition.
+ // FALSE => block is put before declaration.
+ ClassDef *category;
+};
+
+MemberDefImpl::MemberDefImpl() :
+ enumFields(0),
+ redefinedBy(0),
+ exampleSDict(0),
+ defArgList(0),
+ declArgList(0),
+ tArgList(0),
+ typeConstraints(0),
+ defTmpArgLists(0),
+ classSectionSDict(0),
+ category(0)
+{
+}
+
+MemberDefImpl::~MemberDefImpl()
+{
+ delete redefinedBy;
+ delete exampleSDict;
+ delete enumFields;
+ delete defArgList;
+ delete tArgList;
+ delete typeConstraints;
+ delete defTmpArgLists;
+ delete classSectionSDict;
+ delete declArgList;
+}
+
+void MemberDefImpl::init(Definition *def,
+ const char *t,const char *a,const char *e,
+ Protection p,Specifier v,bool s,Relationship r,
+ MemberDef::MemberType mt,const ArgumentList *tal,
+ const ArgumentList *al
+ )
+{
+ classDef=0;
+ fileDef=0;
+ redefines=0;
+ relatedAlso=0;
+ redefinedBy=0;
+ nspace=0;
+ memDef=0;
+ memDec=0;
+ group=0;
+ grpId=-1;
+ exampleSDict=0;
+ enumFields=0;
+ enumScope=0;
+ defTmpArgLists=0;
+ hasCallGraph = FALSE;
+ hasCallerGraph = FALSE;
+ initLines=0;
+ type=t;
+ if (mt==MemberDef::Typedef) type.stripPrefix("typedef ");
+ // type.stripPrefix("struct ");
+ // type.stripPrefix("class " );
+ // type.stripPrefix("union " );
+ type=removeRedundantWhiteSpace(type);
+ args=a;
+ args=removeRedundantWhiteSpace(args);
+ if (type.isEmpty()) decl=def->name()+args; else decl=type+" "+def->name()+args;
+
+ memberGroup=0;
+ virt=v;
+ prot=p;
+ related=r;
+ stat=s;
+ mtype=mt;
+ exception=e;
+ proto=FALSE;
+ annScope=FALSE;
+ memSpec=0;
+ annMemb=0;
+ annUsed=FALSE;
+ annEnumType=0;
+ groupAlias=0;
+ explExt=FALSE;
+ tspec=FALSE;
+ cachedAnonymousType=0;
+ maxInitLines=Config_getInt("MAX_INITIALIZER_LINES");
+ userInitLines=-1;
+ docEnumValues=FALSE;
+ // copy function template arguments (if any)
+ if (tal)
+ {
+ tArgList = new ArgumentList;
+ tArgList->setAutoDelete(TRUE);
+ ArgumentListIterator ali(*tal);
+ Argument *a;
+ for (;(a=ali.current());++ali)
+ {
+ tArgList->append(new Argument(*a));
+ }
+ }
+ else
+ {
+ tArgList=0;
+ }
+ //printf("new member al=%p\n",al);
+ // copy function definition arguments (if any)
+ if (al)
+ {
+ defArgList = new ArgumentList;
+ defArgList->setAutoDelete(TRUE);
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (;(a=ali.current());++ali)
+ {
+ //printf("copy argument %s (doc=%s)\n",a->name.data(),a->docs.data());
+ defArgList->append(new Argument(*a));
+ }
+ defArgList->constSpecifier = al->constSpecifier;
+ defArgList->volatileSpecifier = al->volatileSpecifier;
+ defArgList->pureSpecifier = al->pureSpecifier;
+ //printf("defArgList(%p)->constSpecifier=%d\n",defArgList,defArgList->constSpecifier);
+ }
+ else
+ {
+ defArgList=0;
+ }
+ // convert function declaration arguments (if any)
+ if (!args.isEmpty())
+ {
+ declArgList = new ArgumentList;
+ stringToArgumentList(args,declArgList,&extraTypeChars);
+ //printf("setDeclArgList %s to %s const=%d\n",args.data(),
+ // argListToString(declArgList).data(),declArgList->constSpecifier);
+ }
+ else
+ {
+ declArgList = 0;
+ }
+ templateMaster = 0;
+ classSectionSDict = 0;
+ docsForDefinition = TRUE;
+ isTypedefValCached = FALSE;
+ cachedTypedefValue = 0;
+ //inbodyLine = -1;
+ implOnly=FALSE;
+ groupMember = 0;
+ hasDocumentedParams = FALSE;
+ hasDocumentedReturnType = FALSE;
+ docProvider = 0;
+ isDMember = def->getDefFileName().right(2).lower()==".d";
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+/*! Creates a new member definition.
+ *
+ * \param df File containing the definition of this member.
+ * \param dl Line at which the member definition was found.
+ * \param t A string representing the type of the member.
+ * \param na A string representing the name of the member.
+ * \param a A string representing the arguments of the member.
+ * \param e A string representing the throw clause of the members.
+ * \param p The protection context of the member, possible values are:
+ * \c Public, \c Protected, \c Private.
+ * \param v The degree of `virtualness' of the member, possible values are:
+ * \c Normal, \c Virtual, \c Pure.
+ * \param s A boolean that is true iff the member is static.
+ * \param r The relationship between the class and the member.
+ * \param mt The kind of member. See #MemberDef::MemberType for a list of
+ * all types.
+ * \param tal The template arguments of this member.
+ * \param al The arguments of this member. This is a structured form of
+ * the string past as argument \a a.
+ */
+
+MemberDef::MemberDef(const char *df,int dl,
+ const char *t,const char *na,const char *a,const char *e,
+ Protection p,Specifier v,bool s,Relationship r,MemberType mt,
+ const ArgumentList *tal,const ArgumentList *al
+ ) : Definition(df,dl,removeRedundantWhiteSpace(na))
+{
+ //printf("MemberDef::MemberDef(%s)\n",na);
+ m_storagePos=-1;
+ m_cacheHandle=-1;
+ m_impl = new MemberDefImpl;
+ m_impl->init(this,t,a,e,p,v,s,r,mt,tal,al);
+ m_flushPending = FALSE;
+ m_isLinkableCached = 0;
+ m_isConstructorCached = 0;
+ m_isDestructorCached = 0;
+}
+
+void MemberDef::moveTo(Definition *scope)
+{
+ setOuterScope(scope);
+ if (scope->definitionType()==Definition::TypeClass)
+ {
+ m_impl->classDef = (ClassDef*)scope;
+ }
+ else if (scope->definitionType()==Definition::TypeFile)
+ {
+ m_impl->fileDef = (FileDef*)scope;
+ }
+ else if (scope->definitionType()==Definition::TypeNamespace)
+ {
+ m_impl->nspace = (NamespaceDef*)scope;
+ }
+ m_isLinkableCached = 0;
+ m_isConstructorCached = 0;
+}
+
+
+/*! Destroys the member definition. */
+MemberDef::~MemberDef()
+{
+ delete m_impl;
+ if (m_cacheHandle!=-1)
+ {
+ Doxygen::symbolCache->del(m_cacheHandle);
+ m_cacheHandle=-1;
+ }
+}
+
+void MemberDef::setReimplements(MemberDef *md)
+{
+ makeResident();
+ //if (redefines==0) redefines = new MemberList;
+ //if (redefines->find(md)==-1) redefines->inSort(md);
+
+ m_impl->redefines = md;
+}
+
+void MemberDef::insertReimplementedBy(MemberDef *md)
+{
+ makeResident();
+ if (m_impl->templateMaster)
+ {
+ m_impl->templateMaster->insertReimplementedBy(md);
+ }
+ if (m_impl->redefinedBy==0) m_impl->redefinedBy = new MemberList(MemberList::redefinedBy);
+ if (m_impl->redefinedBy->findRef(md)==-1)
+ {
+ m_impl->redefinedBy->inSort(md);
+ }
+}
+
+MemberDef *MemberDef::reimplements() const
+{
+ makeResident();
+ return m_impl->redefines;
+}
+
+LockingPtr<MemberList> MemberDef::reimplementedBy() const
+{
+ makeResident();
+ return LockingPtr<MemberList>(this,m_impl->redefinedBy);
+}
+
+void MemberDef::insertEnumField(MemberDef *md)
+{
+ makeResident();
+ if (m_impl->enumFields==0) m_impl->enumFields=new MemberList(MemberList::enumFields);
+ m_impl->enumFields->append(md);
+}
+
+bool MemberDef::addExample(const char *anchor,const char *nameStr,
+ const char *file)
+{
+ makeResident();
+ //printf("%s::addExample(%s,%s,%s)\n",name().data(),anchor,nameStr,file);
+ if (m_impl->exampleSDict==0) m_impl->exampleSDict = new ExampleSDict;
+ if (m_impl->exampleSDict->find(nameStr)==0)
+ {
+ //printf("Add reference to example %s to member %s\n",nameStr,name.data());
+ Example *e=new Example;
+ e->anchor=anchor;
+ e->name=nameStr;
+ e->file=file;
+ m_impl->exampleSDict->inSort(nameStr,e);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool MemberDef::hasExamples()
+{
+ makeResident();
+ if (m_impl->exampleSDict==0)
+ return FALSE;
+ else
+ return m_impl->exampleSDict->count()>0;
+}
+
+QCString MemberDef::getOutputFileBase() const
+{
+ makeResident();
+ static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
+ QCString baseName;
+ //printf("Member: %s: templateMaster=%p group=%p classDef=%p nspace=%p fileDef=%p\n",
+ // name().data(),m_impl->templateMaster,m_impl->group,m_impl->classDef,
+ // m_impl->nspace,m_impl->fileDef);
+ if (!m_impl->explicitOutputFileBase.isEmpty())
+ {
+ return m_impl->explicitOutputFileBase;
+ }
+ else if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->getOutputFileBase();
+ }
+ else if (m_impl->group)
+ {
+ baseName=m_impl->group->getOutputFileBase();
+ }
+ else if (m_impl->classDef)
+ {
+ baseName=m_impl->classDef->getOutputFileBase();
+ }
+ else if (m_impl->nspace)
+ {
+ baseName=m_impl->nspace->getOutputFileBase();
+ }
+ else if (m_impl->fileDef)
+ {
+ baseName=m_impl->fileDef->getOutputFileBase();
+ }
+
+ if (baseName.isEmpty())
+ {
+ warn(getDefFileName(),getDefLine(),
+ "warning: Internal inconsistency: member %s does not belong to any"
+ " container!",qPrint(name())
+ );
+ return "dummy";
+ }
+ else if (separateMemberPages)
+ {
+ if (getEnumScope()) // enum value, which is part of enum's documentation
+ {
+ baseName+="_"+getEnumScope()->anchor();
+ }
+ else
+ {
+ baseName+="_"+anchor();
+ }
+ }
+ return baseName;
+}
+
+QCString MemberDef::getReference() const
+{
+ makeResident();
+ QCString ref = Definition::getReference();
+ if (!ref.isEmpty())
+ {
+ return ref;
+ }
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->getReference();
+ }
+ else if (m_impl->group)
+ {
+ return m_impl->group->getReference();
+ }
+ else if (m_impl->classDef)
+ {
+ return m_impl->classDef->getReference();
+ }
+ else if (m_impl->nspace)
+ {
+ return m_impl->nspace->getReference();
+ }
+ else if (m_impl->fileDef)
+ {
+ return m_impl->fileDef->getReference();
+ }
+ return "";
+}
+
+QCString MemberDef::anchor() const
+{
+ makeResident();
+ QCString result=m_impl->anc;
+ if (m_impl->groupAlias) return m_impl->groupAlias->anchor();
+ if (m_impl->templateMaster) return m_impl->templateMaster->anchor();
+ if (m_impl->enumScope && m_impl->enumScope!=this) // avoid recursion for C#'s public enum E { E, F }
+ {
+ result.prepend(m_impl->enumScope->anchor());
+ }
+ if (m_impl->group)
+ {
+ if (m_impl->groupMember)
+ {
+ result=m_impl->groupMember->anchor();
+ }
+ else if (getReference().isEmpty())
+ {
+ result.prepend("g");
+ }
+ }
+ return result;
+}
+
+void MemberDef::_computeLinkableInProject()
+{
+ makeResident();
+ static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
+ static bool extractStatic = Config_getBool("EXTRACT_STATIC");
+ m_isLinkableCached = 2; // linkable
+ //printf("MemberDef::isLinkableInProject(name=%s)\n",name().data());
+ if (isHidden())
+ {
+ //printf("is hidden\n");
+ m_isLinkableCached = 1;
+ return;
+ }
+ if (m_impl->templateMaster)
+ {
+ //printf("has template master\n");
+ m_isLinkableCached = m_impl->templateMaster->isLinkableInProject() ? 2 : 1;
+ }
+ if (name().isEmpty() || name().at(0)=='@')
+ {
+ //printf("name invalid\n");
+ m_isLinkableCached = 1; // not a valid or a dummy name
+ return;
+ }
+ if (!hasDocumentation() && !isReference())
+ {
+ //printf("no docs or reference\n");
+ m_isLinkableCached = 1; // no documentation
+ return;
+ }
+ if (m_impl->group && !m_impl->group->isLinkableInProject())
+ {
+ //printf("group but group not linkable!\n");
+ m_isLinkableCached = 1; // group but group not linkable
+ return;
+ }
+ if (!m_impl->group && m_impl->classDef && !m_impl->classDef->isLinkableInProject())
+ {
+ //printf("in a class but class not linkable!\n");
+ m_isLinkableCached = 1; // in class but class not linkable
+ return;
+ }
+ if (!m_impl->group && m_impl->nspace && !m_impl->related && !m_impl->nspace->isLinkableInProject())
+ {
+ //printf("in a namespace but namespace not linkable!\n");
+ m_isLinkableCached = 1; // in namespace but namespace not linkable
+ return;
+ }
+ if (!m_impl->group && !m_impl->nspace &&
+ !m_impl->related && !m_impl->classDef &&
+ m_impl->fileDef && !m_impl->fileDef->isLinkableInProject())
+ {
+ //printf("in a file but file not linkable!\n");
+ m_isLinkableCached = 1; // in file (and not in namespace) but file not linkable
+ return;
+ }
+ if (m_impl->prot==Private && !extractPrivate && m_impl->mtype!=Friend)
+ {
+ //printf("private and invisible!\n");
+ m_isLinkableCached = 1; // hidden due to protection
+ return;
+ }
+ if (m_impl->stat && m_impl->classDef==0 && !extractStatic)
+ {
+ //printf("static and invisible!\n");
+ m_isLinkableCached = 1; // hidden due to staticness
+ return;
+ }
+ //printf("linkable!\n");
+ return; // linkable!
+}
+
+void MemberDef::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
+{
+ makeResident();
+ Definition::setDocumentation(d,docFile,docLine,stripWhiteSpace);
+ m_isLinkableCached = 0;
+}
+
+void MemberDef::setBriefDescription(const char *b,const char *briefFile,int briefLine)
+{
+ makeResident();
+ Definition::setBriefDescription(b,briefFile,briefLine);
+ m_isLinkableCached = 0;
+}
+
+void MemberDef::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
+{
+ makeResident();
+ Definition::setInbodyDocumentation(d,inbodyFile,inbodyLine);
+ m_isLinkableCached = 0;
+}
+
+bool MemberDef::isLinkableInProject() const
+{
+ if (m_isLinkableCached==0)
+ {
+ MemberDef *that = (MemberDef*)this;
+ that->_computeLinkableInProject();
+ }
+ ASSERT(m_isLinkableCached>0);
+ return m_isLinkableCached==2;
+}
+
+bool MemberDef::isLinkable() const
+{
+ makeResident();
+ if (m_impl->templateMaster)
+ {
+ return m_impl->templateMaster->isLinkable();
+ }
+ else
+ {
+ return isLinkableInProject() || isReference();
+ }
+}
+
+
+void MemberDef::setDefinitionTemplateParameterLists(QList<ArgumentList> *lists)
+{
+ if (lists)
+ {
+ makeResident();
+ if (m_impl->defTmpArgLists) delete m_impl->defTmpArgLists;
+ m_impl->defTmpArgLists = copyArgumentLists(lists);
+ }
+}
+
+void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *,
+ FileDef *fd,GroupDef *gd,bool onlyText)
+{
+ static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
+ makeResident();
+ LockingPtr<MemberDef> lock(this,this);
+ QCString sep = optimizeOutputJava ? "." : "::";
+ QCString n = name();
+ if (!hideScopeNames && m_impl->classDef && gd) n.prepend(m_impl->classDef->name()+sep);
+ else if (!hideScopeNames && m_impl->nspace && (gd || fd)) n.prepend(m_impl->nspace->name()+sep);
+ if (isObjCMethod())
+ {
+ if (isStatic()) ol.docify("+ "); else ol.docify("- ");
+ }
+ if (!onlyText) // write link
+ {
+ if (m_impl->mtype==EnumValue && getGroupDef()==0 && // enum value is not grouped
+ getEnumScope() && getEnumScope()->getGroupDef()) // but its container is
+ {
+ GroupDef *enumValGroup = getEnumScope()->getGroupDef();
+ ol.writeObjectLink(enumValGroup->getReference(),
+ enumValGroup->getOutputFileBase(),
+ anchor(),n);
+ }
+ else
+ {
+ ol.writeObjectLink(getReference(),getOutputFileBase(),anchor(),n);
+ }
+ }
+ else // write only text
+ {
+ ol.startBold();
+ ol.docify(n);
+ ol.endBold();
+ }
+}
+
+/*! If this member has an anonymous class/struct/union as its type, then
+ * this method will return the ClassDef that describes this return type.
+ */
+ClassDef *MemberDef::getClassDefOfAnonymousType()
+{
+ makeResident();
+ if (m_impl->cachedAnonymousType) return m_impl->cachedAnonymousType;
+ LockingPtr<MemberDef> lock(this,this);
+
+ QCString cname;
+ if (getClassDef()!=0)
+ {
+ cname=getClassDef()->name().copy();
+ }
+ else if (getNamespaceDef()!=0)
+ {
+ cname=getNamespaceDef()->name().copy();
+ }
+ QCString ltype(m_impl->type);
+ // strip `static' keyword from ltype
+ //if (ltype.left(7)=="static ") ltype=ltype.right(ltype.length()-7);
+ // strip `friend' keyword from ltype
+ ltype.stripPrefix("friend ");
+ static QRegExp r("@[0-9]+");
+ int l,i=r.match(ltype,0,&l);
+ //printf("ltype=`%s' i=%d\n",ltype.data(),i);
+ // search for the last anonymous scope in the member type
+ ClassDef *annoClassDef=0;
+ if (i!=-1) // found anonymous scope in type
+ {
+ int il=i-1,ir=i+l;
+ // extract anonymous scope
+ while (il>=0 && (isId(ltype.at(il)) || ltype.at(il)==':' || ltype.at(il)=='@')) il--;
+ if (il>0) il++; else if (il<0) il=0;
+ while (ir<(int)ltype.length() && (isId(ltype.at(ir)) || ltype.at(ir)==':' || ltype.at(ir)=='@')) ir++;
+
+ QCString annName = ltype.mid(il,ir-il);
+
+ // if inside a class or namespace try to prepend the scope name
+ if (!cname.isEmpty() && annName.left(cname.length()+2)!=cname+"::")
+ {
+ QCString ts=stripAnonymousNamespaceScope(cname+"::"+annName);
+ //printf("Member::writeDeclaration: Trying %s\n",ts.data());
+ annoClassDef=getClass(ts);
+ }
+ // if not found yet, try without scope name
+ if (annoClassDef==0)
+ {
+ QCString ts=stripAnonymousNamespaceScope(annName);
+ //printf("Member::writeDeclaration: Trying %s\n",ts.data());
+ annoClassDef=getClass(ts);
+ }
+ }
+ m_impl->cachedAnonymousType = annoClassDef;
+ return annoClassDef;
+}
+
+/*! This methods returns TRUE iff the brief section (also known as
+ * declaration section) is visible in the documentation.
+ */
+bool MemberDef::isBriefSectionVisible() const
+{
+ static bool extractStatic = Config_getBool("EXTRACT_STATIC");
+ static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
+ static bool briefMemberDesc = Config_getBool("BRIEF_MEMBER_DESC");
+ static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
+ static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS");
+ static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
+
+ //printf("Member %s grpId=%d docs=%s file=%s args=%s\n",
+ // name().data(),
+ // 0,"", //grpId,grpId==-1?"<none>":Doxygen::memberDocDict[grpId]->data(),
+ // "", //getFileDef()->name().data(),
+ // argsString());
+
+ makeResident();
+ LockingPtr<MemberDef> lock(this,this);
+ MemberGroupInfo *info = Doxygen::memGrpInfoDict[m_impl->grpId];
+ //printf("name=%s m_impl->grpId=%d info=%p\n",name().data(),m_impl->grpId,info);
+ //QCString *pMemGrp = Doxygen::memberDocDict[grpId];
+ bool hasDocs = hasDocumentation() ||
+ // part of a documented member group
+ (m_impl->grpId!=-1 && info && !(info->doc.isEmpty() && info->header.isEmpty()));
+
+ // only include static members with file/namespace scope if
+ // explicitly enabled in the config file
+ bool visibleIfStatic = !(getClassDef()==0 &&
+ isStatic() &&
+ !extractStatic
+ );
+
+ // only include members is the are documented or
+ // HIDE_UNDOC_MEMBERS is NO in the config file
+ bool visibleIfDocumented = (!hideUndocMembers ||
+ hasDocs ||
+ isDocumentedFriendClass()
+ );
+
+ // hide members with no detailed description and brief descriptions
+ // explicitly disabled.
+ bool visibleIfEnabled = !(hideUndocMembers &&
+ documentation().isEmpty() &&
+ !briefMemberDesc &&
+ !repeatBrief
+ );
+
+ // Hide friend (class|struct|union) declarations if HIDE_FRIEND_COMPOUNDS is true
+ bool visibleIfFriendCompound = !(hideFriendCompounds &&
+ isFriend() &&
+ (m_impl->type=="friend class" ||
+ m_impl->type=="friend struct" ||
+ m_impl->type=="friend union"
+ )
+ );
+
+ // only include members that are non-private unless EXTRACT_PRIVATE is
+ // set to YES or the member is part of a group
+ bool visibleIfPrivate = (protection()!=Private ||
+ extractPrivate ||
+ m_impl->mtype==Friend
+ );
+
+ // hide member if it overrides a member in a superclass and has no
+ // documentation of its own
+ //bool visibleIfDocVirtual = !reimplements() ||
+ // !Config_getBool("INHERIT_DOCS") ||
+ // hasDocs;
+
+ // true if this member is a constructor or destructor
+ bool cOrDTor = isConstructor() || isDestructor();
+
+ // hide default constructors or destructors (no args) without
+ // documentation
+ bool visibleIfNotDefaultCDTor = !(cOrDTor &&
+ m_impl->defArgList &&
+ (m_impl->defArgList->isEmpty() ||
+ m_impl->defArgList->first()->type == "void"
+ ) &&
+ !hasDocs
+ );
+
+
+ //printf("visibleIfStatic=%d visibleIfDocumented=%d visibleIfEnabled=%d "
+ // "visibleIfPrivate=%d visibltIfNotDefaultCDTor=%d "
+ // "visibleIfFriendCompound=%d !annScope=%d\n",
+ // visibleIfStatic,visibleIfDocumented,
+ // visibleIfEnabled,visibleIfPrivate,visibleIfNotDefaultCDTor,
+ // visibleIfFriendCompound,!m_impl->annScope);
+
+ bool visible = visibleIfStatic && visibleIfDocumented &&
+ visibleIfEnabled && visibleIfPrivate &&
+ /*visibleIfDocVirtual &&*/ visibleIfNotDefaultCDTor &&
+ visibleIfFriendCompound &&
+ !m_impl->annScope;
+ //printf("MemberDef::isBriefSectionVisible() %d\n",visible);
+ return visible;
+}
+
+
+void MemberDef::writeDeclaration(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ bool inGroup
+ )
+{
+ //printf("%s MemberDef::writeDeclaration() inGroup=%d\n",name().data(),inGroup);
+
+ // hide enum value, since they appear already as part of the enum, unless they
+ // are explicitly grouped.
+ makeResident();
+ if (!inGroup && m_impl->mtype==EnumValue) return;
+ LockingPtr<MemberDef> lock(this,this);
+
+ // hide members whose brief section should not be visible
+ //if (!isBriefSectionVisible()) return;
+
+ Definition *d=0;
+ ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something
+ if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
+
+ // write tag file information of this member
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !isReference())
+ {
+ Doxygen::tagFile << " <member kind=\"";
+ switch (m_impl->mtype)
+ {
+ case Define: Doxygen::tagFile << "define"; break;
+ case EnumValue: Doxygen::tagFile << "enumvalue"; break;
+ case Property: Doxygen::tagFile << "property"; break;
+ case Event: Doxygen::tagFile << "event"; break;
+ case Variable: Doxygen::tagFile << "variable"; break;
+ case Typedef: Doxygen::tagFile << "typedef"; break;
+ case Enumeration: Doxygen::tagFile << "enumeration"; break;
+ case Function: Doxygen::tagFile << "function"; break;
+ case Signal: Doxygen::tagFile << "signal"; break;
+ //case Prototype: Doxygen::tagFile << "prototype"; break;
+ case Friend: Doxygen::tagFile << "friend"; break;
+ case DCOP: Doxygen::tagFile << "dcop"; break;
+ case Slot: Doxygen::tagFile << "slot"; break;
+ }
+ if (m_impl->prot!=Public)
+ {
+ Doxygen::tagFile << "\" protection=\"";
+ if (m_impl->prot==Protected) Doxygen::tagFile << "protected";
+ else if (m_impl->prot==Package) Doxygen::tagFile << "package";
+ else /* Private */ Doxygen::tagFile << "private";
+ }
+ if (m_impl->virt!=Normal)
+ {
+ Doxygen::tagFile << "\" virtualness=\"";
+ if (m_impl->virt==Virtual) Doxygen::tagFile << "virtual";
+ else /* Pure */ Doxygen::tagFile << "pure";
+ }
+ if (isStatic())
+ {
+ Doxygen::tagFile << "\" static=\"yes";
+ }
+ Doxygen::tagFile << "\">" << endl;
+ Doxygen::tagFile << " <type>" << convertToXML(typeString()) << "</type>" << endl;
+ Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
+ Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
+ Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
+ Doxygen::tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>" << endl;
+ writeDocAnchorsToTagFile();
+ Doxygen::tagFile << " </member>" << endl;
+ }
+
+ // write search index info
+ if (Doxygen::searchIndex && isLinkableInProject())
+ {
+ Doxygen::searchIndex->setCurrentDoc(qualifiedName(),getOutputFileBase(),anchor());
+ Doxygen::searchIndex->addWord(localName(),TRUE);
+ Doxygen::searchIndex->addWord(qualifiedName(),FALSE);
+ }
+
+ QCString cname = d->name();
+ QCString cfname = getOutputFileBase();
+ //QCString osname = cname;
+ // in case of class members that are put in a group the name of the outerscope
+ // differs from the cname.
+ //if (getOuterScope()) osname=getOuterScope()->name();
+
+ //HtmlHelp *htmlHelp=0;
+ //bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
+ //if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
+
+ // search for the last anonymous scope in the member type
+ ClassDef *annoClassDef=getClassDefOfAnonymousType();
+
+ // start a new member declaration
+ bool isAnonymous = annoClassDef || m_impl->annMemb || m_impl->annEnumType;
+ ///printf("startMemberItem for %s\n",name().data());
+ ol.startMemberItem( isAnonymous ? 1 : m_impl->tArgList ? 3 : 0);
+
+ // If there is no detailed description we need to write the anchor here.
+ bool detailsVisible = isDetailedSectionLinkable();
+ if (!detailsVisible && !m_impl->annMemb)
+ {
+ QCString doxyName=name().copy();
+ if (!cname.isEmpty()) doxyName.prepend(cname+"::");
+ QCString doxyArgs=argsString();
+ ol.startDoxyAnchor(cfname,cname,anchor(),doxyName,doxyArgs);
+
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Latex);
+ ol.docify("\n");
+ ol.popGeneratorState();
+ }
+
+ if (annoClassDef || m_impl->annMemb)
+ {
+ int j;
+ for (j=0;j<s_indentLevel;j++)
+ {
+ ol.writeNonBreakableSpace(3);
+ }
+ }
+
+ // *** write template lists
+ if (m_impl->tArgList)
+ {
+ if (!isAnonymous) ol.startMemberTemplateParams();
+ writeTemplatePrefix(ol,m_impl->tArgList);
+ if (!isAnonymous) ol.endMemberTemplateParams();
+ }
+
+ // *** write type
+ QCString ltype(m_impl->type);
+ if (m_impl->mtype==Typedef) ltype.prepend("typedef ");
+ // strip `friend' keyword from ltype
+ ltype.stripPrefix("friend ");
+ static QRegExp r("@[0-9]+");
+
+ bool endAnonScopeNeeded=FALSE;
+ int l,i=r.match(ltype,0,&l);
+ if (i!=-1) // member has an anonymous type
+ {
+ //printf("annoClassDef=%p annMemb=%p scopeName=`%s' anonymous=`%s'\n",
+ // annoClassDef,annMemb,cname.data(),ltype.mid(i,l).data());
+
+ if (annoClassDef) // type is an anonymous compound
+ {
+ int ir=i+l;
+ //printf("<<<<<<<<<<<<<<\n");
+ ol.startAnonTypeScope(s_indentLevel++);
+ annoClassDef->writeDeclaration(ol,m_impl->annMemb,inGroup);
+ //printf(">>>>>>>>>>>>>> startMemberItem(2)\n");
+ ol.startMemberItem(2);
+ int j;
+ for (j=0;j< s_indentLevel-1;j++)
+ {
+ ol.writeNonBreakableSpace(3);
+ }
+ QCString varName=ltype.right(ltype.length()-ir).stripWhiteSpace();
+ //printf(">>>>>> indDepth=%d ltype=`%s' varName=`%s'\n",indDepth,ltype.data(),varName.data());
+ ol.docify("}");
+ if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@'))
+ {
+ ol.docify(";");
+ }
+ endAnonScopeNeeded=TRUE;
+ }
+ else
+ {
+ if (getAnonymousEnumType()) // type is an anonymous enum
+ {
+ linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),ltype.left(i),TRUE);
+ getAnonymousEnumType()->writeEnumDeclaration(ol,cd,nd,fd,gd);
+ //ol+=*getAnonymousEnumType()->enumDecl();
+ linkifyText(TextGeneratorOLImpl(ol),d,m_impl->fileDef,name(),ltype.right(ltype.length()-i-l),TRUE);
+ }
+ else
+ {
+ ltype = ltype.left(i) + " { ... } " + removeAnonymousScopes(ltype.right(ltype.length()-i-l));
+ linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),ltype,TRUE);
+ }
+ }
+ }
+ else if (ltype=="@") // rename type from enum values
+ {
+ ltype="";
+ }
+ else
+ {
+ if (isObjCMethod())
+ {
+ ltype.prepend("(");
+ ltype.append(")");
+ }
+ linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),ltype,TRUE);
+ }
+ bool htmlOn = ol.isEnabled(OutputGenerator::Html);
+ if (htmlOn && Config_getBool("HTML_ALIGN_MEMBERS") && !ltype.isEmpty())
+ {
+ ol.disable(OutputGenerator::Html);
+ }
+ if (!ltype.isEmpty()) ol.docify(" ");
+ if (htmlOn)
+ {
+ ol.enable(OutputGenerator::Html);
+ }
+
+ if (m_impl->annMemb)
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeNonBreakableSpace(3);
+ ol.popGeneratorState();
+ }
+ else
+ {
+ ol.insertMemberAlign(m_impl->tArgList!=0);
+ }
+
+ // *** write name
+ if (!name().isEmpty() && name().at(0)!='@') // hide anonymous stuff
+ {
+ //printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d\n",name().data(),gd,getGroupDef(),inGroup,isLinkable());
+ if (!(name().isEmpty() || name().at(0)=='@') && // name valid
+ (hasDocumentation() || isReference()) && // has docs
+ !(m_impl->prot==Private && !Config_getBool("EXTRACT_PRIVATE") && m_impl->mtype!=Friend) && // hidden due to protection
+ !(isStatic() && m_impl->classDef==0 && !Config_getBool("EXTRACT_STATIC")) // hidden due to static-ness
+ )
+ {
+ if (m_impl->annMemb)
+ {
+ //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
+ m_impl->annMemb->writeLink(ol,
+ m_impl->annMemb->getClassDef(),
+ m_impl->annMemb->getNamespaceDef(),
+ m_impl->annMemb->getFileDef(),
+ m_impl->annMemb->getGroupDef()
+ );
+ m_impl->annMemb->setAnonymousUsed();
+ setAnonymousUsed();
+ }
+ else
+ {
+ //printf("writeLink %s->%d\n",name.data(),hasDocumentation());
+ ClassDef *rcd = cd;
+ if (isReference() && m_impl->classDef) rcd = m_impl->classDef;
+ writeLink(ol,rcd,nd,fd,gd);
+ }
+ }
+ else if (isDocumentedFriendClass())
+ // if the member is an undocumented friend declaration for some class,
+ // then maybe we can link to the class
+ {
+ writeLink(ol,getClass(name()),0,0,0);
+ }
+ else
+ // there is a brief member description and brief member
+ // descriptions are enabled or there is no detailed description.
+ {
+ if (m_impl->annMemb)
+ {
+ m_impl->annMemb->setAnonymousUsed();
+ setAnonymousUsed();
+ }
+ ClassDef *rcd = cd;
+ if (isReference() && m_impl->classDef) rcd = m_impl->classDef;
+ writeLink(ol,rcd,nd,fd,gd,TRUE);
+ }
+ }
+
+ // add to index
+ if (isEnumerate() && name().at(0)=='@')
+ {
+ // don't add to index
+ }
+ else // index member
+ {
+ //static bool separateMemPages = Config_getBool("SEPARATE_MEMBER_PAGES");
+ //QCString cfname = getOutputFileBase();
+ //QCString cfiname = d->getOutputFileBase();
+ //Doxygen::indexList.addIndexItem(
+ // cname, // level1
+ // name(), // level2
+ // separateMemPages ? cfname : cfiname, // contRef
+ // cfname, // memRef
+ // anchor(), // anchor
+ // this); // memberdef
+ Doxygen::indexList.addIndexItem(d,this);
+ }
+
+ // *** write arguments
+ if (argsString() && !isObjCMethod())
+ {
+ if (!isDefine()) ol.writeString(" ");
+ //ol.docify(argsString());
+ linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),argsString());
+ }
+
+ // *** write exceptions
+ if (excpString())
+ {
+ ol.writeString(" ");
+ ol.docify(excpString());
+ }
+
+ // *** write bitfields
+ if (!m_impl->bitfields.isEmpty()) // add bitfields
+ {
+ linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),m_impl->bitfields.simplifyWhiteSpace());
+ }
+ else if (hasOneLineInitializer()
+ //!init.isEmpty() && initLines==0 && // one line initializer
+ //((maxInitLines>0 && userInitLines==-1) || userInitLines>0) // enabled by default or explicitly
+ ) // add initializer
+ {
+ if (!isDefine())
+ {
+ ol.writeString(" = ");
+ linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),m_impl->initializer.simplifyWhiteSpace());
+ }
+ else
+ {
+ ol.writeNonBreakableSpace(3);
+ linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),m_impl->initializer);
+ }
+ }
+
+ if (isObjCMethod() && isImplementation())
+ {
+ ol.startTypewriter();
+ ol.docify(" [implementation]");
+ ol.endTypewriter();
+ }
+
+ if (isProperty() && (isSettable() || isGettable()))
+ {
+ ol.writeLatexSpacing();
+ ol.startTypewriter();
+ ol.docify(" [");
+ QStrList sl;
+ if (isGettable()) sl.append("get");
+ if (isSettable()) sl.append("set");
+ const char *s=sl.first();
+ while (s)
+ {
+ ol.docify(s);
+ s=sl.next();
+ if (s) ol.docify(", ");
+ }
+ ol.docify("]");
+ ol.endTypewriter();
+ }
+
+ if (isEvent() && (isAddable() || isRemovable() || isRaisable()))
+ {
+ ol.writeLatexSpacing();
+ ol.startTypewriter();
+ ol.docify(" [");
+ QStrList sl;
+ if (isAddable()) sl.append("add");
+ if (isRemovable()) sl.append("remove");
+ if (isRaisable()) sl.append("raise");
+ const char *s=sl.first();
+ while (s)
+ {
+ ol.docify(s);
+ s=sl.next();
+ if (s) ol.docify(", ");
+ }
+ ol.docify("]");
+ ol.endTypewriter();
+ }
+
+ if (!detailsVisible && !m_impl->annMemb)
+ {
+ ol.endDoxyAnchor(cfname,anchor());
+ }
+
+ //printf("endMember %s annoClassDef=%p annEnumType=%p\n",
+ // name().data(),annoClassDef,annEnumType);
+ ol.endMemberItem();
+ if (endAnonScopeNeeded)
+ {
+ ol.endAnonTypeScope(--s_indentLevel);
+ }
+
+ // write brief description
+ if (!briefDescription().isEmpty() &&
+ Config_getBool("BRIEF_MEMBER_DESC")
+ /* && !annMemb */
+ )
+ {
+ ol.startMemberDescription();
+ ol.parseDoc(briefFile(),briefLine(),
+ getOuterScope()?getOuterScope():d,this,briefDescription(),
+ TRUE,FALSE,0,TRUE,FALSE);
+ if (detailsVisible)
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ //ol.endEmphasis();
+ ol.docify(" ");
+ if (m_impl->group!=0 && gd==0) // forward link to the group
+ {
+ ol.startTextLink(getOutputFileBase(),anchor());
+ }
+ else // local link
+ {
+ ol.startTextLink(0,anchor());
+ }
+ ol.endTextLink();
+ //ol.startEmphasis();
+ ol.popGeneratorState();
+ }
+ // for RTF we need to add an extra empty paragraph
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::RTF);
+ ol.startParagraph();
+ ol.endParagraph();
+ ol.popGeneratorState();
+ ol.endMemberDescription();
+ }
+ warnIfUndocumented();
+}
+
+bool MemberDef::isDetailedSectionLinkable() const
+{
+ static bool extractAll = Config_getBool("EXTRACT_ALL");
+ static bool alwaysDetailedSec = Config_getBool("ALWAYS_DETAILED_SEC");
+ static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
+ static bool briefMemberDesc = Config_getBool("BRIEF_MEMBER_DESC");
+ static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
+ static bool extractStatic = Config_getBool("EXTRACT_STATIC");
+ static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
+
+ makeResident();
+ // the member has details documentation for any of the following reasons
+ bool docFilter =
+ // treat everything as documented
+ extractAll ||
+ // has detailed docs
+ !documentation().isEmpty() ||
+ // has inbody docs
+ !inbodyDocumentation().isEmpty() ||
+ // is an enum with values that are documented
+ (m_impl->mtype==Enumeration && m_impl->docEnumValues) ||
+ // is documented enum value
+ (m_impl->mtype==EnumValue && !briefDescription().isEmpty()) ||
+ // has brief description that is part of the detailed description
+ (!briefDescription().isEmpty() && // has brief docs
+ (alwaysDetailedSec && // they are visible in
+ (repeatBrief || // detailed section or
+ !briefMemberDesc // they are explicitly not
+ ) // shown in brief section
+ )
+ ) ||
+ // has a multi-line initialization block
+ //(initLines>0 && initLines<maxInitLines) ||
+ (hasMultiLineInitializer() && !hideUndocMembers) ||
+ // has one or more documented arguments
+ (m_impl->defArgList!=0 && m_impl->defArgList->hasDocumentation()) ||
+ // has user comments
+ Doxygen::userComments
+ ;
+
+ // this is not a global static or global statics should be extracted
+ bool staticFilter = getClassDef()!=0 || !isStatic() || extractStatic;
+
+ // only include members that are non-private unless EXTRACT_PRIVATE is
+ // set to YES or the member is part of a group
+ bool privateFilter = (protection()!=Private || extractPrivate ||
+ m_impl->mtype==Friend
+ );
+
+ // member is part of an anonymous scope that is the type of
+ // another member in the list.
+ //
+ //bool inAnonymousScope = !briefDescription().isEmpty() && annUsed;
+
+ // hide friend (class|struct|union) member if HIDE_FRIEND_COMPOUNDS
+ // is true
+ bool friendCompoundFilter = !(Config_getBool("HIDE_FRIEND_COMPOUNDS") &&
+ isFriend() &&
+ (m_impl->type=="friend class" ||
+ m_impl->type=="friend struct" ||
+ m_impl->type=="friend union"
+ )
+ );
+
+ return ((docFilter && staticFilter && privateFilter && friendCompoundFilter) /*|| inAnonymousScope*/);
+}
+
+bool MemberDef::isDetailedSectionVisible(bool inGroup,bool inFile) const
+{
+ static bool separateMemPages = Config_getBool("SEPARATE_MEMBER_PAGES");
+ bool groupFilter = getGroupDef()==0 || inGroup || separateMemPages;
+ bool fileFilter = getNamespaceDef()==0 || !inFile;
+
+ bool visible = isDetailedSectionLinkable() && groupFilter && fileFilter &&
+ !isReference();
+ //printf("MemberDef::isDetailedSectionVisible() %d\n",visible);
+ return visible;
+}
+
+/*! Writes the "detailed documentation" section of this member to
+ * all active output formats.
+ */
+void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
+ const char *scName,
+ Definition *container,
+ bool inGroup,
+ bool showEnumValues,
+ bool showInline
+ )
+{
+ // if this member is in a group find the real scope name.
+ bool hasParameterList = FALSE;
+ bool inFile = container->definitionType()==Definition::TypeFile;
+ bool hasDocs = isDetailedSectionVisible(inGroup,inFile);
+ static bool optVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ //printf("MemberDef::writeDocumentation(): name=`%s' hasDocs=`%d' containerType=%d inGroup=%d\n",
+ // name().data(),hasDocs,container->definitionType(),inGroup);
+ if ( !hasDocs ) return;
+ if (isEnumValue() && !showEnumValues) return;
+
+ makeResident();
+ LockingPtr<MemberDef> lock(this,this);
+
+ QCString scopeName = scName;
+ QCString memAnchor = anchor();
+ QCString ciname = container->name();
+ if (container->definitionType()==TypeGroup)
+ {
+ if (getClassDef()) scopeName=getClassDef()->name();
+ else if (getNamespaceDef()) scopeName=getNamespaceDef()->name();
+ else if (getFileDef()) scopeName=getFileDef()->name();
+ ciname = ((GroupDef *)container)->groupTitle();
+ }
+ else if (container->definitionType()==TypeFile && getNamespaceDef())
+ { // member is in a namespace, but is written as part of the file documentation
+ // as well, so we need to make sure its label is unique.
+ memAnchor.prepend("file_");
+ }
+
+ QCString cname = container->name();
+ QCString cfname = getOutputFileBase();
+ QCString cfiname = container->getOutputFileBase();
+
+ // get member name
+ QCString doxyName=name();
+ // prepend scope if there is any. TODO: make this optional for C only docs
+ if (scopeName) doxyName.prepend((QCString)scopeName+"::");
+ QCString doxyArgs=argsString();
+
+ QCString ldef = definition();
+ //printf("member `%s' def=`%s'\n",name().data(),ldef.data());
+ if (isEnumerate())
+ {
+ if (name().at(0)=='@')
+ {
+ ldef = "anonymous enum";
+ }
+ else
+ {
+ ldef.prepend("enum ");
+ }
+ }
+ else if (isEnumValue())
+ {
+ if (ldef.at(0)=='@')
+ {
+ ldef=ldef.mid(2);
+ }
+ }
+ int i=0,l;
+ static QRegExp r("@[0-9]+");
+
+ //----------------------------------------
+
+ ol.pushGeneratorState();
+
+
+ if ((isVariable() || isTypedef()) && (i=r.match(ldef,0,&l))!=-1)
+ {
+ // find enum type and insert it in the definition
+ MemberListIterator vmli(*ml);
+ MemberDef *vmd;
+ bool found=FALSE;
+ for ( ; (vmd=vmli.current()) && !found ; ++vmli)
+ {
+ if (vmd->isEnumerate() && ldef.mid(i,l)==vmd->name())
+ {
+ ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
+ ol.startMemberDoc(ciname,name(),memAnchor,name(),showInline);
+ linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.left(i));
+ vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef());
+ linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.right(ldef.length()-i-l));
+
+ found=TRUE;
+ }
+ }
+ if (!found) // anonymous compound
+ {
+ //printf("Anonymous compound `%s'\n",cname.data());
+ ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
+ ol.startMemberDoc(ciname,name(),memAnchor,name(),showInline);
+ // strip anonymous compound names from definition
+ int si=ldef.find(' '),pi,ei=i+l;
+ if (si==-1) si=0;
+ while ((pi=r.match(ldef,i+l,&l))!=-1) ei=i=pi+l;
+ // first si characters of ldef contain compound type name
+ ol.startMemberDocName(isObjCMethod());
+ ol.docify(ldef.left(si));
+ ol.docify(" { ... } ");
+ // last ei characters of ldef contain pointer/reference specifiers
+ int ni=ldef.find("::",si);
+ if (ni>=ei) ei=ni+2;
+ linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.right(ldef.length()-ei));
+ }
+ }
+ else // not an enum value
+ {
+ ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
+ ol.startMemberDoc(ciname,name(),memAnchor,name(),showInline);
+
+ ClassDef *cd=getClassDef();
+ if (!Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ bool first=TRUE;
+ if (m_impl->defTmpArgLists)
+ // definition has explicit template parameter declarations
+ {
+ QListIterator<ArgumentList> ali(*m_impl->defTmpArgLists);
+ ArgumentList *tal;
+ for (ali.toFirst();(tal=ali.current());++ali)
+ {
+ if (tal->count()>0)
+ {
+ if (!first) ol.docify(" ");
+ ol.startMemberDocPrefixItem();
+ writeTemplatePrefix(ol,tal);
+ ol.endMemberDocPrefixItem();
+ }
+ }
+ }
+ else // definition gets it template parameters from its class
+ // (since no definition was found)
+ {
+ if (cd && !isTemplateSpecialization())
+ {
+ QList<ArgumentList> tempParamLists;
+ cd->getTemplateParameterLists(tempParamLists);
+ //printf("#tempParamLists=%d\n",tempParamLists.count());
+ QListIterator<ArgumentList> ali(tempParamLists);
+ ArgumentList *tal;
+ for (ali.toFirst();(tal=ali.current());++ali)
+ {
+ if (tal->count()>0)
+ {
+ if (!first) ol.docify(" ");
+ ol.startMemberDocPrefixItem();
+ writeTemplatePrefix(ol,tal);
+ ol.endMemberDocPrefixItem();
+ }
+ }
+ }
+ if (m_impl->tArgList) // function template prefix
+ {
+ ol.startMemberDocPrefixItem();
+ writeTemplatePrefix(ol,m_impl->tArgList);
+ ol.endMemberDocPrefixItem();
+ }
+ }
+ }
+
+ ol.startMemberDocName(isObjCMethod());
+ if (cd && cd->isObjectiveC())
+ {
+ // strip scope name
+ int ep = ldef.find("::");
+ if (ep!=-1)
+ {
+ int sp=ldef.findRev(' ',ep);
+ if (sp!=-1)
+ {
+ ldef=ldef.left(sp+1)+ldef.mid(ep+2);
+ }
+ }
+ // strip keywords
+ int dp = ldef.find(':');
+ if (dp!=-1)
+ {
+ ldef=ldef.left(dp+1);
+ }
+ int l=ldef.length();
+ //printf("start >%s<\n",ldef.data());
+ int i=l-1;
+ while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
+ while (i>=0 && isspace((uchar)ldef.at(i))) i--;
+ if (i>0)
+ {
+ // insert braches around the type
+ QCString tmp("("+ldef.left(i+1)+")"+ldef.mid(i+1));
+ ldef=tmp;
+ }
+ //printf("end >%s< i=%d\n",ldef.data(),i);
+ if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
+ }
+
+ if (optVhdl)
+ {
+ VhdlDocGen::writeVHDLTypeDocumentation(this,container,ol);
+ }
+ else
+ {
+ linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef);
+ hasParameterList=writeDefArgumentList(ol,cd,scopeName,this);
+ }
+
+ if (hasOneLineInitializer()) // add initializer
+ {
+ if (!isDefine())
+ {
+ ol.docify(" = ");
+ linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),m_impl->initializer.simplifyWhiteSpace());
+ }
+ else
+ {
+ ol.writeNonBreakableSpace(3);
+ linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),m_impl->initializer);
+ }
+ }
+ if (excpString()) // add exception list
+ {
+ ol.docify(" ");
+ linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),excpString());
+ }
+ }
+
+ Specifier lvirt=virtualness();
+
+ if ((!isObjCMethod() || isOptional() || isRequired()) &&
+ (protection()!=Public || lvirt!=Normal ||
+ isFriend() || isRelated() ||
+ (isInline() && Config_getBool("INLINE_INFO")) ||
+ isSignal() || isSlot() ||
+ isStatic() ||
+ (m_impl->classDef && m_impl->classDef!=container && container->definitionType()==TypeClass) ||
+ (m_impl->memSpec & ~Entry::Inline)!=0
+ )
+ )
+ {
+ // write the member specifier list
+ ol.writeLatexSpacing();
+ ol.startTypewriter();
+ ol.docify(" [");
+ QStrList sl;
+ if (optVhdl)
+ {
+ sl.append(VhdlDocGen::trTypeString(getMemberSpecifiers()));
+ }
+ else
+ {
+ if (isFriend()) sl.append("friend");
+ else if (isRelated()) sl.append("related");
+ else
+ {
+ if (Config_getBool("INLINE_INFO") && isInline()) sl.append("inline");
+ if (isExplicit()) sl.append("explicit");
+ if (isMutable()) sl.append("mutable");
+ if (isStatic()) sl.append("static");
+ if (isGettable()) sl.append("get");
+ if (isSettable()) sl.append("set");
+ if (isAddable()) sl.append("add");
+ if (isRemovable()) sl.append("remove");
+ if (isRaisable()) sl.append("raise");
+ if (isReadable()) sl.append("read");
+ if (isWritable()) sl.append("write");
+ if (isFinal()) sl.append("final");
+ if (isAbstract()) sl.append("abstract");
+ if (isOverride()) sl.append("override");
+ if (isInitonly()) sl.append("initonly");
+ if (isSealed()) sl.append("sealed");
+ if (isNew()) sl.append("new");
+ if (isOptional()) sl.append("optional");
+ if (isRequired()) sl.append("required");
+ if (isAssign()) sl.append("assign");
+ else if (isCopy()) sl.append("copy");
+ else if (isRetain()) sl.append("retain");
+
+ if (!isObjCMethod())
+ {
+ if (protection()==Protected) sl.append("protected");
+ else if (protection()==Private) sl.append("private");
+ else if (protection()==Package) sl.append("package");
+
+ if (lvirt==Virtual) sl.append("virtual");
+ else if (lvirt==Pure) sl.append("pure virtual");
+ if (isSignal()) sl.append("signal");
+ if (isSlot()) sl.append("slot");
+ }
+ }
+ if (m_impl->classDef &&
+ container->definitionType()==TypeClass &&
+ m_impl->classDef!=container
+ )
+ {
+ sl.append("inherited");
+ }
+ }
+ const char *s=sl.first();
+ while (s)
+ {
+ ol.docify(s);
+ s=sl.next();
+ if (s) ol.docify(", ");
+ }
+ ol.docify("]");
+ ol.endTypewriter();
+ }
+ else if (isObjCMethod() && isImplementation())
+ {
+ ol.writeLatexSpacing();
+ ol.startTypewriter();
+ ol.docify(" [implementation]");
+ ol.endTypewriter();
+ }
+ if (hasParameterList)
+ {
+ ol.endParameterList();
+ ol.endMemberDoc(TRUE);
+ }
+ else
+ {
+ ol.endMemberDocName();
+ ol.endMemberDoc(FALSE);
+ }
+ ol.endDoxyAnchor(cfname,memAnchor);
+ ol.startIndent();
+
+ // FIXME:PARA
+ //ol.pushGeneratorState();
+ //ol.disable(OutputGenerator::RTF);
+ //ol.newParagraph();
+ //ol.popGeneratorState();
+
+ /* write multi-line initializer (if any) */
+ if (hasMultiLineInitializer()
+ //initLines>0 && ((initLines<maxInitLines && userInitLines==-1) // implicitly enabled
+ // || initLines<userInitLines // explicitly enabled
+ // )
+ )
+ {
+ //printf("md=%s initLines=%d init=`%s'\n",name().data(),initLines,init.data());
+ ol.startBold();
+ if (m_impl->mtype==Define)
+ ol.parseText(theTranslator->trDefineValue());
+ else
+ ol.parseText(theTranslator->trInitialValue());
+ ol.endBold();
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
+ pIntf->resetCodeParserState();
+ ol.startCodeFragment();
+ pIntf->parseCode(ol,scopeName,m_impl->initializer,FALSE,0,getFileDef(),
+ -1,-1,TRUE,this,FALSE);
+ ol.endCodeFragment();
+ }
+
+ QCString brief = briefDescription();
+ QCString detailed = documentation();
+ LockingPtr<ArgumentList> docArgList = LockingPtr<ArgumentList>(this,m_impl->defArgList);
+ if (m_impl->templateMaster)
+ {
+ brief = m_impl->templateMaster->briefDescription();
+ detailed = m_impl->templateMaster->documentation();
+ docArgList = m_impl->templateMaster->argumentList();
+ }
+
+ /* write brief description */
+ if (!brief.isEmpty() &&
+ (Config_getBool("REPEAT_BRIEF") ||
+ !Config_getBool("BRIEF_MEMBER_DESC")
+ )
+ )
+ {
+ ol.startParagraph();
+ ol.parseDoc(briefFile(),briefLine(),
+ getOuterScope()?getOuterScope():container,this,
+ brief,FALSE,FALSE,0,TRUE,FALSE);
+ ol.endParagraph();
+ }
+
+ /* write detailed description */
+ if (!detailed.isEmpty() ||
+ !inbodyDocumentation().isEmpty())
+ {
+ // write vhdl inline code with or without option INLINE_SOURCE
+ if (optVhdl && VhdlDocGen::isMisc(this))
+ {
+ VhdlDocGen::writeSource(this,ol,cname);
+ return;
+ }
+ else
+ {
+ ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
+ }
+
+ if (!inbodyDocumentation().isEmpty())
+ {
+ ol.startParagraph();
+ ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE);
+ ol.endParagraph();
+ }
+ }
+ else if (!brief.isEmpty() && (Config_getBool("REPEAT_BRIEF") ||
+ !Config_getBool("BRIEF_MEMBER_DESC")))
+ {
+ if (!inbodyDocumentation().isEmpty())
+ {
+ ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE);
+ }
+ }
+
+
+ //printf("***** defArgList=%p name=%s docs=%s hasDocs=%d\n",
+ // defArgList,
+ // defArgList?defArgList->hasDocumentation():-1);
+ if (docArgList!=0 && docArgList->hasDocumentation())
+ {
+ QCString paramDocs;
+ ArgumentListIterator ali(*docArgList);
+ Argument *a;
+ // convert the parameter documentation into a list of @param commands
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (a->hasDocumentation())
+ {
+ QCString direction = extractDirection(a->docs);
+ paramDocs+="@param"+direction+" "+a->name+" "+a->docs;
+ }
+ }
+ // feed the result to the documentation parser
+ ol.parseDoc(
+ docFile(),docLine(),
+ getOuterScope()?getOuterScope():container,
+ this, // memberDef
+ paramDocs, // docStr
+ TRUE, // indexWords
+ FALSE // isExample
+ );
+
+ }
+
+ // For enum, we also write the documented enum values
+ if (isEnumerate())
+ {
+ bool first=TRUE;
+ LockingPtr<MemberList> fmdl=enumFieldList();
+ if (fmdl!=0)
+ {
+ MemberDef *fmd=fmdl->first();
+ while (fmd)
+ {
+ //printf("Enum %p: isLinkable()=%d\n",fmd,fmd->isLinkable());
+ if (fmd->isLinkable())
+ {
+ if (first)
+ {
+ ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": ");
+ ol.startDescForItem();
+ ol.startDescTable();
+ }
+
+ ol.addIndexItem(fmd->name(),ciname);
+ ol.addIndexItem(ciname,fmd->name());
+
+ //Doxygen::indexList.addIndexItem(
+ // ciname, // level1
+ // fmd->name(), // level2
+ // separateMemPages ? cfname : cfiname, // contRef
+ // cfname, // memRef
+ // fmd->anchor(), // anchor
+ // fmd); // memberdef
+ Doxygen::indexList.addIndexItem(container,fmd);
+
+ //ol.writeListItem();
+ ol.startDescTableTitle(); // this enables emphasis!
+ ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString());
+ first=FALSE;
+ //ol.startEmphasis();
+ ol.docify(fmd->name());
+ //ol.endEmphasis();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.writeString(" ");
+ ol.enableAll();
+ ol.endDoxyAnchor(cfname,fmd->anchor());
+ ol.endDescTableTitle();
+ //ol.newParagraph();
+ ol.startDescTableData();
+
+ if (!fmd->briefDescription().isEmpty())
+ {
+ ol.parseDoc(fmd->briefFile(),fmd->briefLine(),getOuterScope()?getOuterScope():container,fmd,fmd->briefDescription(),TRUE,FALSE);
+ }
+ // FIXME:PARA
+ //if (!fmd->briefDescription().isEmpty() &&
+ // !fmd->documentation().isEmpty())
+ //{
+ // ol.newParagraph();
+ //}
+ if (!fmd->documentation().isEmpty())
+ {
+ ol.parseDoc(fmd->docFile(),fmd->docLine(),getOuterScope()?getOuterScope():container,fmd,fmd->documentation()+"\n",TRUE,FALSE);
+ }
+ ol.endDescTableData();
+ }
+ fmd=fmdl->next();
+ }
+ }
+ if (!first)
+ {
+ //ol.endItemList();
+ ol.endDescTable();
+ ol.endDescForItem();
+ ol.endSimpleSect();
+ ol.writeChar('\n');
+ }
+ }
+
+ MemberDef *bmd=reimplements();
+ ClassDef *bcd=0;
+ if (bmd && (bcd=bmd->getClassDef()))
+ {
+ // write class that contains a member that is reimplemented by this one
+ if (bcd->isLinkable())
+ {
+ ol.startParagraph();
+ QCString reimplFromLine;
+ if (bmd->virtualness()!=Pure && bcd->compoundType()!=ClassDef::Interface)
+ {
+ reimplFromLine = theTranslator->trReimplementedFromList(1);
+ }
+ else
+ {
+ reimplFromLine = theTranslator->trImplementedFromList(1);
+ }
+ int markerPos = reimplFromLine.find("@0");
+ if (markerPos!=-1) // should always pass this.
+ {
+ ol.parseText(reimplFromLine.left(markerPos)); //text left from marker
+ if (bmd->isLinkable()) // replace marker with link
+ {
+ //Definition *bd=bmd->group;
+ //if (bd==0) bd=bcd;
+ ol.writeObjectLink(bmd->getReference(),bmd->getOutputFileBase(),
+ bmd->anchor(),bcd->displayName());
+
+ //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
+ // bmd->anchor(),bcd->name());
+ if ( bmd->isLinkableInProject() )
+ {
+ writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
+ }
+ }
+ else
+ {
+ ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
+ 0,bcd->displayName());
+ if (bcd->isLinkableInProject()/* && !Config_getBool("PDF_HYPERLINKS")*/ )
+ {
+ writePageRef(ol,bcd->getOutputFileBase(),bcd->anchor());
+ }
+ }
+ ol.parseText(reimplFromLine.right(
+ reimplFromLine.length()-markerPos-2)); // text right from marker
+
+ }
+ else
+ {
+ err("error: translation error: no marker in trReimplementsFromList()\n");
+ }
+ ol.endParagraph();
+ }
+
+ //ol.writeString(".");
+ }
+
+ LockingPtr<MemberList> bml=reimplementedBy();
+ if (bml!=0)
+ {
+ MemberListIterator mli(*bml);
+ MemberDef *bmd=0;
+ uint count=0;
+ ClassDef *bcd=0;
+ for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->getClassDef());++mli)
+ {
+ // count the members that directly inherit from md and for
+ // which the member and class are visible in the docs.
+ if ( bmd->isLinkable() && bcd->isLinkable() )
+ {
+ count++;
+ }
+ }
+ if (count>0)
+ {
+ mli.toFirst();
+ // write the list of classes that overwrite this member
+ ol.startParagraph();
+
+ QCString reimplInLine;
+ if (m_impl->virt==Pure || (m_impl->classDef && m_impl->classDef->compoundType()==ClassDef::Interface))
+ {
+ reimplInLine = theTranslator->trImplementedInList(count);
+ }
+ else
+ {
+ reimplInLine = theTranslator->trReimplementedInList(count);
+ }
+ static QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in reimplInLine with links to the classes
+ while ((newIndex=marker.match(reimplInLine,index,&matchLen))!=-1)
+ {
+ ol.parseText(reimplInLine.mid(index,newIndex-index));
+ bool ok;
+ uint entryIndex = reimplInLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ //bmd=bml->at(entryIndex);
+
+ count=0;
+ // find the entryIndex-th documented entry in the inheritance list.
+ for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->getClassDef());--mli)
+ {
+ if ( bmd->isLinkable() && bcd->isLinkable())
+ {
+ if (count==entryIndex) break;
+ count++;
+ }
+ }
+
+ if (ok && bcd && bmd) // write link for marker
+ {
+ //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
+ // bmd->anchor(),bcd->name());
+ ol.writeObjectLink(bmd->getReference(),bmd->getOutputFileBase(),
+ bmd->anchor(),bcd->displayName());
+
+ if (bmd->isLinkableInProject() )
+ {
+ writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
+ }
+ }
+ ++mli;
+ index=newIndex+matchLen;
+ }
+ ol.parseText(reimplInLine.right(reimplInLine.length()-index));
+ ol.endParagraph();
+ }
+ }
+
+ // write the list of examples that use this member
+ if (hasExamples())
+ {
+ ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": ");
+ ol.startDescForItem();
+ writeExample(ol,m_impl->exampleSDict);
+ ol.endDescForItem();
+ ol.endSimpleSect();
+ }
+
+ if (m_impl->typeConstraints)
+ {
+ writeTypeConstraints(ol,this,m_impl->typeConstraints);
+ }
+
+ // write reference to the source
+ writeSourceDef(ol,cname);
+ writeSourceRefs(ol,cname);
+ writeSourceReffedBy(ol,cname);
+ writeInlineCode(ol,cname);
+
+ // write call graph
+ if ((m_impl->hasCallGraph || Config_getBool("CALL_GRAPH"))
+ && (isFunction() || isSlot() || isSignal()) && Config_getBool("HAVE_DOT")
+ )
+ {
+ DotCallGraph callGraph(this,FALSE);
+ if (!callGraph.isTrivial() && !callGraph.isTooBig())
+ {
+ msg("Generating call graph for function %s\n",qPrint(qualifiedName()));
+ ol.disable(OutputGenerator::Man);
+ ol.startParagraph();
+ ol.startCallGraph();
+ ol.parseText(theTranslator->trCallGraph());
+ ol.endCallGraph(callGraph);
+ ol.endParagraph();
+ ol.enableAll();
+ }
+ }
+ if ((m_impl->hasCallerGraph || Config_getBool("CALLER_GRAPH"))
+ && (isFunction() || isSlot() || isSignal()) && Config_getBool("HAVE_DOT")
+ )
+ {
+ DotCallGraph callerGraph(this, TRUE);
+ if (!callerGraph.isTrivial() && !callerGraph.isTooBig())
+ {
+ msg("Generating caller graph for function %s\n",qPrint(qualifiedName()));
+ ol.disable(OutputGenerator::Man);
+ ol.startParagraph();
+ ol.startCallGraph();
+ ol.parseText(theTranslator->trCallerGraph());
+ ol.endCallGraph(callerGraph);
+ ol.endParagraph();
+ ol.enableAll();
+ }
+ }
+
+ if (Doxygen::userComments)
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ QCString cmd = "<? $root=$_SERVER['DOCUMENT_ROOT']; "
+ "passthru(\"$root/doxynotes --lookup "+
+ getOutputFileBase()+":"+anchor()+"\") ?>";
+ ol.writeString(cmd);
+ ol.popGeneratorState();
+ }
+
+ ol.endIndent();
+
+ // enable LaTeX again
+ //if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex);
+ ol.popGeneratorState();
+
+ //------------------------------------------------
+
+ if (!Config_getBool("EXTRACT_ALL") &&
+ Config_getBool("WARN_IF_UNDOCUMENTED") &&
+ Config_getBool("WARN_NO_PARAMDOC") &&
+ !Doxygen::suppressDocWarnings)
+ {
+ if (!hasDocumentedParams())
+ {
+ warn_doc_error(docFile(),docLine(),
+ "warning: parameters of member %s are not (all) documented",
+ qPrint(qualifiedName()));
+ }
+ if (!hasDocumentedReturnType() && isFunction() && hasDocumentation())
+ {
+ warn_doc_error(docFile(),docLine(),
+ "warning: return type of member %s is not documented",
+ qPrint(qualifiedName()));
+ }
+ }
+
+}
+
+QCString MemberDef::memberTypeName() const
+{
+ makeResident();
+ switch (m_impl->mtype)
+ {
+ case Define: return "define";
+ case Function: return "function";
+ case Variable: return "variable";
+ case Typedef: return "typedef";
+ case Enumeration: return "enumeration";
+ case EnumValue: return "enumvalue";
+ case Signal: return "signal";
+ case Slot: return "slot";
+ case Friend: return "friend";
+ case DCOP: return "dcop";
+ case Property: return "property";
+ case Event: return "event";
+ default: return "unknown";
+ }
+}
+
+void MemberDef::warnIfUndocumented()
+{
+ makeResident();
+ if (m_impl->memberGroup) return;
+ ClassDef *cd = getClassDef();
+ NamespaceDef *nd = getNamespaceDef();
+ FileDef *fd = getFileDef();
+ GroupDef *gd = getGroupDef();
+ Definition *d=0;
+ const char *t=0;
+ if (cd)
+ t="class", d=cd;
+ else if (nd)
+ t="namespace", d=nd;
+ else if (gd)
+ t="group", d=gd;
+ else
+ t="file", d=fd;
+ static bool extractAll = Config_getBool("EXTRACT_ALL");
+
+ //printf("warnIfUndoc: d->isLinkable()=%d isLinkable()=%d "
+ // "isDocumentedFriendClass()=%d name()=%s prot=%d\n",
+ // d->isLinkable(),isLinkable(),isDocumentedFriendClass(),
+ // name().data(),prot);
+ if ((!hasUserDocumentation() && !extractAll) &&
+ !isFriendClass() &&
+ name().find('@')==-1 && d->name().find('@')==-1 &&
+ (m_impl->prot!=Private || Config_getBool("EXTRACT_PRIVATE"))
+ )
+ {
+ warn_undoc(getDefFileName(),getDefLine(),"warning: Member %s%s (%s) of %s %s is not documented.",
+ qPrint(name()),qPrint(argsString()),qPrint(memberTypeName()),t,qPrint(d->name()));
+ }
+}
+
+
+
+bool MemberDef::isFriendClass() const
+{
+ makeResident();
+ return (isFriend() &&
+ (m_impl->type=="friend class" || m_impl->type=="friend struct" ||
+ m_impl->type=="friend union"));
+}
+
+bool MemberDef::isDocumentedFriendClass() const
+{
+ makeResident();
+ ClassDef *fcd=0;
+ QCString baseName=name();
+ int i=baseName.find('<');
+ if (i!=-1) baseName=baseName.left(i);
+ return (isFriendClass() &&
+ (fcd=getClass(baseName)) && fcd->isLinkable());
+}
+
+bool MemberDef::hasDocumentation() const
+{
+ makeResident();
+ return Definition::hasDocumentation() ||
+ (m_impl->mtype==Enumeration && m_impl->docEnumValues) || // has enum values
+ (m_impl->defArgList!=0 && m_impl->defArgList->hasDocumentation()); // has doc arguments
+}
+
+#if 0
+bool MemberDef::hasUserDocumentation() const
+{
+ bool hasDocs = Definition::hasUserDocumentation();
+ return hasDocs;
+}
+#endif
+
+
+void MemberDef::setMemberGroup(MemberGroup *grp)
+{
+ makeResident();
+ m_impl->memberGroup = grp;
+}
+
+bool MemberDef::visibleMemberGroup(bool hideNoHeader)
+{
+ makeResident();
+ return m_impl->memberGroup!=0 &&
+ (!hideNoHeader || m_impl->memberGroup->header()!="[NOHEADER]");
+}
+
+QCString MemberDef::getScopeString() const
+{
+ makeResident();
+ QCString result;
+ if (getClassDef()) result=getClassDef()->displayName();
+ else if (getNamespaceDef()) result=getNamespaceDef()->displayName();
+ return result;
+}
+
+#if 0
+static QCString escapeAnchor(const QCString &anchor)
+{
+ QCString result;
+ int l = anchor.length(),i;
+ for (i=0;i<l;i++)
+ {
+ char c = anchor.at(i);
+ if ((c>='a' && c<='z') || (c>='A' && c<='Z'))
+ {
+ result+=c;
+ }
+ else
+ {
+ static char hexStr[]="0123456789ABCDEF";
+ char escChar[]={ '_', 0, 0, 0 };
+ escChar[1]=hexStr[c>>4];
+ escChar[2]=hexStr[c&0xf];
+ result+=escChar;
+ }
+ }
+ return result;
+}
+#endif
+
+void MemberDef::setAnchor(const char *a)
+{
+ makeResident();
+ //anc=a;
+ a=a;
+ QCString memAnchor = name();
+ if (!m_impl->args.isEmpty()) memAnchor+=m_impl->args;
+
+ // include definition as well, to distinguish between two template
+ // specializations that only differ in the template parameters.
+ memAnchor.prepend(definition());
+
+ // convert to md5 hash
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)memAnchor.data(),memAnchor.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ m_impl->anc = "a"+sigStr;
+}
+
+void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+ const QCString &fileName,int startLine,
+ bool hasDocs,MemberDef *member)
+{
+ //printf("%s MemberDef::setGroupDef(%s)\n",name().data(),gd->name().data());
+ makeResident();
+ m_impl->group=gd;
+ m_impl->grouppri=pri;
+ m_impl->groupFileName=fileName;
+ m_impl->groupStartLine=startLine;
+ m_impl->groupHasDocs=hasDocs;
+ m_impl->groupMember=member;
+ m_isLinkableCached = 0;
+}
+
+void MemberDef::setEnumScope(MemberDef *md)
+{
+ makeResident();
+ m_impl->enumScope=md;
+ if (md->getGroupDef())
+ {
+ m_impl->group=md->getGroupDef();
+ m_impl->grouppri=md->getGroupPri();
+ m_impl->groupFileName=md->getGroupFileName();
+ m_impl->groupStartLine=md->getGroupStartLine();
+ m_impl->groupHasDocs=md->getGroupHasDocs();
+ m_isLinkableCached = 0;
+ }
+}
+
+void MemberDef::setMemberClass(ClassDef *cd)
+{
+ makeResident();
+ m_impl->classDef=cd;
+ m_isLinkableCached = 0;
+ m_isConstructorCached = 0;
+ setOuterScope(cd);
+}
+
+void MemberDef::setNamespace(NamespaceDef *nd)
+{
+ makeResident();
+ m_impl->nspace=nd;
+ setOuterScope(nd);
+}
+
+MemberDef *MemberDef::createTemplateInstanceMember(
+ ArgumentList *formalArgs,ArgumentList *actualArgs)
+{
+ makeResident();
+ LockingPtr<MemberDef> lock(this,this);
+ //printf(" Member %s %s %s\n",typeString(),name().data(),argsString());
+ ArgumentList *actualArgList = 0;
+ if (m_impl->defArgList)
+ {
+ actualArgList = new ArgumentList;
+ ArgumentListIterator ali(*m_impl->defArgList);
+ Argument *arg;
+ for (;(arg=ali.current());++ali)
+ {
+ Argument *actArg = new Argument(*arg);
+ actArg->type = substituteTemplateArgumentsInString(actArg->type,formalArgs,actualArgs);
+ actualArgList->append(actArg);
+ }
+ actualArgList->constSpecifier = m_impl->defArgList->constSpecifier;
+ actualArgList->volatileSpecifier = m_impl->defArgList->volatileSpecifier;
+ actualArgList->pureSpecifier = m_impl->defArgList->pureSpecifier;
+ }
+
+ QCString methodName=name();
+ if (methodName.left(9)=="operator ") // conversion operator
+ {
+ methodName=substituteTemplateArgumentsInString(methodName,formalArgs,actualArgs);
+ }
+
+ MemberDef *imd = new MemberDef(
+ getDefFileName(),getDefLine(),
+ substituteTemplateArgumentsInString(m_impl->type,formalArgs,actualArgs),
+ methodName,
+ substituteTemplateArgumentsInString(m_impl->args,formalArgs,actualArgs),
+ m_impl->exception, m_impl->prot,
+ m_impl->virt, m_impl->stat, m_impl->related, m_impl->mtype, 0, 0
+ );
+ imd->setArgumentList(actualArgList);
+ imd->setDefinition(substituteTemplateArgumentsInString(m_impl->def,formalArgs,actualArgs));
+ imd->setBodyDef(getBodyDef());
+ imd->setBodySegment(getStartBodyLine(),getEndBodyLine());
+ //imd->setBodyMember(this);
+
+ // TODO: init other member variables (if needed).
+ // TODO: reimplemented info
+ return imd;
+}
+
+bool MemberDef::hasOneLineInitializer() const
+{
+ makeResident();
+ //printf("%s: init=%s, initLines=%d maxInitLines=%d userInitLines=%d\n",
+ // name().data(),m_impl->initializer.data(),m_impl->initLines,
+ // m_impl->maxInitLines,m_impl->userInitLines);
+ return !m_impl->initializer.isEmpty() && m_impl->initLines==0 && // one line initializer
+ ((m_impl->maxInitLines>0 && m_impl->userInitLines==-1) || m_impl->userInitLines>0); // enabled by default or explicitly
+}
+
+bool MemberDef::hasMultiLineInitializer() const
+{
+ makeResident();
+ //printf("initLines=%d userInitLines=%d maxInitLines=%d\n",
+ // initLines,userInitLines,maxInitLines);
+ return m_impl->initLines>0 &&
+ ((m_impl->initLines<m_impl->maxInitLines && m_impl->userInitLines==-1) // implicitly enabled
+ || m_impl->initLines<m_impl->userInitLines // explicitly enabled
+ );
+}
+
+void MemberDef::setInitializer(const char *initializer)
+{
+ makeResident();
+ m_impl->initializer=initializer;
+ int p=m_impl->initializer.length()-1;
+ while (p>=0 && isspace((uchar)m_impl->initializer.at(p))) p--;
+ m_impl->initializer=m_impl->initializer.left(p+1);
+ m_impl->initLines=m_impl->initializer.contains('\n');
+}
+
+void MemberDef::addListReference(Definition *)
+{
+ makeResident();
+ static bool optimizeOutputForC = Config_getBool("OPTIMIZE_OUTPUT_FOR_C");
+ //static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
+ static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ visited=TRUE;
+ if (!isLinkableInProject()) return;
+ QCString memLabel;
+ if (optimizeOutputForC)
+ {
+ memLabel=theTranslator->trGlobal(TRUE,TRUE);
+ }
+ else if (fortranOpt)
+ {
+ memLabel=theTranslator->trSubprogram(TRUE,TRUE);
+ }
+ else
+ {
+ memLabel=theTranslator->trMember(TRUE,TRUE);
+ }
+ QCString memName = name();
+ Definition *pd=getOuterScope();
+ QCString pdName = pd->definitionType()==Definition::TypeClass ?
+ ((ClassDef*)pd)->displayName() : pd->name();
+ QCString sep = optimizeOutputJava ? "." : "::";
+ QCString memArgs;
+ if (!isRelated()
+ /* && commented out as a result of bug 597016
+ (
+ (!hideScopeNames && // there is a scope
+ pd && pd!=Doxygen::globalScope) // and we can show it
+ ||
+ (pd=getClassDef()) // it's a class so we
+ // show the scope anyway
+ )
+ */
+ )
+ {
+ if (isObjCMethod())
+ {
+ memName = "[" + pd->name() + " " + name() + "]";
+ }
+ else
+ {
+ if (pd!=Doxygen::globalScope) memName.prepend(pdName+sep);
+ memArgs = argsString();
+ }
+ }
+ LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
+ if (xrefItems!=0)
+ {
+ addRefItem(xrefItems.pointer(),
+ qualifiedName()+argsString(), // argsString is needed for overloaded functions (see bug 609624)
+ memLabel,
+ getOutputFileBase()+"#"+anchor(),memName,memArgs);
+ }
+}
+
+MemberList *MemberDef::getSectionList(Definition *d) const
+{
+ makeResident();
+ char key[20];
+ sprintf(key,"%p",d);
+ return (d!=0 && m_impl->classSectionSDict) ? m_impl->classSectionSDict->find(key) : 0;
+}
+
+void MemberDef::setSectionList(Definition *d, MemberList *sl)
+{
+ makeResident();
+ //printf("MemberDef::setSectionList(%p,%p) name=%s\n",d,sl,name().data());
+ char key[20];
+ sprintf(key,"%p",d);
+ if (m_impl->classSectionSDict==0)
+ {
+ m_impl->classSectionSDict = new SDict<MemberList>(7);
+ }
+ m_impl->classSectionSDict->append(key,sl);
+}
+
+Specifier MemberDef::virtualness(int count) const
+{
+ if (count>25)
+ {
+ warn(getDefFileName(),getDefLine(),
+ "warning: Internal inconsistency: recursion detected in overload relation for member %s!"
+ ,qPrint(name())
+ );
+ return Normal;
+ }
+ makeResident();
+ Specifier v = m_impl->virt;
+ MemberDef *rmd = reimplements();
+ while (rmd && v==Normal)
+ {
+ v = rmd->virtualness(count+1)==Normal ? Normal : Virtual;
+ rmd = rmd->reimplements();
+ }
+ return v;
+}
+
+void MemberDef::_computeIsConstructor()
+{
+ makeResident();
+ m_isConstructorCached=1; // FALSE
+ if (m_impl->classDef)
+ {
+ if (m_impl->isDMember) // for D
+ {
+ m_isConstructorCached = name()=="this" ? 2 : 1;
+ return;
+ }
+ else if (m_impl->fileDef &&
+ getLanguageFromFileName(m_impl->fileDef->name())==SrcLangExt_PHP)
+ { // for PHP
+ m_isConstructorCached = name()=="__construct" ? 2 : 1;
+ return;
+ }
+ else if (name()=="__init__" && m_impl->fileDef &&
+ getLanguageFromFileName(m_impl->fileDef->name())==SrcLangExt_Python)
+ // for Python
+ {
+ m_isConstructorCached=2; // TRUE
+ return;
+ }
+ else // for other languages
+ {
+ QCString locName = m_impl->classDef->localName();
+ int i=locName.find('<');
+ if (i==-1) // not a template class
+ {
+ m_isConstructorCached = name()==locName ? 2 : 1;
+ }
+ else
+ {
+ m_isConstructorCached = name()==locName.left(i) ? 2 : 1;
+ }
+ return;
+ }
+ }
+}
+
+bool MemberDef::isConstructor() const
+{
+ if (m_isConstructorCached==0)
+ {
+ MemberDef *that = (MemberDef*)this;
+ that->_computeIsConstructor();
+ }
+ ASSERT(m_isConstructorCached>0);
+ return m_isConstructorCached==2;
+
+}
+
+void MemberDef::_computeIsDestructor()
+{
+ makeResident();
+ bool isDestructor;
+ if (m_impl->isDMember) // for D
+ {
+ isDestructor = name()=="~this";
+ }
+ else if (m_impl->fileDef &&
+ getLanguageFromFileName(m_impl->fileDef->name())==SrcLangExt_PHP)
+ { // for PHP
+ isDestructor = name()=="__destruct";
+ }
+ else if (name()=="__del__" && m_impl->fileDef &&
+ getLanguageFromFileName(m_impl->fileDef->name())==SrcLangExt_Python)
+ // for Python
+ {
+ isDestructor=TRUE;
+ }
+ else // other languages
+ {
+ isDestructor =
+ (name().find('~')!=-1 || name().find('!')!=-1) // The ! is for C++/CLI
+ && name().find("operator")==-1;
+ }
+ m_isDestructorCached = isDestructor ? 2 : 1;
+}
+
+bool MemberDef::isDestructor() const
+{
+ if (m_isDestructorCached==0)
+ {
+ MemberDef *that=(MemberDef*)this;
+ that->_computeIsDestructor();
+ }
+ ASSERT(m_isDestructorCached>0);
+ return m_isDestructorCached==2;
+
+}
+
+void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
+{
+ makeResident();
+ LockingPtr<MemberDef> lock(this,this);
+ int enumMemCount=0;
+
+ QList<MemberDef> *fmdl=m_impl->enumFields;
+ uint numVisibleEnumValues=0;
+ if (fmdl)
+ {
+ MemberDef *fmd=fmdl->first();
+ while (fmd)
+ {
+ if (fmd->isBriefSectionVisible()) numVisibleEnumValues++;
+ fmd=fmdl->next();
+ }
+ }
+ if (numVisibleEnumValues==0 && !isBriefSectionVisible())
+ {
+ return;
+ }
+
+ QCString n = name();
+ int i=n.findRev("::");
+ if (i!=-1) n=n.right(n.length()-i-2); // strip scope (TODO: is this needed?)
+ if (n[0]!='@') // not an anonymous enum
+ {
+ if (isLinkableInProject() || hasDocumentedEnumValues())
+ {
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !isReference())
+ {
+ Doxygen::tagFile << " <member kind=\"enumeration\">" << endl;
+ Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
+ Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
+ Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
+ Doxygen::tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>" << endl;
+ Doxygen::tagFile << " </member>" << endl;
+ }
+ writeLink(typeDecl,cd,nd,fd,gd);
+ }
+ else
+ {
+ typeDecl.startBold();
+ typeDecl.docify(n);
+ typeDecl.endBold();
+ }
+ typeDecl.writeChar(' ');
+ }
+
+ uint enumValuesPerLine = (uint)Config_getInt("ENUM_VALUES_PER_LINE");
+ if (numVisibleEnumValues>0 && enumValuesPerLine>0)
+ {
+ typeDecl.docify("{ ");
+ if (fmdl)
+ {
+ MemberDef *fmd=fmdl->first();
+ bool fmdVisible = fmd->isBriefSectionVisible();
+ while (fmd)
+ {
+ if (fmdVisible)
+ {
+ /* in html we start a new line after a number of items */
+ if (numVisibleEnumValues>enumValuesPerLine
+ && (enumMemCount%enumValuesPerLine)==0
+ )
+ {
+ typeDecl.pushGeneratorState();
+ typeDecl.disableAllBut(OutputGenerator::Html);
+ typeDecl.enable(OutputGenerator::Latex);
+ typeDecl.lineBreak();
+ typeDecl.disable(OutputGenerator::Latex);
+ typeDecl.writeString("&#160;&#160;");
+ typeDecl.popGeneratorState();
+ }
+
+ if (fmd->hasDocumentation()) // enum value has docs
+ {
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !fmd->isReference())
+ {
+ Doxygen::tagFile << " <member kind=\"enumvalue\">" << endl;
+ Doxygen::tagFile << " <name>" << convertToXML(fmd->name()) << "</name>" << endl;
+ Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
+ Doxygen::tagFile << " <anchor>" << convertToXML(fmd->anchor()) << "</anchor>" << endl;
+ Doxygen::tagFile << " <arglist>" << convertToXML(fmd->argsString()) << "</arglist>" << endl;
+ Doxygen::tagFile << " </member>" << endl;
+ }
+ fmd->writeLink(typeDecl,cd,nd,fd,gd);
+ }
+ else // no docs for this enum value
+ {
+ typeDecl.startBold();
+ typeDecl.docify(fmd->name());
+ typeDecl.endBold();
+ }
+ if (fmd->hasOneLineInitializer()) // enum value has initializer
+ {
+ typeDecl.writeString(" = ");
+ typeDecl.parseText(fmd->initializer());
+ }
+ }
+
+ bool prevVisible = fmdVisible;
+ fmd=fmdl->next();
+ if (fmd && (fmdVisible=fmd->isBriefSectionVisible()))
+ {
+ typeDecl.writeString(", ");
+ }
+ if (prevVisible)
+ {
+ typeDecl.disable(OutputGenerator::Man);
+ typeDecl.writeString("\n"); // to prevent too long lines in LaTeX
+ typeDecl.enable(OutputGenerator::Man);
+ enumMemCount++;
+ }
+ }
+ if (numVisibleEnumValues>enumValuesPerLine)
+ {
+ typeDecl.pushGeneratorState();
+ typeDecl.disableAllBut(OutputGenerator::Html);
+ typeDecl.lineBreak();
+ typeDecl.popGeneratorState();
+ }
+ }
+ typeDecl.docify(" }");
+ }
+}
+
+void MemberDef::setArgumentList(ArgumentList *al)
+{
+ makeResident();
+ if (m_impl->defArgList) delete m_impl->defArgList;
+ m_impl->defArgList = al;
+}
+
+void MemberDef::setDeclArgumentList(ArgumentList *al)
+{
+ makeResident();
+ if (m_impl->declArgList) delete m_impl->declArgList;
+ m_impl->declArgList = al;
+}
+
+void MemberDef::setTypeConstraints(ArgumentList *al)
+{
+ if (al==0) return;
+ makeResident();
+ if (m_impl->typeConstraints) delete m_impl->typeConstraints;
+ m_impl->typeConstraints = new ArgumentList;
+ m_impl->typeConstraints->setAutoDelete(TRUE);
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (;(a=ali.current());++ali)
+ {
+ m_impl->typeConstraints->append(new Argument(*a));
+ }
+}
+
+void MemberDef::findSectionsInDocumentation()
+{
+ makeResident();
+ docFindSections(documentation(),this,0,docFile());
+}
+
+void MemberDef::enableCallGraph(bool e)
+{
+ makeResident();
+ m_impl->hasCallGraph=e;
+ if (e) Doxygen::parseSourcesNeeded = TRUE;
+}
+
+void MemberDef::enableCallerGraph(bool e)
+{
+ makeResident();
+ m_impl->hasCallerGraph=e;
+ if (e) Doxygen::parseSourcesNeeded = TRUE;
+}
+
+bool MemberDef::protectionVisible() const
+{
+ makeResident();
+ return m_impl->prot==Public ||
+ (m_impl->prot==Private && Config_getBool("EXTRACT_PRIVATE")) ||
+ (m_impl->prot==Protected && Config_getBool("EXTRACT_PROTECTED")) ||
+ (m_impl->prot==Package && Config_getBool("EXTRACT_PACKAGE"));
+}
+
+#if 0
+void MemberDef::setInbodyDocumentation(const char *docs,
+ const char *docFile,int docLine)
+{
+ makeResident();
+ m_impl->inbodyDocs = docs;
+ m_impl->inbodyDocs = m_impl->inbodyDocs.stripWhiteSpace();
+ m_impl->inbodyLine = docLine;
+ m_impl->inbodyFile = docFile;
+}
+#endif
+
+bool MemberDef::isObjCMethod() const
+{
+ makeResident();
+ if (m_impl->classDef && m_impl->classDef->isObjectiveC() && isFunction()) return TRUE;
+ return FALSE;
+}
+
+bool MemberDef::isObjCProperty() const
+{
+ makeResident();
+ if (m_impl->classDef && m_impl->classDef->isObjectiveC() && isProperty()) return TRUE;
+ return FALSE;
+}
+
+QCString MemberDef::qualifiedName() const
+{
+ makeResident();
+ if (isObjCMethod())
+ {
+ QCString qm;
+ if (isStatic()) qm="+"; else qm="-";
+ qm+="[";
+ qm+=m_impl->classDef->name()+" ";
+ qm+=name();
+ qm+="]";
+ return qm;
+ }
+ else
+ {
+ return Definition::qualifiedName();
+ }
+}
+
+void MemberDef::setTagInfo(TagInfo *ti)
+{
+ if (ti)
+ {
+ makeResident();
+ //printf("%s: Setting tag name=%s anchor=%s\n",name().data(),ti->tagName.data(),ti->anchor.data());
+ m_impl->anc=ti->anchor;
+ setReference(ti->tagName);
+ m_impl->explicitOutputFileBase = stripExtension(ti->fileName);
+ }
+}
+
+QCString MemberDef::objCMethodName(bool localLink,bool showStatic) const
+{
+ makeResident();
+ QCString qm;
+ if (showStatic)
+ {
+ if (isStatic()) qm="+ "; else qm="- ";
+ }
+ qm+=name();
+ if (!localLink) // link to method of same class
+ {
+ qm+=" (";
+ qm+=m_impl->classDef->name();
+ qm+=")";
+ }
+ return qm;
+}
+
+const char *MemberDef::declaration() const
+{
+ makeResident();
+ return m_impl->decl;
+}
+
+const char *MemberDef::definition() const
+{
+ makeResident();
+ return m_impl->def;
+}
+
+const char *MemberDef::extraTypeChars() const
+{
+ makeResident();
+ return m_impl->extraTypeChars;
+}
+
+const char *MemberDef::typeString() const
+{
+ makeResident();
+ return m_impl->type;
+}
+
+const char *MemberDef::argsString() const
+{
+ makeResident();
+ return m_impl->args;
+}
+
+const char *MemberDef::excpString() const
+{
+ makeResident();
+ return m_impl->exception;
+}
+
+const char *MemberDef::bitfieldString() const
+{
+ makeResident();
+ return m_impl->bitfields;
+}
+
+const QCString &MemberDef::initializer() const
+{
+ makeResident();
+ return m_impl->initializer;
+}
+
+int MemberDef::initializerLines() const
+{
+ makeResident();
+ return m_impl->initLines;
+}
+
+int MemberDef::getMemberSpecifiers() const
+{
+ makeResident();
+ return m_impl->memSpec;
+}
+
+ClassDef *MemberDef::getClassDef() const
+{
+ makeResident();
+ return m_impl->classDef;
+}
+
+FileDef *MemberDef::getFileDef() const
+{
+ makeResident();
+ return m_impl->fileDef;
+}
+
+NamespaceDef* MemberDef::getNamespaceDef() const
+{
+ makeResident();
+ return m_impl->nspace;
+}
+
+const char *MemberDef::getReadAccessor() const
+{
+ makeResident();
+ return m_impl->read;
+}
+
+const char *MemberDef::getWriteAccessor() const
+{
+ makeResident();
+ return m_impl->write;
+}
+
+GroupDef *MemberDef::getGroupDef() const
+{
+ makeResident();
+ return m_impl->group;
+}
+
+Grouping::GroupPri_t MemberDef::getGroupPri() const
+{
+ makeResident();
+ return m_impl->grouppri;
+}
+
+const char *MemberDef::getGroupFileName() const
+{
+ makeResident();
+ return m_impl->groupFileName;
+}
+
+int MemberDef::getGroupStartLine() const
+{
+ makeResident();
+ return m_impl->groupStartLine;
+}
+
+bool MemberDef::getGroupHasDocs() const
+{
+ makeResident();
+ return m_impl->groupHasDocs;
+}
+
+Protection MemberDef::protection() const
+{
+ makeResident();
+ return m_impl->prot;
+}
+
+MemberDef::MemberType MemberDef::memberType() const
+{
+ makeResident();
+ return m_impl->mtype;
+}
+
+bool MemberDef::isSignal() const
+{
+ makeResident();
+ return m_impl->mtype==Signal;
+}
+
+bool MemberDef::isSlot() const
+{
+ makeResident();
+ return m_impl->mtype==Slot;
+}
+
+bool MemberDef::isVariable() const
+{
+ makeResident();
+ return m_impl->mtype==Variable;
+}
+
+bool MemberDef::isEnumerate() const
+{
+ makeResident();
+ return m_impl->mtype==Enumeration;
+}
+
+bool MemberDef::isEnumValue() const
+{
+ makeResident();
+ return m_impl->mtype==EnumValue;
+}
+
+bool MemberDef::isTypedef() const
+{
+ makeResident();
+ return m_impl->mtype==Typedef;
+}
+
+bool MemberDef::isFunction() const
+{
+ makeResident();
+ return m_impl->mtype==Function;
+}
+
+bool MemberDef::isDefine() const
+{
+ makeResident();
+ return m_impl->mtype==Define;
+}
+
+bool MemberDef::isFriend() const
+{
+ makeResident();
+ return m_impl->mtype==Friend;
+}
+
+bool MemberDef::isDCOP() const
+{
+ makeResident();
+ return m_impl->mtype==DCOP;
+}
+
+bool MemberDef::isProperty() const
+{
+ makeResident();
+ return m_impl->mtype==Property;
+}
+
+bool MemberDef::isEvent() const
+{
+ makeResident();
+ return m_impl->mtype==Event;
+}
+
+bool MemberDef::isRelated() const
+{
+ makeResident();
+ return m_impl->related == Related;
+}
+
+bool MemberDef::isForeign() const
+{
+ makeResident();
+ return m_impl->related == Foreign;
+}
+
+bool MemberDef::isStatic() const
+{
+ makeResident();
+ return m_impl->stat;
+}
+
+bool MemberDef::isInline() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Inline)!=0;
+}
+
+bool MemberDef::isExplicit() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Explicit)!=0;
+}
+
+bool MemberDef::isMutable() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Mutable)!=0;
+}
+
+bool MemberDef::isGettable() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Gettable)!=0;
+}
+
+bool MemberDef::isSettable() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Settable)!=0;
+}
+
+bool MemberDef::isAddable() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Addable)!=0;
+}
+
+bool MemberDef::isRemovable() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Removable)!=0;
+}
+
+bool MemberDef::isRaisable() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Raisable)!=0;
+}
+
+bool MemberDef::isReadable() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Readable)!=0;
+}
+
+bool MemberDef::isWritable() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Writable)!=0;
+}
+
+bool MemberDef::isFinal() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Final)!=0;
+}
+
+bool MemberDef::isNew() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::New)!=0;
+}
+
+bool MemberDef::isSealed() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Sealed)!=0;
+}
+
+bool MemberDef::isOverride() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Override)!=0;
+}
+
+bool MemberDef::isInitonly() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Initonly)!=0;
+}
+
+bool MemberDef::isAbstract() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Abstract)!=0;
+}
+
+bool MemberDef::isOptional() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Optional)!=0;
+}
+
+bool MemberDef::isRequired() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Required)!=0;
+}
+
+bool MemberDef::isNonAtomic() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::NonAtomic)!=0;
+}
+
+bool MemberDef::isCopy() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Copy)!=0;
+}
+
+bool MemberDef::isAssign() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Assign)!=0;
+}
+
+bool MemberDef::isRetain() const
+{
+ makeResident();
+ return (m_impl->memSpec&Entry::Retain)!=0;
+}
+
+
+bool MemberDef::isImplementation() const
+{
+ makeResident();
+ return m_impl->implOnly;
+}
+
+bool MemberDef::isExternal() const
+{
+ makeResident();
+ return m_impl->explExt;
+}
+
+bool MemberDef::isTemplateSpecialization() const
+{
+ makeResident();
+ return m_impl->tspec;
+}
+
+bool MemberDef::hasDocumentedParams() const
+{
+ makeResident();
+ return m_impl->hasDocumentedParams;
+}
+
+bool MemberDef::hasDocumentedReturnType() const
+{
+ makeResident();
+ return m_impl->hasDocumentedReturnType;
+}
+
+#if 0
+int MemberDef::inbodyLine() const
+{
+ makeResident();
+ return m_impl->inbodyLine;
+}
+
+QCString MemberDef::inbodyFile() const
+{
+ makeResident();
+ return m_impl->inbodyFile;
+}
+
+const QCString &MemberDef::inbodyDocumentation() const
+{
+ makeResident();
+ return m_impl->inbodyDocs;
+}
+#endif
+
+ClassDef *MemberDef::relatedAlso() const
+{
+ makeResident();
+ return m_impl->relatedAlso;
+}
+
+bool MemberDef::hasDocumentedEnumValues() const
+{
+ makeResident();
+ return m_impl->docEnumValues;
+}
+
+MemberDef *MemberDef::getAnonymousEnumType() const
+{
+ makeResident();
+ return m_impl->annEnumType;
+}
+
+bool MemberDef::isDocsForDefinition() const
+{
+ makeResident();
+ return m_impl->docsForDefinition;
+}
+
+MemberDef *MemberDef::getEnumScope() const
+{
+ makeResident();
+ return m_impl->enumScope;
+}
+
+LockingPtr<MemberList> MemberDef::enumFieldList() const
+{
+ makeResident();
+ return LockingPtr<MemberList>(this,m_impl->enumFields);
+}
+
+LockingPtr<ExampleSDict> MemberDef::getExamples() const
+{
+ makeResident();
+ return LockingPtr<ExampleSDict>(this,m_impl->exampleSDict);
+}
+
+bool MemberDef::isPrototype() const
+{
+ makeResident();
+ return m_impl->proto;
+}
+
+LockingPtr<ArgumentList> MemberDef::argumentList() const
+{
+ makeResident();
+ return LockingPtr<ArgumentList>(this,m_impl->defArgList);
+}
+
+LockingPtr<ArgumentList> MemberDef::declArgumentList() const
+{
+ makeResident();
+ return LockingPtr<ArgumentList>(this,m_impl->declArgList);
+}
+
+LockingPtr<ArgumentList> MemberDef::templateArguments() const
+{
+ makeResident();
+ return LockingPtr<ArgumentList>(this,m_impl->tArgList);
+}
+
+LockingPtr< QList<ArgumentList> > MemberDef::definitionTemplateParameterLists() const
+{
+ makeResident();
+ return LockingPtr< QList<ArgumentList> >(this,m_impl->defTmpArgLists);
+}
+
+int MemberDef::getMemberGroupId() const
+{
+ makeResident();
+ return m_impl->grpId;
+}
+
+MemberGroup *MemberDef::getMemberGroup() const
+{
+ makeResident();
+ return m_impl->memberGroup;
+}
+
+bool MemberDef::fromAnonymousScope() const
+{
+ makeResident();
+ return m_impl->annScope;
+}
+
+bool MemberDef::anonymousDeclShown() const
+{
+ makeResident();
+ return m_impl->annUsed;
+}
+
+void MemberDef::setAnonymousUsed()
+{
+ makeResident();
+ m_impl->annUsed = TRUE;
+}
+
+bool MemberDef::hasCallGraph() const
+{
+ makeResident();
+ return m_impl->hasCallGraph;
+}
+
+bool MemberDef::hasCallerGraph() const
+{
+ makeResident();
+ return m_impl->hasCallerGraph;
+}
+
+MemberDef *MemberDef::templateMaster() const
+{
+ makeResident();
+ return m_impl->templateMaster;
+}
+
+bool MemberDef::isTypedefValCached() const
+{
+ makeResident();
+ return m_impl->isTypedefValCached;
+}
+
+ClassDef *MemberDef::getCachedTypedefVal() const
+{
+ makeResident();
+ return m_impl->cachedTypedefValue;
+}
+
+QCString MemberDef::getCachedTypedefTemplSpec() const
+{
+ makeResident();
+ return m_impl->cachedTypedefTemplSpec;
+}
+
+QCString MemberDef::getCachedResolvedTypedef() const
+{
+ makeResident();
+ //printf("MemberDef::getCachedResolvedTypedef()=%s m_impl=%p\n",m_impl->cachedResolvedType.data(),m_impl);
+ return m_impl->cachedResolvedType;
+}
+
+MemberDef *MemberDef::memberDefinition() const
+{
+ makeResident();
+ return m_impl->memDef;
+}
+
+MemberDef *MemberDef::memberDeclaration() const
+{
+ makeResident();
+ return m_impl->memDec;
+}
+
+MemberDef *MemberDef::inheritsDocsFrom() const
+{
+ makeResident();
+ return m_impl->docProvider;
+}
+
+MemberDef *MemberDef::getGroupAlias() const
+{
+ makeResident();
+ return m_impl->groupAlias;
+}
+
+void MemberDef::setMemberType(MemberType t)
+{
+ makeResident();
+ m_impl->mtype=t;
+ m_isLinkableCached = 0;
+}
+
+void MemberDef::setDefinition(const char *d)
+{
+ makeResident();
+ m_impl->def=d;
+}
+
+void MemberDef::setFileDef(FileDef *fd)
+{
+ makeResident();
+ m_impl->fileDef=fd;
+ m_isLinkableCached = 0;
+ m_isConstructorCached = 0;
+ m_isDestructorCached = 0;
+}
+
+void MemberDef::setProtection(Protection p)
+{
+ makeResident();
+ m_impl->prot=p;
+ m_isLinkableCached = 0;
+}
+
+void MemberDef::setMemberSpecifiers(int s)
+{
+ makeResident();
+ m_impl->memSpec=s;
+}
+
+void MemberDef::mergeMemberSpecifiers(int s)
+{
+ makeResident();
+ m_impl->memSpec|=s;
+}
+
+void MemberDef::setBitfields(const char *s)
+{
+ makeResident();
+ m_impl->bitfields = s;
+}
+
+void MemberDef::setMaxInitLines(int lines)
+{
+ if (lines!=-1)
+ {
+ makeResident();
+ m_impl->userInitLines=lines;
+ }
+}
+
+void MemberDef::setExplicitExternal(bool b)
+{
+ makeResident();
+ m_impl->explExt=b;
+}
+
+void MemberDef::setReadAccessor(const char *r)
+{
+ makeResident();
+ m_impl->read=r;
+}
+
+void MemberDef::setWriteAccessor(const char *w)
+{
+ makeResident();
+ m_impl->write=w;
+}
+
+void MemberDef::setTemplateSpecialization(bool b)
+{
+ makeResident();
+ m_impl->tspec=b;
+}
+
+void MemberDef::makeRelated()
+{
+ makeResident();
+ m_impl->related = Related;
+ m_isLinkableCached = 0;
+}
+
+void MemberDef::makeForeign()
+{
+ makeResident();
+ m_impl->related = Foreign;
+ m_isLinkableCached = 0;
+}
+
+void MemberDef::setHasDocumentedParams(bool b)
+{
+ makeResident();
+ m_impl->hasDocumentedParams = b;
+}
+
+void MemberDef::setHasDocumentedReturnType(bool b)
+{
+ makeResident();
+ m_impl->hasDocumentedReturnType = b;
+}
+
+void MemberDef::setInheritsDocsFrom(MemberDef *md)
+{
+ makeResident();
+ m_impl->docProvider = md;
+}
+
+void MemberDef::setArgsString(const char *as)
+{
+ makeResident();
+ m_impl->args = as;
+}
+
+void MemberDef::setRelatedAlso(ClassDef *cd)
+{
+ makeResident();
+ m_impl->relatedAlso=cd;
+}
+
+void MemberDef::setEnumClassScope(ClassDef *cd)
+{
+ makeResident();
+ m_impl->classDef = cd;
+ m_isLinkableCached = 0;
+ m_isConstructorCached = 0;
+}
+
+void MemberDef::setDocumentedEnumValues(bool value)
+{
+ makeResident();
+ m_impl->docEnumValues=value;
+}
+
+void MemberDef::setAnonymousEnumType(MemberDef *md)
+{
+ makeResident();
+ m_impl->annEnumType = md;
+}
+
+void MemberDef::setPrototype(bool p)
+{
+ makeResident();
+ m_impl->proto=p;
+}
+
+void MemberDef::setMemberGroupId(int id)
+{
+ makeResident();
+ m_impl->grpId=id;
+}
+
+void MemberDef::makeImplementationDetail()
+{
+ makeResident();
+ m_impl->implOnly=TRUE;
+}
+
+void MemberDef::setFromAnonymousScope(bool b)
+{
+ makeResident();
+ m_impl->annScope=b;
+}
+
+void MemberDef::setFromAnonymousMember(MemberDef *m)
+{
+ makeResident();
+ m_impl->annMemb=m;
+}
+
+void MemberDef::setTemplateMaster(MemberDef *mt)
+{
+ makeResident();
+ m_impl->templateMaster=mt;
+ m_isLinkableCached = 0;
+}
+
+void MemberDef::setDocsForDefinition(bool b)
+{
+ makeResident();
+ m_impl->docsForDefinition = b;
+}
+
+void MemberDef::setGroupAlias(MemberDef *md)
+{
+ makeResident();
+ m_impl->groupAlias = md;
+}
+
+void MemberDef::invalidateTypedefValCache()
+{
+ makeResident();
+ m_impl->isTypedefValCached=FALSE;
+}
+
+void MemberDef::setMemberDefinition(MemberDef *md)
+{
+ makeResident();
+ m_impl->memDef=md;
+}
+
+void MemberDef::setMemberDeclaration(MemberDef *md)
+{
+ makeResident();
+ m_impl->memDec=md;
+}
+
+ClassDef *MemberDef::category() const
+{
+ makeResident();
+ return m_impl->category;
+}
+
+void MemberDef::setCategory(ClassDef *def)
+{
+ makeResident();
+ m_impl->category = def;
+}
+
+
+void MemberDef::cacheTypedefVal(ClassDef*val, const QCString & templSpec, const QCString &resolvedType)
+{
+ makeResident();
+ m_impl->isTypedefValCached=TRUE;
+ m_impl->cachedTypedefValue=val;
+ m_impl->cachedTypedefTemplSpec=templSpec;
+ m_impl->cachedResolvedType=resolvedType;
+ //printf("MemberDef::cacheTypedefVal=%s m_impl=%p\n",m_impl->cachedResolvedType.data(),m_impl);
+}
+
+void MemberDef::flushToDisk() const
+{
+ if (isLocked()) return;
+ MemberDef *that = (MemberDef*)this;
+ that->m_storagePos = Doxygen::symbolStorage->alloc();
+ //printf("%p: MemberDef::flushToDisk()\n",this);
+ // write the definition base class member variables to disk
+ Definition::flushToDisk();
+
+ //printf("%p: flushing specific part\n",this);
+
+ // write the memberdef member variables to disk
+ marshalUInt(Doxygen::symbolStorage,START_MARKER);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->classDef);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->fileDef);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->nspace);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->enumScope);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->annEnumType);
+ marshalMemberList (Doxygen::symbolStorage,m_impl->enumFields);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->redefines);
+ marshalMemberList (Doxygen::symbolStorage,m_impl->redefinedBy);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->memDef);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->memDec);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->relatedAlso);
+ marshalExampleSDict (Doxygen::symbolStorage,m_impl->exampleSDict);
+ marshalQCString (Doxygen::symbolStorage,m_impl->type);
+ marshalQCString (Doxygen::symbolStorage,m_impl->args);
+ marshalQCString (Doxygen::symbolStorage,m_impl->def);
+ marshalQCString (Doxygen::symbolStorage,m_impl->anc);
+ marshalInt (Doxygen::symbolStorage,(int)m_impl->virt);
+ marshalInt (Doxygen::symbolStorage,(int)m_impl->prot);
+ marshalQCString (Doxygen::symbolStorage,m_impl->decl);
+ marshalQCString (Doxygen::symbolStorage,m_impl->bitfields);
+ marshalQCString (Doxygen::symbolStorage,m_impl->read);
+ marshalQCString (Doxygen::symbolStorage,m_impl->write);
+ marshalQCString (Doxygen::symbolStorage,m_impl->exception);
+ marshalQCString (Doxygen::symbolStorage,m_impl->initializer);
+ marshalQCString (Doxygen::symbolStorage,m_impl->extraTypeChars);
+ marshalInt (Doxygen::symbolStorage,m_impl->initLines);
+ marshalInt (Doxygen::symbolStorage,m_impl->memSpec);
+ marshalInt (Doxygen::symbolStorage,(int)m_impl->mtype);
+ marshalInt (Doxygen::symbolStorage,m_impl->maxInitLines);
+ marshalInt (Doxygen::symbolStorage,m_impl->userInitLines);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->annMemb);
+ marshalArgumentList (Doxygen::symbolStorage,m_impl->defArgList);
+ marshalArgumentList (Doxygen::symbolStorage,m_impl->declArgList);
+ marshalArgumentList (Doxygen::symbolStorage,m_impl->tArgList);
+ marshalArgumentList (Doxygen::symbolStorage,m_impl->typeConstraints);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->templateMaster);
+ marshalArgumentLists(Doxygen::symbolStorage,m_impl->defTmpArgLists);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->cachedAnonymousType);
+ marshalMemberLists (Doxygen::symbolStorage,m_impl->classSectionSDict);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->groupAlias);
+ marshalInt (Doxygen::symbolStorage,m_impl->grpId);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->memberGroup);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->group);
+ marshalInt (Doxygen::symbolStorage,(int)m_impl->grouppri);
+ marshalQCString (Doxygen::symbolStorage,m_impl->groupFileName);
+ marshalInt (Doxygen::symbolStorage,m_impl->groupStartLine);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->groupMember);
+ marshalBool (Doxygen::symbolStorage,m_impl->isTypedefValCached);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->cachedTypedefValue);
+ marshalQCString (Doxygen::symbolStorage,m_impl->cachedTypedefTemplSpec);
+ marshalQCString (Doxygen::symbolStorage,m_impl->cachedResolvedType);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->docProvider);
+ marshalQCString (Doxygen::symbolStorage,m_impl->explicitOutputFileBase);
+ marshalBool (Doxygen::symbolStorage,m_impl->implOnly);
+ marshalBool (Doxygen::symbolStorage,m_impl->hasDocumentedParams);
+ marshalBool (Doxygen::symbolStorage,m_impl->hasDocumentedReturnType);
+ marshalBool (Doxygen::symbolStorage,m_impl->isDMember);
+ marshalInt (Doxygen::symbolStorage,(int)m_impl->related);
+ marshalBool (Doxygen::symbolStorage,m_impl->stat);
+ marshalBool (Doxygen::symbolStorage,m_impl->proto);
+ marshalBool (Doxygen::symbolStorage,m_impl->docEnumValues);
+ marshalBool (Doxygen::symbolStorage,m_impl->annScope);
+ marshalBool (Doxygen::symbolStorage,m_impl->annUsed);
+ marshalBool (Doxygen::symbolStorage,m_impl->hasCallGraph);
+ marshalBool (Doxygen::symbolStorage,m_impl->hasCallerGraph);
+ marshalBool (Doxygen::symbolStorage,m_impl->explExt);
+ marshalBool (Doxygen::symbolStorage,m_impl->tspec);
+ marshalBool (Doxygen::symbolStorage,m_impl->groupHasDocs);
+ marshalBool (Doxygen::symbolStorage,m_impl->docsForDefinition);
+ marshalObjPointer (Doxygen::symbolStorage,m_impl->category);
+ marshalUInt(Doxygen::symbolStorage,END_MARKER);
+
+ // function doesn't modify the object conceptually but compiler doesn't know this.
+ delete that->m_impl;
+ that->m_impl=0;
+ that->m_flushPending=FALSE;
+}
+
+void MemberDef::loadFromDisk() const
+{
+ //printf("%p: MemberDef::loadFromDisk()\n",this);
+ MemberDef *that = (MemberDef *)this;
+ if (isLocked())
+ {
+ assert(m_impl!=0);
+ return;
+ }
+ assert(m_impl==0);
+
+ Doxygen::symbolStorage->seek(m_storagePos);
+ Definition::loadFromDisk();
+
+ //printf("%p: loading specific part\n",this);
+
+ that->m_impl = new MemberDefImpl;
+
+ uint marker = unmarshalUInt(Doxygen::symbolStorage);
+ assert(marker==START_MARKER);
+ m_impl->classDef = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->fileDef = (FileDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->nspace = (NamespaceDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->enumScope = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->annEnumType = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->enumFields = unmarshalMemberList (Doxygen::symbolStorage);
+ m_impl->redefines = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->redefinedBy = unmarshalMemberList (Doxygen::symbolStorage);
+ m_impl->memDef = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->memDec = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->relatedAlso = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->exampleSDict = unmarshalExampleSDict (Doxygen::symbolStorage);
+ m_impl->type = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->args = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->def = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->anc = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->virt = (Specifier)unmarshalInt (Doxygen::symbolStorage);
+ m_impl->prot = (Protection)unmarshalInt(Doxygen::symbolStorage);
+ m_impl->decl = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->bitfields = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->read = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->write = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->exception = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->initializer = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->extraTypeChars = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->initLines = unmarshalInt (Doxygen::symbolStorage);
+ m_impl->memSpec = unmarshalInt (Doxygen::symbolStorage);
+ m_impl->mtype = (MemberDef::MemberType)unmarshalInt (Doxygen::symbolStorage);
+ m_impl->maxInitLines = unmarshalInt (Doxygen::symbolStorage);
+ m_impl->userInitLines = unmarshalInt (Doxygen::symbolStorage);
+ m_impl->annMemb = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->defArgList = unmarshalArgumentList (Doxygen::symbolStorage);
+ m_impl->declArgList = unmarshalArgumentList (Doxygen::symbolStorage);
+ m_impl->tArgList = unmarshalArgumentList (Doxygen::symbolStorage);
+ m_impl->typeConstraints = unmarshalArgumentList (Doxygen::symbolStorage);
+ m_impl->templateMaster = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->defTmpArgLists = unmarshalArgumentLists(Doxygen::symbolStorage);
+ m_impl->cachedAnonymousType = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->classSectionSDict = unmarshalMemberLists (Doxygen::symbolStorage);
+ m_impl->groupAlias = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->grpId = unmarshalInt (Doxygen::symbolStorage);
+ m_impl->memberGroup = (MemberGroup*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->group = (GroupDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->grouppri = (Grouping::GroupPri_t)unmarshalInt (Doxygen::symbolStorage);
+ m_impl->groupFileName = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->groupStartLine = unmarshalInt (Doxygen::symbolStorage);
+ m_impl->groupMember = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->isTypedefValCached = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->cachedTypedefValue = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->cachedTypedefTemplSpec = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->cachedResolvedType = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->docProvider = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ m_impl->explicitOutputFileBase = unmarshalQCString (Doxygen::symbolStorage);
+ m_impl->implOnly = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->hasDocumentedParams = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->hasDocumentedReturnType = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->isDMember = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->related = (Relationship)unmarshalInt(Doxygen::symbolStorage);
+ m_impl->stat = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->proto = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->docEnumValues = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->annScope = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->annUsed = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->hasCallGraph = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->hasCallerGraph = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->explExt = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->tspec = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->groupHasDocs = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->docsForDefinition = unmarshalBool (Doxygen::symbolStorage);
+ m_impl->category = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
+ marker = unmarshalUInt(Doxygen::symbolStorage);
+ assert(marker==END_MARKER);
+}
+
+void MemberDef::makeResident() const
+{
+ if (Doxygen::symbolCache==0) return;
+ if (m_cacheHandle==-1) // not yet in cache
+ {
+ MemberDef *victim = 0;
+ MemberDef *that = (MemberDef*)this; // fake method constness
+ that->m_cacheHandle = Doxygen::symbolCache->add(that,(void **)&victim);
+ //printf("adding %s to cache, handle=%d\n",m_impl->name.data(),that->m_cacheHandle);
+ if (victim) // cache was full, victim was the least recently used item and has to go
+ {
+ victim->m_cacheHandle=-1; // invalidate cache handle
+ victim->saveToDisk(); // store the item on disk
+ }
+ else // cache not yet full
+ {
+ //printf("Adding %s to cache, handle=%d\n",m_impl->name.data(),m_cacheHandle);
+ }
+ if (m_storagePos!=-1) // already been written to disk
+ {
+ if (isLocked()) // locked in memory
+ {
+ assert(m_impl!=0);
+ that->m_flushPending=FALSE; // no need to flush anymore
+ }
+ else // not locked in memory
+ {
+ assert(m_impl==0);
+ loadFromDisk();
+ }
+ }
+ }
+ else // already cached, make this object the most recently used.
+ {
+ assert(m_impl!=0);
+ //printf("Touching symbol %s\n",m_impl->name.data());
+ Doxygen::symbolCache->use(m_cacheHandle);
+ }
+}
+
+void MemberDef::saveToDisk() const
+{
+ assert(m_impl!=0);
+ MemberDef *that = (MemberDef *)this;
+ if (isLocked()) // cannot flush the item as it is locked
+ {
+ that->m_flushPending=TRUE; // flush when unlocked
+ }
+ else // ready to flush the item to disk
+ {
+ //printf("Adding %s to cache, handle=%d by replacing %s\n",
+ // m_impl->name.data(),m_cacheHandle,victim->m_impl->name.data());
+ if (m_storagePos!=-1)
+ // if victim was stored on disk already and is not locked
+ {
+ // free the storage space occupied by the old store item
+ Doxygen::symbolStorage->release(m_storagePos); // free up space for others
+ }
+ // write a the new (possibly modified) instance to disk
+ flushToDisk();
+ // end to write sequence (unless nothing was written due to the lock)
+ Doxygen::symbolStorage->end();
+ }
+}
+
+void MemberDef::lock() const
+{
+}
+
+void MemberDef::unlock() const
+{
+ if (m_flushPending && !isLocked())
+ {
+ // write a the new (possibly modified) instance to disk
+ flushToDisk();
+ // end to write sequence (unless nothing was written due to the lock)
+ Doxygen::symbolStorage->end();
+ }
+}
+
+void MemberDef::copyArgumentNames(MemberDef *bmd)
+{
+ makeResident();
+ {
+ LockingPtr<ArgumentList> arguments = bmd->argumentList();
+ if (m_impl->defArgList && arguments!=0)
+ {
+ ArgumentListIterator aliDst(*m_impl->defArgList);
+ ArgumentListIterator aliSrc(*arguments);
+ Argument *argDst, *argSrc;
+ for (;(argDst=aliDst.current()) && (argSrc=aliSrc.current());++aliDst,++aliSrc)
+ {
+ argDst->name = argSrc->name;
+ }
+ }
+ }
+ {
+ LockingPtr<ArgumentList> arguments = bmd->declArgumentList();
+ if (m_impl->declArgList && arguments!=0)
+ {
+ ArgumentListIterator aliDst(*m_impl->declArgList);
+ ArgumentListIterator aliSrc(*arguments);
+ Argument *argDst, *argSrc;
+ for (;(argDst=aliDst.current()) && (argSrc=aliSrc.current());++aliDst,++aliSrc)
+ {
+ argDst->name = argSrc->name;
+ }
+ }
+ }
+}
+
+static void invalidateCachedTypesInArgumentList(ArgumentList *al)
+{
+ if (al)
+ {
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ a->canType.resize(0);
+ }
+ }
+}
+
+void MemberDef::invalidateCachedArgumentTypes()
+{
+ makeResident();
+ invalidateCachedTypesInArgumentList(m_impl->defArgList);
+ invalidateCachedTypesInArgumentList(m_impl->declArgList);
+}
+
diff --git a/src/memberdef.h b/src/memberdef.h
new file mode 100644
index 0000000..0ddda3d
--- /dev/null
+++ b/src/memberdef.h
@@ -0,0 +1,392 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef MEMBERDEF_H
+#define MEMBERDEF_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qdict.h>
+#include <qstack.h>
+
+#include "entry.h"
+#include "definition.h"
+#include "sortdict.h"
+
+class ClassDef;
+class NamespaceDef;
+class GroupDef;
+class FileDef;
+class MemberList;
+class MemberGroup;
+class ExampleSDict;
+class OutputList;
+class GroupDef;
+class QTextStream;
+class ArgumentList;
+class MemberDefImpl;
+
+struct SourceReference
+{
+ FileDef *fd;
+ QCString anchor;
+};
+
+class MemberDef : public Definition
+{
+ public:
+
+ enum MemberType {
+ Define,
+ Function,
+ Variable,
+ Typedef,
+ Enumeration,
+ EnumValue,
+ Signal,
+ Slot,
+ Friend,
+ DCOP,
+ Property,
+ Event
+ };
+
+ MemberDef(const char *defFileName,int defLine,
+ const char *type,const char *name,const char *args,
+ const char *excp,Protection prot,Specifier virt,bool stat,
+ Relationship related,MemberType t,const ArgumentList *tal,
+ const ArgumentList *al);
+ ~MemberDef();
+ DefType definitionType() const { return TypeMember; }
+ // move this member into a different scope
+ void moveTo(Definition *);
+
+ //-----------------------------------------------------------------------------------
+ // ---- getters -----
+ //-----------------------------------------------------------------------------------
+
+ // link id
+ QCString getOutputFileBase() const;
+ QCString getReference() const;
+ QCString anchor() const;
+
+ const char *declaration() const;
+ const char *definition() const;
+ const char *typeString() const;
+ const char *argsString() const;
+ const char *excpString() const;
+ const char *bitfieldString() const;
+ const char *extraTypeChars() const;
+ const QCString &initializer() const;
+ int initializerLines() const;
+ int getMemberSpecifiers() const;
+ MemberList *getSectionList(Definition *d) const;
+
+ // scope query members
+ ClassDef *getClassDef() const;
+ FileDef *getFileDef() const;
+ NamespaceDef* getNamespaceDef() const;
+
+ // grabbing the property read/write accessor names
+ const char *getReadAccessor() const;
+ const char *getWriteAccessor() const;
+
+ // querying the grouping definition
+ GroupDef *getGroupDef() const;
+ Grouping::GroupPri_t getGroupPri() const;
+ const char *getGroupFileName() const;
+ int getGroupStartLine() const;
+ bool getGroupHasDocs() const;
+ QCString qualifiedName() const;
+ QCString objCMethodName(bool localLink,bool showStatic) const;
+
+ // direct kind info
+ Protection protection() const;
+ Specifier virtualness(int count=0) const;
+ MemberType memberType() const;
+ QCString memberTypeName() const;
+
+ // getter methods
+ bool isSignal() const;
+ bool isSlot() const;
+ bool isVariable() const;
+ bool isEnumerate() const;
+ bool isEnumValue() const;
+ bool isTypedef() const;
+ bool isFunction() const;
+ bool isDefine() const;
+ bool isFriend() const;
+ bool isDCOP() const;
+ bool isProperty() const;
+ bool isEvent() const;
+ bool isRelated() const;
+ bool isForeign() const;
+ bool isStatic() const;
+ bool isInline() const;
+ bool isExplicit() const;
+ bool isMutable() const;
+ bool isGettable() const;
+ bool isSettable() const;
+ bool isReadable() const;
+ bool isWritable() const;
+ bool isAddable() const;
+ bool isRemovable() const;
+ bool isRaisable() const;
+ bool isFinal() const;
+ bool isAbstract() const;
+ bool isOverride() const;
+ bool isInitonly() const;
+ bool isOptional() const;
+ bool isRequired() const;
+ bool isNonAtomic() const;
+ bool isCopy() const;
+ bool isAssign() const;
+ bool isRetain() const;
+ bool isNew() const;
+ bool isSealed() const;
+ bool isImplementation() const;
+ bool isExternal() const;
+ bool isTemplateSpecialization() const;
+ bool hasDocumentedParams() const;
+ bool hasDocumentedReturnType() const;
+ bool isObjCMethod() const;
+ bool isObjCProperty() const;
+ bool isConstructor() const;
+ bool isDestructor() const;
+ bool hasOneLineInitializer() const;
+ bool hasMultiLineInitializer() const;
+ bool protectionVisible() const;
+
+ // output info
+ bool isLinkableInProject() const;
+ bool isLinkable() const;
+ bool hasDocumentation() const; // overrides hasDocumentation in definition.h
+ //bool hasUserDocumentation() const; // overrides hasUserDocumentation
+ bool isBriefSectionVisible() const;
+ bool isDetailedSectionVisible(bool inGroup,bool inFile) const;
+ bool isDetailedSectionLinkable() const;
+ bool isFriendClass() const;
+ bool isDocumentedFriendClass() const;
+
+ MemberDef *reimplements() const;
+ LockingPtr<MemberList> reimplementedBy() const;
+
+ //int inbodyLine() const;
+ //QCString inbodyFile() const;
+ //const QCString &inbodyDocumentation() const;
+
+ ClassDef *relatedAlso() const;
+
+ bool hasDocumentedEnumValues() const;
+ MemberDef *getAnonymousEnumType() const;
+ bool isDocsForDefinition() const;
+ MemberDef *getEnumScope() const;
+ LockingPtr<MemberList> enumFieldList() const;
+
+ bool hasExamples();
+ LockingPtr<ExampleSDict> getExamples() const;
+ bool isPrototype() const;
+
+ // argument related members
+ LockingPtr<ArgumentList> argumentList() const;
+ LockingPtr<ArgumentList> declArgumentList() const;
+ LockingPtr<ArgumentList> templateArguments() const;
+ LockingPtr< QList<ArgumentList> > definitionTemplateParameterLists() const;
+
+ // member group related members
+ int getMemberGroupId() const;
+ MemberGroup *getMemberGroup() const;
+
+ bool fromAnonymousScope() const;
+ bool anonymousDeclShown() const;
+
+ // callgraph related members
+ bool hasCallGraph() const;
+ bool hasCallerGraph() const;
+ bool visibleMemberGroup(bool hideNoHeader);
+
+ MemberDef *templateMaster() const;
+ QCString getScopeString() const;
+ ClassDef *getClassDefOfAnonymousType();
+
+ // cached typedef functions
+ bool isTypedefValCached() const;
+ ClassDef *getCachedTypedefVal() const;
+ QCString getCachedTypedefTemplSpec() const;
+ QCString getCachedResolvedTypedef() const;
+
+ MemberDef *memberDefinition() const;
+ MemberDef *memberDeclaration() const;
+ MemberDef *inheritsDocsFrom() const;
+ MemberDef *getGroupAlias() const;
+
+ ClassDef *category() const;
+
+ //-----------------------------------------------------------------------------------
+ // ---- setters -----
+ //-----------------------------------------------------------------------------------
+
+ // set functions
+ void setMemberType(MemberType t);
+ void setDefinition(const char *d);
+ void setFileDef(FileDef *fd);
+ void setAnchor(const char *a);
+ void setProtection(Protection p);
+ void setMemberSpecifiers(int s);
+ void mergeMemberSpecifiers(int s);
+ void setInitializer(const char *i);
+ void setBitfields(const char *s);
+ void setMaxInitLines(int lines);
+ void setMemberClass(ClassDef *cd);
+ void setSectionList(Definition *d,MemberList *sl);
+ void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+ const QCString &fileName,int startLine,bool hasDocs,
+ MemberDef *member=0);
+ void setExplicitExternal(bool b);
+ void setReadAccessor(const char *r);
+ void setWriteAccessor(const char *w);
+ void setTemplateSpecialization(bool b);
+
+ void makeRelated();
+ void makeForeign();
+ void setHasDocumentedParams(bool b);
+ void setHasDocumentedReturnType(bool b);
+ void setInheritsDocsFrom(MemberDef *md);
+ void setTagInfo(TagInfo *i);
+ void setArgsString(const char *as);
+
+ // relation to other members
+ void setReimplements(MemberDef *md);
+ void insertReimplementedBy(MemberDef *md);
+
+ // in-body documentation
+ //void setInbodyDocumentation(const char *docs,const char *file,int line);
+
+ void setRelatedAlso(ClassDef *cd);
+
+ // enumeration specific members
+ void insertEnumField(MemberDef *md);
+ void setEnumScope(MemberDef *md);
+ void setEnumClassScope(ClassDef *cd);
+ void setDocumentedEnumValues(bool value);
+ void setAnonymousEnumType(MemberDef *md);
+
+ // example related members
+ bool addExample(const char *anchor,const char *name,const char *file);
+
+ // prototype related members
+ void setPrototype(bool p);
+
+ // argument related members
+ void setArgumentList(ArgumentList *al);
+ void setDeclArgumentList(ArgumentList *al);
+ void setDefinitionTemplateParameterLists(QList<ArgumentList> *lists);
+ void setTypeConstraints(ArgumentList *al);
+
+ // namespace related members
+ void setNamespace(NamespaceDef *nd);
+
+ // member group related members
+ void setMemberGroup(MemberGroup *grp);
+ void setMemberGroupId(int id);
+ void makeImplementationDetail();
+
+ // anonymous scope members
+ void setFromAnonymousScope(bool b);
+ void setFromAnonymousMember(MemberDef *m);
+
+ void enableCallGraph(bool e);
+ void enableCallerGraph(bool e);
+
+ void setTemplateMaster(MemberDef *mt);
+ void addListReference(Definition *d);
+ void setDocsForDefinition(bool b);
+ void setGroupAlias(MemberDef *md);
+
+ void cacheTypedefVal(ClassDef *val,const QCString &templSpec,const QCString &resolvedType);
+ void invalidateTypedefValCache();
+
+ void invalidateCachedArgumentTypes();
+
+ // declaration <-> definition relation
+ void setMemberDefinition(MemberDef *md);
+ void setMemberDeclaration(MemberDef *md);
+
+ void setAnonymousUsed();
+ void copyArgumentNames(MemberDef *bmd);
+
+ void setCategory(ClassDef *);
+
+ void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE);
+ void setBriefDescription(const char *b,const char *briefFile,int briefLine);
+ void setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine);
+
+ //-----------------------------------------------------------------------------------
+ // --- actions ----
+ //-----------------------------------------------------------------------------------
+
+ // output generation
+ void writeDeclaration(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ bool inGroup);
+ void writeDocumentation(MemberList *ml,OutputList &ol,
+ const char *scopeName,Definition *container,
+ bool inGroup,bool showEnumValues=FALSE,bool
+ showInline=FALSE);
+ void warnIfUndocumented();
+
+ MemberDef *createTemplateInstanceMember(ArgumentList *formalArgs,
+ ArgumentList *actualArgs);
+
+ void writeEnumDeclaration(OutputList &typeDecl,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
+
+ void findSectionsInDocumentation();
+
+ bool visited;
+
+ protected:
+ void flushToDisk() const;
+ void loadFromDisk() const;
+ private:
+ void lock() const;
+ void unlock() const;
+ void saveToDisk() const;
+ void makeResident() const;
+ void _computeLinkableInProject();
+ void _computeIsConstructor();
+ void _computeIsDestructor();
+
+ static int s_indentLevel;
+ // disable copying of member defs
+ MemberDef(const MemberDef &);
+ MemberDef &operator=(const MemberDef &);
+
+ void writeLink(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ bool onlyText=FALSE);
+
+ MemberDefImpl *m_impl;
+ int m_cacheHandle;
+ off_t m_storagePos; // location where the item is stored in file (if impl==0)
+ bool m_flushPending;
+ uchar m_isLinkableCached; // 0 = not cached, 1=FALSE, 2=TRUE
+ uchar m_isConstructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
+ uchar m_isDestructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
+};
+
+#endif
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
new file mode 100644
index 0000000..976707f
--- /dev/null
+++ b/src/membergroup.cpp
@@ -0,0 +1,363 @@
+/******************************************************************************
+ *
+ * $Id: membergroup.cpp,v 1.19 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include "membergroup.h"
+#include "memberlist.h"
+#include "outputlist.h"
+#include "util.h"
+#include "classdef.h"
+#include "namespacedef.h"
+#include "filedef.h"
+#include "language.h"
+#include "groupdef.h"
+#include "doxygen.h"
+#include "docparser.h"
+#include "marshal.h"
+#include "entry.h"
+#include "md5.h"
+
+//static QCString idToName(int id)
+//{
+// QCString result;
+// result.sprintf("mgroup_%d",id);
+// return result;
+//}
+
+MemberGroup::MemberGroup()
+{
+}
+
+MemberGroup::MemberGroup(Definition *parent,
+ int id,const char *hdr,const char *d,const char *docFile)
+{
+ //printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
+ memberList = new MemberList(MemberList::memberGroup);
+ grpId = id;
+ grpHeader = hdr;
+ doc = d;
+ scope = 0;
+ inSameSection = TRUE;
+ inDeclSection = 0;
+ m_numDecMembers = -1;
+ m_numDocMembers = -1;
+ m_parent = parent;
+ m_docFile = docFile;
+ m_xrefListItems = 0;
+ //printf("Member group docs=`%s'\n",doc.data());
+}
+
+MemberGroup::~MemberGroup()
+{
+ delete memberList;
+}
+
+void MemberGroup::insertMember(MemberDef *md)
+{
+ //printf("MemberGroup::insertMember m_parent=%s memberList=%p count=%d"
+ // " member section list: %p\n",
+ // m_parent ? m_parent->name().data() : "<null>",
+ // memberList->first() ? memberList->first()->getSectionList(m_parent) : 0,
+ // memberList->count(),
+ // md->getSectionList(m_parent));
+ MemberDef *firstMd = memberList->first();
+ if (inSameSection && memberList->count()>0 &&
+ firstMd->getSectionList(m_parent)!=md->getSectionList(m_parent))
+ {
+ inSameSection=FALSE;
+ }
+ else if (inDeclSection==0)
+ {
+ inDeclSection = md->getSectionList(m_parent);
+ //printf("inDeclSection=%p type=%d\n",inDeclSection,inDeclSection->listType());
+ }
+ memberList->append(md);
+
+ // copy the group of the first member in the memberGroup
+ GroupDef *gd;
+ if (firstMd && (gd=firstMd->getGroupDef()))
+ {
+ md->setGroupDef(gd, firstMd->getGroupPri(),
+ firstMd->getGroupFileName(), firstMd->getGroupStartLine(),
+ firstMd->getGroupHasDocs());
+ gd->insertMember(md);
+ }
+}
+
+
+void MemberGroup::setAnchors(ClassDef *context)
+{
+ ::setAnchors(context,'z',memberList,grpId);
+}
+
+void MemberGroup::writeDeclarations(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ bool showInline)
+{
+ //printf("MemberGroup::writeDeclarations() %s\n",grpHeader.data());
+ QCString ldoc = doc;
+ if (!ldoc.isEmpty()) ldoc.prepend("<a name=\""+anchor()+"\" id=\""+anchor()+"\"></a>");
+ memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,ldoc,FALSE,showInline);
+}
+
+void MemberGroup::writePlainDeclarations(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd
+ )
+{
+ //printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
+ memberList->writePlainDeclarations(ol,cd,nd,fd,gd);
+}
+
+void MemberGroup::writeDocumentation(OutputList &ol,const char *scopeName,
+ Definition *container,bool showEnumValues,bool showInline)
+{
+ memberList->writeDocumentation(ol,scopeName,container,0,showEnumValues,showInline);
+}
+
+void MemberGroup::writeDocumentationPage(OutputList &ol,const char *scopeName,
+ Definition *container)
+{
+ memberList->writeDocumentationPage(ol,scopeName,container);
+}
+
+/*! Add this group as a subsection of the declaration section, instead
+ * of rendering it in its own section
+ */
+void MemberGroup::addToDeclarationSection()
+{
+ if (inDeclSection)
+ {
+ //printf("Adding group %p to list %p (type=%d)\n",this,
+ // inDeclSection,inDeclSection->listType());
+ inDeclSection->addMemberGroup(this);
+ }
+}
+
+int MemberGroup::countDecMembers(GroupDef *gd)
+{
+ if (m_numDecMembers==-1) /* number of member not cached */
+ {
+ memberList->countDecMembers(gd);
+ m_numDecMembers = memberList->numDecMembers();
+ }
+ return m_numDecMembers;
+}
+
+int MemberGroup::countDocMembers()
+{
+ if (m_numDocMembers==-1)
+ {
+ memberList->countDocMembers();
+ m_numDocMembers = memberList->numDocMembers();
+ }
+ return m_numDocMembers;
+}
+
+void MemberGroup::distributeMemberGroupDocumentation()
+{
+ //printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",grpHeader.data());
+ MemberDef *md=memberList->first();
+ while (md)
+ {
+ //printf("checking md=%s\n",md->name().data());
+ // find the first member of the group with documentation
+ if (!md->documentation().isEmpty() ||
+ !md->briefDescription().isEmpty() ||
+ !md->inbodyDocumentation().isEmpty()
+ )
+ {
+ //printf("found it!\n");
+ break;
+ }
+ md=memberList->next();
+ }
+ if (md) // distribute docs of md to other members of the list
+ {
+ //printf("Member %s has documentation!\n",md->name().data());
+ MemberDef *omd=memberList->first();
+ while (omd)
+ {
+ if (md!=omd && omd->documentation().isEmpty() &&
+ omd->briefDescription().isEmpty() &&
+ omd->inbodyDocumentation().isEmpty()
+ )
+ {
+ //printf("Copying documentation to member %s\n",omd->name().data());
+ omd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
+ omd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
+ omd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
+ }
+ omd=memberList->next();
+ }
+ }
+}
+
+int MemberGroup::varCount() const
+{
+ return memberList->varCount();
+}
+
+int MemberGroup::funcCount() const
+{
+ return memberList->funcCount();
+}
+
+int MemberGroup::enumCount() const
+{
+ return memberList->enumCount();
+}
+
+int MemberGroup::enumValueCount() const
+{
+ return memberList->enumValueCount();
+}
+
+int MemberGroup::typedefCount() const
+{
+ return memberList->typedefCount();
+}
+
+int MemberGroup::protoCount() const
+{
+ return memberList->protoCount();
+}
+
+int MemberGroup::defineCount() const
+{
+ return memberList->defineCount();
+}
+
+int MemberGroup::friendCount() const
+{
+ return memberList->friendCount();
+}
+
+int MemberGroup::numDecMembers() const
+{
+ return memberList->numDecMembers();
+}
+
+int MemberGroup::numDocMembers() const
+{
+ return memberList->numDocMembers();
+}
+
+void MemberGroup::setInGroup(bool b)
+{
+ memberList->setInGroup(b);
+}
+
+QCString MemberGroup::anchor() const
+{
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ QCString locHeader = grpHeader;
+ if (locHeader.isEmpty()) locHeader="[NOHEADER]";
+ MD5Buffer((const unsigned char *)locHeader.data(),locHeader.length(),md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ return "amgrp"+sigStr;
+}
+
+void MemberGroup::addListReferences(Definition *def)
+{
+ memberList->addListReferences(def);
+ if (m_xrefListItems && def)
+ {
+ QCString name = def->getOutputFileBase()+"#"+anchor();
+ addRefItem(m_xrefListItems,
+ name,
+ theTranslator->trGroup(TRUE,TRUE),
+ name,
+ grpHeader,0);
+ }
+}
+
+void MemberGroup::findSectionsInDocumentation()
+{
+ docFindSections(doc,0,this,m_docFile);
+ memberList->findSectionsInDocumentation();
+}
+
+void MemberGroup::marshal(StorageIntf *s)
+{
+ marshalMemberList(s,memberList);
+ marshalObjPointer(s,inDeclSection); // reference only
+ marshalInt(s,grpId);
+ marshalQCString(s,grpHeader);
+ marshalQCString(s,fileName);
+ marshalObjPointer(s,scope);
+ marshalQCString(s,doc);
+ marshalBool(s,inSameSection);
+ marshalInt(s,m_numDecMembers);
+ marshalInt(s,m_numDocMembers);
+ marshalObjPointer(s,m_parent);
+ marshalQCString(s,m_docFile);
+ marshalItemInfoList (Doxygen::symbolStorage,m_xrefListItems);
+}
+
+void MemberGroup::unmarshal(StorageIntf *s)
+{
+ memberList = unmarshalMemberList(s);
+ inDeclSection = (MemberList *)unmarshalObjPointer(s);
+ grpId = unmarshalInt(s);
+ grpHeader = unmarshalQCString(s);
+ fileName = unmarshalQCString(s);
+ scope = (Definition *)unmarshalObjPointer(s);
+ doc = unmarshalQCString(s);
+ inSameSection = unmarshalBool(s);
+ m_numDecMembers = unmarshalInt(s);
+ m_numDocMembers = unmarshalInt(s);
+ m_parent = (Definition *)unmarshalObjPointer(s);
+ m_docFile = unmarshalQCString(s);
+ m_xrefListItems = unmarshalItemInfoList (Doxygen::symbolStorage);
+}
+
+void MemberGroup::setRefItems(const QList<ListItemInfo> *sli)
+{
+ if (sli)
+ {
+ // deep copy the list
+ if (m_xrefListItems==0)
+ {
+ m_xrefListItems=new QList<ListItemInfo>;
+ m_xrefListItems->setAutoDelete(TRUE);
+ }
+ QListIterator<ListItemInfo> slii(*sli);
+ ListItemInfo *lii;
+ for (slii.toFirst();(lii=slii.current());++slii)
+ {
+ m_xrefListItems->append(new ListItemInfo(*lii));
+ }
+ }
+}
+//--------------------------------------------------------------------------
+
+void MemberGroupInfo::setRefItems(const QList<ListItemInfo> *sli)
+{
+ if (!sli) return;
+ if (m_sli==0)
+ {
+ m_sli = new QList<ListItemInfo>;
+ m_sli->setAutoDelete(TRUE);
+ }
+ QListIterator<ListItemInfo> slii(*sli);
+ ListItemInfo *ili;
+ for (slii.toFirst();(ili=slii.current());++slii)
+ {
+ m_sli->append(new ListItemInfo(*ili));
+ }
+}
diff --git a/src/membergroup.h b/src/membergroup.h
new file mode 100644
index 0000000..9ef047d
--- /dev/null
+++ b/src/membergroup.h
@@ -0,0 +1,153 @@
+/******************************************************************************
+ *
+ * $Id: membergroup.h,v 1.13 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef MEMBERGROUP_H
+#define MEMBERGROUP_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qfile.h>
+#include "sortdict.h"
+
+#define DOX_NOGROUP -1
+
+class MemberDef;
+class ClassDef;
+class NamespaceDef;
+class FileDef;
+class MemberList;
+class GroupDef;
+class OutputList;
+class Definition;
+class StorageIntf;
+struct ListItemInfo;
+
+class MemberGroup
+{
+ public:
+ MemberGroup();
+ MemberGroup(Definition *parent,int id,const char *header,
+ const char *docs,const char *docFile);
+ ~MemberGroup();
+ QCString header() const { return grpHeader; }
+ int groupId() const { return grpId; }
+ void insertMember(MemberDef *md);
+ void setAnchors(ClassDef *);
+ void writePlainDeclarations(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
+ void writeDeclarations(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ bool showInline=FALSE);
+
+ void writeDocumentation(OutputList &ol,const char *scopeName,
+ Definition *container,bool showEnumValues,bool showInline);
+ void writeDocumentationPage(OutputList &ol,const char *scopeName,
+ Definition *container);
+ QCString documentation() { return doc; }
+ bool allMembersInSameSection() { return inSameSection; }
+ void addToDeclarationSection();
+ int countDecMembers(GroupDef *gd=0);
+ int countDocMembers();
+ void distributeMemberGroupDocumentation();
+ void findSectionsInDocumentation();
+ int varCount() const;
+ int funcCount() const;
+ int enumCount() const;
+ int enumValueCount() const;
+ int typedefCount() const;
+ int protoCount() const;
+ int defineCount() const;
+ int friendCount() const;
+ int numDecMembers() const;
+ int numDocMembers() const;
+ void setInGroup(bool b);
+ void addListReferences(Definition *d);
+ void setRefItems(const QList<ListItemInfo> *sli);
+ MemberList *members() const { return memberList; }
+ Definition *parent() const { return m_parent; }
+ QCString anchor() const;
+
+ void marshal(StorageIntf *s);
+ void unmarshal(StorageIntf *s);
+
+ private:
+ MemberList *memberList; // list of all members in the group
+ MemberList *inDeclSection;
+ int grpId;
+ QCString grpHeader;
+ QCString fileName; // base name of the generated file
+ Definition *scope;
+ QCString doc;
+ bool inSameSection;
+ int m_numDecMembers;
+ int m_numDocMembers;
+ Definition *m_parent;
+ QCString m_docFile;
+ QList<ListItemInfo> *m_xrefListItems;
+};
+
+class MemberGroupList : public QList<MemberGroup>
+{
+};
+
+class MemberGroupListIterator : public QListIterator<MemberGroup>
+{
+ public:
+ MemberGroupListIterator(const MemberGroupList &l) :
+ QListIterator<MemberGroup>(l) {}
+};
+
+class MemberGroupSDict : public SIntDict<MemberGroup>
+{
+ public:
+ MemberGroupSDict(int size=17) : SIntDict<MemberGroup>(size) {}
+ ~MemberGroupSDict() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ return ((MemberGroup *)item1)->groupId() - ((MemberGroup*)item2)->groupId();
+ }
+};
+
+
+struct MemberGroupInfo
+{
+ MemberGroupInfo() : m_sli(0) {}
+ ~MemberGroupInfo() { delete m_sli; m_sli=0; }
+ void setRefItems(const QList<ListItemInfo> *sli);
+ QCString header;
+ QCString doc;
+ QCString docFile;
+ QCString compoundName;
+ QList<ListItemInfo> *m_sli;
+};
+
+//class MemberGroupDict : public QIntDict<MemberGroup>
+//{
+// public:
+// MemberGroupDict(int size) : QIntDict<MemberGroup>(size) {}
+// ~MemberGroupDict() {}
+//};
+
+//class MemberGroupDictIterator : public QIntDictIterator<MemberGroup>
+//{
+// public:
+// MemberGroupDictIterator(const MemberGroupDict &d) :
+// QIntDictIterator<MemberGroup>(d) {}
+// ~MemberGroupDictIterator() {}
+//};
+
+#endif
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
new file mode 100644
index 0000000..1a636b0
--- /dev/null
+++ b/src/memberlist.cpp
@@ -0,0 +1,798 @@
+/******************************************************************************
+ *
+ * $Id: memberlist.cpp,v 1.35 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <qregexp.h>
+
+#include "memberlist.h"
+#include "classdef.h"
+#include "message.h"
+#include "util.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputlist.h"
+#include "groupdef.h"
+#include "marshal.h"
+#include "vhdldocgen.h"
+
+MemberList::MemberList()
+{
+}
+
+MemberList::MemberList(ListType lt) : m_listType(lt)
+{
+ memberGroupList=0;
+ m_numDecMembers=-1; // special value indicating that value needs to be computed
+ m_numDocMembers=-1; // special value indicating that value needs to be computed
+ m_inGroup=FALSE;
+ m_inFile=FALSE;
+ m_needsSorting=FALSE;
+}
+
+MemberList::~MemberList()
+{
+ delete memberGroupList;
+}
+
+int MemberList::compareItems(GCI item1, GCI item2)
+{
+ static bool sortConstructorsFirst = Config_getBool("SORT_MEMBERS_CTORS_1ST");
+ MemberDef *c1=(MemberDef *)item1;
+ MemberDef *c2=(MemberDef *)item2;
+ if (sortConstructorsFirst) {
+ int ord1 = c1->isConstructor() ? 2 : (c1->isDestructor() ? 1 : 0);
+ int ord2 = c2->isConstructor() ? 2 : (c2->isDestructor() ? 1 : 0);
+ if (ord1 > ord2)
+ return -1;
+ else if (ord2 > ord1)
+ return 1;
+ }
+ return stricmp(c1->name(),c2->name());
+}
+
+/*! Count the number of members in this list that are visible in
+ * the declaration part of a compound's documentation page.
+ */
+void MemberList::countDecMembers(bool countEnumValues,GroupDef *gd)
+{
+ if (m_numDecMembers!=-1) return;
+
+ //printf("----- countDecMembers count=%d ----\n",count());
+ m_varCnt=m_funcCnt=m_enumCnt=m_enumValCnt=0;
+ m_typeCnt=m_protoCnt=m_defCnt=m_friendCnt=0;
+ m_numDecMembers=0;
+ QListIterator<MemberDef> mli(*this);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ //printf("MemberList::countDecMembers(md=%s,%d)\n",md->name().data(),md->isBriefSectionVisible());
+ if (md->isBriefSectionVisible())
+ {
+ switch(md->memberType())
+ {
+ case MemberDef::Variable: // fall through
+ case MemberDef::Event: // fall through
+ case MemberDef::Property: m_varCnt++,m_numDecMembers++;
+ break;
+ case MemberDef::Function: // fall through
+ case MemberDef::Signal: // fall through
+ case MemberDef::DCOP: // fall through
+ case MemberDef::Slot: if (!md->isRelated() || md->getClassDef())
+ m_funcCnt++,m_numDecMembers++;
+ break;
+ case MemberDef::Enumeration: m_enumCnt++,m_numDecMembers++; break;
+ case MemberDef::EnumValue: if (countEnumValues)
+ m_enumValCnt++,m_numDecMembers++;
+ break;
+ case MemberDef::Typedef: m_typeCnt++,m_numDecMembers++; break;
+ //case MemberDef::Prototype: m_protoCnt++,m_numDecMembers++; break;
+ case MemberDef::Define: if (Config_getBool("EXTRACT_ALL") ||
+ md->argsString() ||
+ !md->initializer().isEmpty() ||
+ md->hasDocumentation()
+ ) m_defCnt++,m_numDecMembers++;
+ break;
+ case MemberDef::Friend: m_friendCnt++,m_numDecMembers++;
+ break;
+ default:
+ err("Error: Unknown member type found for member `%s'\n!",md->name().data());
+ }
+ }
+ }
+ if (memberGroupList)
+ {
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->countDecMembers(gd);
+ m_varCnt+=mg->varCount();
+ m_funcCnt+=mg->funcCount();
+ m_enumCnt+=mg->enumCount();
+ m_enumValCnt+=mg->enumValueCount();
+ m_typeCnt+=mg->typedefCount();
+ m_protoCnt+=mg->protoCount();
+ m_defCnt+=mg->defineCount();
+ m_friendCnt+=mg->friendCount();
+ m_numDecMembers+=mg->numDecMembers();
+ }
+ }
+ //printf("----- end countDecMembers ----\n");
+
+ //printf("MemberList::countDecMembers()=%d\n",m_numDecMembers);
+}
+
+void MemberList::countDocMembers(bool countEnumValues)
+{
+ if (m_numDocMembers!=-1) return; // used cached value
+ m_numDocMembers=0;
+ QListIterator<MemberDef> mli(*this);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ if (md->isDetailedSectionVisible(m_inGroup,m_inFile))
+ {
+ // do not count enum values, since they do not produce entries of their own
+ if (countEnumValues || md->memberType()!=MemberDef::EnumValue)
+ m_numDocMembers++;
+ }
+ }
+ if (memberGroupList)
+ {
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->countDocMembers();
+ m_numDocMembers+=mg->numDocMembers();
+ }
+ }
+ //printf("MemberList::countDocMembers()=%d memberGroupList=%p\n",m_numDocMembers,memberGroupList);
+}
+
+bool MemberList::insert(uint index,const MemberDef *md)
+{
+ return QList<MemberDef>::insert(index,md);
+}
+
+void MemberList::inSort(const MemberDef *md)
+{
+ QList<MemberDef>::inSort(md);
+}
+
+void MemberList::append(const MemberDef *md)
+{
+ QList<MemberDef>::append(md);
+}
+
+MemberListIterator::MemberListIterator(const QList<MemberDef> &l) :
+ QListIterator<MemberDef>(l)
+{
+}
+
+bool MemberList::declVisible() const
+{
+ MemberListIterator mli(*this);
+ MemberDef *md;
+ for ( ; (md=mli.current()); ++mli )
+ {
+ if (md->isBriefSectionVisible())
+ {
+ switch (md->memberType())
+ {
+ case MemberDef::Define: // fall through
+ case MemberDef::Typedef: // fall through
+ case MemberDef::Variable: // fall through
+ case MemberDef::Function: // fall through
+ case MemberDef::Signal: // fall through
+ case MemberDef::Slot: // fall through
+ case MemberDef::DCOP: // fall through
+ case MemberDef::Property: // fall through
+ case MemberDef::Event:
+ return TRUE;
+ case MemberDef::Enumeration:
+ {
+ int enumVars=0;
+ MemberListIterator vmli(*this);
+ MemberDef *vmd;
+ QCString name(md->name());
+ int i=name.findRev("::");
+ if (i!=-1) name=name.right(name.length()-i-2); // strip scope (TODO: is this needed?)
+ if (name[0]=='@') // anonymous enum => append variables
+ {
+ for ( ; (vmd=vmli.current()) ; ++vmli)
+ {
+ QCString vtype=vmd->typeString();
+ if ((vtype.find(name))!=-1)
+ {
+ enumVars++;
+ }
+ }
+ }
+ // if this is an anonymous enum and there are variables of this
+ // enum type (i.e. enumVars>0), then we do not show the enum here.
+ if (enumVars==0) // show enum here
+ {
+ return TRUE;
+ }
+ }
+ break;
+ case MemberDef::Friend:
+ return TRUE;
+ case MemberDef::EnumValue:
+ {
+ if (m_inGroup)
+ {
+ return TRUE;
+ }
+ }
+ break;
+ }
+ }
+ }
+ return FALSE;
+}
+
+void MemberList::writePlainDeclarations(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd
+ )
+{
+ //printf("----- writePlainDeclaration() ----\n");
+ countDecMembers();
+ if (numDecMembers()==0)
+ {
+ //printf(" --> no members!\n");
+ return; // no members in this list
+ }
+ //printf(" --> writePlainDeclaration() numDecMembers()=%d\n",
+ // numDecMembers());
+
+ ol.pushGeneratorState();
+
+ bool first=TRUE;
+ MemberDef *md;
+ MemberListIterator mli(*this);
+ for ( ; (md=mli.current()); ++mli )
+ {
+ //printf(">>> Member `%s' type=%d visible=%d\n",
+ // md->name().data(),md->memberType(),md->isBriefSectionVisible());
+ if (md->isBriefSectionVisible())
+ {
+ switch(md->memberType())
+ {
+ case MemberDef::Define: // fall through
+ //case MemberDef::Prototype: // fall through
+ case MemberDef::Typedef: // fall through
+ case MemberDef::Variable: // fall through
+ case MemberDef::Function: // fall through
+ case MemberDef::Signal: // fall through
+ case MemberDef::Slot: // fall through
+ case MemberDef::DCOP: // fall through
+ case MemberDef::Property: // fall through
+ case MemberDef::Event:
+ {
+ if (first) ol.startMemberList(),first=FALSE;
+ md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
+ break;
+ }
+ case MemberDef::Enumeration:
+ {
+ int enumVars=0;
+ MemberListIterator vmli(*this);
+ MemberDef *vmd;
+ QCString name(md->name());
+ int i=name.findRev("::");
+ if (i!=-1) name=name.right(name.length()-i-2); // strip scope (TODO: is this needed?)
+ if (name[0]=='@') // anonymous enum => append variables
+ {
+ for ( ; (vmd=vmli.current()) ; ++vmli)
+ {
+ QCString vtype=vmd->typeString();
+ if ((vtype.find(name))!=-1)
+ {
+ enumVars++;
+ vmd->setAnonymousEnumType(md);
+ }
+ }
+ }
+ // if this is an anonymous enum and there are variables of this
+ // enum type (i.e. enumVars>0), then we do not show the enum here.
+ if (enumVars==0) // show enum here
+ {
+ //printf("Enum!!\n");
+ if (first)
+ {
+ ol.startMemberList();
+ first=FALSE;
+ }
+ ol.startMemberItem(0);
+ ol.writeString("enum ");
+ ol.insertMemberAlign();
+ md->writeEnumDeclaration(ol,cd,nd,fd,gd);
+ ol.endMemberItem();
+ if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+ {
+ ol.startMemberDescription();
+ ol.parseDoc(
+ md->briefFile(),md->briefLine(),
+ cd,md,
+ md->briefDescription(),
+ TRUE,FALSE,0,TRUE,FALSE
+ );
+ if (md->isDetailedSectionLinkable())
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.docify(" ");
+ ol.startTextLink(md->getOutputFileBase(),
+ md->anchor());
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ ol.enableAll();
+ }
+ ol.endMemberDescription();
+ }
+ }
+ md->warnIfUndocumented();
+ break;
+ }
+ case MemberDef::Friend:
+ {
+ if (first)
+ {
+ ol.startMemberList();
+ first=FALSE;
+ }
+ md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
+ break;
+ }
+ case MemberDef::EnumValue:
+ {
+ if (m_inGroup)
+ {
+ //printf("EnumValue!\n");
+ if (first) ol.startMemberList(),first=FALSE;
+ md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ // handle members that are inside anonymous compounds and for which
+ // no variables of the anonymous compound type exist.
+ if (cd)
+ {
+ MemberListIterator mli(*this);
+ for ( ; (md=mli.current()) ; ++mli )
+ {
+ if (md->fromAnonymousScope() && !md->anonymousDeclShown())
+ {
+ md->setFromAnonymousScope(FALSE);
+ //printf("anonymous compound members\n");
+ if (md->isBriefSectionVisible())
+ {
+ if (first)
+ {
+ ol.startMemberList();
+ first=FALSE;
+ }
+ md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
+ }
+ md->setFromAnonymousScope(TRUE);
+ }
+ }
+ }
+
+ if (!first)
+ {
+ ol.endMemberList();
+ }
+
+ ol.popGeneratorState();
+ //printf("----- end writePlainDeclaration() ----\n");
+}
+
+void MemberList::writeDeclarations(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ const char *title,const char *subtitle, bool showEnumValues,
+ bool showInline)
+{
+ //printf("----- writeDeclaration() this=%p ----\n",this);
+ static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+
+ countDecMembers(showEnumValues,gd); // count members shown in this section
+ Definition *ctx = cd;
+ if (ctx==0 && nd) ctx = nd;
+ if (ctx==0 && gd) ctx = gd;
+ if (ctx==0 && fd) ctx = fd;
+
+ if (numDecMembers()==0) return;
+ //printf("%p: MemberList::writeDeclaration(title=`%s',subtitle=`%s')=%d\n",
+ // this,title,subtitle,numDecMembers());
+ if (title)
+ {
+ if (showInline)
+ {
+ ol.startInlineHeader();
+ }
+ else
+ {
+ ol.startMemberHeader(listTypeAsString());
+ }
+ ol.parseText(title);
+ if (showInline)
+ {
+ ol.endInlineHeader();
+ }
+ else
+ {
+ ol.endMemberHeader();
+ }
+ }
+ if (subtitle)
+ {
+ QCString st=subtitle;
+ st = st.stripWhiteSpace();
+ if (!st.isEmpty())
+ {
+ ol.startMemberSubtitle();
+ ol.parseDoc("[generated]",-1,ctx,0,subtitle,FALSE,FALSE,0,FALSE,FALSE);
+ ol.endMemberSubtitle();
+ }
+ }
+
+ // TODO: Two things need to be worked out for proper VHDL output:
+ // 1. Signals and types under the group need to be
+ // formatted to associate them with the group somehow
+ // indentation, or at the very least, extra space after
+ // the group is done
+ // 2. This might need to be repeated below for memberGroupLists
+ if (optimizeVhdl) // use specific declarations function
+ {
+ VhdlDocGen::writeVhdlDeclarations(this,ol,0,cd,0);
+ }
+ else
+ {
+ writePlainDeclarations(ol,cd,nd,fd,gd);
+ }
+
+ //printf("memberGroupList=%p\n",memberGroupList);
+ if (memberGroupList)
+ {
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ while ((mg=mgli.current()))
+ {
+ bool hasHeader=!mg->header().isEmpty() && mg->header()!="[NOHEADER]";
+ //printf("mg->header=%s hasHeader=%d\n",mg->header().data(),hasHeader);
+ ol.startMemberGroupHeader(hasHeader);
+ if (hasHeader)
+ {
+ ol.parseText(mg->header());
+ }
+ ol.endMemberGroupHeader();
+ if (!mg->documentation().isEmpty())
+ {
+ //printf("Member group has docs!\n");
+ ol.startMemberGroupDocs();
+ ol.parseDoc("[generated]",-1,ctx,0,mg->documentation()+"\n",FALSE,FALSE);
+ ol.endMemberGroupDocs();
+ }
+ ol.startMemberGroup();
+ //printf("--- mg->writePlainDeclarations ---\n");
+ mg->writePlainDeclarations(ol,cd,nd,fd,gd);
+ ol.endMemberGroup(hasHeader);
+ ++mgli;
+ }
+ }
+ //printf("----- end writeDeclaration() ----\n");
+
+}
+
+void MemberList::writeDocumentation(OutputList &ol,
+ const char *scopeName, Definition *container,
+ const char *title,bool showEnumValues,bool showInline)
+{
+ //printf("MemberList::writeDocumentation()\n");
+
+ countDocMembers(showEnumValues);
+ if (numDocMembers()==0) return;
+
+ if (title)
+ {
+ ol.writeRuler();
+ ol.startGroupHeader(showInline ? 2 : 0);
+ ol.parseText(title);
+ ol.endGroupHeader(showInline ? 2 : 0);
+ }
+ ol.startMemberDocList();
+
+ MemberListIterator mli(*this);
+ MemberDef *md;
+ for ( ; (md=mli.current()) ; ++mli)
+ {
+ md->writeDocumentation(this,ol,scopeName,container,
+ m_inGroup,showEnumValues,showInline);
+ }
+ if (memberGroupList)
+ {
+ //printf("MemberList::writeDocumentation() -- member groups\n");
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->writeDocumentation(ol,scopeName,container,showEnumValues,showInline);
+ }
+ }
+ ol.endMemberDocList();
+}
+
+void MemberList::writeDocumentationPage(OutputList &ol,
+ const char *scopeName, Definition *container)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ MemberListIterator mli(*this);
+ MemberDef *md;
+ for ( ; (md=mli.current()) ; ++mli)
+ {
+ QCString diskName=md->getOutputFileBase();
+ QCString title=md->qualifiedName();
+ startFile(ol,diskName,md->name(),title,HLI_None,!generateTreeView,
+ container->getOutputFileBase());
+ if (!generateTreeView)
+ {
+ container->writeNavigationPath(ol);
+ ol.endQuickIndices();
+ }
+ ol.startContents();
+
+ ol.writeString("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n"
+ " <tr>\n"
+ " <td valign=\"top\">\n");
+
+ container->writeQuickMemberLinks(ol,md);
+
+ ol.writeString(" </td>\n");
+ ol.writeString(" <td valign=\"top\" class=\"mempage\">\n");
+
+ md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
+
+ ol.writeString(" </td>\n");
+ ol.writeString(" </tr>\n");
+ ol.writeString("</table>\n");
+
+
+ if (generateTreeView)
+ {
+ ol.endContents();
+ container->writeNavigationPath(ol);
+ endFile(ol,TRUE);
+ }
+ else
+ {
+ endFile(ol);
+ }
+ }
+ if (memberGroupList)
+ {
+ //printf("MemberList::writeDocumentation() -- member groups\n");
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->writeDocumentationPage(ol,scopeName,container);
+ }
+ }
+}
+
+void MemberList::addMemberGroup(MemberGroup *mg)
+{
+ if (memberGroupList==0)
+ {
+ memberGroupList=new MemberGroupList;
+ }
+ //printf("addMemberGroup: this=%p mg=%p\n",this,mg);
+ memberGroupList->append(mg);
+}
+
+void MemberList::addListReferences(Definition *def)
+{
+ MemberListIterator mli(*this);
+ MemberDef *md;
+ for ( ; (md=mli.current()) ; ++mli)
+ {
+ if (md->getGroupDef()==0 || def->definitionType()==Definition::TypeGroup)
+ {
+ md->addListReference(def);
+ LockingPtr<MemberList> enumFields = md->enumFieldList();
+ if (md->memberType()==MemberDef::Enumeration && enumFields!=0)
+ {
+ //printf(" Adding enum values!\n");
+ MemberListIterator vmli(*enumFields);
+ MemberDef *vmd;
+ for ( ; (vmd=vmli.current()) ; ++vmli)
+ {
+ //printf(" adding %s\n",vmd->name().data());
+ vmd->addListReference(def);
+ }
+ }
+ }
+ }
+ if (memberGroupList)
+ {
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->addListReferences(def);
+ }
+ }
+}
+
+void MemberList::findSectionsInDocumentation()
+{
+ MemberListIterator mli(*this);
+ MemberDef *md;
+ for ( ; (md=mli.current()) ; ++mli)
+ {
+ md->findSectionsInDocumentation();
+ }
+ if (memberGroupList)
+ {
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->findSectionsInDocumentation();
+ }
+ }
+}
+
+void MemberList::marshal(StorageIntf *s)
+{
+ marshalInt(s,(int)m_listType);
+ marshalInt(s,m_varCnt);
+ marshalInt(s,m_funcCnt);
+ marshalInt(s,m_enumCnt);
+ marshalInt(s,m_enumValCnt);
+ marshalInt(s,m_typeCnt);
+ marshalInt(s,m_protoCnt);
+ marshalInt(s,m_defCnt);
+ marshalInt(s,m_friendCnt);
+ marshalInt(s,m_numDecMembers);
+ marshalInt(s,m_numDocMembers);
+ marshalBool(s,m_inGroup);
+ marshalBool(s,m_inFile);
+ marshalBool(s,m_needsSorting);
+ if (memberGroupList==0)
+ {
+ marshalUInt(s,NULL_LIST); // null pointer representation
+ }
+ else
+ {
+ marshalUInt(s,memberGroupList->count());
+ QListIterator<MemberGroup> mgi(*memberGroupList);
+ MemberGroup *mg=0;
+ for (mgi.toFirst();(mg=mgi.current());++mgi)
+ {
+ mg->marshal(s);
+ }
+ }
+}
+
+void MemberList::unmarshal(StorageIntf *s)
+{
+ m_listType = (MemberList::ListType)unmarshalInt(s);
+ m_varCnt = unmarshalInt(s);
+ m_funcCnt = unmarshalInt(s);
+ m_enumCnt = unmarshalInt(s);
+ m_enumValCnt = unmarshalInt(s);
+ m_typeCnt = unmarshalInt(s);
+ m_protoCnt = unmarshalInt(s);
+ m_defCnt = unmarshalInt(s);
+ m_friendCnt = unmarshalInt(s);
+ m_numDecMembers = unmarshalInt(s);
+ m_numDocMembers = unmarshalInt(s);
+ m_inGroup = unmarshalBool(s);
+ m_inFile = unmarshalBool(s);
+ m_needsSorting = unmarshalBool(s);
+ uint i,count = unmarshalUInt(s);
+ if (count==NULL_LIST) // empty list
+ {
+ memberGroupList = 0;
+ }
+ else // add member groups
+ {
+ memberGroupList = new MemberGroupList;
+ for (i=0;i<count;i++)
+ {
+ MemberGroup *mg = new MemberGroup;
+ mg->unmarshal(s);
+ memberGroupList->append(mg);
+ }
+ }
+}
+
+QCString MemberList::listTypeAsString() const
+{
+ switch(m_listType)
+ {
+ case pubMethods: return "pub-methods";
+ case proMethods: return "pro-methods";
+ case pacMethods: return "pac-methods";
+ case priMethods: return "pri-methods";
+ case pubStaticMethods: return "pub-static-methods";
+ case proStaticMethods: return "pro-static-methods";
+ case pacStaticMethods: return "pac-static-methods";
+ case priStaticMethods: return "pri-static-methods";
+ case pubSlots: return "pub-slots";
+ case proSlots: return "pro-slots";
+ case priSlots: return "pri-slots";
+ case pubAttribs: return "pub-attribs";
+ case proAttribs: return "pro-attribs";
+ case pacAttribs: return "pac-attribs";
+ case priAttribs: return "pri-attribs";
+ case pubStaticAttribs: return "pub-static-attribs";
+ case proStaticAttribs: return "pro-static-attribs";
+ case pacStaticAttribs: return "pac-static-attribs";
+ case priStaticAttribs: return "pri-static-attribs";
+ case pubTypes: return "pub-types";
+ case proTypes: return "pro-types";
+ case pacTypes: return "pac-types";
+ case priTypes: return "pri-types";
+ case related: return "related";
+ case signals: return "signals";
+ case friends: return "friends";
+ case dcopMethods: return "dcop-methods";
+ case properties: return "properties";
+ case events: return "events";
+ case decDefineMembers: return "define-members";
+ case decProtoMembers: return "proto-members";
+ case decTypedefMembers: return "typedef-members";
+ case decEnumMembers: return "enum-members";
+ case decFuncMembers: return "func-members";
+ case decVarMembers: return "var-members";
+ case decEnumValMembers: return "enumval-members";
+ case decPubSlotMembers: return "pub-slot-members";
+ case decProSlotMembers: return "pro-slot-members";
+ case decPriSlotMembers: return "pri-slot-members";
+ case decSignalMembers: return "signal-members";
+ case decEventMembers: return "event-members";
+ case decFriendMembers: return "friend-members";
+ case decPropMembers: return "prop-members";
+ case enumFields: return "enum-fields";
+ case memberGroup: return "member-group";
+ default: break;
+ }
+ return "";
+}
+
+void MemberList::setNeedsSorting(bool b)
+{
+ m_needsSorting = b;
+}
+
+//--------------------------------------------------------------------------
+
+int MemberSDict::compareItems(GCI item1, GCI item2)
+{
+ MemberDef *c1=(MemberDef *)item1;
+ MemberDef *c2=(MemberDef *)item2;
+ return stricmp(c1->name(),c2->name());
+}
+
+
diff --git a/src/memberlist.h b/src/memberlist.h
new file mode 100644
index 0000000..2558f09
--- /dev/null
+++ b/src/memberlist.h
@@ -0,0 +1,201 @@
+/******************************************************************************
+ *
+ * $Id: memberlist.h,v 1.19 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef MEMBERLIST_H
+#define MEMBERLIST_H
+
+#include <qlist.h>
+#include "memberdef.h"
+#include "sortdict.h"
+
+class GroupDef;
+class MemberGroup;
+class MemberGroupList;
+class StorageIntf;
+
+class MemberList : public QList<MemberDef>
+{
+ public:
+ enum ListType
+ {
+ privateLists = 0x0800,
+ detailedLists = 0x1000,
+ declarationLists = 0x2000,
+ documentationLists = 0x4000,
+
+ pubMethods = 0,
+ proMethods = 1,
+ pacMethods = 2,
+ priMethods = 3 + privateLists,
+ pubStaticMethods = 4,
+ proStaticMethods = 5,
+ pacStaticMethods = 6,
+ priStaticMethods = 7 + privateLists,
+ pubSlots = 8,
+ proSlots = 9,
+ priSlots = 10 + privateLists,
+ pubAttribs = 11,
+ proAttribs = 12,
+ pacAttribs = 13,
+ priAttribs = 14 + privateLists,
+ pubStaticAttribs = 15,
+ proStaticAttribs = 16,
+ pacStaticAttribs = 17,
+ priStaticAttribs = 18 + privateLists,
+ pubTypes = 19,
+ proTypes = 20,
+ pacTypes = 21,
+ priTypes = 22 + privateLists,
+ related = 23,
+ signals = 24,
+ friends = 25,
+ dcopMethods = 26,
+ properties = 27,
+ events = 28,
+
+ typedefMembers = 29 + detailedLists,
+ enumMembers = 30 + detailedLists,
+ enumValMembers = 31 + detailedLists,
+ functionMembers = 32 + detailedLists,
+ relatedMembers = 33 + detailedLists,
+ variableMembers = 34 + detailedLists,
+ propertyMembers = 35 + detailedLists,
+ eventMembers = 36 + detailedLists,
+ constructors = 37 + detailedLists,
+
+ allMembersList = 38,
+
+ decDefineMembers = 39 + declarationLists,
+ decProtoMembers = 40 + declarationLists,
+ decTypedefMembers = 41 + declarationLists,
+ decEnumMembers = 42 + declarationLists,
+ decFuncMembers = 43 + declarationLists,
+ decVarMembers = 44 + declarationLists,
+ decEnumValMembers = 45 + declarationLists,
+ decPubSlotMembers = 46 + declarationLists,
+ decProSlotMembers = 47 + declarationLists,
+ decPriSlotMembers = 48 + declarationLists,
+ decSignalMembers = 49 + declarationLists,
+ decEventMembers = 50 + declarationLists,
+ decFriendMembers = 51 + declarationLists,
+ decPropMembers = 52 + declarationLists,
+
+ docDefineMembers = 53 + documentationLists,
+ docProtoMembers = 54 + documentationLists,
+ docTypedefMembers = 55 + documentationLists,
+ docEnumMembers = 56 + documentationLists,
+ docFuncMembers = 57 + documentationLists,
+ docVarMembers = 58 + documentationLists,
+ docEnumValMembers = 59 + documentationLists,
+ docPubSlotMembers = 60 + documentationLists,
+ docProSlotMembers = 61 + documentationLists,
+ docPriSlotMembers = 62 + documentationLists,
+ docSignalMembers = 63 + documentationLists,
+ docEventMembers = 64 + documentationLists,
+ docFriendMembers = 65 + documentationLists,
+ docPropMembers = 66 + documentationLists,
+
+ redefinedBy = 67,
+ enumFields = 68,
+ memberGroup = 69
+ };
+
+ MemberList();
+ MemberList(ListType lt);
+ ~MemberList();
+ ListType listType() const { return m_listType; }
+ QCString listTypeAsString() const;
+ bool insert(uint index,const MemberDef *md);
+ void inSort(const MemberDef *md);
+ void append(const MemberDef *md);
+ int compareItems(GCI item1,GCI item2);
+ int varCount() const { ASSERT(m_numDecMembers!=-1); return m_varCnt; }
+ int funcCount() const { ASSERT(m_numDecMembers!=-1); return m_funcCnt; }
+ int enumCount() const { ASSERT(m_numDecMembers!=-1); return m_enumCnt; }
+ int enumValueCount() const { ASSERT(m_numDecMembers!=-1); return m_enumValCnt; }
+ int typedefCount() const { ASSERT(m_numDecMembers!=-1); return m_typeCnt; }
+ int protoCount() const { ASSERT(m_numDecMembers!=-1); return m_protoCnt; }
+ int defineCount() const { ASSERT(m_numDecMembers!=-1); return m_defCnt; }
+ int friendCount() const { ASSERT(m_numDecMembers!=-1); return m_friendCnt; }
+ int numDecMembers() const { ASSERT(m_numDecMembers!=-1); return m_numDecMembers; }
+ int numDocMembers() const { ASSERT(m_numDocMembers!=-1); return m_numDocMembers; }
+ bool needsSorting() const { return m_needsSorting; }
+ void countDecMembers(bool countEnumValues=FALSE,GroupDef *gd=0);
+ void countDocMembers(bool countEnumValues=FALSE);
+ void writePlainDeclarations(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
+ void writeDeclarations(OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ const char *title,const char *subtitle,bool showEnumValues=FALSE,bool showInline=FALSE);
+ void writeDocumentation(OutputList &ol,const char *scopeName,
+ Definition *container,const char *title,bool showEnumValues=FALSE,bool showInline=FALSE);
+ void writeDocumentationPage(OutputList &ol,
+ const char *scopeName, Definition *container);
+ bool declVisible() const;
+ void addMemberGroup(MemberGroup *mg);
+ void setInGroup(bool inGroup) { m_inGroup=inGroup; }
+ void setInFile(bool inFile) { m_inFile=inFile; }
+ void addListReferences(Definition *def);
+ void findSectionsInDocumentation();
+ void setNeedsSorting(bool b);
+ MemberGroupList *getMemberGroupList() const { return memberGroupList; }
+
+ void marshal(StorageIntf *s);
+ void unmarshal(StorageIntf *s);
+
+ private:
+ int m_varCnt;
+ int m_funcCnt;
+ int m_enumCnt;
+ int m_enumValCnt;
+ int m_typeCnt;
+ int m_protoCnt;
+ int m_defCnt;
+ int m_friendCnt;
+ int m_numDecMembers; // number of members in the brief part of the memberlist
+ int m_numDocMembers; // number of members in the detailed part of the memberlist
+ MemberGroupList *memberGroupList;
+ bool m_inGroup; // is this list part of a group definition
+ bool m_inFile; // is this list part of a file definition
+ ListType m_listType;
+ bool m_needsSorting;
+};
+
+class MemberListIterator : public QListIterator<MemberDef>
+{
+ public:
+ MemberListIterator(const QList<MemberDef> &list);
+ virtual ~MemberListIterator() {}
+};
+
+class MemberDict : public QDict<MemberDef>
+{
+ public:
+ MemberDict(int size) : QDict<MemberDef>(size) {}
+ virtual ~MemberDict() {}
+};
+
+class MemberSDict : public SDict<MemberDef>
+{
+ public:
+ MemberSDict(int size=17) : SDict<MemberDef>(size) {}
+ virtual ~MemberSDict() {}
+ int compareItems(GCI item1,GCI item2);
+};
+
+
+#endif
diff --git a/src/membername.cpp b/src/membername.cpp
new file mode 100644
index 0000000..18490dc
--- /dev/null
+++ b/src/membername.cpp
@@ -0,0 +1,83 @@
+/******************************************************************************
+ *
+ * $Id: membername.cpp,v 1.16 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "membername.h"
+#include "classdef.h"
+#include "util.h"
+#include "filedef.h"
+
+MemberName::MemberName(const char *n) : QList<MemberDef>()
+{
+ name=n;
+ setAutoDelete(TRUE);
+}
+
+MemberName::~MemberName()
+{
+}
+
+int MemberName::compareItems(GCI item1, GCI item2)
+{
+ MemberDef *m1=(MemberDef *)item1;
+ MemberDef *m2=(MemberDef *)item2;
+ ClassDef *c1=m1->getClassDef();
+ ClassDef *c2=m2->getClassDef();
+ FileDef *f1=m1->getFileDef();
+ FileDef *f2=m2->getFileDef();
+ if (c1 && c2)
+ return strcmp(c1->name(),c2->name());
+ else if (f1 && f2)
+ return strcmp(f1->name(),f2->name());
+ else
+ return 0;
+}
+
+MemberNameInfo::MemberNameInfo(const char *n) : QList<MemberInfo>()
+{
+ name=n;
+ setAutoDelete(TRUE);
+}
+
+int MemberNameInfo::compareItems(GCI item1, GCI item2)
+{
+ MemberInfo *m1=(MemberInfo *)item1;
+ MemberInfo *m2=(MemberInfo *)item2;
+ ClassDef *c1=m1->memberDef->getClassDef();
+ ClassDef *c2=m2->memberDef->getClassDef();
+ FileDef *f1=m1->memberDef->getFileDef();
+ FileDef *f2=m2->memberDef->getFileDef();
+ if (c1 && c2)
+ return strcmp(c1->name(),c2->name());
+ else if (f1 && f2)
+ return strcmp(f1->name(),f2->name());
+ else
+ return 0;
+}
+MemberNameIterator::MemberNameIterator(const MemberName &mnlist) :
+ QListIterator<MemberDef>(mnlist)
+{
+}
+
+int MemberNameSDict::compareItems(GCI item1, GCI item2)
+{
+ MemberName *n1=(MemberName *)item1;
+ MemberName *n2=(MemberName *)item2;
+ return stricmp(n1->memberName()+getPrefixIndex(n1->memberName()),
+ n2->memberName()+getPrefixIndex(n2->memberName())
+ );
+}
+
diff --git a/src/membername.h b/src/membername.h
new file mode 100644
index 0000000..17728da
--- /dev/null
+++ b/src/membername.h
@@ -0,0 +1,98 @@
+/******************************************************************************
+ *
+ * $Id: membername.h,v 1.17 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef MEMBERNAME_H
+#define MEMBERNAME_H
+
+#include <qlist.h>
+#include "memberdef.h"
+#include "sortdict.h"
+
+class MemberName : public QList<MemberDef>
+{
+ public:
+ MemberName(const char *name);
+ ~MemberName();
+ const char *memberName() const { return name; }
+
+ int compareItems(GCI item1,GCI item2);
+ private:
+ QCString name;
+};
+
+class MemberNameIterator : public QListIterator<MemberDef>
+{
+ public:
+ MemberNameIterator( const MemberName &list);
+};
+
+class MemberNameSDict : public SDict<MemberName>
+{
+ public:
+ MemberNameSDict(int size) : SDict<MemberName>(size) {}
+ ~MemberNameSDict() {}
+
+ int compareItems(GCI item1,GCI item2);
+};
+
+struct MemberInfo
+{
+ MemberInfo(MemberDef *md,Protection p,Specifier v,bool inh) :
+ memberDef(md), prot(p), virt(v), inherited(inh), ambigClass(0) {}
+ ~MemberInfo() {}
+ MemberDef *memberDef;
+ Protection prot;
+ Specifier virt;
+ bool inherited;
+ QCString scopePath;
+ QCString ambiguityResolutionScope;
+ ClassDef *ambigClass;
+};
+
+class MemberNameInfo : public QList<MemberInfo>
+{
+ public:
+ MemberNameInfo(const char *name);
+ ~MemberNameInfo() {}
+ const char *memberName() const { return name; }
+ int compareItems(GCI item1,GCI item2);
+ private:
+ QCString name;
+};
+
+class MemberNameInfoIterator : public QListIterator<MemberInfo>
+{
+ public:
+ MemberNameInfoIterator(const MemberNameInfo &mnii)
+ : QListIterator<MemberInfo>(mnii) {}
+};
+
+
+class MemberNameInfoSDict : public SDict<MemberNameInfo>
+{
+ public:
+ MemberNameInfoSDict(int size) : SDict<MemberNameInfo>(size) {}
+ ~MemberNameInfoSDict() {}
+ int compareItems(GCI item1,GCI item2)
+ { return stricmp(
+ ((MemberNameInfo *)item1)->memberName(),
+ ((MemberNameInfo *)item2)->memberName()
+ );
+ }
+};
+
+#endif
diff --git a/src/message.cpp b/src/message.cpp
new file mode 100644
index 0000000..47c40df
--- /dev/null
+++ b/src/message.cpp
@@ -0,0 +1,196 @@
+/******************************************************************************
+ *
+ * $Id: message.cpp,v 1.9 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <qdatetime.h>
+#include "config.h"
+#include "util.h"
+#include "debug.h"
+#include "doxygen.h"
+#include "portable.h"
+
+static QCString outputFormat;
+//static int warnFormatOrder; // 1 = $file,$line,$text
+// // 2 = $text,$line,$file
+// // 3 = $line,$text,$file
+// // 4 = $file,$text,$line
+// // 5 = $text,$file,$line
+// // 6 = $line,$file,$text
+
+static FILE *warnFile = stderr;
+
+void initWarningFormat()
+{
+// int filePos = Config_getString("WARN_FORMAT").find("$file");
+// int linePos = Config_getString("WARN_FORMAT").find("$line");
+// int textPos = Config_getString("WARN_FORMAT").find("$text");
+//
+// // sort items on position (there are 6 cases)
+// warnFormatOrder = 1;
+// if (filePos>linePos && filePos>textPos)
+// {
+// if (linePos>textPos) // $text,$line,$file
+// {
+// warnFormatOrder = 2;
+// }
+// else // $line,$text,$file
+// {
+// warnFormatOrder = 3;
+// }
+// }
+// else if (filePos<linePos && filePos<textPos)
+// {
+// if (linePos>textPos) // $file,$text,$line
+// {
+// warnFormatOrder = 4;
+// }
+// }
+// else if (filePos<linePos && filePos>textPos) // $text,$file,$line
+// {
+// warnFormatOrder = 5;
+// }
+// else // $line,$file,$text
+// {
+// warnFormatOrder = 6;
+// }
+// outputFormat =
+// substitute(
+// substitute(
+// substitute(
+// Config_getString("WARN_FORMAT"),
+// "$file","%s"
+// ),
+// "$text","%s"
+// ),
+// "$line","%d"
+// )+'\n';
+
+ // replace(QRegExp("\\$file"),"%s").
+ // replace(QRegExp("\\$text"),"%s").
+ // replace(QRegExp("\\$line"),"%d")+
+ // '\n';
+
+ outputFormat = Config_getString("WARN_FORMAT");
+
+ if (!Config_getString("WARN_LOGFILE").isEmpty())
+ {
+ warnFile = portable_fopen(Config_getString("WARN_LOGFILE"),"w");
+ }
+ if (!warnFile) // point it to something valid, because warn() relies on it
+ {
+ warnFile = stderr;
+ }
+}
+
+
+void msg(const char *fmt, ...)
+{
+ if (!Config_getBool("QUIET"))
+ {
+ if (Debug::isFlagSet(Debug::Time))
+ {
+ printf("%.3f sec: ",((double)Doxygen::runningTime.elapsed())/1000.0);
+ }
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stdout, fmt, args);
+ va_end(args);
+ }
+}
+
+static void format_warn(const char *file,int line,const char *text)
+{
+ QCString fileSubst = file==0 ? "<unknown>" : file;
+ QCString lineSubst; lineSubst.setNum(line);
+ QCString textSubst = text;
+ QCString versionSubst;
+ if (file) // get version from file name
+ {
+ bool ambig;
+ FileDef *fd=findFileDef(Doxygen::inputNameDict,file,ambig);
+ if (fd)
+ {
+ versionSubst = fd->getVersion();
+ }
+ }
+ // substitute markers by actual values
+ QCString msgText =
+ substitute(
+ substitute(
+ substitute(
+ substitute(
+ outputFormat,
+ "$file",fileSubst
+ ),
+ "$text",textSubst
+ ),
+ "$line",lineSubst
+ ),
+ "$version",versionSubst
+ )+'\n';
+
+ // print resulting message
+ fwrite(msgText.data(),1,msgText.length(),warnFile);
+}
+
+static void do_warn(const char *tag, const char *file, int line, const char *fmt, va_list args)
+{
+ if (!Config_getBool(tag)) return; // warning type disabled
+ char text[4096];
+ vsnprintf(text, 4096, fmt, args);
+ text[4095]='\0';
+ format_warn(file,line,text);
+}
+
+void warn(const char *file,int line,const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ do_warn("WARNINGS", file, line, fmt, args);
+ va_end(args);
+}
+
+void warn_simple(const char *file,int line,const char *text)
+{
+ if (!Config_getBool("WARNINGS")) return; // warning type disabled
+ format_warn(file,line,text);
+}
+
+void warn_undoc(const char *file,int line,const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ do_warn("WARN_IF_UNDOCUMENTED", file, line, fmt, args);
+ va_end(args);
+}
+
+void warn_doc_error(const char *file,int line,const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ do_warn("WARN_IF_DOC_ERROR", file, line, fmt, args);
+ va_end(args);
+}
+
+void err(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(warnFile, fmt, args);
+ va_end(args);
+}
diff --git a/src/message.h b/src/message.h
new file mode 100644
index 0000000..0fe7c1b
--- /dev/null
+++ b/src/message.h
@@ -0,0 +1,31 @@
+/******************************************************************************
+ *
+ * $Id: message.h,v 1.8 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef MESSAGE_H
+#define MESSAGE_H
+
+#include <stdio.h>
+
+extern void msg(const char *fmt, ...);
+extern void warn(const char *file,int line,const char *fmt, ...);
+extern void warn_simple(const char *file,int line,const char *text);
+extern void warn_undoc(const char *file,int line,const char *fmt, ...);
+extern void warn_doc_error(const char *file,int line,const char *fmt, ...);
+extern void err(const char *fmt, ...);
+void initWarningFormat();
+
+#endif
diff --git a/src/msc.cpp b/src/msc.cpp
new file mode 100644
index 0000000..81b15d2
--- /dev/null
+++ b/src/msc.cpp
@@ -0,0 +1,198 @@
+/******************************************************************************
+ *
+ * $Id: msc.cpp,v 1.14 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "msc.h"
+#include "portable.h"
+#include "config.h"
+#include "message.h"
+#include "docparser.h"
+#include "doxygen.h"
+
+#include <qdir.h>
+
+static const int maxCmdLine = 40960;
+
+static bool convertMapFile(QTextStream &t,const char *mapName,const QCString relPath,
+ const QCString &context)
+{
+ QFile f(mapName);
+ if (!f.open(IO_ReadOnly))
+ {
+ err("error: failed to open map file %s for inclusion in the docs!\n"
+ "If you installed Graphviz/dot after a previous failing run, \n"
+ "try deleting the output directory and rerun doxygen.\n",mapName);
+ return FALSE;
+ }
+ const int maxLineLen=1024;
+ char buf[maxLineLen];
+ char url[maxLineLen];
+ char ref[maxLineLen];
+ int x1,y1,x2,y2;
+ while (!f.atEnd())
+ {
+ bool isRef = FALSE;
+ int numBytes = f.readLine(buf,maxLineLen);
+ buf[numBytes-1]='\0';
+ //printf("ReadLine `%s'\n",buf);
+ if (strncmp(buf,"rect",4)==0)
+ {
+ // obtain the url and the coordinates in the order used by graphviz-1.5
+ sscanf(buf,"rect %s %d,%d %d,%d",url,&x1,&y1,&x2,&y2);
+
+ if ( strcmp(url,"\\ref") == 0 )
+ {
+ isRef = TRUE;
+ sscanf(buf,"rect %s %s %d,%d %d,%d",ref,url,&x1,&y1,&x2,&y2);
+ }
+
+ // sanity checks
+ if (y2<y1) { int temp=y2; y2=y1; y1=temp; }
+ if (x2<x1) { int temp=x2; x2=x1; x1=temp; }
+
+ t << "<area href=\"";
+
+ if ( isRef )
+ {
+ // handle doxygen \ref tag URL reference
+ DocRef *df = new DocRef( (DocNode*) 0, url, context );
+ t << externalRef(relPath,df->ref(),TRUE);
+ if (!df->file().isEmpty()) t << df->file() << Doxygen::htmlFileExtension;
+ if (!df->anchor().isEmpty()) t << "#" << df->anchor();
+ }
+ else
+ {
+ t << url;
+ }
+ t << "\" shape=\"rect\" coords=\""
+ << x1 << "," << y1 << "," << x2 << "," << y2 << "\""
+ << " alt=\"\"/>" << endl;
+ }
+ }
+
+ return TRUE;
+}
+
+void writeMscGraphFromFile(const char *inFile,const char *outDir,
+ const char *outFile,MscOutputFormat format)
+{
+ QCString absOutFile = outDir;
+ absOutFile+=portable_pathSeparator();
+ absOutFile+=outFile;
+
+ // chdir to the output dir, so dot can find the font file.
+ QCString oldDir = convertToQCString(QDir::currentDirPath());
+ // go to the html output directory (i.e. path)
+ QDir::setCurrent(outDir);
+ //printf("Going to dir %s\n",QDir::currentDirPath().data());
+ QCString mscExe = Config_getString("MSCGEN_PATH")+"mscgen"+portable_commandExtension();
+ QCString mscArgs;
+ QCString extension;
+ if (format==MSC_BITMAP)
+ {
+ mscArgs+="-T png";
+ extension=".png";
+ }
+ else if (format==MSC_EPS)
+ {
+ mscArgs+="-T eps";
+ extension=".eps";
+ }
+ mscArgs+=" -i \"";
+ mscArgs+=inFile;
+
+ mscArgs+="\" -o \"";
+ mscArgs+=outFile;
+ mscArgs+=extension+"\"";
+ int exitCode;
+// printf("*** running: %s %s outDir:%s %s\n",mscExe.data(),mscArgs.data(),outDir,outFile);
+ portable_sysTimerStart();
+ if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0)
+ {
+ portable_sysTimerStop();
+ goto error;
+ }
+ portable_sysTimerStop();
+ if ( (format==MSC_EPS) && (Config_getBool("USE_PDFLATEX")) )
+ {
+ QCString epstopdfArgs(maxCmdLine);
+ epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
+ outFile,outFile);
+ portable_sysTimerStart();
+ if (portable_system("epstopdf",epstopdfArgs)!=0)
+ {
+ err("error: Problems running epstopdf. Check your TeX installation!\n");
+ }
+ portable_sysTimerStop();
+ }
+
+error:
+ QDir::setCurrent(oldDir);
+}
+
+QCString getMscImageMapFromFile(const QCString& inFile, const QCString& outDir,
+ const QCString& relPath,const QCString& context)
+{
+ QCString outFile = inFile + ".map";
+
+
+ //printf("*** running:getMscImageMapFromFile \n");
+ // chdir to the output dir, so dot can find the font file.
+ QCString oldDir = convertToQCString(QDir::currentDirPath());
+ // go to the html output directory (i.e. path)
+ QDir::setCurrent(outDir);
+ //printf("Going to dir %s\n",QDir::currentDirPath().data());
+
+ QCString mscExe = Config_getString("MSCGEN_PATH")+"mscgen"+portable_commandExtension();
+ QCString mscArgs = "-T ismap -i \"";
+ mscArgs+=inFile;
+ QFileInfo fi(inFile);
+ mscArgs+="\" -o \"";
+ mscArgs+=outFile + "\"";
+
+ int exitCode;
+ portable_sysTimerStart();
+ if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0)
+ {
+ portable_sysTimerStop();
+ QDir::setCurrent(oldDir);
+ return "";
+ }
+ portable_sysTimerStop();
+
+ QString result;
+ QTextOStream tmpout(&result);
+ convertMapFile(tmpout, outFile, relPath, context);
+ QDir().remove(outFile);
+
+ QDir::setCurrent(oldDir);
+ return result.data();
+}
+
+void writeMscImageMapFromFile(FTextStream &t,const QCString &inFile,
+ const QCString &outDir,
+ const QCString &relPath,
+ const QCString &baseName,
+ const QCString &context)
+{
+ QCString mapName = baseName+".map";
+ QCString mapFile = inFile+".map";
+ t << "<img src=\"" << relPath << baseName << ".png\" alt=\""
+ << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl;
+ QCString imap = getMscImageMapFromFile(inFile,outDir,relPath,context);
+ t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl;
+}
+
diff --git a/src/msc.h b/src/msc.h
new file mode 100644
index 0000000..6d40532
--- /dev/null
+++ b/src/msc.h
@@ -0,0 +1,38 @@
+/******************************************************************************
+ *
+ * $Id: msc.h,v 1.14 2001/03/19 19:27:40 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _MSC_H
+#define _MSC_H
+
+#include "qtbc.h"
+
+class FTextStream;
+
+enum MscOutputFormat { MSC_BITMAP , MSC_EPS };
+
+void writeMscGraphFromFile(const char *inFile,const char *outDir,
+ const char *outFile,MscOutputFormat format);
+
+QCString getMscImageMapFromFile(const QCString& inFile, const QCString& outDir,
+ const QCString& relPath,const QCString& context);
+
+void writeMscImageMapFromFile(FTextStream &t,const QCString &inFile,
+ const QCString &outDir, const QCString &relPath,
+ const QCString &baseName, const QCString &context);
+
+#endif
+
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
new file mode 100644
index 0000000..6f505ca
--- /dev/null
+++ b/src/namespacedef.cpp
@@ -0,0 +1,992 @@
+/******************************************************************************
+ *
+ * $Id: namespacedef.cpp,v 1.27 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include "namespacedef.h"
+#include "outputlist.h"
+#include "util.h"
+#include "language.h"
+#include "classdef.h"
+#include "classlist.h"
+#include "memberlist.h"
+#include "doxygen.h"
+#include "message.h"
+#include "docparser.h"
+#include "searchindex.h"
+#include "vhdldocgen.h"
+#include "layout.h"
+
+//------------------------------------------------------------------
+
+NamespaceDef::NamespaceDef(const char *df,int dl,
+ const char *name,const char *lref,
+ const char *fName) :
+ Definition(df,dl,name)
+{
+ if (fName)
+ {
+ fileName = stripExtension(fName);
+ }
+ else
+ {
+ fileName="namespace";
+ fileName+=name;
+ }
+ classSDict = new ClassSDict(17);
+ namespaceSDict = new NamespaceSDict(17);
+ m_innerCompounds = new SDict<Definition>(17);
+ usingDirList = 0;
+ usingDeclList = 0;
+ m_allMembersDict = 0;
+ setReference(lref);
+ memberGroupSDict = new MemberGroupSDict;
+ memberGroupSDict->setAutoDelete(TRUE);
+ visited=FALSE;
+ m_subGrouping=Config_getBool("SUBGROUPING");
+ m_isCSharp = df && getLanguageFromFileName(df)==SrcLangExt_CSharp;
+}
+
+NamespaceDef::~NamespaceDef()
+{
+ delete classSDict;
+ delete namespaceSDict;
+ delete m_innerCompounds;
+ delete usingDirList;
+ delete usingDeclList;
+ delete memberGroupSDict;
+}
+
+void NamespaceDef::distributeMemberGroupDocumentation()
+{
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->distributeMemberGroupDocumentation();
+ }
+}
+
+void NamespaceDef::findSectionsInDocumentation()
+{
+ docFindSections(documentation(),this,0,docFile());
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->findSectionsInDocumentation();
+ }
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::declarationLists)
+ {
+ ml->findSectionsInDocumentation();
+ }
+ }
+}
+
+void NamespaceDef::insertUsedFile(const char *f)
+{
+ if (files.find(f)==-1)
+ {
+ if (Config_getBool("SORT_MEMBER_DOCS"))
+ files.inSort(f);
+ else
+ files.append(f);
+ }
+}
+
+void NamespaceDef::addInnerCompound(Definition *d)
+{
+ m_innerCompounds->append(d->localName(),d);
+ if (d->definitionType()==Definition::TypeNamespace)
+ {
+ insertNamespace((NamespaceDef *)d);
+ }
+ else if (d->definitionType()==Definition::TypeClass)
+ {
+ insertClass((ClassDef *)d);
+ }
+}
+
+void NamespaceDef::insertClass(ClassDef *cd)
+{
+ if (classSDict->find(cd->name())==0)
+ {
+ if (Config_getBool("SORT_BRIEF_DOCS"))
+ classSDict->inSort(cd->name(),cd);
+ else
+ classSDict->append(cd->name(),cd);
+ }
+}
+
+void NamespaceDef::insertNamespace(NamespaceDef *nd)
+{
+ if (namespaceSDict->find(nd->name())==0)
+ {
+ if (Config_getBool("SORT_MEMBER_DOCS"))
+ namespaceSDict->inSort(nd->name(),nd);
+ else
+ namespaceSDict->append(nd->name(),nd);
+ }
+}
+
+
+void NamespaceDef::addMembersToMemberGroup()
+{
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::declarationLists)
+ {
+ ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
+ }
+ }
+
+ // add members inside sections to their groups
+ if (memberGroupSDict)
+ {
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ if (mg->allMembersInSameSection() && m_subGrouping)
+ {
+ //printf("----> addToDeclarationSection(%s)\n",mg->header().data());
+ mg->addToDeclarationSection();
+ }
+ }
+ }
+}
+
+void NamespaceDef::insertMember(MemberDef *md)
+{
+ if (md->isHidden()) return;
+ MemberList *allMemberList = getMemberList(MemberList::allMembersList);
+ if (allMemberList==0)
+ {
+ allMemberList = new MemberList(MemberList::allMembersList);
+ m_memberLists.append(allMemberList);
+ }
+ allMemberList->append(md);
+ if (m_allMembersDict==0)
+ {
+ m_allMembersDict = new MemberSDict;
+ }
+ //printf("%s::m_allMembersDict->append(%s)\n",name().data(),md->localName().data());
+ m_allMembersDict->append(md->localName(),md);
+ //::addNamespaceMemberNameToIndex(md);
+ //static bool sortBriefDocs=Config_getBool("SORT_BRIEF_DOCS");
+ switch(md->memberType())
+ {
+ case MemberDef::Variable:
+ addMemberToList(MemberList::decVarMembers,md);
+ addMemberToList(MemberList::docVarMembers,md);
+ break;
+ case MemberDef::Function:
+ addMemberToList(MemberList::decFuncMembers,md);
+ addMemberToList(MemberList::docFuncMembers,md);
+ break;
+ case MemberDef::Typedef:
+ addMemberToList(MemberList::decTypedefMembers,md);
+ addMemberToList(MemberList::docTypedefMembers,md);
+ break;
+ case MemberDef::Enumeration:
+ addMemberToList(MemberList::decEnumMembers,md);
+ addMemberToList(MemberList::docEnumMembers,md);
+ break;
+ case MemberDef::EnumValue:
+ break;
+ case MemberDef::Define:
+ addMemberToList(MemberList::decDefineMembers,md);
+ addMemberToList(MemberList::docDefineMembers,md);
+ break;
+ default:
+ err("NamespaceDef::insertMembers(): "
+ "member `%s' with class scope `%s' inserted in namespace scope `%s'!\n",
+ md->name().data(),
+ md->getClassDef() ? md->getClassDef()->name().data() : "",
+ name().data());
+ }
+}
+
+void NamespaceDef::computeAnchors()
+{
+ MemberList *allMemberList = getMemberList(MemberList::allMembersList);
+ if (allMemberList) setAnchors(0,'a',allMemberList);
+}
+
+void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title)
+{
+ if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
+ !documentation().isEmpty()
+ )
+ {
+ ol.writeRuler();
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeAnchor(0,"details");
+ ol.popGeneratorState();
+ ol.startGroupHeader();
+ ol.parseText(title);
+ ol.endGroupHeader();
+
+ ol.startTextBlock();
+ if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
+ {
+ ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ }
+ if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
+ !documentation().isEmpty())
+ {
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::RTF);
+ //ol.newParagraph(); // FIXME:PARA
+ ol.enableAll();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.writeString("\n\n");
+ ol.popGeneratorState();
+ }
+ if (!documentation().isEmpty())
+ {
+ ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ }
+ ol.endTextBlock();
+ }
+}
+
+void NamespaceDef::writeBriefDescription(OutputList &ol)
+{
+ if (!briefDescription().isEmpty())
+ {
+ ol.startParagraph();
+ ol.parseDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.writeString(" \n");
+ ol.enable(OutputGenerator::RTF);
+
+ if (Config_getBool("REPEAT_BRIEF") ||
+ !documentation().isEmpty()
+ )
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startTextLink(0,"details");
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ }
+ ol.popGeneratorState();
+ ol.endParagraph();
+
+ // FIXME:PARA
+ //ol.pushGeneratorState();
+ //ol.disable(OutputGenerator::RTF);
+ //ol.newParagraph();
+ //ol.popGeneratorState();
+ }
+ ol.writeSynopsis();
+}
+
+void NamespaceDef::startMemberDeclarations(OutputList &ol)
+{
+ ol.startMemberSections();
+}
+
+void NamespaceDef::endMemberDeclarations(OutputList &ol)
+{
+ ol.endMemberSections();
+}
+
+void NamespaceDef::startMemberDocumentation(OutputList &ol)
+{
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ ol.disable(OutputGenerator::Html);
+ Doxygen::suppressDocWarnings = TRUE;
+ }
+}
+
+void NamespaceDef::endMemberDocumentation(OutputList &ol)
+{
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ ol.enable(OutputGenerator::Html);
+ Doxygen::suppressDocWarnings = FALSE;
+ }
+}
+
+void NamespaceDef::writeClassDeclarations(OutputList &ol,const QCString &title)
+{
+ if (classSDict) classSDict->writeDeclaration(ol,0,title,TRUE);
+}
+
+void NamespaceDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
+{
+ if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,TRUE);
+}
+
+void NamespaceDef::writeMemberGroups(OutputList &ol)
+{
+ /* write user defined member groups */
+ if (memberGroupSDict)
+ {
+ memberGroupSDict->sort();
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ if ((!mg->allMembersInSameSection() || !m_subGrouping)
+ && mg->header()!="[NOHEADER]")
+ {
+ mg->writeDeclarations(ol,0,this,0,0);
+ }
+ }
+ }
+}
+
+void NamespaceDef::writeAuthorSection(OutputList &ol)
+{
+ // write Author section (Man only)
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.startGroupHeader();
+ ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
+ ol.endGroupHeader();
+ ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
+ ol.popGeneratorState();
+}
+
+void NamespaceDef::writeSummaryLinks(OutputList &ol)
+{
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace));
+ LayoutDocEntry *lde;
+ bool first=TRUE;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ if ((lde->kind()==LayoutDocEntry::NamespaceClasses && classSDict && classSDict->declVisible()) ||
+ (lde->kind()==LayoutDocEntry::NamespaceNestedNamespaces && namespaceSDict && namespaceSDict->declVisible())
+ )
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ QCString label = lde->kind()==LayoutDocEntry::NamespaceClasses ? "nested-classes" : "namespaces";
+ writeSummaryLink(ol,label,ls->title,first);
+ }
+ else if (lde->kind()== LayoutDocEntry::MemberDecl)
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ MemberList * ml = getMemberList(lmd->type);
+ if (ml && ml->declVisible())
+ {
+ writeSummaryLink(ol,ml->listTypeAsString(),lmd->title,first);
+ }
+ }
+ }
+ if (!first)
+ {
+ ol.writeString(" </div>\n");
+ }
+ ol.popGeneratorState();
+}
+
+void NamespaceDef::writeDocumentation(OutputList &ol)
+{
+ static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool outputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+
+ QCString pageTitle;
+ if (outputJava)
+ {
+ pageTitle = theTranslator->trPackage(displayName());
+ }
+ else if (fortranOpt)
+ {
+ pageTitle = theTranslator->trModuleReference(displayName());
+ }
+ else
+ {
+ pageTitle = theTranslator->trNamespaceReference(displayName());
+ }
+ startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_NamespaceVisible,!generateTreeView);
+
+ if (!generateTreeView)
+ {
+ if (getOuterScope()!=Doxygen::globalScope)
+ {
+ writeNavigationPath(ol);
+ }
+ ol.endQuickIndices();
+ }
+
+ startTitle(ol,getOutputFileBase(),this);
+ ol.parseText(pageTitle);
+ addGroupListToTitle(ol,this);
+ endTitle(ol,getOutputFileBase(),displayName());
+ ol.startContents();
+
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());
+ Doxygen::searchIndex->addWord(localName(),TRUE);
+ }
+
+ bool generateTagFile = !Config_getString("GENERATE_TAGFILE").isEmpty();
+ if (generateTagFile)
+ {
+ Doxygen::tagFile << " <compound kind=\"namespace\">" << endl;
+ Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
+ Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
+ }
+
+ Doxygen::indexList.addIndexItem(this,0);
+
+ //---------------------------------------- start flexible part -------------------------------
+
+ QListIterator<LayoutDocEntry> eli(
+ LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace));
+ LayoutDocEntry *lde;
+ for (eli.toFirst();(lde=eli.current());++eli)
+ {
+ switch (lde->kind())
+ {
+ case LayoutDocEntry::BriefDesc:
+ writeBriefDescription(ol);
+ break;
+ case LayoutDocEntry::MemberDeclStart:
+ startMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::NamespaceClasses:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeClassDeclarations(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::NamespaceNestedNamespaces:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeNamespaceDeclarations(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::MemberGroups:
+ writeMemberGroups(ol);
+ break;
+ case LayoutDocEntry::MemberDecl:
+ {
+ LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+ writeMemberDeclarations(ol,lmd->type,lmd->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDeclEnd:
+ endMemberDeclarations(ol);
+ break;
+ case LayoutDocEntry::DetailedDesc:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeDetailedDescription(ol,ls->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDefStart:
+ startMemberDocumentation(ol);
+ break;
+ case LayoutDocEntry::MemberDef:
+ {
+ LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+ writeMemberDocumentation(ol,lmd->type,lmd->title);
+ }
+ break;
+ case LayoutDocEntry::MemberDefEnd:
+ endMemberDocumentation(ol);
+ break;
+ case LayoutDocEntry::AuthorSection:
+ writeAuthorSection(ol);
+ break;
+ case LayoutDocEntry::ClassIncludes:
+ case LayoutDocEntry::ClassInheritanceGraph:
+ case LayoutDocEntry::ClassNestedClasses:
+ case LayoutDocEntry::ClassCollaborationGraph:
+ case LayoutDocEntry::ClassAllMembersLink:
+ case LayoutDocEntry::ClassUsedFiles:
+ case LayoutDocEntry::FileClasses:
+ case LayoutDocEntry::FileNamespaces:
+ case LayoutDocEntry::FileIncludes:
+ case LayoutDocEntry::FileIncludeGraph:
+ case LayoutDocEntry::FileIncludedByGraph:
+ case LayoutDocEntry::FileSourceLink:
+ case LayoutDocEntry::GroupClasses:
+ case LayoutDocEntry::GroupInlineClasses:
+ case LayoutDocEntry::GroupNamespaces:
+ case LayoutDocEntry::GroupDirs:
+ case LayoutDocEntry::GroupNestedGroups:
+ case LayoutDocEntry::GroupFiles:
+ case LayoutDocEntry::GroupGraph:
+ case LayoutDocEntry::GroupPageDocs:
+ case LayoutDocEntry::DirSubDirs:
+ case LayoutDocEntry::DirFiles:
+ case LayoutDocEntry::DirGraph:
+ err("Internal inconsistency: member %d should not be part of "
+ "LayoutDocManager::Namespace entry list\n",lde->kind());
+ break;
+ }
+ }
+
+ //---------------------------------------- end flexible part -------------------------------
+
+ ol.endContents();
+
+ if (generateTreeView)
+ {
+ writeNavigationPath(ol);
+ }
+
+ endFile(ol,TRUE);
+
+ if (generateTagFile)
+ {
+ writeDocAnchorsToTagFile();
+ Doxygen::tagFile << " </compound>" << endl;
+ }
+
+ if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+ {
+ MemberList *allMemberList = getMemberList(MemberList::allMembersList);
+ if (allMemberList) allMemberList->sort();
+ writeMemberPages(ol);
+ }
+}
+
+void NamespaceDef::writeMemberPages(OutputList &ol)
+{
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::documentationLists)
+ {
+ ml->writeDocumentationPage(ol,name(),this);
+ }
+ }
+ ol.popGeneratorState();
+}
+
+void NamespaceDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
+{
+ static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
+
+ ol.writeString(" <div class=\"navtab\">\n");
+ ol.writeString(" <table>\n");
+
+ MemberList *allMemberList = getMemberList(MemberList::allMembersList);
+ if (allMemberList)
+ {
+ MemberListIterator mli(*allMemberList);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ if (md->getNamespaceDef()==this && md->isLinkable())
+ {
+ ol.writeString(" <tr><td class=\"navtab\">");
+ if (md->isLinkableInProject())
+ {
+ if (md==currentMd) // selected item => highlight
+ {
+ ol.writeString("<a class=\"qindexHL\" ");
+ }
+ else
+ {
+ ol.writeString("<a class=\"qindex\" ");
+ }
+ ol.writeString("href=\"");
+ if (createSubDirs) ol.writeString("../../");
+ ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
+ ol.writeString("\">");
+ ol.writeString(md->localName());
+ ol.writeString("</a>");
+ }
+ ol.writeString("</td></tr>\n");
+ }
+ }
+ }
+
+ ol.writeString(" </table>\n");
+ ol.writeString(" </div>\n");
+}
+
+int NamespaceDef::countMembers()
+{
+ MemberList *allMemberList = getMemberList(MemberList::allMembersList);
+ if (allMemberList) allMemberList->countDocMembers();
+ return (allMemberList ? allMemberList->numDocMembers() : 0)+classSDict->count();
+}
+
+void NamespaceDef::addUsingDirective(NamespaceDef *nd)
+{
+ if (usingDirList==0)
+ {
+ usingDirList = new NamespaceSDict;
+ }
+ if (usingDirList->find(nd->qualifiedName())==0)
+ {
+ usingDirList->append(nd->qualifiedName(),nd);
+ }
+ //printf("%p: NamespaceDef::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count());
+}
+
+NamespaceSDict *NamespaceDef::getUsedNamespaces() const
+{
+ //printf("%p: NamespaceDef::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0);
+ return usingDirList;
+}
+
+void NamespaceDef::addUsingDeclaration(Definition *d)
+{
+ if (usingDeclList==0)
+ {
+ usingDeclList = new SDict<Definition>(17);
+ }
+ if (usingDeclList->find(d->qualifiedName())==0)
+ {
+ usingDeclList->append(d->qualifiedName(),d);
+ }
+}
+
+QCString NamespaceDef::getOutputFileBase() const
+{
+ if (isReference())
+ {
+ return fileName;
+ }
+ else
+ {
+ return convertNameToFile(fileName);
+ }
+}
+
+Definition *NamespaceDef::findInnerCompound(const char *n)
+{
+ if (n==0) return 0;
+ Definition *d = m_innerCompounds->find(n);
+ if (d==0)
+ {
+ if (usingDirList)
+ {
+ d = usingDirList->find(n);
+ }
+ if (d==0 && usingDeclList)
+ {
+ d = usingDeclList->find(n);
+ }
+ }
+ return d;
+}
+
+void NamespaceDef::addListReferences()
+{
+ bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ {
+ LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
+ addRefItem(xrefItems.pointer(),
+ qualifiedName(),
+ fortranOpt?theTranslator->trModule(TRUE,TRUE):theTranslator->trNamespace(TRUE,TRUE),
+ getOutputFileBase(),displayName(),
+ 0
+ );
+ }
+ MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->addListReferences(this);
+ }
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()&MemberList::documentationLists)
+ {
+ ml->addListReferences(this);
+ }
+ }
+}
+
+QCString NamespaceDef::displayName() const
+{
+ QCString result=name();
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ result = substitute(result,"::",".");
+ }
+ return result;
+}
+
+void NamespaceDef::combineUsingRelations()
+{
+ if (visited) return; // already done
+ visited=TRUE;
+ if (usingDirList)
+ {
+ NamespaceSDict::Iterator nli(*usingDirList);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ nd->combineUsingRelations();
+ }
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ // add used namespaces of namespace nd to this namespace
+ if (nd->getUsedNamespaces())
+ {
+ NamespaceSDict::Iterator unli(*nd->getUsedNamespaces());
+ NamespaceDef *und;
+ for (unli.toFirst();(und=unli.current());++unli)
+ {
+ //printf("Adding namespace %s to the using list of %s\n",und->qualifiedName().data(),qualifiedName().data());
+ addUsingDirective(und);
+ }
+ }
+ // add used classes of namespace nd to this namespace
+ if (nd->getUsedClasses())
+ {
+ SDict<Definition>::Iterator cli(*nd->getUsedClasses());
+ Definition *ucd;
+ for (cli.toFirst();(ucd=cli.current());++cli)
+ {
+ //printf("Adding class %s to the using list of %s\n",cd->qualifiedName().data(),qualifiedName().data());
+ addUsingDeclaration(ucd);
+ }
+ }
+ }
+ }
+}
+
+bool NamespaceSDict::declVisible() const
+{
+ SDict<NamespaceDef>::Iterator ni(*this);
+ NamespaceDef *nd;
+ for (ni.toFirst();(nd=ni.current());++ni)
+ {
+ if (nd->isLinkable())
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool localName)
+{
+ if (count()==0) return; // no namespaces in the list
+
+ SDict<NamespaceDef>::Iterator ni(*this);
+ NamespaceDef *nd;
+ bool found=FALSE;
+ for (ni.toFirst();(nd=ni.current()) && !found;++ni)
+ {
+ if (nd->isLinkable()) found=TRUE;
+ }
+ if (!found) return; // no linkable namespaces in the list
+
+ // write list of namespaces
+ ol.startMemberHeader("namespaces");
+ bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+#if 0
+ if (javaOpt)
+ {
+ ol.parseText(theTranslator->trPackages());
+ }
+ else if (fortranOpt)
+ {
+ ol.parseText(theTranslator->trModules());
+ }
+ else
+ {
+ ol.parseText(theTranslator->trNamespaces());
+ }
+#endif
+ ol.parseText(title);
+ ol.endMemberHeader();
+ ol.startMemberList();
+ for (ni.toFirst();(nd=ni.current());++ni)
+ {
+ if (nd->isLinkable())
+ {
+ ol.startMemberItem(0);
+ if (javaOpt)
+ {
+ ol.docify("package ");
+ }
+ else if (fortranOpt)
+ {
+ ol.docify("module ");
+ }
+ else
+ {
+ ol.docify("namespace ");
+ }
+ ol.insertMemberAlign();
+ QCString name;
+ if (localName)
+ {
+ name = nd->localName();
+ }
+ else
+ {
+ name = nd->displayName();
+ }
+ ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),0,name);
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !nd->isReference())
+ {
+ Doxygen::tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
+ }
+ ol.endMemberItem();
+ if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+ {
+ ol.startParagraph();
+ ol.startMemberDescription();
+ ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE);
+ ol.endMemberDescription();
+ ol.endParagraph();
+ }
+ }
+ }
+ ol.endMemberList();
+}
+
+MemberList *NamespaceDef::createMemberList(MemberList::ListType lt)
+{
+ m_memberLists.setAutoDelete(TRUE);
+ QListIterator<MemberList> mli(m_memberLists);
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if (ml->listType()==lt)
+ {
+ return ml;
+ }
+ }
+ // not found, create a new member list
+ ml = new MemberList(lt);
+ m_memberLists.append(ml);
+ return ml;
+}
+
+void NamespaceDef::addMemberToList(MemberList::ListType lt,MemberDef *md)
+{
+ static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
+ static bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");
+ MemberList *ml = createMemberList(lt);
+ ml->setNeedsSorting(
+ ((ml->listType()&MemberList::declarationLists) && sortBriefDocs) ||
+ ((ml->listType()&MemberList::documentationLists) && sortMemberDocs));
+ ml->append(md);
+
+#if 0
+ if (ml->needsSorting())
+ ml->inSort(md);
+ else
+ ml->append(md);
+#endif
+
+ if (ml->listType()&MemberList::declarationLists) md->setSectionList(this,ml);
+}
+
+void NamespaceDef::sortMemberLists()
+{
+ MemberList *ml = m_memberLists.first();
+ while (ml)
+ {
+ if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
+ ml = m_memberLists.next();
+ }
+}
+
+
+
+MemberList *NamespaceDef::getMemberList(MemberList::ListType lt) const
+{
+ NamespaceDef *that = (NamespaceDef*)this;
+ MemberList *ml = that->m_memberLists.first();
+ while (ml)
+ {
+ if (ml->listType()==lt)
+ {
+ return ml;
+ }
+ ml = that->m_memberLists.next();
+ }
+ return 0;
+}
+
+void NamespaceDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title)
+{
+ MemberList * ml = getMemberList(lt);
+ if (ml) ml->writeDeclarations(ol,0,this,0,0,title,0);
+}
+
+void NamespaceDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title)
+{
+ MemberList * ml = getMemberList(lt);
+ if (ml) ml->writeDocumentation(ol,name(),this,title);
+}
+
+
+bool NamespaceDef::isLinkableInProject() const
+{
+ int i = name().findRev("::");
+ if (i==-1) i=0; else i+=2;
+ static bool extractAnonNs = Config_getBool("EXTRACT_ANON_NSPACES");
+ static bool showNamespaces = Config_getBool("SHOW_NAMESPACES");
+ if (extractAnonNs && // extract anonymous ns
+ name().mid(i,20)=="anonymous_namespace{" && // correct prefix
+ showNamespaces) // not disabled by config
+ {
+ return TRUE;
+ }
+ return !name().isEmpty() && name().at(i)!='@' && // not anonymous
+ (hasDocumentation() || m_isCSharp) && // documented
+ !isReference() && // not an external reference
+ !isHidden() && // not hidden
+ !isArtificial() && // or artificial
+ showNamespaces; // not disabled by config
+}
+
+bool NamespaceDef::isLinkable() const
+{
+ return isLinkableInProject() || isReference();
+}
+
+MemberDef * NamespaceDef::getMemberByName(const QCString &n) const
+{
+ MemberDef *md = 0;
+ if (m_allMembersDict && !n.isEmpty())
+ {
+ md = m_allMembersDict->find(n);
+ //printf("%s::m_allMembersDict->find(%s)=%p\n",name().data(),n.data(),md);
+ }
+ return md;
+}
+
diff --git a/src/namespacedef.h b/src/namespacedef.h
new file mode 100644
index 0000000..16118af
--- /dev/null
+++ b/src/namespacedef.h
@@ -0,0 +1,167 @@
+/******************************************************************************
+ *
+ * $Id: namespacedef.h,v 1.18 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef NAMESPACEDEF_H
+#define NAMESPACEDEF_H
+
+#include "qtbc.h"
+#include <qstrlist.h>
+#include <qdict.h>
+#include "sortdict.h"
+#include "definition.h"
+#include "memberlist.h"
+
+class ClassDef;
+class ClassList;
+class OutputList;
+class ClassSDict;
+class MemberDef;
+class NamespaceList;
+class MemberGroupSDict;
+class NamespaceSDict;
+
+class NamespaceDef : public Definition
+{
+ public:
+ NamespaceDef(const char *defFileName,int defLine,
+ const char *name,const char *ref=0,
+ const char *refFile=0);
+ ~NamespaceDef();
+ DefType definitionType() const { return TypeNamespace; }
+ QCString getOutputFileBase() const;
+ void insertUsedFile(const char *fname);
+
+ void writeDocumentation(OutputList &ol);
+ void writeMemberPages(OutputList &ol);
+ void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
+
+ void insertClass(ClassDef *cd);
+ void insertNamespace(NamespaceDef *nd);
+ void insertMember(MemberDef *md);
+
+ void computeAnchors();
+ int countMembers();
+ void addUsingDirective(NamespaceDef *nd);
+ NamespaceSDict *getUsedNamespaces() const;
+ void addUsingDeclaration(Definition *def);
+ SDict<Definition> *getUsedClasses() const { return usingDeclList; }
+ void combineUsingRelations();
+ QCString displayName() const;
+
+ bool isLinkableInProject() const;
+ bool isLinkable() const;
+ void addMembersToMemberGroup();
+ void distributeMemberGroupDocumentation();
+ void findSectionsInDocumentation();
+ void sortMemberLists();
+
+ virtual Definition *findInnerCompound(const char *name);
+ void addInnerCompound(Definition *d);
+ void addListReferences();
+
+ MemberList *getMemberList(MemberList::ListType lt) const;
+ const QList<MemberList> &getMemberLists() const { return m_memberLists; }
+ MemberDef *getMemberByName(const QCString &) const;
+
+ /*! Returns the user defined member groups */
+ MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
+
+ /*! Returns the classes contained in this namespace */
+ ClassSDict *getClassSDict() const { return classSDict; }
+
+ /*! Returns the namespaces contained in this namespace */
+ NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; }
+
+ bool visited;
+
+ private:
+ MemberList *createMemberList(MemberList::ListType lt);
+ void addMemberToList(MemberList::ListType lt,MemberDef *md);
+ void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title);
+ void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title);
+ void writeDetailedDescription(OutputList &ol,const QCString &title);
+ void writeBriefDescription(OutputList &ol);
+ void startMemberDeclarations(OutputList &ol);
+ void endMemberDeclarations(OutputList &ol);
+ void writeClassDeclarations(OutputList &ol,const QCString &title);
+ void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
+ void writeMemberGroups(OutputList &ol);
+ void writeAuthorSection(OutputList &ol);
+ void startMemberDocumentation(OutputList &ol);
+ void endMemberDocumentation(OutputList &ol);
+ void writeSummaryLinks(OutputList &ol);
+
+ QCString fileName;
+ QStrList files;
+
+ NamespaceSDict *usingDirList;
+ SDict<Definition> *usingDeclList;
+ SDict<Definition> *m_innerCompounds;
+
+ MemberSDict *m_allMembersDict;
+ QList<MemberList> m_memberLists;
+ MemberGroupSDict *memberGroupSDict;
+ ClassSDict *classSDict;
+ NamespaceSDict *namespaceSDict;
+ bool m_subGrouping;
+ bool m_isCSharp;
+};
+
+class NamespaceList : public QList<NamespaceDef>
+{
+ public:
+ ~NamespaceList() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ return stricmp(((NamespaceDef *)item1)->name(),
+ ((NamespaceDef *)item2)->name()
+ );
+ }
+};
+
+class NamespaceListIterator : public QListIterator<NamespaceDef>
+{
+ public:
+ NamespaceListIterator(const NamespaceList &l) :
+ QListIterator<NamespaceDef>(l) {}
+};
+
+class NamespaceDict : public QDict<NamespaceDef>
+{
+ public:
+ NamespaceDict(int size) : QDict<NamespaceDef>(size) {}
+ ~NamespaceDict() {}
+};
+
+class NamespaceSDict : public SDict<NamespaceDef>
+{
+ public:
+ NamespaceSDict(int size=17) : SDict<NamespaceDef>(size) {}
+ ~NamespaceSDict() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ return stricmp(((NamespaceDef *)item1)->name(),
+ ((NamespaceDef *)item2)->name()
+ );
+ }
+ void writeDeclaration(OutputList &ol,const char *title,bool localName=FALSE);
+ bool declVisible() const;
+};
+
+
+
+#endif
diff --git a/src/navtree.css b/src/navtree.css
new file mode 100644
index 0000000..a87fa62
--- /dev/null
+++ b/src/navtree.css
@@ -0,0 +1,123 @@
+#nav-tree .children_ul {
+ margin:0;
+ padding:4px;
+}
+
+#nav-tree ul {
+ list-style:none outside none;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree li {
+ white-space:nowrap;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .plus {
+ margin:0px;
+}
+
+#nav-tree .selected {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+#nav-tree img {
+ margin:0px;
+ padding:0px;
+ border:0px;
+ vertical-align: middle;
+}
+
+#nav-tree a {
+ text-decoration:none;
+ padding:0px;
+ margin:0px;
+ outline:none;
+}
+
+#nav-tree .label {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .label a {
+ padding:2px;
+}
+
+#nav-tree .selected a {
+ text-decoration:none;
+ padding:2px;
+ margin:0px;
+ color:#fff;
+}
+
+#nav-tree .children_ul {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .item {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree {
+ padding: 0px 0px;
+ background-color: #FAFAFF;
+ font-size:14px;
+ overflow:auto;
+}
+
+#doc-content {
+ overflow:auto;
+ display:block;
+ padding:0px;
+ margin:0px;
+}
+
+#side-nav {
+ padding:0 6px 0 0;
+ margin: 0px;
+ display:block;
+ position: absolute;
+ left: 0px;
+ width: 300px;
+}
+
+.ui-resizable .ui-resizable-handle {
+ display:block;
+}
+
+.ui-resizable-e {
+ background:url("ftv2splitbar.png") repeat scroll right center transparent;
+ cursor:e-resize;
+ height:100%;
+ right:0;
+ top:0;
+ width:6px;
+}
+
+.ui-resizable-handle {
+ display:none;
+ font-size:0.1px;
+ position:absolute;
+ z-index:1;
+}
+
+#nav-tree-contents {
+ margin: 6px 0px 0px 0px;
+}
+
+#nav-tree {
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: ##FA;
+}
+
+
+
diff --git a/src/navtree.js b/src/navtree.js
new file mode 100644
index 0000000..1301083
--- /dev/null
+++ b/src/navtree.js
@@ -0,0 +1,245 @@
+function createIndent(o,domNode,node,level)
+{
+ if (node.parentNode && node.parentNode.parentNode)
+ {
+ createIndent(o,domNode,node.parentNode,level+1);
+ }
+ var imgNode = document.createElement("img");
+ if (level==0 && node.childrenData)
+ {
+ node.plus_img = imgNode;
+ node.expandToggle = document.createElement("a");
+ node.expandToggle.href = "javascript:void(0)";
+ node.expandToggle.onclick = function()
+ {
+ if (node.expanded)
+ {
+ $(node.getChildrenUL()).slideUp("fast");
+ if (node.isLast)
+ {
+ node.plus_img.src = node.relpath+"ftv2plastnode.png";
+ }
+ else
+ {
+ node.plus_img.src = node.relpath+"ftv2pnode.png";
+ }
+ node.expanded = false;
+ }
+ else
+ {
+ expandNode(o, node, false);
+ }
+ }
+ node.expandToggle.appendChild(imgNode);
+ domNode.appendChild(node.expandToggle);
+ }
+ else
+ {
+ domNode.appendChild(imgNode);
+ }
+ if (level==0)
+ {
+ if (node.isLast)
+ {
+ if (node.childrenData)
+ {
+ imgNode.src = node.relpath+"ftv2plastnode.png";
+ }
+ else
+ {
+ imgNode.src = node.relpath+"ftv2lastnode.png";
+ domNode.appendChild(imgNode);
+ }
+ }
+ else
+ {
+ if (node.childrenData)
+ {
+ imgNode.src = node.relpath+"ftv2pnode.png";
+ }
+ else
+ {
+ imgNode.src = node.relpath+"ftv2node.png";
+ domNode.appendChild(imgNode);
+ }
+ }
+ }
+ else
+ {
+ if (node.isLast)
+ {
+ imgNode.src = node.relpath+"ftv2blank.png";
+ }
+ else
+ {
+ imgNode.src = node.relpath+"ftv2vertline.png";
+ }
+ }
+ imgNode.border = "0";
+}
+
+function newNode(o, po, text, link, childrenData, lastNode)
+{
+ var node = new Object();
+ node.children = Array();
+ node.childrenData = childrenData;
+ node.depth = po.depth + 1;
+ node.relpath = po.relpath;
+ node.isLast = lastNode;
+
+ node.li = document.createElement("li");
+ po.getChildrenUL().appendChild(node.li);
+ node.parentNode = po;
+
+ node.itemDiv = document.createElement("div");
+ node.itemDiv.className = "item";
+
+ node.labelSpan = document.createElement("span");
+ node.labelSpan.className = "label";
+
+ createIndent(o,node.itemDiv,node,0);
+ node.itemDiv.appendChild(node.labelSpan);
+ node.li.appendChild(node.itemDiv);
+
+ var a = document.createElement("a");
+ node.labelSpan.appendChild(a);
+ node.label = document.createTextNode(text);
+ a.appendChild(node.label);
+ if (link)
+ {
+ a.href = node.relpath+link;
+ }
+ else
+ {
+ if (childrenData != null)
+ {
+ a.className = "nolink";
+ a.href = "javascript:void(0)";
+ a.onclick = node.expandToggle.onclick;
+ node.expanded = false;
+ }
+ }
+
+ node.childrenUL = null;
+ node.getChildrenUL = function()
+ {
+ if (!node.childrenUL)
+ {
+ node.childrenUL = document.createElement("ul");
+ node.childrenUL.className = "children_ul";
+ node.childrenUL.style.display = "none";
+ node.li.appendChild(node.childrenUL);
+ }
+ return node.childrenUL;
+ };
+
+ return node;
+}
+
+function showRoot()
+{
+ var headerHeight = $("#top").height();
+ var footerHeight = $("#nav-path").height();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ navtree.scrollTo('#selected',0,{offset:-windowHeight/2});
+}
+
+function expandNode(o, node, imm)
+{
+ if (node.childrenData && !node.expanded)
+ {
+ if (!node.childrenVisited)
+ {
+ getNode(o, node);
+ }
+ if (imm)
+ {
+ $(node.getChildrenUL()).show();
+ }
+ else
+ {
+ $(node.getChildrenUL()).slideDown("fast",showRoot);
+ }
+ if (node.isLast)
+ {
+ node.plus_img.src = node.relpath+"ftv2mlastnode.png";
+ }
+ else
+ {
+ node.plus_img.src = node.relpath+"ftv2mnode.png";
+ }
+ node.expanded = true;
+ }
+}
+
+function getNode(o, po)
+{
+ po.childrenVisited = true;
+ var l = po.childrenData.length-1;
+ for (var i in po.childrenData)
+ {
+ var nodeData = po.childrenData[i];
+ po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],
+ i==l);
+ }
+}
+
+function findNavTreePage(url, data)
+{
+ var nodes = data;
+ var result = null;
+ for (var i in nodes)
+ {
+ var d = nodes[i];
+ if (d[1] == url)
+ {
+ return new Array(i);
+ }
+ else if (d[2] != null) // array of children
+ {
+ result = findNavTreePage(url, d[2]);
+ if (result != null)
+ {
+ return (new Array(i).concat(result));
+ }
+ }
+ }
+ return null;
+}
+
+function initNavTree(toroot,relpath)
+{
+ var o = new Object();
+ o.toroot = toroot;
+ o.node = new Object();
+ o.node.li = document.getElementById("nav-tree-contents");
+ o.node.childrenData = NAVTREE;
+ o.node.children = new Array();
+ o.node.childrenUL = document.createElement("ul");
+ o.node.getChildrenUL = function() { return o.node.childrenUL; };
+ o.node.li.appendChild(o.node.childrenUL);
+ o.node.depth = 0;
+ o.node.relpath = relpath;
+
+ getNode(o, o.node);
+
+ o.breadcrumbs = findNavTreePage(toroot, NAVTREE);
+ if (o.breadcrumbs == null)
+ {
+ o.breadcrumbs = findNavTreePage("index.html",NAVTREE);
+ }
+ if (o.breadcrumbs != null && o.breadcrumbs.length>0)
+ {
+ var p = o.node;
+ for (var i in o.breadcrumbs)
+ {
+ var j = o.breadcrumbs[i];
+ p = p.children[j];
+ expandNode(o,p,true);
+ }
+ p.itemDiv.className = p.itemDiv.className + " selected";
+ p.itemDiv.id = "selected";
+ $(window).load(showRoot);
+ }
+}
+
diff --git a/src/navtree_css.h b/src/navtree_css.h
new file mode 100644
index 0000000..57f119f
--- /dev/null
+++ b/src/navtree_css.h
@@ -0,0 +1,123 @@
+"#nav-tree .children_ul {\n"
+" margin:0;\n"
+" padding:4px;\n"
+"}\n"
+"\n"
+"#nav-tree ul {\n"
+" list-style:none outside none;\n"
+" margin:0px;\n"
+" padding:0px;\n"
+"}\n"
+"\n"
+"#nav-tree li {\n"
+" white-space:nowrap;\n"
+" margin:0px;\n"
+" padding:0px;\n"
+"}\n"
+"\n"
+"#nav-tree .plus {\n"
+" margin:0px;\n"
+"}\n"
+"\n"
+"#nav-tree .selected {\n"
+" background-image: url('tab_a.png');\n"
+" background-repeat:repeat-x;\n"
+" color: #fff;\n"
+" text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);\n"
+"}\n"
+"\n"
+"#nav-tree img {\n"
+" margin:0px;\n"
+" padding:0px;\n"
+" border:0px;\n"
+" vertical-align: middle;\n"
+"}\n"
+"\n"
+"#nav-tree a {\n"
+" text-decoration:none;\n"
+" padding:0px;\n"
+" margin:0px;\n"
+" outline:none;\n"
+"}\n"
+"\n"
+"#nav-tree .label {\n"
+" margin:0px;\n"
+" padding:0px;\n"
+"}\n"
+"\n"
+"#nav-tree .label a {\n"
+" padding:2px;\n"
+"}\n"
+"\n"
+"#nav-tree .selected a {\n"
+" text-decoration:none;\n"
+" padding:2px;\n"
+" margin:0px;\n"
+" color:#fff;\n"
+"}\n"
+"\n"
+"#nav-tree .children_ul {\n"
+" margin:0px;\n"
+" padding:0px;\n"
+"}\n"
+"\n"
+"#nav-tree .item {\n"
+" margin:0px;\n"
+" padding:0px;\n"
+"}\n"
+"\n"
+"#nav-tree {\n"
+" padding: 0px 0px;\n"
+" background-color: #FAFAFF; \n"
+" font-size:14px;\n"
+" overflow:auto;\n"
+"}\n"
+"\n"
+"#doc-content {\n"
+" overflow:auto;\n"
+" display:block;\n"
+" padding:0px;\n"
+" margin:0px;\n"
+"}\n"
+"\n"
+"#side-nav {\n"
+" padding:0 6px 0 0;\n"
+" margin: 0px;\n"
+" display:block;\n"
+" position: absolute;\n"
+" left: 0px;\n"
+" width: 300px;\n"
+"}\n"
+"\n"
+".ui-resizable .ui-resizable-handle {\n"
+" display:block;\n"
+"}\n"
+"\n"
+".ui-resizable-e {\n"
+" background:url(\"ftv2splitbar.png\") repeat scroll right center transparent;\n"
+" cursor:e-resize;\n"
+" height:100%;\n"
+" right:0;\n"
+" top:0;\n"
+" width:6px;\n"
+"}\n"
+"\n"
+".ui-resizable-handle {\n"
+" display:none;\n"
+" font-size:0.1px;\n"
+" position:absolute;\n"
+" z-index:1;\n"
+"}\n"
+"\n"
+"#nav-tree-contents {\n"
+" margin: 6px 0px 0px 0px;\n"
+"}\n"
+"\n"
+"#nav-tree {\n"
+" background-image:url('nav_h.png');\n"
+" background-repeat:repeat-x;\n"
+" background-color: ##FA;\n"
+"}\n"
+"\n"
+"\n"
+"\n"
diff --git a/src/navtree_js.h b/src/navtree_js.h
new file mode 100644
index 0000000..8e81d55
--- /dev/null
+++ b/src/navtree_js.h
@@ -0,0 +1,245 @@
+"function createIndent(o,domNode,node,level)\n"
+"{\n"
+" if (node.parentNode && node.parentNode.parentNode)\n"
+" {\n"
+" createIndent(o,domNode,node.parentNode,level+1);\n"
+" }\n"
+" var imgNode = document.createElement(\"img\");\n"
+" if (level==0 && node.childrenData)\n"
+" {\n"
+" node.plus_img = imgNode;\n"
+" node.expandToggle = document.createElement(\"a\");\n"
+" node.expandToggle.href = \"javascript:void(0)\";\n"
+" node.expandToggle.onclick = function() \n"
+" {\n"
+" if (node.expanded) \n"
+" {\n"
+" $(node.getChildrenUL()).slideUp(\"fast\");\n"
+" if (node.isLast)\n"
+" {\n"
+" node.plus_img.src = node.relpath+\"ftv2plastnode.png\";\n"
+" }\n"
+" else\n"
+" {\n"
+" node.plus_img.src = node.relpath+\"ftv2pnode.png\";\n"
+" }\n"
+" node.expanded = false;\n"
+" } \n"
+" else \n"
+" {\n"
+" expandNode(o, node, false);\n"
+" }\n"
+" }\n"
+" node.expandToggle.appendChild(imgNode);\n"
+" domNode.appendChild(node.expandToggle);\n"
+" }\n"
+" else\n"
+" {\n"
+" domNode.appendChild(imgNode);\n"
+" }\n"
+" if (level==0)\n"
+" {\n"
+" if (node.isLast)\n"
+" {\n"
+" if (node.childrenData)\n"
+" {\n"
+" imgNode.src = node.relpath+\"ftv2plastnode.png\";\n"
+" }\n"
+" else\n"
+" {\n"
+" imgNode.src = node.relpath+\"ftv2lastnode.png\";\n"
+" domNode.appendChild(imgNode);\n"
+" }\n"
+" }\n"
+" else\n"
+" {\n"
+" if (node.childrenData)\n"
+" {\n"
+" imgNode.src = node.relpath+\"ftv2pnode.png\";\n"
+" }\n"
+" else\n"
+" {\n"
+" imgNode.src = node.relpath+\"ftv2node.png\";\n"
+" domNode.appendChild(imgNode);\n"
+" }\n"
+" }\n"
+" }\n"
+" else\n"
+" {\n"
+" if (node.isLast)\n"
+" {\n"
+" imgNode.src = node.relpath+\"ftv2blank.png\";\n"
+" }\n"
+" else\n"
+" {\n"
+" imgNode.src = node.relpath+\"ftv2vertline.png\";\n"
+" }\n"
+" }\n"
+" imgNode.border = \"0\";\n"
+"}\n"
+"\n"
+"function newNode(o, po, text, link, childrenData, lastNode)\n"
+"{\n"
+" var node = new Object();\n"
+" node.children = Array();\n"
+" node.childrenData = childrenData;\n"
+" node.depth = po.depth + 1;\n"
+" node.relpath = po.relpath;\n"
+" node.isLast = lastNode;\n"
+"\n"
+" node.li = document.createElement(\"li\");\n"
+" po.getChildrenUL().appendChild(node.li);\n"
+" node.parentNode = po;\n"
+"\n"
+" node.itemDiv = document.createElement(\"div\");\n"
+" node.itemDiv.className = \"item\";\n"
+"\n"
+" node.labelSpan = document.createElement(\"span\");\n"
+" node.labelSpan.className = \"label\";\n"
+"\n"
+" createIndent(o,node.itemDiv,node,0);\n"
+" node.itemDiv.appendChild(node.labelSpan);\n"
+" node.li.appendChild(node.itemDiv);\n"
+"\n"
+" var a = document.createElement(\"a\");\n"
+" node.labelSpan.appendChild(a);\n"
+" node.label = document.createTextNode(text);\n"
+" a.appendChild(node.label);\n"
+" if (link) \n"
+" {\n"
+" a.href = node.relpath+link;\n"
+" } \n"
+" else \n"
+" {\n"
+" if (childrenData != null) \n"
+" {\n"
+" a.className = \"nolink\";\n"
+" a.href = \"javascript:void(0)\";\n"
+" a.onclick = node.expandToggle.onclick;\n"
+" node.expanded = false;\n"
+" }\n"
+" }\n"
+"\n"
+" node.childrenUL = null;\n"
+" node.getChildrenUL = function() \n"
+" {\n"
+" if (!node.childrenUL) \n"
+" {\n"
+" node.childrenUL = document.createElement(\"ul\");\n"
+" node.childrenUL.className = \"children_ul\";\n"
+" node.childrenUL.style.display = \"none\";\n"
+" node.li.appendChild(node.childrenUL);\n"
+" }\n"
+" return node.childrenUL;\n"
+" };\n"
+"\n"
+" return node;\n"
+"}\n"
+"\n"
+"function showRoot()\n"
+"{\n"
+" var headerHeight = $(\"#top\").height();\n"
+" var footerHeight = $(\"#nav-path\").height();\n"
+" var windowHeight = $(window).height() - headerHeight - footerHeight;\n"
+" navtree.scrollTo('#selected',0,{offset:-windowHeight/2});\n"
+"}\n"
+"\n"
+"function expandNode(o, node, imm)\n"
+"{\n"
+" if (node.childrenData && !node.expanded) \n"
+" {\n"
+" if (!node.childrenVisited) \n"
+" {\n"
+" getNode(o, node);\n"
+" }\n"
+" if (imm)\n"
+" {\n"
+" $(node.getChildrenUL()).show();\n"
+" } \n"
+" else \n"
+" {\n"
+" $(node.getChildrenUL()).slideDown(\"fast\",showRoot);\n"
+" }\n"
+" if (node.isLast)\n"
+" {\n"
+" node.plus_img.src = node.relpath+\"ftv2mlastnode.png\";\n"
+" }\n"
+" else\n"
+" {\n"
+" node.plus_img.src = node.relpath+\"ftv2mnode.png\";\n"
+" }\n"
+" node.expanded = true;\n"
+" }\n"
+"}\n"
+"\n"
+"function getNode(o, po)\n"
+"{\n"
+" po.childrenVisited = true;\n"
+" var l = po.childrenData.length-1;\n"
+" for (var i in po.childrenData) \n"
+" {\n"
+" var nodeData = po.childrenData[i];\n"
+" po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],\n"
+" i==l);\n"
+" }\n"
+"}\n"
+"\n"
+"function findNavTreePage(url, data)\n"
+"{\n"
+" var nodes = data;\n"
+" var result = null;\n"
+" for (var i in nodes) \n"
+" {\n"
+" var d = nodes[i];\n"
+" if (d[1] == url) \n"
+" {\n"
+" return new Array(i);\n"
+" }\n"
+" else if (d[2] != null) // array of children\n"
+" {\n"
+" result = findNavTreePage(url, d[2]);\n"
+" if (result != null) \n"
+" {\n"
+" return (new Array(i).concat(result));\n"
+" }\n"
+" }\n"
+" }\n"
+" return null;\n"
+"}\n"
+"\n"
+"function initNavTree(toroot,relpath)\n"
+"{\n"
+" var o = new Object();\n"
+" o.toroot = toroot;\n"
+" o.node = new Object();\n"
+" o.node.li = document.getElementById(\"nav-tree-contents\");\n"
+" o.node.childrenData = NAVTREE;\n"
+" o.node.children = new Array();\n"
+" o.node.childrenUL = document.createElement(\"ul\");\n"
+" o.node.getChildrenUL = function() { return o.node.childrenUL; };\n"
+" o.node.li.appendChild(o.node.childrenUL);\n"
+" o.node.depth = 0;\n"
+" o.node.relpath = relpath;\n"
+"\n"
+" getNode(o, o.node);\n"
+"\n"
+" o.breadcrumbs = findNavTreePage(toroot, NAVTREE);\n"
+" if (o.breadcrumbs == null)\n"
+" {\n"
+" o.breadcrumbs = findNavTreePage(\"index.html\",NAVTREE);\n"
+" }\n"
+" if (o.breadcrumbs != null && o.breadcrumbs.length>0)\n"
+" {\n"
+" var p = o.node;\n"
+" for (var i in o.breadcrumbs) \n"
+" {\n"
+" var j = o.breadcrumbs[i];\n"
+" p = p.children[j];\n"
+" expandNode(o,p,true);\n"
+" }\n"
+" p.itemDiv.className = p.itemDiv.className + \" selected\";\n"
+" p.itemDiv.id = \"selected\";\n"
+" $(window).load(showRoot);\n"
+" }\n"
+"}\n"
+"\n"
diff --git a/src/objcache.cpp b/src/objcache.cpp
new file mode 100644
index 0000000..d0821e1
--- /dev/null
+++ b/src/objcache.cpp
@@ -0,0 +1,332 @@
+/******************************************************************************
+ *
+ * $Id: classlist.cpp,v 1.14 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <qglobal.h>
+#include "objcache.h"
+
+//----------------------------------------------------------------------
+
+#ifdef CACHE_STATS
+int ObjCache::misses = 0;
+int ObjCache::hits = 0;
+#endif
+
+//----------------------------------------------------------------------
+
+ObjCache::ObjCache(unsigned int logSize)
+ : m_head(-1), m_tail(-1), //m_numEntries(0),
+ m_size(1<<logSize), m_freeHashNodes(0), m_freeCacheNodes(0), m_lastHandle(-1)
+{
+ int i;
+ m_cache = new CacheNode[m_size];
+ m_hash = new HashNode[m_size];
+ // add all items to list of free buckets
+ for (i=0;i<m_size-1;i++)
+ {
+ m_hash[i].nextHash = i+1;
+ m_cache[i].next = i+1;
+ }
+}
+
+ObjCache::~ObjCache()
+{
+ delete[] m_cache;
+ delete[] m_hash;
+}
+
+int ObjCache::add(void *obj,void **victim)
+{
+ *victim=0;
+
+ HashNode *hnode = hashFind(obj);
+ //printf("hnode=%p\n",hnode);
+ if (hnode) // move object to the front of the LRU list, since it is used
+ // most recently
+ {
+ //printf("moveToFront=%d\n",hnode->index);
+ moveToFront(hnode->index);
+#ifdef CACHE_STATS
+ hits++;
+#endif
+ }
+ else // object not in the cache.
+ {
+ void *lruObj=0;
+ if (m_freeCacheNodes!=-1) // cache not full -> add element to the cache
+ {
+ // remove element from free list
+ int index = m_freeCacheNodes;
+ m_freeCacheNodes = m_cache[index].next;
+
+ // add to head of the list
+ if (m_tail==-1)
+ {
+ m_tail = index;
+ }
+ m_cache[index].prev = -1;
+ m_cache[index].next = m_head;
+ if (m_head!=-1)
+ {
+ m_cache[m_head].prev = index;
+ }
+ m_head = index;
+ }
+ else // cache full -> replace element in the cache
+ {
+ //printf("Cache full!\n");
+ lruObj = m_cache[m_tail].obj;
+ hashRemove(lruObj);
+ moveToFront(m_tail); // m_tail indexes the emptied element, which becomes m_head
+ }
+ //printf("numEntries=%d size=%d\n",m_numEntries,m_size);
+ m_cache[m_head].obj = obj;
+ hnode = hashInsert(obj);
+ hnode->index = m_head;
+ *victim = lruObj;
+#ifdef CACHE_STATS
+ misses++;
+#endif
+ }
+ return m_head;
+}
+
+void ObjCache::del(int index)
+{
+ assert(index!=-1);
+ assert(m_cache[index].obj!=0);
+ hashRemove(m_cache[index].obj);
+ moveToFront(index);
+ m_head = m_cache[index].next;
+ if (m_head==-1)
+ m_tail=-1;
+ else
+ m_cache[m_head].prev=-1;
+ m_cache[index].obj=0;
+ m_cache[index].prev=-1;
+ m_cache[index].next = m_freeCacheNodes;
+ m_freeCacheNodes = index;
+}
+
+#ifdef CACHE_DEBUG
+#define cache_debug_printf printf
+void ObjCache::printLRU()
+{
+ cache_debug_printf("MRU->LRU: ");
+ int index = m_head;
+ while (index!=-1)
+ {
+ cache_debug_printf("%d=%p ",index,m_cache[index].obj);
+ index = m_cache[index].next;
+ }
+ cache_debug_printf("\n");
+
+ cache_debug_printf("LRU->MRU: ");
+ index = m_tail;
+ while (index!=-1)
+ {
+ cache_debug_printf("%d=%p ",index,m_cache[index].obj);
+ index = m_cache[index].prev;
+ }
+ cache_debug_printf("\n");
+}
+#endif
+
+#ifdef CACHE_STATS
+#define cache_stats_printf printf
+void ObjCache::printStats()
+{
+ cache_stats_printf("ObjCache: hits=%d misses=%d hit ratio=%f\n",hits,misses,hits*100.0/(hits+misses));
+}
+#endif
+
+void ObjCache::moveToFront(int index)
+{
+ int prev,next;
+ if (m_head!=index)
+ {
+ next = m_cache[index].next;
+ prev = m_cache[index].prev;
+
+ // de-chain node at index
+ m_cache[prev].next = next;
+ if (next!=-1) m_cache[next].prev = prev; else m_tail = prev;
+
+ // add to head
+ m_cache[index].prev = -1;
+ m_cache[index].next = m_head;
+ m_cache[m_head].prev = index;
+ m_head = index;
+ }
+}
+
+unsigned int ObjCache::hash(void *addr)
+{
+ static bool isPtr64 = sizeof(addr)==8;
+ if (isPtr64)
+ {
+ uint64 key = (uint64)addr;
+ // Thomas Wang's 64 bit Mix Function
+ key += ~(key << 32);
+ key ^= (key >> 22);
+ key += ~(key << 13);
+ key ^= (key >> 8);
+ key += (key << 3);
+ key ^= (key >> 15);
+ key += ~(key << 27);
+ key ^= (key >> 31);
+ return key & (m_size-1);
+ }
+ else
+ {
+ // Thomas Wang's 32 bit Mix Function
+ unsigned long key = (unsigned long)addr;
+ key += ~(key << 15);
+ key ^= (key >> 10);
+ key += (key << 3);
+ key ^= (key >> 6);
+ key += ~(key << 11);
+ key ^= (key >> 16);
+ return key & (m_size-1);
+ }
+}
+
+ObjCache::HashNode *ObjCache::hashFind(void *obj)
+{
+ HashNode *node = 0;
+ int index = m_hash[hash(obj)].head;
+ //printf("hashFind: obj=%p index=%d\n",obj,index);
+ while (index!=-1 &&
+ m_hash[index].obj!=obj
+ ) // search for right object in the list
+ {
+ index = m_hash[index].nextHash;
+ }
+ // found the obj at index, so it is in the cache!
+ if (index!=-1)
+ {
+ node = &m_hash[index];
+ }
+ return node;
+}
+
+ObjCache::HashNode *ObjCache::hashInsert(void *obj)
+{
+ int index = hash(obj);
+ //printf("Inserting %p index=%d\n",obj,index);
+
+ // remove element from empty list
+ int newElement = m_freeHashNodes;
+ assert(newElement!=-1);
+ m_freeHashNodes = m_hash[m_freeHashNodes].nextHash;
+
+ if (m_hash[index].head!=-1) // hash collision -> goto end of the list
+ {
+ index = m_hash[index].head;
+ while (m_hash[index].nextHash!=-1)
+ {
+ index = m_hash[index].nextHash;
+ }
+ // add to end of the list
+ m_hash[index].nextHash = newElement;
+ }
+ else // first element in the hash list
+ {
+ m_hash[index].head = newElement;
+ }
+ // add to the end of the list
+ m_hash[newElement].nextHash = -1;
+ m_hash[newElement].obj = obj;
+ return &m_hash[newElement];
+}
+
+void ObjCache::hashRemove(void *obj)
+{
+ int index = hash(obj);
+
+ // find element
+ int curIndex = m_hash[index].head;
+ int prevIndex=-1;
+ while (m_hash[curIndex].obj!=obj)
+ {
+ prevIndex = curIndex;
+ curIndex = m_hash[curIndex].nextHash;
+ }
+
+ if (prevIndex==-1) // remove from start
+ {
+ m_hash[index].head = m_hash[curIndex].nextHash;
+ }
+ else // remove in the middle
+ {
+ m_hash[prevIndex].nextHash = m_hash[curIndex].nextHash;
+ }
+
+ // add curIndex element to empty list
+ m_hash[curIndex].nextHash = m_freeHashNodes;
+ m_hash[curIndex].index = -1;
+ m_hash[curIndex].obj = 0;
+ m_freeHashNodes = curIndex;
+}
+
+#ifdef CACHE_TEST
+int main()
+{
+ int i;
+ struct obj
+ {
+ obj() : handle(-1) {}
+ int handle;
+ };
+ obj *objs = new obj[100];
+ ObjCache c(3);
+ for (i=0;i<32;i++)
+ {
+ int objId=(i%3)+(i>>2)*4;
+ printf("------- use(%d=%p)--------\n",objId,&objs[objId]);
+#ifdef CACHE_DEBUG
+ c.printLRU();
+#endif
+ obj *victim=0;
+ if (objs[objId].handle==-1)
+ {
+ objs[objId].handle = c.add(&objs[objId],(void**)&victim);
+ if (victim) victim->handle=-1;
+ }
+ else
+ {
+ c.use(objs[objId].handle);
+ }
+ printf("i=%d objId=%d using %p victim=%p\n",i,objId,&objs[objId],victim);
+ }
+ for (i=0;i<100;i++)
+ {
+ if (objs[i].handle!=-1)
+ {
+ printf("------ del objId=%d handle=%d ------\n",i,objs[i].handle);
+ c.del(objs[i].handle);
+ objs[i].handle=-1;
+#ifdef CACHE_DEBUG
+ c.printLRU();
+#endif
+ }
+ }
+ c.printStats();
+ return 0;
+}
+#endif
diff --git a/src/objcache.h b/src/objcache.h
new file mode 100644
index 0000000..603b449
--- /dev/null
+++ b/src/objcache.h
@@ -0,0 +1,113 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef OBJCACHE_H
+#define OBJCACHE_H
+
+//#define CACHE_TEST
+//#define CACHE_DEBUG
+#define CACHE_STATS
+
+/** @brief Cache for objects.
+ *
+ * This cache is used to decide which objects should remain in
+ * memory. It uses a least recently used policy (LRU) to decide
+ * which object should make room for a new object when the cache
+ * is full. An object should be added using add(), and then use()
+ * should be called when the object is used.
+ */
+class ObjCache
+{
+ private:
+ struct CacheNode
+ {
+ CacheNode() : next(-1), prev(-1), obj(0) {}
+ int next;
+ int prev;
+ void *obj;
+ };
+ struct HashNode
+ {
+ HashNode() : head(-1), nextHash(-1), index(-1), obj(0) {}
+ int head;
+ int nextHash;
+ int index;
+ void *obj;
+ };
+
+ public:
+ /*! Creates the cache. The number of elements in the cache is 2 to
+ * the power of \a logSize.
+ */
+ ObjCache(unsigned int logSize);
+
+ /*! Deletes the cache and free all internal data-structures used. */
+ ~ObjCache();
+
+ /*! Adds \a obj to the cache. When victim is not null, this object is
+ * removed from the cache to make room for \a obj.
+ * Returns a handle to the object, which can be used by the use()
+ * function, each time the object is used.
+ */
+ int add(void *obj,void **victim);
+
+ /*! Indicates that this object is used. This will move the object
+ * to the front of the internal LRU list to make sure it is removed last.
+ * The parameter \a handle is returned when called add().
+ */
+ void use(int handle)
+ {
+ hits++;
+ if (handle==m_lastHandle) return;
+ m_lastHandle = handle;
+ moveToFront(handle);
+ }
+
+ /*! Removes the item identified by \a handle from the cache.
+ * @see add()
+ */
+ void del(int handle);
+
+ /*! Debug function. Prints the LRU list */
+ void printLRU();
+ /*! Print miss/hits statistics */
+ void printStats();
+
+ private:
+ void moveToFront(int index);
+ unsigned int hash(void *addr);
+ HashNode *hashFind(void *obj);
+ HashNode *hashInsert(void *obj);
+ void hashRemove(void *obj);
+
+ CacheNode *m_cache;
+ HashNode *m_hash;
+ int m_head;
+ int m_tail;
+ int m_size;
+ int m_freeHashNodes;
+ int m_freeCacheNodes;
+ int m_lastHandle;
+
+#ifdef CACHE_STATS
+ static int misses;
+ static int hits;
+#endif
+};
+
+#endif // OBJCACHE_H
+
diff --git a/src/outputgen.cpp b/src/outputgen.cpp
new file mode 100644
index 0000000..0905b78
--- /dev/null
+++ b/src/outputgen.cpp
@@ -0,0 +1,81 @@
+/******************************************************************************
+ *
+ * $Id: outputgen.cpp,v 1.15 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "qtbc.h"
+#include "outputgen.h"
+#include "message.h"
+#include "portable.h"
+
+OutputGenerator::OutputGenerator()
+{
+ //printf("OutputGenerator::OutputGenerator()\n");
+ file=0;
+ active=TRUE;
+ genStack = new QStack<bool>;
+ genStack->setAutoDelete(TRUE);
+}
+
+OutputGenerator::~OutputGenerator()
+{
+ //printf("OutputGenerator::~OutputGenerator()\n");
+ delete file;
+ delete genStack;
+}
+
+void OutputGenerator::startPlainFile(const char *name)
+{
+ //printf("startPlainFile(%s)\n",name);
+ fileName=dir+"/"+name;
+ file = new QFile(fileName);
+ if (!file)
+ {
+ err("Could not create file object for %s\n",fileName.data());
+ exit(1);
+ }
+ if (!file->open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",fileName.data());
+ exit(1);
+ }
+ t.setDevice(file);
+}
+
+void OutputGenerator::endPlainFile()
+{
+ delete file;
+ file=0;
+ fileName.resize(0);
+}
+
+void OutputGenerator::pushGeneratorState()
+{
+ genStack->push(new bool(isEnabled()));
+ //printf("%p:pushGeneratorState(%d)\n",this,genStack->count());
+}
+
+void OutputGenerator::popGeneratorState()
+{
+ //printf("%p:popGeneratorState(%d)\n",this,genStack->count());
+ bool *lb = genStack->pop();
+ ASSERT(lb!=0);
+ if (lb==0) return; // for some robustness against superfluous \endhtmlonly commands.
+ if (*lb) enable(); else disable();
+ delete lb;
+}
+
diff --git a/src/outputgen.h b/src/outputgen.h
new file mode 100644
index 0000000..7d69f8f
--- /dev/null
+++ b/src/outputgen.h
@@ -0,0 +1,486 @@
+/******************************************************************************
+ *
+ * $Id: outputgen.h,v 1.48 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef OUTPUTGEN_H
+#define OUTPUTGEN_H
+
+#include "qtbc.h"
+#include "ftextstream.h"
+#include <qbuffer.h>
+#include <qfile.h>
+#include <qstack.h>
+#include "index.h"
+#include "section.h"
+
+class ClassDiagram;
+class DotClassGraph;
+class DotInclDepGraph;
+class DotCallGraph;
+class DotDirDeps;
+class DotGfxHierarchyTable;
+class DotGroupCollaboration;
+class DocNode;
+class MemberDef;
+class GroupDef;
+class Definition;
+
+/*! \brief Output interface for code parser.
+ */
+class CodeOutputInterface
+{
+ public:
+ virtual ~CodeOutputInterface() {}
+ /*! Writes an ASCII string to the output. This function should keep
+ * spaces visible, should break lines at a newline and should convert
+ * tabs to the right number of spaces.
+ */
+ virtual void codify(const char *s) = 0;
+
+ /*! Writes a link to an object in a code fragment.
+ * \param ref If this is non-zero, the object is to be found in
+ * an external documentation file.
+ * \param file The file in which the object is located.
+ * \param anchor The anchor uniquely identifying the object within
+ * the file.
+ * \param name The text to display as a placeholder for the link.
+ * \param tooltip The tooltip to display when the mouse is on the link.
+ */
+ virtual void writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip) = 0;
+
+ virtual void writeLineNumber(const char *ref,const char *file,
+ const char *anchor,int lineNumber) = 0;
+ virtual void startCodeLine() = 0;
+ virtual void endCodeLine() = 0;
+ virtual void startCodeAnchor(const char *label) = 0;
+ virtual void endCodeAnchor() = 0;
+ virtual void startFontClass(const char *) = 0;
+ virtual void endFontClass() = 0;
+ virtual void writeCodeAnchor(const char *name) = 0;
+ virtual void linkableSymbol(int line,const char *symName,
+ Definition *symDef,Definition *context) = 0;
+};
+
+/*! \brief Base Interface used for generating output outside of the
+ * comment blocks.
+ *
+ * This abstract class is used by output generation functions
+ * to generate the output for a specific format,
+ * or a list of formats (see OutputList). This interface
+ * contains functions that generate fragments of the output.
+ */
+class BaseOutputDocInterface : public CodeOutputInterface
+{
+ public:
+ virtual ~BaseOutputDocInterface() {}
+ enum ParamListTypes { Param, RetVal, Exception };
+ enum SectionTypes { /*See, Return, Author, Version,
+ Since, Date, Bug, Note,
+ Warning, Par, Deprecated, Pre,
+ Post, Invar, Remark, Attention,
+ Todo, Test, RCS, */ EnumValues,
+ Examples
+ };
+
+ virtual void parseDoc(const char *,int, const char *,MemberDef *,
+ const QCString &,bool) {}
+ virtual void parseText(const QCString &) {}
+
+ /*! Start of a bullet list: e.g. \c \<ul\> in html. startItemListItem() is
+ * Used for the bullet items.
+ */
+ virtual void startItemList() = 0;
+
+ /*! Writes a list item for a bullet or enumerated
+ * list: e.g. \c \<li\> in html
+ */
+ virtual void startItemListItem() = 0;
+
+ /*! Writes a list item for a bullet or enumerated
+ * list: e.g. \c \</li\> in html
+ */
+ virtual void endItemListItem() = 0;
+
+ /*! Ends a bullet list: e.g. \c \</ul\> in html */
+ virtual void endItemList() = 0;
+
+ /*! Writes an ASCII string to the output. Converts characters that have
+ * A special meaning, like \c & in html.
+ */
+ virtual void docify(const char *s) = 0;
+
+ /*! Writes a single ASCII character to the output. Converts characters
+ * that have a special meaning.
+ */
+ virtual void writeChar(char c) = 0;
+
+ /*! Writes an ASCII string to the output, \e without converting
+ * special characters.
+ */
+ virtual void writeString(const char *text) = 0;
+
+ /*! Starts a new paragraph */
+ //virtual void newParagraph() = 0;
+
+ /*! Starts a new paragraph */
+ virtual void startParagraph() = 0;
+ /*! Ends a paragraph */
+ virtual void endParagraph() = 0;
+
+ /*! Writes a link to an object in the documentation.
+ * \param ref If this is non-zero, the object is to be found in
+ * an external documentation file.
+ * \param file The file in which the object is located.
+ * \param anchor The anchor uniquely identifying the object within
+ * the file.
+ * \param name The text to display as a placeholder for the link.
+ */
+ virtual void writeObjectLink(const char *ref,const char *file,
+ const char *anchor, const char *name) = 0;
+
+
+ /*! Starts a (link to an) URL found in the documentation.
+ * \param url The URL to link to.
+ */
+ virtual void startHtmlLink(const char *url) = 0;
+
+ /*! Ends a link started by startHtmlLink().
+ */
+ virtual void endHtmlLink() = 0;
+
+
+ /*! Changes the text font to bold face. The bold section ends with
+ * endBold()
+ */
+ virtual void startBold() = 0;
+
+ /*! End a section of text displayed in bold face. */
+ virtual void endBold() = 0;
+
+ /*! Changes the text font to fixed size. The section ends with
+ * endTypewriter()
+ */
+ virtual void startTypewriter() = 0;
+
+ /*! End a section of text displayed in typewriter style. */
+ virtual void endTypewriter() = 0;
+
+ /*! Changes the text font to italic. The italic section ends with
+ * endEmphasis()
+ */
+ virtual void startEmphasis() = 0;
+
+ /*! Ends a section of text displayed in italic. */
+ virtual void endEmphasis() = 0;
+
+ /*! Starts a source code fragment. The fragment will be
+ * fed to the code parser (see code.h) for syntax highlighting
+ * and cross-referencing. The fragment ends by a call to
+ * endCodeFragment()
+ */
+ virtual void startCodeFragment() = 0;
+
+ /*! Ends a source code fragment
+ */
+ virtual void endCodeFragment() = 0;
+
+
+
+
+ /*! Writes a horizontal ruler to the output */
+ virtual void writeRuler() = 0;
+
+ /*! Starts a description list: e.g. \c \<dl\> in HTML
+ * Items are surrounded by startDescItem() and endDescItem()
+ */
+ virtual void startDescription() = 0;
+
+ /*! Ends a description list: e.g. \c \</dl\> in HTML */
+ virtual void endDescription() = 0;
+
+ /*! Starts an item of a description list: e.g. \c \<dt\> in HTML. */
+ virtual void startDescItem() = 0;
+
+ virtual void startDescForItem() = 0;
+ virtual void endDescForItem() = 0;
+
+ /*! Ends an item of a description list and starts the
+ * description itself: e.g. \c \</dt\> in HTML.
+ */
+ virtual void endDescItem() = 0;
+
+ virtual void startCenter() = 0;
+ virtual void endCenter() = 0;
+ virtual void startSmall() = 0;
+ virtual void endSmall() = 0;
+
+ virtual void startSimpleSect(SectionTypes t,const char *file,
+ const char *anchor,const char *title) = 0;
+ virtual void endSimpleSect() = 0;
+ virtual void startParamList(ParamListTypes t,const char *title) = 0;
+ virtual void endParamList() = 0;
+
+ //virtual void writeDescItem() = 0;
+ virtual void startTitle() = 0;
+ virtual void endTitle() = 0;
+
+ virtual void writeAnchor(const char *fileName,const char *name) = 0;
+ virtual void startSection(const char *,const char *,SectionInfo::SectionType) = 0;
+ virtual void endSection(const char *,SectionInfo::SectionType) = 0;
+
+ virtual void lineBreak(const char *style) = 0;
+ virtual void addIndexItem(const char *s1,const char *s2) = 0;
+
+ virtual void writeNonBreakableSpace(int) = 0;
+ virtual void startDescTable() = 0;
+ virtual void endDescTable() = 0;
+ virtual void startDescTableTitle() = 0;
+ virtual void endDescTableTitle() = 0;
+ virtual void startDescTableData() = 0;
+ virtual void endDescTableData() = 0;
+ virtual void startTextLink(const char *file,const char *anchor) = 0;
+ virtual void endTextLink() = 0;
+ virtual void startPageRef() = 0;
+ virtual void endPageRef(const char *,const char *) = 0;
+ virtual void startSubsection() = 0;
+ virtual void endSubsection() = 0;
+ virtual void startSubsubsection() = 0;
+ virtual void endSubsubsection() = 0;
+};
+
+/*! \brief Abstract output generator.
+ *
+ * Subclass this class to add support for a new output format
+ */
+class OutputGenerator : public BaseOutputDocInterface
+{
+ public:
+ enum OutputType { Html, Latex, Man, RTF, XML, DEF, Perl };
+
+ OutputGenerator();
+ virtual ~OutputGenerator();
+
+ ///////////////////////////////////////////////////////////////
+ // generic generator methods
+ ///////////////////////////////////////////////////////////////
+ virtual void enable() = 0;
+ virtual void disable() = 0;
+ virtual void enableIf(OutputType o) = 0;
+ virtual void disableIf(OutputType o) = 0;
+ virtual void disableIfNot(OutputType o) = 0;
+ virtual bool isEnabled(OutputType o) = 0;
+ virtual OutputGenerator *get(OutputType o) = 0;
+ void startPlainFile(const char *name);
+ void endPlainFile();
+ //QCString getContents() const;
+ bool isEnabled() const { return active; }
+ void pushGeneratorState();
+ void popGeneratorState();
+ //void setEncoding(const QCString &enc) { encoding = enc; }
+ //virtual void postProcess(QByteArray &) { }
+
+ virtual void printDoc(DocNode *,const char *langExt) = 0;
+
+ ///////////////////////////////////////////////////////////////
+ // structural output interface
+ ///////////////////////////////////////////////////////////////
+ virtual void startFile(const char *name,const char *manName,
+ const char *title) = 0;
+ virtual void writeFooter() = 0;
+ virtual void endFile() = 0;
+ virtual void startIndexSection(IndexSections) = 0;
+ virtual void endIndexSection(IndexSections) = 0;
+ virtual void writePageLink(const char *,bool) = 0;
+ virtual void startProjectNumber() = 0;
+ virtual void endProjectNumber() = 0;
+ virtual void writeStyleInfo(int part) = 0;
+ virtual void startTitleHead(const char *) = 0;
+ virtual void endTitleHead(const char *fileName,const char *name) = 0;
+ virtual void startIndexListItem() = 0;
+ virtual void endIndexListItem() = 0;
+ virtual void startIndexList() = 0;
+ virtual void endIndexList() = 0;
+ virtual void startIndexKey() = 0;
+ virtual void endIndexKey() = 0;
+ virtual void startIndexValue(bool) = 0;
+ virtual void endIndexValue(const char *,bool) = 0;
+ virtual void startIndexItem(const char *ref,const char *file) = 0;
+ virtual void endIndexItem(const char *ref,const char *file) = 0;
+ virtual void startGroupHeader(int) = 0;
+ virtual void endGroupHeader(int) = 0;
+ virtual void startMemberSections() = 0;
+ virtual void endMemberSections() = 0;
+ virtual void startHeaderSection() = 0;
+ virtual void endHeaderSection() = 0;
+ virtual void startMemberHeader(const char *anchor) = 0;
+ virtual void endMemberHeader() = 0;
+ virtual void startMemberSubtitle() = 0;
+ virtual void endMemberSubtitle() = 0;
+ virtual void startMemberDocList() = 0;
+ virtual void endMemberDocList() = 0;
+ virtual void startMemberList() = 0;
+ virtual void endMemberList() = 0;
+ virtual void startInlineDescription() = 0;
+ virtual void endInlineDescription() = 0;
+ virtual void startInlineHeader() = 0;
+ virtual void endInlineHeader() = 0;
+ virtual void startAnonTypeScope(int) = 0;
+ virtual void endAnonTypeScope(int) = 0;
+ virtual void startMemberItem(int) = 0;
+ virtual void endMemberItem() = 0;
+ virtual void startMemberTemplateParams() = 0;
+ virtual void endMemberTemplateParams() = 0;
+ virtual void startMemberGroupHeader(bool) = 0;
+ virtual void endMemberGroupHeader() = 0;
+ virtual void startMemberGroupDocs() = 0;
+ virtual void endMemberGroupDocs() = 0;
+ virtual void startMemberGroup() = 0;
+ virtual void endMemberGroup(bool) = 0;
+ virtual void insertMemberAlign(bool) = 0;
+ virtual void startMemberDoc(const char *,const char *,
+ const char *,const char *,bool) = 0;
+ virtual void endMemberDoc(bool) = 0;
+ virtual void startDoxyAnchor(const char *fName,const char *manName,
+ const char *anchor,const char *name,
+ const char *args) = 0;
+ virtual void endDoxyAnchor(const char *fileName,const char *anchor) = 0;
+ virtual void writeLatexSpacing() = 0;
+ virtual void writeStartAnnoItem(const char *type,const char *file,
+ const char *path,const char *name) = 0;
+ virtual void writeEndAnnoItem(const char *name) = 0;
+ virtual void startMemberDescription() = 0;
+ virtual void endMemberDescription() = 0;
+ virtual void startIndent() = 0;
+ virtual void endIndent() = 0;
+ virtual void writeSynopsis() = 0;
+ virtual void startClassDiagram() = 0;
+ virtual void endClassDiagram(const ClassDiagram &,const char *,const char *) = 0;
+ virtual void startDotGraph() = 0;
+ virtual void endDotGraph(const DotClassGraph &g) = 0;
+ virtual void startInclDepGraph() = 0;
+ virtual void endInclDepGraph(const DotInclDepGraph &g) = 0;
+ virtual void startGroupCollaboration() = 0;
+ virtual void endGroupCollaboration(const DotGroupCollaboration &g) = 0;
+ virtual void startCallGraph() = 0;
+ virtual void endCallGraph(const DotCallGraph &g) = 0;
+ virtual void startDirDepGraph() = 0;
+ virtual void endDirDepGraph(const DotDirDeps &g) = 0;
+ virtual void writeGraphicalHierarchy(const DotGfxHierarchyTable &g) = 0;
+ virtual void startQuickIndices() = 0;
+ virtual void endQuickIndices() = 0;
+ virtual void writeSplitBar(const char *) = 0;
+ virtual void writeLogo() = 0;
+ virtual void writeQuickLinks(bool compact,HighlightedItem hli) = 0;
+ virtual void startContents() = 0;
+ virtual void endContents() = 0;
+ virtual void startTextBlock(bool) = 0;
+ virtual void endTextBlock(bool) = 0;
+ virtual void lastIndexPage() = 0;
+ virtual void startMemberDocPrefixItem() = 0;
+ virtual void endMemberDocPrefixItem() = 0;
+ virtual void startMemberDocName(bool) = 0;
+ virtual void endMemberDocName() = 0;
+ virtual void startParameterType(bool,const char *) = 0;
+ virtual void endParameterType() = 0;
+ virtual void startParameterName(bool) = 0;
+ virtual void endParameterName(bool,bool,bool) = 0;
+ virtual void startParameterList(bool) = 0;
+ virtual void endParameterList() = 0;
+
+ virtual void startConstraintList(const char *) = 0;
+ virtual void startConstraintParam() = 0;
+ virtual void endConstraintParam() = 0;
+ virtual void startConstraintType() = 0;
+ virtual void endConstraintType() = 0;
+ virtual void startConstraintDocs() = 0;
+ virtual void endConstraintDocs() = 0;
+ virtual void endConstraintList() = 0;
+
+ protected:
+ FTextStream t;
+ QFile *file;
+ QCString fileName;
+ QCString dir;
+ bool active;
+ QStack<bool> *genStack;
+
+ private:
+ OutputGenerator(const OutputGenerator &o);
+ OutputGenerator &operator=(const OutputGenerator &o);
+};
+
+/*! \brief Interface used for generating documentation.
+ *
+ * This abstract class is used by several functions
+ * to generate the output for a specific format.
+ * This interface contains some state saving and changing
+ * functions for dealing with format specific output.
+ */
+class OutputDocInterface : public BaseOutputDocInterface
+{
+ public:
+ virtual ~OutputDocInterface() {}
+
+ /*! Create a new output generator. This can later by appended
+ * to the current one using append().
+ */
+ //virtual OutputDocInterface *clone() = 0;
+
+ /*! Disables all output formats except format \a o
+ * (useful for OutputList only)
+ */
+ virtual void disableAllBut(OutputGenerator::OutputType o) = 0;
+
+ /*! Enables all output formats as far as they have been enabled in
+ * the config file. (useful for OutputList only)
+ */
+ virtual void enableAll() = 0;
+
+ /*! Disables all output formats (useful for OutputList only) */
+ virtual void disableAll()= 0;
+
+ /*! Disables a specific output format (useful for OutputList only) */
+ virtual void disable(OutputGenerator::OutputType o) = 0;
+
+ /*! Enables a specific output format (useful for OutputList only) */
+ virtual void enable(OutputGenerator::OutputType o) = 0;
+
+ /*! Check whether a specific output format is currenly enabled
+ * (useful for OutputList only)
+ */
+ virtual bool isEnabled(OutputGenerator::OutputType o) = 0;
+
+ /*! Appends the output generated by generator \a g to this
+ * generator.
+ */
+ //virtual void append(const OutputDocInterface *g) = 0;
+
+ /*! Pushes the state of the current generator (or list of
+ * generators) on a stack.
+ */
+ virtual void pushGeneratorState() = 0;
+
+ /*! Pops the state of the current generator (or list of
+ * generators) on a stack. Should be preceded by a call
+ * the pushGeneratorState().
+ */
+ virtual void popGeneratorState() = 0;
+};
+
+
+#endif
diff --git a/src/outputlist.cpp b/src/outputlist.cpp
new file mode 100644
index 0000000..57b97fa
--- /dev/null
+++ b/src/outputlist.cpp
@@ -0,0 +1,315 @@
+/******************************************************************************
+ *
+ * $Id: outputlist.cpp,v 1.35 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/*! \file
+ * This class represents a list of output generators that work in "parallel".
+ * The class only knows about the abstract base class OutputGenerators.
+ * All output is produced by calling a method of this class, which forwards
+ * the call to all output generators.
+ */
+
+#include "outputlist.h"
+#include "outputgen.h"
+#include "config.h"
+#include "message.h"
+#include "definition.h"
+
+#include "docparser.h"
+
+OutputList::OutputList(bool)
+{
+ //printf("OutputList::OutputList()\n");
+ outputs = new QList<OutputGenerator>;
+ outputs->setAutoDelete(TRUE);
+}
+
+OutputList::~OutputList()
+{
+ //printf("OutputList::~OutputList()\n");
+ delete outputs;
+}
+
+void OutputList::add(const OutputGenerator *og)
+{
+ if (og) outputs->append(og);
+}
+
+void OutputList::disableAllBut(OutputGenerator::OutputType o)
+{
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ og->disableIfNot(o);
+ og=outputs->next();
+ }
+}
+
+void OutputList::enableAll()
+{
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ og->enable();
+ og=outputs->next();
+ }
+}
+
+void OutputList::disableAll()
+{
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ og->disable();
+ og=outputs->next();
+ }
+}
+
+void OutputList::disable(OutputGenerator::OutputType o)
+{
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ og->disableIf(o);
+ og=outputs->next();
+ }
+}
+
+void OutputList::enable(OutputGenerator::OutputType o)
+{
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ og->enableIf(o);
+ og=outputs->next();
+ }
+}
+
+bool OutputList::isEnabled(OutputGenerator::OutputType o)
+{
+ bool result=FALSE;
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ result=result || og->isEnabled(o);
+ og=outputs->next();
+ }
+ return result;
+}
+
+void OutputList::pushGeneratorState()
+{
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ og->pushGeneratorState();
+ og=outputs->next();
+ }
+}
+
+void OutputList::popGeneratorState()
+{
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ og->popGeneratorState();
+ og=outputs->next();
+ }
+}
+
+void OutputList::parseDoc(const char *fileName,int startLine,
+ Definition *ctx,MemberDef * md,
+ const QCString &docStr,bool indexWords,
+ bool isExample,const char *exampleName,
+ bool singleLine,bool linkFromIndex)
+{
+ int count=0;
+ if (docStr.isEmpty()) return;
+
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ if (og->isEnabled()) count++;
+ og=outputs->next();
+ }
+ if (count==0) return; // no output formats enabled.
+
+ DocNode *root=0;
+ if (docStr.at(docStr.length()-1)=='\n')
+ {
+ root = validatingParseDoc(fileName,startLine,
+ ctx,md,docStr,indexWords,isExample,exampleName,
+ singleLine,linkFromIndex);
+ }
+ else
+ {
+ root = validatingParseDoc(fileName,startLine,
+ ctx,md,docStr+"\n",indexWords,isExample,exampleName,
+ singleLine,linkFromIndex);
+ }
+
+ og=outputs->first();
+ while (og)
+ {
+ //printf("og->printDoc(extension=%s)\n",
+ // ctx?ctx->getDefFileExtension().data():"<null>");
+ if (og->isEnabled()) og->printDoc(root,ctx?ctx->getDefFileExtension():QCString(""));
+ og=outputs->next();
+ }
+
+ delete root;
+}
+
+void OutputList::parseText(const QCString &textStr)
+{
+ int count=0;
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ if (og->isEnabled()) count++;
+ og=outputs->next();
+ }
+ if (count==0) return; // no output formats enabled.
+
+ DocNode *root = validatingParseText(textStr);
+
+ og=outputs->first();
+ while (og)
+ {
+ if (og->isEnabled()) og->printDoc(root,0);
+ og=outputs->next();
+ }
+
+ delete root;
+}
+
+
+//--------------------------------------------------------------------------
+// Create some overloaded definitions of the forall function.
+// Using template functions here would have made it a little less
+// portable (I guess).
+
+// zero arguments
+void OutputList::forall(void (OutputGenerator::*func)())
+{
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ if (og->isEnabled()) (og->*func)();
+ og=outputs->next();
+ }
+}
+
+// one argument
+#define FORALL1(a1,p1) \
+void OutputList::forall(void (OutputGenerator::*func)(a1),a1) \
+{ \
+ OutputGenerator *og=outputs->first(); \
+ while (og) \
+ { \
+ if (og->isEnabled()) (og->*func)(p1); \
+ og=outputs->next(); \
+ } \
+}
+
+// two arguments
+#define FORALL2(a1,a2,p1,p2) \
+void OutputList::forall(void (OutputGenerator::*func)(a1,a2),a1,a2) \
+{ \
+ OutputGenerator *og=outputs->first(); \
+ while (og) \
+ { \
+ if (og->isEnabled()) (og->*func)(p1,p2); \
+ og=outputs->next(); \
+ } \
+}
+
+// three arguments
+#define FORALL3(a1,a2,a3,p1,p2,p3) \
+void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3),a1,a2,a3) \
+{ \
+ OutputGenerator *og=outputs->first(); \
+ while (og) \
+ { \
+ if (og->isEnabled()) (og->*func)(p1,p2,p3); \
+ og=outputs->next(); \
+ } \
+}
+
+// four arguments
+#define FORALL4(a1,a2,a3,a4,p1,p2,p3,p4) \
+void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4) \
+{ \
+ OutputGenerator *og=outputs->first(); \
+ while (og) \
+ { \
+ if (og->isEnabled()) (og->*func)(p1,p2,p3,p4); \
+ og=outputs->next(); \
+ } \
+}
+
+// five arguments
+#define FORALL5(a1,a2,a3,a4,a5,p1,p2,p3,p4,p5) \
+void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5),a1,a2,a3,a4,a5) \
+{ \
+ OutputGenerator *og=outputs->first(); \
+ while (og) \
+ { \
+ if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5); \
+ og=outputs->next(); \
+ } \
+}
+
+// now instantiate only the ones we need.
+
+FORALL1(const char *a1,a1)
+FORALL1(char a1,a1)
+FORALL1(int a1,a1)
+FORALL1(const DotClassGraph &a1,a1)
+FORALL1(const DotInclDepGraph &a1,a1)
+FORALL1(const DotCallGraph &a1,a1)
+FORALL1(const DotDirDeps &a1,a1)
+FORALL1(const DotGfxHierarchyTable &a1,a1)
+FORALL1(const DotGroupCollaboration &a1,a1)
+FORALL1(SectionTypes a1,a1)
+#if defined(HAS_BOOL_TYPE) || defined(Q_HAS_BOOL_TYPE)
+FORALL1(bool a1,a1)
+FORALL2(bool a1,int a2,a1,a2)
+FORALL2(bool a1,bool a2,a1,a2)
+FORALL4(const char *a1,const char *a2,const char *a3,bool a4,a1,a2,a3,a4)
+#endif
+FORALL2(int a1,bool a2,a1,a2)
+FORALL2(bool a1,HighlightedItem a2,a1,a2)
+FORALL2(bool a1,const char *a2,a1,a2)
+FORALL2(ParamListTypes a1,const char *a2,a1,a2)
+FORALL1(IndexSections a1,a1)
+FORALL2(const char *a1,const char *a2,a1,a2)
+FORALL2(const char *a1,bool a2,a1,a2)
+FORALL2(const char *a1,SectionInfo::SectionType a2,a1,a2)
+FORALL3(bool a1,bool a2,bool a3,a1,a2,a3)
+FORALL3(const ClassDiagram &a1,const char *a2,const char *a3,a1,a2,a3)
+FORALL3(const char *a1,const char *a2,const char *a3,a1,a2,a3)
+FORALL3(const char *a1,const char *a2,bool a3,a1,a2,a3)
+FORALL3(const char *a1,const char *a2,SectionInfo::SectionType a3,a1,a2,a3)
+FORALL3(uchar a1,uchar a2,uchar a3,a1,a2,a3)
+FORALL4(SectionTypes a1,const char *a2,const char *a3,const char *a4,a1,a2,a3,a4)
+FORALL4(const char *a1,const char *a2,const char *a3,const char *a4,a1,a2,a3,a4)
+FORALL4(const char *a1,const char *a2,const char *a3,int a4,a1,a2,a3,a4)
+FORALL5(const char *a1,const char *a2,const char *a3,const char *a4,const char *a5,a1,a2,a3,a4,a5)
+FORALL5(const char *a1,const char *a2,const char *a3,const char *a4,bool a5,a1,a2,a3,a4,a5)
+
+
+//--------------------------------------------------------------------------
diff --git a/src/outputlist.h b/src/outputlist.h
new file mode 100644
index 0000000..c49251f
--- /dev/null
+++ b/src/outputlist.h
@@ -0,0 +1,501 @@
+/******************************************************************************
+ *
+ * $Id: outputlist.h,v 1.47 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef OUTPUTLIST_H
+#define OUTPUTLIST_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include "index.h" // for IndexSections
+#include "outputgen.h"
+
+#define FORALLPROTO1(arg1) \
+ void forall(void (OutputGenerator::*func)(arg1),arg1)
+#define FORALLPROTO2(arg1,arg2) \
+ void forall(void (OutputGenerator::*func)(arg1,arg2),arg1,arg2)
+#define FORALLPROTO3(arg1,arg2,arg3) \
+ void forall(void (OutputGenerator::*func)(arg1,arg2,arg3),arg1,arg2,arg3)
+#define FORALLPROTO4(arg1,arg2,arg3,arg4) \
+ void forall(void (OutputGenerator::*func)(arg1,arg2,arg3,arg4),arg1,arg2,arg3,arg4)
+#define FORALLPROTO5(arg1,arg2,arg3,arg4,arg5) \
+ void forall(void (OutputGenerator::*func)(arg1,arg2,arg3,arg4,arg5),arg1,arg2,arg3,arg4,arg5)
+
+class ClassDiagram;
+class DotClassGraph;
+class DotDirDeps;
+class DotInclDepGraph;
+class DotGfxHierarchyTable;
+class SectionDict;
+class DotGroupCollaboration;
+
+class OutputList : public OutputDocInterface
+{
+ public:
+ OutputList(bool);
+ virtual ~OutputList();
+
+ void add(const OutputGenerator *);
+
+ void disableAllBut(OutputGenerator::OutputType o);
+ void enableAll();
+ void disableAll();
+ void disable(OutputGenerator::OutputType o);
+ void enable(OutputGenerator::OutputType o);
+ bool isEnabled(OutputGenerator::OutputType o);
+ void pushGeneratorState();
+ void popGeneratorState();
+
+
+ //////////////////////////////////////////////////
+ // OutputDocInterface implementation
+ //////////////////////////////////////////////////
+
+ void parseDoc(const char *fileName,int startLine,
+ Definition *ctx,MemberDef *md,const QCString &docStr,
+ bool indexWords,bool isExample,const char *exampleName=0,
+ bool singleLine=FALSE,bool linkFromIndex=FALSE);
+ void parseText(const QCString &textStr);
+
+
+ void startIndexSection(IndexSections is)
+ { forall(&OutputGenerator::startIndexSection,is); }
+ void endIndexSection(IndexSections is)
+ { forall(&OutputGenerator::endIndexSection,is); }
+ void writePageLink(const char *name,bool first)
+ { forall(&OutputGenerator::writePageLink,name,first); }
+ void startProjectNumber()
+ { forall(&OutputGenerator::startProjectNumber); }
+ void endProjectNumber()
+ { forall(&OutputGenerator::endProjectNumber); }
+ void writeStyleInfo(int part)
+ { forall(&OutputGenerator::writeStyleInfo,part); }
+ void startFile(const char *name,const char *manName,const char *title)
+ { forall(&OutputGenerator::startFile,name,manName,title); }
+ void writeFooter()
+ { forall(&OutputGenerator::writeFooter); }
+ void endFile()
+ { forall(&OutputGenerator::endFile); }
+ void startTitleHead(const char *fileName)
+ { forall(&OutputGenerator::startTitleHead,fileName); }
+ void endTitleHead(const char *fileName,const char *name)
+ { forall(&OutputGenerator::endTitleHead,fileName,name); }
+ void startTitle()
+ { forall(&OutputGenerator::startTitle); }
+ void endTitle()
+ { forall(&OutputGenerator::endTitle); }
+ //void newParagraph()
+ //{ forall(&OutputGenerator::newParagraph); }
+ void startParagraph()
+ { forall(&OutputGenerator::startParagraph); }
+ void endParagraph()
+ { forall(&OutputGenerator::endParagraph); }
+ void writeString(const char *text)
+ { forall(&OutputGenerator::writeString,text); }
+ void startIndexListItem()
+ { forall(&OutputGenerator::startIndexListItem); }
+ void endIndexListItem()
+ { forall(&OutputGenerator::endIndexListItem); }
+ void startIndexList()
+ { forall(&OutputGenerator::startIndexList); }
+ void endIndexList()
+ { forall(&OutputGenerator::endIndexList); }
+ void startIndexKey()
+ { forall(&OutputGenerator::startIndexKey); }
+ void endIndexKey()
+ { forall(&OutputGenerator::endIndexKey); }
+ void startIndexValue(bool b)
+ { forall(&OutputGenerator::startIndexValue,b); }
+ void endIndexValue(const char *name,bool b)
+ { forall(&OutputGenerator::endIndexValue,name,b); }
+ void startItemList()
+ { forall(&OutputGenerator::startItemList); }
+ void endItemList()
+ { forall(&OutputGenerator::endItemList); }
+ void startIndexItem(const char *ref,const char *file)
+ { forall(&OutputGenerator::startIndexItem,ref,file); }
+ void endIndexItem(const char *ref,const char *file)
+ { forall(&OutputGenerator::endIndexItem,ref,file); }
+ void docify(const char *s)
+ { forall(&OutputGenerator::docify,s); }
+ void codify(const char *s)
+ { forall(&OutputGenerator::codify,s); }
+ void writeObjectLink(const char *ref,const char *file,
+ const char *anchor, const char *name)
+ { forall(&OutputGenerator::writeObjectLink,ref,file,anchor,name); }
+ void writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip)
+ { forall(&OutputGenerator::writeCodeLink,ref,file,anchor,name,tooltip); }
+ void startTextLink(const char *file,const char *anchor)
+ { forall(&OutputGenerator::startTextLink,file,anchor); }
+ void endTextLink()
+ { forall(&OutputGenerator::endTextLink); }
+ void startHtmlLink(const char *url)
+ { forall(&OutputGenerator::startHtmlLink,url); }
+ void endHtmlLink()
+ { forall(&OutputGenerator::endHtmlLink); }
+ void writeStartAnnoItem(const char *type,const char *file,
+ const char *path,const char *name)
+ { forall(&OutputGenerator::writeStartAnnoItem,type,file,path,name); }
+ void writeEndAnnoItem(const char *name)
+ { forall(&OutputGenerator::writeEndAnnoItem,name); }
+ void startTypewriter()
+ { forall(&OutputGenerator::startTypewriter); }
+ void endTypewriter()
+ { forall(&OutputGenerator::endTypewriter); }
+ void startGroupHeader(int extraLevels=0)
+ { forall(&OutputGenerator::startGroupHeader,extraLevels); }
+ void endGroupHeader(int extraLevels=0)
+ { forall(&OutputGenerator::endGroupHeader,extraLevels); }
+ //void writeListItem()
+ //{ forall(&OutputGenerator::writeListItem); }
+ void startItemListItem()
+ { forall(&OutputGenerator::startItemListItem); }
+ void endItemListItem()
+ { forall(&OutputGenerator::endItemListItem); }
+ void startMemberSections()
+ { forall(&OutputGenerator::startMemberSections); }
+ void endMemberSections()
+ { forall(&OutputGenerator::endMemberSections); }
+ void startHeaderSection()
+ { forall(&OutputGenerator::startHeaderSection); }
+ void endHeaderSection()
+ { forall(&OutputGenerator::endHeaderSection); }
+ void startMemberHeader(const char *anchor)
+ { forall(&OutputGenerator::startMemberHeader,anchor); }
+ void endMemberHeader()
+ { forall(&OutputGenerator::endMemberHeader); }
+ void startMemberSubtitle()
+ { forall(&OutputGenerator::startMemberSubtitle); }
+ void endMemberSubtitle()
+ { forall(&OutputGenerator::endMemberSubtitle); }
+ void startMemberDocList()
+ { forall(&OutputGenerator::startMemberDocList); }
+ void endMemberDocList()
+ { forall(&OutputGenerator::endMemberDocList); }
+ void startMemberList()
+ { forall(&OutputGenerator::startMemberList); }
+ void endMemberList()
+ { forall(&OutputGenerator::endMemberList); }
+ void startInlineDescription()
+ { forall(&OutputGenerator::startInlineDescription); }
+ void endInlineDescription()
+ { forall(&OutputGenerator::endInlineDescription); }
+ void startInlineHeader()
+ { forall(&OutputGenerator::startInlineHeader); }
+ void endInlineHeader()
+ { forall(&OutputGenerator::endInlineHeader); }
+ void startAnonTypeScope(int i1)
+ { forall(&OutputGenerator::startAnonTypeScope,i1); }
+ void endAnonTypeScope(int i1)
+ { forall(&OutputGenerator::endAnonTypeScope,i1); }
+ void startMemberItem(int i1)
+ { forall(&OutputGenerator::startMemberItem,i1); }
+ void endMemberItem()
+ { forall(&OutputGenerator::endMemberItem); }
+ void startMemberTemplateParams()
+ { forall(&OutputGenerator::startMemberTemplateParams); }
+ void endMemberTemplateParams()
+ { forall(&OutputGenerator::endMemberTemplateParams); }
+ void startMemberGroupHeader(bool b)
+ { forall(&OutputGenerator::startMemberGroupHeader,b); }
+ void endMemberGroupHeader()
+ { forall(&OutputGenerator::endMemberGroupHeader); }
+ void startMemberGroupDocs()
+ { forall(&OutputGenerator::startMemberGroupDocs); }
+ void endMemberGroupDocs()
+ { forall(&OutputGenerator::endMemberGroupDocs); }
+ void startMemberGroup()
+ { forall(&OutputGenerator::startMemberGroup); }
+ void endMemberGroup(bool last)
+ { forall(&OutputGenerator::endMemberGroup,last); }
+ void insertMemberAlign(bool templ=FALSE)
+ { forall(&OutputGenerator::insertMemberAlign,templ); }
+ void writeRuler()
+ { forall(&OutputGenerator::writeRuler); }
+ void writeAnchor(const char *fileName,const char *name)
+ { forall(&OutputGenerator::writeAnchor,fileName,name); }
+ void startCodeFragment()
+ { forall(&OutputGenerator::startCodeFragment); }
+ void endCodeFragment()
+ { forall(&OutputGenerator::endCodeFragment); }
+ void startCodeLine()
+ { forall(&OutputGenerator::startCodeLine); }
+ void endCodeLine()
+ { forall(&OutputGenerator::endCodeLine); }
+ void writeLineNumber(const char *ref,const char *file,const char *anchor,
+ int lineNumber)
+ { forall(&OutputGenerator::writeLineNumber,ref,file,anchor,lineNumber); }
+ void startEmphasis()
+ { forall(&OutputGenerator::startEmphasis); }
+ void endEmphasis()
+ { forall(&OutputGenerator::endEmphasis); }
+ void writeChar(char c)
+ { forall(&OutputGenerator::writeChar,c); }
+ void startMemberDoc(const char *clName,const char *memName,
+ const char *anchor,const char *title,bool showInline)
+ { forall(&OutputGenerator::startMemberDoc,clName,memName,anchor,title,showInline); }
+ void endMemberDoc(bool hasArgs)
+ { forall(&OutputGenerator::endMemberDoc,hasArgs); }
+ void startDoxyAnchor(const char *fName,const char *manName,
+ const char *anchor, const char *name,
+ const char *args)
+ { forall(&OutputGenerator::startDoxyAnchor,fName,manName,anchor,name,args); }
+ void endDoxyAnchor(const char *fn,const char *anchor)
+ { forall(&OutputGenerator::endDoxyAnchor,fn,anchor); }
+ void startCodeAnchor(const char *label)
+ { forall(&OutputGenerator::startCodeAnchor,label); }
+ void endCodeAnchor()
+ { forall(&OutputGenerator::endCodeAnchor); }
+ void writeLatexSpacing()
+ { forall(&OutputGenerator::writeLatexSpacing); }
+ void startDescription()
+ { forall(&OutputGenerator::startDescription); }
+ void endDescription()
+ { forall(&OutputGenerator::endDescription); }
+ void startDescItem()
+ { forall(&OutputGenerator::startDescItem); }
+ void endDescItem()
+ { forall(&OutputGenerator::endDescItem); }
+ void startDescForItem()
+ { forall(&OutputGenerator::startDescForItem); }
+ void endDescForItem()
+ { forall(&OutputGenerator::endDescForItem); }
+ void startSubsection()
+ { forall(&OutputGenerator::startSubsection); }
+ void endSubsection()
+ { forall(&OutputGenerator::endSubsection); }
+ void startSubsubsection()
+ { forall(&OutputGenerator::startSubsubsection); }
+ void endSubsubsection()
+ { forall(&OutputGenerator::endSubsubsection); }
+ void startCenter()
+ { forall(&OutputGenerator::startCenter); }
+ void endCenter()
+ { forall(&OutputGenerator::endCenter); }
+ void startSmall()
+ { forall(&OutputGenerator::startSmall); }
+ void endSmall()
+ { forall(&OutputGenerator::endSmall); }
+ void lineBreak(const char *style=0)
+ { forall(&OutputGenerator::lineBreak,style); }
+ void startBold()
+ { forall(&OutputGenerator::startBold); }
+ void endBold()
+ { forall(&OutputGenerator::endBold); }
+ void startMemberDescription()
+ { forall(&OutputGenerator::startMemberDescription); }
+ void endMemberDescription()
+ { forall(&OutputGenerator::endMemberDescription); }
+ void startSimpleSect(SectionTypes t,const char *file,const char *anchor,
+ const char *title)
+ { forall(&OutputGenerator::startSimpleSect,t,file,anchor,title); }
+ void endSimpleSect()
+ { forall(&OutputGenerator::endSimpleSect); }
+ void startParamList(ParamListTypes t,const char *title)
+ { forall(&OutputGenerator::startParamList,t,title); }
+ void endParamList()
+ { forall(&OutputGenerator::endParamList); }
+ //void writeDescItem()
+ //{ forall(&OutputGenerator::writeDescItem); }
+ void startIndent()
+ { forall(&OutputGenerator::startIndent); }
+ void endIndent()
+ { forall(&OutputGenerator::endIndent); }
+ void startSection(const char *lab,const char *title,SectionInfo::SectionType t)
+ { forall(&OutputGenerator::startSection,lab,title,t); }
+ void endSection(const char *lab,SectionInfo::SectionType t)
+ { forall(&OutputGenerator::endSection,lab,t); }
+ void addIndexItem(const char *s1,const char *s2)
+ { forall(&OutputGenerator::addIndexItem,s1,s2); }
+ void writeSynopsis()
+ { forall(&OutputGenerator::writeSynopsis); }
+ void startClassDiagram()
+ { forall(&OutputGenerator::startClassDiagram); }
+ void endClassDiagram(const ClassDiagram &d,const char *f,const char *n)
+ { forall(&OutputGenerator::endClassDiagram,d,f,n); }
+ void startPageRef()
+ { forall(&OutputGenerator::startPageRef); }
+ void endPageRef(const char *c,const char *a)
+ { forall(&OutputGenerator::endPageRef,c,a); }
+ void startQuickIndices()
+ { forall(&OutputGenerator::startQuickIndices); }
+ void endQuickIndices()
+ { forall(&OutputGenerator::endQuickIndices); }
+ void writeSplitBar(const char *name)
+ { forall(&OutputGenerator::writeSplitBar,name); }
+ void writeLogo()
+ { forall(&OutputGenerator::writeLogo); }
+ void writeQuickLinks(bool compact,HighlightedItem hli)
+ { forall(&OutputGenerator::writeQuickLinks,compact,hli); }
+ void startContents()
+ { forall(&OutputGenerator::startContents); }
+ void endContents()
+ { forall(&OutputGenerator::endContents); }
+ void writeNonBreakableSpace(int num)
+ { forall(&OutputGenerator::writeNonBreakableSpace,num); }
+ void startDescTable()
+ { forall(&OutputGenerator::startDescTable); }
+ void endDescTable()
+ { forall(&OutputGenerator::endDescTable); }
+ void startDescTableTitle()
+ { forall(&OutputGenerator::startDescTableTitle); }
+ void endDescTableTitle()
+ { forall(&OutputGenerator::endDescTableTitle); }
+ void startDescTableData()
+ { forall(&OutputGenerator::startDescTableData); }
+ void endDescTableData()
+ { forall(&OutputGenerator::endDescTableData); }
+ void startDotGraph()
+ { forall(&OutputGenerator::startDotGraph); }
+ void endDotGraph(const DotClassGraph &g)
+ { forall(&OutputGenerator::endDotGraph,g); }
+ void startInclDepGraph()
+ { forall(&OutputGenerator::startInclDepGraph); }
+ void endInclDepGraph(const DotInclDepGraph &g)
+ { forall(&OutputGenerator::endInclDepGraph,g); }
+ void startCallGraph()
+ { forall(&OutputGenerator::startCallGraph); }
+ void endCallGraph(const DotCallGraph &g)
+ { forall(&OutputGenerator::endCallGraph,g); }
+ void startDirDepGraph()
+ { forall(&OutputGenerator::startDirDepGraph); }
+ void endDirDepGraph(const DotDirDeps &g)
+ { forall(&OutputGenerator::endDirDepGraph,g); }
+ void startGroupCollaboration()
+ { forall(&OutputGenerator::startGroupCollaboration); }
+ void endGroupCollaboration(const DotGroupCollaboration &g)
+ { forall(&OutputGenerator::endGroupCollaboration,g); }
+ void writeGraphicalHierarchy(const DotGfxHierarchyTable &g)
+ { forall(&OutputGenerator::writeGraphicalHierarchy,g); }
+ void startTextBlock(bool dense=FALSE)
+ { forall(&OutputGenerator::startTextBlock,dense); }
+ void endTextBlock(bool paraBreak=FALSE)
+ { forall(&OutputGenerator::endTextBlock,paraBreak); }
+ void lastIndexPage()
+ { forall(&OutputGenerator::lastIndexPage); }
+ void startMemberDocPrefixItem()
+ { forall(&OutputGenerator::startMemberDocPrefixItem); }
+ void endMemberDocPrefixItem()
+ { forall(&OutputGenerator::endMemberDocPrefixItem); }
+ void startMemberDocName(bool align)
+ { forall(&OutputGenerator::startMemberDocName,align); }
+ void endMemberDocName()
+ { forall(&OutputGenerator::endMemberDocName); }
+ void startParameterType(bool first,const char *key)
+ { forall(&OutputGenerator::startParameterType,first,key); }
+ void endParameterType()
+ { forall(&OutputGenerator::endParameterType); }
+ void startParameterName(bool one)
+ { forall(&OutputGenerator::startParameterName,one); }
+ void endParameterName(bool last,bool one,bool bracket)
+ { forall(&OutputGenerator::endParameterName,last,one,bracket); }
+ void startParameterList(bool openBracket)
+ { forall(&OutputGenerator::startParameterList,openBracket); }
+ void endParameterList()
+ { forall(&OutputGenerator::endParameterList); }
+
+ void startConstraintList(const char *header)
+ { forall(&OutputGenerator::startConstraintList,header); }
+ void startConstraintParam()
+ { forall(&OutputGenerator::startConstraintParam); }
+ void endConstraintParam()
+ { forall(&OutputGenerator::endConstraintParam); }
+ void startConstraintType()
+ { forall(&OutputGenerator::startConstraintType); }
+ void endConstraintType()
+ { forall(&OutputGenerator::endConstraintType); }
+ void startConstraintDocs()
+ { forall(&OutputGenerator::startConstraintDocs); }
+ void endConstraintDocs()
+ { forall(&OutputGenerator::endConstraintDocs); }
+ void endConstraintList()
+ { forall(&OutputGenerator::endConstraintList); }
+ void startFontClass(const char *c)
+ { forall(&OutputGenerator::startFontClass,c); }
+ void endFontClass()
+ { forall(&OutputGenerator::endFontClass); }
+ void writeCodeAnchor(const char *name)
+ { forall(&OutputGenerator::writeCodeAnchor,name); }
+ void startPlainFile(const char *name)
+ {
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ if (og->isEnabled()) (og->startPlainFile)(name);
+ og=outputs->next();
+ }
+ }
+ void endPlainFile()
+ {
+ OutputGenerator *og=outputs->first();
+ while (og)
+ {
+ if (og->isEnabled()) (og->endPlainFile)();
+ og=outputs->next();
+ }
+ }
+ void linkableSymbol(int,const char *,Definition *,Definition *) {}
+
+
+
+ private:
+ void debug();
+ void clear();
+
+ void forall(void (OutputGenerator::*func)());
+ FORALLPROTO1(const char *);
+ FORALLPROTO1(char);
+ FORALLPROTO1(IndexSections);
+ FORALLPROTO1(int);
+ FORALLPROTO1(const DotClassGraph &);
+ FORALLPROTO1(const DotInclDepGraph &);
+ FORALLPROTO1(const DotCallGraph &);
+ FORALLPROTO1(const DotGroupCollaboration &);
+ FORALLPROTO1(const DotDirDeps &);
+ FORALLPROTO1(const DotGfxHierarchyTable &);
+ FORALLPROTO1(SectionTypes);
+#if defined(HAS_BOOL_TYPE) || defined(Q_HAS_BOOL_TYPE)
+ FORALLPROTO1(bool);
+ FORALLPROTO2(bool,int);
+ FORALLPROTO2(bool,bool);
+ FORALLPROTO4(const char *,const char *,const char *,int);
+#endif
+ FORALLPROTO2(int,bool);
+ FORALLPROTO2(bool,HighlightedItem);
+ FORALLPROTO2(bool,const char *);
+ FORALLPROTO2(ParamListTypes,const char *);
+ FORALLPROTO2(const char *,const char *);
+ FORALLPROTO2(const char *,bool);
+ FORALLPROTO2(const char *,SectionInfo::SectionType);
+ FORALLPROTO3(bool,bool,bool);
+ FORALLPROTO3(const char *,const char *,bool);
+ FORALLPROTO3(const char *,const char *,SectionInfo::SectionType);
+ FORALLPROTO3(uchar,uchar,uchar);
+ FORALLPROTO3(const char *,const char *,const char *);
+ FORALLPROTO3(const ClassDiagram &,const char *,const char *);
+ FORALLPROTO4(SectionTypes,const char *,const char *,const char *);
+ FORALLPROTO4(const char *,const char *,const char *,const char *);
+ FORALLPROTO4(const char *,const char *,const char *,bool);
+ FORALLPROTO5(const char *,const char *,const char *,const char *,const char *);
+ FORALLPROTO5(const char *,const char *,const char *,const char *,bool);
+
+ OutputList(const OutputList &ol);
+ QList<OutputGenerator> *outputs;
+};
+
+#endif
diff --git a/src/pagedef.cpp b/src/pagedef.cpp
new file mode 100644
index 0000000..dc78179
--- /dev/null
+++ b/src/pagedef.cpp
@@ -0,0 +1,264 @@
+#include "pagedef.h"
+#include "groupdef.h"
+#include "docparser.h"
+#include "config.h"
+#include "util.h"
+#include "outputlist.h"
+#include "doxygen.h"
+#include "language.h"
+#include <qregexp.h>
+
+
+PageDef::PageDef(const char *f,int l,const char *n,
+ const char *d,const char *t)
+ : Definition(f,l,n), m_title(t)
+{
+ setDocumentation(d,f,l);
+ m_subPageDict = new PageSDict(7);
+ m_pageScope = 0;
+ m_nestingLevel = 0;
+}
+
+PageDef::~PageDef()
+{
+ delete m_subPageDict;
+}
+
+void PageDef::findSectionsInDocumentation()
+{
+ docFindSections(documentation(),this,0,docFile());
+}
+
+GroupDef *PageDef::getGroupDef() const
+{
+ LockingPtr<GroupList> groups = partOfGroups();
+ return groups!=0 ? groups->getFirst() : 0;
+}
+
+QCString PageDef::getOutputFileBase() const
+{
+ if (getGroupDef())
+ return getGroupDef()->getOutputFileBase();
+ else
+ return m_fileName;
+}
+
+void PageDef::addInnerCompound(Definition *def)
+{
+ if (def->definitionType()==Definition::TypePage)
+ {
+ PageDef *pd = (PageDef*)def;
+ m_subPageDict->append(pd->name(),pd);
+ def->setOuterScope(this);
+ if (this==Doxygen::mainPage)
+ {
+ pd->setNestingLevel(m_nestingLevel);
+ }
+ else
+ {
+ pd->setNestingLevel(m_nestingLevel+1);
+ }
+ }
+}
+
+bool PageDef::hasParentPage() const
+{
+ return getOuterScope() &&
+ getOuterScope()->definitionType()==Definition::TypePage;
+}
+
+void PageDef::writeDocumentation(OutputList &ol)
+{
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+
+ //outputList->disable(OutputGenerator::Man);
+ QCString pageName;
+ pageName=escapeCharsInString(name(),FALSE,TRUE);
+
+ //printf("PageDef::writeDocumentation: %s\n",getOutputFileBase().data());
+
+ startFile(ol,getOutputFileBase(),pageName,title(),HLI_Pages,!generateTreeView);
+
+ ol.pushGeneratorState();
+ //1.{
+
+ if (m_nestingLevel>0
+ //&& // a sub page
+ //(Doxygen::mainPage==0 || getOuterScope()!=Doxygen::mainPage) // and not a subpage of the mainpage
+ )
+ {
+ // do not generate sub page output for RTF and LaTeX, as these are
+ // part of their parent page
+ ol.disableAll();
+ ol.enable(OutputGenerator::Man);
+ ol.enable(OutputGenerator::Html);
+ }
+
+ if (!generateTreeView)
+ {
+ if (getOuterScope()!=Doxygen::globalScope && !Config_getBool("DISABLE_INDEX"))
+ {
+ getOuterScope()->writeNavigationPath(ol);
+ }
+ ol.endQuickIndices();
+ }
+ SectionInfo *si=Doxygen::sectionDict.find(name());
+
+ // save old generator state and write title only to Man generator
+ ol.pushGeneratorState();
+ //2.{
+ ol.disableAllBut(OutputGenerator::Man);
+ ol.startTitleHead(pageName);
+ ol.endTitleHead(pageName, pageName);
+ if (si)
+ {
+ ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
+ ol.endSection(si->label,si->type);
+ }
+ ol.popGeneratorState();
+ //2.}
+
+ // for Latex the section is already generated as a chapter in the index!
+ ol.pushGeneratorState();
+ //2.{
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Man);
+ if (!title().isEmpty() && !name().isEmpty() && si!=0)
+ {
+ //ol.startSection(si->label,si->title,si->type);
+ startTitle(ol,getOutputFileBase(),this);
+ ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
+ //stringToSearchIndex(getOutputFileBase(),
+ // theTranslator->trPage(TRUE,TRUE)+" "+si->title,
+ // si->title);
+ //ol.endSection(si->label,si->type);
+ endTitle(ol,getOutputFileBase(),name());
+ }
+ ol.startContents();
+ ol.popGeneratorState();
+ //2.}
+
+ writePageDocumentation(ol);
+
+ ol.popGeneratorState();
+ //1.}
+
+ if (generateTreeView && getOuterScope()!=Doxygen::globalScope && !Config_getBool("DISABLE_INDEX"))
+ {
+ ol.endContents();
+ getOuterScope()->writeNavigationPath(ol);
+ endFile(ol,TRUE);
+ }
+ else
+ {
+ endFile(ol);
+ }
+
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ bool found=FALSE;
+ QDictIterator<RefList> rli(*Doxygen::xrefLists);
+ RefList *rl;
+ for (rli.toFirst();(rl=rli.current());++rli)
+ {
+ if (rl->listName()==name())
+ {
+ found=TRUE;
+ break;
+ }
+ }
+ if (!found) // not one of the generated related pages
+ {
+ Doxygen::tagFile << " <compound kind=\"page\">" << endl;
+ Doxygen::tagFile << " <name>" << name() << "</name>" << endl;
+ Doxygen::tagFile << " <title>" << convertToXML(title()) << "</title>" << endl;
+ Doxygen::tagFile << " <filename>" << getOutputFileBase() << "</filename>" << endl;
+ writeDocAnchorsToTagFile();
+ Doxygen::tagFile << " </compound>" << endl;
+ }
+ }
+
+ Doxygen::indexList.addIndexItem(this,0,filterTitle(title()));
+}
+
+void PageDef::writePageDocumentation(OutputList &ol)
+{
+ ol.startTextBlock();
+ ol.parseDoc(
+ docFile(), // fileName
+ docLine(), // startLine
+ this, // context
+ 0, // memberdef
+ documentation()+inbodyDocumentation(), // docStr
+ TRUE, // index words
+ FALSE // not an example
+ );
+ ol.endTextBlock();
+
+ if (hasSubPages())
+ {
+ // for printed documentation we write subpages as section's of the
+ // parent page.
+ ol.pushGeneratorState();
+ ol.disableAll();
+ ol.enable(OutputGenerator::Latex);
+ ol.enable(OutputGenerator::RTF);
+
+ PageSDict::Iterator pdi(*m_subPageDict);
+ PageDef *subPage=pdi.toFirst();
+ for (pdi.toFirst();(subPage=pdi.current());++pdi)
+ {
+ SectionInfo::SectionType sectionType = SectionInfo::Paragraph;
+ switch (m_nestingLevel)
+ {
+ case 0: sectionType = SectionInfo::Page; break;
+ case 1: sectionType = SectionInfo::Section; break;
+ case 2: sectionType = SectionInfo::Subsection; break;
+ case 3: sectionType = SectionInfo::Subsubsection; break;
+ default: sectionType = SectionInfo::Paragraph; break;
+ }
+ QCString title = subPage->title();
+ if (title.isEmpty()) title = subPage->name();
+ ol.startSection(subPage->name(),title,sectionType);
+ ol.parseText(title);
+ ol.endSection(subPage->name(),sectionType);
+ Doxygen::subpageNestingLevel++;
+ subPage->writePageDocumentation(ol);
+ Doxygen::subpageNestingLevel--;
+ }
+
+ ol.popGeneratorState();
+ }
+}
+
+bool PageDef::visibleInIndex() const
+{
+ return // not part of a group
+ !getGroupDef() &&
+ // not an externally defined page
+ (!isReference() || Config_getBool("ALLEXTERNALS")) &&
+ // not a subpage
+ (getOuterScope()==0 ||
+ getOuterScope()->definitionType()!=Definition::TypePage
+ );
+}
+
+bool PageDef::documentedPage() const
+{
+ return // not part of a group
+ !getGroupDef() &&
+ // not an externally defined page
+ !isReference();
+}
+
+bool PageDef::hasSubPages() const
+{
+ return m_subPageDict->count()>0;
+}
+
+void PageDef::setNestingLevel(int l)
+{
+ m_nestingLevel = l;
+}
+
diff --git a/src/pagedef.h b/src/pagedef.h
new file mode 100644
index 0000000..9395532
--- /dev/null
+++ b/src/pagedef.h
@@ -0,0 +1,76 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "definition.h"
+#include "sortdict.h"
+
+class PageSDict;
+class OutputList;
+
+class PageDef : public Definition
+{
+ public:
+ PageDef(const char *f,int l,const char *n,const char *d,const char *t);
+ ~PageDef();
+ DefType definitionType() const { return TypePage; }
+ bool isLinkableInProject() const
+ {
+ return /*hasDocumentation() &&*/ !isReference();
+ }
+ bool isLinkable() const
+ {
+ return isLinkableInProject() || isReference();
+ }
+ void writeDocumentation(OutputList &ol);
+
+ // functions to get a uniform interface with Definitions
+ QCString getOutputFileBase() const;
+ void findSectionsInDocumentation();
+ QCString title() const { return m_title; }
+ GroupDef * getGroupDef() const;
+ PageSDict * getSubPages() const { return m_subPageDict; }
+ void setFileName(const char *name) { m_fileName = name; }
+ void addInnerCompound(Definition *d);
+ bool visibleInIndex() const;
+ bool documentedPage() const;
+ bool hasSubPages() const;
+ bool hasParentPage() const;
+ void setPageScope(Definition *d){ m_pageScope = d; }
+ Definition *getPageScope() const { return m_pageScope; }
+
+ private:
+ void setNestingLevel(int l);
+ void writePageDocumentation(OutputList &ol);
+ QCString m_fileName;
+ QCString m_title;
+ GroupDef *m_inGroup;
+ PageSDict *m_subPageDict; // list of pages in the group
+ Definition *m_pageScope;
+ int m_nestingLevel;
+};
+
+class PageSDict : public SDict<PageDef>
+{
+ public:
+ PageSDict(int size) : SDict<PageDef>(size) {}
+ virtual ~PageSDict() {}
+ int compareItems(GCI i1,GCI i2)
+ {
+ return stricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name());
+ }
+};
+
diff --git a/src/parserintf.h b/src/parserintf.h
new file mode 100644
index 0000000..07999c5
--- /dev/null
+++ b/src/parserintf.h
@@ -0,0 +1,171 @@
+/******************************************************************************
+ *
+ * $Id: parserintf.h,v 1.15 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef PARSERINTF_H
+#define PARSERINTF_H
+
+#include <qdict.h>
+
+class Entry;
+class FileDef;
+class CodeOutputInterface;
+class MemberDef;
+
+/** \brief Abstract interface for programming language parsers.
+ *
+ * By implementing the methods of this interface one can add
+ * a new language parser to doxygen. The parser can make use of the
+ * comment block parser to parse the contents of special comment blocks.
+ */
+class ParserInterface
+{
+ public:
+ virtual ~ParserInterface() {}
+ /** Parses a single input file with the goal to build an Entry tree.
+ * @param[in] fileName The full name of the file.
+ * @param[in] fileBuf The contents of the file (zero terminated).
+ * @param[in,out] root The root of the tree of Entry *nodes
+ * representing the information extracted from the file.
+ */
+ virtual void parseInput(const char *fileName,
+ const char *fileBuf,
+ Entry *root) = 0;
+
+ /** Returns TRUE if the language identified by \a extension needs
+ * the C preprocessor to be run before feed the result to the input
+ * parser.
+ * @see parseInput()
+ */
+ virtual bool needsPreprocessing(const QCString &extension) = 0;
+
+ /** Parses a source file or fragment with the goal to produce
+ * highlighted and cross-referenced output.
+ * @param[in] codeOutIntf Abstract interface for writing the result.
+ * @param[in] scopeName Name of scope to which the code belongs.
+ * @param[in] input Actual code in the form of a string
+ * @param[in] isExampleBlock TRUE iff the code is part of an example.
+ * @param[in] exampleName Name of the example.
+ * @param[in] fileDef File definition to which the code
+ * is associated.
+ * @param[in] startLine Starting line in case of a code fragment.
+ * @param[in] endLine Ending line of the code fragment.
+ * @param[in] inlineFragment Code fragment that is to be shown inline
+ * as part of the documentation.
+ * @param[in] memberDef Member definition to which the code
+ * is associated (non null in case of an inline fragment
+ * for a member).
+ * @param[in] showLineNumbers if set to TRUE and also fileDef is not 0,
+ * line numbers will be added to the source fragement
+ */
+ virtual void parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName=0,
+ FileDef *fileDef=0,
+ int startLine=-1,
+ int endLine=-1,
+ bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,
+ bool showLineNumbers=TRUE
+ ) = 0;
+
+ /** Resets the state of the code parser.
+ * Since multiple code fragments can together form a single example, an
+ * explicit function is used to reset the code parser state.
+ * @see parseCode()
+ */
+ virtual void resetCodeParserState() = 0;
+
+ /** Callback function called by the comment block scanner.
+ * It provides a string \a text containing the prototype of a function
+ * or variable. The parser should parse this and store the information
+ * in the Entry node that corresponds with the node for which the
+ * comment block parser was invoked.
+ */
+ virtual void parsePrototype(const char *text) = 0;
+
+};
+
+//-----------------------------------------------------------------------------
+
+/** \brief Manages programming language parsers.
+ *
+ * This class manages the language parsers in the system. One can
+ * register parsers, and obtain a parser given a file extension.
+ */
+class ParserManager
+{
+ public:
+ /** Creates the parser manager object.
+ */
+ ParserManager()
+ : m_defaultParser(0) { m_parsers.setAutoDelete(TRUE); }
+
+ /** Registers an additional parser.
+ * @param[in] name A symbolic name of the parser, i.e. "c",
+ * "python", "fortran", "vhdl", ...
+ * @param[in] parser The parser that is to be used for the
+ * given extension.
+ * @param[in] defParser Use this parser as the default parser, using
+ * for unregistered file extensions.
+ */
+ void registerParser(const char *name,ParserInterface *parser,bool defParser=FALSE)
+ {
+ if (defParser && m_defaultParser==0) m_defaultParser=parser;
+ m_parsers.insert(name,parser);
+ }
+
+ /** Registers a file \a extension with a parser with name \a parserName.
+ * Returns TRUE if the extension was successfully registered.
+ */
+ bool registerExtension(const char *extension, const char *parserName)
+ {
+ if (parserName==0 || extension==0) return FALSE;
+ ParserInterface *intf = m_parsers.find(parserName);
+ if (intf==0) return FALSE;
+ if (m_extensions.find(extension)!=0) // extension already exists
+ {
+ m_extensions.remove(extension); // remove it
+ }
+ m_extensions.insert(extension,intf); // add new mapping
+ return TRUE;
+ }
+
+ /** Gets the interface to the parser associated with given \a extension.
+ * If there is no parser explicitly registered for the supplied extension,
+ * the interface to the default parser will be returned.
+ */
+ ParserInterface *getParser(const char *extension)
+ {
+ if (extension==0) return m_defaultParser;
+ QCString ext = QCString(extension).lower();
+ ParserInterface *intf = m_extensions.find(ext);
+ if (intf==0 && ext.length()>4)
+ {
+ intf = m_extensions.find(ext.left(4));
+ }
+ return intf ? intf : m_defaultParser;
+ }
+
+ private:
+ QDict<ParserInterface> m_parsers;
+ QDict<ParserInterface> m_extensions;
+ ParserInterface *m_defaultParser;
+};
+
+#endif
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
new file mode 100644
index 0000000..3265d67
--- /dev/null
+++ b/src/perlmodgen.cpp
@@ -0,0 +1,2899 @@
+/******************************************************************************
+ *
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ * Authors: Dimitri van Heesch, Miguel Lobo.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "perlmodgen.h"
+#include "docparser.h"
+#include "message.h"
+#include "doxygen.h"
+#include "pagedef.h"
+
+#include <qdir.h>
+#include <qstack.h>
+#include <qdict.h>
+#include <qfile.h>
+#include "ftextstream.h"
+
+#define PERLOUTPUT_MAX_INDENTATION 40
+
+class PerlModOutputStream
+{
+public:
+
+ QCString m_s;
+ FTextStream *m_t;
+
+ PerlModOutputStream(FTextStream *t = 0) : m_t(t) { }
+
+ void add(char c);
+ void add(const char *s);
+ void add(QCString &s);
+ void add(int n);
+ void add(unsigned int n);
+};
+
+void PerlModOutputStream::add(char c)
+{
+ if (m_t != 0)
+ (*m_t) << c;
+ else
+ m_s += c;
+}
+
+void PerlModOutputStream::add(const char *s)
+{
+ if (m_t != 0)
+ (*m_t) << s;
+ else
+ m_s += s;
+}
+
+void PerlModOutputStream::add(QCString &s)
+{
+ if (m_t != 0)
+ (*m_t) << s;
+ else
+ m_s += s;
+}
+
+void PerlModOutputStream::add(int n)
+{
+ if (m_t != 0)
+ (*m_t) << n;
+ else
+ m_s += n;
+}
+
+void PerlModOutputStream::add(unsigned int n)
+{
+ if (m_t != 0)
+ (*m_t) << n;
+ else
+ m_s += n;
+}
+
+class PerlModOutput
+{
+public:
+
+ bool m_pretty;
+
+ inline PerlModOutput(bool pretty)
+ : m_pretty(pretty), m_stream(0), m_indentation(false), m_blockstart(true)
+ {
+ m_spaces[0] = 0;
+ }
+
+ virtual ~PerlModOutput() { }
+
+ inline void setPerlModOutputStream(PerlModOutputStream *os) { m_stream = os; }
+
+ inline PerlModOutput &openSave() { iopenSave(); return *this; }
+ inline PerlModOutput &closeSave(QCString &s) { icloseSave(s); return *this; }
+
+ inline PerlModOutput &continueBlock()
+ {
+ if (m_blockstart)
+ m_blockstart = false;
+ else
+ m_stream->add(',');
+ indent();
+ return *this;
+ }
+
+ inline PerlModOutput &add(char c) { m_stream->add(c); return *this; }
+ inline PerlModOutput &add(const char *s) { m_stream->add(s); return *this; }
+ inline PerlModOutput &add(QCString &s) { m_stream->add(s); return *this; }
+ inline PerlModOutput &add(int n) { m_stream->add(n); return *this; }
+ inline PerlModOutput &add(unsigned int n) { m_stream->add(n); return *this; }
+
+ PerlModOutput &addQuoted(const char *s) { iaddQuoted(s); return *this; }
+
+ inline PerlModOutput &indent()
+ {
+ if (m_pretty) {
+ m_stream->add('\n');
+ m_stream->add(m_spaces);
+ }
+ return *this;
+ }
+
+ inline PerlModOutput &open(char c, const char *s = 0) { iopen(c, s); return *this; }
+ inline PerlModOutput &close(char c = 0) { iclose(c); return *this; }
+
+ inline PerlModOutput &addField(const char *s) { iaddField(s); return *this; }
+ inline PerlModOutput &addFieldQuotedChar(const char *field, char content)
+ {
+ iaddFieldQuotedChar(field, content); return *this;
+ }
+ inline PerlModOutput &addFieldQuotedString(const char *field, const char *content)
+ {
+ iaddFieldQuotedString(field, content); return *this;
+ }
+ inline PerlModOutput &addFieldBoolean(const char *field, bool content)
+ {
+ return addFieldQuotedString(field, content ? "yes" : "no");
+ }
+ inline PerlModOutput &openList(const char *s = 0) { open('[', s); return *this; }
+ inline PerlModOutput &closeList() { close(']'); return *this; }
+ inline PerlModOutput &openHash(const char *s = 0 ) { open('{', s); return *this; }
+ inline PerlModOutput &closeHash() { close('}'); return *this; }
+
+protected:
+
+ void iopenSave();
+ void icloseSave(QCString &);
+
+ void incIndent();
+ void decIndent();
+
+ void iaddQuoted(const char *);
+ void iaddFieldQuotedChar(const char *, char);
+ void iaddFieldQuotedString(const char *, const char *);
+ void iaddField(const char *);
+
+ void iopen(char, const char *);
+ void iclose(char);
+
+private:
+
+ PerlModOutputStream *m_stream;
+ int m_indentation;
+ bool m_blockstart;
+
+ QStack<PerlModOutputStream> m_saved;
+ char m_spaces[PERLOUTPUT_MAX_INDENTATION * 2 + 2];
+};
+
+void PerlModOutput::iopenSave()
+{
+ m_saved.push(m_stream);
+ m_stream = new PerlModOutputStream();
+}
+
+void PerlModOutput::icloseSave(QCString &s)
+{
+ s = m_stream->m_s;
+ delete m_stream;
+ m_stream = m_saved.pop();
+}
+
+void PerlModOutput::incIndent()
+{
+ if (m_indentation < PERLOUTPUT_MAX_INDENTATION)
+ {
+ char *s = &m_spaces[m_indentation * 2];
+ *s++ = ' '; *s++ = ' '; *s = 0;
+ }
+ m_indentation++;
+}
+
+void PerlModOutput::decIndent()
+{
+ m_indentation--;
+ if (m_indentation < PERLOUTPUT_MAX_INDENTATION)
+ m_spaces[m_indentation * 2] = 0;
+}
+
+void PerlModOutput::iaddQuoted(const char *s)
+{
+ char c;
+ while ((c = *s++) != 0) {
+ if ((c == '\'') || (c == '\\'))
+ m_stream->add('\\');
+ m_stream->add(c);
+ }
+}
+
+void PerlModOutput::iaddField(const char *s)
+{
+ continueBlock();
+ m_stream->add(s);
+ m_stream->add(m_pretty ? " => " : "=>");
+}
+
+void PerlModOutput::iaddFieldQuotedChar(const char *field, char content)
+{
+ iaddField(field);
+ m_stream->add('\'');
+ if ((content == '\'') || (content == '\\'))
+ m_stream->add('\\');
+ m_stream->add(content);
+ m_stream->add('\'');
+}
+
+void PerlModOutput::iaddFieldQuotedString(const char *field, const char *content)
+{
+ if (content == 0)
+ return;
+ iaddField(field);
+ m_stream->add('\'');
+ iaddQuoted(content);
+ m_stream->add('\'');
+}
+
+void PerlModOutput::iopen(char c, const char *s)
+{
+ if (s != 0)
+ iaddField(s);
+ else
+ continueBlock();
+ m_stream->add(c);
+ incIndent();
+ m_blockstart = true;
+}
+
+void PerlModOutput::iclose(char c)
+{
+ decIndent();
+ indent();
+ if (c != 0)
+ m_stream->add(c);
+ m_blockstart = false;
+}
+
+/*! @brief Concrete visitor implementation for PerlMod output. */
+class PerlModDocVisitor : public DocVisitor
+{
+public:
+ PerlModDocVisitor(PerlModOutput &);
+ virtual ~PerlModDocVisitor() { }
+
+ void finish();
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
+ void visit(DocIndexEntry *);
+ void visit(DocSimpleSectSep *);
+
+ //--------------------------------------
+ // visitor functions for compound nodes
+ //--------------------------------------
+
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *) ;
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *);
+ void visitPost(DocHtmlList *) ;
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ //void visitPre(DocHtmlPre *);
+ //void visitPost(DocHtmlPre *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *);
+ void visitPost(DocHtmlTable *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *);
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+ void visitPre(DocMscFile *);
+ void visitPost(DocMscFile *);
+ void visitPre(DocLink *);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ //void visitPre(DocLanguage *);
+ //void visitPost(DocLanguage *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
+ void visitPre(DocText *);
+ void visitPost(DocText *);
+
+private:
+
+ //--------------------------------------
+ // helper functions
+ //--------------------------------------
+
+ void addLink(const QCString &ref, const QCString &file,
+ const QCString &anchor);
+
+ void enterText();
+ void leaveText();
+
+ void openItem(const char *);
+ void closeItem();
+ void singleItem(const char *);
+ void openSubBlock(const char * = 0);
+ void closeSubBlock();
+ void openOther();
+ void closeOther();
+
+ //--------------------------------------
+ // state variables
+ //--------------------------------------
+
+ PerlModOutput &m_output;
+ bool m_textmode;
+ bool m_textblockstart;
+ QCString m_other;
+};
+
+PerlModDocVisitor::PerlModDocVisitor(PerlModOutput &output)
+ : DocVisitor(DocVisitor_Other), m_output(output), m_textmode(false)
+{
+ m_output.openList("doc");
+}
+
+void PerlModDocVisitor::finish()
+{
+ leaveText();
+ m_output.closeList()
+ .add(m_other);
+}
+
+void PerlModDocVisitor::addLink(const QCString &,const QCString &file,const QCString &anchor)
+{
+ QCString link = file;
+ if (!anchor.isEmpty())
+ (link += "_1") += anchor;
+ m_output.addFieldQuotedString("link", link);
+}
+
+void PerlModDocVisitor::openItem(const char *name)
+{
+ leaveText();
+ m_output.openHash().addFieldQuotedString("type", name);
+}
+
+void PerlModDocVisitor::closeItem()
+{
+ leaveText();
+ m_output.closeHash();
+}
+
+void PerlModDocVisitor::enterText()
+{
+ if (m_textmode)
+ return;
+ openItem("text");
+ m_output.addField("content").add('\'');
+ m_textmode = true;
+}
+
+void PerlModDocVisitor::leaveText()
+{
+ if (!m_textmode)
+ return;
+ m_textmode = false;
+ m_output
+ .add('\'')
+ .closeHash();
+}
+
+void PerlModDocVisitor::singleItem(const char *name)
+{
+ openItem(name);
+ closeItem();
+}
+
+void PerlModDocVisitor::openSubBlock(const char *s)
+{
+ leaveText();
+ m_output.openList(s);
+ m_textblockstart = true;
+}
+
+void PerlModDocVisitor::closeSubBlock()
+{
+ leaveText();
+ m_output.closeList();
+}
+
+void PerlModDocVisitor::openOther()
+{
+ // Using a secondary text stream will corrupt the perl file. Instead of
+ // printing doc => [ data => [] ], it will print doc => [] data => [].
+ /*
+ leaveText();
+ m_output.openSave();
+ */
+}
+
+void PerlModDocVisitor::closeOther()
+{
+ // Using a secondary text stream will corrupt the perl file. Instead of
+ // printing doc => [ data => [] ], it will print doc => [] data => [].
+ /*
+ QCString other;
+ leaveText();
+ m_output.closeSave(other);
+ m_other += other;
+ */
+}
+
+void PerlModDocVisitor::visit(DocWord *w)
+{
+ enterText();
+ m_output.addQuoted(w->word());
+}
+
+void PerlModDocVisitor::visit(DocLinkedWord *w)
+{
+ openItem("url");
+ addLink(w->ref(), w->file(), w->anchor());
+ m_output.addFieldQuotedString("content", w->word());
+ closeItem();
+}
+
+void PerlModDocVisitor::visit(DocWhiteSpace *)
+{
+ enterText();
+ m_output.add(' ');
+}
+
+void PerlModDocVisitor::visit(DocSymbol *sy)
+{
+ char c = 0;
+ const char *s = 0;
+ const char *accent = 0;
+ const char *symbol = 0;
+ switch(sy->symbol())
+ {
+ case DocSymbol::At: c = '@'; break;
+ case DocSymbol::Less: c = '<'; break;
+ case DocSymbol::Greater: c = '>'; break;
+ case DocSymbol::Amp: c = '&'; break;
+ case DocSymbol::Dollar: c = '$'; break;
+ case DocSymbol::Hash: c = '#'; break;
+ case DocSymbol::DoubleColon: s = "::"; break;
+ case DocSymbol::Percent: c = '%'; break;
+ case DocSymbol::Quot: c = '"'; break;
+ case DocSymbol::Lsquo: s = "\\\'"; break;
+ case DocSymbol::Rsquo: s = "\\\'"; break;
+ case DocSymbol::Ldquo: c = '"'; break;
+ case DocSymbol::Rdquo: c = '"'; break;
+ case DocSymbol::Ndash: c = '-'; break;
+ case DocSymbol::Mdash: s = "--"; break;
+ case DocSymbol::Nbsp: c = ' '; break;
+ case DocSymbol::Uml: accent = "umlaut"; break;
+ case DocSymbol::Acute: accent = "acute"; break;
+ case DocSymbol::Grave: accent = "grave"; break;
+ case DocSymbol::Circ: accent = "circ"; break;
+ case DocSymbol::Slash: accent = "slash"; break;
+ case DocSymbol::Tilde: accent = "tilde"; break;
+ case DocSymbol::Cedil: accent = "cedilla"; break;
+ case DocSymbol::Ring: accent = "ring"; break;
+ case DocSymbol::BSlash: s = "\\\\"; break;
+ case DocSymbol::Copy: symbol = "copyright"; break;
+ case DocSymbol::Tm: symbol = "trademark"; break;
+ case DocSymbol::Reg: symbol = "registered"; break;
+ case DocSymbol::Szlig: symbol = "szlig"; break;
+ case DocSymbol::Apos: s = "\\\'"; break;
+ case DocSymbol::Aelig: symbol = "aelig"; break;
+ case DocSymbol::AElig: symbol = "AElig"; break;
+ case DocSymbol::Unknown: err("error: unknown symbol found\n");
+ break;
+ }
+ if (c != 0)
+ {
+ enterText();
+ m_output.add(c);
+ }
+ else if (s != 0)
+ {
+ enterText();
+ m_output.add(s);
+ }
+ else if (symbol != 0)
+ {
+ leaveText();
+ openItem("symbol");
+ m_output.addFieldQuotedString("symbol", symbol);
+ closeItem();
+ }
+ else if (accent != 0)
+ {
+ leaveText();
+ openItem("accent");
+ m_output
+ .addFieldQuotedString("accent", accent)
+ .addFieldQuotedChar("letter", sy->letter());
+ closeItem();
+ }
+}
+
+void PerlModDocVisitor::visit(DocURL *u)
+{
+ openItem("url");
+ m_output.addFieldQuotedString("content", u->url());
+ closeItem();
+}
+
+void PerlModDocVisitor::visit(DocLineBreak *) { singleItem("linebreak"); }
+void PerlModDocVisitor::visit(DocHorRuler *) { singleItem("hruler"); }
+
+void PerlModDocVisitor::visit(DocStyleChange *s)
+{
+ const char *style = 0;
+ switch (s->style())
+ {
+ case DocStyleChange::Bold: style = "bold"; break;
+ case DocStyleChange::Italic: style = "italic"; break;
+ case DocStyleChange::Code: style = "code"; break;
+ case DocStyleChange::Subscript: style = "subscript"; break;
+ case DocStyleChange::Superscript: style = "superscript"; break;
+ case DocStyleChange::Center: style = "center"; break;
+ case DocStyleChange::Small: style = "small"; break;
+ case DocStyleChange::Preformatted: style = "preformatted"; break;
+ case DocStyleChange::Div: style = "div"; break;
+ case DocStyleChange::Span: style = "span"; break;
+
+ }
+ openItem("style");
+ m_output.addFieldQuotedString("style", style)
+ .addFieldBoolean("enable", s->enable());
+ closeItem();
+}
+
+void PerlModDocVisitor::visit(DocVerbatim *s)
+{
+ const char *type = 0;
+ switch(s->type())
+ {
+ case DocVerbatim::Code:
+#if 0
+ m_output.add("<programlisting>");
+ parseCode(m_ci,s->context(),s->text(),FALSE,0);
+ m_output.add("</programlisting>");
+#endif
+ return;
+ case DocVerbatim::Verbatim: type = "preformatted"; break;
+ case DocVerbatim::HtmlOnly: type = "htmlonly"; break;
+ case DocVerbatim::ManOnly: type = "manonly"; break;
+ case DocVerbatim::LatexOnly: type = "latexonly"; break;
+ case DocVerbatim::XmlOnly: type = "xmlonly"; break;
+ case DocVerbatim::Dot: type = "dot"; break;
+ case DocVerbatim::Msc: type = "msc"; break;
+ }
+ openItem(type);
+ m_output.addFieldQuotedString("content", s->text());
+ closeItem();
+}
+
+void PerlModDocVisitor::visit(DocAnchor *anc)
+{
+ QCString anchor = anc->file() + "_1" + anc->anchor();
+ openItem("anchor");
+ m_output.addFieldQuotedString("id", anchor);
+ closeItem();
+}
+
+void PerlModDocVisitor::visit(DocInclude *inc)
+{
+ const char *type = 0;
+ switch(inc->type())
+ {
+ case DocInclude::IncWithLines:
+ #if 0
+ {
+ m_t << "<div class=\"fragment\"><pre>";
+ QFileInfo cfi( inc->file() );
+ FileDef fd( cfi.dirPath(), cfi.fileName() );
+ parseCode(m_ci,inc->context(),inc->text().latin1(),inc->isExample(),inc->exampleFile(), &fd);
+ m_t << "</pre></div>";
+ }
+ break;
+ #endif
+ return;
+ case DocInclude::Include:
+#if 0
+ m_output.add("<programlisting>");
+ parseCode(m_ci,inc->context(),inc->text(),FALSE,0);
+ m_output.add("</programlisting>");
+#endif
+ return;
+ case DocInclude::DontInclude: return;
+ case DocInclude::HtmlInclude: type = "htmlonly"; break;
+ case DocInclude::VerbInclude: type = "preformatted"; break;
+ }
+ openItem(type);
+ m_output.addFieldQuotedString("content", inc->text());
+ closeItem();
+}
+
+void PerlModDocVisitor::visit(DocIncOperator *)
+{
+#if 0
+ //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
+ // op->type(),op->isFirst(),op->isLast(),op->text().data());
+ if (op->isFirst())
+ {
+ m_output.add("<programlisting>");
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ parseCode(m_ci,op->context(),op->text(),FALSE,0);
+ }
+ if (op->isLast())
+ {
+ m_output.add("</programlisting>");
+ }
+ else
+ {
+ m_output.add('\n');
+ }
+#endif
+}
+
+void PerlModDocVisitor::visit(DocFormula *f)
+{
+ openItem("formula");
+ QCString id;
+ id += f->id();
+ m_output.addFieldQuotedString("id", id).addFieldQuotedString("content", f->text());
+ closeItem();
+}
+
+void PerlModDocVisitor::visit(DocIndexEntry *)
+{
+#if 0
+ m_output.add("<indexentry>"
+ "<primaryie>");
+ m_output.addQuoted(ie->entry());
+ m_output.add("</primaryie>"
+ "<secondaryie></secondaryie>"
+ "</indexentry>");
+#endif
+}
+
+void PerlModDocVisitor::visit(DocSimpleSectSep *)
+{
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void PerlModDocVisitor::visitPre(DocAutoList *l)
+{
+ openItem("list");
+ m_output.addFieldQuotedString("style", l->isEnumList() ? "ordered" : "itemized");
+ openSubBlock("content");
+}
+
+void PerlModDocVisitor::visitPost(DocAutoList *)
+{
+ closeSubBlock();
+ closeItem();
+}
+
+void PerlModDocVisitor::visitPre(DocAutoListItem *)
+{
+ openSubBlock();
+}
+
+void PerlModDocVisitor::visitPost(DocAutoListItem *)
+{
+ closeSubBlock();
+}
+
+void PerlModDocVisitor::visitPre(DocPara *)
+{
+ if (m_textblockstart)
+ m_textblockstart = false;
+ else
+ singleItem("parbreak");
+ /*
+ openItem("para");
+ openSubBlock("content");
+ */
+}
+
+void PerlModDocVisitor::visitPost(DocPara *)
+{
+ /*
+ closeSubBlock();
+ closeItem();
+ */
+}
+
+void PerlModDocVisitor::visitPre(DocRoot *)
+{
+}
+
+void PerlModDocVisitor::visitPost(DocRoot *)
+{
+}
+
+void PerlModDocVisitor::visitPre(DocSimpleSect *s)
+{
+ const char *type = 0;
+ switch (s->type())
+ {
+ case DocSimpleSect::See: type = "see"; break;
+ case DocSimpleSect::Return: type = "return"; break;
+ case DocSimpleSect::Author: type = "author"; break;
+ case DocSimpleSect::Authors: type = "authors"; break;
+ case DocSimpleSect::Version: type = "version"; break;
+ case DocSimpleSect::Since: type = "since"; break;
+ case DocSimpleSect::Date: type = "date"; break;
+ case DocSimpleSect::Note: type = "note"; break;
+ case DocSimpleSect::Warning: type = "warning"; break;
+ case DocSimpleSect::Pre: type = "pre"; break;
+ case DocSimpleSect::Post: type = "post"; break;
+ case DocSimpleSect::Invar: type = "invariant"; break;
+ case DocSimpleSect::Remark: type = "remark"; break;
+ case DocSimpleSect::Attention: type = "attention"; break;
+ case DocSimpleSect::User: type = "par"; break;
+ case DocSimpleSect::Rcs: type = "rcs"; break;
+ case DocSimpleSect::Unknown:
+ err("error: unknown simple section found\n");
+ break;
+ }
+ leaveText();
+ m_output.openHash();
+ openOther();
+ openSubBlock(type);
+}
+
+void PerlModDocVisitor::visitPost(DocSimpleSect *)
+{
+ closeSubBlock();
+ closeOther();
+ m_output.closeHash();
+}
+
+void PerlModDocVisitor::visitPre(DocTitle *)
+{
+ openItem("title");
+ openSubBlock("content");
+}
+
+void PerlModDocVisitor::visitPost(DocTitle *)
+{
+ closeSubBlock();
+ closeItem();
+}
+
+void PerlModDocVisitor::visitPre(DocSimpleList *)
+{
+ openItem("list");
+ m_output.addFieldQuotedString("style", "itemized");
+ openSubBlock("content");
+}
+
+void PerlModDocVisitor::visitPost(DocSimpleList *)
+{
+ closeSubBlock();
+ closeItem();
+}
+
+void PerlModDocVisitor::visitPre(DocSimpleListItem *) { openSubBlock(); }
+void PerlModDocVisitor::visitPost(DocSimpleListItem *) { closeSubBlock(); }
+
+void PerlModDocVisitor::visitPre(DocSection *s)
+{
+ QCString sect = QCString().sprintf("sect%d",s->level());
+ openItem(sect);
+ openSubBlock("content");
+}
+
+void PerlModDocVisitor::visitPost(DocSection *)
+{
+ closeSubBlock();
+ closeItem();
+}
+
+void PerlModDocVisitor::visitPre(DocHtmlList *l)
+{
+ openItem("list");
+ m_output.addFieldQuotedString("style", (l->type() == DocHtmlList::Ordered) ? "ordered" : "itemized");
+ openSubBlock("content");
+}
+
+void PerlModDocVisitor::visitPost(DocHtmlList *)
+{
+ closeSubBlock();
+ closeItem();
+}
+
+void PerlModDocVisitor::visitPre(DocHtmlListItem *) { openSubBlock(); }
+void PerlModDocVisitor::visitPost(DocHtmlListItem *) { closeSubBlock(); }
+
+//void PerlModDocVisitor::visitPre(DocHtmlPre *)
+//{
+// openItem("preformatted");
+// openSubBlock("content");
+// //m_insidePre=TRUE;
+//}
+
+//void PerlModDocVisitor::visitPost(DocHtmlPre *)
+//{
+// //m_insidePre=FALSE;
+// closeSubBlock();
+// closeItem();
+//}
+
+void PerlModDocVisitor::visitPre(DocHtmlDescList *)
+{
+#if 0
+ m_output.add("<variablelist>\n");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocHtmlDescList *)
+{
+#if 0
+ m_output.add("</variablelist>\n");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+#if 0
+ m_output.add("<varlistentry><term>");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+#if 0
+ m_output.add("</term></varlistentry>\n");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocHtmlDescData *)
+{
+#if 0
+ m_output.add("<listitem>");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocHtmlDescData *)
+{
+#if 0
+ m_output.add("</listitem>\n");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocHtmlTable *)
+{
+#if 0
+ m_output.add("<table rows=\""); m_output.add(t->numRows());
+ m_output.add("\" cols=\""); m_output.add(t->numCols()); m_output.add("\">");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocHtmlTable *)
+{
+#if 0
+ m_output.add("</table>\n");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocHtmlRow *)
+{
+#if 0
+ m_output.add("<row>\n");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocHtmlRow *)
+{
+#if 0
+ m_output.add("</row>\n");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocHtmlCell *)
+{
+#if 0
+ if (c->isHeading()) m_output.add("<entry thead=\"yes\">"); else m_output.add("<entry thead=\"no\">");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocHtmlCell *)
+{
+#if 0
+ m_output.add("</entry>");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocHtmlCaption *)
+{
+#if 0
+ m_output.add("<caption>");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocHtmlCaption *)
+{
+#if 0
+ m_output.add("</caption>\n");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocInternal *)
+{
+#if 0
+ m_output.add("<internal>");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocInternal *)
+{
+#if 0
+ m_output.add("</internal>");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocHRef *)
+{
+#if 0
+ m_output.add("<ulink url=\""); m_output.add(href->url()); m_output.add("\">");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocHRef *)
+{
+#if 0
+ m_output.add("</ulink>");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocHtmlHeader *)
+{
+#if 0
+ m_output.add("<sect"); m_output.add(header->level()); m_output.add(">");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocHtmlHeader *)
+{
+#if 0
+ m_output.add("</sect"); m_output.add(header->level()); m_output.add(">\n");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocImage *)
+{
+#if 0
+ m_output.add("<image type=\"");
+ switch(img->type())
+ {
+ case DocImage::Html: m_output.add("html"); break;
+ case DocImage::Latex: m_output.add("latex"); break;
+ case DocImage::Rtf: m_output.add("rtf"); break;
+ }
+ m_output.add("\"");
+
+ QCString baseName=img->name();
+ int i;
+ if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ m_output.add(" name=\""); m_output.add(baseName); m_output.add("\"");
+ if (!img->width().isEmpty())
+ {
+ m_output.add(" width=\"");
+ m_output.addQuoted(img->width());
+ m_output.add("\"");
+ }
+ else if (!img->height().isEmpty())
+ {
+ m_output.add(" height=\"");
+ m_output.addQuoted(img->height());
+ m_output.add("\"");
+ }
+ m_output.add(">");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocImage *)
+{
+#if 0
+ m_output.add("</image>");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocDotFile *)
+{
+#if 0
+ m_output.add("<dotfile name=\""); m_output.add(df->file()); m_output.add("\">");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocDotFile *)
+{
+#if 0
+ m_output.add("</dotfile>");
+#endif
+}
+void PerlModDocVisitor::visitPre(DocMscFile *)
+{
+#if 0
+ m_output.add("<mscfile name=\""); m_output.add(df->file()); m_output.add("\">");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocMscFile *)
+{
+#if 0
+ m_output.add("<mscfile>");
+#endif
+}
+
+
+void PerlModDocVisitor::visitPre(DocLink *lnk)
+{
+ openItem("link");
+ addLink(lnk->ref(), lnk->file(), lnk->anchor());
+}
+
+void PerlModDocVisitor::visitPost(DocLink *)
+{
+ closeItem();
+}
+
+void PerlModDocVisitor::visitPre(DocRef *ref)
+{
+ openItem("ref");
+ if (!ref->hasLinkText())
+ m_output.addFieldQuotedString("text", ref->targetTitle());
+ openSubBlock("content");
+}
+
+void PerlModDocVisitor::visitPost(DocRef *)
+{
+ closeSubBlock();
+ closeItem();
+}
+
+void PerlModDocVisitor::visitPre(DocSecRefItem *)
+{
+#if 0
+ m_output.add("<tocitem id=\""); m_output.add(ref->file()); m_output.add("_1"); m_output.add(ref->anchor()); m_output.add("\">");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocSecRefItem *)
+{
+#if 0
+ m_output.add("</tocitem>");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocSecRefList *)
+{
+#if 0
+ m_output.add("<toclist>");
+#endif
+}
+
+void PerlModDocVisitor::visitPost(DocSecRefList *)
+{
+#if 0
+ m_output.add("</toclist>");
+#endif
+}
+
+//void PerlModDocVisitor::visitPre(DocLanguage *l)
+//{
+// openItem("language");
+// m_output.addFieldQuotedString("id", l->id());
+//}
+//
+//void PerlModDocVisitor::visitPost(DocLanguage *)
+//{
+// closeItem();
+//}
+
+void PerlModDocVisitor::visitPre(DocParamSect *s)
+{
+ leaveText();
+ const char *type = 0;
+ switch(s->type())
+ {
+ case DocParamSect::Param: type = "params"; break;
+ case DocParamSect::RetVal: type = "retvals"; break;
+ case DocParamSect::Exception: type = "exceptions"; break;
+ case DocParamSect::TemplateParam: type = "templateparam"; break;
+ case DocParamSect::Unknown:
+ err("error: unknown parameter section found\n");
+ break;
+ }
+ openOther();
+ openSubBlock(type);
+}
+
+void PerlModDocVisitor::visitPost(DocParamSect *)
+{
+ closeSubBlock();
+ closeOther();
+}
+
+void PerlModDocVisitor::visitPre(DocParamList *pl)
+{
+ leaveText();
+ m_output.openHash()
+ .openList("parameters");
+ //QStrListIterator li(pl->parameters());
+ //const char *s;
+ QListIterator<DocNode> li(pl->parameters());
+ DocNode *param;
+ for (li.toFirst();(param=li.current());++li)
+ {
+ QCString s;
+ if (param->kind()==DocNode::Kind_Word)
+ {
+ s = ((DocWord*)param)->word();
+ }
+ else if (param->kind()==DocNode::Kind_LinkedWord)
+ {
+ s = ((DocLinkedWord*)param)->word();
+ }
+ m_output.openHash()
+ .addFieldQuotedString("name", s)
+ .closeHash();
+ }
+ m_output.closeList()
+ .openList("doc");
+}
+
+void PerlModDocVisitor::visitPost(DocParamList *)
+{
+ leaveText();
+ m_output.closeList()
+ .closeHash();
+}
+
+void PerlModDocVisitor::visitPre(DocXRefItem *)
+{
+#if 0
+ m_output.add("<xrefsect id=\"");
+ m_output.add(x->file()); m_output.add("_1"); m_output.add(x->anchor());
+ m_output.add("\">");
+ m_output.add("<xreftitle>");
+ m_output.addQuoted(x->title());
+ m_output.add("</xreftitle>");
+ m_output.add("<xrefdescription>");
+#endif
+ openItem("xrefitem");
+ openSubBlock("content");
+}
+
+void PerlModDocVisitor::visitPost(DocXRefItem *)
+{
+ closeSubBlock();
+ closeItem();
+#if 0
+ m_output.add("</xrefdescription>");
+ m_output.add("</xrefsect>");
+#endif
+}
+
+void PerlModDocVisitor::visitPre(DocInternalRef *ref)
+{
+ openItem("ref");
+ addLink(0,ref->file(),ref->anchor());
+ openSubBlock("content");
+}
+
+void PerlModDocVisitor::visitPost(DocInternalRef *)
+{
+ closeSubBlock();
+ closeItem();
+}
+
+void PerlModDocVisitor::visitPre(DocCopy *)
+{
+}
+
+void PerlModDocVisitor::visitPost(DocCopy *)
+{
+}
+
+void PerlModDocVisitor::visitPre(DocText *)
+{
+}
+
+void PerlModDocVisitor::visitPost(DocText *)
+{
+}
+
+static void addTemplateArgumentList(ArgumentList *al,PerlModOutput &output,const char *)
+{
+ QCString indentStr;
+ if (!al)
+ return;
+ output.openList("template_parameters");
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ output.openHash();
+ if (!a->type.isEmpty())
+ output.addFieldQuotedString("type", a->type);
+ if (!a->name.isEmpty())
+ output.addFieldQuotedString("declaration_name", a->name)
+ .addFieldQuotedString("definition_name", a->name);
+ if (!a->defval.isEmpty())
+ output.addFieldQuotedString("default", a->defval);
+ output.closeHash();
+ }
+ output.closeList();
+}
+
+#if 0
+static void addMemberTemplateLists(MemberDef *md,PerlModOutput &output)
+{
+ ClassDef *cd = md->getClassDef();
+ const char *cname = cd ? cd->name().data() : 0;
+ if (md->templateArguments()) // function template prefix
+ addTemplateArgumentList(md->templateArguments(),output,cname);
+}
+#endif
+
+static void addTemplateList(ClassDef *cd,PerlModOutput &output)
+{
+ addTemplateArgumentList(cd->templateArguments(),output,cd->name());
+}
+
+static void addPerlModDocBlock(PerlModOutput &output,
+ const char *name,
+ const QCString &fileName,
+ int lineNr,
+ Definition *scope,
+ MemberDef *md,
+ const QCString &text)
+{
+ QCString stext = text.stripWhiteSpace();
+ if (stext.isEmpty())
+ output.addField(name).add("{}");
+ else {
+ DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,stext,FALSE,0);
+ output.openHash(name);
+ PerlModDocVisitor *visitor = new PerlModDocVisitor(output);
+ root->accept(visitor);
+ visitor->finish();
+ output.closeHash();
+ delete visitor;
+ delete root;
+ }
+}
+
+static const char *getProtectionName(Protection prot)
+{
+ switch (prot)
+ {
+ case Public: return "public";
+ case Protected: return "protected";
+ case Private: return "private";
+ case Package: return "package";
+ }
+ return 0;
+}
+
+static const char *getVirtualnessName(Specifier virt)
+{
+ switch(virt)
+ {
+ case Normal: return "non_virtual";
+ case Virtual: return "virtual";
+ case Pure: return "pure_virtual";
+ }
+ return 0;
+}
+
+static QCString pathDoxyfile;
+static QCString pathDoxyExec;
+
+void setPerlModDoxyfile(const QCString &qs)
+{
+ pathDoxyfile = qs;
+ pathDoxyExec = QDir::currentDirPath();
+}
+
+class PerlModGenerator
+{
+public:
+
+ PerlModOutput m_output;
+
+ QCString pathDoxyStructurePM;
+ QCString pathDoxyDocsTex;
+ QCString pathDoxyFormatTex;
+ QCString pathDoxyLatexTex;
+ QCString pathDoxyLatexDVI;
+ QCString pathDoxyLatexPDF;
+ QCString pathDoxyStructureTex;
+ QCString pathDoxyDocsPM;
+ QCString pathDoxyLatexPL;
+ QCString pathDoxyLatexStructurePL;
+ QCString pathDoxyRules;
+ QCString pathMakefile;
+
+ inline PerlModGenerator(bool pretty) : m_output(pretty) { }
+
+ void generatePerlModForMember(MemberDef *md, Definition *);
+ void generatePerlModSection(Definition *d, MemberList *ml,
+ const char *name, const char *header=0);
+ void addListOfAllMembers(ClassDef *cd);
+ void generatePerlModForClass(ClassDef *cd);
+ void generatePerlModForNamespace(NamespaceDef *nd);
+ void generatePerlModForFile(FileDef *fd);
+ void generatePerlModForGroup(GroupDef *gd);
+ void generatePerlModForPage(PageDef *pi);
+
+ bool createOutputFile(QFile &f, const char *s);
+ bool createOutputDir(QDir &perlModDir);
+ bool generateDoxyLatexTex();
+ bool generateDoxyFormatTex();
+ bool generateDoxyStructurePM();
+ bool generateDoxyLatexPL();
+ bool generateDoxyLatexStructurePL();
+ bool generateDoxyRules();
+ bool generateMakefile();
+ bool generatePerlModOutput();
+
+ void generate();
+};
+
+void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
+{
+ // + declaration/definition arg lists
+ // + reimplements
+ // + reimplementedBy
+ // + exceptions
+ // + const/volatile specifiers
+ // - examples
+ // - source definition
+ // - source references
+ // - source referenced by
+ // - body code
+ // - template arguments
+ // (templateArguments(), definitionTemplateParameterLists())
+
+ QCString memType;
+ bool isFunc=FALSE;
+ switch (md->memberType())
+ {
+ case MemberDef::Define: memType="define"; break;
+ case MemberDef::EnumValue: memType="enumvalue"; break;
+ case MemberDef::Property: memType="property"; break;
+ case MemberDef::Variable: memType="variable"; break;
+ case MemberDef::Typedef: memType="typedef"; break;
+ case MemberDef::Enumeration: memType="enum"; break;
+ case MemberDef::Function: memType="function"; isFunc=TRUE; break;
+ case MemberDef::Signal: memType="signal"; isFunc=TRUE; break;
+ //case MemberDef::Prototype: memType="prototype"; isFunc=TRUE; break;
+ case MemberDef::Friend: memType="friend"; isFunc=TRUE; break;
+ case MemberDef::DCOP: memType="dcop"; isFunc=TRUE; break;
+ case MemberDef::Slot: memType="slot"; isFunc=TRUE; break;
+ case MemberDef::Event: memType="event"; break;
+ }
+
+ m_output.openHash()
+ .addFieldQuotedString("kind", memType)
+ .addFieldQuotedString("name", md->name())
+ .addFieldQuotedString("virtualness", getVirtualnessName(md->virtualness()))
+ .addFieldQuotedString("protection", getProtectionName(md->protection()))
+ .addFieldBoolean("static", md->isStatic());
+
+ addPerlModDocBlock(m_output,"brief",md->getDefFileName(),md->getDefLine(),md->getOuterScope(),md,md->briefDescription());
+ addPerlModDocBlock(m_output,"detailed",md->getDefFileName(),md->getDefLine(),md->getOuterScope(),md,md->documentation());
+ if (md->memberType()!=MemberDef::Define &&
+ md->memberType()!=MemberDef::Enumeration)
+ m_output.addFieldQuotedString("type", md->typeString());
+
+ LockingPtr<ArgumentList> al = md->argumentList();
+ if (isFunc) //function
+ {
+ m_output.addFieldBoolean("const", al!=0 && al->constSpecifier)
+ .addFieldBoolean("volatile", al!=0 && al->volatileSpecifier);
+
+ m_output.openList("parameters");
+ LockingPtr<ArgumentList> declAl = md->declArgumentList();
+ LockingPtr<ArgumentList> defAl = md->argumentList();
+ if (declAl!=0 && declAl->count()>0)
+ {
+ ArgumentListIterator declAli(*declAl);
+ ArgumentListIterator defAli(*defAl);
+ Argument *a;
+ for (declAli.toFirst();(a=declAli.current());++declAli)
+ {
+ Argument *defArg = defAli.current();
+ m_output.openHash();
+
+ if (!a->name.isEmpty())
+ m_output.addFieldQuotedString("declaration_name", a->name);
+
+ if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
+ m_output.addFieldQuotedString("definition_name", defArg->name);
+
+ if (!a->type.isEmpty())
+ m_output.addFieldQuotedString("type", a->type);
+
+ if (!a->array.isEmpty())
+ m_output.addFieldQuotedString("array", a->array);
+
+ if (!a->defval.isEmpty())
+ m_output.addFieldQuotedString("default_value", a->defval);
+
+ if (!a->attrib.isEmpty())
+ m_output.addFieldQuotedString("attributes", a->attrib);
+
+ m_output.closeHash();
+ if (defArg) ++defAli;
+ }
+ }
+ m_output.closeList();
+ }
+ else if (md->memberType()==MemberDef::Define &&
+ md->argsString()!=0) // define
+ {
+ m_output.openList("parameters");
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ m_output.openHash()
+ .addFieldQuotedString("name", a->type)
+ .closeHash();
+ }
+ m_output.closeList();
+ }
+ if (!md->initializer().isEmpty())
+ m_output.addFieldQuotedString("initializer", md->initializer());
+
+ if (md->excpString())
+ m_output.addFieldQuotedString("exceptions", md->excpString());
+
+ if (md->memberType()==MemberDef::Enumeration) // enum
+ {
+ LockingPtr<MemberList> enumFields = md->enumFieldList();
+ if (enumFields!=0)
+ {
+ m_output.openList("values");
+ MemberListIterator emli(*enumFields);
+ MemberDef *emd;
+ for (emli.toFirst();(emd=emli.current());++emli)
+ {
+ m_output.openHash()
+ .addFieldQuotedString("name", emd->name());
+
+ if (!emd->initializer().isEmpty())
+ m_output.addFieldQuotedString("initializer", emd->initializer());
+
+ addPerlModDocBlock(m_output,"brief",emd->getDefFileName(),emd->getDefLine(),emd->getOuterScope(),emd,emd->briefDescription());
+
+ addPerlModDocBlock(m_output,"detailed",emd->getDefFileName(),emd->getDefLine(),emd->getOuterScope(),emd,emd->documentation());
+
+ m_output.closeHash();
+ }
+ m_output.closeList();
+ }
+ }
+
+ MemberDef *rmd = md->reimplements();
+ if (rmd)
+ m_output.openHash("reimplements")
+ .addFieldQuotedString("name", rmd->name())
+ .closeHash();
+
+ LockingPtr<MemberList> rbml = md->reimplementedBy();
+ if (rbml!=0)
+ {
+ MemberListIterator mli(*rbml);
+ m_output.openList("reimplemented_by");
+ for (mli.toFirst();(rmd=mli.current());++mli)
+ m_output.openHash()
+ .addFieldQuotedString("name", rmd->name())
+ .closeHash();
+ m_output.closeList();
+ }
+
+ m_output.closeHash();
+}
+
+void PerlModGenerator::generatePerlModSection(Definition *d,
+ MemberList *ml,const char *name,const char *header)
+{
+ if (ml==0) return; // empty list
+
+ m_output.openHash(name);
+
+ if (header)
+ m_output.addFieldQuotedString("header", header);
+
+ m_output.openList("members");
+ MemberListIterator mli(*ml);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ generatePerlModForMember(md,d);
+ }
+ m_output.closeList()
+ .closeHash();
+}
+
+void PerlModGenerator::addListOfAllMembers(ClassDef *cd)
+{
+ m_output.openList("all_members");
+ if (cd->memberNameInfoSDict())
+ {
+ MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
+ MemberNameInfo *mni;
+ for (mnii.toFirst();(mni=mnii.current());++mnii)
+ {
+ MemberNameInfoIterator mii(*mni);
+ MemberInfo *mi;
+ for (mii.toFirst();(mi=mii.current());++mii)
+ {
+ MemberDef *md=mi->memberDef;
+ ClassDef *cd=md->getClassDef();
+ Definition *d=md->getGroupDef();
+ if (d==0) d = cd;
+
+ m_output.openHash()
+ .addFieldQuotedString("name", md->name())
+ .addFieldQuotedString("virtualness", getVirtualnessName(md->virtualness()))
+ .addFieldQuotedString("protection", getProtectionName(mi->prot));
+
+ if (!mi->ambiguityResolutionScope.isEmpty())
+ m_output.addFieldQuotedString("ambiguity_scope", mi->ambiguityResolutionScope);
+
+ m_output.addFieldQuotedString("scope", cd->name())
+ .closeHash();
+ }
+ }
+ }
+ m_output.closeList();
+}
+
+void PerlModGenerator::generatePerlModForClass(ClassDef *cd)
+{
+ // + brief description
+ // + detailed description
+ // + template argument list(s)
+ // - include file
+ // + member groups
+ // + inheritance diagram
+ // + list of direct super classes
+ // + list of direct sub classes
+ // + list of inner classes
+ // + collaboration diagram
+ // + list of all members
+ // + user defined member sections
+ // + standard member sections
+ // + detailed member documentation
+ // - examples using the class
+
+ if (cd->isReference()) return; // skip external references.
+ if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
+ if (cd->templateMaster()!=0) return; // skip generated template instances.
+
+ m_output.openHash()
+ .addFieldQuotedString("name", cd->name());
+
+ if (cd->baseClasses())
+ {
+ m_output.openList("base");
+ BaseClassListIterator bcli(*cd->baseClasses());
+ BaseClassDef *bcd;
+ for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ m_output.openHash()
+ .addFieldQuotedString("name", bcd->classDef->displayName())
+ .addFieldQuotedString("virtualness", getVirtualnessName(bcd->virt))
+ .addFieldQuotedString("protection", getProtectionName(bcd->prot))
+ .closeHash();
+ m_output.closeList();
+ }
+
+ if (cd->subClasses())
+ {
+ m_output.openList("derived");
+ BaseClassListIterator bcli(*cd->subClasses());
+ BaseClassDef *bcd;
+ for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ m_output.openHash()
+ .addFieldQuotedString("name", bcd->classDef->displayName())
+ .addFieldQuotedString("virtualness", getVirtualnessName(bcd->virt))
+ .addFieldQuotedString("protection", getProtectionName(bcd->prot))
+ .closeHash();
+ m_output.closeList();
+ }
+
+ ClassSDict *cl = cd->getInnerClasses();
+ if (cl)
+ {
+ m_output.openList("inner");
+ ClassSDict::Iterator cli(*cl);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ m_output.openHash()
+ .addFieldQuotedString("name", cd->name())
+ .closeHash();
+ m_output.closeList();
+ }
+
+ IncludeInfo *ii=cd->includeInfo();
+ if (ii)
+ {
+ QCString nm = ii->includeName;
+ if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
+ if (!nm.isEmpty())
+ {
+ m_output.openHash("includes");
+#if 0
+ if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
+ t << " id=\"" << ii->fileDef->getOutputFileBase() << "\"";
+#endif
+ m_output.addFieldBoolean("local", ii->local)
+ .addFieldQuotedString("name", nm)
+ .closeHash();
+ }
+ }
+
+ addTemplateList(cd,m_output);
+ addListOfAllMembers(cd);
+ if (cd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ generatePerlModSection(cd,mg->members(),"user_defined",mg->header());
+ }
+
+ generatePerlModSection(cd,cd->getMemberList(MemberList::pubTypes),"public_typedefs");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::pubMethods),"public_methods");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::pubAttribs),"public_members");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::pubSlots),"public_slots");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::signals),"signals");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::dcopMethods),"dcop_methods");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::properties),"properties");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::pubStaticMethods),"public_static_methods");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::pubStaticAttribs),"public_static_members");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::proTypes),"protected_typedefs");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::proMethods),"protected_methods");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::proAttribs),"protected_members");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::proSlots),"protected_slots");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::proStaticMethods),"protected_static_methods");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::proStaticAttribs),"protected_static_members");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::priTypes),"private_typedefs");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::priMethods),"private_methods");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::priAttribs),"private_members");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::priSlots),"private_slots");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::priStaticMethods),"private_static_methods");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::priStaticAttribs),"private_static_members");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::friends),"friend_methods");
+ generatePerlModSection(cd,cd->getMemberList(MemberList::related),"related_methods");
+
+ addPerlModDocBlock(m_output,"brief",cd->getDefFileName(),cd->getDefLine(),cd,0,cd->briefDescription());
+ addPerlModDocBlock(m_output,"detailed",cd->getDefFileName(),cd->getDefLine(),cd,0,cd->documentation());
+
+#if 0
+ DotClassGraph inheritanceGraph(cd,DotClassGraph::Inheritance);
+ if (!inheritanceGraph.isTrivial())
+ {
+ t << " <inheritancegraph>" << endl;
+ inheritanceGraph.writePerlMod(t);
+ t << " </inheritancegraph>" << endl;
+ }
+ DotClassGraph collaborationGraph(cd,DotClassGraph::Implementation);
+ if (!collaborationGraph.isTrivial())
+ {
+ t << " <collaborationgraph>" << endl;
+ collaborationGraph.writePerlMod(t);
+ t << " </collaborationgraph>" << endl;
+ }
+ t << " <location file=\""
+ << cd->getDefFileName() << "\" line=\""
+ << cd->getDefLine() << "\"";
+ if (cd->getStartBodyLine()!=-1)
+ {
+ t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
+ << cd->getEndBodyLine() << "\"";
+ }
+ t << "/>" << endl;
+#endif
+
+ m_output.closeHash();
+}
+
+void PerlModGenerator::generatePerlModForNamespace(NamespaceDef *nd)
+{
+ // + contained class definitions
+ // + contained namespace definitions
+ // + member groups
+ // + normal members
+ // + brief desc
+ // + detailed desc
+ // + location
+ // - files containing (parts of) the namespace definition
+
+ if (nd->isReference()) return; // skip external references
+
+ m_output.openHash()
+ .addFieldQuotedString("name", nd->name());
+
+ ClassSDict *cl = nd->getClassSDict();
+ if (cl)
+ {
+ m_output.openList("classes");
+ ClassSDict::Iterator cli(*cl);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ m_output.openHash()
+ .addFieldQuotedString("name", cd->name())
+ .closeHash();
+ m_output.closeList();
+ }
+
+ NamespaceSDict *nl = nd->getNamespaceSDict();
+ if (nl)
+ {
+ m_output.openList("namespaces");
+ NamespaceSDict::Iterator nli(*nl);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ m_output.openHash()
+ .addFieldQuotedString("name", nd->name())
+ .closeHash();
+ m_output.closeList();
+ }
+
+ if (nd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ generatePerlModSection(nd,mg->members(),"user-defined",mg->header());
+ }
+
+ generatePerlModSection(nd,nd->getMemberList(MemberList::decDefineMembers),"defines");
+ generatePerlModSection(nd,nd->getMemberList(MemberList::decProtoMembers),"prototypes");
+ generatePerlModSection(nd,nd->getMemberList(MemberList::decTypedefMembers),"typedefs");
+ generatePerlModSection(nd,nd->getMemberList(MemberList::decEnumMembers),"enums");
+ generatePerlModSection(nd,nd->getMemberList(MemberList::decFuncMembers),"functions");
+ generatePerlModSection(nd,nd->getMemberList(MemberList::decVarMembers),"variables");
+
+ addPerlModDocBlock(m_output,"brief",nd->getDefFileName(),nd->getDefLine(),0,0,nd->briefDescription());
+ addPerlModDocBlock(m_output,"detailed",nd->getDefFileName(),nd->getDefLine(),0,0,nd->documentation());
+
+ m_output.closeHash();
+}
+
+void PerlModGenerator::generatePerlModForFile(FileDef *fd)
+{
+ // + includes files
+ // + includedby files
+ // - include graph
+ // - included by graph
+ // - contained class definitions
+ // - contained namespace definitions
+ // - member groups
+ // + normal members
+ // + brief desc
+ // + detailed desc
+ // - source code
+ // - location
+ // - number of lines
+
+ if (fd->isReference()) return;
+
+ m_output.openHash()
+ .addFieldQuotedString("name", fd->name());
+
+ IncludeInfo *inc;
+ m_output.openList("includes");
+ if (fd->includeFileList())
+ {
+ QListIterator<IncludeInfo> ili1(*fd->includeFileList());
+ for (ili1.toFirst();(inc=ili1.current());++ili1)
+ {
+ m_output.openHash()
+ .addFieldQuotedString("name", inc->includeName);
+ if (inc->fileDef && !inc->fileDef->isReference())
+ {
+ m_output.addFieldQuotedString("ref", inc->fileDef->getOutputFileBase());
+ }
+ m_output.closeHash();
+ }
+ }
+ m_output.closeList();
+
+ m_output.openList("included_by");
+ if (fd->includedByFileList())
+ {
+ QListIterator<IncludeInfo> ili2(*fd->includedByFileList());
+ for (ili2.toFirst();(inc=ili2.current());++ili2)
+ {
+ m_output.openHash()
+ .addFieldQuotedString("name", inc->includeName);
+ if (inc->fileDef && !inc->fileDef->isReference())
+ {
+ m_output.addFieldQuotedString("ref", inc->fileDef->getOutputFileBase());
+ }
+ m_output.closeHash();
+ }
+ }
+ m_output.closeList();
+
+ generatePerlModSection(fd,fd->getMemberList(MemberList::decDefineMembers),"defines");
+ generatePerlModSection(fd,fd->getMemberList(MemberList::decProtoMembers),"prototypes");
+ generatePerlModSection(fd,fd->getMemberList(MemberList::decTypedefMembers),"typedefs");
+ generatePerlModSection(fd,fd->getMemberList(MemberList::decEnumMembers),"enums");
+ generatePerlModSection(fd,fd->getMemberList(MemberList::decFuncMembers),"functions");
+ generatePerlModSection(fd,fd->getMemberList(MemberList::decVarMembers),"variables");
+
+ addPerlModDocBlock(m_output,"brief",fd->getDefFileName(),fd->getDefLine(),0,0,fd->briefDescription());
+ addPerlModDocBlock(m_output,"detailed",fd->getDefFileName(),fd->getDefLine(),0,0,fd->documentation());
+
+ m_output.closeHash();
+}
+
+void PerlModGenerator::generatePerlModForGroup(GroupDef *gd)
+{
+ // + members
+ // + member groups
+ // + files
+ // + classes
+ // + namespaces
+ // - packages
+ // + pages
+ // + child groups
+ // - examples
+ // + brief description
+ // + detailed description
+
+ if (gd->isReference()) return; // skip external references
+
+ m_output.openHash()
+ .addFieldQuotedString("name", gd->name())
+ .addFieldQuotedString("title", gd->groupTitle());
+
+ FileList *fl = gd->getFiles();
+ if (fl)
+ {
+ m_output.openList("files");
+ QListIterator<FileDef> fli(*fl);
+ FileDef *fd = fl->first();
+ for (fli.toFirst();(fd=fli.current());++fli)
+ m_output.openHash()
+ .addFieldQuotedString("name", fd->name())
+ .closeHash();
+ m_output.closeList();
+ }
+
+ ClassSDict *cl = gd->getClasses();
+ if (cl)
+ {
+ m_output.openList("classes");
+ ClassSDict::Iterator cli(*cl);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ m_output.openHash()
+ .addFieldQuotedString("name", cd->name())
+ .closeHash();
+ m_output.closeList();
+ }
+
+ NamespaceSDict *nl = gd->getNamespaces();
+ if (nl)
+ {
+ m_output.openList("namespaces");
+ NamespaceSDict::Iterator nli(*nl);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ m_output.openHash()
+ .addFieldQuotedString("name", nd->name())
+ .closeHash();
+ m_output.closeList();
+ }
+
+ PageSDict *pl = gd->getPages();
+ if (pl)
+ {
+ m_output.openList("pages");
+ PageSDict::Iterator pli(*pl);
+ PageDef *pd;
+ for (pli.toFirst();(pd=pli.current());++pli)
+ m_output.openHash()
+ .addFieldQuotedString("title", pd->title())
+ .closeHash();
+ m_output.closeList();
+ }
+
+ GroupList *gl = gd->getSubGroups();
+ if (gl)
+ {
+ m_output.openList("groups");
+ GroupListIterator gli(*gl);
+ GroupDef *sgd;
+ for (gli.toFirst();(sgd=gli.current());++gli)
+ m_output.openHash()
+ .addFieldQuotedString("title", sgd->groupTitle())
+ .closeHash();
+ m_output.closeList();
+ }
+
+ if (gd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ generatePerlModSection(gd,mg->members(),"user-defined",mg->header());
+ }
+
+ generatePerlModSection(gd,gd->getMemberList(MemberList::decDefineMembers),"defines");
+ generatePerlModSection(gd,gd->getMemberList(MemberList::decProtoMembers),"prototypes");
+ generatePerlModSection(gd,gd->getMemberList(MemberList::decTypedefMembers),"typedefs");
+ generatePerlModSection(gd,gd->getMemberList(MemberList::decEnumMembers),"enums");
+ generatePerlModSection(gd,gd->getMemberList(MemberList::decFuncMembers),"functions");
+ generatePerlModSection(gd,gd->getMemberList(MemberList::decVarMembers),"variables");
+
+ addPerlModDocBlock(m_output,"brief",gd->getDefFileName(),gd->getDefLine(),0,0,gd->briefDescription());
+ addPerlModDocBlock(m_output,"detailed",gd->getDefFileName(),gd->getDefLine(),0,0,gd->documentation());
+
+ m_output.closeHash();
+}
+
+void PerlModGenerator::generatePerlModForPage(PageDef *pd)
+{
+ // + name
+ // + title
+ // + documentation
+
+ if (pd->isReference()) return;
+
+ m_output.openHash()
+ .addFieldQuotedString("name", pd->name());
+
+ SectionInfo *si = Doxygen::sectionDict.find(pd->name());
+ if (si)
+ m_output.addFieldQuotedString("title", si->title);
+
+ addPerlModDocBlock(m_output,"detailed",pd->docFile(),pd->docLine(),0,0,pd->documentation());
+ m_output.closeHash();
+}
+
+bool PerlModGenerator::generatePerlModOutput()
+{
+ QFile outputFile;
+ if (!createOutputFile(outputFile, pathDoxyDocsPM))
+ return false;
+
+ FTextStream outputTextStream(&outputFile);
+ PerlModOutputStream outputStream(&outputTextStream);
+ m_output.setPerlModOutputStream(&outputStream);
+ m_output.add("$doxydocs=").openHash();
+
+ m_output.openList("classes");
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ generatePerlModForClass(cd);
+ m_output.closeList();
+
+ m_output.openList("namespaces");
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ generatePerlModForNamespace(nd);
+ m_output.closeList();
+
+ m_output.openList("files");
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ generatePerlModForFile(fd);
+ }
+ m_output.closeList();
+
+ m_output.openList("groups");
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (;(gd=gli.current());++gli)
+ {
+ generatePerlModForGroup(gd);
+ }
+ m_output.closeList();
+
+ m_output.openList("pages");
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ generatePerlModForPage(pd);
+ }
+ if (Doxygen::mainPage)
+ {
+ generatePerlModForPage(Doxygen::mainPage);
+ }
+ m_output.closeList();
+
+ m_output.closeHash().add(";\n1;\n");
+ return true;
+}
+
+bool PerlModGenerator::createOutputFile(QFile &f, const char *s)
+{
+ f.setName(s);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n", s);
+ return false;
+ }
+ return true;
+}
+
+bool PerlModGenerator::createOutputDir(QDir &perlModDir)
+{
+ QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
+ if (outputDirectory.isEmpty())
+ {
+ outputDirectory=QDir::currentDirPath();
+ }
+ else
+ {
+ QDir dir(outputDirectory);
+ if (!dir.exists())
+ {
+ dir.setPath(QDir::currentDirPath());
+ if (!dir.mkdir(outputDirectory))
+ {
+ err("error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
+ "exist and cannot be created\n",outputDirectory.data());
+ exit(1);
+ }
+ else if (!Config_getBool("QUIET"))
+ {
+ err("notice: Output directory `%s' does not exist. "
+ "I have created it for you.\n", outputDirectory.data());
+ }
+ dir.cd(outputDirectory);
+ }
+ outputDirectory=dir.absPath();
+ }
+
+ QDir dir(outputDirectory);
+ if (!dir.exists())
+ {
+ dir.setPath(QDir::currentDirPath());
+ if (!dir.mkdir(outputDirectory))
+ {
+ err("Cannot create directory %s\n",outputDirectory.data());
+ return false;
+ }
+ }
+
+ perlModDir.setPath(outputDirectory+"/perlmod");
+ if (!perlModDir.exists() && !perlModDir.mkdir(outputDirectory+"/perlmod"))
+ {
+ err("Could not create perlmod directory in %s\n",outputDirectory.data());
+ return false;
+ }
+ return true;
+}
+
+bool PerlModGenerator::generateDoxyStructurePM()
+{
+ QFile doxyModelPM;
+ if (!createOutputFile(doxyModelPM, pathDoxyStructurePM))
+ return false;
+
+ FTextStream doxyModelPMStream(&doxyModelPM);
+ doxyModelPMStream <<
+ "sub memberlist($) {\n"
+ " my $prefix = $_[0];\n"
+ " return\n"
+ "\t[ \"hash\", $prefix . \"s\",\n"
+ "\t {\n"
+ "\t members =>\n"
+ "\t [ \"list\", $prefix . \"List\",\n"
+ "\t\t[ \"hash\", $prefix,\n"
+ "\t\t {\n"
+ "\t\t kind => [ \"string\", $prefix . \"Kind\" ],\n"
+ "\t\t name => [ \"string\", $prefix . \"Name\" ],\n"
+ "\t\t static => [ \"string\", $prefix . \"Static\" ],\n"
+ "\t\t virtualness => [ \"string\", $prefix . \"Virtualness\" ],\n"
+ "\t\t protection => [ \"string\", $prefix . \"Protection\" ],\n"
+ "\t\t type => [ \"string\", $prefix . \"Type\" ],\n"
+ "\t\t parameters =>\n"
+ "\t\t [ \"list\", $prefix . \"Params\",\n"
+ "\t\t\t[ \"hash\", $prefix . \"Param\",\n"
+ "\t\t\t {\n"
+ "\t\t\t declaration_name => [ \"string\", $prefix . \"ParamName\" ],\n"
+ "\t\t\t type => [ \"string\", $prefix . \"ParamType\" ],\n"
+ "\t\t\t },\n"
+ "\t\t\t],\n"
+ "\t\t ],\n"
+ "\t\t detailed =>\n"
+ "\t\t [ \"hash\", $prefix . \"Detailed\",\n"
+ "\t\t\t{\n"
+ "\t\t\t doc => [ \"doc\", $prefix . \"DetailedDoc\" ],\n"
+ "\t\t\t return => [ \"doc\", $prefix . \"Return\" ],\n"
+ "\t\t\t see => [ \"doc\", $prefix . \"See\" ],\n"
+ "\t\t\t params =>\n"
+ "\t\t\t [ \"list\", $prefix . \"PDBlocks\",\n"
+ "\t\t\t [ \"hash\", $prefix . \"PDBlock\",\n"
+ "\t\t\t\t{\n"
+ "\t\t\t\t parameters =>\n"
+ "\t\t\t\t [ \"list\", $prefix . \"PDParams\",\n"
+ "\t\t\t\t [ \"hash\", $prefix . \"PDParam\",\n"
+ "\t\t\t\t\t{\n"
+ "\t\t\t\t\t name => [ \"string\", $prefix . \"PDParamName\" ],\n"
+ "\t\t\t\t\t},\n"
+ "\t\t\t\t ],\n"
+ "\t\t\t\t ],\n"
+ "\t\t\t\t doc => [ \"doc\", $prefix . \"PDDoc\" ],\n"
+ "\t\t\t\t},\n"
+ "\t\t\t ],\n"
+ "\t\t\t ],\n"
+ "\t\t\t},\n"
+ "\t\t ],\n"
+ "\t\t },\n"
+ "\t\t],\n"
+ "\t ],\n"
+ "\t },\n"
+ "\t];\n"
+ "}\n"
+ "\n"
+ "$doxystructure =\n"
+ " [ \"hash\", \"Root\",\n"
+ " {\n"
+ "\tfiles =>\n"
+ "\t [ \"list\", \"Files\",\n"
+ "\t [ \"hash\", \"File\",\n"
+ "\t {\n"
+ "\t\tname => [ \"string\", \"FileName\" ],\n"
+ "\t\ttypedefs => memberlist(\"FileTypedef\"),\n"
+ "\t\tvariables => memberlist(\"FileVariable\"),\n"
+ "\t\tfunctions => memberlist(\"FileFunction\"),\n"
+ "\t\tdetailed =>\n"
+ "\t\t [ \"hash\", \"FileDetailed\",\n"
+ "\t\t {\n"
+ "\t\t doc => [ \"doc\", \"FileDetailedDoc\" ],\n"
+ "\t\t },\n"
+ "\t\t ],\n"
+ "\t },\n"
+ "\t ],\n"
+ "\t ],\n"
+ "\tpages =>\n"
+ "\t [ \"list\", \"Pages\",\n"
+ "\t [ \"hash\", \"Page\",\n"
+ "\t {\n"
+ "\t\tname => [ \"string\", \"PageName\" ],\n"
+ "\t\tdetailed =>\n"
+ "\t\t [ \"hash\", \"PageDetailed\",\n"
+ "\t\t {\n"
+ "\t\t doc => [ \"doc\", \"PageDetailedDoc\" ],\n"
+ "\t\t },\n"
+ "\t\t ],\n"
+ "\t },\n"
+ "\t ],\n"
+ "\t ],\n"
+ "\tclasses =>\n"
+ "\t [ \"list\", \"Classes\",\n"
+ "\t [ \"hash\", \"Class\",\n"
+ "\t {\n"
+ "\t\tname => [ \"string\", \"ClassName\" ],\n"
+ "\t\tpublic_typedefs => memberlist(\"ClassPublicTypedef\"),\n"
+ "\t\tpublic_methods => memberlist(\"ClassPublicMethod\"),\n"
+ "\t\tpublic_members => memberlist(\"ClassPublicMember\"),\n"
+ "\t\tprotected_typedefs => memberlist(\"ClassProtectedTypedef\"),\n"
+ "\t\tprotected_methods => memberlist(\"ClassProtectedMethod\"),\n"
+ "\t\tprotected_members => memberlist(\"ClassProtectedMember\"),\n"
+ "\t\tprivate_typedefs => memberlist(\"ClassPrivateTypedef\"),\n"
+ "\t\tprivate_methods => memberlist(\"ClassPrivateMethod\"),\n"
+ "\t\tprivate_members => memberlist(\"ClassPrivateMember\"),\n"
+ "\t\tdetailed =>\n"
+ "\t\t [ \"hash\", \"ClassDetailed\",\n"
+ "\t\t {\n"
+ "\t\t doc => [ \"doc\", \"ClassDetailedDoc\" ],\n"
+ "\t\t },\n"
+ "\t\t ],\n"
+ "\t },\n"
+ "\t ],\n"
+ "\t ],\n"
+ "\tgroups =>\n"
+ "\t [ \"list\", \"Groups\",\n"
+ "\t [ \"hash\", \"Group\",\n"
+ "\t {\n"
+ "\t\tname => [ \"string\", \"GroupName\" ],\n"
+ "\t\ttitle => [ \"string\", \"GroupTitle\" ],\n"
+ "\t\tfiles =>\n"
+ "\t\t [ \"list\", \"Files\",\n"
+ "\t\t [ \"hash\", \"File\",\n"
+ "\t\t {\n"
+ "\t\t name => [ \"string\", \"Filename\" ]\n"
+ "\t\t }\n"
+ "\t\t ],\n"
+ "\t\t ],\n"
+ "\t\tclasses =>\n"
+ "\t\t [ \"list\", \"Classes\",\n"
+ "\t\t [ \"hash\", \"Class\",\n"
+ "\t\t {\n"
+ "\t\t name => [ \"string\", \"Classname\" ]\n"
+ "\t\t }\n"
+ "\t\t ],\n"
+ "\t\t ],\n"
+ "\t\tnamespaces =>\n"
+ "\t\t [ \"list\", \"Namespaces\",\n"
+ "\t\t [ \"hash\", \"Namespace\",\n"
+ "\t\t {\n"
+ "\t\t name => [ \"string\", \"NamespaceName\" ]\n"
+ "\t\t }\n"
+ "\t\t ],\n"
+ "\t\t ],\n"
+ "\t\tpages =>\n"
+ "\t\t [ \"list\", \"Pages\",\n"
+ "\t\t [ \"hash\", \"Page\","
+ "\t\t {\n"
+ "\t\t title => [ \"string\", \"PageName\" ]\n"
+ "\t\t }\n"
+ "\t\t ],\n"
+ "\t\t ],\n"
+ "\t\tgroups =>\n"
+ "\t\t [ \"list\", \"Groups\",\n"
+ "\t\t [ \"hash\", \"Group\",\n"
+ "\t\t {\n"
+ "\t\t title => [ \"string\", \"GroupName\" ]\n"
+ "\t\t }\n"
+ "\t\t ],\n"
+ "\t\t ],\n"
+ "\t\tfunctions => memberlist(\"GroupFunction\"),\n"
+ "\t\tdetailed =>\n"
+ "\t\t [ \"hash\", \"GroupDetailed\",\n"
+ "\t\t {\n"
+ "\t\t doc => [ \"doc\", \"GroupDetailedDoc\" ],\n"
+ "\t\t },\n"
+ "\t\t ],\n"
+ "\t }\n"
+ "\t ],\n"
+ "\t ],\n"
+ " },\n"
+ " ];\n"
+ "\n"
+ "1;\n";
+
+ return true;
+}
+
+bool PerlModGenerator::generateDoxyRules()
+{
+ QFile doxyRules;
+ if (!createOutputFile(doxyRules, pathDoxyRules))
+ return false;
+
+ bool perlmodLatex = Config_getBool("PERLMOD_LATEX");
+ QCString prefix = Config_getString("PERLMOD_MAKEVAR_PREFIX");
+
+ FTextStream doxyRulesStream(&doxyRules);
+ doxyRulesStream <<
+ prefix << "DOXY_EXEC_PATH = " << pathDoxyExec << "\n" <<
+ prefix << "DOXYFILE = " << pathDoxyfile << "\n" <<
+ prefix << "DOXYDOCS_PM = " << pathDoxyDocsPM << "\n" <<
+ prefix << "DOXYSTRUCTURE_PM = " << pathDoxyStructurePM << "\n" <<
+ prefix << "DOXYRULES = " << pathDoxyRules << "\n";
+ if (perlmodLatex)
+ doxyRulesStream <<
+ prefix << "DOXYLATEX_PL = " << pathDoxyLatexPL << "\n" <<
+ prefix << "DOXYLATEXSTRUCTURE_PL = " << pathDoxyLatexStructurePL << "\n" <<
+ prefix << "DOXYSTRUCTURE_TEX = " << pathDoxyStructureTex << "\n" <<
+ prefix << "DOXYDOCS_TEX = " << pathDoxyDocsTex << "\n" <<
+ prefix << "DOXYFORMAT_TEX = " << pathDoxyFormatTex << "\n" <<
+ prefix << "DOXYLATEX_TEX = " << pathDoxyLatexTex << "\n" <<
+ prefix << "DOXYLATEX_DVI = " << pathDoxyLatexDVI << "\n" <<
+ prefix << "DOXYLATEX_PDF = " << pathDoxyLatexPDF << "\n";
+
+ doxyRulesStream <<
+ "\n"
+ ".PHONY: clean-perlmod\n"
+ "clean-perlmod::\n"
+ "\trm -f $(" << prefix << "DOXYSTRUCTURE_PM) \\\n"
+ "\t$(" << prefix << "DOXYDOCS_PM)";
+ if (perlmodLatex)
+ doxyRulesStream <<
+ " \\\n"
+ "\t$(" << prefix << "DOXYLATEX_PL) \\\n"
+ "\t$(" << prefix << "DOXYLATEXSTRUCTURE_PL) \\\n"
+ "\t$(" << prefix << "DOXYDOCS_TEX) \\\n"
+ "\t$(" << prefix << "DOXYSTRUCTURE_TEX) \\\n"
+ "\t$(" << prefix << "DOXYFORMAT_TEX) \\\n"
+ "\t$(" << prefix << "DOXYLATEX_TEX) \\\n"
+ "\t$(" << prefix << "DOXYLATEX_PDF) \\\n"
+ "\t$(" << prefix << "DOXYLATEX_DVI) \\\n"
+ "\t$(addprefix $(" << prefix << "DOXYLATEX_TEX:tex=),out aux log)";
+ doxyRulesStream << "\n\n";
+
+ doxyRulesStream <<
+ "$(" << prefix << "DOXYRULES) \\\n"
+ "$(" << prefix << "DOXYMAKEFILE) \\\n"
+ "$(" << prefix << "DOXYSTRUCTURE_PM) \\\n"
+ "$(" << prefix << "DOXYDOCS_PM)";
+ if (perlmodLatex) {
+ doxyRulesStream <<
+ " \\\n"
+ "$(" << prefix << "DOXYLATEX_PL) \\\n"
+ "$(" << prefix << "DOXYLATEXSTRUCTURE_PL) \\\n"
+ "$(" << prefix << "DOXYFORMAT_TEX) \\\n"
+ "$(" << prefix << "DOXYLATEX_TEX)";
+ }
+ doxyRulesStream <<
+ ": \\\n"
+ "\t$(" << prefix << "DOXYFILE)\n"
+ "\tcd $(" << prefix << "DOXY_EXEC_PATH) ; doxygen \"$<\"\n";
+
+ if (perlmodLatex) {
+ doxyRulesStream <<
+ "\n"
+ "$(" << prefix << "DOXYDOCS_TEX): \\\n"
+ "$(" << prefix << "DOXYLATEX_PL) \\\n"
+ "$(" << prefix << "DOXYDOCS_PM)\n"
+ "\tperl -I\"$(<D)\" \"$<\" >\"$@\"\n"
+ "\n"
+ "$(" << prefix << "DOXYSTRUCTURE_TEX): \\\n"
+ "$(" << prefix << "DOXYLATEXSTRUCTURE_PL) \\\n"
+ "$(" << prefix << "DOXYSTRUCTURE_PM)\n"
+ "\tperl -I\"$(<D)\" \"$<\" >\"$@\"\n"
+ "\n"
+ "$(" << prefix << "DOXYLATEX_PDF) \\\n"
+ "$(" << prefix << "DOXYLATEX_DVI): \\\n"
+ "$(" << prefix << "DOXYLATEX_TEX) \\\n"
+ "$(" << prefix << "DOXYFORMAT_TEX) \\\n"
+ "$(" << prefix << "DOXYSTRUCTURE_TEX) \\\n"
+ "$(" << prefix << "DOXYDOCS_TEX)\n"
+ "\n"
+ "$(" << prefix << "DOXYLATEX_PDF): \\\n"
+ "$(" << prefix << "DOXYLATEX_TEX)\n"
+ "\tpdflatex -interaction=nonstopmode \"$<\"\n"
+ "\n"
+ "$(" << prefix << "DOXYLATEX_DVI): \\\n"
+ "$(" << prefix << "DOXYLATEX_TEX)\n"
+ "\tlatex -interaction=nonstopmode \"$<\"\n";
+ }
+
+ return true;
+}
+
+bool PerlModGenerator::generateMakefile()
+{
+ QFile makefile;
+ if (!createOutputFile(makefile, pathMakefile))
+ return false;
+
+ bool perlmodLatex = Config_getBool("PERLMOD_LATEX");
+ QCString prefix = Config_getString("PERLMOD_MAKEVAR_PREFIX");
+
+ FTextStream makefileStream(&makefile);
+ makefileStream <<
+ ".PHONY: default clean" << (perlmodLatex ? " pdf" : "") << "\n"
+ "default: " << (perlmodLatex ? "pdf" : "clean") << "\n"
+ "\n"
+ "include " << pathDoxyRules << "\n"
+ "\n"
+ "clean: clean-perlmod\n";
+
+ if (perlmodLatex) {
+ makefileStream <<
+ "pdf: $(" << prefix << "DOXYLATEX_PDF)\n"
+ "dvi: $(" << prefix << "DOXYLATEX_DVI)\n";
+ }
+
+ return true;
+}
+
+bool PerlModGenerator::generateDoxyLatexStructurePL()
+{
+ QFile doxyLatexStructurePL;
+ if (!createOutputFile(doxyLatexStructurePL, pathDoxyLatexStructurePL))
+ return false;
+
+ FTextStream doxyLatexStructurePLStream(&doxyLatexStructurePL);
+ doxyLatexStructurePLStream <<
+ "use DoxyStructure;\n"
+ "\n"
+ "sub process($) {\n"
+ "\tmy $node = $_[0];\n"
+ "\tmy ($type, $name) = @$node[0, 1];\n"
+ "\tmy $command;\n"
+ "\tif ($type eq \"string\") { $command = \"String\" }\n"
+ "\telsif ($type eq \"doc\") { $command = \"Doc\" }\n"
+ "\telsif ($type eq \"hash\") {\n"
+ "\t\t$command = \"Hash\";\n"
+ "\t\tfor my $subnode (values %{$$node[2]}) {\n"
+ "\t\t\tprocess($subnode);\n"
+ "\t\t}\n"
+ "\t}\n"
+ "\telsif ($type eq \"list\") {\n"
+ "\t\t$command = \"List\";\n"
+ "\t\tprocess($$node[2]);\n"
+ "\t}\n"
+ "\tprint \"\\\\\" . $command . \"Node{\" . $name . \"}%\\n\";\n"
+ "}\n"
+ "\n"
+ "process($doxystructure);\n";
+
+ return true;
+}
+
+bool PerlModGenerator::generateDoxyLatexPL()
+{
+ QFile doxyLatexPL;
+ if (!createOutputFile(doxyLatexPL, pathDoxyLatexPL))
+ return false;
+
+ FTextStream doxyLatexPLStream(&doxyLatexPL);
+ doxyLatexPLStream <<
+ "use DoxyStructure;\n"
+ "use DoxyDocs;\n"
+ "\n"
+ "sub latex_quote($) {\n"
+ "\tmy $text = $_[0];\n"
+ "\t$text =~ s/\\\\/\\\\textbackslash /g;\n"
+ "\t$text =~ s/\\|/\\\\textbar /g;\n"
+ "\t$text =~ s/</\\\\textless /g;\n"
+ "\t$text =~ s/>/\\\\textgreater /g;\n"
+ "\t$text =~ s/~/\\\\textasciitilde /g;\n"
+ "\t$text =~ s/\\^/\\\\textasciicircum /g;\n"
+ "\t$text =~ s/[\\$&%#_{}]/\\\\$&/g;\n"
+ "\tprint $text;\n"
+ "}\n"
+ "\n"
+ "sub generate_doc($) {\n"
+ "\tmy $doc = $_[0];\n"
+ "\tfor my $item (@$doc) {\n"
+ "\t\tmy $type = $$item{type};\n"
+ "\t\tif ($type eq \"text\") {\n"
+ "\t\t\tlatex_quote($$item{content});\n"
+ "\t\t} elsif ($type eq \"parbreak\") {\n"
+ "\t\t\tprint \"\\n\\n\";\n"
+ "\t\t} elsif ($type eq \"style\") {\n"
+ "\t\t\tmy $style = $$item{style};\n"
+ "\t\t\tif ($$item{enable} eq \"yes\") {\n"
+ "\t\t\t\tif ($style eq \"bold\") { print '\\bfseries'; }\n"
+ "\t\t\t\tif ($style eq \"italic\") { print '\\itshape'; }\n"
+ "\t\t\t\tif ($style eq \"code\") { print '\\ttfamily'; }\n"
+ "\t\t\t} else {\n"
+ "\t\t\t\tif ($style eq \"bold\") { print '\\mdseries'; }\n"
+ "\t\t\t\tif ($style eq \"italic\") { print '\\upshape'; }\n"
+ "\t\t\t\tif ($style eq \"code\") { print '\\rmfamily'; }\n"
+ "\t\t\t}\n"
+ "\t\t\tprint '{}';\n"
+ "\t\t} elsif ($type eq \"symbol\") {\n"
+ "\t\t\tmy $symbol = $$item{symbol};\n"
+ "\t\t\tif ($symbol eq \"copyright\") { print '\\copyright'; }\n"
+ "\t\t\telsif ($symbol eq \"szlig\") { print '\\ss'; }\n"
+ "\t\t\tprint '{}';\n"
+ "\t\t} elsif ($type eq \"accent\") {\n"
+ "\t\t\tmy ($accent) = $$item{accent};\n"
+ "\t\t\tif ($accent eq \"umlaut\") { print '\\\"'; }\n"
+ "\t\t\telsif ($accent eq \"acute\") { print '\\\\\\''; }\n"
+ "\t\t\telsif ($accent eq \"grave\") { print '\\`'; }\n"
+ "\t\t\telsif ($accent eq \"circ\") { print '\\^'; }\n"
+ "\t\t\telsif ($accent eq \"tilde\") { print '\\~'; }\n"
+ "\t\t\telsif ($accent eq \"cedilla\") { print '\\c'; }\n"
+ "\t\t\telsif ($accent eq \"ring\") { print '\\r'; }\n"
+ "\t\t\tprint \"{\" . $$item{letter} . \"}\"; \n"
+ "\t\t} elsif ($type eq \"list\") {\n"
+ "\t\t\tmy $env = ($$item{style} eq \"ordered\") ? \"enumerate\" : \"itemize\";\n"
+ "\t\t\tprint \"\\n\\\\begin{\" . $env .\"}\";\n"
+ "\t\t \tfor my $subitem (@{$$item{content}}) {\n"
+ "\t\t\t\tprint \"\\n\\\\item \";\n"
+ "\t\t\t\tgenerate_doc($subitem);\n"
+ "\t\t \t}\n"
+ "\t\t\tprint \"\\n\\\\end{\" . $env .\"}\";\n"
+ "\t\t} elsif ($type eq \"url\") {\n"
+ "\t\t\tlatex_quote($$item{content});\n"
+ "\t\t}\n"
+ "\t}\n"
+ "}\n"
+ "\n"
+ "sub generate($$) {\n"
+ "\tmy ($item, $node) = @_;\n"
+ "\tmy ($type, $name) = @$node[0, 1];\n"
+ "\tif ($type eq \"string\") {\n"
+ "\t\tprint \"\\\\\" . $name . \"{\";\n"
+ "\t\tlatex_quote($item);\n"
+ "\t\tprint \"}\";\n"
+ "\t} elsif ($type eq \"doc\") {\n"
+ "\t\tif (@$item) {\n"
+ "\t\t\tprint \"\\\\\" . $name . \"{\";\n"
+ "\t\t\tgenerate_doc($item);\n"
+ "\t\t\tprint \"}%\\n\";\n"
+ "\t\t} else {\n"
+ "#\t\t\tprint \"\\\\\" . $name . \"Empty%\\n\";\n"
+ "\t\t}\n"
+ "\t} elsif ($type eq \"hash\") {\n"
+ "\t\tmy ($key, $value);\n"
+ "\t\twhile (($key, $subnode) = each %{$$node[2]}) {\n"
+ "\t\t\tmy $subname = $$subnode[1];\n"
+ "\t\t\tprint \"\\\\Defcs{field\" . $subname . \"}{\";\n"
+ "\t\t\tif ($$item{$key}) {\n"
+ "\t\t\t\tgenerate($$item{$key}, $subnode);\n"
+ "\t\t\t} else {\n"
+ "#\t\t\t\t\tprint \"\\\\\" . $subname . \"Empty%\\n\";\n"
+ "\t\t\t}\n"
+ "\t\t\tprint \"}%\\n\";\n"
+ "\t\t}\n"
+ "\t\tprint \"\\\\\" . $name . \"%\\n\";\n"
+ "\t} elsif ($type eq \"list\") {\n"
+ "\t\tmy $index = 0;\n"
+ "\t\tif (@$item) {\n"
+ "\t\t\tprint \"\\\\\" . $name . \"{%\\n\";\n"
+ "\t\t\tfor my $subitem (@$item) {\n"
+ "\t\t\t\tif ($index) {\n"
+ "\t\t\t\t\tprint \"\\\\\" . $name . \"Sep%\\n\";\n"
+ "\t\t\t\t}\n"
+ "\t\t\t\tgenerate($subitem, $$node[2]);\n"
+ "\t\t\t\t$index++;\n"
+ "\t\t\t}\n"
+ "\t\t\tprint \"}%\\n\";\n"
+ "\t\t} else {\n"
+ "#\t\t\tprint \"\\\\\" . $name . \"Empty%\\n\";\n"
+ "\t\t}\n"
+ "\t}\n"
+ "}\n"
+ "\n"
+ "generate($doxydocs, $doxystructure);\n";
+
+ return true;
+}
+
+bool PerlModGenerator::generateDoxyFormatTex()
+{
+ QFile doxyFormatTex;
+ if (!createOutputFile(doxyFormatTex, pathDoxyFormatTex))
+ return false;
+
+ FTextStream doxyFormatTexStream(&doxyFormatTex);
+ doxyFormatTexStream <<
+ "\\def\\Defcs#1{\\long\\expandafter\\def\\csname#1\\endcsname}\n"
+ "\\Defcs{Empty}{}\n"
+ "\\def\\IfEmpty#1{\\expandafter\\ifx\\csname#1\\endcsname\\Empty}\n"
+ "\n"
+ "\\def\\StringNode#1{\\Defcs{#1}##1{##1}}\n"
+ "\\def\\DocNode#1{\\Defcs{#1}##1{##1}}\n"
+ "\\def\\ListNode#1{\\Defcs{#1}##1{##1}\\Defcs{#1Sep}{}}\n"
+ "\\def\\HashNode#1{\\Defcs{#1}{}}\n"
+ "\n"
+ "\\input{" << pathDoxyStructureTex << "}\n"
+ "\n"
+ "\\newbox\\BoxA\n"
+ "\\dimendef\\DimenA=151\\relax\n"
+ "\\dimendef\\DimenB=152\\relax\n"
+ "\\countdef\\ZoneDepth=151\\relax\n"
+ "\n"
+ "\\def\\Cs#1{\\csname#1\\endcsname}\n"
+ "\\def\\Letcs#1{\\expandafter\\let\\csname#1\\endcsname}\n"
+ "\\def\\Heading#1{\\vskip 4mm\\relax\\textbf{#1}}\n"
+ "\\def\\See#1{\\begin{flushleft}\\Heading{See also: }#1\\end{flushleft}}\n"
+ "\n"
+ "\\def\\Frame#1{\\vskip 3mm\\relax\\fbox{ \\vbox{\\hsize0.95\\hsize\\vskip 1mm\\relax\n"
+ "\\raggedright#1\\vskip 0.5mm\\relax} }}\n"
+ "\n"
+ "\\def\\Zone#1#2#3{%\n"
+ "\\Defcs{Test#1}{#2}%\n"
+ "\\Defcs{Emit#1}{#3}%\n"
+ "\\Defcs{#1}{%\n"
+ "\\advance\\ZoneDepth1\\relax\n"
+ "\\Letcs{Mode\\number\\ZoneDepth}0\\relax\n"
+ "\\Letcs{Present\\number\\ZoneDepth}0\\relax\n"
+ "\\Cs{Test#1}\n"
+ "\\expandafter\\if\\Cs{Present\\number\\ZoneDepth}1%\n"
+ "\\advance\\ZoneDepth-1\\relax\n"
+ "\\Letcs{Present\\number\\ZoneDepth}1\\relax\n"
+ "\\expandafter\\if\\Cs{Mode\\number\\ZoneDepth}1%\n"
+ "\\advance\\ZoneDepth1\\relax\n"
+ "\\Letcs{Mode\\number\\ZoneDepth}1\\relax\n"
+ "\\Cs{Emit#1}\n"
+ "\\advance\\ZoneDepth-1\\relax\\fi\n"
+ "\\advance\\ZoneDepth1\\relax\\fi\n"
+ "\\advance\\ZoneDepth-1\\relax}}\n"
+ "\n"
+ "\\def\\Member#1#2{%\n"
+ "\\Defcs{Test#1}{\\Cs{field#1Detailed}\n"
+ "\\IfEmpty{field#1DetailedDoc}\\else\\Letcs{Present#1}1\\fi}\n"
+ "\\Defcs{#1}{\\Letcs{Present#1}0\\relax\n"
+ "\\Cs{Test#1}\\if1\\Cs{Present#1}\\Letcs{Present\\number\\ZoneDepth}1\\relax\n"
+ "\\if1\\Cs{Mode\\number\\ZoneDepth}#2\\fi\\fi}}\n"
+ "\n"
+ "\\def\\TypedefMemberList#1#2{%\n"
+ "\\Defcs{#1DetailedDoc}##1{\\vskip 5.5mm\\relax##1}%\n"
+ "\\Defcs{#1Name}##1{\\textbf{##1}}%\n"
+ "\\Defcs{#1See}##1{\\See{##1}}%\n"
+ "%\n"
+ "\\Zone{#1s}{\\Cs{field#1List}}{\\subsubsection{#2}\\Cs{field#1List}}%\n"
+ "\\Member{#1}{\\Frame{typedef \\Cs{field#1Type} \\Cs{field#1Name}}%\n"
+ "\\Cs{field#1DetailedDoc}\\Cs{field#1See}\\vskip 5mm\\relax}}%\n"
+ "\n"
+ "\\def\\VariableMemberList#1#2{%\n"
+ "\\Defcs{#1DetailedDoc}##1{\\vskip 5.5mm\\relax##1}%\n"
+ "\\Defcs{#1Name}##1{\\textbf{##1}}%\n"
+ "\\Defcs{#1See}##1{\\See{##1}}%\n"
+ "%\n"
+ "\\Zone{#1s}{\\Cs{field#1List}}{\\subsubsection{#2}\\Cs{field#1List}}%\n"
+ "\\Member{#1}{\\Frame{\\Cs{field#1Type}{} \\Cs{field#1Name}}%\n"
+ "\\Cs{field#1DetailedDoc}\\Cs{field#1See}\\vskip 5mm\\relax}}%\n"
+ "\n"
+ "\\def\\FunctionMemberList#1#2{%\n"
+ "\\Defcs{#1PDParamName}##1{\\textit{##1}}%\n"
+ "\\Defcs{#1PDParam}{\\Cs{field#1PDParamName}}%\n"
+ "\\Defcs{#1PDParamsSep}{, }%\n"
+ "\\Defcs{#1PDBlocksSep}{\\vskip 2mm\\relax}%\n"
+ "%\n"
+ "\\Defcs{#1PDBlocks}##1{%\n"
+ "\\Heading{Parameters:}\\vskip 1.5mm\\relax\n"
+ "\\DimenA0pt\\relax\n"
+ "\\Defcs{#1PDBlock}{\\setbox\\BoxA\\hbox{\\Cs{field#1PDParams}}%\n"
+ "\\ifdim\\DimenA<\\wd\\BoxA\\DimenA\\wd\\BoxA\\fi}%\n"
+ "##1%\n"
+ "\\advance\\DimenA3mm\\relax\n"
+ "\\DimenB\\hsize\\advance\\DimenB-\\DimenA\\relax\n"
+ "\\Defcs{#1PDBlock}{\\hbox to\\hsize{\\vtop{\\hsize\\DimenA\\relax\n"
+ "\\Cs{field#1PDParams}}\\hfill\n"
+ "\\vtop{\\hsize\\DimenB\\relax\\Cs{field#1PDDoc}}}}%\n"
+ "##1}\n"
+ "\n"
+ "\\Defcs{#1ParamName}##1{\\textit{##1}}\n"
+ "\\Defcs{#1Param}{\\Cs{field#1ParamType}{} \\Cs{field#1ParamName}}\n"
+ "\\Defcs{#1ParamsSep}{, }\n"
+ "\n"
+ "\\Defcs{#1Name}##1{\\textbf{##1}}\n"
+ "\\Defcs{#1See}##1{\\See{##1}}\n"
+ "\\Defcs{#1Return}##1{\\Heading{Returns: }##1}\n"
+ "\\Defcs{field#1Title}{\\Frame{\\Cs{field#1Type}{} \\Cs{field#1Name}(\\Cs{field#1Params})}}%\n"
+ "%\n"
+ "\\Zone{#1s}{\\Cs{field#1List}}{\\subsubsection{#2}\\Cs{field#1List}}%\n"
+ "\\Member{#1}{%\n"
+ "\\Cs{field#1Title}\\vskip 6mm\\relax\\Cs{field#1DetailedDoc}\n"
+ "\\Cs{field#1Return}\\Cs{field#1PDBlocks}\\Cs{field#1See}\\vskip 5mm\\relax}}\n"
+ "\n"
+ "\\def\\FileDetailed{\\fieldFileDetailedDoc\\par}\n"
+ "\\def\\ClassDetailed{\\fieldClassDetailedDoc\\par}\n"
+ "\n"
+ "\\def\\FileSubzones{\\fieldFileTypedefs\\fieldFileVariables\\fieldFileFunctions}\n"
+ "\n"
+ "\\def\\ClassSubzones{%\n"
+ "\\fieldClassPublicTypedefs\\fieldClassPublicMembers\\fieldClassPublicMethods\n"
+ "\\fieldClassProtectedTypedefs\\fieldClassProtectedMembers\\fieldClassProtectedMethods\n"
+ "\\fieldClassPrivateTypedefs\\fieldClassPrivateMembers\\fieldClassPrivateMethods}\n"
+ "\n"
+ "\\Member{Page}{\\subsection{\\fieldPageName}\\fieldPageDetailedDoc}\n"
+ "\n"
+ "\\TypedefMemberList{FileTypedef}{Typedefs}\n"
+ "\\VariableMemberList{FileVariable}{Variables}\n"
+ "\\FunctionMemberList{FileFunction}{Functions}\n"
+ "\\Zone{File}{\\FileSubzones}{\\subsection{\\fieldFileName}\\fieldFileDetailed\\FileSubzones}\n"
+ "\n"
+ "\\TypedefMemberList{ClassPublicTypedef}{Public Typedefs}\n"
+ "\\TypedefMemberList{ClassProtectedTypedef}{Protected Typedefs}\n"
+ "\\TypedefMemberList{ClassPrivateTypedef}{Private Typedefs}\n"
+ "\\VariableMemberList{ClassPublicMember}{Public Members}\n"
+ "\\VariableMemberList{ClassProtectedMember}{Protected Members}\n"
+ "\\VariableMemberList{ClassPrivateMember}{Private Members}\n"
+ "\\FunctionMemberList{ClassPublicMethod}{Public Methods}\n"
+ "\\FunctionMemberList{ClassProtectedMethod}{Protected Methods}\n"
+ "\\FunctionMemberList{ClassPrivateMethod}{Private Methods}\n"
+ "\\Zone{Class}{\\ClassSubzones}{\\subsection{\\fieldClassName}\\fieldClassDetailed\\ClassSubzones}\n"
+ "\n"
+ "\\Zone{AllPages}{\\fieldPages}{\\section{Pages}\\fieldPages}\n"
+ "\\Zone{AllFiles}{\\fieldFiles}{\\section{Files}\\fieldFiles}\n"
+ "\\Zone{AllClasses}{\\fieldClasses}{\\section{Classes}\\fieldClasses}\n"
+ "\n"
+ "\\newlength{\\oldparskip}\n"
+ "\\newlength{\\oldparindent}\n"
+ "\\newlength{\\oldfboxrule}\n"
+ "\n"
+ "\\ZoneDepth0\\relax\n"
+ "\\Letcs{Mode0}1\\relax\n"
+ "\n"
+ "\\def\\EmitDoxyDocs{%\n"
+ "\\setlength{\\oldparskip}{\\parskip}\n"
+ "\\setlength{\\oldparindent}{\\parindent}\n"
+ "\\setlength{\\oldfboxrule}{\\fboxrule}\n"
+ "\\setlength{\\parskip}{0cm}\n"
+ "\\setlength{\\parindent}{0cm}\n"
+ "\\setlength{\\fboxrule}{1pt}\n"
+ "\\AllPages\\AllFiles\\AllClasses\n"
+ "\\setlength{\\parskip}{\\oldparskip}\n"
+ "\\setlength{\\parindent}{\\oldparindent}\n"
+ "\\setlength{\\fboxrule}{\\oldfboxrule}}\n";
+
+ return true;
+}
+
+bool PerlModGenerator::generateDoxyLatexTex()
+{
+ QFile doxyLatexTex;
+ if (!createOutputFile(doxyLatexTex, pathDoxyLatexTex))
+ return false;
+
+ FTextStream doxyLatexTexStream(&doxyLatexTex);
+ doxyLatexTexStream <<
+ "\\documentclass[a4paper,12pt]{article}\n"
+ "\\usepackage[latin1]{inputenc}\n"
+ "\\usepackage[none]{hyphenat}\n"
+ "\\usepackage[T1]{fontenc}\n"
+ "\\usepackage{hyperref}\n"
+ "\\usepackage{times}\n"
+ "\n"
+ "\\input{doxyformat}\n"
+ "\n"
+ "\\begin{document}\n"
+ "\\input{" << pathDoxyDocsTex << "}\n"
+ "\\sloppy\n"
+ "\\EmitDoxyDocs\n"
+ "\\end{document}\n";
+
+ return true;
+}
+
+void PerlModGenerator::generate()
+{
+ // + classes
+ // + namespaces
+ // + files
+ // - packages
+ // + groups
+ // + related pages
+ // - examples
+
+ QDir perlModDir;
+ if (!createOutputDir(perlModDir))
+ return;
+
+ bool perlmodLatex = Config_getBool("PERLMOD_LATEX");
+
+ pathDoxyDocsPM = perlModDir.absPath() + "/DoxyDocs.pm";
+ pathDoxyStructurePM = perlModDir.absPath() + "/DoxyStructure.pm";
+ pathMakefile = perlModDir.absPath() + "/Makefile";
+ pathDoxyRules = perlModDir.absPath() + "/doxyrules.make";
+
+ if (perlmodLatex) {
+ pathDoxyStructureTex = perlModDir.absPath() + "/doxystructure.tex";
+ pathDoxyFormatTex = perlModDir.absPath() + "/doxyformat.tex";
+ pathDoxyLatexTex = perlModDir.absPath() + "/doxylatex.tex";
+ pathDoxyLatexDVI = perlModDir.absPath() + "/doxylatex.dvi";
+ pathDoxyLatexPDF = perlModDir.absPath() + "/doxylatex.pdf";
+ pathDoxyDocsTex = perlModDir.absPath() + "/doxydocs.tex";
+ pathDoxyLatexPL = perlModDir.absPath() + "/doxylatex.pl";
+ pathDoxyLatexStructurePL = perlModDir.absPath() + "/doxylatex-structure.pl";
+ }
+
+ if (!(generatePerlModOutput()
+ && generateDoxyStructurePM()
+ && generateMakefile()
+ && generateDoxyRules()))
+ return;
+
+ if (perlmodLatex) {
+ if (!(generateDoxyLatexStructurePL()
+ && generateDoxyLatexPL()
+ && generateDoxyLatexTex()
+ && generateDoxyFormatTex()))
+ return;
+ }
+}
+
+void generatePerlMod()
+{
+ PerlModGenerator pmg(Config_getBool("PERLMOD_PRETTY"));
+ pmg.generate();
+}
+
+// Local Variables:
+// c-basic-offset: 2
+// End:
+
+/* This elisp function for XEmacs makes Control-Z transform
+ the text in the region into a valid C string.
+
+ (global-set-key '(control z) (lambda () (interactive)
+ (save-excursion
+ (if (< (mark) (point)) (exchange-point-and-mark))
+ (let ((start (point)) (replacers
+ '(("\\\\" "\\\\\\\\")
+ ("\"" "\\\\\"")
+ ("\t" "\\\\t")
+ ("^.*$" "\"\\&\\\\n\""))))
+ (while replacers
+ (while (re-search-forward (caar replacers) (mark) t)
+ (replace-match (cadar replacers) t))
+ (goto-char start)
+ (setq replacers (cdr replacers)))))))
+*/
diff --git a/src/perlmodgen.h b/src/perlmodgen.h
new file mode 100644
index 0000000..2f13ec5
--- /dev/null
+++ b/src/perlmodgen.h
@@ -0,0 +1,23 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef PERLMODGEN_H
+#define PERLMODGEN_H
+
+class QCString;
+
+extern void setPerlModDoxyfile(const QCString &);
+extern void generatePerlMod();
+
+#endif
diff --git a/src/portable.cpp b/src/portable.cpp
new file mode 100644
index 0000000..7a78131
--- /dev/null
+++ b/src/portable.cpp
@@ -0,0 +1,401 @@
+#include <stdlib.h>
+#include <ctype.h>
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#undef UNICODE
+#include <windows.h>
+#else
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <errno.h>
+extern char **environ;
+#endif
+
+#include <qglobal.h>
+#include <qdatetime.h>
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+#define popen _popen
+#define pclose _pclose
+#endif
+
+#include "portable.h"
+#ifndef NODEBUG
+#include "debug.h"
+#endif
+//#include "doxygen.h"
+
+static double g_sysElapsedTime;
+static QTime g_time;
+
+int portable_system(const char *command,const char *args,bool commandHasConsole)
+{
+
+ if (command==0) return 1;
+
+ QCString fullCmd=command;
+ fullCmd=fullCmd.stripWhiteSpace();
+ if (fullCmd.at(0)!='"' && fullCmd.find(' ')!=-1)
+ {
+ // add quotes around command as it contains spaces and is not quoted already
+ fullCmd="\""+fullCmd+"\"";
+ }
+ fullCmd += " ";
+ fullCmd += args;
+#ifndef NODEBUG
+ Debug::print(Debug::ExtCmd,0,"Executing external command `%s`\n",fullCmd.data());
+#endif
+
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ commandHasConsole=commandHasConsole;
+ /*! taken from the system() manpage on my Linux box */
+ int pid,status=0;
+
+#ifdef _OS_SOLARIS // for Solaris we use vfork since it is more memory efficient
+
+ // on Solaris fork() duplicates the memory usage
+ // so we use vfork instead
+
+ // spawn shell
+ if ((pid=vfork())<0)
+ {
+ status=-1;
+ }
+ else if (pid==0)
+ {
+ execl("/bin/sh","sh","-c",fullCmd.data(),(char*)0);
+ _exit(127);
+ }
+ else
+ {
+ while (waitpid(pid,&status,0 )<0)
+ {
+ if (errno!=EINTR)
+ {
+ status=-1;
+ break;
+ }
+ }
+ }
+ return status;
+
+#else // Other Unices just use fork
+
+ pid = fork();
+ if (pid==-1) return -1;
+ if (pid==0)
+ {
+ const char * argv[4];
+ argv[0] = "sh";
+ argv[1] = "-c";
+ argv[2] = fullCmd.data();
+ argv[3] = 0;
+ execve("/bin/sh",(char * const *)argv,environ);
+ exit(127);
+ }
+ for (;;)
+ {
+ if (waitpid(pid,&status,0)==-1)
+ {
+ if (errno!=EINTR) return -1;
+ }
+ else
+ {
+ if (WIFEXITED(status))
+ {
+ return WEXITSTATUS(status);
+ }
+ else
+ {
+ return status;
+ }
+ }
+ }
+#endif // !_OS_SOLARIS
+
+#else // Win32 specific
+ if (commandHasConsole)
+ {
+ return system(fullCmd);
+ }
+ else
+ {
+ // gswin32 is a GUI api which will pop up a window and run
+ // asynchronously. To prevent both, we use ShellExecuteEx and
+ // WaitForSingleObject (thanks to Robert Golias for the code)
+
+ SHELLEXECUTEINFO sInfo = {
+ sizeof(SHELLEXECUTEINFO), /* structure size */
+ SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI, /* tell us the process
+ * handle so we can wait till it's done |
+ * do not display msg box if error
+ */
+ NULL, /* window handle */
+ NULL, /* action to perform: open */
+ command, /* file to execute */
+ args, /* argument list */
+ NULL, /* use current working dir */
+ SW_HIDE, /* minimize on start-up */
+ 0, /* application instance handle */
+ NULL, /* ignored: id list */
+ NULL, /* ignored: class name */
+ NULL, /* ignored: key class */
+ 0, /* ignored: hot key */
+ NULL, /* ignored: icon */
+ NULL /* resulting application handle */
+ };
+ if (!ShellExecuteEx(&sInfo))
+ {
+ return -1;
+ }
+ else if (sInfo.hProcess) /* executable was launched, wait for it to finish */
+ {
+ WaitForSingleObject(sInfo.hProcess,INFINITE);
+ CloseHandle(sInfo.hProcess);
+ }
+ }
+ return 0;
+#endif
+
+}
+
+uint portable_pid()
+{
+ uint pid;
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ pid = (uint)getpid();
+#else
+ pid = (uint)GetCurrentProcessId();
+#endif
+ return pid;
+}
+
+static char **last_environ;
+
+void portable_setenv(const char *name,const char *value)
+{
+ if (value==0) value="";
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ SetEnvironmentVariable(name,value);
+#else
+ register char **ep = 0;
+ register size_t size;
+ const size_t namelen=strlen(name);
+ const size_t vallen=strlen(value) + 1;
+
+ size = 0;
+ if (environ!=0)
+ {
+ for (ep = environ; *ep; ++ep)
+ {
+ if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
+ break;
+ else
+ ++size;
+ }
+ }
+
+ if (environ==0 || *ep==0) /* add new string */
+ {
+ char **new_environ;
+ if (environ == last_environ && environ!=0)
+ {
+ // We allocated this space; we can extend it.
+ new_environ = (char **) realloc (last_environ, (size + 2) * sizeof (char *));
+ }
+ else
+ {
+ new_environ = (char **) malloc ((size + 2) * sizeof (char *));
+ }
+
+ if (new_environ==0) // no more memory
+ {
+ return;
+ }
+
+ new_environ[size] = (char *)malloc (namelen + 1 + vallen);
+ if (new_environ[size]==0)
+ {
+ free (new_environ);
+ return;
+ }
+
+ if (environ != last_environ)
+ {
+ memcpy ((char *) new_environ, environ, size * sizeof (char *));
+ }
+
+ memcpy(new_environ[size], name, namelen);
+ new_environ[size][namelen] = '=';
+ memcpy(&new_environ[size][namelen + 1], value, vallen);
+ new_environ[size + 1] = 0;
+ last_environ = environ = new_environ;
+ }
+ else /* replace existing string */
+ {
+ size_t len = strlen (*ep);
+ if (len + 1 < namelen + 1 + vallen)
+ {
+ /* The existing string is too short; malloc a new one. */
+ char *newString = (char *)malloc(namelen + 1 + vallen);
+ if (newString==0)
+ {
+ return;
+ }
+ *ep = newString;
+ }
+ memcpy(*ep, name, namelen);
+ (*ep)[namelen] = '=';
+ memcpy(&(*ep)[namelen + 1], value, vallen);
+ }
+
+#endif
+}
+
+void portable_unsetenv(const char *variable)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ SetEnvironmentVariable(variable,0);
+#else
+ /* Some systems don't have unsetenv(), so we do it ourselves */
+ size_t len;
+ char **ep;
+
+ if (variable == NULL || *variable == '\0' || strchr (variable, '=') != NULL)
+ {
+ return; // not properly formatted
+ }
+
+ len = strlen(variable);
+
+ ep = environ;
+ while (*ep != NULL)
+ {
+ if (!strncmp(*ep, variable, len) && (*ep)[len]=='=')
+ {
+ /* Found it. Remove this pointer by moving later ones back. */
+ char **dp = ep;
+ do dp[0] = dp[1]; while (*dp++);
+ /* Continue the loop in case NAME appears again. */
+ }
+ else
+ {
+ ++ep;
+ }
+ }
+#endif
+}
+
+const char *portable_getenv(const char *variable)
+{
+ return getenv(variable);
+}
+
+portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ return _fseeki64(f,offset,whence);
+#else
+ return fseeko(f,offset,whence);
+#endif
+}
+
+portable_off_t portable_ftell(FILE *f)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ return _ftelli64(f);
+#else
+ return ftello(f);
+#endif
+}
+
+FILE *portable_fopen(const char *fileName,const char *mode)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ QString fn(fileName);
+ QString m(mode);
+ return _wfopen((wchar_t*)fn.ucs2(),(wchar_t*)m.ucs2());
+#else
+ return fopen(fileName,mode);
+#endif
+}
+
+char portable_pathSeparator()
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ return '\\';
+#else
+ return '/';
+#endif
+}
+
+char portable_pathListSeparator()
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ return ';';
+#else
+ return ':';
+#endif
+}
+
+const char *portable_ghostScriptCommand()
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ return "gswin32c.exe";
+#else
+ return "gs";
+#endif
+}
+
+const char *portable_commandExtension()
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ return ".exe";
+#else
+ return "";
+#endif
+}
+
+bool portable_fileSystemIsCaseSensitive()
+{
+#if defined(_WIN32) || defined(macintosh) || defined(__MACOSX__) || defined(__APPLE__)
+ return FALSE;
+#else
+ return TRUE;
+#endif
+}
+
+FILE * portable_popen(const char *name,const char *type)
+{
+ return popen(name,type);
+}
+
+int portable_pclose(FILE *stream)
+{
+ return pclose(stream);
+}
+
+void portable_sysTimerStart()
+{
+ g_time.start();
+}
+
+void portable_sysTimerStop()
+{
+ g_sysElapsedTime+=((double)g_time.elapsed())/1000.0;
+}
+
+double portable_getSysElapsedTime()
+{
+ return g_sysElapsedTime;
+}
+
+void portable_sleep(int ms)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ Sleep(ms);
+#else
+ usleep(1000*ms);
+#endif
+}
diff --git a/src/portable.h b/src/portable.h
new file mode 100644
index 0000000..f698e32
--- /dev/null
+++ b/src/portable.h
@@ -0,0 +1,47 @@
+#ifndef PORTABLE_H
+#define PORTABLE_H
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <qglobal.h>
+
+#if defined(_WIN32)
+typedef __int64 portable_off_t;
+#else
+typedef off_t portable_off_t;
+#endif
+
+/** @file
+ * @brief Portable versions of functions that are platform dependent.
+ */
+
+int portable_system(const char *command,const char *args,bool commandHasConsole=TRUE);
+uint portable_pid();
+const char * portable_getenv(const char *variable);
+void portable_setenv(const char *variable,const char *value);
+void portable_unsetenv(const char *variable);
+portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence);
+portable_off_t portable_ftell(FILE *f);
+FILE * portable_fopen(const char *fileName,const char *mode);
+char portable_pathSeparator();
+char portable_pathListSeparator();
+const char * portable_ghostScriptCommand();
+const char * portable_commandExtension();
+bool portable_fileSystemIsCaseSensitive();
+FILE * portable_popen(const char *name,const char *type);
+int portable_pclose(FILE *stream);
+void portable_sysTimerStart();
+void portable_sysTimerStop();
+double portable_getSysElapsedTime();
+void portable_sleep(int ms);
+
+extern "C" {
+ void * portable_iconv_open(const char* tocode, const char* fromcode);
+ size_t portable_iconv (void *cd, const char** inbuf, size_t *inbytesleft,
+ char* * outbuf, size_t *outbytesleft);
+ int portable_iconv_close (void *cd);
+}
+
+
+#endif
+
diff --git a/src/portable_c.c b/src/portable_c.c
new file mode 100644
index 0000000..ab33639
--- /dev/null
+++ b/src/portable_c.c
@@ -0,0 +1,24 @@
+#include <iconv.h>
+
+// These functions are implemented in a C file, because there are different
+// versions of the iconv() prototype, some with a const pointer and some
+// without. In C this is just a warning, but in C++ breaks the compilation.
+// Looking at the LIBICONV_VERSION is not enough, since for MACOSX the
+// const and non-const version exist with the same version of the file.
+
+void * portable_iconv_open(const char* tocode, const char* fromcode)
+{
+ return iconv_open(tocode,fromcode);
+}
+
+size_t portable_iconv (void *cd, const char** inbuf, size_t *inbytesleft,
+ char** outbuf, size_t *outbytesleft)
+{
+ return iconv((iconv_t)cd,inbuf,inbytesleft,outbuf,outbytesleft);
+}
+
+int portable_iconv_close (void *cd)
+{
+ return iconv_close((iconv_t)cd);
+}
+
diff --git a/src/pre.cpp b/src/pre.cpp
new file mode 100644
index 0000000..303441e
--- /dev/null
+++ b/src/pre.cpp
@@ -0,0 +1,7030 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer preYY_create_buffer
+#define yy_delete_buffer preYY_delete_buffer
+#define yy_flex_debug preYY_flex_debug
+#define yy_init_buffer preYY_init_buffer
+#define yy_flush_buffer preYY_flush_buffer
+#define yy_load_buffer_state preYY_load_buffer_state
+#define yy_switch_to_buffer preYY_switch_to_buffer
+#define yyin preYYin
+#define yyleng preYYleng
+#define yylex preYYlex
+#define yylineno preYYlineno
+#define yyout preYYout
+#define yyrestart preYYrestart
+#define yytext preYYtext
+#define yywrap preYYwrap
+#define yyalloc preYYalloc
+#define yyrealloc preYYrealloc
+#define yyfree preYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE preYYrestart(preYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t preYYleng;
+
+extern FILE *preYYin, *preYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up preYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up preYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via preYYrestart()), so that the user can continue scanning by
+ * just pointing preYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when preYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t preYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow preYYwrap()'s to do buffer switches
+ * instead of setting up a fresh preYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void preYYrestart (FILE *input_file );
+void preYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE preYY_create_buffer (FILE *file,int size );
+void preYY_delete_buffer (YY_BUFFER_STATE b );
+void preYY_flush_buffer (YY_BUFFER_STATE b );
+void preYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void preYYpop_buffer_state (void );
+
+static void preYYensure_buffer_stack (void );
+static void preYY_load_buffer_state (void );
+static void preYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER preYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE preYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE preYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE preYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *preYYalloc (yy_size_t );
+void *preYYrealloc (void *,yy_size_t );
+void preYYfree (void * );
+
+#define yy_new_buffer preYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ preYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ preYY_create_buffer(preYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ preYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ preYY_create_buffer(preYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define preYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *preYYin = (FILE *) 0, *preYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int preYYlineno;
+
+int preYYlineno = 1;
+
+extern char *preYYtext;
+#define yytext_ptr preYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up preYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ preYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 166
+#define YY_END_OF_BUFFER 167
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[1240] =
+ { 0,
+ 148, 148, 167, 165, 166, 1, 165, 166, 164, 166,
+ 3, 165, 166, 165, 166, 165, 166, 2, 165, 166,
+ 6, 165, 166, 1, 6, 165, 166, 6, 165, 166,
+ 6, 164, 166, 3, 6, 165, 166, 5, 165, 166,
+ 6, 165, 166, 6, 165, 166, 6, 165, 166, 2,
+ 6, 165, 166, 53, 165, 166, 1, 53, 165, 166,
+ 49, 164, 166, 3, 53, 165, 166, 53, 165, 166,
+ 53, 165, 166, 50, 53, 165, 166, 50, 53, 165,
+ 166, 50, 53, 165, 166, 50, 53, 165, 166, 50,
+ 53, 165, 166, 50, 53, 165, 166, 2, 53, 165,
+
+ 166, 77, 165, 166, 1, 77, 165, 166, 75, 164,
+ 166, 3, 77, 165, 166, 77, 165, 166, 77, 165,
+ 166, 76, 77, 165, 166, 76, 77, 165, 166, 76,
+ 77, 165, 166, 2, 77, 165, 166, 78, 81, 165,
+ 166, 1, 78, 81, 165, 166, 84, 164, 166, 3,
+ 78, 81, 165, 166, 80, 81, 165, 166, 81, 165,
+ 166, 81, 165, 166, 78, 81, 165, 166, 2, 78,
+ 81, 165, 166, 85, 88, 165, 166, 1, 85, 88,
+ 165, 166, 3, 85, 88, 165, 166, 87, 88, 165,
+ 166, 85, 88, 165, 166, 85, 88, 165, 166, 88,
+
+ 165, 166, 2, 85, 88, 165, 166, 23, 165, 166,
+ 1, 23, 165, 166, 24, 164, 166, 3, 23, 165,
+ 166, 16, 23, 165, 166, 23, 165, 166, 23, 165,
+ 166, 23, 165, 166, 21, 23, 165, 166,16404, 23,
+ 165, 166, 21, 23, 165, 166,16404, 11, 23, 165,
+ 166, 12, 23, 165, 166, 2, 23, 165, 166, 17,
+ 165, 166, 1, 17, 165, 166, 19, 165, 166, 17,
+ 165, 166, 17, 165, 166, 165, 166, 2, 17, 165,
+ 166, 165, 166, 1, 165, 166, 3, 165, 166, 165,
+ 166, 165, 166, 2, 165, 166, 90, 165, 166, 94,
+
+ 165, 166, 1, 94, 165, 166, 92, 164, 166, 3,
+ 94, 165, 166, 94, 165, 166, 94, 165, 166, 94,
+ 165, 166, 2, 94, 165, 166, 8289, 165, 166,16479,
+ 16481,16482, 165, 166, 101, 165, 166, 102, 165, 166,
+ 100, 165, 166, 165, 166, 104, 165, 166, 165, 166,
+ 160, 165, 166, 1, 160, 165, 166, 148, 160, 165,
+ 166, 147, 164, 166, 3, 160, 165, 166, 151, 160,
+ 165, 166, 143, 160, 165, 166, 152, 160, 165, 166,
+ 160, 165, 166, 160, 165, 166, 150, 160, 165, 166,
+ 144, 160, 165, 166, 160, 165, 166, 2, 160, 165,
+
+ 166, 70, 165, 166, 1, 70, 165, 166, 69, 164,
+ 166, 3, 70, 165, 166, 70, 165, 166, 70, 165,
+ 166, 2, 70, 165, 166, 68, 70, 165, 166, 1,
+ 68, 70, 165, 166, 68, 70, 165, 166, 68, 69,
+ 164, 166, 3, 68, 70, 165, 166, 67, 70, 165,
+ 166, 68, 70, 165, 166, 68, 70, 165, 166, 2,
+ 68, 70, 165, 166, 120, 122, 165, 166, 1, 122,
+ 165, 166, 121, 164, 166, 3, 120, 122, 165, 166,
+ 122, 165, 166, 122, 165, 166, 120, 122, 165, 166,
+ 122, 165, 166, 2, 120, 122, 165, 166, 123, 145,
+
+ 165, 166, 1, 123, 145, 165, 166, 125, 164, 166,
+ 3, 123, 145, 165, 166, 145, 165, 166, 123, 145,
+ 165, 166, 123, 145, 165, 166, 144, 145, 165, 166,
+ 2, 123, 145, 165, 166, 122, 165, 166, 122, 165,
+ 166, 122, 165, 166, 133, 137, 138, 165, 166, 1,
+ 133, 138, 165, 166, 134, 164, 166, 3, 133, 137,
+ 138, 165, 166, 137, 138, 165, 166, 133, 137, 138,
+ 165, 166, 138, 165, 166, 2, 133, 137, 138, 165,
+ 166, 130, 132, 165, 166, 1, 132, 165, 166, 131,
+ 164, 166, 3, 130, 132, 165, 166, 132, 165, 166,
+
+ 130, 132, 165, 166, 130, 132, 165, 166, 2, 130,
+ 132, 165, 166, 141, 142, 165, 166, 1, 142, 165,
+ 166, 3, 141, 142, 165, 166, 141, 142, 165, 166,
+ 141, 142, 165, 166, 2, 141, 142, 165, 166, 59,
+ 165, 166, 1, 59, 165, 166, 60, 164, 166, 3,
+ 59, 165, 166, 59, 165, 166, 59, 165, 166, 58,
+ 59, 165, 166, 59, 165, 166, 58, 59, 165, 166,
+ 2, 59, 165, 166, 66, 165, 166, 1, 66, 165,
+ 166, 64, 164, 166, 3, 66, 165, 166, 66, 165,
+ 166, 66, 165, 166, 62, 66, 165, 166, 66, 165,
+
+ 166, 2, 66, 165, 166, 65, 66, 165, 166, 63,
+ 66, 165, 166, 158, 165, 166, 1, 158, 165, 166,
+ 3, 158, 165, 166, 155, 158, 165, 166, 158, 165,
+ 166, 158, 165, 166, 158, 165, 166, 2, 158, 165,
+ 166, 159, 165, 166, 1, 159, 165, 166, 3, 159,
+ 165, 166, 157, 159, 165, 166, 159, 165, 166, 159,
+ 165, 166, 159, 165, 166, 2, 159, 165, 166, 54,
+ 165, 166, 52, 165, 166, 1, 52, 165, 166, 3,
+ 52, 165, 166, 52, 165, 166, 52, 165, 166, 52,
+ 165, 166, 2, 52, 165, 166, 31, 165, 166, 1,
+
+ 31, 165, 166, 29, 164, 166, 3, 31, 165, 166,
+ 28, 31, 165, 166, 31, 165, 166, 25, 31, 165,
+ 166, 26, 31, 165, 166, 31, 165, 166, 31, 165,
+ 166, 30, 31, 165, 166, 2, 31, 165, 166, 35,
+ 165, 166, 1, 35, 165, 166, 3, 35, 165, 166,
+ 32, 35, 165, 166, 35, 165, 166, 35, 165, 166,
+ 35, 165, 166, 2, 35, 165, 166, 116, 165, 166,
+ 1, 116, 165, 166, 3, 116, 165, 166, 116, 165,
+ 166, 116, 165, 166, 114, 116, 165, 166, 2, 116,
+ 165, 166, 162, 163, 6, 6, 5, 6, 50, 50,
+
+ 50, 50, 50, 50, 50, 50, 50, 83, 162, 82,
+ 163, 76, 76, 76, 76, 78, 78, 85, 83, 85,
+ 162, 82, 85, 163, 85, 86, 8212, 21,16404, 22,
+ 21,16404, 17, 17, 162, 17, 163, 17, 18, 91,
+ 162, 163, 89, 90, 92, 162, 163, 93, 8289, 8290,
+ 8287, 8289,16479,16481,16482, 102, 101, 102, 100, 104,
+ 104, 99, 148, 149, 105, 162, 106, 163, 144, 146,
+ 68, 68, 67, 120, 107, 109, 162, 108, 163, 120,
+ 123, 124, 123, 163, 123, 119, 119, 162, 133, 137,
+ 133, 137, 135, 137, 162, 136, 137, 163, 133, 137,
+
+ 130, 127, 129, 162, 128, 130, 163, 130, 141, 139,
+ 141, 162, 140, 141, 163, 141, 58, 55, 58, 62,
+ 61, 63, 154, 162, 153, 163, 156, 54, 51, 33,
+ 162, 33, 163, 34, 114, 162, 163, 4,16391, 50,
+ 50, 50, 50, 50, 43, 50, 50, 50, 50, 50,
+ 83, 83, 162, 82, 82, 163, 76, 76, 76, 71,
+ 76, 76, 79, 4, 78, 83, 85, 83, 85, 162,
+ 82, 85, 82, 85, 163, 4, 85, 15, 15, 21,
+ 16404, 17, 162, 17, 163, 4, 17, 162, 163, 4,
+ 4, 91, 162, 163, 4, 96, 103, 149, 105, 105,
+
+ 162, 106, 106, 163, 108, 163, 4, 120, 123, 163,
+ 4, 123, 118, 137, 162, 137, 163, 4, 133, 137,
+ 4, 137, 126, 130, 163, 4, 130, 141, 162, 141,
+ 163, 4, 141, 58, 27, 161,16391, 9, 8199, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 83,
+ 161, 76, 72, 76, 76, 76, 79, 83, 85, 161,
+ 14, 13, 14, 21,16404, 17, 161, 161, 161, 104,
+ 108, 110, 137, 161, 141, 161, 58, 27, 8199, 9,
+ 50, 50, 44, 47, 45, 45, 50, 50, 50, 50,
+ 50, 50, 50, 73, 76, 74, 76, 76, 13, 21,
+
+ 16404, 112, 58, 8, 9, 50, 50, 48, 40, 39,
+ 50, 50, 50, 46, 21,16404, 111, 113, 115, 58,
+ 9, 38, 42, 41,16420, 37, 10, 58, 9, 8228,
+ 57, 56, 9, 8228, 117, 9, 9, 9, 9
+ } ;
+
+static yyconst flex_int16_t yy_accept[1158] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 4, 6, 9,
+ 11, 14, 16, 18, 21, 24, 28, 31, 34, 38,
+ 41, 44, 47, 50, 54, 57, 61, 64, 68, 71,
+ 74, 78, 82, 86, 90, 94, 98, 102, 105, 109,
+
+ 112, 116, 119, 122, 126, 130, 134, 138, 142, 147,
+ 150, 155, 159, 162, 165, 169, 174, 178, 183, 188,
+ 192, 196, 200, 203, 208, 211, 215, 218, 222, 226,
+ 229, 232, 235, 240, 243, 248, 252, 256, 260, 263,
+ 267, 270, 273, 276, 278, 282, 284, 287, 290, 292,
+ 294, 297, 300, 303, 307, 310, 314, 317, 320, 323,
+ 327, 333, 335, 338, 341, 344, 346, 349, 351, 354,
+ 358, 362, 365, 369, 373, 377, 381, 384, 387, 391,
+ 395, 398, 402, 405, 409, 412, 416, 419, 422, 426,
+ 430, 435, 439, 443, 448, 452, 456, 460, 465, 469,
+
+ 473, 476, 481, 484, 487, 491, 494, 499, 503, 508,
+ 511, 516, 519, 523, 527, 531, 536, 539, 542, 545,
+ 550, 555, 558, 564, 568, 573, 576, 582, 586, 590,
+ 593, 598, 601, 605, 609, 614, 618, 622, 627, 631,
+ 635, 640, 643, 647, 650, 654, 657, 660, 664, 667,
+ 671, 675, 678, 682, 685, 689, 692, 695, 699, 702,
+ 706, 710, 714, 717, 721, 725, 729, 732, 735, 738,
+ 742, 745, 749, 753, 757, 760, 763, 766, 770, 773,
+ 776, 780, 784, 787, 790, 793, 797, 800, 804, 807,
+ 811, 815, 818, 822, 826, 829, 832, 836, 840, 843,
+
+ 847, 851, 855, 858, 861, 864, 868, 871, 875, 879,
+ 882, 885, 889, 893, 894, 895, 895, 896, 897, 898,
+ 899, 899, 899, 899, 900, 901, 902, 903, 904, 905,
+ 906, 907, 908, 910, 912, 913, 914, 915, 916, 917,
+ 917, 917, 918, 919, 922, 925, 926, 927, 927, 927,
+ 927, 928, 930, 931, 931, 933, 934, 936, 938, 939,
+ 940, 940, 941, 942, 943, 943, 943, 944, 945, 945,
+ 946, 947, 948, 948, 949, 949, 950, 951, 952, 956,
+ 956, 956, 957, 958, 959, 960, 960, 961, 961, 962,
+ 963, 964, 964, 965, 967, 969, 970, 971, 971, 972,
+
+ 973, 974, 975, 976, 978, 980, 981, 981, 981, 981,
+ 981, 981, 981, 981, 981, 981, 981, 982, 983, 985,
+ 986, 987, 989, 989, 989, 991, 992, 993, 996, 999,
+ 1001, 1001, 1002, 1003, 1005, 1008, 1009, 1010, 1013, 1016,
+ 1017, 1018, 1019, 1019, 1020, 1021, 1022, 1023, 1025, 1027,
+ 1028, 1029, 1030, 1030, 1030, 1030, 1032, 1034, 1035, 1036,
+ 1037, 1038, 1039, 1039, 1039, 1040, 1041, 1042, 1043, 1044,
+ 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1054, 1055,
+ 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1063, 1064, 1064,
+ 1064, 1066, 1068, 1071, 1073, 1076, 1078, 1079, 1079, 1080,
+
+ 1080, 1080, 1082, 1084, 1086, 1088, 1089, 1090, 1091, 1093,
+ 1094, 1095, 1096, 1097, 1097, 1098, 1098, 1099, 1100, 1102,
+ 1103, 1105, 1107, 1109, 1109, 1109, 1109, 1109, 1109, 1109,
+ 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109,
+ 1109, 1109, 1111, 1113, 1113, 1114, 1116, 1118, 1121, 1123,
+ 1123, 1123, 1124, 1126, 1128, 1130, 1132, 1134, 1135, 1135,
+ 1136, 1136, 1136, 1137, 1137, 1138, 1138, 1139, 1139, 1140,
+ 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150,
+ 1152, 1153, 1155, 1156, 1157, 1157, 1158, 1158, 1161, 1162,
+ 1164, 1164, 1164, 1166, 1168, 1169, 1170, 1171, 1172, 1172,
+
+ 1172, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173,
+ 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1175,
+ 1177, 1178, 1178, 1179, 1179, 1179, 1179, 1179, 1179, 1180,
+ 1180, 1181, 1181, 1182, 1183, 1185, 1186, 1187, 1188, 1189,
+ 1190, 1191, 1192, 1193, 1194, 1195, 1195, 1196, 1198, 1199,
+ 1199, 1199, 1200, 1200, 1200, 1202, 1202, 1202, 1202, 1202,
+ 1202, 1202, 1202, 1202, 1202, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1204, 1204, 1204, 1204, 1204, 1204, 1205, 1205, 1206,
+ 1206, 1207, 1208, 1208, 1208, 1209, 1210, 1211, 1212, 1213,
+
+ 1214, 1215, 1215, 1215, 1217, 1218, 1218, 1218, 1218, 1218,
+ 1218, 1218, 1219, 1220, 1220, 1220, 1220, 1220, 1220, 1220,
+ 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220,
+ 1221, 1221, 1221, 1221, 1222, 1222, 1223, 1223, 1224, 1225,
+ 1226, 1227, 1227, 1227, 1227, 1227, 1228, 1228, 1228, 1228,
+ 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228,
+ 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1229, 1229, 1229,
+ 1229, 1230, 1230, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1232, 1233, 1233, 1233, 1233, 1234, 1234,
+
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1237, 1237,
+ 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
+ 1237, 1237, 1237, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1239, 1239, 1239, 1239, 1239, 1239,
+ 1239, 1239, 1239, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 2, 1, 1, 3, 4,
+ 1, 1, 5, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 3, 6, 7, 8, 9, 1, 1, 10, 11,
+ 12, 13, 1, 14, 15, 16, 17, 18, 19, 18,
+ 18, 18, 18, 18, 18, 20, 20, 21, 1, 22,
+ 23, 24, 25, 26, 27, 27, 28, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 29, 30, 31, 1, 27, 1, 32, 33, 34, 35,
+
+ 36, 37, 38, 39, 40, 38, 41, 42, 43, 44,
+ 45, 46, 38, 47, 48, 49, 50, 51, 38, 52,
+ 53, 38, 54, 1, 55, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[57] =
+ { 0,
+ 1, 2, 3, 4, 5, 6, 7, 1, 1, 8,
+ 9, 6, 10, 1, 11, 12, 13, 14, 14, 14,
+ 1, 15, 6, 6, 1, 16, 17, 17, 1, 18,
+ 1, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 1, 1, 1
+ } ;
+
+static yyconst flex_int16_t yy_base[1265] =
+ { 0,
+ 0, 4, 9, 64, 120, 0, 176, 0, 26, 37,
+ 231, 235, 291, 0, 346, 350, 357, 383, 439, 0,
+ 53, 494, 524, 0, 577, 0, 633, 0, 59, 498,
+ 688, 692, 697, 702, 757, 812, 868, 0, 923, 978,
+ 716, 730, 763, 787, 793, 803, 1034, 0, 1090, 0,
+ 1135, 0, 930, 937, 941, 959, 1162, 0, 1214, 1218,
+ 1273, 1328, 1225, 1262, 1384, 0, 2823, 5434, 5434, 5434,
+ 5434, 2, 2793, 5434, 5434, 5434, 71, 5434, 5434, 5434,
+ 3, 2791, 77, 5434, 5434, 5434, 5434, 5434, 5, 2785,
+ 0, 2766, 2768, 4, 57, 2755, 5434, 5434, 5434, 5434,
+
+ 5434, 10, 2773, 0, 8, 2750, 5434, 0, 0, 5434,
+ 0, 5434, 2756, 32, 2756, 0, 0, 0, 0, 5434,
+ 58, 2755, 0, 0, 5434, 5434, 5434, 5434, 5434, 2742,
+ 60, 2739, 103, 33, 725, 5434, 5434, 5434, 0, 0,
+ 5434, 73, 2738, 0, 0, 0, 78, 227, 240, 234,
+ 238, 29, 2757, 2755, 5434, 2749, 99, 242, 106, 2739,
+ 362, 0, 2737, 2728, 2722, 2702, 247, 2708, 5434, 5434,
+ 110, 5434, 5434, 5434, 2699, 5434, 253, 2681, 5434, 0,
+ 239, 5434, 5434, 5434, 5434, 5434, 255, 2679, 5434, 5434,
+ 5434, 246, 5434, 5434, 5434, 256, 2678, 5434, 0, 5434,
+
+ 5434, 0, 2672, 258, 2659, 1415, 0, 0, 0, 5434,
+ 0, 2665, 261, 2656, 0, 0, 2661, 263, 245, 366,
+ 0, 5434, 367, 266, 376, 83, 377, 0, 5434, 5434,
+ 0, 2656, 271, 2647, 0, 0, 5434, 0, 272, 2645,
+ 0, 5434, 5434, 5434, 5434, 273, 2644, 0, 391, 2628,
+ 5434, 5434, 5434, 5434, 5434, 343, 2638, 0, 2656, 5434,
+ 5434, 0, 5434, 5434, 5434, 5434, 386, 2634, 0, 5434,
+ 5434, 5434, 5434, 5434, 392, 2632, 0, 5434, 0, 5434,
+ 5434, 5434, 397, 2628, 393, 5434, 5434, 5434, 5434, 5434,
+ 5434, 2620, 5434, 5434, 398, 2624, 5434, 5434, 5434, 5434,
+
+ 5434, 5434, 399, 2623, 0, 5434, 5434, 5434, 5434, 404,
+ 2621, 0, 5434, 2606, 2600, 0, 5434, 501, 5434, 494,
+ 415, 408, 507, 0, 2576, 2519, 382, 2520, 705, 2507,
+ 2509, 2506, 2523, 2492, 0, 383, 2471, 800, 0, 2480,
+ 406, 1462, 0, 523, 525, 1481, 5434, 2478, 417, 534,
+ 5434, 720, 5434, 2482, 970, 0, 2472, 2462, 1500, 5434,
+ 365, 5434, 730, 524, 1519, 426, 5434, 505, 2457, 5434,
+ 345, 387, 1540, 5434, 2455, 747, 5434, 5434, 760, 2445,
+ 374, 2445, 2443, 2439, 2436, 2416, 504, 2414, 530, 5434,
+ 425, 2421, 2424, 534, 709, 0, 5434, 2422, 5434, 541,
+
+ 5434, 0, 5434, 421, 2404, 1559, 1550, 2375, 2368, 2363,
+ 2338, 2343, 2342, 2322, 2330, 2322, 0, 5434, 2346, 1597,
+ 5434, 2349, 2313, 784, 693, 0, 0, 2343, 2319, 1620,
+ 2280, 0, 695, 2307, 2302, 1639, 0, 2304, 2288, 1658,
+ 0, 5434, 2300, 2265, 0, 5434, 0, 2285, 2269, 5434,
+ 0, 5434, 2281, 2269, 720, 2256, 2246, 5434, 0, 2231,
+ 5434, 5434, 767, 2234, 1242, 2204, 2199, 2197, 2196, 2191,
+ 5434, 2184, 2172, 2160, 2157, 2156, 0, 2172, 0, 0,
+ 2148, 2144, 2136, 5434, 2132, 2131, 2155, 5434, 2142, 812,
+ 0, 745, 816, 766, 794, 0, 5434, 2133, 2123, 822,
+
+ 847, 995, 2115, 0, 0, 838, 778, 802, 5434, 777,
+ 2126, 2125, 5434, 823, 5434, 2108, 2120, 5434, 2102, 5434,
+ 5434, 2094, 0, 2065, 2063, 948, 2058, 2069, 2068, 2045,
+ 2057, 2048, 656, 2033, 2046, 2035, 2028, 2031, 2035, 2019,
+ 2023, 0, 0, 2018, 5434, 2034, 0, 767, 0, 1999,
+ 853, 5434, 0, 0, 2025, 0, 0, 1999, 2028, 5434,
+ 2027, 847, 5434, 2024, 1290, 1255, 1268, 1302, 5434, 1991,
+ 1982, 927, 1682, 1985, 1977, 1977, 1964, 1960, 1971, 0,
+ 1006, 796, 1969, 1959, 1984, 5434, 995, 922, 5434, 5434,
+ 1006, 1017, 1145, 0, 840, 1984, 5434, 1966, 1945, 1926,
+
+ 5434, 1931, 1914, 1917, 1919, 1908, 1911, 1910, 1909, 1148,
+ 1906, 1895, 1891, 1880, 1871, 1881, 1865, 1308, 0, 0,
+ 1859, 1892, 5434, 1008, 966, 1316, 1443, 984, 1153, 1310,
+ 1478, 1556, 1845, 1838, 5434, 5434, 928, 1833, 1738, 1155,
+ 1831, 1814, 1827, 1852, 5434, 956, 1817, 0, 1222, 1840,
+ 1824, 5434, 1818, 1358, 1534, 1791, 1156, 1775, 1779, 1764,
+ 1763, 1644, 1627, 1233, 1248, 1622, 1615, 1601, 1604, 1603,
+ 1609, 1592, 1589, 1580, 1574, 1586, 1581, 1562, 1569, 1561,
+ 1560, 1585, 1584, 1612, 1792, 1007, 5434, 1795, 1798, 1802,
+ 1554, 1583, 989, 1543, 5434, 1223, 5434, 1238, 1279, 1543,
+
+ 1570, 1531, 1362, 1807, 1321, 1522, 1514, 1514, 1510, 1517,
+ 1504, 1371, 5434, 1374, 1503, 1496, 1490, 1491, 1486, 1469,
+ 1472, 1474, 1458, 1452, 1445, 1446, 1452, 1441, 1438, 1441,
+ 1817, 1821, 1827, 1832, 1836, 1467, 1251, 1297, 5434, 1449,
+ 5434, 1346, 1497, 1840, 1441, 5434, 1421, 1416, 1417, 1411,
+ 1395, 1401, 1407, 1341, 1338, 1328, 1305, 1308, 1293, 1305,
+ 1294, 1298, 1282, 1272, 1283, 1265, 1301, 1855, 1861, 1874,
+ 1880, 1884, 0, 1516, 1893, 1296, 1255, 1217, 1203, 1187,
+ 1177, 1140, 0, 1138, 1122, 1112, 1109, 980, 979, 963,
+ 969, 950, 1369, 5434, 1908, 1914, 1903, 1918, 1927, 0,
+
+ 1595, 1938, 1947, 937, 943, 929, 5434, 912, 912, 905,
+ 884, 825, 805, 806, 1955, 1961, 1966, 1974, 1981, 1635,
+ 1986, 1624, 774, 779, 713, 692, 659, 503, 464, 1995,
+ 2000, 2020, 2026, 2029, 1654, 2041, 2014, 379, 328, 234,
+ 2052, 2055, 2058, 2066, 2081, 1888, 2085, 2094, 202, 2110,
+ 2113, 2100, 2123, 2137, 2142, 2152, 2133, 2157, 2167, 2170,
+ 2179, 2146, 2190, 2205, 2193, 2214, 2219, 2199, 2224, 2233,
+ 2210, 2238, 2247, 2252, 2257, 2267, 2262, 2272, 2277, 2286,
+ 2289, 2292, 2304, 2307, 2319, 2310, 2324, 2334, 2329, 2339,
+ 2344, 2349, 2356, 2365, 2374, 2381, 2386, 2377, 2391, 2401,
+
+ 2396, 2406, 2411, 2420, 2430, 2440, 2433, 2449, 2459, 2453,
+ 2464, 2473, 2468, 2478, 2488, 2493, 2497, 2507, 2500, 2512,
+ 2521, 2516, 2526, 2541, 2530, 2546, 2555, 2535, 2560, 2569,
+ 2564, 2574, 2583, 2578, 2588, 2593, 2598, 2602, 2617, 2607,
+ 2622, 2631, 2611, 2640, 2651, 2626, 2663, 2672, 2636, 2683,
+ 2688, 2693, 2697, 2706, 2711, 2716, 2725, 2719, 2730, 2741,
+ 2734, 2746, 2751, 2763, 2766, 2771, 2780, 2786, 2789, 2798,
+ 2803, 2808, 2817, 2824, 2833, 2827, 2842, 2852, 2845, 2861,
+ 2871, 2864, 2880, 2885, 2890, 2897, 2900, 2909, 2912, 2917,
+ 2926, 2929, 2938, 2932, 2947, 2957, 2943, 2962, 2971, 2952,
+
+ 2980, 2991, 2984, 2996, 3005, 3000, 3010, 3015, 3024, 3028,
+ 3037, 3031, 3046, 3057, 3062, 3068, 3077, 3071, 3089, 3092,
+ 3101, 3104, 3115, 3109, 3124, 3129, 3134, 3138, 3147, 3156,
+ 3161, 3170, 3175, 3181, 3186, 3191, 3195, 3200, 3209, 3212,
+ 3215, 3227, 3230, 3239, 3233, 3244, 3253, 3248, 3262, 3267,
+ 3272, 3279, 3292, 3301, 3305, 3308, 3319, 3324, 3327, 3336,
+ 76, 3340, 3345, 3349, 3354, 3360, 3365, 3371, 3380, 3384,
+ 3393, 3402, 3397, 3407, 3412, 3417, 3423, 3426, 5, 3432,
+ 3436, 3439, 3445, 3449, 3454, 3459, 3464, 3469, 3478, 3484,
+ 3491, 3497, 3501, 3506, 3511, 3516, 3521, 3524, 3530, 3536,
+
+ 3539, 3543, 3549, 3553, 3558, 3563, 3568, 3576, 3582, 3591,
+ 3595, 3601, 3605, 3610, 3615, 3620, 3623, 3628, 3634, 3637,
+ 3643, 3647, 3653, 3657, 3662, 3667, 3675, 3680, 3689, 3695,
+ 3699, 3705, 3709, 3714, 3719, 3722, 3727, 3732, 3735, 3741,
+ 3747, 3751, 3757, 3761, 3766, 3774, 3779, 3787, 3793, 3799,
+ 3803, 3809, 3813, 3818, 3821, 5434, 3875, 3893, 3911, 3929,
+ 3947, 3965, 3983, 4001, 4019, 4037, 4055, 4073, 4091, 4109,
+ 4127, 4145, 4163, 4181, 4199, 846, 1016, 4217, 4235, 4253,
+ 4270, 4288, 4304, 4321, 4338, 4356, 4372, 4389, 4404, 4420,
+ 1207, 4437, 4455, 4472, 4490, 4507, 4524, 4541, 4559, 1251,
+
+ 1274, 1354, 4577, 1446, 4595, 4613, 4621, 4633, 4648, 1461,
+ 4666, 4684, 1499, 4702, 4720, 4737, 4755, 4772, 4790, 4808,
+ 4824, 4841, 4858, 4874, 4891, 4906, 4922, 1539, 4939, 4957,
+ 4974, 4992, 5009, 5026, 5043, 5061, 1558, 1574, 1638, 1657,
+ 5079, 5096, 5104, 5121, 5139, 1662, 5157, 5175, 1855, 5193,
+ 5210, 5228, 5246, 5264, 5279, 5296, 5313, 5331, 5348, 5366,
+ 5383, 5398, 1919, 5415
+ } ;
+
+static yyconst flex_int16_t yy_def[1265] =
+ { 0,
+ 1157, 1157, 1157, 1158, 1156, 5, 1156, 7, 1159, 1159,
+ 1160, 1160, 1156, 13, 1161, 1161, 1162, 1162, 1156, 19,
+ 1163, 1163, 19, 23, 1156, 25, 1156, 27, 1164, 1165,
+ 1157, 1157, 1157, 1157, 1166, 1166, 1156, 37, 1166, 1166,
+ 1167, 1167, 1168, 1168, 1169, 1169, 1156, 47, 1156, 49,
+ 49, 51, 1170, 1170, 1171, 1171, 23, 57, 1172, 1172,
+ 1173, 1173, 1174, 1174, 1156, 65, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1175, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1176, 1176, 1176, 1176, 1176, 1176, 1156, 1156, 1156, 1156,
+
+ 1156, 1156, 1156, 1177, 1177, 1177, 1156, 1178, 1178, 1156,
+ 1178, 1156, 1179, 1156, 1178, 1178, 1180, 1180, 1180, 1156,
+ 1180, 1180, 1181, 1180, 1156, 1156, 1156, 1156, 1156, 1182,
+ 1156, 1156, 1183, 1156, 1183, 1156, 1156, 1156, 1184, 1184,
+ 1156, 1184, 1184, 1185, 1184, 1186, 1186, 1186, 1186, 1186,
+ 1186, 1187, 1188, 1188, 1156, 1188, 1188, 1188, 1156, 1188,
+ 1189, 1156, 1156, 1156, 1156, 1156, 1190, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1191,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1192, 1156, 1156, 1156, 1156, 1156, 1156, 1193, 1156,
+
+ 1156, 1193, 1156, 1156, 1193, 1156, 1193, 1194, 1194, 1156,
+ 1194, 1156, 1194, 1194, 1191, 1194, 1156, 1156, 1156, 1195,
+ 1196, 1156, 1195, 1197, 1195, 1156, 1195, 1198, 1156, 1156,
+ 1198, 1156, 1198, 1198, 1198, 1199, 1156, 1199, 1199, 1199,
+ 1199, 1156, 1156, 1156, 1156, 1156, 1156, 1200, 1156, 1200,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1201, 1156, 1156,
+ 1156, 1202, 1156, 1156, 1156, 1156, 1156, 1156, 1203, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1203, 1156, 1204, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1205, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+
+ 1156, 1156, 1156, 1156, 1206, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1207, 1156, 1156, 1156, 1208, 1156, 1175, 1156, 1156,
+ 1156, 1209, 1156, 1210, 1210, 1210, 1210, 1210, 1210, 1210,
+ 1210, 1210, 1211, 1212, 1213, 1213, 1213, 1213, 1214, 1215,
+ 1216, 1214, 1217, 1218, 1219, 1217, 1156, 1156, 1220, 1156,
+ 1156, 1221, 1156, 1156, 1221, 1222, 1222, 1222, 1222, 1156,
+ 1223, 1156, 1223, 1223, 1223, 1156, 1156, 1224, 1225, 1156,
+ 1225, 1225, 1225, 1156, 1156, 1156, 1156, 1156, 1226, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1227, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1228, 1156, 1156, 1156, 1229,
+
+ 1156, 1230, 1156, 1156, 1156, 1230, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1231, 1156, 1231, 1231,
+ 1156, 1156, 1156, 1156, 1232, 1233, 1234, 1234, 1234, 1232,
+ 1156, 1235, 1156, 1156, 1235, 1235, 1236, 1236, 1236, 1236,
+ 1237, 1156, 1156, 1237, 1238, 1156, 1239, 1156, 1156, 1156,
+ 1240, 1156, 1156, 1241, 1242, 1156, 1156, 1156, 1243, 1156,
+ 1156, 1156, 1244, 1245, 1156, 1246, 1246, 1246, 1246, 1246,
+ 1156, 1246, 1246, 1246, 1246, 1246, 1247, 1247, 1248, 1248,
+ 1249, 1249, 1249, 1156, 1249, 1249, 1250, 1156, 1156, 1156,
+ 1251, 1252, 1252, 1253, 1253, 1254, 1156, 1156, 1156, 1156,
+
+ 1156, 1255, 1256, 1256, 1256, 1257, 1257, 1257, 1156, 1225,
+ 1225, 1225, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1230, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1231, 1231, 1156, 1156, 1234, 1234, 1232, 1234, 1156,
+ 1156, 1156, 1235, 1235, 1236, 1236, 1236, 1237, 1258, 1156,
+ 1156, 1156, 1156, 1245, 1259, 1156, 1156, 1156, 1156, 1246,
+ 1246, 1246, 1156, 1246, 1246, 1246, 1246, 1246, 1246, 1247,
+ 1249, 1249, 1249, 1249, 1260, 1156, 1156, 1252, 1156, 1156,
+ 1156, 1156, 1255, 1256, 1257, 1225, 1156, 1156, 1156, 1156,
+
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1234, 1236,
+ 1237, 1261, 1156, 1156, 1259, 1259, 1259, 1156, 1259, 1156,
+ 1156, 1156, 1246, 1246, 1156, 1156, 1156, 1246, 1156, 1246,
+ 1246, 1246, 1246, 1246, 1156, 1156, 1249, 1249, 1249, 1156,
+ 1156, 1156, 1156, 1156, 1255, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1237, 1156, 1156, 1259, 1259, 1156, 1156, 1156, 1156, 1156,
+ 1246, 1246, 1156, 1156, 1156, 1156, 1156, 1246, 1246, 1246,
+
+ 1156, 1156, 1156, 1255, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1237,
+ 1259, 1259, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1262,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1237, 1259, 1259, 1156,
+ 1156, 1156, 1263, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1264, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1259, 1259, 1156, 1156, 1156, 1263,
+
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1259, 1259, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1259,
+ 1259, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1259, 1259, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1259,
+ 1259, 1156, 1156, 1156, 1156, 1156, 1156, 1259, 1259, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 0, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156
+ } ;
+
+static yyconst flex_int16_t yy_nxt[5491] =
+ { 0,
+ 1156, 69, 381, 70, 71, 69, 362, 70, 71, 1156,
+ 69, 382, 70, 71, 314, 314, 72, 314, 315, 315,
+ 72, 315, 333, 362, 73, 72, 334, 109, 73, 110,
+ 111, 366, 112, 73, 1156, 113, 353, 354, 109, 367,
+ 110, 111, 114, 112, 333, 327, 113, 328, 334, 336,
+ 115, 337, 1156, 114, 154, 74, 155, 156, 746, 74,
+ 184, 115, 185, 186, 74, 76, 77, 78, 79, 157,
+ 344, 80, 314, 318, 345, 187, 315, 158, 319, 321,
+ 81, 116, 159, 188, 362, 357, 351, 322, 82, 358,
+ 83, 83, 116, 329, 323, 323, 323, 320, 320, 330,
+
+ 331, 362, 370, 323, 323, 350, 350, 350, 160, 374,
+ 375, 371, 391, 351, 189, 372, 431, 392, 410, 84,
+ 85, 86, 85, 87, 88, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 89, 85, 85, 85,
+ 85, 85, 85, 85, 90, 85, 91, 91, 85, 85,
+ 85, 91, 91, 92, 93, 94, 91, 91, 91, 95,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 96,
+ 91, 91, 91, 85, 85, 97, 98, 99, 98, 100,
+ 101, 98, 98, 98, 98, 98, 98, 98, 98, 98,
+ 98, 98, 102, 98, 98, 98, 98, 98, 98, 98,
+
+ 103, 98, 104, 104, 98, 98, 98, 104, 104, 104,
+ 104, 105, 104, 104, 104, 106, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104, 104, 98,
+ 98, 107, 118, 362, 70, 119, 118, 120, 70, 119,
+ 362, 120, 397, 398, 362, 370, 362, 121, 400, 387,
+ 362, 121, 363, 401, 545, 122, 364, 362, 365, 122,
+ 123, 362, 388, 362, 123, 394, 373, 333, 333, 395,
+ 404, 334, 334, 314, 405, 422, 545, 419, 428, 315,
+ 423, 424, 429, 434, 438, 314, 124, 435, 439, 315,
+ 124, 125, 126, 125, 127, 128, 125, 129, 125, 125,
+
+ 130, 125, 125, 125, 125, 125, 125, 131, 125, 125,
+ 125, 125, 125, 125, 125, 132, 125, 133, 133, 125,
+ 134, 125, 133, 133, 133, 133, 135, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 136, 137, 138, 140, 370, 70,
+ 71, 140, 141, 70, 71, 314, 141, 510, 147, 315,
+ 70, 148, 142, 68, 376, 377, 142, 426, 426, 849,
+ 143, 362, 378, 149, 143, 144, 381, 426, 426, 144,
+ 68, 150, 427, 427, 147, 382, 70, 148, 362, 68,
+ 370, 380, 427, 427, 442, 443, 452, 453, 448, 149,
+
+ 430, 145, 449, 511, 314, 145, 68, 150, 315, 314,
+ 314, 456, 151, 315, 315, 457, 314, 321, 464, 465,
+ 315, 468, 481, 490, 490, 322, 499, 391, 366, 469,
+ 482, 545, 392, 460, 500, 500, 367, 403, 151, 68,
+ 69, 68, 70, 71, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 72, 68, 68, 68, 68,
+ 68, 68, 68, 73, 68, 152, 152, 68, 68, 68,
+ 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 68, 68, 74, 154, 321, 155, 156, 191,
+
+ 192, 193, 194, 318, 322, 195, 387, 366, 319, 321,
+ 157, 323, 323, 323, 196, 367, 545, 322, 158, 388,
+ 323, 323, 197, 159, 323, 323, 323, 320, 320, 477,
+ 362, 479, 387, 323, 323, 493, 501, 501, 501, 518,
+ 507, 495, 840, 400, 351, 388, 519, 362, 401, 160,
+ 161, 161, 477, 198, 479, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 68, 69, 162,
+ 70, 71, 68, 68, 68, 68, 68, 163, 164, 68,
+ 165, 68, 166, 72, 68, 68, 68, 68, 68, 68,
+
+ 68, 73, 68, 167, 167, 68, 168, 68, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 68, 68, 74, 169, 170, 171, 172, 173, 169, 174,
+ 175, 169, 176, 169, 169, 169, 169, 169, 169, 177,
+ 169, 169, 169, 169, 169, 169, 169, 178, 179, 180,
+ 180, 169, 181, 169, 180, 180, 180, 180, 180, 180,
+ 180, 180, 180, 180, 180, 180, 180, 180, 180, 180,
+ 180, 180, 180, 180, 180, 180, 169, 169, 182, 69,
+ 608, 70, 71, 69, 426, 70, 71, 551, 69, 609,
+
+ 70, 71, 552, 69, 72, 70, 71, 471, 72, 427,
+ 471, 545, 73, 72, 520, 471, 73, 221, 72, 222,
+ 223, 73, 350, 350, 350, 521, 73, 350, 350, 350,
+ 351, 221, 224, 222, 223, 351, 362, 562, 562, 472,
+ 225, 226, 506, 74, 545, 226, 224, 74, 473, 376,
+ 377, 477, 74, 362, 225, 226, 839, 74, 200, 226,
+ 201, 202, 376, 377, 229, 513, 230, 231, 426, 203,
+ 378, 227, 479, 204, 477, 232, 355, 464, 465, 233,
+ 370, 205, 206, 427, 362, 227, 206, 234, 229, 380,
+ 230, 231, 545, 596, 237, 479, 222, 238, 646, 232,
+
+ 479, 362, 484, 233, 237, 484, 222, 238, 362, 239,
+ 484, 234, 207, 200, 545, 201, 202, 240, 235, 239,
+ 838, 586, 477, 479, 203, 362, 657, 240, 204, 587,
+ 587, 590, 588, 378, 485, 647, 205, 206, 545, 591,
+ 591, 206, 235, 486, 362, 477, 362, 829, 241, 592,
+ 592, 592, 380, 828, 595, 551, 623, 351, 241, 324,
+ 552, 362, 324, 362, 624, 624, 827, 207, 208, 209,
+ 208, 210, 211, 208, 208, 208, 208, 208, 208, 208,
+ 212, 208, 208, 208, 213, 208, 208, 208, 208, 208,
+ 208, 208, 214, 208, 215, 215, 208, 208, 208, 215,
+
+ 215, 215, 215, 215, 215, 215, 215, 215, 215, 215,
+ 215, 215, 215, 215, 215, 215, 215, 215, 215, 215,
+ 215, 208, 208, 216, 200, 826, 201, 202, 477, 635,
+ 693, 264, 635, 70, 265, 217, 266, 635, 264, 218,
+ 70, 265, 272, 266, 70, 273, 267, 205, 219, 825,
+ 274, 477, 219, 267, 268, 824, 601, 275, 646, 269,
+ 272, 268, 70, 273, 610, 276, 269, 694, 274, 1156,
+ 277, 657, 350, 350, 350, 275, 601, 628, 207, 200,
+ 351, 201, 202, 276, 823, 270, 686, 687, 277, 657,
+ 217, 693, 270, 814, 218, 702, 278, 350, 350, 350,
+
+ 813, 601, 205, 219, 488, 351, 812, 219, 645, 686,
+ 687, 645, 651, 651, 278, 652, 645, 560, 502, 654,
+ 654, 654, 811, 653, 653, 683, 683, 351, 694, 335,
+ 593, 810, 335, 207, 242, 243, 242, 244, 245, 242,
+ 242, 242, 242, 242, 242, 242, 242, 242, 242, 242,
+ 246, 242, 242, 242, 242, 242, 242, 242, 247, 242,
+ 248, 248, 242, 249, 242, 248, 248, 248, 250, 248,
+ 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
+ 248, 248, 248, 248, 248, 248, 248, 242, 242, 251,
+ 252, 253, 252, 254, 255, 252, 252, 252, 252, 252,
+
+ 252, 252, 252, 252, 252, 252, 256, 252, 252, 252,
+ 252, 252, 252, 252, 257, 252, 258, 258, 252, 259,
+ 252, 258, 258, 258, 258, 258, 258, 258, 258, 258,
+ 258, 258, 258, 258, 258, 258, 258, 258, 258, 258,
+ 258, 258, 258, 252, 252, 260, 261, 350, 350, 350,
+ 665, 665, 665, 809, 610, 351, 1156, 696, 705, 705,
+ 705, 262, 262, 808, 628, 697, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262, 279, 279,
+ 610, 655, 657, 279, 279, 279, 279, 279, 279, 279,
+
+ 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
+ 279, 279, 279, 279, 279, 281, 806, 87, 282, 281,
+ 396, 87, 282, 396, 484, 696, 300, 484, 70, 301,
+ 283, 302, 484, 697, 283, 712, 713, 714, 284, 657,
+ 738, 303, 284, 285, 566, 567, 568, 285, 739, 304,
+ 665, 665, 665, 635, 305, 657, 635, 630, 631, 632,
+ 805, 635, 569, 300, 441, 70, 301, 441, 302, 286,
+ 632, 632, 632, 286, 288, 569, 289, 290, 303, 291,
+ 306, 740, 292, 293, 294, 741, 304, 445, 569, 295,
+ 445, 305, 626, 567, 627, 569, 804, 296, 297, 738,
+
+ 741, 628, 803, 793, 632, 632, 632, 739, 569, 792,
+ 629, 794, 688, 689, 690, 791, 790, 306, 684, 631,
+ 685, 569, 569, 705, 705, 705, 789, 628, 298, 288,
+ 569, 289, 290, 788, 291, 787, 629, 292, 293, 294,
+ 545, 673, 674, 629, 295, 610, 675, 786, 645, 676,
+ 677, 645, 296, 297, 678, 569, 645, 610, 679, 680,
+ 703, 703, 703, 569, 743, 743, 743, 447, 351, 629,
+ 447, 793, 351, 712, 713, 714, 714, 713, 714, 794,
+ 610, 785, 784, 298, 307, 308, 307, 70, 309, 307,
+ 307, 307, 307, 307, 307, 307, 307, 307, 307, 307,
+
+ 310, 307, 307, 307, 307, 307, 307, 307, 311, 307,
+ 312, 312, 307, 307, 307, 312, 312, 312, 312, 312,
+ 312, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+ 312, 312, 312, 312, 312, 312, 312, 307, 307, 313,
+ 407, 783, 782, 781, 407, 685, 632, 685, 408, 409,
+ 410, 740, 780, 411, 628, 741, 412, 413, 779, 451,
+ 778, 414, 451, 629, 777, 415, 416, 491, 776, 736,
+ 741, 462, 491, 491, 324, 767, 491, 324, 462, 766,
+ 690, 690, 690, 491, 491, 491, 496, 765, 764, 763,
+ 496, 496, 496, 762, 761, 496, 629, 496, 569, 774,
+
+ 774, 774, 496, 496, 496, 505, 545, 351, 760, 505,
+ 505, 505, 335, 759, 505, 335, 505, 758, 801, 801,
+ 801, 505, 505, 505, 508, 362, 351, 757, 508, 508,
+ 508, 569, 756, 508, 755, 508, 350, 350, 350, 754,
+ 508, 508, 509, 370, 351, 512, 753, 752, 751, 512,
+ 512, 512, 396, 750, 512, 396, 512, 749, 690, 690,
+ 690, 512, 512, 512, 523, 748, 747, 742, 523, 523,
+ 523, 441, 701, 523, 441, 462, 569, 704, 699, 737,
+ 523, 523, 523, 524, 525, 736, 526, 445, 527, 326,
+ 445, 528, 529, 560, 560, 730, 530, 820, 820, 820,
+
+ 531, 532, 543, 729, 728, 351, 543, 543, 543, 569,
+ 727, 543, 726, 543, 731, 689, 732, 725, 543, 543,
+ 543, 426, 724, 628, 723, 548, 837, 837, 837, 548,
+ 548, 548, 629, 722, 548, 721, 549, 835, 835, 835,
+ 720, 548, 548, 548, 554, 351, 719, 718, 554, 554,
+ 554, 447, 717, 554, 447, 554, 846, 846, 846, 716,
+ 554, 554, 554, 557, 351, 629, 715, 557, 557, 557,
+ 451, 711, 557, 451, 557, 324, 710, 746, 324, 557,
+ 557, 557, 636, 636, 637, 636, 636, 636, 636, 636,
+ 636, 636, 636, 636, 636, 636, 636, 636, 636, 324,
+
+ 324, 324, 636, 636, 636, 636, 636, 636, 324, 324,
+ 636, 636, 636, 324, 324, 324, 324, 324, 324, 324,
+ 324, 638, 324, 324, 324, 324, 324, 324, 324, 324,
+ 324, 324, 324, 324, 324, 636, 636, 636, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 324, 324, 324, 695, 695,
+ 695, 695, 695, 695, 324, 324, 695, 695, 695, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324,
+ 324, 695, 695, 695, 732, 690, 732, 733, 734, 735,
+
+ 735, 735, 735, 628, 735, 735, 735, 709, 708, 744,
+ 744, 744, 629, 745, 707, 569, 706, 351, 569, 768,
+ 734, 769, 569, 769, 735, 769, 657, 652, 628, 770,
+ 771, 772, 628, 488, 772, 772, 772, 629, 772, 772,
+ 772, 629, 775, 775, 775, 629, 745, 569, 569, 488,
+ 351, 569, 569, 581, 701, 569, 569, 795, 771, 796,
+ 746, 700, 699, 796, 772, 796, 628, 698, 335, 572,
+ 629, 335, 628, 692, 629, 629, 797, 798, 799, 691,
+ 569, 629, 799, 799, 799, 569, 799, 799, 799, 569,
+ 855, 855, 855, 746, 569, 802, 802, 802, 351, 745,
+
+ 569, 560, 681, 351, 569, 817, 818, 819, 629, 672,
+ 815, 798, 816, 671, 629, 670, 816, 799, 816, 628,
+ 819, 819, 819, 569, 669, 628, 668, 569, 629, 819,
+ 819, 819, 800, 569, 629, 800, 667, 569, 569, 666,
+ 821, 821, 821, 664, 745, 610, 746, 569, 351, 822,
+ 822, 822, 663, 745, 662, 661, 569, 830, 818, 831,
+ 660, 629, 659, 831, 819, 831, 628, 629, 832, 833,
+ 834, 569, 628, 658, 657, 629, 834, 834, 834, 656,
+ 569, 629, 598, 834, 834, 834, 569, 370, 836, 836,
+ 836, 746, 745, 488, 569, 649, 351, 841, 833, 842,
+
+ 746, 569, 842, 834, 842, 648, 628, 644, 629, 643,
+ 642, 628, 641, 640, 629, 629, 848, 848, 848, 569,
+ 629, 639, 843, 844, 845, 634, 633, 569, 845, 845,
+ 845, 845, 845, 845, 569, 565, 560, 560, 621, 746,
+ 569, 620, 609, 847, 847, 847, 569, 745, 629, 569,
+ 619, 351, 618, 629, 850, 844, 851, 851, 845, 851,
+ 852, 853, 854, 628, 617, 616, 628, 746, 854, 854,
+ 854, 615, 629, 569, 614, 629, 613, 612, 569, 569,
+ 611, 610, 569, 854, 854, 854, 569, 856, 856, 856,
+ 607, 745, 606, 605, 746, 351, 857, 857, 857, 604,
+
+ 603, 569, 852, 853, 854, 629, 602, 600, 629, 599,
+ 598, 569, 858, 853, 859, 859, 854, 859, 563, 569,
+ 569, 628, 517, 597, 628, 854, 854, 854, 370, 370,
+ 629, 594, 589, 629, 569, 862, 862, 862, 746, 854,
+ 854, 854, 589, 569, 860, 860, 860, 746, 865, 865,
+ 865, 488, 351, 569, 861, 861, 861, 569, 745, 858,
+ 853, 859, 351, 629, 488, 485, 629, 584, 628, 859,
+ 854, 859, 863, 863, 863, 583, 569, 629, 628, 582,
+ 351, 864, 864, 864, 581, 745, 746, 629, 580, 351,
+ 569, 579, 866, 866, 866, 868, 868, 868, 578, 746,
+
+ 351, 871, 871, 871, 577, 746, 576, 867, 867, 867,
+ 629, 745, 874, 874, 874, 351, 869, 869, 869, 575,
+ 629, 870, 870, 870, 351, 745, 872, 872, 872, 351,
+ 574, 573, 746, 572, 351, 873, 873, 873, 571, 745,
+ 875, 875, 875, 351, 570, 565, 746, 563, 351, 876,
+ 876, 876, 746, 745, 877, 877, 877, 351, 746, 878,
+ 878, 878, 461, 746, 880, 880, 880, 351, 460, 879,
+ 879, 879, 746, 745, 881, 881, 881, 351, 560, 882,
+ 882, 882, 351, 745, 452, 461, 746, 351, 883, 883,
+ 883, 884, 884, 884, 885, 885, 885, 460, 745, 351,
+
+ 746, 558, 351, 442, 556, 746, 886, 886, 886, 887,
+ 887, 887, 889, 889, 889, 746, 555, 351, 553, 460,
+ 746, 888, 888, 888, 550, 745, 890, 890, 890, 351,
+ 746, 892, 892, 892, 351, 547, 891, 891, 891, 746,
+ 745, 893, 893, 893, 351, 746, 894, 894, 894, 351,
+ 745, 895, 895, 895, 351, 546, 544, 746, 896, 896,
+ 896, 460, 542, 746, 541, 540, 351, 897, 897, 897,
+ 539, 745, 746, 538, 537, 351, 898, 898, 898, 901,
+ 901, 901, 746, 899, 899, 899, 536, 746, 900, 900,
+ 900, 351, 745, 902, 902, 902, 351, 746, 904, 904,
+
+ 904, 351, 746, 903, 903, 903, 535, 745, 905, 905,
+ 905, 351, 534, 906, 906, 906, 351, 745, 746, 533,
+ 522, 351, 907, 907, 907, 397, 517, 746, 393, 516,
+ 746, 515, 908, 908, 908, 910, 910, 910, 385, 746,
+ 351, 384, 909, 909, 909, 383, 745, 384, 514, 746,
+ 351, 911, 911, 911, 746, 913, 913, 913, 374, 351,
+ 370, 912, 912, 912, 746, 745, 914, 914, 914, 351,
+ 916, 916, 916, 746, 351, 915, 915, 915, 504, 745,
+ 917, 917, 917, 351, 503, 353, 746, 497, 351, 488,
+ 918, 918, 918, 746, 745, 919, 919, 919, 351, 920,
+
+ 920, 920, 922, 922, 922, 483, 746, 351, 480, 921,
+ 921, 921, 746, 745, 923, 923, 923, 351, 925, 925,
+ 925, 746, 351, 924, 924, 924, 746, 745, 926, 926,
+ 926, 351, 928, 928, 928, 478, 351, 931, 931, 931,
+ 476, 746, 475, 927, 927, 927, 746, 745, 929, 929,
+ 929, 351, 474, 746, 470, 467, 351, 930, 930, 930,
+ 746, 745, 932, 932, 932, 351, 934, 934, 934, 746,
+ 351, 933, 933, 933, 746, 745, 935, 935, 935, 351,
+ 937, 937, 937, 746, 351, 936, 936, 936, 746, 745,
+ 938, 938, 938, 351, 746, 939, 939, 939, 351, 745,
+
+ 940, 940, 940, 351, 941, 941, 941, 466, 746, 943,
+ 943, 943, 351, 946, 946, 946, 461, 746, 460, 942,
+ 942, 942, 746, 745, 944, 944, 944, 351, 949, 949,
+ 949, 746, 351, 945, 945, 945, 746, 745, 952, 952,
+ 952, 351, 947, 947, 947, 316, 746, 316, 316, 455,
+ 351, 746, 316, 948, 948, 948, 316, 745, 316, 446,
+ 746, 351, 316, 444, 746, 950, 950, 950, 316, 440,
+ 746, 436, 433, 351, 951, 951, 951, 421, 745, 746,
+ 420, 418, 351, 406, 746, 953, 953, 953, 403, 746,
+ 954, 954, 954, 351, 745, 955, 955, 955, 351, 956,
+
+ 956, 956, 316, 316, 746, 316, 393, 351, 957, 957,
+ 957, 390, 745, 958, 958, 958, 351, 386, 959, 959,
+ 959, 961, 961, 961, 385, 746, 351, 960, 960, 960,
+ 384, 745, 962, 962, 962, 351, 964, 964, 964, 383,
+ 351, 746, 370, 963, 963, 963, 746, 745, 965, 965,
+ 965, 351, 370, 966, 966, 966, 351, 745, 370, 746,
+ 370, 351, 359, 316, 746, 967, 967, 967, 968, 968,
+ 968, 349, 746, 969, 969, 969, 351, 745, 746, 346,
+ 342, 351, 970, 970, 970, 341, 338, 746, 971, 971,
+ 971, 972, 972, 972, 746, 745, 351, 316, 332, 351,
+
+ 973, 973, 973, 326, 746, 974, 974, 974, 325, 316,
+ 975, 975, 975, 351, 745, 316, 746, 316, 351, 976,
+ 976, 976, 1156, 1156, 746, 1156, 977, 977, 977, 979,
+ 979, 979, 1156, 746, 351, 978, 978, 978, 1156, 745,
+ 1156, 1156, 746, 351, 980, 980, 980, 982, 982, 982,
+ 1156, 746, 351, 1156, 981, 981, 981, 1156, 745, 1156,
+ 1156, 746, 351, 983, 983, 983, 985, 985, 985, 1156,
+ 746, 351, 1156, 984, 984, 984, 1156, 745, 1156, 1156,
+ 746, 351, 986, 986, 986, 1156, 746, 987, 987, 987,
+ 351, 745, 988, 988, 988, 351, 1156, 1156, 746, 989,
+
+ 989, 989, 990, 990, 990, 746, 745, 351, 1156, 1156,
+ 351, 991, 991, 991, 992, 992, 992, 746, 1156, 993,
+ 993, 993, 351, 745, 746, 1156, 1156, 351, 994, 994,
+ 994, 995, 995, 995, 997, 997, 997, 1156, 746, 351,
+ 996, 996, 996, 746, 745, 1000, 1000, 1000, 351, 998,
+ 998, 998, 1156, 746, 1003, 1003, 1003, 351, 1156, 999,
+ 999, 999, 746, 745, 1001, 1001, 1001, 351, 1156, 1156,
+ 746, 1156, 351, 1002, 1002, 1002, 1156, 745, 1156, 746,
+ 1156, 351, 1004, 1004, 1004, 746, 1006, 1006, 1006, 1156,
+ 351, 746, 1156, 1005, 1005, 1005, 746, 745, 1007, 1007,
+
+ 1007, 351, 1009, 1009, 1009, 746, 351, 1008, 1008, 1008,
+ 746, 745, 1010, 1010, 1010, 351, 1156, 1011, 1011, 1011,
+ 351, 745, 1156, 1156, 746, 351, 1012, 1012, 1012, 1156,
+ 1013, 1013, 1013, 1015, 1015, 1015, 1156, 746, 351, 1014,
+ 1014, 1014, 1156, 745, 746, 1156, 1156, 351, 1016, 1016,
+ 1016, 1156, 1156, 746, 1156, 1156, 351, 1156, 746, 1017,
+ 1017, 1017, 1156, 745, 1018, 1018, 1018, 351, 746, 1156,
+ 1019, 1019, 1019, 1021, 1021, 1021, 1156, 746, 351, 1020,
+ 1020, 1020, 1156, 745, 746, 1156, 1156, 351, 1156, 1156,
+ 746, 1022, 1022, 1022, 1023, 1023, 1023, 1156, 745, 351,
+
+ 1156, 1156, 351, 1024, 1024, 1024, 1025, 1025, 1025, 1156,
+ 746, 1027, 1027, 1027, 351, 746, 1156, 1026, 1026, 1026,
+ 1156, 745, 1156, 1156, 746, 351, 1028, 1028, 1028, 1156,
+ 746, 1029, 1029, 1029, 351, 745, 1030, 1030, 1030, 351,
+ 1031, 1031, 1031, 1156, 1156, 746, 1156, 1156, 351, 1032,
+ 1032, 1032, 1156, 745, 746, 1156, 1156, 351, 1033, 1033,
+ 1033, 1156, 746, 1034, 1034, 1034, 1156, 1156, 746, 1156,
+ 1156, 351, 1035, 1035, 1035, 1156, 745, 1036, 1036, 1036,
+ 351, 1156, 746, 1037, 1037, 1037, 1156, 746, 1038, 1038,
+ 1038, 351, 745, 1039, 1039, 1039, 351, 1040, 1040, 1040,
+
+ 746, 1156, 1041, 1041, 1041, 351, 745, 1156, 1156, 746,
+ 351, 1042, 1042, 1042, 1043, 1043, 1043, 1044, 1044, 1044,
+ 1156, 745, 351, 746, 1156, 351, 1156, 1156, 746, 1045,
+ 1045, 1045, 1046, 1046, 1046, 1048, 1048, 1048, 1156, 746,
+ 351, 1047, 1047, 1047, 746, 745, 1049, 1049, 1049, 351,
+ 1051, 1051, 1051, 746, 351, 1050, 1050, 1050, 1156, 745,
+ 1156, 1156, 746, 351, 1052, 1052, 1052, 1156, 746, 1053,
+ 1053, 1053, 351, 745, 1054, 1054, 1054, 351, 1156, 1156,
+ 746, 1055, 1055, 1055, 1156, 1156, 746, 1156, 1156, 351,
+ 1156, 1156, 746, 1156, 1056, 1056, 1056, 1156, 745, 1156,
+
+ 1156, 746, 351, 1057, 1057, 1057, 746, 1058, 1058, 1058,
+ 1059, 1059, 1059, 1156, 745, 351, 1156, 1156, 351, 1156,
+ 746, 1060, 1060, 1060, 1156, 746, 1061, 1061, 1061, 1062,
+ 1062, 1062, 1156, 745, 351, 1156, 1156, 351, 1063, 1063,
+ 1063, 1156, 1064, 1064, 1064, 746, 745, 1065, 1065, 1065,
+ 351, 1066, 1066, 1066, 746, 745, 1067, 1067, 1067, 351,
+ 1156, 746, 1068, 1068, 1068, 1156, 745, 1069, 1069, 1069,
+ 351, 1156, 746, 1070, 1070, 1070, 1156, 745, 1156, 1156,
+ 746, 351, 1071, 1071, 1071, 1156, 1072, 1072, 1072, 746,
+ 745, 1156, 1156, 746, 351, 1073, 1073, 1073, 746, 1075,
+
+ 1075, 1075, 746, 1156, 1074, 1074, 1074, 746, 745, 1076,
+ 1076, 1076, 351, 746, 1077, 1077, 1077, 1156, 746, 1078,
+ 1078, 1078, 1156, 1156, 746, 1079, 1079, 1079, 1080, 1080,
+ 1080, 1156, 1156, 746, 1081, 1081, 1081, 746, 1082, 1082,
+ 1082, 1083, 1083, 1083, 1156, 1156, 746, 1084, 1084, 1084,
+ 746, 1085, 1085, 1085, 1156, 746, 1086, 1086, 1086, 1156,
+ 746, 1087, 1087, 1087, 1156, 746, 1088, 1088, 1088, 1156,
+ 746, 1089, 1089, 1089, 1156, 1156, 746, 1156, 1156, 746,
+ 1090, 1090, 1090, 1156, 1156, 746, 1091, 1091, 1091, 746,
+ 1156, 1156, 746, 1092, 1092, 1092, 1156, 1156, 746, 1093,
+
+ 1093, 1093, 746, 1094, 1094, 1094, 1156, 746, 1095, 1095,
+ 1095, 1156, 746, 1096, 1096, 1096, 1156, 746, 1097, 1097,
+ 1097, 1156, 746, 1098, 1098, 1098, 1099, 1099, 1099, 1156,
+ 1156, 746, 1100, 1100, 1100, 1156, 1156, 746, 1101, 1101,
+ 1101, 1102, 1102, 1102, 746, 1103, 1103, 1103, 1156, 1156,
+ 746, 1104, 1104, 1104, 746, 1105, 1105, 1105, 1156, 746,
+ 1106, 1106, 1106, 1156, 746, 1107, 1107, 1107, 1156, 746,
+ 1108, 1108, 1108, 1156, 746, 1156, 1156, 746, 1109, 1109,
+ 1109, 1156, 1156, 746, 1110, 1110, 1110, 1156, 1156, 746,
+ 1156, 1156, 746, 1111, 1111, 1111, 746, 1112, 1112, 1112,
+
+ 1156, 1156, 746, 1113, 1113, 1113, 746, 1114, 1114, 1114,
+ 1156, 746, 1115, 1115, 1115, 1156, 746, 1116, 1116, 1116,
+ 1156, 746, 1117, 1117, 1117, 1118, 1118, 1118, 1156, 746,
+ 1119, 1119, 1119, 1156, 1156, 746, 1120, 1120, 1120, 1121,
+ 1121, 1121, 1156, 1156, 746, 1122, 1122, 1122, 746, 1123,
+ 1123, 1123, 1156, 1156, 746, 1124, 1124, 1124, 746, 1125,
+ 1125, 1125, 1156, 746, 1126, 1126, 1126, 1156, 746, 1127,
+ 1127, 1127, 1156, 746, 1156, 1156, 746, 1128, 1128, 1128,
+ 1156, 746, 1129, 1129, 1129, 1156, 1156, 746, 1156, 1156,
+ 746, 1130, 1130, 1130, 1156, 1156, 746, 1131, 1131, 1131,
+
+ 746, 1132, 1132, 1132, 1156, 1156, 746, 1133, 1133, 1133,
+ 746, 1134, 1134, 1134, 1156, 746, 1135, 1135, 1135, 1156,
+ 746, 1136, 1136, 1136, 1137, 1137, 1137, 1156, 746, 1138,
+ 1138, 1138, 1156, 746, 1139, 1139, 1139, 1140, 1140, 1140,
+ 1156, 1156, 746, 1141, 1141, 1141, 1156, 1156, 746, 1142,
+ 1142, 1142, 746, 1143, 1143, 1143, 1156, 1156, 746, 1144,
+ 1144, 1144, 746, 1145, 1145, 1145, 1156, 746, 1146, 1146,
+ 1146, 1156, 746, 1156, 1156, 746, 1147, 1147, 1147, 1156,
+ 746, 1148, 1148, 1148, 1156, 746, 1156, 1156, 746, 1149,
+ 1149, 1149, 1156, 1156, 746, 1150, 1150, 1150, 1156, 1156,
+
+ 746, 1151, 1151, 1151, 746, 1152, 1152, 1152, 1156, 1156,
+ 746, 1153, 1153, 1153, 746, 1154, 1154, 1154, 1156, 746,
+ 1155, 1155, 1155, 1079, 1079, 1079, 1156, 746, 1156, 1156,
+ 1156, 1156, 746, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 746, 1156, 1156, 1156, 1156, 1156, 746, 1156, 1156, 1156,
+ 1156, 1156, 746, 1156, 1156, 1156, 746, 1156, 1156, 1156,
+ 1156, 1156, 746, 1156, 1156, 1156, 746, 1156, 1156, 1156,
+ 1156, 746, 1156, 1156, 746, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 75, 75, 75, 75, 75, 75, 75,
+
+ 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 108, 108, 108, 108, 108, 108, 108, 108, 108,
+ 108, 108, 108, 108, 108, 108, 108, 108, 108, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 139, 139, 139,
+ 139, 139, 139, 139, 139, 139, 139, 139, 139, 139,
+ 139, 139, 139, 139, 139, 146, 146, 146, 146, 146,
+ 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
+ 146, 146, 146, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+
+ 153, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 199, 199, 199,
+ 199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+ 199, 199, 199, 199, 199, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 228, 228, 228, 228, 228, 228, 228,
+ 228, 228, 228, 228, 228, 228, 228, 228, 228, 228,
+ 228, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 271, 271, 271,
+ 271, 271, 271, 271, 271, 271, 271, 271, 271, 271,
+ 271, 271, 271, 271, 271, 280, 280, 280, 280, 280,
+ 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+ 280, 280, 280, 287, 287, 287, 287, 287, 287, 287,
+ 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
+ 287, 299, 299, 299, 299, 299, 299, 299, 299, 299,
+ 299, 299, 299, 299, 299, 299, 299, 299, 299, 317,
+
+ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 339, 339, 339,
+ 1156, 339, 339, 1156, 1156, 339, 339, 339, 339, 1156,
+ 339, 339, 339, 339, 339, 340, 340, 340, 1156, 340,
+ 340, 340, 1156, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 343, 343, 343, 1156, 343, 343, 1156,
+ 343, 343, 343, 343, 343, 343, 343, 343, 343, 343,
+ 347, 347, 347, 1156, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347, 348, 348,
+ 348, 1156, 348, 348, 348, 348, 348, 348, 348, 348,
+
+ 348, 348, 348, 348, 348, 348, 352, 352, 352, 1156,
+ 1156, 1156, 352, 1156, 1156, 1156, 1156, 352, 1156, 1156,
+ 352, 356, 356, 356, 1156, 1156, 356, 1156, 356, 356,
+ 356, 356, 356, 356, 356, 356, 356, 356, 360, 360,
+ 360, 1156, 360, 360, 360, 360, 360, 360, 360, 360,
+ 360, 360, 360, 360, 360, 360, 361, 361, 361, 1156,
+ 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 368, 1156, 1156, 1156, 1156, 1156,
+ 368, 1156, 1156, 1156, 1156, 368, 1156, 1156, 368, 369,
+ 369, 369, 369, 369, 369, 369, 369, 369, 369, 369,
+
+ 369, 369, 369, 369, 369, 369, 379, 379, 1156, 1156,
+ 1156, 1156, 379, 1156, 1156, 1156, 1156, 379, 1156, 1156,
+ 379, 379, 389, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 389, 1156, 389, 1156, 1156, 389, 399, 399, 399,
+ 399, 399, 399, 399, 399, 399, 399, 399, 399, 399,
+ 399, 399, 399, 399, 399, 402, 1156, 402, 1156, 402,
+ 402, 402, 402, 402, 1156, 402, 402, 1156, 402, 402,
+ 1156, 402, 417, 417, 417, 1156, 417, 417, 417, 417,
+ 417, 1156, 417, 417, 417, 417, 417, 417, 1156, 417,
+ 425, 425, 425, 1156, 425, 425, 425, 425, 425, 425,
+
+ 425, 425, 425, 425, 425, 1156, 425, 426, 426, 426,
+ 1156, 426, 426, 426, 426, 426, 426, 426, 426, 1156,
+ 426, 426, 1156, 426, 427, 1156, 427, 1156, 427, 427,
+ 427, 427, 427, 427, 427, 427, 427, 427, 427, 1156,
+ 427, 432, 1156, 432, 1156, 432, 432, 432, 432, 432,
+ 1156, 432, 432, 432, 432, 432, 432, 432, 432, 437,
+ 1156, 437, 1156, 437, 437, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 450, 450, 450,
+ 1156, 450, 450, 450, 450, 450, 450, 450, 450, 450,
+ 450, 450, 450, 450, 450, 454, 454, 454, 1156, 454,
+
+ 454, 454, 1156, 454, 454, 454, 454, 454, 454, 454,
+ 454, 454, 454, 458, 458, 458, 1156, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 459, 459, 1156, 459, 1156, 1156, 459, 462, 1156,
+ 462, 462, 1156, 462, 1156, 462, 1156, 462, 463, 463,
+ 463, 1156, 463, 463, 463, 463, 463, 463, 463, 463,
+ 463, 463, 463, 463, 463, 463, 477, 477, 477, 1156,
+ 477, 477, 477, 477, 477, 477, 477, 477, 477, 477,
+ 477, 477, 477, 477, 479, 479, 479, 1156, 479, 479,
+ 479, 479, 479, 479, 479, 479, 479, 479, 479, 479,
+
+ 479, 479, 339, 339, 339, 1156, 339, 339, 1156, 1156,
+ 339, 339, 339, 339, 1156, 339, 339, 339, 339, 339,
+ 487, 487, 487, 1156, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 489, 489, 489,
+ 1156, 489, 489, 489, 489, 489, 489, 489, 489, 489,
+ 489, 489, 489, 489, 489, 343, 343, 343, 1156, 343,
+ 343, 1156, 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 492, 492, 492, 1156, 492, 492, 492, 492,
+ 492, 492, 492, 492, 492, 492, 492, 492, 492, 492,
+ 494, 494, 494, 1156, 494, 494, 494, 494, 494, 494,
+
+ 494, 494, 494, 494, 494, 494, 494, 494, 498, 498,
+ 498, 1156, 498, 498, 498, 498, 498, 498, 498, 498,
+ 498, 498, 498, 498, 498, 498, 352, 352, 352, 1156,
+ 1156, 1156, 352, 1156, 1156, 1156, 1156, 352, 1156, 1156,
+ 352, 356, 356, 356, 1156, 1156, 356, 1156, 356, 356,
+ 356, 356, 356, 356, 356, 356, 356, 356, 361, 361,
+ 361, 1156, 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 368, 1156, 1156, 1156,
+ 1156, 1156, 368, 1156, 1156, 1156, 1156, 368, 1156, 1156,
+ 368, 369, 369, 369, 369, 369, 369, 369, 369, 369,
+
+ 369, 369, 369, 369, 369, 369, 369, 369, 379, 379,
+ 1156, 1156, 1156, 1156, 379, 1156, 1156, 1156, 1156, 379,
+ 1156, 1156, 379, 379, 389, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 389, 1156, 389, 1156, 1156, 389, 399,
+ 399, 399, 399, 399, 399, 399, 399, 399, 399, 399,
+ 399, 399, 399, 399, 399, 399, 399, 402, 1156, 402,
+ 1156, 402, 402, 402, 402, 402, 1156, 402, 402, 1156,
+ 402, 402, 1156, 402, 417, 417, 417, 1156, 417, 417,
+ 417, 417, 417, 1156, 417, 417, 417, 417, 417, 417,
+ 1156, 417, 425, 425, 425, 1156, 425, 425, 425, 425,
+
+ 425, 425, 425, 425, 425, 425, 425, 1156, 425, 426,
+ 426, 426, 1156, 426, 426, 426, 426, 426, 426, 426,
+ 426, 1156, 426, 426, 1156, 426, 427, 1156, 427, 1156,
+ 427, 427, 427, 427, 427, 427, 427, 427, 427, 427,
+ 427, 1156, 427, 432, 1156, 432, 1156, 432, 432, 432,
+ 432, 432, 1156, 432, 432, 432, 432, 432, 432, 432,
+ 432, 437, 1156, 437, 1156, 437, 437, 437, 437, 437,
+ 437, 437, 437, 437, 437, 437, 437, 437, 437, 559,
+ 559, 559, 1156, 559, 559, 559, 559, 559, 559, 559,
+ 559, 559, 559, 559, 559, 559, 561, 561, 561, 1156,
+
+ 561, 561, 561, 561, 561, 561, 561, 561, 561, 561,
+ 561, 561, 561, 561, 459, 459, 1156, 459, 1156, 1156,
+ 459, 463, 463, 463, 1156, 463, 463, 463, 463, 463,
+ 463, 463, 463, 463, 463, 463, 463, 463, 463, 564,
+ 564, 564, 1156, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 477, 477, 477,
+ 1156, 477, 477, 477, 477, 477, 477, 477, 477, 477,
+ 477, 477, 477, 477, 477, 479, 479, 479, 1156, 479,
+ 479, 479, 479, 479, 479, 479, 479, 479, 479, 479,
+ 479, 479, 479, 585, 585, 585, 1156, 585, 585, 585,
+
+ 585, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+ 339, 339, 339, 1156, 339, 339, 1156, 1156, 339, 339,
+ 339, 339, 1156, 339, 339, 339, 339, 339, 492, 492,
+ 492, 1156, 492, 492, 492, 492, 492, 492, 492, 492,
+ 492, 492, 492, 492, 492, 492, 494, 494, 494, 1156,
+ 494, 494, 494, 494, 494, 494, 494, 494, 494, 494,
+ 494, 494, 494, 494, 343, 343, 343, 1156, 343, 343,
+ 1156, 343, 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 352, 352, 352, 1156, 1156, 1156, 352, 1156, 1156,
+ 1156, 1156, 352, 1156, 1156, 352, 356, 356, 356, 1156,
+
+ 1156, 356, 1156, 356, 356, 356, 356, 356, 356, 356,
+ 356, 356, 356, 361, 361, 361, 1156, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 622, 622, 622, 1156, 622, 622, 622, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 622, 625, 625,
+ 625, 625, 625, 625, 625, 625, 625, 625, 625, 625,
+ 625, 625, 625, 625, 625, 625, 650, 650, 650, 1156,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 682, 682, 682, 1156, 682, 682, 682,
+ 682, 682, 682, 682, 682, 682, 682, 682, 682, 682,
+
+ 773, 1156, 1156, 1156, 773, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 773, 1156, 773, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 1156, 807,
+ 807, 1156, 807, 67, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156
+ } ;
+
+static yyconst flex_int16_t yy_chk[5491] =
+ { 0,
+ 0, 1, 162, 1, 1, 2, 146, 2, 2, 0,
+ 3, 162, 3, 3, 72, 81, 1, 89, 72, 81,
+ 2, 89, 102, 146, 1, 3, 102, 9, 2, 9,
+ 9, 152, 9, 3, 0, 9, 134, 134, 10, 152,
+ 10, 10, 9, 10, 114, 94, 10, 94, 114, 105,
+ 9, 105, 0, 10, 21, 1, 21, 21, 1079, 2,
+ 29, 10, 29, 29, 3, 4, 4, 4, 4, 21,
+ 121, 4, 131, 77, 121, 29, 131, 21, 77, 83,
+ 4, 9, 21, 29, 147, 142, 1061, 83, 4, 142,
+ 4, 4, 10, 95, 83, 83, 83, 77, 77, 95,
+
+ 95, 147, 157, 83, 83, 133, 133, 133, 21, 159,
+ 159, 157, 171, 133, 29, 157, 226, 171, 226, 4,
+ 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, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 11, 148, 11, 11, 12, 11, 12, 12,
+ 150, 12, 181, 181, 151, 158, 149, 11, 192, 167,
+ 148, 12, 149, 192, 849, 11, 149, 150, 150, 12,
+ 11, 151, 167, 149, 12, 177, 158, 187, 196, 177,
+ 204, 187, 196, 213, 204, 218, 840, 213, 224, 218,
+ 219, 219, 224, 233, 239, 246, 11, 233, 239, 246,
+ 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 15, 371, 15,
+ 15, 16, 15, 16, 16, 256, 16, 371, 17, 256,
+ 17, 17, 15, 17, 161, 161, 16, 220, 223, 839,
+ 15, 361, 161, 17, 16, 15, 381, 225, 227, 16,
+ 17, 17, 220, 223, 18, 381, 18, 18, 361, 18,
+ 372, 161, 225, 227, 249, 249, 285, 285, 267, 18,
+
+ 225, 15, 267, 372, 275, 16, 18, 18, 275, 283,
+ 295, 303, 17, 283, 295, 303, 310, 321, 322, 322,
+ 310, 327, 336, 341, 341, 321, 349, 391, 366, 327,
+ 336, 838, 391, 404, 349, 349, 366, 404, 18, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 22, 320, 22, 22, 30,
+
+ 30, 30, 30, 318, 320, 30, 387, 368, 318, 323,
+ 22, 320, 320, 320, 30, 368, 829, 323, 22, 387,
+ 320, 320, 30, 22, 323, 323, 323, 318, 318, 344,
+ 364, 345, 389, 323, 323, 344, 350, 350, 350, 394,
+ 364, 345, 828, 400, 350, 389, 394, 364, 400, 22,
+ 23, 23, 344, 30, 345, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 31,
+ 533, 31, 31, 32, 425, 32, 32, 433, 33, 533,
+
+ 33, 33, 433, 34, 31, 34, 34, 329, 32, 425,
+ 329, 827, 31, 33, 395, 329, 32, 41, 34, 41,
+ 41, 33, 352, 352, 352, 395, 34, 135, 135, 135,
+ 352, 42, 41, 42, 42, 135, 363, 455, 455, 329,
+ 41, 41, 363, 31, 826, 41, 42, 32, 329, 376,
+ 376, 492, 33, 363, 42, 42, 825, 34, 35, 42,
+ 35, 35, 379, 379, 43, 376, 43, 43, 548, 35,
+ 379, 41, 494, 35, 492, 43, 135, 463, 463, 43,
+ 510, 35, 35, 548, 507, 42, 35, 43, 44, 379,
+ 44, 44, 424, 510, 45, 494, 45, 45, 582, 44,
+
+ 495, 507, 338, 44, 46, 338, 46, 46, 508, 45,
+ 338, 44, 35, 36, 424, 36, 36, 45, 43, 46,
+ 824, 490, 493, 495, 36, 508, 823, 46, 36, 490,
+ 490, 500, 493, 514, 338, 582, 36, 36, 424, 500,
+ 500, 36, 44, 338, 506, 493, 595, 814, 45, 501,
+ 501, 501, 514, 813, 506, 551, 562, 501, 46, 1176,
+ 551, 506, 1176, 595, 562, 562, 812, 36, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 39, 811, 39, 39, 588, 572,
+ 637, 53, 572, 53, 53, 39, 53, 572, 54, 39,
+ 54, 54, 55, 54, 55, 55, 53, 39, 39, 810,
+ 55, 588, 39, 54, 53, 809, 526, 55, 646, 53,
+ 56, 54, 56, 56, 808, 55, 54, 637, 56, 625,
+ 55, 806, 355, 355, 355, 56, 526, 625, 39, 40,
+ 355, 40, 40, 56, 805, 53, 628, 628, 56, 804,
+ 40, 693, 54, 792, 40, 646, 55, 502, 502, 502,
+
+ 791, 526, 40, 40, 587, 502, 790, 40, 581, 686,
+ 686, 581, 587, 587, 56, 591, 581, 624, 355, 592,
+ 592, 592, 789, 591, 591, 624, 624, 592, 693, 1177,
+ 502, 788, 1177, 40, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 51, 593, 593, 593,
+ 610, 610, 610, 787, 786, 593, 629, 640, 657, 657,
+ 657, 51, 51, 785, 629, 640, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 57, 57,
+ 784, 593, 782, 57, 57, 57, 57, 57, 57, 57,
+
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 59, 781, 59, 59, 60,
+ 1191, 60, 60, 1191, 649, 696, 63, 649, 63, 63,
+ 59, 63, 649, 696, 60, 664, 664, 664, 59, 780,
+ 698, 63, 60, 59, 465, 465, 465, 60, 698, 63,
+ 665, 665, 665, 737, 63, 779, 737, 566, 566, 566,
+ 778, 737, 465, 64, 1200, 64, 64, 1200, 64, 59,
+ 567, 567, 567, 60, 61, 566, 61, 61, 64, 61,
+ 63, 699, 61, 61, 61, 699, 64, 1201, 567, 61,
+ 1201, 64, 565, 565, 565, 465, 777, 61, 61, 738,
+
+ 699, 565, 776, 767, 568, 568, 568, 738, 566, 766,
+ 565, 767, 630, 630, 630, 765, 764, 64, 626, 626,
+ 626, 567, 568, 705, 705, 705, 763, 626, 61, 62,
+ 630, 62, 62, 762, 62, 761, 626, 62, 62, 62,
+ 760, 618, 618, 565, 62, 759, 618, 758, 742, 618,
+ 618, 742, 62, 62, 618, 568, 742, 757, 618, 618,
+ 654, 654, 654, 630, 703, 703, 703, 1202, 654, 626,
+ 1202, 793, 703, 712, 712, 712, 714, 714, 714, 793,
+ 756, 755, 754, 62, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 206, 753, 752, 751, 206, 627, 627, 627, 206, 206,
+ 206, 740, 750, 206, 627, 740, 206, 206, 749, 1204,
+ 748, 206, 1204, 627, 747, 206, 206, 342, 745, 736,
+ 740, 342, 342, 342, 1210, 730, 342, 1210, 342, 729,
+ 631, 631, 631, 342, 342, 342, 346, 728, 727, 726,
+ 346, 346, 346, 725, 724, 346, 627, 346, 631, 743,
+
+ 743, 743, 346, 346, 346, 359, 723, 743, 722, 359,
+ 359, 359, 1213, 721, 359, 1213, 359, 720, 774, 774,
+ 774, 359, 359, 359, 365, 365, 774, 719, 365, 365,
+ 365, 631, 718, 365, 717, 365, 655, 655, 655, 716,
+ 365, 365, 365, 373, 655, 373, 715, 711, 710, 373,
+ 373, 373, 1228, 709, 373, 1228, 373, 708, 632, 632,
+ 632, 373, 373, 373, 406, 707, 706, 702, 406, 406,
+ 406, 1237, 701, 406, 1237, 406, 632, 655, 700, 694,
+ 406, 406, 406, 407, 407, 692, 407, 1238, 407, 691,
+ 1238, 407, 407, 683, 682, 681, 407, 801, 801, 801,
+
+ 407, 407, 420, 680, 679, 801, 420, 420, 420, 632,
+ 678, 420, 677, 420, 684, 684, 684, 676, 420, 420,
+ 420, 430, 675, 684, 674, 430, 822, 822, 822, 430,
+ 430, 430, 684, 673, 430, 672, 430, 820, 820, 820,
+ 671, 430, 430, 430, 436, 820, 670, 669, 436, 436,
+ 436, 1239, 668, 436, 1239, 436, 835, 835, 835, 667,
+ 436, 436, 436, 440, 835, 684, 666, 440, 440, 440,
+ 1240, 663, 440, 1240, 440, 1246, 662, 822, 1246, 440,
+ 440, 440, 573, 573, 573, 573, 573, 573, 573, 573,
+ 573, 573, 573, 573, 573, 573, 573, 573, 573, 573,
+
+ 573, 573, 573, 573, 573, 573, 573, 573, 573, 573,
+ 573, 573, 573, 573, 573, 573, 573, 573, 573, 573,
+ 573, 573, 573, 573, 573, 573, 573, 573, 573, 573,
+ 573, 573, 573, 573, 573, 573, 573, 573, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 685, 685, 685, 688, 688, 688,
+
+ 689, 689, 689, 685, 690, 690, 690, 661, 660, 704,
+ 704, 704, 685, 704, 659, 688, 658, 704, 689, 731,
+ 731, 731, 690, 732, 732, 732, 656, 653, 731, 733,
+ 733, 733, 732, 651, 734, 734, 734, 731, 735, 735,
+ 735, 732, 744, 744, 744, 685, 744, 733, 688, 650,
+ 744, 689, 734, 647, 644, 690, 735, 768, 768, 768,
+ 704, 643, 642, 769, 769, 769, 768, 641, 1249, 638,
+ 731, 1249, 769, 634, 732, 768, 770, 770, 770, 633,
+ 733, 769, 771, 771, 771, 734, 772, 772, 772, 735,
+ 846, 846, 846, 744, 770, 775, 775, 775, 846, 775,
+
+ 771, 622, 621, 775, 772, 797, 797, 797, 768, 617,
+ 795, 795, 795, 616, 769, 615, 796, 796, 796, 795,
+ 798, 798, 798, 797, 614, 796, 613, 770, 795, 799,
+ 799, 799, 1263, 771, 796, 1263, 612, 772, 798, 611,
+ 802, 802, 802, 609, 802, 608, 775, 799, 802, 803,
+ 803, 803, 607, 803, 606, 605, 797, 815, 815, 815,
+ 604, 795, 603, 816, 816, 816, 815, 796, 817, 817,
+ 817, 798, 816, 602, 600, 815, 818, 818, 818, 599,
+ 799, 816, 598, 819, 819, 819, 817, 596, 821, 821,
+ 821, 802, 821, 585, 818, 584, 821, 830, 830, 830,
+
+ 803, 819, 831, 831, 831, 583, 830, 579, 815, 578,
+ 577, 831, 576, 575, 816, 830, 837, 837, 837, 817,
+ 831, 574, 832, 832, 832, 571, 570, 818, 833, 833,
+ 833, 834, 834, 834, 819, 564, 561, 559, 558, 821,
+ 832, 555, 550, 836, 836, 836, 833, 836, 830, 834,
+ 546, 836, 544, 831, 841, 841, 841, 842, 842, 842,
+ 843, 843, 843, 841, 541, 540, 842, 837, 844, 844,
+ 844, 539, 841, 832, 538, 842, 537, 536, 843, 833,
+ 535, 534, 834, 845, 845, 845, 844, 847, 847, 847,
+ 532, 847, 531, 530, 836, 847, 848, 848, 848, 529,
+
+ 528, 845, 852, 852, 852, 841, 527, 525, 842, 524,
+ 522, 843, 850, 850, 850, 851, 851, 851, 519, 844,
+ 852, 850, 517, 516, 851, 853, 853, 853, 512, 511,
+ 850, 503, 499, 851, 845, 857, 857, 857, 847, 854,
+ 854, 854, 498, 853, 855, 855, 855, 848, 862, 862,
+ 862, 489, 855, 852, 856, 856, 856, 854, 856, 858,
+ 858, 858, 856, 850, 487, 486, 851, 485, 858, 859,
+ 859, 859, 860, 860, 860, 483, 853, 858, 859, 482,
+ 860, 861, 861, 861, 481, 861, 857, 859, 478, 861,
+ 854, 476, 863, 863, 863, 865, 865, 865, 475, 862,
+
+ 863, 868, 868, 868, 474, 856, 473, 864, 864, 864,
+ 858, 864, 871, 871, 871, 864, 866, 866, 866, 472,
+ 859, 867, 867, 867, 866, 867, 869, 869, 869, 867,
+ 470, 469, 861, 468, 869, 870, 870, 870, 467, 870,
+ 872, 872, 872, 870, 466, 464, 865, 460, 872, 873,
+ 873, 873, 868, 873, 874, 874, 874, 873, 864, 875,
+ 875, 875, 457, 871, 877, 877, 877, 875, 456, 876,
+ 876, 876, 867, 876, 878, 878, 878, 876, 454, 879,
+ 879, 879, 878, 879, 453, 449, 870, 879, 880, 880,
+ 880, 881, 881, 881, 882, 882, 882, 448, 882, 881,
+
+ 873, 444, 882, 443, 439, 874, 883, 883, 883, 884,
+ 884, 884, 886, 886, 886, 877, 438, 884, 435, 434,
+ 876, 885, 885, 885, 431, 885, 887, 887, 887, 885,
+ 879, 889, 889, 889, 887, 429, 888, 888, 888, 880,
+ 888, 890, 890, 890, 888, 882, 891, 891, 891, 890,
+ 891, 892, 892, 892, 891, 428, 423, 883, 893, 893,
+ 893, 422, 419, 886, 416, 415, 893, 894, 894, 894,
+ 414, 894, 885, 413, 412, 894, 895, 895, 895, 898,
+ 898, 898, 889, 896, 896, 896, 411, 888, 897, 897,
+ 897, 896, 897, 899, 899, 899, 897, 891, 901, 901,
+
+ 901, 899, 892, 900, 900, 900, 410, 900, 902, 902,
+ 902, 900, 409, 903, 903, 903, 902, 903, 894, 408,
+ 405, 903, 904, 904, 904, 398, 393, 895, 392, 388,
+ 898, 386, 905, 905, 905, 907, 907, 907, 385, 897,
+ 905, 384, 906, 906, 906, 383, 906, 382, 380, 901,
+ 906, 908, 908, 908, 900, 910, 910, 910, 375, 908,
+ 369, 909, 909, 909, 903, 909, 911, 911, 911, 909,
+ 913, 913, 913, 904, 911, 912, 912, 912, 358, 912,
+ 914, 914, 914, 912, 357, 354, 907, 348, 914, 340,
+ 915, 915, 915, 906, 915, 916, 916, 916, 915, 917,
+
+ 917, 917, 919, 919, 919, 337, 910, 917, 334, 918,
+ 918, 918, 909, 918, 920, 920, 920, 918, 922, 922,
+ 922, 913, 920, 921, 921, 921, 912, 921, 923, 923,
+ 923, 921, 925, 925, 925, 333, 923, 928, 928, 928,
+ 332, 915, 331, 924, 924, 924, 916, 924, 926, 926,
+ 926, 924, 330, 919, 328, 326, 926, 927, 927, 927,
+ 918, 927, 929, 929, 929, 927, 931, 931, 931, 922,
+ 929, 930, 930, 930, 921, 930, 932, 932, 932, 930,
+ 934, 934, 934, 925, 932, 933, 933, 933, 928, 933,
+ 935, 935, 935, 933, 924, 936, 936, 936, 935, 936,
+
+ 937, 937, 937, 936, 938, 938, 938, 325, 927, 940,
+ 940, 940, 938, 943, 943, 943, 315, 931, 314, 939,
+ 939, 939, 930, 939, 941, 941, 941, 939, 946, 946,
+ 946, 934, 941, 942, 942, 942, 933, 942, 949, 949,
+ 949, 942, 944, 944, 944, 311, 936, 304, 296, 292,
+ 944, 937, 284, 945, 945, 945, 276, 945, 268, 259,
+ 940, 945, 257, 250, 943, 947, 947, 947, 247, 240,
+ 939, 234, 232, 947, 948, 948, 948, 217, 948, 946,
+ 214, 212, 948, 205, 942, 950, 950, 950, 203, 949,
+ 951, 951, 951, 950, 951, 952, 952, 952, 951, 953,
+
+ 953, 953, 197, 188, 945, 178, 175, 953, 954, 954,
+ 954, 168, 954, 955, 955, 955, 954, 166, 956, 956,
+ 956, 958, 958, 958, 165, 948, 956, 957, 957, 957,
+ 164, 957, 959, 959, 959, 957, 961, 961, 961, 163,
+ 959, 951, 160, 960, 960, 960, 952, 960, 962, 962,
+ 962, 960, 156, 963, 963, 963, 962, 963, 154, 954,
+ 153, 963, 143, 132, 955, 964, 964, 964, 965, 965,
+ 965, 130, 958, 966, 966, 966, 965, 966, 957, 122,
+ 115, 966, 967, 967, 967, 113, 106, 961, 968, 968,
+ 968, 969, 969, 969, 960, 969, 968, 103, 96, 969,
+
+ 970, 970, 970, 93, 963, 971, 971, 971, 92, 90,
+ 972, 972, 972, 971, 972, 82, 964, 73, 972, 973,
+ 973, 973, 67, 0, 966, 0, 974, 974, 974, 976,
+ 976, 976, 0, 967, 974, 975, 975, 975, 0, 975,
+ 0, 0, 969, 975, 977, 977, 977, 979, 979, 979,
+ 0, 970, 977, 0, 978, 978, 978, 0, 978, 0,
+ 0, 972, 978, 980, 980, 980, 982, 982, 982, 0,
+ 973, 980, 0, 981, 981, 981, 0, 981, 0, 0,
+ 976, 981, 983, 983, 983, 0, 975, 984, 984, 984,
+ 983, 984, 985, 985, 985, 984, 0, 0, 979, 986,
+
+ 986, 986, 987, 987, 987, 978, 987, 986, 0, 0,
+ 987, 988, 988, 988, 989, 989, 989, 982, 0, 990,
+ 990, 990, 989, 990, 981, 0, 0, 990, 991, 991,
+ 991, 992, 992, 992, 994, 994, 994, 0, 984, 992,
+ 993, 993, 993, 985, 993, 997, 997, 997, 993, 995,
+ 995, 995, 0, 987, 1000, 1000, 1000, 995, 0, 996,
+ 996, 996, 988, 996, 998, 998, 998, 996, 0, 0,
+ 990, 0, 998, 999, 999, 999, 0, 999, 0, 991,
+ 0, 999, 1001, 1001, 1001, 994, 1003, 1003, 1003, 0,
+ 1001, 993, 0, 1002, 1002, 1002, 997, 1002, 1004, 1004,
+
+ 1004, 1002, 1006, 1006, 1006, 1000, 1004, 1005, 1005, 1005,
+ 996, 1005, 1007, 1007, 1007, 1005, 0, 1008, 1008, 1008,
+ 1007, 1008, 0, 0, 999, 1008, 1009, 1009, 1009, 0,
+ 1010, 1010, 1010, 1012, 1012, 1012, 0, 1003, 1010, 1011,
+ 1011, 1011, 0, 1011, 1002, 0, 0, 1011, 1013, 1013,
+ 1013, 0, 0, 1006, 0, 0, 1013, 0, 1005, 1014,
+ 1014, 1014, 0, 1014, 1015, 1015, 1015, 1014, 1008, 0,
+ 1016, 1016, 1016, 1018, 1018, 1018, 0, 1009, 1016, 1017,
+ 1017, 1017, 0, 1017, 1012, 0, 0, 1017, 0, 0,
+ 1011, 1019, 1019, 1019, 1020, 1020, 1020, 0, 1020, 1019,
+
+ 0, 0, 1020, 1021, 1021, 1021, 1022, 1022, 1022, 0,
+ 1014, 1024, 1024, 1024, 1022, 1015, 0, 1023, 1023, 1023,
+ 0, 1023, 0, 0, 1018, 1023, 1025, 1025, 1025, 0,
+ 1017, 1026, 1026, 1026, 1025, 1026, 1027, 1027, 1027, 1026,
+ 1028, 1028, 1028, 0, 0, 1020, 0, 0, 1028, 1029,
+ 1029, 1029, 0, 1029, 1021, 0, 0, 1029, 1030, 1030,
+ 1030, 0, 1024, 1031, 1031, 1031, 0, 0, 1023, 0,
+ 0, 1031, 1032, 1032, 1032, 0, 1032, 1033, 1033, 1033,
+ 1032, 0, 1026, 1034, 1034, 1034, 0, 1027, 1035, 1035,
+ 1035, 1034, 1035, 1036, 1036, 1036, 1035, 1037, 1037, 1037,
+
+ 1029, 0, 1038, 1038, 1038, 1037, 1038, 0, 0, 1030,
+ 1038, 1039, 1039, 1039, 1040, 1040, 1040, 1041, 1041, 1041,
+ 0, 1041, 1040, 1032, 0, 1041, 0, 0, 1033, 1042,
+ 1042, 1042, 1043, 1043, 1043, 1045, 1045, 1045, 0, 1035,
+ 1043, 1044, 1044, 1044, 1036, 1044, 1046, 1046, 1046, 1044,
+ 1048, 1048, 1048, 1038, 1046, 1047, 1047, 1047, 0, 1047,
+ 0, 0, 1039, 1047, 1049, 1049, 1049, 0, 1041, 1050,
+ 1050, 1050, 1049, 1050, 1051, 1051, 1051, 1050, 0, 0,
+ 1042, 1052, 1052, 1052, 0, 0, 1045, 0, 0, 1052,
+ 0, 0, 1044, 0, 1053, 1053, 1053, 0, 1053, 0,
+
+ 0, 1048, 1053, 1054, 1054, 1054, 1047, 1055, 1055, 1055,
+ 1056, 1056, 1056, 0, 1056, 1055, 0, 0, 1056, 0,
+ 1050, 1057, 1057, 1057, 0, 1051, 1058, 1058, 1058, 1059,
+ 1059, 1059, 0, 1059, 1058, 0, 0, 1059, 1060, 1060,
+ 1060, 0, 1062, 1062, 1062, 1053, 1062, 1063, 1063, 1063,
+ 1062, 1064, 1064, 1064, 1054, 1064, 1065, 1065, 1065, 1064,
+ 0, 1056, 1066, 1066, 1066, 0, 1066, 1067, 1067, 1067,
+ 1066, 0, 1057, 1068, 1068, 1068, 0, 1068, 0, 0,
+ 1059, 1068, 1069, 1069, 1069, 0, 1070, 1070, 1070, 1060,
+ 1070, 0, 0, 1062, 1070, 1071, 1071, 1071, 1063, 1073,
+
+ 1073, 1073, 1064, 0, 1072, 1072, 1072, 1065, 1072, 1074,
+ 1074, 1074, 1072, 1066, 1075, 1075, 1075, 0, 1067, 1076,
+ 1076, 1076, 0, 0, 1068, 1077, 1077, 1077, 1078, 1078,
+ 1078, 0, 0, 1069, 1080, 1080, 1080, 1070, 1081, 1081,
+ 1081, 1082, 1082, 1082, 0, 0, 1071, 1083, 1083, 1083,
+ 1073, 1084, 1084, 1084, 0, 1072, 1085, 1085, 1085, 0,
+ 1074, 1086, 1086, 1086, 0, 1075, 1087, 1087, 1087, 0,
+ 1076, 1088, 1088, 1088, 0, 0, 1077, 0, 0, 1078,
+ 1089, 1089, 1089, 0, 0, 1080, 1090, 1090, 1090, 1081,
+ 0, 0, 1082, 1091, 1091, 1091, 0, 0, 1083, 1092,
+
+ 1092, 1092, 1084, 1093, 1093, 1093, 0, 1085, 1094, 1094,
+ 1094, 0, 1086, 1095, 1095, 1095, 0, 1087, 1096, 1096,
+ 1096, 0, 1088, 1097, 1097, 1097, 1098, 1098, 1098, 0,
+ 0, 1089, 1099, 1099, 1099, 0, 0, 1090, 1100, 1100,
+ 1100, 1101, 1101, 1101, 1091, 1102, 1102, 1102, 0, 0,
+ 1092, 1103, 1103, 1103, 1093, 1104, 1104, 1104, 0, 1094,
+ 1105, 1105, 1105, 0, 1095, 1106, 1106, 1106, 0, 1096,
+ 1107, 1107, 1107, 0, 1097, 0, 0, 1098, 1108, 1108,
+ 1108, 0, 0, 1099, 1109, 1109, 1109, 0, 0, 1100,
+ 0, 0, 1101, 1110, 1110, 1110, 1102, 1111, 1111, 1111,
+
+ 0, 0, 1103, 1112, 1112, 1112, 1104, 1113, 1113, 1113,
+ 0, 1105, 1114, 1114, 1114, 0, 1106, 1115, 1115, 1115,
+ 0, 1107, 1116, 1116, 1116, 1117, 1117, 1117, 0, 1108,
+ 1118, 1118, 1118, 0, 0, 1109, 1119, 1119, 1119, 1120,
+ 1120, 1120, 0, 0, 1110, 1121, 1121, 1121, 1111, 1122,
+ 1122, 1122, 0, 0, 1112, 1123, 1123, 1123, 1113, 1124,
+ 1124, 1124, 0, 1114, 1125, 1125, 1125, 0, 1115, 1126,
+ 1126, 1126, 0, 1116, 0, 0, 1117, 1127, 1127, 1127,
+ 0, 1118, 1128, 1128, 1128, 0, 0, 1119, 0, 0,
+ 1120, 1129, 1129, 1129, 0, 0, 1121, 1130, 1130, 1130,
+
+ 1122, 1131, 1131, 1131, 0, 0, 1123, 1132, 1132, 1132,
+ 1124, 1133, 1133, 1133, 0, 1125, 1134, 1134, 1134, 0,
+ 1126, 1135, 1135, 1135, 1136, 1136, 1136, 0, 1127, 1137,
+ 1137, 1137, 0, 1128, 1138, 1138, 1138, 1139, 1139, 1139,
+ 0, 0, 1129, 1140, 1140, 1140, 0, 0, 1130, 1141,
+ 1141, 1141, 1131, 1142, 1142, 1142, 0, 0, 1132, 1143,
+ 1143, 1143, 1133, 1144, 1144, 1144, 0, 1134, 1145, 1145,
+ 1145, 0, 1135, 0, 0, 1136, 1146, 1146, 1146, 0,
+ 1137, 1147, 1147, 1147, 0, 1138, 0, 0, 1139, 1148,
+ 1148, 1148, 0, 0, 1140, 1149, 1149, 1149, 0, 0,
+
+ 1141, 1150, 1150, 1150, 1142, 1151, 1151, 1151, 0, 0,
+ 1143, 1152, 1152, 1152, 1144, 1153, 1153, 1153, 0, 1145,
+ 1154, 1154, 1154, 1155, 1155, 1155, 0, 1146, 0, 0,
+ 0, 0, 1147, 0, 0, 0, 0, 0, 0, 0,
+ 1148, 0, 0, 0, 0, 0, 1149, 0, 0, 0,
+ 0, 0, 1150, 0, 0, 0, 1151, 0, 0, 0,
+ 0, 0, 1152, 0, 0, 0, 1153, 0, 0, 0,
+ 0, 1154, 0, 0, 1155, 1157, 1157, 1157, 1157, 1157,
+ 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157,
+ 1157, 1157, 1157, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
+
+ 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
+ 1158, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159,
+ 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1160,
+ 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160,
+ 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1161, 1161, 1161,
+ 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161,
+ 1161, 1161, 1161, 1161, 1161, 1162, 1162, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162,
+ 1162, 1162, 1162, 1163, 1163, 1163, 1163, 1163, 1163, 1163,
+ 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163,
+
+ 1163, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
+ 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1165,
+ 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
+ 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1166, 1166, 1166,
+ 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166,
+ 1166, 1166, 1166, 1166, 1166, 1167, 1167, 1167, 1167, 1167,
+ 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167,
+ 1167, 1167, 1167, 1168, 1168, 1168, 1168, 1168, 1168, 1168,
+ 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168,
+ 1168, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169,
+
+ 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1170,
+ 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170,
+ 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1171, 1171, 1171,
+ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171,
+ 1171, 1171, 1171, 1171, 1171, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+ 1172, 1172, 1172, 1173, 1173, 1173, 1173, 1173, 1173, 1173,
+ 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173,
+ 1173, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174,
+ 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1175,
+
+ 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175,
+ 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1178, 1178, 1178,
+ 0, 1178, 1178, 0, 0, 1178, 1178, 1178, 1178, 0,
+ 1178, 1178, 1178, 1178, 1178, 1179, 1179, 1179, 0, 1179,
+ 1179, 1179, 0, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1180, 1180, 1180, 0, 1180, 1180, 0,
+ 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180,
+ 1181, 1181, 1181, 0, 1181, 1181, 1181, 1181, 1181, 1181,
+ 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1182, 1182,
+ 1182, 0, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+
+ 1182, 1182, 1182, 1182, 1182, 1182, 1183, 1183, 1183, 0,
+ 0, 0, 1183, 0, 0, 0, 0, 1183, 0, 0,
+ 1183, 1184, 1184, 1184, 0, 0, 1184, 0, 1184, 1184,
+ 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1185, 1185,
+ 1185, 0, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185,
+ 1185, 1185, 1185, 1185, 1185, 1185, 1186, 1186, 1186, 0,
+ 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186,
+ 1186, 1186, 1186, 1186, 1187, 0, 0, 0, 0, 0,
+ 1187, 0, 0, 0, 0, 1187, 0, 0, 1187, 1188,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
+
+ 1188, 1188, 1188, 1188, 1188, 1188, 1189, 1189, 0, 0,
+ 0, 0, 1189, 0, 0, 0, 0, 1189, 0, 0,
+ 1189, 1189, 1190, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1190, 0, 1190, 0, 0, 1190, 1192, 1192, 1192,
+ 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192,
+ 1192, 1192, 1192, 1192, 1192, 1193, 0, 1193, 0, 1193,
+ 1193, 1193, 1193, 1193, 0, 1193, 1193, 0, 1193, 1193,
+ 0, 1193, 1194, 1194, 1194, 0, 1194, 1194, 1194, 1194,
+ 1194, 0, 1194, 1194, 1194, 1194, 1194, 1194, 0, 1194,
+ 1195, 1195, 1195, 0, 1195, 1195, 1195, 1195, 1195, 1195,
+
+ 1195, 1195, 1195, 1195, 1195, 0, 1195, 1196, 1196, 1196,
+ 0, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 0,
+ 1196, 1196, 0, 1196, 1197, 0, 1197, 0, 1197, 1197,
+ 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 0,
+ 1197, 1198, 0, 1198, 0, 1198, 1198, 1198, 1198, 1198,
+ 0, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1199,
+ 0, 1199, 0, 1199, 1199, 1199, 1199, 1199, 1199, 1199,
+ 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1203, 1203, 1203,
+ 0, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1205, 1205, 1205, 0, 1205,
+
+ 1205, 1205, 0, 1205, 1205, 1205, 1205, 1205, 1205, 1205,
+ 1205, 1205, 1205, 1206, 1206, 1206, 0, 1206, 1206, 1206,
+ 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206,
+ 1206, 1207, 1207, 0, 1207, 0, 0, 1207, 1208, 0,
+ 1208, 1208, 0, 1208, 0, 1208, 0, 1208, 1209, 1209,
+ 1209, 0, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+ 1209, 1209, 1209, 1209, 1209, 1209, 1211, 1211, 1211, 0,
+ 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211,
+ 1211, 1211, 1211, 1211, 1212, 1212, 1212, 0, 1212, 1212,
+ 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212,
+
+ 1212, 1212, 1214, 1214, 1214, 0, 1214, 1214, 0, 0,
+ 1214, 1214, 1214, 1214, 0, 1214, 1214, 1214, 1214, 1214,
+ 1215, 1215, 1215, 0, 1215, 1215, 1215, 1215, 1215, 1215,
+ 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1216, 1216, 1216,
+ 0, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216,
+ 1216, 1216, 1216, 1216, 1216, 1217, 1217, 1217, 0, 1217,
+ 1217, 0, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+ 1217, 1217, 1218, 1218, 1218, 0, 1218, 1218, 1218, 1218,
+ 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
+ 1219, 1219, 1219, 0, 1219, 1219, 1219, 1219, 1219, 1219,
+
+ 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1220, 1220,
+ 1220, 0, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220,
+ 1220, 1220, 1220, 1220, 1220, 1220, 1221, 1221, 1221, 0,
+ 0, 0, 1221, 0, 0, 0, 0, 1221, 0, 0,
+ 1221, 1222, 1222, 1222, 0, 0, 1222, 0, 1222, 1222,
+ 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1223, 1223,
+ 1223, 0, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223,
+ 1223, 1223, 1223, 1223, 1223, 1223, 1224, 0, 0, 0,
+ 0, 0, 1224, 0, 0, 0, 0, 1224, 0, 0,
+ 1224, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225,
+
+ 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1226, 1226,
+ 0, 0, 0, 0, 1226, 0, 0, 0, 0, 1226,
+ 0, 0, 1226, 1226, 1227, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1227, 0, 1227, 0, 0, 1227, 1229,
+ 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
+ 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1230, 0, 1230,
+ 0, 1230, 1230, 1230, 1230, 1230, 0, 1230, 1230, 0,
+ 1230, 1230, 0, 1230, 1231, 1231, 1231, 0, 1231, 1231,
+ 1231, 1231, 1231, 0, 1231, 1231, 1231, 1231, 1231, 1231,
+ 0, 1231, 1232, 1232, 1232, 0, 1232, 1232, 1232, 1232,
+
+ 1232, 1232, 1232, 1232, 1232, 1232, 1232, 0, 1232, 1233,
+ 1233, 1233, 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233,
+ 1233, 0, 1233, 1233, 0, 1233, 1234, 0, 1234, 0,
+ 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234,
+ 1234, 0, 1234, 1235, 0, 1235, 0, 1235, 1235, 1235,
+ 1235, 1235, 0, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1235, 1236, 0, 1236, 0, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1241,
+ 1241, 1241, 0, 1241, 1241, 1241, 1241, 1241, 1241, 1241,
+ 1241, 1241, 1241, 1241, 1241, 1241, 1242, 1242, 1242, 0,
+
+ 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242,
+ 1242, 1242, 1242, 1242, 1243, 1243, 0, 1243, 0, 0,
+ 1243, 1244, 1244, 1244, 0, 1244, 1244, 1244, 1244, 1244,
+ 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1245,
+ 1245, 1245, 0, 1245, 1245, 1245, 1245, 1245, 1245, 1245,
+ 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1247, 1247, 1247,
+ 0, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247,
+ 1247, 1247, 1247, 1247, 1247, 1248, 1248, 1248, 0, 1248,
+ 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248,
+ 1248, 1248, 1248, 1250, 1250, 1250, 0, 1250, 1250, 1250,
+
+ 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250,
+ 1251, 1251, 1251, 0, 1251, 1251, 0, 0, 1251, 1251,
+ 1251, 1251, 0, 1251, 1251, 1251, 1251, 1251, 1252, 1252,
+ 1252, 0, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252,
+ 1252, 1252, 1252, 1252, 1252, 1252, 1253, 1253, 1253, 0,
+ 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253,
+ 1253, 1253, 1253, 1253, 1254, 1254, 1254, 0, 1254, 1254,
+ 0, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254,
+ 1254, 1255, 1255, 1255, 0, 0, 0, 1255, 0, 0,
+ 0, 0, 1255, 0, 0, 1255, 1256, 1256, 1256, 0,
+
+ 0, 1256, 0, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1257, 1257, 1257, 0, 1257, 1257, 1257,
+ 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257,
+ 1257, 1258, 1258, 1258, 0, 1258, 1258, 1258, 1258, 1258,
+ 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1259, 1259,
+ 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259,
+ 1259, 1259, 1259, 1259, 1259, 1259, 1260, 1260, 1260, 0,
+ 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+ 1260, 1260, 1260, 1261, 1261, 1261, 0, 1261, 1261, 1261,
+ 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261,
+
+ 1262, 0, 0, 0, 1262, 0, 0, 0, 0, 0,
+ 0, 0, 1262, 0, 1262, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 0, 1264,
+ 1264, 0, 1264, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156,
+ 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156
+ } ;
+
+extern int preYY_flex_debug;
+int preYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *preYYtext;
+#line 1 "pre.l"
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#line 19 "pre.l"
+
+/*
+ * includes
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qfile.h>
+#include <qstrlist.h>
+#include <qdict.h>
+#include <qregexp.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+
+#include "pre.h"
+#include "constexp.h"
+#include "define.h"
+#include "doxygen.h"
+#include "message.h"
+#include "util.h"
+#include "defargs.h"
+#include "debug.h"
+#include "bufstr.h"
+#include "portable.h"
+#include "bufstr.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+
+struct FileState
+{
+ FileState(int size) : fileBuf(size),
+ oldFileBuf(0), oldFileBufPos(0) {}
+ int lineNr;
+ BufStr fileBuf;
+ BufStr *oldFileBuf;
+ int oldFileBufPos;
+ YY_BUFFER_STATE bufState;
+ QCString fileName;
+};
+
+/* -----------------------------------------------------------------
+ *
+ * scanner's state
+ */
+
+static int g_yyLineNr = 1;
+static QCString g_yyFileName;
+static FileDef *g_yyFileDef;
+static FileDef *g_inputFileDef;
+static int g_ifcount = 0;
+static QStrList *g_pathList = 0;
+static QStack<FileState> g_includeStack;
+static QDict<int> *g_argDict;
+static int g_defArgs = -1;
+static QCString g_defName;
+static QCString g_defText;
+static QCString g_defLitText;
+static QCString g_defArgsStr;
+static QCString g_defExtraSpacing;
+static bool g_defVarArgs;
+static int g_level;
+static int g_lastCContext;
+static int g_lastCPPContext;
+static QArray<int> g_levelGuard;
+static BufStr *g_inputBuf;
+static int g_inputBufPos;
+static BufStr *g_outputBuf;
+static int g_roundCount;
+static bool g_quoteArg;
+static DefineDict *g_globalDefineDict = new DefineDict(10009);
+static DefineDict *g_fileDefineDict = new DefineDict(1009);
+static DefineDict *g_expandedDict;
+static int g_findDefArgContext;
+static bool g_expectGuard;
+static QCString g_lastGuardName;
+static QCString g_incName;
+static QCString g_guardExpr;
+static int g_curlyCount;
+static bool g_nospaces; // add extra spaces during macro expansion
+
+static bool g_macroExpansion; // from the configuration
+static bool g_expandOnlyPredef; // from the configuration
+static int g_commentCount;
+static bool g_insideComment;
+static bool g_isImported;
+static QCString g_blockName;
+static int g_condCtx;
+static bool g_skip;
+static QStack<bool> g_condStack;
+static bool g_insideCS; // C# has simpler preprocessor
+static bool g_isSource;
+
+static bool g_lexInit = FALSE;
+
+DefineDict* getGlobalDefineDict()
+{
+ return g_globalDefineDict;
+}
+
+static void setFileName(const char *name)
+{
+ bool ambig;
+ QFileInfo fi(name);
+ g_yyFileName=convertToQCString(fi.absFilePath());
+ g_yyFileDef=findFileDef(Doxygen::inputNameDict,g_yyFileName,ambig);
+ if (g_yyFileDef==0) // if this is not an input file check if it is an
+ // include file
+ {
+ g_yyFileDef=findFileDef(Doxygen::includeNameDict,g_yyFileName,ambig);
+ }
+ //printf("setFileName(%s) g_yyFileName=%s g_yyFileDef=%p\n",
+ // name,g_yyFileName.data(),g_yyFileDef);
+ if (g_yyFileDef && g_yyFileDef->isReference()) g_yyFileDef=0;
+ g_insideCS = getLanguageFromFileName(g_yyFileName)==SrcLangExt_CSharp;
+ g_isSource = guessSection(g_yyFileName);
+}
+
+static void incrLevel()
+{
+ g_level++;
+ g_levelGuard.resize(g_level);
+ g_levelGuard[g_level-1]=FALSE;
+ //printf("%s line %d: incrLevel %d\n",g_yyFileName.data(),g_yyLineNr,g_level);
+}
+
+static void decrLevel()
+{
+ //printf("%s line %d: decrLevel %d\n",g_yyFileName.data(),g_yyLineNr,g_level);
+ if (g_level > 0)
+ {
+ g_level--;
+ g_levelGuard.resize(g_level);
+ }
+ else
+ {
+ warn(g_yyFileName,g_yyLineNr,"warning: More #endif's than #if's found.\n");
+ }
+}
+
+static bool otherCaseDone()
+{
+ if (g_level==0)
+ {
+ warn(g_yyFileName,g_yyLineNr,"warning: Found an #else without a preceding #if.\n");
+ return TRUE;
+ }
+ else
+ {
+ return g_levelGuard[g_level-1];
+ }
+}
+
+static void setCaseDone(bool value)
+{
+ g_levelGuard[g_level-1]=value;
+}
+
+static bool macroIsAccessible(Define *def)
+{
+ //printf("macroIsAccessible(%s) input=%s def=%s\n",
+ // def->name.data(),g_inputFileDef?g_inputFileDef->name().data():"<none>",
+ // def->fileDef ? def->fileDef->name().data() : "<none>");
+ if (def && def->isPredefined) // predefined macro -> globally accessible
+ {
+ //printf("%s: predefined macro %s\n",g_inputFileDef->name().data(),def->name.data());
+ return TRUE;
+ }
+ if (def && def->fileDef==g_inputFileDef)
+ {
+ //printf("%s: macro %s defined in this file at line %d now at %d\n",
+ // g_inputFileDef->name().data(),def->name.data(),def->lineNr,g_yyLineNr);
+ return def->lineNr<=g_yyLineNr;
+ }
+ if (g_inputFileDef && def && def->fileDef) // check if g_inputFileDef actually includes def->fileDef
+ {
+ QDict<FileDef> includedFiles(257);
+ bool b = g_inputFileDef->includes(def->fileDef,&includedFiles);
+ //printf("%s: Checking for accessibility of define '%s' (defined in %s): result=%d\n",
+ // g_inputFileDef->name().data(),def->name.data(),def->fileDef->name().data(),b);
+ return b;
+ }
+ //printf("not accessible!\n");
+ return FALSE;
+}
+
+static Define *isDefined(const char *name)
+{
+ Define *def=0;
+ if (name)
+ {
+ def=g_globalDefineDict->find(name);
+ //if ((def=fileDefineCache->findDefine(g_yyFileName,name)) && !def->undef)
+ // return def;
+ if (def && def->undef) def=0;
+ if (def && !macroIsAccessible(def)) def=0;
+ }
+ return def;
+}
+
+
+static QDict<void> g_allIncludes(10009);
+
+static FileState *checkAndOpenFile(const QCString &fileName,bool &alreadyIncluded)
+{
+ alreadyIncluded = FALSE;
+ FileState *fs = 0;
+ //printf("checkAndOpenFile(%s)\n",fileName.data());
+ QFileInfo fi(fileName);
+ if (fi.exists() && fi.isFile())
+ {
+ static QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS");
+ if (patternMatch(fi,&exclPatterns)) return 0;
+
+ QCString absName = convertToQCString(fi.absFilePath());
+
+ // global guard
+ if (g_curlyCount==0) // not #include inside { ... }
+ {
+ if (g_allIncludes.find(absName)!=0)
+ {
+ alreadyIncluded = TRUE;
+ //printf(" already included 1\n");
+ return 0; // already done
+ }
+ g_allIncludes.insert(absName,(void *)0x8);
+ }
+ // check include stack for absName
+
+ QStack<FileState> tmpStack;
+ g_includeStack.setAutoDelete(FALSE);
+ while ((fs=g_includeStack.pop()))
+ {
+ if (fs->fileName==absName) alreadyIncluded=TRUE;
+ tmpStack.push(fs);
+ }
+ while ((fs=tmpStack.pop()))
+ {
+ g_includeStack.push(fs);
+ }
+ g_includeStack.setAutoDelete(TRUE);
+
+ if (alreadyIncluded)
+ {
+ //printf(" already included 2\n");
+ return 0;
+ }
+ //printf("#include %s\n",absName.data());
+
+ fs = new FileState(fi.size()+4096);
+ alreadyIncluded = FALSE;
+ if (!readInputFile(absName,fs->fileBuf))
+ { // error
+ //printf(" error reading\n");
+ delete fs;
+ fs=0;
+ }
+ else
+ {
+ fs->oldFileBuf = g_inputBuf;
+ fs->oldFileBufPos = g_inputBufPos;
+ }
+ }
+ return fs;
+}
+
+static FileState *findFile(const char *fileName,bool localInclude,bool &alreadyIncluded)
+{
+ //printf("** findFile(%s,%d) g_yyFileName=%s\n",fileName,localInclude,g_yyFileName.data());
+ if (localInclude && !g_yyFileName.isEmpty())
+ {
+ QFileInfo fi(g_yyFileName);
+ if (fi.exists())
+ {
+ QCString absName = QCString(fi.dirPath(TRUE).data())+"/"+fileName;
+ FileState *fs = checkAndOpenFile(absName,alreadyIncluded);
+ if (fs)
+ {
+ setFileName(absName);
+ g_yyLineNr=1;
+ return fs;
+ }
+ else if (alreadyIncluded)
+ {
+ return 0;
+ }
+ }
+ }
+ if (g_pathList==0)
+ {
+ return 0;
+ }
+ char *s=g_pathList->first();
+ while (s)
+ {
+ QCString absName = (QCString)s+"/"+fileName;
+ //printf(" Looking for %s in %s\n",fileName,s);
+ FileState *fs = checkAndOpenFile(absName,alreadyIncluded);
+ if (fs)
+ {
+ setFileName(absName);
+ g_yyLineNr=1;
+ //printf(" -> found it\n");
+ return fs;
+ }
+ else if (alreadyIncluded)
+ {
+ return 0;
+ }
+
+ s=g_pathList->next();
+ }
+ return 0;
+}
+
+static QCString extractTrailingComment(const char *s)
+{
+ if (s==0) return "";
+ int i=strlen(s)-1;
+ while (i>=0)
+ {
+ char c=s[i];
+ switch (c)
+ {
+ case '/':
+ {
+ i--;
+ if (i>=0 && s[i]=='*') // end of a comment block
+ {
+ i--;
+ while (i>0 && !(s[i-1]=='/' && s[i]=='*')) i--;
+ if (i==0) return s; else return &s[i-1];
+ }
+ else
+ {
+ return "";
+ }
+ }
+ break;
+ // whitespace or line-continuation
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ case '\\':
+ break;
+ default:
+ return "";
+ }
+ i--;
+ }
+ return "";
+}
+
+static int getNextChar(const QCString &expr,QCString *rest,uint &pos);
+static int getCurrentChar(const QCString &expr,QCString *rest,uint pos);
+static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c);
+static void expandExpression(QCString &expr,QCString *rest,int pos);
+
+static QCString stringize(const QCString &s)
+{
+ QCString result;
+ uint i=0;
+ bool inString=FALSE;
+ bool inChar=FALSE;
+ char c,pc;
+ while (i<s.length())
+ {
+ if (!inString && !inChar)
+ {
+ while (i<s.length() && !inString && !inChar)
+ {
+ c=s.at(i++);
+ if (c=='"')
+ {
+ result+="\\\"";
+ inString=TRUE;
+ }
+ else if (c=='\'')
+ {
+ result+=c;
+ inChar=TRUE;
+ }
+ else
+ {
+ result+=c;
+ }
+ }
+ }
+ else if (inChar)
+ {
+ while (i<s.length() && inChar)
+ {
+ c=s.at(i++);
+ if (c=='\'')
+ {
+ result+='\'';
+ inChar=FALSE;
+ }
+ else if (c=='\\')
+ {
+ result+="\\\\";
+ }
+ else
+ {
+ result+=c;
+ }
+ }
+ }
+ else
+ {
+ pc=0;
+ while (i<s.length() && inString)
+ {
+ char c=s.at(i++);
+ if (c=='"')
+ {
+ result+="\\\"";
+ inString= pc=='\\';
+ }
+ else if (c=='\\')
+ result+="\\\\";
+ else
+ result+=c;
+ pc=c;
+ }
+ }
+ }
+ //printf("stringize `%s'->`%s'\n",s.data(),result.data());
+ return result;
+}
+
+/*! Execute all ## operators in expr.
+ * If the macro name before or after the operator contains a no-rescan
+ * marker (@-) then this is removed (before the concatenated macro name
+ * may be expanded again.
+ */
+static void processConcatOperators(QCString &expr)
+{
+ //printf("processConcatOperators: in=`%s'\n",expr.data());
+ QRegExp r("[ \\t\\n]*##[ \\t\\n]*");
+ int l,n,i=0;
+ if (expr.isEmpty()) return;
+ while ((n=r.match(expr,i,&l))!=-1)
+ {
+ //printf("Match: `%s'\n",expr.data()+i);
+ if (n+l+1<(int)expr.length() && expr.at(n+l)=='@' && expr.at(n+l+1)=='-')
+ {
+ // remove no-rescan marker after ID
+ l+=2;
+ }
+ //printf("found `%s'\n",expr.mid(n,l).data());
+ // remove the ## operator and the surrounding whitespace
+ expr=expr.left(n)+expr.right(expr.length()-n-l);
+ int k=n-1;
+ while (k>=0 && isId(expr.at(k))) k--;
+ if (k>0 && expr.at(k)=='-' && expr.at(k-1)=='@')
+ {
+ // remove no-rescan marker before ID
+ expr=expr.left(k-1)+expr.right(expr.length()-k-1);
+ n-=2;
+ }
+ i=n;
+ }
+ //printf("processConcatOperators: out=`%s'\n",expr.data());
+}
+
+static void yyunput (int c,char *buf_ptr );
+static void returnCharToStream(char c)
+{
+ unput(c);
+}
+
+static inline void addTillEndOfString(const QCString &expr,QCString *rest,
+ uint &pos,char term,QCString &arg)
+{
+ int cc;
+ while ((cc=getNextChar(expr,rest,pos))!=EOF)
+ {
+ if (cc=='\\') arg+=(char)cc,cc=getNextChar(expr,rest,pos);
+ else if (cc==term) return;
+ arg+=(char)cc;
+ }
+}
+
+/*! replaces the function macro \a def whose argument list starts at
+ * \a pos in expression \a expr.
+ * Notice that this routine may scan beyond the \a expr string if needed.
+ * In that case the characters will be read from the input file.
+ * The replacement string will be returned in \a result and the
+ * length of the (unexpanded) argument list is stored in \a len.
+ */
+static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int &len,const Define *def,QCString &result)
+{
+ //printf("replaceFunctionMacro(expr=%s,rest=%s,pos=%d,def=%s) level=%d\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),g_level);
+ uint j=pos;
+ len=0;
+ result.resize(0);
+ int cc;
+ while ((cc=getCurrentChar(expr,rest,j))!=EOF && isspace(cc))
+ {
+ len++;
+ getNextChar(expr,rest,j);
+ }
+ if (cc!='(')
+ {
+ unputChar(expr,rest,j,' ');
+ return FALSE;
+ }
+ getNextChar(expr,rest,j); // eat the `(' character
+
+ QDict<QCString> argTable; // list of arguments
+ argTable.setAutoDelete(TRUE);
+ QCString arg;
+ int argCount=0;
+ bool done=FALSE;
+
+ // PHASE 1: read the macro arguments
+ if (def->nargs==0)
+ {
+ while ((cc=getNextChar(expr,rest,j))!=EOF)
+ {
+ char c = (char)cc;
+ if (c==')') break;
+ }
+ }
+ else
+ {
+ while (!done && (argCount<def->nargs || def->varArgs) &&
+ ((cc=getNextChar(expr,rest,j))!=EOF)
+ )
+ {
+ char c=(char)cc;
+ if (c=='(') // argument is a function => search for matching )
+ {
+ int level=1;
+ arg+=c;
+ //char term='\0';
+ while ((cc=getNextChar(expr,rest,j))!=EOF)
+ {
+ char c=(char)cc;
+ //printf("processing %c: term=%c (%d)\n",c,term,term);
+ if (c=='\'' || c=='\"') // skip ('s and )'s inside strings
+ {
+ arg+=c;
+ addTillEndOfString(expr,rest,j,c,arg);
+ }
+ if (c==')')
+ {
+ level--;
+ arg+=c;
+ if (level==0) break;
+ }
+ else if (c=='(')
+ {
+ level++;
+ arg+=c;
+ }
+ else
+ arg+=c;
+ }
+ }
+ else if (c==')' || c==',') // last or next argument found
+ {
+ if (c==',' && argCount==def->nargs-1 && def->varArgs)
+ {
+ arg=arg.stripWhiteSpace();
+ arg+=',';
+ }
+ else
+ {
+ QCString argKey;
+ argKey.sprintf("@%d",argCount++); // key name
+ arg=arg.stripWhiteSpace();
+ // add argument to the lookup table
+ argTable.insert(argKey, new QCString(arg));
+ arg.resize(0);
+ if (c==')') // end of the argument list
+ {
+ done=TRUE;
+ }
+ }
+ }
+ else if (c=='\"') // append literal strings
+ {
+ arg+=c;
+ bool found=FALSE;
+ while (!found && (cc=getNextChar(expr,rest,j))!=EOF)
+ {
+ found = cc=='"';
+ if (cc=='\\')
+ {
+ c=(char)cc;
+ arg+=c;
+ if ((cc=getNextChar(expr,rest,j))==EOF) break;
+ }
+ c=(char)cc;
+ arg+=c;
+ }
+ }
+ else if (c=='\'') // append literal characters
+ {
+ arg+=c;
+ bool found=FALSE;
+ while (!found && (cc=getNextChar(expr,rest,j))!=EOF)
+ {
+ found = cc=='\'';
+ if (cc=='\\')
+ {
+ c=(char)cc;
+ arg+=c;
+ if ((cc=getNextChar(expr,rest,j))==EOF) break;
+ }
+ c=(char)cc;
+ arg+=c;
+ }
+ }
+ else // append other characters
+ {
+ arg+=c;
+ }
+ }
+ }
+
+ // PHASE 2: apply the macro function
+ if (argCount==def->nargs ||
+ (argCount>def->nargs && def->varArgs)) // matching parameters lists
+ {
+ uint k=0;
+ // substitution of all formal arguments
+ QCString resExpr;
+ const QCString d=def->definition.stripWhiteSpace();
+ //printf("Macro definition: %s\n",d.data());
+ bool inString=FALSE;
+ while (k<d.length())
+ {
+ if (d.at(k)=='@') // maybe a marker, otherwise an escaped @
+ {
+ if (d.at(k+1)=='@') // escaped @ => copy it (is unescaped later)
+ {
+ k+=2;
+ resExpr+="@@"; // we unescape these later
+ }
+ else if (d.at(k+1)=='-') // no-rescan marker
+ {
+ k+=2;
+ resExpr+="@-";
+ }
+ else // argument marker => read the argument number
+ {
+ QCString key="@";
+ QCString *subst=0;
+ bool hash=FALSE;
+ int l=k-1;
+ // search for ## backward
+ if (l>=0 && d.at(l)=='"') l--;
+ while (l>=0 && d.at(l)==' ') l--;
+ if (l>0 && d.at(l)=='#' && d.at(l-1)=='#') hash=TRUE;
+ k++;
+ // scan the number
+ while (k<d.length() && d.at(k)>='0' && d.at(k)<='9') key+=d.at(k++);
+ if (!hash)
+ {
+ // search for ## forward
+ l=k;
+ if (l<(int)d.length() && d.at(l)=='"') l++;
+ while (l<(int)d.length() && d.at(l)==' ') l++;
+ if (l<(int)d.length()-1 && d.at(l)=='#' && d.at(l+1)=='#') hash=TRUE;
+ }
+ //printf("request key %s result %s\n",key.data(),argTable[key]->data());
+ if (key.length()>1 && (subst=argTable[key]))
+ {
+ QCString substArg=*subst;
+ //printf("substArg=`%s'\n",substArg.data());
+ // only if no ## operator is before or after the argument
+ // marker we do macro expansion.
+ if (!hash) expandExpression(substArg,0,0);
+ if (inString)
+ {
+ //printf("`%s'=stringize(`%s')\n",stringize(*subst).data(),subst->data());
+
+ // if the marker is inside a string (because a # was put
+ // before the macro name) we must escape " and \ characters
+ resExpr+=stringize(substArg);
+ }
+ else
+ {
+ if (hash && substArg.isEmpty())
+ {
+ resExpr+="@E"; // empty argument will be remove later on
+ }
+ else if (g_nospaces)
+ {
+ resExpr+=substArg;
+ }
+ else
+ {
+ resExpr+=" "+substArg+" ";
+ }
+ }
+ }
+ }
+ }
+ else // no marker, just copy
+ {
+ if (!inString && d.at(k)=='\"')
+ {
+ inString=TRUE; // entering a literal string
+ }
+ else if (inString && d.at(k)=='\"' && (d.at(k-1)!='\\' || d.at(k-2)=='\\'))
+ {
+ inString=FALSE; // leaving a literal string
+ }
+ resExpr+=d.at(k++);
+ }
+ }
+ len=j-pos;
+ result=resExpr;
+ //printf("result after substitution `%s' expr=`%s'\n",
+ // result.data(),expr.mid(pos,len).data());
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+/*! returns the next identifier in string \a expr by starting at position \a p.
+ * The position of the identifier is returned (or -1 if nothing is found)
+ * and \a l is its length. Any quoted strings are skipping during the search.
+ */
+static int getNextId(const QCString &expr,int p,int *l)
+{
+ int n;
+ while (p<(int)expr.length())
+ {
+ char c=expr.at(p++);
+ if (isdigit(c)) // skip number
+ {
+ while (p<(int)expr.length() && isId(expr.at(p))) p++;
+ }
+ else if (isalpha(c) || c=='_') // read id
+ {
+ n=p-1;
+ while (p<(int)expr.length() && isId(expr.at(p))) p++;
+ *l=p-n;
+ return n;
+ }
+ else if (c=='"') // skip string
+ {
+ char ppc=0,pc=c;
+ if (p<(int)expr.length()) c=expr.at(p);
+ while (p<(int)expr.length() && (c!='"' || (pc=='\\' && ppc!='\\')))
+ // continue as long as no " is found, but ignoring \", but not \\"
+ {
+ ppc=pc;
+ pc=c;
+ c=expr.at(p);
+ p++;
+ }
+ if (p<(int)expr.length()) ++p; // skip closing quote
+ }
+ else if (c=='/') // skip C Comment
+ {
+ char pc=c;
+ if (p<(int)expr.length())
+ {
+ c=expr.at(++p);
+ if (c=='*') // Start of C comment
+ {
+ while (p<(int)expr.length() && !(pc=='*' && c=='/'))
+ {
+ pc=c;
+ c=expr.at(++p);
+ }
+ p++;
+ }
+ }
+ }
+ }
+ return -1;
+}
+
+/*! preforms recursive macro expansion on the string \a expr
+ * starting at position \a pos.
+ * May read additional characters from the input while re-scanning!
+ * If \a expandAll is \c TRUE then all macros in the expression are
+ * expanded, otherwise only the first is expanded.
+ */
+static void expandExpression(QCString &expr,QCString *rest,int pos)
+{
+ //printf("expandExpression(%s,%s)\n",expr.data(),rest ? rest->data() : 0);
+ QCString macroName;
+ QCString expMacro;
+ bool definedTest=FALSE;
+ int i=pos,l,p,len;
+ while ((p=getNextId(expr,i,&l))!=-1) // search for an macro name
+ {
+ bool replaced=FALSE;
+ macroName=expr.mid(p,l);
+ if (p<2 || !(expr.at(p-2)=='@' && expr.at(p-1)=='-')) // no-rescan marker?
+ {
+ if (g_expandedDict->find(macroName)==0) // expand macro
+ {
+ Define *def=isDefined(macroName);
+ if (definedTest) // macro name was found after defined
+ {
+ if (def) expMacro = " 1 "; else expMacro = " 0 ";
+ replaced=TRUE;
+ len=l;
+ definedTest=FALSE;
+ }
+ else if (def && def->nargs==-1) // simple macro
+ {
+ // substitute the definition of the macro
+ //printf("macro `%s'->`%s'\n",macroName.data(),def->definition.data());
+ if (g_nospaces)
+ {
+ expMacro=def->definition.stripWhiteSpace();
+ }
+ else
+ {
+ expMacro=" "+def->definition.stripWhiteSpace()+" ";
+ }
+ //expMacro=def->definition.stripWhiteSpace();
+ replaced=TRUE;
+ len=l;
+ //printf("simple macro expansion=`%s'->`%s'\n",macroName.data(),expMacro.data());
+ }
+ else if (def && def->nargs>=0) // function macro
+ {
+ replaced=replaceFunctionMacro(expr,rest,p+l,len,def,expMacro);
+ len+=l;
+ }
+ else if (macroName=="defined")
+ {
+ //printf("found defined inside macro definition '%s'\n",expr.right(expr.length()-p).data());
+ definedTest=TRUE;
+ }
+
+ if (replaced) // expand the macro and rescan the expression
+ {
+
+ //printf("replacing `%s'->`%s'\n",expr.mid(p,len).data(),expMacro.data());
+ QCString resultExpr=expMacro;
+ QCString restExpr=expr.right(expr.length()-len-p);
+ processConcatOperators(resultExpr);
+ if (def && !def->nonRecursive)
+ {
+ g_expandedDict->insert(macroName,def);
+ expandExpression(resultExpr,&restExpr,0);
+ g_expandedDict->remove(macroName);
+ }
+ expr=expr.left(p)+resultExpr+restExpr;
+ i=p;
+ //printf("new expression: %s\n",expr.data());
+ }
+ else // move to the next macro name
+ {
+ //printf("moving to the next macro old=%d new=%d\n",i,p+l);
+ i=p+l;
+ }
+ }
+ else // move to the next macro name
+ {
+ expr=expr.left(p)+"@-"+expr.right(expr.length()-p);
+ //printf("macro already expanded, moving to the next macro expr=%s\n",expr.data());
+ i=p+l+2;
+ //i=p+l;
+ }
+ }
+ else // no re-scan marker found, skip the macro name
+ {
+ //printf("skipping marked macro\n");
+ i=p+l;
+ }
+ }
+}
+
+/*! replaces all occurrences of @@@@ in \a s by @@
+ * and removes all occurrences of @@E.
+ * All identifiers found are replaced by 0L
+ */
+QCString removeIdsAndMarkers(const char *s)
+{
+ //printf("removeIdsAndMarkers(%s)\n",s);
+ const char *p=s;
+ char c;
+ bool inNum=FALSE;
+ QCString result;
+ if (p)
+ {
+ while ((c=*p))
+ {
+ if (c=='@') // replace @@ with @ and remove @E
+ {
+ if (*(p+1)=='@')
+ {
+ result+=c;
+ }
+ else if (*(p+1)=='E')
+ {
+ // skip
+ }
+ p+=2;
+ }
+ else if (isdigit(c)) // number
+ {
+ result+=c;
+ p++;
+ inNum=TRUE;
+ }
+ else if (c=='d' && !inNum) // identifier starting with a `d'
+ {
+ if (strncmp(p,"defined ",8)==0 || strncmp(p,"defined(",8)==0)
+ // defined keyword
+ {
+ p+=7; // skip defined
+ }
+ else
+ {
+ result+="0L";
+ p++;
+ while ((c=*p) && isId(c)) p++;
+ }
+ }
+ else if ((isalpha(c) || c=='_') && !inNum) // replace identifier with 0L
+ {
+ result+="0L";
+ p++;
+ while ((c=*p) && isId(c)) p++;
+ if (*p=='(') // undefined function macro
+ {
+ p++;
+ int count=1;
+ while ((c=*p++))
+ {
+ if (c=='(') count++;
+ else if (c==')')
+ {
+ count--;
+ if (count==0) break;
+ }
+ else if (c=='/')
+ {
+ char pc=c;
+ c=*++p;
+ if (c=='*') // start of C comment
+ {
+ while (*p && !(pc=='*' && c=='/')) // search end of comment
+ {
+ pc=c;
+ c=*++p;
+ }
+ p++;
+ }
+ }
+ }
+ }
+ }
+ else if (c=='/') // skip C comments
+ {
+ char pc=c;
+ c=*++p;
+ if (c=='*') // start of C comment
+ {
+ while (*p && !(pc=='*' && c=='/')) // search end of comment
+ {
+ pc=c;
+ c=*++p;
+ }
+ p++;
+ }
+ else // oops, not comment but division
+ {
+ result+=pc;
+ goto nextChar;
+ }
+ }
+ else
+ {
+nextChar:
+ result+=c;
+ char lc=tolower(c);
+ if (!isId(lc) && lc!='.' /*&& lc!='-' && lc!='+'*/) inNum=FALSE;
+ p++;
+ }
+ }
+ }
+ //printf("removeIdsAndMarkers(%s)=%s\n",s,result.data());
+ return result;
+}
+
+/*! replaces all occurrences of @@ in \a s by @
+ * \par assumption:
+ * \a s only contains pairs of @@'s
+ */
+QCString removeMarkers(const char *s)
+{
+ const char *p=s;
+ char c;
+ QCString result;
+ if (p)
+ {
+ while ((c=*p))
+ {
+ switch(c)
+ {
+ case '@': // replace @@ with @
+ {
+ if (*(p+1)=='@')
+ {
+ result+=c;
+ }
+ p+=2;
+ }
+ break;
+ case '/': // skip C comments
+ {
+ result+=c;
+ char pc=c;
+ c=*++p;
+ if (c=='*') // start of C comment
+ {
+ while (*p && !(pc=='*' && c=='/')) // search end of comment
+ {
+ if (*p=='@' && *(p+1)=='@')
+ result+=c,p++;
+ else
+ result+=c;
+ pc=c;
+ c=*++p;
+ }
+ if (*p)
+ {
+ result+=c;
+ p++;
+ }
+ }
+ }
+ break;
+ case '"': // skip string literals
+ {
+ result+=c;
+ char pc=c;
+ c=*++p;
+ while (*p && (c!='"' || pc=='\\')) // no end quote
+ {
+ result+=c;
+ c=*++p;
+ }
+ }
+ break;
+ case '\'': // skip char literals
+ {
+ result+=c;
+ char pc=c;
+ c=*++p;
+ while (*p && (c!='\'' || pc=='\\')) // no end quote
+ {
+ result+=c;
+ c=*++p;
+ }
+ }
+ break;
+ default:
+ {
+ result+=c;
+ p++;
+ }
+ break;
+ }
+ }
+ }
+ //printf("RemoveMarkers(%s)=%s\n",s,result.data());
+ return result;
+}
+
+/*! compute the value of the expression in string \a expr.
+ * If needed the function may read additional characters from the input.
+ */
+
+bool computeExpression(const QCString &expr)
+{
+ QCString e=expr;
+ expandExpression(e,0,0);
+ //printf("after expansion `%s'\n",e.data());
+ e = removeIdsAndMarkers(e);
+ if (e.isEmpty()) return FALSE;
+ //printf("parsing `%s'\n",e.data());
+ return parseCppExpression(g_yyFileName,g_yyLineNr,e);
+}
+
+/*! expands the macro definition in \a name
+ * If needed the function may read additional characters from the input
+ */
+
+QCString expandMacro(const QCString &name)
+{
+ QCString n=name;
+ expandExpression(n,0,0);
+ n=removeMarkers(n);
+ //printf("expandMacro `%s'->`%s'\n",name.data(),n.data());
+ return n;
+}
+
+Define *newDefine()
+{
+ Define *def=new Define;
+ def->name = g_defName;
+ def->definition = g_defText.stripWhiteSpace();
+ def->nargs = g_defArgs;
+ def->fileName = g_yyFileName;
+ def->fileDef = g_yyFileDef;
+ def->lineNr = g_yyLineNr;
+ def->varArgs = g_defVarArgs;
+ //printf("newDefine: %s->%s\n",def->name.data(),
+ // def->fileDef ? def->fileDef->name().data() : "<none>");
+ //printf("newDefine: `%s'->`%s'\n",def->name.data(),def->definition.data());
+ if (!def->name.isEmpty() && Doxygen::expandAsDefinedDict[def->name])
+ {
+ def->isPredefined=TRUE;
+ }
+ return def;
+}
+
+void addDefine()
+{
+ if (g_skip) return; // do not add this define as it is inside a
+ // conditional section (cond command) that is disabled.
+ if (!Doxygen::gatherDefines) return;
+
+ //printf("addDefine %s %s\n",g_defName.data(),g_defArgsStr.data());
+ //ArgumentList *al = new ArgumentList;
+ //stringToArgumentList(g_defArgsStr,al);
+ MemberDef *md=new MemberDef(
+ g_yyFileName,g_yyLineNr,
+ "#define",g_defName,g_defArgsStr,0,
+ Public,Normal,FALSE,Member,MemberDef::Define,0,0);
+ if (!g_defArgsStr.isEmpty())
+ {
+ ArgumentList *argList = new ArgumentList;
+ //printf("addDefine() g_defName=`%s' g_defArgsStr=`%s'\n",g_defName.data(),g_defArgsStr.data());
+ stringToArgumentList(g_defArgsStr,argList);
+ md->setArgumentList(argList);
+ }
+ //printf("Setting initializer for `%s' to `%s'\n",g_defName.data(),g_defText.data());
+ int l=g_defLitText.find('\n');
+ if (l>0 && g_defLitText.left(l).stripWhiteSpace()=="\\")
+ {
+ // strip first line if it only contains a slash
+ g_defLitText = g_defLitText.right(g_defLitText.length()-l-1);
+ }
+ else if (l>0)
+ {
+ // align the items on the first line with the items on the second line
+ int k=l+1;
+ const char *p=g_defLitText.data()+k;
+ char c;
+ while ((c=*p++) && (c==' ' || c=='\t')) k++;
+ g_defLitText=g_defLitText.mid(l+1,k-l-1)+g_defLitText.stripWhiteSpace();
+ }
+ md->setInitializer(g_defLitText.stripWhiteSpace());
+
+ //printf("pre.l: md->setFileDef(%p)\n",g_inputFileDef);
+ md->setFileDef(g_inputFileDef);
+ md->setDefinition("#define "+g_defName);
+
+ MemberName *mn=Doxygen::functionNameSDict->find(g_defName);
+ if (mn==0)
+ {
+ mn = new MemberName(g_defName);
+ Doxygen::functionNameSDict->append(g_defName,mn);
+ }
+ mn->append(md);
+ if (g_yyFileDef)
+ {
+ g_yyFileDef->insertMember(md);
+ }
+
+ //Define *d;
+ //if ((d=defineDict[g_defName])==0) defineDict.insert(g_defName,newDefine());
+}
+
+static inline void outputChar(char c)
+{
+ if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->addChar(c);
+}
+
+static inline void outputArray(const char *a,int len)
+{
+ if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->addArray(a,len);
+}
+
+static void readIncludeFile(const QCString &inc)
+{
+ if (!Config_getBool("SEARCH_INCLUDES")) return; // do not read include files
+ uint i=0;
+
+ // find the start of the include file name
+ while (i<inc.length() &&
+ (inc.at(i)==' ' || inc.at(i)=='"' || inc.at(i)=='<')
+ ) i++;
+ uint s=i;
+
+ // was it a local include?
+ bool localInclude = s>0 && inc.at(s-1)=='"';
+
+ // find the end of the include file name
+ while (i<inc.length() && inc.at(i)!='"' && inc.at(i)!='>') i++;
+
+ if (s<inc.length() && i>s) // valid include file name found
+ {
+ // extract include path+name
+ QCString incFileName=inc.mid(s,i-s).stripWhiteSpace();
+
+ QCString dosExt = incFileName.right(4);
+ if (dosExt==".exe" || dosExt==".dll" || dosExt==".tbl")
+ {
+ // skip imported binary files (e.g. M$ type libraries)
+ return;
+ }
+
+ QCString oldFileName = g_yyFileName;
+ FileDef *oldFileDef = g_yyFileDef;
+ int oldLineNr = g_yyLineNr;
+ //printf("Searching for `%s'\n",incFileName.data());
+
+ // findFile will overwrite g_yyFileDef if found
+ FileState *fs;
+ bool alreadyIncluded = FALSE;
+ //printf("calling findFile(%s)\n",incFileName.data());
+ if ((fs=findFile(incFileName,localInclude,alreadyIncluded))) // see if the include file can be found
+ {
+ //printf("Found include file!\n");
+ if (Debug::isFlagSet(Debug::Preprocessor))
+ {
+ for (i=0;i<g_includeStack.count();i++) msg(" ");
+ //msg("#include %s: parsing...\n",incFileName.data());
+ }
+ if (oldFileDef)
+ {
+ // add include dependency to the file in which the #include was found
+ bool ambig;
+ // change to local name for bug 641336
+ FileDef *incFd = findFileDef(Doxygen::inputNameDict,incFileName,ambig);
+ oldFileDef->addIncludeDependency(ambig ? 0 : incFd,incFileName,localInclude,g_isImported);
+ // add included by dependency
+ if (g_yyFileDef)
+ {
+ //printf("Adding include dependency %s->%s\n",oldFileDef->name().data(),incFileName.data());
+ g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,g_isImported);
+ }
+ }
+ fs->bufState = YY_CURRENT_BUFFER;
+ fs->lineNr = oldLineNr;
+ fs->fileName = oldFileName;
+ // push the state on the stack
+ g_includeStack.push(fs);
+ // set the scanner to the include file
+
+ // Deal with file changes due to
+ // #include's within { .. } blocks
+ QCString lineStr(g_yyFileName.length()+20);
+ lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data());
+ outputArray(lineStr.data(),lineStr.length());
+
+ //fprintf(stderr,"Switching to include file %s\n",incFileName.data());
+ g_expectGuard=TRUE;
+ g_inputBuf = &fs->fileBuf;
+ g_inputBufPos=0;
+ preYY_switch_to_buffer(preYY_create_buffer(0,YY_BUF_SIZE));
+ }
+ else
+ {
+ //printf(" calling findFile(%s) alreadyInc=%d\n",incFileName.data(),alreadyIncluded);
+ if (oldFileDef)
+ {
+ bool ambig;
+ //QCString absPath = incFileName;
+ //if (QDir::isRelativePath(incFileName))
+ //{
+ // absPath = QDir::cleanDirPath(oldFileDef->getPath()+"/"+incFileName);
+ // //printf("%s + %s -> resolved path %s\n",oldFileDef->getPath().data(),incFileName.data(),absPath.data());
+ //}
+
+ // change to local name for bug 641336
+ FileDef *fd = findFileDef(Doxygen::inputNameDict,incFileName,ambig);
+ //printf("%s::findFileDef(%s)=%p\n",oldFileDef->name().data(),incFileName.data(),fd);
+ // add include dependency to the file in which the #include was found
+ oldFileDef->addIncludeDependency(ambig ? 0 : fd,incFileName,localInclude,g_isImported);
+ // add included by dependency
+ if (fd)
+ {
+ //printf("Adding include dependency (2) %s->%s ambig=%d\n",oldFileDef->name().data(),fd->name().data(),ambig);
+ fd->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,g_isImported);
+ }
+ }
+ if (Debug::isFlagSet(Debug::Preprocessor))
+ {
+ msg("#include %s: not found or already included! skipping...\n",incFileName.data());
+ //printf("error: include file %s not found\n",preYYtext);
+ }
+ if (g_curlyCount>0 && !alreadyIncluded) // failed to find #include inside { ... }
+ {
+ warn(g_yyFileName,g_yyLineNr,"Warning: include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data());
+ }
+ }
+ }
+}
+
+/* ----------------------------------------------------------------- */
+
+static void startCondSection(const char *sectId)
+{
+ g_condStack.push(new bool(g_skip));
+ if (Config_getList("ENABLED_SECTIONS").find(sectId)==-1)
+ {
+ g_skip=TRUE;
+ }
+}
+
+static void endCondSection()
+{
+ if (g_condStack.isEmpty())
+ {
+ g_skip=FALSE;
+ }
+ else
+ {
+ bool *ctx = g_condStack.pop();
+ g_skip=*ctx;
+ }
+}
+
+static void forceEndCondSection()
+{
+ while (!g_condStack.isEmpty())
+ {
+ g_condStack.pop();
+ }
+ g_skip=FALSE;
+}
+
+static QCString escapeAt(const char *text)
+{
+ QCString result;
+ if (text)
+ {
+ char c;
+ const char *p=text;
+ while ((c=*p++))
+ {
+ if (c=='@') result+="@@"; else result+=c;
+ }
+ }
+ return result;
+}
+
+static char resolveTrigraph(char c)
+{
+ switch (c)
+ {
+ case '=': return '#';
+ case '/': return '\\';
+ case '\'': return '^';
+ case '(': return '[';
+ case ')': return ']';
+ case '!': return '|';
+ case '<': return '{';
+ case '>': return '}';
+ case '-': return '~';
+ }
+ return '?';
+}
+
+/* ----------------------------------------------------------------- */
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int bytesInBuf = g_inputBuf->curPos()-g_inputBufPos;
+ int bytesToCopy = QMIN(max_size,bytesInBuf);
+ memcpy(buf,g_inputBuf->data()+g_inputBufPos,bytesToCopy);
+ g_inputBufPos+=bytesToCopy;
+ return bytesToCopy;
+}
+
+/* ----------------------------------------------------------------- */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 3680 "<stdout>"
+
+#define INITIAL 0
+#define Start 1
+#define Command 2
+#define SkipCommand 3
+#define SkipLine 4
+#define SkipString 5
+#define CopyLine 6
+#define CopyString 7
+#define Include 8
+#define IncludeID 9
+#define EndImport 10
+#define DefName 11
+#define DefineArg 12
+#define DefineText 13
+#define SkipCPPBlock 14
+#define Ifdef 15
+#define Ifndef 16
+#define SkipCComment 17
+#define CopyCComment 18
+#define SkipVerbatim 19
+#define SkipCPPComment 20
+#define RemoveCComment 21
+#define RemoveCPPComment 22
+#define Guard 23
+#define DefinedExpr1 24
+#define DefinedExpr2 25
+#define SkipDoubleQuote 26
+#define SkipSingleQuote 27
+#define UndefName 28
+#define IgnoreLine 29
+#define FindDefineArgs 30
+#define ReadString 31
+#define CondLine 32
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int preYYlex_destroy (void );
+
+int preYYget_debug (void );
+
+void preYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE preYYget_extra (void );
+
+void preYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *preYYget_in (void );
+
+void preYYset_in (FILE * in_str );
+
+FILE *preYYget_out (void );
+
+void preYYset_out (FILE * out_str );
+
+yy_size_t preYYget_leng (void );
+
+char *preYYget_text (void );
+
+int preYYget_lineno (void );
+
+void preYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int preYYwrap (void );
+#else
+extern int preYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( preYYtext, preYYleng, 1, preYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( preYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( preYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, preYYin))==0 && ferror(preYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(preYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int preYYlex (void);
+
+#define YY_DECL int preYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after preYYtext and preYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( preYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (preYYtext[preYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 1458 "pre.l"
+
+
+#line 3900 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)preYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in preYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! preYYin )
+ preYYin = stdin;
+
+ if ( ! preYYout )
+ preYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ preYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ preYY_create_buffer(preYYin,YY_BUF_SIZE );
+ }
+
+ preYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of preYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1157 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 5434 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 1460 "pre.l"
+
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 1461 "pre.l"
+
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 1462 "pre.l"
+
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 1463 "pre.l"
+{ // Trigraph
+ unput(resolveTrigraph(preYYtext[2]));
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 1466 "pre.l"
+{ BEGIN(Command); }
+ YY_BREAK
+case 6:
+/* rule 6 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1467 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ BEGIN(CopyLine);
+ }
+ YY_BREAK
+case 7:
+/* rule 7 can match eol */
+YY_RULE_SETUP
+#line 1471 "pre.l"
+{ // constructors?
+ int i;
+ for (i=preYYleng-1;i>=0;i--)
+ {
+ unput(preYYtext[i]);
+ }
+ BEGIN(CopyLine);
+ }
+ YY_BREAK
+case 8:
+/* rule 8 can match eol */
+#line 1480 "pre.l"
+case 9:
+/* rule 9 can match eol */
+YY_RULE_SETUP
+#line 1480 "pre.l"
+{ // function like macro
+ static bool skipFuncMacros = Config_getBool("SKIP_FUNCTION_MACROS");
+ QCString name(preYYtext);
+ name=name.left(name.find('(')).stripWhiteSpace();
+
+ Define *def=0;
+ if (skipFuncMacros &&
+ name!="Q_PROPERTY" &&
+ !(
+ (g_includeStack.isEmpty() || g_curlyCount>0) &&
+ g_macroExpansion &&
+ (def=g_globalDefineDict->find(name)) &&
+ macroIsAccessible(def) &&
+ (!g_expandOnlyPredef || def->isPredefined)
+ )
+ )
+ {
+ outputChar('\n');
+ g_yyLineNr++;
+ }
+ else // don't skip
+ {
+ int i;
+ for (i=preYYleng-1;i>=0;i--)
+ {
+ unput(preYYtext[i]);
+ }
+ BEGIN(CopyLine);
+ }
+ }
+ YY_BREAK
+case 10:
+/* rule 10 can match eol */
+YY_RULE_SETUP
+#line 1510 "pre.l"
+{
+ QCString text=preYYtext;
+ g_yyLineNr+=text.contains('\n');
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 1515 "pre.l"
+{ // count brackets inside the main file
+ if (g_includeStack.isEmpty())
+ {
+ g_curlyCount++;
+ }
+ outputChar(*preYYtext);
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 1522 "pre.l"
+{ // count brackets inside the main file
+ if (g_includeStack.isEmpty() && g_curlyCount>0)
+ {
+ g_curlyCount--;
+ }
+ outputChar(*preYYtext);
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 1529 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 1532 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 1535 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 1538 "pre.l"
+{
+ outputChar(*preYYtext);
+ BEGIN( CopyString );
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 1542 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 1545 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 1548 "pre.l"
+{
+ outputChar(*preYYtext);
+ BEGIN( CopyLine );
+ }
+ YY_BREAK
+case 20:
+/* rule 20 can match eol */
+YY_RULE_SETUP
+#line 1552 "pre.l"
+{
+ g_expectGuard = FALSE;
+ Define *def=0;
+ //def=g_globalDefineDict->find(preYYtext);
+ //printf("Search for define %s found=%d g_includeStack.isEmpty()=%d "
+ // "g_curlyCount=%d g_macroExpansion=%d g_expandOnlyPredef=%d "
+ // "isPreDefined=%d\n",preYYtext,def ? 1 : 0,
+ // g_includeStack.isEmpty(),g_curlyCount,g_macroExpansion,g_expandOnlyPredef,
+ // def ? def->isPredefined : -1
+ // );
+ if ((g_includeStack.isEmpty() || g_curlyCount>0) &&
+ g_macroExpansion &&
+ (def=g_globalDefineDict->find(preYYtext)) &&
+ (def->isPredefined || macroIsAccessible(def)) &&
+ (!g_expandOnlyPredef || def->isPredefined)
+ )
+ {
+ //printf("Found it! #args=%d\n",def->nargs);
+ g_roundCount=0;
+ g_defArgsStr=preYYtext;
+ if (def->nargs==-1) // no function macro
+ {
+ QCString result = def->isPredefined ? def->definition : expandMacro(g_defArgsStr);
+ outputArray(result,result.length());
+ }
+ else // zero or more arguments
+ {
+ g_findDefArgContext = CopyLine;
+ BEGIN(FindDefineArgs);
+ }
+ }
+ else
+ {
+ outputArray(preYYtext,preYYleng);
+ }
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 1588 "pre.l"
+{
+ Define *def=0;
+ if ((g_includeStack.isEmpty() || g_curlyCount>0) &&
+ g_macroExpansion &&
+ (def=g_globalDefineDict->find(preYYtext)) &&
+ def->nargs==-1 &&
+ (def->isPredefined || macroIsAccessible(def)) &&
+ (!g_expandOnlyPredef || def->isPredefined)
+ )
+ {
+ QCString result=def->isPredefined ? def->definition : expandMacro(preYYtext);
+ outputArray(result,result.length());
+ }
+ else
+ {
+ outputArray(preYYtext,preYYleng);
+ }
+ }
+ YY_BREAK
+case 22:
+/* rule 22 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1606 "pre.l"
+{ // strip line continuation characters
+ }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 1608 "pre.l"
+{
+ outputChar(*preYYtext);
+ }
+ YY_BREAK
+case 24:
+/* rule 24 can match eol */
+YY_RULE_SETUP
+#line 1611 "pre.l"
+{
+ outputChar('\n');
+ BEGIN(Start);
+ g_yyLineNr++;
+ }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 1616 "pre.l"
+{
+ g_defArgsStr+='(';
+ g_roundCount++;
+ }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 1620 "pre.l"
+{
+ g_defArgsStr+=')';
+ g_roundCount--;
+ if (g_roundCount==0)
+ {
+ QCString result=expandMacro(g_defArgsStr);
+ //printf("g_defArgsStr=`%s'->`%s'\n",g_defArgsStr.data(),result.data());
+ if (g_findDefArgContext==CopyLine)
+ {
+ outputArray(result,result.length());
+ BEGIN(g_findDefArgContext);
+ }
+ else // g_findDefArgContext==IncludeID
+ {
+ readIncludeFile(result);
+ g_nospaces=FALSE;
+ BEGIN(Start);
+ }
+ }
+ }
+ YY_BREAK
+/*
+<FindDefineArgs>")"{B}*"(" {
+ g_defArgsStr+=preYYtext;
+ }
+ */
+case 27:
+YY_RULE_SETUP
+#line 1645 "pre.l"
+{
+ g_defArgsStr+=preYYtext;
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 1648 "pre.l"
+{
+ g_defArgsStr+=*preYYtext;
+ BEGIN(ReadString);
+ }
+ YY_BREAK
+case 29:
+/* rule 29 can match eol */
+YY_RULE_SETUP
+#line 1652 "pre.l"
+{
+ g_yyLineNr++;
+ outputChar('\n');
+ }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 1656 "pre.l"
+{
+ g_defArgsStr+="@@";
+ }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 1659 "pre.l"
+{
+ g_defArgsStr+=*preYYtext;
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 1662 "pre.l"
+{
+ g_defArgsStr+=*preYYtext;
+ BEGIN(FindDefineArgs);
+ }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 1666 "pre.l"
+{
+ g_defArgsStr+=preYYtext;
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 1669 "pre.l"
+{
+ g_defArgsStr+=preYYtext;
+ }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 1672 "pre.l"
+{
+ g_defArgsStr+=*preYYtext;
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 1675 "pre.l"
+{
+ g_isImported = preYYtext[1]=='m';
+ if (g_macroExpansion)
+ BEGIN(IncludeID);
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 1680 "pre.l"
+{
+ g_isImported = preYYtext[1]=='m';
+ char c[2];
+ c[0]=preYYtext[preYYleng-1];c[1]='\0';
+ g_incName=c;
+ BEGIN(Include);
+ }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 1687 "pre.l"
+{
+ //printf("!!!DefName\n");
+ BEGIN(DefName);
+ }
+ YY_BREAK
+case 39:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 5;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1691 "pre.l"
+{
+ incrLevel();
+ g_guardExpr.resize(0);
+ BEGIN(DefinedExpr2);
+ }
+ YY_BREAK
+case 40:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 5;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1696 "pre.l"
+{
+ //printf("Pre.l: ifdef\n");
+ incrLevel();
+ g_guardExpr.resize(0);
+ BEGIN(DefinedExpr1);
+ }
+ YY_BREAK
+case 41:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 6;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1702 "pre.l"
+{
+ incrLevel();
+ g_guardExpr="! ";
+ BEGIN(DefinedExpr2);
+ }
+ YY_BREAK
+case 42:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 6;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1707 "pre.l"
+{
+ incrLevel();
+ g_guardExpr="! ";
+ BEGIN(DefinedExpr1);
+ }
+ YY_BREAK
+case 43:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1712 "pre.l"
+{
+ incrLevel();
+ g_guardExpr.resize(0);
+ BEGIN(Guard);
+ }
+ YY_BREAK
+case 44:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1717 "pre.l"
+{
+ if (!otherCaseDone())
+ {
+ g_guardExpr.resize(0);
+ BEGIN(Guard);
+ }
+ else
+ {
+ g_ifcount=0;
+ BEGIN(SkipCPPBlock);
+ }
+ }
+ YY_BREAK
+case 45:
+/* rule 45 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 4;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1729 "pre.l"
+{
+ //printf("else g_levelGuard[%d]=%d\n",g_level-1,g_levelGuard[g_level-1]);
+ if (otherCaseDone())
+ {
+ g_ifcount=0;
+ BEGIN(SkipCPPBlock);
+ }
+ else
+ {
+ setCaseDone(TRUE);
+ //g_levelGuard[g_level-1]=TRUE;
+ }
+ }
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 1742 "pre.l"
+{
+ BEGIN(UndefName);
+ }
+ YY_BREAK
+case 47:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1745 "pre.l"
+{
+ if (!otherCaseDone())
+ {
+ g_guardExpr.resize(0);
+ BEGIN(Guard);
+ }
+ }
+ YY_BREAK
+case 48:
+/* rule 48 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 5;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1752 "pre.l"
+{
+ //printf("Pre.l: #endif\n");
+ decrLevel();
+ }
+ YY_BREAK
+case 49:
+/* rule 49 can match eol */
+YY_RULE_SETUP
+#line 1756 "pre.l"
+{
+ outputChar('\n');
+ BEGIN(Start);
+ g_yyLineNr++;
+ }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 1761 "pre.l"
+{ // unknown directive
+ BEGIN(IgnoreLine);
+ }
+ YY_BREAK
+case 51:
+/* rule 51 can match eol */
+YY_RULE_SETUP
+#line 1764 "pre.l"
+{
+ outputChar('\n');
+ g_yyLineNr++;
+ }
+ YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 1768 "pre.l"
+
+ YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 1769 "pre.l"
+
+ YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 1770 "pre.l"
+{
+ Define *def;
+ if ((def=isDefined(preYYtext))
+ /*&& !def->isPredefined*/
+ && !def->nonRecursive
+ )
+ {
+ //printf("undefining %s\n",preYYtext);
+ def->undef=TRUE;
+ }
+ BEGIN(Start);
+ }
+ YY_BREAK
+case 55:
+/* rule 55 can match eol */
+YY_RULE_SETUP
+#line 1782 "pre.l"
+{
+ outputChar('\n');
+ g_guardExpr+=' ';
+ g_yyLineNr++;
+ }
+ YY_BREAK
+case 56:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 7;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1787 "pre.l"
+{
+ BEGIN(DefinedExpr2);
+ }
+ YY_BREAK
+case 57:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 7;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1790 "pre.l"
+{
+ BEGIN(DefinedExpr1);
+ }
+ YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 1793 "pre.l"
+{ g_guardExpr+=preYYtext; }
+ YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 1794 "pre.l"
+{ g_guardExpr+=*preYYtext; }
+ YY_BREAK
+case 60:
+/* rule 60 can match eol */
+YY_RULE_SETUP
+#line 1795 "pre.l"
+{
+ unput(*preYYtext);
+ //printf("Guard: `%s'\n",
+ // g_guardExpr.data());
+ bool guard=computeExpression(g_guardExpr);
+ setCaseDone(guard);
+ //printf("if g_levelGuard[%d]=%d\n",g_level-1,g_levelGuard[g_level-1]);
+ if (guard)
+ {
+ BEGIN(Start);
+ }
+ else
+ {
+ g_ifcount=0;
+ BEGIN(SkipCPPBlock);
+ }
+ }
+ YY_BREAK
+case 61:
+/* rule 61 can match eol */
+YY_RULE_SETUP
+#line 1812 "pre.l"
+{ g_yyLineNr++; outputChar('\n'); }
+ YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 1813 "pre.l"
+{
+ if (isDefined(preYYtext))
+ g_guardExpr+=" 1L ";
+ else
+ g_guardExpr+=" 0L ";
+ g_lastGuardName=preYYtext;
+ BEGIN(Guard);
+ }
+ YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 1821 "pre.l"
+{
+ if (isDefined(preYYtext))
+ g_guardExpr+=" 1L ";
+ else
+ g_guardExpr+=" 0L ";
+ g_lastGuardName=preYYtext;
+ }
+ YY_BREAK
+case 64:
+/* rule 64 can match eol */
+YY_RULE_SETUP
+#line 1828 "pre.l"
+{ // should not happen, handle anyway
+ g_yyLineNr++;
+ g_ifcount=0;
+ BEGIN(SkipCPPBlock);
+ }
+ YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 1833 "pre.l"
+{
+ BEGIN(Guard);
+ }
+ YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 1836 "pre.l"
+
+ YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 1837 "pre.l"
+{ BEGIN(SkipCommand); }
+ YY_BREAK
+case 68:
+/* rule 68 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1838 "pre.l"
+{ BEGIN(SkipLine); }
+ YY_BREAK
+case 69:
+/* rule 69 can match eol */
+YY_RULE_SETUP
+#line 1839 "pre.l"
+{ g_yyLineNr++; outputChar('\n'); }
+ YY_BREAK
+case 70:
+YY_RULE_SETUP
+#line 1840 "pre.l"
+
+ YY_BREAK
+case 71:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1841 "pre.l"
+{
+ incrLevel();
+ g_ifcount++;
+ //printf("#if... depth=%d\n",g_ifcount);
+ }
+ YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 1846 "pre.l"
+{
+ //printf("Else! g_ifcount=%d otherCaseDone=%d\n",g_ifcount,otherCaseDone());
+ if (g_ifcount==0 && !otherCaseDone())
+ {
+ setCaseDone(TRUE);
+ //outputChar('\n');
+ BEGIN(Start);
+ }
+ }
+ YY_BREAK
+case 73:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1855 "pre.l"
+{
+ if (g_ifcount==0)
+ {
+ if (!otherCaseDone())
+ {
+ g_guardExpr.resize(0);
+ g_lastGuardName.resize(0);
+ BEGIN(Guard);
+ }
+ else
+ {
+ BEGIN(SkipCPPBlock);
+ }
+ }
+ }
+ YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 1870 "pre.l"
+{
+ g_expectGuard = FALSE;
+ decrLevel();
+ if (--g_ifcount<0)
+ {
+ //outputChar('\n');
+ BEGIN(Start);
+ }
+ }
+ YY_BREAK
+case 75:
+/* rule 75 can match eol */
+YY_RULE_SETUP
+#line 1879 "pre.l"
+{
+ outputChar('\n');
+ g_yyLineNr++;
+ BEGIN(SkipCPPBlock);
+ }
+ YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 1884 "pre.l"
+{ // unknown directive
+ BEGIN(SkipLine);
+ }
+ YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 1887 "pre.l"
+
+ YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 1888 "pre.l"
+
+ YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 1889 "pre.l"
+{ }
+ YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 1890 "pre.l"
+{
+ BEGIN(SkipString);
+ }
+ YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 1893 "pre.l"
+
+ YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 1894 "pre.l"
+{
+ g_lastCPPContext=YY_START;
+ BEGIN(RemoveCPPComment);
+ }
+ YY_BREAK
+case 83:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1898 "pre.l"
+{
+ g_lastCContext=YY_START;
+ BEGIN(RemoveCComment);
+ }
+ YY_BREAK
+case 84:
+/* rule 84 can match eol */
+YY_RULE_SETUP
+#line 1902 "pre.l"
+{
+ outputChar('\n');
+ g_yyLineNr++;
+ BEGIN(SkipCPPBlock);
+ }
+ YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 1907 "pre.l"
+{ }
+ YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 1908 "pre.l"
+{ }
+ YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 1909 "pre.l"
+{
+ BEGIN(SkipLine);
+ }
+ YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 1912 "pre.l"
+{ }
+ YY_BREAK
+case 89:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1913 "pre.l"
+{
+ g_nospaces=TRUE;
+ g_roundCount=0;
+ g_defArgsStr=preYYtext;
+ g_findDefArgContext = IncludeID;
+ BEGIN(FindDefineArgs);
+ }
+ YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 1920 "pre.l"
+{
+ g_nospaces=TRUE;
+ readIncludeFile(expandMacro(preYYtext));
+ BEGIN(Start);
+ }
+ YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 1925 "pre.l"
+{
+ g_incName+=preYYtext;
+ readIncludeFile(g_incName);
+ if (g_isImported)
+ {
+ BEGIN(EndImport);
+ }
+ else
+ {
+ BEGIN(Start);
+ }
+ }
+ YY_BREAK
+case 92:
+/* rule 92 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 1937 "pre.l"
+{
+ BEGIN(Start);
+ }
+ YY_BREAK
+case 93:
+/* rule 93 can match eol */
+YY_RULE_SETUP
+#line 1940 "pre.l"
+{
+ outputChar('\n');
+ g_yyLineNr++;
+ }
+ YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 1944 "pre.l"
+{
+ }
+ YY_BREAK
+case 95:
+/* rule 95 can match eol */
+YY_RULE_SETUP
+#line 1946 "pre.l"
+{ // define with argument
+ //printf("Define() `%s'\n",preYYtext);
+ g_argDict = new QDict<int>(31);
+ g_argDict->setAutoDelete(TRUE);
+ g_defArgs = 0;
+ g_defArgsStr.resize(0);
+ g_defText.resize(0);
+ g_defLitText.resize(0);
+ g_defName = preYYtext;
+ g_defVarArgs = FALSE;
+ g_defExtraSpacing.resize(0);
+ BEGIN(DefineArg);
+ }
+ YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 1959 "pre.l"
+{ // special case: define with 1 -> can be "guard"
+ //printf("Define `%s'\n",preYYtext);
+ g_argDict = 0;
+ g_defArgs = -1;
+ g_defArgsStr.resize(0);
+ g_defName = preYYtext;
+ g_defName = g_defName.left(g_defName.length()-1).stripWhiteSpace();
+ g_defVarArgs = FALSE;
+ if ( g_defName!=g_lastGuardName || !g_expectGuard)
+ { // define may appear in the output
+ QCString tmp=(QCString)"#define "+g_defName;
+ outputArray(tmp.data(),tmp.length());
+ g_quoteArg=FALSE;
+ g_insideComment=FALSE;
+ g_lastGuardName.resize(0);
+ g_defText="1";
+ g_defLitText="1";
+ BEGIN(DefineText);
+ }
+ else // define is a guard => hide
+ {
+ g_defText.resize(0);
+ g_defLitText.resize(0);
+ BEGIN(Start);
+ }
+ }
+ YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 1985 "pre.l"
+{ // define with content
+ //printf("Define `%s'\n",preYYtext);
+ g_argDict = 0;
+ g_defArgs = -1;
+ g_defArgsStr.resize(0);
+ g_defText.resize(0);
+ g_defLitText.resize(0);
+ g_defName = preYYtext;
+ g_defVarArgs = FALSE;
+ QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr;
+ outputArray(tmp.data(),tmp.length());
+ g_quoteArg=FALSE;
+ g_insideComment=FALSE;
+ BEGIN(DefineText);
+ }
+ YY_BREAK
+case 98:
+/* rule 98 can match eol */
+YY_RULE_SETUP
+#line 2000 "pre.l"
+{ // empty define
+ g_argDict = 0;
+ g_defArgs = -1;
+ g_defName = preYYtext;
+ g_defArgsStr.resize(0);
+ g_defText.resize(0);
+ g_defLitText.resize(0);
+ g_defVarArgs = FALSE;
+ //printf("Guard check: %s!=%s || %d\n",
+ // g_defName.data(),g_lastGuardName.data(),g_expectGuard);
+ if ( g_defName!=g_lastGuardName || !g_expectGuard)
+ { // define may appear in the output
+ QCString tmp=(QCString)"#define "+g_defName;
+ outputArray(tmp.data(),tmp.length());
+ g_quoteArg=FALSE;
+ g_insideComment=FALSE;
+ if (g_insideCS) g_defText="1"; // for C#, use "1" as define text
+ BEGIN(DefineText);
+ }
+ else // define is a guard => hide
+ {
+ //printf("Found a guard %s\n",preYYtext);
+ g_lastGuardName.resize(0);
+ BEGIN(Start);
+ }
+ g_expectGuard=FALSE;
+ }
+ YY_BREAK
+case 99:
+/* rule 99 can match eol */
+YY_RULE_SETUP
+#line 2027 "pre.l"
+{
+ g_defExtraSpacing+="\n";
+ g_yyLineNr++;
+ }
+ YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 2031 "pre.l"
+{ g_defArgsStr+=preYYtext; }
+ YY_BREAK
+case 101:
+YY_RULE_SETUP
+#line 2032 "pre.l"
+{ g_defArgsStr+=preYYtext; }
+ YY_BREAK
+case 102:
+YY_RULE_SETUP
+#line 2033 "pre.l"
+{
+ g_defArgsStr+=preYYtext;
+ QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr+g_defExtraSpacing;
+ outputArray(tmp.data(),tmp.length());
+ g_quoteArg=FALSE;
+ g_insideComment=FALSE;
+ BEGIN(DefineText);
+ }
+ YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 2041 "pre.l"
+{ // Variadic macro
+ g_defVarArgs = TRUE;
+ g_defArgsStr+=preYYtext;
+ g_argDict->insert("__VA_ARGS__",new int(g_defArgs));
+ g_defArgs++;
+ }
+ YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 2047 "pre.l"
+{
+ //printf("Define addArg(%s)\n",preYYtext);
+ QCString argName=preYYtext;
+ g_defVarArgs = preYYtext[preYYleng-1]=='.';
+ if (g_defVarArgs) // strip ellipsis
+ {
+ argName=argName.left(argName.length()-3);
+ }
+ argName = argName.stripWhiteSpace();
+ g_defArgsStr+=preYYtext;
+ g_argDict->insert(argName,new int(g_defArgs));
+ g_defArgs++;
+ }
+ YY_BREAK
+/*
+<DefineText>"/ **"|"/ *!" {
+ g_defText+=preYYtext;
+ g_defLitText+=preYYtext;
+ g_insideComment=TRUE;
+ }
+<DefineText>"* /" {
+ g_defText+=preYYtext;
+ g_defLitText+=preYYtext;
+ g_insideComment=FALSE;
+ }
+ */
+case 105:
+YY_RULE_SETUP
+#line 2072 "pre.l"
+{
+ g_defText+=preYYtext;
+ g_defLitText+=preYYtext;
+ g_lastCContext=YY_START;
+ g_commentCount=1;
+ BEGIN(CopyCComment);
+ }
+ YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 2079 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ g_lastCPPContext=YY_START;
+ g_defLitText+=' ';
+ BEGIN(SkipCPPComment);
+ }
+ YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 2085 "pre.l"
+{
+ if (preYYtext[0]=='/') outputChar('/');
+ outputChar('*');outputChar('/');
+ if (--g_commentCount<=0)
+ {
+ if (g_lastCContext==Start)
+ // small hack to make sure that ^... rule will
+ // match when going to Start... Example: "/*...*/ some stuff..."
+ {
+ YY_CURRENT_BUFFER->yy_at_bol=1;
+ }
+ BEGIN(g_lastCContext);
+ }
+ }
+ YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 2099 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 2102 "pre.l"
+{
+ outputChar('/');outputChar('*');
+ //g_commentCount++;
+ }
+ YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 2106 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 111:
+/* rule 111 can match eol */
+YY_RULE_SETUP
+#line 2109 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ g_yyLineNr+=QCString(preYYtext).contains('\n');
+ }
+ YY_BREAK
+case 112:
+/* rule 112 can match eol */
+YY_RULE_SETUP
+#line 2113 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ g_yyLineNr+=QCString(preYYtext).contains('\n');
+ if (preYYtext[1]=='f')
+ {
+ g_blockName="f";
+ }
+ else
+ {
+ g_blockName=QCString(&preYYtext[1]).stripWhiteSpace();
+ }
+ BEGIN(SkipVerbatim);
+ }
+ YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 2126 "pre.l"
+{ // conditional section
+ g_condCtx = YY_START;
+ outputArray(preYYtext,preYYleng);
+ BEGIN(CondLine);
+ }
+ YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 2131 "pre.l"
+{
+ startCondSection(preYYtext);
+ outputArray(preYYtext,preYYleng);
+ BEGIN(g_condCtx);
+ }
+ YY_BREAK
+case 115:
+/* rule 115 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 2136 "pre.l"
+{
+ g_condCtx = YY_START;
+ outputArray(preYYtext,preYYleng);
+ BEGIN(CondLine);
+ }
+ YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 2141 "pre.l"
+{
+ unput(*preYYtext);
+ startCondSection(" ");
+ BEGIN(g_condCtx);
+ }
+ YY_BREAK
+case 117:
+/* rule 117 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 8;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+YY_RULE_SETUP
+#line 2146 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ endCondSection();
+ }
+ YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 2150 "pre.l"
+{ /* end of verbatim block */
+ outputArray(preYYtext,preYYleng);
+ if (preYYtext[1]=='f' && g_blockName=="f")
+ {
+ BEGIN(SkipCComment);
+ }
+ else if (&preYYtext[4]==g_blockName)
+ {
+ BEGIN(SkipCComment);
+ }
+ }
+ YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 2161 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 2164 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 121:
+/* rule 121 can match eol */
+YY_RULE_SETUP
+#line 2167 "pre.l"
+{
+ g_yyLineNr++;
+ outputChar('\n');
+ }
+ YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 2171 "pre.l"
+{
+ outputChar(*preYYtext);
+ }
+ YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 2174 "pre.l"
+{
+ g_defLitText+=preYYtext;
+ g_defText+=escapeAt(preYYtext);
+ }
+ YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 2178 "pre.l"
+{
+ g_defLitText+=preYYtext;
+ g_defText+=preYYtext;
+ BEGIN(g_lastCContext);
+ }
+ YY_BREAK
+case 125:
+/* rule 125 can match eol */
+YY_RULE_SETUP
+#line 2183 "pre.l"
+{
+ g_yyLineNr++;
+ g_defLitText+=preYYtext;
+ g_defText+=' ';
+ }
+ YY_BREAK
+case 126:
+YY_RULE_SETUP
+#line 2188 "pre.l"
+{ // see bug 594021 for a usecase for this rule
+ if (g_lastCContext==SkipCPPBlock)
+ {
+ BEGIN(SkipCommand);
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 2198 "pre.l"
+{ BEGIN(g_lastCContext); }
+ YY_BREAK
+case 128:
+YY_RULE_SETUP
+#line 2199 "pre.l"
+
+ YY_BREAK
+case 129:
+YY_RULE_SETUP
+#line 2200 "pre.l"
+
+ YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 2201 "pre.l"
+
+ YY_BREAK
+case 131:
+/* rule 131 can match eol */
+YY_RULE_SETUP
+#line 2202 "pre.l"
+{ g_yyLineNr++; outputChar('\n'); }
+ YY_BREAK
+case 132:
+YY_RULE_SETUP
+#line 2203 "pre.l"
+
+ YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 2204 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 134:
+/* rule 134 can match eol */
+YY_RULE_SETUP
+#line 2207 "pre.l"
+{
+ unput(*preYYtext);
+ BEGIN(g_lastCPPContext);
+ }
+ YY_BREAK
+case 135:
+YY_RULE_SETUP
+#line 2211 "pre.l"
+{
+ outputChar('/');outputChar('*');
+ }
+ YY_BREAK
+case 136:
+YY_RULE_SETUP
+#line 2214 "pre.l"
+{
+ outputChar('/');outputChar('/');
+ }
+ YY_BREAK
+case 137:
+YY_RULE_SETUP
+#line 2217 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ }
+ YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 2220 "pre.l"
+{
+ outputChar(*preYYtext);
+ }
+ YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 2223 "pre.l"
+
+ YY_BREAK
+case 140:
+YY_RULE_SETUP
+#line 2224 "pre.l"
+
+ YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 2225 "pre.l"
+
+ YY_BREAK
+case 142:
+YY_RULE_SETUP
+#line 2226 "pre.l"
+
+ YY_BREAK
+case 143:
+YY_RULE_SETUP
+#line 2227 "pre.l"
+{
+ g_quoteArg=TRUE;
+ g_defLitText+=preYYtext;
+ }
+ YY_BREAK
+case 144:
+YY_RULE_SETUP
+#line 2231 "pre.l"
+{
+ g_defLitText+=preYYtext;
+ if (g_quoteArg)
+ {
+ g_defText+="\"";
+ }
+ if (g_defArgs>0)
+ {
+ int *n;
+ if ((n=(*g_argDict)[preYYtext]))
+ {
+ //if (!g_quoteArg) g_defText+=' ';
+ g_defText+='@';
+ QCString numStr;
+ numStr.sprintf("%d",*n);
+ g_defText+=numStr;
+ //if (!g_quoteArg) g_defText+=' ';
+ }
+ else
+ {
+ g_defText+=preYYtext;
+ }
+ }
+ else
+ {
+ g_defText+=preYYtext;
+ }
+ if (g_quoteArg)
+ {
+ g_defText+="\"";
+ }
+ g_quoteArg=FALSE;
+ }
+ YY_BREAK
+case 145:
+YY_RULE_SETUP
+#line 2264 "pre.l"
+{
+ g_defLitText+=preYYtext;
+ g_defText+=preYYtext;
+ }
+ YY_BREAK
+case 146:
+/* rule 146 can match eol */
+YY_RULE_SETUP
+#line 2268 "pre.l"
+{
+ g_defLitText+=preYYtext;
+ outputChar('\n');
+ g_defText += ' '; g_yyLineNr++;
+ }
+ YY_BREAK
+case 147:
+/* rule 147 can match eol */
+YY_RULE_SETUP
+#line 2273 "pre.l"
+{
+ QCString comment=extractTrailingComment(g_defLitText);
+ g_defLitText+=preYYtext;
+ if (!comment.isEmpty())
+ {
+ outputArray(comment,comment.length());
+ g_defLitText=g_defLitText.left(g_defLitText.length()-comment.length()-1);
+ }
+ outputChar('\n');
+ Define *def=0;
+ //printf("Define name=`%s' text=`%s' litTexti=`%s'\n",g_defName.data(),g_defText.data(),g_defLitText.data());
+ if (g_includeStack.isEmpty() || g_curlyCount>0)
+ {
+ addDefine();
+ }
+ def=g_globalDefineDict->find(g_defName);
+ if (def==0) // new define
+ {
+ //printf("new define!\n");
+ Define *nd = newDefine();
+ g_globalDefineDict->insert(g_defName,nd);
+ // also add it to the local file list if it is a source file
+ if (g_isSource && g_includeStack.isEmpty())
+ {
+ g_fileDefineDict->insert(g_defName,nd);
+ }
+ }
+ else if (def && macroIsAccessible(def))
+ // name already exists
+ {
+ //printf("existing define!\n");
+ //printf("define found\n");
+ if (def->undef) // undefined name
+ {
+ def->undef = FALSE;
+ def->name = g_defName;
+ def->definition = g_defText.stripWhiteSpace();
+ def->nargs = g_defArgs;
+ def->fileName = g_yyFileName.copy();
+ def->lineNr = g_yyLineNr;
+ }
+ else
+ {
+ //printf("error: define %s is defined more than once!\n",g_defName.data());
+ }
+ }
+ delete g_argDict; g_argDict=0;
+ g_yyLineNr++;
+ g_lastGuardName.resize(0);
+ BEGIN(Start);
+ }
+ YY_BREAK
+case 148:
+YY_RULE_SETUP
+#line 2324 "pre.l"
+{ g_defText += ' '; g_defLitText+=preYYtext; }
+ YY_BREAK
+case 149:
+YY_RULE_SETUP
+#line 2325 "pre.l"
+{ g_defText += "##"; g_defLitText+=preYYtext; }
+ YY_BREAK
+case 150:
+YY_RULE_SETUP
+#line 2326 "pre.l"
+{ g_defText += "@@"; g_defLitText+=preYYtext; }
+ YY_BREAK
+case 151:
+YY_RULE_SETUP
+#line 2327 "pre.l"
+{
+ g_defText += *preYYtext;
+ g_defLitText+=preYYtext;
+ if (!g_insideComment)
+ {
+ BEGIN(SkipDoubleQuote);
+ }
+ }
+ YY_BREAK
+case 152:
+YY_RULE_SETUP
+#line 2335 "pre.l"
+{ g_defText += *preYYtext;
+ g_defLitText+=preYYtext;
+ if (!g_insideComment)
+ {
+ BEGIN(SkipSingleQuote);
+ }
+ }
+ YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 2342 "pre.l"
+{ g_defText += preYYtext; g_defLitText+=preYYtext; }
+ YY_BREAK
+case 154:
+YY_RULE_SETUP
+#line 2343 "pre.l"
+{ g_defText += preYYtext; g_defLitText+=preYYtext; }
+ YY_BREAK
+case 155:
+YY_RULE_SETUP
+#line 2344 "pre.l"
+{
+ g_defText += *preYYtext; g_defLitText+=preYYtext;
+ BEGIN(DefineText);
+ }
+ YY_BREAK
+case 156:
+YY_RULE_SETUP
+#line 2348 "pre.l"
+{
+ g_defText += preYYtext; g_defLitText+=preYYtext;
+ }
+ YY_BREAK
+case 157:
+YY_RULE_SETUP
+#line 2351 "pre.l"
+{
+ g_defText += *preYYtext; g_defLitText+=preYYtext;
+ BEGIN(DefineText);
+ }
+ YY_BREAK
+case 158:
+YY_RULE_SETUP
+#line 2355 "pre.l"
+{ g_defText += *preYYtext; g_defLitText+=preYYtext; }
+ YY_BREAK
+case 159:
+YY_RULE_SETUP
+#line 2356 "pre.l"
+{ g_defText += *preYYtext; g_defLitText+=preYYtext; }
+ YY_BREAK
+case 160:
+YY_RULE_SETUP
+#line 2357 "pre.l"
+{ g_defText += *preYYtext; g_defLitText+=preYYtext; }
+ YY_BREAK
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(Start):
+case YY_STATE_EOF(Command):
+case YY_STATE_EOF(SkipCommand):
+case YY_STATE_EOF(SkipLine):
+case YY_STATE_EOF(SkipString):
+case YY_STATE_EOF(CopyLine):
+case YY_STATE_EOF(CopyString):
+case YY_STATE_EOF(Include):
+case YY_STATE_EOF(IncludeID):
+case YY_STATE_EOF(EndImport):
+case YY_STATE_EOF(DefName):
+case YY_STATE_EOF(DefineArg):
+case YY_STATE_EOF(DefineText):
+case YY_STATE_EOF(SkipCPPBlock):
+case YY_STATE_EOF(Ifdef):
+case YY_STATE_EOF(Ifndef):
+case YY_STATE_EOF(SkipCComment):
+case YY_STATE_EOF(CopyCComment):
+case YY_STATE_EOF(SkipVerbatim):
+case YY_STATE_EOF(SkipCPPComment):
+case YY_STATE_EOF(RemoveCComment):
+case YY_STATE_EOF(RemoveCPPComment):
+case YY_STATE_EOF(Guard):
+case YY_STATE_EOF(DefinedExpr1):
+case YY_STATE_EOF(DefinedExpr2):
+case YY_STATE_EOF(SkipDoubleQuote):
+case YY_STATE_EOF(SkipSingleQuote):
+case YY_STATE_EOF(UndefName):
+case YY_STATE_EOF(IgnoreLine):
+case YY_STATE_EOF(FindDefineArgs):
+case YY_STATE_EOF(ReadString):
+case YY_STATE_EOF(CondLine):
+#line 2358 "pre.l"
+{
+ //fprintf(stderr,"End of include file\n");
+ //printf("Include stack depth=%d\n",g_includeStack.count());
+ if (g_includeStack.isEmpty())
+ {
+ //fprintf(stderr,"Terminating scanner!\n");
+ yyterminate();
+ }
+ else
+ {
+ FileState *fs=g_includeStack.pop();
+ //fileDefineCache->merge(g_yyFileName,fs->fileName);
+ YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
+ preYY_switch_to_buffer(fs->bufState );
+ preYY_delete_buffer(oldBuf );
+ g_yyLineNr = fs->lineNr;
+ //preYYin = fs->oldYYin;
+ g_inputBuf = fs->oldFileBuf;
+ g_inputBufPos = fs->oldFileBufPos;
+ setFileName(fs->fileName);
+ //fprintf(stderr,"######## FileName %s\n",g_yyFileName.data());
+
+ // Deal with file changes due to
+ // #include's within { .. } blocks
+ QCString lineStr(15+g_yyFileName.length());
+ lineStr.sprintf("# %d \"%s\" 2",g_yyLineNr,g_yyFileName.data());
+ outputArray(lineStr.data(),lineStr.length());
+
+ delete fs; fs=0;
+ }
+ }
+ YY_BREAK
+case 161:
+*yy_cp = (yy_hold_char); /* undo effects of setting up preYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up preYYtext again */
+#line 2390 "pre.l"
+case 162:
+YY_RULE_SETUP
+#line 2390 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ g_lastCContext=YY_START;
+ g_commentCount=1;
+ if (preYYleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
+ BEGIN(SkipCComment);
+ }
+ YY_BREAK
+case 163:
+YY_RULE_SETUP
+#line 2397 "pre.l"
+{
+ outputArray(preYYtext,preYYleng);
+ g_lastCPPContext=YY_START;
+ if (preYYleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
+ BEGIN(SkipCPPComment);
+ }
+ YY_BREAK
+case 164:
+/* rule 164 can match eol */
+YY_RULE_SETUP
+#line 2403 "pre.l"
+{
+ outputChar('\n');
+ g_yyLineNr++;
+ }
+ YY_BREAK
+case 165:
+YY_RULE_SETUP
+#line 2407 "pre.l"
+{
+ g_expectGuard = FALSE;
+ outputChar(*preYYtext);
+ }
+ YY_BREAK
+case 166:
+YY_RULE_SETUP
+#line 2412 "pre.l"
+ECHO;
+ YY_BREAK
+#line 5765 "<stdout>"
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed preYYin at a new source and called
+ * preYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = preYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( preYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * preYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of preYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ preYYrestart(preYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) preYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 56);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1157 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 56;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1157 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 1156);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up preYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ preYYrestart(preYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( preYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve preYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void preYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ preYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ preYY_create_buffer(preYYin,YY_BUF_SIZE );
+ }
+
+ preYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ preYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void preYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * preYYpop_buffer_state();
+ * preYYpush_buffer_state(new_buffer);
+ */
+ preYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ preYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (preYYwrap()) processing, but the only time this flag
+ * is looked at is after preYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void preYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ preYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE preYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) preYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in preYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) preYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in preYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ preYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with preYY_create_buffer()
+ *
+ */
+ void preYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ preYYfree((void *) b->yy_ch_buf );
+
+ preYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a preYYrestart() or at EOF.
+ */
+ static void preYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ preYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then preYY_init_buffer was _probably_
+ * called from preYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void preYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ preYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void preYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ preYYensure_buffer_stack();
+
+ /* This block is copied from preYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from preYY_switch_to_buffer. */
+ preYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void preYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ preYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ preYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void preYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)preYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in preYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)preYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in preYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE preYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) preYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in preYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ preYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to preYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * preYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE preYY_scan_string (yyconst char * yystr )
+{
+
+ return preYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to preYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE preYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) preYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in preYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = preYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in preYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up preYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ preYYtext[preYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = preYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ preYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int preYYget_lineno (void)
+{
+
+ return preYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *preYYget_in (void)
+{
+ return preYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *preYYget_out (void)
+{
+ return preYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t preYYget_leng (void)
+{
+ return preYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *preYYget_text (void)
+{
+ return preYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void preYYset_lineno (int line_number )
+{
+
+ preYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see preYY_switch_to_buffer
+ */
+void preYYset_in (FILE * in_str )
+{
+ preYYin = in_str ;
+}
+
+void preYYset_out (FILE * out_str )
+{
+ preYYout = out_str ;
+}
+
+int preYYget_debug (void)
+{
+ return preYY_flex_debug;
+}
+
+void preYYset_debug (int bdebug )
+{
+ preYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from preYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ preYYin = stdin;
+ preYYout = stdout;
+#else
+ preYYin = (FILE *) 0;
+ preYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * preYYlex_init()
+ */
+ return 0;
+}
+
+/* preYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int preYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ preYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ preYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ preYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ preYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * preYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *preYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *preYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void preYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see preYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 2412 "pre.l"
+
+
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+static int getNextChar(const QCString &expr,QCString *rest,uint &pos)
+{
+ //printf("getNextChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos);
+ if (pos<expr.length())
+ {
+ //printf("%c=expr()\n",expr.at(pos));
+ return expr.at(pos++);
+ }
+ else if (rest && !rest->isEmpty())
+ {
+ int cc=rest->at(0);
+ *rest=rest->right(rest->length()-1);
+ //printf("%c=rest\n",cc);
+ return cc;
+ }
+ else
+ {
+ int cc=yyinput();
+ //printf("%c=yyinput()\n",cc);
+ return cc;
+ }
+}
+
+static int getCurrentChar(const QCString &expr,QCString *rest,uint pos)
+{
+ //printf("getCurrentChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos);
+ if (pos<expr.length())
+ {
+ //printf("%c=expr()\n",expr.at(pos));
+ return expr.at(pos);
+ }
+ else if (rest && !rest->isEmpty())
+ {
+ int cc=rest->at(0);
+ //printf("%c=rest\n",cc);
+ return cc;
+ }
+ else
+ {
+ int cc=yyinput();
+ returnCharToStream(cc);
+ //unput((char)cc);
+ //printf("%c=yyinput()\n",cc);
+ return cc;
+ }
+}
+
+static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c)
+{
+ //printf("unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c);
+ if (pos<expr.length())
+ {
+ pos++;
+ }
+ else if (rest)
+ {
+ //printf("Prepending to rest!\n");
+ char cs[2];cs[0]=c;cs[1]='\0';
+ rest->prepend(cs);
+ }
+ else
+ {
+ //unput(c);
+ returnCharToStream(c);
+ }
+ //printf("result: unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c);
+}
+
+void addSearchDir(const char *dir)
+{
+ QFileInfo fi(dir);
+ if (fi.isDir()) g_pathList->append(fi.absFilePath());
+}
+
+void initPreprocessor()
+{
+ g_pathList = new QStrList;
+ addSearchDir(".");
+ g_expandedDict = new DefineDict(17);
+}
+
+void cleanUpPreprocessor()
+{
+ delete g_expandedDict; g_expandedDict=0;
+ delete g_pathList; g_pathList=0;
+}
+
+
+void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
+{
+ uint orgOffset=output.curPos();
+ //printf("##########################\n%s\n####################\n",
+ // input.data());
+
+ g_macroExpansion = Config_getBool("MACRO_EXPANSION");
+ g_expandOnlyPredef = Config_getBool("EXPAND_ONLY_PREDEF");
+ g_curlyCount=0;
+ g_nospaces=FALSE;
+ g_inputBuf=&input;
+ g_inputBufPos=0;
+ g_outputBuf=&output;
+ g_includeStack.setAutoDelete(TRUE);
+ g_includeStack.clear();
+ g_expandedDict->setAutoDelete(FALSE);
+ g_expandedDict->clear();
+ g_condStack.clear();
+ g_condStack.setAutoDelete(TRUE);
+ g_fileDefineDict->clear();
+
+ static bool firstTime=TRUE;
+ if (firstTime)
+ {
+ // add predefined macros
+ char *defStr;
+ QStrList &predefList = Config_getList("PREDEFINED");
+ QStrListIterator sli(predefList);
+ for (sli.toFirst();(defStr=sli.current());++sli)
+ {
+ QCString ds = defStr;
+ int i_equals=ds.find('=');
+ int i_obrace=ds.find('(');
+ int i_cbrace=ds.find(')');
+ bool nonRecursive = i_equals>0 && ds.at(i_equals-1)==':';
+
+ if (i_obrace==0) continue; // no define name
+
+ if (i_obrace<i_equals && i_cbrace<i_equals &&
+ i_obrace!=-1 && i_cbrace!=-1 &&
+ i_obrace<i_cbrace
+ ) // predefined function macro definition
+ {
+ //printf("predefined function macro '%s'\n",defStr);
+ QRegExp reId("[a-z_A-Z][a-z_A-Z0-9]*"); // regexp matching an id
+ QDict<int> argDict(17);
+ argDict.setAutoDelete(TRUE);
+ int i=i_obrace+1,p,l,count=0;
+ // gather the formal arguments in a dictionary
+ while (i<i_cbrace && (p=reId.match(ds,i,&l)))
+ {
+ argDict.insert(ds.mid(p,l),new int(count++));
+ i=p+l;
+ }
+ // strip definition part
+ QCString tmp=ds.right(ds.length()-i_equals-1);
+ QCString definition;
+ i=0;
+ // substitute all occurrences of formal arguments by their
+ // corresponding markers
+ while ((p=reId.match(tmp,i,&l))!=-1)
+ {
+ if (p>i) definition+=tmp.mid(i,p-i);
+ int *argIndex;
+ if ((argIndex=argDict[tmp.mid(p,l)])!=0)
+ {
+ QCString marker;
+ marker.sprintf(" @%d ",*argIndex);
+ definition+=marker;
+ }
+ else
+ {
+ definition+=tmp.mid(p,l);
+ }
+ i=p+l;
+ }
+ if (i<(int)tmp.length()) definition+=tmp.mid(i,tmp.length()-i);
+
+ // add define definition to the dictionary of defines for this file
+ QCString dname = ds.left(i_obrace);
+ if (!dname.isEmpty())
+ {
+ Define *def = new Define;
+ def->name = dname;
+ def->definition = definition;
+ def->nargs = count;
+ def->isPredefined = TRUE;
+ def->nonRecursive = nonRecursive;
+ def->fileDef = g_yyFileDef;
+ def->fileName = fileName;
+ g_globalDefineDict->insert(def->name,def);
+ }
+
+ //printf("#define `%s' `%s' #nargs=%d\n",
+ // def->name.data(),def->definition.data(),def->nargs);
+ }
+ else if ((i_obrace==-1 || i_obrace>i_equals) &&
+ (i_cbrace==-1 || i_cbrace>i_equals) &&
+ !ds.isEmpty() && (int)ds.length()>i_equals
+ ) // predefined non-function macro definition
+ {
+ //printf("predefined normal macro '%s'\n",defStr);
+ Define *def = new Define;
+ if (i_equals==-1) // simple define without argument
+ {
+ def->name = ds;
+ def->definition = "1"; // substitute occurrences by 1 (true)
+ }
+ else // simple define with argument
+ {
+ int ine=i_equals - (nonRecursive ? 1 : 0);
+ def->name = ds.left(ine);
+ def->definition = ds.right(ds.length()-i_equals-1);
+ }
+ if (!def->name.isEmpty())
+ {
+ def->nargs = -1;
+ def->isPredefined = TRUE;
+ def->nonRecursive = nonRecursive;
+ def->fileDef = g_yyFileDef;
+ def->fileName = fileName;
+ g_globalDefineDict->insert(def->name,def);
+ }
+ else
+ {
+ delete def;
+ }
+
+ //printf("#define `%s' `%s' #nargs=%d\n",
+ // def->name.data(),def->definition.data(),def->nargs);
+ }
+ }
+ //firstTime=FALSE;
+ }
+
+ g_yyLineNr = 1;
+ g_level = 0;
+ g_ifcount = 0;
+ setFileName(fileName);
+ g_inputFileDef = g_yyFileDef;
+
+ BEGIN( Start );
+
+ g_expectGuard = guessSection(fileName)==Entry::HEADER_SEC;
+ g_lastGuardName.resize(0);
+ g_guardExpr.resize(0);
+
+ preYYlex();
+ g_lexInit=TRUE;
+
+ // make sure we don't extend a \cond with missing \endcond over multiple files (see bug 624829)
+ forceEndCondSection();
+
+ // remove locally defined macros so they can be redefined in another source file
+ if (g_fileDefineDict->count()>0)
+ {
+ QDictIterator<Define> di(*g_fileDefineDict);
+ Define *d;
+ for (di.toFirst();(d=di.current());++di)
+ {
+ g_globalDefineDict->remove(di.currentKey());
+ }
+ g_fileDefineDict->clear();
+ }
+
+ if (Debug::isFlagSet(Debug::Preprocessor))
+ {
+ char *orgPos=output.data()+orgOffset;
+ char *newPos=output.data()+output.curPos();
+ msg("Preprocessor output (size: %d bytes):\n",newPos-orgPos);
+ int line=1;
+ msg("---------\n00001 ");
+ while (orgPos<newPos)
+ {
+ putchar(*orgPos);
+ if (*orgPos=='\n') printf("%05d ",++line);
+ orgPos++;
+ }
+ msg("\n---------\n");
+ }
+}
+
+void preFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ preYYlex_destroy();
+ }
+#endif
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+// int preYYwrap() { return 1 ; }
+ void preYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
+
diff --git a/src/pre.h b/src/pre.h
new file mode 100644
index 0000000..ee7b319
--- /dev/null
+++ b/src/pre.h
@@ -0,0 +1,34 @@
+/******************************************************************************
+ *
+ * $Id: pre.h,v 1.10 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef PRE_H
+#define PRE_H
+
+#include "qtbc.h"
+#include <stdio.h>
+#include "define.h"
+
+class BufStr;
+
+DefineDict* getGlobalDefineDict();
+void initPreprocessor();
+void cleanUpPreprocessor();
+void addSearchDir(const char *dir);
+void preprocessFile(const char *fileName,BufStr &input,BufStr &output);
+void preFreeScanner();
+
+#endif
diff --git a/src/pre.l b/src/pre.l
new file mode 100644
index 0000000..50ba69b
--- /dev/null
+++ b/src/pre.l
@@ -0,0 +1,2703 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+
+/*
+ * includes
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qfile.h>
+#include <qstrlist.h>
+#include <qdict.h>
+#include <qregexp.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+
+#include "pre.h"
+#include "constexp.h"
+#include "define.h"
+#include "doxygen.h"
+#include "message.h"
+#include "util.h"
+#include "defargs.h"
+#include "debug.h"
+#include "bufstr.h"
+#include "portable.h"
+#include "bufstr.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+
+struct FileState
+{
+ FileState(int size) : fileBuf(size),
+ oldFileBuf(0), oldFileBufPos(0) {}
+ int lineNr;
+ BufStr fileBuf;
+ BufStr *oldFileBuf;
+ int oldFileBufPos;
+ YY_BUFFER_STATE bufState;
+ QCString fileName;
+};
+
+/* -----------------------------------------------------------------
+ *
+ * scanner's state
+ */
+
+static int g_yyLineNr = 1;
+static QCString g_yyFileName;
+static FileDef *g_yyFileDef;
+static FileDef *g_inputFileDef;
+static int g_ifcount = 0;
+static QStrList *g_pathList = 0;
+static QStack<FileState> g_includeStack;
+static QDict<int> *g_argDict;
+static int g_defArgs = -1;
+static QCString g_defName;
+static QCString g_defText;
+static QCString g_defLitText;
+static QCString g_defArgsStr;
+static QCString g_defExtraSpacing;
+static bool g_defVarArgs;
+static int g_level;
+static int g_lastCContext;
+static int g_lastCPPContext;
+static QArray<int> g_levelGuard;
+static BufStr *g_inputBuf;
+static int g_inputBufPos;
+static BufStr *g_outputBuf;
+static int g_roundCount;
+static bool g_quoteArg;
+static DefineDict *g_globalDefineDict = new DefineDict(10009);
+static DefineDict *g_fileDefineDict = new DefineDict(1009);
+static DefineDict *g_expandedDict;
+static int g_findDefArgContext;
+static bool g_expectGuard;
+static QCString g_lastGuardName;
+static QCString g_incName;
+static QCString g_guardExpr;
+static int g_curlyCount;
+static bool g_nospaces; // add extra spaces during macro expansion
+
+static bool g_macroExpansion; // from the configuration
+static bool g_expandOnlyPredef; // from the configuration
+static int g_commentCount;
+static bool g_insideComment;
+static bool g_isImported;
+static QCString g_blockName;
+static int g_condCtx;
+static bool g_skip;
+static QStack<bool> g_condStack;
+static bool g_insideCS; // C# has simpler preprocessor
+static bool g_isSource;
+
+static bool g_lexInit = FALSE;
+
+DefineDict* getGlobalDefineDict()
+{
+ return g_globalDefineDict;
+}
+
+static void setFileName(const char *name)
+{
+ bool ambig;
+ QFileInfo fi(name);
+ g_yyFileName=convertToQCString(fi.absFilePath());
+ g_yyFileDef=findFileDef(Doxygen::inputNameDict,g_yyFileName,ambig);
+ if (g_yyFileDef==0) // if this is not an input file check if it is an
+ // include file
+ {
+ g_yyFileDef=findFileDef(Doxygen::includeNameDict,g_yyFileName,ambig);
+ }
+ //printf("setFileName(%s) g_yyFileName=%s g_yyFileDef=%p\n",
+ // name,g_yyFileName.data(),g_yyFileDef);
+ if (g_yyFileDef && g_yyFileDef->isReference()) g_yyFileDef=0;
+ g_insideCS = getLanguageFromFileName(g_yyFileName)==SrcLangExt_CSharp;
+ g_isSource = guessSection(g_yyFileName);
+}
+
+static void incrLevel()
+{
+ g_level++;
+ g_levelGuard.resize(g_level);
+ g_levelGuard[g_level-1]=FALSE;
+ //printf("%s line %d: incrLevel %d\n",g_yyFileName.data(),g_yyLineNr,g_level);
+}
+
+static void decrLevel()
+{
+ //printf("%s line %d: decrLevel %d\n",g_yyFileName.data(),g_yyLineNr,g_level);
+ if (g_level > 0)
+ {
+ g_level--;
+ g_levelGuard.resize(g_level);
+ }
+ else
+ {
+ warn(g_yyFileName,g_yyLineNr,"warning: More #endif's than #if's found.\n");
+ }
+}
+
+static bool otherCaseDone()
+{
+ if (g_level==0)
+ {
+ warn(g_yyFileName,g_yyLineNr,"warning: Found an #else without a preceding #if.\n");
+ return TRUE;
+ }
+ else
+ {
+ return g_levelGuard[g_level-1];
+ }
+}
+
+static void setCaseDone(bool value)
+{
+ g_levelGuard[g_level-1]=value;
+}
+
+static bool macroIsAccessible(Define *def)
+{
+ //printf("macroIsAccessible(%s) input=%s def=%s\n",
+ // def->name.data(),g_inputFileDef?g_inputFileDef->name().data():"<none>",
+ // def->fileDef ? def->fileDef->name().data() : "<none>");
+ if (def && def->isPredefined) // predefined macro -> globally accessible
+ {
+ //printf("%s: predefined macro %s\n",g_inputFileDef->name().data(),def->name.data());
+ return TRUE;
+ }
+ if (def && def->fileDef==g_inputFileDef)
+ {
+ //printf("%s: macro %s defined in this file at line %d now at %d\n",
+ // g_inputFileDef->name().data(),def->name.data(),def->lineNr,g_yyLineNr);
+ return def->lineNr<=g_yyLineNr;
+ }
+ if (g_inputFileDef && def && def->fileDef) // check if g_inputFileDef actually includes def->fileDef
+ {
+ QDict<FileDef> includedFiles(257);
+ bool b = g_inputFileDef->includes(def->fileDef,&includedFiles);
+ //printf("%s: Checking for accessibility of define '%s' (defined in %s): result=%d\n",
+ // g_inputFileDef->name().data(),def->name.data(),def->fileDef->name().data(),b);
+ return b;
+ }
+ //printf("not accessible!\n");
+ return FALSE;
+}
+
+static Define *isDefined(const char *name)
+{
+ Define *def=0;
+ if (name)
+ {
+ def=g_globalDefineDict->find(name);
+ //if ((def=fileDefineCache->findDefine(g_yyFileName,name)) && !def->undef)
+ // return def;
+ if (def && def->undef) def=0;
+ if (def && !macroIsAccessible(def)) def=0;
+ }
+ return def;
+}
+
+
+static QDict<void> g_allIncludes(10009);
+
+static FileState *checkAndOpenFile(const QCString &fileName,bool &alreadyIncluded)
+{
+ alreadyIncluded = FALSE;
+ FileState *fs = 0;
+ //printf("checkAndOpenFile(%s)\n",fileName.data());
+ QFileInfo fi(fileName);
+ if (fi.exists() && fi.isFile())
+ {
+ static QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS");
+ if (patternMatch(fi,&exclPatterns)) return 0;
+
+ QCString absName = convertToQCString(fi.absFilePath());
+
+ // global guard
+ if (g_curlyCount==0) // not #include inside { ... }
+ {
+ if (g_allIncludes.find(absName)!=0)
+ {
+ alreadyIncluded = TRUE;
+ //printf(" already included 1\n");
+ return 0; // already done
+ }
+ g_allIncludes.insert(absName,(void *)0x8);
+ }
+ // check include stack for absName
+
+ QStack<FileState> tmpStack;
+ g_includeStack.setAutoDelete(FALSE);
+ while ((fs=g_includeStack.pop()))
+ {
+ if (fs->fileName==absName) alreadyIncluded=TRUE;
+ tmpStack.push(fs);
+ }
+ while ((fs=tmpStack.pop()))
+ {
+ g_includeStack.push(fs);
+ }
+ g_includeStack.setAutoDelete(TRUE);
+
+ if (alreadyIncluded)
+ {
+ //printf(" already included 2\n");
+ return 0;
+ }
+ //printf("#include %s\n",absName.data());
+
+ fs = new FileState(fi.size()+4096);
+ alreadyIncluded = FALSE;
+ if (!readInputFile(absName,fs->fileBuf))
+ { // error
+ //printf(" error reading\n");
+ delete fs;
+ fs=0;
+ }
+ else
+ {
+ fs->oldFileBuf = g_inputBuf;
+ fs->oldFileBufPos = g_inputBufPos;
+ }
+ }
+ return fs;
+}
+
+static FileState *findFile(const char *fileName,bool localInclude,bool &alreadyIncluded)
+{
+ //printf("** findFile(%s,%d) g_yyFileName=%s\n",fileName,localInclude,g_yyFileName.data());
+ if (localInclude && !g_yyFileName.isEmpty())
+ {
+ QFileInfo fi(g_yyFileName);
+ if (fi.exists())
+ {
+ QCString absName = QCString(fi.dirPath(TRUE).data())+"/"+fileName;
+ FileState *fs = checkAndOpenFile(absName,alreadyIncluded);
+ if (fs)
+ {
+ setFileName(absName);
+ g_yyLineNr=1;
+ return fs;
+ }
+ else if (alreadyIncluded)
+ {
+ return 0;
+ }
+ }
+ }
+ if (g_pathList==0)
+ {
+ return 0;
+ }
+ char *s=g_pathList->first();
+ while (s)
+ {
+ QCString absName = (QCString)s+"/"+fileName;
+ //printf(" Looking for %s in %s\n",fileName,s);
+ FileState *fs = checkAndOpenFile(absName,alreadyIncluded);
+ if (fs)
+ {
+ setFileName(absName);
+ g_yyLineNr=1;
+ //printf(" -> found it\n");
+ return fs;
+ }
+ else if (alreadyIncluded)
+ {
+ return 0;
+ }
+
+ s=g_pathList->next();
+ }
+ return 0;
+}
+
+static QCString extractTrailingComment(const char *s)
+{
+ if (s==0) return "";
+ int i=strlen(s)-1;
+ while (i>=0)
+ {
+ char c=s[i];
+ switch (c)
+ {
+ case '/':
+ {
+ i--;
+ if (i>=0 && s[i]=='*') // end of a comment block
+ {
+ i--;
+ while (i>0 && !(s[i-1]=='/' && s[i]=='*')) i--;
+ if (i==0) return s; else return &s[i-1];
+ }
+ else
+ {
+ return "";
+ }
+ }
+ break;
+ // whitespace or line-continuation
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ case '\\':
+ break;
+ default:
+ return "";
+ }
+ i--;
+ }
+ return "";
+}
+
+static int getNextChar(const QCString &expr,QCString *rest,uint &pos);
+static int getCurrentChar(const QCString &expr,QCString *rest,uint pos);
+static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c);
+static void expandExpression(QCString &expr,QCString *rest,int pos);
+
+static QCString stringize(const QCString &s)
+{
+ QCString result;
+ uint i=0;
+ bool inString=FALSE;
+ bool inChar=FALSE;
+ char c,pc;
+ while (i<s.length())
+ {
+ if (!inString && !inChar)
+ {
+ while (i<s.length() && !inString && !inChar)
+ {
+ c=s.at(i++);
+ if (c=='"')
+ {
+ result+="\\\"";
+ inString=TRUE;
+ }
+ else if (c=='\'')
+ {
+ result+=c;
+ inChar=TRUE;
+ }
+ else
+ {
+ result+=c;
+ }
+ }
+ }
+ else if (inChar)
+ {
+ while (i<s.length() && inChar)
+ {
+ c=s.at(i++);
+ if (c=='\'')
+ {
+ result+='\'';
+ inChar=FALSE;
+ }
+ else if (c=='\\')
+ {
+ result+="\\\\";
+ }
+ else
+ {
+ result+=c;
+ }
+ }
+ }
+ else
+ {
+ pc=0;
+ while (i<s.length() && inString)
+ {
+ char c=s.at(i++);
+ if (c=='"')
+ {
+ result+="\\\"";
+ inString= pc=='\\';
+ }
+ else if (c=='\\')
+ result+="\\\\";
+ else
+ result+=c;
+ pc=c;
+ }
+ }
+ }
+ //printf("stringize `%s'->`%s'\n",s.data(),result.data());
+ return result;
+}
+
+/*! Execute all ## operators in expr.
+ * If the macro name before or after the operator contains a no-rescan
+ * marker (@-) then this is removed (before the concatenated macro name
+ * may be expanded again.
+ */
+static void processConcatOperators(QCString &expr)
+{
+ //printf("processConcatOperators: in=`%s'\n",expr.data());
+ QRegExp r("[ \\t\\n]*##[ \\t\\n]*");
+ int l,n,i=0;
+ if (expr.isEmpty()) return;
+ while ((n=r.match(expr,i,&l))!=-1)
+ {
+ //printf("Match: `%s'\n",expr.data()+i);
+ if (n+l+1<(int)expr.length() && expr.at(n+l)=='@' && expr.at(n+l+1)=='-')
+ {
+ // remove no-rescan marker after ID
+ l+=2;
+ }
+ //printf("found `%s'\n",expr.mid(n,l).data());
+ // remove the ## operator and the surrounding whitespace
+ expr=expr.left(n)+expr.right(expr.length()-n-l);
+ int k=n-1;
+ while (k>=0 && isId(expr.at(k))) k--;
+ if (k>0 && expr.at(k)=='-' && expr.at(k-1)=='@')
+ {
+ // remove no-rescan marker before ID
+ expr=expr.left(k-1)+expr.right(expr.length()-k-1);
+ n-=2;
+ }
+ i=n;
+ }
+ //printf("processConcatOperators: out=`%s'\n",expr.data());
+}
+
+static void yyunput (int c,char *buf_ptr );
+static void returnCharToStream(char c)
+{
+ unput(c);
+}
+
+static inline void addTillEndOfString(const QCString &expr,QCString *rest,
+ uint &pos,char term,QCString &arg)
+{
+ int cc;
+ while ((cc=getNextChar(expr,rest,pos))!=EOF)
+ {
+ if (cc=='\\') arg+=(char)cc,cc=getNextChar(expr,rest,pos);
+ else if (cc==term) return;
+ arg+=(char)cc;
+ }
+}
+
+/*! replaces the function macro \a def whose argument list starts at
+ * \a pos in expression \a expr.
+ * Notice that this routine may scan beyond the \a expr string if needed.
+ * In that case the characters will be read from the input file.
+ * The replacement string will be returned in \a result and the
+ * length of the (unexpanded) argument list is stored in \a len.
+ */
+static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int &len,const Define *def,QCString &result)
+{
+ //printf("replaceFunctionMacro(expr=%s,rest=%s,pos=%d,def=%s) level=%d\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),g_level);
+ uint j=pos;
+ len=0;
+ result.resize(0);
+ int cc;
+ while ((cc=getCurrentChar(expr,rest,j))!=EOF && isspace(cc))
+ {
+ len++;
+ getNextChar(expr,rest,j);
+ }
+ if (cc!='(')
+ {
+ unputChar(expr,rest,j,' ');
+ return FALSE;
+ }
+ getNextChar(expr,rest,j); // eat the `(' character
+
+ QDict<QCString> argTable; // list of arguments
+ argTable.setAutoDelete(TRUE);
+ QCString arg;
+ int argCount=0;
+ bool done=FALSE;
+
+ // PHASE 1: read the macro arguments
+ if (def->nargs==0)
+ {
+ while ((cc=getNextChar(expr,rest,j))!=EOF)
+ {
+ char c = (char)cc;
+ if (c==')') break;
+ }
+ }
+ else
+ {
+ while (!done && (argCount<def->nargs || def->varArgs) &&
+ ((cc=getNextChar(expr,rest,j))!=EOF)
+ )
+ {
+ char c=(char)cc;
+ if (c=='(') // argument is a function => search for matching )
+ {
+ int level=1;
+ arg+=c;
+ //char term='\0';
+ while ((cc=getNextChar(expr,rest,j))!=EOF)
+ {
+ char c=(char)cc;
+ //printf("processing %c: term=%c (%d)\n",c,term,term);
+ if (c=='\'' || c=='\"') // skip ('s and )'s inside strings
+ {
+ arg+=c;
+ addTillEndOfString(expr,rest,j,c,arg);
+ }
+ if (c==')')
+ {
+ level--;
+ arg+=c;
+ if (level==0) break;
+ }
+ else if (c=='(')
+ {
+ level++;
+ arg+=c;
+ }
+ else
+ arg+=c;
+ }
+ }
+ else if (c==')' || c==',') // last or next argument found
+ {
+ if (c==',' && argCount==def->nargs-1 && def->varArgs)
+ {
+ arg=arg.stripWhiteSpace();
+ arg+=',';
+ }
+ else
+ {
+ QCString argKey;
+ argKey.sprintf("@%d",argCount++); // key name
+ arg=arg.stripWhiteSpace();
+ // add argument to the lookup table
+ argTable.insert(argKey, new QCString(arg));
+ arg.resize(0);
+ if (c==')') // end of the argument list
+ {
+ done=TRUE;
+ }
+ }
+ }
+ else if (c=='\"') // append literal strings
+ {
+ arg+=c;
+ bool found=FALSE;
+ while (!found && (cc=getNextChar(expr,rest,j))!=EOF)
+ {
+ found = cc=='"';
+ if (cc=='\\')
+ {
+ c=(char)cc;
+ arg+=c;
+ if ((cc=getNextChar(expr,rest,j))==EOF) break;
+ }
+ c=(char)cc;
+ arg+=c;
+ }
+ }
+ else if (c=='\'') // append literal characters
+ {
+ arg+=c;
+ bool found=FALSE;
+ while (!found && (cc=getNextChar(expr,rest,j))!=EOF)
+ {
+ found = cc=='\'';
+ if (cc=='\\')
+ {
+ c=(char)cc;
+ arg+=c;
+ if ((cc=getNextChar(expr,rest,j))==EOF) break;
+ }
+ c=(char)cc;
+ arg+=c;
+ }
+ }
+ else // append other characters
+ {
+ arg+=c;
+ }
+ }
+ }
+
+ // PHASE 2: apply the macro function
+ if (argCount==def->nargs ||
+ (argCount>def->nargs && def->varArgs)) // matching parameters lists
+ {
+ uint k=0;
+ // substitution of all formal arguments
+ QCString resExpr;
+ const QCString d=def->definition.stripWhiteSpace();
+ //printf("Macro definition: %s\n",d.data());
+ bool inString=FALSE;
+ while (k<d.length())
+ {
+ if (d.at(k)=='@') // maybe a marker, otherwise an escaped @
+ {
+ if (d.at(k+1)=='@') // escaped @ => copy it (is unescaped later)
+ {
+ k+=2;
+ resExpr+="@@"; // we unescape these later
+ }
+ else if (d.at(k+1)=='-') // no-rescan marker
+ {
+ k+=2;
+ resExpr+="@-";
+ }
+ else // argument marker => read the argument number
+ {
+ QCString key="@";
+ QCString *subst=0;
+ bool hash=FALSE;
+ int l=k-1;
+ // search for ## backward
+ if (l>=0 && d.at(l)=='"') l--;
+ while (l>=0 && d.at(l)==' ') l--;
+ if (l>0 && d.at(l)=='#' && d.at(l-1)=='#') hash=TRUE;
+ k++;
+ // scan the number
+ while (k<d.length() && d.at(k)>='0' && d.at(k)<='9') key+=d.at(k++);
+ if (!hash)
+ {
+ // search for ## forward
+ l=k;
+ if (l<(int)d.length() && d.at(l)=='"') l++;
+ while (l<(int)d.length() && d.at(l)==' ') l++;
+ if (l<(int)d.length()-1 && d.at(l)=='#' && d.at(l+1)=='#') hash=TRUE;
+ }
+ //printf("request key %s result %s\n",key.data(),argTable[key]->data());
+ if (key.length()>1 && (subst=argTable[key]))
+ {
+ QCString substArg=*subst;
+ //printf("substArg=`%s'\n",substArg.data());
+ // only if no ## operator is before or after the argument
+ // marker we do macro expansion.
+ if (!hash) expandExpression(substArg,0,0);
+ if (inString)
+ {
+ //printf("`%s'=stringize(`%s')\n",stringize(*subst).data(),subst->data());
+
+ // if the marker is inside a string (because a # was put
+ // before the macro name) we must escape " and \ characters
+ resExpr+=stringize(substArg);
+ }
+ else
+ {
+ if (hash && substArg.isEmpty())
+ {
+ resExpr+="@E"; // empty argument will be remove later on
+ }
+ else if (g_nospaces)
+ {
+ resExpr+=substArg;
+ }
+ else
+ {
+ resExpr+=" "+substArg+" ";
+ }
+ }
+ }
+ }
+ }
+ else // no marker, just copy
+ {
+ if (!inString && d.at(k)=='\"')
+ {
+ inString=TRUE; // entering a literal string
+ }
+ else if (inString && d.at(k)=='\"' && (d.at(k-1)!='\\' || d.at(k-2)=='\\'))
+ {
+ inString=FALSE; // leaving a literal string
+ }
+ resExpr+=d.at(k++);
+ }
+ }
+ len=j-pos;
+ result=resExpr;
+ //printf("result after substitution `%s' expr=`%s'\n",
+ // result.data(),expr.mid(pos,len).data());
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+/*! returns the next identifier in string \a expr by starting at position \a p.
+ * The position of the identifier is returned (or -1 if nothing is found)
+ * and \a l is its length. Any quoted strings are skipping during the search.
+ */
+static int getNextId(const QCString &expr,int p,int *l)
+{
+ int n;
+ while (p<(int)expr.length())
+ {
+ char c=expr.at(p++);
+ if (isdigit(c)) // skip number
+ {
+ while (p<(int)expr.length() && isId(expr.at(p))) p++;
+ }
+ else if (isalpha(c) || c=='_') // read id
+ {
+ n=p-1;
+ while (p<(int)expr.length() && isId(expr.at(p))) p++;
+ *l=p-n;
+ return n;
+ }
+ else if (c=='"') // skip string
+ {
+ char ppc=0,pc=c;
+ if (p<(int)expr.length()) c=expr.at(p);
+ while (p<(int)expr.length() && (c!='"' || (pc=='\\' && ppc!='\\')))
+ // continue as long as no " is found, but ignoring \", but not \\"
+ {
+ ppc=pc;
+ pc=c;
+ c=expr.at(p);
+ p++;
+ }
+ if (p<(int)expr.length()) ++p; // skip closing quote
+ }
+ else if (c=='/') // skip C Comment
+ {
+ char pc=c;
+ if (p<(int)expr.length())
+ {
+ c=expr.at(++p);
+ if (c=='*') // Start of C comment
+ {
+ while (p<(int)expr.length() && !(pc=='*' && c=='/'))
+ {
+ pc=c;
+ c=expr.at(++p);
+ }
+ p++;
+ }
+ }
+ }
+ }
+ return -1;
+}
+
+/*! preforms recursive macro expansion on the string \a expr
+ * starting at position \a pos.
+ * May read additional characters from the input while re-scanning!
+ * If \a expandAll is \c TRUE then all macros in the expression are
+ * expanded, otherwise only the first is expanded.
+ */
+static void expandExpression(QCString &expr,QCString *rest,int pos)
+{
+ //printf("expandExpression(%s,%s)\n",expr.data(),rest ? rest->data() : 0);
+ QCString macroName;
+ QCString expMacro;
+ bool definedTest=FALSE;
+ int i=pos,l,p,len;
+ while ((p=getNextId(expr,i,&l))!=-1) // search for an macro name
+ {
+ bool replaced=FALSE;
+ macroName=expr.mid(p,l);
+ if (p<2 || !(expr.at(p-2)=='@' && expr.at(p-1)=='-')) // no-rescan marker?
+ {
+ if (g_expandedDict->find(macroName)==0) // expand macro
+ {
+ Define *def=isDefined(macroName);
+ if (definedTest) // macro name was found after defined
+ {
+ if (def) expMacro = " 1 "; else expMacro = " 0 ";
+ replaced=TRUE;
+ len=l;
+ definedTest=FALSE;
+ }
+ else if (def && def->nargs==-1) // simple macro
+ {
+ // substitute the definition of the macro
+ //printf("macro `%s'->`%s'\n",macroName.data(),def->definition.data());
+ if (g_nospaces)
+ {
+ expMacro=def->definition.stripWhiteSpace();
+ }
+ else
+ {
+ expMacro=" "+def->definition.stripWhiteSpace()+" ";
+ }
+ //expMacro=def->definition.stripWhiteSpace();
+ replaced=TRUE;
+ len=l;
+ //printf("simple macro expansion=`%s'->`%s'\n",macroName.data(),expMacro.data());
+ }
+ else if (def && def->nargs>=0) // function macro
+ {
+ replaced=replaceFunctionMacro(expr,rest,p+l,len,def,expMacro);
+ len+=l;
+ }
+ else if (macroName=="defined")
+ {
+ //printf("found defined inside macro definition '%s'\n",expr.right(expr.length()-p).data());
+ definedTest=TRUE;
+ }
+
+ if (replaced) // expand the macro and rescan the expression
+ {
+
+ //printf("replacing `%s'->`%s'\n",expr.mid(p,len).data(),expMacro.data());
+ QCString resultExpr=expMacro;
+ QCString restExpr=expr.right(expr.length()-len-p);
+ processConcatOperators(resultExpr);
+ if (def && !def->nonRecursive)
+ {
+ g_expandedDict->insert(macroName,def);
+ expandExpression(resultExpr,&restExpr,0);
+ g_expandedDict->remove(macroName);
+ }
+ expr=expr.left(p)+resultExpr+restExpr;
+ i=p;
+ //printf("new expression: %s\n",expr.data());
+ }
+ else // move to the next macro name
+ {
+ //printf("moving to the next macro old=%d new=%d\n",i,p+l);
+ i=p+l;
+ }
+ }
+ else // move to the next macro name
+ {
+ expr=expr.left(p)+"@-"+expr.right(expr.length()-p);
+ //printf("macro already expanded, moving to the next macro expr=%s\n",expr.data());
+ i=p+l+2;
+ //i=p+l;
+ }
+ }
+ else // no re-scan marker found, skip the macro name
+ {
+ //printf("skipping marked macro\n");
+ i=p+l;
+ }
+ }
+}
+
+/*! replaces all occurrences of @@@@ in \a s by @@
+ * and removes all occurrences of @@E.
+ * All identifiers found are replaced by 0L
+ */
+QCString removeIdsAndMarkers(const char *s)
+{
+ //printf("removeIdsAndMarkers(%s)\n",s);
+ const char *p=s;
+ char c;
+ bool inNum=FALSE;
+ QCString result;
+ if (p)
+ {
+ while ((c=*p))
+ {
+ if (c=='@') // replace @@ with @ and remove @E
+ {
+ if (*(p+1)=='@')
+ {
+ result+=c;
+ }
+ else if (*(p+1)=='E')
+ {
+ // skip
+ }
+ p+=2;
+ }
+ else if (isdigit(c)) // number
+ {
+ result+=c;
+ p++;
+ inNum=TRUE;
+ }
+ else if (c=='d' && !inNum) // identifier starting with a `d'
+ {
+ if (strncmp(p,"defined ",8)==0 || strncmp(p,"defined(",8)==0)
+ // defined keyword
+ {
+ p+=7; // skip defined
+ }
+ else
+ {
+ result+="0L";
+ p++;
+ while ((c=*p) && isId(c)) p++;
+ }
+ }
+ else if ((isalpha(c) || c=='_') && !inNum) // replace identifier with 0L
+ {
+ result+="0L";
+ p++;
+ while ((c=*p) && isId(c)) p++;
+ if (*p=='(') // undefined function macro
+ {
+ p++;
+ int count=1;
+ while ((c=*p++))
+ {
+ if (c=='(') count++;
+ else if (c==')')
+ {
+ count--;
+ if (count==0) break;
+ }
+ else if (c=='/')
+ {
+ char pc=c;
+ c=*++p;
+ if (c=='*') // start of C comment
+ {
+ while (*p && !(pc=='*' && c=='/')) // search end of comment
+ {
+ pc=c;
+ c=*++p;
+ }
+ p++;
+ }
+ }
+ }
+ }
+ }
+ else if (c=='/') // skip C comments
+ {
+ char pc=c;
+ c=*++p;
+ if (c=='*') // start of C comment
+ {
+ while (*p && !(pc=='*' && c=='/')) // search end of comment
+ {
+ pc=c;
+ c=*++p;
+ }
+ p++;
+ }
+ else // oops, not comment but division
+ {
+ result+=pc;
+ goto nextChar;
+ }
+ }
+ else
+ {
+nextChar:
+ result+=c;
+ char lc=tolower(c);
+ if (!isId(lc) && lc!='.' /*&& lc!='-' && lc!='+'*/) inNum=FALSE;
+ p++;
+ }
+ }
+ }
+ //printf("removeIdsAndMarkers(%s)=%s\n",s,result.data());
+ return result;
+}
+
+/*! replaces all occurrences of @@ in \a s by @
+ * \par assumption:
+ * \a s only contains pairs of @@'s
+ */
+QCString removeMarkers(const char *s)
+{
+ const char *p=s;
+ char c;
+ QCString result;
+ if (p)
+ {
+ while ((c=*p))
+ {
+ switch(c)
+ {
+ case '@': // replace @@ with @
+ {
+ if (*(p+1)=='@')
+ {
+ result+=c;
+ }
+ p+=2;
+ }
+ break;
+ case '/': // skip C comments
+ {
+ result+=c;
+ char pc=c;
+ c=*++p;
+ if (c=='*') // start of C comment
+ {
+ while (*p && !(pc=='*' && c=='/')) // search end of comment
+ {
+ if (*p=='@' && *(p+1)=='@')
+ result+=c,p++;
+ else
+ result+=c;
+ pc=c;
+ c=*++p;
+ }
+ if (*p)
+ {
+ result+=c;
+ p++;
+ }
+ }
+ }
+ break;
+ case '"': // skip string literals
+ {
+ result+=c;
+ char pc=c;
+ c=*++p;
+ while (*p && (c!='"' || pc=='\\')) // no end quote
+ {
+ result+=c;
+ c=*++p;
+ }
+ }
+ break;
+ case '\'': // skip char literals
+ {
+ result+=c;
+ char pc=c;
+ c=*++p;
+ while (*p && (c!='\'' || pc=='\\')) // no end quote
+ {
+ result+=c;
+ c=*++p;
+ }
+ }
+ break;
+ default:
+ {
+ result+=c;
+ p++;
+ }
+ break;
+ }
+ }
+ }
+ //printf("RemoveMarkers(%s)=%s\n",s,result.data());
+ return result;
+}
+
+/*! compute the value of the expression in string \a expr.
+ * If needed the function may read additional characters from the input.
+ */
+
+bool computeExpression(const QCString &expr)
+{
+ QCString e=expr;
+ expandExpression(e,0,0);
+ //printf("after expansion `%s'\n",e.data());
+ e = removeIdsAndMarkers(e);
+ if (e.isEmpty()) return FALSE;
+ //printf("parsing `%s'\n",e.data());
+ return parseCppExpression(g_yyFileName,g_yyLineNr,e);
+}
+
+/*! expands the macro definition in \a name
+ * If needed the function may read additional characters from the input
+ */
+
+QCString expandMacro(const QCString &name)
+{
+ QCString n=name;
+ expandExpression(n,0,0);
+ n=removeMarkers(n);
+ //printf("expandMacro `%s'->`%s'\n",name.data(),n.data());
+ return n;
+}
+
+Define *newDefine()
+{
+ Define *def=new Define;
+ def->name = g_defName;
+ def->definition = g_defText.stripWhiteSpace();
+ def->nargs = g_defArgs;
+ def->fileName = g_yyFileName;
+ def->fileDef = g_yyFileDef;
+ def->lineNr = g_yyLineNr;
+ def->varArgs = g_defVarArgs;
+ //printf("newDefine: %s->%s\n",def->name.data(),
+ // def->fileDef ? def->fileDef->name().data() : "<none>");
+ //printf("newDefine: `%s'->`%s'\n",def->name.data(),def->definition.data());
+ if (!def->name.isEmpty() && Doxygen::expandAsDefinedDict[def->name])
+ {
+ def->isPredefined=TRUE;
+ }
+ return def;
+}
+
+void addDefine()
+{
+ if (g_skip) return; // do not add this define as it is inside a
+ // conditional section (cond command) that is disabled.
+ if (!Doxygen::gatherDefines) return;
+
+ //printf("addDefine %s %s\n",g_defName.data(),g_defArgsStr.data());
+ //ArgumentList *al = new ArgumentList;
+ //stringToArgumentList(g_defArgsStr,al);
+ MemberDef *md=new MemberDef(
+ g_yyFileName,g_yyLineNr,
+ "#define",g_defName,g_defArgsStr,0,
+ Public,Normal,FALSE,Member,MemberDef::Define,0,0);
+ if (!g_defArgsStr.isEmpty())
+ {
+ ArgumentList *argList = new ArgumentList;
+ //printf("addDefine() g_defName=`%s' g_defArgsStr=`%s'\n",g_defName.data(),g_defArgsStr.data());
+ stringToArgumentList(g_defArgsStr,argList);
+ md->setArgumentList(argList);
+ }
+ //printf("Setting initializer for `%s' to `%s'\n",g_defName.data(),g_defText.data());
+ int l=g_defLitText.find('\n');
+ if (l>0 && g_defLitText.left(l).stripWhiteSpace()=="\\")
+ {
+ // strip first line if it only contains a slash
+ g_defLitText = g_defLitText.right(g_defLitText.length()-l-1);
+ }
+ else if (l>0)
+ {
+ // align the items on the first line with the items on the second line
+ int k=l+1;
+ const char *p=g_defLitText.data()+k;
+ char c;
+ while ((c=*p++) && (c==' ' || c=='\t')) k++;
+ g_defLitText=g_defLitText.mid(l+1,k-l-1)+g_defLitText.stripWhiteSpace();
+ }
+ md->setInitializer(g_defLitText.stripWhiteSpace());
+
+ //printf("pre.l: md->setFileDef(%p)\n",g_inputFileDef);
+ md->setFileDef(g_inputFileDef);
+ md->setDefinition("#define "+g_defName);
+
+ MemberName *mn=Doxygen::functionNameSDict->find(g_defName);
+ if (mn==0)
+ {
+ mn = new MemberName(g_defName);
+ Doxygen::functionNameSDict->append(g_defName,mn);
+ }
+ mn->append(md);
+ if (g_yyFileDef)
+ {
+ g_yyFileDef->insertMember(md);
+ }
+
+ //Define *d;
+ //if ((d=defineDict[g_defName])==0) defineDict.insert(g_defName,newDefine());
+}
+
+static inline void outputChar(char c)
+{
+ if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->addChar(c);
+}
+
+static inline void outputArray(const char *a,int len)
+{
+ if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->addArray(a,len);
+}
+
+static void readIncludeFile(const QCString &inc)
+{
+ if (!Config_getBool("SEARCH_INCLUDES")) return; // do not read include files
+ uint i=0;
+
+ // find the start of the include file name
+ while (i<inc.length() &&
+ (inc.at(i)==' ' || inc.at(i)=='"' || inc.at(i)=='<')
+ ) i++;
+ uint s=i;
+
+ // was it a local include?
+ bool localInclude = s>0 && inc.at(s-1)=='"';
+
+ // find the end of the include file name
+ while (i<inc.length() && inc.at(i)!='"' && inc.at(i)!='>') i++;
+
+ if (s<inc.length() && i>s) // valid include file name found
+ {
+ // extract include path+name
+ QCString incFileName=inc.mid(s,i-s).stripWhiteSpace();
+
+ QCString dosExt = incFileName.right(4);
+ if (dosExt==".exe" || dosExt==".dll" || dosExt==".tbl")
+ {
+ // skip imported binary files (e.g. M$ type libraries)
+ return;
+ }
+
+ QCString oldFileName = g_yyFileName;
+ FileDef *oldFileDef = g_yyFileDef;
+ int oldLineNr = g_yyLineNr;
+ //printf("Searching for `%s'\n",incFileName.data());
+
+ // findFile will overwrite g_yyFileDef if found
+ FileState *fs;
+ bool alreadyIncluded = FALSE;
+ //printf("calling findFile(%s)\n",incFileName.data());
+ if ((fs=findFile(incFileName,localInclude,alreadyIncluded))) // see if the include file can be found
+ {
+ //printf("Found include file!\n");
+ if (Debug::isFlagSet(Debug::Preprocessor))
+ {
+ for (i=0;i<g_includeStack.count();i++) msg(" ");
+ //msg("#include %s: parsing...\n",incFileName.data());
+ }
+ if (oldFileDef)
+ {
+ // add include dependency to the file in which the #include was found
+ bool ambig;
+ // change to local name for bug 641336
+ FileDef *incFd = findFileDef(Doxygen::inputNameDict,incFileName,ambig);
+ oldFileDef->addIncludeDependency(ambig ? 0 : incFd,incFileName,localInclude,g_isImported);
+ // add included by dependency
+ if (g_yyFileDef)
+ {
+ //printf("Adding include dependency %s->%s\n",oldFileDef->name().data(),incFileName.data());
+ g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,g_isImported);
+ }
+ }
+ fs->bufState = YY_CURRENT_BUFFER;
+ fs->lineNr = oldLineNr;
+ fs->fileName = oldFileName;
+ // push the state on the stack
+ g_includeStack.push(fs);
+ // set the scanner to the include file
+
+ // Deal with file changes due to
+ // #include's within { .. } blocks
+ QCString lineStr(g_yyFileName.length()+20);
+ lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data());
+ outputArray(lineStr.data(),lineStr.length());
+
+ //fprintf(stderr,"Switching to include file %s\n",incFileName.data());
+ g_expectGuard=TRUE;
+ g_inputBuf = &fs->fileBuf;
+ g_inputBufPos=0;
+ yy_switch_to_buffer(yy_create_buffer(0, YY_BUF_SIZE));
+ }
+ else
+ {
+ //printf(" calling findFile(%s) alreadyInc=%d\n",incFileName.data(),alreadyIncluded);
+ if (oldFileDef)
+ {
+ bool ambig;
+ //QCString absPath = incFileName;
+ //if (QDir::isRelativePath(incFileName))
+ //{
+ // absPath = QDir::cleanDirPath(oldFileDef->getPath()+"/"+incFileName);
+ // //printf("%s + %s -> resolved path %s\n",oldFileDef->getPath().data(),incFileName.data(),absPath.data());
+ //}
+
+ // change to local name for bug 641336
+ FileDef *fd = findFileDef(Doxygen::inputNameDict,incFileName,ambig);
+ //printf("%s::findFileDef(%s)=%p\n",oldFileDef->name().data(),incFileName.data(),fd);
+ // add include dependency to the file in which the #include was found
+ oldFileDef->addIncludeDependency(ambig ? 0 : fd,incFileName,localInclude,g_isImported);
+ // add included by dependency
+ if (fd)
+ {
+ //printf("Adding include dependency (2) %s->%s ambig=%d\n",oldFileDef->name().data(),fd->name().data(),ambig);
+ fd->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,g_isImported);
+ }
+ }
+ if (Debug::isFlagSet(Debug::Preprocessor))
+ {
+ msg("#include %s: not found or already included! skipping...\n",incFileName.data());
+ //printf("error: include file %s not found\n",yytext);
+ }
+ if (g_curlyCount>0 && !alreadyIncluded) // failed to find #include inside { ... }
+ {
+ warn(g_yyFileName,g_yyLineNr,"Warning: include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data());
+ }
+ }
+ }
+}
+
+/* ----------------------------------------------------------------- */
+
+static void startCondSection(const char *sectId)
+{
+ g_condStack.push(new bool(g_skip));
+ if (Config_getList("ENABLED_SECTIONS").find(sectId)==-1)
+ {
+ g_skip=TRUE;
+ }
+}
+
+static void endCondSection()
+{
+ if (g_condStack.isEmpty())
+ {
+ g_skip=FALSE;
+ }
+ else
+ {
+ bool *ctx = g_condStack.pop();
+ g_skip=*ctx;
+ }
+}
+
+static void forceEndCondSection()
+{
+ while (!g_condStack.isEmpty())
+ {
+ g_condStack.pop();
+ }
+ g_skip=FALSE;
+}
+
+static QCString escapeAt(const char *text)
+{
+ QCString result;
+ if (text)
+ {
+ char c;
+ const char *p=text;
+ while ((c=*p++))
+ {
+ if (c=='@') result+="@@"; else result+=c;
+ }
+ }
+ return result;
+}
+
+static char resolveTrigraph(char c)
+{
+ switch (c)
+ {
+ case '=': return '#';
+ case '/': return '\\';
+ case '\'': return '^';
+ case '(': return '[';
+ case ')': return ']';
+ case '!': return '|';
+ case '<': return '{';
+ case '>': return '}';
+ case '-': return '~';
+ }
+ return '?';
+}
+
+/* ----------------------------------------------------------------- */
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int bytesInBuf = g_inputBuf->curPos()-g_inputBufPos;
+ int bytesToCopy = QMIN(max_size,bytesInBuf);
+ memcpy(buf,g_inputBuf->data()+g_inputBufPos,bytesToCopy);
+ g_inputBufPos+=bytesToCopy;
+ return bytesToCopy;
+}
+
+/* ----------------------------------------------------------------- */
+
+%}
+
+ID [a-z_A-Z][a-z_A-Z0-9]*
+B [ \t]
+BN [ \t\r\n]
+CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
+
+%option noyywrap
+
+%x Start
+%x Command
+%x SkipCommand
+%x SkipLine
+%x SkipString
+%x CopyLine
+%x CopyString
+%x Include
+%x IncludeID
+%x EndImport
+%x DefName
+%x DefineArg
+%x DefineText
+%x SkipCPPBlock
+%x Ifdef
+%x Ifndef
+%x SkipCComment
+%x CopyCComment
+%x SkipVerbatim
+%x SkipCPPComment
+%x RemoveCComment
+%x RemoveCPPComment
+%x Guard
+%x DefinedExpr1
+%x DefinedExpr2
+%x SkipDoubleQuote
+%x SkipSingleQuote
+%x UndefName
+%x IgnoreLine
+%x FindDefineArgs
+%x ReadString
+%x CondLine
+
+%%
+
+<*>\x06
+<*>\x00
+<*>\r
+<*>"??"[=/'()!<>-] { // Trigraph
+ unput(resolveTrigraph(yytext[2]));
+ }
+<Start>^{B}*"#" { BEGIN(Command); }
+<Start>^{B}*/[^#] {
+ outputArray(yytext,yyleng);
+ BEGIN(CopyLine);
+ }
+<Start>^{B}*[_A-Z][_A-Z0-9]*{B}*"("[^\)\n]*")"/{BN}{1,10}*[:{] { // constructors?
+ int i;
+ for (i=yyleng-1;i>=0;i--)
+ {
+ unput(yytext[i]);
+ }
+ BEGIN(CopyLine);
+ }
+<Start>^{B}*[_A-Z][_A-Z0-9]*{B}*"("[^\(\)\n]*"("[^\)\n]*")"[^\)\n]*")"{B}*\n | // function list macro with one (...) argument, e.g. for K_GLOBAL_STATIC_WITH_ARGS
+<Start>^{B}*[_A-Z][_A-Z0-9]*{B}*"("[^\)\n]*")"{B}*\n { // function like macro
+ static bool skipFuncMacros = Config_getBool("SKIP_FUNCTION_MACROS");
+ QCString name(yytext);
+ name=name.left(name.find('(')).stripWhiteSpace();
+
+ Define *def=0;
+ if (skipFuncMacros &&
+ name!="Q_PROPERTY" &&
+ !(
+ (g_includeStack.isEmpty() || g_curlyCount>0) &&
+ g_macroExpansion &&
+ (def=g_globalDefineDict->find(name)) &&
+ macroIsAccessible(def) &&
+ (!g_expandOnlyPredef || def->isPredefined)
+ )
+ )
+ {
+ outputChar('\n');
+ g_yyLineNr++;
+ }
+ else // don't skip
+ {
+ int i;
+ for (i=yyleng-1;i>=0;i--)
+ {
+ unput(yytext[i]);
+ }
+ BEGIN(CopyLine);
+ }
+ }
+<CopyLine>"extern"{BN}{0,80}"\"C\""*{BN}{0,80}"{" {
+ QCString text=yytext;
+ g_yyLineNr+=text.contains('\n');
+ outputArray(yytext,yyleng);
+ }
+<CopyLine>"{" { // count brackets inside the main file
+ if (g_includeStack.isEmpty())
+ {
+ g_curlyCount++;
+ }
+ outputChar(*yytext);
+ }
+<CopyLine>"}" { // count brackets inside the main file
+ if (g_includeStack.isEmpty() && g_curlyCount>0)
+ {
+ g_curlyCount--;
+ }
+ outputChar(*yytext);
+ }
+<CopyLine>"'"\\[0-7]{1,3}"'" {
+ outputArray(yytext,yyleng);
+ }
+<CopyLine>"'"\\."'" {
+ outputArray(yytext,yyleng);
+ }
+<CopyLine>"'"."'" {
+ outputArray(yytext,yyleng);
+ }
+<CopyLine>\" {
+ outputChar(*yytext);
+ BEGIN( CopyString );
+ }
+<CopyString>[^\"\\\r\n]+ {
+ outputArray(yytext,yyleng);
+ }
+<CopyString>\\. {
+ outputArray(yytext,yyleng);
+ }
+<CopyString>\" {
+ outputChar(*yytext);
+ BEGIN( CopyLine );
+ }
+<CopyLine>{ID}/{BN}{0,80}"(" {
+ g_expectGuard = FALSE;
+ Define *def=0;
+ //def=g_globalDefineDict->find(yytext);
+ //printf("Search for define %s found=%d g_includeStack.isEmpty()=%d "
+ // "g_curlyCount=%d g_macroExpansion=%d g_expandOnlyPredef=%d "
+ // "isPreDefined=%d\n",yytext,def ? 1 : 0,
+ // g_includeStack.isEmpty(),g_curlyCount,g_macroExpansion,g_expandOnlyPredef,
+ // def ? def->isPredefined : -1
+ // );
+ if ((g_includeStack.isEmpty() || g_curlyCount>0) &&
+ g_macroExpansion &&
+ (def=g_globalDefineDict->find(yytext)) &&
+ (def->isPredefined || macroIsAccessible(def)) &&
+ (!g_expandOnlyPredef || def->isPredefined)
+ )
+ {
+ //printf("Found it! #args=%d\n",def->nargs);
+ g_roundCount=0;
+ g_defArgsStr=yytext;
+ if (def->nargs==-1) // no function macro
+ {
+ QCString result = def->isPredefined ? def->definition : expandMacro(g_defArgsStr);
+ outputArray(result,result.length());
+ }
+ else // zero or more arguments
+ {
+ g_findDefArgContext = CopyLine;
+ BEGIN(FindDefineArgs);
+ }
+ }
+ else
+ {
+ outputArray(yytext,yyleng);
+ }
+ }
+<CopyLine>{ID} {
+ Define *def=0;
+ if ((g_includeStack.isEmpty() || g_curlyCount>0) &&
+ g_macroExpansion &&
+ (def=g_globalDefineDict->find(yytext)) &&
+ def->nargs==-1 &&
+ (def->isPredefined || macroIsAccessible(def)) &&
+ (!g_expandOnlyPredef || def->isPredefined)
+ )
+ {
+ QCString result=def->isPredefined ? def->definition : expandMacro(yytext);
+ outputArray(result,result.length());
+ }
+ else
+ {
+ outputArray(yytext,yyleng);
+ }
+ }
+<CopyLine>"\\"\r?/\n { // strip line continuation characters
+ }
+<CopyLine>. {
+ outputChar(*yytext);
+ }
+<CopyLine>\n {
+ outputChar('\n');
+ BEGIN(Start);
+ g_yyLineNr++;
+ }
+<FindDefineArgs>"(" {
+ g_defArgsStr+='(';
+ g_roundCount++;
+ }
+<FindDefineArgs>")" {
+ g_defArgsStr+=')';
+ g_roundCount--;
+ if (g_roundCount==0)
+ {
+ QCString result=expandMacro(g_defArgsStr);
+ //printf("g_defArgsStr=`%s'->`%s'\n",g_defArgsStr.data(),result.data());
+ if (g_findDefArgContext==CopyLine)
+ {
+ outputArray(result,result.length());
+ BEGIN(g_findDefArgContext);
+ }
+ else // g_findDefArgContext==IncludeID
+ {
+ readIncludeFile(result);
+ g_nospaces=FALSE;
+ BEGIN(Start);
+ }
+ }
+ }
+ /*
+<FindDefineArgs>")"{B}*"(" {
+ g_defArgsStr+=yytext;
+ }
+ */
+<FindDefineArgs>{CHARLIT} {
+ g_defArgsStr+=yytext;
+ }
+<FindDefineArgs>\" {
+ g_defArgsStr+=*yytext;
+ BEGIN(ReadString);
+ }
+<FindDefineArgs>\n {
+ g_yyLineNr++;
+ outputChar('\n');
+ }
+<FindDefineArgs>"@" {
+ g_defArgsStr+="@@";
+ }
+<FindDefineArgs>. {
+ g_defArgsStr+=*yytext;
+ }
+<ReadString>"\"" {
+ g_defArgsStr+=*yytext;
+ BEGIN(FindDefineArgs);
+ }
+<ReadString>"//"|"/*" {
+ g_defArgsStr+=yytext;
+ }
+<ReadString>\\. {
+ g_defArgsStr+=yytext;
+ }
+<ReadString>. {
+ g_defArgsStr+=*yytext;
+ }
+<Command>("include"|"import"){B}+/{ID} {
+ g_isImported = yytext[1]=='m';
+ if (g_macroExpansion)
+ BEGIN(IncludeID);
+ }
+<Command>("include"|"import"){B}*[<"] {
+ g_isImported = yytext[1]=='m';
+ char c[2];
+ c[0]=yytext[yyleng-1];c[1]='\0';
+ g_incName=c;
+ BEGIN(Include);
+ }
+<Command>("cmake")?"define"{B}+ {
+ //printf("!!!DefName\n");
+ BEGIN(DefName);
+ }
+<Command>"ifdef"/{B}*"(" {
+ incrLevel();
+ g_guardExpr.resize(0);
+ BEGIN(DefinedExpr2);
+ }
+<Command>"ifdef"/{B}+ {
+ //printf("Pre.l: ifdef\n");
+ incrLevel();
+ g_guardExpr.resize(0);
+ BEGIN(DefinedExpr1);
+ }
+<Command>"ifndef"/{B}*"(" {
+ incrLevel();
+ g_guardExpr="! ";
+ BEGIN(DefinedExpr2);
+ }
+<Command>"ifndef"/{B}+ {
+ incrLevel();
+ g_guardExpr="! ";
+ BEGIN(DefinedExpr1);
+ }
+<Command>"if"/[ \t(!] {
+ incrLevel();
+ g_guardExpr.resize(0);
+ BEGIN(Guard);
+ }
+<Command>("elif"|"else"{B}*"if")/[ \t(!] {
+ if (!otherCaseDone())
+ {
+ g_guardExpr.resize(0);
+ BEGIN(Guard);
+ }
+ else
+ {
+ g_ifcount=0;
+ BEGIN(SkipCPPBlock);
+ }
+ }
+<Command>"else"/[^a-z_A-Z0-9] {
+ //printf("else g_levelGuard[%d]=%d\n",g_level-1,g_levelGuard[g_level-1]);
+ if (otherCaseDone())
+ {
+ g_ifcount=0;
+ BEGIN(SkipCPPBlock);
+ }
+ else
+ {
+ setCaseDone(TRUE);
+ //g_levelGuard[g_level-1]=TRUE;
+ }
+ }
+<Command>"undef"{B}+ {
+ BEGIN(UndefName);
+ }
+<Command>("elif"|"else"{B}*"if")/[ \t(!] {
+ if (!otherCaseDone())
+ {
+ g_guardExpr.resize(0);
+ BEGIN(Guard);
+ }
+ }
+<Command>"endif"/[^a-z_A-Z0-9] {
+ //printf("Pre.l: #endif\n");
+ decrLevel();
+ }
+<Command,IgnoreLine>\n {
+ outputChar('\n');
+ BEGIN(Start);
+ g_yyLineNr++;
+ }
+<Command>{ID} { // unknown directive
+ BEGIN(IgnoreLine);
+ }
+<IgnoreLine>\\[\r]?\n {
+ outputChar('\n');
+ g_yyLineNr++;
+ }
+<IgnoreLine>.
+<Command>.
+<UndefName>{ID} {
+ Define *def;
+ if ((def=isDefined(yytext))
+ /*&& !def->isPredefined*/
+ && !def->nonRecursive
+ )
+ {
+ //printf("undefining %s\n",yytext);
+ def->undef=TRUE;
+ }
+ BEGIN(Start);
+ }
+<Guard>\\[\r]?\n {
+ outputChar('\n');
+ g_guardExpr+=' ';
+ g_yyLineNr++;
+ }
+<Guard>"defined"/{B}*"(" {
+ BEGIN(DefinedExpr2);
+ }
+<Guard>"defined"/{B}+ {
+ BEGIN(DefinedExpr1);
+ }
+<Guard>{ID} { g_guardExpr+=yytext; }
+<Guard>. { g_guardExpr+=*yytext; }
+<Guard>\n {
+ unput(*yytext);
+ //printf("Guard: `%s'\n",
+ // g_guardExpr.data());
+ bool guard=computeExpression(g_guardExpr);
+ setCaseDone(guard);
+ //printf("if g_levelGuard[%d]=%d\n",g_level-1,g_levelGuard[g_level-1]);
+ if (guard)
+ {
+ BEGIN(Start);
+ }
+ else
+ {
+ g_ifcount=0;
+ BEGIN(SkipCPPBlock);
+ }
+ }
+<DefinedExpr1,DefinedExpr2>\\\n { g_yyLineNr++; outputChar('\n'); }
+<DefinedExpr1>{ID} {
+ if (isDefined(yytext))
+ g_guardExpr+=" 1L ";
+ else
+ g_guardExpr+=" 0L ";
+ g_lastGuardName=yytext;
+ BEGIN(Guard);
+ }
+<DefinedExpr2>{ID} {
+ if (isDefined(yytext))
+ g_guardExpr+=" 1L ";
+ else
+ g_guardExpr+=" 0L ";
+ g_lastGuardName=yytext;
+ }
+<DefinedExpr1,DefinedExpr2>\n { // should not happen, handle anyway
+ g_yyLineNr++;
+ g_ifcount=0;
+ BEGIN(SkipCPPBlock);
+ }
+<DefinedExpr2>")" {
+ BEGIN(Guard);
+ }
+<DefinedExpr1,DefinedExpr2>.
+<SkipCPPBlock>^{B}*"#" { BEGIN(SkipCommand); }
+<SkipCPPBlock>^{B}*/[^#] { BEGIN(SkipLine); }
+<SkipCPPBlock>\n { g_yyLineNr++; outputChar('\n'); }
+<SkipCPPBlock>.
+<SkipCommand>"if"(("n")?("def"))?/[ \t(!] {
+ incrLevel();
+ g_ifcount++;
+ //printf("#if... depth=%d\n",g_ifcount);
+ }
+<SkipCommand>"else" {
+ //printf("Else! g_ifcount=%d otherCaseDone=%d\n",g_ifcount,otherCaseDone());
+ if (g_ifcount==0 && !otherCaseDone())
+ {
+ setCaseDone(TRUE);
+ //outputChar('\n');
+ BEGIN(Start);
+ }
+ }
+<SkipCommand>("elif"|"else"{B}*"if")/[ \t(!] {
+ if (g_ifcount==0)
+ {
+ if (!otherCaseDone())
+ {
+ g_guardExpr.resize(0);
+ g_lastGuardName.resize(0);
+ BEGIN(Guard);
+ }
+ else
+ {
+ BEGIN(SkipCPPBlock);
+ }
+ }
+ }
+<SkipCommand>"endif" {
+ g_expectGuard = FALSE;
+ decrLevel();
+ if (--g_ifcount<0)
+ {
+ //outputChar('\n');
+ BEGIN(Start);
+ }
+ }
+<SkipCommand>\n {
+ outputChar('\n');
+ g_yyLineNr++;
+ BEGIN(SkipCPPBlock);
+ }
+<SkipCommand>{ID} { // unknown directive
+ BEGIN(SkipLine);
+ }
+<SkipCommand>.
+<SkipLine>[^'"/\n]+
+<SkipLine>{CHARLIT} { }
+<SkipLine>\" {
+ BEGIN(SkipString);
+ }
+<SkipLine>.
+<SkipLine,SkipCommand,SkipCPPBlock,SkipString>"//"[^\n]* {
+ g_lastCPPContext=YY_START;
+ BEGIN(RemoveCPPComment);
+ }
+<SkipLine,SkipCommand,SkipCPPBlock,SkipString>"/*"/[^\n]* {
+ g_lastCContext=YY_START;
+ BEGIN(RemoveCComment);
+ }
+<SkipLine>\n {
+ outputChar('\n');
+ g_yyLineNr++;
+ BEGIN(SkipCPPBlock);
+ }
+<SkipString>[^"\\\n]+ { }
+<SkipString>\\. { }
+<SkipString>\" {
+ BEGIN(SkipLine);
+ }
+<SkipString>. { }
+<IncludeID>{ID}{B}*/"(" {
+ g_nospaces=TRUE;
+ g_roundCount=0;
+ g_defArgsStr=yytext;
+ g_findDefArgContext = IncludeID;
+ BEGIN(FindDefineArgs);
+ }
+<IncludeID>{ID} {
+ g_nospaces=TRUE;
+ readIncludeFile(expandMacro(yytext));
+ BEGIN(Start);
+ }
+<Include>[^\">\n]+[\">] {
+ g_incName+=yytext;
+ readIncludeFile(g_incName);
+ if (g_isImported)
+ {
+ BEGIN(EndImport);
+ }
+ else
+ {
+ BEGIN(Start);
+ }
+ }
+<EndImport>[^\\\n]*/\n {
+ BEGIN(Start);
+ }
+<EndImport>\\[\r]?"\n" {
+ outputChar('\n');
+ g_yyLineNr++;
+ }
+<EndImport>. {
+ }
+<DefName>{ID}/("\\\n")*"(" { // define with argument
+ //printf("Define() `%s'\n",yytext);
+ g_argDict = new QDict<int>(31);
+ g_argDict->setAutoDelete(TRUE);
+ g_defArgs = 0;
+ g_defArgsStr.resize(0);
+ g_defText.resize(0);
+ g_defLitText.resize(0);
+ g_defName = yytext;
+ g_defVarArgs = FALSE;
+ g_defExtraSpacing.resize(0);
+ BEGIN(DefineArg);
+ }
+<DefName>{ID}{B}+"1" { // special case: define with 1 -> can be "guard"
+ //printf("Define `%s'\n",yytext);
+ g_argDict = 0;
+ g_defArgs = -1;
+ g_defArgsStr.resize(0);
+ g_defName = yytext;
+ g_defName = g_defName.left(g_defName.length()-1).stripWhiteSpace();
+ g_defVarArgs = FALSE;
+ if ( g_defName!=g_lastGuardName || !g_expectGuard)
+ { // define may appear in the output
+ QCString tmp=(QCString)"#define "+g_defName;
+ outputArray(tmp.data(),tmp.length());
+ g_quoteArg=FALSE;
+ g_insideComment=FALSE;
+ g_lastGuardName.resize(0);
+ g_defText="1";
+ g_defLitText="1";
+ BEGIN(DefineText);
+ }
+ else // define is a guard => hide
+ {
+ g_defText.resize(0);
+ g_defLitText.resize(0);
+ BEGIN(Start);
+ }
+ }
+<DefName>{ID}/{B}* { // define with content
+ //printf("Define `%s'\n",yytext);
+ g_argDict = 0;
+ g_defArgs = -1;
+ g_defArgsStr.resize(0);
+ g_defText.resize(0);
+ g_defLitText.resize(0);
+ g_defName = yytext;
+ g_defVarArgs = FALSE;
+ QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr;
+ outputArray(tmp.data(),tmp.length());
+ g_quoteArg=FALSE;
+ g_insideComment=FALSE;
+ BEGIN(DefineText);
+ }
+<DefName>{ID}/{B}*"\n" { // empty define
+ g_argDict = 0;
+ g_defArgs = -1;
+ g_defName = yytext;
+ g_defArgsStr.resize(0);
+ g_defText.resize(0);
+ g_defLitText.resize(0);
+ g_defVarArgs = FALSE;
+ //printf("Guard check: %s!=%s || %d\n",
+ // g_defName.data(),g_lastGuardName.data(),g_expectGuard);
+ if ( g_defName!=g_lastGuardName || !g_expectGuard)
+ { // define may appear in the output
+ QCString tmp=(QCString)"#define "+g_defName;
+ outputArray(tmp.data(),tmp.length());
+ g_quoteArg=FALSE;
+ g_insideComment=FALSE;
+ if (g_insideCS) g_defText="1"; // for C#, use "1" as define text
+ BEGIN(DefineText);
+ }
+ else // define is a guard => hide
+ {
+ //printf("Found a guard %s\n",yytext);
+ g_lastGuardName.resize(0);
+ BEGIN(Start);
+ }
+ g_expectGuard=FALSE;
+ }
+<DefineArg>"\\\n" {
+ g_defExtraSpacing+="\n";
+ g_yyLineNr++;
+ }
+<DefineArg>","{B}* { g_defArgsStr+=yytext; }
+<DefineArg>"("{B}* { g_defArgsStr+=yytext; }
+<DefineArg>{B}*")"{B}* {
+ g_defArgsStr+=yytext;
+ QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr+g_defExtraSpacing;
+ outputArray(tmp.data(),tmp.length());
+ g_quoteArg=FALSE;
+ g_insideComment=FALSE;
+ BEGIN(DefineText);
+ }
+<DefineArg>"..." { // Variadic macro
+ g_defVarArgs = TRUE;
+ g_defArgsStr+=yytext;
+ g_argDict->insert("__VA_ARGS__",new int(g_defArgs));
+ g_defArgs++;
+ }
+<DefineArg>{ID}{B}*("..."?) {
+ //printf("Define addArg(%s)\n",yytext);
+ QCString argName=yytext;
+ g_defVarArgs = yytext[yyleng-1]=='.';
+ if (g_defVarArgs) // strip ellipsis
+ {
+ argName=argName.left(argName.length()-3);
+ }
+ argName = argName.stripWhiteSpace();
+ g_defArgsStr+=yytext;
+ g_argDict->insert(argName,new int(g_defArgs));
+ g_defArgs++;
+ }
+ /*
+<DefineText>"/ **"|"/ *!" {
+ g_defText+=yytext;
+ g_defLitText+=yytext;
+ g_insideComment=TRUE;
+ }
+<DefineText>"* /" {
+ g_defText+=yytext;
+ g_defLitText+=yytext;
+ g_insideComment=FALSE;
+ }
+ */
+<DefineText>"/*"[!*]? {
+ g_defText+=yytext;
+ g_defLitText+=yytext;
+ g_lastCContext=YY_START;
+ g_commentCount=1;
+ BEGIN(CopyCComment);
+ }
+<DefineText>"//"[!/]? {
+ outputArray(yytext,yyleng);
+ g_lastCPPContext=YY_START;
+ g_defLitText+=' ';
+ BEGIN(SkipCPPComment);
+ }
+<SkipCComment>[/]?"*/" {
+ if (yytext[0]=='/') outputChar('/');
+ outputChar('*');outputChar('/');
+ if (--g_commentCount<=0)
+ {
+ if (g_lastCContext==Start)
+ // small hack to make sure that ^... rule will
+ // match when going to Start... Example: "/*...*/ some stuff..."
+ {
+ YY_CURRENT_BUFFER->yy_at_bol=1;
+ }
+ BEGIN(g_lastCContext);
+ }
+ }
+<SkipCComment>"//"("/")* {
+ outputArray(yytext,yyleng);
+ }
+<SkipCComment>"/*" {
+ outputChar('/');outputChar('*');
+ //g_commentCount++;
+ }
+<SkipCComment>[\\@][\\@]("f{"|"f$"|"f[") {
+ outputArray(yytext,yyleng);
+ }
+<SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ {
+ outputArray(yytext,yyleng);
+ g_yyLineNr+=QCString(yytext).contains('\n');
+ }
+<SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ {
+ outputArray(yytext,yyleng);
+ g_yyLineNr+=QCString(yytext).contains('\n');
+ if (yytext[1]=='f')
+ {
+ g_blockName="f";
+ }
+ else
+ {
+ g_blockName=QCString(&yytext[1]).stripWhiteSpace();
+ }
+ BEGIN(SkipVerbatim);
+ }
+<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t]+ { // conditional section
+ g_condCtx = YY_START;
+ outputArray(yytext,yyleng);
+ BEGIN(CondLine);
+ }
+<CondLine>[a-z_A-Z][a-z_A-Z0-9.\-]* {
+ startCondSection(yytext);
+ outputArray(yytext,yyleng);
+ BEGIN(g_condCtx);
+ }
+<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*/\n {
+ g_condCtx = YY_START;
+ outputArray(yytext,yyleng);
+ BEGIN(CondLine);
+ }
+<CondLine>. {
+ unput(*yytext);
+ startCondSection(" ");
+ BEGIN(g_condCtx);
+ }
+<SkipCComment,SkipCPPComment>[\\@]"endcond"/[^a-z_A-Z0-9] {
+ outputArray(yytext,yyleng);
+ endCondSection();
+ }
+<SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */
+ outputArray(yytext,yyleng);
+ if (yytext[1]=='f' && g_blockName=="f")
+ {
+ BEGIN(SkipCComment);
+ }
+ else if (&yytext[4]==g_blockName)
+ {
+ BEGIN(SkipCComment);
+ }
+ }
+<SkipVerbatim>"*/"|"/*" {
+ outputArray(yytext,yyleng);
+ }
+<SkipCComment,SkipVerbatim>[^*\\@\x06\n\/]+ {
+ outputArray(yytext,yyleng);
+ }
+<SkipCComment,SkipVerbatim>\n {
+ g_yyLineNr++;
+ outputChar('\n');
+ }
+<SkipCComment,SkipVerbatim>. {
+ outputChar(*yytext);
+ }
+<CopyCComment>[^*a-z_A-Z\n]+ {
+ g_defLitText+=yytext;
+ g_defText+=escapeAt(yytext);
+ }
+<CopyCComment>"*/" {
+ g_defLitText+=yytext;
+ g_defText+=yytext;
+ BEGIN(g_lastCContext);
+ }
+<CopyCComment>\n {
+ g_yyLineNr++;
+ g_defLitText+=yytext;
+ g_defText+=' ';
+ }
+<RemoveCComment>"*/"{B}*"#" { // see bug 594021 for a usecase for this rule
+ if (g_lastCContext==SkipCPPBlock)
+ {
+ BEGIN(SkipCommand);
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<RemoveCComment>"*/" { BEGIN(g_lastCContext); }
+<RemoveCComment>"//"
+<RemoveCComment>"/*"
+<RemoveCComment>[^*\x06\n]+
+<RemoveCComment>\n { g_yyLineNr++; outputChar('\n'); }
+<RemoveCComment>.
+<SkipCPPComment>[^\n\/\\@]+ {
+ outputArray(yytext,yyleng);
+ }
+<SkipCPPComment,RemoveCPPComment>\n {
+ unput(*yytext);
+ BEGIN(g_lastCPPContext);
+ }
+<SkipCPPComment>"/*" {
+ outputChar('/');outputChar('*');
+ }
+<SkipCPPComment>"//" {
+ outputChar('/');outputChar('/');
+ }
+<SkipCPPComment>[^\x06\@\\\n]+ {
+ outputArray(yytext,yyleng);
+ }
+<SkipCPPComment>. {
+ outputChar(*yytext);
+ }
+<RemoveCPPComment>"/*"
+<RemoveCPPComment>"//"
+<RemoveCPPComment>[^\x06\n]+
+<RemoveCPPComment>.
+<DefineText>"#" {
+ g_quoteArg=TRUE;
+ g_defLitText+=yytext;
+ }
+<DefineText,CopyCComment>{ID} {
+ g_defLitText+=yytext;
+ if (g_quoteArg)
+ {
+ g_defText+="\"";
+ }
+ if (g_defArgs>0)
+ {
+ int *n;
+ if ((n=(*g_argDict)[yytext]))
+ {
+ //if (!g_quoteArg) g_defText+=' ';
+ g_defText+='@';
+ QCString numStr;
+ numStr.sprintf("%d",*n);
+ g_defText+=numStr;
+ //if (!g_quoteArg) g_defText+=' ';
+ }
+ else
+ {
+ g_defText+=yytext;
+ }
+ }
+ else
+ {
+ g_defText+=yytext;
+ }
+ if (g_quoteArg)
+ {
+ g_defText+="\"";
+ }
+ g_quoteArg=FALSE;
+ }
+<CopyCComment>. {
+ g_defLitText+=yytext;
+ g_defText+=yytext;
+ }
+<DefineText>\\[\r]?\n {
+ g_defLitText+=yytext;
+ outputChar('\n');
+ g_defText += ' '; g_yyLineNr++;
+ }
+<DefineText>\n {
+ QCString comment=extractTrailingComment(g_defLitText);
+ g_defLitText+=yytext;
+ if (!comment.isEmpty())
+ {
+ outputArray(comment,comment.length());
+ g_defLitText=g_defLitText.left(g_defLitText.length()-comment.length()-1);
+ }
+ outputChar('\n');
+ Define *def=0;
+ //printf("Define name=`%s' text=`%s' litTexti=`%s'\n",g_defName.data(),g_defText.data(),g_defLitText.data());
+ if (g_includeStack.isEmpty() || g_curlyCount>0)
+ {
+ addDefine();
+ }
+ def=g_globalDefineDict->find(g_defName);
+ if (def==0) // new define
+ {
+ //printf("new define!\n");
+ Define *nd = newDefine();
+ g_globalDefineDict->insert(g_defName,nd);
+ // also add it to the local file list if it is a source file
+ if (g_isSource && g_includeStack.isEmpty())
+ {
+ g_fileDefineDict->insert(g_defName,nd);
+ }
+ }
+ else if (def && macroIsAccessible(def))
+ // name already exists
+ {
+ //printf("existing define!\n");
+ //printf("define found\n");
+ if (def->undef) // undefined name
+ {
+ def->undef = FALSE;
+ def->name = g_defName;
+ def->definition = g_defText.stripWhiteSpace();
+ def->nargs = g_defArgs;
+ def->fileName = g_yyFileName.copy();
+ def->lineNr = g_yyLineNr;
+ }
+ else
+ {
+ //printf("error: define %s is defined more than once!\n",g_defName.data());
+ }
+ }
+ delete g_argDict; g_argDict=0;
+ g_yyLineNr++;
+ g_lastGuardName.resize(0);
+ BEGIN(Start);
+ }
+<DefineText>{B}* { g_defText += ' '; g_defLitText+=yytext; }
+<DefineText>{B}*"##"{B}* { g_defText += "##"; g_defLitText+=yytext; }
+<DefineText>"@" { g_defText += "@@"; g_defLitText+=yytext; }
+<DefineText>\" {
+ g_defText += *yytext;
+ g_defLitText+=yytext;
+ if (!g_insideComment)
+ {
+ BEGIN(SkipDoubleQuote);
+ }
+ }
+<DefineText>\' { g_defText += *yytext;
+ g_defLitText+=yytext;
+ if (!g_insideComment)
+ {
+ BEGIN(SkipSingleQuote);
+ }
+ }
+<SkipDoubleQuote>"//" { g_defText += yytext; g_defLitText+=yytext; }
+<SkipDoubleQuote>"/*" { g_defText += yytext; g_defLitText+=yytext; }
+<SkipDoubleQuote>\" {
+ g_defText += *yytext; g_defLitText+=yytext;
+ BEGIN(DefineText);
+ }
+<SkipSingleQuote,SkipDoubleQuote>\\. {
+ g_defText += yytext; g_defLitText+=yytext;
+ }
+<SkipSingleQuote>\' {
+ g_defText += *yytext; g_defLitText+=yytext;
+ BEGIN(DefineText);
+ }
+<SkipDoubleQuote>. { g_defText += *yytext; g_defLitText+=yytext; }
+<SkipSingleQuote>. { g_defText += *yytext; g_defLitText+=yytext; }
+<DefineText>. { g_defText += *yytext; g_defLitText+=yytext; }
+<<EOF>> {
+ //fprintf(stderr,"End of include file\n");
+ //printf("Include stack depth=%d\n",g_includeStack.count());
+ if (g_includeStack.isEmpty())
+ {
+ //fprintf(stderr,"Terminating scanner!\n");
+ yyterminate();
+ }
+ else
+ {
+ FileState *fs=g_includeStack.pop();
+ //fileDefineCache->merge(g_yyFileName,fs->fileName);
+ YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer( fs->bufState );
+ yy_delete_buffer( oldBuf );
+ g_yyLineNr = fs->lineNr;
+ //preYYin = fs->oldYYin;
+ g_inputBuf = fs->oldFileBuf;
+ g_inputBufPos = fs->oldFileBufPos;
+ setFileName(fs->fileName);
+ //fprintf(stderr,"######## FileName %s\n",g_yyFileName.data());
+
+ // Deal with file changes due to
+ // #include's within { .. } blocks
+ QCString lineStr(15+g_yyFileName.length());
+ lineStr.sprintf("# %d \"%s\" 2",g_yyLineNr,g_yyFileName.data());
+ outputArray(lineStr.data(),lineStr.length());
+
+ delete fs; fs=0;
+ }
+ }
+<*>"/*"/"*/" |
+<*>"/*"[*]? {
+ outputArray(yytext,yyleng);
+ g_lastCContext=YY_START;
+ g_commentCount=1;
+ if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
+ BEGIN(SkipCComment);
+ }
+<*>"//"[/]? {
+ outputArray(yytext,yyleng);
+ g_lastCPPContext=YY_START;
+ if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
+ BEGIN(SkipCPPComment);
+ }
+<*>\n {
+ outputChar('\n');
+ g_yyLineNr++;
+ }
+<*>. {
+ g_expectGuard = FALSE;
+ outputChar(*yytext);
+ }
+
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+static int getNextChar(const QCString &expr,QCString *rest,uint &pos)
+{
+ //printf("getNextChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos);
+ if (pos<expr.length())
+ {
+ //printf("%c=expr()\n",expr.at(pos));
+ return expr.at(pos++);
+ }
+ else if (rest && !rest->isEmpty())
+ {
+ int cc=rest->at(0);
+ *rest=rest->right(rest->length()-1);
+ //printf("%c=rest\n",cc);
+ return cc;
+ }
+ else
+ {
+ int cc=yyinput();
+ //printf("%c=yyinput()\n",cc);
+ return cc;
+ }
+}
+
+static int getCurrentChar(const QCString &expr,QCString *rest,uint pos)
+{
+ //printf("getCurrentChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos);
+ if (pos<expr.length())
+ {
+ //printf("%c=expr()\n",expr.at(pos));
+ return expr.at(pos);
+ }
+ else if (rest && !rest->isEmpty())
+ {
+ int cc=rest->at(0);
+ //printf("%c=rest\n",cc);
+ return cc;
+ }
+ else
+ {
+ int cc=yyinput();
+ returnCharToStream(cc);
+ //unput((char)cc);
+ //printf("%c=yyinput()\n",cc);
+ return cc;
+ }
+}
+
+static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c)
+{
+ //printf("unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c);
+ if (pos<expr.length())
+ {
+ pos++;
+ }
+ else if (rest)
+ {
+ //printf("Prepending to rest!\n");
+ char cs[2];cs[0]=c;cs[1]='\0';
+ rest->prepend(cs);
+ }
+ else
+ {
+ //unput(c);
+ returnCharToStream(c);
+ }
+ //printf("result: unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c);
+}
+
+void addSearchDir(const char *dir)
+{
+ QFileInfo fi(dir);
+ if (fi.isDir()) g_pathList->append(fi.absFilePath());
+}
+
+void initPreprocessor()
+{
+ g_pathList = new QStrList;
+ addSearchDir(".");
+ g_expandedDict = new DefineDict(17);
+}
+
+void cleanUpPreprocessor()
+{
+ delete g_expandedDict; g_expandedDict=0;
+ delete g_pathList; g_pathList=0;
+}
+
+
+void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
+{
+ uint orgOffset=output.curPos();
+ //printf("##########################\n%s\n####################\n",
+ // input.data());
+
+ g_macroExpansion = Config_getBool("MACRO_EXPANSION");
+ g_expandOnlyPredef = Config_getBool("EXPAND_ONLY_PREDEF");
+ g_curlyCount=0;
+ g_nospaces=FALSE;
+ g_inputBuf=&input;
+ g_inputBufPos=0;
+ g_outputBuf=&output;
+ g_includeStack.setAutoDelete(TRUE);
+ g_includeStack.clear();
+ g_expandedDict->setAutoDelete(FALSE);
+ g_expandedDict->clear();
+ g_condStack.clear();
+ g_condStack.setAutoDelete(TRUE);
+ g_fileDefineDict->clear();
+
+ static bool firstTime=TRUE;
+ if (firstTime)
+ {
+ // add predefined macros
+ char *defStr;
+ QStrList &predefList = Config_getList("PREDEFINED");
+ QStrListIterator sli(predefList);
+ for (sli.toFirst();(defStr=sli.current());++sli)
+ {
+ QCString ds = defStr;
+ int i_equals=ds.find('=');
+ int i_obrace=ds.find('(');
+ int i_cbrace=ds.find(')');
+ bool nonRecursive = i_equals>0 && ds.at(i_equals-1)==':';
+
+ if (i_obrace==0) continue; // no define name
+
+ if (i_obrace<i_equals && i_cbrace<i_equals &&
+ i_obrace!=-1 && i_cbrace!=-1 &&
+ i_obrace<i_cbrace
+ ) // predefined function macro definition
+ {
+ //printf("predefined function macro '%s'\n",defStr);
+ QRegExp reId("[a-z_A-Z][a-z_A-Z0-9]*"); // regexp matching an id
+ QDict<int> argDict(17);
+ argDict.setAutoDelete(TRUE);
+ int i=i_obrace+1,p,l,count=0;
+ // gather the formal arguments in a dictionary
+ while (i<i_cbrace && (p=reId.match(ds,i,&l)))
+ {
+ argDict.insert(ds.mid(p,l),new int(count++));
+ i=p+l;
+ }
+ // strip definition part
+ QCString tmp=ds.right(ds.length()-i_equals-1);
+ QCString definition;
+ i=0;
+ // substitute all occurrences of formal arguments by their
+ // corresponding markers
+ while ((p=reId.match(tmp,i,&l))!=-1)
+ {
+ if (p>i) definition+=tmp.mid(i,p-i);
+ int *argIndex;
+ if ((argIndex=argDict[tmp.mid(p,l)])!=0)
+ {
+ QCString marker;
+ marker.sprintf(" @%d ",*argIndex);
+ definition+=marker;
+ }
+ else
+ {
+ definition+=tmp.mid(p,l);
+ }
+ i=p+l;
+ }
+ if (i<(int)tmp.length()) definition+=tmp.mid(i,tmp.length()-i);
+
+ // add define definition to the dictionary of defines for this file
+ QCString dname = ds.left(i_obrace);
+ if (!dname.isEmpty())
+ {
+ Define *def = new Define;
+ def->name = dname;
+ def->definition = definition;
+ def->nargs = count;
+ def->isPredefined = TRUE;
+ def->nonRecursive = nonRecursive;
+ def->fileDef = g_yyFileDef;
+ def->fileName = fileName;
+ g_globalDefineDict->insert(def->name,def);
+ }
+
+ //printf("#define `%s' `%s' #nargs=%d\n",
+ // def->name.data(),def->definition.data(),def->nargs);
+ }
+ else if ((i_obrace==-1 || i_obrace>i_equals) &&
+ (i_cbrace==-1 || i_cbrace>i_equals) &&
+ !ds.isEmpty() && (int)ds.length()>i_equals
+ ) // predefined non-function macro definition
+ {
+ //printf("predefined normal macro '%s'\n",defStr);
+ Define *def = new Define;
+ if (i_equals==-1) // simple define without argument
+ {
+ def->name = ds;
+ def->definition = "1"; // substitute occurrences by 1 (true)
+ }
+ else // simple define with argument
+ {
+ int ine=i_equals - (nonRecursive ? 1 : 0);
+ def->name = ds.left(ine);
+ def->definition = ds.right(ds.length()-i_equals-1);
+ }
+ if (!def->name.isEmpty())
+ {
+ def->nargs = -1;
+ def->isPredefined = TRUE;
+ def->nonRecursive = nonRecursive;
+ def->fileDef = g_yyFileDef;
+ def->fileName = fileName;
+ g_globalDefineDict->insert(def->name,def);
+ }
+ else
+ {
+ delete def;
+ }
+
+ //printf("#define `%s' `%s' #nargs=%d\n",
+ // def->name.data(),def->definition.data(),def->nargs);
+ }
+ }
+ //firstTime=FALSE;
+ }
+
+ g_yyLineNr = 1;
+ g_level = 0;
+ g_ifcount = 0;
+ setFileName(fileName);
+ g_inputFileDef = g_yyFileDef;
+
+ BEGIN( Start );
+
+ g_expectGuard = guessSection(fileName)==Entry::HEADER_SEC;
+ g_lastGuardName.resize(0);
+ g_guardExpr.resize(0);
+
+ preYYlex();
+ g_lexInit=TRUE;
+
+ // make sure we don't extend a \cond with missing \endcond over multiple files (see bug 624829)
+ forceEndCondSection();
+
+ // remove locally defined macros so they can be redefined in another source file
+ if (g_fileDefineDict->count()>0)
+ {
+ QDictIterator<Define> di(*g_fileDefineDict);
+ Define *d;
+ for (di.toFirst();(d=di.current());++di)
+ {
+ g_globalDefineDict->remove(di.currentKey());
+ }
+ g_fileDefineDict->clear();
+ }
+
+ if (Debug::isFlagSet(Debug::Preprocessor))
+ {
+ char *orgPos=output.data()+orgOffset;
+ char *newPos=output.data()+output.curPos();
+ msg("Preprocessor output (size: %d bytes):\n",newPos-orgPos);
+ int line=1;
+ msg("---------\n00001 ");
+ while (orgPos<newPos)
+ {
+ putchar(*orgPos);
+ if (*orgPos=='\n') printf("%05d ",++line);
+ orgPos++;
+ }
+ msg("\n---------\n");
+ }
+}
+
+void preFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ preYYlex_destroy();
+ }
+#endif
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+// int preYYwrap() { return 1 ; }
+ void preYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h
new file mode 100644
index 0000000..72a373b
--- /dev/null
+++ b/src/printdocvisitor.h
@@ -0,0 +1,691 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _PRINTDOCVISITOR_H
+#define _PRINTDOCVISITOR_H
+
+#include "docvisitor.h"
+
+/*! Concrete visitor implementation for pretty printing */
+class PrintDocVisitor : public DocVisitor
+{
+ public:
+ PrintDocVisitor() : DocVisitor(DocVisitor_Other), m_indent(0),
+ m_needsEnter(FALSE), m_insidePre(FALSE) {}
+
+ //--------------------------------------
+
+ void visit(DocWord *w)
+ {
+ indent_leaf();
+ printf("%s",w->word().data());
+ }
+ void visit(DocLinkedWord *w)
+ {
+ indent_leaf();
+ printf("%s",w->word().data());
+ }
+ void visit(DocWhiteSpace *w)
+ {
+ indent_leaf();
+ if (m_insidePre)
+ {
+ printf("%s",w->chars().data());
+ }
+ else
+ {
+ printf(" ");
+ }
+ }
+ void visit(DocSymbol *s)
+ {
+ indent_leaf();
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: printf("\\"); break;
+ case DocSymbol::At: printf("@"); break;
+ case DocSymbol::Less: printf("<"); break;
+ case DocSymbol::Greater: printf(">"); break;
+ case DocSymbol::Amp: printf("&"); break;
+ case DocSymbol::Dollar: printf("$"); break;
+ case DocSymbol::Hash: printf("#"); break;
+ case DocSymbol::Percent: printf("%%"); break;
+ case DocSymbol::Copy: printf("&copy;"); break;
+ case DocSymbol::Apos: printf("'"); break;
+ case DocSymbol::Quot: printf("\""); break;
+ case DocSymbol::Lsquo: printf("&lsquo;"); break;
+ case DocSymbol::Rsquo: printf("&rsquo;"); break;
+ case DocSymbol::Ldquo: printf("&ldquo;"); break;
+ case DocSymbol::Rdquo: printf("&rdquo;"); break;
+ case DocSymbol::Ndash: printf("&ndash;"); break;
+ case DocSymbol::Mdash: printf("&mdash;"); break;
+ case DocSymbol::Uml: printf("&%cuml;",s->letter()); break;
+ case DocSymbol::Acute: printf("&%cacute;",s->letter()); break;
+ case DocSymbol::Grave: printf("&%cgrave;",s->letter()); break;
+ case DocSymbol::Circ: printf("&%ccirc;",s->letter()); break;
+ case DocSymbol::Tilde: printf("&%ctilde;",s->letter()); break;
+ case DocSymbol::Szlig: printf("&szlig;"); break;
+ case DocSymbol::Cedil: printf("&%ccedul;",s->letter()); break;
+ case DocSymbol::Ring: printf("&%cring;",s->letter()); break;
+ case DocSymbol::Nbsp: printf("&nbsp;"); break;
+ case DocSymbol::Aelig: printf("&aelig;"); break;
+ case DocSymbol::AElig: printf("&AElig;"); break;
+ default:
+ printf("Error: unknown symbol found\n");
+ }
+ }
+ void visit(DocURL *u)
+ {
+ indent_leaf();
+ printf("%s",u->url().data());
+ }
+ void visit(DocLineBreak *)
+ {
+ indent_leaf();
+ printf("<br/>");
+ }
+ void visit(DocHorRuler *)
+ {
+ indent_leaf();
+ printf("<hr>");
+ }
+ void visit(DocStyleChange *s)
+ {
+ indent_leaf();
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) printf("<bold>"); else printf("</bold>");
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) printf("<italic>"); else printf("</italic>");
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) printf("<code>"); else printf("</code>");
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) printf("<sub>"); else printf("</sub>");
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) printf("<sup>"); else printf("</sup>");
+ break;
+ case DocStyleChange::Center:
+ if (s->enable()) printf("<center>"); else printf("</center>");
+ break;
+ case DocStyleChange::Small:
+ if (s->enable()) printf("<small>"); else printf("</small>");
+ break;
+ case DocStyleChange::Preformatted:
+ if (s->enable()) printf("<pre>"); else printf("</pre>");
+ break;
+ case DocStyleChange::Div:
+ if (s->enable()) printf("<div>"); else printf("</div>");
+ break;
+ case DocStyleChange::Span:
+ if (s->enable()) printf("<span>"); else printf("</span>");
+ break;
+ }
+ }
+ void visit(DocVerbatim *s)
+ {
+ indent_leaf();
+ switch(s->type())
+ {
+ case DocVerbatim::Code: printf("<code>"); break;
+ case DocVerbatim::Verbatim: printf("<verbatim>"); break;
+ case DocVerbatim::HtmlOnly: printf("<htmlonly>"); break;
+ case DocVerbatim::ManOnly: printf("<manonly>"); break;
+ case DocVerbatim::LatexOnly: printf("<latexonly>"); break;
+ case DocVerbatim::XmlOnly: printf("<xmlonly>"); break;
+ case DocVerbatim::Dot: printf("<dot>"); break;
+ case DocVerbatim::Msc: printf("<msc>"); break;
+ }
+ printf("%s",s->text().data());
+ switch(s->type())
+ {
+ case DocVerbatim::Code: printf("</code>"); break;
+ case DocVerbatim::Verbatim: printf("</verbatim>"); break;
+ case DocVerbatim::HtmlOnly: printf("</htmlonly>"); break;
+ case DocVerbatim::ManOnly: printf("</manonly>"); break;
+ case DocVerbatim::LatexOnly: printf("</latexonly>"); break;
+ case DocVerbatim::XmlOnly: printf("</xmlonly>"); break;
+ case DocVerbatim::Dot: printf("</dot>"); break;
+ case DocVerbatim::Msc: printf("</msc>"); break;
+ }
+ }
+ void visit(DocAnchor *a)
+ {
+ indent_leaf();
+ printf("<anchor name=\"%s\"/>",a->anchor().data());
+ }
+ void visit(DocInclude *inc)
+ {
+ indent_leaf();
+ printf("<include file=\"%s\" type=\"",inc->file().data());
+ switch(inc->type())
+ {
+ case DocInclude::Include: printf("include"); break;
+ case DocInclude::IncWithLines: printf("incwithlines"); break;
+ case DocInclude::DontInclude: printf("dontinclude"); break;
+ case DocInclude::HtmlInclude: printf("htmlinclude"); break;
+ case DocInclude::VerbInclude: printf("verbinclude"); break;
+ }
+ printf("\"/>");
+ }
+ void visit(DocIncOperator *op)
+ {
+ indent_leaf();
+ printf("<incoperator pattern=\"%s\" type=\"",op->pattern().data());
+ switch(op->type())
+ {
+ case DocIncOperator::Line: printf("line"); break;
+ case DocIncOperator::Skip: printf("skip"); break;
+ case DocIncOperator::SkipLine: printf("skipline"); break;
+ case DocIncOperator::Until: printf("until"); break;
+ }
+ printf("\"/>");
+ }
+ void visit(DocFormula *f)
+ {
+ indent_leaf();
+ printf("<formula name=%s test=%s/>",f->name().data(),f->text().data());
+ }
+ void visit(DocIndexEntry *i)
+ {
+ indent_leaf();
+ printf("<indexentry>%s</indexentry\n",i->entry().data());
+ }
+ void visit(DocSimpleSectSep *)
+ {
+ indent_leaf();
+ printf("<simplesectsep/>");
+ }
+
+ //--------------------------------------
+
+ void visitPre(DocAutoList *l)
+ {
+ indent_pre();
+ if (l->isEnumList())
+ {
+ printf("<ol>\n");
+ }
+ else
+ {
+ printf("<ul>\n");
+ }
+ }
+ void visitPost(DocAutoList *l)
+ {
+ indent_post();
+ if (l->isEnumList())
+ {
+ printf("</ol>\n");
+ }
+ else
+ {
+ printf("</ul>\n");
+ }
+ }
+ void visitPre(DocAutoListItem *)
+ {
+ indent_pre();
+ printf("<li>\n");
+ }
+ void visitPost(DocAutoListItem *)
+ {
+ indent_post();
+ printf("</li>\n");
+ }
+ void visitPre(DocPara *)
+ {
+ indent_pre();
+ printf("<para>\n");
+ }
+ void visitPost(DocPara *)
+ {
+ indent_post();
+ printf("</para>\n");
+ }
+ void visitPre(DocRoot *)
+ {
+ indent_pre();
+ printf("<root>\n");
+ }
+ void visitPost(DocRoot *)
+ {
+ indent_post();
+ printf("</root>\n");
+ }
+ void visitPre(DocSimpleSect *s)
+ {
+ indent_pre();
+ printf("<simplesect type=");
+ switch(s->type())
+ {
+ case DocSimpleSect::See: printf("see"); break;
+ case DocSimpleSect::Return: printf("return"); break;
+ case DocSimpleSect::Author: printf("author"); break;
+ case DocSimpleSect::Authors: printf("authors"); break;
+ case DocSimpleSect::Version: printf("version"); break;
+ case DocSimpleSect::Since: printf("since"); break;
+ case DocSimpleSect::Date: printf("date"); break;
+ case DocSimpleSect::Note: printf("note"); break;
+ case DocSimpleSect::Warning: printf("warning"); break;
+ case DocSimpleSect::Pre: printf("pre"); break;
+ case DocSimpleSect::Post: printf("post"); break;
+ case DocSimpleSect::Invar: printf("invar"); break;
+ case DocSimpleSect::Remark: printf("remark"); break;
+ case DocSimpleSect::Attention: printf("attention"); break;
+ case DocSimpleSect::User: printf("user"); break;
+ case DocSimpleSect::Rcs: printf("rcs"); break;
+ case DocSimpleSect::Unknown: printf("unknown"); break;
+ }
+ printf(">\n");
+ }
+ void visitPost(DocSimpleSect *)
+ {
+ indent_post();
+ printf("</simplesect>\n");
+ }
+ void visitPre(DocTitle *)
+ {
+ indent_pre();
+ printf("<title>\n");
+ }
+ void visitPost(DocTitle *)
+ {
+ indent_post();
+ printf("</title>\n");
+ }
+ void visitPre(DocSimpleList *)
+ {
+ indent_pre();
+ printf("<ul>\n");
+ }
+ void visitPost(DocSimpleList *)
+ {
+ indent_post();
+ printf("</ul>\n");
+ }
+ void visitPre(DocSimpleListItem *)
+ {
+ indent_pre();
+ printf("<li>\n");
+ }
+ void visitPost(DocSimpleListItem *)
+ {
+ indent_post();
+ printf("</li>\n");
+ }
+ void visitPre(DocSection *s)
+ {
+ indent_pre();
+ printf("<sect%d>\n",s->level());
+ }
+ void visitPost(DocSection *s)
+ {
+ indent_post();
+ printf("</sect%d>\n",s->level());
+ }
+ void visitPre(DocHtmlList *s)
+ {
+ indent_pre();
+ if (s->type()==DocHtmlList::Ordered) printf("<ol>\n"); else printf("<ul>\n");
+ }
+ void visitPost(DocHtmlList *s)
+ {
+ indent_post();
+ if (s->type()==DocHtmlList::Ordered) printf("</ol>\n"); else printf("</ul>\n");
+ }
+ void visitPre(DocHtmlListItem *)
+ {
+ indent_pre();
+ printf("<li>\n");
+ }
+ void visitPost(DocHtmlListItem *)
+ {
+ indent_post();
+ printf("</li>\n");
+ }
+ //void visitPre(DocHtmlPre *)
+ //{
+ // indent_pre();
+ // printf("<pre>\n");
+ // m_insidePre=TRUE;
+ //}
+ //void visitPost(DocHtmlPre *)
+ //{
+ // m_insidePre=FALSE;
+ // indent_post();
+ // printf("</pre>\n");
+ //}
+ void visitPre(DocHtmlDescList *)
+ {
+ indent_pre();
+ printf("<dl>\n");
+ }
+ void visitPost(DocHtmlDescList *)
+ {
+ indent_post();
+ printf("</dl>\n");
+ }
+ void visitPre(DocHtmlDescTitle *)
+ {
+ indent_pre();
+ printf("<dt>\n");
+ }
+ void visitPost(DocHtmlDescTitle *)
+ {
+ indent_post();
+ printf("</dt>\n");
+ }
+ void visitPre(DocHtmlDescData *)
+ {
+ indent_pre();
+ printf("<dd>\n");
+ }
+ void visitPost(DocHtmlDescData *)
+ {
+ indent_post();
+ printf("</dd>\n");
+ }
+ void visitPre(DocHtmlTable *t)
+ {
+ indent_pre();
+ printf("<table rows=\"%d\" cols=\"%d\">\n",
+ t->numRows(),t->numCols());
+ }
+ void visitPost(DocHtmlTable *)
+ {
+ indent_post();
+ printf("</table>\n");
+ }
+ void visitPre(DocHtmlRow *)
+ {
+ indent_pre();
+ printf("<tr>\n");
+ }
+ void visitPost(DocHtmlRow *)
+ {
+ indent_post();
+ printf("</tr>\n");
+ }
+ void visitPre(DocHtmlCell *c)
+ {
+ indent_pre();
+ printf("<t%c>\n",c->isHeading()?'h':'d');
+ }
+ void visitPost(DocHtmlCell *c)
+ {
+ indent_post();
+ printf("</t%c>\n",c->isHeading()?'h':'d');
+ }
+ void visitPre(DocHtmlCaption *)
+ {
+ indent_pre();
+ printf("<caption>\n");
+ }
+ void visitPost(DocHtmlCaption *)
+ {
+ indent_post();
+ printf("</caption>\n");
+ }
+ void visitPre(DocInternal *)
+ {
+ indent_pre();
+ printf("<internal>\n");
+ }
+ void visitPost(DocInternal *)
+ {
+ indent_post();
+ printf("</internal>\n");
+ }
+ void visitPre(DocHRef *href)
+ {
+ indent_pre();
+ printf("<a url=\"%s\">\n",href->url().data());
+ }
+ void visitPost(DocHRef *)
+ {
+ indent_post();
+ printf("</a>\n");
+ }
+ void visitPre(DocHtmlHeader *header)
+ {
+ indent_pre();
+ printf("<h%d>\n",header->level());
+ }
+ void visitPost(DocHtmlHeader *header)
+ {
+ indent_post();
+ printf("</h%d>\n",header->level());
+ }
+ void visitPre(DocImage *img)
+ {
+ indent_pre();
+ printf("<image src=\"%s\" type=\"",img->name().data());
+ switch(img->type())
+ {
+ case DocImage::Html: printf("html"); break;
+ case DocImage::Latex: printf("latex"); break;
+ case DocImage::Rtf: printf("rtf"); break;
+ }
+ printf("\" width=%s height=%s>\n",img->width().data(),img->height().data());
+ }
+ void visitPost(DocImage *)
+ {
+ indent_post();
+ printf("</image>\n");
+ }
+ void visitPre(DocDotFile *df)
+ {
+ indent_pre();
+ printf("<dotfile src=\"%s\">\n",df->name().data());
+ }
+ void visitPost(DocDotFile *)
+ {
+ indent_post();
+ printf("</dotfile>\n");
+ }
+ void visitPre(DocMscFile *df)
+ {
+ indent_pre();
+ printf("<mscfile src=\"%s\">\n",df->name().data());
+ }
+ void visitPost(DocMscFile *)
+ {
+ indent_post();
+ printf("</mscfile>\n");
+ }
+ void visitPre(DocLink *lnk)
+ {
+ indent_pre();
+ printf("<link ref=\"%s\" file=\"%s\" anchor=\"%s\">\n",
+ lnk->ref().data(),lnk->file().data(),lnk->anchor().data());
+ }
+ void visitPost(DocLink *)
+ {
+ indent_post();
+ printf("</link>\n");
+ }
+ void visitPre(DocRef *ref)
+ {
+ indent_pre();
+ printf("<ref ref=\"%s\" file=\"%s\" "
+ "anchor=\"%s\" targetTitle=\"%s\""
+ " hasLinkText=\"%s\" refToAnchor=\"%s\" refToSection=\"%s\">\n",
+ ref->ref().data(),ref->file().data(),ref->anchor().data(),
+ ref->targetTitle().data(),ref->hasLinkText()?"yes":"no",
+ ref->refToAnchor()?"yes":"no", ref->refToSection()?"yes":"no");
+ }
+ void visitPost(DocRef *)
+ {
+ indent_post();
+ printf("</ref>\n");
+ }
+ void visitPre(DocSecRefItem *ref)
+ {
+ indent_pre();
+ printf("<secrefitem target=\"%s\">\n",ref->target().data());
+ }
+ void visitPost(DocSecRefItem *)
+ {
+ indent_post();
+ printf("</secrefitem>\n");
+ }
+ void visitPre(DocSecRefList *)
+ {
+ indent_pre();
+ printf("<secreflist>\n");
+ }
+ void visitPost(DocSecRefList *)
+ {
+ indent_post();
+ printf("</secreflist>\n");
+ }
+ //void visitPre(DocLanguage *l)
+ //{
+ // indent_pre();
+ // printf("<language id=%s>\n",l->id().data());
+ //}
+ //void visitPost(DocLanguage *)
+ //{
+ // indent_post();
+ // printf("</language>\n");
+ //}
+ void visitPre(DocParamList *pl)
+ {
+ indent_pre();
+ //QStrListIterator sli(pl->parameters());
+ QListIterator<DocNode> sli(pl->parameters());
+ //const char *s;
+ DocNode *param;
+ printf("<parameters>");
+ for (sli.toFirst();(param=sli.current());++sli)
+ {
+ printf("<param>");
+ if (param->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)param);
+ }
+ else if (param->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)param);
+ }
+ printf("</param>");
+ }
+ printf("\n");
+ }
+ void visitPost(DocParamList *)
+ {
+ indent_post();
+ printf("</parameters>\n");
+ }
+ void visitPre(DocParamSect *ps)
+ {
+ indent_pre();
+ printf("<paramsect type=");
+ switch (ps->type())
+ {
+ case DocParamSect::Param: printf("param"); break;
+ case DocParamSect::RetVal: printf("retval"); break;
+ case DocParamSect::Exception: printf("exception"); break;
+ case DocParamSect::TemplateParam: printf("templateparam"); break;
+ case DocParamSect::Unknown: printf("unknown"); break;
+ }
+ printf(">\n");
+ }
+ void visitPost(DocParamSect *)
+ {
+ indent_post();
+ printf("</paramsect>\n");
+ }
+ void visitPre(DocXRefItem *x)
+ {
+ indent_pre();
+ printf("<xrefitem file=\"%s\" anchor=\"%s\" title=\"%s\"/>\n",
+ x->file().data(),x->anchor().data(),x->title().data());
+ }
+ void visitPost(DocXRefItem *)
+ {
+ indent_post();
+ printf("<xrefitem/>\n");
+ }
+ void visitPre(DocInternalRef *r)
+ {
+ indent_pre();
+ printf("<internalref file=%s anchor=%s>\n",r->file().data(),r->anchor().data());
+ }
+ void visitPost(DocInternalRef *)
+ {
+ indent_post();
+ printf("</internalref>\n");
+ }
+ void visitPre(DocCopy *c)
+ {
+ indent_pre();
+ printf("<copy link=\"%s\">\n",c->link().data());
+ }
+ void visitPost(DocCopy *)
+ {
+ indent_post();
+ printf("</copy>\n");
+ }
+ void visitPre(DocText *)
+ {
+ indent_pre();
+ printf("<text>\n");
+ }
+ void visitPost(DocText *)
+ {
+ indent_post();
+ printf("</text>\n");
+ }
+
+ private:
+ // helper functions
+ void indent()
+ {
+ if (m_needsEnter) printf("\n");
+ for (int i=0;i<m_indent;i++) printf(".");
+ m_needsEnter=FALSE;
+ }
+ void indent_leaf()
+ {
+ if (!m_needsEnter) indent();
+ m_needsEnter=TRUE;
+ }
+ void indent_pre()
+ {
+ indent();
+ m_indent++;
+ }
+ void indent_post()
+ {
+ m_indent--;
+ indent();
+ }
+
+ // member variables
+ int m_indent;
+ bool m_needsEnter;
+ bool m_insidePre;
+};
+
+#endif
diff --git a/src/pycode.cpp b/src/pycode.cpp
new file mode 100644
index 0000000..3cc4f60
--- /dev/null
+++ b/src/pycode.cpp
@@ -0,0 +1,3811 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer pycodeYY_create_buffer
+#define yy_delete_buffer pycodeYY_delete_buffer
+#define yy_flex_debug pycodeYY_flex_debug
+#define yy_init_buffer pycodeYY_init_buffer
+#define yy_flush_buffer pycodeYY_flush_buffer
+#define yy_load_buffer_state pycodeYY_load_buffer_state
+#define yy_switch_to_buffer pycodeYY_switch_to_buffer
+#define yyin pycodeYYin
+#define yyleng pycodeYYleng
+#define yylex pycodeYYlex
+#define yylineno pycodeYYlineno
+#define yyout pycodeYYout
+#define yyrestart pycodeYYrestart
+#define yytext pycodeYYtext
+#define yywrap pycodeYYwrap
+#define yyalloc pycodeYYalloc
+#define yyrealloc pycodeYYrealloc
+#define yyfree pycodeYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE pycodeYYrestart(pycodeYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t pycodeYYleng;
+
+extern FILE *pycodeYYin, *pycodeYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up pycodeYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up pycodeYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via pycodeYYrestart()), so that the user can continue scanning by
+ * just pointing pycodeYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when pycodeYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t pycodeYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow pycodeYYwrap()'s to do buffer switches
+ * instead of setting up a fresh pycodeYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void pycodeYYrestart (FILE *input_file );
+void pycodeYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE pycodeYY_create_buffer (FILE *file,int size );
+void pycodeYY_delete_buffer (YY_BUFFER_STATE b );
+void pycodeYY_flush_buffer (YY_BUFFER_STATE b );
+void pycodeYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void pycodeYYpop_buffer_state (void );
+
+static void pycodeYYensure_buffer_stack (void );
+static void pycodeYY_load_buffer_state (void );
+static void pycodeYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER pycodeYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE pycodeYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE pycodeYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE pycodeYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *pycodeYYalloc (yy_size_t );
+void *pycodeYYrealloc (void *,yy_size_t );
+void pycodeYYfree (void * );
+
+#define yy_new_buffer pycodeYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ pycodeYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ pycodeYY_create_buffer(pycodeYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ pycodeYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ pycodeYY_create_buffer(pycodeYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define pycodeYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *pycodeYYin = (FILE *) 0, *pycodeYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int pycodeYYlineno;
+
+int pycodeYYlineno = 1;
+
+extern char *pycodeYYtext;
+#define yytext_ptr pycodeYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up pycodeYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ pycodeYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 57
+#define YY_END_OF_BUFFER 58
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[946] =
+ { 0,
+ 16412,16412, 58, 56, 57, 55, 56, 57, 54, 57,
+ 52, 56, 57, 53, 56, 57, 51, 56, 57, 56,
+ 57, 56, 57, 56, 57, 31, 54, 57, 17, 30,
+ 56, 57, 17, 30, 56, 57, 17, 30, 56, 57,
+ 17, 30, 56, 57, 17, 30, 56, 57, 17, 30,
+ 56, 57, 17, 30, 56, 57, 17, 30, 56, 57,
+ 17, 30, 56, 57, 17, 30, 56, 57, 17, 30,
+ 56, 57, 17, 30, 56, 57, 17, 30, 56, 57,
+ 17, 30, 56, 57, 17, 30, 56, 57, 17, 30,
+ 56, 57, 17, 30, 56, 57, 17, 30, 56, 57,
+
+ 17, 30, 56, 57, 17, 30, 56, 57, 17, 30,
+ 56, 57, 17, 30, 56, 57, 17, 30, 56, 57,
+ 17, 30, 56, 57, 55, 56, 57, 10, 56, 57,
+ 9, 56, 57, 9, 56, 57, 9, 56, 57, 9,
+ 56, 57, 12, 56, 57, 11, 55, 56, 57, 12,
+ 52, 56, 57, 12, 53, 56, 57, 12, 51, 56,
+ 57, 13, 56, 57, 11, 12, 56, 57, 14, 56,
+ 57, 12, 56, 57, 12, 56, 57, 12, 56, 57,
+ 12, 56, 57, 5, 56, 57, 5, 56, 57, 5,
+ 56, 57, 5, 56, 57, 6, 55, 56, 57, 6,
+
+ 56, 57, 8, 56, 57, 7, 56, 57, 7, 56,
+ 57, 7, 56, 57, 7, 56, 57, 29, 54, 57,
+ 17, 56, 57, 17, 56, 57, 17, 56, 57, 17,
+ 56, 57, 17, 56, 57, 17, 56, 57, 17, 56,
+ 57, 17, 56, 57, 17, 56, 57, 17, 56, 57,
+ 17, 56, 57, 17, 56, 57, 17, 56, 57, 17,
+ 56, 57, 17, 56, 57, 17, 56, 57, 17, 56,
+ 57, 17, 56, 57, 17, 56, 57, 17, 56, 57,
+ 17, 56, 57, 17, 56, 57, 17, 56, 57, 17,
+ 56, 57, 25, 55, 56, 57, 24, 54, 57, 18,
+
+ 55, 56, 57, 23, 54, 57, 22, 53, 56, 57,
+ 21, 56, 57, 21, 56, 57, 21, 56, 57, 21,
+ 56, 57, 21, 56, 57, 21, 56, 57, 21, 56,
+ 57, 21, 56, 57, 21, 56, 57, 21, 56, 57,
+ 21, 56, 57, 21, 56, 57, 21, 56, 57, 21,
+ 56, 57, 21, 56, 57, 21, 56, 57, 21, 56,
+ 57, 21, 56, 57, 21, 56, 57, 21, 56, 57,
+ 21, 56, 57, 21, 56, 57, 55, 56, 57,16410,
+ 27, 54, 57, 8220, 56, 57, 8220, 53, 56, 57,
+ 8220, 56, 57, 8220, 56, 57, 8220, 56, 57, 36,
+
+ 37, 56, 57, 36, 37, 55, 56, 57, 37, 52,
+ 56, 57, 36, 37, 53, 56, 57, 35, 37, 51,
+ 56, 57, 36, 37, 56, 57, 36, 37, 56, 57,
+ 37, 56, 57, 36, 37, 56, 57, 42, 43, 56,
+ 57, 42, 43, 55, 56, 57, 41, 43, 52, 56,
+ 57, 42, 43, 53, 56, 57, 43, 51, 56, 57,
+ 42, 43, 56, 57, 42, 43, 56, 57, 43, 56,
+ 57, 42, 43, 56, 57, 46, 48, 56, 57, 46,
+ 48, 55, 56, 57, 46, 47, 54, 57, 46, 48,
+ 52, 56, 57, 46, 48, 53, 56, 57, 46, 48,
+
+ 51, 56, 57, 46, 48, 56, 57, 46, 48, 56,
+ 57, 48, 56, 57, 46, 48, 56, 57, 55, 53,
+ 52, 51, 17, 30, 17, 30, 17, 30, 17, 30,
+ 17, 30, 17, 30, 15, 17, 30, 17, 30, 17,
+ 30, 17, 30, 17, 30, 17, 30, 17, 30, 17,
+ 30, 17, 30, 17, 30, 17, 30, 16, 17, 30,
+ 17, 30, 16, 17, 30, 17, 30, 17, 30, 17,
+ 30, 17, 30, 17, 30, 17, 30, 17, 30, 17,
+ 30, 17, 30, 17, 30, 55, 10, 9, 9, 12,
+ 11, 55, 12, 12, 53, 12, 12, 12, 52, 12,
+
+ 51, 12, 5, 5, 6, 55, 7, 7, 17, 17,
+ 17, 17, 17, 17, 15, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 16, 17, 17, 16,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 25, 55, 24, 18, 55, 22, 53, 21, 21,
+ 21, 21, 21, 19, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 20, 21, 21, 20, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 55,
+ 16410, 27, 8218, 36, 36, 55, 36, 53, 52, 36,
+ 33, 33, 32, 42, 42, 55, 42, 53, 51, 42,
+
+ 39, 39, 38, 46, 46, 55, 46, 46, 53, 53,
+ 46, 46, 50, 49, 17, 30, 17, 30, 17, 30,
+ 17, 30, 17, 30, 17, 30, 17, 30, 15, 17,
+ 30, 17, 30, 17, 30, 17, 30, 17, 30, 17,
+ 30, 17, 30, 17, 30, 17, 30, 17, 30, 17,
+ 30, 17, 30, 17, 30, 17, 30, 17, 30, 17,
+ 30, 12, 50, 12, 49, 17, 17, 17, 17, 17,
+ 17, 17, 15, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 21,
+ 21, 21, 21, 21, 21, 19, 21, 21, 21, 21,
+
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 34, 50, 40, 49, 44, 50, 45, 49, 17,
+ 30, 3, 17, 30, 15, 17, 30, 17, 30, 17,
+ 30, 17, 30, 17, 30, 1, 17, 30, 17, 30,
+ 17, 30, 17, 30, 17, 30, 17, 30, 17, 30,
+ 17, 30, 17, 30, 17, 30, 17, 30, 17, 3,
+ 17, 15, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 17, 30, 15, 17, 30, 17, 30,
+
+ 17, 30, 17, 30, 17, 30, 17, 30, 17, 30,
+ 17, 30, 17, 15, 17, 17, 17, 17, 17, 17,
+ 17, 17, 21, 21, 21, 21, 21, 21, 21, 21,
+ 2, 17, 30, 17, 30, 4, 17, 17, 21, 21,
+ 17, 30, 4, 17, 21
+ } ;
+
+static yyconst flex_int16_t yy_accept[498] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 4, 6, 9, 11, 14, 17, 20, 22, 24,
+ 26, 29, 33, 37, 41, 45, 49, 53, 57, 61,
+ 65, 69, 73, 77, 81, 85, 89, 93, 97, 101,
+ 105, 109, 113, 117, 121, 125, 128, 131, 134, 137,
+ 140, 143, 146, 150, 154, 158, 162, 165, 169, 172,
+ 175, 178, 181, 184, 187, 190, 193, 196, 200, 203,
+ 206, 209, 212, 215, 218, 221, 224, 227, 230, 233,
+
+ 236, 239, 242, 245, 248, 251, 254, 257, 260, 263,
+ 266, 269, 272, 275, 278, 281, 284, 287, 290, 293,
+ 297, 300, 304, 307, 311, 314, 317, 320, 323, 326,
+ 329, 332, 335, 338, 341, 344, 347, 350, 353, 356,
+ 359, 362, 365, 368, 371, 374, 377, 381, 384, 387,
+ 391, 394, 397, 400, 404, 409, 413, 418, 423, 427,
+ 431, 434, 438, 442, 447, 452, 457, 461, 465, 469,
+ 472, 476, 480, 485, 489, 494, 499, 504, 508, 512,
+ 515, 519, 520, 520, 521, 521, 522, 523, 523, 525,
+ 527, 529, 531, 533, 535, 538, 540, 542, 544, 546,
+
+ 548, 550, 552, 554, 556, 558, 561, 563, 566, 568,
+ 570, 572, 574, 576, 578, 580, 582, 584, 586, 587,
+ 588, 589, 590, 591, 593, 594, 596, 597, 598, 600,
+ 602, 603, 604, 605, 607, 608, 609, 610, 611, 612,
+ 613, 614, 615, 617, 618, 619, 620, 621, 622, 623,
+ 624, 625, 626, 627, 629, 630, 632, 633, 634, 635,
+ 636, 637, 638, 639, 640, 641, 642, 644, 645, 647,
+ 649, 650, 651, 652, 653, 654, 656, 657, 658, 659,
+ 660, 661, 662, 663, 664, 665, 666, 668, 669, 671,
+ 672, 673, 674, 675, 676, 677, 678, 679, 680, 682,
+
+ 683, 684, 685, 687, 687, 689, 690, 691, 692, 693,
+ 694, 695, 697, 699, 699, 700, 701, 702, 703, 704,
+ 705, 705, 707, 708, 710, 711, 712, 713, 714, 715,
+ 717, 719, 721, 723, 725, 727, 729, 732, 734, 736,
+ 738, 740, 742, 744, 746, 748, 750, 752, 754, 756,
+ 758, 760, 762, 764, 766, 767, 768, 769, 770, 771,
+ 772, 773, 775, 776, 777, 778, 779, 780, 781, 782,
+ 783, 784, 785, 786, 787, 788, 789, 790, 791, 792,
+ 793, 794, 795, 796, 798, 799, 800, 801, 802, 803,
+ 804, 805, 806, 807, 808, 809, 810, 811, 812, 814,
+
+ 814, 816, 816, 818, 820, 822, 825, 828, 830, 832,
+ 834, 836, 837, 839, 841, 843, 845, 847, 849, 851,
+ 853, 855, 857, 859, 860, 862, 864, 865, 866, 867,
+ 868, 869, 870, 871, 872, 873, 874, 875, 876, 877,
+ 878, 879, 880, 881, 882, 883, 884, 885, 886, 887,
+ 888, 889, 890, 891, 892, 893, 894, 896, 899, 901,
+ 903, 905, 907, 909, 911, 913, 913, 914, 916, 917,
+ 918, 919, 920, 921, 922, 923, 924, 925, 926, 927,
+ 928, 929, 930, 931, 932, 934, 936, 937, 938, 939,
+ 940, 941, 943, 944, 945, 946, 946
+
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 4, 5, 6, 1, 4, 4, 7, 8,
+ 9, 4, 4, 10, 4, 11, 4, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 13, 4, 4,
+ 4, 4, 1, 1, 14, 14, 14, 14, 14, 15,
+ 14, 14, 14, 14, 14, 14, 14, 16, 14, 14,
+ 14, 17, 14, 18, 19, 14, 14, 14, 14, 14,
+ 4, 20, 4, 1, 21, 4, 22, 23, 24, 25,
+
+ 26, 27, 28, 29, 30, 14, 31, 32, 33, 34,
+ 35, 36, 14, 37, 38, 39, 40, 14, 41, 42,
+ 43, 14, 4, 4, 4, 4, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[44] =
+ { 0,
+ 1, 2, 3, 4, 5, 4, 5, 2, 2, 4,
+ 4, 6, 2, 7, 7, 7, 7, 7, 7, 8,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7
+ } ;
+
+static yyconst flex_int16_t yy_base[524] =
+ { 0,
+ 0, 39, 79, 0, 122, 0, 165, 0, 208, 0,
+ 251, 0, 294, 0, 6, 8, 337, 0, 380, 420,
+ 0, 0, 0, 0, 459, 498, 537, 576, 615, 654,
+ 1136, 1137, 1133, 1137, 1129, 0, 1126, 7, 11, 15,
+ 1137, 0, 1110, 1096, 8, 1093, 16, 0, 1092, 4,
+ 1102, 15, 24, 1095, 33, 1104, 1090, 1087, 13, 383,
+ 1097, 1085, 387, 1092, 1090, 22, 1137, 0, 20, 391,
+ 395, 0, 1117, 1113, 60, 1110, 1137, 0, 1137, 694,
+ 714, 12, 14, 0, 58, 396, 431, 1114, 1137, 1137,
+ 0, 65, 435, 436, 1137, 0, 1093, 1079, 70, 1076,
+
+ 470, 40, 1075, 375, 1085, 374, 354, 1078, 417, 1087,
+ 1073, 1070, 392, 462, 1080, 1068, 475, 1075, 1073, 416,
+ 1137, 1100, 1137, 0, 0, 1079, 388, 1063, 476, 377,
+ 1062, 399, 1072, 403, 419, 1065, 464, 1074, 1060, 1057,
+ 437, 501, 1056, 504, 1063, 1061, 444, 1137, 1137, 0,
+ 509, 515, 529, 0, 1088, 1084, 540, 1081, 519, 548,
+ 468, 554, 0, 1085, 1081, 543, 1078, 523, 563, 483,
+ 582, 1064, 517, 1063, 1077, 581, 1074, 544, 587, 526,
+ 621, 1078, 1074, 0, 1071, 1072, 1069, 562, 0, 1043,
+ 1040, 1033, 568, 1047, 1033, 1044, 1047, 1034, 1040, 560,
+
+ 1042, 1031, 1027, 1028, 1027, 0, 1025, 0, 1027, 1020,
+ 1020, 1027, 1026, 1016, 1022, 1010, 1022, 1025, 487, 1137,
+ 0, 598, 0, 1048, 1044, 631, 1041, 601, 1042, 1039,
+ 0, 0, 604, 1043, 0, 605, 0, 1012, 1009, 1002,
+ 618, 1016, 1002, 1013, 1016, 1003, 1009, 599, 1011, 1000,
+ 996, 997, 996, 0, 994, 0, 996, 989, 989, 996,
+ 995, 985, 991, 979, 991, 994, 612, 1137, 1017, 0,
+ 0, 986, 977, 638, 991, 977, 988, 991, 978, 984,
+ 612, 986, 975, 971, 972, 971, 0, 969, 0, 971,
+ 964, 964, 971, 970, 960, 955, 967, 970, 628, 1137,
+
+ 1137, 0, 993, 989, 642, 988, 641, 1137, 651, 1137,
+ 0, 990, 658, 984, 983, 659, 1137, 665, 1137, 969,
+ 672, 556, 983, 677, 984, 979, 665, 1137, 1137, 947,
+ 958, 957, 956, 959, 942, 940, 976, 950, 950, 949,
+ 952, 940, 949, 936, 947, 931, 934, 929, 926, 938,
+ 932, 931, 0, 0, 924, 935, 934, 933, 936, 919,
+ 917, 953, 927, 927, 926, 929, 917, 926, 913, 924,
+ 908, 911, 906, 903, 915, 909, 908, 901, 912, 911,
+ 914, 897, 895, 0, 906, 906, 905, 908, 896, 905,
+ 892, 903, 887, 890, 885, 882, 889, 888, 1137, 684,
+
+ 1137, 686, 1137, 1137, 893, 0, 0, 881, 886, 878,
+ 885, 912, 877, 880, 889, 873, 884, 869, 881, 869,
+ 894, 878, 878, 876, 0, 0, 864, 869, 861, 868,
+ 848, 834, 839, 822, 818, 799, 810, 793, 808, 779,
+ 779, 771, 752, 757, 739, 703, 696, 699, 708, 692,
+ 703, 688, 700, 686, 696, 692, 677, 711, 678, 672,
+ 678, 677, 669, 685, 672, 0, 664, 700, 662, 654,
+ 660, 658, 644, 659, 642, 630, 617, 597, 595, 570,
+ 558, 550, 528, 523, 470, 451, 0, 450, 420, 418,
+ 387, 38, 0, 29, 17, 1137, 734, 742, 750, 758,
+
+ 766, 774, 777, 779, 786, 794, 802, 805, 807, 809,
+ 816, 819, 825, 833, 840, 848, 856, 863, 871, 879,
+ 887, 19, 890
+ } ;
+
+static yyconst flex_int16_t yy_def[524] =
+ { 0,
+ 497, 497, 496, 3, 496, 5, 496, 7, 496, 9,
+ 496, 11, 496, 13, 2, 2, 496, 17, 498, 498,
+ 2, 2, 2, 2, 499, 499, 500, 500, 501, 501,
+ 496, 496, 496, 496, 496, 502, 496, 496, 496, 496,
+ 496, 503, 503, 503, 503, 503, 503, 503, 503, 503,
+ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503,
+ 503, 503, 503, 503, 503, 496, 496, 504, 504, 504,
+ 504, 505, 496, 505, 506, 505, 496, 505, 496, 507,
+ 507, 81, 81, 508, 508, 508, 508, 496, 496, 496,
+ 509, 509, 509, 509, 496, 510, 510, 510, 510, 510,
+
+ 510, 510, 510, 510, 510, 510, 510, 510, 510, 510,
+ 510, 510, 510, 510, 510, 510, 510, 510, 510, 496,
+ 496, 496, 496, 511, 512, 512, 512, 512, 512, 512,
+ 512, 512, 512, 512, 512, 512, 512, 512, 512, 512,
+ 512, 512, 512, 512, 512, 512, 513, 496, 496, 502,
+ 496, 496, 496, 514, 514, 496, 515, 496, 514, 514,
+ 516, 514, 517, 517, 496, 518, 496, 517, 517, 519,
+ 517, 520, 520, 520, 496, 521, 496, 520, 520, 520,
+ 520, 496, 496, 502, 496, 496, 496, 496, 503, 503,
+ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503,
+
+ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503,
+ 503, 503, 503, 503, 503, 503, 503, 503, 496, 496,
+ 504, 504, 505, 496, 505, 506, 505, 81, 505, 505,
+ 81, 508, 508, 496, 509, 509, 510, 510, 510, 510,
+ 510, 510, 510, 510, 510, 510, 510, 510, 510, 510,
+ 510, 510, 510, 510, 510, 510, 510, 510, 510, 510,
+ 510, 510, 510, 510, 510, 510, 496, 496, 496, 511,
+ 512, 512, 512, 512, 512, 512, 512, 512, 512, 512,
+ 512, 512, 512, 512, 512, 512, 512, 512, 512, 512,
+ 512, 512, 512, 512, 512, 512, 512, 512, 513, 496,
+
+ 496, 514, 514, 496, 515, 496, 514, 496, 496, 496,
+ 517, 517, 518, 496, 496, 517, 496, 496, 496, 520,
+ 520, 520, 496, 521, 521, 496, 520, 496, 496, 503,
+ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503,
+ 503, 503, 503, 503, 503, 503, 503, 503, 503, 503,
+ 503, 503, 505, 505, 510, 510, 510, 510, 510, 510,
+ 510, 510, 510, 510, 510, 510, 510, 510, 510, 510,
+ 510, 510, 510, 510, 510, 510, 510, 512, 512, 512,
+ 512, 512, 512, 512, 512, 512, 512, 512, 512, 512,
+ 512, 512, 512, 512, 512, 512, 512, 512, 496, 496,
+
+ 496, 496, 496, 496, 503, 503, 503, 503, 503, 503,
+ 503, 496, 503, 503, 503, 503, 503, 503, 503, 503,
+ 503, 503, 503, 510, 510, 510, 510, 510, 510, 510,
+ 510, 510, 510, 510, 510, 510, 510, 510, 510, 510,
+ 510, 512, 512, 512, 512, 512, 512, 512, 512, 512,
+ 512, 512, 512, 512, 512, 512, 503, 503, 503, 503,
+ 503, 503, 503, 503, 503, 522, 510, 510, 510, 510,
+ 510, 510, 510, 510, 510, 512, 512, 512, 512, 512,
+ 512, 512, 512, 496, 503, 503, 523, 510, 510, 512,
+ 512, 503, 523, 510, 512, 0, 496, 496, 496, 496,
+
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
+ 496, 496, 496
+ } ;
+
+static yyconst flex_int16_t yy_nxt[1181] =
+ { 0,
+ 496, 33, 34, 496, 35, 36, 37, 120, 121, 120,
+ 121, 186, 186, 187, 187, 186, 38, 187, 39, 186,
+ 186, 187, 187, 219, 186, 487, 187, 188, 231, 220,
+ 231, 188, 193, 194, 211, 197, 38, 195, 198, 40,
+ 33, 34, 289, 35, 36, 37, 200, 188, 231, 212,
+ 231, 188, 193, 202, 256, 38, 201, 39, 203, 206,
+ 204, 184, 186, 208, 187, 207, 208, 184, 184, 186,
+ 208, 187, 184, 242, 186, 38, 187, 243, 40, 32,
+ 33, 41, 32, 35, 36, 37, 32, 32, 32, 32,
+ 32, 32, 42, 43, 44, 45, 46, 47, 32, 42,
+
+ 48, 49, 50, 51, 52, 53, 54, 42, 55, 42,
+ 56, 42, 57, 58, 59, 60, 61, 62, 63, 64,
+ 42, 65, 32, 66, 34, 32, 35, 36, 37, 67,
+ 32, 32, 32, 32, 32, 68, 68, 68, 69, 68,
+ 70, 32, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 69, 68,
+ 68, 71, 68, 68, 68, 72, 73, 34, 72, 74,
+ 75, 76, 32, 77, 78, 72, 72, 79, 80, 80,
+ 80, 81, 80, 82, 72, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+
+ 80, 81, 80, 80, 83, 80, 80, 80, 32, 33,
+ 34, 32, 35, 36, 37, 32, 32, 32, 32, 32,
+ 32, 84, 84, 84, 85, 84, 86, 32, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 85, 84, 84, 87, 84, 84,
+ 84, 32, 88, 34, 32, 35, 36, 37, 89, 89,
+ 89, 32, 32, 90, 91, 91, 91, 92, 91, 93,
+ 32, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 92, 91, 91,
+ 94, 91, 91, 91, 32, 33, 95, 32, 35, 36,
+
+ 37, 32, 32, 32, 32, 32, 32, 96, 97, 98,
+ 99, 100, 101, 32, 96, 102, 103, 104, 105, 106,
+ 107, 108, 96, 109, 96, 110, 96, 111, 112, 113,
+ 114, 115, 116, 117, 118, 96, 119, 32, 122, 123,
+ 32, 35, 124, 37, 32, 32, 32, 32, 32, 32,
+ 125, 126, 125, 127, 128, 129, 32, 125, 130, 131,
+ 132, 133, 134, 135, 136, 125, 137, 125, 138, 125,
+ 139, 140, 141, 142, 125, 143, 144, 145, 125, 146,
+ 32, 147, 148, 250, 35, 150, 37, 186, 251, 187,
+ 252, 186, 186, 187, 187, 186, 151, 187, 152, 186,
+
+ 186, 187, 187, 193, 213, 248, 245, 222, 214, 246,
+ 275, 222, 233, 259, 276, 249, 151, 267, 268, 153,
+ 32, 147, 148, 193, 35, 150, 37, 222, 260, 289,
+ 278, 222, 233, 279, 281, 186, 151, 187, 152, 186,
+ 186, 187, 187, 254, 282, 299, 300, 233, 283, 255,
+ 256, 236, 236, 284, 256, 285, 151, 495, 292, 153,
+ 155, 34, 256, 156, 157, 158, 186, 233, 187, 309,
+ 310, 236, 236, 293, 186, 159, 187, 160, 161, 186,
+ 186, 187, 187, 261, 318, 319, 241, 262, 219, 494,
+ 287, 241, 274, 208, 220, 159, 288, 289, 162, 155,
+
+ 34, 289, 156, 157, 158, 186, 241, 187, 186, 492,
+ 187, 241, 274, 186, 159, 187, 160, 161, 322, 186,
+ 274, 187, 294, 306, 484, 187, 295, 186, 496, 315,
+ 320, 188, 320, 186, 159, 187, 321, 162, 164, 34,
+ 274, 165, 166, 167, 184, 188, 184, 184, 186, 184,
+ 187, 188, 306, 168, 187, 169, 170, 322, 306, 184,
+ 187, 289, 184, 321, 307, 188, 186, 186, 187, 315,
+ 307, 384, 186, 168, 187, 321, 171, 164, 34, 316,
+ 165, 166, 167, 320, 307, 184, 186, 184, 315, 338,
+ 307, 186, 168, 187, 169, 170, 384, 339, 316, 316,
+
+ 325, 384, 186, 327, 187, 223, 321, 223, 186, 186,
+ 187, 187, 168, 267, 268, 171, 173, 174, 316, 175,
+ 176, 177, 186, 327, 187, 186, 491, 187, 363, 299,
+ 300, 178, 184, 179, 180, 289, 364, 327, 184, 184,
+ 321, 385, 186, 184, 187, 306, 184, 187, 184, 386,
+ 490, 178, 400, 310, 181, 173, 174, 327, 175, 176,
+ 177, 184, 184, 186, 184, 315, 402, 319, 384, 186,
+ 178, 187, 179, 180, 496, 256, 320, 184, 320, 320,
+ 426, 184, 426, 184, 321, 400, 310, 402, 319, 426,
+ 178, 489, 256, 181, 223, 488, 325, 223, 223, 223,
+
+ 223, 484, 426, 223, 223, 208, 407, 407, 407, 486,
+ 208, 485, 484, 223, 223, 407, 289, 223, 229, 223,
+ 230, 289, 483, 223, 223, 289, 289, 482, 481, 480,
+ 479, 478, 477, 223, 32, 32, 32, 32, 32, 32,
+ 32, 32, 149, 149, 149, 149, 149, 149, 149, 149,
+ 154, 154, 154, 154, 154, 154, 154, 154, 163, 163,
+ 163, 163, 163, 163, 163, 163, 172, 172, 172, 172,
+ 172, 172, 172, 172, 184, 184, 384, 184, 184, 184,
+ 184, 184, 189, 189, 221, 221, 223, 289, 476, 223,
+ 223, 223, 223, 223, 226, 226, 384, 226, 226, 226,
+
+ 226, 226, 228, 256, 256, 228, 228, 228, 228, 228,
+ 232, 232, 235, 235, 237, 237, 270, 270, 466, 270,
+ 270, 270, 270, 270, 271, 271, 301, 301, 301, 475,
+ 301, 301, 301, 302, 302, 256, 302, 256, 302, 302,
+ 305, 305, 474, 305, 305, 305, 305, 305, 308, 308,
+ 308, 308, 308, 308, 308, 308, 311, 311, 473, 311,
+ 472, 311, 311, 313, 313, 471, 313, 313, 313, 313,
+ 313, 317, 317, 317, 317, 317, 317, 317, 317, 320,
+ 320, 320, 320, 470, 320, 320, 320, 324, 324, 324,
+ 324, 324, 324, 324, 324, 493, 493, 469, 468, 256,
+
+ 467, 426, 208, 208, 466, 465, 208, 208, 464, 463,
+ 462, 461, 460, 412, 459, 458, 208, 457, 407, 456,
+ 455, 454, 453, 452, 289, 451, 450, 449, 384, 448,
+ 447, 289, 289, 446, 445, 444, 443, 384, 442, 441,
+ 440, 439, 438, 437, 436, 256, 435, 434, 433, 426,
+ 432, 431, 256, 256, 412, 430, 429, 428, 427, 426,
+ 425, 424, 423, 422, 421, 420, 419, 418, 208, 417,
+ 416, 415, 407, 414, 413, 208, 208, 412, 411, 410,
+ 409, 408, 407, 406, 405, 404, 496, 403, 321, 314,
+ 401, 312, 304, 399, 303, 398, 397, 289, 396, 395,
+
+ 394, 393, 289, 392, 391, 390, 389, 289, 388, 387,
+ 384, 383, 382, 381, 380, 289, 379, 378, 269, 377,
+ 376, 256, 375, 374, 373, 372, 371, 256, 370, 369,
+ 368, 367, 256, 366, 365, 362, 361, 360, 359, 358,
+ 256, 357, 356, 355, 234, 227, 225, 354, 353, 224,
+ 352, 351, 208, 350, 349, 348, 347, 346, 208, 345,
+ 344, 343, 342, 208, 341, 340, 337, 336, 335, 334,
+ 333, 208, 332, 331, 330, 185, 183, 329, 328, 182,
+ 326, 323, 321, 321, 314, 183, 312, 185, 304, 303,
+ 298, 297, 296, 289, 291, 290, 286, 280, 277, 273,
+
+ 272, 269, 266, 265, 264, 263, 256, 258, 257, 253,
+ 247, 244, 240, 239, 238, 234, 227, 225, 224, 218,
+ 217, 216, 215, 208, 210, 209, 205, 199, 196, 192,
+ 191, 190, 185, 183, 182, 496, 31, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496
+ } ;
+
+static yyconst flex_int16_t yy_chk[1181] =
+ { 0,
+ 0, 1, 1, 0, 1, 1, 1, 15, 15, 16,
+ 16, 38, 45, 38, 45, 39, 1, 39, 1, 40,
+ 47, 40, 47, 66, 69, 522, 69, 39, 82, 66,
+ 83, 40, 47, 48, 59, 50, 1, 48, 50, 1,
+ 2, 2, 495, 2, 2, 2, 52, 39, 82, 59,
+ 83, 40, 47, 53, 494, 2, 52, 2, 53, 55,
+ 53, 75, 85, 492, 85, 55, 55, 75, 75, 92,
+ 55, 92, 75, 102, 99, 2, 99, 102, 2, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 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, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+
+ 7, 7, 7, 7, 7, 7, 7, 7, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 13, 13, 13, 13, 13, 13,
+
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 19, 19, 19, 107, 19, 19, 19, 60, 107, 60,
+ 107, 63, 127, 63, 127, 70, 19, 70, 19, 71,
+
+ 86, 71, 86, 63, 60, 106, 104, 70, 60, 104,
+ 130, 71, 86, 113, 130, 106, 19, 120, 120, 19,
+ 20, 20, 20, 63, 20, 20, 20, 70, 113, 491,
+ 132, 71, 86, 132, 134, 87, 20, 87, 20, 93,
+ 94, 93, 94, 109, 134, 147, 147, 87, 135, 109,
+ 109, 93, 94, 135, 109, 135, 20, 490, 141, 20,
+ 25, 25, 489, 25, 25, 25, 114, 87, 114, 161,
+ 161, 93, 94, 141, 101, 25, 101, 25, 25, 117,
+ 129, 117, 129, 114, 170, 170, 101, 114, 219, 488,
+ 137, 117, 129, 486, 219, 25, 137, 137, 25, 26,
+
+ 26, 137, 26, 26, 26, 142, 101, 142, 144, 485,
+ 144, 117, 129, 151, 26, 151, 26, 26, 173, 152,
+ 144, 152, 142, 159, 484, 159, 142, 168, 180, 168,
+ 180, 152, 180, 153, 26, 153, 173, 26, 27, 27,
+ 144, 27, 27, 27, 157, 153, 157, 166, 178, 166,
+ 178, 152, 160, 27, 160, 27, 27, 322, 162, 157,
+ 162, 483, 166, 178, 160, 153, 188, 169, 188, 169,
+ 162, 482, 193, 27, 193, 322, 27, 28, 28, 169,
+ 28, 28, 28, 176, 160, 176, 171, 176, 171, 200,
+ 162, 179, 28, 179, 28, 28, 481, 200, 171, 169,
+
+ 176, 480, 222, 179, 222, 228, 179, 228, 233, 236,
+ 233, 236, 28, 267, 267, 28, 29, 29, 171, 29,
+ 29, 29, 241, 179, 241, 181, 479, 181, 248, 299,
+ 299, 29, 226, 29, 29, 478, 248, 181, 226, 226,
+ 181, 281, 274, 226, 274, 307, 305, 307, 305, 281,
+ 477, 29, 309, 309, 29, 30, 30, 181, 30, 30,
+ 30, 305, 313, 316, 313, 316, 318, 318, 476, 327,
+ 30, 327, 30, 30, 321, 475, 321, 313, 321, 324,
+ 474, 324, 473, 324, 327, 400, 400, 402, 402, 472,
+ 30, 471, 470, 30, 80, 469, 324, 80, 80, 80,
+
+ 80, 468, 467, 80, 80, 465, 464, 463, 462, 461,
+ 460, 459, 458, 80, 81, 457, 456, 81, 81, 81,
+ 81, 455, 454, 81, 81, 453, 452, 451, 450, 449,
+ 448, 447, 446, 81, 497, 497, 497, 497, 497, 497,
+ 497, 497, 498, 498, 498, 498, 498, 498, 498, 498,
+ 499, 499, 499, 499, 499, 499, 499, 499, 500, 500,
+ 500, 500, 500, 500, 500, 500, 501, 501, 501, 501,
+ 501, 501, 501, 501, 502, 502, 445, 502, 502, 502,
+ 502, 502, 503, 503, 504, 504, 505, 444, 443, 505,
+ 505, 505, 505, 505, 506, 506, 442, 506, 506, 506,
+
+ 506, 506, 507, 441, 440, 507, 507, 507, 507, 507,
+ 508, 508, 509, 509, 510, 510, 511, 511, 439, 511,
+ 511, 511, 511, 511, 512, 512, 513, 513, 513, 438,
+ 513, 513, 513, 514, 514, 437, 514, 436, 514, 514,
+ 515, 515, 435, 515, 515, 515, 515, 515, 516, 516,
+ 516, 516, 516, 516, 516, 516, 517, 517, 434, 517,
+ 433, 517, 517, 518, 518, 432, 518, 518, 518, 518,
+ 518, 519, 519, 519, 519, 519, 519, 519, 519, 520,
+ 520, 520, 520, 431, 520, 520, 520, 521, 521, 521,
+ 521, 521, 521, 521, 521, 523, 523, 430, 429, 428,
+
+ 427, 424, 423, 422, 421, 420, 419, 418, 417, 416,
+ 415, 414, 413, 412, 411, 410, 409, 408, 405, 398,
+ 397, 396, 395, 394, 393, 392, 391, 390, 389, 388,
+ 387, 386, 385, 383, 382, 381, 380, 379, 378, 377,
+ 376, 375, 374, 373, 372, 371, 370, 369, 368, 367,
+ 366, 365, 364, 363, 362, 361, 360, 359, 358, 357,
+ 356, 355, 352, 351, 350, 349, 348, 347, 346, 345,
+ 344, 343, 342, 341, 340, 339, 338, 337, 336, 335,
+ 334, 333, 332, 331, 330, 326, 325, 323, 320, 315,
+ 314, 312, 306, 304, 303, 298, 297, 296, 295, 294,
+
+ 293, 292, 291, 290, 288, 286, 285, 284, 283, 282,
+ 280, 279, 278, 277, 276, 275, 273, 272, 269, 266,
+ 265, 264, 263, 262, 261, 260, 259, 258, 257, 255,
+ 253, 252, 251, 250, 249, 247, 246, 245, 244, 243,
+ 242, 240, 239, 238, 234, 230, 229, 227, 225, 224,
+ 218, 217, 216, 215, 214, 213, 212, 211, 210, 209,
+ 207, 205, 204, 203, 202, 201, 199, 198, 197, 196,
+ 195, 194, 192, 191, 190, 187, 186, 185, 183, 182,
+ 177, 175, 174, 172, 167, 165, 164, 158, 156, 155,
+ 146, 145, 143, 140, 139, 138, 136, 133, 131, 128,
+
+ 126, 122, 119, 118, 116, 115, 112, 111, 110, 108,
+ 105, 103, 100, 98, 97, 88, 76, 74, 73, 65,
+ 64, 62, 61, 58, 57, 56, 54, 51, 49, 46,
+ 44, 43, 37, 35, 33, 31, 496, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
+ 496, 496, 496, 496, 496, 496, 496, 496, 496, 496
+ } ;
+
+extern int pycodeYY_flex_debug;
+int pycodeYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up pycodeYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *pycodeYYtext;
+#line 1 "pycode.l"
+/******************************************************************************
+ *
+ * $Id: pycode.h,v 1.9 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/* This code is based on the work done by the MoxyPyDoxy team
+ * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
+ * in Spring 2005 as part of CS 179E: Compiler Design Project
+ * at the University of California, Riverside; the course was
+ * taught by Peter H. Froehlich <phf@acm.org>.
+ */
+#line 26 "pycode.l"
+
+#include <stdio.h>
+#include <qvaluestack.h>
+
+#include "pycode.h"
+#include "message.h"
+
+#include "scanner.h"
+#include "entry.h"
+#include "doxygen.h"
+#include "outputlist.h"
+#include "util.h"
+#include "membername.h"
+#include "searchindex.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+static ClassSDict g_codeClassSDict(17);
+static QCString g_curClassName;
+static QStrList g_curClassBases;
+
+
+static CodeOutputInterface * g_code;
+static const char * g_inputString; //!< the code fragment as text
+static int g_inputPosition; //!< read offset during parsing
+static const char * g_currentFontClass;
+static bool g_needsTermination;
+static int g_inputLines; //!< number of line in the code fragment
+static int g_yyLineNr; //!< current line number
+static FileDef * g_sourceFileDef;
+static Definition * g_currentDefinition;
+static MemberDef * g_currentMemberDef;
+static bool g_includeCodeFragment;
+static QCString g_realScope;
+static bool g_insideBody;
+static int g_bodyCurlyCount;
+static bool g_searchingForBody;
+static QCString g_classScope;
+static int g_paramParens;
+//static int g_anchorCount;
+
+static bool g_exampleBlock;
+static QCString g_exampleName;
+static QCString g_exampleFile;
+
+static QCString g_type;
+static QCString g_name;
+
+static bool g_doubleStringIsDoc;
+static bool g_doubleQuote;
+static bool g_noSuiteFound;
+static int g_stringContext;
+
+static QValueStack<uint> g_indents; //!< Tracks indentation levels for scoping in python
+
+static void endFontClass();
+static void adjustScopesAndSuites(unsigned indentLength);
+
+
+/*! Represents a stack of variable to class mappings as found in the
+ * code. Each scope is enclosed in pushScope() and popScope() calls.
+ * Variables are added by calling addVariables() and one can search
+ * for variable using findVariable().
+ */
+class PyVariableContext
+{
+ public:
+ static const ClassDef *dummyContext;
+ class Scope : public SDict<ClassDef>
+ {
+ public:
+ Scope() : SDict<ClassDef>(17) {}
+ };
+
+ PyVariableContext()
+ {
+ m_scopes.setAutoDelete(TRUE);
+ }
+
+ virtual ~PyVariableContext()
+ {
+ }
+
+ void pushScope()
+ {
+ m_scopes.append(new Scope);
+ }
+
+ void popScope()
+ {
+ if (m_scopes.count()>0)
+ {
+ m_scopes.remove(m_scopes.count()-1);
+ }
+ }
+
+ void clear()
+ {
+ m_scopes.clear();
+ m_globalScope.clear();
+ }
+
+ void clearExceptGlobal()
+ {
+ m_scopes.clear();
+ }
+
+ void addVariable(const QCString &type,const QCString &name);
+ ClassDef *findVariable(const QCString &name);
+
+ private:
+ Scope m_globalScope;
+ QList<Scope> m_scopes;
+};
+
+void PyVariableContext::addVariable(const QCString &type,const QCString &name)
+{
+ //printf("PyVariableContext::addVariable(%s,%s)\n",type.data(),name.data());
+ QCString ltype = type.simplifyWhiteSpace();
+ QCString lname = name.simplifyWhiteSpace();
+
+ Scope *scope = m_scopes.count()==0 ? &m_globalScope : m_scopes.getLast();
+ ClassDef *varType;
+ if (
+ (varType=g_codeClassSDict[ltype]) || // look for class definitions inside the code block
+ (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,ltype)) // look for global class definitions
+ )
+ {
+ scope->append(lname,varType); // add it to a list
+ }
+ else
+ {
+ if (m_scopes.count()>0) // for local variables add a dummy entry so the name
+ // is hidden to avoid FALSE links to global variables with the same name
+ // TODO: make this work for namespaces as well!
+ {
+ scope->append(lname,dummyContext);
+ }
+ }
+}
+
+ClassDef *PyVariableContext::findVariable(const QCString &name)
+{
+ if (name.isEmpty()) return 0;
+ ClassDef *result = 0;
+ QListIterator<Scope> sli(m_scopes);
+ Scope *scope;
+ // search from inner to outer scope
+ for (sli.toLast();(scope=sli.current());--sli)
+ {
+ result = scope->find(name);
+ if (result)
+ {
+ return result;
+ }
+ }
+ // nothing found -> also try the global scope
+ result=m_globalScope.find(name);
+ return result;
+}
+
+static PyVariableContext g_theVarContext;
+const ClassDef *PyVariableContext::dummyContext = (ClassDef*)0x8;
+
+class PyCallContext
+{
+ public:
+ struct Ctx
+ {
+ Ctx() : name(g_name), type(g_type), cd(0) {}
+ QCString name;
+ QCString type;
+ ClassDef *cd;
+ };
+
+ PyCallContext()
+ {
+ m_classList.append(new Ctx);
+ m_classList.setAutoDelete(TRUE);
+ }
+
+ virtual ~PyCallContext() {}
+
+ void setClass(ClassDef *cd)
+ {
+ Ctx *ctx = m_classList.getLast();
+ if (ctx)
+ {
+ ctx->cd=cd;
+ }
+ }
+ void pushScope()
+ {
+ m_classList.append(new Ctx);
+ }
+
+ void popScope()
+ {
+ if (m_classList.count()>1)
+ {
+ Ctx *ctx = m_classList.getLast();
+ if (ctx)
+ {
+ g_name = ctx->name;
+ g_type = ctx->type;
+ }
+ m_classList.removeLast();
+ }
+ else
+ {
+ }
+ }
+
+ void clear()
+ {
+ m_classList.clear();
+ m_classList.append(new Ctx);
+ }
+
+ ClassDef *getClass() const
+ {
+ Ctx *ctx = m_classList.getLast();
+
+ if (ctx)
+ return ctx->cd;
+ else
+ return 0;
+ }
+
+ private:
+ QList<Ctx> m_classList;
+};
+
+static PyCallContext g_theCallContext;
+
+
+/*! counts the number of lines in the input */
+static int countLines()
+{
+ const char *p=g_inputString;
+ char c;
+ int count=1;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
+ }
+ if (p>g_inputString && *(p-1)!='\n')
+ { // last line does not end with a \n, so we add an extra
+ // line and explicitly terminate the line after parsing.
+ count++,
+ g_needsTermination=TRUE;
+ }
+ return count;
+}
+
+static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
+ }
+}
+
+static void addToSearchIndex(const char *text)
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->addWord(text,FALSE);
+ }
+}
+
+
+static ClassDef *stripClassName(const char *s)
+{
+ int pos=0;
+ QCString type = s;
+ QCString className;
+ QCString templSpec;
+ while (extractClassNameFromType(type,pos,className,templSpec)!=-1)
+ {
+ QCString clName=className+templSpec;
+
+ ClassDef *cd=0;
+ if (!g_classScope.isEmpty())
+ {
+ cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope+"::"+clName);
+ }
+ if (cd==0)
+ {
+ cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,clName);
+ }
+ if (cd)
+ {
+ return cd;
+ }
+ }
+
+ return 0;
+}
+
+
+
+/*! start a new line of code, inserting a line number if g_sourceFileDef
+ * is TRUE. If a definition starts at the current line, then the line
+ * number is linked to the documentation of that definition.
+ */
+static void startCodeLine()
+{
+ //if (g_currentFontClass) { g_code->endFontClass(); }
+ if (g_sourceFileDef)
+ {
+ //QCString lineNumber,lineAnchor;
+ //lineNumber.sprintf("%05d",g_yyLineNr);
+ //lineAnchor.sprintf("l%05d",g_yyLineNr);
+
+ Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
+ //printf("startCodeLine %d d=%p\n",g_yyLineNr,d);
+ //g_code->startLineNumber();
+ if (!g_includeCodeFragment && d && d->isLinkableInProject())
+ {
+ g_currentDefinition = d;
+ g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
+ g_insideBody = FALSE;
+ g_searchingForBody = TRUE;
+ g_realScope = d->name().copy();
+ g_classScope = d->name().copy();
+ //printf("Real scope: `%s'\n",g_realScope.data());
+ g_bodyCurlyCount = 0;
+ QCString lineAnchor;
+ lineAnchor.sprintf("l%05d",g_yyLineNr);
+ if (g_currentMemberDef)
+ {
+ g_code->writeLineNumber(g_currentMemberDef->getReference(),
+ g_currentMemberDef->getOutputFileBase(),
+ g_currentMemberDef->anchor(),g_yyLineNr);
+ setCurrentDoc(
+ g_currentMemberDef->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ else
+ {
+ g_code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,g_yyLineNr);
+ setCurrentDoc(
+ d->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ }
+ else
+ {
+ //g_code->codify(lineNumber);
+ g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ }
+ //g_code->endLineNumber();
+ }
+ g_code->startCodeLine();
+ if (g_currentFontClass)
+ {
+ g_code->startFontClass(g_currentFontClass);
+ }
+}
+
+static void codify(const char* text)
+{
+ g_code->codify(text);
+}
+
+static void endCodeLine()
+{
+ endFontClass();
+ g_code->endCodeLine();
+}
+
+static void nextCodeLine()
+{
+ const char *fc = g_currentFontClass;
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ g_currentFontClass = fc;
+ startCodeLine();
+ }
+}
+
+
+/*! writes a link to a fragment \a text that may span multiple lines, inserting
+ * line numbers for each line. If \a text contains newlines, the link will be
+ * split into multiple links with the same destination, one for each line.
+ */
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const char *ref,const char *file,
+ const char *anchor,const char *text,
+ const char *tooltip)
+{
+ bool done=FALSE;
+ char *p=(char *)text;
+ while (!done)
+ {
+ char *sp=p;
+ char c;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ nextCodeLine();
+ }
+ else
+ {
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ done=TRUE;
+ }
+ }
+}
+
+
+static void codifyLines(char *text)
+{
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ g_code->codify(sp);
+ nextCodeLine();
+ }
+ else
+ {
+ g_code->codify(sp);
+ done=TRUE;
+ }
+ }
+}
+
+static void addDocCrossReference(MemberDef *src,MemberDef *dst)
+{
+ if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+ //printf("addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+ if ((Config_getBool("REFERENCED_BY_RELATION") || Config_getBool("CALLER_GRAPH")) &&
+ (src->isFunction() || src->isSlot())
+ )
+ {
+ dst->addSourceReferencedBy(src);
+ }
+ if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) &&
+ (src->isFunction() || src->isSlot())
+ )
+ {
+ src->addSourceReferences(dst);
+ }
+
+}
+
+
+
+static bool getLinkInScope(const QCString &c, // scope
+ const QCString &m, // member
+ const char *memberText, // exact text
+ CodeOutputInterface &ol,
+ const char *text
+ )
+{
+ MemberDef *md;
+ ClassDef *cd;
+ FileDef *fd;
+ NamespaceDef *nd;
+ GroupDef *gd;
+ //printf("Trying `%s'::`%s'\n",c.data(),m.data());
+ if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
+ md->isLinkable())
+ {
+ //printf("Found!\n");
+ //Definition *d=0;
+ //if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
+
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ if (d && d->isLinkable())
+ {
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ //printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n",
+ // g_currentDefinition,g_currentMemberDef,g_insideBody);
+
+ if (g_currentDefinition && g_currentMemberDef &&
+ md!=g_currentMemberDef && g_insideBody)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ //printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
+
+ writeMultiLineCodeLink(ol,md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ text ? text : memberText,
+ md->briefDescriptionAsTooltip());
+ addToSearchIndex(text ? text : memberText);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool getLink(const char *className,
+ const char *memberName,
+ CodeOutputInterface &ol,
+ const char *text=0)
+{
+ QCString m=removeRedundantWhiteSpace(memberName);
+ QCString c=className;
+ if (!getLinkInScope(c,m,memberName,ol,text))
+ {
+ if (!g_curClassName.isEmpty())
+ {
+ if (!c.isEmpty()) c.prepend("::");
+ c.prepend(g_curClassName);
+ return getLinkInScope(c,m,memberName,ol,text);
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/*
+ For a given string in the source code,
+ finds its class or global id and links to it.
+
+ As of June 1, '05, this ONLY finds classes
+*/
+static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
+ bool /*typeOnly*/=FALSE)
+{
+ QCString className=clName;
+
+ // Don't do anything for empty text
+ if (className.isEmpty()) return;
+
+ ClassDef *cd=0,*lcd=0; /** Class def that we may find */
+ MemberDef *md=0; /** Member def that we may find */
+ bool isLocal=FALSE;
+
+ // printf("generateClassOrGlobalLink(className=%s)\n",className.data());
+
+ if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable
+ {
+ Definition *d = g_currentDefinition;
+
+ cd = getResolvedClass(d,g_sourceFileDef,className,&md);
+
+ //printf("d=%p g_sourceFileDef=%p\n",d,g_currentDefinition);
+ //printf("is found as a type %s\n",cd?cd->name().data():"<null>");
+
+ if (cd==0 && md==0) // also see if it is variable or enum or enum value
+ {
+ if (getLink(g_classScope,clName,ol,clName))
+ {
+ return;
+ }
+ }
+ }
+ else
+ {
+ if (lcd!=PyVariableContext::dummyContext)
+ {
+ g_theCallContext.setClass(lcd);
+ }
+ isLocal=TRUE;
+ //fprintf(stderr,"is a local variable cd=%p!\n",cd);
+ }
+
+ if (cd && cd->isLinkable()) // is it a linkable class
+ {
+ writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),clName,cd->briefDescriptionAsTooltip());
+ addToSearchIndex(className);
+ if (md)
+ {
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ }
+ }
+ else // not a class, maybe a global member
+ {
+
+ /*
+ This code requires a going-over in order to
+ make it work for Python
+
+ //printf("class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly);
+ if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
+ {
+ if (md==0) // not found as a typedef
+ {
+ md = setCallContextForVar(clName);
+ //printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
+ if (md && g_currentDefinition)
+ {
+ //fprintf(stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
+ // md->name().data(),g_currentDefinition->name().data(),
+ // isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
+ // md->getOuterScope()->name().data());
+ }
+
+ if (md && g_currentDefinition &&
+ isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
+ {
+ md=0; // variable not accessible
+ }
+ }
+ if (md)
+ {
+ //printf("is a global md=%p g_currentDefinition=%s\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>");
+ if (md->isLinkable())
+ {
+ writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName,md->briefDescriptionAsTooltip());
+ addToSearchIndex(clName);
+ if (g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ return;
+ }
+ }
+ }
+
+ */
+
+ // nothing found, just write out the word
+ codifyLines(clName);
+ addToSearchIndex(clName);
+ }
+}
+
+/*
+ As of June 1, this function seems to work
+ for file members, but scopes are not
+ being correctly tracked for classes
+ so it doesn't work for classes yet.
+
+*/
+static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
+{
+ //CodeClassDef *ccd=0;
+ ClassDef *ccd=0;
+ QCString locScope=g_classScope.copy();
+ QCString locFunc=removeRedundantWhiteSpace(funcName);
+ //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
+ int i=locFunc.findRev("::");
+ if (i>0)
+ {
+ locScope=locFunc.left(i);
+ locFunc=locFunc.right(locFunc.length()-i-2).stripWhiteSpace();
+ }
+ //printf("generateFunctionLink(%s) classScope=`%s'\n",locFunc.data(),locScope.data());
+ if (!locScope.isEmpty() && (ccd=g_codeClassSDict[locScope]))
+ {
+ //printf("using classScope %s\n",g_classScope.data());
+ if (ccd->baseClasses())
+ {
+ BaseClassListIterator bcli(*ccd->baseClasses());
+ for ( ; bcli.current() ; ++bcli)
+ {
+ if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName))
+ {
+ return;
+ }
+ }
+ }
+ }
+ if (!getLink(locScope,locFunc,ol,funcName))
+ {
+ generateClassOrGlobalLink(ol,funcName);
+ }
+ return;
+}
+
+static bool findMemberLink(CodeOutputInterface &ol,Definition *sym,const char *symName)
+{
+ //printf("sym %s outerScope=%s equal=%d\n",
+ // sym->name().data(),sym->getOuterScope()->name().data(),
+ // sym->getOuterScope()==g_currentDefinition);
+
+ if (sym->getOuterScope() &&
+ sym->getOuterScope()->definitionType()==Definition::TypeClass &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ClassDef *cd = (ClassDef*)sym->getOuterScope();
+ ClassDef *thisCd = (ClassDef *)g_currentDefinition;
+ QCString anchor;
+ if (sym->definitionType()==Definition::TypeMember)
+ {
+ anchor=((MemberDef *)sym)->anchor();
+ }
+
+ // TODO: find the nearest base class in case cd is a base class of
+ // thisCd
+ if (cd==thisCd)
+ {
+ writeMultiLineCodeLink(ol,sym->getReference(),
+ sym->getOutputFileBase(),
+ anchor,
+ symName,
+ sym->briefDescriptionAsTooltip());
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void findMemberLink(CodeOutputInterface &ol,char *symName)
+{
+ //printf("Member reference: %s scope=%s member=%s\n",
+ // pycodeYYtext,
+ // g_currentDefinition?g_currentDefinition->name().data():"<none>",
+ // g_currentMemberDef?g_currentMemberDef->name().data():"<none>"
+ // );
+ if (g_currentDefinition)
+ {
+ DefinitionIntf *di = Doxygen::symbolMap->find(symName);
+ if (di)
+ {
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multiple symbols
+ {
+ DefinitionListIterator dli(*(DefinitionList*)di);
+ Definition *sym;
+ for (dli.toFirst();(sym=dli.current());++dli)
+ {
+ if (findMemberLink(ol,sym,symName)) return;
+ }
+ }
+ else // single symbol
+ {
+ if (findMemberLink(ol,(Definition*)di,symName)) return;
+ }
+ }
+ }
+ //printf("sym %s not found\n",&pycodeYYtext[5]);
+ codify(symName);
+}
+
+static void startFontClass(const char *s)
+{
+ endFontClass();
+ g_code->startFontClass(s);
+ g_currentFontClass=s;
+}
+
+static void endFontClass()
+{
+ if (g_currentFontClass)
+ {
+ g_code->endFontClass();
+ g_currentFontClass=0;
+ }
+}
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 1845 "<stdout>"
+
+#define INITIAL 0
+#define Body 1
+#define FunctionDec 2
+#define FunctionParams 3
+#define ClassDec 4
+#define ClassInheritance 5
+#define Suite 6
+#define SuiteCaptureIndent 7
+#define SuiteStart 8
+#define SuiteMaintain 9
+#define SuiteContinuing 10
+#define LongString 11
+#define SingleQuoteString 12
+#define DoubleQuoteString 13
+#define TripleString 14
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int pycodeYYlex_destroy (void );
+
+int pycodeYYget_debug (void );
+
+void pycodeYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE pycodeYYget_extra (void );
+
+void pycodeYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *pycodeYYget_in (void );
+
+void pycodeYYset_in (FILE * in_str );
+
+FILE *pycodeYYget_out (void );
+
+void pycodeYYset_out (FILE * out_str );
+
+yy_size_t pycodeYYget_leng (void );
+
+char *pycodeYYget_text (void );
+
+int pycodeYYget_lineno (void );
+
+void pycodeYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int pycodeYYwrap (void );
+#else
+extern int pycodeYYwrap (void );
+#endif
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( pycodeYYtext, pycodeYYleng, 1, pycodeYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( pycodeYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( pycodeYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, pycodeYYin))==0 && ferror(pycodeYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(pycodeYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int pycodeYYlex (void);
+
+#define YY_DECL int pycodeYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after pycodeYYtext and pycodeYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 949 "pycode.l"
+
+
+#line 2042 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)pycodeYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in pycodeYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! pycodeYYin )
+ pycodeYYin = stdin;
+
+ if ( ! pycodeYYout )
+ pycodeYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ pycodeYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ pycodeYY_create_buffer(pycodeYYin,YY_BUF_SIZE );
+ }
+
+ pycodeYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of pycodeYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 497 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 1137 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+
+case 1:
+YY_RULE_SETUP
+#line 952 "pycode.l"
+{
+ startFontClass("keyword");
+ codify(pycodeYYtext);
+ endFontClass();
+ BEGIN( FunctionDec );
+ }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 959 "pycode.l"
+{
+ startFontClass("keyword");
+ codify(pycodeYYtext);
+ endFontClass();
+ BEGIN( ClassDec );
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 965 "pycode.l"
+{
+ startFontClass("keywordtype");
+ codify(pycodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 970 "pycode.l"
+{
+ codify("self.");
+ findMemberLink(*g_code,&pycodeYYtext[5]);
+ }
+ YY_BREAK
+
+case 5:
+YY_RULE_SETUP
+#line 976 "pycode.l"
+{
+
+ generateClassOrGlobalLink(*g_code,pycodeYYtext);
+ // codify(pycodeYYtext);
+ g_curClassName = pycodeYYtext;
+ g_curClassBases.clear();
+ BEGIN( ClassInheritance );
+ }
+ YY_BREAK
+
+case 6:
+YY_RULE_SETUP
+#line 986 "pycode.l"
+{
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 990 "pycode.l"
+{
+ // The parser
+ // is assuming
+ // that ALL identifiers
+ // in this state
+ // are base classes;
+ // it doesn't check to see
+ // that the first parenthesis
+ // has been seen.
+
+ // This is bad - it should
+ // probably be more strict
+ // about what to accept.
+
+ g_curClassBases.inSort(pycodeYYtext);
+ generateClassOrGlobalLink(*g_code,pycodeYYtext);
+ // codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 1009 "pycode.l"
+{
+ codify(pycodeYYtext);
+
+ // Assume this will
+ // be a one-line suite;
+ // found counter-example
+ // in SuiteStart.
+
+ // Push a class scope
+
+ ClassDef *classDefToAdd = new ClassDef("<code>",1,g_curClassName,ClassDef::Class,0,0,FALSE);
+ g_codeClassSDict.append(g_curClassName,classDefToAdd);
+ char *s=g_curClassBases.first();
+ while (s)
+ {
+ ClassDef *baseDefToAdd;
+ baseDefToAdd=g_codeClassSDict[s];
+
+ // Try to find class in global
+ // scope
+ if (baseDefToAdd==0)
+ {
+ baseDefToAdd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
+ }
+
+ if (baseDefToAdd && baseDefToAdd!=classDefToAdd)
+ {
+ classDefToAdd->insertBaseClass(baseDefToAdd,s,Public,Normal);
+ }
+
+ s=g_curClassBases.next();
+ }
+
+ // Reset class-parsing variables.
+ g_curClassName.resize(0);
+ g_curClassBases.clear();
+
+ g_noSuiteFound = TRUE;
+ BEGIN( SuiteStart );
+ }
+ YY_BREAK
+
+
+case 9:
+YY_RULE_SETUP
+#line 1053 "pycode.l"
+{
+ generateFunctionLink(*g_code,pycodeYYtext);
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 1057 "pycode.l"
+{
+ codify(pycodeYYtext);
+ BEGIN( FunctionParams );
+ }
+ YY_BREAK
+
+
+case 11:
+YY_RULE_SETUP
+#line 1064 "pycode.l"
+{
+ // Parses delimiters
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 1069 "pycode.l"
+{
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 1073 "pycode.l"
+{
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 1077 "pycode.l"
+{
+ codify(pycodeYYtext);
+
+ // Assume this will
+ // be a one-line suite;
+ // found counter-example
+ // in SuiteStart.
+ g_noSuiteFound = TRUE;
+ BEGIN( SuiteStart );
+ }
+ YY_BREAK
+
+
+case 15:
+YY_RULE_SETUP
+#line 1091 "pycode.l"
+{
+ // Position-sensitive rules!
+ // Must come AFTER keyword-triggered rules
+ // Must come BEFORE identifier NONEMPTY-like rules
+ // to syntax highlight.
+
+ startFontClass("keyword");
+ codify(pycodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 1102 "pycode.l"
+{
+ startFontClass("keywordflow");
+ codify(pycodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 1108 "pycode.l"
+{
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+
+
+case 18:
+YY_RULE_SETUP
+#line 1117 "pycode.l"
+{
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 1120 "pycode.l"
+{
+ startFontClass("keyword");
+ codifyLines(pycodeYYtext);
+ endFontClass();
+
+ // No indentation necesary
+ g_noSuiteFound = FALSE;
+ }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 1129 "pycode.l"
+{
+ startFontClass("keywordflow");
+ codifyLines(pycodeYYtext);
+ endFontClass();
+
+ // No indentation necesary
+ g_noSuiteFound = FALSE;
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 1137 "pycode.l"
+{
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 1142 "pycode.l"
+{
+ // This eats EVERYTHING
+ // except the newline
+ startFontClass("comment");
+ codifyLines(pycodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+#line 1150 "pycode.l"
+{
+ codifyLines(pycodeYYtext);
+ if ( g_noSuiteFound )
+ {
+ // printf("New suite to capture! [%d]\n", g_yyLineNr);
+ BEGIN ( SuiteCaptureIndent );
+ }
+ }
+ YY_BREAK
+
+
+case 24:
+/* rule 24 can match eol */
+YY_RULE_SETUP
+#line 1161 "pycode.l"
+{
+ // Blankline - ignore, keep looking for indentation.
+ codifyLines(pycodeYYtext);
+ }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 1166 "pycode.l"
+{
+ // This state lasts momentarily,
+ // to check the indentation
+ // level that is about to be
+ // used.
+ codifyLines(pycodeYYtext);
+ g_indents.push(pycodeYYleng);
+ // printf("Captured indent of %d [line %d]\n", pycodeYYleng, g_yyLineNr);
+ BEGIN( Suite );
+ }
+ YY_BREAK
+
+
+case 26:
+YY_RULE_SETUP
+#line 1180 "pycode.l"
+{
+ // This implements poor
+ // indendation-tracking;
+ // should be improved.
+ // (translate tabs to space, etc)
+ codifyLines(pycodeYYtext);
+ adjustScopesAndSuites(pycodeYYleng);
+ }
+ YY_BREAK
+case 27:
+/* rule 27 can match eol */
+YY_RULE_SETUP
+#line 1189 "pycode.l"
+{
+ // If this ever succeeds,
+ // it means that this is
+ // a blank line, and
+ // can be ignored.
+ codifyLines(pycodeYYtext);
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 1197 "pycode.l"
+{
+ // Default rule; matches
+ // the empty string, assuming
+ // real text starts here.
+ // Just go straight to Body.
+ adjustScopesAndSuites(0);
+ }
+ YY_BREAK
+
+case 29:
+/* rule 29 can match eol */
+YY_RULE_SETUP
+#line 1207 "pycode.l"
+{
+ codifyLines(pycodeYYtext);
+ BEGIN( SuiteMaintain );
+ }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 1211 "pycode.l"
+{
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+#line 1214 "pycode.l"
+{
+ codifyLines(pycodeYYtext);
+ }
+ YY_BREAK
+// Single quoted string like 'That\'s a """nice""" string!'
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 1219 "pycode.l"
+{ // line continuation
+ codifyLines(pycodeYYtext);
+ }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 1222 "pycode.l"
+{ // espaced char
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 1225 "pycode.l"
+{ // tripple double quotes
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 1228 "pycode.l"
+{ // end of the string
+ codify(pycodeYYtext);
+ endFontClass();
+ BEGIN(g_stringContext);
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 1233 "pycode.l"
+{ // normal chars
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 1236 "pycode.l"
+{ // normal char
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+
+// Double quoted string like "That's \"a '''nice'''\" string!"
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 1242 "pycode.l"
+{ // line continuation
+ codifyLines(pycodeYYtext);
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 1245 "pycode.l"
+{ // espaced char
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 1248 "pycode.l"
+{ // tripple single quotes
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 1251 "pycode.l"
+{ // end of the string
+ codify(pycodeYYtext);
+ endFontClass();
+ BEGIN(g_stringContext);
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 1256 "pycode.l"
+{ // normal chars
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 1259 "pycode.l"
+{ // normal char
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+
+
+case 44:
+#line 1266 "pycode.l"
+case 45:
+YY_RULE_SETUP
+#line 1266 "pycode.l"
+{
+ codify(pycodeYYtext);
+ if (g_doubleQuote==(pycodeYYtext[0]=='"'))
+ {
+ endFontClass();
+ BEGIN(g_stringContext);
+ }
+ }
+ YY_BREAK
+case 46:
+/* rule 46 can match eol */
+YY_RULE_SETUP
+#line 1274 "pycode.l"
+{
+ codifyLines(pycodeYYtext);
+ }
+ YY_BREAK
+case 47:
+/* rule 47 can match eol */
+YY_RULE_SETUP
+#line 1277 "pycode.l"
+{
+ codifyLines(pycodeYYtext);
+ }
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 1280 "pycode.l"
+{
+ codify(pycodeYYtext);
+ }
+ YY_BREAK
+
+/*
+<*>({NONEMPTY}|{EXPCHAR}|{BB}) { // This should go one character at a time.
+ codify(pycodeYYtext);
+ // printf("[pycode] '%s' [ state %d ] [line %d] no match\n",
+ // pycodeYYtext, YY_START, g_yyLineNr);
+
+ //endFontClass();
+ BEGIN(Body);
+ }
+ */
+case 49:
+#line 1297 "pycode.l"
+case 50:
+YY_RULE_SETUP
+#line 1297 "pycode.l"
+{
+ startFontClass("stringliteral");
+ g_stringContext=YY_START;
+ g_doubleQuote=pycodeYYtext[pycodeYYleng-1]=='"';
+ codify(pycodeYYtext);
+ BEGIN(TripleString);
+ }
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 1304 "pycode.l"
+{ // single quoted string
+ startFontClass("stringliteral");
+ g_stringContext=YY_START;
+ codify(pycodeYYtext);
+ BEGIN(SingleQuoteString);
+ }
+ YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 1310 "pycode.l"
+{ // double quoted string
+ startFontClass("stringliteral");
+ g_stringContext=YY_START;
+ codify(pycodeYYtext);
+ BEGIN(DoubleQuoteString);
+ }
+ YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 1316 "pycode.l"
+{
+ if (YY_START==SingleQuoteString ||
+ YY_START==DoubleQuoteString ||
+ YY_START==TripleString
+ )
+ {
+ REJECT;
+ }
+ // This eats EVERYTHING
+ // except the newline
+ startFontClass("comment");
+ codifyLines(pycodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 54:
+/* rule 54 can match eol */
+YY_RULE_SETUP
+#line 1330 "pycode.l"
+{
+ codifyLines(pycodeYYtext);
+ //printf("[pycode] %d NEWLINE [line %d] no match\n",
+ // YY_START, g_yyLineNr);
+
+ //endFontClass();
+ BEGIN(Body);
+ }
+ YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 1339 "pycode.l"
+{
+ codify(pycodeYYtext);
+ BEGIN(Body);
+ }
+ YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 1343 "pycode.l"
+{
+ codify(pycodeYYtext);
+ // printf("[pycode] '%s' [ state %d ] [line %d] no match\n",
+ // pycodeYYtext, YY_START, g_yyLineNr);
+
+ //endFontClass();
+ BEGIN(Body);
+ }
+ YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 1352 "pycode.l"
+ECHO;
+ YY_BREAK
+#line 2753 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(Body):
+ case YY_STATE_EOF(FunctionDec):
+ case YY_STATE_EOF(FunctionParams):
+ case YY_STATE_EOF(ClassDec):
+ case YY_STATE_EOF(ClassInheritance):
+ case YY_STATE_EOF(Suite):
+ case YY_STATE_EOF(SuiteCaptureIndent):
+ case YY_STATE_EOF(SuiteStart):
+ case YY_STATE_EOF(SuiteMaintain):
+ case YY_STATE_EOF(SuiteContinuing):
+ case YY_STATE_EOF(LongString):
+ case YY_STATE_EOF(SingleQuoteString):
+ case YY_STATE_EOF(DoubleQuoteString):
+ case YY_STATE_EOF(TripleString):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed pycodeYYin at a new source and called
+ * pycodeYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = pycodeYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( pycodeYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * pycodeYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of pycodeYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ pycodeYYrestart(pycodeYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) pycodeYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 497 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 497 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 496);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ pycodeYYrestart(pycodeYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( pycodeYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve pycodeYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void pycodeYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ pycodeYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ pycodeYY_create_buffer(pycodeYYin,YY_BUF_SIZE );
+ }
+
+ pycodeYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ pycodeYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void pycodeYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * pycodeYYpop_buffer_state();
+ * pycodeYYpush_buffer_state(new_buffer);
+ */
+ pycodeYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ pycodeYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (pycodeYYwrap()) processing, but the only time this flag
+ * is looked at is after pycodeYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void pycodeYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ pycodeYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE pycodeYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) pycodeYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in pycodeYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) pycodeYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in pycodeYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ pycodeYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with pycodeYY_create_buffer()
+ *
+ */
+ void pycodeYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ pycodeYYfree((void *) b->yy_ch_buf );
+
+ pycodeYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a pycodeYYrestart() or at EOF.
+ */
+ static void pycodeYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ pycodeYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then pycodeYY_init_buffer was _probably_
+ * called from pycodeYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void pycodeYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ pycodeYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void pycodeYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ pycodeYYensure_buffer_stack();
+
+ /* This block is copied from pycodeYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from pycodeYY_switch_to_buffer. */
+ pycodeYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void pycodeYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ pycodeYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ pycodeYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void pycodeYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)pycodeYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in pycodeYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)pycodeYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in pycodeYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE pycodeYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) pycodeYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in pycodeYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ pycodeYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to pycodeYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * pycodeYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE pycodeYY_scan_string (yyconst char * yystr )
+{
+
+ return pycodeYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to pycodeYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE pycodeYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) pycodeYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in pycodeYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = pycodeYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in pycodeYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up pycodeYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ pycodeYYtext[pycodeYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = pycodeYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ pycodeYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int pycodeYYget_lineno (void)
+{
+
+ return pycodeYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *pycodeYYget_in (void)
+{
+ return pycodeYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *pycodeYYget_out (void)
+{
+ return pycodeYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t pycodeYYget_leng (void)
+{
+ return pycodeYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *pycodeYYget_text (void)
+{
+ return pycodeYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void pycodeYYset_lineno (int line_number )
+{
+
+ pycodeYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see pycodeYY_switch_to_buffer
+ */
+void pycodeYYset_in (FILE * in_str )
+{
+ pycodeYYin = in_str ;
+}
+
+void pycodeYYset_out (FILE * out_str )
+{
+ pycodeYYout = out_str ;
+}
+
+int pycodeYYget_debug (void)
+{
+ return pycodeYY_flex_debug;
+}
+
+void pycodeYYset_debug (int bdebug )
+{
+ pycodeYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from pycodeYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ pycodeYYin = stdin;
+ pycodeYYout = stdout;
+#else
+ pycodeYYin = (FILE *) 0;
+ pycodeYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * pycodeYYlex_init()
+ */
+ return 0;
+}
+
+/* pycodeYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int pycodeYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ pycodeYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ pycodeYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ pycodeYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ pycodeYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * pycodeYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *pycodeYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *pycodeYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void pycodeYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see pycodeYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 1352 "pycode.l"
+
+
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+void resetPythonCodeParserState()
+{
+ g_currentDefinition = 0;
+ g_currentMemberDef = 0;
+ g_doubleStringIsDoc = FALSE;
+ g_paramParens = 0;
+ g_indents.clear();
+ BEGIN( Body );
+}
+
+/*!
+ Examines current stack of white-space indentations;
+ re-syncs the parser with the correct scope.
+*/
+static void adjustScopesAndSuites(unsigned indentLength)
+{
+ // States to pop
+ if (!g_indents.isEmpty() && indentLength < g_indents.top())
+ {
+ while (!g_indents.isEmpty() && indentLength < g_indents.top())
+ {
+ // printf("Exited scope indent of [%d]\n", g_indents.top());
+ g_indents.pop(); // Pop the old suite's indentation
+
+ g_currentMemberDef=0;
+ if (g_currentDefinition)
+ g_currentDefinition=g_currentDefinition->getOuterScope();
+ }
+ }
+
+ // Are there any remaining indentation levels for suites?
+ if (!g_indents.isEmpty())
+ {
+ BEGIN( Suite );
+ }
+ else
+ {
+ BEGIN( Body );
+ }
+}
+
+void parsePythonCode(CodeOutputInterface &od,const char *className,
+ const QCString &s,bool exBlock, const char *exName,
+ FileDef *fd,int startLine,int endLine,bool inlineFragment,
+ MemberDef *,bool)
+{
+
+ //printf("***parseCode()\n");
+
+ //--- some code to eliminate warnings---
+ className = "";
+ exBlock = FALSE;
+ exName = "";
+ inlineFragment = "";
+ //--------------------------------------
+ if (s.isEmpty()) return;
+ g_code = &od;
+ g_inputString = s;
+ g_inputPosition = 0;
+ g_currentFontClass = 0;
+ g_needsTermination = FALSE;
+ if (endLine!=-1)
+ g_inputLines = endLine+1;
+ else
+ g_inputLines = countLines();
+
+ if (startLine!=-1)
+ g_yyLineNr = startLine;
+ else
+ g_yyLineNr = 1;
+
+ g_exampleBlock = exBlock;
+ g_exampleName = exName;
+ g_sourceFileDef = fd;
+
+
+ // Starts line 1 on the output
+ startCodeLine();
+
+ pycodeYYrestart( pycodeYYin );
+
+ pycodeYYlex();
+
+ if (!g_indents.isEmpty())
+ {
+ // printf("Exited pysourceparser in inconsistent state!\n");
+ }
+
+ if (g_needsTermination)
+ {
+ endCodeLine();
+ }
+ return;
+}
+
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void pycodeYYdummy() { yy_flex_realloc(0,0); }
+}
+#elif YY_FLEX_SUBMINOR_VERSION<33
+#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
+#endif
+
+
diff --git a/src/pycode.h b/src/pycode.h
new file mode 100644
index 0000000..759380a
--- /dev/null
+++ b/src/pycode.h
@@ -0,0 +1,41 @@
+/******************************************************************************
+ *
+ * $Id: pycode.h,v 1.9 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/* This code is based on the work done by the MoxyPyDoxy team
+ * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
+ * in Spring 2005 as part of CS 179E: Compiler Design Project
+ * at the University of California, Riverside; the course was
+ * taught by Peter H. Froehlich <phf@acm.org>.
+ */
+
+
+#ifndef PYCODE_H
+#define PYCODE_H
+
+#include "qtbc.h"
+#include <stdio.h>
+
+class CodeOutputInterface;
+class FileDef;
+class MemberDef;
+
+extern void parsePythonCode(CodeOutputInterface &,const char *,const QCString &,
+ bool ,const char *,FileDef *fd=0,
+ int startLine=-1,int endLine=-1,bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,bool showLineNumbers=TRUE);
+extern void resetPythonCodeParserState();
+
+#endif
diff --git a/src/pycode.l b/src/pycode.l
new file mode 100644
index 0000000..6e47f4d
--- /dev/null
+++ b/src/pycode.l
@@ -0,0 +1,1460 @@
+/******************************************************************************
+ *
+ * $Id: pycode.h,v 1.9 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/* This code is based on the work done by the MoxyPyDoxy team
+ * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
+ * in Spring 2005 as part of CS 179E: Compiler Design Project
+ * at the University of California, Riverside; the course was
+ * taught by Peter H. Froehlich <phf@acm.org>.
+ */
+
+
+%{
+
+#include <stdio.h>
+#include <qvaluestack.h>
+
+#include "pycode.h"
+#include "message.h"
+
+#include "scanner.h"
+#include "entry.h"
+#include "doxygen.h"
+#include "outputlist.h"
+#include "util.h"
+#include "membername.h"
+#include "searchindex.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+static ClassSDict g_codeClassSDict(17);
+static QCString g_curClassName;
+static QStrList g_curClassBases;
+
+
+static CodeOutputInterface * g_code;
+static const char * g_inputString; //!< the code fragment as text
+static int g_inputPosition; //!< read offset during parsing
+static const char * g_currentFontClass;
+static bool g_needsTermination;
+static int g_inputLines; //!< number of line in the code fragment
+static int g_yyLineNr; //!< current line number
+static FileDef * g_sourceFileDef;
+static Definition * g_currentDefinition;
+static MemberDef * g_currentMemberDef;
+static bool g_includeCodeFragment;
+static QCString g_realScope;
+static bool g_insideBody;
+static int g_bodyCurlyCount;
+static bool g_searchingForBody;
+static QCString g_classScope;
+static int g_paramParens;
+//static int g_anchorCount;
+
+static bool g_exampleBlock;
+static QCString g_exampleName;
+static QCString g_exampleFile;
+
+static QCString g_type;
+static QCString g_name;
+
+static bool g_doubleStringIsDoc;
+static bool g_doubleQuote;
+static bool g_noSuiteFound;
+static int g_stringContext;
+
+static QValueStack<uint> g_indents; //!< Tracks indentation levels for scoping in python
+
+static void endFontClass();
+static void adjustScopesAndSuites(unsigned indentLength);
+
+
+/*! Represents a stack of variable to class mappings as found in the
+ * code. Each scope is enclosed in pushScope() and popScope() calls.
+ * Variables are added by calling addVariables() and one can search
+ * for variable using findVariable().
+ */
+class PyVariableContext
+{
+ public:
+ static const ClassDef *dummyContext;
+ class Scope : public SDict<ClassDef>
+ {
+ public:
+ Scope() : SDict<ClassDef>(17) {}
+ };
+
+ PyVariableContext()
+ {
+ m_scopes.setAutoDelete(TRUE);
+ }
+
+ virtual ~PyVariableContext()
+ {
+ }
+
+ void pushScope()
+ {
+ m_scopes.append(new Scope);
+ }
+
+ void popScope()
+ {
+ if (m_scopes.count()>0)
+ {
+ m_scopes.remove(m_scopes.count()-1);
+ }
+ }
+
+ void clear()
+ {
+ m_scopes.clear();
+ m_globalScope.clear();
+ }
+
+ void clearExceptGlobal()
+ {
+ m_scopes.clear();
+ }
+
+ void addVariable(const QCString &type,const QCString &name);
+ ClassDef *findVariable(const QCString &name);
+
+ private:
+ Scope m_globalScope;
+ QList<Scope> m_scopes;
+};
+
+void PyVariableContext::addVariable(const QCString &type,const QCString &name)
+{
+ //printf("PyVariableContext::addVariable(%s,%s)\n",type.data(),name.data());
+ QCString ltype = type.simplifyWhiteSpace();
+ QCString lname = name.simplifyWhiteSpace();
+
+ Scope *scope = m_scopes.count()==0 ? &m_globalScope : m_scopes.getLast();
+ ClassDef *varType;
+ if (
+ (varType=g_codeClassSDict[ltype]) || // look for class definitions inside the code block
+ (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,ltype)) // look for global class definitions
+ )
+ {
+ scope->append(lname,varType); // add it to a list
+ }
+ else
+ {
+ if (m_scopes.count()>0) // for local variables add a dummy entry so the name
+ // is hidden to avoid FALSE links to global variables with the same name
+ // TODO: make this work for namespaces as well!
+ {
+ scope->append(lname,dummyContext);
+ }
+ }
+}
+
+ClassDef *PyVariableContext::findVariable(const QCString &name)
+{
+ if (name.isEmpty()) return 0;
+ ClassDef *result = 0;
+ QListIterator<Scope> sli(m_scopes);
+ Scope *scope;
+ // search from inner to outer scope
+ for (sli.toLast();(scope=sli.current());--sli)
+ {
+ result = scope->find(name);
+ if (result)
+ {
+ return result;
+ }
+ }
+ // nothing found -> also try the global scope
+ result=m_globalScope.find(name);
+ return result;
+}
+
+static PyVariableContext g_theVarContext;
+const ClassDef *PyVariableContext::dummyContext = (ClassDef*)0x8;
+
+class PyCallContext
+{
+ public:
+ struct Ctx
+ {
+ Ctx() : name(g_name), type(g_type), cd(0) {}
+ QCString name;
+ QCString type;
+ ClassDef *cd;
+ };
+
+ PyCallContext()
+ {
+ m_classList.append(new Ctx);
+ m_classList.setAutoDelete(TRUE);
+ }
+
+ virtual ~PyCallContext() {}
+
+ void setClass(ClassDef *cd)
+ {
+ Ctx *ctx = m_classList.getLast();
+ if (ctx)
+ {
+ ctx->cd=cd;
+ }
+ }
+ void pushScope()
+ {
+ m_classList.append(new Ctx);
+ }
+
+ void popScope()
+ {
+ if (m_classList.count()>1)
+ {
+ Ctx *ctx = m_classList.getLast();
+ if (ctx)
+ {
+ g_name = ctx->name;
+ g_type = ctx->type;
+ }
+ m_classList.removeLast();
+ }
+ else
+ {
+ }
+ }
+
+ void clear()
+ {
+ m_classList.clear();
+ m_classList.append(new Ctx);
+ }
+
+ ClassDef *getClass() const
+ {
+ Ctx *ctx = m_classList.getLast();
+
+ if (ctx)
+ return ctx->cd;
+ else
+ return 0;
+ }
+
+ private:
+ QList<Ctx> m_classList;
+};
+
+static PyCallContext g_theCallContext;
+
+
+/*! counts the number of lines in the input */
+static int countLines()
+{
+ const char *p=g_inputString;
+ char c;
+ int count=1;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
+ }
+ if (p>g_inputString && *(p-1)!='\n')
+ { // last line does not end with a \n, so we add an extra
+ // line and explicitly terminate the line after parsing.
+ count++,
+ g_needsTermination=TRUE;
+ }
+ return count;
+}
+
+static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
+ }
+}
+
+static void addToSearchIndex(const char *text)
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->addWord(text,FALSE);
+ }
+}
+
+
+static ClassDef *stripClassName(const char *s)
+{
+ int pos=0;
+ QCString type = s;
+ QCString className;
+ QCString templSpec;
+ while (extractClassNameFromType(type,pos,className,templSpec)!=-1)
+ {
+ QCString clName=className+templSpec;
+
+ ClassDef *cd=0;
+ if (!g_classScope.isEmpty())
+ {
+ cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope+"::"+clName);
+ }
+ if (cd==0)
+ {
+ cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,clName);
+ }
+ if (cd)
+ {
+ return cd;
+ }
+ }
+
+ return 0;
+}
+
+
+
+/*! start a new line of code, inserting a line number if g_sourceFileDef
+ * is TRUE. If a definition starts at the current line, then the line
+ * number is linked to the documentation of that definition.
+ */
+static void startCodeLine()
+{
+ //if (g_currentFontClass) { g_code->endFontClass(); }
+ if (g_sourceFileDef)
+ {
+ //QCString lineNumber,lineAnchor;
+ //lineNumber.sprintf("%05d",g_yyLineNr);
+ //lineAnchor.sprintf("l%05d",g_yyLineNr);
+
+ Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
+ //printf("startCodeLine %d d=%p\n",g_yyLineNr,d);
+ //g_code->startLineNumber();
+ if (!g_includeCodeFragment && d && d->isLinkableInProject())
+ {
+ g_currentDefinition = d;
+ g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
+ g_insideBody = FALSE;
+ g_searchingForBody = TRUE;
+ g_realScope = d->name().copy();
+ g_classScope = d->name().copy();
+ //printf("Real scope: `%s'\n",g_realScope.data());
+ g_bodyCurlyCount = 0;
+ QCString lineAnchor;
+ lineAnchor.sprintf("l%05d",g_yyLineNr);
+ if (g_currentMemberDef)
+ {
+ g_code->writeLineNumber(g_currentMemberDef->getReference(),
+ g_currentMemberDef->getOutputFileBase(),
+ g_currentMemberDef->anchor(),g_yyLineNr);
+ setCurrentDoc(
+ g_currentMemberDef->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ else
+ {
+ g_code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,g_yyLineNr);
+ setCurrentDoc(
+ d->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ }
+ else
+ {
+ //g_code->codify(lineNumber);
+ g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ }
+ //g_code->endLineNumber();
+ }
+ g_code->startCodeLine();
+ if (g_currentFontClass)
+ {
+ g_code->startFontClass(g_currentFontClass);
+ }
+}
+
+static void codify(const char* text)
+{
+ g_code->codify(text);
+}
+
+static void endCodeLine()
+{
+ endFontClass();
+ g_code->endCodeLine();
+}
+
+static void nextCodeLine()
+{
+ const char *fc = g_currentFontClass;
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ g_currentFontClass = fc;
+ startCodeLine();
+ }
+}
+
+
+/*! writes a link to a fragment \a text that may span multiple lines, inserting
+ * line numbers for each line. If \a text contains newlines, the link will be
+ * split into multiple links with the same destination, one for each line.
+ */
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const char *ref,const char *file,
+ const char *anchor,const char *text,
+ const char *tooltip)
+{
+ bool done=FALSE;
+ char *p=(char *)text;
+ while (!done)
+ {
+ char *sp=p;
+ char c;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ nextCodeLine();
+ }
+ else
+ {
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ done=TRUE;
+ }
+ }
+}
+
+
+static void codifyLines(char *text)
+{
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n') { }
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ g_code->codify(sp);
+ nextCodeLine();
+ }
+ else
+ {
+ g_code->codify(sp);
+ done=TRUE;
+ }
+ }
+}
+
+static void addDocCrossReference(MemberDef *src,MemberDef *dst)
+{
+ if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+ //printf("addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+ if ((Config_getBool("REFERENCED_BY_RELATION") || Config_getBool("CALLER_GRAPH")) &&
+ (src->isFunction() || src->isSlot())
+ )
+ {
+ dst->addSourceReferencedBy(src);
+ }
+ if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) &&
+ (src->isFunction() || src->isSlot())
+ )
+ {
+ src->addSourceReferences(dst);
+ }
+
+}
+
+
+
+static bool getLinkInScope(const QCString &c, // scope
+ const QCString &m, // member
+ const char *memberText, // exact text
+ CodeOutputInterface &ol,
+ const char *text
+ )
+{
+ MemberDef *md;
+ ClassDef *cd;
+ FileDef *fd;
+ NamespaceDef *nd;
+ GroupDef *gd;
+ //printf("Trying `%s'::`%s'\n",c.data(),m.data());
+ if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
+ md->isLinkable())
+ {
+ //printf("Found!\n");
+ //Definition *d=0;
+ //if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
+
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ if (d && d->isLinkable())
+ {
+ g_theCallContext.setClass(stripClassName(md->typeString()));
+ //printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n",
+ // g_currentDefinition,g_currentMemberDef,g_insideBody);
+
+ if (g_currentDefinition && g_currentMemberDef &&
+ md!=g_currentMemberDef && g_insideBody)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ //printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
+
+ writeMultiLineCodeLink(ol,md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ text ? text : memberText,
+ md->briefDescriptionAsTooltip());
+ addToSearchIndex(text ? text : memberText);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool getLink(const char *className,
+ const char *memberName,
+ CodeOutputInterface &ol,
+ const char *text=0)
+{
+ QCString m=removeRedundantWhiteSpace(memberName);
+ QCString c=className;
+ if (!getLinkInScope(c,m,memberName,ol,text))
+ {
+ if (!g_curClassName.isEmpty())
+ {
+ if (!c.isEmpty()) c.prepend("::");
+ c.prepend(g_curClassName);
+ return getLinkInScope(c,m,memberName,ol,text);
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/*
+ For a given string in the source code,
+ finds its class or global id and links to it.
+
+ As of June 1, '05, this ONLY finds classes
+*/
+static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
+ bool /*typeOnly*/=FALSE)
+{
+ QCString className=clName;
+
+ // Don't do anything for empty text
+ if (className.isEmpty()) return;
+
+ ClassDef *cd=0,*lcd=0; /** Class def that we may find */
+ MemberDef *md=0; /** Member def that we may find */
+ bool isLocal=FALSE;
+
+ // printf("generateClassOrGlobalLink(className=%s)\n",className.data());
+
+ if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable
+ {
+ Definition *d = g_currentDefinition;
+
+ cd = getResolvedClass(d,g_sourceFileDef,className,&md);
+
+ //printf("d=%p g_sourceFileDef=%p\n",d,g_currentDefinition);
+ //printf("is found as a type %s\n",cd?cd->name().data():"<null>");
+
+ if (cd==0 && md==0) // also see if it is variable or enum or enum value
+ {
+ if (getLink(g_classScope,clName,ol,clName))
+ {
+ return;
+ }
+ }
+ }
+ else
+ {
+ if (lcd!=PyVariableContext::dummyContext)
+ {
+ g_theCallContext.setClass(lcd);
+ }
+ isLocal=TRUE;
+ //fprintf(stderr,"is a local variable cd=%p!\n",cd);
+ }
+
+ if (cd && cd->isLinkable()) // is it a linkable class
+ {
+ writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),clName,cd->briefDescriptionAsTooltip());
+ addToSearchIndex(className);
+ if (md)
+ {
+ Definition *d = md->getOuterScope()==Doxygen::globalScope ?
+ md->getBodyDef() : md->getOuterScope();
+ if (md->getGroupDef()) d = md->getGroupDef();
+ if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ }
+ }
+ else // not a class, maybe a global member
+ {
+
+ /*
+ This code requires a going-over in order to
+ make it work for Python
+
+ //printf("class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly);
+ if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
+ {
+ if (md==0) // not found as a typedef
+ {
+ md = setCallContextForVar(clName);
+ //printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
+ if (md && g_currentDefinition)
+ {
+ //fprintf(stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
+ // md->name().data(),g_currentDefinition->name().data(),
+ // isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
+ // md->getOuterScope()->name().data());
+ }
+
+ if (md && g_currentDefinition &&
+ isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
+ {
+ md=0; // variable not accessible
+ }
+ }
+ if (md)
+ {
+ //printf("is a global md=%p g_currentDefinition=%s\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>");
+ if (md->isLinkable())
+ {
+ writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName,md->briefDescriptionAsTooltip());
+ addToSearchIndex(clName);
+ if (g_currentMemberDef)
+ {
+ addDocCrossReference(g_currentMemberDef,md);
+ }
+ return;
+ }
+ }
+ }
+
+ */
+
+ // nothing found, just write out the word
+ codifyLines(clName);
+ addToSearchIndex(clName);
+ }
+}
+
+/*
+ As of June 1, this function seems to work
+ for file members, but scopes are not
+ being correctly tracked for classes
+ so it doesn't work for classes yet.
+
+*/
+static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
+{
+ //CodeClassDef *ccd=0;
+ ClassDef *ccd=0;
+ QCString locScope=g_classScope.copy();
+ QCString locFunc=removeRedundantWhiteSpace(funcName);
+ //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
+ int i=locFunc.findRev("::");
+ if (i>0)
+ {
+ locScope=locFunc.left(i);
+ locFunc=locFunc.right(locFunc.length()-i-2).stripWhiteSpace();
+ }
+ //printf("generateFunctionLink(%s) classScope=`%s'\n",locFunc.data(),locScope.data());
+ if (!locScope.isEmpty() && (ccd=g_codeClassSDict[locScope]))
+ {
+ //printf("using classScope %s\n",g_classScope.data());
+ if (ccd->baseClasses())
+ {
+ BaseClassListIterator bcli(*ccd->baseClasses());
+ for ( ; bcli.current() ; ++bcli)
+ {
+ if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName))
+ {
+ return;
+ }
+ }
+ }
+ }
+ if (!getLink(locScope,locFunc,ol,funcName))
+ {
+ generateClassOrGlobalLink(ol,funcName);
+ }
+ return;
+}
+
+static bool findMemberLink(CodeOutputInterface &ol,Definition *sym,const char *symName)
+{
+ //printf("sym %s outerScope=%s equal=%d\n",
+ // sym->name().data(),sym->getOuterScope()->name().data(),
+ // sym->getOuterScope()==g_currentDefinition);
+
+ if (sym->getOuterScope() &&
+ sym->getOuterScope()->definitionType()==Definition::TypeClass &&
+ g_currentDefinition->definitionType()==Definition::TypeClass)
+ {
+ ClassDef *cd = (ClassDef*)sym->getOuterScope();
+ ClassDef *thisCd = (ClassDef *)g_currentDefinition;
+ QCString anchor;
+ if (sym->definitionType()==Definition::TypeMember)
+ {
+ anchor=((MemberDef *)sym)->anchor();
+ }
+
+ // TODO: find the nearest base class in case cd is a base class of
+ // thisCd
+ if (cd==thisCd)
+ {
+ writeMultiLineCodeLink(ol,sym->getReference(),
+ sym->getOutputFileBase(),
+ anchor,
+ symName,
+ sym->briefDescriptionAsTooltip());
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void findMemberLink(CodeOutputInterface &ol,char *symName)
+{
+ //printf("Member reference: %s scope=%s member=%s\n",
+ // yytext,
+ // g_currentDefinition?g_currentDefinition->name().data():"<none>",
+ // g_currentMemberDef?g_currentMemberDef->name().data():"<none>"
+ // );
+ if (g_currentDefinition)
+ {
+ DefinitionIntf *di = Doxygen::symbolMap->find(symName);
+ if (di)
+ {
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multiple symbols
+ {
+ DefinitionListIterator dli(*(DefinitionList*)di);
+ Definition *sym;
+ for (dli.toFirst();(sym=dli.current());++dli)
+ {
+ if (findMemberLink(ol,sym,symName)) return;
+ }
+ }
+ else // single symbol
+ {
+ if (findMemberLink(ol,(Definition*)di,symName)) return;
+ }
+ }
+ }
+ //printf("sym %s not found\n",&yytext[5]);
+ codify(symName);
+}
+
+static void startFontClass(const char *s)
+{
+ endFontClass();
+ g_code->startFontClass(s);
+ g_currentFontClass=s;
+}
+
+static void endFontClass()
+{
+ if (g_currentFontClass)
+ {
+ g_code->endFontClass();
+ g_currentFontClass=0;
+ }
+}
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+%}
+
+
+BB [ \t]+
+B [ \t]*
+NEWLINE \n
+
+DIGIT [0-9]
+LETTER [A-Za-z]
+NONEMPTY [A-Za-z0-9_]
+EXPCHAR [#(){}\[\],:.%/\\=`*~|&<>!;+-]
+NONEMPTYEXP [^ \t\n:]
+PARAMNONEMPTY [^ \t\n():]
+IDENTIFIER ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*
+BORDER ([^A-Za-z0-9])
+
+POUNDCOMMENT "#".*
+
+TRISINGLEQUOTE "'''"
+TRIDOUBLEQUOTE "\"\"\""
+LONGSTRINGCHAR [^\\"']
+ESCAPESEQ ("\\")(.)
+LONGSTRINGITEM ({LONGSTRINGCHAR}|{ESCAPESEQ})
+SMALLQUOTE ("\"\""|"\""|"'"|"''")
+LONGSTRINGBLOCK ({LONGSTRINGITEM}+|{SMALLQUOTE})
+
+SHORTSTRING ("'"{SHORTSTRINGITEM}*"'"|'"'{SHORTSTRINGITEM}*'"')
+SHORTSTRINGITEM ({SHORTSTRINGCHAR}|{ESCAPESEQ})
+SHORTSTRINGCHAR [^\\\n"]
+STRINGLITERAL {STRINGPREFIX}?( {SHORTSTRING} | {LONGSTRING})
+STRINGPREFIX ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR")
+KEYWORD ("lambda"|"import"|"class"|"assert"|"as"|"from"|"global"|"def"|"True"|"False")
+FLOWKW ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally")
+QUOTES ("\""[^"]*"\"")
+SINGLEQUOTES ("'"[^']*"'")
+
+LONGINTEGER {INTEGER}("l"|"L")
+INTEGER ({DECIMALINTEGER}|{OCTINTEGER}|{HEXINTEGER})
+DECIMALINTEGER ({NONZERODIGIT}{DIGIT}*|"0")
+OCTINTEGER "0"{OCTDIGIT}+
+HEXINTEGER "0"("x"|"X"){HEXDIGIT}+
+NONZERODIGIT [1-9]
+OCTDIGIT [0-7]
+HEXDIGIT ({DIGIT}|[a-f]|[A-F])
+FLOATNUMBER ({POINTFLOAT}|{EXPONENTFLOAT})
+POINTFLOAT ({INTPART}?{FRACTION}|{INTPART}".")
+EXPONENTFLOAT ({INTPART}|{POINTFLOAT}){EXPONENT}
+INTPART {DIGIT}+
+FRACTION "."{DIGIT}+
+EXPONENT ("e"|"E")("+"|"-")?{DIGIT}+
+IMAGNUMBER ({FLOATNUMBER}|{INTPART})("j"|"J")
+ATOM ({IDENTIFIER}|{LITERAL}|{ENCLOSURE})
+ENCLOSURE ({PARENTH_FORM}|{LIST_DISPLAY}|{DICT_DISPLAY}|{STRING_CONVERSION})
+LITERAL ({STRINGLITERAL}|{INTEGER}|{LONGINTEGER}|{FLOATNUMBER}|{IMAGNUMBER})
+PARENTH_FORM "("{EXPRESSION_LIST}?")"
+TEST ({AND_TEST}("or"{AND_TEST})*|{LAMBDA_FORM})
+TESTLIST {TEST}( ","{TEST})*","?
+LIST_DISPLAY "["{LISTMAKER}?"]"
+LISTMAKER {EXPRESSION}({LIST_FOR}|(","{EXPRESSION})*","?)
+LIST_ITER ({LIST_FOR}|{LIST_IF})
+LIST_FOR "for"{EXPRESSION_LIST}"in"{TESTLIST}{LIST_ITER}?
+LIST_IF "if"{TEST}{LIST_ITER}?
+DICT_DISPLAY "\{"{KEY_DATUM_LIST}?"\}"
+KEY_DATUM_LIST {KEY_DATUM}(","{KEY_DATUM})*","?
+KEY_DATUM {EXPRESSION}":"{EXPRESSION}
+STRING_CONVERSION "`"{EXPRESSION_LIST}"`"
+PRIMARY ({ATOM}|{ATTRIBUTEREF}|{SUBSCRIPTION}|{SLICING}|{CALL})
+ATTRIBUTEREF {PRIMARY}"."{IDENTIFIER}
+SUBSCRIPTION {PRIMARY}"["{EXPRESSION_LIST}"]"
+SLICING ({SIMPLE_SLICING}|{EXTENDED_SLICING})
+SIMPLE_SLICING {PRIMARY}"["{SHORT_SLICE}"]"
+EXTENDED_SLICING {PRIMARY}"["{SLICE_LIST}"]"
+SLICE_LIST {SLICE_ITEM}(","{SLICE_ITEM})*","?
+SLICE_ITEM ({EXPRESSION}|{PROPER_SLICE}|{ELLIPSIS})
+PROPER_SLICE ({SHORT_SLICE}|{LONG_SLICE})
+SHORT_SLICE {LOWER_BOUND}?":"{UPPER_BOUND}?
+LONG_SLICE {SHORT_SLICE}":"{STRIDE}?
+LOWER_BOUND {EXPRESSION}
+UPPER_BOUND {EXPRESSION}
+STRIDE {EXPRESSION}
+ELLIPSIS "..."
+CALL {PRIMARY}"("({ARGUMENT_LIST}","?)?")"
+ARGUMENT_LIST ({POSITIONAL_ARGUMENTS}(","{KEYWORD_ARGUMENTS})?(",""*"{EXPRESSION})?(",""**"{EXPRESSION})?|{KEYWORD_ARGUMENTS}(",""*"{EXPRESSION})?(",""**"{EXPRESSION})?|"*"{EXPRESSION}(",""**"{EXPRESSION})?|"**"{EXPRESSION})
+POSITIONAL_ARGUMENTS {EXPRESSION}(","{EXPRESSION})*
+KEYWORD_ARGUMENTS {KEYWORD_ITEM}(","{KEYWORD_ITEM})*
+KEYWORD_ITEM {IDENTIFIER}"="{EXPRESSION}
+POWER {PRIMARY}("**"{U_EXPR})?
+U_EXPR ({POWER}|"-"{U_EXPR}|"+"{U_EXPR}|"\~"{U_EXPR})
+M_EXPR ({U_EXPR}|{M_EXPR}"*"{U_EXPR}|{M_EXPR}"//"{U_EXPR}|{M_EXPR}"/"{U_EXPR}|{M_EXPR}"\%"{U_EXPR})
+A_EXPR ({M_EXPR}|{A_EXPR}"+"{M_EXPR}|{A_EXPR}"-"{M_EXPR}
+SHIFT_EXPR ({A_EXPR}|{SHIFT_EXPR}("<<"|">>"){A_EXPR})
+AND_EXPR ({SHIFT_EXPR}|{AND_EXPR}"\;SPMamp;"{SHIFT_EXPR}
+XOR_EXPR ({AND_EXPR}|{XOR_EXPR}"\textasciicircum"{AND_EXPR})
+OR_EXPR ({XOR_EXPR}|{OR_EXPR}"|"{ XOR_EXPR})
+
+COMPARISON {OR_EXPR}({COMP_OPERATOR}{OR_EXPR})*
+COMP_OPERATOR ("<"|">"|"=="|">="|"<="|"<>"|"!="|"is""not"?|"not"?"in")
+EXPRESSION ({OR_TEST}|{LAMBDA_FORM})
+OR_TEST ({AND_TEST}|{OR_TEST}"or"{AND_TEST})
+AND_TEST ({NOT_TEST}|{AND_TEST}"and"{NOT_TEST})
+NOT_TEST ({COMPARISON}|"not"{NOT_TEST})
+LAMBDA_FORM "lambda"{PARAMETER_LIST}?":"{EXPRESSION}
+EXPRESSION_LIST {EXPRESSION}(","{EXPRESSION})*","?
+SIMPLE_STMT ({EXPRESSION_STMT}|{ASSERT_STMT}|{ASSIGNMENT_STMT}|{AUGMENTED_ASSIGNMENT_STMT}|{PASS_STMT}|{DEL_STMT}|{PRINT_STMT}|{RETURN_STMT}|{YIELD_STMT}|{RAISE_STMT}|{BREAK_STMT}|{CONTINUE_STMT}|{IMPORT_STMT}|{GLOBAL_STMT}|{EXEC_STMT})
+EXPRESSION_STMT {EXPRESSION_LIST}
+ASSERT_STMT "assert"{EXPRESSION}(","{EXPRESSION})?
+ASSIGNMENT_STMT ({TARGET_LIST}"=")+{EXPRESSION_LIST}
+TARGET_LIST {TARGET}(","{TARGET})*","?
+TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUTEREF}|{SUBSCRIPTION}|{SLICING})
+
+
+%option noyywrap
+%option nounput
+
+%x Body
+
+%x FunctionDec
+%x FunctionParams
+
+%x ClassDec
+%x ClassInheritance
+
+%x Suite
+%x SuiteCaptureIndent
+%x SuiteStart
+%x SuiteMaintain
+%x SuiteContinuing
+
+%x LongString
+
+%x SingleQuoteString
+%x DoubleQuoteString
+%x TripleString
+
+%%
+
+<Body,Suite>{
+ "def"{BB} {
+ startFontClass("keyword");
+ codify(yytext);
+ endFontClass();
+ BEGIN( FunctionDec );
+ }
+
+ "class"{BB} {
+ startFontClass("keyword");
+ codify(yytext);
+ endFontClass();
+ BEGIN( ClassDec );
+ }
+ "None" {
+ startFontClass("keywordtype");
+ codify(yytext);
+ endFontClass();
+ }
+ "self."{IDENTIFIER} {
+ codify("self.");
+ findMemberLink(*g_code,&yytext[5]);
+ }
+}
+
+<ClassDec>{IDENTIFIER} {
+
+ generateClassOrGlobalLink(*g_code,yytext);
+ // codify(yytext);
+ g_curClassName = yytext;
+ g_curClassBases.clear();
+ BEGIN( ClassInheritance );
+ }
+
+<ClassInheritance>{
+ ({BB}|[(,)]) {
+ codify(yytext);
+ }
+
+ {IDENTIFIER} {
+ // The parser
+ // is assuming
+ // that ALL identifiers
+ // in this state
+ // are base classes;
+ // it doesn't check to see
+ // that the first parenthesis
+ // has been seen.
+
+ // This is bad - it should
+ // probably be more strict
+ // about what to accept.
+
+ g_curClassBases.inSort(yytext);
+ generateClassOrGlobalLink(*g_code,yytext);
+ // codify(yytext);
+ }
+
+ ":" {
+ codify(yytext);
+
+ // Assume this will
+ // be a one-line suite;
+ // found counter-example
+ // in SuiteStart.
+
+ // Push a class scope
+
+ ClassDef *classDefToAdd = new ClassDef("<code>",1,g_curClassName,ClassDef::Class,0,0,FALSE);
+ g_codeClassSDict.append(g_curClassName,classDefToAdd);
+ char *s=g_curClassBases.first();
+ while (s)
+ {
+ ClassDef *baseDefToAdd;
+ baseDefToAdd=g_codeClassSDict[s];
+
+ // Try to find class in global
+ // scope
+ if (baseDefToAdd==0)
+ {
+ baseDefToAdd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
+ }
+
+ if (baseDefToAdd && baseDefToAdd!=classDefToAdd)
+ {
+ classDefToAdd->insertBaseClass(baseDefToAdd,s,Public,Normal);
+ }
+
+ s=g_curClassBases.next();
+ }
+
+ // Reset class-parsing variables.
+ g_curClassName.resize(0);
+ g_curClassBases.clear();
+
+ g_noSuiteFound = TRUE;
+ BEGIN( SuiteStart );
+ }
+}
+
+
+<FunctionDec>{
+ {IDENTIFIER} {
+ generateFunctionLink(*g_code,yytext);
+ }
+
+ {B}"(" {
+ codify(yytext);
+ BEGIN( FunctionParams );
+ }
+}
+
+<FunctionParams>{
+ ({BB}|",") {
+ // Parses delimiters
+ codify(yytext);
+ }
+
+ ({IDENTIFIER}|{PARAMNONEMPTY}+) {
+ codify(yytext);
+ }
+
+ ")" {
+ codify(yytext);
+ }
+
+ ":" {
+ codify(yytext);
+
+ // Assume this will
+ // be a one-line suite;
+ // found counter-example
+ // in SuiteStart.
+ g_noSuiteFound = TRUE;
+ BEGIN( SuiteStart );
+ }
+}
+
+<Body,Suite>{
+
+ {KEYWORD} {
+ // Position-sensitive rules!
+ // Must come AFTER keyword-triggered rules
+ // Must come BEFORE identifier NONEMPTY-like rules
+ // to syntax highlight.
+
+ startFontClass("keyword");
+ codify(yytext);
+ endFontClass();
+ }
+
+ {FLOWKW} {
+ startFontClass("keywordflow");
+ codify(yytext);
+ endFontClass();
+ }
+
+ {IDENTIFIER} {
+ codify(yytext);
+ }
+}
+
+
+
+<SuiteStart>{
+
+ {BB} {
+ codify(yytext);
+ }
+ {KEYWORD} {
+ startFontClass("keyword");
+ codifyLines(yytext);
+ endFontClass();
+
+ // No indentation necesary
+ g_noSuiteFound = FALSE;
+ }
+
+ {FLOWKW} {
+ startFontClass("keywordflow");
+ codifyLines(yytext);
+ endFontClass();
+
+ // No indentation necesary
+ g_noSuiteFound = FALSE;
+ }
+ {IDENTIFIER} {
+ codify(yytext);
+ }
+
+
+ {POUNDCOMMENT} {
+ // This eats EVERYTHING
+ // except the newline
+ startFontClass("comment");
+ codifyLines(yytext);
+ endFontClass();
+ }
+
+ {NEWLINE} {
+ codifyLines(yytext);
+ if ( g_noSuiteFound )
+ {
+ // printf("New suite to capture! [%d]\n", g_yyLineNr);
+ BEGIN ( SuiteCaptureIndent );
+ }
+ }
+}
+
+<SuiteCaptureIndent>{
+ "\n"|({BB}"\n") {
+ // Blankline - ignore, keep looking for indentation.
+ codifyLines(yytext);
+ }
+
+ {BB} {
+ // This state lasts momentarily,
+ // to check the indentation
+ // level that is about to be
+ // used.
+ codifyLines(yytext);
+ g_indents.push(yyleng);
+ // printf("Captured indent of %d [line %d]\n", yyleng, g_yyLineNr);
+ BEGIN( Suite );
+ }
+}
+
+<SuiteMaintain>{
+
+ {BB}/({NONEMPTY}|{EXPCHAR}) {
+ // This implements poor
+ // indendation-tracking;
+ // should be improved.
+ // (translate tabs to space, etc)
+ codifyLines(yytext);
+ adjustScopesAndSuites(yyleng);
+ }
+
+ "\n"|({BB}"\n") {
+ // If this ever succeeds,
+ // it means that this is
+ // a blank line, and
+ // can be ignored.
+ codifyLines(yytext);
+ }
+
+ ""/({NONEMPTY}|{EXPCHAR}) {
+ // Default rule; matches
+ // the empty string, assuming
+ // real text starts here.
+ // Just go straight to Body.
+ adjustScopesAndSuites(0);
+ }
+}
+
+
+<Suite>{NEWLINE} {
+ codifyLines(yytext);
+ BEGIN( SuiteMaintain );
+ }
+<Body>{IDENTIFIER} {
+ codify(yytext);
+ }
+<Body>{NEWLINE} {
+ codifyLines(yytext);
+ }
+
+<SingleQuoteString>{ // Single quoted string like 'That\'s a """nice""" string!'
+ \\{B}\n { // line continuation
+ codifyLines(yytext);
+ }
+ \\. { // espaced char
+ codify(yytext);
+ }
+ {STRINGPREFIX}?{TRIDOUBLEQUOTE} { // tripple double quotes
+ codify(yytext);
+ }
+ "'" { // end of the string
+ codify(yytext);
+ endFontClass();
+ BEGIN(g_stringContext);
+ }
+ [^"'\n\\]+ { // normal chars
+ codify(yytext);
+ }
+ . { // normal char
+ codify(yytext);
+ }
+}
+
+<DoubleQuoteString>{ // Double quoted string like "That's \"a '''nice'''\" string!"
+ \\{B}\n { // line continuation
+ codifyLines(yytext);
+ }
+ \\. { // espaced char
+ codify(yytext);
+ }
+ {STRINGPREFIX}?{TRISINGLEQUOTE} { // tripple single quotes
+ codify(yytext);
+ }
+ "\"" { // end of the string
+ codify(yytext);
+ endFontClass();
+ BEGIN(g_stringContext);
+ }
+ [^"'\n\\]+ { // normal chars
+ codify(yytext);
+ }
+ . { // normal char
+ codify(yytext);
+ }
+}
+
+<TripleString>{
+ {TRIDOUBLEQUOTE} |
+ {TRISINGLEQUOTE} {
+ codify(yytext);
+ if (g_doubleQuote==(yytext[0]=='"'))
+ {
+ endFontClass();
+ BEGIN(g_stringContext);
+ }
+ }
+ {LONGSTRINGBLOCK} {
+ codifyLines(yytext);
+ }
+ \n {
+ codifyLines(yytext);
+ }
+ . {
+ codify(yytext);
+ }
+}
+
+ /*
+<*>({NONEMPTY}|{EXPCHAR}|{BB}) { // This should go one character at a time.
+ codify(yytext);
+ // printf("[pycode] '%s' [ state %d ] [line %d] no match\n",
+ // yytext, YY_START, g_yyLineNr);
+
+ //endFontClass();
+ BEGIN(Body);
+ }
+ */
+
+<*>{STRINGPREFIX}?{TRISINGLEQUOTE} |
+<*>{STRINGPREFIX}?{TRIDOUBLEQUOTE} {
+ startFontClass("stringliteral");
+ g_stringContext=YY_START;
+ g_doubleQuote=yytext[yyleng-1]=='"';
+ codify(yytext);
+ BEGIN(TripleString);
+ }
+<*>{STRINGPREFIX}?"'" { // single quoted string
+ startFontClass("stringliteral");
+ g_stringContext=YY_START;
+ codify(yytext);
+ BEGIN(SingleQuoteString);
+ }
+<*>{STRINGPREFIX}?"\"" { // double quoted string
+ startFontClass("stringliteral");
+ g_stringContext=YY_START;
+ codify(yytext);
+ BEGIN(DoubleQuoteString);
+ }
+<*>{POUNDCOMMENT} {
+ if (YY_START==SingleQuoteString ||
+ YY_START==DoubleQuoteString ||
+ YY_START==TripleString
+ )
+ {
+ REJECT;
+ }
+ // This eats EVERYTHING
+ // except the newline
+ startFontClass("comment");
+ codifyLines(yytext);
+ endFontClass();
+ }
+<*>{NEWLINE} {
+ codifyLines(yytext);
+ //printf("[pycode] %d NEWLINE [line %d] no match\n",
+ // YY_START, g_yyLineNr);
+
+ //endFontClass();
+ BEGIN(Body);
+ }
+
+<*>[ \t]+ {
+ codify(yytext);
+ BEGIN(Body);
+ }
+<*>. {
+ codify(yytext);
+ // printf("[pycode] '%s' [ state %d ] [line %d] no match\n",
+ // yytext, YY_START, g_yyLineNr);
+
+ //endFontClass();
+ BEGIN(Body);
+ }
+
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+void resetPythonCodeParserState()
+{
+ g_currentDefinition = 0;
+ g_currentMemberDef = 0;
+ g_doubleStringIsDoc = FALSE;
+ g_paramParens = 0;
+ g_indents.clear();
+ BEGIN( Body );
+}
+
+/*!
+ Examines current stack of white-space indentations;
+ re-syncs the parser with the correct scope.
+*/
+static void adjustScopesAndSuites(unsigned indentLength)
+{
+ // States to pop
+ if (!g_indents.isEmpty() && indentLength < g_indents.top())
+ {
+ while (!g_indents.isEmpty() && indentLength < g_indents.top())
+ {
+ // printf("Exited scope indent of [%d]\n", g_indents.top());
+ g_indents.pop(); // Pop the old suite's indentation
+
+ g_currentMemberDef=0;
+ if (g_currentDefinition)
+ g_currentDefinition=g_currentDefinition->getOuterScope();
+ }
+ }
+
+ // Are there any remaining indentation levels for suites?
+ if (!g_indents.isEmpty())
+ {
+ BEGIN( Suite );
+ }
+ else
+ {
+ BEGIN( Body );
+ }
+}
+
+void parsePythonCode(CodeOutputInterface &od,const char *className,
+ const QCString &s,bool exBlock, const char *exName,
+ FileDef *fd,int startLine,int endLine,bool inlineFragment,
+ MemberDef *,bool)
+{
+
+ //printf("***parseCode()\n");
+
+ //--- some code to eliminate warnings---
+ className = "";
+ exBlock = FALSE;
+ exName = "";
+ inlineFragment = "";
+ //--------------------------------------
+ if (s.isEmpty()) return;
+ g_code = &od;
+ g_inputString = s;
+ g_inputPosition = 0;
+ g_currentFontClass = 0;
+ g_needsTermination = FALSE;
+ if (endLine!=-1)
+ g_inputLines = endLine+1;
+ else
+ g_inputLines = countLines();
+
+ if (startLine!=-1)
+ g_yyLineNr = startLine;
+ else
+ g_yyLineNr = 1;
+
+ g_exampleBlock = exBlock;
+ g_exampleName = exName;
+ g_sourceFileDef = fd;
+
+
+ // Starts line 1 on the output
+ startCodeLine();
+
+ pycodeYYrestart( pycodeYYin );
+
+ pycodeYYlex();
+
+ if (!g_indents.isEmpty())
+ {
+ // printf("Exited pysourceparser in inconsistent state!\n");
+ }
+
+ if (g_needsTermination)
+ {
+ endCodeLine();
+ }
+ return;
+}
+
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void pycodeYYdummy() { yy_flex_realloc(0,0); }
+}
+#elif YY_FLEX_SUBMINOR_VERSION<33
+#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
+#endif
+
diff --git a/src/pyscanner.cpp b/src/pyscanner.cpp
new file mode 100644
index 0000000..63e96dd
--- /dev/null
+++ b/src/pyscanner.cpp
@@ -0,0 +1,4604 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer pyscanYY_create_buffer
+#define yy_delete_buffer pyscanYY_delete_buffer
+#define yy_flex_debug pyscanYY_flex_debug
+#define yy_init_buffer pyscanYY_init_buffer
+#define yy_flush_buffer pyscanYY_flush_buffer
+#define yy_load_buffer_state pyscanYY_load_buffer_state
+#define yy_switch_to_buffer pyscanYY_switch_to_buffer
+#define yyin pyscanYYin
+#define yyleng pyscanYYleng
+#define yylex pyscanYYlex
+#define yylineno pyscanYYlineno
+#define yyout pyscanYYout
+#define yyrestart pyscanYYrestart
+#define yytext pyscanYYtext
+#define yywrap pyscanYYwrap
+#define yyalloc pyscanYYalloc
+#define yyrealloc pyscanYYrealloc
+#define yyfree pyscanYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE pyscanYYrestart(pyscanYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t pyscanYYleng;
+
+extern FILE *pyscanYYin, *pyscanYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up pyscanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via pyscanYYrestart()), so that the user can continue scanning by
+ * just pointing pyscanYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when pyscanYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t pyscanYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow pyscanYYwrap()'s to do buffer switches
+ * instead of setting up a fresh pyscanYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void pyscanYYrestart (FILE *input_file );
+void pyscanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE pyscanYY_create_buffer (FILE *file,int size );
+void pyscanYY_delete_buffer (YY_BUFFER_STATE b );
+void pyscanYY_flush_buffer (YY_BUFFER_STATE b );
+void pyscanYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void pyscanYYpop_buffer_state (void );
+
+static void pyscanYYensure_buffer_stack (void );
+static void pyscanYY_load_buffer_state (void );
+static void pyscanYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER pyscanYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE pyscanYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE pyscanYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE pyscanYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *pyscanYYalloc (yy_size_t );
+void *pyscanYYrealloc (void *,yy_size_t );
+void pyscanYYfree (void * );
+
+#define yy_new_buffer pyscanYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ pyscanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ pyscanYY_create_buffer(pyscanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ pyscanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ pyscanYY_create_buffer(pyscanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define pyscanYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *pyscanYYin = (FILE *) 0, *pyscanYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int pyscanYYlineno;
+
+int pyscanYYlineno = 1;
+
+extern char *pyscanYYtext;
+#define yytext_ptr pyscanYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up pyscanYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ pyscanYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 149
+#define YY_END_OF_BUFFER 150
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[742] =
+ { 0,
+ 16479,16479, 97, 97, 24, 24, 29, 29, 33, 33,
+ 150, 148, 149, 147, 149, 20, 148, 149, 16, 147,
+ 149, 12, 20, 148, 149, 20, 148, 149, 11, 20,
+ 148, 149, 14, 20, 148, 149, 14, 20, 148, 149,
+ 14, 20, 148, 149, 14, 20, 148, 149, 14, 20,
+ 148, 149, 15, 20, 148, 149, 14, 20, 148, 149,
+ 16393,16394, 14, 20, 148, 149,16393,16394, 14, 20,
+ 148, 149,16393,16394, 14, 20, 148, 149,16393,16394,
+ 14, 20, 148, 149,16393,16394, 44, 45, 148, 149,
+ 42, 44, 147, 149, 41, 45, 148, 149, 45, 148,
+
+ 149, 40, 45, 148, 149, 45, 148, 149, 43, 45,
+ 148, 149, 43, 45, 148, 149, 122, 124, 148, 149,
+ 124, 148, 149, 123, 147, 149, 124, 148, 149, 124,
+ 148, 149, 121, 124, 148, 149, 127, 129, 148, 149,
+ 128, 147, 149, 129, 148, 149, 127, 129, 148, 149,
+ 125, 129, 148, 149, 148, 149, 62, 148, 149, 61,
+ 148, 149, 60, 148, 149, 69, 148, 149, 63, 148,
+ 149, 69, 148, 149, 66, 148, 149, 63, 69, 148,
+ 149, 67, 148, 149, 65, 69, 148, 149, 64, 69,
+ 148, 149, 52, 56, 148, 149, 56, 148, 149, 55,
+
+ 147, 149,16430, 51, 56, 148, 149, 54, 56, 148,
+ 149, 50, 56, 148, 149, 49, 56, 148, 149, 54,
+ 56, 148, 149, 73, 148, 149, 74, 147, 149, 70,
+ 73, 148, 149, 72, 73, 148, 149, 71, 73, 148,
+ 149, 87, 148, 149, 88, 148, 149, 88, 148, 149,
+ 89, 148, 149, 90, 148, 149, 148, 149, 91, 147,
+ 149, 8287, 148, 149, 148, 149, 148, 149, 94, 148,
+ 149, 81, 84, 148, 149, 84, 148, 149, 82, 147,
+ 149, 80, 84, 148, 149, 84, 148, 149, 79, 84,
+ 148, 149, 78, 84, 148, 149, 109, 148, 149, 97,
+
+ 109, 148, 149, 110, 147, 149, 101, 109, 148, 149,
+ 107, 109, 148, 149, 100, 109, 148, 149, 104, 109,
+ 148, 149, 98, 109, 148, 149, 98, 109, 148, 149,
+ 96, 109, 148, 149, 108, 109, 148, 149, 108, 109,
+ 148, 149, 108, 109, 148, 149, 105, 109, 148, 149,
+ 108, 109, 148, 149, 106, 109, 148, 149, 118, 148,
+ 149, 117, 147, 149, 115, 148, 149, 116, 147, 149,
+ 113, 115, 148, 149, 111, 115, 148, 149, 112, 115,
+ 148, 149, 114, 115, 148, 149, 134, 135, 148, 149,
+ 135, 148, 149, 133, 135, 148, 149, 135, 148, 149,
+
+ 140, 141, 148, 149, 139, 141, 148, 149, 141, 148,
+ 149, 141, 148, 149, 144, 146, 148, 149, 144, 145,
+ 147, 149, 144, 146, 148, 149, 144, 146, 148, 149,
+ 146, 148, 149, 25, 148, 149, 24, 25, 148, 149,
+ 23, 147, 149, 21, 25, 148, 149, 21, 25, 148,
+ 149, 30, 148, 149, 29, 30, 148, 149, 28, 147,
+ 149, 26, 30, 148, 149, 27, 30, 148, 149, 34,
+ 148, 149, 33, 34, 148, 149, 32, 147, 149, 31,
+ 34, 148, 149, 16, 13, 14, 14, 14, 14, 14,
+ 15,16393,16394,16393,16394,16393,16394,16393,16394,16393,
+
+ 16394, 14,16393,16394, 14,16393,16394, 14,16393,16394,
+ 14,16393,16394, 14,16393,16394, 44, 39, 43, 43,
+ 122, 121, 127, 126, 127, 125, 125, 62, 61, 60,
+ 63, 68, 67, 64, 52,16430, 54, 54, 49, 48,
+ 53, 54, 87, 88, 90, 91, 94, 81, 83, 78,
+ 77, 97, 107, 98, 98, 98, 108, 101, 100, 108,
+ 114, 134, 131, 131, 130, 140, 137, 137, 136, 144,
+ 144, 144, 24, 21, 21, 29, 27, 33, 31, 17,
+ 13, 19, 18, 14, 14, 14, 14,16393,16394,16393,
+ 16394,16393,16394,16393,16394,16393,16394, 8202, 8202, 8202,
+
+ 14,16393,16394, 14,16393,16394, 14,16393,16394, 14,
+ 16393,16394, 36, 39, 38, 37, 43, 119, 120, 68,
+ 47, 8238, 57, 54, 59, 59, 58, 53, 54, 90,
+ 92, 93, 75, 85, 83, 86, 102, 103, 99, 98,
+ 98, 132, 138, 142, 143, 21, 21, 31, 17, 18,
+ 14, 2, 14, 14,16393,16394,16393,16394,16393,16394,
+ 16393,16394, 14,16393,16394, 1, 2, 14,16393,16394,
+ 14,16393,16394, 36, 37, 43, 119, 120, 57, 58,
+ 90, 92, 93, 76, 85, 86, 102, 103, 99, 98,
+ 142, 143, 21, 21, 31, 14, 6, 14,16393,16394,
+
+ 1,16393,16394,16393,16394, 14,16393,16394, 5, 6,
+ 14,16393,16394, 99, 21, 4, 14,16393,16394, 5,
+ 16393,16394, 3, 4, 14,16393,16394,16419, 21, 22,
+ 8, 3,16393,16394, 7, 8,16419, 8227, 22, 7,
+ 8201
+ } ;
+
+static yyconst flex_int16_t yy_accept[435] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 3, 3, 3, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 6, 7, 8, 9, 10, 11, 12, 14, 16,
+ 19, 22, 26, 29, 33, 37, 41, 45, 49, 53,
+ 57, 63, 69, 75, 81, 87, 91, 95, 99, 102,
+ 106, 109, 113, 117, 121, 124, 127, 130, 133, 137,
+ 141, 144, 147, 151, 155, 157, 160, 163, 166, 169,
+ 172, 175, 178, 182, 185, 189, 193, 197, 200, 204,
+
+ 208, 212, 216, 220, 224, 227, 230, 234, 238, 242,
+ 245, 248, 251, 254, 257, 259, 262, 265, 267, 269,
+ 272, 276, 279, 282, 286, 289, 293, 297, 300, 304,
+ 307, 311, 315, 319, 323, 327, 331, 335, 339, 343,
+ 347, 351, 355, 359, 362, 365, 368, 371, 375, 379,
+ 383, 387, 391, 394, 398, 401, 405, 409, 412, 415,
+ 419, 423, 427, 431, 434, 437, 441, 444, 448, 452,
+ 455, 459, 462, 466, 470, 473, 477, 480, 484, 485,
+ 485, 486, 486, 486, 487, 488, 489, 490, 491, 492,
+ 494, 496, 498, 500, 502, 502, 505, 505, 508, 511,
+
+ 514, 517, 518, 518, 519, 519, 519, 520, 521, 522,
+ 522, 522, 523, 524, 524, 525, 526, 527, 528, 528,
+ 529, 530, 531, 532, 533, 534, 535, 536, 537, 537,
+ 537, 537, 538, 539, 539, 540, 541, 543, 544, 545,
+ 545, 546, 546, 547, 547, 547, 548, 549, 549, 549,
+ 549, 550, 550, 551, 552, 553, 553, 554, 554, 554,
+ 555, 556, 557, 557, 558, 559, 560, 561, 562, 563,
+ 563, 564, 565, 566, 567, 567, 568, 569, 570, 571,
+ 571, 572, 573, 574, 574, 574, 575, 576, 577, 578,
+ 579, 579, 579, 580, 581, 582, 583, 584, 585, 586,
+
+ 587, 588, 590, 592, 594, 596, 598, 599, 600, 601,
+ 604, 607, 610, 613, 614, 615, 616, 617, 618, 619,
+ 620, 621, 622, 623, 623, 624, 626, 627, 628, 630,
+ 631, 632, 633, 633, 634, 634, 635, 636, 637, 638,
+ 639, 640, 641, 642, 643, 643, 644, 644, 645, 646,
+ 646, 647, 648, 648, 649, 650, 651, 652, 653, 654,
+ 655, 657, 659, 661, 663, 663, 663, 663, 666, 668,
+ 671, 674, 675, 676, 677, 678, 679, 680, 681, 682,
+ 683, 684, 685, 686, 687, 688, 689, 689, 690, 691,
+ 692, 693, 694, 695, 696, 697, 698, 699, 701, 702,
+
+ 704, 706, 706, 709, 711, 714, 714, 714, 715, 716,
+ 717, 718, 720, 721, 723, 723, 725, 728, 729, 731,
+ 732, 733, 735, 735, 737, 737, 738, 739, 740, 741,
+ 741, 741, 742, 742
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 4, 5, 6, 1, 7, 7, 8, 9,
+ 10, 11, 12, 13, 12, 14, 7, 15, 16, 16,
+ 16, 16, 16, 16, 16, 17, 17, 18, 7, 7,
+ 19, 7, 1, 1, 20, 20, 20, 20, 21, 20,
+ 22, 22, 22, 23, 22, 24, 22, 22, 22, 22,
+ 22, 25, 22, 22, 26, 22, 22, 27, 22, 22,
+ 28, 29, 30, 1, 31, 7, 32, 20, 33, 34,
+
+ 35, 36, 22, 22, 37, 23, 22, 38, 39, 22,
+ 40, 41, 22, 42, 43, 44, 45, 22, 22, 27,
+ 46, 22, 47, 7, 30, 7, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[48] =
+ { 0,
+ 1, 2, 3, 1, 4, 5, 1, 4, 1, 1,
+ 1, 1, 1, 6, 7, 7, 7, 1, 8, 9,
+ 9, 10, 10, 10, 10, 10, 10, 1, 11, 1,
+ 10, 9, 9, 9, 9, 9, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 1
+ } ;
+
+static yyconst flex_int16_t yy_base[499] =
+ { 0,
+ 1535, 1527, 0, 47, 94, 0, 1520, 1515, 140, 144,
+ 147, 152, 158, 0, 205, 0, 251, 258, 264, 266,
+ 279, 0, 326, 0, 373, 381, 385, 392, 400, 0,
+ 1514, 1513, 447, 0, 492, 493, 499, 500, 506, 507,
+ 536, 0, 583, 0, 630, 0, 1515, 1566, 1566, 1566,
+ 1511, 1508, 1503, 1500, 0, 1469, 1471, 1463, 1465, 497,
+ 377, 676, 677, 678, 679, 0, 0, 1496, 1485, 1478,
+ 1566, 0, 1449, 0, 1566, 1566, 1478, 1474, 1479, 0,
+ 256, 1566, 511, 1463, 514, 1566, 1566, 0, 1566, 1451,
+ 0, 1566, 1566, 1449, 1566, 0, 0, 1566, 518, 1445,
+
+ 1443, 1440, 154, 1432, 1566, 1566, 1566, 1566, 1566, 0,
+ 1427, 1566, 1566, 1402, 268, 1566, 1566, 1405, 1390, 516,
+ 0, 1566, 1391, 1391, 0, 1387, 523, 1566, 1385, 1566,
+ 1369, 0, 1361, 1566, 707, 668, 1566, 0, 372, 685,
+ 1566, 694, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
+ 0, 0, 1361, 1566, 684, 0, 1566, 1357, 686, 1335,
+ 1331, 1351, 1345, 700, 1566, 1350, 1566, 699, 702, 1566,
+ 1349, 1566, 1566, 0, 1566, 1340, 1566, 715, 1318, 1315,
+ 0, 0, 1292, 0, 1267, 1258, 1250, 1239, 713, 692,
+ 723, 724, 733, 735, 736, 737, 707, 738, 749, 758,
+
+ 760, 0, 1266, 0, 0, 1261, 0, 1226, 0, 1258,
+ 1254, 1252, 0, 726, 1566, 761, 1247, 1246, 762, 1566,
+ 1566, 0, 1249, 0, 1245, 0, 0, 763, 1236, 1230,
+ 1216, 0, 770, 1208, 779, 1566, 0, 0, 1213, 0,
+ 1200, 781, 1566, 1207, 1203, 784, 0, 1198, 1201, 1197,
+ 0, 1193, 786, 1566, 1198, 1191, 0, 1180, 775, 779,
+ 790, 1566, 0, 0, 1566, 1566, 792, 0, 0, 1181,
+ 1566, 806, 1566, 0, 1173, 1566, 808, 1566, 1144, 813,
+ 1166, 1153, 1158, 764, 1157, 810, 813, 1153, 0, 1143,
+ 817, 1139, 818, 1136, 0, 1566, 1133, 1093, 1133, 1088,
+
+ 1086, 820, 821, 823, 824, 827, 1566, 731, 1083, 828,
+ 831, 833, 836, 1120, 0, 1566, 1116, 1083, 1114, 1113,
+ 0, 1566, 1114, 1113, 1107, 0, 1566, 1097, 0, 962,
+ 971, 970, 0, 971, 970, 967, 0, 966, 965, 964,
+ 846, 1566, 361, 1566, 834, 1566, 842, 960, 947, 941,
+ 846, 856, 920, 863, 1566, 1566, 869, 906, 885, 837,
+ 832, 847, 854, 855, 839, 836, 759, 880, 881, 882,
+ 883, 1566, 1566, 744, 1566, 1566, 1566, 1566, 739, 1566,
+ 1566, 1566, 1566, 1566, 1566, 1566, 874, 1566, 1566, 1566,
+ 1566, 890, 892, 895, 742, 705, 656, 886, 896, 901,
+
+ 905, 486, 908, 909, 911, 0, 901, 916, 912, 504,
+ 390, 917, 919, 933, 243, 935, 938, 939, 946, 266,
+ 940, 942, 213, 943, 944, 947, 1566, 951, 948, 107,
+ 98, 1566, 1566, 977, 988, 999, 1010, 1021, 1032, 1043,
+ 1054, 1065, 1076, 1087, 1098, 1103, 1112, 1121, 1131, 1142,
+ 1147, 1157, 1168, 1173, 1183, 1188, 1198, 1208, 1218, 1229,
+ 1234, 1239, 1249, 1256, 1266, 1277, 1282, 1286, 1296, 1306,
+ 1317, 1327, 1338, 1348, 1352, 1361, 1371, 1382, 1392, 1402,
+ 1413, 1424, 1435, 1445, 1455, 1466, 1469, 1478, 1488, 1493,
+ 1501, 1510, 1515, 1525, 1535, 1544, 1546, 1555
+
+ } ;
+
+static yyconst flex_int16_t yy_def[499] =
+ { 0,
+ 434, 434, 433, 433, 433, 5, 434, 434, 435, 435,
+ 436, 436, 433, 13, 433, 15, 437, 437, 438, 438,
+ 433, 21, 433, 23, 439, 439, 440, 440, 433, 29,
+ 441, 441, 433, 33, 442, 442, 443, 443, 444, 444,
+ 433, 41, 433, 43, 433, 45, 433, 433, 433, 433,
+ 433, 433, 445, 433, 446, 446, 446, 446, 446, 447,
+ 448, 448, 448, 448, 448, 449, 449, 433, 450, 433,
+ 433, 451, 451, 452, 433, 433, 433, 433, 433, 453,
+ 433, 433, 453, 433, 433, 433, 433, 454, 433, 433,
+ 455, 433, 433, 433, 433, 456, 457, 433, 458, 433,
+
+ 459, 433, 433, 460, 433, 433, 433, 433, 433, 461,
+ 433, 433, 433, 462, 433, 433, 433, 433, 433, 433,
+ 463, 433, 464, 433, 465, 433, 433, 433, 433, 433,
+ 433, 466, 433, 433, 433, 433, 433, 467, 467, 467,
+ 433, 467, 433, 433, 433, 433, 433, 433, 433, 433,
+ 468, 469, 433, 433, 470, 471, 433, 433, 472, 473,
+ 473, 433, 433, 473, 433, 433, 433, 474, 474, 433,
+ 433, 433, 433, 475, 433, 433, 433, 476, 433, 433,
+ 477, 478, 433, 446, 446, 446, 446, 446, 447, 479,
+ 479, 479, 479, 479, 433, 448, 480, 448, 448, 448,
+
+ 448, 449, 433, 481, 482, 433, 451, 451, 452, 433,
+ 433, 433, 453, 433, 433, 453, 433, 433, 433, 433,
+ 433, 454, 433, 483, 433, 456, 457, 458, 433, 484,
+ 433, 459, 485, 433, 433, 433, 486, 461, 433, 487,
+ 462, 433, 433, 433, 433, 433, 463, 433, 488, 433,
+ 489, 433, 433, 433, 433, 433, 466, 433, 433, 433,
+ 433, 433, 490, 467, 433, 433, 467, 468, 469, 433,
+ 433, 433, 433, 471, 433, 433, 433, 433, 473, 473,
+ 433, 433, 433, 433, 491, 474, 474, 433, 475, 433,
+ 433, 492, 476, 433, 477, 433, 433, 446, 446, 446,
+
+ 446, 479, 479, 479, 479, 479, 433, 433, 433, 448,
+ 448, 448, 448, 433, 481, 433, 433, 451, 433, 433,
+ 483, 433, 433, 484, 433, 459, 433, 433, 486, 493,
+ 433, 433, 494, 433, 488, 433, 489, 433, 433, 433,
+ 433, 433, 490, 433, 433, 433, 433, 433, 433, 491,
+ 495, 474, 492, 496, 433, 433, 446, 433, 446, 446,
+ 479, 479, 479, 479, 433, 433, 433, 448, 433, 448,
+ 448, 433, 433, 451, 433, 433, 433, 433, 493, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 495, 474, 496, 446, 433, 446, 479, 433, 479,
+
+ 479, 433, 448, 433, 448, 497, 433, 433, 474, 433,
+ 446, 479, 433, 479, 433, 433, 448, 498, 474, 433,
+ 433, 479, 433, 433, 433, 498, 433, 433, 433, 433,
+ 433, 433, 0, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433
+
+ } ;
+
+static yyconst flex_int16_t yy_nxt[1614] =
+ { 0,
+ 50, 50, 51, 50, 52, 53, 50, 54, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 55,
+ 55, 55, 55, 55, 55, 55, 55, 50, 50, 50,
+ 55, 55, 56, 57, 55, 58, 59, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 50, 50, 60, 51,
+ 50, 52, 53, 50, 54, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 61, 61, 61, 61,
+ 61, 61, 61, 61, 50, 50, 50, 61, 61, 62,
+ 63, 61, 64, 65, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 50, 66, 66, 67, 66, 68, 69,
+
+ 66, 70, 66, 66, 66, 66, 66, 71, 66, 66,
+ 66, 66, 66, 72, 72, 72, 72, 72, 72, 72,
+ 72, 66, 66, 66, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 73, 72, 72, 72,
+ 66, 75, 76, 432, 77, 79, 76, 78, 77, 81,
+ 431, 78, 82, 83, 81, 235, 236, 84, 48, 85,
+ 49, 48, 48, 48, 48, 48, 86, 48, 48, 48,
+ 48, 48, 48, 48, 48, 87, 48, 88, 88, 88,
+ 88, 88, 88, 88, 88, 48, 48, 48, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
+
+ 88, 88, 88, 88, 48, 89, 90, 49, 89, 89,
+ 91, 89, 89, 48, 92, 89, 89, 93, 89, 89,
+ 89, 89, 94, 95, 96, 96, 96, 96, 96, 96,
+ 96, 96, 89, 89, 89, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 89, 98, 99, 430, 100, 101, 214, 102, 103,
+ 99, 215, 100, 104, 98, 102, 106, 420, 106, 242,
+ 243, 98, 107, 108, 107, 108, 109, 423, 109, 48,
+ 48, 49, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 110, 110,
+
+ 110, 110, 110, 110, 110, 110, 48, 48, 48, 110,
+ 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+ 110, 110, 110, 110, 110, 48, 48, 111, 49, 48,
+ 48, 48, 48, 48, 112, 112, 48, 48, 112, 48,
+ 48, 48, 48, 113, 48, 114, 114, 114, 114, 114,
+ 114, 114, 114, 48, 48, 48, 114, 114, 114, 114,
+ 114, 114, 114, 114, 114, 114, 114, 114, 114, 114,
+ 114, 114, 48, 48, 115, 116, 265, 118, 195, 266,
+ 119, 48, 120, 116, 389, 118, 122, 123, 119, 124,
+ 125, 420, 126, 127, 123, 197, 124, 125, 389, 126,
+
+ 128, 129, 130, 128, 131, 132, 128, 133, 134, 128,
+ 128, 128, 128, 128, 135, 136, 136, 128, 137, 138,
+ 138, 138, 138, 138, 139, 140, 138, 141, 128, 128,
+ 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 139, 138, 138, 142, 138, 143, 146, 146, 147,
+ 146, 148, 146, 146, 146, 149, 150, 146, 146, 146,
+ 146, 146, 146, 146, 146, 146, 151, 151, 151, 151,
+ 151, 151, 151, 151, 149, 146, 150, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 149, 49, 49, 153, 153, 189, 154,
+
+ 154, 49, 49, 157, 157, 410, 158, 158, 161, 161,
+ 162, 162, 216, 163, 163, 219, 217, 246, 243, 228,
+ 155, 155, 220, 229, 253, 254, 415, 159, 159, 191,
+ 192, 221, 193, 194, 164, 164, 165, 166, 167, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 168, 168, 168, 168, 168,
+ 168, 168, 168, 165, 165, 165, 168, 168, 168, 168,
+ 168, 168, 169, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 165, 170, 171, 172, 170, 170, 170, 170,
+ 170, 170, 170, 173, 170, 170, 170, 170, 170, 170,
+
+ 170, 170, 174, 174, 174, 174, 174, 174, 174, 174,
+ 170, 170, 170, 174, 174, 174, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 174, 174, 174, 170,
+ 175, 176, 177, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 178,
+ 178, 178, 178, 178, 178, 178, 178, 175, 175, 175,
+ 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+ 178, 178, 178, 178, 178, 178, 175, 195, 195, 195,
+ 195, 259, 261, 261, 261, 272, 273, 277, 278, 265,
+ 262, 262, 266, 195, 197, 197, 197, 197, 265, 411,
+
+ 284, 266, 433, 284, 279, 262, 396, 279, 308, 267,
+ 197, 199, 285, 198, 189, 285, 291, 201, 267, 200,
+ 259, 260, 260, 261, 195, 195, 267, 214, 292, 262,
+ 262, 215, 365, 263, 195, 267, 195, 195, 195, 195,
+ 287, 197, 197, 410, 262, 191, 192, 309, 193, 194,
+ 195, 197, 240, 197, 197, 197, 197, 406, 304, 195,
+ 303, 195, 216, 219, 228, 284, 217, 197, 229, 310,
+ 220, 366, 327, 306, 305, 232, 197, 285, 197, 221,
+ 235, 236, 242, 243, 311, 246, 243, 253, 254, 341,
+ 341, 341, 259, 260, 260, 261, 265, 312, 402, 266,
+
+ 313, 262, 342, 259, 261, 261, 261, 345, 273, 347,
+ 278, 284, 262, 262, 284, 433, 342, 279, 291, 291,
+ 279, 195, 195, 285, 195, 195, 285, 262, 195, 195,
+ 292, 292, 369, 195, 195, 345, 273, 195, 197, 197,
+ 365, 197, 197, 347, 278, 197, 197, 284, 399, 197,
+ 197, 197, 361, 352, 197, 195, 195, 284, 362, 285,
+ 341, 341, 341, 363, 291, 197, 387, 364, 388, 285,
+ 368, 370, 197, 197, 398, 371, 292, 367, 397, 366,
+ 387, 195, 369, 404, 195, 407, 396, 195, 408, 408,
+ 408, 284, 400, 284, 401, 393, 291, 399, 197, 197,
+
+ 197, 197, 413, 285, 197, 285, 195, 358, 292, 416,
+ 404, 395, 195, 284, 197, 408, 408, 408, 421, 197,
+ 413, 353, 403, 197, 405, 285, 197, 197, 412, 197,
+ 408, 408, 408, 409, 195, 197, 416, 197, 388, 424,
+ 425, 421, 350, 429, 424, 425, 414, 428, 425, 429,
+ 391, 197, 428, 197, 417, 419, 197, 427, 197, 285,
+ 197, 197, 427, 390, 285, 427, 197, 386, 385, 384,
+ 383, 334, 334, 381, 380, 240, 422, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 80,
+
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
+ 97, 105, 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 144, 144, 144, 144, 144, 144,
+ 144, 144, 144, 144, 144, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 156, 156, 156, 156,
+ 156, 156, 156, 156, 156, 156, 156, 160, 160, 160,
+ 160, 160, 160, 160, 160, 160, 160, 160, 181, 181,
+
+ 378, 181, 181, 181, 181, 181, 181, 181, 181, 184,
+ 377, 184, 184, 190, 323, 323, 376, 375, 374, 373,
+ 190, 190, 196, 372, 367, 360, 359, 196, 196, 196,
+ 196, 202, 202, 202, 358, 357, 356, 202, 202, 355,
+ 353, 202, 204, 204, 290, 204, 204, 204, 204, 204,
+ 204, 204, 204, 207, 288, 207, 207, 209, 350, 283,
+ 349, 209, 209, 209, 209, 209, 209, 209, 213, 213,
+ 348, 213, 280, 213, 213, 213, 213, 213, 213, 222,
+ 346, 222, 222, 224, 224, 344, 224, 340, 224, 224,
+ 224, 224, 224, 224, 226, 339, 226, 226, 227, 255,
+
+ 338, 336, 334, 333, 227, 227, 227, 227, 227, 230,
+ 332, 331, 230, 240, 239, 328, 230, 230, 232, 232,
+ 325, 232, 232, 232, 232, 232, 232, 232, 232, 237,
+ 237, 323, 237, 237, 237, 237, 237, 237, 237, 237,
+ 238, 322, 238, 238, 241, 241, 225, 241, 241, 247,
+ 223, 218, 218, 212, 247, 247, 247, 247, 247, 247,
+ 249, 320, 319, 318, 249, 249, 251, 251, 317, 251,
+ 314, 251, 251, 251, 251, 251, 251, 257, 257, 301,
+ 257, 257, 257, 257, 257, 257, 257, 257, 264, 300,
+ 264, 264, 268, 299, 268, 268, 269, 269, 298, 297,
+
+ 269, 269, 269, 269, 269, 269, 271, 271, 271, 271,
+ 271, 271, 271, 271, 271, 271, 271, 274, 274, 294,
+ 179, 274, 274, 274, 274, 274, 274, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 279, 279,
+ 279, 290, 279, 279, 279, 279, 279, 279, 279, 286,
+ 288, 283, 282, 286, 286, 281, 286, 286, 289, 280,
+ 289, 289, 293, 280, 275, 270, 293, 293, 258, 293,
+ 293, 295, 295, 256, 295, 295, 295, 295, 295, 295,
+ 295, 295, 296, 296, 296, 296, 255, 296, 296, 296,
+ 296, 296, 296, 302, 252, 250, 248, 245, 302, 302,
+
+ 302, 302, 307, 307, 307, 307, 307, 307, 307, 244,
+ 307, 307, 307, 315, 315, 240, 315, 315, 315, 315,
+ 315, 315, 315, 315, 316, 316, 316, 316, 239, 316,
+ 316, 316, 316, 316, 316, 321, 321, 233, 321, 321,
+ 321, 321, 321, 321, 321, 321, 324, 234, 233, 231,
+ 225, 324, 223, 324, 324, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 329, 329, 218, 329,
+ 329, 329, 329, 329, 329, 329, 329, 330, 330, 335,
+ 212, 211, 210, 208, 335, 206, 335, 335, 337, 337,
+ 205, 337, 337, 337, 337, 337, 337, 337, 337, 343,
+
+ 203, 343, 351, 188, 187, 186, 185, 183, 182, 351,
+ 351, 354, 180, 179, 433, 145, 145, 49, 354, 354,
+ 379, 379, 49, 379, 379, 382, 382, 382, 382, 49,
+ 382, 382, 382, 382, 382, 382, 392, 49, 433, 433,
+ 392, 392, 433, 392, 392, 394, 433, 433, 433, 394,
+ 394, 433, 394, 394, 418, 418, 426, 433, 433, 433,
+ 433, 426, 426, 426, 426, 47, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433
+ } ;
+
+static yyconst flex_int16_t yy_chk[1614] =
+ { 0,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 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, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 9, 9, 431, 9, 10, 10, 9, 10, 11,
+ 430, 10, 11, 12, 12, 103, 103, 12, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+
+ 13, 13, 13, 13, 13, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 17, 17, 423, 17, 17, 81, 17, 18,
+ 18, 81, 18, 18, 17, 18, 19, 420, 20, 115,
+ 115, 18, 19, 19, 20, 20, 19, 415, 20, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 25, 25, 25, 139, 25, 61, 139,
+ 25, 26, 26, 26, 343, 26, 27, 27, 26, 27,
+ 27, 411, 27, 28, 28, 61, 28, 28, 343, 28,
+
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 35, 36, 35, 36, 60, 35,
+
+ 36, 37, 38, 37, 38, 410, 37, 38, 39, 40,
+ 39, 40, 83, 39, 40, 85, 83, 120, 120, 99,
+ 35, 36, 85, 99, 127, 127, 402, 37, 38, 60,
+ 60, 85, 60, 60, 39, 40, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 62, 63, 64,
+ 65, 136, 136, 136, 136, 155, 155, 159, 159, 140,
+ 136, 136, 140, 190, 62, 63, 64, 65, 142, 397,
+
+ 168, 142, 164, 169, 164, 136, 396, 164, 197, 140,
+ 190, 63, 168, 62, 189, 169, 178, 65, 142, 64,
+ 135, 135, 135, 135, 191, 192, 140, 214, 178, 135,
+ 135, 214, 308, 135, 193, 142, 194, 195, 196, 198,
+ 169, 191, 192, 395, 135, 189, 189, 197, 189, 189,
+ 199, 193, 379, 194, 195, 196, 198, 374, 192, 200,
+ 191, 201, 216, 219, 228, 284, 216, 199, 228, 198,
+ 219, 308, 233, 194, 193, 233, 200, 284, 201, 219,
+ 235, 235, 242, 242, 199, 246, 246, 253, 253, 259,
+ 259, 259, 260, 260, 260, 260, 267, 200, 367, 267,
+
+ 201, 260, 260, 261, 261, 261, 261, 272, 272, 277,
+ 277, 286, 261, 261, 287, 280, 260, 280, 291, 293,
+ 280, 302, 303, 286, 304, 305, 287, 261, 306, 310,
+ 291, 293, 311, 361, 312, 345, 345, 313, 302, 303,
+ 365, 304, 305, 347, 347, 306, 310, 351, 362, 311,
+ 361, 312, 303, 287, 313, 363, 364, 352, 304, 351,
+ 341, 341, 341, 305, 354, 362, 341, 306, 341, 352,
+ 310, 312, 363, 364, 361, 313, 354, 366, 360, 365,
+ 341, 368, 369, 370, 371, 387, 359, 398, 387, 387,
+ 387, 392, 363, 393, 364, 352, 394, 399, 368, 369,
+
+ 370, 371, 400, 392, 398, 393, 401, 358, 394, 403,
+ 404, 357, 405, 409, 399, 407, 407, 407, 412, 400,
+ 413, 353, 368, 401, 371, 409, 403, 404, 398, 405,
+ 408, 408, 408, 393, 414, 412, 416, 413, 408, 417,
+ 418, 421, 350, 422, 424, 425, 401, 419, 426, 429,
+ 349, 414, 428, 416, 405, 409, 417, 418, 421, 419,
+ 422, 424, 425, 348, 428, 426, 429, 340, 339, 338,
+ 336, 335, 334, 332, 331, 330, 414, 434, 434, 434,
+ 434, 434, 434, 434, 434, 434, 434, 434, 435, 435,
+ 435, 435, 435, 435, 435, 435, 435, 435, 435, 436,
+
+ 436, 436, 436, 436, 436, 436, 436, 436, 436, 436,
+ 437, 437, 437, 437, 437, 437, 437, 437, 437, 437,
+ 437, 438, 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 439, 439, 439, 439, 439, 439, 439, 439,
+ 439, 439, 439, 440, 440, 440, 440, 440, 440, 440,
+ 440, 440, 440, 440, 441, 441, 441, 441, 441, 441,
+ 441, 441, 441, 441, 441, 442, 442, 442, 442, 442,
+ 442, 442, 442, 442, 442, 442, 443, 443, 443, 443,
+ 443, 443, 443, 443, 443, 443, 443, 444, 444, 444,
+ 444, 444, 444, 444, 444, 444, 444, 444, 445, 445,
+
+ 328, 445, 445, 445, 445, 445, 445, 445, 445, 446,
+ 325, 446, 446, 447, 324, 323, 320, 319, 318, 317,
+ 447, 447, 448, 314, 309, 301, 300, 448, 448, 448,
+ 448, 449, 449, 449, 299, 298, 297, 449, 449, 294,
+ 292, 449, 450, 450, 290, 450, 450, 450, 450, 450,
+ 450, 450, 450, 451, 288, 451, 451, 452, 285, 283,
+ 282, 452, 452, 452, 452, 452, 452, 452, 453, 453,
+ 281, 453, 279, 453, 453, 453, 453, 453, 453, 454,
+ 275, 454, 454, 455, 455, 270, 455, 258, 455, 455,
+ 455, 455, 455, 455, 456, 256, 456, 456, 457, 255,
+
+ 252, 250, 249, 248, 457, 457, 457, 457, 457, 458,
+ 245, 244, 458, 241, 239, 234, 458, 458, 459, 459,
+ 231, 459, 459, 459, 459, 459, 459, 459, 459, 460,
+ 460, 230, 460, 460, 460, 460, 460, 460, 460, 460,
+ 461, 229, 461, 461, 462, 462, 225, 462, 462, 463,
+ 223, 218, 217, 212, 463, 463, 463, 463, 463, 463,
+ 464, 211, 210, 208, 464, 464, 465, 465, 206, 465,
+ 203, 465, 465, 465, 465, 465, 465, 466, 466, 188,
+ 466, 466, 466, 466, 466, 466, 466, 466, 467, 187,
+ 467, 467, 468, 186, 468, 468, 469, 469, 185, 183,
+
+ 469, 469, 469, 469, 469, 469, 470, 470, 470, 470,
+ 470, 470, 470, 470, 470, 470, 470, 471, 471, 180,
+ 179, 471, 471, 471, 471, 471, 471, 472, 472, 472,
+ 472, 472, 472, 472, 472, 472, 472, 472, 473, 473,
+ 473, 176, 473, 473, 473, 473, 473, 473, 473, 474,
+ 171, 166, 163, 474, 474, 162, 474, 474, 475, 161,
+ 475, 475, 476, 160, 158, 153, 476, 476, 133, 476,
+ 476, 477, 477, 131, 477, 477, 477, 477, 477, 477,
+ 477, 477, 478, 478, 478, 478, 129, 478, 478, 478,
+ 478, 478, 478, 479, 126, 124, 123, 119, 479, 479,
+
+ 479, 479, 480, 480, 480, 480, 480, 480, 480, 118,
+ 480, 480, 480, 481, 481, 114, 481, 481, 481, 481,
+ 481, 481, 481, 481, 482, 482, 482, 482, 111, 482,
+ 482, 482, 482, 482, 482, 483, 483, 104, 483, 483,
+ 483, 483, 483, 483, 483, 483, 484, 102, 101, 100,
+ 94, 484, 90, 484, 484, 485, 485, 485, 485, 485,
+ 485, 485, 485, 485, 485, 485, 486, 486, 84, 486,
+ 486, 486, 486, 486, 486, 486, 486, 487, 487, 488,
+ 79, 78, 77, 73, 488, 70, 488, 488, 489, 489,
+ 69, 489, 489, 489, 489, 489, 489, 489, 489, 490,
+
+ 68, 490, 491, 59, 58, 57, 56, 54, 53, 491,
+ 491, 492, 52, 51, 47, 32, 31, 8, 492, 492,
+ 493, 493, 7, 493, 493, 494, 494, 494, 494, 2,
+ 494, 494, 494, 494, 494, 494, 495, 1, 0, 0,
+ 495, 495, 0, 495, 495, 496, 0, 0, 0, 496,
+ 496, 0, 496, 496, 497, 497, 498, 0, 0, 0,
+ 0, 498, 498, 498, 498, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433
+ } ;
+
+extern int pyscanYY_flex_debug;
+int pyscanYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *pyscanYYtext;
+#line 1 "pyscanner.l"
+/******************************************************************************
+ *
+ * $Id: pyscanner.l,v 1.9 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/* This code is based on the work done by the MoxyPyDoxy team
+ * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
+ * in Spring 2005 as part of CS 179E: Compiler Design Project
+ * at the University of California, Riverside; the course was
+ * taught by Peter H. Froehlich <phf@acm.org>.
+ */
+#line 26 "pyscanner.l"
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qregexp.h>
+#include <unistd.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+
+#include "pyscanner.h"
+#include "entry.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+#include "defargs.h"
+#include "language.h"
+#include "commentscan.h"
+#include "pycode.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+
+
+static ParserInterface *g_thisParser;
+static const char * inputString;
+static int inputPosition;
+static QFile inputFile;
+
+static Protection protection;
+
+static Entry* current_root = 0 ;
+static Entry* current = 0 ;
+static Entry* previous = 0 ;
+static Entry* bodyEntry = 0 ;
+static int yyLineNr = 1 ;
+static QCString yyFileName;
+static MethodTypes mtype;
+static bool gstat;
+static Specifier virt;
+
+static int docBlockContext;
+static QCString docBlock;
+static QCString docBlockName;
+static bool docBlockInBody;
+static bool docBlockJavaStyle;
+static bool docBrief;
+static bool docBlockSpecial;
+
+static bool g_doubleQuote;
+static bool g_specialBlock;
+static int g_stringContext;
+static QGString * g_copyString;
+static int g_indent = 0;
+static int g_curIndent = 0;
+
+static QDict<QCString> g_packageNameCache(257);
+static QCString g_packageScope;
+
+static char g_atomStart;
+static char g_atomEnd;
+static int g_atomCount;
+
+//static bool g_insideConstructor;
+
+static QCString g_moduleScope;
+static QCString g_packageName;
+
+static bool g_hideClassDocs;
+
+static QCString g_defVal;
+static int g_braceCount;
+
+static bool g_lexInit = FALSE;
+static bool g_packageCommentAllowed;
+
+//-----------------------------------------------------------------------------
+
+
+static void initParser()
+{
+ protection = Public;
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ previous = 0;
+ g_packageCommentAllowed = TRUE;
+ g_packageNameCache.setAutoDelete(TRUE);
+}
+
+static void initEntry()
+{
+ //current->python = TRUE;
+ current->protection = protection ;
+ current->mtype = mtype;
+ current->virt = virt;
+ current->stat = gstat;
+ current->lang = SrcLangExt_Python;
+ current->setParent(current_root);
+ initGroupInfo(current);
+}
+
+static void newEntry()
+{
+ previous = current;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+}
+
+static void newVariable()
+{
+ if (!current->name.isEmpty() && current->name.at(0)=='_') // mark as private
+ {
+ current->protection=Private;
+ }
+ if (current_root->section&Entry::COMPOUND_MASK) // mark as class variable
+ {
+ current->stat = TRUE;
+ }
+ newEntry();
+}
+
+static void newFunction()
+{
+ if (current->name.left(2)=="__" && current->name.right(2)=="__")
+ {
+ // special method name, see
+ // http://docs.python.org/ref/specialnames.html
+ current->protection=Public;
+ }
+ else if (current->name.at(0)=='_')
+ {
+ current->protection=Private;
+ }
+}
+
+static inline int computeIndent(const char *s)
+{
+ int col=0;
+ static int tabSize=Config_getInt("TAB_SIZE");
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ if (c==' ') col++;
+ else if (c=='\t') col+=tabSize-(col%tabSize);
+ else break;
+ }
+ return col;
+}
+
+static QCString findPackageScopeFromPath(const QCString &path)
+{
+ QCString *pScope = g_packageNameCache.find(path);
+ if (pScope)
+ {
+ return *pScope;
+ }
+ QFileInfo pf(path+"/__init__.py"); // found package initialization file
+ if (pf.exists())
+ {
+ int i=path.findRev('/');
+ if (i!=-1)
+ {
+ QCString scope = findPackageScopeFromPath(path.left(i));
+ if (!scope.isEmpty())
+ {
+ scope+="::";
+ }
+ scope+=path.mid(i+1);
+ g_packageNameCache.insert(path,new QCString(scope));
+ return scope;
+ }
+ }
+ return "";
+}
+
+static QCString findPackageScope(const char *fileName)
+{
+ if (fileName==0) return "";
+ QFileInfo fi(fileName);
+ return findPackageScopeFromPath(fi.dirPath(TRUE).data());
+}
+
+//-----------------------------------------------------------------------------
+
+static void lineCount()
+{
+ for( const char* c = pyscanYYtext ; *c ; ++c )
+ yyLineNr += (*c == '\n') ;
+}
+
+#if 0
+// Appends the current-name to current-type;
+// Destroys current-name.
+// Destroys current->args and current->argList
+static void addType( Entry* current )
+{
+ uint tl=current->type.length();
+ if ( tl>0 && !current->name.isEmpty() && current->type.at(tl-1)!='.')
+ {
+ current->type += ' ' ;
+ }
+ current->type += current->name ;
+ current->name.resize(0) ;
+ tl=current->type.length();
+ if ( tl>0 && !current->args.isEmpty() && current->type.at(tl-1)!='.')
+ {
+ current->type += ' ' ;
+ }
+ current->type += current->args ;
+ current->args.resize(0) ;
+ current->argList->clear();
+}
+
+static QCString stripQuotes(const char *s)
+{
+ QCString name;
+ if (s==0 || *s==0) return name;
+ name=s;
+ if (name.at(0)=='"' && name.at(name.length()-1)=='"')
+ {
+ name=name.mid(1,name.length()-2);
+ }
+ return name;
+}
+#endif
+//-----------------------------------------------------------------
+
+//-----------------------------------------------------------------
+static void startCommentBlock(bool brief)
+{
+ if (brief)
+ {
+ current->briefFile = yyFileName;
+ current->briefLine = yyLineNr;
+ }
+ else
+ {
+ current->docFile = yyFileName;
+ current->docLine = yyLineNr;
+ }
+}
+
+/*
+static void appendDocBlock() {
+ previous = current;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ initEntry();
+}
+*/
+
+static void handleCommentBlock(const QCString &doc,bool brief)
+{
+ //printf("handleCommentBlock(doc=[%s] brief=%d docBlockInBody=%d docBlockJavaStyle=%d\n",
+ // doc.data(),brief,docBlockInBody,docBlockJavaStyle);
+
+ // TODO: Fix me
+ docBlockInBody=FALSE;
+
+ if (docBlockInBody && previous && !previous->doc.isEmpty())
+ {
+ previous->doc=previous->doc.stripWhiteSpace()+"\n\n";
+ }
+
+ int position = 0;
+ bool needsEntry;
+ int lineNr = brief ? current->briefLine : current->docLine;
+ while (parseCommentBlock(
+ g_thisParser,
+ (docBlockInBody && previous) ? previous : current,
+ doc, // text
+ yyFileName, // file
+ lineNr,
+ docBlockInBody ? FALSE : brief,
+ docBlockJavaStyle, // javadoc style // or FALSE,
+ docBlockInBody,
+ protection,
+ position,
+ needsEntry)
+ ) // need to start a new entry
+ {
+ if (needsEntry)
+ {
+ newEntry();
+ }
+ }
+ if (needsEntry)
+ {
+ newEntry();
+ }
+
+}
+
+static void endOfDef(int correction=0)
+{
+ if (bodyEntry)
+ {
+ bodyEntry->endBodyLine = yyLineNr-correction;
+ bodyEntry = 0;
+ }
+ newEntry();
+ //g_insideConstructor = FALSE;
+}
+
+static inline void addToString(const char *s)
+{
+ if (g_copyString) (*g_copyString)+=s;
+}
+
+static void initTriDoubleQuoteBlock()
+{
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockJavaStyle = TRUE;
+ docBlockSpecial = pyscanYYtext[3]=='!';
+ docBlock.resize(0);
+ g_doubleQuote = TRUE;
+ startCommentBlock(FALSE);
+}
+
+static void initTriSingleQuoteBlock()
+{
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockJavaStyle = TRUE;
+ docBlockSpecial = pyscanYYtext[3]=='!';
+ docBlock.resize(0);
+ g_doubleQuote = FALSE;
+ startCommentBlock(FALSE);
+}
+
+static void initSpecialBlock()
+{
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockJavaStyle = TRUE;
+ docBrief = TRUE;
+ docBlock.resize(0);
+ startCommentBlock(TRUE);
+}
+
+static void searchFoundDef()
+{
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ current->section = Entry::FUNCTION_SEC;
+ current->protection = protection = Public;
+ current->lang = SrcLangExt_Python;
+ current->virt = Normal;
+ current->stat = FALSE;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ g_packageCommentAllowed = FALSE;
+}
+
+static void searchFoundClass()
+{
+ current->section = Entry::CLASS_SEC;
+ current->argList->clear();
+ current->type += "class" ;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr;
+ g_packageCommentAllowed = FALSE;
+}
+
+//-----------------------------------------------------------------------------
+/* ----------------------------------------------------------------- */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while ( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ //printf("%d (%c)\n",*buf,*buf);
+ c++; buf++;
+ }
+ return c;
+}
+
+/* start command character */
+/* Main start state */
+
+
+/* Mid-comment states */
+/* %x FuncDoubleComment */
+/* %x ClassDoubleComment */
+
+
+
+/* Function states */
+
+
+
+
+/* Class states */
+
+
+
+
+/* Variable states */
+
+
+
+/* String states */
+
+
+
+/* import */
+
+
+
+#line 1538 "<stdout>"
+
+#define INITIAL 0
+#define Search 1
+#define SearchMemVars 2
+#define TryClassDocString 3
+#define TripleComment 4
+#define SpecialComment 5
+#define FunctionDec 6
+#define FunctionParams 7
+#define FunctionBody 8
+#define FunctionParamDefVal 9
+#define ClassDec 10
+#define ClassInheritance 11
+#define ClassCaptureIndent 12
+#define ClassBody 13
+#define VariableDec 14
+#define VariableEnd 15
+#define VariableAtom 16
+#define SingleQuoteString 17
+#define DoubleQuoteString 18
+#define TripleString 19
+#define FromMod 20
+#define FromModItem 21
+#define Import 22
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int pyscanYYlex_destroy (void );
+
+int pyscanYYget_debug (void );
+
+void pyscanYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE pyscanYYget_extra (void );
+
+void pyscanYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *pyscanYYget_in (void );
+
+void pyscanYYset_in (FILE * in_str );
+
+FILE *pyscanYYget_out (void );
+
+void pyscanYYset_out (FILE * out_str );
+
+yy_size_t pyscanYYget_leng (void );
+
+char *pyscanYYget_text (void );
+
+int pyscanYYget_lineno (void );
+
+void pyscanYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int pyscanYYwrap (void );
+#else
+extern int pyscanYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( pyscanYYtext, pyscanYYleng, 1, pyscanYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( pyscanYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( pyscanYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, pyscanYYin))==0 && ferror(pyscanYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(pyscanYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int pyscanYYlex (void);
+
+#define YY_DECL int pyscanYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after pyscanYYtext and pyscanYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( pyscanYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (pyscanYYtext[pyscanYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 518 "pyscanner.l"
+
+
+ /* ------------ Function recognition rules -------------- */
+
+#line 1750 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)pyscanYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in pyscanYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! pyscanYYin )
+ pyscanYYin = stdin;
+
+ if ( ! pyscanYYout )
+ pyscanYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ pyscanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ pyscanYY_create_buffer(pyscanYYin,YY_BUF_SIZE );
+ }
+
+ pyscanYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of pyscanYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 434 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 1566 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+
+case 1:
+YY_RULE_SETUP
+#line 524 "pyscanner.l"
+{ // start of a function/method definition with indent
+ g_indent=computeIndent(pyscanYYtext);
+ searchFoundDef();
+ BEGIN( FunctionDec );
+ }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 529 "pyscanner.l"
+{ // start of a function/method definition
+ searchFoundDef();
+ BEGIN( FunctionDec );
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 534 "pyscanner.l"
+{ // start of a class definition with indent
+ g_indent=computeIndent(pyscanYYtext);
+ searchFoundClass();
+ BEGIN( ClassDec ) ;
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 539 "pyscanner.l"
+{ // start of a class definition
+ searchFoundClass();
+ BEGIN( ClassDec ) ;
+ }
+ YY_BREAK
+case 5:
+#line 544 "pyscanner.l"
+case 6:
+YY_RULE_SETUP
+#line 544 "pyscanner.l"
+{ // start of an from import
+ g_packageCommentAllowed = FALSE;
+ BEGIN( FromMod );
+ }
+ YY_BREAK
+case 7:
+#line 550 "pyscanner.l"
+case 8:
+YY_RULE_SETUP
+#line 550 "pyscanner.l"
+{ // start of an import statement
+ g_packageCommentAllowed = FALSE;
+ BEGIN( Import );
+ }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 554 "pyscanner.l"
+{ // property
+ current->section = Entry::VARIABLE_SEC;
+ current->mtype = Property;
+ current->name = QCString(pyscanYYtext).stripWhiteSpace();
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ g_packageCommentAllowed = FALSE;
+ BEGIN(VariableDec);
+ }
+ YY_BREAK
+case 10:
+/* rule 10 can match eol */
+YY_RULE_SETUP
+#line 564 "pyscanner.l"
+{ // variable
+ g_indent=computeIndent(pyscanYYtext);
+ current->section = Entry::VARIABLE_SEC;
+ current->name = QCString(pyscanYYtext).stripWhiteSpace();
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ g_packageCommentAllowed = FALSE;
+ BEGIN(VariableDec);
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 574 "pyscanner.l"
+{ // start of a single quoted string
+ g_stringContext=YY_START;
+ g_copyString=0;
+ g_packageCommentAllowed = FALSE;
+ BEGIN( SingleQuoteString );
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 580 "pyscanner.l"
+{ // start of a double quoted string
+ g_stringContext=YY_START;
+ g_copyString=0;
+ g_packageCommentAllowed = FALSE;
+ BEGIN( DoubleQuoteString );
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 587 "pyscanner.l"
+{ // normal comment
+ g_packageCommentAllowed = FALSE;
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 590 "pyscanner.l"
+{ // some other identifier
+ g_packageCommentAllowed = FALSE;
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 593 "pyscanner.l"
+{
+ g_curIndent=computeIndent(pyscanYYtext);
+ }
+ YY_BREAK
+case 16:
+/* rule 16 can match eol */
+YY_RULE_SETUP
+#line 597 "pyscanner.l"
+{ // new line
+ lineCount();
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 601 "pyscanner.l"
+{ // start of a comment block
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 606 "pyscanner.l"
+{ // start of a comment block
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+case 19:
+/* rule 19 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */
+YY_RULE_SETUP
+#line 611 "pyscanner.l"
+{ // start of a special comment
+ g_curIndent=computeIndent(pyscanYYtext);
+ g_packageCommentAllowed = FALSE;
+ initSpecialBlock();
+ BEGIN(SpecialComment);
+ }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 617 "pyscanner.l"
+{ // any other character...
+ // This is the major default
+ // that should catch everything
+ // else in Body.
+ }
+ YY_BREAK
+
+
+case 21:
+YY_RULE_SETUP
+#line 625 "pyscanner.l"
+{ // from package import
+ g_packageName=pyscanYYtext;
+ }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 628 "pyscanner.l"
+{
+ BEGIN(FromModItem);
+ }
+ YY_BREAK
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+#line 631 "pyscanner.l"
+{
+ yyLineNr++;
+ BEGIN(Search);
+ }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 635 "pyscanner.l"
+{
+ }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 637 "pyscanner.l"
+{
+ unput(*pyscanYYtext);
+ BEGIN(Search);
+ }
+ YY_BREAK
+
+
+case 26:
+YY_RULE_SETUP
+#line 644 "pyscanner.l"
+{ // import all
+ QCString item=g_packageName;
+ current->name=removeRedundantWhiteSpace(substitute(item,".","::"));
+ current->fileName = yyFileName;
+ //printf("Adding using directive: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Search);
+ }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 655 "pyscanner.l"
+{
+ QCString item=g_packageName+"."+pyscanYYtext;
+ current->name=removeRedundantWhiteSpace(substitute(item,".","::"));
+ current->fileName = yyFileName;
+ //printf("Adding using declaration: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Search);
+ }
+ YY_BREAK
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+#line 666 "pyscanner.l"
+{
+ yyLineNr++;
+ BEGIN(Search);
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 670 "pyscanner.l"
+{
+ }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 672 "pyscanner.l"
+{
+ unput(*pyscanYYtext);
+ BEGIN(Search);
+ }
+ YY_BREAK
+
+
+case 31:
+YY_RULE_SETUP
+#line 679 "pyscanner.l"
+{
+ current->name=removeRedundantWhiteSpace(substitute(pyscanYYtext,".","::"));
+ current->fileName = yyFileName;
+ //printf("Adding using declaration: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Search);
+ }
+ YY_BREAK
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 689 "pyscanner.l"
+{
+ yyLineNr++;
+ BEGIN(Search);
+ }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 693 "pyscanner.l"
+{
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 695 "pyscanner.l"
+{
+ unput(*pyscanYYtext);
+ BEGIN(Search);
+ }
+ YY_BREAK
+
+
+case 35:
+YY_RULE_SETUP
+#line 702 "pyscanner.l"
+{
+ //printf("Found member variable %s in %s\n",&pyscanYYtext[5],current_root->name.data());
+ current->name=&pyscanYYtext[5];
+ current->section=Entry::VARIABLE_SEC;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ current->type.resize(0);
+ if (current->name.at(0)=='_') // mark as private
+ {
+ current->protection=Private;
+ }
+ else
+ {
+ current->protection=Public;
+ }
+ newEntry();
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 720 "pyscanner.l"
+{ // start of a comment block
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 725 "pyscanner.l"
+{ // start of a comment block
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+case 38:
+/* rule 38 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */
+YY_RULE_SETUP
+#line 730 "pyscanner.l"
+{ // start of a special comment
+ initSpecialBlock();
+ BEGIN(SpecialComment);
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 734 "pyscanner.l"
+{ // #
+ }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 736 "pyscanner.l"
+{ // start of a single quoted string
+ g_stringContext=YY_START;
+ g_copyString=0;
+ BEGIN( SingleQuoteString );
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 741 "pyscanner.l"
+{ // start of a double quoted string
+ g_stringContext=YY_START;
+ g_copyString=0;
+ BEGIN( DoubleQuoteString );
+ }
+ YY_BREAK
+case 42:
+/* rule 42 can match eol */
+YY_RULE_SETUP
+#line 746 "pyscanner.l"
+{ yyLineNr++; }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 747 "pyscanner.l"
+// identifiers
+ YY_BREAK
+case 44:
+/* rule 44 can match eol */
+YY_RULE_SETUP
+#line 748 "pyscanner.l"
+// other uninteresting stuff
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 749 "pyscanner.l"
+// anything else
+ YY_BREAK
+
+
+case 46:
+/* rule 46 can match eol */
+YY_RULE_SETUP
+#line 753 "pyscanner.l"
+{
+ //fprintf(stderr,"indent %d<=%d\n",computeIndent(&pyscanYYtext[1]),g_indent);
+ if (computeIndent(&pyscanYYtext[1])<=g_indent)
+ {
+ int i;
+ for (i=pyscanYYleng-1;i>=0;i--)
+ {
+ unput(pyscanYYtext[i]);
+ }
+ endOfDef();
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ BEGIN(Search);
+ }
+ else
+ {
+ yyLineNr++;
+ current->program+=pyscanYYtext;
+ }
+ }
+ YY_BREAK
+case 47:
+/* rule 47 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */
+(yy_c_buf_p) = yy_cp -= 2;
+YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */
+YY_RULE_SETUP
+#line 772 "pyscanner.l"
+{
+ if (computeIndent(&pyscanYYtext[1])<=g_indent)
+ {
+ int i;
+ for (i=pyscanYYleng-1;i>=0;i--)
+ {
+ unput(pyscanYYtext[i]);
+ }
+ endOfDef();
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ BEGIN(Search);
+ }
+ else
+ {
+ yyLineNr++;
+ current->program+=pyscanYYtext;
+ }
+ }
+ YY_BREAK
+case YY_STATE_EOF(FunctionBody):
+#line 790 "pyscanner.l"
+{
+ endOfDef();
+ yyterminate();
+ }
+ YY_BREAK
+case 48:
+/* rule 48 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */
+YY_RULE_SETUP
+#line 794 "pyscanner.l"
+{ // skip empty line
+ current->program+=pyscanYYtext;
+ }
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 797 "pyscanner.l"
+{ // something at indent >0
+ current->program+=pyscanYYtext;
+ g_curIndent = computeIndent(pyscanYYtext);
+ if (g_curIndent<=g_indent)
+ // jumped out of the function
+ {
+ endOfDef(1);
+ BEGIN(Search);
+ }
+ }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 807 "pyscanner.l"
+{ // start of a single quoted string
+ current->program+=pyscanYYtext;
+ g_stringContext=YY_START;
+ g_specialBlock = FALSE;
+ g_copyString=&current->program;
+ BEGIN( SingleQuoteString );
+ }
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 814 "pyscanner.l"
+{ // start of a double quoted string
+ current->program+=pyscanYYtext;
+ g_stringContext=YY_START;
+ g_specialBlock = FALSE;
+ g_copyString=&current->program;
+ BEGIN( DoubleQuoteString );
+ }
+ YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 821 "pyscanner.l"
+{ // non-special stuff
+ current->program+=pyscanYYtext;
+ g_specialBlock = FALSE;
+ }
+ YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 825 "pyscanner.l"
+{ // normal comment
+ current->program+=pyscanYYtext;
+ }
+ YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 828 "pyscanner.l"
+{ // comment half way
+ current->program+=pyscanYYtext;
+ }
+ YY_BREAK
+case 55:
+/* rule 55 can match eol */
+YY_RULE_SETUP
+#line 831 "pyscanner.l"
+{ yyLineNr++;
+ current->program+=pyscanYYtext;
+ }
+ YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 834 "pyscanner.l"
+{ // any character
+ current->program+=*pyscanYYtext;
+ g_specialBlock = FALSE;
+ }
+ YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 839 "pyscanner.l"
+{ // start of a comment block
+ current->program+=pyscanYYtext;
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 845 "pyscanner.l"
+{ // start of a comment block
+ current->program+=pyscanYYtext;
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+case 59:
+/* rule 59 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */
+YY_RULE_SETUP
+#line 851 "pyscanner.l"
+{ // start of a special comment
+ initSpecialBlock();
+ BEGIN(SpecialComment);
+ }
+ YY_BREAK
+
+
+case 60:
+YY_RULE_SETUP
+#line 860 "pyscanner.l"
+{
+ //found function name
+ if (current->type.isEmpty())
+ {
+ current->type = "def";
+ }
+ current->name = pyscanYYtext;
+ current->name = current->name.stripWhiteSpace();
+ newFunction();
+ }
+ YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 870 "pyscanner.l"
+{ // function without arguments
+ g_specialBlock = TRUE; // expecting a docstring
+ bodyEntry = current;
+ BEGIN( FunctionBody );
+ }
+ YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 876 "pyscanner.l"
+{
+ BEGIN( FunctionParams );
+ }
+ YY_BREAK
+
+
+case 63:
+YY_RULE_SETUP
+#line 882 "pyscanner.l"
+{
+ }
+ YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 885 "pyscanner.l"
+{ // Name of parameter
+ lineCount();
+ Argument *a = new Argument;
+ current->argList->append(a);
+ current->argList->getLast()->name = QCString(pyscanYYtext).stripWhiteSpace();
+ current->argList->getLast()->type = "";
+ }
+ YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 892 "pyscanner.l"
+{ // default value
+ // TODO: this rule is too simple, need to be able to
+ // match things like =")" as well!
+ QCString defVal=&pyscanYYtext[1];
+ g_defVal.resize(0);
+ g_braceCount=0;
+ BEGIN(FunctionParamDefVal);
+ }
+ YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 901 "pyscanner.l"
+{ // end of parameter list
+ }
+ YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 904 "pyscanner.l"
+{
+ g_specialBlock = TRUE; // expecting a docstring
+ bodyEntry = current;
+ BEGIN( FunctionBody );
+ }
+ YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 909 "pyscanner.l"
+{ // a comment
+ }
+ YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 911 "pyscanner.l"
+{ // Default rule inside arguments.
+ }
+ YY_BREAK
+
+
+case 70:
+YY_RULE_SETUP
+#line 917 "pyscanner.l"
+{ // internal opening brace
+ g_braceCount++;
+ g_defVal+=*pyscanYYtext;
+ }
+ YY_BREAK
+case 71:
+#line 922 "pyscanner.l"
+case 72:
+YY_RULE_SETUP
+#line 922 "pyscanner.l"
+{
+ if (g_braceCount==0) // end of default argument
+ {
+ if (current->argList->getLast())
+ {
+ current->argList->getLast()->defval=g_defVal.stripWhiteSpace();
+ }
+ BEGIN(FunctionParams);
+ }
+ else // continue
+ {
+ g_braceCount--;
+ g_defVal+=*pyscanYYtext;
+ }
+ }
+ YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 937 "pyscanner.l"
+{
+ g_defVal+=*pyscanYYtext;
+ }
+ YY_BREAK
+case 74:
+/* rule 74 can match eol */
+YY_RULE_SETUP
+#line 940 "pyscanner.l"
+{
+ g_defVal+=*pyscanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+
+
+case 75:
+/* rule 75 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */
+YY_RULE_SETUP
+#line 948 "pyscanner.l"
+{ // new def at indent 0
+ yyLineNr++;
+ endOfDef();
+ g_hideClassDocs = FALSE;
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ BEGIN(Search);
+ }
+ YY_BREAK
+case 76:
+/* rule 76 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */
+YY_RULE_SETUP
+#line 955 "pyscanner.l"
+{ // start of a special comment at indent 0
+ yyLineNr++;
+ endOfDef();
+ g_hideClassDocs = FALSE;
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ BEGIN(Search);
+ }
+ YY_BREAK
+case 77:
+/* rule 77 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */
+YY_RULE_SETUP
+#line 962 "pyscanner.l"
+{ // skip empty line
+ current->program+=pyscanYYtext;
+ }
+ YY_BREAK
+case YY_STATE_EOF(ClassBody):
+#line 965 "pyscanner.l"
+{
+ endOfDef();
+ yyterminate();
+ }
+ YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 969 "pyscanner.l"
+{ // something at indent >0
+ g_curIndent=computeIndent(pyscanYYtext);
+ //fprintf(stderr,"g_curIndent=%d g_indent=%d\n",g_curIndent,g_indent);
+ if (g_curIndent<=g_indent)
+ // jumped out of the class/method
+ {
+ endOfDef(1);
+ g_indent=g_curIndent;
+ // make sure the next rule matches ^...
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ g_hideClassDocs = FALSE;
+ BEGIN(Search);
+ }
+ else
+ {
+ current->program+=pyscanYYtext;
+ }
+ }
+ YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 987 "pyscanner.l"
+{ // start of a single quoted string
+ current->program+=*pyscanYYtext;
+ g_stringContext=YY_START;
+ g_specialBlock = FALSE;
+ g_copyString=&current->program;
+ BEGIN( SingleQuoteString );
+ }
+ YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 994 "pyscanner.l"
+{ // start of a double quoted string
+ current->program+=*pyscanYYtext;
+ g_stringContext=YY_START;
+ g_specialBlock = FALSE;
+ g_copyString=&current->program;
+ BEGIN( DoubleQuoteString );
+ }
+ YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 1001 "pyscanner.l"
+{ // non-special stuff
+ current->program+=pyscanYYtext;
+ g_specialBlock = FALSE;
+ g_hideClassDocs = FALSE;
+ }
+ YY_BREAK
+case 82:
+/* rule 82 can match eol */
+YY_RULE_SETUP
+#line 1006 "pyscanner.l"
+{
+ current->program+=*pyscanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 1010 "pyscanner.l"
+{ // normal comment
+ current->program+=pyscanYYtext;
+ }
+ YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 1013 "pyscanner.l"
+{ // any character
+ g_specialBlock = FALSE;
+ current->program+=*pyscanYYtext;
+ }
+ YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 1017 "pyscanner.l"
+{ // start of a comment block
+ if (!g_hideClassDocs) current->program+=pyscanYYtext;
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 1023 "pyscanner.l"
+{ // start of a comment block
+ if (!g_hideClassDocs) current->program+=pyscanYYtext;
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+
+case 87:
+YY_RULE_SETUP
+#line 1030 "pyscanner.l"
+{
+ if (current->type.isEmpty())
+ {
+ current->type = "class";
+ }
+
+ current->section = Entry::CLASS_SEC;
+ current->name = pyscanYYtext;
+
+ // prepend scope in case of nested classes
+ if (current_root->section&Entry::SCOPE_MASK)
+ {
+ //printf("*** Prepending scope %s to class %s\n",current_root->name.data(),current->name.data());
+ current->name.prepend(current_root->name+"::");
+ }
+
+ current->name = current->name.stripWhiteSpace();
+ current->fileName = yyFileName;
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockJavaStyle = FALSE;
+ docBlock.resize(0);
+
+ BEGIN(ClassInheritance);
+ }
+ YY_BREAK
+
+case 88:
+YY_RULE_SETUP
+#line 1057 "pyscanner.l"
+{ // syntactic sugar for the list
+ }
+ YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 1060 "pyscanner.l"
+{ // begin of the class definition
+ g_specialBlock = TRUE; // expecting a docstring
+ BEGIN(ClassCaptureIndent);
+ }
+ YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 1065 "pyscanner.l"
+{
+ current->extends->append(
+ new BaseInfo(substitute(pyscanYYtext,".","::"),Public,Normal)
+ );
+ //Has base class-do stuff
+ }
+ YY_BREAK
+
+
+case 91:
+/* rule 91 can match eol */
+YY_RULE_SETUP
+#line 1075 "pyscanner.l"
+{
+ // Blankline - ignore, keep looking for indentation.
+ lineCount();
+ }
+ YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 1080 "pyscanner.l"
+{ // start of a comment block
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 1085 "pyscanner.l"
+{ // start of a comment block
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+ YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 1090 "pyscanner.l"
+{
+ current->program=pyscanYYtext;
+ current->startLine = yyLineNr;
+ g_curIndent=computeIndent(pyscanYYtext);
+ bodyEntry = current;
+ //fprintf(stderr,"setting indent %d\n",g_curIndent);
+ //printf("current->program=[%s]\n",current->program.data());
+ g_hideClassDocs = TRUE;
+ BEGIN(ClassBody);
+ }
+ YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 1101 "pyscanner.l"
+{
+
+ // Just pushback an empty class, and
+ // resume parsing the body.
+ newEntry();
+
+ // printf("Failed to find indent - skipping!");
+ BEGIN( Search );
+ }
+ YY_BREAK
+
+
+case 96:
+YY_RULE_SETUP
+#line 1114 "pyscanner.l"
+{ // the assignment operator
+ //printf("====== VariableDec at line %d\n",yyLineNr);
+ }
+ YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 1117 "pyscanner.l"
+{ // spaces
+ }
+ YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 1119 "pyscanner.l"
+{ // integer value
+ current->type = "int";
+ current->initializer = pyscanYYtext;
+ BEGIN(VariableEnd);
+ }
+ YY_BREAK
+case 99:
+YY_RULE_SETUP
+#line 1124 "pyscanner.l"
+{ // floating point value
+ current->type = "float";
+ current->initializer = pyscanYYtext;
+ BEGIN(VariableEnd);
+ }
+ YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 1129 "pyscanner.l"
+{ // string
+ current->type = "string";
+ current->initializer = pyscanYYtext;
+ g_copyString=&current->initializer;
+ g_stringContext=VariableEnd;
+ BEGIN( SingleQuoteString );
+ }
+ YY_BREAK
+case 101:
+YY_RULE_SETUP
+#line 1136 "pyscanner.l"
+{ // string
+ current->type = "string";
+ current->initializer = pyscanYYtext;
+ g_copyString=&current->initializer;
+ g_stringContext=VariableEnd;
+ BEGIN( DoubleQuoteString );
+ }
+ YY_BREAK
+case 102:
+YY_RULE_SETUP
+#line 1143 "pyscanner.l"
+{ // start of a comment block
+ current->type = "string";
+ current->initializer = pyscanYYtext;
+ g_doubleQuote=TRUE;
+ g_copyString=&current->initializer;
+ g_stringContext=VariableEnd;
+ BEGIN(TripleString);
+ }
+ YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 1152 "pyscanner.l"
+{ // start of a comment block
+ current->type = "string";
+ current->initializer = pyscanYYtext;
+ g_doubleQuote=FALSE;
+ g_copyString=&current->initializer;
+ g_stringContext=VariableEnd;
+ BEGIN(TripleString);
+ }
+ YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 1160 "pyscanner.l"
+{ // tuple
+ if (current->mtype!=Property)
+ {
+ current->type = "tuple";
+ }
+ current->initializer+=*pyscanYYtext;
+ g_atomStart='(';
+ g_atomEnd=')';
+ g_atomCount=1;
+ BEGIN( VariableAtom );
+ }
+ YY_BREAK
+case 105:
+YY_RULE_SETUP
+#line 1171 "pyscanner.l"
+{ // list
+ current->type = "list";
+ current->initializer+=*pyscanYYtext;
+ g_atomStart='[';
+ g_atomEnd=']';
+ g_atomCount=1;
+ BEGIN( VariableAtom );
+ }
+ YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 1179 "pyscanner.l"
+{ // dictionary
+ current->type = "dictionary";
+ current->initializer+=*pyscanYYtext;
+ g_atomStart='{';
+ g_atomEnd='}';
+ g_atomCount=1;
+ BEGIN( VariableAtom );
+ }
+ YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 1187 "pyscanner.l"
+{ // comment
+ BEGIN( VariableEnd );
+ }
+ YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 1190 "pyscanner.l"
+{
+ current->initializer+=pyscanYYtext;
+ }
+ YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 1193 "pyscanner.l"
+{
+ current->initializer+=*pyscanYYtext;
+ }
+ YY_BREAK
+case 110:
+/* rule 110 can match eol */
+YY_RULE_SETUP
+#line 1196 "pyscanner.l"
+{
+ unput('\n');
+ BEGIN( VariableEnd );
+ }
+ YY_BREAK
+
+
+case 111:
+YY_RULE_SETUP
+#line 1203 "pyscanner.l"
+{
+ current->initializer+=*pyscanYYtext;
+ if (g_atomStart==*pyscanYYtext)
+ {
+ g_atomCount++;
+ }
+ }
+ YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 1210 "pyscanner.l"
+{
+ current->initializer+=*pyscanYYtext;
+ if (g_atomEnd==*pyscanYYtext)
+ {
+ g_atomCount--;
+ }
+ if (g_atomCount==0)
+ {
+ BEGIN(VariableEnd);
+ }
+ }
+ YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 1221 "pyscanner.l"
+{
+ g_stringContext=YY_START;
+ current->initializer+="\"";
+ g_copyString=&current->initializer;
+ BEGIN( DoubleQuoteString );
+ }
+ YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 1227 "pyscanner.l"
+{
+ current->initializer+=pyscanYYtext;
+ }
+ YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 1230 "pyscanner.l"
+{
+ current->initializer+=*pyscanYYtext;
+ }
+ YY_BREAK
+case 116:
+/* rule 116 can match eol */
+YY_RULE_SETUP
+#line 1233 "pyscanner.l"
+{
+ current->initializer+=*pyscanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+
+
+case 117:
+/* rule 117 can match eol */
+YY_RULE_SETUP
+#line 1241 "pyscanner.l"
+{
+ yyLineNr++;
+ newVariable();
+ BEGIN(Search);
+ }
+ YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 1246 "pyscanner.l"
+{
+ unput(*pyscanYYtext);
+ newVariable();
+ BEGIN(Search);
+ }
+ YY_BREAK
+case YY_STATE_EOF(VariableEnd):
+#line 1251 "pyscanner.l"
+{ yyterminate();
+ newEntry();
+ }
+ YY_BREAK
+
+
+case 119:
+#line 1258 "pyscanner.l"
+case 120:
+YY_RULE_SETUP
+#line 1258 "pyscanner.l"
+{
+ // printf("Expected module block %d special=%d\n",g_expectModuleDocs,g_specialBlock);
+ if (g_doubleQuote==(pyscanYYtext[0]=='"'))
+ {
+ if (g_specialBlock) // expecting a docstring
+ {
+ QCString actualDoc=docBlock;
+ if (!docBlockSpecial) // legacy unformatted docstring
+ {
+ actualDoc.prepend("\\verbatim ");
+ actualDoc.append("\\endverbatim ");
+ }
+ //printf("-------> current=%p bodyEntry=%p\n",current,bodyEntry);
+ handleCommentBlock(actualDoc, FALSE);
+ }
+ else if (g_packageCommentAllowed) // expecting module docs
+ {
+ QCString actualDoc=docBlock;
+ if (!docBlockSpecial) // legacy unformatted docstring
+ {
+ actualDoc.prepend("\\verbatim ");
+ actualDoc.append("\\endverbatim ");
+ }
+ actualDoc.prepend("\\namespace "+g_moduleScope+"\\_linebr ");
+ handleCommentBlock(actualDoc, FALSE);
+ }
+ if ((docBlockContext==ClassBody && !g_hideClassDocs) ||
+ docBlockContext==FunctionBody)
+ {
+ current->program+=docBlock;
+ current->program+=pyscanYYtext;
+ }
+ if (g_hideClassDocs)
+ current->startLine = yyLineNr;
+ g_hideClassDocs=FALSE;
+ BEGIN(docBlockContext);
+ }
+ else
+ {
+ docBlock += pyscanYYtext;
+ }
+ g_packageCommentAllowed = FALSE;
+ }
+ YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 1303 "pyscanner.l"
+{ // leading whitespace
+ int indent = computeIndent(pyscanYYtext);
+ if (indent>=g_curIndent)
+ { // strip g_curIndent amount of whitespace
+ int i;
+ for (i=0;i<indent-g_curIndent;i++) docBlock+=' ';
+ //fprintf(stderr,"stripping indent %d\n",g_curIndent);
+ }
+ else
+ {
+ //fprintf(stderr,"not stripping: %d<%d\n",indent,g_curIndent);
+ docBlock += pyscanYYtext;
+ }
+ }
+ YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 1317 "pyscanner.l"
+{
+ docBlock += pyscanYYtext;
+ }
+ YY_BREAK
+case 123:
+/* rule 123 can match eol */
+YY_RULE_SETUP
+#line 1320 "pyscanner.l"
+{
+ yyLineNr++;
+ docBlock += pyscanYYtext;
+ }
+ YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 1324 "pyscanner.l"
+{
+ docBlock += pyscanYYtext;
+ }
+ YY_BREAK
+
+
+case 125:
+YY_RULE_SETUP
+#line 1330 "pyscanner.l"
+{ // skip leading hashes
+ }
+ YY_BREAK
+case 126:
+/* rule 126 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up pyscanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up pyscanYYtext again */
+YY_RULE_SETUP
+#line 1332 "pyscanner.l"
+{ // continuation of the comment on the next line
+ docBlock+='\n';
+ docBrief = FALSE;
+ startCommentBlock(FALSE);
+ yyLineNr++;
+ }
+ YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 1338 "pyscanner.l"
+{ // any other stuff
+ docBlock+=pyscanYYtext;
+ }
+ YY_BREAK
+case 128:
+/* rule 128 can match eol */
+YY_RULE_SETUP
+#line 1341 "pyscanner.l"
+{ // new line that ends the comment
+ handleCommentBlock(docBlock, docBrief);
+ yyLineNr++;
+ BEGIN(docBlockContext);
+ }
+ YY_BREAK
+case 129:
+YY_RULE_SETUP
+#line 1346 "pyscanner.l"
+{ // anything we missed
+ docBlock+=*pyscanYYtext;
+ }
+ YY_BREAK
+
+
+case 130:
+/* rule 130 can match eol */
+YY_RULE_SETUP
+#line 1352 "pyscanner.l"
+{ // line continuation
+ addToString(pyscanYYtext);
+ yyLineNr++;
+ }
+ YY_BREAK
+case 131:
+YY_RULE_SETUP
+#line 1356 "pyscanner.l"
+{ // espaced char
+ addToString(pyscanYYtext);
+ }
+ YY_BREAK
+case 132:
+YY_RULE_SETUP
+#line 1359 "pyscanner.l"
+{ // tripple double quotes
+ addToString(pyscanYYtext);
+ }
+ YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 1362 "pyscanner.l"
+{ // end of the string
+ addToString(pyscanYYtext);
+ BEGIN(g_stringContext);
+ }
+ YY_BREAK
+case 134:
+YY_RULE_SETUP
+#line 1366 "pyscanner.l"
+{ // normal chars
+ addToString(pyscanYYtext);
+ }
+ YY_BREAK
+case 135:
+YY_RULE_SETUP
+#line 1369 "pyscanner.l"
+{ // normal char
+ addToString(pyscanYYtext);
+ }
+ YY_BREAK
+
+
+case 136:
+/* rule 136 can match eol */
+YY_RULE_SETUP
+#line 1375 "pyscanner.l"
+{ // line continuation
+ addToString(pyscanYYtext);
+ yyLineNr++;
+ }
+ YY_BREAK
+case 137:
+YY_RULE_SETUP
+#line 1379 "pyscanner.l"
+{ // espaced char
+ addToString(pyscanYYtext);
+ }
+ YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 1382 "pyscanner.l"
+{ // tripple single quotes
+ addToString(pyscanYYtext);
+ }
+ YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 1385 "pyscanner.l"
+{ // end of the string
+ addToString(pyscanYYtext);
+ BEGIN(g_stringContext);
+ }
+ YY_BREAK
+case 140:
+YY_RULE_SETUP
+#line 1389 "pyscanner.l"
+{ // normal chars
+ addToString(pyscanYYtext);
+ }
+ YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 1392 "pyscanner.l"
+{ // normal char
+ addToString(pyscanYYtext);
+ }
+ YY_BREAK
+
+
+case 142:
+#line 1399 "pyscanner.l"
+case 143:
+YY_RULE_SETUP
+#line 1399 "pyscanner.l"
+{
+ *g_copyString += pyscanYYtext;
+ if (g_doubleQuote==(pyscanYYtext[0]=='"'))
+ {
+ BEGIN(g_stringContext);
+ }
+ }
+ YY_BREAK
+case 144:
+/* rule 144 can match eol */
+YY_RULE_SETUP
+#line 1408 "pyscanner.l"
+{
+ lineCount();
+ *g_copyString += pyscanYYtext;
+ }
+ YY_BREAK
+case 145:
+/* rule 145 can match eol */
+YY_RULE_SETUP
+#line 1412 "pyscanner.l"
+{
+ yyLineNr++;
+ *g_copyString += pyscanYYtext;
+ }
+ YY_BREAK
+case 146:
+YY_RULE_SETUP
+#line 1416 "pyscanner.l"
+{
+ *g_copyString += *pyscanYYtext;
+ }
+ YY_BREAK
+
+/* ------------ End rules -------------- */
+/*
+<*>({NONEMPTY}|{EXPCHAR}|{BB}) { // This should go one character at a time.
+ // printf("[pyscanner] '%s' [ state %d ] [line %d] no match\n",
+ // pyscanYYtext, YY_START, yyLineNr);
+
+ }
+ */
+case 147:
+/* rule 147 can match eol */
+YY_RULE_SETUP
+#line 1431 "pyscanner.l"
+{
+ //printf("[pyscanner] %d NEWLINE [line %d] no match\n",
+ // YY_START, yyLineNr);
+
+ lineCount();
+ }
+ YY_BREAK
+case 148:
+YY_RULE_SETUP
+#line 1438 "pyscanner.l"
+{
+ //printf("[pyscanner] '%s' [ state %d ] [line %d] no match\n",
+ // pyscanYYtext, YY_START, yyLineNr);
+
+ }
+ YY_BREAK
+case 149:
+YY_RULE_SETUP
+#line 1445 "pyscanner.l"
+ECHO;
+ YY_BREAK
+#line 3374 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(Search):
+ case YY_STATE_EOF(SearchMemVars):
+ case YY_STATE_EOF(TryClassDocString):
+ case YY_STATE_EOF(TripleComment):
+ case YY_STATE_EOF(SpecialComment):
+ case YY_STATE_EOF(FunctionDec):
+ case YY_STATE_EOF(FunctionParams):
+ case YY_STATE_EOF(FunctionParamDefVal):
+ case YY_STATE_EOF(ClassDec):
+ case YY_STATE_EOF(ClassInheritance):
+ case YY_STATE_EOF(ClassCaptureIndent):
+ case YY_STATE_EOF(VariableDec):
+ case YY_STATE_EOF(VariableAtom):
+ case YY_STATE_EOF(SingleQuoteString):
+ case YY_STATE_EOF(DoubleQuoteString):
+ case YY_STATE_EOF(TripleString):
+ case YY_STATE_EOF(FromMod):
+ case YY_STATE_EOF(FromModItem):
+ case YY_STATE_EOF(Import):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed pyscanYYin at a new source and called
+ * pyscanYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = pyscanYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( pyscanYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * pyscanYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of pyscanYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ pyscanYYrestart(pyscanYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) pyscanYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 434 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 434 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 433);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up pyscanYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ pyscanYYrestart(pyscanYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( pyscanYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve pyscanYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void pyscanYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ pyscanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ pyscanYY_create_buffer(pyscanYYin,YY_BUF_SIZE );
+ }
+
+ pyscanYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ pyscanYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void pyscanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * pyscanYYpop_buffer_state();
+ * pyscanYYpush_buffer_state(new_buffer);
+ */
+ pyscanYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ pyscanYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (pyscanYYwrap()) processing, but the only time this flag
+ * is looked at is after pyscanYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void pyscanYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ pyscanYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE pyscanYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) pyscanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in pyscanYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) pyscanYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in pyscanYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ pyscanYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with pyscanYY_create_buffer()
+ *
+ */
+ void pyscanYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ pyscanYYfree((void *) b->yy_ch_buf );
+
+ pyscanYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a pyscanYYrestart() or at EOF.
+ */
+ static void pyscanYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ pyscanYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then pyscanYY_init_buffer was _probably_
+ * called from pyscanYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void pyscanYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ pyscanYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void pyscanYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ pyscanYYensure_buffer_stack();
+
+ /* This block is copied from pyscanYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from pyscanYY_switch_to_buffer. */
+ pyscanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void pyscanYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ pyscanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ pyscanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void pyscanYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)pyscanYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in pyscanYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)pyscanYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in pyscanYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE pyscanYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) pyscanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in pyscanYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ pyscanYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to pyscanYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * pyscanYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE pyscanYY_scan_string (yyconst char * yystr )
+{
+
+ return pyscanYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to pyscanYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE pyscanYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) pyscanYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in pyscanYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = pyscanYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in pyscanYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up pyscanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ pyscanYYtext[pyscanYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = pyscanYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ pyscanYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int pyscanYYget_lineno (void)
+{
+
+ return pyscanYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *pyscanYYget_in (void)
+{
+ return pyscanYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *pyscanYYget_out (void)
+{
+ return pyscanYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t pyscanYYget_leng (void)
+{
+ return pyscanYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *pyscanYYget_text (void)
+{
+ return pyscanYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void pyscanYYset_lineno (int line_number )
+{
+
+ pyscanYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see pyscanYY_switch_to_buffer
+ */
+void pyscanYYset_in (FILE * in_str )
+{
+ pyscanYYin = in_str ;
+}
+
+void pyscanYYset_out (FILE * out_str )
+{
+ pyscanYYout = out_str ;
+}
+
+int pyscanYYget_debug (void)
+{
+ return pyscanYY_flex_debug;
+}
+
+void pyscanYYset_debug (int bdebug )
+{
+ pyscanYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from pyscanYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ pyscanYYin = stdin;
+ pyscanYYout = stdout;
+#else
+ pyscanYYin = (FILE *) 0;
+ pyscanYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * pyscanYYlex_init()
+ */
+ return 0;
+}
+
+/* pyscanYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int pyscanYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ pyscanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ pyscanYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ pyscanYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ pyscanYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * pyscanYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *pyscanYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *pyscanYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void pyscanYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see pyscanYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 1445 "pyscanner.l"
+
+
+
+//----------------------------------------------------------------------------
+
+static void parseCompounds(Entry *rt)
+{
+ //printf("parseCompounds(%s)\n",rt->name.data());
+ EntryListIterator eli(*rt->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (!ce->program.isEmpty())
+ {
+ //printf("-- %s ---------\n%s\n---------------\n",
+ // ce->name.data(),ce->program.data());
+ // init scanner state
+ inputString = ce->program;
+ inputPosition = 0;
+ pyscanYYrestart( pyscanYYin ) ;
+ if (ce->section&Entry::COMPOUND_MASK)
+ {
+ current_root = ce ;
+ BEGIN( Search );
+ }
+ else if (ce->parent())
+ {
+ current_root = ce->parent();
+ //printf("Searching for member variables in %s parent=%s\n",
+ // ce->name.data(),ce->parent->name.data());
+ BEGIN( SearchMemVars );
+ }
+ yyFileName = ce->fileName;
+ yyLineNr = ce->startLine ;
+ if (current) delete current;
+ current = new Entry;
+
+ groupEnterCompound(yyFileName,yyLineNr,ce->name);
+
+ pyscanYYlex() ;
+ g_lexInit=TRUE;
+ delete current; current=0;
+ ce->program.resize(0);
+
+ groupLeaveCompound(yyFileName,yyLineNr,ce->name);
+
+ }
+ parseCompounds(ce);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+
+static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+{
+ initParser();
+
+ inputString = fileBuf;
+ inputPosition = 0;
+
+ protection = Public;
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ current_root = rt;
+ g_specialBlock = FALSE;
+
+
+ inputFile.setName(fileName);
+ if (inputFile.open(IO_ReadOnly))
+ {
+ yyLineNr= 1 ;
+ yyFileName = fileName;
+ //setContext();
+ msg("Parsing file %s...\n",yyFileName.data());
+
+ QFileInfo fi(fileName);
+ g_moduleScope = findPackageScope(fileName);
+ QString baseName=fi.baseName();
+ if (baseName!="__init__") // package initializer file is not a package itself
+ {
+ if (!g_moduleScope.isEmpty())
+ {
+ g_moduleScope+="::";
+ }
+ g_moduleScope+=baseName;
+ }
+
+ current = new Entry;
+ current->name = g_moduleScope;
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "namespace";
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+
+ rt->addSubEntry(current);
+
+ current_root = current ;
+ initParser();
+ current = new Entry;
+
+ groupEnterFile(yyFileName,yyLineNr);
+
+ current->reset();
+ pyscanYYrestart( pyscanYYin );
+ BEGIN( Search );
+ pyscanYYlex();
+ g_lexInit=TRUE;
+
+ groupLeaveFile(yyFileName,yyLineNr);
+
+ current_root->program.resize(0);
+ delete current; current=0;
+
+ parseCompounds(current_root);
+
+ inputFile.close();
+ }
+
+}
+
+//----------------------------------------------------------------------------
+
+static void parsePrototype(const QCString &text)
+{
+ //printf("**** parsePrototype(%s) begin\n",text.data());
+ if (text.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,"Empty prototype found!");
+ return;
+ }
+
+ g_specialBlock = FALSE;
+ g_packageCommentAllowed = FALSE;
+
+ const char *orgInputString;
+ int orgInputPosition;
+ YY_BUFFER_STATE orgState;
+
+ // save scanner state
+ orgState = YY_CURRENT_BUFFER;
+ pyscanYY_switch_to_buffer(pyscanYY_create_buffer(pyscanYYin,YY_BUF_SIZE));
+ orgInputString = inputString;
+ orgInputPosition = inputPosition;
+
+ // set new string
+ inputString = text;
+ inputPosition = 0;
+ pyscanYYrestart( pyscanYYin );
+
+ BEGIN( FunctionDec );
+
+ pyscanYYlex();
+ g_lexInit=TRUE;
+
+ current->name = current->name.stripWhiteSpace();
+ if (current->section == Entry::MEMBERDOC_SEC && current->args.isEmpty())
+ current->section = Entry::VARIABLEDOC_SEC;
+
+ // restore original scanner state
+
+ YY_BUFFER_STATE tmpBuf = YY_CURRENT_BUFFER;
+ pyscanYY_switch_to_buffer(orgState);
+ pyscanYY_delete_buffer(tmpBuf);
+
+ inputString = orgInputString;
+ inputPosition = orgInputPosition;
+
+ //printf("**** parsePrototype end\n");
+}
+
+void pyscanFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ pyscanYYlex_destroy();
+ }
+#endif
+}
+
+//----------------------------------------------------------------------------
+
+void PythonLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+{
+ g_thisParser = this;
+ ::parseMain(fileName,fileBuf,root);
+
+ // May print the AST for debugging purposes
+ // printAST(global_root);
+}
+
+bool PythonLanguageScanner::needsPreprocessing(const QCString &)
+{
+ return FALSE;
+}
+
+void PythonLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName,
+ FileDef *fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ MemberDef *memberDef,
+ bool showLineNumbers
+ )
+{
+ ::parsePythonCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
+ fileDef,startLine,endLine,inlineFragment,memberDef,
+ showLineNumbers);
+}
+
+void PythonLanguageScanner::parsePrototype(const char *text)
+{
+ ::parsePrototype(text);
+
+}
+
+void PythonLanguageScanner::resetCodeParserState()
+{
+ ::resetPythonCodeParserState();
+}
+
+//----------------------------------------------------------------------------
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void pyscannerYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
+
diff --git a/src/pyscanner.h b/src/pyscanner.h
new file mode 100644
index 0000000..57db814
--- /dev/null
+++ b/src/pyscanner.h
@@ -0,0 +1,60 @@
+/******************************************************************************
+ *
+ * $Id: pyscanner.h,v 1.9 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/* This code is based on the work done by the MoxyPyDoxy team
+ * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
+ * in Spring 2005 as part of CS 179E: Compiler Design Project
+ * at the University of California, Riverside; the course was
+ * taught by Peter H. Froehlich <phf@acm.org>.
+ */
+
+
+#ifndef PYSCANNER_H
+#define PYSCANNER_H
+
+#include "parserintf.h"
+
+/** \brief Python Language parser using state-based lexical scanning.
+ *
+ * This is the Python language parser for doxygen.
+ */
+class PythonLanguageScanner : public ParserInterface
+{
+ public:
+ virtual ~PythonLanguageScanner() {}
+ void parseInput(const char * fileName,
+ const char *fileBuf,
+ Entry *root);
+ bool needsPreprocessing(const QCString &extension);
+ void parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName=0,
+ FileDef *fileDef=0,
+ int startLine=-1,
+ int endLine=-1,
+ bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,
+ bool showLineNumbers=TRUE
+ );
+ void resetCodeParserState();
+ void parsePrototype(const char *text);
+};
+
+void pyscanFreeScanner();
+
+#endif
diff --git a/src/pyscanner.l b/src/pyscanner.l
new file mode 100644
index 0000000..14a3f31
--- /dev/null
+++ b/src/pyscanner.l
@@ -0,0 +1,1680 @@
+/******************************************************************************
+ *
+ * $Id: pyscanner.l,v 1.9 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/* This code is based on the work done by the MoxyPyDoxy team
+ * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
+ * in Spring 2005 as part of CS 179E: Compiler Design Project
+ * at the University of California, Riverside; the course was
+ * taught by Peter H. Froehlich <phf@acm.org>.
+ */
+
+
+%{
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qregexp.h>
+#include <unistd.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+
+#include "pyscanner.h"
+#include "entry.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+#include "defargs.h"
+#include "language.h"
+#include "commentscan.h"
+#include "pycode.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+
+
+static ParserInterface *g_thisParser;
+static const char * inputString;
+static int inputPosition;
+static QFile inputFile;
+
+static Protection protection;
+
+static Entry* current_root = 0 ;
+static Entry* current = 0 ;
+static Entry* previous = 0 ;
+static Entry* bodyEntry = 0 ;
+static int yyLineNr = 1 ;
+static QCString yyFileName;
+static MethodTypes mtype;
+static bool gstat;
+static Specifier virt;
+
+static int docBlockContext;
+static QCString docBlock;
+static QCString docBlockName;
+static bool docBlockInBody;
+static bool docBlockJavaStyle;
+static bool docBrief;
+static bool docBlockSpecial;
+
+static bool g_doubleQuote;
+static bool g_specialBlock;
+static int g_stringContext;
+static QGString * g_copyString;
+static int g_indent = 0;
+static int g_curIndent = 0;
+
+static QDict<QCString> g_packageNameCache(257);
+static QCString g_packageScope;
+
+static char g_atomStart;
+static char g_atomEnd;
+static int g_atomCount;
+
+//static bool g_insideConstructor;
+
+static QCString g_moduleScope;
+static QCString g_packageName;
+
+static bool g_hideClassDocs;
+
+static QCString g_defVal;
+static int g_braceCount;
+
+static bool g_lexInit = FALSE;
+static bool g_packageCommentAllowed;
+
+//-----------------------------------------------------------------------------
+
+
+static void initParser()
+{
+ protection = Public;
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ previous = 0;
+ g_packageCommentAllowed = TRUE;
+ g_packageNameCache.setAutoDelete(TRUE);
+}
+
+static void initEntry()
+{
+ //current->python = TRUE;
+ current->protection = protection ;
+ current->mtype = mtype;
+ current->virt = virt;
+ current->stat = gstat;
+ current->lang = SrcLangExt_Python;
+ current->setParent(current_root);
+ initGroupInfo(current);
+}
+
+static void newEntry()
+{
+ previous = current;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+}
+
+static void newVariable()
+{
+ if (!current->name.isEmpty() && current->name.at(0)=='_') // mark as private
+ {
+ current->protection=Private;
+ }
+ if (current_root->section&Entry::COMPOUND_MASK) // mark as class variable
+ {
+ current->stat = TRUE;
+ }
+ newEntry();
+}
+
+static void newFunction()
+{
+ if (current->name.left(2)=="__" && current->name.right(2)=="__")
+ {
+ // special method name, see
+ // http://docs.python.org/ref/specialnames.html
+ current->protection=Public;
+ }
+ else if (current->name.at(0)=='_')
+ {
+ current->protection=Private;
+ }
+}
+
+static inline int computeIndent(const char *s)
+{
+ int col=0;
+ static int tabSize=Config_getInt("TAB_SIZE");
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ if (c==' ') col++;
+ else if (c=='\t') col+=tabSize-(col%tabSize);
+ else break;
+ }
+ return col;
+}
+
+static QCString findPackageScopeFromPath(const QCString &path)
+{
+ QCString *pScope = g_packageNameCache.find(path);
+ if (pScope)
+ {
+ return *pScope;
+ }
+ QFileInfo pf(path+"/__init__.py"); // found package initialization file
+ if (pf.exists())
+ {
+ int i=path.findRev('/');
+ if (i!=-1)
+ {
+ QCString scope = findPackageScopeFromPath(path.left(i));
+ if (!scope.isEmpty())
+ {
+ scope+="::";
+ }
+ scope+=path.mid(i+1);
+ g_packageNameCache.insert(path,new QCString(scope));
+ return scope;
+ }
+ }
+ return "";
+}
+
+static QCString findPackageScope(const char *fileName)
+{
+ if (fileName==0) return "";
+ QFileInfo fi(fileName);
+ return findPackageScopeFromPath(fi.dirPath(TRUE).data());
+}
+
+//-----------------------------------------------------------------------------
+
+static void lineCount()
+{
+ for( const char* c = yytext ; *c ; ++c )
+ yyLineNr += (*c == '\n') ;
+}
+
+#if 0
+// Appends the current-name to current-type;
+// Destroys current-name.
+// Destroys current->args and current->argList
+static void addType( Entry* current )
+{
+ uint tl=current->type.length();
+ if ( tl>0 && !current->name.isEmpty() && current->type.at(tl-1)!='.')
+ {
+ current->type += ' ' ;
+ }
+ current->type += current->name ;
+ current->name.resize(0) ;
+ tl=current->type.length();
+ if ( tl>0 && !current->args.isEmpty() && current->type.at(tl-1)!='.')
+ {
+ current->type += ' ' ;
+ }
+ current->type += current->args ;
+ current->args.resize(0) ;
+ current->argList->clear();
+}
+
+static QCString stripQuotes(const char *s)
+{
+ QCString name;
+ if (s==0 || *s==0) return name;
+ name=s;
+ if (name.at(0)=='"' && name.at(name.length()-1)=='"')
+ {
+ name=name.mid(1,name.length()-2);
+ }
+ return name;
+}
+#endif
+//-----------------------------------------------------------------
+
+//-----------------------------------------------------------------
+static void startCommentBlock(bool brief)
+{
+ if (brief)
+ {
+ current->briefFile = yyFileName;
+ current->briefLine = yyLineNr;
+ }
+ else
+ {
+ current->docFile = yyFileName;
+ current->docLine = yyLineNr;
+ }
+}
+
+/*
+static void appendDocBlock() {
+ previous = current;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ initEntry();
+}
+*/
+
+static void handleCommentBlock(const QCString &doc,bool brief)
+{
+ //printf("handleCommentBlock(doc=[%s] brief=%d docBlockInBody=%d docBlockJavaStyle=%d\n",
+ // doc.data(),brief,docBlockInBody,docBlockJavaStyle);
+
+ // TODO: Fix me
+ docBlockInBody=FALSE;
+
+ if (docBlockInBody && previous && !previous->doc.isEmpty())
+ {
+ previous->doc=previous->doc.stripWhiteSpace()+"\n\n";
+ }
+
+ int position = 0;
+ bool needsEntry;
+ int lineNr = brief ? current->briefLine : current->docLine;
+ while (parseCommentBlock(
+ g_thisParser,
+ (docBlockInBody && previous) ? previous : current,
+ doc, // text
+ yyFileName, // file
+ lineNr,
+ docBlockInBody ? FALSE : brief,
+ docBlockJavaStyle, // javadoc style // or FALSE,
+ docBlockInBody,
+ protection,
+ position,
+ needsEntry)
+ ) // need to start a new entry
+ {
+ if (needsEntry)
+ {
+ newEntry();
+ }
+ }
+ if (needsEntry)
+ {
+ newEntry();
+ }
+
+}
+
+static void endOfDef(int correction=0)
+{
+ if (bodyEntry)
+ {
+ bodyEntry->endBodyLine = yyLineNr-correction;
+ bodyEntry = 0;
+ }
+ newEntry();
+ //g_insideConstructor = FALSE;
+}
+
+static inline void addToString(const char *s)
+{
+ if (g_copyString) (*g_copyString)+=s;
+}
+
+static void initTriDoubleQuoteBlock()
+{
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockJavaStyle = TRUE;
+ docBlockSpecial = yytext[3]=='!';
+ docBlock.resize(0);
+ g_doubleQuote = TRUE;
+ startCommentBlock(FALSE);
+}
+
+static void initTriSingleQuoteBlock()
+{
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockJavaStyle = TRUE;
+ docBlockSpecial = yytext[3]=='!';
+ docBlock.resize(0);
+ g_doubleQuote = FALSE;
+ startCommentBlock(FALSE);
+}
+
+static void initSpecialBlock()
+{
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockJavaStyle = TRUE;
+ docBrief = TRUE;
+ docBlock.resize(0);
+ startCommentBlock(TRUE);
+}
+
+static void searchFoundDef()
+{
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ current->section = Entry::FUNCTION_SEC;
+ current->protection = protection = Public;
+ current->lang = SrcLangExt_Python;
+ current->virt = Normal;
+ current->stat = FALSE;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ g_packageCommentAllowed = FALSE;
+}
+
+static void searchFoundClass()
+{
+ current->section = Entry::CLASS_SEC;
+ current->argList->clear();
+ current->type += "class" ;
+ current->fileName = yyFileName;
+ current->bodyLine = yyLineNr;
+ g_packageCommentAllowed = FALSE;
+}
+
+//-----------------------------------------------------------------------------
+/* ----------------------------------------------------------------- */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while ( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ //printf("%d (%c)\n",*buf,*buf);
+ c++; buf++;
+ }
+ return c;
+}
+
+%}
+
+ /* start command character */
+
+
+
+BB [ \t]+
+B [ \t]*
+NEWLINE \n
+BN [ \t\n]
+
+DIGIT [0-9]
+
+HEXNUMBER "0"[xX][0-9a-fA-F]+[lL]?
+OCTNUMBER "0"[0-7]+[lL]?
+NUMBER {DIGIT}+[lLjJ]?
+INTNUMBER {HEXNUMBER}|{OCTNUMBER}|{NUMBER}
+FLOATNUMBER {DIGIT}+"."{DIGIT}+([eE][+\-]?{DIGIT}+)?[jJ]?
+LETTER [A-Za-z]
+NONEMPTY [A-Za-z0-9_]
+EXPCHAR [#(){}\[\],:.%/\\=`*~|&<>!;+-]
+NONEMPTYEXP [^ \t\n:]
+PARAMNONEMPTY [^ \t\n():]
+IDENTIFIER ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*
+SCOPE {IDENTIFIER}("."{IDENTIFIER})*
+BORDER ([^A-Za-z0-9])
+
+TRISINGLEQUOTE "'''"(!)?
+TRIDOUBLEQUOTE "\"\"\""(!)?
+LONGSTRINGCHAR [^\\"']
+ESCAPESEQ ("\\")(.)
+LONGSTRINGITEM ({LONGSTRINGCHAR}|{ESCAPESEQ})
+SMALLQUOTE ("\"\""|"\""|"'"|"''")
+LONGSTRINGBLOCK ({LONGSTRINGITEM}+|{SMALLQUOTE})
+
+SHORTSTRING ("'"{SHORTSTRINGITEM}*"'"|'"'{SHORTSTRINGITEM}*'"')
+SHORTSTRINGITEM ({SHORTSTRINGCHAR}|{ESCAPESEQ})
+SHORTSTRINGCHAR [^\\\n"]
+STRINGLITERAL {STRINGPREFIX}?( {SHORTSTRING} | {LONGSTRING})
+STRINGPREFIX ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR")
+KEYWORD ("lambda"|"import"|"class"|"assert"|"as"|"from"|"global"|"def"|"True"|"False")
+FLOWKW ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally")
+POUNDCOMMENT "#"[^#\n][^\n]*
+
+STARTDOCSYMS "##"
+
+%option noyywrap
+
+ /* Main start state */
+
+%x Search
+%x SearchMemVars
+
+ /* Mid-comment states */
+
+ /* %x FuncDoubleComment */
+ /* %x ClassDoubleComment */
+%x TryClassDocString
+%x TripleComment
+%x SpecialComment
+
+ /* Function states */
+
+%x FunctionDec
+%x FunctionParams
+%x FunctionBody
+%x FunctionParamDefVal
+
+ /* Class states */
+
+%x ClassDec
+%x ClassInheritance
+%x ClassCaptureIndent
+%x ClassBody
+
+ /* Variable states */
+%x VariableDec
+%x VariableEnd
+%x VariableAtom
+
+ /* String states */
+
+%x SingleQuoteString
+%x DoubleQuoteString
+%x TripleString
+
+ /* import */
+%x FromMod
+%x FromModItem
+%x Import
+
+%%
+
+ /* ------------ Function recognition rules -------------- */
+
+<Search>{
+
+ ^{B}"def"{BB} { // start of a function/method definition with indent
+ g_indent=computeIndent(yytext);
+ searchFoundDef();
+ BEGIN( FunctionDec );
+ }
+ "def"{BB} { // start of a function/method definition
+ searchFoundDef();
+ BEGIN( FunctionDec );
+ }
+
+ ^{B}"class"{BB} { // start of a class definition with indent
+ g_indent=computeIndent(yytext);
+ searchFoundClass();
+ BEGIN( ClassDec ) ;
+ }
+ "class"{BB} { // start of a class definition
+ searchFoundClass();
+ BEGIN( ClassDec ) ;
+ }
+ ^{B}"from"{BB} |
+ "from"{BB} { // start of an from import
+ g_packageCommentAllowed = FALSE;
+ BEGIN( FromMod );
+ }
+
+ ^{B}"import"{BB} |
+ "import"{BB} { // start of an import statement
+ g_packageCommentAllowed = FALSE;
+ BEGIN( Import );
+ }
+ ^{B}{IDENTIFIER}/{B}"="{B}"property" { // property
+ current->section = Entry::VARIABLE_SEC;
+ current->mtype = Property;
+ current->name = QCString(yytext).stripWhiteSpace();
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ g_packageCommentAllowed = FALSE;
+ BEGIN(VariableDec);
+ }
+ ^{B}{IDENTIFIER}/{B}"="[^=] { // variable
+ g_indent=computeIndent(yytext);
+ current->section = Entry::VARIABLE_SEC;
+ current->name = QCString(yytext).stripWhiteSpace();
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ g_packageCommentAllowed = FALSE;
+ BEGIN(VariableDec);
+ }
+ "'" { // start of a single quoted string
+ g_stringContext=YY_START;
+ g_copyString=0;
+ g_packageCommentAllowed = FALSE;
+ BEGIN( SingleQuoteString );
+ }
+ "\"" { // start of a double quoted string
+ g_stringContext=YY_START;
+ g_copyString=0;
+ g_packageCommentAllowed = FALSE;
+ BEGIN( DoubleQuoteString );
+ }
+
+ {POUNDCOMMENT} { // normal comment
+ g_packageCommentAllowed = FALSE;
+ }
+ {IDENTIFIER} { // some other identifier
+ g_packageCommentAllowed = FALSE;
+ }
+ ^{BB} {
+ g_curIndent=computeIndent(yytext);
+ }
+
+ {NEWLINE}+ { // new line
+ lineCount();
+ }
+
+ {TRIDOUBLEQUOTE} { // start of a comment block
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+
+ {TRISINGLEQUOTE} { // start of a comment block
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+
+ {STARTDOCSYMS}/[^#] { // start of a special comment
+ g_curIndent=computeIndent(yytext);
+ g_packageCommentAllowed = FALSE;
+ initSpecialBlock();
+ BEGIN(SpecialComment);
+ }
+ [^\n] { // any other character...
+ // This is the major default
+ // that should catch everything
+ // else in Body.
+ }
+}
+
+<FromMod>{
+ {IDENTIFIER}({B}"."{B}{IDENTIFIER})* { // from package import
+ g_packageName=yytext;
+ }
+ "import"{B} {
+ BEGIN(FromModItem);
+ }
+ \n {
+ yyLineNr++;
+ BEGIN(Search);
+ }
+ {B} {
+ }
+ . {
+ unput(*yytext);
+ BEGIN(Search);
+ }
+}
+
+<FromModItem>{
+ "*" { // import all
+ QCString item=g_packageName;
+ current->name=removeRedundantWhiteSpace(substitute(item,".","::"));
+ current->fileName = yyFileName;
+ //printf("Adding using directive: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Search);
+ }
+ {IDENTIFIER} {
+ QCString item=g_packageName+"."+yytext;
+ current->name=removeRedundantWhiteSpace(substitute(item,".","::"));
+ current->fileName = yyFileName;
+ //printf("Adding using declaration: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Search);
+ }
+ \n {
+ yyLineNr++;
+ BEGIN(Search);
+ }
+ {B} {
+ }
+ . {
+ unput(*yytext);
+ BEGIN(Search);
+ }
+}
+
+<Import>{
+ {IDENTIFIER}({B}"."{B}{IDENTIFIER})* {
+ current->name=removeRedundantWhiteSpace(substitute(yytext,".","::"));
+ current->fileName = yyFileName;
+ //printf("Adding using declaration: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Search);
+ }
+ \n {
+ yyLineNr++;
+ BEGIN(Search);
+ }
+ {B} {
+ }
+ . {
+ unput(*yytext);
+ BEGIN(Search);
+ }
+}
+
+<SearchMemVars>{
+ "self."{IDENTIFIER}/{B}"=" {
+ //printf("Found member variable %s in %s\n",&yytext[5],current_root->name.data());
+ current->name=&yytext[5];
+ current->section=Entry::VARIABLE_SEC;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ current->type.resize(0);
+ if (current->name.at(0)=='_') // mark as private
+ {
+ current->protection=Private;
+ }
+ else
+ {
+ current->protection=Public;
+ }
+ newEntry();
+ }
+ {TRIDOUBLEQUOTE} { // start of a comment block
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+
+ {TRISINGLEQUOTE} { // start of a comment block
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+
+ {STARTDOCSYMS}/[^#] { // start of a special comment
+ initSpecialBlock();
+ BEGIN(SpecialComment);
+ }
+ {POUNDCOMMENT} { // #
+ }
+ "'" { // start of a single quoted string
+ g_stringContext=YY_START;
+ g_copyString=0;
+ BEGIN( SingleQuoteString );
+ }
+ "\"" { // start of a double quoted string
+ g_stringContext=YY_START;
+ g_copyString=0;
+ BEGIN( DoubleQuoteString );
+ }
+ \n { yyLineNr++; }
+ {IDENTIFIER} // identifiers
+ [^'"\.#a-z_A-Z]+ // other uninteresting stuff
+ . // anything else
+}
+
+<FunctionBody>{
+ \n{B}/{IDENTIFIER}{BB} {
+ //fprintf(stderr,"indent %d<=%d\n",computeIndent(&yytext[1]),g_indent);
+ if (computeIndent(&yytext[1])<=g_indent)
+ {
+ int i;
+ for (i=yyleng-1;i>=0;i--)
+ {
+ unput(yytext[i]);
+ }
+ endOfDef();
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ BEGIN(Search);
+ }
+ else
+ {
+ yyLineNr++;
+ current->program+=yytext;
+ }
+ }
+ \n{B}/"##" {
+ if (computeIndent(&yytext[1])<=g_indent)
+ {
+ int i;
+ for (i=yyleng-1;i>=0;i--)
+ {
+ unput(yytext[i]);
+ }
+ endOfDef();
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ BEGIN(Search);
+ }
+ else
+ {
+ yyLineNr++;
+ current->program+=yytext;
+ }
+ }
+ <<EOF>> {
+ endOfDef();
+ yyterminate();
+ }
+ ^{BB}/\n { // skip empty line
+ current->program+=yytext;
+ }
+ ^{BB} { // something at indent >0
+ current->program+=yytext;
+ g_curIndent = computeIndent(yytext);
+ if (g_curIndent<=g_indent)
+ // jumped out of the function
+ {
+ endOfDef(1);
+ BEGIN(Search);
+ }
+ }
+ "'" { // start of a single quoted string
+ current->program+=yytext;
+ g_stringContext=YY_START;
+ g_specialBlock = FALSE;
+ g_copyString=&current->program;
+ BEGIN( SingleQuoteString );
+ }
+ "\"" { // start of a double quoted string
+ current->program+=yytext;
+ g_stringContext=YY_START;
+ g_specialBlock = FALSE;
+ g_copyString=&current->program;
+ BEGIN( DoubleQuoteString );
+ }
+ [^ \t\n#'".]+ { // non-special stuff
+ current->program+=yytext;
+ g_specialBlock = FALSE;
+ }
+ ^{POUNDCOMMENT} { // normal comment
+ current->program+=yytext;
+ }
+ "#".* { // comment half way
+ current->program+=yytext;
+ }
+ {NEWLINE} { yyLineNr++;
+ current->program+=yytext;
+ }
+ . { // any character
+ current->program+=*yytext;
+ g_specialBlock = FALSE;
+ }
+
+ {TRIDOUBLEQUOTE} { // start of a comment block
+ current->program+=yytext;
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+
+ {TRISINGLEQUOTE} { // start of a comment block
+ current->program+=yytext;
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+
+ {STARTDOCSYMS}/[^#] { // start of a special comment
+ initSpecialBlock();
+ BEGIN(SpecialComment);
+ }
+
+}
+
+<FunctionDec>{
+
+ {IDENTIFIER} {
+ //found function name
+ if (current->type.isEmpty())
+ {
+ current->type = "def";
+ }
+ current->name = yytext;
+ current->name = current->name.stripWhiteSpace();
+ newFunction();
+ }
+ {B}":" { // function without arguments
+ g_specialBlock = TRUE; // expecting a docstring
+ bodyEntry = current;
+ BEGIN( FunctionBody );
+ }
+
+ {B}"(" {
+ BEGIN( FunctionParams );
+ }
+}
+
+<FunctionParams>{
+ ({BB}|",") {
+ }
+
+ {IDENTIFIER} { // Name of parameter
+ lineCount();
+ Argument *a = new Argument;
+ current->argList->append(a);
+ current->argList->getLast()->name = QCString(yytext).stripWhiteSpace();
+ current->argList->getLast()->type = "";
+ }
+ "=" { // default value
+ // TODO: this rule is too simple, need to be able to
+ // match things like =")" as well!
+ QCString defVal=&yytext[1];
+ g_defVal.resize(0);
+ g_braceCount=0;
+ BEGIN(FunctionParamDefVal);
+ }
+
+ ")" { // end of parameter list
+ }
+
+ ":"{B} {
+ g_specialBlock = TRUE; // expecting a docstring
+ bodyEntry = current;
+ BEGIN( FunctionBody );
+ }
+ {POUNDCOMMENT} { // a comment
+ }
+ {PARAMNONEMPTY} { // Default rule inside arguments.
+ }
+
+}
+
+<FunctionParamDefVal>{
+ "(" { // internal opening brace
+ g_braceCount++;
+ g_defVal+=*yytext;
+ }
+ "," |
+ ")" {
+ if (g_braceCount==0) // end of default argument
+ {
+ if (current->argList->getLast())
+ {
+ current->argList->getLast()->defval=g_defVal.stripWhiteSpace();
+ }
+ BEGIN(FunctionParams);
+ }
+ else // continue
+ {
+ g_braceCount--;
+ g_defVal+=*yytext;
+ }
+ }
+ . {
+ g_defVal+=*yytext;
+ }
+ \n {
+ g_defVal+=*yytext;
+ yyLineNr++;
+ }
+}
+
+
+<ClassBody>{
+ \n/{IDENTIFIER}{BB} { // new def at indent 0
+ yyLineNr++;
+ endOfDef();
+ g_hideClassDocs = FALSE;
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ BEGIN(Search);
+ }
+ \n/"##"[^#] { // start of a special comment at indent 0
+ yyLineNr++;
+ endOfDef();
+ g_hideClassDocs = FALSE;
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ BEGIN(Search);
+ }
+ ^{BB}/\n { // skip empty line
+ current->program+=yytext;
+ }
+ <<EOF>> {
+ endOfDef();
+ yyterminate();
+ }
+ ^{BB} { // something at indent >0
+ g_curIndent=computeIndent(yytext);
+ //fprintf(stderr,"g_curIndent=%d g_indent=%d\n",g_curIndent,g_indent);
+ if (g_curIndent<=g_indent)
+ // jumped out of the class/method
+ {
+ endOfDef(1);
+ g_indent=g_curIndent;
+ // make sure the next rule matches ^...
+ //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+ g_hideClassDocs = FALSE;
+ BEGIN(Search);
+ }
+ else
+ {
+ current->program+=yytext;
+ }
+ }
+ "'" { // start of a single quoted string
+ current->program+=*yytext;
+ g_stringContext=YY_START;
+ g_specialBlock = FALSE;
+ g_copyString=&current->program;
+ BEGIN( SingleQuoteString );
+ }
+ "\"" { // start of a double quoted string
+ current->program+=*yytext;
+ g_stringContext=YY_START;
+ g_specialBlock = FALSE;
+ g_copyString=&current->program;
+ BEGIN( DoubleQuoteString );
+ }
+ [^ \t\n#'"]+ { // non-special stuff
+ current->program+=yytext;
+ g_specialBlock = FALSE;
+ g_hideClassDocs = FALSE;
+ }
+ {NEWLINE} {
+ current->program+=*yytext;
+ yyLineNr++;
+ }
+ {POUNDCOMMENT} { // normal comment
+ current->program+=yytext;
+ }
+ . { // any character
+ g_specialBlock = FALSE;
+ current->program+=*yytext;
+ }
+ {TRIDOUBLEQUOTE} { // start of a comment block
+ if (!g_hideClassDocs) current->program+=yytext;
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+
+ {TRISINGLEQUOTE} { // start of a comment block
+ if (!g_hideClassDocs) current->program+=yytext;
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+}
+
+<ClassDec>{IDENTIFIER} {
+ if (current->type.isEmpty())
+ {
+ current->type = "class";
+ }
+
+ current->section = Entry::CLASS_SEC;
+ current->name = yytext;
+
+ // prepend scope in case of nested classes
+ if (current_root->section&Entry::SCOPE_MASK)
+ {
+ //printf("*** Prepending scope %s to class %s\n",current_root->name.data(),current->name.data());
+ current->name.prepend(current_root->name+"::");
+ }
+
+ current->name = current->name.stripWhiteSpace();
+ current->fileName = yyFileName;
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockJavaStyle = FALSE;
+ docBlock.resize(0);
+
+ BEGIN(ClassInheritance);
+ }
+
+<ClassInheritance>{
+ ({BB}|[\(,\)]) { // syntactic sugar for the list
+ }
+
+ ":" { // begin of the class definition
+ g_specialBlock = TRUE; // expecting a docstring
+ BEGIN(ClassCaptureIndent);
+ }
+
+ {SCOPE} {
+ current->extends->append(
+ new BaseInfo(substitute(yytext,".","::"),Public,Normal)
+ );
+ //Has base class-do stuff
+ }
+}
+
+
+<ClassCaptureIndent>{
+ "\n"|({BB}"\n") {
+ // Blankline - ignore, keep looking for indentation.
+ lineCount();
+ }
+
+ {TRIDOUBLEQUOTE} { // start of a comment block
+ initTriDoubleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+
+ {TRISINGLEQUOTE} { // start of a comment block
+ initTriSingleQuoteBlock();
+ BEGIN(TripleComment);
+ }
+
+ ^{BB} {
+ current->program=yytext;
+ current->startLine = yyLineNr;
+ g_curIndent=computeIndent(yytext);
+ bodyEntry = current;
+ //fprintf(stderr,"setting indent %d\n",g_curIndent);
+ //printf("current->program=[%s]\n",current->program.data());
+ g_hideClassDocs = TRUE;
+ BEGIN(ClassBody);
+ }
+
+ ""/({NONEMPTY}|{EXPCHAR}) {
+
+ // Just pushback an empty class, and
+ // resume parsing the body.
+ newEntry();
+
+ // printf("Failed to find indent - skipping!");
+ BEGIN( Search );
+ }
+}
+
+
+<VariableDec>{
+ "=" { // the assignment operator
+ //printf("====== VariableDec at line %d\n",yyLineNr);
+ }
+ {B} { // spaces
+ }
+ {INTNUMBER} { // integer value
+ current->type = "int";
+ current->initializer = yytext;
+ BEGIN(VariableEnd);
+ }
+ {FLOATNUMBER} { // floating point value
+ current->type = "float";
+ current->initializer = yytext;
+ BEGIN(VariableEnd);
+ }
+ {STRINGPREFIX}?"'" { // string
+ current->type = "string";
+ current->initializer = yytext;
+ g_copyString=&current->initializer;
+ g_stringContext=VariableEnd;
+ BEGIN( SingleQuoteString );
+ }
+ {STRINGPREFIX}?"\"" { // string
+ current->type = "string";
+ current->initializer = yytext;
+ g_copyString=&current->initializer;
+ g_stringContext=VariableEnd;
+ BEGIN( DoubleQuoteString );
+ }
+ {TRIDOUBLEQUOTE} { // start of a comment block
+ current->type = "string";
+ current->initializer = yytext;
+ g_doubleQuote=TRUE;
+ g_copyString=&current->initializer;
+ g_stringContext=VariableEnd;
+ BEGIN(TripleString);
+ }
+
+ {TRISINGLEQUOTE} { // start of a comment block
+ current->type = "string";
+ current->initializer = yytext;
+ g_doubleQuote=FALSE;
+ g_copyString=&current->initializer;
+ g_stringContext=VariableEnd;
+ BEGIN(TripleString);
+ }
+ "(" { // tuple
+ if (current->mtype!=Property)
+ {
+ current->type = "tuple";
+ }
+ current->initializer+=*yytext;
+ g_atomStart='(';
+ g_atomEnd=')';
+ g_atomCount=1;
+ BEGIN( VariableAtom );
+ }
+ "[" { // list
+ current->type = "list";
+ current->initializer+=*yytext;
+ g_atomStart='[';
+ g_atomEnd=']';
+ g_atomCount=1;
+ BEGIN( VariableAtom );
+ }
+ "{" { // dictionary
+ current->type = "dictionary";
+ current->initializer+=*yytext;
+ g_atomStart='{';
+ g_atomEnd='}';
+ g_atomCount=1;
+ BEGIN( VariableAtom );
+ }
+ "#".* { // comment
+ BEGIN( VariableEnd );
+ }
+ {IDENTIFIER} {
+ current->initializer+=yytext;
+ }
+ . {
+ current->initializer+=*yytext;
+ }
+ \n {
+ unput('\n');
+ BEGIN( VariableEnd );
+ }
+}
+
+<VariableAtom>{
+ [\(\[\{] {
+ current->initializer+=*yytext;
+ if (g_atomStart==*yytext)
+ {
+ g_atomCount++;
+ }
+ }
+ [\)\]\}] {
+ current->initializer+=*yytext;
+ if (g_atomEnd==*yytext)
+ {
+ g_atomCount--;
+ }
+ if (g_atomCount==0)
+ {
+ BEGIN(VariableEnd);
+ }
+ }
+ "\"" {
+ g_stringContext=YY_START;
+ current->initializer+="\"";
+ g_copyString=&current->initializer;
+ BEGIN( DoubleQuoteString );
+ }
+ {IDENTIFIER} {
+ current->initializer+=yytext;
+ }
+ . {
+ current->initializer+=*yytext;
+ }
+ \n {
+ current->initializer+=*yytext;
+ yyLineNr++;
+ }
+
+}
+
+<VariableEnd>{
+ \n {
+ yyLineNr++;
+ newVariable();
+ BEGIN(Search);
+ }
+ . {
+ unput(*yytext);
+ newVariable();
+ BEGIN(Search);
+ }
+ <<EOF>> { yyterminate();
+ newEntry();
+ }
+}
+
+<TripleComment>{
+ {TRIDOUBLEQUOTE} |
+ {TRISINGLEQUOTE} {
+ // printf("Expected module block %d special=%d\n",g_expectModuleDocs,g_specialBlock);
+ if (g_doubleQuote==(yytext[0]=='"'))
+ {
+ if (g_specialBlock) // expecting a docstring
+ {
+ QCString actualDoc=docBlock;
+ if (!docBlockSpecial) // legacy unformatted docstring
+ {
+ actualDoc.prepend("\\verbatim ");
+ actualDoc.append("\\endverbatim ");
+ }
+ //printf("-------> current=%p bodyEntry=%p\n",current,bodyEntry);
+ handleCommentBlock(actualDoc, FALSE);
+ }
+ else if (g_packageCommentAllowed) // expecting module docs
+ {
+ QCString actualDoc=docBlock;
+ if (!docBlockSpecial) // legacy unformatted docstring
+ {
+ actualDoc.prepend("\\verbatim ");
+ actualDoc.append("\\endverbatim ");
+ }
+ actualDoc.prepend("\\namespace "+g_moduleScope+"\\_linebr ");
+ handleCommentBlock(actualDoc, FALSE);
+ }
+ if ((docBlockContext==ClassBody && !g_hideClassDocs) ||
+ docBlockContext==FunctionBody)
+ {
+ current->program+=docBlock;
+ current->program+=yytext;
+ }
+ if (g_hideClassDocs)
+ current->startLine = yyLineNr;
+ g_hideClassDocs=FALSE;
+ BEGIN(docBlockContext);
+ }
+ else
+ {
+ docBlock += yytext;
+ }
+ g_packageCommentAllowed = FALSE;
+ }
+
+
+ ^{BB} { // leading whitespace
+ int indent = computeIndent(yytext);
+ if (indent>=g_curIndent)
+ { // strip g_curIndent amount of whitespace
+ int i;
+ for (i=0;i<indent-g_curIndent;i++) docBlock+=' ';
+ //fprintf(stderr,"stripping indent %d\n",g_curIndent);
+ }
+ else
+ {
+ //fprintf(stderr,"not stripping: %d<%d\n",indent,g_curIndent);
+ docBlock += yytext;
+ }
+ }
+ [^"'\n \t]+ {
+ docBlock += yytext;
+ }
+ \n {
+ yyLineNr++;
+ docBlock += yytext;
+ }
+ . {
+ docBlock += yytext;
+ }
+}
+
+<SpecialComment>{
+ ^{B}"#"("#")* { // skip leading hashes
+ }
+ \n/{B}"#" { // continuation of the comment on the next line
+ docBlock+='\n';
+ docBrief = FALSE;
+ startCommentBlock(FALSE);
+ yyLineNr++;
+ }
+ [^#\n]+ { // any other stuff
+ docBlock+=yytext;
+ }
+ \n { // new line that ends the comment
+ handleCommentBlock(docBlock, docBrief);
+ yyLineNr++;
+ BEGIN(docBlockContext);
+ }
+ . { // anything we missed
+ docBlock+=*yytext;
+ }
+}
+
+<SingleQuoteString>{
+ \\{B}\n { // line continuation
+ addToString(yytext);
+ yyLineNr++;
+ }
+ \\. { // espaced char
+ addToString(yytext);
+ }
+ "\"\"\"" { // tripple double quotes
+ addToString(yytext);
+ }
+ "'" { // end of the string
+ addToString(yytext);
+ BEGIN(g_stringContext);
+ }
+ [^"'\n\\]+ { // normal chars
+ addToString(yytext);
+ }
+ . { // normal char
+ addToString(yytext);
+ }
+}
+
+<DoubleQuoteString>{
+ \\{B}\n { // line continuation
+ addToString(yytext);
+ yyLineNr++;
+ }
+ \\. { // espaced char
+ addToString(yytext);
+ }
+ "'''" { // tripple single quotes
+ addToString(yytext);
+ }
+ "\"" { // end of the string
+ addToString(yytext);
+ BEGIN(g_stringContext);
+ }
+ [^"'\n\\]+ { // normal chars
+ addToString(yytext);
+ }
+ . { // normal char
+ addToString(yytext);
+ }
+}
+
+<TripleString>{
+ {TRIDOUBLEQUOTE} |
+ {TRISINGLEQUOTE} {
+ *g_copyString += yytext;
+ if (g_doubleQuote==(yytext[0]=='"'))
+ {
+ BEGIN(g_stringContext);
+ }
+ }
+
+
+ ({LONGSTRINGBLOCK}) {
+ lineCount();
+ *g_copyString += yytext;
+ }
+ \n {
+ yyLineNr++;
+ *g_copyString += yytext;
+ }
+ . {
+ *g_copyString += *yytext;
+ }
+}
+
+ /* ------------ End rules -------------- */
+
+ /*
+<*>({NONEMPTY}|{EXPCHAR}|{BB}) { // This should go one character at a time.
+ // printf("[pyscanner] '%s' [ state %d ] [line %d] no match\n",
+ // yytext, YY_START, yyLineNr);
+
+ }
+ */
+
+<*>{NEWLINE} {
+ //printf("[pyscanner] %d NEWLINE [line %d] no match\n",
+ // YY_START, yyLineNr);
+
+ lineCount();
+ }
+
+<*>. {
+ //printf("[pyscanner] '%s' [ state %d ] [line %d] no match\n",
+ // yytext, YY_START, yyLineNr);
+
+ }
+
+
+%%
+
+//----------------------------------------------------------------------------
+
+static void parseCompounds(Entry *rt)
+{
+ //printf("parseCompounds(%s)\n",rt->name.data());
+ EntryListIterator eli(*rt->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (!ce->program.isEmpty())
+ {
+ //printf("-- %s ---------\n%s\n---------------\n",
+ // ce->name.data(),ce->program.data());
+ // init scanner state
+ inputString = ce->program;
+ inputPosition = 0;
+ pyscanYYrestart( pyscanYYin ) ;
+ if (ce->section&Entry::COMPOUND_MASK)
+ {
+ current_root = ce ;
+ BEGIN( Search );
+ }
+ else if (ce->parent())
+ {
+ current_root = ce->parent();
+ //printf("Searching for member variables in %s parent=%s\n",
+ // ce->name.data(),ce->parent->name.data());
+ BEGIN( SearchMemVars );
+ }
+ yyFileName = ce->fileName;
+ yyLineNr = ce->startLine ;
+ if (current) delete current;
+ current = new Entry;
+
+ groupEnterCompound(yyFileName,yyLineNr,ce->name);
+
+ pyscanYYlex() ;
+ g_lexInit=TRUE;
+ delete current; current=0;
+ ce->program.resize(0);
+
+ groupLeaveCompound(yyFileName,yyLineNr,ce->name);
+
+ }
+ parseCompounds(ce);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+
+static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+{
+ initParser();
+
+ inputString = fileBuf;
+ inputPosition = 0;
+
+ protection = Public;
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ current_root = rt;
+ g_specialBlock = FALSE;
+
+
+ inputFile.setName(fileName);
+ if (inputFile.open(IO_ReadOnly))
+ {
+ yyLineNr= 1 ;
+ yyFileName = fileName;
+ //setContext();
+ msg("Parsing file %s...\n",yyFileName.data());
+
+ QFileInfo fi(fileName);
+ g_moduleScope = findPackageScope(fileName);
+ QString baseName=fi.baseName();
+ if (baseName!="__init__") // package initializer file is not a package itself
+ {
+ if (!g_moduleScope.isEmpty())
+ {
+ g_moduleScope+="::";
+ }
+ g_moduleScope+=baseName;
+ }
+
+ current = new Entry;
+ current->name = g_moduleScope;
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "namespace";
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+
+ rt->addSubEntry(current);
+
+ current_root = current ;
+ initParser();
+ current = new Entry;
+
+ groupEnterFile(yyFileName,yyLineNr);
+
+ current->reset();
+ pyscanYYrestart( pyscanYYin );
+ BEGIN( Search );
+ pyscanYYlex();
+ g_lexInit=TRUE;
+
+ groupLeaveFile(yyFileName,yyLineNr);
+
+ current_root->program.resize(0);
+ delete current; current=0;
+
+ parseCompounds(current_root);
+
+ inputFile.close();
+ }
+
+}
+
+//----------------------------------------------------------------------------
+
+static void parsePrototype(const QCString &text)
+{
+ //printf("**** parsePrototype(%s) begin\n",text.data());
+ if (text.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,"Empty prototype found!");
+ return;
+ }
+
+ g_specialBlock = FALSE;
+ g_packageCommentAllowed = FALSE;
+
+ const char *orgInputString;
+ int orgInputPosition;
+ YY_BUFFER_STATE orgState;
+
+ // save scanner state
+ orgState = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer(yy_create_buffer(pyscanYYin, YY_BUF_SIZE));
+ orgInputString = inputString;
+ orgInputPosition = inputPosition;
+
+ // set new string
+ inputString = text;
+ inputPosition = 0;
+ pyscanYYrestart( pyscanYYin );
+
+ BEGIN( FunctionDec );
+
+ pyscanYYlex();
+ g_lexInit=TRUE;
+
+ current->name = current->name.stripWhiteSpace();
+ if (current->section == Entry::MEMBERDOC_SEC && current->args.isEmpty())
+ current->section = Entry::VARIABLEDOC_SEC;
+
+ // restore original scanner state
+
+ YY_BUFFER_STATE tmpBuf = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer(orgState);
+ yy_delete_buffer(tmpBuf);
+
+ inputString = orgInputString;
+ inputPosition = orgInputPosition;
+
+ //printf("**** parsePrototype end\n");
+}
+
+void pyscanFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ pyscanYYlex_destroy();
+ }
+#endif
+}
+
+//----------------------------------------------------------------------------
+
+void PythonLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+{
+ g_thisParser = this;
+ ::parseMain(fileName,fileBuf,root);
+
+ // May print the AST for debugging purposes
+ // printAST(global_root);
+}
+
+bool PythonLanguageScanner::needsPreprocessing(const QCString &)
+{
+ return FALSE;
+}
+
+void PythonLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName,
+ FileDef *fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ MemberDef *memberDef,
+ bool showLineNumbers
+ )
+{
+ ::parsePythonCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
+ fileDef,startLine,endLine,inlineFragment,memberDef,
+ showLineNumbers);
+}
+
+void PythonLanguageScanner::parsePrototype(const char *text)
+{
+ ::parsePrototype(text);
+
+}
+
+void PythonLanguageScanner::resetCodeParserState()
+{
+ ::resetPythonCodeParserState();
+}
+
+//----------------------------------------------------------------------------
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void pyscannerYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
diff --git a/src/qhp.cpp b/src/qhp.cpp
new file mode 100644
index 0000000..6a9e28e
--- /dev/null
+++ b/src/qhp.cpp
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) 2008 by Sebastian Pipping.
+ * Copyright (C) 2008 Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Sebastian Pipping <sebastian@pipping.org>
+ */
+
+#include "qhp.h"
+#include "qhpxmlwriter.h"
+#include "message.h"
+#include "config.h"
+#include "memberdef.h"
+#include "groupdef.h"
+#include "filedef.h"
+
+#include <qstringlist.h>
+#include <string.h>
+
+static QCString makeFileName(const char * withoutExtension)
+{
+ if (!withoutExtension) return QCString();
+ return QCString(withoutExtension)+".html";
+}
+
+static QCString makeRef(const char * withoutExtension, const char * anchor)
+{
+ if (!withoutExtension) return QCString();
+ QCString result = makeFileName(withoutExtension);
+ if (!anchor) return result;
+ return result+"#"+anchor;
+}
+
+Qhp::Qhp() : m_prevSectionLevel(0), m_sectionLevel(0)
+{
+ m_doc.setIndentLevel(0);
+ m_toc.setIndentLevel(2);
+ m_index.setIndentLevel(2);
+ m_files.setIndentLevel(2);
+}
+
+Qhp::~Qhp()
+{
+ clearPrevSection();
+}
+
+void Qhp::initialize()
+{
+ /*
+ <QtHelpProject version="1.0">
+ <namespace>mycompany.com.myapplication.1_0</namespace>
+ <virtualFolder>doc</virtualFolder>
+ <customFilter name="My Application 1.0">
+ <filterAttribute>myapp</filterAttribute>
+ <filterAttribute>1.0</filterAttribute>
+ </customFilter>
+ <filterSection>
+ <filterAttribute>myapp</filterAttribute>
+ <filterAttribute>1.0</filterAttribute>
+ ..
+ */
+ QCString nameSpace = Config_getString("QHP_NAMESPACE");
+ QCString virtualFolder = Config_getString("QHP_VIRTUAL_FOLDER");
+
+ const char * rootAttributes[] =
+ { "version", "1.0", 0 };
+
+ m_doc.open("QtHelpProject", rootAttributes);
+ m_doc.openCloseContent("namespace", nameSpace);
+ m_doc.openCloseContent("virtualFolder", virtualFolder);
+
+ // Add custom filter
+ QCString filterName = Config_getString("QHP_CUST_FILTER_NAME");
+ if (!filterName.isEmpty())
+ {
+ const char * tagAttributes[] =
+ { "name", filterName, 0 };
+ m_doc.open("customFilter", tagAttributes);
+
+ QStringList customFilterAttributes = QStringList::split(QChar(' '), Config_getString("QHP_CUST_FILTER_ATTRS"));
+ for (int i = 0; i < (int)customFilterAttributes.count(); i++)
+ {
+ m_doc.openCloseContent("filterAttribute", customFilterAttributes[i]);
+ }
+ m_doc.close("customFilter");
+ }
+
+ m_doc.open("filterSection");
+
+ // Add section attributes
+ QStringList sectionFilterAttributes = QStringList::split(QChar(' '),
+ Config_getString("QHP_SECT_FILTER_ATTRS"));
+ if (!sectionFilterAttributes.contains(QString("doxygen")))
+ {
+ sectionFilterAttributes << "doxygen";
+ }
+ for (int i = 0; i < (int)sectionFilterAttributes.count(); i++)
+ {
+ m_doc.openCloseContent("filterAttribute", sectionFilterAttributes[i]);
+ }
+
+ m_toc.open("toc");
+
+ // Add extra root node
+ QCString fullProjectname = getFullProjectName();
+ const char * const attributes[] =
+ { "title", fullProjectname,
+ "ref", "index.html",
+ NULL
+ };
+ m_toc.open("section", attributes);
+ m_prevSectionLevel = 1;
+ m_sectionLevel = 1;
+
+ m_index.open("keywords");
+ m_files.open("files");
+}
+
+void Qhp::finalize()
+{
+ // Finish TOC
+ handlePrevSection();
+ for (int i = m_prevSectionLevel; i > 0; i--)
+ {
+ m_toc.close("section");
+ }
+ m_toc.close("toc");
+ m_doc.insert(m_toc);
+
+ // Finish index
+ m_index.close("keywords");
+ m_doc.insert(m_index);
+
+ // Finish files
+ m_files.close("files");
+ m_doc.insert(m_files);
+
+ m_doc.close("filterSection");
+ m_doc.close("QtHelpProject");
+
+ QCString fileName = Config_getString("HTML_OUTPUT") + "/" + getQhpFileName();
+ QFile file(fileName);
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n", fileName.data());
+ exit(1);
+ }
+ m_doc.dumpTo(file);
+}
+
+void Qhp::incContentsDepth()
+{
+ m_sectionLevel++;
+}
+
+void Qhp::decContentsDepth()
+{
+ if (m_sectionLevel <= 0)
+ {
+ return;
+ }
+ m_sectionLevel--;
+}
+
+void Qhp::addContentsItem(bool /*isDir*/, const char * name,
+ const char * /*ref*/, const char * file,
+ const char * /*anchor*/)
+{
+ // Backup difference before modification
+ int diff = m_prevSectionLevel - m_sectionLevel;
+
+ handlePrevSection();
+ setPrevSection(name, file, m_sectionLevel);
+
+ // Close sections as needed
+ for (; diff > 0; diff--)
+ {
+ m_toc.close("section");
+ }
+}
+
+void Qhp::addIndexItem(Definition *context,MemberDef *md,
+ const char *word)
+{
+ (void)word;
+
+ if (md) // member
+ {
+ static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
+ if (context==0) // global member
+ {
+ if (md->getGroupDef())
+ context = md->getGroupDef();
+ else if (md->getFileDef())
+ context = md->getFileDef();
+ }
+ if (context==0) return; // should not happen
+ QCString cfname = md->getOutputFileBase();
+ QCString cfiname = context->getOutputFileBase();
+ QCString level1 = context->name();
+ QCString level2 = word ? QCString(word) : md->name();
+ QCString contRef = separateMemberPages ? cfname : cfiname;
+ QCString anchor = md->anchor();
+
+ QCString ref;
+
+ // <keyword name="foo" id="MyApplication::foo" ref="doc.html#foo"/>
+ ref = makeRef(contRef, anchor);
+ QCString id = level1+"::"+level2;
+ const char * attributes[] =
+ {
+ "name", level2,
+ "id", id,
+ "ref", ref,
+ 0
+ };
+ m_index.openClose("keyword", attributes);
+ }
+ else if (context) // container
+ {
+ // <keyword name="Foo" id="Foo" ref="doc.html"/>
+ QCString contRef = context->getOutputFileBase();
+ QCString level1 = word ? QCString(word) : context->name();
+ QCString ref = makeFileName(contRef);
+ const char * attributes[] =
+ {
+ "name", level1,
+ "id", level1,
+ "ref", ref,
+ 0
+ };
+ m_index.openClose("keyword", attributes);
+ }
+}
+
+void Qhp::addIndexFile(const char * name)
+{
+ addFile(name);
+}
+
+QCString Qhp::getQhpFileName()
+{
+ return "index.qhp";
+}
+
+QCString Qhp::getFullProjectName()
+{
+ QCString projectName = Config_getString("PROJECT_NAME");
+ QCString versionText = Config_getString("PROJECT_NUMBER");
+ if (projectName.isEmpty()) projectName="Root";
+ return projectName + (versionText.isEmpty()
+ ? QCString("")
+ : QCString(" ") + versionText);
+}
+
+void Qhp::handlePrevSection()
+{
+ /*
+ <toc>
+ <section title="My Application Manual" ref="index.html">
+ <section title="Chapter 1" ref="doc.html#chapter1"/>
+ <section title="Chapter 2" ref="doc.html#chapter2"/>
+ <section title="Chapter 3" ref="doc.html#chapter3"/>
+ </section>
+ </toc>
+ */
+
+ if (m_prevSectionTitle.isNull())
+ {
+ return;
+ }
+
+ // We skip "Main Page" as our extra root is pointing to that
+ if (!((m_prevSectionLevel==1) && (m_prevSectionTitle=="Main Page")))
+ {
+ QCString finalRef = makeFileName(m_prevSectionRef);
+
+ const char * const attributes[] =
+ { "title", m_prevSectionTitle,
+ "ref", finalRef,
+ NULL
+ };
+
+ if (m_prevSectionLevel < m_sectionLevel)
+ {
+ // Section with children
+ m_toc.open("section", attributes);
+ }
+ else
+ {
+ // Section without children
+ m_toc.openClose("section", attributes);
+ }
+ }
+
+ clearPrevSection();
+}
+
+void Qhp::setPrevSection(const char * title, const char * ref, int level)
+{
+ m_prevSectionTitle = title;
+ m_prevSectionRef = ref;
+ m_prevSectionLevel = level;
+}
+
+void Qhp::clearPrevSection()
+{
+ m_prevSectionTitle.resize(0);
+ m_prevSectionRef.resize(0);
+}
+
+void Qhp::addFile(const char * fileName)
+{
+ m_files.openCloseContent("file", fileName);
+}
+
+void Qhp::addImageFile(const char *fileName)
+{
+ addFile(fileName);
+}
+
+void Qhp::addStyleSheetFile(const char *fileName)
+{
+ addFile(fileName);
+}
+
diff --git a/src/qhp.h b/src/qhp.h
new file mode 100644
index 0000000..e5b4a08
--- /dev/null
+++ b/src/qhp.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2008 by Sebastian Pipping.
+ * Copyright (C) 2008 Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Sebastian Pipping <sebastian@pipping.org>
+ */
+
+#ifndef DOXYGEN_QHP_H
+#define DOXYGEN_QHP_H
+
+#include "index.h"
+#include "qhpxmlwriter.h"
+
+class Qhp : public IndexIntf
+{
+ public:
+ Qhp();
+ ~Qhp();
+
+ // BEGIN IndexIntf
+ void initialize();
+ void finalize();
+ void incContentsDepth();
+ void decContentsDepth();
+ void addContentsItem(bool isDir, const char * name, const char * ref,
+ const char * file, const char * anchor);
+ void addIndexItem(Definition *context,MemberDef *md,const char *title);
+ void addIndexFile(const char * name);
+ void addImageFile(const char * name);
+ void addStyleSheetFile(const char * name);
+ // END IndexIntf
+
+ static QCString getQhpFileName();
+
+ private:
+ void handlePrevSection();
+ void clearPrevSection();
+ void setPrevSection(const char * title, const char * ref, int level);
+ void addFile(const char * fileName);
+
+ static QCString getFullProjectName();
+
+ QhpXmlWriter m_doc;
+ QhpXmlWriter m_toc;
+ QhpXmlWriter m_index;
+ QhpXmlWriter m_files;
+
+ QCString m_prevSectionTitle;
+ QCString m_prevSectionRef;
+
+ int m_prevSectionLevel;
+ int m_sectionLevel;
+
+ //QCString m_prevIdName;
+ //QCString m_prevIdRef;
+};
+
+#endif // DOXYGEN_QHP_H
+
diff --git a/src/qhpxmlwriter.cpp b/src/qhpxmlwriter.cpp
new file mode 100644
index 0000000..93bb8cd
--- /dev/null
+++ b/src/qhpxmlwriter.cpp
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2008 by Sebastian Pipping.
+ * Copyright (C) 2008 Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Sebastian Pipping <sebastian@pipping.org>
+ */
+
+#include "qhpxmlwriter.h"
+#include "util.h"
+
+#include <qfile.h>
+
+QhpXmlWriter::QhpXmlWriter()
+ : m_out(&m_backend), m_indentLevel(0),
+ m_curLineIndented(false), m_compress(false)
+{
+}
+
+QhpXmlWriter::~QhpXmlWriter()
+{
+}
+
+void QhpXmlWriter::setIndentLevel(int level)
+{
+ m_indentLevel = level;
+}
+
+void QhpXmlWriter::setCompressionEnabled(bool enabled)
+{
+ m_compress = enabled;
+}
+
+void QhpXmlWriter::insert(QhpXmlWriter const & source)
+{
+ m_out << source.m_backend.data();
+}
+
+void QhpXmlWriter::dumpTo(QFile & file)
+{
+ file.writeBlock(m_backend.data(), m_backend.length());
+}
+
+void QhpXmlWriter::open(char const * elementName,
+ char const * const * attributes)
+{
+ indent();
+ openPure(elementName, attributes);
+ newLine();
+ m_indentLevel++;
+}
+
+void QhpXmlWriter::openClose(char const * elementName,
+ char const * const * attributes)
+{
+ indent();
+ openClosePure(elementName, attributes);
+ newLine();
+}
+
+void QhpXmlWriter::openCloseContent(char const * elementName,
+ char const * content)
+{
+ indent();
+ openPure(elementName);
+ m_out << convertToXML(content);
+ closePure(elementName);
+ newLine();
+}
+
+void QhpXmlWriter::close(char const * elementName)
+{
+ m_indentLevel--;
+ indent();
+ closePure(elementName);
+ newLine();
+}
+
+void QhpXmlWriter::indent()
+{
+ if (m_curLineIndented)
+ {
+ return;
+ }
+ for (int i = 0; i < m_indentLevel; i++)
+ {
+ m_out << " ";
+ }
+ m_curLineIndented = true;
+}
+
+void QhpXmlWriter::newLine()
+{
+ if (!m_compress)
+ {
+ m_out << "\n";
+ m_curLineIndented = false;
+ }
+}
+
+void QhpXmlWriter::openPureHelper(char const * elementName,
+ char const * const * attributes, bool close)
+{
+ m_out << "<" << elementName;
+ if (attributes)
+ {
+ for (char const * const * walker = attributes;
+ walker[0]; walker += 2)
+ {
+ char const * const key = walker[0];
+ char const * const value = walker[1];
+ if (!value)
+ {
+ continue;
+ }
+ m_out << " " << key << "=\"" << convertToXML(value) << "\"";
+ }
+ }
+
+ if (close)
+ {
+ m_out << " /";
+ }
+ m_out << ">";
+}
+
+void QhpXmlWriter::openPure(char const * elementName,
+ char const * const * attributes)
+{
+ openPureHelper(elementName, attributes, false);
+}
+
+void QhpXmlWriter::openClosePure(char const * elementName,
+ char const * const * attributes)
+{
+ openPureHelper(elementName, attributes, true);
+}
+
+void QhpXmlWriter::closePure(char const * elementName)
+{
+ m_out << "</" << elementName << ">";
+}
+
diff --git a/src/qhpxmlwriter.h b/src/qhpxmlwriter.h
new file mode 100644
index 0000000..c88eebd
--- /dev/null
+++ b/src/qhpxmlwriter.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2008 by Sebastian Pipping.
+ * Copyright (C) 2008 Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Sebastian Pipping <sebastian@pipping.org>
+ */
+
+#ifndef QHPXMLWRITER_H
+#define QHPXMLWRITER_H
+
+#include <qstring.h>
+#include "ftextstream.h"
+
+class QFile;
+
+class QhpXmlWriter
+{
+ public:
+ QhpXmlWriter();
+ ~QhpXmlWriter();
+
+ void setIndentLevel(int level);
+ void setCompressionEnabled(bool enabled);
+ void insert(QhpXmlWriter const & source);
+ void dumpTo(QFile & file);
+ void open(char const * elementName,
+ char const * const * attributes = 0);
+ void openClose(char const * elementName,
+ char const * const * attributes = 0);
+ void openCloseContent(char const * elementName, char const * content);
+ void close(char const * elementName);
+
+ static char * dupEscaped(const char * source);
+
+ private:
+ void indent();
+ void newLine();
+ void openPureHelper(char const * elementName,
+ char const * const * attributes, bool close);
+ void openPure(char const * elementName,
+ char const * const * attributes = 0);
+ void openClosePure(char const * elementName,
+ char const * const * attributes = 0);
+ void closePure(char const * elementName);
+
+ QGString m_backend;
+ FTextStream m_out;
+ int m_indentLevel;
+ bool m_curLineIndented;
+ bool m_compress;
+
+};
+
+#endif // QHPXMLWRITER_H
diff --git a/src/qtbc.h b/src/qtbc.h
new file mode 100644
index 0000000..d5969d2
--- /dev/null
+++ b/src/qtbc.h
@@ -0,0 +1,45 @@
+/******************************************************************************
+ *
+ * $Id: qtbc.h,v 1.4 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef QTBC_H
+#define QTBC_H
+
+/*! This file contains some hacks to make Doxygen work with
+ * Qt version 2.00 and Qt version 1.xx
+ */
+
+#include <qglobal.h>
+
+#if QT_VERSION >= 200
+
+#include <locale.h>
+
+#define GCI QCollection::Item
+
+#include <qcstring.h>
+#include <qstring.h>
+inline QCString convertToQCString(const QString &s) { return s.utf8(); }
+
+#else /* QT_VERSION < 200 */
+
+#include <qstring.h>
+#define QCString QString
+inline QCString convertToQCString(const QCString &s) { return s; }
+
+#endif
+
+#endif
diff --git a/src/reflist.cpp b/src/reflist.cpp
new file mode 100644
index 0000000..5e5c95f
--- /dev/null
+++ b/src/reflist.cpp
@@ -0,0 +1,162 @@
+/******************************************************************************
+ *
+ * $Id: reflist.cpp,v 1.2 2001/03/19 19:27:41 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdio.h>
+#include "reflist.h"
+#include "util.h"
+
+/*! Create a list of items that are cross referenced with documentation blocks
+ * @param listName String representing the name of the list.
+ * @param pageTitle String representing the title of the list page.
+ * @param secTitle String representing the title of the section.
+ */
+RefList::RefList(const char *listName,
+ const char *pageTitle,
+ const char *secTitle
+ )
+{
+ m_itemList = 0;
+ m_dict = 0;
+ m_dictIterator = 0;
+ m_id = 0;
+ m_listName = listName;
+ m_pageTitle = pageTitle;
+ m_secTitle = secTitle;
+}
+
+/*! Destroy the todo list. Currently not called! */
+RefList::~RefList()
+{
+ delete m_dictIterator;
+ delete m_dict;
+ delete m_itemList;
+}
+
+/*! Adds a new item to the list.
+ * \returns A unique id for this item.
+ */
+int RefList::addRefItem()
+{
+ if (m_dict==0)
+ {
+ m_dict = new QIntDict<RefItem>(1009);
+ m_dict->setAutoDelete(TRUE);
+ m_dictIterator = new QIntDictIterator<RefItem>(*m_dict);
+ }
+ RefItem *item = new RefItem;
+ m_id++;
+ m_dict->insert(m_id,item);
+ return m_id;
+}
+
+/*! Returns an item given it's id that is obtained with addRefItem()
+ * \param itemId item's identifier.
+ * \returns A pointer to the todo item's structure.
+ */
+RefItem *RefList::getRefItem(int itemId)
+{
+ return m_dict ? m_dict->find(itemId) : 0;
+}
+
+/*! Returns the first item in the dictionary or 0 if
+ * non is available.
+ * Items are not sorted.
+ */
+RefItem *RefList::getFirstRefItem()
+{
+ return m_dictIterator ? m_dictIterator->toFirst() : 0;
+}
+
+/*! Returns the next item in the dictionary or 0 if
+ * we are at the end of the list.
+ * Items are not sorted.
+ */
+RefItem *RefList::getNextRefItem()
+{
+ return m_dictIterator ? m_dictIterator->operator++() : 0;
+}
+
+/*! Returns the name of the list as set in the constructor. */
+QCString RefList::listName() const
+{
+ return m_listName;
+}
+
+QCString RefList::pageTitle() const
+{
+ return m_pageTitle;
+}
+
+QCString RefList::sectionTitle() const
+{
+ return m_secTitle;
+}
+
+void RefList::insertIntoList(const char *key,RefItem *item)
+{
+ if (m_itemList==0)
+ {
+ m_itemList = new SortedRefItems(1009);
+ }
+ RefItem *ri = m_itemList->find(key);
+ if (ri==0)
+ {
+ m_itemList->append(key,item);
+ }
+ else // item already added to the list (i.e. multiple item for the same
+ // entity)
+ {
+ if (ri!=item)
+ {
+ ri->extraItems.append(item);
+ }
+ }
+}
+
+void RefList::generatePage()
+{
+ if (m_itemList==0) return;
+ m_itemList->sort();
+ SDict<RefItem>::Iterator it(*m_itemList);
+ RefItem *item;
+ for (it.toFirst();(item=it.current());++it)
+ {
+ QCString doc;
+ doc = "\\anchor ";
+ doc += item->listAnchor;
+ doc += " <dl><dt>";
+ doc += item->prefix;
+ doc += " \\_internalref ";
+ doc += item->name;
+ doc += " \"";
+ doc += item->title;
+ doc += "\"";
+ if (!item->args.isEmpty()) doc += item->args;
+ doc += "</dt>\n<dd>";
+ doc += item->text;
+ QListIterator<RefItem> li(item->extraItems);
+ RefItem *extraItem;
+ for (li.toFirst();(extraItem=li.current());++li)
+ {
+ doc += "<p>" + extraItem->text;
+ }
+ doc += "</dd></dl>\n";
+ addRelatedPage(m_listName,m_pageTitle,doc,0,m_listName,1,0,0,0);
+ }
+}
+
diff --git a/src/reflist.h b/src/reflist.h
new file mode 100644
index 0000000..e6aaeef
--- /dev/null
+++ b/src/reflist.h
@@ -0,0 +1,94 @@
+/******************************************************************************
+ *
+ * $Id: reflist.h,v 1.2 2001/03/19 19:27:41 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _REFLIST_H
+#define _REFLIST_H
+
+#include "qtbc.h"
+#include <qintdict.h>
+#include <qlist.h>
+#include "sortdict.h"
+
+/*! This struct represents an item in the list of references. */
+struct RefItem
+{
+ RefItem() /*: written(FALSE)*/ {}
+ QCString text; //!< text of the item.
+ QCString listAnchor; //!< anchor in the list
+
+ QCString prefix; //!< type prefix for the name
+ QCString name; //!< name of the entity containing the reference
+ QCString title; //!< display name of the entity
+ QCString args; //!< optional arguments for the entity (if function)
+ //bool written;
+ QList<RefItem> extraItems; //!< more items belonging to the same entity
+};
+
+/*! List of items sorted by title */
+class SortedRefItems : public SDict<RefItem>
+{
+ public:
+ SortedRefItems(int size=17) : SDict<RefItem>(size) {}
+ virtual ~SortedRefItems() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ RefItem *r1 = (RefItem*)item1;
+ RefItem *r2 = (RefItem*)item2;
+ return stricmp(r1->title,r2->title);
+ }
+};
+
+/*! @brief List of cross-referenced items
+ *
+ * This class represents a list of items that are put
+ * at a certain point in the documentation by some special command
+ * and are collected in a list. The items cross-reference the
+ * documentation and the list.
+ *
+ * Examples are the todo list, the test list and the bug list,
+ * introduced by the \\todo, \\test, and \\bug commands respectively.
+ */
+class RefList
+{
+ public:
+ int addRefItem();
+ RefItem *getRefItem(int todoItemId);
+ RefItem *getFirstRefItem();
+ RefItem *getNextRefItem();
+ QCString listName() const;
+ QCString pageTitle() const;
+ QCString sectionTitle() const;
+
+ RefList(const char *listName,
+ const char *pageTitle,const char *secTitle
+ );
+ ~RefList();
+ void insertIntoList(const char *key,RefItem *item);
+ void generatePage();
+
+ private:
+ int m_id;
+ QCString m_listName;
+ QCString m_pageTitle;
+ QCString m_secTitle;
+ SortedRefItems *m_itemList;
+ QIntDict<RefItem> *m_dict;
+ QIntDictIterator<RefItem> *m_dictIterator;
+};
+
+#endif
diff --git a/src/resize.js b/src/resize.js
new file mode 100644
index 0000000..04fa95c
--- /dev/null
+++ b/src/resize.js
@@ -0,0 +1,81 @@
+var cookie_namespace = 'doxygen';
+var sidenav,navtree,content,header;
+
+function readCookie(cookie)
+{
+ var myCookie = cookie_namespace+"_"+cookie+"=";
+ if (document.cookie)
+ {
+ var index = document.cookie.indexOf(myCookie);
+ if (index != -1)
+ {
+ var valStart = index + myCookie.length;
+ var valEnd = document.cookie.indexOf(";", valStart);
+ if (valEnd == -1)
+ {
+ valEnd = document.cookie.length;
+ }
+ var val = document.cookie.substring(valStart, valEnd);
+ return val;
+ }
+ }
+ return 0;
+}
+
+function writeCookie(cookie, val, expiration)
+{
+ if (val==undefined) return;
+ if (expiration == null)
+ {
+ var date = new Date();
+ date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
+ expiration = date.toGMTString();
+ }
+ document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/";
+}
+
+function resizeWidth()
+{
+ var windowWidth = $(window).width() + "px";
+ var sidenavWidth = $(sidenav).width();
+ content.css({marginLeft:parseInt(sidenavWidth)+6+"px"}); //account for 6px-wide handle-bar
+ writeCookie('width',sidenavWidth, null);
+}
+
+function restoreWidth(navWidth)
+{
+ var windowWidth = $(window).width() + "px";
+ content.css({marginLeft:parseInt(navWidth)+6+"px"});
+ sidenav.css({width:navWidth + "px"});
+}
+
+function resizeHeight()
+{
+ var headerHeight = header.height();
+ var footerHeight = footer.height();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ content.css({height:windowHeight + "px"});
+ navtree.css({height:windowHeight + "px"});
+ sidenav.css({height:windowHeight + "px",top: headerHeight+"px"});
+}
+
+function initResizable()
+{
+ header = $("#top");
+ sidenav = $("#side-nav");
+ content = $("#doc-content");
+ navtree = $("#nav-tree");
+ footer = $("#nav-path");
+ $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } });
+ $(window).resize(function() { resizeHeight(); });
+ var width = readCookie('width');
+ if (width) { restoreWidth(width); } else { resizeWidth(); }
+ resizeHeight();
+ var url = location.href;
+ var i=url.indexOf("#");
+ if (i>=0) window.location.hash=url.substr(i);
+ var _preventDefault = function(evt) { evt.preventDefault(); };
+ $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
+}
+
+
diff --git a/src/resize_js.h b/src/resize_js.h
new file mode 100644
index 0000000..7e627cc
--- /dev/null
+++ b/src/resize_js.h
@@ -0,0 +1,81 @@
+"var cookie_namespace = 'doxygen'; \n"
+"var sidenav,navtree,content,header;\n"
+"\n"
+"function readCookie(cookie) \n"
+"{\n"
+" var myCookie = cookie_namespace+\"_\"+cookie+\"=\";\n"
+" if (document.cookie) \n"
+" {\n"
+" var index = document.cookie.indexOf(myCookie);\n"
+" if (index != -1) \n"
+" {\n"
+" var valStart = index + myCookie.length;\n"
+" var valEnd = document.cookie.indexOf(\";\", valStart);\n"
+" if (valEnd == -1) \n"
+" {\n"
+" valEnd = document.cookie.length;\n"
+" }\n"
+" var val = document.cookie.substring(valStart, valEnd);\n"
+" return val;\n"
+" }\n"
+" }\n"
+" return 0;\n"
+"}\n"
+"\n"
+"function writeCookie(cookie, val, expiration) \n"
+"{\n"
+" if (val==undefined) return;\n"
+" if (expiration == null) \n"
+" {\n"
+" var date = new Date();\n"
+" date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week\n"
+" expiration = date.toGMTString();\n"
+" }\n"
+" document.cookie = cookie_namespace + \"_\" + cookie + \"=\" + val + \"; expires=\" + expiration+\"; path=/\";\n"
+"}\n"
+" \n"
+"function resizeWidth() \n"
+"{\n"
+" var windowWidth = $(window).width() + \"px\";\n"
+" var sidenavWidth = $(sidenav).width();\n"
+" content.css({marginLeft:parseInt(sidenavWidth)+6+\"px\"}); //account for 6px-wide handle-bar\n"
+" writeCookie('width',sidenavWidth, null);\n"
+"}\n"
+"\n"
+"function restoreWidth(navWidth)\n"
+"{\n"
+" var windowWidth = $(window).width() + \"px\";\n"
+" content.css({marginLeft:parseInt(navWidth)+6+\"px\"});\n"
+" sidenav.css({width:navWidth + \"px\"});\n"
+"}\n"
+"\n"
+"function resizeHeight() \n"
+"{\n"
+" var headerHeight = header.height();\n"
+" var footerHeight = footer.height();\n"
+" var windowHeight = $(window).height() - headerHeight - footerHeight;\n"
+" content.css({height:windowHeight + \"px\"});\n"
+" navtree.css({height:windowHeight + \"px\"});\n"
+" sidenav.css({height:windowHeight + \"px\",top: headerHeight+\"px\"});\n"
+"}\n"
+"\n"
+"function initResizable()\n"
+"{\n"
+" header = $(\"#top\");\n"
+" sidenav = $(\"#side-nav\");\n"
+" content = $(\"#doc-content\");\n"
+" navtree = $(\"#nav-tree\");\n"
+" footer = $(\"#nav-path\");\n"
+" $(\".side-nav-resizable\").resizable({resize: function(e, ui) { resizeWidth(); } });\n"
+" $(window).resize(function() { resizeHeight(); });\n"
+" var width = readCookie('width');\n"
+" if (width) { restoreWidth(width); } else { resizeWidth(); }\n"
+" resizeHeight();\n"
+" var url = location.href;\n"
+" var i=url.indexOf(\"#\");\n"
+" if (i>=0) window.location.hash=url.substr(i);\n"
+" var _preventDefault = function(evt) { evt.preventDefault(); };\n"
+" $(\"#splitbar\").bind(\"dragstart\", _preventDefault).bind(\"selectstart\", _preventDefault);\n"
+"}\n"
+"\n"
+"\n"
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
new file mode 100644
index 0000000..50e63d9
--- /dev/null
+++ b/src/rtfdocvisitor.cpp
@@ -0,0 +1,1646 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "rtfdocvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "dot.h"
+#include "msc.h"
+#include "util.h"
+#include "rtfstyle.h"
+#include "message.h"
+#include <qfileinfo.h>
+#include "parserintf.h"
+#include "msc.h"
+
+
+//#define DBG_RTF(x) m_t << x
+#define DBG_RTF(x) do {} while(0)
+
+RTFDocVisitor::RTFDocVisitor(FTextStream &t,CodeOutputInterface &ci,
+ const char *langExt)
+ : DocVisitor(DocVisitor_RTF), m_t(t), m_ci(ci), m_insidePre(FALSE),
+ m_hide(FALSE), m_indentLevel(0), m_lastIsPara(FALSE), m_langExt(langExt)
+{
+}
+
+QCString RTFDocVisitor::getStyle(const char *name)
+{
+ QCString n;
+ n.sprintf("%s%d",name,m_indentLevel);
+ StyleData *sd = rtf_Style[n];
+ ASSERT(sd!=0);
+ return sd->reference;
+}
+
+void RTFDocVisitor::incIndentLevel()
+{
+ if (m_indentLevel<rtf_maxIndentLevels-1) m_indentLevel++;
+}
+
+void RTFDocVisitor::decIndentLevel()
+{
+ if (m_indentLevel>0) m_indentLevel--;
+}
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+void RTFDocVisitor::visit(DocWord *w)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocWord)}\n");
+ filter(w->word());
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visit(DocLinkedWord *w)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocLinkedWord)}\n");
+ startLink(w->ref(),w->file(),w->anchor());
+ filter(w->word());
+ endLink(w->ref());
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visit(DocWhiteSpace *w)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocWhiteSpace)}\n");
+ if (m_insidePre)
+ {
+ m_t << w->chars();
+ }
+ else
+ {
+ m_t << " ";
+ }
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visit(DocSymbol *s)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocSymbol)}\n");
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "\\\\"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: m_t << "<"; break;
+ case DocSymbol::Greater: m_t << ">"; break;
+ case DocSymbol::Amp: m_t << "&"; break;
+ case DocSymbol::Dollar: m_t << "$"; break;
+ case DocSymbol::Hash: m_t << "#"; break;
+ case DocSymbol::DoubleColon: m_t << "::"; break;
+ case DocSymbol::Percent: m_t << "%"; break;
+ case DocSymbol::Copy: m_t << "(C)"; break;
+ case DocSymbol::Tm: m_t << "(TM)"; break;
+ case DocSymbol::Reg: m_t << "(R)"; break;
+ case DocSymbol::Apos: m_t << "'"; break;
+ case DocSymbol::Quot: m_t << "\""; break;
+ case DocSymbol::Lsquo: m_t << "`"; break;
+ case DocSymbol::Rsquo: m_t << "'"; break;
+ case DocSymbol::Ldquo: m_t << "\""; break;
+ case DocSymbol::Rdquo: m_t << "\""; break;
+ case DocSymbol::Ndash: m_t << "-"; break;
+ case DocSymbol::Mdash: m_t << "--"; break;
+ case DocSymbol::Uml: switch(s->letter())
+ {
+ case 'A' : m_t << '\304'; break;
+ case 'E' : m_t << '\313'; break;
+ case 'I' : m_t << '\317'; break;
+ case 'O' : m_t << '\326'; break;
+ case 'U' : m_t << '\334'; break;
+ case 'Y' : m_t << 'Y'; break;
+ case 'a' : m_t << '\344'; break;
+ case 'e' : m_t << '\353'; break;
+ case 'i' : m_t << '\357'; break;
+ case 'o' : m_t << '\366'; break;
+ case 'u' : m_t << '\374'; break;
+ case 'y' : m_t << '\377'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Acute: switch(s->letter())
+ {
+ case 'A' : m_t << '\301'; break;
+ case 'E' : m_t << '\311'; break;
+ case 'I' : m_t << '\315'; break;
+ case 'O' : m_t << '\323'; break;
+ case 'U' : m_t << '\332'; break;
+ case 'Y' : m_t << '\335'; break;
+ case 'a' : m_t << '\341'; break;
+ case 'e' : m_t << '\351'; break;
+ case 'i' : m_t << '\355'; break;
+ case 'o' : m_t << '\363'; break;
+ case 'u' : m_t << '\372'; break;
+ case 'y' : m_t << '\375'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Grave: switch(s->letter())
+ {
+ case 'A' : m_t << '\300'; break;
+ case 'E' : m_t << '\310'; break;
+ case 'I' : m_t << '\314'; break;
+ case 'O' : m_t << '\322'; break;
+ case 'U' : m_t << '\331'; break;
+ case 'a' : m_t << '\340'; break;
+ case 'e' : m_t << '\350'; break;
+ case 'i' : m_t << '\354'; break;
+ case 'o' : m_t << '\362'; break;
+ case 'u' : m_t << '\371'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Circ: switch(s->letter())
+ {
+ case 'A' : m_t << '\302'; break;
+ case 'E' : m_t << '\312'; break;
+ case 'I' : m_t << '\316'; break;
+ case 'O' : m_t << '\324'; break;
+ case 'U' : m_t << '\333'; break;
+ case 'a' : m_t << '\342'; break;
+ case 'e' : m_t << '\352'; break;
+ case 'i' : m_t << '\356'; break;
+ case 'o' : m_t << '\364'; break;
+ case 'u' : m_t << '\373'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Tilde: switch(s->letter())
+ {
+ case 'A' : m_t << '\303'; break;
+ case 'N' : m_t << '\321'; break;
+ case 'O' : m_t << '\325'; break;
+ case 'a' : m_t << '\343'; break;
+ case 'n' : m_t << '\361'; break;
+ case 'o' : m_t << '\365'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Cedil: switch(s->letter())
+ {
+ case 'C' : m_t << '\307'; break;
+ case 'c' : m_t << '\347'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Slash: switch(s->letter())
+ {
+ case 'O' : m_t << '\330'; break;
+ case 'o' : m_t << '\370'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Ring: switch(s->letter())
+ {
+ case 'A' : m_t << '\305'; break;
+ case 'a' : m_t << '\345'; break;
+ default: m_t << '?'; break;
+ }
+ break;
+ case DocSymbol::Szlig: m_t << "\337"; break;
+ case DocSymbol::Nbsp: m_t << "\\~ "; break;
+ case DocSymbol::Aelig: m_t << "\346"; break;
+ case DocSymbol::AElig: m_t << "\306"; break;
+ default:
+ err("error: unknown symbol found\n");
+ }
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visit(DocURL *u)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocURL)}\n");
+ if (Config_getBool("RTF_HYPERLINKS"))
+ {
+ m_t << "{\\field "
+ "{\\*\\fldinst "
+ "{ HYPERLINK \\\\l \"";
+ if (u->isEmail()) m_t << "mailto:";
+ m_t << u->url();
+ m_t << "\" }"
+ "{}";
+ m_t << "}"
+ "{\\fldrslt "
+ "{\\cs37\\ul\\cf2 ";
+ filter(u->url());
+ m_t << "}"
+ "}"
+ "}" << endl;
+ }
+ else
+ {
+ m_t << "{\\f2 ";
+ filter(u->url());
+ m_t << "}";
+ }
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visit(DocLineBreak *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocLineBreak)}\n");
+ m_t << "\\par";
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visit(DocHorRuler *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocHorRuler)}\n");
+ m_t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visit(DocStyleChange *s)
+{
+ if (m_hide) return;
+ m_lastIsPara=FALSE;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocStyleChange)}\n");
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) m_t << "{\\b "; else m_t << "} ";
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) m_t << "{\\i "; else m_t << "} ";
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) m_t << "{\\f2 "; else m_t << "} ";
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) m_t << "{\\sub "; else m_t << "} ";
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) m_t << "{\\super "; else m_t << "} ";
+ break;
+ case DocStyleChange::Center:
+ if (s->enable()) m_t << "{\\qc "; else m_t << "} ";
+ break;
+ case DocStyleChange::Small:
+ if (s->enable()) m_t << "{\\sub "; else m_t << "} ";
+ break;
+ case DocStyleChange::Preformatted:
+ if (s->enable())
+ {
+ m_t << "{" << endl;
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset << getStyle("CodeExample");
+ m_insidePre=TRUE;
+ }
+ else
+ {
+ m_insidePre=FALSE;
+ m_t << "\\par";
+ m_t << "}" << endl;
+ }
+ m_lastIsPara=TRUE;
+ break;
+ case DocStyleChange::Div: /* HTML only */ break;
+ case DocStyleChange::Span: /* HTML only */ break;
+ }
+}
+
+void RTFDocVisitor::visit(DocVerbatim *s)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocVerbatim)}\n");
+ switch(s->type())
+ {
+ case DocVerbatim::Code: // fall though
+ m_t << "{" << endl;
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset << getStyle("CodeExample");
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,s->context(),s->text(),
+ s->isExample(),s->exampleFile());
+ //m_t << "\\par" << endl;
+ m_t << "}" << endl;
+ break;
+ case DocVerbatim::Verbatim:
+ m_t << "{" << endl;
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset << getStyle("CodeExample");
+ filter(s->text(),TRUE);
+ //m_t << "\\par" << endl;
+ m_t << "}" << endl;
+ break;
+ case DocVerbatim::HtmlOnly:
+ case DocVerbatim::LatexOnly:
+ case DocVerbatim::XmlOnly:
+ case DocVerbatim::ManOnly:
+ /* nothing */
+ break;
+ case DocVerbatim::Dot:
+ {
+ static int dotindex = 1;
+ QCString fileName(4096);
+
+ fileName.sprintf("%s%d%s",
+ (Config_getString("RTF_OUTPUT")+"/inline_dotgraph_").data(),
+ dotindex++,
+ ".dot"
+ );
+ QFile file(fileName);
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",fileName.data());
+ }
+ file.writeBlock( s->text(), s->text().length() );
+ file.close();
+ m_t << "\\par{\\qc "; // center picture
+ writeDotFile(fileName);
+ m_t << "} ";
+ if (Config_getBool("DOT_CLEANUP")) file.remove();
+ }
+ break;
+ case DocVerbatim::Msc:
+ {
+ static int mscindex = 1;
+ QCString baseName(4096);
+
+ baseName.sprintf("%s%d",
+ (Config_getString("RTF_OUTPUT")+"/inline_mscgraph_").data(),
+ mscindex++
+ );
+ QFile file(baseName+".msc");
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",baseName.data());
+ }
+ QCString text = "msc {";
+ text+=s->text();
+ text+="}";
+ file.writeBlock( text, text.length() );
+ file.close();
+ m_t << "\\par{\\qc "; // center picture
+ writeMscFile(baseName);
+ m_t << "} ";
+ if (Config_getBool("DOT_CLEANUP")) file.remove();
+ }
+ break;
+ }
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visit(DocAnchor *anc)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocAnchor)}\n");
+ QCString anchor;
+ if (!anc->file().isEmpty())
+ {
+ anchor+=anc->file();
+ }
+ if (!anc->file().isEmpty() && !anc->anchor().isEmpty())
+ {
+ anchor+="_";
+ }
+ if (!anc->anchor().isEmpty())
+ {
+ anchor+=anc->anchor();
+ }
+ m_t << "{\\bkmkstart " << rtfFormatBmkStr(anchor) << "}" << endl;
+ m_t << "{\\bkmkend " << rtfFormatBmkStr(anchor) << "}" << endl;
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visit(DocInclude *inc)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocInclude)}\n");
+ switch(inc->type())
+ {
+ case DocInclude::IncWithLines:
+ {
+ m_t << "{" << endl;
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset << getStyle("CodeExample");
+ QFileInfo cfi( inc->file() );
+ FileDef fd( cfi.dirPath(), cfi.fileName() );
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),
+ inc->isExample(),
+ inc->exampleFile(), &fd);
+ m_t << "\\par";
+ m_t << "}" << endl;
+ }
+ break;
+ case DocInclude::Include:
+ m_t << "{" << endl;
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset << getStyle("CodeExample");
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),inc->isExample(),
+ inc->exampleFile());
+ m_t << "\\par";
+ m_t << "}" << endl;
+ break;
+ case DocInclude::DontInclude:
+ break;
+ case DocInclude::HtmlInclude:
+ break;
+ case DocInclude::VerbInclude:
+ m_t << "{" << endl;
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset << getStyle("CodeExample");
+ filter(inc->text());
+ m_t << "\\par";
+ m_t << "}" << endl;
+ break;
+ }
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visit(DocIncOperator *op)
+{
+ //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
+ // op->type(),op->isFirst(),op->isLast(),op->text().data());
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocIncOperator)}\n");
+ if (op->isFirst())
+ {
+ if (!m_hide)
+ {
+ m_t << "{" << endl;
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset << getStyle("CodeExample");
+ }
+ pushEnabled();
+ m_hide = TRUE;
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ popEnabled();
+ if (!m_hide)
+ {
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,op->context(),op->text(),
+ op->isExample(),op->exampleFile());
+ }
+ pushEnabled();
+ m_hide=TRUE;
+ }
+ if (op->isLast())
+ {
+ popEnabled();
+ if (!m_hide)
+ {
+ m_t << "\\par";
+ m_t << "}" << endl;
+ }
+ m_lastIsPara=TRUE;
+ }
+ else
+ {
+ if (!m_hide) m_t << endl;
+ m_lastIsPara=FALSE;
+ }
+}
+
+void RTFDocVisitor::visit(DocFormula *f)
+{
+ if (m_hide) return;
+ // TODO: do something sensible here, like including a bitmap
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocFormula)}\n");
+ m_t << f->text();
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visit(DocIndexEntry *i)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visit(DocIndexEntry)}\n");
+ m_t << "{\\xe \\v " << i->entry() << "}" << endl;
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visit(DocSimpleSectSep *)
+{
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void RTFDocVisitor::visitPre(DocAutoList *l)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocAutoList)}\n");
+ m_t << "{" << endl;
+ rtf_listItemInfo[m_indentLevel].isEnum = l->isEnumList();
+ rtf_listItemInfo[m_indentLevel].number = 1;
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocAutoList *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocAutoList)}\n");
+ m_t << "\\par";
+ m_t << "}" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocAutoListItem *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocAutoListItem)}\n");
+ if (!m_lastIsPara) m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset;
+ if (rtf_listItemInfo[m_indentLevel].isEnum)
+ {
+ m_t << getStyle("ListEnum") << endl;
+ m_t << rtf_listItemInfo[m_indentLevel].number << ".\\tab ";
+ rtf_listItemInfo[m_indentLevel].number++;
+ }
+ else
+ {
+ m_t << getStyle("ListBullet") << endl;
+ }
+ incIndentLevel();
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocAutoListItem *)
+{
+ decIndentLevel();
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocAutoListItem)}\n");
+}
+
+void RTFDocVisitor::visitPre(DocPara *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocPara)}\n");
+}
+
+void RTFDocVisitor::visitPost(DocPara *p)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocPara)}\n");
+ if (!m_lastIsPara &&
+ !p->isLast() && // omit <p> for last paragraph
+ !(p->parent() && // and for parameters & sections
+ p->parent()->kind()==DocNode::Kind_ParamSect
+ )
+ )
+ {
+ m_t << "\\par" << endl;
+ m_lastIsPara=TRUE;
+ }
+}
+
+void RTFDocVisitor::visitPre(DocRoot *r)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocRoot)}\n");
+ if (r->indent()) incIndentLevel();
+ m_t << "{" << rtf_Style["BodyText"]->reference << endl;
+}
+
+void RTFDocVisitor::visitPost(DocRoot *r)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocRoot)}\n");
+ if (!m_lastIsPara && !r->singleLine()) m_t << "\\par" << endl;
+ m_t << "}";
+ m_lastIsPara=TRUE;
+ if (r->indent()) decIndentLevel();
+}
+
+void RTFDocVisitor::visitPre(DocSimpleSect *s)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSimpleSect)}\n");
+ if (!m_lastIsPara) m_t << "\\par" << endl;
+ m_t << "{"; // start desc
+ //m_t << "{\\b "; // start bold
+ m_t << "{" << rtf_Style["Heading5"]->reference << endl;
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ m_t << theTranslator->trSeeAlso(); break;
+ case DocSimpleSect::Return:
+ m_t << theTranslator->trReturns(); break;
+ case DocSimpleSect::Author:
+ m_t << theTranslator->trAuthor(TRUE,TRUE); break;
+ case DocSimpleSect::Authors:
+ m_t << theTranslator->trAuthor(TRUE,FALSE); break;
+ case DocSimpleSect::Version:
+ m_t << theTranslator->trVersion(); break;
+ case DocSimpleSect::Since:
+ m_t << theTranslator->trSince(); break;
+ case DocSimpleSect::Date:
+ m_t << theTranslator->trDate(); break;
+ case DocSimpleSect::Note:
+ m_t << theTranslator->trNote(); break;
+ case DocSimpleSect::Warning:
+ m_t << theTranslator->trWarning(); break;
+ case DocSimpleSect::Pre:
+ m_t << theTranslator->trPrecondition(); break;
+ case DocSimpleSect::Post:
+ m_t << theTranslator->trPostcondition(); break;
+ case DocSimpleSect::Invar:
+ m_t << theTranslator->trInvariant(); break;
+ case DocSimpleSect::Remark:
+ m_t << theTranslator->trRemarks(); break;
+ case DocSimpleSect::Attention:
+ m_t << theTranslator->trAttention(); break;
+ case DocSimpleSect::User: break;
+ case DocSimpleSect::Rcs: break;
+ case DocSimpleSect::Unknown: break;
+ }
+
+ // special case 1: user defined title
+ if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
+ {
+ m_t << ":";
+ m_t << "\\par";
+ m_t << "}"; // end bold
+ incIndentLevel();
+ m_t << rtf_Style_Reset << getStyle("DescContinue");
+ }
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocSimpleSect *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleSect)}\n");
+ if (!m_lastIsPara) m_t << "\\par" << endl;
+ decIndentLevel();
+ m_t << "}"; // end desc
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocTitle *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocTitle)}\n");
+}
+
+void RTFDocVisitor::visitPost(DocTitle *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocTitle)}\n");
+ m_t << "\\par" << endl;
+ m_t << "}"; // end bold
+ incIndentLevel();
+ m_t << rtf_Style_Reset << getStyle("DescContinue");
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPre(DocSimpleList *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSimpleSect)}\n");
+ m_t << "{" << endl;
+ rtf_listItemInfo[m_indentLevel].isEnum = FALSE;
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocSimpleList *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleSect)}\n");
+ if (!m_lastIsPara) m_t << "\\par" << endl;
+ m_t << "}" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocSimpleListItem *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSimpleListItem)}\n");
+ m_t << "\\par" << rtf_Style_Reset << getStyle("ListBullet") << endl;
+ m_lastIsPara=FALSE;
+ incIndentLevel();
+}
+
+void RTFDocVisitor::visitPost(DocSimpleListItem *)
+{
+ decIndentLevel();
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleListItem)}\n");
+}
+
+void RTFDocVisitor::visitPre(DocSection *s)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSection)}\n");
+ if (!m_lastIsPara) m_t << "\\par" << endl;
+ m_t << "{\\bkmkstart " << rtfFormatBmkStr(s->file()+"_"+s->anchor()) << "}" << endl;
+ m_t << "{\\bkmkend " << rtfFormatBmkStr(s->file()+"_"+s->anchor()) << "}" << endl;
+ m_t << "{{" // start section
+ << rtf_Style_Reset;
+ QCString heading;
+ int level = QMIN(s->level()+1,4);
+ heading.sprintf("Heading%d",level);
+ // set style
+ m_t << rtf_Style[heading]->reference << endl;
+ // make table of contents entry
+ filter(s->title());
+ m_t << endl << "\\par" << "}" << endl;
+ m_t << "{\\tc\\tcl" << level << " \\v ";
+ filter(s->title());
+ m_t << "}" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocSection *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSection)}\n");
+ m_t << "\\par}" << endl; // end section
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlList *l)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlList)}\n");
+ m_t << "{" << endl;
+ rtf_listItemInfo[m_indentLevel].isEnum = l->type()==DocHtmlList::Ordered;
+ rtf_listItemInfo[m_indentLevel].number = 1;
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlList *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlList)}\n");
+ m_t << "\\par" << "}" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlListItem *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlListItem)}\n");
+ m_t << "\\par" << endl;
+ m_t << rtf_Style_Reset;
+ if (rtf_listItemInfo[m_indentLevel].isEnum)
+ {
+ m_t << getStyle("ListEnum") << endl;
+ m_t << rtf_listItemInfo[m_indentLevel].number << ".\\tab ";
+ rtf_listItemInfo[m_indentLevel].number++;
+ }
+ else
+ {
+ m_t << getStyle("ListBullet") << endl;
+ }
+ incIndentLevel();
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlListItem *)
+{
+ decIndentLevel();
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlListItem)}\n");
+}
+
+void RTFDocVisitor::visitPre(DocHtmlDescList *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescList)}\n");
+ //m_t << "{" << endl;
+ //m_t << rtf_Style_Reset << getStyle("ListContinue");
+ //m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlDescList *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescList)}\n");
+ //m_t << "}" << endl;
+ //m_t << "\\par" << endl;
+ //m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescTitle)}\n");
+ //m_t << "\\par" << endl;
+ //m_t << "{\\b ";
+ m_t << "{" << rtf_Style["Heading5"]->reference << endl;
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescTitle)}\n");
+ m_t << "\\par" << endl;
+ m_t << "}" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlDescData *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescData)}\n");
+ incIndentLevel();
+ m_t << "{" << rtf_Style_Reset << getStyle("DescContinue");
+}
+
+void RTFDocVisitor::visitPost(DocHtmlDescData *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescData)}\n");
+ m_t << "\\par";
+ m_t << "}" << endl;
+ decIndentLevel();
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlTable *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlTable)}\n");
+ if (!m_lastIsPara) m_t << "\\par" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlTable *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlTable)}\n");
+ m_t << "\\pard" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlCaption *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlCaption)}\n");
+}
+
+void RTFDocVisitor::visitPost(DocHtmlCaption *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlCaption)}\n");
+}
+
+void RTFDocVisitor::visitPre(DocHtmlRow *r)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlRow)}\n");
+ uint i,columnWidth=r->numCells()>0 ? rtf_pageWidth/r->numCells() : 10;
+ m_t << "\\trowd \\trgaph108\\trleft-108"
+ "\\trbrdrt\\brdrs\\brdrw10 "
+ "\\trbrdrl\\brdrs\\brdrw10 "
+ "\\trbrdrb\\brdrs\\brdrw10 "
+ "\\trbrdrr\\brdrs\\brdrw10 "
+ "\\trbrdrh\\brdrs\\brdrw10 "
+ "\\trbrdrv\\brdrs\\brdrw10 "<< endl;
+ for (i=0;i<r->numCells();i++)
+ {
+ m_t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 "
+ "\\clbrdrl\\brdrs\\brdrw10 "
+ "\\clbrdrb\\brdrs\\brdrw10 "
+ "\\clbrdrr \\brdrs\\brdrw10 "
+ "\\cltxlrtb "
+ "\\cellx" << ((i+1)*columnWidth) << endl;
+ }
+ m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlRow *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlRow)}\n");
+ m_t << endl;
+ m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
+ m_t << "{\\row }" << endl;
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlCell *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlCell)}\n");
+ m_t << "{";
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocHtmlCell *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlCell)}\n");
+ m_t << "\\cell }";
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPre(DocInternal *)
+{
+ if (m_hide) return;
+ //DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocInternal)}\n");
+ //m_t << "{"; // start desc
+ //m_t << "{\\b "; // start bold
+ //m_t << theTranslator->trForInternalUseOnly();
+ //m_t << "}"; // end bold
+ //m_t << "\\par" << endl;
+ //incIndentLevel();
+ //m_t << rtf_Style_Reset << getStyle("DescContinue");
+ //m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocInternal *)
+{
+ if (m_hide) return;
+ //DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocInternal)}\n");
+ //m_t << "\\par";
+ //decIndentLevel();
+ //m_t << "}"; // end desc
+ //m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocHRef *href)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHRef)}\n");
+ if (Config_getBool("RTF_HYPERLINKS"))
+ {
+ m_t << "{\\field "
+ "{\\*\\fldinst "
+ "{ HYPERLINK \\\\l \"" << href->url() << "\" "
+ "}{}"
+ "}"
+ "{\\fldrslt "
+ "{\\cs37\\ul\\cf2 ";
+
+ }
+ else
+ {
+ m_t << "{\\f2 ";
+ }
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocHRef *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHRef)}\n");
+ if (Config_getBool("RTF_HYPERLINKS"))
+ {
+ m_t << "}"
+ "}"
+ "}";
+ }
+ else
+ {
+ m_t << "}";
+ }
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPre(DocHtmlHeader *header)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlHeader)}\n");
+ m_t << "{" // start section
+ << rtf_Style_Reset;
+ QCString heading;
+ int level = QMIN(header->level()+2,4);
+ heading.sprintf("Heading%d",level);
+ // set style
+ m_t << rtf_Style[heading]->reference;
+ // make table of contents entry
+ m_t << "{\\tc\\tcl \\v " << level << "}";
+ m_lastIsPara=FALSE;
+
+}
+
+void RTFDocVisitor::visitPost(DocHtmlHeader *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlHeader)}\n");
+ m_t << "\\par";
+ m_t << "}" << endl; // end section
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocImage *img)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocImage)}\n");
+ if (img->type()==DocImage::Rtf)
+ {
+ m_t << "\\par" << endl;
+ m_t << "{" << endl;
+ m_t << rtf_Style_Reset << endl;
+ m_t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
+ m_t << img->name();
+ m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+ m_t << "}" << endl;
+ m_lastIsPara=TRUE;
+ }
+ else // other format -> skip
+ {
+ }
+ // hide caption since it is not supported at the moment
+ pushEnabled();
+ m_hide=TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocImage *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocImage)}\n");
+ popEnabled();
+}
+
+void RTFDocVisitor::visitPre(DocDotFile *df)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocDotFile)}\n");
+ writeDotFile(df->file());
+
+ // hide caption since it is not supported at the moment
+ pushEnabled();
+ m_hide=TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocDotFile *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocDotFile)}\n");
+ popEnabled();
+}
+void RTFDocVisitor::visitPre(DocMscFile *df)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocMscFile)}\n");
+ writeMscFile(df->file());
+
+ // hide caption since it is not supported at the moment
+ pushEnabled();
+ m_hide=TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocMscFile *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocMscFile)}\n");
+ popEnabled();
+}
+
+void RTFDocVisitor::visitPre(DocLink *lnk)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocLink)}\n");
+ startLink(lnk->ref(),lnk->file(),lnk->anchor());
+}
+
+void RTFDocVisitor::visitPost(DocLink *lnk)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocLink)}\n");
+ endLink(lnk->ref());
+}
+
+void RTFDocVisitor::visitPre(DocRef *ref)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocRef)}\n");
+ if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
+ if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void RTFDocVisitor::visitPost(DocRef *ref)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocRef)}\n");
+ if (!ref->file().isEmpty()) endLink(ref->ref());
+ //m_t << " ";
+}
+
+
+void RTFDocVisitor::visitPre(DocSecRefItem *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSecRefItem)}\n");
+}
+
+void RTFDocVisitor::visitPost(DocSecRefItem *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSecRefItem)}\n");
+}
+
+void RTFDocVisitor::visitPre(DocSecRefList *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSecRefList)}\n");
+ m_t << "{" << endl;
+ incIndentLevel();
+ m_t << rtf_Style_Reset << getStyle("LatexTOC") << endl;
+ m_t << "\\par" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocSecRefList *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSecRefList)}\n");
+ decIndentLevel();
+ m_t << "\\par";
+ m_t << "}" << endl;
+ m_lastIsPara=TRUE;
+}
+
+//void RTFDocVisitor::visitPre(DocLanguage *l)
+//{
+// DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocLanguage)}\n");
+// QCString langId = Config_getEnum("OUTPUT_LANGUAGE");
+// if (l->id().lower()!=langId.lower())
+// {
+// pushEnabled();
+// m_hide = TRUE;
+// }
+//}
+//
+//void RTFDocVisitor::visitPost(DocLanguage *l)
+//{
+// DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocLanguage)}\n");
+// QCString langId = Config_getEnum("OUTPUT_LANGUAGE");
+// if (l->id().lower()!=langId.lower())
+// {
+// popEnabled();
+// }
+//}
+
+void RTFDocVisitor::visitPre(DocParamSect *s)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocParamSect)}\n");
+ m_t << "{"; // start param list
+ if (!m_lastIsPara) m_t << "\\par" << endl;
+ //m_t << "{\\b "; // start bold
+ m_t << "{" << rtf_Style["Heading5"]->reference << endl;
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ m_t << theTranslator->trParameters(); break;
+ case DocParamSect::RetVal:
+ m_t << theTranslator->trReturnValues(); break;
+ case DocParamSect::Exception:
+ m_t << theTranslator->trExceptions(); break;
+ case DocParamSect::TemplateParam:
+ /* TODO: add this
+ m_t << theTranslator->trTemplateParam(); break;
+ */
+ m_t << "Template Parameters"; break;
+ default:
+ ASSERT(0);
+ }
+ m_t << ":";
+ m_t << "\\par";
+ m_t << "}" << endl;
+ bool useTable = s->type()==DocParamSect::Param ||
+ s->type()==DocParamSect::RetVal ||
+ s->type()==DocParamSect::Exception ||
+ s->type()==DocParamSect::TemplateParam;
+ if (!useTable)
+ {
+ incIndentLevel();
+ }
+ m_t << rtf_Style_Reset << getStyle("DescContinue");
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocParamSect *s)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocParamSect)}\n");
+ //m_t << "\\par" << endl;
+ bool useTable = s->type()==DocParamSect::Param ||
+ s->type()==DocParamSect::RetVal ||
+ s->type()==DocParamSect::Exception ||
+ s->type()==DocParamSect::TemplateParam;
+ if (!useTable)
+ {
+ decIndentLevel();
+ }
+ m_t << "}" << endl;
+}
+
+void RTFDocVisitor::visitPre(DocParamList *pl)
+{
+ static int columnPos[4][5] =
+ { { 2, 25, 100, 100, 100 }, // no inout, no type
+ { 3, 14, 35, 100, 100 }, // inout, no type
+ { 3, 25, 50, 100, 100 }, // no inout, type
+ { 4, 14, 35, 55, 100 }, // no inout, type
+ };
+ int config=0;
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocParamList)}\n");
+
+ DocParamSect::Type parentType = DocParamSect::Unknown;
+ DocParamSect *sect = 0;
+ if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect)
+ {
+ parentType = ((DocParamSect*)pl->parent())->type();
+ sect=(DocParamSect*)pl->parent();
+ }
+ bool useTable = parentType==DocParamSect::Param ||
+ parentType==DocParamSect::RetVal ||
+ parentType==DocParamSect::Exception ||
+ parentType==DocParamSect::TemplateParam;
+ if (sect && sect->hasInOutSpecifier()) config+=1;
+ if (sect && sect->hasTypeSpecifier()) config+=2;
+ if (useTable)
+ {
+ int i;
+ m_t << "\\trowd \\trgaph108\\trleft426\\tblind426"
+ "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
+ "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
+ "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
+ "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
+ "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
+ "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 "<< endl;
+ for (i=0;i<columnPos[config][0];i++)
+ {
+ m_t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
+ "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
+ "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
+ "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
+ "\\cltxlrtb "
+ "\\cellx" << (rtf_pageWidth*columnPos[config][i+1]/100) << endl;
+ }
+ m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
+ }
+
+ if (sect && sect->hasInOutSpecifier())
+ {
+ if (useTable)
+ {
+ m_t << "{";
+ }
+
+ // Put in the direction: in/out/in,out if specified.
+ if (pl->direction()!=DocParamSect::Unspecified)
+ {
+ if (pl->direction()==DocParamSect::In)
+ {
+ m_t << "in";
+ }
+ else if (pl->direction()==DocParamSect::Out)
+ {
+ m_t << "out";
+ }
+ else if (pl->direction()==DocParamSect::InOut)
+ {
+ m_t << "in,out";
+ }
+ }
+
+ if (useTable)
+ {
+ m_t << "\\cell }";
+ }
+ }
+
+ if (sect && sect->hasTypeSpecifier())
+ {
+ if (useTable)
+ {
+ m_t << "{";
+ }
+ QListIterator<DocNode> li(pl->paramTypes());
+ DocNode *type;
+ bool first=TRUE;
+ for (li.toFirst();(type=li.current());++li)
+ {
+ if (!first) m_t << " | "; else first=FALSE;
+ if (type->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)type);
+ }
+ else if (type->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)type);
+ }
+ }
+ if (useTable)
+ {
+ m_t << "\\cell }";
+ }
+ }
+
+
+ if (useTable)
+ {
+ m_t << "{";
+ }
+
+ m_t << "{\\i ";
+ //QStrListIterator li(pl->parameters());
+ //const char *s;
+ QListIterator<DocNode> li(pl->parameters());
+ DocNode *param;
+ bool first=TRUE;
+ for (li.toFirst();(param=li.current());++li)
+ {
+ if (!first) m_t << ","; else first=FALSE;
+ if (param->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)param);
+ }
+ else if (param->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)param);
+ }
+ }
+ m_t << "} ";
+
+ if (useTable)
+ {
+ m_t << "\\cell }{";
+ }
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPost(DocParamList *pl)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocParamList)}\n");
+
+ DocParamSect::Type parentType = DocParamSect::Unknown;
+ DocParamSect *sect = 0;
+ if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect)
+ {
+ parentType = ((DocParamSect*)pl->parent())->type();
+ sect=(DocParamSect*)pl->parent();
+ }
+ bool useTable = parentType==DocParamSect::Param ||
+ parentType==DocParamSect::RetVal ||
+ parentType==DocParamSect::Exception ||
+ parentType==DocParamSect::TemplateParam;
+ if (useTable)
+ {
+ m_t << "\\cell }" << endl;
+ //m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
+ m_t << "{\\row }" << endl;
+ }
+ else
+ {
+ m_t << "\\par" << endl;
+ }
+
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocXRefItem *x)
+{
+ if (m_hide) return;
+ bool anonymousEnum = x->file()=="@";
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocXRefItem)}\n");
+ m_t << "{"; // start param list
+ //m_t << "{\\b "; // start bold
+ m_t << "{" << rtf_Style["Heading5"]->reference << endl;
+ if (Config_getBool("RTF_HYPERLINKS") && !anonymousEnum)
+ {
+ QCString refName;
+ if (!x->file().isEmpty())
+ {
+ refName+=x->file();
+ }
+ if (!x->file().isEmpty() && !x->anchor().isEmpty())
+ {
+ refName+="_";
+ }
+ if (!x->anchor().isEmpty())
+ {
+ refName+=x->anchor();
+ }
+
+ m_t << "{\\field "
+ "{\\*\\fldinst "
+ "{ HYPERLINK \\\\l \"" << refName << "\" "
+ "}{}"
+ "}"
+ "{\\fldrslt "
+ "{\\cs37\\ul\\cf2 ";
+ filter(x->title());
+ m_t << "}"
+ "}"
+ "}";
+ }
+ else
+ {
+ filter(x->title());
+ }
+ m_t << ":";
+ m_t << "\\par";
+ m_t << "}"; // end bold
+ incIndentLevel();
+ m_t << rtf_Style_Reset << getStyle("DescContinue");
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::visitPost(DocXRefItem *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocXRefItem)}\n");
+ m_t << "\\par" << endl;
+ decIndentLevel();
+ m_t << "}" << endl; // end xref item
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::visitPre(DocInternalRef *ref)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocInternalRef)}\n");
+ startLink("",ref->file(),ref->anchor());
+}
+
+void RTFDocVisitor::visitPost(DocInternalRef *)
+{
+ if (m_hide) return;
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocInternalRef)}\n");
+ endLink("");
+ m_t << " ";
+}
+
+void RTFDocVisitor::visitPre(DocCopy *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocCopy)}\n");
+}
+
+void RTFDocVisitor::visitPost(DocCopy *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocCopy)}\n");
+}
+
+void RTFDocVisitor::visitPre(DocText *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocText)}\n");
+}
+
+void RTFDocVisitor::visitPost(DocText *)
+{
+ DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocText)}\n");
+}
+
+//static char* getMultiByte(int c)
+//{
+// static char s[10];
+// sprintf(s,"\\'%X",c);
+// return s;
+//}
+
+void RTFDocVisitor::filter(const char *str,bool verbatim)
+{
+ if (str)
+ {
+ const unsigned char *p=(const unsigned char *)str;
+ unsigned char c;
+ unsigned char pc='\0';
+ while (*p)
+ {
+ //static bool MultiByte = FALSE;
+ c=*p++;
+
+ //if ( MultiByte )
+ //{
+ // m_t << getMultiByte( c );
+ // MultiByte = FALSE;
+ // continue;
+ //}
+ //if ( c >= 0x80 )
+ //{
+ // MultiByte = TRUE;
+ // m_t << getMultiByte( c );
+ // continue;
+ //}
+
+ switch (c)
+ {
+ case '{': m_t << "\\{"; break;
+ case '}': m_t << "\\}"; break;
+ case '\\': m_t << "\\\\"; break;
+ case '\n': if (verbatim)
+ {
+ m_t << "\\par" << endl;
+ }
+ else
+ {
+ m_t << '\n';
+ }
+ break;
+ default: m_t << (char)c;
+ }
+ pc = c;
+ }
+ }
+}
+
+void RTFDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor)
+{
+ if (ref.isEmpty() && Config_getBool("RTF_HYPERLINKS"))
+ {
+ QCString refName;
+ if (!file.isEmpty())
+ {
+ refName+=file;
+ }
+ if (anchor)
+ {
+ refName+='_';
+ refName+=anchor;
+ }
+
+ m_t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
+ m_t << rtfFormatBmkStr(refName);
+ m_t << "\" }{}";
+ m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
+ }
+ else
+ {
+ m_t << "{\\b ";
+ }
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::endLink(const QCString &ref)
+{
+ if (ref.isEmpty() && Config_getBool("RTF_HYPERLINKS"))
+ {
+ m_t << "}}}";
+ }
+ else
+ {
+ m_t << "}";
+ }
+ m_lastIsPara=FALSE;
+}
+
+void RTFDocVisitor::pushEnabled()
+{
+ m_enabled.push(new bool(m_hide));
+}
+
+void RTFDocVisitor::popEnabled()
+{
+ bool *v=m_enabled.pop();
+ ASSERT(v!=0);
+ m_hide = *v;
+ delete v;
+}
+
+void RTFDocVisitor::writeDotFile(const QCString &fileName)
+{
+ QCString baseName=fileName;
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ QCString outDir = Config_getString("RTF_OUTPUT");
+ writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
+ if (!m_lastIsPara) m_t << "\\par" << endl;
+ m_t << "{" << endl;
+ m_t << rtf_Style_Reset;
+ m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
+ m_t << baseName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
+ m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+ m_t << "}" << endl;
+ m_lastIsPara=TRUE;
+}
+
+void RTFDocVisitor::writeMscFile(const QCString &fileName)
+{
+ QCString baseName=fileName;
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ QCString outDir = Config_getString("RTF_OUTPUT");
+ writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
+ if (!m_lastIsPara) m_t << "\\par" << endl;
+ m_t << "{" << endl;
+ m_t << rtf_Style_Reset;
+ m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
+ m_t << baseName << ".png";
+ m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+ m_t << "}" << endl;
+ m_lastIsPara=TRUE;
+}
+
diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h
new file mode 100644
index 0000000..fffc522
--- /dev/null
+++ b/src/rtfdocvisitor.h
@@ -0,0 +1,165 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _RTFDOCVISITOR_H
+#define _RTFDOCVISITOR_H
+
+#include "docvisitor.h"
+#include <qstack.h>
+#include <qcstring.h>
+
+class FTextStream;
+class CodeOutputInterface;
+
+/*! @brief Concrete visitor implementation for RTF output. */
+class RTFDocVisitor : public DocVisitor
+{
+ public:
+ RTFDocVisitor(FTextStream &t,CodeOutputInterface &ci,const char *langExt);
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
+ void visit(DocIndexEntry *);
+ void visit(DocSimpleSectSep *);
+
+ //--------------------------------------
+ // visitor functions for compound nodes
+ //--------------------------------------
+
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *);
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *s);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *s);
+ void visitPost(DocHtmlList *s);
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ //void visitPre(DocHtmlPre *);
+ //void visitPost(DocHtmlPre *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *t);
+ void visitPost(DocHtmlTable *t);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *) ;
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+ void visitPre(DocMscFile *);
+ void visitPost(DocMscFile *);
+ void visitPre(DocLink *);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *ref);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ //void visitPre(DocLanguage *);
+ //void visitPost(DocLanguage *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
+ void visitPre(DocText *);
+ void visitPost(DocText *);
+
+ private:
+
+ //--------------------------------------
+ // helper functions
+ //--------------------------------------
+
+ void filter(const char *str,bool verbatim=FALSE);
+ void startLink(const QCString &ref,const QCString &file,
+ const QCString &anchor);
+ void endLink(const QCString &ref);
+ QCString getStyle(const char *name);
+ void incIndentLevel();
+ void decIndentLevel();
+
+ void pushEnabled();
+ void popEnabled();
+ void writeDotFile(const QCString &fileName);
+ void writeMscFile(const QCString &fileName);
+
+ //--------------------------------------
+ // state variables
+ //--------------------------------------
+
+ FTextStream &m_t;
+ CodeOutputInterface &m_ci;
+ bool m_insidePre;
+ bool m_hide;
+ int m_indentLevel;
+ QStack<bool> m_enabled;
+ bool m_lastIsPara;
+ QCString m_langExt;
+};
+
+#endif
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
new file mode 100644
index 0000000..af2643d
--- /dev/null
+++ b/src/rtfgen.cpp
@@ -0,0 +1,2822 @@
+/******************************************************************************
+ *
+ * $Id: rtfgen.cpp,v 1.14 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Parker Waechter & Dimitri van Heesch.
+ *
+ * Style sheet additions by Alexander Bartolich
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "qtbc.h"
+#include <qdir.h>
+#include <qregexp.h>
+
+#include "rtfgen.h"
+#include "config.h"
+#include "message.h"
+#include "doxygen.h"
+#include "util.h"
+#include "diagram.h"
+#include "language.h"
+#include "dot.h"
+#include "version.h"
+#include "pagedef.h"
+#include "rtfstyle.h"
+#include "rtfdocvisitor.h"
+#include "docparser.h"
+#include "dirdef.h"
+#include "vhdldocgen.h"
+#include "portable.h"
+
+//#define DBG_RTF(x) x;
+#define DBG_RTF(x)
+
+static QCString dateToRTFDateString()
+{
+ const QDateTime &d = QDateTime::currentDateTime();
+ QCString result;
+ result.sprintf("\\yr%d\\mo%d\\dy%d\\hr%d\\min%d\\sec%d",
+ d.date().year(), d.date().month(), d.date().day(),
+ d.time().hour(),d.time().minute(),d.time().second());
+ return result;
+}
+
+RTFGenerator::RTFGenerator() : OutputGenerator()
+{
+ dir=Config_getString("RTF_OUTPUT");
+ col=0;
+ //insideTabbing=FALSE;
+ m_listLevel = 0;
+ m_bstartedBody = FALSE;
+ m_omitParagraph = FALSE;
+ m_numCols = 0;
+}
+
+RTFGenerator::~RTFGenerator()
+{
+}
+
+//void RTFGenerator::append(const OutputGenerator *g)
+//{
+// t << g->getContents();
+// col+=((RTFGenerator *)g)->col;
+// //insideTabbing=insideTabbing || ((RTFGenerator *)g)->insideTabbing;
+// m_listLevel=((RTFGenerator *)g)->m_listLevel;
+// m_omitParagraph=((RTFGenerator *)g)->m_omitParagraph;
+// //printf("RTFGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(),
+// // insideTabbing ? "TRUE" : "FALSE" );
+//}
+
+//OutputGenerator *RTFGenerator::copy()
+//{
+// RTFGenerator *result = new RTFGenerator;
+// //result->insideTabbing=insideTabbing;
+// result->m_listLevel=m_listLevel;
+// result->m_omitParagraph=m_omitParagraph;
+// return result;
+//}
+
+void RTFGenerator::writeStyleSheetFile(QFile &file)
+{
+ QTextStream t(&file);
+ t << "# Generated by doxygen " << versionString << "\n\n";
+ t << "# This file describes styles used for generating RTF output.\n";
+ t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
+ t << "# Remove a hash to activate a line.\n\n";
+
+ int i;
+ for ( i=0 ; rtf_Style_Default[i].reference!=0 ; i++ )
+ {
+ t << "# " << rtf_Style_Default[i].name << " = "
+ << rtf_Style_Default[i].reference
+ << rtf_Style_Default[i].definition << endl;
+ }
+}
+
+void RTFGenerator::writeExtensionsFile(QFile &file)
+{
+ QTextStream t(&file);
+ t << "# Generated by doxygen " << versionString << "\n\n";
+ t << "# This file describes extensions used for generating RTF output.\n";
+ t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
+ t << "# Remove a hash to activate a line.\n\n";
+
+ t << "# Overrides the project title.\n";
+
+ t << "#Title = \n\n";
+
+ t << "# Name of the company that produced this document.\n";
+ t << "#Company = \n\n";
+
+ t << "# Filename of a company or project logo.\n";
+ t << "#LogoFilename = \n\n";
+
+ t << "# Author of the document.\n";
+ t << "#Author = \n\n";
+
+ t << "# Type of document (e.g. Design Specification, User Manual, etc.).\n";
+ t << "#DocumentType = \n\n";
+
+ t << "# Document tracking number.\n";
+ t << "#DocumentId = \n\n";
+
+ t << "# Name of the author's manager.\n";
+ t << "# This field is not displayed in the document itself, but it is \n";
+ t << "# available in the information block of the rtf file. In Microsoft \n";
+ t << "# Word, it is available under File:Properties.\n";
+ t << "#Manager = \n\n";
+
+ t << "# Subject of the document.\n";
+ t << "# This field is not displayed in the document itself, but it is \n";
+ t << "# available in the information block of the rtf file. In Microsoft \n";
+ t << "# Word, it is available under File:Properties.\n";
+ t << "#Subject = \n\n";
+
+ t << "# Comments regarding the document.\n";
+ t << "# This field is not displayed in the document itself, but it is \n";
+ t << "# available in the information block of the rtf file. In Microsoft \n";
+ t << "# Word, it is available under File:Properties.\n";
+ t << "#Comments = \n\n";
+
+ t << "# Keywords associated with the document.\n";
+ t << "# This field is not displayed in the document itself, but it is \n";
+ t << "# available in the information block of the rtf file. In Microsoft \n";
+ t << "# Word, it is available under File:Properties.\n";
+ t << "#Keywords = \n\n";
+}
+
+
+void RTFGenerator::init()
+{
+ QCString dir=Config_getString("RTF_OUTPUT");
+ QDir d(dir);
+ if (!d.exists() && !d.mkdir(dir))
+ {
+ err("Could not create output directory %s\n",dir.data());
+ exit(1);
+ }
+ rtf_Style.setAutoDelete(TRUE);
+
+ // first duplicate strings of rtf_Style_Default
+ const struct Rtf_Style_Default* def = rtf_Style_Default;
+ while(def->reference != 0)
+ {
+ if (def->definition == 0)
+ err("Internal error: rtf_Style_Default[%s] has no definition.\n", def->name);
+ StyleData* styleData = new StyleData(def->reference, def->definition);
+ rtf_Style.insert(def->name, styleData);
+ def++;
+ }
+
+ // overwrite some (or all) definitions from file
+ QCString &rtfStyleSheetFile = Config_getString("RTF_STYLESHEET_FILE");
+ if (!rtfStyleSheetFile.isEmpty())
+ {
+ loadStylesheet(rtfStyleSheetFile, rtf_Style);
+ }
+
+ // If user has defined an extension file, load its contents.
+ QCString &rtfExtensionsFile = Config_getString("RTF_EXTENSIONS_FILE");
+ if (!rtfExtensionsFile.isEmpty())
+ {
+ loadExtensions(rtfExtensionsFile);
+ }
+
+ createSubDirs(d);
+}
+
+static QCString makeIndexName(const char *s,int i)
+{
+ QCString result=s;
+ result+=(char)(i+'0');
+ return result;
+}
+
+void RTFGenerator::beginRTFDocument()
+{
+ /* all the included RTF files should begin with the
+ * same header
+ */
+ t <<"{\\rtf1\\ansi\\ansicpg" << theTranslator->trRTFansicp();
+ t <<"\\uc1 \\deff0\\deflang1033\\deflangfe1033\n";
+
+ DBG_RTF(t <<"{\\comment Begining font list}\n")
+ t <<"{\\fonttbl ";
+ t <<"{\\f0\\froman\\fcharset" << theTranslator->trRTFCharSet();
+ t <<"\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}\n";
+ t <<"{\\f1\\fswiss\\fcharset" << theTranslator->trRTFCharSet();
+ t <<"\\fprq2{\\*\\panose 020b0604020202020204}Arial;}\n";
+ t <<"{\\f2\\fmodern\\fcharset" << theTranslator->trRTFCharSet();
+ t <<"\\fprq1{\\*\\panose 02070309020205020404}Courier New;}\n";
+ t <<"{\\f3\\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}\n";
+ t <<"}\n";
+ DBG_RTF(t <<"{\\comment begin colors}\n")
+ t <<"{\\colortbl;";
+ t <<"\\red0\\green0\\blue0;";
+ t <<"\\red0\\green0\\blue255;";
+ t <<"\\red0\\green255\\blue255;";
+ t <<"\\red0\\green255\\blue0;";
+ t <<"\\red255\\green0\\blue255;";
+ t <<"\\red255\\green0\\blue0;";
+ t <<"\\red255\\green255\\blue0;";
+ t <<"\\red255\\green255\\blue255;";
+ t <<"\\red0\\green0\\blue128;";
+ t <<"\\red0\\green128\\blue128;";
+ t <<"\\red0\\green128\\blue0;";
+ t <<"\\red128\\green0\\blue128;";
+ t <<"\\red128\\green0\\blue0;";
+ t <<"\\red128\\green128\\blue0;";
+ t <<"\\red128\\green128\\blue128;";
+ t <<"\\red192\\green192\\blue192;}" << endl;
+
+ DBG_RTF(t <<"{\\comment Beginning style list}\n")
+ t <<"{\\stylesheet\n";
+ t <<"{\\widctlpar\\adjustright \\fs20\\cgrid \\snext0 Normal;}\n";
+
+ // sort styles ascending by \s-number via an intermediate QArray
+ QArray<const StyleData*> array(128);
+ array.fill(0);
+ QDictIterator<StyleData> iter(rtf_Style);
+ const StyleData* style;
+ for(; (style = iter.current()); ++iter)
+ {
+ unsigned index = style->index;
+ unsigned size = array.size();
+ if (index >= size)
+ {
+ // +1 to add at least one element, then align up to multiple of 8
+ array.resize((index + 1 + 7) & ~7);
+ array.fill(0, size);
+ ASSERT(index < array.size());
+ }
+ if (array.at(index) != 0)
+ {
+ QCString key(convertToQCString(iter.currentKey()));
+ msg("Style '%s' redefines \\s%d.\n", key.data(), index);
+ }
+ array.at(index) = style;
+ }
+
+ // write array elements
+ unsigned size = array.size();
+ for(unsigned i = 0; i < size; i++)
+ {
+ const StyleData* style = array.at(i);
+ if (style != 0)
+ t <<"{" << style->reference << style->definition << ";}\n";
+ }
+
+ t <<"}" << endl;
+ // this comment is needed for postprocessing!
+ t <<"{\\comment begin body}" << endl;
+
+}
+
+void RTFGenerator::beginRTFChapter()
+{
+ t <<"\n";
+ DBG_RTF(t << "{\\comment BeginRTFChapter}\n")
+ t << rtf_Style_Reset;
+
+ // if we are compact, no extra page breaks...
+ if (Config_getBool("COMPACT_RTF"))
+ {
+ // t <<"\\sect\\sectd\\sbknone\n";
+ t <<"\\sect\\sbknone\n";
+ rtfwriteRuler_thick();
+ }
+ else
+ t <<"\\sect\\sbkpage\n";
+ //t <<"\\sect\\sectd\\sbkpage\n";
+
+ t << rtf_Style["Heading1"]->reference << "\n";
+}
+
+void RTFGenerator::beginRTFSection()
+{
+ t <<"\n";
+ DBG_RTF(t << "{\\comment BeginRTFSection}\n")
+ t << rtf_Style_Reset;
+
+ // if we are compact, no extra page breaks...
+ if (Config_getBool("COMPACT_RTF"))
+ {
+ // t <<"\\sect\\sectd\\sbknone\n";
+ t <<"\\sect\\sbknone\n";
+ rtfwriteRuler_emboss();
+ }
+ else
+ t <<"\\sect\\sbkpage\n";
+ //t <<"\\sect\\sectd\\sbkpage\n";
+
+ t << rtf_Style["Heading2"]->reference << "\n";
+}
+
+void RTFGenerator::startFile(const char *name,const char *,const char *)
+{
+ //setEncoding(QCString().sprintf("CP%s",theTranslator->trRTFansicp()));
+ QCString fileName=name;
+ relPath = relativePathToRoot(fileName);
+
+ if (fileName.right(4)!=".rtf" ) fileName+=".rtf";
+ startPlainFile(fileName);
+ beginRTFDocument();
+}
+
+void RTFGenerator::endFile()
+{
+ DBG_RTF(t << "{\\comment endFile}\n")
+ t << "}";
+
+ endPlainFile();
+}
+
+void RTFGenerator::startProjectNumber()
+{
+ DBG_RTF(t <<"{\\comment startProjectNumber }" << endl)
+ t << " ";
+}
+
+void RTFGenerator::endProjectNumber()
+{
+ DBG_RTF(t <<"{\\comment endProjectNumber }" << endl)
+}
+
+void RTFGenerator::startIndexSection(IndexSections is)
+{
+ //QCString paperName;
+
+ m_listLevel = 0;
+
+ switch (is)
+ {
+ case isTitlePageStart:
+ // basic RTFstart
+ // get readyfor author etc
+
+ t << "{\\info \n";
+ t << "{\\title {\\comment ";
+ break;
+ case isTitlePageAuthor:
+ t << "}\n";
+ if (rtf_subject) t << "{\\subject " << rtf_subject << "}\n";
+ if (rtf_comments) t << "{\\comment " << rtf_comments << "}\n";
+ if (rtf_company) t << "{\\company " << rtf_company << "}\n";
+ if (rtf_author) t << "{\\author " << rtf_author << "}\n";
+ if (rtf_manager) t << "{\\manager " << rtf_manager << "}\n";
+ if (rtf_documentType) t << "{\\category " << rtf_documentType << "}\n";
+ if (rtf_keywords) t << "{\\keywords " << rtf_keywords << "}\n";
+ t << "{\\comment ";
+ break;
+ case isMainPage:
+ //Introduction
+ beginRTFChapter();
+ break;
+ //case isPackageIndex:
+ // //Package Index
+ // beginRTFChapter();
+ // break;
+ case isModuleIndex:
+ //Module Index
+ beginRTFChapter();
+ break;
+ case isDirIndex:
+ //Directory Index
+ beginRTFChapter();
+ break;
+ case isNamespaceIndex:
+ //Namespace Index
+ beginRTFChapter();
+ break;
+ case isClassHierarchyIndex:
+ //Hierarchical Index
+ DBG_RTF(t << "{\\comment start classhierarchy}\n")
+ beginRTFChapter();
+ break;
+ case isCompoundIndex:
+ //Annotated Compound Index
+ beginRTFChapter();
+ break;
+ case isFileIndex:
+ //Annotated File Index
+ beginRTFChapter();
+ break;
+ case isPageIndex:
+ //Related Page Index
+ beginRTFChapter();
+ break;
+ case isModuleDocumentation:
+ {
+ //Module Documentation
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ bool found=FALSE;
+ for (gli.toFirst();(gd=gli.current()) && !found;++gli)
+ {
+ if (!gd->isReference())
+ {
+ beginRTFChapter();
+ found=TRUE;
+ }
+ }
+ }
+ break;
+ case isDirDocumentation:
+ {
+ //Directory Documentation
+ SDict<DirDef>::Iterator dli(*Doxygen::directories);
+ DirDef *dd;
+ bool found=FALSE;
+ for (dli.toFirst();(dd=dli.current()) && !found;++dli)
+ {
+ if (dd->isLinkableInProject())
+ {
+ beginRTFChapter();
+ found=TRUE;
+ }
+ }
+ }
+ break;
+ case isNamespaceDocumentation:
+ {
+ // Namespace Documentation
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ bool found=FALSE;
+ for (nli.toFirst();(nd=nli.current()) && !found;++nli)
+ {
+ if (nd->isLinkableInProject())
+ {
+ beginRTFChapter();
+ found=TRUE;
+ }
+ }
+ }
+ break;
+ case isClassDocumentation:
+ {
+ //Compound Documentation
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+ bool found=FALSE;
+ for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ {
+ if (cd->isLinkableInProject() &&
+ cd->templateMaster()==0 &&
+ !cd->isEmbeddedInGroupDocs()
+ )
+ {
+ beginRTFChapter();
+ found=TRUE;
+ }
+ }
+ }
+ break;
+ case isFileDocumentation:
+ {
+ //File Documentation
+ bool isFirst=TRUE;
+ FileName *fn=Doxygen::inputNameList->first();
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ if (fd->isLinkableInProject())
+ {
+ if (isFirst)
+ {
+ beginRTFChapter();
+ isFirst=FALSE;
+ break;
+ }
+ }
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ }
+ break;
+ case isExampleDocumentation:
+ {
+ //Example Documentation
+ beginRTFChapter();
+ }
+ break;
+ case isPageDocumentation:
+ {
+ //Page Documentation
+ beginRTFChapter();
+ }
+ break;
+ case isPageDocumentation2:
+ {
+ t << "{\\tc \\v ";
+ }
+ break;
+ case isEndIndex:
+ break;
+ }
+}
+
+void RTFGenerator::endIndexSection(IndexSections is)
+{
+ bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+ bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ switch (is)
+ {
+ case isTitlePageStart:
+ if (rtf_title)
+ // User has overridden document title in extensions file
+ t << "}" << rtf_title;
+ else
+ t << "}" << Config_getString("PROJECT_NAME");
+ break;
+ case isTitlePageAuthor:
+ {
+ t << "Doxgyen. }\n";
+ t << "{\\creatim " << dateToRTFDateString() << "}\n}";
+ DBG_RTF(t << "{\\comment end of infoblock}\n");
+ // setup for this section
+ t << rtf_Style_Reset <<"\n";
+ t <<"\\sectd\\pgnlcrm\n";
+ t <<"{\\footer "<<rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
+ // the title entry
+ DBG_RTF(t << "{\\comment begin title page}\n")
+
+
+ t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style
+
+ t << "\\vertalc\\qc\\par\\par\\par\\par\\par\\par\\par\n";
+ if (rtf_logoFilename)
+ {
+ t << "{\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"" << rtf_logoFilename;
+ t << "\" \\\\d \\\\*MERGEFORMAT} {\\fldrslt IMAGE }}\\par\\par\n";
+ }
+ if (rtf_company)
+ {
+ t << rtf_company << "\\par\\par\n";
+ }
+
+ t << rtf_Style_Reset << rtf_Style["Title"]->reference << endl; // set to title style
+ t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt TITLE}}\\par" << endl;
+
+ t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style
+ t << "\\par\n";
+ if (rtf_documentType)
+ {
+ t << rtf_documentType << "\\par\n";
+ }
+ if (rtf_documentId)
+ {
+ t << rtf_documentId << "\\par\n";
+ }
+ t << "\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\n";
+
+ t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to subtitle style
+ t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par" << endl;
+ t << "Version " << Config_getString("PROJECT_NUMBER") << "\\par";
+ t << "{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
+ "{\\fldrslt CREATEDATE}}\\par"<<endl;
+ t << "\\page\\page";
+ DBG_RTF(t << "{\\comment End title page}" << endl)
+
+ // table of contents section
+ DBG_RTF(t << "{\\comment Table of contents}\n")
+ t << "\\vertalt\n";
+ t << rtf_Style_Reset << endl;
+ t << rtf_Style["Heading1"]->reference;
+ t << theTranslator->trRTFTableOfContents() << "\\par"<< endl;
+ t << rtf_Style_Reset << "\\par" << endl;
+ t << "{\\field\\fldedit {\\*\\fldinst TOC \\\\f \\\\*MERGEFORMAT}{\\fldrslt Table of contents}}\\par\n";
+ t << rtf_Style_Reset << endl;
+ }
+ break;
+ case isMainPage:
+ t << "\\par " << rtf_Style_Reset << endl;
+ if (!Doxygen::mainPage || Doxygen::mainPage->title().isEmpty())
+ {
+ t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl;
+ }
+ else
+ {
+ t << "{\\tc \\v " << substitute(Doxygen::mainPage->title(),"%","") << "}"<< endl;
+ }
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ if (Config_getBool("GENERATE_TREEVIEW")) t << "main"; else t << "index";
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ break;
+ //case isPackageIndex:
+ // t << "\\par " << rtf_Style_Reset << endl;
+ // t << "{\\tc \\v " << theTranslator->trPackageList() << "}"<< endl;
+ // t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"packages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ // break;
+ case isModuleIndex:
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ break;
+ case isDirIndex:
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\tc \\v " << theTranslator->trDirIndex() << "}"<< endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"dirs.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ break;
+ case isNamespaceIndex:
+ t << "\\par " << rtf_Style_Reset << endl;
+ if (fortranOpt)
+ {
+ t << "{\\tc \\v " << theTranslator->trModulesIndex() << "}" << endl;
+ }
+ else
+ {
+ t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}" << endl;
+ }
+
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ break;
+ case isClassHierarchyIndex:
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}"<< endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ break;
+ case isCompoundIndex:
+ t << "\\par " << rtf_Style_Reset << endl;
+ if (fortranOpt)
+ {
+ t << "{\\tc \\v " << theTranslator->trCompoundIndexFortran() << "}"<< endl;
+ }
+ else if (vhdlOpt)
+ {
+ t << "{\\tc \\v " << VhdlDocGen::trDesignUnitIndex() << "}"<< endl;
+ }
+ else
+ {
+ t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}"<< endl;
+ }
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ break;
+ case isFileIndex:
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\tc \\v " << theTranslator->trFileIndex() << "}"<< endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ break;
+ case isPageIndex:
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ break;
+ case isModuleDocumentation:
+ {
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ if (!gd->isReference())
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << gd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ }
+ }
+ }
+ break;
+ case isDirDocumentation:
+ {
+ SDict<DirDef>::Iterator dli(*Doxygen::directories);
+ DirDef *dd;
+ t << "{\\tc \\v " << theTranslator->trDirDocumentation() << "}"<< endl;
+ for (dli.toFirst();(dd=dli.current());++dli)
+ {
+ if (dd->isLinkableInProject())
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << dd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ }
+ }
+ }
+ break;
+ case isNamespaceDocumentation:
+ {
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ bool found=FALSE;
+ for (nli.toFirst();(nd=nli.current()) && !found;++nli)
+ {
+ if (nd->isLinkableInProject())
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << nd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ found=TRUE;
+ }
+ }
+ while ((nd=nli.current()))
+ {
+ if (nd->isLinkableInProject())
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ beginRTFSection();
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << nd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ }
+ ++nli;
+ }
+ }
+ break;
+ case isClassDocumentation:
+ {
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+ bool found=FALSE;
+ if (fortranOpt)
+ {
+ t << "{\\tc \\v " << theTranslator->trTypeDocumentation() << "}"<< endl;
+ }
+ else
+ {
+ t << "{\\tc \\v " << theTranslator->trClassDocumentation() << "}"<< endl;
+ }
+ for (cli.toFirst();(cd=cli.current()) && !found;++cli)
+ {
+ if (cd->isLinkableInProject() &&
+ cd->templateMaster()==0 &&
+ !cd->isEmbeddedInGroupDocs()
+ )
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << cd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ found=TRUE;
+ }
+ }
+ for (;(cd=cli.current());++cli)
+ {
+ if (cd->isLinkableInProject() &&
+ cd->templateMaster()==0 &&
+ !cd->isEmbeddedInGroupDocs()
+ )
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ beginRTFSection();
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << cd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ }
+ }
+ }
+ break;
+ case isFileDocumentation:
+ {
+ bool isFirst=TRUE;
+ FileName *fn=Doxygen::inputNameList->first();
+
+ t << "{\\tc \\v " << theTranslator->trFileDocumentation() << "}"<< endl;
+ while (fn)
+ {
+ FileDef *fd=fn->first();
+ while (fd)
+ {
+ if (fd->isLinkableInProject())
+ {
+ if (isFirst)
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << fd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ isFirst=FALSE;
+ }
+ else
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ beginRTFSection();
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << fd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ }
+ }
+ fd=fn->next();
+ }
+ fn=Doxygen::inputNameList->next();
+ }
+ }
+ break;
+ case isExampleDocumentation:
+ {
+ //t << "}\n";
+ t << "{\\tc \\v " << theTranslator->trExampleDocumentation() << "}"<< endl;
+ PageSDict::Iterator pdi(*Doxygen::exampleSDict);
+ PageDef *pd=pdi.toFirst();
+ if (pd)
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << pd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ }
+ for (++pdi;(pd=pdi.current());++pdi)
+ {
+ t << "\\par " << rtf_Style_Reset << endl;
+ beginRTFSection();
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << pd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ }
+ }
+ break;
+ case isPageDocumentation:
+ {
+//#error "fix me in the same way as the latex index..."
+ //t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}"<< endl;
+ //t << "}"<< endl;
+ //PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ //PageDef *pd=pdi.toFirst();
+ //bool first=TRUE;
+ //for (pdi.toFirst();(pd=pdi.current());++pdi)
+ //{
+ // if (!pd->getGroupDef() && !pd->isReference())
+ // {
+ // if (first) t << "\\par " << rtf_Style_Reset << endl;
+ // t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ // t << pd->getOutputFileBase();
+ // t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ // first=FALSE;
+ // }
+ //}
+ }
+ break;
+ case isPageDocumentation2:
+ {
+ t << "}";
+ t << "\\par " << rtf_Style_Reset << endl;
+ }
+ break;
+ case isEndIndex:
+ beginRTFChapter();
+ t << rtf_Style["Heading1"]->reference;
+ t << theTranslator->trRTFGeneralIndex() << "\\par "<< endl;
+ t << rtf_Style_Reset << endl;
+ t << "{\\tc \\v " << theTranslator->trRTFGeneralIndex() << "}" << endl;
+ t << "{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n";
+
+ break;
+ }
+}
+
+void RTFGenerator::writePageLink(const char *name,bool first)
+{
+ if (first) t << "\\par " << rtf_Style_Reset << endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << name;
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+}
+
+void RTFGenerator::lastIndexPage()
+{
+ DBG_RTF(t <<"{\\comment Beginning Body of RTF Document}\n")
+ // end page and setup for rest of document
+ t <<"\\sect \\sbkpage \\pgndec \\pgnrestart\n";
+ t <<"\\sect \\sectd \\sbknone\n";
+
+ // set new footer with arabic numbers
+ t <<"{\\footer "<< rtf_Style["Footer"]->reference << "{\\chpgn}}\n";
+ //t << rtf_Style["Heading1"]->reference << "\n";
+
+}
+
+void RTFGenerator::writeStyleInfo(int)
+{
+}
+
+void RTFGenerator::lineBreak(const char *)
+{
+ DBG_RTF(t << "{\\comment (lineBreak)}" << endl)
+ t << "\\par" << endl;
+ m_omitParagraph = TRUE;
+}
+
+void RTFGenerator::writeString(const char *text)
+{
+ t << text;
+}
+
+void RTFGenerator::startIndexList()
+{
+ DBG_RTF(t << "{\\comment (startIndexList)}" << endl)
+ t << "{" << endl;
+ t << "\\par" << endl;
+ incrementIndentLevel();
+ t << rtf_Style_Reset << rtf_LCList_DepthStyle() << endl;
+ m_omitParagraph = TRUE;
+}
+
+void RTFGenerator::endIndexList()
+{
+ DBG_RTF(t << "{\\comment (endIndexList)}" << endl)
+ if (!m_omitParagraph)
+ {
+ t << "\\par";
+ m_omitParagraph = TRUE;
+ }
+ t << "}";
+ decrementIndentLevel();
+}
+
+/*! start bullet list */
+void RTFGenerator::startItemList()
+{
+ newParagraph();
+ DBG_RTF(t << "{\\comment (startItemList level=" << m_listLevel << ") }" << endl)
+ t << "{";
+ incrementIndentLevel();
+ rtf_listItemInfo[m_listLevel].isEnum = FALSE;
+}
+
+/*! end bullet list */
+void RTFGenerator::endItemList()
+{
+ newParagraph();
+ DBG_RTF(t << "{\\comment (endItemList level=" << m_listLevel << ")}" << endl)
+ t << "}";
+ decrementIndentLevel();
+ m_omitParagraph = TRUE;
+}
+
+///*! start enumeration list */
+//void RTFGenerator::startEnumList() // starts an enumeration list
+//{
+// DBG_RTF(t << "{\\comment (startEnumList)}" << endl)
+// t << "{" << endl;
+// incrementIndentLevel();
+// rtf_listItemInfo[m_listLevel].isEnum = TRUE;
+// rtf_listItemInfo[m_listLevel].number = 1;
+//}
+//
+///*! end enumeration list */
+//void RTFGenerator::endEnumList()
+//{
+// newParagraph();
+// DBG_RTF(t << "{\\comment (endEnumList)}" << endl)
+// t << "}";
+// decrementIndentLevel();
+// m_omitParagraph = TRUE;
+//}
+
+/*! write bullet or enum item */
+void RTFGenerator::startItemListItem()
+{
+ DBG_RTF(t << "{\\comment (startItemListItem)}" << endl)
+ newParagraph();
+ t << rtf_Style_Reset;
+ if (rtf_listItemInfo[m_listLevel].isEnum)
+ {
+ t << rtf_EList_DepthStyle() << endl;
+ t << rtf_listItemInfo[m_listLevel].number << ".\\tab ";
+ rtf_listItemInfo[m_listLevel].number++;
+ }
+ else
+ {
+ t << rtf_BList_DepthStyle() << endl;
+ }
+ m_omitParagraph = TRUE;
+}
+
+void RTFGenerator::endItemListItem()
+{
+ DBG_RTF(t << "{\\comment (endItemListItem)}" << endl)
+}
+
+void RTFGenerator::startIndexItem(const char *,const char *)
+{
+ DBG_RTF(t << "{\\comment (startIndexItem)}" << endl)
+
+ if (!m_omitParagraph)
+ {
+ t << "\\par" << endl;
+ m_omitParagraph = TRUE;
+ }
+}
+
+void RTFGenerator::endIndexItem(const char *ref,const char *fn)
+{
+ DBG_RTF(t << "{\\comment (endIndexItem)}" << endl)
+ if (!ref && fn)
+ {
+ t << "\\tab ";
+ writeRTFReference(fn);
+ t << endl;
+ }
+ else
+ {
+ t << endl;
+ }
+ m_omitParagraph = TRUE;
+}
+
+//void RTFGenerator::writeIndexFileItem(const char *,const char *text)
+//{
+// t << "\\item\\contentsline{section}{";
+// docify(text);
+// t << "}{\\pageref{" << text << "}}" << endl;
+//}
+
+void RTFGenerator::startHtmlLink(const char *url)
+{
+
+ if (Config_getBool("RTF_HYPERLINKS"))
+ {
+ t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
+ t << url;
+ t << "\" }{}";
+ t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
+ }
+ else
+ {
+ startTypewriter();
+ }
+}
+
+void RTFGenerator::endHtmlLink()
+{
+ if (Config_getBool("RTF_HYPERLINKS"))
+ {
+ t << "}}}" << endl;
+ }
+ else
+ {
+ endTypewriter();
+ }
+}
+
+//void RTFGenerator::writeMailLink(const char *url)
+//{
+// startTypewriter();
+// docify(url);
+// endTypewriter();
+//}
+
+void RTFGenerator::writeStartAnnoItem(const char *,const char *f,
+ const char *path,const char *name)
+{
+ DBG_RTF(t << "{\\comment (writeStartAnnoItem)}" << endl)
+ t << "{\\b ";
+ if (path) docify(path);
+ if (f && Config_getBool("RTF_HYPERLINKS"))
+ {
+ t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
+ t << rtfFormatBmkStr(f);
+ t << "\" }{}";
+ t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
+
+ docify(name);
+
+ t << "}}}" << endl;
+ }
+ else
+ {
+ docify(name);
+ }
+ t << "} ";
+}
+
+void RTFGenerator::writeEndAnnoItem(const char *name)
+{
+ DBG_RTF(t << "{\\comment (writeEndAnnoItem)}" << endl)
+ if (name)
+ {
+ t << "\\tab ";
+ writeRTFReference(name);
+ t << endl;
+ }
+ else
+ {
+ t << endl;
+ }
+ newParagraph();
+}
+
+void RTFGenerator::startIndexKey()
+{
+ DBG_RTF(t << "{\\comment (startIndexKey)}" << endl)
+ t << "{\\b ";
+}
+
+void RTFGenerator::endIndexKey()
+{
+ DBG_RTF(t << "{\\comment (endIndexKey)}" << endl)
+}
+
+void RTFGenerator::startIndexValue(bool hasBrief)
+{
+ DBG_RTF(t << "{\\comment (startIndexValue)}" << endl)
+ t << " ";
+ if (hasBrief) t << "(";
+}
+
+void RTFGenerator::endIndexValue(const char *name,bool hasBrief)
+{
+ DBG_RTF(t << "{\\comment (endIndexValue)}" << endl)
+ if (hasBrief) t << ")";
+ t << "} ";
+ if (name)
+ {
+ t << "\\tab ";
+ writeRTFReference(name);
+ t << endl;
+ }
+ else
+ {
+ t << endl;
+ }
+ m_omitParagraph=FALSE;
+ newParagraph();
+}
+
+void RTFGenerator::startSubsection()
+{
+ //beginRTFSubSection();
+ t <<"\n";
+ DBG_RTF(t << "{\\comment Begin SubSection}\n")
+ t << rtf_Style_Reset;
+ t << rtf_Style["Heading3"]->reference << "\n";
+}
+
+void RTFGenerator::endSubsection()
+{
+ newParagraph();
+ t << rtf_Style_Reset << endl;
+}
+
+void RTFGenerator::startSubsubsection()
+{
+ //beginRTFSubSubSection();
+ t << "\n";
+ DBG_RTF(t << "{\\comment Begin SubSubSection}\n")
+ t << "{" << endl;
+ t << rtf_Style_Reset << rtf_Style["Heading4"]->reference << "\n";
+}
+
+void RTFGenerator::endSubsubsection()
+{
+ newParagraph();
+ t << "}" << endl;
+}
+
+
+//void RTFGenerator::writeClassLink(const char *,const char *,
+// const char *,const char *name)
+//{
+// t << "{\\bf ";
+// docify(name);
+// t << "}";
+//}
+
+//void RTFGenerator::startTable(bool,int colNumbers)
+//{
+// DBG_RTF(t << "{\\comment startTable}\n";)
+// m_numCols=colNumbers;
+// t << "\\par\n";
+//}
+//
+//void RTFGenerator::endTable(bool hasCaption)
+//{
+// DBG_RTF(t << "{\\comment endTable}\n";)
+// if (!hasCaption)
+// t << "\n\\pard \\widctlpar\\intbl\\adjustright\n{\\row }\n";
+// t << "\\pard\n" << endl;
+//}
+//
+//void RTFGenerator::startCaption()
+//{
+// DBG_RTF(t << "{\\comment startCaption}\n";)
+// endTableRow();
+// t << "\\trowd \\trgaph108\\trleft-108\\trbrdrt\\brdrs\\brdrw10 \\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 \\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\\brdrs\\brdrw10 \\trbrdrv\\brdrs\\brdrw10" << endl;
+// t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 \\clbrdrl\\brdrs\\brdrw10 \\clbrdrb\\brdrs\\brdrw10 \\clbrdrr \\brdrs\\brdrw10 \\cltxlrtb \\cellx"<<rtf_pageWidth<<"\\pard \\qc\\nowidctlpar\\widctlpar\\intbl\\adjustright " << endl;
+// nextTableColumn();
+//}
+//
+//void RTFGenerator::endCaption()
+//{
+// DBG_RTF(t << "{\\comment endCaption}\n";)
+// endTableColumn();
+// endTableRow();
+//}
+//
+//void RTFGenerator::nextTableRow()
+//{
+// DBG_RTF(t << "{\\comment nextTableRow}\n";)
+// ASSERT(m_numCols>0 && m_numCols<25);
+// uint columnWidth=rtf_pageWidth/m_numCols;
+// t << "\\trowd \\trgaph108\\trleft-108\\trbrdrt\\brdrs\\brdrw10 "
+// "\\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 "
+// "\\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\\brdrs\\brdrw10 "
+// "\\trbrdrv\\brdrs\\brdrw10 "<<endl;
+// for (int i=0;i<m_numCols;i++)
+// {
+// t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 \\clbrdrl\\brdrs\\brdrw10 "
+// "\\clbrdrb\\brdrs\\brdrw10 \\clbrdrr \\brdrs\\brdrw10 \\cltxlrtb "
+// "\\cellx" << (i*columnWidth) << endl;
+// }
+// t << "\\pard \\widctlpar\\intbl\\adjustright\n{";
+//}
+//
+//void RTFGenerator::endTableRow()
+//{
+// DBG_RTF(t << "{\\comment endTableRow}\n";)
+// t << "\n\\pard \\widctlpar\\intbl\\adjustright\n{\\row }\n";
+//}
+//
+//void RTFGenerator::nextTableColumn()
+//{
+// DBG_RTF(t << "{\\comment nextTableColumn}\n";)
+// t << "{ ";
+//}
+//
+//void RTFGenerator::endTableColumn()
+//{
+// DBG_RTF(t << "{\\comment endTableColumn}\n";)
+// t << " \\cell }";
+//}
+//
+void RTFGenerator::startTextLink(const char *f,const char *anchor)
+{
+ if (Config_getBool("RTF_HYPERLINKS"))
+ {
+ QCString ref;
+ if (f)
+ {
+ ref+=f;
+ }
+ if (anchor)
+ {
+ ref+='_';
+ ref+=anchor;
+ }
+
+ t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
+ t << rtfFormatBmkStr(ref);
+ t << "\" }{}";
+ t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
+ }
+}
+
+void RTFGenerator::endTextLink()
+{
+ if (Config_getBool("RTF_HYPERLINKS"))
+ {
+ t << "}}}" << endl;
+ }
+}
+
+void RTFGenerator::writeObjectLink(const char *ref, const char *f,
+ const char *anchor, const char *text)
+{
+ if (!ref && Config_getBool("RTF_HYPERLINKS"))
+ {
+ QCString refName;
+ if (f)
+ {
+ refName+=f;
+ }
+ if (anchor)
+ {
+ refName+='_';
+ refName+=anchor;
+ }
+
+ t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
+ t << rtfFormatBmkStr(refName);
+ t << "\" }{}";
+ t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
+
+ docify(text);
+
+ t << "}}}" << endl;
+ }
+ else
+ {
+ startBold();
+ docify(text);
+ endBold();
+ }
+}
+
+void RTFGenerator::startPageRef()
+{
+ t << " (";
+ startEmphasis();
+}
+
+void RTFGenerator::endPageRef(const char *clname, const char *anchor)
+{
+ QCString ref;
+ if (clname)
+ {
+ ref+=clname;
+ }
+ if (anchor)
+ {
+ ref+='_';
+ ref+=anchor;
+ }
+ writeRTFReference(ref);
+ endEmphasis();
+ t << ")";
+}
+
+void RTFGenerator::writeCodeLink(const char *ref,const char *f,
+ const char *anchor,const char *name,
+ const char *)
+{
+ if (!ref && Config_getBool("RTF_HYPERLINKS"))
+ {
+ QCString refName;
+ if (f)
+ {
+ refName+=f;
+ }
+ if (anchor)
+ {
+ refName+='_';
+ refName+=anchor;
+ }
+
+ t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
+ t << rtfFormatBmkStr(refName);
+ t << "\" }{}";
+ t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
+
+ codify(name);
+
+ t << "}}}" << endl;
+ }
+ else
+ {
+ codify(name);
+ }
+}
+
+void RTFGenerator::startTitleHead(const char *)
+{
+ DBG_RTF(t <<"{\\comment startTitleHead}" << endl)
+
+ // beginRTFSection();
+ t << rtf_Style_Reset << rtf_Style["Heading2"]->reference << endl;
+}
+
+void RTFGenerator::endTitleHead(const char *fileName,const char *name)
+{
+ DBG_RTF(t <<"{\\comment endTitleHead}" << endl)
+ t << "\\par " << rtf_Style_Reset << endl;
+ if (name)
+ {
+ // make table of contents entry
+ t << "{\\tc\\tcl2 \\v ";
+ docify(name);
+ t << "}" << endl;
+
+ // make an index entry
+ addIndexItem(name,0);
+
+ //if (name)
+ //{
+ // writeAnchor(0,name);
+ //}
+ //
+ //if (Config_getBool("RTF_HYPERLINKS") && fileName)
+ //{
+ writeAnchor(fileName,0);
+ //}
+ }
+}
+
+void RTFGenerator::startTitle()
+{
+ DBG_RTF(t <<"{\\comment startTitle}" << endl)
+ if (Config_getBool("COMPACT_RTF"))
+ beginRTFSection();
+ else
+ beginRTFChapter();
+}
+
+void RTFGenerator::startGroupHeader(int extraIndent)
+{
+ DBG_RTF(t <<"{\\comment startGroupHeader}" << endl)
+ //newParagraph();
+ t << rtf_Style_Reset;
+ if (extraIndent==2)
+ {
+ t << rtf_Style["Heading5"]->reference;
+ }
+ else if (extraIndent==1)
+ {
+ t << rtf_Style["Heading4"]->reference;
+ }
+ else // extraIndent==0
+ {
+ t << rtf_Style["Heading3"]->reference;
+ }
+ t << endl;
+}
+
+void RTFGenerator::endGroupHeader(int)
+{
+ DBG_RTF(t <<"{\\comment endGroupHeader}" << endl)
+ t << "\\par" << endl;
+ t << rtf_Style_Reset << endl;
+}
+
+void RTFGenerator::startMemberDoc(const char *clname,
+ const char *memname,
+ const char *,
+ const char *,
+ bool showInline)
+{
+ DBG_RTF(t << "{\\comment startMemberDoc}" << endl)
+ if (memname && memname[0]!='@')
+ {
+ addIndexItem(memname,clname);
+ addIndexItem(clname,memname);
+ }
+ t << rtf_Style_Reset << rtf_Style[showInline ? "Heading5" : "Heading4"]->reference;
+ //styleStack.push(rtf_Style_Heading4);
+ t << "{" << endl;
+ //printf("RTFGenerator::startMemberDoc() `%s'\n",rtf_Style["Heading4"]->reference);
+ startBold();
+ t << endl;
+}
+
+void RTFGenerator::endMemberDoc(bool)
+{
+ DBG_RTF(t << "{\\comment endMemberDoc}" << endl)
+ //const char *style = styleStack.pop();
+ //printf("RTFGenerator::endMemberDoc() `%s'\n",style);
+ //ASSERT(style==rtf_Style["Heading4"]->reference);
+ endBold();
+ t << "}" << endl;
+ newParagraph();
+}
+
+void RTFGenerator::startDoxyAnchor(const char *,const char *,
+ const char *,const char *,
+ const char *
+ )
+{
+ DBG_RTF(t << "{\\comment startDoxyAnchor}" << endl)
+}
+
+void RTFGenerator::endDoxyAnchor(const char *fName,const char *anchor)
+{
+ QCString ref;
+ if (fName)
+ {
+ ref+=fName;
+ }
+ if (anchor)
+ {
+ ref+='_';
+ ref+=anchor;
+ }
+
+ DBG_RTF(t << "{\\comment endDoxyAnchor}" << endl)
+ t << "{\\bkmkstart ";
+ t << rtfFormatBmkStr(ref);
+ t << "}" << endl;
+ t << "{\\bkmkend ";
+ t << rtfFormatBmkStr(ref);
+ t << "}" << endl;
+}
+
+
+//void RTFGenerator::writeLatexLabel(const char *clName,const char *anchor)
+//{
+// writeDoxyAnchor(0,clName,anchor,0);
+//}
+
+void RTFGenerator::addIndexItem(const char *s1,const char *s2)
+{
+ if (s1)
+ {
+ t << "{\\xe \\v ";
+ docify(s1);
+ if (s2)
+ {
+ t << "\\:";
+ docify(s2);
+ }
+ t << "}" << endl;
+ }
+}
+
+void RTFGenerator::startIndent()
+{
+ incrementIndentLevel();
+ DBG_RTF(t << "{\\comment (startIndent) }" << endl)
+ t << "{" << endl;
+ t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl;
+}
+
+void RTFGenerator::endIndent()
+{
+ t << "}" << endl;
+ decrementIndentLevel();
+}
+
+
+void RTFGenerator::startDescription()
+{
+ DBG_RTF(t << "{\\comment (startDescription)}" << endl)
+ t << "{" << endl;
+ t << rtf_Style_Reset << rtf_DList_DepthStyle();
+}
+
+void RTFGenerator::endDescription()
+{
+ DBG_RTF(t << "{\\comment (endDescription)}" << endl)
+ newParagraph();
+ t << "}";
+}
+
+void RTFGenerator::startDescItem()
+{
+ newParagraph();
+ DBG_RTF(t << "{\\comment (startDescItem)}" << endl)
+ t << "{\\b ";
+}
+
+void RTFGenerator::endDescItem()
+{
+ DBG_RTF(t << "{\\comment (endDescItem)}" << endl)
+ t << "}" << endl;
+ newParagraph();
+}
+
+void RTFGenerator::startMemberDescription()
+{
+ DBG_RTF(t << "{\\comment (startMemberDescription)}" << endl)
+ t << "{" << endl;
+ incrementIndentLevel();
+ t << rtf_Style_Reset << rtf_CList_DepthStyle();
+ startEmphasis();
+}
+
+void RTFGenerator::endMemberDescription()
+{
+ DBG_RTF(t << "{\\comment (endMemberDescription)}" << endl)
+ endEmphasis();
+ newParagraph();
+ decrementIndentLevel();
+ //t << "\\par";
+ t << "}" << endl;
+ //m_omitParagraph = TRUE;
+}
+
+void RTFGenerator::startDescList(SectionTypes)
+{
+ DBG_RTF(t << "{\\comment (startDescList)}" << endl)
+ t << "{"; // ends at endDescList
+ t << "{"; // ends at endDescTitle
+ startBold();
+ newParagraph();
+}
+
+//void RTFGenerator::endDescTitle()
+//{
+// DBG_RTF(t << "{\\comment (endDescTitle) }" << endl)
+// endBold();
+// t << "}";
+// newParagraph();
+// incrementIndentLevel();
+// t << rtf_Style_Reset << rtf_DList_DepthStyle();
+//}
+
+void RTFGenerator::startDescForItem()
+{
+ DBG_RTF(t << "{\\comment (startDescForItem) }" << endl)
+}
+
+void RTFGenerator::endDescForItem()
+{
+ DBG_RTF(t << "{\\comment (endDescForItem) }" << endl)
+}
+
+//void RTFGenerator::endDescList()
+//{
+// DBG_RTF(t << "{\\comment (endDescList)}" << endl)
+// newParagraph();
+// decrementIndentLevel();
+// m_omitParagraph = TRUE;
+// t << "}";
+//}
+
+
+void RTFGenerator::startSection(const char *,const char *title,SectionInfo::SectionType type)
+{
+ DBG_RTF(t << "{\\comment (startSection)}" << endl)
+ t << "{";
+ t<< rtf_Style_Reset;
+ int num=4;
+ switch(type)
+ {
+ case SectionInfo::Page: num=2; break;
+ case SectionInfo::Section: num=3; break;
+ case SectionInfo::Subsection: num=4; break;
+ case SectionInfo::Subsubsection: num=4; break;
+ case SectionInfo::Paragraph: num=4; break;
+ default: ASSERT(0); break;
+ }
+ QCString heading;
+ heading.sprintf("Heading%d",num);
+ // set style
+ t << rtf_Style[heading]->reference;
+ // make table of contents entry
+ t << "{\\tc\\tcl" << num << " \\v ";
+ docify(title);
+ t << "}" << endl;
+}
+
+void RTFGenerator::endSection(const char *lab,SectionInfo::SectionType)
+{
+ DBG_RTF(t << "{\\comment (endSection)}" << endl)
+ // make bookmark
+ m_omitParagraph=FALSE;
+ newParagraph();
+ writeAnchor(0,lab);
+ t << "}";
+}
+
+//void RTFGenerator::writeSectionRef(const char *ref,const char *,
+// const char *lab,const char *title)
+//{
+// if (ref)
+// {
+// docify(title);
+// }
+// else
+// {
+// startBold();
+// docify(title);
+// endBold();
+// t << " (";
+// docify(theTranslator->trPageAbbreviation());
+// writeRTFReference(lab);
+// t << ")" << endl;
+// }
+//}
+//
+//void RTFGenerator::writeSectionRefItem(const char *,const char *lab,
+// const char *title)
+//{
+// docify(title);
+// t << "\\tab";
+// writeRTFReference(lab);
+// t << endl;
+//}
+//
+//void RTFGenerator::writeSectionRefAnchor(const char *name,const char *lab,
+// const char *title)
+//{
+// writeSectionRef(name,lab,title);
+//}
+
+//char* RTFGenerator::getMultiByte(int c)
+//{
+// static char s[10];
+//
+// sprintf(s,"\\'%X",c);
+// return s;
+//}
+
+void RTFGenerator::docify(const char *str)
+{
+ if (str)
+ {
+ const unsigned char *p=(const unsigned char *)str;
+ unsigned char c;
+ unsigned char pc='\0';
+ while (*p)
+ {
+ //static bool MultiByte = FALSE;
+ c=*p++;
+
+#if 0
+ if ( MultiByte )
+ {
+ t << getMultiByte( c );
+ MultiByte = FALSE;
+ continue;
+ }
+ if ( c >= 0x80 )
+ {
+ MultiByte = TRUE;
+ t << getMultiByte( c );
+ continue;
+ }
+#endif
+
+ switch (c)
+ {
+ case '{': t << "\\{"; break;
+ case '}': t << "\\}"; break;
+ case '\\': t << "\\\\"; break;
+ default:
+ {
+ // see if we can insert an hyphenation hint
+ //if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
+ t << (char)c;
+ }
+ }
+ pc = c;
+ m_omitParagraph = FALSE;
+ }
+ }
+}
+
+void RTFGenerator::codify(const char *str)
+{
+ // note that RTF does not have a "verbatim", so "\n" means
+ // nothing... add a "newParagraph()";
+ //static char spaces[]=" ";
+ if (str)
+ {
+ const unsigned char *p=(const unsigned char *)str;
+ unsigned char c;
+ int spacesToNextTabStop;
+
+ while (*p)
+ {
+ //static bool MultiByte = FALSE;
+
+ c=*p++;
+
+#if 0
+ if( MultiByte )
+ {
+ t << getMultiByte( c );
+ MultiByte = FALSE;
+ continue;
+ }
+ if( c >= 0x80 )
+ {
+ MultiByte = TRUE;
+ t << getMultiByte( c );
+ continue;
+ }
+#endif
+
+ switch(c)
+ {
+ case '\t': spacesToNextTabStop = Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
+ t << Doxygen::spaces.left(spacesToNextTabStop);
+ col+=spacesToNextTabStop;
+ break;
+ case '\n': newParagraph();
+ t << '\n'; col=0;
+ break;
+ case '{': t << "\\{"; col++; break;
+ case '}': t << "\\}"; col++; break;
+ case '\\': t << "\\\\"; col++; break;
+ default: t << (char)c; col++; break;
+ }
+ }
+ }
+}
+
+void RTFGenerator::writeChar(char c)
+{
+ char cs[2];
+ cs[0]=c;
+ cs[1]=0;
+ docify(cs);
+}
+
+void RTFGenerator::startClassDiagram()
+{
+ DBG_RTF(t <<"{\\comment startClassDiagram }" << endl)
+}
+
+void RTFGenerator::endClassDiagram(const ClassDiagram &d,
+ const char *fileName,const char *)
+{
+ newParagraph();
+
+ // create a png file
+ d.writeImage(t,dir,relPath,fileName,FALSE);
+
+ // display the file
+ t << "{" << endl;
+ t << rtf_Style_Reset << endl;
+ t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
+ t << fileName << ".png\"";
+ t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+ t << "}" << endl;
+}
+
+//void RTFGenerator::writeFormula(const char *,const char *text)
+//{
+// t << text;
+//}
+
+void RTFGenerator::startMemberItem(int)
+{
+ DBG_RTF(t <<"{\\comment startMemberItem }" << endl)
+ t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl; // set style to apropriate depth
+}
+
+void RTFGenerator::endMemberItem()
+{
+ DBG_RTF(t <<"{\\comment endMemberItem }" << endl)
+ newParagraph();
+}
+
+void RTFGenerator::writeAnchor(const char *fileName,const char *name)
+{
+ QCString anchor;
+ if (fileName)
+ {
+ anchor+=fileName;
+ }
+ if (fileName && name)
+ {
+ anchor+='_';
+ }
+ if (name)
+ {
+ anchor+=name;
+ }
+
+ DBG_RTF(t <<"{\\comment writeAnchor (" << anchor << ")}" << endl)
+ t << "{\\bkmkstart " << rtfFormatBmkStr(anchor) << "}" << endl;
+ t << "{\\bkmkend " << rtfFormatBmkStr(anchor) << "}" << endl;
+}
+
+void RTFGenerator::writeRTFReference(const char *label)
+{
+ t << "{\\field\\fldedit {\\*\\fldinst PAGEREF ";
+ t << rtfFormatBmkStr(label);
+ t << " \\\\*MERGEFORMAT}{\\fldrslt pagenum}}";
+}
+
+void RTFGenerator::startCodeFragment()
+{
+ DBG_RTF(t << "{\\comment (startCodeFragment) }" << endl)
+ t << "{" << endl;
+ //newParagraph();
+ t << rtf_Style_Reset << rtf_Code_DepthStyle();
+ //styleStack.push(rtf_Style_CodeExample);
+}
+
+void RTFGenerator::endCodeFragment()
+{
+ //newParagraph();
+ //styleStack.pop();
+ //printf("RTFGenerator::endCodeFrament() top=%s\n",styleStack.top());
+ //t << rtf_Style_Reset << styleStack.top() << endl;
+ DBG_RTF(t << "{\\comment (endCodeFragment) }" << endl)
+ t << "}" << endl;
+ m_omitParagraph = TRUE;
+}
+
+void RTFGenerator::writeNonBreakableSpace(int)
+{
+ t << "\\~ ";
+}
+
+
+void RTFGenerator::startMemberList()
+{
+ t << endl;
+ DBG_RTF(t << "{\\comment (startMemberList) }" << endl)
+ t << "{" << endl;
+#ifdef DELETEDCODE
+ if (!insideTabbing)
+ t << "\\begin{CompactItemize}" << endl;
+#endif
+}
+
+void RTFGenerator::endMemberList()
+{
+ DBG_RTF(t << "{\\comment (endMemberList) }" << endl)
+ t << "}" << endl;
+#ifdef DELETEDCODE
+ if (!insideTabbing)
+ t << "\\end{CompactItemize}" << endl;
+#endif
+}
+
+//void RTFGenerator::startImage(const char *name,const char *,bool)
+//{
+// newParagraph();
+// t << "{" << endl;
+// t << rtf_Style_Reset << endl;
+// t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
+// t << name;
+// t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+// t << "}" << endl;
+//}
+//
+//void RTFGenerator::endImage(bool)
+//{
+// // not yet implemented
+//}
+//
+//void RTFGenerator::startDotFile(const char *name,bool)
+//{
+// QCString baseName=name;
+// int i;
+// if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
+// {
+// baseName=baseName.right(baseName.length()-i-1);
+// }
+// QCString outDir = Config_getString("RTF_OUTPUT");
+// writeDotGraphFromFile(name,outDir,baseName,BITMAP);
+// newParagraph();
+// t << "{" << endl;
+// t << rtf_Style_Reset << endl;
+// t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
+// t << outDir << "\\" << baseName;
+// t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+// t << "}" << endl;
+//}
+//
+//void RTFGenerator::endDotFile(bool)
+//{
+// // not yet implemented
+//}
+//
+void RTFGenerator::startDescTable()
+{
+ DBG_RTF(t << "{\\comment (startDescTable) }" << endl)
+ //t << "{" << endl;
+ //incrementIndentLevel();
+ //t << rtf_Style_Reset << rtf_CList_DepthStyle();
+}
+
+void RTFGenerator::endDescTable()
+{
+ //decrementIndentLevel();
+ DBG_RTF(t << "{\\comment (endDescTable)}" << endl)
+ //t << "}" << endl;
+ //t << rtf_Style_Reset << styleStack.top();
+}
+
+void RTFGenerator::startDescTableTitle()
+{
+ //t << rtf_BList_DepthStyle() << endl;
+ DBG_RTF(t << "{\\comment (startDescTableTitle) }" << endl)
+ startBold();
+ startEmphasis();
+}
+
+void RTFGenerator::endDescTableTitle()
+{
+ DBG_RTF(t << "{\\comment (endDescTableTitle) }" << endl)
+ endEmphasis();
+ endBold();
+ t << " ";
+}
+
+void RTFGenerator::startDescTableData()
+{
+ DBG_RTF(t << "{\\comment (startDescTableData) }" << endl)
+ m_omitParagraph = FALSE;
+}
+
+void RTFGenerator::endDescTableData()
+{
+ DBG_RTF(t << "{\\comment (endDescTableData) }" << endl)
+ newParagraph();
+ m_omitParagraph = TRUE;
+}
+
+// a style for list formatted as a "bulleted list"
+
+void RTFGenerator::incrementIndentLevel()
+{
+ m_listLevel++;
+ if (m_listLevel>rtf_maxIndentLevels-1)
+ {
+ err("error: Maximum indent level (%d) exceeded while generating RTF output!\n",rtf_maxIndentLevels);
+ m_listLevel=rtf_maxIndentLevels-1;
+ }
+}
+
+void RTFGenerator::decrementIndentLevel()
+{
+ m_listLevel--;
+ if (m_listLevel<0)
+ {
+ err("error: Negative indent level while generating RTF output!\n");
+ m_listLevel=0;
+ }
+}
+
+// a style for list formatted with "list continue" style
+const char * RTFGenerator::rtf_CList_DepthStyle()
+{
+ QCString n=makeIndexName("ListContinue",m_listLevel);
+ return rtf_Style[n]->reference;
+}
+
+// a style for list formatted as a "latext style" table of contents
+const char * RTFGenerator::rtf_LCList_DepthStyle()
+{
+ QCString n=makeIndexName("LatexTOC",m_listLevel);
+ return rtf_Style[n]->reference;
+}
+
+// a style for list formatted as a "bullet" style
+const char * RTFGenerator::rtf_BList_DepthStyle()
+{
+ QCString n=makeIndexName("ListBullet",m_listLevel);
+ return rtf_Style[n]->reference;
+}
+
+// a style for list formatted as a "enumeration" style
+const char * RTFGenerator::rtf_EList_DepthStyle()
+{
+ QCString n=makeIndexName("ListEnum",m_listLevel);
+ return rtf_Style[n]->reference;
+}
+
+const char * RTFGenerator::rtf_DList_DepthStyle()
+{
+ QCString n=makeIndexName("DescContinue",m_listLevel);
+ return rtf_Style[n]->reference;
+}
+
+const char * RTFGenerator::rtf_Code_DepthStyle()
+{
+ QCString n=makeIndexName("CodeExample",m_listLevel);
+ return rtf_Style[n]->reference;
+}
+
+void RTFGenerator::startTextBlock(bool dense)
+{
+ DBG_RTF(t << "{\\comment startTextBlock}" << endl)
+ t << "{" << endl;
+ t << rtf_Style_Reset;
+ if (dense) // no spacing between "paragraphs"
+ {
+ t << rtf_Style["DenseText"]->reference;
+ }
+ else // some spacing
+ {
+ t << rtf_Style["BodyText"]->reference;
+ }
+}
+
+void RTFGenerator::endTextBlock(bool /*paraBreak*/)
+{
+ newParagraph();
+ DBG_RTF(t << "{\\comment endTextBlock}" << endl)
+ t << "}" << endl;
+ //m_omitParagraph = TRUE;
+}
+
+void RTFGenerator::newParagraph()
+{
+ if (!m_omitParagraph)
+ {
+ DBG_RTF(t << "{\\comment (newParagraph)}" << endl)
+ t << "\\par" << endl;
+ }
+ m_omitParagraph = FALSE;
+}
+
+void RTFGenerator::startParagraph()
+{
+ DBG_RTF(t << "{\\comment startParagraph}" << endl)
+ newParagraph();
+ t << "{" << endl;
+}
+
+void RTFGenerator::endParagraph()
+{
+ DBG_RTF(t << "{\\comment endParagraph}" << endl)
+ t << "}\\par" << endl;
+ m_omitParagraph = TRUE;
+}
+
+void RTFGenerator::startMemberSubtitle()
+{
+ DBG_RTF(t << "{\\comment startMemberSubtitle}" << endl)
+ t << "{" << endl;
+ t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl;
+}
+
+void RTFGenerator::endMemberSubtitle()
+{
+ DBG_RTF(t << "{\\comment endMemberSubtitle}" << endl)
+ newParagraph();
+ t << "}" << endl;
+}
+
+//void RTFGenerator::writeUmlaut(char c)
+//{
+// switch(c)
+// {
+// case 'A' : t << '\304'; break;
+// case 'E' : t << '\313'; break;
+// case 'I' : t << '\317'; break;
+// case 'O' : t << '\326'; break;
+// case 'U' : t << '\334'; break;
+// case 'Y' : t << 'Y'; break;
+// case 'a' : t << '\344'; break;
+// case 'e' : t << '\353'; break;
+// case 'i' : t << '\357'; break;
+// case 'o' : t << '\366'; break;
+// case 'u' : t << '\374'; break;
+// case 'y' : t << '\377'; break;
+// default: t << '?'; break;
+// }
+//}
+//
+//void RTFGenerator::writeAcute(char c)
+//{
+// switch(c)
+// {
+// case 'A' : t << '\301'; break;
+// case 'E' : t << '\311'; break;
+// case 'I' : t << '\315'; break;
+// case 'O' : t << '\323'; break;
+// case 'U' : t << '\332'; break;
+// case 'Y' : t << '\335'; break;
+// case 'a' : t << '\341'; break;
+// case 'e' : t << '\351'; break;
+// case 'i' : t << '\355'; break;
+// case 'o' : t << '\363'; break;
+// case 'u' : t << '\372'; break;
+// case 'y' : t << '\375'; break;
+// default: t << '?'; break;
+// }
+//}
+//
+//void RTFGenerator::writeGrave(char c)
+//{
+// switch(c)
+// {
+// case 'A' : t << '\300'; break;
+// case 'E' : t << '\310'; break;
+// case 'I' : t << '\314'; break;
+// case 'O' : t << '\322'; break;
+// case 'U' : t << '\331'; break;
+// case 'a' : t << '\340'; break;
+// case 'e' : t << '\350'; break;
+// case 'i' : t << '\354'; break;
+// case 'o' : t << '\362'; break;
+// case 'u' : t << '\371'; break;
+// default: t << '?'; break;
+// }
+//}
+//
+//void RTFGenerator::writeCirc(char c)
+//{
+// switch(c)
+// {
+// case 'A' : t << '\302'; break;
+// case 'E' : t << '\312'; break;
+// case 'I' : t << '\316'; break;
+// case 'O' : t << '\324'; break;
+// case 'U' : t << '\333'; break;
+// case 'a' : t << '\342'; break;
+// case 'e' : t << '\352'; break;
+// case 'i' : t << '\356'; break;
+// case 'o' : t << '\364'; break;
+// case 'u' : t << '\373'; break;
+// default: t << '?'; break;
+// }
+//}
+//
+//void RTFGenerator::writeTilde(char c)
+//{
+// switch(c)
+// {
+// case 'A' : t << '\303'; break;
+// case 'N' : t << '\321'; break;
+// case 'O' : t << '\325'; break;
+// case 'a' : t << '\343'; break;
+// case 'n' : t << '\361'; break;
+// case 'o' : t << '\365'; break;
+// default: t << '?'; break;
+// }
+//}
+//
+//void RTFGenerator::writeRing(char c)
+//{
+// switch(c)
+// {
+// case 'A' : t << '\305'; break;
+// case 'a' : t << '\345'; break;
+// default: t << '?'; break;
+// }
+//}
+//
+//void RTFGenerator::writeCCedil(char c)
+//{
+// switch(c)
+// {
+// case 'C' : t << '\307'; break;
+// case 'c' : t << '\347'; break;
+// default: t << '?'; break;
+// }
+//}
+//
+
+// note: function is not reentrant!
+static void encodeForOutput(FTextStream &t,const QCString &s)
+{
+ QCString encoding;
+ bool converted=FALSE;
+ int l = s.length();
+ static QByteArray enc;
+ if (l*4>(int)enc.size()) enc.resize(l*4); // worst case
+ encoding.sprintf("CP%s",theTranslator->trRTFansicp().data());
+ if (!encoding.isEmpty())
+ {
+ // convert from UTF-8 back to the output encoding
+ void *cd = portable_iconv_open(encoding,"UTF-8");
+ if (cd!=(void *)(-1))
+ {
+ size_t iLeft=l;
+ size_t oLeft=enc.size();
+ const char *inputPtr = s.data();
+ char *outputPtr = enc.data();
+ if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft))
+ {
+ enc.resize(enc.size()-oLeft);
+ converted=TRUE;
+ }
+ portable_iconv_close(cd);
+ }
+ }
+ if (!converted) // if we did not convert anything, copy as is.
+ {
+ memcpy(enc.data(),s.data(),l);
+ enc.resize(l);
+ }
+ uint i;
+ for (i=0;i<enc.size();i++)
+ {
+ uchar c = (uchar)enc.at(i);
+ if (c>=0x80)
+ {
+ char esc[10];
+ sprintf(esc,"\\'%X",c);
+ t << esc;
+ }
+ else
+ {
+ t << (char)c;
+ }
+ }
+}
+
+/**
+ * VERY brittle routine inline RTF's included by other RTF's.
+ * it is recursive and ugly.
+ */
+static bool preProcessFile(QDir &d,QCString &infName, FTextStream &t, bool bIncludeHeader=TRUE)
+{
+ QFile f(infName);
+ if (!f.open(IO_ReadOnly))
+ {
+ err("error: problems opening rtf file %s for reading\n",infName.data());
+ return FALSE;
+ }
+
+ const int maxLineLength = 10240;
+ static QCString lineBuf(maxLineLength);
+
+ // scan until find end of header
+ // this is EXTREEEEEEEMLY brittle. It works on OUR rtf
+ // files because the first line before the body
+ // ALWAYS contains "{\comment begin body}"
+ do
+ {
+ if (f.readLine(lineBuf.data(),maxLineLength)==-1)
+ {
+ err("ERROR - read error in %s before end of RTF header!\n",infName.data());
+ return FALSE;
+ }
+ if (bIncludeHeader) encodeForOutput(t,lineBuf);
+ } while (lineBuf.find("\\comment begin body")==-1);
+
+
+ while (f.readLine(lineBuf.data(),maxLineLength)!=-1)
+ {
+ int pos;
+ if ((pos=lineBuf.find("INCLUDETEXT"))!=-1)
+ {
+ int startNamePos = lineBuf.find('"',pos)+1;
+ int endNamePos = lineBuf.find('"',startNamePos);
+ QCString fileName = lineBuf.mid(startNamePos,endNamePos-startNamePos);
+ DBG_RTF(t << "{\\comment begin include " << fileName << "}" << endl)
+ if (!preProcessFile(d,fileName,t,FALSE)) return FALSE;
+ DBG_RTF(t << "{\\comment end include " << fileName << "}" << endl)
+ }
+ else // no INCLUDETEXT on this line
+ {
+ // elaborate hoopla to skip the final "}" if we didn't include the
+ // headers
+ if (!f.atEnd() || bIncludeHeader)
+ {
+ encodeForOutput(t,lineBuf);
+ }
+ else // last line of included file
+ {
+ // null terminate at the last '}'
+ //char *str = strrchr(buffer,'}');
+ int pos = lineBuf.findRev('}');
+
+ if (pos != -1)
+ lineBuf.at(pos) = '\0';
+ else
+ err("Strange, the last char was not a '}'\n");
+ encodeForOutput(t,lineBuf);
+ }
+ }
+ }
+ f.close();
+ // remove temporary file
+ d.remove(infName);
+ return TRUE;
+}
+
+void RTFGenerator::startDotGraph()
+{
+ DBG_RTF(t << "{\\comment (startDotGraph)}" << endl)
+}
+
+void RTFGenerator::endDotGraph(const DotClassGraph &g)
+{
+ newParagraph();
+
+ QCString fileName =
+ g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),fileName,relPath,TRUE,FALSE);
+
+ // display the file
+ t << "{" << endl;
+ t << rtf_Style_Reset << endl;
+ t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
+ t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
+ t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+ t << "}" << endl;
+ newParagraph();
+ DBG_RTF(t << "{\\comment (endDotGraph)}" << endl)
+}
+
+void RTFGenerator::startInclDepGraph()
+{
+ DBG_RTF(t << "{\\comment (startInclDepGraph)}" << endl)
+}
+
+void RTFGenerator::endInclDepGraph(const DotInclDepGraph &g)
+{
+ newParagraph();
+
+ QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
+ fileName,relPath,FALSE);
+
+ // display the file
+ t << "{" << endl;
+ t << rtf_Style_Reset << endl;
+ t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
+ t << fn << "." << Config_getEnum("DOT_IMAGE_FORMAT");
+ t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+ t << "}" << endl;
+ DBG_RTF(t << "{\\comment (endInclDepGraph)}" << endl)
+}
+
+void RTFGenerator::startGroupCollaboration()
+{
+}
+
+void RTFGenerator::endGroupCollaboration(const DotGroupCollaboration &)
+{
+}
+
+void RTFGenerator::startCallGraph()
+{
+ DBG_RTF(t << "{\\comment (startCallGraph)}" << endl)
+}
+
+void RTFGenerator::endCallGraph(const DotCallGraph &g)
+{
+ newParagraph();
+
+ QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
+ fileName,relPath,FALSE);
+
+ // display the file
+ t << "{" << endl;
+ t << rtf_Style_Reset << endl;
+ t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
+ t << fn << "." << Config_getEnum("DOT_IMAGE_FORMAT");
+ t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+ t << "}" << endl;
+ DBG_RTF(t << "{\\comment (endCallGraph)}" << endl)
+}
+
+void RTFGenerator::startDirDepGraph()
+{
+ DBG_RTF(t << "{\\comment (startDirDepGraph)}" << endl)
+}
+
+void RTFGenerator::endDirDepGraph(const DotDirDeps &g)
+{
+ newParagraph();
+
+ QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
+ fileName,relPath,FALSE);
+
+ // display the file
+ t << "{" << endl;
+ t << rtf_Style_Reset << endl;
+ t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
+ t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
+ t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
+ t << "}" << endl;
+ DBG_RTF(t << "{\\comment (endDirDepGraph)}" << endl)
+}
+
+/** Tests the integrity of the result by counting brackets.
+ *
+ */
+void testRTFOutput(const char *name)
+{
+ int bcount=0;
+ int line=1;
+ int c;
+ QFile f(name);
+ if (f.open(IO_ReadOnly))
+ {
+ while ((c=f.getch())!=-1)
+ {
+ if (c=='\\') // escape char
+ {
+ c=f.getch();
+ if (c==-1) break;
+ }
+ else if (c=='{') // open bracket
+ {
+ bcount++;
+ }
+ else if (c=='}') // close bracket
+ {
+ bcount--;
+ if (bcount<0)
+ {
+ goto err;
+ break;
+ }
+ }
+ else if (c=='\n') // newline
+ {
+ line++;
+ }
+ }
+ }
+ if (bcount==0) return; // file is OK.
+err:
+ err("error: RTF integrity test failed at line %d of %s due to a bracket mismatch.\n",line,name);
+ err(" Please try to create a small code example that produces this error \n"
+ " and send that to dimitri@stack.nl.\n");
+}
+
+/**
+ * This is an API to a VERY brittle RTF preprocessor that combines nested
+ * RTF files. This version replaces the infile with the new file
+ */
+bool RTFGenerator::preProcessFileInplace(const char *path,const char *name)
+{
+ QDir d(path);
+ // store the original directory
+ if (!d.exists())
+ {
+ err("error: Output dir %s does not exist!\n",path);
+ return FALSE;
+ }
+ QCString oldDir = convertToQCString(QDir::currentDirPath());
+
+ // go to the html output directory (i.e. path)
+ QDir::setCurrent(d.absPath());
+ QDir thisDir;
+
+ QCString combinedName = (QCString)path+"/combined.rtf";
+ QCString mainRTFName = (QCString)path+"/"+name;
+
+ QFile outf(combinedName);
+ if (!outf.open(IO_WriteOnly))
+ {
+ err("Failed to open %s for writing!\n",combinedName.data());
+ return FALSE;
+ }
+ FTextStream outt(&outf);
+
+ if (!preProcessFile(thisDir,mainRTFName,outt))
+ {
+ // it failed, remove the temp file
+ outf.close();
+ thisDir.remove(combinedName);
+ QDir::setCurrent(oldDir);
+ return FALSE;
+ }
+
+ // everything worked, move the files
+ outf.close();
+ thisDir.remove(mainRTFName);
+ thisDir.rename(combinedName,mainRTFName);
+
+ testRTFOutput(mainRTFName);
+
+ QDir::setCurrent(oldDir);
+ return TRUE;
+}
+
+void RTFGenerator::startMemberGroupHeader(bool hasHeader)
+{
+ DBG_RTF(t << "{\\comment startMemberGroupHeader}" << endl)
+ t << "{" << endl;
+ if (hasHeader) incrementIndentLevel();
+ t << rtf_Style_Reset << rtf_Style["GroupHeader"]->reference;
+}
+
+void RTFGenerator::endMemberGroupHeader()
+{
+ DBG_RTF(t << "{\\comment endMemberGroupHeader}" << endl)
+ newParagraph();
+ t << rtf_Style_Reset << rtf_CList_DepthStyle();
+}
+
+void RTFGenerator::startMemberGroupDocs()
+{
+ DBG_RTF(t << "{\\comment startMemberGroupDocs}" << endl)
+ startEmphasis();
+}
+
+void RTFGenerator::endMemberGroupDocs()
+{
+ DBG_RTF(t << "{\\comment endMemberGroupDocs}" << endl)
+ endEmphasis();
+ newParagraph();
+}
+
+void RTFGenerator::startMemberGroup()
+{
+ DBG_RTF(t << "{\\comment startMemberGroup}" << endl)
+ t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl;
+}
+
+void RTFGenerator::endMemberGroup(bool hasHeader)
+{
+ DBG_RTF(t << "{\\comment endMemberGroup}" << endl)
+ if (hasHeader) decrementIndentLevel();
+ t << "}";
+}
+
+void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anchor,const char *title)
+{
+ DBG_RTF(t << "{\\comment (startSimpleSect)}" << endl)
+ t << "{"; // ends at endDescList
+ t << "{"; // ends at endDescTitle
+ startBold();
+ newParagraph();
+ if (file)
+ {
+ writeObjectLink(0,file,anchor,title);
+ }
+ else
+ {
+ docify(title);
+ }
+ endBold();
+ t << "}";
+ newParagraph();
+ incrementIndentLevel();
+ t << rtf_Style_Reset << rtf_DList_DepthStyle();
+}
+
+void RTFGenerator::endSimpleSect()
+{
+ DBG_RTF(t << "{\\comment (endSimpleSect)}" << endl)
+ newParagraph();
+ decrementIndentLevel();
+ m_omitParagraph = TRUE;
+ t << "}";
+}
+
+void RTFGenerator::startParamList(ParamListTypes,const char *title)
+{
+ DBG_RTF(t << "{\\comment (startParamList)}" << endl)
+ t << "{"; // ends at endParamList
+ t << "{"; // ends at endDescTitle
+ startBold();
+ newParagraph();
+ docify(title);
+ endBold();
+ t << "}";
+ newParagraph();
+ incrementIndentLevel();
+ t << rtf_Style_Reset << rtf_DList_DepthStyle();
+}
+
+void RTFGenerator::endParamList()
+{
+ DBG_RTF(t << "{\\comment (endParamList)}" << endl)
+ newParagraph();
+ decrementIndentLevel();
+ m_omitParagraph = TRUE;
+ t << "}";
+}
+
+void RTFGenerator::startParameterType(bool first,const char *key)
+{
+ DBG_RTF(t << "{\\comment (startParameterList)}" << endl)
+ if (!first && key)
+ {
+ t << " " << key << " ";
+ }
+}
+
+void RTFGenerator::printDoc(DocNode *n,const char *langExt)
+{
+ RTFDocVisitor *visitor = new RTFDocVisitor(t,*this,langExt);
+ n->accept(visitor);
+ delete visitor;
+ m_omitParagraph = TRUE;
+}
+
+void RTFGenerator::rtfwriteRuler_doubleline()
+{
+ DBG_RTF(t << "{\\comment (rtfwriteRuler_doubleline)}" << endl)
+ t << "{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}" << endl;
+}
+
+void RTFGenerator::rtfwriteRuler_emboss()
+{
+ DBG_RTF(t << "{\\comment (rtfwriteRuler_emboss)}" << endl)
+ t << "{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}" << endl;
+}
+
+void RTFGenerator::rtfwriteRuler_thick()
+{
+ DBG_RTF(t << "{\\comment (rtfwriteRuler_thick)}" << endl)
+ t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}" << endl;
+}
+
+void RTFGenerator::rtfwriteRuler_thin()
+{
+ DBG_RTF(t << "{\\comment (rtfwriteRuler_thin)}" << endl)
+ t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl;
+}
+
+#if 0
+void RTFGenerator::postProcess(QByteArray &a)
+{
+ QByteArray enc(a.size()*4); // worst case
+ int off=0;
+ uint i;
+ bool mbFlag=FALSE;
+ for (i=0;i<a.size();i++)
+ {
+ unsigned char c = (unsigned char)a.at(i);
+
+ // treat characters > 0x80 as multibyte characters, except when they
+ // are control characters
+ if (c>0x80 || (mbFlag && c!='\\' && c!='{' && c!='}'))
+ {
+ char s[10];
+ sprintf(s,"\\'%X",c);
+ qstrcpy(enc.data()+off,s);
+ off+=qstrlen(s);
+ mbFlag=c>0x80;
+ }
+ else
+ {
+ enc.at(off++)=c;
+ }
+ }
+ enc.resize(off);
+ a = enc;
+}
+#endif
+
+void RTFGenerator::startConstraintList(const char *header)
+{
+ DBG_RTF(t << "{\\comment (startConstraintList)}" << endl)
+ t << "{"; // ends at endConstraintList
+ t << "{";
+ startBold();
+ newParagraph();
+ docify(header);
+ endBold();
+ t << "}";
+ newParagraph();
+ incrementIndentLevel();
+ t << rtf_Style_Reset << rtf_DList_DepthStyle();
+}
+
+void RTFGenerator::startConstraintParam()
+{
+ DBG_RTF(t << "{\\comment (startConstraintParam)}" << endl)
+ startEmphasis();
+}
+
+void RTFGenerator::endConstraintParam()
+{
+ DBG_RTF(t << "{\\comment (endConstraintParam)}" << endl)
+ endEmphasis();
+ t << " : ";
+}
+
+void RTFGenerator::startConstraintType()
+{
+ DBG_RTF(t << "{\\comment (startConstraintType)}" << endl)
+ startEmphasis();
+}
+
+void RTFGenerator::endConstraintType()
+{
+ DBG_RTF(t << "{\\comment (endConstraintType)}" << endl)
+ endEmphasis();
+ t << " ";
+}
+
+void RTFGenerator::startConstraintDocs()
+{
+ DBG_RTF(t << "{\\comment (startConstraintDocs)}" << endl)
+}
+
+void RTFGenerator::endConstraintDocs()
+{
+ DBG_RTF(t << "{\\comment (endConstraintDocs)}" << endl)
+ newParagraph();
+}
+
+void RTFGenerator::endConstraintList()
+{
+ DBG_RTF(t << "{\\comment (endConstraintList)}" << endl)
+ newParagraph();
+ decrementIndentLevel();
+ m_omitParagraph = TRUE;
+ t << "}";
+}
+
+void RTFGenerator::startIndexListItem()
+{
+ DBG_RTF(t << "{\\comment (startIndexListItem)}" << endl)
+}
+
+void RTFGenerator::endIndexListItem()
+{
+ DBG_RTF(t << "{\\comment (endIndexListItem)}" << endl)
+ t << "\\par" << endl;
+}
+
+void RTFGenerator::startInlineDescription()
+{
+ DBG_RTF(t << "{\\comment (startInlineDescription)}" << endl)
+}
+
+void RTFGenerator::endInlineDescription()
+{
+ DBG_RTF(t << "{\\comment (endInlineDescription)}" << endl)
+}
+
+void RTFGenerator::startInlineHeader()
+{
+ DBG_RTF(t << "{\\comment (startInlineHeader)}" << endl)
+ t << "{" << endl;
+ t << rtf_Style_Reset << rtf_Style["Heading5"]->reference;
+ startBold();
+}
+
+void RTFGenerator::endInlineHeader()
+{
+ DBG_RTF(t << "{\\comment (endInlineHeader)}" << endl)
+ endBold();
+ t << "\\par";
+ t << "}" << endl;
+}
+
+
diff --git a/src/rtfgen.h b/src/rtfgen.h
new file mode 100644
index 0000000..4896557
--- /dev/null
+++ b/src/rtfgen.h
@@ -0,0 +1,277 @@
+/******************************************************************************
+ *
+ * $Id: rtfgen.h,v 1.13 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Parker Waechter & Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef RTFGEN_H
+#define RTFGEN_H
+
+#include "outputgen.h"
+
+class QFile;
+
+class RTFGenerator : public OutputGenerator
+{
+ public:
+ RTFGenerator();
+ ~RTFGenerator();
+ static void init();
+ static void writeStyleSheetFile(QFile &f);
+ static void writeExtensionsFile(QFile &file);
+
+ void enable()
+ { if (genStack->top()) active=*genStack->top(); else active=TRUE; }
+ void disable() { active=FALSE; }
+ void enableIf(OutputType o) { if (o==RTF) active=TRUE; }
+ void disableIf(OutputType o) { if (o==RTF) active=FALSE; }
+ void disableIfNot(OutputType o) { if (o!=RTF) active=FALSE; }
+ bool isEnabled(OutputType o) { return (o==RTF && active); }
+ OutputGenerator *get(OutputType o) { return (o==RTF) ? this : 0; }
+
+ void printDoc(DocNode *,const char *);
+
+ void startFile(const char *name,const char *manName,const char *title);
+ void writeFooter() {}
+ void endFile();
+ void clearBuffer();
+ //void postProcess(QByteArray &);
+
+ void startIndexSection(IndexSections);
+ void endIndexSection(IndexSections);
+ void writePageLink(const char *,bool);
+ void startProjectNumber();
+ void endProjectNumber();
+ void writeStyleInfo(int part);
+ void startTitleHead(const char *);
+ void startTitle();
+ void endTitleHead(const char *,const char *name);
+ void endTitle() {}
+
+ void newParagraph();
+ void startParagraph();
+ void endParagraph();
+ void writeString(const char *text);
+ void startIndexListItem();
+ void endIndexListItem();
+ void startIndexList();
+ void endIndexList();
+ void startIndexKey();
+ void endIndexKey();
+ void startIndexValue(bool);
+ void endIndexValue(const char *,bool);
+ void startItemList();
+ void endItemList();
+ void startIndexItem(const char *ref,const char *file);
+ void endIndexItem(const char *ref,const char *file);
+ void docify(const char *text);
+ void codify(const char *text);
+ void writeObjectLink(const char *ref,const char *file,
+ const char *anchor,const char *name);
+ void writeCodeLink(const char *ref, const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip);
+ void startTextLink(const char *f,const char *anchor);
+ void endTextLink();
+ void startHtmlLink(const char *url);
+ void endHtmlLink();
+ void startTypewriter() { t << "{\\f2 "; }
+ void endTypewriter() { t << "}"; }
+ void startGroupHeader(int);
+ void endGroupHeader(int);
+ //void writeListItem();
+ void startItemListItem();
+ void endItemListItem();
+
+ void startMemberSections() {}
+ void endMemberSections() {}
+ void startHeaderSection() {}
+ void endHeaderSection() {}
+ void startMemberHeader(const char *) { startGroupHeader(FALSE); }
+ void endMemberHeader() { endGroupHeader(FALSE); }
+ void startMemberSubtitle();
+ void endMemberSubtitle();
+ void startMemberDocList() {}
+ void endMemberDocList() {}
+ void startMemberList();
+ void endMemberList();
+ void startInlineDescription();
+ void endInlineDescription();
+ void startInlineHeader();
+ void endInlineHeader();
+ void startAnonTypeScope(int) {}
+ void endAnonTypeScope(int) {}
+ void startMemberItem(int);
+ void endMemberItem();
+ void startMemberTemplateParams() {}
+ void endMemberTemplateParams() {}
+ void insertMemberAlign(bool) {}
+
+ void writeRuler() { rtfwriteRuler_thin(); }
+
+ void writeAnchor(const char *fileName,const char *name);
+ void startCodeFragment();
+ void endCodeFragment();
+ void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; }
+ void startCodeLine() { col=0; }
+ void endCodeLine() { lineBreak(); }
+ void startEmphasis() { t << "{\\i "; }
+ void endEmphasis() { t << "}"; }
+ void startBold() { t << "{\\b "; }
+ void endBold() { t << "}"; }
+ void startDescription();
+ void endDescription();
+ void startDescItem();
+ void endDescItem();
+ void lineBreak(const char *style=0);
+ void startMemberDoc(const char *,const char *,const char *,const char *,bool);
+ void endMemberDoc(bool);
+ void startDoxyAnchor(const char *,const char *,const char *,const char *,const char *);
+ void endDoxyAnchor(const char *,const char *);
+ void startCodeAnchor(const char *) {};
+ void endCodeAnchor() {};
+ void writeChar(char c);
+ void writeLatexSpacing() {};//{ t << "\\hspace{0.3cm}"; }
+ void writeStartAnnoItem(const char *type,const char *file,
+ const char *path,const char *name);
+ void writeEndAnnoItem(const char *name);
+ void startSubsection();
+ void endSubsection();
+ void startSubsubsection();
+ void endSubsubsection();
+ void startCenter() { t << "{\\qc" << endl; }
+ void endCenter() { t << "}"; }
+ void startSmall() { t << "{\\sub "; }
+ void endSmall() { t << "}"; }
+
+ void startMemberDescription();
+ void endMemberDescription();
+ void startDescList(SectionTypes);
+ void startSimpleSect(SectionTypes,const char *,const char *,const char *);
+ void endSimpleSect();
+ void startParamList(ParamListTypes,const char *);
+ void endParamList();
+ //void writeDescItem();
+ void startDescForItem();
+ void endDescForItem();
+ void startSection(const char *,const char *,SectionInfo::SectionType);
+ void endSection(const char *,SectionInfo::SectionType);
+ void addIndexItem(const char *,const char *);
+ void startIndent();
+ void endIndent();
+ void writeSynopsis() {}
+ void startClassDiagram();
+ void endClassDiagram(const ClassDiagram &,const char *filename,const char *name);
+ void startPageRef();
+ void endPageRef(const char *,const char *);
+ void startQuickIndices() {}
+ void endQuickIndices() {}
+ void writeSplitBar(const char *) {}
+ void writeLogo() {}
+ void writeQuickLinks(bool,HighlightedItem) {}
+ void startContents() {}
+ void endContents() {}
+ void writeNonBreakableSpace(int);
+
+ void startDescTable();
+ void endDescTable();
+ void startDescTableTitle();
+ void endDescTableTitle();
+ void startDescTableData();
+ void endDescTableData();
+
+ void startDotGraph();
+ void endDotGraph(const DotClassGraph &);
+ void startInclDepGraph();
+ void endInclDepGraph(const DotInclDepGraph &);
+ void startGroupCollaboration();
+ void endGroupCollaboration(const DotGroupCollaboration &g);
+ void startCallGraph();
+ void endCallGraph(const DotCallGraph &);
+ void startDirDepGraph();
+ void endDirDepGraph(const DotDirDeps &g);
+ void writeGraphicalHierarchy(const DotGfxHierarchyTable &) {}
+
+ void startMemberGroupHeader(bool);
+ void endMemberGroupHeader();
+ void startMemberGroupDocs();
+ void endMemberGroupDocs();
+ void startMemberGroup();
+ void endMemberGroup(bool);
+
+ void startTextBlock(bool dense);
+ void endTextBlock(bool);
+ void lastIndexPage();
+
+ void startMemberDocPrefixItem() {}
+ void endMemberDocPrefixItem() {}
+ void startMemberDocName(bool) {}
+ void endMemberDocName() {}
+ void startParameterType(bool,const char *);
+ void endParameterType() {}
+ void startParameterName(bool) {}
+ void endParameterName(bool,bool,bool) {}
+ void startParameterList(bool) {}
+ void endParameterList() {}
+
+ void startConstraintList(const char *);
+ void startConstraintParam();
+ void endConstraintParam();
+ void startConstraintType();
+ void endConstraintType();
+ void startConstraintDocs();
+ void endConstraintDocs();
+ void endConstraintList();
+
+
+ void startFontClass(const char *) {}
+ void endFontClass() {}
+
+ void writeCodeAnchor(const char *) {}
+ void linkableSymbol(int,const char *,Definition *,Definition *) {}
+
+ static bool preProcessFileInplace(const char *path,const char *name);
+
+ private:
+ RTFGenerator(const RTFGenerator &);
+ RTFGenerator &operator=(const RTFGenerator &);
+
+ const char *rtf_BList_DepthStyle();
+ const char *rtf_CList_DepthStyle();
+ const char *rtf_EList_DepthStyle();
+ const char *rtf_LCList_DepthStyle();
+ const char *rtf_DList_DepthStyle();
+ const char *rtf_Code_DepthStyle();
+ void incrementIndentLevel();
+ void decrementIndentLevel();
+ int col;
+
+ bool m_bstartedBody; // has startbody been called yet?
+ int m_listLevel; // // RTF does not really have a addative indent...manually set list level.
+ bool m_omitParagraph; // should a the next paragraph command be ignored?
+ int m_numCols; // number of columns in a table
+ QCString relPath;
+
+ void beginRTFDocument();
+ void beginRTFChapter();
+ void beginRTFSection();
+ void rtfwriteRuler_doubleline();
+ void rtfwriteRuler_emboss();
+ void rtfwriteRuler_thick();
+ void rtfwriteRuler_thin();
+ void writeRTFReference(const char *label);
+ //char *getMultiByte(int c);
+};
+
+#endif
diff --git a/src/rtfstyle.cpp b/src/rtfstyle.cpp
new file mode 100644
index 0000000..fc1a1f0
--- /dev/null
+++ b/src/rtfstyle.cpp
@@ -0,0 +1,518 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "rtfstyle.h"
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <stdlib.h>
+
+#include "message.h"
+
+
+RTFListItemInfo rtf_listItemInfo[rtf_maxIndentLevels];
+
+QCString rtf_title;
+QCString rtf_subject;
+QCString rtf_comments;
+QCString rtf_company;
+QCString rtf_logoFilename;
+QCString rtf_author;
+QCString rtf_manager;
+QCString rtf_documentType;
+QCString rtf_documentId;
+QCString rtf_keywords;
+
+char rtf_Style_Reset[] = "\\pard\\plain ";
+
+Rtf_Style_Default rtf_Style_Default[] =
+{
+ { "Heading1",
+ "\\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid ",
+ "\\sbasedon0 \\snext0 heading 1"
+ },
+ { "Heading2",
+ "\\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid ",
+ "\\sbasedon0 \\snext0 heading 2"
+ },
+ { "Heading3",
+ "\\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid ",
+ "\\sbasedon0 \\snext0 heading 3"
+ },
+ { "Heading4",
+ "\\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext0 heading 4;}{\\*\\cs10 \\additive Default Paragraph Font"
+ },
+ { "Heading5",
+ "\\s5\\sb90\\sa30\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext0 heading 5;}{\\*\\cs10 \\additive Default Paragraph Font"
+ },
+ { "Title",
+ "\\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid ",
+ "\\sbasedon0 \\snext15 Title"
+ },
+ { "SubTitle",
+ "\\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid ",
+ "\\sbasedon0 \\snext16 Subtitle"
+ },
+ { "BodyText",
+ "\\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid ",
+ "\\sbasedon0 \\snext17 BodyText"
+ },
+ { "DenseText",
+ "\\s18\\widctlpar\\fs22\\cgrid ",
+ "\\sbasedon0 \\snext18 DenseText"
+ },
+ { "Header",
+ "\\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext28 header"
+ },
+ { "Footer",
+ "\\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext29 footer"
+ },
+ { "GroupHeader",
+ "\\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext30 GroupHeader"
+ },
+ { "CodeExample0",
+ "\\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext41 Code Example 0"
+ },
+ { "CodeExample1",
+ "\\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext42 Code Example 1"
+ },
+ { "CodeExample2",
+ "\\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext43 Code Example 2"
+ },
+ { "CodeExample3",
+ "\\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext44 Code Example 3"
+ },
+ { "CodeExample4",
+ "\\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext45 Code Example 4"
+ },
+ { "CodeExample5",
+ "\\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext46 Code Example 5"
+ },
+ { "CodeExample6",
+ "\\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext47 Code Example 6"
+ },
+ { "CodeExample7",
+ "\\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext48 Code Example 7"
+ },
+ { "CodeExample8",
+ "\\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext49 Code Example 8"
+ },
+ { "CodeExample9",
+ "\\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
+ "\\sbasedon0 \\snext49 Code Example 9"
+ },
+ { "ListContinue0",
+ "\\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext51 List Continue 0"
+ },
+ { "ListContinue1",
+ "\\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext52 List Continue 1"
+ },
+ { "ListContinue2",
+ "\\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext53 List Continue 2"
+ },
+ { "ListContinue3",
+ "\\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext54 List Continue 3"
+ },
+ { "ListContinue4",
+ "\\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext55 List Continue 4"
+ },
+ { "ListContinue5",
+ "\\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext56 List Continue 5"
+ },
+ { "ListContinue6",
+ "\\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext57 List Continue 6"
+ },
+ { "ListContinue7",
+ "\\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext58 List Continue 7"
+ },
+ { "ListContinue8",
+ "\\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext59 List Continue 8"
+ },
+ { "ListContinue9",
+ "\\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext59 List Continue 9"
+ },
+ { "DescContinue0",
+ "\\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext61 DescContinue 0"
+ },
+ { "DescContinue1",
+ "\\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext62 DescContinue 1"
+ },
+ { "DescContinue2",
+ "\\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext63 DescContinue 2"
+ },
+ { "DescContinue3",
+ "\\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext64 DescContinue 3"
+ },
+ { "DescContinue4",
+ "\\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext65 DescContinue 4"
+ },
+ { "DescContinue5",
+ "\\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext66 DescContinue 5"
+ },
+ { "DescContinue6",
+ "\\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext67 DescContinue 6"
+ },
+ { "DescContinue7",
+ "\\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext68 DescContinue 7"
+ },
+ { "DescContinue8",
+ "\\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext69 DescContinue 8"
+ },
+ { "DescContinue9",
+ "\\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext69 DescContinue 9"
+ },
+ { "LatexTOC0",
+ "\\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext81 LatexTOC 0"
+ },
+ { "LatexTOC1",
+ "\\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext82 LatexTOC 1"
+ },
+ { "LatexTOC2",
+ "\\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext83 LatexTOC 2"
+ },
+ { "LatexTOC3",
+ "\\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext84 LatexTOC 3"
+ },
+ { "LatexTOC4",
+ "\\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext85 LatexTOC 4"
+ },
+ { "LatexTOC5",
+ "\\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext86 LatexTOC 5"
+ },
+ { "LatexTOC6",
+ "\\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext87 LatexTOC 6"
+ },
+ { "LatexTOC7",
+ "\\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext88 LatexTOC 7"
+ },
+ { "LatexTOC8",
+ "\\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext89 LatexTOC 8"
+ },
+ { "LatexTOC9",
+ "\\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext89 LatexTOC 9"
+ },
+ { "ListBullet0",
+ "\\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext81 \\sautoupd List Bullet 0"
+ },
+ { "ListBullet1",
+ "\\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext82 \\sautoupd List Bullet 1"
+ },
+ { "ListBullet2",
+ "\\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext83 \\sautoupd List Bullet 2"
+ },
+ { "ListBullet3",
+ "\\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext84 \\sautoupd List Bullet 3"
+ },
+ { "ListBullet4",
+ "\\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext85 \\sautoupd List Bullet 4"
+ },
+ { "ListBullet5",
+ "\\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext86 \\sautoupd List Bullet 5"
+ },
+ { "ListBullet6",
+ "\\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext87 \\sautoupd List Bullet 6"
+ },
+ { "ListBullet7",
+ "\\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext88 \\sautoupd List Bullet 7"
+ },
+ { "ListBullet8",
+ "\\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext89 \\sautoupd List Bullet 8"
+ },
+ { "ListBullet9",
+ "\\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid ",
+ "\\sbasedon0 \\snext89 \\sautoupd List Bullet 9"
+ },
+ { "ListEnum0",
+ "\\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext91 \\sautoupd List Enum 0"
+ },
+ { "ListEnum1",
+ "\\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext92 \\sautoupd List Enum 1"
+ },
+ { "ListEnum2",
+ "\\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext93 \\sautoupd List Enum 2"
+ },
+ { "ListEnum3",
+ "\\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext94 \\sautoupd List Enum 3"
+ },
+ { "ListEnum4",
+ "\\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext95 \\sautoupd List Enum 4"
+ },
+ { "ListEnum5",
+ "\\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
+ },
+ { "ListEnum6",
+ "\\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
+ },
+ { "ListEnum7",
+ "\\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext98 \\sautoupd List Enum 7"
+ },
+ { "ListEnum8",
+ "\\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext99 \\sautoupd List Enum 8"
+ },
+ { "ListEnum9",
+ "\\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid ",
+ "\\sbasedon0 \\snext99 \\sautoupd List Enum 9"
+ },
+ { 0,
+ 0,
+ 0
+ }
+};
+
+const QRegExp StyleData::s_clause("\\\\s[0-9]+\\s*");
+
+StyleData::StyleData(const char* reference, const char* definition)
+{
+ int start = s_clause.match(reference); ASSERT(start >= 0);
+ reference += start;
+ index = (int)atol(reference + 2); ASSERT(index > 0);
+
+ ASSERT(reference != 0);
+ size_t size = 1 + strlen(reference);
+ memcpy(this->reference = new char[size], reference, size);
+
+ ASSERT(definition != 0);
+ size = 1 + strlen(definition);
+ memcpy(this->definition = new char[size], definition, size);
+}
+
+StyleData::~StyleData()
+{
+ delete[] reference;
+ delete[] definition;
+}
+
+bool StyleData::setStyle(const char* s, const char* styleName)
+{
+ static const QRegExp subgroup("^{[^}]*}\\s*");
+ static const QRegExp any_clause("^\\\\[a-z][a-z0-9-]*\\s*");
+
+ int len = 0; // length of a particular RTF formatting control
+ int ref_len = 0; // length of the whole formatting section of a style
+ int start = s_clause.match(s, 0, &len);
+ if (start < 0)
+ {
+ err("Style sheet '%s' contains no '\\s' clause.\n{%s}\n", styleName, s);
+ return FALSE;
+ }
+ s += start;
+ index = (int)atol(s + 2); ASSERT(index > 0);
+
+ // search for the end of pure formatting codes
+ const char* end = s + len;
+ ref_len = len;
+ bool haveNewDefinition = TRUE;
+ for(;;)
+ {
+ if (*end == '{')
+ {
+ // subgroups are used for \\additive
+ if (0 != subgroup.match(end, 0, &len))
+ break;
+ else
+ {
+ end += len;
+ ref_len += len;
+ }
+ }
+ else if (*end == '\\')
+ {
+ if (0 == strncmp(end, "\\snext", 6))
+ break;
+ if (0 == strncmp(end, "\\sbasedon", 9))
+ break;
+ if (0 != any_clause.match(end, 0, &len))
+ break;
+ end += len;
+ ref_len += len;
+ }
+ else if (*end == 0)
+ { // no style-definition part, keep default value
+ haveNewDefinition = FALSE;
+ break;
+ }
+ else // plain name without leading \\snext
+ break;
+ }
+ delete[] reference;
+ reference = new char[ref_len + 1];
+ memcpy(reference, s, ref_len);
+ reference[ref_len] = 0;
+ if (haveNewDefinition)
+ {
+ delete[] definition;
+ size_t size = 1 + strlen(end);
+ definition = new char[size];
+ memcpy(definition, end, size);
+ }
+ return TRUE;
+}
+
+void loadStylesheet(const char *name, QDict<StyleData>& dict)
+{
+ QFile file(name);
+ if (!file.open(IO_ReadOnly))
+ {
+ err("Can't open RTF style sheet file %s. Using defaults.\n",name);
+ return;
+ }
+ msg("Loading RTF style sheet %s...\n",name);
+
+ static const QRegExp separator("[ \t]*=[ \t]*");
+ uint lineNr=1;
+ QTextStream t(&file);
+ t.setEncoding(QTextStream::UnicodeUTF8);
+
+ while (!t.eof())
+ {
+ QCString s(4096); // string buffer of max line length
+ s = t.readLine().stripWhiteSpace();
+ if (s.isEmpty() || s.at(0)=='#') continue; // skip blanks & comments
+ int sepLength;
+ int sepStart = separator.match(s,0,&sepLength);
+ if (sepStart<=0) // no valid assignment statement
+ {
+ warn(name,lineNr,"Assignment of style sheet name expected!\n");
+ continue;
+ }
+ QCString key=s.left(sepStart);
+ if (dict[key]==0) // not a valid style sheet name
+ {
+ warn(name,lineNr,"Invalid style sheet name %s ignored.\n",key.data());
+ continue;
+ }
+ StyleData* styleData = dict.find(key);
+ if (styleData == 0)
+ {
+ warn(name,lineNr,"Unknown style sheet name %s ignored.\n",key.data());
+ continue;
+ }
+ s+=" "; // add command separator
+ styleData->setStyle(s.data() + sepStart + sepLength, key.data());
+ lineNr++;
+ }
+}
+
+QDict<StyleData> rtf_Style(257);
+
+void loadExtensions(const char *name)
+{
+ QFile file(name);
+ if (!file.open(IO_ReadOnly))
+ {
+ err("Can't open RTF extensions file %s. Using defaults.\n",name);
+ return;
+ }
+ msg("Loading RTF extensions %s...\n",name);
+
+ static const QRegExp separator("[ \t]*=[ \t]*");
+ uint lineNr=1;
+ QTextStream t(&file);
+ t.setEncoding(QTextStream::UnicodeUTF8);
+
+ while (!t.eof())
+ {
+ QCString s(4096); // string buffer of max line length
+ s = t.readLine().stripWhiteSpace();
+ if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments
+ int sepLength;
+ int sepStart = separator.match(s,0,&sepLength);
+ if (sepStart<=0) // no valid assignment statement
+ {
+ warn(name,lineNr,"Assignment of extension field expected!\n");
+ continue;
+ }
+ QCString key=s.left(sepStart);
+ QCString data=s.data() + sepStart + sepLength;
+
+ if (key == "Title") rtf_title = data.data();
+ if (key == "Subject") rtf_subject = data.data();
+ if (key == "Comments") rtf_comments = data.data();
+ if (key == "Company") rtf_company = data.data();
+ if (key == "LogoFilename") rtf_logoFilename = data.data();
+ if (key == "Author") rtf_author = data.data();
+ if (key == "Manager") rtf_manager = data.data();
+ if (key == "DocumentType") rtf_documentType = data.data();
+ if (key == "DocumentId") rtf_documentId = data.data();
+ if (key == "Keywords") rtf_keywords = data.data();
+ lineNr++;
+ }
+}
+
diff --git a/src/rtfstyle.h b/src/rtfstyle.h
new file mode 100644
index 0000000..60e3a90
--- /dev/null
+++ b/src/rtfstyle.h
@@ -0,0 +1,83 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef RTFSTYLE_H
+#define RTFSTYLE_H
+
+#include "qtbc.h"
+#include <qregexp.h>
+#include <qdict.h>
+
+// used for table column width calculation
+const int rtf_pageWidth = 8748;
+
+extern QCString rtf_title;
+extern QCString rtf_subject;
+extern QCString rtf_comments;
+extern QCString rtf_company;
+extern QCString rtf_logoFilename;
+extern QCString rtf_author;
+extern QCString rtf_manager;
+extern QCString rtf_documentType;
+extern QCString rtf_documentId;
+extern QCString rtf_keywords;
+
+struct RTFListItemInfo
+{
+ bool isEnum;
+ int number;
+};
+
+const int rtf_maxIndentLevels = 10;
+
+extern RTFListItemInfo rtf_listItemInfo[rtf_maxIndentLevels];
+
+struct Rtf_Style_Default
+{
+ const char *name;
+ const char *reference;
+ const char *definition;
+};
+
+extern char rtf_Style_Reset[];
+extern Rtf_Style_Default rtf_Style_Default[];
+
+struct StyleData
+{
+ // elements of this type are stored in dictionary Rtf_Style
+ //
+ // to define a tag in the header reference + definition is required
+ // to use a tag in the body of the document only reference is required
+
+ unsigned index; // index in style-sheet, i.e. number in s-clause
+ char* reference; // everything required to apply the style
+ char* definition; // aditional tags like \snext and style name
+
+ StyleData(const char* reference, const char* definition);
+ ~StyleData();
+ bool setStyle(const char* s, const char* styleName);
+
+ static const QRegExp s_clause;
+};
+
+extern QDict<StyleData> rtf_Style;
+
+void loadExtensions(const char *name);
+void loadStylesheet(const char *name, QDict<StyleData>& dict);
+
+#endif
diff --git a/src/scanner.cpp b/src/scanner.cpp
new file mode 100644
index 0000000..793de91
--- /dev/null
+++ b/src/scanner.cpp
@@ -0,0 +1,18858 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer scanYY_create_buffer
+#define yy_delete_buffer scanYY_delete_buffer
+#define yy_flex_debug scanYY_flex_debug
+#define yy_init_buffer scanYY_init_buffer
+#define yy_flush_buffer scanYY_flush_buffer
+#define yy_load_buffer_state scanYY_load_buffer_state
+#define yy_switch_to_buffer scanYY_switch_to_buffer
+#define yyin scanYYin
+#define yyleng scanYYleng
+#define yylex scanYYlex
+#define yylineno scanYYlineno
+#define yyout scanYYout
+#define yyrestart scanYYrestart
+#define yytext scanYYtext
+#define yywrap scanYYwrap
+#define yyalloc scanYYalloc
+#define yyrealloc scanYYrealloc
+#define yyfree scanYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE scanYYrestart(scanYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t scanYYleng;
+
+extern FILE *scanYYin, *scanYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up scanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up scanYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via scanYYrestart()), so that the user can continue scanning by
+ * just pointing scanYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when scanYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t scanYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow scanYYwrap()'s to do buffer switches
+ * instead of setting up a fresh scanYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void scanYYrestart (FILE *input_file );
+void scanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE scanYY_create_buffer (FILE *file,int size );
+void scanYY_delete_buffer (YY_BUFFER_STATE b );
+void scanYY_flush_buffer (YY_BUFFER_STATE b );
+void scanYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void scanYYpop_buffer_state (void );
+
+static void scanYYensure_buffer_stack (void );
+static void scanYY_load_buffer_state (void );
+static void scanYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER scanYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE scanYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE scanYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE scanYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *scanYYalloc (yy_size_t );
+void *scanYYrealloc (void *,yy_size_t );
+void scanYYfree (void * );
+
+#define yy_new_buffer scanYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ scanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ scanYY_create_buffer(scanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ scanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ scanYY_create_buffer(scanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define scanYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *scanYYin = (FILE *) 0, *scanYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int scanYYlineno;
+
+int scanYYlineno = 1;
+
+extern char *scanYYtext;
+#define yytext_ptr scanYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up scanYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ scanYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 630
+#define YY_END_OF_BUFFER 631
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[4339] =
+ { 0,
+ 39, 39, 317, 317, 317, 317, 317, 317, 314, 314,
+ 51, 51, 57, 57, 373, 373, 373, 373, 631, 625,
+ 630, 620, 630, 621, 624, 625, 630, 622, 625, 630,
+ 623, 625, 630, 625, 630, 625, 630, 196, 625, 630,
+ 202, 625, 630, 202, 625, 630, 197, 620, 630, 201,
+ 202, 621, 624, 625, 630, 202, 622, 625, 630, 202,
+ 623, 625, 630, 202, 625, 630, 202, 625, 630, 625,
+ 630, 620, 630, 625, 630, 625, 630, 625, 630, 625,
+ 630, 480, 625, 630, 481, 625, 630, 491, 492, 625,
+ 630,16874, 518, 625, 630, 625, 630, 625, 630, 620,
+
+ 630, 625, 630, 625, 630, 625, 630, 512, 625, 630,
+ 497, 625, 630, 517, 625, 630, 494, 625, 630, 625,
+ 630, 511, 625, 630, 530, 625, 630, 625, 630, 496,
+ 625, 630, 496, 625, 630, 496, 625, 630, 508, 625,
+ 630, 507, 620, 630, 508, 621, 624, 625, 630, 500,
+ 508, 622, 625, 630, 508, 625, 630, 508, 623, 625,
+ 630, 508, 625, 630, 503, 508, 625, 630, 502, 508,
+ 625, 630, 504, 508, 625, 630, 508, 625, 630, 506,
+ 508, 625, 630, 506, 508, 625, 630, 501, 508, 625,
+ 630, 625, 630, 625, 630, 510, 625, 630, 509, 625,
+
+ 630, 487, 625, 630, 487, 621, 624, 625, 630, 487,
+ 622, 625, 630, 487, 623, 625, 630, 149, 487, 625,
+ 630, 150, 487, 625, 630, 487, 625, 630, 486, 487,
+ 625, 630, 485, 487, 625, 630, 40, 625, 630, 39,
+ 40, 625, 630, 38, 620, 630, 40, 621, 624, 625,
+ 630, 40, 622, 625, 630, 40, 625, 630, 40, 623,
+ 625, 630, 40, 625, 630, 37, 40, 625, 630, 34,
+ 40, 625, 630, 35, 40, 625, 630, 36, 40, 625,
+ 630, 42, 625, 630, 42, 621, 624, 625, 630, 42,
+ 622, 625, 630, 42, 623, 625, 630, 42, 625, 630,
+
+ 41, 42, 625, 630, 424, 625, 630, 423, 620, 630,
+ 424, 621, 624, 625, 630, 424, 622, 625, 630, 424,
+ 625, 630, 424, 623, 625, 630, 424, 625, 630, 421,
+ 424, 625, 630, 422, 424, 625, 630, 625, 630, 620,
+ 630, 625, 630, 625, 630, 547, 625, 630, 625, 630,
+ 531, 625, 630, 547, 625, 630, 525, 526, 527, 625,
+ 630, 625, 630, 548, 625, 630, 524, 625, 630, 523,
+ 524, 625, 630, 523, 620, 630, 524, 621, 624, 625,
+ 630, 524, 622, 625, 630, 524, 623, 625, 630, 524,
+ 625, 630, 524, 625, 630, 524, 625, 630, 9, 621,
+
+ 624, 625, 630, 7, 623, 625, 630, 2, 625, 630,
+ 10, 625, 630, 10, 625, 630, 1, 625, 630, 281,
+ 625, 630, 281, 621, 624, 625, 630, 281, 622, 625,
+ 630, 281, 623, 625, 630, 11, 281, 625, 630, 281,
+ 625, 630, 11, 281, 625, 630, 61, 625, 630, 61,
+ 620, 630, 61, 625, 630, 625, 630, 186, 622, 625,
+ 630, 625, 630, 204, 625, 630, 205, 625, 630, 369,
+ 625, 630, 47, 625, 630, 282, 625, 630, 172, 625,
+ 630, 625, 630, 625, 630, 280, 625, 630, 282, 625,
+ 630, 304, 625, 630, 211, 625, 630, 625, 630, 625,
+
+ 630, 169, 625, 630, 169, 625, 630, 283, 625, 630,
+ 204, 625, 630, 169, 625, 630, 169, 625, 630, 169,
+ 625, 630, 169, 625, 630, 169, 625, 630, 169, 625,
+ 630, 169, 625, 630, 169, 625, 630, 169, 625, 630,
+ 169, 625, 630, 169, 625, 630, 169, 625, 630, 169,
+ 625, 630, 169, 625, 630, 169, 625, 630, 169, 625,
+ 630, 169, 625, 630, 169, 625, 630, 566, 625, 630,
+ 15, 17, 625, 630, 16, 620, 630, 15, 17, 621,
+ 624, 625, 630, 15, 17, 622, 625, 630, 15, 17,
+ 623, 625, 630, 15, 17, 625, 630, 17, 625, 630,
+
+ 625, 630, 620, 630, 625, 630, 625, 630, 625, 630,
+ 169, 625, 630, 625, 630, 620, 630, 625, 630, 186,
+ 622, 625, 630, 625, 630, 310, 625, 630, 315, 625,
+ 630, 625, 630, 312, 625, 630, 311, 625, 630, 309,
+ 625, 630, 316, 625, 630, 625, 630, 419, 622, 625,
+ 630, 450, 625, 630, 452, 625, 630, 451, 625, 630,
+ 452, 625, 630, 437, 625, 630, 418, 437, 625, 630,
+ 418, 620, 630, 437, 621, 624, 625, 630, 419, 437,
+ 622, 625, 630, 437, 623, 625, 630, 407, 437, 625,
+ 630, 408, 437, 625, 630, 417, 437, 625, 630, 437,
+
+ 625, 630, 445, 625, 630, 445, 621, 624, 625, 630,
+ 445, 622, 625, 630, 445, 623, 625, 630, 443, 445,
+ 625, 630, 444, 445, 625, 630, 445, 625, 630, 449,
+ 625, 630, 448, 620, 630, 449, 621, 624, 625, 630,
+ 449, 622, 625, 630, 449, 623, 625, 630, 449, 625,
+ 630, 447, 449, 625, 630, 446, 449, 625, 630, 418,
+ 437, 625, 630, 418, 620, 630, 437, 625, 630, 409,
+ 437, 625, 630, 437, 625, 630, 420, 437, 625, 630,
+ 432, 437, 625, 630, 432, 437, 625, 630, 432, 437,
+ 625, 630, 432, 437, 625, 630, 432, 437, 625, 630,
+
+ 432, 437, 625, 630, 432, 437, 625, 630, 432, 437,
+ 625, 630, 432, 437, 625, 630, 120, 625, 630, 120,
+ 620, 630, 120, 621, 624, 625, 630, 120, 622, 625,
+ 630, 120, 623, 625, 630, 122, 625, 630, 120, 625,
+ 630, 119, 120, 625, 630, 120, 625, 630, 299, 625,
+ 630, 299, 621, 624, 625, 630, 299, 622, 625, 630,
+ 299, 623, 625, 630, 299, 625, 630, 298, 299, 625,
+ 630, 296, 299, 625, 630, 317, 341, 625, 630, 317,
+ 339, 341, 625, 630, 339, 620, 630, 339, 341, 625,
+ 630, 321, 341, 621, 624, 625, 630, 319, 341, 622,
+
+ 625, 630, 324, 341, 623, 625, 630, 341, 625, 630,
+ 341, 625, 630, 326, 341, 625, 630, 328, 341, 625,
+ 630, 328, 341, 625, 630, 341, 625, 630, 327, 341,
+ 625, 630, 625, 630, 138, 625, 630, 136, 625, 630,
+ 136, 625, 630, 625, 630, 620, 630, 625, 630, 625,
+ 630, 625, 630, 137, 625, 630, 462, 473, 625, 630,
+ 462, 473, 625, 630, 461, 620, 630, 459, 473, 621,
+ 624, 625, 630, 469, 473, 622, 625, 630, 472, 473,
+ 623, 625, 630, 473, 625, 630, 473, 625, 630, 473,
+ 625, 630, 454, 473, 625, 630, 455, 473, 625, 630,
+
+ 462, 473, 625, 630, 460, 469, 473, 622, 625, 630,
+ 463, 620, 630, 473, 621, 624, 625, 630, 473, 625,
+ 630, 473, 625, 630, 458, 625, 630, 479, 625, 630,
+ 478, 620, 630, 475, 479, 621, 624, 625, 630, 479,
+ 622, 625, 630, 479, 623, 625, 630, 479, 625, 630,
+ 479, 625, 630, 479, 625, 630, 479, 621, 624, 625,
+ 630, 476, 479, 623, 625, 630, 467, 473, 621, 624,
+ 625, 630, 469, 473, 622, 625, 630, 473, 625, 630,
+ 468, 473, 625, 630, 453, 473, 625, 630, 192, 625,
+ 630, 194, 620, 630, 192, 625, 630, 192, 621, 624,
+
+ 625, 630, 192, 622, 625, 630, 192, 623, 625, 630,
+ 192, 625, 630, 192, 625, 630, 619, 625, 630, 619,
+ 625, 630, 619, 621, 624, 625, 630, 619, 622, 625,
+ 630, 619, 623, 625, 630, 625, 630, 619, 625, 630,
+ 625, 630, 618, 620, 630, 621, 624, 625, 630, 622,
+ 625, 630, 623, 625, 630, 625, 630, 625, 630, 5,
+ 625, 630, 6, 625, 630, 3, 625, 630, 4, 625,
+ 630, 308, 625, 630, 307, 308, 625, 630, 307, 620,
+ 630, 308, 621, 624, 625, 630, 308, 622, 625, 630,
+ 308, 623, 625, 630, 308, 625, 630, 306, 308, 625,
+
+ 630, 305, 308, 625, 630, 542, 625, 630, 543, 625,
+ 630, 546, 621, 624, 625, 630, 544, 625, 630, 545,
+ 625, 630, 303, 625, 630, 302, 621, 624, 625, 630,
+ 303, 622, 625, 630, 303, 623, 625, 630, 303, 625,
+ 630, 300, 625, 630, 301, 625, 630, 314, 625, 630,
+ 313, 620, 630, 314, 621, 624, 625, 630, 314, 622,
+ 625, 630, 314, 623, 625, 630, 314, 625, 630, 625,
+ 630, 332, 625, 630, 331, 625, 630, 331, 625, 630,
+ 331, 625, 630, 181, 625, 630, 179, 620, 630, 181,
+ 621, 624, 625, 630, 181, 622, 625, 630, 181, 623,
+
+ 625, 630, 181, 625, 630, 180, 181, 625, 630, 184,
+ 625, 630, 184, 625, 630, 183, 620, 630, 184, 621,
+ 624, 625, 630, 184, 622, 625, 630, 184, 623, 625,
+ 630, 184, 625, 630, 184, 625, 630, 558, 560, 625,
+ 630, 553, 560, 625, 630, 553, 620, 630, 558, 560,
+ 621, 624, 625, 630, 558, 560, 622, 625, 630, 558,
+ 560, 623, 625, 630, 560, 625, 630, 560, 625, 630,
+ 560, 625, 630, 558, 560, 625, 630, 625, 630, 75,
+ 625, 630, 74, 625, 630, 625, 630, 625, 630, 625,
+ 630, 128, 625, 630, 625, 630, 620, 630, 625, 630,
+
+ 131, 625, 630, 130, 625, 630, 574, 625, 630, 575,
+ 620, 630, 574, 621, 624, 625, 630, 574, 622, 625,
+ 630, 574, 623, 625, 630, 574, 625, 630, 574, 625,
+ 630, 574, 625, 630, 574, 625, 630, 574, 625, 630,
+ 567, 574, 625, 630, 568, 574, 625, 630, 483, 625,
+ 630, 190, 625, 630, 191, 620, 630, 190, 621, 624,
+ 625, 630, 190, 622, 625, 630, 190, 623, 625, 630,
+ 190, 625, 630, 625, 630, 625, 630, 199, 625, 630,
+ 199, 621, 624, 625, 630, 199, 622, 625, 630, 199,
+ 623, 625, 630, 199, 625, 630, 198, 199, 625, 630,
+
+ 436, 625, 630, 436, 625, 630, 436, 621, 624, 625,
+ 630, 436, 622, 625, 630, 436, 625, 630, 436, 623,
+ 625, 630, 433, 436, 625, 630, 436, 625, 630, 433,
+ 436, 625, 630, 434, 436, 625, 630, 435, 436, 625,
+ 630, 225, 229, 625, 630, 228, 620, 630, 227, 229,
+ 621, 624, 625, 630, 225, 229, 622, 625, 630, 225,
+ 229, 623, 625, 630, 225, 229, 625, 630, 625, 630,
+ 48, 625, 630, 50, 625, 630, 59, 625, 630, 49,
+ 625, 630, 60, 625, 630, 51, 625, 630, 51, 620,
+ 630, 51, 621, 624, 625, 630, 51, 622, 625, 630,
+
+ 51, 623, 625, 630, 52, 625, 630, 51, 625, 630,
+ 625, 630, 56, 625, 630, 625, 630, 53, 625, 630,
+ 54, 625, 630, 57, 625, 630, 57, 620, 630, 57,
+ 621, 624, 625, 630, 57, 622, 625, 630, 57, 623,
+ 625, 630, 58, 625, 630, 57, 625, 630, 484, 625,
+ 630, 71, 625, 630, 625, 630, 625, 630, 625, 630,
+ 625, 630, 625, 630, 625, 630, 73, 625, 630, 158,
+ 625, 630, 625, 630, 155, 625, 630, 159, 625, 630,
+ 159, 625, 630, 159, 625, 630, 625, 630, 160, 625,
+ 630, 156, 625, 630, 625, 630, 625, 630, 625, 630,
+
+ 625, 630, 625, 630, 166, 625, 630, 625, 630, 167,
+ 625, 630, 231, 625, 630, 231, 625, 630, 223, 620,
+ 630, 215, 231, 621, 624, 625, 630, 231, 622, 625,
+ 630, 221, 231, 623, 625, 630, 212, 219, 231, 625,
+ 630, 220, 231, 625, 630, 214, 231, 625, 630, 231,
+ 625, 630, 231, 625, 630, 214, 231, 625, 630, 219,
+ 231, 625, 630, 220, 231, 625, 630, 231, 625, 630,
+ 231, 625, 630, 219, 231, 625, 630, 213, 219, 231,
+ 625, 630, 625, 630, 620, 630, 625, 630, 625, 630,
+ 625, 630, 185, 625, 630, 625, 630, 620, 630, 625,
+
+ 630, 625, 630, 334, 625, 630, 335, 625, 630, 625,
+ 630, 335, 625, 630, 336, 625, 630, 333, 625, 630,
+ 337, 625, 630, 338, 625, 630, 151, 625, 630, 151,
+ 621, 624, 625, 630, 151, 622, 625, 630, 151, 623,
+ 625, 630, 149, 151, 625, 630, 150, 151, 625, 630,
+ 151, 625, 630, 143, 151, 625, 630, 145, 151, 625,
+ 630,16531, 345, 625, 630, 345, 625, 630, 620, 630,
+ 345, 625, 630, 345, 621, 624, 625, 630, 345, 622,
+ 625, 630, 345, 625, 630, 345, 623, 625, 630, 345,
+ 625, 630, 345, 625, 630, 344, 345, 625, 630, 349,
+
+ 625, 630, 347, 620, 630, 349, 621, 624, 625, 630,
+ 349, 622, 625, 630, 349, 623, 625, 630, 348, 349,
+ 625, 630, 349, 625, 630, 353, 625, 630, 355, 625,
+ 630, 625, 630, 370, 406, 625, 630, 373, 406, 625,
+ 630, 373, 405, 620, 630, 374, 406, 621, 624, 625,
+ 630, 406, 622, 625, 630, 404, 406, 623, 625, 630,
+ 375, 406, 625, 630, 376, 406, 625, 630, 406, 625,
+ 630, 406, 625, 630, 394, 406, 625, 630, 395, 406,
+ 625, 630, 178, 625, 630, 177, 620, 630, 178, 621,
+ 624, 625, 630, 178, 622, 625, 630, 178, 623, 625,
+
+ 630, 178, 625, 630, 176, 178, 625, 630, 625, 630,
+ 125, 625, 630, 625, 630, 127, 625, 630, 126, 625,
+ 630, 237, 625, 630, 236, 620, 630, 233, 237, 621,
+ 624, 625, 630, 237, 622, 625, 630, 237, 623, 625,
+ 630, 237, 625, 630, 237, 625, 630, 237, 625, 630,
+ 237, 621, 624, 625, 630, 234, 237, 623, 625, 630,
+ 243, 625, 630, 242, 620, 630, 239, 243, 621, 624,
+ 625, 630, 243, 622, 625, 630, 243, 623, 625, 630,
+ 243, 625, 630, 243, 625, 630, 243, 625, 630, 243,
+ 621, 624, 625, 630, 240, 243, 623, 625, 630, 250,
+
+ 251, 625, 630, 247, 620, 630, 244, 251, 621, 624,
+ 625, 630, 250, 251, 622, 625, 630, 248, 251, 623,
+ 625, 630, 245, 251, 625, 630, 246, 251, 625, 630,
+ 250, 251, 625, 630, 265, 268, 625, 630, 267, 620,
+ 630, 260, 268, 621, 624, 625, 630, 265, 268, 622,
+ 625, 630, 261, 268, 623, 625, 630, 266, 268, 625,
+ 630, 262, 268, 625, 630, 263, 268, 625, 630, 258,
+ 259, 625, 630, 255, 620, 630, 252, 259, 621, 624,
+ 625, 630, 258, 259, 622, 625, 630, 256, 259, 623,
+ 625, 630, 253, 259, 625, 630, 254, 259, 625, 630,
+
+ 259, 625, 630, 276, 279, 625, 630, 278, 620, 630,
+ 271, 279, 621, 624, 625, 630, 276, 279, 622, 625,
+ 630, 272, 279, 623, 625, 630, 277, 279, 625, 630,
+ 273, 279, 625, 630, 274, 279, 625, 630, 276, 279,
+ 622, 625, 630, 552, 625, 630, 552, 625, 630, 551,
+ 620, 630, 552, 621, 624, 625, 630, 552, 622, 625,
+ 630, 552, 623, 625, 630, 549, 552, 625, 630, 550,
+ 552, 625, 630, 552, 625, 630, 541, 625, 630, 534,
+ 541, 625, 630, 534, 620, 630, 541, 621, 624, 625,
+ 630, 541, 622, 625, 630, 541, 623, 625, 630, 539,
+
+ 541, 625, 630, 540, 541, 625, 630, 541, 625, 630,
+ 532, 541, 625, 630, 533, 541, 625, 630, 541, 625,
+ 630, 430, 625, 630, 431, 620, 630, 426, 430, 621,
+ 624, 625, 630, 430, 622, 625, 630, 430, 625, 630,
+ 427, 430, 623, 625, 630, 430, 625, 630, 425, 430,
+ 625, 630, 429, 430, 625, 630, 356, 437, 625, 630,
+ 357, 437, 625, 630, 361, 625, 630, 361, 621, 624,
+ 625, 630, 361, 622, 625, 630, 361, 623, 625, 630,
+ 361, 625, 630, 361, 625, 630, 366, 625, 630, 365,
+ 366, 625, 630, 365, 620, 630, 366, 621, 624, 625,
+
+ 630, 366, 622, 625, 630, 366, 623, 625, 630, 362,
+ 366, 625, 630, 363, 366, 625, 630, 364, 366, 625,
+ 630, 366, 625, 630, 297, 299, 625, 630, 371, 406,
+ 625, 630, 405, 620, 630, 401, 406, 621, 624, 625,
+ 630, 371, 406, 622, 625, 630, 406, 623, 625, 630,
+ 371, 406, 625, 630, 406, 625, 630, 406, 621, 624,
+ 625, 630, 402, 406, 623, 625, 630, 372, 406, 625,
+ 630, 372, 406, 622, 625, 630, 396, 406, 625, 630,
+ 397, 406, 625, 630, 406, 625, 630, 398, 406, 625,
+ 630, 399, 406, 625, 630, 383, 392, 625, 630, 391,
+
+ 620, 630, 383, 392, 621, 624, 625, 630, 383, 392,
+ 622, 625, 630, 383, 392, 623, 625, 630, 392, 625,
+ 630, 383, 392, 625, 630, 392, 625, 630, 383, 392,
+ 625, 630, 392, 625, 630,16766, 389, 390, 625, 630,
+ 385, 620, 630, 389, 390, 621, 624, 625, 630, 389,
+ 390, 622, 625, 630, 389, 390, 623, 625, 630, 389,
+ 390, 625, 630, 390, 625, 630, 392, 625, 630, 392,
+ 621, 624, 625, 630, 392, 622, 625, 630, 392, 623,
+ 625, 630, 392, 625, 630, 392, 625, 630, 287, 625,
+ 630, 287, 621, 624, 625, 630, 287, 622, 625, 630,
+
+ 287, 623, 625, 630, 287, 625, 630, 284, 287, 625,
+ 630, 287, 625, 630, 295, 625, 630, 295, 625, 630,
+ 620, 630, 295, 621, 624, 625, 630, 295, 622, 625,
+ 630, 295, 625, 630, 295, 623, 625, 630, 295, 625,
+ 630, 294, 295, 625, 630, 291, 295, 625, 630, 295,
+ 625, 630, 625, 630, 620, 630, 625, 630, 288, 625,
+ 630, 615, 625, 630, 615, 621, 624, 625, 630, 615,
+ 622, 625, 630, 615, 623, 625, 630, 601, 615, 625,
+ 630, 615, 625, 630, 615, 625, 630, 606, 625, 630,
+ 606, 625, 630, 620, 630, 606, 625, 630, 606, 621,
+
+ 624, 625, 630, 606, 622, 625, 630, 606, 625, 630,
+ 606, 623, 625, 630, 604, 606, 625, 630, 605, 606,
+ 625, 630, 606, 625, 630, 606, 625, 630, 603, 606,
+ 625, 630, 614, 625, 630, 614, 625, 630, 614, 621,
+ 624, 625, 630, 614, 622, 625, 630, 614, 623, 625,
+ 630, 614, 625, 630, 614, 625, 630, 614, 625, 630,
+ 614, 625, 630, 614, 625, 630, 607, 614, 625, 630,
+ 613, 625, 630, 613, 621, 624, 625, 630, 613, 622,
+ 625, 630, 613, 623, 625, 630, 612, 613, 625, 630,
+ 613, 625, 630, 616, 625, 630, 616, 621, 624, 625,
+
+ 630, 616, 622, 625, 630, 616, 623, 625, 630, 616,
+ 625, 630, 625, 630, 577, 620, 630, 621, 624, 625,
+ 630, 622, 625, 630, 623, 625, 630, 625, 630, 588,
+ 590, 625, 630, 588, 590, 625, 630, 589, 620, 630,
+ 588, 590, 621, 624, 625, 630, 588, 590, 622, 625,
+ 630, 588, 590, 623, 625, 630, 590, 625, 630, 590,
+ 625, 630, 588, 590, 625, 630, 590, 625, 630, 590,
+ 625, 630, 588, 590, 625, 630, 590, 625, 630, 590,
+ 625, 630, 596, 599, 625, 630, 598, 620, 630, 596,
+ 599, 621, 624, 625, 630, 596, 599, 622, 625, 630,
+
+ 599, 625, 630, 596, 599, 623, 625, 630, 599, 625,
+ 630, 599, 625, 630, 599, 625, 630, 599, 625, 630,
+ 596, 599, 625, 630, 599, 625, 630,16979, 627, 629,
+ 196, 195, 196, 627, 629, 200, 518, 491,16874, 491,
+ 492,16874, 492, 489, 8682, 491, 492,16874, 488, 482,
+ 518, 491, 492,16874, 528, 528, 528, 496, 517, 627,
+ 629, 493, 496, 496, 496, 504, 627, 629, 504, 506,
+ 506, 506, 170, 509, 509, 142, 144, 39, 34, 34,
+ 421, 421, 526, 527, 526, 527, 548, 528, 528, 526,
+ 527, 528, 526, 527, 528, 525, 526, 527, 547, 525,
+
+ 526, 527, 525, 548, 61, 61, 186, 169, 169, 20,
+ 21, 205, 343, 47, 627, 629, 171, 173, 18, 72,
+ 72, 72, 72, 72, 72, 169, 140, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 15,
+ 15, 627, 15, 629, 13, 169, 169, 169, 141, 186,
+ 309, 627, 629, 309, 418, 417, 417, 418, 432, 627,
+ 629, 416, 432, 432, 432, 432, 432, 432, 432, 432,
+ 432, 432, 121, 317, 317, 339, 339, 319, 319, 322,
+
+ 627, 318, 629, 320, 136, 136, 136, 136, 137, 137,
+ 137, 462, 462, 465, 627, 466, 629, 470, 462, 460,
+ 465, 627, 466, 629, 464, 477, 477, 627, 477, 629,
+ 474, 466, 629, 194, 194, 193, 619, 619, 628, 626,
+ 627, 619, 626, 629, 618, 627, 629, 617, 618, 307,
+ 303, 303, 627, 303, 629, 314, 314, 627, 314, 629,
+ 331, 331, 331, 331, 558, 553, 559, 554, 627, 555,
+ 629, 558, 558, 558, 74, 74, 128, 128, 130, 130,
+ 189, 434, 627, 629, 434, 225, 226, 225, 627, 225,
+ 629, 49, 50, 49, 51, 51, 627, 51, 629, 54,
+
+ 54, 54, 53, 57, 58, 57, 627, 57, 629, 158,
+ 159, 159, 159, 159, 160, 160, 166, 166, 167, 167,
+ 216, 627, 629, 217, 218, 230, 224, 368, 174, 333,
+ 333, 333,16531, 146, 344, 344, 344, 351, 350, 352,
+ 354, 370, 373, 379, 627, 380, 629, 175, 125, 125,
+ 126, 126, 235, 235, 627, 235, 629, 232, 241, 241,
+ 627, 241, 629, 238, 250, 250, 627, 250, 629, 265,
+ 258, 276, 276, 549, 534, 535, 537, 429, 429, 358,
+ 359, 360, 365, 364, 364, 371, 371, 627, 371, 629,
+ 400, 372, 383, 384, 383, 629, 383,16766, 8574, 389,
+
+ 389, 627, 389, 629, 291, 293, 292, 291, 290, 288,
+ 288, 288, 289, 288, 602, 603, 603, 603, 610, 577,
+ 627, 629, 588, 588, 588, 578, 582, 627, 581, 629,
+ 588, 588, 588, 579, 579, 580, 581, 629, 596, 597,
+ 597, 627, 597, 629, 596,16979, 8787, 491,16874, 491,
+ 16874, 492, 492, 491, 492,16874, 515, 561, 516, 563,
+ 496, 496, 499, 499, 506, 506, 526, 527, 526, 527,
+ 526, 527, 525, 8, 61, 61, 169, 20, 343, 561,
+ 563, 171, 62, 72, 72, 72, 72, 72, 72, 72,
+ 72, 139, 169, 169, 169, 169, 169, 169, 169, 169,
+
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 561, 563, 561, 563,
+ 416, 432, 432, 413, 432, 432, 432, 432, 432, 432,
+ 432, 118, 319, 325, 322, 323, 318, 136, 136, 137,
+ 471, 464, 193, 331, 331, 558, 558, 558, 74, 132,
+ 133, 571, 570, 569, 203, 561, 563, 60, 159, 159,
+ 159, 222, 333, 8339, 148, 344, 346, 403, 377, 377,
+ 249, 264, 257, 275, 276, 428, 387, 293, 290, 288,
+
+ 288, 603, 610, 588, 588, 584, 579, 580, 580, 593,
+ 208, 491,16874, 492, 514, 562, 513, 564, 513, 564,
+ 529, 496, 496, 499, 498, 506, 506, 485, 526, 527,
+ 526, 527, 8, 61, 61, 342, 562, 562, 562, 209,
+ 564, 564, 564, 564, 210, 72, 72, 72, 72, 72,
+ 72, 72, 72, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 208, 562, 208, 564,
+
+ 413, 432, 432, 413, 432, 432, 432, 432, 439, 438,
+ 432, 319, 325, 136, 136, 471, 331, 331, 558, 558,
+ 558, 74, 133, 129, 203, 55, 69, 159, 159, 161,
+ 222, 8339, 403, 377, 378, 249, 264, 257, 275, 276,
+ 536, 428, 388, 576, 588, 588, 583, 583, 496, 496,
+ 505, 506, 485, 485, 526, 527, 207, 206, 61, 61,
+ 188, 367, 210, 12, 72, 72, 72, 72, 72, 72,
+ 72, 72, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 19, 19, 19, 19, 140, 19, 169, 116,
+ 115, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 13, 432, 414, 432, 432, 432, 432,
+ 432, 432, 117, 188, 319, 340, 136, 456, 457, 331,
+ 331, 182, 556, 558, 558, 558, 558, 573, 157, 159,
+ 159, 162, 381, 386, 608, 585, 588, 588, 586, 496,
+ 496,16879, 485, 526, 527, 61, 61, 116, 210, 72,
+ 95, 72, 72, 72, 72, 72, 72, 72, 72, 169,
+ 169, 169, 169, 169, 97, 96, 169, 169, 169, 32,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169,16490, 169, 169, 169, 114, 113,
+ 134, 169, 169, 169, 414, 432, 414, 432, 432, 412,
+ 432, 440, 432, 432, 136, 330, 331, 558, 558, 558,
+ 572, 67, 68, 159, 608, 611, 587, 588, 591, 496,
+ 8687, 8687, 526, 527, 520, 61, 61, 97, 32,16490,
+ 114, 187, 72, 72, 72, 72, 72, 72, 72, 72,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 78,
+ 169, 169, 169, 81, 169, 169, 23, 169, 169, 88,
+ 169, 169, 169, 169, 169, 28, 169, 169, 169, 169,
+
+ 77, 8298, 105, 169, 169, 169, 169, 169, 169, 412,
+ 432, 432, 441, 412, 442, 432, 136, 331, 558, 558,
+ 558, 159, 163, 393, 286, 285, 592, 526, 527, 522,
+ 519, 61, 61, 78, 81, 23, 88, 28, 77, 8298,
+ 72, 72, 72, 72, 72, 72, 46, 72, 153, 169,
+ 169, 169, 169, 169, 104, 152, 169, 169, 169, 8315,
+ 140,16507, 169, 169, 169, 169, 23, 89, 82, 169,
+ 31, 169, 169, 169, 169, 169, 28, 169, 169, 169,
+ 24, 169, 169, 79, 410, 432, 411, 432, 415, 432,
+ 136, 557, 558, 558, 558, 63, 70, 65, 64, 163,
+
+ 609, 594, 526, 527, 61, 61, 46, 104, 89, 82,
+ 31, 24, 79, 72, 72, 72, 44, 72, 72, 72,
+ 169, 169, 80, 169, 169, 83, 565, 8315, 139, 169,
+ 76, 169, 29, 169, 31, 169, 169, 169, 33, 43,
+ 169, 169, 169, 169, 24, 86, 169, 410, 411, 415,
+ 410, 411, 415, 136, 558, 63, 66, 64, 269, 270,
+ 538, 609, 526, 527, 521, 61, 61, 44, 80, 83,
+ 76, 29, 33, 43, 86, 72, 72, 85, 72, 93,
+ 84, 154, 169, 169, 169, 94, 565, 565, 169, 90,
+ 90, 29, 87, 87,16508, 87, 87, 140, 87, 169,
+
+ 169, 169, 169, 30, 169, 169, 169, 169, 101, 100,
+ 169, 329, 135, 136, 558, 269, 269, 270, 270, 600,
+ 526, 527, 547, 61, 61, 85, 93, 84, 94, 90,
+ 90, 87, 30, 72, 92, 45, 169, 116, 169, 87,
+ 87, 169, 169, 22, 30, 169, 169, 169, 169, 110,
+ 109, 169, 558, 547, 61, 61, 92, 45, 22, 72,
+ 169, 8316, 169, 169, 22, 169, 169, 169, 25, 99,
+ 98, 165, 164, 61, 61, 25, 72, 168, 169, 27,
+ 169, 169, 25, 108, 107, 165, 164, 61, 61, 27,
+ 72, 27, 169, 169, 61, 61, 72, 169, 26, 61,
+
+ 61, 26, 91, 103, 102, 26, 61, 61, 91, 112,
+ 111, 61, 61, 61, 61, 61, 61, 61, 61, 14,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61
+ } ;
+
+static yyconst flex_int16_t yy_accept[3696] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 4,
+ 5, 6, 7, 8, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+
+ 9, 10, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 12, 13, 13, 13, 14,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 16, 17, 18,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 20, 22, 24, 28, 31, 34, 36,
+ 38, 41, 44, 47, 50, 56, 60, 64, 67, 70,
+ 72, 74, 76, 78, 80, 82, 85, 88, 93, 96,
+ 98, 100, 102, 104, 106, 108, 111, 114, 117, 120,
+ 122, 125, 128, 130, 133, 136, 139, 142, 145, 150,
+
+ 155, 158, 162, 165, 169, 173, 177, 180, 184, 188,
+ 192, 194, 196, 199, 202, 205, 210, 214, 218, 222,
+ 226, 229, 233, 237, 240, 244, 247, 252, 256, 259,
+ 263, 266, 270, 274, 278, 282, 285, 290, 294, 298,
+ 301, 305, 308, 311, 316, 320, 323, 327, 330, 334,
+ 338, 340, 342, 344, 346, 349, 351, 354, 357, 362,
+ 364, 367, 370, 374, 377, 382, 386, 390, 393, 396,
+ 399, 404, 408, 411, 414, 417, 420, 423, 428, 432,
+ 436, 440, 443, 447, 450, 453, 456, 458, 462, 464,
+ 467, 470, 473, 476, 479, 482, 484, 486, 489, 492,
+
+ 495, 498, 500, 502, 505, 508, 511, 514, 517, 520,
+ 523, 526, 529, 532, 535, 538, 541, 544, 547, 550,
+ 553, 556, 559, 562, 565, 568, 571, 575, 578, 584,
+ 589, 594, 598, 601, 603, 605, 607, 609, 611, 614,
+ 616, 618, 620, 624, 626, 629, 632, 634, 637, 640,
+ 643, 646, 648, 652, 655, 658, 661, 664, 667, 671,
+ 674, 679, 684, 688, 692, 696, 700, 703, 706, 711,
+ 715, 719, 723, 727, 730, 733, 736, 741, 745, 749,
+ 752, 756, 760, 764, 767, 770, 774, 777, 781, 785,
+ 789, 793, 797, 801, 805, 809, 813, 817, 820, 823,
+
+ 828, 832, 836, 839, 842, 846, 849, 852, 857, 861,
+ 865, 868, 872, 876, 880, 885, 888, 892, 898, 903,
+ 908, 911, 914, 918, 922, 926, 929, 933, 935, 938,
+ 941, 944, 946, 948, 950, 952, 954, 957, 961, 965,
+ 968, 974, 979, 984, 987, 990, 993, 997, 1001, 1005,
+ 1011, 1014, 1019, 1022, 1025, 1028, 1031, 1034, 1040, 1044,
+ 1048, 1051, 1054, 1057, 1062, 1067, 1073, 1078, 1081, 1085,
+ 1089, 1092, 1095, 1098, 1103, 1107, 1111, 1114, 1117, 1120,
+ 1123, 1128, 1132, 1136, 1138, 1141, 1143, 1146, 1150, 1153,
+ 1156, 1158, 1160, 1163, 1166, 1169, 1172, 1175, 1179, 1182,
+
+ 1187, 1191, 1195, 1198, 1202, 1206, 1209, 1212, 1217, 1220,
+ 1223, 1226, 1231, 1235, 1239, 1242, 1245, 1248, 1251, 1254,
+ 1259, 1263, 1267, 1270, 1272, 1275, 1278, 1281, 1284, 1287,
+ 1290, 1295, 1299, 1303, 1306, 1310, 1313, 1316, 1319, 1324,
+ 1328, 1332, 1335, 1338, 1342, 1346, 1349, 1355, 1360, 1365,
+ 1368, 1371, 1374, 1378, 1380, 1383, 1386, 1388, 1390, 1392,
+ 1395, 1397, 1399, 1401, 1404, 1407, 1410, 1413, 1418, 1422,
+ 1426, 1429, 1432, 1435, 1438, 1441, 1445, 1449, 1452, 1455,
+ 1458, 1463, 1467, 1471, 1474, 1476, 1478, 1481, 1486, 1490,
+ 1494, 1497, 1501, 1504, 1507, 1512, 1516, 1519, 1523, 1527,
+
+ 1530, 1534, 1538, 1542, 1546, 1549, 1555, 1560, 1565, 1569,
+ 1571, 1574, 1577, 1580, 1583, 1586, 1589, 1592, 1597, 1601,
+ 1605, 1608, 1611, 1613, 1616, 1618, 1621, 1624, 1627, 1630,
+ 1635, 1639, 1643, 1646, 1649, 1652, 1655, 1657, 1659, 1661,
+ 1663, 1665, 1667, 1670, 1673, 1675, 1678, 1681, 1684, 1687,
+ 1689, 1692, 1695, 1697, 1699, 1701, 1703, 1705, 1708, 1710,
+ 1713, 1716, 1719, 1722, 1728, 1732, 1737, 1742, 1746, 1750,
+ 1753, 1756, 1760, 1764, 1768, 1771, 1774, 1778, 1783, 1785,
+ 1787, 1789, 1791, 1793, 1796, 1798, 1800, 1802, 1804, 1807,
+ 1810, 1812, 1815, 1818, 1821, 1824, 1827, 1830, 1835, 1839,
+
+ 1843, 1847, 1851, 1854, 1858, 1863, 1866, 1869, 1871, 1874,
+ 1879, 1883, 1886, 1890, 1893, 1896, 1900, 1903, 1906, 1911,
+ 1915, 1919, 1923, 1926, 1929, 1932, 1934, 1938, 1942, 1946,
+ 1952, 1956, 1961, 1965, 1969, 1972, 1975, 1979, 1983, 1986,
+ 1989, 1994, 1998, 2002, 2005, 2009, 2011, 2014, 2016, 2019,
+ 2022, 2025, 2028, 2034, 2038, 2042, 2045, 2048, 2051, 2056,
+ 2061, 2064, 2067, 2073, 2077, 2081, 2084, 2087, 2090, 2095,
+ 2100, 2104, 2107, 2113, 2118, 2123, 2127, 2131, 2135, 2139,
+ 2142, 2148, 2153, 2158, 2162, 2166, 2170, 2174, 2177, 2183,
+ 2188, 2193, 2197, 2201, 2204, 2208, 2211, 2217, 2222, 2227,
+
+ 2231, 2235, 2239, 2244, 2247, 2250, 2253, 2258, 2262, 2266,
+ 2270, 2274, 2277, 2280, 2284, 2287, 2292, 2296, 2300, 2304,
+ 2308, 2311, 2315, 2319, 2322, 2325, 2328, 2334, 2338, 2341,
+ 2346, 2349, 2353, 2357, 2361, 2365, 2368, 2373, 2377, 2381,
+ 2384, 2387, 2390, 2394, 2397, 2402, 2406, 2410, 2414, 2418,
+ 2422, 2425, 2429, 2433, 2436, 2442, 2447, 2451, 2455, 2458,
+ 2463, 2468, 2472, 2477, 2481, 2485, 2488, 2492, 2496, 2500,
+ 2503, 2509, 2514, 2519, 2522, 2526, 2529, 2533, 2537, 2541,
+ 2544, 2550, 2555, 2560, 2564, 2567, 2570, 2575, 2579, 2583,
+ 2586, 2589, 2592, 2597, 2601, 2605, 2608, 2612, 2615, 2618,
+
+ 2621, 2623, 2628, 2632, 2635, 2639, 2642, 2646, 2650, 2653,
+ 2655, 2657, 2659, 2662, 2665, 2670, 2674, 2678, 2682, 2685,
+ 2688, 2691, 2694, 2696, 2699, 2704, 2708, 2711, 2715, 2719,
+ 2723, 2726, 2729, 2733, 2736, 2739, 2744, 2748, 2752, 2755,
+ 2758, 2761, 2764, 2767, 2771, 2774, 2779, 2783, 2787, 2791,
+ 2794, 2797, 2802, 2806, 2810, 2813, 2815, 2818, 2822, 2825,
+ 2828, 2830, 2834, 2838, 2841, 2847, 2852, 2857, 2860, 2863,
+ 2867, 2870, 2873, 2877, 2880, 2883, 2887, 2890, 2896, 2901,
+ 2904, 2909, 2912, 2915, 2918, 2921, 2925, 2929, 2930, 2931,
+ 2932, 2932, 2933, 2934, 2934, 2934, 2935, 2936, 2937, 2937,
+
+ 2937, 2937, 2937, 2937, 2938, 2938, 2938, 2940, 2940, 2940,
+ 2940, 2943, 2943, 2943, 2944, 2944, 2944, 2944, 2945, 2946,
+ 2949, 2950, 2951, 2952, 2952, 2952, 2955, 2955, 2955, 2955,
+ 2956, 2956, 2957, 2958, 2958, 2958, 2958, 2958, 2958, 2959,
+ 2960, 2961, 2962, 2962, 2962, 2962, 2963, 2964, 2965, 2966,
+ 2967, 2968, 2969, 2970, 2971, 2971, 2971, 2972, 2972, 2973,
+ 2973, 2974, 2975, 2976, 2977, 2977, 2977, 2978, 2979, 2980,
+ 2981, 2982, 2983, 2983, 2983, 2983, 2985, 2987, 2988, 2988,
+ 2989, 2990, 2993, 2996, 2999, 2999, 2999, 3000, 3000, 3000,
+ 3003, 3003, 3003, 3003, 3004, 3005, 3005, 3005, 3005, 3005,
+
+ 3005, 3005, 3005, 3005, 3005, 3006, 3007, 3008, 3008, 3008,
+ 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008,
+ 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3010, 3011, 3012,
+ 3013, 3013, 3013, 3014, 3014, 3014, 3015, 3016, 3017, 3017,
+ 3018, 3019, 3019, 3019, 3020, 3020, 3021, 3022, 3023, 3024,
+ 3025, 3026, 3026, 3027, 3028, 3029, 3029, 3029, 3030, 3031,
+ 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041,
+ 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051,
+ 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061,
+
+ 3063, 3065, 3066, 3066, 3066, 3066, 3066, 3066, 3067, 3067,
+ 3067, 3068, 3068, 3068, 3069, 3070, 3070, 3071, 3071, 3072,
+ 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3079, 3079, 3079,
+ 3079, 3079, 3079, 3079, 3079, 3079, 3080, 3081, 3082, 3082,
+ 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092,
+ 3093, 3093, 3093, 3094, 3095, 3097, 3098, 3098, 3099, 3100,
+ 3100, 3100, 3102, 3104, 3105, 3105, 3105, 3106, 3107, 3107,
+ 3108, 3108, 3109, 3109, 3109, 3109, 3109, 3110, 3110, 3110,
+ 3111, 3111, 3112, 3113, 3114, 3114, 3114, 3114, 3116, 3118,
+ 3119, 3119, 3119, 3120, 3121, 3123, 3125, 3126, 3126, 3126,
+
+ 3126, 3127, 3129, 3131, 3132, 3134, 3135, 3136, 3136, 3137,
+ 3137, 3138, 3139, 3139, 3140, 3142, 3145, 3145, 3146, 3146,
+ 3147, 3148, 3150, 3151, 3152, 3154, 3156, 3157, 3159, 3161,
+ 3162, 3163, 3164, 3165, 3165, 3165, 3165, 3166, 3167, 3168,
+ 3170, 3172, 3173, 3174, 3175, 3176, 3176, 3177, 3177, 3177,
+ 3177, 3177, 3178, 3178, 3179, 3179, 3179, 3179, 3180, 3181,
+ 3181, 3181, 3181, 3181, 3181, 3181, 3182, 3182, 3182, 3182,
+ 3183, 3184, 3185, 3186, 3187, 3188, 3190, 3192, 3193, 3194,
+ 3194, 3195, 3196, 3198, 3200, 3201, 3201, 3201, 3202, 3203,
+ 3204, 3205, 3206, 3208, 3210, 3210, 3210, 3210, 3210, 3210,
+
+ 3210, 3211, 3212, 3213, 3213, 3213, 3214, 3215, 3216, 3217,
+ 3217, 3217, 3217, 3217, 3218, 3219, 3220, 3221, 3221, 3221,
+ 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3228, 3228, 3228,
+ 3228, 3229, 3229, 3229, 3230, 3230, 3230, 3230, 3231, 3232,
+ 3233, 3233, 3234, 3235, 3235, 3235, 3235, 3235, 3235, 3236,
+ 3236, 3236, 3237, 3237, 3238, 3238, 3238, 3238, 3239, 3240,
+ 3241, 3241, 3242, 3243, 3244, 3244, 3244, 3244, 3244, 3246,
+ 3248, 3249, 3250, 3251, 3252, 3253, 3253, 3254, 3256, 3258,
+ 3259, 3260, 3262, 3264, 3265, 3266, 3266, 3266, 3268, 3270,
+ 3271, 3271, 3271, 3272, 3272, 3272, 3273, 3273, 3273, 3274,
+
+ 3274, 3275, 3276, 3277, 3278, 3278, 3279, 3279, 3279, 3280,
+ 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3289, 3291,
+ 3292, 3293, 3294, 3295, 3297, 3297, 3297, 3298, 3299, 3300,
+ 3301, 3303, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3305,
+ 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3306, 3306,
+ 3307, 3308, 3309, 3309, 3310, 3310, 3310, 3311, 3312, 3313,
+ 3314, 3315, 3315, 3315, 3316, 3316, 3316, 3316, 3316, 3316,
+ 3316, 3317, 3317, 3317, 3318, 3318, 3319, 3319, 3319, 3319,
+ 3319, 3319, 3320, 3320, 3320, 3320, 3320, 3321, 3321, 3321,
+ 3322, 3323, 3324, 3325, 3326, 3326, 3327, 3329, 3331, 3332,
+
+ 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
+ 3334, 3334, 3334, 3335, 3336, 3339, 3340, 3341, 3343, 3345,
+ 3345, 3345, 3345, 3346, 3347, 3348, 3348, 3348, 3348, 3348,
+ 3350, 3352, 3352, 3353, 3353, 3353, 3354, 3354, 3357, 3357,
+ 3357, 3357, 3359, 3359, 3359, 3361, 3361, 3361, 3361, 3362,
+ 3363, 3364, 3365, 3366, 3366, 3366, 3366, 3367, 3367, 3369,
+ 3371, 3371, 3371, 3372, 3372, 3373, 3373, 3374, 3374, 3374,
+ 3374, 3374, 3374, 3375, 3375, 3375, 3375, 3375, 3375, 3375,
+ 3376, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377,
+ 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377,
+
+ 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377,
+ 3377, 3377, 3377, 3377, 3378, 3378, 3378, 3378, 3379, 3380,
+ 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3380, 3381,
+ 3381, 3381, 3381, 3382, 3382, 3382, 3383, 3383, 3383, 3383,
+ 3383, 3384, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391,
+ 3392, 3393, 3394, 3395, 3396, 3396, 3396, 3397, 3398, 3399,
+ 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409,
+ 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419,
+ 3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429,
+ 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3436, 3436, 3436,
+
+ 3437, 3437, 3438, 3438, 3439, 3439, 3439, 3439, 3439, 3439,
+ 3439, 3439, 3439, 3439, 3439, 3440, 3440, 3440, 3441, 3441,
+ 3442, 3443, 3444, 3446, 3447, 3448, 3449, 3450, 3451, 3452,
+ 3452, 3453, 3453, 3454, 3454, 3455, 3455, 3455, 3456, 3457,
+ 3457, 3458, 3458, 3458, 3458, 3458, 3459, 3460, 3461, 3461,
+ 3461, 3462, 3462, 3462, 3462, 3462, 3463, 3463, 3463, 3463,
+ 3464, 3465, 3466, 3466, 3467, 3468, 3469, 3469, 3470, 3470,
+ 3470, 3471, 3472, 3472, 3472, 3472, 3473, 3474, 3474, 3474,
+ 3475, 3475, 3476, 3477, 3477, 3478, 3478, 3479, 3479, 3479,
+ 3479, 3479, 3479, 3479, 3479, 3479, 3479, 3479, 3480, 3481,
+
+ 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3483, 3483, 3483,
+ 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3484, 3484, 3484,
+ 3485, 3485, 3486, 3487, 3487, 3487, 3488, 3488, 3489, 3489,
+ 3489, 3489, 3489, 3490, 3491, 3491, 3491, 3492, 3492, 3492,
+ 3492, 3493, 3493, 3493, 3493, 3494, 3494, 3494, 3494, 3495,
+ 3495, 3495, 3496, 3496, 3496, 3496, 3496, 3497, 3497, 3497,
+ 3497, 3497, 3497, 3497, 3498, 3498, 3498, 3498, 3498, 3498,
+ 3498, 3498, 3498, 3498, 3499, 3500, 3501, 3502, 3502, 3502,
+ 3502, 3503, 3503, 3504, 3504, 3504, 3504, 3504, 3505, 3506,
+ 3506, 3506, 3506, 3506, 3507, 3507, 3507, 3507, 3507, 3507,
+
+ 3508, 3509, 3510, 3510, 3510, 3510, 3511, 3512, 3512, 3514,
+ 3515, 3515, 3517, 3517, 3519, 3521, 3522, 3523, 3524, 3525,
+ 3526, 3526, 3527, 3528, 3528, 3528, 3528, 3528, 3529, 3531,
+ 3532, 3533, 3533, 3533, 3533, 3533, 3533, 3533, 3534, 3534,
+ 3534, 3534, 3535, 3536, 3536, 3536, 3536, 3536, 3536, 3536,
+ 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536,
+ 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536,
+ 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536,
+ 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536, 3536,
+ 3536, 3536, 3536, 3536, 3537, 3537, 3537, 3537, 3537, 3537,
+
+ 3537, 3537, 3538, 3539, 3540, 3541, 3541, 3541, 3542, 3543,
+ 3544, 3545, 3546, 3546, 3546, 3546, 3546, 3547, 3548, 3549,
+ 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559,
+ 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569,
+ 3570, 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 3579,
+ 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3586, 3587, 3588,
+ 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3597,
+ 3597, 3599, 3601, 3601, 3601, 3602, 3602, 3602, 3602, 3602,
+ 3602, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610,
+ 3611, 3612, 3612, 3612, 3613, 3613, 3614, 3614, 3614, 3614,
+
+ 3614, 3615, 3616, 3616, 3617, 3617, 3617, 3617, 3617, 3618,
+ 3619, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3625, 3625,
+ 3626, 3627, 3627, 3628, 3628, 3628, 3628, 3628, 3628, 3628,
+ 3629, 3630, 3630, 3631, 3631, 3631, 3631, 3631, 3632, 3632,
+ 3633, 3633, 3633, 3633, 3633, 3634, 3634, 3634, 3635, 3636,
+ 3636, 3636, 3637, 3637, 3637, 3638, 3638, 3638, 3639, 3639,
+ 3639, 3640, 3640, 3641, 3642, 3642, 3642, 3643, 3643, 3643,
+ 3643, 3643, 3643, 3643, 3643, 3643, 3643, 3643, 3643, 3644,
+ 3644, 3644, 3644, 3644, 3644, 3644, 3645, 3646, 3647, 3648,
+ 3648, 3649, 3649, 3649, 3649, 3649, 3649, 3649, 3649, 3649,
+
+ 3649, 3649, 3649, 3650, 3651, 3653, 3653, 3653, 3654, 3654,
+ 3654, 3654, 3655, 3657, 3657, 3657, 3657, 3657, 3657, 3657,
+ 3658, 3659, 3660, 3661, 3661, 3661, 3661, 3661, 3661, 3661,
+ 3661, 3661, 3661, 3661, 3661, 3661, 3661, 3661, 3661, 3661,
+ 3661, 3661, 3661, 3661, 3661, 3661, 3661, 3661, 3661, 3661,
+ 3661, 3661, 3661, 3661, 3661, 3661, 3661, 3661, 3661, 3661,
+ 3661, 3661, 3661, 3661, 3661, 3662, 3662, 3662, 3662, 3662,
+ 3662, 3662, 3662, 3662, 3662, 3663, 3663, 3663, 3663, 3663,
+ 3664, 3664, 3665, 3665, 3666, 3667, 3668, 3669, 3670, 3671,
+ 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681,
+
+ 3682, 3683, 3684, 3685, 3686, 3688, 3690, 3691, 3692, 3693,
+ 3694, 3695, 3696, 3697, 3698, 3699, 3700, 3701, 3702, 3703,
+ 3704, 3705, 3706, 3707, 3708, 3709, 3710, 3711, 3712, 3712,
+ 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721,
+ 3722, 3723, 3724, 3725, 3725, 3725, 3725, 3725, 3725, 3725,
+ 3725, 3725, 3726, 3728, 3729, 3730, 3731, 3732, 3733, 3733,
+ 3734, 3736, 3736, 3736, 3736, 3737, 3738, 3738, 3738, 3739,
+ 3740, 3741, 3742, 3743, 3745, 3746, 3747, 3748, 3749, 3749,
+ 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3751, 3752, 3752,
+ 3752, 3752, 3753, 3753, 3753, 3753, 3753, 3753, 3754, 3754,
+
+ 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754,
+ 3754, 3754, 3754, 3755, 3755, 3755, 3755, 3755, 3755, 3755,
+ 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3756,
+ 3756, 3756, 3758, 3759, 3760, 3760, 3760, 3760, 3760, 3760,
+ 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3761,
+ 3763, 3764, 3764, 3766, 3766, 3766, 3766, 3766, 3767, 3768,
+ 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768,
+ 3768, 3768, 3768, 3768, 3769, 3769, 3769, 3769, 3769, 3769,
+ 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769,
+ 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769,
+
+ 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3770, 3770, 3772,
+ 3773, 3774, 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782,
+ 3783, 3784, 3785, 3786, 3787, 3788, 3788, 3789, 3790, 3790,
+ 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799,
+ 3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, 3808, 3809,
+ 3810, 3811, 3811, 3811, 3812, 3813, 3814, 3816, 3817, 3818,
+ 3819, 3820, 3821, 3822, 3822, 3823, 3824, 3825, 3825, 3825,
+ 3826, 3826, 3826, 3826, 3826, 3826, 3827, 3828, 3829, 3830,
+ 3832, 3832, 3833, 3834, 3835, 3835, 3836, 3837, 3838, 3839,
+ 3840, 3841, 3842, 3843, 3843, 3843, 3843, 3843, 3844, 3844,
+
+ 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845,
+ 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845,
+ 3845, 3845, 3846, 3846, 3847, 3847, 3849, 3849, 3849, 3849,
+ 3849, 3849, 3849, 3850, 3850, 3850, 3850, 3850, 3850, 3850,
+ 3850, 3851, 3851, 3852, 3853, 3855, 3855, 3855, 3856, 3856,
+ 3857, 3858, 3858, 3858, 3858, 3858, 3858, 3858, 3858, 3858,
+ 3858, 3858, 3858, 3859, 3859, 3859, 3859, 3860, 3860, 3860,
+ 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860,
+ 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3861, 3861, 3861,
+ 3862, 3862, 3862, 3862, 3862, 3863, 3863, 3864, 3865, 3866,
+
+ 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876,
+ 3877, 3877, 3877, 3877, 3877, 3878, 3878, 3878, 3879, 3880,
+ 3881, 3881, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3887,
+ 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3896,
+ 3897, 3898, 3899, 3899, 3899, 3900, 3901, 3902, 3903, 3904,
+ 3905, 3906, 3907, 3907, 3907, 3908, 3909, 3910, 3910, 3910,
+ 3910, 3910, 3911, 3911, 3911, 3912, 3913, 3913, 3914, 3915,
+ 3916, 3917, 3917, 3918, 3919, 3920, 3921, 3922, 3922, 3922,
+ 3922, 3922, 3922, 3923, 3923, 3923, 3924, 3924, 3924, 3924,
+ 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925,
+
+ 3925, 3925, 3926, 3927, 3927, 3927, 3927, 3927, 3927, 3927,
+ 3927, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3930,
+ 3931, 3931, 3932, 3933, 3934, 3934, 3934, 3934, 3934, 3934,
+ 3934, 3934, 3934, 3934, 3934, 3934, 3934, 3934, 3934, 3934,
+ 3935, 3935, 3936, 3936, 3936, 3936, 3937, 3937, 3937, 3938,
+ 3938, 3938, 3938, 3938, 3938, 3938, 3939, 3939, 3939, 3939,
+ 3940, 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3942, 3943,
+ 3944, 3945, 3946, 3947, 3948, 3949, 3951, 3952, 3953, 3954,
+ 3955, 3956, 3956, 3956, 3957, 3958, 3958, 3958, 3959, 3960,
+ 3960, 3960, 3960, 3960, 3960, 3963, 3964, 3965, 3966, 3967,
+
+ 3968, 3969, 3969, 3970, 3971, 3971, 3972, 3973, 3974, 3975,
+ 3976, 3977, 3978, 3979, 3980, 3980, 3980, 3981, 3981, 3982,
+ 3982, 3983, 3983, 3983, 3984, 3985, 3985, 3985, 3985, 3985,
+ 3987, 3989, 3991, 3991, 3992, 3994, 3995, 3996, 3996, 3997,
+ 3998, 3999, 3999, 3999, 4000, 4000, 4001, 4001, 4001, 4001,
+ 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4002,
+ 4002, 4002, 4002, 4003, 4003, 4003, 4003, 4003, 4003, 4005,
+ 4005, 4006, 4007, 4007, 4007, 4007, 4007, 4007, 4007, 4008,
+ 4008, 4008, 4008, 4008, 4009, 4009, 4009, 4009, 4009, 4009,
+ 4009, 4010, 4010, 4011, 4011, 4011, 4012, 4012, 4012, 4012,
+
+ 4012, 4012, 4012, 4012, 4012, 4013, 4013, 4013, 4013, 4014,
+ 4015, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023, 4024,
+ 4025, 4025, 4025, 4026, 4027, 4028, 4028, 4028, 4028, 4028,
+ 4030, 4031, 4032, 4033, 4033, 4034, 4035, 4036, 4037, 4038,
+ 4039, 4041, 4042, 4043, 4044, 4044, 4044, 4045, 4046, 4046,
+ 4046, 4047, 4047, 4047, 4048, 4048, 4049, 4050, 4051, 4052,
+ 4053, 4054, 4054, 4055, 4056, 4057, 4058, 4059, 4059, 4059,
+ 4060, 4061, 4062, 4062, 4062, 4062, 4062, 4062, 4062, 4062,
+ 4062, 4063, 4063, 4063, 4063, 4063, 4063, 4063, 4065, 4066,
+ 4067, 4068, 4068, 4068, 4068, 4069, 4069, 4069, 4069, 4069,
+
+ 4070, 4070, 4070, 4071, 4072, 4072, 4072, 4073, 4073, 4073,
+ 4073, 4073, 4075, 4075, 4075, 4075, 4076, 4076, 4077, 4078,
+ 4079, 4080, 4081, 4082, 4084, 4085, 4086, 4086, 4086, 4087,
+ 4088, 4089, 4089, 4089, 4089, 4089, 4090, 4091, 4092, 4093,
+ 4094, 4096, 4097, 4099, 4101, 4102, 4103, 4104, 4104, 4105,
+ 4106, 4107, 4108, 4109, 4110, 4111, 4111, 4112, 4112, 4112,
+ 4112, 4112, 4113, 4115, 4116, 4116, 4116, 4117, 4118, 4119,
+ 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4121, 4121, 4121,
+ 4121, 4121, 4121, 4124, 4125, 4126, 4126, 4126, 4127, 4127,
+ 4128, 4129, 4129, 4129, 4130, 4131, 4132, 4133, 4133, 4133,
+
+ 4133, 4133, 4134, 4134, 4134, 4134, 4134, 4135, 4136, 4137,
+ 4138, 4139, 4139, 4139, 4139, 4140, 4140, 4140, 4141, 4141,
+ 4142, 4143, 4144, 4144, 4145, 4146, 4147, 4148, 4149, 4150,
+ 4151, 4152, 4153, 4153, 4153, 4153, 4154, 4154, 4154, 4154,
+ 4154, 4154, 4154, 4154, 4154, 4155, 4156, 4157, 4157, 4158,
+ 4159, 4159, 4159, 4159, 4159, 4160, 4160, 4160, 4160, 4160,
+ 4161, 4162, 4162, 4162, 4162, 4162, 4162, 4162, 4163, 4164,
+ 4165, 4166, 4167, 4168, 4169, 4169, 4170, 4171, 4172, 4172,
+ 4172, 4172, 4173, 4173, 4174, 4174, 4174, 4175, 4176, 4176,
+ 4176, 4176, 4176, 4176, 4176, 4176, 4176, 4177, 4178, 4179,
+
+ 4179, 4179, 4180, 4180, 4181, 4182, 4183, 4184, 4185, 4186,
+ 4186, 4187, 4188, 4189, 4190, 4190, 4190, 4190, 4191, 4191,
+ 4191, 4192, 4192, 4192, 4193, 4194, 4195, 4195, 4196, 4197,
+ 4197, 4197, 4197, 4198, 4198, 4198, 4199, 4199, 4200, 4200,
+ 4201, 4202, 4202, 4202, 4202, 4203, 4204, 4205, 4206, 4206,
+ 4207, 4207, 4208, 4209, 4210, 4211, 4212, 4212, 4212, 4213,
+ 4214, 4214, 4214, 4214, 4215, 4216, 4216, 4217, 4218, 4218,
+ 4219, 4220, 4220, 4220, 4221, 4222, 4223, 4224, 4225, 4226,
+ 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236,
+ 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246,
+
+ 4247, 4248, 4249, 4250, 4251, 4252, 4253, 4254, 4255, 4256,
+ 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266,
+ 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276,
+ 4277, 4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, 4286,
+ 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4294, 4295, 4296,
+ 4297, 4298, 4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306,
+ 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, 4316,
+ 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326,
+ 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336,
+ 4337, 4338, 4339, 4339, 4339
+
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 24, 24, 24, 24, 25, 25, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 38, 40, 41, 38, 42, 38, 43, 44, 45,
+ 46, 47, 48, 49, 38, 38, 50, 38, 51, 38,
+ 52, 53, 54, 55, 56, 1, 57, 58, 59, 60,
+
+ 61, 62, 63, 64, 65, 38, 66, 67, 68, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 38, 81, 1, 82, 83, 1, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84
+ } ;
+
+static yyconst flex_int32_t yy_meta[85] =
+ { 0,
+ 1, 2, 3, 4, 2, 5, 6, 7, 8, 1,
+ 9, 10, 11, 12, 13, 1, 14, 1, 15, 16,
+ 17, 17, 17, 17, 17, 18, 19, 20, 21, 22,
+ 1, 23, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 25, 26, 27, 28, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 29, 30, 31, 32
+ } ;
+
+static yyconst flex_int16_t yy_base[4224] =
+ { 0,
+ 0, 2, 22, 0, 105, 116, 169, 0, 253, 0,
+ 337, 0, 421, 0, 503, 505, 557, 0, 119, 519,
+ 641, 0, 723, 725, 779, 0, 863, 0, 946, 957,
+ 967, 978, 134, 739, 1059, 0, 741, 994, 1143, 0,
+ 1227, 0, 533, 1033, 1309, 1311, 1337, 1356, 996, 1012,
+ 1359, 1375, 1456, 0, 1381, 1403, 1538, 1541, 1552, 1566,
+ 1597, 1608, 1619, 1650, 1732, 0, 1816, 0, 1899, 1910,
+ 1921, 1952, 1629, 1931, 1653, 1668, 1958, 1986, 1992, 2015,
+ 2033, 2047, 145, 755, 1417, 1431, 2018, 2049, 2067, 2069,
+ 1684, 1700, 2101, 2112, 2115, 2149, 2151, 2173, 2087, 2187,
+
+ 2189, 2203, 2241, 0, 2323, 2325, 2344, 2355, 2366, 2405,
+ 2458, 0, 2542, 0, 2626, 0, 2710, 0, 2792, 2794,
+ 2205, 2415, 2376, 2426, 2876, 0, 2808, 2810, 2960, 0,
+ 2433, 2824, 3044, 0, 2826, 2840, 3128, 0, 3210, 3213,
+ 3228, 3231, 3238, 3257, 3254, 3260, 3331, 0, 3415, 0,
+ 3497, 3507, 3557, 0, 3641, 0, 3724, 3805, 3887, 0,
+ 3276, 3297, 3517, 3750, 3971, 0, 3760, 3776, 3835, 3838,
+ 4055, 0, 3727, 3778, 4137, 4140, 4159, 4173, 4192, 4206,
+ 3808, 4162, 4236, 0, 4320, 0, 4402, 4404, 4418, 4420,
+ 4434, 4436, 4455, 4457, 3864, 4471, 4485, 4487, 4506, 4509,
+
+ 4524, 4527, 4538, 4568, 4608, 4682, 4757, 0, 4582, 4627,
+ 4642, 4645, 4701, 4720, 4571, 4839, 4841, 4855, 4857, 4875,
+ 4660, 4735, 4195, 4877, 4906, 4917, 4928, 4943, 4954, 4965,
+ 4975, 4981, 5052, 0, 5136, 0, 5218, 5220, 5290, 0,
+ 5373, 5384, 4991, 5001, 4552, 5016, 5019, 5030, 5234, 5403,
+ 5413, 5466,10790,28568,28568,28568,28568,28568, 1, 0,
+ 154,28568, 1394, 1577,28568,28568,28568, 96, 14, 4673,
+ 1640, 1943, 769, 4897, 5480,10735,28568, 5248, 133, 1047,
+ 1983, 516, 2200, 1445, 5498,28568,28568, 736,28568, 114,
+ 10734,28568,10697, 2389, 4498, 4939,28568,28568,28568,28568,
+
+ 0,28568, 125,28568,28568, 0, 0, 515, 954,28568,
+ 10703, 0,28568, 0,28568,28568,28568,28568,28568,28568,
+ 135,10725, 3289,28568, 158,28568,28568,28568, 0,28568,
+ 494,28568, 0,28568,28568,28568,28568,28568,28568, 509,
+ 28568,28568,28568,28568,28568, 0,28568, 531, 0,28568,
+ 5488, 5581, 5664, 0,28568,10725,28568, 2012, 5434,10715,
+ 750,28568,28568,28568,28568,28568,28568, 714, 681,10657,
+ 28568,10668,28568, 2216, 2805,28568,28568,28568,28568,28568,
+ 3536, 745, 4852, 5744, 5253, 5506, 1713, 987, 5672, 33,
+ 0, 5512, 1721, 5266,28568, 937,10711,10686, 5526, 952,
+
+ 28568,10681, 2157, 5531, 5680,10656,28568, 5684, 5540, 5689,
+ 5697, 5716, 5761, 5820, 5824, 5828, 5833, 5838, 5866, 5874,
+ 5883, 5901, 5913, 5917, 5930,28568, 0,28568, 0, 0,
+ 0, 948, 476, 5545, 5728, 2445, 5958,10682, 5949, 5778,
+ 5870, 5968, 2078, 0,28568, 5976, 956,28568,28568, 0,
+ 28568, 973,28568,28568,28568,28568, 5999,28568, 2336, 3797,
+ 28568,28568,28568,28568,28568, 1725, 992,28568,28568,28568,
+ 28568,28568,28568, 1024,28568,28568,28568,28568,28568, 1300,
+ 28568,28568, 6040, 0, 0,28568, 1310, 2170, 0,10640,
+ 10623,10624,10606,10624,10619, 663,10609,28568,28568,28568,
+
+ 28568,28568, 5395, 1312,28568,10640,28568,28568,28568,28568,
+ 1328,28568,28568, 0, 3319, 2859, 2867,28568, 1025,10603,
+ 1332,10646,28568, 3546,28568, 993,28568, 0,28568, 6003,
+ 6007, 6011, 6044, 4226, 6048,10626, 6056, 0, 1372,28568,
+ 28568, 1053,10597, 1385,10642,28568,28568, 6063, 1583, 1351,
+ 28568,28568, 1392, 140, 6073,28568,28568,28568,28568,28568,
+ 10620, 1398, 0,28568,28568,28568,28568, 1406,28568,28568,
+ 28568,10633, 952,28568,28568,28568, 1527, 1039, 0, 1370,
+ 0, 0, 0,10615, 1547, 1388,28568, 1400, 1572, 1593,
+ 1666, 1611,28568,28568,28568,28568,28568, 3877, 4748,28568,
+
+ 28568,28568, 1574,28568,28568,28568,28568,28568,28568,28568,
+ 0,28568, 0, 0, 1588,28568,28568, 0,28568, 0,
+ 0, 0, 1615, 0,28568, 0,10559,10555,28568,28568,
+ 28568,28568,28568, 1652,28568,28568, 6082, 6086,28568,28568,
+ 28568, 1679,10566, 0, 5278, 5570, 0, 0, 0,10601,
+ 28568, 1690, 952, 0,28568, 111, 0, 5769, 0, 6098,
+ 6102, 6116, 0,28568, 0,28568,28568,28568,28568,28568,
+ 1888,10559,10557, 105,10556,28568,28568,28568,28568,28568,
+ 10602,28568,28568, 1890, 0, 1902,28568,28568,28568,28568,
+ 1901,28568,28568, 6120,28568,28568, 0,28568, 6124, 1905,
+
+ 6130, 0,28568, 0,28568,10587, 0, 0, 1912, 0,
+ 28568, 1440, 5574, 0,28568, 0, 0, 0, 0, 0,
+ 28568, 1920, 0,28568, 6134,28568, 6144, 0, 0, 0,
+ 0, 0, 1450, 1929,28568,28568,10515,10512,10518,10507,
+ 10513,10507,28568, 1561, 0,28568, 526, 2018, 2040, 0,
+ 0,28568,10525,10519,10516,10502, 0, 0, 0, 0,
+ 28568, 6152, 6158,28568,28568,10489,28568,28568, 6162,10511,
+ 1956, 6172,10505,10500,10498,10516,28568,28568, 6181, 6191,
+ 6199, 6207, 2058,28568, 6212, 6226, 6240, 6254,28568, 6268,
+ 1962, 6272,28568, 6276,28568,28568,28568,28568,28568,28568,
+
+ 28568,28568, 2028,10489, 6280,28568, 6292, 6296, 6300,28568,
+ 28568, 6310,28568, 2077,10489, 6321,28568,28568,28568,28568,
+ 28568, 6327, 2110,28568, 6335,10460, 0, 6340, 6347,28568,
+ 28568,10456,28568, 6351, 2113,28568,28568,28568,28568,28568,
+ 28568,28568,28568, 2140,10477, 0, 0, 0,28568,10462,
+ 28568,28568,28568,28568,28568,10466, 2147, 0,28568,28568,
+ 28568,28568,28568,28568,28568,10462, 2163, 0,28568,28568,
+ 0,28568,28568, 0,10424,28568,28568, 2169, 0,28568,
+ 28568, 0,10406, 2209,28568,28568, 0,28568,28568, 0,
+ 10404,28568,28568, 2217, 0,28568,28568, 0,10403, 2220,
+
+ 28568,28568, 1672,28568, 2426,28568,28568,28568,28568,28568,
+ 28568, 2314,28568, 6355, 6361,28568,28568,28568,28568,28568,
+ 2335,10424,10420,10368,28568,28568,28568,28568, 0,10385,
+ 2346,28568, 0,28568,28568,28568,28568,28568,28568, 6365,
+ 2357,28568, 6371, 6377,28568,28568,28568,28568,28568, 6381,
+ 2367,28568, 0,28568,28568, 0,28568, 2375, 0,28568,
+ 28568, 0, 0,28568,28568, 2385,28568,28568, 0,28568,
+ 0, 0, 0,10395, 2396, 1307, 2005, 6393, 0,28568,
+ 0, 0, 0, 2406, 6342,28568,28568,28568,28568, 2436,
+ 1272,28568,28568,28568,28568, 2437,28568,10338,28568, 6420,
+
+ 6428,28568,28568, 0,28568, 2783,28568, 6436,10355, 6440,
+ 6452, 0, 6460,28568,28568,28568,28568, 3521, 2804,10316,
+ 28568, 6464, 6472, 6479,28568,28568, 6490,28568,28568,28568,
+ 2806,10357, 6498,28568, 5853,28568,28568,28568, 2830, 2080,
+ 10312,10316,10308,28568,28568,28568,28568,28568,28568, 2838,
+ 28568,28568,28568,28568, 3199,10373, 3224,10361,10355,10353,
+ 3234, 0, 2142,28568, 0, 0, 0, 3208, 3227, 485,
+ 6446, 6467, 4599, 3255, 3258, 0,28568, 0, 0,28568,
+ 0,10335, 3270,10334, 1366, 3501, 6534,28568,28568, 3769,
+ 3851,28568, 4219, 6538, 3283, 1340, 744,28568,10349, 6548,
+
+ 6557, 6561,10313, 2026, 6582, 6590, 6598, 6602, 6614, 0,
+ 6628, 6633, 6655, 6646, 6664, 6673, 6681,28568,28568, 6700,
+ 28568,28568, 2027, 6685, 6720, 6730, 6737, 6746,10311,28568,
+ 6750, 6757,10305, 6762, 6775, 6783, 6788, 0, 6796, 6800,
+ 1429, 3824, 6808,10260, 6822,28568, 6826, 6838, 6842, 0,
+ 1537, 1545, 0, 3494,10309,10303, 3747,10301, 4605,10236,
+ 28568, 0, 0,28568, 6854,10261,28568, 2229, 0, 0,
+ 0, 0, 6858, 6867, 6879, 6890, 6898, 2837, 6966, 0,
+ 6902, 6916, 7049, 7053, 6924, 7057,28568, 7061,10276, 7078,
+ 10252,10267,10265,10220, 2854, 3243,10213,10197,10257, 6922,
+
+ 7087, 3728, 7091, 3730, 7137, 7096, 4641,10232, 3724,10193,
+ 10193,10190,10187, 3232,10167, 1616,10157,10168,10140, 2266,
+ 10136, 3252,10131, 956,10110,10120, 3804, 6947, 7110, 7121,
+ 7131,10110,10115, 7125, 7155, 0, 7173, 0,28568, 1572,
+ 7213, 7227, 7241,10149, 7245, 6959, 7259, 6234, 0, 0,
+ 7274,10091,10093,28568, 0, 7168, 7282, 7300, 7304, 7322,
+ 7326, 7348, 7356,10133, 7360,10107, 7368, 7375, 7387, 7407,
+ 7414, 7419, 7423, 7434, 7450, 7454, 7463, 7467, 7482, 7497,
+ 7501, 7509, 7514, 7542, 7550, 7555, 7582, 7588, 7592, 7596,
+ 7601, 7629, 7634, 7639, 7666, 7673, 7680, 7684, 0, 0,
+
+ 0,10088,10099, 7646,10131, 7711, 7719, 7730, 7734, 0,
+ 7742, 7757, 7752, 7769,28568, 7782, 4686, 4874, 0, 7786,
+ 7142, 0, 7163, 7801, 7805, 7839, 7809,10089,10076,10084,
+ 10066,10085,10079, 1894,10068, 0, 2043, 4724, 7817, 7821,
+ 0,10063,10057,10039,10047,10027,10034,10012, 9999,10009,
+ 7831, 7844,28568, 0, 7848, 7856, 3744, 0, 7860,10063,
+ 7852, 7875, 0,28568, 7884,10005, 7898, 7902, 7888, 7927,
+ 10040, 7931, 7935,10039, 7939, 7960, 0, 7968, 0, 7976,
+ 7980, 7988, 0, 3819, 7995,10051, 7986, 2374, 4868,28568,
+ 8019, 3855, 4445, 4153,28568,28568,10057, 1573, 8023, 4126,
+
+ 28568,28568,28568,28568, 4659,10048,10046, 1603,10043, 1615,
+ 0, 4523,10021,28568,28568, 0, 2059,28568, 2081, 2185,
+ 3229,28568, 8027, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9970, 9969, 8031, 9974, 9955, 0, 8042,28568,28568,
+ 28568, 9951, 9950, 9956, 1631,10000, 1937, 8046, 8050, 8055,
+ 8069, 8073, 8077, 8081, 8089, 8097, 9923, 0, 0, 9936,
+ 9920, 9925, 9916, 9908, 9973,28568, 4194, 8101, 4401, 0,
+ 2790, 4910, 0, 0,28568, 0, 0, 0, 4154, 8105,
+ 0, 0, 0, 0, 8109, 8117, 9960, 8135, 8139,28568,
+ 0, 4413, 0, 0, 9898, 9900, 9895, 9898, 921, 9891,
+
+ 4429, 742, 2172, 9933, 9928, 2373, 4470, 0, 0, 9909,
+ 1935, 9908, 9914, 0, 0, 0, 0, 9941, 8124,28568,
+ 8147, 7235,28568,28568,28568,28568, 8154, 8164, 8172, 8178,
+ 28568, 8186, 4653,28568, 8193, 8207, 8221, 8235, 8239, 8243,
+ 9804, 8247, 8252, 9831, 8260, 9830, 8266, 8274, 0, 8294,
+ 0, 8302, 8306, 8314, 8319, 8332, 8339,28568,28568,28568,
+ 9799,28568, 0, 8344, 9833, 8332, 8355, 4446, 3825, 1930,
+ 28568, 0, 0, 9794, 9790, 9784,28568,28568,28568,28568,
+ 28568,28568,28568,28568, 0, 9794, 8340, 0, 0, 0,
+ 9793, 8346, 0, 9785, 8350, 0, 9780, 8355, 8378, 4552,
+
+ 28568, 8382,28568, 4715, 9714, 0, 9772, 8371, 0, 8402,
+ 28568,28568,28568, 8406, 8414, 8422, 0, 0, 0,28568,
+ 0, 0,28568, 0, 9700, 9708, 4866, 8428, 8432, 0,
+ 0, 0, 9696, 9695, 4617, 9672, 9689, 9684, 9679, 9651,
+ 9638, 4495, 9612, 8436, 8444, 8453, 9625, 8457, 8461, 8477,
+ 28568, 8487, 9616, 8482, 8503, 8511, 8495, 8519, 8523,28568,
+ 8535, 5447, 0, 5549, 9643, 9606, 8539, 9640, 8547, 8555,
+ 0, 8564, 0, 8572, 8576, 8584, 5878, 4714, 9594, 9593,
+ 5242, 4595, 9592, 9565, 9564, 9626, 4951, 5012, 9603, 9612,
+ 9611, 0, 4962, 9546, 4461,28568,28568,28568, 3455, 9533,
+
+ 9593, 9526, 9520, 4895, 9503, 9520, 9518, 9513, 9499, 6502,
+ 9550, 9535,28568, 4533, 5412, 0,28568,28568,28568, 5189,
+ 9485, 4857, 5442, 8588, 8592, 4414, 2162, 9515, 8602, 8609,
+ 8629, 8645, 8649, 8636, 8658, 0, 8667, 8675, 8681, 8693,
+ 8705,28568, 0, 5475,28568, 9527, 8710, 9481, 8719, 8725,
+ 9506, 3514,28568, 0, 0, 9501, 5677, 8737, 8750, 8754,
+ 8762, 8779, 8793, 0, 9506, 8797, 9471, 9444, 9445, 9446,
+ 9436, 9497,28568, 9496, 8791, 4430, 2424, 4453, 3753, 8824,
+ 8805, 8831, 1928, 9436, 4663, 9442, 9441, 9415, 9405, 9420,
+ 2067, 9402, 9399, 9409, 4622, 4945, 9404, 9405, 9383, 9390,
+
+ 9360, 9365, 4528, 9373, 9342, 9340, 4111, 9330, 9334, 9330,
+ 9318, 9322, 8819, 8839, 8850, 9330, 9324, 0, 8900, 8914,
+ 8856, 8928, 8932, 8944, 8957, 9354, 9339, 6166, 6516, 6608,
+ 3471, 7261, 7267, 7762, 4109, 0, 8961, 9309, 9297, 8971,
+ 28568, 9351, 8975, 8988, 8993, 9000, 9012, 9019, 9024, 9037,
+ 28568, 9031, 9044, 9050, 8613, 9289, 9090, 9094, 9098, 9103,
+ 9108, 9135, 9139, 9145, 9149, 9153, 9181, 9185, 9190, 9199,
+ 9227, 9231, 9235, 9241, 9268, 9273, 9277, 9281, 9287, 9314,
+ 9318, 9323, 9331, 9350, 9362, 9370, 9379, 9390, 9406, 9410,
+ 9417, 9421, 9425, 9457, 9464, 9469, 9292, 9275, 9058, 9452,
+
+ 9496, 7747, 9309, 9482, 9491, 9273, 9274, 9260, 9269, 9237,
+ 9238, 9214, 9194, 9201,28568, 0, 5520,28568, 9251, 8904,
+ 9190, 9184, 9006, 9168, 9154, 9159, 9154, 9194, 9166, 9525,
+ 28568, 9191, 9535, 9207,28568, 9200, 9524, 9064,28568, 9245,
+ 0, 9128, 9145, 9559, 9567, 9547, 9578, 0, 9582, 9179,
+ 28568, 9168, 9577, 4500, 4597, 9174, 4527, 4631, 9161, 9170,
+ 9090, 9105, 9100, 9086, 9085, 9062, 0, 3482, 9607, 9615,
+ 28568, 9513, 9623, 9631, 9437,28568,28568, 9059, 9062,28568,
+ 9590, 9639, 9102, 9100, 9093, 1389,28568, 9095, 9039, 9003,
+ 9006, 9017, 8998, 8994, 8955, 9011, 8988, 8974, 4824, 4535,
+
+ 8959, 8950, 8945, 8928, 8908, 8944,28568, 8939, 9625, 7575,
+ 9648, 8868, 7577, 9649, 8859, 8885, 8886, 9653, 9669, 9683,
+ 9687,28568, 0, 9691, 9701,28568, 8915,28568, 8914, 9687,
+ 4939, 4986, 8896, 3741, 8913, 8909,28568, 8898, 9700, 8876,
+ 28568, 8875, 9704, 8866,28568, 8856, 9708, 8854,28568, 8852,
+ 9721, 9713, 5377, 8837, 8790, 8837,28568, 8818, 9727, 8753,
+ 8747, 8756, 8736,28568, 8737, 8729, 8722, 8717, 8722, 8715,
+ 0, 8703, 9750, 9754, 9758, 9766, 9773, 8735, 8734, 8676,
+ 0, 9777, 5038, 8674, 8674, 8680, 4996, 996, 8675, 0,
+ 9860, 8651, 8630,28568, 8636, 8626, 8631, 8614, 8577, 8628,
+
+ 5550, 5709, 4981, 5212, 8568,28568,28568, 9785, 9791, 0,
+ 9796,28568, 8610,28568, 5258,28568, 9943, 9947,28568,28568,
+ 8594, 8610, 5427, 9959, 9821, 9972, 8595, 9829, 9984, 9833,
+ 8580, 9837, 8526, 8511, 8489, 8469, 8523,28568, 9970, 8506,
+ 8505,10054, 9997, 8460, 8455, 8454, 4979, 8461, 8446, 8454,
+ 8397, 8397, 8377, 8354, 8338, 8327, 8329, 8296, 8290, 8283,
+ 8268, 8252, 8261, 8264, 8261, 8241, 8249, 8212, 8227, 8197,
+ 8176, 1904, 8168, 8229, 8164, 8156, 8141, 8154, 8136, 8118,
+ 8110, 8127, 5702, 8105, 8096,10009,10023, 8134,10041, 9845,
+ 10068,10079,10002,28568,10085,10130, 8142,10127,10151, 8121,
+
+ 10165,28568, 7862, 4135,28568, 8135, 8036,28568, 8715, 5436,
+ 4589, 0, 8056, 8057, 0,10099,10169,10181,10194,10199,
+ 10206,10218,10225,10237,10231,10258,10249,10263,10277,10292,
+ 10296,10304,10312,10323,10388,10331,10358,10339,10419,10423,
+ 10432,10427,10459,10343,10463,10471,10476,10490,10503,10508,
+ 10522,10517,10535,10550,10555,10562,10567,10582,10594,10602,
+ 10610,10629,10640,10656,10660,10669,10673,10687, 8056, 8050,
+ 28568,28568, 8022, 8022,10093, 7994, 7992, 7995, 7991,10598,
+ 7999, 7969, 7965,10212, 7964, 7954, 7940, 7918,10370,28568,
+ 7920, 7964,10701, 5732, 7962,28568,10695, 7885, 0,10724,
+
+ 10729,10733, 7942,28568,10742, 7921, 7897, 5457, 7848, 7847,
+ 7856, 7849, 2764, 7841, 3493,10737,10742, 7834, 7794,10765,
+ 28568, 7807,28568, 7808, 7791, 3784, 7789, 7771, 0, 4817,
+ 5741, 7792,28568, 7779, 7782, 7780, 7804,28568,10759,10770,
+ 10774,10784, 7773, 7786,28568,10772, 7768,28568,28568, 0,
+ 7781,28568,10780, 7770,28568,10793, 7764,28568,10797, 7757,
+ 28568,10801, 5736,28568, 7696, 7736,28568,10814, 7680, 7657,
+ 7668, 0, 7660, 7664, 7637, 7642, 7626,10780,28568, 5172,
+ 5842, 7636, 7616, 7603, 7605,28568, 7649, 107,28568,10859,
+ 0, 455, 0, 481, 715, 1243, 1580, 1593, 4671, 5340,
+
+ 10885, 5464,10952,10956, 5778,10825,10847, 0,10968, 0,
+ 10981,10972,10998, 1627, 1650, 1878, 1951, 2066, 2079,28568,
+ 28568,11063,11008, 2031, 2050, 2081, 2076, 2139, 2277, 2278,
+ 2326, 2318, 2324, 2358, 2398, 3140, 3188,11016, 3180, 3205,
+ 3221, 3233, 3248, 3260, 3435, 3448, 3676, 3695, 3725, 3746,
+ 3765, 3803, 3812, 3822, 3820, 4971, 4085, 4118, 4168, 5436,
+ 4164, 4345, 4376, 4405,28568, 4421, 4417,11023,11034,11048,
+ 4536, 4577,11043,11076,28568,11061,11089, 4627, 5257, 0,
+ 4617,28568,11139,11143,11161,11165,11183,11187,11205,11223,
+ 11227,11211,11252,11256,11265,11298,11302,11307,11311,11315,
+
+ 11342,28568,11346, 4685, 4726,11354,11358,28568,11362,11390,
+ 11394,11398,11402,11410,11438,11442,11446,11452,11456,11484,
+ 11489,11497,11526,11533,11537,11541,11568,11572, 4819, 4815,
+ 11577,11581,11585,11613,11617,11621,11630,11649,11657,11663,
+ 11667,11676,28568, 4825, 4844, 4852, 4885, 4908, 4918, 4913,
+ 4959, 4984,11038, 4982, 4974, 5162,11103, 5164,11260,28568,
+ 0, 5233, 5266, 5223,28568,11694, 5277, 5371,28568,28568,
+ 11089,11501,28568, 0, 5314, 5327, 5333,28568, 5333, 5326,
+ 5334, 5344, 5350, 5351, 5357, 5356, 5511, 5863, 5387, 5556,
+ 5385,28568, 5452, 5464,11703, 5494, 5500,28568, 5501, 5506,
+
+ 5514, 5529, 5544, 5550, 5558, 5568, 0, 5605, 5658, 5659,
+ 5610, 5604,28568, 5610, 5616, 5628, 5646, 5644, 5646, 5652,
+ 5651, 5670, 5671, 5674, 5683, 5692, 5681, 5685, 5797, 5944,
+ 5696, 0, 5738,28568, 5707, 5699, 5710, 5727, 5723, 5802,
+ 5764, 5737, 5738, 5739, 5788, 5792, 5799, 5794,11723,11729,
+ 0,11741,11749, 5804, 5792,11247, 5828,11823,11754, 5835,
+ 5824, 5831, 5853, 5870, 5848, 5859, 5882, 5859, 5879,11712,
+ 5864,11758, 5873,11774,11767, 5873, 5900, 5896, 5899, 5908,
+ 5920, 5912, 5912, 5930, 5931, 5927, 5926, 5923, 5926, 5958,
+ 5959, 5953, 5962, 5948, 5963, 5968,11781, 6023, 5970, 5965,
+
+ 5971, 5971,11785,11796, 6004,11810, 6020, 5965,11816,11837,
+ 11841,11868,11904,11908,11926,11930,11949,11955,11967,11972,
+ 12004,12008,12012,28568,12016,12021,12048,12053, 5971, 5964,
+ 12060,12089,12096,12101,12107,12116,12134,12143,12148,12154,
+ 12161,12181,12188,12195,12199,12226,12231,12235,12239,12244,
+ 12271, 5983, 5982,12275,12279,12287,12306,12318,12322,12326,
+ 12335,28568,12353,12362,12369,12373,12400, 5981, 6005,11861,
+ 5998, 5997, 6012,12404, 6008, 6020,11961, 6020,12409,12427,
+ 12439,28568,12443, 6014, 6032,12451,28568,12455, 6034, 6022,
+ 6021,28568,28568, 6079, 6046, 6045, 6051,28568, 6101, 6153,
+
+ 6109, 6259, 6110, 6145, 6090, 6186, 6100, 6110, 6120, 6114,
+ 6130, 6139, 6130, 6138, 6132, 6144, 6145, 6157, 6150, 6151,
+ 6162, 6245, 6398,28568, 6166, 0, 6165, 6168, 6179, 6173,
+ 6185, 6223,28568, 6200, 6187, 6199, 6211, 6220, 6217, 6224,
+ 12459,12471, 6281,28568,12477,12484, 6247,12488,12496,12502,
+ 12507, 6243, 6255, 6251, 6246, 6268, 6274, 6275, 6262, 6313,
+ 6296, 6313,12511, 6303,12515, 6314,12521, 6325, 6326,12525,
+ 6332,12537, 6348, 6350,12542, 6332, 6340,12546, 6354, 6359,
+ 6357, 6345, 6351,12551, 6353,12555,12559, 6366, 6366,12567,
+ 6377, 6355, 6380, 6381,28568, 6377,12577,12582,12600,12604,
+
+ 12624,12628,12647,12651,12669,12674,12678,12682,12687,12720,
+ 6391, 6384,12724,12728,12739, 6403, 6397,12755,12766,12770,
+ 6436,12783,12800,12859,12812,12817,12827,12878,12891,12832,
+ 12895,12905,12922,12932,12949,12959,12963,12968,12976,12995,
+ 13008,13012, 6405, 6409, 6430,13021,13049,13054,28568,13058,
+ 13063,13067, 6420, 6414,13094,13098,13103,12844, 6432, 6437,
+ 13108,13112,13130, 6442, 6436, 6451,13134,28568,13138,13146,
+ 6454, 6458,13150,13154, 6467, 6474, 6468, 6536, 6488, 6475,
+ 6481, 6548, 6551, 6534, 6573, 0, 6537, 6619, 6511, 6641,
+ 6514, 6519, 6509, 6525, 6516, 6536, 6531, 6547, 6539, 6556,
+
+ 6550,28568,28568, 6549, 6566, 6567, 6570, 6573, 6597, 6583,
+ 28568, 6609, 0, 6604, 6611, 6610, 6623, 6621,13158,13168,
+ 6632,13176,13183,13187, 6632, 6638, 6639, 6636, 6626, 6636,
+ 13191, 6649, 6669, 6638, 6639,13195, 6654, 6648, 6645,13199,
+ 6641,13203, 6671, 6664,13214,13218,13226,13230,13234,13239,
+ 6677,13243, 6709, 6676,13247,13255, 6688, 6678,13259,13263,
+ 13272,13276, 6685, 6697,13292, 6708, 6740,13296,13300,13320,
+ 13324,13342,13347,13365,13369,13381,13387,13391,13395,13422,
+ 13428, 6700,13439,28568,13458, 6701, 6705,13463,13467, 6799,
+ 6715, 6719, 6726,13471, 6777,13475,13502,13507,13511,13515,
+
+ 13520,13538,13547,13551,13555,13567,13582,13587,13592,13600,
+ 13619,13628,13632,13637, 6734, 6757,13646,13664,13673,13680,
+ 13684, 6762, 6747,13691,13698,13718, 6746, 6762, 6771,13725,
+ 13731,13740, 6771,13744, 0, 6779, 6769, 6829, 0,28568,
+ 28568, 6788, 6841, 0, 6811, 0, 6812, 6908,13756, 6785,
+ 6799, 6805, 6804, 6796, 6808, 6821, 6810, 6884, 6885, 6805,
+ 6829, 6830,28568, 6838, 6835, 6846, 6865, 6856,13762,13769,
+ 13773,13787, 6865, 6877, 6870,13791, 6877, 6873,13795, 6881,
+ 6899, 6889,13799,13804, 6881, 6886,13812,13816, 6896,13820,
+ 13824,13828,13836, 6897,13840,13845, 6903, 6898, 6986,13853,
+
+ 7007, 7021, 7000,13857,13865,13869,13873, 7010,13877,13885,
+ 13889,13907,13914,13920,13949,13953,13933,13971,13983,13987,
+ 6999, 7015,13991,13998,14002, 7060, 7020, 7005, 7019,28568,
+ 14018,14025,14031,14035,14062,14088,14066,14107,14119,14123,
+ 14134,14154,14162,14173,14071, 7010,14181,14075, 7035, 7016,
+ 14189, 7014, 7027,14208, 7051,14127,14216,14220,14227,14235,
+ 14239,14249,14253, 7034, 0,28568, 0, 7073, 7079, 7132,
+ 7183,14257, 7038, 7051, 7051, 7065, 7068, 7079, 7221, 7332,
+ 7177, 7070, 7092, 7114, 7125, 7125, 7140,14261,14265,14271,
+ 14279, 7134, 7158,14286,14290, 7160,14294,14298, 7160,14304,
+
+ 7163,14308,14312,14316,14320,14324,14328,14334, 7179, 7163,
+ 7161,14338,14342, 7209, 7182,14349,14353,14357,14361,14379,
+ 14391,14395,14415,14419,14427,14431,14435, 7183,14439,14446,
+ 28568, 7255, 7196, 7199, 7219,14458,14466,14470,14474,28568,
+ 14544, 7264, 7262,14478,14497,14627,14505,14631,14509,14635,
+ 14639,14643,14647,14516,28568,14676,14681, 7225, 7223, 7239,
+ 7241,14538,14691, 7246, 7313, 7331, 7391,28568, 7397,28568,
+ 7249, 7252, 7242, 7267, 7258, 7342,28568, 7273, 7273, 7263,
+ 7283, 7274,14696,14563,14709, 7298,14721,14725,14729,14734,
+ 14739, 7306, 7310,14743,14747,14751,14756, 7339, 7308,14760,
+
+ 14765,14769, 7329, 7330, 7362, 7333,14774,14779,14792,14796,
+ 14804, 7340, 7361, 7361,14810, 7364, 7357, 0,14814,14824,
+ 14828,14842,14855,14859,14871,14875,14884,14889,14893,14902,
+ 28568,14922,14926, 7359, 7378, 7375, 7519, 7534, 7364, 7381,
+ 7382, 7383, 7407, 7407,14930,14937,14941, 7402,14955,14959,
+ 7420, 7444, 7416,14966,14970, 7444, 7424, 7447,14974,14982,
+ 14994,14986, 7432, 7452, 7447,15000,15006,28568,15010,15014,
+ 15021,15028,15041,15046,15058,15073,15077,28568,15085, 7454,
+ 7564, 0, 7610, 0, 7451, 7453,15093,15098, 7476, 7487,
+ 7500,15102, 7508, 7488, 7517,15106,15110,15116,15134, 7497,
+
+ 7498,15139,15143,15147,15151,15155,15159,15186,28568, 7518,
+ 0, 0,15194,15198, 7518, 7563,15202,15206, 7569, 7543,
+ 15212, 7547, 7567,15216,15230,15234, 7572,15238,15242, 7571,
+ 7596,15246,15250,15262, 7578,15271,15280,15284, 7595,15288,
+ 15298,15309, 7613,15313,15318,15323,15327,28568,15342,15346,
+ 15350,15354,15358,15362,15366,28568,15370,15378,15384,15389,
+ 15393, 7592, 7602,15399,15404, 7602,15408,15414,15422,15433,
+ 15439,15443,15451,28568,15455,15464,15472,15480,15484,15489,
+ 15493,15497,15505,15509,15514,15522,15526,15534,15538,15542,
+ 15547,15551,15559,15567,15571,15576,15580,15584,15592,15596,
+
+ 15601,15609,15613,15621,15625,15629,15634,15638,15646,15654,
+ 15658,15663,15667,15671,15679,15683,15688,15696,15700,15708,
+ 15712,15716,15721,15725,15733,15741,15745,15750,15754,15758,
+ 15766,15770,15775,15783,15787,15795,15799,15803,15808,15812,
+ 15820,15828,15832,15837,15841,15845,15853,15857,15862,15870,
+ 15874,15882,15886,15890,15895,15899,15907,15915,15919,15924,
+ 15928,15932,15940,15944,15949,15957,15961,15969,15973,15977,
+ 15982,15986,15994,16002,16006,16011,16015,16019,16027,16031,
+ 16036,16044,16048,16056,16060,16064,16069,16073,16081,16089,
+ 16093,16098,16102,28568,16124,16156,16188,16220,16252,16284,
+
+ 16316,16348,16380,16412,16444,16476,16508,16540,16572,16604,
+ 16636,16668,16700,16732,16764,16796,16828,16860,16892,16924,
+ 16956,16988,17020,17052,17084,17116,17148,17180,17212,17244,
+ 17276,17308,17340,17372,17404,17436,17468,17500,17532,17564,
+ 17596,17628,17660,17692,17724,17756,17788,17820,17852,17884,
+ 17916,17948,17980,18012,18044,18076, 7666,18107,18138,18169,
+ 18200,18231,18262,18294,18325,18356,18387, 7671, 7685, 7687,
+ 18409,18441, 7694, 7894, 7718, 7928, 7757, 7934,18472, 7805,
+ 18503, 7979,18535,18566,18597,18628, 7980, 8195,18659,18691,
+ 18723,18754,18785,18816, 7831, 7981, 7895, 8099,18848,18880,
+
+ 18912, 7923,18943,18974,19005,19036,19068,19100,19132,19164,
+ 19196,19228,19260, 7943, 8100,19292, 7944,19310, 8063,19341,
+ 8101,19372, 8140, 8175,19404, 8146,19431, 8181, 8197,19463,
+ 8196, 8242,19495, 8248,19526,19558, 8257,19574, 8258, 8268,
+ 8269, 8364, 8270, 8396,19606,19637,19668,19699,19730,19761,
+ 19792,19823,19855,19887,19919, 8306, 8478, 8307, 8529,19951,
+ 19983,20015,20047,20079,20111,20143,20175,20207,20239, 8358,
+ 20271, 8538,20303,20335,20367,20399,20431,20462, 8390,20493,
+ 20525,20556, 8418,20587,20618,20649,20680,20711,20743,20775,
+ 20807,20839,20870,20901,20932,20963, 8420,20994,21025,21056,
+
+ 21087,21118,21150,21181,21212, 8444,21243, 8603,21265, 8485,
+ 8576,21297, 8658, 8753, 8755,21328,21359,21390,21421, 8657,
+ 8754, 8822,21453,21485,21517,21548,21579, 8445,21610,21642,
+ 21673,21704, 8479, 8821, 8539,21735,21767,21798,21829, 8577,
+ 21860, 8845, 8862,21892,21924,21956,21988,22020,22051,22082,
+ 22113, 9056, 8634,22144,22176,22208,22240,22272,22304,22336,
+ 22368, 9276,22400,22418, 8888,22449,22480,22511,22542, 9280,
+ 22574,22601, 9307,22633, 9353,22665,22696,22728,22744,22775,
+ 9420, 9589, 9628,22799,22831,22862,22893,22924,22955,22987,
+ 23018,23049, 9797, 8667,23080,23112,23144,23176,23208,10005,
+
+ 10036,23240,23272,23304,23336,23368,23400,23432,23464,23496,
+ 23528,23560,23592,10016,23624,23656,23688,23720,23752,23784,
+ 23815,23846,23878,23909,23940,23971,24002, 8701,10163,24033,
+ 10092, 8702,24064,24096,24128, 8920,24160,24192,24223,24254,
+ 24285,24316,10287,24347,24378,24409,24440,24472,24504,24535,
+ 24566, 8957, 9047,10422,24588,24619,24650,24681,24712, 9053,
+ 10353,10622,24744,24775,24806,24838,24869,24900,24931,24962,
+ 24993,25017,25049,10466, 9480,25080,25111,25142,25173,10670,
+ 25205,25237,25269,25301,25332,25363,25394,10774,25425,25457,
+ 10964,25489, 9091,25507,25538,25569,25600, 9651,25631,25639,
+
+ 25671,25703,25734,25765,10982,25796,25828, 9783,25860,25892,
+ 25924,25956,25988,26020,26052,26083,26114,11180,10991,26145,
+ 26177, 9093,26209,26240,11101,26271,26302,11255,26324,26355,
+ 26386,26417,26448,26479,11266,26510,26542,26573,26604,26635,
+ 26666,26697,26722,26753,26777,26809, 9095,26840,26871,26902,
+ 11310,26934,26966,26998,27030,27061,27092,27124,11492,27156,
+ 27174,27205, 9136,27221,27253,27284,27316, 9182,27348,27380,
+ 27412,27444,27476,27508,27540,27571,27603,27635,27666,27688,
+ 27719,11502, 9230,27750,27781,27812,27843,27874,27897,27922,
+ 27954,27986,28017,28048,28079,11536,28111,28142,28173,28205,
+
+ 28221,28252,28284,28316,28347,11578,28378,28409,28440,11147,
+ 9819, 9820,11677,28472,11705,11749,28504, 9232,28535,11149,
+ 11151,11806,11835
+ } ;
+
+static yyconst flex_int16_t yy_def[4224] =
+ { 0,
+ 3695, 3695, 3694, 3, 3696, 3696, 3694, 7, 3694, 9,
+ 3694, 11, 3694, 13, 3695, 3695, 3694, 17, 3697, 3697,
+ 3694, 21, 3698, 3698, 3694, 25, 3694, 27, 3699, 3699,
+ 3695, 3695, 3700, 3700, 3694, 35, 3701, 3701, 3694, 39,
+ 3694, 41, 3695, 3695, 3695, 3695, 3702, 3702, 3703, 3703,
+ 3704, 3704, 3694, 53, 3705, 3705, 3706, 3706, 3707, 3707,
+ 3707, 3707, 3707, 3707, 3694, 65, 3694, 67, 3708, 3708,
+ 3708, 3708, 3695, 3695, 3709, 3709, 3709, 3709, 3710, 3710,
+ 3711, 3711, 3695, 3695, 3712, 3712, 3713, 3713, 3695, 3695,
+ 3695, 3695, 3714, 3714, 3695, 3695, 3695, 3695, 3715, 3715,
+
+ 3716, 3716, 3694, 103, 3717, 3717, 3718, 3718, 3719, 3719,
+ 3694, 111, 3694, 113, 3694, 115, 3694, 117, 3720, 3720,
+ 3695, 3695, 3721, 3721, 3694, 125, 3722, 3722, 3694, 129,
+ 3723, 3723, 3694, 133, 3724, 3724, 3694, 137, 3725, 3725,
+ 3695, 3695, 3695, 3695, 3695, 3695, 3694, 147, 3694, 149,
+ 3695, 3695, 3694, 153, 3694, 155, 3726, 3726, 3694, 159,
+ 3695, 3695, 3695, 3695, 3694, 165, 3695, 3695, 3727, 3727,
+ 3694, 171, 3728, 3728, 3695, 3695, 3729, 3729, 3730, 3730,
+ 3731, 3731, 3694, 183, 3694, 185, 3732, 3732, 3732, 3732,
+ 3733, 3733, 3733, 3733, 3734, 3734, 3735, 3735, 3736, 3736,
+
+ 3737, 3737, 3738, 3738, 3739, 3739, 3694, 207, 3740, 3740,
+ 3741, 3741, 3742, 3742, 3743, 3743, 3744, 3744, 3744, 3744,
+ 3745, 3745, 3730, 3730, 3746, 3746, 3747, 3747, 3748, 3748,
+ 3749, 3749, 3694, 233, 3694, 235, 3750, 3750, 3694, 239,
+ 3751, 3751, 3752, 3752, 3753, 3753, 3754, 3754, 3755, 3755,
+ 3756, 3756, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3757,
+ 3758, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3759, 3760, 3761, 3694, 3694, 3762, 3694, 3763,
+ 3694, 3764, 3694, 3765, 3766, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3767, 3767, 3767, 3694, 3694, 3694, 3694,
+
+ 3768, 3694, 3694, 3694, 3694, 3769, 3770, 3771, 3771, 3694,
+ 3772, 3773, 3694, 3774, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3775, 3694,
+ 3694, 3694, 3776, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3777, 3694, 3694, 3778, 3694,
+ 3779, 3694, 3779, 3780, 3694, 3694, 3694, 3694, 3781, 3782,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3783, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3784, 3694, 3785, 3694,
+ 3694, 3786, 3694, 3694, 3694, 3694, 3787, 3694, 3694, 3694,
+
+ 3694, 3694, 3788, 3789, 3789, 3790, 3694, 3789, 3789, 3789,
+ 3789, 3789, 3789, 3789, 3789, 3789, 3789, 3789, 3789, 3789,
+ 3789, 3789, 3789, 3789, 3789, 3694, 3791, 3694, 3791, 3791,
+ 3791, 3791, 3694, 3694, 3694, 3792, 3793, 3694, 3794, 3694,
+ 3694, 3694, 3694, 3795, 3694, 3694, 3694, 3694, 3694, 3796,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 483, 3797, 3694, 3694, 3694, 3798, 3798,
+ 3798, 3798, 3798, 3798, 3798, 3798, 3798, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3799, 3799, 3694, 3694, 3694, 3800, 3801,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3802, 3694, 3803,
+ 3803, 3694, 3694, 3804, 3805, 3694, 3806, 3807, 3807, 3694,
+ 3694, 3694, 3808, 3694, 3694, 3694, 3694, 3694, 3807, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3809, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3810, 3810,
+ 3810, 3810, 3810, 3694, 3810, 3811, 3694, 3811, 3811, 3811,
+ 3811, 3811, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3812, 3694, 3812, 3812, 3812, 3694, 3694, 3813, 3694, 3813,
+ 3813, 3813, 3813, 3814, 3694, 3815, 3815, 3815, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3816, 3694, 3694, 3816, 3816, 3816, 3694,
+ 3694, 3694, 3816, 3817, 3694, 3818, 3819, 3820, 3821, 3822,
+ 3694, 3694, 3823, 3694, 3824, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3825, 3694, 3694, 3694, 3826, 3827, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3828, 3694, 3694, 3694,
+
+ 3694, 3829, 3694, 3830, 3694, 3694, 3830, 3830, 3830, 3831,
+ 3694, 3694, 3694, 3832, 3694, 3833, 3833, 3833, 3833, 3833,
+ 3694, 3833, 3834, 3694, 3694, 3694, 3835, 3836, 3836, 3836,
+ 3836, 3836, 3694, 3836, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3837, 3694, 3838, 3838, 3838, 3839,
+ 3840, 3694, 3694, 3694, 3694, 3694, 3841, 3842, 3843, 3844,
+ 3694, 3694, 3694, 3694, 3694, 3845, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3846, 3846,
+ 3846, 3847, 3694, 3694, 3848, 3848, 3848, 3848, 3694, 3694,
+ 3694, 3694, 3694, 3849, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3850, 3694,
+ 3694, 3851, 3694, 3694, 3694, 3852, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3853, 3854, 3694, 3694, 3694,
+ 3694, 3855, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3856, 3857, 3858, 3694, 3859,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3860, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3861, 3694, 3694,
+ 3862, 3694, 3694, 3862, 3863, 3694, 3694, 3862, 3864, 3694,
+ 3694, 3864, 3865, 3694, 3694, 3694, 3866, 3694, 3694, 3866,
+ 3867, 3694, 3694, 3694, 3868, 3694, 3694, 3868, 3869, 3694,
+
+ 3694, 3694, 3868, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3870, 3871,
+ 3694, 3694, 3872, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3873, 3694, 3694, 3873, 3694, 3873, 3874, 3694,
+ 3694, 3875, 3875, 3694, 3694, 3694, 3694, 3694, 3876, 3694,
+ 3876, 3876, 3876, 3694, 3876, 3694, 3876, 3694, 3877, 3694,
+ 3877, 3877, 3877, 3877, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3878,
+
+ 3878, 3694, 3694, 3879, 3694, 3694, 3694, 3880, 3881, 3882,
+ 3882, 3883, 3884, 3694, 3694, 3694, 3694, 3885, 3694, 3694,
+ 3694, 3694, 3694, 3886, 3694, 3694, 3887, 3694, 3694, 3694,
+ 3694, 3694, 3888, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3889, 3694, 3889, 3889, 3889,
+ 3889, 3890, 3890, 3694, 3890, 3890, 3890, 3694, 3694, 3890,
+ 3694, 3694, 3890, 3891, 3694, 3892, 3694, 3892, 3892, 3694,
+ 3892, 3694, 3694, 3694, 3694, 3892, 3694, 3694, 3694, 3893,
+ 3694, 3694, 3893, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3894, 3694, 3694, 3895, 3895, 3896, 3694, 3895, 3897,
+ 3898, 3894, 3894, 3899, 3900, 3897, 3694, 3694, 3694, 3898,
+ 3694, 3694, 3694, 3901, 3901, 3902, 3694, 3694, 3694, 3694,
+ 3903, 3903, 3694, 3904, 3904, 3905, 3904, 3906, 3907, 3694,
+ 3694, 3694, 3906, 3694, 3694, 3694, 3907, 3907, 3907, 3908,
+ 3694, 3694, 3908, 3909, 3694, 3910, 3909, 3911, 3909, 3912,
+ 3694, 3913, 3913, 3694, 3694, 3694, 3694, 3694, 3914, 3914,
+ 3915, 3915, 3916, 3916, 3916, 3917, 3917, 3694, 3694, 1179,
+ 3916, 3917, 3917, 3918, 3919, 3694, 3694, 3694, 3920, 3918,
+ 3694, 3921, 3921, 3922, 3694, 3694, 3694, 3694, 3923, 3924,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3925, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3926, 3926, 3927,
+ 3694, 3694, 3694, 3694, 3926, 3928, 3929, 3930, 3694, 3694,
+ 3931, 3931, 3694, 3694, 3932, 3694, 3694, 3694, 3933, 3934,
+ 3928, 3694, 3694, 3694, 3935, 3936, 3936, 3936, 3936, 3936,
+ 3936, 3694, 3929, 3694, 3929, 3925, 3694, 3929, 3929, 3929,
+ 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
+ 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
+ 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3937, 3937,
+
+ 3937, 3694, 3694, 3694, 3694, 3938, 3938, 3939, 3938, 3940,
+ 3941, 3940, 3694, 3941, 3694, 3694, 3694, 3694, 3942, 3694,
+ 3694, 3942, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3943, 3694, 3694, 3694, 3694,
+ 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943,
+ 3694, 3694, 3694, 3944, 3944, 3694, 3694, 3945, 3945, 3946,
+ 3947, 3694, 3948, 3694, 3694, 3694, 3949, 3694, 3950, 3949,
+ 3694, 3949, 3694, 3694, 3951, 3951, 3952, 3951, 3953, 3954,
+ 3953, 3954, 3955, 3955, 3694, 3956, 3957, 3694, 3694, 3694,
+ 3694, 3694, 3955, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3958, 3958, 3694, 3694, 3694, 3958, 3959, 3694, 3959, 3959,
+ 3959, 3694, 3694, 3960, 3960, 3960, 3961, 3961, 3961, 3962,
+ 3962, 3962, 3962, 3694, 3694, 3694, 3963, 3694, 3694, 3694,
+ 3694, 3963, 3963, 3963, 3964, 3965, 3964, 3966, 3694, 3967,
+ 3966, 3968, 3694, 3968, 3969, 3694, 3694, 3970, 3970, 3694,
+ 3694, 3694, 3694, 3694, 3971, 3694, 3972, 3694, 3972, 3973,
+ 3694, 3694, 3973, 3974, 3694, 3974, 3974, 3975, 3694, 3694,
+ 3975, 3976, 3976, 3976, 3977, 3694, 3694, 3694, 3977, 3694,
+ 3978, 3694, 3978, 3978, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3979, 3979, 3694, 3980, 3979, 3979, 3981, 3981, 3694,
+ 3694, 3694, 3694, 3982, 3982, 3983, 3983, 3984, 3985, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3986, 3986, 3987, 3694,
+ 3694, 3987, 3694, 3694, 3988, 3988, 3988, 3989, 3694, 3989,
+ 3990, 3694, 3991, 3694, 3694, 3694, 3992, 3992, 3993, 3992,
+ 3994, 3995, 3994, 3995, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3996, 3694, 3997, 3694, 3998, 3999, 3694, 3694, 3694, 3694,
+ 3694, 4000, 4000, 4001, 4001, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 4002, 4003, 4004, 4002, 4002, 4005,
+ 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013, 4011, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 4014, 4015, 4016, 4014, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 4017, 4017, 4017, 3694,
+ 4018, 4019, 3694, 4019, 3694, 3694, 4019, 3694, 3694, 4020,
+ 4020, 4020, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 4021, 4021, 4022, 4023, 4024, 3694, 3694,
+ 3694, 4024, 4023, 3694, 4025, 4025, 4026, 4027, 3694, 3694,
+ 4027, 3694, 4028, 3694, 4029, 3694, 3694, 3694, 4030, 4030,
+ 4031, 4030, 4032, 4033, 4032, 4033, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 4034, 3694, 3694, 3694, 4034,
+ 4034, 4035, 4035, 4035, 3694, 3694, 3694, 3694, 4035, 4035,
+
+ 4036, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4035,
+ 4037, 3694, 3694, 4037, 3694, 4038, 3694, 3694, 3694, 3694,
+ 3694, 3694, 4038, 3694, 3694, 3694, 3694, 3694, 3694, 4039,
+ 4040, 3694, 4041, 4042, 4042, 4043, 4044, 4045, 3694, 4046,
+ 4047, 3694, 4048, 3694, 3694, 4049, 4050, 3694, 4051, 4051,
+ 3694, 3694, 3694, 4052, 4053, 4054, 4055, 4056, 4057, 4057,
+ 4058, 4058, 4059, 4060, 4061, 4058, 4062, 3694, 3694, 3694,
+ 3694, 4063, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 4064, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 4065, 3694, 3694, 3694, 4066, 3694, 4067,
+ 4068, 3694, 3694, 4069, 4070, 3694, 4071, 3694, 3694, 4072,
+ 3694, 3694, 3694, 4073, 3694, 4074, 4064, 3694, 3694, 3694,
+ 3694, 4075, 4076, 4076, 4076, 4076, 4076, 4076, 4076, 4076,
+ 3694, 4077, 4077, 4077, 3694, 3694, 4077, 4077, 4077, 4077,
+ 4077, 4077, 4077, 4077, 4077, 4077, 4077, 4077, 4077, 4077,
+ 4077, 4077, 4077, 4077, 4077, 4077, 4077, 4077, 4077, 4077,
+ 4077, 4077, 4077, 4077, 4077, 4077, 4077, 4077, 4077, 4077,
+ 4077, 4077, 4077, 4077, 4077, 4077, 3694, 3694, 3694, 4078,
+
+ 4079, 3694, 4072, 3694, 4073, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 4072, 3694, 3694, 4073, 3694,
+ 4080, 4080, 4080, 4080, 4080, 4080, 4080, 4080, 4080, 3694,
+ 3694, 4081, 4082, 4083, 3694, 3694, 3694, 3694, 3694, 3694,
+ 4084, 3694, 3694, 4085, 4085, 4086, 4087, 4088, 4089, 4090,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 4091, 4091, 3694, 4092, 4092, 4092, 4093, 4094, 4095, 4095,
+ 3694, 4096, 4097, 4097, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 4072, 3694, 4073, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 4098, 4099, 3694, 4100, 4100,
+
+ 3694, 3694, 3694, 3694, 3694, 4101, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 4102, 3694, 4103, 4103, 3694,
+ 4104, 3694, 4105, 4106, 3694, 3694, 4107, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 4108, 4109, 3694, 3694, 3694, 4110,
+ 3694, 3694, 3694, 4111, 3694, 3694, 3694, 4112, 3694, 3694,
+ 3694, 4113, 3694, 3694, 3694, 4114, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 4115, 3694, 4116, 3694, 3694, 3694, 4117, 4118, 3694, 3694,
+ 4119, 4120, 3694, 3694, 3694, 3694, 3694, 4121, 4121, 4122,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4123,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4124, 4125,
+ 4126, 3694, 3694, 3694, 3694, 3694, 4127, 4127, 3694, 3694,
+ 4128, 3694, 4129, 4130, 4131, 4130, 3694, 4132, 4133, 4134,
+ 4135, 4136, 3694, 3694, 3694, 3694, 4137, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 4138, 4138, 3694, 4139, 4140,
+ 4140, 4141, 3694, 3694, 4142, 4142, 3694, 4143, 4140, 4144,
+
+ 3694, 3694, 3694, 3694, 3694, 4145, 3694, 3694, 3694, 3694,
+ 3694, 4146, 3694, 3694, 4147, 4148, 4149, 4149, 4149, 4149,
+ 4149, 4149, 4149, 4149, 4150, 4150, 4150, 4150, 4150, 4150,
+ 4150, 4150, 4150, 4150, 4150, 4150, 4150, 4150, 4150, 4150,
+ 4150, 4150, 4150, 4150, 4150, 4150, 4150, 4150, 4150, 4150,
+ 4150, 4150, 4150, 4150, 4150, 4150, 3694, 4150, 4150, 4150,
+ 4150, 4150, 4150, 4150, 4150, 4150, 4150, 4150, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 4151, 4151, 3694, 4151, 4151, 4151, 4151, 3694, 3694,
+ 4151, 4152, 3694, 4153, 4154, 3694, 3694, 3694, 4155, 3694,
+
+ 4156, 4157, 4158, 3694, 3694, 3694, 3694, 3694, 4159, 4159,
+ 3694, 4160, 4160, 4160, 4161, 4162, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4163, 4164,
+ 4164, 3694, 3694, 3694, 3694, 3694, 4165, 3694, 3694, 3694,
+ 3694, 4166, 3694, 4167, 3694, 3694, 3694, 3694, 3694, 4168,
+ 4169, 3694, 3694, 4170, 3694, 3694, 4171, 3694, 3694, 4172,
+ 3694, 3694, 4173, 3694, 3694, 4174, 3694, 3694, 3694, 3694,
+ 3694, 4175, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 4176, 3694, 3694, 3694, 3694, 3694, 4177, 4177, 3694, 3694,
+ 2390, 3694, 4178, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 4179, 4179, 4180, 4181, 4181, 4182, 3694, 4183,
+ 4183, 4184, 4185, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4186, 3694, 4187,
+ 3694, 4188, 3694, 4189, 3694, 4190, 4190, 4191, 4191, 4192,
+ 3694, 3694, 4193, 4194, 4194, 4194, 4194, 4194, 4194, 4194,
+ 4194, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195,
+
+ 4195, 3694, 3694, 3694, 3694, 4195, 3694, 3694, 4195, 4195,
+ 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195,
+ 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 3694, 3694,
+ 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195,
+ 4195, 4195, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 4196, 4196, 4196, 4196, 4196, 4196, 4196, 3694, 3694,
+ 4197, 3694, 3694, 3694, 3694, 4198, 3694, 3694, 3694, 3694,
+ 4199, 4199, 3694, 4200, 4200, 4200, 4200, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 4201, 4201, 3694, 3694,
+ 3694, 3694, 3694, 3694, 4202, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 4203, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 4204, 4204, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4205, 4205,
+ 4206, 4207, 4208, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 4209, 4209, 4188, 3694, 4191, 3694, 4194, 4194,
+ 4194, 4194, 4194, 4194, 4194, 4194, 4194, 4195, 4195, 4195,
+ 4195, 4195, 3694, 3694, 4195, 3694, 4195, 4195, 3694, 3694,
+ 3694, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195,
+ 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195, 4195,
+ 4195, 3694, 3694, 4195, 4195, 4195, 4195, 4195, 4195, 4195,
+ 3694, 3694, 3694, 3694, 4195, 4195, 4195, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 4196, 3694, 4196, 4196, 4196,
+ 3694, 3694, 4196, 4196, 3694, 4198, 3694, 4199, 4200, 4200,
+ 4200, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4201,
+
+ 3694, 4210, 3694, 4203, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 4204, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 4205, 3694, 3694, 3694, 4208, 3694, 3694, 3694, 3694, 2658,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 4194, 4194, 4194, 4194,
+
+ 4194, 4194, 4194, 4194, 4195, 4195, 4195, 4195, 4195, 4195,
+ 3694, 3694, 3694, 3694, 4195, 3694, 3694, 4195, 4195, 3694,
+ 3694, 3694, 4195, 4195, 4195, 3694, 4195, 4195, 3694, 3694,
+ 4195, 4195, 3694, 4195, 4195, 4195, 4195, 4195, 3694, 3694,
+ 4195, 4195, 3694, 3694, 2924, 4195, 3694, 3694, 3694, 4195,
+ 4195, 4195, 3694, 3694, 4195, 4195, 4195, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 4196, 4196, 3694, 3694, 3694, 3694,
+ 4196, 3694, 4198, 4199, 4200, 4200, 4200, 4211, 3694, 3694,
+ 3694, 4212, 4201, 3694, 4210, 4213, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 4214, 3694, 3694, 3694, 3694, 3694, 4208, 3694,
+ 3694, 3694, 2658, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4194, 4194, 4194,
+ 4194, 4194, 4194, 3694, 4194, 4195, 4195, 4195, 4195, 4195,
+ 3694, 3694, 3694, 3694, 4195, 3694, 3694, 4195, 4195, 3694,
+ 3694, 3694, 3694, 3694, 3694, 4195, 4195, 4195, 4195, 3694,
+
+ 3694, 3694, 3694, 4195, 3694, 3694, 4195, 4195, 4195, 4195,
+ 4195, 3694, 4195, 4195, 3694, 3694, 4195, 3694, 3694, 3694,
+ 4195, 3694, 3694, 4195, 3694, 3694, 3694, 3694, 3694, 4196,
+ 4196, 4196, 3694, 4198, 4200, 4200, 4200, 4211, 4215, 3694,
+ 3694, 3694, 4212, 4216, 3694, 4213, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4208, 3694,
+ 2658, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4194,
+ 4194, 4194, 3694, 4194, 4194, 4194, 4195, 4195, 3694, 4195,
+ 3694, 3694, 4195, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 4195, 3694, 4195, 3694, 3694, 4195, 3694, 4195, 4195, 4195,
+ 3694, 4195, 4195, 4195, 3694, 3694, 4195, 3694, 3694, 3694,
+ 3694, 3694, 3694, 4195, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 4198, 4200, 4215, 3694, 4216, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4208, 3694, 2658,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4217, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4194, 4194, 3694,
+ 4194, 3694, 3694, 4195, 4195, 4195, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 4195, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 4195, 4195, 4195, 4195, 3694, 3694, 4195,
+ 4195, 4195, 4195, 3694, 3694, 3694, 4195, 3694, 3694, 3694,
+ 3694, 3694, 3694, 4200, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 4208, 2658, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 4217, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 4194, 3694, 3694, 4195,
+ 3694, 3694, 3694, 3694, 4195, 3694, 3694, 4218, 4219, 4219,
+ 4195, 4195, 3694, 3694, 3694, 4195, 4195, 4195, 4195, 3694,
+ 3694, 4195, 3694, 3694, 3694, 4200, 4220, 4221, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2658, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4194,
+ 4195, 3694, 3694, 3694, 3694, 3694, 4219, 3694, 4195, 4195,
+ 3694, 4195, 4195, 4195, 3694, 3694, 3694, 3694, 3694, 3694,
+ 4220, 4222, 4221, 4223, 3694, 3694, 2658, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 4194, 3694, 3694,
+
+ 3694, 4195, 3694, 3694, 4195, 4195, 3694, 3694, 3694, 3694,
+ 4222, 4223, 2658, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 4194, 3694, 3694, 3694, 4195, 4195, 3694, 2658, 3694, 3694,
+ 3694, 3694, 4194, 3694, 3694, 4195, 3694, 3694, 3694, 2658,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2658, 3694, 3694, 3694, 3694, 3694, 3694, 2658, 3694,
+ 3694, 3694, 3694, 2658, 3694, 3694, 2658, 3694, 3694, 2658,
+ 3694, 3694, 3694, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694, 2658, 3694,
+ 2658, 3694, 2658, 0, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694
+ } ;
+
+static yyconst flex_int16_t yy_nxt[28653] =
+ { 0,
+ 3694, 3694, 255, 3694, 255, 3694, 256, 257, 256, 257,
+ 1240, 258, 3694, 258, 1240, 1088, 1098, 1099, 3694, 259,
+ 1089, 259, 254, 254, 255, 254, 254, 254, 256, 257,
+ 260, 254, 254, 258, 254, 254, 254, 254, 254, 254,
+ 254, 259, 254, 254, 254, 254, 254, 254, 254, 254,
+ 254, 254, 254, 254, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 254, 254, 254, 254, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 254, 254, 254, 261, 263, 264, 263, 263,
+ 1096, 265, 266, 1238, 1239, 1097, 267, 263, 264, 263,
+ 263, 255, 265, 266, 268, 316, 317, 267, 1141, 1446,
+ 318, 319, 320, 1142, 1123, 268, 255, 1123, 321, 1151,
+ 378, 379, 1397, 1398, 1152, 380, 322, 255, 323, 1088,
+ 381, 256, 257, 382, 1089, 1091, 258, 269, 1091, 1168,
+ 383, 1462, 1168, 1446, 259, 1463, 1092, 2633, 269, 254,
+ 270, 271, 272, 270, 273, 256, 257, 274, 254, 254,
+ 258, 254, 254, 254, 254, 254, 254, 275, 259, 254,
+ 254, 254, 254, 254, 276, 277, 254, 254, 254, 254,
+
+ 254, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+ 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+ 254, 254, 254, 254, 278, 278, 278, 278, 278, 278,
+ 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+ 278, 278, 278, 278, 278, 278, 278, 278, 278, 279,
+ 254, 280, 278, 254, 281, 282, 283, 281, 284, 256,
+ 257, 285, 254, 286, 258, 287, 254, 286, 288, 289,
+ 288, 254, 290, 254, 254, 254, 254, 254, 291, 286,
+ 292, 286, 254, 254, 293, 294, 294, 294, 294, 294,
+ 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,
+
+ 294, 294, 294, 294, 287, 254, 254, 254, 294, 295,
+ 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,
+ 294, 294, 294, 294, 294, 294, 296, 294, 294, 294,
+ 294, 294, 294, 279, 254, 284, 294, 297, 297, 298,
+ 297, 297, 297, 299, 300, 301, 297, 297, 302, 297,
+ 297, 297, 297, 297, 297, 297, 303, 297, 297, 297,
+ 297, 297, 304, 305, 297, 297, 297, 297, 297, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306, 297, 297,
+ 297, 297, 306, 306, 306, 306, 306, 306, 306, 306,
+
+ 306, 306, 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 297, 297, 297,
+ 306, 297, 297, 298, 297, 297, 297, 299, 300, 307,
+ 297, 297, 302, 297, 297, 297, 297, 297, 297, 297,
+ 303, 297, 297, 297, 297, 297, 297, 305, 297, 297,
+ 297, 297, 297, 308, 308, 308, 308, 308, 308, 308,
+ 308, 308, 308, 308, 308, 308, 308, 308, 308, 308,
+ 308, 308, 297, 297, 297, 297, 308, 308, 308, 308,
+ 308, 308, 308, 308, 308, 308, 308, 308, 308, 308,
+ 308, 308, 308, 308, 308, 308, 308, 308, 309, 308,
+
+ 308, 310, 297, 297, 308, 255, 1302, 255, 1088, 256,
+ 257, 256, 257, 1089, 258, 2393, 258, 1131, 1131, 1132,
+ 1131, 255, 259, 1088, 259, 316, 317, 1155, 1089, 1699,
+ 318, 319, 320, 1156, 442, 441, 442, 442, 321, 256,
+ 257, 1133, 1158, 1700, 258, 1088, 322, 2635, 323, 1303,
+ 1089, 1504, 452, 1505, 311, 1699, 311, 254, 254, 255,
+ 254, 254, 254, 256, 257, 312, 254, 254, 258, 254,
+ 313, 254, 254, 254, 254, 254, 259, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314, 314, 314,
+
+ 314, 314, 314, 314, 314, 314, 314, 314, 254, 254,
+ 254, 254, 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 254, 254, 254,
+ 314, 324, 325, 326, 324, 325, 324, 327, 328, 329,
+ 324, 324, 330, 324, 324, 324, 324, 324, 324, 324,
+ 331, 324, 324, 324, 324, 324, 324, 332, 324, 324,
+ 324, 324, 324, 333, 333, 333, 333, 333, 333, 333,
+ 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
+ 333, 333, 334, 324, 324, 324, 333, 333, 333, 333,
+
+ 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
+ 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
+ 333, 335, 324, 324, 333, 255, 1348, 255, 1088, 337,
+ 338, 337, 338, 1089, 339, 1349, 339, 1140, 1140, 1140,
+ 1140, 255, 340, 428, 340, 378, 379, 429, 430, 1728,
+ 380, 1195, 431, 1196, 1195, 381, 1197, 255, 382, 1088,
+ 432, 256, 257, 1728, 1089, 383, 258, 1504, 433, 1505,
+ 1105, 1105, 1105, 1105, 259, 2636, 341, 1106, 341, 342,
+ 342, 343, 342, 342, 342, 344, 345, 346, 342, 342,
+ 347, 342, 342, 342, 342, 342, 342, 342, 348, 342,
+
+ 342, 342, 342, 342, 342, 342, 342, 342, 342, 342,
+ 342, 349, 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349, 349, 349,
+ 342, 342, 342, 342, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349, 349, 350,
+ 342, 342, 349, 254, 351, 352, 353, 351, 254, 256,
+ 257, 354, 254, 254, 258, 254, 254, 254, 288, 355,
+ 288, 254, 290, 254, 254, 254, 254, 254, 356, 277,
+ 357, 254, 358, 254, 293, 359, 359, 359, 359, 359,
+
+ 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 254, 360, 254, 254, 359, 359,
+ 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 361, 254, 254, 359, 363, 364, 363,
+ 363, 1247, 365, 366, 1407, 1408, 1248, 367, 363, 364,
+ 363, 363, 1300, 365, 366, 368, 1155, 1301, 367, 255,
+ 1320, 1252, 1156, 371, 257, 1321, 368, 1993, 372, 373,
+ 255, 1158, 1253, 374, 371, 257, 259, 1096, 1231, 372,
+ 373, 1231, 1097, 375, 374, 1994, 428, 259, 255, 1364,
+
+ 429, 430, 469, 470, 375, 431, 1088, 471, 472, 473,
+ 1442, 1089, 1443, 432, 255, 474, 369, 1159, 469, 470,
+ 1806, 433, 370, 471, 472, 473, 1359, 369, 1444, 1359,
+ 1807, 474, 2387, 370, 442, 441, 442, 442, 1088, 256,
+ 257, 1409, 1410, 1089, 258, 1232, 1233, 376, 1124, 1124,
+ 1124, 1124, 452, 1366, 1385, 1125, 2387, 1385, 376, 254,
+ 384, 385, 386, 384, 387, 256, 388, 389, 390, 391,
+ 258, 392, 254, 391, 393, 394, 393, 395, 396, 397,
+ 397, 397, 397, 397, 398, 399, 400, 401, 254, 402,
+ 403, 404, 404, 404, 404, 404, 404, 404, 404, 404,
+
+ 404, 404, 404, 404, 405, 404, 404, 404, 404, 404,
+ 406, 254, 254, 407, 408, 409, 404, 410, 411, 412,
+ 413, 414, 404, 415, 416, 417, 418, 419, 404, 420,
+ 404, 421, 422, 423, 424, 425, 404, 404, 404, 426,
+ 254, 387, 404, 254, 434, 435, 434, 434, 436, 256,
+ 257, 437, 254, 254, 258, 254, 254, 254, 254, 254,
+ 254, 254, 259, 254, 254, 254, 254, 254, 438, 254,
+ 254, 254, 254, 254, 254, 439, 439, 439, 439, 439,
+ 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
+ 439, 439, 439, 439, 254, 254, 254, 254, 439, 439,
+
+ 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
+ 439, 439, 439, 439, 439, 439, 439, 439, 439, 439,
+ 439, 439, 439, 254, 254, 436, 439, 254, 440, 441,
+ 442, 440, 254, 256, 443, 444, 254, 254, 258, 445,
+ 254, 254, 254, 446, 254, 254, 447, 254, 254, 254,
+ 254, 254, 254, 448, 254, 449, 254, 254, 254, 450,
+ 450, 450, 450, 450, 450, 450, 450, 450, 450, 450,
+ 450, 450, 450, 450, 450, 450, 450, 450, 451, 254,
+ 254, 254, 450, 450, 450, 450, 450, 450, 450, 450,
+ 450, 450, 450, 450, 450, 450, 450, 450, 450, 450,
+
+ 450, 450, 450, 450, 450, 450, 450, 254, 254, 254,
+ 450, 255, 2637, 255, 1088, 256, 453, 256, 453, 1089,
+ 258, 454, 258, 454, 1337, 455, 1337, 455, 259, 1338,
+ 259, 1338, 1641, 1642, 456, 457, 456, 457, 459, 460,
+ 459, 459, 1088, 461, 462, 1728, 1362, 1089, 463, 464,
+ 465, 1363, 1385, 466, 1728, 1385, 467, 459, 460, 459,
+ 459, 476, 461, 462, 1625, 477, 478, 463, 464, 465,
+ 479, 1412, 466, 1384, 1412, 467, 1384, 476, 480, 1357,
+ 1626, 477, 478, 499, 1413, 481, 479, 500, 501, 455,
+ 1418, 455, 502, 503, 480, 1094, 1094, 1094, 1094, 1388,
+
+ 504, 481, 1418, 2210, 1389, 499, 1395, 505, 506, 500,
+ 501, 1396, 1402, 1095, 502, 503, 2272, 1403, 580, 255,
+ 1388, 580, 504, 581, 582, 1405, 1721, 1722, 583, 505,
+ 506, 584, 580, 255, 1742, 580, 585, 581, 582, 482,
+ 1419, 1479, 583, 1743, 1479, 584, 1134, 1134, 1134, 1134,
+ 585, 1492, 1419, 1135, 1492, 482, 458, 483, 484, 483,
+ 483, 458, 461, 462, 485, 458, 458, 463, 458, 458,
+ 458, 458, 486, 458, 458, 487, 458, 458, 458, 458,
+ 458, 486, 486, 458, 488, 458, 458, 458, 489, 489,
+ 489, 489, 489, 489, 489, 489, 489, 489, 489, 489,
+
+ 489, 489, 489, 489, 489, 489, 489, 458, 458, 458,
+ 458, 489, 490, 489, 491, 489, 489, 489, 489, 489,
+ 489, 489, 489, 489, 492, 493, 489, 489, 494, 495,
+ 496, 489, 497, 489, 489, 489, 486, 458, 458, 489,
+ 255, 1088, 1751, 255, 508, 509, 1089, 508, 509, 510,
+ 1751, 1752, 510, 515, 516, 517, 515, 511, 518, 519,
+ 511, 1415, 1501, 520, 1751, 1501, 1416, 515, 516, 517,
+ 515, 521, 518, 519, 1418, 1397, 1398, 520, 1094, 1094,
+ 1094, 1094, 1240, 522, 1393, 521, 1240, 1393, 1088, 512,
+ 1394, 513, 512, 1089, 513, 1418, 1095, 522, 515, 516,
+
+ 517, 515, 1425, 518, 519, 1407, 1408, 1426, 520, 515,
+ 516, 517, 515, 1422, 518, 519, 521, 1409, 1410, 520,
+ 515, 516, 517, 515, 1419, 518, 519, 521, 522, 1428,
+ 520, 255, 523, 524, 1429, 256, 257, 2638, 521, 522,
+ 258, 1101, 1101, 1101, 1101, 1419, 523, 524, 259, 1446,
+ 526, 515, 516, 517, 515, 557, 518, 519, 1102, 558,
+ 559, 520, 2639, 1419, 560, 1103, 1088, 561, 1418, 521,
+ 557, 1089, 562, 1599, 558, 559, 1599, 523, 525, 560,
+ 1420, 526, 561, 1446, 1793, 1421, 255, 562, 523, 525,
+ 256, 257, 1794, 1088, 1795, 258, 595, 596, 1089, 523,
+
+ 527, 2654, 255, 259, 1440, 563, 256, 257, 2655, 1441,
+ 555, 258, 595, 596, 1228, 1228, 1228, 1228, 1419, 259,
+ 563, 1229, 1246, 1246, 1246, 1246, 1325, 1325, 1325, 1325,
+ 523, 527, 254, 254, 255, 254, 254, 254, 256, 257,
+ 528, 254, 254, 258, 254, 254, 254, 254, 254, 254,
+ 254, 259, 254, 254, 254, 254, 254, 254, 529, 254,
+ 254, 254, 254, 254, 530, 530, 530, 530, 530, 530,
+ 530, 530, 530, 530, 530, 530, 530, 530, 530, 530,
+ 530, 530, 530, 254, 254, 254, 254, 530, 530, 530,
+ 530, 530, 530, 530, 530, 530, 530, 530, 530, 530,
+
+ 531, 530, 530, 530, 530, 530, 530, 530, 530, 530,
+ 530, 530, 254, 254, 254, 530, 254, 532, 533, 532,
+ 532, 534, 256, 257, 535, 254, 254, 258, 254, 254,
+ 254, 254, 254, 254, 254, 259, 254, 254, 254, 254,
+ 254, 536, 254, 254, 254, 254, 254, 254, 537, 537,
+ 537, 537, 537, 537, 537, 537, 537, 537, 537, 537,
+ 537, 537, 537, 537, 537, 537, 537, 254, 254, 254,
+ 254, 537, 537, 537, 537, 537, 537, 537, 537, 537,
+ 537, 537, 537, 537, 537, 537, 537, 537, 537, 537,
+ 537, 537, 537, 537, 537, 537, 254, 254, 534, 537,
+
+ 539, 540, 1088, 539, 1088, 541, 542, 1089, 1468, 1089,
+ 543, 549, 540, 1468, 549, 1088, 541, 550, 544, 1471,
+ 1089, 543, 539, 551, 1472, 539, 1476, 552, 542, 544,
+ 545, 1477, 543, 255, 1483, 2033, 2656, 256, 257, 1484,
+ 553, 545, 258, 1493, 1101, 1101, 1101, 1101, 1494, 2033,
+ 259, 546, 545, 539, 551, 1446, 539, 1912, 552, 542,
+ 557, 1102, 546, 543, 564, 559, 1913, 2002, 1103, 565,
+ 1521, 553, 561, 554, 2453, 1522, 1337, 562, 2454, 547,
+ 548, 1338, 2003, 545, 1127, 1128, 1128, 1127, 557, 1446,
+ 547, 548, 564, 559, 540, 2144, 2145, 565, 566, 567,
+
+ 561, 546, 546, 543, 554, 562, 1627, 2657, 1129, 1627,
+ 563, 568, 555, 1186, 1186, 1186, 1186, 540, 569, 1628,
+ 587, 566, 567, 545, 588, 589, 543, 1123, 1123, 590,
+ 1123, 1123, 546, 546, 568, 572, 573, 591, 563, 574,
+ 575, 569, 1088, 1504, 576, 1505, 545, 1089, 1915, 572,
+ 573, 587, 577, 574, 575, 588, 589, 1916, 576, 1533,
+ 590, 1418, 1533, 1104, 1534, 1504, 577, 1505, 591, 255,
+ 592, 255, 570, 256, 257, 256, 257, 1773, 258, 1318,
+ 258, 1681, 1318, 1422, 1681, 578, 259, 1506, 259, 255,
+ 1773, 1088, 1187, 612, 613, 570, 1089, 2660, 614, 578,
+
+ 1682, 592, 598, 599, 598, 598, 615, 600, 601, 1507,
+ 2661, 1419, 602, 598, 599, 598, 598, 255, 600, 601,
+ 603, 256, 257, 602, 1088, 2154, 258, 1569, 604, 1089,
+ 605, 603, 1570, 1419, 259, 2155, 1232, 1233, 616, 604,
+ 617, 605, 606, 1693, 607, 2662, 1693, 593, 594, 593,
+ 594, 255, 2663, 255, 1088, 256, 257, 608, 257, 1089,
+ 258, 1578, 258, 609, 610, 1255, 1579, 1728, 259, 1694,
+ 259, 1339, 1339, 1339, 1339, 255, 606, 1582, 607, 608,
+ 257, 1728, 1583, 1588, 258, 609, 610, 1418, 1589, 255,
+ 1340, 619, 259, 612, 613, 620, 621, 1504, 614, 1505,
+
+ 622, 1128, 1128, 1128, 1128, 619, 615, 255, 623, 620,
+ 621, 256, 257, 2664, 622, 1257, 258, 1201, 1201, 1201,
+ 1201, 1258, 623, 1088, 259, 1129, 1259, 1260, 1089, 1261,
+ 1168, 1088, 678, 1168, 1088, 1202, 1089, 1419, 616, 1089,
+ 617, 254, 254, 255, 254, 254, 254, 256, 257, 624,
+ 254, 254, 258, 254, 254, 254, 254, 254, 254, 254,
+ 259, 254, 254, 254, 254, 254, 254, 625, 254, 254,
+ 254, 254, 254, 626, 626, 626, 626, 626, 626, 626,
+ 626, 626, 626, 626, 626, 626, 626, 626, 626, 626,
+ 626, 626, 254, 254, 254, 254, 626, 626, 626, 627,
+
+ 626, 626, 626, 626, 626, 626, 626, 626, 626, 626,
+ 626, 626, 626, 626, 626, 626, 626, 628, 626, 626,
+ 626, 254, 254, 254, 626, 630, 1799, 630, 1088, 631,
+ 632, 631, 632, 1089, 633, 1800, 633, 1323, 1323, 1323,
+ 1323, 1801, 634, 2665, 634, 637, 638, 637, 637, 1088,
+ 639, 640, 1324, 2666, 1089, 641, 637, 638, 637, 637,
+ 1088, 639, 640, 642, 2667, 1089, 641, 645, 646, 645,
+ 645, 1088, 647, 648, 642, 2668, 1089, 649, 680, 1915,
+ 650, 1088, 681, 682, 651, 652, 1089, 683, 1916, 1618,
+ 1145, 1145, 1145, 1145, 1619, 684, 2669, 653, 1504, 1088,
+
+ 1505, 1146, 643, 635, 1089, 635, 645, 646, 645, 645,
+ 1088, 647, 648, 643, 1129, 1624, 649, 255, 653, 650,
+ 1631, 256, 257, 651, 652, 1632, 258, 1600, 680, 2140,
+ 1600, 2670, 681, 682, 259, 705, 653, 683, 1601, 706,
+ 707, 1999, 678, 2140, 708, 684, 1306, 1306, 1306, 1306,
+ 1088, 1088, 709, 1307, 2671, 1089, 1089, 653, 254, 254,
+ 255, 254, 254, 254, 256, 257, 654, 254, 254, 258,
+ 254, 254, 254, 254, 254, 254, 254, 259, 254, 254,
+ 254, 254, 254, 254, 655, 254, 254, 254, 254, 254,
+ 656, 656, 656, 656, 656, 656, 656, 656, 656, 656,
+
+ 656, 656, 656, 656, 656, 656, 656, 656, 656, 254,
+ 254, 254, 254, 656, 656, 656, 656, 656, 656, 656,
+ 656, 656, 656, 656, 656, 656, 656, 656, 656, 656,
+ 656, 656, 656, 656, 656, 656, 656, 656, 254, 254,
+ 254, 656, 254, 254, 255, 254, 254, 254, 256, 257,
+ 657, 254, 254, 258, 254, 254, 254, 254, 254, 254,
+ 254, 259, 254, 254, 254, 254, 254, 254, 254, 254,
+ 254, 254, 254, 254, 658, 658, 658, 658, 658, 658,
+ 658, 658, 658, 658, 658, 658, 658, 658, 658, 658,
+ 658, 658, 658, 254, 254, 254, 254, 658, 658, 658,
+
+ 658, 658, 658, 658, 658, 658, 658, 658, 658, 658,
+ 658, 658, 658, 658, 658, 658, 658, 658, 658, 658,
+ 658, 658, 254, 254, 254, 658, 254, 254, 255, 254,
+ 254, 254, 256, 257, 659, 254, 254, 258, 254, 254,
+ 254, 254, 254, 254, 254, 259, 254, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 254, 254, 254,
+ 254, 660, 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660, 660, 660,
+
+ 660, 660, 660, 660, 660, 660, 254, 254, 254, 660,
+ 254, 661, 662, 661, 661, 254, 256, 257, 663, 254,
+ 254, 258, 254, 254, 254, 254, 664, 254, 254, 259,
+ 254, 254, 254, 254, 254, 254, 664, 254, 254, 254,
+ 254, 254, 665, 665, 665, 665, 665, 665, 665, 665,
+ 665, 665, 665, 665, 665, 665, 665, 665, 665, 665,
+ 665, 254, 254, 254, 254, 665, 665, 665, 665, 665,
+ 665, 665, 665, 665, 665, 665, 665, 665, 665, 665,
+ 665, 665, 665, 665, 665, 665, 665, 665, 665, 665,
+ 254, 254, 254, 665, 667, 1983, 667, 1088, 668, 669,
+
+ 668, 669, 1089, 670, 1984, 670, 1203, 1203, 1203, 1203,
+ 255, 671, 255, 671, 688, 689, 688, 689, 1088, 690,
+ 1088, 690, 2575, 1089, 1204, 1089, 705, 691, 717, 691,
+ 706, 707, 718, 719, 692, 708, 692, 720, 1195, 721,
+ 2576, 1195, 717, 709, 1088, 722, 718, 719, 672, 1089,
+ 672, 720, 1088, 721, 673, 1195, 673, 1089, 1195, 722,
+ 1356, 1356, 1356, 1356, 674, 675, 674, 675, 1356, 1356,
+ 1356, 1356, 676, 677, 676, 677, 254, 254, 255, 254,
+ 254, 254, 256, 257, 685, 254, 254, 258, 254, 254,
+ 254, 254, 254, 254, 254, 259, 254, 254, 254, 254,
+
+ 254, 254, 254, 254, 254, 254, 254, 254, 686, 686,
+ 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
+ 686, 686, 686, 686, 686, 686, 686, 254, 254, 254,
+ 254, 686, 686, 686, 686, 686, 686, 686, 686, 686,
+ 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
+ 686, 686, 686, 686, 686, 686, 254, 254, 254, 686,
+ 693, 694, 441, 694, 694, 693, 695, 696, 697, 693,
+ 693, 698, 693, 693, 693, 693, 699, 693, 693, 700,
+ 693, 693, 693, 693, 693, 693, 701, 693, 693, 693,
+ 693, 693, 702, 702, 702, 702, 702, 702, 702, 702,
+
+ 702, 702, 702, 702, 702, 702, 702, 702, 702, 702,
+ 702, 693, 693, 693, 693, 702, 702, 702, 702, 702,
+ 702, 702, 702, 702, 702, 702, 702, 702, 702, 702,
+ 702, 702, 702, 702, 702, 702, 702, 702, 702, 702,
+ 703, 693, 693, 702, 254, 254, 255, 254, 254, 254,
+ 256, 257, 710, 254, 254, 258, 711, 254, 254, 254,
+ 254, 254, 254, 259, 254, 254, 254, 254, 254, 712,
+ 713, 254, 254, 254, 254, 254, 714, 714, 714, 714,
+ 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
+ 714, 714, 714, 714, 714, 254, 254, 254, 254, 714,
+
+ 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
+ 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
+ 714, 714, 714, 714, 715, 254, 254, 714, 254, 254,
+ 255, 254, 254, 254, 256, 257, 723, 254, 254, 258,
+ 724, 254, 254, 254, 725, 254, 254, 259, 254, 254,
+ 254, 254, 254, 726, 713, 254, 254, 254, 254, 254,
+ 727, 727, 727, 727, 727, 727, 727, 727, 727, 727,
+ 727, 727, 727, 727, 727, 727, 727, 727, 727, 254,
+ 254, 254, 254, 727, 727, 727, 727, 727, 727, 727,
+ 727, 727, 727, 727, 727, 727, 727, 727, 727, 727,
+
+ 727, 727, 727, 727, 727, 727, 727, 727, 715, 254,
+ 254, 727, 729, 1088, 2672, 729, 730, 731, 1089, 730,
+ 731, 732, 1695, 733, 732, 1688, 733, 1696, 1688, 734,
+ 255, 1418, 734, 255, 256, 257, 1687, 256, 257, 258,
+ 255, 1697, 258, 1689, 256, 257, 1698, 259, 1690, 258,
+ 259, 736, 2673, 1691, 2675, 735, 255, 259, 735, 255,
+ 256, 257, 255, 256, 257, 258, 256, 257, 258, 1714,
+ 736, 258, 1697, 259, 1696, 2676, 259, 1715, 255, 259,
+ 743, 1419, 256, 257, 1718, 2677, 743, 258, 783, 1719,
+ 1165, 1165, 1165, 1165, 737, 259, 738, 1726, 1790, 255,
+
+ 739, 1791, 1727, 256, 257, 2678, 740, 1768, 258, 783,
+ 741, 742, 1769, 737, 1166, 738, 259, 2679, 1167, 739,
+ 1355, 1356, 1356, 1355, 1803, 740, 1357, 1804, 2680, 741,
+ 742, 254, 744, 255, 254, 744, 254, 256, 257, 745,
+ 254, 254, 258, 746, 254, 254, 254, 254, 254, 254,
+ 259, 254, 254, 254, 254, 254, 254, 254, 254, 254,
+ 254, 254, 254, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 254, 254, 254, 254, 747, 747, 747, 748,
+ 747, 747, 747, 747, 747, 747, 747, 747, 747, 747,
+
+ 747, 747, 747, 747, 747, 747, 747, 749, 747, 747,
+ 747, 254, 254, 254, 747, 254, 254, 255, 254, 254,
+ 254, 256, 257, 750, 254, 254, 258, 254, 254, 254,
+ 254, 254, 254, 254, 259, 254, 254, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 751, 751, 751,
+ 751, 751, 751, 751, 751, 751, 751, 751, 751, 751,
+ 751, 751, 751, 751, 751, 751, 254, 254, 254, 254,
+ 751, 751, 751, 751, 751, 751, 751, 751, 751, 751,
+ 751, 751, 751, 751, 751, 751, 751, 751, 751, 751,
+ 751, 751, 751, 751, 751, 254, 254, 254, 751, 255,
+
+ 1446, 2088, 1723, 256, 257, 1723, 1155, 2681, 258, 255,
+ 752, 1446, 1156, 256, 257, 1724, 259, 2682, 258, 255,
+ 752, 1158, 1662, 256, 257, 1662, 259, 2088, 258, 1663,
+ 784, 1664, 753, 2120, 1446, 1664, 259, 1201, 1201, 1201,
+ 1201, 2119, 753, 754, 755, 1446, 756, 1365, 1365, 1365,
+ 1365, 2205, 2206, 754, 755, 1202, 756, 254, 254, 255,
+ 254, 254, 254, 256, 257, 757, 254, 254, 258, 254,
+ 254, 254, 254, 254, 254, 254, 259, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
+
+ 758, 758, 758, 758, 758, 758, 758, 758, 254, 254,
+ 254, 254, 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 254, 254, 254,
+ 758, 254, 254, 255, 254, 254, 254, 256, 257, 759,
+ 254, 254, 258, 254, 254, 254, 254, 254, 254, 254,
+ 259, 254, 254, 254, 254, 254, 254, 254, 254, 254,
+ 254, 254, 254, 760, 760, 760, 760, 760, 760, 760,
+ 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
+ 760, 760, 254, 254, 254, 254, 760, 760, 760, 760,
+
+ 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
+ 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
+ 760, 254, 254, 254, 760, 762, 763, 762, 762, 818,
+ 764, 765, 2683, 819, 820, 766, 767, 768, 821, 822,
+ 769, 770, 1776, 771, 1778, 1385, 823, 1777, 1385, 1779,
+ 772, 773, 255, 774, 775, 776, 256, 257, 2141, 1155,
+ 2349, 258, 255, 784, 2684, 1156, 256, 257, 2348, 259,
+ 1091, 258, 2141, 1091, 1158, 777, 795, 768, 255, 259,
+ 818, 1092, 256, 257, 819, 820, 796, 258, 1783, 821,
+ 822, 2685, 795, 1784, 1785, 259, 1786, 823, 1323, 1323,
+
+ 1323, 1323, 796, 2686, 778, 768, 762, 763, 762, 762,
+ 840, 764, 765, 1324, 841, 842, 766, 767, 768, 843,
+ 1384, 769, 770, 1384, 771, 1744, 1357, 844, 1744, 1745,
+ 2033, 772, 773, 845, 774, 775, 776, 255, 2687, 2034,
+ 255, 798, 799, 1746, 798, 799, 800, 801, 802, 800,
+ 801, 802, 1091, 2583, 803, 1091, 777, 803, 768, 2688,
+ 1810, 2584, 804, 1092, 805, 804, 872, 805, 1811, 1954,
+ 873, 874, 2689, 1812, 1955, 875, 876, 877, 1423, 1423,
+ 1423, 1423, 2690, 878, 2691, 778, 768, 254, 779, 780,
+ 779, 779, 254, 256, 257, 781, 254, 254, 258, 254,
+
+ 254, 254, 254, 254, 254, 254, 259, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782, 254, 254,
+ 254, 254, 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 254, 254, 254,
+ 782, 254, 785, 786, 785, 785, 254, 256, 257, 787,
+ 254, 788, 258, 789, 254, 788, 254, 790, 254, 254,
+ 791, 254, 254, 254, 254, 254, 254, 792, 254, 793,
+
+ 254, 254, 254, 794, 794, 794, 794, 794, 794, 794,
+ 794, 794, 794, 794, 794, 794, 794, 794, 794, 794,
+ 794, 794, 254, 254, 254, 254, 794, 794, 794, 794,
+ 794, 794, 794, 794, 794, 794, 794, 794, 794, 794,
+ 794, 794, 794, 794, 794, 794, 794, 794, 794, 794,
+ 794, 254, 254, 254, 794, 806, 807, 808, 807, 807,
+ 809, 810, 811, 812, 806, 806, 813, 806, 806, 806,
+ 806, 806, 806, 806, 814, 806, 806, 806, 806, 806,
+ 815, 806, 806, 806, 806, 806, 806, 816, 816, 816,
+ 816, 816, 816, 816, 816, 816, 816, 816, 816, 816,
+
+ 816, 816, 816, 816, 816, 816, 806, 806, 806, 806,
+ 816, 816, 816, 816, 816, 816, 816, 816, 816, 816,
+ 816, 816, 816, 816, 816, 816, 816, 816, 816, 816,
+ 816, 816, 816, 816, 816, 806, 806, 809, 816, 255,
+ 1957, 2692, 255, 256, 257, 1958, 256, 257, 258, 824,
+ 825, 258, 824, 825, 1385, 1479, 259, 1385, 1479, 259,
+ 828, 829, 828, 828, 840, 830, 831, 2176, 841, 842,
+ 832, 833, 834, 843, 828, 829, 828, 828, 835, 830,
+ 831, 844, 2693, 2177, 832, 833, 834, 845, 826, 2205,
+ 2212, 826, 835, 828, 829, 828, 828, 954, 830, 831,
+
+ 1468, 830, 831, 832, 833, 1468, 832, 828, 829, 828,
+ 828, 835, 830, 831, 966, 2205, 2206, 832, 833, 837,
+ 1091, 838, 967, 1091, 968, 835, 2694, 1375, 1375, 1375,
+ 1375, 1092, 2697, 837, 1376, 838, 254, 254, 255, 254,
+ 254, 254, 256, 257, 846, 254, 254, 258, 254, 254,
+ 254, 254, 254, 254, 254, 259, 254, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 847, 847,
+ 847, 847, 847, 847, 847, 847, 847, 847, 847, 847,
+ 847, 847, 847, 847, 847, 847, 847, 254, 254, 254,
+ 254, 847, 847, 847, 847, 847, 847, 847, 847, 847,
+
+ 847, 847, 847, 847, 847, 847, 847, 847, 847, 847,
+ 847, 847, 847, 847, 847, 847, 254, 254, 254, 847,
+ 254, 254, 255, 254, 254, 254, 256, 257, 848, 254,
+ 254, 258, 254, 254, 254, 254, 254, 254, 254, 259,
+ 254, 254, 254, 254, 254, 254, 849, 254, 254, 254,
+ 254, 254, 850, 850, 850, 850, 850, 850, 850, 850,
+ 850, 850, 850, 850, 850, 850, 850, 850, 850, 850,
+ 850, 254, 254, 254, 254, 850, 850, 850, 850, 850,
+ 850, 850, 850, 850, 850, 850, 850, 850, 850, 850,
+ 850, 850, 850, 850, 850, 850, 850, 850, 850, 850,
+
+ 254, 254, 254, 850, 852, 2698, 852, 1468, 853, 854,
+ 853, 854, 1468, 855, 1492, 855, 856, 1492, 856, 1728,
+ 852, 857, 852, 857, 859, 854, 859, 854, 1728, 860,
+ 1501, 860, 856, 1501, 856, 2140, 862, 857, 862, 857,
+ 863, 864, 863, 864, 2140, 865, 1393, 865, 866, 1393,
+ 866, 2699, 1394, 867, 858, 867, 858, 862, 2141, 862,
+ 2031, 869, 864, 869, 864, 2032, 870, 2141, 870, 866,
+ 858, 866, 858, 872, 867, 1695, 867, 873, 874, 2700,
+ 1696, 2701, 875, 876, 877, 2702, 868, 880, 868, 880,
+ 878, 881, 882, 881, 882, 1504, 883, 1505, 883, 1145,
+
+ 1145, 1145, 1145, 2071, 884, 2306, 884, 868, 888, 868,
+ 1146, 888, 889, 890, 2306, 889, 890, 891, 892, 893,
+ 891, 892, 893, 1129, 1412, 894, 896, 1412, 894, 896,
+ 897, 898, 2307, 897, 903, 899, 2000, 1413, 899, 905,
+ 906, 2307, 905, 900, 907, 908, 900, 1714, 2071, 909,
+ 910, 911, 1696, 1600, 255, 1148, 1600, 912, 1052, 1053,
+ 1504, 2704, 1505, 1054, 1601, 885, 886, 885, 886, 905,
+ 906, 1055, 905, 255, 907, 908, 2071, 508, 509, 909,
+ 910, 911, 510, 459, 460, 459, 459, 912, 461, 462,
+ 511, 2331, 2171, 463, 934, 935, 2083, 2172, 466, 2083,
+
+ 1710, 467, 2306, 1710, 901, 902, 2706, 901, 902, 914,
+ 915, 914, 914, 1711, 916, 917, 2306, 1155, 1712, 918,
+ 919, 920, 512, 1156, 952, 2064, 1694, 921, 459, 460,
+ 459, 459, 1158, 461, 462, 922, 2307, 923, 463, 934,
+ 935, 2479, 1231, 466, 255, 1231, 467, 255, 937, 938,
+ 2307, 937, 938, 939, 1533, 940, 939, 1533, 940, 1534,
+ 1917, 941, 954, 1917, 941, 1757, 830, 963, 2064, 2205,
+ 2212, 832, 964, 965, 1100, 1101, 1101, 1100, 1959, 966,
+ 2159, 2708, 924, 914, 915, 914, 914, 1318, 916, 917,
+ 1318, 1102, 2160, 918, 919, 920, 2161, 2064, 1103, 1232,
+
+ 1233, 921, 943, 944, 943, 943, 2640, 945, 946, 922,
+ 1782, 923, 947, 948, 949, 1681, 2053, 950, 1681, 2053,
+ 951, 943, 944, 943, 943, 1917, 945, 946, 1917, 1918,
+ 2640, 947, 948, 949, 1682, 2147, 950, 954, 2148, 951,
+ 2054, 830, 963, 1919, 1232, 1233, 832, 964, 965, 1423,
+ 1423, 1423, 1423, 1104, 966, 1851, 924, 925, 925, 926,
+ 925, 925, 925, 927, 928, 929, 925, 925, 930, 925,
+ 925, 925, 925, 925, 925, 925, 931, 925, 925, 925,
+ 925, 925, 925, 932, 925, 925, 925, 925, 925, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933, 933, 933,
+
+ 933, 933, 933, 933, 933, 933, 933, 933, 925, 925,
+ 925, 925, 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 932, 925, 925,
+ 933, 255, 1504, 954, 1505, 508, 509, 955, 956, 1504,
+ 510, 1505, 957, 1203, 1203, 1203, 1203, 954, 511, 954,
+ 958, 955, 956, 960, 956, 2106, 957, 1627, 961, 1917,
+ 1627, 1204, 1917, 1918, 958, 1318, 958, 954, 1318, 954,
+ 1628, 960, 956, 830, 831, 2752, 961, 1919, 832, 2753,
+ 512, 2587, 952, 959, 958, 2768, 966, 2330, 1108, 1108,
+
+ 1108, 1108, 1109, 2094, 967, 1110, 968, 959, 970, 959,
+ 2106, 1917, 971, 972, 1917, 1985, 2769, 973, 977, 970,
+ 974, 977, 1103, 971, 972, 975, 2770, 959, 973, 1986,
+ 980, 978, 1232, 1233, 981, 982, 975, 976, 2106, 983,
+ 1145, 1145, 1145, 1145, 2347, 980, 2094, 984, 976, 981,
+ 982, 1146, 1688, 2347, 983, 1688, 970, 2771, 976, 985,
+ 987, 988, 984, 1693, 1129, 989, 1693, 970, 2772, 976,
+ 1689, 987, 988, 990, 985, 2094, 989, 255, 2773, 1109,
+ 985, 993, 994, 255, 990, 991, 995, 993, 994, 1694,
+ 2774, 2347, 995, 255, 996, 985, 991, 1046, 1047, 1149,
+
+ 996, 2386, 1048, 255, 1049, 2347, 991, 1046, 1047, 2162,
+ 1050, 2163, 1048, 1688, 1049, 2386, 1688, 991, 255, 2164,
+ 1050, 1057, 1052, 1053, 2399, 1058, 1059, 1054, 997, 2529,
+ 1060, 1689, 1057, 2775, 997, 1055, 1058, 1059, 1061, 2083,
+ 2776, 1060, 2083, 2427, 2530, 998, 2778, 2779, 2428, 1061,
+ 2399, 998, 999, 1000, 1001, 1000, 1000, 999, 1002, 1003,
+ 1004, 999, 999, 1005, 999, 999, 999, 999, 999, 999,
+ 999, 1006, 999, 999, 999, 999, 999, 999, 1007, 999,
+ 999, 999, 999, 999, 1008, 1008, 1008, 1008, 1008, 1008,
+ 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008,
+
+ 1008, 1008, 1008, 1009, 999, 999, 999, 1008, 1008, 1008,
+ 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008,
+ 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008,
+ 1008, 1008, 999, 999, 999, 1008, 254, 1010, 1011, 1010,
+ 1010, 254, 256, 257, 1012, 254, 254, 258, 254, 254,
+ 254, 254, 254, 254, 254, 259, 254, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 1013, 1013,
+ 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+ 1013, 1013, 1013, 1013, 1013, 1013, 1013, 254, 254, 254,
+ 254, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+
+ 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+ 1013, 1013, 1013, 1013, 1013, 1013, 254, 254, 254, 1013,
+ 255, 2780, 255, 2103, 1015, 1016, 1015, 1016, 2784, 1017,
+ 1018, 1017, 1018, 2104, 2626, 1063, 1064, 1019, 1063, 1019,
+ 1065, 1066, 2627, 1681, 1935, 1067, 1681, 2103, 1068, 1117,
+ 1117, 1117, 1117, 1069, 1206, 1206, 1206, 1206, 2400, 2104,
+ 1118, 1070, 1682, 1742, 1119, 1071, 1102, 1201, 1201, 1201,
+ 1201, 2479, 1743, 1103, 1121, 1122, 2707, 1935, 1208, 1438,
+ 1438, 1438, 1438, 2785, 2400, 1202, 1072, 1020, 1951, 1020,
+ 1021, 1022, 1023, 1022, 1022, 1024, 1025, 1026, 1027, 1021,
+
+ 1021, 1028, 1029, 1030, 1021, 1021, 1021, 1021, 1021, 1031,
+ 1021, 1021, 1021, 1021, 1021, 1032, 1021, 1021, 1021, 1021,
+ 1021, 1021, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033,
+ 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033,
+ 1033, 1021, 1021, 1021, 1021, 1033, 1033, 1033, 1033, 1033,
+ 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033,
+ 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033,
+ 1021, 1021, 1024, 1033, 1035, 255, 2641, 1035, 2053, 1036,
+ 1037, 2053, 1951, 2789, 1038, 1035, 255, 2790, 1035, 2791,
+ 1036, 1037, 1039, 2792, 2793, 1038, 1351, 1351, 1351, 1351,
+
+ 2641, 1040, 2054, 1039, 1073, 1064, 2794, 1073, 1352, 1065,
+ 1066, 2795, 1040, 2102, 1067, 1077, 2102, 1074, 2796, 1078,
+ 1079, 1080, 1075, 2797, 1081, 2798, 1711, 1082, 2799, 2801,
+ 1070, 1041, 1083, 2803, 1071, 1188, 1188, 1188, 1188, 1155,
+ 1084, 1915, 1041, 1723, 1085, 1156, 1723, 1042, 1662, 1043,
+ 1916, 1662, 1189, 1044, 1158, 1072, 1724, 1664, 1042, 1191,
+ 1043, 1664, 1915, 2007, 1044, 1085, 1080, 1086, 1077, 1742,
+ 1086, 1916, 1078, 1079, 1080, 2007, 1744, 1081, 1743, 1744,
+ 1087, 1112, 1112, 1112, 1112, 1083, 1192, 2405, 1113, 1173,
+ 1174, 1174, 1173, 1084, 2113, 2695, 1175, 1085, 1102, 1128,
+
+ 1128, 1128, 1128, 1137, 2696, 2028, 1138, 1206, 1206, 1206,
+ 1206, 2028, 2037, 1241, 1241, 1241, 1241, 2037, 1085, 1080,
+ 1242, 1917, 1243, 1129, 1917, 2041, 1243, 1203, 1203, 1203,
+ 1203, 1208, 1262, 1262, 1262, 1262, 1504, 1244, 1505, 1959,
+ 2041, 1262, 1262, 1262, 1262, 1204, 1304, 1304, 1304, 1304,
+ 1662, 2102, 1177, 1662, 2102, 2045, 1208, 2802, 1264, 1664,
+ 2802, 2045, 1115, 1664, 1711, 1208, 1243, 1264, 1178, 2049,
+ 1305, 1438, 1438, 1438, 1438, 1480, 1480, 1480, 1480, 2049,
+ 1137, 1130, 1179, 1179, 1180, 1179, 1130, 1130, 1130, 1181,
+ 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1269, 1130, 1130,
+
+ 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130,
+ 1130, 1130, 1130, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1130, 1130, 1130, 1130, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1183, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 2805, 1130, 1130, 1182, 1174, 1174, 1174, 1174, 2057,
+ 2057, 2806, 1175, 1234, 1234, 1234, 1234, 1235, 2806, 2807,
+ 1236, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1155,
+ 1262, 1262, 1262, 1262, 2808, 1156, 2809, 1208, 1262, 1262,
+
+ 1262, 1262, 2810, 2183, 1158, 1208, 2183, 1264, 2465, 1208,
+ 2102, 1264, 2811, 2102, 1208, 2812, 1264, 1262, 1262, 1262,
+ 1262, 2813, 1208, 1711, 1264, 2814, 2815, 2816, 1177, 1304,
+ 1304, 1304, 1304, 2294, 2817, 1265, 2294, 2363, 2561, 1268,
+ 2363, 1208, 2607, 1264, 3694, 1205, 1206, 1206, 1205, 2123,
+ 2818, 1207, 2819, 1305, 1235, 1270, 2820, 1272, 1271, 2821,
+ 2825, 1273, 1262, 1262, 1262, 1262, 1504, 2826, 1505, 1208,
+ 1449, 1449, 1449, 1449, 1274, 1209, 2827, 2828, 2829, 1316,
+ 1094, 1094, 1316, 2830, 1275, 1317, 1208, 1450, 1264, 1210,
+ 1155, 2831, 1276, 2833, 1277, 1211, 1156, 1095, 2822, 1212,
+
+ 1213, 2822, 1214, 1215, 1216, 1158, 2834, 2835, 1217, 1218,
+ 1219, 1220, 1221, 2836, 1222, 2588, 1223, 1224, 1225, 1226,
+ 1227, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1278, 1262, 1262, 1262, 1262, 2832, 1262,
+ 1262, 1262, 1262, 1662, 2837, 1208, 1662, 1264, 2838, 1208,
+ 1663, 1264, 1664, 1208, 1677, 1264, 1664, 1677, 1208, 2839,
+ 1264, 2840, 2832, 1208, 2846, 1264, 2847, 1262, 1262, 1262,
+ 1262, 1094, 1094, 1094, 1094, 1262, 1262, 1262, 1262, 1677,
+ 1279, 1678, 1677, 1281, 1262, 1262, 1262, 1262, 1504, 1095,
+ 1505, 1208, 1280, 1264, 2849, 2852, 2853, 1282, 1283, 1208,
+
+ 2854, 1264, 1262, 1262, 1262, 1262, 1678, 1284, 1208, 2855,
+ 1264, 1679, 2858, 1285, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1286, 2859, 2860, 2861, 1208, 2800, 1264, 1680,
+ 2856, 1262, 1262, 1262, 1262, 2862, 1679, 2864, 1208, 2857,
+ 1264, 2866, 1208, 1289, 1264, 2823, 1287, 2868, 2823, 1288,
+ 1313, 1313, 1313, 1313, 1680, 1208, 2824, 1264, 2869, 1304,
+ 1304, 1304, 1304, 1309, 2870, 1290, 1310, 2871, 2872, 1094,
+ 1094, 1094, 1094, 1292, 1305, 1291, 1315, 1201, 1201, 1201,
+ 1201, 2873, 2875, 1305, 2876, 1294, 1296, 1095, 2874, 2877,
+ 1295, 2878, 1293, 2879, 1297, 1202, 2880, 2881, 2882, 1298,
+
+ 1203, 1203, 1203, 1203, 1368, 1368, 1368, 1368, 1368, 1368,
+ 1368, 1368, 1373, 1373, 1373, 1373, 2883, 2884, 1204, 2885,
+ 2886, 1369, 2887, 2888, 2889, 1369, 2893, 2891, 1371, 2894,
+ 1233, 2895, 1371, 2706, 2479, 2896, 1374, 2916, 2917, 2943,
+ 1309, 1326, 1326, 1326, 1326, 1373, 1373, 1373, 1373, 1373,
+ 1373, 1373, 1373, 1378, 2944, 2958, 1379, 1373, 1373, 1373,
+ 1373, 2959, 2960, 1372, 1391, 1391, 1391, 1391, 1327, 1374,
+ 2961, 2962, 2964, 1374, 1399, 1399, 1399, 1399, 2965, 2966,
+ 2971, 1374, 1392, 1434, 1434, 1434, 1434, 1434, 1434, 1434,
+ 1434, 2972, 1400, 2975, 2976, 2977, 1328, 2892, 1329, 1453,
+
+ 1453, 1453, 1453, 1456, 1456, 1456, 1456, 2978, 1330, 1331,
+ 2979, 2980, 1332, 1333, 1334, 2981, 1335, 1456, 1456, 1456,
+ 1456, 1094, 1094, 1094, 1094, 1201, 1201, 1201, 1201, 2982,
+ 1378, 1203, 1203, 1203, 1203, 1486, 1486, 1486, 1486, 1095,
+ 1435, 2984, 2987, 1202, 1435, 1488, 1488, 1488, 1488, 1204,
+ 1455, 2988, 1487, 1094, 1094, 1094, 1094, 2989, 1457, 1094,
+ 1094, 1094, 1094, 1201, 1201, 1201, 1201, 1828, 2991, 1490,
+ 1828, 1095, 1457, 1203, 1203, 1203, 1203, 1095, 1504, 2992,
+ 1505, 1202, 1527, 1527, 1527, 1527, 2993, 2990, 2994, 1528,
+ 2990, 1204, 1527, 1527, 1527, 1527, 2995, 1831, 2996, 1528,
+
+ 3694, 3694, 3694, 3694, 2071, 2997, 2998, 3694, 1530, 1530,
+ 1530, 1530, 2999, 1535, 1535, 1535, 1535, 3000, 1831, 2983,
+ 1536, 1531, 1537, 3001, 3002, 3003, 1537, 1535, 1535, 1535,
+ 1535, 3004, 3005, 3006, 1536, 1832, 1537, 3007, 1832, 1833,
+ 1537, 3694, 3694, 3694, 3694, 3008, 2822, 3009, 3694, 2822,
+ 3694, 3010, 3011, 1834, 3694, 1535, 1535, 1535, 1535, 3012,
+ 2802, 3013, 1536, 2802, 1537, 1835, 3014, 2985, 1537, 1201,
+ 1201, 1201, 1201, 1203, 1203, 1203, 1203, 1539, 1539, 1539,
+ 1539, 1542, 1542, 1542, 1542, 3015, 1835, 1202, 3016, 3017,
+ 3018, 1204, 1543, 1545, 1545, 1545, 1545, 1545, 1545, 1545,
+
+ 1545, 1547, 1547, 1547, 1547, 1544, 1143, 3021, 1548, 1167,
+ 3025, 1545, 1545, 1545, 1545, 1550, 3026, 1546, 1551, 3027,
+ 3028, 1546, 1545, 1545, 1545, 1545, 3029, 1541, 1555, 1555,
+ 1555, 1555, 3030, 3031, 3032, 1546, 1557, 1557, 1557, 1557,
+ 1556, 1564, 1564, 1564, 1564, 3033, 1546, 1558, 1564, 1564,
+ 1564, 1564, 1567, 1567, 1567, 1567, 1602, 1602, 1602, 1602,
+ 3034, 1559, 1602, 1602, 1602, 1602, 1610, 1610, 1610, 1610,
+ 1568, 3035, 1614, 1614, 1614, 1614, 3036, 1611, 1614, 1614,
+ 1614, 1614, 1616, 1616, 1616, 1616, 1560, 1615, 3037, 3038,
+ 3039, 1612, 1550, 1615, 1629, 1629, 1629, 1629, 3041, 2823,
+
+ 1633, 1634, 2823, 1635, 3043, 1636, 3044, 1628, 1637, 1638,
+ 2824, 3047, 1623, 3048, 3050, 3051, 1613, 3052, 1639, 3053,
+ 1640, 1644, 1644, 1644, 1644, 3054, 3059, 3062, 1645, 1644,
+ 1644, 1644, 1644, 3063, 3064, 2953, 1645, 1649, 1649, 1649,
+ 1649, 1655, 1655, 1655, 1655, 1612, 3065, 3066, 1656, 1650,
+ 2954, 3067, 1651, 1655, 1655, 1655, 1655, 1790, 3082, 3086,
+ 1656, 1659, 1659, 1659, 1659, 1667, 1667, 1667, 1667, 3087,
+ 3090, 1647, 1660, 1667, 1667, 1667, 1667, 1701, 3115, 1647,
+ 1669, 1669, 1669, 1669, 3116, 3117, 3122, 1670, 3123, 1668,
+ 3127, 1667, 1667, 1667, 1667, 1672, 3128, 1668, 1673, 1667,
+
+ 1667, 1667, 1667, 1710, 1702, 1703, 1710, 1704, 3129, 1705,
+ 3130, 3131, 1706, 1707, 3132, 1668, 1711, 1828, 3133, 1701,
+ 1828, 1712, 1708, 1668, 1709, 1702, 1703, 3135, 1704, 1694,
+ 1705, 3136, 3137, 1706, 1707, 1725, 1725, 1725, 1725, 1094,
+ 1094, 1094, 1094, 1708, 3138, 1709, 3140, 1831, 1724, 1100,
+ 1101, 1101, 1100, 1717, 3141, 3142, 3143, 1095, 1101, 1101,
+ 1101, 1101, 1112, 1112, 1112, 1112, 1102, 3145, 1831, 1113,
+ 3147, 3149, 1672, 1103, 3694, 1102, 1504, 3694, 1505, 1102,
+ 3150, 3694, 1103, 1105, 1105, 1105, 1105, 3151, 2372, 3152,
+ 1106, 3694, 3694, 3694, 3694, 2372, 2071, 3153, 3694, 1729,
+
+ 1729, 1729, 1729, 1108, 1108, 1108, 1108, 3154, 3155, 2203,
+ 1118, 2587, 2203, 3156, 1119, 1105, 1105, 1105, 1105, 3157,
+ 3148, 3158, 1106, 3148, 1121, 1122, 3159, 1103, 1104, 1117,
+ 1117, 1117, 1117, 3160, 1112, 1112, 1112, 1112, 3161, 2204,
+ 1118, 1113, 2990, 1115, 1119, 2990, 1102, 1732, 1732, 1732,
+ 1732, 1102, 2393, 1103, 1121, 1122, 3694, 3694, 3694, 3694,
+ 2204, 3162, 2393, 3694, 1102, 1734, 1734, 1734, 1734, 3013,
+ 3164, 3165, 1735, 3694, 1737, 1737, 1737, 1737, 1109, 3166,
+ 3167, 1110, 1117, 1117, 1117, 1117, 1124, 1124, 1124, 1124,
+ 3168, 3170, 3173, 1125, 3174, 3175, 3176, 1119, 1103, 1102,
+
+ 3177, 1117, 1117, 1117, 1117, 3178, 1103, 1121, 1122, 3180,
+ 3181, 3182, 1118, 3183, 3185, 1115, 1119, 3186, 1102, 3187,
+ 3188, 3694, 3694, 3694, 3694, 1103, 1121, 1122, 3694, 3189,
+ 3190, 1729, 1729, 1729, 1729, 3194, 3201, 3694, 1127, 1128,
+ 1128, 1127, 1118, 3202, 3203, 3207, 1119, 1128, 1128, 1128,
+ 1128, 1131, 1131, 1132, 1131, 1109, 1121, 1122, 1131, 1131,
+ 1132, 1131, 1129, 1134, 1134, 1134, 1134, 3208, 2672, 1254,
+ 1135, 1129, 2177, 3199, 3221, 1133, 3694, 3694, 3694, 3694,
+ 3222, 3227, 1133, 3694, 1739, 1739, 1739, 1739, 3200, 1134,
+ 1134, 1134, 1134, 3228, 3229, 1146, 1135, 1145, 1145, 1145,
+
+ 1145, 1140, 1140, 1140, 1140, 3225, 3230, 3245, 1146, 1747,
+ 1747, 1747, 1747, 1137, 3226, 3246, 1138, 1104, 3252, 3253,
+ 3256, 1129, 3257, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 3258, 3262, 1129, 1146, 3264, 2574, 3694, 1146, 1145,
+ 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1129, 3266, 3694,
+ 1146, 1129, 3268, 3269, 1146, 1165, 1165, 1165, 1165, 1173,
+ 1174, 1174, 1173, 1129, 2372, 3273, 1175, 1129, 1174, 1174,
+ 1174, 1174, 2372, 3274, 3275, 1175, 3276, 3277, 3278, 1166,
+ 3694, 3694, 3694, 3694, 2393, 3279, 3281, 3694, 3279, 3281,
+ 1137, 1188, 1188, 1188, 1188, 3282, 3280, 2393, 1750, 1188,
+
+ 1188, 1188, 1188, 3694, 3694, 3694, 3694, 3283, 1189, 3148,
+ 3694, 1749, 3148, 3284, 3285, 1191, 1189, 1188, 1188, 1188,
+ 1188, 3286, 1177, 1191, 3287, 1761, 1761, 1761, 1761, 3270,
+ 3271, 1177, 1762, 3292, 1189, 3293, 3294, 3296, 1178, 3297,
+ 3298, 1191, 1775, 1775, 1775, 1775, 3059, 3694, 1228, 1228,
+ 1228, 1228, 3299, 3301, 3302, 1229, 3305, 3308, 3309, 3694,
+ 1246, 1246, 1246, 1246, 3310, 1760, 1130, 1179, 1179, 1180,
+ 1179, 1130, 1130, 1130, 1181, 1130, 1130, 1130, 1130, 1130,
+ 1130, 1130, 3694, 1130, 1130, 1130, 1130, 1130, 1130, 1130,
+ 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1182, 1182,
+
+ 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1130, 1130, 1130,
+ 1130, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1183, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+ 1182, 1182, 1182, 1182, 1182, 1182, 3311, 1130, 1130, 1182,
+ 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1186, 1186,
+ 1186, 1186, 1188, 1188, 1188, 1188, 3313, 1189, 3314, 3315,
+ 3317, 1189, 3327, 3328, 1191, 3332, 3333, 3334, 1191, 1188,
+ 1188, 1188, 1188, 3335, 3356, 1812, 1191, 3359, 1201, 1201,
+ 1201, 1201, 1203, 1203, 1203, 1203, 1189, 1781, 1781, 1781,
+
+ 1781, 1790, 3360, 1191, 3358, 1192, 1202, 3361, 3364, 3365,
+ 1204, 3694, 3694, 3694, 3694, 3366, 1760, 2372, 3694, 3371,
+ 3372, 1208, 1813, 1813, 1813, 1813, 1234, 1234, 1234, 1234,
+ 1192, 3373, 1231, 3367, 3368, 1231, 3367, 1187, 1780, 1781,
+ 1781, 1780, 3374, 1832, 1207, 3375, 1832, 1904, 1264, 2393,
+ 1208, 1815, 1815, 1815, 1815, 1815, 1228, 1228, 1228, 1228,
+ 3378, 1905, 1208, 1229, 1323, 1323, 1323, 1323, 1209, 1840,
+ 1840, 1840, 1840, 1835, 1262, 1262, 1262, 1262, 3281, 1324,
+ 1841, 3281, 1210, 3379, 3369, 3370, 1842, 3369, 1211, 1232,
+ 1233, 3380, 1212, 1213, 1835, 1214, 1215, 1216, 1208, 3381,
+
+ 1264, 1217, 1218, 1219, 1220, 1221, 3382, 1222, 3386, 1223,
+ 1224, 1225, 1226, 1227, 1241, 1241, 1241, 1241, 3387, 3389,
+ 3392, 1242, 3279, 1243, 3393, 3279, 3398, 1243, 3694, 3694,
+ 3694, 3694, 3399, 3280, 3400, 3694, 2013, 3694, 1244, 2013,
+ 2014, 3694, 1819, 1819, 1819, 1819, 1822, 1822, 1822, 1822,
+ 3405, 1243, 3694, 1820, 2014, 1243, 3406, 3327, 1823, 1824,
+ 1828, 3225, 1832, 1828, 1829, 1832, 2015, 1243, 2207, 3412,
+ 1826, 2207, 1827, 1830, 3413, 1837, 1837, 1837, 1837, 1235,
+ 1959, 3694, 1236, 1840, 1840, 1840, 1840, 2015, 3414, 1782,
+ 1831, 1851, 1835, 2155, 1841, 1243, 3433, 3434, 1835, 1208,
+
+ 1842, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 3435,
+ 3436, 1831, 1841, 1835, 3437, 3439, 1841, 3437, 1842, 1835,
+ 3440, 2071, 1842, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
+ 1840, 3441, 3438, 3376, 1841, 3438, 3376, 2071, 1841, 3442,
+ 1842, 3443, 3013, 3376, 1842, 3377, 3376, 3444, 1844, 1262,
+ 1262, 1262, 1262, 3013, 3448, 3377, 1235, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 3048, 3451, 1845, 1846, 1855,
+ 1855, 1855, 1855, 1208, 1847, 1264, 1262, 1262, 1262, 1262,
+ 3452, 1208, 3453, 1264, 3456, 1208, 1850, 1264, 1262, 1262,
+ 1262, 1262, 3367, 3368, 1848, 3367, 3457, 1849, 3369, 3370,
+
+ 1208, 3369, 1264, 1852, 1853, 3458, 3459, 1854, 1262, 1262,
+ 1262, 1262, 1208, 3462, 1264, 1262, 1262, 1262, 1262, 3463,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1856, 3462,
+ 3464, 3465, 1208, 3479, 1264, 1262, 1262, 1262, 1262, 1208,
+ 3480, 1264, 3135, 2071, 1208, 1857, 1264, 3485, 1208, 2071,
+ 1264, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1208,
+ 1858, 1264, 3013, 1859, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1860, 3486, 3013, 1208, 3489, 1264, 3490, 1208,
+ 1862, 1264, 1861, 1262, 1262, 1262, 1262, 3491, 1208, 3492,
+ 1264, 3493, 1208, 3494, 1264, 3495, 1863, 1864, 1262, 1262,
+
+ 1262, 1262, 1262, 1262, 1262, 1262, 3462, 1208, 3500, 1264,
+ 1262, 1262, 1262, 1262, 1866, 1262, 1262, 1262, 1262, 3501,
+ 3437, 1867, 1208, 3437, 1264, 1865, 1208, 3481, 1264, 3510,
+ 2071, 1870, 3013, 1868, 1208, 3438, 1264, 1869, 3438, 1208,
+ 3515, 1264, 3483, 1262, 1262, 1262, 1262, 3317, 3516, 3519,
+ 1871, 1262, 1262, 1262, 1262, 1872, 1262, 1262, 1262, 1262,
+ 1876, 1873, 3520, 1874, 3459, 3694, 1877, 1208, 3694, 1264,
+ 3522, 1875, 3694, 3523, 3527, 1208, 2010, 1264, 2013, 2010,
+ 1208, 2013, 1264, 1262, 1262, 1262, 1262, 3530, 1878, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+
+ 1262, 1879, 1262, 1262, 1262, 1262, 2012, 1208, 2015, 1264,
+ 3492, 3694, 3531, 1208, 3694, 1264, 3532, 1208, 3694, 1264,
+ 3534, 1208, 1881, 1264, 1880, 3535, 1208, 2012, 1264, 2015,
+ 1262, 1262, 1262, 1262, 3539, 1262, 1262, 1262, 1262, 3542,
+ 1262, 1262, 1262, 1262, 3543, 1884, 1882, 1304, 1304, 1304,
+ 1304, 1883, 3549, 1885, 1208, 3551, 1264, 1888, 1887, 1208,
+ 3532, 1264, 3563, 1886, 1208, 3566, 1264, 1262, 1262, 1262,
+ 1262, 1305, 3569, 1889, 1262, 1262, 1262, 1262, 2632, 2631,
+ 2630, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1090,
+ 2629, 1208, 2628, 1264, 1150, 2618, 1890, 1090, 1208, 2617,
+
+ 1264, 1153, 1150, 1892, 1891, 1208, 2616, 1264, 1153, 1208,
+ 1154, 1264, 1306, 1306, 1306, 1306, 1153, 1162, 1154, 1307,
+ 3694, 3694, 3694, 3694, 2615, 1162, 2614, 3694, 2372, 2612,
+ 1893, 1899, 1899, 1899, 1899, 1306, 1306, 1306, 1306, 1894,
+ 2611, 1169, 1307, 1313, 1313, 1313, 1313, 2057, 1828, 1169,
+ 1896, 1828, 1895, 1313, 1313, 1313, 1313, 1315, 1901, 1901,
+ 1901, 1901, 1309, 2209, 2608, 1310, 2209, 1305, 2049, 1315,
+ 1313, 1313, 1313, 1313, 2107, 2045, 2210, 1305, 1831, 1315,
+ 1171, 2041, 1305, 1316, 1094, 1094, 1316, 1828, 1171, 1317,
+ 1828, 1902, 2037, 2211, 1305, 2598, 1315, 2028, 2595, 1831,
+
+ 1903, 1095, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325,
+ 1339, 1339, 1339, 1339, 2211, 2007, 2592, 1831, 1339, 1339,
+ 1339, 1339, 1920, 1920, 1920, 1920, 2591, 2590, 1184, 1340,
+ 2589, 2586, 1351, 1351, 1351, 1351, 1184, 1340, 1831, 1309,
+ 1326, 1326, 1326, 1326, 1352, 1930, 1930, 1930, 1930, 1355,
+ 1356, 1356, 1355, 2585, 1319, 1357, 1931, 1356, 1356, 1356,
+ 1356, 1359, 1319, 1828, 1359, 2582, 1828, 1327, 2581, 2580,
+ 2579, 1932, 1937, 1937, 1937, 1937, 1938, 1939, 1940, 1938,
+ 1933, 1933, 1933, 1933, 1933, 1365, 1365, 1365, 1365, 1944,
+ 1944, 1944, 1944, 1831, 2578, 1328, 1945, 1329, 2577, 1368,
+
+ 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1330, 1331, 2574,
+ 1163, 1332, 1333, 1334, 1831, 1335, 1369, 1163, 1336, 2573,
+ 1369, 2572, 2571, 1371, 2570, 1163, 1336, 1371, 1368, 1368,
+ 1368, 1368, 1368, 1368, 1368, 1368, 1373, 1373, 1373, 1373,
+ 1375, 1375, 1375, 1375, 1170, 1369, 1367, 1376, 2569, 1369,
+ 1172, 1170, 1371, 1951, 1367, 2564, 1371, 1172, 1942, 1170,
+ 1374, 3694, 3694, 3694, 3694, 1172, 1430, 1445, 3694, 1375,
+ 1375, 1375, 1375, 1935, 1430, 1445, 1376, 1373, 1373, 1373,
+ 1373, 1949, 1949, 1949, 1949, 1378, 1194, 1250, 1379, 1373,
+ 1373, 1373, 1373, 2293, 2558, 2557, 1385, 1322, 1947, 1385,
+
+ 2556, 1374, 1194, 1250, 1322, 1374, 1953, 1953, 1953, 1953,
+ 1194, 1250, 1322, 1374, 2555, 1815, 1815, 1815, 1815, 1815,
+ 1391, 1391, 1391, 1391, 1399, 1399, 1399, 1399, 1423, 1423,
+ 1423, 1423, 1434, 1434, 1434, 1434, 2554, 2207, 1392, 2553,
+ 2207, 2552, 1400, 1438, 1438, 1438, 1438, 1449, 1449, 1449,
+ 1449, 1449, 1449, 1449, 1449, 2551, 1969, 1969, 1969, 1969,
+ 2550, 2549, 1378, 1970, 1450, 2548, 2547, 1835, 1450, 1971,
+ 1449, 1449, 1449, 1449, 1453, 1453, 1453, 1453, 1453, 1453,
+ 1453, 1453, 1453, 1453, 1453, 1453, 1448, 1450, 1835, 1435,
+ 1973, 1973, 1973, 1973, 1448, 2546, 2545, 1974, 1456, 1456,
+
+ 1456, 1456, 1981, 1981, 1981, 1981, 1480, 1480, 1480, 1480,
+ 1488, 1488, 1488, 1488, 2544, 1341, 1431, 1982, 1486, 1486,
+ 1486, 1486, 1341, 1431, 1452, 1455, 2543, 2482, 2481, 1455,
+ 1341, 1431, 1452, 1455, 1490, 1487, 1488, 1488, 1488, 1488,
+ 1488, 1488, 1488, 1488, 2009, 2009, 2009, 2009, 2010, 2479,
+ 2201, 2010, 2011, 1457, 2475, 1527, 1527, 1527, 1527, 2468,
+ 2467, 2011, 1528, 1458, 1490, 3694, 3694, 3694, 3694, 1467,
+ 2466, 1458, 3694, 1530, 1530, 1530, 1530, 1467, 2012, 1530,
+ 1530, 1530, 1530, 2464, 2463, 1987, 1531, 1530, 1530, 1530,
+ 1530, 1459, 1531, 2462, 1535, 1535, 1535, 1535, 1459, 2012,
+
+ 1531, 1536, 1256, 1537, 1470, 2461, 1459, 1537, 3694, 3694,
+ 3694, 3694, 1470, 1473, 2460, 3694, 2459, 3694, 1256, 1478,
+ 1473, 3694, 1535, 1535, 1535, 1535, 1256, 1478, 1473, 1536,
+ 2458, 1537, 2457, 2456, 2455, 1537, 1539, 1539, 1539, 1539,
+ 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1542, 1542,
+ 1542, 1542, 2452, 2018, 2018, 2018, 2018, 2451, 1481, 1543,
+ 2019, 1545, 1545, 1545, 1545, 1481, 2020, 1547, 1547, 1547,
+ 1547, 1485, 1544, 1481, 1548, 3694, 3694, 3694, 3694, 1485,
+ 1502, 1508, 3694, 2450, 1509, 1546, 1541, 2449, 1502, 1508,
+ 1541, 1509, 1514, 1516, 1541, 1547, 1547, 1547, 1547, 1509,
+
+ 1514, 1516, 1548, 1545, 1545, 1545, 1545, 2024, 2024, 2024,
+ 2024, 1550, 2448, 2447, 1551, 1545, 1545, 1545, 1545, 2446,
+ 1555, 1555, 1555, 1555, 2445, 2444, 2443, 1546, 2442, 1572,
+ 1574, 1546, 1556, 2025, 2025, 2025, 2025, 1572, 1574, 1546,
+ 1557, 1557, 1557, 1557, 2026, 1564, 1564, 1564, 1564, 2441,
+ 2440, 1558, 2030, 2030, 2030, 2030, 1567, 1567, 1567, 1567,
+ 2039, 2039, 2039, 2039, 2439, 1559, 2043, 2043, 2043, 2043,
+ 2047, 2047, 2047, 2047, 1568, 2051, 2051, 2051, 2051, 1599,
+ 1515, 1606, 1599, 1602, 1602, 1602, 1602, 1515, 1550, 1606,
+ 1560, 2059, 2059, 2059, 2059, 1515, 2438, 2437, 2052, 2052,
+
+ 2052, 2052, 2052, 1610, 1610, 1610, 1610, 1614, 1614, 1614,
+ 1614, 2436, 1517, 1648, 1611, 1616, 1616, 1616, 1616, 1517,
+ 2435, 1648, 1615, 1616, 1616, 1616, 1616, 1517, 1612, 1629,
+ 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1644, 1644, 1644,
+ 1644, 1658, 1628, 1731, 1645, 3694, 3694, 3694, 3694, 1658,
+ 2434, 1731, 3694, 1613, 1649, 1649, 1649, 1649, 1649, 1649,
+ 1649, 1649, 1649, 1649, 1649, 1649, 1650, 1741, 1237, 1651,
+ 1650, 2433, 2432, 1651, 1650, 1741, 1237, 1651, 2074, 2074,
+ 2074, 2074, 1612, 2075, 2075, 2075, 2075, 1647, 1649, 1649,
+ 1649, 1649, 1154, 2431, 1573, 3694, 2076, 2076, 2076, 2076,
+
+ 1650, 1573, 1250, 1651, 1655, 1655, 1655, 1655, 1154, 1573,
+ 1250, 1656, 3694, 3694, 3694, 3694, 1154, 2430, 2429, 3694,
+ 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 2426, 2425,
+ 2424, 1660, 2421, 2420, 1773, 1660, 1659, 1659, 1659, 1659,
+ 1667, 1667, 1667, 1667, 2417, 1575, 1575, 1660, 1669, 1669,
+ 1669, 1669, 1575, 2416, 1609, 1670, 3694, 3694, 3694, 3694,
+ 1575, 1609, 1256, 3694, 1668, 1669, 1669, 1669, 1669, 1609,
+ 1256, 2415, 1670, 1667, 1667, 1667, 1667, 2082, 2082, 2082,
+ 2082, 1672, 2414, 1756, 1673, 1667, 1667, 1667, 1667, 1725,
+ 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1668, 1189, 1756,
+
+ 1311, 1668, 1724, 1729, 1729, 1729, 1729, 1756, 1311, 1668,
+ 1729, 1729, 1729, 1729, 1855, 1855, 1855, 1855, 1119, 1153,
+ 2411, 1118, 1155, 2122, 2402, 1119, 1153, 2401, 1121, 1122,
+ 2108, 2108, 2108, 2108, 1153, 1121, 1122, 1734, 1734, 1734,
+ 1734, 1118, 2100, 2398, 1735, 1119, 1732, 1732, 1732, 1732,
+ 1732, 1732, 1732, 1732, 1103, 1121, 1122, 1380, 1672, 3694,
+ 3694, 3694, 3694, 1102, 1765, 1380, 3694, 1102, 1737, 1737,
+ 1737, 1737, 1109, 1856, 1163, 1110, 1729, 1729, 1729, 1729,
+ 1765, 1163, 1739, 1739, 1739, 1739, 2397, 1118, 1765, 1163,
+ 1552, 1119, 1103, 1146, 1739, 1739, 1739, 1739, 1552, 2396,
+
+ 2395, 1121, 1122, 2394, 2393, 1146, 1145, 1145, 1145, 1145,
+ 2392, 1747, 1747, 1747, 1747, 1137, 2207, 1146, 1138, 2207,
+ 1145, 1145, 1145, 1145, 1665, 1674, 1145, 1145, 1145, 1145,
+ 1129, 1146, 1665, 1674, 2388, 1129, 2385, 1146, 2124, 2124,
+ 2124, 2124, 2125, 2384, 1129, 2126, 1835, 2383, 2382, 1109,
+ 1129, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 2381,
+ 2079, 1194, 2127, 1761, 1761, 1761, 1761, 1835, 1189, 1170,
+ 1762, 1172, 1189, 2380, 2378, 1191, 1170, 1194, 1172, 1191,
+ 3694, 3694, 3694, 3694, 1170, 1194, 1172, 3694, 2377, 2376,
+ 2375, 2118, 1137, 2117, 1188, 1188, 1188, 1188, 2132, 2132,
+
+ 2132, 2132, 2138, 2374, 2373, 1762, 2143, 2143, 2143, 2143,
+ 2372, 2139, 2139, 2139, 2139, 2371, 2370, 2369, 1191, 2125,
+ 1813, 1813, 1813, 1813, 2129, 2142, 2143, 2143, 2142, 2057,
+ 1208, 1207, 1837, 1837, 1837, 1837, 1235, 1836, 1767, 1236,
+ 1813, 1813, 1813, 1813, 1836, 1767, 1264, 1767, 2057, 1208,
+ 2365, 2183, 1836, 1767, 2183, 1209, 1208, 2190, 2190, 2190,
+ 2190, 1322, 2364, 2049, 2191, 2049, 1264, 2045, 1322, 1210,
+ 1815, 1815, 1815, 1815, 1815, 1211, 1322, 2045, 1341, 1212,
+ 1213, 1244, 1214, 1215, 1216, 1341, 2041, 2041, 1217, 1218,
+ 1219, 1220, 1221, 1341, 1222, 1968, 1223, 1224, 1225, 1226,
+
+ 1227, 1819, 1819, 1819, 1819, 1920, 1920, 1920, 1920, 2037,
+ 1243, 1968, 1820, 1235, 1243, 2186, 2186, 2186, 2186, 1968,
+ 2037, 2350, 2187, 2348, 1243, 2028, 2028, 2091, 1243, 1822,
+ 1822, 1822, 1822, 2193, 2193, 2193, 2193, 1541, 2017, 2188,
+ 2212, 1823, 1824, 2091, 2194, 2195, 2195, 2195, 2195, 2206,
+ 2007, 2091, 2196, 1826, 1243, 2007, 2336, 2197, 1822, 1822,
+ 1822, 1822, 1837, 1837, 1837, 1837, 1235, 2335, 1243, 1236,
+ 1823, 1824, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
+ 1154, 2334, 1826, 1841, 1827, 2333, 1208, 1841, 1154, 1840,
+ 1840, 1840, 1840, 1842, 1840, 1840, 1840, 1840, 2332, 1504,
+
+ 1841, 1840, 1840, 1840, 1840, 1841, 1842, 2284, 2284, 2284,
+ 2284, 1842, 1841, 1840, 1840, 1840, 1840, 1998, 1842, 2329,
+ 1840, 1840, 1840, 1840, 1841, 1840, 1840, 1840, 1840, 2328,
+ 1842, 1841, 1262, 1262, 1262, 1262, 1841, 1842, 1840, 1840,
+ 1840, 1840, 1842, 1235, 2217, 1262, 1262, 1262, 1262, 1841,
+ 2327, 1262, 1262, 1262, 1262, 1842, 1208, 2326, 1264, 1899,
+ 1899, 1899, 1899, 2218, 2225, 1938, 1939, 1940, 1938, 1208,
+ 1756, 1264, 1948, 2325, 2219, 1208, 1765, 1264, 1756, 1948,
+ 2324, 2223, 2323, 2221, 1765, 1315, 2220, 1948, 2222, 2227,
+ 2226, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+
+ 1262, 1262, 1262, 2322, 1262, 1262, 1262, 1262, 2224, 1262,
+ 1262, 1262, 1262, 2321, 1968, 1208, 2091, 1264, 2216, 1208,
+ 2107, 1264, 1968, 1208, 2091, 1264, 2216, 2271, 1208, 2107,
+ 1264, 2319, 2318, 1208, 2314, 1264, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 2313, 2312, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 2311, 1502,
+ 1208, 2310, 1264, 2309, 1208, 2228, 1264, 1502, 2229, 2231,
+ 1208, 2230, 1264, 1960, 1208, 2308, 1264, 1956, 1208, 1951,
+ 1264, 2232, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1951, 1262, 1262, 1262, 1262, 2289, 2289, 2289, 2289, 2233,
+
+ 1262, 1262, 1262, 1262, 2299, 1574, 1208, 2298, 1264, 2234,
+ 1208, 1935, 1264, 1574, 2235, 1208, 2236, 1264, 1935, 2290,
+ 2293, 2237, 2291, 2288, 1208, 2287, 1264, 2286, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 2285, 2238, 1262, 1262, 1262, 1262, 1940, 1939, 1940, 1940,
+ 2240, 2239, 1208, 2128, 1264, 3419, 1208, 2283, 1264, 2241,
+ 1208, 2128, 1264, 3419, 2282, 2210, 1208, 2281, 1264, 1262,
+ 1262, 1262, 1262, 2280, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 2279, 2242, 1262, 1262,
+ 1262, 1262, 1431, 1208, 2278, 1264, 1459, 2243, 1208, 1431,
+
+ 1264, 2277, 1208, 1459, 1264, 2245, 1208, 1431, 1264, 2244,
+ 2203, 1459, 1208, 2203, 1264, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1473, 1262, 1262, 1262, 1262, 2246, 2276,
+ 1473, 2247, 1262, 1262, 1262, 1262, 2271, 2275, 1473, 1208,
+ 2204, 1264, 2274, 1208, 2249, 1264, 2273, 2270, 1208, 2248,
+ 1264, 1262, 1262, 1262, 1262, 2269, 1208, 1793, 1264, 2215,
+ 2214, 2204, 2250, 1262, 1262, 1262, 2257, 2213, 2201, 1481,
+ 2251, 1262, 1262, 1262, 1262, 1208, 1481, 1264, 2252, 2199,
+ 1262, 1262, 1262, 1262, 1481, 2185, 2184, 1208, 2182, 1264,
+ 2181, 1262, 1262, 1262, 1262, 1208, 2180, 1264, 2179, 2253,
+
+ 2178, 2254, 2175, 2174, 1208, 2255, 1264, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1208, 2256, 1264, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 2173, 1208, 2170, 1264, 2169, 1208, 1509, 1264, 2317, 2317,
+ 2317, 2317, 1208, 1509, 1264, 2258, 1208, 2259, 1264, 2168,
+ 1208, 1509, 1264, 1899, 1899, 1899, 1899, 2167, 1262, 1262,
+ 1262, 1262, 2166, 2165, 2260, 1262, 1262, 1262, 1262, 2158,
+ 1262, 1262, 1262, 1262, 2157, 2156, 2153, 2263, 2152, 1315,
+ 2262, 2261, 1208, 2207, 1264, 2151, 2207, 2216, 2150, 1208,
+ 2264, 1264, 2209, 2265, 1208, 2209, 1264, 1901, 1901, 1901,
+
+ 1901, 1309, 2149, 2216, 1310, 2210, 2146, 1773, 1773, 2107,
+ 2136, 2216, 2135, 1835, 1449, 1449, 1449, 1449, 2272, 2134,
+ 2133, 1305, 2211, 1192, 1189, 2268, 1930, 1930, 1930, 1930,
+ 2122, 1450, 2266, 2119, 1835, 2296, 2294, 1931, 2267, 2294,
+ 2116, 2115, 2107, 2211, 2297, 2297, 2297, 2297, 2300, 2300,
+ 2300, 2300, 1932, 2105, 2101, 1933, 1933, 1933, 1933, 1933,
+ 1944, 1944, 1944, 1944, 2100, 1369, 2099, 1945, 3694, 3694,
+ 3694, 3694, 1371, 2098, 2097, 3694, 2096, 2095, 1309, 1368,
+ 1368, 1368, 1368, 1949, 1949, 1949, 1949, 1378, 2304, 2093,
+ 1379, 1981, 1981, 1981, 1981, 2092, 1369, 2305, 2305, 2305,
+
+ 2305, 2090, 2089, 1371, 1700, 1515, 1982, 1374, 1969, 1969,
+ 1969, 1969, 1515, 1687, 1687, 1970, 3694, 3694, 3694, 3694,
+ 1515, 1971, 2087, 3694, 1973, 1973, 1973, 1973, 1687, 3694,
+ 2086, 1974, 3694, 3694, 3694, 3694, 2338, 2085, 2302, 3694,
+ 2320, 2320, 2320, 2320, 1517, 2339, 2339, 2339, 2339, 2010,
+ 2013, 1517, 2010, 2013, 2018, 2018, 2018, 2018, 1502, 1517,
+ 2084, 2019, 1685, 1683, 1378, 1675, 2080, 2020, 2079, 1654,
+ 3694, 3694, 3694, 3694, 1502, 2107, 2107, 3694, 1654, 2012,
+ 2015, 2072, 1502, 3694, 2340, 2340, 2340, 2340, 2341, 2341,
+ 2341, 2341, 2024, 2024, 2024, 2024, 1550, 2020, 2345, 1551,
+
+ 2012, 2015, 2025, 2025, 2025, 2025, 2070, 2346, 2346, 2346,
+ 2346, 2352, 2343, 2026, 2363, 2355, 1546, 2363, 2069, 2358,
+ 2353, 2353, 2353, 2353, 2356, 2356, 2356, 2356, 2359, 2359,
+ 2359, 2359, 2361, 2052, 2052, 2052, 2052, 2052, 2367, 2068,
+ 2067, 2362, 2362, 2362, 2362, 2066, 2065, 2368, 2368, 2368,
+ 2368, 1649, 1649, 1649, 1649, 2074, 2074, 2074, 2074, 2075,
+ 2075, 2075, 2075, 1650, 2063, 2062, 1651, 2076, 2076, 2076,
+ 2076, 2061, 2060, 1550, 2076, 2076, 2076, 2076, 2082, 2082,
+ 2082, 2082, 1672, 2057, 2055, 1673, 2108, 2108, 2108, 2108,
+ 1574, 2049, 2108, 2108, 2108, 2108, 2045, 1145, 1145, 1145,
+
+ 1145, 1119, 1668, 1118, 2041, 2037, 1574, 1119, 1146, 2035,
+ 1103, 1121, 1122, 2023, 1574, 1576, 1103, 1121, 1122, 1576,
+ 2023, 1129, 2406, 2406, 2406, 2406, 3139, 3144, 2023, 2407,
+ 2409, 2409, 2409, 2409, 1188, 1188, 1188, 1188, 2132, 2132,
+ 2132, 2132, 3139, 3144, 2028, 1762, 2190, 2190, 2190, 2190,
+ 3139, 3144, 1562, 2191, 2127, 1553, 2022, 2017, 1191, 1672,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2390, 2390, 2390, 2390, 2390, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2389, 2389, 2389, 2389, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2389, 2389, 2389, 2391, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 1145, 2007, 2005, 2004, 1146, 2001, 1998, 1996, 1146,
+ 2124, 2124, 2124, 2124, 2125, 1995, 1992, 2126, 1129, 1991,
+ 1990, 1989, 1129, 2409, 2409, 2409, 2409, 2125, 1988, 1466,
+ 2410, 1773, 1980, 1979, 2127, 1188, 1188, 1188, 1188, 1978,
+ 2419, 2419, 2419, 2419, 1977, 1976, 1975, 2127, 2423, 2423,
+
+ 2423, 2423, 1189, 2193, 2193, 2193, 2193, 2404, 1967, 1191,
+ 2186, 2186, 2186, 2186, 2194, 2403, 1966, 2187, 1965, 1243,
+ 1964, 1573, 1208, 1243, 3694, 3694, 3694, 3694, 1573, 1963,
+ 1436, 3694, 1609, 3694, 2188, 1962, 1573, 3694, 1961, 1609,
+ 1414, 2125, 2469, 2469, 2469, 2469, 1960, 1609, 3694, 1406,
+ 2413, 1406, 1575, 1575, 2125, 2422, 2423, 2423, 2422, 1575,
+ 1956, 1207, 1951, 1243, 1381, 1369, 2471, 1575, 2472, 3694,
+ 3694, 3694, 3694, 1943, 1935, 1929, 3694, 3694, 1928, 1208,
+ 2473, 2473, 2473, 2473, 1927, 1209, 2195, 2195, 2195, 2195,
+ 1926, 1925, 1823, 2196, 2284, 2284, 2284, 2284, 2197, 1210,
+
+ 1840, 1840, 1840, 1840, 1826, 1211, 1827, 1924, 2081, 1212,
+ 1213, 1841, 1214, 1215, 1216, 2081, 1923, 1842, 1217, 1218,
+ 1219, 1220, 1221, 2081, 1222, 1922, 1223, 1224, 1225, 1226,
+ 1227, 3694, 3694, 3694, 3694, 2196, 1921, 1914, 3694, 1911,
+ 2197, 1910, 1909, 3694, 1908, 1907, 1906, 2476, 2476, 2476,
+ 2476, 2476, 2186, 2186, 2186, 2186, 1312, 1898, 1897, 2191,
+ 1267, 1243, 1851, 1839, 1838, 1243, 2473, 2473, 2473, 2473,
+ 1840, 1840, 1840, 1840, 1821, 1817, 2188, 1816, 1823, 2078,
+ 2078, 1841, 1840, 1840, 1840, 1840, 2078, 1842, 1809, 1808,
+ 1826, 1805, 1802, 1841, 2078, 1840, 1840, 1840, 1840, 1842,
+
+ 1840, 1840, 1840, 1840, 1798, 1243, 1841, 1840, 1840, 1840,
+ 1840, 1841, 1842, 2284, 2284, 2284, 2284, 1842, 1841, 1840,
+ 1840, 1840, 1840, 1797, 1842, 1796, 1840, 1840, 1840, 1840,
+ 1841, 1792, 1262, 1262, 1262, 1262, 1842, 1841, 1840, 1840,
+ 1840, 1840, 2484, 1842, 1789, 1788, 1267, 2485, 1787, 1841,
+ 1262, 1262, 1262, 1262, 2486, 1842, 1208, 1782, 1264, 1262,
+ 1262, 1262, 1262, 2487, 1262, 1262, 1262, 1262, 1773, 1771,
+ 1770, 2492, 1192, 3694, 1208, 1193, 1264, 1766, 1262, 1262,
+ 1262, 1262, 2488, 1208, 1764, 1264, 1758, 2494, 1208, 1161,
+ 1264, 2490, 2489, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+
+ 1262, 2493, 1208, 2110, 1264, 1262, 1262, 1262, 1262, 1755,
+ 2110, 1754, 2491, 1262, 1262, 1262, 1262, 1208, 2110, 1264,
+ 2495, 1208, 1753, 1264, 1262, 1262, 1262, 1262, 1748, 1208,
+ 1143, 1264, 2507, 2507, 2507, 2507, 1143, 1208, 1116, 1264,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1208, 2496,
+ 1264, 1098, 2498, 1720, 1717, 1687, 1208, 1687, 1264, 1262,
+ 1262, 1262, 1262, 1687, 1208, 2497, 1264, 2131, 1208, 2131,
+ 1264, 2289, 2289, 2289, 2289, 1687, 2131, 1685, 2499, 1684,
+ 2500, 1683, 1675, 1208, 2131, 1264, 1666, 2501, 2502, 2503,
+ 2503, 2503, 2503, 2502, 2502, 2502, 2502, 2502, 2502, 2502,
+
+ 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 1654, 2510,
+ 1643, 2508, 2516, 2504, 1623, 2505, 2502, 2502, 2502, 2502,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 2509, 1262, 1262, 1262, 1262, 1608, 2121, 2502,
+ 2502, 2502, 2502, 2121, 1208, 2121, 1264, 1605, 1208, 1604,
+ 1264, 1603, 1208, 2121, 1264, 1598, 1595, 1208, 1592, 1264,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 2502, 2502,
+ 2502, 2506, 1262, 1262, 1262, 1262, 1587, 1262, 1262, 1262,
+ 1262, 1581, 1836, 2511, 1208, 1577, 1264, 1576, 1208, 1836,
+ 1264, 1262, 1262, 1262, 1262, 2512, 1208, 1836, 1264, 2514,
+
+ 2513, 1208, 1571, 1264, 1262, 1262, 1262, 1262, 1566, 1262,
+ 1262, 1262, 1262, 1562, 1553, 1208, 1164, 1264, 1262, 1262,
+ 1262, 1262, 1526, 1262, 1262, 1262, 1262, 1525, 1208, 1524,
+ 1264, 2517, 1523, 1208, 2515, 1264, 1262, 1262, 1262, 1262,
+ 1520, 1519, 1208, 2518, 1264, 2519, 2520, 1208, 1513, 1264,
+ 1512, 1262, 1262, 1262, 1262, 1511, 1262, 1262, 1262, 1262,
+ 1208, 1510, 1264, 1262, 1262, 1262, 1262, 1500, 1262, 1262,
+ 1262, 1262, 2521, 1499, 2522, 1208, 1498, 1264, 1497, 2523,
+ 1208, 1496, 1264, 1262, 1262, 1262, 1262, 1208, 1495, 1264,
+ 2524, 2525, 1208, 1475, 1264, 1262, 1262, 1262, 1262, 2289,
+
+ 2289, 2289, 2289, 1262, 1262, 1262, 1262, 1208, 1466, 1264,
+ 2526, 1262, 1262, 1262, 1262, 2527, 1464, 1461, 1460, 1208,
+ 1439, 1264, 1436, 2290, 1433, 2529, 2528, 1208, 1432, 1264,
+ 1262, 1262, 1262, 1262, 1414, 1208, 1406, 1264, 1767, 1401,
+ 2530, 1262, 1262, 1262, 1262, 1767, 2531, 1767, 1390, 1387,
+ 2532, 1381, 1364, 1767, 1208, 1361, 1264, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1208, 2533, 1264, 2534, 1353,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1350, 1347,
+ 1346, 1208, 1345, 1264, 1344, 1208, 1341, 1264, 1262, 1262,
+ 1262, 1262, 1343, 1341, 1208, 2535, 1264, 1342, 1208, 2536,
+
+ 1264, 1341, 2559, 2559, 2559, 2559, 1935, 1312, 2537, 1267,
+ 1254, 1251, 1208, 2560, 1264, 2563, 2563, 2563, 2563, 1249,
+ 1200, 1198, 2539, 1193, 2538, 2300, 2300, 2300, 2300, 2540,
+ 2300, 2300, 2300, 2300, 1368, 1368, 1368, 1368, 1449, 1449,
+ 1449, 1449, 1369, 2317, 2317, 2317, 2317, 1369, 2541, 1371,
+ 1185, 1369, 1164, 1951, 1371, 1450, 1161, 1144, 1371, 1143,
+ 1116, 2542, 2568, 2568, 2568, 2568, 2320, 2320, 2320, 2320,
+ 2007, 2340, 2340, 2340, 2340, 2341, 2341, 2341, 2341, 2594,
+ 2594, 2594, 2594, 2028, 2020, 2341, 2341, 2341, 2341, 3694,
+ 1948, 2037, 2597, 2597, 2597, 2597, 3694, 1948, 3694, 2343,
+
+ 2600, 2600, 2600, 2600, 2041, 1948, 2566, 3694, 2045, 2343,
+ 3694, 3694, 2049, 2602, 2602, 2602, 2602, 2604, 2604, 2604,
+ 2604, 2606, 2606, 2606, 2606, 2057, 2406, 2406, 2406, 2406,
+ 3694, 3694, 3694, 2407, 2610, 2610, 2610, 2610, 2619, 2620,
+ 3694, 3694, 3694, 2621, 3694, 3694, 2622, 2623, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 2624, 3694, 2625, 2389,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2389, 2390,
+ 2390, 2390, 2390, 2390, 2389, 2389, 2389, 2389, 2389, 2389,
+ 2389, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2389, 2389, 2389, 2389, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2389,
+ 2389, 2389, 2391, 2642, 2643, 3694, 3694, 3694, 2644, 3694,
+ 3694, 2645, 2646, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
+ 1145, 2647, 3694, 2648, 1146, 3694, 3694, 3694, 1146, 2409,
+ 2409, 2409, 2409, 2409, 2409, 2409, 2409, 1129, 3694, 3694,
+ 1431, 1129, 2652, 2652, 2652, 2652, 2125, 1431, 3694, 2410,
+ 3694, 3694, 3694, 2127, 3694, 1431, 3694, 2127, 2023, 1188,
+
+ 1188, 1188, 1188, 3694, 3694, 2023, 2127, 2081, 2649, 2659,
+ 2659, 2659, 2659, 2023, 2081, 2650, 1189, 2674, 2674, 2674,
+ 2674, 3694, 2081, 1191, 2703, 2703, 2703, 2703, 3694, 3694,
+ 3694, 2187, 3694, 1208, 3694, 2469, 2469, 2469, 2469, 2777,
+ 2777, 2777, 2777, 3694, 2473, 2473, 2473, 2473, 2188, 2469,
+ 2469, 2469, 2469, 3694, 3694, 3694, 1823, 3694, 2653, 2471,
+ 3694, 3694, 3694, 2125, 2658, 2659, 2659, 2658, 1826, 2196,
+ 1207, 3694, 3694, 2471, 2197, 2472, 3694, 2473, 2473, 2473,
+ 2473, 2476, 2476, 2476, 2476, 2476, 3694, 3694, 1208, 1823,
+ 2787, 2787, 2787, 2787, 1209, 3694, 2508, 2196, 3694, 3694,
+
+ 3694, 1826, 2197, 1827, 2781, 2781, 2781, 2781, 1210, 2476,
+ 2476, 2476, 2476, 2476, 1211, 2782, 3694, 2110, 1212, 1213,
+ 3694, 1214, 1215, 1216, 2110, 3694, 3694, 1217, 1218, 1219,
+ 1220, 1221, 2110, 1222, 3694, 1223, 1224, 1225, 1226, 1227,
+ 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 2986, 3694,
+ 3482, 1841, 3484, 3694, 2986, 1841, 3482, 1842, 3484, 3694,
+ 3694, 1842, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840,
+ 2986, 3694, 3482, 1841, 3484, 3694, 2783, 1841, 2986, 1842,
+ 3482, 3694, 3484, 1842, 1840, 1840, 1840, 1840, 1840, 1840,
+ 1840, 1840, 3694, 3694, 3694, 1841, 2078, 2078, 3694, 1841,
+
+ 3694, 1842, 3694, 2078, 3694, 1842, 1840, 1840, 1840, 1840,
+ 3694, 2078, 1262, 1262, 1262, 1262, 2709, 1841, 3694, 3694,
+ 3694, 2710, 3694, 1842, 1840, 1840, 1840, 1840, 1840, 1840,
+ 1840, 1840, 3694, 3694, 3694, 1841, 1208, 2711, 1264, 1841,
+ 3694, 1842, 3694, 2713, 3694, 1842, 3694, 2718, 2848, 2848,
+ 2848, 2848, 2712, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 2559, 2559, 2559, 2559, 2714, 1262, 1262, 1262, 1262,
+ 3694, 2121, 2560, 3694, 2715, 3694, 2121, 1208, 2121, 1264,
+ 2131, 1208, 2131, 1264, 3694, 3694, 2121, 2716, 3694, 2131,
+ 1208, 2717, 1264, 3694, 3694, 3694, 2719, 2131, 2720, 1262,
+
+ 1262, 1262, 1262, 2723, 2723, 2723, 2723, 3694, 1262, 1262,
+ 1262, 1262, 2726, 2726, 2726, 2726, 1262, 1262, 1262, 1262,
+ 3694, 3694, 3694, 1208, 3694, 1264, 1341, 1208, 3694, 1264,
+ 3694, 2721, 1208, 1341, 1264, 3694, 1208, 3694, 1264, 3694,
+ 1208, 1341, 1264, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 3694, 3694, 3694, 2722, 1262, 1262, 1262, 1262, 2507,
+ 2507, 2507, 2507, 2731, 2731, 2731, 2731, 1208, 3694, 1264,
+ 3694, 1208, 3694, 1264, 3694, 2727, 3694, 3694, 3694, 1208,
+ 2725, 1264, 2724, 1208, 3694, 1264, 3694, 1208, 3694, 1264,
+ 3694, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 3694, 3694, 3694,
+ 2728, 1262, 1262, 1262, 1262, 1208, 2729, 1264, 3694, 1208,
+ 3694, 1264, 3694, 1208, 3694, 1264, 3694, 1208, 3694, 1264,
+ 3694, 2730, 3694, 3694, 3694, 1208, 3694, 1264, 3694, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 3694, 2733, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 2735, 3694, 1208, 2732, 1264, 2734, 1208, 3694, 1264,
+ 3694, 1208, 3694, 1264, 2736, 3694, 3694, 1208, 3694, 1264,
+ 3694, 1208, 3694, 1264, 3694, 1262, 1262, 1262, 1262, 3694,
+ 1262, 1262, 1262, 1262, 3694, 3694, 3694, 2737, 1262, 1262,
+
+ 1262, 1262, 3694, 3694, 3694, 3694, 2739, 3694, 1431, 1208,
+ 2738, 1264, 3694, 2740, 1208, 1431, 1264, 3694, 2651, 3694,
+ 2741, 3694, 1208, 1431, 1264, 2651, 2742, 1262, 1262, 1262,
+ 1262, 3694, 3694, 2651, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 3694, 3694, 2744, 3694,
+ 3694, 1208, 1341, 1264, 3694, 3694, 2743, 2745, 1208, 1341,
+ 1264, 3694, 1208, 3694, 1264, 2788, 1208, 1341, 1264, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 3694, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 3694, 3694, 2746, 1208, 2651, 1264, 3694, 1208, 3694, 1264,
+
+ 3694, 2651, 1208, 2747, 1264, 3694, 1208, 3694, 1264, 2651,
+ 1208, 2748, 1264, 2749, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 2750, 3694, 3694, 3694,
+ 2751, 1262, 1262, 1262, 1262, 3694, 3694, 3694, 1208, 3694,
+ 1264, 3694, 1208, 2756, 1264, 3694, 1208, 2755, 1264, 2754,
+ 2761, 2761, 2761, 2761, 3694, 1208, 3694, 1264, 2763, 2763,
+ 2763, 2763, 3694, 3694, 1262, 1262, 1262, 2764, 1262, 1262,
+ 1262, 1262, 3694, 2758, 1208, 3694, 1264, 1262, 1262, 1262,
+ 1262, 2759, 1208, 3694, 1264, 3694, 2760, 2757, 1208, 3694,
+ 1264, 3694, 1208, 3146, 1264, 1368, 1368, 1368, 1368, 3694,
+
+ 3146, 1208, 3694, 1264, 2018, 2018, 2018, 2018, 3146, 3694,
+ 3694, 2019, 1369, 2863, 2863, 2863, 2863, 2020, 3694, 1371,
+ 3694, 3265, 3694, 2766, 1145, 1145, 1145, 1145, 3265, 2762,
+ 2842, 2842, 2842, 2842, 3694, 1146, 3265, 2765, 3694, 3694,
+ 2767, 1146, 2652, 2652, 2652, 2652, 2125, 3694, 1129, 2410,
+ 1188, 1188, 1188, 1188, 2843, 2851, 2851, 2851, 2851, 2865,
+ 2865, 2865, 2865, 3694, 2786, 3267, 2127, 1189, 2867, 2867,
+ 2867, 2867, 3267, 3694, 1191, 2674, 2674, 2674, 2674, 1208,
+ 3267, 2841, 2890, 2890, 2890, 2890, 2703, 2703, 2703, 2703,
+ 3694, 3694, 2724, 2187, 3694, 3694, 3694, 2186, 2186, 2186,
+
+ 2186, 3694, 3694, 3694, 2187, 3694, 1243, 3694, 3694, 2844,
+ 1243, 2469, 2469, 2469, 2469, 3694, 2845, 1840, 1840, 1840,
+ 1840, 2188, 3511, 2125, 2850, 2851, 2851, 2850, 1841, 3511,
+ 1207, 3694, 2729, 3694, 1842, 2471, 3694, 3511, 1840, 1840,
+ 1840, 1840, 1840, 1840, 1840, 1840, 3694, 2730, 1208, 1841,
+ 1243, 3512, 3694, 1841, 1209, 1842, 3694, 3694, 3512, 1842,
+ 3694, 2762, 2777, 2777, 2777, 2777, 3512, 3694, 1210, 1840,
+ 1840, 1840, 1840, 3694, 1211, 3694, 3694, 3694, 1212, 1213,
+ 1841, 1214, 1215, 1216, 3694, 3694, 1842, 1217, 1218, 1219,
+ 1220, 1221, 3694, 1222, 3694, 1223, 1224, 1225, 1226, 1227,
+
+ 3694, 3694, 2898, 3694, 2897, 1840, 1840, 1840, 1840, 1840,
+ 1840, 1840, 1840, 3694, 3694, 3694, 1841, 3694, 3694, 3694,
+ 1841, 3694, 1842, 3694, 3694, 3694, 1842, 1840, 1840, 1840,
+ 1840, 1840, 1840, 1840, 1840, 3694, 2899, 3694, 1841, 3694,
+ 3694, 3694, 1841, 3694, 1842, 3694, 3694, 3694, 1842, 3694,
+ 1840, 1840, 1840, 1840, 3694, 3694, 1262, 1262, 1262, 1262,
+ 3694, 1841, 2777, 2777, 2777, 2777, 2901, 1842, 1262, 1262,
+ 1262, 1262, 3694, 1262, 1262, 1262, 1262, 3694, 2900, 3694,
+ 1208, 3694, 1264, 3694, 2902, 3694, 3694, 3694, 2903, 2905,
+ 3694, 3694, 1208, 3694, 1264, 3694, 3694, 1208, 3694, 1264,
+
+ 3694, 3694, 3694, 2906, 2907, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 2723, 2723, 2723, 2723, 1262, 1262, 1262,
+ 1262, 2904, 2726, 2726, 2726, 2726, 3694, 3694, 3694, 1208,
+ 3694, 1264, 3694, 1208, 3694, 1264, 3694, 1208, 3694, 1264,
+ 3694, 1208, 3694, 1264, 3694, 3694, 1208, 3694, 1264, 2913,
+ 2913, 2913, 2913, 3694, 1262, 1262, 1262, 1262, 3694, 3694,
+ 2914, 2731, 2731, 2731, 2731, 3694, 2909, 3694, 2908, 3694,
+ 3694, 3694, 1211, 1208, 3694, 1264, 3694, 3694, 1208, 2911,
+ 1264, 1856, 3694, 3694, 3694, 1208, 3694, 1264, 3694, 2910,
+ 1262, 1262, 1262, 1262, 2912, 3694, 1226, 1262, 1262, 1262,
+
+ 1262, 3694, 2920, 2920, 2920, 2920, 3694, 2921, 2922, 2922,
+ 2922, 2922, 3694, 3694, 1208, 3694, 1264, 1262, 1262, 1262,
+ 1262, 1208, 3694, 1264, 3694, 3694, 1208, 2915, 1264, 3694,
+ 3694, 3694, 1208, 3694, 1264, 1262, 1262, 1262, 1262, 3694,
+ 3694, 1208, 3694, 1264, 1262, 1262, 1262, 1262, 3694, 2926,
+ 2926, 2926, 2926, 2918, 3694, 1262, 1262, 1262, 1262, 1208,
+ 2919, 1264, 1262, 1262, 1262, 1262, 3694, 3694, 1208, 3694,
+ 1264, 3694, 3694, 1208, 2923, 1264, 3694, 3694, 3694, 1208,
+ 3694, 1264, 2929, 2929, 2929, 2929, 1208, 3694, 1264, 1262,
+ 1262, 1262, 1262, 3694, 2924, 3694, 1262, 1262, 1262, 1262,
+
+ 2933, 2933, 2933, 2933, 3694, 3694, 2930, 3694, 1264, 2925,
+ 2927, 3694, 3694, 1208, 3694, 1264, 3694, 2928, 3694, 3694,
+ 1208, 3694, 1264, 3694, 1208, 3694, 1264, 1262, 1262, 1262,
+ 1262, 3694, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 3694, 1262, 1262, 1262, 1262, 3694,
+ 3694, 1208, 3694, 1264, 3694, 3694, 1208, 3694, 1264, 3694,
+ 1208, 3694, 1264, 3694, 1208, 3694, 1264, 2931, 2932, 1208,
+ 3694, 1264, 2939, 2939, 2939, 2939, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 3694, 3694, 2934, 2935, 2947, 2947,
+ 2947, 2947, 3694, 3694, 3694, 2936, 2940, 3694, 1264, 3694,
+
+ 1208, 3694, 1264, 3694, 1208, 3694, 1264, 2948, 2948, 2948,
+ 2948, 3694, 1208, 2937, 1264, 3694, 2941, 3694, 2938, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1208, 3694, 1264, 3694, 2945, 2761, 2761, 2761, 2761,
+ 3694, 3694, 3694, 1208, 2942, 1264, 3694, 1208, 3694, 1264,
+ 3694, 1208, 2946, 1264, 2763, 2763, 2763, 2763, 3694, 3694,
+ 1208, 3694, 1264, 1262, 1262, 1262, 1262, 3694, 3694, 3694,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1208, 3694,
+ 1264, 3694, 3694, 2951, 3694, 3694, 2949, 1208, 3694, 1264,
+ 3694, 3694, 2950, 2952, 1208, 3694, 1264, 3694, 1208, 3694,
+
+ 1264, 1262, 1262, 1262, 1262, 2781, 2781, 2781, 2781, 3694,
+ 2967, 2967, 2967, 2967, 3694, 3694, 2782, 3694, 3694, 3694,
+ 2953, 2968, 3694, 3694, 3694, 1208, 3694, 1264, 2969, 2969,
+ 2969, 2969, 3694, 3694, 3694, 2954, 3694, 3694, 3694, 2956,
+ 2781, 2781, 2781, 2781, 2970, 2970, 2970, 2970, 2955, 3694,
+ 3694, 2782, 1368, 1368, 1368, 1368, 3694, 3694, 3694, 3694,
+ 1145, 1145, 1145, 1145, 3694, 3694, 2957, 3694, 3694, 1369,
+ 3694, 1146, 2842, 2842, 2842, 2842, 1371, 2963, 1188, 1188,
+ 1188, 1188, 3694, 1146, 1129, 3020, 3020, 3020, 3020, 2848,
+ 2848, 2848, 2848, 3694, 3694, 1189, 2843, 3022, 3022, 3022,
+
+ 3022, 3694, 1191, 3023, 3024, 3024, 3023, 2973, 3024, 3024,
+ 3024, 3024, 2863, 2863, 2863, 2863, 2865, 2865, 2865, 2865,
+ 3694, 2974, 2867, 2867, 2867, 2867, 3040, 3040, 3040, 3040,
+ 3694, 3694, 1208, 2650, 3694, 3694, 3694, 3019, 3042, 3042,
+ 3042, 3042, 3694, 3045, 3045, 3045, 3045, 3049, 3049, 3049,
+ 3049, 2844, 3055, 3055, 3055, 3055, 3060, 3060, 3060, 3060,
+ 3061, 3061, 3061, 3061, 3694, 3694, 1211, 3046, 2890, 2890,
+ 2890, 2890, 3694, 2911, 3694, 1856, 3056, 3694, 1840, 1840,
+ 1840, 1840, 3694, 1840, 1840, 1840, 1840, 3694, 2912, 1841,
+ 1226, 3694, 3694, 3694, 1841, 1842, 3057, 3694, 3694, 3694,
+
+ 1842, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 3694,
+ 3694, 3694, 1841, 3694, 3694, 3694, 1841, 3694, 1842, 3694,
+ 3694, 3694, 1842, 3694, 3058, 1840, 1840, 1840, 1840, 1840,
+ 1840, 1840, 1840, 3694, 3694, 3694, 1841, 3068, 3069, 2949,
+ 1841, 3694, 1842, 3694, 3694, 3694, 1842, 3694, 3074, 3074,
+ 3074, 3074, 1840, 1840, 1840, 1840, 3070, 3694, 3694, 1841,
+ 3694, 3694, 3694, 1841, 3071, 1842, 3694, 3694, 3694, 1842,
+ 1262, 1262, 1262, 1262, 3694, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 3694, 1262, 1262,
+ 1262, 1262, 3694, 3694, 1208, 3694, 1264, 3073, 3072, 1208,
+
+ 3694, 1264, 3694, 1208, 3694, 1264, 3694, 1208, 3694, 1264,
+ 3694, 3075, 1208, 3694, 1264, 3694, 3694, 3076, 3694, 3078,
+ 3077, 3081, 3081, 3081, 3081, 2913, 2913, 2913, 2913, 3083,
+ 3083, 3083, 3083, 3694, 3084, 3694, 2914, 3694, 3694, 3084,
+ 1262, 1262, 1262, 1262, 3694, 1208, 3694, 1264, 3694, 1208,
+ 3694, 1264, 3694, 3694, 3694, 3079, 1262, 1262, 1262, 1262,
+ 3694, 3080, 3694, 3694, 1208, 3694, 1264, 1262, 1262, 1262,
+ 1262, 2920, 2920, 2920, 2920, 3694, 2921, 3694, 3694, 3694,
+ 1208, 3694, 1264, 3694, 2922, 2922, 2922, 2922, 3694, 3694,
+ 3694, 1208, 3694, 1264, 3694, 1208, 3694, 1264, 3694, 3085,
+
+ 3694, 3094, 3094, 3094, 3094, 3694, 3694, 3694, 1208, 3694,
+ 1264, 3694, 3694, 1262, 1262, 1262, 1262, 3694, 2926, 2926,
+ 2926, 2926, 3694, 3694, 3088, 1208, 3694, 3095, 1262, 1262,
+ 1262, 1262, 3694, 3100, 3100, 3100, 3100, 1208, 3694, 1264,
+ 3089, 3091, 1208, 3694, 1264, 3126, 3126, 3126, 3126, 3694,
+ 3694, 3694, 1208, 3694, 1264, 3694, 3092, 1782, 3093, 2502,
+ 2503, 2503, 2503, 2503, 2502, 2502, 2502, 2502, 2502, 2502,
+ 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 1262,
+ 1262, 1262, 1262, 3694, 2504, 3098, 2505, 2502, 2502, 2502,
+ 2502, 3097, 2929, 2929, 2929, 2929, 3101, 3101, 3101, 3101,
+
+ 3694, 3694, 3694, 1208, 3694, 1264, 3102, 3102, 3102, 3102,
+ 2502, 2502, 2502, 2502, 3096, 3694, 2930, 3694, 1264, 3694,
+ 1208, 3694, 1264, 2933, 2933, 2933, 2933, 3694, 3694, 3694,
+ 2940, 3694, 1264, 3103, 3103, 3103, 3103, 3694, 3694, 2502,
+ 2502, 2502, 2506, 3694, 3099, 3694, 3694, 1208, 3694, 1264,
+ 1262, 1262, 1262, 1262, 3694, 3694, 3694, 1208, 3694, 1264,
+ 3105, 3105, 3105, 3105, 1262, 1262, 1262, 1262, 3694, 1262,
+ 1262, 1262, 1262, 3694, 1208, 3694, 1264, 2939, 2939, 2939,
+ 2939, 3694, 3694, 3694, 3106, 3694, 1264, 3694, 1208, 3694,
+ 1264, 3694, 3694, 1208, 3694, 1264, 3112, 3112, 3112, 3112,
+
+ 3694, 2940, 3694, 1264, 3107, 3694, 3694, 3104, 3694, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 3694, 3694, 3694,
+ 1782, 3057, 3118, 3118, 3118, 3118, 3694, 3109, 3111, 3694,
+ 3694, 3694, 3108, 1208, 3694, 1264, 3694, 1208, 3694, 1264,
+ 3694, 3694, 3110, 3694, 3694, 3694, 3119, 3694, 1264, 3058,
+ 2947, 2947, 2947, 2947, 3694, 2948, 2948, 2948, 2948, 1262,
+ 1262, 1262, 1262, 3113, 3120, 3120, 3120, 3120, 1262, 1262,
+ 1262, 1262, 3694, 3694, 1208, 3694, 1264, 3694, 3114, 1208,
+ 3694, 1264, 3694, 1208, 3694, 1264, 3694, 3694, 1208, 3694,
+ 1264, 3694, 1208, 3694, 1264, 1262, 1262, 1262, 1262, 3125,
+
+ 3125, 3125, 3125, 3694, 1262, 1262, 1262, 1262, 3694, 2967,
+ 2967, 2967, 2967, 2969, 2969, 2969, 2969, 3694, 2923, 1208,
+ 2968, 1264, 3694, 1208, 3694, 1264, 3694, 3121, 1208, 3694,
+ 1264, 2970, 2970, 2970, 2970, 2967, 2967, 2967, 2967, 2969,
+ 2969, 2969, 2969, 3694, 3694, 3694, 2968, 2970, 2970, 2970,
+ 2970, 1368, 1368, 1368, 1368, 3694, 3694, 3694, 3694, 1188,
+ 1188, 1188, 1188, 2499, 3124, 3694, 3694, 3694, 1369, 3020,
+ 3020, 3020, 3020, 3694, 3694, 1371, 1189, 3022, 3022, 3022,
+ 3022, 3694, 3694, 1191, 3171, 3172, 3172, 3171, 3172, 3172,
+ 3172, 3172, 3179, 3179, 3179, 3179, 3184, 3184, 3184, 3184,
+
+ 3040, 3040, 3040, 3040, 3042, 3042, 3042, 3042, 3134, 3694,
+ 3694, 3694, 1208, 3694, 2571, 3045, 3045, 3045, 3045, 3100,
+ 3100, 3100, 3100, 3694, 3694, 3694, 3169, 3191, 3191, 3191,
+ 3191, 3192, 3192, 3192, 3192, 3049, 3049, 3049, 3049, 3046,
+ 3193, 3193, 3193, 3193, 3195, 3195, 3195, 3195, 3055, 3055,
+ 3055, 3055, 3694, 3694, 3694, 3056, 3112, 3112, 3112, 3112,
+ 3204, 3204, 3204, 3204, 3060, 3060, 3060, 3060, 3196, 3694,
+ 3694, 3694, 3056, 3061, 3061, 3061, 3061, 3206, 3206, 3206,
+ 3206, 3694, 3694, 3694, 3205, 3694, 3694, 3694, 3197, 3694,
+ 3694, 3694, 3057, 3209, 3209, 3209, 3209, 1840, 1840, 1840,
+
+ 1840, 1840, 1840, 1840, 1840, 3694, 3694, 3694, 1841, 3694,
+ 3694, 3694, 1841, 3694, 1842, 3694, 3198, 3694, 1842, 3694,
+ 3058, 1840, 1840, 1840, 1840, 3213, 3213, 3213, 3213, 3694,
+ 3694, 3694, 1841, 3694, 3694, 3694, 1841, 3694, 1842, 3694,
+ 3694, 3694, 1842, 1840, 1840, 1840, 1840, 3694, 1840, 1840,
+ 1840, 1840, 3694, 3694, 1841, 3694, 3694, 3694, 3211, 1841,
+ 1842, 3694, 3694, 3694, 3210, 1842, 3074, 3074, 3074, 3074,
+ 1840, 1840, 1840, 1840, 3694, 3694, 3694, 1841, 3694, 3694,
+ 3694, 1841, 1262, 1262, 1262, 1262, 3212, 1842, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+
+ 3694, 3694, 3214, 3694, 3694, 3694, 1208, 3694, 1264, 3694,
+ 3694, 3694, 1208, 3215, 1264, 3694, 1208, 3694, 1264, 3694,
+ 1208, 3694, 1264, 3219, 3219, 3219, 3219, 3694, 3216, 3081,
+ 3081, 3081, 3081, 3694, 3694, 3217, 3694, 3694, 2946, 3694,
+ 3083, 3083, 3083, 3083, 3694, 3084, 3694, 1208, 3694, 1264,
+ 3084, 3694, 3694, 1208, 3694, 1264, 3694, 3694, 3218, 1262,
+ 1262, 1262, 1262, 3694, 1262, 1262, 1262, 1262, 3224, 3224,
+ 3224, 3224, 3094, 3094, 3094, 3094, 1262, 1262, 1262, 1262,
+ 3694, 3694, 3694, 1208, 3694, 1264, 3694, 3694, 1208, 3694,
+ 1264, 3694, 1208, 3694, 1264, 3694, 1208, 3694, 3095, 3694,
+
+ 1208, 3694, 1264, 3232, 3232, 3232, 3232, 3694, 1262, 1262,
+ 1262, 1262, 3234, 3234, 3234, 3234, 3100, 3100, 3100, 3100,
+ 3694, 3101, 3101, 3101, 3101, 3694, 3694, 1208, 3694, 1264,
+ 3220, 3223, 1208, 3694, 1264, 3694, 3235, 3694, 1264, 3102,
+ 3102, 3102, 3102, 3694, 3231, 1208, 3694, 1264, 3103, 3103,
+ 3103, 3103, 1262, 1262, 1262, 1262, 3105, 3105, 3105, 3105,
+ 3694, 3694, 3694, 2940, 3694, 1264, 3694, 3233, 3237, 3237,
+ 3237, 3237, 1208, 3694, 1264, 3694, 1208, 3694, 1264, 3694,
+ 3106, 3694, 1264, 1262, 1262, 1262, 1262, 3694, 1262, 1262,
+ 1262, 1262, 1782, 1262, 1262, 1262, 1262, 3694, 3694, 3694,
+
+ 3197, 3241, 3241, 3241, 3241, 3694, 3694, 1208, 3694, 1264,
+ 3694, 3236, 1208, 3694, 1264, 3694, 3694, 1208, 3694, 1264,
+ 1262, 1262, 1262, 1262, 3694, 1208, 3694, 1264, 3198, 3112,
+ 3112, 3112, 3112, 1262, 1262, 1262, 1262, 3238, 1262, 1262,
+ 1262, 1262, 3694, 3694, 1208, 3694, 1264, 1262, 1262, 1262,
+ 1262, 3694, 3240, 3239, 3694, 3694, 3694, 1208, 3694, 1264,
+ 3694, 3694, 1208, 3694, 1264, 3118, 3118, 3118, 3118, 3694,
+ 3694, 1208, 3694, 1264, 3248, 3248, 3248, 3248, 3242, 3243,
+ 3694, 3120, 3120, 3120, 3120, 3251, 3251, 3251, 3251, 3119,
+ 3694, 1264, 1262, 1262, 1262, 1262, 3694, 3694, 1782, 3125,
+
+ 3125, 3125, 3125, 3694, 3694, 1208, 3244, 1264, 3694, 1208,
+ 3694, 1264, 3694, 3694, 3694, 3247, 1208, 3694, 1264, 3126,
+ 3126, 3126, 3126, 1208, 3694, 1264, 3259, 3259, 3259, 3259,
+ 3694, 1211, 3260, 3260, 3260, 3260, 3694, 3694, 3249, 3694,
+ 1856, 3261, 3261, 3261, 3261, 1368, 1368, 1368, 1368, 3694,
+ 3694, 3254, 3694, 2912, 3694, 1226, 3250, 3272, 3272, 3272,
+ 3272, 3694, 1369, 1188, 1188, 1188, 1188, 3694, 3694, 1371,
+ 3289, 3289, 3289, 3289, 3290, 3291, 3291, 3290, 3694, 3694,
+ 1189, 3694, 3694, 3694, 3255, 3694, 3694, 1191, 3291, 3291,
+ 3291, 3291, 3295, 3295, 3295, 3295, 3179, 3179, 3179, 3179,
+
+ 3300, 3300, 3300, 3300, 3263, 3184, 3184, 3184, 3184, 3694,
+ 3694, 3694, 1208, 3303, 3303, 3303, 3303, 3304, 3304, 3304,
+ 3304, 3306, 3306, 3306, 3306, 3191, 3191, 3191, 3191, 3192,
+ 3192, 3192, 3192, 3694, 3694, 3694, 3288, 3193, 3193, 3193,
+ 3193, 3195, 3195, 3195, 3195, 3307, 3237, 3237, 3237, 3237,
+ 3694, 3694, 3694, 3056, 3312, 3312, 3312, 3312, 3204, 3204,
+ 3204, 3204, 3694, 3694, 3694, 3196, 3248, 3248, 3248, 3248,
+ 3206, 3206, 3206, 3206, 3316, 3316, 3316, 3316, 3209, 3209,
+ 3209, 3209, 3205, 3694, 3694, 3197, 1840, 1840, 1840, 1840,
+ 1840, 1840, 1840, 1840, 3694, 3694, 3694, 1841, 3694, 3694,
+
+ 3694, 1841, 3694, 1842, 3694, 3694, 3694, 1842, 3320, 3320,
+ 3320, 3320, 3694, 3198, 3694, 3213, 3213, 3213, 3213, 1841,
+ 1211, 1840, 1840, 1840, 1840, 1842, 1841, 3249, 3694, 1856,
+ 3694, 3694, 1841, 3694, 1262, 1262, 1262, 1262, 1842, 3694,
+ 3694, 3694, 2912, 3694, 1226, 3250, 3694, 3694, 3694, 3319,
+ 3322, 3322, 3322, 3322, 3323, 3323, 3323, 3323, 1208, 3318,
+ 1264, 1841, 3694, 3694, 3694, 1841, 3694, 1842, 3694, 3694,
+ 3694, 1842, 1262, 1262, 1262, 1262, 3694, 3694, 3694, 3321,
+ 3694, 3694, 3694, 3324, 3219, 3219, 3219, 3219, 1262, 1262,
+ 1262, 1262, 3329, 3329, 3329, 3329, 1208, 3694, 1264, 3224,
+
+ 3224, 3224, 3224, 3330, 3330, 3330, 3330, 3694, 1208, 3694,
+ 1264, 3694, 1208, 3694, 1264, 3694, 1208, 3694, 1264, 1262,
+ 1262, 1262, 1262, 1208, 3694, 1264, 3232, 3232, 3232, 3232,
+ 3694, 3325, 3337, 3337, 3337, 3338, 3234, 3234, 3234, 3234,
+ 3694, 3694, 3694, 1208, 3694, 1264, 3694, 3694, 3326, 3694,
+ 1208, 3694, 1264, 3694, 3694, 3694, 1208, 3694, 1264, 3694,
+ 3235, 3694, 1264, 3339, 3339, 3339, 3339, 3237, 3237, 3237,
+ 3237, 3694, 3354, 3354, 3354, 3354, 3248, 3248, 3248, 3248,
+ 3694, 3694, 3331, 3694, 3694, 3694, 3336, 1782, 3340, 3341,
+ 3341, 3341, 3341, 3340, 3340, 3340, 3340, 3340, 3340, 3340,
+
+ 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 1262, 1262,
+ 1262, 1262, 3694, 3342, 3340, 3343, 3340, 3340, 3340, 3340,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 3259, 3259,
+ 3259, 3259, 1208, 3694, 1264, 3241, 3241, 3241, 3241, 3340,
+ 3340, 3340, 3340, 3694, 1208, 3694, 1264, 3694, 1208, 3694,
+ 1264, 3355, 3694, 3694, 3345, 3348, 3348, 3348, 3348, 1208,
+ 3694, 1264, 3694, 1262, 1262, 1262, 1262, 3694, 3340, 3340,
+ 3340, 3344, 3694, 3694, 1262, 1262, 1262, 1262, 3694, 3349,
+ 3694, 1264, 1262, 1262, 1262, 1262, 3694, 1208, 3346, 1264,
+ 3251, 3251, 3251, 3251, 3694, 3694, 3347, 3694, 1208, 3350,
+
+ 1264, 3694, 3694, 3352, 3694, 3694, 1208, 3694, 1264, 3337,
+ 3337, 3337, 3337, 3694, 1208, 3694, 1264, 3260, 3260, 3260,
+ 3260, 3261, 3261, 3261, 3261, 3694, 3694, 3351, 3259, 3259,
+ 3259, 3259, 3694, 1208, 3694, 1264, 3260, 3260, 3260, 3260,
+ 3261, 3261, 3261, 3261, 3694, 3694, 3694, 3353, 3694, 3357,
+ 3362, 3362, 3362, 3362, 3363, 3363, 3363, 3363, 3272, 3272,
+ 3272, 3272, 1188, 1188, 1188, 1188, 3289, 3289, 3289, 3289,
+ 3694, 1369, 3384, 3385, 3385, 3384, 3694, 3694, 1371, 1189,
+ 3385, 3385, 3385, 3385, 3694, 3694, 1191, 3388, 3388, 3388,
+ 3388, 3295, 3295, 3295, 3295, 3390, 3390, 3390, 3390, 3391,
+
+ 3391, 3391, 3391, 3694, 1208, 3300, 3300, 3300, 3300, 3394,
+ 3394, 3394, 3394, 3303, 3303, 3303, 3303, 3304, 3304, 3304,
+ 3304, 3395, 3395, 3395, 3396, 3306, 3306, 3306, 3306, 3339,
+ 3339, 3339, 3339, 3694, 3383, 3397, 3397, 3397, 3397, 3312,
+ 3312, 3312, 3312, 3401, 3401, 3401, 3401, 3694, 3694, 3307,
+ 3316, 3316, 3316, 3316, 3395, 3395, 3395, 3395, 1840, 1840,
+ 1840, 1840, 3408, 3408, 3408, 3408, 3694, 3402, 3694, 1841,
+ 3694, 3694, 3694, 1841, 3694, 1842, 3694, 3694, 3694, 1842,
+ 3320, 3320, 3320, 3320, 3694, 3694, 3694, 3403, 3694, 3694,
+ 3694, 1841, 3409, 3409, 3409, 3409, 3322, 3322, 3322, 3322,
+
+ 3694, 3694, 3694, 1841, 3694, 3694, 3694, 1841, 3694, 1842,
+ 3694, 3694, 3694, 3407, 3694, 3404, 3323, 3323, 3323, 3323,
+ 1262, 1262, 1262, 1262, 3694, 3694, 3694, 1841, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 3411, 3411, 3411, 3411,
+ 3329, 3329, 3329, 3329, 1208, 3694, 1264, 3330, 3330, 3330,
+ 3330, 3694, 1208, 3694, 1264, 3694, 1208, 3694, 1264, 1262,
+ 1262, 1262, 1262, 3694, 1208, 3694, 1264, 3337, 3337, 3337,
+ 3337, 3337, 3337, 3337, 3337, 3339, 3339, 3339, 3339, 1262,
+ 1262, 1262, 1262, 1208, 3694, 1264, 2932, 3410, 3694, 3694,
+ 3694, 1208, 3694, 1264, 3694, 1208, 3694, 1264, 1262, 1262,
+
+ 1262, 1262, 3694, 1208, 3694, 1264, 3423, 3423, 3423, 3423,
+ 3425, 3425, 3425, 3425, 3694, 2508, 3415, 3354, 3354, 3354,
+ 3354, 3694, 1208, 3694, 1264, 3694, 3331, 3694, 3416, 3694,
+ 3424, 3694, 1264, 3694, 1782, 3694, 3694, 3694, 3421, 3362,
+ 3362, 3362, 3362, 3417, 3340, 3341, 3341, 3341, 3341, 3340,
+ 3340, 3340, 3418, 3340, 3340, 3340, 3340, 3340, 3340, 3340,
+ 3340, 3340, 3340, 3340, 3446, 3447, 3447, 3446, 3694, 3342,
+ 3340, 3343, 3340, 3340, 3340, 3340, 3419, 3419, 3419, 3419,
+ 3419, 3419, 3419, 3419, 3419, 3419, 3419, 3419, 3419, 3419,
+ 3419, 3419, 3419, 3419, 3419, 3340, 3340, 3340, 3340, 3419,
+
+ 3419, 3419, 3419, 3419, 3419, 3419, 3419, 3419, 3419, 3419,
+ 3419, 3419, 3419, 3419, 3419, 3419, 3419, 3419, 3419, 3419,
+ 3419, 3419, 3419, 3419, 3340, 3340, 3340, 3420, 1262, 1262,
+ 1262, 1262, 3348, 3348, 3348, 3348, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 1262, 1262, 1208, 3694, 1264, 3694, 3349, 3694, 1264, 3694,
+ 1208, 3694, 1264, 3694, 1208, 3694, 1264, 3694, 1208, 3694,
+ 1264, 3694, 1208, 3694, 1264, 3694, 3403, 3430, 3430, 3430,
+ 3430, 3694, 1262, 1262, 1262, 1262, 3428, 3694, 3694, 3694,
+ 3426, 3694, 3363, 3363, 3363, 3363, 3694, 3445, 3445, 3445,
+
+ 3445, 3422, 3694, 3694, 3404, 3427, 1208, 3694, 1264, 1369,
+ 3447, 3447, 3447, 3447, 1189, 3694, 1371, 3694, 3694, 3694,
+ 3429, 1191, 3449, 3449, 3449, 3449, 3388, 3388, 3388, 3388,
+ 3450, 3450, 3450, 3450, 1208, 3390, 3390, 3390, 3390, 3432,
+ 3391, 3391, 3391, 3391, 3394, 3394, 3394, 3394, 3395, 3395,
+ 3395, 3395, 3395, 3395, 3395, 3395, 3431, 3397, 3397, 3397,
+ 3397, 3454, 3454, 3454, 3454, 3694, 3401, 3401, 3401, 3401,
+ 3425, 3425, 3425, 3425, 3694, 1840, 1840, 1840, 1840, 3694,
+ 3408, 3408, 3408, 3408, 3694, 3455, 1841, 3694, 3694, 3694,
+ 3402, 1841, 1842, 3409, 3409, 3409, 3409, 1262, 1262, 1262,
+
+ 1262, 3694, 3694, 3694, 1841, 3411, 3411, 3411, 3411, 3416,
+ 3403, 1262, 1262, 1262, 1262, 3466, 3466, 3466, 3466, 3694,
+ 3694, 1208, 3694, 1264, 3417, 3466, 3466, 3466, 3466, 1262,
+ 1262, 1262, 1262, 3694, 3694, 1208, 3694, 1264, 3404, 3694,
+ 3694, 3694, 3468, 1262, 1262, 1262, 1262, 3694, 3460, 3694,
+ 3694, 3694, 3468, 1208, 3461, 1264, 3423, 3423, 3423, 3423,
+ 3471, 3471, 3471, 3471, 3694, 3694, 3694, 1208, 3694, 1264,
+ 2235, 3469, 3425, 3425, 3425, 3425, 1262, 1262, 1262, 1262,
+ 3424, 3694, 1264, 3694, 1782, 1262, 1262, 1262, 1262, 3694,
+ 1262, 1262, 1262, 1262, 3475, 3475, 3475, 3475, 3694, 3694,
+
+ 1208, 3694, 1264, 3430, 3430, 3430, 3430, 3694, 3694, 1208,
+ 3694, 1264, 3694, 3694, 1208, 3470, 1264, 3694, 3476, 3694,
+ 1264, 3694, 3472, 1262, 1262, 1262, 1262, 3477, 3477, 3477,
+ 3477, 3445, 3445, 3445, 3445, 3694, 3694, 3474, 3487, 3488,
+ 3488, 3487, 3488, 3488, 3488, 3488, 3694, 1208, 3694, 1264,
+ 3694, 3694, 3694, 3473, 3694, 1191, 3449, 3449, 3449, 3449,
+ 3450, 3450, 3450, 3450, 3694, 3694, 1208, 3454, 3454, 3454,
+ 3454, 3471, 3471, 3471, 3471, 3496, 3496, 3496, 3496, 3694,
+ 3694, 3694, 2235, 1840, 1840, 1840, 1840, 3499, 3499, 3499,
+ 3499, 3455, 3694, 3694, 1841, 1262, 1262, 1262, 1262, 3497,
+
+ 1842, 3466, 3466, 3466, 3466, 3694, 3478, 3466, 3466, 3466,
+ 3466, 1262, 1262, 1262, 1262, 3503, 3503, 3503, 3503, 1208,
+ 3694, 1264, 3471, 3471, 3471, 3471, 3694, 3694, 3468, 1262,
+ 1262, 1262, 1262, 3694, 3468, 1208, 3694, 1264, 3694, 3504,
+ 3694, 1264, 1262, 1262, 1262, 1262, 3498, 1262, 1262, 1262,
+ 1262, 3694, 3694, 1208, 3254, 1264, 3694, 3694, 3502, 3475,
+ 3475, 3475, 3475, 3694, 3694, 3694, 1208, 3694, 1264, 3505,
+ 3694, 1208, 3694, 1264, 3507, 3507, 3507, 3507, 3477, 3477,
+ 3477, 3477, 3694, 3476, 3694, 1264, 3508, 3508, 3508, 3508,
+ 3694, 3694, 3694, 3429, 3513, 3514, 3514, 3513, 1782, 3514,
+
+ 3514, 3514, 3514, 3517, 3517, 3517, 3517, 3496, 3496, 3496,
+ 3496, 3507, 3507, 3507, 3507, 3506, 3694, 1840, 1840, 1840,
+ 1840, 3694, 3694, 1208, 3694, 3694, 3694, 3518, 1841, 3694,
+ 3694, 3497, 3694, 3694, 1842, 3499, 3499, 3499, 3499, 3694,
+ 1262, 1262, 1262, 1262, 3503, 3503, 3503, 3503, 3524, 3524,
+ 3524, 3524, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262,
+ 3507, 3507, 3507, 3507, 1208, 3509, 1264, 3694, 3504, 3694,
+ 1264, 3694, 1782, 3694, 3694, 3694, 1208, 3694, 1264, 3694,
+ 1208, 3694, 1264, 3694, 3694, 3521, 3470, 3508, 3508, 3508,
+ 3508, 3694, 3694, 3694, 3525, 3528, 3529, 3529, 3528, 3529,
+
+ 3529, 3529, 3529, 3517, 3517, 3517, 3517, 3524, 3524, 3524,
+ 3524, 3694, 3694, 1840, 1840, 1840, 1840, 3524, 3524, 3524,
+ 3524, 3694, 3694, 1208, 1841, 3694, 3694, 3518, 3526, 3694,
+ 1842, 1262, 1262, 1262, 1262, 3537, 3537, 3537, 3537, 3540,
+ 3541, 3541, 3540, 3541, 3541, 3541, 3541, 3544, 3544, 3544,
+ 3544, 3546, 3546, 3546, 3546, 1208, 3694, 1264, 3694, 3538,
+ 3694, 1264, 1841, 3547, 3547, 3547, 3547, 1208, 1842, 3694,
+ 3694, 3545, 1262, 1262, 1262, 1262, 3694, 3694, 3536, 3694,
+ 3533, 3537, 3537, 3537, 3537, 3550, 3550, 3550, 3550, 3552,
+ 3553, 3553, 3552, 3694, 3694, 3694, 1208, 3694, 1264, 3553,
+
+ 3553, 3553, 3553, 3694, 3694, 3538, 3694, 1264, 3694, 1782,
+ 3554, 3554, 3554, 3554, 3544, 3544, 3544, 3544, 3526, 3550,
+ 3550, 3550, 3550, 1208, 3546, 3546, 3546, 3546, 3547, 3547,
+ 3547, 3547, 3694, 3694, 3694, 1841, 3694, 3694, 3545, 3694,
+ 3694, 3694, 3548, 3555, 3555, 3555, 3555, 3550, 3550, 3550,
+ 3550, 3557, 3557, 3557, 3557, 3559, 3560, 3560, 3559, 3560,
+ 3560, 3560, 3560, 3554, 3554, 3554, 3554, 3555, 3555, 3555,
+ 3555, 3557, 3557, 3557, 3557, 3694, 3694, 3694, 3558, 3561,
+ 3561, 3561, 3561, 1208, 3562, 3564, 3565, 3565, 3564, 3562,
+ 3565, 3565, 3565, 3565, 3561, 3561, 3561, 3561, 3558, 3562,
+
+ 3567, 3568, 3568, 3567, 3562, 3568, 3568, 3568, 3568, 3570,
+ 3571, 3571, 3570, 3694, 1208, 3571, 3571, 3571, 3571, 3694,
+ 3694, 3694, 3556, 3572, 3572, 3572, 3572, 3694, 3573, 1208,
+ 3694, 3694, 3694, 3573, 3575, 3576, 3576, 3575, 3694, 1208,
+ 3576, 3576, 3576, 3576, 3572, 3572, 3572, 3572, 3563, 3694,
+ 3694, 3574, 3572, 3572, 3572, 3572, 3577, 3578, 3578, 3577,
+ 3694, 3694, 3694, 3563, 1208, 3578, 3578, 3578, 3578, 3694,
+ 3694, 3694, 3574, 3579, 3580, 3580, 3579, 3694, 3694, 3694,
+ 3574, 3580, 3580, 3580, 3580, 3581, 3582, 3582, 3581, 1208,
+ 3582, 3582, 3582, 3582, 3583, 3584, 3584, 3583, 3584, 3584,
+
+ 3584, 3584, 3694, 3694, 3694, 1208, 3585, 3586, 3586, 3585,
+ 3586, 3586, 3586, 3586, 1208, 3587, 3588, 3588, 3587, 3694,
+ 3694, 3694, 1208, 3588, 3588, 3588, 3588, 3589, 3590, 3590,
+ 3589, 3694, 3694, 3694, 1208, 3590, 3590, 3590, 3590, 3591,
+ 3592, 3592, 3591, 3592, 3592, 3592, 3592, 1208, 3593, 3594,
+ 3594, 3593, 3594, 3594, 3594, 3594, 3694, 3694, 3694, 1208,
+ 3595, 3596, 3596, 3595, 3694, 3694, 3694, 1208, 3596, 3596,
+ 3596, 3596, 3597, 3598, 3598, 3597, 1208, 3598, 3598, 3598,
+ 3598, 3599, 3600, 3600, 3599, 3600, 3600, 3600, 3600, 3694,
+ 3694, 3694, 1208, 3601, 3602, 3602, 3601, 3602, 3602, 3602,
+
+ 3602, 1208, 3603, 3604, 3604, 3603, 3694, 3694, 3694, 1208,
+ 3604, 3604, 3604, 3604, 3605, 3606, 3606, 3605, 3694, 3694,
+ 3694, 1208, 3606, 3606, 3606, 3606, 3607, 3608, 3608, 3607,
+ 3608, 3608, 3608, 3608, 1208, 3609, 3610, 3610, 3609, 3610,
+ 3610, 3610, 3610, 3694, 3694, 3694, 1208, 3611, 3612, 3612,
+ 3611, 3694, 3694, 3694, 1208, 3612, 3612, 3612, 3612, 3613,
+ 3614, 3614, 3613, 1208, 3614, 3614, 3614, 3614, 3615, 3616,
+ 3616, 3615, 3616, 3616, 3616, 3616, 3694, 3694, 3694, 1208,
+ 3617, 3618, 3618, 3617, 3618, 3618, 3618, 3618, 1208, 3619,
+ 3620, 3620, 3619, 3694, 3694, 3694, 1208, 3620, 3620, 3620,
+
+ 3620, 3621, 3622, 3622, 3621, 3694, 3694, 3694, 1208, 3622,
+ 3622, 3622, 3622, 3623, 3624, 3624, 3623, 3624, 3624, 3624,
+ 3624, 1208, 3625, 3626, 3626, 3625, 3626, 3626, 3626, 3626,
+ 3694, 3694, 3694, 1208, 3627, 3628, 3628, 3627, 3694, 3694,
+ 3694, 1208, 3628, 3628, 3628, 3628, 3629, 3630, 3630, 3629,
+ 1208, 3630, 3630, 3630, 3630, 3631, 3632, 3632, 3631, 3632,
+ 3632, 3632, 3632, 3694, 3694, 3694, 1208, 3633, 3634, 3634,
+ 3633, 3634, 3634, 3634, 3634, 1208, 3635, 3636, 3636, 3635,
+ 3694, 3694, 3694, 1208, 3636, 3636, 3636, 3636, 3637, 3638,
+ 3638, 3637, 3694, 3694, 3694, 1208, 3638, 3638, 3638, 3638,
+
+ 3639, 3640, 3640, 3639, 3640, 3640, 3640, 3640, 1208, 3641,
+ 3642, 3642, 3641, 3642, 3642, 3642, 3642, 3694, 3694, 3694,
+ 1208, 3643, 3644, 3644, 3643, 3694, 3694, 3694, 1208, 3644,
+ 3644, 3644, 3644, 3645, 3646, 3646, 3645, 1208, 3646, 3646,
+ 3646, 3646, 3647, 3648, 3648, 3647, 3648, 3648, 3648, 3648,
+ 3694, 3694, 3694, 1208, 3649, 3650, 3650, 3649, 3650, 3650,
+ 3650, 3650, 1208, 3651, 3652, 3652, 3651, 3694, 3694, 3694,
+ 1208, 3652, 3652, 3652, 3652, 3653, 3654, 3654, 3653, 3694,
+ 3694, 3694, 1208, 3654, 3654, 3654, 3654, 3655, 3656, 3656,
+ 3655, 3656, 3656, 3656, 3656, 1208, 3657, 3658, 3658, 3657,
+
+ 3658, 3658, 3658, 3658, 3694, 3694, 3694, 1208, 3659, 3660,
+ 3660, 3659, 3694, 3694, 3694, 1208, 3660, 3660, 3660, 3660,
+ 3661, 3662, 3662, 3661, 1208, 3662, 3662, 3662, 3662, 3663,
+ 3664, 3664, 3663, 3664, 3664, 3664, 3664, 3694, 3694, 3694,
+ 1208, 3665, 3666, 3666, 3665, 3666, 3666, 3666, 3666, 1208,
+ 3667, 3668, 3668, 3667, 3694, 3694, 3694, 1208, 3668, 3668,
+ 3668, 3668, 3669, 3670, 3670, 3669, 3694, 3694, 3694, 1208,
+ 3670, 3670, 3670, 3670, 3671, 3672, 3672, 3671, 3672, 3672,
+ 3672, 3672, 1208, 3673, 3674, 3674, 3673, 3674, 3674, 3674,
+ 3674, 3694, 3694, 3694, 1208, 3675, 3676, 3676, 3675, 3694,
+
+ 3694, 3694, 1208, 3676, 3676, 3676, 3676, 3677, 3678, 3678,
+ 3677, 1208, 3678, 3678, 3678, 3678, 3679, 3680, 3680, 3679,
+ 3680, 3680, 3680, 3680, 3694, 3694, 3694, 1208, 3681, 3682,
+ 3682, 3681, 3682, 3682, 3682, 3682, 1208, 3683, 3684, 3684,
+ 3683, 3694, 3694, 3694, 1208, 3684, 3684, 3684, 3684, 3685,
+ 3686, 3686, 3685, 3694, 3694, 3694, 1208, 3686, 3686, 3686,
+ 3686, 3687, 3688, 3688, 3687, 3688, 3688, 3688, 3688, 1208,
+ 3689, 3690, 3690, 3689, 3690, 3690, 3690, 3690, 3694, 3694,
+ 3694, 1208, 3691, 3692, 3692, 3691, 3694, 3694, 3694, 1208,
+ 3692, 3692, 3692, 3692, 3693, 1234, 1234, 3693, 1208, 1234,
+
+ 1234, 1234, 1234, 3693, 1234, 1234, 3693, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1208, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1208, 254, 254, 254, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262, 315, 315,
+ 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
+
+ 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
+ 315, 315, 315, 315, 315, 315, 315, 315, 315, 315,
+ 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 362, 362, 362, 362, 362, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+ 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
+ 362, 362, 362, 362, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377, 377, 377,
+
+ 377, 377, 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 427, 427, 427, 427,
+ 427, 427, 427, 427, 427, 427, 427, 427, 427, 427,
+ 427, 427, 427, 427, 427, 427, 427, 427, 427, 427,
+ 427, 427, 427, 427, 427, 427, 427, 427, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
+ 468, 468, 468, 468, 468, 468, 468, 468, 468, 468,
+ 468, 468, 468, 468, 468, 468, 468, 468, 468, 468,
+
+ 468, 468, 468, 468, 468, 468, 468, 468, 468, 468,
+ 468, 468, 475, 475, 475, 475, 475, 475, 475, 475,
+ 475, 475, 475, 475, 475, 475, 475, 475, 475, 475,
+ 475, 475, 475, 475, 475, 475, 475, 475, 475, 475,
+ 475, 475, 475, 475, 498, 498, 498, 498, 498, 498,
+ 498, 498, 498, 498, 498, 498, 498, 498, 498, 498,
+ 498, 498, 498, 498, 498, 498, 498, 498, 498, 498,
+ 498, 498, 498, 498, 498, 498, 507, 507, 507, 507,
+ 507, 507, 507, 507, 507, 507, 507, 507, 507, 507,
+ 507, 507, 507, 507, 507, 507, 507, 507, 507, 507,
+
+ 507, 507, 507, 507, 507, 507, 507, 507, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514, 514, 514,
+ 538, 538, 538, 538, 538, 538, 538, 538, 538, 538,
+ 538, 538, 538, 538, 538, 538, 538, 538, 538, 538,
+ 538, 538, 538, 538, 538, 538, 538, 538, 538, 538,
+ 538, 538, 556, 556, 556, 556, 556, 556, 556, 556,
+ 556, 556, 556, 556, 556, 556, 556, 556, 556, 556,
+ 556, 556, 556, 556, 556, 556, 556, 556, 556, 556,
+
+ 556, 556, 556, 556, 546, 546, 546, 546, 546, 546,
+ 546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
+ 546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
+ 546, 546, 546, 546, 546, 546, 571, 571, 571, 571,
+ 571, 571, 571, 571, 571, 571, 571, 571, 571, 571,
+ 571, 571, 571, 571, 571, 571, 571, 571, 571, 571,
+ 571, 571, 571, 571, 571, 571, 571, 571, 579, 579,
+ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579,
+ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579,
+ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579,
+
+ 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+ 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+ 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+ 586, 586, 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
+ 611, 611, 611, 611, 611, 611, 618, 618, 618, 618,
+
+ 618, 618, 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 618, 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 618, 618, 618, 618, 618, 618, 618, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629, 629, 629,
+ 636, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+ 636, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+ 636, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+ 636, 636, 644, 644, 644, 644, 644, 644, 644, 644,
+
+ 644, 644, 644, 644, 644, 644, 644, 644, 644, 644,
+ 644, 644, 644, 644, 644, 644, 644, 644, 644, 644,
+ 644, 644, 644, 644, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 679, 679, 679, 679,
+ 679, 679, 679, 679, 679, 679, 679, 679, 679, 679,
+ 679, 679, 679, 679, 679, 679, 679, 679, 679, 679,
+ 679, 679, 679, 679, 679, 679, 679, 679, 687, 687,
+ 687, 687, 687, 687, 687, 687, 687, 687, 687, 687,
+
+ 687, 687, 687, 687, 687, 687, 687, 687, 687, 687,
+ 687, 687, 687, 687, 687, 687, 687, 687, 687, 687,
+ 704, 704, 704, 704, 704, 704, 704, 704, 704, 704,
+ 704, 704, 704, 704, 704, 704, 704, 704, 704, 704,
+ 704, 704, 704, 704, 704, 704, 704, 704, 704, 704,
+ 704, 704, 716, 716, 716, 716, 716, 716, 716, 716,
+ 716, 716, 716, 716, 716, 716, 716, 716, 716, 716,
+ 716, 716, 716, 716, 716, 716, 716, 716, 716, 716,
+ 716, 716, 716, 716, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728, 728, 728,
+
+ 728, 728, 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 761, 761, 761, 761,
+ 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
+ 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
+ 761, 761, 761, 761, 761, 761, 761, 761, 797, 797,
+ 797, 797, 797, 797, 797, 797, 797, 797, 797, 797,
+ 797, 797, 797, 797, 797, 797, 797, 797, 797, 797,
+ 797, 797, 797, 797, 797, 797, 797, 797, 797, 797,
+ 817, 817, 817, 817, 817, 817, 817, 817, 817, 817,
+ 817, 817, 817, 817, 817, 817, 817, 817, 817, 817,
+
+ 817, 817, 817, 817, 817, 817, 817, 817, 817, 817,
+ 817, 817, 827, 827, 827, 827, 827, 827, 827, 827,
+ 827, 827, 827, 827, 827, 827, 827, 827, 827, 827,
+ 827, 827, 827, 827, 827, 827, 827, 827, 827, 827,
+ 827, 827, 827, 827, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 839, 839, 839, 839,
+ 839, 839, 839, 839, 839, 839, 839, 839, 839, 839,
+ 839, 839, 839, 839, 839, 839, 839, 839, 839, 839,
+
+ 839, 839, 839, 839, 839, 839, 839, 839, 851, 851,
+ 851, 851, 851, 851, 851, 851, 851, 851, 851, 851,
+ 851, 851, 851, 851, 851, 851, 851, 851, 851, 851,
+ 851, 851, 851, 851, 851, 851, 851, 851, 851, 851,
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 871, 871, 871, 871, 871, 871, 871, 871,
+ 871, 871, 871, 871, 871, 871, 871, 871, 871, 871,
+ 871, 871, 871, 871, 871, 871, 871, 871, 871, 871,
+
+ 871, 871, 871, 871, 879, 879, 879, 879, 879, 879,
+ 879, 879, 879, 879, 879, 879, 879, 879, 879, 879,
+ 879, 879, 879, 879, 879, 879, 879, 879, 879, 879,
+ 879, 879, 879, 879, 879, 879, 887, 887, 887, 887,
+ 887, 887, 887, 887, 887, 887, 887, 887, 887, 887,
+ 887, 887, 887, 887, 887, 887, 887, 887, 887, 887,
+ 887, 887, 887, 887, 887, 887, 887, 887, 895, 895,
+ 895, 895, 895, 895, 895, 895, 895, 895, 895, 895,
+ 895, 895, 895, 895, 895, 895, 895, 895, 895, 895,
+ 895, 895, 895, 895, 895, 895, 895, 895, 895, 895,
+
+ 904, 904, 904, 904, 904, 904, 904, 904, 904, 904,
+ 904, 904, 904, 904, 904, 904, 904, 904, 904, 904,
+ 904, 904, 904, 904, 904, 904, 904, 904, 904, 904,
+ 904, 904, 913, 913, 913, 913, 913, 913, 913, 913,
+ 913, 913, 913, 913, 913, 913, 913, 913, 913, 913,
+ 913, 913, 913, 913, 913, 913, 913, 913, 913, 913,
+ 913, 913, 913, 913, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 936, 936, 936, 936,
+
+ 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
+ 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
+ 936, 936, 936, 936, 936, 936, 936, 936, 942, 942,
+ 942, 942, 942, 942, 942, 942, 942, 942, 942, 942,
+ 942, 942, 942, 942, 942, 942, 942, 942, 942, 942,
+ 942, 942, 942, 942, 942, 942, 942, 942, 942, 942,
+ 507, 507, 507, 507, 507, 507, 507, 507, 507, 507,
+ 507, 507, 507, 507, 507, 507, 507, 507, 507, 507,
+ 507, 507, 507, 507, 507, 507, 507, 507, 507, 507,
+ 507, 507, 953, 953, 953, 953, 953, 953, 953, 953,
+
+ 953, 953, 953, 953, 953, 953, 953, 953, 953, 953,
+ 953, 953, 953, 953, 953, 953, 953, 953, 953, 953,
+ 953, 953, 953, 953, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 969, 969, 969, 969,
+ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969,
+ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969,
+ 969, 969, 969, 969, 969, 969, 969, 969, 979, 979,
+ 979, 979, 979, 979, 979, 979, 979, 979, 979, 979,
+
+ 979, 979, 979, 979, 979, 979, 979, 979, 979, 979,
+ 979, 979, 979, 979, 979, 979, 979, 979, 979, 979,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 986, 992, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1034, 1034, 1034, 1034,
+ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034,
+ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034,
+ 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1045, 1045,
+ 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045,
+ 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045,
+ 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051,
+ 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051,
+
+ 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051,
+ 1051, 1051, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056,
+ 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056,
+ 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056,
+ 1056, 1056, 1056, 1056, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1076, 1076, 1076, 1076,
+ 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076,
+ 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076,
+
+ 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1093, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1093, 3694, 3694,
+ 3694, 3694, 3694, 1093, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1093, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1093, 1107,
+ 1107, 1107, 3694, 3694, 3694, 1107, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1107, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1107,
+ 1111, 1111, 1111, 1111, 3694, 3694, 1111, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1111, 3694, 3694, 3694,
+ 3694, 3694, 1111, 3694, 3694, 3694, 3694, 3694, 3694, 1111,
+
+ 1111, 1114, 1114, 1114, 3694, 3694, 3694, 1114, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1114, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1114, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1114, 1114, 1120, 1120, 1120, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1120, 3694, 3694, 1120, 1120, 3694, 1120, 1120, 1120,
+ 1120, 3694, 3694, 3694, 1120, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1120, 1126, 1126, 1126, 3694, 3694, 3694, 1126,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1126, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1126, 1130, 1130, 1130, 1130, 1130, 1130,
+
+ 1130, 1130, 1130, 1130, 1130, 1130, 1130, 3694, 1130, 1130,
+ 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130,
+ 1130, 1130, 3694, 1130, 1130, 1130, 1136, 1136, 1136, 3694,
+ 3694, 3694, 1136, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1136, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1136, 1139, 1139, 1139,
+ 1139, 3694, 3694, 1139, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1139, 3694, 3694, 3694, 3694, 3694, 1139,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1139, 1139, 1147, 1147,
+ 1147, 3694, 3694, 3694, 3694, 3694, 3694, 1147, 3694, 3694,
+
+ 3694, 3694, 3694, 1147, 1147, 3694, 3694, 3694, 3694, 3694,
+ 1147, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1147, 1157,
+ 3694, 3694, 3694, 1157, 3694, 1157, 3694, 3694, 1157, 3694,
+ 3694, 3694, 1157, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1157, 1160, 1160, 3694, 1160, 1160, 1160, 1160, 1160, 1160,
+ 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160,
+ 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160,
+ 1160, 1160, 1160, 1176, 1176, 1176, 3694, 3694, 3694, 1176,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1176, 3694, 3694, 3694, 3694,
+
+ 1176, 3694, 3694, 1176, 1190, 1190, 1190, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1190, 3694, 1190,
+ 1190, 3694, 3694, 3694, 3694, 3694, 1190, 3694, 1190, 3694,
+ 3694, 3694, 3694, 3694, 1190, 1199, 1199, 3694, 1199, 1199,
+ 1199, 1199, 1199, 1199, 3694, 1199, 1199, 1199, 1199, 1199,
+ 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199,
+ 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1230, 1230, 1230,
+ 3694, 3694, 3694, 1230, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1230,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1230, 1237, 1237,
+
+ 1237, 1237, 3694, 3694, 1237, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1237, 3694, 3694, 3694, 3694, 3694,
+ 1237, 3694, 3694, 3694, 3694, 3694, 3694, 1237, 1237, 1245,
+ 1245, 1245, 3694, 3694, 3694, 1245, 1245, 3694, 3694, 3694,
+ 1245, 3694, 3694, 3694, 3694, 1245, 3694, 3694, 3694, 3694,
+ 3694, 1245, 3694, 3694, 3694, 1245, 3694, 3694, 3694, 1245,
+ 1263, 1263, 1263, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1263, 1263, 3694, 1263, 3694,
+ 3694, 3694, 1263, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1263, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266,
+
+ 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266,
+ 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266,
+ 1266, 1266, 1266, 1299, 1299, 3694, 1299, 1299, 1299, 1299,
+ 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299,
+ 1299, 1299, 3694, 1299, 1299, 1299, 1299, 1299, 1299, 1299,
+ 1299, 1299, 1299, 1299, 1299, 1308, 1308, 1308, 3694, 3694,
+ 3694, 1308, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1308, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1308, 1311, 1311, 1311, 1311,
+ 3694, 3694, 1311, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 1311, 3694, 3694, 3694, 3694, 3694, 1311, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1311, 1311, 1314, 1314, 1314,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1314, 1314, 3694, 1314, 3694, 3694, 3694, 1314,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1314, 1354, 1354,
+ 3694, 3694, 1354, 3694, 3694, 1354, 1354, 3694, 1354, 1354,
+ 1354, 1354, 1354, 3694, 1354, 1354, 1354, 1354, 1354, 1354,
+ 3694, 1354, 1354, 1354, 1354, 1354, 3694, 3694, 1354, 1354,
+ 1358, 1358, 3694, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1360, 1360, 3694, 1360, 1360, 1360, 1360, 1360,
+ 1360, 3694, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360,
+ 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360,
+ 1360, 1360, 1360, 1360, 1370, 1370, 1370, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1370, 3694, 1370,
+ 1370, 3694, 3694, 3694, 3694, 3694, 1370, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1370, 1377, 1377, 1377, 3694, 3694,
+ 3694, 1377, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1377, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 1377, 1380, 1380, 1380, 1380,
+ 3694, 3694, 1380, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1380, 3694, 3694, 3694, 3694, 3694, 1380, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1380, 1380, 1382, 1382, 1382,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1382, 1382, 3694, 3694, 3694, 3694, 3694, 1382,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1382, 1383, 1383,
+ 3694, 1383, 1383, 3694, 3694, 1383, 1383, 3694, 1383, 1383,
+ 1383, 1383, 1383, 3694, 1383, 1383, 1383, 1383, 1383, 1383,
+ 3694, 1383, 1383, 3694, 1383, 1383, 3694, 3694, 1383, 1383,
+
+ 1386, 1386, 3694, 1386, 1386, 1386, 1386, 1386, 1386, 3694,
+ 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386,
+ 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386,
+ 1386, 1386, 1404, 1404, 3694, 1404, 1404, 1404, 1404, 1404,
+ 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404,
+ 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404,
+ 1404, 1404, 1404, 1404, 1411, 1411, 3694, 1411, 1411, 1411,
+ 1411, 1411, 1411, 1411, 1411, 1411, 3694, 1411, 1411, 1411,
+ 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411,
+ 1411, 1411, 1411, 1411, 1411, 1411, 1417, 1417, 1417, 1417,
+
+ 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417,
+ 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417,
+ 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1424, 1424,
+ 3694, 1424, 1424, 3694, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 3694, 1424, 3694, 1424, 1424, 1424, 1424, 1424,
+ 1427, 1427, 3694, 1427, 1427, 1427, 1427, 1427, 1427, 1427,
+ 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427,
+ 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427,
+ 1427, 1427, 1437, 3694, 3694, 3694, 1437, 1437, 1437, 1437,
+
+ 1437, 1437, 1437, 1437, 3694, 1437, 3694, 3694, 1437, 1437,
+ 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437,
+ 1437, 1437, 1437, 1437, 1447, 3694, 1447, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1447, 3694, 1447, 3694, 3694, 3694, 3694,
+ 3694, 1447, 1451, 1451, 1451, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1451, 3694, 1451, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1451, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1451, 1454, 1454, 1454, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1454, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1454, 3694, 1454, 3694, 3694,
+
+ 3694, 3694, 3694, 1454, 1465, 1465, 3694, 1465, 1465, 1465,
+ 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
+ 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
+ 1465, 1465, 1465, 1465, 1465, 1465, 1469, 3694, 3694, 3694,
+ 1469, 3694, 3694, 3694, 3694, 3694, 3694, 1469, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1469, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1469, 1474, 1474, 3694, 1474, 1474, 3694, 1474,
+ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474,
+ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474,
+ 1474, 1474, 1474, 1474, 1474, 1482, 1482, 1482, 1482, 1482,
+
+ 1482, 1482, 1482, 1482, 1482, 1482, 3694, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1489, 1489, 1489,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1489, 1489, 3694, 3694, 3694, 3694, 3694, 1489,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1489, 1491, 1491,
+ 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 3694,
+ 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491,
+ 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491,
+ 1503, 1503, 3694, 1503, 3694, 3694, 3694, 1503, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 1503, 1518, 1518, 3694, 1518,
+ 1518, 1518, 1518, 1518, 1518, 3694, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518,
+ 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1529, 1529,
+ 1529, 3694, 3694, 3694, 1529, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1529, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1529, 1532,
+ 1532, 1532, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1532, 3694, 3694, 3694, 1532, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1532, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1532,
+
+ 1538, 1538, 1538, 3694, 3694, 3694, 1538, 1538, 3694, 3694,
+ 3694, 1538, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1538, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1538, 1540, 1540, 1540, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1540, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1540, 1540, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1540, 1549, 1549, 1549, 3694, 3694, 3694, 1549, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1549, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1549, 1552, 1552, 1552, 1552, 3694, 3694, 1552,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1552,
+ 3694, 3694, 3694, 3694, 3694, 1552, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1552, 1552, 1554, 1554, 1554, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1554,
+ 1554, 3694, 3694, 3694, 3694, 3694, 1554, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1554, 1561, 1561, 3694, 1561, 1561,
+ 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561,
+ 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561,
+ 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1563, 3694, 3694,
+ 3694, 1563, 3694, 3694, 1563, 1563, 3694, 3694, 3694, 1563,
+
+ 1563, 1563, 3694, 1563, 1563, 1563, 1563, 1563, 1563, 1563,
+ 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1565,
+ 1565, 3694, 1565, 1565, 1565, 1565, 1565, 1565, 3694, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1580, 1580, 3694, 1580, 1580, 1580, 1580, 1580, 1580,
+ 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580,
+ 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580,
+ 1580, 1580, 1580, 1584, 1584, 3694, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1585, 1585, 3694, 1585, 1585,
+ 3694, 1585, 1585, 1585, 3694, 3694, 3694, 1585, 1585, 1585,
+ 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585,
+ 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1586, 1586, 3694,
+ 1586, 1586, 1586, 1586, 1586, 1586, 3694, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1590,
+ 1590, 3694, 1590, 1590, 3694, 1590, 1590, 1590, 3694, 1590,
+ 1590, 1590, 1590, 1590, 3694, 1590, 1590, 1590, 1590, 1590,
+
+ 1590, 1590, 1590, 1590, 1590, 1590, 1590, 3694, 3694, 1590,
+ 1590, 1591, 1591, 3694, 1591, 1591, 1591, 1591, 1591, 1591,
+ 3694, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1593, 1593, 3694, 1593, 1593, 3694, 1593,
+ 1593, 1593, 3694, 3694, 3694, 1593, 1593, 1593, 3694, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1594, 1594, 3694, 1594, 1594,
+ 1594, 1594, 1594, 1594, 3694, 1594, 1594, 1594, 1594, 1594,
+ 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
+
+ 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1596, 1596, 3694,
+ 1596, 1596, 3694, 1596, 1596, 1596, 3694, 1596, 1596, 1596,
+ 1596, 1596, 3694, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 3694, 3694, 1596, 1596, 1597,
+ 1597, 3694, 1597, 1597, 1597, 1597, 1597, 1597, 3694, 1597,
+ 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597,
+ 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597,
+ 1597, 1607, 1607, 3694, 1607, 1607, 1607, 1607, 1607, 1607,
+ 3694, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607,
+ 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607,
+
+ 1607, 1607, 1607, 1617, 1617, 3694, 1617, 1617, 3694, 1617,
+ 1617, 1617, 3694, 1617, 1617, 1617, 1617, 1617, 1617, 1617,
+ 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 3694, 1617,
+ 1617, 1617, 1617, 1617, 1617, 1620, 1620, 3694, 1620, 1620,
+ 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
+ 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
+ 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1621, 1621, 3694,
+ 1621, 1621, 3694, 1621, 1621, 1621, 3694, 3694, 3694, 1621,
+ 1621, 1621, 3694, 1621, 1621, 1621, 1621, 1621, 1621, 1621,
+ 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1622,
+
+ 1622, 3694, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
+ 1622, 3694, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
+ 1622, 3694, 1622, 1622, 3694, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1630, 1630, 3694, 1630, 1630, 1630, 1630, 1630, 1630,
+ 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630,
+ 1630, 1630, 1630, 3694, 1630, 1630, 3694, 1630, 1630, 1630,
+ 1630, 1630, 1630, 1646, 1646, 1646, 3694, 3694, 3694, 1646,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1646, 1646, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1646, 1652, 1652, 1652, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 1652, 3694, 1652, 3694, 3694, 1652,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1652, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1652, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1657, 1657, 1657,
+ 3694, 3694, 3694, 1657, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1657,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1657, 1661, 1661,
+ 1661, 3694, 3694, 3694, 3694, 3694, 3694, 1661, 3694, 3694,
+
+ 3694, 3694, 3694, 1661, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1661, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1661, 1665,
+ 3694, 3694, 3694, 3694, 3694, 1665, 1665, 3694, 3694, 3694,
+ 1665, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1665, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1665,
+ 1671, 1671, 1671, 3694, 3694, 3694, 1671, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1671, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1671, 1674, 1674, 1674, 1674, 3694, 3694, 1674, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1674, 3694, 3694,
+
+ 3694, 3694, 3694, 1674, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1674, 1674, 1676, 1676, 1676, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1676, 1676, 3694,
+ 3694, 3694, 3694, 3694, 1676, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1676, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
+ 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
+ 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
+ 1686, 1686, 1686, 1686, 1686, 1692, 1692, 3694, 1692, 1692,
+ 1692, 1692, 1692, 1692, 1692, 1692, 1692, 3694, 1692, 1692,
+ 3694, 1692, 1692, 1692, 1692, 1692, 1692, 3694, 1692, 1692,
+
+ 3694, 1692, 1692, 1692, 1692, 1692, 1692, 1713, 1713, 1713,
+ 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713,
+ 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713,
+ 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1716,
+ 1716, 3694, 1716, 1716, 1716, 1716, 3694, 1716, 1716, 1716,
+ 1716, 3694, 1716, 1716, 3694, 1716, 1716, 1716, 3694, 1716,
+ 1716, 3694, 1716, 1716, 3694, 3694, 1716, 1716, 1716, 1716,
+ 1716, 1093, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1093, 3694, 3694, 3694, 3694, 3694, 1093, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1093, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 1093, 1114, 1114, 1114, 3694, 3694, 3694, 1114, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1114, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1114, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1114, 1114, 1107, 1107, 1107, 3694, 3694, 3694, 1107,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1107, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1107, 1730, 1730, 1730, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1730, 3694, 3694, 1730, 3694, 3694, 1730,
+ 3694, 1730, 1730, 3694, 3694, 3694, 1730, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1730, 1120, 1120, 1120, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 1120, 3694, 3694, 1120, 1120, 3694,
+ 1120, 1120, 1120, 1120, 3694, 3694, 3694, 1120, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1120, 1733, 1733, 1733, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1733,
+ 3694, 1733, 3694, 3694, 3694, 3694, 3694, 3694, 1733, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1733, 1736, 1736, 1736,
+ 3694, 3694, 3694, 1736, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1736,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1736, 1126, 1126,
+ 1126, 3694, 3694, 3694, 1126, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1126, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1126, 1738,
+ 1738, 1738, 3694, 3694, 3694, 3694, 3694, 3694, 1738, 3694,
+ 3694, 1738, 3694, 3694, 1738, 3694, 1738, 1738, 3694, 3694,
+ 3694, 1738, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1738,
+ 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130,
+ 1130, 1130, 1130, 3694, 1130, 1130, 1130, 1130, 1130, 1130,
+ 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 3694, 1130,
+ 1130, 1130, 1136, 1136, 1136, 3694, 3694, 3694, 1136, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 1136, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1136, 1740, 1740, 1740, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1740, 3694, 3694, 3694, 3694, 3694, 1740, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1740, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1740, 1147, 1147, 1147, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1147, 3694, 3694, 3694, 3694, 3694, 1147,
+ 1147, 3694, 3694, 3694, 3694, 3694, 1147, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1147, 1157, 3694, 3694, 3694, 1157,
+ 3694, 1157, 3694, 3694, 1157, 3694, 3694, 3694, 1157, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1157, 1160, 1160, 3694,
+
+ 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160,
+ 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160,
+ 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1176,
+ 1176, 1176, 3694, 3694, 3694, 1176, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1176, 3694, 3694, 3694, 3694, 1176, 3694, 3694, 1176,
+ 1759, 1759, 1759, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1759, 3694, 1759, 1759, 3694, 3694, 3694,
+ 3694, 3694, 1759, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1759, 1190, 1190, 1190, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 1190, 3694, 1190, 1190, 3694, 3694,
+ 3694, 3694, 3694, 1190, 3694, 1190, 3694, 3694, 3694, 3694,
+ 3694, 1190, 1763, 1763, 1763, 3694, 3694, 3694, 1763, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1763, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1763, 1772, 1772, 3694, 1772, 1772, 1772, 1772,
+ 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772,
+ 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 3694, 1772,
+ 1772, 1772, 1772, 1772, 1772, 1774, 1774, 3694, 1774, 1774,
+ 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774,
+
+ 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774,
+ 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1266, 1266, 1266,
+ 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266,
+ 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266,
+ 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1230,
+ 1230, 1230, 3694, 3694, 3694, 1230, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1230, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1230,
+ 1814, 1814, 1814, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1814, 3694, 3694, 1814, 3694,
+
+ 3694, 3694, 1814, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1814, 1263, 1263, 1263, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1263, 1263, 3694, 1263,
+ 3694, 3694, 3694, 1263, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1263, 1818, 1818, 3694, 1818, 1818, 1818, 1818, 1818,
+ 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
+ 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
+ 1818, 1818, 1818, 1818, 1245, 1245, 1245, 3694, 3694, 3694,
+ 1245, 1245, 3694, 3694, 3694, 1245, 3694, 3694, 3694, 3694,
+ 1245, 3694, 3694, 3694, 3694, 3694, 1245, 3694, 3694, 3694,
+
+ 1245, 3694, 3694, 3694, 1245, 1825, 1825, 1825, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1825, 1825, 3694, 3694, 3694,
+ 1825, 1825, 3694, 1825, 3694, 3694, 3694, 1825, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1825, 1843, 1843, 1843, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1843, 3694, 3694, 3694, 1843,
+ 3694, 1843, 3694, 3694, 3694, 3694, 3694, 3694, 1843, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1843, 1299, 1299, 3694,
+ 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299,
+ 1299, 1299, 1299, 1299, 1299, 1299, 3694, 1299, 1299, 1299,
+ 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1308,
+
+ 1308, 1308, 3694, 3694, 3694, 1308, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1308, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1308,
+ 1900, 1900, 1900, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1900, 3694, 3694, 1900, 3694,
+ 3694, 3694, 1900, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1900, 1314, 1314, 1314, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1314, 1314, 3694, 1314,
+ 3694, 3694, 3694, 1314, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1314, 1354, 1354, 3694, 3694, 1354, 3694, 3694, 1354,
+
+ 1354, 3694, 1354, 1354, 1354, 1354, 1354, 3694, 1354, 1354,
+ 1354, 1354, 1354, 1354, 3694, 1354, 1354, 1354, 1354, 1354,
+ 3694, 3694, 1354, 1354, 1358, 1358, 3694, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1934, 1934, 3694, 1934,
+ 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934,
+ 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934,
+ 1934, 3694, 1934, 1934, 1934, 1934, 1934, 1934, 1936, 1936,
+ 3694, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1941, 1941, 3694, 1941, 1941, 1941, 1941, 1941, 1941, 1941,
+ 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941,
+ 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941,
+ 1941, 1941, 1370, 1370, 1370, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1370, 3694, 1370, 1370, 3694,
+ 3694, 3694, 3694, 3694, 1370, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1370, 1946, 1946, 1946, 3694, 3694, 3694, 1946,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 1946, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1946, 1377, 1377, 1377, 3694, 3694, 3694,
+ 1377, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1377, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1377, 1382, 1382, 1382, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1382, 1382, 3694, 3694, 3694, 3694, 3694, 1382, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1382, 1383, 1383, 3694, 1383,
+ 1383, 3694, 3694, 1383, 1383, 3694, 1383, 1383, 1383, 1383,
+ 1383, 3694, 1383, 1383, 1383, 1383, 1383, 1383, 3694, 1383,
+
+ 1383, 3694, 1383, 1383, 3694, 3694, 1383, 1383, 1950, 1950,
+ 3694, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950,
+ 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950,
+ 1950, 1950, 1950, 3694, 1950, 1950, 1950, 1950, 1950, 1950,
+ 1952, 1952, 3694, 1952, 1952, 1952, 1952, 1952, 1952, 1952,
+ 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952,
+ 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952,
+ 1952, 1952, 1411, 1411, 3694, 1411, 1411, 1411, 1411, 1411,
+ 1411, 1411, 1411, 1411, 3694, 1411, 1411, 1411, 1411, 1411,
+ 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411,
+
+ 1411, 1411, 1411, 1411, 1417, 1417, 1417, 1417, 1417, 1417,
+ 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417,
+ 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417,
+ 1417, 1417, 1417, 1417, 1417, 1417, 1424, 1424, 3694, 1424,
+ 1424, 3694, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 3694, 1424, 3694, 1424, 1424, 1424, 1424, 1424, 1427, 1427,
+ 3694, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427,
+ 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427,
+ 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427,
+
+ 1437, 3694, 3694, 3694, 1437, 1437, 1437, 1437, 1437, 1437,
+ 1437, 1437, 3694, 1437, 3694, 3694, 1437, 1437, 1437, 1437,
+ 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437,
+ 1437, 1437, 1447, 3694, 1447, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1447, 3694, 1447, 3694, 3694, 3694, 3694, 3694, 1447,
+ 1451, 1451, 1451, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1451, 3694, 1451, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1451, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1451, 1972, 1972, 1972, 3694, 3694, 3694, 1972, 3694, 3694,
+ 3694, 3694, 1972, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 1972, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1972, 1454, 1454, 1454, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1454, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1454, 3694, 1454, 3694, 3694, 3694,
+ 3694, 3694, 1454, 1452, 1452, 1452, 3694, 3694, 3694, 1452,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1452, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1452, 1465, 1465, 3694, 1465, 1465, 1465,
+ 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
+ 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
+
+ 1465, 1465, 1465, 1465, 1465, 1465, 1469, 3694, 3694, 3694,
+ 1469, 3694, 3694, 3694, 3694, 3694, 3694, 1469, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1469, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1469, 1474, 1474, 3694, 1474, 1474, 3694, 1474,
+ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474,
+ 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474,
+ 1474, 1474, 1474, 1474, 1474, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 3694, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1489, 1489, 1489,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1489, 1489, 3694, 3694, 3694, 3694, 3694, 1489,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1489, 1491, 1491,
+ 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 3694,
+ 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491,
+ 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491,
+ 1503, 1503, 3694, 1503, 3694, 3694, 3694, 1503, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1503, 1997, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1997, 3694, 3694, 3694, 1997, 1997, 3694,
+ 3694, 1997, 3694, 3694, 3694, 3694, 1997, 3694, 1997, 2006,
+
+ 2006, 3694, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006,
+ 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006,
+ 2006, 2006, 2006, 2006, 3694, 2006, 2006, 2006, 2006, 2006,
+ 2006, 2008, 2008, 3694, 2008, 2008, 2008, 2008, 2008, 2008,
+ 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008,
+ 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008,
+ 2008, 2008, 2008, 1529, 1529, 1529, 3694, 3694, 3694, 1529,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1529, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1529, 1532, 1532, 1532, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 1532, 3694, 3694, 3694, 1532,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1532, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1532, 1538, 1538, 1538, 3694, 3694,
+ 3694, 1538, 1538, 3694, 3694, 3694, 1538, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1538, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1538, 1540, 1540, 1540, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1540, 3694, 3694, 3694, 3694, 3694, 3694, 1540, 1540,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1540, 2016, 2016, 3694,
+ 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
+
+ 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
+ 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2021,
+ 2021, 2021, 3694, 3694, 3694, 2021, 3694, 3694, 3694, 3694,
+ 2021, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2021, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2021,
+ 1549, 1549, 1549, 3694, 3694, 3694, 1549, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1549, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1549, 1554, 1554, 1554, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1554, 1554, 3694, 3694,
+
+ 3694, 3694, 3694, 1554, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1554, 1561, 1561, 3694, 1561, 1561, 1561, 1561, 1561,
+ 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561,
+ 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561,
+ 1561, 1561, 1561, 1561, 1563, 3694, 3694, 3694, 1563, 3694,
+ 3694, 1563, 1563, 3694, 3694, 3694, 1563, 1563, 1563, 3694,
+ 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563,
+ 1563, 1563, 1563, 1563, 1563, 1563, 2027, 2027, 3694, 2027,
+ 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027,
+ 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027,
+
+ 2027, 3694, 2027, 2027, 2027, 2027, 2027, 2027, 2029, 2029,
+ 3694, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029,
+ 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029,
+ 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029,
+ 1585, 1585, 3694, 1585, 1585, 3694, 1585, 1585, 1585, 3694,
+ 3694, 3694, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585,
+ 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585,
+ 1585, 1585, 2036, 2036, 3694, 2036, 2036, 2036, 2036, 2036,
+ 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036,
+ 2036, 2036, 2036, 2036, 2036, 2036, 2036, 3694, 2036, 2036,
+
+ 2036, 2036, 2036, 2036, 2038, 2038, 3694, 2038, 2038, 2038,
+ 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038,
+ 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038,
+ 2038, 2038, 2038, 2038, 2038, 2038, 1590, 1590, 3694, 1590,
+ 1590, 3694, 1590, 1590, 1590, 3694, 1590, 1590, 1590, 1590,
+ 1590, 3694, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590,
+ 1590, 1590, 1590, 1590, 3694, 3694, 1590, 1590, 2040, 2040,
+ 3694, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040,
+ 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040,
+ 2040, 2040, 2040, 3694, 2040, 2040, 2040, 2040, 2040, 2040,
+
+ 2042, 2042, 3694, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 2042, 2042, 1593, 1593, 3694, 1593, 1593, 3694, 1593, 1593,
+ 1593, 3694, 3694, 3694, 1593, 1593, 1593, 3694, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 2044, 2044, 3694, 2044, 2044, 2044,
+ 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044,
+ 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 3694,
+ 2044, 2044, 2044, 2044, 2044, 2044, 2046, 2046, 3694, 2046,
+
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
+ 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 1596, 1596,
+ 3694, 1596, 1596, 3694, 1596, 1596, 1596, 3694, 1596, 1596,
+ 1596, 1596, 1596, 3694, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 1596, 3694, 3694, 1596, 1596,
+ 2048, 2048, 3694, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 3694, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2050, 2050, 3694, 2050, 2050, 2050, 2050, 2050,
+
+ 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050,
+ 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050,
+ 2050, 2050, 2050, 2050, 2056, 2056, 3694, 2056, 2056, 2056,
+ 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
+ 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 3694,
+ 2056, 2056, 2056, 2056, 2056, 2056, 2058, 2058, 3694, 2058,
+ 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058,
+ 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 1617, 1617,
+ 3694, 1617, 1617, 3694, 1617, 1617, 1617, 3694, 1617, 1617,
+
+ 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617,
+ 1617, 1617, 1617, 3694, 1617, 1617, 1617, 1617, 1617, 1617,
+ 1621, 1621, 3694, 1621, 1621, 3694, 1621, 1621, 1621, 3694,
+ 3694, 3694, 1621, 1621, 1621, 3694, 1621, 1621, 1621, 1621,
+ 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621,
+ 1621, 1621, 1622, 1622, 3694, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 3694, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 3694, 1622, 1622, 3694, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1630, 1630, 3694, 1630, 1630, 1630,
+ 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630,
+
+ 1630, 1630, 1630, 1630, 1630, 1630, 3694, 1630, 1630, 3694,
+ 1630, 1630, 1630, 1630, 1630, 1630, 1646, 1646, 1646, 3694,
+ 3694, 3694, 1646, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1646, 1646,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1646, 2073, 2073, 2073,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2073, 3694, 2073,
+ 3694, 3694, 2073, 3694, 3694, 3694, 3694, 3694, 3694, 2073,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2073, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1652, 1652, 1652, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1652, 3694, 1652, 3694, 3694, 1652, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1652, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1652, 1657, 1657, 1657, 3694, 3694, 3694, 1657, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1657, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1657, 2077, 2077, 2077, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2077, 3694, 3694,
+ 3694, 3694, 3694, 3694, 2077, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 2077, 1661, 1661, 1661, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1661, 3694, 3694, 3694, 3694, 3694, 1661, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1661, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1661, 1671, 1671, 1671, 3694, 3694, 3694,
+ 1671, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1671, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1671, 1676, 1676, 1676, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1676, 1676, 3694, 3694, 3694, 3694, 3694, 1676, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1676, 1686, 1686, 1686, 1686,
+
+ 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
+ 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
+ 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1692, 1692,
+ 3694, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692,
+ 3694, 1692, 1692, 3694, 1692, 1692, 1692, 1692, 1692, 1692,
+ 3694, 1692, 1692, 3694, 1692, 1692, 1692, 1692, 1692, 1692,
+ 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713,
+ 1713, 1713, 1713, 1713, 1713, 3694, 1713, 1713, 1713, 1713,
+ 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713,
+ 1713, 1713, 1716, 1716, 3694, 1716, 1716, 1716, 1716, 3694,
+
+ 1716, 1716, 1716, 1716, 3694, 1716, 1716, 3694, 1716, 1716,
+ 1716, 3694, 1716, 1716, 3694, 1716, 1716, 3694, 3694, 1716,
+ 1716, 1716, 1716, 1716, 1730, 1730, 1730, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1730, 3694, 3694, 1730, 3694, 3694, 1730,
+ 3694, 1730, 1730, 3694, 3694, 3694, 1730, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1730, 2109, 2109, 2109, 3694, 3694,
+ 3694, 3694, 3694, 3694, 2109, 3694, 3694, 2109, 3694, 3694,
+ 2109, 2109, 2109, 2109, 3694, 3694, 3694, 2109, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2109, 1733, 1733, 1733, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1733,
+
+ 3694, 1733, 3694, 3694, 3694, 3694, 3694, 3694, 1733, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1733, 1736, 1736, 1736,
+ 3694, 3694, 3694, 1736, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1736,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1736, 1731, 1731,
+ 1731, 1731, 3694, 3694, 1731, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1731, 3694, 3694, 3694, 3694, 3694,
+ 1731, 3694, 3694, 3694, 3694, 3694, 3694, 1731, 1731, 1738,
+ 1738, 1738, 3694, 3694, 3694, 3694, 3694, 3694, 1738, 3694,
+ 3694, 1738, 3694, 3694, 1738, 3694, 1738, 1738, 3694, 3694,
+
+ 3694, 1738, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1738,
+ 1740, 1740, 1740, 3694, 3694, 3694, 3694, 3694, 3694, 1740,
+ 3694, 3694, 3694, 3694, 3694, 1740, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1740, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1740, 2111, 2111, 2111, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2111, 3694, 3694, 3694, 3694, 3694, 2111, 2111, 3694, 3694,
+ 3694, 3694, 3694, 2111, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2111, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112,
+ 2112, 2112, 2112, 2112, 3694, 2112, 2112, 3694, 2112, 2112,
+ 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112,
+
+ 2112, 2112, 2112, 2112, 2114, 2114, 2114, 2114, 2114, 2114,
+ 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 3694,
+ 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114,
+ 2114, 2114, 2114, 2114, 2114, 2114, 1741, 1741, 1741, 1741,
+ 3694, 3694, 1741, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1741, 3694, 3694, 3694, 3694, 3694, 1741, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1741, 1741, 1147, 1147, 1147,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1147, 3694, 3694, 3694,
+ 3694, 3694, 1147, 1147, 3694, 3694, 3694, 3694, 3694, 1147,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1147, 1157, 3694,
+
+ 3694, 3694, 1157, 3694, 1157, 3694, 3694, 1157, 3694, 3694,
+ 3694, 1157, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1157,
+ 2128, 2128, 2128, 2128, 3694, 3694, 2128, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 2128, 3694, 3694, 3694,
+ 3694, 3694, 2128, 3694, 3694, 3694, 3694, 3694, 3694, 2128,
+ 2128, 1759, 1759, 1759, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1759, 3694, 1759, 1759, 3694, 3694,
+ 3694, 3694, 3694, 1759, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1759, 1763, 1763, 1763, 3694, 3694, 3694, 1763, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 1763, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1763, 2130, 2130, 2130, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2130, 2130,
+ 3694, 3694, 3694, 3694, 3694, 2130, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 2130, 2137, 2137, 3694, 2137, 2137, 2137,
+ 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137,
+ 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 3694,
+ 2137, 2137, 2137, 2137, 2137, 2137, 1237, 1237, 1237, 1237,
+ 3694, 3694, 1237, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1237, 3694, 3694, 3694, 3694, 3694, 1237, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 1237, 1237, 1814, 1814, 1814,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1814, 3694, 3694, 1814, 3694, 3694, 3694, 1814,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1814, 1818, 1818,
+ 3694, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
+ 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
+ 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818,
+ 2189, 2189, 2189, 3694, 3694, 3694, 2189, 2189, 3694, 3694,
+ 3694, 2189, 3694, 3694, 3694, 3694, 2189, 3694, 3694, 3694,
+ 3694, 3694, 2189, 3694, 3694, 3694, 2189, 3694, 3694, 3694,
+
+ 2189, 2192, 2192, 2192, 3694, 3694, 3694, 2192, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2192, 3694, 3694,
+ 3694, 3694, 3694, 2192, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2192, 2198, 2198, 2198, 3694, 3694, 3694, 2198, 3694,
+ 3694, 3694, 2198, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 2198, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 2198, 1825, 1825, 1825, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1825, 1825, 3694, 3694, 3694, 1825, 1825,
+ 3694, 1825, 3694, 3694, 3694, 1825, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1825, 2200, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 2200, 3694, 3694, 3694, 2200, 2200, 3694, 3694, 2200,
+ 3694, 3694, 3694, 3694, 2200, 3694, 2200, 2202, 2202, 2202,
+ 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 3694,
+ 2202, 2202, 3694, 2202, 2202, 2202, 2202, 2202, 2202, 2202,
+ 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2208,
+ 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208,
+ 2208, 2208, 2208, 2208, 3694, 2208, 2208, 2208, 2208, 2208,
+ 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208,
+ 2208, 1843, 1843, 1843, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1843, 3694, 3694, 3694, 1843, 3694, 1843, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 1843, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1843, 1263, 1263, 1263, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1263, 1263, 3694,
+ 1263, 3694, 3694, 3694, 1263, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1263, 1900, 1900, 1900, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1900, 3694,
+ 3694, 1900, 3694, 3694, 3694, 1900, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1900, 1311, 1311, 1311, 1311, 3694, 3694,
+ 1311, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1311, 3694, 3694, 3694, 3694, 3694, 1311, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 1311, 1311, 2292, 2292, 2292, 2292, 2292,
+ 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292,
+ 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292,
+ 2292, 2292, 2292, 2292, 2292, 2292, 2292, 1358, 1358, 3694,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 2295,
+ 2295, 3694, 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295,
+ 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295, 2295,
+ 2295, 2295, 2295, 2295, 3694, 2295, 2295, 2295, 2295, 2295,
+
+ 2295, 1941, 1941, 3694, 1941, 1941, 1941, 1941, 1941, 1941,
+ 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941,
+ 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941,
+ 1941, 1941, 1941, 1946, 1946, 1946, 3694, 3694, 3694, 1946,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1946, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1946, 2301, 2301, 2301, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2301, 3694, 2301,
+ 2301, 3694, 3694, 3694, 3694, 3694, 2301, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 2301, 1370, 1370, 1370, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1370, 3694,
+ 1370, 1370, 3694, 3694, 3694, 3694, 3694, 1370, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1370, 1380, 1380, 1380, 1380,
+ 3694, 3694, 1380, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1380, 3694, 3694, 3694, 3694, 3694, 1380, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1380, 1380, 2303, 2303, 3694,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 3694, 2303, 2303, 2303, 2303, 2303, 2303, 1437,
+ 3694, 3694, 3694, 1437, 1437, 1437, 1437, 1437, 1437, 1437,
+
+ 1437, 3694, 1437, 3694, 3694, 1437, 1437, 1437, 1437, 1437,
+ 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437,
+ 1437, 2315, 3694, 2315, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2315, 3694, 2315, 3694, 3694, 3694, 3694, 3694, 2315, 1972,
+ 1972, 1972, 3694, 3694, 3694, 1972, 3694, 3694, 3694, 3694,
+ 1972, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1972, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1972,
+ 2316, 2316, 2316, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 2316, 3694, 2316, 3694, 3694, 3694, 3694,
+ 3694, 3694, 2316, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 2316, 1452, 1452, 1452, 3694, 3694, 3694, 1452, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1452, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1452, 1997, 3694, 3694, 3694, 3694, 3694, 3694, 1997,
+ 3694, 3694, 3694, 1997, 1997, 3694, 3694, 1997, 3694, 3694,
+ 3694, 3694, 1997, 3694, 1997, 1503, 1503, 3694, 1503, 3694,
+ 3694, 3694, 1503, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1503, 2337, 2337, 3694, 2337, 2337, 2337, 2337, 2337, 2337,
+ 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337,
+ 2337, 2337, 2337, 2337, 2337, 2337, 3694, 2337, 2337, 2337,
+
+ 2337, 2337, 2337, 2016, 2016, 3694, 2016, 2016, 2016, 2016,
+ 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
+ 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
+ 2016, 2016, 2016, 2016, 2016, 2021, 2021, 2021, 3694, 3694,
+ 3694, 2021, 3694, 3694, 3694, 3694, 2021, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2021, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2021, 2342, 2342, 2342, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2342, 2342, 3694, 3694, 3694, 3694, 3694, 2342, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 2342, 1552, 1552, 1552,
+
+ 1552, 3694, 3694, 1552, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1552, 3694, 3694, 3694, 3694, 3694, 1552,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1552, 1552, 2344, 2344,
+ 3694, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 3694, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2351, 2351, 3694, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2351, 2351, 2351, 3694, 2351, 2351, 2351, 2351,
+ 2351, 2351, 2354, 2354, 3694, 2354, 2354, 2354, 2354, 2354,
+
+ 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354,
+ 2354, 2354, 2354, 2354, 2354, 2354, 2354, 3694, 2354, 2354,
+ 2354, 2354, 2354, 2354, 2357, 2357, 3694, 2357, 2357, 2357,
+ 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357,
+ 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 3694,
+ 2357, 2357, 2357, 2357, 2357, 2357, 2360, 2360, 3694, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 3694, 2360, 2360, 2360, 2360, 2360, 2360, 1596, 1596,
+ 3694, 1596, 1596, 3694, 1596, 1596, 1596, 3694, 1596, 1596,
+
+ 1596, 1596, 1596, 3694, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 1596, 3694, 3694, 1596, 1596,
+ 2366, 2366, 3694, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2366, 2366, 2366, 3694, 2366, 2366, 2366, 2366,
+ 2366, 2366, 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379,
+ 2379, 2379, 2379, 2379, 2379, 2379, 2379, 2379, 3694, 2379,
+ 2379, 2379, 2379, 2379, 2379, 3694, 2379, 2379, 2379, 2379,
+ 2379, 2379, 2379, 2379, 2073, 2073, 2073, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 2073, 3694, 2073, 3694, 3694, 2073,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 2073, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 2073, 2077, 2077, 2077, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2077, 3694, 3694, 3694, 3694, 3694, 3694, 2077, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2077, 1674, 1674, 1674, 1674,
+ 3694, 3694, 1674, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1674, 3694, 3694, 3694, 3694, 3694, 1674, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1674, 1674, 1692, 1692, 3694,
+ 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 3694,
+ 1692, 1692, 3694, 1692, 1692, 1692, 1692, 1692, 1692, 3694,
+
+ 1692, 1692, 3694, 1692, 1692, 1692, 1692, 1692, 1692, 1713,
+ 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713,
+ 1713, 1713, 1713, 1713, 3694, 1713, 1713, 1713, 1713, 1713,
+ 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713,
+ 1713, 2109, 2109, 2109, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2109, 3694, 3694, 2109, 3694, 3694, 2109, 2109, 2109, 2109,
+ 3694, 3694, 3694, 2109, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2109, 2111, 2111, 2111, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2111, 3694, 3694, 3694, 3694, 3694, 2111, 2111, 3694,
+ 3694, 3694, 3694, 3694, 2111, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 2111, 1147, 1147, 1147, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1147, 3694, 3694, 3694, 3694, 3694, 1147, 1147,
+ 3694, 3694, 3694, 3694, 3694, 1147, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1147, 1157, 3694, 3694, 3694, 1157, 3694,
+ 1157, 3694, 3694, 1157, 3694, 3694, 3694, 1157, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1157, 2128, 2128, 2128, 2128,
+ 3694, 3694, 2128, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 2128, 3694, 3694, 3694, 3694, 3694, 2128, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2128, 2128, 2408, 2408, 2408,
+ 3694, 3694, 3694, 2408, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2408,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2408, 2412, 2412,
+ 2412, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 2412, 2412, 3694, 3694, 3694, 3694, 3694,
+ 2412, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2412, 1759,
+ 1759, 1759, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1759, 3694, 1759, 1759, 3694, 3694, 3694, 3694,
+ 3694, 1759, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1759,
+ 2130, 2130, 2130, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2130, 2130, 3694, 3694, 3694,
+
+ 3694, 3694, 2130, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2130, 1763, 1763, 1763, 3694, 3694, 3694, 1763, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1763, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1763, 2418, 2418, 3694, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2418, 2418, 2418, 3694, 2418, 2418,
+ 2418, 2418, 2418, 2418, 2189, 2189, 2189, 3694, 3694, 3694,
+ 2189, 2189, 3694, 3694, 3694, 2189, 3694, 3694, 3694, 3694,
+ 2189, 3694, 3694, 3694, 3694, 3694, 2189, 3694, 3694, 3694,
+
+ 2189, 3694, 3694, 3694, 2189, 2470, 2470, 2470, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2470, 2470, 3694, 2470, 3694, 3694, 3694, 2470, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2470, 2192, 2192, 2192, 3694,
+ 3694, 3694, 2192, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2192, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 2192, 2474, 2474, 2474,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2474, 3694, 3694,
+ 3694, 3694, 2474, 2474, 3694, 2474, 3694, 3694, 3694, 2474,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2474, 2198, 2198,
+
+ 2198, 3694, 3694, 3694, 2198, 3694, 3694, 3694, 2198, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2198, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2198, 2477,
+ 3694, 3694, 3694, 2477, 3694, 3694, 3694, 3694, 2477, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2477, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 2477, 2200, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2200, 3694, 3694, 3694, 2200, 2200, 3694, 3694, 2200,
+ 3694, 3694, 3694, 3694, 2200, 3694, 2200, 2478, 2478, 3694,
+ 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478,
+ 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478,
+
+ 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2480,
+ 2480, 3694, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480,
+ 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480,
+ 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480,
+ 2480, 2483, 2483, 2483, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2483, 3694, 3694, 3694, 2483, 3694, 2483, 3694, 3694, 3694,
+ 3694, 3694, 3694, 2483, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2483, 1843, 1843, 1843, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1843, 3694, 3694, 3694, 1843, 3694, 1843, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1843, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 1843, 1263, 1263, 1263, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1263, 1263,
+ 3694, 1263, 3694, 3694, 3694, 1263, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1263, 2292, 2292, 2292, 2292, 2292, 2292,
+ 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292,
+ 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292, 2292,
+ 2292, 2292, 2292, 2292, 2292, 2292, 1358, 1358, 3694, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 2562, 2562,
+
+ 3694, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562,
+ 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562,
+ 2562, 2562, 2562, 3694, 2562, 2562, 2562, 2562, 2562, 2562,
+ 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565,
+ 2565, 2565, 2565, 2565, 2565, 2565, 3694, 2565, 2565, 2565,
+ 2565, 2565, 2565, 3694, 2565, 2565, 2565, 2565, 2565, 2565,
+ 2565, 2565, 2301, 2301, 2301, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2301, 3694, 2301, 2301, 3694,
+ 3694, 3694, 3694, 3694, 2301, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 2301, 1370, 1370, 1370, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 1370, 3694, 1370, 1370,
+ 3694, 3694, 3694, 3694, 3694, 1370, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1370, 2567, 2567, 3694, 2567, 2567, 2567,
+ 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567,
+ 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567, 3694,
+ 2567, 2567, 2567, 2567, 2567, 2567, 1437, 3694, 3694, 3694,
+ 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 3694, 1437,
+ 3694, 3694, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437,
+ 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 2315, 3694,
+ 2315, 3694, 3694, 3694, 3694, 3694, 3694, 2315, 3694, 2315,
+
+ 3694, 3694, 3694, 3694, 3694, 2315, 2316, 2316, 2316, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2316,
+ 3694, 2316, 3694, 3694, 3694, 3694, 3694, 3694, 2316, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 2316, 1503, 1503, 3694,
+ 1503, 3694, 3694, 3694, 1503, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1503, 2593, 2593, 3694, 2593, 2593, 2593, 2593,
+ 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593,
+ 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 3694, 2593,
+ 2593, 2593, 2593, 2593, 2593, 2342, 2342, 2342, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 2342, 2342, 3694, 3694, 3694, 3694, 3694, 2342, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2342, 2596, 2596, 3694, 2596,
+ 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596,
+ 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596,
+ 2596, 3694, 2596, 2596, 2596, 2596, 2596, 2596, 2599, 2599,
+ 3694, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599,
+ 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599,
+ 2599, 2599, 2599, 3694, 2599, 2599, 2599, 2599, 2599, 2599,
+ 2601, 2601, 3694, 2601, 2601, 2601, 2601, 2601, 2601, 2601,
+ 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601,
+
+ 2601, 2601, 2601, 2601, 2601, 3694, 2601, 2601, 2601, 2601,
+ 2601, 2601, 2603, 2603, 3694, 2603, 2603, 2603, 2603, 2603,
+ 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603,
+ 2603, 2603, 2603, 2603, 2603, 2603, 2603, 3694, 2603, 2603,
+ 2603, 2603, 2603, 2603, 2605, 2605, 3694, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 3694,
+ 2605, 2605, 2605, 2605, 2605, 2605, 1596, 1596, 3694, 1596,
+ 1596, 1596, 1596, 1596, 1596, 3694, 1596, 1596, 1596, 1596,
+ 1596, 3694, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+
+ 1596, 1596, 1596, 1596, 3694, 3694, 1596, 1596, 2609, 2609,
+ 3694, 2609, 2609, 2609, 2609, 2609, 2609, 2609, 2609, 2609,
+ 2609, 2609, 2609, 2609, 2609, 2609, 2609, 2609, 2609, 2609,
+ 2609, 2609, 2609, 3694, 2609, 2609, 2609, 2609, 2609, 2609,
+ 2613, 2613, 2613, 2613, 2613, 2613, 2613, 2613, 2613, 2613,
+ 2613, 2613, 2613, 2613, 2613, 2613, 3694, 2613, 2613, 2613,
+ 2613, 2613, 2613, 3694, 2613, 2613, 2613, 2613, 2613, 2613,
+ 2613, 2613, 1665, 3694, 3694, 3694, 3694, 3694, 1665, 1665,
+ 3694, 3694, 3694, 1665, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 1665, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 1665, 1692, 1692, 3694, 1692, 1692, 1692, 1692,
+ 1692, 1692, 1692, 1692, 1692, 3694, 1692, 1692, 3694, 1692,
+ 1692, 1692, 1692, 1692, 1692, 3694, 1692, 1692, 3694, 1692,
+ 1692, 1692, 1692, 1692, 1692, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 3694, 2634, 2634, 2634, 2634, 2634, 2634, 3694, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 1147, 1147, 1147,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1147, 3694, 3694, 3694,
+ 3694, 3694, 1147, 1147, 3694, 3694, 3694, 3694, 3694, 1147,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1147, 1157, 3694,
+
+ 3694, 3694, 1157, 3694, 1157, 3694, 3694, 1157, 3694, 3694,
+ 3694, 1157, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1157,
+ 2408, 2408, 2408, 3694, 3694, 3694, 2408, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 2408, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2408, 2412, 2412, 2412, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 2412, 2412, 3694, 3694,
+ 3694, 3694, 3694, 2412, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2412, 1759, 1759, 1759, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1759, 3694, 1759, 1759, 3694,
+
+ 3694, 3694, 3694, 3694, 1759, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1759, 2189, 2189, 2189, 3694, 3694, 3694, 2189,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2189,
+ 3694, 3694, 3694, 3694, 3694, 2189, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 2189, 2470, 2470, 2470, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2470,
+ 2470, 3694, 2470, 3694, 3694, 3694, 2470, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 2470, 2705, 3694, 3694, 3694, 3694,
+ 3694, 3694, 2705, 3694, 3694, 3694, 2705, 2705, 3694, 3694,
+ 2705, 3694, 3694, 3694, 3694, 2705, 3694, 2705, 2474, 2474,
+
+ 2474, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2474, 3694,
+ 3694, 3694, 3694, 2474, 2474, 3694, 2474, 3694, 3694, 3694,
+ 2474, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2474, 2477,
+ 3694, 3694, 3694, 2477, 3694, 3694, 3694, 3694, 2477, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2477, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 2477, 2478, 2478, 3694, 2478, 2478, 2478,
+ 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478,
+ 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478, 2478,
+ 2478, 2478, 2478, 2478, 2478, 2478, 2480, 2480, 3694, 2480,
+ 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480,
+
+ 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480,
+ 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2483, 2483,
+ 2483, 3694, 3694, 3694, 3694, 3694, 3694, 2483, 3694, 3694,
+ 3694, 2483, 3694, 2483, 3694, 3694, 3694, 3694, 3694, 3694,
+ 2483, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 2483, 1843,
+ 1843, 1843, 3694, 3694, 3694, 3694, 3694, 3694, 1843, 3694,
+ 3694, 3694, 1843, 3694, 1843, 3694, 3694, 3694, 3694, 3694,
+ 3694, 1843, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1843,
+ 1263, 1263, 1263, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 1263, 1263, 3694, 1263, 3694,
+
+ 3694, 3694, 1263, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1263, 1358, 1358, 3694, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 1358, 1358, 1370, 1370, 1370, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1370, 3694, 1370, 1370,
+ 3694, 3694, 3694, 3694, 3694, 1370, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1370, 1431, 1431, 1431, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1431,
+ 3694, 3694, 3694, 3694, 3694, 3694, 1431, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 1431, 1437, 3694, 3694, 3694, 1437,
+ 1437, 1437, 1437, 1437, 1437, 1437, 1437, 3694, 1437, 3694,
+ 3694, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437,
+ 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1503, 1503, 3694,
+ 1503, 3694, 3694, 3694, 1503, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 1503, 2021, 2021, 2021, 3694, 3694, 3694, 2021,
+ 3694, 3694, 3694, 3694, 2021, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2021, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 2021, 2804, 2804, 3694, 2804, 2804, 3694,
+ 2804, 2804, 2804, 2804, 2804, 2804, 2804, 2804, 2804, 2804,
+
+ 2804, 2804, 2804, 2804, 2804, 2804, 2804, 2804, 2804, 2804,
+ 2804, 2804, 2804, 2804, 2804, 2804, 1692, 1692, 3694, 1692,
+ 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 3694, 1692,
+ 1692, 3694, 1692, 1692, 1692, 1692, 1692, 1692, 3694, 1692,
+ 1692, 3694, 1692, 1692, 1692, 1692, 1692, 1692, 1147, 1147,
+ 1147, 3694, 3694, 3694, 3694, 3694, 3694, 1147, 3694, 3694,
+ 3694, 3694, 3694, 1147, 1147, 3694, 3694, 3694, 3694, 3694,
+ 1147, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 1147, 2128,
+ 2128, 2128, 2128, 3694, 3694, 2128, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 2128, 3694, 3694, 3694, 3694,
+
+ 3694, 2128, 3694, 3694, 3694, 3694, 3694, 3694, 2128, 2128,
+ 1759, 1759, 1759, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 1759, 3694, 1759, 1759, 3694, 3694, 3694,
+ 3694, 3694, 1759, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 1759, 2189, 2189, 2189, 3694, 3694, 3694, 2189, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 2189, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 2189, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163,
+ 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3694, 3163,
+ 3163, 3163, 3163, 3163, 3163, 3694, 3163, 3163, 3163, 3163,
+
+ 3163, 3163, 3163, 3163, 3340, 3340, 3340, 3340, 3340, 3340,
+ 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340,
+ 3694, 3340, 3340, 3340, 3340, 3340, 3340, 3694, 3340, 3340,
+ 3340, 3340, 3340, 3340, 3340, 3340, 3467, 3467, 3467, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3467, 3694, 3694, 3694, 3467, 3694, 3694, 3467, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3467, 253, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694
+ } ;
+
+static yyconst flex_int16_t yy_chk[28653] =
+ { 0,
+ 0, 0, 1, 0, 2, 0, 1, 1, 2, 2,
+ 391, 1, 0, 2, 391, 259, 269, 269, 0, 1,
+ 259, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+
+ 3, 3, 3, 3, 3, 3, 5, 5, 5, 5,
+ 268, 5, 5, 390, 390, 268, 5, 6, 6, 6,
+ 6, 19, 6, 6, 5, 19, 19, 6, 290, 656,
+ 19, 19, 19, 290, 279, 6, 33, 279, 19, 303,
+ 33, 33, 554, 554, 303, 33, 19, 83, 19, 321,
+ 33, 83, 83, 33, 321, 261, 83, 5, 261, 325,
+ 33, 674, 325, 656, 83, 674, 261, 2388, 6, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+
+ 13, 13, 13, 13, 13, 15, 433, 16, 331, 15,
+ 15, 16, 16, 331, 15, 2392, 16, 282, 282, 282,
+ 282, 20, 15, 340, 16, 20, 20, 308, 340, 1070,
+ 20, 20, 20, 308, 43, 43, 43, 43, 20, 43,
+ 43, 282, 308, 1070, 43, 348, 20, 2394, 20, 433,
+ 348, 747, 43, 747, 15, 1070, 16, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 23, 496, 24, 368, 23,
+ 23, 24, 24, 368, 23, 496, 24, 288, 288, 288,
+ 288, 34, 23, 37, 24, 34, 34, 37, 37, 1097,
+ 34, 361, 37, 369, 361, 34, 369, 84, 34, 382,
+ 37, 84, 84, 1097, 382, 34, 84, 1502, 37, 1502,
+ 273, 273, 273, 273, 84, 2395, 23, 273, 24, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 29, 29, 29,
+ 29, 396, 29, 29, 573, 573, 396, 29, 30, 30,
+ 30, 30, 432, 30, 30, 29, 309, 432, 30, 31,
+ 447, 400, 309, 31, 31, 447, 30, 1499, 31, 31,
+ 32, 309, 400, 31, 32, 32, 31, 452, 388, 32,
+ 32, 388, 452, 31, 32, 1499, 38, 32, 49, 526,
+
+ 38, 38, 49, 49, 32, 38, 467, 49, 49, 49,
+ 653, 467, 653, 38, 50, 49, 29, 309, 50, 50,
+ 1224, 38, 29, 50, 50, 50, 519, 30, 653, 519,
+ 1224, 50, 2088, 30, 44, 44, 44, 44, 474, 44,
+ 44, 578, 578, 474, 44, 388, 388, 31, 280, 280,
+ 280, 280, 44, 526, 542, 280, 2088, 542, 32, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 45, 2396, 46, 480, 45, 45, 46, 46, 480,
+ 45, 45, 46, 46, 487, 45, 504, 46, 45, 487,
+ 46, 504, 991, 991, 45, 45, 46, 46, 47, 47,
+ 47, 47, 511, 47, 47, 1096, 521, 511, 47, 47,
+ 47, 521, 550, 47, 1096, 550, 47, 48, 48, 48,
+ 48, 51, 48, 48, 976, 51, 51, 48, 48, 48,
+ 51, 580, 48, 539, 580, 48, 539, 52, 51, 539,
+ 976, 52, 52, 55, 580, 51, 52, 55, 55, 45,
+ 586, 46, 55, 55, 52, 263, 263, 263, 263, 544,
+
+ 55, 52, 588, 1986, 544, 56, 553, 55, 55, 56,
+ 56, 553, 562, 263, 56, 56, 1986, 562, 85, 85,
+ 568, 85, 56, 85, 85, 568, 1085, 1085, 85, 56,
+ 56, 85, 86, 86, 1141, 86, 85, 86, 86, 51,
+ 586, 712, 86, 1141, 712, 86, 284, 284, 284, 284,
+ 86, 733, 588, 284, 733, 52, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 57, 577, 1151, 58, 57, 57, 577, 58, 58, 57,
+ 1152, 1151, 58, 59, 59, 59, 59, 57, 59, 59,
+ 58, 585, 744, 59, 1152, 744, 585, 60, 60, 60,
+ 60, 59, 60, 60, 589, 1398, 1398, 60, 264, 264,
+ 264, 264, 1240, 59, 549, 60, 1240, 549, 603, 57,
+ 549, 57, 58, 603, 58, 590, 264, 60, 61, 61,
+
+ 61, 61, 615, 61, 61, 1408, 1408, 615, 61, 62,
+ 62, 62, 62, 592, 62, 62, 61, 1410, 1410, 62,
+ 63, 63, 63, 63, 589, 63, 63, 62, 61, 623,
+ 63, 73, 59, 59, 623, 73, 73, 2397, 63, 62,
+ 73, 271, 271, 271, 271, 590, 60, 60, 73, 1445,
+ 63, 64, 64, 64, 64, 75, 64, 64, 271, 75,
+ 75, 64, 2398, 592, 75, 271, 634, 75, 591, 64,
+ 76, 634, 75, 903, 76, 76, 903, 61, 61, 76,
+ 591, 64, 76, 1445, 1216, 591, 91, 76, 62, 62,
+ 91, 91, 1216, 642, 1216, 91, 91, 91, 642, 63,
+
+ 63, 2414, 92, 91, 652, 75, 92, 92, 2415, 652,
+ 73, 92, 92, 92, 387, 387, 387, 387, 591, 92,
+ 76, 387, 393, 393, 393, 393, 466, 466, 466, 466,
+ 64, 64, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
+
+ 69, 69, 671, 69, 684, 69, 69, 671, 686, 684,
+ 69, 70, 70, 686, 70, 691, 70, 70, 69, 700,
+ 691, 70, 71, 71, 700, 71, 709, 71, 71, 70,
+ 69, 709, 71, 74, 722, 1570, 2416, 74, 74, 722,
+ 71, 70, 74, 734, 272, 272, 272, 272, 734, 1570,
+ 74, 69, 71, 72, 72, 1447, 72, 1334, 72, 72,
+ 77, 272, 70, 72, 77, 77, 1334, 1511, 272, 77,
+ 771, 72, 77, 71, 2172, 771, 791, 77, 2172, 69,
+ 69, 791, 1511, 72, 281, 281, 281, 281, 78, 1447,
+ 70, 70, 78, 78, 79, 1783, 1783, 78, 79, 79,
+
+ 78, 71, 71, 79, 72, 78, 977, 2417, 281, 977,
+ 77, 79, 74, 358, 358, 358, 358, 80, 79, 977,
+ 87, 80, 80, 79, 87, 87, 80, 1104, 1123, 87,
+ 1104, 1123, 72, 72, 80, 81, 81, 87, 78, 81,
+ 81, 80, 803, 748, 81, 748, 80, 803, 1337, 82,
+ 82, 88, 81, 82, 82, 88, 88, 1337, 82, 783,
+ 88, 1417, 783, 281, 783, 749, 82, 749, 88, 89,
+ 87, 90, 79, 89, 89, 90, 90, 2418, 89, 443,
+ 90, 1040, 443, 1419, 1040, 81, 89, 748, 90, 99,
+ 2419, 814, 358, 99, 99, 80, 814, 2424, 99, 82,
+
+ 1040, 88, 93, 93, 93, 93, 99, 93, 93, 749,
+ 2425, 1417, 93, 94, 94, 94, 94, 95, 94, 94,
+ 93, 95, 95, 94, 823, 1791, 95, 835, 93, 823,
+ 93, 94, 835, 1419, 95, 1791, 443, 443, 99, 94,
+ 99, 94, 95, 1063, 95, 2426, 1063, 89, 89, 90,
+ 90, 96, 2427, 97, 844, 96, 96, 97, 97, 844,
+ 96, 857, 97, 97, 97, 403, 857, 1727, 96, 1063,
+ 97, 488, 488, 488, 488, 98, 96, 867, 96, 98,
+ 98, 1727, 867, 878, 98, 98, 98, 1420, 878, 100,
+ 488, 101, 98, 100, 100, 101, 101, 1503, 100, 1503,
+
+ 101, 283, 283, 283, 283, 102, 100, 121, 101, 102,
+ 102, 121, 121, 2428, 102, 403, 121, 374, 374, 374,
+ 374, 403, 102, 884, 121, 283, 403, 403, 884, 403,
+ 1168, 894, 121, 1168, 900, 374, 894, 1420, 100, 900,
+ 100, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+
+ 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,
+ 103, 103, 103, 103, 103, 105, 1220, 106, 912, 105,
+ 105, 106, 106, 912, 105, 1220, 106, 459, 459, 459,
+ 459, 1220, 105, 2429, 106, 107, 107, 107, 107, 921,
+ 107, 107, 459, 2430, 921, 107, 108, 108, 108, 108,
+ 931, 108, 108, 107, 2431, 931, 108, 109, 109, 109,
+ 109, 941, 109, 109, 108, 2432, 941, 109, 123, 1388,
+ 109, 951, 123, 123, 109, 109, 951, 123, 1388, 958,
+ 294, 294, 294, 294, 958, 123, 2433, 109, 1506, 966,
+
+ 1506, 294, 107, 105, 966, 106, 110, 110, 110, 110,
+ 975, 110, 110, 108, 294, 975, 110, 122, 109, 110,
+ 984, 122, 122, 110, 110, 984, 122, 905, 124, 1777,
+ 905, 2434, 124, 124, 122, 131, 110, 124, 905, 131,
+ 131, 1506, 122, 1777, 131, 124, 436, 436, 436, 436,
+ 990, 996, 131, 436, 2435, 990, 996, 110, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+
+ 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+ 111, 111, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+
+ 115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 119, 1471, 120, 1006, 119, 119,
+
+ 120, 120, 1006, 119, 1471, 120, 375, 375, 375, 375,
+ 127, 119, 128, 120, 127, 127, 128, 128, 1019, 127,
+ 1031, 128, 2313, 1019, 375, 1031, 132, 127, 135, 128,
+ 132, 132, 135, 135, 127, 132, 128, 135, 1178, 135,
+ 2313, 1178, 136, 132, 1039, 135, 136, 136, 119, 1039,
+ 120, 136, 1050, 136, 119, 1195, 120, 1050, 1195, 136,
+ 516, 516, 516, 516, 119, 119, 120, 120, 517, 517,
+ 517, 517, 119, 119, 120, 120, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+ 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+
+ 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+
+ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 139, 1055, 2436, 140, 139, 139, 1055, 140,
+ 140, 139, 1068, 139, 140, 1057, 140, 1068, 1057, 139,
+ 141, 1421, 140, 142, 141, 141, 1061, 142, 142, 141,
+ 143, 1069, 142, 1057, 143, 143, 1069, 141, 1061, 143,
+ 142, 143, 2437, 1061, 2439, 141, 145, 143, 142, 144,
+ 145, 145, 146, 144, 144, 145, 146, 146, 144, 1074,
+ 144, 146, 1075, 145, 1074, 2440, 144, 1075, 161, 146,
+ 145, 1421, 161, 161, 1083, 2441, 146, 161, 161, 1083,
+ 323, 323, 323, 323, 143, 161, 143, 1095, 1214, 162,
+
+ 143, 1214, 1095, 162, 162, 2442, 143, 1196, 162, 162,
+ 143, 143, 1196, 144, 323, 144, 162, 2443, 323, 144,
+ 515, 515, 515, 515, 1222, 144, 515, 1222, 2444, 144,
+ 144, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 149, 149, 149, 149, 151,
+
+ 1968, 1699, 1086, 151, 151, 1086, 1154, 2445, 151, 152,
+ 151, 2315, 1154, 152, 152, 1086, 151, 2446, 152, 163,
+ 152, 1154, 1018, 163, 163, 1018, 152, 1699, 163, 1018,
+ 163, 1018, 151, 1752, 1968, 1018, 163, 381, 381, 381,
+ 381, 1752, 152, 151, 151, 2315, 151, 524, 524, 524,
+ 524, 1831, 1831, 152, 152, 381, 152, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+
+ 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 155, 155, 155, 155, 157, 157, 157, 157, 173,
+ 157, 157, 2447, 173, 173, 157, 157, 157, 173, 173,
+ 157, 157, 1202, 157, 1204, 1357, 173, 1202, 1357, 1204,
+ 157, 157, 164, 157, 157, 157, 164, 164, 1779, 1157,
+ 2034, 164, 167, 164, 2448, 1157, 167, 167, 2034, 164,
+ 1090, 167, 1779, 1090, 1157, 157, 167, 157, 168, 167,
+ 174, 1090, 168, 168, 174, 174, 167, 168, 1209, 174,
+ 174, 2449, 168, 1209, 1209, 168, 1209, 174, 460, 460,
+
+ 460, 460, 168, 2450, 157, 157, 158, 158, 158, 158,
+ 181, 158, 158, 460, 181, 181, 158, 158, 158, 181,
+ 1384, 158, 158, 1384, 158, 1142, 1384, 181, 1142, 1142,
+ 1569, 158, 158, 181, 158, 158, 158, 169, 2451, 1569,
+ 170, 169, 169, 1142, 170, 170, 169, 169, 169, 170,
+ 170, 170, 1091, 2326, 169, 1091, 158, 170, 158, 2452,
+ 1227, 2326, 169, 1091, 169, 170, 195, 170, 1227, 1392,
+ 195, 195, 2453, 1227, 1392, 195, 195, 195, 598, 598,
+ 598, 598, 2454, 195, 2455, 158, 158, 159, 159, 159,
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+ 159, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 171, 175,
+ 1400, 2457, 176, 175, 175, 1400, 176, 176, 175, 175,
+ 175, 176, 176, 176, 1394, 1479, 175, 1394, 1479, 176,
+ 177, 177, 177, 177, 182, 177, 177, 1807, 182, 182,
+ 177, 177, 177, 182, 178, 178, 178, 178, 177, 178,
+ 178, 182, 2458, 1807, 178, 178, 178, 182, 175, 1835,
+ 1835, 176, 178, 179, 179, 179, 179, 223, 179, 179,
+
+ 1467, 223, 223, 179, 179, 1467, 223, 180, 180, 180,
+ 180, 179, 180, 180, 223, 2204, 2204, 180, 180, 179,
+ 1093, 179, 223, 1093, 223, 180, 2459, 534, 534, 534,
+ 534, 1093, 2461, 180, 534, 180, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+ 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+ 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+ 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+ 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+ 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+ 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+ 185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
+
+ 185, 185, 185, 185, 187, 2462, 188, 1469, 187, 187,
+ 188, 188, 1469, 187, 1492, 188, 187, 1492, 188, 1726,
+ 189, 187, 190, 188, 189, 189, 190, 190, 1726, 189,
+ 1501, 190, 189, 1501, 190, 1776, 191, 189, 192, 190,
+ 191, 191, 192, 192, 1776, 191, 1393, 192, 191, 1393,
+ 192, 2463, 1393, 191, 187, 192, 188, 193, 1778, 194,
+ 1568, 193, 193, 194, 194, 1568, 193, 1778, 194, 193,
+ 189, 194, 190, 196, 193, 1695, 194, 196, 196, 2464,
+ 1695, 2466, 196, 196, 196, 2467, 191, 197, 192, 198,
+ 196, 197, 197, 198, 198, 1507, 197, 1507, 198, 295,
+
+ 295, 295, 295, 1642, 197, 1954, 198, 193, 199, 194,
+ 295, 200, 199, 199, 1954, 200, 200, 199, 199, 199,
+ 200, 200, 200, 295, 1412, 199, 201, 1412, 200, 202,
+ 201, 201, 1957, 202, 202, 201, 1507, 1412, 202, 203,
+ 203, 1957, 203, 201, 203, 203, 202, 1714, 1642, 203,
+ 203, 203, 1714, 1600, 245, 295, 1600, 203, 245, 245,
+ 2000, 2471, 2000, 245, 1600, 197, 197, 198, 198, 204,
+ 204, 245, 204, 215, 204, 204, 1642, 215, 215, 204,
+ 204, 204, 215, 209, 209, 209, 209, 204, 209, 209,
+ 215, 2000, 1803, 209, 209, 209, 1682, 1803, 209, 1682,
+
+ 1073, 209, 1955, 1073, 201, 201, 2472, 202, 202, 205,
+ 205, 205, 205, 1073, 205, 205, 1955, 1159, 1073, 205,
+ 205, 205, 215, 1159, 215, 1635, 1073, 205, 210, 210,
+ 210, 210, 1159, 210, 210, 205, 1958, 205, 210, 210,
+ 210, 2478, 1207, 210, 211, 1207, 210, 212, 211, 211,
+ 1958, 212, 212, 211, 1533, 211, 212, 1533, 212, 1533,
+ 1405, 211, 221, 1405, 212, 1159, 221, 221, 1635, 2211,
+ 2211, 221, 221, 221, 270, 270, 270, 270, 1405, 221,
+ 1795, 2481, 205, 206, 206, 206, 206, 1317, 206, 206,
+ 1317, 270, 1795, 206, 206, 206, 1795, 1635, 270, 1207,
+
+ 1207, 206, 213, 213, 213, 213, 2399, 213, 213, 206,
+ 2504, 206, 213, 213, 213, 1678, 1604, 213, 1678, 1604,
+ 213, 214, 214, 214, 214, 1338, 214, 214, 1338, 1338,
+ 2399, 214, 214, 214, 1678, 1785, 214, 222, 1785, 214,
+ 1604, 222, 222, 1338, 1317, 1317, 222, 222, 222, 599,
+ 599, 599, 599, 270, 222, 2505, 206, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+
+ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
+ 207, 216, 2330, 217, 2330, 216, 216, 217, 217, 1999,
+ 216, 1999, 217, 383, 383, 383, 383, 218, 216, 219,
+ 217, 218, 218, 219, 219, 1722, 218, 1627, 219, 1389,
+ 1627, 383, 1389, 1389, 218, 1318, 219, 220, 1318, 224,
+ 1627, 220, 220, 224, 224, 2529, 220, 1389, 224, 2530,
+ 216, 2330, 216, 217, 220, 2544, 224, 1999, 274, 274,
+
+ 274, 274, 274, 1704, 224, 274, 224, 218, 225, 219,
+ 1722, 1472, 225, 225, 1472, 1472, 2545, 225, 226, 226,
+ 225, 226, 274, 226, 226, 225, 2546, 220, 226, 1472,
+ 227, 226, 1318, 1318, 227, 227, 226, 225, 1722, 227,
+ 296, 296, 296, 296, 2031, 228, 1704, 227, 226, 228,
+ 228, 296, 1687, 2031, 228, 1687, 229, 2547, 225, 227,
+ 229, 229, 228, 1693, 296, 229, 1693, 230, 2548, 226,
+ 1687, 230, 230, 229, 228, 1704, 230, 231, 2549, 274,
+ 227, 231, 231, 232, 230, 229, 231, 232, 232, 1693,
+ 2550, 2032, 232, 243, 231, 228, 230, 243, 243, 296,
+
+ 232, 2087, 243, 244, 243, 2032, 229, 244, 244, 1796,
+ 243, 1796, 244, 1688, 244, 2087, 1688, 230, 246, 1796,
+ 244, 247, 246, 246, 2103, 247, 247, 246, 231, 2456,
+ 247, 1688, 248, 2551, 232, 246, 248, 248, 247, 2083,
+ 2552, 248, 2083, 2147, 2456, 231, 2554, 2555, 2147, 248,
+ 2103, 232, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 233, 233, 233, 233, 235, 235, 235, 235,
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
+ 237, 2556, 238, 1720, 237, 237, 238, 238, 2558, 237,
+ 237, 238, 238, 1720, 2380, 249, 249, 237, 249, 238,
+ 249, 249, 2380, 1681, 2562, 249, 1681, 1720, 249, 278,
+ 278, 278, 278, 249, 385, 385, 385, 385, 2104, 1720,
+ 278, 249, 1681, 2115, 278, 249, 278, 394, 394, 394,
+ 394, 2479, 2115, 278, 278, 278, 2479, 2563, 385, 645,
+ 645, 645, 645, 2564, 2104, 394, 249, 237, 2567, 238,
+ 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+
+ 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 241, 241, 2400, 241, 2053, 241,
+ 241, 2053, 2568, 2575, 241, 242, 242, 2576, 242, 2577,
+ 242, 242, 241, 2579, 2580, 242, 503, 503, 503, 503,
+
+ 2400, 241, 2053, 242, 250, 250, 2581, 250, 503, 250,
+ 250, 2582, 242, 1715, 250, 251, 1715, 250, 2583, 251,
+ 251, 251, 250, 2584, 251, 2585, 1715, 251, 2586, 2589,
+ 250, 241, 251, 2591, 250, 359, 359, 359, 359, 2123,
+ 251, 2210, 242, 1723, 251, 2123, 1723, 241, 1662, 241,
+ 2210, 1662, 359, 241, 2123, 250, 1723, 1662, 242, 359,
+ 242, 1662, 2308, 2593, 242, 251, 251, 252, 252, 2402,
+ 252, 2308, 252, 252, 252, 2594, 1744, 252, 2402, 1744,
+ 252, 275, 275, 275, 275, 252, 359, 2123, 275, 351,
+ 351, 351, 351, 252, 1744, 2460, 351, 252, 275, 285,
+
+ 285, 285, 285, 285, 2460, 2596, 285, 386, 386, 386,
+ 386, 2597, 2599, 392, 392, 392, 392, 2600, 252, 252,
+ 392, 1917, 392, 285, 1917, 2601, 392, 399, 399, 399,
+ 399, 386, 404, 404, 404, 404, 2587, 392, 2587, 1917,
+ 2602, 409, 409, 409, 409, 399, 434, 434, 434, 434,
+ 1664, 2101, 351, 1664, 2101, 2603, 404, 2590, 404, 1664,
+ 2590, 2604, 275, 1664, 2101, 409, 392, 409, 351, 2605,
+ 434, 646, 646, 646, 646, 713, 713, 713, 713, 2606,
+ 285, 352, 352, 352, 352, 352, 352, 352, 352, 352,
+ 352, 352, 352, 352, 352, 352, 352, 409, 352, 352,
+
+ 352, 352, 352, 352, 352, 352, 352, 352, 352, 352,
+ 352, 352, 352, 352, 352, 352, 352, 352, 352, 352,
+ 352, 352, 352, 352, 352, 352, 352, 352, 352, 352,
+ 352, 352, 352, 352, 352, 352, 352, 352, 352, 352,
+ 352, 352, 352, 352, 352, 352, 352, 352, 352, 352,
+ 352, 352, 352, 352, 352, 352, 352, 352, 352, 352,
+ 352, 2608, 352, 352, 352, 353, 353, 353, 353, 2609,
+ 2610, 2611, 353, 389, 389, 389, 389, 389, 2612, 2614,
+ 389, 405, 405, 405, 405, 408, 408, 408, 408, 1757,
+ 410, 410, 410, 410, 2615, 1757, 2616, 389, 411, 411,
+
+ 411, 411, 2617, 2183, 1757, 405, 2183, 405, 2183, 408,
+ 2102, 408, 2618, 2102, 410, 2619, 410, 412, 412, 412,
+ 412, 2620, 411, 2102, 411, 2621, 2622, 2623, 353, 435,
+ 435, 435, 435, 2294, 2624, 405, 2294, 2363, 2294, 408,
+ 2363, 412, 2363, 412, 353, 384, 384, 384, 384, 1757,
+ 2625, 384, 2626, 435, 389, 410, 2627, 411, 410, 2628,
+ 2631, 411, 413, 413, 413, 413, 2331, 2633, 2331, 384,
+ 658, 658, 658, 658, 412, 384, 2635, 2636, 2637, 440,
+ 440, 440, 440, 2638, 412, 440, 413, 658, 413, 384,
+ 2405, 2639, 412, 2641, 412, 384, 2405, 440, 2629, 384,
+
+ 384, 2629, 384, 384, 384, 2405, 2642, 2643, 384, 384,
+ 384, 384, 384, 2644, 384, 2331, 384, 384, 384, 384,
+ 384, 414, 414, 414, 414, 415, 415, 415, 415, 416,
+ 416, 416, 416, 413, 417, 417, 417, 417, 2640, 418,
+ 418, 418, 418, 2381, 2645, 414, 2381, 414, 2646, 415,
+ 2381, 415, 2381, 416, 1035, 416, 2381, 1035, 417, 2647,
+ 417, 2648, 2640, 418, 2654, 418, 2655, 419, 419, 419,
+ 419, 441, 441, 441, 441, 420, 420, 420, 420, 1677,
+ 414, 1035, 1677, 416, 421, 421, 421, 421, 2588, 441,
+ 2588, 419, 415, 419, 2657, 2660, 2661, 417, 418, 420,
+
+ 2662, 420, 422, 422, 422, 422, 1677, 418, 421, 2663,
+ 421, 1035, 2665, 418, 423, 423, 423, 423, 424, 424,
+ 424, 424, 419, 2666, 2667, 2668, 422, 2588, 422, 1035,
+ 2664, 425, 425, 425, 425, 2669, 1677, 2671, 423, 2664,
+ 423, 2673, 424, 421, 424, 2630, 420, 2676, 2630, 420,
+ 439, 439, 439, 439, 1677, 425, 2630, 425, 2677, 437,
+ 437, 437, 437, 437, 2678, 422, 437, 2679, 2680, 442,
+ 442, 442, 442, 423, 439, 422, 439, 446, 446, 446,
+ 446, 2681, 2682, 437, 2683, 424, 425, 442, 2681, 2684,
+ 424, 2685, 423, 2686, 425, 446, 2687, 2688, 2689, 425,
+
+ 457, 457, 457, 457, 530, 530, 530, 530, 531, 531,
+ 531, 531, 532, 532, 532, 532, 2690, 2691, 457, 2692,
+ 2693, 530, 2694, 2695, 2696, 531, 2699, 2698, 530, 2700,
+ 2701, 2702, 531, 2705, 2707, 2708, 532, 2729, 2730, 2752,
+ 437, 483, 483, 483, 483, 533, 533, 533, 533, 535,
+ 535, 535, 535, 535, 2753, 2768, 535, 537, 537, 537,
+ 537, 2769, 2771, 531, 548, 548, 548, 548, 483, 533,
+ 2772, 2773, 2775, 535, 555, 555, 555, 555, 2776, 2778,
+ 2784, 537, 548, 637, 637, 637, 637, 638, 638, 638,
+ 638, 2785, 555, 2789, 2790, 2791, 483, 2698, 483, 660,
+
+ 660, 660, 660, 661, 661, 661, 661, 2794, 483, 483,
+ 2795, 2796, 483, 483, 483, 2797, 483, 662, 662, 662,
+ 662, 694, 694, 694, 694, 699, 699, 699, 699, 2799,
+ 535, 701, 701, 701, 701, 725, 725, 725, 725, 694,
+ 637, 2801, 2803, 699, 638, 727, 727, 727, 727, 701,
+ 660, 2804, 725, 762, 762, 762, 762, 2805, 661, 763,
+ 763, 763, 763, 769, 769, 769, 769, 1828, 2807, 727,
+ 1828, 762, 662, 772, 772, 772, 772, 763, 2800, 2808,
+ 2800, 769, 779, 779, 779, 779, 2809, 2806, 2810, 779,
+ 2806, 772, 780, 780, 780, 780, 2811, 1828, 2812, 780,
+
+ 781, 781, 781, 781, 2813, 2814, 2815, 781, 782, 782,
+ 782, 782, 2816, 785, 785, 785, 785, 2817, 1828, 2800,
+ 785, 782, 785, 2818, 2819, 2820, 785, 786, 786, 786,
+ 786, 2821, 2825, 2827, 786, 1248, 786, 2828, 1248, 1248,
+ 786, 787, 787, 787, 787, 2829, 2822, 2830, 787, 2822,
+ 787, 2831, 2832, 1248, 787, 788, 788, 788, 788, 2834,
+ 2802, 2835, 788, 2802, 788, 1248, 2836, 2802, 788, 790,
+ 790, 790, 790, 792, 792, 792, 792, 794, 794, 794,
+ 794, 805, 805, 805, 805, 2837, 1248, 790, 2838, 2839,
+ 2840, 792, 805, 807, 807, 807, 807, 808, 808, 808,
+
+ 808, 809, 809, 809, 809, 805, 2843, 2847, 809, 805,
+ 2852, 812, 812, 812, 812, 812, 2853, 807, 812, 2854,
+ 2855, 808, 816, 816, 816, 816, 2856, 794, 822, 822,
+ 822, 822, 2857, 2858, 2859, 812, 825, 825, 825, 825,
+ 822, 828, 828, 828, 828, 2860, 816, 825, 829, 829,
+ 829, 829, 834, 834, 834, 834, 914, 914, 914, 914,
+ 2861, 825, 915, 915, 915, 915, 940, 940, 940, 940,
+ 834, 2862, 943, 943, 943, 943, 2864, 940, 944, 944,
+ 944, 944, 950, 950, 950, 950, 825, 943, 2866, 2868,
+ 2869, 940, 812, 944, 978, 978, 978, 978, 2871, 2823,
+
+ 985, 985, 2823, 985, 2873, 985, 2874, 978, 985, 985,
+ 2823, 2876, 978, 2877, 2879, 2880, 940, 2881, 985, 2882,
+ 985, 1000, 1000, 1000, 1000, 2883, 2885, 2888, 1000, 1001,
+ 1001, 1001, 1001, 2889, 2892, 2891, 1001, 1008, 1008, 1008,
+ 1008, 1010, 1010, 1010, 1010, 940, 2893, 2894, 1010, 1008,
+ 2891, 2896, 1008, 1011, 1011, 1011, 1011, 2911, 2912, 2916,
+ 1011, 1013, 1013, 1013, 1013, 1022, 1022, 1022, 1022, 2917,
+ 2921, 1000, 1013, 1023, 1023, 1023, 1023, 1071, 2943, 1001,
+ 1024, 1024, 1024, 1024, 2944, 2945, 2953, 1024, 2954, 1022,
+ 2959, 1027, 1027, 1027, 1027, 1027, 2960, 1023, 1027, 1033,
+
+ 1033, 1033, 1033, 1710, 1071, 1071, 1710, 1071, 2964, 1071,
+ 2965, 2966, 1071, 1071, 2971, 1027, 1710, 1829, 2972, 1072,
+ 1829, 1710, 1071, 1033, 1071, 1072, 1072, 2975, 1072, 1710,
+ 1072, 2976, 2977, 1072, 1072, 1087, 1087, 1087, 1087, 1094,
+ 1094, 1094, 1094, 1072, 2978, 1072, 2979, 1829, 1087, 1100,
+ 1100, 1100, 1100, 1087, 2980, 2981, 2982, 1094, 1101, 1101,
+ 1101, 1101, 1102, 1102, 1102, 1102, 1100, 2984, 1829, 1102,
+ 2987, 2989, 1027, 1100, 2985, 1101, 2983, 2985, 2983, 1102,
+ 2991, 2985, 1101, 1105, 1105, 1105, 1105, 2992, 2993, 2994,
+ 1105, 1106, 1106, 1106, 1106, 2995, 2996, 2997, 1106, 1107,
+
+ 1107, 1107, 1107, 1108, 1108, 1108, 1108, 2998, 2999, 1830,
+ 1107, 2983, 1830, 3000, 1107, 1109, 1109, 1109, 1109, 3001,
+ 2988, 3004, 1109, 2988, 1107, 1107, 3005, 1108, 1100, 1111,
+ 1111, 1111, 1111, 3006, 1112, 1112, 1112, 1112, 3007, 1830,
+ 1111, 1112, 2990, 1102, 1111, 2990, 1111, 1114, 1114, 1114,
+ 1114, 1112, 3008, 1111, 1111, 1111, 1113, 1113, 1113, 1113,
+ 1830, 3009, 3010, 1113, 1114, 1115, 1115, 1115, 1115, 3012,
+ 3014, 3015, 1115, 1113, 1116, 1116, 1116, 1116, 1116, 3016,
+ 3017, 1116, 1117, 1117, 1117, 1117, 1124, 1124, 1124, 1124,
+ 3018, 3021, 3025, 1124, 3026, 3027, 3028, 1117, 1116, 1117,
+
+ 3029, 1120, 1120, 1120, 1120, 3030, 1117, 1117, 1117, 3032,
+ 3033, 3034, 1120, 3035, 3037, 1112, 1120, 3038, 1120, 3039,
+ 3041, 1125, 1125, 1125, 1125, 1120, 1120, 1120, 1125, 3043,
+ 3044, 1126, 1126, 1126, 1126, 3051, 3054, 1113, 1127, 1127,
+ 1127, 1127, 1126, 3057, 3058, 3063, 1126, 1128, 1128, 1128,
+ 1128, 1131, 1131, 1131, 1131, 1116, 1126, 1126, 1132, 1132,
+ 1132, 1132, 1127, 1134, 1134, 1134, 1134, 3064, 3066, 3067,
+ 1134, 1128, 3082, 3053, 3086, 1131, 1135, 1135, 1135, 1135,
+ 3087, 3091, 1132, 1135, 1136, 1136, 1136, 1136, 3053, 1137,
+ 1137, 1137, 1137, 3092, 3093, 1136, 1137, 1139, 1139, 1139,
+
+ 1139, 1140, 1140, 1140, 1140, 3090, 3095, 3115, 1139, 1143,
+ 1143, 1143, 1143, 1143, 3090, 3116, 1143, 1127, 3122, 3123,
+ 3127, 1139, 3128, 1145, 1145, 1145, 1145, 1147, 1147, 1147,
+ 1147, 3129, 3133, 1143, 1145, 3136, 3137, 3138, 1147, 1148,
+ 1148, 1148, 1148, 1149, 1149, 1149, 1149, 1145, 3142, 3143,
+ 1148, 1147, 3145, 3147, 1149, 1165, 1165, 1165, 1165, 1173,
+ 1173, 1173, 1173, 1148, 3150, 3151, 1173, 1149, 1174, 1174,
+ 1174, 1174, 3152, 3153, 3154, 1174, 3155, 3156, 3157, 1165,
+ 1175, 1175, 1175, 1175, 3160, 3158, 3159, 1175, 3158, 3159,
+ 1143, 1176, 1176, 1176, 1176, 3161, 3158, 3162, 1149, 1177,
+
+ 1177, 1177, 1177, 1181, 1181, 1181, 1181, 3164, 1176, 3148,
+ 1181, 1148, 3148, 3165, 3166, 1176, 1177, 1182, 1182, 1182,
+ 1182, 3167, 1173, 1177, 3168, 1185, 1185, 1185, 1185, 3148,
+ 3148, 1174, 1185, 3173, 1182, 3174, 3175, 3177, 1173, 3178,
+ 3180, 1182, 1200, 1200, 1200, 1200, 3181, 1174, 1228, 1228,
+ 1228, 1228, 3182, 3185, 3186, 1228, 3189, 3194, 3197, 1175,
+ 1246, 1246, 1246, 1246, 3198, 1177, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1181, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 3199, 1179, 1179, 1179,
+ 1183, 1183, 1183, 1183, 1184, 1184, 1184, 1184, 1186, 1186,
+ 1186, 1186, 1188, 1188, 1188, 1188, 3201, 1183, 3202, 3203,
+ 3208, 1184, 3221, 3222, 1183, 3226, 3227, 3228, 1184, 1190,
+ 1190, 1190, 1190, 3229, 3246, 3250, 1188, 3252, 1201, 1201,
+ 1201, 1201, 1203, 1203, 1203, 1203, 1190, 1206, 1206, 1206,
+
+ 1206, 3249, 3253, 1190, 3249, 1184, 1201, 3255, 3264, 3268,
+ 1203, 1229, 1229, 1229, 1229, 3269, 1183, 3273, 1229, 3274,
+ 3275, 1206, 1230, 1230, 1230, 1230, 1234, 1234, 1234, 1234,
+ 1190, 3276, 1231, 3270, 3270, 1231, 3270, 1186, 1205, 1205,
+ 1205, 1205, 3277, 1321, 1205, 3278, 1321, 1321, 1230, 3282,
+ 1234, 1231, 1231, 1231, 1231, 1231, 1235, 1235, 1235, 1235,
+ 3283, 1321, 1205, 1235, 1323, 1323, 1323, 1323, 1205, 1256,
+ 1256, 1256, 1256, 1321, 1237, 1237, 1237, 1237, 3281, 1323,
+ 1256, 3281, 1205, 3284, 3271, 3271, 1256, 3271, 1205, 1231,
+ 1231, 3285, 1205, 1205, 1321, 1205, 1205, 1205, 1237, 3286,
+
+ 1237, 1205, 1205, 1205, 1205, 1205, 3287, 1205, 3292, 1205,
+ 1205, 1205, 1205, 1205, 1241, 1241, 1241, 1241, 3293, 3296,
+ 3299, 1241, 3279, 1241, 3301, 3279, 3309, 1241, 1242, 1242,
+ 1242, 1242, 3310, 3279, 3311, 1242, 1522, 1242, 1241, 1522,
+ 1522, 1242, 1243, 1243, 1243, 1243, 1245, 1245, 1245, 1245,
+ 3314, 1243, 1242, 1243, 1522, 1243, 3315, 3328, 1245, 1245,
+ 1247, 3332, 1832, 1247, 1247, 1832, 1522, 1241, 1833, 3333,
+ 1245, 1833, 1245, 1247, 3334, 1251, 1251, 1251, 1251, 1251,
+ 1832, 1242, 1251, 1257, 1257, 1257, 1257, 1522, 3335, 3342,
+ 1247, 3343, 1832, 3358, 1257, 1243, 3359, 3360, 1833, 1251,
+
+ 1257, 1258, 1258, 1258, 1258, 1259, 1259, 1259, 1259, 3361,
+ 3364, 1247, 1258, 1832, 3365, 3371, 1259, 3365, 1258, 1833,
+ 3372, 3373, 1259, 1260, 1260, 1260, 1260, 1261, 1261, 1261,
+ 1261, 3374, 3366, 3280, 1260, 3366, 3280, 3375, 1261, 3378,
+ 1260, 3379, 3380, 3376, 1261, 3280, 3376, 3381, 1257, 1262,
+ 1262, 1262, 1262, 3382, 3386, 3376, 1251, 1263, 1263, 1263,
+ 1263, 1265, 1265, 1265, 1265, 3392, 3393, 1258, 1258, 1267,
+ 1267, 1267, 1267, 1262, 1259, 1262, 1268, 1268, 1268, 1268,
+ 3398, 1263, 3399, 1263, 3403, 1265, 1261, 1265, 1269, 1269,
+ 1269, 1269, 3367, 3367, 1260, 3367, 3404, 1260, 3369, 3369,
+
+ 1268, 3369, 1268, 1265, 1265, 3405, 3406, 1265, 1270, 1270,
+ 1270, 1270, 1269, 3412, 1269, 1271, 1271, 1271, 1271, 3413,
+ 1272, 1272, 1272, 1272, 1273, 1273, 1273, 1273, 1267, 3414,
+ 3416, 3417, 1270, 3434, 1270, 1274, 1274, 1274, 1274, 1271,
+ 3435, 1271, 3436, 3439, 1272, 1268, 1272, 3440, 1273, 3441,
+ 1273, 1275, 1275, 1275, 1275, 1276, 1276, 1276, 1276, 1274,
+ 1269, 1274, 3442, 1270, 1277, 1277, 1277, 1277, 1278, 1278,
+ 1278, 1278, 1271, 3443, 3444, 1275, 3448, 1275, 3451, 1276,
+ 1272, 1276, 1271, 1279, 1279, 1279, 1279, 3452, 1277, 3453,
+ 1277, 3456, 1278, 3457, 1278, 3458, 1273, 1274, 1280, 1280,
+
+ 1280, 1280, 1281, 1281, 1281, 1281, 3463, 1279, 3464, 1279,
+ 1282, 1282, 1282, 1282, 1276, 1283, 1283, 1283, 1283, 3465,
+ 3437, 1277, 1280, 3437, 1280, 1275, 1281, 3437, 1281, 3480,
+ 3485, 1278, 3486, 1277, 1282, 3438, 1282, 1277, 3438, 1283,
+ 3489, 1283, 3438, 1284, 1284, 1284, 1284, 3490, 3491, 3493,
+ 1279, 1285, 1285, 1285, 1285, 1280, 1286, 1286, 1286, 1286,
+ 1281, 1280, 3494, 1280, 3495, 3481, 1282, 1284, 3481, 1284,
+ 3500, 1280, 3481, 3501, 3510, 1285, 2010, 1285, 2013, 2010,
+ 1286, 2013, 1286, 1287, 1287, 1287, 1287, 3515, 1283, 1288,
+ 1288, 1288, 1288, 1289, 1289, 1289, 1289, 1290, 1290, 1290,
+
+ 1290, 1284, 1291, 1291, 1291, 1291, 2010, 1287, 2013, 1287,
+ 3516, 3483, 3519, 1288, 3483, 1288, 3520, 1289, 3483, 1289,
+ 3522, 1290, 1286, 1290, 1285, 3523, 1291, 2010, 1291, 2013,
+ 1292, 1292, 1292, 1292, 3527, 1293, 1293, 1293, 1293, 3530,
+ 1294, 1294, 1294, 1294, 3531, 1288, 1287, 1304, 1304, 1304,
+ 1304, 1287, 3535, 1289, 1292, 3539, 1292, 1291, 1290, 1293,
+ 3543, 1293, 3562, 1289, 1294, 3563, 1294, 1295, 1295, 1295,
+ 1295, 1304, 3566, 1291, 1296, 1296, 1296, 1296, 2387, 2385,
+ 2384, 1297, 1297, 1297, 1297, 1298, 1298, 1298, 1298, 3757,
+ 2383, 1295, 2382, 1295, 3768, 2377, 1292, 3757, 1296, 2376,
+
+ 1296, 3769, 3768, 1294, 1293, 1297, 2375, 1297, 3769, 1298,
+ 3770, 1298, 1306, 1306, 1306, 1306, 3769, 3773, 3770, 1306,
+ 1307, 1307, 1307, 1307, 2374, 3773, 2373, 1307, 2371, 2370,
+ 1295, 1308, 1308, 1308, 1308, 1309, 1309, 1309, 1309, 1296,
+ 2369, 3775, 1309, 1311, 1311, 1311, 1311, 2366, 1902, 3775,
+ 1298, 1902, 1297, 1313, 1313, 1313, 1313, 1308, 1312, 1312,
+ 1312, 1312, 1312, 1834, 2365, 1312, 1834, 1311, 2360, 1311,
+ 1314, 1314, 1314, 1314, 1902, 2357, 1834, 1313, 1902, 1313,
+ 3777, 2354, 1312, 1316, 1316, 1316, 1316, 1320, 3777, 1316,
+ 1320, 1320, 2351, 1834, 1314, 2347, 1314, 2344, 2343, 1902,
+
+ 1320, 1316, 1324, 1324, 1324, 1324, 1325, 1325, 1325, 1325,
+ 1327, 1327, 1327, 1327, 1834, 2337, 2336, 1320, 1339, 1339,
+ 1339, 1339, 1340, 1340, 1340, 1340, 2335, 2334, 3780, 1327,
+ 2332, 2328, 1351, 1351, 1351, 1351, 3780, 1339, 1320, 1312,
+ 1326, 1326, 1326, 1326, 1351, 1352, 1352, 1352, 1352, 1355,
+ 1355, 1355, 1355, 2327, 3795, 1355, 1352, 1356, 1356, 1356,
+ 1356, 1359, 3795, 2203, 1359, 2325, 2203, 1326, 2324, 2322,
+ 2319, 1352, 1361, 1361, 1361, 1361, 1362, 1362, 1362, 1362,
+ 1359, 1359, 1359, 1359, 1359, 1365, 1365, 1365, 1365, 1369,
+ 1369, 1369, 1369, 2203, 2318, 1326, 1369, 1326, 2314, 1367,
+
+ 1367, 1367, 1367, 1368, 1368, 1368, 1368, 1326, 1326, 2312,
+ 3774, 1326, 1326, 1326, 2203, 1326, 1367, 3774, 3797, 2311,
+ 1368, 2310, 2309, 1367, 2307, 3774, 3797, 1368, 1370, 1370,
+ 1370, 1370, 1372, 1372, 1372, 1372, 1373, 1373, 1373, 1373,
+ 1375, 1375, 1375, 1375, 3776, 1370, 3802, 1375, 2306, 1372,
+ 3778, 3776, 1370, 2303, 3802, 2298, 1372, 3778, 1365, 3776,
+ 1373, 1376, 1376, 1376, 1376, 3778, 3814, 3817, 1376, 1378,
+ 1378, 1378, 1378, 2295, 3814, 3817, 1378, 1380, 1380, 1380,
+ 1380, 1381, 1381, 1381, 1381, 1381, 3782, 3787, 1381, 1382,
+ 1382, 1382, 1382, 2292, 2291, 2288, 1385, 3796, 1372, 1385,
+
+ 2287, 1380, 3782, 3787, 3796, 1381, 1387, 1387, 1387, 1387,
+ 3782, 3787, 3796, 1382, 2286, 1385, 1385, 1385, 1385, 1385,
+ 1391, 1391, 1391, 1391, 1399, 1399, 1399, 1399, 1423, 1423,
+ 1423, 1423, 1434, 1434, 1434, 1434, 2285, 2207, 1391, 2283,
+ 2207, 2282, 1399, 1438, 1438, 1438, 1438, 1448, 1448, 1448,
+ 1448, 1449, 1449, 1449, 1449, 2281, 1450, 1450, 1450, 1450,
+ 2279, 2278, 1381, 1450, 1448, 2277, 2276, 2207, 1449, 1450,
+ 1451, 1451, 1451, 1451, 1452, 1452, 1452, 1452, 1453, 1453,
+ 1453, 1453, 1454, 1454, 1454, 1454, 3819, 1451, 2207, 1434,
+ 1455, 1455, 1455, 1455, 3819, 2274, 2273, 1455, 1456, 1456,
+
+ 1456, 1456, 1468, 1468, 1468, 1468, 1480, 1480, 1480, 1480,
+ 1485, 1485, 1485, 1485, 2270, 3798, 3815, 1468, 1486, 1486,
+ 1486, 1486, 3798, 3815, 3821, 1452, 2269, 2214, 2213, 1453,
+ 3798, 3815, 3821, 1454, 1485, 1486, 1488, 1488, 1488, 1488,
+ 1489, 1489, 1489, 1489, 1519, 1519, 1519, 1519, 1521, 2206,
+ 2200, 1521, 1521, 1456, 2197, 1527, 1527, 1527, 1527, 2188,
+ 2185, 1521, 1527, 3823, 1489, 1528, 1528, 1528, 1528, 3826,
+ 2184, 3823, 1528, 1529, 1529, 1529, 1529, 3826, 1521, 1530,
+ 1530, 1530, 1530, 2182, 2181, 1480, 1529, 1532, 1532, 1532,
+ 1532, 3824, 1530, 2180, 1535, 1535, 1535, 1535, 3824, 1521,
+
+ 1532, 1535, 3788, 1535, 3828, 2179, 3824, 1535, 1536, 1536,
+ 1536, 1536, 3828, 3829, 2178, 1536, 2177, 1536, 3788, 3831,
+ 3829, 1536, 1537, 1537, 1537, 1537, 3788, 3831, 3829, 1537,
+ 2176, 1537, 2175, 2174, 2173, 1537, 1538, 1538, 1538, 1538,
+ 1539, 1539, 1539, 1539, 1540, 1540, 1540, 1540, 1542, 1542,
+ 1542, 1542, 2171, 1543, 1543, 1543, 1543, 2170, 3832, 1542,
+ 1543, 1545, 1545, 1545, 1545, 3832, 1543, 1547, 1547, 1547,
+ 1547, 3834, 1542, 3832, 1547, 1548, 1548, 1548, 1548, 3834,
+ 3837, 3839, 1548, 2169, 3840, 1545, 1538, 2168, 3837, 3839,
+ 1539, 3840, 3841, 3843, 1540, 1550, 1550, 1550, 1550, 3840,
+
+ 3841, 3843, 1550, 1552, 1552, 1552, 1552, 1553, 1553, 1553,
+ 1553, 1553, 2167, 2166, 1553, 1554, 1554, 1554, 1554, 2165,
+ 1555, 1555, 1555, 1555, 2164, 2163, 2162, 1552, 2161, 3856,
+ 3858, 1553, 1555, 1556, 1556, 1556, 1556, 3856, 3858, 1554,
+ 1557, 1557, 1557, 1557, 1556, 1564, 1564, 1564, 1564, 2160,
+ 2159, 1557, 1566, 1566, 1566, 1566, 1567, 1567, 1567, 1567,
+ 1587, 1587, 1587, 1587, 2158, 1557, 1592, 1592, 1592, 1592,
+ 1595, 1595, 1595, 1595, 1567, 1598, 1598, 1598, 1598, 1599,
+ 3842, 3870, 1599, 1602, 1602, 1602, 1602, 3842, 1553, 3870,
+ 1557, 1608, 1608, 1608, 1608, 3842, 2157, 2156, 1599, 1599,
+
+ 1599, 1599, 1599, 1610, 1610, 1610, 1610, 1614, 1614, 1614,
+ 1614, 2155, 3844, 3879, 1610, 1615, 1615, 1615, 1615, 3844,
+ 2154, 3879, 1614, 1616, 1616, 1616, 1616, 3844, 1610, 1628,
+ 1628, 1628, 1628, 1629, 1629, 1629, 1629, 1644, 1644, 1644,
+ 1644, 3883, 1628, 3897, 1644, 1645, 1645, 1645, 1645, 3883,
+ 2153, 3897, 1645, 1610, 1646, 1646, 1646, 1646, 1648, 1648,
+ 1648, 1648, 1649, 1649, 1649, 1649, 1646, 3906, 3928, 1646,
+ 1648, 2152, 2151, 1648, 1649, 3906, 3928, 1649, 1650, 1650,
+ 1650, 1650, 1610, 1654, 1654, 1654, 1654, 1644, 1652, 1652,
+ 1652, 1652, 3910, 2150, 3857, 1645, 1657, 1657, 1657, 1657,
+
+ 1652, 3857, 3933, 1652, 1655, 1655, 1655, 1655, 3910, 3857,
+ 3933, 1655, 1656, 1656, 1656, 1656, 3910, 2149, 2148, 1656,
+ 1658, 1658, 1658, 1658, 1659, 1659, 1659, 1659, 2146, 2145,
+ 2144, 1658, 2141, 2140, 2137, 1659, 1661, 1661, 1661, 1661,
+ 1667, 1667, 1667, 1667, 2136, 3859, 3859, 1661, 1669, 1669,
+ 1669, 1669, 3859, 2135, 3872, 1669, 1670, 1670, 1670, 1670,
+ 3859, 3872, 3935, 1670, 1667, 1672, 1672, 1672, 1672, 3872,
+ 3935, 2134, 1672, 1674, 1674, 1674, 1674, 1675, 1675, 1675,
+ 1675, 1675, 2133, 3911, 1675, 1676, 1676, 1676, 1676, 1724,
+ 1724, 1724, 1724, 1725, 1725, 1725, 1725, 1674, 2131, 3911,
+
+ 3940, 1675, 1724, 1729, 1729, 1729, 1729, 3911, 3940, 1676,
+ 1730, 1730, 1730, 1730, 1855, 1855, 1855, 1855, 1729, 3908,
+ 2127, 1730, 2122, 2121, 2113, 1730, 3908, 2105, 1729, 1729,
+ 1731, 1731, 1731, 1731, 3908, 1730, 1730, 1734, 1734, 1734,
+ 1734, 1731, 2100, 2099, 1734, 1731, 1732, 1732, 1732, 1732,
+ 1733, 1733, 1733, 1733, 1731, 1731, 1731, 3953, 1675, 1735,
+ 1735, 1735, 1735, 1732, 3920, 3953, 1735, 1733, 1737, 1737,
+ 1737, 1737, 1737, 1855, 3913, 1737, 1738, 1738, 1738, 1738,
+ 3920, 3913, 1739, 1739, 1739, 1739, 2098, 1738, 3920, 3913,
+ 3994, 1738, 1737, 1739, 1740, 1740, 1740, 1740, 3994, 2097,
+
+ 2096, 1738, 1738, 2095, 2093, 1740, 1741, 1741, 1741, 1741,
+ 2092, 1747, 1747, 1747, 1747, 1747, 2209, 1741, 1747, 2209,
+ 1749, 1749, 1749, 1749, 4028, 4032, 1750, 1750, 1750, 1750,
+ 1741, 1749, 4028, 4032, 2089, 1747, 2086, 1750, 1758, 1758,
+ 1758, 1758, 1758, 2085, 1749, 1758, 2209, 2084, 2080, 1737,
+ 1750, 1759, 1759, 1759, 1759, 1760, 1760, 1760, 1760, 2079,
+ 2078, 3921, 1758, 1761, 1761, 1761, 1761, 2209, 1759, 3914,
+ 1761, 3915, 1760, 2072, 2070, 1759, 3914, 3921, 3915, 1760,
+ 1762, 1762, 1762, 1762, 3914, 3921, 3915, 1762, 2069, 2068,
+ 2067, 1750, 1747, 1749, 1763, 1763, 1763, 1763, 1766, 1766,
+
+ 1766, 1766, 1775, 2066, 2065, 1766, 1781, 1781, 1781, 1781,
+ 2063, 1775, 1775, 1775, 1775, 2062, 2061, 2060, 1763, 1758,
+ 1813, 1813, 1813, 1813, 1760, 1780, 1780, 1780, 1780, 2058,
+ 1781, 1780, 1782, 1782, 1782, 1782, 1782, 3934, 3922, 1782,
+ 1814, 1814, 1814, 1814, 3934, 3922, 1813, 3922, 2056, 1780,
+ 2055, 1815, 3934, 3922, 1815, 1780, 1782, 1821, 1821, 1821,
+ 1821, 3942, 2054, 2050, 1821, 2048, 1814, 2046, 3942, 1780,
+ 1815, 1815, 1815, 1815, 1815, 1780, 3942, 2044, 3943, 1780,
+ 1780, 1821, 1780, 1780, 1780, 3943, 2042, 2040, 1780, 1780,
+ 1780, 1780, 1780, 3943, 1780, 3965, 1780, 1780, 1780, 1780,
+
+ 1780, 1819, 1819, 1819, 1819, 1920, 1920, 1920, 1920, 2038,
+ 1819, 3965, 1819, 1782, 1819, 1820, 1820, 1820, 1820, 3965,
+ 2036, 2035, 1820, 2033, 1820, 2029, 2027, 4036, 1820, 1822,
+ 1822, 1822, 1822, 1823, 1823, 1823, 1823, 2017, 2016, 1820,
+ 2015, 1822, 1822, 4036, 1823, 1824, 1824, 1824, 1824, 2012,
+ 2008, 4036, 1824, 1822, 1819, 2006, 2005, 1824, 1825, 1825,
+ 1825, 1825, 1837, 1837, 1837, 1837, 1837, 2004, 1820, 1837,
+ 1825, 1825, 1840, 1840, 1840, 1840, 1843, 1843, 1843, 1843,
+ 4052, 2003, 1825, 1840, 1825, 2002, 1837, 1843, 4052, 1844,
+ 1844, 1844, 1844, 1843, 1845, 1845, 1845, 1845, 2001, 1998,
+
+ 1844, 1846, 1846, 1846, 1846, 1845, 1844, 1923, 1923, 1923,
+ 1923, 1845, 1846, 1847, 1847, 1847, 1847, 1997, 1846, 1996,
+ 1848, 1848, 1848, 1848, 1847, 1849, 1849, 1849, 1849, 1995,
+ 1847, 1848, 1852, 1852, 1852, 1852, 1849, 1848, 1850, 1850,
+ 1850, 1850, 1849, 1837, 1844, 1853, 1853, 1853, 1853, 1850,
+ 1994, 1854, 1854, 1854, 1854, 1850, 1852, 1993, 1852, 1899,
+ 1899, 1899, 1899, 1845, 1852, 1938, 1938, 1938, 1938, 1853,
+ 4053, 1853, 3952, 1992, 1846, 1854, 4060, 1854, 4053, 3952,
+ 1991, 1849, 1990, 1848, 4060, 1899, 1847, 3952, 1848, 1854,
+ 1853, 1857, 1857, 1857, 1857, 1858, 1858, 1858, 1858, 1859,
+
+ 1859, 1859, 1859, 1989, 1860, 1860, 1860, 1860, 1850, 1861,
+ 1861, 1861, 1861, 1988, 4093, 1857, 4122, 1857, 4147, 1858,
+ 1985, 1858, 4093, 1859, 4122, 1859, 4147, 1984, 1860, 1983,
+ 1860, 1979, 1978, 1861, 1966, 1861, 1862, 1862, 1862, 1862,
+ 1863, 1863, 1863, 1863, 1965, 1964, 1864, 1864, 1864, 1864,
+ 1865, 1865, 1865, 1865, 1866, 1866, 1866, 1866, 1963, 4163,
+ 1862, 1962, 1862, 1961, 1863, 1857, 1863, 4163, 1858, 1860,
+ 1864, 1859, 1864, 1960, 1865, 1959, 1865, 1956, 1866, 1952,
+ 1866, 1861, 1867, 1867, 1867, 1867, 1868, 1868, 1868, 1868,
+ 1950, 1869, 1869, 1869, 1869, 1928, 1928, 1928, 1928, 1862,
+
+ 1870, 1870, 1870, 1870, 1943, 4168, 1867, 1942, 1867, 1863,
+ 1868, 1936, 1868, 4168, 1864, 1869, 1865, 1869, 1934, 1928,
+ 1932, 1866, 1929, 1927, 1870, 1926, 1870, 1925, 1871, 1871,
+ 1871, 1871, 1872, 1872, 1872, 1872, 1873, 1873, 1873, 1873,
+ 1924, 1867, 1874, 1874, 1874, 1874, 1940, 1940, 1940, 1940,
+ 1869, 1868, 1871, 4183, 1871, 4218, 1872, 1922, 1872, 1870,
+ 1873, 4183, 1873, 4218, 1921, 1919, 1874, 1914, 1874, 1875,
+ 1875, 1875, 1875, 1913, 1876, 1876, 1876, 1876, 1877, 1877,
+ 1877, 1877, 1878, 1878, 1878, 1878, 1912, 1871, 1879, 1879,
+ 1879, 1879, 3962, 1875, 1911, 1875, 3970, 1872, 1876, 3962,
+
+ 1876, 1910, 1877, 3970, 1877, 1874, 1878, 3962, 1878, 1873,
+ 1903, 3970, 1879, 1903, 1879, 1880, 1880, 1880, 1880, 1881,
+ 1881, 1881, 1881, 3973, 1882, 1882, 1882, 1882, 1875, 1909,
+ 3973, 1876, 1883, 1883, 1883, 1883, 1903, 1908, 3973, 1880,
+ 1903, 1880, 1907, 1881, 1878, 1881, 1906, 1898, 1882, 1877,
+ 1882, 1884, 1884, 1884, 1884, 1897, 1883, 1856, 1883, 1842,
+ 1839, 1903, 1879, 1885, 1885, 1885, 1885, 1838, 1827, 3975,
+ 1880, 1886, 1886, 1886, 1886, 1884, 3975, 1884, 1881, 1826,
+ 1887, 1887, 1887, 1887, 3975, 1817, 1816, 1885, 1812, 1885,
+ 1811, 1888, 1888, 1888, 1888, 1886, 1810, 1886, 1809, 1882,
+
+ 1808, 1883, 1806, 1805, 1887, 1883, 1887, 1889, 1889, 1889,
+ 1889, 1890, 1890, 1890, 1890, 1888, 1884, 1888, 1891, 1891,
+ 1891, 1891, 1892, 1892, 1892, 1892, 1893, 1893, 1893, 1893,
+ 1804, 1889, 1802, 1889, 1801, 1890, 3981, 1890, 1975, 1975,
+ 1975, 1975, 1891, 3981, 1891, 1886, 1892, 1887, 1892, 1800,
+ 1893, 3981, 1893, 1900, 1900, 1900, 1900, 1799, 1894, 1894,
+ 1894, 1894, 1798, 1797, 1888, 1895, 1895, 1895, 1895, 1794,
+ 1896, 1896, 1896, 1896, 1793, 1792, 1790, 1891, 1789, 1900,
+ 1890, 1889, 1894, 1904, 1894, 1788, 1904, 4075, 1787, 1895,
+ 1892, 1895, 1905, 1893, 1896, 1905, 1896, 1901, 1901, 1901,
+
+ 1901, 1901, 1786, 4075, 1901, 1905, 1784, 1774, 1772, 1904,
+ 1771, 4075, 1770, 1904, 1972, 1972, 1972, 1972, 1905, 1769,
+ 1768, 1901, 1905, 1767, 1765, 1896, 1930, 1930, 1930, 1930,
+ 1756, 1972, 1894, 1751, 1904, 1937, 1933, 1930, 1895, 1933,
+ 1748, 1746, 1728, 1905, 1937, 1937, 1937, 1937, 1946, 1946,
+ 1946, 1946, 1930, 1721, 1712, 1933, 1933, 1933, 1933, 1933,
+ 1944, 1944, 1944, 1944, 1711, 1946, 1709, 1944, 1945, 1945,
+ 1945, 1945, 1946, 1708, 1707, 1945, 1706, 1705, 1901, 1947,
+ 1947, 1947, 1947, 1949, 1949, 1949, 1949, 1949, 1953, 1703,
+ 1949, 1981, 1981, 1981, 1981, 1702, 1947, 1953, 1953, 1953,
+
+ 1953, 1701, 1700, 1947, 1694, 3982, 1981, 1949, 1969, 1969,
+ 1969, 1969, 3982, 1691, 1690, 1969, 1970, 1970, 1970, 1970,
+ 3982, 1969, 1689, 1970, 1973, 1973, 1973, 1973, 1686, 1970,
+ 1685, 1973, 1974, 1974, 1974, 1974, 2009, 1684, 1947, 1974,
+ 1982, 1982, 1982, 1982, 3983, 2009, 2009, 2009, 2009, 2011,
+ 2014, 3983, 2011, 2014, 2018, 2018, 2018, 2018, 4098, 3983,
+ 1683, 2018, 1680, 1679, 1949, 1668, 1666, 2018, 1665, 1653,
+ 2019, 2019, 2019, 2019, 4098, 2011, 2014, 2019, 1647, 2011,
+ 2014, 1643, 4098, 2019, 2020, 2020, 2020, 2020, 2021, 2021,
+ 2021, 2021, 2024, 2024, 2024, 2024, 2024, 2020, 2030, 2024,
+
+ 2011, 2014, 2025, 2025, 2025, 2025, 1641, 2030, 2030, 2030,
+ 2030, 2039, 2021, 2025, 2052, 2043, 2024, 2052, 1640, 2047,
+ 2039, 2039, 2039, 2039, 2043, 2043, 2043, 2043, 2047, 2047,
+ 2047, 2047, 2051, 2052, 2052, 2052, 2052, 2052, 2059, 1639,
+ 1638, 2051, 2051, 2051, 2051, 1637, 1636, 2059, 2059, 2059,
+ 2059, 2073, 2073, 2073, 2073, 2074, 2074, 2074, 2074, 2075,
+ 2075, 2075, 2075, 2073, 1634, 1633, 2073, 2076, 2076, 2076,
+ 2076, 1626, 1625, 2024, 2077, 2077, 2077, 2077, 2082, 2082,
+ 2082, 2082, 2082, 1607, 1605, 2082, 2108, 2108, 2108, 2108,
+ 4108, 1597, 2109, 2109, 2109, 2109, 1594, 2111, 2111, 2111,
+
+ 2111, 2108, 2082, 2109, 1591, 1586, 4108, 2109, 2111, 1576,
+ 2108, 2108, 2108, 3993, 4108, 1575, 2109, 2109, 2109, 1574,
+ 3993, 2111, 2125, 2125, 2125, 2125, 4211, 4212, 3993, 2125,
+ 2128, 2128, 2128, 2128, 2130, 2130, 2130, 2130, 2132, 2132,
+ 2132, 2132, 4211, 4212, 1565, 2132, 2190, 2190, 2190, 2190,
+ 4211, 4212, 1561, 2190, 2128, 1546, 1544, 1541, 2130, 2082,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2117, 2117, 2117, 2117, 2118, 2118,
+ 2118, 2118, 1518, 1513, 1512, 2117, 1510, 1505, 1504, 2118,
+ 2124, 2124, 2124, 2124, 2124, 1500, 1498, 2124, 2117, 1497,
+ 1496, 1495, 2118, 2126, 2126, 2126, 2126, 2126, 1487, 1465,
+ 2126, 2139, 1464, 1463, 2124, 2129, 2129, 2129, 2129, 1462,
+ 2139, 2139, 2139, 2139, 1461, 1460, 1457, 2126, 2143, 2143,
+
+ 2143, 2143, 2129, 2193, 2193, 2193, 2193, 2118, 1446, 2129,
+ 2186, 2186, 2186, 2186, 2193, 2117, 1444, 2186, 1443, 2186,
+ 1442, 4000, 2143, 2186, 2187, 2187, 2187, 2187, 4000, 1436,
+ 1435, 2187, 4014, 2187, 2186, 1433, 4000, 2187, 1432, 4014,
+ 1413, 2124, 2189, 2189, 2189, 2189, 1409, 4014, 2187, 1407,
+ 2129, 1406, 4001, 4001, 2126, 2142, 2142, 2142, 2142, 4001,
+ 1397, 2142, 1386, 2186, 1374, 1371, 2189, 4001, 2189, 2191,
+ 2191, 2191, 2191, 1366, 1360, 1350, 2191, 2187, 1349, 2142,
+ 2192, 2192, 2192, 2192, 1348, 2142, 2195, 2195, 2195, 2195,
+ 1347, 1346, 2192, 2195, 2275, 2275, 2275, 2275, 2195, 2142,
+
+ 2216, 2216, 2216, 2216, 2192, 2142, 2192, 1345, 4031, 2142,
+ 2142, 2216, 2142, 2142, 2142, 4031, 1344, 2216, 2142, 2142,
+ 2142, 2142, 2142, 4031, 2142, 1343, 2142, 2142, 2142, 2142,
+ 2142, 2196, 2196, 2196, 2196, 2198, 1342, 1335, 2196, 1333,
+ 2198, 1332, 1331, 2196, 1330, 1329, 1328, 2198, 2198, 2198,
+ 2198, 2198, 2199, 2199, 2199, 2199, 1305, 1303, 1302, 2199,
+ 1266, 2199, 1264, 1253, 1252, 2199, 2201, 2201, 2201, 2201,
+ 2217, 2217, 2217, 2217, 1244, 1233, 2199, 1232, 2201, 4029,
+ 4029, 2217, 2218, 2218, 2218, 2218, 4029, 2217, 1226, 1225,
+ 2201, 1223, 1221, 2218, 4029, 2219, 2219, 2219, 2219, 2218,
+
+ 2220, 2220, 2220, 2220, 1219, 2199, 2219, 2221, 2221, 2221,
+ 2221, 2220, 2219, 2284, 2284, 2284, 2284, 2220, 2221, 2222,
+ 2222, 2222, 2222, 1218, 2221, 1217, 2223, 2223, 2223, 2223,
+ 2222, 1215, 2225, 2225, 2225, 2225, 2222, 2223, 2224, 2224,
+ 2224, 2224, 2217, 2223, 1213, 1212, 1211, 2218, 1210, 2224,
+ 2227, 2227, 2227, 2227, 2219, 2224, 2225, 1208, 2225, 2226,
+ 2226, 2226, 2226, 2220, 2228, 2228, 2228, 2228, 1199, 1198,
+ 1197, 2225, 1194, 1193, 2227, 1192, 2227, 1191, 2229, 2229,
+ 2229, 2229, 2221, 2226, 1189, 2226, 1166, 2227, 2228, 1160,
+ 2228, 2223, 2222, 2230, 2230, 2230, 2230, 2231, 2231, 2231,
+
+ 2231, 2226, 2229, 4043, 2229, 2232, 2232, 2232, 2232, 1158,
+ 4043, 1156, 2224, 2233, 2233, 2233, 2233, 2230, 4043, 2230,
+ 2228, 2231, 1155, 2231, 2234, 2234, 2234, 2234, 1144, 2232,
+ 1133, 2232, 2236, 2236, 2236, 2236, 1129, 2233, 1103, 2233,
+ 2238, 2238, 2238, 2238, 2244, 2244, 2244, 2244, 2234, 2229,
+ 2234, 1099, 2231, 1084, 1082, 1060, 2236, 1059, 2236, 2237,
+ 2237, 2237, 2237, 1058, 2238, 2230, 2238, 4061, 2244, 4061,
+ 2244, 2289, 2289, 2289, 2289, 1056, 4061, 1043, 2232, 1042,
+ 2233, 1041, 1032, 2237, 4061, 2237, 1020, 2234, 2235, 2235,
+ 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235,
+
+ 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 1009, 2238,
+ 998, 2236, 2244, 2235, 974, 2235, 2235, 2235, 2235, 2235,
+ 2239, 2239, 2239, 2239, 2240, 2240, 2240, 2240, 2242, 2242,
+ 2242, 2242, 2237, 2241, 2241, 2241, 2241, 930, 4054, 2235,
+ 2235, 2235, 2235, 4054, 2239, 4054, 2239, 924, 2240, 923,
+ 2240, 922, 2242, 4054, 2242, 899, 891, 2241, 883, 2241,
+ 2243, 2243, 2243, 2243, 2245, 2245, 2245, 2245, 2235, 2235,
+ 2235, 2235, 2246, 2246, 2246, 2246, 875, 2247, 2247, 2247,
+ 2247, 866, 4074, 2239, 2243, 856, 2243, 850, 2245, 4074,
+ 2245, 2248, 2248, 2248, 2248, 2240, 2246, 4074, 2246, 2242,
+
+ 2241, 2247, 845, 2247, 2249, 2249, 2249, 2249, 832, 2250,
+ 2250, 2250, 2250, 826, 815, 2248, 804, 2248, 2252, 2252,
+ 2252, 2252, 776, 2251, 2251, 2251, 2251, 775, 2249, 774,
+ 2249, 2245, 773, 2250, 2243, 2250, 2253, 2253, 2253, 2253,
+ 770, 766, 2252, 2246, 2252, 2247, 2248, 2251, 756, 2251,
+ 755, 2254, 2254, 2254, 2254, 754, 2255, 2255, 2255, 2255,
+ 2253, 753, 2253, 2256, 2256, 2256, 2256, 742, 2257, 2257,
+ 2257, 2257, 2249, 741, 2250, 2254, 740, 2254, 739, 2251,
+ 2255, 738, 2255, 2258, 2258, 2258, 2258, 2256, 737, 2256,
+ 2252, 2253, 2257, 706, 2257, 2259, 2259, 2259, 2259, 2280,
+
+ 2280, 2280, 2280, 2260, 2260, 2260, 2260, 2258, 681, 2258,
+ 2254, 2261, 2261, 2261, 2261, 2255, 675, 673, 672, 2259,
+ 650, 2259, 643, 2280, 628, 2257, 2256, 2260, 627, 2260,
+ 2262, 2262, 2262, 2262, 584, 2261, 572, 2261, 4062, 561,
+ 2257, 2263, 2263, 2263, 2263, 4062, 2258, 4062, 545, 543,
+ 2259, 536, 522, 4062, 2262, 520, 2262, 2264, 2264, 2264,
+ 2264, 2265, 2265, 2265, 2265, 2263, 2260, 2263, 2261, 506,
+ 2266, 2266, 2266, 2266, 2267, 2267, 2267, 2267, 497, 495,
+ 494, 2264, 493, 2264, 492, 2265, 4080, 2265, 2268, 2268,
+ 2268, 2268, 491, 4080, 2266, 2262, 2266, 490, 2267, 2263,
+
+ 2267, 4080, 2293, 2293, 2293, 2293, 2297, 438, 2263, 406,
+ 402, 398, 2268, 2293, 2268, 2297, 2297, 2297, 2297, 397,
+ 372, 370, 2265, 360, 2264, 2300, 2300, 2300, 2300, 2266,
+ 2301, 2301, 2301, 2301, 2302, 2302, 2302, 2302, 2316, 2316,
+ 2316, 2316, 2300, 2317, 2317, 2317, 2317, 2301, 2267, 2300,
+ 356, 2302, 322, 2305, 2301, 2316, 311, 293, 2302, 291,
+ 276, 2268, 2305, 2305, 2305, 2305, 2320, 2320, 2320, 2320,
+ 2339, 2340, 2340, 2340, 2340, 2341, 2341, 2341, 2341, 2339,
+ 2339, 2339, 2339, 2346, 2340, 2342, 2342, 2342, 2342, 253,
+ 4088, 2353, 2346, 2346, 2346, 2346, 0, 4088, 0, 2341,
+
+ 2353, 2353, 2353, 2353, 2356, 4088, 2302, 0, 2359, 2342,
+ 0, 0, 2362, 2356, 2356, 2356, 2356, 2359, 2359, 2359,
+ 2359, 2362, 2362, 2362, 2362, 2368, 2406, 2406, 2406, 2406,
+ 0, 0, 0, 2406, 2368, 2368, 2368, 2368, 2378, 2378,
+ 0, 0, 0, 2378, 0, 0, 2378, 2378, 2407, 2407,
+ 2407, 2407, 0, 0, 0, 2407, 2378, 0, 2378, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390, 2390,
+ 2390, 2390, 2390, 2401, 2401, 0, 0, 0, 2401, 0,
+ 0, 2401, 2401, 2403, 2403, 2403, 2403, 2404, 2404, 2404,
+ 2404, 2401, 0, 2401, 2403, 0, 0, 0, 2404, 2409,
+ 2409, 2409, 2409, 2412, 2412, 2412, 2412, 2403, 0, 0,
+ 4091, 2404, 2411, 2411, 2411, 2411, 2411, 4091, 0, 2411,
+ 0, 0, 0, 2409, 0, 4091, 0, 2412, 4105, 2413,
+
+ 2413, 2413, 2413, 0, 0, 4105, 2411, 4119, 2403, 2423,
+ 2423, 2423, 2423, 4105, 4119, 2404, 2413, 2438, 2438, 2438,
+ 2438, 0, 4119, 2413, 2468, 2468, 2468, 2468, 0, 0,
+ 0, 2468, 0, 2423, 0, 2469, 2469, 2469, 2469, 2553,
+ 2553, 2553, 2553, 0, 2473, 2473, 2473, 2473, 2468, 2470,
+ 2470, 2470, 2470, 0, 0, 0, 2473, 0, 2413, 2469,
+ 0, 0, 0, 2411, 2422, 2422, 2422, 2422, 2473, 2476,
+ 2422, 0, 0, 2470, 2476, 2470, 0, 2474, 2474, 2474,
+ 2474, 2476, 2476, 2476, 2476, 2476, 0, 0, 2422, 2474,
+ 2571, 2571, 2571, 2571, 2422, 0, 2438, 2477, 0, 0,
+
+ 0, 2474, 2477, 2474, 2557, 2557, 2557, 2557, 2422, 2477,
+ 2477, 2477, 2477, 2477, 2422, 2557, 0, 4125, 2422, 2422,
+ 0, 2422, 2422, 2422, 4125, 0, 0, 2422, 2422, 2422,
+ 2422, 2422, 4125, 2422, 0, 2422, 2422, 2422, 2422, 2422,
+ 2483, 2483, 2483, 2483, 2484, 2484, 2484, 2484, 4210, 0,
+ 4220, 2483, 4221, 0, 4210, 2484, 4220, 2483, 4221, 0,
+ 0, 2484, 2485, 2485, 2485, 2485, 2486, 2486, 2486, 2486,
+ 4210, 0, 4220, 2485, 4221, 0, 2557, 2486, 4210, 2485,
+ 4220, 0, 4221, 2486, 2487, 2487, 2487, 2487, 2488, 2488,
+ 2488, 2488, 0, 0, 0, 2487, 4118, 4118, 0, 2488,
+
+ 0, 2487, 0, 4118, 0, 2488, 2489, 2489, 2489, 2489,
+ 0, 4118, 2492, 2492, 2492, 2492, 2484, 2489, 0, 0,
+ 0, 2485, 0, 2489, 2490, 2490, 2490, 2490, 2491, 2491,
+ 2491, 2491, 0, 0, 0, 2490, 2492, 2486, 2492, 2491,
+ 0, 2490, 0, 2488, 0, 2491, 0, 2492, 2656, 2656,
+ 2656, 2656, 2487, 2493, 2493, 2493, 2493, 2494, 2494, 2494,
+ 2494, 2559, 2559, 2559, 2559, 2489, 2495, 2495, 2495, 2495,
+ 0, 4128, 2559, 0, 2489, 0, 4128, 2493, 4128, 2493,
+ 4135, 2494, 4135, 2494, 0, 0, 4128, 2490, 0, 4135,
+ 2495, 2491, 2495, 0, 0, 0, 2493, 4135, 2494, 2496,
+
+ 2496, 2496, 2496, 2497, 2497, 2497, 2497, 0, 2498, 2498,
+ 2498, 2498, 2499, 2499, 2499, 2499, 2500, 2500, 2500, 2500,
+ 0, 0, 0, 2496, 0, 2496, 4151, 2497, 0, 2497,
+ 0, 2495, 2498, 4151, 2498, 0, 2499, 0, 2499, 0,
+ 2500, 4151, 2500, 2501, 2501, 2501, 2501, 2503, 2503, 2503,
+ 2503, 0, 0, 0, 2496, 2506, 2506, 2506, 2506, 2507,
+ 2507, 2507, 2507, 2509, 2509, 2509, 2509, 2501, 0, 2501,
+ 0, 2503, 0, 2503, 0, 2500, 0, 0, 0, 2506,
+ 2498, 2506, 2497, 2507, 0, 2507, 0, 2509, 0, 2509,
+ 0, 2510, 2510, 2510, 2510, 2511, 2511, 2511, 2511, 2512,
+
+ 2512, 2512, 2512, 2513, 2513, 2513, 2513, 0, 0, 0,
+ 2501, 2514, 2514, 2514, 2514, 2510, 2507, 2510, 0, 2511,
+ 0, 2511, 0, 2512, 0, 2512, 0, 2513, 0, 2513,
+ 0, 2507, 0, 0, 0, 2514, 0, 2514, 0, 2515,
+ 2515, 2515, 2515, 2516, 2516, 2516, 2516, 2517, 2517, 2517,
+ 2517, 0, 2511, 2518, 2518, 2518, 2518, 2519, 2519, 2519,
+ 2519, 2513, 0, 2515, 2510, 2515, 2512, 2516, 0, 2516,
+ 0, 2517, 0, 2517, 2514, 0, 0, 2518, 0, 2518,
+ 0, 2519, 0, 2519, 0, 2520, 2520, 2520, 2520, 0,
+ 2521, 2521, 2521, 2521, 0, 0, 0, 2515, 2522, 2522,
+
+ 2522, 2522, 2572, 2572, 2572, 2572, 2517, 0, 4159, 2520,
+ 2516, 2520, 0, 2518, 2521, 4159, 2521, 0, 4182, 0,
+ 2518, 0, 2522, 4159, 2522, 4182, 2519, 2523, 2523, 2523,
+ 2523, 0, 0, 4182, 2524, 2524, 2524, 2524, 2525, 2525,
+ 2525, 2525, 2526, 2526, 2526, 2526, 0, 0, 2521, 0,
+ 0, 2523, 4196, 2523, 0, 0, 2520, 2522, 2524, 4196,
+ 2524, 0, 2525, 0, 2525, 2572, 2526, 4196, 2526, 2527,
+ 2527, 2527, 2527, 2528, 2528, 2528, 2528, 0, 2531, 2531,
+ 2531, 2531, 2532, 2532, 2532, 2532, 2533, 2533, 2533, 2533,
+ 0, 0, 2523, 2527, 4206, 2527, 0, 2528, 0, 2528,
+
+ 0, 4206, 2531, 2524, 2531, 0, 2532, 0, 2532, 4206,
+ 2533, 2525, 2533, 2526, 2534, 2534, 2534, 2534, 2535, 2535,
+ 2535, 2535, 2536, 2536, 2536, 2536, 2527, 0, 0, 0,
+ 2528, 2537, 2537, 2537, 2537, 0, 0, 0, 2534, 0,
+ 2534, 0, 2535, 2533, 2535, 0, 2536, 2532, 2536, 2531,
+ 2538, 2538, 2538, 2538, 0, 2537, 0, 2537, 2539, 2539,
+ 2539, 2539, 0, 0, 2540, 2540, 2540, 2540, 2541, 2541,
+ 2541, 2541, 0, 2535, 2538, 0, 2538, 2542, 2542, 2542,
+ 2542, 2536, 2539, 0, 2539, 0, 2537, 2534, 2540, 0,
+ 2540, 0, 2541, 4213, 2541, 2566, 2566, 2566, 2566, 0,
+
+ 4213, 2542, 0, 2542, 2595, 2595, 2595, 2595, 4213, 0,
+ 0, 2595, 2566, 2670, 2670, 2670, 2670, 2595, 0, 2566,
+ 0, 4215, 0, 2541, 2649, 2649, 2649, 2649, 4215, 2538,
+ 2650, 2650, 2650, 2650, 0, 2649, 4215, 2540, 0, 0,
+ 2542, 2650, 2652, 2652, 2652, 2652, 2652, 0, 2649, 2652,
+ 2653, 2653, 2653, 2653, 2650, 2659, 2659, 2659, 2659, 2672,
+ 2672, 2672, 2672, 0, 2566, 4216, 2652, 2653, 2675, 2675,
+ 2675, 2675, 4216, 0, 2653, 2674, 2674, 2674, 2674, 2659,
+ 4216, 2649, 2697, 2697, 2697, 2697, 2703, 2703, 2703, 2703,
+ 0, 0, 2670, 2703, 0, 0, 0, 2704, 2704, 2704,
+
+ 2704, 0, 0, 0, 2704, 0, 2704, 0, 0, 2650,
+ 2704, 2706, 2706, 2706, 2706, 0, 2653, 2709, 2709, 2709,
+ 2709, 2704, 4222, 2652, 2658, 2658, 2658, 2658, 2709, 4222,
+ 2658, 0, 2674, 0, 2709, 2706, 0, 4222, 2710, 2710,
+ 2710, 2710, 2711, 2711, 2711, 2711, 0, 2674, 2658, 2710,
+ 2704, 4223, 0, 2711, 2658, 2710, 0, 0, 4223, 2711,
+ 0, 2697, 2770, 2770, 2770, 2770, 4223, 0, 2658, 2712,
+ 2712, 2712, 2712, 0, 2658, 0, 0, 0, 2658, 2658,
+ 2712, 2658, 2658, 2658, 0, 0, 2712, 2658, 2658, 2658,
+ 2658, 2658, 0, 2658, 0, 2658, 2658, 2658, 2658, 2658,
+
+ 0, 0, 2711, 0, 2710, 2713, 2713, 2713, 2713, 2714,
+ 2714, 2714, 2714, 0, 0, 0, 2713, 0, 0, 0,
+ 2714, 0, 2713, 0, 0, 0, 2714, 2715, 2715, 2715,
+ 2715, 2716, 2716, 2716, 2716, 0, 2712, 0, 2715, 0,
+ 0, 0, 2716, 0, 2715, 0, 0, 0, 2716, 0,
+ 2717, 2717, 2717, 2717, 0, 0, 2718, 2718, 2718, 2718,
+ 0, 2717, 2777, 2777, 2777, 2777, 2714, 2717, 2719, 2719,
+ 2719, 2719, 0, 2720, 2720, 2720, 2720, 0, 2713, 0,
+ 2718, 0, 2718, 0, 2715, 0, 0, 0, 2716, 2718,
+ 0, 0, 2719, 0, 2719, 0, 0, 2720, 0, 2720,
+
+ 0, 0, 0, 2719, 2720, 2721, 2721, 2721, 2721, 2722,
+ 2722, 2722, 2722, 2723, 2723, 2723, 2723, 2725, 2725, 2725,
+ 2725, 2717, 2726, 2726, 2726, 2726, 0, 0, 0, 2721,
+ 0, 2721, 0, 2722, 0, 2722, 0, 2723, 0, 2723,
+ 0, 2725, 0, 2725, 0, 0, 2726, 0, 2726, 2727,
+ 2727, 2727, 2727, 0, 2728, 2728, 2728, 2728, 0, 0,
+ 2727, 2731, 2731, 2731, 2731, 0, 2722, 0, 2721, 0,
+ 0, 0, 2726, 2727, 0, 2727, 0, 0, 2728, 2726,
+ 2728, 2726, 0, 0, 0, 2731, 0, 2731, 0, 2725,
+ 2732, 2732, 2732, 2732, 2726, 0, 2726, 2733, 2733, 2733,
+
+ 2733, 0, 2734, 2734, 2734, 2734, 0, 2734, 2735, 2735,
+ 2735, 2735, 0, 0, 2732, 0, 2732, 2736, 2736, 2736,
+ 2736, 2733, 0, 2733, 0, 0, 2734, 2728, 2734, 0,
+ 0, 0, 2735, 0, 2735, 2737, 2737, 2737, 2737, 0,
+ 0, 2736, 0, 2736, 2738, 2738, 2738, 2738, 0, 2739,
+ 2739, 2739, 2739, 2732, 0, 2740, 2740, 2740, 2740, 2737,
+ 2733, 2737, 2741, 2741, 2741, 2741, 0, 0, 2738, 0,
+ 2738, 0, 0, 2739, 2736, 2739, 0, 0, 0, 2740,
+ 0, 2740, 2742, 2742, 2742, 2742, 2741, 0, 2741, 2743,
+ 2743, 2743, 2743, 0, 2737, 0, 2744, 2744, 2744, 2744,
+
+ 2745, 2745, 2745, 2745, 0, 0, 2742, 0, 2742, 2738,
+ 2740, 0, 0, 2743, 0, 2743, 0, 2741, 0, 0,
+ 2744, 0, 2744, 0, 2745, 0, 2745, 2746, 2746, 2746,
+ 2746, 0, 2747, 2747, 2747, 2747, 2748, 2748, 2748, 2748,
+ 2749, 2749, 2749, 2749, 0, 2750, 2750, 2750, 2750, 0,
+ 0, 2746, 0, 2746, 0, 0, 2747, 0, 2747, 0,
+ 2748, 0, 2748, 0, 2749, 0, 2749, 2743, 2744, 2750,
+ 0, 2750, 2751, 2751, 2751, 2751, 2754, 2754, 2754, 2754,
+ 2755, 2755, 2755, 2755, 0, 0, 2746, 2747, 2756, 2756,
+ 2756, 2756, 0, 0, 0, 2748, 2751, 0, 2751, 0,
+
+ 2754, 0, 2754, 0, 2755, 0, 2755, 2757, 2757, 2757,
+ 2757, 0, 2756, 2749, 2756, 0, 2751, 0, 2750, 2758,
+ 2758, 2758, 2758, 2759, 2759, 2759, 2759, 2760, 2760, 2760,
+ 2760, 2757, 0, 2757, 0, 2754, 2761, 2761, 2761, 2761,
+ 0, 0, 0, 2758, 2751, 2758, 0, 2759, 0, 2759,
+ 0, 2760, 2755, 2760, 2763, 2763, 2763, 2763, 0, 0,
+ 2761, 0, 2761, 2764, 2764, 2764, 2764, 0, 0, 0,
+ 2765, 2765, 2765, 2765, 2766, 2766, 2766, 2766, 2763, 0,
+ 2763, 0, 0, 2759, 0, 0, 2757, 2764, 0, 2764,
+ 0, 0, 2758, 2760, 2765, 0, 2765, 0, 2766, 0,
+
+ 2766, 2767, 2767, 2767, 2767, 2774, 2774, 2774, 2774, 0,
+ 2779, 2779, 2779, 2779, 0, 0, 2774, 0, 0, 0,
+ 2764, 2779, 0, 0, 0, 2767, 0, 2767, 2780, 2780,
+ 2780, 2780, 0, 0, 0, 2764, 0, 0, 0, 2766,
+ 2781, 2781, 2781, 2781, 2783, 2783, 2783, 2783, 2765, 0,
+ 0, 2781, 2786, 2786, 2786, 2786, 2788, 2788, 2788, 2788,
+ 2841, 2841, 2841, 2841, 0, 0, 2767, 0, 0, 2786,
+ 0, 2841, 2842, 2842, 2842, 2842, 2786, 2774, 2845, 2845,
+ 2845, 2845, 0, 2842, 2841, 2846, 2846, 2846, 2846, 2848,
+ 2848, 2848, 2848, 0, 0, 2845, 2842, 2849, 2849, 2849,
+
+ 2849, 0, 2845, 2850, 2850, 2850, 2850, 2786, 2851, 2851,
+ 2851, 2851, 2863, 2863, 2863, 2863, 2865, 2865, 2865, 2865,
+ 0, 2788, 2867, 2867, 2867, 2867, 2870, 2870, 2870, 2870,
+ 0, 0, 2851, 2841, 0, 0, 0, 2845, 2872, 2872,
+ 2872, 2872, 0, 2875, 2875, 2875, 2875, 2878, 2878, 2878,
+ 2878, 2842, 2884, 2884, 2884, 2884, 2886, 2886, 2886, 2886,
+ 2887, 2887, 2887, 2887, 0, 0, 2865, 2875, 2890, 2890,
+ 2890, 2890, 0, 2865, 0, 2865, 2884, 0, 2897, 2897,
+ 2897, 2897, 0, 2898, 2898, 2898, 2898, 0, 2865, 2897,
+ 2865, 0, 0, 0, 2898, 2897, 2884, 0, 0, 0,
+
+ 2898, 2899, 2899, 2899, 2899, 2900, 2900, 2900, 2900, 0,
+ 0, 0, 2899, 0, 0, 0, 2900, 0, 2899, 0,
+ 0, 0, 2900, 0, 2884, 2901, 2901, 2901, 2901, 2902,
+ 2902, 2902, 2902, 0, 0, 0, 2901, 2897, 2898, 2887,
+ 2902, 0, 2901, 0, 0, 0, 2902, 0, 2903, 2903,
+ 2903, 2903, 2904, 2904, 2904, 2904, 2899, 0, 0, 2903,
+ 0, 0, 0, 2904, 2900, 2903, 0, 0, 0, 2904,
+ 2905, 2905, 2905, 2905, 0, 2906, 2906, 2906, 2906, 2907,
+ 2907, 2907, 2907, 2908, 2908, 2908, 2908, 0, 2909, 2909,
+ 2909, 2909, 0, 0, 2905, 0, 2905, 2902, 2901, 2906,
+
+ 0, 2906, 0, 2907, 0, 2907, 0, 2908, 0, 2908,
+ 0, 2904, 2909, 0, 2909, 0, 0, 2905, 0, 2907,
+ 2906, 2910, 2910, 2910, 2910, 2913, 2913, 2913, 2913, 2914,
+ 2914, 2914, 2914, 0, 2914, 0, 2913, 0, 0, 2914,
+ 2915, 2915, 2915, 2915, 0, 2910, 0, 2910, 0, 2913,
+ 0, 2913, 0, 0, 0, 2908, 2918, 2918, 2918, 2918,
+ 0, 2909, 0, 0, 2915, 0, 2915, 2919, 2919, 2919,
+ 2919, 2920, 2920, 2920, 2920, 0, 2920, 0, 0, 0,
+ 2918, 0, 2918, 0, 2922, 2922, 2922, 2922, 0, 0,
+ 0, 2919, 0, 2919, 0, 2920, 0, 2920, 0, 2915,
+
+ 0, 2923, 2923, 2923, 2923, 0, 0, 0, 2922, 0,
+ 2922, 0, 0, 2925, 2925, 2925, 2925, 0, 2926, 2926,
+ 2926, 2926, 0, 0, 2918, 2923, 0, 2923, 2927, 2927,
+ 2927, 2927, 0, 2930, 2930, 2930, 2930, 2925, 0, 2925,
+ 2919, 2922, 2926, 0, 2926, 2958, 2958, 2958, 2958, 0,
+ 0, 0, 2927, 0, 2927, 0, 2922, 2930, 2922, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924,
+ 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2924, 2928,
+ 2928, 2928, 2928, 0, 2924, 2927, 2924, 2924, 2924, 2924,
+ 2924, 2925, 2929, 2929, 2929, 2929, 2931, 2931, 2931, 2931,
+
+ 0, 0, 0, 2928, 0, 2928, 2932, 2932, 2932, 2932,
+ 2924, 2924, 2924, 2924, 2924, 0, 2929, 0, 2929, 0,
+ 2931, 0, 2931, 2933, 2933, 2933, 2933, 0, 0, 0,
+ 2932, 0, 2932, 2934, 2934, 2934, 2934, 0, 0, 2924,
+ 2924, 2924, 2924, 0, 2928, 0, 0, 2933, 0, 2933,
+ 2935, 2935, 2935, 2935, 0, 0, 0, 2934, 0, 2934,
+ 2936, 2936, 2936, 2936, 2937, 2937, 2937, 2937, 0, 2938,
+ 2938, 2938, 2938, 0, 2935, 0, 2935, 2939, 2939, 2939,
+ 2939, 0, 0, 0, 2936, 0, 2936, 0, 2937, 0,
+ 2937, 0, 0, 2938, 0, 2938, 2940, 2940, 2940, 2940,
+
+ 0, 2939, 0, 2939, 2936, 0, 0, 2935, 0, 2941,
+ 2941, 2941, 2941, 2942, 2942, 2942, 2942, 0, 0, 0,
+ 2940, 2939, 2946, 2946, 2946, 2946, 0, 2937, 2938, 0,
+ 0, 0, 2936, 2941, 0, 2941, 0, 2942, 0, 2942,
+ 0, 0, 2937, 0, 0, 0, 2946, 0, 2946, 2939,
+ 2947, 2947, 2947, 2947, 0, 2948, 2948, 2948, 2948, 2950,
+ 2950, 2950, 2950, 2941, 2951, 2951, 2951, 2951, 2952, 2952,
+ 2952, 2952, 0, 0, 2947, 0, 2947, 0, 2942, 2948,
+ 0, 2948, 0, 2950, 0, 2950, 0, 0, 2951, 0,
+ 2951, 0, 2952, 0, 2952, 2955, 2955, 2955, 2955, 2956,
+
+ 2956, 2956, 2956, 0, 2957, 2957, 2957, 2957, 0, 2961,
+ 2961, 2961, 2961, 2962, 2962, 2962, 2962, 0, 2950, 2955,
+ 2961, 2955, 0, 2956, 0, 2956, 0, 2952, 2957, 0,
+ 2957, 2963, 2963, 2963, 2963, 2967, 2967, 2967, 2967, 2969,
+ 2969, 2969, 2969, 0, 0, 0, 2967, 2970, 2970, 2970,
+ 2970, 2973, 2973, 2973, 2973, 2974, 2974, 2974, 2974, 3019,
+ 3019, 3019, 3019, 2957, 2955, 0, 0, 0, 2973, 3020,
+ 3020, 3020, 3020, 0, 0, 2973, 3019, 3022, 3022, 3022,
+ 3022, 0, 0, 3019, 3023, 3023, 3023, 3023, 3024, 3024,
+ 3024, 3024, 3031, 3031, 3031, 3031, 3036, 3036, 3036, 3036,
+
+ 3040, 3040, 3040, 3040, 3042, 3042, 3042, 3042, 2973, 0,
+ 0, 0, 3024, 0, 2974, 3045, 3045, 3045, 3045, 3046,
+ 3046, 3046, 3046, 0, 0, 0, 3019, 3047, 3047, 3047,
+ 3047, 3048, 3048, 3048, 3048, 3049, 3049, 3049, 3049, 3045,
+ 3050, 3050, 3050, 3050, 3052, 3052, 3052, 3052, 3055, 3055,
+ 3055, 3055, 0, 0, 0, 3048, 3056, 3056, 3056, 3056,
+ 3059, 3059, 3059, 3059, 3060, 3060, 3060, 3060, 3052, 0,
+ 0, 0, 3055, 3061, 3061, 3061, 3061, 3062, 3062, 3062,
+ 3062, 0, 0, 0, 3059, 0, 0, 0, 3052, 0,
+ 0, 0, 3055, 3065, 3065, 3065, 3065, 3068, 3068, 3068,
+
+ 3068, 3069, 3069, 3069, 3069, 0, 0, 0, 3068, 0,
+ 0, 0, 3069, 0, 3068, 0, 3052, 0, 3069, 0,
+ 3055, 3070, 3070, 3070, 3070, 3071, 3071, 3071, 3071, 0,
+ 0, 0, 3070, 0, 0, 0, 3071, 0, 3070, 0,
+ 0, 0, 3071, 3072, 3072, 3072, 3072, 0, 3073, 3073,
+ 3073, 3073, 0, 0, 3072, 0, 0, 0, 3069, 3073,
+ 3072, 0, 0, 0, 3068, 3073, 3074, 3074, 3074, 3074,
+ 3075, 3075, 3075, 3075, 0, 0, 0, 3074, 0, 0,
+ 0, 3075, 3076, 3076, 3076, 3076, 3070, 3075, 3077, 3077,
+ 3077, 3077, 3078, 3078, 3078, 3078, 3079, 3079, 3079, 3079,
+
+ 0, 0, 3072, 0, 0, 0, 3076, 0, 3076, 0,
+ 0, 0, 3077, 3073, 3077, 0, 3078, 0, 3078, 0,
+ 3079, 0, 3079, 3080, 3080, 3080, 3080, 0, 3075, 3081,
+ 3081, 3081, 3081, 0, 0, 3077, 0, 0, 3078, 0,
+ 3083, 3083, 3083, 3083, 0, 3083, 0, 3080, 0, 3080,
+ 3083, 0, 0, 3081, 0, 3081, 0, 0, 3079, 3085,
+ 3085, 3085, 3085, 0, 3088, 3088, 3088, 3088, 3089, 3089,
+ 3089, 3089, 3094, 3094, 3094, 3094, 3096, 3096, 3096, 3096,
+ 0, 0, 0, 3085, 0, 3085, 0, 0, 3088, 0,
+ 3088, 0, 3089, 0, 3089, 0, 3094, 0, 3094, 0,
+
+ 3096, 0, 3096, 3097, 3097, 3097, 3097, 0, 3098, 3098,
+ 3098, 3098, 3099, 3099, 3099, 3099, 3100, 3100, 3100, 3100,
+ 0, 3101, 3101, 3101, 3101, 0, 0, 3097, 0, 3097,
+ 3085, 3088, 3098, 0, 3098, 0, 3099, 0, 3099, 3102,
+ 3102, 3102, 3102, 0, 3096, 3101, 0, 3101, 3103, 3103,
+ 3103, 3103, 3104, 3104, 3104, 3104, 3105, 3105, 3105, 3105,
+ 0, 0, 0, 3102, 0, 3102, 0, 3098, 3106, 3106,
+ 3106, 3106, 3103, 0, 3103, 0, 3104, 0, 3104, 0,
+ 3105, 0, 3105, 3107, 3107, 3107, 3107, 0, 3108, 3108,
+ 3108, 3108, 3106, 3109, 3109, 3109, 3109, 0, 0, 0,
+
+ 3105, 3110, 3110, 3110, 3110, 0, 0, 3107, 0, 3107,
+ 0, 3104, 3108, 0, 3108, 0, 0, 3109, 0, 3109,
+ 3111, 3111, 3111, 3111, 0, 3110, 0, 3110, 3105, 3112,
+ 3112, 3112, 3112, 3113, 3113, 3113, 3113, 3107, 3114, 3114,
+ 3114, 3114, 0, 0, 3111, 0, 3111, 3117, 3117, 3117,
+ 3117, 0, 3109, 3108, 0, 0, 0, 3113, 0, 3113,
+ 0, 0, 3114, 0, 3114, 3118, 3118, 3118, 3118, 0,
+ 0, 3117, 0, 3117, 3119, 3119, 3119, 3119, 3111, 3113,
+ 0, 3120, 3120, 3120, 3120, 3121, 3121, 3121, 3121, 3118,
+ 0, 3118, 3124, 3124, 3124, 3124, 0, 0, 3119, 3125,
+
+ 3125, 3125, 3125, 0, 0, 3120, 3114, 3120, 0, 3121,
+ 0, 3121, 0, 0, 0, 3117, 3124, 0, 3124, 3126,
+ 3126, 3126, 3126, 3125, 0, 3125, 3130, 3130, 3130, 3130,
+ 0, 3120, 3131, 3131, 3131, 3131, 0, 0, 3120, 0,
+ 3120, 3132, 3132, 3132, 3132, 3134, 3134, 3134, 3134, 0,
+ 0, 3124, 0, 3120, 0, 3120, 3120, 3149, 3149, 3149,
+ 3149, 0, 3134, 3169, 3169, 3169, 3169, 0, 0, 3134,
+ 3170, 3170, 3170, 3170, 3171, 3171, 3171, 3171, 0, 0,
+ 3169, 0, 0, 0, 3126, 0, 0, 3169, 3172, 3172,
+ 3172, 3172, 3176, 3176, 3176, 3176, 3179, 3179, 3179, 3179,
+
+ 3183, 3183, 3183, 3183, 3134, 3184, 3184, 3184, 3184, 0,
+ 0, 0, 3172, 3187, 3187, 3187, 3187, 3188, 3188, 3188,
+ 3188, 3190, 3190, 3190, 3190, 3191, 3191, 3191, 3191, 3192,
+ 3192, 3192, 3192, 0, 0, 0, 3169, 3193, 3193, 3193,
+ 3193, 3195, 3195, 3195, 3195, 3190, 3196, 3196, 3196, 3196,
+ 0, 0, 0, 3192, 3200, 3200, 3200, 3200, 3204, 3204,
+ 3204, 3204, 0, 0, 0, 3195, 3205, 3205, 3205, 3205,
+ 3206, 3206, 3206, 3206, 3207, 3207, 3207, 3207, 3209, 3209,
+ 3209, 3209, 3204, 0, 0, 3195, 3210, 3210, 3210, 3210,
+ 3211, 3211, 3211, 3211, 0, 0, 0, 3210, 0, 0,
+
+ 0, 3211, 0, 3210, 0, 0, 0, 3211, 3212, 3212,
+ 3212, 3212, 0, 3195, 0, 3213, 3213, 3213, 3213, 3212,
+ 3206, 3214, 3214, 3214, 3214, 3212, 3213, 3206, 0, 3206,
+ 0, 0, 3214, 0, 3217, 3217, 3217, 3217, 3214, 0,
+ 0, 0, 3206, 0, 3206, 3206, 0, 0, 0, 3211,
+ 3215, 3215, 3215, 3215, 3216, 3216, 3216, 3216, 3217, 3210,
+ 3217, 3215, 0, 0, 0, 3216, 0, 3215, 0, 0,
+ 0, 3216, 3218, 3218, 3218, 3218, 0, 0, 0, 3214,
+ 0, 0, 0, 3217, 3219, 3219, 3219, 3219, 3220, 3220,
+ 3220, 3220, 3223, 3223, 3223, 3223, 3218, 0, 3218, 3224,
+
+ 3224, 3224, 3224, 3225, 3225, 3225, 3225, 0, 3219, 0,
+ 3219, 0, 3220, 0, 3220, 0, 3223, 0, 3223, 3231,
+ 3231, 3231, 3231, 3224, 0, 3224, 3232, 3232, 3232, 3232,
+ 0, 3218, 3233, 3233, 3233, 3233, 3234, 3234, 3234, 3234,
+ 0, 0, 0, 3231, 0, 3231, 0, 0, 3220, 0,
+ 3232, 0, 3232, 0, 0, 0, 3233, 0, 3233, 0,
+ 3234, 0, 3234, 3235, 3235, 3235, 3235, 3237, 3237, 3237,
+ 3237, 0, 3245, 3245, 3245, 3245, 3248, 3248, 3248, 3248,
+ 0, 0, 3225, 0, 0, 0, 3231, 3235, 3236, 3236,
+ 3236, 3236, 3236, 3236, 3236, 3236, 3236, 3236, 3236, 3236,
+
+ 3236, 3236, 3236, 3236, 3236, 3236, 3236, 3236, 3238, 3238,
+ 3238, 3238, 0, 3236, 3236, 3236, 3236, 3236, 3236, 3236,
+ 3239, 3239, 3239, 3239, 3240, 3240, 3240, 3240, 3256, 3256,
+ 3256, 3256, 3238, 0, 3238, 3241, 3241, 3241, 3241, 3236,
+ 3236, 3236, 3236, 0, 3239, 0, 3239, 0, 3240, 0,
+ 3240, 3245, 0, 0, 3238, 3242, 3242, 3242, 3242, 3241,
+ 0, 3241, 0, 3243, 3243, 3243, 3243, 0, 3236, 3236,
+ 3236, 3236, 0, 0, 3244, 3244, 3244, 3244, 0, 3242,
+ 0, 3242, 3247, 3247, 3247, 3247, 0, 3243, 3239, 3243,
+ 3251, 3251, 3251, 3251, 0, 0, 3240, 0, 3244, 3242,
+
+ 3244, 0, 0, 3243, 0, 0, 3247, 0, 3247, 3254,
+ 3254, 3254, 3254, 0, 3251, 0, 3251, 3257, 3257, 3257,
+ 3257, 3258, 3258, 3258, 3258, 0, 0, 3242, 3259, 3259,
+ 3259, 3259, 0, 3254, 0, 3254, 3260, 3260, 3260, 3260,
+ 3261, 3261, 3261, 3261, 0, 0, 0, 3244, 0, 3247,
+ 3262, 3262, 3262, 3262, 3263, 3263, 3263, 3263, 3272, 3272,
+ 3272, 3272, 3288, 3288, 3288, 3288, 3289, 3289, 3289, 3289,
+ 0, 3263, 3290, 3290, 3290, 3290, 0, 0, 3263, 3288,
+ 3291, 3291, 3291, 3291, 0, 0, 3288, 3294, 3294, 3294,
+ 3294, 3295, 3295, 3295, 3295, 3297, 3297, 3297, 3297, 3298,
+
+ 3298, 3298, 3298, 0, 3291, 3300, 3300, 3300, 3300, 3302,
+ 3302, 3302, 3302, 3303, 3303, 3303, 3303, 3304, 3304, 3304,
+ 3304, 3305, 3305, 3305, 3305, 3306, 3306, 3306, 3306, 3307,
+ 3307, 3307, 3307, 0, 3288, 3308, 3308, 3308, 3308, 3312,
+ 3312, 3312, 3312, 3313, 3313, 3313, 3313, 0, 0, 3306,
+ 3316, 3316, 3316, 3316, 3317, 3317, 3317, 3317, 3318, 3318,
+ 3318, 3318, 3319, 3319, 3319, 3319, 0, 3313, 0, 3318,
+ 0, 0, 0, 3319, 0, 3318, 0, 0, 0, 3319,
+ 3320, 3320, 3320, 3320, 0, 0, 0, 3313, 0, 0,
+ 0, 3320, 3321, 3321, 3321, 3321, 3322, 3322, 3322, 3322,
+
+ 0, 0, 0, 3321, 0, 0, 0, 3322, 0, 3321,
+ 0, 0, 0, 3318, 0, 3313, 3323, 3323, 3323, 3323,
+ 3324, 3324, 3324, 3324, 0, 0, 0, 3323, 3325, 3325,
+ 3325, 3325, 3326, 3326, 3326, 3326, 3327, 3327, 3327, 3327,
+ 3329, 3329, 3329, 3329, 3324, 0, 3324, 3330, 3330, 3330,
+ 3330, 0, 3325, 0, 3325, 0, 3326, 0, 3326, 3336,
+ 3336, 3336, 3336, 0, 3329, 0, 3329, 3337, 3337, 3337,
+ 3337, 3338, 3338, 3338, 3338, 3339, 3339, 3339, 3339, 3344,
+ 3344, 3344, 3344, 3336, 0, 3336, 3325, 3326, 0, 0,
+ 0, 3337, 0, 3337, 0, 3338, 0, 3338, 3345, 3345,
+
+ 3345, 3345, 0, 3344, 0, 3344, 3347, 3347, 3347, 3347,
+ 3349, 3349, 3349, 3349, 0, 3327, 3336, 3354, 3354, 3354,
+ 3354, 0, 3345, 0, 3345, 0, 3330, 0, 3338, 0,
+ 3347, 0, 3347, 0, 3349, 0, 0, 0, 3345, 3362,
+ 3362, 3362, 3362, 3338, 3341, 3341, 3341, 3341, 3341, 3341,
+ 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341,
+ 3341, 3341, 3341, 3341, 3384, 3384, 3384, 3384, 0, 3341,
+ 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341,
+ 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341,
+ 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341,
+
+ 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341,
+ 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341,
+ 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3341, 3346, 3346,
+ 3346, 3346, 3348, 3348, 3348, 3348, 3350, 3350, 3350, 3350,
+ 3351, 3351, 3351, 3351, 3352, 3352, 3352, 3352, 3353, 3353,
+ 3353, 3353, 3346, 0, 3346, 0, 3348, 0, 3348, 0,
+ 3350, 0, 3350, 0, 3351, 0, 3351, 0, 3352, 0,
+ 3352, 0, 3353, 0, 3353, 0, 3348, 3356, 3356, 3356,
+ 3356, 0, 3357, 3357, 3357, 3357, 3352, 0, 0, 0,
+ 3350, 0, 3363, 3363, 3363, 3363, 0, 3383, 3383, 3383,
+
+ 3383, 3346, 0, 0, 3348, 3351, 3357, 0, 3357, 3363,
+ 3385, 3385, 3385, 3385, 3383, 0, 3363, 0, 0, 0,
+ 3353, 3383, 3387, 3387, 3387, 3387, 3388, 3388, 3388, 3388,
+ 3389, 3389, 3389, 3389, 3385, 3390, 3390, 3390, 3390, 3357,
+ 3391, 3391, 3391, 3391, 3394, 3394, 3394, 3394, 3395, 3395,
+ 3395, 3395, 3396, 3396, 3396, 3396, 3356, 3397, 3397, 3397,
+ 3397, 3400, 3400, 3400, 3400, 0, 3401, 3401, 3401, 3401,
+ 3402, 3402, 3402, 3402, 0, 3407, 3407, 3407, 3407, 0,
+ 3408, 3408, 3408, 3408, 0, 3400, 3407, 0, 0, 0,
+ 3401, 3408, 3407, 3409, 3409, 3409, 3409, 3410, 3410, 3410,
+
+ 3410, 0, 0, 0, 3409, 3411, 3411, 3411, 3411, 3396,
+ 3401, 3415, 3415, 3415, 3415, 3419, 3419, 3419, 3419, 0,
+ 0, 3410, 0, 3410, 3396, 3420, 3420, 3420, 3420, 3421,
+ 3421, 3421, 3421, 0, 0, 3415, 0, 3415, 3401, 0,
+ 0, 0, 3419, 3422, 3422, 3422, 3422, 0, 3407, 0,
+ 0, 0, 3420, 3421, 3410, 3421, 3423, 3423, 3423, 3423,
+ 3424, 3424, 3424, 3424, 0, 0, 0, 3422, 0, 3422,
+ 3415, 3421, 3425, 3425, 3425, 3425, 3426, 3426, 3426, 3426,
+ 3423, 0, 3423, 0, 3424, 3427, 3427, 3427, 3427, 0,
+ 3428, 3428, 3428, 3428, 3429, 3429, 3429, 3429, 0, 0,
+
+ 3426, 0, 3426, 3430, 3430, 3430, 3430, 0, 0, 3427,
+ 0, 3427, 0, 0, 3428, 3422, 3428, 0, 3429, 0,
+ 3429, 0, 3426, 3432, 3432, 3432, 3432, 3433, 3433, 3433,
+ 3433, 3445, 3445, 3445, 3445, 0, 0, 3428, 3446, 3446,
+ 3446, 3446, 3447, 3447, 3447, 3447, 0, 3432, 0, 3432,
+ 0, 0, 0, 3427, 0, 3445, 3449, 3449, 3449, 3449,
+ 3450, 3450, 3450, 3450, 0, 0, 3447, 3454, 3454, 3454,
+ 3454, 3455, 3455, 3455, 3455, 3459, 3459, 3459, 3459, 0,
+ 0, 0, 3432, 3460, 3460, 3460, 3460, 3462, 3462, 3462,
+ 3462, 3454, 0, 0, 3460, 3461, 3461, 3461, 3461, 3459,
+
+ 3460, 3466, 3466, 3466, 3466, 0, 3433, 3467, 3467, 3467,
+ 3467, 3469, 3469, 3469, 3469, 3470, 3470, 3470, 3470, 3461,
+ 0, 3461, 3471, 3471, 3471, 3471, 0, 0, 3466, 3472,
+ 3472, 3472, 3472, 0, 3467, 3469, 0, 3469, 0, 3470,
+ 0, 3470, 3473, 3473, 3473, 3473, 3460, 3474, 3474, 3474,
+ 3474, 0, 0, 3472, 3461, 3472, 0, 0, 3469, 3475,
+ 3475, 3475, 3475, 0, 0, 0, 3473, 0, 3473, 3472,
+ 0, 3474, 0, 3474, 3476, 3476, 3476, 3476, 3477, 3477,
+ 3477, 3477, 0, 3475, 0, 3475, 3479, 3479, 3479, 3479,
+ 0, 0, 0, 3474, 3487, 3487, 3487, 3487, 3476, 3488,
+
+ 3488, 3488, 3488, 3492, 3492, 3492, 3492, 3496, 3496, 3496,
+ 3496, 3497, 3497, 3497, 3497, 3473, 0, 3498, 3498, 3498,
+ 3498, 0, 0, 3488, 0, 0, 0, 3492, 3498, 0,
+ 0, 3496, 0, 0, 3498, 3499, 3499, 3499, 3499, 0,
+ 3502, 3502, 3502, 3502, 3503, 3503, 3503, 3503, 3504, 3504,
+ 3504, 3504, 3505, 3505, 3505, 3505, 3506, 3506, 3506, 3506,
+ 3507, 3507, 3507, 3507, 3502, 3479, 3502, 0, 3503, 0,
+ 3503, 0, 3504, 0, 0, 0, 3505, 0, 3505, 0,
+ 3506, 0, 3506, 0, 0, 3498, 3502, 3508, 3508, 3508,
+ 3508, 0, 0, 0, 3505, 3513, 3513, 3513, 3513, 3514,
+
+ 3514, 3514, 3514, 3517, 3517, 3517, 3517, 3518, 3518, 3518,
+ 3518, 0, 0, 3521, 3521, 3521, 3521, 3524, 3524, 3524,
+ 3524, 0, 0, 3514, 3521, 0, 0, 3517, 3506, 0,
+ 3521, 3525, 3525, 3525, 3525, 3526, 3526, 3526, 3526, 3528,
+ 3528, 3528, 3528, 3529, 3529, 3529, 3529, 3532, 3532, 3532,
+ 3532, 3533, 3533, 3533, 3533, 3525, 0, 3525, 0, 3526,
+ 0, 3526, 3533, 3534, 3534, 3534, 3534, 3529, 3533, 0,
+ 0, 3532, 3536, 3536, 3536, 3536, 0, 0, 3525, 0,
+ 3521, 3537, 3537, 3537, 3537, 3538, 3538, 3538, 3538, 3540,
+ 3540, 3540, 3540, 0, 0, 0, 3536, 0, 3536, 3541,
+
+ 3541, 3541, 3541, 0, 0, 3537, 0, 3537, 0, 3538,
+ 3542, 3542, 3542, 3542, 3544, 3544, 3544, 3544, 3536, 3545,
+ 3545, 3545, 3545, 3541, 3546, 3546, 3546, 3546, 3547, 3547,
+ 3547, 3547, 0, 0, 0, 3546, 0, 0, 3544, 0,
+ 0, 0, 3534, 3549, 3549, 3549, 3549, 3550, 3550, 3550,
+ 3550, 3551, 3551, 3551, 3551, 3552, 3552, 3552, 3552, 3553,
+ 3553, 3553, 3553, 3554, 3554, 3554, 3554, 3555, 3555, 3555,
+ 3555, 3557, 3557, 3557, 3557, 0, 0, 0, 3551, 3558,
+ 3558, 3558, 3558, 3553, 3558, 3559, 3559, 3559, 3559, 3558,
+ 3560, 3560, 3560, 3560, 3561, 3561, 3561, 3561, 3557, 3561,
+
+ 3564, 3564, 3564, 3564, 3561, 3565, 3565, 3565, 3565, 3567,
+ 3567, 3567, 3567, 0, 3560, 3568, 3568, 3568, 3568, 0,
+ 0, 0, 3549, 3569, 3569, 3569, 3569, 0, 3569, 3565,
+ 0, 0, 0, 3569, 3570, 3570, 3570, 3570, 0, 3568,
+ 3571, 3571, 3571, 3571, 3572, 3572, 3572, 3572, 3558, 0,
+ 0, 3569, 3573, 3573, 3573, 3573, 3575, 3575, 3575, 3575,
+ 0, 0, 0, 3561, 3571, 3576, 3576, 3576, 3576, 0,
+ 0, 0, 3572, 3577, 3577, 3577, 3577, 0, 0, 0,
+ 3573, 3578, 3578, 3578, 3578, 3579, 3579, 3579, 3579, 3576,
+ 3580, 3580, 3580, 3580, 3581, 3581, 3581, 3581, 3582, 3582,
+
+ 3582, 3582, 0, 0, 0, 3578, 3583, 3583, 3583, 3583,
+ 3584, 3584, 3584, 3584, 3580, 3585, 3585, 3585, 3585, 0,
+ 0, 0, 3582, 3586, 3586, 3586, 3586, 3587, 3587, 3587,
+ 3587, 0, 0, 0, 3584, 3588, 3588, 3588, 3588, 3589,
+ 3589, 3589, 3589, 3590, 3590, 3590, 3590, 3586, 3591, 3591,
+ 3591, 3591, 3592, 3592, 3592, 3592, 0, 0, 0, 3588,
+ 3593, 3593, 3593, 3593, 0, 0, 0, 3590, 3594, 3594,
+ 3594, 3594, 3595, 3595, 3595, 3595, 3592, 3596, 3596, 3596,
+ 3596, 3597, 3597, 3597, 3597, 3598, 3598, 3598, 3598, 0,
+ 0, 0, 3594, 3599, 3599, 3599, 3599, 3600, 3600, 3600,
+
+ 3600, 3596, 3601, 3601, 3601, 3601, 0, 0, 0, 3598,
+ 3602, 3602, 3602, 3602, 3603, 3603, 3603, 3603, 0, 0,
+ 0, 3600, 3604, 3604, 3604, 3604, 3605, 3605, 3605, 3605,
+ 3606, 3606, 3606, 3606, 3602, 3607, 3607, 3607, 3607, 3608,
+ 3608, 3608, 3608, 0, 0, 0, 3604, 3609, 3609, 3609,
+ 3609, 0, 0, 0, 3606, 3610, 3610, 3610, 3610, 3611,
+ 3611, 3611, 3611, 3608, 3612, 3612, 3612, 3612, 3613, 3613,
+ 3613, 3613, 3614, 3614, 3614, 3614, 0, 0, 0, 3610,
+ 3615, 3615, 3615, 3615, 3616, 3616, 3616, 3616, 3612, 3617,
+ 3617, 3617, 3617, 0, 0, 0, 3614, 3618, 3618, 3618,
+
+ 3618, 3619, 3619, 3619, 3619, 0, 0, 0, 3616, 3620,
+ 3620, 3620, 3620, 3621, 3621, 3621, 3621, 3622, 3622, 3622,
+ 3622, 3618, 3623, 3623, 3623, 3623, 3624, 3624, 3624, 3624,
+ 0, 0, 0, 3620, 3625, 3625, 3625, 3625, 0, 0,
+ 0, 3622, 3626, 3626, 3626, 3626, 3627, 3627, 3627, 3627,
+ 3624, 3628, 3628, 3628, 3628, 3629, 3629, 3629, 3629, 3630,
+ 3630, 3630, 3630, 0, 0, 0, 3626, 3631, 3631, 3631,
+ 3631, 3632, 3632, 3632, 3632, 3628, 3633, 3633, 3633, 3633,
+ 0, 0, 0, 3630, 3634, 3634, 3634, 3634, 3635, 3635,
+ 3635, 3635, 0, 0, 0, 3632, 3636, 3636, 3636, 3636,
+
+ 3637, 3637, 3637, 3637, 3638, 3638, 3638, 3638, 3634, 3639,
+ 3639, 3639, 3639, 3640, 3640, 3640, 3640, 0, 0, 0,
+ 3636, 3641, 3641, 3641, 3641, 0, 0, 0, 3638, 3642,
+ 3642, 3642, 3642, 3643, 3643, 3643, 3643, 3640, 3644, 3644,
+ 3644, 3644, 3645, 3645, 3645, 3645, 3646, 3646, 3646, 3646,
+ 0, 0, 0, 3642, 3647, 3647, 3647, 3647, 3648, 3648,
+ 3648, 3648, 3644, 3649, 3649, 3649, 3649, 0, 0, 0,
+ 3646, 3650, 3650, 3650, 3650, 3651, 3651, 3651, 3651, 0,
+ 0, 0, 3648, 3652, 3652, 3652, 3652, 3653, 3653, 3653,
+ 3653, 3654, 3654, 3654, 3654, 3650, 3655, 3655, 3655, 3655,
+
+ 3656, 3656, 3656, 3656, 0, 0, 0, 3652, 3657, 3657,
+ 3657, 3657, 0, 0, 0, 3654, 3658, 3658, 3658, 3658,
+ 3659, 3659, 3659, 3659, 3656, 3660, 3660, 3660, 3660, 3661,
+ 3661, 3661, 3661, 3662, 3662, 3662, 3662, 0, 0, 0,
+ 3658, 3663, 3663, 3663, 3663, 3664, 3664, 3664, 3664, 3660,
+ 3665, 3665, 3665, 3665, 0, 0, 0, 3662, 3666, 3666,
+ 3666, 3666, 3667, 3667, 3667, 3667, 0, 0, 0, 3664,
+ 3668, 3668, 3668, 3668, 3669, 3669, 3669, 3669, 3670, 3670,
+ 3670, 3670, 3666, 3671, 3671, 3671, 3671, 3672, 3672, 3672,
+ 3672, 0, 0, 0, 3668, 3673, 3673, 3673, 3673, 0,
+
+ 0, 0, 3670, 3674, 3674, 3674, 3674, 3675, 3675, 3675,
+ 3675, 3672, 3676, 3676, 3676, 3676, 3677, 3677, 3677, 3677,
+ 3678, 3678, 3678, 3678, 0, 0, 0, 3674, 3679, 3679,
+ 3679, 3679, 3680, 3680, 3680, 3680, 3676, 3681, 3681, 3681,
+ 3681, 0, 0, 0, 3678, 3682, 3682, 3682, 3682, 3683,
+ 3683, 3683, 3683, 0, 0, 0, 3680, 3684, 3684, 3684,
+ 3684, 3685, 3685, 3685, 3685, 3686, 3686, 3686, 3686, 3682,
+ 3687, 3687, 3687, 3687, 3688, 3688, 3688, 3688, 0, 0,
+ 0, 3684, 3689, 3689, 3689, 3689, 0, 0, 0, 3686,
+ 3690, 3690, 3690, 3690, 3691, 3691, 3691, 3691, 3688, 3692,
+
+ 3692, 3692, 3692, 3693, 3693, 3693, 3693, 0, 0, 0,
+ 0, 0, 0, 0, 3690, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3692, 3695, 3695, 3695, 3695, 3695, 3695,
+ 3695, 3695, 3695, 3695, 3695, 3695, 3695, 3695, 3695, 3695,
+ 3695, 3695, 3695, 3695, 3695, 3695, 3695, 3695, 3695, 3695,
+ 3695, 3695, 3695, 3695, 3695, 3695, 3696, 3696, 3696, 3696,
+ 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696,
+ 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696,
+ 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3697, 3697,
+ 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697,
+
+ 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697,
+ 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697, 3697,
+ 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698,
+ 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698,
+ 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698, 3698,
+ 3698, 3698, 3699, 3699, 3699, 3699, 3699, 3699, 3699, 3699,
+ 3699, 3699, 3699, 3699, 3699, 3699, 3699, 3699, 3699, 3699,
+ 3699, 3699, 3699, 3699, 3699, 3699, 3699, 3699, 3699, 3699,
+ 3699, 3699, 3699, 3699, 3700, 3700, 3700, 3700, 3700, 3700,
+ 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700,
+
+ 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700,
+ 3700, 3700, 3700, 3700, 3700, 3700, 3701, 3701, 3701, 3701,
+ 3701, 3701, 3701, 3701, 3701, 3701, 3701, 3701, 3701, 3701,
+ 3701, 3701, 3701, 3701, 3701, 3701, 3701, 3701, 3701, 3701,
+ 3701, 3701, 3701, 3701, 3701, 3701, 3701, 3701, 3702, 3702,
+ 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702,
+ 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702,
+ 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702,
+ 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703,
+ 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703,
+
+ 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703,
+ 3703, 3703, 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704,
+ 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704,
+ 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704, 3704,
+ 3704, 3704, 3704, 3704, 3705, 3705, 3705, 3705, 3705, 3705,
+ 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705,
+ 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705, 3705,
+ 3705, 3705, 3705, 3705, 3705, 3705, 3706, 3706, 3706, 3706,
+ 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706,
+ 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706,
+
+ 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3706, 3707, 3707,
+ 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707,
+ 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707,
+ 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707,
+ 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708,
+ 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708,
+ 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708,
+ 3708, 3708, 3709, 3709, 3709, 3709, 3709, 3709, 3709, 3709,
+ 3709, 3709, 3709, 3709, 3709, 3709, 3709, 3709, 3709, 3709,
+ 3709, 3709, 3709, 3709, 3709, 3709, 3709, 3709, 3709, 3709,
+
+ 3709, 3709, 3709, 3709, 3710, 3710, 3710, 3710, 3710, 3710,
+ 3710, 3710, 3710, 3710, 3710, 3710, 3710, 3710, 3710, 3710,
+ 3710, 3710, 3710, 3710, 3710, 3710, 3710, 3710, 3710, 3710,
+ 3710, 3710, 3710, 3710, 3710, 3710, 3711, 3711, 3711, 3711,
+ 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711,
+ 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711,
+ 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3711, 3712, 3712,
+ 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712,
+ 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712,
+ 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712,
+
+ 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713,
+ 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713,
+ 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713, 3713,
+ 3713, 3713, 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714,
+ 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714,
+ 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714,
+ 3714, 3714, 3714, 3714, 3715, 3715, 3715, 3715, 3715, 3715,
+ 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715,
+ 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715,
+ 3715, 3715, 3715, 3715, 3715, 3715, 3716, 3716, 3716, 3716,
+
+ 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716,
+ 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716,
+ 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3717, 3717,
+ 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717,
+ 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717,
+ 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717, 3717,
+ 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718,
+ 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718,
+ 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718, 3718,
+ 3718, 3718, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719,
+
+ 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719,
+ 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719,
+ 3719, 3719, 3719, 3719, 3720, 3720, 3720, 3720, 3720, 3720,
+ 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720,
+ 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720, 3720,
+ 3720, 3720, 3720, 3720, 3720, 3720, 3721, 3721, 3721, 3721,
+ 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721,
+ 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721,
+ 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3722, 3722,
+ 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3722,
+
+ 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3722,
+ 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3722, 3722,
+ 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723,
+ 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723,
+ 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723, 3723,
+ 3723, 3723, 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3724,
+ 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3724,
+ 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3724, 3724,
+ 3724, 3724, 3724, 3724, 3725, 3725, 3725, 3725, 3725, 3725,
+ 3725, 3725, 3725, 3725, 3725, 3725, 3725, 3725, 3725, 3725,
+
+ 3725, 3725, 3725, 3725, 3725, 3725, 3725, 3725, 3725, 3725,
+ 3725, 3725, 3725, 3725, 3725, 3725, 3726, 3726, 3726, 3726,
+ 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726,
+ 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726,
+ 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3727, 3727,
+ 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727,
+ 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727,
+ 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727,
+ 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728,
+ 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728,
+
+ 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728,
+ 3728, 3728, 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729,
+ 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729,
+ 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729, 3729,
+ 3729, 3729, 3729, 3729, 3730, 3730, 3730, 3730, 3730, 3730,
+ 3730, 3730, 3730, 3730, 3730, 3730, 3730, 3730, 3730, 3730,
+ 3730, 3730, 3730, 3730, 3730, 3730, 3730, 3730, 3730, 3730,
+ 3730, 3730, 3730, 3730, 3730, 3730, 3731, 3731, 3731, 3731,
+ 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731,
+ 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731,
+
+ 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3731, 3732, 3732,
+ 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732,
+ 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732,
+ 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732, 3732,
+ 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733,
+ 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733,
+ 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733, 3733,
+ 3733, 3733, 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3734,
+ 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3734,
+ 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3734, 3734,
+
+ 3734, 3734, 3734, 3734, 3735, 3735, 3735, 3735, 3735, 3735,
+ 3735, 3735, 3735, 3735, 3735, 3735, 3735, 3735, 3735, 3735,
+ 3735, 3735, 3735, 3735, 3735, 3735, 3735, 3735, 3735, 3735,
+ 3735, 3735, 3735, 3735, 3735, 3735, 3736, 3736, 3736, 3736,
+ 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736,
+ 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736,
+ 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3736, 3737, 3737,
+ 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737,
+ 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737,
+ 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737,
+
+ 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738,
+ 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738,
+ 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738,
+ 3738, 3738, 3739, 3739, 3739, 3739, 3739, 3739, 3739, 3739,
+ 3739, 3739, 3739, 3739, 3739, 3739, 3739, 3739, 3739, 3739,
+ 3739, 3739, 3739, 3739, 3739, 3739, 3739, 3739, 3739, 3739,
+ 3739, 3739, 3739, 3739, 3740, 3740, 3740, 3740, 3740, 3740,
+ 3740, 3740, 3740, 3740, 3740, 3740, 3740, 3740, 3740, 3740,
+ 3740, 3740, 3740, 3740, 3740, 3740, 3740, 3740, 3740, 3740,
+ 3740, 3740, 3740, 3740, 3740, 3740, 3741, 3741, 3741, 3741,
+
+ 3741, 3741, 3741, 3741, 3741, 3741, 3741, 3741, 3741, 3741,
+ 3741, 3741, 3741, 3741, 3741, 3741, 3741, 3741, 3741, 3741,
+ 3741, 3741, 3741, 3741, 3741, 3741, 3741, 3741, 3742, 3742,
+ 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3742,
+ 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3742,
+ 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3742, 3742,
+ 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743,
+ 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743,
+ 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743, 3743,
+ 3743, 3743, 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744,
+
+ 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744,
+ 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744, 3744,
+ 3744, 3744, 3744, 3744, 3745, 3745, 3745, 3745, 3745, 3745,
+ 3745, 3745, 3745, 3745, 3745, 3745, 3745, 3745, 3745, 3745,
+ 3745, 3745, 3745, 3745, 3745, 3745, 3745, 3745, 3745, 3745,
+ 3745, 3745, 3745, 3745, 3745, 3745, 3746, 3746, 3746, 3746,
+ 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746,
+ 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746,
+ 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3746, 3747, 3747,
+ 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747,
+
+ 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747,
+ 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747, 3747,
+ 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748,
+ 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748,
+ 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748, 3748,
+ 3748, 3748, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+ 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+ 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749, 3749,
+ 3749, 3749, 3749, 3749, 3750, 3750, 3750, 3750, 3750, 3750,
+ 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750,
+
+ 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750,
+ 3750, 3750, 3750, 3750, 3750, 3750, 3751, 3751, 3751, 3751,
+ 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751,
+ 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751,
+ 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3751, 3752, 3752,
+ 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
+ 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
+ 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752, 3752,
+ 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753,
+ 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753,
+
+ 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753, 3753,
+ 3753, 3753, 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754,
+ 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754,
+ 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754, 3754,
+ 3754, 3754, 3754, 3754, 3755, 3755, 3755, 3755, 3755, 3755,
+ 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755,
+ 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755, 3755,
+ 3755, 3755, 3755, 3755, 3755, 3755, 3756, 3756, 3756, 3756,
+ 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756,
+ 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756,
+
+ 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3758, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3758, 0, 0,
+ 0, 0, 0, 3758, 0, 0, 0, 0, 0, 0,
+ 3758, 0, 0, 0, 0, 0, 0, 0, 3758, 3759,
+ 3759, 3759, 0, 0, 0, 3759, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3759, 0, 0, 0, 0, 0, 0, 0, 3759,
+ 3760, 3760, 3760, 3760, 0, 0, 3760, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3760, 0, 0, 0,
+ 0, 0, 3760, 0, 0, 0, 0, 0, 0, 3760,
+
+ 3760, 3761, 3761, 3761, 0, 0, 0, 3761, 0, 0,
+ 0, 0, 0, 0, 3761, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3761, 0, 0, 0, 0, 0, 0,
+ 3761, 3761, 3762, 3762, 3762, 0, 0, 0, 0, 0,
+ 0, 3762, 0, 0, 3762, 3762, 0, 3762, 3762, 3762,
+ 3762, 0, 0, 0, 3762, 0, 0, 0, 0, 0,
+ 0, 0, 3762, 3763, 3763, 3763, 0, 0, 0, 3763,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3763, 0, 0, 0, 0,
+ 0, 0, 0, 3763, 3764, 3764, 3764, 3764, 3764, 3764,
+
+ 3764, 3764, 3764, 3764, 3764, 3764, 3764, 0, 3764, 3764,
+ 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764,
+ 3764, 3764, 0, 3764, 3764, 3764, 3765, 3765, 3765, 0,
+ 0, 0, 3765, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3765, 0,
+ 0, 0, 0, 0, 0, 0, 3765, 3766, 3766, 3766,
+ 3766, 0, 0, 3766, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3766, 0, 0, 0, 0, 0, 3766,
+ 0, 0, 0, 0, 0, 0, 3766, 3766, 3767, 3767,
+ 3767, 0, 0, 0, 0, 0, 0, 3767, 0, 0,
+
+ 0, 0, 0, 3767, 3767, 0, 0, 0, 0, 0,
+ 3767, 0, 0, 0, 0, 0, 0, 0, 3767, 3771,
+ 0, 0, 0, 3771, 0, 3771, 0, 0, 3771, 0,
+ 0, 0, 3771, 0, 0, 0, 0, 0, 0, 0,
+ 3771, 3772, 3772, 0, 3772, 3772, 3772, 3772, 3772, 3772,
+ 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772,
+ 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772,
+ 3772, 3772, 3772, 3779, 3779, 3779, 0, 0, 0, 3779,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3779, 0, 0, 0, 0,
+
+ 3779, 0, 0, 3779, 3781, 3781, 3781, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3781, 0, 3781,
+ 3781, 0, 0, 0, 0, 0, 3781, 0, 3781, 0,
+ 0, 0, 0, 0, 3781, 3783, 3783, 0, 3783, 3783,
+ 3783, 3783, 3783, 3783, 0, 3783, 3783, 3783, 3783, 3783,
+ 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783,
+ 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3784, 3784, 3784,
+ 0, 0, 0, 3784, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3784,
+ 0, 0, 0, 0, 0, 0, 0, 3784, 3785, 3785,
+
+ 3785, 3785, 0, 0, 3785, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3785, 0, 0, 0, 0, 0,
+ 3785, 0, 0, 0, 0, 0, 0, 3785, 3785, 3786,
+ 3786, 3786, 0, 0, 0, 3786, 3786, 0, 0, 0,
+ 3786, 0, 0, 0, 0, 3786, 0, 0, 0, 0,
+ 0, 3786, 0, 0, 0, 3786, 0, 0, 0, 3786,
+ 3789, 3789, 3789, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3789, 3789, 0, 3789, 0,
+ 0, 0, 3789, 0, 0, 0, 0, 0, 0, 0,
+ 3789, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790,
+
+ 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790,
+ 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790,
+ 3790, 3790, 3790, 3791, 3791, 0, 3791, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3791, 0, 3791, 3791, 3791, 3791, 3791, 3791, 3791,
+ 3791, 3791, 3791, 3791, 3791, 3792, 3792, 3792, 0, 0,
+ 0, 3792, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3792, 0, 0,
+ 0, 0, 0, 0, 0, 3792, 3793, 3793, 3793, 3793,
+ 0, 0, 3793, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 3793, 0, 0, 0, 0, 0, 3793, 0,
+ 0, 0, 0, 0, 0, 3793, 3793, 3794, 3794, 3794,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3794, 3794, 0, 3794, 0, 0, 0, 3794,
+ 0, 0, 0, 0, 0, 0, 0, 3794, 3799, 3799,
+ 0, 0, 3799, 0, 0, 3799, 3799, 0, 3799, 3799,
+ 3799, 3799, 3799, 0, 3799, 3799, 3799, 3799, 3799, 3799,
+ 0, 3799, 3799, 3799, 3799, 3799, 0, 0, 3799, 3799,
+ 3800, 3800, 0, 3800, 3800, 3800, 3800, 3800, 3800, 3800,
+ 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800,
+
+ 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800,
+ 3800, 3800, 3801, 3801, 0, 3801, 3801, 3801, 3801, 3801,
+ 3801, 0, 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801,
+ 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801,
+ 3801, 3801, 3801, 3801, 3803, 3803, 3803, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3803, 0, 3803,
+ 3803, 0, 0, 0, 0, 0, 3803, 0, 0, 0,
+ 0, 0, 0, 0, 3803, 3804, 3804, 3804, 0, 0,
+ 0, 3804, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3804, 0, 0,
+
+ 0, 0, 0, 0, 0, 3804, 3805, 3805, 3805, 3805,
+ 0, 0, 3805, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3805, 0, 0, 0, 0, 0, 3805, 0,
+ 0, 0, 0, 0, 0, 3805, 3805, 3806, 3806, 3806,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3806, 3806, 0, 0, 0, 0, 0, 3806,
+ 0, 0, 0, 0, 0, 0, 0, 3806, 3807, 3807,
+ 0, 3807, 3807, 0, 0, 3807, 3807, 0, 3807, 3807,
+ 3807, 3807, 3807, 0, 3807, 3807, 3807, 3807, 3807, 3807,
+ 0, 3807, 3807, 0, 3807, 3807, 0, 0, 3807, 3807,
+
+ 3808, 3808, 0, 3808, 3808, 3808, 3808, 3808, 3808, 0,
+ 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808,
+ 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808,
+ 3808, 3808, 3809, 3809, 0, 3809, 3809, 3809, 3809, 3809,
+ 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809,
+ 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809,
+ 3809, 3809, 3809, 3809, 3810, 3810, 0, 3810, 3810, 3810,
+ 3810, 3810, 3810, 3810, 3810, 3810, 0, 3810, 3810, 3810,
+ 3810, 3810, 3810, 3810, 3810, 3810, 3810, 3810, 3810, 3810,
+ 3810, 3810, 3810, 3810, 3810, 3810, 3811, 3811, 3811, 3811,
+
+ 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811,
+ 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811,
+ 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3812, 3812,
+ 0, 3812, 3812, 0, 3812, 3812, 3812, 3812, 3812, 3812,
+ 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812,
+ 3812, 3812, 0, 3812, 0, 3812, 3812, 3812, 3812, 3812,
+ 3813, 3813, 0, 3813, 3813, 3813, 3813, 3813, 3813, 3813,
+ 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813,
+ 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813,
+ 3813, 3813, 3816, 0, 0, 0, 3816, 3816, 3816, 3816,
+
+ 3816, 3816, 3816, 3816, 0, 3816, 0, 0, 3816, 3816,
+ 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816,
+ 3816, 3816, 3816, 3816, 3818, 0, 3818, 0, 0, 0,
+ 0, 0, 0, 3818, 0, 3818, 0, 0, 0, 0,
+ 0, 3818, 3820, 3820, 3820, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3820, 0, 3820, 0, 0,
+ 0, 0, 0, 0, 3820, 0, 0, 0, 0, 0,
+ 0, 0, 3820, 3822, 3822, 3822, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3822, 0,
+ 0, 0, 0, 0, 0, 3822, 0, 3822, 0, 0,
+
+ 0, 0, 0, 3822, 3825, 3825, 0, 3825, 3825, 3825,
+ 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825,
+ 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825,
+ 3825, 3825, 3825, 3825, 3825, 3825, 3827, 0, 0, 0,
+ 3827, 0, 0, 0, 0, 0, 0, 3827, 0, 0,
+ 0, 0, 0, 0, 3827, 0, 0, 0, 0, 0,
+ 0, 0, 3827, 3830, 3830, 0, 3830, 3830, 0, 3830,
+ 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830,
+ 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830,
+ 3830, 3830, 3830, 3830, 3830, 3833, 3833, 3833, 3833, 3833,
+
+ 3833, 3833, 3833, 3833, 3833, 3833, 0, 3833, 3833, 3833,
+ 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833,
+ 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3835, 3835, 3835,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3835, 3835, 0, 0, 0, 0, 0, 3835,
+ 0, 0, 0, 0, 0, 0, 0, 3835, 3836, 3836,
+ 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 0,
+ 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836,
+ 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836,
+ 3838, 3838, 0, 3838, 0, 0, 0, 3838, 0, 0,
+
+ 0, 0, 0, 0, 0, 3838, 3845, 3845, 0, 3845,
+ 3845, 3845, 3845, 3845, 3845, 0, 3845, 3845, 3845, 3845,
+ 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845,
+ 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3845, 3846, 3846,
+ 3846, 0, 0, 0, 3846, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3846, 0, 0, 0, 0, 0, 0, 0, 3846, 3847,
+ 3847, 3847, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3847, 0, 0, 0, 3847, 0, 0, 0, 0, 0,
+ 0, 3847, 0, 0, 0, 0, 0, 0, 0, 3847,
+
+ 3848, 3848, 3848, 0, 0, 0, 3848, 3848, 0, 0,
+ 0, 3848, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3848, 0, 0, 0, 0, 0, 0, 0,
+ 3848, 3849, 3849, 3849, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3849, 0, 0, 0,
+ 0, 0, 0, 3849, 3849, 0, 0, 0, 0, 0,
+ 0, 3849, 3850, 3850, 3850, 0, 0, 0, 3850, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3850, 0, 0, 0, 0, 0,
+ 0, 0, 3850, 3851, 3851, 3851, 3851, 0, 0, 3851,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3851,
+ 0, 0, 0, 0, 0, 3851, 0, 0, 0, 0,
+ 0, 0, 3851, 3851, 3852, 3852, 3852, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3852,
+ 3852, 0, 0, 0, 0, 0, 3852, 0, 0, 0,
+ 0, 0, 0, 0, 3852, 3853, 3853, 0, 3853, 3853,
+ 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853,
+ 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853,
+ 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3854, 0, 0,
+ 0, 3854, 0, 0, 3854, 3854, 0, 0, 0, 3854,
+
+ 3854, 3854, 0, 3854, 3854, 3854, 3854, 3854, 3854, 3854,
+ 3854, 3854, 3854, 3854, 3854, 3854, 3854, 3854, 3854, 3855,
+ 3855, 0, 3855, 3855, 3855, 3855, 3855, 3855, 0, 3855,
+ 3855, 3855, 3855, 3855, 3855, 3855, 3855, 3855, 3855, 3855,
+ 3855, 3855, 3855, 3855, 3855, 3855, 3855, 3855, 3855, 3855,
+ 3855, 3860, 3860, 0, 3860, 3860, 3860, 3860, 3860, 3860,
+ 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860,
+ 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860,
+ 3860, 3860, 3860, 3861, 3861, 0, 3861, 3861, 3861, 3861,
+ 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+
+ 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861,
+ 3861, 3861, 3861, 3861, 3861, 3862, 3862, 0, 3862, 3862,
+ 0, 3862, 3862, 3862, 0, 0, 0, 3862, 3862, 3862,
+ 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3862,
+ 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3863, 3863, 0,
+ 3863, 3863, 3863, 3863, 3863, 3863, 0, 3863, 3863, 3863,
+ 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863,
+ 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3864,
+ 3864, 0, 3864, 3864, 0, 3864, 3864, 3864, 0, 3864,
+ 3864, 3864, 3864, 3864, 0, 3864, 3864, 3864, 3864, 3864,
+
+ 3864, 3864, 3864, 3864, 3864, 3864, 3864, 0, 0, 3864,
+ 3864, 3865, 3865, 0, 3865, 3865, 3865, 3865, 3865, 3865,
+ 0, 3865, 3865, 3865, 3865, 3865, 3865, 3865, 3865, 3865,
+ 3865, 3865, 3865, 3865, 3865, 3865, 3865, 3865, 3865, 3865,
+ 3865, 3865, 3865, 3866, 3866, 0, 3866, 3866, 0, 3866,
+ 3866, 3866, 0, 0, 0, 3866, 3866, 3866, 0, 3866,
+ 3866, 3866, 3866, 3866, 3866, 3866, 3866, 3866, 3866, 3866,
+ 3866, 3866, 3866, 3866, 3866, 3867, 3867, 0, 3867, 3867,
+ 3867, 3867, 3867, 3867, 0, 3867, 3867, 3867, 3867, 3867,
+ 3867, 3867, 3867, 3867, 3867, 3867, 3867, 3867, 3867, 3867,
+
+ 3867, 3867, 3867, 3867, 3867, 3867, 3867, 3868, 3868, 0,
+ 3868, 3868, 0, 3868, 3868, 3868, 0, 3868, 3868, 3868,
+ 3868, 3868, 0, 3868, 3868, 3868, 3868, 3868, 3868, 3868,
+ 3868, 3868, 3868, 3868, 3868, 0, 0, 3868, 3868, 3869,
+ 3869, 0, 3869, 3869, 3869, 3869, 3869, 3869, 0, 3869,
+ 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869,
+ 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869,
+ 3869, 3871, 3871, 0, 3871, 3871, 3871, 3871, 3871, 3871,
+ 0, 3871, 3871, 3871, 3871, 3871, 3871, 3871, 3871, 3871,
+ 3871, 3871, 3871, 3871, 3871, 3871, 3871, 3871, 3871, 3871,
+
+ 3871, 3871, 3871, 3873, 3873, 0, 3873, 3873, 0, 3873,
+ 3873, 3873, 0, 3873, 3873, 3873, 3873, 3873, 3873, 3873,
+ 3873, 3873, 3873, 3873, 3873, 3873, 3873, 3873, 0, 3873,
+ 3873, 3873, 3873, 3873, 3873, 3874, 3874, 0, 3874, 3874,
+ 3874, 3874, 3874, 3874, 3874, 3874, 3874, 3874, 3874, 3874,
+ 3874, 3874, 3874, 3874, 3874, 3874, 3874, 3874, 3874, 3874,
+ 3874, 3874, 3874, 3874, 3874, 3874, 3874, 3875, 3875, 0,
+ 3875, 3875, 0, 3875, 3875, 3875, 0, 0, 0, 3875,
+ 3875, 3875, 0, 3875, 3875, 3875, 3875, 3875, 3875, 3875,
+ 3875, 3875, 3875, 3875, 3875, 3875, 3875, 3875, 3875, 3876,
+
+ 3876, 0, 3876, 3876, 3876, 3876, 3876, 3876, 3876, 3876,
+ 3876, 0, 3876, 3876, 3876, 3876, 3876, 3876, 3876, 3876,
+ 3876, 0, 3876, 3876, 0, 3876, 3876, 3876, 3876, 3876,
+ 3876, 3877, 3877, 0, 3877, 3877, 3877, 3877, 3877, 3877,
+ 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877,
+ 3877, 3877, 3877, 0, 3877, 3877, 0, 3877, 3877, 3877,
+ 3877, 3877, 3877, 3878, 3878, 3878, 0, 0, 0, 3878,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3878, 3878, 0, 0, 0,
+ 0, 0, 0, 3878, 3880, 3880, 3880, 0, 0, 0,
+
+ 0, 0, 0, 0, 3880, 0, 3880, 0, 0, 3880,
+ 0, 0, 0, 0, 0, 0, 3880, 0, 0, 0,
+ 0, 0, 0, 0, 3880, 3881, 3881, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3881,
+ 3881, 3881, 3881, 3881, 3881, 3881, 3881, 3882, 3882, 3882,
+ 0, 0, 0, 3882, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3882,
+ 0, 0, 0, 0, 0, 0, 0, 3882, 3884, 3884,
+ 3884, 0, 0, 0, 0, 0, 0, 3884, 0, 0,
+
+ 0, 0, 0, 3884, 0, 0, 0, 0, 0, 0,
+ 3884, 0, 0, 0, 0, 0, 0, 0, 3884, 3885,
+ 0, 0, 0, 0, 0, 3885, 3885, 0, 0, 0,
+ 3885, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3885, 0, 0, 0, 0, 0, 0, 0, 3885,
+ 3886, 3886, 3886, 0, 0, 0, 3886, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3886, 0, 0, 0, 0, 0, 0, 0,
+ 3886, 3887, 3887, 3887, 3887, 0, 0, 3887, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3887, 0, 0,
+
+ 0, 0, 0, 3887, 0, 0, 0, 0, 0, 0,
+ 3887, 3887, 3888, 3888, 3888, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3888, 3888, 0,
+ 0, 0, 0, 0, 3888, 0, 0, 0, 0, 0,
+ 0, 0, 3888, 3889, 3889, 3889, 3889, 3889, 3889, 3889,
+ 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889,
+ 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889,
+ 3889, 3889, 3889, 3889, 3889, 3890, 3890, 0, 3890, 3890,
+ 3890, 3890, 3890, 3890, 3890, 3890, 3890, 0, 3890, 3890,
+ 0, 3890, 3890, 3890, 3890, 3890, 3890, 0, 3890, 3890,
+
+ 0, 3890, 3890, 3890, 3890, 3890, 3890, 3891, 3891, 3891,
+ 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891,
+ 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891,
+ 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3892,
+ 3892, 0, 3892, 3892, 3892, 3892, 0, 3892, 3892, 3892,
+ 3892, 0, 3892, 3892, 0, 3892, 3892, 3892, 0, 3892,
+ 3892, 0, 3892, 3892, 0, 0, 3892, 3892, 3892, 3892,
+ 3892, 3893, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3893, 0, 0, 0, 0, 0, 3893, 0, 0, 0,
+ 0, 0, 0, 3893, 0, 0, 0, 0, 0, 0,
+
+ 0, 3893, 3894, 3894, 3894, 0, 0, 0, 3894, 0,
+ 0, 0, 0, 0, 0, 3894, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3894, 0, 0, 0, 0, 0,
+ 0, 3894, 3894, 3895, 3895, 3895, 0, 0, 0, 3895,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3895, 0, 0, 0, 0,
+ 0, 0, 0, 3895, 3896, 3896, 3896, 0, 0, 0,
+ 0, 0, 0, 3896, 0, 0, 3896, 0, 0, 3896,
+ 0, 3896, 3896, 0, 0, 0, 3896, 0, 0, 0,
+ 0, 0, 0, 0, 3896, 3898, 3898, 3898, 0, 0,
+
+ 0, 0, 0, 0, 3898, 0, 0, 3898, 3898, 0,
+ 3898, 3898, 3898, 3898, 0, 0, 0, 3898, 0, 0,
+ 0, 0, 0, 0, 0, 3898, 3899, 3899, 3899, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3899,
+ 0, 3899, 0, 0, 0, 0, 0, 0, 3899, 0,
+ 0, 0, 0, 0, 0, 0, 3899, 3900, 3900, 3900,
+ 0, 0, 0, 3900, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3900,
+ 0, 0, 0, 0, 0, 0, 0, 3900, 3901, 3901,
+ 3901, 0, 0, 0, 3901, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3901, 0, 0, 0, 0, 0, 0, 0, 3901, 3902,
+ 3902, 3902, 0, 0, 0, 0, 0, 0, 3902, 0,
+ 0, 3902, 0, 0, 3902, 0, 3902, 3902, 0, 0,
+ 0, 3902, 0, 0, 0, 0, 0, 0, 0, 3902,
+ 3903, 3903, 3903, 3903, 3903, 3903, 3903, 3903, 3903, 3903,
+ 3903, 3903, 3903, 0, 3903, 3903, 3903, 3903, 3903, 3903,
+ 3903, 3903, 3903, 3903, 3903, 3903, 3903, 3903, 0, 3903,
+ 3903, 3903, 3904, 3904, 3904, 0, 0, 0, 3904, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 3904, 0, 0, 0, 0, 0,
+ 0, 0, 3904, 3905, 3905, 3905, 0, 0, 0, 0,
+ 0, 0, 3905, 0, 0, 0, 0, 0, 3905, 0,
+ 0, 0, 0, 0, 0, 3905, 0, 0, 0, 0,
+ 0, 0, 0, 3905, 3907, 3907, 3907, 0, 0, 0,
+ 0, 0, 0, 3907, 0, 0, 0, 0, 0, 3907,
+ 3907, 0, 0, 0, 0, 0, 3907, 0, 0, 0,
+ 0, 0, 0, 0, 3907, 3909, 0, 0, 0, 3909,
+ 0, 3909, 0, 0, 3909, 0, 0, 0, 3909, 0,
+ 0, 0, 0, 0, 0, 0, 3909, 3912, 3912, 0,
+
+ 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
+ 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912,
+ 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3916,
+ 3916, 3916, 0, 0, 0, 3916, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3916, 0, 0, 0, 0, 3916, 0, 0, 3916,
+ 3917, 3917, 3917, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3917, 0, 3917, 3917, 0, 0, 0,
+ 0, 0, 3917, 0, 0, 0, 0, 0, 0, 0,
+ 3917, 3918, 3918, 3918, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 3918, 0, 3918, 3918, 0, 0,
+ 0, 0, 0, 3918, 0, 3918, 0, 0, 0, 0,
+ 0, 3918, 3919, 3919, 3919, 0, 0, 0, 3919, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3919, 0, 0, 0, 0, 0,
+ 0, 0, 3919, 3923, 3923, 0, 3923, 3923, 3923, 3923,
+ 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923,
+ 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923, 0, 3923,
+ 3923, 3923, 3923, 3923, 3923, 3924, 3924, 0, 3924, 3924,
+ 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924,
+
+ 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3924,
+ 3924, 3924, 3924, 3924, 3924, 3924, 3924, 3925, 3925, 3925,
+ 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925,
+ 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925,
+ 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3925, 3926,
+ 3926, 3926, 0, 0, 0, 3926, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3926, 0, 0, 0, 0, 0, 0, 0, 3926,
+ 3927, 3927, 3927, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3927, 0, 0, 3927, 0,
+
+ 0, 0, 3927, 0, 0, 0, 0, 0, 0, 0,
+ 3927, 3929, 3929, 3929, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3929, 3929, 0, 3929,
+ 0, 0, 0, 3929, 0, 0, 0, 0, 0, 0,
+ 0, 3929, 3930, 3930, 0, 3930, 3930, 3930, 3930, 3930,
+ 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930,
+ 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930,
+ 3930, 3930, 3930, 3930, 3931, 3931, 3931, 0, 0, 0,
+ 3931, 3931, 0, 0, 0, 3931, 0, 0, 0, 0,
+ 3931, 0, 0, 0, 0, 0, 3931, 0, 0, 0,
+
+ 3931, 0, 0, 0, 3931, 3932, 3932, 3932, 0, 0,
+ 0, 0, 0, 0, 0, 3932, 3932, 0, 0, 0,
+ 3932, 3932, 0, 3932, 0, 0, 0, 3932, 0, 0,
+ 0, 0, 0, 0, 0, 3932, 3936, 3936, 3936, 0,
+ 0, 0, 0, 0, 0, 3936, 0, 0, 0, 3936,
+ 0, 3936, 0, 0, 0, 0, 0, 0, 3936, 0,
+ 0, 0, 0, 0, 0, 0, 3936, 3937, 3937, 0,
+ 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937,
+ 3937, 3937, 3937, 3937, 3937, 3937, 0, 3937, 3937, 3937,
+ 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3938,
+
+ 3938, 3938, 0, 0, 0, 3938, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3938, 0, 0, 0, 0, 0, 0, 0, 3938,
+ 3939, 3939, 3939, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3939, 0, 0, 3939, 0,
+ 0, 0, 3939, 0, 0, 0, 0, 0, 0, 0,
+ 3939, 3941, 3941, 3941, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3941, 3941, 0, 3941,
+ 0, 0, 0, 3941, 0, 0, 0, 0, 0, 0,
+ 0, 3941, 3944, 3944, 0, 0, 3944, 0, 0, 3944,
+
+ 3944, 0, 3944, 3944, 3944, 3944, 3944, 0, 3944, 3944,
+ 3944, 3944, 3944, 3944, 0, 3944, 3944, 3944, 3944, 3944,
+ 0, 0, 3944, 3944, 3945, 3945, 0, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3946, 3946, 0, 3946,
+ 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946,
+ 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946,
+ 3946, 0, 3946, 3946, 3946, 3946, 3946, 3946, 3947, 3947,
+ 0, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947,
+
+ 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947,
+ 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947,
+ 3948, 3948, 0, 3948, 3948, 3948, 3948, 3948, 3948, 3948,
+ 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948,
+ 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948,
+ 3948, 3948, 3949, 3949, 3949, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3949, 0, 3949, 3949, 0,
+ 0, 0, 0, 0, 3949, 0, 0, 0, 0, 0,
+ 0, 0, 3949, 3950, 3950, 3950, 0, 0, 0, 3950,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 3950, 0, 0, 0, 0,
+ 0, 0, 0, 3950, 3951, 3951, 3951, 0, 0, 0,
+ 3951, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3951, 0, 0, 0,
+ 0, 0, 0, 0, 3951, 3954, 3954, 3954, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3954, 3954, 0, 0, 0, 0, 0, 3954, 0, 0,
+ 0, 0, 0, 0, 0, 3954, 3955, 3955, 0, 3955,
+ 3955, 0, 0, 3955, 3955, 0, 3955, 3955, 3955, 3955,
+ 3955, 0, 3955, 3955, 3955, 3955, 3955, 3955, 0, 3955,
+
+ 3955, 0, 3955, 3955, 0, 0, 3955, 3955, 3956, 3956,
+ 0, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+ 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+ 3956, 3956, 3956, 0, 3956, 3956, 3956, 3956, 3956, 3956,
+ 3957, 3957, 0, 3957, 3957, 3957, 3957, 3957, 3957, 3957,
+ 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957,
+ 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957,
+ 3957, 3957, 3958, 3958, 0, 3958, 3958, 3958, 3958, 3958,
+ 3958, 3958, 3958, 3958, 0, 3958, 3958, 3958, 3958, 3958,
+ 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958,
+
+ 3958, 3958, 3958, 3958, 3959, 3959, 3959, 3959, 3959, 3959,
+ 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959,
+ 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959,
+ 3959, 3959, 3959, 3959, 3959, 3959, 3960, 3960, 0, 3960,
+ 3960, 0, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960,
+ 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960,
+ 0, 3960, 0, 3960, 3960, 3960, 3960, 3960, 3961, 3961,
+ 0, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961,
+ 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961,
+ 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961,
+
+ 3963, 0, 0, 0, 3963, 3963, 3963, 3963, 3963, 3963,
+ 3963, 3963, 0, 3963, 0, 0, 3963, 3963, 3963, 3963,
+ 3963, 3963, 3963, 3963, 3963, 3963, 3963, 3963, 3963, 3963,
+ 3963, 3963, 3964, 0, 3964, 0, 0, 0, 0, 0,
+ 0, 3964, 0, 3964, 0, 0, 0, 0, 0, 3964,
+ 3966, 3966, 3966, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3966, 0, 3966, 0, 0, 0, 0,
+ 0, 0, 3966, 0, 0, 0, 0, 0, 0, 0,
+ 3966, 3967, 3967, 3967, 0, 0, 0, 3967, 0, 0,
+ 0, 0, 3967, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 3967, 0, 0, 0, 0, 0, 0,
+ 0, 3967, 3968, 3968, 3968, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3968, 0, 0,
+ 0, 0, 0, 0, 3968, 0, 3968, 0, 0, 0,
+ 0, 0, 3968, 3969, 3969, 3969, 0, 0, 0, 3969,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3969, 0, 0, 0, 0,
+ 0, 0, 0, 3969, 3971, 3971, 0, 3971, 3971, 3971,
+ 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971,
+ 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971,
+
+ 3971, 3971, 3971, 3971, 3971, 3971, 3972, 0, 0, 0,
+ 3972, 0, 0, 0, 0, 0, 0, 3972, 0, 0,
+ 0, 0, 0, 0, 3972, 0, 0, 0, 0, 0,
+ 0, 0, 3972, 3974, 3974, 0, 3974, 3974, 0, 3974,
+ 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974,
+ 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974,
+ 3974, 3974, 3974, 3974, 3974, 3976, 3976, 3976, 3976, 3976,
+ 3976, 3976, 3976, 3976, 3976, 3976, 0, 3976, 3976, 3976,
+ 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3976,
+ 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3977, 3977, 3977,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3977, 3977, 0, 0, 0, 0, 0, 3977,
+ 0, 0, 0, 0, 0, 0, 0, 3977, 3978, 3978,
+ 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 0,
+ 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978,
+ 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978,
+ 3979, 3979, 0, 3979, 0, 0, 0, 3979, 0, 0,
+ 0, 0, 0, 0, 0, 3979, 3980, 0, 0, 0,
+ 0, 0, 0, 3980, 0, 0, 0, 3980, 3980, 0,
+ 0, 3980, 0, 0, 0, 0, 3980, 0, 3980, 3984,
+
+ 3984, 0, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984,
+ 3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984, 3984,
+ 3984, 3984, 3984, 3984, 0, 3984, 3984, 3984, 3984, 3984,
+ 3984, 3985, 3985, 0, 3985, 3985, 3985, 3985, 3985, 3985,
+ 3985, 3985, 3985, 3985, 3985, 3985, 3985, 3985, 3985, 3985,
+ 3985, 3985, 3985, 3985, 3985, 3985, 3985, 3985, 3985, 3985,
+ 3985, 3985, 3985, 3986, 3986, 3986, 0, 0, 0, 3986,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3986, 0, 0, 0, 0,
+ 0, 0, 0, 3986, 3987, 3987, 3987, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 3987, 0, 0, 0, 3987,
+ 0, 0, 0, 0, 0, 0, 3987, 0, 0, 0,
+ 0, 0, 0, 0, 3987, 3988, 3988, 3988, 0, 0,
+ 0, 3988, 3988, 0, 0, 0, 3988, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3988, 0, 0,
+ 0, 0, 0, 0, 0, 3988, 3989, 3989, 3989, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3989, 0, 0, 0, 0, 0, 0, 3989, 3989,
+ 0, 0, 0, 0, 0, 0, 3989, 3990, 3990, 0,
+ 3990, 3990, 3990, 3990, 3990, 3990, 3990, 3990, 3990, 3990,
+
+ 3990, 3990, 3990, 3990, 3990, 3990, 3990, 3990, 3990, 3990,
+ 3990, 3990, 3990, 3990, 3990, 3990, 3990, 3990, 3990, 3991,
+ 3991, 3991, 0, 0, 0, 3991, 0, 0, 0, 0,
+ 3991, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3991, 0, 0, 0, 0, 0, 0, 0, 3991,
+ 3992, 3992, 3992, 0, 0, 0, 3992, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3992, 0, 0, 0, 0, 0, 0, 0,
+ 3992, 3995, 3995, 3995, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3995, 3995, 0, 0,
+
+ 0, 0, 0, 3995, 0, 0, 0, 0, 0, 0,
+ 0, 3995, 3996, 3996, 0, 3996, 3996, 3996, 3996, 3996,
+ 3996, 3996, 3996, 3996, 3996, 3996, 3996, 3996, 3996, 3996,
+ 3996, 3996, 3996, 3996, 3996, 3996, 3996, 3996, 3996, 3996,
+ 3996, 3996, 3996, 3996, 3997, 0, 0, 0, 3997, 0,
+ 0, 3997, 3997, 0, 0, 0, 3997, 3997, 3997, 0,
+ 3997, 3997, 3997, 3997, 3997, 3997, 3997, 3997, 3997, 3997,
+ 3997, 3997, 3997, 3997, 3997, 3997, 3998, 3998, 0, 3998,
+ 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998,
+ 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998,
+
+ 3998, 0, 3998, 3998, 3998, 3998, 3998, 3998, 3999, 3999,
+ 0, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999,
+ 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999,
+ 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999,
+ 4002, 4002, 0, 4002, 4002, 0, 4002, 4002, 4002, 0,
+ 0, 0, 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002,
+ 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002, 4002,
+ 4002, 4002, 4003, 4003, 0, 4003, 4003, 4003, 4003, 4003,
+ 4003, 4003, 4003, 4003, 4003, 4003, 4003, 4003, 4003, 4003,
+ 4003, 4003, 4003, 4003, 4003, 4003, 4003, 0, 4003, 4003,
+
+ 4003, 4003, 4003, 4003, 4004, 4004, 0, 4004, 4004, 4004,
+ 4004, 4004, 4004, 4004, 4004, 4004, 4004, 4004, 4004, 4004,
+ 4004, 4004, 4004, 4004, 4004, 4004, 4004, 4004, 4004, 4004,
+ 4004, 4004, 4004, 4004, 4004, 4004, 4005, 4005, 0, 4005,
+ 4005, 0, 4005, 4005, 4005, 0, 4005, 4005, 4005, 4005,
+ 4005, 0, 4005, 4005, 4005, 4005, 4005, 4005, 4005, 4005,
+ 4005, 4005, 4005, 4005, 0, 0, 4005, 4005, 4006, 4006,
+ 0, 4006, 4006, 4006, 4006, 4006, 4006, 4006, 4006, 4006,
+ 4006, 4006, 4006, 4006, 4006, 4006, 4006, 4006, 4006, 4006,
+ 4006, 4006, 4006, 0, 4006, 4006, 4006, 4006, 4006, 4006,
+
+ 4007, 4007, 0, 4007, 4007, 4007, 4007, 4007, 4007, 4007,
+ 4007, 4007, 4007, 4007, 4007, 4007, 4007, 4007, 4007, 4007,
+ 4007, 4007, 4007, 4007, 4007, 4007, 4007, 4007, 4007, 4007,
+ 4007, 4007, 4008, 4008, 0, 4008, 4008, 0, 4008, 4008,
+ 4008, 0, 0, 0, 4008, 4008, 4008, 0, 4008, 4008,
+ 4008, 4008, 4008, 4008, 4008, 4008, 4008, 4008, 4008, 4008,
+ 4008, 4008, 4008, 4008, 4009, 4009, 0, 4009, 4009, 4009,
+ 4009, 4009, 4009, 4009, 4009, 4009, 4009, 4009, 4009, 4009,
+ 4009, 4009, 4009, 4009, 4009, 4009, 4009, 4009, 4009, 0,
+ 4009, 4009, 4009, 4009, 4009, 4009, 4010, 4010, 0, 4010,
+
+ 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010,
+ 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010,
+ 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4011, 4011,
+ 0, 4011, 4011, 0, 4011, 4011, 4011, 0, 4011, 4011,
+ 4011, 4011, 4011, 0, 4011, 4011, 4011, 4011, 4011, 4011,
+ 4011, 4011, 4011, 4011, 4011, 4011, 0, 0, 4011, 4011,
+ 4012, 4012, 0, 4012, 4012, 4012, 4012, 4012, 4012, 4012,
+ 4012, 4012, 4012, 4012, 4012, 4012, 4012, 4012, 4012, 4012,
+ 4012, 4012, 4012, 4012, 4012, 0, 4012, 4012, 4012, 4012,
+ 4012, 4012, 4013, 4013, 0, 4013, 4013, 4013, 4013, 4013,
+
+ 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013,
+ 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013,
+ 4013, 4013, 4013, 4013, 4015, 4015, 0, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 0,
+ 4015, 4015, 4015, 4015, 4015, 4015, 4016, 4016, 0, 4016,
+ 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016,
+ 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016,
+ 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4017, 4017,
+ 0, 4017, 4017, 0, 4017, 4017, 4017, 0, 4017, 4017,
+
+ 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017, 4017,
+ 4017, 4017, 4017, 0, 4017, 4017, 4017, 4017, 4017, 4017,
+ 4018, 4018, 0, 4018, 4018, 0, 4018, 4018, 4018, 0,
+ 0, 0, 4018, 4018, 4018, 0, 4018, 4018, 4018, 4018,
+ 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018,
+ 4018, 4018, 4019, 4019, 0, 4019, 4019, 4019, 4019, 4019,
+ 4019, 4019, 4019, 4019, 0, 4019, 4019, 4019, 4019, 4019,
+ 4019, 4019, 4019, 4019, 0, 4019, 4019, 0, 4019, 4019,
+ 4019, 4019, 4019, 4019, 4020, 4020, 0, 4020, 4020, 4020,
+ 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020,
+
+ 4020, 4020, 4020, 4020, 4020, 4020, 0, 4020, 4020, 0,
+ 4020, 4020, 4020, 4020, 4020, 4020, 4021, 4021, 4021, 0,
+ 0, 0, 4021, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4021, 4021,
+ 0, 0, 0, 0, 0, 0, 4021, 4022, 4022, 4022,
+ 0, 0, 0, 0, 0, 0, 0, 4022, 0, 4022,
+ 0, 0, 4022, 0, 0, 0, 0, 0, 0, 4022,
+ 0, 0, 0, 0, 0, 0, 0, 4022, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+
+ 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023,
+ 4024, 4024, 4024, 0, 0, 0, 0, 0, 0, 0,
+ 4024, 0, 4024, 0, 0, 4024, 0, 0, 0, 0,
+ 0, 0, 4024, 0, 0, 0, 0, 0, 0, 0,
+ 4024, 4025, 4025, 4025, 0, 0, 0, 4025, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4025, 0, 0, 0, 0, 0, 0,
+ 0, 4025, 4026, 4026, 4026, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4026, 0, 0,
+ 0, 0, 0, 0, 4026, 0, 0, 0, 0, 0,
+
+ 0, 0, 4026, 4027, 4027, 4027, 0, 0, 0, 0,
+ 0, 0, 4027, 0, 0, 0, 0, 0, 4027, 0,
+ 0, 0, 0, 0, 0, 4027, 0, 0, 0, 0,
+ 0, 0, 0, 4027, 4030, 4030, 4030, 0, 0, 0,
+ 4030, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4030, 0, 0, 0,
+ 0, 0, 0, 0, 4030, 4033, 4033, 4033, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4033, 4033, 0, 0, 0, 0, 0, 4033, 0, 0,
+ 0, 0, 0, 0, 0, 4033, 4034, 4034, 4034, 4034,
+
+ 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034,
+ 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034,
+ 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4035, 4035,
+ 0, 4035, 4035, 4035, 4035, 4035, 4035, 4035, 4035, 4035,
+ 0, 4035, 4035, 0, 4035, 4035, 4035, 4035, 4035, 4035,
+ 0, 4035, 4035, 0, 4035, 4035, 4035, 4035, 4035, 4035,
+ 4037, 4037, 4037, 4037, 4037, 4037, 4037, 4037, 4037, 4037,
+ 4037, 4037, 4037, 4037, 4037, 0, 4037, 4037, 4037, 4037,
+ 4037, 4037, 4037, 4037, 4037, 4037, 4037, 4037, 4037, 4037,
+ 4037, 4037, 4038, 4038, 0, 4038, 4038, 4038, 4038, 0,
+
+ 4038, 4038, 4038, 4038, 0, 4038, 4038, 0, 4038, 4038,
+ 4038, 0, 4038, 4038, 0, 4038, 4038, 0, 0, 4038,
+ 4038, 4038, 4038, 4038, 4039, 4039, 4039, 0, 0, 0,
+ 0, 0, 0, 4039, 0, 0, 4039, 0, 0, 4039,
+ 0, 4039, 4039, 0, 0, 0, 4039, 0, 0, 0,
+ 0, 0, 0, 0, 4039, 4040, 4040, 4040, 0, 0,
+ 0, 0, 0, 0, 4040, 0, 0, 4040, 0, 0,
+ 4040, 4040, 4040, 4040, 0, 0, 0, 4040, 0, 0,
+ 0, 0, 0, 0, 0, 4040, 4041, 4041, 4041, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4041,
+
+ 0, 4041, 0, 0, 0, 0, 0, 0, 4041, 0,
+ 0, 0, 0, 0, 0, 0, 4041, 4042, 4042, 4042,
+ 0, 0, 0, 4042, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4042,
+ 0, 0, 0, 0, 0, 0, 0, 4042, 4044, 4044,
+ 4044, 4044, 0, 0, 4044, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4044, 0, 0, 0, 0, 0,
+ 4044, 0, 0, 0, 0, 0, 0, 4044, 4044, 4045,
+ 4045, 4045, 0, 0, 0, 0, 0, 0, 4045, 0,
+ 0, 4045, 0, 0, 4045, 0, 4045, 4045, 0, 0,
+
+ 0, 4045, 0, 0, 0, 0, 0, 0, 0, 4045,
+ 4046, 4046, 4046, 0, 0, 0, 0, 0, 0, 4046,
+ 0, 0, 0, 0, 0, 4046, 0, 0, 0, 0,
+ 0, 0, 4046, 0, 0, 0, 0, 0, 0, 0,
+ 4046, 4047, 4047, 4047, 0, 0, 0, 0, 0, 0,
+ 4047, 0, 0, 0, 0, 0, 4047, 4047, 0, 0,
+ 0, 0, 0, 4047, 0, 0, 0, 0, 0, 0,
+ 0, 4047, 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048,
+ 4048, 4048, 4048, 4048, 0, 4048, 4048, 0, 4048, 4048,
+ 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048,
+
+ 4048, 4048, 4048, 4048, 4049, 4049, 4049, 4049, 4049, 4049,
+ 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 0,
+ 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049,
+ 4049, 4049, 4049, 4049, 4049, 4049, 4050, 4050, 4050, 4050,
+ 0, 0, 4050, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4050, 0, 0, 0, 0, 0, 4050, 0,
+ 0, 0, 0, 0, 0, 4050, 4050, 4051, 4051, 4051,
+ 0, 0, 0, 0, 0, 0, 4051, 0, 0, 0,
+ 0, 0, 4051, 4051, 0, 0, 0, 0, 0, 4051,
+ 0, 0, 0, 0, 0, 0, 0, 4051, 4055, 0,
+
+ 0, 0, 4055, 0, 4055, 0, 0, 4055, 0, 0,
+ 0, 4055, 0, 0, 0, 0, 0, 0, 0, 4055,
+ 4056, 4056, 4056, 4056, 0, 0, 4056, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4056, 0, 0, 0,
+ 0, 0, 4056, 0, 0, 0, 0, 0, 0, 4056,
+ 4056, 4057, 4057, 4057, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4057, 0, 4057, 4057, 0, 0,
+ 0, 0, 0, 4057, 0, 0, 0, 0, 0, 0,
+ 0, 4057, 4058, 4058, 4058, 0, 0, 0, 4058, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 4058, 0, 0, 0, 0, 0,
+ 0, 0, 4058, 4059, 4059, 4059, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4059, 4059,
+ 0, 0, 0, 0, 0, 4059, 0, 0, 0, 0,
+ 0, 0, 0, 4059, 4063, 4063, 0, 4063, 4063, 4063,
+ 4063, 4063, 4063, 4063, 4063, 4063, 4063, 4063, 4063, 4063,
+ 4063, 4063, 4063, 4063, 4063, 4063, 4063, 4063, 4063, 0,
+ 4063, 4063, 4063, 4063, 4063, 4063, 4064, 4064, 4064, 4064,
+ 0, 0, 4064, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4064, 0, 0, 0, 0, 0, 4064, 0,
+
+ 0, 0, 0, 0, 0, 4064, 4064, 4065, 4065, 4065,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4065, 0, 0, 4065, 0, 0, 0, 4065,
+ 0, 0, 0, 0, 0, 0, 0, 4065, 4066, 4066,
+ 0, 4066, 4066, 4066, 4066, 4066, 4066, 4066, 4066, 4066,
+ 4066, 4066, 4066, 4066, 4066, 4066, 4066, 4066, 4066, 4066,
+ 4066, 4066, 4066, 4066, 4066, 4066, 4066, 4066, 4066, 4066,
+ 4067, 4067, 4067, 0, 0, 0, 4067, 4067, 0, 0,
+ 0, 4067, 0, 0, 0, 0, 4067, 0, 0, 0,
+ 0, 0, 4067, 0, 0, 0, 4067, 0, 0, 0,
+
+ 4067, 4068, 4068, 4068, 0, 0, 0, 4068, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4068, 0, 0,
+ 0, 0, 0, 4068, 0, 0, 0, 0, 0, 0,
+ 0, 4068, 4069, 4069, 4069, 0, 0, 0, 4069, 0,
+ 0, 0, 4069, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4069, 0, 0, 0, 0, 0,
+ 0, 0, 4069, 4070, 4070, 4070, 0, 0, 0, 0,
+ 0, 0, 0, 4070, 4070, 0, 0, 0, 4070, 4070,
+ 0, 4070, 0, 0, 0, 4070, 0, 0, 0, 0,
+ 0, 0, 0, 4070, 4071, 0, 0, 0, 0, 0,
+
+ 0, 4071, 0, 0, 0, 4071, 4071, 0, 0, 4071,
+ 0, 0, 0, 0, 4071, 0, 4071, 4072, 4072, 4072,
+ 4072, 4072, 4072, 4072, 4072, 4072, 4072, 4072, 4072, 0,
+ 4072, 4072, 0, 4072, 4072, 4072, 4072, 4072, 4072, 4072,
+ 4072, 4072, 4072, 4072, 4072, 4072, 4072, 4072, 4072, 4073,
+ 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073,
+ 4073, 4073, 4073, 4073, 0, 4073, 4073, 4073, 4073, 4073,
+ 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073,
+ 4073, 4076, 4076, 4076, 0, 0, 0, 0, 0, 0,
+ 4076, 0, 0, 0, 4076, 0, 4076, 0, 0, 0,
+
+ 0, 0, 0, 4076, 0, 0, 0, 0, 0, 0,
+ 0, 4076, 4077, 4077, 4077, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4077, 4077, 0,
+ 4077, 0, 0, 0, 4077, 0, 0, 0, 0, 0,
+ 0, 0, 4077, 4078, 4078, 4078, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4078, 0,
+ 0, 4078, 0, 0, 0, 4078, 0, 0, 0, 0,
+ 0, 0, 0, 4078, 4079, 4079, 4079, 4079, 0, 0,
+ 4079, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4079, 0, 0, 0, 0, 0, 4079, 0, 0, 0,
+
+ 0, 0, 0, 4079, 4079, 4081, 4081, 4081, 4081, 4081,
+ 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081,
+ 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081,
+ 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4082, 4082, 0,
+ 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082,
+ 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082,
+ 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4082, 4083,
+ 4083, 0, 4083, 4083, 4083, 4083, 4083, 4083, 4083, 4083,
+ 4083, 4083, 4083, 4083, 4083, 4083, 4083, 4083, 4083, 4083,
+ 4083, 4083, 4083, 4083, 0, 4083, 4083, 4083, 4083, 4083,
+
+ 4083, 4084, 4084, 0, 4084, 4084, 4084, 4084, 4084, 4084,
+ 4084, 4084, 4084, 4084, 4084, 4084, 4084, 4084, 4084, 4084,
+ 4084, 4084, 4084, 4084, 4084, 4084, 4084, 4084, 4084, 4084,
+ 4084, 4084, 4084, 4085, 4085, 4085, 0, 0, 0, 4085,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4085, 0, 0, 0, 0,
+ 0, 0, 0, 4085, 4086, 4086, 4086, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4086, 0, 4086,
+ 4086, 0, 0, 0, 0, 0, 4086, 0, 0, 0,
+ 0, 0, 0, 0, 4086, 4087, 4087, 4087, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 4087, 0,
+ 4087, 4087, 0, 0, 0, 0, 0, 4087, 0, 0,
+ 0, 0, 0, 0, 0, 4087, 4089, 4089, 4089, 4089,
+ 0, 0, 4089, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4089, 0, 0, 0, 0, 0, 4089, 0,
+ 0, 0, 0, 0, 0, 4089, 4089, 4090, 4090, 0,
+ 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090,
+ 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090,
+ 4090, 4090, 0, 4090, 4090, 4090, 4090, 4090, 4090, 4092,
+ 0, 0, 0, 4092, 4092, 4092, 4092, 4092, 4092, 4092,
+
+ 4092, 0, 4092, 0, 0, 4092, 4092, 4092, 4092, 4092,
+ 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092,
+ 4092, 4094, 0, 4094, 0, 0, 0, 0, 0, 0,
+ 4094, 0, 4094, 0, 0, 0, 0, 0, 4094, 4095,
+ 4095, 4095, 0, 0, 0, 4095, 0, 0, 0, 0,
+ 4095, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4095, 0, 0, 0, 0, 0, 0, 0, 4095,
+ 4096, 4096, 4096, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4096, 0, 4096, 0, 0, 0, 0,
+ 0, 0, 4096, 0, 0, 0, 0, 0, 0, 0,
+
+ 4096, 4097, 4097, 4097, 0, 0, 0, 4097, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4097, 0, 0, 0, 0, 0, 0,
+ 0, 4097, 4099, 0, 0, 0, 0, 0, 0, 4099,
+ 0, 0, 0, 4099, 4099, 0, 0, 4099, 0, 0,
+ 0, 0, 4099, 0, 4099, 4100, 4100, 0, 4100, 0,
+ 0, 0, 4100, 0, 0, 0, 0, 0, 0, 0,
+ 4100, 4101, 4101, 0, 4101, 4101, 4101, 4101, 4101, 4101,
+ 4101, 4101, 4101, 4101, 4101, 4101, 4101, 4101, 4101, 4101,
+ 4101, 4101, 4101, 4101, 4101, 4101, 0, 4101, 4101, 4101,
+
+ 4101, 4101, 4101, 4102, 4102, 0, 4102, 4102, 4102, 4102,
+ 4102, 4102, 4102, 4102, 4102, 4102, 4102, 4102, 4102, 4102,
+ 4102, 4102, 4102, 4102, 4102, 4102, 4102, 4102, 4102, 4102,
+ 4102, 4102, 4102, 4102, 4102, 4103, 4103, 4103, 0, 0,
+ 0, 4103, 0, 0, 0, 0, 4103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4103, 0, 0,
+ 0, 0, 0, 0, 0, 4103, 4104, 4104, 4104, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4104, 4104, 0, 0, 0, 0, 0, 4104, 0,
+ 0, 0, 0, 0, 0, 0, 4104, 4106, 4106, 4106,
+
+ 4106, 0, 0, 4106, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4106, 0, 0, 0, 0, 0, 4106,
+ 0, 0, 0, 0, 0, 0, 4106, 4106, 4107, 4107,
+ 0, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ 4107, 4107, 4107, 0, 4107, 4107, 4107, 4107, 4107, 4107,
+ 4109, 4109, 0, 4109, 4109, 4109, 4109, 4109, 4109, 4109,
+ 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4109,
+ 4109, 4109, 4109, 4109, 4109, 0, 4109, 4109, 4109, 4109,
+ 4109, 4109, 4110, 4110, 0, 4110, 4110, 4110, 4110, 4110,
+
+ 4110, 4110, 4110, 4110, 4110, 4110, 4110, 4110, 4110, 4110,
+ 4110, 4110, 4110, 4110, 4110, 4110, 4110, 0, 4110, 4110,
+ 4110, 4110, 4110, 4110, 4111, 4111, 0, 4111, 4111, 4111,
+ 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111,
+ 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, 0,
+ 4111, 4111, 4111, 4111, 4111, 4111, 4112, 4112, 0, 4112,
+ 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112,
+ 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112,
+ 4112, 0, 4112, 4112, 4112, 4112, 4112, 4112, 4113, 4113,
+ 0, 4113, 4113, 0, 4113, 4113, 4113, 0, 4113, 4113,
+
+ 4113, 4113, 4113, 0, 4113, 4113, 4113, 4113, 4113, 4113,
+ 4113, 4113, 4113, 4113, 4113, 4113, 0, 0, 4113, 4113,
+ 4114, 4114, 0, 4114, 4114, 4114, 4114, 4114, 4114, 4114,
+ 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4114,
+ 4114, 4114, 4114, 4114, 4114, 0, 4114, 4114, 4114, 4114,
+ 4114, 4114, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115,
+ 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 0, 4115,
+ 4115, 4115, 4115, 4115, 4115, 0, 4115, 4115, 4115, 4115,
+ 4115, 4115, 4115, 4115, 4116, 4116, 4116, 0, 0, 0,
+ 0, 0, 0, 0, 4116, 0, 4116, 0, 0, 4116,
+
+ 0, 0, 0, 0, 0, 0, 4116, 0, 0, 0,
+ 0, 0, 0, 0, 4116, 4117, 4117, 4117, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4117, 0, 0, 0, 0, 0, 0, 4117, 0, 0,
+ 0, 0, 0, 0, 0, 4117, 4120, 4120, 4120, 4120,
+ 0, 0, 4120, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4120, 0, 0, 0, 0, 0, 4120, 0,
+ 0, 0, 0, 0, 0, 4120, 4120, 4121, 4121, 0,
+ 4121, 4121, 4121, 4121, 4121, 4121, 4121, 4121, 4121, 0,
+ 4121, 4121, 0, 4121, 4121, 4121, 4121, 4121, 4121, 0,
+
+ 4121, 4121, 0, 4121, 4121, 4121, 4121, 4121, 4121, 4123,
+ 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123,
+ 4123, 4123, 4123, 4123, 0, 4123, 4123, 4123, 4123, 4123,
+ 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123,
+ 4123, 4124, 4124, 4124, 0, 0, 0, 0, 0, 0,
+ 4124, 0, 0, 4124, 0, 0, 4124, 4124, 4124, 4124,
+ 0, 0, 0, 4124, 0, 0, 0, 0, 0, 0,
+ 0, 4124, 4126, 4126, 4126, 0, 0, 0, 0, 0,
+ 0, 4126, 0, 0, 0, 0, 0, 4126, 4126, 0,
+ 0, 0, 0, 0, 4126, 0, 0, 0, 0, 0,
+
+ 0, 0, 4126, 4127, 4127, 4127, 0, 0, 0, 0,
+ 0, 0, 4127, 0, 0, 0, 0, 0, 4127, 4127,
+ 0, 0, 0, 0, 0, 4127, 0, 0, 0, 0,
+ 0, 0, 0, 4127, 4129, 0, 0, 0, 4129, 0,
+ 4129, 0, 0, 4129, 0, 0, 0, 4129, 0, 0,
+ 0, 0, 0, 0, 0, 4129, 4130, 4130, 4130, 4130,
+ 0, 0, 4130, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4130, 0, 0, 0, 0, 0, 4130, 0,
+ 0, 0, 0, 0, 0, 4130, 4130, 4131, 4131, 4131,
+ 0, 0, 0, 4131, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4131,
+ 0, 0, 0, 0, 0, 0, 0, 4131, 4132, 4132,
+ 4132, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4132, 4132, 0, 0, 0, 0, 0,
+ 4132, 0, 0, 0, 0, 0, 0, 0, 4132, 4133,
+ 4133, 4133, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4133, 0, 4133, 4133, 0, 0, 0, 0,
+ 0, 4133, 0, 0, 0, 0, 0, 0, 0, 4133,
+ 4134, 4134, 4134, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4134, 4134, 0, 0, 0,
+
+ 0, 0, 4134, 0, 0, 0, 0, 0, 0, 0,
+ 4134, 4136, 4136, 4136, 0, 0, 0, 4136, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4136, 0, 0, 0, 0, 0, 0,
+ 0, 4136, 4137, 4137, 0, 4137, 4137, 4137, 4137, 4137,
+ 4137, 4137, 4137, 4137, 4137, 4137, 4137, 4137, 4137, 4137,
+ 4137, 4137, 4137, 4137, 4137, 4137, 4137, 0, 4137, 4137,
+ 4137, 4137, 4137, 4137, 4138, 4138, 4138, 0, 0, 0,
+ 4138, 4138, 0, 0, 0, 4138, 0, 0, 0, 0,
+ 4138, 0, 0, 0, 0, 0, 4138, 0, 0, 0,
+
+ 4138, 0, 0, 0, 4138, 4139, 4139, 4139, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4139, 4139, 0, 4139, 0, 0, 0, 4139, 0, 0,
+ 0, 0, 0, 0, 0, 4139, 4140, 4140, 4140, 0,
+ 0, 0, 4140, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4140, 0,
+ 0, 0, 0, 0, 0, 0, 4140, 4141, 4141, 4141,
+ 0, 0, 0, 0, 0, 0, 0, 4141, 0, 0,
+ 0, 0, 4141, 4141, 0, 4141, 0, 0, 0, 4141,
+ 0, 0, 0, 0, 0, 0, 0, 4141, 4142, 4142,
+
+ 4142, 0, 0, 0, 4142, 0, 0, 0, 4142, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4142, 0, 0, 0, 0, 0, 0, 0, 4142, 4143,
+ 0, 0, 0, 4143, 0, 0, 0, 0, 4143, 0,
+ 0, 0, 0, 0, 0, 4143, 0, 0, 0, 0,
+ 0, 0, 0, 4143, 4144, 0, 0, 0, 0, 0,
+ 0, 4144, 0, 0, 0, 4144, 4144, 0, 0, 4144,
+ 0, 0, 0, 0, 4144, 0, 4144, 4145, 4145, 0,
+ 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145,
+ 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145,
+
+ 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4146,
+ 4146, 0, 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146,
+ 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146,
+ 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146,
+ 4146, 4148, 4148, 4148, 0, 0, 0, 0, 0, 0,
+ 4148, 0, 0, 0, 4148, 0, 4148, 0, 0, 0,
+ 0, 0, 0, 4148, 0, 0, 0, 0, 0, 0,
+ 0, 4148, 4149, 4149, 4149, 0, 0, 0, 0, 0,
+ 0, 4149, 0, 0, 0, 4149, 0, 4149, 0, 0,
+ 0, 0, 0, 0, 4149, 0, 0, 0, 0, 0,
+
+ 0, 0, 4149, 4150, 4150, 4150, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4150, 4150,
+ 0, 4150, 0, 0, 0, 4150, 0, 0, 0, 0,
+ 0, 0, 0, 4150, 4152, 4152, 4152, 4152, 4152, 4152,
+ 4152, 4152, 4152, 4152, 4152, 4152, 4152, 4152, 4152, 4152,
+ 4152, 4152, 4152, 4152, 4152, 4152, 4152, 4152, 4152, 4152,
+ 4152, 4152, 4152, 4152, 4152, 4152, 4153, 4153, 0, 4153,
+ 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153,
+ 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153,
+ 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4154, 4154,
+
+ 0, 4154, 4154, 4154, 4154, 4154, 4154, 4154, 4154, 4154,
+ 4154, 4154, 4154, 4154, 4154, 4154, 4154, 4154, 4154, 4154,
+ 4154, 4154, 4154, 0, 4154, 4154, 4154, 4154, 4154, 4154,
+ 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4155,
+ 4155, 4155, 4155, 4155, 4155, 4155, 0, 4155, 4155, 4155,
+ 4155, 4155, 4155, 0, 4155, 4155, 4155, 4155, 4155, 4155,
+ 4155, 4155, 4156, 4156, 4156, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4156, 0, 4156, 4156, 0,
+ 0, 0, 0, 0, 4156, 0, 0, 0, 0, 0,
+ 0, 0, 4156, 4157, 4157, 4157, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 4157, 0, 4157, 4157,
+ 0, 0, 0, 0, 0, 4157, 0, 0, 0, 0,
+ 0, 0, 0, 4157, 4158, 4158, 0, 4158, 4158, 4158,
+ 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158,
+ 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158, 0,
+ 4158, 4158, 4158, 4158, 4158, 4158, 4160, 0, 0, 0,
+ 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 0, 4160,
+ 0, 0, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160,
+ 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4161, 0,
+ 4161, 0, 0, 0, 0, 0, 0, 4161, 0, 4161,
+
+ 0, 0, 0, 0, 0, 4161, 4162, 4162, 4162, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4162,
+ 0, 4162, 0, 0, 0, 0, 0, 0, 4162, 0,
+ 0, 0, 0, 0, 0, 0, 4162, 4164, 4164, 0,
+ 4164, 0, 0, 0, 4164, 0, 0, 0, 0, 0,
+ 0, 0, 4164, 4165, 4165, 0, 4165, 4165, 4165, 4165,
+ 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165,
+ 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165, 0, 4165,
+ 4165, 4165, 4165, 4165, 4165, 4166, 4166, 4166, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 4166, 4166, 0, 0, 0, 0, 0, 4166, 0, 0,
+ 0, 0, 0, 0, 0, 4166, 4167, 4167, 0, 4167,
+ 4167, 4167, 4167, 4167, 4167, 4167, 4167, 4167, 4167, 4167,
+ 4167, 4167, 4167, 4167, 4167, 4167, 4167, 4167, 4167, 4167,
+ 4167, 0, 4167, 4167, 4167, 4167, 4167, 4167, 4169, 4169,
+ 0, 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4169,
+ 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4169, 4169,
+ 4169, 4169, 4169, 0, 4169, 4169, 4169, 4169, 4169, 4169,
+ 4170, 4170, 0, 4170, 4170, 4170, 4170, 4170, 4170, 4170,
+ 4170, 4170, 4170, 4170, 4170, 4170, 4170, 4170, 4170, 4170,
+
+ 4170, 4170, 4170, 4170, 4170, 0, 4170, 4170, 4170, 4170,
+ 4170, 4170, 4171, 4171, 0, 4171, 4171, 4171, 4171, 4171,
+ 4171, 4171, 4171, 4171, 4171, 4171, 4171, 4171, 4171, 4171,
+ 4171, 4171, 4171, 4171, 4171, 4171, 4171, 0, 4171, 4171,
+ 4171, 4171, 4171, 4171, 4172, 4172, 0, 4172, 4172, 4172,
+ 4172, 4172, 4172, 4172, 4172, 4172, 4172, 4172, 4172, 4172,
+ 4172, 4172, 4172, 4172, 4172, 4172, 4172, 4172, 4172, 0,
+ 4172, 4172, 4172, 4172, 4172, 4172, 4173, 4173, 0, 4173,
+ 4173, 4173, 4173, 4173, 4173, 0, 4173, 4173, 4173, 4173,
+ 4173, 0, 4173, 4173, 4173, 4173, 4173, 4173, 4173, 4173,
+
+ 4173, 4173, 4173, 4173, 0, 0, 4173, 4173, 4174, 4174,
+ 0, 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174,
+ 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174,
+ 4174, 4174, 4174, 0, 4174, 4174, 4174, 4174, 4174, 4174,
+ 4175, 4175, 4175, 4175, 4175, 4175, 4175, 4175, 4175, 4175,
+ 4175, 4175, 4175, 4175, 4175, 4175, 0, 4175, 4175, 4175,
+ 4175, 4175, 4175, 0, 4175, 4175, 4175, 4175, 4175, 4175,
+ 4175, 4175, 4176, 0, 0, 0, 0, 0, 4176, 4176,
+ 0, 0, 0, 4176, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4176, 0, 0, 0, 0, 0,
+
+ 0, 0, 4176, 4177, 4177, 0, 4177, 4177, 4177, 4177,
+ 4177, 4177, 4177, 4177, 4177, 0, 4177, 4177, 0, 4177,
+ 4177, 4177, 4177, 4177, 4177, 0, 4177, 4177, 0, 4177,
+ 4177, 4177, 4177, 4177, 4177, 4178, 4178, 4178, 4178, 4178,
+ 4178, 4178, 4178, 4178, 4178, 4178, 4178, 4178, 4178, 4178,
+ 4178, 0, 4178, 4178, 4178, 4178, 4178, 4178, 0, 4178,
+ 4178, 4178, 4178, 4178, 4178, 4178, 4178, 4179, 4179, 4179,
+ 0, 0, 0, 0, 0, 0, 4179, 0, 0, 0,
+ 0, 0, 4179, 4179, 0, 0, 0, 0, 0, 4179,
+ 0, 0, 0, 0, 0, 0, 0, 4179, 4180, 0,
+
+ 0, 0, 4180, 0, 4180, 0, 0, 4180, 0, 0,
+ 0, 4180, 0, 0, 0, 0, 0, 0, 0, 4180,
+ 4181, 4181, 4181, 0, 0, 0, 4181, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4181, 0, 0, 0, 0, 0, 0, 0,
+ 4181, 4184, 4184, 4184, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4184, 4184, 0, 0,
+ 0, 0, 0, 4184, 0, 0, 0, 0, 0, 0,
+ 0, 4184, 4185, 4185, 4185, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4185, 0, 4185, 4185, 0,
+
+ 0, 0, 0, 0, 4185, 0, 0, 0, 0, 0,
+ 0, 0, 4185, 4186, 4186, 4186, 0, 0, 0, 4186,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4186,
+ 0, 0, 0, 0, 0, 4186, 0, 0, 0, 0,
+ 0, 0, 0, 4186, 4187, 4187, 4187, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4187,
+ 4187, 0, 4187, 0, 0, 0, 4187, 0, 0, 0,
+ 0, 0, 0, 0, 4187, 4188, 0, 0, 0, 0,
+ 0, 0, 4188, 0, 0, 0, 4188, 4188, 0, 0,
+ 4188, 0, 0, 0, 0, 4188, 0, 4188, 4189, 4189,
+
+ 4189, 0, 0, 0, 0, 0, 0, 0, 4189, 0,
+ 0, 0, 0, 4189, 4189, 0, 4189, 0, 0, 0,
+ 4189, 0, 0, 0, 0, 0, 0, 0, 4189, 4190,
+ 0, 0, 0, 4190, 0, 0, 0, 0, 4190, 0,
+ 0, 0, 0, 0, 0, 4190, 0, 0, 0, 0,
+ 0, 0, 0, 4190, 4191, 4191, 0, 4191, 4191, 4191,
+ 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191,
+ 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191, 4191,
+ 4191, 4191, 4191, 4191, 4191, 4191, 4192, 4192, 0, 4192,
+ 4192, 4192, 4192, 4192, 4192, 4192, 4192, 4192, 4192, 4192,
+
+ 4192, 4192, 4192, 4192, 4192, 4192, 4192, 4192, 4192, 4192,
+ 4192, 4192, 4192, 4192, 4192, 4192, 4192, 4192, 4193, 4193,
+ 4193, 0, 0, 0, 0, 0, 0, 4193, 0, 0,
+ 0, 4193, 0, 4193, 0, 0, 0, 0, 0, 0,
+ 4193, 0, 0, 0, 0, 0, 0, 0, 4193, 4194,
+ 4194, 4194, 0, 0, 0, 0, 0, 0, 4194, 0,
+ 0, 0, 4194, 0, 4194, 0, 0, 0, 0, 0,
+ 0, 4194, 0, 0, 0, 0, 0, 0, 0, 4194,
+ 4195, 4195, 4195, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4195, 4195, 0, 4195, 0,
+
+ 0, 0, 4195, 0, 0, 0, 0, 0, 0, 0,
+ 4195, 4197, 4197, 0, 4197, 4197, 4197, 4197, 4197, 4197,
+ 4197, 4197, 4197, 4197, 4197, 4197, 4197, 4197, 4197, 4197,
+ 4197, 4197, 4197, 4197, 4197, 4197, 4197, 4197, 4197, 4197,
+ 4197, 4197, 4197, 4198, 4198, 4198, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4198, 0, 4198, 4198,
+ 0, 0, 0, 0, 0, 4198, 0, 0, 0, 0,
+ 0, 0, 0, 4198, 4199, 4199, 4199, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4199,
+ 0, 0, 0, 0, 0, 0, 4199, 0, 0, 0,
+
+ 0, 0, 0, 0, 4199, 4200, 0, 0, 0, 4200,
+ 4200, 4200, 4200, 4200, 4200, 4200, 4200, 0, 4200, 0,
+ 0, 4200, 4200, 4200, 4200, 4200, 4200, 4200, 4200, 4200,
+ 4200, 4200, 4200, 4200, 4200, 4200, 4200, 4201, 4201, 0,
+ 4201, 0, 0, 0, 4201, 0, 0, 0, 0, 0,
+ 0, 0, 4201, 4202, 4202, 4202, 0, 0, 0, 4202,
+ 0, 0, 0, 0, 4202, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4202, 0, 0, 0, 0,
+ 0, 0, 0, 4202, 4203, 4203, 0, 4203, 4203, 0,
+ 4203, 4203, 4203, 4203, 4203, 4203, 4203, 4203, 4203, 4203,
+
+ 4203, 4203, 4203, 4203, 4203, 4203, 4203, 4203, 4203, 4203,
+ 4203, 4203, 4203, 4203, 4203, 4203, 4204, 4204, 0, 4204,
+ 4204, 4204, 4204, 4204, 4204, 4204, 4204, 4204, 0, 4204,
+ 4204, 0, 4204, 4204, 4204, 4204, 4204, 4204, 0, 4204,
+ 4204, 0, 4204, 4204, 4204, 4204, 4204, 4204, 4205, 4205,
+ 4205, 0, 0, 0, 0, 0, 0, 4205, 0, 0,
+ 0, 0, 0, 4205, 4205, 0, 0, 0, 0, 0,
+ 4205, 0, 0, 0, 0, 0, 0, 0, 4205, 4207,
+ 4207, 4207, 4207, 0, 0, 4207, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4207, 0, 0, 0, 0,
+
+ 0, 4207, 0, 0, 0, 0, 0, 0, 4207, 4207,
+ 4208, 4208, 4208, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4208, 0, 4208, 4208, 0, 0, 0,
+ 0, 0, 4208, 0, 0, 0, 0, 0, 0, 0,
+ 4208, 4209, 4209, 4209, 0, 0, 0, 4209, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4209, 0, 0, 0, 0, 0, 0,
+ 0, 4209, 4214, 4214, 4214, 4214, 4214, 4214, 4214, 4214,
+ 4214, 4214, 4214, 4214, 4214, 4214, 4214, 4214, 0, 4214,
+ 4214, 4214, 4214, 4214, 4214, 0, 4214, 4214, 4214, 4214,
+
+ 4214, 4214, 4214, 4214, 4217, 4217, 4217, 4217, 4217, 4217,
+ 4217, 4217, 4217, 4217, 4217, 4217, 4217, 4217, 4217, 4217,
+ 0, 4217, 4217, 4217, 4217, 4217, 4217, 0, 4217, 4217,
+ 4217, 4217, 4217, 4217, 4217, 4217, 4219, 4219, 4219, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4219, 0, 0, 0, 4219, 0, 0, 4219, 0,
+ 0, 0, 0, 0, 0, 0, 4219, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694, 3694,
+ 3694, 3694
+ } ;
+
+extern int scanYY_flex_debug;
+int scanYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *scanYYtext;
+#line 1 "scanner.l"
+/*****************************************************************************
+ *
+ * $Id: scanner.l,v 1.80 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#line 19 "scanner.l"
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qregexp.h>
+#include <unistd.h>
+#include <qfile.h>
+
+#include "scanner.h"
+#include "entry.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+#include "defargs.h"
+#include "language.h"
+#include "commentscan.h"
+#include "code.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+static ParserInterface *g_thisParser;
+static const char * inputString;
+static int inputPosition;
+static QFile inputFile;
+static int lastContext;
+static int lastCContext;
+static int lastDocContext;
+static int lastCPPContext;
+static int lastSkipSharpContext;
+static int lastSkipRoundContext;
+static int lastStringContext;
+static int lastCurlyContext;
+static int lastRoundContext;
+static int lastSquareContext;
+static int lastInitializerContext;
+static int lastClassTemplSpecContext;
+static int lastPreLineCtrlContext;
+static int lastSkipVerbStringContext;
+static int lastCommentInArgContext;
+static int lastCSConstraint;
+static Protection protection;
+static Protection baseProt;
+static int sharpCount = 0 ;
+static int roundCount = 0 ;
+static int curlyCount = 0 ;
+static int squareCount = 0 ;
+static int padCount = 0 ;
+static QCString slString;
+static Entry* current_root = 0 ;
+static Entry* global_root = 0 ;
+static Entry* current = 0 ;
+static Entry* previous = 0 ;
+static Entry* tempEntry = 0 ;
+static Entry* firstTypedefEntry = 0 ;
+static Entry* memspecEntry = 0 ;
+static int yyLineNr = 1 ;
+static int anonCount = 0 ;
+static int anonNSCount = 0 ;
+static QCString yyFileName;
+static MethodTypes mtype;
+static bool gstat;
+static bool removeSlashes;
+static Specifier virt;
+static Specifier baseVirt;
+static QCString msType,msName,msArgs;
+static bool isTypedef;
+static int tmpDocType;
+static QCString sectionLabel;
+static QCString sectionTitle;
+static QCString funcPtrType;
+static QCString templateStr;
+static QCString aliasName;
+static QCString baseName;
+static QCString* specName;
+static QCString formulaText;
+static QCString formulaEnd;
+static bool useOverrideCommands = FALSE;
+
+static SrcLangExt language;
+static bool insideIDL = FALSE; //!< processing IDL code?
+static bool insideJava = FALSE; //!< processing Java code?
+static bool insideCS = FALSE; //!< processing C# code?
+static bool insideD = FALSE; //!< processing D code?
+static bool insidePHP = FALSE; //!< processing PHP code?
+static bool insideObjC = FALSE; //!< processing Objective C code?
+static bool insideCli = FALSE; //!< processing C++/CLI code?
+static bool insideJS = FALSE; //!< processing JavaScript code?
+
+static bool insideCppQuote = FALSE;
+static bool insideProtocolList = FALSE;
+
+static int argRoundCount;
+static int argSharpCount;
+static int currentArgumentContext;
+static int lastCopyArgStringContext;
+static int lastCopyArgContext;
+static QCString *copyArgString;
+static QCString fullArgString;
+
+static ArgumentList *currentArgumentList;
+static char lastCopyArgChar;
+
+static QCString *pCopyQuotedString;
+static QCString *pCopyRoundString;
+static QCString *pCopyCurlyString;
+
+static QGString *pCopyCurlyGString;
+static QGString *pCopyRoundGString;
+static QGString *pCopyQuotedGString;
+static QGString *pSkipVerbString;
+static QStack<Grouping> autoGroupStack;
+
+static bool insideFormula;
+static bool insideTryBlock=FALSE;
+static bool insideCode;
+static bool needsSemi;
+
+//static int depthIf;
+static int initBracketCount;
+static QCString memberGroupRelates;
+static QCString memberGroupInside;
+static QCString xrefItemKey;
+static QCString xrefItemTitle;
+static QCString xrefListTitle;
+
+static QCString g_skipBlockName;
+static QCString oldStyleArgType;
+static QCString docBackup;
+static QCString briefBackup;
+static bool g_inputFromFile;
+
+static int docBlockContext;
+static QGString docBlock;
+static QCString docBlockName;
+static bool docBlockInBody;
+static bool docBlockAutoBrief;
+static char docBlockTerm;
+
+static QCString idlAttr;
+static QCString idlProp;
+
+static bool g_lexInit = FALSE;
+static bool externC;
+
+
+//-----------------------------------------------------------------------------
+
+// forward declarations
+//static void handleGroupStartCommand(const char *header);
+//static void handleGroupEndCommand();
+
+//-----------------------------------------------------------------------------
+
+static void initParser()
+{
+ sectionLabel.resize(0);
+ sectionTitle.resize(0);
+ baseName.resize(0);
+ formulaText.resize(0);
+ protection = Public;
+ baseProt = Public;
+ sharpCount = 0;
+ roundCount = 0;
+ curlyCount = 0;
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ baseVirt = Normal;
+ isTypedef = FALSE;
+ autoGroupStack.clear();
+ insideTryBlock = FALSE;
+ autoGroupStack.setAutoDelete(TRUE);
+ insideFormula = FALSE;
+ insideCode=FALSE;
+ insideCli=Config_getBool("CPP_CLI_SUPPORT");
+ previous = 0;
+}
+
+static void initEntry()
+{
+ if (insideJava)
+ {
+ protection = (current_root->spec & Entry::Interface) ? Public : Package;
+ }
+ current->protection = protection ;
+ current->mtype = mtype;
+ current->virt = virt;
+ current->stat = gstat;
+ current->lang = language;
+ //printf("*** initEntry() language=%d\n",language);
+ //if (!autoGroupStack.isEmpty())
+ //{
+ // //printf("Appending group %s\n",autoGroupStack.top()->groupname.data());
+ // current->groups->append(new Grouping(*autoGroupStack.top()));
+ //}
+ initGroupInfo(current);
+ isTypedef=FALSE;
+}
+
+
+//-----------------------------------------------------------------------------
+
+///// remove any automatic grouping and add new one (if given)
+//static void setCurrentGroup( QCString *newgroup, Grouping::GroupPri_t pri )
+//{
+// /* remove auto group name from current entry and discard it */
+// Grouping *g = current->groups->first();
+// int i=0;
+// while (g)
+// {
+// if (g->pri <= Grouping::GROUPING_AUTO_DEF)
+// {
+// current->groups->remove(i);
+// i--;
+// }
+// g=current->groups->next();
+// i++;
+// }
+//
+// /* use new group name instead? */
+// if ( newgroup )
+// {
+// current->groups->append(new Grouping(*newgroup, pri));
+// }
+//}
+//
+//static int newMemberGroupId()
+//{
+// static int curGroupId=0;
+// return curGroupId++;
+//}
+//
+// forward declarations
+//static void startGroupInDoc();
+//static void endGroup();
+
+//-----------------------------------------------------------------------------
+
+static void lineCount()
+{
+ for( const char* c = scanYYtext ; *c ; ++c )
+ yyLineNr += (*c == '\n') ;
+}
+
+static void addType( Entry* current )
+{
+ uint tl=current->type.length();
+ if( tl>0 && !current->name.isEmpty() && current->type.at(tl-1)!='.')
+ {
+ current->type += ' ' ;
+ }
+ current->type += current->name ;
+ current->name.resize(0) ;
+ tl=current->type.length();
+ if( tl>0 && !current->args.isEmpty() && current->type.at(tl-1)!='.')
+ {
+ current->type += ' ' ;
+ }
+ current->type += current->args ;
+ current->args.resize(0) ;
+ current->argList->clear();
+}
+
+
+static QCString stripQuotes(const char *s)
+{
+ QCString name;
+ if (s==0 || *s==0) return name;
+ name=s;
+ if (name.at(0)=='"' && name.at(name.length()-1)=='"')
+ {
+ name=name.mid(1,name.length()-2);
+ }
+ return name;
+}
+
+//-----------------------------------------------------------------
+
+static void startCommentBlock(bool);
+static void handleCommentBlock(const QCString &doc,bool brief);
+static void handleParametersCommentBlocks(ArgumentList *al);
+
+//-----------------------------------------------------------------
+
+static bool nameIsOperator(QCString &name)
+{
+ int i=name.find("operator");
+ if (i==-1) return FALSE;
+ if (i==0 && !isId(name.at(8))) return TRUE; // case operator ::X
+ if (i>0 && !isId(name.at(i-1)) && !isId(name.at(i+8))) return TRUE; // case X::operator
+ return FALSE; // case TEXToperatorTEXT
+}
+
+//-----------------------------------------------------------------------------
+
+static void setContext()
+{
+ QCString fileName = yyFileName;
+ language = getLanguageFromFileName(fileName);
+ insideIDL = language==SrcLangExt_IDL;
+ insideJava = language==SrcLangExt_Java;
+ insideCS = language==SrcLangExt_CSharp;
+ insideD = language==SrcLangExt_D;
+ insidePHP = language==SrcLangExt_PHP;
+ insideObjC = language==SrcLangExt_ObjC;
+ insideJS = language==SrcLangExt_JS;
+ if ( insidePHP )
+ {
+ useOverrideCommands = TRUE;
+ }
+ //printf("setContext(%s) insideIDL=%d insideJava=%d insideCS=%d "
+ // "insideD=%d insidePHP=%d insideObjC=%d\n",
+ // yyFileName.data(),insideIDL,insideJava,insideCS,insideD,insidePHP,insideObjC
+ // );
+}
+
+//-----------------------------------------------------------------------------
+
+static void prependScope()
+{
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ //printf("--- prependScope %s to %s\n",current_root->name.data(),current->name.data());
+ current->name.prepend(current_root->name+"::");
+ if (current_root->tArgLists)
+ {
+ if (current->tArgLists==0)
+ {
+ current->tArgLists = new QList<ArgumentList>;
+ current->tArgLists->setAutoDelete(TRUE);
+ }
+ //printf("prependScope #=%d #current=%d\n",current_root->tArgLists->count(),current->tArgLists->count());
+ QListIterator<ArgumentList> talsi(*current_root->tArgLists);
+ ArgumentList *srcAl=0;
+ for (talsi.toLast();(srcAl=talsi.current());--talsi)
+ {
+ ArgumentList *dstAl = new ArgumentList;
+ QListIterator<Argument> tali(*srcAl);
+ Argument *a;
+ for (;(a=tali.current());++tali)
+ {
+ dstAl->append(new Argument(*a));
+ //printf("appending argument %s %s\n",a->type.data(),a->name.data());
+ }
+ current->tArgLists->insert(0,dstAl);
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+/*! Returns TRUE iff the current entry could be a K&R style C function */
+static bool checkForKnRstyleC()
+{
+ if (((QCString)yyFileName).right(2).lower()!=".c") return FALSE; // must be a C file
+ if (!current->argList) return FALSE; // must have arguments
+ ArgumentListIterator ali(*current->argList);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ // in K&R style argument do not have a type, but doxygen expects a type
+ // so it will think the argument has no name
+ if (a->type.isEmpty() || !a->name.isEmpty()) return FALSE;
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+
+static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
+{
+ int si = current->args.length();
+ if (oldStyleArgType.isEmpty()) // new argument
+ {
+ static QRegExp re("([^)]*)");
+ int bi1 = current->args.findRev(re);
+ int bi2 = bi1!=-1 ? current->args.findRev(re,bi1-1) : -1;
+ char c;
+ if (bi1!=-1 && bi2!=-1) // found something like "int (*func)(int arg)"
+ {
+ int s=bi2+1;
+ oldStyleArgType = current->args.left(s);
+ int i=s;
+ while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++;
+ oldStyleArgType += current->args.mid(s,i-s);
+ s=i;
+ while (i<si && isId(current->args.at(i))) i++;
+ oldStyleArgName = current->args.mid(s,i-s);
+ oldStyleArgType+=current->args.mid(i);
+ }
+ else if (bi1!=-1) // redundant braces like in "int (*var)"
+ {
+ int s=bi1;
+ oldStyleArgType = current->args.left(s);
+ s++;
+ int i=s+1;
+ while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++;
+ oldStyleArgType += current->args.mid(s,i-s);
+ s=i;
+ while (i<si && isId(current->args.at(i))) i++;
+ oldStyleArgName = current->args.mid(s,i-s);
+ }
+ else // normal "int *var"
+ {
+ int l=si,i=l-1,j;
+ char c;
+ // look for start of name in "type *name"
+ while (i>=0 && isId(current->args.at(i))) i--;
+ j=i+1;
+ // look for start of *'s
+ while (i>=0 && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i--;
+ i++;
+ if (i!=l)
+ {
+ oldStyleArgType=current->args.left(i);
+ oldStyleArgPtr=current->args.mid(i,j-i);
+ oldStyleArgName=current->args.mid(j).stripWhiteSpace();
+ }
+ else
+ {
+ oldStyleArgName=current->args.copy().stripWhiteSpace();
+ }
+ }
+ }
+ else // continuation like *arg2 in "int *args,*arg2"
+ {
+ int l=si,j=0;
+ char c;
+ while (j<l && ((c=current->args.at(j))=='*' || isspace((uchar)c))) j++;
+ if (j>0)
+ {
+ oldStyleArgPtr=current->args.left(j);
+ oldStyleArgName=current->args.mid(j).stripWhiteSpace();
+ }
+ else
+ {
+ oldStyleArgName=current->args.copy().stripWhiteSpace();
+ }
+ }
+ //fprintf(stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data());
+}
+
+//-----------------------------------------------------------------------------
+
+/*! Update the argument \a name with additional \a type info. For K&R style
+ * function the type is found \e after the argument list, so this routine
+ * in needed to fix up.
+ */
+static void addKnRArgInfo(const QCString &type,const QCString &name,
+ const QCString &brief,const QCString &docs)
+{
+ if (current->argList==0) return;
+ ArgumentListIterator ali(*current->argList);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (a->type==name)
+ {
+ a->type=type.stripWhiteSpace();
+ if (a->type.left(9)=="register ") // strip keyword
+ {
+ a->type=a->type.mid(9);
+ }
+ a->name=name.stripWhiteSpace();
+ if (!brief.isEmpty() && !docs.isEmpty())
+ {
+ a->docs=brief+"\n\n"+docs;
+ }
+ else if (!brief.isEmpty())
+ {
+ a->docs=brief;
+ }
+ else
+ {
+ a->docs=docs;
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+
+void fixArgumentListForJavaScript(ArgumentList *al)
+{
+ if (al==0) return;
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (!a->type.isEmpty() && a->name.isEmpty())
+ { // a->type is actually the (typeless) parameter name, so move it
+ a->name=a->type;
+ a->type.resize(0);
+ }
+ }
+}
+
+/* ----------------------------------------------------------------- */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ if (g_inputFromFile)
+ {
+ c = inputFile.readBlock(buf,max_size);
+ if (c==-1) yy_fatal_error("input in flex scanner failed");
+ }
+ else
+ {
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ //printf("%d (%c)\n",*buf,*buf);
+ c++; buf++;
+ }
+ }
+ return c;
+}
+
+/* start command character */
+/* language parsing states */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/** Prototype scanner states */
+
+
+
+
+
+/** comment parsing states */
+
+
+
+#line 9290 "<stdout>"
+
+#define INITIAL 0
+#define Define 1
+#define DefineEnd 2
+#define CompoundName 3
+#define ClassVar 4
+#define CSConstraintName 5
+#define CSConstraintType 6
+#define CSIndexer 7
+#define ClassCategory 8
+#define ClassTemplSpec 9
+#define CliPropertyType 10
+#define CliPropertyIndex 11
+#define CliOverride 12
+#define Bases 13
+#define BasesProt 14
+#define NextSemi 15
+#define BitFields 16
+#define FindMembers 17
+#define FindMembersPHP 18
+#define FindMemberName 19
+#define FindFields 20
+#define FindFieldArg 21
+#define Function 22
+#define FuncRound 23
+#define ExcpRound 24
+#define ExcpList 25
+#define FuncQual 26
+#define Operator 27
+#define Array 28
+#define ReadBody 29
+#define ReadNSBody 30
+#define ReadBodyIntf 31
+#define Using 32
+#define UsingDirective 33
+#define SkipCurly 34
+#define SkipCurlyCpp 35
+#define SkipCurlyEndDoc 36
+#define SkipString 37
+#define SkipPHPString 38
+#define SkipInits 39
+#define SkipCPP 40
+#define SkipCPPBlock 41
+#define SkipComment 42
+#define SkipCxxComment 43
+#define SkipCurlyBlock 44
+#define SkipRoundBlock 45
+#define Sharp 46
+#define SkipSharp 47
+#define SkipRound 48
+#define SkipSquare 49
+#define SkipRemainder 50
+#define TypedefName 51
+#define TryFunctionBlock 52
+#define TryFunctionBlockEnd 53
+#define Comment 54
+#define PackageName 55
+#define JavaImport 56
+#define PHPUse 57
+#define PHPUseAs 58
+#define CSAccessorDecl 59
+#define CSGeneric 60
+#define PreLineCtrl 61
+#define DefinePHP 62
+#define DefinePHPEnd 63
+#define OldStyleArgs 64
+#define SkipVerbString 65
+#define ObjCMethod 66
+#define ObjCReturnType 67
+#define ObjCParams 68
+#define ObjCParamType 69
+#define ObjCProtocolList 70
+#define ObjCPropAttr 71
+#define ObjCSkipStatement 72
+#define QtPropType 73
+#define QtPropName 74
+#define QtPropAttr 75
+#define QtPropRead 76
+#define QtPropWrite 77
+#define ReadInitializer 78
+#define GetCallType 79
+#define CppQuote 80
+#define EndCppQuote 81
+#define MemberSpec 82
+#define MemberSpecSkip 83
+#define EndTemplate 84
+#define FuncPtr 85
+#define FuncPtrOperator 86
+#define EndFuncPtr 87
+#define ReadFuncArgType 88
+#define ReadTempArgs 89
+#define IDLUnionCase 90
+#define NSAliasName 91
+#define NSAliasArg 92
+#define CopyString 93
+#define CopyPHPString 94
+#define CopyGString 95
+#define CopyPHPGString 96
+#define CopyRound 97
+#define CopyCurly 98
+#define GCopyRound 99
+#define GCopyCurly 100
+#define SkipUnionSwitch 101
+#define Specialization 102
+#define FuncPtrInit 103
+#define FuncFunc 104
+#define FuncFuncEnd 105
+#define FuncFuncType 106
+#define FuncFuncArray 107
+#define CopyArgString 108
+#define CopyArgPHPString 109
+#define CopyArgRound 110
+#define CopyArgSharp 111
+#define CopyArgComment 112
+#define CopyArgCommentLine 113
+#define CopyArgVerbatim 114
+#define IDLAttribute 115
+#define IDLProp 116
+#define IDLPropName 117
+#define Prototype 118
+#define PrototypePtr 119
+#define PrototypeQual 120
+#define PrototypeExc 121
+#define PrototypeSkipLine 122
+#define DocLine 123
+#define DocBlock 124
+#define DocCopyBlock 125
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int scanYYlex_destroy (void );
+
+int scanYYget_debug (void );
+
+void scanYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE scanYYget_extra (void );
+
+void scanYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *scanYYget_in (void );
+
+void scanYYset_in (FILE * in_str );
+
+FILE *scanYYget_out (void );
+
+void scanYYset_out (FILE * out_str );
+
+yy_size_t scanYYget_leng (void );
+
+char *scanYYget_text (void );
+
+int scanYYget_lineno (void );
+
+void scanYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int scanYYwrap (void );
+#else
+extern int scanYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( scanYYtext, scanYYleng, 1, scanYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( scanYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( scanYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, scanYYin))==0 && ferror(scanYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(scanYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int scanYYlex (void);
+
+#define YY_DECL int scanYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after scanYYtext and scanYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( scanYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (scanYYtext[scanYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 717 "scanner.l"
+
+
+#line 9603 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)scanYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in scanYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! scanYYin )
+ scanYYin = stdin;
+
+ if ( ! scanYYout )
+ scanYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ scanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ scanYY_create_buffer(scanYYin,YY_BUF_SIZE );
+ }
+
+ scanYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of scanYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 3695 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 28568 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+#line 719 "scanner.l"
+{
+ curlyCount=0;
+ needsSemi = TRUE;
+ BEGIN(SkipCurlyBlock);
+ }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 724 "scanner.l"
+{
+ roundCount=0;
+ BEGIN(SkipRoundBlock);
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 728 "scanner.l"
+{
+ ++roundCount;
+ }
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 731 "scanner.l"
+{
+ if (roundCount )
+ --roundCount ;
+ else
+ BEGIN( NextSemi ) ;
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 737 "scanner.l"
+{
+ ++curlyCount ;
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 740 "scanner.l"
+{
+ if( curlyCount )
+ {
+ --curlyCount ;
+ }
+ else if (needsSemi)
+ {
+ BEGIN( NextSemi );
+ }
+ else
+ {
+ BEGIN( FindMembers );
+ }
+ }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 754 "scanner.l"
+{
+ if (insidePHP)
+ {
+ lastStringContext=NextSemi;
+ BEGIN(SkipPHPString);
+ }
+ }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 761 "scanner.l"
+{ if (insidePHP) REJECT; }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 762 "scanner.l"
+{
+ lastStringContext=NextSemi;
+ BEGIN(SkipString);
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 766 "scanner.l"
+{
+ unput(*scanYYtext);
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 770 "scanner.l"
+{
+ unput(*scanYYtext);
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 774 "scanner.l"
+{ // PHP code with unsupported extension?
+ insidePHP = TRUE;
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 777 "scanner.l"
+{ // PHP code start
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 14:
+/* rule 14 can match eol */
+YY_RULE_SETUP
+#line 780 "scanner.l"
+{ // PHP code start
+ lineCount() ;
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 784 "scanner.l"
+{ // Non-PHP code text, ignore
+ }
+ YY_BREAK
+case 16:
+/* rule 16 can match eol */
+YY_RULE_SETUP
+#line 786 "scanner.l"
+{ // Non-PHP code text, ignore
+ yyLineNr++;
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 789 "scanner.l"
+{ // Non-PHP code text, ignore
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 791 "scanner.l"
+{ // PHP code end
+ if (insidePHP)
+ BEGIN( FindMembersPHP );
+ else
+ REJECT;
+ }
+ YY_BREAK
+case 19:
+/* rule 19 can match eol */
+YY_RULE_SETUP
+#line 797 "scanner.l"
+{ if (insidePHP)
+ BEGIN( NextSemi );
+ else
+ REJECT;
+ }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 802 "scanner.l"
+{ // Mozilla XPIDL lang-specific block
+ if (!insideIDL)
+ REJECT;
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 806 "scanner.l"
+{ // Mozilla XPIDL lang-specific block end
+ if (!insideIDL)
+ REJECT;
+ }
+ YY_BREAK
+case 22:
+/* rule 22 can match eol */
+YY_RULE_SETUP
+#line 810 "scanner.l"
+{ // IDL or Borland C++ builder property
+ current->mtype = mtype = Property;
+ current->protection = protection = Public ;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ YY_BREAK
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+#line 820 "scanner.l"
+{ current->mtype = mtype = DCOP;
+ current->protection = protection = Public ;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ YY_BREAK
+case 24:
+/* rule 24 can match eol */
+YY_RULE_SETUP
+#line 829 "scanner.l"
+{ current->mtype = mtype = Signal;
+
+ current->protection = protection = Public ;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 839 "scanner.l"
+{
+ current->protection = protection = Public ;
+ current->mtype = mtype = Slot;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount();
+ }
+ YY_BREAK
+case 26:
+/* rule 26 can match eol */
+YY_RULE_SETUP
+#line 849 "scanner.l"
+{
+ current->protection = protection = Protected ;
+ current->mtype = mtype = Slot;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount();
+ }
+ YY_BREAK
+case 27:
+/* rule 27 can match eol */
+YY_RULE_SETUP
+#line 859 "scanner.l"
+{
+ current->protection = protection = Private ;
+ current->mtype = mtype = Slot;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount();
+ }
+ YY_BREAK
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+#line 868 "scanner.l"
+{
+ current->protection = protection = Public ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ YY_BREAK
+case 29:
+/* rule 29 can match eol */
+YY_RULE_SETUP
+#line 877 "scanner.l"
+{ // for now treat C++/CLI's internal as package...
+ if (insideCli)
+ {
+ current->protection = protection = Package ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 30:
+/* rule 30 can match eol */
+YY_RULE_SETUP
+#line 893 "scanner.l"
+{
+ current->protection = protection = Protected ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+#line 902 "scanner.l"
+{
+ current->protection = protection = Private ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ YY_BREAK
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 911 "scanner.l"
+{
+ if (insideCli)
+ {
+ // C++/CLI event
+ lineCount() ;
+ current->mtype = mtype = Event;
+ current->bodyLine = yyLineNr;
+ curlyCount=0;
+ BEGIN( CliPropertyType );
+ }
+ else if (insideCS)
+ {
+ lineCount() ;
+ current->mtype = Event;
+ current->bodyLine = yyLineNr;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+#line 932 "scanner.l"
+{
+ if (insideCli)
+ {
+ // C++/CLI property
+ lineCount() ;
+ current->mtype = mtype = Property;
+ current->bodyLine = yyLineNr;
+ curlyCount=0;
+ BEGIN( CliPropertyType );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 947 "scanner.l"
+{
+ addType( current );
+ current->name = scanYYtext;
+ }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 951 "scanner.l"
+{ // C++/CLI indexed property
+ current->name += scanYYtext;
+ BEGIN( CliPropertyIndex );
+ }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 955 "scanner.l"
+{
+ curlyCount=0;
+ //printf("event: '%s' '%s'\n",current->type.data(),current->name.data());
+ BEGIN( CSAccessorDecl );
+ }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 960 "scanner.l"
+{
+ unput(*scanYYtext);
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 964 "scanner.l"
+{
+ yyLineNr++;
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 967 "scanner.l"
+{
+ }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 969 "scanner.l"
+{
+ addType( current );
+ current->type += scanYYtext;
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 973 "scanner.l"
+{
+ BEGIN( CliPropertyType );
+ current->name+=scanYYtext;
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 977 "scanner.l"
+{
+ current->name+=scanYYtext;
+ }
+ YY_BREAK
+case 43:
+/* rule 43 can match eol */
+YY_RULE_SETUP
+#line 980 "scanner.l"
+{
+ if (!current->type.isEmpty())
+ {
+ REJECT;
+ }
+ else
+ {
+ current->mtype = mtype = Property;
+ lineCount();
+ }
+ }
+ YY_BREAK
+case 44:
+/* rule 44 can match eol */
+YY_RULE_SETUP
+#line 991 "scanner.l"
+{
+ current->protection = protection = Private ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ YY_BREAK
+case 45:
+/* rule 45 can match eol */
+YY_RULE_SETUP
+#line 1000 "scanner.l"
+{
+ current->protection = protection = Protected ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ YY_BREAK
+case 46:
+/* rule 46 can match eol */
+YY_RULE_SETUP
+#line 1009 "scanner.l"
+{
+ current->protection = protection = Public ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ YY_BREAK
+case 47:
+/* rule 47 can match eol */
+YY_RULE_SETUP
+#line 1018 "scanner.l"
+{
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ lineCount();
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ current->section = Entry::FUNCTION_SEC;
+ current->protection = protection = Public ;
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ current->virt = Virtual;
+ current->stat=scanYYtext[0]=='+';
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ BEGIN( ObjCMethod );
+ }
+ }
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 1043 "scanner.l"
+{ // start of method's return type
+ BEGIN( ObjCReturnType );
+ }
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 1046 "scanner.l"
+{ // found method name
+ if (current->type.isEmpty())
+ {
+ current->type = "id";
+ }
+ current->name = scanYYtext;
+ }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 1053 "scanner.l"
+{ // start of parameter list
+ current->name += ':';
+ Argument *a = new Argument;
+ current->argList->append(a);
+ BEGIN( ObjCParams );
+ }
+ YY_BREAK
+case 51:
+/* rule 51 can match eol */
+YY_RULE_SETUP
+#line 1059 "scanner.l"
+{ // TODO: check if nested braches are possible.
+ current->type = scanYYtext;
+ }
+ YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 1062 "scanner.l"
+{
+ BEGIN( ObjCMethod );
+ }
+ YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 1065 "scanner.l"
+{ // Keyword of parameter
+ QCString keyw = scanYYtext;
+ keyw=keyw.left(keyw.length()-1); // strip :
+ if (keyw.isEmpty())
+ {
+ current->name += " :";
+ }
+ else
+ {
+ current->name += keyw+":";
+ }
+ if (current->argList->getLast()->type.isEmpty())
+ {
+ current->argList->getLast()->type="id";
+ }
+ Argument *a = new Argument;
+ a->attrib=(QCString)"["+keyw+"]";
+ current->argList->append(a);
+ }
+ YY_BREAK
+case 54:
+/* rule 54 can match eol */
+YY_RULE_SETUP
+#line 1084 "scanner.l"
+{ // name of parameter
+ lineCount();
+ current->argList->getLast()->name=QCString(scanYYtext).stripWhiteSpace();
+ }
+ YY_BREAK
+case 55:
+/* rule 55 can match eol */
+YY_RULE_SETUP
+#line 1088 "scanner.l"
+{ // name of parameter
+ lineCount();
+ // do we want the comma as part of the name?
+ //current->name += ",";
+ Argument *a = new Argument;
+ a->attrib="[,]";
+ a->type="...";
+ current->argList->append(a);
+ }
+ YY_BREAK
+/*
+<ObjCParams>":" {
+ current->name += ':';
+ }
+ */
+case 56:
+YY_RULE_SETUP
+#line 1102 "scanner.l"
+{
+ BEGIN( ObjCParamType );
+ }
+ YY_BREAK
+case 57:
+/* rule 57 can match eol */
+YY_RULE_SETUP
+#line 1105 "scanner.l"
+{
+ current->argList->getLast()->type=QCString(scanYYtext).stripWhiteSpace();
+ }
+ YY_BREAK
+case 58:
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 1108 "scanner.l"
+{
+ BEGIN( ObjCParams );
+ }
+ YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 1111 "scanner.l"
+{ // end of method declaration
+ if (current->argList->getLast() && current->argList->getLast()->type.isEmpty())
+ {
+ current->argList->getLast()->type="id";
+ }
+ current->args = argListToString(current->argList);
+ //printf("argList=%s\n",current->args.data());
+ unput(';');
+ BEGIN( Function );
+ }
+ YY_BREAK
+case 60:
+/* rule 60 can match eol */
+YY_RULE_SETUP
+#line 1121 "scanner.l"
+{ // start of a method body
+ lineCount();
+ //printf("Type=%s Name=%s args=%s\n",
+ // current->type.data(),current->name.data(),argListToString(current->argList).data()
+ // );
+ if (current->argList->getLast() && current->argList->getLast()->type.isEmpty())
+ {
+ current->argList->getLast()->type="id";
+ }
+ current->args = argListToString(current->argList);
+ unput('{');
+ BEGIN( Function );
+ }
+ YY_BREAK
+case 61:
+/* rule 61 can match eol */
+YY_RULE_SETUP
+#line 1134 "scanner.l"
+{
+ lineCount();
+ }
+ YY_BREAK
+case 62:
+/* rule 62 can match eol */
+YY_RULE_SETUP
+#line 1137 "scanner.l"
+{
+ if (insideJava) // Java annotation
+ {
+ lineCount();
+ lastSkipRoundContext = YY_START;
+ roundCount=1;
+ BEGIN( SkipRound );
+ }
+ else if (strncmp(scanYYtext,"@property",9)==0) // ObjC 2.0 property
+ {
+ current->mtype = mtype = Property;
+ current->spec|=Entry::Readable | Entry::Writable | Entry::Assign;
+ current->protection = Public ;
+ unput('(');
+ BEGIN( ObjCPropAttr );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 1158 "scanner.l"
+{
+ current->read = scanYYtext+7;
+ }
+ YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 1161 "scanner.l"
+{
+ current->write = scanYYtext+7;
+ }
+ YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 1164 "scanner.l"
+{
+ current->spec&=~Entry::Writable;
+ }
+ YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 1167 "scanner.l"
+{ // default
+ }
+ YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 1169 "scanner.l"
+{ // default
+ }
+ YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 1171 "scanner.l"
+{
+ current->spec&=~Entry::Assign;
+ current->spec|=Entry::Retain;
+ }
+ YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 1175 "scanner.l"
+{
+ current->spec&=~Entry::Assign;
+ current->spec|=Entry::Copy;
+ }
+ YY_BREAK
+case 70:
+YY_RULE_SETUP
+#line 1179 "scanner.l"
+{
+ current->spec|=Entry::NonAtomic;
+ }
+ YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 1182 "scanner.l"
+{
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 1185 "scanner.l"
+{
+ if (insideJava) // Java annotation
+ {
+ // skip annotation
+ }
+ else if (strcmp(scanYYtext,"@property")==0) // ObjC 2.0 property
+ {
+ current->mtype = mtype = Property;
+ current->spec|=Entry::Writable | Entry::Readable | Entry::Assign;
+ current->protection = Public ;
+ }
+ else if (strcmp(scanYYtext,"@synthesize")==0)
+ {
+ BEGIN( ObjCSkipStatement );
+ }
+ else if (strcmp(scanYYtext,"@dynamic")==0)
+ {
+ BEGIN( ObjCSkipStatement );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 1209 "scanner.l"
+{
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 1212 "scanner.l"
+{
+ isTypedef=FALSE;
+ current->name = scanYYtext;
+ current->name = substitute(current->name,".","::");
+ current->name = substitute(current->name,"\\","::");
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "namespace" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount();
+ curlyCount=0;
+ current_root->addSubEntry(current);
+ current_root = current ;
+ current = new Entry ;
+ initEntry();
+ BEGIN( FindMembers ) ;
+ }
+ YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 1230 "scanner.l"
+{
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 76:
+/* rule 76 can match eol */
+YY_RULE_SETUP
+#line 1233 "scanner.l"
+{
+ current->type += " initonly ";
+ if (insideCli) current->spec |= Entry::Initonly;
+ lineCount();
+ }
+ YY_BREAK
+case 77:
+/* rule 77 can match eol */
+YY_RULE_SETUP
+#line 1238 "scanner.l"
+{ current->type += " static ";
+ current->stat = TRUE;
+ lineCount();
+ }
+ YY_BREAK
+case 78:
+/* rule 78 can match eol */
+YY_RULE_SETUP
+#line 1242 "scanner.l"
+{
+ current->stat = FALSE;
+ current->explicitExternal = TRUE;
+ lineCount();
+ }
+ YY_BREAK
+case 79:
+/* rule 79 can match eol */
+YY_RULE_SETUP
+#line 1247 "scanner.l"
+{ current->type += " virtual ";
+ current->virt = Virtual;
+ lineCount();
+ }
+ YY_BREAK
+case 80:
+/* rule 80 can match eol */
+YY_RULE_SETUP
+#line 1251 "scanner.l"
+{
+ if (!insidePHP)
+ {
+ current->type += " abstract ";
+ current->virt = Pure;
+ }
+ else
+ {
+ current->spec|=Entry::Abstract;
+ }
+ lineCount();
+ }
+ YY_BREAK
+case 81:
+/* rule 81 can match eol */
+YY_RULE_SETUP
+#line 1263 "scanner.l"
+{ current->spec|=Entry::Inline;
+ lineCount();
+ }
+ YY_BREAK
+case 82:
+/* rule 82 can match eol */
+YY_RULE_SETUP
+#line 1266 "scanner.l"
+{ current->spec|=Entry::Mutable;
+ lineCount();
+ }
+ YY_BREAK
+case 83:
+/* rule 83 can match eol */
+YY_RULE_SETUP
+#line 1269 "scanner.l"
+{ current->spec|=Entry::Explicit;
+ lineCount();
+ }
+ YY_BREAK
+case 84:
+/* rule 84 can match eol */
+YY_RULE_SETUP
+#line 1272 "scanner.l"
+{ // Objective C 2.0 protocol required section
+ current->spec=(current->spec & ~Entry::Optional) | Entry::Required;
+ lineCount();
+ }
+ YY_BREAK
+case 85:
+/* rule 85 can match eol */
+YY_RULE_SETUP
+#line 1276 "scanner.l"
+{ // Objective C 2.0 protocol optional section
+ current->spec=(current->spec & ~Entry::Required) | Entry::Optional;
+ lineCount();
+ }
+ YY_BREAK
+/*
+<FindMembers>{B}*"import"{BN}+ { // IDL import keyword
+ BEGIN( NextSemi );
+ }
+ */
+case 86:
+/* rule 86 can match eol */
+YY_RULE_SETUP
+#line 1285 "scanner.l"
+{ lineCount(); }
+ YY_BREAK
+case 87:
+/* rule 87 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 1286 "scanner.l"
+{
+ isTypedef=FALSE;
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "namespace" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount();
+ if (insidePHP)
+ {
+ BEGIN( PackageName );
+ }
+ else
+ {
+ BEGIN( CompoundName );
+ }
+ }
+ YY_BREAK
+case 88:
+/* rule 88 can match eol */
+YY_RULE_SETUP
+#line 1303 "scanner.l"
+{
+ lineCount();
+ if (insideIDL)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "module" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ else if (insideD)
+ {
+ lineCount();
+ BEGIN(PackageName);
+ }
+ else
+ {
+ addType( current ) ;
+ current->name = QCString(scanYYtext).stripWhiteSpace();
+ }
+ }
+ YY_BREAK
+case 89:
+/* rule 89 can match eol */
+YY_RULE_SETUP
+#line 1326 "scanner.l"
+{
+ lineCount();
+ if (insideIDL)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "library" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ else
+ {
+ addType( current ) ;
+ current->name = QCString(scanYYtext).stripWhiteSpace();
+ }
+ }
+ YY_BREAK
+case 90:
+/* rule 90 can match eol */
+YY_RULE_SETUP
+#line 1344 "scanner.l"
+{ // M$/Corba IDL/Java interface
+ lineCount();
+ if (insideIDL || insideJava || insideCS || insideD || insidePHP)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Interface;
+ addType( current ) ;
+ current->type += " interface" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ else
+ {
+ addType( current ) ;
+ current->name = QCString(scanYYtext).stripWhiteSpace();
+ }
+ }
+ YY_BREAK
+case 91:
+/* rule 91 can match eol */
+YY_RULE_SETUP
+#line 1364 "scanner.l"
+{ // Objective-C class implementation
+ lineCount();
+ isTypedef=FALSE;
+ current->section = Entry::OBJCIMPL_SEC;
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ current->protection = protection = Public ;
+ addType( current ) ;
+ current->type += " implementation" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ YY_BREAK
+case 92:
+/* rule 92 can match eol */
+YY_RULE_SETUP
+#line 1378 "scanner.l"
+{ // Objective-C class interface, or Java attribute
+ lineCount();
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Interface;
+ if (!insideJava)
+ {
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ }
+ current->protection = protection = Public ;
+ addType( current ) ;
+ current->type += " interface" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ YY_BREAK
+case 93:
+/* rule 93 can match eol */
+YY_RULE_SETUP
+#line 1396 "scanner.l"
+{ // Objective-C protocol definition
+ lineCount();
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Protocol;
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ current->protection = protection = Public ;
+ addType( current ) ;
+ current->type += " protocol" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ YY_BREAK
+case 94:
+/* rule 94 can match eol */
+YY_RULE_SETUP
+#line 1411 "scanner.l"
+{ // Corba IDL exception
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Exception;
+ addType( current ) ;
+ current->type += " exception" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount();
+ BEGIN( CompoundName );
+ }
+ YY_BREAK
+case 95:
+#line 1424 "scanner.l"
+case 96:
+/* rule 96 can match eol */
+#line 1425 "scanner.l"
+case 97:
+/* rule 97 can match eol */
+YY_RULE_SETUP
+#line 1425 "scanner.l"
+{
+ isTypedef=((QCString)scanYYtext).find("typedef")!=-1;
+ current->section = Entry::CLASS_SEC;
+ addType( current ) ;
+ current->type += " class" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ if (scanYYtext[0]=='@')
+ {
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ }
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ if (insidePHP && current->spec&Entry::Abstract)
+ {
+ // convert Abstract to AbstractClass
+ current->spec=(current->spec&~Entry::Abstract)|Entry::AbstractClass;
+ }
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 98:
+#line 1448 "scanner.l"
+case 99:
+/* rule 99 can match eol */
+YY_RULE_SETUP
+#line 1448 "scanner.l"
+{
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Value;
+ addType( current ) ;
+ current->type += " value class" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 100:
+#line 1462 "scanner.l"
+case 101:
+/* rule 101 can match eol */
+YY_RULE_SETUP
+#line 1462 "scanner.l"
+{
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Ref;
+ addType( current ) ;
+ current->type += " ref class" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 102:
+#line 1476 "scanner.l"
+case 103:
+/* rule 103 can match eol */
+YY_RULE_SETUP
+#line 1476 "scanner.l"
+{
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Interface;
+ addType( current ) ;
+ current->type += " interface class" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 104:
+/* rule 104 can match eol */
+YY_RULE_SETUP
+#line 1489 "scanner.l"
+{
+ if (insideIDL)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ addType( current ) ;
+ current->type += " coclass" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ BEGIN( CompoundName ) ;
+ }
+ else
+ {
+ addType(current);
+ current->name = scanYYtext;
+ current->name = current->name.stripWhiteSpace();
+ lineCount();
+ }
+ }
+ YY_BREAK
+case 105:
+/* rule 105 can match eol */
+#line 1511 "scanner.l"
+case 106:
+/* rule 106 can match eol */
+YY_RULE_SETUP
+#line 1511 "scanner.l"
+{
+ isTypedef=((QCString)scanYYtext).find("typedef")!=-1;
+ current->section = Entry::CLASS_SEC ;
+ current->spec = Entry::Struct;
+ // bug 582676: can be a struct nested in an interface so keep insideObjC state
+ //current->objc = insideObjC = FALSE;
+ addType( current ) ;
+ current->type += " struct" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 107:
+#line 1527 "scanner.l"
+case 108:
+/* rule 108 can match eol */
+YY_RULE_SETUP
+#line 1527 "scanner.l"
+{
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Struct | Entry::Value;
+ addType( current ) ;
+ current->type += " value struct" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 109:
+#line 1541 "scanner.l"
+case 110:
+/* rule 110 can match eol */
+YY_RULE_SETUP
+#line 1541 "scanner.l"
+{
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Struct | Entry::Ref;
+ addType( current ) ;
+ current->type += " ref struct" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 111:
+#line 1555 "scanner.l"
+case 112:
+/* rule 112 can match eol */
+YY_RULE_SETUP
+#line 1555 "scanner.l"
+{
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Struct | Entry::Interface;
+ addType( current ) ;
+ current->type += " interface struct";
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 113:
+/* rule 113 can match eol */
+#line 1569 "scanner.l"
+case 114:
+/* rule 114 can match eol */
+YY_RULE_SETUP
+#line 1569 "scanner.l"
+{
+ isTypedef=((QCString)scanYYtext).find("typedef")!=-1;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Union;
+ // bug 582676: can be a struct nested in an interface so keep insideObjC state
+ //current->objc = insideObjC = FALSE;
+ addType( current ) ;
+ current->type += " union" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 115:
+/* rule 115 can match eol */
+#line 1585 "scanner.l"
+case 116:
+/* rule 116 can match eol */
+YY_RULE_SETUP
+#line 1585 "scanner.l"
+{ // for IDL: typedef [something] enum
+ isTypedef=((QCString)scanYYtext).find("typedef")!=-1;
+ current->section = Entry::ENUM_SEC ;
+ addType( current ) ;
+ current->type += " enum" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (scanYYtext[scanYYleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+ YY_BREAK
+case 117:
+/* rule 117 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 1597 "scanner.l"
+{ // A::operator()<int>(int arg)
+ lineCount();
+ current->name += "()";
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 118:
+/* rule 118 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 1602 "scanner.l"
+{
+ lineCount();
+ current->name += scanYYtext ;
+ current->name = current->name.simplifyWhiteSpace();
+ BEGIN( FindMembers ) ;
+ }
+ YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 1608 "scanner.l"
+{ // can occur when importing members
+ unput(';');
+ BEGIN( FindMembers ) ;
+ }
+ YY_BREAK
+case 120:
+/* rule 120 can match eol */
+YY_RULE_SETUP
+#line 1612 "scanner.l"
+{
+ lineCount();
+ current->name += *scanYYtext ;
+ }
+ YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 1616 "scanner.l"
+{ /* skip guided templ specifiers */ }
+ YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 1617 "scanner.l"
+{
+ current->name = current->name.simplifyWhiteSpace();
+ unput(*scanYYtext);
+ BEGIN( FindMembers ) ;
+ }
+ YY_BREAK
+case 123:
+/* rule 123 can match eol */
+YY_RULE_SETUP
+#line 1622 "scanner.l"
+{ // generic is a C++/CLI extension
+ lineCount();
+ if (current->tArgLists==0)
+ {
+ current->tArgLists = new QList<ArgumentList>;
+ current->tArgLists->setAutoDelete(TRUE);
+ }
+ ArgumentList *al = new ArgumentList;
+ //current->spec |= (scanYYtext[0]=='g') ? Entry::Generic : Entry::Template;
+ current->tArgLists->append(al);
+ currentArgumentList = al;
+ templateStr="<";
+ fullArgString = templateStr;
+ copyArgString = &templateStr;
+ currentArgumentContext = FindMembers;
+ BEGIN( ReadTempArgs );
+ }
+ YY_BREAK
+case 124:
+/* rule 124 can match eol */
+YY_RULE_SETUP
+#line 1639 "scanner.l"
+{ // namespace alias
+ lineCount();
+ BEGIN( NSAliasName );
+ }
+ YY_BREAK
+case 125:
+YY_RULE_SETUP
+#line 1643 "scanner.l"
+{
+ aliasName = scanYYtext;
+ BEGIN( NSAliasArg );
+ }
+ YY_BREAK
+case 126:
+YY_RULE_SETUP
+#line 1647 "scanner.l"
+{
+ //printf("Inserting namespace alias %s::%s->%s\n",current_root->name.data(),aliasName.data(),scanYYtext);
+ //if (current_root->name.isEmpty())
+ //{
+ // TODO: namespace aliases are now treated as global entities
+ // while they should be aware of the scope they are in
+ Doxygen::namespaceAliasDict.insert(aliasName,new QCString(scanYYtext));
+ //}
+ //else
+ //{
+ // Doxygen::namespaceAliasDict.insert(current_root->name+"::"+aliasName,
+ // new QCString(current_root->name+"::"+scanYYtext));
+ //}
+ }
+ YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 1661 "scanner.l"
+{
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 128:
+/* rule 128 can match eol */
+YY_RULE_SETUP
+#line 1664 "scanner.l"
+{
+ lineCount();
+ aliasName=scanYYtext;
+ //current->fileName = yyFileName;
+ //current->section=Entry::USINGDIR_SEC;
+ //current_root->addSubEntry(current);
+ //current = new Entry;
+ //initEntry();
+ BEGIN(PHPUseAs);
+ }
+ YY_BREAK
+case 129:
+/* rule 129 can match eol */
+YY_RULE_SETUP
+#line 1674 "scanner.l"
+{
+ lineCount();
+ }
+ YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 1677 "scanner.l"
+{
+ Doxygen::namespaceAliasDict.insert(scanYYtext,
+ new QCString(removeRedundantWhiteSpace(
+ substitute(aliasName,"\\","::"))));
+ aliasName.resize(0);
+ }
+ YY_BREAK
+case 131:
+YY_RULE_SETUP
+#line 1683 "scanner.l"
+{
+ if (!aliasName.isEmpty())
+ {
+ int i=aliasName.findRev('\\');
+ QCString an = removeRedundantWhiteSpace(
+ substitute(aliasName,"\\","::"));
+ Doxygen::namespaceAliasDict.insert(aliasName.mid(i+1),
+ new QCString(an));
+ current->name = an;
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ }
+ if (*scanYYtext==',')
+ {
+ BEGIN(PHPUse);
+ }
+ else
+ {
+ BEGIN(FindMembers);
+ }
+ }
+ YY_BREAK
+case 132:
+/* rule 132 can match eol */
+YY_RULE_SETUP
+#line 1707 "scanner.l"
+{ // package import => add as a using directive
+ lineCount();
+ QCString scope=scanYYtext;
+ current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-1),".","::"));
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ initEntry();
+ BEGIN(Using);
+ }
+ YY_BREAK
+case 133:
+/* rule 133 can match eol */
+YY_RULE_SETUP
+#line 1718 "scanner.l"
+{ // class import => add as a using declaration
+ lineCount();
+ QCString scope=scanYYtext;
+ current->name=removeRedundantWhiteSpace(substitute(scope,".","::"));
+ current->fileName = yyFileName;
+ if (insideD)
+ {
+ current->section=Entry::USINGDIR_SEC;
+ }
+ else
+ {
+ //printf("import name = %s -> %s\n",scanYYtext,current->name.data());
+ current->section=Entry::USINGDECL_SEC;
+ }
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Using);
+ }
+ YY_BREAK
+case 134:
+/* rule 134 can match eol */
+YY_RULE_SETUP
+#line 1737 "scanner.l"
+{
+ current->startLine=yyLineNr;
+ lineCount();
+ BEGIN(Using);
+ }
+ YY_BREAK
+case 135:
+/* rule 135 can match eol */
+YY_RULE_SETUP
+#line 1742 "scanner.l"
+{ lineCount(); BEGIN(UsingDirective); }
+ YY_BREAK
+case 136:
+/* rule 136 can match eol */
+YY_RULE_SETUP
+#line 1743 "scanner.l"
+{
+ lineCount();
+ current->name=scanYYtext;
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ if (insideCS) /* Hack: in C# a using declaration and
+ directive have the same syntax, so we
+ also add it as a using directive here
+ */
+ {
+ current->name=scanYYtext;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ }
+ initEntry();
+ BEGIN(Using);
+ }
+ YY_BREAK
+case 137:
+/* rule 137 can match eol */
+YY_RULE_SETUP
+#line 1765 "scanner.l"
+{ current->name=removeRedundantWhiteSpace(scanYYtext);
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Using);
+ }
+ YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 1773 "scanner.l"
+{ BEGIN(FindMembers); }
+ YY_BREAK
+case 139:
+/* rule 139 can match eol */
+YY_RULE_SETUP
+#line 1774 "scanner.l"
+{ // guided template decl
+ QCString n=scanYYtext;
+ addType( current );
+ current->name=n.left(n.length()-2);
+ }
+ YY_BREAK
+case 140:
+/* rule 140 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 1779 "scanner.l"
+{ // Note: this could be a return type!
+ sharpCount=0;
+ lineCount();
+ addType( current );
+ current->name=scanYYtext;
+ current->name=current->name.stripWhiteSpace();
+ //current->scopeSpec.resize(0);
+ // currentTemplateSpec = &current->scopeSpec;
+ if (nameIsOperator(current->name))
+ BEGIN( Operator );
+ else
+ BEGIN( EndTemplate );
+ }
+ YY_BREAK
+case 141:
+/* rule 141 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 1792 "scanner.l"
+{
+ sharpCount=0;
+ roundCount=0;
+ lineCount();
+ current->name+=((QCString)scanYYtext).stripWhiteSpace();
+ //current->memberSpec.resize(0);
+ // currentTemplateSpec = &current->memberSpec;
+ if (nameIsOperator(current->name))
+ BEGIN( Operator );
+ else
+ BEGIN( EndTemplate );
+ }
+ YY_BREAK
+case 142:
+YY_RULE_SETUP
+#line 1804 "scanner.l"
+{
+ current->name+=scanYYtext;
+ // *currentTemplateSpec+=scanYYtext;
+ }
+ YY_BREAK
+case 143:
+YY_RULE_SETUP
+#line 1808 "scanner.l"
+{
+ current->name+='<';
+ // *currentTemplateSpec+='<';
+ sharpCount++;
+ }
+ YY_BREAK
+case 144:
+YY_RULE_SETUP
+#line 1813 "scanner.l"
+{
+ if (insideJava || insideCS || insideCli || roundCount==0)
+ {
+ unput('>');
+ unput(' ');
+ unput('>');
+ }
+ else
+ {
+ current->name+=scanYYtext;
+ }
+ // *currentTemplateSpec+=scanYYtext;
+ }
+ YY_BREAK
+case 145:
+YY_RULE_SETUP
+#line 1826 "scanner.l"
+{
+ current->name+='>';
+ // *currentTemplateSpec+='>';
+ if (--sharpCount<=0)
+ {
+ //printf("Found %s\n",current->name.data());
+ BEGIN(FindMembers);
+ }
+ }
+ YY_BREAK
+case 146:
+/* rule 146 can match eol */
+YY_RULE_SETUP
+#line 1835 "scanner.l"
+{
+ lineCount();
+ current->name+='>';
+ // *currentTemplateSpec+='>';
+ if (--sharpCount<=0)
+ {
+ current->bodyLine = yyLineNr;
+ current->args = "(";
+ currentArgumentContext = FuncQual;
+ fullArgString = current->args.copy();
+ copyArgString = &current->args;
+ //printf("Found %s\n",current->name.data());
+ BEGIN( ReadFuncArgType ) ;
+ }
+ }
+ YY_BREAK
+case 147:
+/* rule 147 can match eol */
+YY_RULE_SETUP
+#line 1850 "scanner.l"
+{ // function pointer returning a template instance
+ lineCount();
+ current->name+='>';
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 148:
+/* rule 148 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 2;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 1855 "scanner.l"
+{
+ lineCount();
+ current->name+='>';
+ // *currentTemplateSpec+='>';
+ if (--sharpCount<=0)
+ {
+ BEGIN(FindMemberName);
+ }
+ }
+ YY_BREAK
+case 149:
+YY_RULE_SETUP
+#line 1864 "scanner.l"
+{ current->name+=*scanYYtext;
+ roundCount++;
+ }
+ YY_BREAK
+case 150:
+YY_RULE_SETUP
+#line 1867 "scanner.l"
+{ current->name+=*scanYYtext;
+ if (roundCount>0) roundCount--;
+ }
+ YY_BREAK
+case 151:
+YY_RULE_SETUP
+#line 1870 "scanner.l"
+{
+ current->name+=*scanYYtext;
+ // *currentTemplateSpec+=*scanYYtext;
+ }
+ YY_BREAK
+case 152:
+/* rule 152 can match eol */
+YY_RULE_SETUP
+#line 1874 "scanner.l"
+{
+ if (insidePHP)
+ {
+ current->bodyLine = yyLineNr;
+ BEGIN( DefinePHP );
+ }
+ else
+ REJECT;
+ }
+ YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 1883 "scanner.l"
+{ // Qt object macro
+ }
+ YY_BREAK
+case 154:
+YY_RULE_SETUP
+#line 1885 "scanner.l"
+{ // Qt property declaration
+ current->protection = protection = Public ;
+ current->mtype = mtype = Property;
+ current->type.resize(0);
+ BEGIN(QtPropType);
+ }
+ YY_BREAK
+case 155:
+YY_RULE_SETUP
+#line 1891 "scanner.l"
+{ // start of property arguments
+ }
+ YY_BREAK
+case 156:
+YY_RULE_SETUP
+#line 1893 "scanner.l"
+{ // end of property arguments
+ unput(';');
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 157:
+YY_RULE_SETUP
+#line 1897 "scanner.l"
+{
+ current->type+=scanYYtext;
+ }
+ YY_BREAK
+case 158:
+YY_RULE_SETUP
+#line 1900 "scanner.l"
+{
+ current->type+=scanYYtext;
+ }
+ YY_BREAK
+case 159:
+YY_RULE_SETUP
+#line 1903 "scanner.l"
+{
+ current->type+=scanYYtext;
+ BEGIN(QtPropName);
+ }
+ YY_BREAK
+case 160:
+YY_RULE_SETUP
+#line 1907 "scanner.l"
+{
+ current->name=scanYYtext;
+ BEGIN(QtPropAttr);
+ }
+ YY_BREAK
+case 161:
+YY_RULE_SETUP
+#line 1911 "scanner.l"
+{
+ current->spec |= Entry::Readable;
+ BEGIN(QtPropRead);
+ }
+ YY_BREAK
+case 162:
+YY_RULE_SETUP
+#line 1915 "scanner.l"
+{
+ current->spec |= Entry::Writable;
+ BEGIN(QtPropWrite);
+ }
+ YY_BREAK
+case 163:
+YY_RULE_SETUP
+#line 1919 "scanner.l"
+{ // reset method => not supported yet
+ }
+ YY_BREAK
+case 164:
+YY_RULE_SETUP
+#line 1921 "scanner.l"
+{ // scriptable property => not supported yet
+ }
+ YY_BREAK
+case 165:
+YY_RULE_SETUP
+#line 1923 "scanner.l"
+{ // designable property => not supported yet
+ }
+ YY_BREAK
+case 166:
+YY_RULE_SETUP
+#line 1925 "scanner.l"
+{
+ current->read = scanYYtext;
+ BEGIN(QtPropAttr);
+ }
+ YY_BREAK
+case 167:
+YY_RULE_SETUP
+#line 1929 "scanner.l"
+{
+ current->write = scanYYtext;
+ BEGIN(QtPropAttr);
+ }
+ YY_BREAK
+case 168:
+/* rule 168 can match eol */
+YY_RULE_SETUP
+#line 1933 "scanner.l"
+{
+ current->name=scanYYtext;
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 169:
+/* rule 169 can match eol */
+YY_RULE_SETUP
+#line 1937 "scanner.l"
+{
+ lineCount();
+ if (insideIDL && scanYYleng==9 && strcmp(scanYYtext,"cpp_quote")==0)
+ {
+ BEGIN(CppQuote);
+ }
+ else if ((insideIDL || insideJava || insideD) && scanYYleng==6 && strcmp(scanYYtext,"import")==0)
+ {
+ if (insideIDL)
+ BEGIN(NextSemi);
+ else // insideJava or insideD
+ BEGIN(JavaImport);
+ }
+ else if (insidePHP && strcmp(scanYYtext,"use")==0)
+ {
+ BEGIN(PHPUse);
+ }
+ else if (insideJava && strcmp(scanYYtext,"package")==0)
+ {
+ lineCount();
+ BEGIN(PackageName);
+ }
+ else if (insideIDL && strcmp(scanYYtext,"case")==0)
+ {
+ BEGIN(IDLUnionCase);
+ }
+ else if (insideTryBlock && strcmp(scanYYtext,"catch")==0)
+ {
+ insideTryBlock=FALSE;
+ BEGIN(TryFunctionBlock);
+ }
+ else if (insideJS && strcmp(scanYYtext,"var")==0)
+ { // javascript variable
+ current->type="var";
+ }
+ else if (insideJS && strcmp(scanYYtext,"function")==0)
+ { // javascript function
+ current->type="function";
+ }
+ else if (insideCS && strcmp(scanYYtext,"this")==0)
+ {
+ // C# indexer
+ addType( current ) ;
+ current->name="this";
+ BEGIN(CSIndexer);
+ }
+ else
+ {
+ if (YY_START==FindMembers)
+ {
+ addType( current ) ;
+ }
+ bool javaLike = insideJava || insideCS || insideD || insidePHP || insideJS;
+ if (javaLike && strcmp(scanYYtext,"public")==0)
+ {
+ current->protection = Public;
+ }
+ else if (javaLike && strcmp(scanYYtext,"protected")==0)
+ {
+ current->protection = Protected;
+ }
+ else if (javaLike && strcmp(scanYYtext,"private")==0)
+ {
+ current->protection = Private;
+ }
+ else if (javaLike && strcmp(scanYYtext,"static")==0)
+ {
+ if (YY_START==FindMembers)
+ current->name = scanYYtext;
+ else
+ current->name += scanYYtext;
+ current->stat = TRUE;
+ }
+ else
+ {
+ if (YY_START==FindMembers)
+ current->name = scanYYtext;
+ else
+ current->name += scanYYtext;
+ if (current->name.left(7)=="static ")
+ {
+ current->stat = TRUE;
+ current->name= current->name.mid(7);
+ }
+ else if (current->name.left(7)=="inline ")
+ {
+ if (current->type.isEmpty())
+ {
+ current->type="inline";
+ }
+ else
+ {
+ current->type+="inline ";
+ }
+ current->name= current->name.mid(7);
+ }
+ else if (current->name.left(6)=="const ")
+ {
+ if (current->type.isEmpty())
+ {
+ current->type="const";
+ }
+ else
+ {
+ current->type+="const ";
+ }
+ current->name=current->name.mid(6);
+ }
+ }
+ QCString tmp=scanYYtext;
+ if (nameIsOperator(tmp))
+ {
+ BEGIN( Operator );
+ }
+ else
+ {
+ BEGIN(FindMembers);
+ }
+ }
+ }
+ YY_BREAK
+case 170:
+YY_RULE_SETUP
+#line 2057 "scanner.l"
+{
+ current->name+=removeRedundantWhiteSpace(scanYYtext);
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 171:
+YY_RULE_SETUP
+#line 2061 "scanner.l"
+{ // some number where we did not expect one
+ }
+ YY_BREAK
+case 172:
+YY_RULE_SETUP
+#line 2063 "scanner.l"
+{
+ if (insideJava || insideCS || insideD)
+ {
+ current->name+=".";
+ }
+ }
+ YY_BREAK
+case 173:
+YY_RULE_SETUP
+#line 2069 "scanner.l"
+{
+ current->name+=scanYYtext;
+ }
+ YY_BREAK
+case 174:
+YY_RULE_SETUP
+#line 2072 "scanner.l"
+{
+ insideCppQuote=TRUE;
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 175:
+YY_RULE_SETUP
+#line 2076 "scanner.l"
+
+ YY_BREAK
+case 176:
+YY_RULE_SETUP
+#line 2077 "scanner.l"
+{ BEGIN(FindMembers); }
+ YY_BREAK
+case 177:
+/* rule 177 can match eol */
+YY_RULE_SETUP
+#line 2078 "scanner.l"
+{ yyLineNr++; }
+ YY_BREAK
+case 178:
+YY_RULE_SETUP
+#line 2079 "scanner.l"
+
+ YY_BREAK
+case 179:
+/* rule 179 can match eol */
+YY_RULE_SETUP
+#line 2080 "scanner.l"
+{ yyLineNr++; }
+ YY_BREAK
+case 180:
+YY_RULE_SETUP
+#line 2081 "scanner.l"
+{
+ curlyCount=0;
+ lastCurlyContext = TryFunctionBlockEnd ;
+ BEGIN( SkipCurly );
+ }
+ YY_BREAK
+case 181:
+YY_RULE_SETUP
+#line 2086 "scanner.l"
+
+ YY_BREAK
+case 182:
+/* rule 182 can match eol */
+YY_RULE_SETUP
+#line 2087 "scanner.l"
+{ lineCount(); BEGIN(TryFunctionBlock); // {BN}* added to fix bug 611193
+ }
+ YY_BREAK
+case 183:
+/* rule 183 can match eol */
+YY_RULE_SETUP
+#line 2089 "scanner.l"
+{ unput(*scanYYtext); // rule added to fix bug id 601138
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 184:
+YY_RULE_SETUP
+#line 2092 "scanner.l"
+{ unput(*scanYYtext);
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 185:
+YY_RULE_SETUP
+#line 2095 "scanner.l"
+{
+ insideCppQuote=FALSE;
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 186:
+YY_RULE_SETUP
+#line 2099 "scanner.l"
+{ if (insidePHP)
+ REJECT;
+ lastCPPContext = YY_START;
+ BEGIN( SkipCPP ) ;
+ }
+ YY_BREAK
+case 187:
+YY_RULE_SETUP
+#line 2104 "scanner.l"
+{
+ if (insidePHP)
+ REJECT;
+ current->bodyLine = yyLineNr;
+ BEGIN( Define );
+ }
+ YY_BREAK
+case 188:
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 2110 "scanner.l"
+{ /* line control directive */
+ yyLineNr = atoi(&scanYYtext[1]);
+ //printf("setting line number to %d\n",yyLineNr);
+ lastPreLineCtrlContext = YY_START;
+ if (YY_START==ReadBody ||
+ YY_START==ReadNSBody ||
+ YY_START==ReadBodyIntf)
+ {
+ current->program+=scanYYtext;
+ }
+ BEGIN( PreLineCtrl );
+ }
+ YY_BREAK
+case 189:
+YY_RULE_SETUP
+#line 2122 "scanner.l"
+{
+ yyFileName = stripQuotes(scanYYtext);
+ if (lastPreLineCtrlContext==ReadBody ||
+ lastPreLineCtrlContext==ReadNSBody ||
+ lastPreLineCtrlContext==ReadBodyIntf)
+ {
+ current->program+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 190:
+YY_RULE_SETUP
+#line 2131 "scanner.l"
+{
+ if (lastPreLineCtrlContext==ReadBody ||
+ lastPreLineCtrlContext==ReadNSBody ||
+ lastPreLineCtrlContext==ReadBodyIntf)
+ {
+ current->program+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 191:
+/* rule 191 can match eol */
+YY_RULE_SETUP
+#line 2139 "scanner.l"
+{
+ if (lastPreLineCtrlContext==ReadBody ||
+ lastPreLineCtrlContext==ReadNSBody ||
+ lastPreLineCtrlContext==ReadBodyIntf)
+ {
+ current->program+=scanYYtext;
+ }
+ yyLineNr++;
+ BEGIN( lastPreLineCtrlContext );
+ }
+ YY_BREAK
+case 192:
+YY_RULE_SETUP
+#line 2149 "scanner.l"
+
+ YY_BREAK
+case 193:
+/* rule 193 can match eol */
+YY_RULE_SETUP
+#line 2150 "scanner.l"
+{ yyLineNr++ ; }
+ YY_BREAK
+case 194:
+/* rule 194 can match eol */
+YY_RULE_SETUP
+#line 2151 "scanner.l"
+{ yyLineNr++ ;
+ BEGIN( lastCPPContext) ;
+ }
+ YY_BREAK
+case 195:
+YY_RULE_SETUP
+#line 2154 "scanner.l"
+{
+ current->name = scanYYtext;
+ current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
+ current->args = "(";
+ current->bodyLine = yyLineNr;
+ currentArgumentContext = DefineEnd;
+ fullArgString=current->args.copy();
+ copyArgString=&current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+ YY_BREAK
+/*
+<DefineArg>")" {
+ //printf("Define with args\n");
+ current->args += ')';
+ BEGIN( DefineEnd );
+ }
+<DefineArg>. {
+ current->args += *scanYYtext;
+ }
+ */
+case 196:
+YY_RULE_SETUP
+#line 2174 "scanner.l"
+{
+ //printf("Define `%s' without args\n",scanYYtext);
+ current->bodyLine = yyLineNr;
+ current->name = scanYYtext;
+ BEGIN(DefineEnd);
+ }
+ YY_BREAK
+case 197:
+/* rule 197 can match eol */
+YY_RULE_SETUP
+#line 2180 "scanner.l"
+{
+ //printf("End define: doc=%s docFile=%s docLine=%d\n",current->doc.data(),current->docFile.data(),current->docLine);
+ yyLineNr++;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->type.resize(0);
+ current->args = current->args.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::DEFINE_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 198:
+YY_RULE_SETUP
+#line 2194 "scanner.l"
+{
+ //printf("End define\n");
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->type.resize(0);
+ current->args = current->args.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::ENUM_SEC; //HACK!
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 199:
+YY_RULE_SETUP
+#line 2207 "scanner.l"
+
+ YY_BREAK
+case 200:
+/* rule 200 can match eol */
+YY_RULE_SETUP
+#line 2208 "scanner.l"
+{
+ yyLineNr++;
+ }
+ YY_BREAK
+case 201:
+YY_RULE_SETUP
+#line 2211 "scanner.l"
+{
+ if (insideIDL && insideCppQuote)
+ {
+ BEGIN(EndCppQuote);
+ }
+ else
+ {
+ lastStringContext=DefineEnd;
+ BEGIN(SkipString);
+ }
+ }
+ YY_BREAK
+case 202:
+YY_RULE_SETUP
+#line 2222 "scanner.l"
+
+ YY_BREAK
+case 203:
+/* rule 203 can match eol */
+YY_RULE_SETUP
+#line 2223 "scanner.l"
+{
+ current->name = scanYYtext;
+ current->name = current->name.stripWhiteSpace();
+ current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
+ current->name = current->name.left(current->name.length()-1);
+ current->args = "(";
+ current->bodyLine = yyLineNr;
+ lastRoundContext = DefinePHPEnd;
+ pCopyRoundString = &current->args;
+ roundCount = 0;
+ BEGIN( CopyRound );
+ }
+ YY_BREAK
+case 204:
+YY_RULE_SETUP
+#line 2236 "scanner.l"
+{ // ^ and % are C++/CLI extensions
+ if (insideCli)
+ {
+ addType( current );
+ current->name = scanYYtext ;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 205:
+YY_RULE_SETUP
+#line 2247 "scanner.l"
+{
+ if (current->type.stripWhiteSpace().right(1)!=scanYYtext)
+ {
+ current->name += scanYYtext ;
+ }
+ addType( current );
+ }
+ YY_BREAK
+case 206:
+/* rule 206 can match eol */
+YY_RULE_SETUP
+#line 2254 "scanner.l"
+{
+ lineCount();
+ if (current->bodyLine==-1)
+ {
+ current->bodyLine=yyLineNr;
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( scanYYtext[scanYYleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( scanYYtext[scanYYleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = ';';
+ if (scanYYtext[scanYYleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+ YY_BREAK
+case 207:
+/* rule 207 can match eol */
+YY_RULE_SETUP
+#line 2277 "scanner.l"
+{
+ lineCount();
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( scanYYtext[scanYYleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( scanYYtext[scanYYleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = ',';
+ if (scanYYtext[scanYYleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+ YY_BREAK
+case 208:
+/* rule 208 can match eol */
+YY_RULE_SETUP
+#line 2296 "scanner.l"
+{
+ lineCount();
+ if (current->bodyLine==-1)
+ {
+ current->bodyLine=yyLineNr;
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( scanYYtext[scanYYleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( scanYYtext[scanYYleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = 0;
+ if (scanYYtext[scanYYleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+ YY_BREAK
+case 209:
+YY_RULE_SETUP
+#line 2320 "scanner.l"
+{
+ //handleGroupStartCommand(current->name);
+ if (previous && previous->section==Entry::GROUPDOC_SEC)
+ {
+ // link open command to the group defined in the previous entry
+ openGroup(previous,yyFileName,yyLineNr);
+ }
+ else
+ {
+ // link open command to the current entry
+ openGroup(current,yyFileName,yyLineNr);
+ }
+ //current = tmp;
+ initEntry();
+ if (scanYYtext[1]=='/')
+ {
+ if (scanYYtext[2]=='!' || scanYYtext[2]=='/')
+ {
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = FALSE;
+ docBlock.resize(0);
+ docBlockTerm = 0;
+ startCommentBlock(TRUE);
+ BEGIN(DocLine);
+ }
+ else
+ {
+ lastCContext=YY_START;
+ BEGIN(SkipCxxComment);
+ }
+ }
+ else
+ {
+ if (scanYYtext[2]=='!' || scanYYtext[2]=='*')
+ {
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlock.resize(0);
+ docBlockAutoBrief = ( scanYYtext[scanYYleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( scanYYtext[scanYYleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlockTerm = 0;
+ startCommentBlock(FALSE);
+ BEGIN(DocBlock);
+ }
+ else
+ {
+ lastCContext=YY_START;
+ BEGIN(SkipComment);
+ }
+ }
+ }
+ YY_BREAK
+case 210:
+YY_RULE_SETUP
+#line 2372 "scanner.l"
+{
+ closeGroup(current,yyFileName,yyLineNr);
+ }
+ YY_BREAK
+case 211:
+YY_RULE_SETUP
+#line 2375 "scanner.l"
+{ // in PHP code this could also be due to "<?="
+ current->bodyLine = yyLineNr;
+ lastInitializerContext = YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+ YY_BREAK
+/* Read initializer rules */
+case 212:
+YY_RULE_SETUP
+#line 2382 "scanner.l"
+{
+ lastRoundContext=YY_START;
+ pCopyRoundGString=&current->initializer;
+ roundCount=0;
+ current->initializer+=*scanYYtext;
+ BEGIN(GCopyRound);
+ }
+ YY_BREAK
+case 213:
+YY_RULE_SETUP
+#line 2389 "scanner.l"
+{
+ lastCurlyContext=YY_START;
+ pCopyCurlyGString=&current->initializer;
+ curlyCount=0;
+ current->initializer+=*scanYYtext;
+ BEGIN(GCopyCurly);
+ }
+ YY_BREAK
+case 214:
+YY_RULE_SETUP
+#line 2396 "scanner.l"
+{
+ //printf(">> initializer `%s' <<\n",current->initializer.data());
+ if (*scanYYtext==';' || lastInitializerContext==FindFields)
+ {
+ unput(*scanYYtext);
+ BEGIN(lastInitializerContext);
+ }
+ else if (*scanYYtext==',' && initBracketCount==0) // for "int a=0,b=0"
+ {
+ unput(*scanYYtext);
+ BEGIN(lastInitializerContext);
+ }
+ else
+ {
+ current->initializer+=*scanYYtext;
+ }
+ }
+ YY_BREAK
+case 215:
+YY_RULE_SETUP
+#line 2413 "scanner.l"
+{
+ if (insideIDL && insideCppQuote)
+ {
+ BEGIN(EndCppQuote);
+ }
+ else
+ {
+ lastStringContext=YY_START;
+ current->initializer=scanYYtext;
+ pCopyQuotedGString=&current->initializer;
+ BEGIN(CopyGString);
+ }
+ }
+ YY_BREAK
+case 216:
+YY_RULE_SETUP
+#line 2426 "scanner.l"
+{
+ current->initializer+=scanYYtext;
+ }
+ YY_BREAK
+case 217:
+YY_RULE_SETUP
+#line 2429 "scanner.l"
+{
+ current->initializer+=scanYYtext;
+ }
+ YY_BREAK
+case 218:
+YY_RULE_SETUP
+#line 2432 "scanner.l"
+{
+ current->initializer+=scanYYtext;
+ }
+ YY_BREAK
+case 219:
+YY_RULE_SETUP
+#line 2435 "scanner.l"
+{
+ initBracketCount++;
+ current->initializer+=*scanYYtext;
+ }
+ YY_BREAK
+case 220:
+YY_RULE_SETUP
+#line 2439 "scanner.l"
+{
+ initBracketCount--;
+ current->initializer+=*scanYYtext;
+ }
+ YY_BREAK
+case 221:
+YY_RULE_SETUP
+#line 2443 "scanner.l"
+{
+ if (insidePHP)
+ {
+ current->initializer+=scanYYtext;
+ pCopyQuotedGString = &current->initializer;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ else
+ {
+ current->initializer+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 222:
+YY_RULE_SETUP
+#line 2456 "scanner.l"
+{
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ current->initializer+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 223:
+/* rule 223 can match eol */
+YY_RULE_SETUP
+#line 2466 "scanner.l"
+{
+ current->initializer+=*scanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+case 224:
+YY_RULE_SETUP
+#line 2470 "scanner.l"
+{
+ //printf("insideCS=%d\n",insideCS);
+ current->initializer+=scanYYtext;
+ if (!insideCS && !insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ // C#/ObjC verbatim string
+ lastSkipVerbStringContext=YY_START;
+ pSkipVerbString=&current->initializer;
+ BEGIN(SkipVerbString);
+ }
+ }
+ YY_BREAK
+case 225:
+YY_RULE_SETUP
+#line 2485 "scanner.l"
+{
+ *pSkipVerbString+=scanYYtext;
+ }
+ YY_BREAK
+case 226:
+YY_RULE_SETUP
+#line 2488 "scanner.l"
+{ // quote escape
+ *pSkipVerbString+=scanYYtext;
+ }
+ YY_BREAK
+case 227:
+YY_RULE_SETUP
+#line 2491 "scanner.l"
+{
+ *pSkipVerbString+=*scanYYtext;
+ BEGIN(lastSkipVerbStringContext);
+ }
+ YY_BREAK
+case 228:
+/* rule 228 can match eol */
+YY_RULE_SETUP
+#line 2495 "scanner.l"
+{
+ *pSkipVerbString+=*scanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+case 229:
+YY_RULE_SETUP
+#line 2499 "scanner.l"
+{
+ *pSkipVerbString+=*scanYYtext;
+ }
+ YY_BREAK
+case 230:
+YY_RULE_SETUP
+#line 2502 "scanner.l"
+{
+ if (insidePHP)
+ BEGIN( FindMembersPHP );
+ else
+ current->initializer+=scanYYtext;
+ }
+ YY_BREAK
+case 231:
+YY_RULE_SETUP
+#line 2508 "scanner.l"
+{
+ current->initializer+=*scanYYtext;
+ }
+ YY_BREAK
+/* generic quoted string copy rules */
+case 232:
+YY_RULE_SETUP
+#line 2513 "scanner.l"
+{
+ *pCopyQuotedString+=scanYYtext;
+ }
+ YY_BREAK
+case 233:
+YY_RULE_SETUP
+#line 2516 "scanner.l"
+{
+ *pCopyQuotedString+=*scanYYtext;
+ BEGIN( lastStringContext );
+ }
+ YY_BREAK
+case 234:
+YY_RULE_SETUP
+#line 2520 "scanner.l"
+{
+ *pCopyQuotedString+=*scanYYtext;
+ BEGIN( lastStringContext );
+ }
+ YY_BREAK
+case 235:
+YY_RULE_SETUP
+#line 2524 "scanner.l"
+{
+ *pCopyQuotedString+=scanYYtext;
+ }
+ YY_BREAK
+case 236:
+/* rule 236 can match eol */
+YY_RULE_SETUP
+#line 2527 "scanner.l"
+{
+ *pCopyQuotedString+=*scanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+case 237:
+YY_RULE_SETUP
+#line 2531 "scanner.l"
+{
+ *pCopyQuotedString+=*scanYYtext;
+ }
+ YY_BREAK
+/* generic quoted growable string copy rules */
+case 238:
+YY_RULE_SETUP
+#line 2536 "scanner.l"
+{
+ *pCopyQuotedGString+=scanYYtext;
+ }
+ YY_BREAK
+case 239:
+YY_RULE_SETUP
+#line 2539 "scanner.l"
+{
+ *pCopyQuotedGString+=*scanYYtext;
+ BEGIN( lastStringContext );
+ }
+ YY_BREAK
+case 240:
+YY_RULE_SETUP
+#line 2543 "scanner.l"
+{
+ *pCopyQuotedGString+=*scanYYtext;
+ BEGIN( lastStringContext );
+ }
+ YY_BREAK
+case 241:
+YY_RULE_SETUP
+#line 2547 "scanner.l"
+{
+ *pCopyQuotedGString+=scanYYtext;
+ }
+ YY_BREAK
+case 242:
+/* rule 242 can match eol */
+YY_RULE_SETUP
+#line 2550 "scanner.l"
+{
+ *pCopyQuotedGString+=*scanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+case 243:
+YY_RULE_SETUP
+#line 2554 "scanner.l"
+{
+ *pCopyQuotedGString+=*scanYYtext;
+ }
+ YY_BREAK
+/* generic round bracket list copy rules */
+case 244:
+YY_RULE_SETUP
+#line 2559 "scanner.l"
+{
+ *pCopyRoundString+=*scanYYtext;
+ pCopyQuotedString=pCopyRoundString;
+ lastStringContext=YY_START;
+ BEGIN(CopyString);
+ }
+ YY_BREAK
+case 245:
+YY_RULE_SETUP
+#line 2565 "scanner.l"
+{
+ *pCopyRoundString+=*scanYYtext;
+ roundCount++;
+ }
+ YY_BREAK
+case 246:
+YY_RULE_SETUP
+#line 2569 "scanner.l"
+{
+ *pCopyRoundString+=*scanYYtext;
+ if (--roundCount<0)
+ BEGIN(lastRoundContext);
+ }
+ YY_BREAK
+case 247:
+/* rule 247 can match eol */
+YY_RULE_SETUP
+#line 2574 "scanner.l"
+{
+ yyLineNr++;
+ *pCopyRoundString+=*scanYYtext;
+ }
+ YY_BREAK
+case 248:
+YY_RULE_SETUP
+#line 2578 "scanner.l"
+{
+ if (insidePHP)
+ {
+ current->initializer+=scanYYtext;
+ pCopyQuotedString = pCopyRoundString;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPString);
+ }
+ else
+ {
+ *pCopyRoundString+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 249:
+YY_RULE_SETUP
+#line 2591 "scanner.l"
+{
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *pCopyRoundString+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 250:
+YY_RULE_SETUP
+#line 2601 "scanner.l"
+{
+ *pCopyRoundString+=scanYYtext;
+ }
+ YY_BREAK
+case 251:
+YY_RULE_SETUP
+#line 2604 "scanner.l"
+{
+ *pCopyRoundString+=*scanYYtext;
+ }
+ YY_BREAK
+/* generic round bracket list copy rules for growable strings */
+case 252:
+YY_RULE_SETUP
+#line 2609 "scanner.l"
+{
+ *pCopyRoundGString+=*scanYYtext;
+ pCopyQuotedGString=pCopyRoundGString;
+ lastStringContext=YY_START;
+ BEGIN(CopyGString);
+ }
+ YY_BREAK
+case 253:
+YY_RULE_SETUP
+#line 2615 "scanner.l"
+{
+ *pCopyRoundGString+=*scanYYtext;
+ roundCount++;
+ }
+ YY_BREAK
+case 254:
+YY_RULE_SETUP
+#line 2619 "scanner.l"
+{
+ *pCopyRoundGString+=*scanYYtext;
+ if (--roundCount<0)
+ BEGIN(lastRoundContext);
+ }
+ YY_BREAK
+case 255:
+/* rule 255 can match eol */
+YY_RULE_SETUP
+#line 2624 "scanner.l"
+{
+ yyLineNr++;
+ *pCopyRoundGString+=*scanYYtext;
+ }
+ YY_BREAK
+case 256:
+YY_RULE_SETUP
+#line 2628 "scanner.l"
+{
+ if (insidePHP)
+ {
+ current->initializer+=scanYYtext;
+ pCopyQuotedGString = pCopyRoundGString;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ else
+ {
+ *pCopyRoundGString+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 257:
+YY_RULE_SETUP
+#line 2641 "scanner.l"
+{
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *pCopyRoundGString+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 258:
+YY_RULE_SETUP
+#line 2651 "scanner.l"
+{
+ *pCopyRoundGString+=scanYYtext;
+ }
+ YY_BREAK
+case 259:
+YY_RULE_SETUP
+#line 2654 "scanner.l"
+{
+ *pCopyRoundGString+=*scanYYtext;
+ }
+ YY_BREAK
+/* generic curly bracket list copy rules */
+case 260:
+YY_RULE_SETUP
+#line 2659 "scanner.l"
+{
+ *pCopyCurlyString+=*scanYYtext;
+ pCopyQuotedString=pCopyCurlyString;
+ lastStringContext=YY_START;
+ BEGIN(CopyString);
+ }
+ YY_BREAK
+case 261:
+YY_RULE_SETUP
+#line 2665 "scanner.l"
+{
+ *pCopyCurlyString+=*scanYYtext;
+ if (insidePHP)
+ {
+ pCopyQuotedString=pCopyCurlyString;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPString);
+ }
+ }
+ YY_BREAK
+case 262:
+YY_RULE_SETUP
+#line 2674 "scanner.l"
+{
+ *pCopyCurlyString+=*scanYYtext;
+ curlyCount++;
+ }
+ YY_BREAK
+case 263:
+YY_RULE_SETUP
+#line 2678 "scanner.l"
+{
+ *pCopyCurlyString+=*scanYYtext;
+ if (--curlyCount<0)
+ BEGIN(lastCurlyContext);
+ }
+ YY_BREAK
+case 264:
+YY_RULE_SETUP
+#line 2683 "scanner.l"
+{ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *pCopyCurlyString+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 265:
+YY_RULE_SETUP
+#line 2692 "scanner.l"
+{
+ *pCopyCurlyString+=scanYYtext;
+ }
+ YY_BREAK
+case 266:
+YY_RULE_SETUP
+#line 2695 "scanner.l"
+{ *pCopyCurlyString+=scanYYtext; }
+ YY_BREAK
+case 267:
+/* rule 267 can match eol */
+YY_RULE_SETUP
+#line 2696 "scanner.l"
+{
+ yyLineNr++;
+ *pCopyCurlyString+=*scanYYtext;
+ }
+ YY_BREAK
+case 268:
+YY_RULE_SETUP
+#line 2700 "scanner.l"
+{
+ *pCopyCurlyString+=*scanYYtext;
+ }
+ YY_BREAK
+/* generic curly bracket list copy rules for growable strings */
+case 269:
+/* rule 269 can match eol */
+YY_RULE_SETUP
+#line 2705 "scanner.l"
+{ // start of included file marker
+ }
+ YY_BREAK
+case 270:
+/* rule 270 can match eol */
+YY_RULE_SETUP
+#line 2707 "scanner.l"
+{ // end of included file marker
+ QCString line = QCString(scanYYtext);
+ int s = line.find(' ');
+ int e = line.find('"',s);
+ yyLineNr = line.mid(s,e-s).toInt();
+ if (scanYYtext[scanYYleng-1]=='\n')
+ {
+ yyLineNr++;
+ }
+ }
+ YY_BREAK
+case 271:
+YY_RULE_SETUP
+#line 2717 "scanner.l"
+{
+ *pCopyCurlyGString+=*scanYYtext;
+ pCopyQuotedGString=pCopyCurlyGString;
+ lastStringContext=YY_START;
+ BEGIN(CopyGString);
+ }
+ YY_BREAK
+case 272:
+YY_RULE_SETUP
+#line 2723 "scanner.l"
+{
+ *pCopyCurlyGString+=*scanYYtext;
+ if (insidePHP)
+ {
+ pCopyQuotedGString=pCopyCurlyGString;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ }
+ YY_BREAK
+case 273:
+YY_RULE_SETUP
+#line 2732 "scanner.l"
+{
+ *pCopyCurlyGString+=*scanYYtext;
+ curlyCount++;
+ }
+ YY_BREAK
+case 274:
+YY_RULE_SETUP
+#line 2736 "scanner.l"
+{
+ *pCopyCurlyGString+=*scanYYtext;
+ if (--curlyCount<0)
+ BEGIN(lastCurlyContext);
+ }
+ YY_BREAK
+case 275:
+YY_RULE_SETUP
+#line 2741 "scanner.l"
+{ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *pCopyCurlyGString+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 276:
+YY_RULE_SETUP
+#line 2750 "scanner.l"
+{
+ *pCopyCurlyGString+=scanYYtext;
+ }
+ YY_BREAK
+case 277:
+YY_RULE_SETUP
+#line 2753 "scanner.l"
+{ *pCopyCurlyGString+=scanYYtext; }
+ YY_BREAK
+case 278:
+/* rule 278 can match eol */
+YY_RULE_SETUP
+#line 2754 "scanner.l"
+{
+ yyLineNr++;
+ *pCopyCurlyGString+=*scanYYtext;
+ }
+ YY_BREAK
+case 279:
+YY_RULE_SETUP
+#line 2758 "scanner.l"
+{
+ *pCopyCurlyGString+=*scanYYtext;
+ }
+ YY_BREAK
+/* ---------------------- */
+case 280:
+YY_RULE_SETUP
+#line 2765 "scanner.l"
+{
+ if (current->type.isEmpty()) // anonymous padding field, e.g. "int :7;"
+ {
+ addType(current);
+ current->name.sprintf("__pad%d__",padCount++);
+ }
+ BEGIN(BitFields);
+ current->bitfields+=":";
+ }
+ YY_BREAK
+case 281:
+YY_RULE_SETUP
+#line 2774 "scanner.l"
+{
+ current->bitfields+=*scanYYtext;
+ }
+ YY_BREAK
+case 282:
+YY_RULE_SETUP
+#line 2777 "scanner.l"
+{
+ QCString oldType = current->type.copy();
+ if (current->bodyLine==-1)
+ {
+ current->bodyLine = yyLineNr;
+ }
+ if ( insidePHP && current->type.left(3) == "var" )
+ {
+ current->type = current->type.mid(3);
+ }
+ if (isTypedef && current->type.left(8)!="typedef ")
+ {
+ current->type.prepend("typedef ");
+ }
+ bool needNewCurrent=FALSE;
+ if (!current->name.isEmpty() && current->section!=Entry::ENUM_SEC)
+ {
+ current->type=current->type.simplifyWhiteSpace();
+ current->args=removeRedundantWhiteSpace(current->args);
+ current->name=current->name.stripWhiteSpace();
+ if (current->section==Entry::CLASS_SEC) // remove spec for "struct Bla bla;"
+ {
+ current->spec = 0;
+ }
+ current->section = Entry::VARIABLE_SEC ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current_root->addSubEntry( current ) ;
+ needNewCurrent=TRUE;
+ }
+ if ( *scanYYtext == ',')
+ {
+ if (needNewCurrent)
+ {
+ current = new Entry(*current);
+ initEntry();
+ }
+ current->name.resize(0);
+ current->args.resize(0);
+ current->brief.resize(0);
+ current->doc.resize(0);
+ current->initializer.resize(0);
+ current->bitfields.resize(0);
+ int i=oldType.length();
+ while (i>0 && (oldType[i-1]=='*' || oldType[i-1]=='&' || oldType[i-1]==' ')) i--;
+ current->type = oldType.left(i);
+ }
+ else
+ {
+ if (needNewCurrent)
+ {
+ current = new Entry ;
+ }
+ else if (current->groups)
+ {
+ current->groups->clear();
+ }
+ initEntry();
+ }
+ BEGIN( FindMembers ) ;
+ }
+ YY_BREAK
+case 283:
+YY_RULE_SETUP
+#line 2839 "scanner.l"
+{
+ if (!insideCS &&
+ (current->name.isEmpty() ||
+ current->name=="typedef"
+ )
+ ) // IDL function property
+ {
+ squareCount=1;
+ lastSquareContext = YY_START;
+ idlAttr.resize(0);
+ idlProp.resize(0);
+ current->mtype = mtype;
+ BEGIN( IDLAttribute );
+ }
+ else if (insideCS &&
+ current->name.isEmpty())
+ {
+ squareCount=1;
+ lastSquareContext = YY_START;
+ // Skip the C# attribute
+ // for this member
+ current->args.resize(0);
+ BEGIN( SkipSquare );
+ }
+ else
+ {
+ current->args += scanYYtext ;
+ squareCount=1;
+ BEGIN( Array ) ;
+ }
+ }
+ YY_BREAK
+case 284:
+YY_RULE_SETUP
+#line 2870 "scanner.l"
+{
+ // end of IDL function attribute
+ if (--squareCount<=0)
+ {
+ lineCount();
+ if (current->mtype == Property)
+ BEGIN( IDLPropName );
+ else
+ BEGIN( lastSquareContext );
+ }
+ }
+ YY_BREAK
+case 285:
+YY_RULE_SETUP
+#line 2881 "scanner.l"
+{
+ if (Config_getBool("IDL_PROPERTY_SUPPORT"))
+ {
+ current->mtype = Property;
+ }
+ current->spec |= Entry::Settable;
+ }
+ YY_BREAK
+case 286:
+YY_RULE_SETUP
+#line 2888 "scanner.l"
+{
+ if (Config_getBool("IDL_PROPERTY_SUPPORT"))
+ {
+ current->mtype = Property;
+ }
+ current->spec |= Entry::Gettable;
+ }
+ YY_BREAK
+case 287:
+YY_RULE_SETUP
+#line 2895 "scanner.l"
+{
+ }
+ YY_BREAK
+case 288:
+/* rule 288 can match eol */
+YY_RULE_SETUP
+#line 2897 "scanner.l"
+{
+ // return type (probably HRESULT) - skip it
+ }
+ YY_BREAK
+case 289:
+/* rule 289 can match eol */
+YY_RULE_SETUP
+#line 2900 "scanner.l"
+{
+ current->name = scanYYtext;
+ current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
+ current->startLine = yyLineNr;
+ BEGIN( IDLProp );
+ }
+ YY_BREAK
+case 290:
+/* rule 290 can match eol */
+YY_RULE_SETUP
+#line 2906 "scanner.l"
+{ // attribute of a parameter
+ idlAttr = scanYYtext;
+ idlAttr=idlAttr.stripWhiteSpace();
+ }
+ YY_BREAK
+case 291:
+YY_RULE_SETUP
+#line 2910 "scanner.l"
+{ // property type
+ idlProp = scanYYtext;
+ }
+ YY_BREAK
+case 292:
+/* rule 292 can match eol */
+YY_RULE_SETUP
+#line 2913 "scanner.l"
+{ // Rare: Another parameter ([propput] HRESULT Item(int index, [in] Type theRealProperty);)
+ if (!current->args)
+ current->args = "(";
+ else
+ current->args += ", ";
+ current->args += idlAttr;
+ current->args += " ";
+ current->args += idlProp; // prop was actually type of extra parameter
+ current->args += " ";
+ current->args += scanYYtext;
+ current->args = current->args.left(current->args.length() - 1); // strip comma
+ idlProp.resize(0);
+ idlAttr.resize(0);
+ BEGIN( IDLProp );
+ }
+ YY_BREAK
+case 293:
+/* rule 293 can match eol */
+YY_RULE_SETUP
+#line 2928 "scanner.l"
+{
+ // the parameter name for the property - just skip.
+ }
+ YY_BREAK
+case 294:
+YY_RULE_SETUP
+#line 2931 "scanner.l"
+{
+ current->fileName = yyFileName;
+ current->type = idlProp;
+ current->args = current->args.simplifyWhiteSpace();
+ if (current->args)
+ current->args += ")";
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::VARIABLE_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ initEntry();
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 295:
+YY_RULE_SETUP
+#line 2944 "scanner.l"
+{ // spaces, *, or other stuff
+ //idlProp+=scanYYtext;
+ }
+ YY_BREAK
+case 296:
+YY_RULE_SETUP
+#line 2947 "scanner.l"
+{ current->args += *scanYYtext ;
+ if (--squareCount<=0)
+ BEGIN( FindMembers ) ;
+ }
+ YY_BREAK
+case 297:
+YY_RULE_SETUP
+#line 2951 "scanner.l"
+{ current->args += *scanYYtext ;
+ if (--squareCount<=0)
+ BEGIN( Function ) ;
+ }
+ YY_BREAK
+case 298:
+YY_RULE_SETUP
+#line 2955 "scanner.l"
+{ current->args += *scanYYtext ;
+ squareCount++;
+ }
+ YY_BREAK
+case 299:
+YY_RULE_SETUP
+#line 2958 "scanner.l"
+{ current->args += *scanYYtext ; }
+ YY_BREAK
+case 300:
+YY_RULE_SETUP
+#line 2959 "scanner.l"
+{ squareCount++; }
+ YY_BREAK
+case 301:
+YY_RULE_SETUP
+#line 2960 "scanner.l"
+{
+ if (--squareCount<=0)
+ BEGIN( lastSquareContext );
+ }
+ YY_BREAK
+case 302:
+YY_RULE_SETUP
+#line 2964 "scanner.l"
+{
+ lastStringContext=YY_START;
+ BEGIN( SkipString );
+ }
+ YY_BREAK
+case 303:
+YY_RULE_SETUP
+#line 2968 "scanner.l"
+
+ YY_BREAK
+case 304:
+YY_RULE_SETUP
+#line 2969 "scanner.l"
+{ addType( current ) ;
+ current->type += scanYYtext ;
+ BEGIN( Sharp ) ;
+ }
+ YY_BREAK
+case 305:
+YY_RULE_SETUP
+#line 2973 "scanner.l"
+{ current->type += *scanYYtext ;
+ if (--sharpCount<=0)
+ BEGIN( FindMembers ) ;
+ }
+ YY_BREAK
+case 306:
+YY_RULE_SETUP
+#line 2977 "scanner.l"
+{ current->type += *scanYYtext ;
+ sharpCount++;
+ }
+ YY_BREAK
+case 307:
+/* rule 307 can match eol */
+YY_RULE_SETUP
+#line 2980 "scanner.l"
+{
+ lineCount();
+ }
+ YY_BREAK
+case 308:
+YY_RULE_SETUP
+#line 2983 "scanner.l"
+{ current->type += *scanYYtext ; }
+ YY_BREAK
+case 309:
+YY_RULE_SETUP
+#line 2984 "scanner.l"
+{
+ current->bodyLine = yyLineNr;
+ current->name = scanYYtext;
+ }
+ YY_BREAK
+case 310:
+YY_RULE_SETUP
+#line 2988 "scanner.l"
+{
+ // Java enum initializer
+ unput('(');
+ lastInitializerContext = YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+ YY_BREAK
+case 311:
+YY_RULE_SETUP
+#line 2995 "scanner.l"
+{
+ lastInitializerContext = YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+ YY_BREAK
+case 312:
+YY_RULE_SETUP
+#line 3000 "scanner.l"
+{
+ if (insideJava) // last enum field in Java class
+ {
+ if (!current->name.isEmpty())
+ {
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->type = "@"; // enum marker
+ current->args = current->args.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::VARIABLE_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ }
+
+ // TODO: skip until the end of the scope
+ BEGIN( SkipRemainder );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 313:
+/* rule 313 can match eol */
+YY_RULE_SETUP
+#line 3024 "scanner.l"
+{
+ yyLineNr++;
+ }
+ YY_BREAK
+case 314:
+YY_RULE_SETUP
+#line 3027 "scanner.l"
+
+ YY_BREAK
+case 315:
+YY_RULE_SETUP
+#line 3028 "scanner.l"
+{
+ //printf("adding `%s' `%s' `%s' to enum `%s' (mGrpId=%d)\n",
+ // current->type.data(), current->name.data(),
+ // current->args.data(), current_root->name.data(),current->mGrpId);
+ if (!current->name.isEmpty())
+ {
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->type = "@"; // enum marker
+ current->args = current->args.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::VARIABLE_SEC;
+ // add to the scope of the enum
+ current_root->addSubEntry(current);
+ if (!insideCS && !insideJava) // for C# and Java 1.5+ enum values always have to be explicitly qualified
+ {
+ current = new Entry(*current);
+ // add to the scope surrounding the enum (copy!)
+ current_root->parent()->addSubEntry(current);
+ }
+ current = new Entry ;
+ initEntry();
+ }
+ else // probably a redundant ,
+ {
+ current->reset();
+ }
+ }
+ YY_BREAK
+case 316:
+YY_RULE_SETUP
+#line 3056 "scanner.l"
+{ // attribute list in IDL
+ squareCount=1;
+ lastSquareContext = YY_START;
+ BEGIN(SkipSquare);
+ }
+ YY_BREAK
+/*
+<FindFieldArg>"," { unput(*scanYYtext); BEGIN(FindFields); }
+ */
+case 317:
+YY_RULE_SETUP
+#line 3064 "scanner.l"
+{ current->program += scanYYtext ; }
+ YY_BREAK
+case 318:
+YY_RULE_SETUP
+#line 3065 "scanner.l"
+{ current->program += scanYYtext ; }
+ YY_BREAK
+case 319:
+YY_RULE_SETUP
+#line 3066 "scanner.l"
+{ if (!insidePHP)
+ REJECT;
+ // append PHP comment.
+ current->program += scanYYtext ;
+ }
+ YY_BREAK
+case 320:
+YY_RULE_SETUP
+#line 3071 "scanner.l"
+{ current->program += scanYYtext ;
+ pSkipVerbString = &current->program;
+ lastSkipVerbStringContext=YY_START;
+ BEGIN( SkipVerbString );
+ }
+ YY_BREAK
+case 321:
+YY_RULE_SETUP
+#line 3076 "scanner.l"
+{ current->program += scanYYtext ;
+ pCopyQuotedGString = &current->program;
+ lastStringContext=YY_START;
+ BEGIN( CopyGString );
+ }
+ YY_BREAK
+case 322:
+YY_RULE_SETUP
+#line 3081 "scanner.l"
+{ current->program += scanYYtext ;
+ lastContext = YY_START ;
+ BEGIN( Comment ) ;
+ }
+ YY_BREAK
+case 323:
+/* rule 323 can match eol */
+YY_RULE_SETUP
+#line 3085 "scanner.l"
+{ current->program += scanYYtext ;
+ ++yyLineNr ;
+ lastContext = YY_START ;
+ BEGIN( Comment ) ;
+ }
+ YY_BREAK
+case 324:
+YY_RULE_SETUP
+#line 3090 "scanner.l"
+{
+ if (!insidePHP)
+ {
+ current->program += scanYYtext;
+ }
+ else
+ { // begin of single quoted string
+ current->program += scanYYtext;
+ pCopyQuotedGString = &current->program;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ }
+ YY_BREAK
+case 325:
+YY_RULE_SETUP
+#line 3103 "scanner.l"
+{
+ if (insidePHP)
+ {
+ REJECT; // for PHP code single quotes
+ // are used for strings of arbitrary length
+ }
+ else
+ {
+ current->program += scanYYtext;
+ }
+ }
+ YY_BREAK
+case 326:
+YY_RULE_SETUP
+#line 3114 "scanner.l"
+{ current->program += scanYYtext ;
+ ++curlyCount ;
+ }
+ YY_BREAK
+case 327:
+YY_RULE_SETUP
+#line 3117 "scanner.l"
+{
+ current->program += scanYYtext ;
+ --curlyCount ;
+ }
+ YY_BREAK
+case 328:
+YY_RULE_SETUP
+#line 3121 "scanner.l"
+{ //err("ReadBody count=%d\n",curlyCount);
+ if ( curlyCount>0 )
+ {
+ current->program += scanYYtext ;
+ --curlyCount ;
+ }
+ else
+ {
+ current->endBodyLine = yyLineNr;
+ QCString &cn = current->name;
+ QCString rn = current_root->name.copy();
+ //printf("cn=`%s' rn=`%s'\n",cn.data(),rn.data());
+ if (!cn.isEmpty() && !rn.isEmpty())
+ {
+ prependScope();
+ }
+ if (isTypedef && cn.isEmpty())
+ {
+ //printf("Typedef Name\n");
+ BEGIN( TypedefName );
+ }
+ else
+ {
+ if (current->section == Entry::ENUM_SEC)
+ {
+ current->program+=','; // add field terminator
+ }
+ // add compound definition to the tree
+ current->args=removeRedundantWhiteSpace(current->args);
+ // was: current->args.simplifyWhiteSpace();
+ current->type = current->type.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ //printf("adding `%s' `%s' `%s' brief=%s insideObjC=%d %x\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data(),insideObjC,current->section);
+ if (insideObjC &&
+ ((current->spec&Entry::Interface) || (current->spec==Entry::Category))
+ ) // method definition follows
+ {
+ BEGIN( ReadBodyIntf ) ;
+ }
+ else
+ {
+ current_root->addSubEntry( current ) ;
+ memspecEntry = current;
+ current = new Entry(*current);
+ if (current->section==Entry::NAMESPACE_SEC ||
+ (current->spec==Entry::Interface) ||
+ insideJava || insidePHP || insideCS || insideD || insideJS
+ )
+ { // namespaces and interfaces and java classes ends with a closing bracket without semicolon
+ current->reset();
+ initEntry();
+ memspecEntry = 0;
+ BEGIN( FindMembers ) ;
+ }
+ else
+ {
+ if (!isTypedef)
+ {
+ // enabled the next two lines for bug 623424
+ current->doc.resize(0);
+ current->brief.resize(0);
+ }
+ BEGIN( MemberSpec ) ;
+ }
+ }
+ }
+ }
+ }
+ YY_BREAK
+case 329:
+/* rule 329 can match eol */
+YY_RULE_SETUP
+#line 3189 "scanner.l"
+{ //err("ReadBody count=%d\n",curlyCount);
+ lineCount();
+ if ( curlyCount>0 )
+ {
+ current->program += scanYYtext ;
+ --curlyCount ;
+ }
+ else
+ {
+ isTypedef = TRUE;
+ current->endBodyLine = yyLineNr;
+ QCString &cn = current->name;
+ QCString rn = current_root->name.copy();
+ if (!cn.isEmpty() && !rn.isEmpty())
+ {
+ prependScope();
+ }
+ BEGIN( TypedefName );
+ }
+ }
+ YY_BREAK
+case 330:
+/* rule 330 can match eol */
+YY_RULE_SETUP
+#line 3209 "scanner.l"
+{ // late "const" or "volatile" keyword
+ lineCount();
+ current->type.prepend(scanYYtext);
+ }
+ YY_BREAK
+case 331:
+YY_RULE_SETUP
+#line 3213 "scanner.l"
+{
+ if (current->section == Entry::ENUM_SEC)
+ {
+ current->program+=","; // add field terminator
+ }
+ current->name=scanYYtext;
+ prependScope();
+ current->args = current->args.simplifyWhiteSpace();
+ current->type = current->type.simplifyWhiteSpace();
+ //printf("Adding compound %s %s %s\n",current->type.data(),current->name.data(),current->args.data());
+ current_root->addSubEntry( current ) ;
+ if (!firstTypedefEntry)
+ {
+ firstTypedefEntry = current;
+ }
+ current = new Entry;
+ initEntry();
+ isTypedef=TRUE; // to undo reset by initEntry()
+ BEGIN(MemberSpecSkip);
+ }
+ YY_BREAK
+case 332:
+YY_RULE_SETUP
+#line 3233 "scanner.l"
+{ /* typedef of anonymous type */
+ current->name.sprintf("@%d",anonCount++);
+ if (current->section == Entry::ENUM_SEC)
+ {
+ current->program+=','; // add field terminator
+ }
+ // add compound definition to the tree
+ current->args = current->args.simplifyWhiteSpace();
+ current->type = current->type.simplifyWhiteSpace();
+ current_root->addSubEntry( current ) ;
+ memspecEntry = current;
+ current = new Entry(*current);
+ initEntry();
+ unput(';');
+ BEGIN( MemberSpec ) ;
+ }
+ YY_BREAK
+case 333:
+/* rule 333 can match eol */
+YY_RULE_SETUP
+#line 3249 "scanner.l"
+{ // the [] part could be improved.
+ lineCount();
+ int i=0,l=scanYYleng,j;
+ while (i<l && (!isId(scanYYtext[i]))) i++;
+ msName = QCString(scanYYtext).right(l-i).stripWhiteSpace();
+ j=msName.find("[");
+ if (j!=-1)
+ {
+ msArgs=msName.right(msName.length()-j);
+ msName=msName.left(j);
+ }
+ msType=QCString(scanYYtext).left(i);
+
+ // handle *pName in: typedef { ... } name, *pName;
+ if (firstTypedefEntry)
+ {
+ if (firstTypedefEntry->spec&Entry::Struct)
+ {
+ msType.prepend("struct "+firstTypedefEntry->name);
+ }
+ else if (firstTypedefEntry->spec&Entry::Union)
+ {
+ msType.prepend("union "+firstTypedefEntry->name);
+ }
+ else if (firstTypedefEntry->section==Entry::ENUM_SEC)
+ {
+ msType.prepend("enum "+firstTypedefEntry->name);
+ }
+ else
+ {
+ msType.prepend(firstTypedefEntry->name);
+ }
+ }
+ }
+ YY_BREAK
+case 334:
+YY_RULE_SETUP
+#line 3283 "scanner.l"
+{ // function with struct return type
+ addType(current);
+ current->name = msName;
+ current->spec = 0;
+ unput('(');
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 335:
+YY_RULE_SETUP
+#line 3290 "scanner.l"
+{
+ //printf("current->name=`%s' msName=`%s'\n",current->name.data(),msName.data());
+ if (msName.isEmpty() && !current->name.isEmpty())
+ {
+ // see if the compound does not have a name or is inside another
+ // anonymous compound. If so we insert a
+ // special `anonymous' variable.
+ //Entry *p=current_root;
+ Entry *p=current;
+ while (p)
+ {
+ // only look for class scopes, not namespace scopes
+ if ((p->section & Entry::COMPOUND_MASK) && !p->name.isEmpty())
+ {
+ //printf("Trying scope `%s'\n",p->name.data());
+ int i=p->name.findRev("::");
+ int pi = (i==-1) ? 0 : i+2;
+ if (p->name.at(pi)=='@')
+ {
+ // anonymous compound inside -> insert dummy variable name
+ //printf("Adding anonymous variable for scope %s\n",p->name.data());
+ msName.sprintf("@%d",anonCount++);
+ break;
+ }
+ }
+ //p=p->parent;
+ if (p==current) p=current_root; else p=p->parent();
+ }
+ }
+ //printf("msName=%s current->name=%s\n",msName.data(),current->name.data());
+ if (!msName.isEmpty()
+ /*&& msName!=current->name*/) // skip typedef T {} T;, removed due to bug608493
+ {
+ static bool typedefHidesStruct = Config_getBool("TYPEDEF_HIDES_STRUCT");
+ // case 1: typedef struct _S { ... } S_t;
+ // -> omit typedef and use S_t as the struct name
+ if (typedefHidesStruct &&
+ isTypedef &&
+ ((current->spec&(Entry::Struct|Entry::Union)) ||
+ current->section==Entry::ENUM_SEC )&&
+ msType.stripWhiteSpace().isEmpty() &&
+ memspecEntry)
+ {
+ memspecEntry->name=msName;
+ }
+ else // case 2: create a typedef field
+ {
+ Entry *varEntry=new Entry;
+ varEntry->lang = language;
+ varEntry->protection = current->protection ;
+ varEntry->mtype = current->mtype;
+ varEntry->virt = current->virt;
+ varEntry->stat = current->stat;
+ varEntry->section = Entry::VARIABLE_SEC;
+ varEntry->name = msName.stripWhiteSpace();
+ varEntry->type = current->type.simplifyWhiteSpace()+" ";
+ varEntry->args = msArgs;
+ if (isTypedef)
+ {
+ varEntry->type.prepend("typedef ");
+ // //printf("current->name = %s %s\n",current->name.data(),msName.data());
+ }
+ if (typedefHidesStruct &&
+ isTypedef &&
+ (current->spec&(Entry::Struct|Entry::Union)) &&
+ memspecEntry
+ ) // case 1: use S_t as type for pS_t in "typedef struct _S {} S_t, *pS_t;"
+ {
+ varEntry->type+=memspecEntry->name+msType;
+ }
+ else // case 2: use _S as type for for pS_t
+ {
+ varEntry->type+=current->name+msType;
+ }
+ varEntry->fileName = yyFileName;
+ varEntry->startLine = yyLineNr;
+ varEntry->doc = current->doc.copy();
+ varEntry->brief = current->brief.copy();
+ varEntry->mGrpId = current->mGrpId;
+
+ // deep copy group list
+ QListIterator<Grouping> gli(*current->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ varEntry->groups->append(new Grouping(*g));
+ }
+ if (current->sli) // copy special list items
+ {
+ QListIterator<ListItemInfo> li(*current->sli);
+ ListItemInfo *lii;
+ for (li.toFirst();(lii=li.current());++li)
+ {
+ varEntry->addSpecialListItem(lii->type,lii->itemId);
+ }
+ }
+
+ //printf("Add: type=`%s',name=`%s',args=`%s' brief=%s doc=%s\n",
+ // varEntry->type.data(),varEntry->name.data(),
+ // varEntry->args.data(),varEntry->brief.data(),varEntry->doc.data());
+ current_root->addSubEntry(varEntry);
+ }
+ }
+ if (*scanYYtext==';') // end of a struct/class ...
+ {
+ if (msName.isEmpty() && memspecEntry && (current->section&Entry::COMPOUND_MASK))
+ { // case where a class/struct has a doc block after it
+ if (!current->doc.isEmpty())
+ {
+ memspecEntry->doc += current->doc;
+ }
+ if (!current->brief.isEmpty())
+ {
+ memspecEntry->brief += current->brief;
+ }
+ }
+ msType.resize(0);
+ msName.resize(0);
+ msArgs.resize(0);
+ isTypedef=FALSE;
+ firstTypedefEntry=0;
+ memspecEntry=0;
+ current->reset();
+ initEntry();
+ BEGIN( FindMembers );
+ }
+ else
+ {
+ current->doc.resize(0);
+ current->brief.resize(0);
+ }
+ }
+ YY_BREAK
+case 336:
+YY_RULE_SETUP
+#line 3422 "scanner.l"
+{
+ lastInitializerContext=YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ /* BEGIN(MemberSpecSkip); */
+ }
+ YY_BREAK
+/*
+<MemberSpecSkip>"{" {
+ curlyCount=0;
+ lastCurlyContext = MemberSpecSkip;
+ previous = current;
+ BEGIN(SkipCurly);
+ }
+ */
+case 337:
+YY_RULE_SETUP
+#line 3436 "scanner.l"
+{ BEGIN(MemberSpec); }
+ YY_BREAK
+case 338:
+YY_RULE_SETUP
+#line 3437 "scanner.l"
+{ unput(';'); BEGIN(MemberSpec); }
+ YY_BREAK
+case 339:
+/* rule 339 can match eol */
+YY_RULE_SETUP
+#line 3438 "scanner.l"
+{ current->program += scanYYtext ;
+ lineCount() ;
+ }
+ YY_BREAK
+case 340:
+/* rule 340 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 4;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3441 "scanner.l"
+{ // end of Objective C block
+ current_root->addSubEntry( current ) ;
+ current=new Entry;
+ initEntry();
+ insideObjC=FALSE;
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 341:
+YY_RULE_SETUP
+#line 3448 "scanner.l"
+{ current->program += scanYYtext ; }
+ YY_BREAK
+case 342:
+/* rule 342 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+#line 3451 "scanner.l"
+case 343:
+/* rule 343 can match eol */
+YY_RULE_SETUP
+#line 3451 "scanner.l"
+{ /* typedef void (A::*ptr_t)(args...) or int (*func(int))[], the ^ is for Obj-C blocks */
+ if (insidePHP) // reference parameter
+ {
+ REJECT
+ }
+ else
+ {
+ current->bodyLine = yyLineNr;
+ lineCount();
+ addType(current);
+ funcPtrType=scanYYtext;
+ roundCount=0;
+ //current->type += scanYYtext;
+ BEGIN( FuncPtr );
+ }
+ }
+ YY_BREAK
+case 344:
+/* rule 344 can match eol */
+YY_RULE_SETUP
+#line 3467 "scanner.l"
+{
+ current->name = scanYYtext;
+ if (nameIsOperator(current->name))
+ {
+ BEGIN( FuncPtrOperator );
+ }
+ else
+ {
+ if (current->name=="const" || current->name=="volatile")
+ {
+ funcPtrType += current->name;
+ }
+ else
+ {
+ BEGIN( EndFuncPtr );
+ }
+ }
+ }
+ YY_BREAK
+case 345:
+YY_RULE_SETUP
+#line 3485 "scanner.l"
+{
+ //printf("error: FuncPtr `%c' unexpected at line %d of %s\n",*scanYYtext,yyLineNr,yyFileName);
+ }
+ YY_BREAK
+case 346:
+/* rule 346 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3488 "scanner.l"
+{
+ current->name += scanYYtext;
+ current->name = current->name.simplifyWhiteSpace();
+ lineCount();
+ }
+ YY_BREAK
+case 347:
+/* rule 347 can match eol */
+YY_RULE_SETUP
+#line 3493 "scanner.l"
+{
+ yyLineNr++;
+ current->name += *scanYYtext;
+ }
+ YY_BREAK
+case 348:
+YY_RULE_SETUP
+#line 3497 "scanner.l"
+{
+ unput(*scanYYtext);
+ BEGIN( EndFuncPtr );
+ }
+ YY_BREAK
+case 349:
+YY_RULE_SETUP
+#line 3501 "scanner.l"
+{
+ current->name += *scanYYtext;
+ }
+ YY_BREAK
+case 350:
+/* rule 350 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3504 "scanner.l"
+{ // a variable with extra braces
+ lineCount();
+ current->type+=funcPtrType.data()+1;
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 351:
+/* rule 351 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3509 "scanner.l"
+{ // a function pointer
+ lineCount();
+ current->type+=funcPtrType+")";
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 352:
+/* rule 352 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3514 "scanner.l"
+{ // an array of variables
+ lineCount();
+ current->type+=funcPtrType.data();
+ current->args += ")";
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 353:
+YY_RULE_SETUP
+#line 3520 "scanner.l"
+{ // a function returning a function or
+ // a function returning a pointer to an array
+ current->args += *scanYYtext ;
+ //roundCount=0;
+ //BEGIN( FuncFunc );
+ current->bodyLine = yyLineNr;
+ currentArgumentContext = FuncFuncEnd;
+ fullArgString=current->args.copy();
+ copyArgString=&current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+ YY_BREAK
+case 354:
+YY_RULE_SETUP
+#line 3531 "scanner.l"
+{
+ funcPtrType+=scanYYtext;
+ }
+ YY_BREAK
+case 355:
+YY_RULE_SETUP
+#line 3534 "scanner.l"
+{
+ BEGIN(FindMembers);
+ }
+ YY_BREAK
+case 356:
+YY_RULE_SETUP
+#line 3537 "scanner.l"
+{
+ current->args += *scanYYtext ;
+ ++roundCount;
+ }
+ YY_BREAK
+case 357:
+YY_RULE_SETUP
+#line 3541 "scanner.l"
+{
+ current->args += *scanYYtext ;
+ if ( roundCount )
+ --roundCount;
+ else
+ {
+ BEGIN(FuncFuncEnd);
+ }
+ }
+ YY_BREAK
+case 358:
+/* rule 358 can match eol */
+YY_RULE_SETUP
+#line 3550 "scanner.l"
+{
+ lineCount();
+ current->type+=funcPtrType+")(";
+ BEGIN(FuncFuncType);
+ }
+ YY_BREAK
+case 359:
+/* rule 359 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3555 "scanner.l"
+{
+ lineCount();
+ current->type+=funcPtrType.data()+1;
+ BEGIN(Function);
+ }
+ YY_BREAK
+case 360:
+/* rule 360 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3560 "scanner.l"
+{ // function returning a pointer to an array
+ lineCount();
+ current->type+=funcPtrType;
+ current->args+=")";
+ BEGIN(FuncFuncArray);
+ }
+ YY_BREAK
+case 361:
+YY_RULE_SETUP
+#line 3566 "scanner.l"
+{
+ current->args += *scanYYtext;
+ }
+ YY_BREAK
+case 362:
+YY_RULE_SETUP
+#line 3569 "scanner.l"
+{
+ current->type += *scanYYtext;
+ roundCount++;
+ }
+ YY_BREAK
+case 363:
+YY_RULE_SETUP
+#line 3573 "scanner.l"
+{
+ current->type += *scanYYtext;
+ if (roundCount)
+ --roundCount;
+ else
+ BEGIN(Function);
+ }
+ YY_BREAK
+case 364:
+/* rule 364 can match eol */
+YY_RULE_SETUP
+#line 3580 "scanner.l"
+{ lineCount() ; current->type += ", " ; }
+ YY_BREAK
+case 365:
+/* rule 365 can match eol */
+YY_RULE_SETUP
+#line 3581 "scanner.l"
+{ lineCount() ; current->type += ' ' ; }
+ YY_BREAK
+case 366:
+YY_RULE_SETUP
+#line 3582 "scanner.l"
+{
+ current->type += *scanYYtext;
+ }
+ YY_BREAK
+case 367:
+/* rule 367 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3585 "scanner.l"
+{ // for catching typedef void (__stdcall *f)() like definitions
+ if (current->type.left(7)=="typedef" && current->bodyLine==-1)
+ // the bodyLine check is to prevent this guard to be true more than once
+ {
+ current->bodyLine = yyLineNr;
+ BEGIN( GetCallType );
+ }
+ else if (!current->name.isEmpty()) // normal function
+ {
+ current->args = scanYYtext;
+ current->bodyLine = yyLineNr;
+ currentArgumentContext = FuncQual;
+ fullArgString=current->args.copy();
+ copyArgString=&current->args;
+ BEGIN( ReadFuncArgType ) ;
+ //printf(">>> Read function arguments!\n");
+ }
+ }
+ YY_BREAK
+case 368:
+/* rule 368 can match eol */
+YY_RULE_SETUP
+#line 3603 "scanner.l"
+{
+ lineCount();
+ addType(current);
+ funcPtrType="(";
+ funcPtrType+=scanYYtext;
+ roundCount=0;
+ BEGIN( FuncPtr );
+ }
+ YY_BREAK
+case 369:
+YY_RULE_SETUP
+#line 3611 "scanner.l"
+{
+ if (!current->name.isEmpty())
+ {
+ current->args = scanYYtext;
+ current->bodyLine = yyLineNr;
+ currentArgumentContext = FuncQual;
+ fullArgString=current->args.copy();
+ copyArgString=&current->args;
+ BEGIN( ReadFuncArgType ) ;
+ //printf(">>> Read function arguments current->argList->count()=%d\n",current->argList->count());
+ }
+ }
+ YY_BREAK
+/*
+<FindMembers>"("{BN}*("void"{BN}*)?")" {
+ lineCount();
+ current->args = "()";
+ BEGIN( FuncQual );
+ }
+ */
+/*- Function argument reading rules ---------------------------------------*/
+case 370:
+YY_RULE_SETUP
+#line 3633 "scanner.l"
+{ *copyArgString+=scanYYtext;
+ fullArgString+=scanYYtext;
+ }
+ YY_BREAK
+case 371:
+YY_RULE_SETUP
+#line 3636 "scanner.l"
+{ *copyArgString+=scanYYtext;
+ fullArgString+=scanYYtext;
+ }
+ YY_BREAK
+case 372:
+YY_RULE_SETUP
+#line 3639 "scanner.l"
+{
+ *copyArgString+=scanYYtext;
+ fullArgString+=scanYYtext;
+ }
+ YY_BREAK
+case 373:
+/* rule 373 can match eol */
+YY_RULE_SETUP
+#line 3643 "scanner.l"
+{
+ *copyArgString+=" ";
+ fullArgString+=" ";
+ lineCount();
+ }
+ YY_BREAK
+case 374:
+YY_RULE_SETUP
+#line 3648 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ lastCopyArgStringContext = YY_START;
+ BEGIN( CopyArgString );
+ }
+ YY_BREAK
+case 375:
+YY_RULE_SETUP
+#line 3654 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ argRoundCount=0;
+ lastCopyArgContext = YY_START;
+ BEGIN( CopyArgRound );
+ }
+ YY_BREAK
+case 376:
+YY_RULE_SETUP
+#line 3661 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ stringToArgumentList(fullArgString,current->argList);
+ if (insideJS)
+ {
+ fixArgumentListForJavaScript(current->argList);
+ }
+ handleParametersCommentBlocks(current->argList);
+
+ /* remember the current documentation block, since
+ we could overwrite it with the documentation of
+ a function argument, which we then have to correct later
+ on
+ */
+ docBackup = current->doc;
+ briefBackup = current->brief;
+
+ BEGIN( currentArgumentContext );
+ }
+ YY_BREAK
+/* a special comment */
+case 377:
+YY_RULE_SETUP
+#line 3682 "scanner.l"
+{
+ if (currentArgumentContext==DefineEnd)
+ {
+ // for defines we interpret a comment
+ // as documentation for the define
+ int i;for (i=scanYYleng-1;i>=0;i--)
+ {
+ unput(scanYYtext[i]);
+ }
+ stringToArgumentList(fullArgString,current->argList);
+ handleParametersCommentBlocks(current->argList);
+ BEGIN( currentArgumentContext );
+ }
+ else // not a define
+ {
+ // for functions we interpret a comment
+ // as documentation for the argument
+ fullArgString+=scanYYtext;
+ lastCopyArgChar=0;
+ lastCommentInArgContext=YY_START;
+ if (scanYYtext[1]=='/')
+ BEGIN( CopyArgCommentLine );
+ else
+ BEGIN( CopyArgComment );
+ }
+ }
+ YY_BREAK
+/* a non-special comment */
+case 378:
+YY_RULE_SETUP
+#line 3709 "scanner.l"
+{ /* empty comment */ }
+ YY_BREAK
+case 379:
+YY_RULE_SETUP
+#line 3710 "scanner.l"
+{
+ lastCContext = YY_START;
+ BEGIN( SkipComment );
+ }
+ YY_BREAK
+case 380:
+YY_RULE_SETUP
+#line 3714 "scanner.l"
+{
+ lastCContext = YY_START;
+ BEGIN( SkipCxxComment );
+ }
+ YY_BREAK
+/*
+<ReadFuncArgType,ReadTempArgs>"'#" { if (insidePHP)
+ REJECT;
+ *copyArgString+=scanYYtext;
+ fullArgString+=scanYYtext;
+ }
+<ReadFuncArgType,ReadTempArgs>"#" {
+ if (!insidePHP)
+ REJECT;
+ lastCContext = YY_START;
+ BEGIN( SkipCxxComment );
+ }
+ */
+/* `)' followed by a special comment */
+case 381:
+/* rule 381 can match eol */
+YY_RULE_SETUP
+#line 3732 "scanner.l"
+{
+ lineCount();
+ if (currentArgumentContext==DefineEnd)
+ {
+ // for defines we interpret a comment
+ // as documentation for the define
+ int i;for (i=scanYYleng-1;i>0;i--)
+ {
+ unput(scanYYtext[i]);
+ }
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ stringToArgumentList(fullArgString,current->argList);
+ handleParametersCommentBlocks(current->argList);
+ BEGIN( currentArgumentContext );
+ }
+ else
+ {
+ // for functions we interpret a comment
+ // as documentation for the last argument
+ lastCopyArgChar=*scanYYtext;
+ QCString text=&scanYYtext[1];
+ text=text.stripWhiteSpace();
+ lastCommentInArgContext=YY_START;
+ fullArgString+=text;
+ if (text.find("//")!=-1)
+ BEGIN( CopyArgCommentLine );
+ else
+ BEGIN( CopyArgComment );
+ }
+ }
+ YY_BREAK
+case 382:
+/* rule 382 can match eol */
+YY_RULE_SETUP
+#line 3763 "scanner.l"
+
+ YY_BREAK
+case 383:
+YY_RULE_SETUP
+#line 3764 "scanner.l"
+{ fullArgString+=scanYYtext; }
+ YY_BREAK
+case 384:
+YY_RULE_SETUP
+#line 3765 "scanner.l"
+{ fullArgString+=scanYYtext;
+ if (lastCopyArgChar!=0)
+ unput(lastCopyArgChar);
+ BEGIN( lastCommentInArgContext );
+ }
+ YY_BREAK
+case 385:
+/* rule 385 can match eol */
+YY_RULE_SETUP
+#line 3770 "scanner.l"
+{ fullArgString+=scanYYtext;
+ yyLineNr++;
+ if (lastCopyArgChar!=0)
+ unput(lastCopyArgChar);
+ BEGIN( lastCommentInArgContext );
+ }
+ YY_BREAK
+case 386:
+/* rule 386 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3776 "scanner.l"
+{ // verbatim command (which could contain nested comments!)
+ docBlockName=&scanYYtext[1];
+ fullArgString+=scanYYtext;
+ BEGIN(CopyArgVerbatim);
+ }
+ YY_BREAK
+case 387:
+YY_RULE_SETUP
+#line 3781 "scanner.l"
+{
+ docBlockName=&scanYYtext[1];
+ if (docBlockName.at(1)=='[')
+ {
+ docBlockName.at(1)='}';
+ }
+ if (docBlockName.at(1)=='{')
+ {
+ docBlockName.at(1)='}';
+ }
+ fullArgString+=scanYYtext;
+ BEGIN(CopyArgVerbatim);
+ }
+ YY_BREAK
+case 388:
+/* rule 388 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 3794 "scanner.l"
+{ // end of verbatim block
+ fullArgString+=scanYYtext;
+ if (scanYYtext[1]=='f') // end of formula
+ {
+ BEGIN(CopyArgCommentLine);
+ }
+ if (&scanYYtext[4]==docBlockName)
+ {
+ BEGIN(CopyArgCommentLine);
+ }
+ }
+ YY_BREAK
+case 389:
+YY_RULE_SETUP
+#line 3805 "scanner.l"
+{ fullArgString+=scanYYtext; }
+ YY_BREAK
+case 390:
+YY_RULE_SETUP
+#line 3806 "scanner.l"
+{ fullArgString+=*scanYYtext; }
+ YY_BREAK
+case 391:
+/* rule 391 can match eol */
+YY_RULE_SETUP
+#line 3807 "scanner.l"
+{ fullArgString+=*scanYYtext; yyLineNr++; }
+ YY_BREAK
+case 392:
+YY_RULE_SETUP
+#line 3808 "scanner.l"
+{ fullArgString+=*scanYYtext; }
+ YY_BREAK
+case 393:
+YY_RULE_SETUP
+#line 3809 "scanner.l"
+{
+ warn(yyFileName,yyLineNr,
+ "warning: Ignoring %cbrief command inside argument documentation",*scanYYtext
+ );
+ fullArgString+=' ';
+ }
+ YY_BREAK
+case 394:
+YY_RULE_SETUP
+#line 3815 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ argSharpCount=1;
+ BEGIN( CopyArgSharp );
+ }
+ YY_BREAK
+case 395:
+YY_RULE_SETUP
+#line 3821 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ //printf("end template list %s\n",copyArgString->data());
+ stringToArgumentList(fullArgString,currentArgumentList);
+ BEGIN( currentArgumentContext );
+ }
+ YY_BREAK
+case 396:
+YY_RULE_SETUP
+#line 3828 "scanner.l"
+{
+ argRoundCount++;
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ }
+ YY_BREAK
+case 397:
+YY_RULE_SETUP
+#line 3833 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ if (argRoundCount>0)
+ argRoundCount--;
+ else
+ BEGIN( lastCopyArgContext );
+ }
+ YY_BREAK
+case 398:
+YY_RULE_SETUP
+#line 3841 "scanner.l"
+{
+ argSharpCount++;
+ //printf("argSharpCount++=%d copy\n",argSharpCount);
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ }
+ YY_BREAK
+case 399:
+YY_RULE_SETUP
+#line 3847 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ argSharpCount--;
+ if (argSharpCount>0)
+ {
+ //printf("argSharpCount--=%d copy\n",argSharpCount);
+ }
+ else
+ {
+ BEGIN( ReadTempArgs );
+ //printf("end of argSharpCount\n");
+ }
+ }
+ YY_BREAK
+case 400:
+YY_RULE_SETUP
+#line 3861 "scanner.l"
+{
+ *copyArgString+=scanYYtext;
+ fullArgString+=scanYYtext;
+ }
+ YY_BREAK
+case 401:
+YY_RULE_SETUP
+#line 3865 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ BEGIN( lastCopyArgStringContext );
+ }
+ YY_BREAK
+case 402:
+YY_RULE_SETUP
+#line 3870 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ BEGIN( lastCopyArgStringContext );
+ }
+ YY_BREAK
+case 403:
+YY_RULE_SETUP
+#line 3875 "scanner.l"
+{
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *copyArgString+=scanYYtext;
+ fullArgString+=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 404:
+YY_RULE_SETUP
+#line 3886 "scanner.l"
+{
+ *copyArgString+=scanYYtext;
+ fullArgString+=scanYYtext;
+ if (insidePHP)
+ {
+ lastCopyArgStringContext=YY_START;
+ BEGIN(CopyArgPHPString);
+ }
+ }
+ YY_BREAK
+case 405:
+/* rule 405 can match eol */
+YY_RULE_SETUP
+#line 3895 "scanner.l"
+{
+ yyLineNr++;
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ }
+ YY_BREAK
+case 406:
+YY_RULE_SETUP
+#line 3900 "scanner.l"
+{
+ *copyArgString+=*scanYYtext;
+ fullArgString+=*scanYYtext;
+ }
+ YY_BREAK
+/*------------------------------------------------------------------------*/
+case 407:
+YY_RULE_SETUP
+#line 3910 "scanner.l"
+{ current->args += *scanYYtext ;
+ ++roundCount ;
+ }
+ YY_BREAK
+case 408:
+YY_RULE_SETUP
+#line 3913 "scanner.l"
+{ current->args += *scanYYtext ;
+ if ( roundCount )
+ --roundCount ;
+ else
+ BEGIN( FuncQual ) ;
+ }
+ YY_BREAK
+/*
+<FuncQual>"#" { if (insidePHP)
+ REJECT;
+ lastCPPContext = YY_START;
+ BEGIN(SkipCPP);
+ }
+ */
+case 409:
+YY_RULE_SETUP
+#line 3926 "scanner.l"
+{
+ if ( strcmp(scanYYtext,";")==0 &&
+ insidePHP &&
+ !containsWord(current->type,"function") )
+ {
+ current->reset();
+ initEntry();
+ BEGIN( FindMembers );
+ }
+ else
+ {
+ unput(*scanYYtext); BEGIN( Function );
+ }
+ }
+ YY_BREAK
+case 410:
+/* rule 410 can match eol */
+YY_RULE_SETUP
+#line 3940 "scanner.l"
+{ // pure virtual member function
+ lineCount() ;
+ current->virt = Pure;
+ current->args += " override ";
+ }
+ YY_BREAK
+case 411:
+/* rule 411 can match eol */
+YY_RULE_SETUP
+#line 3945 "scanner.l"
+{ // overridden virtual member function
+ lineCount() ;
+ current->spec |= Entry::Override;
+ current->args += " override ";
+ }
+ YY_BREAK
+case 412:
+/* rule 412 can match eol */
+YY_RULE_SETUP
+#line 3950 "scanner.l"
+{ // sealed member function
+ lineCount() ;
+ current->spec |= Entry::Sealed;
+ current->args += " sealed ";
+ }
+ YY_BREAK
+case 413:
+/* rule 413 can match eol */
+YY_RULE_SETUP
+#line 3955 "scanner.l"
+{ // new member function
+ lineCount() ;
+ current->spec |= Entry::New;
+ current->args += " new ";
+ }
+ YY_BREAK
+case 414:
+/* rule 414 can match eol */
+YY_RULE_SETUP
+#line 3960 "scanner.l"
+{ // const member function
+ lineCount() ;
+ current->args += " const ";
+ current->argList->constSpecifier=TRUE;
+ }
+ YY_BREAK
+case 415:
+/* rule 415 can match eol */
+YY_RULE_SETUP
+#line 3965 "scanner.l"
+{ // volatile member function
+ lineCount() ;
+ current->args += " volatile ";
+ current->argList->volatileSpecifier=TRUE;
+ }
+ YY_BREAK
+case 416:
+/* rule 416 can match eol */
+YY_RULE_SETUP
+#line 3970 "scanner.l"
+{ // pure virtual member function
+ lineCount() ;
+ current->args += " = 0";
+ current->virt = Pure;
+ current->argList->pureSpecifier=TRUE;
+ }
+ YY_BREAK
+case 417:
+/* rule 417 can match eol */
+YY_RULE_SETUP
+#line 3976 "scanner.l"
+{
+ lineCount() ;
+ current->args += ", " ;
+ }
+ YY_BREAK
+case 418:
+/* rule 418 can match eol */
+YY_RULE_SETUP
+#line 3980 "scanner.l"
+{
+ lineCount() ;
+ current->args += ' ' ;
+ }
+ YY_BREAK
+case 419:
+YY_RULE_SETUP
+#line 3984 "scanner.l"
+{ if (insidePHP)
+ REJECT;
+ lastCPPContext = YY_START;
+ BEGIN(SkipCPP);
+ }
+ YY_BREAK
+case 420:
+YY_RULE_SETUP
+#line 3989 "scanner.l"
+{
+ if (insideCli &&
+ (current_root->section&Entry::COMPOUND_MASK)
+ )
+ {
+ BEGIN(CliOverride);
+ }
+ else
+ {
+ // typically an initialized function pointer
+ lastInitializerContext=YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+ }
+ YY_BREAK
+case 421:
+YY_RULE_SETUP
+#line 4004 "scanner.l"
+{
+ }
+ YY_BREAK
+case 422:
+YY_RULE_SETUP
+#line 4006 "scanner.l"
+{
+ unput(*scanYYtext);
+ BEGIN(FuncQual);
+ }
+ YY_BREAK
+case 423:
+/* rule 423 can match eol */
+YY_RULE_SETUP
+#line 4010 "scanner.l"
+{
+ yyLineNr++;
+ }
+ YY_BREAK
+case 424:
+YY_RULE_SETUP
+#line 4013 "scanner.l"
+{
+ }
+ YY_BREAK
+case 425:
+YY_RULE_SETUP
+#line 4015 "scanner.l"
+{
+ unput(*scanYYtext);
+ BEGIN(FuncQual);
+ }
+ YY_BREAK
+case 426:
+YY_RULE_SETUP
+#line 4019 "scanner.l"
+{
+ current->args += *scanYYtext;
+ pCopyQuotedString=&current->args;
+ lastStringContext=FuncPtrInit;
+ BEGIN(CopyString);
+ }
+ YY_BREAK
+case 427:
+YY_RULE_SETUP
+#line 4025 "scanner.l"
+{
+ current->args += *scanYYtext;
+ if (insidePHP)
+ {
+ pCopyQuotedString=&current->args;
+ lastStringContext=FuncPtrInit;
+ BEGIN(CopyPHPString);
+ }
+ }
+ YY_BREAK
+case 428:
+YY_RULE_SETUP
+#line 4034 "scanner.l"
+{
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ current->args += scanYYtext;
+ }
+ }
+ YY_BREAK
+case 429:
+YY_RULE_SETUP
+#line 4044 "scanner.l"
+{
+ current->args += scanYYtext;
+ }
+ YY_BREAK
+case 430:
+YY_RULE_SETUP
+#line 4047 "scanner.l"
+{
+ current->args += *scanYYtext;
+ }
+ YY_BREAK
+case 431:
+/* rule 431 can match eol */
+YY_RULE_SETUP
+#line 4050 "scanner.l"
+{
+ current->args += *scanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+case 432:
+YY_RULE_SETUP
+#line 4054 "scanner.l"
+{ // typically a K&R style C function
+ if (insideCS && strcmp(scanYYtext,"where")==0)
+ {
+ // type contraint for a method
+ delete current->typeConstr;
+ current->typeConstr = new ArgumentList;
+ current->typeConstr->append(new Argument);
+ lastCSConstraint = YY_START;
+ BEGIN( CSConstraintName );
+ }
+ else if (checkForKnRstyleC())
+ {
+ //fprintf(stderr,"===> got a K&R style function\n");
+ current->args = scanYYtext;
+ oldStyleArgType.resize(0);
+ BEGIN(OldStyleArgs);
+ }
+ else
+ {
+ current->args += scanYYtext;
+ }
+ }
+ YY_BREAK
+case 433:
+YY_RULE_SETUP
+#line 4076 "scanner.l"
+{
+ QCString oldStyleArgPtr;
+ QCString oldStyleArgName;
+ splitKnRArg(oldStyleArgPtr,oldStyleArgName);
+ QCString doc,brief;
+ if (current->doc!=docBackup)
+ {
+ doc=current->doc.copy();
+ current->doc=docBackup;
+ }
+ if (current->brief!=briefBackup)
+ {
+ brief=current->brief.copy();
+ current->brief=briefBackup;
+ }
+ addKnRArgInfo(oldStyleArgType+oldStyleArgPtr,
+ oldStyleArgName,brief,doc);
+ current->args.resize(0);
+ if (*scanYYtext==';') oldStyleArgType.resize(0);
+ }
+ YY_BREAK
+case 434:
+YY_RULE_SETUP
+#line 4096 "scanner.l"
+{ current->args += scanYYtext; }
+ YY_BREAK
+case 435:
+YY_RULE_SETUP
+#line 4097 "scanner.l"
+{
+ current->args = argListToString(current->argList);
+ unput('{');
+ BEGIN(FuncQual);
+ }
+ YY_BREAK
+case 436:
+YY_RULE_SETUP
+#line 4102 "scanner.l"
+{ current->args += *scanYYtext; }
+ YY_BREAK
+case 437:
+YY_RULE_SETUP
+#line 4103 "scanner.l"
+{ current->args += *scanYYtext; }
+ YY_BREAK
+case 438:
+/* rule 438 can match eol */
+#line 4105 "scanner.l"
+case 439:
+/* rule 439 can match eol */
+YY_RULE_SETUP
+#line 4105 "scanner.l"
+{ /* try-function-block */
+ insideTryBlock=TRUE;
+ lineCount();
+ if (scanYYtext[scanYYleng-1]==':')
+ {
+ unput(':');
+ BEGIN( Function );
+ }
+ }
+ YY_BREAK
+case 440:
+/* rule 440 can match eol */
+YY_RULE_SETUP
+#line 4114 "scanner.l"
+{ // C++ style throw clause
+ current->exception = " throw (" ;
+ roundCount=0;
+ lineCount() ;
+ BEGIN( ExcpRound ) ;
+ }
+ YY_BREAK
+case 441:
+/* rule 441 can match eol */
+YY_RULE_SETUP
+#line 4120 "scanner.l"
+{
+ current->exception = " raises (" ;
+ lineCount() ;
+ roundCount=0;
+ BEGIN( ExcpRound ) ;
+ }
+ YY_BREAK
+case 442:
+/* rule 442 can match eol */
+YY_RULE_SETUP
+#line 4126 "scanner.l"
+{ // Java style throw clause
+ current->exception = " throws " ;
+ lineCount() ;
+ BEGIN( ExcpList );
+ }
+ YY_BREAK
+case 443:
+YY_RULE_SETUP
+#line 4131 "scanner.l"
+{ current->exception += *scanYYtext ;
+ ++roundCount ;
+ }
+ YY_BREAK
+case 444:
+YY_RULE_SETUP
+#line 4134 "scanner.l"
+{ current->exception += *scanYYtext ;
+ if ( roundCount )
+ --roundCount ;
+ else
+ BEGIN( FuncQual ) ;
+ }
+ YY_BREAK
+case 445:
+YY_RULE_SETUP
+#line 4140 "scanner.l"
+{
+ current->exception += *scanYYtext;
+ }
+ YY_BREAK
+case 446:
+YY_RULE_SETUP
+#line 4143 "scanner.l"
+{
+ unput('{'); BEGIN( FuncQual );
+ }
+ YY_BREAK
+case 447:
+YY_RULE_SETUP
+#line 4146 "scanner.l"
+{
+ unput(';'); BEGIN( FuncQual );
+ }
+ YY_BREAK
+case 448:
+/* rule 448 can match eol */
+YY_RULE_SETUP
+#line 4149 "scanner.l"
+{
+ current->exception += ' ';
+ yyLineNr++;
+ }
+ YY_BREAK
+case 449:
+YY_RULE_SETUP
+#line 4153 "scanner.l"
+{
+ current->exception += *scanYYtext;
+ }
+ YY_BREAK
+case 450:
+YY_RULE_SETUP
+#line 4156 "scanner.l"
+{ current->type += current->name ;
+ current->name = current->args ;
+ current->args = scanYYtext ;
+ roundCount=0;
+ BEGIN( FuncRound ) ;
+ }
+ YY_BREAK
+case 451:
+YY_RULE_SETUP
+#line 4162 "scanner.l"
+{
+ if (!insidePHP) BEGIN(SkipInits);
+ }
+ YY_BREAK
+case 452:
+YY_RULE_SETUP
+#line 4165 "scanner.l"
+{
+ current->name=current->name.simplifyWhiteSpace();
+ current->type=current->type.simplifyWhiteSpace();
+ current->args=removeRedundantWhiteSpace(current->args);
+ // was: current->args.simplifyWhiteSpace();
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ static QRegExp re("([^)]*[*&][^)]*)"); // (...*...)
+ if (*scanYYtext!=';' || (current_root->section&Entry::COMPOUND_MASK) )
+ {
+ int tempArg=current->name.find('<');
+ QCString tempName;
+ if (tempArg==-1) tempName=current->name; else tempName=current->name.left(tempArg);
+ if (!current->type.isEmpty() &&
+ (current->type.find(re,0)!=-1 || current->type.left(8)=="typedef "))
+ {
+ //printf("Scanner.l: found in class variable: `%s' `%s' `%s'\n", current->type.data(),current->name.data(),current->args.data());
+ if (isTypedef && current->type.left(8)!="typedef ")
+ {
+ current->type.prepend("typedef ");
+ }
+ current->section = Entry::VARIABLE_SEC ;
+ }
+ else
+ {
+ //printf("Scanner.l: found in class function: `%s' `%s' `%s'\n", current->type.data(),current->name.data(),current->args.data());
+ current->section = Entry::FUNCTION_SEC ;
+ current->proto = *scanYYtext==';';
+ }
+ }
+ else // a global function prototype or function variable
+ {
+ //printf("Scanner.l: prototype? type=`%s' name=`%s' args=`%s'\n",current->type.data(),current->name.data(),current->args.data());
+ if (!current->type.isEmpty() &&
+ (current->type.find(re,0)!=-1 || current->type.left(8)=="typedef "))
+ {
+ if (isTypedef && current->type.left(8)!="typedef ")
+ {
+ current->type.prepend("typedef ");
+ }
+ //printf("Scanner.l: found function variable!\n");
+ current->section = Entry::VARIABLE_SEC;
+ }
+ else
+ {
+ //printf("Scanner.l: found prototype\n");
+ current->section = Entry::FUNCTION_SEC;
+ current->proto = TRUE;
+ }
+ }
+ //printf("Adding entry `%s'\n",current->name.data());
+ if ( insidePHP)
+ {
+ if (findAndRemoveWord(current->type,"final"))
+ {
+ current->spec |= Entry::Final;
+ }
+ if (findAndRemoveWord(current->type,"abstract"))
+ {
+ current->spec |= Entry::Abstract;
+ }
+ }
+ if ( insidePHP && !containsWord(current->type,"function"))
+ {
+ initEntry();
+ if ( *scanYYtext == '{' )
+ {
+ lastCurlyContext = FindMembers;
+ curlyCount=0;
+ BEGIN( SkipCurly );
+ }
+ else
+ {
+ BEGIN( FindMembers );
+ }
+ }
+ else
+ {
+ if ( insidePHP)
+ {
+ findAndRemoveWord(current->type,"function");
+ }
+ previous = current;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ // Objective C 2.0: Required/Optional section
+ if (previous->spec & (Entry::Optional | Entry::Required))
+ {
+ current->spec |= previous->spec & (Entry::Optional|Entry::Required);
+ }
+ lastCurlyContext = FindMembers;
+ if ( *scanYYtext == ',' )
+ {
+ current->type = previous->type.data();
+ }
+ if ( *scanYYtext == '{' )
+ {
+ if ( !insidePHP && (current_root->section & Entry::COMPOUND_MASK) )
+ {
+ previous->spec |= Entry::Inline;
+ }
+ //addToBody(scanYYtext);
+ curlyCount=0;
+ BEGIN( SkipCurly ) ;
+ }
+ else
+ {
+ if (previous->section!=Entry::VARIABLE_SEC)
+ previous->bodyLine=-1; // a function/member declaration
+ BEGIN( FindMembers ) ;
+ }
+ }
+ }
+ YY_BREAK
+case 453:
+YY_RULE_SETUP
+#line 4279 "scanner.l"
+{
+ //addToBody(scanYYtext);
+ //lastCurlyContext = FindMembers;
+ //curlyCount=0;
+ //BEGIN( SkipCurly ) ;
+ unput('{');
+ BEGIN( Function );
+ }
+ YY_BREAK
+case 454:
+YY_RULE_SETUP
+#line 4287 "scanner.l"
+{
+ //addToBody(scanYYtext);
+ ++curlyCount ;
+ }
+ YY_BREAK
+case 455:
+YY_RULE_SETUP
+#line 4291 "scanner.l"
+{
+ //addToBody(scanYYtext);
+ if( curlyCount )
+ {
+ --curlyCount ;
+ }
+ else
+ {
+#if 0
+ if (!Config_getBool("HIDE_IN_BODY_DOCS") &&
+ !current->doc.isEmpty())
+ {
+ // copy documentation found inside the body
+ // to the previous item
+ if (previous->inbodyLine==-1)
+ {
+ previous->inbodyLine = current->docLine;
+ previous->inbodyFile = current->docFile;
+ }
+ //printf("*** inbodyDocs+=%s\n",current->doc.data());
+ previous->inbodyDocs += current->doc;
+ current->doc.resize(0);
+ }
+#endif
+ if (current->sli && previous) // copy special list items
+ {
+ QListIterator<ListItemInfo> li(*current->sli);
+ ListItemInfo *lii;
+ for (li.toFirst();(lii=li.current());++li)
+ {
+ previous->addSpecialListItem(lii->type,lii->itemId);
+ }
+ delete current->sli;
+ current->sli = 0;
+ }
+ if (previous) previous->endBodyLine=yyLineNr;
+ BEGIN( lastCurlyContext ) ;
+ }
+ }
+ YY_BREAK
+case 456:
+/* rule 456 can match eol */
+YY_RULE_SETUP
+#line 4330 "scanner.l"
+{
+ lineCount();
+ if ( curlyCount )
+ {
+ //addToBody(scanYYtext);
+ --curlyCount ;
+ }
+ else
+ {
+ current->endBodyLine=yyLineNr;
+
+ tempEntry = current; // temporarily switch to the previous entry
+ current = previous;
+
+ docBlockContext = SkipCurlyEndDoc;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( scanYYtext[scanYYleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( scanYYtext[scanYYleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = '}';
+ if (scanYYtext[scanYYleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+ }
+ YY_BREAK
+case 457:
+/* rule 457 can match eol */
+YY_RULE_SETUP
+#line 4362 "scanner.l"
+{ // desc is followed by another one
+ docBlockContext = SkipCurlyEndDoc;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( scanYYtext[scanYYleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( scanYYtext[scanYYleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = '}';
+ if (scanYYtext[scanYYleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+ YY_BREAK
+case 458:
+YY_RULE_SETUP
+#line 4380 "scanner.l"
+{
+ //addToBody("}");
+ current = tempEntry;
+ BEGIN( lastCurlyContext );
+ }
+ YY_BREAK
+case 459:
+YY_RULE_SETUP
+#line 4385 "scanner.l"
+{
+ //addToBody(scanYYtext);
+ lastStringContext=SkipCurly;
+ BEGIN( SkipString );
+ }
+ YY_BREAK
+case 460:
+YY_RULE_SETUP
+#line 4390 "scanner.l"
+{
+ if (insidePHP)
+ REJECT;
+ //addToBody(scanYYtext);
+ BEGIN( SkipCurlyCpp );
+ }
+ YY_BREAK
+case 461:
+/* rule 461 can match eol */
+YY_RULE_SETUP
+#line 4396 "scanner.l"
+{
+ yyLineNr++;
+ //addToBody(scanYYtext);
+ }
+ YY_BREAK
+case 462:
+YY_RULE_SETUP
+#line 4400 "scanner.l"
+{
+ //addToBody(scanYYtext);
+ }
+ YY_BREAK
+case 463:
+/* rule 463 can match eol */
+YY_RULE_SETUP
+#line 4403 "scanner.l"
+{
+ //addToBody(scanYYtext);
+ yyLineNr++;
+ lastCurlyContext = FindMembers;
+ BEGIN( SkipCurly );
+ }
+ YY_BREAK
+case 464:
+/* rule 464 can match eol */
+YY_RULE_SETUP
+#line 4409 "scanner.l"
+{
+ //addToBody(scanYYtext);
+ yyLineNr++;
+ }
+ YY_BREAK
+case 465:
+YY_RULE_SETUP
+#line 4413 "scanner.l"
+{
+ //addToBody(scanYYtext);
+ lastCContext = YY_START;
+ BEGIN(SkipComment);
+ }
+ YY_BREAK
+case 466:
+YY_RULE_SETUP
+#line 4418 "scanner.l"
+{
+ //addToBody(scanYYtext);
+ lastCContext = YY_START;
+ BEGIN(SkipCxxComment);
+ }
+ YY_BREAK
+case 467:
+YY_RULE_SETUP
+#line 4423 "scanner.l"
+{
+ lastStringContext=YY_START;
+ BEGIN( SkipString );
+ }
+ YY_BREAK
+case 468:
+YY_RULE_SETUP
+#line 4427 "scanner.l"
+{
+ warn(yyFileName,yyLineNr,
+ "warning: Found ';' while parsing initializer list! "
+ "(doxygen could be confused by a macro call without semicolon)"
+ );
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 469:
+YY_RULE_SETUP
+#line 4434 "scanner.l"
+{
+ if (!insidePHP)
+ REJECT;
+ //addToBody(scanYYtext);
+ lastCContext = YY_START;
+ BEGIN(SkipCxxComment);
+ }
+ YY_BREAK
+case 470:
+YY_RULE_SETUP
+#line 4441 "scanner.l"
+{
+ if (!insideCS) REJECT;
+ // C# verbatim string
+ lastSkipVerbStringContext=YY_START;
+ pSkipVerbString=&current->initializer;
+ BEGIN(SkipVerbString);
+ }
+ YY_BREAK
+case 471:
+YY_RULE_SETUP
+#line 4448 "scanner.l"
+{
+ if (insidePHP) REJECT;
+ }
+ YY_BREAK
+case 472:
+YY_RULE_SETUP
+#line 4451 "scanner.l"
+{
+ if (insidePHP)
+ {
+ lastStringContext=YY_START;
+ BEGIN(SkipPHPString);
+ }
+ }
+ YY_BREAK
+case 473:
+YY_RULE_SETUP
+#line 4458 "scanner.l"
+{ }
+ YY_BREAK
+case 474:
+YY_RULE_SETUP
+#line 4459 "scanner.l"
+{ }
+ YY_BREAK
+case 475:
+YY_RULE_SETUP
+#line 4460 "scanner.l"
+{
+ BEGIN( lastStringContext );
+ }
+ YY_BREAK
+case 476:
+YY_RULE_SETUP
+#line 4463 "scanner.l"
+{
+ BEGIN( lastStringContext );
+ }
+ YY_BREAK
+case 477:
+YY_RULE_SETUP
+#line 4466 "scanner.l"
+{ }
+ YY_BREAK
+case 478:
+/* rule 478 can match eol */
+YY_RULE_SETUP
+#line 4467 "scanner.l"
+{
+ yyLineNr++;
+ }
+ YY_BREAK
+case 479:
+YY_RULE_SETUP
+#line 4470 "scanner.l"
+{ }
+ YY_BREAK
+case 480:
+YY_RULE_SETUP
+#line 4471 "scanner.l"
+{ // for "class : public base {} var;" construct, see bug 608359
+ unput(':');
+ BEGIN(ClassVar);
+ }
+ YY_BREAK
+case 481:
+YY_RULE_SETUP
+#line 4475 "scanner.l"
+{
+ current->section = Entry::EMPTY_SEC ;
+ current->type.resize(0) ;
+ current->name.resize(0) ;
+ current->args.resize(0) ;
+ current->argList->clear();
+ BEGIN( FindMembers ) ;
+ }
+ YY_BREAK
+case 482:
+/* rule 482 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 4483 "scanner.l"
+{
+ sharpCount = 0;
+ current->name = scanYYtext ;
+ if (current->spec & Entry::Protocol)
+ {
+ current->name+="-p";
+ }
+ lineCount();
+ lastClassTemplSpecContext = ClassVar;
+ if (insideObjC) // protocol list
+ {
+ BEGIN( ObjCProtocolList );
+ }
+ else if (insideCS) // C# generic class
+ {
+ current->name+="-g";
+ BEGIN( CSGeneric );
+ }
+ else // C++ template specialization
+ {
+ roundCount=0;
+ BEGIN( ClassTemplSpec );
+ }
+ }
+ YY_BREAK
+case 483:
+YY_RULE_SETUP
+#line 4507 "scanner.l"
+{
+ if (current->tArgLists==0)
+ {
+ current->tArgLists = new QList<ArgumentList>;
+ current->tArgLists->setAutoDelete(TRUE);
+ }
+ ArgumentList *al = new ArgumentList;
+ // check bug 612858 before enabling the next line
+ //current->spec |= Entry::Template;
+ current->tArgLists->append(al);
+ currentArgumentList = al;
+ templateStr="<";
+ //current->name += "<";
+ fullArgString = templateStr;
+ //copyArgString = &current->name;
+ copyArgString = &templateStr;
+ currentArgumentContext = ClassVar;
+ BEGIN( ReadTempArgs );
+ }
+ YY_BREAK
+case 484:
+YY_RULE_SETUP
+#line 4526 "scanner.l"
+{
+ insideProtocolList=TRUE;
+ BEGIN( Bases );
+ }
+ YY_BREAK
+case 485:
+/* rule 485 can match eol */
+YY_RULE_SETUP
+#line 4530 "scanner.l"
+{
+ current->name += scanYYtext;
+ lineCount();
+ if (--sharpCount<=0)
+ {
+ current->name = removeRedundantWhiteSpace(current->name);
+ if (current->spec & Entry::Protocol)
+ { // Objective-C protocol
+ unput('{'); // fake start of body
+ BEGIN( ClassVar );
+ }
+ else
+ {
+ BEGIN( lastClassTemplSpecContext );
+ }
+ }
+ }
+ YY_BREAK
+case 486:
+YY_RULE_SETUP
+#line 4547 "scanner.l"
+{
+ current->name += scanYYtext;
+ sharpCount++;
+ }
+ YY_BREAK
+case 487:
+YY_RULE_SETUP
+#line 4551 "scanner.l"
+{
+ current->name += scanYYtext;
+ }
+ YY_BREAK
+case 488:
+/* rule 488 can match eol */
+YY_RULE_SETUP
+#line 4554 "scanner.l"
+{ // forward declaration
+ unput(';');
+ current->reset();
+ if (isTypedef) // typedef of a class, put typedef keyword back
+ {
+ current->type.prepend("typedef");
+ }
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 489:
+/* rule 489 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 4563 "scanner.l"
+{
+ current->name = scanYYtext ;
+ lineCount();
+ if (current->spec & Entry::Protocol)
+ {
+ current->name += "-p";
+ }
+ BEGIN( ClassVar );
+ }
+ YY_BREAK
+case 490:
+/* rule 490 can match eol */
+YY_RULE_SETUP
+#line 4572 "scanner.l"
+{ // multiple forward declarations on one line
+ // e.g. @protocol A,B;
+ current->reset();
+ }
+ YY_BREAK
+case 491:
+/* rule 491 can match eol */
+YY_RULE_SETUP
+#line 4576 "scanner.l"
+{
+ current->name = scanYYtext ;
+ lineCount();
+ if (current->spec & Entry::Protocol)
+ {
+ current->name += "-p";
+ }
+ if ((current->spec & Entry::Protocol) ||
+ current->section == Entry::OBJCIMPL_SEC)
+ {
+ unput('{'); // fake start of body
+ }
+ BEGIN( ClassVar );
+ }
+ YY_BREAK
+case 492:
+/* rule 492 can match eol */
+YY_RULE_SETUP
+#line 4590 "scanner.l"
+{ // C# style scope
+ current->name = substitute(scanYYtext,".","::");
+ lineCount();
+ BEGIN( ClassVar );
+ }
+ YY_BREAK
+case 493:
+/* rule 493 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 4595 "scanner.l"
+{
+ if (insideIDL && strncmp(scanYYtext,"switch",6)==0 && !isId(scanYYtext[6]))
+ {
+ // Corba IDL style union
+ roundCount=0;
+ BEGIN(SkipUnionSwitch);
+ }
+ else
+ {
+ addType(current);
+ current->name = scanYYtext;
+ current->name = current->name.stripWhiteSpace();
+ lineCount();
+ BEGIN( FindMembers );
+ }
+ }
+ YY_BREAK
+case 494:
+YY_RULE_SETUP
+#line 4611 "scanner.l"
+{
+ if (isTypedef)
+ {
+ // multiple types in one typedef
+ unput(',');
+ current->type.prepend("typedef ");
+ BEGIN(FindMembers);
+ }
+ else
+ {
+ // Multiple class forward declaration
+ }
+ }
+ YY_BREAK
+case 495:
+/* rule 495 can match eol */
+YY_RULE_SETUP
+#line 4624 "scanner.l"
+{
+ if (insideCli)
+ {
+ if (scanYYtext[0]=='s') // sealed
+ current->spec |= Entry::SealedClass;
+ else // abstract
+ current->spec |= Entry::AbstractClass;
+ BEGIN( ClassVar );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 496:
+YY_RULE_SETUP
+#line 4638 "scanner.l"
+{
+ if (insideIDL && strcmp(scanYYtext,"switch")==0)
+ {
+ // Corba IDL style union
+ roundCount=0;
+ BEGIN(SkipUnionSwitch);
+ }
+ else if ((insideJava || insidePHP || insideJS) && (strcmp(scanYYtext,"implements")==0 || strcmp(scanYYtext,"extends")==0))
+ {
+ current->type.resize(0);
+ baseProt=Public;
+ baseVirt=Normal;
+ baseName.resize(0);
+ BEGIN( BasesProt ) ;
+ }
+ else if (insideCS && strcmp(scanYYtext,"where")==0) // C# type contraint
+ {
+ delete current->typeConstr;
+ current->typeConstr = new ArgumentList;
+ current->typeConstr->append(new Argument);
+ lastCSConstraint = YY_START;
+ BEGIN( CSConstraintName );
+ }
+ else if (insideCli && strcmp(scanYYtext,"abstract"))
+ {
+ current->spec|=Entry::Abstract;
+ }
+ else if (insideCli && strcmp(scanYYtext,"sealed"))
+ {
+ current->spec|=Entry::Sealed;
+ }
+ else
+ {
+ if (current->section == Entry::ENUM_SEC)
+ { // found "enum a b" -> variable
+ current->section = Entry::VARIABLE_SEC ;
+ }
+ current->type += ' ' ;
+ current->type += current->name ;
+ current->name = scanYYtext ;
+
+ if (nameIsOperator(current->name))
+ {
+ BEGIN( Operator );
+ }
+ }
+ }
+ YY_BREAK
+case 497:
+YY_RULE_SETUP
+#line 4685 "scanner.l"
+{
+ if (insideObjC && *scanYYtext=='(') // class category
+ {
+ current->name+='(';
+ if (current->section!=Entry::OBJCIMPL_SEC)
+ {
+ current->spec|=Entry::Category;
+ }
+ BEGIN( ClassCategory );
+ }
+ else
+ {
+ // probably a function anyway
+ unput(*scanYYtext);
+ BEGIN( FindMembers );
+ }
+ }
+ YY_BREAK
+case 498:
+YY_RULE_SETUP
+#line 4702 "scanner.l"
+{ /* empty comment */ }
+ YY_BREAK
+case 499:
+YY_RULE_SETUP
+#line 4703 "scanner.l"
+{ // special comment
+ fullArgString.resize(0);
+ lastCopyArgChar='#'; // end marker
+ lastCommentInArgContext=YY_START;
+ if (scanYYtext[1]=='/')
+ BEGIN( CopyArgCommentLine );
+ else
+ BEGIN( CopyArgComment );
+ }
+ YY_BREAK
+case 500:
+YY_RULE_SETUP
+#line 4712 "scanner.l"
+{ // artificially inserted token to signal end of comment block
+ current->typeConstr->last()->docs = fullArgString;
+ }
+ YY_BREAK
+case 501:
+YY_RULE_SETUP
+#line 4715 "scanner.l"
+{ // end of type constraint reached
+ // parse documentation of the constraints
+ handleParametersCommentBlocks(current->typeConstr);
+ unput('{');
+ BEGIN( lastCSConstraint );
+ }
+ YY_BREAK
+case 502:
+YY_RULE_SETUP
+#line 4721 "scanner.l"
+{
+ handleParametersCommentBlocks(current->typeConstr);
+ unput(';');
+ BEGIN( lastCSConstraint );
+ }
+ YY_BREAK
+case 503:
+YY_RULE_SETUP
+#line 4726 "scanner.l"
+{
+ BEGIN( CSConstraintType );
+ }
+ YY_BREAK
+case 504:
+YY_RULE_SETUP
+#line 4729 "scanner.l"
+{
+ // parameter name
+ current->typeConstr->last()->name=scanYYtext;
+ }
+ YY_BREAK
+case 505:
+YY_RULE_SETUP
+#line 4733 "scanner.l"
+{ // another constraint for a different param
+ current->typeConstr->append(new Argument);
+ BEGIN( CSConstraintName );
+ }
+ YY_BREAK
+case 506:
+YY_RULE_SETUP
+#line 4737 "scanner.l"
+{
+ if (current->typeConstr->last()->type.isEmpty())
+ // first type constraint for this parameter
+ {
+ current->typeConstr->last()->type=scanYYtext;
+ }
+ else // new type constraint for same parameter
+ {
+ QCString name = current->typeConstr->last()->name;
+ current->typeConstr->append(new Argument);
+ current->typeConstr->last()->name=name;
+ current->typeConstr->last()->type=scanYYtext;
+ }
+ }
+ YY_BREAK
+case 507:
+/* rule 507 can match eol */
+YY_RULE_SETUP
+#line 4751 "scanner.l"
+{
+ yyLineNr++;
+ }
+ YY_BREAK
+case 508:
+YY_RULE_SETUP
+#line 4754 "scanner.l"
+{
+ }
+ YY_BREAK
+case 509:
+YY_RULE_SETUP
+#line 4756 "scanner.l"
+{
+ current->name+=scanYYtext;
+ }
+ YY_BREAK
+case 510:
+YY_RULE_SETUP
+#line 4759 "scanner.l"
+{
+ current->name+=')';
+ if ((current->section & Entry::Protocol) ||
+ current->section == Entry::OBJCIMPL_SEC)
+ {
+ unput('{'); // fake start of body
+ }
+ else // category has no variables so push back an empty body
+ {
+ unput('}');
+ unput('{');
+ }
+ BEGIN( ClassVar );
+ }
+ YY_BREAK
+case 511:
+YY_RULE_SETUP
+#line 4773 "scanner.l"
+{
+ if (current->section == Entry::VARIABLE_SEC) // enum a b:2, see bug 313527
+ {
+ BEGIN(BitFields);
+ current->bitfields+=":";
+ }
+ else
+ {
+ current->type.resize(0);
+ if ((current->spec & Entry::Interface) ||
+ (current->spec & Entry::Struct) ||
+ (current->spec & Entry::Ref) ||
+ (current->spec & Entry::Value) ||
+ insidePHP || insideCS || insideD || insideObjC
+ )
+ baseProt=Public;
+ else
+ baseProt=Private;
+ baseVirt=Normal;
+ baseName.resize(0);
+ BEGIN( BasesProt ) ;
+ }
+ }
+ YY_BREAK
+case 512:
+YY_RULE_SETUP
+#line 4796 "scanner.l"
+{
+ unput(*scanYYtext);
+ if (isTypedef) // typedef of a class, put typedef keyword back
+ {
+ current->type.prepend("typedef");
+ }
+ if ((scanYYtext[0]=='*' || scanYYtext[0]=='&') &&
+ current->section == Entry::ENUM_SEC)
+ { // found "enum a *b" -> variable
+ current->section = Entry::VARIABLE_SEC ;
+ }
+ BEGIN( FindMembers );
+ }
+ YY_BREAK
+case 513:
+/* rule 513 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 3;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 4809 "scanner.l"
+{
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ lineCount();
+ current->program+=scanYYtext;
+ current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ curlyCount=0;
+ BEGIN( ReadBodyIntf );
+ }
+ }
+ YY_BREAK
+case 514:
+/* rule 514 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+#line 4825 "scanner.l"
+case 515:
+/* rule 515 can match eol */
+#line 4826 "scanner.l"
+case 516:
+/* rule 516 can match eol */
+#line 4827 "scanner.l"
+case 517:
+/* rule 517 can match eol */
+YY_RULE_SETUP
+#line 4827 "scanner.l"
+{
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ lineCount();
+ current->program+=scanYYtext;
+ current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ curlyCount=0;
+ BEGIN( ReadBodyIntf );
+ }
+ }
+ YY_BREAK
+case 518:
+YY_RULE_SETUP
+#line 4842 "scanner.l"
+{
+ current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ current->name = removeRedundantWhiteSpace(current->name);
+ if (current->name.isEmpty() && !isTypedef) // anonymous compound
+ {
+ if (current->section==Entry::NAMESPACE_SEC) // allow reopening of anonymous namespaces
+ {
+ if (Config_getBool("EXTRACT_ANON_NSPACES")) // use visible name
+ {
+ current->name="anonymous_namespace{"+stripPath(current->fileName)+"}";
+ }
+ else // use invisible name
+ {
+ current->name.sprintf("@%d",anonNSCount);
+ }
+ }
+ else
+ {
+ current->name.sprintf("@%d",anonCount++);
+ }
+ }
+ curlyCount=0;
+ if (current_root && // not a nested struct inside an @interface section
+ !(current_root->spec & Entry::Interface) &&
+ ((current->spec & (Entry::Interface | Entry::Protocol | Entry::Category) ||
+ current->section==Entry::OBJCIMPL_SEC)
+ ) &&
+ insideObjC
+ )
+ { // ObjC body that ends with @end
+ BEGIN( ReadBodyIntf );
+ }
+ else if (current->section==Entry::NAMESPACE_SEC)
+ { // namespace body
+ BEGIN( ReadNSBody );
+ }
+ else
+ { // class body
+ BEGIN( ReadBody ) ;
+ }
+ }
+ YY_BREAK
+case 519:
+/* rule 519 can match eol */
+YY_RULE_SETUP
+#line 4884 "scanner.l"
+{ lineCount(); baseVirt = Virtual; }
+ YY_BREAK
+case 520:
+/* rule 520 can match eol */
+YY_RULE_SETUP
+#line 4885 "scanner.l"
+{ lineCount(); baseProt = Public; }
+ YY_BREAK
+case 521:
+/* rule 521 can match eol */
+YY_RULE_SETUP
+#line 4886 "scanner.l"
+{ lineCount(); baseProt = Protected; }
+ YY_BREAK
+case 522:
+/* rule 522 can match eol */
+YY_RULE_SETUP
+#line 4887 "scanner.l"
+{ lineCount(); baseProt = Private; }
+ YY_BREAK
+case 523:
+/* rule 523 can match eol */
+YY_RULE_SETUP
+#line 4888 "scanner.l"
+{ lineCount(); }
+ YY_BREAK
+case 524:
+YY_RULE_SETUP
+#line 4889 "scanner.l"
+{ unput(*scanYYtext); BEGIN(Bases); }
+ YY_BREAK
+case 525:
+YY_RULE_SETUP
+#line 4890 "scanner.l"
+{ // PHP namespace token, not sure if interspacing is allowed but it gives problems (see bug 640847)
+ if (!insidePHP)
+ {
+ REJECT;
+ }
+ else // PHP base class of the form \Ns\Cl or Ns\Cl
+ {
+ lineCount();
+ QCString bn=scanYYtext;
+ bn = substitute(bn,"\\","::");
+ baseName += bn;
+ current->args += ' ';
+ current->args += scanYYtext;
+ }
+ }
+ YY_BREAK
+case 526:
+/* rule 526 can match eol */
+YY_RULE_SETUP
+#line 4905 "scanner.l"
+{
+ lineCount();
+ QCString baseScope = scanYYtext;
+ if (insideCS && baseScope.stripWhiteSpace()=="where")
+ {
+ // type contraint for a class
+ delete current->typeConstr;
+ current->typeConstr = new ArgumentList;
+ current->typeConstr->append(new Argument);
+ lastCSConstraint = YY_START;
+ BEGIN( CSConstraintName );
+ }
+ else
+ {
+ baseName+=scanYYtext;
+ current->args += ' ';
+ current->args += scanYYtext;
+ }
+ }
+ YY_BREAK
+case 527:
+/* rule 527 can match eol */
+YY_RULE_SETUP
+#line 4924 "scanner.l"
+{ // Java style class
+ QCString name = substitute(scanYYtext,".","::");
+ baseName += name;
+ current->args += ' ';
+ current->args += name;
+ }
+ YY_BREAK
+case 528:
+/* rule 528 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 4930 "scanner.l"
+{
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ yyLineNr++;
+ unput('{');
+ }
+ }
+ YY_BREAK
+case 529:
+YY_RULE_SETUP
+#line 4941 "scanner.l"
+{ // empty ObjC interface
+ unput('d'); // insert fake body: {}@end
+ unput('n');
+ unput('e');
+ unput('@');
+ unput('}');
+ unput('{');
+ }
+ YY_BREAK
+case 530:
+YY_RULE_SETUP
+#line 4949 "scanner.l"
+{ current->name += *scanYYtext;
+ sharpCount=1;
+ roundCount=0;
+ lastSkipSharpContext = YY_START;
+ specName = &current->name;
+ BEGIN ( Specialization );
+ }
+ YY_BREAK
+case 531:
+YY_RULE_SETUP
+#line 4956 "scanner.l"
+{
+ sharpCount=1;
+ roundCount=0;
+ lastSkipSharpContext = YY_START;
+ if (insideObjC) // start of protocol list
+ {
+ unput(',');
+ }
+ else // template specialization
+ {
+ //if (insideCS) // generic
+ //{
+ // baseName+="-g";
+ //}
+ templateStr = scanYYtext;
+ specName = &templateStr;
+ BEGIN ( Specialization );
+ }
+ }
+ YY_BREAK
+case 532:
+YY_RULE_SETUP
+#line 4975 "scanner.l"
+{ *specName += *scanYYtext;
+ if (roundCount==0) sharpCount++;
+ }
+ YY_BREAK
+case 533:
+YY_RULE_SETUP
+#line 4978 "scanner.l"
+{
+ *specName += *scanYYtext;
+ if (roundCount==0 && --sharpCount<=0)
+ {
+ if (1 /*!insideCS*/)
+ {
+ baseName+=*specName;
+ }
+ else
+ {
+ if (current->tArgLists==0)
+ {
+ current->tArgLists = new QList<ArgumentList>;
+ current->tArgLists->setAutoDelete(TRUE);
+ }
+ ArgumentList *al = new ArgumentList;
+ current->tArgLists->append(al);
+ stringToArgumentList(*specName,al);
+ }
+ BEGIN(lastSkipSharpContext);
+ }
+ }
+ YY_BREAK
+case 534:
+/* rule 534 can match eol */
+YY_RULE_SETUP
+#line 5000 "scanner.l"
+{ lineCount(); *specName +=' '; }
+ YY_BREAK
+case 535:
+YY_RULE_SETUP
+#line 5001 "scanner.l"
+{ *specName += scanYYtext; }
+ YY_BREAK
+case 536:
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 5002 "scanner.l"
+{ // M$ C++ extension to allow >> to close a template...
+ unput('>');
+ unput(' ');
+ unput('>');
+ }
+ YY_BREAK
+case 537:
+YY_RULE_SETUP
+#line 5007 "scanner.l"
+{
+ if (insideCS) // for C# >> ends a nested template
+ {
+ REJECT;
+ }
+ else // for C++ >> is a bitshift
+ // operator and > > would end
+ // a nested template.
+ // We require the bitshift to be enclosed in braces.
+ // See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
+ {
+ if (roundCount>0)
+ {
+ *specName += scanYYtext;
+ }
+ else
+ {
+ unput('>');
+ unput(' ');
+ unput('>');
+ }
+ }
+ }
+ YY_BREAK
+case 538:
+/* rule 538 can match eol */
+YY_RULE_SETUP
+#line 5030 "scanner.l"
+{ lineCount(); }
+ YY_BREAK
+case 539:
+YY_RULE_SETUP
+#line 5031 "scanner.l"
+{ *specName += *scanYYtext; roundCount++; }
+ YY_BREAK
+case 540:
+YY_RULE_SETUP
+#line 5032 "scanner.l"
+{ *specName += *scanYYtext; roundCount--; }
+ YY_BREAK
+case 541:
+YY_RULE_SETUP
+#line 5033 "scanner.l"
+{
+ *specName += *scanYYtext;
+ }
+ YY_BREAK
+case 542:
+YY_RULE_SETUP
+#line 5036 "scanner.l"
+{ ++sharpCount; }
+ YY_BREAK
+case 543:
+YY_RULE_SETUP
+#line 5037 "scanner.l"
+{ if (--sharpCount<=0)
+ BEGIN ( lastSkipSharpContext );
+ }
+ YY_BREAK
+case 544:
+YY_RULE_SETUP
+#line 5040 "scanner.l"
+{ ++roundCount; }
+ YY_BREAK
+case 545:
+YY_RULE_SETUP
+#line 5041 "scanner.l"
+{ if (--roundCount<=0)
+ BEGIN ( lastSkipRoundContext );
+ }
+ YY_BREAK
+case 546:
+YY_RULE_SETUP
+#line 5044 "scanner.l"
+{
+ lastStringContext=SkipRound;
+ BEGIN(SkipString);
+ }
+ YY_BREAK
+case 547:
+/* rule 547 can match eol */
+YY_RULE_SETUP
+#line 5048 "scanner.l"
+{ lineCount();
+ if (insideProtocolList)
+ {
+ baseName+="-p";
+ }
+ else
+ {
+ current->args += ',' ;
+ }
+ current->name = removeRedundantWhiteSpace(current->name);
+ if (!baseName.isEmpty())
+ {
+ current->extends->append(
+ new BaseInfo(baseName,baseProt,baseVirt)
+ );
+ }
+ if ((current->spec & Entry::Interface) ||
+ insideJava || insidePHP || insideCS ||
+ insideD || insideObjC)
+ {
+ baseProt=Public;
+ }
+ else
+ {
+ baseProt=Private;
+ }
+ baseVirt=Normal;
+ baseName.resize(0);
+ if (*scanYYtext=='>')
+ { // end of a ObjC protocol list
+ insideProtocolList=FALSE;
+ if (scanYYleng==1)
+ {
+ unput('{'); // dummy start body
+ }
+ else
+ {
+ yyless(1);
+ }
+ }
+ else
+ {
+ if (*scanYYtext==',' && insideObjC) // Begin of protocol list
+ {
+ insideProtocolList=TRUE;
+ }
+ BEGIN(BasesProt);
+ }
+ }
+ YY_BREAK
+case 548:
+YY_RULE_SETUP
+#line 5097 "scanner.l"
+{ current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ current->name = removeRedundantWhiteSpace(current->name);
+ if (!baseName.isEmpty())
+ current->extends->append(
+ new BaseInfo(baseName,baseProt,baseVirt)
+ );
+ curlyCount=0;
+ if (insideObjC)
+ {
+ BEGIN( ReadBodyIntf );
+ }
+ else
+ {
+ BEGIN( ReadBody ) ;
+ }
+ }
+ YY_BREAK
+case 549:
+YY_RULE_SETUP
+#line 5114 "scanner.l"
+{
+ roundCount++;
+ }
+ YY_BREAK
+case 550:
+YY_RULE_SETUP
+#line 5117 "scanner.l"
+{
+ if (--roundCount==0)
+ {
+ BEGIN(ClassVar);
+ }
+ }
+ YY_BREAK
+case 551:
+/* rule 551 can match eol */
+YY_RULE_SETUP
+#line 5123 "scanner.l"
+{ yyLineNr++; }
+ YY_BREAK
+case 552:
+YY_RULE_SETUP
+#line 5124 "scanner.l"
+
+ YY_BREAK
+case 553:
+/* rule 553 can match eol */
+YY_RULE_SETUP
+#line 5125 "scanner.l"
+{ current->program += scanYYtext ;
+ lineCount() ;
+ }
+ YY_BREAK
+case 554:
+YY_RULE_SETUP
+#line 5128 "scanner.l"
+{ current->program += scanYYtext ; }
+ YY_BREAK
+case 555:
+YY_RULE_SETUP
+#line 5129 "scanner.l"
+{ current->program += scanYYtext ; }
+ YY_BREAK
+case 556:
+YY_RULE_SETUP
+#line 5130 "scanner.l"
+{
+ insideCode=TRUE;
+ current->program += scanYYtext ;
+ }
+ YY_BREAK
+case 557:
+YY_RULE_SETUP
+#line 5134 "scanner.l"
+{
+ insideCode=FALSE;
+ current->program += scanYYtext ;
+ }
+ YY_BREAK
+case 558:
+YY_RULE_SETUP
+#line 5138 "scanner.l"
+{ current->program += scanYYtext ; }
+ YY_BREAK
+case 559:
+YY_RULE_SETUP
+#line 5139 "scanner.l"
+{ current->program += scanYYtext ;
+ if (!insideCode) BEGIN( lastContext ) ;
+ }
+ YY_BREAK
+case 560:
+YY_RULE_SETUP
+#line 5142 "scanner.l"
+{ current->program += *scanYYtext ; }
+ YY_BREAK
+case 561:
+YY_RULE_SETUP
+#line 5144 "scanner.l"
+{
+ //printf("Start doc block at %d\n",yyLineNr);
+ removeSlashes=(scanYYtext[1]=='/');
+ tmpDocType=-1;
+ if (!current->doc.isEmpty())
+ {
+ current->doc+="\n\n";
+ }
+ else
+ {
+ current->docLine = yyLineNr;
+ current->docFile = yyFileName;
+ }
+
+ lastDocContext = YY_START;
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ current->inside = current_root->name+"::";
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = YY_START==SkipCurly;
+ docBlockAutoBrief = Config_getBool("QT_AUTOBRIEF");
+ docBlock.resize(0);
+ if (docBlockAutoBrief)
+ {
+ current->briefLine = yyLineNr;
+ current->briefFile = yyFileName;
+ }
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ YY_BREAK
+case 562:
+/* rule 562 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 5175 "scanner.l"
+{
+ removeSlashes=(scanYYtext[1]=='/');
+ lastDocContext = YY_START;
+
+ //printf("Found comment block at %s:%d\n",yyFileName,yyLineNr);
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ current->inside = current_root->name+"::";
+ }
+ current->docLine = yyLineNr;
+ current->docFile = yyFileName;
+ docBlockContext = YY_START;
+ docBlockInBody = YY_START==SkipCurly;
+ docBlockAutoBrief = Config_getBool("JAVADOC_AUTOBRIEF");
+ docBlock.resize(0);
+ if (docBlockAutoBrief)
+ {
+ current->briefLine = yyLineNr;
+ current->briefFile = yyFileName;
+ }
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ YY_BREAK
+case 563:
+YY_RULE_SETUP
+#line 5198 "scanner.l"
+{
+ tmpDocType=-1;
+ lastDocContext = YY_START;
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ current->inside = current_root->name+"::";
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = YY_START==SkipCurly;
+ docBlockAutoBrief = FALSE;
+ docBlock.resize(0);
+ startCommentBlock(current->brief.isEmpty());
+ BEGIN( DocLine );
+ }
+ YY_BREAK
+case 564:
+/* rule 564 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp = yy_bp + 3;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 5212 "scanner.l"
+{
+ tmpDocType=-1;
+ lastDocContext = YY_START;
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ current->inside = current_root->name+"::";
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = YY_START==SkipCurly;
+ docBlockAutoBrief = FALSE;
+ docBlock.resize(0);
+ startCommentBlock(current->brief.isEmpty());
+ BEGIN( DocLine );
+ }
+ YY_BREAK
+case 565:
+/* rule 565 can match eol */
+YY_RULE_SETUP
+#line 5226 "scanner.l"
+{
+ lineCount();
+ externC=TRUE;
+ }
+ YY_BREAK
+case 566:
+YY_RULE_SETUP
+#line 5230 "scanner.l"
+{
+ if (externC)
+ {
+ externC=FALSE;
+ }
+ else if (insideCS &&
+ !current->name.isEmpty() &&
+ !current->type.isEmpty())
+ {
+ if (containsWord(current->type,"event")) // event
+ {
+ current->mtype = mtype = Event;
+ }
+ else // property
+ {
+ current->mtype = mtype = Property;
+ }
+ current->bodyLine = yyLineNr;
+ curlyCount=0;
+ BEGIN( CSAccessorDecl );
+ }
+ else
+ {
+ if ((insideJava || insideCS || insideD) &&
+ current->name.isEmpty()
+ )
+ {
+ // static Java initializer
+ needsSemi = FALSE;
+ if (current->stat)
+ {
+ current->name="[static initializer]";
+ current->type.resize(0);
+ }
+ else
+ {
+ current->name="[instance initializer]";
+ }
+ unput(*scanYYtext);
+ BEGIN( Function );
+ }
+ else
+ {
+ needsSemi = TRUE;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ curlyCount=0;
+ BEGIN( SkipCurlyBlock );
+ }
+ }
+ }
+ YY_BREAK
+case 567:
+YY_RULE_SETUP
+#line 5283 "scanner.l"
+{ curlyCount++; }
+ YY_BREAK
+case 568:
+YY_RULE_SETUP
+#line 5284 "scanner.l"
+{
+ if (curlyCount)
+ {
+ curlyCount--;
+ }
+ else
+ {
+ mtype = Method;
+ unput(';');
+ BEGIN(FindMembers);
+ }
+ }
+ YY_BREAK
+case 569:
+YY_RULE_SETUP
+#line 5296 "scanner.l"
+{ if (curlyCount==0) current->spec |= Entry::Settable; }
+ YY_BREAK
+case 570:
+YY_RULE_SETUP
+#line 5297 "scanner.l"
+{ if (curlyCount==0) current->spec |= Entry::Gettable; }
+ YY_BREAK
+case 571:
+YY_RULE_SETUP
+#line 5298 "scanner.l"
+{ if (curlyCount==0) current->spec |= Entry::Addable; }
+ YY_BREAK
+case 572:
+YY_RULE_SETUP
+#line 5299 "scanner.l"
+{ if (curlyCount==0) current->spec |= Entry::Removable; }
+ YY_BREAK
+case 573:
+YY_RULE_SETUP
+#line 5300 "scanner.l"
+{ if (curlyCount==0) current->spec |= Entry::Raisable; }
+ YY_BREAK
+case 574:
+YY_RULE_SETUP
+#line 5301 "scanner.l"
+{}
+ YY_BREAK
+case 575:
+/* rule 575 can match eol */
+YY_RULE_SETUP
+#line 5302 "scanner.l"
+{ yyLineNr++; }
+ YY_BREAK
+/**********************************************************************************/
+/******************** Documentation block related rules ***************************/
+/**********************************************************************************/
+/* ---- Single line comments ------ */
+case 576:
+/* rule 576 can match eol */
+YY_RULE_SETUP
+#line 5312 "scanner.l"
+{ // continuation of multiline C++-style comment
+ docBlock+=scanYYtext;
+ docBlock.resize(docBlock.length() - 3);
+ yyLineNr++;
+ }
+ YY_BREAK
+case 577:
+/* rule 577 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 5317 "scanner.l"
+{ // whole line
+ docBlock+=scanYYtext;
+ handleCommentBlock(docBlock.data(),current->brief.isEmpty());
+ BEGIN( docBlockContext );
+ }
+ YY_BREAK
+/* ---- Comments blocks ------ */
+case 578:
+YY_RULE_SETUP
+#line 5325 "scanner.l"
+{ // end of comment block
+ handleCommentBlock(docBlock.data(),FALSE);
+ BEGIN(docBlockContext);
+ }
+ YY_BREAK
+case 579:
+/* rule 579 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 5329 "scanner.l"
+{ // start of a comment line
+ }
+ YY_BREAK
+case 580:
+YY_RULE_SETUP
+#line 5331 "scanner.l"
+{ // strip embedded C++ comments if at the start of a line
+ }
+ YY_BREAK
+case 581:
+YY_RULE_SETUP
+#line 5333 "scanner.l"
+{ // slashes in the middle of a comment block
+ docBlock+=scanYYtext;
+ }
+ YY_BREAK
+case 582:
+YY_RULE_SETUP
+#line 5336 "scanner.l"
+{ // start of a new comment in the
+ // middle of a comment block
+ docBlock+=scanYYtext;
+ }
+ YY_BREAK
+case 583:
+/* rule 583 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 5340 "scanner.l"
+{ // escaped command
+ docBlock+=scanYYtext;
+ }
+ YY_BREAK
+case 584:
+YY_RULE_SETUP
+#line 5343 "scanner.l"
+{
+ docBlock+=scanYYtext;
+ docBlockName=&scanYYtext[1];
+ if (docBlockName.at(1)=='{')
+ {
+ docBlockName.at(1)='}';
+ }
+ BEGIN(DocCopyBlock);
+ }
+ YY_BREAK
+case 585:
+YY_RULE_SETUP
+#line 5352 "scanner.l"
+{
+ docBlock+=scanYYtext;
+ docBlockName="<pre>";
+ BEGIN(DocCopyBlock);
+ }
+ YY_BREAK
+case 586:
+/* rule 586 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 5357 "scanner.l"
+{ // verbatim command (which could contain nested comments!)
+ docBlock+=scanYYtext;
+ docBlockName=&scanYYtext[1];
+ BEGIN(DocCopyBlock);
+ }
+ YY_BREAK
+case 587:
+YY_RULE_SETUP
+#line 5362 "scanner.l"
+{
+ if (insideCS)
+ {
+ docBlock+=scanYYtext;
+ docBlockName="<code>";
+ BEGIN(DocCopyBlock);
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 588:
+YY_RULE_SETUP
+#line 5374 "scanner.l"
+{ // any character that isn't special
+ docBlock+=scanYYtext;
+ }
+ YY_BREAK
+case 589:
+/* rule 589 can match eol */
+YY_RULE_SETUP
+#line 5377 "scanner.l"
+{ // newline
+ yyLineNr++;
+ docBlock+=*scanYYtext;
+ }
+ YY_BREAK
+case 590:
+YY_RULE_SETUP
+#line 5381 "scanner.l"
+{ // command block
+ docBlock+=*scanYYtext;
+ }
+ YY_BREAK
+/* ---- Copy verbatim sections ------ */
+case 591:
+YY_RULE_SETUP
+#line 5387 "scanner.l"
+{ // end of a <pre> block
+ docBlock+=scanYYtext;
+ if (docBlockName=="<pre>")
+ {
+ BEGIN(DocBlock);
+ }
+ }
+ YY_BREAK
+case 592:
+YY_RULE_SETUP
+#line 5394 "scanner.l"
+{ // end of a <code> block
+ docBlock+=scanYYtext;
+ if (docBlockName=="<code>")
+ {
+ BEGIN(DocBlock);
+ }
+ }
+ YY_BREAK
+case 593:
+YY_RULE_SETUP
+#line 5401 "scanner.l"
+{
+ docBlock+=scanYYtext;
+ BEGIN(DocBlock);
+ }
+ YY_BREAK
+case 594:
+/* rule 594 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 5405 "scanner.l"
+{ // end of verbatim block
+ docBlock+=scanYYtext;
+ if (&scanYYtext[4]==docBlockName)
+ {
+ BEGIN(DocBlock);
+ }
+ }
+ YY_BREAK
+case 595:
+/* rule 595 can match eol */
+YY_RULE_SETUP
+#line 5412 "scanner.l"
+{ // start of a comment line
+ if (docBlockName=="verbatim")
+ {
+ REJECT;
+ }
+ }
+ YY_BREAK
+case 596:
+YY_RULE_SETUP
+#line 5418 "scanner.l"
+{ // any character that is not special
+ docBlock+=scanYYtext;
+ }
+ YY_BREAK
+case 597:
+YY_RULE_SETUP
+#line 5421 "scanner.l"
+{
+ docBlock+=scanYYtext;
+ }
+ YY_BREAK
+case 598:
+/* rule 598 can match eol */
+YY_RULE_SETUP
+#line 5424 "scanner.l"
+{ // newline
+ docBlock+=*scanYYtext;
+ yyLineNr++;
+ }
+ YY_BREAK
+case 599:
+YY_RULE_SETUP
+#line 5428 "scanner.l"
+{ // any other character
+ docBlock+=*scanYYtext;
+ }
+ YY_BREAK
+case YY_STATE_EOF(DocCopyBlock):
+#line 5431 "scanner.l"
+{
+ warn(yyFileName,yyLineNr,
+ "warning: reached end of file while inside a %s block!\n"
+ "The command that should end the block seems to be missing!\n",
+ docBlockName.data());
+ yyterminate();
+ }
+ YY_BREAK
+/* ------------- Prototype parser -------------- */
+case 600:
+YY_RULE_SETUP
+#line 5442 "scanner.l"
+{
+ current->name+=scanYYtext;
+ }
+ YY_BREAK
+case 601:
+YY_RULE_SETUP
+#line 5445 "scanner.l"
+{
+ current->args+=*scanYYtext;
+ currentArgumentContext = PrototypeQual;
+ fullArgString = current->args.copy();
+ copyArgString = &current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+ YY_BREAK
+case 602:
+YY_RULE_SETUP
+#line 5452 "scanner.l"
+{
+ current->type+=current->name+scanYYtext;
+ current->name.resize(0);
+ BEGIN( PrototypePtr );
+ }
+ YY_BREAK
+case 603:
+/* rule 603 can match eol */
+YY_RULE_SETUP
+#line 5457 "scanner.l"
+{
+ current->name+=scanYYtext;
+ }
+ YY_BREAK
+case 604:
+YY_RULE_SETUP
+#line 5460 "scanner.l"
+{
+ current->args+=*scanYYtext;
+ currentArgumentContext = PrototypeQual;
+ fullArgString = current->args.copy();
+ copyArgString = &current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+ YY_BREAK
+case 605:
+YY_RULE_SETUP
+#line 5467 "scanner.l"
+{
+ current->type+=')';
+ BEGIN( Prototype );
+ }
+ YY_BREAK
+case 606:
+YY_RULE_SETUP
+#line 5471 "scanner.l"
+{
+ current->name+=scanYYtext;
+ }
+ YY_BREAK
+case 607:
+YY_RULE_SETUP
+#line 5474 "scanner.l"
+{
+ BEGIN( PrototypeSkipLine);
+ }
+ YY_BREAK
+case 608:
+YY_RULE_SETUP
+#line 5477 "scanner.l"
+{
+ current->args += " const ";
+ current->argList->constSpecifier=TRUE;
+ }
+ YY_BREAK
+case 609:
+YY_RULE_SETUP
+#line 5481 "scanner.l"
+{
+ current->args += " volatile ";
+ current->argList->volatileSpecifier=TRUE;
+ }
+ YY_BREAK
+case 610:
+YY_RULE_SETUP
+#line 5485 "scanner.l"
+{
+ current->args += " = 0";
+ current->virt = Pure;
+ current->argList->pureSpecifier=TRUE;
+ }
+ YY_BREAK
+case 611:
+YY_RULE_SETUP
+#line 5490 "scanner.l"
+{
+ current->exception = "throw(";
+ BEGIN(PrototypeExc);
+ }
+ YY_BREAK
+case 612:
+YY_RULE_SETUP
+#line 5494 "scanner.l"
+{
+ current->exception += ')';
+ BEGIN(PrototypeQual);
+ }
+ YY_BREAK
+case 613:
+YY_RULE_SETUP
+#line 5498 "scanner.l"
+{
+ current->exception += *scanYYtext;
+ }
+ YY_BREAK
+case 614:
+YY_RULE_SETUP
+#line 5501 "scanner.l"
+{
+ current->args += *scanYYtext;
+ }
+ YY_BREAK
+case 615:
+YY_RULE_SETUP
+#line 5504 "scanner.l"
+{
+ current->name += *scanYYtext;
+ }
+ YY_BREAK
+case 616:
+YY_RULE_SETUP
+#line 5507 "scanner.l"
+{
+ }
+ YY_BREAK
+/* ------------ Generic rules -------------- */
+case 617:
+/* rule 617 can match eol */
+YY_RULE_SETUP
+#line 5514 "scanner.l"
+{ // line continuation
+ yyLineNr++;
+ }
+ YY_BREAK
+case 618:
+/* rule 618 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up scanYYtext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up scanYYtext again */
+YY_RULE_SETUP
+#line 5517 "scanner.l"
+{
+ BEGIN( lastCContext ) ;
+ }
+ YY_BREAK
+case 619:
+YY_RULE_SETUP
+#line 5520 "scanner.l"
+
+ YY_BREAK
+case 620:
+/* rule 620 can match eol */
+YY_RULE_SETUP
+#line 5521 "scanner.l"
+{ yyLineNr++ ; }
+ YY_BREAK
+case 621:
+YY_RULE_SETUP
+#line 5522 "scanner.l"
+{
+ if (insideIDL && insideCppQuote)
+ {
+ BEGIN(EndCppQuote);
+ }
+ }
+ YY_BREAK
+case 622:
+YY_RULE_SETUP
+#line 5528 "scanner.l"
+{
+ if (!insidePHP)
+ REJECT;
+ lastCContext = YY_START ;
+ BEGIN( SkipCxxComment ) ;
+ }
+ YY_BREAK
+case 623:
+YY_RULE_SETUP
+#line 5534 "scanner.l"
+{
+ if (insidePHP)
+ {
+ lastStringContext=YY_START;
+ BEGIN(SkipPHPString);
+ }
+ }
+ YY_BREAK
+case 624:
+YY_RULE_SETUP
+#line 5541 "scanner.l"
+{
+ if (insidePHP)
+ {
+ lastStringContext=YY_START;
+ BEGIN(SkipString);
+ }
+ }
+ YY_BREAK
+case 625:
+YY_RULE_SETUP
+#line 5548 "scanner.l"
+
+ YY_BREAK
+case 626:
+YY_RULE_SETUP
+#line 5549 "scanner.l"
+
+ YY_BREAK
+case 627:
+YY_RULE_SETUP
+#line 5550 "scanner.l"
+{ lastCContext = YY_START ;
+ BEGIN( SkipComment ) ;
+ }
+ YY_BREAK
+case 628:
+YY_RULE_SETUP
+#line 5553 "scanner.l"
+{ BEGIN( lastCContext ) ; }
+ YY_BREAK
+case 629:
+YY_RULE_SETUP
+#line 5554 "scanner.l"
+{
+ lastCContext = YY_START ;
+ BEGIN( SkipCxxComment ) ;
+ }
+ YY_BREAK
+case 630:
+YY_RULE_SETUP
+#line 5558 "scanner.l"
+ECHO;
+ YY_BREAK
+#line 17306 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(Define):
+ case YY_STATE_EOF(DefineEnd):
+ case YY_STATE_EOF(CompoundName):
+ case YY_STATE_EOF(ClassVar):
+ case YY_STATE_EOF(CSConstraintName):
+ case YY_STATE_EOF(CSConstraintType):
+ case YY_STATE_EOF(CSIndexer):
+ case YY_STATE_EOF(ClassCategory):
+ case YY_STATE_EOF(ClassTemplSpec):
+ case YY_STATE_EOF(CliPropertyType):
+ case YY_STATE_EOF(CliPropertyIndex):
+ case YY_STATE_EOF(CliOverride):
+ case YY_STATE_EOF(Bases):
+ case YY_STATE_EOF(BasesProt):
+ case YY_STATE_EOF(NextSemi):
+ case YY_STATE_EOF(BitFields):
+ case YY_STATE_EOF(FindMembers):
+ case YY_STATE_EOF(FindMembersPHP):
+ case YY_STATE_EOF(FindMemberName):
+ case YY_STATE_EOF(FindFields):
+ case YY_STATE_EOF(FindFieldArg):
+ case YY_STATE_EOF(Function):
+ case YY_STATE_EOF(FuncRound):
+ case YY_STATE_EOF(ExcpRound):
+ case YY_STATE_EOF(ExcpList):
+ case YY_STATE_EOF(FuncQual):
+ case YY_STATE_EOF(Operator):
+ case YY_STATE_EOF(Array):
+ case YY_STATE_EOF(ReadBody):
+ case YY_STATE_EOF(ReadNSBody):
+ case YY_STATE_EOF(ReadBodyIntf):
+ case YY_STATE_EOF(Using):
+ case YY_STATE_EOF(UsingDirective):
+ case YY_STATE_EOF(SkipCurly):
+ case YY_STATE_EOF(SkipCurlyCpp):
+ case YY_STATE_EOF(SkipCurlyEndDoc):
+ case YY_STATE_EOF(SkipString):
+ case YY_STATE_EOF(SkipPHPString):
+ case YY_STATE_EOF(SkipInits):
+ case YY_STATE_EOF(SkipCPP):
+ case YY_STATE_EOF(SkipCPPBlock):
+ case YY_STATE_EOF(SkipComment):
+ case YY_STATE_EOF(SkipCxxComment):
+ case YY_STATE_EOF(SkipCurlyBlock):
+ case YY_STATE_EOF(SkipRoundBlock):
+ case YY_STATE_EOF(Sharp):
+ case YY_STATE_EOF(SkipSharp):
+ case YY_STATE_EOF(SkipRound):
+ case YY_STATE_EOF(SkipSquare):
+ case YY_STATE_EOF(SkipRemainder):
+ case YY_STATE_EOF(TypedefName):
+ case YY_STATE_EOF(TryFunctionBlock):
+ case YY_STATE_EOF(TryFunctionBlockEnd):
+ case YY_STATE_EOF(Comment):
+ case YY_STATE_EOF(PackageName):
+ case YY_STATE_EOF(JavaImport):
+ case YY_STATE_EOF(PHPUse):
+ case YY_STATE_EOF(PHPUseAs):
+ case YY_STATE_EOF(CSAccessorDecl):
+ case YY_STATE_EOF(CSGeneric):
+ case YY_STATE_EOF(PreLineCtrl):
+ case YY_STATE_EOF(DefinePHP):
+ case YY_STATE_EOF(DefinePHPEnd):
+ case YY_STATE_EOF(OldStyleArgs):
+ case YY_STATE_EOF(SkipVerbString):
+ case YY_STATE_EOF(ObjCMethod):
+ case YY_STATE_EOF(ObjCReturnType):
+ case YY_STATE_EOF(ObjCParams):
+ case YY_STATE_EOF(ObjCParamType):
+ case YY_STATE_EOF(ObjCProtocolList):
+ case YY_STATE_EOF(ObjCPropAttr):
+ case YY_STATE_EOF(ObjCSkipStatement):
+ case YY_STATE_EOF(QtPropType):
+ case YY_STATE_EOF(QtPropName):
+ case YY_STATE_EOF(QtPropAttr):
+ case YY_STATE_EOF(QtPropRead):
+ case YY_STATE_EOF(QtPropWrite):
+ case YY_STATE_EOF(ReadInitializer):
+ case YY_STATE_EOF(GetCallType):
+ case YY_STATE_EOF(CppQuote):
+ case YY_STATE_EOF(EndCppQuote):
+ case YY_STATE_EOF(MemberSpec):
+ case YY_STATE_EOF(MemberSpecSkip):
+ case YY_STATE_EOF(EndTemplate):
+ case YY_STATE_EOF(FuncPtr):
+ case YY_STATE_EOF(FuncPtrOperator):
+ case YY_STATE_EOF(EndFuncPtr):
+ case YY_STATE_EOF(ReadFuncArgType):
+ case YY_STATE_EOF(ReadTempArgs):
+ case YY_STATE_EOF(IDLUnionCase):
+ case YY_STATE_EOF(NSAliasName):
+ case YY_STATE_EOF(NSAliasArg):
+ case YY_STATE_EOF(CopyString):
+ case YY_STATE_EOF(CopyPHPString):
+ case YY_STATE_EOF(CopyGString):
+ case YY_STATE_EOF(CopyPHPGString):
+ case YY_STATE_EOF(CopyRound):
+ case YY_STATE_EOF(CopyCurly):
+ case YY_STATE_EOF(GCopyRound):
+ case YY_STATE_EOF(GCopyCurly):
+ case YY_STATE_EOF(SkipUnionSwitch):
+ case YY_STATE_EOF(Specialization):
+ case YY_STATE_EOF(FuncPtrInit):
+ case YY_STATE_EOF(FuncFunc):
+ case YY_STATE_EOF(FuncFuncEnd):
+ case YY_STATE_EOF(FuncFuncType):
+ case YY_STATE_EOF(FuncFuncArray):
+ case YY_STATE_EOF(CopyArgString):
+ case YY_STATE_EOF(CopyArgPHPString):
+ case YY_STATE_EOF(CopyArgRound):
+ case YY_STATE_EOF(CopyArgSharp):
+ case YY_STATE_EOF(CopyArgComment):
+ case YY_STATE_EOF(CopyArgCommentLine):
+ case YY_STATE_EOF(CopyArgVerbatim):
+ case YY_STATE_EOF(IDLAttribute):
+ case YY_STATE_EOF(IDLProp):
+ case YY_STATE_EOF(IDLPropName):
+ case YY_STATE_EOF(Prototype):
+ case YY_STATE_EOF(PrototypePtr):
+ case YY_STATE_EOF(PrototypeQual):
+ case YY_STATE_EOF(PrototypeExc):
+ case YY_STATE_EOF(PrototypeSkipLine):
+ case YY_STATE_EOF(DocLine):
+ case YY_STATE_EOF(DocBlock):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed scanYYin at a new source and called
+ * scanYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = scanYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( scanYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * scanYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of scanYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ scanYYrestart(scanYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) scanYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 3695 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 3695 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 3694);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up scanYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ scanYYrestart(scanYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( scanYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve scanYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void scanYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ scanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ scanYY_create_buffer(scanYYin,YY_BUF_SIZE );
+ }
+
+ scanYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ scanYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void scanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * scanYYpop_buffer_state();
+ * scanYYpush_buffer_state(new_buffer);
+ */
+ scanYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ scanYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (scanYYwrap()) processing, but the only time this flag
+ * is looked at is after scanYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void scanYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ scanYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE scanYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) scanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in scanYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) scanYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in scanYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ scanYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with scanYY_create_buffer()
+ *
+ */
+ void scanYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ scanYYfree((void *) b->yy_ch_buf );
+
+ scanYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a scanYYrestart() or at EOF.
+ */
+ static void scanYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ scanYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then scanYY_init_buffer was _probably_
+ * called from scanYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void scanYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ scanYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void scanYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ scanYYensure_buffer_stack();
+
+ /* This block is copied from scanYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from scanYY_switch_to_buffer. */
+ scanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void scanYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ scanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ scanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void scanYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)scanYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in scanYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)scanYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in scanYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE scanYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) scanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in scanYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ scanYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to scanYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * scanYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE scanYY_scan_string (yyconst char * yystr )
+{
+
+ return scanYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to scanYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE scanYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) scanYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in scanYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = scanYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in scanYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up scanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ scanYYtext[scanYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = scanYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ scanYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int scanYYget_lineno (void)
+{
+
+ return scanYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *scanYYget_in (void)
+{
+ return scanYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *scanYYget_out (void)
+{
+ return scanYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t scanYYget_leng (void)
+{
+ return scanYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *scanYYget_text (void)
+{
+ return scanYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void scanYYset_lineno (int line_number )
+{
+
+ scanYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see scanYY_switch_to_buffer
+ */
+void scanYYset_in (FILE * in_str )
+{
+ scanYYin = in_str ;
+}
+
+void scanYYset_out (FILE * out_str )
+{
+ scanYYout = out_str ;
+}
+
+int scanYYget_debug (void)
+{
+ return scanYY_flex_debug;
+}
+
+void scanYYset_debug (int bdebug )
+{
+ scanYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from scanYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ scanYYin = stdin;
+ scanYYout = stdout;
+#else
+ scanYYin = (FILE *) 0;
+ scanYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * scanYYlex_init()
+ */
+ return 0;
+}
+
+/* scanYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int scanYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ scanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ scanYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ scanYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ scanYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * scanYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *scanYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *scanYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void scanYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see scanYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 5558 "scanner.l"
+
+
+
+//----------------------------------------------------------------------------
+
+static void startCommentBlock(bool brief)
+{
+ if (brief)
+ {
+ current->briefFile = yyFileName;
+ current->briefLine = yyLineNr;
+ }
+ else
+ {
+ current->docFile = yyFileName;
+ current->docLine = yyLineNr;
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void newEntry()
+{
+ current_root->addSubEntry(current);
+ previous = current;
+ current = new Entry ;
+ initEntry();
+}
+
+static void handleCommentBlock(const QCString &doc,bool brief)
+{
+ static bool hideInBodyDocs = Config_getBool("HIDE_IN_BODY_DOCS");
+ int position=0;
+ bool needsEntry=FALSE;
+ if (docBlockInBody && hideInBodyDocs) return;
+ //printf("parseCommentBlock [%s] brief=%d\n",doc.data(),brief);
+ int lineNr = brief ? current->briefLine : current->docLine; // line of block start
+
+ // fill in inbodyFile && inbodyLine the first time, see bug 633891
+ Entry *docEntry = docBlockInBody && previous ? previous : current;
+ if (docBlockInBody && docEntry && docEntry->inbodyLine==-1)
+ {
+ docEntry->inbodyFile = yyFileName;
+ docEntry->inbodyLine = lineNr;
+ }
+
+ while (parseCommentBlock(
+ g_thisParser,
+ docBlockInBody && previous ? previous : current,
+ doc, // text
+ yyFileName, // file
+ lineNr, // line of block start
+ docBlockInBody ? FALSE : brief, // isBrief
+ docBlockInBody ? FALSE : docBlockAutoBrief, // isJavaDocStyle
+ docBlockInBody, // isInBody
+ protection,
+ position,
+ needsEntry
+ )
+ )
+ {
+ //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position);
+ if (needsEntry)
+ {
+ QCString docFile = current->docFile;
+ newEntry();
+ current->docFile = docFile;
+ current->docLine = lineNr;
+ }
+ }
+ if (needsEntry)
+ {
+ newEntry();
+ }
+
+ if (docBlockTerm)
+ {
+ unput(docBlockTerm);
+ docBlockTerm=0;
+ }
+}
+
+static void handleParametersCommentBlocks(ArgumentList *al)
+{
+ //printf(">>>>>>> handleParametersCommentBlocks()\n");
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ //printf(" Param %s docs=%s\n",a->name.data(),a->docs.data());
+ if (!a->docs.isEmpty())
+ {
+ int position=0;
+ bool needsEntry;
+
+ // save context
+ QCString orgDoc = current->doc;
+ QCString orgBrief = current->brief;
+ int orgDocLine = current->docLine;
+ int orgBriefLine = current->briefLine;
+
+ current->doc.resize(0);
+ current->brief.resize(0);
+
+ //printf("handleParametersCommentBlock [%s]\n",doc.data());
+ while (parseCommentBlock(
+ g_thisParser,
+ current,
+ a->docs, // text
+ yyFileName, // file
+ current->docLine, // line of block start
+ FALSE,
+ FALSE,
+ FALSE,
+ protection,
+ position,
+ needsEntry
+ )
+ )
+ {
+ //printf("handleParametersCommentBlock position=%d [%s]\n",position,doc.data()+position);
+ if (needsEntry) newEntry();
+ }
+ if (needsEntry)
+ {
+ newEntry();
+ }
+ a->docs = current->doc;
+
+ // restore context
+ current->doc = orgDoc;
+ current->brief = orgBrief;
+ current->docLine = orgDocLine;
+ current->briefLine = orgBriefLine;
+ }
+ }
+}
+
+
+//----------------------------------------------------------------------------
+
+static void parseCompounds(Entry *rt)
+{
+ //printf("parseCompounds(%s)\n",rt->name.data());
+ g_inputFromFile = FALSE;
+ EntryListIterator eli(*rt->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (!ce->program.isEmpty())
+ {
+ //printf("-- %s ---------\n%s\n---------------\n",
+ // ce->name.data(),ce->program.data());
+ // init scanner state
+ padCount=0;
+ //depthIf = 0;
+ inputString = ce->program;
+ inputPosition = 0;
+ scanYYrestart( scanYYin ) ;
+ if (ce->section==Entry::ENUM_SEC)
+ BEGIN( FindFields ) ;
+ else
+ BEGIN( FindMembers ) ;
+ current_root = ce ;
+ yyFileName = ce->fileName;
+ //setContext();
+ yyLineNr = ce->startLine ;
+ insideObjC = ce->lang==SrcLangExt_ObjC;
+ //printf("---> Inner block starts at line %d objC=%d\n",yyLineNr,insideObjC);
+ //current->reset();
+ if (current) delete current;
+ current = new Entry;
+ current->lang = language;
+ gstat = FALSE;
+ int ni=ce->name.findRev("::"); if (ni==-1) ni=0; else ni+=2;
+ // set default protection based on the compound type
+ if( ce->section==Entry::CLASS_SEC ) // class
+ {
+
+ if (insidePHP || insideD || insideJS)
+ {
+ current->protection = protection = Public ;
+ }
+ else if (insideJava)
+ {
+ current->protection = protection = Package ;
+ }
+ else if (ce->spec&(Entry::Interface | Entry::Ref | Entry::Value | Entry::Struct | Entry::Union))
+ {
+ if (ce->lang==SrcLangExt_ObjC)
+ {
+ current->protection = protection = Protected ;
+ }
+ else
+ {
+ current->protection = protection = Public ;
+ }
+ }
+ else
+ {
+ current->protection = protection = Private ;
+ }
+ }
+ else if (ce->section == Entry::ENUM_SEC ) // enum
+ {
+ current->protection = protection = ce->protection;
+ }
+ else if (!ce->name.isEmpty() && ce->name.at(ni)=='@') // unnamed union or namespace
+ {
+ if (ce->section == Entry::NAMESPACE_SEC ) // unnamed namespace
+ {
+ current->stat = gstat = TRUE;
+ }
+ current->protection = protection = ce->protection;
+ }
+ else // named struct, union, protocol, category
+ {
+ current->protection = protection = Public ;
+ }
+ mtype = Method;
+ virt = Normal;
+ //printf("name=%s current->stat=%d gstat=%d\n",ce->name.data(),current->stat,gstat);
+
+ //memberGroupId = DOX_NOGROUP;
+ //memberGroupRelates.resize(0);
+ //memberGroupInside.resize(0);
+ groupEnterCompound(yyFileName,yyLineNr,ce->name);
+
+ scanYYlex() ;
+ g_lexInit=TRUE;
+ //forceEndGroup();
+
+ groupLeaveCompound(yyFileName,yyLineNr,ce->name);
+
+ delete current; current=0;
+ ce->program.resize(0);
+
+
+ //if (depthIf>0)
+ //{
+ // warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
+ //}
+ }
+ parseCompounds(ce);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+{
+ initParser();
+ //g_inputFromFile = TRUE;
+
+ inputString = fileBuf;
+ inputPosition = 0;
+ g_inputFromFile = FALSE;
+
+ //anonCount = 0; // don't reset per file
+ //depthIf = 0;
+ protection = Public;
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ current_root = rt;
+ global_root = rt;
+ inputFile.setName(fileName);
+ if (inputFile.open(IO_ReadOnly))
+ {
+ yyLineNr= 1 ;
+ yyFileName = fileName;
+ setContext();
+ rt->lang = language;
+ msg("Parsing file %s...\n",yyFileName.data());
+
+ current_root = rt ;
+ initParser();
+ groupEnterFile(yyFileName,yyLineNr);
+ current = new Entry;
+ //printf("current=%p current_root=%p\n",current,current_root);
+ int sec=guessSection(yyFileName);
+ if (sec)
+ {
+ current->name = yyFileName;
+ current->section = sec;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ }
+ current->reset();
+ scanYYrestart( scanYYin );
+ if ( insidePHP )
+ {
+ BEGIN( FindMembersPHP );
+ }
+ else
+ {
+ BEGIN( FindMembers );
+ }
+
+ scanYYlex();
+ g_lexInit=TRUE;
+
+ if (YY_START==Comment)
+ {
+ warn(yyFileName,yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?");
+ }
+
+ //forceEndGroup();
+ groupLeaveFile(yyFileName,yyLineNr);
+
+ //if (depthIf>0)
+ //{
+ // warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
+ //}
+
+ rt->program.resize(0);
+ if (rt->children()->contains(current)==0)
+ // it could be that current is already added as a child to rt, so we
+ // only delete it if this is not the case. See bug 635317.
+ {
+ delete current; current=0;
+ }
+
+ parseCompounds(rt);
+
+ inputFile.close();
+
+ anonNSCount++;
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void parsePrototype(const QCString &text)
+{
+ //printf("**** parsePrototype(%s) begin\n",text.data());
+ if (text.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,"Empty prototype found!");
+ return;
+ }
+
+ const char *orgInputString;
+ int orgInputPosition;
+ YY_BUFFER_STATE orgState;
+ bool orgInputFromFile;
+
+ // save scanner state
+ orgState = YY_CURRENT_BUFFER;
+ scanYY_switch_to_buffer(scanYY_create_buffer(scanYYin,YY_BUF_SIZE));
+ orgInputString = inputString;
+ orgInputPosition = inputPosition;
+ orgInputFromFile = g_inputFromFile;
+
+ // set new string
+ inputString = text;
+ inputPosition = 0;
+ g_inputFromFile = FALSE;
+ scanYYrestart( scanYYin );
+ BEGIN(Prototype);
+ scanYYlex();
+ g_lexInit=TRUE;
+
+ current->name = current->name.stripWhiteSpace();
+ if (current->section == Entry::MEMBERDOC_SEC && current->args.isEmpty())
+ current->section = Entry::VARIABLEDOC_SEC;
+
+ // restore original scanner state
+ YY_BUFFER_STATE tmpState = YY_CURRENT_BUFFER;
+ scanYY_switch_to_buffer(orgState);
+ scanYY_delete_buffer(tmpState);
+ inputString = orgInputString;
+ inputPosition = orgInputPosition;
+ g_inputFromFile = orgInputFromFile;
+
+ //printf("**** parsePrototype end\n");
+}
+
+void scanFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ scanYYlex_destroy();
+ }
+#endif
+}
+
+//static void handleGroupStartCommand(const char *header)
+//{
+// memberGroupHeader=header;
+// startGroupInDoc();
+//}
+//
+//static void handleGroupEndCommand()
+//{
+// endGroup();
+// previous=0;
+//}
+
+//----------------------------------------------------------------------------
+
+void CLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+{
+ g_thisParser = this;
+ ::parseMain(fileName,fileBuf,root);
+}
+
+void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
+ const char * scopeName,
+ const QCString & input,
+ bool isExampleBlock,
+ const char * exampleName,
+ FileDef * fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ MemberDef *memberDef,
+ bool showLineNumbers
+ )
+{
+ ::parseCCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
+ fileDef,startLine,endLine,inlineFragment,memberDef,
+ showLineNumbers);
+}
+
+bool CLanguageScanner::needsPreprocessing(const QCString &extension)
+{
+ QCString fe=extension.lower();
+ return
+ !( fe==".java" || fe==".as" || fe==".d" || fe==".php" ||
+ fe==".php4" || fe==".inc" || fe==".phtml"
+ );
+}
+
+void CLanguageScanner::resetCodeParserState()
+{
+ ::resetCCodeParserState();
+}
+
+void CLanguageScanner::parsePrototype(const char *text)
+{
+ ::parsePrototype(text);
+}
+
+//----------------------------------------------------------------------------
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void scannerYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
+
diff --git a/src/scanner.h b/src/scanner.h
new file mode 100644
index 0000000..dc18974
--- /dev/null
+++ b/src/scanner.h
@@ -0,0 +1,55 @@
+/******************************************************************************
+ *
+ * $Id: scanner.h,v 1.15 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SCANNER_H
+#define SCANNER_H
+
+#include "parserintf.h"
+
+/** \brief C-like language parser using state-based lexical scanning.
+ *
+ * This is the language parser for doxygen. It is somewhat fuzzy and
+ * supports C++ and various languages that are closely related to C++,
+ * such as C, C#, Objective-C, Java, PHP, and IDL.
+ */
+class CLanguageScanner : public ParserInterface
+{
+ public:
+ virtual ~CLanguageScanner() {}
+ void parseInput(const char *fileName,
+ const char *fileBuf,
+ Entry *root);
+ bool needsPreprocessing(const QCString &extension);
+ void parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName=0,
+ FileDef *fileDef=0,
+ int startLine=-1,
+ int endLine=-1,
+ bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,
+ bool showLineNumbers=TRUE
+ );
+ void resetCodeParserState();
+ void parsePrototype(const char *text);
+};
+
+void scanFreeScanner();
+
+#endif
diff --git a/src/scanner.l b/src/scanner.l
new file mode 100644
index 0000000..5270f4c
--- /dev/null
+++ b/src/scanner.l
@@ -0,0 +1,6010 @@
+/*****************************************************************************
+ *
+ * $Id: scanner.l,v 1.80 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+%{
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "qtbc.h"
+#include <qarray.h>
+#include <qstack.h>
+#include <qregexp.h>
+#include <unistd.h>
+#include <qfile.h>
+
+#include "scanner.h"
+#include "entry.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+#include "defargs.h"
+#include "language.h"
+#include "commentscan.h"
+#include "code.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+/* -----------------------------------------------------------------
+ *
+ * statics
+ */
+static ParserInterface *g_thisParser;
+static const char * inputString;
+static int inputPosition;
+static QFile inputFile;
+static int lastContext;
+static int lastCContext;
+static int lastDocContext;
+static int lastCPPContext;
+static int lastSkipSharpContext;
+static int lastSkipRoundContext;
+static int lastStringContext;
+static int lastCurlyContext;
+static int lastRoundContext;
+static int lastSquareContext;
+static int lastInitializerContext;
+static int lastClassTemplSpecContext;
+static int lastPreLineCtrlContext;
+static int lastSkipVerbStringContext;
+static int lastCommentInArgContext;
+static int lastCSConstraint;
+static Protection protection;
+static Protection baseProt;
+static int sharpCount = 0 ;
+static int roundCount = 0 ;
+static int curlyCount = 0 ;
+static int squareCount = 0 ;
+static int padCount = 0 ;
+static QCString slString;
+static Entry* current_root = 0 ;
+static Entry* global_root = 0 ;
+static Entry* current = 0 ;
+static Entry* previous = 0 ;
+static Entry* tempEntry = 0 ;
+static Entry* firstTypedefEntry = 0 ;
+static Entry* memspecEntry = 0 ;
+static int yyLineNr = 1 ;
+static int anonCount = 0 ;
+static int anonNSCount = 0 ;
+static QCString yyFileName;
+static MethodTypes mtype;
+static bool gstat;
+static bool removeSlashes;
+static Specifier virt;
+static Specifier baseVirt;
+static QCString msType,msName,msArgs;
+static bool isTypedef;
+static int tmpDocType;
+static QCString sectionLabel;
+static QCString sectionTitle;
+static QCString funcPtrType;
+static QCString templateStr;
+static QCString aliasName;
+static QCString baseName;
+static QCString* specName;
+static QCString formulaText;
+static QCString formulaEnd;
+static bool useOverrideCommands = FALSE;
+
+static SrcLangExt language;
+static bool insideIDL = FALSE; //!< processing IDL code?
+static bool insideJava = FALSE; //!< processing Java code?
+static bool insideCS = FALSE; //!< processing C# code?
+static bool insideD = FALSE; //!< processing D code?
+static bool insidePHP = FALSE; //!< processing PHP code?
+static bool insideObjC = FALSE; //!< processing Objective C code?
+static bool insideCli = FALSE; //!< processing C++/CLI code?
+static bool insideJS = FALSE; //!< processing JavaScript code?
+
+static bool insideCppQuote = FALSE;
+static bool insideProtocolList = FALSE;
+
+static int argRoundCount;
+static int argSharpCount;
+static int currentArgumentContext;
+static int lastCopyArgStringContext;
+static int lastCopyArgContext;
+static QCString *copyArgString;
+static QCString fullArgString;
+
+static ArgumentList *currentArgumentList;
+static char lastCopyArgChar;
+
+static QCString *pCopyQuotedString;
+static QCString *pCopyRoundString;
+static QCString *pCopyCurlyString;
+
+static QGString *pCopyCurlyGString;
+static QGString *pCopyRoundGString;
+static QGString *pCopyQuotedGString;
+static QGString *pSkipVerbString;
+static QStack<Grouping> autoGroupStack;
+
+static bool insideFormula;
+static bool insideTryBlock=FALSE;
+static bool insideCode;
+static bool needsSemi;
+
+//static int depthIf;
+static int initBracketCount;
+static QCString memberGroupRelates;
+static QCString memberGroupInside;
+static QCString xrefItemKey;
+static QCString xrefItemTitle;
+static QCString xrefListTitle;
+
+static QCString g_skipBlockName;
+static QCString oldStyleArgType;
+static QCString docBackup;
+static QCString briefBackup;
+static bool g_inputFromFile;
+
+static int docBlockContext;
+static QGString docBlock;
+static QCString docBlockName;
+static bool docBlockInBody;
+static bool docBlockAutoBrief;
+static char docBlockTerm;
+
+static QCString idlAttr;
+static QCString idlProp;
+
+static bool g_lexInit = FALSE;
+static bool externC;
+
+
+//-----------------------------------------------------------------------------
+
+// forward declarations
+//static void handleGroupStartCommand(const char *header);
+//static void handleGroupEndCommand();
+
+//-----------------------------------------------------------------------------
+
+static void initParser()
+{
+ sectionLabel.resize(0);
+ sectionTitle.resize(0);
+ baseName.resize(0);
+ formulaText.resize(0);
+ protection = Public;
+ baseProt = Public;
+ sharpCount = 0;
+ roundCount = 0;
+ curlyCount = 0;
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ baseVirt = Normal;
+ isTypedef = FALSE;
+ autoGroupStack.clear();
+ insideTryBlock = FALSE;
+ autoGroupStack.setAutoDelete(TRUE);
+ insideFormula = FALSE;
+ insideCode=FALSE;
+ insideCli=Config_getBool("CPP_CLI_SUPPORT");
+ previous = 0;
+}
+
+static void initEntry()
+{
+ if (insideJava)
+ {
+ protection = (current_root->spec & Entry::Interface) ? Public : Package;
+ }
+ current->protection = protection ;
+ current->mtype = mtype;
+ current->virt = virt;
+ current->stat = gstat;
+ current->lang = language;
+ //printf("*** initEntry() language=%d\n",language);
+ //if (!autoGroupStack.isEmpty())
+ //{
+ // //printf("Appending group %s\n",autoGroupStack.top()->groupname.data());
+ // current->groups->append(new Grouping(*autoGroupStack.top()));
+ //}
+ initGroupInfo(current);
+ isTypedef=FALSE;
+}
+
+
+//-----------------------------------------------------------------------------
+
+///// remove any automatic grouping and add new one (if given)
+//static void setCurrentGroup( QCString *newgroup, Grouping::GroupPri_t pri )
+//{
+// /* remove auto group name from current entry and discard it */
+// Grouping *g = current->groups->first();
+// int i=0;
+// while (g)
+// {
+// if (g->pri <= Grouping::GROUPING_AUTO_DEF)
+// {
+// current->groups->remove(i);
+// i--;
+// }
+// g=current->groups->next();
+// i++;
+// }
+//
+// /* use new group name instead? */
+// if ( newgroup )
+// {
+// current->groups->append(new Grouping(*newgroup, pri));
+// }
+//}
+//
+//static int newMemberGroupId()
+//{
+// static int curGroupId=0;
+// return curGroupId++;
+//}
+//
+// forward declarations
+//static void startGroupInDoc();
+//static void endGroup();
+
+//-----------------------------------------------------------------------------
+
+static void lineCount()
+{
+ for( const char* c = yytext ; *c ; ++c )
+ yyLineNr += (*c == '\n') ;
+}
+
+static void addType( Entry* current )
+{
+ uint tl=current->type.length();
+ if( tl>0 && !current->name.isEmpty() && current->type.at(tl-1)!='.')
+ {
+ current->type += ' ' ;
+ }
+ current->type += current->name ;
+ current->name.resize(0) ;
+ tl=current->type.length();
+ if( tl>0 && !current->args.isEmpty() && current->type.at(tl-1)!='.')
+ {
+ current->type += ' ' ;
+ }
+ current->type += current->args ;
+ current->args.resize(0) ;
+ current->argList->clear();
+}
+
+
+static QCString stripQuotes(const char *s)
+{
+ QCString name;
+ if (s==0 || *s==0) return name;
+ name=s;
+ if (name.at(0)=='"' && name.at(name.length()-1)=='"')
+ {
+ name=name.mid(1,name.length()-2);
+ }
+ return name;
+}
+
+//-----------------------------------------------------------------
+
+static void startCommentBlock(bool);
+static void handleCommentBlock(const QCString &doc,bool brief);
+static void handleParametersCommentBlocks(ArgumentList *al);
+
+//-----------------------------------------------------------------
+
+static bool nameIsOperator(QCString &name)
+{
+ int i=name.find("operator");
+ if (i==-1) return FALSE;
+ if (i==0 && !isId(name.at(8))) return TRUE; // case operator ::X
+ if (i>0 && !isId(name.at(i-1)) && !isId(name.at(i+8))) return TRUE; // case X::operator
+ return FALSE; // case TEXToperatorTEXT
+}
+
+//-----------------------------------------------------------------------------
+
+static void setContext()
+{
+ QCString fileName = yyFileName;
+ language = getLanguageFromFileName(fileName);
+ insideIDL = language==SrcLangExt_IDL;
+ insideJava = language==SrcLangExt_Java;
+ insideCS = language==SrcLangExt_CSharp;
+ insideD = language==SrcLangExt_D;
+ insidePHP = language==SrcLangExt_PHP;
+ insideObjC = language==SrcLangExt_ObjC;
+ insideJS = language==SrcLangExt_JS;
+ if ( insidePHP )
+ {
+ useOverrideCommands = TRUE;
+ }
+ //printf("setContext(%s) insideIDL=%d insideJava=%d insideCS=%d "
+ // "insideD=%d insidePHP=%d insideObjC=%d\n",
+ // yyFileName.data(),insideIDL,insideJava,insideCS,insideD,insidePHP,insideObjC
+ // );
+}
+
+//-----------------------------------------------------------------------------
+
+static void prependScope()
+{
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ //printf("--- prependScope %s to %s\n",current_root->name.data(),current->name.data());
+ current->name.prepend(current_root->name+"::");
+ if (current_root->tArgLists)
+ {
+ if (current->tArgLists==0)
+ {
+ current->tArgLists = new QList<ArgumentList>;
+ current->tArgLists->setAutoDelete(TRUE);
+ }
+ //printf("prependScope #=%d #current=%d\n",current_root->tArgLists->count(),current->tArgLists->count());
+ QListIterator<ArgumentList> talsi(*current_root->tArgLists);
+ ArgumentList *srcAl=0;
+ for (talsi.toLast();(srcAl=talsi.current());--talsi)
+ {
+ ArgumentList *dstAl = new ArgumentList;
+ QListIterator<Argument> tali(*srcAl);
+ Argument *a;
+ for (;(a=tali.current());++tali)
+ {
+ dstAl->append(new Argument(*a));
+ //printf("appending argument %s %s\n",a->type.data(),a->name.data());
+ }
+ current->tArgLists->insert(0,dstAl);
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+/*! Returns TRUE iff the current entry could be a K&R style C function */
+static bool checkForKnRstyleC()
+{
+ if (((QCString)yyFileName).right(2).lower()!=".c") return FALSE; // must be a C file
+ if (!current->argList) return FALSE; // must have arguments
+ ArgumentListIterator ali(*current->argList);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ // in K&R style argument do not have a type, but doxygen expects a type
+ // so it will think the argument has no name
+ if (a->type.isEmpty() || !a->name.isEmpty()) return FALSE;
+ }
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+
+static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
+{
+ int si = current->args.length();
+ if (oldStyleArgType.isEmpty()) // new argument
+ {
+ static QRegExp re("([^)]*)");
+ int bi1 = current->args.findRev(re);
+ int bi2 = bi1!=-1 ? current->args.findRev(re,bi1-1) : -1;
+ char c;
+ if (bi1!=-1 && bi2!=-1) // found something like "int (*func)(int arg)"
+ {
+ int s=bi2+1;
+ oldStyleArgType = current->args.left(s);
+ int i=s;
+ while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++;
+ oldStyleArgType += current->args.mid(s,i-s);
+ s=i;
+ while (i<si && isId(current->args.at(i))) i++;
+ oldStyleArgName = current->args.mid(s,i-s);
+ oldStyleArgType+=current->args.mid(i);
+ }
+ else if (bi1!=-1) // redundant braces like in "int (*var)"
+ {
+ int s=bi1;
+ oldStyleArgType = current->args.left(s);
+ s++;
+ int i=s+1;
+ while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++;
+ oldStyleArgType += current->args.mid(s,i-s);
+ s=i;
+ while (i<si && isId(current->args.at(i))) i++;
+ oldStyleArgName = current->args.mid(s,i-s);
+ }
+ else // normal "int *var"
+ {
+ int l=si,i=l-1,j;
+ char c;
+ // look for start of name in "type *name"
+ while (i>=0 && isId(current->args.at(i))) i--;
+ j=i+1;
+ // look for start of *'s
+ while (i>=0 && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i--;
+ i++;
+ if (i!=l)
+ {
+ oldStyleArgType=current->args.left(i);
+ oldStyleArgPtr=current->args.mid(i,j-i);
+ oldStyleArgName=current->args.mid(j).stripWhiteSpace();
+ }
+ else
+ {
+ oldStyleArgName=current->args.copy().stripWhiteSpace();
+ }
+ }
+ }
+ else // continuation like *arg2 in "int *args,*arg2"
+ {
+ int l=si,j=0;
+ char c;
+ while (j<l && ((c=current->args.at(j))=='*' || isspace((uchar)c))) j++;
+ if (j>0)
+ {
+ oldStyleArgPtr=current->args.left(j);
+ oldStyleArgName=current->args.mid(j).stripWhiteSpace();
+ }
+ else
+ {
+ oldStyleArgName=current->args.copy().stripWhiteSpace();
+ }
+ }
+ //fprintf(stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data());
+}
+
+//-----------------------------------------------------------------------------
+
+/*! Update the argument \a name with additional \a type info. For K&R style
+ * function the type is found \e after the argument list, so this routine
+ * in needed to fix up.
+ */
+static void addKnRArgInfo(const QCString &type,const QCString &name,
+ const QCString &brief,const QCString &docs)
+{
+ if (current->argList==0) return;
+ ArgumentListIterator ali(*current->argList);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (a->type==name)
+ {
+ a->type=type.stripWhiteSpace();
+ if (a->type.left(9)=="register ") // strip keyword
+ {
+ a->type=a->type.mid(9);
+ }
+ a->name=name.stripWhiteSpace();
+ if (!brief.isEmpty() && !docs.isEmpty())
+ {
+ a->docs=brief+"\n\n"+docs;
+ }
+ else if (!brief.isEmpty())
+ {
+ a->docs=brief;
+ }
+ else
+ {
+ a->docs=docs;
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+
+void fixArgumentListForJavaScript(ArgumentList *al)
+{
+ if (al==0) return;
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ if (!a->type.isEmpty() && a->name.isEmpty())
+ { // a->type is actually the (typeless) parameter name, so move it
+ a->name=a->type;
+ a->type.resize(0);
+ }
+ }
+}
+
+/* ----------------------------------------------------------------- */
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ if (g_inputFromFile)
+ {
+ c = inputFile.readBlock(buf,max_size);
+ if (c==-1) yy_fatal_error("input in flex scanner failed");
+ }
+ else
+ {
+ while( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ //printf("%d (%c)\n",*buf,*buf);
+ c++; buf++;
+ }
+ }
+ return c;
+}
+
+%}
+
+ /* start command character */
+CMD ("\\"|"@")
+SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"callergraph"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"{"|"verbatim"|"dotfile"|"dot"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"details"|"typedef"|"def"|"overload")|("<"{PRE}">")
+BN [ \t\n\r]
+BL [ \t\r]*"\n"
+B [ \t]
+BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
+FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+]
+FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+]
+FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+"\"")
+ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
+SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
+SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)(((~|!){BN}*)?{ID})
+PHPSCOPENAME ({ID}"\\")+{ID}
+TSCOPE {ID}("<"[a-z_A-Z0-9 \t\*\&,]*">")?
+CSSCOPENAME (({ID}?{BN}*"."{BN}*)*)((~{BN}*)?{ID})
+PRE [pP][rR][eE]
+CODE [cC][oO][dD][eE]
+CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
+PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
+IDLATTR ("["[^\]]*"]"){BN}*
+TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
+
+%option noyywrap
+
+ /* language parsing states */
+
+%x Define
+%x DefineEnd
+%x CompoundName
+%x ClassVar
+%x CSConstraintName
+%x CSConstraintType
+%x CSIndexer
+%x ClassCategory
+%x ClassTemplSpec
+%x CliPropertyType
+%x CliPropertyIndex
+%x CliOverride
+%x Bases
+%x BasesProt
+%x NextSemi
+%x BitFields
+%x FindMembers
+%x FindMembersPHP
+%x FindMemberName
+%x FindFields
+%x FindFieldArg
+%x Function
+%x FuncRound
+%x ExcpRound
+%x ExcpList
+%x FuncQual
+%x Operator
+%x Array
+%x ReadBody
+%x ReadNSBody
+%x ReadBodyIntf
+%x Using
+%x UsingDirective
+%x SkipCurly
+%x SkipCurlyCpp
+%x SkipCurlyEndDoc
+%x SkipString
+%x SkipPHPString
+%x SkipInits
+%x SkipCPP
+%x SkipCPPBlock
+%x SkipComment
+%x SkipCxxComment
+%x SkipCurlyBlock
+%x SkipRoundBlock
+%x Sharp
+%x SkipSharp
+%x SkipRound
+%x SkipSquare
+%x SkipRemainder
+%x TypedefName
+%x TryFunctionBlock
+%x TryFunctionBlockEnd
+%x Comment
+%x PackageName
+%x JavaImport
+%x PHPUse
+%x PHPUseAs
+%x CSAccessorDecl
+%x CSGeneric
+%x PreLineCtrl
+%x DefinePHP
+%x DefinePHPEnd
+%x OldStyleArgs
+%x SkipVerbString
+%x ObjCMethod
+%x ObjCReturnType
+%x ObjCParams
+%x ObjCParamType
+%x ObjCProtocolList
+%x ObjCPropAttr
+%x ObjCSkipStatement
+%x QtPropType
+%x QtPropName
+%x QtPropAttr
+%x QtPropRead
+%x QtPropWrite
+%x ReadInitializer
+%x GetCallType
+%x CppQuote
+%x EndCppQuote
+%x MemberSpec
+%x MemberSpecSkip
+%x EndTemplate
+%x FuncPtr
+%x FuncPtrOperator
+%x EndFuncPtr
+%x ReadFuncArgType
+%x ReadTempArgs
+%x IDLUnionCase
+%x NSAliasName
+%x NSAliasArg
+%x CopyString
+%x CopyPHPString
+%x CopyGString
+%x CopyPHPGString
+%x CopyRound
+%x CopyCurly
+%x GCopyRound
+%x GCopyCurly
+%x SkipUnionSwitch
+%x Specialization
+%x FuncPtrInit
+%x FuncFunc
+%x FuncFuncEnd
+%x FuncFuncType
+%x FuncFuncArray
+%x CopyArgString
+%x CopyArgPHPString
+%x CopyArgRound
+%x CopyArgSharp
+%x CopyArgComment
+%x CopyArgCommentLine
+%x CopyArgVerbatim
+
+%x IDLAttribute
+%x IDLProp
+%x IDLPropName
+
+ /** Prototype scanner states */
+
+%x Prototype
+%x PrototypePtr
+%x PrototypeQual
+%x PrototypeExc
+%x PrototypeSkipLine
+
+ /** comment parsing states */
+
+%x DocLine
+%x DocBlock
+%x DocCopyBlock
+
+%%
+
+<NextSemi>"{" {
+ curlyCount=0;
+ needsSemi = TRUE;
+ BEGIN(SkipCurlyBlock);
+ }
+<NextSemi>"(" {
+ roundCount=0;
+ BEGIN(SkipRoundBlock);
+ }
+<SkipRoundBlock>"(" {
+ ++roundCount;
+ }
+<SkipRoundBlock>")" {
+ if (roundCount )
+ --roundCount ;
+ else
+ BEGIN( NextSemi ) ;
+ }
+<SkipCurlyBlock>"{" {
+ ++curlyCount ;
+ }
+<SkipCurlyBlock>"}" {
+ if( curlyCount )
+ {
+ --curlyCount ;
+ }
+ else if (needsSemi)
+ {
+ BEGIN( NextSemi );
+ }
+ else
+ {
+ BEGIN( FindMembers );
+ }
+ }
+<NextSemi>\' {
+ if (insidePHP)
+ {
+ lastStringContext=NextSemi;
+ BEGIN(SkipPHPString);
+ }
+ }
+<NextSemi>{CHARLIT} { if (insidePHP) REJECT; }
+<NextSemi>\" {
+ lastStringContext=NextSemi;
+ BEGIN(SkipString);
+ }
+<NextSemi>[;,] {
+ unput(*yytext);
+ BEGIN( FindMembers );
+ }
+<BitFields>[;,] {
+ unput(*yytext);
+ BEGIN( FindMembers );
+ }
+<FindMembers>"<?php" { // PHP code with unsupported extension?
+ insidePHP = TRUE;
+ }
+<FindMembersPHP>"<?"("php"?) { // PHP code start
+ BEGIN( FindMembers );
+ }
+<FindMembersPHP>"<script"{BN}+"language"{BN}*"="{BN}*['"]?"php"['"]?{BN}*">" { // PHP code start
+ lineCount() ;
+ BEGIN( FindMembers );
+ }
+<FindMembersPHP>[^\n<]+ { // Non-PHP code text, ignore
+ }
+<FindMembersPHP>\n { // Non-PHP code text, ignore
+ yyLineNr++;
+ }
+<FindMembersPHP>. { // Non-PHP code text, ignore
+ }
+<FindMembers>"?>"|"</script>" { // PHP code end
+ if (insidePHP)
+ BEGIN( FindMembersPHP );
+ else
+ REJECT;
+ }
+<FindMembers>{PHPKW} { if (insidePHP)
+ BEGIN( NextSemi );
+ else
+ REJECT;
+ }
+<FindMembers>"%{"[^\n]* { // Mozilla XPIDL lang-specific block
+ if (!insideIDL)
+ REJECT;
+ }
+<FindMembers>"%}" { // Mozilla XPIDL lang-specific block end
+ if (!insideIDL)
+ REJECT;
+ }
+<FindMembers>{B}*("properties"){BN}*":"{BN}* { // IDL or Borland C++ builder property
+ current->mtype = mtype = Property;
+ current->protection = protection = Public ;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+
+<FindMembers>{B}*"k_dcop"{BN}*":"{BN}* { current->mtype = mtype = DCOP;
+ current->protection = protection = Public ;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+
+<FindMembers>{B}*("signals"|"Q_SIGNALS"){BN}*":"{BN}* { current->mtype = mtype = Signal;
+
+ current->protection = protection = Public ;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+
+<FindMembers>{B}*"public"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* {
+ current->protection = protection = Public ;
+ current->mtype = mtype = Slot;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount();
+ }
+
+<FindMembers>{B}*"protected"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* {
+ current->protection = protection = Protected ;
+ current->mtype = mtype = Slot;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount();
+ }
+
+<FindMembers>{B}*"private"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* {
+ current->protection = protection = Private ;
+ current->mtype = mtype = Slot;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount();
+ }
+<FindMembers>{B}*("public"|"methods"|"__published"){BN}*":"{BN}* {
+ current->protection = protection = Public ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+<FindMembers>{B}*"internal"{BN}*":"{BN}* { // for now treat C++/CLI's internal as package...
+ if (insideCli)
+ {
+ current->protection = protection = Package ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<FindMembers>{B}*"protected"{BN}*":"{BN}* {
+ current->protection = protection = Protected ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+<FindMembers>{B}*"private"{BN}*":"{BN}* {
+ current->protection = protection = Private ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+<FindMembers>{B}*"event"{BN}+ {
+ if (insideCli)
+ {
+ // C++/CLI event
+ lineCount() ;
+ current->mtype = mtype = Event;
+ current->bodyLine = yyLineNr;
+ curlyCount=0;
+ BEGIN( CliPropertyType );
+ }
+ else if (insideCS)
+ {
+ lineCount() ;
+ current->mtype = Event;
+ current->bodyLine = yyLineNr;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<FindMembers>{B}*"property"{BN}+ {
+ if (insideCli)
+ {
+ // C++/CLI property
+ lineCount() ;
+ current->mtype = mtype = Property;
+ current->bodyLine = yyLineNr;
+ curlyCount=0;
+ BEGIN( CliPropertyType );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<CliPropertyType>{ID} {
+ addType( current );
+ current->name = yytext;
+ }
+<CliPropertyType>"[" { // C++/CLI indexed property
+ current->name += yytext;
+ BEGIN( CliPropertyIndex );
+ }
+<CliPropertyType>"{" {
+ curlyCount=0;
+ //printf("event: '%s' '%s'\n",current->type.data(),current->name.data());
+ BEGIN( CSAccessorDecl );
+ }
+<CliPropertyType>";" {
+ unput(*yytext);
+ BEGIN( FindMembers );
+ }
+<CliPropertyType>\n {
+ yyLineNr++;
+ }
+<CliPropertyType>{B}* {
+ }
+<CliPropertyType>. {
+ addType( current );
+ current->type += yytext;
+ }
+<CliPropertyIndex>"]" {
+ BEGIN( CliPropertyType );
+ current->name+=yytext;
+ }
+<CliPropertyIndex>. {
+ current->name+=yytext;
+ }
+<FindMembers>{B}*"property"{BN}+ {
+ if (!current->type.isEmpty())
+ {
+ REJECT;
+ }
+ else
+ {
+ current->mtype = mtype = Property;
+ lineCount();
+ }
+ }
+<FindMembers>{B}*"@private"{BN}+ {
+ current->protection = protection = Private ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+<FindMembers>{B}*"@protected"{BN}+ {
+ current->protection = protection = Protected ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+<FindMembers>{B}*"@public"{BN}+ {
+ current->protection = protection = Public ;
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ lineCount() ;
+ }
+<FindMembers>[\-+]{BN}* {
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ lineCount();
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ current->section = Entry::FUNCTION_SEC;
+ current->protection = protection = Public ;
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ current->virt = Virtual;
+ current->stat=yytext[0]=='+';
+ current->mtype = mtype = Method;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ BEGIN( ObjCMethod );
+ }
+ }
+<ObjCMethod>"(" { // start of method's return type
+ BEGIN( ObjCReturnType );
+ }
+<ObjCMethod>{ID} { // found method name
+ if (current->type.isEmpty())
+ {
+ current->type = "id";
+ }
+ current->name = yytext;
+ }
+<ObjCMethod>":"{B}* { // start of parameter list
+ current->name += ':';
+ Argument *a = new Argument;
+ current->argList->append(a);
+ BEGIN( ObjCParams );
+ }
+<ObjCReturnType>[^)]* { // TODO: check if nested braches are possible.
+ current->type = yytext;
+ }
+<ObjCReturnType>")" {
+ BEGIN( ObjCMethod );
+ }
+<ObjCParams>({ID})?":" { // Keyword of parameter
+ QCString keyw = yytext;
+ keyw=keyw.left(keyw.length()-1); // strip :
+ if (keyw.isEmpty())
+ {
+ current->name += " :";
+ }
+ else
+ {
+ current->name += keyw+":";
+ }
+ if (current->argList->getLast()->type.isEmpty())
+ {
+ current->argList->getLast()->type="id";
+ }
+ Argument *a = new Argument;
+ a->attrib=(QCString)"["+keyw+"]";
+ current->argList->append(a);
+ }
+<ObjCParams>{ID}{BN}* { // name of parameter
+ lineCount();
+ current->argList->getLast()->name=QCString(yytext).stripWhiteSpace();
+ }
+<ObjCParams>","{BN}*"..." { // name of parameter
+ lineCount();
+ // do we want the comma as part of the name?
+ //current->name += ",";
+ Argument *a = new Argument;
+ a->attrib="[,]";
+ a->type="...";
+ current->argList->append(a);
+ }
+ /*
+<ObjCParams>":" {
+ current->name += ':';
+ }
+ */
+<ObjCParams>"(" {
+ BEGIN( ObjCParamType );
+ }
+<ObjCParamType>[^)]* {
+ current->argList->getLast()->type=QCString(yytext).stripWhiteSpace();
+ }
+<ObjCParamType>")"/{B}* {
+ BEGIN( ObjCParams );
+ }
+<ObjCMethod,ObjCParams>";" { // end of method declaration
+ if (current->argList->getLast() && current->argList->getLast()->type.isEmpty())
+ {
+ current->argList->getLast()->type="id";
+ }
+ current->args = argListToString(current->argList);
+ //printf("argList=%s\n",current->args.data());
+ unput(';');
+ BEGIN( Function );
+ }
+<ObjCMethod,ObjCParams>(";"{BN}+)?"{" { // start of a method body
+ lineCount();
+ //printf("Type=%s Name=%s args=%s\n",
+ // current->type.data(),current->name.data(),argListToString(current->argList).data()
+ // );
+ if (current->argList->getLast() && current->argList->getLast()->type.isEmpty())
+ {
+ current->argList->getLast()->type="id";
+ }
+ current->args = argListToString(current->argList);
+ unput('{');
+ BEGIN( Function );
+ }
+<FindMembers>{BN}{1,80} {
+ lineCount();
+ }
+<FindMembers>"@"({ID}".")*{ID}{BN}*"(" {
+ if (insideJava) // Java annotation
+ {
+ lineCount();
+ lastSkipRoundContext = YY_START;
+ roundCount=1;
+ BEGIN( SkipRound );
+ }
+ else if (strncmp(yytext,"@property",9)==0) // ObjC 2.0 property
+ {
+ current->mtype = mtype = Property;
+ current->spec|=Entry::Readable | Entry::Writable | Entry::Assign;
+ current->protection = Public ;
+ unput('(');
+ BEGIN( ObjCPropAttr );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<ObjCPropAttr>"getter="{ID} {
+ current->read = yytext+7;
+ }
+<ObjCPropAttr>"setter="{ID} {
+ current->write = yytext+7;
+ }
+<ObjCPropAttr>"readonly" {
+ current->spec&=~Entry::Writable;
+ }
+<ObjCPropAttr>"readwrite" { // default
+ }
+<ObjCPropAttr>"assign" { // default
+ }
+<ObjCPropAttr>"retain" {
+ current->spec&=~Entry::Assign;
+ current->spec|=Entry::Retain;
+ }
+<ObjCPropAttr>"copy" {
+ current->spec&=~Entry::Assign;
+ current->spec|=Entry::Copy;
+ }
+<ObjCPropAttr>"nonatmic" {
+ current->spec|=Entry::NonAtomic;
+ }
+<ObjCPropAttr>")" {
+ BEGIN(FindMembers);
+ }
+<FindMembers>"@"{ID} {
+ if (insideJava) // Java annotation
+ {
+ // skip annotation
+ }
+ else if (strcmp(yytext,"@property")==0) // ObjC 2.0 property
+ {
+ current->mtype = mtype = Property;
+ current->spec|=Entry::Writable | Entry::Readable | Entry::Assign;
+ current->protection = Public ;
+ }
+ else if (strcmp(yytext,"@synthesize")==0)
+ {
+ BEGIN( ObjCSkipStatement );
+ }
+ else if (strcmp(yytext,"@dynamic")==0)
+ {
+ BEGIN( ObjCSkipStatement );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<ObjCSkipStatement>";" {
+ BEGIN(FindMembers);
+ }
+<PackageName>{ID}(("."|"\\"){ID})* {
+ isTypedef=FALSE;
+ current->name = yytext;
+ current->name = substitute(current->name,".","::");
+ current->name = substitute(current->name,"\\","::");
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "namespace" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount();
+ curlyCount=0;
+ current_root->addSubEntry(current);
+ current_root = current ;
+ current = new Entry ;
+ initEntry();
+ BEGIN( FindMembers ) ;
+ }
+<PackageName>";" {
+ BEGIN(FindMembers);
+ }
+<FindMembers>{B}*"initonly"{BN}+ {
+ current->type += " initonly ";
+ if (insideCli) current->spec |= Entry::Initonly;
+ lineCount();
+ }
+<FindMembers>{B}*"static"{BN}+ { current->type += " static ";
+ current->stat = TRUE;
+ lineCount();
+ }
+<FindMembers>{B}*"extern"{BN}+ {
+ current->stat = FALSE;
+ current->explicitExternal = TRUE;
+ lineCount();
+ }
+<FindMembers>{B}*"virtual"{BN}+ { current->type += " virtual ";
+ current->virt = Virtual;
+ lineCount();
+ }
+<FindMembers>{B}*"abstract"{BN}+ {
+ if (!insidePHP)
+ {
+ current->type += " abstract ";
+ current->virt = Pure;
+ }
+ else
+ {
+ current->spec|=Entry::Abstract;
+ }
+ lineCount();
+ }
+<FindMembers>{B}*"inline"{BN}+ { current->spec|=Entry::Inline;
+ lineCount();
+ }
+<FindMembers>{B}*"mutable"{BN}+ { current->spec|=Entry::Mutable;
+ lineCount();
+ }
+<FindMembers>{B}*"explicit"{BN}+ { current->spec|=Entry::Explicit;
+ lineCount();
+ }
+<FindMembers>{B}*"@required"{BN}+ { // Objective C 2.0 protocol required section
+ current->spec=(current->spec & ~Entry::Optional) | Entry::Required;
+ lineCount();
+ }
+<FindMembers>{B}*"@optional"{BN}+ { // Objective C 2.0 protocol optional section
+ current->spec=(current->spec & ~Entry::Required) | Entry::Optional;
+ lineCount();
+ }
+ /*
+<FindMembers>{B}*"import"{BN}+ { // IDL import keyword
+ BEGIN( NextSemi );
+ }
+ */
+<FindMembers>{B}*"typename"{BN}+ { lineCount(); }
+<FindMembers>{B}*"namespace"{BN}*/[^a-z_A-Z0-9] {
+ isTypedef=FALSE;
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "namespace" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount();
+ if (insidePHP)
+ {
+ BEGIN( PackageName );
+ }
+ else
+ {
+ BEGIN( CompoundName );
+ }
+ }
+<FindMembers>{B}*"module"{BN}+ {
+ lineCount();
+ if (insideIDL)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "module" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ else if (insideD)
+ {
+ lineCount();
+ BEGIN(PackageName);
+ }
+ else
+ {
+ addType( current ) ;
+ current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{B}*"library"{BN}+ {
+ lineCount();
+ if (insideIDL)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "library" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ else
+ {
+ addType( current ) ;
+ current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba IDL/Java interface
+ lineCount();
+ if (insideIDL || insideJava || insideCS || insideD || insidePHP)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Interface;
+ addType( current ) ;
+ current->type += " interface" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ else
+ {
+ addType( current ) ;
+ current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{B}*"@implementation"{BN}+ { // Objective-C class implementation
+ lineCount();
+ isTypedef=FALSE;
+ current->section = Entry::OBJCIMPL_SEC;
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ current->protection = protection = Public ;
+ addType( current ) ;
+ current->type += " implementation" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+<FindMembers>{B}*"@interface"{BN}+ { // Objective-C class interface, or Java attribute
+ lineCount();
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Interface;
+ if (!insideJava)
+ {
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ }
+ current->protection = protection = Public ;
+ addType( current ) ;
+ current->type += " interface" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+<FindMembers>{B}*"@protocol"{BN}+ { // Objective-C protocol definition
+ lineCount();
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Protocol;
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ current->protection = protection = Public ;
+ addType( current ) ;
+ current->type += " protocol" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+<FindMembers>{B}*"exception"{BN}+ { // Corba IDL exception
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Exception;
+ addType( current ) ;
+ current->type += " exception" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount();
+ BEGIN( CompoundName );
+ }
+<FindMembers>"@class" | // for Objective C class declarations
+<FindMembers>{B}*{TYPEDEFPREFIX}"class{" |
+<FindMembers>{B}*{TYPEDEFPREFIX}"class"{BN}+ {
+ isTypedef=((QCString)yytext).find("typedef")!=-1;
+ current->section = Entry::CLASS_SEC;
+ addType( current ) ;
+ current->type += " class" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ if (yytext[0]=='@')
+ {
+ language = current->lang = SrcLangExt_ObjC;
+ insideObjC = TRUE;
+ }
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ if (insidePHP && current->spec&Entry::Abstract)
+ {
+ // convert Abstract to AbstractClass
+ current->spec=(current->spec&~Entry::Abstract)|Entry::AbstractClass;
+ }
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*"value class{" | // C++/CLI extension
+<FindMembers>{B}*"value class"{BN}+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Value;
+ addType( current ) ;
+ current->type += " value class" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*"ref class{" | // C++/CLI extension
+<FindMembers>{B}*"ref class"{BN}+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Ref;
+ addType( current ) ;
+ current->type += " ref class" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*"interface class{" | // C++/CLI extension
+<FindMembers>{B}*"interface class"{BN}+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Interface;
+ addType( current ) ;
+ current->type += " interface class" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*"coclass"{BN}+ {
+ if (insideIDL)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ addType( current ) ;
+ current->type += " coclass" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ BEGIN( CompoundName ) ;
+ }
+ else
+ {
+ addType(current);
+ current->name = yytext;
+ current->name = current->name.stripWhiteSpace();
+ lineCount();
+ }
+ }
+<FindMembers>{B}*{TYPEDEFPREFIX}"struct{" |
+<FindMembers>{B}*{TYPEDEFPREFIX}"struct"/{BN}+ {
+ isTypedef=((QCString)yytext).find("typedef")!=-1;
+ current->section = Entry::CLASS_SEC ;
+ current->spec = Entry::Struct;
+ // bug 582676: can be a struct nested in an interface so keep insideObjC state
+ //current->objc = insideObjC = FALSE;
+ addType( current ) ;
+ current->type += " struct" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*"value struct{" | // C++/CLI extension
+<FindMembers>{B}*"value struct"{BN}+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Struct | Entry::Value;
+ addType( current ) ;
+ current->type += " value struct" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*"ref struct{" | // C++/CLI extension
+<FindMembers>{B}*"ref struct"{BN}+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Struct | Entry::Ref;
+ addType( current ) ;
+ current->type += " ref struct" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*"interface struct{" | // C++/CLI extension
+<FindMembers>{B}*"interface struct"{BN}+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Struct | Entry::Interface;
+ addType( current ) ;
+ current->type += " interface struct";
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*{TYPEDEFPREFIX}"union{" |
+<FindMembers>{B}*{TYPEDEFPREFIX}"union"{BN}+ {
+ isTypedef=((QCString)yytext).find("typedef")!=-1;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Union;
+ // bug 582676: can be a struct nested in an interface so keep insideObjC state
+ //current->objc = insideObjC = FALSE;
+ addType( current ) ;
+ current->type += " union" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?"{" |
+<FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?{BN}+ { // for IDL: typedef [something] enum
+ isTypedef=((QCString)yytext).find("typedef")!=-1;
+ current->section = Entry::ENUM_SEC ;
+ addType( current ) ;
+ current->type += " enum" ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ lineCount() ;
+ if (yytext[yyleng-1]=='{') unput('{');
+ BEGIN( CompoundName ) ;
+ }
+<Operator>"("{BN}*")"({BN}*"<"[^>]*">"){BN}*/"(" { // A::operator()<int>(int arg)
+ lineCount();
+ current->name += "()";
+ BEGIN( FindMembers );
+ }
+<Operator>"("{BN}*")"{BN}*/"(" {
+ lineCount();
+ current->name += yytext ;
+ current->name = current->name.simplifyWhiteSpace();
+ BEGIN( FindMembers ) ;
+ }
+<Operator>";" { // can occur when importing members
+ unput(';');
+ BEGIN( FindMembers ) ;
+ }
+<Operator>[^(] {
+ lineCount();
+ current->name += *yytext ;
+ }
+<Operator>"<>" { /* skip guided templ specifiers */ }
+<Operator>"(" {
+ current->name = current->name.simplifyWhiteSpace();
+ unput(*yytext);
+ BEGIN( FindMembers ) ;
+ }
+<FindMembers>("template"|"generic")({BN}*)"<"/[>]? { // generic is a C++/CLI extension
+ lineCount();
+ if (current->tArgLists==0)
+ {
+ current->tArgLists = new QList<ArgumentList>;
+ current->tArgLists->setAutoDelete(TRUE);
+ }
+ ArgumentList *al = new ArgumentList;
+ //current->spec |= (yytext[0]=='g') ? Entry::Generic : Entry::Template;
+ current->tArgLists->append(al);
+ currentArgumentList = al;
+ templateStr="<";
+ fullArgString = templateStr;
+ copyArgString = &templateStr;
+ currentArgumentContext = FindMembers;
+ BEGIN( ReadTempArgs );
+ }
+<FindMembers>"namespace"{BN}+/{ID}{BN}*"=" { // namespace alias
+ lineCount();
+ BEGIN( NSAliasName );
+ }
+<NSAliasName>{ID} {
+ aliasName = yytext;
+ BEGIN( NSAliasArg );
+ }
+<NSAliasArg>({ID}"::")*{ID} {
+ //printf("Inserting namespace alias %s::%s->%s\n",current_root->name.data(),aliasName.data(),yytext);
+ //if (current_root->name.isEmpty())
+ //{
+ // TODO: namespace aliases are now treated as global entities
+ // while they should be aware of the scope they are in
+ Doxygen::namespaceAliasDict.insert(aliasName,new QCString(yytext));
+ //}
+ //else
+ //{
+ // Doxygen::namespaceAliasDict.insert(current_root->name+"::"+aliasName,
+ // new QCString(current_root->name+"::"+yytext));
+ //}
+ }
+<NSAliasArg>";" {
+ BEGIN( FindMembers );
+ }
+<PHPUse>({ID}{BN}*"\\"{BN}*)*{ID} {
+ lineCount();
+ aliasName=yytext;
+ //current->fileName = yyFileName;
+ //current->section=Entry::USINGDIR_SEC;
+ //current_root->addSubEntry(current);
+ //current = new Entry;
+ //initEntry();
+ BEGIN(PHPUseAs);
+ }
+<PHPUseAs>{BN}+"as"{BN}+ {
+ lineCount();
+ }
+<PHPUseAs>{ID} {
+ Doxygen::namespaceAliasDict.insert(yytext,
+ new QCString(removeRedundantWhiteSpace(
+ substitute(aliasName,"\\","::"))));
+ aliasName.resize(0);
+ }
+<PHPUseAs>[,;] {
+ if (!aliasName.isEmpty())
+ {
+ int i=aliasName.findRev('\\');
+ QCString an = removeRedundantWhiteSpace(
+ substitute(aliasName,"\\","::"));
+ Doxygen::namespaceAliasDict.insert(aliasName.mid(i+1),
+ new QCString(an));
+ current->name = an;
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ }
+ if (*yytext==',')
+ {
+ BEGIN(PHPUse);
+ }
+ else
+ {
+ BEGIN(FindMembers);
+ }
+ }
+<JavaImport>({ID}{BN}*"."{BN}*)+"*" { // package import => add as a using directive
+ lineCount();
+ QCString scope=yytext;
+ current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-1),".","::"));
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ initEntry();
+ BEGIN(Using);
+ }
+<JavaImport>({ID}{BN}*"."{BN}*)+{ID} { // class import => add as a using declaration
+ lineCount();
+ QCString scope=yytext;
+ current->name=removeRedundantWhiteSpace(substitute(scope,".","::"));
+ current->fileName = yyFileName;
+ if (insideD)
+ {
+ current->section=Entry::USINGDIR_SEC;
+ }
+ else
+ {
+ //printf("import name = %s -> %s\n",yytext,current->name.data());
+ current->section=Entry::USINGDECL_SEC;
+ }
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Using);
+ }
+<FindMembers>"using"{BN}+ {
+ current->startLine=yyLineNr;
+ lineCount();
+ BEGIN(Using);
+ }
+<Using>"namespace"{BN}+ { lineCount(); BEGIN(UsingDirective); }
+<Using>{ID}{BN}*({BN}*("::"|"."){BN}*{ID})* {
+ lineCount();
+ current->name=yytext;
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDECL_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ if (insideCS) /* Hack: in C# a using declaration and
+ directive have the same syntax, so we
+ also add it as a using directive here
+ */
+ {
+ current->name=yytext;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ }
+ initEntry();
+ BEGIN(Using);
+ }
+<UsingDirective>{SCOPENAME} { current->name=removeRedundantWhiteSpace(yytext);
+ current->fileName = yyFileName;
+ current->section=Entry::USINGDIR_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(Using);
+ }
+<Using>";" { BEGIN(FindMembers); }
+<FindMembers>{SCOPENAME}{BN}*"<>" { // guided template decl
+ QCString n=yytext;
+ addType( current );
+ current->name=n.left(n.length()-2);
+ }
+<FindMembers>{SCOPENAME}{BN}*/"<" { // Note: this could be a return type!
+ sharpCount=0;
+ lineCount();
+ addType( current );
+ current->name=yytext;
+ current->name=current->name.stripWhiteSpace();
+ //current->scopeSpec.resize(0);
+ // currentTemplateSpec = &current->scopeSpec;
+ if (nameIsOperator(current->name))
+ BEGIN( Operator );
+ else
+ BEGIN( EndTemplate );
+ }
+<FindMemberName>{SCOPENAME}{BN}*/"<" {
+ sharpCount=0;
+ roundCount=0;
+ lineCount();
+ current->name+=((QCString)yytext).stripWhiteSpace();
+ //current->memberSpec.resize(0);
+ // currentTemplateSpec = &current->memberSpec;
+ if (nameIsOperator(current->name))
+ BEGIN( Operator );
+ else
+ BEGIN( EndTemplate );
+ }
+<ClassTemplSpec,EndTemplate>"<<" {
+ current->name+=yytext;
+ // *currentTemplateSpec+=yytext;
+ }
+<EndTemplate>"<" {
+ current->name+='<';
+ // *currentTemplateSpec+='<';
+ sharpCount++;
+ }
+<ClassTemplSpec,EndTemplate>">>" {
+ if (insideJava || insideCS || insideCli || roundCount==0)
+ {
+ unput('>');
+ unput(' ');
+ unput('>');
+ }
+ else
+ {
+ current->name+=yytext;
+ }
+ // *currentTemplateSpec+=yytext;
+ }
+<EndTemplate>">" {
+ current->name+='>';
+ // *currentTemplateSpec+='>';
+ if (--sharpCount<=0)
+ {
+ //printf("Found %s\n",current->name.data());
+ BEGIN(FindMembers);
+ }
+ }
+<EndTemplate>">"{BN}*"(" {
+ lineCount();
+ current->name+='>';
+ // *currentTemplateSpec+='>';
+ if (--sharpCount<=0)
+ {
+ current->bodyLine = yyLineNr;
+ current->args = "(";
+ currentArgumentContext = FuncQual;
+ fullArgString = current->args.copy();
+ copyArgString = &current->args;
+ //printf("Found %s\n",current->name.data());
+ BEGIN( ReadFuncArgType ) ;
+ }
+ }
+<EndTemplate>">"{BN}*/"("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+ { // function pointer returning a template instance
+ lineCount();
+ current->name+='>';
+ BEGIN(FindMembers);
+ }
+<EndTemplate>">"{BN}*/"::" {
+ lineCount();
+ current->name+='>';
+ // *currentTemplateSpec+='>';
+ if (--sharpCount<=0)
+ {
+ BEGIN(FindMemberName);
+ }
+ }
+<ClassTemplSpec,EndTemplate>"(" { current->name+=*yytext;
+ roundCount++;
+ }
+<ClassTemplSpec,EndTemplate>")" { current->name+=*yytext;
+ if (roundCount>0) roundCount--;
+ }
+<EndTemplate>. {
+ current->name+=*yytext;
+ // *currentTemplateSpec+=*yytext;
+ }
+<FindMembers>"define"{BN}*"("{BN}*["'] {
+ if (insidePHP)
+ {
+ current->bodyLine = yyLineNr;
+ BEGIN( DefinePHP );
+ }
+ else
+ REJECT;
+ }
+<FindMembers>"Q_OBJECT" { // Qt object macro
+ }
+<FindMembers>"Q_PROPERTY" { // Qt property declaration
+ current->protection = protection = Public ;
+ current->mtype = mtype = Property;
+ current->type.resize(0);
+ BEGIN(QtPropType);
+ }
+<QtPropType>"(" { // start of property arguments
+ }
+<QtPropAttr>")" { // end of property arguments
+ unput(';');
+ BEGIN(FindMembers);
+ }
+<QtPropType>"const"|"volatile" {
+ current->type+=yytext;
+ }
+<QtPropType>{B}+ {
+ current->type+=yytext;
+ }
+<QtPropType>({TSCOPE}"::")*{TSCOPE} {
+ current->type+=yytext;
+ BEGIN(QtPropName);
+ }
+<QtPropName>{ID} {
+ current->name=yytext;
+ BEGIN(QtPropAttr);
+ }
+<QtPropAttr>"READ" {
+ current->spec |= Entry::Readable;
+ BEGIN(QtPropRead);
+ }
+<QtPropAttr>"WRITE" {
+ current->spec |= Entry::Writable;
+ BEGIN(QtPropWrite);
+ }
+<QtPropAttr>"RESET"{B}+{ID} { // reset method => not supported yet
+ }
+<QtPropAttr>"SCRIPTABLE"{B}+{ID} { // scriptable property => not supported yet
+ }
+<QtPropAttr>"DESIGNABLE"{B}+{ID} { // designable property => not supported yet
+ }
+<QtPropRead>{ID} {
+ current->read = yytext;
+ BEGIN(QtPropAttr);
+ }
+<QtPropWrite>{ID} {
+ current->write = yytext;
+ BEGIN(QtPropAttr);
+ }
+<FindMembers>"friend"{BN}+("class"|"union"|"struct"){BN}+ {
+ current->name=yytext;
+ BEGIN(FindMembers);
+ }
+<FindMembers,FindMemberName>{SCOPENAME} {
+ lineCount();
+ if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0)
+ {
+ BEGIN(CppQuote);
+ }
+ else if ((insideIDL || insideJava || insideD) && yyleng==6 && strcmp(yytext,"import")==0)
+ {
+ if (insideIDL)
+ BEGIN(NextSemi);
+ else // insideJava or insideD
+ BEGIN(JavaImport);
+ }
+ else if (insidePHP && strcmp(yytext,"use")==0)
+ {
+ BEGIN(PHPUse);
+ }
+ else if (insideJava && strcmp(yytext,"package")==0)
+ {
+ lineCount();
+ BEGIN(PackageName);
+ }
+ else if (insideIDL && strcmp(yytext,"case")==0)
+ {
+ BEGIN(IDLUnionCase);
+ }
+ else if (insideTryBlock && strcmp(yytext,"catch")==0)
+ {
+ insideTryBlock=FALSE;
+ BEGIN(TryFunctionBlock);
+ }
+ else if (insideJS && strcmp(yytext,"var")==0)
+ { // javascript variable
+ current->type="var";
+ }
+ else if (insideJS && strcmp(yytext,"function")==0)
+ { // javascript function
+ current->type="function";
+ }
+ else if (insideCS && strcmp(yytext,"this")==0)
+ {
+ // C# indexer
+ addType( current ) ;
+ current->name="this";
+ BEGIN(CSIndexer);
+ }
+ else
+ {
+ if (YY_START==FindMembers)
+ {
+ addType( current ) ;
+ }
+ bool javaLike = insideJava || insideCS || insideD || insidePHP || insideJS;
+ if (javaLike && strcmp(yytext,"public")==0)
+ {
+ current->protection = Public;
+ }
+ else if (javaLike && strcmp(yytext,"protected")==0)
+ {
+ current->protection = Protected;
+ }
+ else if (javaLike && strcmp(yytext,"private")==0)
+ {
+ current->protection = Private;
+ }
+ else if (javaLike && strcmp(yytext,"static")==0)
+ {
+ if (YY_START==FindMembers)
+ current->name = yytext;
+ else
+ current->name += yytext;
+ current->stat = TRUE;
+ }
+ else
+ {
+ if (YY_START==FindMembers)
+ current->name = yytext;
+ else
+ current->name += yytext;
+ if (current->name.left(7)=="static ")
+ {
+ current->stat = TRUE;
+ current->name= current->name.mid(7);
+ }
+ else if (current->name.left(7)=="inline ")
+ {
+ if (current->type.isEmpty())
+ {
+ current->type="inline";
+ }
+ else
+ {
+ current->type+="inline ";
+ }
+ current->name= current->name.mid(7);
+ }
+ else if (current->name.left(6)=="const ")
+ {
+ if (current->type.isEmpty())
+ {
+ current->type="const";
+ }
+ else
+ {
+ current->type+="const ";
+ }
+ current->name=current->name.mid(6);
+ }
+ }
+ QCString tmp=yytext;
+ if (nameIsOperator(tmp))
+ {
+ BEGIN( Operator );
+ }
+ else
+ {
+ BEGIN(FindMembers);
+ }
+ }
+ }
+<CSIndexer>"["[^\n\]]*"]" {
+ current->name+=removeRedundantWhiteSpace(yytext);
+ BEGIN(FindMembers);
+ }
+<FindMembers>[0-9]{ID} { // some number where we did not expect one
+ }
+<FindMembers>"." {
+ if (insideJava || insideCS || insideD)
+ {
+ current->name+=".";
+ }
+ }
+<FindMembers>"::" {
+ current->name+=yytext;
+ }
+<CppQuote>"("{B}*"\"" {
+ insideCppQuote=TRUE;
+ BEGIN(FindMembers);
+ }
+<IDLUnionCase>"::"
+<IDLUnionCase>":" { BEGIN(FindMembers); }
+<IDLUnionCase>\n { yyLineNr++; }
+<IDLUnionCase>.
+<TryFunctionBlock>\n { yyLineNr++; }
+<TryFunctionBlock>"{" {
+ curlyCount=0;
+ lastCurlyContext = TryFunctionBlockEnd ;
+ BEGIN( SkipCurly );
+ }
+<TryFunctionBlock>.
+<TryFunctionBlockEnd>{BN}*"catch" { lineCount(); BEGIN(TryFunctionBlock); // {BN}* added to fix bug 611193
+ }
+<TryFunctionBlockEnd>\n { unput(*yytext); // rule added to fix bug id 601138
+ BEGIN( FindMembers );
+ }
+<TryFunctionBlockEnd>. { unput(*yytext);
+ BEGIN( FindMembers );
+ }
+<EndCppQuote>")" {
+ insideCppQuote=FALSE;
+ BEGIN(FindMembers);
+ }
+<FindMembers,FindFields>{B}*"#" { if (insidePHP)
+ REJECT;
+ lastCPPContext = YY_START;
+ BEGIN( SkipCPP ) ;
+ }
+<FindMembers,FindFields>{B}*"#"{B}*("cmake")?"define" {
+ if (insidePHP)
+ REJECT;
+ current->bodyLine = yyLineNr;
+ BEGIN( Define );
+ }
+<FindMembers,ReadBody,ReadNSBody,ReadBodyIntf,SkipCurly,SkipCurlyCpp>{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */
+ yyLineNr = atoi(&yytext[1]);
+ //printf("setting line number to %d\n",yyLineNr);
+ lastPreLineCtrlContext = YY_START;
+ if (YY_START==ReadBody ||
+ YY_START==ReadNSBody ||
+ YY_START==ReadBodyIntf)
+ {
+ current->program+=yytext;
+ }
+ BEGIN( PreLineCtrl );
+ }
+<PreLineCtrl>"\""[^\n\"]*"\"" {
+ yyFileName = stripQuotes(yytext);
+ if (lastPreLineCtrlContext==ReadBody ||
+ lastPreLineCtrlContext==ReadNSBody ||
+ lastPreLineCtrlContext==ReadBodyIntf)
+ {
+ current->program+=yytext;
+ }
+ }
+<PreLineCtrl>. {
+ if (lastPreLineCtrlContext==ReadBody ||
+ lastPreLineCtrlContext==ReadNSBody ||
+ lastPreLineCtrlContext==ReadBodyIntf)
+ {
+ current->program+=yytext;
+ }
+ }
+<PreLineCtrl>\n {
+ if (lastPreLineCtrlContext==ReadBody ||
+ lastPreLineCtrlContext==ReadNSBody ||
+ lastPreLineCtrlContext==ReadBodyIntf)
+ {
+ current->program+=yytext;
+ }
+ yyLineNr++;
+ BEGIN( lastPreLineCtrlContext );
+ }
+<SkipCPP>.
+<SkipCPP>\\[\r]*"\n"[\r]* { yyLineNr++ ; }
+<SkipCPP>[\r]*\n[\r]* { yyLineNr++ ;
+ BEGIN( lastCPPContext) ;
+ }
+<Define>{ID}{B}*"(" {
+ current->name = yytext;
+ current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
+ current->args = "(";
+ current->bodyLine = yyLineNr;
+ currentArgumentContext = DefineEnd;
+ fullArgString=current->args.copy();
+ copyArgString=&current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+ /*
+<DefineArg>")" {
+ //printf("Define with args\n");
+ current->args += ')';
+ BEGIN( DefineEnd );
+ }
+<DefineArg>. {
+ current->args += *yytext;
+ }
+ */
+<Define>{ID} {
+ //printf("Define `%s' without args\n",yytext);
+ current->bodyLine = yyLineNr;
+ current->name = yytext;
+ BEGIN(DefineEnd);
+ }
+<DefineEnd>\n {
+ //printf("End define: doc=%s docFile=%s docLine=%d\n",current->doc.data(),current->docFile.data(),current->docLine);
+ yyLineNr++;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->type.resize(0);
+ current->args = current->args.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::DEFINE_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(FindMembers);
+ }
+<DefinePHPEnd>";" {
+ //printf("End define\n");
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->type.resize(0);
+ current->args = current->args.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::ENUM_SEC; //HACK!
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ BEGIN(FindMembers);
+ }
+<DefinePHPEnd>.
+<DefineEnd>\\[\r]?\n {
+ yyLineNr++;
+ }
+<DefineEnd>\" {
+ if (insideIDL && insideCppQuote)
+ {
+ BEGIN(EndCppQuote);
+ }
+ else
+ {
+ lastStringContext=DefineEnd;
+ BEGIN(SkipString);
+ }
+ }
+<DefineEnd>.
+<DefinePHP>{ID}["']{BN}*","{BN}* {
+ current->name = yytext;
+ current->name = current->name.stripWhiteSpace();
+ current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
+ current->name = current->name.left(current->name.length()-1);
+ current->args = "(";
+ current->bodyLine = yyLineNr;
+ lastRoundContext = DefinePHPEnd;
+ pCopyRoundString = &current->args;
+ roundCount = 0;
+ BEGIN( CopyRound );
+ }
+
+<FindMembers>[\^%] { // ^ and % are C++/CLI extensions
+ if (insideCli)
+ {
+ addType( current );
+ current->name = yytext ;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<FindMembers>[*&]+ {
+ if (current->type.stripWhiteSpace().right(1)!=yytext)
+ {
+ current->name += yytext ;
+ }
+ addType( current );
+ }
+<FindMembers,MemberSpec,Function,NextSemi,BitFields,ReadInitializer,OldStyleArgs>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
+ lineCount();
+ if (current->bodyLine==-1)
+ {
+ current->bodyLine=yyLineNr;
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = ';';
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+<MemberSpec,FindFields,FindMembers,NextSemi,BitFields,ReadInitializer,OldStyleArgs>","{BN}*("/**"|"//!"|"/*!"|"///")"<" {
+ lineCount();
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = ',';
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+<DefineEnd,FindFields,FindFieldArg,ReadInitializer,OldStyleArgs>{BN}*("/**"|"//!"|"/*!"|"///")"<" {
+ lineCount();
+ if (current->bodyLine==-1)
+ {
+ current->bodyLine=yyLineNr;
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = 0;
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+
+<FindMembers,FindFields>("//"([!/]?){B}*{CMD}"{")|("/*"([!*]?){B}*{CMD}"{") {
+ //handleGroupStartCommand(current->name);
+ if (previous && previous->section==Entry::GROUPDOC_SEC)
+ {
+ // link open command to the group defined in the previous entry
+ openGroup(previous,yyFileName,yyLineNr);
+ }
+ else
+ {
+ // link open command to the current entry
+ openGroup(current,yyFileName,yyLineNr);
+ }
+ //current = tmp;
+ initEntry();
+ if (yytext[1]=='/')
+ {
+ if (yytext[2]=='!' || yytext[2]=='/')
+ {
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = FALSE;
+ docBlock.resize(0);
+ docBlockTerm = 0;
+ startCommentBlock(TRUE);
+ BEGIN(DocLine);
+ }
+ else
+ {
+ lastCContext=YY_START;
+ BEGIN(SkipCxxComment);
+ }
+ }
+ else
+ {
+ if (yytext[2]=='!' || yytext[2]=='*')
+ {
+ docBlockContext = YY_START;
+ docBlockInBody = FALSE;
+ docBlock.resize(0);
+ docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlockTerm = 0;
+ startCommentBlock(FALSE);
+ BEGIN(DocBlock);
+ }
+ else
+ {
+ lastCContext=YY_START;
+ BEGIN(SkipComment);
+ }
+ }
+ }
+<FindMembers,FindFields,ReadInitializer>"//"([!/]?){B}*{CMD}"}".*|"/*"([!*]?){B}*{CMD}"}".*"*/" {
+ closeGroup(current,yyFileName,yyLineNr);
+ }
+<FindMembers>"=" { // in PHP code this could also be due to "<?="
+ current->bodyLine = yyLineNr;
+ lastInitializerContext = YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+ /* Read initializer rules */
+<ReadInitializer>"(" {
+ lastRoundContext=YY_START;
+ pCopyRoundGString=&current->initializer;
+ roundCount=0;
+ current->initializer+=*yytext;
+ BEGIN(GCopyRound);
+ }
+<ReadInitializer>"{" {
+ lastCurlyContext=YY_START;
+ pCopyCurlyGString=&current->initializer;
+ curlyCount=0;
+ current->initializer+=*yytext;
+ BEGIN(GCopyCurly);
+ }
+<ReadInitializer>[;,] {
+ //printf(">> initializer `%s' <<\n",current->initializer.data());
+ if (*yytext==';' || lastInitializerContext==FindFields)
+ {
+ unput(*yytext);
+ BEGIN(lastInitializerContext);
+ }
+ else if (*yytext==',' && initBracketCount==0) // for "int a=0,b=0"
+ {
+ unput(*yytext);
+ BEGIN(lastInitializerContext);
+ }
+ else
+ {
+ current->initializer+=*yytext;
+ }
+ }
+<ReadInitializer>\" {
+ if (insideIDL && insideCppQuote)
+ {
+ BEGIN(EndCppQuote);
+ }
+ else
+ {
+ lastStringContext=YY_START;
+ current->initializer=yytext;
+ pCopyQuotedGString=&current->initializer;
+ BEGIN(CopyGString);
+ }
+ }
+<ReadInitializer>"->" {
+ current->initializer+=yytext;
+ }
+<ReadInitializer>"<<" {
+ current->initializer+=yytext;
+ }
+<ReadInitializer>">>" {
+ current->initializer+=yytext;
+ }
+<ReadInitializer>[<\[{(] {
+ initBracketCount++;
+ current->initializer+=*yytext;
+ }
+<ReadInitializer>[>\]})] {
+ initBracketCount--;
+ current->initializer+=*yytext;
+ }
+<ReadInitializer>\' {
+ if (insidePHP)
+ {
+ current->initializer+=yytext;
+ pCopyQuotedGString = &current->initializer;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ else
+ {
+ current->initializer+=yytext;
+ }
+ }
+<ReadInitializer>{CHARLIT} {
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ current->initializer+=yytext;
+ }
+ }
+<ReadInitializer>\n {
+ current->initializer+=*yytext;
+ yyLineNr++;
+ }
+<ReadInitializer>"@\"" {
+ //printf("insideCS=%d\n",insideCS);
+ current->initializer+=yytext;
+ if (!insideCS && !insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ // C#/ObjC verbatim string
+ lastSkipVerbStringContext=YY_START;
+ pSkipVerbString=&current->initializer;
+ BEGIN(SkipVerbString);
+ }
+ }
+<SkipVerbString>[^\n"]+ {
+ *pSkipVerbString+=yytext;
+ }
+<SkipVerbString>"\"\"" { // quote escape
+ *pSkipVerbString+=yytext;
+ }
+<SkipVerbString>"\"" {
+ *pSkipVerbString+=*yytext;
+ BEGIN(lastSkipVerbStringContext);
+ }
+<SkipVerbString>\n {
+ *pSkipVerbString+=*yytext;
+ yyLineNr++;
+ }
+<SkipVerbString>. {
+ *pSkipVerbString+=*yytext;
+ }
+<ReadInitializer>"?>" {
+ if (insidePHP)
+ BEGIN( FindMembersPHP );
+ else
+ current->initializer+=yytext;
+ }
+<ReadInitializer>. {
+ current->initializer+=*yytext;
+ }
+
+ /* generic quoted string copy rules */
+<CopyString,CopyPHPString>\\. {
+ *pCopyQuotedString+=yytext;
+ }
+<CopyString>\" {
+ *pCopyQuotedString+=*yytext;
+ BEGIN( lastStringContext );
+ }
+<CopyPHPString>\' {
+ *pCopyQuotedString+=*yytext;
+ BEGIN( lastStringContext );
+ }
+<CopyString,CopyPHPString>"/*"|"*/"|"//" {
+ *pCopyQuotedString+=yytext;
+ }
+<CopyString,CopyPHPString>\n {
+ *pCopyQuotedString+=*yytext;
+ yyLineNr++;
+ }
+<CopyString,CopyPHPString>. {
+ *pCopyQuotedString+=*yytext;
+ }
+
+ /* generic quoted growable string copy rules */
+<CopyGString,CopyPHPGString>\\. {
+ *pCopyQuotedGString+=yytext;
+ }
+<CopyGString>\" {
+ *pCopyQuotedGString+=*yytext;
+ BEGIN( lastStringContext );
+ }
+<CopyPHPGString>\' {
+ *pCopyQuotedGString+=*yytext;
+ BEGIN( lastStringContext );
+ }
+<CopyGString,CopyPHPGString>"/*"|"*/"|"//" {
+ *pCopyQuotedGString+=yytext;
+ }
+<CopyGString,CopyPHPGString>\n {
+ *pCopyQuotedGString+=*yytext;
+ yyLineNr++;
+ }
+<CopyGString,CopyPHPGString>. {
+ *pCopyQuotedGString+=*yytext;
+ }
+
+ /* generic round bracket list copy rules */
+<CopyRound>\" {
+ *pCopyRoundString+=*yytext;
+ pCopyQuotedString=pCopyRoundString;
+ lastStringContext=YY_START;
+ BEGIN(CopyString);
+ }
+<CopyRound>"(" {
+ *pCopyRoundString+=*yytext;
+ roundCount++;
+ }
+<CopyRound>")" {
+ *pCopyRoundString+=*yytext;
+ if (--roundCount<0)
+ BEGIN(lastRoundContext);
+ }
+<CopyRound>\n {
+ yyLineNr++;
+ *pCopyRoundString+=*yytext;
+ }
+<CopyRound>\' {
+ if (insidePHP)
+ {
+ current->initializer+=yytext;
+ pCopyQuotedString = pCopyRoundString;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPString);
+ }
+ else
+ {
+ *pCopyRoundString+=yytext;
+ }
+ }
+<CopyRound>{CHARLIT} {
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *pCopyRoundString+=yytext;
+ }
+ }
+<CopyRound>[^"'()\n]+ {
+ *pCopyRoundString+=yytext;
+ }
+<CopyRound>. {
+ *pCopyRoundString+=*yytext;
+ }
+
+ /* generic round bracket list copy rules for growable strings */
+<GCopyRound>\" {
+ *pCopyRoundGString+=*yytext;
+ pCopyQuotedGString=pCopyRoundGString;
+ lastStringContext=YY_START;
+ BEGIN(CopyGString);
+ }
+<GCopyRound>"(" {
+ *pCopyRoundGString+=*yytext;
+ roundCount++;
+ }
+<GCopyRound>")" {
+ *pCopyRoundGString+=*yytext;
+ if (--roundCount<0)
+ BEGIN(lastRoundContext);
+ }
+<GCopyRound>\n {
+ yyLineNr++;
+ *pCopyRoundGString+=*yytext;
+ }
+<GCopyRound>\' {
+ if (insidePHP)
+ {
+ current->initializer+=yytext;
+ pCopyQuotedGString = pCopyRoundGString;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ else
+ {
+ *pCopyRoundGString+=yytext;
+ }
+ }
+<GCopyRound>{CHARLIT} {
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *pCopyRoundGString+=yytext;
+ }
+ }
+<GCopyRound>[^"'()\n/]+ {
+ *pCopyRoundGString+=yytext;
+ }
+<GCopyRound>. {
+ *pCopyRoundGString+=*yytext;
+ }
+
+ /* generic curly bracket list copy rules */
+<CopyCurly>\" {
+ *pCopyCurlyString+=*yytext;
+ pCopyQuotedString=pCopyCurlyString;
+ lastStringContext=YY_START;
+ BEGIN(CopyString);
+ }
+<CopyCurly>\' {
+ *pCopyCurlyString+=*yytext;
+ if (insidePHP)
+ {
+ pCopyQuotedString=pCopyCurlyString;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPString);
+ }
+ }
+<CopyCurly>"{" {
+ *pCopyCurlyString+=*yytext;
+ curlyCount++;
+ }
+<CopyCurly>"}" {
+ *pCopyCurlyString+=*yytext;
+ if (--curlyCount<0)
+ BEGIN(lastCurlyContext);
+ }
+<CopyCurly>{CHARLIT} { if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *pCopyCurlyString+=yytext;
+ }
+ }
+<CopyCurly>[^"'{}\/\n]+ {
+ *pCopyCurlyString+=yytext;
+ }
+<CopyCurly>"/" { *pCopyCurlyString+=yytext; }
+<CopyCurly>\n {
+ yyLineNr++;
+ *pCopyCurlyString+=*yytext;
+ }
+<CopyCurly>. {
+ *pCopyCurlyString+=*yytext;
+ }
+
+ /* generic curly bracket list copy rules for growable strings */
+<GCopyCurly>^"#"{B}+[0-9]+{B}+"\""[^\"\n]+"\""{B}+"1"{B}*\n? { // start of included file marker
+ }
+<GCopyCurly>^"#"{B}+[0-9]+{B}+"\""[^\"\n]+"\""{B}+"2"{B}*\n? { // end of included file marker
+ QCString line = QCString(yytext);
+ int s = line.find(' ');
+ int e = line.find('"',s);
+ yyLineNr = line.mid(s,e-s).toInt();
+ if (yytext[yyleng-1]=='\n')
+ {
+ yyLineNr++;
+ }
+ }
+<GCopyCurly>\" {
+ *pCopyCurlyGString+=*yytext;
+ pCopyQuotedGString=pCopyCurlyGString;
+ lastStringContext=YY_START;
+ BEGIN(CopyGString);
+ }
+<GCopyCurly>\' {
+ *pCopyCurlyGString+=*yytext;
+ if (insidePHP)
+ {
+ pCopyQuotedGString=pCopyCurlyGString;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ }
+<GCopyCurly>"{" {
+ *pCopyCurlyGString+=*yytext;
+ curlyCount++;
+ }
+<GCopyCurly>"}" {
+ *pCopyCurlyGString+=*yytext;
+ if (--curlyCount<0)
+ BEGIN(lastCurlyContext);
+ }
+<GCopyCurly>{CHARLIT} { if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *pCopyCurlyGString+=yytext;
+ }
+ }
+<GCopyCurly>[^"'{}\/\n]+ {
+ *pCopyCurlyGString+=yytext;
+ }
+<GCopyCurly>"/" { *pCopyCurlyGString+=yytext; }
+<GCopyCurly>\n {
+ yyLineNr++;
+ *pCopyCurlyGString+=*yytext;
+ }
+<GCopyCurly>. {
+ *pCopyCurlyGString+=*yytext;
+ }
+
+ /* ---------------------- */
+
+
+<FindMembers>":" {
+ if (current->type.isEmpty()) // anonymous padding field, e.g. "int :7;"
+ {
+ addType(current);
+ current->name.sprintf("__pad%d__",padCount++);
+ }
+ BEGIN(BitFields);
+ current->bitfields+=":";
+ }
+<BitFields>. {
+ current->bitfields+=*yytext;
+ }
+<FindMembers>[;,] {
+ QCString oldType = current->type.copy();
+ if (current->bodyLine==-1)
+ {
+ current->bodyLine = yyLineNr;
+ }
+ if ( insidePHP && current->type.left(3) == "var" )
+ {
+ current->type = current->type.mid(3);
+ }
+ if (isTypedef && current->type.left(8)!="typedef ")
+ {
+ current->type.prepend("typedef ");
+ }
+ bool needNewCurrent=FALSE;
+ if (!current->name.isEmpty() && current->section!=Entry::ENUM_SEC)
+ {
+ current->type=current->type.simplifyWhiteSpace();
+ current->args=removeRedundantWhiteSpace(current->args);
+ current->name=current->name.stripWhiteSpace();
+ if (current->section==Entry::CLASS_SEC) // remove spec for "struct Bla bla;"
+ {
+ current->spec = 0;
+ }
+ current->section = Entry::VARIABLE_SEC ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current_root->addSubEntry( current ) ;
+ needNewCurrent=TRUE;
+ }
+ if ( *yytext == ',')
+ {
+ if (needNewCurrent)
+ {
+ current = new Entry(*current);
+ initEntry();
+ }
+ current->name.resize(0);
+ current->args.resize(0);
+ current->brief.resize(0);
+ current->doc.resize(0);
+ current->initializer.resize(0);
+ current->bitfields.resize(0);
+ int i=oldType.length();
+ while (i>0 && (oldType[i-1]=='*' || oldType[i-1]=='&' || oldType[i-1]==' ')) i--;
+ current->type = oldType.left(i);
+ }
+ else
+ {
+ if (needNewCurrent)
+ {
+ current = new Entry ;
+ }
+ else if (current->groups)
+ {
+ current->groups->clear();
+ }
+ initEntry();
+ }
+ BEGIN( FindMembers ) ;
+ }
+
+<FindMembers>"[" {
+ if (!insideCS &&
+ (current->name.isEmpty() ||
+ current->name=="typedef"
+ )
+ ) // IDL function property
+ {
+ squareCount=1;
+ lastSquareContext = YY_START;
+ idlAttr.resize(0);
+ idlProp.resize(0);
+ current->mtype = mtype;
+ BEGIN( IDLAttribute );
+ }
+ else if (insideCS &&
+ current->name.isEmpty())
+ {
+ squareCount=1;
+ lastSquareContext = YY_START;
+ // Skip the C# attribute
+ // for this member
+ current->args.resize(0);
+ BEGIN( SkipSquare );
+ }
+ else
+ {
+ current->args += yytext ;
+ squareCount=1;
+ BEGIN( Array ) ;
+ }
+ }
+<IDLAttribute>"]" {
+ // end of IDL function attribute
+ if (--squareCount<=0)
+ {
+ lineCount();
+ if (current->mtype == Property)
+ BEGIN( IDLPropName );
+ else
+ BEGIN( lastSquareContext );
+ }
+ }
+<IDLAttribute>"propput" {
+ if (Config_getBool("IDL_PROPERTY_SUPPORT"))
+ {
+ current->mtype = Property;
+ }
+ current->spec |= Entry::Settable;
+ }
+<IDLAttribute>"propget" {
+ if (Config_getBool("IDL_PROPERTY_SUPPORT"))
+ {
+ current->mtype = Property;
+ }
+ current->spec |= Entry::Gettable;
+ }
+<IDLAttribute>. {
+ }
+<IDLPropName>{BN}*{ID}{BN}* {
+ // return type (probably HRESULT) - skip it
+ }
+<IDLPropName>{ID}{BN}*"(" {
+ current->name = yytext;
+ current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
+ current->startLine = yyLineNr;
+ BEGIN( IDLProp );
+ }
+<IDLProp>{BN}*"["[^\]]*"]"{BN}* { // attribute of a parameter
+ idlAttr = yytext;
+ idlAttr=idlAttr.stripWhiteSpace();
+ }
+<IDLProp>{ID} { // property type
+ idlProp = yytext;
+ }
+<IDLProp>{BN}*{ID}{BN}*"," { // Rare: Another parameter ([propput] HRESULT Item(int index, [in] Type theRealProperty);)
+ if (!current->args)
+ current->args = "(";
+ else
+ current->args += ", ";
+ current->args += idlAttr;
+ current->args += " ";
+ current->args += idlProp; // prop was actually type of extra parameter
+ current->args += " ";
+ current->args += yytext;
+ current->args = current->args.left(current->args.length() - 1); // strip comma
+ idlProp.resize(0);
+ idlAttr.resize(0);
+ BEGIN( IDLProp );
+ }
+<IDLProp>{BN}*{ID}{BN}*")"{BN}* {
+ // the parameter name for the property - just skip.
+ }
+<IDLProp>";" {
+ current->fileName = yyFileName;
+ current->type = idlProp;
+ current->args = current->args.simplifyWhiteSpace();
+ if (current->args)
+ current->args += ")";
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::VARIABLE_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ initEntry();
+ BEGIN( FindMembers );
+ }
+<IDLProp>. { // spaces, *, or other stuff
+ //idlProp+=yytext;
+ }
+<Array>"]" { current->args += *yytext ;
+ if (--squareCount<=0)
+ BEGIN( FindMembers ) ;
+ }
+<FuncFuncArray>"]" { current->args += *yytext ;
+ if (--squareCount<=0)
+ BEGIN( Function ) ;
+ }
+<Array,FuncFuncArray>"[" { current->args += *yytext ;
+ squareCount++;
+ }
+<Array,FuncFuncArray>. { current->args += *yytext ; }
+<SkipSquare>"[" { squareCount++; }
+<SkipSquare>"]" {
+ if (--squareCount<=0)
+ BEGIN( lastSquareContext );
+ }
+<SkipSquare>\" {
+ lastStringContext=YY_START;
+ BEGIN( SkipString );
+ }
+<SkipSquare>[^\n\[\]\"]+
+<FindMembers>"<" { addType( current ) ;
+ current->type += yytext ;
+ BEGIN( Sharp ) ;
+ }
+<Sharp>">" { current->type += *yytext ;
+ if (--sharpCount<=0)
+ BEGIN( FindMembers ) ;
+ }
+<Sharp>"<" { current->type += *yytext ;
+ sharpCount++;
+ }
+<Sharp>{BN}+ {
+ lineCount();
+ }
+<Sharp>. { current->type += *yytext ; }
+<FindFields>{ID} {
+ current->bodyLine = yyLineNr;
+ current->name = yytext;
+ }
+<FindFields>"(" {
+ // Java enum initializer
+ unput('(');
+ lastInitializerContext = YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+<FindFields>"=" {
+ lastInitializerContext = YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+<FindFields>";" {
+ if (insideJava) // last enum field in Java class
+ {
+ if (!current->name.isEmpty())
+ {
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->type = "@"; // enum marker
+ current->args = current->args.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::VARIABLE_SEC;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ }
+
+ // TODO: skip until the end of the scope
+ BEGIN( SkipRemainder );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<SkipRemainder>\n {
+ yyLineNr++;
+ }
+<SkipRemainder>[^\n]*
+<FindFields>"," {
+ //printf("adding `%s' `%s' `%s' to enum `%s' (mGrpId=%d)\n",
+ // current->type.data(), current->name.data(),
+ // current->args.data(), current_root->name.data(),current->mGrpId);
+ if (!current->name.isEmpty())
+ {
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->type = "@"; // enum marker
+ current->args = current->args.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ current->section = Entry::VARIABLE_SEC;
+ // add to the scope of the enum
+ current_root->addSubEntry(current);
+ if (!insideCS && !insideJava) // for C# and Java 1.5+ enum values always have to be explicitly qualified
+ {
+ current = new Entry(*current);
+ // add to the scope surrounding the enum (copy!)
+ current_root->parent()->addSubEntry(current);
+ }
+ current = new Entry ;
+ initEntry();
+ }
+ else // probably a redundant ,
+ {
+ current->reset();
+ }
+ }
+<FindFields>"[" { // attribute list in IDL
+ squareCount=1;
+ lastSquareContext = YY_START;
+ BEGIN(SkipSquare);
+ }
+ /*
+<FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); }
+ */
+<ReadBody,ReadNSBody,ReadBodyIntf>[^\r\n\#{}"@'/]* { current->program += yytext ; }
+<ReadBody,ReadNSBody,ReadBodyIntf>"//".* { current->program += yytext ; }
+<ReadBody,ReadNSBody,ReadBodyIntf>"#".* { if (!insidePHP)
+ REJECT;
+ // append PHP comment.
+ current->program += yytext ;
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>@\" { current->program += yytext ;
+ pSkipVerbString = &current->program;
+ lastSkipVerbStringContext=YY_START;
+ BEGIN( SkipVerbString );
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>\" { current->program += yytext ;
+ pCopyQuotedGString = &current->program;
+ lastStringContext=YY_START;
+ BEGIN( CopyGString );
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{B}* { current->program += yytext ;
+ lastContext = YY_START ;
+ BEGIN( Comment ) ;
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{BL} { current->program += yytext ;
+ ++yyLineNr ;
+ lastContext = YY_START ;
+ BEGIN( Comment ) ;
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>"'" {
+ if (!insidePHP)
+ {
+ current->program += yytext;
+ }
+ else
+ { // begin of single quoted string
+ current->program += yytext;
+ pCopyQuotedGString = &current->program;
+ lastStringContext=YY_START;
+ BEGIN(CopyPHPGString);
+ }
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>{CHARLIT} {
+ if (insidePHP)
+ {
+ REJECT; // for PHP code single quotes
+ // are used for strings of arbitrary length
+ }
+ else
+ {
+ current->program += yytext;
+ }
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>"{" { current->program += yytext ;
+ ++curlyCount ;
+ }
+<ReadBodyIntf>"}" {
+ current->program += yytext ;
+ --curlyCount ;
+ }
+<ReadBody,ReadNSBody>"}" { //err("ReadBody count=%d\n",curlyCount);
+ if ( curlyCount>0 )
+ {
+ current->program += yytext ;
+ --curlyCount ;
+ }
+ else
+ {
+ current->endBodyLine = yyLineNr;
+ QCString &cn = current->name;
+ QCString rn = current_root->name.copy();
+ //printf("cn=`%s' rn=`%s'\n",cn.data(),rn.data());
+ if (!cn.isEmpty() && !rn.isEmpty())
+ {
+ prependScope();
+ }
+ if (isTypedef && cn.isEmpty())
+ {
+ //printf("Typedef Name\n");
+ BEGIN( TypedefName );
+ }
+ else
+ {
+ if (current->section == Entry::ENUM_SEC)
+ {
+ current->program+=','; // add field terminator
+ }
+ // add compound definition to the tree
+ current->args=removeRedundantWhiteSpace(current->args);
+ // was: current->args.simplifyWhiteSpace();
+ current->type = current->type.simplifyWhiteSpace();
+ current->name = current->name.stripWhiteSpace();
+ //printf("adding `%s' `%s' `%s' brief=%s insideObjC=%d %x\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data(),insideObjC,current->section);
+ if (insideObjC &&
+ ((current->spec&Entry::Interface) || (current->spec==Entry::Category))
+ ) // method definition follows
+ {
+ BEGIN( ReadBodyIntf ) ;
+ }
+ else
+ {
+ current_root->addSubEntry( current ) ;
+ memspecEntry = current;
+ current = new Entry(*current);
+ if (current->section==Entry::NAMESPACE_SEC ||
+ (current->spec==Entry::Interface) ||
+ insideJava || insidePHP || insideCS || insideD || insideJS
+ )
+ { // namespaces and interfaces and java classes ends with a closing bracket without semicolon
+ current->reset();
+ initEntry();
+ memspecEntry = 0;
+ BEGIN( FindMembers ) ;
+ }
+ else
+ {
+ if (!isTypedef)
+ {
+ // enabled the next two lines for bug 623424
+ current->doc.resize(0);
+ current->brief.resize(0);
+ }
+ BEGIN( MemberSpec ) ;
+ }
+ }
+ }
+ }
+ }
+<ReadBody>"}"{BN}+"typedef"{BN}+ { //err("ReadBody count=%d\n",curlyCount);
+ lineCount();
+ if ( curlyCount>0 )
+ {
+ current->program += yytext ;
+ --curlyCount ;
+ }
+ else
+ {
+ isTypedef = TRUE;
+ current->endBodyLine = yyLineNr;
+ QCString &cn = current->name;
+ QCString rn = current_root->name.copy();
+ if (!cn.isEmpty() && !rn.isEmpty())
+ {
+ prependScope();
+ }
+ BEGIN( TypedefName );
+ }
+ }
+<TypedefName>("const"|"volatile"){BN} { // late "const" or "volatile" keyword
+ lineCount();
+ current->type.prepend(yytext);
+ }
+<TypedefName>{ID} {
+ if (current->section == Entry::ENUM_SEC)
+ {
+ current->program+=","; // add field terminator
+ }
+ current->name=yytext;
+ prependScope();
+ current->args = current->args.simplifyWhiteSpace();
+ current->type = current->type.simplifyWhiteSpace();
+ //printf("Adding compound %s %s %s\n",current->type.data(),current->name.data(),current->args.data());
+ current_root->addSubEntry( current ) ;
+ if (!firstTypedefEntry)
+ {
+ firstTypedefEntry = current;
+ }
+ current = new Entry;
+ initEntry();
+ isTypedef=TRUE; // to undo reset by initEntry()
+ BEGIN(MemberSpecSkip);
+ }
+<TypedefName>";" { /* typedef of anonymous type */
+ current->name.sprintf("@%d",anonCount++);
+ if (current->section == Entry::ENUM_SEC)
+ {
+ current->program+=','; // add field terminator
+ }
+ // add compound definition to the tree
+ current->args = current->args.simplifyWhiteSpace();
+ current->type = current->type.simplifyWhiteSpace();
+ current_root->addSubEntry( current ) ;
+ memspecEntry = current;
+ current = new Entry(*current);
+ initEntry();
+ unput(';');
+ BEGIN( MemberSpec ) ;
+ }
+<MemberSpec>([*&]*{BN}*)*{ID}{BN}*("["[^\]\n]*"]")* { // the [] part could be improved.
+ lineCount();
+ int i=0,l=yyleng,j;
+ while (i<l && (!isId(yytext[i]))) i++;
+ msName = QCString(yytext).right(l-i).stripWhiteSpace();
+ j=msName.find("[");
+ if (j!=-1)
+ {
+ msArgs=msName.right(msName.length()-j);
+ msName=msName.left(j);
+ }
+ msType=QCString(yytext).left(i);
+
+ // handle *pName in: typedef { ... } name, *pName;
+ if (firstTypedefEntry)
+ {
+ if (firstTypedefEntry->spec&Entry::Struct)
+ {
+ msType.prepend("struct "+firstTypedefEntry->name);
+ }
+ else if (firstTypedefEntry->spec&Entry::Union)
+ {
+ msType.prepend("union "+firstTypedefEntry->name);
+ }
+ else if (firstTypedefEntry->section==Entry::ENUM_SEC)
+ {
+ msType.prepend("enum "+firstTypedefEntry->name);
+ }
+ else
+ {
+ msType.prepend(firstTypedefEntry->name);
+ }
+ }
+ }
+<MemberSpec>"(" { // function with struct return type
+ addType(current);
+ current->name = msName;
+ current->spec = 0;
+ unput('(');
+ BEGIN(FindMembers);
+ }
+<MemberSpec>[,;] {
+ //printf("current->name=`%s' msName=`%s'\n",current->name.data(),msName.data());
+ if (msName.isEmpty() && !current->name.isEmpty())
+ {
+ // see if the compound does not have a name or is inside another
+ // anonymous compound. If so we insert a
+ // special `anonymous' variable.
+ //Entry *p=current_root;
+ Entry *p=current;
+ while (p)
+ {
+ // only look for class scopes, not namespace scopes
+ if ((p->section & Entry::COMPOUND_MASK) && !p->name.isEmpty())
+ {
+ //printf("Trying scope `%s'\n",p->name.data());
+ int i=p->name.findRev("::");
+ int pi = (i==-1) ? 0 : i+2;
+ if (p->name.at(pi)=='@')
+ {
+ // anonymous compound inside -> insert dummy variable name
+ //printf("Adding anonymous variable for scope %s\n",p->name.data());
+ msName.sprintf("@%d",anonCount++);
+ break;
+ }
+ }
+ //p=p->parent;
+ if (p==current) p=current_root; else p=p->parent();
+ }
+ }
+ //printf("msName=%s current->name=%s\n",msName.data(),current->name.data());
+ if (!msName.isEmpty()
+ /*&& msName!=current->name*/) // skip typedef T {} T;, removed due to bug608493
+ {
+ static bool typedefHidesStruct = Config_getBool("TYPEDEF_HIDES_STRUCT");
+ // case 1: typedef struct _S { ... } S_t;
+ // -> omit typedef and use S_t as the struct name
+ if (typedefHidesStruct &&
+ isTypedef &&
+ ((current->spec&(Entry::Struct|Entry::Union)) ||
+ current->section==Entry::ENUM_SEC )&&
+ msType.stripWhiteSpace().isEmpty() &&
+ memspecEntry)
+ {
+ memspecEntry->name=msName;
+ }
+ else // case 2: create a typedef field
+ {
+ Entry *varEntry=new Entry;
+ varEntry->lang = language;
+ varEntry->protection = current->protection ;
+ varEntry->mtype = current->mtype;
+ varEntry->virt = current->virt;
+ varEntry->stat = current->stat;
+ varEntry->section = Entry::VARIABLE_SEC;
+ varEntry->name = msName.stripWhiteSpace();
+ varEntry->type = current->type.simplifyWhiteSpace()+" ";
+ varEntry->args = msArgs;
+ if (isTypedef)
+ {
+ varEntry->type.prepend("typedef ");
+ // //printf("current->name = %s %s\n",current->name.data(),msName.data());
+ }
+ if (typedefHidesStruct &&
+ isTypedef &&
+ (current->spec&(Entry::Struct|Entry::Union)) &&
+ memspecEntry
+ ) // case 1: use S_t as type for pS_t in "typedef struct _S {} S_t, *pS_t;"
+ {
+ varEntry->type+=memspecEntry->name+msType;
+ }
+ else // case 2: use _S as type for for pS_t
+ {
+ varEntry->type+=current->name+msType;
+ }
+ varEntry->fileName = yyFileName;
+ varEntry->startLine = yyLineNr;
+ varEntry->doc = current->doc.copy();
+ varEntry->brief = current->brief.copy();
+ varEntry->mGrpId = current->mGrpId;
+
+ // deep copy group list
+ QListIterator<Grouping> gli(*current->groups);
+ Grouping *g;
+ for (;(g=gli.current());++gli)
+ {
+ varEntry->groups->append(new Grouping(*g));
+ }
+ if (current->sli) // copy special list items
+ {
+ QListIterator<ListItemInfo> li(*current->sli);
+ ListItemInfo *lii;
+ for (li.toFirst();(lii=li.current());++li)
+ {
+ varEntry->addSpecialListItem(lii->type,lii->itemId);
+ }
+ }
+
+ //printf("Add: type=`%s',name=`%s',args=`%s' brief=%s doc=%s\n",
+ // varEntry->type.data(),varEntry->name.data(),
+ // varEntry->args.data(),varEntry->brief.data(),varEntry->doc.data());
+ current_root->addSubEntry(varEntry);
+ }
+ }
+ if (*yytext==';') // end of a struct/class ...
+ {
+ if (msName.isEmpty() && memspecEntry && (current->section&Entry::COMPOUND_MASK))
+ { // case where a class/struct has a doc block after it
+ if (!current->doc.isEmpty())
+ {
+ memspecEntry->doc += current->doc;
+ }
+ if (!current->brief.isEmpty())
+ {
+ memspecEntry->brief += current->brief;
+ }
+ }
+ msType.resize(0);
+ msName.resize(0);
+ msArgs.resize(0);
+ isTypedef=FALSE;
+ firstTypedefEntry=0;
+ memspecEntry=0;
+ current->reset();
+ initEntry();
+ BEGIN( FindMembers );
+ }
+ else
+ {
+ current->doc.resize(0);
+ current->brief.resize(0);
+ }
+ }
+<MemberSpec>"=" {
+ lastInitializerContext=YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ /* BEGIN(MemberSpecSkip); */
+ }
+ /*
+<MemberSpecSkip>"{" {
+ curlyCount=0;
+ lastCurlyContext = MemberSpecSkip;
+ previous = current;
+ BEGIN(SkipCurly);
+ }
+ */
+<MemberSpecSkip>"," { BEGIN(MemberSpec); }
+<MemberSpecSkip>";" { unput(';'); BEGIN(MemberSpec); }
+<ReadBody,ReadNSBody,ReadBodyIntf>{BN}+ { current->program += yytext ;
+ lineCount() ;
+ }
+<ReadBodyIntf>"@end"/[^a-z_A-Z0-9] { // end of Objective C block
+ current_root->addSubEntry( current ) ;
+ current=new Entry;
+ initEntry();
+ insideObjC=FALSE;
+ BEGIN( FindMembers );
+ }
+<ReadBody,ReadNSBody,ReadBodyIntf>. { current->program += yytext ; }
+
+<FindMembers>"("/{BN}*"::"*{BN}*({TSCOPE}{BN}*"::")*{TSCOPE}{BN}*")"{BN}*"(" | /* typedef void (A<int>::func_t)(args...) */
+<FindMembers>("("({BN}*"::"*{BN}*{TSCOPE}{BN}*"::")*({BN}*[*&\^]{BN}*)+)+ { /* typedef void (A::*ptr_t)(args...) or int (*func(int))[], the ^ is for Obj-C blocks */
+ if (insidePHP) // reference parameter
+ {
+ REJECT
+ }
+ else
+ {
+ current->bodyLine = yyLineNr;
+ lineCount();
+ addType(current);
+ funcPtrType=yytext;
+ roundCount=0;
+ //current->type += yytext;
+ BEGIN( FuncPtr );
+ }
+ }
+<FuncPtr>{SCOPENAME} {
+ current->name = yytext;
+ if (nameIsOperator(current->name))
+ {
+ BEGIN( FuncPtrOperator );
+ }
+ else
+ {
+ if (current->name=="const" || current->name=="volatile")
+ {
+ funcPtrType += current->name;
+ }
+ else
+ {
+ BEGIN( EndFuncPtr );
+ }
+ }
+ }
+<FuncPtr>. {
+ //printf("error: FuncPtr `%c' unexpected at line %d of %s\n",*yytext,yyLineNr,yyFileName);
+ }
+<FuncPtrOperator>"("{BN}*")"{BN}*/"(" {
+ current->name += yytext;
+ current->name = current->name.simplifyWhiteSpace();
+ lineCount();
+ }
+<FuncPtrOperator>\n {
+ yyLineNr++;
+ current->name += *yytext;
+ }
+<FuncPtrOperator>"(" {
+ unput(*yytext);
+ BEGIN( EndFuncPtr );
+ }
+<FuncPtrOperator>. {
+ current->name += *yytext;
+ }
+<EndFuncPtr>")"{BN}*/";" { // a variable with extra braces
+ lineCount();
+ current->type+=funcPtrType.data()+1;
+ BEGIN(FindMembers);
+ }
+<EndFuncPtr>")"{BN}*/"(" { // a function pointer
+ lineCount();
+ current->type+=funcPtrType+")";
+ BEGIN(FindMembers);
+ }
+<EndFuncPtr>")"{BN}*/"[" { // an array of variables
+ lineCount();
+ current->type+=funcPtrType.data();
+ current->args += ")";
+ BEGIN(FindMembers);
+ }
+<EndFuncPtr>"(" { // a function returning a function or
+ // a function returning a pointer to an array
+ current->args += *yytext ;
+ //roundCount=0;
+ //BEGIN( FuncFunc );
+ current->bodyLine = yyLineNr;
+ currentArgumentContext = FuncFuncEnd;
+ fullArgString=current->args.copy();
+ copyArgString=&current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+<EndFuncPtr>"["[^\n\]]*"]" {
+ funcPtrType+=yytext;
+ }
+<EndFuncPtr>")" {
+ BEGIN(FindMembers);
+ }
+<FuncFunc>"(" {
+ current->args += *yytext ;
+ ++roundCount;
+ }
+<FuncFunc>")" {
+ current->args += *yytext ;
+ if ( roundCount )
+ --roundCount;
+ else
+ {
+ BEGIN(FuncFuncEnd);
+ }
+ }
+<FuncFuncEnd>")"{BN}*"(" {
+ lineCount();
+ current->type+=funcPtrType+")(";
+ BEGIN(FuncFuncType);
+ }
+<FuncFuncEnd>")"{BN}*/[;{] {
+ lineCount();
+ current->type+=funcPtrType.data()+1;
+ BEGIN(Function);
+ }
+<FuncFuncEnd>")"{BN}*/"[" { // function returning a pointer to an array
+ lineCount();
+ current->type+=funcPtrType;
+ current->args+=")";
+ BEGIN(FuncFuncArray);
+ }
+<FuncFuncEnd>. {
+ current->args += *yytext;
+ }
+<FuncFuncType>"(" {
+ current->type += *yytext;
+ roundCount++;
+ }
+<FuncFuncType>")" {
+ current->type += *yytext;
+ if (roundCount)
+ --roundCount;
+ else
+ BEGIN(Function);
+ }
+<FuncFuncType>{BN}*","{BN}* { lineCount() ; current->type += ", " ; }
+<FuncFuncType>{BN}+ { lineCount() ; current->type += ' ' ; }
+<FuncFuncType>. {
+ current->type += *yytext;
+ }
+<FindMembers>"("/{BN}*{ID}{BN}*"*"{BN}*{ID}*")(" { // for catching typedef void (__stdcall *f)() like definitions
+ if (current->type.left(7)=="typedef" && current->bodyLine==-1)
+ // the bodyLine check is to prevent this guard to be true more than once
+ {
+ current->bodyLine = yyLineNr;
+ BEGIN( GetCallType );
+ }
+ else if (!current->name.isEmpty()) // normal function
+ {
+ current->args = yytext;
+ current->bodyLine = yyLineNr;
+ currentArgumentContext = FuncQual;
+ fullArgString=current->args.copy();
+ copyArgString=&current->args;
+ BEGIN( ReadFuncArgType ) ;
+ //printf(">>> Read function arguments!\n");
+ }
+ }
+<GetCallType>{BN}*{ID}{BN}*"*" {
+ lineCount();
+ addType(current);
+ funcPtrType="(";
+ funcPtrType+=yytext;
+ roundCount=0;
+ BEGIN( FuncPtr );
+ }
+<FindMembers>"(" {
+ if (!current->name.isEmpty())
+ {
+ current->args = yytext;
+ current->bodyLine = yyLineNr;
+ currentArgumentContext = FuncQual;
+ fullArgString=current->args.copy();
+ copyArgString=&current->args;
+ BEGIN( ReadFuncArgType ) ;
+ //printf(">>> Read function arguments current->argList->count()=%d\n",current->argList->count());
+ }
+ }
+ /*
+<FindMembers>"("{BN}*("void"{BN}*)?")" {
+ lineCount();
+ current->args = "()";
+ BEGIN( FuncQual );
+ }
+ */
+
+ /*- Function argument reading rules ---------------------------------------*/
+
+<ReadFuncArgType>[^ \/\r\t\n\)\(\"\'#]+ { *copyArgString+=yytext;
+ fullArgString+=yytext;
+ }
+<CopyArgString,CopyArgPHPString>[^\n\\\"\']+ { *copyArgString+=yytext;
+ fullArgString+=yytext;
+ }
+<CopyArgRound>[^\/\n\)\(\"\']+ {
+ *copyArgString+=yytext;
+ fullArgString+=yytext;
+ }
+<ReadFuncArgType,ReadTempArgs>{BN}* {
+ *copyArgString+=" ";
+ fullArgString+=" ";
+ lineCount();
+ }
+<ReadFuncArgType,CopyArgRound,CopyArgSharp,ReadTempArgs>\" {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ lastCopyArgStringContext = YY_START;
+ BEGIN( CopyArgString );
+ }
+<ReadFuncArgType,ReadTempArgs>"(" {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ argRoundCount=0;
+ lastCopyArgContext = YY_START;
+ BEGIN( CopyArgRound );
+ }
+<ReadFuncArgType>")" {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ stringToArgumentList(fullArgString,current->argList);
+ if (insideJS)
+ {
+ fixArgumentListForJavaScript(current->argList);
+ }
+ handleParametersCommentBlocks(current->argList);
+
+ /* remember the current documentation block, since
+ we could overwrite it with the documentation of
+ a function argument, which we then have to correct later
+ on
+ */
+ docBackup = current->doc;
+ briefBackup = current->brief;
+
+ BEGIN( currentArgumentContext );
+ }
+ /* a special comment */
+<ReadFuncArgType,ReadTempArgs>("/*"[*!]|"//"[/!])("<"?) {
+ if (currentArgumentContext==DefineEnd)
+ {
+ // for defines we interpret a comment
+ // as documentation for the define
+ int i;for (i=yyleng-1;i>=0;i--)
+ {
+ unput(yytext[i]);
+ }
+ stringToArgumentList(fullArgString,current->argList);
+ handleParametersCommentBlocks(current->argList);
+ BEGIN( currentArgumentContext );
+ }
+ else // not a define
+ {
+ // for functions we interpret a comment
+ // as documentation for the argument
+ fullArgString+=yytext;
+ lastCopyArgChar=0;
+ lastCommentInArgContext=YY_START;
+ if (yytext[1]=='/')
+ BEGIN( CopyArgCommentLine );
+ else
+ BEGIN( CopyArgComment );
+ }
+ }
+ /* a non-special comment */
+<ReadFuncArgType,ReadTempArgs>"/**/" { /* empty comment */ }
+<ReadFuncArgType,ReadTempArgs>"/*" {
+ lastCContext = YY_START;
+ BEGIN( SkipComment );
+ }
+<ReadFuncArgType,ReadTempArgs>"//" {
+ lastCContext = YY_START;
+ BEGIN( SkipCxxComment );
+ }
+ /*
+<ReadFuncArgType,ReadTempArgs>"'#" { if (insidePHP)
+ REJECT;
+ *copyArgString+=yytext;
+ fullArgString+=yytext;
+ }
+<ReadFuncArgType,ReadTempArgs>"#" {
+ if (!insidePHP)
+ REJECT;
+ lastCContext = YY_START;
+ BEGIN( SkipCxxComment );
+ }
+ */
+ /* `)' followed by a special comment */
+<ReadFuncArgType>")"{BN}*("/*"[*!]|"//"[/!])"<" {
+ lineCount();
+ if (currentArgumentContext==DefineEnd)
+ {
+ // for defines we interpret a comment
+ // as documentation for the define
+ int i;for (i=yyleng-1;i>0;i--)
+ {
+ unput(yytext[i]);
+ }
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ stringToArgumentList(fullArgString,current->argList);
+ handleParametersCommentBlocks(current->argList);
+ BEGIN( currentArgumentContext );
+ }
+ else
+ {
+ // for functions we interpret a comment
+ // as documentation for the last argument
+ lastCopyArgChar=*yytext;
+ QCString text=&yytext[1];
+ text=text.stripWhiteSpace();
+ lastCommentInArgContext=YY_START;
+ fullArgString+=text;
+ if (text.find("//")!=-1)
+ BEGIN( CopyArgCommentLine );
+ else
+ BEGIN( CopyArgComment );
+ }
+ }
+<CopyArgComment>^{B}*"*"+/{BN}+
+<CopyArgComment>[^\n\\\@\*]+ { fullArgString+=yytext; }
+<CopyArgComment>"*/" { fullArgString+=yytext;
+ if (lastCopyArgChar!=0)
+ unput(lastCopyArgChar);
+ BEGIN( lastCommentInArgContext );
+ }
+<CopyArgCommentLine>\n { fullArgString+=yytext;
+ yyLineNr++;
+ if (lastCopyArgChar!=0)
+ unput(lastCopyArgChar);
+ BEGIN( lastCommentInArgContext );
+ }
+<CopyArgCommentLine>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9] { // verbatim command (which could contain nested comments!)
+ docBlockName=&yytext[1];
+ fullArgString+=yytext;
+ BEGIN(CopyArgVerbatim);
+ }
+<CopyArgCommentLine>{CMD}("f$"|"f["|"f{") {
+ docBlockName=&yytext[1];
+ if (docBlockName.at(1)=='[')
+ {
+ docBlockName.at(1)='}';
+ }
+ if (docBlockName.at(1)=='{')
+ {
+ docBlockName.at(1)='}';
+ }
+ fullArgString+=yytext;
+ BEGIN(CopyArgVerbatim);
+ }
+<CopyArgVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9] { // end of verbatim block
+ fullArgString+=yytext;
+ if (yytext[1]=='f') // end of formula
+ {
+ BEGIN(CopyArgCommentLine);
+ }
+ if (&yytext[4]==docBlockName)
+ {
+ BEGIN(CopyArgCommentLine);
+ }
+ }
+<CopyArgCommentLine>[^\\\@\n]+ { fullArgString+=yytext; }
+<CopyArgCommentLine>. { fullArgString+=*yytext; }
+<CopyArgComment,CopyArgVerbatim>\n { fullArgString+=*yytext; yyLineNr++; }
+<CopyArgComment,CopyArgVerbatim>. { fullArgString+=*yytext; }
+<CopyArgComment>{CMD}("brief"|"short"){B}+ {
+ warn(yyFileName,yyLineNr,
+ "warning: Ignoring %cbrief command inside argument documentation",*yytext
+ );
+ fullArgString+=' ';
+ }
+<ReadTempArgs>"<" {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ argSharpCount=1;
+ BEGIN( CopyArgSharp );
+ }
+<ReadTempArgs>">" {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ //printf("end template list %s\n",copyArgString->data());
+ stringToArgumentList(fullArgString,currentArgumentList);
+ BEGIN( currentArgumentContext );
+ }
+<CopyArgRound>"(" {
+ argRoundCount++;
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ }
+<CopyArgRound>")" {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ if (argRoundCount>0)
+ argRoundCount--;
+ else
+ BEGIN( lastCopyArgContext );
+ }
+<CopyArgSharp>"<" {
+ argSharpCount++;
+ //printf("argSharpCount++=%d copy\n",argSharpCount);
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ }
+<CopyArgSharp>">" {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ argSharpCount--;
+ if (argSharpCount>0)
+ {
+ //printf("argSharpCount--=%d copy\n",argSharpCount);
+ }
+ else
+ {
+ BEGIN( ReadTempArgs );
+ //printf("end of argSharpCount\n");
+ }
+ }
+<CopyArgString,CopyArgPHPString>\\. {
+ *copyArgString+=yytext;
+ fullArgString+=yytext;
+ }
+<CopyArgString>\" {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ BEGIN( lastCopyArgStringContext );
+ }
+<CopyArgPHPString>\' {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ BEGIN( lastCopyArgStringContext );
+ }
+<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>{CHARLIT} {
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ *copyArgString+=yytext;
+ fullArgString+=yytext;
+ }
+ }
+<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>\' {
+ *copyArgString+=yytext;
+ fullArgString+=yytext;
+ if (insidePHP)
+ {
+ lastCopyArgStringContext=YY_START;
+ BEGIN(CopyArgPHPString);
+ }
+ }
+<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>\n {
+ yyLineNr++;
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ }
+<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>. {
+ *copyArgString+=*yytext;
+ fullArgString+=*yytext;
+ }
+
+
+
+ /*------------------------------------------------------------------------*/
+
+
+<FuncRound>"(" { current->args += *yytext ;
+ ++roundCount ;
+ }
+<FuncRound>")" { current->args += *yytext ;
+ if ( roundCount )
+ --roundCount ;
+ else
+ BEGIN( FuncQual ) ;
+ }
+ /*
+<FuncQual>"#" { if (insidePHP)
+ REJECT;
+ lastCPPContext = YY_START;
+ BEGIN(SkipCPP);
+ }
+ */
+<FuncQual>[{:;,] {
+ if ( strcmp(yytext,";")==0 &&
+ insidePHP &&
+ !containsWord(current->type,"function") )
+ {
+ current->reset();
+ initEntry();
+ BEGIN( FindMembers );
+ }
+ else
+ {
+ unput(*yytext); BEGIN( Function );
+ }
+ }
+<FuncQual>{BN}*"abstract"{BN}* { // pure virtual member function
+ lineCount() ;
+ current->virt = Pure;
+ current->args += " override ";
+ }
+<FuncQual>{BN}*"override"{BN}* { // overridden virtual member function
+ lineCount() ;
+ current->spec |= Entry::Override;
+ current->args += " override ";
+ }
+<FuncQual>{BN}*"sealed"{BN}* { // sealed member function
+ lineCount() ;
+ current->spec |= Entry::Sealed;
+ current->args += " sealed ";
+ }
+<FuncQual>{BN}*"new"{BN}* { // new member function
+ lineCount() ;
+ current->spec |= Entry::New;
+ current->args += " new ";
+ }
+<FuncQual>{BN}*"const"{BN}* { // const member function
+ lineCount() ;
+ current->args += " const ";
+ current->argList->constSpecifier=TRUE;
+ }
+<FuncQual>{BN}*"volatile"{BN}* { // volatile member function
+ lineCount() ;
+ current->args += " volatile ";
+ current->argList->volatileSpecifier=TRUE;
+ }
+<FuncQual>{BN}*"="{BN}*"0"{BN}* { // pure virtual member function
+ lineCount() ;
+ current->args += " = 0";
+ current->virt = Pure;
+ current->argList->pureSpecifier=TRUE;
+ }
+<FuncRound,FuncFunc>{BN}*","{BN}* {
+ lineCount() ;
+ current->args += ", " ;
+ }
+<FuncQual,FuncRound,FuncFunc>{BN}+ {
+ lineCount() ;
+ current->args += ' ' ;
+ }
+<Function,FuncQual,FuncRound,FuncFunc>"#" { if (insidePHP)
+ REJECT;
+ lastCPPContext = YY_START;
+ BEGIN(SkipCPP);
+ }
+<FuncQual>"=" {
+ if (insideCli &&
+ (current_root->section&Entry::COMPOUND_MASK)
+ )
+ {
+ BEGIN(CliOverride);
+ }
+ else
+ {
+ // typically an initialized function pointer
+ lastInitializerContext=YY_START;
+ initBracketCount=0;
+ BEGIN(ReadInitializer);
+ }
+ }
+<CliOverride>{ID} {
+ }
+<CliOverride>"{" {
+ unput(*yytext);
+ BEGIN(FuncQual);
+ }
+<CliOverride>\n {
+ yyLineNr++;
+ }
+<CliOverride>. {
+ }
+<FuncPtrInit>[{;] {
+ unput(*yytext);
+ BEGIN(FuncQual);
+ }
+<FuncPtrInit>\" {
+ current->args += *yytext;
+ pCopyQuotedString=&current->args;
+ lastStringContext=FuncPtrInit;
+ BEGIN(CopyString);
+ }
+<FuncPtrInit>\' {
+ current->args += *yytext;
+ if (insidePHP)
+ {
+ pCopyQuotedString=&current->args;
+ lastStringContext=FuncPtrInit;
+ BEGIN(CopyPHPString);
+ }
+ }
+<FuncPtrInit>{CHARLIT} {
+ if (insidePHP)
+ {
+ REJECT;
+ }
+ else
+ {
+ current->args += yytext;
+ }
+ }
+<FuncPtrInit>{ID} {
+ current->args += yytext;
+ }
+<FuncPtrInit>. {
+ current->args += *yytext;
+ }
+<FuncPtrInit>\n {
+ current->args += *yytext;
+ yyLineNr++;
+ }
+<FuncQual>{ID} { // typically a K&R style C function
+ if (insideCS && strcmp(yytext,"where")==0)
+ {
+ // type contraint for a method
+ delete current->typeConstr;
+ current->typeConstr = new ArgumentList;
+ current->typeConstr->append(new Argument);
+ lastCSConstraint = YY_START;
+ BEGIN( CSConstraintName );
+ }
+ else if (checkForKnRstyleC())
+ {
+ //fprintf(stderr,"===> got a K&R style function\n");
+ current->args = yytext;
+ oldStyleArgType.resize(0);
+ BEGIN(OldStyleArgs);
+ }
+ else
+ {
+ current->args += yytext;
+ }
+ }
+<OldStyleArgs>[,;] {
+ QCString oldStyleArgPtr;
+ QCString oldStyleArgName;
+ splitKnRArg(oldStyleArgPtr,oldStyleArgName);
+ QCString doc,brief;
+ if (current->doc!=docBackup)
+ {
+ doc=current->doc.copy();
+ current->doc=docBackup;
+ }
+ if (current->brief!=briefBackup)
+ {
+ brief=current->brief.copy();
+ current->brief=briefBackup;
+ }
+ addKnRArgInfo(oldStyleArgType+oldStyleArgPtr,
+ oldStyleArgName,brief,doc);
+ current->args.resize(0);
+ if (*yytext==';') oldStyleArgType.resize(0);
+ }
+<OldStyleArgs>{ID} { current->args += yytext; }
+<OldStyleArgs>"{" {
+ current->args = argListToString(current->argList);
+ unput('{');
+ BEGIN(FuncQual);
+ }
+<OldStyleArgs>. { current->args += *yytext; }
+<FuncQual,FuncRound,FuncFunc>. { current->args += *yytext; }
+<FuncQual>{BN}*"try:" |
+<FuncQual>{BN}*"try"{BN}+ { /* try-function-block */
+ insideTryBlock=TRUE;
+ lineCount();
+ if (yytext[yyleng-1]==':')
+ {
+ unput(':');
+ BEGIN( Function );
+ }
+ }
+<FuncQual>{BN}*"throw"{BN}*"(" { // C++ style throw clause
+ current->exception = " throw (" ;
+ roundCount=0;
+ lineCount() ;
+ BEGIN( ExcpRound ) ;
+ }
+<FuncQual>{BN}*"raises"{BN}*"(" {
+ current->exception = " raises (" ;
+ lineCount() ;
+ roundCount=0;
+ BEGIN( ExcpRound ) ;
+ }
+<FuncQual>{BN}*"throws"{BN}+ { // Java style throw clause
+ current->exception = " throws " ;
+ lineCount() ;
+ BEGIN( ExcpList );
+ }
+<ExcpRound>"(" { current->exception += *yytext ;
+ ++roundCount ;
+ }
+<ExcpRound>")" { current->exception += *yytext ;
+ if ( roundCount )
+ --roundCount ;
+ else
+ BEGIN( FuncQual ) ;
+ }
+<ExcpRound>. {
+ current->exception += *yytext;
+ }
+<ExcpList>"{" {
+ unput('{'); BEGIN( FuncQual );
+ }
+<ExcpList>";" {
+ unput(';'); BEGIN( FuncQual );
+ }
+<ExcpList>"\n" {
+ current->exception += ' ';
+ yyLineNr++;
+ }
+<ExcpList>. {
+ current->exception += *yytext;
+ }
+<Function>"(" { current->type += current->name ;
+ current->name = current->args ;
+ current->args = yytext ;
+ roundCount=0;
+ BEGIN( FuncRound ) ;
+ }
+<Function>":" {
+ if (!insidePHP) BEGIN(SkipInits);
+ }
+<Function>[;{,] {
+ current->name=current->name.simplifyWhiteSpace();
+ current->type=current->type.simplifyWhiteSpace();
+ current->args=removeRedundantWhiteSpace(current->args);
+ // was: current->args.simplifyWhiteSpace();
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ static QRegExp re("([^)]*[*&][^)]*)"); // (...*...)
+ if (*yytext!=';' || (current_root->section&Entry::COMPOUND_MASK) )
+ {
+ int tempArg=current->name.find('<');
+ QCString tempName;
+ if (tempArg==-1) tempName=current->name; else tempName=current->name.left(tempArg);
+ if (!current->type.isEmpty() &&
+ (current->type.find(re,0)!=-1 || current->type.left(8)=="typedef "))
+ {
+ //printf("Scanner.l: found in class variable: `%s' `%s' `%s'\n", current->type.data(),current->name.data(),current->args.data());
+ if (isTypedef && current->type.left(8)!="typedef ")
+ {
+ current->type.prepend("typedef ");
+ }
+ current->section = Entry::VARIABLE_SEC ;
+ }
+ else
+ {
+ //printf("Scanner.l: found in class function: `%s' `%s' `%s'\n", current->type.data(),current->name.data(),current->args.data());
+ current->section = Entry::FUNCTION_SEC ;
+ current->proto = *yytext==';';
+ }
+ }
+ else // a global function prototype or function variable
+ {
+ //printf("Scanner.l: prototype? type=`%s' name=`%s' args=`%s'\n",current->type.data(),current->name.data(),current->args.data());
+ if (!current->type.isEmpty() &&
+ (current->type.find(re,0)!=-1 || current->type.left(8)=="typedef "))
+ {
+ if (isTypedef && current->type.left(8)!="typedef ")
+ {
+ current->type.prepend("typedef ");
+ }
+ //printf("Scanner.l: found function variable!\n");
+ current->section = Entry::VARIABLE_SEC;
+ }
+ else
+ {
+ //printf("Scanner.l: found prototype\n");
+ current->section = Entry::FUNCTION_SEC;
+ current->proto = TRUE;
+ }
+ }
+ //printf("Adding entry `%s'\n",current->name.data());
+ if ( insidePHP)
+ {
+ if (findAndRemoveWord(current->type,"final"))
+ {
+ current->spec |= Entry::Final;
+ }
+ if (findAndRemoveWord(current->type,"abstract"))
+ {
+ current->spec |= Entry::Abstract;
+ }
+ }
+ if ( insidePHP && !containsWord(current->type,"function"))
+ {
+ initEntry();
+ if ( *yytext == '{' )
+ {
+ lastCurlyContext = FindMembers;
+ curlyCount=0;
+ BEGIN( SkipCurly );
+ }
+ else
+ {
+ BEGIN( FindMembers );
+ }
+ }
+ else
+ {
+ if ( insidePHP)
+ {
+ findAndRemoveWord(current->type,"function");
+ }
+ previous = current;
+ current_root->addSubEntry(current);
+ current = new Entry ;
+ initEntry();
+ // Objective C 2.0: Required/Optional section
+ if (previous->spec & (Entry::Optional | Entry::Required))
+ {
+ current->spec |= previous->spec & (Entry::Optional|Entry::Required);
+ }
+ lastCurlyContext = FindMembers;
+ if ( *yytext == ',' )
+ {
+ current->type = previous->type.data();
+ }
+ if ( *yytext == '{' )
+ {
+ if ( !insidePHP && (current_root->section & Entry::COMPOUND_MASK) )
+ {
+ previous->spec |= Entry::Inline;
+ }
+ //addToBody(yytext);
+ curlyCount=0;
+ BEGIN( SkipCurly ) ;
+ }
+ else
+ {
+ if (previous->section!=Entry::VARIABLE_SEC)
+ previous->bodyLine=-1; // a function/member declaration
+ BEGIN( FindMembers ) ;
+ }
+ }
+ }
+<SkipInits>"{" {
+ //addToBody(yytext);
+ //lastCurlyContext = FindMembers;
+ //curlyCount=0;
+ //BEGIN( SkipCurly ) ;
+ unput('{');
+ BEGIN( Function );
+ }
+<SkipCurly>"{" {
+ //addToBody(yytext);
+ ++curlyCount ;
+ }
+<SkipCurly>"}" {
+ //addToBody(yytext);
+ if( curlyCount )
+ {
+ --curlyCount ;
+ }
+ else
+ {
+#if 0
+ if (!Config_getBool("HIDE_IN_BODY_DOCS") &&
+ !current->doc.isEmpty())
+ {
+ // copy documentation found inside the body
+ // to the previous item
+ if (previous->inbodyLine==-1)
+ {
+ previous->inbodyLine = current->docLine;
+ previous->inbodyFile = current->docFile;
+ }
+ //printf("*** inbodyDocs+=%s\n",current->doc.data());
+ previous->inbodyDocs += current->doc;
+ current->doc.resize(0);
+ }
+#endif
+ if (current->sli && previous) // copy special list items
+ {
+ QListIterator<ListItemInfo> li(*current->sli);
+ ListItemInfo *lii;
+ for (li.toFirst();(lii=li.current());++li)
+ {
+ previous->addSpecialListItem(lii->type,lii->itemId);
+ }
+ delete current->sli;
+ current->sli = 0;
+ }
+ if (previous) previous->endBodyLine=yyLineNr;
+ BEGIN( lastCurlyContext ) ;
+ }
+ }
+<SkipCurly>"}"{BN}*("/*!"|"/**"|"//!"|"///")"<" {
+ lineCount();
+ if ( curlyCount )
+ {
+ //addToBody(yytext);
+ --curlyCount ;
+ }
+ else
+ {
+ current->endBodyLine=yyLineNr;
+
+ tempEntry = current; // temporarily switch to the previous entry
+ current = previous;
+
+ docBlockContext = SkipCurlyEndDoc;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = '}';
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+ }
+<SkipCurlyEndDoc>"}"{BN}*("/*!"|"/**"|"//!"|"///")"<" { // desc is followed by another one
+ docBlockContext = SkipCurlyEndDoc;
+ docBlockInBody = FALSE;
+ docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
+ ( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
+ docBlock.resize(0);
+ docBlockTerm = '}';
+ if (yytext[yyleng-3]=='/')
+ {
+ startCommentBlock(TRUE);
+ BEGIN( DocLine );
+ }
+ else
+ {
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+ }
+<SkipCurlyEndDoc>"}" {
+ //addToBody("}");
+ current = tempEntry;
+ BEGIN( lastCurlyContext );
+ }
+<SkipCurly>\" {
+ //addToBody(yytext);
+ lastStringContext=SkipCurly;
+ BEGIN( SkipString );
+ }
+<SkipCurly>^{B}*"#" {
+ if (insidePHP)
+ REJECT;
+ //addToBody(yytext);
+ BEGIN( SkipCurlyCpp );
+ }
+<SkipCurly,SkipInits>\n {
+ yyLineNr++;
+ //addToBody(yytext);
+ }
+<SkipCurly,SkipCurlyCpp>[^\n#"'@\\/{}]+ {
+ //addToBody(yytext);
+ }
+<SkipCurlyCpp>\n {
+ //addToBody(yytext);
+ yyLineNr++;
+ lastCurlyContext = FindMembers;
+ BEGIN( SkipCurly );
+ }
+<SkipCurlyCpp>\\[\r]*"\n"[\r]* {
+ //addToBody(yytext);
+ yyLineNr++;
+ }
+<SkipInits,SkipCurly,SkipCurlyCpp>"/*" {
+ //addToBody(yytext);
+ lastCContext = YY_START;
+ BEGIN(SkipComment);
+ }
+<SkipInits,SkipCurly,SkipCurlyCpp>"//" {
+ //addToBody(yytext);
+ lastCContext = YY_START;
+ BEGIN(SkipCxxComment);
+ }
+<SkipInits>\" {
+ lastStringContext=YY_START;
+ BEGIN( SkipString );
+ }
+<SkipInits>; {
+ warn(yyFileName,yyLineNr,
+ "warning: Found ';' while parsing initializer list! "
+ "(doxygen could be confused by a macro call without semicolon)"
+ );
+ BEGIN( FindMembers );
+ }
+<SkipInits,SkipCurly,SkipCurlyCpp>"#" {
+ if (!insidePHP)
+ REJECT;
+ //addToBody(yytext);
+ lastCContext = YY_START;
+ BEGIN(SkipCxxComment);
+ }
+<SkipInits,SkipCurly,SkipCurlyCpp>@\" {
+ if (!insideCS) REJECT;
+ // C# verbatim string
+ lastSkipVerbStringContext=YY_START;
+ pSkipVerbString=&current->initializer;
+ BEGIN(SkipVerbString);
+ }
+<SkipInits,SkipCurly,SkipCurlyCpp>{CHARLIT} {
+ if (insidePHP) REJECT;
+ }
+<SkipInits,SkipCurly,SkipCurlyCpp>\' {
+ if (insidePHP)
+ {
+ lastStringContext=YY_START;
+ BEGIN(SkipPHPString);
+ }
+ }
+<SkipInits,SkipCurly,SkipCurlyCpp>. { }
+<SkipString,SkipPHPString>\\. { }
+<SkipString>\" {
+ BEGIN( lastStringContext );
+ }
+<SkipPHPString>\' {
+ BEGIN( lastStringContext );
+ }
+<SkipString,SkipPHPString>"/*"|"*/"|"//" { }
+<SkipString,SkipPHPString>\n {
+ yyLineNr++;
+ }
+<SkipString,SkipPHPString>. { }
+<CompoundName>":" { // for "class : public base {} var;" construct, see bug 608359
+ unput(':');
+ BEGIN(ClassVar);
+ }
+<Bases,CompoundName>";" {
+ current->section = Entry::EMPTY_SEC ;
+ current->type.resize(0) ;
+ current->name.resize(0) ;
+ current->args.resize(0) ;
+ current->argList->clear();
+ BEGIN( FindMembers ) ;
+ }
+<CompoundName>{SCOPENAME}{BN}*/"<" {
+ sharpCount = 0;
+ current->name = yytext ;
+ if (current->spec & Entry::Protocol)
+ {
+ current->name+="-p";
+ }
+ lineCount();
+ lastClassTemplSpecContext = ClassVar;
+ if (insideObjC) // protocol list
+ {
+ BEGIN( ObjCProtocolList );
+ }
+ else if (insideCS) // C# generic class
+ {
+ current->name+="-g";
+ BEGIN( CSGeneric );
+ }
+ else // C++ template specialization
+ {
+ roundCount=0;
+ BEGIN( ClassTemplSpec );
+ }
+ }
+<CSGeneric>"<" {
+ if (current->tArgLists==0)
+ {
+ current->tArgLists = new QList<ArgumentList>;
+ current->tArgLists->setAutoDelete(TRUE);
+ }
+ ArgumentList *al = new ArgumentList;
+ // check bug 612858 before enabling the next line
+ //current->spec |= Entry::Template;
+ current->tArgLists->append(al);
+ currentArgumentList = al;
+ templateStr="<";
+ //current->name += "<";
+ fullArgString = templateStr;
+ //copyArgString = &current->name;
+ copyArgString = &templateStr;
+ currentArgumentContext = ClassVar;
+ BEGIN( ReadTempArgs );
+ }
+<ObjCProtocolList>"<" {
+ insideProtocolList=TRUE;
+ BEGIN( Bases );
+ }
+<ClassTemplSpec>">"({BN}*"::"{BN}*{SCOPENAME})? {
+ current->name += yytext;
+ lineCount();
+ if (--sharpCount<=0)
+ {
+ current->name = removeRedundantWhiteSpace(current->name);
+ if (current->spec & Entry::Protocol)
+ { // Objective-C protocol
+ unput('{'); // fake start of body
+ BEGIN( ClassVar );
+ }
+ else
+ {
+ BEGIN( lastClassTemplSpecContext );
+ }
+ }
+ }
+<ClassTemplSpec>"<" {
+ current->name += yytext;
+ sharpCount++;
+ }
+<ClassTemplSpec>. {
+ current->name += yytext;
+ }
+<CompoundName>{SCOPENAME}{BN}*";" { // forward declaration
+ unput(';');
+ current->reset();
+ if (isTypedef) // typedef of a class, put typedef keyword back
+ {
+ current->type.prepend("typedef");
+ }
+ BEGIN( FindMembers );
+ }
+<CompoundName>{SCOPENAME}/"(" {
+ current->name = yytext ;
+ lineCount();
+ if (current->spec & Entry::Protocol)
+ {
+ current->name += "-p";
+ }
+ BEGIN( ClassVar );
+ }
+<CompoundName>{SCOPENAME}/{BN}*"," { // multiple forward declarations on one line
+ // e.g. @protocol A,B;
+ current->reset();
+ }
+<CompoundName>{SCOPENAME} {
+ current->name = yytext ;
+ lineCount();
+ if (current->spec & Entry::Protocol)
+ {
+ current->name += "-p";
+ }
+ if ((current->spec & Entry::Protocol) ||
+ current->section == Entry::OBJCIMPL_SEC)
+ {
+ unput('{'); // fake start of body
+ }
+ BEGIN( ClassVar );
+ }
+<CompoundName>{CSSCOPENAME} { // C# style scope
+ current->name = substitute(yytext,".","::");
+ lineCount();
+ BEGIN( ClassVar );
+ }
+<ClassVar>{SCOPENAME}{BN}*/"(" {
+ if (insideIDL && strncmp(yytext,"switch",6)==0 && !isId(yytext[6]))
+ {
+ // Corba IDL style union
+ roundCount=0;
+ BEGIN(SkipUnionSwitch);
+ }
+ else
+ {
+ addType(current);
+ current->name = yytext;
+ current->name = current->name.stripWhiteSpace();
+ lineCount();
+ BEGIN( FindMembers );
+ }
+ }
+<ClassVar>"," {
+ if (isTypedef)
+ {
+ // multiple types in one typedef
+ unput(',');
+ current->type.prepend("typedef ");
+ BEGIN(FindMembers);
+ }
+ else
+ {
+ // Multiple class forward declaration
+ }
+ }
+<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") {
+ if (insideCli)
+ {
+ if (yytext[0]=='s') // sealed
+ current->spec |= Entry::SealedClass;
+ else // abstract
+ current->spec |= Entry::AbstractClass;
+ BEGIN( ClassVar );
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<ClassVar>{ID} {
+ if (insideIDL && strcmp(yytext,"switch")==0)
+ {
+ // Corba IDL style union
+ roundCount=0;
+ BEGIN(SkipUnionSwitch);
+ }
+ else if ((insideJava || insidePHP || insideJS) && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0))
+ {
+ current->type.resize(0);
+ baseProt=Public;
+ baseVirt=Normal;
+ baseName.resize(0);
+ BEGIN( BasesProt ) ;
+ }
+ else if (insideCS && strcmp(yytext,"where")==0) // C# type contraint
+ {
+ delete current->typeConstr;
+ current->typeConstr = new ArgumentList;
+ current->typeConstr->append(new Argument);
+ lastCSConstraint = YY_START;
+ BEGIN( CSConstraintName );
+ }
+ else if (insideCli && strcmp(yytext,"abstract"))
+ {
+ current->spec|=Entry::Abstract;
+ }
+ else if (insideCli && strcmp(yytext,"sealed"))
+ {
+ current->spec|=Entry::Sealed;
+ }
+ else
+ {
+ if (current->section == Entry::ENUM_SEC)
+ { // found "enum a b" -> variable
+ current->section = Entry::VARIABLE_SEC ;
+ }
+ current->type += ' ' ;
+ current->type += current->name ;
+ current->name = yytext ;
+
+ if (nameIsOperator(current->name))
+ {
+ BEGIN( Operator );
+ }
+ }
+ }
+<ClassVar>[(\[] {
+ if (insideObjC && *yytext=='(') // class category
+ {
+ current->name+='(';
+ if (current->section!=Entry::OBJCIMPL_SEC)
+ {
+ current->spec|=Entry::Category;
+ }
+ BEGIN( ClassCategory );
+ }
+ else
+ {
+ // probably a function anyway
+ unput(*yytext);
+ BEGIN( FindMembers );
+ }
+ }
+<CSConstraintType,CSConstraintName>"/**/" { /* empty comment */ }
+<CSConstraintType,CSConstraintName>("/*"[*!]|"//"[/!])("<"?) { // special comment
+ fullArgString.resize(0);
+ lastCopyArgChar='#'; // end marker
+ lastCommentInArgContext=YY_START;
+ if (yytext[1]=='/')
+ BEGIN( CopyArgCommentLine );
+ else
+ BEGIN( CopyArgComment );
+ }
+<CSConstraintType,CSConstraintName>"#" { // artificially inserted token to signal end of comment block
+ current->typeConstr->last()->docs = fullArgString;
+ }
+<CSConstraintType>"{" { // end of type constraint reached
+ // parse documentation of the constraints
+ handleParametersCommentBlocks(current->typeConstr);
+ unput('{');
+ BEGIN( lastCSConstraint );
+ }
+<CSConstraintType,CSConstraintName>";" {
+ handleParametersCommentBlocks(current->typeConstr);
+ unput(';');
+ BEGIN( lastCSConstraint );
+ }
+<CSConstraintName>":" {
+ BEGIN( CSConstraintType );
+ }
+<CSConstraintName>{ID} {
+ // parameter name
+ current->typeConstr->last()->name=yytext;
+ }
+<CSConstraintType>"where" { // another constraint for a different param
+ current->typeConstr->append(new Argument);
+ BEGIN( CSConstraintName );
+ }
+<CSConstraintType>({ID}".")*{ID}("<"{ID}">")?("()")? {
+ if (current->typeConstr->last()->type.isEmpty())
+ // first type constraint for this parameter
+ {
+ current->typeConstr->last()->type=yytext;
+ }
+ else // new type constraint for same parameter
+ {
+ QCString name = current->typeConstr->last()->name;
+ current->typeConstr->append(new Argument);
+ current->typeConstr->last()->name=name;
+ current->typeConstr->last()->type=yytext;
+ }
+ }
+<CSConstraintName,CSConstraintType>\n {
+ yyLineNr++;
+ }
+<CSConstraintName,CSConstraintType>. {
+ }
+<ClassCategory>{ID} {
+ current->name+=yytext;
+ }
+<ClassCategory>")" {
+ current->name+=')';
+ if ((current->section & Entry::Protocol) ||
+ current->section == Entry::OBJCIMPL_SEC)
+ {
+ unput('{'); // fake start of body
+ }
+ else // category has no variables so push back an empty body
+ {
+ unput('}');
+ unput('{');
+ }
+ BEGIN( ClassVar );
+ }
+<ClassVar>":" {
+ if (current->section == Entry::VARIABLE_SEC) // enum a b:2, see bug 313527
+ {
+ BEGIN(BitFields);
+ current->bitfields+=":";
+ }
+ else
+ {
+ current->type.resize(0);
+ if ((current->spec & Entry::Interface) ||
+ (current->spec & Entry::Struct) ||
+ (current->spec & Entry::Ref) ||
+ (current->spec & Entry::Value) ||
+ insidePHP || insideCS || insideD || insideObjC
+ )
+ baseProt=Public;
+ else
+ baseProt=Private;
+ baseVirt=Normal;
+ baseName.resize(0);
+ BEGIN( BasesProt ) ;
+ }
+ }
+<ClassVar>[;=*&] {
+ unput(*yytext);
+ if (isTypedef) // typedef of a class, put typedef keyword back
+ {
+ current->type.prepend("typedef");
+ }
+ if ((yytext[0]=='*' || yytext[0]=='&') &&
+ current->section == Entry::ENUM_SEC)
+ { // found "enum a *b" -> variable
+ current->section = Entry::VARIABLE_SEC ;
+ }
+ BEGIN( FindMembers );
+ }
+<Bases,ClassVar>"///"/[^/] {
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ lineCount();
+ current->program+=yytext;
+ current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ curlyCount=0;
+ BEGIN( ReadBodyIntf );
+ }
+ }
+<Bases,ClassVar>("//"{B}*)?"/**"/[^/*] |
+<Bases,ClassVar>("//"{B}*)?"/*!" |
+<Bases,ClassVar>"//!" |
+<Bases,ClassVar>[\-+]{BN}* {
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ lineCount();
+ current->program+=yytext;
+ current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ curlyCount=0;
+ BEGIN( ReadBodyIntf );
+ }
+ }
+<CompoundName,ClassVar>{B}*"{"{B}* {
+ current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ current->name = removeRedundantWhiteSpace(current->name);
+ if (current->name.isEmpty() && !isTypedef) // anonymous compound
+ {
+ if (current->section==Entry::NAMESPACE_SEC) // allow reopening of anonymous namespaces
+ {
+ if (Config_getBool("EXTRACT_ANON_NSPACES")) // use visible name
+ {
+ current->name="anonymous_namespace{"+stripPath(current->fileName)+"}";
+ }
+ else // use invisible name
+ {
+ current->name.sprintf("@%d",anonNSCount);
+ }
+ }
+ else
+ {
+ current->name.sprintf("@%d",anonCount++);
+ }
+ }
+ curlyCount=0;
+ if (current_root && // not a nested struct inside an @interface section
+ !(current_root->spec & Entry::Interface) &&
+ ((current->spec & (Entry::Interface | Entry::Protocol | Entry::Category) ||
+ current->section==Entry::OBJCIMPL_SEC)
+ ) &&
+ insideObjC
+ )
+ { // ObjC body that ends with @end
+ BEGIN( ReadBodyIntf );
+ }
+ else if (current->section==Entry::NAMESPACE_SEC)
+ { // namespace body
+ BEGIN( ReadNSBody );
+ }
+ else
+ { // class body
+ BEGIN( ReadBody ) ;
+ }
+ }
+<BasesProt>"virtual"{BN}+ { lineCount(); baseVirt = Virtual; }
+<BasesProt>"public"{BN}+ { lineCount(); baseProt = Public; }
+<BasesProt>"protected"{BN}+ { lineCount(); baseProt = Protected; }
+<BasesProt>"private"{BN}+ { lineCount(); baseProt = Private; }
+<BasesProt>{BN} { lineCount(); }
+<BasesProt>. { unput(*yytext); BEGIN(Bases); }
+<Bases>("\\")?({ID}"\\")*{ID} { // PHP namespace token, not sure if interspacing is allowed but it gives problems (see bug 640847)
+ if (!insidePHP)
+ {
+ REJECT;
+ }
+ else // PHP base class of the form \Ns\Cl or Ns\Cl
+ {
+ lineCount();
+ QCString bn=yytext;
+ bn = substitute(bn,"\\","::");
+ baseName += bn;
+ current->args += ' ';
+ current->args += yytext;
+ }
+ }
+<Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID} {
+ lineCount();
+ QCString baseScope = yytext;
+ if (insideCS && baseScope.stripWhiteSpace()=="where")
+ {
+ // type contraint for a class
+ delete current->typeConstr;
+ current->typeConstr = new ArgumentList;
+ current->typeConstr->append(new Argument);
+ lastCSConstraint = YY_START;
+ BEGIN( CSConstraintName );
+ }
+ else
+ {
+ baseName+=yytext;
+ current->args += ' ';
+ current->args += yytext;
+ }
+ }
+<Bases>{BN}*{ID}("."{ID})* { // Java style class
+ QCString name = substitute(yytext,".","::");
+ baseName += name;
+ current->args += ' ';
+ current->args += name;
+ }
+<ClassVar,Bases>\n/{BN}*[^{, \t\n] {
+ if (!insideObjC)
+ {
+ REJECT;
+ }
+ else
+ {
+ yyLineNr++;
+ unput('{');
+ }
+ }
+<ClassVar,Bases>"@end" { // empty ObjC interface
+ unput('d'); // insert fake body: {}@end
+ unput('n');
+ unput('e');
+ unput('@');
+ unput('}');
+ unput('{');
+ }
+<ClassVar>"<" { current->name += *yytext;
+ sharpCount=1;
+ roundCount=0;
+ lastSkipSharpContext = YY_START;
+ specName = &current->name;
+ BEGIN ( Specialization );
+ }
+<Bases>"<" {
+ sharpCount=1;
+ roundCount=0;
+ lastSkipSharpContext = YY_START;
+ if (insideObjC) // start of protocol list
+ {
+ unput(',');
+ }
+ else // template specialization
+ {
+ //if (insideCS) // generic
+ //{
+ // baseName+="-g";
+ //}
+ templateStr = yytext;
+ specName = &templateStr;
+ BEGIN ( Specialization );
+ }
+ }
+<Specialization>"<" { *specName += *yytext;
+ if (roundCount==0) sharpCount++;
+ }
+<Specialization>">" {
+ *specName += *yytext;
+ if (roundCount==0 && --sharpCount<=0)
+ {
+ if (1 /*!insideCS*/)
+ {
+ baseName+=*specName;
+ }
+ else
+ {
+ if (current->tArgLists==0)
+ {
+ current->tArgLists = new QList<ArgumentList>;
+ current->tArgLists->setAutoDelete(TRUE);
+ }
+ ArgumentList *al = new ArgumentList;
+ current->tArgLists->append(al);
+ stringToArgumentList(*specName,al);
+ }
+ BEGIN(lastSkipSharpContext);
+ }
+ }
+<Specialization>{BN}+ { lineCount(); *specName +=' '; }
+<Specialization>"<<" { *specName += yytext; }
+<Specialization>">>"/{B}*"::" { // M$ C++ extension to allow >> to close a template...
+ unput('>');
+ unput(' ');
+ unput('>');
+ }
+<Specialization>">>" {
+ if (insideCS) // for C# >> ends a nested template
+ {
+ REJECT;
+ }
+ else // for C++ >> is a bitshift
+ // operator and > > would end
+ // a nested template.
+ // We require the bitshift to be enclosed in braces.
+ // See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
+ {
+ if (roundCount>0)
+ {
+ *specName += yytext;
+ }
+ else
+ {
+ unput('>');
+ unput(' ');
+ unput('>');
+ }
+ }
+ }
+<Specialization>"typename"{BN}+ { lineCount(); }
+<Specialization>"(" { *specName += *yytext; roundCount++; }
+<Specialization>")" { *specName += *yytext; roundCount--; }
+<Specialization>. {
+ *specName += *yytext;
+ }
+<SkipSharp>"<" { ++sharpCount; }
+<SkipSharp>">" { if (--sharpCount<=0)
+ BEGIN ( lastSkipSharpContext );
+ }
+<SkipRound>"(" { ++roundCount; }
+<SkipRound>")" { if (--roundCount<=0)
+ BEGIN ( lastSkipRoundContext );
+ }
+<SkipRound>\" {
+ lastStringContext=SkipRound;
+ BEGIN(SkipString);
+ }
+<Bases>","|(">"({BN}*"{")?)|({BN}+"implements"{BN}*) { lineCount();
+ if (insideProtocolList)
+ {
+ baseName+="-p";
+ }
+ else
+ {
+ current->args += ',' ;
+ }
+ current->name = removeRedundantWhiteSpace(current->name);
+ if (!baseName.isEmpty())
+ {
+ current->extends->append(
+ new BaseInfo(baseName,baseProt,baseVirt)
+ );
+ }
+ if ((current->spec & Entry::Interface) ||
+ insideJava || insidePHP || insideCS ||
+ insideD || insideObjC)
+ {
+ baseProt=Public;
+ }
+ else
+ {
+ baseProt=Private;
+ }
+ baseVirt=Normal;
+ baseName.resize(0);
+ if (*yytext=='>')
+ { // end of a ObjC protocol list
+ insideProtocolList=FALSE;
+ if (yyleng==1)
+ {
+ unput('{'); // dummy start body
+ }
+ else
+ {
+ yyless(1);
+ }
+ }
+ else
+ {
+ if (*yytext==',' && insideObjC) // Begin of protocol list
+ {
+ insideProtocolList=TRUE;
+ }
+ BEGIN(BasesProt);
+ }
+ }
+<Bases>{B}*"{"{B}* { current->fileName = yyFileName ;
+ current->startLine = yyLineNr ;
+ current->name = removeRedundantWhiteSpace(current->name);
+ if (!baseName.isEmpty())
+ current->extends->append(
+ new BaseInfo(baseName,baseProt,baseVirt)
+ );
+ curlyCount=0;
+ if (insideObjC)
+ {
+ BEGIN( ReadBodyIntf );
+ }
+ else
+ {
+ BEGIN( ReadBody ) ;
+ }
+ }
+<SkipUnionSwitch>{B}*"(" {
+ roundCount++;
+ }
+<SkipUnionSwitch>")" {
+ if (--roundCount==0)
+ {
+ BEGIN(ClassVar);
+ }
+ }
+<SkipUnionSwitch>\n { yyLineNr++; }
+<SkipUnionSwitch>.
+<Comment>{BN}+ { current->program += yytext ;
+ lineCount() ;
+ }
+<Comment>"/*" { current->program += yytext ; }
+<Comment>"//" { current->program += yytext ; }
+<Comment>{CMD}("code"|"verbatim") {
+ insideCode=TRUE;
+ current->program += yytext ;
+ }
+<Comment>{CMD}("endcode"|"endverbatim") {
+ insideCode=FALSE;
+ current->program += yytext ;
+ }
+<Comment>[^ \.\t\r\n\/\*]+ { current->program += yytext ; }
+<Comment>"*/" { current->program += yytext ;
+ if (!insideCode) BEGIN( lastContext ) ;
+ }
+<Comment>. { current->program += *yytext ; }
+
+<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>("//"{B}*)?"/*!" {
+ //printf("Start doc block at %d\n",yyLineNr);
+ removeSlashes=(yytext[1]=='/');
+ tmpDocType=-1;
+ if (!current->doc.isEmpty())
+ {
+ current->doc+="\n\n";
+ }
+ else
+ {
+ current->docLine = yyLineNr;
+ current->docFile = yyFileName;
+ }
+
+ lastDocContext = YY_START;
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ current->inside = current_root->name+"::";
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = YY_START==SkipCurly;
+ docBlockAutoBrief = Config_getBool("QT_AUTOBRIEF");
+ docBlock.resize(0);
+ if (docBlockAutoBrief)
+ {
+ current->briefLine = yyLineNr;
+ current->briefFile = yyFileName;
+ }
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>("//"{B}*)?"/**"/[^/*] {
+ removeSlashes=(yytext[1]=='/');
+ lastDocContext = YY_START;
+
+ //printf("Found comment block at %s:%d\n",yyFileName,yyLineNr);
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ current->inside = current_root->name+"::";
+ }
+ current->docLine = yyLineNr;
+ current->docFile = yyFileName;
+ docBlockContext = YY_START;
+ docBlockInBody = YY_START==SkipCurly;
+ docBlockAutoBrief = Config_getBool("JAVADOC_AUTOBRIEF");
+ docBlock.resize(0);
+ if (docBlockAutoBrief)
+ {
+ current->briefLine = yyLineNr;
+ current->briefFile = yyFileName;
+ }
+ startCommentBlock(FALSE);
+ BEGIN( DocBlock );
+ }
+<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"//!" {
+ tmpDocType=-1;
+ lastDocContext = YY_START;
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ current->inside = current_root->name+"::";
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = YY_START==SkipCurly;
+ docBlockAutoBrief = FALSE;
+ docBlock.resize(0);
+ startCommentBlock(current->brief.isEmpty());
+ BEGIN( DocLine );
+ }
+<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"///"/[^/] {
+ tmpDocType=-1;
+ lastDocContext = YY_START;
+ if (current_root->section & Entry::SCOPE_MASK)
+ {
+ current->inside = current_root->name+"::";
+ }
+ docBlockContext = YY_START;
+ docBlockInBody = YY_START==SkipCurly;
+ docBlockAutoBrief = FALSE;
+ docBlock.resize(0);
+ startCommentBlock(current->brief.isEmpty());
+ BEGIN( DocLine );
+ }
+<FindMembers>"extern"{BN}*"\"C"("++")?"\""{BN}*("{")? {
+ lineCount();
+ externC=TRUE;
+ }
+<FindMembers>"{" {
+ if (externC)
+ {
+ externC=FALSE;
+ }
+ else if (insideCS &&
+ !current->name.isEmpty() &&
+ !current->type.isEmpty())
+ {
+ if (containsWord(current->type,"event")) // event
+ {
+ current->mtype = mtype = Event;
+ }
+ else // property
+ {
+ current->mtype = mtype = Property;
+ }
+ current->bodyLine = yyLineNr;
+ curlyCount=0;
+ BEGIN( CSAccessorDecl );
+ }
+ else
+ {
+ if ((insideJava || insideCS || insideD) &&
+ current->name.isEmpty()
+ )
+ {
+ // static Java initializer
+ needsSemi = FALSE;
+ if (current->stat)
+ {
+ current->name="[static initializer]";
+ current->type.resize(0);
+ }
+ else
+ {
+ current->name="[instance initializer]";
+ }
+ unput(*yytext);
+ BEGIN( Function );
+ }
+ else
+ {
+ needsSemi = TRUE;
+ current->type.resize(0);
+ current->name.resize(0);
+ current->args.resize(0);
+ current->argList->clear();
+ curlyCount=0;
+ BEGIN( SkipCurlyBlock );
+ }
+ }
+ }
+<CSAccessorDecl>"{" { curlyCount++; }
+<CSAccessorDecl>"}" {
+ if (curlyCount)
+ {
+ curlyCount--;
+ }
+ else
+ {
+ mtype = Method;
+ unput(';');
+ BEGIN(FindMembers);
+ }
+ }
+<CSAccessorDecl>"set" { if (curlyCount==0) current->spec |= Entry::Settable; }
+<CSAccessorDecl>"get" { if (curlyCount==0) current->spec |= Entry::Gettable; }
+<CSAccessorDecl>"add" { if (curlyCount==0) current->spec |= Entry::Addable; }
+<CSAccessorDecl>"remove" { if (curlyCount==0) current->spec |= Entry::Removable; }
+<CSAccessorDecl>"raise" { if (curlyCount==0) current->spec |= Entry::Raisable; }
+<CSAccessorDecl>. {}
+<CSAccessorDecl>\n { yyLineNr++; }
+
+
+
+
+ /**********************************************************************************/
+ /******************** Documentation block related rules ***************************/
+ /**********************************************************************************/
+
+ /* ---- Single line comments ------ */
+<DocLine>[^\n]*"\n"[ \t]*"//"[/!] { // continuation of multiline C++-style comment
+ docBlock+=yytext;
+ docBlock.resize(docBlock.length() - 3);
+ yyLineNr++;
+ }
+<DocLine>[^\n]*/"\n" { // whole line
+ docBlock+=yytext;
+ handleCommentBlock(docBlock.data(),current->brief.isEmpty());
+ BEGIN( docBlockContext );
+ }
+
+ /* ---- Comments blocks ------ */
+
+<DocBlock>"*"*"*/" { // end of comment block
+ handleCommentBlock(docBlock.data(),FALSE);
+ BEGIN(docBlockContext);
+ }
+<DocBlock>^{B}*("//")?{B}*"*"+/[^//] { // start of a comment line
+ }
+<DocBlock>^{B}*("//"){B}* { // strip embedded C++ comments if at the start of a line
+ }
+<DocBlock>"//" { // slashes in the middle of a comment block
+ docBlock+=yytext;
+ }
+<DocBlock>"/*" { // start of a new comment in the
+ // middle of a comment block
+ docBlock+=yytext;
+ }
+<DocBlock>("@@"|"\\\\"){ID}/[^a-z_A-Z0-9] { // escaped command
+ docBlock+=yytext;
+ }
+<DocBlock>{CMD}("f$"|"f["|"f{") {
+ docBlock+=yytext;
+ docBlockName=&yytext[1];
+ if (docBlockName.at(1)=='{')
+ {
+ docBlockName.at(1)='}';
+ }
+ BEGIN(DocCopyBlock);
+ }
+<DocBlock>"<"{PRE}">" {
+ docBlock+=yytext;
+ docBlockName="<pre>";
+ BEGIN(DocCopyBlock);
+ }
+<DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9] { // verbatim command (which could contain nested comments!)
+ docBlock+=yytext;
+ docBlockName=&yytext[1];
+ BEGIN(DocCopyBlock);
+ }
+<DocBlock>{B}*"<code>" {
+ if (insideCS)
+ {
+ docBlock+=yytext;
+ docBlockName="<code>";
+ BEGIN(DocCopyBlock);
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<DocBlock>[^@*\/\\\n]+ { // any character that isn't special
+ docBlock+=yytext;
+ }
+<DocBlock>\n { // newline
+ yyLineNr++;
+ docBlock+=*yytext;
+ }
+<DocBlock>. { // command block
+ docBlock+=*yytext;
+ }
+
+ /* ---- Copy verbatim sections ------ */
+
+<DocCopyBlock>"</"{PRE}">" { // end of a <pre> block
+ docBlock+=yytext;
+ if (docBlockName=="<pre>")
+ {
+ BEGIN(DocBlock);
+ }
+ }
+<DocCopyBlock>"</"{CODE}">" { // end of a <code> block
+ docBlock+=yytext;
+ if (docBlockName=="<code>")
+ {
+ BEGIN(DocBlock);
+ }
+ }
+<DocCopyBlock>[\\@]("f$"|"f]"|"f}") {
+ docBlock+=yytext;
+ BEGIN(DocBlock);
+ }
+<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endmanonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block
+ docBlock+=yytext;
+ if (&yytext[4]==docBlockName)
+ {
+ BEGIN(DocBlock);
+ }
+ }
+<DocCopyBlock>^{B}*"*"+/{BN}+ { // start of a comment line
+ if (docBlockName=="verbatim")
+ {
+ REJECT;
+ }
+ }
+<DocCopyBlock>[^\<@/*\]\$\\\n]+ { // any character that is not special
+ docBlock+=yytext;
+ }
+<DocCopyBlock>"/*"|"*/"|"//" {
+ docBlock+=yytext;
+ }
+<DocCopyBlock>\n { // newline
+ docBlock+=*yytext;
+ yyLineNr++;
+ }
+<DocCopyBlock>. { // any other character
+ docBlock+=*yytext;
+ }
+<DocCopyBlock><<EOF>> {
+ warn(yyFileName,yyLineNr,
+ "warning: reached end of file while inside a %s block!\n"
+ "The command that should end the block seems to be missing!\n",
+ docBlockName.data());
+ yyterminate();
+ }
+
+
+ /* ------------- Prototype parser -------------- */
+
+<Prototype>"operator"{B}*"("{B}*")" {
+ current->name+=yytext;
+ }
+<Prototype>"(" {
+ current->args+=*yytext;
+ currentArgumentContext = PrototypeQual;
+ fullArgString = current->args.copy();
+ copyArgString = &current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+<Prototype>"("({ID}"::")*({B}*[&*])+ {
+ current->type+=current->name+yytext;
+ current->name.resize(0);
+ BEGIN( PrototypePtr );
+ }
+<PrototypePtr>{SCOPENAME} {
+ current->name+=yytext;
+ }
+<PrototypePtr>"(" {
+ current->args+=*yytext;
+ currentArgumentContext = PrototypeQual;
+ fullArgString = current->args.copy();
+ copyArgString = &current->args;
+ BEGIN( ReadFuncArgType ) ;
+ }
+<PrototypePtr>")" {
+ current->type+=')';
+ BEGIN( Prototype );
+ }
+<PrototypePtr>. {
+ current->name+=yytext;
+ }
+<PrototypeQual>"{" {
+ BEGIN( PrototypeSkipLine);
+ }
+<PrototypeQual>{B}*"const"{B}* {
+ current->args += " const ";
+ current->argList->constSpecifier=TRUE;
+ }
+<PrototypeQual>{B}*"volatile"{B}* {
+ current->args += " volatile ";
+ current->argList->volatileSpecifier=TRUE;
+ }
+<PrototypeQual>{B}*"="{B}*"0"{B}* {
+ current->args += " = 0";
+ current->virt = Pure;
+ current->argList->pureSpecifier=TRUE;
+ }
+<PrototypeQual>"throw"{B}*"(" {
+ current->exception = "throw(";
+ BEGIN(PrototypeExc);
+ }
+<PrototypeExc>")" {
+ current->exception += ')';
+ BEGIN(PrototypeQual);
+ }
+<PrototypeExc>. {
+ current->exception += *yytext;
+ }
+<PrototypeQual>. {
+ current->args += *yytext;
+ }
+<Prototype>. {
+ current->name += *yytext;
+ }
+<PrototypeSkipLine>. {
+ }
+
+
+ /* ------------ Generic rules -------------- */
+
+
+<SkipCxxComment>.*"\\\n" { // line continuation
+ yyLineNr++;
+ }
+<SkipCxxComment>.*/\n {
+ BEGIN( lastCContext ) ;
+ }
+<SkipComment>[^\*\n]+
+<*>\n { yyLineNr++ ; }
+<*>\" {
+ if (insideIDL && insideCppQuote)
+ {
+ BEGIN(EndCppQuote);
+ }
+ }
+<*>"#" {
+ if (!insidePHP)
+ REJECT;
+ lastCContext = YY_START ;
+ BEGIN( SkipCxxComment ) ;
+ }
+<*>\' {
+ if (insidePHP)
+ {
+ lastStringContext=YY_START;
+ BEGIN(SkipPHPString);
+ }
+ }
+<*>\" {
+ if (insidePHP)
+ {
+ lastStringContext=YY_START;
+ BEGIN(SkipString);
+ }
+ }
+<*>.
+<SkipComment>"//"|"/*"
+<*>"/*" { lastCContext = YY_START ;
+ BEGIN( SkipComment ) ;
+ }
+<SkipComment>{B}*"*/" { BEGIN( lastCContext ) ; }
+<*>"//" {
+ lastCContext = YY_START ;
+ BEGIN( SkipCxxComment ) ;
+ }
+%%
+
+//----------------------------------------------------------------------------
+
+static void startCommentBlock(bool brief)
+{
+ if (brief)
+ {
+ current->briefFile = yyFileName;
+ current->briefLine = yyLineNr;
+ }
+ else
+ {
+ current->docFile = yyFileName;
+ current->docLine = yyLineNr;
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void newEntry()
+{
+ current_root->addSubEntry(current);
+ previous = current;
+ current = new Entry ;
+ initEntry();
+}
+
+static void handleCommentBlock(const QCString &doc,bool brief)
+{
+ static bool hideInBodyDocs = Config_getBool("HIDE_IN_BODY_DOCS");
+ int position=0;
+ bool needsEntry=FALSE;
+ if (docBlockInBody && hideInBodyDocs) return;
+ //printf("parseCommentBlock [%s] brief=%d\n",doc.data(),brief);
+ int lineNr = brief ? current->briefLine : current->docLine; // line of block start
+
+ // fill in inbodyFile && inbodyLine the first time, see bug 633891
+ Entry *docEntry = docBlockInBody && previous ? previous : current;
+ if (docBlockInBody && docEntry && docEntry->inbodyLine==-1)
+ {
+ docEntry->inbodyFile = yyFileName;
+ docEntry->inbodyLine = lineNr;
+ }
+
+ while (parseCommentBlock(
+ g_thisParser,
+ docBlockInBody && previous ? previous : current,
+ doc, // text
+ yyFileName, // file
+ lineNr, // line of block start
+ docBlockInBody ? FALSE : brief, // isBrief
+ docBlockInBody ? FALSE : docBlockAutoBrief, // isJavaDocStyle
+ docBlockInBody, // isInBody
+ protection,
+ position,
+ needsEntry
+ )
+ )
+ {
+ //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position);
+ if (needsEntry)
+ {
+ QCString docFile = current->docFile;
+ newEntry();
+ current->docFile = docFile;
+ current->docLine = lineNr;
+ }
+ }
+ if (needsEntry)
+ {
+ newEntry();
+ }
+
+ if (docBlockTerm)
+ {
+ unput(docBlockTerm);
+ docBlockTerm=0;
+ }
+}
+
+static void handleParametersCommentBlocks(ArgumentList *al)
+{
+ //printf(">>>>>>> handleParametersCommentBlocks()\n");
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ //printf(" Param %s docs=%s\n",a->name.data(),a->docs.data());
+ if (!a->docs.isEmpty())
+ {
+ int position=0;
+ bool needsEntry;
+
+ // save context
+ QCString orgDoc = current->doc;
+ QCString orgBrief = current->brief;
+ int orgDocLine = current->docLine;
+ int orgBriefLine = current->briefLine;
+
+ current->doc.resize(0);
+ current->brief.resize(0);
+
+ //printf("handleParametersCommentBlock [%s]\n",doc.data());
+ while (parseCommentBlock(
+ g_thisParser,
+ current,
+ a->docs, // text
+ yyFileName, // file
+ current->docLine, // line of block start
+ FALSE,
+ FALSE,
+ FALSE,
+ protection,
+ position,
+ needsEntry
+ )
+ )
+ {
+ //printf("handleParametersCommentBlock position=%d [%s]\n",position,doc.data()+position);
+ if (needsEntry) newEntry();
+ }
+ if (needsEntry)
+ {
+ newEntry();
+ }
+ a->docs = current->doc;
+
+ // restore context
+ current->doc = orgDoc;
+ current->brief = orgBrief;
+ current->docLine = orgDocLine;
+ current->briefLine = orgBriefLine;
+ }
+ }
+}
+
+
+//----------------------------------------------------------------------------
+
+static void parseCompounds(Entry *rt)
+{
+ //printf("parseCompounds(%s)\n",rt->name.data());
+ g_inputFromFile = FALSE;
+ EntryListIterator eli(*rt->children());
+ Entry *ce;
+ for (;(ce=eli.current());++eli)
+ {
+ if (!ce->program.isEmpty())
+ {
+ //printf("-- %s ---------\n%s\n---------------\n",
+ // ce->name.data(),ce->program.data());
+ // init scanner state
+ padCount=0;
+ //depthIf = 0;
+ inputString = ce->program;
+ inputPosition = 0;
+ scanYYrestart( scanYYin ) ;
+ if (ce->section==Entry::ENUM_SEC)
+ BEGIN( FindFields ) ;
+ else
+ BEGIN( FindMembers ) ;
+ current_root = ce ;
+ yyFileName = ce->fileName;
+ //setContext();
+ yyLineNr = ce->startLine ;
+ insideObjC = ce->lang==SrcLangExt_ObjC;
+ //printf("---> Inner block starts at line %d objC=%d\n",yyLineNr,insideObjC);
+ //current->reset();
+ if (current) delete current;
+ current = new Entry;
+ current->lang = language;
+ gstat = FALSE;
+ int ni=ce->name.findRev("::"); if (ni==-1) ni=0; else ni+=2;
+ // set default protection based on the compound type
+ if( ce->section==Entry::CLASS_SEC ) // class
+ {
+
+ if (insidePHP || insideD || insideJS)
+ {
+ current->protection = protection = Public ;
+ }
+ else if (insideJava)
+ {
+ current->protection = protection = Package ;
+ }
+ else if (ce->spec&(Entry::Interface | Entry::Ref | Entry::Value | Entry::Struct | Entry::Union))
+ {
+ if (ce->lang==SrcLangExt_ObjC)
+ {
+ current->protection = protection = Protected ;
+ }
+ else
+ {
+ current->protection = protection = Public ;
+ }
+ }
+ else
+ {
+ current->protection = protection = Private ;
+ }
+ }
+ else if (ce->section == Entry::ENUM_SEC ) // enum
+ {
+ current->protection = protection = ce->protection;
+ }
+ else if (!ce->name.isEmpty() && ce->name.at(ni)=='@') // unnamed union or namespace
+ {
+ if (ce->section == Entry::NAMESPACE_SEC ) // unnamed namespace
+ {
+ current->stat = gstat = TRUE;
+ }
+ current->protection = protection = ce->protection;
+ }
+ else // named struct, union, protocol, category
+ {
+ current->protection = protection = Public ;
+ }
+ mtype = Method;
+ virt = Normal;
+ //printf("name=%s current->stat=%d gstat=%d\n",ce->name.data(),current->stat,gstat);
+
+ //memberGroupId = DOX_NOGROUP;
+ //memberGroupRelates.resize(0);
+ //memberGroupInside.resize(0);
+ groupEnterCompound(yyFileName,yyLineNr,ce->name);
+
+ scanYYlex() ;
+ g_lexInit=TRUE;
+ //forceEndGroup();
+
+ groupLeaveCompound(yyFileName,yyLineNr,ce->name);
+
+ delete current; current=0;
+ ce->program.resize(0);
+
+
+ //if (depthIf>0)
+ //{
+ // warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
+ //}
+ }
+ parseCompounds(ce);
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+{
+ initParser();
+ //g_inputFromFile = TRUE;
+
+ inputString = fileBuf;
+ inputPosition = 0;
+ g_inputFromFile = FALSE;
+
+ //anonCount = 0; // don't reset per file
+ //depthIf = 0;
+ protection = Public;
+ mtype = Method;
+ gstat = FALSE;
+ virt = Normal;
+ current_root = rt;
+ global_root = rt;
+ inputFile.setName(fileName);
+ if (inputFile.open(IO_ReadOnly))
+ {
+ yyLineNr= 1 ;
+ yyFileName = fileName;
+ setContext();
+ rt->lang = language;
+ msg("Parsing file %s...\n",yyFileName.data());
+
+ current_root = rt ;
+ initParser();
+ groupEnterFile(yyFileName,yyLineNr);
+ current = new Entry;
+ //printf("current=%p current_root=%p\n",current,current_root);
+ int sec=guessSection(yyFileName);
+ if (sec)
+ {
+ current->name = yyFileName;
+ current->section = sec;
+ current_root->addSubEntry(current);
+ current = new Entry;
+ }
+ current->reset();
+ scanYYrestart( scanYYin );
+ if ( insidePHP )
+ {
+ BEGIN( FindMembersPHP );
+ }
+ else
+ {
+ BEGIN( FindMembers );
+ }
+
+ scanYYlex();
+ g_lexInit=TRUE;
+
+ if (YY_START==Comment)
+ {
+ warn(yyFileName,yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?");
+ }
+
+ //forceEndGroup();
+ groupLeaveFile(yyFileName,yyLineNr);
+
+ //if (depthIf>0)
+ //{
+ // warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
+ //}
+
+ rt->program.resize(0);
+ if (rt->children()->contains(current)==0)
+ // it could be that current is already added as a child to rt, so we
+ // only delete it if this is not the case. See bug 635317.
+ {
+ delete current; current=0;
+ }
+
+ parseCompounds(rt);
+
+ inputFile.close();
+
+ anonNSCount++;
+ }
+}
+
+//----------------------------------------------------------------------------
+
+static void parsePrototype(const QCString &text)
+{
+ //printf("**** parsePrototype(%s) begin\n",text.data());
+ if (text.isEmpty())
+ {
+ warn(yyFileName,yyLineNr,"Empty prototype found!");
+ return;
+ }
+
+ const char *orgInputString;
+ int orgInputPosition;
+ YY_BUFFER_STATE orgState;
+ bool orgInputFromFile;
+
+ // save scanner state
+ orgState = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer(yy_create_buffer(scanYYin, YY_BUF_SIZE));
+ orgInputString = inputString;
+ orgInputPosition = inputPosition;
+ orgInputFromFile = g_inputFromFile;
+
+ // set new string
+ inputString = text;
+ inputPosition = 0;
+ g_inputFromFile = FALSE;
+ scanYYrestart( scanYYin );
+ BEGIN(Prototype);
+ scanYYlex();
+ g_lexInit=TRUE;
+
+ current->name = current->name.stripWhiteSpace();
+ if (current->section == Entry::MEMBERDOC_SEC && current->args.isEmpty())
+ current->section = Entry::VARIABLEDOC_SEC;
+
+ // restore original scanner state
+ YY_BUFFER_STATE tmpState = YY_CURRENT_BUFFER;
+ yy_switch_to_buffer(orgState);
+ yy_delete_buffer(tmpState);
+ inputString = orgInputString;
+ inputPosition = orgInputPosition;
+ g_inputFromFile = orgInputFromFile;
+
+ //printf("**** parsePrototype end\n");
+}
+
+void scanFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ scanYYlex_destroy();
+ }
+#endif
+}
+
+//static void handleGroupStartCommand(const char *header)
+//{
+// memberGroupHeader=header;
+// startGroupInDoc();
+//}
+//
+//static void handleGroupEndCommand()
+//{
+// endGroup();
+// previous=0;
+//}
+
+//----------------------------------------------------------------------------
+
+void CLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+{
+ g_thisParser = this;
+ ::parseMain(fileName,fileBuf,root);
+}
+
+void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
+ const char * scopeName,
+ const QCString & input,
+ bool isExampleBlock,
+ const char * exampleName,
+ FileDef * fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ MemberDef *memberDef,
+ bool showLineNumbers
+ )
+{
+ ::parseCCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
+ fileDef,startLine,endLine,inlineFragment,memberDef,
+ showLineNumbers);
+}
+
+bool CLanguageScanner::needsPreprocessing(const QCString &extension)
+{
+ QCString fe=extension.lower();
+ return
+ !( fe==".java" || fe==".as" || fe==".d" || fe==".php" ||
+ fe==".php4" || fe==".inc" || fe==".phtml"
+ );
+}
+
+void CLanguageScanner::resetCodeParserState()
+{
+ ::resetCCodeParserState();
+}
+
+void CLanguageScanner::parsePrototype(const char *text)
+{
+ ::parsePrototype(text);
+}
+
+//----------------------------------------------------------------------------
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+//----------------------------------------------------------------------------
+extern "C" { // some bogus code to keep the compiler happy
+ void scannerYYdummy() { yy_flex_realloc(0,0); }
+}
+#endif
+
diff --git a/src/search.css b/src/search.css
new file mode 100644
index 0000000..fe731e8
--- /dev/null
+++ b/src/search.css
@@ -0,0 +1,240 @@
+/*---------------- Search Box */
+
+#FSearchBox {
+ float: left;
+}
+
+#searchli {
+ float: right;
+ display: block;
+ width: 170px;
+ height: 36px;
+}
+
+#MSearchBox {
+ white-space : nowrap;
+ position: absolute;
+ float: none;
+ display: inline;
+ margin-top: 8px;
+ right: 0px;
+ width: 170px;
+ z-index: 102;
+}
+
+#MSearchBox .left
+{
+ display:block;
+ position:absolute;
+ left:10px;
+ width:20px;
+ height:19px;
+ background:url('search_l.png') no-repeat;
+ background-position:right;
+}
+
+#MSearchSelect {
+ display:block;
+ position:absolute;
+ width:20px;
+ height:19px;
+}
+
+.left #MSearchSelect {
+ left:4px;
+}
+
+.right #MSearchSelect {
+ right:5px;
+}
+
+#MSearchField {
+ display:block;
+ position:absolute;
+ height:19px;
+ background:url('search_m.png') repeat-x;
+ border:none;
+ width:116px;
+ margin-left:20px;
+ padding-left:4px;
+ color: #909090;
+ outline: none;
+ font: 9pt Arial, Verdana, sans-serif;
+}
+
+#FSearchBox #MSearchField {
+ margin-left:15px;
+}
+
+#MSearchBox .right {
+ display:block;
+ position:absolute;
+ right:10px;
+ top:0px;
+ width:20px;
+ height:19px;
+ background:url('search_r.png') no-repeat;
+ background-position:left;
+}
+
+#MSearchClose {
+ display: none;
+ position: absolute;
+ top: 4px;
+ background : none;
+ border: none;
+ margin: 0px 4px 0px 0px;
+ padding: 0px 0px;
+ outline: none;
+}
+
+.left #MSearchClose {
+ left: 6px;
+}
+
+.right #MSearchClose {
+ right: 2px;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: #000000;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid ##A0;
+ background-color: ##FA;
+ z-index: 1;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+ font: 8pt Arial, Verdana, sans-serif;
+ padding-left: 2px;
+ padding-right: 12px;
+ border: 0px;
+}
+
+span.SelectionMark {
+ margin-right: 4px;
+ font-family: monospace;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem {
+ display: block;
+ outline-style: none;
+ color: #000000;
+ text-decoration: none;
+ padding-left: 6px;
+ padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+ color: #000000;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem:hover {
+ color: #FFFFFF;
+ background-color: ##50;
+ outline-style: none;
+ text-decoration: none;
+ cursor: pointer;
+ display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+ width: 60ex;
+ height: 15em;
+}
+
+#MSearchResultsWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #000;
+ background-color: ##F0;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+ clear:both;
+ padding-bottom: 15px;
+}
+
+.SREntry {
+ font-size: 10pt;
+ padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+ font-size: 8pt;
+ padding: 1px 5px;
+}
+
+body.SRPage {
+ margin: 5px 2px;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+
+.SRPage .SRChildren {
+ display: none;
+}
+
+.SRSymbol {
+ font-weight: bold;
+ color: ##58;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRScope {
+ display: block;
+ color: ##58;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+
+.SRPage .SRStatus {
+ padding: 2px 5px;
+ font-size: 8pt;
+ font-style: italic;
+}
+
+.SRResult {
+ display: none;
+}
+
+DIV.searchresults {
+ margin-left: 10px;
+ margin-right: 10px;
+}
diff --git a/src/search.js b/src/search.js
new file mode 100644
index 0000000..010fd4b
--- /dev/null
+++ b/src/search.js
@@ -0,0 +1,709 @@
+function convertToId(search)
+{
+ var result = '';
+ for (i=0;i<search.length;i++)
+ {
+ var c = search.charAt(i);
+ var cn = c.charCodeAt(0);
+ if (c.match(/[a-z0-9]/))
+ {
+ result+=c;
+ }
+ else if (cn<16)
+ {
+ result+="_0"+cn.toString(16);
+ }
+ else
+ {
+ result+="_"+cn.toString(16);
+ }
+ }
+ return result;
+}
+
+function getXPos(item)
+{
+ var x = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ x += item.offsetLeft;
+ item = item.offsetParent;
+ }
+ }
+ return x;
+}
+
+function getYPos(item)
+{
+ var y = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ y += item.offsetTop;
+ item = item.offsetParent;
+ }
+ }
+ return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+ Parameters:
+ name - The name of the global variable that will be
+ storing this instance. Is needed to be able to set timeouts.
+ resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, inFrame, label)
+{
+ if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
+
+ // ---------- Instance variables
+ this.name = name;
+ this.resultsPath = resultsPath;
+ this.keyTimeout = 0;
+ this.keyTimeoutLength = 500;
+ this.closeSelectionTimeout = 300;
+ this.lastSearchValue = "";
+ this.lastResultsPage = "";
+ this.hideTimeout = 0;
+ this.searchIndex = 0;
+ this.searchActive = false;
+ this.insideFrame = inFrame;
+ this.searchLabel = label;
+
+ // ----------- DOM Elements
+
+ this.DOMSearchField = function()
+ { return document.getElementById("MSearchField"); }
+
+ this.DOMSearchSelect = function()
+ { return document.getElementById("MSearchSelect"); }
+
+ this.DOMSearchSelectWindow = function()
+ { return document.getElementById("MSearchSelectWindow"); }
+
+ this.DOMPopupSearchResults = function()
+ { return document.getElementById("MSearchResults"); }
+
+ this.DOMPopupSearchResultsWindow = function()
+ { return document.getElementById("MSearchResultsWindow"); }
+
+ this.DOMSearchClose = function()
+ { return document.getElementById("MSearchClose"); }
+
+ this.DOMSearchBox = function()
+ { return document.getElementById("MSearchBox"); }
+
+ // ------------ Event Handlers
+
+ // Called when focus is added or removed from the search field.
+ this.OnSearchFieldFocus = function(isActive)
+ {
+ this.Activate(isActive);
+ }
+
+ this.OnSearchSelectShow = function()
+ {
+ var searchSelectWindow = this.DOMSearchSelectWindow();
+ var searchField = this.DOMSearchSelect();
+
+ if (this.insideFrame)
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ left += searchField.offsetWidth + 6;
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ left -= searchSelectWindow.offsetWidth;
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+ else
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+
+ // stop selection hide timer
+ if (this.hideTimeout)
+ {
+ clearTimeout(this.hideTimeout);
+ this.hideTimeout=0;
+ }
+ return false; // to avoid "image drag" default event
+ }
+
+ this.OnSearchSelectHide = function()
+ {
+ this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+ this.closeSelectionTimeout);
+ }
+
+ // Called when the content of the search field is changed.
+ this.OnSearchFieldChange = function(evt)
+ {
+ if (this.keyTimeout) // kill running timer
+ {
+ clearTimeout(this.keyTimeout);
+ this.keyTimeout = 0;
+ }
+
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 || e.keyCode==13)
+ {
+ if (e.shiftKey==1)
+ {
+ this.OnSearchSelectShow();
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ child.focus();
+ return;
+ }
+ }
+ return;
+ }
+ else if (window.frames.MSearchResults.searchResults)
+ {
+ var elem = window.frames.MSearchResults.searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+ }
+ else if (e.keyCode==27) // Escape out of the search field
+ {
+ this.DOMSearchField().blur();
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ this.Activate(false);
+ return;
+ }
+
+ // strip whitespaces
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+ if (searchValue != this.lastSearchValue) // search value has changed
+ {
+ if (searchValue != "") // non-empty search
+ {
+ // set timer for search update
+ this.keyTimeout = setTimeout(this.name + '.Search()',
+ this.keyTimeoutLength);
+ }
+ else // empty search field
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ }
+ }
+ }
+
+ this.SelectItemCount = function(id)
+ {
+ var count=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ this.SelectItemSet = function(id)
+ {
+ var i,j=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ var node = child.firstChild;
+ if (j==id)
+ {
+ node.innerHTML='&bull;';
+ }
+ else
+ {
+ node.innerHTML='&#160;';
+ }
+ j++;
+ }
+ }
+ }
+
+ // Called when an search filter selection is made.
+ // set item with index id as the active item
+ this.OnSelectItem = function(id)
+ {
+ this.searchIndex = id;
+ this.SelectItemSet(id);
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+ if (searchValue!="" && this.searchActive) // something was found -> do a search
+ {
+ this.Search();
+ }
+ }
+
+ this.OnSearchSelectKey = function(evt)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+ {
+ this.searchIndex++;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==38 && this.searchIndex>0) // Up
+ {
+ this.searchIndex--;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==13 || e.keyCode==27)
+ {
+ this.OnSelectItem(this.searchIndex);
+ this.CloseSelectionWindow();
+ this.DOMSearchField().focus();
+ }
+ return false;
+ }
+
+ // --------- Actions
+
+ // Closes the results window.
+ this.CloseResultsWindow = function()
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.Activate(false);
+ }
+
+ this.CloseSelectionWindow = function()
+ {
+ this.DOMSearchSelectWindow().style.display = 'none';
+ }
+
+ // Performs a search.
+ this.Search = function()
+ {
+ this.keyTimeout = 0;
+
+ // strip leading whitespace
+ var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+ var code = searchValue.toLowerCase().charCodeAt(0);
+ var hexCode;
+ if (code<16)
+ {
+ hexCode="0"+code.toString(16);
+ }
+ else
+ {
+ hexCode=code.toString(16);
+ }
+
+ var resultsPage;
+ var resultsPageWithSearch;
+ var hasResultsPage;
+
+ if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')
+ {
+ resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+ resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+ hasResultsPage = true;
+ }
+ else // nothing available for this search term
+ {
+ resultsPage = this.resultsPath + '/nomatches.html';
+ resultsPageWithSearch = resultsPage;
+ hasResultsPage = false;
+ }
+
+ window.frames.MSearchResults.location.href = resultsPageWithSearch;
+ var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ var domSearchBox = this.DOMSearchBox();
+ this.DOMSearchClose().style.display = 'inline';
+ if (this.insideFrame)
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ domPopupSearchResultsWindow.style.position = 'relative';
+ domPopupSearchResultsWindow.style.display = 'block';
+ var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResults.style.width = width + 'px';
+ }
+ else
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+ var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ }
+ }
+
+ this.lastSearchValue = searchValue;
+ this.lastResultsPage = resultsPage;
+ }
+
+ // -------- Activation Functions
+
+ // Activates or deactivates the search panel, resetting things to
+ // their default values if necessary.
+ this.Activate = function(isActive)
+ {
+ if (isActive || // open it
+ this.DOMPopupSearchResultsWindow().style.display == 'block'
+ )
+ {
+ this.DOMSearchBox().className = 'MSearchBoxActive';
+
+ var searchField = this.DOMSearchField();
+
+ if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+ {
+ searchField.value = '';
+ this.searchActive = true;
+ }
+ }
+ else if (!isActive) // directly remove the panel
+ {
+ this.DOMSearchBox().className = 'MSearchBoxInactive';
+ this.DOMSearchField().value = this.searchLabel;
+ this.searchActive = false;
+ this.lastSearchValue = ''
+ this.lastResultsPage = '';
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+ // The number of matches from the last run of <Search()>.
+ this.lastMatchCount = 0;
+ this.lastKey = 0;
+ this.repeatOn = false;
+
+ // Toggles the visibility of the passed element ID.
+ this.FindChildElement = function(id)
+ {
+ var parentElement = document.getElementById(id);
+ var element = parentElement.firstChild;
+
+ while (element && element!=parentElement)
+ {
+ if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+ {
+ return element;
+ }
+
+ if (element.nodeName == 'DIV' && element.hasChildNodes())
+ {
+ element = element.firstChild;
+ }
+ else if (element.nextSibling)
+ {
+ element = element.nextSibling;
+ }
+ else
+ {
+ do
+ {
+ element = element.parentNode;
+ }
+ while (element && element!=parentElement && !element.nextSibling);
+
+ if (element && element!=parentElement)
+ {
+ element = element.nextSibling;
+ }
+ }
+ }
+ }
+
+ this.Toggle = function(id)
+ {
+ var element = this.FindChildElement(id);
+ if (element)
+ {
+ if (element.style.display == 'block')
+ {
+ element.style.display = 'none';
+ }
+ else
+ {
+ element.style.display = 'block';
+ }
+ }
+ }
+
+ // Searches for the passed string. If there is no parameter,
+ // it takes it from the URL query.
+ //
+ // Always returns true, since other documents may try to call it
+ // and that may or may not be possible.
+ this.Search = function(search)
+ {
+ if (!search) // get search word from URL
+ {
+ search = window.location.search;
+ search = search.substring(1); // Remove the leading '?'
+ search = unescape(search);
+ }
+
+ search = search.replace(/^ +/, ""); // strip leading spaces
+ search = search.replace(/ +$/, ""); // strip trailing spaces
+ search = search.toLowerCase();
+ search = convertToId(search);
+
+ var resultRows = document.getElementsByTagName("div");
+ var matches = 0;
+
+ var i = 0;
+ while (i < resultRows.length)
+ {
+ var row = resultRows.item(i);
+ if (row.className == "SRResult")
+ {
+ var rowMatchName = row.id.toLowerCase();
+ rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+ if (search.length<=rowMatchName.length &&
+ rowMatchName.substr(0, search.length)==search)
+ {
+ row.style.display = 'block';
+ matches++;
+ }
+ else
+ {
+ row.style.display = 'none';
+ }
+ }
+ i++;
+ }
+ document.getElementById("Searching").style.display='none';
+ if (matches == 0) // no results
+ {
+ document.getElementById("NoMatches").style.display='block';
+ }
+ else // at least one result
+ {
+ document.getElementById("NoMatches").style.display='none';
+ }
+ this.lastMatchCount = matches;
+ return true;
+ }
+
+ // return the first item with index index or higher that is visible
+ this.NavNext = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index++;
+ }
+ return focusItem;
+ }
+
+ this.NavPrev = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index--;
+ }
+ return focusItem;
+ }
+
+ this.ProcessKeys = function(e)
+ {
+ if (e.type == "keydown")
+ {
+ this.repeatOn = false;
+ this.lastKey = e.keyCode;
+ }
+ else if (e.type == "keypress")
+ {
+ if (!this.repeatOn)
+ {
+ if (this.lastKey) this.repeatOn = true;
+ return false; // ignore first keypress after keydown
+ }
+ }
+ else if (e.type == "keyup")
+ {
+ this.lastKey = 0;
+ this.repeatOn = false;
+ }
+ return this.lastKey!=0;
+ }
+
+ this.Nav = function(evt,itemIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ var newIndex = itemIndex-1;
+ var focusItem = this.NavPrev(newIndex);
+ if (focusItem)
+ {
+ var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+ if (child && child.style.display == 'block') // children visible
+ {
+ var n=0;
+ var tmpElem;
+ while (1) // search for last child
+ {
+ tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+ if (tmpElem)
+ {
+ focusItem = tmpElem;
+ }
+ else // found it!
+ {
+ break;
+ }
+ n++;
+ }
+ }
+ }
+ if (focusItem)
+ {
+ focusItem.focus();
+ }
+ else // return focus to search field
+ {
+ parent.document.getElementById("MSearchField").focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = itemIndex+1;
+ var focusItem;
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem && elem.style.display == 'block') // children visible
+ {
+ focusItem = document.getElementById('Item'+itemIndex+'_c0');
+ }
+ if (!focusItem) focusItem = this.NavNext(newIndex);
+ if (focusItem) focusItem.focus();
+ }
+ else if (this.lastKey==39) // Right
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'block';
+ }
+ else if (this.lastKey==37) // Left
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'none';
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+
+ this.NavChild = function(evt,itemIndex,childIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ if (childIndex>0)
+ {
+ var newIndex = childIndex-1;
+ document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+ }
+ else // already at first child, jump to parent
+ {
+ document.getElementById('Item'+itemIndex).focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = childIndex+1;
+ var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+ if (!elem) // last child, jump to parent next parent
+ {
+ elem = this.NavNext(itemIndex+1);
+ }
+ if (elem)
+ {
+ elem.focus();
+ }
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/search.php b/src/search.php
new file mode 100644
index 0000000..906f09c
--- /dev/null
+++ b/src/search.php
@@ -0,0 +1,317 @@
+function readInt($file)
+{
+ $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));
+ $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file));
+ return ($b1<<24)|($b2<<16)|($b3<<8)|$b4;
+}
+
+function readString($file)
+{
+ $result="";
+ while (ord($c=fgetc($file))) $result.=$c;
+ return $result;
+}
+
+function readHeader($file)
+{
+ $header =fgetc($file); $header.=fgetc($file);
+ $header.=fgetc($file); $header.=fgetc($file);
+ return $header;
+}
+
+function computeIndex($word)
+{
+ // Simple hashing that allows for substring search
+ if (strlen($word)<2) return -1;
+ // high char of the index
+ $hi = ord($word{0});
+ if ($hi==0) return -1;
+ // low char of the index
+ $lo = ord($word{1});
+ if ($lo==0) return -1;
+ // return index
+ return $hi*256+$lo;
+}
+
+function search($file,$word,&$statsList)
+{
+ $index = computeIndex($word);
+ if ($index!=-1) // found a valid index
+ {
+ fseek($file,$index*4+4); // 4 bytes per entry, skip header
+ $index = readInt($file);
+ if ($index) // found words matching the hash key
+ {
+ $start=sizeof($statsList);
+ $count=$start;
+ fseek($file,$index);
+ $w = readString($file);
+ while ($w)
+ {
+ $statIdx = readInt($file);
+ if ($word==substr($w,0,strlen($word)))
+ { // found word that matches (as substring)
+ $statsList[$count++]=array(
+ "word"=>$word,
+ "match"=>$w,
+ "index"=>$statIdx,
+ "full"=>strlen($w)==strlen($word),
+ "docs"=>array()
+ );
+ }
+ $w = readString($file);
+ }
+ $totalHi=0;
+ $totalFreqHi=0;
+ $totalFreqLo=0;
+ for ($count=$start;$count<sizeof($statsList);$count++)
+ {
+ $statInfo = &$statsList[$count];
+ $multiplier = 1;
+ // whole word matches have a double weight
+ if ($statInfo["full"]) $multiplier=2;
+ fseek($file,$statInfo["index"]);
+ $numDocs = readInt($file);
+ $docInfo = array();
+ // read docs info + occurrence frequency of the word
+ for ($i=0;$i<$numDocs;$i++)
+ {
+ $idx=readInt($file);
+ $freq=readInt($file);
+ $docInfo[$i]=array("idx" => $idx,
+ "freq" => $freq>>1,
+ "rank" => 0.0,
+ "hi" => $freq&1
+ );
+ if ($freq&1) // word occurs in high priority doc
+ {
+ $totalHi++;
+ $totalFreqHi+=$freq*$multiplier;
+ }
+ else // word occurs in low priority doc
+ {
+ $totalFreqLo+=$freq*$multiplier;
+ }
+ }
+ // read name and url info for the doc
+ for ($i=0;$i<$numDocs;$i++)
+ {
+ fseek($file,$docInfo[$i]["idx"]);
+ $docInfo[$i]["name"]=readString($file);
+ $docInfo[$i]["url"]=readString($file);
+ }
+ $statInfo["docs"]=$docInfo;
+ }
+ $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi;
+ for ($count=$start;$count<sizeof($statsList);$count++)
+ {
+ $statInfo = &$statsList[$count];
+ $multiplier = 1;
+ // whole word matches have a double weight
+ if ($statInfo["full"]) $multiplier=2;
+ for ($i=0;$i<sizeof($statInfo["docs"]);$i++)
+ {
+ $docInfo = &$statInfo["docs"];
+ // compute frequency rank of the word in each doc
+ $freq=$docInfo[$i]["freq"];
+ if ($docInfo[$i]["hi"])
+ {
+ $statInfo["docs"][$i]["rank"]=
+ (float)($freq*$multiplier+$totalFreqLo)/$totalFreq;
+ }
+ else
+ {
+ $statInfo["docs"][$i]["rank"]=
+ (float)($freq*$multiplier)/$totalFreq;
+ }
+ }
+ }
+ }
+ }
+ return $statsList;
+}
+
+function combine_results($results,&$docs)
+{
+ foreach ($results as $wordInfo)
+ {
+ $docsList = &$wordInfo["docs"];
+ foreach ($docsList as $di)
+ {
+ $key=$di["url"];
+ $rank=$di["rank"];
+ if (isset($docs[$key]))
+ {
+ $docs[$key]["rank"]+=$rank;
+ }
+ else
+ {
+ $docs[$key] = array("url"=>$key,
+ "name"=>$di["name"],
+ "rank"=>$rank
+ );
+ }
+ $docs[$key]["words"][] = array(
+ "word"=>$wordInfo["word"],
+ "match"=>$wordInfo["match"],
+ "freq"=>$di["freq"]
+ );
+ }
+ }
+ return $docs;
+}
+
+function filter_results($docs,&$requiredWords,&$forbiddenWords)
+{
+ $filteredDocs=array();
+ while (list ($key, $val) = each ($docs))
+ {
+ $words = &$docs[$key]["words"];
+ $copy=1; // copy entry by default
+ if (sizeof($requiredWords)>0)
+ {
+ foreach ($requiredWords as $reqWord)
+ {
+ $found=0;
+ foreach ($words as $wordInfo)
+ {
+ $found = $wordInfo["word"]==$reqWord;
+ if ($found) break;
+ }
+ if (!$found)
+ {
+ $copy=0; // document contains none of the required words
+ break;
+ }
+ }
+ }
+ if (sizeof($forbiddenWords)>0)
+ {
+ foreach ($words as $wordInfo)
+ {
+ if (in_array($wordInfo["word"],$forbiddenWords))
+ {
+ $copy=0; // document contains a forbidden word
+ break;
+ }
+ }
+ }
+ if ($copy) $filteredDocs[$key]=$docs[$key];
+ }
+ return $filteredDocs;
+}
+
+function compare_rank($a,$b)
+{
+ if ($a["rank"] == $b["rank"])
+ {
+ return 0;
+ }
+ return ($a["rank"]>$b["rank"]) ? -1 : 1;
+}
+
+function sort_results($docs,&$sorted)
+{
+ $sorted = $docs;
+ usort($sorted,"compare_rank");
+ return $sorted;
+}
+
+function report_results(&$docs)
+{
+ echo "<div class=\"header\">";
+ echo " <div class=\"headertitle\">\n";
+ echo " <h1>".search_results()."</h1>\n";
+ echo " </div>\n";
+ echo "</div>\n";
+ echo "<div class=\"searchresults\">\n";
+ echo "<table cellspacing=\"2\">\n";
+ $numDocs = sizeof($docs);
+ if ($numDocs==0)
+ {
+ echo " <tr>\n";
+ echo " <td colspan=\"2\">".matches_text(0)."</td>\n";
+ echo " </tr>\n";
+ }
+ else
+ {
+ echo " <tr>\n";
+ echo " <td colspan=\"2\">".matches_text($numDocs);
+ echo "\n";
+ echo " </td>\n";
+ echo " </tr>\n";
+ $num=1;
+ foreach ($docs as $doc)
+ {
+ echo " <tr>\n";
+ echo " <td align=\"right\">$num.</td>";
+ echo "<td><a class=\"el\" href=\"".$doc["url"]."\">".$doc["name"]."</a></td>\n";
+ echo " <tr>\n";
+ echo " <td></td><td class=\"tiny\">".report_matches()." ";
+ foreach ($doc["words"] as $wordInfo)
+ {
+ $word = $wordInfo["word"];
+ $matchRight = substr($wordInfo["match"],strlen($word));
+ echo "<b>$word</b>$matchRight(".$wordInfo["freq"].") ";
+ }
+ echo " </td>\n";
+ echo " </tr>\n";
+ $num++;
+ }
+ }
+ echo "</table>\n";
+}
+
+function main()
+{
+ if(strcmp('4.1.0', phpversion()) > 0)
+ {
+ die("Error: PHP version 4.1.0 or above required!");
+ }
+ if (!($file=fopen("search/search.idx","rb")))
+ {
+ die("Error: Search index file could NOT be opened!");
+ }
+ if (readHeader($file)!="DOXS")
+ {
+ die("Error: Header of index file is invalid!");
+ }
+ $query="";
+ if (array_key_exists("query", $_GET))
+ {
+ $query=$_GET["query"];
+ }
+ end_form(preg_replace("/[^a-zA-Z0-9\-\_\.]/i", " ", $query ));
+ $results = array();
+ $requiredWords = array();
+ $forbiddenWords = array();
+ $foundWords = array();
+ $word=strtok($query," ");
+ while ($word) // for each word in the search query
+ {
+ if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; }
+ if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; }
+ if (!in_array($word,$foundWords))
+ {
+ $foundWords[]=$word;
+ search($file,strtolower($word),$results);
+ }
+ $word=strtok(" ");
+ }
+ $docs = array();
+ combine_results($results,$docs);
+ // filter out documents with forbidden word or that do not contain
+ // required words
+ $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords);
+ // sort the results based on rank
+ $sorted = array();
+ sort_results($filteredDocs,$sorted);
+ // report results to the user
+ report_results($sorted);
+ echo "</div>\n";
+ end_page();
+ fclose($file);
+}
+
+main();
+
diff --git a/src/search_css.h b/src/search_css.h
new file mode 100644
index 0000000..0ef3863
--- /dev/null
+++ b/src/search_css.h
@@ -0,0 +1,240 @@
+"/*---------------- Search Box */\n"
+"\n"
+"#FSearchBox {\n"
+" float: left;\n"
+"}\n"
+"\n"
+"#searchli {\n"
+" float: right;\n"
+" display: block;\n"
+" width: 170px;\n"
+" height: 36px;\n"
+"}\n"
+"\n"
+"#MSearchBox {\n"
+" white-space : nowrap;\n"
+" position: absolute;\n"
+" float: none;\n"
+" display: inline;\n"
+" margin-top: 8px;\n"
+" right: 0px;\n"
+" width: 170px;\n"
+" z-index: 102;\n"
+"}\n"
+"\n"
+"#MSearchBox .left\n"
+"{\n"
+" display:block;\n"
+" position:absolute;\n"
+" left:10px;\n"
+" width:20px;\n"
+" height:19px;\n"
+" background:url('search_l.png') no-repeat;\n"
+" background-position:right;\n"
+"}\n"
+"\n"
+"#MSearchSelect {\n"
+" display:block;\n"
+" position:absolute;\n"
+" width:20px;\n"
+" height:19px;\n"
+"}\n"
+"\n"
+".left #MSearchSelect {\n"
+" left:4px;\n"
+"}\n"
+"\n"
+".right #MSearchSelect {\n"
+" right:5px;\n"
+"}\n"
+"\n"
+"#MSearchField {\n"
+" display:block;\n"
+" position:absolute;\n"
+" height:19px;\n"
+" background:url('search_m.png') repeat-x;\n"
+" border:none;\n"
+" width:116px;\n"
+" margin-left:20px;\n"
+" padding-left:4px;\n"
+" color: #909090;\n"
+" outline: none;\n"
+" font: 9pt Arial, Verdana, sans-serif;\n"
+"}\n"
+"\n"
+"#FSearchBox #MSearchField {\n"
+" margin-left:15px;\n"
+"}\n"
+"\n"
+"#MSearchBox .right {\n"
+" display:block;\n"
+" position:absolute;\n"
+" right:10px;\n"
+" top:0px;\n"
+" width:20px;\n"
+" height:19px;\n"
+" background:url('search_r.png') no-repeat;\n"
+" background-position:left;\n"
+"}\n"
+"\n"
+"#MSearchClose {\n"
+" display: none;\n"
+" position: absolute;\n"
+" top: 4px;\n"
+" background : none;\n"
+" border: none;\n"
+" margin: 0px 4px 0px 0px;\n"
+" padding: 0px 0px;\n"
+" outline: none;\n"
+"}\n"
+"\n"
+".left #MSearchClose {\n"
+" left: 6px;\n"
+"}\n"
+"\n"
+".right #MSearchClose {\n"
+" right: 2px;\n"
+"}\n"
+"\n"
+".MSearchBoxActive #MSearchField {\n"
+" color: #000000;\n"
+"}\n"
+"\n"
+"/*---------------- Search filter selection */\n"
+"\n"
+"#MSearchSelectWindow {\n"
+" display: none;\n"
+" position: absolute;\n"
+" left: 0; top: 0;\n"
+" border: 1px solid ##A0;\n"
+" background-color: ##FA;\n"
+" z-index: 1;\n"
+" padding-top: 4px;\n"
+" padding-bottom: 4px;\n"
+" -moz-border-radius: 4px;\n"
+" -webkit-border-top-left-radius: 4px;\n"
+" -webkit-border-top-right-radius: 4px;\n"
+" -webkit-border-bottom-left-radius: 4px;\n"
+" -webkit-border-bottom-right-radius: 4px;\n"
+" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n"
+"}\n"
+"\n"
+".SelectItem {\n"
+" font: 8pt Arial, Verdana, sans-serif;\n"
+" padding-left: 2px;\n"
+" padding-right: 12px;\n"
+" border: 0px;\n"
+"}\n"
+"\n"
+"span.SelectionMark {\n"
+" margin-right: 4px;\n"
+" font-family: monospace;\n"
+" outline-style: none;\n"
+" text-decoration: none;\n"
+"}\n"
+"\n"
+"a.SelectItem {\n"
+" display: block;\n"
+" outline-style: none;\n"
+" color: #000000; \n"
+" text-decoration: none;\n"
+" padding-left: 6px;\n"
+" padding-right: 12px;\n"
+"}\n"
+"\n"
+"a.SelectItem:focus,\n"
+"a.SelectItem:active {\n"
+" color: #000000; \n"
+" outline-style: none;\n"
+" text-decoration: none;\n"
+"}\n"
+"\n"
+"a.SelectItem:hover {\n"
+" color: #FFFFFF;\n"
+" background-color: ##50;\n"
+" outline-style: none;\n"
+" text-decoration: none;\n"
+" cursor: pointer;\n"
+" display: block;\n"
+"}\n"
+"\n"
+"/*---------------- Search results window */\n"
+"\n"
+"iframe#MSearchResults {\n"
+" width: 60ex;\n"
+" height: 15em;\n"
+"}\n"
+"\n"
+"#MSearchResultsWindow {\n"
+" display: none;\n"
+" position: absolute;\n"
+" left: 0; top: 0;\n"
+" border: 1px solid #000;\n"
+" background-color: ##F0;\n"
+"}\n"
+"\n"
+"/* ----------------------------------- */\n"
+"\n"
+"\n"
+"#SRIndex {\n"
+" clear:both; \n"
+" padding-bottom: 15px;\n"
+"}\n"
+"\n"
+".SREntry {\n"
+" font-size: 10pt;\n"
+" padding-left: 1ex;\n"
+"}\n"
+"\n"
+".SRPage .SREntry {\n"
+" font-size: 8pt;\n"
+" padding: 1px 5px;\n"
+"}\n"
+"\n"
+"body.SRPage {\n"
+" margin: 5px 2px;\n"
+"}\n"
+"\n"
+".SRChildren {\n"
+" padding-left: 3ex; padding-bottom: .5em \n"
+"}\n"
+"\n"
+".SRPage .SRChildren {\n"
+" display: none;\n"
+"}\n"
+"\n"
+".SRSymbol {\n"
+" font-weight: bold; \n"
+" color: ##58;\n"
+" font-family: Arial, Verdana, sans-serif;\n"
+" text-decoration: none;\n"
+" outline: none;\n"
+"}\n"
+"\n"
+"a.SRScope {\n"
+" display: block;\n"
+" color: ##58; \n"
+" font-family: Arial, Verdana, sans-serif;\n"
+" text-decoration: none;\n"
+" outline: none;\n"
+"}\n"
+"\n"
+"a.SRSymbol:focus, a.SRSymbol:active,\n"
+"a.SRScope:focus, a.SRScope:active {\n"
+" text-decoration: underline;\n"
+"}\n"
+"\n"
+".SRPage .SRStatus {\n"
+" padding: 2px 5px;\n"
+" font-size: 8pt;\n"
+" font-style: italic;\n"
+"}\n"
+"\n"
+".SRResult {\n"
+" display: none;\n"
+"}\n"
+"\n"
+"DIV.searchresults {\n"
+" margin-left: 10px;\n"
+" margin-right: 10px;\n"
+"}\n"
diff --git a/src/search_js.h b/src/search_js.h
new file mode 100644
index 0000000..d8ef087
--- /dev/null
+++ b/src/search_js.h
@@ -0,0 +1,709 @@
+"function convertToId(search)\n"
+"{\n"
+" var result = '';\n"
+" for (i=0;i<search.length;i++)\n"
+" {\n"
+" var c = search.charAt(i);\n"
+" var cn = c.charCodeAt(0);\n"
+" if (c.match(/[a-z0-9]/))\n"
+" {\n"
+" result+=c;\n"
+" }\n"
+" else if (cn<16) \n"
+" {\n"
+" result+=\"_0\"+cn.toString(16);\n"
+" }\n"
+" else \n"
+" {\n"
+" result+=\"_\"+cn.toString(16);\n"
+" }\n"
+" }\n"
+" return result;\n"
+"}\n"
+"\n"
+"function getXPos(item)\n"
+"{\n"
+" var x = 0;\n"
+" if (item.offsetWidth)\n"
+" {\n"
+" while (item && item!=document.body)\n"
+" {\n"
+" x += item.offsetLeft;\n"
+" item = item.offsetParent;\n"
+" }\n"
+" }\n"
+" return x;\n"
+"}\n"
+"\n"
+"function getYPos(item)\n"
+"{\n"
+" var y = 0;\n"
+" if (item.offsetWidth)\n"
+" {\n"
+" while (item && item!=document.body)\n"
+" {\n"
+" y += item.offsetTop;\n"
+" item = item.offsetParent;\n"
+" }\n"
+" }\n"
+" return y;\n"
+"}\n"
+"\n"
+"/* A class handling everything associated with the search panel.\n"
+"\n"
+" Parameters:\n"
+" name - The name of the global variable that will be \n"
+" storing this instance. Is needed to be able to set timeouts.\n"
+" resultPath - path to use for external files\n"
+"*/\n"
+"function SearchBox(name, resultsPath, inFrame, label)\n"
+"{\n"
+" if (!name || !resultsPath) { alert(\"Missing parameters to SearchBox.\"); }\n"
+" \n"
+" // ---------- Instance variables\n"
+" this.name = name;\n"
+" this.resultsPath = resultsPath;\n"
+" this.keyTimeout = 0;\n"
+" this.keyTimeoutLength = 500;\n"
+" this.closeSelectionTimeout = 300;\n"
+" this.lastSearchValue = \"\";\n"
+" this.lastResultsPage = \"\";\n"
+" this.hideTimeout = 0;\n"
+" this.searchIndex = 0;\n"
+" this.searchActive = false;\n"
+" this.insideFrame = inFrame;\n"
+" this.searchLabel = label;\n"
+"\n"
+" // ----------- DOM Elements\n"
+"\n"
+" this.DOMSearchField = function()\n"
+" { return document.getElementById(\"MSearchField\"); }\n"
+"\n"
+" this.DOMSearchSelect = function()\n"
+" { return document.getElementById(\"MSearchSelect\"); }\n"
+"\n"
+" this.DOMSearchSelectWindow = function()\n"
+" { return document.getElementById(\"MSearchSelectWindow\"); }\n"
+"\n"
+" this.DOMPopupSearchResults = function()\n"
+" { return document.getElementById(\"MSearchResults\"); }\n"
+"\n"
+" this.DOMPopupSearchResultsWindow = function()\n"
+" { return document.getElementById(\"MSearchResultsWindow\"); }\n"
+"\n"
+" this.DOMSearchClose = function()\n"
+" { return document.getElementById(\"MSearchClose\"); }\n"
+"\n"
+" this.DOMSearchBox = function()\n"
+" { return document.getElementById(\"MSearchBox\"); }\n"
+"\n"
+" // ------------ Event Handlers\n"
+"\n"
+" // Called when focus is added or removed from the search field.\n"
+" this.OnSearchFieldFocus = function(isActive)\n"
+" {\n"
+" this.Activate(isActive);\n"
+" }\n"
+"\n"
+" this.OnSearchSelectShow = function()\n"
+" {\n"
+" var searchSelectWindow = this.DOMSearchSelectWindow();\n"
+" var searchField = this.DOMSearchSelect();\n"
+"\n"
+" if (this.insideFrame)\n"
+" {\n"
+" var left = getXPos(searchField);\n"
+" var top = getYPos(searchField);\n"
+" left += searchField.offsetWidth + 6;\n"
+" top += searchField.offsetHeight;\n"
+"\n"
+" // show search selection popup\n"
+" searchSelectWindow.style.display='block';\n"
+" left -= searchSelectWindow.offsetWidth;\n"
+" searchSelectWindow.style.left = left + 'px';\n"
+" searchSelectWindow.style.top = top + 'px';\n"
+" }\n"
+" else\n"
+" {\n"
+" var left = getXPos(searchField);\n"
+" var top = getYPos(searchField);\n"
+" top += searchField.offsetHeight;\n"
+"\n"
+" // show search selection popup\n"
+" searchSelectWindow.style.display='block';\n"
+" searchSelectWindow.style.left = left + 'px';\n"
+" searchSelectWindow.style.top = top + 'px';\n"
+" }\n"
+"\n"
+" // stop selection hide timer\n"
+" if (this.hideTimeout) \n"
+" {\n"
+" clearTimeout(this.hideTimeout);\n"
+" this.hideTimeout=0;\n"
+" }\n"
+" return false; // to avoid \"image drag\" default event\n"
+" }\n"
+"\n"
+" this.OnSearchSelectHide = function()\n"
+" {\n"
+" this.hideTimeout = setTimeout(this.name +\".CloseSelectionWindow()\",\n"
+" this.closeSelectionTimeout);\n"
+" }\n"
+"\n"
+" // Called when the content of the search field is changed.\n"
+" this.OnSearchFieldChange = function(evt)\n"
+" {\n"
+" if (this.keyTimeout) // kill running timer\n"
+" {\n"
+" clearTimeout(this.keyTimeout);\n"
+" this.keyTimeout = 0;\n"
+" }\n"
+"\n"
+" var e = (evt) ? evt : window.event; // for IE\n"
+" if (e.keyCode==40 || e.keyCode==13)\n"
+" {\n"
+" if (e.shiftKey==1)\n"
+" {\n"
+" this.OnSearchSelectShow();\n"
+" var win=this.DOMSearchSelectWindow(); \n"
+" for (i=0;i<win.childNodes.length;i++)\n"
+" {\n"
+" var child = win.childNodes[i]; // get span within a\n"
+" if (child.className=='SelectItem')\n"
+" {\n"
+" child.focus();\n"
+" return;\n"
+" }\n"
+" }\n"
+" return;\n"
+" }\n"
+" else if (window.frames.MSearchResults.searchResults)\n"
+" {\n"
+" var elem = window.frames.MSearchResults.searchResults.NavNext(0);\n"
+" if (elem) elem.focus();\n"
+" }\n"
+" }\n"
+" else if (e.keyCode==27) // Escape out of the search field\n"
+" {\n"
+" this.DOMSearchField().blur();\n"
+" this.DOMPopupSearchResultsWindow().style.display = 'none';\n"
+" this.DOMSearchClose().style.display = 'none';\n"
+" this.lastSearchValue = '';\n"
+" this.Activate(false);\n"
+" return;\n"
+" }\n"
+"\n"
+" // strip whitespaces\n"
+" var searchValue = this.DOMSearchField().value.replace(/ +/g, \"\");\n"
+"\n"
+" if (searchValue != this.lastSearchValue) // search value has changed\n"
+" {\n"
+" if (searchValue != \"\") // non-empty search\n"
+" {\n"
+" // set timer for search update\n"
+" this.keyTimeout = setTimeout(this.name + '.Search()',\n"
+" this.keyTimeoutLength);\n"
+" }\n"
+" else // empty search field\n"
+" {\n"
+" this.DOMPopupSearchResultsWindow().style.display = 'none';\n"
+" this.DOMSearchClose().style.display = 'none';\n"
+" this.lastSearchValue = '';\n"
+" }\n"
+" }\n"
+" }\n"
+"\n"
+" this.SelectItemCount = function(id)\n"
+" {\n"
+" var count=0;\n"
+" var win=this.DOMSearchSelectWindow(); \n"
+" for (i=0;i<win.childNodes.length;i++)\n"
+" {\n"
+" var child = win.childNodes[i]; // get span within a\n"
+" if (child.className=='SelectItem')\n"
+" {\n"
+" count++;\n"
+" }\n"
+" }\n"
+" return count;\n"
+" }\n"
+"\n"
+" this.SelectItemSet = function(id)\n"
+" {\n"
+" var i,j=0;\n"
+" var win=this.DOMSearchSelectWindow(); \n"
+" for (i=0;i<win.childNodes.length;i++)\n"
+" {\n"
+" var child = win.childNodes[i]; // get span within a\n"
+" if (child.className=='SelectItem')\n"
+" {\n"
+" var node = child.firstChild;\n"
+" if (j==id)\n"
+" {\n"
+" node.innerHTML='&bull;';\n"
+" }\n"
+" else\n"
+" {\n"
+" node.innerHTML='&#160;';\n"
+" }\n"
+" j++;\n"
+" }\n"
+" }\n"
+" }\n"
+"\n"
+" // Called when an search filter selection is made.\n"
+" // set item with index id as the active item\n"
+" this.OnSelectItem = function(id)\n"
+" {\n"
+" this.searchIndex = id;\n"
+" this.SelectItemSet(id);\n"
+" var searchValue = this.DOMSearchField().value.replace(/ +/g, \"\");\n"
+" if (searchValue!=\"\" && this.searchActive) // something was found -> do a search\n"
+" {\n"
+" this.Search();\n"
+" }\n"
+" }\n"
+"\n"
+" this.OnSearchSelectKey = function(evt)\n"
+" {\n"
+" var e = (evt) ? evt : window.event; // for IE\n"
+" if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down\n"
+" {\n"
+" this.searchIndex++;\n"
+" this.OnSelectItem(this.searchIndex);\n"
+" }\n"
+" else if (e.keyCode==38 && this.searchIndex>0) // Up\n"
+" {\n"
+" this.searchIndex--;\n"
+" this.OnSelectItem(this.searchIndex);\n"
+" }\n"
+" else if (e.keyCode==13 || e.keyCode==27)\n"
+" {\n"
+" this.OnSelectItem(this.searchIndex);\n"
+" this.CloseSelectionWindow();\n"
+" this.DOMSearchField().focus();\n"
+" }\n"
+" return false;\n"
+" }\n"
+"\n"
+" // --------- Actions\n"
+"\n"
+" // Closes the results window.\n"
+" this.CloseResultsWindow = function()\n"
+" {\n"
+" this.DOMPopupSearchResultsWindow().style.display = 'none';\n"
+" this.DOMSearchClose().style.display = 'none';\n"
+" this.Activate(false);\n"
+" }\n"
+"\n"
+" this.CloseSelectionWindow = function()\n"
+" {\n"
+" this.DOMSearchSelectWindow().style.display = 'none';\n"
+" }\n"
+"\n"
+" // Performs a search.\n"
+" this.Search = function()\n"
+" {\n"
+" this.keyTimeout = 0;\n"
+"\n"
+" // strip leading whitespace\n"
+" var searchValue = this.DOMSearchField().value.replace(/^ +/, \"\");\n"
+"\n"
+" var code = searchValue.toLowerCase().charCodeAt(0);\n"
+" var hexCode;\n"
+" if (code<16) \n"
+" {\n"
+" hexCode=\"0\"+code.toString(16);\n"
+" }\n"
+" else \n"
+" {\n"
+" hexCode=code.toString(16);\n"
+" }\n"
+"\n"
+" var resultsPage;\n"
+" var resultsPageWithSearch;\n"
+" var hasResultsPage;\n"
+"\n"
+" if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')\n"
+" {\n"
+" resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';\n"
+" resultsPageWithSearch = resultsPage+'?'+escape(searchValue);\n"
+" hasResultsPage = true;\n"
+" }\n"
+" else // nothing available for this search term\n"
+" {\n"
+" resultsPage = this.resultsPath + '/nomatches.html';\n"
+" resultsPageWithSearch = resultsPage;\n"
+" hasResultsPage = false;\n"
+" }\n"
+"\n"
+" window.frames.MSearchResults.location.href = resultsPageWithSearch; \n"
+" var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();\n"
+"\n"
+" if (domPopupSearchResultsWindow.style.display!='block')\n"
+" {\n"
+" var domSearchBox = this.DOMSearchBox();\n"
+" this.DOMSearchClose().style.display = 'inline';\n"
+" if (this.insideFrame)\n"
+" {\n"
+" var domPopupSearchResults = this.DOMPopupSearchResults();\n"
+" domPopupSearchResultsWindow.style.position = 'relative';\n"
+" domPopupSearchResultsWindow.style.display = 'block';\n"
+" var width = document.body.clientWidth - 8; // the -8 is for IE :-(\n"
+" domPopupSearchResultsWindow.style.width = width + 'px';\n"
+" domPopupSearchResults.style.width = width + 'px';\n"
+" }\n"
+" else\n"
+" {\n"
+" var domPopupSearchResults = this.DOMPopupSearchResults();\n"
+" var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;\n"
+" var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;\n"
+" domPopupSearchResultsWindow.style.display = 'block';\n"
+" left -= domPopupSearchResults.offsetWidth;\n"
+" domPopupSearchResultsWindow.style.top = top + 'px';\n"
+" domPopupSearchResultsWindow.style.left = left + 'px';\n"
+" }\n"
+" }\n"
+"\n"
+" this.lastSearchValue = searchValue;\n"
+" this.lastResultsPage = resultsPage;\n"
+" }\n"
+"\n"
+" // -------- Activation Functions\n"
+"\n"
+" // Activates or deactivates the search panel, resetting things to \n"
+" // their default values if necessary. \n"
+" this.Activate = function(isActive)\n"
+" {\n"
+" if (isActive || // open it\n"
+" this.DOMPopupSearchResultsWindow().style.display == 'block' \n"
+" )\n"
+" {\n"
+" this.DOMSearchBox().className = 'MSearchBoxActive';\n"
+"\n"
+" var searchField = this.DOMSearchField();\n"
+"\n"
+" if (searchField.value == this.searchLabel) // clear \"Search\" term upon entry\n"
+" { \n"
+" searchField.value = ''; \n"
+" this.searchActive = true;\n"
+" }\n"
+" }\n"
+" else if (!isActive) // directly remove the panel\n"
+" {\n"
+" this.DOMSearchBox().className = 'MSearchBoxInactive';\n"
+" this.DOMSearchField().value = this.searchLabel;\n"
+" this.searchActive = false;\n"
+" this.lastSearchValue = ''\n"
+" this.lastResultsPage = '';\n"
+" }\n"
+" }\n"
+"}\n"
+"\n"
+"// -----------------------------------------------------------------------\n"
+"\n"
+"// The class that handles everything on the search results page.\n"
+"function SearchResults(name)\n"
+"{\n"
+" // The number of matches from the last run of <Search()>.\n"
+" this.lastMatchCount = 0;\n"
+" this.lastKey = 0;\n"
+" this.repeatOn = false;\n"
+"\n"
+" // Toggles the visibility of the passed element ID.\n"
+" this.FindChildElement = function(id)\n"
+" {\n"
+" var parentElement = document.getElementById(id);\n"
+" var element = parentElement.firstChild;\n"
+"\n"
+" while (element && element!=parentElement)\n"
+" {\n"
+" if (element.nodeName == 'DIV' && element.className == 'SRChildren')\n"
+" {\n"
+" return element;\n"
+" }\n"
+"\n"
+" if (element.nodeName == 'DIV' && element.hasChildNodes())\n"
+" { \n"
+" element = element.firstChild; \n"
+" }\n"
+" else if (element.nextSibling)\n"
+" { \n"
+" element = element.nextSibling; \n"
+" }\n"
+" else\n"
+" {\n"
+" do\n"
+" {\n"
+" element = element.parentNode;\n"
+" }\n"
+" while (element && element!=parentElement && !element.nextSibling);\n"
+"\n"
+" if (element && element!=parentElement)\n"
+" { \n"
+" element = element.nextSibling; \n"
+" }\n"
+" }\n"
+" }\n"
+" }\n"
+"\n"
+" this.Toggle = function(id)\n"
+" {\n"
+" var element = this.FindChildElement(id);\n"
+" if (element)\n"
+" {\n"
+" if (element.style.display == 'block')\n"
+" {\n"
+" element.style.display = 'none';\n"
+" }\n"
+" else\n"
+" {\n"
+" element.style.display = 'block';\n"
+" }\n"
+" }\n"
+" }\n"
+"\n"
+" // Searches for the passed string. If there is no parameter,\n"
+" // it takes it from the URL query.\n"
+" //\n"
+" // Always returns true, since other documents may try to call it\n"
+" // and that may or may not be possible.\n"
+" this.Search = function(search)\n"
+" {\n"
+" if (!search) // get search word from URL\n"
+" {\n"
+" search = window.location.search;\n"
+" search = search.substring(1); // Remove the leading '?'\n"
+" search = unescape(search);\n"
+" }\n"
+"\n"
+" search = search.replace(/^ +/, \"\"); // strip leading spaces\n"
+" search = search.replace(/ +$/, \"\"); // strip trailing spaces\n"
+" search = search.toLowerCase();\n"
+" search = convertToId(search);\n"
+"\n"
+" var resultRows = document.getElementsByTagName(\"div\");\n"
+" var matches = 0;\n"
+"\n"
+" var i = 0;\n"
+" while (i < resultRows.length)\n"
+" {\n"
+" var row = resultRows.item(i);\n"
+" if (row.className == \"SRResult\")\n"
+" {\n"
+" var rowMatchName = row.id.toLowerCase();\n"
+" rowMatchName = rowMatchName.replace(/^sr\\d*_/, ''); // strip 'sr123_'\n"
+"\n"
+" if (search.length<=rowMatchName.length && \n"
+" rowMatchName.substr(0, search.length)==search)\n"
+" {\n"
+" row.style.display = 'block';\n"
+" matches++;\n"
+" }\n"
+" else\n"
+" {\n"
+" row.style.display = 'none';\n"
+" }\n"
+" }\n"
+" i++;\n"
+" }\n"
+" document.getElementById(\"Searching\").style.display='none';\n"
+" if (matches == 0) // no results\n"
+" {\n"
+" document.getElementById(\"NoMatches\").style.display='block';\n"
+" }\n"
+" else // at least one result\n"
+" {\n"
+" document.getElementById(\"NoMatches\").style.display='none';\n"
+" }\n"
+" this.lastMatchCount = matches;\n"
+" return true;\n"
+" }\n"
+"\n"
+" // return the first item with index index or higher that is visible\n"
+" this.NavNext = function(index)\n"
+" {\n"
+" var focusItem;\n"
+" while (1)\n"
+" {\n"
+" var focusName = 'Item'+index;\n"
+" focusItem = document.getElementById(focusName);\n"
+" if (focusItem && focusItem.parentNode.parentNode.style.display=='block')\n"
+" {\n"
+" break;\n"
+" }\n"
+" else if (!focusItem) // last element\n"
+" {\n"
+" break;\n"
+" }\n"
+" focusItem=null;\n"
+" index++;\n"
+" }\n"
+" return focusItem;\n"
+" }\n"
+"\n"
+" this.NavPrev = function(index)\n"
+" {\n"
+" var focusItem;\n"
+" while (1)\n"
+" {\n"
+" var focusName = 'Item'+index;\n"
+" focusItem = document.getElementById(focusName);\n"
+" if (focusItem && focusItem.parentNode.parentNode.style.display=='block')\n"
+" {\n"
+" break;\n"
+" }\n"
+" else if (!focusItem) // last element\n"
+" {\n"
+" break;\n"
+" }\n"
+" focusItem=null;\n"
+" index--;\n"
+" }\n"
+" return focusItem;\n"
+" }\n"
+"\n"
+" this.ProcessKeys = function(e)\n"
+" {\n"
+" if (e.type == \"keydown\") \n"
+" {\n"
+" this.repeatOn = false;\n"
+" this.lastKey = e.keyCode;\n"
+" }\n"
+" else if (e.type == \"keypress\")\n"
+" {\n"
+" if (!this.repeatOn)\n"
+" {\n"
+" if (this.lastKey) this.repeatOn = true;\n"
+" return false; // ignore first keypress after keydown\n"
+" }\n"
+" }\n"
+" else if (e.type == \"keyup\")\n"
+" {\n"
+" this.lastKey = 0;\n"
+" this.repeatOn = false;\n"
+" }\n"
+" return this.lastKey!=0;\n"
+" }\n"
+"\n"
+" this.Nav = function(evt,itemIndex) \n"
+" {\n"
+" var e = (evt) ? evt : window.event; // for IE\n"
+" if (e.keyCode==13) return true;\n"
+" if (!this.ProcessKeys(e)) return false;\n"
+"\n"
+" if (this.lastKey==38) // Up\n"
+" {\n"
+" var newIndex = itemIndex-1;\n"
+" var focusItem = this.NavPrev(newIndex);\n"
+" if (focusItem)\n"
+" {\n"
+" var child = this.FindChildElement(focusItem.parentNode.parentNode.id);\n"
+" if (child && child.style.display == 'block') // children visible\n"
+" { \n"
+" var n=0;\n"
+" var tmpElem;\n"
+" while (1) // search for last child\n"
+" {\n"
+" tmpElem = document.getElementById('Item'+newIndex+'_c'+n);\n"
+" if (tmpElem)\n"
+" {\n"
+" focusItem = tmpElem;\n"
+" }\n"
+" else // found it!\n"
+" {\n"
+" break;\n"
+" }\n"
+" n++;\n"
+" }\n"
+" }\n"
+" }\n"
+" if (focusItem)\n"
+" {\n"
+" focusItem.focus();\n"
+" }\n"
+" else // return focus to search field\n"
+" {\n"
+" parent.document.getElementById(\"MSearchField\").focus();\n"
+" }\n"
+" }\n"
+" else if (this.lastKey==40) // Down\n"
+" {\n"
+" var newIndex = itemIndex+1;\n"
+" var focusItem;\n"
+" var item = document.getElementById('Item'+itemIndex);\n"
+" var elem = this.FindChildElement(item.parentNode.parentNode.id);\n"
+" if (elem && elem.style.display == 'block') // children visible\n"
+" {\n"
+" focusItem = document.getElementById('Item'+itemIndex+'_c0');\n"
+" }\n"
+" if (!focusItem) focusItem = this.NavNext(newIndex);\n"
+" if (focusItem) focusItem.focus();\n"
+" }\n"
+" else if (this.lastKey==39) // Right\n"
+" {\n"
+" var item = document.getElementById('Item'+itemIndex);\n"
+" var elem = this.FindChildElement(item.parentNode.parentNode.id);\n"
+" if (elem) elem.style.display = 'block';\n"
+" }\n"
+" else if (this.lastKey==37) // Left\n"
+" {\n"
+" var item = document.getElementById('Item'+itemIndex);\n"
+" var elem = this.FindChildElement(item.parentNode.parentNode.id);\n"
+" if (elem) elem.style.display = 'none';\n"
+" }\n"
+" else if (this.lastKey==27) // Escape\n"
+" {\n"
+" parent.searchBox.CloseResultsWindow();\n"
+" parent.document.getElementById(\"MSearchField\").focus();\n"
+" }\n"
+" else if (this.lastKey==13) // Enter\n"
+" {\n"
+" return true;\n"
+" }\n"
+" return false;\n"
+" }\n"
+"\n"
+" this.NavChild = function(evt,itemIndex,childIndex)\n"
+" {\n"
+" var e = (evt) ? evt : window.event; // for IE\n"
+" if (e.keyCode==13) return true;\n"
+" if (!this.ProcessKeys(e)) return false;\n"
+"\n"
+" if (this.lastKey==38) // Up\n"
+" {\n"
+" if (childIndex>0)\n"
+" {\n"
+" var newIndex = childIndex-1;\n"
+" document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();\n"
+" }\n"
+" else // already at first child, jump to parent\n"
+" {\n"
+" document.getElementById('Item'+itemIndex).focus();\n"
+" }\n"
+" }\n"
+" else if (this.lastKey==40) // Down\n"
+" {\n"
+" var newIndex = childIndex+1;\n"
+" var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);\n"
+" if (!elem) // last child, jump to parent next parent\n"
+" {\n"
+" elem = this.NavNext(itemIndex+1);\n"
+" }\n"
+" if (elem)\n"
+" {\n"
+" elem.focus();\n"
+" } \n"
+" }\n"
+" else if (this.lastKey==27) // Escape\n"
+" {\n"
+" parent.searchBox.CloseResultsWindow();\n"
+" parent.document.getElementById(\"MSearchField\").focus();\n"
+" }\n"
+" else if (this.lastKey==13) // Enter\n"
+" {\n"
+" return true;\n"
+" }\n"
+" return false;\n"
+" }\n"
+"}\n"
diff --git a/src/search_php.h b/src/search_php.h
new file mode 100644
index 0000000..1ebedf1
--- /dev/null
+++ b/src/search_php.h
@@ -0,0 +1,317 @@
+"function readInt($file)\n"
+"{\n"
+" $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));\n"
+" $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file));\n"
+" return ($b1<<24)|($b2<<16)|($b3<<8)|$b4;\n"
+"}\n"
+"\n"
+"function readString($file)\n"
+"{\n"
+" $result=\"\";\n"
+" while (ord($c=fgetc($file))) $result.=$c;\n"
+" return $result;\n"
+"}\n"
+"\n"
+"function readHeader($file)\n"
+"{\n"
+" $header =fgetc($file); $header.=fgetc($file);\n"
+" $header.=fgetc($file); $header.=fgetc($file);\n"
+" return $header;\n"
+"}\n"
+"\n"
+"function computeIndex($word)\n"
+"{\n"
+" // Simple hashing that allows for substring search\n"
+" if (strlen($word)<2) return -1;\n"
+" // high char of the index\n"
+" $hi = ord($word{0});\n"
+" if ($hi==0) return -1;\n"
+" // low char of the index\n"
+" $lo = ord($word{1});\n"
+" if ($lo==0) return -1;\n"
+" // return index\n"
+" return $hi*256+$lo;\n"
+"}\n"
+"\n"
+"function search($file,$word,&$statsList)\n"
+"{\n"
+" $index = computeIndex($word);\n"
+" if ($index!=-1) // found a valid index\n"
+" {\n"
+" fseek($file,$index*4+4); // 4 bytes per entry, skip header\n"
+" $index = readInt($file);\n"
+" if ($index) // found words matching the hash key\n"
+" {\n"
+" $start=sizeof($statsList);\n"
+" $count=$start;\n"
+" fseek($file,$index);\n"
+" $w = readString($file);\n"
+" while ($w)\n"
+" {\n"
+" $statIdx = readInt($file);\n"
+" if ($word==substr($w,0,strlen($word)))\n"
+" { // found word that matches (as substring)\n"
+" $statsList[$count++]=array(\n"
+" \"word\"=>$word,\n"
+" \"match\"=>$w,\n"
+" \"index\"=>$statIdx,\n"
+" \"full\"=>strlen($w)==strlen($word),\n"
+" \"docs\"=>array()\n"
+" );\n"
+" }\n"
+" $w = readString($file);\n"
+" }\n"
+" $totalHi=0;\n"
+" $totalFreqHi=0;\n"
+" $totalFreqLo=0;\n"
+" for ($count=$start;$count<sizeof($statsList);$count++)\n"
+" {\n"
+" $statInfo = &$statsList[$count];\n"
+" $multiplier = 1;\n"
+" // whole word matches have a double weight\n"
+" if ($statInfo[\"full\"]) $multiplier=2;\n"
+" fseek($file,$statInfo[\"index\"]); \n"
+" $numDocs = readInt($file);\n"
+" $docInfo = array();\n"
+" // read docs info + occurrence frequency of the word\n"
+" for ($i=0;$i<$numDocs;$i++)\n"
+" {\n"
+" $idx=readInt($file); \n"
+" $freq=readInt($file); \n"
+" $docInfo[$i]=array(\"idx\" => $idx,\n"
+" \"freq\" => $freq>>1,\n"
+" \"rank\" => 0.0,\n"
+" \"hi\" => $freq&1\n"
+" );\n"
+" if ($freq&1) // word occurs in high priority doc\n"
+" {\n"
+" $totalHi++;\n"
+" $totalFreqHi+=$freq*$multiplier;\n"
+" }\n"
+" else // word occurs in low priority doc\n"
+" {\n"
+" $totalFreqLo+=$freq*$multiplier;\n"
+" }\n"
+" }\n"
+" // read name and url info for the doc\n"
+" for ($i=0;$i<$numDocs;$i++)\n"
+" {\n"
+" fseek($file,$docInfo[$i][\"idx\"]);\n"
+" $docInfo[$i][\"name\"]=readString($file);\n"
+" $docInfo[$i][\"url\"]=readString($file);\n"
+" }\n"
+" $statInfo[\"docs\"]=$docInfo;\n"
+" }\n"
+" $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi;\n"
+" for ($count=$start;$count<sizeof($statsList);$count++)\n"
+" {\n"
+" $statInfo = &$statsList[$count];\n"
+" $multiplier = 1;\n"
+" // whole word matches have a double weight\n"
+" if ($statInfo[\"full\"]) $multiplier=2;\n"
+" for ($i=0;$i<sizeof($statInfo[\"docs\"]);$i++)\n"
+" {\n"
+" $docInfo = &$statInfo[\"docs\"];\n"
+" // compute frequency rank of the word in each doc\n"
+" $freq=$docInfo[$i][\"freq\"];\n"
+" if ($docInfo[$i][\"hi\"])\n"
+" {\n"
+" $statInfo[\"docs\"][$i][\"rank\"]=\n"
+" (float)($freq*$multiplier+$totalFreqLo)/$totalFreq;\n"
+" }\n"
+" else\n"
+" {\n"
+" $statInfo[\"docs\"][$i][\"rank\"]=\n"
+" (float)($freq*$multiplier)/$totalFreq;\n"
+" }\n"
+" }\n"
+" }\n"
+" }\n"
+" }\n"
+" return $statsList;\n"
+"}\n"
+"\n"
+"function combine_results($results,&$docs)\n"
+"{\n"
+" foreach ($results as $wordInfo)\n"
+" {\n"
+" $docsList = &$wordInfo[\"docs\"];\n"
+" foreach ($docsList as $di)\n"
+" {\n"
+" $key=$di[\"url\"];\n"
+" $rank=$di[\"rank\"];\n"
+" if (isset($docs[$key]))\n"
+" {\n"
+" $docs[$key][\"rank\"]+=$rank;\n"
+" }\n"
+" else\n"
+" {\n"
+" $docs[$key] = array(\"url\"=>$key,\n"
+" \"name\"=>$di[\"name\"],\n"
+" \"rank\"=>$rank\n"
+" );\n"
+" }\n"
+" $docs[$key][\"words\"][] = array(\n"
+" \"word\"=>$wordInfo[\"word\"],\n"
+" \"match\"=>$wordInfo[\"match\"],\n"
+" \"freq\"=>$di[\"freq\"]\n"
+" );\n"
+" }\n"
+" }\n"
+" return $docs;\n"
+"}\n"
+"\n"
+"function filter_results($docs,&$requiredWords,&$forbiddenWords)\n"
+"{\n"
+" $filteredDocs=array();\n"
+" while (list ($key, $val) = each ($docs)) \n"
+" {\n"
+" $words = &$docs[$key][\"words\"];\n"
+" $copy=1; // copy entry by default\n"
+" if (sizeof($requiredWords)>0)\n"
+" {\n"
+" foreach ($requiredWords as $reqWord)\n"
+" {\n"
+" $found=0;\n"
+" foreach ($words as $wordInfo)\n"
+" { \n"
+" $found = $wordInfo[\"word\"]==$reqWord;\n"
+" if ($found) break;\n"
+" }\n"
+" if (!$found) \n"
+" {\n"
+" $copy=0; // document contains none of the required words\n"
+" break;\n"
+" }\n"
+" }\n"
+" }\n"
+" if (sizeof($forbiddenWords)>0)\n"
+" {\n"
+" foreach ($words as $wordInfo)\n"
+" {\n"
+" if (in_array($wordInfo[\"word\"],$forbiddenWords))\n"
+" {\n"
+" $copy=0; // document contains a forbidden word\n"
+" break;\n"
+" }\n"
+" }\n"
+" }\n"
+" if ($copy) $filteredDocs[$key]=$docs[$key];\n"
+" }\n"
+" return $filteredDocs;\n"
+"}\n"
+"\n"
+"function compare_rank($a,$b)\n"
+"{\n"
+" if ($a[\"rank\"] == $b[\"rank\"]) \n"
+" {\n"
+" return 0;\n"
+" }\n"
+" return ($a[\"rank\"]>$b[\"rank\"]) ? -1 : 1; \n"
+"}\n"
+"\n"
+"function sort_results($docs,&$sorted)\n"
+"{\n"
+" $sorted = $docs;\n"
+" usort($sorted,\"compare_rank\");\n"
+" return $sorted;\n"
+"}\n"
+"\n"
+"function report_results(&$docs)\n"
+"{\n"
+" echo \"<div class=\\\"header\\\">\";\n"
+" echo \" <div class=\\\"headertitle\\\">\\n\";\n"
+" echo \" <h1>\".search_results().\"</h1>\\n\";\n"
+" echo \" </div>\\n\";\n"
+" echo \"</div>\\n\";\n"
+" echo \"<div class=\\\"searchresults\\\">\\n\";\n"
+" echo \"<table cellspacing=\\\"2\\\">\\n\";\n"
+" $numDocs = sizeof($docs);\n"
+" if ($numDocs==0)\n"
+" {\n"
+" echo \" <tr>\\n\";\n"
+" echo \" <td colspan=\\\"2\\\">\".matches_text(0).\"</td>\\n\";\n"
+" echo \" </tr>\\n\";\n"
+" }\n"
+" else\n"
+" {\n"
+" echo \" <tr>\\n\";\n"
+" echo \" <td colspan=\\\"2\\\">\".matches_text($numDocs);\n"
+" echo \"\\n\";\n"
+" echo \" </td>\\n\";\n"
+" echo \" </tr>\\n\";\n"
+" $num=1;\n"
+" foreach ($docs as $doc)\n"
+" {\n"
+" echo \" <tr>\\n\";\n"
+" echo \" <td align=\\\"right\\\">$num.</td>\";\n"
+" echo \"<td><a class=\\\"el\\\" href=\\\"\".$doc[\"url\"].\"\\\">\".$doc[\"name\"].\"</a></td>\\n\";\n"
+" echo \" <tr>\\n\";\n"
+" echo \" <td></td><td class=\\\"tiny\\\">\".report_matches().\" \";\n"
+" foreach ($doc[\"words\"] as $wordInfo)\n"
+" {\n"
+" $word = $wordInfo[\"word\"];\n"
+" $matchRight = substr($wordInfo[\"match\"],strlen($word));\n"
+" echo \"<b>$word</b>$matchRight(\".$wordInfo[\"freq\"].\") \";\n"
+" }\n"
+" echo \" </td>\\n\";\n"
+" echo \" </tr>\\n\";\n"
+" $num++;\n"
+" }\n"
+" }\n"
+" echo \"</table>\\n\";\n"
+"}\n"
+"\n"
+"function main()\n"
+"{\n"
+" if(strcmp('4.1.0', phpversion()) > 0) \n"
+" {\n"
+" die(\"Error: PHP version 4.1.0 or above required!\");\n"
+" }\n"
+" if (!($file=fopen(\"search/search.idx\",\"rb\"))) \n"
+" {\n"
+" die(\"Error: Search index file could NOT be opened!\");\n"
+" }\n"
+" if (readHeader($file)!=\"DOXS\")\n"
+" {\n"
+" die(\"Error: Header of index file is invalid!\");\n"
+" }\n"
+" $query=\"\";\n"
+" if (array_key_exists(\"query\", $_GET))\n"
+" {\n"
+" $query=$_GET[\"query\"];\n"
+" }\n"
+" end_form(preg_replace(\"/[^a-zA-Z0-9\\-\\_\\.]/i\", \" \", $query ));\n"
+" $results = array();\n"
+" $requiredWords = array();\n"
+" $forbiddenWords = array();\n"
+" $foundWords = array();\n"
+" $word=strtok($query,\" \");\n"
+" while ($word) // for each word in the search query\n"
+" {\n"
+" if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; }\n"
+" if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; }\n"
+" if (!in_array($word,$foundWords))\n"
+" {\n"
+" $foundWords[]=$word;\n"
+" search($file,strtolower($word),$results);\n"
+" }\n"
+" $word=strtok(\" \");\n"
+" }\n"
+" $docs = array();\n"
+" combine_results($results,$docs);\n"
+" // filter out documents with forbidden word or that do not contain\n"
+" // required words\n"
+" $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords);\n"
+" // sort the results based on rank\n"
+" $sorted = array();\n"
+" sort_results($filteredDocs,$sorted);\n"
+" // report results to the user\n"
+" report_results($sorted);\n"
+" echo \"</div>\\n\";\n"
+" end_page();\n"
+" fclose($file);\n"
+"}\n"
+"\n"
+"main();\n"
+"\n"
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
new file mode 100644
index 0000000..01c085a
--- /dev/null
+++ b/src/searchindex.cpp
@@ -0,0 +1,307 @@
+/******************************************************************************
+ *
+ * $Id: searchindex.cpp,v 1.7 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include "searchindex.h"
+#include "config.h"
+#include "util.h"
+#include <qfile.h>
+#include <ctype.h>
+#include <qregexp.h>
+
+
+// file format: (all multi-byte values are stored in big endian format)
+// 4 byte header
+// 256*256*4 byte index (4 bytes)
+// for each index entry: a zero terminated list of words
+// for each word: a \0 terminated string + 4 byte offset to the stats info
+// padding bytes to align at 4 byte boundary
+// for each word: the number of urls (4 bytes)
+// + for each url containing the word 8 bytes statistics
+// (4 bytes index to url string + 4 bytes frequency counter)
+// for each url: a \0 terminated string
+
+const int numIndexEntries = 256*256;
+
+//--------------------------------------------------------------------
+
+IndexWord::IndexWord(const char *word) : m_word(word), m_urls(17)
+{
+ m_urls.setAutoDelete(TRUE);
+ //printf("IndexWord::IndexWord(%s)\n",word);
+}
+
+void IndexWord::addUrlIndex(int idx,bool hiPriority)
+{
+ //printf("IndexWord::addUrlIndex(%d,%d)\n",idx,hiPriority);
+ URLInfo *ui = m_urls.find(idx);
+ if (ui==0)
+ {
+ //printf("URLInfo::URLInfo(%d)\n",idx);
+ ui=new URLInfo(idx,0);
+ m_urls.insert(idx,ui);
+ }
+ ui->freq+=2;
+ if (hiPriority) ui->freq|=1; // mark as high priority document
+}
+
+//--------------------------------------------------------------------
+
+SearchIndex::SearchIndex() : m_words(328829), m_index(numIndexEntries), m_urlIndex(-1)
+{
+ int i;
+ m_words.setAutoDelete(TRUE);
+ m_urls.setAutoDelete(TRUE);
+ m_index.setAutoDelete(TRUE);
+ for (i=0;i<numIndexEntries;i++) m_index.insert(i,new QList<IndexWord>);
+}
+
+void SearchIndex::setCurrentDoc(const char *name,const char *baseName,const char *anchor)
+{
+ if (name==0 || baseName==0) return;
+ //printf("SearchIndex::setCurrentDoc(%s,%s,%s)\n",name,baseName,anchor);
+ QCString url=baseName+Config_getString("HTML_FILE_EXTENSION");
+ if (anchor) url+=(QCString)"#"+anchor;
+ m_urlIndex++;
+ m_urls.insert(m_urlIndex,new URL(name,url));
+}
+
+static int charsToIndex(const char *word)
+{
+ if (word==0) return -1;
+
+ // Fast string hashing algorithm
+ //register ushort h=0;
+ //const char *k = word;
+ //ushort mask=0xfc00;
+ //while ( *k )
+ //{
+ // h = (h&mask)^(h<<6)^(*k++);
+ //}
+ //return h;
+
+ // Simple hashing that allows for substring searching
+ uint c1=word[0];
+ if (c1==0) return -1;
+ uint c2=word[1];
+ if (c2==0) return -1;
+ return c1*256+c2;
+}
+
+void SearchIndex::addWord(const char *word,bool hiPriority,bool recurse)
+{
+ static QRegExp nextPart("[_a-z:][A-Z]");
+ //printf("SearchIndex::addWord(%s,%d)\n",word,hiPriority);
+ QString wStr(word);
+ if (wStr.isEmpty()) return;
+ wStr=wStr.lower();
+ IndexWord *w = m_words[wStr];
+ if (w==0)
+ {
+ int idx=charsToIndex(wStr);
+ if (idx<0) return;
+ w = new IndexWord(wStr);
+ //fprintf(stderr,"addWord(%s) at index %d\n",word,idx);
+ m_index[idx]->append(w);
+ m_words.insert(wStr,w);
+ }
+ w->addUrlIndex(m_urlIndex,hiPriority);
+ int i;
+ bool found=FALSE;
+ if (!recurse) // the first time we check if we can strip the prefix
+ {
+ i=getPrefixIndex(word);
+ if (i>0)
+ {
+ addWord(word+i,hiPriority,TRUE);
+ found=TRUE;
+ }
+ }
+ if (!found) // no prefix stripped
+ {
+ if ((i=nextPart.match(word))>=1)
+ {
+ addWord(word+i+1,hiPriority,TRUE);
+ }
+ }
+}
+
+
+static void writeInt(QFile &f,int index)
+{
+ f.putch(((uint)index)>>24);
+ f.putch((((uint)index)>>16)&0xff);
+ f.putch((((uint)index)>>8)&0xff);
+ f.putch(((uint)index)&0xff);
+}
+
+static void writeString(QFile &f,const char *s)
+{
+ const char *p = s;
+ while (*p) f.putch(*p++);
+ f.putch(0);
+}
+
+void SearchIndex::write(const char *fileName)
+{
+ int i;
+ int size=4; // for the header
+ size+=4*numIndexEntries; // for the index
+ int wordsOffset = size;
+ // first pass: compute the size of the wordlist
+ for (i=0;i<numIndexEntries;i++)
+ {
+ QList<IndexWord> *wlist = m_index[i];
+ if (!wlist->isEmpty())
+ {
+ QListIterator<IndexWord> iwi(*wlist);
+ IndexWord *iw;
+ for (iwi.toFirst();(iw=iwi.current());++iwi)
+ {
+ int ws = iw->word().length()+1;
+ size+=ws+4; // word + url info list offset
+ }
+ size+=1; // zero list terminator
+ }
+ }
+
+ // second pass: compute the offsets in the index
+ int indexOffsets[numIndexEntries];
+ int offset=wordsOffset;
+ for (i=0;i<numIndexEntries;i++)
+ {
+ QList<IndexWord> *wlist = m_index[i];
+ if (!wlist->isEmpty())
+ {
+ indexOffsets[i]=offset;
+ QListIterator<IndexWord> iwi(*wlist);
+ IndexWord *iw;
+ for (iwi.toFirst();(iw=iwi.current());++iwi)
+ {
+ offset+= iw->word().length()+1;
+ offset+=4; // word + offset to url info array
+ }
+ offset+=1; // zero list terminator
+ }
+ else
+ {
+ indexOffsets[i]=0;
+ }
+ }
+ int padding = size;
+ size = (size+3)&~3; // round up to 4 byte boundary
+ padding = size - padding;
+
+ //int statsOffset = size;
+ QDictIterator<IndexWord> wdi(m_words);
+ //IndexWord *iw;
+ int *wordStatOffsets = new int[m_words.count()];
+
+ int count=0;
+
+ // third pass: compute offset to stats info for each word
+ for (i=0;i<numIndexEntries;i++)
+ {
+ QList<IndexWord> *wlist = m_index[i];
+ if (!wlist->isEmpty())
+ {
+ QListIterator<IndexWord> iwi(*wlist);
+ IndexWord *iw;
+ for (iwi.toFirst();(iw=iwi.current());++iwi)
+ {
+ //printf("wordStatOffsets[%d]=%d\n",count,size);
+ wordStatOffsets[count++] = size;
+ size+=4+iw->urls().count()*8; // count + (url_index,freq) per url
+ }
+ }
+ }
+ int *urlOffsets = new int[m_urls.count()];
+ //int urlsOffset = size;
+ QIntDictIterator<URL> udi(m_urls);
+ URL *url;
+ for (udi.toFirst();(url=udi.current());++udi)
+ {
+ urlOffsets[udi.currentKey()]=size;
+ size+=url->name.length()+1+
+ url->url.length()+1;
+ }
+ //printf("Total size %x bytes (word=%x stats=%x urls=%x)\n",size,wordsOffset,statsOffset,urlsOffset);
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ {
+ // write header
+ f.putch('D'); f.putch('O'); f.putch('X'); f.putch('S');
+ // write index
+ for (i=0;i<numIndexEntries;i++)
+ {
+ writeInt(f,indexOffsets[i]);
+ }
+ // write word lists
+ count=0;
+ for (i=0;i<numIndexEntries;i++)
+ {
+ QList<IndexWord> *wlist = m_index[i];
+ if (!wlist->isEmpty())
+ {
+ QListIterator<IndexWord> iwi(*wlist);
+ IndexWord *iw;
+ for (iwi.toFirst();(iw=iwi.current());++iwi)
+ {
+ writeString(f,iw->word());
+ writeInt(f,wordStatOffsets[count++]);
+ }
+ f.putch(0);
+ }
+ }
+ // write extra padding bytes
+ for (i=0;i<padding;i++) f.putch(0);
+ // write word statistics
+ for (i=0;i<numIndexEntries;i++)
+ {
+ QList<IndexWord> *wlist = m_index[i];
+ if (!wlist->isEmpty())
+ {
+ QListIterator<IndexWord> iwi(*wlist);
+ IndexWord *iw;
+ for (iwi.toFirst();(iw=iwi.current());++iwi)
+ {
+ int numUrls = iw->urls().count();
+ writeInt(f,numUrls);
+ QIntDictIterator<URLInfo> uli(iw->urls());
+ URLInfo *ui;
+ for (uli.toFirst();(ui=uli.current());++uli)
+ {
+ writeInt(f,urlOffsets[ui->urlIdx]);
+ writeInt(f,ui->freq);
+ }
+ }
+ }
+ }
+ // write urls
+ QIntDictIterator<URL> udi(m_urls);
+ URL *url;
+ for (udi.toFirst();(url=udi.current());++udi)
+ {
+ writeString(f,url->name);
+ writeString(f,url->url);
+ }
+ }
+
+ delete[] urlOffsets;
+ delete[] wordStatOffsets;
+}
+
diff --git a/src/searchindex.h b/src/searchindex.h
new file mode 100644
index 0000000..7841ba1
--- /dev/null
+++ b/src/searchindex.h
@@ -0,0 +1,71 @@
+/******************************************************************************
+ *
+ * $Id: searchindex.h,v 1.7 2001/03/19 19:27:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _SEARCHINDEX_H
+#define _SEARCHINDEX_H
+
+#include "qtbc.h"
+#include <qintdict.h>
+#include <qlist.h>
+#include <qdict.h>
+#include <qintdict.h>
+#include <qvector.h>
+
+struct URL
+{
+ URL(const char *n,const char *u) : name(n), url(u) {}
+ QCString name;
+ QCString url;
+};
+
+
+struct URLInfo
+{
+ URLInfo(int idx,int f) : urlIdx(idx), freq(f) {}
+ int urlIdx;
+ int freq;
+};
+
+class IndexWord
+{
+ public:
+ IndexWord(const char *word);
+ void addUrlIndex(int,bool);
+ const QIntDict<URLInfo> &urls() const { return m_urls; }
+ QCString word() const { return m_word; }
+
+ private:
+ QCString m_word;
+ QIntDict<URLInfo> m_urls;
+};
+
+class SearchIndex
+{
+ public:
+ SearchIndex();
+ void setCurrentDoc(const char *name,const char *baseName,const char *anchor=0);
+ void addWord(const char *word,bool hiPriority,bool recurse=FALSE);
+ void write(const char *file);
+ private:
+ QDict<IndexWord> m_words;
+ QVector< QList<IndexWord> > m_index;
+ QIntDict<URL> m_urls;
+ int m_urlIndex;
+};
+
+
+#endif
diff --git a/src/section.h b/src/section.h
new file mode 100644
index 0000000..4e2ce40
--- /dev/null
+++ b/src/section.h
@@ -0,0 +1,63 @@
+/******************************************************************************
+ *
+ * $Id: section.h,v 1.7 2001/03/19 19:27:41 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SECTION_H
+#define SECTION_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qdict.h>
+#include "sortdict.h"
+
+class Definition;
+
+struct SectionInfo
+{
+ enum SectionType { Page, Section, Subsection,
+ Subsubsection, Paragraph, Anchor
+ };
+ SectionInfo(const char *f,const char *l,const char *t,
+ SectionType st,const char *r=0) :
+ label(l), title(t), type(st), ref(r), definition(0),
+ fileName(f), generated(FALSE)
+ {
+ }
+ SectionInfo(const SectionInfo &s)
+ {
+ label=s.label.copy(); title=s.title.copy(); ref=s.ref.copy();
+ type =s.type; definition=s.definition;
+ fileName=s.fileName.copy(); generated=s.generated;
+ }
+ ~SectionInfo() {}
+ QCString label;
+ QCString title;
+ SectionType type;
+ QCString ref;
+ Definition *definition;
+ QCString fileName;
+ bool generated;
+};
+
+class SectionDict : public QDict<SectionInfo>
+{
+ public:
+ SectionDict(int size) : QDict<SectionInfo>(size) {}
+ ~SectionDict() {}
+};
+
+#endif
diff --git a/src/sizzle.js b/src/sizzle.js
new file mode 100644
index 0000000..250fd84
--- /dev/null
+++ b/src/sizzle.js
@@ -0,0 +1,9 @@
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ * Copyright 2009, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0)
+{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function()
+{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
diff --git a/src/sizzle_js.h b/src/sizzle_js.h
new file mode 100644
index 0000000..626ce22
--- /dev/null
+++ b/src/sizzle_js.h
@@ -0,0 +1,9 @@
+"/*\n"
+" * Sizzle CSS Selector Engine - v0.9.3\n"
+" * Copyright 2009, The Dojo Foundation\n"
+" * Released under the MIT, BSD, and GPL Licenses.\n"
+" * More information: http://sizzlejs.com/\n"
+" */\n"
+"(function(){var R=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^[\\]]*\\]|['\"][^'\"]*['\"]|[^[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!==\"string\"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=\"\"}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw\"Syntax error, unrecognized expression: \"+(ah||Y)}if(H.call(ai)===\"[object Array]\"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!==\"\\\\\"){X[1]=(X[1]||\"\").replace(/\\\\/g,\"\");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],\"\");break}}}}if(!Z){Z=T.getElementsByTagName(\"*\")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],\"\");if(!T){return[]}break}}}if(ad==V){if(T==null){throw\"Syntax error, unrecognized expression: \"+ad}else{break}}V=ad}return aa};var I=F.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF_-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF_-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF_-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF_-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(['\"]*)(.*?)\\3|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*_-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\((even|odd|[\\dn+-]*)\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF_-]|\\\\.)+)(?:\\((['\"]*)((?:\\([^\\)]+\\)|[^\\2\\(\\)]*)+)\\2\\))?/},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(T){return T.getAttribute(\"href\")}},relative:{\"+\":function(aa,T,Z){var X=typeof T===\"string\",ab=X&&!/\\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},\">\":function(Z,U,aa){var X=typeof U===\"string\";if(X&&!/\\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},\"\":function(W,U,Y){var V=L++,T=S;if(!U.match(/\\W/)){var X=U=Y?U:U.toUpperCase();T=P}T(\"parentNode\",U,V,W,X,Y)},\"~\":function(W,U,Y){var V=L++,T=S;if(typeof U===\"string\"&&!U.match(/\\W/)){var X=U=Y?U:U.toUpperCase();T=P}T(\"previousSibling\",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!==\"undefined\"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!==\"undefined\"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute(\"name\")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=\" \"+W[1].replace(/\\\\/g,\"\")+\" \";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(\" \"+Y.className+\" \").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\\\/g,\"\")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]==\"nth\"){var U=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.exec(T[2]==\"even\"&&\"2n\"||T[2]==\"odd\"&&\"2n+1\"||!/\\D/.test(T[2])&&\"0n+\"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\\\/g,\"\");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]===\"~=\"){X[4]=\" \"+X[4]+\" \"}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]===\"not\"){if(X[3].match(R).length>1||/^\\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!==\"hidden\"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\\d/i.test(T.nodeName)},text:function(T){return\"text\"===T.type},radio:function(T){return\"radio\"===T.type},checkbox:function(T){return\"checkbox\"===T.type},file:function(T){return\"file\"===T.type},password:function(T){return\"password\"===T.type},submit:function(T){return\"submit\"===T.type},image:function(T){return\"image\"===T.type},reset:function(T){return\"reset\"===T.type},button:function(T){return\"button\"===T.type||T.nodeName.toUpperCase()===\"BUTTON\"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U===\"contains\"){return(Z.textContent||Z.innerText||\"\").indexOf(V[3])>=0}else{if(U===\"not\"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case\"only\":case\"first\":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z==\"first\"){return true}U=T;case\"last\":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case\"nth\":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute(\"id\")===T},TAG:function(U,T){return(T===\"*\"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(\" \"+(U.className||U.getAttribute(\"class\"))+\" \").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+\"\",X=W[2],U=W[4];return T==null?X===\"!=\":X===\"=\"?Z===U:X===\"*=\"?Z.indexOf(U)>=0:X===\"~=\"?(\" \"+Z+\" \").indexOf(U)>=0:!U?Z&&T!==false:X===\"!=\"?Z!=U:X===\"^=\"?Z.indexOf(U)===0:X===\"$=\"?Z.substr(Z.length-U.length)===U:X===\"|=\"?Z===U||Z.substr(0,U.length+1)===U+\"-\":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)===\"[object Array]\"){Array.prototype.push.apply(U,X)}else{if(typeof X.length===\"number\"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if(\"sourceIndex\" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement(\"form\"),V=\"script\"+(new Date).getTime();U.innerHTML=\"<input name='\"+V+\"'/>\";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!==\"undefined\"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!==\"undefined\"&&W.getAttributeNode(\"id\").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!==\"undefined\"&&Y.getAttributeNode(\"id\");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement(\"div\");T.appendChild(document.createComment(\"\"));if(T.getElementsByTagName(\"*\").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]===\"*\"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML=\"<a href='#'></a>\";if(T.firstChild&&typeof T.firstChild.getAttribute!==\"undefined\"&&T.firstChild.getAttribute(\"href\")!==\"#\"){I.attrHandle.href=function(U){return U.getAttribute(\"href\",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement(\"div\");U.innerHTML=\"<p class='TEST'></p>\";if(U.querySelectorAll&&U.querySelectorAll(\".TEST\").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement(\"div\");T.innerHTML=\"<div class='test e'></div><div class='test'></div>\";if(T.getElementsByClassName(\"e\").length===0){return}T.lastChild.className=\"e\";if(T.getElementsByClassName(\"e\").length===1){return}I.order.splice(1,0,\"CLASS\");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!==\"undefined\"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U==\"previousSibling\"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U==\"previousSibling\"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!==\"string\"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!==\"HTML\"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X=\"\",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,\"\")}T=I.relative[T]?T+\"*\":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[\":\"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=\":not(\"+V+\")\"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,\"events\")||o.data(I,\"events\",{}),J=o.data(I,\"handle\")||o.data(I,\"handle\",function(){return typeof o!==\"undefined\"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\\s+/),function(M,N){var O=N.split(\".\");N=O.shift();H.type=O.slice().sort().join(\".\");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent(\"on\"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,\"events\"),F,E;if(G){if(H===g||(typeof H===\"string\"&&H.charAt(0)==\".\")){for(var I in G){this.remove(K,I+(H||\"\"))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\\s+/),function(M,O){var Q=O.split(\".\");O=Q.shift();var N=RegExp(\"(^|\\\\.)\"+Q.slice().sort().join(\".*\\\\.\")+\"(\\\\.|$)\");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,\"handle\"),false)}else{if(K.detachEvent){K.detachEvent(\"on\"+O,o.data(K,\"handle\"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,\"handle\");if(L){L.elem=null}o.removeData(K,\"events\");o.removeData(K,\"handle\")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I===\"object\"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf(\"!\")>=0)\n"
+"{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,\"handle\");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,\"a\")&&G==\"click\"))&&H[\"on\"+G]&&H[\"on\"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,\"a\")&&G==\"click\")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(\".\");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp(\"(^|\\\\.)\"+L.slice().sort().join(\".*\\\\.\")+\"(\\\\.|$)\");E=(o.data(this,\"events\")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:\"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which\".split(\" \"),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp(\"(^|\\\\.)\"+G[0]+\"(\\\\.|$)\");o.each((o.data(this,\"events\").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:\"mouseenter\",mouseout:\"mouseleave\"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F==\"unload\"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp(\"(^|\\\\.)\"+H.type+\"(\\\\.|$)\"),G=true,F=[];o.each(o.data(this,\"events\").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,\"closest\")-o.data(I.elem,\"closest\")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return[\"live\",F,E.replace(/\\./g,\"`\").replace(/ /g,\"|\")].join(\".\")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler(\"ready\")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener(\"DOMContentLoaded\",function(){document.removeEventListener(\"DOMContentLoaded\",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent(\"onreadystatechange\",function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll(\"left\")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,\"load\",o.ready)}o.each((\"blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error\").split(\",\"),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind(\"unload\",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement(\"script\"),K=document.createElement(\"div\"),J=\"script\"+(new Date).getTime();K.style.display=\"none\";K.innerHTML=' <link/><table></table><a href=\"/a\" style=\"color:red;float:left;opacity:.5;\">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName(\"*\"),E=K.getElementsByTagName(\"a\")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName(\"tbody\").length,objectAll:!!K.getElementsByTagName(\"object\")[0].getElementsByTagName(\"*\").length,htmlSerialize:!!K.getElementsByTagName(\"link\").length,style:/red/.test(E.getAttribute(\"style\")),hrefNormalized:E.getAttribute(\"href\")===\"/a\",opacity:E.style.opacity===\"0.5\",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type=\"text/javascript\";try{G.appendChild(document.createTextNode(\"window.\"+J+\"=1;\"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent(\"onclick\",function(){o.support.noCloneEvent=false;K.detachEvent(\"onclick\",arguments.callee)});K.cloneNode(true).fireEvent(\"onclick\")}o(function(){var L=document.createElement(\"div\");L.style.width=L.style.paddingLeft=\"1px\";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display=\"none\"})})();var w=o.support.cssFloat?\"cssFloat\":\"styleFloat\";o.props={\"for\":\"htmlFor\",\"class\":\"className\",\"float\":w,cssFloat:w,styleFloat:w,readonly:\"readOnly\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",rowspan:\"rowSpan\",tabindex:\"tabIndex\"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!==\"string\"){return this._load(G)}var I=G.indexOf(\" \");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H=\"GET\";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J===\"object\"){J=o.param(J);H=\"POST\"}}}var F=this;o.ajax({url:G,type:H,dataType:\"html\",data:J,complete:function(M,L){if(L==\"success\"||L==\"notmodified\"){F.html(E?o(\"<div/>\").append(M.responseText.replace(/<script(.|\\s)*?\\/script>/g,\"\")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each(\"ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend\".split(\",\"),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:\"GET\",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,\"script\")},getJSON:function(E,F,G){return o.get(E,F,G,\"json\")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:\"POST\",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:\"GET\",contentType:\"application/x-www-form-urlencoded\",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject(\"Microsoft.XMLHTTP\"):new XMLHttpRequest()},accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",script:\"text/javascript, application/javascript\",json:\"application/json, text/javascript\",text:\"text/plain\",_default:\"*/*\"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!==\"string\"){M.data=o.param(M.data)}if(M.dataType==\"jsonp\"){if(G==\"GET\"){if(!M.url.match(F)){M.url+=(M.url.match(/\\?/)?\"&\":\"?\")+(M.jsonp||\"callback\")+\"=?\"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+\"&\":\"\")+(M.jsonp||\"callback\")+\"=?\"}}M.dataType=\"json\"}if(M.dataType==\"json\"&&(M.data&&M.data.match(F)||M.url.match(F))){W=\"jsonp\"+r++;if(M.data){M.data=(M.data+\"\").replace(F,\"=\"+W+\"$1\")}M.url=M.url.replace(F,\"=\"+W+\"$1\");M.dataType=\"script\";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType==\"script\"&&M.cache==null){M.cache=false}if(M.cache===false&&G==\"GET\"){var E=e();var U=M.url.replace(/(\\?|&)_=.*?(&|$)/,\"$1_=\"+E+\"$2\");M.url=U+((U==M.url)?(M.url.match(/\\?/)?\"&\":\"?\")+\"_=\"+E:\"\")}if(M.data&&G==\"GET\"){M.url+=(M.url.match(/\\?/)?\"&\":\"?\")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger(\"ajaxStart\")}var Q=/^(\\w+:)?\\/\\/([^\\/?#]+)/.exec(M.url);if(M.dataType==\"script\"&&G==\"GET\"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName(\"head\")[0];var T=document.createElement(\"script\");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState==\"loaded\"||this.readyState==\"complete\")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader(\"Content-Type\",M.contentType)}if(M.ifModified){J.setRequestHeader(\"If-Modified-Since\",o.lastModified[M.url]||\"Thu, 01 Jan 1970 00:00:00 GMT\")}J.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");J.setRequestHeader(\"Accept\",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+\", */*\":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger(\"ajaxStop\")}J.abort();return false}if(M.global){o.event.trigger(\"ajaxSend\",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger(\"ajaxStop\")}}}else{if(!K&&J&&(J.readyState==4||X==\"timeout\")){K=true;if(P){clearInterval(P);P=null}R=X==\"timeout\"?\"timeout\":!o.httpSuccess(J)?\"error\":M.ifModified&&o.httpNotModified(J,M.url)?\"notmodified\":\"success\";if(R==\"success\"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R=\"parsererror\"}}if(R==\"success\"){var Y;try{Y=J.getResponseHeader(\"Last-Modified\")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N(\"timeout\")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger(\"ajaxSuccess\",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger(\"ajaxComplete\",[J,M])}if(M.global&&!--o.active){o.event.trigger(\"ajaxStop\")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger(\"ajaxError\",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol==\"file:\"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader(\"Last-Modified\");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader(\"content-type\"),E=H==\"xml\"||!H&&F&&F.indexOf(\"xml\")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName==\"parsererror\"){throw\"parsererror\"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I===\"string\"){if(H==\"script\"){o.globalEval(I)}if(H==\"json\"){I=l[\"eval\"](\"(\"+I+\")\")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+\"=\"+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join(\"&\").replace(/%20/g,\"+\")}});var m={},n,d=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function()\n"
+"{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t(\"show\",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],\"olddisplay\");this[H].style.display=E||\"\";if(o.css(this[H],\"display\")===\"none\"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o(\"<\"+G+\" />\").appendTo(\"body\");K=I.css(\"display\");if(K===\"none\"){K=\"block\"}I.remove();m[G]=K}o.data(this[H],\"olddisplay\",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],\"olddisplay\")||\"\"}return this}},hide:function(H,I){if(H){return this.animate(t(\"hide\",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],\"olddisplay\");if(!E&&E!==\"none\"){o.data(this[G],\"olddisplay\",o.css(this[G],\"display\"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display=\"none\"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G===\"boolean\";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(\":hidden\");o(this)[H?\"show\":\"hide\"]()}):this.animate(t(\"toggle\",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?\"each\":\"queue\"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(\":hidden\"),J=this;for(M in I){if(I[M]==\"hide\"&&L||I[M]==\"show\"&&!L){return K.complete.call(this)}if((M==\"height\"||M==\"width\")&&this.style){K.display=o.css(this,\"display\");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow=\"hidden\"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S==\"toggle\"?L?\"show\":\"hide\":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||\"px\";if(P!=\"px\"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]==\"-=\"?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,\"\")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t(\"show\",1),slideUp:t(\"hide\",1),slideToggle:t(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G===\"object\"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration===\"number\"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop==\"height\"||this.prop==\"width\")&&this.elem.style){this.elem.style.display=\"block\"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||\"px\";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop==\"width\"||this.prop==\"height\"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,\"display\")==\"none\"){this.elem.style.display=\"block\"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?\"swing\":\"linear\")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,\"opacity\",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!==\"visible\"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position===\"relative\"||E.position===\"static\"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position===\"fixed\"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement(\"div\"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style=\"position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;\"><div></div></div><table style=\"position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;\" cellpadding=\"0\" cellspacing=\"0\"><tr><td></td></tr></table>';M={position:\"absolute\",top:0,left:0,margin:0,border:0,width:\"1px\",height:\"1px\",visibility:\"hidden\"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow=\"hidden\",H.style.position=\"relative\";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop=\"1px\";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,\"marginTop\",true),10)||0,F+=parseInt(o.curCSS(E,\"marginLeft\",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,\"marginTop\");J.left-=j(this,\"marginLeft\");E.top+=j(G,\"borderTopWidth\");E.left+=j(G,\"borderLeftWidth\");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,\"position\")==\"static\")){E=E.offsetParent}return o(E)}});o.each([\"Left\",\"Top\"],function(F,E){var G=\"scroll\"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?\"pageYOffset\":\"pageXOffset\"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each([\"Height\",\"Width\"],function(I,G){var E=I?\"Left\":\"Top\",H=I?\"Right\":\"Bottom\",F=G.toLowerCase();o.fn[\"inner\"+G]=function(){return this[0]?o.css(this[0],F,false,\"padding\"):null};o.fn[\"outer\"+G]=function(K){return this[0]?o.css(this[0],F,false,K?\"margin\":\"border\"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode==\"CSS1Compat\"&&document.documentElement[\"client\"+G]||document.body[\"client\"+G]:this[0]==document?Math.max(document.documentElement[\"client\"+G],document.body[\"scroll\"+G],document.documentElement[\"scroll\"+G],document.body[\"offset\"+G],document.documentElement[\"offset\"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K===\"string\"?K:K+\"px\")}})})();\n"
diff --git a/src/sortdict.h b/src/sortdict.h
new file mode 100644
index 0000000..cdef9f9
--- /dev/null
+++ b/src/sortdict.h
@@ -0,0 +1,647 @@
+/******************************************************************************
+ *
+ * $Id: sortdict.h,v 1.3 2001/03/19 19:27:41 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _SORTDICT_H
+#define _SORTDICT_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qdict.h>
+#include <qintdict.h>
+
+#define AUTORESIZE 1
+
+#if AUTORESIZE
+const uint SDict_primes[] =
+{
+ 17,
+ 29,
+ 47,
+ 71,
+ 113,
+ 179,
+ 293,
+ 457,
+ 733,
+ 1171,
+ 1871,
+ 2999,
+ 4787,
+ 7669,
+ 12251,
+ 19603,
+ 31379,
+ 50177,
+ 80287,
+ 128449,
+ 205519,
+ 328829,
+ 526139,
+ 841801,
+ 1346881,
+ 2155007,
+ 3448033,
+ 5516827,
+ 8826919,
+ 14123059,
+ 23538433,
+ 39230771,
+ 65384537,
+ 108974231,
+ 181623707,
+ 302706181,
+ 504510283,
+ 840850487,
+ 0xffffffff
+};
+#endif
+
+template<class T> class SDict;
+template<class T> class SIntDict;
+
+/*! internal wrapper class that redirects compareItems() to the
+ * dictionary
+ */
+template<class T>
+class SList : public QList<T>
+{
+ public:
+ SList(SDict<T> *owner) : m_owner(owner) {}
+ virtual ~SList() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ return m_owner->compareItems(item1,item2);
+ }
+ private:
+ SDict<T> *m_owner;
+};
+
+/*! Ordered dictionary of elements of type T.
+ * Internally uses a QList<T> and a QDict<T>.
+ */
+template<class T>
+class SDict
+{
+ private:
+ SList<T> *m_list;
+ QDict<T> *m_dict;
+ int m_sizeIndex;
+
+ public:
+ /*! Create an ordered dictionary.
+ * \param size The size of the dictionary. Should be a prime number for
+ * best distribution of elements.
+ * \param caseSensitive indicated whether the keys should be sorted
+ * in a case sensitive way.
+ */
+ SDict(int size,bool caseSensitive=TRUE) : m_sizeIndex(0)
+ {
+ m_list = new SList<T>(this);
+#if AUTORESIZE
+ while ((uint)size>SDict_primes[m_sizeIndex]) m_sizeIndex++;
+ m_dict = new QDict<T>(SDict_primes[m_sizeIndex],caseSensitive);
+#else
+ m_dict = new QDict<T>(size,caseSensitive);
+#endif
+ }
+
+ /*! Destroys the dictionary */
+ virtual ~SDict()
+ {
+ delete m_list;
+ delete m_dict;
+ }
+
+ /*! Appends an element to the dictionary. The element is owned by the
+ * dictionary.
+ * \param key The unique key to use to quicky find the item later on.
+ * \param d The compound to add.
+ * \sa find()
+ */
+ void append(const char *key,const T *d)
+ {
+ m_list->append(d);
+ m_dict->insert(key,d);
+#if AUTORESIZE
+ if (m_dict->size()>SDict_primes[m_sizeIndex])
+ {
+ m_dict->resize(SDict_primes[++m_sizeIndex]);
+ }
+#endif
+ }
+
+ /*! Prepends an element to the dictionary. The element is owned by the
+ * dictionary.
+ * \param key The unique key to use to quicky find the item later on.
+ * \param d The compound to add.
+ * \sa find()
+ */
+ void prepend(const char *key,const T *d)
+ {
+ m_list->prepend(d);
+ m_dict->insert(key,d);
+#if AUTORESIZE
+ if (m_dict->size()>SDict_primes[m_sizeIndex])
+ {
+ m_dict->resize(SDict_primes[++m_sizeIndex]);
+ }
+#endif
+ }
+
+ /*! Remove an item from the dictionary */
+ bool remove(const char *key)
+ {
+ T *item = m_dict->take(key);
+ return item ? m_list->remove(item) : FALSE;
+ }
+
+ /*! Take an item out of the dictionary without deleting it */
+ T *take(const char *key)
+ {
+ T *item = m_dict->take(key);
+ if (item)
+ {
+ int i = m_list->find(item);
+ m_list->take(i);
+ }
+ return item;
+ }
+
+ /*! Sorts the members of the dictionary. First appending a number
+ * of members and then sorting them is faster (O(NlogN) than using
+ * inSort() for each member (O(N^2)).
+ */
+ void sort()
+ {
+ m_list->sort();
+ }
+ /*! Inserts a compound into the dictionary in a sorted way.
+ * \param key The unique key to use to quicky find the item later on.
+ * \param d The compound to add.
+ * \sa find()
+ */
+ void inSort(const char *key,const T *d)
+ {
+ m_list->inSort(d);
+ m_dict->insert(key,d);
+#if AUTORESIZE
+ if (m_dict->size()>SDict_primes[m_sizeIndex])
+ {
+ m_dict->resize(SDict_primes[++m_sizeIndex]);
+ }
+#endif
+ }
+
+ /*! Indicates whether or not the dictionary owns its elements */
+ void setAutoDelete(bool val)
+ {
+ m_list->setAutoDelete(val);
+ }
+
+ /*! Looks up a compound given its key.
+ * \param key The key to identify this element.
+ * \return The requested compound or zero if it cannot be found.
+ * \sa append()
+ */
+ T *find(const char *key)
+ {
+ return m_dict->find(key);
+ }
+ T *find(const QCString &key)
+ {
+ return m_dict->find(key);
+ }
+ T *find(const QString &key)
+ {
+ return m_dict->find(key);
+ }
+
+ /*! Equavalent to find(). */
+ T *operator[](const char *key) const
+ {
+ return m_dict->find(key);
+ }
+
+ /*! Returns the item at position \a i in the sorted dictionary */
+ T *at(uint i)
+ {
+ return m_list->at(i);
+ }
+
+ /*! Function that is used to compare two items when sorting.
+ * Overload this to properly sort items.
+ * \sa inSort()
+ */
+ virtual int compareItems(GCI item1,GCI item2)
+ {
+ return item1!=item2;
+ }
+
+ /*! Clears the dictionary. Will delete items if setAutoDelete() was
+ * set to \c TRUE.
+ * \sa setAutoDelete
+ */
+ void clear()
+ {
+ m_list->clear();
+ m_dict->clear();
+ }
+
+ /*! Returns the number of items stored in the dictionary
+ */
+ int count() const
+ {
+ return m_list->count();
+ }
+
+ class Iterator; // first forward declare
+ friend class Iterator; // then make it a friend
+ /*! Simple iterator for SDict. It iterates in the order in which the
+ * elements are stored.
+ */
+ class Iterator
+ {
+ public:
+ /*! Create an iterator given the dictionary. */
+ Iterator(const SDict<T> &dict)
+ {
+ m_li = new QListIterator<T>(*dict.m_list);
+ }
+
+ /*! Destroys the dictionary */
+ virtual ~Iterator()
+ {
+ delete m_li;
+ }
+
+ /*! Set the iterator to the first element in the list.
+ * \return The first compound, or zero if the list was empty.
+ */
+ T *toFirst() const
+ {
+ return m_li->toFirst();
+ }
+
+ /*! Set the iterator to the last element in the list.
+ * \return The first compound, or zero if the list was empty.
+ */
+ T *toLast() const
+ {
+ return m_li->toLast();
+ }
+
+ /*! Returns the current compound */
+ T *current() const
+ {
+ return m_li->current();
+ }
+
+ /*! Moves the iterator to the next element.
+ * \return the new "current" element, or zero if the iterator was
+ * already pointing at the last element.
+ */
+ T *operator++()
+ {
+ return m_li->operator++();
+ }
+
+ /*! Moves the iterator to the previous element.
+ * \return the new "current" element, or zero if the iterator was
+ * already pointing at the first element.
+ */
+ T *operator--()
+ {
+ return m_li->operator--();
+ }
+
+ private:
+ QListIterator<T> *m_li;
+ };
+
+ class IteratorDict; // first forward declare
+ friend class IteratorDict; // then make it a friend
+ /*! Simple iterator for SDict. It iterates in over the dictionary elements
+ * in an unsorted way, but does provide information about the element's key.
+ */
+ class IteratorDict
+ {
+ public:
+ /*! Create an iterator given the dictionary. */
+ IteratorDict(const SDict<T> &dict)
+ {
+ m_di = new QDictIterator<T>(*dict.m_dict);
+ }
+
+ /*! Destroys the dictionary */
+ virtual ~IteratorDict()
+ {
+ delete m_di;
+ }
+
+ /*! Set the iterator to the first element in the list.
+ * \return The first compound, or zero if the list was empty.
+ */
+ T *toFirst() const
+ {
+ return m_di->toFirst();
+ }
+
+ /*! Set the iterator to the last element in the list.
+ * \return The first compound, or zero if the list was empty.
+ */
+ T *toLast() const
+ {
+ return m_di->toLast();
+ }
+
+ /*! Returns the current compound */
+ T *current() const
+ {
+ return m_di->current();
+ }
+
+ /*! Returns the current key */
+ QCString currentKey() const
+ {
+ return m_di->currentKey();
+ }
+
+ /*! Moves the iterator to the next element.
+ * \return the new "current" element, or zero if the iterator was
+ * already pointing at the last element.
+ */
+ T *operator++()
+ {
+ return m_di->operator++();
+ }
+
+ /*! Moves the iterator to the previous element.
+ * \return the new "current" element, or zero if the iterator was
+ * already pointing at the first element.
+ */
+ T *operator--()
+ {
+ return m_di->operator--();
+ }
+
+ private:
+ QDictIterator<T> *m_di;
+ };
+};
+
+/*! internal wrapper class that redirects compareItems() to the
+ * dictionary
+ */
+template<class T>
+class SIntList : public QList<T>
+{
+ public:
+ SIntList(SIntDict<T> *owner) : m_owner(owner) {}
+ virtual ~SIntList() {}
+ int compareItems(GCI item1,GCI item2)
+ {
+ return m_owner->compareItems(item1,item2);
+ }
+ private:
+ SIntDict<T> *m_owner;
+};
+
+/*! Ordered dictionary of elements of type T.
+ * Internally uses a QList<T> and a QIntDict<T>.
+ */
+template<class T>
+class SIntDict
+{
+ private:
+ SIntList<T> *m_list;
+ QIntDict<T> *m_dict;
+ int m_sizeIndex;
+
+ public:
+ /*! Create an ordered dictionary.
+ * \param size The size of the dictionary. Should be a prime number for
+ * best distribution of elements.
+ */
+ SIntDict(int size) : m_sizeIndex(0)
+ {
+ m_list = new SIntList<T>(this);
+#if AUTORESIZE
+ while ((uint)size>SDict_primes[m_sizeIndex]) m_sizeIndex++;
+ m_dict = new QIntDict<T>(SDict_primes[m_sizeIndex]);
+#else
+ m_dict = new QIntDict<T>(size);
+#endif
+ }
+
+ /*! Destroys the dictionary */
+ virtual ~SIntDict()
+ {
+ delete m_list;
+ delete m_dict;
+ }
+
+ /*! Appends a compound to the dictionary. The element is owned by the
+ * dictionary.
+ * \param key The unique key to use to quicky find the item later on.
+ * \param d The compound to add.
+ * \sa find()
+ */
+ void append(int key,const T *d)
+ {
+ m_list->append(d);
+ m_dict->insert(key,d);
+#if AUTORESIZE
+ if (m_dict->size()>SDict_primes[m_sizeIndex])
+ {
+ m_dict->resize(SDict_primes[++m_sizeIndex]);
+ }
+#endif
+ }
+
+ /*! Prepend a compound to the dictionary. The element is owned by the
+ * dictionary.
+ * \param key The unique key to use to quicky find the item later on.
+ * \param d The compound to add.
+ * \sa find()
+ */
+ void prepend(int key,const T *d)
+ {
+ m_list->prepend(d);
+ m_dict->insert(key,d);
+#if AUTORESIZE
+ if (m_dict->size()>SDict_primes[m_sizeIndex])
+ {
+ m_dict->resize(SDict_primes[++m_sizeIndex]);
+ }
+#endif
+ }
+
+ /*! Remove an item from the dictionary */
+ bool remove(int key)
+ {
+ T *item = m_dict->take(key);
+ return item ? m_list->remove(item) : FALSE;
+ }
+
+ /*! Sorts the members of the dictionary. First appending a number
+ * of members and then sorting them is faster (O(NlogN) than using
+ * inSort() for each member (O(N^2)).
+ */
+ void sort()
+ {
+ m_list->sort();
+ }
+
+ /*! Inserts a compound into the dictionary in a sorted way.
+ * \param key The unique key to use to quicky find the item later on.
+ * \param d The compound to add.
+ * \sa find()
+ */
+ void inSort(int key,const T *d)
+ {
+ m_list->inSort(d);
+ m_dict->insert(key,d);
+#if AUTORESIZE
+ if (m_dict->size()>SDict_primes[m_sizeIndex])
+ {
+ m_dict->resize(SDict_primes[++m_sizeIndex]);
+ }
+#endif
+ }
+
+ /*! Indicates whether or not the dictionary owns its elements */
+ void setAutoDelete(bool val)
+ {
+ m_list->setAutoDelete(val);
+ }
+
+ /*! Looks up a compound given its key.
+ * \param key The key to identify this element.
+ * \return The requested compound or zero if it cannot be found.
+ * \sa append()
+ */
+ T *find(int key)
+ {
+ return m_dict->find(key);
+ }
+
+ /*! Equavalent to find(). */
+ T *operator[](int key) const
+ {
+ return m_dict->find(key);
+ }
+
+ /*! Returns the item at position \a i in the sorted dictionary */
+ T *at(uint i)
+ {
+ return m_list->at(i);
+ }
+
+ /*! Function that is used to compare two items when sorting.
+ * Overload this to properly sort items.
+ * \sa inSort()
+ */
+ virtual int compareItems(GCI item1,GCI item2)
+ {
+ return item1!=item2;
+ }
+
+ /*! Clears the dictionary. Will delete items if setAutoDelete() was
+ * set to \c TRUE.
+ * \sa setAutoDelete
+ */
+ void clear()
+ {
+ m_list->clear();
+ m_dict->clear();
+ }
+
+ /*! Returns the number of items stored in the dictionary
+ */
+ int count()
+ {
+ return m_list->count();
+ }
+
+ class Iterator; // first forward declare
+ friend class Iterator; // then make it a friend
+ /*! Simple iterator for SDict. It iterates in the order in which the
+ * elements are stored.
+ */
+ class Iterator
+ {
+ public:
+ /*! Create an iterator given the dictionary. */
+ Iterator(const SIntDict<T> &dict)
+ {
+ m_li = new QListIterator<T>(*dict.m_list);
+ }
+
+ /*! Destroys the dictionary */
+ virtual ~Iterator()
+ {
+ delete m_li;
+ }
+
+ /*! Set the iterator to the first element in the list.
+ * \return The first compound, or zero if the list was empty.
+ */
+ T *toFirst() const
+ {
+ return m_li->toFirst();
+ }
+
+ /*! Set the iterator to the last element in the list.
+ * \return The first compound, or zero if the list was empty.
+ */
+ T *toLast() const
+ {
+ return m_li->toLast();
+ }
+
+ /*! Returns the current compound */
+ T *current() const
+ {
+ return m_li->current();
+ }
+
+ /*! Moves the iterator to the next element.
+ * \return the new "current" element, or zero if the iterator was
+ * already pointing at the last element.
+ */
+ T *operator++()
+ {
+ return m_li->operator++();
+ }
+
+ /*! Moves the iterator to the previous element.
+ * \return the new "current" element, or zero if the iterator was
+ * already pointing at the first element.
+ */
+ T *operator--()
+ {
+ return m_li->operator--();
+ }
+
+ private:
+ QListIterator<T> *m_li;
+ };
+
+};
+
+#endif
diff --git a/src/store.cpp b/src/store.cpp
new file mode 100644
index 0000000..cd52d7e
--- /dev/null
+++ b/src/store.cpp
@@ -0,0 +1,405 @@
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "store.h"
+#include "portable.h"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <assert.h>
+
+#define BLOCK_SIZE 512 // should be >8 and a multiple of 8
+#define BLOCK_POINTER_SIZE sizeof(portable_off_t)
+
+
+#define ASSERTS_ENABLED
+
+#ifdef ASSERTS_ENABLED
+#define STORE_ASSERT(x) assert(x)
+#else
+#define STORE_ASSERT(x)
+#endif
+
+//------------------------------------------------------------------------------------
+
+Store::Store()
+{
+ m_file = 0;
+ m_front = 0;
+ m_head = 0;
+ m_state = Init;
+ m_reads = 0;
+ m_writes = 0;
+}
+
+Store::~Store()
+{
+ if (m_file) fclose(m_file);
+
+ // clean up free list
+ while (m_head)
+ {
+ Node *node = m_head;
+ m_head = node->next;
+ delete node;
+ }
+}
+
+int Store::open(const char *name)
+{
+ int i;
+ STORE_ASSERT(m_state==Init);
+ if (m_file) return 0; // already open
+ m_file = portable_fopen(name,"w+b");
+ if (m_file==0) return -1;
+
+ // first block serves as header, so offset=0 can be used as the end of the list.
+ for (i=0;i<BLOCK_SIZE/8;i++)
+ {
+ fputc('D',m_file);
+ fputc('O',m_file);
+ fputc('X',m_file);
+ fputc('Y',m_file);
+ fputc('G',m_file);
+ fputc('E',m_file);
+ fputc('N',m_file);
+ fputc(0,m_file);
+ }
+ m_front = BLOCK_SIZE;
+ m_head = 0;
+ m_state = Reading;
+ return 0;
+}
+
+void Store::close()
+{
+ if (m_file) fclose(m_file);
+ m_file=0;
+ m_state = Init;
+}
+
+portable_off_t Store::alloc()
+{
+ STORE_ASSERT(m_state==Reading);
+ m_state=Writing;
+ portable_off_t pos;
+ if (m_head==0) // allocate new block
+ {
+ //printf("alloc: new block\n");
+ if (portable_fseek(m_file,0,SEEK_END)==-1) // go to end of the file
+ {
+ fprintf(stderr,"Store::alloc: Error seeking to end of file: %s\n",strerror(errno));
+ exit(1);
+ }
+ pos = portable_ftell(m_file);
+ STORE_ASSERT( (pos & (BLOCK_SIZE-1))==0 );
+ m_front = pos + BLOCK_SIZE; // move front to end of this block
+ }
+ else // reuse freed block
+ {
+ //printf("alloc: reuse block: m_head=%d\n",(int)m_head);
+ Node *node = m_head;
+ pos = node->pos;
+ // point head to next free item
+ m_head = node->next;
+ delete node;
+ // move to start of the block
+ if (portable_fseek(m_file,pos,SEEK_SET)==-1)
+ {
+ fprintf(stderr,"Store::alloc: Error seeking to position %d: %s\n",
+ (int)pos,strerror(errno));
+ exit(1);
+ }
+ STORE_ASSERT( (pos & (BLOCK_SIZE-1))==0 );
+ }
+ //printf("%x: Store::alloc\n",(int)pos);
+ return pos;
+}
+
+int Store::write(const char *buf,uint size)
+{
+ STORE_ASSERT(m_state==Writing);
+ //printf("%x: Store::write\n",(int)portable_ftell(m_file));
+ do
+ {
+ portable_off_t curPos = portable_ftell(m_file);
+ int bytesInBlock = BLOCK_SIZE - BLOCK_POINTER_SIZE - (curPos & (BLOCK_SIZE-1));
+ int bytesLeft = bytesInBlock<(int)size ? (int)size-bytesInBlock : 0;
+ int numBytes = size - bytesLeft;
+ STORE_ASSERT(bytesInBlock>=0);
+ STORE_ASSERT(numBytes<=(int)(BLOCK_SIZE-BLOCK_POINTER_SIZE));
+ if (numBytes>0)
+ {
+ if ((int)fwrite(buf,1,numBytes,m_file)!=numBytes)
+ {
+ fprintf(stderr,"Error writing: %s\n",strerror(errno));
+ exit(1);
+ }
+ m_writes++;
+ }
+ if (bytesLeft>0) // still more bytes to write
+ {
+ STORE_ASSERT(((portable_ftell(m_file)+BLOCK_POINTER_SIZE)&(BLOCK_SIZE-1))==0);
+ // allocate new block
+ if (m_head==0) // no free blocks to reuse
+ {
+ //printf("%x: Store::write: new: pos=%x\n",(int)m_front,(int)portable_ftell(m_file));
+ // write pointer to next block
+ if (fwrite(&m_front,BLOCK_POINTER_SIZE,1,m_file)!=1)
+ {
+ fprintf(stderr,"Error writing to store: %s\n",strerror(errno));
+ exit(1);
+ }
+ STORE_ASSERT(portable_ftell(m_file)==(curPos&~(BLOCK_SIZE-1))+BLOCK_SIZE);
+
+ // move to next block
+ if (portable_fseek(m_file,0,SEEK_END)==-1) // go to end of the file
+ {
+ fprintf(stderr,"Store::alloc: Error seeking to end of file: %s\n",strerror(errno));
+ exit(1);
+ }
+ STORE_ASSERT(portable_ftell(m_file)==m_front);
+ // move front to the next of the block
+ m_front+=BLOCK_SIZE;
+ }
+ else // reuse block from the free list
+ {
+ // write pointer to next block
+ if (fwrite(&m_head->pos,BLOCK_POINTER_SIZE,1,m_file)!=1)
+ {
+ fprintf(stderr,"Error writing to store: %s\n",strerror(errno));
+ exit(1);
+ }
+ Node *node = m_head;
+ portable_off_t pos = node->pos;
+ // point head to next free item
+ m_head = node->next;
+ delete node;
+ // move to start of the block
+ if (portable_fseek(m_file,pos,SEEK_SET)==-1)
+ {
+ fprintf(stderr,"Store::write: Error seeking to position %d: %s\n",
+ (int)pos,strerror(errno));
+ exit(1);
+ }
+ //printf("%x: Store::write: reuse\n",(int)pos);
+ }
+ }
+ size-=numBytes;
+ buf+=numBytes;
+ }
+ while (size>0);
+ return size;
+}
+
+void Store::end()
+{
+ STORE_ASSERT(m_state==Writing);
+ portable_off_t curPos = portable_ftell(m_file);
+ int bytesInBlock = BLOCK_SIZE - (curPos & (BLOCK_SIZE-1));
+ //printf("%x: Store::end erasing %x bytes\n",(int)curPos&~(BLOCK_SIZE-1),bytesInBlock);
+ //printf("end: bytesInBlock=%x\n",bytesInBlock);
+ // zero out rest of the block
+ int i;
+ for (i=0;i<bytesInBlock;i++)
+ {
+ fputc(0,m_file);
+ }
+ m_state=Reading;
+}
+
+void Store::release(portable_off_t pos)
+{
+ STORE_ASSERT(m_state==Reading);
+ //printf("%x: Store::release\n",(int)pos);
+ STORE_ASSERT(pos>0 && (pos & (BLOCK_SIZE-1))==0);
+ // goto end of the block
+ portable_off_t cur = pos, next;
+ while (1)
+ {
+ // add new node to the free list
+ Node *node = new Node;
+ node->next = m_head;
+ node->pos = cur;
+
+ m_head = node;
+ // goto the end of cur block
+ if (portable_fseek(m_file,cur+BLOCK_SIZE-BLOCK_POINTER_SIZE,SEEK_SET)==-1)
+ {
+ fprintf(stderr,"Store::release: Error seeking to position %d: %s\n",
+ (int)(cur+BLOCK_SIZE-BLOCK_POINTER_SIZE),strerror(errno));
+ exit(1);
+ }
+ // read pointer to next block
+ if (fread(&next,BLOCK_POINTER_SIZE,1,m_file)!=1)
+ {
+ fprintf(stderr,"Store::release: Error reading from store: %s\n",strerror(errno));
+ exit(1);
+ }
+ if (next==0) break; // found end of list -> cur is last element
+ STORE_ASSERT((next & (BLOCK_SIZE-1))==0);
+ cur = next;
+ //printf("%x: Store::release\n",(int)cur);
+ }
+}
+
+void Store::seek(portable_off_t pos)
+{
+ STORE_ASSERT(m_state==Reading);
+ //printf("%x: Store::seek\n",(int)pos);
+ if (portable_fseek(m_file,pos,SEEK_SET)==-1)
+ {
+ fprintf(stderr,"Store::seek: Error seeking to position %d: %s\n",
+ (int)pos,strerror(errno));
+ exit(1);
+ }
+ STORE_ASSERT((pos&(BLOCK_SIZE-1))==0);
+}
+
+int Store::read(char *buf,uint size)
+{
+ STORE_ASSERT(m_state==Reading);
+ //printf("%x: Store::read total=%d\n",(int)portable_ftell(m_file),size);
+ do
+ {
+ portable_off_t curPos = portable_ftell(m_file);
+ int bytesInBlock = BLOCK_SIZE - BLOCK_POINTER_SIZE - (curPos & (BLOCK_SIZE-1));
+ int bytesLeft = bytesInBlock<(int)size ? (int)size-bytesInBlock : 0;
+ int numBytes = size - bytesLeft;
+ //printf(" Store::read: pos=%x num=%d left=%d\n",(int)curPos,numBytes,bytesLeft);
+
+ if (numBytes>0)
+ {
+ //printf("%x: Store::read: %d out of %d bytes\n",(int)portable_ftell(m_file),numBytes,size);
+ if ((int)fread(buf,1,numBytes,m_file)!=numBytes)
+ {
+ fprintf(stderr,"Error reading from store: %s\n",strerror(errno));
+ exit(1);
+ }
+ m_reads++;
+ }
+ if (bytesLeft>0)
+ {
+ portable_off_t newPos;
+ // read offset of the next block
+ STORE_ASSERT(((portable_ftell(m_file)+BLOCK_POINTER_SIZE)&(BLOCK_SIZE-1))==0);
+ if (fread((char *)&newPos,BLOCK_POINTER_SIZE,1,m_file)!=1)
+ {
+ fprintf(stderr,"Error reading from store: %s\n",strerror(errno));
+ exit(1);
+ }
+ //printf("%x: Store::read: continue in next block, %d bytes to go\n",(int)newPos,bytesLeft);
+ //printf(" Store::read: next block=%x\n",(int)newPos);
+ STORE_ASSERT(newPos!=0);
+ STORE_ASSERT((newPos&(BLOCK_SIZE-1))==0);
+ curPos = newPos;
+ // move to next block
+ if (portable_fseek(m_file,curPos,SEEK_SET)==-1)
+ {
+ fprintf(stderr,"Store::read: Error seeking to position %d: %s\n",
+ (int)curPos,strerror(errno));
+ exit(1);
+ }
+ }
+
+ size-=numBytes;
+ buf+=numBytes;
+ }
+ while (size>0);
+ return size;
+}
+
+void Store::printFreeList()
+{
+ printf("FreeList: ");
+ portable_off_t pos = m_head->pos;
+ while (pos)
+ {
+ printf("%x ",(int)pos);
+ m_head = m_head->next;
+ }
+ printf("\n");
+}
+
+void Store::printStats()
+{
+ printf("ObjStore: block size %d bytes, total size %ld blocks, wrote %d blocks, read %d blocks\n",
+ BLOCK_SIZE,(long)(m_front/BLOCK_SIZE),m_reads,m_writes);
+}
+
+#ifdef STORE_TEST
+
+int main()
+{
+ printf("sizeof(portable_off_t)=%d\n",(int)sizeof(portable_off_t));
+ Store s;
+ if (s.open("test.db")==0)
+ {
+ const char *str1 = "This is a test message... ";
+ const char *str2 = "Another message. ";
+
+ int i,j;
+ for (j=0;j<5;j++)
+ {
+ char buf[100];
+
+ portable_off_t handle = s.alloc();
+ for (i=0;i<1000000000;i++)
+ {
+ s.write(str1,strlen(str1)+1);
+ }
+ s.end();
+ portable_off_t handle2 = s.alloc();
+ for (i=0;i<10;i++)
+ {
+ s.write(str2,strlen(str2)+1);
+ }
+ s.end();
+
+ s.seek(handle);
+ for (i=0;i<3;i++)
+ {
+ s.read(buf,strlen(str1)+1);
+ printf("i=%d Read: %s\n",i,buf);
+ }
+
+ s.release(handle);
+
+ s.seek(handle2);
+ for (i=0;i<3;i++)
+ {
+ s.read(buf,strlen(str2)+1);
+ printf("i=%d Read: %s\n",i,buf);
+ }
+
+ s.release(handle2);
+ }
+
+ s.close();
+ }
+ else
+ {
+ printf("Open failed! %s\n",strerror(errno));
+ }
+}
+
+#endif
+
diff --git a/src/store.h b/src/store.h
new file mode 100644
index 0000000..3663578
--- /dev/null
+++ b/src/store.h
@@ -0,0 +1,118 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef STORE_H
+#define STORE_H
+
+#include <qglobal.h>
+#include <stdio.h>
+
+#include "portable.h"
+
+/*! @brief Abstract interface for file based memory storage operations */
+class StorageIntf
+{
+ public:
+ /*! Required by gcc */
+ virtual ~StorageIntf() {}
+ /*! Read \a size bytes from the store into \a buf. */
+ virtual int read(char *buf,uint size) = 0;
+ /*! Write \a size bytes from \a buf into the store. */
+ virtual int write(const char *buf,uint size) = 0;
+};
+
+/*! @brief The Store is a file based memory manager.
+ *
+ * You can open the store using open(). Then obtain a handle via alloc()
+ * followed by a sequence of write() commands to store information,
+ * and finalize it using end().
+ *
+ * Later on you locate the information
+ * with seek() using the handle obtained with alloc(), and then use a
+ * sequence of read() calls to read the information back.
+ *
+ * If no longer needed the storage space can be freed using release().
+ *
+ * The store will dynamically grow the file on disk if needed.
+ */
+class Store : public StorageIntf
+{
+ public:
+ /*! Creates a store. */
+ Store();
+
+ /*! Releases the store object. Will close the underlying file if opened. */
+ ~Store();
+
+ /*! Opens the file underlying the store using \a name as the file name.
+ * Returns 0 upon success, or -1 otherwise.
+ */
+ int open(const char *name);
+
+ /*! Allocates a handle to write to and read from. */
+ portable_off_t alloc();
+
+ /*! Writes \a size bytes in array \a buf to the store.
+ * First alloc() has to be called.
+ * \note The information can only be read after end() has been called.
+ */
+ int write(const char *buf,uint size);
+
+ /*! Ends the sequence of writes.
+ * \note After this call, first alloc() has to be called
+ * before new writes can be done.
+ */
+ void end();
+
+ /*! Releases the memory corresponding to the handle returned with alloc() */
+ void release(portable_off_t handle);
+
+ /*! Closes the store */
+ void close();
+
+ /*! Goes to the start of information corresponding to handle \a pos */
+ void seek(portable_off_t handle);
+
+ /*! Reads \a size bytes from the store into the array pointed to be \a buf.
+ * \note Before reading seek() has to be called to set the right start of the store.
+ */
+ int read(char *buf,uint size);
+
+ void printStats();
+
+ private:
+ enum State
+ {
+ Init,
+ Reading,
+ Writing
+ };
+ struct Node
+ {
+ portable_off_t pos;
+ struct Node *next;
+ };
+ void printFreeList();
+ FILE *m_file;
+ portable_off_t m_front;
+ Node *m_head;
+ State m_state;
+ int m_reads;
+ int m_writes;
+};
+
+#endif
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
new file mode 100644
index 0000000..f05a591
--- /dev/null
+++ b/src/tagreader.cpp
@@ -0,0 +1,1406 @@
+/******************************************************************************
+ *
+ * $Id: tagreader.cpp,v 1.2 2001/03/19 19:27:41 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "tagreader.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include <qxml.h>
+#include <qstack.h>
+#include <qdict.h>
+#include <qfileinfo.h>
+#include <qlist.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include "entry.h"
+#include "classdef.h"
+#include "doxygen.h"
+#include "util.h"
+#include "message.h"
+#include "defargs.h"
+//#include "reflist.h"
+
+/*! Information about an linkable anchor */
+class TagAnchorInfo
+{
+ public:
+ TagAnchorInfo(const QString &f,const QString &l) : label(l), fileName(f) {}
+ QString label;
+ QString fileName;
+};
+
+class TagAnchorInfoList : public QList<TagAnchorInfo>
+{
+ public:
+ TagAnchorInfoList() : QList<TagAnchorInfo>() { setAutoDelete(TRUE); }
+ virtual ~TagAnchorInfoList() {}
+};
+
+/*! Container for member specific info that can be read from a tagfile */
+class TagMemberInfo
+{
+ public:
+ TagMemberInfo() : prot(Public), virt(Normal), isStatic(FALSE) {}
+ QString type;
+ QString name;
+ QString anchorFile;
+ QString anchor;
+ QString arglist;
+ QString kind;
+ TagAnchorInfoList docAnchors;
+ Protection prot;
+ Specifier virt;
+ bool isStatic;
+};
+
+/*! Container for class specific info that can be read from a tagfile */
+class TagClassInfo
+{
+ public:
+ enum Kind { Class, Struct, Union, Interface, Exception, Protocol, Category };
+ TagClassInfo() { bases=0, templateArguments=0; members.setAutoDelete(TRUE); isObjC=FALSE; }
+ ~TagClassInfo() { delete bases; delete templateArguments; }
+ QString name;
+ QString filename;
+ TagAnchorInfoList docAnchors;
+ QList<BaseInfo> *bases;
+ QList<TagMemberInfo> members;
+ QList<QString> *templateArguments;
+ QStringList classList;
+ Kind kind;
+ bool isObjC;
+};
+
+/*! Container for namespace specific info that can be read from a tagfile */
+class TagNamespaceInfo
+{
+ public:
+ TagNamespaceInfo() { members.setAutoDelete(TRUE); }
+ QString name;
+ QString filename;
+ QStringList classList;
+ QStringList namespaceList;
+ TagAnchorInfoList docAnchors;
+ QList<TagMemberInfo> members;
+};
+
+/*! Container for package specific info that can be read from a tagfile */
+class TagPackageInfo
+{
+ public:
+ TagPackageInfo() { members.setAutoDelete(TRUE); }
+ QString name;
+ QString filename;
+ TagAnchorInfoList docAnchors;
+ QList<TagMemberInfo> members;
+ QStringList classList;
+};
+
+class TagIncludeInfo
+{
+ public:
+ QString id;
+ QString name;
+ QString text;
+ bool isLocal;
+ bool isImported;
+};
+
+/*! Container for file specific info that can be read from a tagfile */
+class TagFileInfo
+{
+ public:
+ TagFileInfo() { members.setAutoDelete(TRUE); includes.setAutoDelete(TRUE); }
+ QString name;
+ QString path;
+ QString filename;
+ TagAnchorInfoList docAnchors;
+ QList<TagMemberInfo> members;
+ QStringList classList;
+ QStringList namespaceList;
+ QList<TagIncludeInfo> includes;
+};
+
+/*! Container for group specific info that can be read from a tagfile */
+class TagGroupInfo
+{
+ public:
+ TagGroupInfo() { members.setAutoDelete(TRUE); }
+ QString name;
+ QString title;
+ QString filename;
+ TagAnchorInfoList docAnchors;
+ QList<TagMemberInfo> members;
+ QStringList subgroupList;
+ QStringList classList;
+ QStringList namespaceList;
+ QStringList fileList;
+ QStringList pageList;
+ QStringList dirList;
+};
+
+/*! Container for page specific info that can be read from a tagfile */
+class TagPageInfo
+{
+ public:
+ QString name;
+ QString title;
+ QString filename;
+ TagAnchorInfoList docAnchors;
+};
+
+/*! Container for directory specific info that can be read from a tagfile */
+class TagDirInfo
+{
+ public:
+ QString name;
+ QString filename;
+ QString path;
+ QStringList subdirList;
+ QStringList fileList;
+ TagAnchorInfoList docAnchors;
+};
+
+/*! Tag file parser.
+ * Reads an XML-structured tagfile and builds up the structure in
+ * memory. The method buildLists() is used to transfer/translate
+ * the structures to the doxygen engine.
+ */
+class TagFileParser : public QXmlDefaultHandler
+{
+ enum State { Invalid,
+ InClass,
+ InFile,
+ InNamespace,
+ InGroup,
+ InPage,
+ InMember,
+ InPackage,
+ InDir,
+ InTempArgList
+ };
+ class StartElementHandler
+ {
+ typedef void (TagFileParser::*Handler)(const QXmlAttributes &attrib);
+ public:
+ StartElementHandler(TagFileParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
+ void operator()(const QXmlAttributes &attrib) { (m_parent->*m_handler)(attrib); }
+ private:
+ TagFileParser *m_parent;
+ Handler m_handler;
+ };
+
+ class EndElementHandler
+ {
+ typedef void (TagFileParser::*Handler)();
+ public:
+ EndElementHandler(TagFileParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
+ void operator()() { (m_parent->*m_handler)(); }
+ private:
+ TagFileParser *m_parent;
+ Handler m_handler;
+ };
+
+ public:
+ TagFileParser(const char *tagName) : m_startElementHandlers(17),
+ m_endElementHandlers(17),
+ m_tagName(tagName)
+ {
+ m_startElementHandlers.setAutoDelete(TRUE);
+ m_endElementHandlers.setAutoDelete(TRUE);
+ }
+
+ void setDocumentLocator ( QXmlLocator * locator )
+ {
+ m_locator = locator;
+ }
+
+ void setFileName( const QString &fileName )
+ {
+ m_inputFileName = fileName;
+ }
+
+ void warn(const char *fmt)
+ {
+ ::warn(m_inputFileName,m_locator->lineNumber(),fmt);
+ }
+ void warn(const char *fmt,const char *s)
+ {
+ ::warn(m_inputFileName,m_locator->lineNumber(),fmt,s);
+ }
+
+ void startCompound( const QXmlAttributes& attrib )
+ {
+ m_curString = "";
+ QString kind = attrib.value("kind");
+ QString isObjC = attrib.value("objc");
+ if (kind=="class")
+ {
+ m_curClass = new TagClassInfo;
+ m_curClass->kind = TagClassInfo::Class;
+ m_state = InClass;
+ }
+ else if (kind=="struct")
+ {
+ m_curClass = new TagClassInfo;
+ m_curClass->kind = TagClassInfo::Struct;
+ m_state = InClass;
+ }
+ else if (kind=="union")
+ {
+ m_curClass = new TagClassInfo;
+ m_curClass->kind = TagClassInfo::Union;
+ m_state = InClass;
+ }
+ else if (kind=="interface")
+ {
+ m_curClass = new TagClassInfo;
+ m_curClass->kind = TagClassInfo::Interface;
+ m_state = InClass;
+ }
+ else if (kind=="exception")
+ {
+ m_curClass = new TagClassInfo;
+ m_curClass->kind = TagClassInfo::Exception;
+ m_state = InClass;
+ }
+ else if (kind=="protocol")
+ {
+ m_curClass = new TagClassInfo;
+ m_curClass->kind = TagClassInfo::Protocol;
+ m_state = InClass;
+ }
+ else if (kind=="category")
+ {
+ m_curClass = new TagClassInfo;
+ m_curClass->kind = TagClassInfo::Category;
+ m_state = InClass;
+ }
+ else if (kind=="file")
+ {
+ m_curFile = new TagFileInfo;
+ m_state = InFile;
+ }
+ else if (kind=="namespace")
+ {
+ m_curNamespace = new TagNamespaceInfo;
+ m_state = InNamespace;
+ }
+ else if (kind=="group")
+ {
+ m_curGroup = new TagGroupInfo;
+ m_state = InGroup;
+ }
+ else if (kind=="page")
+ {
+ m_curPage = new TagPageInfo;
+ m_state = InPage;
+ }
+ else if (kind=="package")
+ {
+ m_curPackage = new TagPackageInfo;
+ m_state = InPackage;
+ }
+ else if (kind=="dir")
+ {
+ m_curDir = new TagDirInfo;
+ m_state = InDir;
+ }
+ else
+ {
+ warn("warning: Unknown compound attribute `%s' found!\n",kind.data());
+ }
+ if (isObjC=="yes" && m_curClass)
+ {
+ m_curClass->isObjC = TRUE;
+ }
+ }
+
+ void endCompound()
+ {
+ switch (m_state)
+ {
+ case InClass: m_tagFileClasses.append(m_curClass);
+ m_curClass=0; break;
+ case InFile: m_tagFileFiles.append(m_curFile);
+ m_curFile=0; break;
+ case InNamespace: m_tagFileNamespaces.append(m_curNamespace);
+ m_curNamespace=0; break;
+ case InGroup: m_tagFileGroups.append(m_curGroup);
+ m_curGroup=0; break;
+ case InPage: m_tagFilePages.append(m_curPage);
+ m_curPage=0; break;
+ case InDir: m_tagFileDirs.append(m_curDir);
+ m_curDir=0; break;
+ case InPackage: m_tagFilePackages.append(m_curPackage);
+ m_curPackage=0; break;
+ default:
+ warn("warning: tag `compound' was not expected!\n");
+ }
+ }
+
+ void startMember( const QXmlAttributes& attrib)
+ {
+ m_curMember = new TagMemberInfo;
+ m_curMember->kind = attrib.value("kind");
+ QString protStr = attrib.value("protection");
+ QString virtStr = attrib.value("virtualness");
+ QString staticStr = attrib.value("static");
+ if (protStr=="protected")
+ {
+ m_curMember->prot = Protected;
+ }
+ else if (protStr=="private")
+ {
+ m_curMember->prot = Private;
+ }
+ if (virtStr=="virtual")
+ {
+ m_curMember->virt = Virtual;
+ }
+ else if (virtStr=="pure")
+ {
+ m_curMember->virt = Pure;
+ }
+ if (staticStr=="yes")
+ {
+ m_curMember->isStatic = TRUE;
+ }
+ m_stateStack.push(new State(m_state));
+ m_state = InMember;
+ }
+
+ void endMember()
+ {
+ m_state = *m_stateStack.top();
+ m_stateStack.remove();
+ switch(m_state)
+ {
+ case InClass: m_curClass->members.append(m_curMember); break;
+ case InFile: m_curFile->members.append(m_curMember); break;
+ case InNamespace: m_curNamespace->members.append(m_curMember); break;
+ case InGroup: m_curGroup->members.append(m_curMember); break;
+ case InPackage: m_curPackage->members.append(m_curMember); break;
+ default: warn("warning: Unexpected tag `member' found\n"); break;
+ }
+ }
+
+ void endDocAnchor()
+ {
+ switch(m_state)
+ {
+ case InClass: m_curClass->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
+ case InFile: m_curFile->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
+ case InNamespace: m_curNamespace->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
+ case InGroup: m_curGroup->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
+ case InPage: m_curPage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
+ case InMember: m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
+ case InPackage: m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
+ case InDir: m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
+ default: warn("warning: Unexpected tag `member' found\n"); break;
+ }
+ }
+
+ void endClass()
+ {
+ switch(m_state)
+ {
+ case InClass: m_curClass->classList.append(m_curString); break;
+ case InFile: m_curFile->classList.append(m_curString); break;
+ case InNamespace: m_curNamespace->classList.append(m_curString); break;
+ case InGroup: m_curGroup->classList.append(m_curString); break;
+ case InPackage: m_curPackage->classList.append(m_curString); break;
+ default: warn("warning: Unexpected tag `class' found\n"); break;
+ }
+ }
+
+ void endNamespace()
+ {
+ switch(m_state)
+ {
+ case InNamespace: m_curNamespace->classList.append(m_curString); break;
+ case InFile: m_curFile->namespaceList.append(m_curString); break;
+ case InGroup: m_curGroup->namespaceList.append(m_curString); break;
+ default: warn("warning: Unexpected tag `namespace' found\n"); break;
+ }
+ }
+
+ void endFile()
+ {
+ switch(m_state)
+ {
+ case InGroup: m_curGroup->fileList.append(m_curString); break;
+ case InDir: m_curDir->fileList.append(m_curString); break;
+ default: warn("warning: Unexpected tag `file' found\n"); break;
+ }
+ }
+
+ void endPage()
+ {
+ switch(m_state)
+ {
+ case InGroup: m_curGroup->fileList.append(m_curString); break;
+ default: warn("warning: Unexpected tag `page' found\n"); break;
+ }
+ }
+
+ void endDir()
+ {
+ switch(m_state)
+ {
+ case InDir: m_curDir->subdirList.append(m_curString); break;
+ default: warn("warning: Unexpected tag `page' found\n"); break;
+ }
+ }
+
+ void startStringValue(const QXmlAttributes& )
+ {
+ m_curString = "";
+ }
+
+ void startDocAnchor(const QXmlAttributes& attrib )
+ {
+ m_fileName = attrib.value("file");
+ m_curString = "";
+ }
+
+ void endType()
+ {
+ if (m_state==InMember)
+ {
+ m_curMember->type = m_curString;
+ }
+ else
+ {
+ warn("warning: Unexpected tag `type' found\n");
+ }
+ }
+
+ void endName()
+ {
+ switch (m_state)
+ {
+ case InClass: m_curClass->name = m_curString; break;
+ case InFile: m_curFile->name = m_curString; break;
+ case InNamespace: m_curNamespace->name = m_curString; break;
+ case InGroup: m_curGroup->name = m_curString; break;
+ case InPage: m_curPage->name = m_curString; break;
+ case InDir: m_curDir->name = m_curString; break;
+ case InMember: m_curMember->name = m_curString; break;
+ case InPackage: m_curPackage->name = m_curString; break;
+ default: warn("warning: Unexpected tag `name' found\n"); break;
+ }
+ }
+
+ void startBase(const QXmlAttributes& attrib )
+ {
+ m_curString="";
+ if (m_state==InClass && m_curClass)
+ {
+ QString protStr = attrib.value("protection");
+ QString virtStr = attrib.value("virtualness");
+ Protection prot = Public;
+ Specifier virt = Normal;
+ if (protStr=="protected")
+ {
+ prot = Protected;
+ }
+ else if (protStr=="private")
+ {
+ prot = Private;
+ }
+ if (virtStr=="virtual")
+ {
+ virt = Virtual;
+ }
+ if (m_curClass->bases==0)
+ {
+ m_curClass->bases = new QList<BaseInfo>;
+ m_curClass->bases->setAutoDelete(TRUE);
+ }
+ m_curClass->bases->append(new BaseInfo(m_curString,prot,virt));
+ }
+ else
+ {
+ warn("warning: Unexpected tag `base' found\n");
+ }
+ }
+
+ void endBase()
+ {
+ if (m_state==InClass && m_curClass)
+ {
+ m_curClass->bases->getLast()->name = m_curString;
+ }
+ else
+ {
+ warn("warning: Unexpected tag `base' found\n");
+ }
+ }
+
+ void startIncludes(const QXmlAttributes& attrib )
+ {
+ if (m_state==InFile && m_curFile)
+ {
+ m_curIncludes = new TagIncludeInfo;
+ m_curIncludes->id = attrib.value("id");
+ m_curIncludes->name = attrib.value("name");
+ m_curIncludes->isLocal = attrib.value("local")=="yes" ? TRUE : FALSE;
+ m_curIncludes->isImported = attrib.value("imported")=="yes" ? TRUE : FALSE;
+ m_curFile->includes.append(m_curIncludes);
+ }
+ else
+ {
+ warn("warning: Unexpected tag `includes' found\n");
+ }
+ m_curString="";
+ }
+
+ void endIncludes()
+ {
+ m_curIncludes->text = m_curString;
+ }
+
+ void endTemplateArg()
+ {
+ if (m_state==InClass && m_curClass)
+ {
+ if (m_curClass->templateArguments==0)
+ {
+ m_curClass->templateArguments = new QList<QString>;
+ m_curClass->templateArguments->setAutoDelete(TRUE);
+ }
+ m_curClass->templateArguments->append(new QString(m_curString));
+ }
+ else
+ {
+ warn("warning: Unexpected tag `templarg' found\n");
+ }
+ }
+
+ void endFilename()
+ {
+ switch (m_state)
+ {
+ case InClass: m_curClass->filename = m_curString; break;
+ case InNamespace: m_curNamespace->filename = m_curString; break;
+ case InFile: m_curFile->filename = m_curString; break;
+ case InGroup: m_curGroup->filename = m_curString; break;
+ case InPage: m_curPage->filename = m_curString; break;
+ case InPackage: m_curPackage->filename = m_curString; break;
+ case InDir: m_curDir->filename = m_curString; break;
+ default: warn("warning: Unexpected tag `filename' found\n"); break;
+ }
+ }
+
+ void endPath()
+ {
+ switch (m_state)
+ {
+ case InFile: m_curFile->path = m_curString; break;
+ case InDir: m_curDir->path = m_curString; break;
+ default: warn("warning: Unexpected tag `path' found\n"); break;
+ }
+ }
+
+ void endAnchor()
+ {
+ if (m_state==InMember)
+ {
+ m_curMember->anchor = m_curString;
+ }
+ else
+ {
+ warn("warning: Unexpected tag `anchor' found\n");
+ }
+ }
+
+ void endAnchorFile()
+ {
+ if (m_state==InMember)
+ {
+ m_curMember->anchorFile = m_curString;
+ }
+ else
+ {
+ warn("warning: Unexpected tag `anchorfile' found\n");
+ }
+ }
+
+ void endArglist()
+ {
+ if (m_state==InMember)
+ {
+ m_curMember->arglist = m_curString;
+ }
+ else
+ {
+ warn("warning: Unexpected tag `arglist' found\n");
+ }
+ }
+ void endTitle()
+ {
+ switch (m_state)
+ {
+ case InGroup: m_curGroup->title = m_curString; break;
+ case InPage: m_curPage->title = m_curString; break;
+ default: warn("warning: Unexpected tag `title' found\n"); break;
+ }
+ }
+
+ void endSubgroup()
+ {
+ if (m_state==InGroup)
+ {
+ m_curGroup->subgroupList.append(m_curString);
+ }
+ else
+ {
+ warn("warning: Unexpected tag `subgroup' found\n");
+ }
+ }
+
+ void startIgnoreElement(const QXmlAttributes& )
+ {
+ }
+
+ void endIgnoreElement()
+ {
+ }
+
+ bool startDocument()
+ {
+ m_state = Invalid;
+
+ m_curClass=0;
+ m_curNamespace=0;
+ m_curFile=0;
+ m_curGroup=0;
+ m_curPage=0;
+ m_curPackage=0;
+ m_curDir=0;
+
+ m_stateStack.setAutoDelete(TRUE);
+ m_tagFileClasses.setAutoDelete(TRUE);
+ m_tagFileFiles.setAutoDelete(TRUE);
+ m_tagFileNamespaces.setAutoDelete(TRUE);
+ m_tagFileGroups.setAutoDelete(TRUE);
+ m_tagFilePages.setAutoDelete(TRUE);
+ m_tagFilePackages.setAutoDelete(TRUE);
+ m_tagFileDirs.setAutoDelete(TRUE);
+
+ m_startElementHandlers.insert("compound", new StartElementHandler(this,&TagFileParser::startCompound));
+ m_startElementHandlers.insert("member", new StartElementHandler(this,&TagFileParser::startMember));
+ m_startElementHandlers.insert("name", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("base", new StartElementHandler(this,&TagFileParser::startBase));
+ m_startElementHandlers.insert("filename", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("includes", new StartElementHandler(this,&TagFileParser::startIncludes));
+ m_startElementHandlers.insert("path", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("anchorfile", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("anchor", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("arglist", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("title", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("subgroup", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("class", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("namespace", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("file", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("dir", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startDocAnchor));
+ m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement));
+ m_startElementHandlers.insert("templarg", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("type", new StartElementHandler(this,&TagFileParser::startStringValue));
+
+ m_endElementHandlers.insert("compound", new EndElementHandler(this,&TagFileParser::endCompound));
+ m_endElementHandlers.insert("member", new EndElementHandler(this,&TagFileParser::endMember));
+ m_endElementHandlers.insert("name", new EndElementHandler(this,&TagFileParser::endName));
+ m_endElementHandlers.insert("base", new EndElementHandler(this,&TagFileParser::endBase));
+ m_endElementHandlers.insert("filename", new EndElementHandler(this,&TagFileParser::endFilename));
+ m_endElementHandlers.insert("includes", new EndElementHandler(this,&TagFileParser::endIncludes));
+ m_endElementHandlers.insert("path", new EndElementHandler(this,&TagFileParser::endPath));
+ m_endElementHandlers.insert("anchorfile", new EndElementHandler(this,&TagFileParser::endAnchorFile));
+ m_endElementHandlers.insert("anchor", new EndElementHandler(this,&TagFileParser::endAnchor));
+ m_endElementHandlers.insert("arglist", new EndElementHandler(this,&TagFileParser::endArglist));
+ m_endElementHandlers.insert("title", new EndElementHandler(this,&TagFileParser::endTitle));
+ m_endElementHandlers.insert("subgroup", new EndElementHandler(this,&TagFileParser::endSubgroup));
+ m_endElementHandlers.insert("class" , new EndElementHandler(this,&TagFileParser::endClass));
+ m_endElementHandlers.insert("namespace", new EndElementHandler(this,&TagFileParser::endNamespace));
+ m_endElementHandlers.insert("file", new EndElementHandler(this,&TagFileParser::endFile));
+ m_endElementHandlers.insert("dir", new EndElementHandler(this,&TagFileParser::endDir));
+ m_endElementHandlers.insert("page", new EndElementHandler(this,&TagFileParser::endPage));
+ m_endElementHandlers.insert("docanchor", new EndElementHandler(this,&TagFileParser::endDocAnchor));
+ m_endElementHandlers.insert("tagfile", new EndElementHandler(this,&TagFileParser::endIgnoreElement));
+ m_endElementHandlers.insert("templarg", new EndElementHandler(this,&TagFileParser::endTemplateArg));
+ m_endElementHandlers.insert("type", new EndElementHandler(this,&TagFileParser::endType));
+
+ return TRUE;
+ }
+
+ bool startElement( const QString&, const QString&,
+ const QString&name, const QXmlAttributes& attrib )
+ {
+ //printf("startElement `%s'\n",name.data());
+ StartElementHandler *handler = m_startElementHandlers[name];
+ if (handler)
+ {
+ (*handler)(attrib);
+ }
+ else
+ {
+ warn("warning: Unknown tag `%s' found!\n",name.data());
+ }
+ return TRUE;
+ }
+
+ bool endElement( const QString&, const QString&, const QString& name )
+ {
+ //printf("endElement `%s'\n",name.data());
+ EndElementHandler *handler = m_endElementHandlers[name];
+ if (handler)
+ {
+ (*handler)();
+ }
+ else
+ {
+ warn("warning: Unknown tag `%s' found!\n",name.data());
+ }
+ return TRUE;
+ }
+
+ bool characters ( const QString & ch )
+ {
+ m_curString+=ch;
+ return TRUE;
+ }
+
+ void dump();
+ void buildLists(Entry *root);
+ void addIncludes();
+
+ private:
+ void buildMemberList(Entry *ce,QList<TagMemberInfo> &members);
+ void addDocAnchors(Entry *e,const TagAnchorInfoList &l);
+ QList<TagClassInfo> m_tagFileClasses;
+ QList<TagFileInfo> m_tagFileFiles;
+ QList<TagNamespaceInfo> m_tagFileNamespaces;
+ QList<TagGroupInfo> m_tagFileGroups;
+ QList<TagPageInfo> m_tagFilePages;
+ QList<TagPackageInfo> m_tagFilePackages;
+ QList<TagDirInfo> m_tagFileDirs;
+ QDict<StartElementHandler> m_startElementHandlers;
+ QDict<EndElementHandler> m_endElementHandlers;
+ TagClassInfo *m_curClass;
+ TagFileInfo *m_curFile;
+ TagNamespaceInfo *m_curNamespace;
+ TagPackageInfo *m_curPackage;
+ TagGroupInfo *m_curGroup;
+ TagPageInfo *m_curPage;
+ TagDirInfo *m_curDir;
+ TagMemberInfo *m_curMember;
+ TagIncludeInfo *m_curIncludes;
+ QCString m_curString;
+ QString m_tagName;
+ QString m_fileName;
+ State m_state;
+ QStack<State> m_stateStack;
+ QXmlLocator *m_locator;
+ QString m_inputFileName;
+};
+
+/*! Error handler for the XML tag file parser.
+ * Basically dumps all fatal error to stderr using err().
+ */
+class TagFileErrorHandler : public QXmlErrorHandler
+{
+ public:
+ virtual ~TagFileErrorHandler() {}
+ bool warning( const QXmlParseException & )
+ {
+ return FALSE;
+ }
+ bool error( const QXmlParseException & )
+ {
+ return FALSE;
+ }
+ bool fatalError( const QXmlParseException &exception )
+ {
+ err("Fatal error at line %d column %d: %s\n",
+ exception.lineNumber(),exception.columnNumber(),
+ exception.message().data());
+ return FALSE;
+ }
+ QString errorString() { return ""; }
+
+ private:
+ QString errorMsg;
+};
+
+/*! Dumps the internal structures. For debugging only! */
+void TagFileParser::dump()
+{
+ msg("Result:\n");
+ QListIterator<TagClassInfo> lci(m_tagFileClasses);
+
+ //============== CLASSES
+ TagClassInfo *cd;
+ for (;(cd=lci.current());++lci)
+ {
+ msg("class `%s'\n",cd->name.data());
+ msg(" filename `%s'\n",cd->filename.data());
+ if (cd->bases)
+ {
+ QListIterator<BaseInfo> bii(*cd->bases);
+ BaseInfo *bi;
+ for ( bii.toFirst() ; (bi=bii.current()) ; ++bii)
+ {
+ msg( " base: %s \n", bi->name.data() );
+ }
+ }
+
+ QListIterator<TagMemberInfo> mci(cd->members);
+ TagMemberInfo *md;
+ for (;(md=mci.current());++mci)
+ {
+ msg(" member:\n");
+ msg(" kind: `%s'\n",md->kind.data());
+ msg(" name: `%s'\n",md->name.data());
+ msg(" anchor: `%s'\n",md->anchor.data());
+ msg(" arglist: `%s'\n",md->arglist.data());
+ }
+ }
+ //============== NAMESPACES
+ QListIterator<TagNamespaceInfo> lni(m_tagFileNamespaces);
+ TagNamespaceInfo *nd;
+ for (;(nd=lni.current());++lni)
+ {
+ msg("namespace `%s'\n",nd->name.data());
+ msg(" filename `%s'\n",nd->filename.data());
+ QStringList::Iterator it;
+ for ( it = nd->classList.begin();
+ it != nd->classList.end(); ++it )
+ {
+ msg( " class: %s \n", (*it).latin1() );
+ }
+
+ QListIterator<TagMemberInfo> mci(nd->members);
+ TagMemberInfo *md;
+ for (;(md=mci.current());++mci)
+ {
+ msg(" member:\n");
+ msg(" kind: `%s'\n",md->kind.data());
+ msg(" name: `%s'\n",md->name.data());
+ msg(" anchor: `%s'\n",md->anchor.data());
+ msg(" arglist: `%s'\n",md->arglist.data());
+ }
+ }
+ //============== FILES
+ QListIterator<TagFileInfo> lfi(m_tagFileFiles);
+ TagFileInfo *fd;
+ for (;(fd=lfi.current());++lfi)
+ {
+ msg("file `%s'\n",fd->name.data());
+ msg(" filename `%s'\n",fd->filename.data());
+ QStringList::Iterator it;
+ for ( it = fd->namespaceList.begin();
+ it != fd->namespaceList.end(); ++it )
+ {
+ msg( " namespace: %s \n", (*it).latin1() );
+ }
+ for ( it = fd->classList.begin();
+ it != fd->classList.end(); ++it )
+ {
+ msg( " class: %s \n", (*it).latin1() );
+ }
+
+ QListIterator<TagMemberInfo> mci(fd->members);
+ TagMemberInfo *md;
+ for (;(md=mci.current());++mci)
+ {
+ msg(" member:\n");
+ msg(" kind: `%s'\n",md->kind.data());
+ msg(" name: `%s'\n",md->name.data());
+ msg(" anchor: `%s'\n",md->anchor.data());
+ msg(" arglist: `%s'\n",md->arglist.data());
+ }
+
+ QListIterator<TagIncludeInfo> mii(fd->includes);
+ TagIncludeInfo *ii;
+ for (;(ii=mii.current());++mii)
+ {
+ msg(" includes id: %s name: %s\n",ii->id.data(),ii->name.data());
+ }
+ }
+
+ //============== GROUPS
+ QListIterator<TagGroupInfo> lgi(m_tagFileGroups);
+ TagGroupInfo *gd;
+ for (;(gd=lgi.current());++lgi)
+ {
+ msg("group `%s'\n",gd->name.data());
+ msg(" filename `%s'\n",gd->filename.data());
+ QStringList::Iterator it;
+ for ( it = gd->namespaceList.begin();
+ it != gd->namespaceList.end(); ++it )
+ {
+ msg( " namespace: %s \n", (*it).latin1() );
+ }
+ for ( it = gd->classList.begin();
+ it != gd->classList.end(); ++it )
+ {
+ msg( " class: %s \n", (*it).latin1() );
+ }
+ for ( it = gd->fileList.begin();
+ it != gd->fileList.end(); ++it )
+ {
+ msg( " file: %s \n", (*it).latin1() );
+ }
+ for ( it = gd->subgroupList.begin();
+ it != gd->subgroupList.end(); ++it )
+ {
+ msg( " subgroup: %s \n", (*it).latin1() );
+ }
+ for ( it = gd->pageList.begin();
+ it != gd->pageList.end(); ++it )
+ {
+ msg( " page: %s \n", (*it).latin1() );
+ }
+
+ QListIterator<TagMemberInfo> mci(gd->members);
+ TagMemberInfo *md;
+ for (;(md=mci.current());++mci)
+ {
+ msg(" member:\n");
+ msg(" kind: `%s'\n",md->kind.data());
+ msg(" name: `%s'\n",md->name.data());
+ msg(" anchor: `%s'\n",md->anchor.data());
+ msg(" arglist: `%s'\n",md->arglist.data());
+ }
+ }
+ //============== PAGES
+ QListIterator<TagPageInfo> lpi(m_tagFilePages);
+ TagPageInfo *pd;
+ for (;(pd=lpi.current());++lpi)
+ {
+ msg("page `%s'\n",pd->name.data());
+ msg(" title `%s'\n",pd->title.data());
+ msg(" filename `%s'\n",pd->filename.data());
+ }
+ //============== DIRS
+ QListIterator<TagDirInfo> ldi(m_tagFileDirs);
+ TagDirInfo *dd;
+ for (;(dd=ldi.current());++ldi)
+ {
+ msg("dir `%s'\n",dd->name.data());
+ msg(" path `%s'\n",dd->path.data());
+ QStringList::Iterator it;
+ for ( it = dd->fileList.begin();
+ it != dd->fileList.end(); ++it )
+ {
+ msg( " file: %s \n", (*it).latin1() );
+ }
+ for ( it = dd->subdirList.begin();
+ it != dd->subdirList.end(); ++it )
+ {
+ msg( " subdir: %s \n", (*it).latin1() );
+ }
+ }
+}
+
+void TagFileParser::addDocAnchors(Entry *e,const TagAnchorInfoList &l)
+{
+ QListIterator<TagAnchorInfo> tli(l);
+ TagAnchorInfo *ta;
+ for (tli.toFirst();(ta=tli.current());++tli)
+ {
+ if (Doxygen::sectionDict.find(ta->label)==0)
+ {
+ //printf("New sectionInfo file=%s anchor=%s\n",
+ // ta->fileName.data(),ta->label.data());
+ SectionInfo *si=new SectionInfo(ta->fileName,ta->label,ta->label,
+ SectionInfo::Anchor,m_tagName);
+ Doxygen::sectionDict.insert(ta->label,si);
+ e->anchors->append(si);
+ }
+ else
+ {
+ warn("Duplicate anchor %s found\n",ta->label.data());
+ }
+ }
+}
+
+void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members)
+{
+ QListIterator<TagMemberInfo> mii(members);
+ TagMemberInfo *tmi;
+ for (;(tmi=mii.current());++mii)
+ {
+ Entry *me = new Entry;
+ me->type = tmi->type;
+ me->name = tmi->name;
+ me->args = tmi->arglist;
+ if (!me->args.isEmpty())
+ {
+ delete me->argList;
+ me->argList = new ArgumentList;
+ stringToArgumentList(me->args,me->argList);
+ }
+ me->protection = tmi->prot;
+ me->virt = tmi->virt;
+ me->stat = tmi->isStatic;
+ me->fileName = ce->fileName;
+ if (ce->section == Entry::GROUPDOC_SEC)
+ {
+ me->groups->append(new Grouping(ce->name,Grouping::GROUPING_INGROUP));
+ }
+ addDocAnchors(me,tmi->docAnchors);
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->anchor = tmi->anchor;
+ ti->fileName = tmi->anchorFile;
+ me->tagInfo = ti;
+ if (tmi->kind=="define")
+ {
+ me->type="#define";
+ me->section = Entry::DEFINE_SEC;
+ }
+ else if (tmi->kind=="enumvalue")
+ {
+ me->section = Entry::VARIABLE_SEC;
+ me->mtype = Method;
+ }
+ else if (tmi->kind=="property")
+ {
+ me->section = Entry::VARIABLE_SEC;
+ me->mtype = Property;
+ }
+ else if (tmi->kind=="event")
+ {
+ me->section = Entry::VARIABLE_SEC;
+ me->mtype = Event;
+ }
+ else if (tmi->kind=="variable")
+ {
+ me->section = Entry::VARIABLE_SEC;
+ me->mtype = Method;
+ }
+ else if (tmi->kind=="typedef")
+ {
+ me->section = Entry::VARIABLE_SEC; //Entry::TYPEDEF_SEC;
+ me->type.prepend("typedef ");
+ me->mtype = Method;
+ }
+ else if (tmi->kind=="enumeration")
+ {
+ me->section = Entry::ENUM_SEC;
+ me->mtype = Method;
+ }
+ else if (tmi->kind=="function")
+ {
+ me->section = Entry::FUNCTION_SEC;
+ me->mtype = Method;
+ }
+ else if (tmi->kind=="signal")
+ {
+ me->section = Entry::FUNCTION_SEC;
+ me->mtype = Signal;
+ }
+ else if (tmi->kind=="prototype")
+ {
+ me->section = Entry::FUNCTION_SEC;
+ me->mtype = Method;
+ }
+ else if (tmi->kind=="friend")
+ {
+ me->section = Entry::FUNCTION_SEC;
+ me->type.prepend("friend ");
+ me->mtype = Method;
+ }
+ else if (tmi->kind=="dcop")
+ {
+ me->section = Entry::FUNCTION_SEC;
+ me->mtype = DCOP;
+ }
+ else if (tmi->kind=="slot")
+ {
+ me->section = Entry::FUNCTION_SEC;
+ me->mtype = Slot;
+ }
+ ce->addSubEntry(me);
+ }
+}
+
+static QString stripPath(const QString &s)
+{
+ int i=s.findRev('/');
+ if (i!=-1)
+ {
+ return s.right(s.length()-i-1);
+ }
+ else
+ {
+ return s;
+ }
+}
+
+/*! Injects the info gathered by the XML parser into the Entry tree.
+ * This tree contains the information extracted from the input in a
+ * "unrelated" form.
+ */
+void TagFileParser::buildLists(Entry *root)
+{
+ // build class list
+ TagClassInfo *tci = m_tagFileClasses.first();
+ while (tci)
+ {
+ Entry *ce = new Entry;
+ ce->section = Entry::CLASS_SEC;
+ switch (tci->kind)
+ {
+ case TagClassInfo::Class: break;
+ case TagClassInfo::Struct: ce->spec = Entry::Struct; break;
+ case TagClassInfo::Union: ce->spec = Entry::Union; break;
+ case TagClassInfo::Interface: ce->spec = Entry::Interface; break;
+ case TagClassInfo::Exception: ce->spec = Entry::Exception; break;
+ case TagClassInfo::Protocol: ce->spec = Entry::Protocol; break;
+ case TagClassInfo::Category: ce->spec = Entry::Category; break;
+ }
+ ce->name = tci->name;
+ if (tci->kind==TagClassInfo::Protocol)
+ {
+ ce->name+="-p";
+ }
+ addDocAnchors(ce,tci->docAnchors);
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->fileName = tci->filename;
+ ce->tagInfo = ti;
+ ce->lang = tci->isObjC ? SrcLangExt_ObjC : SrcLangExt_Unknown;
+ // transfer base class list
+ if (tci->bases)
+ {
+ delete ce->extends;
+ ce->extends = tci->bases; tci->bases = 0;
+ }
+ if (tci->templateArguments)
+ {
+ if (ce->tArgLists==0)
+ {
+ ce->tArgLists = new QList<ArgumentList>;
+ ce->tArgLists->setAutoDelete(TRUE);
+ }
+ ArgumentList *al = new ArgumentList;
+ ce->tArgLists->append(al);
+
+ QListIterator<QString> sli(*tci->templateArguments);
+ QString *argName;
+ for (;(argName=sli.current());++sli)
+ {
+ Argument *a = new Argument;
+ a->type = "class";
+ a->name = *argName;
+ al->append(a);
+ }
+ }
+
+ buildMemberList(ce,tci->members);
+ root->addSubEntry(ce);
+ tci = m_tagFileClasses.next();
+ }
+
+ // build file list
+ TagFileInfo *tfi = m_tagFileFiles.first();
+ while (tfi)
+ {
+ Entry *fe = new Entry;
+ fe->section = guessSection(tfi->name);
+ fe->name = tfi->name;
+ addDocAnchors(fe,tfi->docAnchors);
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->fileName = tfi->filename;
+ fe->tagInfo = ti;
+
+ QString fullName = m_tagName+":"+tfi->path+stripPath(tfi->name);
+ fe->fileName = fullName;
+ //printf("new FileDef() filename=%s\n",tfi->filename.data());
+ FileDef *fd = new FileDef(m_tagName+":"+tfi->path,
+ tfi->name,m_tagName,
+ tfi->filename
+ );
+ FileName *mn;
+ if ((mn=Doxygen::inputNameDict->find(tfi->name)))
+ {
+ mn->append(fd);
+ }
+ else
+ {
+ mn = new FileName(fullName,tfi->name);
+ mn->append(fd);
+ Doxygen::inputNameList->inSort(mn);
+ Doxygen::inputNameDict->insert(tfi->name,mn);
+ }
+ buildMemberList(fe,tfi->members);
+ root->addSubEntry(fe);
+ tfi = m_tagFileFiles.next();
+ }
+
+ // build namespace list
+ TagNamespaceInfo *tni = m_tagFileNamespaces.first();
+ while (tni)
+ {
+ Entry *ne = new Entry;
+ ne->section = Entry::NAMESPACE_SEC;
+ ne->name = tni->name;
+ addDocAnchors(ne,tni->docAnchors);
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->fileName = tni->filename;
+ ne->tagInfo = ti;
+
+ buildMemberList(ne,tni->members);
+ root->addSubEntry(ne);
+ tni = m_tagFileNamespaces.next();
+ }
+
+ // build package list
+ TagPackageInfo *tpgi = m_tagFilePackages.first();
+ while (tpgi)
+ {
+ Entry *pe = new Entry;
+ pe->section = Entry::PACKAGE_SEC;
+ pe->name = tpgi->name;
+ addDocAnchors(pe,tpgi->docAnchors);
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->fileName = tpgi->filename;
+ pe->tagInfo = ti;
+
+ buildMemberList(pe,tpgi->members);
+ root->addSubEntry(pe);
+ tpgi = m_tagFilePackages.next();
+ }
+
+ // build group list, but only if config file says to include it
+ //if (Config_getBool("EXTERNAL_GROUPS"))
+ //{
+ TagGroupInfo *tgi = m_tagFileGroups.first();
+ while (tgi)
+ {
+ Entry *ge = new Entry;
+ ge->section = Entry::GROUPDOC_SEC;
+ ge->name = tgi->name;
+ ge->type = tgi->title;
+ addDocAnchors(ge,tgi->docAnchors);
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->fileName = tgi->filename;
+ ge->tagInfo = ti;
+
+ buildMemberList(ge,tgi->members);
+ root->addSubEntry(ge);
+ tgi = m_tagFileGroups.next();
+ }
+ //}
+
+ // build page list
+ TagPageInfo *tpi = m_tagFilePages.first();
+ while (tpi)
+ {
+ Entry *pe = new Entry;
+ pe->section = Entry::PAGEDOC_SEC;
+ pe->name = tpi->name;
+ pe->args = tpi->title;
+ addDocAnchors(pe,tpi->docAnchors);
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->fileName = tpi->filename;
+ pe->tagInfo = ti;
+
+ root->addSubEntry(pe);
+ tpi = m_tagFilePages.next();
+ }
+}
+
+void TagFileParser::addIncludes()
+{
+ TagFileInfo *tfi = m_tagFileFiles.first();
+ while (tfi)
+ {
+ //printf("tag file tagName=%s path=%s name=%s\n",m_tagName.data(),tfi->path.data(),tfi->name.data());
+ FileName *fn = Doxygen::inputNameDict->find(tfi->name);
+ if (fn)
+ {
+ //printf("found\n");
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ //printf("input file path=%s name=%s\n",fd->getPath().data(),fd->name().data());
+ if (fd->getPath()==QCString(m_tagName+":"+tfi->path))
+ {
+ //printf("found\n");
+ QListIterator<TagIncludeInfo> mii(tfi->includes);
+ TagIncludeInfo *ii;
+ for (;(ii=mii.current());++mii)
+ {
+ //printf("ii->name=`%s'\n",ii->name.data());
+ FileName *ifn = Doxygen::inputNameDict->find(ii->name);
+ ASSERT(ifn!=0);
+ if (ifn)
+ {
+ FileNameIterator ifni(*ifn);
+ FileDef *ifd;
+ for (;(ifd=ifni.current());++ifni)
+ {
+ //printf("ifd->getOutputFileBase()=%s ii->id=%s\n",
+ // ifd->getOutputFileBase().data(),ii->id.data());
+ if (ifd->getOutputFileBase()==QCString(ii->id))
+ {
+ fd->addIncludeDependency(ifd,ii->text,ii->isLocal,ii->isImported);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ tfi = m_tagFileFiles.next();
+ }
+}
+
+void parseTagFile(Entry *root,const char *fullName,const char *tagName)
+{
+ QFileInfo fi(fullName);
+ if (!fi.exists()) return;
+ TagFileParser handler( tagName );
+ handler.setFileName(fullName);
+ TagFileErrorHandler errorHandler;
+ QFile xmlFile( fullName );
+ QXmlInputSource source( xmlFile );
+ QXmlSimpleReader reader;
+ reader.setContentHandler( &handler );
+ reader.setErrorHandler( &errorHandler );
+ reader.parse( source );
+ handler.buildLists(root);
+ handler.addIncludes();
+ //handler.dump();
+}
+
+
diff --git a/src/tagreader.h b/src/tagreader.h
new file mode 100644
index 0000000..f7b05a8
--- /dev/null
+++ b/src/tagreader.h
@@ -0,0 +1,28 @@
+/******************************************************************************
+ *
+ * $Id: tagreader.h,v 1.2 2001/03/19 19:27:41 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TAGREADER_H
+#define TAGREADER_H
+
+#include "qtbc.h"
+
+class Entry;
+
+void parseTagFile(Entry *root,const char *fullPathName,const char *fileName);
+
+#endif
diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp
new file mode 100644
index 0000000..054c146
--- /dev/null
+++ b/src/textdocvisitor.cpp
@@ -0,0 +1,88 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <qdir.h>
+#include "textdocvisitor.h"
+#include "message.h"
+
+//-------------------------------------------------------------------------
+
+void TextDocVisitor::visit(DocSymbol *s)
+{
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "\\"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: m_t << "&lt;"; break;
+ case DocSymbol::Greater: m_t << "&gt;"; break;
+ case DocSymbol::Amp: m_t << "&amp;"; break;
+ case DocSymbol::Dollar: m_t << "$"; break;
+ case DocSymbol::Hash: m_t << "#"; break;
+ case DocSymbol::DoubleColon: m_t << "::"; break;
+ case DocSymbol::Percent: m_t << "%"; break;
+ case DocSymbol::Copy: m_t << "&copy;"; break;
+ case DocSymbol::Tm: m_t << "&tm;"; break;
+ case DocSymbol::Reg: m_t << "&reg;"; break;
+ case DocSymbol::Apos: m_t << "'"; break;
+ case DocSymbol::Quot: m_t << "\""; break;
+ case DocSymbol::Lsquo: m_t << "&lsquo;"; break;
+ case DocSymbol::Rsquo: m_t << "&rsquo;"; break;
+ case DocSymbol::Ldquo: m_t << "&ldquo;"; break;
+ case DocSymbol::Rdquo: m_t << "&rdquo;"; break;
+ case DocSymbol::Ndash: m_t << "&ndash;"; break;
+ case DocSymbol::Mdash: m_t << "&mdash;"; break;
+ case DocSymbol::Uml: m_t << "&" << s->letter() << "uml;"; break;
+ case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break;
+ case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break;
+ case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break;
+ case DocSymbol::Slash: m_t << "&" << s->letter() << "slash;"; break;
+ case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break;
+ case DocSymbol::Szlig: m_t << "&szlig;"; break;
+ case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedil;"; break;
+ case DocSymbol::Ring: m_t << "&" << s->letter() << "ring;"; break;
+ case DocSymbol::Nbsp: m_t << "&nbsp;"; break;
+ case DocSymbol::Aelig: m_t << "&aelig;"; break;
+ case DocSymbol::AElig: m_t << "&AElig;"; break;
+ default:
+ err("error: unknown symbol found\n");
+ }
+}
+
+
+void TextDocVisitor::filter(const char *str)
+{
+ if (str==0) return;
+ //printf("TextDocVisitor::filter(%s)\n",str);
+ const char *p=str;
+ char c;
+ while (*p)
+ {
+ c=*p++;
+ switch(c)
+ {
+ case '\n': m_t << " "; break;
+ case '"': m_t << "&quot;"; break;
+ case '\'': m_t << "&#39;"; break;
+ case '<': m_t << "&lt;"; break;
+ case '>': m_t << "&gt;"; break;
+ case '&': m_t << "&amp;"; break;
+ default: m_t << c;
+ }
+ }
+}
+
diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h
new file mode 100644
index 0000000..66e804a
--- /dev/null
+++ b/src/textdocvisitor.h
@@ -0,0 +1,136 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _TEXTDOCVISITOR_H
+#define _TEXTDOCVISITOR_H
+
+#include "docvisitor.h"
+#include "docparser.h"
+#include <qstack.h>
+#include <qcstring.h>
+#include "ftextstream.h"
+
+
+/*! @brief Concrete visitor implementation for TEXT output. */
+class TextDocVisitor : public DocVisitor
+{
+ public:
+ TextDocVisitor(FTextStream &t) : DocVisitor(DocVisitor_Text), m_t(t) {}
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+ void visit(DocWord *w) { filter(w->word()); }
+ void visit(DocLinkedWord *w) { filter(w->word()); }
+ void visit(DocWhiteSpace *) { m_t << " "; }
+ void visit(DocSymbol *);
+ void visit(DocURL *u) { filter(u->url()); }
+ void visit(DocLineBreak *) { m_t << " "; }
+ void visit(DocHorRuler *) {}
+ void visit(DocStyleChange *) {}
+ void visit(DocVerbatim *s) { filter(s->text()); }
+ void visit(DocAnchor *) {}
+ void visit(DocInclude *) {}
+ void visit(DocIncOperator *) {}
+ void visit(DocFormula *) {}
+ void visit(DocIndexEntry *) {}
+ void visit(DocSimpleSectSep *){}
+
+ //--------------------------------------
+ // visitor functions for compound nodes
+ //--------------------------------------
+
+ void visitPre(DocAutoList *) {}
+ void visitPost(DocAutoList *) {}
+ void visitPre(DocAutoListItem *) {}
+ void visitPost(DocAutoListItem *) {}
+ void visitPre(DocPara *) {}
+ void visitPost(DocPara *) {}
+ void visitPre(DocRoot *) {}
+ void visitPost(DocRoot *) {}
+ void visitPre(DocSimpleSect *) {}
+ void visitPost(DocSimpleSect *) {}
+ void visitPre(DocTitle *) {}
+ void visitPost(DocTitle *) {}
+ void visitPre(DocSimpleList *) {}
+ void visitPost(DocSimpleList *) {}
+ void visitPre(DocSimpleListItem *) {}
+ void visitPost(DocSimpleListItem *) {}
+ void visitPre(DocSection *) {}
+ void visitPost(DocSection *) {}
+ void visitPre(DocHtmlList *) {}
+ void visitPost(DocHtmlList *) {}
+ void visitPre(DocHtmlListItem *) {}
+ void visitPost(DocHtmlListItem *) {}
+ void visitPre(DocHtmlDescList *) {}
+ void visitPost(DocHtmlDescList *) {}
+ void visitPre(DocHtmlDescTitle *) {}
+ void visitPost(DocHtmlDescTitle *) {}
+ void visitPre(DocHtmlDescData *) {}
+ void visitPost(DocHtmlDescData *) {}
+ void visitPre(DocHtmlTable *) {}
+ void visitPost(DocHtmlTable *) {}
+ void visitPre(DocHtmlRow *) {}
+ void visitPost(DocHtmlRow *) {}
+ void visitPre(DocHtmlCell *) {}
+ void visitPost(DocHtmlCell *) {}
+ void visitPre(DocHtmlCaption *) {}
+ void visitPost(DocHtmlCaption *) {}
+ void visitPre(DocInternal *) {}
+ void visitPost(DocInternal *) {}
+ void visitPre(DocHRef *) {}
+ void visitPost(DocHRef *) {}
+ void visitPre(DocHtmlHeader *) {}
+ void visitPost(DocHtmlHeader *) {}
+ void visitPre(DocImage *) {}
+ void visitPost(DocImage *) {}
+ void visitPre(DocDotFile *) {}
+ void visitPost(DocDotFile *) {}
+
+ void visitPre(DocMscFile *) {}
+ void visitPost(DocMscFile *) {}
+ void visitPre(DocLink *) {}
+ void visitPost(DocLink *) {}
+ void visitPre(DocRef *) {}
+ void visitPost(DocRef *) {}
+ void visitPre(DocSecRefItem *) {}
+ void visitPost(DocSecRefItem *) {}
+ void visitPre(DocSecRefList *) {}
+ void visitPost(DocSecRefList *) {}
+ void visitPre(DocParamSect *) {}
+ void visitPost(DocParamSect *) {}
+ void visitPre(DocParamList *) {}
+ void visitPost(DocParamList *) {}
+ void visitPre(DocXRefItem *) {}
+ void visitPost(DocXRefItem *) {}
+ void visitPre(DocInternalRef *) {}
+ void visitPost(DocInternalRef *) {}
+ void visitPre(DocCopy *) {}
+ void visitPost(DocCopy *) {}
+ void visitPre(DocText *) {}
+ void visitPost(DocText *) {}
+
+ private:
+
+ void filter(const char *str);
+
+ FTextStream &m_t;
+};
+
+#endif
diff --git a/src/translator.cpp b/src/translator.cpp
new file mode 100644
index 0000000..10dfa9b
--- /dev/null
+++ b/src/translator.cpp
@@ -0,0 +1,248 @@
+/*! \file translator.cpp
+ * \brief Implementation of generally used translator methods.
+ *
+ * This file contains implementation of the translator methods that
+ * are not expected to be reimplemented by derived translator classes.
+ * It also contains static data tables used by the methods.
+ *
+ */
+#include "translator.h"
+
+/*! The translation table used by Win1250ToISO88592() method. */
+const char Translator::Win1250ToISO88592Tab[] =
+{
+ '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
+ '\x88', '\x89', '\xA9', '\x8B', '\xA6', '\xAB', '\xAE', '\xAC',
+ '\x90', '\x91', '\x92', '\x93', '\x94', '\x2E', '\x96', '\x97',
+ '\x98', '\x99', '\xB9', '\x9B', '\xB6', '\xBB', '\xBE', '\xBC',
+ '\xA0', '\x20', '\x20', '\xA3', '\xA4', '\xA1', '\xA6', '\xA7',
+ '\x22', '\xA9', '\xAA', '\x3C', '\xAC', '\x2D', '\xAE', '\xAF',
+ '\x2E', '\x2B', '\x20', '\xB3', '\x27', '\x75', '\xB6', '\xB7',
+ '\x20', '\xB1', '\xBA', '\x3E', '\xA5', '\x22', '\xB5', '\xBF',
+ '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
+ '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
+ '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
+ '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
+ '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
+ '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
+ '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\x2D',
+ '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
+ '\0'
+};
+
+
+/*! The translation table used by ISO88592ToWin1250() method. */
+const char Translator::ISO88592ToWin1250Tab[] = {
+ '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
+ '\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F',
+ '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97',
+ '\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F',
+ '\xA0', '\xA5', '\xA2', '\xA3', '\xA4', '\xBC', '\x8C', '\xA7',
+ '\xA8', '\x8A', '\xAA', '\x8D', '\x8F', '\xAD', '\x8E', '\xAF',
+ '\xB0', '\xB9', '\xB2', '\xB3', '\xB4', '\xBE', '\x9C', '\xB7',
+ '\xB8', '\x9A', '\xBA', '\x9D', '\x9F', '\xBD', '\x9E', '\xBF',
+ '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
+ '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
+ '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
+ '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
+ '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
+ '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
+ '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\xF7',
+ '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
+ '\0'
+};
+
+
+/*! The translation table used by Koi8RToWindows1251() method. */
+const unsigned char Translator::Koi8RToWindows1251Tab[128] =
+{ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
+ 254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
+ 239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
+ 222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
+ 207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218
+};
+
+
+/*! The translation table used by Windows1251ToKoi8R() method. */
+const unsigned char Translator::Windows1251ToKoi8RTab[128] =
+{ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
+ 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
+ 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
+ 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
+ 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209
+};
+
+/*! Returns the string converted from windows-1250 to iso-8859-2. */
+/* The method was designed initially for translator_cz.h.
+ * It is used for on-line encoding conversion related to
+ * conditional compilation in Unix/MS Windows environments
+ * (both use different encoding). Later, the translator_hr.h
+ * (by Boris Bralo) used and improved the same style. As the
+ * method with the translation table was the same, the
+ * decision to move it to this base class was made. The same
+ * holds for ISO88592ToWin1250() method.
+ *
+ * Alexandr Chelpanov used the same approach for
+ * Koi8RToWindows1251() and Windows1251ToKoi8R() methods. Notice,
+ * that he uses Unicode tables.
+ *
+ * It is recommended for possibly other similar methods in future.
+ */
+QCString Translator::Win1250ToISO88592(const QCString & sInput)
+{
+ // The conversion table for characters >127
+ //
+
+ QCString result;
+ int len = sInput.length();
+
+ for (int i = 0; i < len; ++i)
+ {
+ unsigned int c = sInput[i];
+ result += (c > 127) ? Win1250ToISO88592Tab[c & 0x7F] : c;
+ }
+ return result;
+}
+
+
+/*! returns the string converted from iso-8859-2 to windows-1250 */
+/* See the comments of the Win1250ToISO88592() method for details. */
+QCString Translator::ISO88592ToWin1250(const QCString & sInput)
+{
+ // The conversion table for characters >127
+ //
+ QCString result;
+ int len = sInput.length();
+
+ for (int i = 0; i < len; ++i)
+ {
+ unsigned int c = sInput[i];
+ result += (c > 127) ? ISO88592ToWin1250Tab[c & 0x7F] : c;
+ }
+ return result;
+}
+
+
+/*! Returns the string converted from koi8-r to windows-1251. */
+/* The method was designed initially for translator_cz.h.
+ It is used for on-line encoding conversion related to conditional
+ compilation in Unix/MS Windows environments (both use different
+ encoding). Encoding table got from QT:qtextcodec.cpp
+ */
+QCString Translator::Koi8RToWindows1251( const QCString & sInput )
+{
+
+ QCString result(sInput);
+ int len = sInput.length();
+
+ const unsigned char * c = (const unsigned char *)(const char*)sInput;
+ unsigned char *dc = (unsigned char*)(const char*)result;
+ for( int i=0; i<len; i++ ) {
+ if ( c[i] > 127 )
+ dc[i] = Koi8RToWindows1251Tab[c[i]-128];
+ }
+ return result;
+}
+
+
+/*! returns the string converted from Windows-1251 to koi8-r */
+/* See the comments of the Koi8RToWindows1251() method for details.
+ Encoding table got from QT:qtextcodec.cpp */
+QCString Translator::Windows1251ToKoi8R( const QCString & sInput )
+{
+ QCString result(sInput);
+ int len = sInput.length();
+
+ const unsigned char * c = (const unsigned char *)(const char*)sInput;
+ unsigned char *dc = (unsigned char*)(const char*)result;
+ for( int i=0; i<len; i++ ) {
+ if ( c[i] > 127 )
+ dc[i] = Windows1251ToKoi8RTab[c[i]-128];
+ }
+ return result;
+}
+
+/*! returns the caracter converted from hankaku-kana to zenkakukana.
+ Thanks Yongmao Ni http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/ */
+unsigned int hankaku2zen(int hankaku)
+{
+ static unsigned int z[64] = {
+ 0x2121,0x2123,0x2156,0x2157,0x2122,0x2126,0x2572,0x2521,
+ 0x2523,0x2525,0x2527,0x2529,0x2563,0x2565,0x2567,0x2543,
+ 0x213c,0x2522,0x2524,0x2526,0x2528,0x252a,0x252b,0x252d,
+ 0x252f,0x2531,0x2533,0x2535,0x2537,0x2539,0x253b,0x253d,
+ 0x253f,0x2541,0x2544,0x2546,0x2548,0x254a,0x254b,0x254c,
+ 0x254d,0x254e,0x254f,0x2552,0x2555,0x2558,0x255b,0x255e,
+ 0x255f,0x2560,0x2561,0x2562,0x2564,0x2566,0x2568,0x2569,
+ 0x256a,0x256b,0x256c,0x256d,0x256f,0x2573,0x212b,0x212c };
+
+ if (hankaku < 0xa0 || hankaku > 0xdf) return 0;
+ return z[hankaku - 0xa0];
+}
+
+/*! returns the character converted from japaneseEUC to SJIS
+ Thanks Yongmao Ni http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/ */
+unsigned int euc2sjis(unsigned int euc)
+{
+ unsigned int jis;
+ unsigned int hib, lob;
+
+ if ((euc & 0xff00) == 0x8e00)
+ jis = hankaku2zen(euc & 0xff);
+ else jis = euc & ~0x8080;
+
+ hib = (jis >> 8) & 0xff;
+ lob = jis & 0xff;
+ lob += (hib & 1) ? 0x1f : 0x7d;
+ if (lob >= 0x7f) lob++;
+ hib = ((hib - 0x21) >> 1) + 0x81;
+ if (hib > 0x9f) hib += 0x40;
+
+ return (hib << 8) | lob;
+}
+
+
+/*! returns the string converted from Japanese-EUC to SJIS */
+
+QCString Translator::JapaneseEucToSjis( const QCString & sInput )
+{
+ QString result;
+ int len = sInput.length();
+ int c1,c2,sj;
+
+ result.setUnicode(0, len);
+ QChar* uc = (QChar*)result.unicode(); // const_cast
+ const unsigned char * c = (const unsigned char *)(const char*)sInput;
+
+ for( int i=0; i<len;)
+ {
+ c1 = c[i];
+
+ if( c1 == EOF ) break;
+
+ /* if MSB=0 then the character is ascii */
+ if(!( c1 & 0x80))
+ {
+ uc[i] = c[i];
+ i=i+1;
+ }
+ else
+ {
+ c2 = c[i+1];
+ if( c2 == EOF ) break;
+ sj = euc2sjis( (c1 << 8) + c2 );
+ uc[i] = sj >> 8;
+ uc[i+1] = sj & 0xff;
+ i+=2;
+ }
+ }
+
+ return result.latin1();
+
+}
diff --git a/src/translator.h b/src/translator.h
new file mode 100644
index 0000000..e69b08c
--- /dev/null
+++ b/src/translator.h
@@ -0,0 +1,503 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_H
+#define TRANSLATOR_H
+
+#include "qtbc.h"
+#include "classdef.h"
+#include "util.h"
+#include "config.h"
+
+class Translator
+{
+ private:
+ /* Tables for encoding conversions. */
+ static const char Win1250ToISO88592Tab[];
+ static const char ISO88592ToWin1250Tab[];
+ static const unsigned char Koi8RToWindows1251Tab[128];
+ static const unsigned char Windows1251ToKoi8RTab[128];
+
+ protected:
+ /*! Returns the string converted from windows-1250 to iso-8859-2. */
+ QCString Win1250ToISO88592(const QCString & sInput);
+
+ /*! Returns the string converted from iso-8859-2 to windows-1250. */
+ QCString ISO88592ToWin1250(const QCString & sInput);
+
+ /*! Returns the string converted from koi8-r to windows-1251. */
+ QCString Koi8RToWindows1251( const QCString & sInput );
+
+ /*! Returns the string converted from windows-1251 to koi8-r. */
+ QCString Windows1251ToKoi8R( const QCString & sInput );
+
+ /*! Returns the string converted from Japanese-EUC to SJIS. */
+ QCString JapaneseEucToSjis( const QCString & sInput );
+
+ public:
+
+ /*! This method is used to provide warning message that is displayed
+ * if the user chooses a language whose translation is not up to date.
+ * It is implemented by the adapter classes.
+ */
+ virtual QCString updateNeededMessage() { return ""; }
+ virtual ~Translator() {}
+
+ // Please, have a look at comments inside the translator_en.h file
+ // to learn the meaning of the following methods. The translator_en.h
+ // file contains the TranslatorEnglish implementation, which is
+ // always up-to-date (by definition).
+
+ // --- Language control methods -------------------
+
+ virtual QCString idLanguage() = 0;
+ virtual QCString latexLanguageSupportCommand() = 0;
+ virtual QCString idLanguageCharset() = 0;
+
+ // --- Language translation methods -------------------
+
+ virtual QCString trRelatedFunctions() = 0;
+ virtual QCString trRelatedSubscript() = 0;
+ virtual QCString trDetailedDescription() = 0;
+ virtual QCString trMemberTypedefDocumentation() = 0;
+ virtual QCString trMemberEnumerationDocumentation() = 0;
+ virtual QCString trMemberFunctionDocumentation() = 0;
+ virtual QCString trMemberDataDocumentation() = 0;
+ virtual QCString trMore() = 0;
+ virtual QCString trListOfAllMembers() = 0;
+ virtual QCString trMemberList() = 0;
+ virtual QCString trThisIsTheListOfAllMembers() = 0;
+ virtual QCString trIncludingInheritedMembers() = 0;
+ virtual QCString trGeneratedAutomatically(const char *s) = 0;
+ virtual QCString trEnumName() = 0;
+ virtual QCString trEnumValue() = 0;
+ virtual QCString trDefinedIn() = 0;
+
+ // quick reference sections
+
+ virtual QCString trModules() = 0;
+ virtual QCString trClassHierarchy() = 0;
+ virtual QCString trCompoundList() = 0;
+ virtual QCString trFileList() = 0;
+ //virtual QCString trHeaderFiles() = 0;
+ virtual QCString trCompoundMembers() = 0;
+ virtual QCString trFileMembers() = 0;
+ virtual QCString trRelatedPages() = 0;
+ virtual QCString trExamples() = 0;
+ virtual QCString trSearch() = 0;
+ virtual QCString trClassHierarchyDescription() = 0;
+ virtual QCString trFileListDescription(bool extractAll) = 0;
+ virtual QCString trCompoundListDescription() = 0;
+ virtual QCString trCompoundMembersDescription(bool extractAll) = 0;
+ virtual QCString trFileMembersDescription(bool extractAll) = 0;
+ //virtual QCString trHeaderFilesDescription() = 0;
+ virtual QCString trExamplesDescription() = 0;
+ virtual QCString trRelatedPagesDescription() = 0;
+ virtual QCString trModulesDescription() = 0;
+ //virtual QCString trNoDescriptionAvailable() = 0;
+
+ // index titles (the project name is prepended for these)
+
+ virtual QCString trDocumentation() = 0;
+ virtual QCString trModuleIndex() = 0;
+ virtual QCString trHierarchicalIndex() = 0;
+ virtual QCString trCompoundIndex() = 0;
+ virtual QCString trFileIndex() = 0;
+ virtual QCString trModuleDocumentation() = 0;
+ virtual QCString trClassDocumentation() = 0;
+ virtual QCString trFileDocumentation() = 0;
+ virtual QCString trExampleDocumentation() = 0;
+ virtual QCString trPageDocumentation() = 0;
+ virtual QCString trReferenceManual() = 0;
+ virtual QCString trDefines() = 0;
+ virtual QCString trFuncProtos() = 0;
+ virtual QCString trTypedefs() = 0;
+ virtual QCString trEnumerations() = 0;
+ virtual QCString trFunctions() = 0;
+ virtual QCString trVariables() = 0;
+ virtual QCString trEnumerationValues() = 0;
+ virtual QCString trDefineDocumentation() = 0;
+ virtual QCString trFunctionPrototypeDocumentation() = 0;
+ virtual QCString trTypedefDocumentation() = 0;
+ virtual QCString trEnumerationTypeDocumentation() = 0;
+ virtual QCString trFunctionDocumentation() = 0;
+ virtual QCString trVariableDocumentation() = 0;
+ virtual QCString trCompounds() = 0;
+ virtual QCString trGeneratedAt(const char *date,const char *projName) = 0;
+ virtual QCString trWrittenBy() = 0;
+ virtual QCString trClassDiagram(const char *clName) = 0;
+ virtual QCString trForInternalUseOnly() = 0;
+ //virtual QCString trReimplementedForInternalReasons() = 0;
+ virtual QCString trWarning() = 0;
+ //virtual QCString trBugsAndLimitations() = 0;
+ virtual QCString trVersion() = 0;
+ virtual QCString trDate() = 0;
+ virtual QCString trReturns() = 0;
+ virtual QCString trSeeAlso() = 0;
+ virtual QCString trParameters() = 0;
+ virtual QCString trExceptions() = 0;
+ virtual QCString trGeneratedBy() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNamespaceList() = 0;
+ virtual QCString trNamespaceListDescription(bool extractAll) = 0;
+ virtual QCString trFriends() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trRelatedFunctionDocumentation() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate) = 0;
+
+ virtual QCString trFileReference(const char *fileName) = 0;
+ virtual QCString trNamespaceReference(const char *namespaceName) = 0;
+
+ virtual QCString trPublicMembers() = 0;
+ virtual QCString trPublicSlots() = 0;
+ virtual QCString trSignals() = 0;
+ virtual QCString trStaticPublicMembers() = 0;
+ virtual QCString trProtectedMembers() = 0;
+ virtual QCString trProtectedSlots() = 0;
+ virtual QCString trStaticProtectedMembers() = 0;
+ virtual QCString trPrivateMembers() = 0;
+ virtual QCString trPrivateSlots() = 0;
+ virtual QCString trStaticPrivateMembers() = 0;
+ virtual QCString trWriteList(int numEntries) = 0;
+ virtual QCString trInheritsList(int numEntries) = 0;
+ virtual QCString trInheritedByList(int numEntries) = 0;
+ virtual QCString trReimplementedFromList(int numEntries) = 0;
+ virtual QCString trReimplementedInList(int numEntries) = 0;
+ virtual QCString trNamespaceMembers() = 0;
+ virtual QCString trNamespaceMemberDescription(bool extractAll) = 0;
+ virtual QCString trNamespaceIndex() = 0;
+ virtual QCString trNamespaceDocumentation() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNamespaces() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single) = 0;
+ virtual QCString trAlphabeticalList() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReturnValues() = 0;
+ virtual QCString trMainPage() = 0;
+ virtual QCString trPageAbbreviation() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ //virtual QCString trSources() = 0;
+ virtual QCString trDefinedAtLineInSourceFile() = 0;
+ virtual QCString trDefinedInSourceFile() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trCollaborationDiagram(const char *clName) = 0;
+ virtual QCString trInclDepGraph(const char *fName) = 0;
+ virtual QCString trConstructorDocumentation() = 0;
+ virtual QCString trGotoSourceCode() = 0;
+ virtual QCString trGotoDocumentation() = 0;
+ virtual QCString trPrecondition() = 0;
+ virtual QCString trPostcondition() = 0;
+ virtual QCString trInvariant() = 0;
+ virtual QCString trInitialValue() = 0;
+ virtual QCString trCode() = 0;
+
+ virtual QCString trGraphicalHierarchy() = 0;
+ virtual QCString trGotoGraphicalHierarchy() = 0;
+ virtual QCString trGotoTextualHierarchy() = 0;
+ virtual QCString trPageIndex() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote() = 0;
+ virtual QCString trPublicTypes() = 0;
+ virtual QCString trPublicAttribs() = 0;
+ virtual QCString trStaticPublicAttribs() = 0;
+ virtual QCString trProtectedTypes() = 0;
+ virtual QCString trProtectedAttribs() = 0;
+ virtual QCString trStaticProtectedAttribs() = 0;
+ virtual QCString trPrivateTypes() = 0;
+ virtual QCString trPrivateAttribs() = 0;
+ virtual QCString trStaticPrivateAttribs() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trTodo() = 0;
+ virtual QCString trTodoList() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy() = 0;
+ virtual QCString trRemarks() = 0;
+ virtual QCString trAttention() = 0;
+ virtual QCString trInclByDepGraph() = 0;
+ virtual QCString trSince() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trLegendTitle() = 0;
+ virtual QCString trLegendDocs() = 0;
+ virtual QCString trLegend() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trTest() = 0;
+ virtual QCString trTestList() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDCOPMethods() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trProperties() = 0;
+ virtual QCString trPropertyDocumentation() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ //virtual QCString trInterfaces() = 0;
+ virtual QCString trClasses() = 0;
+ virtual QCString trPackage(const char *name) = 0;
+ virtual QCString trPackageList() = 0;
+ virtual QCString trPackageListDescription() = 0;
+ virtual QCString trPackages() = 0;
+ //virtual QCString trPackageDocumentation() = 0;
+ virtual QCString trDefineValue() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trBug() = 0;
+ virtual QCString trBugList() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trRTFansicp() = 0;
+ virtual QCString trRTFCharSet() = 0;
+ virtual QCString trRTFGeneralIndex() = 0;
+
+ // Translation of the word
+
+ virtual QCString trClass(bool first_capital, bool singular) = 0;
+ virtual QCString trFile(bool first_capital, bool singular) = 0;
+ virtual QCString trNamespace(bool first_capital, bool singular) = 0;
+ virtual QCString trGroup(bool first_capital, bool singular) = 0;
+ virtual QCString trPage(bool first_capital, bool singular) = 0;
+ virtual QCString trMember(bool first_capital, bool singular) = 0;
+ //virtual QCString trField(bool first_capital, bool singular) = 0;
+ virtual QCString trGlobal(bool first_capital, bool singular) = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trAuthor(bool first_capital, bool singular) = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferences() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trImplementedFromList(int numEntries) = 0;
+ virtual QCString trImplementedInList(int numEntries) = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trRTFTableOfContents() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecatedList() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trEvents() = 0;
+ virtual QCString trEventDocumentation() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trPackageTypes() = 0;
+ virtual QCString trPackageMembers() = 0;
+ virtual QCString trStaticPackageMembers() = 0;
+ virtual QCString trPackageAttribs() = 0;
+ virtual QCString trStaticPackageAttribs() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trAll() = 0;
+ virtual QCString trCallGraph() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trSearchForIndex() = 0;
+ virtual QCString trSearchResultsTitle() = 0;
+ virtual QCString trSearchResults(int numDocuments) = 0;
+ virtual QCString trSearchMatches() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trSourceFile(QCString& filename) = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDirIndex() = 0;
+ virtual QCString trDirDocumentation() = 0;
+ virtual QCString trDirectories() = 0;
+ virtual QCString trDirDescription() = 0;
+ virtual QCString trDirReference(const char *dirName) = 0;
+ virtual QCString trDir(bool first_capital, bool singular) = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trOverloadText() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trCallerGraph() = 0;
+ virtual QCString trEnumerationValueDocumentation() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trMemberFunctionDocumentationFortran() = 0;
+ virtual QCString trCompoundListFortran() = 0;
+ virtual QCString trCompoundMembersFortran() = 0;
+ virtual QCString trCompoundListDescriptionFortran() = 0;
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll) = 0;
+ virtual QCString trCompoundIndexFortran() = 0;
+ virtual QCString trTypeDocumentation() = 0;
+ virtual QCString trSubprograms() = 0;
+ virtual QCString trSubprogramDocumentation() = 0;
+ virtual QCString trDataTypes() = 0;
+ virtual QCString trModulesList() = 0;
+ virtual QCString trModulesListDescription(bool extractAll) = 0;
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate) = 0;
+ virtual QCString trModuleReference(const char *namespaceName) = 0;
+ virtual QCString trModulesMembers() = 0;
+ virtual QCString trModulesMemberDescription(bool extractAll) = 0;
+ virtual QCString trModulesIndex() = 0;
+ virtual QCString trModule(bool first_capital, bool singular) = 0;
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single) = 0;
+ virtual QCString trType(bool first_capital, bool singular) = 0;
+ virtual QCString trSubprogram(bool first_capital, bool singular) = 0;
+ virtual QCString trTypeConstraints() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDirRelation(const char *name) = 0;
+ virtual QCString trLoading() = 0;
+ virtual QCString trGlobalNamespace() = 0;
+ virtual QCString trSearching() = 0;
+ virtual QCString trNoMatches() = 0;
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDirDependency(const char *name) = 0;
+ virtual QCString trFileIn(const char *name) = 0;
+ virtual QCString trIncludesFileIn(const char *name) = 0;
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime) = 0;
+
+
+};
+
+#endif
diff --git a/src/translator_adapter.h b/src/translator_adapter.h
new file mode 100644
index 0000000..3c99783
--- /dev/null
+++ b/src/translator_adapter.h
@@ -0,0 +1,234 @@
+#ifndef TRANSLATOR_ADAPTER_H
+#define TRANSLATOR_ADAPTER_H
+
+#include "version.h"
+
+/*! \brief Base of the translator adapter tree
+ *
+
+ * This abstract class provides access to the english
+ * translations, to be used as a substitute for not implemented
+ * local translations.
+ */
+class TranslatorAdapterBase : public Translator
+{
+ protected:
+ virtual ~TranslatorAdapterBase() {}
+ TranslatorEnglish english;
+
+ /*! An auxiliary inline method used by the updateNeededMessage()
+ * for building a warning message.
+ */
+ inline QCString createUpdateNeededMessage(const QCString & languageName,
+ const QCString & versionString)
+ {
+ return QCString("Warning: The selected output language \"")
+ + languageName
+ + "\" has not been updated\nsince "
+ + versionString
+ + ". As a result some sentences may appear in English.\n\n";
+ }
+
+ public:
+ /*! This method is used to generate a warning message to signal
+ * the user that the translation of his/her language of choice
+ * needs updating. It must be implemented by the translator
+ * adapter class (pure virtual).
+ *
+ * \sa createUpdateNeededMessage()
+ */
+ virtual QCString updateNeededMessage() = 0;
+
+};
+
+class TranslatorAdapter_1_6_3 : public TranslatorAdapterBase
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.6.3"); }
+
+ virtual QCString trDirDependency(const char *name)
+ { return english.trDirDependency(name); }
+ virtual QCString trFileIn(const char *name)
+ { return english.trFileIn(name); }
+ virtual QCString trIncludesFileIn(const char *name)
+ { return english.trIncludesFileIn(name); }
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ { return english.trDateTime(year,month,day,dayOfWeek,hour,minutes,seconds,includeTime); }
+};
+
+class TranslatorAdapter_1_6_0 : public TranslatorAdapter_1_6_3
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.6.0"); }
+
+ virtual QCString trDirRelation(const char *name)
+ { return english.trDirRelation(name); }
+
+ virtual QCString trLoading()
+ { return english.trLoading(); }
+
+ virtual QCString trGlobalNamespace()
+ { return english.trGlobalNamespace(); }
+
+ virtual QCString trSearching()
+ { return english.trSearching(); }
+
+ virtual QCString trNoMatches()
+ { return english.trNoMatches(); }
+};
+
+class TranslatorAdapter_1_5_4 : public TranslatorAdapter_1_6_0
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.5.4"); }
+
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return english.trMemberFunctionDocumentationFortran(); }
+
+ virtual QCString trCompoundListFortran()
+ { return english.trCompoundListFortran(); }
+
+ virtual QCString trCompoundMembersFortran()
+ { return english.trCompoundMembersFortran(); }
+
+ virtual QCString trCompoundListDescriptionFortran()
+ { return english.trCompoundListDescriptionFortran(); }
+
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ { return english.trCompoundMembersDescriptionFortran(extractAll); }
+
+ virtual QCString trCompoundIndexFortran()
+ { return english.trCompoundIndexFortran(); }
+
+ virtual QCString trTypeDocumentation()
+ { return english.trTypeDocumentation(); }
+
+ virtual QCString trSubprograms()
+ { return english.trSubprograms(); }
+
+ virtual QCString trSubprogramDocumentation()
+ { return english.trSubprogramDocumentation(); }
+
+ virtual QCString trDataTypes()
+ { return english.trDataTypes(); }
+
+ virtual QCString trModulesList()
+ { return english.trModulesList(); }
+
+ virtual QCString trModulesListDescription(bool extractAll)
+ { return english.trModulesListDescription(extractAll); }
+
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ { return english.trCompoundReferenceFortran(clName,compType,isTemplate); }
+
+ virtual QCString trModuleReference(const char *namespaceName)
+ { return english.trModuleReference(namespaceName); }
+
+ virtual QCString trModulesMembers()
+ { return english.trModulesMembers(); }
+
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ { return english.trModulesMemberDescription(extractAll); }
+
+ virtual QCString trModulesIndex()
+ { return english.trModulesIndex(); }
+
+ virtual QCString trModule(bool first_capital, bool singular)
+ { return english.trModule(first_capital,singular); }
+
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { return english.trGeneratedFromFilesFortran(compType,single); }
+
+ virtual QCString trType(bool first_capital, bool singular)
+ { return english.trType(first_capital,singular); }
+
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ { return english.trSubprogram(first_capital,singular); }
+
+ virtual QCString trTypeConstraints()
+ { return english.trTypeConstraints(); }
+};
+
+class TranslatorAdapter_1_4_6 : public TranslatorAdapter_1_5_4
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.4.6"); }
+
+ virtual QCString trCallerGraph()
+ {
+ return english.trCallerGraph();
+ }
+ virtual QCString trEnumerationValueDocumentation()
+ {
+ return english.trEnumerationValueDocumentation();
+ }
+};
+
+class TranslatorAdapter_1_4_1 : public TranslatorAdapter_1_4_6
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.4.1"); }
+
+ virtual QCString trOverloadText()
+ { return english.trOverloadText(); }
+};
+
+class TranslatorAdapter_1_3_9 : public TranslatorAdapter_1_4_1
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.3.9"); }
+
+ virtual QCString trDirIndex()
+ { return english.trDirIndex(); }
+ virtual QCString trDirDocumentation()
+ { return english.trDirDocumentation(); }
+ virtual QCString trDirectories()
+ { return english.trDirectories(); }
+ virtual QCString trDirDescription()
+ { return english.trDirDescription(); }
+ virtual QCString trDirReference(const char *dirName)
+ { return english.trDirReference(dirName); }
+ virtual QCString trDir(bool first_capital, bool singular)
+ { return english.trDir(first_capital,singular); }
+};
+
+class TranslatorAdapter_1_3_8 : public TranslatorAdapter_1_3_9
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.3.8"); }
+
+ virtual QCString trSourceFile(QCString& filename)
+ { return english.trSourceFile(filename); }
+};
+
+class TranslatorAdapter_1_3_3 : public TranslatorAdapter_1_3_8
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.3.3"); }
+
+ virtual QCString trSearchForIndex()
+ { return english.trSearchForIndex(); }
+ virtual QCString trSearchResultsTitle()
+ { return english.trSearchResultsTitle(); }
+ virtual QCString trSearchResults(int numDocuments)
+ { return english.trSearchResults(numDocuments); }
+ virtual QCString trSearchMatches()
+ { return english.trSearchMatches(); }
+
+};
+
+#endif
+
diff --git a/src/translator_ar.h b/src/translator_ar.h
new file mode 100644
index 0000000..b6f6e7c
--- /dev/null
+++ b/src/translator_ar.h
@@ -0,0 +1,1615 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/*
+ * Arabic translation for Doxygen
+ *
+ * Please send your comments on this translation to moazreyad@yahoo.com
+ *
+ * Note : consider this file as Beta version for testing Arabic output with Doxygen.
+ *
+ * Revision history :
+ *
+ * 6/2006 : Created initial version of Arabic translation.
+ */
+
+#ifndef TRANSLATOR_AR_H
+#define TRANSLATOR_AR_H
+
+class TranslatorArabic : public TranslatorAdapter_1_4_6
+{
+ protected:
+ friend class TranslatorAdapterBase;
+ virtual ~TranslatorArabic() {}
+
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "arabic"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "cp1256";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return " "; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "( )"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return " "; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return " "; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return " "; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return " "; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " ";
+ }
+ else
+ {
+ return " ";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return " ..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return " "; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return " "; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return " "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", "; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result=" Doxygen";
+ if (s) result+=(QCString)" "+s;
+ result+=" .";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return " "; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return " "; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return " "; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return ""; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return " "; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " ";
+ }
+ else
+ {
+ return " ";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return " "; }
+
+ /*! This is put above each page as a link to the list of all verbatim headers */
+ virtual QCString trHeaderFiles()
+ { return " "; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " ";
+ }
+ else
+ {
+ return " ";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "";
+ }
+ else
+ {
+ return " ";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return " "; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return ""; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return ""; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return " "
+ " :";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll) result+=" ";
+ result+=" :";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " :";
+ }
+ else
+ {
+ return " "
+ " :";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result=" ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=" ";
+ }
+ else
+ {
+ result+=" ";
+ }
+ if (!extractAll)
+ {
+ result+=" ";
+ }
+ result+=" ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=" / :";
+ }
+ else
+ {
+ result+=" :";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="/ :";
+ }
+ else
+ {
+ result+=" :";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="functions, variables, defines, enums, and typedefs";
+ }
+ else
+ {
+ result+="file members";
+ }
+ result+=" with links to ";
+ if (extractAll)
+ result+="the files they belong to:";
+ else
+ result+="the documentation:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all header files. */
+ virtual QCString trHeaderFilesDescription()
+ { return "Here are the header files that make up the API:"; }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return " :"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return " :"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return " :"; }
+
+ /*! This sentences is used in the annotated class/file lists if no brief
+ * description is given.
+ */
+ virtual QCString trNoDescriptionAvailable()
+ { return " "; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return ""; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " ";
+ }
+ else
+ {
+ return " ";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " ";
+ }
+ else
+ {
+ return " ";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return " "; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return ""; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Function Prototypes"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Typedefs"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return ""; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return ""; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return ""; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Enumerator"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Define Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Function Prototype Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Typedef Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Enumeration Type Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Enumerator Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return " "; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return " "; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " ";
+ }
+ else
+ {
+ return "";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generated on "+date;
+ if (projName) result+=(QCString)" for "+projName;
+ result+=(QCString)" by";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return " ";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Inheritance diagram for "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return " ."; }
+
+ /*! this text is generated when the \\reimp command is used. */
+ virtual QCString trReimplementedForInternalReasons()
+ { return "Reimplemented for internal reasons; the API is not affected."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return ""; }
+
+ /*! this text is generated when the \\bug command is used. */
+ virtual QCString trBugsAndLimitations()
+ { return "Bugs and limitations"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return ""; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return ""; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Returns"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return " "; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parameters"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return ""; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return " "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return " "; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+ result+="namespaces with brief descriptions:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Friends And Related Function Documentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Class"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Reference";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" File Reference";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Namespace Reference";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Public Member Functions"; }
+ virtual QCString trPublicSlots()
+ { return "Public Slots"; }
+ virtual QCString trSignals()
+ { return "Signals"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Static Public Member Functions"; }
+ virtual QCString trProtectedMembers()
+ { return "Protected Member Functions"; }
+ virtual QCString trProtectedSlots()
+ { return "Protected Slots"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Static Protected Member Functions"; }
+ virtual QCString trPrivateMembers()
+ { return "Private Member Functions"; }
+ virtual QCString trPrivateSlots()
+ { return "Private Slots"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Static Private Member Functions"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", and ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Inherits "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Inherited by "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplemented from "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplemented in "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Namespace Members"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+ result+="namespace members with links to ";
+ if (extractAll)
+ result+="the namespace documentation for each member:";
+ else
+ result+="the namespaces they belong to:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return " "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return " "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)" ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" "; break;
+ case ClassDef::Struct: result+=" "; break;
+ case ClassDef::Union: result+=" "; break;
+ case ClassDef::Interface: result+=" "; break;
+ case ClassDef::Protocol: result+=" "; break;
+ case ClassDef::Category: result+=" "; break;
+ case ClassDef::Exception: result+=" "; break;
+ }
+ result+=" ";
+ if (single) result+=" :"; else result+=" :";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return " "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return " "; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return " "; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trSources()
+ {
+ return "";
+ }
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definition at line @0 of file @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definition in file @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Deprecated";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)" "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)" "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return " ";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return " .";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return " .";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return " ";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return " ";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return " :";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return " ";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return " ";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return " ";
+ }
+ virtual QCString trPageIndex()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return " ";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " ";
+ }
+ else
+ {
+ return " ";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return " ";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return " ";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return " ";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return " ";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return " ";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return " ";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return " ";
+ }
+ virtual QCString trRemarks()
+ {
+ return "";
+ }
+ virtual QCString trAttention()
+ {
+ return "";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return " "
+ " :";
+ }
+ virtual QCString trSince()
+ {
+ return "";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Graph Legend";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "This page explains how to interpret the graphs that are generated "
+ "by doxygen.<p>\n"
+ "Consider the following example:\n"
+ "\\code\n"
+ "/*! Invisible class because of truncation */\n"
+ "class Invisible { };\n\n"
+ "/*! Truncated class, inheritance relation is hidden */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Class not documented with doxygen comments */\n"
+ "class Undocumented { };\n\n"
+ "/*! Class that is inherited using public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Class that is inherited using protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Class that is inherited using private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Class that is used by the Inherited class */\n"
+ "class Used { };\n\n"
+ "/*! Super class that inherits a number of other classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
+ "is set to 240 this will result in the following graph:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "The boxes in the above graph have the following meaning:\n"
+ "<ul>\n"
+ "<li>%A filled black box represents the struct or class for which the "
+ "graph is generated.\n"
+ "<li>%A box with a black border denotes a documented struct or class.\n"
+ "<li>%A box with a grey border denotes an undocumented struct or class.\n"
+ "<li>%A box with a red border denotes a documented struct or class for"
+ "which not all inheritance/containment relations are shown. %A graph is "
+ "truncated if it does not fit within the specified boundaries.\n"
+ "</ul>\n"
+ "The arrows have the following meaning:\n"
+ "<ul>\n"
+ "<li>%A dark blue arrow is used to visualize a public inheritance "
+ "relation between two classes.\n"
+ "<li>%A dark green arrow is used for protected inheritance.\n"
+ "<li>%A dark red arrow is used for private inheritance.\n"
+ "<li>%A purple dashed arrow is used if a class is contained or used "
+ "by another class. The arrow is labeled with the variable(s) "
+ "through which the pointed class or struct is accessible.\n"
+ "<li>%A yellow dashed arrow denotes a relation between a template instance and "
+ "the template class it was instantiated from. The arrow is labeled with "
+ "the template parameters of the instance.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legend";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Member Functions";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java interfaces in the summary section of Java packages */
+ virtual QCString trInterfaces()
+ {
+ return "";
+ }
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " ";
+ }
+ else
+ {
+ return "";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)" "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return " ";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return " ) ( :";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "";
+ }
+ /*! Used as a chapter title for Latex & RTF output */
+ virtual QCString trPackageDocumentation()
+ {
+ return " ";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return ":";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1256";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool /*first_capital*/, bool singular)
+ {
+ QCString result("");
+ if (!singular) result="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool /*first_capital*/, bool singular)
+ {
+ QCString result("");
+ if (!singular) result="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool /*first_capital*/, bool singular)
+ {
+ QCString result(" ");
+ if (!singular) result=" ";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool /*first_capital*/, bool singular)
+ {
+ QCString result("");
+ if (!singular) result="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool /*first_capital*/, bool singular)
+ {
+ QCString result("");
+ if (!singular) result="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool /*first_capital*/, bool singular)
+ {
+ QCString result("");
+ if (!singular) result="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trField(bool /*first_capital*/, bool singular)
+ {
+ QCString result("");
+ if (!singular) result="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool /*first_capital*/, bool singular)
+ {
+ QCString result("");
+ if (!singular) result="";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool /*first_capital*/, bool singular)
+ {
+ QCString result("");
+ if (!singular) result="";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implements "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implemented in "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Deprecated List";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return " ";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return " ";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return " ";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return " ";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return " :";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return " ";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return " ";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return " .";
+ }
+ else if (numDocuments==1)
+ {
+ return " . <b>1</b> .";
+ }
+ else
+ {
+ return " <b>$num</b> ."
+ " .";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return " :";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return " " + filename ;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return " "; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return " "; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return ""; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return " ɡ "
+ " :";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=" "; result+=dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Director" : "director"));
+ if (singular) result+="y"; else result+="ies";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return " "
+ " . "
+ " argument(s) .";
+ }
+};
+
+#endif
diff --git a/src/translator_br.h b/src/translator_br.h
new file mode 100644
index 0000000..5d04b40
--- /dev/null
+++ b/src/translator_br.h
@@ -0,0 +1,1866 @@
+/******************************************************************************
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative workns derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Brazilian Portuguese translation version 20100531
+ * Maintainer: Fabio "FJTC" Jun Takada Chino <jun-chino at uol.com.br>
+ * Thanks to Jorge Ramos, Fernando Carijo and others for their contributions.
+ *
+ * History:
+ * 20100531:
+ * - Updated to 1.6.3;
+ * 20091218:
+ * - Updated to 1.6.1;
+ * - Copyright year updated;
+ * - Translation updates suggested by Fernando Carijó added;
+ * 20080709:
+ * - References to MAX_DOT_GRAPH_HEIGHT removed from trLegendDocs().
+ * 20080206:
+ * - Method trTypeContraints() renamed to trTypeConstraints().
+ * 20071216:
+ * - New methods since 1.5.4 updated.
+ * Previous history removed from this version.
+ */
+#ifndef TRANSLATOR_BR_H
+#define TRANSLATOR_BR_H
+
+class TranslatorBrazilian : public Translator
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. May resemble
+ * the string returned by latexBabelPackage(), but it is not used
+ * for the same purpose. The identification should not be translated.
+ * It should be replaced by the name of the language in English
+ * (e.g. Czech, Japanese, Russian, etc.). It should be equal to
+ * the identification in language.h.
+ */
+ virtual QCString idLanguage()
+ {
+ return "brazil";
+ }
+
+ /*! Used to get the command(s) for the language support. This method
+ * was designed for languages which do not prefer babel package.
+ * If this methods returns empty string, then the latexBabelPackage()
+ * method is used to generate the command for using the babel package.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[brazil]{babel}";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Funções Relacionadas"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Note que estas não são funções membros.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Descrição Detalhada"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Definições de Tipos"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Enumerações"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Métodos"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Campos";
+ }
+ else
+ {
+ return "Atributos";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Mais..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Lista de todos os Membros."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Lista dos Membros"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Esta é a lista de todos os membros de "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", incluindo os membros herdados."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Gerado automaticamente por Doxygen";
+ if (s) result+=(QCString)" para "+s;
+ result+=" a partir de seu código-fonte.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "[Enumeração]"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "[Valor enumerado]"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "definido(a) em"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Módulos"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Hierarquia de Classes"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estruturas de Dados";
+ }
+ else
+ {
+ return "Lista de Componentes";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Lista de Arquivos"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Campos de Dados";
+ }
+ else
+ {
+ return "Componentes Membros";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globais";
+ }
+ else
+ {
+ return "Arquivos Membros";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Páginas relacionadas"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Exemplos"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Busca"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Esta lista de hierarquias está parcialmente ordenada (ordem alfabética):"; }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Esta é a lista de todos os arquivos ";
+ if (!extractAll) result+="documentados ";
+ result+="e suas respectivas descrições:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Aqui estão as estruturas de dados, uniões e suas respectivas descrições:";
+ }
+ else
+ {
+ return "Aqui estão as classes, estruturas, uniões e interfaces e suas respectivas descrições:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Esta é a lista de ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="todas as estruturas e campos de uniões ";
+ if (!extractAll)
+ {
+ result+="documentas";
+ }
+ }
+ else
+ {
+ result+="todos os membros de classes ";
+ if (!extractAll)
+ {
+ result+="documentos";
+ }
+ }
+ result+=" com referências para ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="a documentação da estrutura/união de cada campo:";
+ }
+ else
+ {
+ result+="a documentação da classe de cada membro:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="a estrutura/união a que pertencem:";
+ }
+ else
+ {
+ result+="a classe a que pertencem:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Esta é a lista de ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="todas as funções, variáveis, definições, enumerações e definições de tipos ";
+ if (!extractAll) result+="documentadas ";
+ }
+ else
+ {
+ result+="todos os membros dos arquivos ";
+ if (!extractAll) result+="documentados ";
+ }
+ result+="com referências para ";
+ if (extractAll)
+ result+="seus respectivos arquivos:";
+ else
+ result+="suas respectivas documentações:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Esta é a lista com todos os exemplos:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Esta é a lista com toda a documentação relacionadas:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Esta é a lista com todos os módulos:"; }
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "\nDocumentação"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Índice dos Módulos"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Índice Hierárquico"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Índice das Estruturas de Dados";
+ }
+ else
+ {
+ return "Índice dos Componentes";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Índice dos Arquivos"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Módulos"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estruturas";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Arquivos"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Exemplos"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Documentação Relacionada"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Guia de Referência"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Definições e Macros"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Protótipos de Funções"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Definições de Tipos"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumerações"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funções"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variáveis"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Valores enumerados"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Definições e macros"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Protótipos das funções"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Definições dos tipos"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Enumerações"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Funções"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Variáveis"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estruturas de Dados";
+ }
+ else
+ {
+ return "Componentes";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Gerado em "+date;
+ if (projName) result+=(QCString)" para "+projName;
+ result+=(QCString)" por";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "escrito por";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de Hierarquia para "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Apenas para uso interno."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Aviso"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versão"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Data"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Retorna"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Veja também"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parâmetros"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Exceções"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Gerado por"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Lista de Namespaces"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Esta é a lista de todos os Namespaces ";
+ if (!extractAll) result+="documentados ";
+ result+="com suas respectivas descrições:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Amigas"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Amigas e Funções Relacionadas"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referência da";
+ if (isTemplate) result+=" Template de";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Classe "; break;
+ case ClassDef::Struct: result+=" Estrutura "; break;
+ case ClassDef::Union: result+=" União "; break;
+ case ClassDef::Interface: result+=" Interface "; break;
+ case ClassDef::Protocol: result+=" Protocolo "; break;
+ case ClassDef::Category: result+=" Categoria "; break;
+ case ClassDef::Exception: result+=" Exceção "; break;
+ }
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result = "Referência do Arquivo ";
+ result += fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result ="Refência do Namespace ";
+ result += namespaceName;
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Métodos Públicos"; }
+ virtual QCString trPublicSlots()
+ { return "Slots Públicos"; }
+ virtual QCString trSignals()
+ { return "Sinais"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Métodos Públicos Estáticos"; }
+ virtual QCString trProtectedMembers()
+ { return "Métodos Protegidos"; }
+ virtual QCString trProtectedSlots()
+ { return "Slots Protegidos"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Métodos Protegidos Estáticos"; }
+ virtual QCString trPrivateMembers()
+ { return "Métodos Privados"; }
+ virtual QCString trPrivateSlots()
+ { return "Slots Privados"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Métodos Privados Estáticos"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" e ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Herdeiro de " + trWriteList(numEntries) + ".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Superclasse de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplementação de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementado por "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Membros do Namespace"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Esta é a lista com todos os membros do Namespace ";
+ if (!extractAll) result+="documentados ";
+ result+="com referências para ";
+ if (extractAll)
+ result+="a documentação de seus respectivos Namespaces:";
+ else
+ result+="os seus respectivos namespaces:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Namespaces"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"A documentação para esta ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="classe "; break;
+ case ClassDef::Struct: result+="estrutura "; break;
+ case ClassDef::Union: result+="união "; break;
+ case ClassDef::Interface: result+="interface "; break;
+ case ClassDef::Protocol: result+="protocolo "; break;
+ case ClassDef::Category: result+="categoria "; break;
+ case ClassDef::Exception: result+="exceção "; break;
+ }
+ result+=" foi gerada a partir ";
+ if (single) result+="do seguinte arquivo:"; else result+="dos seguintes arquivos:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Lista Alfabética"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Valores Retornados"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Página Principal"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "pag."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definição na linha @0 do arquivo @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definição no arquivo @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ /*
+ * This note is for brazilians only.
+ * Esta é uma boa tradução para "deprecated"?
+ */
+ return "Descontinuado(a)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de colaboração para "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Gráfico de dependência de inclusões para "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Construtores & Destrutores";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Vá para o código-fonte deste arquivo.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Vá para a documentação deste arquivo.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Pré-Condição";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Pós-Condição";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariante";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Valor Inicial:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "código";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Gráfico de Hierarquia de Classes";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Vá para o Gráfico de Hierarquia de Classes";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Vá para a Hierarquia de Classes (texto)";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Índice da Página";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Observação";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Tipos Públicos";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Campos de Dados";
+ }
+ else
+ {
+ return "Atributos Públicos";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Atributos Estáticos Públicos";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Tipos Protegidos";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Atributos Protegidos";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Atributos Estáticos Protegidos";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Tipos Privados";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Atributos Privados";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Atributos Privados Estáticos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "Futuras Atividades";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Lista de Futuras Atividades";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referenciado por";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Anotações";
+ }
+ virtual QCString trAttention()
+ {
+ return "Atenção";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Este grafo mostra quais arquivos estão direta ou indiretamente relacionados com este arquivo:";
+ }
+ virtual QCString trSince()
+ {
+ return "Desde";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Legenda do Grafo";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Esta página explica como interpretar os grafos gerados pelo doxygen.<p>\n"
+ "Considere o seguinte exemplo:\n"
+ "\\code\n"
+ "/*! Invisible class because of truncation */\n"
+ "class Invisible { };\n\n"
+ "/*! Truncated class, inheritance relation is hidden */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Class not documented with doxygen comments */\n"
+ "class Undocumented { };\n\n"
+ "/*! Class that is inherited using public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Class that is inherited using protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Class that is inherited using private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Class that is used by the Inherited class */\n"
+ "class Used { };\n\n"
+ "/*! Super class that inherits a number of other classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Isto irá gerar o seguinte gráfo:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "As caixas no grafo acima tem as seguintes interpretações:\n"
+ "<ul>\n"
+ "<li>Uma caixa inteiramente preta representa a estrutura ou a classe para qual "
+ "o grafo foi gerado.\n"
+ "<li>Uma caixa com bordas pretas denota uma estrutura ou classe documentada.\n"
+ "<li>Uma caixa com bordas cinzas denota uma estrutura ou classe não documentada.\n"
+
+ "<li>Uma caixa com bordas vermelhas denota uma estrutura ou classe documentada para\n"
+ "a qual nem todas as heranças ou componentes são mostradas no grafo. Um grafo é "
+ "truncado quando este é maior que o tamanho especificado."
+ "</ul>\n"
+ "As setas tem os seguintes significados:\n"
+ "<ul>\n"
+ "<li>Uma seta azul escura é utilizada para denotar uma relação de herança "
+ "pública entre duas classes.\n"
+ "<li>Uma seta verde escura é utilizada para denotar uma herança protegida.\n"
+ "<li>Uma seta vermelho escura é utilizada para denotar uma herança privada.\n"
+ "<li>Uma seta púrpura pontilhada é usada se uma classe está contida ou é utilizada"
+ "por outra classe. A seta é marcada com a(s) variável(eis) "
+ "através das quais a classe ou estrutura apontada está acessível. \n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Teste";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Lista de Testes";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Métodos DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Propriedades";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Propriedades";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estruturas de Dados";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Pacote "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Lista de Pacotes";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Esta é a lista com os pacotes e suas respectivas descrições (se disponíveis):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pacotes";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Valor:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Problema";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Lista de Problemas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Índice";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Classe" : "classe"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Arquivo": "arquivo"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grupo" : "grupo"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Página" : "página"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Membro" : "membro"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Globa" : "globa"));
+ if (!singular){
+ result+="is";
+ }else{
+ result+="l";
+ }
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autor" : "autor"));
+ if (!singular) result+="es";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referências";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementa "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implementation this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementado por "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Conteúdo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Lista de Descontinuados(as)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Eventos";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Eventos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Tipos do Pacote";
+ }
+
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funções do Pacote";
+ }
+
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Funções Estáticas do Pacote";
+ }
+
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atributos do Pacote";
+ }
+
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Atributos Estáticos do Pacote";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Todos";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Este é o diagrama das funções utilizadas por esta função:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Procurar por";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Resultado da Busca";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Nenhum documento foi encontrado.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Apenas <b>1</b> documento foi encontrado.";
+ }
+ else
+ {
+ return "<b>$num</b> documentos encontrados. "
+ "Os melhores resultados vem primeiro.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Resultados:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Código-Fonte de " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Hierarquia de Diretórios"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Documentação do Directório"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Diretórios"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Esta Hierarquia de Diretórios está parcialmente ordenada (ordem alfabética)"; }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ {
+ QCString result = "Referência do diretório ";
+ result += dirName;
+ return result;
+ }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Diretório" : "diretório"));
+ if (!singular) result+="s";
+ return result;
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Este é um método provido por conveniência. "
+ "Ele difere do método acima apenas na lista de "
+ "argumentos que devem ser utilizados.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Este é o diagrama das funções que utilizam esta função:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Documentação da enumeração"; }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Documentação de Função Membro/Subrotina"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Lista de Tipos de Dados"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Campos de Dados"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Aqui estão os tipos de dados com descrições resumidas:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Esta é a lista de todos os membros ";
+ if (!extractAll) result+="documentados ";
+ result+="dos tipos de dados com links para ";
+ if (extractAll)
+ {
+ result+="a documentação dos tipos de dados para cada membro:";
+ }
+ else
+ {
+ result+="os tipos de dados a que pertencem:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Índice de Tipos de Dados"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Documentação dos Tipos de Dados"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funções/Subrotinas"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Documentação da Função/Subrotina"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Tipos de Dados"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Lista de Módulos"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Esta é a lista de todos os módulos ";
+ if (!extractAll) result+="documentados ";
+ result+="com descrições resumidas:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result = (QCString)"Referência ";
+
+ if (isTemplate) result+="da Template ";
+
+ switch(compType)
+ {
+ case ClassDef::Class: result+="do Modulo "; break;
+ case ClassDef::Struct: result+="do Tipo "; break;
+ case ClassDef::Union: result+="da União "; break;
+ case ClassDef::Interface: result+="da Interface "; break;
+ case ClassDef::Protocol: result+="do Protocolo "; break;
+ case ClassDef::Category: result+="da Categoria "; break;
+ case ClassDef::Exception: result+="da Exceção "; break;
+ }
+ result += clName;
+
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result = "Referência do Módulo ";
+ result += namespaceName;
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Membros do Módulo"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Esta é a lista de todos os membros ";
+ if (!extractAll) result+="documentados ";
+ result+="dos módulos com links para ";
+ if (extractAll)
+ {
+ result+="a documentação dos módulos para cada membro:";
+ }
+ else
+ {
+ result+="os módulos a que pertencem:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Índice dos Módulos"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modulo" : "modulo"));
+ if (!singular) result+="s";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"A documentação para ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="este modulo "; break;
+ case ClassDef::Struct: result+="este tipo "; break;
+ case ClassDef::Union: result+="esta união "; break;
+ case ClassDef::Interface: result+="esta interface "; break;
+ case ClassDef::Protocol: result+="esto protocolo "; break;
+ case ClassDef::Category: result+="esta categoria "; break;
+ case ClassDef::Exception: result+="esta exceção "; break;
+ }
+
+ result+=" foi gerada a partir do";
+ if (single)
+ result+=" seguinte arquivo:";
+ else
+ result+="s seguintes arquivos:";
+
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tipo" : "tipo"));
+ if (!singular) result+="s";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprograma" : "subprograma"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! C# Type Contraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Restrições do Tipo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name
+ */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Relação " + QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Carregando...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Namespace global";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Procurando...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Nenhuma entrada encontrada";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Grafo de dependência de diretórios para "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Arquivo em "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Inclui arquivo em "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Segunda","Terça","Quarta","Quinta","Sexta","Sábado","Domingo" };
+ static const char *months[] = { "Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro" };
+ QCString sdate;
+ sdate.sprintf("%s, %d de %s de %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+};
+#endif
diff --git a/src/translator_ca.h b/src/translator_ca.h
new file mode 100644
index 0000000..8f72351
--- /dev/null
+++ b/src/translator_ca.h
@@ -0,0 +1,1822 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_CA_H
+#define TRANSLATOR_CA_H
+
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorCatalan : public TranslatorAdapter_1_6_3
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "catalan"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ //return "\\usepackage[catalan]{babel}\n\\usepackage[latin1]{inputenc}";
+ return "\\usepackage[catalan]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Funcions Associades"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Remarcar que aquestes funcions no són funcions membre.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Descripció Detallada"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Documentació de les Definicions de Tipus Membre"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Documentació de les Enumeracions Membre"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Documentació de les Funcions Membre"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentació dels Camps";
+ }
+ else
+ {
+ return "Documentació de les Dades Membre";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Més..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Llista de tots els membres."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Llista dels Membres"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Aquesta és la llista complerta dels membres de "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", incloent tots els membres heretats."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Generat automàticament per Doxygen";
+ if (s) result+=(QCString)" per a "+s;
+ result+=" a partir del codi font.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "nom de la enum"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "valors de la enum"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "definit a"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Mòduls"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Jerarquia de Classes"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estructures de Dades";
+ }
+ else
+ {
+ return "Llista de Classes";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Llista dels Fitxers"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Camps de Dades";
+ }
+ else
+ {
+ return "Membres de Classes";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globals";
+ }
+ else
+ {
+ return "Membres de Fitxers";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Pàgines Relacionades"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Exemples"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Cerca"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Aquesta llista d'herència està ordenada toscament, "
+ "però no completa, de forma alfabètica:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Aquesta és la llista de tots els fitxers ";
+ if (!extractAll) result+="documentats ";
+ result+="acompanyats amb breus descripcions:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Aquestes són les estructures de dades acompanyades amb breus descripcions:";
+ }
+ else
+ {
+ return "Aquestes són les classes, estructures, "
+ "unions i interfícies acompanyades amb breus descripcions:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Aquesta és la llista de tots els ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="camps d'estructures i unions";
+ }
+ else
+ {
+ result+="membres de classe";
+ }
+ if (!extractAll)
+ {
+ result+=" documentats";
+ }
+ result+=" amb enllaços a ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="la documentació de l'estructura/unió per a cada camp:";
+ }
+ else
+ {
+ result+="la documentació de la classe per a cada membre:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="les estructures/unions a que pertanyen:";
+ }
+ else
+ {
+ result+="les classes a que pertanyen:";
+ }
+ }
+ return result;
+ }
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Aquesta és la llista de ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="totes les funcions, variables, definicions, enumeracions, i definicions de tipus";
+ if (!extractAll) result+=" documentades";
+ }
+ else
+ {
+ result+="tots els membres de fitxers";
+ if (!extractAll) result+=" documentats";
+ }
+ result+=" amb enllaços ";
+ if (extractAll)
+ result+="als fitxers als quals corresponen:";
+ else
+ result+="a la documentació:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Aquesta és la llista de tots els exemples:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Aquesta és la llista de totes les pàgines de documentació associades:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Aquesta és la llista de mòduls:"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return ": Documentació"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Índex de Mòduls"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Índex Jeràrquic"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Índex d'Estructures de Dades";
+ }
+ else
+ {
+ return "Índex de Classes";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Índex de Fitxers"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Documentació dels Mòduls"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentació de les Estructures de Dades";
+ }
+ else
+ {
+ return "Documentació de les Classes";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Documentació dels Fitxers"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Documentació dels Exemples"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Documentació de les Pàgines"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Manual de Referència"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Definicions"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Prototipus de Funcions"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Definicions de Tipus"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumeracions"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funcions"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variables"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Valors de les Enumeracions"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Documentació de les Definicions"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Documentació de les Funcions Prototipus"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Documentació de les Definicions de Tipus"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Documentació dels Tipus de les Enumeracions"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Documentació de les Funcions"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Documentació de les Variables"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estructures de Dades";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generat a "+date;
+ if (projName) result+=(QCString)" per a "+projName;
+ result+=(QCString)" per";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "escrit per";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama d'Herència per a "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Tan sols per a ús intern."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Atenció"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versió"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Data"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Retorna"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Mireu també"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Paràmetres"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Excepcions"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Generat per"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Llista dels Espais de Noms"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Aquests són tots els espais de noms ";
+ if (!extractAll) result+="documentats ";
+ result+="amb breus descripcions:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Classes Amigues"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Documentació de funcions amigues i relacionades"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referència de";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" la Classe "; break;
+ case ClassDef::Struct: result+=" l'Estructura "; break;
+ case ClassDef::Union: result+=" la Unió "; break;
+ case ClassDef::Interface: result+=" la Interfície "; break;
+ case ClassDef::Protocol: result+="l Protocol "; break;
+ case ClassDef::Category: result+=" la Categoria "; break;
+ case ClassDef::Exception: result+=" l'Excepció "; break;
+ }
+ if (isTemplate) result+="Template ";
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result="Referència del Fitxer ";
+ result+=fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result="Referència de l'Espai de Noms ";
+ result+=namespaceName;
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Mètodes públics"; }
+ virtual QCString trPublicSlots()
+ { return "Slots públics"; }
+ virtual QCString trSignals()
+ { return "Senyals"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Mètodes Públics Estàtics"; }
+ virtual QCString trProtectedMembers()
+ { return "Mètodes Protegits"; }
+ virtual QCString trProtectedSlots()
+ { return "Slots Protegits"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Mètodes Protegits Estàtics"; }
+ virtual QCString trPrivateMembers()
+ { return "Mètodes Privats"; }
+ virtual QCString trPrivateSlots()
+ { return "Slots Privats"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Mètodes Privats Estàtics"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" i ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Hereta de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Heretat per "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplementat de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementat a "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Membres de l'Espai de Noms"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Aquesta és la llista de tots els membres de l'espai de noms ";
+ if (!extractAll) result+="documentats ";
+ result+="amb enllaços a ";
+ if (extractAll)
+ result+="la documentació de l'espai de noms de cada membre:";
+ else
+ result+="l'espai de noms al qual corresponen:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Índex d'Espais de Noms"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Documentació de l'Espai de Noms"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Espais de Noms"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"La documentació d'aquest";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="a classe"; break;
+ case ClassDef::Struct: result+="a estructura"; break;
+ case ClassDef::Union: result+="a unió"; break;
+ case ClassDef::Interface: result+="a interfície"; break;
+ case ClassDef::Protocol: result+=" protocol"; break;
+ case ClassDef::Category: result+="a categoria"; break;
+ case ClassDef::Exception: result+="a excepció"; break;
+ }
+ result+=" es va generar a partir del";
+ if (!single) result+="s";
+ result+=" següent";
+ if (!single) result+="s";
+ result+=" fitxer";
+ if (!single) result+="s:"; else result+=":";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Llista Alfabètica"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Valors de retorn"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Pàgina principal"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "p."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definició a la línia @0 del fitxer @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definició al fitxer @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Antiquat";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de col·laboració per a "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Inclou el graf de dependències per a "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Documentació del Constructor i el Destructor";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Veure el codi d'aquest fitxer.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Veure la documentació d'aquest fitxer.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Precondició";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postcondició";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Valor inicial:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "codi";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Jerarquia Gràfica de la Classe";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Veure la jerarquia gràfica de la classe";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Veure la jerarquia textual de la classe";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Índex de Pàgines";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Nota";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Tipus Públics";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Camps de Dades";
+ }
+ else
+ {
+ return "Atributs Públics";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Atributs Públics Estàtics";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Tipus Protegits";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Atributs Protegits";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Atributs Protegits Estàtics";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Tipus Privats";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Atributs Privats";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Atributs Privats Estàtics";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Per fer";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Llista de coses per fer";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referenciat a";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Remarca";
+ }
+ virtual QCString trAttention()
+ {
+ return "Atenció";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Aquest gràfic mostra quins fitxers inclouen, "
+ "de forma directa o indirecta, aquest fitxer:";
+ }
+ virtual QCString trSince()
+ {
+ return "Des de";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Llegenda del Gràfic";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Aquesta pàgina explica com s'interpreten els gràfics generats per doxygen.<p>\n"
+ "Considera aquest exemple:\n"
+ "\\code\n"
+ "/*! Classe invisible per culpa del retall */\n"
+ "class Invisible { };\n\n"
+ "/*! Classe truncada, l'herència està amagada */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Classe no documentada amb comentaris doxygen */\n"
+ "class Undocumented { };\n\n"
+ "/*! Classe heredada amb herència pública */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Una classe Template */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Classe heredada utilitzant herència protegida */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Classe heredada utiltzant herència privada */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Classe usada per la classe heretada */\n"
+ "class Used { };\n\n"
+ "/*! Super classe que hereda una quantitat de classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Resultarà el gràfic següent:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Les caixes del gràfic superior tenen aquesta interpretació:\n"
+ "<ul>\n"
+ "<li>Una caixa negra plena represent l'estructura o classe per la qual el gràfic s'ha generat.\n"
+ "<li>Una caixa de vora negra representa una estructura o classe documentada.\n"
+ "<li>Una caixa de vora verda representa una estructura o classe indocumentada.\n"
+ "<li>Una caixa de vora vermalla representa una estructura o classe documentada de la qual "
+ "no es mostren totes les relacions d'herència/inclusió. Un gràfic és truncat si no s'ajusta als límits.\n"
+ "</ul>\n"
+ "Les sagetes tenen aquest significat:\n"
+ "<ul>\n"
+ "<li>Una sageta blau fosc remarca una relació d'herència de tipus pública entre dues classes.\n"
+ "<li>Una sageta verd fosc remarca una relació d'herència de tipus protegida entre dues classes.\n"
+ "<li>Una sageta roig fosc remarca una relació d'herència de tipus privada entre dues classes.\n"
+ "<li>Una sageta puntejada de color porpra indica que una classe és continguda o usada per una altra classe."
+ " La sageta s'etiqueta amb la variable o variables a través de les quals la classe o estructura apuntada és accessible.\n"
+ "<li>Una sageta puntejada de color groc indica la relació entre una instància template i la classe template de què ha set instanciada."
+ " La sageta s'etiqueta amb els paràmetres template de la instància.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "llegenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Prova";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Llista de proves";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Mètodes DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Propietats";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Documentació de les Propietats";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estructures de Dades";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paquet "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Llista de Paquets";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Aquesta és la llista de paquets, amb una breu descripció (si se'n disposa):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Paquets";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Valor:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Error";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Llista d'Errors";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Índex";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Classe" : "classe"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Fitxer" : "fitxer"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grup" : "grup"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Pàgin" : "pàgin"));
+ if (!singular) result+="es"; else result+="a";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Membre" : "membre"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autor" : "autor"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referències";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementa "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementat a "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Taula de Continguts";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Llista d'Antiquats";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Esdeveniments";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Documentació dels Esdeveniments";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Tipus de paquets";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funcions de Paquet";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Funcions Estàtiques de Paquet";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atributs de Paquet";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Atributs Estàtics de Paquet";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Tot";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Gràfic de crides d'aquesta funció:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Buscar";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Resultats de la Búsqueda";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "No s'ha trobat cap document.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Trobat <b>1</b> document.";
+ }
+ else
+ {
+ return "Trobats <b>$num</b> documents. "
+ "Mostrant els millors resultats primer.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Resultats:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Fitxer de Codi " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Jerarquia de Directoris"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Documentació dels Directoris"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Directoris"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Aquesta jerarquia de directoris està ordenada toscament, "
+ "però no completa, de forma alfabètica:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result="Referència del Directori "; result+=dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Directori" : "directori"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Aquesta és una funció membre sobrecarregada, "
+ "proveïda per conveniència. Es diferencia de la funció "
+ "anterior només en els arguments que accepta.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Gràfic de crides a aquesta funció:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Documentació de les Enumeracions"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Documentació de les Funcions/Subrutines Membre"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Llista de Tipus de Dades"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Camps de Dades"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Aquests són els tipus de dades acompanyats amb breus descripcions:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Aquesta és la llista de tots els membres de tipus de dades";
+ if (!extractAll)
+ {
+ result+=" documentats";
+ }
+ result+=" amb enllaços a ";
+ if (!extractAll)
+ {
+ result+="la documentació del tipus de dades per a cada membre:";
+ }
+ else
+ {
+ result+="els tipus de dades a que pertanyen:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Índex de Tipus de Dades"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Documentació dels Tipus de Dades"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funcions/Subrutines"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Documentació de les Funcions/Subrutines"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Tipus de Dades"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Llista de Mòduls"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Aquesta és la llista de tots els mòduls ";
+ if (!extractAll) result+="documentats ";
+ result+="amb breus descripcions:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referència de";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" el Mòdul "; break;
+ case ClassDef::Struct: result+=" el Tipus "; break;
+ case ClassDef::Union: result+=" la Unió "; break;
+ case ClassDef::Interface: result+=" la Interfície "; break;
+ case ClassDef::Protocol: result+="l Protocol "; break;
+ case ClassDef::Category: result+=" la Categoria "; break;
+ case ClassDef::Exception: result+=" l'Excepció "; break;
+ }
+ if (isTemplate) result+="Template ";
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result="Referència del Mòdul ";
+ result+=namespaceName;
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Membres del Mòdul"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Aquesta és la llista de tots els membres del mòdul";
+ if (!extractAll)
+ {
+ result+=" documentats";
+ }
+ result+=" amb enllaços a ";
+ if (!extractAll)
+ {
+ result+="la documentació del mòdul per a cada membre:";
+ }
+ else
+ {
+ result+="els mòduls a que pertanyen:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Índex de Mòduls"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Mòdul" : "mòdul"));
+ if (!singular) result+="s";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"La documentació d'aquest";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" mòdul"; break;
+ case ClassDef::Struct: result+=" tipus"; break;
+ case ClassDef::Union: result+="a unió"; break;
+ case ClassDef::Interface: result+="a interfície"; break;
+ case ClassDef::Protocol: result+=" protocol"; break;
+ case ClassDef::Category: result+="a categoria"; break;
+ case ClassDef::Exception: result+="a excepció"; break;
+ }
+ result+=" es va generar a partir del";
+ if (!single) result+="s";
+ result+=" següent";
+ if (!single) result+="s";
+ result+=" fitxer";
+ if (!single) result+="s:"; else result+=":";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool)
+ {
+ QCString result((first_capital ? "Tipus" : "tipus"));
+ //if (!singular) result+="s";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprogram" : "subprogram"));
+ if (!singular) result+="es";
+ else result+="a";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Restriccions de Tipus";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" Relació";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Carregant...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Espai de Noms Global";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Cercant...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Cap coincidència";
+ }
+
+};
+
+#endif
diff --git a/src/translator_cn.h b/src/translator_cn.h
new file mode 100644
index 0000000..a04ed5d
--- /dev/null
+++ b/src/translator_cn.h
@@ -0,0 +1,1868 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_CN_H
+#define TRANSLATOR_CN_H
+
+/*!
+ If you want insert a space whenever Chinese meets English charactors, set
+ CN_SPC to " ", else null.
+*/
+#define CN_SPC
+
+class TranslatorChinese : public Translator
+{
+ public:
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It sould be equal to
+ * the identification used in the language.cpp.
+ */
+
+ virtual QCString idLanguage()
+ { return "chinese"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "";
+ }
+
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ { return "gb2312"; }
+
+ /*! used in the compound documentation before a list of related functions.
+ */
+ virtual QCString trRelatedFunctions()
+ { return "غ"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "ע⣺ЩdzԱ"; }
+
+ /*! header that is put before the detailed description of files,
+ * classes and namespaces.
+ */
+ virtual QCString trDetailedDescription()
+ { return "ϸ"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "ԱͶĵ"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Աöĵ"; }
+
+ /*! header that is put before the list of member function. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Աĵ"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ֶĵ";
+ }
+ else {
+ return "Աĵ";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "..."; }
+
+ /*! put in the class documention */
+ virtual QCString trListOfAllMembers()
+ { return "гԱб"; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Աб"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "ԱбЩԱ"CN_SPC; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return "м̳жijԱ"; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ {
+ QCString result;
+ if (s) result=(QCString)"Ϊ"CN_SPC+s+"";
+ result+=""CN_SPC"Doyxgen"CN_SPC"ͨԴԶɡ";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "ö"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "öֵ"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return ""CN_SPC; }
+
+ // quick reference sections
+
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "ģ"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "̳йϵ"; }
+
+ /*! This is put above each page as a link to the list of annotated class */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "ݽṹ";
+ }
+ else {
+ return "б";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "ļб"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "ֶ";
+ }
+ else {
+ return "ͳԱ";
+ }
+ }
+
+ /*! This is put above each page as a link to all member of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "ȫֶ";
+ } else {
+ return "ļԱ";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "ҳ"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "ʾ"; }
+
+ virtual QCString trSearch()
+ { return ""; }
+
+ virtual QCString trClassHierarchyDescription()
+ { return "бֵ˳"; }
+
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="г";
+ if (!extractAll) result+="ĵ";
+ result+="ļҪ˵";
+ return result;
+ }
+
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "гݽṹҪ˵";
+ }
+ else
+ {
+ return "гࡢṹԼӿڶ壬Ҫ˵";
+ }
+ }
+
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="г";
+ if (!extractAll) {
+ result+="ĵ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ result+="ṹϵijԱ";
+ }
+ else {
+ result+="Ա";
+ }
+
+ if (extractAll) {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ result+="ڽṹϵĵӣ";
+ }
+ else {
+ result+="ĵӣ";
+ }
+ }
+ else {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ result+="ṹϵӣ";
+ }
+ else {
+ result+="ӣ";
+ }
+ }
+ return result;
+ }
+
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="г";
+ if (!extractAll)
+ result +="ĵ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ result +="꣬öٺͶ壬";
+ }
+ else {
+ result +="ļԱ";
+ }
+
+ if (extractAll)
+ result+="ļĵӣ";
+ else
+ result+="ļӣ";
+ return result;
+ }
+
+ virtual QCString trExamplesDescription()
+ { return "гʾ"; }
+
+ virtual QCString trRelatedPagesDescription()
+ { return "гصҳ棺"; }
+
+ virtual QCString trModulesDescription()
+ { return "гģ"; }
+
+ virtual QCString trDocumentation()
+ { return "ĵ"; }
+
+ virtual QCString trModuleIndex()
+ { return "ģ"; }
+
+ virtual QCString trHierarchicalIndex()
+ { return "̳йϵ"; }
+
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ݽṹ";
+ }
+ else {
+ return "";
+ }
+ }
+
+ virtual QCString trFileIndex()
+ { return "ļ"; }
+
+ virtual QCString trModuleDocumentation()
+ { return "ģĵ"; }
+
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ݽṹĵ";
+ }
+ else {
+ return "ĵ";
+ }
+ }
+
+ virtual QCString trFileDocumentation()
+ { return "ļĵ"; }
+
+ virtual QCString trExampleDocumentation()
+ { return "ʾĵ"; }
+
+ virtual QCString trPageDocumentation()
+ { return "ҳĵ"; }
+
+ virtual QCString trReferenceManual()
+ { return "οֲ"; }
+
+ virtual QCString trDefines()
+ { return "궨"; }
+
+ virtual QCString trFuncProtos()
+ { return "ԭ"; }
+
+ virtual QCString trTypedefs()
+ { return "Ͷ"; }
+
+ virtual QCString trEnumerations()
+ { return "ö"; }
+
+ virtual QCString trFunctions()
+ { return ""; }
+
+ virtual QCString trVariables()
+ { return ""; }
+
+ virtual QCString trEnumerationValues()
+ { return "öֵ"; }
+
+
+ virtual QCString trDefineDocumentation()
+ { return "궨ĵ"; }
+
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "ԭĵ"; }
+
+ virtual QCString trTypedefDocumentation()
+ { return "Ͷĵ"; }
+
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "öĵ"; }
+
+ virtual QCString trFunctionDocumentation()
+ { return "ĵ"; }
+
+ virtual QCString trVariableDocumentation()
+ { return "ĵ"; }
+
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ݽṹ";
+ }
+ else {
+ return "";
+ }
+ }
+
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generated at "+date;
+ if (projName) result+=(QCString)" for "+projName;
+ result+=(QCString)" by";
+ return result;
+ }
+
+ virtual QCString trWrittenBy()
+ {
+ return "written by";
+ }
+
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"̳ͼ"CN_SPC+clName;
+ }
+
+ virtual QCString trForInternalUseOnly()
+ { return "ڲʹá"; }
+
+ virtual QCString trWarning()
+ { return ""; }
+
+ virtual QCString trVersion()
+ { return "汾"; }
+
+ virtual QCString trDate()
+ { return ""; }
+
+ virtual QCString trReturns()
+ { return ""; }
+
+ virtual QCString trSeeAlso()
+ { return "μ"; }
+
+ virtual QCString trParameters()
+ { return ""; }
+
+ virtual QCString trExceptions()
+ { return "쳣"; }
+
+ virtual QCString trGeneratedBy()
+ { return ""; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNamespaceList()
+ { return "ֿռб"; }
+
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="г";
+ if (!extractAll) result+="ĵ";
+ result+="ֿռ䶨壬Ҫ˵";
+ return result;
+ }
+
+ virtual QCString trFriends()
+ { return "Ԫ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Ԫغĵ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ // used as the title of the HTML page of a class/struct/union
+ {
+ QCString result=(QCString)clName;
+ if (isTemplate) result+=CN_SPC"ģ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=""; break;
+ case ClassDef::Struct: result+="ṹ"; break;
+ case ClassDef::Union: result+=""; break;
+ case ClassDef::Interface: result+="ӿ"; break;
+ case ClassDef::Protocol: result+="Э"; break;
+ case ClassDef::Category: result+=""; break;
+ case ClassDef::Exception: result+="쳣"; break;
+ }
+ result+="ο";
+ return result;
+ }
+
+ virtual QCString trFileReference(const char *fileName)
+ // used as the title of the HTML page of a file
+ {
+ QCString result=fileName;
+ result+=CN_SPC"ļο";
+ return result;
+ }
+
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ // used as the title of the HTML page of a namespace
+ {
+ QCString result=namespaceName;
+ result+=CN_SPC"ֿռο";
+ return result;
+ }
+
+ // these are for the member sections of a class, struct or union
+ virtual QCString trPublicMembers()
+ { return "гԱ"; }
+
+ virtual QCString trPublicSlots()
+ { return "в"; }
+
+ virtual QCString trSignals()
+ { return "ź"; }
+
+ virtual QCString trStaticPublicMembers()
+ { return "̬гԱ"; }
+
+ virtual QCString trProtectedMembers()
+ { return "Ա"; }
+
+ virtual QCString trProtectedSlots()
+ { return ""; }
+
+ virtual QCString trStaticProtectedMembers()
+ { return "̬Ա"; }
+
+ virtual QCString trPrivateMembers()
+ { return "˽гԱ"; }
+
+ virtual QCString trPrivateSlots()
+ { return "˽в"; }
+
+ virtual QCString trStaticPrivateMembers()
+ { return "̬˽гԱ"; }
+
+ // end of member sections
+
+ virtual QCString trWriteList(int numEntries)
+ {
+ // this function is used to produce a comma-separated list of items.
+ // use generateMarker(i) to indicate where item i should be put.
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+="";
+ else // the fore last entry
+ result+=CN_SPC""CN_SPC;
+ }
+ }
+ return result;
+ }
+
+ virtual QCString trInheritsList(int numEntries)
+ // used in class documentation to produce a list of base classes,
+ // if class diagrams are disabled.
+ {
+ return "̳"CN_SPC+trWriteList(numEntries)+"";
+ }
+
+ virtual QCString trInheritedByList(int numEntries)
+ // used in class documentation to produce a list of super classes,
+ // if class diagrams are disabled.
+ {
+ return ""CN_SPC+trWriteList(numEntries)+CN_SPC"̳.";
+ }
+
+ virtual QCString trReimplementedFromList(int numEntries)
+ // used in member documentation blocks to produce a list of
+ // members that are hidden by this one.
+ {
+ return ""CN_SPC+trWriteList(numEntries)+"";
+ }
+
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ // used in member documentation blocks to produce a list of
+ // all member that overwrite the implementation of this member.
+ return ""CN_SPC+trWriteList(numEntries)+CN_SPC"ء";
+ }
+
+ virtual QCString trNamespaceMembers()
+ // This is put above each page as a link to all members of namespaces.
+ { return "ֿռԱ"; }
+
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ // This is an introduction to the page with all namespace members
+ {
+ QCString result="г";
+ if (!extractAll) result+="ĵ";
+ result+="ֿռԱ";
+ if (extractAll)
+ result+="ĵӣ";
+ else
+ result+="ӣ";
+ return result;
+ }
+
+ virtual QCString trNamespaceIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // index of all namespaces.
+ { return "ֿռ"; }
+
+ virtual QCString trNamespaceDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all namespaces.
+ { return "ֿռĵ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ {
+ // return "Namespaces";
+ return "ֿռ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=""; break;
+ case ClassDef::Struct: result+="ṹ"; break;
+ case ClassDef::Union: result+=""; break;
+ case ClassDef::Interface: result+="ӿ"; break;
+ case ClassDef::Protocol: result+="Э"; break;
+ case ClassDef::Category: result+=""; break;
+ case ClassDef::Exception: result+="쳣"; break;
+ }
+ result+="ĵļɣ";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "ֵ˳б"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "ֵ"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "ҳ"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "p."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "ļ"CN_SPC"@1"CN_SPC""CN_SPC"@0"CN_SPC"ж塣";
+ }
+
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "ļ"CN_SPC"@0"CN_SPC"ж塣";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Deprecated";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)clName+CN_SPC"ͼ";
+ }
+
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)fName+CN_SPC"/ϵͼ";
+ }
+
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "켰ĵ";
+ }
+
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "ļԴ롣";
+ }
+
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "ļĵ";
+ }
+
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "ǰ";
+ }
+
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "";
+ }
+
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "";
+ }
+
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "ʼУ";
+ }
+
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "";
+ }
+
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "̳йϵͼ";
+ }
+
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "̳йϵͼ";
+ }
+
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "̳йϵ";
+ }
+
+ virtual QCString trPageIndex()
+ {
+ return "ҳ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "ע";
+ }
+
+ virtual QCString trPublicTypes()
+ {
+ return "";
+ }
+
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ݳԱ";
+ }
+ else {
+ return "";
+ }
+ }
+
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "̬";
+ }
+
+ virtual QCString trProtectedTypes()
+ {
+ return "";
+ }
+
+ virtual QCString trProtectedAttribs()
+ {
+ return "";
+ }
+
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "̬";
+ }
+
+ virtual QCString trPrivateTypes()
+ {
+ return "˽";
+ }
+
+ virtual QCString trPrivateAttribs()
+ {
+ return "˽";
+ }
+
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "̬˽";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "TODO";
+ }
+
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "TODO"CN_SPC"б";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "ο";
+ }
+
+ virtual QCString trRemarks()
+ {
+ return "";
+ }
+
+ virtual QCString trAttention()
+ {
+ return "ע";
+ }
+
+ virtual QCString trInclByDepGraph()
+ {
+ return "ͼչʾֱӻӰļļ";
+ }
+
+ virtual QCString trSince()
+ {
+ return "Դ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "ͼ";
+ }
+
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "ҳչʾ"CN_SPC"Doxygen"CN_SPC"ɵͼΡ<p>\n"
+ "뿼ʾ\n"
+ "\\code\n"
+ "/*! ڽȡʹ಻ɼ */\n"
+ "class Invisible { };\n\n"
+ "/*! ȡ̳࣬йϵ */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* ûб"CN_SPC"doxygen"CN_SPC"עĵ */\n"
+ "class Undocumented { };\n\n"
+ "/*! м̳е */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! ̳е */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! ˽м̳е */\n"
+ "class PrivateBase { };\n\n"
+ "/*! ʹõ */\n"
+ "class Used { };\n\n"
+ "/*! ̳ */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "ļָ"CN_SPC"MAX_DOT_GRAPH_HEIGHT"CN_SPC"ֵΪ200"
+ "DoxygenµͼΣ"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "ͼеľµĺ壺\n"
+ "<ul>\n"
+ "<li>ɫľδǰṹ\n"
+ "<li>ɫ߿ľδ<i>ĵ</i>ṹ\n"
+ "<li>ɫ߿ľδû<i>ĵ</i>ṹ\n"
+ "<li>ɫ߿ľδ̳/ϵûбʾṹһͼij"
+ "ָߴ磬ȡ"
+ "</ul>\n"
+ "ͷµĺ壺\n"
+ "<ul>\n"
+ "<li>ɫļͷʾ֮Ĺм̳йϵ\n"
+ "<li>ɫļͷʾ̳йϵ\n"
+ "<li>ɫļͷʾ˽м̳йϵ\n"
+ "<li>ɫ״ļͷʾ֮ʹõĹϵͨͷԱߵı"
+ "ʵͷָṹ\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "ͼ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "";
+ }
+
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "б";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+//// new since 1.2.1
+////////////////////////////////////////////////////////////////////////////
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP"CN_SPC"";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+//// new since 1.2.2
+////////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "";
+ }
+
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "ĵ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ݽṹ";
+ }
+ else
+ {
+ return "";
+ }
+ }
+
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)" "+name;
+ }
+
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "б";
+ }
+
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "геİҪ˵(еĻ)";
+ }
+
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "";
+ }
+
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "ֵ:";
+ }
+
+////////////////////////////////////////////////////////////////////////////
+//// new since 1.2.6
+////////////////////////////////////////////////////////////////////////////
+ virtual QCString trBug ()
+ {
+ return "ȱ";
+ }
+
+ virtual QCString trBugList ()
+ {
+ return "ȱб";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "936";
+ }
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "134";
+ }
+
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "";
+ }
+
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool /*first_capital*/, bool /*singular*/)
+ {
+ /*
+ QCString result((first_capital ? "Class" : "class"));
+ if (!singular) result+="es";
+ return result;
+ */
+ return "";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool /*first_capital*/, bool /*singular*/)
+ {
+ /*
+ QCString result((first_capital ? "File" : "file"));
+ if (!singular) result+="s";
+ return result;
+ */
+ return "ļ";
+
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool /*first_capital*/, bool /*singular*/)
+ {
+ /*
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ */
+ return "ֿռ";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool /*first_capital*/, bool /*singular*/)
+ {
+ /*
+ QCString result((first_capital ? "Group" : "group"));
+ if (!singular) result+="s";
+ return result;
+ */
+ return "";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool /*first_capital*/, bool /*singular*/)
+ {
+ /*
+ QCString result((first_capital ? "Page" : "page"));
+ if (!singular) result+="s";
+ return result;
+ */
+ return "ҳ";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool /*first_capital*/, bool /*singular*/)
+ {
+ /*
+ QCString result((first_capital ? "Member" : "member"));
+ if (!singular) result+="s";
+ return result;
+ */
+ return "Ա";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool /*first_capital*/, bool /*singular*/)
+ {
+ /*
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="s";
+ return result;
+ */
+ return "ȫֶ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool /*first_capital*/, bool /*singular*/)
+ {
+ /*
+ QCString result((first_capital ? "Author" : "author"));
+ if (!singular) result+="s";
+ return result;
+ */
+ return "";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "ο";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ /* return "Implements "+trWriteList(numEntries)+"."; */
+ return "ʵ"CN_SPC+trWriteList(numEntries)+"";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ /* return "Implemented in "+trWriteList(numEntries)+"."; */
+ return ""CN_SPC+trWriteList(numEntries)+CN_SPC"ڱʵ֡";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ /* return "Table of Contents"; */
+ return "Ŀ¼";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+/* return "Deprecated List"; */
+ return "ʱб";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ /* return "Events"; */
+ return "¼";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ /* return "Event Documentation"; */
+ return "¼ĵ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ /* return "Package Types"; */
+ return "ģ";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ /* return "Package Functions"; */
+ return "ģ麯";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ /* return "Static Package Functions"; */
+ return "̬ģ麯";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ /* return "Package Attributes"; */
+ return "ģ";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ /* return "Static Package Attributes"; */
+ return "̬ģ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ /* return "All"; */
+ return "ȫ";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ /* return "Here is the call graph for this function:"; */
+ return "ͼ:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ /* return "Search for"; */
+ return "";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ /* return "Search Results"; */
+ return "";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ /* return "Sorry, no documents matching your query."; */
+ return "ԲҲIJѯĵ";
+ }
+ else if (numDocuments==1)
+ {
+ /* return "Found <b>1</b> document matching your query."; */
+ return "ҵ<b>1</b>ƪIJѯĵ";
+ }
+ else
+ {
+ /* return "Found <b>$num</b> documents matching your query. "
+ "Showing best matches first."; */
+ return "ҵ<b>$num</b>ƪIJѯĵ"
+ "ʾǺϵĵ";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ /* return "Matches:"; */
+ return "ϵĽ:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ /* return filename + " Source File"; */
+ return filename + CN_SPC"Դļ";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ /* { return "Directory Hierarchy"; } */
+ {
+ return "Ŀ¼ṹ";
+ }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ /* { return "Directory Documentation"; } */
+ {
+ return "Ŀ¼ĵ";
+ }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ /* { return "Directories"; } */
+ {
+ return "Ŀ¼";
+ }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+/* { return "This directory hierarchy is sorted roughly, " */
+/* "but not completely, alphabetically:"; */
+/* } */
+ {
+ return "Ŀ¼ṹԵ";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ /* { QCString result=dirName; result+=" Directory Reference"; return result; } */
+ {
+ QCString result=dirName;
+ result+=CN_SPC"Ŀ¼ο";
+ return result;
+ }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool, bool)
+ {
+ /* QCString result((first_capital ? "Director" : "director")); */
+ /* if (singular) result+="y"; else result+="ies"; */
+ /* return result; */
+ return "Ŀ¼";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ /* return "This is an overloaded member function, "
+ "provided for convenience. It differs from the above "
+ "function only in what argument(s) it accepts."; */
+ return "ΪʹöṩһسԱ"
+ "ĺȣܲͬ͵IJ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ /* return "Here is the caller graph for this function:"; */
+ return "ĵͼ";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ {
+ /* return "Enumerator Documentation"; */
+ return "öٱĵ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ // { return "Member Function/Subroutine Documentation"; }
+ { return "Աĵ"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ // { return "Data Types List"; }
+ { return "б"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ // { return "Data Fields"; }
+ { return ""; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ // { return "Here are the data types with brief descriptions:"; }
+ { return "Ҫб:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ // QCString result="Here is a list of all ";
+ // if (!extractAll)
+ // {
+ // result+="documented ";
+ // }
+ // result+="data types members";
+ // result+=" with links to ";
+ // if (!extractAll)
+ // {
+ // result+="the data structure documentation for each member";
+ // }
+ // else
+ // {
+ // result+="the data types they belong to:";
+ // }
+ // return result;
+ if(!extractAll) {
+ return "ĵͳԱбеÿԱݽṹĵ";
+ } else {
+ return "ͳԱбеԱ͵:";
+ }
+
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ // { return "Data Type Index"; }
+ { return ""; }
+
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ // { return "Data Type Documentation"; }
+ { return "ĵ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ //{ return "Functions/Subroutines"; }
+ { return "/"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ //{ return "Function/Subroutine Documentation"; }
+ { return "/ĵ"; }
+
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ // { return "Data Types"; }
+ { return ""; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ // { return "Modules List"; }
+ { return "ģб"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ // QCString result="Here is a list of all ";
+ // if (!extractAll) result+="documented ";
+ // result+="modules with brief descriptions:";
+ // return result;
+ if(!extractAll) {
+ return "Ҫĵģб:";
+ } else {
+ return "Ҫģб:";
+ }
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ // QCString result=(QCString)clName;
+ // switch(compType)
+ // {
+ // case ClassDef::Class: result+=" Module"; break;
+ // case ClassDef::Struct: result+=" Type"; break;
+ // case ClassDef::Union: result+=" Union"; break;
+ // case ClassDef::Interface: result+=" Interface"; break;
+ // case ClassDef::Protocol: result+=" Protocol"; break;
+ // case ClassDef::Category: result+=" Category"; break;
+ // case ClassDef::Exception: result+=" Exception"; break;
+ // }
+ // if (isTemplate) result+=" Template";
+ // result+=" Reference";
+ // return result;
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=CN_SPC"ģ"; break;
+ case ClassDef::Struct: result+=CN_SPC""; break;
+ case ClassDef::Union: result+=CN_SPC""; break;
+ case ClassDef::Interface: result+=CN_SPC""; break;
+ case ClassDef::Protocol: result+=CN_SPC"ӿ"; break;
+ case ClassDef::Category: result+=CN_SPC"Ŀ¼"; break;
+ case ClassDef::Exception: result+=CN_SPC"쳣"; break;
+ }
+ if (isTemplate) result+="ģ";
+ result+="οֲ";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ // result+=" Module Reference";
+ result += CN_SPC"ģοֲ";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ // { return "Module Members"; }
+ { return "ģԱ"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ // QCString result="Here is a list of all ";
+ // if (!extractAll) result+="documented ";
+ // result+="module members with links to ";
+ // if (extractAll)
+ // {
+ // result+="the module documentation for each member:";
+ // }
+ // else
+ // {
+ // result+="the modules they belong to:";
+ // }
+ // return result;
+ if(!extractAll) {
+ return "ĵģԱбеÿԱģĵ";
+ } else {
+ return "ģԱбеԱģ:";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ // { return "Modules Index"; }
+ { return "ģ"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool, bool)
+ {
+ // QCString result((first_capital ? "Module" : "module"));
+ // if (!singular) result+="s";
+ // return result;
+ return "ģ";
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ // QCString result=(QCString)"The documentation for this ";
+ // switch(compType)
+ // {
+ // case ClassDef::Class: result+="module"; break;
+ // case ClassDef::Struct: result+="type"; break;
+ // case ClassDef::Union: result+="union"; break;
+ // case ClassDef::Interface: result+="interface"; break;
+ // case ClassDef::Protocol: result+="protocol"; break;
+ // case ClassDef::Category: result+="category"; break;
+ // case ClassDef::Exception: result+="exception"; break;
+ // }
+ // result+=" was generated from the following file";
+ // if (single) result+=":"; else result+="s:";
+ // return result;
+ QCString result="";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=CN_SPC"ģ"; break;
+ case ClassDef::Struct: result+=CN_SPC""; break;
+ case ClassDef::Union: result+=CN_SPC""; break;
+ case ClassDef::Interface: result+=CN_SPC""; break;
+ case ClassDef::Protocol: result+=CN_SPC"ӿ"; break;
+ case ClassDef::Category: result+=CN_SPC"Ŀ¼"; break;
+ case ClassDef::Exception: result+=CN_SPC"쳣"; break;
+ }
+ result+="ĵļ:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool, bool)
+ {
+ return "";
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool, bool)
+ {
+ return "ӳ";
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0
+//////////////////////////////////////////////////////////////////////////
+ virtual QCString trDirRelation(const char *name)
+ {
+ // return QCString(name)+" Relation";
+ // unsure
+ return QCString(name)+CN_SPC"ϵ";
+ }
+
+ virtual QCString trLoading()
+ {
+ return "...";
+ }
+
+ virtual QCString trGlobalNamespace()
+ {
+ return "ȫռ";
+ }
+
+ virtual QCString trSearching()
+ {
+ return "...";
+ }
+
+ virtual QCString trNoMatches()
+ {
+ return "δҵ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDirDependency(const char *name)
+ {
+ // return (QCString)"Directory dependency graph for "+name;
+ // unsure
+ return QCString(name)+CN_SPC"Ŀ¼ϵͼ";
+ }
+
+ virtual QCString trFileIn(const char *name)
+ {
+ // return (QCString)"File in "+name;
+ // unsure
+ return (QCString)"ļ"+CN_SPC+name;
+ }
+
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ // return (QCString)"Includes file in "+name;
+ // unsure
+ return (QCString)""CN_SPC+name+CN_SPC"";
+ }
+
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "һ","","","","","","" };
+ static const char *months[] = { "һ","","","","","","","","","ʮ","ʮһ","ʮ" };
+
+ QCString sdate;
+
+ sdate.sprintf("%d%s%d %s",year, months[month-1], day, days[dayOfWeek-1]);
+
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+};
+
+#endif
+
diff --git a/src/translator_cz.h b/src/translator_cz.h
new file mode 100644
index 0000000..9d3e65c
--- /dev/null
+++ b/src/translator_cz.h
@@ -0,0 +1,1909 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_CZ_H
+#define TRANSLATOR_CZ_H
+
+// Updates:
+// --------
+// 2010/06/01 - typo
+// 2010/04/28 - Updates for "new since 1.6.3".
+// 2009/09/02 - Updates for "new since 1.6.0 (mainly for the new search engine)".
+// 2008/06/09 - Corrections in trLegendDocs().
+// 2007/11/13 - Update for "new since 1.5.4 (mainly for Fortran)".
+// 2007/03/20 - removing decode(), conversion of literals to UTF-8.
+// 2006/06/13 - translation of the trEnumerationValueDocumentation().
+// and clear in the Czech language.
+// modified trCallGraph() to make the meaning unambiguous
+// 2006/05/10 - Update for "new since 1.4.6" -- trCallerGraph(),
+// 2005/03/08 - Update for "new since 1.4.1" (trOverloadText())
+// 2005/02/11 - The "never used" methods removed.
+// 2004/09/14 - The new methods "since 1.3.9" implemented.
+// 2004/06/16 - The new method "since 1.3.8" implemented.
+// 2004/02/27 - Text inside the trCallGraph() corrected.
+// 2004/02/26 - trLegendDocs() updated.
+// 2003/08/13 - Four new methods "since 1.3.3" implemented.
+// 2003/06/10 - Two new methods "since 1.3.1" implemented.
+// 2003/04/28 - Five new methods "since 1.3" implemented.
+// 2002/10/15 - The new trEvents() and trEventDocumentation() implemented.
+// 2002/07/29 - The new trDeprecatedList() implemented.
+// 2002/07/08 - The new trRTFTableOfContents() implemented. (my birthday! ;)
+// 2002/03/05 - ... forgot to replace TranslatorAdapter... by Translator.
+// 2002/01/23 - Two new methods "since 1.2.13" implemented.
+// 2001/11/06 - trReferences() implemented.
+// 2001/07/16 - trClassDocumentation() updated as in the English translator.
+// 2001/05/25 - Corrections.
+// 2001/05/18 - Updates, corrections.
+// 2001/05/02 - Decode() inline changed to decode(); cleaning.
+// level as other translators.
+// class Translator. The English translator is now on the same
+// introducing TranslatorAdapter class and the abstract base
+// 2001/04/20 - Update for "new since 1.2.6-20010422". Experimental version
+// 2001/04/10 - Updates (1.2.6-20010408), cleaning.
+// 2001/03/12 - Minor correction of comments (synchronous with translator.h).
+// 2001/02/26 - Update for "new since 1.2.5" version (trBug(), trBugList()).
+// 2001/02/15 - trMore() now returns only "..." (ellipsis).
+// 2001/01/09 - Update for "new since 1.2.4" version.
+// 2000/10/17 - Update for "new since 1.2.2" version.
+// 2000/09/11 - Update for "new since 1.2.1" version.
+// 2000/09/06 - Reimplementation of trInheritsList().
+// 2000/08/31 - ISOToWin() and WinToISO() moved to the base class.
+// 2000/08/30 - Macro DECODE replaced by the inline (thanks to Boris Bralo).
+// 2000/08/24 - Corrections, updates.
+// 2000/08/02 - Updated for 1.2.0
+// 2000/07/19 - Updates for "new since 1.1.5"; encoding conversion separated.
+// 2000/07/10 - Update to 1.1.5; conditionally decoding to iso-8859-2 for UNIX.
+// 2000/06/20 - Prototype: with diacritics; based on ver. 1.1.4 (from scratch).
+//
+// The first translation from English to Czech was started by
+// Vlastimil Havran (1999--2000). The prototype version of Czech strings
+// with diacritics was implemented by Petr Prikryl (prikrylp@skil.cz),
+// 2000/06/20. Vlastimil agreed that Petr be the new maintainer.
+
+// Todo
+// ----
+// - The trReimplementedFromList() should pass the kind of the
+// reimplemented element. It can be method, typedef or possibly
+// something else. It is difficult to find the general translation
+// for all kinds in the Czech language.
+
+class TranslatorCzech : public Translator
+{
+ public:
+ // --- Language control methods -------------------
+
+ virtual QCString idLanguage()
+ { return "czech"; }
+
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[T2A]{fontenc}\n"
+ "\\usepackage[czech]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Související funkce"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Uvedené funkce nejsou členskými funkcemi.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Detailní popis"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Dokumentace k členským typům"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Dokumentace k členským výčtům"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Dokumentace k metodám"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dokumentace k položkám";
+ }
+ else
+ {
+ return "Dokumentace k datovým členům";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Seznam všech členů."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Seznam členů třídy"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Zde naleznete úplný seznam členů třídy "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", včetně všech zděděných členů."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result("Generováno automaticky programem Doxygen "
+ "ze zdrojových textů");
+ if (s) result += QCString(" projektu ") + s;
+ result += ".";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "jméno výčtu"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "hodnota výčtu"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "definován v"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Moduly"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Hierarchie tříd"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datové struktury";
+ }
+ else
+ {
+ return "Seznam tříd";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Seznam souborů"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datové položky";
+ }
+ else
+ {
+ return "Seznam členů tříd";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globální symboly";
+ }
+ else
+ {
+ return "Symboly v souborech";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Ostatní stránky"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Příklady"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Hledat"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Zde naleznete seznam, vyjadřující vztah dědičnosti tříd. "
+ "Je seřazen přibližně (ale ne úplně) podle abecedy:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Zde naleznete seznam všech ";
+ if (!extractAll) result+="dokumentovaných ";
+ result+="souborů se stručnými popisy:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Následující seznam obsahuje identifikace datových "
+ "struktur a jejich stručné popisy:";
+ }
+ else
+ {
+ return "Následující seznam obsahuje především identifikace "
+ "tříd, ale nacházejí se zde i další netriviální prvky, "
+ "jako jsou struktury (struct), unie (union) a rozhraní "
+ "(interface). V seznamu jsou uvedeny jejich stručné "
+ "popisy:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result= "Zde naleznete seznam všech ";
+ if (!extractAll)
+ {
+ result += "dokumentovaných ";
+ }
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result += "položek struktur (struct) a unií (union) ";
+ }
+ else
+ {
+ result += "členů tříd ";
+ }
+
+ result += "s odkazy na ";
+
+ if (extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result += "dokumentaci struktur/unií, ke kterým příslušejí:";
+ }
+ else
+ {
+ result += "dokumentaci tříd, ke kterým příslušejí:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktury/unie, ke kterým příslušejí:";
+ }
+ else
+ {
+ result+="třídy, ke kterým příslušejí:";
+ }
+ }
+
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Zde naleznete seznam všech ";
+ if (!extractAll) result+="dokumentovaných ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funkcí, proměnných, maker, výčtů a definic typů (typedef) "
+ "s odkazy na ";
+ }
+ else
+ {
+ result+="symbolů, které jsou definovány na úrovni svých souborů. "
+ "Pro každý symbol je uveden odkaz na ";
+ }
+
+ if (extractAll)
+ result+="soubory, ke kterým příslušejí:";
+ else
+ result+="dokumentaci:";
+
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Zde naleznete seznam všech příkladů:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Následující seznam odkazuje na další stránky projektu:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Zde naleznete seznam všech modulů:"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentace"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Rejstřík modulů"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Rejstřík hierarchie tříd"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Rejstřík datových struktur";
+ }
+ else
+ {
+ return "Rejstřík tříd";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Rejstřík souborů"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Dokumentace modulů"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dokumentace datových struktur";
+ }
+ else
+ {
+ return "Dokumentace tříd";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Dokumentace souborů"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Dokumentace příkladů"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Dokumentace souvisejících stránek"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Referenční příručka"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Definice maker"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Prototypy"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Definice typů"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Výčty"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funkce"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Proměnné"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Hodnoty výčtu"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Dokumentace k definicím maker"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Dokumentace prototypů"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Dokumentace definic typů"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Dokumentace výčtových typů"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Dokumentace funkcí"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Dokumentace proměnných"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datové struktry";
+ }
+ else
+ {
+ return "Třídy";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result("Generováno ");
+ result += date;
+ if (projName)
+ result += QCString(" pro projekt ") + projName;
+ result += " programem";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return " -- autor ";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return QCString("Diagram dědičnosti pro třídu ") + clName;
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Pouze pro vnitřní použití."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Pozor"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Verze"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Datum"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Návratová hodnota"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Viz také"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametry"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Výjimky"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Generováno programem"; }
+
+ // new since 0.49-990307
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Seznam prostorů jmen"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Zde naleznete seznam všech ";
+ if (!extractAll) result+="dokumentovaných ";
+ result+="prostorů jmen se stručným popisem:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Dokumentace k friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result("Dokumentace ");
+ if (isTemplate) result += "šablony ";
+ switch(compType)
+ {
+ case ClassDef::Class: result += "třídy "; break;
+ case ClassDef::Struct: result += "struktury "; break;
+ case ClassDef::Union: result += "unie "; break;
+ case ClassDef::Interface: result += "rozhraní "; break;
+ case ClassDef::Protocol: result += "protokolu "; break;
+ case ClassDef::Category: result += "kategorie "; break;
+ case ClassDef::Exception: result += "výjimky "; break;
+ }
+ result += clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result("Dokumentace souboru ");
+ result+=fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result("Dokumentace prostoru jmen ");
+ result+=namespaceName;
+ return result;
+ }
+
+ /*
+ * these are for the member sections of a class, struct or union
+ */
+ virtual QCString trPublicMembers()
+ { return "Veřejné metody"; }
+ virtual QCString trPublicSlots()
+ { return "Veřejné sloty"; }
+ virtual QCString trSignals()
+ { return "Signály"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statické veřejné metody"; }
+ virtual QCString trProtectedMembers()
+ { return "Chráněné metody"; }
+ virtual QCString trProtectedSlots()
+ { return "Chráněné sloty"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statické chráněné metody"; }
+ virtual QCString trPrivateMembers()
+ { return "Privátní metody"; }
+ virtual QCString trPrivateSlots()
+ { return "Privátní sloty"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statické privátní metody"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" a ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ QCString result("Dědí z ");
+ result += (numEntries == 1) ? "bázové třídy " : "bázových tříd ";
+ result += trWriteList(numEntries) + ".";
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ QCString result("Zděděna ");
+ result += (numEntries == 1) ? "třídou " : "třídami ";
+ result += trWriteList(numEntries) + ".";
+ return result;
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ QCString result("Reimplementuje stejnojmenný prvek z ");
+ result += trWriteList(numEntries) + ".";
+ return result;
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ QCString result("Reimplementováno v ");
+ result += trWriteList(numEntries) + ".";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Symboly v prostorech jmen"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Zde naleznete seznam všech ";
+ if (!extractAll) result+="dokumentovaných ";
+ result+="symbolů, které jsou definovány ve svých prostorech jmen. "
+ "U každého je uveden odkaz na ";
+ if (extractAll)
+ result+="dokumentaci příslušného prostoru jmen:";
+ else
+ result+="příslušný prostor jmen:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Rejstřík prostorů jmen"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Dokumentace prostorů jmen"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Prostory jmen"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentace pro ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="tuto třídu"; break;
+ case ClassDef::Struct: result+="tuto strukturu (struct)"; break;
+ case ClassDef::Union: result+="tuto unii (union)"; break;
+ case ClassDef::Interface: result+="toto rozhraní"; break;
+ case ClassDef::Protocol: result+="tento protokol "; break;
+ case ClassDef::Category: result+="tuto kategorii "; break;
+ case ClassDef::Exception: result+="tuto výjimku"; break;
+ }
+ result+=" byla generována z ";
+ if (single) result+="následujícího souboru:";
+ else result+="následujících souborů:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Rejstřík tříd"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Vracené hodnoty"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Hlavní stránka"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "s."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definice je uvedena na řádku @0 v souboru @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definice v souboru @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Zastaralé";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagram tříd pro "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Graf závislostí na vkládaných souborech "
+ "pro "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Dokumentace konstruktoru a destruktoru";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Zobrazit zdrojový text tohoto souboru.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Zobrazit dokumentaci tohoto souboru.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Precondition";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postcondition";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Initializer:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "zdrojový text";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafické zobrazení hierarchie tříd";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Zobrazit grafickou podobu hierarchie tříd";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Zobrazit textovou podobu hierarchie tříd";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Rejstřík stránek";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Poznámka";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Veřejné typy";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datové položky";
+ }
+ else
+ {
+ return "Veřejné atributy";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statické veřejné atributy";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Chráněné typy";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Chráněné atributy";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statické chráněné atributy";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Privátní typy";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Privátní atributy";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statické privátní atributy";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "Plánované úpravy";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Seznam plánovaných úprav";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Používá se v";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Poznámky"; // ??? not checked in a context
+ }
+ virtual QCString trAttention()
+ {
+ return "Upozornění"; // ??? not checked in a context
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Následující graf ukazuje, které soubory přímo nebo "
+ "nepřímo vkládají tento soubor:";
+ }
+ virtual QCString trSince()
+ {
+ return "Od"; // ??? not checked in a context
+ }
+
+////////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Vysvětlivky ke grafu";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Zde naleznete vysvětlení, jak mají být interpretovány grafy, "
+ "které byly generovány programem doxygen.<p>\n"
+ "Uvažujte následující příklad:\n"
+ "\\code\n"
+ "/*! Neviditelná třída, která se v grafu nezobrazuje, protože "
+ "došlo k ořezání grafu. */\n"
+ "class Invisible { };\n\n"
+ "/*! Třída, u které došlo k ořezání grafu. Vztah dědičnosti "
+ "je skryt. */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Třída, která není dokumentována komentáři programu doxygen. */\n"
+ "class Undocumented { };\n\n"
+ "/*! Bázová třída děděná veřejně (public inheritance). */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Šablona třídy. */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Bázová třída, použitá pro chráněné dědění "
+ "(protected inheritance). */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Bázová třída, využitá pro privátní dědění "
+ "(private inheritance). */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Třída, která je využívána třídou Inherited. */\n"
+ "class Used { };\n\n"
+ "/*! Odvozená třída, která dědí z více tříd. */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "K výše uvedenému bude vygenerován následující graf:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Bloky (tj. uzly) v uvedeném grafu mají následující význam:\n"
+ "<ul>\n"
+ "<li>Šedě vyplněný obdélník reprezentuje strukturu nebo třídu, "
+ "pro kterou byl graf generován.\n"
+ "<li>Obdélník s černým obrysem označuje dokumentovanou "
+ "strukturu nebo třídu.\n"
+ "<li>Obdélník s šedým obrysem označuje nedokumentovanou "
+ "strukturu nebo třídu.\n"
+ "<li>Obdélník s červeným obrysem označuje dokumentovanou "
+ "strukturu nebo třídu, pro kterou\n"
+ "nejsou zobrazeny všechny vztahy dědičnosti nebo obsažení. "
+ "Graf je ořezán v případě, kdy jej\n"
+ "není možné umístit do vymezeného prostoru.\n"
+ "</ul>\n"
+ "Šipky (tj. hrany grafu) mají následující význam:\n"
+ "<ul>\n"
+ "<li>Tmavě modrá šipka se používá pro označení vztahu veřejné "
+ "dědičnosti (public) mezi dvěma třídami.\n"
+ "<li>Tmavě zelená šipka označuje vztah chráněné dědičnosti "
+ "(protected).\n"
+ "<li>Tmavě červená šipka označuje vztah privátní dědičnosti "
+ "(private).\n"
+ "<li>Purpurová šipka kreslená čárkovaně se používá v případě, "
+ "kdy je třída obsažena v jiné třídě,\n"
+ "nebo kdy je používána jinou třídou. Je označena identifikátorem "
+ "jedné nebo více proměných, přes které\n"
+ "je třída nebo struktura zpřístupněna.\n"
+ "<li>Žlutá šipka kreslená čárkovaně vyjadřuje vztah mezi instancí šablony "
+ "a šablonou třídy, na základě které byla\n"
+ "instance šablony vytvořena. V popisu šipky jsou uvedeny příslušné"
+ " parametry šablony.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "vysvětlivky";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Seznam testů";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Metody DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Vlastnosti";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Dokumentace k vlastnosti";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ return "Třídy";
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return QCString("Balík ") + name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Seznam balíků";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Zde naleznete seznam balíků se stručným popisem "
+ "(pokud byl uveden):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Balíky";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Hodnota:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Chyba";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Seznam chyb";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6-20010422
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "1250";
+ }
+
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "238";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Rejstřík";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tříd" : "tříd"));
+ result += singular ? "a" : "y";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Soubor" : "soubor"));
+ if (!singular) result+="y";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Prostor" : "prostor"));
+ if (!singular) result+="y";
+ result+=" jmen";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Skupin" : "skupin"));
+ result += singular ? "a" : "y";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Stránk" : "stránk"));
+ result += singular ? "a" : "y";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Člen" : "člen"));
+ if (!singular)
+ result += "y";
+ return result;
+ }
+
+ /*! ??? Jak to prelozit? Bylo by dobre, kdyby se ozval nekdo,
+ * kdo to pouziva.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Auto" : "auto"));
+ result += (singular) ? "r" : "ři";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Odkazuje se na";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementuje "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementováno v "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Obsah";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Seznam zastaralých prvků";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Události";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Dokumentace událostí";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Typy v balíku";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funkce v balíku";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statické funkce v balíku";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atributy balíku";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statické atributy balíku";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Vše";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Tato funkce volá...";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the index
+ * of each page before the search field.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Vyhledat";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Výsledky vyhledávání";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Lituji. Vašemu dotazu neodpovídá žádný dokument.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Nalezen jediný dokument, který vyhovuje vašemu dotazu.";
+ }
+ else
+ {
+ return "Nalezeno <b>$num</b> dokumentů, které vyhovují vašemu "
+ "dotazu. Nejlépe odpovídající dokumenty jsou zobrazeny "
+ "jako první.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Nalezená slova:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return QCString("Zdrojový soubor ") + filename;
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Hierarchie adresářů"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Dokumentace k adresářům"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Adresáře"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ {
+ return "Následující hierarchie adresářů je zhruba, "
+ "ale ne úplně, řazena podle abecedy:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ {
+ QCString result = "Reference k adresáři ";
+ result += dirName;
+ return result;
+ }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Adresář" : "adresář"));
+ if ( ! singular)
+ result += "e";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Jde o přetíženou (overloaded) metodu, "
+ "která má usnadnit používání. Od výše uvedené metody se liší "
+ "pouze jinak zadávanými argumenty.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trCallerGraph()
+ {
+ return "Tuto funkci volají...";
+ }
+
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ {
+ return "Dokumentace výčtových hodnot";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Dokumentace členských funkcí/podprogramů"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Seznam datových typů"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Datová pole"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Datové typy se stručnými popisy:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+
+ QCString result="Následuje seznam všech ";
+ if (!extractAll)
+ {
+ result+="dokumentovaných ";
+ }
+ result+="složek datových typů";
+ result+=" s odkazy na ";
+ if (!extractAll)
+ {
+ result+="dokumentaci datové struktury pro každou složku:";
+ }
+ else
+ {
+ result+="příslušné datové typy:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Rejstřík datových typů"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Dokumentace k datovým typům"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funkce/podprogramy"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Dokumentace funkce/podprogramu"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Datové typy"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Seznam modulů"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Následuje seznam všech ";
+ if (!extractAll) result+="dokumentovaných ";
+ result+="modulů se stručnými popisy:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result("Dokumentace ");
+ if (isTemplate) result += "šablony ";
+ switch(compType)
+ {
+ case ClassDef::Class: result += "třídy "; break;
+ case ClassDef::Struct: result += "typu "; break;
+ case ClassDef::Union: result += "unie "; break;
+ case ClassDef::Interface: result += "rozhraní "; break;
+ case ClassDef::Protocol: result += "protokolu "; break;
+ case ClassDef::Category: result += "kategorie "; break;
+ case ClassDef::Exception: result += "výjimky "; break;
+ }
+ result += clName;
+ return result;
+
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result="Dokumentace modulu ";
+ result += namespaceName;
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Části modulu"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Následuje seznam všech ";
+ if (!extractAll) result+="dokumentovaných ";
+ result+="částí modulů s odkazy ";
+ if (extractAll)
+ {
+ result+="na dokumentaci modulu pro danou část:";
+ }
+ else
+ {
+ result+="na moduly, ke kterým část patří:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Rejstřík modulů"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modul" : "modul"));
+ if (!singular) result+="y";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentace ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="k tomuto modulu"; break;
+ case ClassDef::Struct: result+="k tomuto typu"; break;
+ case ClassDef::Union: result+="k této unii"; break;
+ case ClassDef::Interface: result+="k tomuto rozhraní"; break;
+ case ClassDef::Protocol: result+="k tomuto protokolu"; break;
+ case ClassDef::Category: result+="k této kategorii"; break;
+ case ClassDef::Exception: result+="k této výjimce"; break;
+ }
+ result+=" byla vygenerována z ";
+ if (single) result+="následujícího souboru:";
+ else result+="následujících souborů:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Typ" : "typ"));
+ if (!singular) result+="y";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Podprogram" : "podprogram"));
+ if (!singular) result+="y";
+ return result;
+ }
+
+ /*! C# Type Contraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Omezení typů (Type Constraints)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Relace " + QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Načítám...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Globální prostor jmen";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Vyhledávám...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Nic se nenašlo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Graf závislosti adresářů pro "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Soubor v "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Vkládá (include) soubor z "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "po","út","st","čt","pá","so","ne" };
+ static const char *months[] = { "led","úno","bře","dub","kvě","čer","čec","srp","zář","říj","lis","pro" };
+ QCString sdate;
+ sdate.sprintf("%s %d. %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d.%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+};
+#endif // TRANSLATOR_CZ_H
diff --git a/src/translator_de.h b/src/translator_de.h
new file mode 100644
index 0000000..ca92c2b
--- /dev/null
+++ b/src/translator_de.h
@@ -0,0 +1,1915 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * The translation into German was provided by
+ * Jens Seidel (jensseidel@users.sf.net)
+ * based on work from
+ * Jens Breitenstein (Jens.Breitenstein@tlc.de)
+ */
+
+// Updates:
+// --------
+// RK (who are you?)
+// - Update for "new since 1.1.3" version
+//
+// 2001/03/23 Jens Seidel (jensseidel@users.sourceforge.net)
+// - fixed typos
+// - changed trPageDocumentation() "Seitenbeschreibung" to
+// "Zusätzliche Informationen"
+// - removed old trGeneratedFrom()
+// - changed "/*!" to "/*" (documentation is inherited from translator_en.h
+// (INHERIT_DOCS = YES), there's no need to make changes twice)
+// - Update for "new since 1.2.4" version
+//
+// 2001/04/17 Jens Seidel (jensseidel@users.sourceforge.net)
+// - fixed typos ("Vererbunsbeziehung", "gesch&uumltzter")
+// - use umlauts instead of html code ("&auml;",...)
+// this makes it easier to read and fixes three problems (two in
+// \code segment)
+//
+// 2001/04/23 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Update for "new since 1.2.6-20010422" version
+//
+// 2001/05/06 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Update for "new since 1.2.7" version
+// - Removed implementation of latexBabelPackage(), trVerbatimText(),
+// trFiles(), added latexLanguageSupportCommand().
+//
+// 2001/05/25 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Update for "new since 1.2.7-20010524" version:
+// removed trAuthors(), trAuthor(), added trAuthor(bool, bool)
+//
+// 2001/07/24 Jens Seidel (jensseidel@users.sourceforge.net)
+// - trClassDocumentation() updated as in the English translator.
+//
+// 2001/11/30 Oliver Brandt (o.brandt@tu-bs.de) and
+// Jens Seidel (jensseidel@users.sourceforge.net)
+// - trReferences() implemented.
+// - trCompoundReference(), trLegendDocs() updated
+// - Removed some TODO's
+//
+// 2001/02/13 Oliver Brandt (o.brandt@tu-bs.de)
+// - Updated for "new since 1.2.13" version
+// - Removed some TODO's
+//
+// 2002/07/08 Oliver Brandt (o.brandt@tu-bs.de)
+// - Updated for "new since 1.2.16" version
+//
+// 2002/11/25 Jens Seidel (jensseidel@users.sourceforge.net)
+// - sync with english version 1.3
+// - TranslatorGerman doesn't inherit from TranslatorEnglish anymore,
+// so I changed "/* " back to "/*! " as in the English file
+// - use ngerman instead of german package in LaTeX
+// - changed "Datenelemente" to "Methoden" in
+// tr{,Static}{Public,Protected,Private}Members
+//
+// 2003/04/28 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated for "new since 1.3" version
+// - translated Java package to Paket
+//
+// 2003/09/11 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated for "new since 1.3.1" version
+//
+// 2003/09/24 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated a few strings which changed in CVS revision 1.22
+// ("compound" vs. "class")
+//
+// 2004/08/01 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated for "new since 1.3.8" version
+//
+// 2004/09/19 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated for "new since 1.3.9" version
+//
+// 2004/09/25 Jens Seidel (jensseidel@users.sourceforge.net)
+// - changed "Typendefinitionen" to "Typdefinitionen" in
+// trFileMembersDescription() and trTypedefs()
+// - added a dash after (file, ...) names and in front of description
+// - changed "Eigenschaften" to "Propertys" (yeah, not ..."ies")
+//
+// 2005/03/20 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated for "new since 1.4.1" version
+//
+// 2005/04/09 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Changed Todo list translation as suggested in
+// http://bugzilla.gnome.org/show_bug.cgi?id=172818
+//
+// 2005/05/09 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated for "new since 1.4.3" version (removed unused methods)
+//
+// 2006/06/12 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated for "new since 1.4.6" version
+//
+// 2008/02/04 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated for "new since 1.5.4" version
+//
+// 2009/01/09 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Resynced the trLegendDocs() method
+//
+// 2010/03/17 Jens Seidel (jensseidel@users.sourceforge.net)
+// - Updated for "new since 1.6.0" version
+// - Resynced the trLegendDocs() method (added closing HTML tags)
+// - Changed file encoding to utf-8, adapted idLanguageCharset()
+// - New German orthography (ngerman) is now default in LaTeX
+//
+// Todo:
+// - see FIXME
+
+#ifndef TRANSLATOR_DE_H
+#define TRANSLATOR_DE_H
+
+class TranslatorGerman : public TranslatorAdapter_1_6_3
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "german"; }
+
+ /*! Used to get the LaTeX command(s) for the language support. This method
+ * was designed for languages which do wish to use a babel package.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[ngerman]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Verwandte Funktionen"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Es handelt sich hierbei nicht um Elementfunktionen.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Ausführliche Beschreibung"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Dokumentation der benutzerdefinierten Datentypen"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Dokumentation der Aufzählungstypen"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Dokumentation der Elementfunktionen"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ { /* No difference if "OPTIMIZE_OUTPUT_FOR_C" is set! */
+ return "Dokumentation der Datenelemente";
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Mehr ..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Aufstellung aller Elemente"; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Elementverzeichnis"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Vollständige Aufstellung aller Elemente für "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return " einschließlich aller geerbten Elemente."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Automatisch erzeugt von Doxygen";
+ if (s) result+=(QCString)" für "+s;
+ result+=" aus dem Quellcode.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "enum Bezeichner"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "enum Wert"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "Definiert in"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Module"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Klassenhierarchie"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datenstrukturen";
+ }
+ else
+ {
+ return "Auflistung der Klassen";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Auflistung der Dateien"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datenstruktur-Elemente";
+ }
+ else
+ {
+ return "Klassen-Elemente";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ /* No difference if "OPTIMIZE_OUTPUT_FOR_C" is set! */
+ { return "Datei-Elemente"; }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Zusätzliche Informationen"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Beispiele"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Suchen"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Die Liste der Ableitungen ist -mit Einschränkungen- "
+ "alphabetisch sortiert:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Hier folgt die Aufzählung aller ";
+ if (!extractAll) result+="dokumentierten ";
+ result+="Dateien mit einer Kurzbeschreibung:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Hier folgt die Aufzählung aller Datenstrukturen "
+ "mit einer Kurzbeschreibung:";
+ }
+ else
+ {
+ return "Hier folgt die Aufzählung aller Klassen, Strukturen, "
+ "Varianten und Schnittstellen mit einer Kurzbeschreibung:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Hier folgt die Aufzählung aller ";
+ if (!extractAll)
+ {
+ result+="dokumentierten ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="Strukturen und Varianten";
+ }
+ else
+ {
+ result+="Klassenelemente";
+ }
+ result+=" mit Verweisen auf ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="die Dokumentation zu jedem Element:";
+ }
+ else
+ {
+ result+="die Klassendokumentation zu jedem Element:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="die zugehörigen Elemente:";
+ }
+ else
+ {
+ result+="die zugehörigen Klassen:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Hier folgt die Aufzählung aller ";
+ if (!extractAll) result+="dokumentierten ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="Funktionen, Variablen, Makros, Aufzählungen und Typdefinitionen";
+ }
+ else
+ {
+ result+="Dateielemente";
+ }
+ result+=" mit Verweisen auf ";
+ if (extractAll)
+ result+="die Dokumentation zu jedem Element:";
+ else
+ result+="die zugehörigen Dateien:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Hier folgt eine Liste mit allen Beispielen:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Hier folgt eine Liste mit zusammengehörigen Themengebieten:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Hier folgt die Aufzählung aller Module:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Modul-Verzeichnis"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarchie-Verzeichnis"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ return "Datenstruktur-Verzeichnis";
+ else
+ return "Klassen-Verzeichnis";
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Datei-Verzeichnis"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Modul-Dokumentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datenstruktur-Dokumentation";
+ }
+ else
+ {
+ return "Klassen-Dokumentation";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Datei-Dokumentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Dokumentation der Beispiele"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Zusätzliche Informationen"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Nachschlagewerk"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Makrodefinitionen"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Funktionsprototypen"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Typdefinitionen"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Aufzählungen"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funktionen"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variablen"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Aufzählungswerte"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Makro-Dokumentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Funktionsprototypen Dokumentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Dokumentation der benutzerdefinierten Typen"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Dokumentation der Aufzählungstypen"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Dokumentation der Funktionen"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Variablen-Dokumentation"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datenstrukturen";
+ }
+ else
+ {
+ return "Klassen";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Erzeugt am "+date;
+ if (projName) result+=(QCString)" für "+projName;
+ result+=(QCString)" von";
+ return result;
+ }
+
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "geschrieben von";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Klassendiagramm für "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Nur für den internen Gebrauch."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Warnung"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Version"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Datum"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Rückgabe"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Siehe auch"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parameter"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Ausnahmebehandlung"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Erzeugt von"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Liste aller Namensbereiche"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Liste aller ";
+ if (!extractAll) result+="dokumentierten ";
+ result+="Namensbereiche mit Kurzbeschreibung:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Freundbeziehungen"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Freundbeziehungen und Funktionsdokumentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName+" ";
+ if (isTemplate) result+="Template-";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="Klassen"; break;
+ case ClassDef::Struct: result+="Struktur"; break;
+ case ClassDef::Union: result+="Varianten"; break;
+ case ClassDef::Interface: result+="Schnittstellen"; break;
+ case ClassDef::Protocol: result+="Protokoll"; break;
+ case ClassDef::Category: result+="Kategorie"; break;
+ case ClassDef::Exception: result+="Ausnahmen"; break;
+ }
+ result+="referenz";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+="-Dateireferenz";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+="-Namensbereichsreferenz";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Öffentliche Methoden"; }
+
+ virtual QCString trPublicSlots()
+ { return "Öffentliche Slots"; }
+
+ virtual QCString trSignals()
+ { return "Signale"; }
+
+ virtual QCString trStaticPublicMembers()
+ { return "Öffentliche, statische Methoden"; }
+
+ virtual QCString trProtectedMembers()
+ { return "Geschützte Methoden"; }
+
+ virtual QCString trProtectedSlots()
+ { return "Geschützte Slots"; }
+
+ virtual QCString trStaticProtectedMembers()
+ { return "Geschützte, statische Methoden"; }
+
+ virtual QCString trPrivateMembers()
+ { return "Private Methoden"; }
+
+ virtual QCString trPrivateSlots()
+ { return "Private Slots"; }
+
+ virtual QCString trStaticPrivateMembers()
+ { return "Private, statische Methoden"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" und ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Abgeleitet von "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Basisklasse für "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Erneute Implementation von "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Erneute Implementation in "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Elemente eines Namensbereiches"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Hier folgt die Aufzählung aller ";
+ if (!extractAll) result+="dokumentierten ";
+ result+="Namensbereichselemente mit Verweisen auf ";
+ if (extractAll)
+ result+="die Namensbereichsdokumentation für jedes Element:";
+ else
+ result+="die zugehörigen Dateien:";
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Verzeichnis der Namensbereiche"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Dokumentation der Namensbereiche"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namensbereiche"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // single is true implies a single file
+ QCString result=(QCString)"Die Dokumentation für diese";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Klasse"; break;
+ case ClassDef::Struct: result+=" Struktur"; break;
+ case ClassDef::Union: result+=" Variante"; break;
+ case ClassDef::Interface: result+=" Schnittstelle"; break;
+ case ClassDef::Protocol: result+="s Protokoll"; break;
+ case ClassDef::Category: result+=" Kategorie"; break;
+ case ClassDef::Exception: result+=" Ausnahme"; break;
+ }
+ result+=" wurde erzeugt aufgrund der Datei";
+ if (single) result+=":"; else result+="en:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Alphabetische Liste"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Rückgabewerte"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Hauptseite"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "S."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definiert in Zeile @0 der Datei @1.";
+ }
+
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definiert in Datei @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Veraltet";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Zusammengehörigkeiten von "+clName+":";
+ }
+
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Include-Abhängigkeitsdiagramm für "+fName+":";
+ }
+
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Beschreibung der Konstruktoren und Destruktoren";
+ }
+
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "gehe zum Quellcode dieser Datei";
+ }
+
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "gehe zur Dokumentation dieser Datei";
+ }
+
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Vorbedingung";
+ }
+
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Nachbedingung";
+ }
+
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Initialisierung:";
+ }
+
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "code";
+ }
+
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafische Darstellung der Klassenhierarchie";
+ }
+
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "gehe zur grafischen Darstellung der Klassenhierarchie";
+ }
+
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "gehe zur textbasierten Darstellung der Klassenhierarchie";
+ }
+
+ virtual QCString trPageIndex()
+ {
+ return "Seitenindex";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ //RK: had to change here because of the new command \remark
+ virtual QCString trNote()
+ {
+ return "Zu beachten";
+ }
+
+ virtual QCString trPublicTypes()
+ {
+ return "Öffentliche Typen";
+ }
+
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datenfelder";
+ }
+ else
+ {
+ return "Öffentliche Attribute";
+ }
+ }
+
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statische öffentliche Attribute";
+ }
+
+ virtual QCString trProtectedTypes()
+ {
+ return "Geschützte Typen";
+ }
+
+ virtual QCString trProtectedAttribs()
+ {
+ return "Geschützte Attribute";
+ }
+
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statische geschützte Attribute";
+ }
+
+ virtual QCString trPrivateTypes()
+ {
+ return "Private Typen";
+ }
+
+ virtual QCString trPrivateAttribs()
+ {
+ return "Private Attribute";
+ }
+
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statische private Attribute";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Noch zu erledigen";
+ }
+
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Ausstehende Aufgaben";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Wird benutzt von";
+ }
+
+ virtual QCString trRemarks()
+ {
+ return "Bemerkungen";
+ }
+
+ virtual QCString trAttention()
+ {
+ return "Achtung";
+ }
+
+ virtual QCString trInclByDepGraph()
+ {
+ return "Dieser Graph zeigt, welche Datei direkt oder "
+ "indirekt diese Datei enthält:";
+ }
+
+ virtual QCString trSince()
+ {
+ return "Seit";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Erklärung des Graphen";
+ }
+
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Diese Seite erklärt die Interpretation der von doxygen "
+ "erzeugten Graphen.<p>\n"
+ "Beispiel:\n"
+ "\\code\n"
+ "/*! Wegen Verkürzung unsichtbare Klasse */\n"
+ "class Invisible { };\n\n"
+ "/*! Klasse verkürzt dargestellt, Vererbungsbeziehung ist versteckt */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Nicht mit doxygen-Kommentaren dokumentierte Klasse */\n"
+ "class Undocumented { };\n\n"
+ "/*! Mithilfe öffentlicher Vererbung vererbte Klasse */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Eine Template-Klasse */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Mithilfe geschützter Vererbung vererbte Klasse */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Mithilfe privater Vererbung vererbte Klasse */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Von der Klasse Inherited benutzte Klasse */\n"
+ "class Used { };\n\n"
+ "/*! Superklasse, die von mehreren anderen Klassen erbt */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Dies liefert den folgenden Graphen:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n"
+ "<p>\n"
+ "Die Rechtecke in obigem Graphen bedeuten:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>Ein grau gefülltes Rechteck stellt die Struktur oder "
+ "Klasse dar, für die der Graph erzeugt wurde.</li>\n"
+ "<li>Ein Rechteck mit schwarzem Rahmen kennzeichnet eine dokumentierte "
+ "Struktur oder Klasse.</li>\n"
+ "<li>Ein Rechteck mit grauem Rahmen kennzeichnet eine undokumentierte "
+ "Struktur oder Klasse.</li>\n"
+ "<li>Ein Rechteck mit rotem Rahmen kennzeichnet eine dokumentierte "
+ "Struktur oder Klasse, für die nicht alle Vererbungs-/"
+ "Enthaltenseinsbeziehungen dargestellt werden. Ein Graph wird gekürzt, "
+ "wenn er nicht in die angegebenen Schranken passt.</li>\n"
+ "</ul>\n"
+ "<p>\n"
+ "Die Pfeile bedeuten:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>Ein dunkelblauer Pfeil stellt eine öffentliche Vererbungsbeziehung "
+ "zwischen zwei Klassen dar.</li>\n"
+ "<li>Ein dunkelgrüner Pfeil stellt geschützte Vererbung dar.</li>\n"
+ "<li>Ein dunkelroter Pfeil stellt private Vererbung dar.</li>\n"
+ "<li>Ein gestrichelter violetter Pfeil bedeutet, dass eine Klasse in "
+ "einer anderen enthalten ist oder von einer anderen benutzt wird. Am "
+ "Pfeil stehen die Variable(n), mit deren Hilfe auf die Struktur oder "
+ "Klasse an der Pfeilspitze zugegriffen werden kann.</li>\n"
+ "<li>Ein gestrichelter gelber Pfeil kennzeichnet eine Verknüpfung "
+ "zwischen einer Template Instanz und der Template Klasse von welcher "
+ "es abstammt. Neben dem Pfeil sind die Template Parameter aufgeführt.</li>\n"
+ "</ul>\n";
+ }
+
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "Legende";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Test-Liste";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Methoden";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Propertys";
+ }
+
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Dokumentation der Propertys";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ return "Datenstrukturen";
+ else
+ return "Klassen";
+ }
+
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paket "+name;
+ }
+
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Paketliste";
+ }
+
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Hier folgen die Pakete mit einer Kurzbeschreibung (wenn verfügbar):";
+ }
+
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pakete";
+ }
+
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Wert:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Fehler";
+ }
+
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Liste der bekannten Fehler";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6-20010422
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file. See translator_en.h for details. */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Index";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool, bool singular)
+ {
+ QCString result("Klasse");
+ if (!singular) result+="n";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool, bool singular)
+ {
+ QCString result("Datei");
+ if (!singular) result+="en";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool, bool singular)
+ {
+ QCString result("Namensbereich");
+ if (!singular) result+="e";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool, bool singular)
+ {
+ QCString result("Gruppe");
+ if (!singular) result+="n";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool, bool singular)
+ {
+ QCString result("Seite");
+ if (!singular) result+="n";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool, bool singular)
+ {
+ QCString result("Element");
+ if (!singular) result+="e";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global")); // FIXME
+ if (!singular) result+="";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7-20010524
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages.
+ */
+ virtual QCString trAuthor(bool, bool singular)
+ {
+ QCString result("Autor");
+ if (!singular) result+="en";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Benutzt";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementiert " + trWriteList(numEntries) + ".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementiert in " + trWriteList(numEntries) + ".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Inhaltsverzeichnis";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Veraltete Elemente";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Ereignisse";
+ }
+
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Ereignisdokumentation";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Pakettypen";
+ }
+
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Paketfunktionen";
+ }
+
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statische Paketfunktionen";
+ }
+
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Paketattribute";
+ }
+
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statische Paketattribute";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Alle";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Hier ist ein Graph der zeigt, was diese Funktion aufruft:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Suchen nach";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Suchergebnisse";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Es wurden keine Dokumente zu Ihrer Suchanfrage gefunden.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Es wurde <b>1</b> Dokument zu Ihrer Suchanfrage gefunden.";
+ }
+ else
+ {
+ return "Es wurden <b>$num</b> Dokumente zu Ihrer Suchanfrage "
+ "gefunden. Die besten Treffer werden zuerst angezeigt.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Treffer:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " Quellcode";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Verzeichnishierarchie"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Verzeichnisdokumentation"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Verzeichnisse"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Diese Verzeichnishierarchie ist -mit Einschränkungen- "
+ "alphabetisch sortiert:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+="-Verzeichnisreferenz"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool, bool singular)
+ {
+ QCString result("Verzeichnis");
+ if (!singular) result+="se";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Dies ist eine überladene Methode, die der Bequemlichkeit "
+ "wegen bereitgestellt wird. Sie unterscheidet sich von der "
+ "obigen Funktion nur in den Argumenten die sie unterstützt.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Enumerator-Dokumentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Elementfunktionen/Unterroutinen-Dokumentation"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Datentyp-Liste"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Datenfelder"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Hier folgen die Datentypen mit Kurzbeschreibungen:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Hier folgt eine Liste aller ";
+ if (!extractAll)
+ {
+ result+="dokumentierten ";
+ }
+ result+="Datentypelemente";
+ result+=" mit Links ";
+ if (!extractAll)
+ {
+ result+="zur Datenstruktur-Dokumentation für jedes Element";
+ }
+ else
+ {
+ result+="zu den Datentypen, zu denen sie gehören:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Datentyp-Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Datentyp-Dokumentation"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funktionen/Unterroutinen"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Funktionen/Unterroutinen-Dokumentation"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Datentypen"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Modulliste"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Hier folgt eine Liste aller ";
+ if (!extractAll) result+="dokumentierten ";
+ result+="Module mit ihren Kurzbeschreibungen:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ result += "-";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="Modul"; break;
+ case ClassDef::Struct: result+="Typ"; break;
+ case ClassDef::Union: result+="Union"; break;
+ case ClassDef::Interface: result+="Interface"; break;
+ case ClassDef::Protocol: result+="Protokoll"; break;
+ case ClassDef::Category: result+="Kategorie"; break;
+ case ClassDef::Exception: result+="Ausnahmen"; break;
+ }
+ if (isTemplate) result+="-Template";
+ result+="-Referenz";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+="-Modul-Referenz";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Modul-Elemente"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Hier folgt eine Liste aller ";
+ if (!extractAll) result+="dokumentierten ";
+ result+="Modulelemente mit Links ";
+ if (extractAll)
+ {
+ result+="zur Moduldokumentation für jedes Element:";
+ }
+ else
+ {
+ result+="zu den Modulen, zu denen sie gehören:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Modul-Index"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool /*first_capital*/, bool singular)
+ {
+ QCString result("Modul");
+ if (!singular) result+="e";
+ return result;
+ }
+
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"Die Dokumentation für ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="dieses Modul"; break;
+ case ClassDef::Struct: result+="diesen Typ"; break;
+ case ClassDef::Union: result+="diese Union"; break;
+ case ClassDef::Interface: result+="dieses Interface"; break;
+ case ClassDef::Protocol: result+="dieses Protokoll"; break;
+ case ClassDef::Category: result+="diese Kategorie"; break;
+ case ClassDef::Exception: result+="diese Ausnahme"; break;
+ }
+ if (single)
+ result+=" wurde aus der folgenden Datei erzeugt:";
+ else
+ result+=" wurde aus den folgenden Dateien erzeugt:";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool /*first_capital*/, bool singular)
+ {
+ QCString result("Typ");
+ if (!singular) result+="en";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool /*first_capital*/, bool singular)
+ {
+ QCString result("Unterprogramm");
+ if (!singular) result+="e";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Type Constraints";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Bezug " + QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Lade ...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Globaler Namensbereich";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Suche ...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Keine Treffer";
+ }
+
+};
+
+#endif
diff --git a/src/translator_dk.h b/src/translator_dk.h
new file mode 100644
index 0000000..be9dcc7
--- /dev/null
+++ b/src/translator_dk.h
@@ -0,0 +1,1816 @@
+/*-*- c-basic-offset: 2; tab-width: 8 -*-*/
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+ /*! @file
+ * @brief Danish translation
+ */
+
+/*
+ * Danish translation by
+ * Erik Se Srensen <eriksoe@daimi.au.dk>
+ *
+ * First version (not complete) for Doxygen 1.2.7
+ * Extended and revised for Doxygen 1.3
+ * Extended and revised for Doxygen 1.3.4
+ * Extended and revised for Doxygen 1.3.8
+ */
+
+/* Translator's notes:
+
+ Oversttelseskonventioner:
+ (Konventioner for konventioner:
+ '?' angiver oversttelser, jeg har vret i tvivl om
+ '??' angiver tvivlsomme oversttelser
+ '..?' angiver ord, der endnu ikke er fundet en oversttelse til
+ '(do.)' angiver ord, der med vilje ikke er oversat, idet jeg selv
+ overvejende bruger det engelske udtryk
+ '(-> _)' angiver ord, der er fundet en oversttelse til, men som jeg
+ vgrer mig ved at overstte.
+ 'KLID:_' angiver ord, hvor jeg med overlg har rettet mig efter
+ KLID.dk's oversttelsesguide (enig eller ej).
+ )
+ bug -> 'kendt fejl'
+ class -> klasse
+ compound -> 'sammensat type'
+ constructor -> konstruktr ?
+ destructor -> destruktr ?
+ directory -> KLID:katalog (kunne ogs vre 'bibliotek','mappe','folder')
+ event -> begivenhed ?
+ exception (-> undtagelse ?)
+ friend ..?
+ interface -> grnseflade ?
+ member -> medlem (TODO)
+ namespace -> (do.)
+ overloaded -> KLID:overdefineret
+ private -> privat
+ property -> egenskab?
+ protected -> beskyttet ??
+ public -> offentlig
+ reference(vb) -> "indeholde referencer til" (?)
+ slot ..?
+ source code -> kildekode
+ struct -> datastruktur
+ template (-> skabelon ?)
+ typedef -> typedefinition (?)
+ todo -> (do.)
+ union ..?
+
+ Specielle forbindelser:
+ 'Inheritance diagram' -> Stamtr (selvom Nedarvningsdiagram ogs gik an)
+
+
+ -----
+
+ (Konstruktivt) input modtages med glde!
+ -- Erik Se Srensen <eriksoe@daimi.au.dk>
+
+
+ links -> (links.)
+ -- Poul-Erik Hansen
+
+ */
+
+#ifndef TRANSLATOR_DK_H
+#define TRANSLATOR_DK_H
+
+// class TranslatorDanish : public TranslatorAdapter_1_5_4
+class TranslatorDanish : public Translator
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "danish"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return
+ "\\usepackage[danish]{babel}\n"
+ "\\usepackage[T1]{fontenc}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-1";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Relaterede funktioner"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Bemrk at disse ikke er medlems-funktioner.)"; }
+
+ /*! header that is put before the detailed description of files,
+ * classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Detaljeret beskrivelse"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Dokumentation af medlems-typedefinitioner"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Dokumentation af medlems-enumerationer"; }
+ // medlems-enumerationer -> 'indeholdte enumerationer'
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Dokumentation af medlemsfunktioner"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Felt-dokumentation";
+ } else {
+ return "Dokumentation af feltvariable";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Mere..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Liste over alle medlemmer."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Liste over medlemmer"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Dette er den komplette liste over medlemmer i "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", inklusive alle nedarvede medlemmer."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Automatisk genereret af Doxygen";
+ if (s) result+=(QCString)" for "+s;
+ result+=" ud fra kildekoden.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "enumerationsnavn"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "enumerationsvrdi"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "defineret i"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Moduler"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Klassehierarki"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Datastrukturer";
+ } else {
+ return "Oversigt over sammensatte typer";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Filoversigt"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Data-felter";
+ } else {
+ return "Felter i sammensatte typer";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Globale symboler";
+ } else {
+ return "Placering i filer"; // Fil-medlemmer"; //TODO
+ //"Globale definitioner" ?
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Relaterede sider"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Eksempler"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Sg"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Denne nedarvningsliste er sorteret nsten - "
+ "men ikke ndvendigvis helt - alfabetisk:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll) result+="dokumenterede ";
+ result+="filer med korte beskrivelser:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Her er datastrukturerne med korte beskrivelser:";
+ } else {
+ return "Her er klasserne, datastrukturerne, "
+ "unionerne og grnsefladerne med korte beskrivelser:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll) {
+ result+="dokumenterede ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ result+="felter i datastrukturer og unioner";
+ } else {
+ result+="klassemedlemmer";
+ }
+ result+=" med links til ";
+ if (!extractAll) {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ result+="datastruktur/unions-dokumentationen for hvert felt:";
+ } else {
+ result+="klassedokumentationen for hvert medlem:";
+ }
+ } else {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ result+="de datastrukturer/unioner, de hrer til:";
+ } else {
+ result+="de klasser, de hrer til:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll) result+="dokumenterede ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ result+="funktioner, variable, #defines, enumerationer "
+ "og typedefinitioner";
+ } else {
+ result+="fil-medlemmer";
+ }
+ result+=", med links til ";
+ if (extractAll)
+ result+="de filer, de tilhrer:";
+ else
+ result+="deres dokumentation:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Her er en liste over alle eksempler:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Her er en liste over alle relaterede dokumentationssider:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Her er en liste over alle moduler:"; }
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Modul-indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarkisk indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Indeks over datastrukturer";
+ } else {
+ return "Indeks over sammensatte typer";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Fil-indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Modul-dokumentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Datastruktur-documentation";
+ } else {
+ return "Klasse-dokumentation";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Fil-dokumentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Eksempel-dokumentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Side-dokumentation"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Referencemanual"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "#Defines"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Funktionsprototyper"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Typedefinitioner"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumerationer"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funktioner"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variable"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Enumerationsvrdier"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "#Define-dokumentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Dokumentation af funktionsprototyper"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Dokumentation af typedefinitioner"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Dokumentation af enumerations-typer"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Dokumentation af enumerations-vrdier"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Funktions-dokumentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Variabel-dokumentation"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Datastrukturer";
+ } else {
+ return "Sammensatte typer";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Genereret "+date;
+ if (projName) result+=(QCString)" for "+projName;
+ result+=(QCString)" af";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ { return "skrevet af"; }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Stamtr for "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Kun til intern brug."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Advarsel"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Version"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Dato"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Returnerer"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Se ogs"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametre"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Undtagelser"; } // "Exceptions"
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Genereret af"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Oversigt over namespaces"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll) result+="dokumenterede ";
+ result+="namespaces med korte beskrivelser:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Dokumentation af friends og af relaterede funktioner"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName+" ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Klasse-"; break;
+ case ClassDef::Struct: result+=" Datastruktur-"; break;
+ case ClassDef::Union: result+=" Union-"; break;
+ case ClassDef::Interface: result+=" Grnseflade-"; break;
+ case ClassDef::Protocol: result+=" Protokol-"; break;
+ case ClassDef::Category: result+=" Kategori-"; break; // " Category-"
+ case ClassDef::Exception: result+=" Undtagelse-"; break; // " Exception"
+ }
+ if (isTemplate) result+="skabelon-"; // "template-"
+ result+="reference";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" filreference";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" namespace-reference";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Offentlige metoder"; }
+ virtual QCString trPublicSlots()
+ { return "Offentlige slots"; }
+ virtual QCString trSignals()
+ { return "Signaler"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statiske, offentlige metoder"; }
+ virtual QCString trProtectedMembers()
+ { return "Beskyttede metoder"; }
+ virtual QCString trProtectedSlots()
+ { return "Beskyttede slots"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statiske, beskyttede metoder"; }
+ virtual QCString trPrivateMembers()
+ { return "Private metoder"; }
+ virtual QCString trPrivateSlots()
+ { return "Private slots"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statiske, private metoder"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++) {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) { // not the last entry, so we need a separator
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" og ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Nedarver "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Nedarvet af "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Overskriver metode fra "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementeret i "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Namespace-medlemmer"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll) result+="dokumenterede ";
+ result+="namespace-medlemmer med links til ";
+ if (extractAll)
+ result+="namespace-dokumentationen for hvert medlem:";
+ else
+ result+="det namespace, de hrer til:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Namespace-indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Namespace-dokumentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentationen for denne ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="klasse"; break;
+ case ClassDef::Struct: result+="datastruktur"; break;
+ case ClassDef::Union: result+="union"; break;
+ case ClassDef::Interface: result+="grnseflade"; break;
+ case ClassDef::Protocol: result+="protokol"; break; // "protocol"
+ case ClassDef::Category: result+="kategori"; break; // "category"
+ case ClassDef::Exception: result+="undtagelse"; break; // "exception"
+ }
+ result+=" blev genereret ud fra fil";
+ if (single) result+="en:"; else result+="erne:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Alfabetisk oversigt"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Returvrdier"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Hovedside"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "s."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Defineret p linje @0 i filen @1.";
+ }
+
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Defineret i filen @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Frardes - fortidslevn"; // ?? - What is the context?
+ // "Ugleset" :)
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Samarbejdsdiagram for "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Inklusions-afhngighedsgraf for "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Dokumentation af konstruktrer og destruktrer";
+ // "Constructor & Destructor dokumentation";
+ }
+
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ { return "Hop til denne fils kildekode."; }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ { return "Hop til denne fils dokumentation."; }
+
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ { return "Forudstninger (precondition)"; }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ { return "Resultat (postcondition)"; }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ { return "Invariant"; }
+
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ { return "Startvrdi:"; }
+
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ { return "kildekode"; }
+ virtual QCString trGraphicalHierarchy()
+ { return "Grafisk klassehierarki"; }
+ virtual QCString trGotoGraphicalHierarchy()
+ { return "Hop til det grafiske klassehierarki"; }
+ virtual QCString trGotoTextualHierarchy()
+ { return "Hop til det tekstuelle klassehierarki"; }
+ virtual QCString trPageIndex()
+ { return "Sideindeks"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ { return "Note"; }
+ virtual QCString trPublicTypes()
+ { return "Offentlige typer"; }
+
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Datafelter";
+ } else {
+ return "Offentlige attributter";
+ }
+ }
+
+ virtual QCString trStaticPublicAttribs()
+ { return "Statiske, offentlige attributter"; }
+ virtual QCString trProtectedTypes()
+ { return "Beskyttede typer"; }
+ virtual QCString trProtectedAttribs()
+ { return "Beskyttede attributter"; }
+ virtual QCString trStaticProtectedAttribs()
+ { return "Statiske, beskyttede attributter"; }
+ virtual QCString trPrivateTypes()
+ { return "Private typer"; }
+ virtual QCString trPrivateAttribs()
+ { return "Private attributter"; }
+ virtual QCString trStaticPrivateAttribs()
+ { return "Statiske, private attributter"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Todo";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Todo-liste";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Refereret til af";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Bemrkninger";
+ }
+ virtual QCString trAttention()
+ {
+ return "OBS";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return
+ "Denne graf viser, hvilke filer der direkte eller "
+ "indirekte inkluderer denne fil:";
+ }
+ virtual QCString trSince()
+ {
+ return "Siden";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Graf-forklaring";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs() //TODO
+ {
+ return
+ "Denne side forklarer, hvordan man skal fortolke de grafer, "
+ "der genereres af doxygen.<p>\n"
+ "Tag flgende eksempel:\n"
+ "\\code\n"
+ "/*! Klasse der er usynlig pg.a. beskring */\n"
+ "class Invisible { };\n\n"
+ "/*! Beskret klasse: nedarvningsrelation er skjult */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Klasse der ikke er dokumenteret med doxygen-kommentarer */\n"
+ "class Undocumented { };\n\n"
+ "/*! Klasse der nedarves fra offentligt */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! En template-klasse */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Klasse der nedarves fra beskyttet */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Klasse der nedarves fra privat */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Klasse der bruges af Inherited-klassen */\n"
+ "class Used { };\n\n"
+ "/*! Klasse der nedarver en masse andre klasser */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Hvis \\c MAX_DOT_GRAPH_HEIGHT i konfigurationsfilen "
+ "er sat til 240, vil dette resultere i flgende graf:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "De forskellige slags kasser i ovenstende graf har flgende "
+ "betydninger:\n"
+ "<ul>\n"
+ "<li>%En udfyldt sort kasse reprsenterer den datastruktur eller "
+ "klasse, grafen er genereret for.\n"
+ "<li>%En kasse med sort kant betegner en dokumenteret datastruktur "
+ " eller klasse.\n"
+ "<li>%En kasse med gr kant betegner en udokumenteret datastruktur "
+ " eller klasse.\n"
+ "<li>%En kasse med rd kant betegner en dokumenteret datastruktur "
+ " eller klasse, for hvilken ikke alle "
+ "nedarvnings- og indeholdelses-relationer er vist. "
+ "%Grafer beskres, hvis de fylder mere end de specificerede dimensioner.\n "
+ "</ul>\n"
+ "Pilene har flgende betydninger:\n"
+ "<ul>\n"
+ "<li>%En mrkebl pil viser en offentlig nedarvningsrelation "
+ "mellem to klasser.\n"
+ "<li>%En mrkegrn pil viser en beskyttet nedarvningsrelation.\n"
+ "<li>%En mrkerd pil viser en privat nedarvningsrelation.\n"
+ "<li>%En lilla, stiplet pil bruges, nr en klasse er indeholdt i "
+ "eller benyttes af en anden klasse. "
+ "Ved pilen str navnet p den eller de variable, gennem hvilke(n) "
+ "den klasse, pilen peger p, er tilgngelig.\n"
+ "<li>%En gul, stiplet pil viser forholdet mellem en template-instans "
+ "og den template-klasse, den er instantieret fra."
+ "Ved pilen str template-parametrene brugt ved instantieringen.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "forklaring til graf";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Testliste";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP-metoder";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Egenskaber";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Egenskabsdokumentation";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Datastrukturer";
+ } else {
+ return "Klasser";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Pakke "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Pakkeoversigt";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return
+ "Her er en liste over pakkerne, med korte beskrivelser "
+ "(hvor en sdan findes):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pakker";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Vrdi:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Kendte fejl";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Liste over kendte fejl";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ * (used table extract:)
+ * <pre>
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * ANSI_CHARSET 0 (x00) 1252
+ * </pre>
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indeks";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "klasse", "r");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "fil", "er");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "namespace", "s");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "gruppe", "r");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "side", "r");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "medlem", "mer");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "global", "e");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "forfatter", "e");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Indeholder referencer til";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementerer "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementeret i "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Indholdsfortegnelse";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Liste over fortidslevn, hvis brug frardes";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Begivenheder";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Begivenhedsdokumentation";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /* Java: Entities with package scope... */
+ virtual QCString trPackageTypes()
+ { return "Typer med pakke-scope"; }
+ virtual QCString trPackageMembers()
+ { return "Metoder med pakke-scope"; }
+ virtual QCString trStaticPackageMembers()
+ { return "Statiske metoder med pakke-scope"; }
+ virtual QCString trPackageAttribs()
+ { return "Attributter med pakke-scope"; }
+ virtual QCString trStaticPackageAttribs()
+ { return "Statiske attributter med pakke-scope"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Alle";
+ }
+
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Her er kald-grafen for denne funktion:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Sg efter";
+ }
+
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Sgeresultater";
+ }
+
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0) {
+ return "Beklager - ingen dokumenter passede til din foresprgsel.";
+ } else if (numDocuments==1) {
+ return "Fandt <b>1</b> dokument, der passer til din foresprgsel.";
+ } else {
+ return
+ "Fandt <b>$num</b> dokumenter, der passer til din foresprgsel. "
+ "De, der passer bedst, vises frst.";
+ }
+ }
+
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Fundne ord:"; //translation?
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for
+ * file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Kildefilen " + filename;
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Katalogstruktur"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Katalog-dokumentation"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Kataloger"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Denne katalogstruktur er sorteret nsten - "
+ "men ikke ndvendigvis helt - alfabetisk:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result="Indhold af kataloget "; result+=dirName; return result;}
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "katalog", "er");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Dette er en overdefineret medlemsfunktion, "
+ "defineret af bekvemmelighedshensyn. "
+ "Den adskiller sig kun fra den ovenstende funktion i, "
+ "hvilke argumenter den tager.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Her er kalder-grafen for denne funktion:";
+ }
+
+ // None translated yet PEH 2010-11-27
+ // Subroutine
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Medlem Funktion/Subroutine Dokumentation"; } // "Member Function/Subroutine Documentation"
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ /*
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Enumerator-dokumentation"; } //TODO?
+*/
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Data Type Liste"; } // "Data Types List"
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Data felter"; } // "Data Fields"
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Her er de datatyper med kort beskrivelse:"; } // "Here are the data types with brief descriptions:"
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Her er en liste af alle "; // "Here is a list of all "
+ if (!extractAll)
+ {
+ result+="dokumenteret "; // "documented "
+ }
+ result+="datatype medlemmer"; // "data types members"
+ result+=" med links til "; // " with links to "
+ if (!extractAll)
+ {
+ result+="data strukturer dokumenteret for hver medlem"; // "the data structure documentation for each member"
+ }
+ else
+ {
+ result+="de datatyper som de tilhrer:"; // "the data types they belong to:"
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Datatype indeks"; } // "Data Type Index"
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Datatype dokumentation"; } // "Data Type Documentation"
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funktioner/Subroutiner"; } // "Functions/Subroutines"
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Funktion/Subroutine dokumentation"; } // "Function/Subroutine Documentation"
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Datatyper"; } // "Data Types"
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Modulliste"; } // "Modules List"
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle "; // "Here is a list of all "
+ if (!extractAll) result+="dokumenteret "; // "documented "
+ result+="moduler med kort beskrivelse:"; // "modules with brief descriptions:"
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Modul"; break; // " Module"
+ case ClassDef::Struct: result+=" Type"; break; // " Type"
+ case ClassDef::Union: result+=" Union"; break; // " Union"
+ case ClassDef::Interface: result+=" Grnseflade"; break; // " Interface"
+ case ClassDef::Protocol: result+=" Protocol"; break; // " Protocol"
+ case ClassDef::Category: result+=" Kategori"; break; // " Category"
+ case ClassDef::Exception: result+=" Undtagelse"; break; // " Exception"
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Reference";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Modulreference"; // " Module Reference"
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Modulmedlemmer"; } // "Module Members"
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Her er en list over alle "; // "Here is a list of all "
+ if (!extractAll) result+="Dokumentet "; // "documented "
+ result+="modulmemlemmer med link til "; // "module members with links to "
+ if (extractAll)
+ {
+ result+="dokumentation for hvert model medlem:"; // "the module documentation for each member:"
+ }
+ else
+ {
+ result+="moduler de tilhre:"; // "the modules they belong to:"
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Modulindekser"; } // "Modules Index"
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modul" : "modul")); // "Module" : "module"));
+ if (!singular) result+="er"; // "s";
+ return result;
+ }
+
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"The documentation for this ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="modul"; break; // "module"
+ case ClassDef::Struct: result+="type"; break; // "type"
+ case ClassDef::Union: result+="union"; break; // "union"
+ case ClassDef::Interface: result+="grnseflade"; break; // "interface"
+ case ClassDef::Protocol: result+="protokol"; break; // "protocol"
+ case ClassDef::Category: result+="kategori"; break; // "category"
+ case ClassDef::Exception: result+="undtagelse"; break; // "exception"
+ }
+ result+=" var lavet udfra flgende file"; // " was generated from the following file"
+ if (single) result+=":"; else result+="r:"; // ":" / "s:"
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Type" : "type")); // "Type" : "type"
+ if (!singular) result+="r"; // "s"
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprogram" : "subprogram")); // "Subprogram" : "subprogram"
+ if (!singular) result+="er"; // "s"
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "typebegrnsninger"; // "Type Constraints"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" Relation"; // " Relation"
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Indlser..."; // "Loading..."
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Globalt Namespace"; // "Global Namespace"
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Sger..."; // "Searching..."
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Ingen fund"; // "No Matches"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Afhngighedsgraf for "+name; // "Directory dependency graph for "
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"File i "+name; // "File in "
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Inkluderer file i "+name; // "Includes file in "
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Man","Tir","Ons","Tor","Fre","Lr","Sn" }; // { "Mon","Tue","Wed","Thu","Fri","Sat","Sun" };
+ static const char *months[] = { "Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec" }; // { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };
+ QCString sdate;
+ sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+
+/*---------- For internal use: ----------------------------------------*/
+ protected:
+ /*! For easy flexible-noun implementation.
+ * \internal
+ */
+ QCString createNoun(bool first_capital, bool singular,
+ const char* base, const char* plurSuffix)
+ {
+ QCString result(base);
+ if (first_capital) result.at(0) = toupper(result.at(0));
+ if (!singular) result+=plurSuffix;
+ return result;
+ }
+};
+
+#endif
diff --git a/src/translator_en.h b/src/translator_en.h
new file mode 100644
index 0000000..f6f01b1
--- /dev/null
+++ b/src/translator_en.h
@@ -0,0 +1,1876 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_EN_H
+#define TRANSLATOR_EN_H
+
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorEnglish : public Translator
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "english"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "";
+ }
+
+ /*! return the language charset. This will be used
+ when transcoding the translatable strings in this file to UTF-8 */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-1";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Related Functions"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Note that these are not member functions.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Detailed Description"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Member Typedef Documentation"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Member Enumeration Documentation"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Member Function Documentation"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Field Documentation";
+ }
+ else
+ {
+ return "Member Data Documentation";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "More..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "List of all members."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Member List"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "This is the complete list of members for "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", including all inherited members."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Generated automatically by Doxygen";
+ if (s) result+=(QCString)" for "+s;
+ result+=" from the source code.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "enum name"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "enum value"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "defined in"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Modules"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Class Hierarchy"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Structures";
+ }
+ else
+ {
+ return "Class List";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "File List"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Fields";
+ }
+ else
+ {
+ return "Class Members";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globals";
+ }
+ else
+ {
+ return "File Members";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Related Pages"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Examples"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Search"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "This inheritance list is sorted roughly, "
+ "but not completely, alphabetically:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+ result+="files with brief descriptions:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Here are the data structures with brief descriptions:";
+ }
+ else
+ {
+ return "Here are the classes, structs, "
+ "unions and interfaces with brief descriptions:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll)
+ {
+ result+="documented ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struct and union fields";
+ }
+ else
+ {
+ result+="class members";
+ }
+ result+=" with links to ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="the struct/union documentation for each field:";
+ }
+ else
+ {
+ result+="the class documentation for each member:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="the structures/unions they belong to:";
+ }
+ else
+ {
+ result+="the classes they belong to:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="functions, variables, defines, enums, and typedefs";
+ }
+ else
+ {
+ result+="file members";
+ }
+ result+=" with links to ";
+ if (extractAll)
+ result+="the files they belong to:";
+ else
+ result+="the documentation:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Here is a list of all examples:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Here is a list of all related documentation pages:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Here is a list of all modules:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Documentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Module Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarchical Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Structure Index";
+ }
+ else
+ {
+ return "Class Index";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "File Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Module Documentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Structure Documentation";
+ }
+ else
+ {
+ return "Class Documentation";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "File Documentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Example Documentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Page Documentation"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Reference Manual"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Defines"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Function Prototypes"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Typedefs"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumerations"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Functions"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variables"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Enumerator"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Define Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Function Prototype Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Typedef Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Enumeration Type Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Function Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Variable Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Structures";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generated on "+date;
+ if (projName) result+=(QCString)" for "+projName;
+ result+=(QCString)" by";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "written by";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Inheritance diagram for "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "For internal use only."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Warning"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Version"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Date"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Returns"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "See also"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parameters"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Exceptions"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Generated by"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Namespace List"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+ result+="namespaces with brief descriptions:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Friends And Related Function Documentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Class"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Reference";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" File Reference";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Namespace Reference";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Public Member Functions"; }
+ virtual QCString trPublicSlots()
+ { return "Public Slots"; }
+ virtual QCString trSignals()
+ { return "Signals"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Static Public Member Functions"; }
+ virtual QCString trProtectedMembers()
+ { return "Protected Member Functions"; }
+ virtual QCString trProtectedSlots()
+ { return "Protected Slots"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Static Protected Member Functions"; }
+ virtual QCString trPrivateMembers()
+ { return "Private Member Functions"; }
+ virtual QCString trPrivateSlots()
+ { return "Private Slots"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Static Private Member Functions"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", and ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Inherits "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Inherited by "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplemented from "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplemented in "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Namespace Members"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+ result+="namespace members with links to ";
+ if (extractAll)
+ result+="the namespace documentation for each member:";
+ else
+ result+="the namespaces they belong to:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Namespace Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Namespace Documentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // single is true implies a single file
+ QCString result=(QCString)"The documentation for this ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="class"; break;
+ case ClassDef::Struct: result+="struct"; break;
+ case ClassDef::Union: result+="union"; break;
+ case ClassDef::Interface: result+="interface"; break;
+ case ClassDef::Protocol: result+="protocol"; break;
+ case ClassDef::Category: result+="category"; break;
+ case ClassDef::Exception: result+="exception"; break;
+ }
+ result+=" was generated from the following file";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Alphabetical List"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Return values"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Main Page"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "p."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definition at line @0 of file @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definition in file @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Deprecated";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Collaboration diagram for "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Include dependency graph for "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Constructor & Destructor Documentation";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Go to the source code of this file.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Go to the documentation of this file.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Precondition";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postcondition";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Initial value:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "code";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Graphical Class Hierarchy";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Go to the graphical class hierarchy";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Go to the textual class hierarchy";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Page Index";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Note";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Public Types";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Fields";
+ }
+ else
+ {
+ return "Public Attributes";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Static Public Attributes";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Protected Types";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Protected Attributes";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Static Protected Attributes";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Private Types";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Private Attributes";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Static Private Attributes";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Todo";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Todo List";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referenced by";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Remarks";
+ }
+ virtual QCString trAttention()
+ {
+ return "Attention";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "This graph shows which files directly or "
+ "indirectly include this file:";
+ }
+ virtual QCString trSince()
+ {
+ return "Since";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Graph Legend";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "This page explains how to interpret the graphs that are generated "
+ "by doxygen.<p>\n"
+ "Consider the following example:\n"
+ "\\code\n"
+ "/*! Invisible class because of truncation */\n"
+ "class Invisible { };\n\n"
+ "/*! Truncated class, inheritance relation is hidden */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Class not documented with doxygen comments */\n"
+ "class Undocumented { };\n\n"
+ "/*! Class that is inherited using public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Class that is inherited using protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Class that is inherited using private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Class that is used by the Inherited class */\n"
+ "class Used { };\n\n"
+ "/*! Super class that inherits a number of other classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "This will result in the following graph:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n"
+ "<p>\n"
+ "The boxes in the above graph have the following meaning:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>%A filled gray box represents the struct or class for which the "
+ "graph is generated.</li>\n"
+ "<li>%A box with a black border denotes a documented struct or class.</li>\n"
+ "<li>%A box with a grey border denotes an undocumented struct or class.</li>\n"
+ "<li>%A box with a red border denotes a documented struct or class for"
+ "which not all inheritance/containment relations are shown. %A graph is "
+ "truncated if it does not fit within the specified boundaries.</li>\n"
+ "</ul>\n"
+ "<p>\n"
+ "The arrows have the following meaning:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>%A dark blue arrow is used to visualize a public inheritance "
+ "relation between two classes.</li>\n"
+ "<li>%A dark green arrow is used for protected inheritance.</li>\n"
+ "<li>%A dark red arrow is used for private inheritance.</li>\n"
+ "<li>%A purple dashed arrow is used if a class is contained or used "
+ "by another class. The arrow is labeled with the variable(s) "
+ "through which the pointed class or struct is accessible.</li>\n"
+ "<li>%A yellow dashed arrow denotes a relation between a template instance and "
+ "the template class it was instantiated from. The arrow is labeled with "
+ "the template parameters of the instance.</li>\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legend";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Test List";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Member Functions";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Properties";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Property Documentation";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Structures";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Package "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Package List";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Here are the packages with brief descriptions (if available):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Packages";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Value:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Bug";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Bug List";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Index";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Class" : "class"));
+ if (!singular) result+="es";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "File" : "file"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Group" : "group"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Page" : "page"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Member" : "member"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Author" : "author"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "References";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implements "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implemented in "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Table of Contents";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Deprecated List";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Events";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Event Documentation";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Package Types";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Package Functions";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Static Package Functions";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Package Attributes";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Static Package Attributes";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "All";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Here is the call graph for this function:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Search for";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Search Results";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Sorry, no documents matching your query.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Found <b>1</b> document matching your query.";
+ }
+ else
+ {
+ return "Found <b>$num</b> documents matching your query. "
+ "Showing best matches first.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Matches:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " Source File";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Directory Hierarchy"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Directory Documentation"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Directories"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "This directory hierarchy is sorted roughly, "
+ "but not completely, alphabetically:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Directory Reference"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Director" : "director"));
+ if (singular) result+="y"; else result+="ies";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "This is an overloaded member function, "
+ "provided for convenience. It differs from the above "
+ "function only in what argument(s) it accepts.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Here is the caller graph for this function:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Enumerator Documentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Member Function/Subroutine Documentation"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Data Types List"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Data Fields"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Here are the data types with brief descriptions:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll)
+ {
+ result+="documented ";
+ }
+ result+="data types members";
+ result+=" with links to ";
+ if (!extractAll)
+ {
+ result+="the data structure documentation for each member";
+ }
+ else
+ {
+ result+="the data types they belong to:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Data Type Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Data Type Documentation"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Functions/Subroutines"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Function/Subroutine Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Data Types"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Modules List"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+ result+="modules with brief descriptions:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Module"; break;
+ case ClassDef::Struct: result+=" Type"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Reference";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Module Reference";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Module Members"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Here is a list of all ";
+ if (!extractAll) result+="documented ";
+ result+="module members with links to ";
+ if (extractAll)
+ {
+ result+="the module documentation for each member:";
+ }
+ else
+ {
+ result+="the modules they belong to:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Modules Index"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Module" : "module"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"The documentation for this ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="module"; break;
+ case ClassDef::Struct: result+="type"; break;
+ case ClassDef::Union: result+="union"; break;
+ case ClassDef::Interface: result+="interface"; break;
+ case ClassDef::Protocol: result+="protocol"; break;
+ case ClassDef::Category: result+="category"; break;
+ case ClassDef::Exception: result+="exception"; break;
+ }
+ result+=" was generated from the following file";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Type" : "type"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprogram" : "subprogram"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Type Constraints";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" Relation";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Loading...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Global Namespace";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Searching...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "No Matches";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Directory dependency graph for "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"File in "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Includes file in "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Mon","Tue","Wed","Thu","Fri","Sat","Sun" };
+ static const char *months[] = { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };
+ QCString sdate;
+ sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+
+};
+
+#endif
diff --git a/src/translator_eo.h b/src/translator_eo.h
new file mode 100644
index 0000000..ebc6fc0
--- /dev/null
+++ b/src/translator_eo.h
@@ -0,0 +1,1880 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+ /* Tradukita kaj ĝisdatigata de Ander Martinez. */
+
+#ifndef TRANSLATOR_EO_H
+#define TRANSLATOR_EO_H
+
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorEsperanto : public Translator
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "esperanto"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[esperanto]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Rilataj Funkcioj"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Atentu ke tiuj ĉi ne estas membraj funkcioj.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Detala Priskribo"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Dokumentado de la Membraj Tipodifinoj"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Dokumentado de la Membraj Enumeracioj"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Dokumentado de la Membraj Funkcioj"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Kampa Dokumentado";
+ }
+ else
+ {
+ return "Dokumentado de la Membraj Datumoj";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Pli..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Listo de ĉiuj membroj."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Membra Listo"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Tiu ĉi estas la kompleta membraro de "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", inkluzive ĉiujn hereditajn membrojn."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Generita aŭtomate de Doxygen";
+ if (s) result+=(QCString)" por "+s;
+ result+=" el la fontkodo.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "enum nomo"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "enum valoro"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "difinita en"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Moduloj"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Klasa Hierarkio"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datumstruktoroj";
+ }
+ else
+ {
+ return "Klasaro";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Dosieraro"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datumkampoj";
+ }
+ else
+ {
+ return "Klasaj membroj";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Mallokalaĵoj";
+ }
+ else
+ {
+ return "Dosieraj Membroj";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Rilataj Paĝoj"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Ekzemploj"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Serĉi"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Tiu ĉi heredada listo estas plimalpli, "
+ "sed ne tute, ordigita alfabete:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Jen listo de ĉiuj ";
+ if (!extractAll) result+="dokumentitaj ";
+ result+="dosieroj kun mallongaj priskriboj:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Jen datumstrukturoj kun mallongaj priskriboj:";
+ }
+ else
+ {
+ return "Jen la klasoj, strukturoj, kunigoj kaj interfacoj "
+ "kun mallongaj priskriboj:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Jen listo de ĉiuj ";
+ if (!extractAll)
+ {
+ result+="dokumentitaj ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="strukturaj kaj kunigaj kampoj";
+ }
+ else
+ {
+ result+="klasaj membroj";
+ }
+ result+=" kun ligiloj al ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="la struktura/kuniga dokumentado por ĉiu kampo:";
+ }
+ else
+ {
+ result+="la klasa dokumentado por ĉiu membro:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="la strukturoj/kunigoj al kiuj ili apartenas:";
+ }
+ else
+ {
+ result+="la klasoj al kiuj ili apartenas:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Jen listo de ĉiuj ";
+ if (!extractAll) result+="dokumentitaj ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funkcioj, variabloj, difinoj, enumeracioj kaj tipodifinoj";
+ }
+ else
+ {
+ result+="dosieraj membroj";
+ }
+ result+=" kun ligiloj al ";
+ if (extractAll)
+ result+="la dosieroj al kiuj ili apartenas:";
+ else
+ result+="la dokumentado:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Jen listo de ĉiuj la ekzemploj:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Jen listo de ĉiuj rilataj dokumentadaj paĝoj:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Jen listo de ĉiuj la moduloj:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentado"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Modula Indekso"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarkia Indekso"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datumstruktura Indekso";
+ }
+ else
+ {
+ return "Klasa Indekso";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Dosiera Indekso"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Modula Dokumentado"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datumstruktura Dokumentado";
+ }
+ else
+ {
+ return "Klasa Dokumentado";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Dosiera Dokumentado"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Ekzempla Dokumentado"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Paĝa Dokumentado"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Referenca Manlibro"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Difinoj"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Funkciaj Prototipoj"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Tipdifinoj"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumeracioj"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funkcioj"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variabloj"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Enumeraciilo"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Difina Dokumentado"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Dokumentado de Funkciaj Prototipoj"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Tipdifina Dokumentado"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Enumeracitipa Dokumentado"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Funkcia Dokumentado"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Variabla Dokumentado"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datumstrukturoj";
+ }
+ else
+ {
+ return "Klasoj";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generita la "+date;
+ if (projName) result+=(QCString)" por "+projName;
+ result+=(QCString)" de";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "skribita de";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Heredada diagramo por "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Nur por ena uzado."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Averto"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versio"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Dato"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Liveras"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Vido ankaŭ"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametroj"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Esceptoj"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Generita de"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Nomspacaro"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Jen listo de ĉiuj ";
+ if (!extractAll) result+="dokumentitaj ";
+ result+="nomspacoj kun mallongaj priskriboj:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Amikoj"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Dokumentado pri amikoj kaj rilatitaj funkcioj"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referenco de la ";
+ if (isTemplate) result+=" ŝablono de la ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="klaso "; break;
+ case ClassDef::Struct: result+="strukturo "; break;
+ case ClassDef::Union: result+="kunigo "; break;
+ case ClassDef::Interface: result+="interfaco "; break;
+ case ClassDef::Protocol: result+="protokolo "; break;
+ case ClassDef::Category: result+="kategorio "; break;
+ case ClassDef::Exception: result+="escepto "; break;
+ }
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" Dosiera referenco";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Nomspaca referenco";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Publikaj Membraj Funkcioj"; }
+ virtual QCString trPublicSlots()
+ { return "Pubikaj Ingoj"; }
+ virtual QCString trSignals()
+ { return "Signaloj"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statikaj Publikaj Membraj Funkcioj"; }
+ virtual QCString trProtectedMembers()
+ { return "Protektitaj Membraj Funkcioj"; }
+ virtual QCString trProtectedSlots()
+ { return "Protektitaj Ingoj"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statikaj Protektitaj Membraj Funkcioj"; }
+ virtual QCString trPrivateMembers()
+ { return "Privataj Membraj Funkcioj"; }
+ virtual QCString trPrivateSlots()
+ { return "Privataj Ingoj"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statikaj Privataj Membraj Funkcioj"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", kaj ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Heredas de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Heredita de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Rerealigita el "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Rerealigita en "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Nomspacaj Membroj"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Jen listo de ĉiuj ";
+ if (!extractAll) result+="dokumentitaj ";
+ result+="nomspacaj membroj kun ligiloj al ";
+ if (extractAll)
+ result+="la nomspaca dokumentado de ĉiu membro:";
+ else
+ result+="la nomspacoj al kiuj ili apartenas:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Nomspaca Indekso"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Nomspaca Dokumentado"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Nomspacoj"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // single is true implies a single file
+ QCString result=(QCString)"La dokumentado por tiu ĉi ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="klaso"; break;
+ case ClassDef::Struct: result+="strukturo"; break;
+ case ClassDef::Union: result+="kunigo"; break;
+ case ClassDef::Interface: result+="interfaco"; break;
+ case ClassDef::Protocol: result+="protokolo"; break;
+ case ClassDef::Category: result+="kategorio"; break;
+ case ClassDef::Exception: result+="escepto"; break;
+ }
+ result+=" generitas el la ";
+ if (single) result+="sekva dosiero:";
+ else result+="sekvaj dosieroj:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Alfabeta Listo"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Liveraĵoj"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Ĉefa Paĝo"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "p."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Difinita sur la lineo @0 de la dosiero @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Difinita en la dosiero @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Evitinda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Kunlaborada diagramo por "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Inkluzivaĵa dependeca diagramo por "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Konstruila kaj Detruila Dokumentado";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Iri al la fontkodo de tiu ĉi dosiero.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Iri al la dokumentado de tiu ĉi dosiero.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Antaŭkondiĉo";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postkondiĉo";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Malvariaĵo";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Komenca valoro:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "kodo";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafika Klasa Hierarkio";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Iri al la grafika klasa hierarkio";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Iri al la teksta klasa hierarkio";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Paĝa Indekso";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Noto";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Publikaj Tipoj";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datumkampoj";
+ }
+ else
+ {
+ return "Publikaj Atributoj";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statikaj Publikaj Atributoj";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Protektitaj Tipoj";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Protektitaj Atributoj";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statikaj Protektitaj Atributoj";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Privataj Tipoj";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Privataj Atributoj";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statikaj Privataj Atributoj";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Farendaĵo";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Farendaĵaro";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referencita de";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Rimarkoj";
+ }
+ virtual QCString trAttention()
+ {
+ return "Atentu";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Tiu ĉi diagramo montras kiuj dosieroj rekte aŭ malrekte "
+ "inkluzivas tiun ĉi dosieron:";
+ }
+ virtual QCString trSince()
+ {
+ return "De";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Diagrama Klarigeto";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Tiu ĉi paĝo klarigas kiel interpreti la diagramojn generitajn "
+ "de doxygen.<p>\n"
+ "Konsideru la sekvan ekzemplon:\n"
+ "\\code\n"
+ "/*! Nevidebla klaso pro trunkado */\n"
+ "class Invisible { };\n\n"
+ "/*! Trunkita klaso, hereda rilato kaŝiĝas */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Klaso ne dokumentita per komentoj de doxygen */\n"
+ "class Undocumented { };\n\n"
+ "/*! Klaso de kiu herediĝas per publika heredado */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Ŝablona klaso */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Klaso de kiu herediĝas per protektita heredado */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Klaso de kiu herediĝas per privata heredado */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Klaso uzata de la klaso Inherited */\n"
+ "class Used { };\n\n"
+ "/*! Supra klaso kiu heredas de kelkaj aliaj klasoj */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Tio ĉi liveros la sekvan diagramon:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "La skatoloj de la supra diagramo havas la sekvajn signifojn:\n"
+ "<ul>\n"
+ "<li>%Plene griza skatolo reprezentas la strukturon aŭ klason "
+ "kies diagramo generiĝis.\n"
+ "<li>%Skatolo kun nigra bordero montras dokumentitan strukturon aŭ klason.\n"
+ "<li>%Skatolo kun griza bordero montras nedokumentitan strukturon aŭ klason.\n"
+ "<li>%Skatolo kun ruĝa bordero montras dokumentitan strukturon aŭ klason por "
+ "kiu ne ĉiuj heredadoj/enhavoj montriĝas. %Diagramo estas trunkota "
+ "se ĝi ne adaptiĝas en la donitajn limojn.\n"
+ "</ul>\n"
+ "La sagoj havas la sekvajn signifojn:\n"
+ "<ul>\n"
+ "<li>%Malhelblua sago uzatas por montri publika heredado "
+ "inter du klasoj.\n"
+ "<li>%Malhelverda sago uzatas por protektita heredado.\n"
+ "<li>%Malhelruĝa sago uzatas por privata heredado.\n"
+ "<li>%Purpura streka sago uzatas se klaso enhavatas aŭ uzatas "
+ "de alia klaso. La sago estas etikedatas kun la variablo(j) "
+ "tra kiu la montrita klaso aŭ strukturo estas alirebla.\n"
+ "<li>%Flava streka sago montras rilato inter ŝablona apero kaj "
+ "la ŝablona klaso el kiu ĝi realigitas. La sago etikeditas kun "
+ "la parametroj de la ŝablona apero.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "klarigeto";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Testo";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Testa Listo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Membraj Funkcioj";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Atributoj";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Atributa Dokumentado";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datumstrukturoj";
+ }
+ else
+ {
+ return "Klasoj";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Pakaĵo "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Pakaĵa Listo";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Jen listo de pakaĵoj kun mallongaj priskriboj (se ekzistas):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pakaĵoj";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Valoro:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Cimo";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Cima Listo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "1";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indekso";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Klaso" : "klaso"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Dosiero" : "dosiero"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Nomspaco" : "nomspaco"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grupo" : "grupo"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Paĝo" : "paĝo"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Membro" : "membro"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Mallokalaĵo" : "mallokalaĵo"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Aŭtoro" : "aŭtoro"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referencoj";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Realigas "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Realigita en "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Enhava Tabelo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Evitindaĵa Listo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Eventoj";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Eventa Dokumentado";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Pakaĵaj Tipoj";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Pakaĵaj Funkcioj";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statikaj Pakaĵaj Funkcioj";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Pakaĵaj Atributoj";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statikaj Pakaĵaj Atributoj";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Ĉiuj";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Jen la vokdiagramo por tiu ĉi funkcio:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Serĉi";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Serĉaj Rezultoj";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Pardonu, nenio dokumento kongruas vian peton.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Trafita <b>unu</b> dokumenton kongruantan vian peton.";
+ }
+ else
+ {
+ return "Trafitaj <b>$num</b> dokumentojn kongruantajn vian peton. "
+ "Montriĝos plej bonaj kongruoj unue.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Kongruoj:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " Fonta Dosiero";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Dosieruja Hierarkio"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Dosieruja Dokumentado"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Dosierujoj"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Tiu ĉi dosieruja hierarkio estas plimalpli, "
+ "sed ne tute, ordigita alfabete:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Dosieruja Referenco"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Dosierujo" : "dosierujo"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Tiu ĉi estas superŝarĝita membra funkcio, "
+ "donita por faciligo. Ĝi nur malsamas de la supra "
+ "funkcio nur pro la argumento(j) kiujn ili akceptas.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Jen la vokdiagramo por tiu ĉi funkcio:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Enumeraciila Dokumentado"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Dokumentado de Membraj Funkcioj/Subrutinoj"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Datumtipa Listo"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Datumkampoj"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Jen la datumtipoj kun mallongaj priskriboj:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Jen listo de ĉiuj ";
+ if (!extractAll)
+ {
+ result+="dokumentitaj ";
+ }
+ result+="datumtipaj membroj";
+ result+=" kun ligiloj al ";
+ if (!extractAll)
+ {
+ result+="la datumstruktura dokumentado de ĉiu membro";
+ }
+ else
+ {
+ result+="la datumtipoj al kiuj ili apartenas:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Datumtipa Indekso"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Datumtipa Dokumentado"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funkcioj/Subrutinoj"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Funkcia/Subrutina Dokumentado"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Datumtipoj"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Modula Listo"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Jen listo de ĉiuj ";
+ if (!extractAll) result+="dokumentitaj ";
+ result+="moduloj kun mallongaj priskriboj:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referenco de la ";
+ if (isTemplate) result+=" ŝablono de la ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="modulo "; break;
+ case ClassDef::Struct: result+="tipo "; break;
+ case ClassDef::Union: result+="kunigo "; break;
+ case ClassDef::Interface: result+="interfaco "; break;
+ case ClassDef::Protocol: result+="protokolo "; break;
+ case ClassDef::Category: result+="kategorio "; break;
+ case ClassDef::Exception: result+="escepto "; break;
+ }
+ result+=(QCString)clName;
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Modula Referenco";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Modulaj Membroj"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Jen listo de ĉiuj ";
+ if (!extractAll) result+="dokumentitaj ";
+ result+="modulaj membroj kun ligiloj al la ";
+ if (extractAll)
+ {
+ result+="modula dokumentado de ĉiu membro:";
+ }
+ else
+ {
+ result+="moduloj al kiuj ili apartenas:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Indekso de Moduloj"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modulo" : "modulo"));
+ if (!singular) result+="j";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"La dokumentado por tiu ĉi ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="modulo"; break;
+ case ClassDef::Struct: result+="tipo"; break;
+ case ClassDef::Union: result+="kunigo"; break;
+ case ClassDef::Interface: result+="interfaco"; break;
+ case ClassDef::Protocol: result+="protokolo"; break;
+ case ClassDef::Category: result+="kategorio"; break;
+ case ClassDef::Exception: result+="escepto"; break;
+ }
+ result+=" kreiĝis el la ";
+ if (single) result+="sekva dosiero:"; else result+="sekvaj dosieroj:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tipo" : "tipo"));
+ if (!singular) result+="j";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprogramo" : "subprogramo"));
+ if (!singular) result+="j";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Tipaj Limigoj";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" Rilato";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Ŝarĝante...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Malloka Nomspaco";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Serĉante...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Nenia kongruo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Diagramo de dependecoj dosierujaj por "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Dosiero en "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Inkluzivas dosieron en "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "lundo","mardo","merkredo",
+ "ĵaŭdo","vendredo","sabato",
+ "dimanĉo" };
+
+ static const char *months[] = { "Januaro", "Februaro", "Marto",
+ "Aprilo", "Majo", "Junio",
+ "Julio", "Aŭgusto", "Septembro",
+ "Oktobro", "Novembro",
+ "Decembro"
+ };
+ QCString sdate;
+ sdate.sprintf("%s, %d-a de %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+
+};
+
+#endif
diff --git a/src/translator_es.h b/src/translator_es.h
new file mode 100644
index 0000000..29ea370
--- /dev/null
+++ b/src/translator_es.h
@@ -0,0 +1,1935 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/*
+ * translator_es.h modified by Lucas Cruz (7-julio-2000)
+ * Some notes:
+ * - It's posible that some sentences haven't got meaning because
+ * some words haven't got translate in spanish.
+ * Updated from 1.3.8 to 1.4.6 by Guillermo Ballester Valor (May-05-2006)
+ * Updated to 1.5.1 by Bartomeu Creus Navarro (22-enero-2007)
+ * Updated to 1.5.5 by Bartomeu Creus Navarro (5-febrero-2008)
+ * Updated to 1.5.8 by Bartomeu Creus Navarro (10-abril-2009)
+ * Updated to 1.6.3 by Bartomeu Creus Navarro (3-marzo-2010)
+ * Updated to 1.6.4 by Bartomeu Creus Navarro (26-mayo-2010) [(16-jun-2010) grabado en UTF-8]
+ */
+
+#ifndef TRANSLATOR_ES_H
+#define TRANSLATOR_ES_H
+
+class TranslatorSpanish : public Translator
+{
+
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "spanish"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[spanish]{babel}";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Funciones relacionadas"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Observar que estas no son funciones miembro.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Descripción detallada"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Documentación de los 'Typedef' miembros de la clase"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Documentación de las enumeraciones miembro de la clase"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Documentación de las funciones miembro"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentación de los campos";
+ }
+ else
+ {
+ return "Documentación de los datos miembro";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Más..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Lista de todos los miembros."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Lista de los miembros"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Lista completa de los miembros de "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", incluyendo todos los heredados:"; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Generado automáticamente por Doxygen";
+ if (s) result+=(QCString)" para "+s;
+ result+=" del código fuente.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "nombre de la enumeración"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "valor enumerado"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "definido en"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Módulos"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Jerarquía de la clase"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estructura de datos";
+ }
+ else
+ {
+ return "Lista de clases";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Lista de archivos"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Campos de datos";
+ }
+ else
+ {
+ return "Miembros de las clases";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globales";
+ }
+ else
+ {
+ return "Miembros de los ficheros";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Páginas relacionadas"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Ejemplos"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Buscar"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Esta lista de herencias esta ordenada "
+ "aproximadamente por orden alfabético:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Lista de todos los archivos ";
+ if (!extractAll) result+="documentados y ";
+ result+="con descripciones breves:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Lista de estructuras con una breve descripción:";
+ }
+ else
+ {
+ return "Lista de las clases, estructuras, "
+ "uniones e interfaces con una breve descripción:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Lista de todos los ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="campos de estructuras y uniones";
+ }
+ else
+ {
+ result+="campos de clases";
+ }
+ if (!extractAll)
+ {
+ result+=" documentados";
+ }
+ result+=" con enlaces a ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="la documentación de la estructura/unión para cada campo:";
+ }
+ else
+ {
+ result+="la documentación de la clase para cada miembro:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="las estructuras/uniones a que pertenecen:";
+ }
+ else
+ {
+ result+="las classes a que pertenecen:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Lista de ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="todas las funciones, variables, 'defines', enumeraciones y 'typedefs'";
+ }
+ else
+ {
+ result+="todos los mienbros de los ficheros";
+ }
+ if (!extractAll) result+=" documentados";
+ result+=" con enlaces ";
+ if (extractAll)
+ result+="a los ficheros a los que corresponden:";
+ else
+ result+="a la documentación:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Lista de todos los ejemplos:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Lista de toda la documentación relacionada:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Lista de todos los módulos:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Documentación"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Indice de módulos"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Indice jerárquico"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Índice de estructura de datos";
+ }
+ else
+ {
+ return "Índice de clases";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Indice de archivos"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Documentación de módulos"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentación de las estructuras de datos";
+ }
+ else
+ {
+ return "Documentación de las clases";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Documentación de archivos"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Documentación de ejemplos"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Documentación de páginas"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Manual de referencia"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "'defines'"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Funciones prototipo"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "'typedefs'"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumeraciones"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funciones"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variables"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Valores de enumeraciones"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Documentación de los 'defines'"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Documentación de las funciones prototipo"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Documentación de los 'typedefs'"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Documentación de las enumeraciones"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Documentación de las funciones"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Documentación de las variables"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estructuras de datos";
+ }
+ else
+ {
+ return "Clases";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generado el "+date;
+ if (projName) result+=(QCString)" para "+projName;
+ result+=(QCString)" por";
+ return result;
+ }
+
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "escrito por";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de herencias de "+clName;
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Sólo para uso interno."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Atención"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versión"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Fecha"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Devuelve"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Ver también"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parámetros"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Excepciones"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Generado por"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Lista de 'namespaces'"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Lista de ";
+ if (!extractAll) result+="toda la documentación de ";
+ result+="los 'namespaces', con una breve descripción:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Amigas"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Documentación de las funciones relacionadas y clases amigas"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referencia de";
+ if (isTemplate) result+=" la plantilla de";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" la Clase "; break;
+ case ClassDef::Struct: result+=" la Estructura "; break;
+ case ClassDef::Union: result+=" la Unión "; break;
+ case ClassDef::Interface: result+=" la Interfaz "; break;
+ case ClassDef::Protocol: result+="l Protocolo "; break;
+ case ClassDef::Category: result+=" la Categoria "; break;
+ case ClassDef::Exception: result+=" la Excepción "; break;
+ }
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result="Referencia del Archivo ";
+ result+=fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result="Referencia del Namespace ";
+ result+=namespaceName;
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Métodos públicos"; }
+
+ virtual QCString trPublicSlots()
+ { return "Slots públicos"; }
+
+ virtual QCString trSignals()
+ { return "Señales"; }
+
+ virtual QCString trStaticPublicMembers()
+ { return "Métodos públicos estáticos"; }
+
+ virtual QCString trProtectedMembers()
+ { return "Métodos protegidos"; }
+
+ virtual QCString trProtectedSlots()
+ { return "Slots protegidos"; }
+
+ virtual QCString trStaticProtectedMembers()
+ { return "Métodos protegidos estáticos"; }
+
+ virtual QCString trPrivateMembers()
+ { return "Métodos privados"; }
+
+ virtual QCString trPrivateSlots()
+ { return "Slots privados"; }
+
+ virtual QCString trStaticPrivateMembers()
+ { return "Métodos privados estáticos"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" y ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Herencias "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Heredado por "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplementado de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementado en "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Miembros del Namespace "; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Lista de ";
+ if (!extractAll) result+="toda la documentación de ";
+ result+="los miembros del namespace con enlace a ";
+ if (extractAll)
+ result+="los namespace de cada miembro:";
+ else
+ result+="la documentación de los namespaces pertenecientes a:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Indice de namespaces"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Documentación de namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"La documentación para est";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="a clase"; break;
+ case ClassDef::Struct: result+="a estructura"; break;
+ case ClassDef::Union: result+="a unión"; break;
+ case ClassDef::Interface: result+="e interfaz"; break;
+ case ClassDef::Protocol: result+="e protocolo"; break;
+ case ClassDef::Category: result+="a categoría"; break;
+ case ClassDef::Exception: result+="a excepción"; break;
+ }
+ result+=" fue generada a partir de";
+ if (single) result+="l siguiente fichero:";
+ else result+=" los siguientes ficheros:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Lista alfabética"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Valores devueltos"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Página principal"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "p."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definición en la línea @0 del archivo @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definición en el archivo @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Obsoleto";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de colaboración para "+clName+":";
+ }
+
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Dependencia gráfica adjunta para "+fName+":";
+ }
+
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Documentación del constructor y destructor";
+ }
+
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Ir al código fuente de este archivo.";
+ }
+
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Ir a la documentación de este archivo.";
+ }
+
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Precondición";
+ }
+
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postcondición";
+ }
+
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariante";
+ }
+
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Valor inicial:";
+ }
+
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "código";
+ }
+
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Representación gráfica de la clase";
+ }
+
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Ir a la representación gráfica de la jerarquía de la clase";
+ }
+
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Ir a la jerarquía textual de la clase";
+ }
+
+ virtual QCString trPageIndex()
+ {
+ return "Página indice";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Nota";
+ }
+
+ virtual QCString trPublicTypes()
+ {
+ return "Tipos públicos";
+ }
+
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Campos de datos";
+ }
+ else
+ {
+ return "Atributos públicos";
+ }
+ }
+
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Atributos públicos estáticos";
+ }
+
+ virtual QCString trProtectedTypes()
+ {
+ return "Tipos protegidos";
+ }
+
+ virtual QCString trProtectedAttribs()
+ {
+ return "Atributos protegidos";
+ }
+
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Atributos protegidos estáticos";
+ }
+
+ virtual QCString trPrivateTypes()
+ {
+ return "Tipos privados";
+ }
+
+ virtual QCString trPrivateAttribs()
+ {
+ return "Atributos privados";
+ }
+
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Atributos privados estáticos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Tareas pendientes";
+ }
+
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Lista de tareas pendientes";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referenciado por";
+ }
+
+ virtual QCString trRemarks()
+ {
+ return "Comentarios";
+ }
+
+ virtual QCString trAttention()
+ {
+ return "Atención";
+ }
+
+ virtual QCString trInclByDepGraph()
+ {
+ return "Gráfico de los archivos que directa o "
+ "indirectamente incluyen a este archivo:";
+ }
+
+ virtual QCString trSince()
+ {
+ return "Desde";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ QCString trLegendTitle()
+ {
+ return "Colores y flechas del Gráfico";
+ }
+
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Esta página explica como interpretar los gráficos que son generados "
+ "por doxygen.<p>\n"
+ "Considere el siguiente ejemplo:\n"
+ "\\code\n"
+ "/*! Clase invisible por truncamiento */\n"
+ "class Invisible { };\n\n"
+ "/*! Clase truncada, relación de herencia escondida */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Clase no documentada con comentarios de doxygen */\n"
+ "class Undocumented { };\n\n"
+ "/*! Clase que es heredera usando herencia publica */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Clase plantilla */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Clase que es heredera usando herencia protegida */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Clase que es heredera usando herencia privada */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Clase que es usada por la clase hija */\n"
+ "class Used { };\n\n"
+ "/*! Super-Clase que hereda de varias otras clases */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Si la etiqueta \\c MAX_DOT_GRAPH_HEIGHT en el archivo de configuración "
+ "tiene valor 240 resultará en el siguiente gráfico:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Las cajas en el gráfico arriba tienen el siguiente significado:\n"
+ "<ul>\n"
+ "<li>Una caja llena negra representa la estructura o clase para la cuál"
+ "se generó el gráfico.\n"
+ "<li>Una caja con borde negro señala una estructura o clase documentada.\n"
+ "<li>Una caja con borde griz señala una estructura o clase no documentada.\n"
+ "<li>una caja con borde rojo señala una estructura o clase documentada"
+ " de la cuál no toda las relaciones de jerarquía/contenido son "
+ "mostradas. El gráfico sera truncado si este no calza dentro de los "
+ "límites especificados."
+ "</ul>\n"
+ "Las flechas tienen el siguiente significado:\n"
+ "<ul>\n"
+ "<li>Una flecha azul oscuro es usada para visualizar una relación herencia publica entre dos clases.\n"
+ "<li>Una flecha verde oscuro es usada para herencia protegida.\n"
+ "<li>Una flecha rojo oscuro es usada para herencia privada.\n"
+ "<li>Una flecha segmentada púrpura se usa si la clase es contenida o "
+ "usada por otra clase. La flecha está etiquetada por la variable "
+ "con que se accede a la clase o estructura apuntada. \n"
+ "<li>Una flecha segmentada amarilla indica la relación entre una instancia template y la clase template de la que se ha instanciado."
+ " La flecha se etiqueta con los parámetros con que se llama al template.\n"
+ "</ul>\n";
+ }
+
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "significado de colores y flechas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Prueba";
+ }
+
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Lista de pruebas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Métodos DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Propiedades";
+ }
+
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Documentación de propiedades";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estructuras de Datos";
+ }
+ else
+ {
+ return "Clases";
+ }
+ }
+
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paquetes "+name;
+ }
+
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Lista de Paquetes ";
+ }
+
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Aquí van los paquetes con una breve descripción (si etá disponible):";
+ }
+
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Paquetes";
+ }
+
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Valor:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Bug";
+ }
+
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Lista de bugs";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Índice";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Clase" : "clase"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Archivo" : "archivo"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grupo" : "grupo"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Página" : "página"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Miembro" : "miembro"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="es";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autor" : "autor"));
+ if (!singular) result+="es";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Hace referencia a";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementa "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementado en "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Tabla de contenidos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Lista de obsoletos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Eventos";
+ }
+
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Documentación de los eventos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Tipos del 'package'";
+ }
+
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funciones del 'package'";
+ }
+
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Funciones estáticas del 'package'";
+ }
+
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atributos del 'package'";
+ }
+
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Atributos Estáticos del 'package'";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Todo";
+ }
+
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Gráfico de llamadas para esta función:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Buscar";
+ }
+
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Resultados de la Búsqueda";
+ }
+
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Disculpe, no se encontraron documentos que coincidan con su búsqueda.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Se encontró <b>1</b> documento que coincide con su búsqueda.";
+ }
+ else
+ {
+ return "Se encontraron <b>$num</b> documentos que coinciden con su búsqueda. "
+ "Se muestran los mejores resultados primero.";
+ }
+ }
+
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Coincidencias:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Fichero Fuente " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Jerarquía de directorios"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Documentación de directorios"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Directorios"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "La jeraquía de este directorio está ordenada"
+ " alfabéticamente, de manera aproximada:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ {
+ QCString result="Referencia del directorio ";
+ result+=dirName;
+ return result;
+ }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Directorio" : "directorio"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Esta es una función miembro sobrecargada que se "
+ "suministra por conveniencia. Difiere de la anterior "
+ "función solamente en los argumentos que acepta.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Gráfico de llamadas a esta función:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Documentación de los valores de la enumeración"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+ // De parte de Bartomeu:
+ // No conozco el Fortran, salvo un par de ejercicios en la universidad
+ // hace muchos años. Por lo tanto, las traducciones son del inglés
+ // al español, no de un usuario de Fortran que puede que haya cosas que no
+ // traduzca o traduzca de otra forma. Que los usuarios de Fortran disculpen
+ // y espero se animen a mejorar mi traducción.
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Documetación de miembros Function/Subroutine"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Lista de tipos de datos"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Etiquetas de datos"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Aquí están los tipos de datos con una breve descripción:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Aquí está una lista de todos ";
+ result+="los miembros de los tipos de datos ";
+ if (!extractAll)
+ {
+ result+="documentados ";
+ }
+ result+="con enlaces a ";
+ if (!extractAll)
+ {
+ result+="la documentación de la estructura de datos para cada miembro";
+ }
+ else
+ {
+ result+="los tipos de dato a que pertenece:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Índice de tipos de datos"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Documentación de tipos de datos"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funciones/Subprogramas"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Documentación de Funciones/Subprogramas"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Tipos de datos"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Lista de módulos"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Lista de todos los módulos ";
+ if (!extractAll) result+="documentados ";
+ result+="con una breve descripción:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referencia de";
+ if (isTemplate) result+=" la plantilla de";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="l módulo"; break;
+ case ClassDef::Struct: result+="l tipo"; break;
+ case ClassDef::Union: result+=" la unión"; break;
+ case ClassDef::Interface: result+=" la interfaz"; break;
+ case ClassDef::Protocol: result+="l protocolo"; break;
+ case ClassDef::Category: result+=" la categoría"; break;
+ case ClassDef::Exception: result+=" la excepción"; break;
+ }
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result="Referencia módulo ";
+ result+=namespaceName;
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Miembros módulo"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Lista de todos los miembros del módulo ";
+ if (!extractAll) result+="documentados ";
+ result+="con enlaces ";
+ if (extractAll)
+ {
+ result+="a la documentación del módulo para cada uno:";
+ }
+ else
+ {
+ result+="al módulo al que pertenecen:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Índice de módulos"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Módulo" : "módulo"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"La documentación para est";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="e módulo"; break;
+ case ClassDef::Struct: result+="e tipo"; break;
+ case ClassDef::Union: result+="a unión"; break;
+ case ClassDef::Interface: result+="e interfaz"; break;
+ case ClassDef::Protocol: result+="e protocolo"; break;
+ case ClassDef::Category: result+="a categoría"; break;
+ case ClassDef::Exception: result+="a excepción"; break;
+ }
+ result+=" fue generada de";
+ if (single) result+="l siguiente fichero:";
+ else result+=" los siguientes ficheros:";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tipo" : "tipo"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprograma" : "subprograma"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Restriciones de tipo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" relación";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Cargando...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Namespace global";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Buscando...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Nada coincide";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Gráfico de dependencias para el directorio "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Fichero en "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Incluye ficheros en "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Lunes","Martes","Miércoles","Jueves",
+ "Viernes","Sábado","Domingo" };
+ static const char *months[] = { "Enero","Febrero","Marzo","Abril",
+ "Mayo","Junio","Julio","Agosto",
+ "Septiembre","Octubre","Noviembre","Diciembre" };
+ QCString sdate;
+ sdate.sprintf("%s, %d de %s de %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+
+};
+
+#endif
diff --git a/src/translator_fa.h b/src/translator_fa.h
new file mode 100644
index 0000000..4e77fc9
--- /dev/null
+++ b/src/translator_fa.h
@@ -0,0 +1,1834 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ *
+ * Description : Doxygen Persian (Farsi) Translator
+ * Author : Ali Nadalizadeh < nadalizadeh at gmail dot com >
+ *
+ * ChangeLog :
+ * Thu 06 Jul 2006 11:54:09 PM IRDT <nadalizadeh at gmail dot com>
+ * >> First version of persian language support has been completed.
+ *
+ * Mon 04 Feb 2008 11:52:09 AM IRDT <nadalizadeh at gmail dot com>
+ * >> Obsolete methods removed. Translated more string(s) to persian. Upgraded to 1_5_4 adapter.
+ *
+ * Fri 04 Jun 2010 04:05:24 PM IRDT <nadalizadeh at gmail dot com>
+ * >> Implement missing new methods since 1.6.0.
+ * >> Add English to Persian digit convertor. (for date/time digits)
+ *
+ * Translation feedbacks are really appreciated.
+ */
+
+#ifndef TRANSLATOR_FA_H
+#define TRANSLATOR_FA_H
+
+#define HtmlRightToLeft QCString("<div dir=\"rtl\">")
+#define HtmlLeftToRight QCString("<div dir=\"rtl\">")
+#define HtmlDivEnd QCString("</div>")
+
+
+class TranslatorPersian : public Translator
+{
+ private:
+ /** Converts english digits of an input string to persian equivalents.
+ */
+ QCString convertDigitsToFarsi(QCString str)
+ {
+ QCString output;
+ const char * PersianDigits[] = { "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹" };
+ for(unsigned i=0; i<str.length(); i++)
+ {
+ if (str[i] >= '0' && str[i] <= '9')
+ output += PersianDigits[ str[i] - '0' ];
+ else
+ output += str[i];
+ }
+
+ return output;
+ }
+
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in Persian using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "persian"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The Persian LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "توابع مربوط"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(لازم به ذکر است که اينها توابع عضو نيستند)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "توضيحات جزئی"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "مستندات تعریف گونه ها"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "های عضو Enumeration مستندات"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "توضيحات توابع عضو"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Field مستندات";
+ }
+ else
+ {
+ return "مستندات متغيير های عضو";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "بيشتر..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "ليست تمام اعضاء ."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "ليست اعضاء"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "اين ليستی کامل از همه اعضای "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return "شامل همه ی اعضای به ارث برده شده می باشد."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="تولید شده توسط نرم افزار دی اکسیژن ";
+ if (s) result+=(QCString)" برای "+s;
+ result+=" از کد برنامه ";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "enum نام"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "enum مقدار"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "تعریف شده در"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Modules"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "سلسله مراتب کلاس ها"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ساختار های داده ";
+ }
+ else
+ {
+ return "ليست کلاس ها ";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "ليست فايل ها"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "فضاهای داده ها";
+ }
+ else
+ {
+ return "اعضاء کلاس ها";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globals";
+ }
+ else
+ {
+ return "اعضاء پرونده";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "صفحات مربوط"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "مثال ها"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "جستجو"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "ليست و سلسله مراتب درختی کلاس ها به صورت مرتب شده :";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="ليست همه ي پرونده های ";
+ if (!extractAll) result+="(مستند شده) ";
+ result+=" :";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ليست ساختارهای داده به همراه توضيحی کوتاه :";
+ }
+ else
+ {
+ return "ليست کلاس ها ، ساختارهای داده و ... به همراه توضيحات مختصر راجع به آنها :";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result=" در ذيل ليست ";
+ if (!extractAll)
+ {
+ result+="آن اعضايي که مستند شده اند ";
+ }
+ else
+ {
+ result+="همه ی اعضاء ";
+ }
+ result+=" به همراه ارتباطشان با ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="ساختارهای داده ";
+ }
+ else
+ {
+ result+="كلاس ها ";
+ }
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="و مستندات ساختار داده برای هر عضو ";
+ }
+ else
+ {
+ result+="و مستندات کلاس برای هر عضو ";
+ }
+ result+="را مشاهده ميکنيد :";
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="ليست همه ی توابع ، متغيير ها، تعاريف و ... ";
+ if (!extractAll) result+="(مستند شده) ";
+
+ result+=" به همراه ارتباط آنها ";
+ result+="با پرونده هايی که به آن مربوط اند :";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "ليست همه ی مثال ها :"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "لیست تمام صفحات و مستندات مربوطه :"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "لیست تمام ماژول ها:"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "مستندات"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "فهرست ماژول ها"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "فهرست سلسله مراتب"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "فهرست ساختار داده ها";
+ }
+ else
+ {
+ return "فهرست کلاس های";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "فهرست پرونده ها"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "مستندات ماژول"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "مستندات ساختار داده ها";
+ }
+ else
+ {
+ return "مستندات کلاس ها";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "مستندات فایل"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "مستندات مثال"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "مستندات صفحه"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "راهنمای مرجع"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "تعاريف"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "پیش تعریف های توابع"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "تعریف گونه ها"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "تعاريف"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "توابع"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "متغيير ها"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "معرف ها"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Define Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "مستندات تعاریف اولیه توابع"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Typedef"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "مستندات تعريف"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "مستندات معرف"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "توضيح تابع"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "توضيح متغير"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ساختارهای داده";
+ }
+ else
+ {
+ return "کلاس ها";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result = HtmlDivEnd + HtmlRightToLeft + QCString("توليد شده در ") +date ;
+ if (projName) result+=(QCString)" برای "+projName;
+ result+=(QCString)" توسط";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "نوشته شده توسط";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)""+clName+" نمودار وراثت برای :";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return ".فقط برای استعمال داخلی"; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "اخطار"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "نسخه"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "تاريخ"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "خروجی"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "See also"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "پارامترها"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "استثناء ها"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "توليد شده توسط"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "ليست فضاهای نام"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="در ذيل ليستی از همه ی فضاهای نام ";
+ if (!extractAll) result+="(مستند سازی شده) ";
+ result+="به همراه توضيح کوتاه آنها مشاهده می کنيد :";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "کلاس های دوست"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "مستندات توابع مربوط و دوست"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result;
+ switch(compType)
+ {
+ case ClassDef::Class: result=" کلاس"; break;
+ case ClassDef::Struct: result=" ساختار داده"; break;
+ case ClassDef::Union: result=" Union"; break;
+ case ClassDef::Interface: result=" Interface"; break;
+ case ClassDef::Protocol: result=" Protocol"; break;
+ case ClassDef::Category: result=" Category"; break;
+ case ClassDef::Exception: result=" استثناء"; break;
+ }
+ if (isTemplate) result+=" قالب";
+ result=QCString(clName) + " مرجع" +result ;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" مرجع پرونده";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" مرجع فضای نام";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "توابع عمومی عضو کلاس"; }
+ virtual QCString trPublicSlots()
+ { return "های عمومی Slot"; }
+ virtual QCString trSignals()
+ { return "سيگنال ها"; }
+ virtual QCString trStaticPublicMembers()
+ { return "توابع ثابت عمومی عضو کلاس"; }
+ virtual QCString trProtectedMembers()
+ { return "توابع خصوصی عضو کلاس"; }
+ virtual QCString trProtectedSlots()
+ { return "های محافظت شده Slot"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "توابع ثابت محافظت شده عضو کلاس"; }
+ virtual QCString trPrivateMembers()
+ { return "توابع خصوصی عضو کلاس"; }
+ virtual QCString trPrivateSlots()
+ { return "های خصوصی Slot"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "توابع خصوصی ثابت عضو کلاس"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" و ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return ".را به ارث می برد "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return ".اين کلاس را به ارث برده است "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplemented from "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "تعریف شده است "+trWriteList(numEntries)+"دوباره در ";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "اعضای فضاهای نام"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="ليست همه اعضای فضای نام ";
+ if (!extractAll) result+="(مستند شده) ";
+ result+=" با ارتباطشان با";
+ result+="فضاهای نامی که به آن مربوط اند را مشاهده ميکنيد :";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "فهرست فضاهای نام"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "توضيحات فضای نام"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "فضاهای نام"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"مستندات اين ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="کلاس"; break;
+ case ClassDef::Struct: result+="ساختار داده"; break;
+ case ClassDef::Union: result+="union"; break;
+ case ClassDef::Interface: result+="interface"; break;
+ case ClassDef::Protocol: result+="protocol"; break;
+ case ClassDef::Category: result+="category"; break;
+ case ClassDef::Exception: result+="exception"; break;
+ }
+ result+=" از روی پرونده ";
+ if (single) result+=""; else result+="های ";
+ result+="زير توليد شده است :";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "ليست الفبايي"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "مقادير بازگشتی"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "صفحه ی اصلی"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "ص."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return ".در خط @0 از پرونده @1 تعريف شده است";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return ".در فايل @0 تعريف شده است";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "منسوخ شده";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Collaboration diagram for "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"نمودار شامل شدن ها برای "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "مستندات توباع آغازین و پایانی";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "کد منبع اين پرونده.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "توضيحات اين پرونده.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "پیش شرط";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "پس شرط";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "مقدار اوليه :";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "کد";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "سلسله مراتب گرافيکی کلاس";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "نمایش نمودار درختی گرافیکی کلاس";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "نمایش نمودار درختی متنی کلاس";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "فهرست صفحات";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "نکته";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "های عمومی Type";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "فضاهای داده ها";
+ }
+ else
+ {
+ return "خواص (متغييرهای) عمومی";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "خواص (متغييرهای) عمومی ثابت";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "های حفاظت شده Type";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "خواص (متغييرهای) حفاظت شده";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "خواص (متغييرهای) حفاظت شده ثابت";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "های خصوصی Type";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "خواص (متغييرهای) خصوصی";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "خواص (متغييرهای) خصوصی ثابت";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "برای انجام";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "ليست کارهاي آينده";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return " استفاده شده توسط ";
+ }
+ virtual QCString trRemarks()
+ {
+ return "ملاحظات";
+ }
+ virtual QCString trAttention()
+ {
+ return "توجه";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "این نمودار فایل هایی را که این فایل را به طور مستقیم یا غیر مستقیم استفاده کرده اند نشان می دهد";
+ }
+ virtual QCString trSince()
+ {
+ return "از";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "راهنمای نمودار";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "This page explains how to interpret the graphs that are generated "
+ "by doxygen.<p>\n"
+ "Consider the following example:\n"
+ "\\code\n"
+ "/*! Invisible class because of truncation */\n"
+ "class Invisible { };\n\n"
+ "/*! Truncated class, inheritance relation is hidden */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Class not documented with doxygen comments */\n"
+ "class Undocumented { };\n\n"
+ "/*! Class that is inherited using public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Class that is inherited using protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Class that is inherited using private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Class that is used by the Inherited class */\n"
+ "class Used { };\n\n"
+ "/*! Super class that inherits a number of other classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
+ "is set to 240 this will result in the following graph:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "The boxes in the above graph have the following meaning:\n"
+ "<ul>\n"
+ "<li>%A filled black box represents the struct or class for which the "
+ "graph is generated.\n"
+ "<li>%A box with a black border denotes a documented struct or class.\n"
+ "<li>%A box with a grey border denotes an undocumented struct or class.\n"
+ "<li>%A box with a red border denotes a documented struct or class for"
+ "which not all inheritance/containment relations are shown. %A graph is "
+ "truncated if it does not fit within the specified boundaries.\n"
+ "</ul>\n"
+ "The arrows have the following meaning:\n"
+ "<ul>\n"
+ "<li>%A dark blue arrow is used to visualize a public inheritance "
+ "relation between two classes.\n"
+ "<li>%A dark green arrow is used for protected inheritance.\n"
+ "<li>%A dark red arrow is used for private inheritance.\n"
+ "<li>%A purple dashed arrow is used if a class is contained or used "
+ "by another class. The arrow is labeled with the variable(s) "
+ "through which the pointed class or struct is accessible.\n"
+ "<li>%A yellow dashed arrow denotes a relation between a template instance and "
+ "the template class it was instantiated from. The arrow is labeled with "
+ "the template parameters of the instance.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "راهنما";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "تست";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Test List";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP توابع عضو";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "خاصیت ها";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "مستندات خاصیت";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ساختار های داده";
+ }
+ else
+ {
+ return "كلاس ها";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Package "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "لیست بسته ها";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "لیست بسته ها به همراه توضیح مختر در صورت وجود :";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "بسته ها";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "مقدار:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "اشکال";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "ليست اشکالات";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1256";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "فهرست";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "کلاس" : "کلاس"));
+ if (!singular) result+="ها";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool /*first_capital*/, bool singular)
+ {
+ QCString result("پرونده");
+ if (!singular) result=result+" ها";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "فضای نام " : "فضای نام "));
+ if (!singular) result+="ها";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Group" : "group"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "صفحه" : "صفحه"));
+ if (!singular) result+=" ها ";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "عضو" : "عضو"));
+ if (!singular) result+="ها";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Author" : "author"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "را استفاده ميکند ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "را تکميل می کند "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return ".تکميل شده است "+trWriteList(numEntries)+" در";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "فهرست";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "لیست آیتم های از رده خارج";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "رویداد ها";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "مستندات رویداد";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "انواع بسته ها";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "توابع بسته ها";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Static Package Functions";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "خواص بسته ها";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Static Package Attributes";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "همه";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "نمودار صدا زدن برای این تابع :";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "جستجو برای";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "نتايج جستجو";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "متاسفانه هیچ صفحه ای برای جستجو ی شما یافت نشد.";
+ }
+ else if (numDocuments==1)
+ {
+ return "یک سند برای این مورد یافت شد.";
+ }
+ else
+ {
+ return "Found <b>$num</b> documents matching your query. "
+ "Showing best matches first.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Matches:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " کد و پرونده منبع";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "ساختار و سلسله مراتب شاخه ها"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "مستندات دايرکتوری"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "شاخه ها"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "در ذيل ساختار شاخه ها و دايرکتوری ها را نسبتا مرتب شده می بينيد :";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" مرجع شاخه ی"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool /*first_capital*/, bool singular)
+ {
+ QCString result("شاخه");
+ if (singular) result+=" ها "+result;
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "This is an overloaded member function, "
+ "provided for convenience. It differs from the above "
+ "function only in what argument(s) it accepts.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "نمودار صدا زننده های این تابع:";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "مستندات توابع عضو"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "لیست ساختار های داده"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "فیلدهای اطلاعات"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "ساختارهای داده به همراه توضیح کوتاه :"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool)
+ {
+ return "توضیحات اعضا ساختارها به همراه مستندات ساختار داده ی مربوطه";
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Data Type Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Data Type Documentation"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "توابع و زیربرنامه ها"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "مستندات توابع و زیربرنامه ها"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "ساختار های داده"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "لیست ماژول ها"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool)
+ {
+ QCString result="لیست ماژول ها به همراه توضیحات کوتاه";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Module"; break;
+ case ClassDef::Struct: result+=" Type"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Reference";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Module Reference";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "اعضاء ماژول"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool)
+ {
+ QCString result="لیست اعضاء ماژول ها به همراه مستندات ماژول مربوطه";
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Modules Index"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool, bool singular)
+ {
+ QCString result("ماژول");
+ if (!singular) result+=" ها";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"The documentation for this ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="module"; break;
+ case ClassDef::Struct: result+="type"; break;
+ case ClassDef::Union: result+="union"; break;
+ case ClassDef::Interface: result+="interface"; break;
+ case ClassDef::Protocol: result+="protocol"; break;
+ case ClassDef::Category: result+="category"; break;
+ case ClassDef::Exception: result+="exception"; break;
+ }
+ result+=" was generated from the following file";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Type" : "type"));
+ if (!singular) result+="s";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool, bool singular)
+ {
+ QCString result("زیربرنامه");
+ if (!singular) result+=" ها ";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Type Constraints";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name) + " Relation";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "در حال بارگذاری...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "فضای نام جهانی";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "در حال جستجو...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "یافت نشد";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"نمودار وابستگی دایرکتوری ها برای "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"پرونده ای در "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Includes file in "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه","یکشنبه" };
+ static const char *months[] = { "ژانویه","فوریه","مارس","آوریل","می","جون","جولای","آگوست","سپتامبر","اکتبر","نوامبر","دسامبر" };
+ QCString sdate;
+ sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return convertDigitsToFarsi(sdate);
+ }
+
+};
+
+#endif
diff --git a/src/translator_fi.h b/src/translator_fi.h
new file mode 100644
index 0000000..d35d698
--- /dev/null
+++ b/src/translator_fi.h
@@ -0,0 +1,1903 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*
+==================================================================================
+Suomenkielinen käännös:
+Olli Korhonen ( -> 0.49-990425) <olli.korhonen@ccc.fi>
+Antti Laine (0.49-990425 -> ) <antti.a.laine@tut.fi>
+==================================================================================
+1999/10/19
+* Alustava käännös valmis.
+
+* Huom: Kaikille termeille on keksitty käännösvastine, mikä ei ehkä ole
+ kaikissa tapauksissa hyvä ratkaisu, ja parempikin termi voi
+ olla vakiintuneessa käytössä.
+
+2008-04-08
+* Käännetty versioon 1.5.5 asti.
+2008-08-26
+* MAX_DOT_GRAPH_HEIGHT poistettu, versio 1.5.6
+* Tekstit muutettu UTF-8:ksi
+2009-01-17
+* versio 1.5.8
+* Kantaluokka vaihdettu TranslatorEnglishistä Translatoriksi
+* Enumeraatio -> luettelotyyppi
+* Paranneltu kieltä ja poistettu kirjoitusvirheitä
+
+* Tehtävää:
+ - Termien kokoaminen listaksi ja suomennosten järkevyyden tarkastelu. (lista on jo melko kattava)
+ Author = Tekijä
+ Class = Luokka
+ Compound = Kooste
+ Data = Data
+ Documentation = Dokumentaatio
+ Defines = Määrittelyt
+ Description = Selite
+ Detailed = Yksityiskohtainen
+ Diagram = Kaavio
+ Enum = Luettelotyyppi
+ Exceptions = Poikkeukset
+ File = Tiedosto
+ Friends = Ystävät
+ Functions = Funktiot
+ Hierarchical = Hierarkinen
+ Index = Indeksi
+ Inherits = Perii
+ Member = Jäsen
+ Module = Moduli
+ Namespace = Nimiavaruus
+ Parameters = Parametrit
+ Private = Yksityinen
+ Protected = Suojattu
+ Prototypes = Prototyypit
+ Public = Julkinen
+ Reference Manual= Käsikirja
+ Reimplemented = Uudelleen toteutettu
+ Related = Liittyvä
+ Signals = Signaalit
+ Slots = Vastineet
+ Static = Staattinen
+ Struct = Tietue
+ Typedef = Tyyppimäärittely
+ Union = Yhdiste
+ Variables = Muuttujat
+ - Taivutusmuotojen virheettömyyden tarkastelu prepositioiden korvauskohdissa.
+ - Sanasta sanaan käännöskohtien mielekkyyden tarkastelu valmiista dokumentista.
+ - umlaut vastineiden käyttö scandien kohdalla.
+
+positiiviset kommentit otetaan ilolla vastaan.
+===================================================================================
+*/
+
+#ifndef TRANSLATOR_FI_H
+#define TRANSLATOR_FI_H
+
+class TranslatorFinnish : public TranslatorAdapter_1_6_0
+{
+ public:
+ /*! This method is used to generate a warning message to signal
+ * the user that the translation of his/her language of choice
+ * needs updating.
+ */
+ /*virtual QCString updateNeededMessage()
+ {
+ return "Warning: The Finnish translator is really obsolete.\n"
+ "It was not updated since version 1.0.0. As a result,\n"
+ "some sentences may appear in English.\n\n";
+ }*/
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "finnish"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[finnish]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Liittyvät funktiot"; } // "Related Functions";
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Huomaa, että nämä eivät ole jäsenfunktioita.)"; } // "(Note that these are not member functions.)"
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Yksityiskohtainen selite"; } // "Detailed Description"
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ // header that is put before the list of typedefs.
+ { return "Jäsentyyppimäärittelyiden dokumentaatio"; } // "Member Typedef Documentation"
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Jäsenluettelotyyppien dokumentaatio"; } // "Member Enumeration Documentation"
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Jäsenfunktioiden dokumentaatio"; } // "Member Function Documentation"
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Kenttien dokumentaatio"; // "Field Documentation";
+ }
+ else
+ {
+ return "Jäsendatan dokumentaatio"; // "Member Data Documentation"
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Lisää..."; } // "More..."
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Lista kaikista jäsenistä."; } // "List of all members."
+ virtual QCString trMemberList()
+
+ /*! used as the title of the "list of all members" page of a class */
+ { return "Jäsenlista"; } // "Member List"
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Tämä on lista kaikista jäsenistä luokassa "; } // "This is the complete list of members for "
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", sisältäen kaikki perityt jäsenet."; } // ", including all inherited members."
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result=(QCString)"Automaattisesti luotu Doxygenilla "
+ "lähdekoodista projektille "+s; // "Generated automatically by Doxygen" ... "for" ... "from the sourcecode"
+ //if (s) result+=(QCString)" voor "+s;
+ // tässä on ongelma, kuinka taivuttaa parametria, esim. "Jcad"+"in"; "IFC2VRML konversio"+"n"
+ // mutta ratkaistaan ongelma kätevästi kaksoispisteellä -> "Jcad:n" / "IFC2VRML konversio:n"
+ // lopputulos on vähemmän kökkö ja täysin luettava, mutta ei kuitenkaan täydellinen.
+ //
+ // kierretään ongelma taivuttamalla sanaa projekti :)
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "luettelotyypin nimi"; } // "enum name"
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "luettelotyypin arvo"; } // "enum value"
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "määritelty"; } // "defined in"
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Moduulit"; } // "Modules"
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Luokkahierarkia"; } // "Class Hierarchy"
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Tietueet"; // "Data Structures"
+ }
+ else
+ {
+ return "Luokkalista"; // "Class List"
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Tiedostolista"; } // "File List"
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Tietueen kentät"; // "Data Fields"
+ }
+ else
+ {
+ return "Luokan jäsenet"; // "Class Members"
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globaalit"; // "Globals"
+ }
+ else
+ {
+ return "Tiedoston jäsenet"; // "File Members"
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Liittyvät sivut"; } // "Related Pages"
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Esimerkit"; } // "Examples"
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Etsi"; } // "Search"
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Tämä periytymislista on päätasoltaan aakkostettu " // "This inheritance list is sorted roughly, "
+ "mutta alijäsenet on aakkostettu itsenäisesti:"; // "but not completely, alphabetically:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Tässä on lista kaikista ";
+ if (!extractAll) result+="dokumentoiduista "; // "documented "
+ result+="tiedostoista lyhyen selitteen kanssa:"; // "files with brief descriptions:"
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Tässä ovat tietueet lyhyen selitteen kanssa:"; // "Here are the data structures with brief descriptions:"
+ }
+ else
+ {
+ return "Tässä ovat luokat, tietueet ja " // "Here are the classes, structs and "
+ "yhdisteet lyhyen selitteen kanssa:"; // "unions with brief descriptions:"
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Tässä on lista kaikista "; // "Here is a list of all "
+ if (!extractAll)
+ {
+ result+="dokumentoiduista "; // "documented "
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="tietuiden ja yhdisteiden kentistä"; // "struct and union fields"
+ }
+ else
+ {
+ result+="luokkien jäsenistä"; // "class members"
+ }
+ result+=" linkitettyinä "; // " with links to "
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="jokaisen kentän tietueen/yhdisteen dokumentaatioon:"; // "the struct/union documentation for each field:"
+ }
+ else
+ {
+ result+="jokaisen jäsenen luokkadokumentaatioon:"; // "the class documentation for each member:"
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+= "tietueisiin/yhdisteisiin, joihin ne kuuluvat:"; // "the structures/unions they belong to:"
+ }
+ else
+ {
+ result+="luokkiin, joihin ne kuuluvat"; //"the classes they belong to:"
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Tässä on lista kaikista "; // "Here is a list of all "
+ if (!extractAll) result+="dokumentoiduista "; // "documented "
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funktioista, muuttujista, määrittelyistä, luettelotyypeistä ja tyyppimäärittelyistä"; // "functions, variables, defines, enums, and typedefs"
+ }
+ else
+ {
+ result+="tiedoston jäsenistä"; // "file members"
+ }
+ result+=" linkitettyinä "; // " with links to "
+ if (extractAll)
+ result+="tiedostoihin, joihin ne kuuluvat:"; // "the files they belong to:"
+ else
+ result+="dokumentaatioon:"; // "the documentation:"
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Tässä on lista kaikista esimerkeistä:"; } // "Here is a list of all examples:"
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Tässä on lista kaikista liittyvistä dokumentaatiosivuista:"; } // "Here is a list of all related documentation pages:"
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Tässä on lista kaikista moduleista:"; } // "Here is a list of all modules:"
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentaatio"; } // "Documentation"
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Moduuliluettelo"; } // "Module Index"
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarkinen luettelo"; } // "Hierarchical Index"
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Tietueluettelo"; // "Data Structure Index"
+ }
+ else
+ {
+ return "Luokkaluettelo"; // "Class Index"
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Tiedostoluettelo"; } // "File Index"
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Moduulien dokumentaatio"; } // "Module Documentation"
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Tietueiden dokumentaatio"; // "Data Structure Documentation"
+ }
+ else
+ {
+ return "Luokkien dokumentaatio"; // "Class Documentation"
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Tiedostojen dokumentaatio"; } // "File Documentation"
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Esimerkkien dokumentaatio"; } // "Example Documentation"
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Sivujen dokumentaatio"; } // "Page Documentation"
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Käsikirja"; } // "Reference Manual"
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Määrittelyt"; } // "Defines"
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Funktioiden prototyypit"; } // "Function Prototypes"
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Tyyppimäärittelyt"; } // "Typedefs"
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Luettelotyypit"; } // "Enumerations"
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funktiot"; } // "Functions"
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Muuttujat"; } // "Variables"
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Luettelotyyppien arvot"; } // "Enumerator"
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Määritysten dokumentointi"; } // "Define Documentation"
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Funktioprototyyppien dokumentaatio"; } // "Function Prototype Documentation"
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Tyyppimääritysten dokumentaatio"; } // "Typedef Documentation"
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Luettelotyyppien dokumentaatio"; } // "Enumeration Type Documentation"
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Funktioiden dokumentaatio"; } // "Function Documentation"
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Muuttujien dokumentaatio"; } // "Variable Documentation"
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Tietueet"; // "Data Structures"
+ }
+ else
+ {
+ return "Luokat"; // "Classes"
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ // funktio on hiukan vaikea kääntää prepositioihin sidotun rakenteen vuoksi.
+ // Muutetaan siis lauserakennetta suomalaisemmaksi
+ // Generated on $date for $project by:
+ // -> Generated for $project on $date by:
+ QCString result=(QCString)"Generoinut ";
+ if (projName) result+=(QCString)"projektille "+projName+" ";
+ result+=(QCString)date+" ";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "kirjoittanut"; // "written by"
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return "Luokan "+(QCString)clName+" luokkakaavio"; // "Inheritance diagram for "
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Vain sisäiseen käyttöön."; } // "For internal use only."
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Varoitus"; } // "Warning"
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versio"; } // "Version"
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Päiväys"; } // "Date"
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Palauttaa"; } // "Returns"
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Katso myös"; } // "See also"
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametrit"; } // "Parameters"
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Poikkeukset"; } // "Exceptions"
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Generoinut"; } // "Generated by"
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Nimiavaruus Lista"; } // "Namespace List"
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Tässä on lista kaikista "; // "Here is a list of all "
+ if (!extractAll) result+="dokumentoiduista "; // "documented "
+ result+="nimiavaruuksista lyhyen selitteen kanssa:"; // "namespaces with brief descriptions:"
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Ystävät"; } // "Friends"
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Ystävät ja niihin liittyvien funktioiden dokumentaatio"; } // "Friends And Related Function Documentation"
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" luokka"; break; // " Class"
+ case ClassDef::Struct: result+=" tietue"; break; // " Struct"
+ case ClassDef::Union: result+=" yhdiste"; break; // " Union"
+ case ClassDef::Interface: result+=" rajapinta"; break; // " Interface"
+ case ClassDef::Protocol: result+=" protokolla"; break; // " Protocol"
+ case ClassDef::Category: result+=" kategoria"; break; // " Category"
+ case ClassDef::Exception: result+=" poikkeus"; break; // " Exception"
+ }
+ if (isTemplate) result+="malli"; // " Template"
+ result+="referenssi"; // " Reference"
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" tiedostoreferenssi"; // " File Reference"
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" nimiavaruusreferenssi"; // " Namespace Reference"
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Julkiset jäsenfunktiot"; } // "Public Member Functions"
+ virtual QCString trPublicSlots()
+ { return "Julkiset vastineet"; } // "Public Slots"
+ virtual QCString trSignals()
+ { return "Signaalit"; } // "Signals"
+ virtual QCString trStaticPublicMembers()
+ { return "Staattiset julkiset jäsenfunktiot"; } // "Static Public Member Functions"
+ virtual QCString trProtectedMembers()
+ { return "Suojatut jäsenfunktiot"; } // "Protected Member Functions"
+ virtual QCString trProtectedSlots()
+ { return "Suojatut vastineet"; } // "Protected Slots"
+ virtual QCString trStaticProtectedMembers()
+ { return "Staattiset suojatut jäsenfunktiot"; } // "Static Protected Member Functions"
+ virtual QCString trPrivateMembers()
+ { return "Yksityiset jäsenfunktiot"; } // "Private Member Functions"
+ virtual QCString trPrivateSlots()
+ { return "Yksityiset vastineet"; } // "Private Slots"
+ virtual QCString trStaticPrivateMembers()
+ { return "Staattiset yksityiset jäsenfunktiot"; } // "Static Private Member Functions"
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" ja "; // ", and "
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return (QCString)"Periytyy "+(numEntries > 1 ? "luokista " : "luokasta ")+trWriteList(numEntries)+"."; // "Inherits "
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return (QCString)"Periytetään "+(numEntries > 1 ? "luokissa " : "luokassa ")+trWriteList(numEntries)+"."; // "Inherited by "
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return (QCString)"Uudelleentoteuttaa "+(numEntries > 1 ? "luokat " : "luokan ")+trWriteList(numEntries)+"."; // "Reimplemented from "
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return (QCString)"Uudelleentoteutetaan "+(numEntries > 1 ? "luokissa " : "luokassa ")+trWriteList(numEntries)+"."; // "Reimplemented in "
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Nimiavaruuden jäsenet"; } // "Namespace Members"
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Tässä on lista kaikista "; // "Here is a list of all "
+ if (!extractAll) result+="dokumentoiduista "; // "documented "
+ result+="nimiavaruuden jäsenistä linkitettynä "; // "namespace members with links to "
+ if (extractAll)
+ result+="nimiavaruuden dokumentaatioon johon ne kuuluvat:"; // "the namespace documentation for each member:";
+ else
+ result+="nimiavaruuksiin joihin ne kuuluvat:"; // "the namespaces they belong to:"
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Nimiavaruuksien luettelo"; } // "Namespace Index"
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Nimiavaruuden dokumentaatio"; } // "Namespace Documentation"
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Nimiavaruudet"; } // "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentaatio tälle "; // "The documentation for this "
+ switch(compType)
+ {
+ case ClassDef::Class: result+="luokalle"; break; // "class"
+ case ClassDef::Struct: result+="tietueelle"; break; // "struct"
+ case ClassDef::Union: result+="yhdisteelle"; break; // "union"
+ case ClassDef::Interface: result+="rajapinnalle"; break; // "interface"
+ case ClassDef::Protocol: result+="protokollalle"; break; // "protocol"
+ case ClassDef::Category: result+="kategorialle"; break; // "category"
+ case ClassDef::Exception: result+="poikkeukselle"; break; // "exception"
+ }
+ if (single) result+=" luotiin seuraavasta tiedostosta:"; // " was generated from the following file"
+ else result+=" luotiin seuraavista tiedostoista:"; // ":" or "s:"
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Aakkosellinen lista"; } // "Alphabetical List"
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Paluuarvot"; } // "Return values"
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Pääsivu"; } // "Main Page"
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "s."; } // "p."
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Määrittely tiedoston @1 rivillä @0."; // "Definition at line @0 of file @1."
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Määrittely tiedostossa @0."; // "Definition in file @0."
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Vanhentunut"; // "Deprecated"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Yhteistyökaavio luokalle "+clName+":"; // "Collaboration diagram for "+clName+":"
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Sisällytysriippuvuuskaavio tiedostolle "+fName+":"; // "Include dependency graph for "+fName+":"
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Rakentajien & purkajien dokumentaatio"; // "Constructor & Destructor Documentation";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Siirry tämän tiedoston lähdekoodiin."; // "Go to the source code of this file."
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Siirry tämän tiedoston dokumentaatioon."; // "Go to the documentation of this file."
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Esiehto"; //"Precondition"
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Jälkiehto"; // "Postcondition"
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariantti"; // vai "Pysyväisväittämä"? "Invariant"
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Alkuarvo:"; // "Initial value:"
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "koodi"; // "code"
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Graafinen luokkahierarkia"; // "Graphical Class Hierarchy"
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Siirry graafiseen luokkahierarkiaan"; // "Go to the graphical class hierarchy"
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Siirry tekstimuotoiseen luokkahierarkiaan"; // "Go to the textual class hierarchy"
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Sivuhakemisto"; // "Page Index"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ // FIXME: Missähän merkityksessä tätä käytetään?
+ return "Huomautus"; // "Note"
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Julkiset tyypit"; // "Public Types"
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Tietueen kentät"; // "Data Fields"
+ }
+ else
+ {
+ return "Julkiset attribuutit"; // "Public Attributes"
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Staattiset julkiset attribuutit"; // "Static Public Attributes"
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Suojellut tyypit"; // "Protected Types"
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Suojellut attribuutit"; // "Protected Attributes"
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Staattiset suojellut attribuutit"; // "Static Protected Attributes"
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Yksityiset tyypit"; // "Private Types"
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Yksityiset attribuutit"; // "Private Attributes"
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Staattiset yksityiset attribuutit"; // "Static Private Attributes"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Vielä tehtävänä"; // "Todo"
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Tehtävälista"; // "Todo List"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Viitattu"; // "Referenced by"
+ }
+ virtual QCString trRemarks()
+ {
+ return "Huomioita"; // "Remarks"
+ }
+ virtual QCString trAttention()
+ {
+ return "Huomio"; // "Attention"
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Tämä kaavio näyttää, mitkä tiedostot suorasti "
+ "tai epäsuorasti sisällyttävät tämän tiedoston";
+ // "This graph shows which files directly or "
+ // "indirectly include this file:"
+ }
+ virtual QCString trSince()
+ {
+ // FIXME: Missä merkityksessä tätä käytetään?
+ return "Lähtien"; // "Since"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Kaavion selite"; // "Graph Legend"
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Tämä sivu selittää, kuinka doxygenin luomia kaavioita tulkitaan.<p>\n"
+ // "This page explains how to interpret the graphs that are generated "
+ // "by doxygen.<p>\n"
+ "Ajattele seuraavaa esimerkkiä:\n"
+ // "Consider the following example:\n"
+ "\\code\n"
+ "/*! Näkymätön luokka katkaisun vuoksi */\n"
+ // "/*! Invisible class because of truncation */\n"
+ "class Nakymaton { };\n\n"
+ // "class Invisible { };\n\n"
+ "/*! Katkaistu luokka, periytymissuhde on piilotettu */\n"
+ // "/*! Truncated class, inheritance relation is hidden */\n"
+ "class Katkaistu : public Nakymaton { };\n\n"
+ // "class Truncated : public Invisible { };\n\n"
+ "/* Luokkaa ei ole dokumentoitu doxygen-kommenteilla */\n"
+ // "/* Class not documented with doxygen comments */\n"
+ "class Dokumentoimaton { };\n\n"
+ // "class Undocumented { };\n\n"
+ "/*! Julkista periyttämistä käyttäen periytetty luokka */\n"
+ // "/*! Class that is inherited using public inheritance */\n"
+ "class JulkinenKanta : public Katkaistu { };\n\n"
+ // "class PublicBase : public Truncated { };\n\n"
+ "/*! Malliluokka */\n"
+ // "/*! A template class */\n"
+ "template<class T> class Malli { };\n\n"
+ // "template<class T> class Templ { };\n\n"
+ "/*! Suojeltua periytymistä käyttäen periytetty luokka */\n"
+ // "/*! Class that is inherited using protected inheritance */\n"
+ "class SuojeltuKanta { };\n\n"
+ // "class ProtectedBase { };\n\n"
+ "/*! Yksityistä periytymistä käyttäen periytetty luokka */\n"
+ // "/*! Class that is inherited using private inheritance */\n"
+ "class YksityisKanta { };\n\n"
+ // "class PrivateBase { };\n\n"
+ "/*! Luokka jota periytetty luokka käyttää */\n"
+ // "/*! Class that is used by the Inherited class */\n"
+ "class Kaytetty { };\n\n"
+ // "class Used { };\n\n"
+ "/*! Kantaluokka joka periytyy useasta muusta luokasta */\n"
+ // "/*! Super class that inherits a number of other classes */\n"
+ "class Periytetty : public JulkinenKanta,\n"
+ " : protected SuojeltuKanta,\n"
+ " : private YksityisKanta,\n"
+ " : public Dokumentoimaton,\n"
+ " : public Malli<int>\n"
+ "{\n"
+ " private:\n"
+ " Kaytetty *m_kaytettyLuokka;\n"
+ "}\n";
+ // "class Inherited : public PublicBase,\n"
+ // " protected ProtectedBase,\n"
+ // " private PrivateBase,\n"
+ // " public Undocumented,\n"
+ // " public Templ<int>\n"
+ // "{\n"
+ // " private:\n"
+ // " Used *m_usedClass;\n"
+ // "};\n"
+ "\\endcode\n"
+ "Tuloksena on seuraavanlainen kaavio:"
+ //"This will result in the following graph:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Ylläolevassa kaaviossa laatikoilla on seuraavat merkitykset\n:"
+ // "The boxes in the above graph have the following meaning:\n"
+ "<ul>\n"
+ "<li>Täytetty harmaa laatikko esittää tietuetta tai luokkaa, jolle "
+ // "<li>%A filled gray box represents the struct or class for which the "
+ "kaavio on luotu.\n"
+ // "graph is generated.\n"
+ "<li>Mustareunainen laatikko merkitsee dokumentoitua tietuetta tai luokkaa.\n"
+ // "<li>%A box with a black border denotes a documented struct or class.\n"
+ "<li>Harmaareunainen laatikko merkitsee dokumentoimatonta tietuetta tai luokkaa.\n"
+ // "<li>%A box with a grey border denotes an undocumented struct or class.\n"
+ "<li>Punareunainen laatikko merkistee dokumentoitua luokkaa tai structia "
+ // "<li>%A box with a red border denotes a documented struct or class for"
+ "jolle ei näytetä kaikkia periytymis-/sisällyssuhteita. Kaavio "
+ // "which not all inheritance/containment relations are shown. %A graph is "
+ "katkaistaan, jos se ei mahdu määriteltyjen rajojen sisään.\n"
+ // "truncated if it does not fit within the specified boundaries.\n"
+ "</ul>\n"
+ "Nuolilla on seuraavat merkitykset:\n"
+ // "The arrows have the following meaning:\n"
+ "<ul>\n"
+ "<li>Tummansinistä nuolta käytetään osoittamaan julkista periytymis"
+ // "<li>%A dark blue arrow is used to visualize a public inheritance "
+ "suhdetta kahden luokan välillä.\n"
+ // "relation between two classes.\n"
+ "<li>Tummanvihreää nuolta käytetään suojellussa periytymisessä.\n"
+ // "<li>%A dark green arrow is used for protected inheritance.\n"
+ "<li>Tummanpunaista nuolta käytetään yksityisessä periytymisessä.\n"
+ // "<li>%A dark red arrow is used for private inheritance.\n"
+ "<li>Purppuranväristä katkoviivaa käytetään, jos luokka sisältyy tai "
+ // "<li>%A purple dashed arrow is used if a class is contained or used "
+ "on toisen luokan käyttämä. Nuoli nimetään sillä muuttujalla/muuttujilla "
+ // "by another class. The arrow is labeled with the variable(s) "
+ "jonka läpi osoitettua luokkaa tai tietuetta käytetään.\n"
+ // "through which the pointed class or struct is accessible.\n"
+ "<li>Keltainen katkoviivalla piirretty nuoli merkitsee suhdetta mallin esiintymän ja "
+ // "<li>%A yellow dashed arrow denotes a relation between a template instance and "
+ "malliluokan välillä. Nuoli nimetään "
+ // "the template class it was instantiated from. The arrow is labeled with "
+ "mallin esiintymän malliparametrilla.\n"
+ // "the template parameters of the instance.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "selite"; // "legend"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Testi"; // "Test"
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Testilista"; // "Test List"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP-jäsenfunktiot"; // "DCOP Member Functions"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Ominaisuudet"; // "Properties"
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Ominaisuuksien dokumentaatio"; // "Property Documentation"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Tietueet"; // "Data Structures"
+ }
+ else
+ {
+ return "Luokat"; // "Classes"
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paketti "+name; // "Package "
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Pakettilista"; // "Package List"
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Tässä ovat paketit lyhyiden selitysten kanssa (jos saatavilla):"; // "Here are the packages with brief descriptions (if available):"
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Paketit"; // "Packages"
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Arvo:"; // "Value:"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Bugi"; // "Bug"
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Bugilista"; // "Bug List"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Hakemisto"; // "Index"
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Luokka" : "luokka")); // "Class" / "class"
+ if (!singular) result=(first_capital ? "Luokat" : "luokat"); // "+es" -> "Classes" / "classes"
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tiedosto" : "tiedosto")); // "File" / "file"
+ if (!singular) result+="t"; // "+s" -> "Files" / "files"
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Nimiavaruus" : "nimiavaruus")); // "Namespace" / "namespace"
+ if (!singular) result=(first_capital ? "Nimiavaruudet" : "nimiavaruudet"); // "+s"
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ryhmä" : "ryhmä")); // "Group" / "group"
+ if (!singular) result+="t"; // "+s"
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Sivu" : "sivu")); // "Page" / "page"
+ if (!singular) result+="t"; // "+s"
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Jäsen" : "jäsen")); // "Member" / "member"
+ if (!singular) result+="et"; // "+s"
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Globaali" : "globaali")); // "Global" / "global"
+ if (!singular) result+="t"; // "+s"
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tekijä" : "tekijä")); // "Author" / "author"
+ if (!singular) result+="t"; // "+s"
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Viittaukset"; // "References"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Toteuttaa luokan "+trWriteList(numEntries)+"."; // "Implements "
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Toteutettu luokassa "+trWriteList(numEntries)+"."; // "Implemented in "
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Sisällysluettelo"; // "Table of Contents"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Vanhentuneiden lista"; // "Deprecated List"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Tapahtumat"; // "Events"
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Tapahtumien dokumentaatio"; // "Event Documentation"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Paketin tyypit"; // "Package Types"
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Paketin funktiot"; // "Package Functions"
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Paketin staattiset funktiot"; // "Static Package Functions"
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Paketin attribuutit"; // "Package Attributes"
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Paketin staattiset attribuutit"; // "Static Package Attributes"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Kaikki"; // "All"
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Tässä on kutsukaavio tälle funktiolle:"; // "Here is the call graph for this function:"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Etsi"; // "Search for"
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Hakutulokset"; // "Search Results"
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Valitettavasti yksikään dokumentti ei vastannut hakuasi."; // "Sorry, no documents matching your query."
+ }
+ else if (numDocuments==1)
+ {
+ return "Löytyi <b>1</b> dokumentti, joka vastasi hakuasi."; // "Found <b>1</b> document matching your query.";
+ }
+ else
+ {
+ return "Löytyi <b>$num</b> dokumenttia, jotka vastasivat hakuasi. " // "Found <b>$num</b> documents matching your query. "
+ "Parhaat tulokset näytetään ensin."; // "Showing best matches first."
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Osumat:"; // "Matches:"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " lähdekooditiedosto"; // " Source File"
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Hakemistohierarkia"; } // "Directory Hierarchy"
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Hakemistojen dokumentaatio"; } // "Directory Documentation"
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Hakemistot"; } // "Directories"
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Tämä hakemistohierarkia on järjestetty aakkosellisesti tasoittain:";
+ //This directory hierarchy is sorted roughly, "
+ // "but not completely, alphabetically:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" hakemistoreferenssi"; return result; }
+ // " Directory Reference"
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Hakemisto" : "hakemisto")); // "Director" / "director"
+ if (singular) result+=""; else result+="t"; // "+y" / "+ies"
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Tämä on ylikuormitettu jäsenfunktio, ja se tarjotaan "
+ "käytön helpottamiseksi. Se eroaa ylläolevasta "
+ "funktiosta ainoastaan hyväksymiltään parametreilta.";
+ // "This is an overloaded member function, "
+ // "provided for convenience. It differs from the above "
+ // "function only in what argument(s) it accepts."
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Tässä on kutsukaavio tälle funktiolle:"; // "Here is the caller graph for this function:"
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Luettelotyypin dokumentaatio"; } // "Enumerator Documentation"
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Jäsenfunktioiden/aliohjelmien dokumentaatio"; } // "Member Function/Subroutine Documentation"
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Tietotyyppien lista"; } // "Data Types List"
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Kentät"; } // "Data Fields";
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Tässä ovat tietotyypit lyhyiden selitysten kanssa:"; } // "Here are the data types with brief descriptions:"
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Tässä on lista kaikista "; // "Here is a list of all "
+ if (!extractAll)
+ {
+ result+="dokumentoiduista "; // "documented "
+ }
+ result+="tietotyyppien jäsenistä"; // "data types members"
+ result+=", sekä linkit "; // " with links to "
+ if (!extractAll)
+ {
+ result+="tietueen dokumentaatioon jokaiselle jäsenelle"; // "the data structure documentation for each member"
+ }
+ else
+ {
+ result+="tietotyyppeihin, joihin ne kuuluvat:"; // "the data types they belong to:"
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Tietotyyppien hakemisto"; } // "Data Type Index"
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Tietotyyppien dokumentaatio"; } // "Data Type Documentation"
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funktiot/aliohjelmat"; } // "Functions/Subroutines"
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Funktioiden/aliohjelmien dokumentaatio"; } // "Function/Subroutine Documentation"
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Tietotyypit"; } // "Data Types"
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Moduulilista"; } // "Modules List"
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Tässä on lista kaikista "; // "Here is a list of all "
+ if (!extractAll) result+="dokumentoiduista "; // "documented "
+ result+="moduuleista lyhyiden selitysten kanssa:"; // "modules with brief descriptions:"
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" moduuli"; break; // " Module"
+ case ClassDef::Struct: result+=" tyyppi"; break; // " Type"
+ case ClassDef::Union: result+=" yhdiste"; break; // " Union"
+ case ClassDef::Interface: result+=" rajapinta"; break; // " Interface"
+ case ClassDef::Protocol: result+=" protokolla"; break; // " Protocol"
+ case ClassDef::Category: result+=" kategoria"; break; // " Category"
+ case ClassDef::Exception: result+=" poikkeus"; break; // " Exception"
+ }
+ if (isTemplate) result+="malli"; // " Template"
+ result+="referenssi"; // " Reference"
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" moduulin referenssi"; // " Module Reference"
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Moduulin jäsenet"; } // "Module Members"
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Tässä on lista moduulin kaikista "; // "Here is a list of all "
+ if (!extractAll) result+="dokumentoiduista"; // "documented "
+ result+="jäsenistä, sekä linkit "; // "module members with links to "
+ if (extractAll)
+ {
+ result+="moduulin dokumentaatioon jokaiselle jäsenelle:"; // "the module documentation for each member:"
+ }
+ else
+ {
+ result+="moduuleihin, joihin ne kuuluvat:"; // "the modules they belong to:"
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Moduulien hakemisto"; } // "Modules Index"
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Moduuli" : "moduuli")); // "Module" / "module"
+ if (!singular) result+="t"; // "+s"
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentaatio tälle "; // "The documentation for this "
+ switch(compType)
+ {
+ case ClassDef::Class: result+="moduulille"; break; // "module"
+ case ClassDef::Struct: result+="tyypille"; break; // "type"
+ case ClassDef::Union: result+="yhdisteelle"; break; // "union"
+ case ClassDef::Interface: result+="rajapinnalle"; break; // "interface"
+ case ClassDef::Protocol: result+="protokollalle"; break; // "protocol"
+ case ClassDef::Category: result+="kategorialle"; break; // "category"
+ case ClassDef::Exception: result+="poikkeukselle"; break; // "exception"
+ }
+ result+=" luotiin "; // " was generated from the following file"
+ if (single) result+="seuraavasta tiedostosta:"; else result+="seuraavista tiedostoista:"; // ":" / "s:"
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tyyppi" : "tyyppi")); // "Type" / "type"
+ if (!singular) result=(first_capital ? "Tyypit" : "tyypit"); // "+s"
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Aliohjelma" : "aliohjelma")); // "Subprogram" / "subprogram"
+ if (!singular) result+="t"; // "+s"
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Tyyppien rajoitteet"; // "Type Constraints"
+ }
+
+};
+
+#endif
diff --git a/src/translator_fr.h b/src/translator_fr.h
new file mode 100644
index 0000000..01a8025
--- /dev/null
+++ b/src/translator_fr.h
@@ -0,0 +1,1978 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * The translation into French was provided by
+ * Christophe Bordeux (bordeux@lig.di.epfl.ch)
+ * and after version 1.2.0 by Xavier Outhier (xouthier@yahoo.fr)
+ * member of the non for profit association D2SET (http://d2set.free.fr)
+ */
+
+/******************************************************************************
+ * History of content
+ *
+ * Date | Description
+ * ============+=============================================================
+ * 2001-11-22 | Removed obsolet methods:
+ * | QCString latexBabelPackage()
+ * | QCString trAuthor()
+ * | QCString trAuthors()
+ * | QCString trFiles()
+ * | QCString trIncludeFile()
+ * | QCString trVerbatimText(const char *f)
+ * -------------+------------------------------------------------------------
+ * 2002-01-23 | Update for new since 1.2.13
+ * -------------+------------------------------------------------------------
+ * 2002-07-11 | Update for new since 1.2.16
+ * -------------+------------------------------------------------------------
+ * 2002-09-24 | Update for new since 1.2.17
+ * -------------+------------------------------------------------------------
+ * 2002-10-22 | Update for new since 1.2.18
+ * -------------+------------------------------------------------------------
+ * 2003-02-04 | Corrected typo. Thanks to Bertrand M. :)
+ * -------------+------------------------------------------------------------
+ * 2003-03-29 | Update for new since 1.3
+ * -------------+------------------------------------------------------------
+ * 2003-03-29 | Changed fonction into mthode.
+ * -------------+------------------------------------------------------------
+ * 2003-06-06 | Fixed code page problem appeared between 1.42 and 1.43 in CVS
+ * -------------+------------------------------------------------------------
+ * 2003-06-10 | Update for new since 1.3.1
+ * -------------+------------------------------------------------------------
+ * 2003-09-12 | Update for new since 1.3.3
+ * -------------+------------------------------------------------------------
+ * 2004-04-30 | Updates by Jacques Bouchard <jacques.bouchard@noos.fr>:
+ * | - spaces between ':' removed (should be added by the renderer)
+ * | - missing spaces added
+ * | - missing tests for OPTIMIZE_OUTPUT_FOR_C added
+ * | - translations corrected
+ * | - translator_fr.h now conforms exactly to translator_en.h
+ * | (try: gvim -d translator_en.h translator_fr.h)
+ * -------------+------------------------------------------------------------
+ * 2005-07-12 | Update for new since 1.4.1
+ * -------------+------------------------------------------------------------
+ * 2005-10-09 | Update for new since 1.4.6
+ * | Added virtual QCString trCallerGraph()
+ * | Removed virtual QCString trHeaderFilesDescription()
+ * | Removed virtual QCString trField(bool first_capital, bool singular)
+ * | Removed virtual QCString trPackageDocumentation()
+ * | Removed virtual QCString trSources()
+ * | Removed virtual QCString trReimplementedForInternalReasons()
+ * | Removed virtual QCString trInterfaces()
+ * | Removed virtual QCString trHeaderFiles()
+ * | Removed virtual QCString trBugsAndLimitations()
+ * | Removed virtual QCString trNoDescriptionAvailable()
+ * | Corrected some misspelling thanx to Christophe C.
+ * -------------+------------------------------------------------------------
+ */
+#ifndef TRANSLATOR_FR_H
+#define TRANSLATOR_FR_H
+
+// When defining a translator class for the new language, follow
+// the description in the documentation. One of the steps says
+// that you should copy the translator_en.h (this) file to your
+// translator_xx.h new file. Your new language should use the
+// Translator class as the base class. This means that you need to
+// implement exactly the same (pure virtual) methods as the
+// TranslatorEnglish does. Because of this, it is a good idea to
+// start with the copy of TranslatorEnglish and replace the strings
+// one by one.
+//
+// It is not necessary to include "translator.h" or
+// "translator_adapter.h" here. The files are included in the
+// language.cpp correctly. Not including any of the mentioned
+// files frees the maintainer from thinking about whether the
+// first, the second, or both files should be included or not, and
+// why. This holds namely for localized translators because their
+// base class is changed occasionaly to adapter classes when the
+// Translator class changes the interface, or back to the
+// Translator class (by the local maintainer) when the localized
+// translator is made up-to-date again.
+
+class TranslatorFrench : public TranslatorAdapter_1_6_3
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ {
+ return "french"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[french]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-1";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ {
+ return "Fonctions associes"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ {
+ return "(Noter que ce ne sont pas des fonctions membres)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ {
+ return "Description dtaille"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ {
+ return "Documentation des dfinitions de type membres"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ {
+ return "Documentation des numrations membres"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ {
+ return "Documentation des fonctions membres"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentation des champs";
+ }
+ else
+ {
+ return "Documentation des donnes membres";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ {
+ return "Plus de dtails..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ {
+ return "Liste de tous les membres"; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ {
+ return "Liste des membres"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ {
+ return "Liste complte des membres de "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ {
+ return ", y compris les membres hrits :"; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Gnr automatiquement par Doxygen";
+ if (s) result+=(QCString)" pour "+s;
+ result+=" partir du code source.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ {
+ return "numration"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ {
+ return "valeur numre"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ {
+ return "dfini dans"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ {
+ return "Modules"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ {
+ return "Hirarchie des classes"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Structures de donnes";
+ }
+ else
+ {
+ return "Liste des classes";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ {
+ return "Liste des fichiers"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Champs de donne";
+ }
+ else
+ {
+ return "Membres de classe";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Porte globale";
+ }
+ else
+ {
+ return "Membres de fichier";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ {
+ return "Pages associes"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ {
+ return "Exemples"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ {
+ return "Recherche"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ {
+ return "Cette liste d'hritage est classe "
+ "approximativement par ordre alphabtique :";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les fichiers ";
+ if (!extractAll) result+="documents ";
+ result+="avec une brve description :";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Liste des structures de donnes avec une brve description :";
+ }
+ else
+ {
+ return "Liste des classes, structures, "
+ "unions et interfaces avec une brve description :";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="champs de structure et d'union ";
+ }
+ else
+ {
+ result+="membres de classe ";
+ }
+ if (!extractAll)
+ {
+ result+="documents ";
+ }
+ result+="avec liens vers ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="la documentation de structure/union de chaque champ :";
+ }
+ else
+ {
+ result+="la documentation de classe de chaque membre :";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="les structures/unions auxquelles ils appartiennent :";
+ }
+ else
+ {
+ result+="les classes auxquelles ils appartiennent :";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Liste ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="des fonctions, variables, macros, enumrations, et dfinitions de type ";
+ }
+ else
+ {
+ result+="de tous les membres de fichier ";
+ }
+ if (!extractAll) result+="documents ";
+ result+="avec liens vers ";
+ if (extractAll)
+ result+="les fichiers auxquels ils appartiennent :";
+ else
+ result+="la documentation :";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ {
+ return "Liste de tous les exemples :"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ {
+ return "Liste de toutes les pages de documentation associes :"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ {
+ return "Liste de tous les modules :"; }
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ {
+ return "Documentation"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ {
+ return "Index des modules"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ {
+ return "Index hirarchique"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Index des structures de donnes";
+ }
+ else
+ {
+ return "Index des classes";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ {
+ return "Index des fichiers"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ {
+ return "Documentation des modules"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentation des structures de donnes";
+ }
+ else
+ {
+ return "Documentation des classes";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ {
+ return "Documentation des fichiers"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ {
+ return "Documentation des exemples"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ {
+ return "Documentation des pages associes"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ {
+ return "Manuel de rfrence"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ {
+ return "Macros"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ {
+ return "Prototypes de fonction"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ {
+ return "Dfinition de type"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ {
+ return "numrations"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ {
+ return "Fonctions"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ {
+ return "Variables"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ {
+ return "Valeurs numres"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ {
+ return "Documentation des macros"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ {
+ return "Documentation des prototypes de fonction"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ {
+ return "Documentation des dfinitions de type"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Documentation du type de l'numration"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ {
+ return "Documentation des fonctions"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ {
+ return "Documentation des variables"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Structures de donnes";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Gnr le "+date;
+ if (projName) result+=(QCString)" pour "+projName;
+ result+=(QCString)" par";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "crit par";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Graphe d'hritage de "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ {
+ return " usage interne uniquement."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ {
+ return "Avertissement"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ {
+ return "Version"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ {
+ return "Date"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ {
+ return "Renvoie"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ {
+ return "Voir galement"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ {
+ return "Paramtres"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ {
+ return "Exceptions"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ {
+ return "Gnr par"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990307
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ {
+ return "Liste des espaces de nommage"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les espaces de nommage ";
+ if (!extractAll) result+="documents ";
+ result+="avec une brve description:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ {
+ return "Amis"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990405
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ {
+ return "Documentation des fonctions amies et associes"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990425
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Rfrence de ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="la classe ";
+ break;
+ case ClassDef::Struct: result+="la structure ";
+ break;
+ case ClassDef::Union: result+="l'union ";
+ break;
+ case ClassDef::Interface: result+="l'interface ";
+ break;
+ case ClassDef::Protocol: result+="le protocol ";
+ break;
+ case ClassDef::Category: result+="la catgorie ";
+ break;
+ case ClassDef::Exception: result+="l'exception ";
+ break;
+ }
+ result+=(QCString)clName;
+ if (isTemplate) result+=" (modle)";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result= "Rfrence du fichier ";
+ result+=fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result= "Rfrence de l'espace de nommage ";
+ result+=namespaceName;
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ {
+ return "Fonctions membres publiques"; }
+ virtual QCString trPublicSlots()
+ {
+ return "Connecteurs publics"; }
+ virtual QCString trSignals()
+ {
+ return "Signaux"; }
+ virtual QCString trStaticPublicMembers()
+ {
+ return "Fonctions membres publiques statiques"; }
+ virtual QCString trProtectedMembers()
+ {
+ return "Fonctions membres protges"; }
+ virtual QCString trProtectedSlots()
+ {
+ return "Connecteurs protgs"; }
+ virtual QCString trStaticProtectedMembers()
+ {
+ return "Fonctions membres protges statiques"; }
+ virtual QCString trPrivateMembers()
+ {
+ return "Fonctions membres prives"; }
+ virtual QCString trPrivateSlots()
+ {
+ return "Connecteurs privs"; }
+ virtual QCString trStaticPrivateMembers()
+ {
+ return "Fonctions membres prives statiques"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", et ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Est drive de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Drive par "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Rimplmente partir de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Rimplmente dans "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ {
+ return "Membres de l'espace de nommage"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les membres des espaces de nommage ";
+ if (!extractAll) result+="documents ";
+ result+="avec liens vers ";
+ if (extractAll)
+ result+="la documentation de namespace de chaque membre :";
+ else
+ result+="les espaces de nommage auxquels ils appartiennent :";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ {
+ return "Index des espaces de nommage"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ {
+ return "Documentation des espaces de nommage"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990522
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ {
+ return "Espaces de nommage"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990728
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ bool female = true;
+ QCString result=(QCString)"La documentation de ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="cette classe";
+ break;
+ case ClassDef::Struct: result+="cette structure";
+ break;
+ case ClassDef::Union: result+="cette union";
+ break;
+ case ClassDef::Interface: result+="cette interface";
+ break;
+ case ClassDef::Protocol: result+="ce protocol";
+ female = false;
+ break;
+ case ClassDef::Category: result+="cette catgorie";
+ break;
+ case ClassDef::Exception: result+="cette exception";
+ break;
+ }
+ if (female) result+= " a t gnre partir ";
+ else result+=" a t gnr partir ";
+ if (single) result+="du fichier suivant :";
+ else result+="des fichiers suivants :";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ {
+ return "Liste alphabtique"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990901
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ {
+ return "Valeurs retournes"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ {
+ return "Page principale"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ {
+ return "p."; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-991003
+ //////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Dfinition la ligne @0 du fichier @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Dfinition dans le fichier @0.";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-991205
+ //////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Obsolte";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.0.0
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Graphe de collaboration de "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Graphe des dpendances par inclusion de "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Documentation des constructeurs et destructeur";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Aller au code source de ce fichier.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Aller la documentation de ce fichier.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Prcondition";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postcondition";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Valeur initiale :";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "code";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Graphe hirarchique des classes";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Aller au graphe hirarchique des classes";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Aller la hirarchie des classes en mode texte";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Index des pages";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.1.0
+ //////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Note";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Types publics";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Champs de donnes";
+ }
+ else
+ {
+ return "Attributs publics";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Attributs publics statiques";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Types protgs";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Attributs protgs";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Attributs protgs statiques";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Types privs";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Attributs privs";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Attributs privs statiques";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.1.3
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return " faire";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Liste des choses faire";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.1.4
+ //////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Rfrenc par";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Remarques";
+ }
+ virtual QCString trAttention()
+ {
+ return "Attention";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Ce graphe montre quels fichiers incluent directement "
+ "ou indirectement ce fichier :";
+ }
+ virtual QCString trSince()
+ {
+ return "Depuis";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.1.5
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Lgende du graphe";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Cette page explique comment interprter les graphes gnrs "
+ "par doxygen.<p>\n"
+ "Considrez l'exemple suivant :\n"
+ "\\code\n"
+ "/*! Classe invisible cause d'une troncature */\n"
+ "class Invisible { };\n\n"
+ "/*! Classe tronque, la relation d'hritage est masque */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/*! Classe non documente avec des commentaires Doxygen */\n"
+ "class Undocumented { };\n\n"
+ "/*! Classe drive par hritage public */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Un modle de classe */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Classe drive par hritage protg */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Classe drive par hritage priv */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Classe utilise par la classe drive */\n"
+ "class Used { };\n\n"
+ "/*! Super-classe qui hrite de plusieurs autres classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Si la valeur 240 est attribue au tag \\c MAX_DOT_GRAPH_HEIGHT "
+ "du fichier de configuration, cela gnrera le graphe suivant :"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Les rectangles du graphe ci-dessus ont la signification suivante :\n"
+ "<ul>\n"
+ "<li>Un rectangle plein noir reprsente la structure ou la classe pour laquelle "
+ "le graphe est gnr.\n"
+ "<li>Un rectangle avec un bord noir indique une classe ou une structure documente.\n"
+ "<li>Un rectangle avec un bord gris indique une classe ou une structure non documente.\n"
+ "<li>Un rectangle avec un bord rouge indique une structure ou une classe documente\n"
+ "pour laquelle des relations d'hritage ou de collaboration manquent. Un graphe est "
+ "tronqu s'il n'entre pas dans les limites spcifies."
+ "</ul>\n"
+ "Les flches ont la signification suivante :\n"
+ "<ul>\n"
+ "<li>Une flche bleu fonc est utilise pour visualiser une relation d'hritage public "
+ "entre deux classes.\n"
+ "<li>Une flche vert fonc est utilise pour une relation d'hritage protg.\n"
+ "<li>Une flche rouge fonc est utilise pour une relation d'hritage priv.\n"
+ "<li>Une flche violette en pointills est utilise si une classe est contenue ou "
+ "utilise par une autre classe. La flche est tiquete avec la ou les variable(s) "
+ "qui permettent d'accder la classe ou structure pointe. \n"
+ "<li>Une flche verte en pointills indique une relation entre une classe instancie et "
+ "le modle de classe utilis. La flche est tiquete avec "
+ "les paramtres de modle de la classe instancie.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "lgende";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.0
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Liste des tests";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.1
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Fonctions membres DCOP";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.2
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Proprits";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Documentation des proprits";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.4
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Structures de donnes";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paquetage "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Liste des paquetages";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Liste des paquetages avec une brve description (si disponible) :";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Paquetages";
+ }
+
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Valeur :";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.5
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Bogue";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Liste des bogues";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.6
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Index";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Classe" : "classe"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Fichier" : "fichier"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Espace" : "espace"));
+ if (!singular) result+="s";
+ result+=" de nommage";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Groupe" : "groupe"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Page" : "page"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Membre" : "membre"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global(e)" : "global(e)"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.7
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Auteur" : "auteur"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.11
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Rfrences";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.13
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implmente "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implment dans "+trWriteList(numEntries)+".";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.16
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Table des matires";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.17
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Liste des lments obsoltes";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.18
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "vnements";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Documentation des vnements";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Types de paquetage";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Fonctions de paquetage";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Fonctions statiques de paquetage";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Attributs de paquetage";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Attributs statiques de paquetage";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.1
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Tout";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Voici le graphe d'appel pour cette fonction :";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.3
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Rechercher";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Rsultats de la recherche";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Dsol, aucun document ne correspond votre requte.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Trouv <b>1</b> document correspondant votre requte.";
+ }
+ else
+ {
+ return "Trouv <b>$num</b> documents correspondant votre requte. "
+ "Class par ordre de pertinence dcroissant.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Correspondances :";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.8
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return " Fichier source de " + filename;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.9
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ {
+ return "Hirarchie de rpertoires"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ {
+ return "Documentation des rpertoires"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ {
+ return "Rpertoires"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ {
+ return "Cette hirarchie de rpertoire est trie approximativement, "
+ "mais pas compltement, par ordre alphabtique :";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ {
+ QCString result="Rpertoire de rfrence de "; result+=dirName;
+ return result;
+ }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Rpertoire" : "rpertoire"));
+ if (singular) result+="";
+ else result+="s";
+ return result;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.4.1
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Ceci est une fonction membre surcharge, "
+ "propose par commodit. Elle diffre de la fonction "
+ "ci-dessus uniquement par le(s) argument(s) qu'elle accepte.";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.4.6
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Voici le graphe d'appel pour cette fonction :";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Documentation des numrations"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.5.4 (mainly for Fortran)
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Documentation des fonctions membres/subroutine"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Liste des types de donnes"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Champs de donnes"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Liste des types de donnes avec une brve description :"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Liste de tous les ";
+ result+="membres de types de donnes ";
+ if (!extractAll)
+ {
+ result+="documents ";
+ }
+ result+="avec liens vers ";
+ if (!extractAll)
+ {
+ result+="la documentation de la structure des donnes de chaque membre :";
+ }
+ else
+ {
+ result+="les types des donnes auxquels ils appartiennent :";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Index du type de donnes"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Documentation du type de donnes"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Fonctions/Subroutines"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Documentation de la Fonction/Subroutine"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Les types de donnes"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Liste des modules"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les modules";
+ if (!extractAll) result+="documents ";
+ result+="avec une brve description :";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Rference ";
+ if (isTemplate) result+="du gabarit (template) ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="du module "; break;
+ case ClassDef::Struct: result+="du type "; break;
+ case ClassDef::Union: result+="de l'union "; break;
+ case ClassDef::Interface: result+="de l'interface "; break;
+ case ClassDef::Protocol: result+="du protocole "; break;
+ case ClassDef::Category: result+="de la catgorie "; break;
+ case ClassDef::Exception: result+="de l'exception "; break;
+ }
+ result+=(QCString)clName;
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result="Rfrence du module ";
+ result+= namespaceName;
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Membres du module"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Liste de tous les membres ";
+ if (!extractAll) result+="documents ";
+ result+="du module avec lien vers ";
+ if (extractAll)
+ {
+ result+="la documentation du module de chaque membre :";
+ }
+ else
+ {
+ result+="les modules auxquels ils appartiennent :";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Index des modules"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Module" : "module"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"La documentation de ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="ce module"; break;
+ case ClassDef::Struct: result+="ce type"; break;
+ case ClassDef::Union: result+="cette union"; break;
+ case ClassDef::Interface: result+="cette interface"; break;
+ case ClassDef::Protocol: result+="ce protocole"; break;
+ case ClassDef::Category: result+="cette catgorie"; break;
+ case ClassDef::Exception: result+="cette exception"; break;
+ }
+ result+=" a t gnre partir ";
+ if (single) result+="du fichier suivant :"; else result+="des fichiers suivants :";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Type" : "type"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Sous-programme" : "sous-programme"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Les constraintes du type";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Relation " + QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Chargement...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Espace de nommage global";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Recherche...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Aucune correspondance";
+ }
+
+};
+
+#endif
+
diff --git a/src/translator_gr.h b/src/translator_gr.h
new file mode 100644
index 0000000..c5b6c47
--- /dev/null
+++ b/src/translator_gr.h
@@ -0,0 +1,1851 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/*
+ * 15 Dec 2001 : Translation to greek by
+ * Harry Kalogirou <no email>
+ *
+ * 01 Jan 2009 : Greek maintainance by
+ * Paul Gessos <gessos.paul@yahoo.gr>
+ */
+
+#ifndef TRANSLATOR_GR_H
+#define TRANSLATOR_GR_H
+
+class TranslatorGreek : public Translator
+{
+ protected:
+ friend class TranslatorAdapterBase;
+
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "greek"; }
+
+ virtual QCString latexLanguageSupportCommand()
+ {
+ //return "\\usepackage[greek,english]{babel}\n\\usepackage[iso-8859-7]{inputenc}\n";
+ return "\\usepackage[greek,english]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Σχετικές συναρτήσεις"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Σημειώστε ότι αυτές δεν είναι συναρτήσεις μέλη.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Λεπτομερής Περιγραφή"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Τεκμηρίωση Μελών Typedef"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Τεκμηρίωση Απαριθμήσεων Μελών"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Τεκμηρίωση Συναρτήσεων Μελών"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Τεκμηρίωση Πεδίων";
+ }
+ else
+ {
+ return "Τεκμηρίωση Δεδομένων Μελών";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Περισσότερα..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Λίστα όλων των μελών."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Λίστα μελών"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Ακολουθεί η πλήρης λίστα των μελών της"; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", περιλαμβανομένων όλων των κληρονομημένων μελών."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Δημιουργήθηκε αυτόματα από το Doxygen";
+ if (s) result+=(QCString)" για "+s;
+ result+=" από τον πηγαίο κώδικα.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "όνομα απαρύθμισης"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "τιμή απαρίθμησης"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "ορισμένο στο "; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Κομμάτια"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Ιεραρχία Κλάσεων"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Δομές Δεδομένων";
+ }
+ else
+ {
+ return "Λίστα Συσσωματωμάτων";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Λίστα Αρχείων"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Πεδία Δεδομένων";
+ }
+ else
+ {
+ return "Μέλη Συσσωματώματα";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Καθολικοί ορισμοί";
+ }
+ else
+ {
+ return "Μέλη Αρχείων";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Σχετικές Σελίδες"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Παραδείγματα"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Αναζήτηση"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Αυτή η λίστα κληρονομηκότητας είναι μερικώς ταξινομημένη, "
+ "αλλά όχι πλήρως, αλφαβητικά:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Ακολουθεί μια λίστα όλων των ";
+ if (!extractAll) result+="τεκμηριωμένων ";
+ result+="αρχείων με σύντομες περιγραφές:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ακολουθούνε οι δομές δεδομένων με σύντομες περιγραφές:";
+ }
+ else
+ {
+ return "Ακολουθούνε οι κλάσεις, οι δομές, "
+ "τα σώματα και οι διαπροσωπίες με σύντομες περιγραφές:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Ακολουθεί η λίστα όλων των ";
+ if (!extractAll)
+ {
+ result+="τεκμηριωμένων ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="πεδίων δομών και σωμάτων ";
+ }
+ else
+ {
+ result+="κλάσεων";
+ }
+ result+=" με συνδέσμους ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="στην τεκμηρίωση των δομών/ενώσεων για κάθε πεδίο:";
+ }
+ else
+ {
+ result+="στην τεκμηρίωση των κλάσεων για κάθε πεδίο:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="στις δομές/ενώσεις που ανήκουν:";
+ }
+ else
+ {
+ result+="στις κλάσεις που ανήκουν:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Ακολουθεί η λίστα όλων των ";
+ if (!extractAll) result+="τεκμηριωμένων ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="συναρτήσεων, μεταβλητών, ορισμών, απαριθμήσεων, και ορισμών τύπων";
+ }
+ else
+ {
+ result+="μελών αρχείων";
+ }
+ result+=" με συνδέσμους ";
+ if (extractAll)
+ result+="στα αρχεία που ανήκουν:";
+ else
+ result+="στην τεκμηρίωση:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Ακολουθεί η λίστα με τα παραδείγματα:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Ακολουθεί η λίστα όλων των σχετικών σελίδων τεκμηρίωσης:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Ακολουθεί η λίστα όλων των μονάδων:"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Τεκμηρίωση"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Ευρετήριο μονάδων"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Ιεραρχικό Ευρετήριο"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ευρετήριο δομών δεδομένων";
+ }
+ else
+ {
+ return "Συμπαγές Ευρετήριο";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Ευρετήτιο Αρχείων"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Τεκμηρίωση Μονάδων"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Τεκμηρίωση Δομών Δεδομένων";
+ }
+ else
+ {
+ return "Τεκμηρίωση Κλάσεων";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Τεκμηρίωση Αρχείων"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Τεκμηρίωση Παραδειγμάτων"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Τεκμηρίωση Σελίδων"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Ενχειρίδιο Αναφοράς"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Ορισμοί"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Πρωτοτυπήσεις Συναρτήσεων"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Ορισμοί Τύπων"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Απαριθμήσεις"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Συναρτήσεις"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Μεταβλητές"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Τιμές Απαριθμήσεων"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Τεκμηρίωση Ορισμών"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Τεκμηρίωση Πρωτοτυπήσεων των Συναρτήσεων"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Τεκμηρίωση Ορισμών Τύπων"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Τεκμηρίωση Απαριθμήσεων"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Τεκμηρίωση Συναρτήσεων"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Τεκμηρίωση Μεταβλητών"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Δομές Δεδομένων";
+ }
+ else
+ {
+ return "Συσσωματώματα";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Δημιουργήθηκε στις "+date;
+ if (projName) result+=(QCString)" για "+projName;
+ result+=(QCString)" από";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "γραμμένο από τον ";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Διάγραμμα κληρονομικότητας για την "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Μόνο για εσωτερική χρήση."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Προειδοποίηση"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Έκδοση"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Ημ/νια"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Επιστρέφει"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Κοιτάξτε επίσης "; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Παράμετροι"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Εξαίρεση"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Δημιουργήθηκε από "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Λίστα Namespace"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Ακολουθέι η λίστα όλων των ";
+ if (!extractAll) result+="τεκμηριωμένων ";
+ result+="Namespace με σύντομες περιγραφές:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Φίλοι"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Τεκμηρίωση Φιλικών και Συσχετιζόμενων Συναρτήσεων"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName+" ";
+ result+=" Αναφορά";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Κλάσης"; break;
+ case ClassDef::Struct: result+=" Δομής"; break;
+ case ClassDef::Union: result+=" Ένωσης"; break;
+ case ClassDef::Interface: result+=" Διαπροσωπίας"; break;
+ case ClassDef::Protocol: result+=" Πρωτοκόλλου"; break;
+ case ClassDef::Category: result+=" Κατηγορίας"; break;
+ case ClassDef::Exception: result+=" Εξαίρεσης"; break;
+ }
+ if (isTemplate) result+=" Template";
+
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" Αναφορά Αρχείου";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Αναφορά Namespace";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Δημόσιες Μέθοδοι"; }
+ virtual QCString trPublicSlots()
+ { return "Δημόσια Slots"; }
+ virtual QCString trSignals()
+ { return "Σήματα"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Στατικές Δημόσιες Μέδοδοι"; }
+ virtual QCString trProtectedMembers()
+ { return "Προστατευμένες Μέδοδοι"; }
+ virtual QCString trProtectedSlots()
+ { return "Προστατευμένα Slots"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Στατικές Προστατευμένες Μέδοδοι"; }
+ virtual QCString trPrivateMembers()
+ { return "Ιδιοτικές Μέδοδοι"; }
+ virtual QCString trPrivateSlots()
+ { return "Ιδιοτικά Slots"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Στατικές Ιδιοτικές Μέδοδοι"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", και ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Κληρονομεί "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Κληρονομείται από "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Επαναϋλοποιείται από "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Επαναϋλοποιείται στην "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Μέλη Namespace"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Ακολουθεί η λίστα όλων των ";
+ if (!extractAll) result+="τεκμηριωμένων ";
+ result+="μελών χώρων ονομάτων με συνδέσμους ";
+ if (extractAll)
+ result+="στην τεκμηρίωση του χώρου ονομάτων για κάθε μέλος:";
+ else
+ result+="στους χώρους ονομάτων που ανήκουν:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Ευρετήριο Χώρων Ονομάτων"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Τεκμηρίωση Χώρων Ονομάτων"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Χώροι Ονομάτων"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Η τεκμηρίωση για ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="αυτή την κλάση"; break;
+ case ClassDef::Struct: result+="αυτή η δομή"; break;
+ case ClassDef::Union: result+="αυτή η ένωση"; break;
+ case ClassDef::Interface: result+="αυτή η διαπροσωπία"; break;
+ case ClassDef::Protocol: result+="Πρωτόκολλο"; break;
+ case ClassDef::Category: result+="Κατηγορία"; break;
+ case ClassDef::Exception: result+="αυτή η εξαίρεση"; break;
+ }
+ result+=" δημιουργήθηκε απο τ";
+ if (single) result+="ο ακόλουθο αρχείο:"; else result+="α ακόλουθα αρχεία:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Αλφαβητική Λίστα"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Τιμές Επιστροφής"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Κύρια Σελίδα"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "σελ."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Ορισμός στη γραμμή @0 του αρχείου @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Ορισμός στο αρχείο @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Αποσυρμένο";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Δίαγραμμα Συνεργασίας για την κλάση "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Διάγραμμα εξάρτησης Include για το αρχείο "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Τεκμηρίωση Constructor & Destructor";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Πήγαινε στον πηγαίο κώδικα του αρχείου.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Πήγαινε στην τεκμηρίωση του αρχείου.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Προϋποθέσεις";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Μεταϋποθέσεις";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Αμετάβλητα";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Αρχική τιμή:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "κώδικας";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Γραφική Αναπαράσταση Της Ιεραρχίας Των Κλάσεων";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Πήγαινε στην γραφική αναπαράσταση της ιεραρχίας των κλάσεων";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Πήγαινε στην με κείμενο αναπαράσταση της ιεραρχίας των κλάσεων";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Ευρετήριο Σελίδων";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Σημείωση";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Δημόσιοι Τυποι";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Πεδία Δεδομένων";
+ }
+ else
+ {
+ return "Δημόσια Χαρακτηριστικά";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Στατικά Δημόσια Χαρακτηριστικά";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Προστατευμένοι Τύποι";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Προστατευμένα Χαρακτηριστικά";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Στατικά Προστατευμένα Χαρακτηριστικά";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Ιδιωτικοί Τύποι";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Ιδιωτικα Χαρακτηριστικά";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Στατικά Ιδιωτικα Χαρακτηριστικά";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Προς Υλοποίηση";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Λίστα των Προς Υλοποίηση";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Αναφορά από";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Παρατήρηση";
+ }
+ virtual QCString trAttention()
+ {
+ return "Προσοχή";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Το γράφημα αυτό παρουσιάζει ποιά αρχεία άμεσα ή "
+ "έμεσα περιλαμβάνουν αυτό το αρχείο:";
+ }
+ virtual QCString trSince()
+ {
+ return "Από";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Υπόμνημα Διαγραμμάτων";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Αυτή η σελίδα εξηγεί το πως ερμηνεύονται τα διαγράμματα που δημιουργούνται "
+ "από το doxygen.<p>\n"
+ "Θεωρείστε το παρακάτω παράδειγμα:"
+ "\\code\n"
+ "/*! Invisible class because of truncation */\n"
+ "class Invisible { };\n\n"
+ "/*! Truncated class, inheritance relation is hidden */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Class not documented with doxygen comments */\n"
+ "class Undocumented { };\n\n"
+ "/*! Class that is inherited using public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Class that is inherited using protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Class that is inherited using private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Class that is used by the Inherited class */\n"
+ "class Used { };\n\n"
+ "/*! Super class that inherits a number of other classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Αυτό οδηγεί στο επόμενο γράφημα:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n"
+ "<p>\n"
+ "Τα κουτιά στο παραπάνω διάγραμμα έχουν την ακόλουθη σημασία:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>Ένα γεμισμένο μαύρο κουτί αναπαριστά τη δομή ή την κλάση για την οποία"
+ "αφορά το διάγραμμα.\n"
+ "<li>Ένα κουτί με μαύρο περίγραμμα αναπαριστά μία τεκμηριωμένη δομή ή κλάση.\n"
+ "<li>Ένα κουτί με γκρίζο περίγραμμα αναπαριστά μία μη τεκμηριωμένη δομή ή κλάση.\n"
+ "<li>Ένα κουτί με κόκκινο περίγραμμα αναπαριστά μία τεκμηριωμένη δομή ή κλάση για "
+ "την οποία δεν παρουσιάζονται όλες οι σχέσεις κληρονομικότητας και περιεχομένου. %Ένα "
+ "διάγραμμα μειώνεται αν δεν χωράει στις ορισμένες διαστάσεις."
+ "</ul>\n"
+ "<p>\n"
+ "Τα βέλη έχουν τις ακόλουθες σημασίες:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>Ένα βαθύ μπλε βέλος χρησιμοποιείται για να παρουσιάσει μία δημόσια σχέση κληρονομικότητας "
+ "μεταξύ δύο κλάσεων.</li>\n"
+ "<li>Ένα βαθύ πράσινο βέλος χρησιμοποιείται για προστατευμένη κληρονομικότητα.</li>\n"
+ "<li>Ένα βαθύ κόκκινο βέλος χρησιμοποιείται για ιδιωτική κληρονομικότητα.</li>\n"
+ "<li>Ένα μωβ διακεκομένο βέλος χρησιμοποιείται αν μία κλάση περιέχεται ή χρησιμοποιείται "
+ "από μία άλλη κλάση. Το βέλος ονομάζεται από το όνομα της μεταβλητής(ων) "
+ "μέσω της οποίας η κλάση ή δομή είναι προσβάσιμη.</li>\n"
+ "<li>Ένα κίτρινο διακεκομμένο βέλος χρησιμοποιείται για μια σχέση μεταξύ ενός template αντικειμένου και "
+ "της template κλάσης από την οποία δημιουργήθηκε. Το βέλος ονομάζεται με τις παραμέτρους του template "
+ "του αντικειμένου.</li>\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "υπόμνημα";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Δοκιμαστικό";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Λίστα Δοκιμαστικών";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Μέδοδοι DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Ιδιότητες";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Τεκμηρίωση Ιδιοτήτων";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Δομές Δεδομένων";
+ }
+ else
+ {
+ return "Κλάσεις";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Πακέτο "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Λίστα Πακέτων";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Ακολουθεί η λίστα των πακέτων με σύντομη περιγραφή (αν υπάρχει):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Πακέτα";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Τιμή:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Πρόβλημα";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Λίστα Προβλημάτων";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1253";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Ευρετήριο";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Κλάση" : "κλάση"));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Αρχεί" : "αρχεί"));
+ if (!singular) result+="α"; else result+="ο";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ομάδ" : "ομάδ"));
+ if (!singular) result+="ες"; else result+="α";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Σελίδ" : "σελίδ"));
+ if (!singular) result+="ες"; else result+="α";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Μέλ" : "μέλ"));
+ if (!singular) result+="η"; else result+="ος";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Καθολικ" : "καθολικ"));
+ if (!singular) result+="ές"; else result+="ή";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Συγραφ" : "συγραφ"));
+ if (!singular) result+=""; else result+="έας";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Αναφορές";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Υλοποιεί "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Υλοποιείται από "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Πίνακας Περιεχομένων";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Λίστα Καταργημένων";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Συμβάντα";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Τεκμηρίωση Συμβάντων";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Τύποι Πακέτων";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Συναρτήσεις Πακέτου";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Στατικές Συναρτήσεις Πακέτου";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Μεταβλητές Πακέτου";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Στατικές Μεταβλητές Πακέτου";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Όλα";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Το γράφημα δείχνει ποιές συναρτήσεις καλούνται από αυτή:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Αναζήτηση για";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Αποτελέσματα Αναζήτησης";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Συγγνώμη, δεν υπάρχει κείμενο που να ταιριάζει με την αίτησή σας.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Βρέθηκε <b>1</b> κείμενο που ταιριάζει με την αίτησή σας.";
+ }
+ else
+ {
+ return "Βρέθηκαν <b>$num</b> κείμενα που ταιριάζουν με την αίτησή σας. "
+ "Πρώτα εμφανίζονται τα κείμενα που ταιριάζουν πιο πολύ.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Ταίριαξαν:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Αρχείο κώδικα " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Ιεραρχία Καταλόγου"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Τεκμηρίωση Καταλόγου"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Κατάλογοι"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ {
+ return "Η ιεραρχία καταλόγων ταξινομήθηκε αλφαβητικά, αλλά όχι πολύ αυστηρά:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=QCString("Αναφορά του Καταλόγου ") + dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Κατάλογο" : "κατάλογο"));
+ if (singular) result+="ς"; else result+="ι";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Αυτή είναι μια υπερφορτωμένη συνάρτηση-μέλος, "
+ "που παρέχεται για ευκολία. Διαφέρει από την παραπάνω "
+ "συνάρτηση μόνο στον τύπο των παραμέτρων που δέχεται.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Το γράφημα δείχνει από ποιές συναρτήσεις καλείται αυτή η συνάρτηση:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Enumerator Documentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Τεκμηρίωση Συνάρτησης/Υπορουτίνας Μέλους"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Λίστα Τύπων Δεδομένων"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Πεδία Δεδομένων"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Εδώ είναι οι τύποι δεδομένων με σύντομη περιγραφή:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Εδώ είναι η λίστα όλων των ";
+ if (!extractAll)
+ {
+ result+="τεκμηριωμένων ";
+ }
+ result+="μελών τύπων δεδομένων";
+ result+=" με συνδέσεις ";
+ if (!extractAll)
+ {
+ result+="στην τεκμηρίωση της δομής δεδομένων για κάθε μέλος";
+ }
+ else
+ {
+ result+="στους τύπους δεδομένων που ανήκουν:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Περιεχόμενα Τύπων Δεδομένων"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Τεκμηρίωση Τύπων Δεδομένων"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Συναρτήσεις/Υπορουτίνες"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Τεκμηρίωση Συνάρτησης/Υπορουτίνας"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Τύποι Δεδομένων"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Λίστα Υπομονάδων"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Εδώ είναι μια λίστα με όλες τις ";
+ if (!extractAll) result+="τεκμηριωμένες ";
+ result+="υπομονάδες με σύντομή περιγραφή:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Υπομονάδα"; break;
+ case ClassDef::Struct: result+=" Τύπος"; break;
+ case ClassDef::Union: result+=" Ένωση"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Πρωτόκολλο"; break;
+ case ClassDef::Category: result+=" Κατηγορία"; break;
+ case ClassDef::Exception: result+=" Εξαίρεση"; break;
+ }
+ if (isTemplate) result+=" Πρότυπο";
+ result+=" Δήλωση";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Δηλώσεις Υπομονάδων";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Υπομονάδες Μέλη"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Εδώ είναι μια λίστα με όλες τις ";
+ if (!extractAll) result+="τεκμηριωμένες ";
+ result+="μέλη υπομονάδες με συνδέσεις ";
+ if (extractAll)
+ {
+ result+="στην τεκμηρίωση της υπομονάδας για κάθε μέλος:";
+ }
+ else
+ {
+ result+="στις υπομονάδες που ανήκουν:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Περιεχόμενα Υπομονάδων"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Υπομονάδ" : "υπομονάδ"));
+ if (!singular) result+="ες"; else result+="α";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Η τεκμηρίωση για ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="αυτή την υπομονάδα"; break;
+ case ClassDef::Struct: result+="αυτό τον τύπο δεδομένων"; break;
+ case ClassDef::Union: result+="αυτή την ένωση"; break;
+ case ClassDef::Interface: result+="αυτό το interface"; break;
+ case ClassDef::Protocol: result+="αυτό το πρωτόκολλο"; break;
+ case ClassDef::Category: result+="αυτή την κατηγορία"; break;
+ case ClassDef::Exception: result+="αυτή την εξαίρεση"; break;
+ }
+ result+=" δημιουργήθηκε από ";
+ if (single) result+="το παρακάτω αρχείο:"; else result+="τα παρακάτω αρχεία:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Τύπο" : "τύπο"));
+ if (!singular) result+="ι"; else result+="ος";
+ result+= first_capital ? " Δεδομένων" : " δεδομένων";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Υποπρ" : "υποπρ"));
+ if (!singular) result+="ογράμματα"; else result+="όγραμμα";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Περιορισμοί Τύπων Δεδομένων";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Σχέση του "+QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Φόρτωση...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Γενικός χώρος ονομάτων";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Αναζήτηση...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Δεν βρέθηκαν αποτελέσματα αναζήτησης";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Γράφημα εξάρτησης φακέλου για το "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Αρχείο σε "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Εσωκλείει το αρχείο στο "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ","Κυρ" };
+ static const char *months[] = { "Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ" };
+ QCString sdate;
+ sdate.sprintf("%s %.2d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+};
+
+#endif
diff --git a/src/translator_hr.h b/src/translator_hr.h
new file mode 100644
index 0000000..1bea508
--- /dev/null
+++ b/src/translator_hr.h
@@ -0,0 +1,1557 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+*/
+// translation by Boris Bralo <boris.bralo@gmail.com>
+// Updates:
+// --------
+// 2000/08/20
+// - Better handling of ISO-8859-2/ WIN 1250 stuff based on (actualy stolen from :-)) Czech translations
+// implemented by Petr Prikryl (prikrylp@skil.cz).
+// As opposed to Czech translation this one assumes that Doxygen strings are written in Linux ( it's true,
+// I don't have QT pro licence ) , and uses ISOToWin function when built in WIN32
+//
+// 2000/09/18
+// - Added strings from 1.2.1
+// - Removed unneeeded decode() calls
+// - Changed some CS terminology
+//
+// 2001/01/22
+// - Added strings from 1.2.4
+//
+// 2001/05/25
+// - Added strings and up to and including 1.2.7_20010524
+// - Removed obsolete method trFiles()
+// - Removed obsolete method trAuthor()
+// - Removed obsolete method trAuthor()
+// - Removed obsolete method trVerbatimHeadert()
+// - Method latexBabelPackage() removed, ude latexLanguageSupportCommand
+//
+// 2001/11/13
+// - inherits from Translator
+// - Added strings for 1.2.11
+// - better output for C documentation (trCompoundMembersDescription(), trClassDocumentation())
+//
+// 2001/11/13
+// - Added strings for 1.2.13
+//
+// 2003/02/26
+// - Added strings for 1.2.18
+//
+// 2003/04/29
+// - Added strings for 1.3.0
+//
+// 2004/06/21
+// - Added strings for 1.3.8
+//
+// 2004/09/15
+// - Added strings for 1.3.9
+//
+// 2005/02/28
+// - Removed obsolete (unused) methods
+//
+// 2005/03/21
+// - Added strings for 1.4.1
+//
+// 2006/06/11
+// - Added strings for 1.4.6
+//
+// 2009/01/09
+// - Updated trLegendDocs
+//
+// 2010/03/04
+// - Updates for "new since 1.6.0 (mainly for the new search engine)".
+// - UTF-8
+// - removed decode()
+//
+// 2010/05/27
+// - Updates for 1.6.3
+#ifndef TRANSLATOR_HR_H
+#define TRANSLATOR_HR_H
+
+class TranslatorCroatian : public Translator
+{
+ private:
+
+ public:
+ QCString idLanguage()
+ { return "croatian"; }
+ QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+ QCString latexLanguageSupportCommand()
+ { return "\\usepackage[croatian]{babel}\n"; }
+ QCString trRelatedFunctions()
+ { return "Povezane funkcije"; }
+ QCString trRelatedSubscript()
+ { return "(To nisu member funkcije.)"; }
+ QCString trDetailedDescription()
+ { return "Detaljno objašnjenje"; }
+ QCString trMemberTypedefDocumentation()
+ { return "Dokumentacija typedef članova"; }
+ QCString trMemberEnumerationDocumentation()
+ { return "Dokumentacija enumeracijskih članova"; }
+ QCString trMemberFunctionDocumentation()
+ { return "Dokumentacija funkcija"; }
+ QCString trMemberDataDocumentation()
+ { return "Documentacija varijabli"; }
+ QCString trMore()
+ { return "Opširnije..."; }
+ QCString trListOfAllMembers()
+ { return "Popis svih članova."; }
+ QCString trMemberList()
+ { return "Popis članova."; }
+ QCString trThisIsTheListOfAllMembers()
+ { return "Ovo je popis svih članova"; }
+ QCString trIncludingInheritedMembers()
+ { return ", uključujući naslijeđene članove."; }
+ QCString trGeneratedAutomatically(const char *s)
+ { QCString result="napravljeno automatski Doxygen-om";
+ if (s) result+=(QCString)" za "+s;
+ result+=" iz programskog koda.";
+ return result;
+ }
+ QCString trEnumName()
+ { return "enum ime"; }
+ QCString trEnumValue()
+ { return "enum vrijednost"; }
+ QCString trDefinedIn()
+ { return "definirano u"; }
+ QCString trModules()
+ { return "Moduli"; }
+ QCString trClassHierarchy()
+ { return "Stablo klasa"; }
+ QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Sve strukture";
+ }
+ else
+ {
+ return "Sve klase";
+ }
+ }
+ QCString trFileList()
+ { return "Popis datoteka"; }
+ QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ return "Svi članovi struktura";
+ else
+ return "Svi članovi klasa";
+ }
+ QCString trFileMembers()
+ { return "članovi klasa u datoteci"; }
+ QCString trRelatedPages()
+ { return "Stranice povezane s ovom"; }
+ QCString trExamples()
+ { return "Primjeri"; }
+ QCString trSearch()
+ { return "Traži"; }
+ QCString trClassHierarchyDescription()
+ { return "Stablo naslijeđivanja je složeno "
+ "približno po abecedi:";
+ }
+ QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Popis svih ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="datoteka, s kratkim opisom:";
+ return result;
+ }
+ QCString trCompoundListDescription()
+ { return "Popis svih klasa, unija i struktura "
+ "s kratkim opisom :";
+ }
+ QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Popis svih ";
+ if (!extractAll)
+ result+="dokumentiranih ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result+="članova klasa s linkovima na ";
+ else
+ result+="članova struktura s linkovima na ";
+
+ if (!extractAll)
+ {
+ result+="dokumentaciju svakog člana:";
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result+="dokumentaciju klase :";
+ else
+ result +="dokumentaciju strukture";
+ }
+ return result;
+ }
+ QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Popis svih ";
+ if (!extractAll)
+ result+="dokumentiranih ";
+ result+="članova s linkovima na ";
+ if (extractAll)
+ result+="dokumentaciju datoteke u kojima se nalaze:";
+ else
+ result+="datoteke u kojima se nalaze:";
+ return result;
+ }
+ QCString trExamplesDescription()
+ { return "Popis primjera :"; }
+ QCString trRelatedPagesDescription()
+ { return "Popis povezanih stranica:"; }
+ QCString trModulesDescription()
+ { return "Popis svih modula:"; }
+
+ QCString trDocumentation()
+ { return "Dokumentacija"; }
+ QCString trModuleIndex()
+ { return "Kazalo modula"; }
+ QCString trHierarchicalIndex()
+ { return "Hijerarhijsko kazalo"; }
+ QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Kazalo struktura podataka";
+ }
+ else
+ {
+ return "Skupno kazalo ";
+ }
+ }
+ QCString trFileIndex()
+ { return "Kazalo datoteka"; }
+ QCString trModuleDocumentation()
+ { return "Dokumentacija modula"; }
+ QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dokumentacija struktura podataka";
+ }
+ else
+ {
+ return "Dokumentacija klasa";
+ }
+ }
+ QCString trFileDocumentation()
+ { return "Dokumentacija datoteka"; }
+ QCString trExampleDocumentation()
+ { return "Dokumentacija primjera"; }
+ QCString trPageDocumentation()
+ { return "Dokumentacija vezane stranice"; }
+ QCString trReferenceManual()
+ { return "Priručnik"; }
+
+ QCString trDefines()
+ { return "Definicije"; }
+ QCString trFuncProtos()
+ { return "Prototipi funkcija"; }
+ QCString trTypedefs()
+ { return "Typedef-ovi"; }
+ QCString trEnumerations()
+ { return "Enumeracije"; }
+ QCString trFunctions()
+ { return "Funkcije"; }
+ QCString trVariables()
+ { return "Varijable"; }
+ QCString trEnumerationValues()
+ { return "Vrijednosti enumeracija"; }
+ QCString trDefineDocumentation()
+ { return "Dokumentacija definicija"; }
+ QCString trFunctionPrototypeDocumentation()
+ { return "Dokumentacija prototipa funkcije"; }
+ QCString trTypedefDocumentation()
+ { return "Dokumentacija typedef-a"; }
+ QCString trEnumerationTypeDocumentation()
+ { return "Dokumentacija enumeracijskog tipa"; }
+ QCString trFunctionDocumentation()
+ { return "Dokumentacije funkcija"; }
+ QCString trVariableDocumentation()
+ { return "Dokumentacija varijable"; }
+ QCString trCompounds()
+ { return "Strukture"; }
+ QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Napravljeno "+date;
+ if (projName) result+=(QCString)" projekt: "+projName;
+ result+=" generator: ";
+ return result;
+ }
+ QCString trWrittenBy()
+ {
+ return "napisao ";
+ }
+ QCString trClassDiagram(const char *clName)
+ {
+ return QCString("Dijagram klasa za ")+clName;
+ }
+ QCString trForInternalUseOnly()
+ { return "Isključivo za internu uporabu."; }
+ QCString trWarning()
+ { return "Upozorenje"; }
+ QCString trVersion()
+ { return "Verzija"; }
+ QCString trDate()
+ { return "Datum"; }
+ QCString trReturns()
+ { return "Povratne vrijednosti"; }
+ QCString trSeeAlso()
+ { return "Vidi također"; }
+ QCString trParameters()
+ { return "Parametri"; }
+ QCString trExceptions()
+ { return "Iznimke"; }
+ QCString trGeneratedBy()
+ { return "Generirao"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNamespaceList()
+ { return "Popis imenika"; }
+ QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Popis svih ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="imenika s kratkim opisom:";
+ return result;
+ }
+ QCString trFriends()
+ { return "Friend-ovi "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trRelatedFunctionDocumentation()
+ { return "Dokumentacija povezanih funkcija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool /*isTemplate*/)
+ // used as the title of the HTML page of a class/struct/union
+ {
+ QCString result="Opis ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" klase "; break;
+ case ClassDef::Struct: result+=" strukture "; break;
+ case ClassDef::Union: result+=" unije "; break;
+ case ClassDef::Interface: result+=" sučelja (interface) "; break;
+ case ClassDef::Protocol: result+=" protokola "; break;
+ case ClassDef::Category: result+=" kategorije "; break;
+ case ClassDef::Exception: result+=" iznimke (exception) "; break;
+ }
+ result += clName;
+
+ return result;
+ }
+ QCString trFileReference(const char *fileName)
+ // used as the title of the HTML page of a file
+ {
+ QCString result="Opis datoteke ";
+ result+=fileName;
+ return result;
+ }
+ QCString trNamespaceReference(const char *namespaceName)
+ // used as the title of the HTML page of a namespace
+ {
+ QCString result ="Opis imenika ";
+ result+=namespaceName;
+
+ return result;
+ }
+
+ // these are for the member sections of a class, struct or union
+ QCString trPublicMembers()
+ { return "Public članovi"; }
+ QCString trPublicSlots()
+ { return "Public slotovi"; }
+ QCString trSignals()
+ { return "Signali"; }
+ QCString trStaticPublicMembers()
+ { return "Static public članovi"; }
+ QCString trProtectedMembers()
+ { return "Protected članovi"; }
+ QCString trProtectedSlots()
+ { return "Protected slotovi"; }
+ QCString trStaticProtectedMembers()
+ { return "Static protected članovi"; }
+ QCString trPrivateMembers()
+ { return "Privatni članovi"; }
+ QCString trPrivateSlots()
+ { return "Privatni slotovi"; }
+ QCString trStaticPrivateMembers()
+ { return "Statični privatni članovi"; }
+ // end of member sections
+
+ QCString trWriteList(int numEntries)
+ {
+ // this function is used to produce a comma-separated list of items.
+ // use generateMarker(i) to indicate where item i should be put.
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+="";
+ }
+ }
+ return result;
+ }
+
+ QCString trInheritsList(int numEntries)
+ // used in class documentation to produce a list of base classes,
+ // if class diagrams are disabled.
+ {
+ return "Naslijeđuje od "+trWriteList(numEntries)+".";
+ }
+ QCString trInheritedByList(int numEntries)
+ // used in class documentation to produce a list of super classes,
+ // if class diagrams are disabled.
+ {
+ return "Naslijeđena u "+trWriteList(numEntries)+".";
+ }
+ QCString trReimplementedFromList(int numEntries)
+ // used in member documentation blocks to produce a list of
+ // members that are hidden by this one.
+ {
+ return "Reimplementirano od "+trWriteList(numEntries)+".";
+ }
+ QCString trReimplementedInList(int numEntries)
+ {
+ // used in member documentation blocks to produce a list of
+ // all member that overwrite the implementation of this member.
+ return "Reimplementacija u "+trWriteList(numEntries)+".";
+ }
+
+ QCString trNamespaceMembers()
+ // This is put above each page as a link to all members of namespaces.
+ { return "članovi imenika"; }
+ QCString trNamespaceMemberDescription(bool extractAll)
+ // This is an introduction to the page with all namespace members
+ {
+ QCString result="Lista svih ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="članova imenika s linkovima na ";
+ if (extractAll)
+ result+="imeničku dokumentaciju svakog člana:";
+ else
+ result+="imenike kojima pripadaju:";
+ return result;
+ }
+ QCString trNamespaceIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // index of all namespaces.
+ { return "Kazalo imenika"; }
+ QCString trNamespaceDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all namespaces.
+ { return "Dokumentacija namespace-a"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ QCString trNamespaces()
+ {
+ return "Imenici";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result="Dokumentacija ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="klase"; break;
+ case ClassDef::Struct: result+="strukture"; break;
+ case ClassDef::Union: result+="unije"; break;
+ case ClassDef::Interface: result+="sučelja (interface)"; break;
+ case ClassDef::Protocol: result+="protokola"; break;
+ case ClassDef::Category: result+="kategorije"; break;
+ case ClassDef::Exception: result+="iznimke (exception)"; break;
+ }
+ result+=" je napravljena iz " + trFile(FALSE, single) + ": ";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ QCString trAlphabeticalList()
+ { return "Abecedni popis"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ QCString trReturnValues()
+ { return "Povratna vrijednost"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ QCString trMainPage()
+ { return "Glavna stranica"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ QCString trPageAbbreviation()
+ { return "str."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definirano u liniji @0 datoteke @1.";
+ }
+ QCString trDefinedInSourceFile()
+ {
+ return "Definirano u datoteci @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDeprecated()
+ {
+ return "Zastarjelo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Kolaboracijski dijagram za "+clName+ ":";
+ }
+ /*! this text is put before an include dependency graph */
+ QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Graf include međuovisnosti za "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ QCString trConstructorDocumentation()
+ {
+ return "Dokumentacija konstruktora i destruktora ";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ QCString trGotoSourceCode()
+ {
+ return "Izvorni kod";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ QCString trGotoDocumentation()
+ {
+ return "Dokumenacija za ovu datoteku.";
+ }
+ /*! Text for the \\pre command */
+ QCString trPrecondition()
+ {
+ return "Preduvjeti";
+ }
+ /*! Text for the \\post command */
+ QCString trPostcondition()
+ {
+ return "Postuvjeti";
+ }
+ /*! Text for the \\invariant command */
+ QCString trInvariant()
+ {
+ return "Invarijanta";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ QCString trInitialValue()
+ {
+ return "Početna vrijednost:";
+ }
+ /*! Text used the source code in the file index */
+ QCString trCode()
+ {
+ return "kod";
+ }
+ QCString trGraphicalHierarchy()
+ {
+ return "Grafičko stablo klasa";
+ }
+ QCString trGotoGraphicalHierarchy()
+ {
+ return "Grafičko stablo klasa";
+ }
+ QCString trGotoTextualHierarchy()
+ {
+ return "Tekstualno stablo klasa";
+ }
+ QCString trPageIndex()
+ {
+ return "Indeks stranice";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNote()
+ {
+ return "Primjedba";
+ }
+ QCString trPublicTypes()
+ {
+ return "Public tipovi";
+ }
+ QCString trPublicAttribs()
+ {
+ return "Public atributi";
+ }
+ QCString trStaticPublicAttribs()
+ {
+ return "Static public atributi";
+ }
+ QCString trProtectedTypes()
+ {
+ return "Protected tipovi";
+ }
+ QCString trProtectedAttribs()
+ {
+ return "Protected atributi";
+ }
+ QCString trStaticProtectedAttribs()
+ {
+ return "Static protected atributi";
+ }
+ QCString trPrivateTypes()
+ {
+ return "Private tipovi";
+ }
+ QCString trPrivateAttribs()
+ {
+ return "Private atributi";
+ }
+ QCString trStaticPrivateAttribs()
+ {
+ return "Static private atributi";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "Za uraditi";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Ostalo za uraditi";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referencirano od";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Napomene";
+ }
+ virtual QCString trAttention()
+ {
+ return "Pažnja";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Ovaj graf pokazuje koje datoteke izravno "
+ "ili neizravno uključuju ovu datoteku:";
+ }
+ virtual QCString trSince()
+ {
+ return "Od";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Legenda";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Ova stranica objašnjava kako interpretirati grafikone koje je generirao "
+ "doxygen.<p>\n"
+ "Na primjer:\n"
+ "\\code\n"
+ "/*! Nevidljiva klasa (neće stati na graf date visine) */\n"
+ "class Invisible { };\n\n"
+ "/*! Odrezana klasa, inheritance je skriven (klase se vidi na grafu, ali ne i sve bazne klase) */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Nedokumentirana klasa */\n"
+ "class Undocumented { };\n\n"
+ "/*! Klasa koja je naslijeđena public */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Klasa koje je naslijeđena protected */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Klasa koje je naslijeđena private */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Klasa koja se koristi agregacijom */\n"
+ "class Used { };\n\n"
+ "/*! Super klasa koja naslijeđuje/koristi ostale */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "To će rezultirati grafikonom:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Pravokutnici imaju slijedeće značenje:\n"
+ "<ul>\n"
+ "<li>Puni crni predstavlja klasu za koji je napravljen graf.\n"
+ "<li>Pravokutnik s crnim rubom predstavlja dokumentiranu klasu.\n"
+ "<li>Pravokutnik s sivim rubom predstavlja nedokumentiranu klasu.\n"
+ "<li>Pravokutnik s crvenim rubom predstavlja dokumentiranu klasu\n"
+ "Za koju nije prikazan graf naslijeđivanja. Graf je odrezan "
+ "ako ne stane unutar određenih granica."
+ "</ul>\n"
+ "Strelice imaju slijedeće značenje:\n"
+ "<ul>\n"
+ "<li>Tamnoplava strelica označava public naslijeđivanje.\n"
+ "<li>Tamnozelena strelica označava protected naslijeđivanje.\n"
+ "<li>Tamnocrvena strelica označava private naslijeđivanje.\n"
+ "<li>Ljubičasta isprekidana strelica se koristi ako je klasa dio "
+ "druge klase ili ako se klasa koristi u drugoj klasi. Natpis na "
+ "strelici je ime varijable u drugoj klasi\n"
+ "Strelica je označena imenom varijable.\n"
+ "<li>Žuta isprekidana strelica označava relaciju između template instance "
+ "i template klase. Označena je imenom template parametra\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legenda";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Test lista";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP metode";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Svojstva (property)";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Dokumentacija svojstava";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ return "Klase";
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paket "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Lista paketa";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Paketi s kratkim opisom (ukoliko postoji):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Paketi";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Vrijednost:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Greška";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Popis grešaka";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "238";
+ }
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Sadržaj";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Klas" : "klas"));
+ result+= (singular ? "a" : "e");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Datotek" : "datotek"));
+ result+= (singular ? "a" : "e");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result;
+ if (singular)
+ result = ((first_capital ? "Imenik" : "imenik"));
+ else
+ result = ((first_capital ? "Imenici" : "imenici"));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grup" : "grup"));
+ result+= (singular ? "a" : "e");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Stranic" : "stranic"));
+ result+= (singular ? "a" : "e");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "član" : "član"));
+ if (!singular) result+="ovi";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "G" : "g"));
+ if( singular )
+ result += "lobalna varijabla";
+ else
+ result += "lobalne varijable";
+
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autor" : "autor"));
+ if (!singular) result+="i";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Reference";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementira "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implementation this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementirano u "+trWriteList(numEntries)+".";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Sadržaj";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Popis zastarjelih metoda";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Događaji";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Dokumentacija događaja";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Tipovi u paketu";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funkcije u paketu";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statičke funkcije u paketu";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atributi u paketu";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statički atributi u paketu";
+ }
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.1
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Sve";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Ovo je dijagram poziva za ovu funkciju:";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.3
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Traži";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Rezultati pretrage";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Nema dokumenta koji odgovaraju vašem upitu";
+ }
+ else if (numDocuments==1)
+ {
+ return "Nađen <b>1</b> dokument koji odgovara vašem upitu.";
+ }
+ else if (numDocuments<5)
+ {
+ // Croatian (AFAIK all Slavic languages except Macedonian and Bulgarian)
+ // have different plural form for 2,3,4.
+ return "Nađena <b>$num</b> dokumenta koji odgovaraju vašem upitu."
+ "Najbolji su prikazani prvi.";
+ }
+ else
+ {
+ return "Nađeno <b>$num</b> dokumenata koji odgovaraju vašem upitu."
+ "Najbolji su prikazani prvi.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Pronađeno:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Izvorni kod datoteke " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Stablo direktorija"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Dokumentacija direktorija"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Direktoriji"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Stablo direktorija sortirano abecednim redom:"; }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result= "Opis direktorija "; result += dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Direktorij" : "direktorij"));
+ if (!singular) result+="i";
+ return result;
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Ovo je preopterećena funkcija (overload). "
+ "Razlikuje se od navedene metode "
+ "samo po vrsti argumenata koje prihvaća.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Ovo je graf funkcija koje pozivaju ovu funkciju:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Dokumentacija enumeracija"; }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Dokumentacija member funkcija/subrutina"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Lista tipova podataka"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Polja"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Tipovi podataka s kratkim opisom:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Lista svih ";
+ if (!extractAll)
+ {
+ result+="dokumentiranih ";
+ }
+ result+="polja";
+ result+=" s linkovima na ";
+ if (!extractAll)
+ {
+ result+="dokumentaciju struktura podataka za svako polje";
+ }
+ else
+ {
+ result+="strukture kojima pripadaju:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Kazalo data tipova"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Dokumentacija tipova podataka"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funkcije/Subrutine"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Documentacija funkcija/subrutina"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Tipovi podataka"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Popis modula"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Lista svih ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="modula s kratkim opisom:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Modul"; break;
+ case ClassDef::Struct: result+=" Tip"; break;
+ case ClassDef::Union: result+=" Unija"; break;
+ case ClassDef::Interface: result+=" Sučelje"; break;
+ case ClassDef::Protocol: result+=" Protokol"; break;
+ case ClassDef::Category: result+=" Kategorija"; break;
+ case ClassDef::Exception: result+=" Iznimka"; break;
+ }
+ if (isTemplate) result+=" Predložak";
+ result+=" Referenca";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" - Sadržaj modula";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "članovi modula"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Lista svih ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="članova modula s linkovima na ";
+ if (extractAll)
+ {
+ result+="dokumentaciju modula za svaki član:";
+ }
+ else
+ {
+ result+="modul kojem pripadaju:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Kazalo modula"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modul" : "modul"));
+ if (!singular) result+="i";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentacija ovog ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="modula"; break;
+ case ClassDef::Struct: result+="tipa"; break;
+ case ClassDef::Union: result+="unije"; break;
+ case ClassDef::Interface: result+="sučelja"; break;
+ case ClassDef::Protocol: result+="protokola"; break;
+ case ClassDef::Category: result+="kategorije"; break;
+ case ClassDef::Exception: result+="iznimke"; break;
+ }
+ result+=" je napravljena iz :";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tip" : "tip"));
+ if (!singular) result+="ovi";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprogram" : "subprogram"));
+ if (!singular) result+="i";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Ograničenja tipova (Type Constraints)";
+ }
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.6.0 (mainly for the new search engine)
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString("Relacije ") + QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Učitavam...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Globalni namespace";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Tražim...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Nema traženih podataka";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Graf povezanih direktorija za "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Datoteka u "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Uključuje datotake u "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Pon","Uto","Sri","Čet","Pet","Sub","Ned" };
+ static const char *months[] = { "Sje","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro" };
+ QCString sdate;
+ sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+};
+
+#endif
+
+
diff --git a/src/translator_hu.h b/src/translator_hu.h
new file mode 100644
index 0000000..17ed254
--- /dev/null
+++ b/src/translator_hu.h
@@ -0,0 +1,1546 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+ /*
+ * Original Hungarian translation by
+ * Gyrgy Fldvri <foldvari@diatronltd.com>
+ *
+ * Extended, revised and updated by
+ * kos Kiss <akiss@users.sourceforge.net>
+ *
+ * Further extended, revised and updated by
+ * Tamsi Ferenc <tf551@hszk.bme.hu>
+ */
+
+#ifndef TRANSLATOR_HU_H
+#define TRANSLATOR_HU_H
+
+class TranslatorHungarian : public TranslatorAdapter_1_4_6
+{
+ private:
+ const char * zed(char c)
+ {
+ switch (c & ~('a' ^ 'A')) {
+ case 'B': case 'C': case 'D': case 'F': case 'G':
+ case 'H': case 'J': case 'K': case 'L': case 'M':
+ case 'N': case 'P': case 'Q': case 'R': case 'S':
+ case 'T': case 'V': case 'W': case 'X': case 'Z':
+ return " ";
+ default:
+ return "z ";
+ }
+ }
+ public:
+
+ // --- Language control methods -------------------
+ virtual QCString idLanguage()
+ { return "hungarian"; }
+ /*! Used to get the command(s) for the language support. This method
+ * was designed for languages which do not prefer babel package.
+ * If this methods returns empty string, then the latexBabelPackage()
+ * method is used to generate the command for using the babel package.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[T2A]{fontenc}\n"
+ "\\usepackage[magyar]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-2";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Kapcsold fggvnyek"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Figyelem! Ezek a fggvnyek nem tagjai az osztlynak!)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Rszletes lers"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Tpusdefinci-tagok dokumentcija"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Enumerci-tagok dokumentcija"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Tagfggvnyek dokumentcija"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Adatmezk dokumentcija";
+ }
+ else
+ {
+ return "Adattagok dokumentcija";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Rszletek..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "A tagok teljes listja."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Taglista"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "A(z) "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return " osztly tagjainak teljes listja, az rklt tagokkal egytt."; }
+
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Ezt a dokumentcit a Doxygen ksztette ";
+ if (s) result+=(QCString)" a" + zed(s[0])+s+(QCString)" projekthez";
+ result+=" a forrskdbl.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "enum"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "enum-rtk"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "definilja:"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Modulok"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Osztlyhierarchia"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Adatszerkezetek";
+ }
+ else
+ {
+ return "Osztlylista";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Fjllista"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Adatmezk";
+ }
+ else
+ {
+ return "Osztlytagok";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globlis elemek";
+ }
+ else
+ {
+ return "Fjlelemek";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Kapcsold lapok"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Pldk"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Keress"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Majdnem (de nem teljesen) betrendbe szedett "
+ "leszrmazsi lista:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Az sszes ";
+ if (!extractAll) result+="dokumentlt ";
+ result+="fjl listja rvid lersokkal:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Az sszes adatszerkezet listja rvid lersokkal:";
+ }
+ else
+ {
+ return "Az sszes osztly, struktra, uni s interfsz "
+ "listja rvid lersokkal:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Az sszes ";
+ if (!extractAll)
+ {
+ result+="dokumentlt ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktra- s nimez";
+ }
+ else
+ {
+ result+="osztlytag";
+ }
+ result+=" listja, valamint hivatkozs ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="a megfelel struktra-/nidokumentcira minden meznl:";
+ }
+ else
+ {
+ result+="a megfelel osztlydokumentcira minden tagnl:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="a struktrkra/nikra, amikhez tartoznak:";
+ }
+ else
+ {
+ result+="az osztlyokra, amikhez tartoznak:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Az sszes ";
+ if (!extractAll) result+="dokumentlt ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="fggvny, vltoz, makrdefinci, enumerci s tpusdefinci";
+ }
+ else
+ {
+ result+="fjlelem";
+ }
+ result+=" listja, valamint hivatkozs ";
+ if (extractAll)
+ result+="a fjlokra, amikhez tartoznak:";
+ else
+ result+="a dokumentcira:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "A pldk listja:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "A kapcsold dokumentcik listja:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "A modulok listja:"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentci"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Modulmutat"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarchikus mutat"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Adatszerkezet-mutat";
+ }
+ else
+ {
+ return "Osztlymutat";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Fjlmutat"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Modulok dokumentcija"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Adatszerkezetek dokumentcija";
+ }
+ else
+ {
+ return "Osztlyok dokumentcija";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Fjlok dokumentcija"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Pldk dokumentcija"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Kapcsold dokumentcik"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Referencia kziknyv"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Makrdefincik"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Fggvny-prototpusok"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Tpusdefincik"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumercik"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Fggvnyek"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Vltozk"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Enumerci-rtkek"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Makrdefincik dokumentcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Fggvny-prototpusok dokumentcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Tpusdefincik dokumentcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Enumercik dokumentcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Fggvnyek dokumentcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Vltozk dokumentcija"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Adatszerkezetek";
+ }
+ else
+ {
+ return "Osztlyok";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"";
+ if (projName) result+=(QCString)"Projekt: "+projName;
+ result+=(QCString)" Kszlt: "+date+" Ksztette: ";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return " melyet rt ";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"A"+zed(clName[0])+clName+" osztly szrmazsi diagramja:";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "CSAK BELS HASZNLATRA!"; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Figyelmeztets"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Verzi"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Dtum"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Visszatrsi rtk"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Lsd mg"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Paramterek"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Kivtelek"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Ksztette"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Nvtrlista"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Az sszes ";
+ if (!extractAll) result+="dokumentlt ";
+ result+="nvtr listja rvid lersokkal:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Bartok"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Bart s kapcsold fggvnyek dokumentcija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" osztly"; break;
+ case ClassDef::Struct: result+=" struktra"; break;
+ case ClassDef::Union: result+=" uni"; break;
+ case ClassDef::Interface: result+=" interfsz"; break;
+ case ClassDef::Protocol: result+=" protocol"; break; // translate me!
+ case ClassDef::Category: result+=" category"; break; // translate me!
+ case ClassDef::Exception: result+=" kivtel"; break;
+ }
+ if (isTemplate) result+="sablon-";
+ result+="referencia";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" fjlreferencia";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" nvtr-referencia";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Publikus tagfggvnyek"; }
+ virtual QCString trPublicSlots()
+ { return "Publikus rsek"; }
+ virtual QCString trSignals()
+ { return "Szignlok"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statikus publikus tagfggvnyek"; }
+ virtual QCString trProtectedMembers()
+ { return "Vdett tagfggvnyek"; }
+ virtual QCString trProtectedSlots()
+ { return "Vdett rsek"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statikus vdett tagfggvnyek"; }
+ virtual QCString trPrivateMembers()
+ { return "Privt tagfggvnyek"; }
+ virtual QCString trPrivateSlots()
+ { return "Privt rsek"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statikus privt tagfggvnyek"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" s ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "sk: "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Leszrmazottak: "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "jraimplementlt sk: "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "jraimplementl leszrmazottak: "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Nvtrtagok"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Az sszes ";
+ if (!extractAll) result+="dokumentlt ";
+ result+="nvtr tagjainak listja, valamint hivatkozs ";
+ if (extractAll)
+ result+=" a megfelel nvtr dokumentcira minden tagnl:";
+ else
+ result+=" a nvterekre, amelynek tagjai:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Nvtrmutat"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Nvterek dokumentcija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Nvterek"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Ez a dokumentci ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="az osztlyrl"; break;
+ case ClassDef::Struct: result+="a struktrrl"; break;
+ case ClassDef::Union: result+="az unirl"; break;
+ case ClassDef::Interface: result+="az interfszrl"; break;
+ case ClassDef::Protocol: result+="protocol"; break; // translate me!
+ case ClassDef::Category: result+="category"; break; // translate me!
+ case ClassDef::Exception: result+="a kivtelrl"; break;
+ }
+ result+=" a kvetkez fjl";
+ if (!single) result+="ok";
+ result+=" alapjn kszlt:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Betrendes lista"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Visszatrsi rtkek"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Foldal"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "o."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definci a(z) @1 fjl @0. sorban.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definci a(z) @0 fjlban.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Ellenjavallt";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"A"+zed(clName[0])+clName+" osztly egyttmkdsi diagramja:";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"A"+zed(fName[0])+fName+" defincis fjl fggsi grfja:";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Konstruktorok s destruktorok dokumentcija";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Ugrs a fjl forrskdjhoz.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Ugrs a fjl dokumentcijhoz.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Elfelttel";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Utfelttel";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invarins";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Kezd rtk:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "forrskd";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Osztlyhierarchia-bra";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Ugrs az osztlyhierarchia-brhoz";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Ugrs az szveges osztlyhierarchihoz";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Oldalmutat";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Megjegyzs";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Publikus tpusok";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Adatmezk";
+ }
+ else
+ {
+ return "Publikus attribtumok";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statikus publikus attribtumok";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Vdett tpusok";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Vdett attribtumok";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statikus vdett attribtumok";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Privt tpusok";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Privt attribtumok";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statikus privt attribtumok";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "Tennival";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Tennivalk listja";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Hivatkozsok:";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Megjegyzsek";
+ }
+ virtual QCString trAttention()
+ {
+ return "Figyelem";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Ez az bra azt mutatja, hogy mely fjlok gyazzk be "
+ "kzvetve vagy kzvetlenl ezt a fjlt:";
+ }
+ virtual QCString trSince()
+ {
+ return "Elszr bevezetve";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Jelmagyarzat";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Ez az oldal elmagyarzza hogyan kell rtelmezni a "
+ "doxygen ltal ksztett brkat.<p>\n"
+ "Vegyk a kvetkez pldt:\n"
+ "\\code\n"
+ "/*! Vgs miatt nem lthat osztly */\n"
+ "class Invisible { };\n\n"
+ "/*! Levgott osztly, szrmazsa rejtett */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Doxygen kommentekkel nem dokumentlt osztly */\n"
+ "class Undocumented { };\n\n"
+ "/*! Publikus szrmaztatsal levezetett osztly */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Egy sablonosztly */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Vdett szrmaztatsal levezetett osztly */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Privt szrmaztatsal levezetett osztly */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Osztly, melyet a szrmaztatott osztly hasznl */\n"
+ "class Used { };\n\n"
+ "/*! Osztly, mely tbb msiknak leszrmazottja */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Ha a konfigurcis fjl \\c MAX_DOT_GRAPH_HEIGHT elemnek rtkt "
+ "240-re lltjuk, az eredmny a kvetkez bra lesz:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Az brn lev dobozok jelentse:\n"
+ "<ul>\n"
+ "<li>Kitlttt fekete doboz jelzi azt az osztlyt vagy struktrt,"
+ "amelyrl az bra szl.\n"
+ "<li>Fekete keret jelzi a dokumentlt osztlyokat s struktrkat.\n"
+ "<li>Szrke keret jelzi a nem dokumentlt osztlyokat s struktrkat.\n"
+ "<li>Piros keret jelzi azokat az osztlyokat s struktrkat, amelyeknl vgs miatt nem lthat "
+ "az sszes leszrmaztatsi kapcsolat. Egy bra vgsra kerl, ha nem fr bele "
+ "a megadott tartomnyba."
+ "</ul>\n"
+ "A nyilak jelentse:\n"
+ "<ul>\n"
+ "<li>Sttkk nyl jelzi a publikus szrmaztatst.\n"
+ "<li>Sttzld nyl jelzi a vdett szrmaztatst.\n"
+ "<li>Sttvrs nyl jelzi a privt szrmaztatst.\n"
+ "<li>Lila szaggatott nyl jelzi, ha az osztly egy msikat hasznl vagy tartalmaz. "
+ "A nyl felirata jelzi a vltoz(k) nevt, amelyeken keresztl a msik osztly kapcsoldik.\n"
+ "<li>Srga szaggatott nyl jelzi a kapcsolatot a sablonpldny s a pldnyostott "
+ "osztlysablon kztt. A nyl felirata jelzi a plny sablonparamtereit.\n"
+ "</ul>\n";
+
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "Jelmagyarzat";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Teszt";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Tesztlista";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP tagfggvnyek";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Tulajdonsgok";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Tulajdonsgok dokumentcijka";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Adatszerkezetek";
+ }
+ else
+ {
+ return "Osztlyok";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return name+(QCString)" csomag";
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Csomaglista";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "A csomagok rvid lersai (amennyiben lteznek):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Csomagok";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "rtk:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Hiba";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Hiba lista";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1250";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Trgymutat";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Osztly" : "osztly"));
+ //if (!singular) result+="es";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Fjl" : "fjl"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Nvtr" : "nvtr"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Csoport" : "csoport"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Oldal" : "oldal"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Tag" : "tag"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Globlis elem" : "globlis elem"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Szerz" : "szerz"));
+ if (!singular) result+="k";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Hivatkozsok";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Megvalstja a kvetkezket: "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Megvalstjk a kvetkezk: "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Tartalomjegyzk";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Ellenjavallt elemek listja";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Esemnyek";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Esemnyek dokumentcija";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Csomag tpusok";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Csomag fggvnyek";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statikus csomag fggvnyek";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Csomag attribtumok";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statikus csomag attribtumok";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "sszes";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "A fggvny hvsi grfja:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Keressi kulcs";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "A keress eredmnye";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Sajnos egy dokumentum sem felelt meg a keressi feltteleknek.";
+ }
+ else if (numDocuments==1)
+ {
+ return "<b>1</b> dokumentum felelt meg a keressi feltteleknek.";
+ }
+ else
+ {
+ return "<b>$num</b> dokumentum felelt meg a keressi feltteleknek."
+ "Elsnek a legjobb tallatok vannak feltntetve.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Tallatok:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " Forrsfjl";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Knyvtrhierarchia"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Knyvtrak dokumentcija"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Knyvtrak"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Majdnem (de nem teljesen) betrendbe szedett "
+ "knyvtrhierarchia:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" knyvtrreferencia"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Knyvtr" : "knyvtr"));
+ //if (singular) result+="y"; else result+="ies";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Ez egy tlterhelt tagfggvny."
+ "A fenti fggvnytl csak argumentumaiban klnbzik.";
+ }
+};
+
+#endif
diff --git a/src/translator_id.h b/src/translator_id.h
new file mode 100644
index 0000000..b139650
--- /dev/null
+++ b/src/translator_id.h
@@ -0,0 +1,1596 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_ID_H
+#define TRANSLATOR_ID_H
+
+/*!
+ Indonesian translator based on Doxygen 1.4.2.
+
+ \author Hendy Irawan <ceefour@gauldong.net>
+ */
+class TranslatorIndonesian : public TranslatorAdapter_1_4_6
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "indonesian"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[indonesian]{babel}";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-1";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Fungsi-fungsi Terkait"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Catatan: Fungsi-fungsi tersebut bukan fungsi anggota.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Keterangan Lengkap"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Dokumentasi Anggota: Tipe"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Dokumentasi Anggota: Enumerasi"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Dokumentasi Anggota: Fungsi"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dokumentasi Variabel";
+ }
+ else
+ {
+ return "Dokumentasi Anggota: Data";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Selengkapnya..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Daftar semua anggota."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Daftar anggota"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Berikut ini daftar lengkap anggota untuk "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", termasuk semua anggota yang diwariskan."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Dihasilkan secara otomatis oleh Doxygen";
+ if (s) result+=(QCString)" untuk "+s;
+ result+=" dari kode sumber.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "nama enumerasi"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "nilai enumerasi"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "didefinisikan di"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Modul"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Struktur Kelas"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Struktur Data";
+ }
+ else
+ {
+ return "Daftar Kelas";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Daftar File"; }
+
+ /*! This is put above each page as a link to the list of all verbatim headers */
+ virtual QCString trHeaderFiles()
+ { return "File Header"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Variabel Data";
+ }
+ else
+ {
+ return "Daftar Anggota: Kelas";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Daftar Global";
+ }
+ else
+ {
+ return "Daftar File";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Halaman Terkait"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Contoh"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Cari"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Struktur kelas ini diurutkan hampir sepenuhnya diurutkan berdasarkan abjad:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Berikut ini daftar seluruh file dengan penjelasan singkat";
+ if (!extractAll) result+=" yang didokumentasikan";
+ result += ":";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Berikut ini daftar struktur data beserta penjelasan singkat:";
+ }
+ else
+ {
+ return "Berikut ini daftar kelas, struktur, gabungan, dan interface beserta penjelasan singkat:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Berikut ini daftar seluruh ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="variabel struktur dan gabungan";
+ }
+ else
+ {
+ result+="kelas";
+ }
+ if (!extractAll)
+ {
+ result+=" yang didokumentasikan";
+ }
+ result+=" dengan link ke ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="dokumentasi struktur/gabungan untuk tiap variabel:";
+ }
+ else
+ {
+ result+="dokumentasi kelas untuk tiap anggota:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktur/gabungan induk:";
+ }
+ else
+ {
+ result+="kelas induk:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Berikut ini daftar ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="fungsi, variabel, konstanta, enumerasi, dan tipe";
+ }
+ else
+ {
+ result+="file";
+ }
+ if (!extractAll) result+=" yang didokumentasikan";
+ result+=" dengan link ke ";
+ if (extractAll)
+ result+="file induk:";
+ else
+ result+="dokumentasi:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all header files. */
+ virtual QCString trHeaderFilesDescription()
+ { return "Berikut ini daftar file header yang melingkupi API (Application Programming Interface) ini:"; }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Berikut ini daftar semua contoh:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Berikut ini daftar semua halaman dokumentasi yang terkait:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Berikut ini daftar semua modul:"; }
+
+ /*! This sentences is used in the annotated class/file lists if no brief
+ * description is given.
+ */
+ virtual QCString trNoDescriptionAvailable()
+ { return "Tidak ada keterangan tersedia"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentasi"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Indeks Modul"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Indeks Struktur Kelas"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Indeks Struktur Data";
+ }
+ else
+ {
+ return "Indeks Kelas";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Indeks File"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Dokumentasi Modul"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dokumentasi Struktur Data";
+ }
+ else
+ {
+ return "Dokumentasi Kelas";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Dokumentasi File"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Dokumentasi Contoh"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Dokumentasi Halaman"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Dokumentasi Referensi"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Konstanta"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Prototipe Fungsi"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Definisi Tipe"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumerasi"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Fungsi"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variabel"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Nilai enumerasi"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Dokumentasi Konstanta"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Dokumentasi Prototipe Fungsi"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Dokumentasi Definisi Tipe"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Dokumentasi Tipe Enumerasi"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Dokumentasi Nilai Enumerasi"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Dokumentasi Fungsi"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Dokumentasi Variabel"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Struktur Data";
+ }
+ else
+ {
+ return "Kelas";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Dihasilkan pada tanggal "+date;
+ if (projName) result+=(QCString)" untuk "+projName;
+ result+=(QCString)" oleh";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "ditulis oleh";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagram struktur kelas untuk "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Untuk kalangan sendiri."; }
+
+ /*! this text is generated when the \\reimp command is used. */
+ virtual QCString trReimplementedForInternalReasons()
+ { return "Di-reimplementasikan karena alasan internal; API tidak berubah."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Peringatan"; }
+
+ /*! this text is generated when the \\bug command is used. */
+ virtual QCString trBugsAndLimitations()
+ { return "Bug dan keterbatasan"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versi"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Tanggal"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Mengembalikan"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Lihat juga"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parameter"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Exception"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Dihasilkan oleh"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990307
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Daftar Namespace"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Berikut ini daftar namespace beserta keterangan singkat";
+ if (!extractAll) result+=" yang didokumentasikan";
+ result+=":";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Friend"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990405
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Dokumentasi Friend Dan Fungsi Terkait"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990425
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Kelas"; break;
+ case ClassDef::Struct: result+=" Struktur"; break;
+ case ClassDef::Union: result+=" Gabungan"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protokol"; break;
+ case ClassDef::Category: result+=" Kategori"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Referensi";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" Referensi File";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Referensi Namespace";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Fungsi Anggota Publik"; }
+ virtual QCString trPublicSlots()
+ { return "Slot Publik"; }
+ virtual QCString trSignals()
+ { return "Signal"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Fungsi Anggota Publik Statis"; }
+ virtual QCString trProtectedMembers()
+ { return "Fungsi Anggota Diproteksi"; }
+ virtual QCString trProtectedSlots()
+ { return "Slot Diproteksi"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Fungsi Anggota Diproteksi Statis"; }
+ virtual QCString trPrivateMembers()
+ { return "Fungsi Anggota Privat"; }
+ virtual QCString trPrivateSlots()
+ { return "Slot Privat"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Fungsi Anggota Privat Statis"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", dan ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Mewarisi "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Diwariskan ke "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Di-reimplementasikan dari "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Di-reimplementasikan di "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Anggota Namespace"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Berikut ini daftar anggota namespace ";
+ if (!extractAll) result+="yang didokumentasikan ";
+ result+="dengan link ke ";
+ if (extractAll)
+ result+="dokumentasi namespace untuk tiap anggota:";
+ else
+ result+="namespace induk:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Indeks Namespace"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Dokumentasi Namespace"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990522
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Daftar Namespace"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990728
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentasi untuk ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="kelas"; break;
+ case ClassDef::Struct: result+="struktur"; break;
+ case ClassDef::Union: result+="gabungan"; break;
+ case ClassDef::Interface: result+="interface"; break;
+ case ClassDef::Protocol: result+="protokol"; break;
+ case ClassDef::Category: result+="kategori"; break;
+ case ClassDef::Exception: result+="exception"; break;
+ }
+ result+=" ini dihasilkan dari file";
+ result+=single ? "" : "-file";
+ result+=" berikut:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Daftar Berdasarkan Abjad"; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-990901
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Nilai kembali"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Halaman Utama"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "hal."; }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-991003
+ //////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trSources()
+ {
+ return "Sumber";
+ }
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definisi pada baris @0 di file @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definisi pada baris @0.";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 0.49-991205
+ //////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Kadaluarsa";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.0.0
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagram kolaborasi untuk "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Diagram ketergantungan untuk "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Dokumentasi Konstruktor & Destruktor";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Ke kode sumber file ini.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Ke dokumentasi file ini.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Kondisi Awal";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Kondisi Akhir";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Nilai awal:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "kode";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Struktur Kelas Berbasis Grafis";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Ke struktur kelas berbasis grafis";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Ke struktur kelas berbasis teks";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Indeks Halaman";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.1.0
+ //////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Catatan";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Tipe Publik";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Variabel Data";
+ }
+ else
+ {
+ return "Atribut Publik";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Atribut Publik Statis";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Tipe Diproteksi";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Atribut Diproteksi";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Atribut Diproteksi Statis";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Tipe Privat";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Atribut Privat";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Atribut Privat Statis";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.1.3
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Tugas";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Daftar Tugas";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.1.4
+ //////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Direferensikan oleh";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Keterangan";
+ }
+ virtual QCString trAttention()
+ {
+ return "Perhatian";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Diagram ini menampilkan file-file yang membutuhkan file ini baik secara langsung maupun tidak langsung:";
+ }
+ virtual QCString trSince()
+ {
+ return "Sejak";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.1.5
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Legenda Diagram";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Halaman ini berisi keterangan cara membaca diagram yang dihasilkan "
+ "oleh doxygen.<p>\n"
+ "Contoh:\n"
+ "\\code\n"
+ "/*! Invisible class because of truncation */\n"
+ "class Invisible { };\n\n"
+ "/*! Truncated class, inheritance relation is hidden */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Class not documented with doxygen comments */\n"
+ "class Undocumented { };\n\n"
+ "/*! Class that is inherited using public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Class that is inherited using protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Class that is inherited using private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Class that is used by the Inherited class */\n"
+ "class Used { };\n\n"
+ "/*! Super class that inherits a number of other classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Apabila tag \\c MAX_DOT_GRAPH_HEIGHT di file konfigurasi "
+ "diset ke 240 kode di atas akan menghasilkan diagram berikut:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Kotak-kotak pada diagram di atas mempunyai arti sebagai berikut:\n"
+ "<ul>\n"
+ "<li>%Kotak hitam merupakan struktur atau kelas yang bersangkutan.\n"
+ "<li>%Kotak berbingkai hitam adalah struktur atau kelas yang mempunyai dokumentasi.\n"
+ "<li>%Kotak dengan bingkai abu-abu adalah struktur atau kelas tanpa dokumentasi.\n"
+ "<li>%Kotak dengan bingkai merah merupakan struktur atau kelas yang didokumentasikan tetapi"
+ "tidak semua relasinya ditampilkan. %Sebuah diagram "
+ "akan terpotong apabila lebih besar daripada ukuran yang ditentukan.\n"
+ "</ul>\n"
+ "Arti dari tanda-tanda panah adalah sebagai berikut:\n"
+ "<ul>\n"
+ "<li>%Panah biru tua menandakan pewarisan publik.\n"
+ "<li>%Panah hijau tua untuk pewarisan diproteksi.\n"
+ "<li>%Panah merah tua untuk pewarisan privat.\n"
+ "<li>%Panah ungu putus-putus menandakan kelas tersebut berhubungan dengan kelas lain. "
+ "Panah tersebut diberi judul sesuai dengan kelas atau struktur tujuan.\n"
+ "<li>%Panah kuning putus-putus menandakan hubungan antara sebuah template kelas dan "
+ "instance dari template tersebut. Panah tersebut diberi judul sesuai dengan "
+ "parameter template yang digunakan.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legenda";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.0
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Tes";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Daftar Tes";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.1
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Fungsi Anggota: DCOP";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.2
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Daftar Property";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Dokumentasi Property";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.4
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java interfaces in the summary section of Java packages */
+ virtual QCString trInterfaces()
+ {
+ return "Daftar Interface";
+ }
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Struktur Data";
+ }
+ else
+ {
+ return "Daftar Kelas";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paket "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Daftar Paket";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Berikut ini daftar paket beserta keterangan singkat (apabila tersedia):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Daftar Paket";
+ }
+ /*! Used as a chapter title for Latex & RTF output */
+ virtual QCString trPackageDocumentation()
+ {
+ return "Dokumentasi Paket";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Nilai:";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.5
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Bug";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Daftar Bug";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.6
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indeks";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Kelas" : "kelas"));
+ if (!singular) result+="-kelas";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "File" : "file"));
+ if (!singular) result+="-file";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Kelompok" : "kelompok"));
+ if (!singular) result+="-kelompok";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool )
+ {
+ QCString result((first_capital ? "Halaman" : "halaman"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool )
+ {
+ QCString result((first_capital ? "Anggota" : "anggota"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trField(bool first_capital, bool)
+ {
+ QCString result((first_capital ? "Variabel" : "variabel"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.7
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool)
+ {
+ QCString result((first_capital ? "Penulis" : "penulis"));
+ //if (!singular) result+="s";
+ return result;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.11
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referensi";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.13
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Mengimplementasikan "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Diimplementasikan di "+trWriteList(numEntries)+".";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.16
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Daftar Isi";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.17
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Daftar Kadaluarsa";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.2.18
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Event";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Dokumentasi Event";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Jenis Paket";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Daftar Fungsi Paket";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Daftar Fungsi Statis Paket";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Daftar Atribut Paket";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Daftar Atribut Statis Paket";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.1
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Semua";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Berikut ini diagram pemanggilan untuk fungsi ini:";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.3
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Cari";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Hasil Pencarian";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Maaf, tidak ada dokumen yang cocok.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Ditemukan <b>1</b> dokumen yang cocok.";
+ }
+ else
+ {
+ return "Ditemukan <b>$num</b> documents yang cocok. "
+ "Menampilkan hasil terbaik lebih awal.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Kecocokan:";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.8
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Kode Sumber:" + filename;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.3.9
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Struktur Direktori"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Dokumentasi Direktori"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Daftar Direktori"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Struktur direktori ini diurutkan hampir berdasarkan abjad:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result="Referensi Direktori "; result+=dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool)
+ {
+ QCString result((first_capital ? "Direktori" : "direktori"));
+ //if (singular) result+="y"; else result+="ies";
+ return result;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.4.1
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Ini adalah fungsi yang di-overload. Perbedaannya dengan fungsi di atas hanya pada "
+ "parameter-parameter yang diterima.";
+ }
+};
+
+#endif
diff --git a/src/translator_it.h b/src/translator_it.h
new file mode 100644
index 0000000..04a7f55
--- /dev/null
+++ b/src/translator_it.h
@@ -0,0 +1,1853 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2010 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/******************************************************************************
+ *
+ * Revision history
+ *
+ * 2010/08: updated translation of new items used since version 1.6.0 and 1.6.3
+ * completely reviewed the translation in the trLegendDocs() function
+ * corrected some typos all around
+ * reviewed some translations all around
+ * 2007/11: updated translation of new items used since version 1.5.4
+ * 2007/10: Included corrections provided by Arialdo Martini <arialdomartini@bebox.it>, updated some strings marked with 'translate me' comment
+ * 2006/10: made class to derive directly from Translator class (reported in Petr Prikryl October 9 translator report)
+ * 2006/06: updated translation of new items used since version 1.4.6
+ * 2006/05: translated new items used since version 1.4.6
+ * corrected typo in trPackageMembers method
+ * 2005/03: translated new items used since version 1.4.1
+ * removed unused methods listed in Petr Prikryl February 28 translator report
+ * 2004/09: translated new items used since version 1.3.9
+ * 2004/06: translated new items used since version 1.3.8
+ * 2003/11: translated new items used since version 1.3.3
+ * 2003/06: translated new items used since version 1.3.1
+ * 2003/04: translated new items used since version 1.3
+ * 2002/11: translated new items used since version 1.2.18
+ * 2002/08: translated new items used since version 1.2.17
+ * 2002/07: translated new items used since version 1.2.16
+ * 2002/06: modified trRelatedPagesDescription() method
+ * corrected typo in trInclByDepGraph() method
+ * 2002/01: translated new items used since version 1.2.13
+ * updated e-mail address
+ * 2001/11: corrected the translation fixing the issues reported by the translator.pl script
+ * translated new items used since version 1.2.11
+ * 2001/08: corrected the translation fixing the issues reported by the translator.pl script
+ * translated new items used since version 1.2.7
+ * 2001/05: adopted new translation mechanism (trough adapters),
+ * translated new items used since version 1.2.5 and 1.2.6,
+ * revised those function returning strings in OPTIMIZE_OTPUT_FOR_C case,
+ * corrections regarding the plurals of some english terms mantained in the translation,
+ * changed some terms to better suit the sense
+ * 2001/02: translated new items used since version 1.2.4
+ * 2000/11: modified slightly the translation in trLegendDocs() function,
+ * translated new items used since version 1.2.1 and 1.2.2
+ * 2000/08: translated new items used since version 1.1.3, 1.1.4, 1.1.5 and 1.2.0
+ * 2000/03: translated new items used since version 1.0 and 1.1.0
+ * 1999/19: entirely rewritten the translation to correct small variations due
+ * to feature additions and to conform to the layout of the latest
+ * commented translator.h for the english language
+ * 1999/09: corrected some small typos in the "new since 0.49-990425" section
+ * added the "new since 0.49-990728" section
+ * 1999/06: revised and completed by Alessandro Falappa (current mantainer)
+ * 1999/??: initial italian translation by Ahmed Aldo Faisal
+ */
+
+/******************************************************************************
+ *
+ * Note sui criteri adottati per la traduzione
+ *
+ * Nella traduzione non si sono tradotti alcuni termini inglesi ormai entrati
+ * a far parte del "gergo" informatico (per es. file o namespace)
+ *
+ * Il plurale dei termini inglesi non tradotti è stato reso con il singolare
+ * della parola inglese secondo una convenzione spesso ritrovata nella documentazione
+ * tecnica (ad es. "lista dei file" e non "lista dei files")
+ *
+ * Se avete suggerimenti sulla traduzione di alcuni termini o volete segnalare
+ * eventuali sviste potete scrivermi all'indirizzo: alessandro@falappa.net
+ */
+
+#ifndef TRANSLATOR_IT_H
+#define TRANSLATOR_IT_H
+
+class TranslatorItalian : public Translator
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "italian"; }
+
+ /*! Used to get the LaTeX command(s) for the language support. This method
+ * was designed for languages which do wish to use a babel package.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[italian]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "UTF-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ QCString trRelatedFunctions()
+ { return "Funzioni collegate"; }
+
+ /*! subscript for the related functions. */
+ QCString trRelatedSubscript()
+ { return "(Si noti che queste non sono funzioni membro.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ QCString trDetailedDescription()
+ { return "Descrizione dettagliata"; }
+
+ /*! header that is put before the list of typedefs. */
+ QCString trMemberTypedefDocumentation()
+ { return "Documentazione delle ridefinizioni dei tipi (typedef)"; }
+
+ /*! header that is put before the list of enumerations. */
+ QCString trMemberEnumerationDocumentation()
+ { return "Documentazione dei tipi enumerati (enum)"; }
+
+ /*! header that is put before the list of member functions. */
+ QCString trMemberFunctionDocumentation()
+ { return "Documentazione delle funzioni membro"; }
+
+ /*! header that is put before the list of member attributes. */
+ QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentazione dei campi";
+ }
+ else
+ {
+ return "Documentazione dei membri dato";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ QCString trMore()
+ { return "Continua..."; }
+
+ /*! put in the class documentation */
+ QCString trListOfAllMembers()
+ { return "Elenco di tutti i membri."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ QCString trMemberList()
+ { return "Elenco dei membri"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ QCString trThisIsTheListOfAllMembers()
+ { return "Questo è l'elenco completo di tutti i membri di "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ QCString trIncludingInheritedMembers()
+ { return ", inclusi tutti i membri ereditati."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ QCString trGeneratedAutomatically(const char *s)
+ {
+ QCString result="Generato automaticamente da Doxygen";
+ if (s) result+=(QCString)" per "+s;
+ result+=" a partire dal codice sorgente.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ QCString trEnumName()
+ { return "nome di tipo enumerato"; }
+
+ /*! put after an enum value in the list of all members */
+ QCString trEnumValue()
+ { return "valore di tipo enumerato"; }
+
+ /*! put after an undocumented member in the list of all members */
+ QCString trDefinedIn()
+ { return "definito in"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ QCString trModules()
+ { return "Moduli"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ QCString trClassHierarchy()
+ { return "Gerarchia delle classi"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Strutture dati";
+ }
+ else
+ {
+ return "Elenco dei tipi composti";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ QCString trFileList()
+ { return "Elenco dei file"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Campi dei dati";
+ }
+ else
+ {
+ return "Membri dei composti";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Elementi globali";
+ }
+ else
+ {
+ return "Elementi dei file";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ QCString trRelatedPages()
+ { return "Pagine collegate"; }
+
+ /*! This is put above each page as a link to all examples. */
+ QCString trExamples()
+ { return "Esempi"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ QCString trSearch()
+ { return "Cerca"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ QCString trClassHierarchyDescription()
+ {
+ return "Questo elenco di ereditarietà è ordinato "
+ "approssimativamente, ma non completamente, in ordine alfabetico:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Questo è un elenco ";
+ if (!extractAll) result+="dei file documentati ";
+ else result+="di tutti i file ";
+ result+="con una loro breve descrizione:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Queste sono le strutture dati con una loro breve descrizione:";
+ }
+ else
+ {
+ return "Queste sono le classi, le struct, le union e le interfacce con una loro breve descrizione:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Questo è un elenco ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ if (!extractAll) result+="delle struct e delle union documentate ";
+ else result+="di tutte le struct e le union ";
+ }
+ else
+ {
+ if (!extractAll) result+="dei membri documentati ";
+ else result+="di tutti i membri ";
+ }
+ result+="con collegamenti alla documentazione ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ if (extractAll) result+="della struct/union per ciascun campo:";
+ else result+="delle struct/union a cui appartengono:";
+ }
+ else
+ {
+ if (extractAll) result+="della classe a cui appartengono:";
+ else result+="delle classi a cui appartengono:";
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Questo è un elenco ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ if (!extractAll) result+="delle funzioni, delle variabili, delle define, dei tipi enumerati e delle ridefinizioni dei tipi (typedef) documentate ";
+ else result+="di tutte le funzioni, variabili, define, tipi enumerati, e ridefinizioni dei tipi (typedef) ";
+ }
+ else
+ {
+ if (!extractAll) result+="degli elementi documentati dei file ";
+ else result+="di tutti gli elementi dei file ";
+ }
+ result+="con collegamenti alla documentazione";
+ if (extractAll) result+=" del file a cui appartengono:";
+ else result+=":";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ QCString trExamplesDescription()
+ { return "Questo è l'elenco di tutti gli esempi:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ QCString trRelatedPagesDescription()
+ { return "Questo è l'elenco di tutte le pagine di documentazione collegate:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ QCString trModulesDescription()
+ { return "Questo è l'elenco di tutti i moduli:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ QCString trDocumentation()
+ { return "Documentazione"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ QCString trModuleIndex()
+ { return "Indice dei moduli"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ QCString trHierarchicalIndex()
+ { return "Indice della gerarchia"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Indice delle strutture dati";
+ }
+ else
+ {
+ return "Indice dei tipi composti";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ QCString trFileIndex()
+ { return "Indice dei file"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ QCString trModuleDocumentation()
+ { return "Documentazione dei moduli"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ QCString trClassDocumentation()
+ { return "Documentazione delle classi"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ QCString trFileDocumentation()
+ { return "Documentazione dei file"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ QCString trExampleDocumentation()
+ { return "Documentazione degli esempi"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ QCString trPageDocumentation()
+ { return "Documentazione delle pagine tra loro collegate "; }
+
+ /*! This is used in LaTeX as the title of the document */
+ QCString trReferenceManual()
+ { return "Manuale di riferimento"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ QCString trDefines()
+ { return "Definizioni"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ QCString trFuncProtos()
+ { return "Prototipi delle funzioni"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ QCString trTypedefs()
+ { return "Ridefinizioni di tipo (typedef)"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ QCString trEnumerations()
+ { return "Tipi enumerati (enum)"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ QCString trFunctions()
+ { return "Funzioni"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ QCString trVariables()
+ { return "Variabili"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ QCString trEnumerationValues()
+ { return "Valori del tipo enumerato"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ QCString trDefineDocumentation()
+ { return "Documentazione delle definizioni"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ QCString trFunctionPrototypeDocumentation()
+ { return "Documentazione dei prototipi delle funzioni"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ QCString trTypedefDocumentation()
+ { return "Documentazione delle ridefinizioni di tipo (typedef)"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ QCString trEnumerationTypeDocumentation()
+ { return "Documentazione dei tipi enumerati"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ QCString trFunctionDocumentation()
+ { return "Documentazione delle funzioni"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ QCString trVariableDocumentation()
+ { return "Documentazione delle variabili"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Strutture dati";
+ }
+ else
+ {
+ return "Composti";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generato "+date;
+ if (projName) result+=(QCString)" per "+projName;
+ result+=(QCString)" da";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ QCString trWrittenBy()
+ {
+ return "scritto da";
+ }
+
+ /*! this text is put before a class diagram */
+ QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagramma delle classi per "+clName;
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ QCString trForInternalUseOnly()
+ { return "Solo per uso interno."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ QCString trWarning()
+ { return "Avvertimento"; }
+
+ /*! this text is generated when the \\version command is used. */
+ QCString trVersion()
+ { return "Versione"; }
+
+ /*! this text is generated when the \\date command is used. */
+ QCString trDate()
+ { return "Data"; }
+
+ /*! this text is generated when the \\return command is used. */
+ QCString trReturns()
+ { return "Restituisce"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ QCString trSeeAlso()
+ { return "Si veda anche"; }
+
+ /*! this text is generated when the \\param command is used. */
+ QCString trParameters()
+ { return "Parametri"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ QCString trExceptions()
+ { return "Eccezioni"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ QCString trGeneratedBy()
+ { return "Generato da"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ QCString trNamespaceList()
+ { return "Lista dei namespace"; }
+
+ /*! used as an introduction to the namespace list */
+ QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Questa è l'elenco ";
+ if (!extractAll) result+="dei namespace documentati, ";
+ else result+="di tutti i namespace ";
+ result+="con una loro breve descrizione:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ QCString trFriends()
+ { return "Friend"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ QCString trRelatedFunctionDocumentation()
+ { return "Documentazione dei friend e delle funzioni collegate"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Riferimenti per ";
+ if (isTemplate) result="Template per ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="la classe "; break;
+ case ClassDef::Struct: result+="la struct "; break;
+ case ClassDef::Union: result+="la union "; break;
+ case ClassDef::Interface: result+="l'interfaccia "; break;
+ case ClassDef::Protocol: result+="il protocollo "; break;
+ case ClassDef::Category: result+="la categoria "; break;
+ case ClassDef::Exception: result+="l'eccezione "; break;
+ }
+ result+=(QCString)clName;
+ return result;
+
+ }
+
+ /*! used as the title of the HTML page of a file */
+ QCString trFileReference(const char *fileName)
+ {
+ QCString result="Riferimenti per il file ";
+ result+=(QCString)fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result="Riferimenti per il namespace ";
+ result+=(QCString)namespaceName;
+ return result;
+ }
+
+ /* these are for the member sections of a class, struct or union */
+ QCString trPublicMembers()
+ { return "Membri pubblici"; }
+ QCString trPublicSlots()
+ { return "Slot pubblici"; }
+ QCString trSignals()
+ { return "Signal"; }
+ QCString trStaticPublicMembers()
+ { return "Membri pubblici statici"; }
+ QCString trProtectedMembers()
+ { return "Membri protetti"; }
+ QCString trProtectedSlots()
+ { return "Slot protetti"; }
+ QCString trStaticProtectedMembers()
+ { return "Membri protetti statici"; }
+ QCString trPrivateMembers()
+ { return "Membri privati"; }
+ QCString trPrivateSlots()
+ { return "Slot privati"; }
+ QCString trStaticPrivateMembers()
+ { return "Membri privati statici"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", e ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ QCString trInheritsList(int numEntries)
+ {
+ return "Eredita da "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ QCString trInheritedByList(int numEntries)
+ {
+ return "Base per "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplementa "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementata in "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ QCString trNamespaceMembers()
+ { return "Membri dei namespace"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Questa è la lista ";
+ if (!extractAll) result+="dei membri documentati del namespace, ";
+ else result+="di tutti i membri del namespace ";
+ result+="con collegamenti ";
+ if (extractAll)
+ result+="alla documentazione del namespace per ciascun membro:";
+ else
+ result+="ai namespace a cui appartengono:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ QCString trNamespaceIndex()
+ { return "Indice dei namespace"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ QCString trNamespaceDocumentation()
+ { return "Documentazione dei namespace"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ QCString trNamespaces()
+ { return "Namespace"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"La documentazione per quest";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="a classe"; break;
+ case ClassDef::Struct: result+="a struct"; break;
+ case ClassDef::Union: result+="a union"; break;
+ case ClassDef::Interface: result+="a interfaccia"; break;
+ case ClassDef::Protocol: result+="o protocollo"; break;
+ case ClassDef::Category: result+="a categoria"; break;
+ case ClassDef::Exception: result+="a eccezione"; break;
+ }
+ result+=" è stata generata a partire ";
+ if (single) result+="dal seguente file:";
+ else result+="dai seguenti file:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ QCString trAlphabeticalList()
+ { return "Lista in ordine alfabetico";}
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ QCString trReturnValues()
+ { return "Valori di ritorno"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ QCString trMainPage()
+ { return "Pagina Principale"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ QCString trPageAbbreviation()
+ { return "pag."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definizione alla linea @0 del file @1.";
+ }
+ QCString trDefinedInSourceFile()
+ {
+ return "Definizione nel file @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDeprecated()
+ {
+ return "Deprecato";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagramma di collaborazione per "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Grafo delle dipendenze di inclusione per "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ QCString trConstructorDocumentation()
+ {
+ return "Documentazione dei costruttori e dei distruttori";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ QCString trGotoSourceCode()
+ {
+ return "Vai al codice sorgente di questo file.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ QCString trGotoDocumentation()
+ {
+ return "Vai alla documentazione di questo file.";
+ }
+ /*! Text for the \\pre command */
+ QCString trPrecondition()
+ {
+ return "Precondizione";
+ }
+ /*! Text for the \\post command */
+ QCString trPostcondition()
+ {
+ return "Postcondizione";
+ }
+ /*! Text for the \\invariant command */
+ QCString trInvariant()
+ {
+ return "Invariante";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ QCString trInitialValue()
+ {
+ return "Valore iniziale:";
+ }
+ /*! Text used the source code in the file index */
+ QCString trCode()
+ {
+ return "codice";
+ }
+ QCString trGraphicalHierarchy()
+ {
+ return "Grafico della gerarchia delle classi";
+ }
+ QCString trGotoGraphicalHierarchy()
+ {
+ return "Vai al grafico della gerarchia delle classi";
+ }
+ QCString trGotoTextualHierarchy()
+ {
+ return "Vai alla gerarchia delle classi (testuale)";
+ }
+ QCString trPageIndex()
+ {
+ return "Indice delle pagine";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNote()
+ {
+ return "Nota";
+ }
+ QCString trPublicTypes()
+ {
+ return "Tipi pubblici";
+ }
+ QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Campi";
+ }
+ else
+ {
+ return "Attributi pubblici";
+ }
+ }
+
+ QCString trStaticPublicAttribs()
+ {
+ return "Attributi pubblici statici";
+ }
+ QCString trProtectedTypes()
+ {
+ return "Tipi protetti";
+ }
+ QCString trProtectedAttribs()
+ {
+ return "Attributi protetti";
+ }
+ QCString trStaticProtectedAttribs()
+ {
+ return "Attributi protetti statici";
+ }
+ QCString trPrivateTypes()
+ {
+ return "Tipi privati";
+ }
+ QCString trPrivateAttribs()
+ {
+ return "Attributi privati";
+ }
+ QCString trStaticPrivateAttribs()
+ {
+ return "Attributi privati statici";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "Da fare";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Elenco delle cose da fare";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referenziato da";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Osservazioni";
+ }
+ virtual QCString trAttention()
+ {
+ return "Attenzione";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Questo grafo mostra quali altri file includono direttamente o indirettamente questo file:";
+ }
+ virtual QCString trSince()
+ {
+ return "A partire da";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Legenda del grafo";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Questa pagina spiega come interpretare i grafi generati da doxygen.<p>\n"
+ "Si consideri l'esempio seguente:\n"
+ "\\code\n"
+ "/*! Classe invisibile per troncamento */\n"
+ "class Invisible { };\n\n"
+ "/*! Classe tronca, la relazione di ereditarietà è nascosta */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Classe non documentata con i commenti speciali di doxygen*/\n"
+ "class Undocumented { };\n\n"
+ "/*! Classe estesa mediante ereditarietà pubblica */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Classe templatizzata */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Classe estesa mediante ereditarietà protetta*/\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Classe estesa mediante ereditarietà privata*/\n"
+ "class PrivateBase { };\n\n"
+ "/*! Classe utilizzata dalla classe Inherited */\n"
+ "class Used { };\n\n"
+ "/*! Classe che eredita da varie classi*/\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Verrà prodotto il grafo seguente:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n"
+ "<p>\n"
+ "I riquadri nel grafo qui sopra hanno il seguente significato:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>Il riquadro grigio pieno rappresenta la struct o la classe per la quale il grafo è stato generato.</li>\n"
+ "<li>Un riquadro con un bordo nero denota una struct o una classe documentata.</li>\n"
+ "<li>Un riquadro con un bordo grigio indica una struct o una classe non documentata.</li>\n"
+ "<li>Un riquadro con un bordo rosso indica una struct o una classe per la quale non sono mostrate tutte le relazioni di ereditarietà/contenimento (un grafo viene troncato se non rientra nei limiti prestabiliti).</li>\n"
+ "</ul>\n"
+ "<p>\n"
+ "Le frecce hanno il seguente significato:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>Una freccia blu scuro indica una relazione di ereditarietà pubblica tra due classi.</li>\n"
+ "<li>Una freccia verde indica un'ereditarietà protetta.</li>\n"
+ "<li>Una freccia rossa indica un'ereditarietà privata.</li>\n"
+ "<li>Una freccia viola tratteggiata indica che una classe è contenuta o usata da un'altra classe."
+ " La freccia viene etichettata con la o le variabili attraverso cui la struct o la classe puntata dalla freccia è accessibile.</li>\n"
+ "<li>Una freccia gialla tratteggiata indica la relazione tra una istanza di un template e la classe templatizzata da cui è stata istanziata."
+ " La freccia viene etichettata con i parametri di template dell'istanza.</li>\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Lista dei test";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Metodi DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Proprietà";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Documentazione delle proprietà";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Strutture dati";
+ }
+ else
+ {
+ return "Classi";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Package "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Lista dei package";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Questi sono i package e una loro breve descrizione (se disponibile):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Package";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Valore:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Bug";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Lista dei bug";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indice";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Class" : "class"));
+ result+=(singular ? "e" : "i");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool)
+ {
+ QCString result((first_capital ? "File" : "file"));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grupp" : "grupp"));
+ result+=(singular ? "o" : "i");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Pagin" : "pagin"));
+ result+=(singular ? "a" : "e");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Membr" : "membr"));
+ result+=(singular ? "o" : "i");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ result+=(singular ? "e" : "i");
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autor" : "autor"));
+ result+=(singular ? "e" : "i");
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referenzia";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementa "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implementation this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementato in "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Sommario";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Lista degli elementi deprecati";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Eventi";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Documentazione degli eventi";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Tipi con visibilità di package";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funzioni con visibilità di package";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Funzioni statiche con visibilità di package";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Attributi con visibilità di package";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Attributi statici con visibilità di package";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Tutto";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Questo è il grafo delle chiamate per questa funzione:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Cerca";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Risultati della ricerca";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Nessun documento soddisfa la tua richiesta.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Trovato <b>1</b> documento che soddisfa la tua richiesta.";
+ }
+ else
+ {
+ return "Trovati <b>$num</b> documenti che soddisfano la tua richiesta. "
+ "Le corrispondenze migliori sono in testa.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Corrispondenze:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return " File sorgente " + filename ;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Gerarchia delle directory"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Documentazione delle directory"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Directory"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Questa gerarchia di directory è approssimativamente, "
+ "ma non completamente, ordinata in ordine alfabetico:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result="Riferimenti per la directory "; result+=dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool)
+ {
+ QCString result((first_capital ? "Directory" : "directory"));
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Questa è una funzione membro sovraccaricata (overloaded), "
+ "fornita per comodità. Differisce dalla funzione di cui sopra "
+ "unicamente per gli argomenti passati.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Questo è il grafo dei chiamanti di questa funzione:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Documentazione dei tipi enumerati"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Documentazione delle funzioni membro/subroutine"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Elenco dei tipi di dato"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Membri dei tipi di dato"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Questi sono i tipi dato con una loro breve descrizione:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Questa è una lista di tutti i membri ";
+ if (!extractAll)
+ {
+ result+="documentati ";
+ }
+ result+="dei tipi di dato con collegamenti ";
+ if (!extractAll)
+ {
+ result+="alla documentazione della struttura dati per ciascun membro:";
+ }
+ else
+ {
+ result+="ai tipi dato a cui appartengono:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Indice dei tipi dati"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Documentazione dei tipi dato"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funzioni/Subroutine"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Documentazione funzioni/subroutine"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Tipi di dato"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Elenco dei moduli"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Questa è una lista di tutti i moduli ";
+ if (!extractAll) result+="documentati ";
+ result+="con una loro breve descrizione:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Riferimenti per ";
+ if (isTemplate) result="Template per ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" il modulo"; break;
+ case ClassDef::Struct: result+=" il tipo dato"; break;
+ case ClassDef::Union: result+=" l'union"; break;
+ case ClassDef::Interface: result+=" l'nterfaccia"; break;
+ case ClassDef::Protocol: result+=" il protocollo"; break;
+ case ClassDef::Category: result+=" la categoria"; break;
+ case ClassDef::Exception: result+=" l'eccezione"; break;
+ }
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result="Riferimenti per il modulo ";
+ result+=namespaceName;
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Membri del modulo"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Questo è un elenco di tutti i membri dei moduli ";
+ if (!extractAll) result+="documentati ";
+ result+="con collegamenti ";
+ if (extractAll)
+ {
+ result+="alla documentazione del modulo per ciascun membro:";
+ }
+ else
+ {
+ result+="al modulo a cui appartengono:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Indice dei moduli"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modul" : "modul"));
+ if (singular) result+="o";
+ else result+="i";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"La documentazione per quest";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="o modulo"; break;
+ case ClassDef::Struct: result+="o tipo"; break;
+ case ClassDef::Union: result+="a union"; break;
+ case ClassDef::Interface: result+="a interfaccia"; break;
+ case ClassDef::Protocol: result+="o protocollo"; break;
+ case ClassDef::Category: result+="a categoria"; break;
+ case ClassDef::Exception: result+="a eccezione"; break;
+ }
+ result+=" è stata generata a partire ";
+ if (single) result+="dal seguente file:"; else result+="dai seguenti file:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tip" : "tip"));
+ if (singular) result+="o";
+ else result+="i";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Sottoprogramm" : "sottoprogramm"));
+ if (singular) result+="a";
+ else result+="i";
+ return result;
+ }
+
+ /*! C# Type Contraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Vincoli dei tipi";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Relazione per "+QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Caricamento in corso...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Namespace globale";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Ricerca in corso...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Nessun risultato";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Grafo di dipendenza delle directory per "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"File in "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Include il file in "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Lun","Mar","Mer","Gio","Ven","Sab","Dom" };
+ static const char *months[] = { "Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic" };
+ QCString sdate;
+ sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+};
+
+#endif
+
diff --git a/src/translator_je.h b/src/translator_je.h
new file mode 100644
index 0000000..1368e6f
--- /dev/null
+++ b/src/translator_je.h
@@ -0,0 +1,67 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/*
+ * translator_jp.h
+ *
+ * 1.2.5)
+ * First Translation
+ * by Kenji Nagamatsu
+ * 1.2.12)
+ * Update and Shift-Jis(_WIN32)
+ * by Ryunosuke Sato (30-Dec-2001)
+ */
+
+#ifndef TRANSLATOR_JE_H
+#define TRANSLATOR_JE_H
+
+class TranslatorJapaneseEn : public TranslatorEnglish
+{
+ public:
+ virtual QCString idLanguage()
+ { return "japanese-en"; }
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "platex";
+ }
+ /*! returns the name of the package that is included by LaTeX */
+ virtual QCString idLanguageCharset()
+ {
+ //if (Config_getBool("USE_WINDOWS_ENCODING"))
+ //{
+ // return "Shift_JIS";
+ //}
+ //else
+ //{
+ return "euc-jp";
+ //}
+ }
+ virtual QCString trRTFansicp()
+ {
+ return "932";
+ }
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "128";
+ }
+};
+
+#endif
diff --git a/src/translator_jp.h b/src/translator_jp.h
new file mode 100644
index 0000000..fb01d2a
--- /dev/null
+++ b/src/translator_jp.h
@@ -0,0 +1,1772 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/*
+ * translator_jp.h
+ * Updates:
+ * 1.2.5)
+ * First Translation
+ * by Kenji Nagamatsu
+ * 1.2.12)
+ * Update and Shift-Jis(_WIN32)
+ * by Ryunosuke Sato (30-Dec-2001)
+ * 1.5.8)
+ * Translation for 1.5.8.
+ * by Hiroki Iseri (18-Feb-2009)
+ */
+
+#ifndef TRANSLATOR_JP_H
+#define TRANSLATOR_JP_H
+
+class TranslatorJapanese : public TranslatorAdapter_1_6_0
+{
+ private:
+ /*! The decode() can change euc into sjis */
+ inline QCString decode(const QCString & sInput)
+ {
+ //if (Config_getBool("USE_WINDOWS_ENCODING"))
+ //{
+ // return JapaneseEucToSjis(sInput);
+ //}
+ //else
+ //{
+ return sInput;
+ //}
+ }
+ public:
+ virtual QCString idLanguage()
+ { return "japanese"; }
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "";
+ }
+ /*! returns the name of the package that is included by LaTeX */
+ virtual QCString idLanguageCharset()
+ {
+ //if (Config_getBool("USE_WINDOWS_ENCODING"))
+ //{
+ // return "Shift_JIS";
+ //}
+ //else
+ //{
+ return "euc-jp";
+ //}
+ }
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return decode("Ϣؿ"); }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return decode("ʤϥ᥽åɤǤʤȤա"); }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return decode(""); }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return decode(""); }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return decode(""); }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ {
+ if( Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ return decode("᥽å");
+ }
+ else
+ {
+ return decode("ؿ");
+ }
+ }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if( Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("¤");
+ }
+ else
+ {
+ return decode("ѿ");
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return decode("[ܺ]"); }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return decode("٤ƤΥа"); }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return decode("а"); }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return decode("ФΰǤ"); }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return decode("ѾФޤǤޤ"); }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result;
+ if (s) result=(QCString)s+decode("");
+ result+=decode(" Doxygen ˤޤ");
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return decode("Enum"); }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return decode("Enum "); }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return decode("Ƥޤ"); }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return decode("⥸塼"); }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return decode("饹"); }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("ǡ¤");
+ }
+ else
+ {
+ return decode("");
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return decode("ե"); }
+
+ /*! This is put above each page as a link to the list of all verbatim headers */
+ virtual QCString trHeaderFiles()
+ { return decode("إåե"); }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("ǡե");
+ }
+ else
+ {
+ return decode("");
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("Х");
+ }
+ else
+ {
+ return decode("ե");
+ }
+ }
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return decode("Ϣڡ"); }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return decode(""); }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return decode(""); }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return decode("ηѾϤޤˤϥȤƤޤ"
+ "˥ե٥åȽǥȤƤϤޤ");
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool /*extractAll*/)
+ {
+ QCString result=decode("");
+ result+=decode("եǤ");
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("ǡ¤Ǥ");
+ }
+ else
+ {
+ return decode("饹¤ΡΡ󥿥եǤ");
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result=decode("");
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=decode("եɤΰǤ줾");
+ if (extractAll) result+=decode("°Ƥ빽¤/");
+ }
+ else
+ {
+ result+=decode("饹Фΰǡ줾");
+ if (extractAll) result+=decode("°Ƥ륯饹");
+ }
+ result+=decode("إ󥯤Ƥޤ");
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool /*extractAll*/)
+ {
+ QCString result=decode("");
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=decode("ؿѿޥEnumTypedef ");
+ }
+ else
+ {
+ result+=decode("եФ");
+ }
+ result+=decode("Ǥ줾줬°Ƥեإ󥯤Ƥޤ");
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all header files. */
+ virtual QCString trHeaderFilesDescription()
+ { return decode("APIإåեǤ"); }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return decode("٤ƤΰǤ"); }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return decode("ϢڡΰǤ"); }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return decode("٤ƤΥ⥸塼ΰǤ"); }
+
+ /*! This sentences is used in the annotated class/file lists if no brief
+ * description is given.
+ */
+ virtual QCString trNoDescriptionAvailable()
+ { return decode("ɥȤҤƤޤ"); }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return decode("ɥ"); }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return decode("⥸塼"); }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return decode("غ"); }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("ǡ¤");
+ }
+ else
+ {
+ return decode("");
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return decode("ե"); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return decode("⥸塼"); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("ǡ¤");
+ }
+ else
+ {
+ return decode("饹");
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return decode("ե"); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return decode(""); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return decode("ڡ"); }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return decode("ե󥹥ޥ˥奢"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return decode("ޥ"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return decode("ؿץȥ"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return decode(""); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return decode(""); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return decode("ؿ"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return decode("ѿ"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return decode("󷿤"); }
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return decode("ޥ"); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return decode("ؿץȥ"); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return decode(""); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return decode(""); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return decode("ؿ"); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return decode("ѿ"); }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("ǡ¤");
+ }
+ else
+ {
+ return decode("");
+ }
+ }
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result;
+ if (projName) result+=(QCString)projName+decode("Ф");
+ result+=(QCString)date+decode("ޤ");
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return decode("");
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)clName+decode("ФѾ");
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return decode("ѤΤߡ"); }
+
+ /*! this text is generated when the \\reimp command is used. */
+ virtual QCString trReimplementedForInternalReasons()
+ { return decode("ŪͳˤƼޤAPIˤϱƶޤ");
+ }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return decode("ٹ"); }
+
+ /*! this text is generated when the \\bug command is used. */
+ virtual QCString trBugsAndLimitations()
+ { return decode("Х"); }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return decode("С"); }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return decode(""); }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return decode(""); }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return decode(""); }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return decode(""); }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return decode("㳰"); }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return decode(""); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return decode("͡ॹڡ"); }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool /*extractAll*/)
+ {
+ QCString result=decode("");
+ result+=decode("͡ॹڡΰǤ");
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return decode("ե"); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return decode("եɤȴϢؿ"); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=decode("饹 "); break;
+ case ClassDef::Struct: result+=decode("¤ "); break;
+ case ClassDef::Union: result+=decode(" "); break;
+ case ClassDef::Interface: result+=decode("󥿥ե "); break;
+ case ClassDef::Protocol: result+=decode("ץȥ "); break;
+ case ClassDef::Category: result+=decode("ƥ "); break;
+ case ClassDef::Exception: result+=decode("㳰 "); break;
+ }
+ if (isTemplate) result+=decode("ƥץ졼 ");
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=decode("")+(QCString)fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=decode("͡ॹڡ ")+(QCString)namespaceName;
+ return result;
+ }
+
+ /* these are for the member sections of a class, struct or union */
+ virtual QCString trPublicMembers()
+ { return decode("Public ᥽å"); }
+ virtual QCString trPublicSlots()
+ { return decode("Public å"); }
+ virtual QCString trSignals()
+ { return decode("ʥ"); }
+ virtual QCString trStaticPublicMembers()
+ { return decode("Static Public ᥽å"); }
+ virtual QCString trProtectedMembers()
+ { return decode("Protected ᥽å"); }
+ virtual QCString trProtectedSlots()
+ { return decode("Protected å"); }
+ virtual QCString trStaticProtectedMembers()
+ { return decode("Static Protected ᥽å"); }
+ virtual QCString trPrivateMembers()
+ { return decode("Private ᥽å"); }
+ virtual QCString trPrivateSlots()
+ { return decode("Private å"); }
+ virtual QCString trStaticPrivateMembers()
+ { return decode("Static Private ᥽å"); }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=decode(", ");
+ else // the fore last entry
+ result+=decode(", ");
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return trWriteList(numEntries)+decode("ѾƤޤ");
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return trWriteList(numEntries)+decode("˷ѾƤޤ");
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return trWriteList(numEntries)+decode("Ƥޤ");
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return trWriteList(numEntries)+decode("ǺƤޤ");
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return decode("͡ॹڡ"); }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result=decode("");
+ result+=decode("͡ॹڡΰǤ줾");
+ if (extractAll)
+ result+=decode("Υ͡ॹڡ");
+ else
+ result+=decode("°Ƥ͡ॹڡ");
+ result+=decode("إ󥯤Ƥޤ");
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return decode("͡ॹڡ"); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return decode("͡ॹڡ"); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return decode("͡ॹڡ"); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)decode("");
+ switch(compType)
+ {
+ case ClassDef::Class: result+=decode("饹"); break;
+ case ClassDef::Struct: result+=decode("¤"); break;
+ case ClassDef::Union: result+=decode(""); break;
+ case ClassDef::Interface: result+=decode("󥿥ե"); break;
+ case ClassDef::Protocol: result+=decode("ץȥ"); break;
+ case ClassDef::Category: result+=decode("ƥ"); break;
+ case ClassDef::Exception: result+=decode("㳰"); break;
+ }
+ result+=decode("ϼΥե뤫ޤ:");
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return decode("ե٥åȽ"); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return decode(""); }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return decode("ᥤڡ"); }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return decode("p."); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trSources()
+ {
+ return decode("");
+ }
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return decode(" @1 @0 ԤƤޤ");
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return decode(" @0 Ƥޤ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return decode("侩");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)clName+decode("Υܥ졼");
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)fName+decode("Υ󥯥롼ɰ¸ط");
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return decode("󥹥ȥ饯ȥǥȥ饯");
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return decode("ɤ򸫤롣");
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return decode("򸫤롣");
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return decode("");
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return decode("");
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return decode("");
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return decode(":");
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return decode("");
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return decode("饹ؿ");
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return decode("饹ؿޤ򸫤롣");
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return decode("饹ؿޤ򸫤롣");
+ }
+ virtual QCString trPageIndex()
+ {
+ return decode("ڡ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return decode("Ф");
+ }
+ virtual QCString trPublicTypes()
+ {
+ return decode("Public ");
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("ѿ");
+ }
+ else
+ {
+ return decode("Public ѿ");
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return decode("Static Public ѿ");
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return decode("Protected ");
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return decode("Protected ѿ");
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return decode("Static Protected ѿ");
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return decode("Private ");
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return decode("Private ѿ");
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return decode("Static Private ѿ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return decode("TODO");
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return decode("TODO");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return decode("ȸ");
+ }
+ virtual QCString trRemarks()
+ {
+ return decode("ո");
+ }
+ virtual QCString trAttention()
+ {
+ return decode("");
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return decode("ΥդϡɤΥե뤫ľܡŪ"
+ "󥯥롼ɤƤ뤫򼨤Ƥޤ");
+ }
+ virtual QCString trSince()
+ {
+ return decode("");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return decode("դ");
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ decode("ΥڡǤϡdoxygen 줿դɤΤ褦ˤߤ褤"
+ "ޤ<p>\n"
+ "ͤƤߤޤ\n"
+ "\\code\n"
+ "/*! άƸʤ饹 */\n"
+ "class Invisible { };\n\n"
+ "/*! ά줿饹(ѾطϱƤ) */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* doxygen ȤˤɥȤʤ饹 */\n"
+ "class Undocumented { };\n\n"
+ "/*! public ǷѾ줿饹 */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! protected ǷѾ줿饹 */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! private ǷѾ줿饹 */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Ѿ줿饹ǻȤƤ륯饹 */\n"
+ "class Used { };\n\n"
+ "/*! ʣΥ饹ѾƤ̥饹 */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "եǡ \\c MAX_DOT_GRAPH_HEIGHT 200 ˥åȤ줿"
+ "硢Τ褦ʥդȤʤޤ"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "ΥΥܥåˤϼΤ褦ʰ̣ޤ\n"
+ "<ul>\n"
+ "<li>ɤĤ֤줿ܥåϡΥդб빽¤Τ䥯饹"
+ "ɽޤ\n"
+ "<li>ȤΥܥåϥɥȤ빽¤Τ䥯饹ɽޤ\n"
+ "<li>ȤΥܥåϥɥȤʤ¤Τ䥯饹ɽޤ\n"
+ "<li>ȤΥܥåϥɥȤ빽¤Τ䥯饹ɽޤ"
+ "ꤵ줿˼ޤʤ˷Ѿ޴ط򤹤٤ƿ޼"
+ "ȤǤʤäȤ򼨤ޤ"
+ "</ul>\n"
+ "ˤϼΤ褦ʰ̣ޤ\n"
+ "<ul>\n"
+ "<li>ĤĤΥ饹֤ public Ѿط򼨤ޤ\n"
+ "<li>Ф protected Ѿط򼨤ޤ\n"
+ "<li>֤ private Ѿط򼨤ޤ\n"
+ "<li>ϡΥ饹¾Υ饹˴ޤޤƤꡢ"
+ "ѤƤ뤳Ȥ򼨤ޤޤؤƤ륯饹乽¤Τ"
+ "ɤѿǥǤ뤫Υ٥ȤƼƤޤ\n"
+ "</ul>\n");
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return decode("");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return decode("ƥ");
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return decode("ƥȰ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return decode("DCOP᥽å");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return decode("ץѥƥ");
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return decode("ץѥƥ");
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java interfaces in the summary section of Java packages */
+ virtual QCString trInterfaces()
+ {
+ return decode("󥿡ե");
+ }
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode("ǡ¤");
+ }
+ else
+ {
+ return decode("饹");
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)decode("ѥå ")+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return decode("ѥå");
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return decode("ϥѥåǤ");
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return decode("ѥå");
+ }
+ /*! Used as a chapter title for Latex & RTF output */
+ virtual QCString trPackageDocumentation()
+ {
+ return decode("ѥå");
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return decode(":");
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return decode("Х");
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return decode("Х");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "932";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "128";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return decode("");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ first_capital = first_capital;
+ singular = singular;
+ QCString result(decode("饹"));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ first_capital = first_capital;
+ singular = singular;
+ QCString result(decode("ե"));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ first_capital = first_capital;
+ singular = singular;
+ QCString result(decode("͡ॹڡ"));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ first_capital = first_capital;
+ singular = singular;
+ QCString result(decode("롼"));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ first_capital = first_capital;
+ singular = singular;
+ QCString result(decode("ڡ"));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ first_capital = first_capital;
+ singular = singular;
+ QCString result(decode(""));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trField(bool first_capital, bool singular)
+ {
+ first_capital = first_capital;
+ singular = singular;
+ QCString result(decode("ե"));
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ first_capital = first_capital;
+ singular = singular;
+ QCString result(decode("Х"));
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ first_capital = first_capital;
+ singular = singular;
+ QCString result(decode(""));
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return decode("");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return trWriteList(numEntries)+decode("Ƥޤ");
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return trWriteList(numEntries)+decode("ǼƤޤ");
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return decode("ܼ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return decode("侩");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return decode("٥");
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return decode("٥");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return decode("ѥåη");
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return decode("ؿ");
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return decode("ƥåؿ");
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return decode("ѿ");
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return decode("ƥåѿ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return decode("");
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return decode("ؿθƤӽФ:");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return decode("");
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return decode("");
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return decode("Ϥ줿˥ޥåɥȤޤǤ.");
+ }
+ else if (numDocuments==1)
+ {
+ return decode("Ϥ줿˥ޥåɥȤ <b>1</b> ߤĤޤ.");
+ }
+ else
+ {
+ return decode("Ϥ줿˥ޥåɥȤ <b>$num</b> ߤĤޤ. "
+ "ǤפƤΤɽޤ.");
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return decode("ޥåñ:");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + decode(" ե");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return decode("ǥ쥯ȥ"); }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return decode("ǥ쥯ȥ깽"); }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return decode("ǥ쥯ȥ"); }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return decode("Υǥ쥯ȥϤޤˤϥȤƤޤ"
+ "˥ե٥åȽǥȤƤϤޤ");
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=decode(" ǥ쥯ȥե"); return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool, bool)
+ {
+ return decode("ǥ쥯ȥ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return decode("ϥСɤ줿дؿǤ"
+ "ΤѰդƤޤ"
+ "δؿȤΰ㤤ϰΤߤǤ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ // return "Here is the caller graph for this function:";
+ return decode("ƽФ:");
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return decode(""); }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return decode("ؿ/֥롼"); }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return decode("ǡ"); }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return decode("ǡե"); }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return decode("ϥǡΰǤ"); }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result=decode("");
+ result+=decode("եɤΰǤ줾");
+ if (extractAll)
+ {
+ result+=decode("°Ƥǡ");
+ }
+ result+=decode("إ󥯤Ƥޤ");
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return decode("ǡ"); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return decode("ǡ"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return decode("ؿ/֥롼"); }
+
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return decode("ؿ/֥롼"); }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return decode("ǡ"); }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return decode("⥸塼"); }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result=decode("");
+ if (!extractAll) result+=decode("줿");
+ result+=decode("⥸塼Ǥ");
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=decode("⥸塼 "); break;
+ case ClassDef::Struct: result+=decode("TYPE "); break;
+ case ClassDef::Union: result+=decode(" "); break;
+ case ClassDef::Interface: result+=decode("󥿡ե "); break;
+ case ClassDef::Protocol: result+=decode("ץȥ "); break;
+ case ClassDef::Category: result+=decode("ƥ "); break;
+ case ClassDef::Exception: result+=decode("㳰 "); break;
+ }
+ if (isTemplate) result += decode("ƥץ졼 ");
+ result+=(QCString)clName;
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=decode("⥸塼");
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return decode("⥸塼"); }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result=decode("ϥ⥸塼аǤ줾 ");
+ if (extractAll)
+ {
+ result+=decode("°Ƥ⥸塼");
+ }
+ result+=decode("إ󥯤Ƥޤ");
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return decode("⥸塼"); }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool /*first_capital*/, bool /*singular*/)
+ {
+ return decode("⥸塼");
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool /*single*/)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result="";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=decode("⥸塼"); break;
+ case ClassDef::Struct: result+=decode("TYPE"); break;
+ case ClassDef::Union: result+=decode(""); break;
+ case ClassDef::Interface: result+=decode("󥿡ե"); break;
+ case ClassDef::Protocol: result+=decode("ץȥ"); break;
+ case ClassDef::Category: result+=decode("ƥ"); break;
+ case ClassDef::Exception: result+=decode("㳰"); break;
+ }
+ result+=decode(decode("ϼΥե뤫ޤ:"));
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool /*first_capital*/, bool /*singular*/)
+ {
+ QCString result = decode("TYPE");
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool /*first_capital*/, bool /*singular*/)
+ {
+ QCString result = decode("֥ץ");
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return decode("");
+ }
+
+};
+
+#endif
diff --git a/src/translator_ke.h b/src/translator_ke.h
new file mode 100644
index 0000000..ce5b26e
--- /dev/null
+++ b/src/translator_ke.h
@@ -0,0 +1,59 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+//
+// Update:
+//
+// 2004.12.22 (SooYoung Jung: jung5000@gmail.com)
+// - LaTex and RTF were not generated correctly.
+// Corrected trRTFansicp and trRTFCharSet.
+// It was wrong.
+//
+//
+
+#ifndef TRANSLATOR_KE_H
+#define TRANSLATOR_KE_H
+
+class TranslatorKoreanEn : public TranslatorEnglish
+{
+ public:
+ virtual QCString idLanguage()
+ { return "korean-en"; }
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage{hfont}\n";
+ }
+ /*! returns the name of the package that is included by LaTeX */
+ virtual QCString idLanguageCharset()
+ {
+ return "euc-kr";
+ }
+ virtual QCString trRTFansicp()
+ {
+ return "949";
+ }
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "129";
+ }
+};
+
+#endif
diff --git a/src/translator_kr.h b/src/translator_kr.h
new file mode 100644
index 0000000..3064758
--- /dev/null
+++ b/src/translator_kr.h
@@ -0,0 +1,1889 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_KR_H
+#define TRANSLATOR_KR_H
+
+
+/* Korean translators
+ * doxygen-svn
+ * * fly1004@gmail.com
+ * doxygen-1.5.3
+ * * Astromaker(http://ngps.net/)
+ * * gpgiki(http://www.gpgstudy.com/gpgiki/)
+ * doxygen-1.2.11
+ * * ryk */
+
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorKorean : public TranslatorAdapter_1_6_3
+{
+ protected:
+ friend class TranslatorAdapterBase;
+ virtual ~TranslatorKorean() {}
+
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "korean"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ // I'm not sure what this should be.
+ // When I figure it out, I'll update this.
+ // see http://www.ktug.or.kr/jsboard/read.php?table=operate&no=4422&page=1
+ return "\\usepackage{hfont}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "euc-kr";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "õ Լ"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "( Լ ƴմϴ. Ͻʽÿ.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return " "; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return " Ÿ ȭ"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return " ȭ"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return " Լ ȭ"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ʵ ȭ";
+ }
+ else
+ {
+ return " Ÿ ȭ";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return " ڼ ..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return " "; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return " "; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return " Դϴ : "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return " ( ӵ 鵵 մϴ.)"; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="ҽ ڵκ ";
+ if (s) result+=s+(QCString)" ";
+ result+="Doxygen ڵ .";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return " ̸"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return " "; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return " ǵ :"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return ""; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Ŭ 뵵"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ÿ ";
+ }
+ else
+ {
+ return "Ŭ ";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return " "; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ÿ ʵ";
+ }
+ else
+ {
+ return "Ŭ ";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "";
+ }
+ else
+ {
+ return " ";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "õ "; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return ""; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "˻"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return " ĺ 뷫 ĵǾֽϴ.:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll) result+="ȭ ";
+ result+=" Ͽ Դϴ. ( ݴϴ) :";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " Ÿ Դϴ. ( ݴϴ) :";
+ }
+ else
+ {
+ return " Ŭ, ü, ü ׸ ̽Դϴ. "
+ "( ݴϴ) :";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll)
+ {
+ result+="ȭ ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=" ü ü ʵ";
+ }
+ else
+ {
+ result+=" Ŭ ";
+ }
+ result+=" Դϴ. ";
+
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=" ʵ ش ʵ忡 ü ü "
+ "ȭ ũ ֽϴ. :";
+ }
+ else
+ {
+ result+=" ش Ŭ ȭ "
+ "ũ ֽϴ. :";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=" ʵ ش ʵ尡 ִ ü ü "
+ " ũ ֽϴ. :";
+ }
+ else
+ {
+ result+=" ش ִ Ŭ "
+ "ũ ֽϴ. :";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll) result+="ȭ ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=" Լ, , ũ, , Ÿǵ";
+ }
+ else
+ {
+ result+=" ";
+ }
+ result+=" Դϴ. ";
+
+ result+=" ׸ ";
+ if (extractAll)
+ result+="׵ ũ ֽϴ. :";
+ else
+ result+="׵鿡 ȭ ũ ֽϴ. :";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return " Դϴ.:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return " õ ȭ Դϴ.:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return " Դϴ.:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "ȭ"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "뵵 "; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ÿ ";
+ }
+ else
+ {
+ return "Ŭ ";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return " "; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return " ȭ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ÿ ȭ";
+ }
+ else
+ {
+ return "Ŭ ȭ";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return " ȭ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return " ȭ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return " ȭ"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return " Ŵ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "ũ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Լ "; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Ÿ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return " Ÿ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Լ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return ""; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return " "; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "ũ ȭ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Լ ȭ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Ÿ ȭ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return " Ÿ ȭ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Լ ȭ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return " ȭ"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ÿ ";
+ }
+ else
+ {
+ return "Ŭ";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"ð : "+date;
+ if (projName) result+=(QCString)", Ʈ : "+projName;
+ result+=(QCString)", : ";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "ۼ : ";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)clName+" ̾׷ : ";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "θ ϱ ."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return ""; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return ""; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "¥"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "ȯ"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return ""; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Ű"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return ""; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return " : "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "ӽ̽ "; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll) result+="ȭ ";
+ result+=" ӽ̽ Դϴ. ( ݴϴ) :";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Friend, ׸ õ Լ ȭ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Ŭ"; break;
+ case ClassDef::Struct: result+=" ü"; break;
+ case ClassDef::Union: result+=" ü"; break;
+ case ClassDef::Interface: result+=" ̽"; break;
+ case ClassDef::Protocol: result+=" "; break;
+ case ClassDef::Category: result+=" īװ"; break;
+ case ClassDef::Exception: result+=" "; break;
+ }
+ if (isTemplate) result+=" ø";
+ result+=" ";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" ";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" ӽ̽ ";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Public Լ"; }
+ virtual QCString trPublicSlots()
+ { return "Public Slots"; }
+ virtual QCString trSignals()
+ { return "Signals"; }
+ virtual QCString trStaticPublicMembers()
+ { return " Public Լ"; }
+ virtual QCString trProtectedMembers()
+ { return "Protected Լ"; }
+ virtual QCString trProtectedSlots()
+ { return "Protected Slots"; }
+ virtual QCString trStaticProtectedMembers()
+ { return " Protected Լ"; }
+ virtual QCString trPrivateMembers()
+ { return "Private Լ"; }
+ virtual QCString trPrivateSlots()
+ { return "Private Slots"; }
+ virtual QCString trStaticPrivateMembers()
+ { return " Private Լ"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return trWriteList(numEntries)+"() ߽ϴ.";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return trWriteList(numEntries)+" ӵǾϴ.";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return trWriteList(numEntries)+"()κ 籸Ǿϴ.";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return trWriteList(numEntries)+" 籸Ǿϴ.";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "ӽ̽ "; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll) result+="ȭ ";
+ result+=" ӽ̽ Դϴ. ";
+ if (extractAll)
+ result+=" ش ӽ̽ ȭ ũ ֽϴ. :";
+ else
+ result+=" ش ӽ̽ ũ ֽϴ. :";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "ӽ̽ "; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "ӽ̽ ȭ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "ӽ̽"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)" ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="Ŭ"; break;
+ case ClassDef::Struct: result+="ü"; break;
+ case ClassDef::Union: result+="ü"; break;
+ case ClassDef::Interface: result+="̽"; break;
+ case ClassDef::Protocol: result+=""; break;
+ case ClassDef::Category: result+="īװ"; break;
+ case ClassDef::Exception: result+=""; break;
+ }
+ result+=" ȭ ";
+ if (!single) result+="";
+ result+="κ Ǿϴ.:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "ĺ "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "ȯ"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return " "; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return ""; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "@1 @0 ° ο ǵǾϴ.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "@0 Ͽ ǵǾϴ.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "߸ ڵ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)clName+" ̾׷:";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)fName+" include ׷";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return " & Ҹ ȭ";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return " ҽ ڵ ";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return " ȭ ";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Ĺ";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return " ʴ";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "ʱⰪ:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "ڵ";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "׷ Ŭ 뵵";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "׷ Ŭ 뵵 ";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "ؽƮ Ŭ 뵵 ";
+ }
+ virtual QCString trPageIndex()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Public Ÿ";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ÿ ʵ";
+ }
+ else
+ {
+ return "Public Ӽ";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return " Public Ӽ";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Protected Ÿ";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Protected Ӽ";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return " Protected Ӽ";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Private Ÿ";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Private Ӽ";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return " Private Ӽ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return " ؼ : ";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Remarks";
+ }
+ virtual QCString trAttention()
+ {
+ return "";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return " ׷ / include ϴ ϵ ݴϴ.:";
+ }
+ virtual QCString trSince()
+ {
+ return "Since";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "׷ ";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ " doxygen ׷ ϴ մϴ.<p>\n"
+ " Ͻʽÿ.:\n"
+ "\\code\n"
+ "/*! Ǿ ʴ Ŭ */\n"
+ "class Invisible { };\n\n"
+ "/*! Truncated Ŭ, Ӱ谡 */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* doxygen ּ ؼ ȭ ʴ Ŭ */\n"
+ "class Undocumented { };\n\n"
+ "/*! public ؼ ӵ Ŭ */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! ø Ŭ */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! protected ؼ ӵ Ŭ */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! private ؼ ӵ Ŭ */\n"
+ "class PrivateBase { };\n\n"
+ "/*! ӵǾ Ŭ () Ǿ Ŭ */\n"
+ "class Used { };\n\n"
+ "/*! ٸ Ŭ ϴ Ŭ */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ " ׷ µ Դϴ. :"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ " ׷ ڽ ǹ̸ ϴ. :\n"
+ "<ul>\n"
+ "<li>%A ȸ ä ڽ ׷ ü Ŭ ǹմϴ.\n"
+ "<li>%A ׵θ ڽ ȭ ü Ŭ ǹմϴ.\n"
+ "<li>%A ȸ ׵θ ڽ ȭ ü Ŭ ǹմϴ.\n"
+ "<li>%A ׵θ ڽ ̳ ԰谡 ʴ "
+ "ü Ŭ ǹմϴ."
+ "%A ׷ 賻 , ׷ ߷ϴ.\n"
+ "</ul>\n"
+ "ȭǥ ǹ̸ ϴ. :\n"
+ "<ul>\n"
+ "<li>%A ο Ķ ȭǥ Ŭ public ǹմϴ.\n"
+ "<li>%A ο λ ȭǥ protected ǹմϴ.\n"
+ "<li>%A ο ȭǥ private ǹմϴ.\n"
+ "<li>%A ȭǥ ٸ Ŭ Եǰų Ǿ ǹմϴ. "
+ "ȭǥ ȭǥ Ű Ŭ ü ϴ () ٽϴ.\n"
+ "<li>%A ȭǥ ø νϽ Ŭ 踦 ǹմϴ. "
+ "ȭǥ νϽ ø Ķͷ ٽϴ.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "׽Ʈ";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "׽Ʈ ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Լ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Ӽ";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Ӽ ȭ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ÿ ";
+ }
+ else
+ {
+ return "Ŭ";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return name+(QCString)" Ű";
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Ű ";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return " ŰԴϴ. ( ݴϴ) :";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Ű";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return ":";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return " ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "949";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "129";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ŭ" : "Ŭ"));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "ӽ̽" : "ӽ̽"));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "׷" : "׷"));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ if (!singular) result+="";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "ۼ" : "ۼ"));
+ if (!singular) result+="";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return " : ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return trWriteList(numEntries)+" .";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return trWriteList(numEntries)+" Ǿϴ.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "߸ ڵ ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "̺Ʈ";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "̺Ʈ ȭ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Ű Ÿ";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Ű Լ";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return " Ű Լ";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Ű Ӽ";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return " Ű Ӽ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return " Լ ο ȣϴ Լ鿡 ׷Դϴ.:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "˻";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "˻ ";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "˼մϴ. ǿ ġϴ ϴ.";
+ }
+ else if (numDocuments==1)
+ {
+ return "ǿ ġϴ <b>1</b> ãҽϴ.";
+ }
+ else
+ {
+ return "ǿ ġϴ <b>$num</b> ãҽϴ. "
+ " ġϴ ݴϴ.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return ":";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " ҽ ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "丮 뵵"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "丮 ȭ"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "丮"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return " 丮 , (뷫) ĺ ĵǾֽϴ.:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" 丮 "; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "丮" : "丮"));
+ if (singular) result+=""; else result+="";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return " Լ Ǹ ϱ ε ԼԴϴ. "
+ " Լ Ʋ ޾Ƶ̴ ƱԸƮ(argument) ٸٴ Դϴ.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return " Լ ȣϴ Լ鿡 ׷Դϴ.:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return " ȭ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return " Լ/ƾ ȭ"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Ÿ Ÿ "; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Ÿ ʵ"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "뷫 Բ Ÿ ŸԵ Դϴ.:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll)
+ {
+ result+="ȭ ";
+ }
+ result+=" Ÿ Ÿ Դϴ. ";
+
+ result+=" ׸ ";
+ if (!extractAll)
+ {
+ result+=" Ÿ ȭ ũ ֽϴ.";
+ }
+ else
+ {
+ result+="׵ Ÿ Ÿ ũ ֽϴ. :";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Ÿ Ÿ "; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Ÿ Ÿ ȭ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Լ/ƾ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Լ/ƾ ȭ"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Ÿ ŸԵ"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return " "; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll) result+="ȭ ";
+ result+=" ⿡ Դϴ. ( ݴϴ) :";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" "; break;
+ case ClassDef::Struct: result+=" Ÿ"; break;
+ case ClassDef::Union: result+=" ü"; break;
+ case ClassDef::Interface: result+=" ̽"; break;
+ case ClassDef::Protocol: result+=" "; break;
+ case ClassDef::Category: result+=" īװ"; break;
+ case ClassDef::Exception: result+=" "; break;
+ }
+ if (isTemplate) result+=" ø";
+ result+=" ";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" ";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return " "; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll) result+="ȭ ";
+ result+=" Դϴ. ";
+ if (extractAll)
+ {
+ result+=" ׸ ȭ ũ ֽϴ. :";
+ }
+ else
+ {
+ result+=" ׸ ׵ ũ ֽϴ. :";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return " "; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ if (!singular) result+="";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)" ";
+ if (single) result+=""; else result+="";
+ result+="κ ";
+ result+=" ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=""; break;
+ case ClassDef::Struct: result+="Ÿ"; break;
+ case ClassDef::Union: result+="ü"; break;
+ case ClassDef::Interface: result+="̽"; break;
+ case ClassDef::Protocol: result+=""; break;
+ case ClassDef::Category: result+="īװ"; break;
+ case ClassDef::Exception: result+=""; break;
+ }
+ result+=" ȭ :";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ÿ" : "Ÿ"));
+ if (!singular) result+="";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "α׷" : "α׷"));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Ÿ ڵ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" ";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "ε...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return " ̸";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "˻...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "ġϴ° ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return QCString(name) + " 丮 ׷";
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return QCString(name) + " ";
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return QCString(name) + " ";
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "","ȭ","","","","","" };
+ static const char *months[] = { "1","2","3","4","5","6","7","8","9","10","11","12" };
+ QCString sdate;
+ sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+
+};
+
+#endif
diff --git a/src/translator_lt.h b/src/translator_lt.h
new file mode 100644
index 0000000..96aec3e
--- /dev/null
+++ b/src/translator_lt.h
@@ -0,0 +1,1563 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/* Translation from English to Lithanian by Tomas Simonaitis, Mindaugas Radzius and Aidas Berukstis
+ * (haden@homelan.lt/mindaugasradzius@takas.lt/aidasber@takas.lt)
+ * We tried to keep meaning close to original,
+ * if you have any suggestions drop us an email
+ * -------------------------------------------
+ * Project start :13.May.2k4
+ * Last Doxygen version covered : 1.4.3
+ *
+ * Revisions:
+ * Updated to 1.3.9 25.Oct.2k4
+ *
+*/
+
+#ifndef TRANSLATOR_LT_H
+#define TRANSLATOR_LT_H
+
+
+class TranslatorLithuanian : public TranslatorAdapter_1_4_6
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "lithuanian"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[T2A]{fontenc}\n"
+ "\\usepackage[lithuanian]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-13";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Susij Funkcijos"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "Atkreipkite dmes, i ne metodai"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Smulkus apraymas"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Tipo Apraymo Dokumentacija"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Ivardinimo Dokumentacija"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Metod Dokumentacija"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Lauko apraymas";
+ }
+ else
+ {
+ return "Atribut Dokumentacija";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Daugiau..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Vis nari sraas."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Nari sraas"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Tai galutinis nari sraas "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", traukiant visus paveldtus narius."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Automatikai sugeneruota Doxygen rankiu";
+ if (s) result+=(QCString)" "+s;
+ result+=" i programos kodo.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "ivardinimo vardas"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "ivardinimo reikm"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "apibrta"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Moduliai"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Klasi hierarchija"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Duomen Struktros";
+ }
+ else
+ {
+ return "Klass";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Failai"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Duomen Laukai";
+ }
+ else
+ {
+ return "Klasi Nariai";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globals Nariai";
+ }
+ else
+ {
+ return "Globals Nariai";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Susij Puslapiai"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Pavyzdiai"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Paieka"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "is paveldjimo sraas yra beveik surikiuotas "
+ "abcls tvarka:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Vis ";
+ if (!extractAll) result+="dokumentuot ";
+ result+="fail sraas su trumpais apraymais:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Duomen struktros su trumpais apraymais:";
+ }
+ else
+ {
+ return "Klass, struktros, "
+ "sjungos ir ssajos su trumpais apraymais:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Vis ";
+ if (!extractAll)
+ {
+ result+="dokumentuot ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktr ir sjung lauk sraas";
+ }
+ else
+ {
+ result+="klasi nariai";
+ }
+ result+=" su ryiais ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktr/sjung kiekvieno lauko dokumentacij:";
+ }
+ else
+ {
+ result+="klass dokumentacija kiekvienam nariui:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktros/sjungos, kurios priklauso:";
+ }
+ else
+ {
+ result+="klass, kurios priklauso:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Sraas vis ";
+ if (!extractAll) result+="dokumentuot ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funkcij, kintamj, apibrim, ivardinim, ir tip apibrim";
+ }
+ else
+ {
+ result+="globali nari";
+ }
+ result+=" su ryiais ";
+ if (extractAll)
+ result+="failus, kuriems jie priklauso:";
+ else
+ result+="dokumentacija:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Vis pavyzdi sraas:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Vis susijusi dokumentacijos puslapi sraas:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Vis moduli sraas:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentacija"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Modulio Indeksas"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarchijos Indeksas"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Duomen Struktros Indeksas";
+ }
+ else
+ {
+ return "Klass Indeksas";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Failo Indeksas"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Modulio Dokumentacija"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Duomen Struktros Dokumentacija";
+ }
+ else
+ {
+ return "Klass Dokumentacija";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Failo Dokumentacija"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Pavyzdio Dokumentacija"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Puslapio Dokumentacija"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Informacinis Vadovas"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Apibrimai"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Funkcij Prototipai"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Tip apibrimai"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Ivardinimai"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funkcijos"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Kintamieji"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Ivardinim reikms"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Apibrim Dokumentacija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Funkcij Prototip Dokumentacija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Tip apibrim Dokumentacija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Ivardinimo Tipo Dokumentacija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Funkcijos Dokumentacija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Kintamojo Dokumentacija"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Duomen struktros";
+ }
+ else
+ {
+ return "Klass";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Sugeneruota "+date;/*FIXME*/
+ if (projName) result+=(QCString)" "+projName;/*FIXME*/
+ result+=(QCString)" ";/*FIXME*/
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "parayta";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Paveldimumo diagrama "+clName+":"; /*FIXME*/
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Tiktai vidiniam naudojimui."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "spjimas"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versija"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Data"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Graina"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Taip pat irti"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametrai"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Iimtys"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Sugeneruota"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Var Srities Sraas"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Sraas vis ";
+ if (!extractAll) result+="dokumentuot ";
+ result+="vard srii su trumpais apraymais:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Draugai"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Draugik Ir Susijusi Funkcij Dokumentacija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Klas"; break;
+ case ClassDef::Struct: result+=" Struktra"; break;
+ case ClassDef::Union: result+=" Sjunga"; break;
+ case ClassDef::Interface: result+=" Ssaja"; break;
+ case ClassDef::Protocol: result+=" Protokolas"; break;
+ case ClassDef::Category: result+=" Kategorija"; break;
+ case ClassDef::Exception: result+=" Iimtis"; break;
+ }
+ if (isTemplate) result+=" ablonas";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" Failo Nuoroda";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Vard Srities Nuoroda";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Viei Metodai"; }
+ virtual QCString trPublicSlots()
+ { return "Viei Slotai"; } /*FIXME*/
+ virtual QCString trSignals()
+ { return "Signalai"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statiniai Viei Metodai"; }
+ virtual QCString trProtectedMembers()
+ { return "Apsaugoti Metodai"; }
+ virtual QCString trProtectedSlots()
+ { return "Apsaugoti Slotai"; }/*FIXME*/
+ virtual QCString trStaticProtectedMembers()
+ { return "Statiniai Apsaugoti Metodai"; }
+ virtual QCString trPrivateMembers()
+ { return "Privatats Metodai"; }
+ virtual QCString trPrivateSlots()
+ { return "Privats Slotai"; }/*FIXME*/
+ virtual QCString trStaticPrivateMembers()
+ { return "Statiniai Privats Metodai"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", ir ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Paveldi "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Paveldta "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Perkrauna metod i "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Metodas perkraunamas "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Vard Srities Nariai"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Sraas vis ";
+ if (!extractAll) result+="dokumentuot ";
+ result+="vard srities nari su nuorodomis ";
+ if (extractAll)
+ result+="vard srities dokumentacij kiekvienam nariui:";
+ else
+ result+="vard sritis, kurioms jos priklauso:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Vard Srities Indeksas"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Vard Srities Dokumentacija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Vard Sritys"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentacija ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="iai klasei"; break;
+ case ClassDef::Struct: result+="iai struktrai"; break;
+ case ClassDef::Union: result+="iai sjungai"; break;
+ case ClassDef::Interface: result+="iai ssajai"; break;
+ case ClassDef::Protocol: result+="iam protocolui"; break;
+ case ClassDef::Category: result+="iai kategorijai"; break;
+ case ClassDef::Exception: result+="iai iimiai"; break;
+ }
+ result+=" sugeneruota i ";
+ if (single) result+="io failo:"; else result+="i fail:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Abclinis Sraas"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Grainamos reikms"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Pagrindinis Puslapis"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "psl."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Apibrimas failo @1 eilutje @0.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Apibrimas faile @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Smerktina";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Bendradarbiavimo diagrama "+clName+":";/*FIXME*/
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"traukimo priklausomybi diagrama "+fName+":";/*FIXME*/
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Konstruktoriaus ir Destruktoriaus Dokumentacija";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Eiti io failo programos kod.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Eiti io failo dokumentacij.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Iakstin slyga";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postcondition";/*FIXME*/
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Pastovus";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Pradin reikm:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "tekstas";/*FIXME*/
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafin Klass Hierarchija";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Eiti grafin klass hierarchij";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Eiti tekstin klass hierarchij";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Puslapio Indeksas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Pastaba";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Viei Tipai";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Duomen Laukai";
+ }
+ else
+ {
+ return "Viei Atributai";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statiniai Viei Atributai";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Apsaugoti Tipai";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Apsaugoti Atributai";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statiniai Apsaugoti Atributai";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Privats Tipai";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Privats Atributai";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statiniai Privats Atributai";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Daryti";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Tolimesni Darbai";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Naudojamas";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Pastabos";
+ }
+ virtual QCString trAttention()
+ {
+ return "Attention";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "is grafas rodo, kuris failas tiesiogiai ar "
+ "netiesiogiai traukia fail:";
+ }
+ virtual QCString trSince()
+ {
+ return "Nuo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Grafo Legenda";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "is puslapis paaikina, kaip interpretuoti sugeneruotus grafus "
+ "su Doxygen rankiu.<p>\n"
+ "Panagrinkite pavyzd:\n"
+ "\\kodo pradia\n"
+ "/*! Invisible class because of truncation */\n"
+ "class Invisible { };\n\n"
+ "/*! Truncated class, inheritance relation is hidden */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Class not documented with doxygen comments */\n"
+ "class Undocumented { };\n\n"
+ "/*! Class that is inherited using public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Class that is inherited using protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Class that is inherited using private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Class that is used by the Inherited class */\n"
+ "class Used { };\n\n"
+ "/*! Super class that inherits a number of other classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
+ "is set to 240 this will result in the following graph:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "The boxes in the above graph have the following meaning:\n"
+ "<ul>\n"
+ "<li>%A filled black box represents the struct or class for which the "
+ "graph is generated.\n"
+ "<li>%A box with a black border denotes a documented struct or class.\n"
+ "<li>%A box with a grey border denotes an undocumented struct or class.\n"
+ "<li>%A box with a red border denotes a documented struct or class for"
+ "which not all inheritance/containment relations are shown. %A graph is "
+ "truncated if it does not fit within the specified boundaries.\n"
+ "</ul>\n"
+ "The arrows have the following meaning:\n"
+ "<ul>\n"
+ "<li>%A dark blue arrow is used to visualize a public inheritance "
+ "relation between two classes.\n"
+ "<li>%A dark green arrow is used for protected inheritance.\n"
+ "<li>%A dark red arrow is used for private inheritance.\n"
+ "<li>%A purple dashed arrow is used if a class is contained or used "
+ "by another class. The arrow is labeled with the variable(s) "
+ "through which the pointed class or struct is accessible.\n"
+ "<li>%A yellow dashed arrow denotes a relation between a template instance and "
+ "the template class it was instantiated from. The arrow is labeled with "
+ "the template parameters of the instance.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Testas";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Testo Sraas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Metodai";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Savybs";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Savybs Dokumentacija";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Duomen Struktros";
+ }
+ else
+ {
+ return "Klass";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paketas "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Paketo Sraas";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Paketai su trumpu apraymu:";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Paketai";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Reikm:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Klaida";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Klaid Sraas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indeksas";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Klas" : "klas"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Faila" : "faila"));
+ if (!singular) result+="i";
+ else result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Vard srit" : "vard srit"));
+ if (!singular) result+="ys";
+ else result+="is";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grup" : "grup"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Puslapi" : "puslapi"));
+ if (!singular) result+="ai";
+ else result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Nar" : "nar"));
+ if (!singular) result+="iai";
+ else result+="ys";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="s";
+ else result+="us";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autori" : "autori"));
+ if (!singular) result+="ai";
+ else result+="us";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Ryiai";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Realizuoja "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Realizuota "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Turinys";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Smerktinum Sraas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "vykiai";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "vykio Dokumentacija";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Paketo Tipai";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Paketo Funkcijos";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statins Paketo Funkcijos";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Paketo Atributai";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statiniai Paketo Atributai";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Visi";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Funkcijos kvietimo grafas:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Iekoti";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Paiekos Rezultatai";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Atsipraome, joki dokument nerasta pagal Js uklaus.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Surasta <b>1</b> dokumentas, atitinkantis Js uklaus.";
+ }
+ else
+ {
+ return "Surasta <b>$num</b> dokument, atitinkani Js uklaus. "
+ "Pirmiausiai rodomi labiausiai tenkinantys uklaus.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Atitikmenys:";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " ieities tekstas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Direktorij hierarchija"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Direktorij dokumentacija"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Direktorijos"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "i direktorj strktra grubiai surikiuota abcls tvarka:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Directorijos apraas"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Direktorij" : "direktorij"));
+ if (singular) result+="a"; else result+="os";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Perkraunamas metodas sukurtas patogumui. "
+ "Jis skiriasi nuo aukiau minto tik argumetais.";
+ }
+
+
+};
+
+#endif
diff --git a/src/translator_mk.h b/src/translator_mk.h
new file mode 100644
index 0000000..3ec5b55
--- /dev/null
+++ b/src/translator_mk.h
@@ -0,0 +1,1767 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+// Тranslated by Slave Jovanovski <slavejovanovski@yahoo.com>
+//
+// The cyrilic strings were entered using Macedonian language support in
+// Windows. The editor used was Eclipse 3.2. The file was saved in UTF-8.
+//
+// Updates:
+// --------
+// 2007/12/09
+// - Initial translation to Macedonian.
+//
+// 2008/05/22
+// - Translation for 1.5.4.
+//
+//
+
+#ifndef TRANSLATOR_MK_H
+#define TRANSLATOR_MK_H
+
+class TranslatorMacedonian : public TranslatorAdapter_1_6_0
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "macedonian"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[macedonian]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "UTF-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Поврзани Функции"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Овие функции не се членови.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Детален опис"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Документација на членови дефиниции на тип"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Документација на набројани членови"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Документација на функции членови"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ //if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Документација на членови";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Повеќе..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Список на сите членови."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Список на членови"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Ова е целосниот список на членови на "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", вклучувајќи ги сите наследени членови."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Автоматски создадено од Doxygen";
+ if (s) result+=(QCString)" за "+s;
+ result+=" изворниот код.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "име на набројан член"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "вредност на набројан член"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "дефиниран во"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Модули"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Стебло на класи"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Список на Структури";
+ }
+ else
+ {
+ return "Список на Класи";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Список на Датотеки"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Членови";
+ }
+ else
+ {
+ return "Членови на Класата";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Глобални Членови";
+ }
+ else
+ {
+ return "Членови на Датотеката";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Страници Поврзани со Оваа"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Примери"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Пребарај"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Овој список на наследување е приближно азбучно подреден:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Список на сите ";
+ if (!extractAll) result+="документирани ";
+ result+="членови со кратки описи:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Список на структури со кратки описи:";
+ }
+ else
+ {
+ return "Список на класи, структури, унии и интерфејси "
+ "со кратки описи:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Список на сите ";
+ if (!extractAll)
+ {
+ result+="документирани ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="структури и унии";
+ }
+ else
+ {
+ result+="членови на класата";
+ }
+ result+=" со врски до ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="документацијата за секој член на структурата/унијата:";
+ }
+ else
+ {
+ result+="документацијата на секој член на класата:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="структурите/униите на кои што припаѓаат:";
+ }
+ else
+ {
+ result+="класите на кои што припаѓаат:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Список на сите ";
+ if (!extractAll) result+="документирани ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="функции, променливи, дефиниции, набројувања и дефиниции на тип";
+ }
+ else
+ {
+ result+="членови на датотеки";
+ }
+ result+=" со врски до ";
+ if (extractAll)
+ result+="датотеките на кои што припаѓаат:";
+ else
+ result+="документацијата:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Список на сите примери:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Список на сите страници поврзани со оваа и нивна документација:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Список на сите модули:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Документација"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Попис на Модули"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Попис на Стебло"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Попис на Структури";
+ }
+ else
+ {
+ return "Попис на Класи";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Попис на Датотеки"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Попис на Документација"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Документација на Структури";
+ }
+ else
+ {
+ return "Документација на Класи";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Документија на Датотеки"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Документаија на Примери"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Документација на Страници"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Прирачник"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Дефинирања"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Прототипи на Функции"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Дефиниции на Тип"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Набројувања"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Функции"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Променливи"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Вредности на Набројувањата"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Документција на Дефиниции"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Документација на Прототип на Функции"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Документација на Дефиниции на Тип"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Документација на Набројувања"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Документација на Функции"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Документација на Променливи"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структури";
+ }
+ else
+ {
+ return "Класи";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Создадено на "+date;
+ if (projName) result+=(QCString)" за "+projName;
+ result+=(QCString)" од";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "напишано од";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Диаграм на наследување за "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Само за интерна употреба."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Предупредување"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Верзија"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Дата"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Враќа"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Истотака погледнете"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Параметри"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Исклучоци"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Создадено од"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Список на Имиња на Простор"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Список на сите ";
+ if (!extractAll) result+="документирани ";
+ result+="имиња на простор со кратки описи:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Пријатели"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Документација на Пријатели и Поврзани Функции"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Класа"; break;
+ case ClassDef::Struct: result+=" Структура"; break;
+ case ClassDef::Union: result+=" Унија"; break;
+ case ClassDef::Interface: result+=" Интерфејс"; break;
+ case ClassDef::Protocol: result+=" Протокол"; break;
+ case ClassDef::Category: result+=" Категорија"; break;
+ case ClassDef::Exception: result+=" Исклучок"; break;
+ }
+ if (isTemplate) result+=" Образец";
+ result+=" Повикување";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result = "Опис на Датотекaта ";
+ result += fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result = "Опис на Имeто на Простор ";
+ result += namespaceName;
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Јавни Функции Членови"; }
+ virtual QCString trPublicSlots()
+ { return "Јавни Слотови"; }
+ virtual QCString trSignals()
+ { return "Сигнали"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Статични Јавни Функции Членови"; }
+ virtual QCString trProtectedMembers()
+ { return "Заштитени Функции Членови"; }
+ virtual QCString trProtectedSlots()
+ { return "Заштитени Слотови"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Статични Заштитени Функции Членови"; }
+ virtual QCString trPrivateMembers()
+ { return "Приватни Функции Членови"; }
+ virtual QCString trPrivateSlots()
+ { return "Приватни Слотови"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Статични Приватни Функции Членови"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" и ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Наследува "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Наследено од "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Преприменето од "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Преприменето во "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Членови на Име на Простор"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Список на сите ";
+ if (!extractAll) result+="документирани ";
+ result+="членови на името на простор со врски до ";
+ if (extractAll)
+ result+="документацијата на секој член:";
+ else
+ result+="името на простор на кое што му припаѓаат:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Попис на Имиња на Простор"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Документација на Имиња на Простор"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Имиња на Простор"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Документацијата за ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="оваа класа"; break;
+ case ClassDef::Struct: result+="оваа структура"; break;
+ case ClassDef::Union: result+="оваа унија"; break;
+ case ClassDef::Interface: result+="овој интерфејс"; break;
+ case ClassDef::Protocol: result+="овој протокол"; break;
+ case ClassDef::Category: result+="оваа категорија"; break;
+ case ClassDef::Exception: result+="овој исклучок"; break;
+ }
+ result+=" беше создадена од ";
+ if (single) result+="следнава датотека:"; else result+="следниве датотеки:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Азбучен Список"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Вратена Вредност"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Главна Страна"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "стр."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Дефиницијата е на линија @0 во датотека @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Дефинијата е во датотека @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Застарено";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Диаграм на соработка за "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Вклучен дијаграм на зависност за "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Документација на Конструктор и Деструктор";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Оди до изворниот код на оваа датотека.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Оди до документацијата на оваа датотека.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Предуслов";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Постуслов";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Инваријанта";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Основна вредност:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "код";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Графичко Стебло на Класи";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Оди до графичкото стебло на класи";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Оди до текстуалното стебло на класи";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Попис на Страници";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Забелешка";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Јавни Типови";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Членови";
+ }
+ else
+ {
+ return "Јавни Членови";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Статични Јавни Членови";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Заштитени Типови";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Заштитени Членови";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Статични Заштитени Типови";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Приватни Типови";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Приватни Членови";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Статични Приватни Членови";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Незавршено";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Список на Незавршени";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Повикано од";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Забелешки";
+ }
+ virtual QCString trAttention()
+ {
+ return "Внимание";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Овој дијаграм покажува кои датотеки се "
+ "директно или индеректно вклучени во оваа датотека:";
+ }
+ virtual QCString trSince()
+ {
+ return "Од";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Легенда на Дијаграмот";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Оваа страна објаснува како да ги толкувате дијаграмите создадени"
+ " од doxygen.<p>\n"
+ "На пример:\n"
+ "\\code\n"
+ "/*! Невидлива класа заради ограничувања на дијаграмот */\n"
+ "class Invisible { };\n\n"
+ "/*! Одсечена класа, врската на наследување е скриена */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Класата не е документирана со doxygen коментари */\n"
+ "class Undocumented { };\n\n"
+ "/*! Класа која е наследена со јавно наследување */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Класа Образец */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Класа која е наследена со заштитено наследување */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Класа која е наследена со приватно наследување */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Класа која е користена од страна на наследената класа */\n"
+ "class Used { };\n\n"
+ "/*! Класа која наследува од повеќе други класи */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Ако вредноста на \\c MAX_DOT_GRAPH_HEIGHT во конфигурациската датотека "
+ "е 240 тогаш примерот ќе го создаде следниов дијаграм:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Правоаголниците во дијаграмот погоре го имаат следново значење:\n"
+ "<ul>\n"
+ "<li>Полн сив правоаголник ја означува структурата или класата за "
+ "којадијаграмот е создаден.\n"
+ "<li>Правоаголник со црна граница означува документирана структура или класа.\n"
+ "<li>Правоаголник со сива граница означува недокументирана структура или класа.\n"
+ "<li>Правоаголник со црвена граница означува документирана структура или класа "
+ "за која не сите врски на наследување се прикажани. Дијаграмот е одсечен доколку "
+ "не го собира во зададените граници..\n"
+ "</ul>\n"
+ "Стрелките го имаат следново значење:\n"
+ "<ul>\n"
+ "<li>Сина стрелка означува врска на јавно наследување помеѓу две класи.\n"
+ "<li>Зелена стрелка означува заштитено наследување.\n"
+ "<li>Црвена стрелка означува приватно наследување.\n"
+ "<li>Виолетова испрекината линија означува класа која е користена или вклучена "
+ "во друга класа. Стрелаката е означена со името на променливата преку "
+ "која класата е достапна.\n"
+ "<li>Жолта испрекината линија означува врска меѓу примерок од образец класа "
+ "и класата образец од која е создадена. Стрелката е означена со имињата на "
+ "параметрите на класата.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "Легенда";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Тест";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Листа на Тестови";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Функции Членови";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Особини";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Документација на Особини";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структури";
+ }
+ else
+ {
+ return "Класи";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Пакет "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Список на Пакети";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Пакети со краток опис (доколку достапен):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Пакети";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Вредност:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Дефект";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Листа на Дефекти";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "238";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Попис";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Клас" : "клас"));
+ result += (singular ? "а" : "и");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Датотек" : "датотек"));
+ result += (singular ? "а" : "и");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Им" : "им"));
+ result += (singular ? "е на простор" : "иња на простори");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Груп" : "груп"));
+ result += (singular ? "а" : "и");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Стран" : "стран"));
+ result += (singular ? "а" : "и");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Член" : "член"));
+ if (!singular) result+="ови";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Глобал" : "глобал"));
+ result += (singular ? "ен" : "ни");
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Автор" : "автор"));
+ if (!singular) result+="и";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Повикувања";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Применува "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Применето во "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Содржина";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Список на Застарени";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Настани";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Документација на Настани";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Типови во Пакетот";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Функции во Пакетот";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Статични Функции во Пакетот";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Членови во Пакетот";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Статични Членови во Пакетот";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Сите";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Дијаграм на повикувања за оваа функција:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Пребарај";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Резултати од Пребарувањето";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Нема документи кои се поклопуваат со вашето барање.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Пронајден <b>1</b> документ кој се поклопува со вашето барање.";
+ }
+ else
+ {
+ return "Пронајдени <b>$num</b> документи кои се поклопуваат со вашето барање."
+ "Најдобро поклопените документи се прикажани први.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Пронајдени:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Изворен код на датотеката " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Стебло на Именикот"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Документација на Именикот"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Именици"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Ова стебло на именици е приближно азбучно подреден:";}
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result= "Опис на Именикот "; result += dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Имени" : "имени"));
+ if (singular) result+="к"; else result+="ци";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Оваа е преоптоварена фунција. Се разликува по "
+ "типот и бројот на аргументи што ги прифаќа.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Ова е графот на повикување за оваа фунција:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Документија на Набројувања"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Документација на функции/процедури членови"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Список на Типови"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Членови"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Список на типови со кратки описи:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Список на сите ";
+ if (!extractAll)
+ {
+ result+="документирани ";
+ }
+ result+="членови на типови";
+ result+=" со врски до ";
+ if (!extractAll)
+ {
+ result+="документацијата за секој член:";
+ }
+ else
+ {
+ result+="типовите на кои што припаѓаат:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Попис на Типови"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Документација на Типови"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Функции/Процедури"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Документација на Функции/Процедури"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Типови"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Попис на Модули"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Список на сите ";
+ if (!extractAll) result+="документирани ";
+ result+="модули со кратки описи:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName + " - Повикување на";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Класа"; break;
+ case ClassDef::Struct: result+=" Тип"; break;
+ case ClassDef::Union: result+=" Унија"; break;
+ case ClassDef::Interface: result+=" Интерфејс"; break;
+ case ClassDef::Protocol: result+=" Протокол"; break;
+ case ClassDef::Category: result+=" Категорија"; break;
+ case ClassDef::Exception: result+=" Исклучок"; break;
+ }
+ if (isTemplate) result+=" Образец";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" - Содржина на Модул";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Членови на Модул"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Список на сите ";
+ if (!extractAll) result+="документирани ";
+ result+="членови на модулот со врски до ";
+ if (extractAll)
+ {
+ result+="документацијата за секој член:";
+ }
+ else
+ {
+ result+="модулите на кои што припаѓаат:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Попис на Модули"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Модул" : "модул"));
+ if (!singular) result+="и";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Документацијата за ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="оваа класа"; break;
+ case ClassDef::Struct: result+="овој тип"; break;
+ case ClassDef::Union: result+="оваа унија"; break;
+ case ClassDef::Interface: result+="овој интерфејс"; break;
+ case ClassDef::Protocol: result+="овој протокол"; break;
+ case ClassDef::Category: result+="оваа категорија"; break;
+ case ClassDef::Exception: result+="овој исклучок"; break;
+ }
+ result+=" беше создадена од ";
+ if (single) result+="следнава датотека:"; else result+="следниве датотеки:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Тип" : "тип"));
+ if (!singular) result+="ови";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Потпрограм" : "потпрограм"));
+ if (singular){
+ result+="а";
+ }else{
+ result+="и";
+ }
+
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Ограничувања на Тип";
+ }
+};
+
+#endif
diff --git a/src/translator_nl.h b/src/translator_nl.h
new file mode 100644
index 0000000..6bc52bc
--- /dev/null
+++ b/src/translator_nl.h
@@ -0,0 +1,1456 @@
+/******************************************************************************
+ *
+ * $Id: translator_nl.h,v 1.22 2001/03/19 19:27:42 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_NL_H
+#define TRANSLATOR_NL_H
+
+class TranslatorDutch : public Translator
+{
+ public:
+ QCString idLanguage()
+ { return "dutch"; }
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ */
+ QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[dutch]{babel}\n";
+ }
+ /*! return the language charset. This will be used for the HTML output */
+ QCString idLanguageCharset()
+ {
+ return "iso-8859-1";
+ }
+
+ QCString trRelatedFunctions()
+ { return "Gerelateerde functies"; }
+ QCString trRelatedSubscript()
+ { return "(Merk op dat dit geen member functies zijn.)"; }
+ QCString trDetailedDescription()
+ { return "Gedetailleerde Beschrijving"; }
+ QCString trMemberTypedefDocumentation()
+ { return "Documentatie van type definitie members"; }
+ QCString trMemberEnumerationDocumentation()
+ { return "Documentatie van enumeratie members"; }
+ QCString trMemberFunctionDocumentation()
+ { return "Documentatie van functie members"; }
+ QCString trMemberDataDocumentation()
+ { return "Documentatie van data members"; }
+ QCString trMore()
+ { return "Meer..."; }
+ QCString trListOfAllMembers()
+ { return "Lijst van alle members."; }
+ QCString trMemberList()
+ { return "Member Lijst"; }
+ QCString trThisIsTheListOfAllMembers()
+ { return "Dit is de complete lijst van alle members voor"; }
+ QCString trIncludingInheritedMembers()
+ { return ", inclusief alle overge&euml;rfde members."; }
+ QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Automatisch gegenereerd door Doxygen";
+ if (s) result+=(QCString)" voor "+s;
+ result+=" uit de programmatekst.";
+ return result;
+ }
+ QCString trEnumName()
+ { return "enum naam"; }
+ QCString trEnumValue()
+ { return "enum waarde"; }
+ QCString trDefinedIn()
+ { return "gedefinieerd in"; }
+ QCString trModules()
+ { return "Modules"; }
+ QCString trClassHierarchy()
+ { return "Klasse Hi&euml;rarchie"; }
+ QCString trCompoundList()
+ { return "Klasse Lijst"; }
+ QCString trFileList()
+ { return "Bestandslijst"; }
+ QCString trCompoundMembers()
+ { return "Klasse Members"; }
+ QCString trFileMembers()
+ { return "Bestand members"; }
+ QCString trRelatedPages()
+ { return "Gerelateerde pagina's"; }
+ QCString trExamples()
+ { return "Voorbeelden"; }
+ QCString trSearch()
+ { return "Zoeken"; }
+ QCString trClassHierarchyDescription()
+ { return "Deze inheritance lijst is min of meer alfabetisch "
+ "gesorteerd:";
+ }
+ QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Hieronder volgt de lijst met alle ";
+ if (!extractAll) result+="gedocumenteerde ";
+ result+="bestanden, elk met een korte beschrijving:";
+ return result;
+ }
+ QCString trCompoundListDescription()
+ { return "Hieronder volgen de klassen, structs en "
+ "unions met voor elk een korte beschrijving:";
+ }
+ QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Hieronder volgt de lijst met alle ";
+ if (!extractAll) result+="gedocumenteerde ";
+ result+="klasse members met links naar ";
+ if (!extractAll) result+="de klasse documentatie voor elke member:";
+ else result+="de klassen waartoe ze behoren:";
+ return result;
+ }
+ QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Hieronder volgt de lijst met alle ";
+ if (!extractAll) result+="gedocumenteerde ";
+ result+="bestand members met links naar ";
+ if (extractAll) result+="de bestand's documentatie voor elke member:";
+ else result+="de bestanden waartoe ze behoren:";
+ return result;
+ }
+ QCString trExamplesDescription()
+ { return "Hieronder volgt de lijst met alle voorbeelden:"; }
+ QCString trRelatedPagesDescription()
+ { return "Hieronder volgt de lijst met alle pagina's die gerelateerde documentatie bevatten:"; }
+ QCString trModulesDescription()
+ { return "Hieronder volgt de lijst met alle modules:"; }
+
+ QCString trDocumentation()
+ { return "Documentatie"; }
+ QCString trModuleIndex()
+ { return "Module Index"; }
+ QCString trHierarchicalIndex()
+ { return "Hi&euml;rarchische Index"; }
+ QCString trCompoundIndex()
+ { return "Klasse Index"; }
+ QCString trFileIndex()
+ { return "Bestand Index"; }
+ QCString trModuleDocumentation()
+ { return "Module Documentatie"; }
+ QCString trClassDocumentation()
+ { return "Klassen Documentatie"; }
+ QCString trFileDocumentation()
+ { return "Bestand Documentatie"; }
+ QCString trExampleDocumentation()
+ { return "Documentatie van voorbeelden"; }
+ QCString trPageDocumentation()
+ { return "Documentatie van gerelateerde pagina's"; }
+ QCString trReferenceManual()
+ { return "Naslagwerk"; }
+
+ QCString trDefines()
+ { return "Defines"; }
+ QCString trFuncProtos()
+ { return "Functie Prototypes"; }
+ QCString trTypedefs()
+ { return "Typedefs"; }
+ QCString trEnumerations()
+ { return "Enumeraties"; }
+ QCString trFunctions()
+ { return "Functies"; }
+ QCString trVariables()
+ { return "Variabelen"; }
+ QCString trEnumerationValues()
+ { return "Enumeratie waarden"; }
+ QCString trDefineDocumentation()
+ { return "Documentatie van defines"; }
+ QCString trFunctionPrototypeDocumentation()
+ { return "Documentatie van functie Prototypes"; }
+ QCString trTypedefDocumentation()
+ { return "Documentatie van typedefs"; }
+ QCString trEnumerationTypeDocumentation()
+ { return "Documentatie van enumeratie types"; }
+ QCString trEnumerationValueDocumentation()
+ { return "Documentatie van enumeratie waarden"; }
+ QCString trFunctionDocumentation()
+ { return "Documentatie van functies"; }
+ QCString trVariableDocumentation()
+ { return "Documentatie van variabelen"; }
+ QCString trCompounds()
+ { return "Klassen"; }
+ QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Gegenereerd op "+date;
+ if (projName) result+=(QCString)" voor "+projName;
+ result+=(QCString)" door";
+ return result;
+ }
+ QCString trWrittenBy()
+ {
+ return "geschreven door";
+ }
+ QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Klasse diagram voor "+clName;
+ }
+ QCString trForInternalUseOnly()
+ { return "Alleen voor intern gebruik."; }
+ QCString trWarning()
+ { return "Waarschuwing"; }
+ QCString trVersion()
+ { return "Versie"; }
+ QCString trDate()
+ { return "Datum"; }
+ QCString trReturns()
+ { return "Retourneert"; }
+ QCString trSeeAlso()
+ { return "Zie ook"; }
+ QCString trParameters()
+ { return "Parameters"; }
+ QCString trExceptions()
+ { return "Excepties"; }
+ QCString trGeneratedBy()
+ { return "Gegenereerd door"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNamespaceList()
+ { return "Namespace Lijst"; }
+ QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Hier is een lijst met alle ";
+ if (!extractAll) result+="gedocumenteerde ";
+ result+="namespaces met voor elk een korte beschrijving:";
+ return result;
+ }
+ QCString trFriends()
+ { return "Friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trRelatedFunctionDocumentation()
+ { return "Documentatie van friends en gerelateerde functies"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ // used as the title of the HTML page of a class/struct/union
+ {
+ QCString result=(QCString)clName;
+ if (isTemplate) result+=" Template";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Class"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ result+=" Referentie";
+ return result;
+ }
+ QCString trFileReference(const char *fileName)
+ // used as the title of the HTML page of a file
+ {
+ QCString result=fileName;
+ result+=" Bestand Referentie";
+ return result;
+ }
+ QCString trNamespaceReference(const char *namespaceName)
+ // used as the title of the HTML page of a namespace
+ {
+ QCString result=namespaceName;
+ result+=" Namespace Referentie";
+ return result;
+ }
+
+ // these are for the member sections of a class, struct or union
+ QCString trPublicMembers()
+ { return "Public Members"; }
+ QCString trPublicSlots()
+ { return "Public Slots"; }
+ QCString trSignals()
+ { return "Signals"; }
+ QCString trStaticPublicMembers()
+ { return "Static Public Members"; }
+ QCString trProtectedMembers()
+ { return "Protected Members"; }
+ QCString trProtectedSlots()
+ { return "Protected Slots"; }
+ QCString trStaticProtectedMembers()
+ { return "Static Protected Members"; }
+ QCString trPrivateMembers()
+ { return "Private Members"; }
+ QCString trPrivateSlots()
+ { return "Private Slots"; }
+ QCString trStaticPrivateMembers()
+ { return "Static Private Members"; }
+ // end of member sections
+
+ QCString trWriteList(int numEntries)
+ {
+ // this function is used to produce a comma-separated list of items.
+ // use generateMarker(i) to indicate where item i should be put.
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" en ";
+ }
+ }
+ return result;
+ }
+
+ QCString trInheritsList(int numEntries)
+ // used in class documentation to produce a list of base classes,
+ // if class diagrams are disabled.
+ {
+ return "Erft over van "+trWriteList(numEntries)+".";
+ }
+ QCString trInheritedByList(int numEntries)
+ // used in class documentation to produce a list of super classes,
+ // if class diagrams are disabled.
+ {
+ return "Wordt overge&euml;rfd door "+trWriteList(numEntries)+".";
+ }
+ QCString trReimplementedFromList(int numEntries)
+ // used in member documentation blocks to produce a list of
+ // members that are hidden by this one.
+ {
+ return "Nieuwe implementatie van "+trWriteList(numEntries)+".";
+ }
+ QCString trReimplementedInList(int numEntries)
+ {
+ // used in member documentation blocks to produce a list of
+ // all member that overwrite the implementation of this member.
+ return "Opnieuw ge&iuml;mplementeerd in "+trWriteList(numEntries)+".";
+ }
+
+ QCString trNamespaceMembers()
+ // This is put above each page as a link to all members of namespaces.
+ { return "Namespace Members"; }
+ QCString trNamespaceMemberDescription(bool extractAll)
+ // This is an introduction to the page with all namespace members
+ {
+ QCString result="Hier is een lijst van alle ";
+ if (!extractAll) result+="gedocumenteerde ";
+ result+="namespace members met links naar ";
+ if (extractAll)
+ result+="de namespace documentatie voor iedere member:";
+ else
+ result+="de namespaces waartoe ze behoren:";
+ return result;
+ }
+ QCString trNamespaceIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // index of all namespaces.
+ { return "Namespace Index"; }
+ QCString trNamespaceDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all namespaces.
+ { return "Namespace Documentatie"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ QCString trNamespaces()
+ {
+ return "Namespaces";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"De documentatie voor ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="deze klasse"; break;
+ case ClassDef::Struct: result+="deze struct"; break;
+ case ClassDef::Union: result+="deze union"; break;
+ case ClassDef::Interface: result+="dit interface"; break;
+ case ClassDef::Protocol: result+="dit protocol"; break;
+ case ClassDef::Category: result+="deze categorie"; break;
+ case ClassDef::Exception: result+="deze exceptie"; break;
+ }
+ result+=" is gegenereerd op grond van het volgende bestand";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ QCString trAlphabeticalList()
+ { return "Alphabetical List"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ QCString trReturnValues()
+ { return "Retour waarden"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ QCString trMainPage()
+ { return "Hoofd Pagina"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ QCString trPageAbbreviation()
+ { return "p."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDefinedAtLineInSourceFile()
+ {
+ return "De definitie bevindt zich op regel @0 in het bestand @1.";
+ }
+ QCString trDefinedInSourceFile()
+ {
+ return "De definitie bevindt zich in het bestand @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDeprecated()
+ {
+ return "Verouderd";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Collaboratie diagram voor "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Include afhankelijkheidsgraaf voor "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ QCString trConstructorDocumentation()
+ {
+ return "Constructor & Destructor Documentatie";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ QCString trGotoSourceCode()
+ {
+ return "Ga naar de broncode van dit bestand.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ QCString trGotoDocumentation()
+ {
+ return "Ga naar de documentatie van dit bestand.";
+ }
+ /*! Text for the \\pre command */
+ QCString trPrecondition()
+ {
+ return "Preconditie";
+ }
+ /*! Text for the \\post command */
+ QCString trPostcondition()
+ {
+ return "Postconditie";
+ }
+ /*! Text for the \\invariant command */
+ QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ QCString trInitialValue()
+ {
+ return "Initi&euml;le waarde:";
+ }
+ /*! Text used the source code in the file index */
+ QCString trCode()
+ {
+ return "code";
+ }
+ QCString trGraphicalHierarchy()
+ {
+ return "Grafische Klasse Hi&euml;rarchie";
+ }
+ QCString trGotoGraphicalHierarchy()
+ {
+ return "Ga naar de grafische klasse hi&euml;rarchie";
+ }
+ QCString trGotoTextualHierarchy()
+ {
+ return "Ga naar de tekstuele klasse hi&euml;rarchie";
+ }
+ QCString trPageIndex()
+ {
+ return "Pagina Index";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNote()
+ {
+ return "Noot";
+ }
+ QCString trPublicTypes()
+ {
+ return "Public Typen";
+ }
+ QCString trPublicAttribs()
+ {
+ return "Public Attributen";
+ }
+ QCString trStaticPublicAttribs()
+ {
+ return "Static Public Attributen";
+ }
+ QCString trProtectedTypes()
+ {
+ return "Protected Typen";
+ }
+ QCString trProtectedAttribs()
+ {
+ return "Protected Attributen";
+ }
+ QCString trStaticProtectedAttribs()
+ {
+ return "Static Protected Attributen";
+ }
+ QCString trPrivateTypes()
+ {
+ return "Private Typen";
+ }
+ QCString trPrivateAttribs()
+ {
+ return "Private Attributen";
+ }
+ QCString trStaticPrivateAttribs()
+ {
+ return "Static Private Attributen";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ QCString trTodo()
+ {
+ return "Todo";
+ }
+ /*! Used as the header of the todo list */
+ QCString trTodoList()
+ {
+ return "Todo Lijst";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trReferencedBy()
+ {
+ return "Wordt aangeroepen door";
+ }
+ QCString trRemarks()
+ {
+ return "Opmerkingen";
+ }
+ QCString trAttention()
+ {
+ return "Attentie";
+ }
+ QCString trInclByDepGraph()
+ {
+ return "Deze graaf geeft aan welke bestanden direct of "
+ "indirect afhankelijk zijn van dit bestand:";
+ }
+ QCString trSince()
+ {
+ return "Sinds";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ QCString trLegendTitle()
+ {
+ return "Graaf Legenda";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ QCString trLegendDocs()
+ {
+ return
+ "Deze pagina legt uit hoe de grafen die gegenereerd worden door doxygen "
+ "ge&iuml;nterpreteerd dienen te worden.<p>\n"
+ "Beschouw het volgende voorbeeld:\n"
+ "\\code\n"
+ "/*! Onzichtbare klasse vanwege afkappen van de graaf */\n"
+ "class Invisible { };\n\n"
+ "/*! Afgekapte klasse, overervingsrelatie is verborgen */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Klasse is niet gedocumenteerd met doxygen commentaar */\n"
+ "class Undocumented { };\n\n"
+ "/*! Klasse met public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Klasse met protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Klasse met private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Klasse die wordt gebruikt door de klasse Inherited */\n"
+ "class Used { };\n\n"
+ "/*! Super klasse die overerft van een aantal andere klassen */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Dit voorbeeld zal resulteren in de volgende graaf:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "De rechthoeken in the bovenstaande graaf hebben de volgende betekenis:\n"
+ "<ul>\n"
+ "<li>Een gevulde grijze rechthoek representeert de structure of klasse waarvoor "
+ "de graaf is gegeneerd.\n"
+ "<li>Een rechthoek met een zwarte rand representeert een gedocumenteerde structure of klasse.\n"
+ "<li>Een rechthoek met een grijze rand representeert een ongedocumenteerde structure of klasse.\n"
+ "<li>Een rechthoek met een rode rand representeert een gedocumenteerde structure or klasse waarvoor\n"
+ "niet alle overervings- of gebruiksrelaties konden worden getoond. Een graaf wordt "
+ "afgekapt als hij niet past binnen de gespecificeerde grenzen."
+ "</ul>\n"
+ "De pijlen hebben de volgende betekenis:\n"
+ "<ul>\n"
+ "<li>Een donkerblauwe pijl visualizeert een public inheritance "
+ "relatie tussen twee klassen.\n"
+ "<li>Een donkergroene pijl wordt gebruikt voor protected inheritance.\n"
+ "<li>Een donkerrode pijl wordt gebruikt voor private inheritance.\n"
+ "<li>Een paars gestippelde pijl wordt gebruikt indien een klasse bevat is of gebruikt wordt "
+ "door een andere klasse. De pijl is gelabeled met de variable(n) "
+ "die toegang geven tot de aangewezen klasse of structure. \n"
+ "<li>Een geel gestippelde pijl wordt gebruikt om een relatie tussen een \n"
+ "template instantie en een template klasse aan te geven. De pijl is gelabeld met \n"
+ "template parameters van de instantie.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ QCString trLegend()
+ {
+ return "legenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ QCString trTestList()
+ {
+ return "Test Lijst";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ QCString trDCOPMethods()
+ {
+ return "DCOP Methoden";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ QCString trProperties()
+ {
+ return "Properties";
+ }
+ /*! Used as a section header for IDL property documentation */
+ QCString trPropertyDocumentation()
+ {
+ return "Property Documentatie";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ QCString trClasses()
+ {
+ return "Klassen";
+ }
+ /*! Used as the title of a Java package */
+ QCString trPackage(const char *name)
+ {
+ return (QCString)"Package "+name;
+ }
+ /*! Title of the package index page */
+ QCString trPackageList()
+ {
+ return "Package Lijst";
+ }
+ /*! The description of the package index page */
+ QCString trPackageListDescription()
+ {
+ return "Hier volgen de packages, elk met een korte beschrijving (indien aanwezig):";
+ }
+ /*! The link name in the Quick links header for each page */
+ QCString trPackages()
+ {
+ return "Packages";
+ }
+ /*! Text shown before a multi-line define */
+ QCString trDefineValue()
+ {
+ return "Waarde:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ QCString trBug()
+ {
+ return "Bug";
+ }
+ /*! Used as the header of the bug list */
+ QCString trBugList()
+ {
+ return "Bug Lijst";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Index";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Klasse" : "klass"));
+ if (!singular) result+="n";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Bestand" : "bestand"));
+ if (!singular) result+="en";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Groep" : "groep"));
+ if (!singular) result+="en";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Pagina" : "pagina"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Member" : "member"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Globale member" : "globale member"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Auteur" : "auteur"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Gebruikt";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementeert "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implementation this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Wordt ge&iuml;mplementeerd door "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trRTFTableOfContents()
+ { return "Inhoudsopgave"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Deprecated Lijst";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for a section of events found in a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Events";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Event Documentatie";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Package Types";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Package Functies";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statische Package Functies";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Package Attributen";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statische Package Attributen";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Alle";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Hier is de call graaf voor deze functie:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the index
+ * of each page before the search field.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Zoek naar";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Zoek Resultaten";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Helaas, er zijn geen documenten gevonden die aan de zoekopdracht voldoen.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Er is <b>1</b> document gevonden dat aan de zoekopdracht voldoet.";
+ }
+ else
+ {
+ return "Er zijn <b>$num</b> documenten gevonden die aan de zoekopdracht voldoen. "
+ "De beste resultaten worden eerst getoond.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Gevonden:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " Bron Bestand";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Folder Hi&euml;rarchie"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Folder Documentatie"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Folders"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Deze folder hi&euml;rarchie is min of meer alfabetisch "
+ "gesorteerd:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Folder Referentie"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Folder" : "folder"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Deze functie is overloaded en is beschikbaar gemaakt om het "
+ "gebruik te vergemakkelijken. Ze verschilt alleen van de "
+ "bovenstaande functie wat betreft de parameterlijst.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallerGraph()
+ {
+ return "Hier is de caller graaf voor deze functie:";
+ }
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Member Functie/Subroutine Documentatie"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Lijst met data types"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Data velden"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Hieronder volgen de data types elk een korte beschrijving:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Hieronder volgt de lijst met alle ";
+ if (!extractAll) result+="gedocumenteerde ";
+ result+="data types met links naar ";
+ if (!extractAll) result+="de klasse documentatie voor elke member:";
+ else result+="de klassen waartoe ze behoren:";
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Data Type Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Data Type Documentatie"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Functies/Subroutines"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Functie/Subroutine Documentatie"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Data Types"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Module Lijst"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Hieronder volgt de lijst met alle ";
+ if (!extractAll) result+="gedocumenteerde ";
+ result+="modulen, elk met een korte beschrijving:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Module"; break;
+ case ClassDef::Struct: result+=" Type"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Referentie";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Module Referentie";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Module Members"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Hier is een lijst van alle ";
+ if (!extractAll) result+="gedocumenteerde ";
+ result+="module members met links naar ";
+ if (extractAll)
+ result+="de module documentatie voor iedere member:";
+ else
+ result+="de module waartoe ze behoren:";
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Module Index"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Module" : "module"));
+ if (!singular) result+="n";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"De documentatie voor ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="deze module"; break;
+ case ClassDef::Struct: result+="dit type"; break;
+ case ClassDef::Union: result+="deze union"; break;
+ case ClassDef::Interface: result+="dit interface"; break;
+ case ClassDef::Protocol: result+="dit protocol"; break;
+ case ClassDef::Category: result+="deze category"; break;
+ case ClassDef::Exception: result+="deze exception"; break;
+ }
+ result+=" is gegenereerd op grond van het volgende bestand";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Type" : "type"));
+ if (!singular) result+="s";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprogramma" : "subprogramma"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! C# Type Contraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Type Beperkingen";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" Relatie";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Laden...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Globale Namespace";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Zoeken...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Niets gevonden";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Folder afhankelijkheidsgraaf voor "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Bestand in "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Includeert bestand in "+name;
+ }
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Ma","Di","Wo","Do","Vr","Za","Zo" };
+ static const char *months[] = { "Jan","Feb","Maa","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Dec" };
+ QCString sdate;
+ sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+
+
+
+};
+
+#endif
diff --git a/src/translator_no.h b/src/translator_no.h
new file mode 100644
index 0000000..c4ed2b5
--- /dev/null
+++ b/src/translator_no.h
@@ -0,0 +1,1617 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/******************************************************************************
+ * Norwegian translation by Lars Erik Jordet <lejordet@gmail.com>, parts by Frode Nilsen
+ *
+ * This is a new translation made from scratch, not based on my older Norwegian translation (for 1.2.2)
+ *
+ * Translation notes (in Norwegian)
+ *
+ * Jeg har stort sett brukt ord som ligger ganske nr de engelske ekvivalentene,
+ * for eksempel "enumeration" -> "enumerasjon", og i enkelte tilfeller det engelske
+ * ordet direkte, der jeg finner det mer naturlig enn prve stable en setning
+ * p beina p norsk, eller jeg selv foretrekker det engelske ordet (eks: "Header-fil").
+ * Om noen ikke skulle like disse valgene, kontakt meg p mailadressen over.
+ *
+ * Doxygen har mange strings som bestr av sammensatte ord ("Member function description", for eksempel),
+ * som ikke alltid ser like ryddig ut p norsk. Jeg har brukt bindestrek for f
+ * det til se presentabelt ut, men om noen har en bedre id, send til mailadressen over.
+ *
+ * 2006-03-06:
+ * Jeg bruker ikke doxygen selv lenger, s det gr nok litt i lengste laget mellom oppdateringer...
+ *
+ * Changelog
+ *
+ * 2003-12-18: Initial translation
+ * 2004-07-19: Fixup to prepare for 1.3.8 (I had forgotten some functions)
+ * 2006-03-06: Added a .diff from Frode Nilsen, now compatible with 1.4.6.
+ */
+
+#ifndef TRANSLATOR_NO_H
+#define TRANSLATOR_NO_H
+
+class TranslatorNorwegian : public TranslatorAdapter_1_4_6
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "norwegian"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return
+ "\\usepackage[norwegian]{babel}\n"
+ "\\usepackage[T1]{fontenc}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-1";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Relaterte funksjoner"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Merk at disse ikke er medlemsfunksjoner.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Detaljert beskrivelse"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Medlemstypedef-dokumentasjon"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Medlemsenumerasjon-dokumentasjon"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Medlemsfunksjon-dokumentasjon"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Feltdokumentasjon";
+ }
+ else
+ {
+ return "Medlemsdata-dokumentasjon";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Mer..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Liste over alle medlemmer."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Medlemsliste"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Dette er den fullstendige listen over medlemmer for "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", alle arvede medlemmer inkludert."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Generert automatisk av Doxygen";
+ if (s) result+=(QCString)" for "+s;
+ result+=" fra kildekoden.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "enum-navn"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "enum-verdi"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "definert i"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Moduler"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Klassehierarki"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datastrukturer";
+ }
+ else
+ {
+ return "Klasseliste";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Fil-liste"; }
+
+ /*! This is put above each page as a link to the list of all verbatim headers */
+ virtual QCString trHeaderFiles()
+ { return "Header-filer"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datafelt";
+ }
+ else
+ {
+ return "Klassemedlemmer";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globale";
+ }
+ else
+ {
+ return "Filmedlemmer";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Relaterte sider"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Eksempler"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Sk"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Denne arvelisten er grovsortert alfabetisk "
+ "(ikke ndvendigvis korrekt):";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll) result+="dokumenterte ";
+ result+="filer med korte beskrivelser:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Her er datastrukturene med korte beskrivelser:";
+ }
+ else
+ {
+ return "Her er klasser, struct'er, "
+ "unioner og interface'er med korte beskrivelser:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll)
+ {
+ result+="dokumenterte ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struct- og unionfelter";
+ }
+ else
+ {
+ result+="klassemedlemmer";
+ }
+ result+=" med koblinger til ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struct/union dokumentasjon for hvert felt:";
+ }
+ else
+ {
+ result+="klassedokumentasjonen for hvert medlem:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struct'ene/unionene de hrer til:";
+ }
+ else
+ {
+ result+="klassene de hrer til:";
+ }
+ }
+ return result;
+ }
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll) result+="dokumenterte ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funksjoner, variabler, definisjoner, enum'er, og typedef'er";
+ }
+ else
+ {
+ result+="filmedlemmer";
+ }
+ result+=" med koblinger til ";
+ if (extractAll)
+ result+="filene de hrer til:";
+ else
+ result+="dokumentasjonen:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all header files. */
+ virtual QCString trHeaderFilesDescription()
+ { return "Her er alle header-filene som utgjr API'et:"; }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Her er en liste over alle eksemplene:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Her er en liste over alle relaterte dokumentasjonssider:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Her er en liste over alle moduler:"; }
+
+ /*! This sentences is used in the annotated class/file lists if no brief
+ * description is given.
+ */
+ virtual QCString trNoDescriptionAvailable()
+ { return "Ingen beskrivelse tilgjengelig"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentasjon"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Modulindeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarkisk indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datastrukturindeks";
+ }
+ else
+ {
+ return "Klasseindeks";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Filindeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Moduldokumentasjon"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datastrukturdokumentasjon";
+ }
+ else
+ {
+ return "Klassedokumentasjon";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Fildokumentasjon"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Eksempeldokumentasjon"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Sidedokumentasjon"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Referansemanual"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Definisjoner"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Funksjonprototyper"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Typedef'er"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumerasjoner"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funksjoner"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variabler"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Enumerasjonsverdier"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Define-dokumentasjon"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Funksjonsprototypedokumentasjon"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Typedef-dokumentasjon"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Enumerasjontype dokumentasjon"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Enumerasjonsverdi dokumentasjon"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Funksjonsdokumentasjon"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Variabeldokumentasjon"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datastrukturer";
+ }
+ else
+ {
+ return "Klasser";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generert "+date;
+ if (projName) result+=(QCString)" for "+projName;
+ result+=(QCString)" av";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "skrevet av";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Arvediagram for "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Kun for intern bruk."; }
+
+ /*! this text is generated when the \\reimp command is used. */
+ virtual QCString trReimplementedForInternalReasons()
+ { return "Reimplementert av interne grunner; API er ikke pvirket."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Advarsel"; }
+
+ /*! this text is generated when the \\bug command is used. */
+ virtual QCString trBugsAndLimitations()
+ { return "Feil og begrensninger"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versjon"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Dato"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Returnerer"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Se ogs"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametre"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Unntak"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Generert av"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Navneromsliste"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll) result+="dokumenterte ";
+ result+="navnerom med korte beskrivelser:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Venner"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Venner og relatert funksjonsdokumentasjon"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Klasse"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Grensesnitt"; break;
+ case ClassDef::Exception: result+=" Unntak"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ }
+ if (isTemplate) result+=" Mal";
+ result+=" Referanse";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" filreferanse";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" navneromsreferanse";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Public medlemsfunksjoner"; }
+ virtual QCString trPublicSlots()
+ { return "Public slots"; }
+ virtual QCString trSignals()
+ { return "Signaler"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statiske public medlemsfunksjoner"; }
+ virtual QCString trProtectedMembers()
+ { return "Protected memdlemsfunksjoner"; }
+ virtual QCString trProtectedSlots()
+ { return "Protected slots"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statiske protected medlemsfunksjoner"; }
+ virtual QCString trPrivateMembers()
+ { return "Private medlemsfunksjoner"; }
+ virtual QCString trPrivateSlots()
+ { return "Private slots"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statiske private medlemsfunksjoner"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", og ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Arver "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Arvet av "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplementert fra "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementert i "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Navneromsmedlemmer"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Her er en liste over alle ";
+ if (!extractAll) result+="dokumenterte ";
+ result+="navneromsmedlemmer med koblinger til ";
+ if (extractAll)
+ result+="navneromsdokumentasjonen for hvert medlem:";
+ else
+ result+="navnerommet de hrer til:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Navneromsindeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Navneromsdokumentasjon"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Navnerom"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentasjonen for ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="denne klasse"; break;
+ case ClassDef::Struct: result+="denne struct"; break;
+ case ClassDef::Union: result+="denne union"; break;
+ case ClassDef::Interface: result+="dette interface"; break;
+ case ClassDef::Exception: result+="dette unntak"; break;
+ case ClassDef::Protocol: result+="denne protocol"; break;
+ case ClassDef::Category: result+="denne category"; break;
+ }
+ result+=" ble generert fra flgende fil";
+ if (single) result+=":"; else result+="er:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Alfabetisk Liste"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Returverdier"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Hovedside"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "s."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trSources()
+ {
+ return "Kilder";
+ }
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definisjon p linje @0 i filen @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definisjon i filen @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Foreldet";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Samarbeidsdiagram for "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Avhengighetsgraf for "+fName+":";
+ }
+
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Konstruktr- & destruktr-dokumentasjon";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "G til kildekoden til denne filen.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "G til dokumentasjonen til denne filen.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Forhndsbetingelse";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Etterbetingelse";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Startverdi:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "kode";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafisk klassehierarki";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "G til det grafiske klasse hierarkiet";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "G til tekst-klassehierarki";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Innhold";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Notat";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Public typer";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datafelt";
+ }
+ else
+ {
+ return "Public attributter";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statiske public attributter";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Protected typer";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Protected attributter";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statiske protected attributter";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Private typer";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Private attributter";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statiske private attributter";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "Todo";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Todo-liste";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referert av";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Merknader";
+ }
+ virtual QCString trAttention()
+ {
+ return "Viktig";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Denne grafen viser hvilke filer som direkte eller "
+ "indirekte inkluderer denne filen:";
+ }
+ virtual QCString trSince()
+ {
+ return "Siden";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Symbolforklaring";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Denne siden forklarer hvordan man tolker grafene doxygen genererer.<p>\n"
+ "Vi baserer oss p flgende eksempel:\n"
+ "\\code\n"
+ "/*! Usynlig klasse pga. trunkasjon */\n"
+ "class Invisible { };\n\n"
+ "/*! Trunkert klasse, arve-relasjon er skjult */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Klasse som ikke er dokumentert med doxygen-kommentarer */"
+ "class Undocumented { };\n\n"
+ "/*! Klasse med public-arv */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Klasse med protected-arv */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Klasse med private-arv */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Klasse som blir brukt av klassen Inherited */\n"
+ "class Used { };\n\n"
+ "/*! Super-klasse som arver flere andre klasser */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Hvis \\c MAX_DOT_GRAPH_HEIGHT er satt til 200 i "
+ "konfigurasjonsfila vil dette resultere i flgende graf:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Boksene i grafen over betyr flgende:\n"
+ "<ul>\n"
+ "<li>En fylt svart boks representerer klassen grafen "
+ "er generert for.\n"
+ "<li>En boks med svart ramme angir en dokumentert struct eller klasse.\n"
+ "<li>En boks med gr ramme angir en udokumentert struct eller klasse.\n"
+ "<li>En boks med rd ramme angir en dokumentert struct eller klasse "
+ "der ikke alle relasjoner er vist. En graf blir trunkert om den ikke "
+ "passer innenfor de spesifiserte rammene.\n"
+ "</ul>\n"
+ "Pilene i grafen har flgende betydning:\n"
+ "</ul>\n"
+ "<li>En mrk bl pil brukes til visualisere public-arv mellom to klasser.\n"
+ "<li>En mrk grnn pil brukes for protected-arv.\n"
+ "<li>En mrk rd pil angir private-arv.\n"
+ "<li>En stiplet lilla pil angir at en klasse er inkludert eller brukt "
+ "i en annen klasse. Pilen er merket med variablen(e) klassen "
+ "er tilgjengelig gjennom.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "symbolforklaring";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Test-liste";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP-metoder";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Egenskaper";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Egenskaps-dokumentasjon";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java interfaces in the summary section of Java packages */
+ virtual QCString trInterfaces()
+ {
+ return "Grensesnitt";
+ }
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datastrukturer";
+ }
+ else
+ {
+ return "Klasser";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Package "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Pakke-liste";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Her er pakkene med korte beskrivelser (om tilgjengelig):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pakker";
+ }
+ /*! Used as a chapter title for Latex & RTF output */
+ virtual QCString trPackageDocumentation()
+ {
+ return "Pakke-dokumentasjon";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Verdi:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Feil";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Feil-liste";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indeks";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Klasse" : "klasse"));
+ if (!singular) result+="r";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Fil" : "fil"));
+ if (!singular) result+="er";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Navnerom" : "navnerom"));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Gruppe" : "gruppe"));
+ if (!singular) result+="r";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Side" : "side"));
+ if (!singular) result+="r";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Medlem" : "medlem"));
+ if (!singular) result+="mer";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trField(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Felt" : "felt"));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="e";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Forfatter" : "forfatter"));
+ if (!singular) result+="e";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referanser";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementerer "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementert i "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Innholdsfortegnelse";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Liste over foreldede enheter";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Hendelser";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Hendelsesdokumentasjon";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Pakketyper";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Pakkefunksjoner";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statiske Pakkefunksjoner";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Pakkeattributter";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statiske Pakkeattributter";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Alle";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Her er kall-grafen for denne funksjonen:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Sk etter";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Skeresultater";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Beklager, men ingen dokumenter ble funnet.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Fant <b>ett</b> dokument som passet ditt sk.";
+ }
+ else
+ {
+ return "Fant <b>$num</b> dokumenter som passet ditt sk. "
+ "Viser beste treff frst.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Treff:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Kildefil " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Katalog hierarki"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Katalogdokumentasjon"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Kataloger"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Denne katalogen er grovsortert alfabetisk "
+ "(ikke ndvendigvis korrekt).";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Katalog referanse"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Katalog" : "katalog"));
+ if (!singular) result+="er";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Dette er en overloaded medlemsfunksjon, "
+ "generert for deg. Den skiller seg ut fra "
+ "funksjonen ovenfor i argument(ene) den aksepterer.";
+ }
+};
+
+#endif
diff --git a/src/translator_pl.h b/src/translator_pl.h
new file mode 100644
index 0000000..db301be
--- /dev/null
+++ b/src/translator_pl.h
@@ -0,0 +1,1804 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * Polish translation was updated to version 1.3.9 by
+ * Piotr Kaminski (Piotr.Kaminski@ctm.gdynia.pl)
+ */
+
+#ifndef TRANSLATOR_PL_H
+#define TRANSLATOR_PL_H
+
+class TranslatorPolish : public TranslatorAdapter_1_6_3
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. May resemble
+ * the string returned by latexBabelPackage(), but it is not used
+ * for the same purpose. The identification should not be translated.
+ * It should be replaced by the name of the language in English
+ * (e.g. Czech, Japanese, Russian, etc.). It should be equal to
+ * the identification in language.h.
+ */
+ QCString idLanguage()
+ { return "polish"; }
+ /*! Used to get the command(s) for the language support. This method
+ * was designed for languages which do not prefer babel package.
+ * If this methods returns empty string, then the latexBabelPackage()
+ * method is used to generate the command for using the babel package.
+ */
+ QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage{polski}\n"
+ "\\usepackage[T1]{fontenc}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ QCString trRelatedFunctions()
+ { return "Funkcje powiązane"; }
+
+ /*! subscript for the related functions. */
+ QCString trRelatedSubscript()
+ { return "(Zauważ, że to nie są metody klas.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ QCString trDetailedDescription()
+ { return "Opis szczegółowy"; }
+
+ /*! header that is put before the list of typedefs. */
+ QCString trMemberTypedefDocumentation()
+ { return "Dokumentacja składowych definicji typu"; }
+
+ /*! header that is put before the list of enumerations. */
+ QCString trMemberEnumerationDocumentation()
+ { return "Dokumentacja składowych wyliczanych"; }
+
+ /*! header that is put before the list of member functions. */
+ QCString trMemberFunctionDocumentation()
+ { return "Dokumentacja funkcji składowych"; }
+
+ /*! header that is put before the list of member attributes. */
+ QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dokumentacja pól";
+ }
+ else
+ {
+ return "Dokumentacja atrybutów składowych";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ QCString trMore()
+ { return "Więcej..."; }
+
+ /*! put in the class documentation */
+ QCString trListOfAllMembers()
+ { return "Lista wszystkich składowych."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ QCString trMemberList()
+ { return "Lista składowych"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ QCString trThisIsTheListOfAllMembers()
+ { return "To jest kompletna lista składowych dla "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ QCString trIncludingInheritedMembers()
+ { return ", uwzględniająca wszystkie dziedziczone składowe."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Wygenerowano automatycznie z kodu źródłowego programem Doxygen";
+ if (s) result+=(QCString)" dla "+s;
+ result+=".";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ QCString trEnumName()
+ { return "nazwa wyliczenia"; }
+
+ /*! put after an enum value in the list of all members */
+ QCString trEnumValue()
+ { return "wartość wyliczenia"; }
+
+ /*! put after an undocumented member in the list of all members */
+ QCString trDefinedIn()
+ { return "zdefiniowana w"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ QCString trModules()
+ { return "Moduły"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ QCString trClassHierarchy()
+ { return "Hierarchia klas"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Struktury danych";
+ }
+ else
+ {
+ return "Lista klas";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ QCString trFileList()
+ { return "Lista plików"; }
+
+ /*! This is put above each page as a link to the list of all verbatim headers */
+ QCString trHeaderFiles()
+ { return "Pliki nagłówkowe"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Pola danych";
+ }
+ else
+ {
+ return "Składowe klas";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globalne";
+ }
+ else
+ {
+ return "Składowe plików";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ QCString trRelatedPages()
+ { return "Dodatkowe strony"; }
+
+ /*! This is put above each page as a link to all examples. */
+ QCString trExamples()
+ { return "Przykłady"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ QCString trSearch()
+ { return "Szukaj"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ QCString trClassHierarchyDescription()
+ { return "Ta lista dziedziczenia posortowana jest z grubsza, "
+ "choć nie całkowicie, alfabetycznie:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Tutaj znajduje się lista wszystkich ";
+ if (!extractAll) result+="udokumentowanych ";
+ result+="plików z ich krótkimi opisami:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Tutaj znajdują się struktury danych wraz z ich krótkimi opisami:";
+ }
+ else
+ {
+ return "Tutaj znajdują się klasy, struktury, "
+ "unie i interfejsy wraz z ich krótkimi opisami:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Tutaj znajduje się lista wszystkich ";
+ if (!extractAll)
+ {
+ result+="udokumentowanych ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="pól struktur i unii";
+ }
+ else
+ {
+ result+="składowych";
+ }
+ result+=" wraz z odnośnikami do ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="dokumentacji struktur/unii dla każdego pola:";
+ }
+ else
+ {
+ result+="dokumentacji klas dla każdej składowej:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktur/unii, do których dane pole należy:";
+ }
+ else
+ {
+ result+="klas, do których dana składowa należy:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Tutaj znajduje się lista wszystkich ";
+ if (!extractAll) result+="udokumentowanych ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funkcji, zmiennych, makr, wyliczeń i definicji typów";
+ }
+ else
+ {
+ result+="składowych plików";
+ }
+ result+=" wraz z odnośnikami do ";
+ if (extractAll)
+ result+="plików, do których one należą:";
+ else
+ result+="dokumentacji:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all header files. */
+ QCString trHeaderFilesDescription()
+ { return "Tutaj znajdują się pliki nagłówkowe tworzące API:"; }
+
+ /*! This is an introduction to the page with the list of all examples */
+ QCString trExamplesDescription()
+ { return "Tutaj znajduje się lista wszystkich przykładów:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ QCString trRelatedPagesDescription()
+ { return "Tutaj znajduje się lista wszystkich stron dokumentacji:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ QCString trModulesDescription()
+ { return "Tutaj znajduje się lista wszystkich grup:"; }
+
+ /*! This sentences is used in the annotated class/file lists if no brief
+ * description is given.
+ */
+ QCString trNoDescriptionAvailable()
+ { return "Brak opisu"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ QCString trDocumentation()
+ { return "Dokumentacja"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ QCString trModuleIndex()
+ { return "Indeks grup"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ QCString trHierarchicalIndex()
+ { return "Indeks hierarchiczny"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Indeks struktur danych";
+ }
+ else
+ {
+ return "Indeks klas";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ QCString trFileIndex()
+ { return "Indeks plików"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ QCString trModuleDocumentation()
+ { return "Dokumentacja grup"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dokumentacja struktur danych";
+ }
+ else
+ {
+ return "Dokumentacja klas";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ QCString trFileDocumentation()
+ { return "Dokumentacja plików"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ QCString trExampleDocumentation()
+ { return "Dokumentacja przykładów"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ QCString trPageDocumentation()
+ { return "Dokumentacja stron"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ QCString trReferenceManual()
+ { return "Podręcznik"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ QCString trDefines()
+ { return "Definicje"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ QCString trFuncProtos()
+ { return "Prototypy funkcji"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ QCString trTypedefs()
+ { return "Definicje typów"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ QCString trEnumerations()
+ { return "Wyliczenia"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ QCString trFunctions()
+ { return "Funkcje"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ QCString trVariables()
+ { return "Zmienne"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ QCString trEnumerationValues()
+ { return "Wartości wyliczeń"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ QCString trDefineDocumentation()
+ { return "Dokumentacja definicji"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ QCString trFunctionPrototypeDocumentation()
+ { return "Dokumentacja prototypów funkcji"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ QCString trTypedefDocumentation()
+ { return "Dokumentacja definicji typów"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ QCString trEnumerationTypeDocumentation()
+ { return "Dokumentacja typów wyliczanych"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ QCString trFunctionDocumentation()
+ { return "Dokumentacja funkcji"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ QCString trVariableDocumentation()
+ { return "Dokumentacja zmiennych"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Struktury danych";
+ }
+ else
+ {
+ return "Komponenty";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Wygenerowano "+date;
+ if (projName) result+=(QCString)" dla "+projName;
+ result+=(QCString)" programem";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ QCString trWrittenBy()
+ {
+ return "napisanym przez";
+ }
+
+ /*! this text is put before a class diagram */
+ QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagram dziedziczenia dla "+clName;
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ QCString trForInternalUseOnly()
+ { return "Tylko do użytku wewnętrznego."; }
+
+ /*! this text is generated when the \\reimp command is used. */
+ QCString trReimplementedForInternalReasons()
+ { return "Reimplementowana z wewnętrzych przyczyn; nie dotyczy API."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ QCString trWarning()
+ { return "Ostrzeżenie"; }
+
+ /*! this text is generated when the \\bug command is used. */
+ QCString trBugsAndLimitations()
+ { return "Błędy i ograniczenia"; }
+
+ /*! this text is generated when the \\version command is used. */
+ QCString trVersion()
+ { return "Wersja"; }
+
+ /*! this text is generated when the \\date command is used. */
+ QCString trDate()
+ { return "Data"; }
+
+ /*! this text is generated when the \\return command is used. */
+ QCString trReturns()
+ { return "Zwraca"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ QCString trSeeAlso()
+ { return "Zobacz również"; }
+
+ /*! this text is generated when the \\param command is used. */
+ QCString trParameters()
+ { return "Parametry"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ QCString trExceptions()
+ { return "Wyjątki"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ QCString trGeneratedBy()
+ { return "Wygenerowano przez"; }
+
+ // new since 0.49-990307
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ QCString trNamespaceList()
+ { return "Lista przestrzeni nazw"; }
+
+ /*! used as an introduction to the namespace list */
+ QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Tutaj znajdują się wszystkie ";
+ if (!extractAll) result+="udokumentowane ";
+ result+="przestrzenie nazw wraz z ich krótkimi opisami:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ QCString trFriends()
+ { return "Przyjaciele"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ QCString trRelatedFunctionDocumentation()
+ { return "Dokumentacja przyjaciół i funkcji związanych"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Dokumentacja";
+ if (isTemplate) result+=" szablonu";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" klasy "; break;
+ case ClassDef::Struct: result+=" struktury "; break;
+ case ClassDef::Union: result+=" unii "; break;
+ case ClassDef::Interface: result+=" interfejsu "; break;
+ case ClassDef::Protocol: result+=" protokołu "; break;
+ case ClassDef::Category: result+=" kategorii "; break;
+ case ClassDef::Exception: result+=" wyjątku "; break;
+ }
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ QCString trFileReference(const char *fileName)
+ {
+ QCString result="Dokumentacja pliku ";
+ result+=fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result="Dokumentacja przestrzeni nazw ";
+ result+=namespaceName;
+ return result;
+ }
+
+ /* these are for the member sections of a class, struct or union */
+ QCString trPublicMembers()
+ { return "Metody publiczne"; }
+ QCString trPublicSlots()
+ { return "Sloty publiczne"; }
+ QCString trSignals()
+ { return "Sygnały"; }
+ QCString trStaticPublicMembers()
+ { return "Statyczne metody publiczne"; }
+ QCString trProtectedMembers()
+ { return "Metody chronione"; }
+ QCString trProtectedSlots()
+ { return "Sloty chronione"; }
+ QCString trStaticProtectedMembers()
+ { return "Statyczne metody chronione"; }
+ QCString trPrivateMembers()
+ { return "Metody prywatne"; }
+ QCString trPrivateSlots()
+ { return "Sloty prywatne"; }
+ QCString trStaticPrivateMembers()
+ { return "Statyczne metody prywatne"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" i ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ QCString trInheritsList(int numEntries)
+ {
+ return "Dziedziczy "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ QCString trInheritedByList(int numEntries)
+ {
+ return "Dziedziczona przez "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplementowana z "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementowana w "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ QCString trNamespaceMembers()
+ { return "Składowe przestrzeni nazw"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Tutaj znajduje się lista wszystkich ";
+ if (!extractAll) result+="udokumentowanych ";
+ result+="składowych wraz z odnośnikami do ";
+ if (extractAll)
+ result+="dokumentacji przestrzeni nazw dla każdej składowej:";
+ else
+ result+="przestrzeni nazw do których składowe te należą:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ QCString trNamespaceIndex()
+ { return "Indeks przestrzeni nazw"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ QCString trNamespaceDocumentation()
+ { return "Dokumentacja przestrzeni nazw"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ QCString trNamespaces()
+ { return "Przestrzenie nazw"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentacja dla te";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="j klasy"; break;
+ case ClassDef::Struct: result+="j struktury"; break;
+ case ClassDef::Union: result+="j unii"; break;
+ case ClassDef::Interface: result+="go interfejsu"; break;
+ case ClassDef::Protocol: result+="go protokołu"; break;
+ case ClassDef::Category: result+="j kategorii"; break;
+ case ClassDef::Exception: result+="go wyjątku"; break;
+ }
+ result+=" została wygenerowana z plik";
+ if (single) result+="u:"; else result+="ów:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ QCString trAlphabeticalList()
+ { return "Lista alfabetyczna"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ QCString trReturnValues()
+ { return "Zwracane wartości"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ QCString trMainPage()
+ { return "Strona główna"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ QCString trPageAbbreviation()
+ { return "str."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trSources()
+ {
+ return "Źródła";
+ }
+ QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definicja w linii @0 pliku @1.";
+ }
+ QCString trDefinedInSourceFile()
+ {
+ return "Definicja w pliku @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDeprecated()
+ {
+ return "Do wycofania";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagram współpracy dla "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Wykres zależności załączania dla "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ QCString trConstructorDocumentation()
+ {
+ return "Dokumentacja konstruktora i destruktora";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ QCString trGotoSourceCode()
+ {
+ return "Idź do kodu źródłowego tego pliku.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ QCString trGotoDocumentation()
+ {
+ return "Idź do dokumentacji tego pliku.";
+ }
+ /*! Text for the \\pre command */
+ QCString trPrecondition()
+ {
+ return "Warunek wstępny";
+ }
+ /*! Text for the \\post command */
+ QCString trPostcondition()
+ {
+ return "Warunek końcowy";
+ }
+ /*! Text for the \\invariant command */
+ QCString trInvariant()
+ {
+ return "Niezmiennik";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ QCString trInitialValue()
+ {
+ return "Wartość początkowa:";
+ }
+ /*! Text used the source code in the file index */
+ QCString trCode()
+ {
+ return "kod źródłowy";
+ }
+ QCString trGraphicalHierarchy()
+ {
+ return "Graficzna hierarchia klas";
+ }
+ QCString trGotoGraphicalHierarchy()
+ {
+ return "Idź do graficznej hierarchi klas";
+ }
+ QCString trGotoTextualHierarchy()
+ {
+ return "Idź do tekstowej hierarchi klas";
+ }
+ QCString trPageIndex()
+ {
+ return "Indeks stron";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNote()
+ {
+ return "Nota";
+ }
+ QCString trPublicTypes()
+ {
+ return "Typy publiczne";
+ }
+ QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Pola danych";
+ }
+ else
+ {
+ return "Atrybuty publiczne";
+ }
+ }
+ QCString trStaticPublicAttribs()
+ {
+ return "Statyczne atrybuty publiczne";
+ }
+ QCString trProtectedTypes()
+ {
+ return "Typy chronione";
+ }
+ QCString trProtectedAttribs()
+ {
+ return "Atrybuty chronione";
+ }
+ QCString trStaticProtectedAttribs()
+ {
+ return "Statyczne atrybuty chronione";
+ }
+ QCString trPrivateTypes()
+ {
+ return "Typy prywatne";
+ }
+ QCString trPrivateAttribs()
+ {
+ return "Atrybuty prywatne";
+ }
+ QCString trStaticPrivateAttribs()
+ {
+ return "Statyczne atrybuty prywatne";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ QCString trTodo()
+ {
+ return "Do zrobienia";
+ }
+ /*! Used as the header of the todo list */
+ QCString trTodoList()
+ {
+ return "Lista rzeczy do zrobienia";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trReferencedBy()
+ {
+ return "Odwołania w";
+ }
+ QCString trRemarks()
+ {
+ return "Spostrzeżenia";
+ }
+ QCString trAttention()
+ {
+ return "Uwaga";
+ }
+ QCString trInclByDepGraph()
+ {
+ return "Ten wykres pokazuje, które pliki bezpośrednio lub "
+ "pośrednio załączają ten plik:";
+ }
+ QCString trSince()
+ {
+ return "Od";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ QCString trLegendTitle()
+ {
+ return "Legenda wykresu";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ QCString trLegendDocs()
+ {
+ return
+ "Ta strona wyjaśnia jak interpretować wykresy, które są wygenerowane "
+ "przez doxygen.<p>\n"
+ "Rozważ następujący przykład:\n"
+ "\\code\n"
+ "/*! Klasa Niewidzialna z powodu okrojenia */\n"
+ "class Niewidzialna { };\n\n"
+ "/*! Klasa Okrojona, relacja dziedziczenia jest ukryta */\n"
+ "class Okrojona : public Niewidzialna { };\n\n"
+ "/* Klasa nie udokumentowana komentarzami doxygen */\n"
+ "class Nieudokumentowana { };\n\n"
+ "/*! Klasa, która jest dziedziczona publicznie */\n"
+ "class PublicznaBaza : public Okrojona { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Klasa, która jest dziedziczona przy użyciu dziedziczenia chronionego */\n"
+ "class ChronionaBaza { };\n\n"
+ "/*! Klasa, która jest dziedziczona prywatnie */\n"
+ "class PrywatnaBaza { };\n\n"
+ "/*! Klasa, która jest użyta przez klasę Dziedziczona */\n"
+ "class Uzyta { };\n\n"
+ "/*! Superklasa, która dziedziczy kilka innych klas */\n"
+ "class Dziedziczona : public PublicznaBaza,\n"
+ " protected ChronionaBaza,\n"
+ " private PrywatnaBaza,\n"
+ " public Nieudokumentowana,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Uzyta *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Rezultat na następującym wykresie:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n"
+ "<p>\n"
+ "Prostokąty w powyższym wykresie mają następujące znaczenie:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>Wypełniony czarny prostokąt reprezentuje strukturę lub klasę dla "
+ "której został wygenerowany wykres.</li>\n"
+ "<li>Prostokąt z czarną obwolutą oznacza udokumentowaną strukturę lub klasę.</li>\n"
+ "<li>Prostokąt z szarą obwolutą oznacza nieudokumentowaną strukturę lub klasę.</li>\n"
+ "<li>Prostokąt z czerwoną obwolutą oznacza udokumentowaną strukturę lub klasę dla\n"
+ "której nie są pokazane wszystkie relacje dziedziczenia/zawierania. Wykres jest "
+ "okrojony, jeśli nie mieści się w określonych brzegach.</li>\n"
+ "</ul>\n"
+ "<p>\n"
+ "Strzałki mają następujące znaczenie:\n"
+ "<p>\n"
+ "<ul>\n"
+ "<li>Ciemno niebieska strzałka jest używana do wizualizacji relacji "
+ "dziedziczenia publicznego pomiędzy dwiema klasami.</li>\n"
+ "<li>Ciemno zielona strzałka jest używana dla dziedziczenia chronionego.</li>\n"
+ "<li>Ciemno czerwona strzałka jest używana dla dziedziczenia prywatnego.</li>\n"
+ "<li>Fioletowa przerywana strzałka jest używana jeśli klasa jest zawarta "
+ "lub użyta przez inną klasę. Strzałka jest podpisana zmienną(ymi) "
+ "przez które wskazywana klasa lub struktura jest dostępna. </li>\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ QCString trLegend()
+ {
+ return "legenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ QCString trTestList()
+ {
+ return "Lista testu";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Metody DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Właściwości";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Dokumentacja właściwości";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java interfaces in the summary section of Java packages */
+ virtual QCString trInterfaces()
+ {
+ return "Interfejsy";
+ }
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Struktury Danych";
+ }
+ else
+ {
+ return "Klasy";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Pakiet "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Lista Pakietów";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Oto lista pakietów wraz z krótkim opisem (o ile jest dostępny):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pakiety";
+ }
+ /*! Used as a chapter title for Latex & RTF output */
+ virtual QCString trPackageDocumentation()
+ {
+ return "Dokumentacja Pakietu";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Wartość:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Błąd";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Lista błędów";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6-20010422
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "1250";
+ }
+
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "238";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indeks";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Klas" : "klas"));
+ result+=(singular ? "a" : "y");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Plik" : "plik"));
+ if (!singular) result+="i";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Przestrze" : "przestrze"));
+ result+=(singular ? "ń" : "nie");
+ result+=" nazw";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grupa" : "grupa"));
+ result+=(singular ? "a" : "y");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Stron" : "stron"));
+ result+=(singular ? "a" : "y");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Składow" : "składow"));
+ result+=(singular ? "a" : "e");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trField(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Pol" : "pol"));
+ result+=(singular ? "e" : "a");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ result+=(singular ? "ny" : "ne");
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Auto" : "auto"));
+ result += (singular) ? "r" : "rzy";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Odwołuje się do";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementuje "+trWriteList(numEntries)+".";
+ }
+
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementowany w "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Spis treści";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Lista elementów do wycofania";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Zdarzenia";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Dokumentacja zdarzeń";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Typy pakietu";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funkcje pakietu";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statyczne funkcje pakietu";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atrybuty pakietu";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statyczne atrybuty pakietu";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "All";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Oto graf wywołań dla tej funkcji:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Szukaj";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Wyniki szukania";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Niestety żaden dokument nie pasuje do twojego zapytania.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Znaleziono <b>1</b> dokument pasujący do twojego zapytania.";
+ }
+ int count = numDocuments % 10;
+ if ((count>=2) && (count<=4))
+ {
+ return "Znaleziono <b>$num</b> dokumenty pasujące do twojego zapytania. "
+ "Najlepiej pasujące dokumenty wyświetlane są na początku listy.";
+ }
+ else
+ {
+ return "Znaleziono <b>$num</b> dokumentów pasujących do twojego zapytania. "
+ "Najlepiej pasujące dokumenty wyświetlane są na początku listy.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Pasujące słowa:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Plik źródłowy " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Struktura katalogów"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Dokumentacja katalogów"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Katalogi"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ {
+ return "Ta struktura katalogów jest posortowana jest z grubsza, "
+ "choć nie całkowicie, alfabetycznie:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result="Dokumentacja katalogu "; result+=dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Katalog" : "katalog"));
+ if (! singular) result+="i";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "To jest metoda przeciążona, udostępniona dla wygody. "
+ "Różni się od powyższej metody tylko zestawem akceptowanych argumentów.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Oto graf wywoływań tej funkcji:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Dokumentacja wyliczeń"; } //TODO check if it is correct translation
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Dokumentacja składowej funkcji/podprogramu"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Lista typów danych"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Pola danych"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Tutaj znajdują się typy danych z ich krótkimi opisami:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Tutaj znajduje się lista wszystkich ";
+ if (!extractAll)
+ {
+ result+="udokumentowanych ";
+ }
+ result+="składowych typów danych";
+ result+=" wraz z odnośnikami do ";
+ if (!extractAll)
+ {
+ result+="dokumentacji struktury danych dla każdej składowej";
+ }
+ else
+ {
+ result+="typów danych, do których dana składowa należy:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Indeks typów danych"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Dokumentacja typów danych"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funkcje/podprogramy"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Dokumentacja funkcji/podprogramu"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Typy danych"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Lista modułów"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Tutaj znajduje się lista wszystkich ";
+ if (!extractAll) result+="udokumentowanych ";
+ result+="modułów z ich krótkimi opisami:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Dokumentacja";
+ if (isTemplate) result+=" szablonu";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" modułu "; break;
+ case ClassDef::Struct: result+=" typu "; break;
+ case ClassDef::Union: result+=" unii "; break;
+ case ClassDef::Interface: result+=" interfejsu "; break;
+ case ClassDef::Protocol: result+=" protokołu "; break;
+ case ClassDef::Category: result+=" kategorii "; break;
+ case ClassDef::Exception: result+=" wyjątku "; break;
+ }
+ result+=(QCString)clName;
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result="Dokumentacja modułu ";
+ result+=namespaceName;
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Składowe modułu"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Tutaj znajduje się lista wszystkich ";
+ if (!extractAll) result+="udokumentowanych ";
+ result+="składowych modułów wraz z odnośnikami do ";
+ if (extractAll)
+ {
+ result+="dokumentacji modułu dla każdej składowej:";
+ }
+ else
+ {
+ result+="modułów do których składowe te należą:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Indeks modułu"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Moduł" : "moduł"));
+ if (!singular) result+="y";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentacja dla te";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="go modułu"; break;
+ case ClassDef::Struct: result+="go typu"; break;
+ case ClassDef::Union: result+="j unii"; break;
+ case ClassDef::Interface: result+="go interfejsu"; break;
+ case ClassDef::Protocol: result+="go protokołu"; break;
+ case ClassDef::Category: result+="j kategorii"; break;
+ case ClassDef::Exception: result+="go wyjątku"; break;
+ }
+ result+=" została wygenerowana z plik";
+ if (single) result+="u:"; else result+="ów:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Typ" : "typ"));
+ if (!singular) result+="y";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Podprogram" : "podprogram"));
+ if (!singular) result+="y";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Więzy typów"; //TODO check if it is correct translation
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Relcja "+ QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Wczytywanie...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Globalna przestrzeń nazw";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Szukanie...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Brak dopasowań";
+ }
+
+};
+
+#endif
diff --git a/src/translator_pt.h b/src/translator_pt.h
new file mode 100644
index 0000000..3527f97
--- /dev/null
+++ b/src/translator_pt.h
@@ -0,0 +1,1483 @@
+/******************************************************************************
+ *
+ * $Id: translator_pt.h,v 1.2 2001/03/19 19:27:42 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * The translation into Portuguese was provided by
+ * Rui Godinho Lopes <rui@ruilopes.com>
+ * http://www.ruilopes.com
+ *
+ * VERSION HISTORY
+ * ---------------
+ * 007 09 june 2003
+ * ! Updated for doxygen v1.3.1
+ * 006 30 july 2002
+ * ! Updated for doxygen v1.2.17
+ * 005 10 july 2002
+ * ! Updated for doxygen v1.2.16
+ * 004 03 march 2002
+ * ! Updated for doxygen v1.2.14
+ * 003 23 november 2001
+ * - Removed some obsolete methods (latexBabelPackage, trAuthor, trAuthors and trFiles)
+ * 002 19 november 2001
+ * ! Updated for doxygen v1.2.12
+ * 001 20 july 2001
+ * ! Updated for doxygen v1.2.8.1
+ * 000 ?
+ * + Initial translation for doxygen v1.1.5
+ */
+
+#ifndef TRANSLATOR_PT_H
+#define TRANSLATOR_PT_H
+
+class TranslatorPortuguese : public TranslatorAdapter_1_3_3
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ QCString idLanguage()
+ { return "portuguese"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ { return "Portuguese"; }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ { return "iso-8859-1"; }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ QCString trRelatedFunctions()
+ { return "Funes associadas"; }
+
+ /*! subscript for the related functions. */
+ QCString trRelatedSubscript()
+ { return "(Note que no so funes membro)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ QCString trDetailedDescription()
+ { return "Descrio detalhada"; }
+
+ /*! header that is put before the list of typedefs. */
+ QCString trMemberTypedefDocumentation()
+ { return "Documentao das definies de tipo"; }
+
+ /*! header that is put before the list of enumerations. */
+ QCString trMemberEnumerationDocumentation()
+ { return "Documentao das enumeraes"; }
+
+ /*! header that is put before the list of member functions. */
+ QCString trMemberFunctionDocumentation()
+ { return "Documentao dos mtodos"; }
+
+ /*! header that is put before the list of member attributes. */
+ QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentao dos campos e atributos";
+ }
+ else
+ {
+ return "Documentao dos dados membro";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ QCString trMore()
+ { return "Mais..."; }
+
+ /*! put in the class documentation */
+ QCString trListOfAllMembers()
+ { return "Mostrar lista completa dos membros"; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ QCString trMemberList()
+ { return "Lista dos membros"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ QCString trThisIsTheListOfAllMembers()
+ { return "Lista completa de todos os membros de "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ QCString trIncludingInheritedMembers()
+ { return ", incluindo todos os membros herdados."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Gerado automaticamente por Doxygen";
+ if (s) result+=(QCString)" para "+s;
+ result+=" a partir do cdigo fonte.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ QCString trEnumName()
+ { return "enumerao"; }
+
+ /*! put after an enum value in the list of all members */
+ QCString trEnumValue()
+ { return "valor enumerado"; }
+
+ /*! put after an undocumented member in the list of all members */
+ QCString trDefinedIn()
+ { return "definido em"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ QCString trModules()
+ { return "Mdulos"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ QCString trClassHierarchy()
+ { return "Hierarquia de classes"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estruturas de dados";
+ }
+ else
+ {
+ return "Lista de componentes";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ QCString trFileList()
+ { return "Lista de ficheiros"; }
+
+ /*! This is put above each page as a link to the list of all verbatim headers */
+ QCString trHeaderFiles()
+ { return "Ficheiros includos"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Campos de dados";
+ }
+ else
+ {
+ return "Componentes membro";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globais";
+ }
+ else
+ {
+ return "Ficheiros membro";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ QCString trRelatedPages()
+ { return "Pginas relacionadas"; }
+
+ /*! This is put above each page as a link to all examples. */
+ QCString trExamples()
+ { return "Exemplos"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ QCString trSearch()
+ { return "Localizar"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ QCString trClassHierarchyDescription()
+ { return "Esta lista de heranas est organizada, dentro do possvel, por ordem alfabtica:"; }
+
+ /*! This is an introduction to the list with all files. */
+ QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Lista de todos os ficheiros ";
+ if (!extractAll) result+="documentados ";
+ result+="com uma breve descrio:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Lista das estruturas de dados com uma breve descrio:";
+ }
+ else
+ {
+ return "Lista de classes, estruturas, unies e interfaces com uma breve descrio:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Lista de todas as";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=" estruturas e campos de unies";
+ }
+ else
+ {
+ result+=" classes membro";
+ }
+ if (!extractAll)
+ {
+ result+=" documentadas";
+ }
+ result+=" com referncia para ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="a respectiva documentao:";
+ }
+ else
+ {
+ result+="a documentao de cada membro:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="as estruturas/unies a que pertencem:";
+ }
+ else
+ {
+ result+="as classes a que pertencem:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Lista de ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="todas as funes, variveis, definies, enumeraes e definies de tipo ";
+ if (!extractAll) result+="documentadas ";
+ }
+ else
+ {
+ result+="todos os ficheiros membro ";
+ if (!extractAll) result+="documentados ";
+ }
+ result+="com referncia para ";
+ if (extractAll)
+ result+="o ficheiro a que pertecem:";
+ else
+ result+="a respectiva documentao:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all header files. */
+ QCString trHeaderFilesDescription()
+ { return "Lista de todos os ficheiros cabealho que constituem a API:"; }
+
+ /*! This is an introduction to the page with the list of all examples */
+ QCString trExamplesDescription()
+ { return "Lista de todos os exemplos:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ QCString trRelatedPagesDescription()
+ { return "Lista de documentao relacionada:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ QCString trModulesDescription()
+ { return "Lista de todos os mdulos:"; }
+
+ /*! This sentences is used in the annotated class/file lists if no brief
+ * description is given.
+ */
+ QCString trNoDescriptionAvailable()
+ { return "Nenhuma descrio disponvel"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ QCString trDocumentation()
+ { return "Documentao"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ QCString trModuleIndex()
+ { return "ndice dos mdulos"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ QCString trHierarchicalIndex()
+ { return "ndice da hierarquia"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "ndice das estruturas de dados";
+ }
+ else
+ {
+ return "ndice dos componentes";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ QCString trFileIndex()
+ { return "ndice dos ficheiros"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ QCString trModuleDocumentation()
+ { return "Documentao do mdulo"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ QCString trClassDocumentation()
+ { return "Documentao da classe"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ QCString trFileDocumentation()
+ { return "Documentao do ficheiro"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ QCString trExampleDocumentation()
+ { return "Documentao do exemplo"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ QCString trPageDocumentation()
+ { return "Documentao da pgina"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ QCString trReferenceManual()
+ { return "Manual de referncia"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ QCString trDefines()
+ { return "Macros"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ QCString trFuncProtos()
+ { return "Prottipos de funes"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ QCString trTypedefs()
+ { return "Definies de tipos"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ QCString trEnumerations()
+ { return "Enumeraes"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ QCString trFunctions()
+ { return "Funes"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ QCString trVariables()
+ { return "Variveis"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ QCString trEnumerationValues()
+ { return "Valores da enumerao"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ QCString trDefineDocumentation()
+ { return "Documentao das macros"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ QCString trFunctionPrototypeDocumentation()
+ { return "Documentao dos prottipos de funes"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ QCString trTypedefDocumentation()
+ { return "Documentao dos tipos"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ QCString trEnumerationTypeDocumentation()
+ { return "Documentao dos valores da enumerao"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ QCString trEnumerationValueDocumentation()
+ { return "Documentao dos elementos da enumerao"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ QCString trFunctionDocumentation()
+ { return "Documentao das funes"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ QCString trVariableDocumentation()
+ { return "Documentao das variveis"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estruturas de Dados";
+ }
+ else
+ {
+ return "Componentes";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Gerado em "+date;
+ if (projName) result+=(QCString)" para "+projName;
+ result+=(QCString)" por";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ QCString trWrittenBy()
+ {
+ return "escrito por";
+ }
+
+ /*! this text is put before a class diagram */
+ QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de heranas da classe "+clName;
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ QCString trForInternalUseOnly()
+ { return "Apenas para uso interno."; }
+
+ /*! this text is generated when the \\reimp command is used. */
+ QCString trReimplementedForInternalReasons()
+ { return "Redefinido por razes internas; A interface no foi afectada.";
+ }
+
+ /*! this text is generated when the \\warning command is used. */
+ QCString trWarning()
+ { return "Aviso"; }
+
+ /*! this text is generated when the \\bug command is used. */
+ QCString trBugsAndLimitations()
+ { return "Bugs e limitaes"; }
+
+ /*! this text is generated when the \\version command is used. */
+ QCString trVersion()
+ { return "Verso"; }
+
+ /*! this text is generated when the \\date command is used. */
+ QCString trDate()
+ { return "Data"; }
+
+ /*! this text is generated when the \\return command is used. */
+ QCString trReturns()
+ { return "Retorna"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ QCString trSeeAlso()
+ { return "Veja tambm"; }
+
+ /*! this text is generated when the \\param command is used. */
+ QCString trParameters()
+ { return "Parmetros"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ QCString trExceptions()
+ { return "Excepes"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ QCString trGeneratedBy()
+ { return "Gerado por"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Lista de namespaces"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Lista ";
+ if (!extractAll) result+="de toda a documentao ";
+ result+="dos namespaces com uma breve descrio:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Amigos"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Documentao das classes amigas e funes relacionadas"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referncia ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" classe "; break;
+ case ClassDef::Struct: result+=" estrutura "; break;
+ case ClassDef::Union: result+=" unio "; break;
+ case ClassDef::Interface: result+="ao interface "; break;
+ case ClassDef::Protocol: result+="protocol "; break; // translate me!
+ case ClassDef::Category: result+="category "; break; // translate me!
+ case ClassDef::Exception: result+=" excepo "; break;
+ }
+ if (isTemplate) result+="Template ";
+ result+=(QCString)clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result= "Referncia ao ficheiro ";
+ result += fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result= "Referncia ao namespace ";
+ result += namespaceName;
+ return result;
+ }
+
+ /* these are for the member sections of a class, struct or union */
+ virtual QCString trPublicMembers()
+ { return "Membros pblicos"; }
+ virtual QCString trPublicSlots()
+ { return "Slots pblicos"; }
+ virtual QCString trSignals()
+ { return "Sinais"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Membros pblicos estticos"; }
+ virtual QCString trProtectedMembers()
+ { return "Membros protegidos"; }
+ virtual QCString trProtectedSlots()
+ { return "Slots protegidos"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Membros protegidos estticos"; }
+ virtual QCString trPrivateMembers()
+ { return "Membros privados"; }
+ virtual QCString trPrivateSlots()
+ { return "Slots privados"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Membros privados estticos"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" e ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Derivada de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Herdado por "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplementado de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementado em "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Membros do namespace"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Lista ";
+ if (extractAll) result+="de todos os ";
+ else result+="de toda a documentao dos ";
+ result+="membros do namespace com referncia para ";
+ if (extractAll)
+ result+="a documentao de cada membro:";
+ else
+ result+="o namespace correspondente:";
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "ndice dos namespaces"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Documentao dos namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"A documentao para ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="esta classe"; break;
+ case ClassDef::Struct: result+="esta estrutura"; break;
+ case ClassDef::Union: result+="esta unio"; break;
+ case ClassDef::Interface: result+="este interface"; break;
+ case ClassDef::Protocol: result+="protocol"; break; // translate me!
+ case ClassDef::Category: result+="category"; break; // translate me!
+ case ClassDef::Exception: result+="esta excepo"; break;
+ }
+ result+=" foi gerada a partir ";
+ if (single) result+=" do seguinte ficheiro:";
+ else result+="dos seguintes ficheiros:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ {
+ return "Lista alfabtica";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Valores retornados"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Pgina principal"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "p. "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trSources()
+ {
+ return "Fontes";
+ }
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definido na linha @0 do ficheiro @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definido no ficheiro @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Desaprovado";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de colaborao para "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Diagrama de dependncias de incluso para "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Documentao dos Construtores & Destrutor";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Ir para o cdigo fonte deste ficheiro.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Ir para a documentao deste ficheiro.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Precondio";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Poscondio";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariante";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Valor inicial:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "cdigo";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Representao grfica da hiearquia da classe";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Ir para a representao grfica da hierarquia da classe";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Ir para a representao textual da hierarquia da classe";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "ndice da pgina";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Nota";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Tipos Pblicos";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Campos de Dados";
+ }
+ else
+ {
+ return "Atributos Pblicos";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Atributos Pblicos Estticos";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Tipos Protegidos";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Atributos Protegidos";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Atributos Protegidos Estticos";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Tipos Privados";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Atributos Privados";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Atributos Privados Estticos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "Tarefa";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Lista de tarefas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referenciado por";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Observaes";
+ }
+ virtual QCString trAttention()
+ {
+ return "Ateno";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Este grafo mostra quais so os ficheiros que incluem directamente ou indirectamente este ficheiro:";
+ }
+ virtual QCString trSince()
+ {
+ return "Desde";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Legenda do grafo";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Esta pgina explica como interpretar os grafos gerados pelo doxygen.<p>\n"
+ "Considere o seguinte exemplo:\n"
+ "\\code\n"
+ "/*! Esta classe vai estar escondida devido truncao */\n"
+ "class Invisible { };\n\n"
+ "/*! Esta classe tem a relao de herana escondida */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Classe no documentada por comentrios doxygen */\n"
+ "class Undocumented { };\n\n"
+ "/*! Classe derivada usando derivao pblica */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Classe derivada usando derivao protegida */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Classe derivada usando derivao privada */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Classe usada pela classe Inherited */\n"
+ "class Used { };\n\n"
+ "/*! Super classe que deriva de vrias classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Se no ficheiro de configurao estiver a tag \\c MAX_DOT_GRAPH_HEIGHT "
+ "com o valor de 200 ento o seguinte grafo ser gerado:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "As caixas no grafo anterior tm as seguintes interpretaes:\n"
+ "<ul>\n"
+ "<li>Uma caixa inteiramente preta representa a estrutura ou a classe para "
+ "a qual o grafo foi gerado.\n"
+ "<li>Uma caixa com borda preta representa uma estrutura ou classe documentada.\n"
+ "<li>Uma caixa com borda cinzenta representa uma estrutura ou classe no documentada.\n"
+ "<li>Uma caixa com borda vermelha representa uma estrutura ou classe documentada onde "
+ "nem todas as relaes de herana/encapsulamento so exibidas. Um grafo truncado "
+ "quando no cabe na sua rea predefinida.\n"
+ "</ul>\n"
+ "As setas tm a seguinte interpretao:\n"
+ "<ul>\n"
+ "<li>Uma seta azul escura representa uma relao de herana pblica entre duas classes.\n"
+ "<li>Uma seta verde escura representa uma relao de herana protegida.\n"
+ "<li>Uma seta vermelha escura representa uma relao de herana privada.\n"
+ "<li>Uma seta rocha em tracejado representa uma relao de encapsulamento ou uso por "
+ "parte de outra classe. A legenda da seta contm o nome da varivel ou variveis da "
+ "relao. A seta aponta da classe que estabelece a relao para a classe ou estrutura que "
+ " acessvel.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Teste";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Lista de teste";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Mtodos DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Propriedades";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Documentao das propriedades";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java interfaces in the summary section of Java packages */
+ virtual QCString trInterfaces()
+ {
+ return "Interfaces";
+ }
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Estruturas de dados";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Pacote "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Lista de pacotes";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Lista de pacotes com uma breve descrio (se disponvel):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pacotes";
+ }
+ /*! Used as a chapter title for Latex & RTF output */
+ virtual QCString trPackageDocumentation()
+ {
+ return "Documentao do pacote";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Valor:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Bug";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Lista de Bugs";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "ndice";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Classe" : "classe"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ficheiro" : "ficheiro"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grupo" : "grupo"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Pgina" : "pgina"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Membro" : "membro"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trField(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Campo" : "campo"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Globa" : "globa"));
+ result+= singular? "l" : "ais";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autor" : "autor"));
+ if (!singular) result+="es";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referncias";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementa "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementado em "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "ndice";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Lista de Deprecados";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Eventos";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Documentao dos eventos";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Tipos do Pacote";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funes do Pacote";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Funes Estticas do Pacote";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atributos do Pacote";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Atributos Estticos do Pacote";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Tudo";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Grafo de chamadas desta funo:";
+ }
+
+};
+
+#endif
diff --git a/src/translator_ro.h b/src/translator_ro.h
new file mode 100644
index 0000000..3fbbbf1
--- /dev/null
+++ b/src/translator_ro.h
@@ -0,0 +1,1797 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/* Original translation from English to Romanian by Alexandru Iosup [aiosup@yahoo.com].
+ * Updated by Ionuţ Dumitraşcu [reddumy@yahoo.com]
+ *
+ * -------------------------------------------
+ * Project start : 20.09.2000
+ * Last Doxygen version covered : 1.5.8
+ * Last revision : 15.01.2009
+ * -------------------------------------------
+ *
+ * Revision history
+ * ----------------
+ * 15.01.2009 - Updated Romanian translation to Doxygen 1.5.8 and modified strings to UTF-8, as well as some other changes (Ionuţ Dumitraşcu)
+ * 28.07.2008 - Updated version - covering Doxygen 1.5.6 - and some minor changes (Ionuţ Dumitraşcu)
+ *
+ * 01.Mar.2k5 Third revision, covering Doxygen 1.4.1
+ *
+ * 07.Mar.2k2 Second revision, covering Doxygen 1.2.14
+ * - fixed some bugs
+ *
+ * 20.Sep.2k First version, covering Doxygen 1.2.1
+ *
+ */
+#ifndef TRANSLATOR_RO_H
+#define TRANSLATOR_RO_H
+
+
+class TranslatorRomanian : public TranslatorAdapter_1_6_0
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "romanian"; }
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[romanian]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Funcţii înrudite"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Atenţie: acestea nu sunt funcţii membre.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Descriere Detaliată"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Documentaţia Definiţiilor de Tipuri (typedef) Membre"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Documentaţia Enumerărilor Membre"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Documentaţia Funcţiilor Membre"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentaţia Câmpurilor";
+ }
+ else
+ {
+ return "Documentaţia Datelor Membre";
+ }
+
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Mai mult..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Lista tuturor membrilor."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Lista Membrilor"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Lista completă a membrilor din "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", inclusiv a tuturor membrilor moşteniţi."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Generat automat de Doxygen";
+ if (s) result+=(QCString)" pentru "+s;
+ result+=" din codul sursă.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "nume enumerare"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "valoare enumerare"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "definit în"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Module"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Ierarhia Claselor"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Structuri de Date";
+ }
+ else
+ {
+ return "Lista Claselor";
+ }
+
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Lista fişierelor"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Câmpurile de Date";
+ }
+ else
+ {
+ return "Membrii Componenţi"; //cu articol hotarat
+ }
+
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globale";
+ }
+ else
+ {
+ return "Membrii din Fişier"; //cu articol hotarat
+ }
+
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Pagini înrudite"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Exemple"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Caută"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Această listă de moşteniri este sortată în general, "
+ "dar nu complet, în ordine alfabetică:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Lista tuturor ";
+ result+="fişierelor";
+ if (!extractAll) result+=" documentate";
+ result+=", cu scurte descrieri:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Lista structurilor de date, cu scurte descrieri:";
+ }
+ else
+ {
+ return "Lista claselor, structurilor, uniunilor şi interfeţelor"
+ ", cu scurte descrieri:";
+ }
+
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Lista tuturor ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="câmpurilor ";
+ if (!extractAll) result+=" documentate ";
+ result+="din structuri si uniuni ";
+ }
+ else
+ {
+ result+="membrilor ";
+ if (!extractAll) result+="documentaţi ";
+ result+="din toate clasele ";
+ }
+ result+=", cu legături către ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="documentaţia structurii/uniunii pentru fiecare câmp în parte:";
+ }
+ else
+ {
+ result+="documentaţia clasei pentru fiecare membru în parte:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="structurile/uniunile de care aparţin:";
+ }
+ else
+ {
+ result+="clasele de care aparţin:";
+ }
+ }
+
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Lista tuturor ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funcţiilor, variabilelor, definiţiilor, enumerărilor şi definiţiilor de tip";
+ if (!extractAll) result+=" documentate";
+ }
+ else
+ {
+ result+="membrilor ";
+ if (!extractAll) result+="documentaţi ";
+ result+="din toate fişierele";
+ }
+ result+=", cu legături către ";
+ if (extractAll)
+ result+="fişierele de care aparţin:";
+ else
+ result+="documentaţia aferentă:";
+
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Lista tuturor exemplelor:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Lista tuturor documentaţiilor înrudite:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Lista tuturor modulelor:"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Documentaţie"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Indexul Modulelor"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Index Ierarhic"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Indexul Structurilor de Date";
+ }
+ else
+ {
+ return "Indexul Claselor";
+ }
+
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Indexul Fişierelor"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Documentaţia Modulelor"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Documentaţia Structurilor de Date";
+ }
+ else
+ {
+ return "Documentaţia Claselor";
+ }
+
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Documentaţia Fişierelor"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Documentaţia Exemplelor"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Documentaţii înrudite"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Manual de utilizare"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Definiţii"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Prototipuri de funcţii"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Definiţii de tipuri"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumerări"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funcţii"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Variabile"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Valori de enumerări"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Documentaţia definiţiilor"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Documentaţia prototipurilor de funcţii"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Documentaţia definiţiilor de tipuri"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Documentaţia enumerărilor"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Documentaţia funcţiilor"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Documentaţia variabilelor"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Structuri de Date";
+ }
+ else
+ {
+ return "Membri";
+ }
+
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generat "+date;
+ if (projName) result+=(QCString)" pentru "+projName;
+ result+=(QCString)" de către";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "scris de";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de relaţii pentru "+clName;
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Doar pentru uz intern."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Atenţie"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versiunea"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Data"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Întoarce"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Vezi şi"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametri"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Excepţii"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Generat de"; }
+
+ // new since 0.49-990307
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Lista de Namespace-uri"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Lista tuturor ";
+ result+="namespace-urilor ";
+ if (!extractAll) result+="documentate ";
+ result+=", cu scurte descrieri:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Prieteni"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Documentaţia funcţiilor prietene sau înrudite"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referinţă la ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="clasa "; break;
+ case ClassDef::Struct: result+="structura "; break;
+ case ClassDef::Union: result+="uniunea "; break;
+ case ClassDef::Interface: result+="interfaţa "; break;
+ case ClassDef::Protocol: result+="protocolul "; break;
+ case ClassDef::Category: result+="categoria "; break;
+ case ClassDef::Exception: result+="excepţia "; break;
+ }
+ if (isTemplate) result+=" (Template) ";
+ result+=(QCString)clName;
+
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result="Referinţă la fişierul ";
+ result+=fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result="Referinţă la Namespace-ul ";
+ result+=namespaceName;
+ return result;
+ }
+
+ /* these are for the member sections of a class, struct or union */
+ virtual QCString trPublicMembers()
+ { return "Metode Publice"; }
+ virtual QCString trPublicSlots()
+ { return "Conectori (slots) Publici"; }
+ virtual QCString trSignals()
+ { return "Semnale"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Metode Statice Publice"; }
+ virtual QCString trProtectedMembers()
+ { return "Metode Protejate"; }
+ virtual QCString trProtectedSlots()
+ { return "Conectori (slots) Protejaţi"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Metode Statice Protejate"; }
+ virtual QCString trPrivateMembers()
+ { return "Metode Private"; }
+ virtual QCString trPrivateSlots()
+ { return "Conectori (slots) Privaţi"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Metode Statice Private"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" şi ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Moşteneşte "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Moştenit de "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Reimplementat din "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Reimplementat în "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Membrii Namespace-ului"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Lista tuturor membrilor ";
+ if (!extractAll) result+="documentaţi ";
+ result+="din toate namespace-urile, cu legături către ";
+
+ if (extractAll)
+ result+="documentaţia namespace-ului pentru fiecare membru în parte:";
+ else
+ result+="namespace-urile de care aparţin:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Indexul Namespace-ului"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Documentaţia Namespace-ului"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespace-uri"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Documentaţia pentru această ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="clasă"; break;
+ case ClassDef::Struct: result+="structură"; break;
+ case ClassDef::Union: result+="uniune"; break;
+ case ClassDef::Interface: result+="interfaţă"; break;
+ case ClassDef::Protocol: result+="protocol"; break;
+ case ClassDef::Category: result+="categorie"; break;
+ case ClassDef::Exception: result+="excepţie"; break;
+ }
+ result+=" a fost generată din fişier";
+ if (single) result+="ul:"; else result+="ele:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Listă Alfabetică"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Valori returnate"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Pagina principală"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "pg."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definiţia în linia @0 a fişierului @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definiţia în fişierul @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Învechită(Deprecated)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagrama de relaţii pentru "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Graful dependenţelor prin incluziune pentru "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Documentaţia pentru Constructori şi Destructori";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Vezi sursele.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Vezi documentaţia.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Precondiţie";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postcondiţie";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Valoarea iniţială:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "cod";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Ierarhia Claselor în mod grafic";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Vezi ierarhia claselor în mod grafic";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Vezi ierarhia claselor în mod text";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Indexul Paginilor";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Notă";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Tipuri Publice";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Câmpuri de Date";
+ }
+ else
+ {
+ return "Atribute Publice";
+ }
+
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Atribute Statice Publice";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Tipuri Protejate";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Atribute Protejate";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Atribute Statice Protejate";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Tipuri Private";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Atribute Private";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Atribute Statice Private";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "De făcut";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Lista lucrurilor de făcut";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Semnalat de";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Observaţii";
+ }
+ virtual QCString trAttention()
+ {
+ return "Atenţie";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Acest graf arată care fişiere includ, "
+ "direct sau indirect, acest fişier:";
+ }
+ virtual QCString trSince()
+ {
+ return "Din";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Legenda grafului";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Această pagină arată modul în care trebuie să interpretaţi "
+ "grafurile generate de doxygen.<p>\n"
+ "Consideraţi următorul exemplu:\n"
+ "\\code\n"
+ "/*! Clasă invizibilă, tăiată din cauza depăşirii spaţiului */\n"
+ "class Invisible { };\n\n"
+ "/*! Altă clasă tăiată, relaţia de moştenire este ascunsă */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Clasă necomentată în stil doxygen */\n"
+ "class Undocumented { };\n\n"
+ "/*! Clasă care este moştenită în mod public */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Clasă template */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Clasă care este moştenită în mod protejat */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Clasă care este moştenită în mod privat */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Clasă care este folosită de clasa Inherited */\n"
+ "class Used { };\n\n"
+ "/*! Superclasă care moşteneşte un număr de alte clase */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Dacă tagul \\c MAX_DOT_GRAPH_HEIGHT din fişierul de configurare "
+ "este setat la 200, acesta este graful rezultat:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Căsuţele din partea de sus au următoarea semnificaţie:\n"
+ "<ul>\n"
+ "<li>O căsuţă neagră reprezintă structura sau clasa pentru care "
+ "graful este generat.\n"
+ "<li>O căsuţă cu marginea neagră reprezintă o structură sau o clasă documentate.\n"
+ "<li>O căsuţă cu marginea gri reprezintă o structură sau o clasă nedocumentate.\n"
+ "<li>O căsuţă cu marginea roşie reprezintă o structură sau o clasă documentate, pentru\n"
+ "care nu toate relaţiile de moştenire/incluziune sunt arătate. Un graf este "
+ "tăiat dacă nu încape în marginile specificate."
+ "</ul>\n"
+ "Săgeţile au următoarea semnificaţie:\n"
+ "<ul>\n"
+ "<li>O săgeată de un albastru închis este folosită când avem o relaţie de "
+ "moştenire publică între două clase.\n"
+ "<li>O săgeată de un verde închis este folosită când avem o moştenire protejată.\n"
+ "<li>O săgeată de un roşu închis este folosită când avem o moştenire privată.\n"
+ "<li>O săgeată violetă punctată este folosită pentru o clasă conţinută sau folosită "
+ "de o altă clasă. Săgeata este marcată cu variabila(e) "
+ "prin care este accesibilă clasa sau structura spre care este îndreptată. \n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Listă de teste";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Metode DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Proprietăţi";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Documentaţia Proprietăţilor";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Structuri de Date";
+ }
+ else
+ {
+ return "Clase";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Pachet "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Lista Pachetelor";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Lista pachetelor, însoţită de scurte explicaţii, acolo unde acestea există:";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pachete";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Valoare:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Problema (Bug)";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Lista de Probleme (Bugs)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1250"; //EASTEUROPE_CHARSET
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "238";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Index";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Clas" : "clas"));
+ result+= singular ? "a":"ele";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Fişier" : "fişier"));
+ result+= singular ? "ul":"ele";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ result+= singular ? "-ul":"-urile";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grupu" : "grupu"));
+ result+= singular ? "l":"rile";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Pagin" : "pagin"));
+ result+= singular ? "a":"ile";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Membr" : "membr"));
+ result+= singular ? "ul":"ii";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="e";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autor" : "autor"));
+ result+= singular ? "ul":"ii";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referinţe";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementează "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementat în "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Cuprins";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Lista elementelor învechite (deprecated)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Evenimente";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Documentaţia aferentă evenimentelor";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Tipuri în pachet";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funcţii în pachet";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Funcţii statice în pachet";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atribute în pachet";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Atribute statice în pachet";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Toate";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Graful de apel al acestei funcţii:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Caută";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Rezultatele căutarii";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Din păcate nu am găsit nici un document care să corespundă cererii.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Am găsit <b>1</b> document corespunzând cererii.";
+ }
+ else
+ {
+ return "Am găsit <b>$num</b> documente corespunzând cererii. "
+ "Lista documentelor găsite, sortate după relevanţă.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Găsite:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return " Fişierul sursă " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Ierarhia directoarelor"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Documentaţia directoarelor"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Directoare"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Această ierarhie de directoare este sortată în general, "
+ "dar nu complet, în ordine alfabetică:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ {
+ QCString result="Director-referinţă "; result+=dirName;
+ return result;
+ }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Directo" : "directo"));
+ if (singular) result+="r"; else result="are";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Aceasta este o funcţie membră suprascrisă. "
+ "Diferă de funcţia de mai sus "
+ "doar prin argumentele acceptate.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Graful de apeluri pentru această funcţie:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Documentaţia Enumeratorilor"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Documentaţia Funcţiei Membre/Subrutinei"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Lista Tipurilor de Date"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Câmpuri de date"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Tipurile de date, cu scurte descrieri:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Lista tuturor tipurilor de date ";
+ if (!extractAll)
+ {
+ result+="documentate ";
+ }
+ result+=" cu legături către ";
+ if (!extractAll)
+ {
+ result+="documentaţia structurii de date pentru fiecare membru";
+ }
+ else
+ {
+ result+="tipurile de date de care aparţin:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Indexul Tipurilor de Date"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Documentaţia Tipurilor de Date"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funcţii/Subrutine"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Documentaţia Funcţiilor/Subrutinelor"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Tipuri de Date"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Lista Modulelor"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Lista tuturor modulelor ";
+ if (!extractAll) result+="documentate ";
+ result+="cu scurte descrieri:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result="Referinţă la ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="Modulul "; break;
+ case ClassDef::Struct: result+="Tipul "; break;
+ case ClassDef::Union: result+="Uniunea "; break;
+ case ClassDef::Interface: result+="Interfaţa "; break;
+ case ClassDef::Protocol: result+="Protocolul "; break;
+ case ClassDef::Category: result+="Categoria "; break;
+ case ClassDef::Exception: result+="Excepţia "; break;
+ }
+ if (isTemplate) result+="(Template) ";
+ result+=(QCString)clName;
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result="Referinţă la Modulul ";
+ result += namespaceName;
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Membrii Modulului"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Lista tuturor membrilor ";
+ if (!extractAll) result+="documentaţi ai ";
+ result+="modulului cu legături către ";
+ if (extractAll)
+ {
+ result+="documentaţia modulului pentru fiecare membru:";
+ }
+ else
+ {
+ result+="modulele de care aparţin:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Indexul Modulelor"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modul" : "modul"));
+ if (singular) result+="ul";
+ else result += "ele";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Documentaţia ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="modulului"; break;
+ case ClassDef::Struct: result+="tipului"; break;
+ case ClassDef::Union: result+="uniunii"; break;
+ case ClassDef::Interface: result+="interfeţei"; break;
+ case ClassDef::Protocol: result+="protocolului"; break;
+ case ClassDef::Category: result+="categoriei"; break;
+ case ClassDef::Exception: result+="excepţiei"; break;
+ }
+ result+=" a fost generată din următo";
+ if (single) result+="rul fişier:"; else result+="arele fişiere:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tip" : "tip"));
+ if (singular) result+="ul";
+ else result += "urile";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprogram" : "subprogram"));
+ if (singular) result+="ul";
+ else result += "urile";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Constrângerile de Tip";
+ }
+
+};
+
+#endif
diff --git a/src/translator_ru.h b/src/translator_ru.h
new file mode 100644
index 0000000..31e1f0f
--- /dev/null
+++ b/src/translator_ru.h
@@ -0,0 +1,1846 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ */
+
+/*
+ *
+ * Nickolay Semyonov
+ * Andrey V. Stolyarov released Feb 14, 2001
+ * Alexandr V. Chelpanov <cav@cryptopro.ru> released Sep 25, 2004
+ * Благодарности: Vitaly A. Repin <vitaly@radio.hop.stu.neva.ru>,
+ * Михаил Глушенков <bbman@mail.ru>
+ */
+
+#ifndef TRANSLATOR_RU_H
+#define TRANSLATOR_RU_H
+
+class TranslatorRussian : public Translator
+{
+ public:
+ /*! Used for identification of the language. */
+ virtual QCString idLanguage()
+ { return "russian"; }
+
+ /* Used to get the command(s) for the language support. */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[T2A]{fontenc}\n\\usepackage[russian]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Относящиеся к классу функции"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(не члены класса)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Подробное описание"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Определения типов"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Перечисления"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Методы"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Поля";
+ }
+ else
+ {
+ return "Данные класса";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Подробнее..."; }
+
+ /*! put in the class documentation */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trListOfAllMembers()
+ {
+ return "Полный список членов класса";
+ }
+
+ /*! used as the title of the "list of all members" page of a class */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trMemberList()
+ {
+ return "Cписок членов класса";
+ }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Полный список членов класса "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", включая наследуемые из базового класса"; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Автоматически создано Doxygen";
+ if (s) result+=QCString(" для ")+s;
+ result+=" из исходного текста.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "перечисление"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "элементы перечисления"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "определено в"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Группы"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Иерархия классов"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структуры данных";
+ }
+ else
+ {
+ return "Классы";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Файлы"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Поля структур";
+ }
+ else
+ {
+ return "Члены классов";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ /*??*/
+ virtual QCString trFileMembers()
+ {
+ return "Список членов всех файлов";
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ /* ?? Вариант перевода "См. также: " более удачный, но не в заголовке,
+ как в данном случае. */
+ { return "Описания"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Примеры"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Поиск"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Иерархия классов."; }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Полный список ";
+ if (!extractAll) result+="документированных ";
+ result+="файлов.";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структуры данных с их кратким описанием.";
+ }
+ else
+ {
+ return "Классы с их кратким описанием.";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Список всех ";
+ if(!extractAll) result+="документированных ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result+="членов структур данных со ссылками на ";
+ else
+ result+="членов классов со ссылками на ";
+ if(!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result+="документацию по структуре для каждого члена.";
+ else
+ result+="документацию по классу для каждого члена.";
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result += "структуры";
+ else
+ result += "классы";
+ result+=", к которым они принадлежат.";
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Список всех ";
+ if (!extractAll) result+="документированных ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="функций, переменных, макроопределений, "
+ "перечислений и определений типов";
+ }
+ else
+ {
+ result+="членов файлов ";
+ }
+ result+=" со ссылками на ";
+ if (extractAll)
+ result+="файлы, к которым они принадлежат.";
+ else
+ result+="документацию.";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Полный список примеров."; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Полный список дополнительных описаний."; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Полный список групп."; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Документация"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Алфавитный указатель групп"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Иерархический список классов"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Алфавитный указатель структур данных";
+ }
+ else
+ {
+ return "Алфавитный указатель классов";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Список файлов"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Группы"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структуры данных";
+ }
+ else
+ {
+ return "Классы";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Файлы"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Примеры"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Тематические описания"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Оглавление"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Макросы"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Прототипы функций"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Определения типов"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Перечисления"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Функции"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Переменные"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Элементы перечислений"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Макросы"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Прототипы функций"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Типы"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Перечисления"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Функции"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Переменные"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структуры данных";
+ }
+ else
+ {
+ return "Классы";
+ }
+
+ }
+
+ /*! This is used in the documentation of a group before the list of
+ * links to documented files
+ */
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result="Документация ";
+ if (projName) result+=QCString("по ")+projName;
+ result+=QCString(". Последние изменения: ")+date;
+ result+=". Создано системой";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "Автор:";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return QCString("Граф наследования:")+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Только для внутреннего использования"; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Предупреждения"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Версия"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Дата"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Возвращает"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "См. также"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Аргументы"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Исключения"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Создано системой"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Пространства имен"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Полный список ";
+ if (!extractAll) result+="документированных ";
+ result+="пространств имен.";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Друзья"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Документация по друзьям класса и функциям, отноносящимся"
+ " к классу"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result;
+ if (isTemplate)
+ {
+ result="Шаблон ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="класса"; break;
+ case ClassDef::Struct: result+="структуры"; break;
+ case ClassDef::Union: result+="объединения"; break;
+ case ClassDef::Interface: result+="интерфейса"; break;
+ case ClassDef::Protocol: result+="протокола"; break;
+ case ClassDef::Category: result+="категории"; break;
+ case ClassDef::Exception: result+="исключения"; break;
+ }
+ }
+ else
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+="Класс"; break;
+ case ClassDef::Struct: result+="Структура"; break;
+ case ClassDef::Union: result+="Объединение"; break;
+ case ClassDef::Interface: result+="Интерфейс"; break;
+ case ClassDef::Protocol: result+="Протокол"; break;
+ case ClassDef::Category: result+="Категория"; break;
+ case ClassDef::Exception: result+="Исключение"; break;
+ }
+ }
+ result+=" ";
+ return result+clName;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ return QCString("Файл ")+fileName;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ return QCString("Пространство имен ")+namespaceName;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Открытые члены"; }
+ virtual QCString trPublicSlots()
+ { return "Открытые слоты"; }
+ virtual QCString trSignals()
+ { return "Сигналы"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Открытые статические члены"; }
+ virtual QCString trProtectedMembers()
+ { return "Защищенные члены"; }
+ virtual QCString trProtectedSlots()
+ { return "Защищенные слоты"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Защищенные статические члены"; }
+ virtual QCString trPrivateMembers()
+ { return "Закрытые члены"; }
+ virtual QCString trPrivateSlots()
+ { return "Закрытые слоты"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Закрытые статические члены"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" и ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Базовые классы:"+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Производные классы:"+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ QCString result="Переопределяет метод";
+ if(numEntries>1)
+ result+="ы предков";
+ else
+ result+=" предка";
+ return result+" "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Переопределяется в "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Члены пространств имен"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Полный список ";
+ if (!extractAll) result+="документированных ";
+ result+="членов простанств имен.";
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Алфавитный указатель пространств имен"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Пространства имен"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Пространства имен"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=QCString("Объявления и описания членов ");
+ switch(compType)
+ {
+ case ClassDef::Class: result+="класс";
+ if (single) result+="а"; else result+="ов";
+ break;
+ case ClassDef::Struct: result+="структур";
+ if (single) result+="ы";
+ break;
+ case ClassDef::Union: result+="объединени";
+ if (single) result+="я"; else result+="й";
+ break;
+ case ClassDef::Interface: result+="интерфейс";
+ if (single) result+="а"; else result+="ов";
+ break;
+ case ClassDef::Protocol: result+="протокол";
+ if (single) result+="а"; else result+="ов";
+ break;
+ case ClassDef::Category: result+="категори";
+ if (single) result+="и"; else result+="й";
+ break;
+ case ClassDef::Exception: result+="исключени";
+ if (single) result+="я"; else result+="й";
+ break;
+ }
+ result+=" находятся в файл";
+ if (single) result+="е:"; else result+="ах:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Алфавитный указатель"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Возвращаемые значения"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Титульная страница"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "стр."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "См. определение в файле @1 строка @0";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "См. определение в файле @0";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Уст.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Граф связей класса "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Граф включаемых заголовочных файлов для "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Конструктор(ы)";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "См. исходные тексты.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "См. документацию.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Предусловие";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Постусловие";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Инвариант";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Инициализатор";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "Исходные тексты";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Иерархия классов. Графический вид.";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "см. графический вид.";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "см. текстовый вид.";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Алфавитный указатель тематических описаний";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Заметки";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Открытые типы";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Поля данных";
+ }
+ else
+ {
+ return "Открытые атрибуты";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Статические открытые данные";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Защищенные типы";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Защищенные данные";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Статические защищенные данные";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Закрытые типы";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Закрытые данные";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Закрытые статические данные";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ /*??*/
+ {
+ return "Необходимо сделать";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ /*??*/
+ {
+ return "Список задач";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Используется в";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Прим.";
+ }
+ virtual QCString trAttention()
+ {
+ return "Внимание";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Граф файлов, в которые включается этот файл:";
+ }
+ virtual QCString trSince()
+ /*??*/
+ {
+ return "Начиная с";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Легенда";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Обозначения, используемые в графах.<p>\n"
+ "Рассмотрим следующий пример:\n"
+ "\\code\n"
+ "/*! Невидимый класс из-за усечения */\n"
+ "class Invisible { };\n\n"
+ "/*! Усеченный класс, отношение наследования скрыто */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Недокументированный класс */\n"
+ "class Undocumented { };\n\n"
+ "/*! Открытое наследование */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Шаблон класса */\n"
+ "template<class T> class Templ {};\n\n"
+ "/*! Защищенное наследование */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Закрытое наследование */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Класс, используемый классом Inherited */\n"
+ "class Used { };\n\n"
+ "/*! Класс, порожденный от других классов */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Если \\c MAX_DOT_GRAPH_HEIGHT в конфигурационном файле "
+ "установлен в 240, получится следующий граф:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Прямоугольники в этом графе имеют следующее значение:\n"
+ "<ul>\n"
+ "<li>Заполненный черный прямоугольник представляет структуру или класс, "
+ "для которого создан граф.\n"
+ "<li>Прямоугольник с черной границей обозначает документированную структуру или класс.\n"
+ "<li>Прямоугольник с серой границей обозначает недокументированную структуру или класс.\n"
+ "<li>Прямоугольник с красной границей обозначает документированную структуру или класс, для которого\n"
+ " не все отношения наследования/содержания показаны. Граф усечен, "
+ "если он не поместился в указанных границах.\n"
+ "</ul>\n"
+ "Стрелки имеют следующее значение:\n"
+ "<ul>\n"
+ "<li>Темно-синяя стрелка используется для изображения отношения открытого наследования "
+ "между двумя классами.\n"
+ "<li>Темно-зеленая стрелка используется при защищенном наследовании.\n"
+ "<li>Темно-красная стрелка используется при закрытом наследовании.\n"
+ "<li>Фиолетовая стрелка используется, если класс содержится в"
+ "другом класе или используется другим классом."
+ "Со стрелкой указывается переменная, "
+ "через которую доступен указываемый класс или структура. \n"
+ "<li>Желтая стрелка используется для связи подстановки шаблона и "
+ "шаблона, на основе которого эта подстановка выполнена. С шаблоном"
+ "указывается параметр подстановки.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "см. легенду";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Тест";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Список тестов";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Методы";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Свойства";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Полный список свойств";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структуры данных";
+ }
+ else
+ {
+ return "Классы";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return QCString("Пакет ")+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Полный список пакетов ";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Полный список документированных пакетов.";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Пакеты";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Макроопределение:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Ошибка";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Ошибки";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "1251";
+ }
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "204";
+ }
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Алфавитный указатель";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ QCString result((first_capital ? "Структуры данных" : "структуры данных"));
+ return result;
+ }
+ else
+ {
+ QCString result((first_capital ? "Класс" : "класс"));
+ if(!singular) result+="ы";
+ return result;
+ }
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Файл" : "файл"));
+ if (!singular) result+="ы";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Пространств" : "пространств"));
+ result+=(singular?"о имен":"а имен");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Групп" : "групп"));
+ result+=(singular ? "а" : "ы");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Страниц" : "страниц"));
+ result+=(singular ? "а" : "ы");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Член" : "член"));
+ if (!singular) result+="ы";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Глобальны" : "глобальны"));
+ result+=(singular ? "й" : "е");
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Автор" : "автор"));
+ if (!singular) result+="ы";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Перекрестные ссылки";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Замещает "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implementation this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Замещается в "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Оглавление";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Список устаревших определений и описаний";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "События";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Cобытия";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Типы с областью видимости пакета";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Функции с областью видимости пакета";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Статические функции с областью видимости пакета";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Переменные с областью видимости пакета";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Статические переменные с областью видимости пакета";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Указатель";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Граф вызовов:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Поиск";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Результаты поиска";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "К сожалению, по Вашему запросу ничего не найдено.";
+ }
+ else if( numDocuments == 1 )
+ {
+ return "Найден 1 документ.";
+ }
+ else
+ {
+ return "Найден(о) <b>$num</b> документ(ов). "
+ "Документы отсортированы по релевантности.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Найдено:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Исходный файл " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Дерево директорий"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Директории"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Алфавитный указатель директорий"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Дерево директорий"; }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=QCString("Содержание директории ")+ dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Директори" : "директори"));
+ if (singular) result+="я"; else result+="и";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Эта функция перегружена и предоставляется исключительно "
+ "для удобства использования. Она отличается от вышеупомянутой "
+ "только фактическими аргументами.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Граф вызова функции:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Элементы перечислений"; }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+ // Простите переводчика, уже лет 20 не писал на фортране...
+ // Любые замечания приму с благодарностью.
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Функции/подпрограммы"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Типы данных"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Поля данных"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Аннотированный список типов данных:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Список всех ";
+ if (!extractAll)
+ {
+ result+="документированных ";
+ }
+ result+="членов типа со ссылками ";
+ if (!extractAll)
+ {
+ result+="на документацию для каждого члена:";
+ }
+ else
+ {
+ result+="на содержащую структуру:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Типы данных"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Оглавление типов данных"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Функции/подпрограммы"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Функции/подпрограммы"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Типы данных"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Указатель модулей"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Аннотированный список";
+ if (!extractAll) result+="документированных ";
+ result+="модулей:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ if (isTemplate)
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Модуль"; break;
+ case ClassDef::Struct: result+=" Тип"; break;
+ case ClassDef::Union: result+=" Объединение"; break;
+ case ClassDef::Interface: result+=" Интерфейс"; break;
+ case ClassDef::Protocol: result+=" Протокол"; break;
+ case ClassDef::Category: result+=" Категория"; break;
+ case ClassDef::Exception: result+=" Исключение"; break;
+ }
+ }
+ else
+ {
+ if (isTemplate) result+=" Шаблон ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="модуля"; break;
+ case ClassDef::Struct: result+="типа"; break;
+ case ClassDef::Union: result+="объединения"; break;
+ case ClassDef::Interface: result+="интерфейса"; break;
+ case ClassDef::Protocol: result+="протокола"; break;
+ case ClassDef::Category: result+="категории"; break;
+ case ClassDef::Exception: result+="исключения"; break;
+ }
+ }
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ return QCString("Модуль ") + namespaceName;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Члены модуля"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Список всех ";
+ if (!extractAll) result+="документированных ";
+ result+="модулей со ссылками ";
+ if (extractAll)
+ {
+ result+="на документацию для каждого члена:";
+ }
+ else
+ {
+ result+="на модули, их содержащие:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Указатель модулей"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Модул" : "модул"));
+ if (singular) result+="ь"; else result+="и";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Документация по ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="модулю"; break;
+ case ClassDef::Struct: result+="типу"; break;
+ case ClassDef::Union: result+="объединению"; break;
+ case ClassDef::Interface: result+="интерфейсу"; break;
+ case ClassDef::Protocol: result+="протоколу"; break;
+ case ClassDef::Category: result+="кетегории"; break;
+ case ClassDef::Exception: result+="исключению"; break;
+ }
+ result+=" сгенерирована на основе следующ";
+ if (single) result+="его файла:"; else result+="их файлов:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Тип" : "тип"));
+ if (!singular) result+="ы";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Подпрограмм" : "подпрограмм"));
+ if (singular) result+="а"; else result+="ы";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Согласование типов";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" Связь";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Загрузка...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Глобальное пространство имён";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Поиск...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Не найдено";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Диаграмма каталогов для "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Файл в "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Включает файл в "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Пн","Вт","Ср","Чт","Пт","Сб","Вс" };
+ static const char *months[] = { "Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек" };
+ QCString sdate;
+ sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+};
+
+#endif
diff --git a/src/translator_sc.h b/src/translator_sc.h
new file mode 100644
index 0000000..ffc2f31
--- /dev/null
+++ b/src/translator_sc.h
@@ -0,0 +1,1805 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_SC_H
+#define TRANSLATOR_SC_H
+
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "serbiancyr"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Повезане функције"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Напомињемо да ово нису функције чланице.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Опширније"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Документација дефиниције типа"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Документација члана набрајања"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Документација функције чланице"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Документација поља";
+ }
+ else
+ {
+ return "Документација атрибута";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Још..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Списак свих чланова."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Списак чланова"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Ово је списак свих чланова од "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", укључујући све наслеђене чланове."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Аутоматски направљено помоћу Doxygen-а";
+ if (s) result+=(QCString)" за "+s;
+ result+=" из изворног кода.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "назив набрајања"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "вредност набрајања"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "дефинисано у"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Модули"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Хијерархија класа"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структуре";
+ }
+ else
+ {
+ return "Списак класа";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Списак датотека"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Поља";
+ }
+ else
+ {
+ return "Чланови класе";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Глобално";
+ }
+ else
+ {
+ return "Чланови датотеке";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Повезане странице"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Примери"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Тражи"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Овај списак наслеђивања је уређен "
+ "скоро по абецеди:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Овде је списак свих ";
+ if (!extractAll) result+="документованих ";
+ result+="датотека са кратким описима:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Овде су структуре са кратким описима:";
+ }
+ else
+ {
+ return "Овде су класе, структуре, "
+ "уније и интерфејси са кратким описима:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Овде је списак свих ";
+ if (!extractAll)
+ {
+ result+="документованих ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="поља структура и унија";
+ }
+ else
+ {
+ result+="чланова класа";
+ }
+ result+=" са везама ка ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="документацији структуре/уније за свако поље:";
+ }
+ else
+ {
+ result+="документацији класе за сваки члан:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="структури/унији којој припадају:";
+ }
+ else
+ {
+ result+="класи којој припадају:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Овде је списак свих ";
+ if (!extractAll) result+="документованих ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="фрункција, променљивих, макро замена, набрајања, и дефиниција типова";
+ }
+ else
+ {
+ result+="чланова датотеке";
+ }
+ result+=" са везама ка ";
+ if (extractAll)
+ result+="датотекама којима припадају:";
+ else
+ result+="документацији:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Овде је списак свих примера:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Овде је списак свих повезаних страница документације:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Овде је списак свих модула:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Документација"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Индекс модула"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Хијерархијски индекс"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Индекс структура";
+ }
+ else
+ {
+ return "Индекс класа";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Индекс датотека"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Документација модула"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Документација структуре";
+ }
+ else
+ {
+ return "Документација класе";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Документација датотеке"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Документација примера"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Документација странице"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Приручник"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Дефиниције"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Декларације функција"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Дефиниције типова"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Набрајања"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Функције"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Променљиве"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Вредности набрајања"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Документација дефиниције"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Документација декларације функције"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Документација дефиниције типа"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Документација набрајања"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Документација функције"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Документација променљиве"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структуре";
+ }
+ else
+ {
+ return "Класе";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Направљено "+date;
+ if (projName) result+=(QCString)" за "+projName;
+ result+=(QCString)" помоћу";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "написао";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Дијаграм наслеђивања за "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Само за унутрашњу употребу."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Упозорење"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Верзија"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Датум"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Враћа"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Види"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Параметри"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Изизеци"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Направљено помоћу"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Списак простора имена"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Овде је списак свих ";
+ if (!extractAll) result+="документованих ";
+ result+="простора имена са кратким описима:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Пријатељи"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Документација за пријатеље и повезане функције"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ if (isTemplate) {
+ result+=" Шаблон";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="ска класа"; break;
+ case ClassDef::Struct: result+="ска структура"; break;
+ case ClassDef::Union: result+="ска унија"; break;
+ case ClassDef::Interface: result+="ски интерфејс"; break;
+ case ClassDef::Protocol: result+="ски протокол"; break;
+ case ClassDef::Category: result+="ска категорија"; break;
+ case ClassDef::Exception: result+="ски изузетак"; break;
+ }
+ } else {
+ result+=" Референца";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" класе"; break;
+ case ClassDef::Struct: result+=" структуре"; break;
+ case ClassDef::Union: result+=" уније"; break;
+ case ClassDef::Interface: result+=" интерфејса"; break;
+ case ClassDef::Protocol: result+=" протокола"; break;
+ case ClassDef::Category: result+=" категорије"; break;
+ case ClassDef::Exception: result+=" изузетка"; break;
+ }
+ }
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" Референца датотеке";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Референца простора имена";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Јавне функције чланице"; }
+ virtual QCString trPublicSlots()
+ { return "Јавни слотови"; }
+ virtual QCString trSignals()
+ { return "Сигнали"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Статичке јавне функције чланице"; }
+ virtual QCString trProtectedMembers()
+ { return "Заштићене функције чланице"; }
+ virtual QCString trProtectedSlots()
+ { return "Заштићени слотови"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Статичке заштићене функције чланице"; }
+ virtual QCString trPrivateMembers()
+ { return "Приватне функције чланице"; }
+ virtual QCString trPrivateSlots()
+ { return "Приватни слотови"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Статичке приватне функције чланице"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" и ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Наслеђује "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Наслеђују "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Поново имплементирано од "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Поново имплементирано у "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Чланови простора имена"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Овде је списак свих ";
+ if (!extractAll) result+="документованих ";
+ result+="чланова простора имена са везама ка ";
+ if (extractAll)
+ result+="документацији простора имена за сваки члан:";
+ else
+ result+="просторима имена којима припадају:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Индекс простора имена"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Документација простора имена"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Простори имена"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Документација за ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="ову класу"; break;
+ case ClassDef::Struct: result+="ову структуру"; break;
+ case ClassDef::Union: result+="ову унију"; break;
+ case ClassDef::Interface: result+="овај интерфејс"; break;
+ case ClassDef::Protocol: result+="овај протокол"; break;
+ case ClassDef::Category: result+="ову категорију"; break;
+ case ClassDef::Exception: result+="овај изузетак"; break;
+ }
+ result+=" је произведена из";
+ if (single) result+="следеће датотеке:"; else result+="следећих датотека:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Абецедни списак"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Враћене вредности"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Главна страница"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "стр."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Дефиниција у линији @0 датотеке @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Дефиниција у датотеци @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Застарело";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Дијаграм сарадње за "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Дијаграм зависности укључивања за "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Документација конструктора и деструктора";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Иди на изворни код овог фајла.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Иди на документацију овог фајла.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Услов пре";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Услов после";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Инваријанта";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Почетна вредност:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "код";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Графичка хијерархија класа";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Иди на графичку хијерархију класа";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Иди на текстуалну хијерархију класа";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Индекс страна";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Напомена";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Јавни типови";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Поља";
+ }
+ else
+ {
+ return "Јавни атрибути";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Статички јавни атрибути";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Заштићени типови";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Заштићени атрибути";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Статички заштићени атрибути";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Приватни типови";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Приватни атрибути";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Статички приватни атрибути";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Урадити";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Подсетник шта још урадити";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Референцирано од";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Напомене";
+ }
+ virtual QCString trAttention()
+ {
+ return "Пажња";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Овај граф показује које датотеке директно или "
+ "или индиректно укључују овај фајл:";
+ }
+ virtual QCString trSince()
+ {
+ return "Од";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Легенда графова";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Ова страница објашњава како тумачити графове који су направљени "
+ "doxygen-ом.<p>\n"
+ "Размотримо следећи пример:\n"
+ "\\code\n"
+ "/*! Невидљива класа због одсецања */\n"
+ "class Invisible { };\n\n"
+ "/*! Одсечена класа, веза наслеђивања је скривена */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Класа која није документована doxygen коментарима */\n"
+ "class Undocumented { };\n\n"
+ "/*! Класа која је наслеђена јавним наслеђивањем */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Шаблонска класа */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Класа која је наслеђена заштићеним наслеђивањем */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Класа која је наслеђена јавним наслеђивањем */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Класа коју користи наслеђена класа */\n"
+ "class Used { };\n\n"
+ "/*! Надкласа која наслеђује неки број других класа */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Ако је \\c MAX_DOT_GRAPH_HEIGHT таг у конфигурационој датотеци "
+ "подешен на 240, то ће резултовати на следећи начин:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Правоугаоници имају следеће значење:\n"
+ "<ul>\n"
+ "<li>%Пуни сиви правоугаоник представља структуру или класу за коју је "
+ "граф направљен.\n"
+ "<li>%Правоугаоник са црним оквиром означава документовану структуру или класу.\n"
+ "<li>%Правоугаоник са сивим оквиром означава недокументовану структуру или класу.\n"
+ "<li>%Правоугаоник са црвеним оквиром означава документовану структуру или класу за"
+ "за коју нису све релације наслеђивања/садржавања приказане. %Граф је "
+ "одсечен ако излази из специфицираних оквира.\n"
+ "</ul>\n"
+ "Стрелице имају следећа значења:\n"
+ "<ul>\n"
+ "<li>%Тамноплава стрелица се користи да прикаже релацију јавног извођења "
+ "између двеју класа.\n"
+ "<li>%Тамнозелена стрелица се користи за заштићено наслеђивање.\n"
+ "<li>%Тамноцрвена стрелица се користи за приватно наслеђивање.\n"
+ "<li>%Љубичаста испрекидана стрелица се користи ако класа садржи или користи "
+ "друга класа. Стрелица је означена променљивом/променљивама "
+ "кроз које је показивана класа или структура доступна.\n"
+ "<li>%Жута испрекидана стрелица означава везу између примерка шаблона и "
+ "и шаблонске класе из које је инстанцирана. Стрелица је означена "
+ "параметрима примерка шаблона.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "легенда";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Тест";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Списак тестова";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP функције чланице";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Своства";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Документација свосјтва";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Структуре";
+ }
+ else
+ {
+ return "Класе";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Пакет "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Списак пакета";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Овде су пакети са кратким описима (ако су доступни):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Пакети";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Вредност:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Грешка";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Списак грешака";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Индекс";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Клас" : "клас"));
+ if (!singular) result+="e"; else result+="a";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Датотек" : "датотек"));
+ if (!singular) result+="e"; else result+="a";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Простор" : "простор"));
+ if (!singular) result+="и имена"; else result+=" имена";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Груп" : "груп"));
+ if (!singular) result+="е"; else result+="a";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Страниц" : "страниц"));
+ if (!singular) result+="е"; else result += "a";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Члан" : "члан"));
+ if (!singular) result+="ови";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Глобалн" : "глобалн"));
+ if (!singular) result+="а"; else result+="о";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Аутор" : "аутор"));
+ if (!singular) result+="и";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Референце";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Имплементира "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Имплементирано у "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Садржај";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Списак застарелог";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Догађаји";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Документација догажаја";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Типови пакета";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Функције пакета";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Статичке функције пакета";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Атрибути пакета";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Статички атрибути пакета";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Све";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Овде је граф позивања за ову функцију:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Тражим";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Резултати претраге";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Жао ми је, али нема докумената који одговарају упиту.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Пронађен <b>1</b> документ који одговара упиту.";
+ }
+ else if (numDocuments==2)
+ {
+ return "Пронађена <b>а</b> документа која одговарају упиту.";
+ }
+ else if (numDocuments==3)
+ {
+ return "Пронађена <b>3</b> документа која одговарају упиту.";
+ }
+ else if (numDocuments==4)
+ {
+ return "Пронађена <b>4</b> документа која одговарају упиту.";
+ }
+ else
+ {
+ return "Пронађено <b>$num</b> докумената који одговарају упиту. "
+ "Приказују се прво најбољи поготци.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Поготци:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " Изворна датотека";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Хијерархија директоријума"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Документација директоријума"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Директоријуми"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Ова хијерархија директоријума је уређена "
+ "приближно по абецеди:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Референца директоријума"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Директоријум" : "директоријум"));
+ if (singular) result+=""; else result+="и";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Ово је преоптерећена функција чланица. "
+ "Разликује се од наведене само по врсти аргумената кое прихвата";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Ово је граф функција које позивају ову функцију:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Документација вредности набрајања"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Документацијаr функције чланице, односно потпрограма члана"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Списак типова података"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Поља"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Овде су типови података са кратким описима:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Овде је списак свих ";
+ if (!extractAll)
+ {
+ result+="документованих ";
+ }
+ result+="чланова типова података";
+ result+=" са везама ка ";
+ if (!extractAll)
+ {
+ result+="документацији структуре података за сваки члан";
+ }
+ else
+ {
+ result+="типовима података којима припадају:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Индекс типова података"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Документација типова података"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Функције/потпрограми"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Документација функције/потпрограма"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Типови података"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Списак модула"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Овде је списак свих ";
+ if (!extractAll) result+="документованих ";
+ result+="модула са кратким описима:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ if (isTemplate) result+=" Шаблон";
+ result+=" Референца";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" модула"; break;
+ case ClassDef::Struct: result+=" типа"; break;
+ case ClassDef::Union: result+=" уније"; break;
+ case ClassDef::Interface: result+=" интерфејса"; break;
+ case ClassDef::Protocol: result+=" протокола"; break;
+ case ClassDef::Category: result+=" категорије"; break;
+ case ClassDef::Exception: result+=" изузетка"; break;
+ }
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Референца модула";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Чланови модула"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Овде је списак свих ";
+ if (!extractAll) result+="документованих ";
+ result+="чланова модула са везама ка ";
+ if (extractAll)
+ {
+ result+="документацији модула за сваки члан:";
+ }
+ else
+ {
+ result+="модулима којима припадају:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Индекс модула"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Модул" : "модул"));
+ if (!singular) result+="и";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Документација за ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="овај модул"; break;
+ case ClassDef::Struct: result+="овај тип"; break;
+ case ClassDef::Union: result+="ову унију"; break;
+ case ClassDef::Interface: result+="овај интерфејс"; break;
+ case ClassDef::Protocol: result+="овај протокол"; break;
+ case ClassDef::Category: result+="ову категорију"; break;
+ case ClassDef::Exception: result+="овај изузетак"; break;
+ }
+ result+=" је направљен из следећ";
+ if (single) result+="е датотеке:"; else result+="их датотека:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Тип" : "тип"));
+ if (!singular) result+="ови";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Потпрограм" : "потпрограм"));
+ if (!singular) result+="и";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Ограничења типова";
+ }
+
+};
+
+#endif
diff --git a/src/translator_si.h b/src/translator_si.h
new file mode 100644
index 0000000..5517285
--- /dev/null
+++ b/src/translator_si.h
@@ -0,0 +1,1251 @@
+/******************************************************************************
+ *
+ * $Id: translator_si.h,v 1.1 2000/07/22 17:04:41 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+// translation by Matjaz Ostroversnik <matjaz.ostroversnik@zrs-tk.si>
+
+#ifndef TRANSLATOR_SI_H
+#define TRANSLATOR_SI_H
+
+
+class TranslatorSlovene : public TranslatorAdapter_1_4_6
+//public TranslatorAdapter_1_2_16
+{
+ protected:
+ friend class TranslatorAdapterBase;
+ virtual ~TranslatorSlovene() {}
+ public:
+ QCString idLanguage()
+ { return "slovene"; }
+ /*! Used to get the command(s) for the language support. This method
+ * was designed for languages which do not prefer babel package.
+ * If this methods returns empty string, then the latexBabelPackage()
+ * method is used to generate the command for using the babel package.
+ */
+ QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[slovene]{babel}\n\\usepackage[T1]{fontenc}\n";
+ }
+ QCString idLanguageCharset()
+ {
+//#ifdef _WIN32
+ return "windows-1250";
+//#else
+// return "iso-8859-2";
+//#endif
+ }
+ QCString trRelatedFunctions()
+ { return "Povezane funkcije"; }
+ QCString trRelatedSubscript()
+ { return "(To niso metode.)"; }
+ QCString trDetailedDescription()
+ { return "Podroben opis"; }
+ QCString trMemberTypedefDocumentation()
+ { return "Opis uporabni¹ko definiranih tipov"; }
+ QCString trMemberEnumerationDocumentation()
+ { return "Opis komponent na¹tevnih tipov"; }
+/* QCString trEnumerationValueDocumentation() */
+/* { return "Opis vrednosti na¹tevnih tipov (enum) "; } */
+ QCString trMemberFunctionDocumentation()
+ { return "Opis metod"; }
+ QCString trMemberDataDocumentation()
+ { return "Opis atributov"; }
+ QCString trMore()
+ { return "..."; }
+ QCString trListOfAllMembers()
+ { return "Seznam vseh metod / atributov."; }
+ QCString trMemberList()
+ { return " - seznam metod in atributov."; }
+ QCString trThisIsTheListOfAllMembers()
+ { return "Seznam metod razreda "; }
+ QCString trIncludingInheritedMembers()
+ { return ", vkljuèujoè dedovane metode in atribute."; }
+ QCString trGeneratedAutomatically(const char *s)
+ { QCString result="zgenerirano z Doxygen-om";
+ if (s) result+=(QCString)" za "+s;
+ result+=" iz izvorne kode.";
+ return result;
+ }
+ QCString trEnumName()
+ { return "na¹tevno ime"; }
+ QCString trEnumValue()
+ { return "na¹tevna vrednost"; }
+ QCString trDefinedIn()
+ { return "definirano v"; }
+ QCString trModules()
+ { return "moduli"; }
+ QCString trClassHierarchy()
+ { return "dedovalna hierarhija"; }
+ QCString trCompoundList()
+ { return "kratek opis razredov"; }
+ QCString trFileList()
+ { return "seznam datotek"; }
+/* QCString trHeaderFiles() */
+/* { return "'Header' datoteka"; } */
+ QCString trCompoundMembers()
+ { return "metode in atributi"; }
+ QCString trFileMembers()
+ { return "komponente v datotekah"; }
+ QCString trRelatedPages()
+ { return "dodatni opisi"; }
+ QCString trExamples()
+ { return "Primeri"; }
+ QCString trSearch()
+ { return "I¹èi"; }
+ QCString trClassHierarchyDescription()
+ { return "Hierarhièno drevo je (okvirno) sortirano po abecedi. ";
+ }
+ QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Seznam vseh ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="datotek s kratkim opisom:";
+ return result;
+ }
+ QCString trCompoundListDescription()
+ { return "Seznam razredov, mno¾ic in struktur "
+ "s kratkim opisom :";
+ }
+ QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Seznam vseh ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="metod in atributov s povezavami na ";
+ if (extractAll) result+="opis posamezne metode in/ali atributa:";
+ else result+="opis razreda :";
+ return result;
+ }
+ QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Seznam ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="entitet v datotekah ";
+ if (extractAll) result+="skupaj z opisom datoteke v kateri se nahajajo:";
+ else result+="s povezavami na datoteke v katerih se nahajajo:";
+ return result;
+ }
+/* QCString trHeaderFilesDescription() */
+/* { return "Seznam header datotek, ki tvorijo aplikacijski vmesnik (API) :"; } */
+ QCString trExamplesDescription()
+ { return "Seznam primerov :"; }
+ QCString trRelatedPagesDescription()
+ { return "Seznam strani z dodatnimi opisi:"; }
+ QCString trModulesDescription()
+ { return "Seznam modulov:"; }
+/* QCString trNoDescriptionAvailable() */
+/* { return "Opis ni dostopen"; } */
+
+ QCString trDocumentation()
+ { return "Dokumentacija"; }
+ QCString trModuleIndex()
+ { return "seznam modulov"; }
+ QCString trHierarchicalIndex()
+ { return "Hierarhièni indeks"; }
+ QCString trCompoundIndex()
+ { return "abecedni seznam"; }
+ QCString trFileIndex()
+ { return "seznam datotek"; }
+ QCString trModuleDocumentation()
+ { return "Dokumentacija modulov"; }
+ QCString trClassDocumentation()
+ { return "Opis razreda"; }
+ QCString trFileDocumentation()
+ { return "Opis datoteke"; }
+ QCString trExampleDocumentation()
+ { return "Opis primera"; }
+ QCString trPageDocumentation()
+ { return "Opis povezanih strani"; }
+ QCString trReferenceManual()
+ { return "Priroènik"; }
+
+ QCString trDefines()
+ { return "Makro deklaracije"; }
+ QCString trFuncProtos()
+ { return "Prototipi funkcij"; }
+ QCString trTypedefs()
+ { return "Uporabni¹ko definirani tipi"; }
+ QCString trEnumerations()
+ { return "Na¹tevni tipi"; }
+ QCString trFunctions()
+ { return "Funkcije"; }
+ QCString trVariables()
+ { return "Spremenljivke"; }
+ QCString trEnumerationValues()
+ { return "Vrednosti na¹tevnih tipov"; }
+ QCString trDefineDocumentation()
+ { return "Opis makro definicije"; }
+ QCString trFunctionPrototypeDocumentation()
+ { return "Opis prototipa funkcije"; }
+ QCString trTypedefDocumentation()
+ { return "Opis uporabni¹ko definiranega tipa"; }
+ QCString trEnumerationTypeDocumentation()
+ { return "Opis na¹tevnega (enum) tipa"; }
+ QCString trFunctionDocumentation()
+ { return "Opis funkcije"; }
+ QCString trVariableDocumentation()
+ { return "Opis spremenljivke"; }
+ QCString trCompounds()
+ { return "Strukture"; }
+ QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generirano "+date;
+ if (projName) result+=(QCString)" projekt: "+projName;
+ result+=(QCString)" generator: ";
+ return result;
+ }
+ QCString trWrittenBy()
+ {
+ return "napisal ";
+ }
+ QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagram razredov za "+clName;
+ }
+ QCString trForInternalUseOnly()
+ { return "Samo za interno uporabo."; }
+/* QCString trReimplementedForInternalReasons() */
+/* { return "Ponovno implementirano zaradi internih razlogov. " */
+/* "Nima vpliva na API."; */
+/* } */
+ QCString trWarning()
+ { return "Opozorilo"; }
+/* QCString trBugsAndLimitations() */
+/* { return "Napake in omejtive"; } */
+ QCString trVersion()
+ { return "Verzija"; }
+ QCString trDate()
+ { return "Datum"; }
+ QCString trReturns()
+ { return "Rezultat(i)"; }
+ QCString trSeeAlso()
+ { return "Glej"; }
+ QCString trParameters()
+ { return "Parametri"; }
+ QCString trExceptions()
+ { return "Prekinitve"; }
+ QCString trGeneratedBy()
+ { return "Izdelano s pomoèjo"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNamespaceList()
+ { return "imenski prostori"; }
+ QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Seznam ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="imenskih prostorov z opisom:";
+ return result;
+ }
+ QCString trFriends()
+ { return "Prijatelji (Friends) "; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trRelatedFunctionDocumentation()
+ { return "Podatki o poveznih funkcijah"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool /*isTemplate*/)
+ // used as the title of the HTML page of a class/struct/union
+ {
+ QCString result="";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Razred "; break;
+ case ClassDef::Struct: result+=" Struktura "; break;
+ case ClassDef::Union: result+=" Mno¾ica "; break;
+ case ClassDef::Interface: result+=" IDL vmesnik "; break;
+ case ClassDef::Protocol: result+=" protocol "; break; // translate me!
+ case ClassDef::Category: result+=" category "; break; // translate me!
+ case ClassDef::Exception: result+=" IDL prekinitev "; break;
+ }
+ result += (QCString)clName;
+
+ return result;
+ }
+ QCString trFileReference(const char *fileName)
+ // used as the title of the HTML page of a file
+ {
+ QCString result="Datoteka ";
+ result+=fileName;
+ return result;
+ }
+ QCString trNamespaceReference(const char *namespaceName)
+ // used as the title of the HTML page of a namespace
+ {
+ QCString result ="Imenski prostor ";
+ result+=namespaceName;
+
+ return result;
+ }
+
+ // these are for the member sections of a class, struct or union
+ QCString trPublicMembers()
+ { return "Javne metode"; }
+ QCString trPublicSlots()
+ { return "Public slotovi"; }
+ QCString trSignals()
+ { return "Programske prekinitve"; }
+ QCString trStaticPublicMembers()
+ { return "Statiène javne metode in atributi"; }
+ QCString trProtectedMembers()
+ { return "Za¹èitene metode in atributi"; }
+ QCString trProtectedSlots()
+ { return "Za¹èiteni sloti"; }
+ QCString trStaticProtectedMembers()
+ { return "Statiène za¹èitene metode in atributi"; }
+ QCString trPrivateMembers()
+ { return "Skrite metode in atributi"; }
+ QCString trPrivateSlots()
+ { return "Skriti slotovi"; }
+ QCString trStaticPrivateMembers()
+ { return "Statiène skrite metode in atributi"; }
+ // end of member sections
+
+ QCString trWriteList(int numEntries)
+ {
+ // this function is used to produce a comma-separated list of items.
+ // use generateMarker(i) to indicate where item i should be put.
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" in ";
+ }
+ }
+ return result;
+ }
+
+ QCString trInheritsList(int numEntries)
+ // used in class documentation to produce a list of base classes,
+ // if class diagrams are disabled.
+ {
+ return "Deduje od "+trWriteList(numEntries)+".";
+ }
+ QCString trInheritedByList(int numEntries)
+ // used in class documentation to produce a list of super classes,
+ // if class diagrams are disabled.
+ {
+ return "Naslijeðena u "+trWriteList(numEntries)+".";
+ }
+ QCString trReimplementedFromList(int numEntries)
+ // used in member documentation blocks to produce a list of
+ // members that are hidden by this one.
+ {
+ return "Skrije implementacijo iz "+trWriteList(numEntries)+".";
+ }
+ QCString trReimplementedInList(int numEntries)
+ {
+ // used in member documentation blocks to produce a list of
+ // all member that overwrite the implementation of this member.
+ return "Metodo skrijejo implementacije v razredih "+trWriteList(numEntries)+".";
+ }
+
+ QCString trNamespaceMembers()
+ // This is put above each page as a link to all members of namespaces.
+ { return "elementi imenskega prostora"; }
+ QCString trNamespaceMemberDescription(bool extractAll)
+ // This is an introduction to the page with all namespace members
+ {
+ QCString result="Seznam vseh ";
+ if (!extractAll) result+="dokumentiranih ";
+ result+="elementov imenskega prostora s povezavami na ";
+ if (extractAll)
+ result+="opis vsakega elementa:";
+ else
+ result+="imenski prostor, ki mu pripadajo:";
+ return result;
+ }
+ QCString trNamespaceIndex()
+ // This is used in LaTeX as the title of the chapter with the
+ // index of all namespaces.
+ { return "Indeks imenskih prostorov"; }
+ QCString trNamespaceDocumentation()
+ // This is used in LaTeX as the title of the chapter containing
+ // the documentation of all namespaces.
+ { return "Podatki o imenskih prostorih"; }
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Imenski prostori"; }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Opis ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="razreda"; break;
+ case ClassDef::Struct: result+="strukture"; break;
+ case ClassDef::Union: result+="unije"; break;
+ case ClassDef::Interface: result+="vmesnika (interface)"; break;
+ case ClassDef::Protocol: result+="protocol"; break; // translate me!
+ case ClassDef::Category: result+="category"; break; // translate me!
+ case ClassDef::Exception: result+="prekinitve (exception)"; break;
+ }
+ result+=" je zgrajen na podlagi naslednj";
+ if (single) result+="e "; else result+="ih";
+ result+=" datotek";
+ if (single) result+="e :"; else result+=" :";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ QCString trAlphabeticalList()
+ { return "abecedni seznam"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ QCString trReturnValues()
+ { return "Povratna vrednost"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ QCString trMainPage()
+ { return "prva stran"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ QCString trPageAbbreviation()
+ { return "str."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+/* QCString trSources() */
+/* { */
+/* return "Izvorne datoteke"; */
+/* } */
+ QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definirano v @0 vrstici datoteke @1.";
+ }
+ QCString trDefinedInSourceFile()
+ {
+ return "Definirano v datoteki @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDeprecated()
+ {
+ return "Zastarelo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Kolaboracijski diagram razreda "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Graf prikazuje seznam datotek, "
+ "ki jih datoteka \""+fName+"\" "
+ "direktno ali indirektno vkljuèuje. Pravokotniki ponazarjajo datoteke, pu¹èice "
+ "predstavljajo relacije med njimi. "
+ "Èrn pravokotnik ponazarja datoteko "+fName+". Pu¹èice A->B ponazarjajo "
+ "usmerjeno relacijo \"A vkljuèuje B\"."
+;
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ QCString trConstructorDocumentation()
+ {
+ return "Opis konstruktorjev in destruktorjev ";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ QCString trGotoSourceCode()
+ {
+ return "izvorna koda";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ QCString trGotoDocumentation()
+ {
+ return "dokumenacija tekoèe datoteke.";
+ }
+ /*! Text for the \pre command */
+ QCString trPrecondition()
+ {
+ return "Predpogoji (preconditions)";
+ }
+ /*! Text for the \post command */
+ QCString trPostcondition()
+ {
+ return "Naknadni pogoji (posconditions)";
+ }
+ /*! Text for the \invariant command */
+ QCString trInvariant()
+ {
+ return "Invarianta";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ QCString trInitialValue()
+ {
+ return "Zaèetna vrednost / definicija :";
+ }
+ /*! Text used the source code in the file index */
+ QCString trCode()
+ {
+ return "koda";
+ }
+ QCString trGraphicalHierarchy()
+ {
+ return "Hierarhija razredov v grafièni obliki";
+ }
+ QCString trGotoGraphicalHierarchy()
+ {
+ return "Dedovalna hierarhija v grafièni obliki";
+ }
+ QCString trGotoTextualHierarchy()
+ {
+ return "Dedovalna hierarhija v tekstovni obliki";
+ }
+ QCString trPageIndex()
+ {
+ return "Indeks strani";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNote()
+ {
+ return "Opomba";
+ }
+ QCString trPublicTypes()
+ {
+ return "Javni tipi";
+ }
+ QCString trPublicAttribs()
+ {
+ return "Javni atributi";
+ }
+ QCString trStaticPublicAttribs()
+ {
+ return "Statièni javni atributi";
+ }
+ QCString trProtectedTypes()
+ {
+ return "Za¹èiteni tipi";
+ }
+ QCString trProtectedAttribs()
+ {
+ return "Za¹èiteni atributi";
+ }
+ QCString trStaticProtectedAttribs()
+ {
+ return "Statièni za¹èiteni tipi";
+ }
+ QCString trPrivateTypes()
+ {
+ return "Skriti tipi";
+ }
+ QCString trPrivateAttribs()
+ {
+ return "Skriti atributi";
+ }
+ QCString trStaticPrivateAttribs()
+ {
+ return "Statièni skriti atributi";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "TODO";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Seznam nedokonèanih opravil";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Uporabniki entitete: ";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Opomba";
+ }
+ virtual QCString trAttention()
+ {
+ return "Pozor";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Graf prikazuje datoteke, ki posredno ali neposredno "
+ "vkljuèujejo tekoèo datoteko. Pravokotniki simbolizirajo datoteke, "
+ "pu¹èice pa relacije med datotekami. Tekoèa datoteka je prikazana "
+ "kot pravokotnik s èrno podlago, ostale pa kot pravokotnik brez podlage. "
+ "Smer pu¹èice A->B definira relacijo \"A vkljuèuje B\". "
+ "Vse datoteke, ki torej mejijo na tekoèo (t.j. obstaja povezava med èrnim in "
+ "praznim pravokotnikom), jo direktno vkljuèujejo, medtem, ko jo ostale vkljuèujejo "
+ "le posredno. "
+ ;
+ }
+ virtual QCString trSince()
+ {
+ return "Od";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Legenda grafa";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Tekoèa stran pojasnjuje naèin interpretacije grafov, ki jih izri¹e "
+ "doxygen.<p>\n"
+ "Poglejmo si naslednji primer:\n"
+ "\\code\n"
+ "/*! Nevide razred zaradi rezanja */\n"
+ "class Invisible { };\n\n"
+ "/*! Odrezan razred, dedovalna relacija je skrita */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* razred, ki ni opisan z doxygen komentarji */\n"
+ "class Undocumented { };\n\n"
+ "/*! Razred, ki ga dedujemo s pomoèjo javnega dedovanja */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Razred, ki ga dedujemo s pomoèjo za¹èitenega dedovanja */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Razred, ki ga dedujemo s pomoèjo skritega dedovanja */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Razred, ki ga uporablja dedovani razred */\n"
+ "class Used { };\n\n"
+ "/*! Super class that inherits a number of other classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
+ "is set to 200 this will result in the following graph:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "The boxes in the above graph have the following meaning:\n"
+ "<ul>\n"
+ "<li>%A filled black box represents the struct or class for which the "
+ "graph is generated.\n"
+ "<li>%A box with a black border denotes a documented struct or class.\n"
+ "<li>%A box with a grey border denotes an undocumented struct or class.\n"
+ "<li>%A box with a red border denotes a documented struct or class for\n"
+ "which not all inheritance/containment relations are shown. %A graph is "
+ "truncated if it does not fit within the specified boundaries."
+ "</ul>\n"
+ "The arrows have the following meaning:\n"
+ "<ul>\n"
+ "<li>%A dark blue arrow is used to visualize a public inheritance "
+ "relation between two classes.\n"
+ "<li>%A dark green arrow is used for protected inheritance.\n"
+ "<li>%A dark red arrow is used for private inheritance.\n"
+ "<li>%A purple dashed arrow is used if a class is contained or used "
+ "by another class. The arrow is labeled with the variable(s) "
+ "through which the pointed class or struct is accessible. \n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "legenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Test List";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP metode";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "IDL Lastnosti";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Opis IDL lastnosti";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java interfaces in the summary section of Java packages */
+/* virtual QCString trInterfaces() */
+/* { */
+/* return "Vmesniki"; */
+/* } */
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Podatkovne strukture";
+ }
+ else
+ {
+ return "Razredi";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"JAVA paket "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Seznam JAVA paketov";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Seznam JAVA paketov in njihovih kratkih opisov v primeru, da obstajajo:";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "JAVA paketi";
+ }
+ /*! Used as a chapter title for Latex & RTF output */
+/* virtual QCString trPackageDocumentation() */
+/* { */
+/* return "Opisi JAVA paketov"; */
+/* } */
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Vrednost:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Programska napaka";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Seznam programskih napak";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1250";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indeks";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Razred" : "razred"));
+ if (!singular) result+="i";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Datotek" : "datotek"));
+ if (!singular) result+="e";
+ else result += "a";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Imenski prostor" : "imenski prostor"));
+ if (!singular) result+="i";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Skupina" : "skupina"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Stran" : "stran"));
+ if (!singular) result+="i";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Element" : "element"));
+ if (!singular) result+="i";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+/* virtual QCString trField(bool first_capital, bool singular) */
+/* { */
+/* QCString result((first_capital ? "Polj" : "polj")); */
+/* if (!singular) result+="a"; */
+/* else result += "e"; */
+/* return result; */
+/* } */
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Avtor" : "avtor"));
+ if (!singular) result+="ji";
+ return result;
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Reference";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementira "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementirano v "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Vsebina";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Seznam opuščenih";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Dogodki";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Opisi dogodkov";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Tipi paketov";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funkcije paketa"; /* don't know the context */
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statične funkcije paketa";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atributi paketa";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statični atributi paketa";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Vse";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Graf klicev tekoče funkcije:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Išči";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Rezultat(i) iskanja";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Oprostite, noben dokument ne ustreza vašemu povpraševanju.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Našel sem <b>1</b> dokument, ki ustreza vašemu povpraševanju.";
+ }
+ else if (numDocuments==2)
+ {
+ return "Našel sem <b>2</b> dokumenta, ki ustrezata vašemu povpraševanju.";
+ }
+ else
+ {
+ return "Našel sem <b>$num</b> dokumentov, ki ustrezajo vašemu povpraševanju. "
+ "Dokumenti z najboljšo stopnjo ujemanja se nahajajo na začetku.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Zadetki:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " izvorna koda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Hierarhija imenikov"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Opisi imenikov"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Imeniki"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Imeniška hierarhija je urejena v glavnem, toda ne popolnoma, po abecedi, ";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName;
+ result+=" imeniške reference"; /* not sure for context */
+ return result;
+ }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Imenik" : "imenik"));
+ if (singular) result+="i"; else result+="";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "To je ponovno definirana metoda, " /* don't know Slovene expresion for overloaded */
+ "podana je zaradi priročnosti. Metoda se od predhodnje razlikuje "
+ "samo v številu in/ali tipu formalnih argumentov.";
+ }
+};
+
+#endif
diff --git a/src/translator_sk.h b/src/translator_sk.h
new file mode 100644
index 0000000..6496fd6
--- /dev/null
+++ b/src/translator_sk.h
@@ -0,0 +1,1836 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * ----------------------------------------------------------------------------*/
+
+// Updates:
+// --------
+// 2010/06/04 - big leap from 1.2.18 to 1.6.3+
+//
+// Slovak translation started by Stanislav Kudlac (skudlac at pobox dot sk).
+// He resigned in March 2008 (thanks for the work). Until a "native Slovak"
+// maintainer is found, the TranslatorSlovak is maintained by Petr Prikryl with
+// Slovak speaking Kali and Laco Švec.
+// ----------------------------------------------------------------------------
+
+#ifndef TRANSLATOR_SK_H
+#define TRANSLATOR_SK_H
+
+class TranslatorSlovak : public Translator
+{
+ public:
+ // --- Language control methods -------------------
+
+ virtual QCString idLanguage()
+ { return "slovak"; }
+
+ virtual QCString latexLanguageSupportCommand()
+ { return "\\usepackage[slovak]{babel}\n"; }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Súvisiace funkcie"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Uvedené funkcie niesú členskými funkciami.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Detailný popis"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Dokumentácia k členským typom"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Dokumentácia k členským enumeráciám"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Dokumentácia k metódam"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dokumentácia k položkám";
+ }
+ else
+ {
+ return "Dokumentácia k dátovým členom";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Zoznam všetkých členov."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Zoznam členov triedy"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Tu nájdete úplný zoznam členov triedy "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", vrátane všetkých zdedených členov."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result("Generované automaticky programom Doxygen "
+ "zo zdrojových textov");
+ if (s)
+ result+=(QCString)" projektu "+s;
+ result+=".";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "meno enumerácie"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "hodnota enumerácie"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "definovaný v"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Moduly"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Hierarchia tried"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dátové štruktúry";
+ }
+ else
+ {
+ return "Zoznam tried";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Zoznam súborov"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dátové položky";
+ }
+ else
+ {
+ return "Zoznam členov tried";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globálne symboly";
+ }
+ else
+ {
+ return "Symboly v súboroch";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Ostatné stránky"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Príklady"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Hľadať"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Tu nájdete zoznam, vyjadrujúci vzťah dedičnosti tried. "
+ "Je zoradený približne (ale nie úplne) podľa abecedy:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result("Tu nájdete zoznam všetkých ");
+ if (!extractAll) result+="dokumentovaných ";
+ result+="súborov so stručnými popismi:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Nasledujúci zoznam obsahuje identifikáciu dátových "
+ "štruktúr a ich stručné popisy:";
+ }
+ else
+ {
+ return "Nasledujúci zoznam obsahuje predovšetkým identifikáciu "
+ "tried, ale nachádzajú sa tu i ďalšie netriviálne prvky, "
+ "ako sú štruktúry (struct), uniony (union) a rozhrania "
+ "(interface). V zozname sú uvedené ich stručné "
+ "popisy:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result= "Tu nájdete zoznam všetkých ";
+ if (!extractAll)
+ {
+ result += "dokumentovaných ";
+ }
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result += "položiek štruktúr (struct) a unionov (union) ";
+ }
+ else
+ {
+ result += "členov tried ";
+ }
+
+ result += "s odkazmi na ";
+
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result += "dokumentáciu štruktúr/unionov, ku ktorým prislúchajú:";
+ }
+ else
+ {
+ result += "dokumentáciu tried, ku ktorým prislúchajú:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="štruktúry/uniony, ku ktorým prislúchajú:";
+ }
+ else
+ {
+ result+="triedy, ku ktorým prislúchajú:";
+ }
+ }
+
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Tu nájdete zoznam všetkých ";
+ if (!extractAll) result+="dokumentovaných ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funkcií, premenných, makier, enumerácií a definícií typov (typedef) "
+ "s odkazmi na ";
+ }
+ else
+ {
+ result+="symbolov, ktoré sú definované na úrovni svojich súborov. "
+ "Pre každý symbol je uvedený odkaz na ";
+ }
+
+ if (extractAll)
+ result+="súbory, ku ktorým prislúchajú:";
+ else
+ result+="dokumentáciu:";
+
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Tu nájdete zoznam všetkých príkladov:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Nasledujúci zoznam odkazuje na ďalšie stránky projektu, "
+ "ktoré majú charakter usporiadaných zoznamov informácií, "
+ "pozbieraných z rôznych miest v zdrojových súboroch:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Tu nájdete zoznam všetkých modulov:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentácia"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Register modulov"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Register hierarchie tried"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Register dátových štruktúr";
+ }
+ else
+ {
+ return "Register tried";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Register súborov"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Dokumentácia modulov"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ { return "Dokumentácia tried"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Dokumentácia súborov"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Dokumentácia príkladov"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Dokumentácia súvisiacich stránok"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Referenčná príručka"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Definícia makier"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Prototypy"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Definícia typov"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumerácie"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funkcie"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Premenné"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Hodnoty enumerácií"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Dokumentácia k definíciám makier"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Dokumentácia prototypov"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Dokumentácia definícií typov"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Dokumentácia enumeračných typov"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Dokumentácia funkcií"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Dokumentácia premenných"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dátové štruktúry";
+ }
+ else
+ {
+ return "Triedy";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Generované "+date;
+ if (projName) result+=(QCString)" pre projekt "+projName;
+ result+=(QCString)" programom";
+ return result;
+ }
+
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return " -- autor ";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Diagram dedičnosti pre triedu "+clName;
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Iba pre interné použitie."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Pozor"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Verzia"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Dátum"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Návratová hodnota"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Viz tiež"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametre"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Výnimky"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Generované programom"; }
+
+ // new since 0.49-990307
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Zoznam priestorov mien"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Tu nájdete zoznam všetkých ";
+ if (!extractAll) result+="dokumentovaných ";
+ result+="priestorov mien so stručným popisom:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Priatelia (friends)"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Dokumentácia k priateľom (friends)"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result("Dokumentácia ");
+ if (isTemplate) result+="šablóny ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="triedy "; break;
+ case ClassDef::Struct: result+="štruktúry "; break;
+ case ClassDef::Union: result+="unionu "; break;
+ case ClassDef::Interface: result+="rozhrania "; break;
+ case ClassDef::Protocol: result+="protokol "; break;
+ case ClassDef::Category: result+="kategória "; break;
+ case ClassDef::Exception: result+="výnimky "; break;
+ }
+ result+=clName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result("Dokumentácia súboru ");
+ result+=fileName;
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result("Dokumentácia priestoru mien ");
+ result+=namespaceName;
+ return result;
+ }
+
+ /* these are for the member sections of a class, struct or union */
+ virtual QCString trPublicMembers()
+ { return "Verejné metódy"; }
+ virtual QCString trPublicSlots()
+ { return "Verejné sloty"; }
+ virtual QCString trSignals()
+ { return "Signály"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statické verejné metódy"; }
+ virtual QCString trProtectedMembers()
+ { return "Chránené metódy"; }
+ virtual QCString trProtectedSlots()
+ { return "Chránené sloty"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statické chránené metódy"; }
+ virtual QCString trPrivateMembers()
+ { return "Privátne metódy"; }
+ virtual QCString trPrivateSlots()
+ { return "Privátne sloty"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statické privátne metódy"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" a ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ QCString result("Dedí od ");
+ result += (numEntries == 1) ? "bázovej triedy " : "bázových tried ";
+ result += trWriteList(numEntries)+".";
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ QCString result("Zdedená ");
+ result += (numEntries == 1) ? "triedou " : "triedami ";
+ result += trWriteList(numEntries)+".";
+ return result;
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ QCString result("Reimplementuje ");
+ result += (numEntries == 1) ? "metódu triedy " : "metódy tried ";
+ result += trWriteList(numEntries)+".";
+ return result;
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ QCString result("Reimplementované ");
+ result += (numEntries == 1) ? "triedou " : "triedami ";
+ result += trWriteList(numEntries)+".";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Symboly v priestoroch mien"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Tu nájdete zoznam všetkých ";
+ if (!extractAll) result+="dokumentovaných ";
+ result+="symbolov, ktoré sú definované vo svojich priestoroch mien. "
+ "U každého je uvedený odkaz na ";
+ if (extractAll)
+ result+="dokumentáciu príslušného priestoru mien:";
+ else
+ result+="príslušný priestor mien:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Register priestorov mien"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Dokumentácia priestorov mien"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Priestory mien"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentácia pre ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="túto triedu"; break;
+ case ClassDef::Struct: result+="túto štruktúru (struct)"; break;
+ case ClassDef::Union: result+="tento union"; break;
+ case ClassDef::Interface: result+="toto rozhranie"; break;
+ case ClassDef::Protocol: result+="protokol"; break;
+ case ClassDef::Category: result+="kategória"; break;
+ case ClassDef::Exception: result+="túto výnimku"; break;
+ }
+ result+=" bola generovaná z ";
+ if (single) result+="nasledujúceho súboru:";
+ else result+="nasledujúcich súborov:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Register tried"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Návratové hodnoty"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Hlavná stránka"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "s."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definícia je uvedená na riadku @0 v súbore @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definícia v súbore @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Zastaralé";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Diagram tried pre "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Graf závislostí na vkladaných súboroch "
+ "pre "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Dokumentácia konštruktoru a deštruktoru";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Zobraziť zdrojový text tohoto súboru.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Zobraziť dokumentáciu tohoto súboru.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Prepodmienka";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postpodmienka";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Inicializátor:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "zdrojový text";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafické zobrazenie hierarchie tried";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Zobraziť grafickú podobu hierarchie tried";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Zobraziť textovú podobu hierarchie tried";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Register stránok";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Poznámka";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Verejné typy";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dátové položky";
+ }
+ else
+ {
+ return "Verejné atribúty";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statické verejné atribúty";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Chránené typy";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Chránené atribúty";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statické chránené atribúty";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Privátne typy";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Privátne atribúty";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statické privátne atribúty";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ {
+ return "Plánované úpravy";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Zoznam plánovaných úprav";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Používa sa v";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Poznámky";
+ }
+ virtual QCString trAttention()
+ {
+ return "Upozornenie";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Nasledujúci graf ukazuje, ktoré súbory priamo alebo "
+ "nepriamo vkladajú tento súbor:";
+ }
+ virtual QCString trSince()
+ {
+ return "Od";
+ }
+
+////////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Vysvetlivky ku grafu";
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Tu nájdete vysvetlenie, ako majú byť interpretované grafy, "
+ "ktoré boli generované programom doxygen.<p>\n"
+ "Uvažujte nasledujúci príklad:\n"
+ "\\code\n"
+ "/*! Neviditelná trieda, ktorá sa v grafe nezobrazuje, pretože "
+ "došlo k orezaniu grafu. */\n"
+ "class Invisible { };\n\n"
+ "/*! Trieda, u ktorej došlo k orezaniu grafu. Vzťah dedičnosti "
+ "je skrytý. */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Trieda, ktorá nieje dokumentovaná komentármi programu doxygen. */\n"
+ "class Undocumented { };\n\n"
+ "/*! Odvodená trieda s verejným (public) dedením bázovej triedy. */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Šablóna triedy. */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Odvodená trieda s chráneným (protected) dedením bázovej triedy. */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Odvodená trieda s privátnym dedením bázovej triedy. */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Trieda, ktorá je využívaná triedou Inherited. */\n"
+ "class Used { };\n\n"
+ "/*! Odvodená trieda, ktorá rôznym spôsobom dedí od viacerých bázových "
+ "tried. */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "K vyššie uvedenému bude vygenerovaný nasledujúci graf:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Bloky (tj. uzly) v uvedenom grafe majú nasledujúci význam:\n"
+ "<ul>\n"
+ "<li>Čierne vyplnený obdĺžnik reprezentuje štruktúru alebo triedu, "
+ "pre ktorú bol graf generovaný.\n"
+ "<li>Obdĺžnik s čiernym obrysom označuje dokumentovanú "
+ "štruktúru alebo triedu.\n"
+ "<li>Obdĺžnik so šedým obrysom označuje nedokumentovanú "
+ "štruktúru alebo triedu.\n"
+ "<li>Obdĺžnik s červeným obrysom označuje dokumentovanú "
+ "štruktúru alebo triedu, pre ktorú\n"
+ "niesú zobrazené všetky vzťahy dedičnosti alebo obsiahnutia. "
+ "Graf je orezaný v prípade, kedy ho\n"
+ "nieje možné umiestniť do vymedzených hraníc.\n"
+ "</ul>\n"
+ "Šípky (tj. hrany grafu) majú nasledujúcí význam:\n"
+ "<ul>\n"
+ "<li>Tmavo modrá šípka sa používa pre označenie vzťahu verejnej "
+ "dedičnosti medzi dvoma triedami.\n"
+ "<li>Tmavo zelená šípka označuje vzťah chránenej dedičnosti "
+ "(protected).\n"
+ "<li>Tmavo červená šípka označuje vzťah privátnej dedičnosti.\n"
+ "<li>Purpurová šípka kreslená čiarkovane sa používa v prípade, "
+ "ak je trieda obsiahnutá v inej triede,\n"
+ "alebo ak je používaná inou triedou. Je označená identifikátorom "
+ "jednej alebo viacerých premenných (objektov), cez ktoré\n"
+ "je trieda alebo štruktúra zprístupnena.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "vysvetlivky";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Zoznam testov";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Metódy DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Vlastnosti";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Dokumentácia k vlastnosti";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ return "Triedy";
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Balík "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Zoznam balíkov";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Tu nájdete zoznam balíkov so stručným popisom "
+ "(pokiaľ bol uvedený):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Balíky";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Hodnota:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Chyba";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Zoznam chýb";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6-20010422
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "1250";
+ }
+
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "3";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Index";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tried" : "tried"));
+ result+=(singular ? "a" : "y");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Súbor" : "súbor"));
+ if (!singular) result+="y";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Priestor" : "priestor"));
+ if (!singular) result+="y";
+ result+=" mien";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Skupin" : "skupin"));
+ result+=(singular ? "a" : "y");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Stránk" : "stránk"));
+ result+=(singular ? "a" : "y");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Člen" : "člen"));
+ if (!singular) result+="y";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Globáln" : "globáln"));
+ result+=(singular ? "y" : "e");
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Auto" : "auto"));
+ result += (singular) ? "r" : "ri";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Odkazuje sa na";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementuje " + trWriteList(numEntries) + ".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementované v " + trWriteList(numEntries) + ".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Obsah";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Zastarané metódy";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Udalosti";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Dokumentácia udalostí";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Typy v balíku";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Funkcie v balíku";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statické funkcie v balíku";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Atribúty balíku";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statické atribúty balíku";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Všetko";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Táto funkcia volá...";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the index
+ * of each page before the search field.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Vyhľadať";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Výsledky vyhľadávania";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Ľutujem. Vášmu dotazu neodpovedá žiadny dokument.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Bol nájdený jediný dokument, ktorý vyhovuje vášmu dotazu.";
+ }
+ else
+ {
+ return "Bolo nájdených <b>$num</b> dokumentov, ktoré vyhovujú vášmu "
+ "dotazu. Najviac odpovedajúce dokumenty sú ako prvé.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Nájdené slová:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return QCString("Zdrojový súbor ") + filename;
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Hierarchia adresárov"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Dokumentácia k adresárom"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Adresáre"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ {
+ return "Následujúca hierarchia adresárov je zhruba, "
+ "ale nie úplne, zoradená podľa abecedy:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ {
+ QCString result = "Referencia k adresáru ";
+ result += dirName;
+ return result;
+ }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Adresár" : "adresár"));
+ if ( ! singular)
+ result += "e";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Ide o preťaženú (overloaded) metódu, "
+ "ktorá má uľahčiť používanie. Od vyššie uvedenej metódy sa odlišuje "
+ "iba inak zadávanými argumentami.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trCallerGraph()
+ { return "Túto funkciu volajú..."; }
+
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Dokumentácia enumeračných hodnôt"; }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Dokumentácia členských funkcií/podprogramov"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Zoznam dátových typov"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Dátové polia"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Dátové typy so stručnými popismi:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+
+ QCString result="Nasleduje zoznam všetkých ";
+ if (!extractAll)
+ {
+ result+="dokumentovaných ";
+ }
+ result+="zložiek dátových typov";
+ result+=" s odkazmi na ";
+ if (!extractAll)
+ {
+ result+="dokumentáciu dátovej štruktúry pre každú zložku:";
+ }
+ else
+ {
+ result+="příslušné dátové typy:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Register dátových typov"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Dokumentácia k dátovým typom"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funkcie/podprogramy"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Dokumentácia funkcie/podprogramu"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Dátové typy"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Zoznam modulov"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Nasleduje zoznam všetkých ";
+ if (!extractAll) result+="dokumentovaných ";
+ result+="modulov so stručnými popismi:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result("Dokumentácia ");
+ if (isTemplate) result += "šablóny ";
+ switch(compType)
+ {
+ case ClassDef::Class: result += "triedy "; break;
+ case ClassDef::Struct: result += "typu "; break;
+ case ClassDef::Union: result += "únie "; break;
+ case ClassDef::Interface: result += "rozhrania "; break;
+ case ClassDef::Protocol: result += "protokolu "; break;
+ case ClassDef::Category: result += "kategórie "; break;
+ case ClassDef::Exception: result += "výnimky "; break;
+ }
+ result += clName;
+ return result;
+
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result="Dokumentácia modulu ";
+ result += namespaceName;
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Časti modulu"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Nasleduje zoznam všetkých ";
+ if (!extractAll) result+="dokumentovaných ";
+ result+="častí modulov s odkazmi ";
+ if (extractAll)
+ {
+ result+="na dokumentáciu modulov pre danú časť:";
+ }
+ else
+ {
+ result+="na moduly, ku ktorým časť patrí:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Register modulov"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modul" : "modul"));
+ if (!singular) result+="y";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentácia ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="k tomuto modulu"; break;
+ case ClassDef::Struct: result+="k tomuto typu"; break;
+ case ClassDef::Union: result+="k tejto únii"; break;
+ case ClassDef::Interface: result+="k tomuto rozhraniu"; break;
+ case ClassDef::Protocol: result+="k tomuto protokolu"; break;
+ case ClassDef::Category: result+="k tejto kategórii"; break;
+ case ClassDef::Exception: result+="k tejto výnimke"; break;
+ }
+ result+=" bola vygenerovaná z ";
+ if (single) result+="nasledujúceho súboru:";
+ else result+="nasledujúcich súborov:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Typ" : "typ"));
+ if (!singular) result+="y";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Podprogram" : "podprogram"));
+ if (!singular) result+="y";
+ return result;
+ }
+
+ /*! C# Type Contraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Obmedzenie typov (Type Constraints)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Relácia " + QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Načítam...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Globálny priestor mien";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Vyhľadávam...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Nič sa nenašlo";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Graf závislosti adresárov pre "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Súbor v "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Vkladá (include) súbor z "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "po","ut","st","št","pi","so","ne" };
+ static const char *months[] = { "jan","feb","mar","apr","máj","jún","júl","aug","sep","okt","nov","dec" };
+ QCString sdate;
+ sdate.sprintf("%s %d. %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d.%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+};
+
+#endif // TRANSLATOR_SK_H
diff --git a/src/translator_sr.h b/src/translator_sr.h
new file mode 100644
index 0000000..d7af204
--- /dev/null
+++ b/src/translator_sr.h
@@ -0,0 +1,1838 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_SR_H
+#define TRANSLATOR_SR_H
+
+// translation by Dejan D. M. Milosavljevic <dmilos@email.com>;<dmilosx@ptt.yu>;<office@ddmrm.com>
+// // 10x 2 Ivana Miletic for grammatical consultation.
+
+// UTF-8 patch by Nenad Bulatovic <buletina@gmail.com>
+// translation update by Andrija M. Bosnjakovic <andrija@etf.bg.ac.yu>
+
+class TranslatorSerbian : public TranslatorAdapter_1_6_0
+{
+private:
+ QCString decode(const QCString& sInput)
+ {
+//#ifdef _WIN32
+// return ISO88592ToWin1250(sInput);
+//#else
+ return sInput;
+//#endif
+ }
+
+
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "serbian"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ QCString result="\\usepackage[serbian]{babel}\n";
+ return result;
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+//#ifdef _WIN32
+// { return "windows-1250"; }
+//#else
+ { return "UTF-8"; }
+//#endif
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ //! Čini se da je ovako manje loše nego "Povezane funkcije",
+ //! što uopšte ne izgleda dobro jer ta kartica sadrži prijatelje i globalne funkcije
+ { return decode( "Relevantne funkcije" ); }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return decode( "(To nisu funkcije članice.)" ); }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return decode( "Opširniji opis" ); }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return decode( "Dokumentacija unutrašnjih definicija tipa" ); }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ //! Ovo je u skladu sa "unutrašnja klasa" što se može videti u knjizi.
+ { return decode( "Dokumentacija unutrašnjih nabrajanja" ); }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return decode( "Dokumentacija funkcija članica" ); }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Dokumentacija polja" );
+ }
+ else
+ {
+ return decode( "Dokumentacija atributa" );
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return decode( "Još..." ); }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return decode( "Spisak svih članova." ); }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return decode( "Spisak članova" ); }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return decode( "Ovo je spisak svih članova " ); }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return decode( ", uključujući nasleđene članove." ); }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Napravljeno automatski korišćenjem alata Doxygen";
+ if( s ) result+=(QCString)" za projekat " + s;
+ result+=" od izvornog koda.";
+ return decode( result );
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return decode( "ime nabrajanja " ); }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return decode( "vrednost nabrojane konstante" ); }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return decode( "definicija u" ); }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return decode( "Moduli" ); }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return decode( "Hijerarhija klasa" ); }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Spisak struktura" );
+ }
+ else
+ {
+ return decode( "Spisak klasa" );
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return decode( "Spisak datoteka" ); }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Sva polja struktura" );
+ }
+ else
+ {
+ return decode( "Svi članovi klasa" );
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Članovi datoteke" );
+ }
+ else
+ {
+ return decode( "Članovi datoteke" );
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return decode( "Stranice koje imaju veze sa ovom stranicom" ); }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return decode( "Primeri" ); }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return decode( "Traži" ); }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return decode( "Hijerahija klasa uređena približno "
+ "po abecedi:" );
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Spisak svih ";
+ if (!extractAll) result+="dokumentovanih ";
+ result+="datoteka, sa kratkim opisima:";
+ return decode( result );
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Spisak struktura sa kratkim opisima:" );
+ }
+ else
+ {
+ return decode( "Spisak klasa, struktura, "
+ "unija i interfejsa sa kratkim opisima:" );
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Spisak svih ";
+ if (!extractAll)
+ {
+ result+="dokumentovanih ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="članova struktura/unija";
+ }
+ else
+ {
+ result+="članova klasa";
+ }
+ result+=" sa vezama ka ";
+ if (extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="dokumentaciji svakog polja strukture/unije:";
+ }
+ else
+ {
+ result+="dokumentaciji svakog člana klase:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="strukturama/unijama kojima pripadaju:";
+ }
+ else
+ {
+ result+="klasama kojima pripadaju:";
+ }
+ }
+ return decode( result );
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Spisak svih ";
+ if (!extractAll) result+="dokumentovanih ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funkcija, promenljivih, makro zamena, nabrajanja i definicija tipa";
+ }
+ else
+ {
+ result+="članova";
+ }
+ result+=" sa vezama ka ";
+ if (extractAll)
+ result+="datotekama u kojima se nalaze:";
+ else
+ result+="dokumentaciji:";
+ return decode( result );
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return decode( "Spisak svih primera:" ); }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return decode( "Spisak stranica koje imaju veze sa ovom stranicom:" ); }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return decode( "Spisak svih modula:" ); }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return decode("Dokumentacija" ); }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return decode( "Indeks modula" ); }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return decode( "Hijerarhijski sadržaj" ); }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Spisak struktura/unija" );
+ }
+ else
+ {
+ return decode( "Spisak klasa" );
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return decode( "Indeks datoteka" ); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return decode( "Dokumentacija modula" ); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Dokumentacija stuktura/unija" );
+ }
+ else
+ {
+ return decode( "Dokumentacija klasa" );
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return decode( "Dokumentacija datoteke" ); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return decode( "Dokumentacija primera" ); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return decode( "Dokumentacija stranice" ); }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return decode( "Priručnik" ); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return decode( "Makro zamene" ); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return decode( "Deklaracije funkcija" ); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return decode( "Definicije tipa" ); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return decode( "Nabrajanja" ); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return decode( "Funkcije" ); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return decode( "Promenljive" ); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return decode( "Vrednosti nabrojanih konstanti" ); }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return decode( "Dokumentacija makro zamene" ); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return decode( "Dokumentacija deklaracije funkcije" ); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return decode( "Dokumentacija definicije tipa" ); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return decode( "Dokumentacija nabrajanja" ); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return decode( "Dokumentacija funkcije" ); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return decode( "Dokumentacija promenljive" ); }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Strukture i unije" );
+ }
+ else
+ {
+ return decode( "Klase, strukture i unije" );
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"[" + date + "] Napravljeno automatski ";
+ if ( projName ) result+=(QCString)" za projekat " + projName;
+ result+=(QCString)" upotrebom ";
+ return decode( result );
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return decode( "napisao" );
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return decode( QCString("Dijagram nasleđivanja za klasu ") + clName + ":" );
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return decode( "Samo za unutrašnju upotrebu." ); }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return decode( "Upozorenje" ); }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return decode( "Verzija" ); }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return decode( "Datum" ); }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return decode( "Vrednost funkcije" ); }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return decode( "Takođe pogledati" ); }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return decode( "Parametri" ); }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return decode( "Izuzeci" ); }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return decode( "Napravio" ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return decode( "Spisak prostora imena" ); }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Spisak svih ";
+ if (!extractAll) result+="dokumentovanih ";
+ result+="prostora imena sa kratkim opisom:";
+ return decode( result );
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return decode( "Prijatelji" ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return decode( "Dokumentacija prijatelja i relevantnih funkcija" ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result( "Dokumentacija " );
+ switch(compType)
+ {
+ case ClassDef::Class: result+="klase "; break;
+ case ClassDef::Struct: result+="strukture "; break;
+ case ClassDef::Union: result+="unije "; break;
+ case ClassDef::Interface: result+="interfejsa "; break;
+ case ClassDef::Protocol: result+="protokola "; break;
+ case ClassDef::Category: result+="kategorije "; break;
+ case ClassDef::Exception: result+="izuzetka "; break;
+ }
+ if (isTemplate) result += "šablona ";
+ result += clName;
+ return decode( result );
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result = "Opis datoteke ";
+ result += fileName;
+ return decode( result );
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result="Opis prostora imena ";
+ result += namespaceName;
+ return decode( result );
+ }
+
+ virtual QCString trPublicMembers()
+ { return decode("Javni članovi"); }
+ virtual QCString trPublicSlots()
+ { return decode( "Javni slotovi" ); }
+ virtual QCString trSignals()
+ { return decode( "Signali" ); }
+ virtual QCString trStaticPublicMembers()
+ { return decode("Zajednički javni članovi"); }
+ virtual QCString trProtectedMembers()
+ { return decode("Zaštićeni članovi"); }
+ virtual QCString trProtectedSlots()
+ { return decode("Zaštićeni slotovi"); }
+ virtual QCString trStaticProtectedMembers()
+ { return decode("Zajednički zaštićeni članovi"); }
+ virtual QCString trPrivateMembers()
+ { return decode("Privatni članovi"); }
+ virtual QCString trPrivateSlots()
+ { return decode("Privatni slotovi"); }
+ virtual QCString trStaticPrivateMembers()
+ { return decode("Zajednički privatni članovi"); }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" i ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return decode("Spisak osnovnih klasa: "+trWriteList(numEntries)+".");
+ }
+
+ /*! used in class documentation to produce a list of derived classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return decode( "Spisak izvedenih klasa: "+trWriteList(numEntries)+"." );
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return decode("Menja definiciju iz "+trWriteList(numEntries)+"." );
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ { //! Ako već ne možemo jednu reč (redefinicija), da uskladimo sa prethodnim i izbacimo upotrebu roda
+ return decode("Definicija je izmenjena u "+trWriteList(numEntries)+"." );
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return decode("Članovi prostora imena"); }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Spisak svih ";
+ if (!extractAll) result+="dokumentovanih ";
+ result+="članova prostora imena sa vezama prema ";
+ if (extractAll)
+ result+="dokumentaciji svakog člana prostora imena: ";
+ else
+ result+="prostorima imena kojima pripadaju: ";
+ return decode( result );
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return decode( "Indeks prostora imena" ); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return decode( "Dokumentacija prostora imena" ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return decode( "Prostori imena" ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentacija ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="ove klase"; break;
+ case ClassDef::Struct: result+="ove strukture"; break;
+ case ClassDef::Union: result+="ove unije"; break;
+ case ClassDef::Interface: result+="ovog interfejsa"; break;
+ case ClassDef::Protocol: result+="ovog protokola"; break;
+ case ClassDef::Category: result+="ove kategorije"; break;
+ case ClassDef::Exception: result+="ovog izuzetka"; break;
+ }
+ result+=" je napravljena na osnovu ";
+ if (single) result+="datoteke "; else result+="sledećih datoteka:";
+ return decode( result );
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return decode( "Abecedni spisak" ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return decode( "Karakteristične vrednosti funkcije" ); }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return decode( "Glavna strana" ); }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return decode( "str." ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ { //! Izbacujemo rod
+ return decode( "Definicija je u redu @0 datoteke @1." );
+ }
+ virtual QCString trDefinedInSourceFile()
+ { //! Izbacujemo rod
+ return decode( "Definicija je u datoteci @0." );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return decode( "Zastarelo" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return decode( (QCString)"Klasni dijagram za "+clName+":" );
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return decode( (QCString)"Graf zavisnosti datoteka za "+fName+":" );
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return decode( "Dokumentacija konstruktora i destruktora" );
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return decode( "Izvorni kod." );
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return decode( "Dokumentacija." );
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return decode( "Preduslovi" );
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return decode( "Stanje po izvršenju" );
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return decode( "Invarijanta" );
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return decode( "Početna vrednost:" );
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return decode( "programski kod" );
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return decode( "Hijerarhija klasa u obliku grafa" );
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return decode( "Prikaz hijerarhije klasa u obliku grafa" );
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return decode( "Prikaz hijerarhije klasa u obliku nazubljenog teksta" );
+ }
+ virtual QCString trPageIndex()
+ {
+ return decode( "Indeks stranice" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return decode( "Beleška" );
+ }
+ virtual QCString trPublicTypes()
+ {
+ return decode( "Javni tipovi" );
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Polja" );
+ }
+ else
+ {
+ return decode( "Javni članovi" );
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return decode( "Zajednički javni članovi");
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return decode( "Zaštićeni tipovi" );
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return decode( "Zaštićeni članovi" );
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return decode( "Zajednički zaštićeni članovi" );
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return decode( "Privatni tipovi" );
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return decode( "Privatni članovi" );
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return decode( "Zajednički privatni članovi" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return decode( "Uraditi" );
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return decode("Spisak stvari koje treba uraditi");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ { //! Izbegavanje roda. Uskladjivanje sa trReferences
+ return decode( "Korisnici: " );
+ }
+ virtual QCString trRemarks()
+ {
+ return decode( "Napomene" );
+ }
+ virtual QCString trAttention()
+ {
+ return decode( "Pažnja" );
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return decode("Ovaj graf pokazuje koje datoteke direktno "
+ "ili indirektno uključuju ovu datoteku: ");
+ }
+ virtual QCString trSince()
+ {
+ return decode( "Od" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return decode( "Objašnjenje korišćenih simbola" );
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return decode(
+ "Ova stranica objašnjava kako tumačiti grafikone koje je napravio "
+ "doxygen.<p>\n"
+ "Na primer:\n"
+ "\\code\n"
+ "/*! Klasa nevidljiva zbog trenutnih ograničenja */\n"
+ "class Invisible { };\n\n"
+ "/*! Klasa kojoj se ne vidi način izvođenja */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Klasa bez doxygen komentara */\n"
+ "class Undocumented { };\n\n"
+ "/*! Klasa izvedena iz osnovne klase javnim izvođenjem */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Šablonska klasa */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Klasa izvedena iz osnovne klase zaštićenim izvođenjem */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Klasa izvedena iz osnovne klase privatnim izvođenjem */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Klasa korišćena u nekoj/nekim od drugih klasa */\n"
+ "class Used { };\n\n"
+ "/*! Klasa izvedena iz više osnovnih klasa */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Ako je \\c MAX_DOT_GRAPH_HEIGHT tag u konfiguracionoj datoteci "
+ "postavljen na \\c 200 graf izvođenja će izgledati ovako:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "Graf će biti odsečen ako ne stane unutar zadatih granica.\n"
+ "<p>\n"
+ "Pravougaonici imaju sledeća značenja:\n"
+ "<ul>\n"
+ "<li>Puni sivi predstavlja strukturu ili klasu za koju je graf napravljen.\n"
+ "<li>Sa crnom ivicom predstavlja dokumentovanu strukturu ili klasu.\n"
+ "<li>Sa sivom ivicom predstavlja strukturu ili klasu bez doxygen komentara.\n"
+ "<li>Sa crvenom ivicom predstavlja dokumentovanu strukturu ili klasu\n"
+ "za koju nisu prikazani svi relevantni grafovi.\n"
+ "</ul>"
+ "Strelice imaju sledeća značenja:\n"
+ "<ul>\n"
+ "<li>Tamnoplava strelica označava javno izvođenje.\n"
+ "<li>Tamnozelena strelica označava zaštićeno izvođenje.\n"
+ "<li>Tamnocrvena strelica označava privatno izvođenje.\n"
+ "<li>Ljubičasta isprekidana strelica označava da je klasa sadržana "
+ "ili korišćena u drugoj klasi. Strelica je označena imenom atributa "
+ "preko koga se pristupa klasi/strukturi na koju pokazuje.\n"
+ "<li>Žuta isprekidana strelica označava vezu između primerka šablona i"
+ " šablona klase od kojeg je primerak napravljen. "
+ "Strelica je označena stvarnim argumentima šablona.\n"
+ "</ul>\n"
+ );
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return decode( "Objašnjenje korišćenih simbola" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return decode( "Test" );
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return decode( "Spisak testova" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return decode( "DCOP metode" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return decode( "Osobine" );
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return decode( "Dokumentacija osobina" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "Strukture i unije" );
+ }
+ else
+ {
+ return decode( "Klase" );
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paket "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return decode( "Spisak paketa" );
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return decode( "Paketi s kratkim opisom (ukoliko postoji):" );
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return decode( "Paketi" );
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return decode( "Vrednost:" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return decode( "Greška" );
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return decode( "Spisak grešaka" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "238";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return decode( "Sadržaj" );
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result( (first_capital ? "Klas" : "klas") );
+ result+= (singular ? "a" : "e");
+ return decode( result );
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Datotek" : "datotek"));
+ result+= (singular ? "a" : "e");
+ return decode( result );
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Prostor" : "prostor"));
+ result += (singular ? "" : "i");
+ result += " imena";
+ return decode( result );
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grup" : "grup"));
+ result+= (singular ? "a" : "e");
+ return decode( result );
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Stran" : "stran"));
+ result+= (singular ? "a" : "e");
+ return decode( result );
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Član" : "član"));
+ result+= (singular ? "" : "ovi");
+ return decode( result );
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Globalni " : "globalni "));
+ result+= (singular ? "podatak" : "podaci");
+ return decode( result );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autor" : "autor"));
+ result+= (singular ? "" : "i");
+ return decode( result );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return decode( "Koristi" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ { //! "Definiše" je previše kratko, ispada sa de definišu same apstraktne klase
+ return decode( "Definiše apstraktnu funkciju deklarisanu u "+trWriteList(numEntries)+"." );
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ { //! Izbegavanje roda
+ return decode( "Definicija u " + trWriteList(numEntries) + "." );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return decode( "Sadržaj" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return decode( "Spisak zastarelih stvari" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return decode( "Događaji" );
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return decode( "Dokumentacija događaja" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return decode( "Tipovi u paketu" );
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return decode( "Funkcije u paketu" );
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return decode( "Statičke funkcije u paketu" ); // Zajednicke funkcije u paketu
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return decode( "Atributi u paketu" ); // Clanovi u paketu
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return decode( "Statički atributi u paketu" ); // Zajednicki clanovi u paketu
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return decode( "Sve" );
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return decode( "Graf poziva iz ove funkcije:" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return decode("Traži");
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return decode( "Rezultati pretraživanja" );
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return decode("Nema dokumenata koji odgovaraju Vašem upitu.");
+ }
+ else if (numDocuments==1)
+ { return decode("Nađen je <b>1</b> dokument koji odgovara vašem upitu."); }
+ else if (numDocuments<5)
+ { return decode("Nađena su <b>$num</b> dokumenta koji odgovaraju vašem upitu."
+ "Najbolji su prikazani prvi."); }
+ else
+ { return decode("Nađeno je <b>$num</b> dokumenata koji odgovaraju vašem upitu."
+ "Najbolji su prikazani prvi.");
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return decode( "Pronađeno:" );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return decode( "Izvorni kod datoteke " + filename ) ;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return decode( "Hijerarhija direktorijuma" ); }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return decode( "Dokumentacija direktorijuma" ); }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return decode( "Direktorijumi" ); }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return decode( "Hijerarhija direktorijuma uređena približno "
+ "po abecedi:" );
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+="Opis direktorijuma"; return decode( result ); }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Direktorijum" : "direktorijum"));
+ if (!singular) result+="i";
+ return decode( result );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return decode ( "Ovo je funkcija prekopljenog imena, razlikuje se "
+ "od gore navedene samo po argumentima koje prihvata." );
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ { //! Možda je bolje "Graf pozivalaca ove funkcije"
+ return decode( "Graf funkcija koje pozivaju ovu funkciju:" );
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return decode( "Dokumentacija enum vrednosti" ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Dokumentacija funkcija i procedura"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ /*! @todo Koji je prevod za Compound u Fortran kontekstu */
+ virtual QCString trCompoundListFortran()
+ { return "Složeni tipovi podataka"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Polja u složenim tipovima podataka"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Spisak složenih tipova podataka sa kratkim opisima:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result=" Spisak svih ";
+ if (!extractAll)
+ {
+ result+="dokumentovanih ";
+ }
+ result+="polja složenih tipova podataka";
+ result+=" sa vezama ka ";
+ if (!extractAll)
+ {
+ result+="dokumentaciji strukture podataka za svakog člana";
+ }
+ else
+ {
+ result+="složenim tipovima podataka kojima pripadaju:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Sadržaj složenog tipa podataka"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Dokumentacija tipova podataka"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funkcije i procedure"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Dokumentacija funkcija i procedura"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Složeni tipovi podataka"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Spisak modula"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Spisak svih ";
+ if (!extractAll) result+="dokumentovanih ";
+ result+="modula sa kratkim opisima:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Modul"; break;
+ case ClassDef::Struct: result+=" Tip"; break;
+ case ClassDef::Union: result+=" Unija"; break;
+ case ClassDef::Interface: result+=" Interfejs"; break;
+ case ClassDef::Protocol: result+=" Protokol"; break;
+ case ClassDef::Category: result+=" Kategorija"; break;
+ case ClassDef::Exception: result+=" Izuzetak"; break;
+ }
+ result+=" - sažet pregled";
+ if (isTemplate) result+=" šablona";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" - sažet pregled modula";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Članovi modula"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Spisak svih ";
+ if (!extractAll) result+="dokumentovanih ";
+ result+="članova modula sa vezama ka ";
+ if (extractAll)
+ {
+ result+="dokumentaciji za svakog člana modula:";
+ }
+ else
+ {
+ result+="modulima kojima pripadaju:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Spisak modula"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modul" : "modul"));
+ if (!singular) result+="i";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentacija za ovaj ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="modul"; break;
+ case ClassDef::Struct: result+="tip"; break;
+ case ClassDef::Union: result+="uniju"; break;
+ case ClassDef::Interface: result+="interfejs"; break;
+ case ClassDef::Protocol: result+="protokol"; break;
+ case ClassDef::Category: result+="kategoriju"; break;
+ case ClassDef::Exception: result+="izuzetak"; break;
+ }
+ result+=" napravljena je automatski od sledeć";
+ if (single) result+="e datoteke:"; else result+="ih datoteka:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tip" : "tip"));
+ if (!singular) result+="ovi";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Procedura" : "procedura"));
+ if (!singular) result = (first_capital ? "Procedure" : "procedure");
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Ograničenja tipova";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// following methods have no corresponding entry in translator_en.h
+//////////////////////////////////////////////////////////////////////////
+
+// /*! This is put above each page as a link to the list of all verbatim headers */
+// virtual QCString trHeaderFiles()
+// { return decode( "Zaglavlja" ); }
+//
+// /*! This is an introduction to the page with the list of all header files. */
+// virtual QCString trHeaderFilesDescription()
+// { return decode( "Zaglavlja koje izgraduju API:" ); }
+//
+// /*! This sentences is used in the annotated class/file lists if no brief
+// * description is given.
+// */
+// virtual QCString trNoDescriptionAvailable()
+// { return decode( "Opis nije dostupan" ); }
+//
+// /*! this text is generated when the \\reimp command is used. */
+// virtual QCString trReimplementedForInternalReasons()
+// { return decode("Preuradeno zbog unutrasnjih razloga; Nema uticaja na API." ); }
+//
+// /*! this text is generated when the \\bug command is used. */
+// virtual QCString trBugsAndLimitations()
+// { return decode( "Greske i ogranicenja" ); }
+//
+// virtual QCString trSources()
+// {
+// return decode("Izvorne datoteke" );
+// }
+//
+// /*! Used for Java interfaces in the summary section of Java packages */
+// virtual QCString trInterfaces()
+// {
+// return decode( "Interfejsi" ); //!< Radna okruzenja. Ali to je dve reci.
+// }
+//
+// /*! Used as a chapter title for Latex & RTF output */
+// virtual QCString trPackageDocumentation()
+// {
+// return decode( "Dokumentacija paketa" );
+// }
+//
+// /*! This is used for translation of the word that will possibly
+// * be followed by a single name or by a list of names
+// * of the category.
+// */
+// virtual QCString trField(bool first_capital, bool singular)
+// {
+// QCString result((first_capital ? "Polj" : "polj"));
+// result+= (singular ? "e" : "a");
+// return decode( result );
+// }
+
+};
+
+#endif
diff --git a/src/translator_sv.h b/src/translator_sv.h
new file mode 100644
index 0000000..b95e05a
--- /dev/null
+++ b/src/translator_sv.h
@@ -0,0 +1,1662 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/*
+==================================================================================
+Svensk versttning av:
+Samuel Hgglund <sahag96@ite.mh.se>
+Xet Erixon <xet@xeqt.com>
+Mikael Hallin <mikaelhallin@yahoo.se> 2003-07-28
+==================================================================================
+Uppdateringar.
+1999/04/29
+* Omskrivningar av en hel del ordval, t.ex.
+ ENG INNAN EFTER
+ compound inhngnad sammansatt
+ structs structs strukter
+ unions unions unioner
+
+ osv...
+
+* Alla versttnings-strngar returnerar i alla fall en ngot s nr vettig
+ frklaring...
+
+1999/05/27
+* Det verkade som vi glmt en del mellanslag i vissa strngar vilket resulterade
+ i att en del ord blev ihopskrivna.
+
+* Bytt en del ordval igen...
+ ENG INNAN EFTER
+ reference manual Uppslagsbok referensmanual
+
+* Skrivit ihop en del ord som innan hade bindestreck
+* En del nya versttningar r tillagda.
+* Gamla versttningar borttagna
+
+===================================================================================
+Problem!
+ Slot: nn hygglig svensk versttning???
+
+ Skicka grna synpunkter.
+===================================================================================
+1999/09/01
+* Det verkar som om "namnrymd" r en hyggligt vedertagen svensk versttning
+ av "namespace", s jag kr med det frn och med nu.
+* "interface" heter numera "grnssnitt"
+
+2003/07/28
+* Jag har updaterat versttningen efter ett par rs trda..
+Problem!
+ Deprecated: nn hygglig svensk versttning???
+
+ Skicka grna synpunkter.
+*/
+
+#ifndef TRANSLATOR_SE_H
+#define TRANSLATOR_SE_H
+
+class TranslatorSwedish : public TranslatorAdapter_1_6_0
+{
+ public:
+
+ virtual QCString idLanguage()
+ { return "swedish"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[swedish]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-1";
+ }
+
+ virtual QCString trRelatedFunctions()
+ { return "Beslktade funktioner"; }
+
+ virtual QCString trRelatedSubscript()
+ { return "(Observera att dessa inte r medlemsfunktioner)"; }
+
+ virtual QCString trDetailedDescription()
+ { return "Detaljerad beskrivning"; }
+
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Dokumentation av typdefinierade medlemmar"; }
+
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Dokumentation av egenupprknande medlemmar"; }
+
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Dokumentation av medlemsfunktioner"; }
+
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Flt dokumentation";
+ }
+ else
+ {
+ return "Dokumentation av datamedlemmar";
+ }
+ }
+
+ virtual QCString trMore()
+ { return "Mer..."; }
+
+ virtual QCString trListOfAllMembers()
+ { return "Lista ver alla medlemmar."; }
+
+ virtual QCString trMemberList()
+ { return "Medlemslista"; }
+
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Det hr r en fullstndig lista ver medlemmar fr "; }
+
+ virtual QCString trIncludingInheritedMembers()
+ { return " med alla rvda medlemmar."; }
+
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Automatiskt skapad av Doxygen";
+ if (s) result+=(QCString)" fr "+s;
+ result+=" frn kllkoden.";
+ return result;
+ }
+
+ virtual QCString trEnumName()
+ { return "enum namn"; }
+
+ virtual QCString trEnumValue()
+ { return "enum vrde"; }
+
+ virtual QCString trDefinedIn()
+ { return "definierad i"; }
+
+/*
+ QCString trVerbatimText(const char *f)
+ { return (QCString)"Detta r den ordagranna texten frn inkluderingsfilen "+f; }
+*/
+ virtual QCString trModules()
+ { return "Moduler"; }
+
+ virtual QCString trClassHierarchy()
+ { return "Klasshierarki"; }
+
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datastrukturer";
+ }
+ else
+ {
+ return "Sammansatt klasslista";
+ }
+ }
+
+ virtual QCString trFileList()
+ { return "Fillista"; }
+
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data flt";
+ }
+ else
+ {
+ return "Sammansatta klassmedlemmar";
+ }
+ }
+
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globala symboler";
+ }
+ else
+ {
+ return "Filmedlemmar";
+ }
+ }
+
+ virtual QCString trRelatedPages()
+ { return "Beslktade sidor"; }
+
+ virtual QCString trExamples()
+ { return "Exempel"; }
+
+ virtual QCString trSearch()
+ { return "Sk"; }
+
+ virtual QCString trClassHierarchyDescription()
+ { return "Denna lista ver arv r grovt, men inte helt, "
+ "sorterad i alfabetisk ordning:";
+ }
+
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Hr fljer en lista ver alla ";
+ if (!extractAll) result+="dokumenterade ";
+ result+="filer, med en kort beskrivning:";
+ return result;
+ }
+
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Hr fljer datastrukturerna med korta beskrivningar:";
+ }
+ else
+ {
+ return "Hr fljer klasserna, strukterna, unionerna och "
+ "grnssnitten med korta beskrivningar:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Hr r en lista ver alla ";
+ if (!extractAll)
+ {
+ result+="dokumenterade ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktur- och unions-flt";
+ }
+ else
+ {
+ result+="klassmedlemmar";
+ }
+ result+=" med lnkar till ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktur/unions-dokumentationen fr varje flt:";
+ }
+ else
+ {
+ result+="klassdokumentationen fr varje medlem:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+=" strukturerna/unionerna de tillhr:";
+ }
+ else
+ {
+ result+="klasserna de tillhr:";
+ }
+ }
+ return result;
+ }
+
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Hr fljer en lista ver alla ";
+ if (!extractAll) result+="dokumenterade ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funktioner, variabler, definitioner, enumerationer "
+ "och typdefinitioner";
+ }
+ else
+ {
+ result+= "filmedlemmar";
+ }
+ result+= " med lnkar till ";
+ if (extractAll)
+ result+= "filerna som de tillhr:";
+ else
+ result+= "dokumentationen:";
+ return result;
+ }
+
+ virtual QCString trExamplesDescription()
+ { return "Hr fljer en lista med alla exempel:"; }
+
+ virtual QCString trRelatedPagesDescription()
+ { return "Hr fljer en lista ver alla beslktade dokumentationssidor:";}
+
+ virtual QCString trModulesDescription()
+ { return "Hr fljer en lista ver alla moduler:"; }
+
+ virtual QCString trDocumentation()
+ { return "Dokumentation"; }
+
+ virtual QCString trModuleIndex()
+ { return "Modulindex"; }
+
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarkiskt Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
+ return "Index ver datastrukturer";
+ } else {
+ return "Index ver sammensatta typer";
+ }
+ }
+
+ virtual QCString trFileIndex()
+ { return "Filindex"; }
+
+ virtual QCString trModuleDocumentation()
+ { return "Dokumentation ver moduler"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dokumentation ver datastrukturer";
+ }
+ else
+ {
+ return "Documentation ver klasser";
+ }
+ }
+
+ virtual QCString trFileDocumentation()
+ { return "Dokumentation ver filer"; }
+
+ virtual QCString trExampleDocumentation()
+ { return "Dokumentation ver exempel"; }
+
+ virtual QCString trPageDocumentation()
+ { return "Dokumentation av sidor"; }
+
+ virtual QCString trReferenceManual()
+ { return "Referensmanual"; }
+
+ virtual QCString trDefines()
+ { return "Definitioner"; }
+ virtual QCString trFuncProtos()
+ { return "Funktionsprototyper"; }
+ virtual QCString trTypedefs()
+ { return "Typdefinitioner"; }
+ virtual QCString trEnumerations()
+ { return "Egenupprknande typer"; }
+ virtual QCString trFunctions()
+ { return "Funktioner"; }
+ virtual QCString trVariables()
+ { return "Variabler"; }
+
+ virtual QCString trEnumerationValues()
+ { return "Egenupprknade typers vrden"; }
+
+ virtual QCString trDefineDocumentation()
+ { return "Dokumentation ver definitioner"; }
+
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Dokumentation ver funktionsprototyper"; }
+
+ virtual QCString trTypedefDocumentation()
+ { return "Dokumentation ver typdefinitioner"; }
+
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Dokumentation ver egenupprknande typer"; }
+
+ virtual QCString trFunctionDocumentation()
+ { return "Dokumentation ver funktioner"; }
+
+ virtual QCString trVariableDocumentation()
+ { return "Dokumentation ver variabler"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datastrukturer";
+ }
+ else
+ {
+ return "Sammansttning";
+ }
+ }
+
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Skapad "+date;
+ if (projName) result+=(QCString)" fr "+projName;
+ result+=(QCString)" av";
+ return result;
+ }
+
+ virtual QCString trWrittenBy()
+ {
+ return "skriven av";
+ }
+
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Klassdiagram fr "+clName;
+ }
+
+ virtual QCString trForInternalUseOnly()
+ { return "Endast fr internt bruk."; }
+
+ virtual QCString trWarning()
+ { return "Varning"; }
+
+ virtual QCString trVersion()
+ { return "Version"; }
+
+ virtual QCString trDate()
+ { return "Datum"; }
+
+ virtual QCString trReturns()
+ { return "Returnerar"; }
+
+ virtual QCString trSeeAlso()
+ { return "Se ven"; }
+
+ virtual QCString trParameters()
+ { return "Parametrar"; }
+
+ virtual QCString trExceptions()
+ { return "Undantag"; }
+
+ virtual QCString trGeneratedBy()
+ { return "Skapad av"; }
+
+// new since 0.49-990307
+
+ virtual QCString trNamespaceList()
+ { return "Namnrymdslista"; }
+
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Hr r en lista ver alla ";
+ if (!extractAll) result+="dokumenterade ";
+ result+="namnrymder med en kort beskrivning:";
+ return result;
+ }
+
+ virtual QCString trFriends()
+ { return "Vnner"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Vnners och beslktade funktioners dokumentation"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName+" ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" klass"; break;
+ case ClassDef::Struct: result+=" strukt"; break;
+ case ClassDef::Union: result+=" union"; break;
+ case ClassDef::Interface: result+=" grnssnitt"; break;
+ case ClassDef::Protocol: result+=" protocol"; break; // translate me!
+ case ClassDef::Category: result+=" category"; break; // translate me!
+ case ClassDef::Exception: result+=" undantag"; break;
+ }
+ if (isTemplate) result+="template";
+ result+="referens";
+ return result;
+ }
+
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" filreferens";
+ return result;
+ }
+
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" namnrymdreferens";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Publika medlemmar"; }
+ virtual QCString trPublicSlots()
+ { return "Publika slots"; }
+ virtual QCString trSignals()
+ { return "Signaler"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statiska publika medlemmar"; }
+ virtual QCString trProtectedMembers()
+ { return "Skyddade medlemmar"; }
+ virtual QCString trProtectedSlots()
+ { return "Skyddade slots"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statiska skyddade medlemmar"; }
+ virtual QCString trPrivateMembers()
+ { return "Privata medlemmar"; }
+ virtual QCString trPrivateSlots()
+ { return "Privata slots"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statiska privata medlemmar"; }
+ // end of member sections
+
+ virtual QCString trWriteList(int numEntries)
+ {
+ // this function is used to produce a comma-separated list of items.
+ // use generateMarker(i) to indicate where item i should be put.
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", och ";
+ }
+ }
+ return result;
+ }
+
+ virtual QCString trInheritsList(int numEntries)
+ // used in class documentation to produce a list of base classes,
+ // if class diagrams are disabled.
+ {
+ return "rver "+trWriteList(numEntries)+".";
+ }
+ virtual QCString trInheritedByList(int numEntries)
+ // used in class documentation to produce a list of super classes,
+ // if class diagrams are disabled.
+ {
+ return "rvd av "+trWriteList(numEntries)+".";
+ }
+ virtual QCString trReimplementedFromList(int numEntries)
+ // used in member documentation blocks to produce a list of
+ // members that are hidden by this one.
+ {
+ return "terskapad frn "+trWriteList(numEntries)+".";
+ }
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ // used in member documentation blocks to produce a list of
+ // all member that overwrite the implementation of this member.
+ return "terskapad i "+trWriteList(numEntries)+".";
+ }
+
+ virtual QCString trNamespaceMembers()
+ { return "Namnrymdsmedlemmar"; }
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Hr r en lista ver alla ";
+ if (!extractAll) result+="dokumenterade ";
+ result+="namnrymdsmedlemmar med lnkar till ";
+ if (extractAll)
+ result+=" namnrymd-dokumentationen fr varje medlem:";
+ else
+ result+="de namnrymder de tillhr:";
+ return result;
+ }
+
+ virtual QCString trNamespaceIndex()
+ { return "Namnrymdsindex"; }
+
+ virtual QCString trNamespaceDocumentation()
+ { return "Namnrymd-dokumentation"; }
+ //////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namnrymder"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentationen fr ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="denna klass "; break;
+ case ClassDef::Struct: result+="denna strukt "; break;
+ case ClassDef::Union: result+="denna union "; break;
+ case ClassDef::Interface: result+="detta grnssnitt "; break;
+ case ClassDef::Protocol: result+="protocol"; break; // translate me!
+ case ClassDef::Category: result+="category"; break; // translate me!
+ case ClassDef::Exception: result+="detta undantag "; break;
+ }
+ result+="var genererad frn fljande fil";
+ if (single) result+=":"; else result+="er:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ {
+ return "Alfabetisk lista";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Returvrden"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Huvudsida"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "s."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definition p rad @0 i filen @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definition i filen @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Frldrad";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Samarbetsdiagram fr "+clName+":";
+ }
+
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Include-beroendediagram fr "+fName+":";
+ }
+
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Dokumentation av konstruktorer och destruktorer";
+ }
+
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "G till denna fils kllkod.";
+ }
+
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "G till denna fils dokumentation.";
+ }
+
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Frhandsvillkor";
+ }
+
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Resultat"; //"Postcondition";
+ }
+
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Begynnelsevrde:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "kllkod";
+ }
+
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafisk klasshierarki";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "G till den grafiska klasshierarkin";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "G till den textbaserade klasshierarkin";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Sidindex";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Notera";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Publika typer";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Dataflt";
+ }
+ else
+ {
+ return "Publika attribut";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statiska publika attribut";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Skyddade typer";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Skyddade attribut";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statiska skyddade attribut";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Privata typer";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Privata attribut";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statiska privata attribut";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Att-gra";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Att-gra lista";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Refererad av";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Lgg mrke till";
+ }
+ virtual QCString trAttention()
+ {
+ return "Observera";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Den hr grafen visar vilka filer som direkt eller "
+ "indirekt inkluderar denna filen.";
+ }
+ virtual QCString trSince()
+ {
+ return "Sedan";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Graffrklaring";
+ }
+
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Den hr sidan frklarar hur man ska tolka de grafer som doxygen "
+ "genererar.<p>\n"
+ "Tag fljande exempel:\n"
+ "\\code\n"
+ "/*! Osynlig klass p grund av stympning */\n"
+ "class Invisible { };\n\n"
+ "/*! Stympad klass, rvningsrelationen r dold */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Klass utan doxygen-kommentarer */\n"
+ "class Undocumented { };\n\n"
+ "/*! Klass som rvs med publikt arv */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! En template-klass */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Klass som rvs med skyddat arv */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Klass som rvs med privat arv */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Klass som anvnds av Inherited klassen */\n"
+ "class Used { };\n\n"
+ "/*! Super klassen som rver ett antal andra klasser */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Om \\c MAX_DOT_GRAPH_HEIGHT r satt till 240 i konfigurationsfilen, "
+ "kommer fljande graf att generas:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Rektanglarna i den ovanstende grafen har fljande betydelser:\n"
+ "<ul>\n"
+ "<li>%En fylld svart rektangel representerar den strukt eller klass "
+ "som har genererat grafen.\n"
+ "<li>%En rektangel med svart kant symboliserar en dokumenterad "
+ "strukt eller klass.\n"
+ "<li>%En rektangel med gr kant symboliserar en odokumenterad strukt "
+ "eller klass.\n"
+ "<li>%En klass med rd kant symboliserar en strukt eller klass dr "
+ "alla dess relationer inte visas. %En graf stympas om den inte fr "
+ "plats inom de givna grnserna.\n"
+ "</ul>\n"
+ "Pilarna har fljande betydelser:\n"
+ "<ul>\n"
+ "<li>%En mrkbl pil anvnds fr att visualisera en publik arvrelation "
+ "mellan tv klasser.\n"
+ "<li>%En mrkgrn pil anvnds fr en skyddad arvsrelation.\n"
+ "<li>%En mrkrd pil anvnds fr en privat arvsrelation.\n"
+ "<li>%En strckad lila pil anvnds om en klass r innesluten eller "
+ "anvnd av en annan klass. Vid pilen str namnet p den eller de "
+ "variabler som klassen pilen pekar p kommer t.\n"
+ "<li>%En strckad gul pil symboliserar frhllandet mellan en "
+ "template-instans och template-klassen, som den instantierades frn.\n"
+ "Vid pilen str instansens template-parametrar.\n"
+ "</ul>\n";
+ }
+
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "frklaring";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Testlista";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP metoder";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Egenskaper";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Egenskapsdokumentation";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datastrukturer";
+ }
+ else
+ {
+ return "Klasser";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paket "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Paketlista";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Hr r en lista ver paketen med en kort beskrivning "
+ "(om sdan finns):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Paket";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Vrde:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Bugg";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Bugglista";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ * (used table extract:)
+ * <pre>
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * ANSI_CHARSET 0 (x00) 1252
+ * </pre>
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Index";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Klass" : "klass"));
+ if (!singular) result+="er";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Fil" : "fil"));
+ if (!singular) result+="er";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namnrymd" : "namnrynd"));
+ if (!singular) result+="er";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grupp" : "grupp"));
+ if (!singular) result+="er";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Sid" : "sid"));
+ if (singular)
+ result+="a";
+ else
+ result+="or";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Medlem" : "medlem"));
+ if (!singular) result+="mar";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="er";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Frfattare" : "frfattare"));
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referenser";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implementerar "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Implementerad i "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Innehllsfrteckning";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Lista ver frldrade";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Hndelser";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Hndelse Dokumentation";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Paket typer";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Paket funktioner";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statiska paket funktioner";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Paket attribut";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statiska paket attribut";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Alla";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Hr r anropnings diagrammet fr den hr funktionen:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Sk efter";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Skresultat";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Tyvrr finns det inga dokument som matchar din skning.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Hittade <b>1</b> dokument som matchar din skning.";
+ }
+ else
+ {
+ return "Hittade <b>$num</b> dokument som matchar din skning. "
+ "Visar de bsta trffarna frst.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Trffar:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return "Kllkodsfilen " + filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Katalogstruktur"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Katalogdokumentation"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Kataloger"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Den hr katalogen r grovt sorterad, "
+ "men inte helt, i alfabetisk ordning:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Katalogreferens"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Katalog" : "katalog"));
+ if (!singular) result+="er";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Det hr r en verlagrad medlemsfunktion "
+ "tillhandahllen fr bekvmlighet. Den enda som "
+ "skiljer sig frn ovanstende funktion r vilka "
+ "argument den tar emot.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Hr r katalog-grafen fr denna funktion:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ {
+ return "Upprknings-dokumentation";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Memlems-function/Subroutins Dokumentation"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Datatyplista"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Data flt"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Hr r datatyperna med en kort beskrivning:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Hr r en lista av alla ";
+ if (!extractAll)
+ {
+ result+="dokumenterade ";
+ }
+ result+="datatyps medlemmar";
+ result+=" med lnkar till ";
+ if (!extractAll)
+ {
+ result+="datastrukturs documentation fr varje medlem";
+ }
+ else
+ {
+ result+="klasserna de hr till:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Datatyps Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Dataryps Dokumentation"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funktions/Subroutins"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Funktion/Subroutin Dokumentation"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Datatyper"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Modullista"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Hr r en lista p alla ";
+ if (!extractAll) result+="dokumenterade ";
+ result+="moduler med en kort beskrivning:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Modul"; break;
+ case ClassDef::Struct: result+=" Typ"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Grnssnitt"; break;
+ case ClassDef::Protocol: result+=" Protokoll"; break;
+ case ClassDef::Category: result+=" Kategori"; break;
+ case ClassDef::Exception: result+=" Undantag"; break;
+ }
+ if (isTemplate) result+=" Mall";
+ result+=" Referens";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Modul Referens";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Modul Medlemmar"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Hr r en lista p alla ";
+ if (!extractAll) result+="documented ";
+ result+="modul medlemmar med lnkar till ";
+ if (extractAll)
+ {
+ result+="modul dokumentationen fr varje medlem:";
+ }
+ else
+ {
+ result+="modulerna de hr till:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Modul Index"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "modul", "er");
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentationen fr denna ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="modul"; break;
+ case ClassDef::Struct: result+="typ"; break;
+ case ClassDef::Union: result+="union"; break;
+ case ClassDef::Interface: result+="grnssnitt"; break;
+ case ClassDef::Protocol: result+="protokoll"; break;
+ case ClassDef::Category: result+="kategori"; break;
+ case ClassDef::Exception: result+="undantag"; break;
+ }
+ result+=" genererades frn fljade fil";
+ if (single) result+=":"; else result+="er:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ return createNoun(first_capital, singular, "typ", "er");
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool /*singular*/)
+ {
+ QCString result((first_capital ? "Subprogram" : "subprogram"));
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Typbegrnsningar";
+ }
+
+/*---------- For internal use: ----------------------------------------*/
+ protected:
+ /*! For easy flexible-noun implementation.
+ * \internal
+ */
+ QCString createNoun(bool first_capital, bool singular,
+ const char* base, const char* plurSuffix)
+ {
+ QCString result(base);
+ if (first_capital) result.at(0) = toupper(result.at(0));
+ if (!singular) result+=plurSuffix;
+ return result;
+ }
+
+
+};
+
+#endif
diff --git a/src/translator_tr.h b/src/translator_tr.h
new file mode 100644
index 0000000..178a44b
--- /dev/null
+++ b/src/translator_tr.h
@@ -0,0 +1,1872 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_TR_H
+#define TRANSLATOR_TR_H
+
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorTurkish : public Translator
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "turkish"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related fonksiyonlar. */
+ virtual QCString trRelatedFunctions()
+ { return "İlgili Fonksiyonlar"; }
+
+ /*! subscript for the related fonksiyonlar. */
+ virtual QCString trRelatedSubscript()
+ { return "(Not: Bu fonksiyonlar üye fonksiyon değildir.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Ayrıntılı tanımlama"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Üye Typedef Dokümantasyonu"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Üye Enümerasyon Dokümantasyonu"; }
+
+ /*! header that is put before the list of member fonksiyonlar. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Üye Fonksiyon Dokümantasyonu"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Alan Dokümantasyonu";
+ }
+ else
+ {
+ return "Üye Veri Dokümantasyonu";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Ayrıntılar..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Tüm üyelerin listesi."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Üye Listesi"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Şu sınıfın tüm üyelerinin listesidir: "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return " (kalıtımla gelen üyeleri de içerir)."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Doxygen tarafından";
+ if (s) result+=s+(QCString)" için ";
+ result+=" kaynak koddan otomatik üretilmiştir.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "enum adı"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "enum değeri"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "tanımlandığı yer"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Modüller"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Sınıf Hiyerarşisi"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Veri Yapıları";
+ }
+ else
+ {
+ return "Sınıf Listesi";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Dosya Listesi"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Veri Alanları";
+ }
+ else
+ {
+ return "Sınıf Üyeleri";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globaller";
+ }
+ else
+ {
+ return "Dosya Üyeleri";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "İlgili Sayfalar"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Örnekler"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Ara"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Bu kalıtım listesi tamamen olmasa da yaklaşık "
+ "olarak alfabetik sıraya konulmuştur:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Bu liste tüm ";
+ if (!extractAll) result+="dokümante edilmiş ";
+ result+="dosyaları kısa açıklamalarıyla göstermektedir:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Kısa tanımlarıyla birlikte veri yapıları:";
+ }
+ else
+ {
+ return "Kısa tanımlarıyla sınıflar, yapılar (struct), "
+ "birleşimler(union) ve arayüzler:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Bu liste tüm ";
+ if (!extractAll)
+ {
+ result+="dokümante edilmiş ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="yapı(struct) ve birleşim(union) yapılarını içerir";
+ }
+ else
+ {
+ result+="sınıf üyelerini içerir";
+ }
+ result+=" ve ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="her alanı yapı(struct)/birleşim(union) dokümantasyonuna bağlar:";
+ }
+ else
+ {
+ result+="her üye için sınıf dokümantasyonuna bağlar:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="ait olduğu yapı(struct)/birleşime(union) bağlar:";
+ }
+ else
+ {
+ result+="ait olduğu sınıfa bağlar:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Bu liste tüm ";
+ if (!extractAll) result+="dokümante edilmiş ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="fonksiyonları, değişkenleri, makroları, enümerasyonları ve typedef\'leri içerir";
+ }
+ else
+ {
+ result+="dosya üyelerini içerir";
+ }
+ result+=" ve ";
+ if (extractAll)
+ result+="ait olduğu dosyalar bağlar:";
+ else
+ result+="dokümantasyona bağlar:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Tüm örneklerin listesi aşağıdadır:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "İlgili tüm dokümantasyon sayfalarının listesi aşağıdadır:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Tüm modüllerin listesi aşağıdadır:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokümantasyonu"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Modül İndeksi"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hiyerarşik İndeksi"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Veri Yapıları İndeksi";
+ }
+ else
+ {
+ return "Sınıf İndeksi";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Dosya İndeksi"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Modül Dokümantasyonu"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Veri Yapıları Dokümantasyonu";
+ }
+ else
+ {
+ return "Sınıf Dokümantasyonu";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Dosya Dokümantasyonu"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Örnek Dokümantasyonu"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Sayfa Dokümantasyonu"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Referans Kitabı"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Makrolar"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Fonksiyon Prototipleri"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Typedef\'ler"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enümerasyonlar"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Fonksiyonlar"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Değişkenler"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Enümeratör"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Makro Dokümantasyonu"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Fonksiyon Prototip Dokümantasyonu"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Typedef Dokümantasyonu"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Enümerasyon Tipi Dokümantasyonu"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Fonksiyon Dokümantasyonu"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Değişken Dokümantasyonu"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Veri Yapıları";
+ }
+ else
+ {
+ return "Sınıflar";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=projName+(QCString)" için "+date;
+ if (projName) result+=(QCString)" tarihinde ";
+ result+=(QCString)" üreten: ";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "yazan";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return clName+(QCString)" için kalıtım şeması:";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "İç kullanıma ayrılmıştır."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Uyarı"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Sürüm"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Tarih"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Döndürdüğü değer"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Ayrıca Bakınız"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametreler"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "İstisnalar"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Oluşturan"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Namespace Listesi"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Tüm ";
+ if (!extractAll) result+="dokümante edilmiş ";
+ result+="namespace\'lerin kısa tanımlarıyla listesi aşağıdadır:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Arkadaşları"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Arkadaş Ve İlgili Fonksiyon Dokümantasyonu"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Sınıf"; break;
+ case ClassDef::Struct: result+=" Yapı(Struct)"; break;
+ case ClassDef::Union: result+=" Birleşim(Union)"; break;
+ case ClassDef::Interface: result+=" Arayüz(Interface)"; break;
+ case ClassDef::Protocol: result+=" Protokol"; break;
+ case ClassDef::Category: result+=" Kategori"; break;
+ case ClassDef::Exception: result+=" İstisna"; break;
+ }
+ if (isTemplate) result+=" Şablon";
+ result+=" Referans";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" Dosya Referansı";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Namespace Referansı";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Public Üye Fonksiyonlar"; }
+ virtual QCString trPublicSlots()
+ { return "Public Slotlar"; }
+ virtual QCString trSignals()
+ { return "Sinyaller"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statik Public Üye Fonksiyonlar"; }
+ virtual QCString trProtectedMembers()
+ { return "Korumalı Üye Fonksiyonlar"; }
+ virtual QCString trProtectedSlots()
+ { return "Korumalı Slotlar"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statik Korumalı Üye Fonksiyonlar"; }
+ virtual QCString trPrivateMembers()
+ { return "Özel Üye Fonksiyonlar"; }
+ virtual QCString trPrivateSlots()
+ { return "Özel Slotlar"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statik Özel Üye Fonksiyonlar"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=" ve ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Şu sınıflardan türemiştir : "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Şu sınıfların atasıdır : "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Şu üyeleri yeniden tanımlar : "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Şu üyeler tarafından yeniden tanımlanmıştır : "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Namespace Üyeleri"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Bu liste tüm ";
+ if (!extractAll) result+="dokümante edilmiş ";
+ result+="namespace üyelerini listeler ve ";
+ if (extractAll)
+ result+="her üye için üye dokümantasyonuna bağlar:";
+ else
+ result+="ait olduğu namespace\'lere bağlar:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Namespace İndeksi"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Namespace Dokümantasyonu"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespace\'ler"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Bu ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="sınıf"; break;
+ case ClassDef::Struct: result+="yapı(struct)"; break;
+ case ClassDef::Union: result+="birleşim(union)"; break;
+ case ClassDef::Interface: result+="arayüz(interface)"; break;
+ case ClassDef::Protocol: result+="protokol"; break;
+ case ClassDef::Category: result+="kategori"; break;
+ case ClassDef::Exception: result+="istisna"; break;
+ }
+ result+=" için dokümantasyon aşağıdaki dosya";
+ if (single) result+=""; else result+="lar";
+ result+="dan üretilmiştir:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Alfabetik Liste"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Döndürdüğü değerler"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Ana Sayfa"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "sf."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "@1 dosyasının @0 numaralı satırında tanımlanmıştır.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "@0 dosyasında tanımlanmıştır.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Kullanımdan kalkmıştır";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return clName+(QCString)" için işbirliği (collaboration) şeması:";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return fName+(QCString)" için içerme bağımlılık grafiği:";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Constructor & Destructor Dokümantasyonu";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Bu dosyanın kaynak koduna git.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Bu dosyanın dokümantasyonuna git.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Ön şart";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Son şart (Postcondition)";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Değişmez(Invariant)";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "İlk değer:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "kod";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafiksel Sınıf Hiyerarşisi";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Grafiksel sınıf hiyerarşisine git";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Metinsel sınıf hiyerarşisine git";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Sayfa İndeksi";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Not";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Public Tipler";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Veri Alanları";
+ }
+ else
+ {
+ return "Public Özellikler(attribute)";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statik Public Özellikler(attribute)";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Korumalı Tipler";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Korumalı Özellikler(attribute)";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statik Korumalı Attributes";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Özel Tipler";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Özel Özellikler(attribute)";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statik Özel Özellikler(attribute)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Yapılacak";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Yapılacaklar Listesi";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Referans veren";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Dipnotlar";
+ }
+ virtual QCString trAttention()
+ {
+ return "Dikkat";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Bu şekil hangi dosyaların doğrudan ya da "
+ "dolaylı olarak bu dosyayı içerdiğini gösterir:";
+ }
+ virtual QCString trSince()
+ {
+ return "Şu zamandan beri";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Şekil Lejantı";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Bu dosya doxygen tarafından üretilen grafiklerin nasıl anlaşılacağını "
+ "açıklar.<p>\n"
+ "Aşağıdaki örneğe bakalım:\n"
+ "\\code\n"
+ "/*! Sadeleşme yüzünden görünmeyen sınıf */\n"
+ "class Invisible { };\n\n"
+ "/*! Sadeleşmiş sınıf, kalıtım ilişkisi gizli */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Doxygen yorumlarıyla dokümante edilmemiş sınıf */\n"
+ "class Undocumented { };\n\n"
+ "/*! Public kalıtımla türetilen sınıf */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! Bir şablon sınıfı */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Korumalı kalıtımla türetilen sınıf */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Özel kalıtımla türetilen sınıf */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Türetilen sınıf tarafından kullanılan sınıf */\n"
+ "class Used { };\n\n"
+ "/*! Pekçok sınıftan türeyen bir sınıf */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Bu kod aşağıdaki şemayı oluşturur:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Yukarıdaki şemadaki kutular aşağıda açıklanmıştır:\n"
+ "<ul>\n"
+ "<li>Dolu gri kutu şemanın ait olduğu yapı(struct) ya da sınıfı "
+ "gösterir.\n"
+ "<li>Siyah çerçeveli bir kutu dokümante edilmiş bir yapı(struct) ya da sınıfı gösterir.\n"
+ "<li>Gri çerçeveli bir kutu dokümante edilmemiş bir yapı(struct) ya da sınıfı gösterir.\n"
+ "<li>Kırmızı çerçeveli bir kutu tüm kalıtım/içerme ilişkileri gösterilmemiş ve dokümante "
+ "edilmiş bir yapı(struct) ya da sınıfı gösterir. %A şema belirlenen sınırlara "
+ "sığmıyorsa sadeleştirilir.\n"
+ "</ul>\n"
+ "Okların anlamı aşağıdaki gibidir:\n"
+ "<ul>\n"
+ "<li>Koyu mavi ok iki sınıf arasındaki public kalıtım ilişkisini "
+ "göstermekte kullanılır.\n"
+ "<li>Koyu yeşil ok korumalı kalıtımı gösterir.\n"
+ "<li>Koyu kırmızı ok özel kalıtımı gösterir.\n"
+ "<li>Mor kesikli çizgi bir sınıfın diğeri tarafından içeriliyor ya da kullanılıyor "
+ "olduğunu gösterir. Ok işaret edilen sınıfın hangi değişken(ler) tarafından erişildiğini "
+ "gösteren etiketle işaretleniştir.\n"
+ "<li>Sarı kesikli çizgi şablondan üretilen bir sınıf ve ilgili şablon sınıfı "
+ "arasındaki ilişkiyi gösterir. Ok türeyen sınıfın şablon parametreleriyle "
+ "etiketlenmiştir.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "lejant";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Test Listesi";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Üye Fonksiyonlar";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Özellikler";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Özellik Dokümantasyonu";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Veri Yapıları";
+ }
+ else
+ {
+ return "Sınıflar";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Paket "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Paket Listesi";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Paketler ve kısa tanımları (var ise):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Paketler";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Değer:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Hata";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Hata Listesi";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1254";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "162";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "İndeks";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Sınıf" : "sınıf"));
+ if (!singular) result+="lar";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Dosya" : "dosya"));
+ if (!singular) result+="lar";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="\'ler";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grup" : "grup"));
+ if (!singular) result+="lar";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Sayfa" : "sayfa"));
+ if (!singular) result+="lar";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Üye" : "üye"));
+ if (!singular) result+="ler";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global değişken" : "global değişken"));
+ if (!singular) result+="ler";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Yazar" : "yazar"));
+ if (!singular) result+="lar";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Referanslar";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Şu üyeleri gerçekler: "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Şu üyelerce gerçeklenir: "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "İçindekiler";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Kullanımdan Kalkanlar Listesl";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Olaylar";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Olay Dokümantasyonu";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Paket Tipleri";
+ }
+ /*! Used as a heading for a list of Java class fonksiyonlar with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Paket Fonksiyonlar";
+ }
+ /*! Used as a heading for a list of static Java class fonksiyonlar with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Static Pakat Fonksiyonları";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Packet Özellikleri(attribute)";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statik Packet Özellikleri(attribute)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Tümü";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Bu fonksiyon için çağırılma şeması:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Arama yapılacak metin";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Arama sonuçları";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Üzgünüm, sorgunuzla eşleşen doküman bulunamadı.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Sorgunuzla eşleşen <b>1</b> doküman bulundu.";
+ }
+ else
+ {
+ return "Sorgunuzla eşleşen <b>$num</b> doküman bulundu. "
+ "Önce en iyi eşleşmeler gösteriliyor.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Eşleşme:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " Kaynak Dosyası";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Dizin Hiyerarşisi"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Dizin Dokümantasyonu"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Dizinler"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Bu dizin hiyerarşisi tamamen olmasa da yaklaşık "
+ "olarak alfabetik sıraya konulmuştur:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Dizin Referansı"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Dizin" : "dizin"));
+ if (!singular) result+="ler";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Bu çok anlamlı (overloaded) bir üye fonksiyondur, "
+ "tamamlık açısından burada verilmektedir. Yukarıdaki fonksiyondan "
+ "sadece aldığı argüman(lar) açısından farklıdır.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Bu fonksiyon için çağırılma şeması:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Enümerasyon Dokümantasyonu"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Üye Fonksiyon/Subroutine Dokümantasyonu"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Veri Tipleri Listesi"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Veri Alanları"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Kısa tanımlarıyla veri tipleri:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Bu liste tüm ";
+ if (!extractAll)
+ {
+ result+="dokümante edilmiş ";
+ }
+ result+="veri tiplerini içerir ve ";
+ if (!extractAll)
+ {
+ result+="her üyeyi veri yapısı dokümantasyonuna bağlar:";
+ }
+ else
+ {
+ result+="ait oldukları veri tiplerine bağlar:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Veri Tipi İndeksi"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Veri Tipi Dokümantasyonu"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Fonksiyonlar/Subroutine\'ler"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Fonksiyon/Subroutine Dokümantasyonu"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Veri Tipleri"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Modüller Listesi"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Bu liste tüm ";
+ if (!extractAll) result+="dokümante edilmiş ";
+ result+="modülleri kısa tanımlarıya içerir:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Modül"; break;
+ case ClassDef::Struct: result+=" Tip"; break;
+ case ClassDef::Union: result+=" Birleşim(Union)"; break;
+ case ClassDef::Interface: result+=" Arayüz"; break;
+ case ClassDef::Protocol: result+=" Protokol"; break;
+ case ClassDef::Category: result+=" Kategori"; break;
+ case ClassDef::Exception: result+=" İstisna"; break;
+ }
+ if (isTemplate) result+=" Şablon";
+ result+=" Referans";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Modül Referansı";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Modül Üyeleri"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Bu liste tüm ";
+ if (!extractAll) result+="dokümante edilmiş ";
+ result+="modül üyelerini içerir ve ";
+ if (extractAll)
+ {
+ result+="her üyeyi modül dokümantasyonuna bağlar:";
+ }
+ else
+ {
+ result+="ait oldukları modüllere bağlar:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Modüller Indeksi"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modül" : "modül"));
+ if (!singular) result+="ler";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Bu ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="mdoül"; break;
+ case ClassDef::Struct: result+="tip"; break;
+ case ClassDef::Union: result+="birleşim(union)"; break;
+ case ClassDef::Interface: result+="arayüz"; break;
+ case ClassDef::Protocol: result+="protokol"; break;
+ case ClassDef::Category: result+="kategori"; break;
+ case ClassDef::Exception: result+="istisna"; break;
+ }
+ result+=" için dokümantasyon aşağıdaki dosya";
+ if (single) result+=":"; else result+="lar";
+ result="dan üretilmiştir:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tip" : "tip"));
+ if (!singular) result+="ler";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Alt program" : "alt program"));
+ if (!singular) result+="lar";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Tip Sınırlamaları";
+ }
+
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.6.0 (mainly for the new search engine)
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" İlişkisi";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Yüklüyor...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "En Üst Seviye";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Arıyor...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Eşleşme Yok";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // new since 1.6.3 (missing items for the directory pages)
+ //////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)(name) + (QCString)" için dizin bağımlılık grafiği";
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)(name) + (QCString)" dizinindeki dosya";
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)(name) + (QCString)" dizinindeki dosyayı kapsıyor";
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Pzt","Sal","Çar","Per","Cma","Cmt","Pzr" };
+ static const char *months[] = { "Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Ekm","Kas","Ara" };
+ QCString sdate;
+ sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+
+};
+
+#endif
diff --git a/src/translator_tw.h b/src/translator_tw.h
new file mode 100644
index 0000000..8f8c973
--- /dev/null
+++ b/src/translator_tw.h
@@ -0,0 +1,1759 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * The translation into Chinesetraditional was provided by
+ * Daniel YC Lin (dlin.tw <at> gmail.com) since v1.2.16-v1.5.5
+ */
+
+#ifndef TRANSLATOR_TW_H
+#define TRANSLATOR_TW_H
+
+// When defining a translator class for the new language, follow
+// the description in the documentation. One of the steps says
+// that you should copy the translator_en.h (this) file to your
+// translator_xx.h new file. Your new language should use the
+// Translator class as the base class. This means that you need to
+// implement exactly the same (pure virtual) methods as the
+// TranslatorEnglish does. Because of this, it is a good idea to
+// start with the copy of TranslatorEnglish and replace the strings
+// one by one.
+//
+// It is not necessary to include "translator.h" or
+// "translator_adapter.h" here. The files are included in the
+// language.cpp correctly. Not including any of the mentioned
+// files frees the maintainer from thinking about whether the
+// first, the second, or both files should be included or not, and
+// why. This holds namely for localized translators because their
+// base class is changed occasionaly to adapter classes when the
+// Translator class changes the interface, or back to the
+// Translator class (by the local maintainer) when the localized
+// translator is made up-to-date again.
+
+class TranslatorChinesetraditional : public TranslatorAdapter_1_6_0
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "chinese-traditional"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "big5";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "禡"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(GoǤO禡)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "ԲӴyz"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Awq"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "C|A"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "禡"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "컡";
+ }
+ else
+ {
+ return "Ʀ";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "h..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "C"; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "C"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "㦨CAO"; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", ]tҦ~Ӫ"; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Doxygen";
+ if (s) result+=(QCString)" "+s;
+ result+=" lX۰ʲ.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "C|AW"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "C|"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "Qwq"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Ҳ"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Oh"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ƶc";
+ }
+ else
+ {
+ return "ƦXC";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "ɮצC"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "";
+ }
+ else
+ {
+ return "ƦX";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "";
+ }
+ else
+ {
+ return "ɮצ";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return ""; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "d"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "jM"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "o~ӦCgL²rƧ: ";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="oOa²";
+ if (!extractAll) result+="BgL";
+ result+="ɮצC:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "oOa²Ƶc:";
+ }
+ else
+ {
+ return "oOa²OAcA"
+ "pXA(unions)Τ(interfaces):";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="oO";
+ if (!extractAll)
+ {
+ result+="ƹL";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="cpXA";
+ }
+ else
+ {
+ result+="O";
+ }
+ result+=", åBas";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="C쪺c/pXA:";
+ }
+ else
+ {
+ result+="CӦO:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="oǵc/pXA:";
+ }
+ else
+ {
+ result+="oO:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="oO";
+ if (!extractAll) result+="ƪ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="禡AܼơAwqAC|AΫAwq";
+ }
+ else
+ {
+ result+="ɮצ";
+ }
+ result+="AåBas";
+ if (extractAll)
+ result+="oɮש:";
+ else
+ result+=":";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "ҦdҦC:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Ҧ󭶭C:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "ҦҲզC:"; }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return ""; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Ҳկ"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "h"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ƶc";
+ }
+ else
+ {
+ return "ƦX";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "ɮׯ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Ҳջ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ƶc";
+ }
+ else
+ {
+ return "O";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "ɮ׻"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "dһ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return ""; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "ѦҤU"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "wq"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "禡쫬"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Awq"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "C|A"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "禡"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "ܼ"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "C|"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "wq"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "禡쫬"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Awq"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "C|A"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "C|Ȼ"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "禡"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "ܼƻ"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ƶc";
+ }
+ else
+ {
+ return "ƦX";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"ͤ:"+date;
+ if (projName) result+=(QCString)", M:"+projName;
+ result+=(QCString)", ;:";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "gH:";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"O"+clName+"~ӹ:";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "ȨѤϥ."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "ĵi"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return ""; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return ""; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Ǧ^"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Ѿ\\"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Ѽ"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "ҥ~"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "ͪ:"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "RWŶ(name space)C"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="oOҦa²";
+ if (!extractAll) result+="ƪ";
+ result+="RWŶ(namespaces):";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "OB(Friends)"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "OBͤά禡"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName+" ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" O"; break;
+ case ClassDef::Struct: result+=" c"; break;
+ case ClassDef::Union: result+=" pX"; break;
+ case ClassDef::Interface: result+=" "; break;
+ case ClassDef::Protocol: result+=" w"; break;
+ case ClassDef::Category: result+=" "; break;
+ case ClassDef::Exception: result+=" ҥ~"; break;
+ }
+ if (isTemplate) result+=" ˪";
+ result+=" ѦҤ";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" ɮװѦҤ";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" RWŶ(Namespace)ѦҤ";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "}k(Public Methods)"; }
+ virtual QCString trPublicSlots()
+ { return "}(Public Slots)"; }
+ virtual QCString trSignals()
+ { return "T(Signals)"; }
+ virtual QCString trStaticPublicMembers()
+ { return "RA}k(Static Public Methods)"; }
+ virtual QCString trProtectedMembers()
+ { return "O@k(Protected Methods)"; }
+ virtual QCString trProtectedSlots()
+ { return "O@(Protected Slots)"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "RAO@k(Static Protected Methods)"; }
+ virtual QCString trPrivateMembers()
+ { return "pk(Private Methods)"; }
+ virtual QCString trPrivateSlots()
+ { return "p(Private Slots)"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "RApk(Static Private Methods)"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "~Ӧ "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Q "+trWriteList(numEntries)+"~.";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "̾"+trWriteList(numEntries)+"s@.";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "b"+trWriteList(numEntries)+"s@.";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "RWŶ(Namespace)"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="BCҦ ";
+ if (!extractAll) result+="ƪ ";
+ result+="RWŶ(namespace)AåBas ";
+ if (extractAll)
+ result+="CӦ:";
+ else
+ result+="өRWŶݤB:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "RWŶ(Namespace)"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "RWŶ(Namespace)"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "RWŶ(Namespaces)"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="O(class)"; break;
+ case ClassDef::Struct: result+="c(structure)"; break;
+ case ClassDef::Union: result+="pX(union)"; break;
+ case ClassDef::Interface: result+="(interface)"; break;
+ case ClassDef::Protocol: result+="w(protocol)"; break;
+ case ClassDef::Category: result+="(category)"; break;
+ case ClassDef::Exception: result+="ҥ~(exception)"; break;
+ }
+ result+=" OѤUCɮפ";
+ if (single) result+=":"; else result+=":";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "rǦC"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Ǧ^"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "D"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "p."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "wqb @1 ɮפ @0 .";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "wqb @0 .";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "L";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)""+clName+"X@:";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)""+fName+"]t̹ۨ:";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "غclPѺcl";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "dݥɮתlX.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "dݥɮ׻.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "em";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "m";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "`";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return ":";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "{X";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "ϧΤƤOh";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "dݹϧΤƤOh";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "dݤrƤOh";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "}A";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "";
+ }
+ else
+ {
+ return "}ݩ";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "RA}ݩ";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "O@A";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "O@ݩ";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "RAO@ݩ";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "pA";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "pݩ";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "RApݩ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "ݿƶ";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "ݿƶC";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "QѦҩ";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Ƶ";
+ }
+ virtual QCString trAttention()
+ {
+ return "`N";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "ܥXɮתζinclude "
+ ":";
+ }
+ virtual QCString trSince()
+ {
+ return "";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "ϥ";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "pĶoǥdoxygenҲͪϥ "
+ ".<p>\n"
+ "ЬݤUd:\n"
+ "\\code\n"
+ "/*! ]I_iO */\n"
+ "class Invisible { };\n\n"
+ "/*! I_O, ~YQ */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* gLdoxygenѳBzLO */\n"
+ "class Undocumented { };\n\n"
+ "/*! gL}(Public)~ӪO */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! @Ӽ˪O */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! ϥΫO@(Protected)~ӪO */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! ϥΨp(Private)~ӪO */\n"
+ "class PrivateBase { };\n\n"
+ "/*! ѳQ~OҨϥΪO */\n"
+ "class Used { };\n\n"
+ "/*! ѼƭӨLO~ӨӪWO(Super Class) */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "YbպAɤ \\c MAX_DOT_GRAPH_HEIGHT tag "
+ "] 240AN|ͤUCϥ:"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "WϤU϶NqpU:\n"
+ "<ul>\n"
+ "<li>%A 񺡶¦⪺϶NͳoӹϥܪOεc "
+ ".\n"
+ "<li>%A 䪺϶NƹLcO.\n"
+ "<li>%A 䪺϶NgƪcάOO.\n"
+ "<li>%A 䪺϶NƪcάOOA"
+ "oǵcO~өΥ]tY|. %A ϥ "
+ "YLkJwɤN|QI_.\n"
+ "</ul>\n"
+ "bY㦳UNq:\n"
+ "<ul>\n"
+ "<li>%A `ŦbYΨӥNO}~ "
+ "Y.\n"
+ "<li>%A `bYNO@~.\n"
+ "<li>%A `bYNp~.\n"
+ "<li>%A bYΨӪOQt@ӥ]tάOϥ."
+ "bYWХܵۥisOάOcܼ"
+ ".\n"
+ "<li>%A bYN˪P˪OYC"
+ "bYWаOۼ˪WѼ"
+ ".\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "ϥ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "ն";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "նئC";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOPk";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "ݩ(properties)";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "ݩ(property)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ƶc";
+ }
+ else
+ {
+ return "O";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Package "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "PackageC";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "BPackage(pG):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Packages";
+ }
+
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "e:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "ΦC";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "950";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "136";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool /*first_capital*/, bool /*singular*/)
+ {
+ return QCString("O");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool /*first_capital*/, bool /*singular*/)
+ {
+ return QCString("ɮ");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool /*first_capital*/, bool /*singular*/)
+ {
+ return QCString("RWŶ");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool /*first_capital*/, bool /*singular*/)
+ {
+ return QCString("s");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool /*first_capital*/, bool /*singular*/)
+ {
+ return QCString("");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool /*first_capital*/, bool /*singular*/)
+ {
+ return QCString("");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool /*first_capital*/, bool /*singular*/)
+ {
+ return QCString("");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool /*first_capital*/, bool /*singular*/)
+ {
+ return QCString("@");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Ѧ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "@ "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "@ "+trWriteList(numEntries)+".";
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "ؿ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Lɶ(Deprecated) C";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Events";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Event ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Package O";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Package ƦC";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "RA Package ƦC";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Package ݩ";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "RA Package ݩ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "oOƪޥΨƹ:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "jM";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "jMG";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "䤣ŦX.";
+ }
+ else if (numDocuments==1)
+ {
+ return " <b>1</b> ŦX.";
+ }
+ else
+ {
+ return " <b>$num</b> ŦX. "
+ "VŦXGܦbVe.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "ŦX:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " l{";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "ؿh"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "ؿ"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "ؿ"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "oӥؿhgL²rƧ: ";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" ؿѦҤ"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool /*first_capital*/, bool /*singular*/)
+ {
+ return QCString("ؿ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "oO@ӬFKQʩҴ overload ơA"
+ "ubѼƤWAPe@ӨƤP.";
+ }
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "IsƪƦC:";
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "/l{ "; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "ƫAC"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return ""; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "ƫA²uC:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="BCXҦ";
+ if (!extractAll)
+ {
+ result+="";
+ }
+ result+="ƫO";
+ result+=" as ";
+ if (!extractAll)
+ {
+ result+="CӦƪƵc";
+ }
+ else
+ {
+ result+="Lݩ󪺸ƫO";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "ƫO"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "ƫO"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "/l{"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "/l{ "; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "ƫO"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "ҲզC"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="BCXҦ";
+ if (!extractAll) result+="";
+ result+="Ҳժa²u:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+="Ҳ"; break;
+ case ClassDef::Struct: result+="A"; break;
+ case ClassDef::Union: result+="pX"; break;
+ case ClassDef::Interface: result+=""; break;
+ case ClassDef::Protocol: result+="ij"; break;
+ case ClassDef::Category: result+=""; break;
+ case ClassDef::Exception: result+="ҥ~"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+="ѦҤ";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+="ҲհѦҤ";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Ҳզ"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="BCXҦ";
+ if (!extractAll) result+="";
+ result+="Ҳզas";
+ if (extractAll)
+ {
+ result+="CӨƪҲդ:";
+ }
+ else
+ {
+ result+="L̩ݪҲ:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Ҳկ"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool /* first_capital */, bool /* singular */)
+ {
+ QCString result("Ҳ");
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool /* single */)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"o";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="Ҳ"; break;
+ case ClassDef::Struct: result+="A"; break;
+ case ClassDef::Union: result+="pX"; break;
+ case ClassDef::Interface: result+=""; break;
+ case ClassDef::Protocol: result+="ij"; break;
+ case ClassDef::Category: result+=""; break;
+ case ClassDef::Exception: result+="ҥ~"; break;
+ }
+ result+="ѤUCɮײ";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool /* first_capital */, bool /* singular */)
+ {
+ QCString result("O");
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool /* first_capital */, bool /* singular */)
+ {
+ QCString result("l{");
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "O";
+ }
+
+};
+
+#endif
diff --git a/src/translator_ua.h b/src/translator_ua.h
new file mode 100644
index 0000000..3ace830
--- /dev/null
+++ b/src/translator_ua.h
@@ -0,0 +1,1589 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ * The translation into Ukrainian was provided by
+ * Olexij Tkatchenko (olexij.tkatchenko@parcs.de)
+ */
+
+#ifndef TRANSLATOR_UA_H
+#define TRANSLATOR_UA_H
+
+class TranslatorUkrainian : public TranslatorAdapter_1_4_1
+{
+ private:
+ /*! The Decode() inline assumes the source written in the
+ Koi8-U encoding (maintainer dependent).
+ */
+ inline QCString decode(const QCString & sInput)
+ {
+//#ifdef _WIN32
+// return Koi8RToWindows1251(sInput);
+//#else
+ return sInput;
+//#endif
+ }
+
+ public:
+ /*! Used for identification of the language. */
+ virtual QCString idLanguage()
+ { return "ukrainian"; }
+
+ /* Used to get the command(s) for the language support. */
+ virtual QCString latexLanguageSupportCommand()
+ {
+//#ifdef _WIN32
+// return "\\usepackage[cp1251]{inputenc}\n\\usepackage[ukrainian]{babel}\n";
+//#else
+ return "\\usepackage[T2A]{fontenc}\n\\usepackage[ukrainian]{babel}\n";
+//#endif
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+//#ifdef _WIN32
+// return "Windows-1251";
+//#else
+ return "koi8-u";
+//#endif
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return decode("ҦΦ æ"); }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return decode("( )"); }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return decode(" "); }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return decode(" Ц "); }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return decode(" ̦˦ "); }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return decode(" Ħ "); }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "" );
+ }
+ else
+ {
+ return decode( "Φ Φ" );
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return decode("Φ..."); }
+
+ /*! put in the class documentation */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trListOfAllMembers()
+ {
+ return decode( " Ӧ Ԧ" );
+ }
+
+ /*! used as the title of the "list of all members" page of a class */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trMemberList()
+ {
+ return decode( "C Ԧ" );
+ }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return decode(" Ԧ"); }
+
+ /*! this is the remainder of the sentence after the class name */
+ /* Dosn't use when optimization for C is on. */
+ virtual QCString trIncludingInheritedMembers()
+ { return decode(", Ӧ Φ "); }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result=decode(" Doxygen");
+ if (s) result+=decode(" ")+s;
+ result+=decode(" .");
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return decode("̦"); }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return decode(" ̦"); }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return decode(" "); }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return decode("Φ ̦"); }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return decode("Ȧ Ӧ"); }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( " " );
+ }
+ else
+ {
+ return decode( "" );
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return decode(""); }
+
+ /*! This is put above each page as a link to the list of all verbatim headers */
+ virtual QCString trHeaderFiles()
+ { return decode("Φ "); }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( " " );
+ }
+ else
+ {
+ return decode( " Ӧ" );
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ /*??*/
+ virtual QCString trFileMembers()
+ {
+ return decode( " " );
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ /* ?? ". : " , ,
+ . */
+ { return decode(" æ"); }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return decode(""); }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return decode(""); }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return decode(" צ"); }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result=" ";
+ if (!extractAll) result+=" ";
+ result+="̦.";
+ return decode(result);
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( " ." );
+ }
+ else
+ {
+ return decode( ", , ' ." );
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result=" Ӧ ";
+ if(!extractAll) result+=" ";
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result+="Ԧ ";
+ else
+ result+="Ԧ Ӧ ";
+ if(extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result+="æ Ҧ/' .";
+ else
+ result+="æ .";
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ result += "צצΦ ";
+ else
+ result += "צצΦ ";
+ result+=", .";
+ }
+ return decode( result );
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result=" Ӧ ";
+ if (!extractAll) result+=" ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="æ, ͦ, , "
+ "̦˦ Ц";
+ }
+ else
+ {
+ result+="Ԧ ̦ ";
+ }
+ result+=" ";
+ if (extractAll)
+ result+=", .";
+ else
+ result+="æ.";
+ return decode( result );
+ }
+
+ /*! This is an introduction to the page with the list of all header files. */
+ virtual QCString trHeaderFilesDescription()
+ { return decode(" ̦."); }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return decode(" Ħ."); }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return decode(" Ӧ."); }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return decode(" ̦."); }
+
+ /*! This sentences is used in the annotated class/file lists if no brief
+ * description is given.
+ */
+ virtual QCString trNoDescriptionAvailable()
+ { return decode(" צΦ"); }
+
+ // index titles (the project name is prepended for these)
+
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return decode("æ"); }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return decode("צ ̦"); }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return decode("Ȧ Ӧ"); }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( "צ " );
+ }
+ else
+ {
+ return decode( "צ Ӧ" );
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return decode( " " ); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return decode("Φ ̦"); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( " " );
+ }
+ else
+ {
+ return decode( "" );
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return decode(""); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return decode(""); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return decode("æ ͦ"); }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return decode("צ Ӧ"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return decode(""); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return decode(" æ"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return decode(" Ц"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return decode("̦"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return decode("æ"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return decode("ͦΦ"); }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return decode(" ̦˦"); }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return decode(" "); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return decode(" Ц æ"); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return decode(" Ц"); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return decode(" ̦˦"); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return decode(" Ԧ ̦"); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return decode(" æ"); }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return decode(" ͦ"); }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( " " );
+ }
+ else
+ {
+ return decode( "" );
+ }
+
+ }
+
+ /*! This is used in the documentation of a group before the list of
+ * links to documented files
+ */
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=decode("æ ");
+ if (projName) result+=decode(" ")+projName;
+ result+=decode(" ")+date;
+ result+=decode(" ");
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return decode(":");
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return decode(" ")+clName;
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return decode(" Ҧ "); }
+
+ /*! this text is generated when the \\reimp command is used. */
+ virtual QCString trReimplementedForInternalReasons()
+ /*??*/
+ { return decode("ͦ ҦΦ . ͦ API.");
+ }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return decode(""); }
+
+ /*! this text is generated when the \\bug command is used. */
+ virtual QCString trBugsAndLimitations()
+ { return decode(" "); }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return decode("Ӧ"); }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return decode(""); }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return decode(""); }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return decode(". "); }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return decode(""); }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return decode(" æ"); }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return decode(" "); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return decode("Ԧ "); }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result=" ̦ ";
+ if (!extractAll) result+=" ";
+ result+="Ҧ .";
+ return decode(result);
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return decode("Φ "); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return decode(" Φ Ӧ צצ æ"); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result;
+ if (isTemplate)
+ {
+ result=" ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=""; break;
+ case ClassDef::Struct: result+=""; break;
+ case ClassDef::Union: result+="'"; break;
+ case ClassDef::Interface: result+=""; break;
+ case ClassDef::Protocol: result+=""; break;
+ case ClassDef::Category: result+="Ҧ"; break;
+ case ClassDef::Exception: result+=""; break;
+ }
+ }
+ else
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=""; break;
+ case ClassDef::Struct: result+=""; break;
+ case ClassDef::Union: result+="'"; break;
+ case ClassDef::Interface: result+=""; break;
+ case ClassDef::Protocol: result+=""; break;
+ case ClassDef::Category: result+="Ҧ"; break;
+ case ClassDef::Exception: result+=""; break;
+ }
+ }
+ result+=" ";
+ return decode(result)+clName;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ return decode(" ")+fileName;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ return decode("Ԧ ")+namespaceName;
+ }
+
+ virtual QCString trPublicMembers()
+ { return decode("Φ "); }
+ virtual QCString trPublicSlots()
+ { return decode("Φ "); }
+ virtual QCString trSignals()
+ { return decode(""); }
+ virtual QCString trStaticPublicMembers()
+ { return decode("Φ Φ "); }
+ virtual QCString trProtectedMembers()
+ { return decode("Φ "); }
+ virtual QCString trProtectedSlots()
+ { return decode("Φ "); }
+ virtual QCString trStaticProtectedMembers()
+ { return decode("Φ Φ "); }
+ virtual QCString trPrivateMembers()
+ { return decode("Φ "); }
+ virtual QCString trPrivateSlots()
+ { return decode("Φ "); }
+ virtual QCString trStaticPrivateMembers()
+ { return decode("Φ Φ "); }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=decode( " " );
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return decode("դ ")+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return decode(" ")+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return decode(" ")+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return decode(" ")+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return decode(" "); }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result=" ̦ ";
+ if (!extractAll) result+=" ";
+ result+="Ԧ ";
+ if (extractAll)
+ result+=" æ :";
+ else
+ result+=" Ԧ :";
+ return decode(result);
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return decode("צ "); }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return decode(" "); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return decode( " " ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"æ ";
+ switch(compType)
+ {
+ case ClassDef::Class:
+ if (single) result+=" "; else result+=" Ӧ";
+ break;
+ case ClassDef::Struct:
+ if (single) result+="æ "; else result+=" ";
+ break;
+ case ClassDef::Union:
+ if (single) result+=" '"; else result+=" '";
+ break;
+ case ClassDef::Interface:
+ if (single) result+=" "; else result+=" Ӧ";
+ break;
+ case ClassDef::Protocol:
+ if (single) result+=" "; else result+=" ̦";
+ break;
+ case ClassDef::Category:
+ if (single) result+="æ Ҧ"; else result+=" Ҧ";
+ break;
+ case ClassDef::Exception:
+ if (single) result+=" "; else result+=" ˦";
+ break;
+ }
+ result+=" ";
+ if (single) result+=":"; else result+=":";
+ return decode(result);
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return decode("צ "); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return decode(", "); }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return decode(" Ҧ"); }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return decode("."); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trSources()
+ {
+ return decode("ȦΦ .");
+ }
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return decode(". ̦ @1, @0");
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return decode(". ̦ @0");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return decode(" ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)decode(" '˦ ")+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return decode(" ̦ ")+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return decode("()");
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return decode(". ȦΦ .");
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return decode(". æ.");
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return decode("");
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return decode("");
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return decode("Ҧ");
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return decode("צ ");
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return decode("ȦΦ ");
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return decode("Ʀ Ȧ Ӧ");
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return decode(". Ʀ Ȧ");
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return decode(". Ȧ");
+ }
+ virtual QCString trPageIndex()
+ {
+ return decode("צ Ӧ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return decode("");
+ }
+ virtual QCString trPublicTypes()
+ {
+ return decode("Φ ");
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( " " );
+ }
+ else
+ {
+ return decode( "Φ " );
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return decode("Φ Φ Φ");
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return decode("Φ ");
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return decode("Φ Φ");
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return decode("Φ Φ Φ");
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return decode("Φ ");
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return decode("Φ Φ");
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return decode("Φ Φ Φ");
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a todo item */
+ virtual QCString trTodo()
+ /*??*/
+ {
+ return decode("Ȧ ");
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ /*??*/
+ {
+ return decode("̦ ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return decode(" ");
+ }
+ virtual QCString trRemarks()
+ {
+ return decode(".");
+ }
+ virtual QCString trAttention()
+ {
+ return decode("");
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return decode(" ̦, ˦ :");
+ }
+ virtual QCString trSince()
+ /*??*/
+ {
+ return decode(" ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return decode("");
+ }
+ /*! page explaining how the dot graph's should be interpreted */
+ virtual QCString trLegendDocs()
+ {
+ return decode(
+ ", .<p>\n"
+ " :\n"
+ "\\code\n"
+ "/*! Ҧ */\n"
+ "class Invisible { };\n\n"
+ "/*! , צ */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* */\n"
+ "class Undocumented { };\n\n"
+ "/*! */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! */\n"
+ "class PrivateBase { };\n\n"
+ "/*! , դ Inherited */\n"
+ "class Used { };\n\n"
+ "/*! , դ ۦ */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ " \\c MAX_DOT_GRAPH_HEIGHT Ʀæ ̦ "
+ " 200, :"
+ "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ " Ʀ ͦ:\n"
+ "<ul>\n"
+ "<li> צ , "
+ " .\n"
+ "<li> צ .\n"
+ "<li> Ӧ צ .\n"
+ "<li> צ , \n"
+ " Ӧ Цצ /ͦ Φ. Ҧ, "
+ " צ ͦ Φ ֦."
+ "</ul>\n"
+ "Ҧ ͦ:\n"
+ "<ul>\n"
+ "<li> Ҧ צ צ "
+ "ͦ .\n"
+ "<li> Ҧ դ Φ.\n"
+ "<li> Ҧ դ Φ.\n"
+ "<li> Ҧ դ, ͦ "
+ " Ӧ դ."
+ "Ҧ դ ͦ, "
+ " צ ϧ . \n"
+ "</ul>\n");
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return decode(". ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return decode("");
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return decode("̦ Ԧ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return decode("DCOP ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return decode("Ԧ");
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return decode(" ̦ ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java interfaces in the summary section of Java packages */
+ virtual QCString trInterfaces()
+ {
+ return decode("");
+ }
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return decode( " " );
+ }
+ else
+ {
+ return decode( "" );
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return decode(" ")+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return decode(" ̦ Ԧ");
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return decode(" ̦ Ԧ.");
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return decode("");
+ }
+ /*! Used as a chapter title for Latex & RTF output */
+ virtual QCString trPackageDocumentation()
+ {
+ return decode(" Ԧ");
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return decode(":");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return decode("");
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return decode("̦ Ԧ");
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+ /*! Used as ansicpg for RTF file */
+ virtual QCString trRTFansicp()
+ {
+ return "1251";
+ }
+ /*! Used as ansicpg for RTF fcharset */
+ virtual QCString trRTFCharSet()
+ {
+ return "204";
+ }
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return decode(" ");
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ QCString result((first_capital ? " " : " "));
+ return decode(result);
+ }
+ else
+ {
+ QCString result((first_capital ? "" : ""));
+ if(!singular) result+="";
+ return decode(result);
+ }
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ if (!singular) result+="";
+ return decode(result);
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ result+=(singular?" ":" ");
+ return decode(result);
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ result+=(singular ? "" : "");
+ return decode(result);
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Ҧ" : "Ҧ"));
+ result+=(singular ? "" : "");
+ return decode(result);
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ if (!singular) result+="";
+ return decode(result);
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trField(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ result+=(singular ? "" : "");
+ return decode(result);
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ result+=(singular ? "" : "");
+ return decode(result);
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "" : ""));
+ if (!singular) result+="";
+ return decode(result);
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "դ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "̦դ " + trWriteList(numEntries) + ".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "̦դ " + trWriteList(numEntries) + ".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "ͦ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Ҧ̦ ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Ħ";
+ }
+
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "æ Ħ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return " Ԧ";
+ }
+
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "æ Ԧ";
+ }
+
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Φ æ Ԧ";
+ }
+
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return " Ԧ";
+ }
+
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Φ Ԧ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Ӧ";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return " Ӧ ˦ æ æ:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return " ";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return " Ԧ צצ .";
+ }
+ else if (numDocuments==1)
+ {
+ return " <b>1</b> צצ .";
+ }
+ else
+ {
+ return " <b>$num</b> Ԧ צצ . "
+ "ݦ צצԦ .";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "צΦ:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return " "+filename;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return " Ǧ"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "æ Ǧ"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return ""; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return " Ǧ "
+ " צ:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result="צ "; result+=dirName; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool, bool singular)
+ {
+ QCString result("");
+ if (!singular) result+="";
+ return result;
+ }
+
+};
+
+#endif
+
diff --git a/src/translator_vi.h b/src/translator_vi.h
new file mode 100644
index 0000000..8a294fd
--- /dev/null
+++ b/src/translator_vi.h
@@ -0,0 +1,1787 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_VI_H
+#define TRANSLATOR_VI_H
+
+/*
+ * 17 Oct 2008 : Translation to Vietnamese by
+ * Đặng Minh Tuấn <tuanvietkey@gmail.com>
+ *
+ */
+
+
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorVietnamese : public TranslatorAdapter_1_6_0
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "vietnamese"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The English LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "utf-8";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Những hàm liên quan"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Chú ý những hàm này không phải là hàm thành viên.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Mô tả chi tiết"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Thông tin về Member Typedef"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Thông tin về Member Enumeration"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Thông tin về hàm thành viên"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Thông tin về trường";
+ }
+ else
+ {
+ return "Thông tin về Member Data";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Tiếp..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Liệt kê tất cả các thành viên."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Danh sách thành viên"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Danh sách các thành viên đầy đủ cho "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", cùng với tất cả các thành viên kế thừa."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Được tạo ra bởi Doxygen";
+ if (s) result+=(QCString)" cho "+s;
+ result+=" từ mã nguồn.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "tên enum"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "giá trị enum"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "được định nghĩa trong"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Các Modules"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Kiến trúc Class"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Cấu trúc cơ sở dữ liệu (Data Structures)";
+ }
+ else
+ {
+ return "Danh mục các Class";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Danh mục File"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Các trường dữ liệu";
+ }
+ else
+ {
+ return "Các thành viên của Class";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Toàn cục";
+ }
+ else
+ {
+ return "File thành viên";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Các trang liên quan"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Các ví dụ"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Tìm kiếm"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Danh sách kế thừa đã được sắp xếp theo ABC, "
+ "nhưng chưa đầy đủ:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Danh mục đầy đủ tất cả các ";
+ if (!extractAll) result+="(đã được biên soạn) ";
+ result+="files cùng với các mô tả tóm tắt:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Đây là cấu trúc cơ sở dữ liệu với mô tả tóm tắt:";
+ }
+ else
+ {
+ return "Đây là các classes, structs, "
+ "unions và interfaces với các mô tả tóm tắt:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Danh mục tất cả các ";
+ if (!extractAll)
+ {
+ result+="(đã được mô tả) ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struct và union fields";
+ }
+ else
+ {
+ result+="class members";
+ }
+ result+=" cùng với các các liên kết đến ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="Thông tin về struct/union cho từng trường:";
+ }
+ else
+ {
+ result+="Thông tin về class cho từng thành viên:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="các structures/unions thuộc:";
+ }
+ else
+ {
+ result+="các lớp thuộc:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Danh sách tất cả các ";
+ if (!extractAll) result+="(đã được mô tat) ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="functions, variables, defines, enums, và typedefs";
+ }
+ else
+ {
+ result+="các file thành viên";
+ }
+ result+=" cùng với links tới ";
+ if (extractAll)
+ result+="các files thuộc:";
+ else
+ result+="tài liệu:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Danh sách tất cả các ví dụ:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Danh sách tất cả các trang Thông tin có liên quan:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Danh sách tất cả các thành viên:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Thông tin"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Chỉ mục (Index) Module"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarchical Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Index cấu trúc cơ sở dữ liệu";
+ }
+ else
+ {
+ return "Class Index";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "File Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Thông tin về các Module"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Thông tin về cấu trúc cơ sở dữ liệu";
+ }
+ else
+ {
+ return "Thông tin về Class";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Thông tin về File"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Thông tin về các ví dụ"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Trang Thông tin"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Thông tin tham chiếu"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Định nghĩa"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Function Prototypes"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Typedefs"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumerations"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Các hàm"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Các biến"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Enumerator"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Thông tin về định nghĩa"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Thông tin về Function Prototype"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Thông tin về Typedef"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Thông tin về Enumeration Type"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Thông tin về hàm"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Thông tin về các biến"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Cấu trúc cơ sở dữ liệu";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Được biên soạn vào "+date;
+ if (projName) result+=(QCString)" cho mã nguồn dự án "+projName;
+ result+=(QCString)" bởi";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "được viết bởi";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Sơ đồ kế thừa cho "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Chỉ cho sử dụng nội bộ."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Lưu ý"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Phiên bản"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Ngày"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Giá trị trả về"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Xem thêm"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Các tham số"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Exceptions"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Được biên soạn bởi"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Danh sách Namespace"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Danh sách tất cả các ";
+ if (!extractAll) result+="(đã được biên tập) ";
+ result+="namespaces với mô tả tóm tắt:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Thông tin về Friends và các hàm liên quan"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Class"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Tham chiếu";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" File Tham chiếu";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Namespace Tham chiếu";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Các hàm thành viên Public"; }
+ virtual QCString trPublicSlots()
+ { return "Public Slots"; }
+ virtual QCString trSignals()
+ { return "Signals"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Các hàm Static Public"; }
+ virtual QCString trProtectedMembers()
+ { return "Các hàm thành viên Protected"; }
+ virtual QCString trProtectedSlots()
+ { return "Protected Slots"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Các hàm thành viên Static Protected"; }
+ virtual QCString trPrivateMembers()
+ { return "Các hàm thành viên Private"; }
+ virtual QCString trPrivateSlots()
+ { return "Private Slots"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Các hàm thành viên Static Private"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", và ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Kế thừa "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Được kế thừa bởi "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Được thực thi lại từ "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Được thực thi lại trong "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Thành viên Namespace"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Danh sách tất cả các ";
+ if (!extractAll) result+="(đã được biên soạn) ";
+ result+="các thành viên namespace cùng với link tới ";
+ if (extractAll)
+ result+="Thông tin namespace cho từng thành viên:";
+ else
+ result+=" namespaces mà phụ thuộc bởi:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Namespace Index"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Thông tin về Namespace"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Thông tin cho ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="class"; break;
+ case ClassDef::Struct: result+="struct"; break;
+ case ClassDef::Union: result+="union"; break;
+ case ClassDef::Interface: result+="interface"; break;
+ case ClassDef::Protocol: result+="protocol"; break;
+ case ClassDef::Category: result+="category"; break;
+ case ClassDef::Exception: result+="exception"; break;
+ }
+ result+=" được biên soạn từ các file sau đây";
+ if (single) result+=":"; else result+=":";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Danh sách theo ABC"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Các giá trị trả về"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Tranh chính"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "tr."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Định nghĩa tại dòng @0 trong file @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Định nghĩa trong file @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Không tán thành";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Sơ đồ liên kết cho "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Kèm theo graph phụ thuộc cho "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Thông tin về Constructor và Destructor";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Tới mã nguồn của file này.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Tới Thông tin của file này.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Điều kiện trước";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Điều kiện sau";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Bất biến";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Giá trị khởi tạo:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "mã nguồn";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Kiến trúc đồ họa của Class";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Tới kiến trúc đồ họa của Class";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Tới kiến trúc text của Class";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Chỉ mục trang";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Ghi chú";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Public Types";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "các trường đữ liệu";
+ }
+ else
+ {
+ return "Các thuộc tính Public";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Các thuộc tính Static Public";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Các kiểu Protected";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "các thuộc tính Protected";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Các thuộc tính Static Protected";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Các kiểu Private";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Các thuộc tính Private";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Các thuộc tính Static Private";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Mục tiêu";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Danh sách hàng mục cần thực hiện";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Tham chiếu bởi";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Ghi chú";
+ }
+ virtual QCString trAttention()
+ {
+ return "Chú ý";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Đồ thị này biểu thị những file nào trực tiếp hoặc"
+ "không trực tiếp bao gồm file này:";
+ }
+ virtual QCString trSince()
+ {
+ return "Từ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Chú giải Graph";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Trang này giải nghĩa các biểu đồ được biên soạn bởi "
+ " doxygen.<p>\n"
+ "Hãy xem xét các ví dụ sau:\n"
+ "\\code\n"
+ "/*! Các lướp không thấy được bởi sự cắt ngắn */\n"
+ "Lớp không nhìn thấy class { };\n\n"
+ "/*! class bị cắt, quan hệ kế thừa bị ẩn */\n"
+ "class bị cắt : bị ẩn toàn cục { };\n\n"
+ "/* Class không được mô tả với các chú giải doxygen */\n"
+ "class không được mô tả { };\n\n"
+ "/*! Class được kế thừa sử dụng các kế thừa public */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Class được kế thừa sử dụng kế thừa protected */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Class được kế thừa sử dụng kế thừa protected private */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Class được sử dụng bởi các class kế thừa */\n"
+ "class được sử dụng { };\n\n"
+ "/*! Super class kế thừa một số các class khác */\n"
+ "class được kế thừa : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "Kết quả trong biểu đồ sau đây:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Các hộp trong biểu đồ trên có ý nghĩa như sau:\n"
+ "<ul>\n"
+ "<li>%Hộp màu xám biểu thị cấu trúc clas cho "
+ "biểu đồ được thể hiện.\n"
+ "<li>%Hộp có khung mầu đen biểu thị struct hoặc class được mô tả.\n"
+ "<li>%Hộp có khung mầu xám biểu thị struct hoặc class chưa được mô tả.\n"
+ "<li>%Hộp có khung mầu đỏ biểu thị struct hoặc class được mổ tả "
+ "khi mà không phải tất cả các quan hệ kế thừa/containment được biển diễn.. %Biểu đồ bị "
+ "cắt nếu nó không nằm trọn trong các biên được cho trước..\n"
+ "</ul>\n"
+ "Các mũi tên có ý nghĩa như sau::\n"
+ "<ul>\n"
+ "<li>%Mũi tên mầu xanh đậm biểu thị các quan hệ kế thừa công khai "
+ "giữa 2 class.\n"
+ "<li>%Mũi tên màu xanh lá cây đậm biểu thị kế thừa được bảo về (protected).\n"
+ "<li>%Mũi tên đỏ đậm biểu thị kế thừa dạng private.\n"
+ "<li>%Mũi tên màu hồng đứt quảng biểu thị class được sử dụng "
+ "bởi class khác. Mũi tên được gán nhãn với các giá trị "
+ "mà các calsss hoặc struct được truy cập tới.\n"
+ "<li>%Mũi tên vàng đắt quãng được thị quan hệ giữa template instance và "
+ "template class được dẫn xuất từ đó. Mũi tên được gán nhãn với "
+ "tham số của template.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "Chú giải";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Test";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Danh sách Test";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "Các hàm thành viên DCOP";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Thuộc tính";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Thông tin thuộc tính (Property)";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Cấu trúc dữ liệu";
+ }
+ else
+ {
+ return "Classes";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Gói "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Danh sách gói";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Danh sách các gói cùng với mô tả tóm tắt (khi có thể có):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Các gói";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Giá trị:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Lỗi";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Danh sách lỗi";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Chỉ số";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Class" : "class"));
+ if (!singular) result+="es";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "File" : "file"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Group" : "group"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Trang" : "trang"));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Member" : "member"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tác giả" : "tác giả"));
+ if (!singular) result+="";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Tham chiếu";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Thực hiện "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Được thực hiện trong "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Mục lục";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Danh sách Deprecated";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Sự kiện";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Thông tin về sự kiện";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Kiểu gói";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Các hàm Package";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Các hàm Static Package";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Các thuộc tính Package";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Các thuộc tính Static Package";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Tất cả";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Biểu đồ các lời gọi cho hàm này:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Tìm kiếm cho";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Kết quả tìm kiếm";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Không có tài liệu nào thỏa mãn các truy vấn của bạn.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Tìm thấy <b>1</b> tài liệu thỏa mã truy vấn của bạn.";
+ }
+ else
+ {
+ return "Tìm thấy tất cả <b>$num</b> tài liệu thỏa mã truy vấn của bạn. "
+ "Hiển thị những thỏa mãn tốt nhất trước.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Các kết quả thỏa mãn đk:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " File nguồn";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Cấu trúc thư mục"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Thông tin về thư mục"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Các thư mục"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Thư mục đã được sắp xếp theo al-pha-bê, "
+ "nhưng chưa đầy đủ:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Tham chiếu thư mục"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Thư mục" : "thư mục"));
+ if (singular) result+=""; else result+="";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Hàm thành viên dạng overloaded, "
+ "được chỉ ra cho việc tra cứu dễ dàng. Nó khác với hàm ở trên"
+ "chỉ ở chỗ những tham số nào nó chấp nhận.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Biểu đồ các lời gọi cho hàm này:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Thông tin Enumerator"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Thông tin về các hàm và các thủ tục thành viên"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Danh sách kiêu dữ liệu"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Trường dữ liệu"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Kiểu dữ liệu với các mô tả tóm tắt:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Danh sách tất cả ";
+ if (!extractAll)
+ {
+ result+="(đã được mô tả) ";
+ }
+ result+="các kiểu dữ liệu thành viên";
+ result+=" cùng với liên kết với ";
+ if (!extractAll)
+ {
+ result+="Thông tin cấu trúc dữ liệu cho từng thành viên";
+ }
+ else
+ {
+ result+=" các kiểu dữ liệu thuộc:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Chỉ mục kiểu dữ liệu"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Thông tin về kiểu dữ liệu"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Functions/Subroutines"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Thông tin về Function/Subroutine"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Kiểu dữ liệu"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Danh sách Modules"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Danh sách tất cả ";
+ if (!extractAll) result+="(đã được mô tả) ";
+ result+="các module với mô tả tóm tắt:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Module"; break;
+ case ClassDef::Struct: result+=" Type"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Interface"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Category"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Tham chiếu";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Tham chiếu Module";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Thành viên Module"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Danh sách tất cả ";
+ if (!extractAll) result+="(đã được mô tả) ";
+ result+="các module thành viên cùng với liên kết tới ";
+ if (extractAll)
+ {
+ result+="Thông tin module cho từng thành viên:";
+ }
+ else
+ {
+ result+="các module thuộc:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Chỉ mục các Module"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Module" : "module"));
+ if (!singular) result+="";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Module", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Thông tin cho ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="module"; break;
+ case ClassDef::Struct: result+="type"; break;
+ case ClassDef::Union: result+="union"; break;
+ case ClassDef::Interface: result+="interface"; break;
+ case ClassDef::Protocol: result+="protocol"; break;
+ case ClassDef::Category: result+="category"; break;
+ case ClassDef::Exception: result+="exception"; break;
+ }
+ result+=" được biên soạn từ các file sau đây";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Kiểu" : "kiểu"));
+ if (!singular) result+="";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Chương trình con" : "chương trình con"));
+ if (!singular) result+="";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Ràng buộc của kiểu (Type)";
+ }
+
+};
+
+#endif
diff --git a/src/translator_za.h b/src/translator_za.h
new file mode 100644
index 0000000..5c68163
--- /dev/null
+++ b/src/translator_za.h
@@ -0,0 +1,1767 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+ /*
+ * Bronne vir hierdie vertaling (Sources for this translation):
+ * Die Stigting vir Afrikaans se rekenaartermelys:
+ * - http://www.afrikaans.com/rekenaarterme.html
+ * Werkgroep vir Afrikaanse IT-terme:
+ * - http://www.vertaal.org/index.html
+ */
+
+#ifndef TRANSLATOR_ZA_H
+#define TRANSLATOR_ZA_H
+
+class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "afrikaans"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ *
+ * The Afrikaans LaTeX does not use such commands. Because of this
+ * the empty string is returned in this implementation.
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ //should we use return "\\usepackage[afrikaans]{babel}\n";
+ // not sure - for now return an empty string
+ return "";
+ }
+
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-1";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Verwante Funksies"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Let daarop dat hierdie nie lede funksies is nie.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Detail Beskrywing"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Lede Typedef Dokumentasie"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Lede Enumerasie Dokumentasie"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Lede Funksie Dokumentasie"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Veld Dokumentasie";
+ }
+ else
+ {
+ return "Lede Data Dokumentasie";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "Meer detail..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Lys van alle lede."; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Lede Lys"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Hierdie is 'n volledige lys van lede vir "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", insluitend alle afgeleide lede."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Automaties gegenereer deur Doxygen";
+ if (s) result+=(QCString)" vir "+s;
+ result+=" van die bron kode af.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "enum naam"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "enum waarde"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "gedefinie&euml;r in"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Modules"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Klas Hierargie"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Strukture";
+ }
+ else
+ {
+ return "Klas Lys";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Le&euml;r Lys"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Velde";
+ }
+ else
+ {
+ return "Klas Lede";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globals";
+ }
+ else
+ {
+ return "Le&euml;r Lede";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Verwante Bladsye"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Voorbeelde"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Soek"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ {
+ return "Hierdie afgeleide lys word rofweg gesorteer: ";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Hier is 'n lys van alle ";
+ if (!extractAll) result+="gedokumenteerde ";
+ result+="le&euml;rs met kort beskrywings:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return " Data strukture met kort beskrywings:";
+ }
+ else
+ {
+ return "Klasse, structs, "
+ "unions en intervlakke met kort beskrywings:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="'n Lys van alle ";
+ if (!extractAll)
+ {
+ result+="gedokumenteerde ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struct en union velde";
+ }
+ else
+ {
+ result+="klas lede";
+ }
+ result+=" met skakels na ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="die struct/union dokumentasie vir elke veld:";
+ }
+ else
+ {
+ result+="die klas dokumentasie vir elke lid:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="die structures/unions waaraan hulle behoort:";
+ }
+ else
+ {
+ result+="die klasse waaraan hulle behoort:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="'n Lys van alle ";
+ if (!extractAll) result+="gedokumenteerde ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funksies, veranderlikes, defines, enums, en typedefs";
+ }
+ else
+ {
+ result+="le&euml;r lede";
+ }
+ result+=" met skakels na ";
+ if (extractAll)
+ result+="die le&euml;rs waaraan hulle behoort:";
+ else
+ result+="die dokumentasie:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "'n Lys van alle voorbeelde:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "'n Lys van alle verwante dokumentasie:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "'n Lys van alle modules:"; }
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentasie"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Module Indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierargiese Indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Strukture Indeks";
+ }
+ else
+ {
+ return "Klas Indeks";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Le&euml;r Indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Module Dokumentasie"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Strukture Dokumentasie";
+ }
+ else
+ {
+ return "Klas Dokumentasie";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Le&euml;r Dokumentasie"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Voorbeeld Dokumentasie"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Bladsy Dokumentasie"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Verwysings Handleiding"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Definiesies"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Funksie Prototipes"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Typedefs"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Enumerations"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funksies"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Veranderlikes"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Enumeration waardes"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Define Documentation"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Funksie Prototipe Dokumentasie"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Typedef Dokumentasie"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Enumeration Type Dokumentasie"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Funksie Dokumentasie"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Veranderlike Dokumentasie"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Strukture";
+ }
+ else
+ {
+ return "Klasse";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Gegenereer op "+date;
+ if (projName) result+=(QCString)" vir "+projName;
+ result+=(QCString)" deur";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "geskryf deur";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Afleidings diagram vir "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Slegs vir interne gebruik."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Waarskuwing"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Weergawe"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Datum"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Returns"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Sien ook"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parameters"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Exceptions"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Gegenereer deur"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Namespace Lys"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="'n Lys van alle ";
+ if (!extractAll) result+="gedokumenteerde ";
+ result+="namespaces met kort beskrywings:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Friends"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Friends En Verwante Funksie Dokumentasie"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" klas"; break;
+ case ClassDef::Struct: result+=" Struct"; break;
+ case ClassDef::Union: result+=" Union"; break;
+ case ClassDef::Interface: result+=" Intervlak"; break;
+ case ClassDef::Protocol: result+=" Protocol"; break;
+ case ClassDef::Category: result+=" Kategorie"; break;
+ case ClassDef::Exception: result+=" Exception"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Verwysing";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" Le&euml;r Verwysing";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Namespace Verwysing";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Publieke Lede Funksies"; }
+ virtual QCString trPublicSlots()
+ { return "Publieke Slots"; }
+ virtual QCString trSignals()
+ { return "Signals"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statiese Publieke Lede Funksies"; }
+ virtual QCString trProtectedMembers()
+ { return "Beskermde Lede Funksies"; }
+ virtual QCString trProtectedSlots()
+ { return "Beskermde Slots"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statiese Beskermde Lede Funksies"; }
+ virtual QCString trPrivateMembers()
+ { return "Private Lede Funksies"; }
+ virtual QCString trPrivateSlots()
+ { return "Private Slots"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statiese Private Lede Funksies"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", en ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Afgelei van"+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Afgelei van"+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Hergeimplimenteer van "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Hergeimplimenter in "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Namespace Lede"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="'n Lys van alle ";
+ if (!extractAll) result+="gedokumenteerde ";
+ result+="namespace lede met skakels na ";
+ if (extractAll)
+ result+="die namespace dokumentasie vir elke lid:";
+ else
+ result+="die namespaces waaraan hulle behoort:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Namespace Indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Namespace Dokumentasie"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // here s is one of " Class", " Struct" or " Union"
+ // single is true implies a single file
+ QCString result=(QCString)"Die dokumentasie vir hierdie ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="klas"; break;
+ case ClassDef::Struct: result+="struct"; break;
+ case ClassDef::Union: result+="union"; break;
+ case ClassDef::Interface: result+="intervlak"; break;
+ case ClassDef::Protocol: result+="protokol"; break;
+ case ClassDef::Category: result+="kategorie"; break;
+ case ClassDef::Exception: result+="eksepsie"; break;
+ }
+ result+=" is gegenereer vanaf die volgende le&euml;r";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Alfabetiese Lys"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Return waardes"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Hoof Bladsy"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "p."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Gedefinie&euml;r by lyn @0 van le&euml;r @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definisie in le&euml;r @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Verouderd";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Samewerkings diagram vir "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Insluitings afhanklikheid diagram vir "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Konstruktor & Destruktor Dokumentasie";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Skakel na die bron kode van hierdie le&euml;r.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Skakel na die dokumentasie van hierdie le&euml;r.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Prekondisie";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Postkondisie";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariant";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Oorspronklike waarde:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "kode";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafiese Klasse Hierargie";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Skakel na die grafiese klasse hierargie";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Skakel na die teks klasse hierargie";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Bladsy Indeks";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Nota";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Publieke Tipes";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Velde";
+ }
+ else
+ {
+ return "Publieke Public Attributes";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statiese Publieke Attribute";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Beskermde Tipes";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Beskermde Attribute";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statiese Beskermde Attribute";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Private Tipes";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Private Attribute";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statiese Private Attribute";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Aksies";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Aksie Lys";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Verwysing van";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Opmerkings";
+ }
+ virtual QCString trAttention()
+ {
+ return "Aandag";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Hierdie diagram verduidelik watter le&euml;rs direk of"
+ "indirek hierdie le&euml;r insluit:";
+ }
+ virtual QCString trSince()
+ {
+ return "Sederd";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Diagram beskrywing";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "Hierdie bladsy beskryf die diagram konvensies wat gebruik word "
+ "deur doxygen.<p>\n"
+ "in hierdie voorbeeld:\n"
+ "\\code\n"
+ "/*! Onsigbare klas weens afkorting */\n"
+ "class Invisible { };\n\n"
+ "/*! Afgekorte klas, afgeleide verwantskap word versteek */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Ongedokumenteerde Klas, geen doxygen kommentaar nie */\n"
+ "class Undocumented{ };\n\n"
+ "/*! 'n Klas wat afgelei is met 'n publieke verwantskap */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! 'n template klas */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! 'n Klas wat afgelei is met 'n beskermde verwantskap */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! 'n Klas wat afgelei is met 'n private verwantskap */\n"
+ "class PrivateBase { };\n\n"
+ "/*! 'n Klas wat gebrui word deur die Afgeleide klas */\n"
+ "class GebruikMy { };\n\n"
+ "/*! 'n Super klas wat afgelei word van 'n aantal basis klasse */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Ongedokumenteer,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "As die \\c MAX_DOT_GRAPH_HEIGHT merker in die konfigurasie le&euml;r "
+ "aan 240 gelyk gestel is, word die volgende diagram geproduseer:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
+ "<p>\n"
+ "Die reghoeke in die diagram het die volgende betekenis:\n"
+ "<ul>\n"
+ "<li>%'n Soliede swart reghoek verteenwoordig die klas waarvoor "
+ "die diagram gegenereer is.\n"
+ "<li>%'n Reghoek met 'n swart omlyning verteenwoordig 'n gedokumenteerde klas.\n"
+ "<li>%'n Reghoek met 'n grys omlyning verteenwoordig 'n ongedokumenteerde klas.\n"
+ "<li>%'n Reghoek met 'n rooi omlyning verteenwoordig 'n gedokumenteerde klas waarvoor"
+ "alle verwante klasse (afgeleide of gebruik) nie getoon word nie. %'n Diagram word "
+ "op hierie manier afgekort as dit nie in die gespesifiseerde raam pas nie.\n"
+ "</ul>\n"
+ "Die pyltjies het die volgende betekenis:\n"
+ "<ul>\n"
+ "<li>%'n Donker blou pyltjie verteenwoordig 'n publieke afgeleide "
+ "verwantskap tussen twee klasse.\n"
+ "<li>%'n Donker groen pyltjie word gebruik vir 'n beskermde verwantskap.\n"
+ "<li>%'n Donker rooi pyltjie verteenwoordig private verwantskappe.\n"
+ "<li>%'n Pers pyltjie word gebruik as 'n klas gebruik of bevat word "
+ "deur 'n ander klas. Die pyltjie word gemerk met die veranderlike(s) waar deur "
+ "die verwysde klass verkrygbaar is.\n"
+ "<li>%'n Geel stippel pyl verteenwoordig die verwantslap tussen 'n template instansie en "
+ "die template waarvan die klas vervaardig is. Die pyltjie word gemerk met die "
+ "template parameters van die instansie.\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "beskrywing";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Toets";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Toets Lys";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP Lede Funksies";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Eienskappe";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Eienskap Dokumentasie";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Data Strukture";
+ }
+ else
+ {
+ return "Klasse";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Pakket "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Pakket Lys";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Die pakkette met kort beskrywings (indien beskikbaar):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pakkette";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Waarde:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Bug";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Bug Lys";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1252";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "0";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indeks";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Klas" : "klas"));
+ if (!singular) result+="se";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Le&euml;r" : "le&euml;r"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Namespace" : "namespace"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Groep" : "groep"));
+ if (!singular) result+="e";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Bladsy" : "bladsy"));
+ if (!singular) result+="e";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Lid" : "lid"));
+ if (!singular) result = (first_capital ? "Lede" : "lede");
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Global" : "global"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Outeur" : "outeur"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Verwysings";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Implimenteer "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Geimplimenteer in "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Inhoudsopgawe";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Verouderde Lys";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Events";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Event Dokumentasie";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Pakket Tipes";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Pakket Funksies";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statiese Pakket Funksies";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Pakket Eienskappe";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statiese Pakket Eienskappe";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Alle Lede";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "'n gebruiks diagram vir hierdie funksie:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Soek vir";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Soektog Resultate";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Geen dokumente na gelang van jou navraag nie.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Die soektog het <b>1</b> dokument gevind na gelang van jou navraag.";
+ }
+ else
+ {
+ return "Die soektog het <b>$num</b> dokumente gevind na gelang van jou navraag. "
+ "Beste resultate eerste.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Teikens:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " Bron kode Le&euml;r";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Directory Hi&euml;rargie"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Directory Documentasie"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of a HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Directories"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Hierdie directory hi&euml;rargie is min of meer alfabeties "
+ "gesorteer:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result=dirName; result+=" Directory Verwysing"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Director" : "director"));
+ if (singular) result+="y"; else result+="ies";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Hierdie is 'n oorlaaide lede funksie, "
+ "vertoon vir volledigheid. Dit verskil slegs van die bogegewe "
+ "funksie in die argument(e) wat dit aanvaar.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Hier is die roep skema vir die funksie:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Enumerator Dokumentasie"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Lede Funksie/Subroetine Dokumentasie"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Data Tipes Lys"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Data Velde"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Hier is die data tipes met kort beskrywings:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Hier is 'n lys van alle ";
+ if (!extractAll)
+ {
+ result+="gedokumenteerde ";
+ }
+ result+="data tipe lede";
+ result+=" met skakels na ";
+ if (!extractAll)
+ {
+ result+="die data strukture dokumentasie vir elke lid";
+ }
+ else
+ {
+ result+="die data tipes waaraan hulle behoort:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Data Tipe Indeks"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Data Tipe Dokumentasie"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funksies/Subroetines"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Funksies/Subroetine Dokumentasie"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Data Tipes"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Modules Lys"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Hier is 'n lys van alle ";
+ if (!extractAll) result+="gedokumenteerde ";
+ result+="modules met kort beskrywings:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Module"; break;
+ case ClassDef::Struct: result+=" Tipe"; break;
+ case ClassDef::Union: result+=" Unie"; break;
+ case ClassDef::Interface: result+=" Interflak"; break;
+ case ClassDef::Protocol: result+=" Protokol"; break;
+ case ClassDef::Category: result+=" Kategorie"; break;
+ case ClassDef::Exception: result+=" Eksepsie"; break;
+ }
+ if (isTemplate) result+=" Template";
+ result+=" Bron";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Module Bron";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Module Lede"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Hier is 'n lys van alle ";
+ if (!extractAll) result+="gedokumenteerde ";
+ result+="module lede met skakels na ";
+ if (extractAll)
+ {
+ result+="die module dokumentasie vir elke lid:";
+ }
+ else
+ {
+ result+="die modules waaraan hulle behoort:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Modules Indeks"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Module" : "module"));
+ if (!singular) result+="s";
+ return result;
+ }
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"The documentation for this ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="module"; break;
+ case ClassDef::Struct: result+="tipe"; break;
+ case ClassDef::Union: result+="unie"; break;
+ case ClassDef::Interface: result+="Interflak"; break;
+ case ClassDef::Protocol: result+="protokcol"; break;
+ case ClassDef::Category: result+="kategorie"; break;
+ case ClassDef::Exception: result+="eksepsie"; break;
+ }
+ result+=" is gegenereer vanaf die foldende leer";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tipe" : "tipe"));
+ if (!singular) result+="s";
+ return result;
+ }
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Subprogram" : "subprogram"));
+ if (!singular) result+="me";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Tipe Limiete";
+ }
+
+};
+
+#endif
diff --git a/src/translatordecoder.h b/src/translatordecoder.h
new file mode 100644
index 0000000..a9df3d6
--- /dev/null
+++ b/src/translatordecoder.h
@@ -0,0 +1,750 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATORDECODER_H
+#define TRANSLATORDECODER_H
+
+#include "translator.h"
+#include "portable.h"
+
+class TranslatorDecoder : public Translator
+{
+ public:
+
+ TranslatorDecoder(Translator *translator) : m_translator(translator)
+ {
+ m_toUtf8 = portable_iconv_open("UTF-8",translator->idLanguageCharset());
+ m_fromUtf8 = portable_iconv_open(translator->idLanguageCharset(),"UTF-8");
+ }
+ virtual ~TranslatorDecoder()
+ {
+ if (m_toUtf8!=(void *)(-1)) portable_iconv_close(m_toUtf8);
+ if (m_fromUtf8!=(void *)(-1)) portable_iconv_close(m_fromUtf8);
+ delete m_translator;
+ }
+
+ /*! This method is used to provide warning message that is displayed
+ * if the user chooses a language whose translation is not up to date.
+ * It is implemented by the adapter classes.
+ */
+ virtual QCString updateNeededMessage() { return m_translator->updateNeededMessage(); }
+
+ // Please, have a look at comments inside the translator_en.h file
+ // to learn the meaning of the following methods. The translator_en.h
+ // file contains the TranslatorEnglish implementation, which is
+ // always up-to-date (by definition).
+
+ // --- Language control methods -------------------
+
+ QCString idLanguage()
+ { return m_translator->idLanguage(); }
+ QCString latexLanguageSupportCommand()
+ { return m_translator->latexLanguageSupportCommand(); }
+ QCString idLanguageCharset()
+ { return m_translator->idLanguageCharset(); }
+
+ QCString recode(const QCString &s,void *cd)
+ {
+ if (cd==(void*)(-1)) return s;
+ int iSize = s.length();
+ int oSize = iSize*4+1;
+ QCString output(oSize);
+ size_t iLeft = iSize;
+ size_t oLeft = oSize;
+ const char *iPtr = s.data();
+ char *oPtr = output.data();
+ if (!portable_iconv(cd,&iPtr,&iLeft,&oPtr,&oLeft))
+ {
+ oSize -= oLeft;
+ output.resize(oSize+1);
+ output.at(oSize)='\0';
+ return output;
+ }
+ else
+ {
+ return s;
+ }
+ }
+ QCString toUtf8(const QCString &s)
+ {
+ return recode(s,m_toUtf8);
+ }
+ QCString fromUtf8(const QCString &s)
+ {
+ return recode(s,m_fromUtf8);
+ }
+
+ // --- Language translation methods -------------------
+
+ QCString trRelatedFunctions()
+ { return toUtf8(m_translator->trRelatedFunctions()); }
+ QCString trRelatedSubscript()
+ { return toUtf8(m_translator->trRelatedSubscript()); }
+ QCString trDetailedDescription()
+ { return toUtf8(m_translator->trDetailedDescription()); }
+ QCString trMemberTypedefDocumentation()
+ { return toUtf8(m_translator->trMemberTypedefDocumentation()); }
+ QCString trMemberEnumerationDocumentation()
+ { return toUtf8(m_translator->trMemberEnumerationDocumentation()); }
+
+ QCString trMemberFunctionDocumentation()
+ { return toUtf8(m_translator->trMemberFunctionDocumentation()); }
+ QCString trMemberDataDocumentation()
+ { return toUtf8(m_translator->trMemberDataDocumentation()); }
+ QCString trMore()
+ { return toUtf8(m_translator->trMore()); }
+ QCString trListOfAllMembers()
+ { return toUtf8(m_translator->trListOfAllMembers()); }
+ QCString trMemberList()
+ { return toUtf8(m_translator->trMemberList()); }
+ QCString trThisIsTheListOfAllMembers()
+ { return toUtf8(m_translator->trThisIsTheListOfAllMembers()); }
+ QCString trIncludingInheritedMembers()
+ { return toUtf8(m_translator->trIncludingInheritedMembers()); }
+ QCString trGeneratedAutomatically(const char *s)
+ { return toUtf8(m_translator->trGeneratedAutomatically(fromUtf8(s))); }
+ QCString trEnumName()
+ { return toUtf8(m_translator->trEnumName()); }
+ QCString trEnumValue()
+ { return toUtf8(m_translator->trEnumValue()); }
+ QCString trDefinedIn()
+ { return toUtf8(m_translator->trDefinedIn()); }
+
+ // quick reference sections
+
+ QCString trModules()
+ { return toUtf8(m_translator->trModules()); }
+ QCString trClassHierarchy()
+ { return toUtf8(m_translator->trClassHierarchy()); }
+ QCString trCompoundList()
+ { return toUtf8(m_translator->trCompoundList()); }
+
+ QCString trFileList()
+ { return toUtf8(m_translator->trFileList()); }
+ QCString trCompoundMembers()
+ { return toUtf8(m_translator->trCompoundMembers()); }
+ QCString trFileMembers()
+ { return toUtf8(m_translator->trFileMembers()); }
+ QCString trRelatedPages()
+ { return toUtf8(m_translator->trRelatedPages()); }
+ QCString trExamples()
+ { return toUtf8(m_translator->trExamples()); }
+ QCString trSearch()
+ { return toUtf8(m_translator->trSearch()); }
+ QCString trClassHierarchyDescription()
+ { return toUtf8(m_translator->trClassHierarchyDescription()); }
+ QCString trFileListDescription(bool extractAll)
+ { return toUtf8(m_translator->trFileListDescription(extractAll)); }
+ QCString trCompoundListDescription()
+ { return toUtf8(m_translator->trCompoundListDescription()); }
+ QCString trCompoundMembersDescription(bool extractAll)
+ { return toUtf8(m_translator->trCompoundMembersDescription(extractAll)); }
+ QCString trFileMembersDescription(bool extractAll)
+ { return toUtf8(m_translator->trFileMembersDescription(extractAll)); }
+ QCString trExamplesDescription()
+ { return toUtf8(m_translator->trExamplesDescription()); }
+ QCString trRelatedPagesDescription()
+ { return toUtf8(m_translator->trRelatedPagesDescription()); }
+ QCString trModulesDescription()
+ { return toUtf8(m_translator->trModulesDescription()); }
+
+ // index titles (the project name is prepended for these)
+
+ QCString trDocumentation()
+ { return toUtf8(m_translator->trDocumentation()); }
+ QCString trModuleIndex()
+ { return toUtf8(m_translator->trModuleIndex()); }
+ QCString trHierarchicalIndex()
+ { return toUtf8(m_translator->trHierarchicalIndex()); }
+ QCString trCompoundIndex()
+ { return toUtf8(m_translator->trCompoundIndex()); }
+ QCString trFileIndex()
+ { return toUtf8(m_translator->trFileIndex()); }
+ QCString trModuleDocumentation()
+ { return toUtf8(m_translator->trModuleDocumentation()); }
+ QCString trClassDocumentation()
+ { return toUtf8(m_translator->trClassDocumentation()); }
+ QCString trFileDocumentation()
+ { return toUtf8(m_translator->trFileDocumentation()); }
+ QCString trExampleDocumentation()
+ { return toUtf8(m_translator->trExampleDocumentation()); }
+ QCString trPageDocumentation()
+ { return toUtf8(m_translator->trPageDocumentation()); }
+ QCString trReferenceManual()
+ { return toUtf8(m_translator->trReferenceManual()); }
+ QCString trDefines()
+ { return toUtf8(m_translator->trDefines()); }
+ QCString trFuncProtos()
+ { return toUtf8(m_translator->trFuncProtos()); }
+ QCString trTypedefs()
+ { return toUtf8(m_translator->trTypedefs()); }
+ QCString trEnumerations()
+ { return toUtf8(m_translator->trEnumerations()); }
+ QCString trFunctions()
+ { return toUtf8(m_translator->trFunctions()); }
+ QCString trVariables()
+ { return toUtf8(m_translator->trVariables()); }
+ QCString trEnumerationValues()
+ { return toUtf8(m_translator->trEnumerationValues()); }
+ QCString trDefineDocumentation()
+ { return toUtf8(m_translator->trDefineDocumentation()); }
+ QCString trFunctionPrototypeDocumentation()
+ { return toUtf8(m_translator->trFunctionPrototypeDocumentation()); }
+ QCString trTypedefDocumentation()
+ { return toUtf8(m_translator->trTypedefDocumentation()); }
+ QCString trEnumerationTypeDocumentation()
+ { return toUtf8(m_translator->trEnumerationTypeDocumentation()); }
+ QCString trFunctionDocumentation()
+ { return toUtf8(m_translator->trFunctionDocumentation()); }
+ QCString trVariableDocumentation()
+ { return toUtf8(m_translator->trVariableDocumentation()); }
+ QCString trCompounds()
+ { return toUtf8(m_translator->trCompounds()); }
+ QCString trGeneratedAt(const char *date,const char *projName)
+ { return toUtf8(m_translator->trGeneratedAt(fromUtf8(date),fromUtf8(projName))); }
+ QCString trWrittenBy()
+ { return toUtf8(m_translator->trWrittenBy()); }
+ QCString trClassDiagram(const char *clName)
+ { return toUtf8(m_translator->trClassDiagram(fromUtf8(clName))); }
+ QCString trForInternalUseOnly()
+ { return toUtf8(m_translator->trForInternalUseOnly()); }
+ QCString trWarning()
+ { return toUtf8(m_translator->trWarning()); }
+ QCString trVersion()
+ { return toUtf8(m_translator->trVersion()); }
+ QCString trDate()
+ { return toUtf8(m_translator->trDate()); }
+ QCString trReturns()
+ { return toUtf8(m_translator->trReturns()); }
+ QCString trSeeAlso()
+ { return toUtf8(m_translator->trSeeAlso()); }
+ QCString trParameters()
+ { return toUtf8(m_translator->trParameters()); }
+ QCString trExceptions()
+ { return toUtf8(m_translator->trExceptions()); }
+ QCString trGeneratedBy()
+ { return toUtf8(m_translator->trGeneratedBy()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNamespaceList()
+ { return toUtf8(m_translator->trNamespaceList()); }
+ QCString trNamespaceListDescription(bool extractAll)
+ { return toUtf8(m_translator->trNamespaceListDescription(extractAll)); }
+ QCString trFriends()
+ { return toUtf8(m_translator->trFriends()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trRelatedFunctionDocumentation()
+ { return toUtf8(m_translator->trRelatedFunctionDocumentation()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ { return toUtf8(m_translator->trCompoundReference(fromUtf8(clName),compType,isTemplate)); }
+
+
+ QCString trFileReference(const char *fileName)
+ { return toUtf8(m_translator->trFileReference(fromUtf8(fileName))); }
+ QCString trNamespaceReference(const char *namespaceName)
+ { return toUtf8(m_translator->trNamespaceReference(fromUtf8(namespaceName))); }
+
+ QCString trPublicMembers()
+ { return toUtf8(m_translator->trPublicMembers()); }
+ QCString trPublicSlots()
+ { return toUtf8(m_translator->trPublicSlots()); }
+ QCString trSignals()
+ { return toUtf8(m_translator->trSignals()); }
+ QCString trStaticPublicMembers()
+ { return toUtf8(m_translator->trStaticPublicMembers()); }
+ QCString trProtectedMembers()
+ { return toUtf8(m_translator->trProtectedMembers()); }
+ QCString trProtectedSlots()
+ { return toUtf8(m_translator->trProtectedSlots()); }
+ QCString trStaticProtectedMembers()
+ { return toUtf8(m_translator->trStaticProtectedMembers()); }
+ QCString trPrivateMembers()
+ { return toUtf8(m_translator->trPrivateMembers()); }
+ QCString trPrivateSlots()
+ { return toUtf8(m_translator->trPrivateSlots()); }
+ QCString trStaticPrivateMembers()
+ { return toUtf8(m_translator->trStaticPrivateMembers()); }
+ QCString trWriteList(int numEntries)
+ { return toUtf8(m_translator->trWriteList(numEntries)); }
+ QCString trInheritsList(int numEntries)
+ { return toUtf8(m_translator->trInheritsList(numEntries)); }
+ QCString trInheritedByList(int numEntries)
+ { return toUtf8(m_translator->trInheritedByList(numEntries)); }
+ QCString trReimplementedFromList(int numEntries)
+ { return toUtf8(m_translator->trReimplementedFromList(numEntries)); }
+ QCString trReimplementedInList(int numEntries)
+ { return toUtf8(m_translator->trReimplementedInList(numEntries)); }
+ QCString trNamespaceMembers()
+ { return toUtf8(m_translator->trNamespaceMembers()); }
+ QCString trNamespaceMemberDescription(bool extractAll)
+ { return toUtf8(m_translator->trNamespaceMemberDescription(extractAll)); }
+
+ QCString trNamespaceIndex()
+ { return toUtf8(m_translator->trNamespaceIndex()); }
+ QCString trNamespaceDocumentation()
+ { return toUtf8(m_translator->trNamespaceDocumentation()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNamespaces()
+ { return toUtf8(m_translator->trNamespaces()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { return toUtf8(m_translator->trGeneratedFromFiles(compType,single)); }
+
+
+ QCString trAlphabeticalList()
+ { return toUtf8(m_translator->trAlphabeticalList()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trReturnValues()
+ { return toUtf8(m_translator->trReturnValues()); }
+ QCString trMainPage()
+ { return toUtf8(m_translator->trMainPage()); }
+ QCString trPageAbbreviation()
+ { return toUtf8(m_translator->trPageAbbreviation()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDefinedAtLineInSourceFile()
+ { return toUtf8(m_translator->trDefinedAtLineInSourceFile()); }
+ QCString trDefinedInSourceFile()
+ { return toUtf8(m_translator->trDefinedInSourceFile()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDeprecated()
+ { return toUtf8(m_translator->trDeprecated()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trCollaborationDiagram(const char *clName)
+ { return toUtf8(m_translator->trCollaborationDiagram(fromUtf8(clName))); }
+ QCString trInclDepGraph(const char *fName)
+ { return toUtf8(m_translator->trInclDepGraph(fromUtf8(fName))); }
+ QCString trConstructorDocumentation()
+ { return toUtf8(m_translator->trConstructorDocumentation()); }
+ QCString trGotoSourceCode()
+ { return toUtf8(m_translator->trGotoSourceCode()); }
+ QCString trGotoDocumentation()
+ { return toUtf8(m_translator->trGotoDocumentation()); }
+ QCString trPrecondition()
+ { return toUtf8(m_translator->trPrecondition()); }
+ QCString trPostcondition()
+ { return toUtf8(m_translator->trPostcondition()); }
+ QCString trInvariant()
+ { return toUtf8(m_translator->trInvariant()); }
+ QCString trInitialValue()
+ { return toUtf8(m_translator->trInitialValue()); }
+ QCString trCode()
+ { return toUtf8(m_translator->trCode()); }
+
+ QCString trGraphicalHierarchy()
+ { return toUtf8(m_translator->trGraphicalHierarchy()); }
+ QCString trGotoGraphicalHierarchy()
+ { return toUtf8(m_translator->trGotoGraphicalHierarchy()); }
+ QCString trGotoTextualHierarchy()
+ { return toUtf8(m_translator->trGotoTextualHierarchy()); }
+ QCString trPageIndex()
+ { return toUtf8(m_translator->trPageIndex()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trNote()
+ { return toUtf8(m_translator->trNote()); }
+ QCString trPublicTypes()
+ { return toUtf8(m_translator->trPublicTypes()); }
+ QCString trPublicAttribs()
+ { return toUtf8(m_translator->trPublicAttribs()); }
+ QCString trStaticPublicAttribs()
+ { return toUtf8(m_translator->trStaticPublicAttribs()); }
+ QCString trProtectedTypes()
+ { return toUtf8(m_translator->trProtectedTypes()); }
+ QCString trProtectedAttribs()
+ { return toUtf8(m_translator->trProtectedAttribs()); }
+ QCString trStaticProtectedAttribs()
+ { return toUtf8(m_translator->trStaticProtectedAttribs()); }
+ QCString trPrivateTypes()
+ { return toUtf8(m_translator->trPrivateTypes()); }
+ QCString trPrivateAttribs()
+ { return toUtf8(m_translator->trPrivateAttribs()); }
+ QCString trStaticPrivateAttribs()
+ { return toUtf8(m_translator->trStaticPrivateAttribs()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trTodo()
+ { return toUtf8(m_translator->trTodo()); }
+ QCString trTodoList()
+ { return toUtf8(m_translator->trTodoList()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trReferencedBy()
+ { return toUtf8(m_translator->trReferencedBy()); }
+ QCString trRemarks()
+ { return toUtf8(m_translator->trRemarks()); }
+ QCString trAttention()
+ { return toUtf8(m_translator->trAttention()); }
+ QCString trInclByDepGraph()
+ { return toUtf8(m_translator->trInclByDepGraph()); }
+ QCString trSince()
+ { return toUtf8(m_translator->trSince()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trLegendTitle()
+ { return toUtf8(m_translator->trLegendTitle()); }
+ QCString trLegendDocs()
+ { return toUtf8(m_translator->trLegendDocs()); }
+ QCString trLegend()
+ { return toUtf8(m_translator->trLegend()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trTest()
+ { return toUtf8(m_translator->trTest()); }
+ QCString trTestList()
+ { return toUtf8(m_translator->trTestList()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDCOPMethods()
+ { return toUtf8(m_translator->trDCOPMethods()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trProperties()
+ { return toUtf8(m_translator->trProperties()); }
+ QCString trPropertyDocumentation()
+ { return toUtf8(m_translator->trPropertyDocumentation()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trClasses()
+ { return toUtf8(m_translator->trClasses()); }
+ QCString trPackage(const char *name)
+ { return toUtf8(m_translator->trPackage(fromUtf8(name))); }
+ QCString trPackageList()
+ { return toUtf8(m_translator->trPackageList()); }
+ QCString trPackageListDescription()
+ { return toUtf8(m_translator->trPackageListDescription()); }
+ QCString trPackages()
+ { return toUtf8(m_translator->trPackages()); }
+ QCString trDefineValue()
+ { return toUtf8(m_translator->trDefineValue()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trBug()
+ { return toUtf8(m_translator->trBug()); }
+ QCString trBugList()
+ { return toUtf8(m_translator->trBugList()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trRTFansicp()
+ { return toUtf8(m_translator->trRTFansicp()); }
+ QCString trRTFCharSet()
+ { return toUtf8(m_translator->trRTFCharSet()); }
+ QCString trRTFGeneralIndex()
+ { return toUtf8(m_translator->trRTFGeneralIndex()); }
+
+ // Translation of the word
+
+ QCString trClass(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trClass(first_capital,singular)); }
+ QCString trFile(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trFile(first_capital,singular)); }
+ QCString trNamespace(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trNamespace(first_capital,singular)); }
+
+ QCString trGroup(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trGroup(first_capital,singular)); }
+ QCString trPage(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trPage(first_capital,singular)); }
+ QCString trMember(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trMember(first_capital,singular)); }
+ QCString trGlobal(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trGlobal(first_capital,singular)); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trAuthor(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trAuthor(first_capital,singular)); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trReferences()
+ { return toUtf8(m_translator->trReferences()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trImplementedFromList(int numEntries)
+ { return toUtf8(m_translator->trImplementedFromList(numEntries)); }
+ QCString trImplementedInList(int numEntries)
+ { return toUtf8(m_translator->trImplementedInList(numEntries)); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trRTFTableOfContents()
+ { return toUtf8(m_translator->trRTFTableOfContents()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDeprecatedList()
+ { return toUtf8(m_translator->trDeprecatedList()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trEvents()
+ { return toUtf8(m_translator->trEvents()); }
+ QCString trEventDocumentation()
+ { return toUtf8(m_translator->trEventDocumentation()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trPackageTypes()
+ { return toUtf8(m_translator->trPackageTypes()); }
+ QCString trPackageMembers()
+ { return toUtf8(m_translator->trPackageMembers()); }
+ QCString trStaticPackageMembers()
+ { return toUtf8(m_translator->trStaticPackageMembers()); }
+ QCString trPackageAttribs()
+ { return toUtf8(m_translator->trPackageAttribs()); }
+ QCString trStaticPackageAttribs()
+ { return toUtf8(m_translator->trStaticPackageAttribs()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trAll()
+ { return toUtf8(m_translator->trAll()); }
+ QCString trCallGraph()
+ { return toUtf8(m_translator->trCallGraph()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trSearchForIndex()
+ { return toUtf8(m_translator->trSearchForIndex()); }
+ QCString trSearchResultsTitle()
+ { return toUtf8(m_translator->trSearchResultsTitle()); }
+ QCString trSearchResults(int numDocuments)
+ { return toUtf8(m_translator->trSearchResults(numDocuments)); }
+ QCString trSearchMatches()
+ { return toUtf8(m_translator->trSearchMatches()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trSourceFile(QCString& filename)
+ { return toUtf8(m_translator->trSourceFile(filename)); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDirIndex()
+ { return toUtf8(m_translator->trDirIndex()); }
+ QCString trDirDocumentation()
+ { return toUtf8(m_translator->trDirDocumentation()); }
+ QCString trDirectories()
+ { return toUtf8(m_translator->trDirectories()); }
+ QCString trDirDescription()
+ { return toUtf8(m_translator->trDirDescription()); }
+ QCString trDirReference(const char *dirName)
+ { return toUtf8(m_translator->trDirReference(fromUtf8(dirName))); }
+ QCString trDir(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trDir(first_capital,singular)); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trOverloadText()
+ { return toUtf8(m_translator->trOverloadText()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trCallerGraph()
+ { return toUtf8(m_translator->trCallerGraph()); }
+ QCString trEnumerationValueDocumentation()
+ { return toUtf8(m_translator->trEnumerationValueDocumentation()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trMemberFunctionDocumentationFortran()
+ { return toUtf8(m_translator->trMemberFunctionDocumentationFortran()); }
+ QCString trCompoundListFortran()
+ { return toUtf8(m_translator->trCompoundListFortran()); }
+ QCString trCompoundMembersFortran()
+ { return toUtf8(m_translator->trCompoundMembersFortran()); }
+ QCString trCompoundListDescriptionFortran()
+ { return toUtf8(m_translator->trCompoundListDescriptionFortran()); }
+ QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ { return toUtf8(m_translator->trCompoundMembersDescriptionFortran(extractAll)); }
+ QCString trCompoundIndexFortran()
+ { return toUtf8(m_translator->trCompoundIndexFortran()); }
+ QCString trTypeDocumentation()
+ { return toUtf8(m_translator->trTypeDocumentation()); }
+ QCString trSubprograms()
+ { return toUtf8(m_translator->trSubprograms()); }
+ QCString trSubprogramDocumentation()
+ { return toUtf8(m_translator->trSubprogramDocumentation()); }
+ QCString trDataTypes()
+ { return toUtf8(m_translator->trDataTypes()); }
+ QCString trModulesList()
+ { return toUtf8(m_translator->trModulesList()); }
+ QCString trModulesListDescription(bool extractAll)
+ { return toUtf8(m_translator->trModulesListDescription(extractAll)); }
+ QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ { return toUtf8(m_translator->trCompoundReferenceFortran(fromUtf8(clName),compType,isTemplate)); }
+ QCString trModuleReference(const char *namespaceName)
+ { return toUtf8(m_translator->trModuleReference(fromUtf8(namespaceName))); }
+ QCString trModulesMembers()
+ { return toUtf8(m_translator->trModulesMembers()); }
+ QCString trModulesMemberDescription(bool extractAll)
+ { return toUtf8(m_translator->trModulesMemberDescription(extractAll)); }
+ QCString trModulesIndex()
+ { return toUtf8(m_translator->trModulesIndex()); }
+ QCString trModule(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trModule(first_capital,singular)); }
+ QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ { return toUtf8(m_translator->trGeneratedFromFilesFortran(compType,single)); }
+ QCString trType(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trType(first_capital,singular)); }
+ QCString trSubprogram(bool first_capital, bool singular)
+ { return toUtf8(m_translator->trSubprogram(first_capital,singular)); }
+ QCString trTypeConstraints()
+ { return toUtf8(m_translator->trTypeConstraints()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDirRelation(const char *name)
+ { return toUtf8(m_translator->trDirRelation(fromUtf8(name))); }
+ QCString trLoading()
+ { return toUtf8(m_translator->trLoading()); }
+ QCString trGlobalNamespace()
+ { return toUtf8(m_translator->trGlobalNamespace()); }
+ QCString trSearching()
+ { return toUtf8(m_translator->trSearching()); }
+ QCString trNoMatches()
+ { return toUtf8(m_translator->trNoMatches()); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trDirDependency(const char *name)
+ { return toUtf8(m_translator->trDirDependency(fromUtf8(name))); }
+ QCString trFileIn(const char *name)
+ { return toUtf8(m_translator->trFileIn(fromUtf8(name))); }
+ QCString trIncludesFileIn(const char *name)
+ { return toUtf8(m_translator->trIncludesFileIn(fromUtf8(name))); }
+ QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,bool includeTime)
+ { return toUtf8(m_translator->trDateTime(year,month,day,dayOfWeek,
+ hour,minutes,seconds,includeTime));
+ }
+
+
+//////////////////////////////////////////////////////////////////////////
+ private:
+ Translator *m_translator;
+ void *m_toUtf8;
+ void *m_fromUtf8;
+
+};
+
+#endif
diff --git a/src/util.cpp b/src/util.cpp
new file mode 100644
index 0000000..ecc1b34
--- /dev/null
+++ b/src/util.cpp
@@ -0,0 +1,6985 @@
+/*****************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <errno.h>
+#include <math.h>
+
+#include "md5.h"
+
+#include "qtbc.h"
+#include <qregexp.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+#include <qdatetime.h>
+#include <qcache.h>
+
+#include "util.h"
+#include "message.h"
+#include "classdef.h"
+#include "filedef.h"
+#include "doxygen.h"
+#include "outputlist.h"
+#include "defargs.h"
+#include "language.h"
+#include "config.h"
+#include "htmlhelp.h"
+#include "example.h"
+#include "version.h"
+#include "groupdef.h"
+#include "reflist.h"
+#include "pagedef.h"
+#include "debug.h"
+#include "searchindex.h"
+#include "doxygen.h"
+#include "textdocvisitor.h"
+#include "portable.h"
+#include "parserintf.h"
+#include "bufstr.h"
+#include "image.h"
+
+#define ENABLE_TRACINGSUPPORT 0
+
+#if defined(_OS_MAC_) && ENABLE_TRACINGSUPPORT
+#define TRACINGSUPPORT
+#endif
+
+#ifdef TRACINGSUPPORT
+#include <execinfo.h>
+#include <unistd.h>
+#endif
+
+
+//------------------------------------------------------------------------
+
+// selects one of the name to sub-dir mapping algorithms that is used
+// to select a sub directory when CREATE_SUBDIRS is set to YES.
+
+#define ALGO_COUNT 1
+#define ALGO_CRC16 2
+#define ALGO_MD5 3
+
+//#define MAP_ALGO ALGO_COUNT
+//#define MAP_ALGO ALGO_CRC16
+#define MAP_ALGO ALGO_MD5
+
+#define REL_PATH_TO_ROOT "../../"
+
+//------------------------------------------------------------------------
+// TextGeneratorOLImpl implementation
+//------------------------------------------------------------------------
+
+TextGeneratorOLImpl::TextGeneratorOLImpl(OutputDocInterface &od) : m_od(od)
+{
+}
+
+void TextGeneratorOLImpl::writeString(const char *s,bool keepSpaces) const
+{
+ if (keepSpaces)
+ {
+ const char *p=s;
+ if (p)
+ {
+ char cs[2];
+ char c;
+ cs[1]='\0';
+ while ((c=*p++))
+ {
+ if (c==' ') m_od.writeNonBreakableSpace(1);
+ else cs[0]=c,m_od.docify(cs);
+ }
+ }
+ }
+ else
+ {
+ m_od.docify(s);
+ }
+}
+
+void TextGeneratorOLImpl::writeBreak() const
+{
+ m_od.pushGeneratorState();
+ m_od.disableAllBut(OutputGenerator::Html);
+ m_od.lineBreak("typebreak");
+ m_od.popGeneratorState();
+}
+
+void TextGeneratorOLImpl::writeLink(const char *extRef,const char *file,
+ const char *anchor,const char *text
+ ) const
+{
+ m_od.writeObjectLink(extRef,file,anchor,text);
+}
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+// an inheritance tree of depth of 100000 should be enough for everyone :-)
+const int maxInheritanceDepth = 100000;
+
+/*!
+ Removes all anonymous scopes from string s
+ Possible examples:
+\verbatim
+ "bla::@10::blep" => "bla::blep"
+ "bla::@10::@11::blep" => "bla::blep"
+ "@10::blep" => "blep"
+ " @10::blep" => "blep"
+ "@9::@10::blep" => "blep"
+ "bla::@1" => "bla"
+ "bla::@1::@2" => "bla"
+ "bla @1" => "bla"
+\endverbatim
+ */
+QCString removeAnonymousScopes(const QCString &s)
+{
+ QCString result;
+ if (s.isEmpty()) return result;
+ static QRegExp re("[ :]*@[0-9]+[: ]*");
+ int i,l,sl=s.length();
+ int p=0;
+ while ((i=re.match(s,p,&l))!=-1)
+ {
+ result+=s.mid(p,i-p);
+ int c=i;
+ bool b1=FALSE,b2=FALSE;
+ while (c<i+l && s.at(c)!='@') if (s.at(c++)==':') b1=TRUE;
+ c=i+l-1;
+ while (c>=i && s.at(c)!='@') if (s.at(c--)==':') b2=TRUE;
+ if (b1 && b2)
+ {
+ result+="::";
+ }
+ p=i+l;
+ }
+ result+=s.right(sl-p);
+ //printf("removeAnonymousScopes(`%s')=`%s'\n",s.data(),result.data());
+ return result;
+}
+
+// replace anonymous scopes with __anonymous__ or replacement if provided
+QCString replaceAnonymousScopes(const QCString &s,const char *replacement)
+{
+ QCString result;
+ if (s.isEmpty()) return result;
+ static QRegExp re("@[0-9]+");
+ int i,l,sl=s.length();
+ int p=0;
+ while ((i=re.match(s,p,&l))!=-1)
+ {
+ result+=s.mid(p,i-p);
+ if (replacement)
+ {
+ result+=replacement;
+ }
+ else
+ {
+ result+="__anonymous__";
+ }
+ p=i+l;
+ }
+ result+=s.right(sl-p);
+ //printf("replaceAnonymousScopes(`%s')=`%s'\n",s.data(),result.data());
+ return result;
+}
+
+
+// strip anonymous left hand side part of the scope
+QCString stripAnonymousNamespaceScope(const QCString &s)
+{
+ int i,p=0,l;
+ QCString newScope;
+ while ((i=getScopeFragment(s,p,&l))!=-1)
+ {
+ //printf("Scope fragment %s\n",s.mid(i,l).data());
+ if (Doxygen::namespaceSDict->find(s.left(i+l))!=0)
+ {
+ if (s.at(i)!='@')
+ {
+ if (!newScope.isEmpty()) newScope+="::";
+ newScope+=s.mid(i,l);
+ }
+ }
+ else
+ {
+ if (!newScope.isEmpty()) newScope+="::";
+ newScope+=s.right(s.length()-i);
+ goto done;
+ }
+ p=i+l;
+ }
+done:
+ //printf("stripAnonymousNamespaceScope(`%s')=`%s'\n",s.data(),newScope.data());
+ return newScope;
+}
+
+void writePageRef(OutputDocInterface &od,const char *cn,const char *mn)
+{
+ od.pushGeneratorState();
+
+ od.disable(OutputGenerator::Html);
+ od.disable(OutputGenerator::Man);
+ if (Config_getBool("PDF_HYPERLINKS")) od.disable(OutputGenerator::Latex);
+ if (Config_getBool("RTF_HYPERLINKS")) od.disable(OutputGenerator::RTF);
+ od.startPageRef();
+ od.docify(theTranslator->trPageAbbreviation());
+ od.endPageRef(cn,mn);
+
+ od.popGeneratorState();
+}
+
+/*! Generate a place holder for a position in a list. Used for
+ * translators to be able to specify different elements orders
+ * depending on whether text flows from left to right or visa versa.
+ */
+QCString generateMarker(int id)
+{
+ QCString result;
+ result.sprintf("@%d",id);
+ return result;
+}
+
+static QCString stripFromPath(const QCString &path,QStrList &l)
+{
+ // look at all the strings in the list and strip the longest match
+ const char *s=l.first();
+ QCString potential;
+ unsigned int length = 0;
+ while (s)
+ {
+ QCString prefix = s;
+ if (prefix.length() > length &&
+ stricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare
+ {
+ length = prefix.length();
+ potential = path.right(path.length()-prefix.length());
+ }
+ s = l.next();
+ }
+ if (length) return potential;
+ return path;
+}
+
+/*! strip part of \a path if it matches
+ * one of the paths in the Config_getList("STRIP_FROM_PATH") list
+ */
+QCString stripFromPath(const QCString &path)
+{
+ return stripFromPath(path,Config_getList("STRIP_FROM_PATH"));
+}
+
+/*! strip part of \a path if it matches
+ * one of the paths in the Config_getList("INCLUDE_PATH") list
+ */
+QCString stripFromIncludePath(const QCString &path)
+{
+ return stripFromPath(path,Config_getList("STRIP_FROM_INC_PATH"));
+}
+
+/*! try to determine if \a name is a source or a header file name by looking
+ * at the extension. A number of variations is allowed in both upper and
+ * lower case) If anyone knows or uses another extension please let me know :-)
+ */
+int guessSection(const char *name)
+{
+ QCString n=((QCString)name).lower();
+ if (n.right(2)==".c" || // source
+ n.right(3)==".cc" ||
+ n.right(4)==".cxx" ||
+ n.right(4)==".cpp" ||
+ n.right(4)==".c++" ||
+ n.right(5)==".java" ||
+ n.right(3)==".ii" || // inline
+ n.right(4)==".ixx" ||
+ n.right(4)==".ipp" ||
+ n.right(4)==".i++" ||
+ n.right(4)==".inl" ||
+ n.right(4)==".xml"
+ ) return Entry::SOURCE_SEC;
+ if (n.right(2)==".h" || // header
+ n.right(3)==".hh" ||
+ n.right(4)==".hxx" ||
+ n.right(4)==".hpp" ||
+ n.right(4)==".h++" ||
+ n.right(4)==".idl" ||
+ n.right(4)==".ddl" ||
+ n.right(5)==".pidl"
+ ) return Entry::HEADER_SEC;
+ return 0;
+}
+
+QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
+ Definition **typedefContext)
+{
+ //printf("<<resolveTypeDef(%s,%s)\n",
+ // context ? context->name().data() : "<none>",qualifiedName.data());
+ QCString result;
+ if (qualifiedName.isEmpty())
+ {
+ //printf(" qualified name empty!\n");
+ return result;
+ }
+
+ Definition *mContext=context;
+ if (typedefContext) *typedefContext=context;
+
+ // see if the qualified name has a scope part
+ int scopeIndex = qualifiedName.findRev("::");
+ QCString resName=qualifiedName;
+ if (scopeIndex!=-1) // strip scope part for the name
+ {
+ resName=qualifiedName.right(qualifiedName.length()-scopeIndex-2);
+ if (resName.isEmpty())
+ {
+ // qualifiedName was of form A:: !
+ //printf(" qualified name of form A::!\n");
+ return result;
+ }
+ }
+ MemberDef *md=0;
+ while (mContext && md==0)
+ {
+ // step 1: get the right scope
+ Definition *resScope=mContext;
+ if (scopeIndex!=-1)
+ {
+ // split-off scope part
+ QCString resScopeName = qualifiedName.left(scopeIndex);
+ //printf("resScopeName=`%s'\n",resScopeName.data());
+
+ // look-up scope in context
+ int is,ps=0;
+ int l;
+ while ((is=getScopeFragment(resScopeName,ps,&l))!=-1)
+ {
+ QCString qualScopePart = resScopeName.mid(is,l);
+ QCString tmp = resolveTypeDef(mContext,qualScopePart);
+ if (!tmp.isEmpty()) qualScopePart=tmp;
+ resScope = resScope->findInnerCompound(qualScopePart);
+ //printf("qualScopePart=`%s' resScope=%p\n",qualScopePart.data(),resScope);
+ if (resScope==0) break;
+ ps=is+l;
+ }
+ }
+ //printf("resScope=%s\n",resScope?resScope->name().data():"<none>");
+
+ // step 2: get the member
+ if (resScope) // no scope or scope found in the current context
+ {
+ //printf("scope found: %s, look for typedef %s\n",
+ // resScope->qualifiedName().data(),resName.data());
+ MemberNameSDict *mnd=0;
+ if (resScope->definitionType()==Definition::TypeClass)
+ {
+ mnd=Doxygen::memberNameSDict;
+ }
+ else
+ {
+ mnd=Doxygen::functionNameSDict;
+ }
+ MemberName *mn=mnd->find(resName);
+ if (mn)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *tmd=0;
+ int minDist=-1;
+ for (;(tmd=mni.current());++mni)
+ {
+ //printf("Found member %s resScope=%s outerScope=%s mContext=%p\n",
+ // tmd->name().data(), resScope->name().data(),
+ // tmd->getOuterScope()->name().data(), mContext);
+ if (tmd->isTypedef() /*&& tmd->getOuterScope()==resScope*/)
+ {
+ int dist=isAccessibleFrom(resScope,0,tmd);
+ if (dist!=-1 && (md==0 || dist<minDist))
+ {
+ md = tmd;
+ minDist = dist;
+ }
+ }
+ }
+ }
+ }
+ mContext=mContext->getOuterScope();
+ }
+
+ // step 3: get the member's type
+ if (md)
+ {
+ //printf(">>resolveTypeDef: Found typedef name `%s' in scope `%s' value=`%s' args='%s'\n",
+ // qualifiedName.data(),context->name().data(),md->typeString(),md->argsString()
+ // );
+ result=md->typeString();
+ QString args = md->argsString();
+ if (args.find(")(")!=-1) // typedef of a function/member pointer
+ {
+ result+=args;
+ }
+ else if (args.find('[')!=-1) // typedef of an array
+ {
+ result+=args;
+ }
+ if (typedefContext) *typedefContext=md->getOuterScope();
+ }
+ else
+ {
+ //printf(">>resolveTypeDef: Typedef `%s' not found in scope `%s'!\n",
+ // qualifiedName.data(),context ? context->name().data() : "<global>");
+ }
+ return result;
+
+}
+
+
+/*! Get a class definition given its name.
+ * Returns 0 if the class is not found.
+ */
+ClassDef *getClass(const char *name)
+{
+ if (name==0 || name[0]=='\0') return 0;
+ return Doxygen::classSDict->find(name);
+}
+
+NamespaceDef *getResolvedNamespace(const char *name)
+{
+ if (name==0 || name[0]=='\0') return 0;
+ QCString *subst = Doxygen::namespaceAliasDict[name];
+ if (subst)
+ {
+ int count=0; // recursion detection guard
+ QCString *newSubst;
+ while ((newSubst=Doxygen::namespaceAliasDict[*subst]) && count<10)
+ {
+ subst=newSubst;
+ count++;
+ }
+ if (count==10)
+ {
+ err("warning: possible recursive namespace alias detected for %s!\n",name);
+ }
+ return Doxygen::namespaceSDict->find(subst->data());
+ }
+ else
+ {
+ return Doxygen::namespaceSDict->find(name);
+ }
+}
+
+static QDict<MemberDef> g_resolvedTypedefs;
+static QDict<Definition> g_visitedNamespaces;
+
+// forward declaration
+ClassDef *getResolvedClassRec(Definition *scope,
+ FileDef *fileScope,
+ const char *n,
+ MemberDef **pTypeDef,
+ QCString *pTemplSpec,
+ QCString *pResolvedType
+ );
+int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,Definition *item,
+ const QCString &explicitScopePart);
+
+/*! Returns the class representing the value of the typedef represented by \a md
+ * within file \a fileScope.
+ *
+ * Example: typedef A T; will return the class representing A if it is a class.
+ *
+ * Example: typedef int T; will return 0, since "int" is not a class.
+ */
+ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,
+ MemberDef **pMemType,QCString *pTemplSpec,
+ QCString *pResolvedType,
+ ArgumentList *actTemplParams)
+{
+ //printf("newResolveTypedef(md=%p,cachedVal=%p)\n",md,md->getCachedTypedefVal());
+ bool isCached = md->isTypedefValCached(); // value already cached
+ if (isCached)
+ {
+ //printf("Already cached %s->%s [%s]\n",
+ // md->name().data(),
+ // md->getCachedTypedefVal()?md->getCachedTypedefVal()->name().data():"<none>",
+ // md->getCachedResolvedTypedef()?md->getCachedResolvedTypedef().data():"<none>");
+
+ if (pTemplSpec) *pTemplSpec = md->getCachedTypedefTemplSpec();
+ if (pResolvedType) *pResolvedType = md->getCachedResolvedTypedef();
+ return md->getCachedTypedefVal();
+ }
+ //printf("new typedef\n");
+ QCString qname = md->qualifiedName();
+ if (g_resolvedTypedefs.find(qname)) return 0; // typedef already done
+
+ g_resolvedTypedefs.insert(qname,md); // put on the trace list
+
+ ClassDef *typeClass = md->getClassDef();
+ QCString type = md->typeString(); // get the "value" of the typedef
+ if (typeClass && typeClass->isTemplate() &&
+ actTemplParams && actTemplParams->count()>0)
+ {
+ type = substituteTemplateArgumentsInString(type,
+ typeClass->templateArguments(),actTemplParams);
+ }
+ QCString typedefValue = type;
+ int tl=type.length();
+ int ip=tl-1; // remove * and & at the end
+ while (ip>=0 && (type.at(ip)=='*' || type.at(ip)=='&' || type.at(ip)==' '))
+ {
+ ip--;
+ }
+ type=type.left(ip+1);
+ type.stripPrefix("const "); // strip leading "const"
+ type.stripPrefix("struct "); // strip leading "struct"
+ type.stripPrefix("union "); // strip leading "union"
+ int sp=0;
+ tl=type.length(); // length may have been changed
+ while (sp<tl && type.at(sp)==' ') sp++;
+ MemberDef *memTypeDef = 0;
+ ClassDef *result = getResolvedClassRec(md->getOuterScope(),
+ fileScope,type,&memTypeDef,0,pResolvedType);
+ // if type is a typedef then return what it resolves to.
+ if (memTypeDef && memTypeDef->isTypedef())
+ {
+ result=newResolveTypedef(fileScope,memTypeDef,pMemType,pTemplSpec);
+ goto done;
+ }
+ else if (memTypeDef && memTypeDef->isEnumerate() && pMemType)
+ {
+ *pMemType = memTypeDef;
+ }
+
+ //printf("type=%s result=%p\n",type.data(),result);
+ if (result==0)
+ {
+ // try unspecialized version if type is template
+ int si=type.findRev("::");
+ int i=type.find('<');
+ if (si==-1 && i!=-1) // typedef of a template => try the unspecialized version
+ {
+ if (pTemplSpec) *pTemplSpec = type.mid(i);
+ result = getResolvedClassRec(md->getOuterScope(),fileScope,
+ type.left(i),0,0,pResolvedType);
+ //printf("result=%p pRresolvedType=%s sp=%d ip=%d tl=%d\n",
+ // result,pResolvedType?pResolvedType->data():"<none>",sp,ip,tl);
+ }
+ else if (si!=-1) // A::B
+ {
+ i=type.find('<',si);
+ if (i==-1) // Something like A<T>::B => lookup A::B
+ {
+ i=type.length();
+ }
+ else // Something like A<T>::B<S> => lookup A::B, spec=<S>
+ {
+ if (pTemplSpec) *pTemplSpec = type.mid(i);
+ }
+ result = getResolvedClassRec(md->getOuterScope(),fileScope,
+ stripTemplateSpecifiersFromScope(type.left(i),FALSE),0,0,
+ pResolvedType);
+ }
+
+ //if (result) ip=si+sp+1;
+ }
+
+done:
+ if (pResolvedType)
+ {
+ if (result)
+ {
+ *pResolvedType=result->qualifiedName();
+ //printf("*pResolvedType=%s\n",pResolvedType->data());
+ if (sp>0) pResolvedType->prepend(typedefValue.left(sp));
+ if (ip<tl-1) pResolvedType->append(typedefValue.right(tl-ip-1));
+ }
+ else
+ {
+ *pResolvedType=typedefValue;
+ }
+ }
+
+ // remember computed value for next time
+ if (result && result->getDefFileName()!="<code>")
+ // this check is needed to prevent that temporary classes that are
+ // introduced while parsing code fragments are being cached here.
+ {
+ //printf("setting cached typedef %p in result %p\n",md,result);
+ //printf("==> %s (%s,%d)\n",result->name().data(),result->getDefFileName().data(),result->getDefLine());
+ //printf("*pResolvedType=%s\n",pResolvedType?pResolvedType->data():"<none>");
+ md->cacheTypedefVal(result,
+ pTemplSpec ? *pTemplSpec : QCString(),
+ pResolvedType ? *pResolvedType : QCString()
+ );
+ }
+
+ g_resolvedTypedefs.remove(qname); // remove from the trace list
+
+ return result;
+}
+
+/*! Substitutes a simple unqualified \a name within \a scope. Returns the
+ * value of the typedef or \a name if no typedef was found.
+ */
+static QCString substTypedef(Definition *scope,FileDef *fileScope,const QCString &name,
+ MemberDef **pTypeDef=0)
+{
+ QCString result=name;
+ if (name.isEmpty()) return result;
+
+ // lookup scope fragment in the symbol map
+ DefinitionIntf *di = Doxygen::symbolMap->find(name);
+ if (di==0) return result; // no matches
+
+ MemberDef *bestMatch=0;
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multi symbols
+ {
+ // search for the best match
+ DefinitionListIterator dli(*(DefinitionList*)di);
+ Definition *d;
+ int minDistance=10000; // init at "infinite"
+ for (dli.toFirst();(d=dli.current());++dli) // foreach definition
+ {
+ // only look at members
+ if (d->definitionType()==Definition::TypeMember)
+ {
+ // that are also typedefs
+ MemberDef *md = (MemberDef *)d;
+ if (md->isTypedef()) // d is a typedef
+ {
+ // test accessibility of typedef within scope.
+ int distance = isAccessibleFromWithExpScope(scope,fileScope,d,"");
+ if (distance!=-1 && distance<minDistance)
+ // definition is accessible and a better match
+ {
+ minDistance=distance;
+ bestMatch = md;
+ }
+ }
+ }
+ }
+ }
+ else if (di->definitionType()==DefinitionIntf::TypeMember) // single symbol
+ {
+ Definition *d = (Definition*)di;
+ // that are also typedefs
+ MemberDef *md = (MemberDef *)di;
+ if (md->isTypedef()) // d is a typedef
+ {
+ // test accessibility of typedef within scope.
+ int distance = isAccessibleFromWithExpScope(scope,fileScope,d,"");
+ if (distance!=-1) // definition is accessible
+ {
+ bestMatch = md;
+ }
+ }
+ }
+ if (bestMatch)
+ {
+ result = bestMatch->typeString();
+ if (pTypeDef) *pTypeDef=bestMatch;
+ }
+
+ //printf("substTypedef(%s,%s)=%s\n",scope?scope->name().data():"<global>",
+ // name.data(),result.data());
+ return result;
+}
+
+static Definition *endOfPathIsUsedClass(SDict<Definition> *cl,const QCString &localName)
+{
+ if (cl)
+ {
+ SDict<Definition>::Iterator cli(*cl);
+ Definition *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (cd->localName()==localName)
+ {
+ return cd;
+ }
+ }
+ }
+ return 0;
+}
+
+/*! Starting with scope \a start, the string \a path is interpreted as
+ * a part of a qualified scope name (e.g. A::B::C), and the scope is
+ * searched. If found the scope definition is returned, otherwise 0
+ * is returned.
+ */
+static Definition *followPath(Definition *start,FileDef *fileScope,const QCString &path)
+{
+ int is,ps;
+ int l;
+ Definition *current=start;
+ ps=0;
+ //printf("followPath: start='%s' path='%s'\n",start?start->name().data():"<none>",path.data());
+ // for each part of the explicit scope
+ while ((is=getScopeFragment(path,ps,&l))!=-1)
+ {
+ // try to resolve the part if it is a typedef
+ MemberDef *typeDef=0;
+ QCString qualScopePart = substTypedef(current,fileScope,path.mid(is,l),&typeDef);
+ //printf(" qualScopePart=%s\n",qualScopePart.data());
+ if (typeDef)
+ {
+ ClassDef *type = newResolveTypedef(fileScope,typeDef);
+ if (type)
+ {
+ //printf("Found type %s\n",type->name().data());
+ return type;
+ }
+ }
+ Definition *next = current->findInnerCompound(qualScopePart);
+ //printf("++ Looking for %s inside %s result %s\n",
+ // qualScopePart.data(),
+ // current->name().data(),
+ // next?next->name().data():"<null>");
+ if (next==0) // failed to follow the path
+ {
+ //printf("==> next==0!\n");
+ if (current->definitionType()==Definition::TypeNamespace)
+ {
+ next = endOfPathIsUsedClass(
+ ((NamespaceDef *)current)->getUsedClasses(),qualScopePart);
+ }
+ else if (current->definitionType()==Definition::TypeFile)
+ {
+ next = endOfPathIsUsedClass(
+ ((FileDef *)current)->getUsedClasses(),qualScopePart);
+ }
+ current = next;
+ if (current==0) break;
+ }
+ else // continue to follow scope
+ {
+ current = next;
+ //printf("==> current = %p\n",current);
+ }
+ ps=is+l;
+ }
+ //printf("followPath(start=%s,path=%s) result=%s\n",
+ // start->name().data(),path.data(),current?current->name().data():"<null>");
+ return current; // path could be followed
+}
+
+bool accessibleViaUsingClass(const SDict<Definition> *cl,
+ FileDef *fileScope,
+ Definition *item,
+ const QCString &explicitScopePart=""
+ )
+{
+ //printf("accessibleViaUsingClass(%p)\n",cl);
+ if (cl) // see if the class was imported via a using statement
+ {
+ SDict<Definition>::Iterator cli(*cl);
+ Definition *ucd;
+ bool explicitScopePartEmpty = explicitScopePart.isEmpty();
+ for (cli.toFirst();(ucd=cli.current());++cli)
+ {
+ //printf("Trying via used class %s\n",ucd->name().data());
+ Definition *sc = explicitScopePartEmpty ? ucd : followPath(ucd,fileScope,explicitScopePart);
+ if (sc && sc==item) return TRUE;
+ //printf("Try via used class done\n");
+ }
+ }
+ return FALSE;
+}
+
+bool accessibleViaUsingNamespace(const NamespaceSDict *nl,
+ FileDef *fileScope,
+ Definition *item,
+ const QCString &explicitScopePart="")
+{
+ static QDict<void> visitedDict;
+ if (nl) // check used namespaces for the class
+ {
+ NamespaceSDict::Iterator nli(*nl);
+ NamespaceDef *und;
+ int count=0;
+ for (nli.toFirst();(und=nli.current());++nli,count++)
+ {
+ //printf("[Trying via used namespace %s: count=%d/%d\n",und->name().data(),
+ // count,nl->count());
+ Definition *sc = explicitScopePart.isEmpty() ? und : followPath(und,fileScope,explicitScopePart);
+ if (sc && item->getOuterScope()==sc)
+ {
+ //printf("] found it\n");
+ return TRUE;
+ }
+ QCString key=und->name();
+ if (und->getUsedNamespaces() && visitedDict.find(key)==0)
+ {
+ visitedDict.insert(key,(void *)0x08);
+
+ if (accessibleViaUsingNamespace(und->getUsedNamespaces(),fileScope,item,explicitScopePart))
+ {
+ //printf("] found it via recursion\n");
+ return TRUE;
+ }
+
+ visitedDict.remove(key);
+ }
+ //printf("] Try via used namespace done\n");
+ }
+ }
+ return FALSE;
+}
+
+
+/* Returns the "distance" (=number of levels up) from item to scope, or -1
+ * if item in not inside scope.
+ */
+int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item)
+{
+ //printf("<isAccesibleFrom(scope=%s,item=%s itemScope=%s)\n",
+ // scope->name().data(),item->name().data(),item->getOuterScope()->name().data());
+
+ QCString key(40);
+ key.sprintf("%p:%p:%p",scope,fileScope,item);
+ static QDict<void> visitedDict;
+ if (visitedDict.find(key))
+ {
+ //printf("> already found\n");
+ return -1; // already looked at this
+ }
+ visitedDict.insert(key,(void *)0x8);
+
+ int result=0; // assume we found it
+ int i;
+
+ Definition *itemScope=item->getOuterScope();
+
+ if (
+ itemScope==scope || // same thing
+ (item->definitionType()==Definition::TypeMember && // a member
+ itemScope && itemScope->definitionType()==Definition::TypeClass && // of a class
+ scope->definitionType()==Definition::TypeClass && // accessible
+ ((ClassDef*)scope)->isAccessibleMember((MemberDef *)item) // from scope
+ ) ||
+ (item->definitionType()==Definition::TypeClass && // a nested class
+ itemScope && itemScope->definitionType()==Definition::TypeClass && // inside a base
+ scope->definitionType()==Definition::TypeClass && // class of scope
+ ((ClassDef*)scope)->isBaseClass((ClassDef*)itemScope,TRUE)
+ )
+ )
+ {
+ //printf("> found it\n");
+ }
+ else if (scope==Doxygen::globalScope)
+ {
+ if (fileScope)
+ {
+ SDict<Definition> *cl = fileScope->getUsedClasses();
+ if (accessibleViaUsingClass(cl,fileScope,item))
+ {
+ //printf("> found via used class\n");
+ goto done;
+ }
+ NamespaceSDict *nl = fileScope->getUsedNamespaces();
+ if (accessibleViaUsingNamespace(nl,fileScope,item))
+ {
+ //printf("> found via used namespace\n");
+ goto done;
+ }
+ }
+ //printf("> reached global scope\n");
+ result=-1; // not found in path to globalScope
+ }
+ else // keep searching
+ {
+ // check if scope is a namespace, which is using other classes and namespaces
+ if (scope->definitionType()==Definition::TypeNamespace)
+ {
+ NamespaceDef *nscope = (NamespaceDef*)scope;
+ //printf(" %s is namespace with %d used classes\n",nscope->name().data(),nscope->getUsedClasses());
+ SDict<Definition> *cl = nscope->getUsedClasses();
+ if (accessibleViaUsingClass(cl,fileScope,item))
+ {
+ //printf("> found via used class\n");
+ goto done;
+ }
+ NamespaceSDict *nl = nscope->getUsedNamespaces();
+ if (accessibleViaUsingNamespace(nl,fileScope,item))
+ {
+ //printf("> found via used namespace\n");
+ goto done;
+ }
+ }
+ // repeat for the parent scope
+ i=isAccessibleFrom(scope->getOuterScope(),fileScope,item);
+ //printf("> result=%d\n",i);
+ result= (i==-1) ? -1 : i+2;
+ }
+done:
+ visitedDict.remove(key);
+ //Doxygen::lookupCache.insert(key,new int(result));
+ return result;
+}
+
+
+/* Returns the "distance" (=number of levels up) from item to scope, or -1
+ * if item in not in this scope. The explicitScopePart limits the search
+ * to scopes that match \a scope (or its parent scope(s)) plus the explicit part.
+ * Example:
+ *
+ * class A { public: class I {}; };
+ * class B { public: class J {}; };
+ *
+ * - Looking for item=='J' inside scope=='B' will return 0.
+ * - Looking for item=='I' inside scope=='B' will return -1
+ * (as it is not found in B nor in the global scope).
+ * - Looking for item=='A::I' inside scope=='B', first the match B::A::I is tried but
+ * not found and then A::I is searched in the global scope, which matches and
+ * thus the result is 1.
+ */
+int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,
+ Definition *item,const QCString &explicitScopePart)
+{
+ if (explicitScopePart.isEmpty())
+ {
+ // handle degenerate case where there is no explicit scope.
+ return isAccessibleFrom(scope,fileScope,item);
+ }
+
+ QCString key(40+explicitScopePart.length());
+ key.sprintf("%p:%p:%p:%s",scope,fileScope,item,explicitScopePart.data());
+ static QDict<void> visitedDict;
+ if (visitedDict.find(key))
+ {
+ //printf("Already visited!\n");
+ return -1; // already looked at this
+ }
+ visitedDict.insert(key,(void *)0x8);
+
+ //printf(" <isAccessibleFromWithExpScope(%s,%s,%s)\n",scope?scope->name().data():"<global>",
+ // item?item->name().data():"<none>",
+ // explicitScopePart.data());
+ int result=0; // assume we found it
+ Definition *newScope = followPath(scope,fileScope,explicitScopePart);
+ if (newScope) // explicitScope is inside scope => newScope is the result
+ {
+ Definition *itemScope = item->getOuterScope();
+ //printf(" scope traversal successful %s<->%s!\n",itemScope->name().data(),newScope->name().data());
+ //if (newScope && newScope->definitionType()==Definition::TypeClass)
+ //{
+ // ClassDef *cd = (ClassDef *)newScope;
+ // printf("---> Class %s: bases=%p\n",cd->name().data(),cd->baseClasses());
+ //}
+ if (itemScope==newScope) // exact match of scopes => distance==0
+ {
+ //printf("> found it\n");
+ }
+ else if (itemScope && newScope &&
+ itemScope->definitionType()==Definition::TypeClass &&
+ newScope->definitionType()==Definition::TypeClass &&
+ ((ClassDef*)newScope)->isBaseClass((ClassDef*)itemScope,TRUE,0)
+ )
+ {
+ // inheritance is also ok. Example: looking for B::I, where
+ // class A { public: class I {} };
+ // class B : public A {}
+ // but looking for B::I, where
+ // class A { public: class I {} };
+ // class B { public: class I {} };
+ // will find A::I, so we still prefer a direct match and give this one a distance of 1
+ result=1;
+
+ //printf("scope(%s) is base class of newScope(%s)\n",
+ // scope->name().data(),newScope->name().data());
+ }
+ else
+ {
+ int i=-1;
+ if (newScope->definitionType()==Definition::TypeNamespace)
+ {
+ g_visitedNamespaces.insert(newScope->name(),newScope);
+ // this part deals with the case where item is a class
+ // A::B::C but is explicit referenced as A::C, where B is imported
+ // in A via a using directive.
+ //printf("newScope is a namespace: %s!\n",newScope->name().data());
+ NamespaceDef *nscope = (NamespaceDef*)newScope;
+ SDict<Definition> *cl = nscope->getUsedClasses();
+ if (cl)
+ {
+ SDict<Definition>::Iterator cli(*cl);
+ Definition *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ //printf("Trying for class %s\n",cd->name().data());
+ if (cd==item)
+ {
+ //printf("> class is used in this scope\n");
+ goto done;
+ }
+ }
+ }
+ NamespaceSDict *nl = nscope->getUsedNamespaces();
+ if (nl)
+ {
+ NamespaceSDict::Iterator nli(*nl);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ if (g_visitedNamespaces.find(nd->name())==0)
+ {
+ //printf("Trying for namespace %s\n",nd->name().data());
+ i = isAccessibleFromWithExpScope(scope,fileScope,item,nd->name());
+ if (i!=-1)
+ {
+ //printf("> found via explicit scope of used namespace\n");
+ goto done;
+ }
+ }
+ }
+ }
+ }
+ // repeat for the parent scope
+ if (scope!=Doxygen::globalScope)
+ {
+ i = isAccessibleFromWithExpScope(scope->getOuterScope(),fileScope,
+ item,explicitScopePart);
+ }
+ //printf(" | result=%d\n",i);
+ result = (i==-1) ? -1 : i+2;
+ }
+ }
+ else // failed to resolve explicitScope
+ {
+ //printf(" failed to resolve: scope=%s\n",scope->name().data());
+ if (scope->definitionType()==Definition::TypeNamespace)
+ {
+ NamespaceDef *nscope = (NamespaceDef*)scope;
+ NamespaceSDict *nl = nscope->getUsedNamespaces();
+ if (accessibleViaUsingNamespace(nl,fileScope,item,explicitScopePart))
+ {
+ //printf("> found in used namespace\n");
+ goto done;
+ }
+ }
+ if (scope==Doxygen::globalScope)
+ {
+ if (fileScope)
+ {
+ NamespaceSDict *nl = fileScope->getUsedNamespaces();
+ if (accessibleViaUsingNamespace(nl,fileScope,item,explicitScopePart))
+ {
+ //printf("> found in used namespace\n");
+ goto done;
+ }
+ }
+ //printf("> not found\n");
+ result=-1;
+ }
+ else // continue by looking into the parent scope
+ {
+ int i=isAccessibleFromWithExpScope(scope->getOuterScope(),fileScope,
+ item,explicitScopePart);
+ //printf("> result=%d\n",i);
+ result= (i==-1) ? -1 : i+2;
+ }
+ }
+done:
+ //printf(" > result=%d\n",result);
+ visitedDict.remove(key);
+ //Doxygen::lookupCache.insert(key,new int(result));
+ return result;
+}
+
+int computeQualifiedIndex(const QCString &name)
+{
+ int i = name.find('<');
+ return name.findRev("::",i==-1 ? name.length() : i);
+}
+
+static void getResolvedSymbol(Definition *scope,
+ FileDef *fileScope,
+ Definition *d,
+ const QCString &explicitScopePart,
+ ArgumentList *actTemplParams,
+ int &minDistance,
+ ClassDef *&bestMatch,
+ MemberDef *&bestTypedef,
+ QCString &bestTemplSpec,
+ QCString &bestResolvedType
+ )
+{
+ //printf(" => found type %x name=%s d=%p\n",
+ // d->definitionType(),d->name().data(),d);
+
+ // only look at classes and members that are enums or typedefs
+ if (d->definitionType()==Definition::TypeClass ||
+ (d->definitionType()==Definition::TypeMember &&
+ (((MemberDef*)d)->isTypedef() || ((MemberDef*)d)->isEnumerate())
+ )
+ )
+ {
+ g_visitedNamespaces.clear();
+ // test accessibility of definition within scope.
+ int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart);
+ //printf(" %s; distance %s (%p) is %d\n",scope->name().data(),d->name().data(),d,distance);
+ if (distance!=-1) // definition is accessible
+ {
+ // see if we are dealing with a class or a typedef
+ if (d->definitionType()==Definition::TypeClass) // d is a class
+ {
+ ClassDef *cd = (ClassDef *)d;
+ //printf("cd=%s\n",cd->name().data());
+ if (!cd->isTemplateArgument()) // skip classes that
+ // are only there to
+ // represent a template
+ // argument
+ {
+ //printf("is not a templ arg\n");
+ if (distance<minDistance) // found a definition that is "closer"
+ {
+ minDistance=distance;
+ bestMatch = cd;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType = cd->qualifiedName();
+ }
+ else if (distance==minDistance &&
+ fileScope && bestMatch &&
+ fileScope->getUsedNamespaces() &&
+ d->getOuterScope()->definitionType()==Definition::TypeNamespace &&
+ bestMatch->getOuterScope()==Doxygen::globalScope
+ )
+ {
+ // in case the distance is equal it could be that a class X
+ // is defined in a namespace and in the global scope. When searched
+ // in the global scope the distance is 0 in both cases. We have
+ // to choose one of the definitions: we choose the one in the
+ // namespace if the fileScope imports namespaces and the definition
+ // found was in a namespace while the best match so far isn't.
+ // Just a non-perfect heuristic but it could help in some situations
+ // (kdecore code is an example).
+ minDistance=distance;
+ bestMatch = cd;
+ bestTypedef = 0;
+ bestTemplSpec.resize(0);
+ bestResolvedType = cd->qualifiedName();
+ }
+ }
+ else
+ {
+ //printf(" is a template argument!\n");
+ }
+ }
+ else if (d->definitionType()==Definition::TypeMember)
+ {
+ MemberDef *md = (MemberDef *)d;
+ //printf(" member isTypedef()=%d\n",md->isTypedef());
+ if (md->isTypedef()) // d is a typedef
+ {
+ QCString args=md->argsString();
+ if (args.isEmpty()) // do not expand "typedef t a[4];"
+ {
+ //printf(" found typedef!\n");
+
+ // we found a symbol at this distance, but if it didn't
+ // resolve to a class, we still have to make sure that
+ // something at a greater distance does not match, since
+ // that symbol is hidden by this one.
+ if (distance<minDistance)
+ {
+ QCString spec;
+ QCString type;
+ minDistance=distance;
+ MemberDef *enumType = 0;
+ ClassDef *cd = newResolveTypedef(fileScope,md,&enumType,&spec,&type,actTemplParams);
+ if (cd) // type resolves to a class
+ {
+ //printf(" bestTypeDef=%p spec=%s type=%s\n",md,spec.data(),type.data());
+ bestMatch = cd;
+ bestTypedef = md;
+ bestTemplSpec = spec;
+ bestResolvedType = type;
+ }
+ else if (enumType) // type resolves to a enum
+ {
+ //printf(" is enum\n");
+ bestMatch = 0;
+ bestTypedef = enumType;
+ bestTemplSpec = "";
+ bestResolvedType = enumType->qualifiedName();
+ }
+ else if (md->isReference()) // external reference
+ {
+ bestMatch = 0;
+ bestTypedef = md;
+ bestTemplSpec = spec;
+ bestResolvedType = type;
+ }
+ else
+ {
+ bestMatch = 0;
+ bestTypedef = md;
+ bestTemplSpec.resize(0);
+ bestResolvedType.resize(0);
+ //printf(" no match\n");
+ }
+ }
+ else
+ {
+ //printf(" not the best match %d min=%d\n",distance,minDistance);
+ }
+ }
+ else
+ {
+ //printf(" not a simple typedef\n")
+ }
+ }
+ else if (md->isEnumerate())
+ {
+ if (distance<minDistance)
+ {
+ minDistance=distance;
+ bestMatch = 0;
+ bestTypedef = md;
+ bestTemplSpec = "";
+ bestResolvedType = md->qualifiedName();
+ }
+ }
+ }
+ } // if definition accessible
+ else
+ {
+ //printf(" Not accessible!\n");
+ }
+ } // if definition is a class or member
+ //printf(" bestMatch=%p bestResolvedType=%s\n",bestMatch,bestResolvedType.data());
+}
+
+/* Find the fully qualified class name referred to by the input class
+ * or typedef name against the input scope.
+ * Loops through scope and each of its parent scopes looking for a
+ * match against the input name. Can recursively call itself when
+ * resolving typedefs.
+ */
+ClassDef *getResolvedClassRec(Definition *scope,
+ FileDef *fileScope,
+ const char *n,
+ MemberDef **pTypeDef,
+ QCString *pTemplSpec,
+ QCString *pResolvedType
+ )
+{
+ //printf("[getResolvedClassRec(%s,%s)\n",scope?scope->name().data():"<global>",n);
+ QCString name;
+ QCString explicitScopePart;
+ QCString strippedTemplateParams;
+ name=stripTemplateSpecifiersFromScope
+ (removeRedundantWhiteSpace(n),TRUE,
+ &strippedTemplateParams);
+ ArgumentList actTemplParams;
+ if (!strippedTemplateParams.isEmpty()) // template part that was stripped
+ {
+ stringToArgumentList(strippedTemplateParams,&actTemplParams);
+ }
+
+ int qualifierIndex = computeQualifiedIndex(name);
+ //printf("name=%s qualifierIndex=%d\n",name.data(),qualifierIndex);
+ if (qualifierIndex!=-1) // qualified name
+ {
+ // split off the explicit scope part
+ explicitScopePart=name.left(qualifierIndex);
+ // todo: improve namespace alias substitution
+ replaceNamespaceAliases(explicitScopePart,explicitScopePart.length());
+ name=name.mid(qualifierIndex+2);
+ }
+
+ if (name.isEmpty())
+ {
+ //printf("] empty name\n");
+ return 0; // empty name
+ }
+
+ //printf("Looking for symbol %s\n",name.data());
+ DefinitionIntf *di = Doxygen::symbolMap->find(name);
+ if (di==0)
+ {
+ di = Doxygen::symbolMap->find(name+"-g");
+ if (di==0)
+ {
+ di = Doxygen::symbolMap->find(name+"-p");
+ if (di==0)
+ {
+ //printf("no such symbol!\n");
+ return 0;
+ }
+ }
+ }
+ //printf("found symbol!\n");
+
+ bool hasUsingStatements =
+ (fileScope && ((fileScope->getUsedNamespaces() &&
+ fileScope->getUsedNamespaces()->count()>0) ||
+ (fileScope->getUsedClasses() &&
+ fileScope->getUsedClasses()->count()>0))
+ );
+ //printf("hasUsingStatements=%d\n",hasUsingStatements);
+ // Since it is often the case that the same name is searched in the same
+ // scope over an over again (especially for the linked source code generation)
+ // we use a cache to collect previous results. This is possible since the
+ // result of a lookup is deterministic. As the key we use the concatenated
+ // scope, the name to search for and the explicit scope prefix. The speedup
+ // achieved by this simple cache can be enormous.
+ int scopeNameLen = scope->name().length()+1;
+ int nameLen = name.length()+1;
+ int explicitPartLen = explicitScopePart.length();
+ int fileScopeLen = hasUsingStatements ? 1+fileScope->absFilePath().length() : 0;
+
+ // below is a more efficient coding of
+ // QCString key=scope->name()+"+"+name+"+"+explicitScopePart;
+ QCString key(scopeNameLen+nameLen+explicitPartLen+fileScopeLen+1);
+ char *p=key.data();
+ qstrcpy(p,scope->name()); *(p+scopeNameLen-1)='+';
+ p+=scopeNameLen;
+ qstrcpy(p,name); *(p+nameLen-1)='+';
+ p+=nameLen;
+ qstrcpy(p,explicitScopePart);
+ p+=explicitPartLen;
+
+ // if a file scope is given and it contains using statements we should
+ // also use the file part in the key (as a class name can be in
+ // two different namespaces and a using statement in a file can select
+ // one of them).
+ if (hasUsingStatements)
+ {
+ // below is a more efficient coding of
+ // key+="+"+fileScope->name();
+ *p++='+';
+ qstrcpy(p,fileScope->absFilePath());
+ p+=fileScopeLen-1;
+ }
+ *p='\0';
+
+ LookupInfo *pval=Doxygen::lookupCache.find(key);
+ //printf("Searching for %s result=%p\n",key.data(),pval);
+ if (pval)
+ {
+ //printf("LookupInfo %p %p '%s' %p\n",
+ // pval->classDef, pval->typeDef, pval->templSpec.data(),
+ // pval->resolvedType.data());
+ if (pTemplSpec) *pTemplSpec=pval->templSpec;
+ if (pTypeDef) *pTypeDef=pval->typeDef;
+ if (pResolvedType) *pResolvedType=pval->resolvedType;
+ //printf("] cachedMatch=%s\n",
+ // pval->classDef?pval->classDef->name().data():"<none>");
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
+ return pval->classDef;
+ }
+ else // not found yet; we already add a 0 to avoid the possibility of
+ // endless recursion.
+ {
+ Doxygen::lookupCache.insert(key,new LookupInfo);
+ }
+
+ ClassDef *bestMatch=0;
+ MemberDef *bestTypedef=0;
+ QCString bestTemplSpec;
+ QCString bestResolvedType;
+ int minDistance=10000; // init at "infinite"
+
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList) // not a unique name
+ {
+ //printf(" name is not unique\n");
+ DefinitionListIterator dli(*(DefinitionList*)di);
+ Definition *d;
+ int count=0;
+ for (dli.toFirst();(d=dli.current());++dli,++count) // foreach definition
+ {
+ getResolvedSymbol(scope,fileScope,d,explicitScopePart,&actTemplParams,
+ minDistance,bestMatch,bestTypedef,bestTemplSpec,
+ bestResolvedType);
+ }
+ }
+ else // unique name
+ {
+ //printf(" name is unique\n");
+ Definition *d = (Definition *)di;
+ getResolvedSymbol(scope,fileScope,d,explicitScopePart,&actTemplParams,
+ minDistance,bestMatch,bestTypedef,bestTemplSpec,
+ bestResolvedType);
+ }
+
+ if (pTypeDef)
+ {
+ *pTypeDef = bestTypedef;
+ }
+ if (pTemplSpec)
+ {
+ *pTemplSpec = bestTemplSpec;
+ }
+ if (pResolvedType)
+ {
+ *pResolvedType = bestResolvedType;
+ }
+ //printf("getResolvedClassRec: bestMatch=%p pval->resolvedType=%s\n",
+ // bestMatch,bestResolvedType.data());
+
+ pval=Doxygen::lookupCache.find(key);
+ if (pval)
+ {
+ pval->classDef = bestMatch;
+ pval->typeDef = bestTypedef;
+ pval->templSpec = bestTemplSpec;
+ pval->resolvedType = bestResolvedType;
+ }
+ else
+ {
+ Doxygen::lookupCache.insert(key,new LookupInfo(bestMatch,bestTypedef,bestTemplSpec,bestResolvedType));
+ }
+ //printf("] bestMatch=%s distance=%d\n",
+ // bestMatch?bestMatch->name().data():"<none>",minDistance);
+ //if (pTemplSpec)
+ // printf("templSpec=%s\n",pTemplSpec->data());
+ return bestMatch;
+}
+
+/* Find the fully qualified class name referred to by the input class
+ * or typedef name against the input scope.
+ * Loops through scope and each of its parent scopes looking for a
+ * match against the input name.
+ */
+ClassDef *getResolvedClass(Definition *scope,
+ FileDef *fileScope,
+ const char *n,
+ MemberDef **pTypeDef,
+ QCString *pTemplSpec,
+ bool mayBeUnlinkable,
+ bool mayBeHidden,
+ QCString *pResolvedType
+ )
+{
+ g_resolvedTypedefs.clear();
+ if (scope==0 ||
+ (scope->definitionType()!=Definition::TypeClass &&
+ scope->definitionType()!=Definition::TypeNamespace
+ ) ||
+ (fileScope && fileScope->isJava() && QCString(n).find("::")!=-1)
+ )
+ {
+ scope=Doxygen::globalScope;
+ }
+ //printf("------------ getResolvedClass(scope=%s,file=%s,name=%s,mayUnlinkable=%d)\n",
+ // scope?scope->name().data():"<global>",
+ // fileScope?fileScope->name().data():"<none>",
+ // n,
+ // mayBeUnlinkable
+ // );
+ ClassDef *result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec,pResolvedType);
+ if (!mayBeUnlinkable && result && !result->isLinkable())
+ {
+ if (!mayBeHidden || !result->isHidden())
+ {
+ result=0; // don't link to artificial/hidden classes unless explicitly allowed
+ }
+ }
+ //printf("getResolvedClass(%s,%s)=%s\n",scope?scope->name().data():"<global>",
+ // n,result?result->name().data():"<none>");
+ return result;
+}
+
+//-------------------------------------------------------------------------
+//-------------------------------------------------------------------------
+//-------------------------------------------------------------------------
+//-------------------------------------------------------------------------
+
+static bool findOperator(const QCString &s,int i)
+{
+ int b = s.findRev("operator",i);
+ if (b==-1) return FALSE; // not found
+ b+=8;
+ while (b<i) // check if there are only spaces in between
+ // the operator and the >
+ {
+ if (!isspace((uchar)s.at(b))) return FALSE;
+ b++;
+ }
+ return TRUE;
+}
+
+static bool findOperator2(const QCString &s,int i)
+{
+ int b = s.findRev("operator",i);
+ if (b==-1) return FALSE; // not found
+ b+=8;
+ while (b<i) // check if there are only non-ascii
+ // characters in front of the operator
+ {
+ if (isId((uchar)s.at(b))) return FALSE;
+ b++;
+ }
+ return TRUE;
+}
+
+static const char constScope[] = { 'c', 'o', 'n', 's', 't', ':' };
+static const char virtualScope[] = { 'v', 'i', 'r', 't', 'u', 'a', 'l', ':' };
+
+
+class StrBuf
+{
+ public:
+ StrBuf() : str(0), pos(0), len(0) {}
+ ~StrBuf() { free(str); str=0; pos=0; len=0; }
+ void clear() { pos=0; }
+ void addChar(char c) { if (pos>=len) { len+=1024; str = (char*)realloc(str,len); }
+ str[pos++]=c;
+ }
+ void addStr(const char *s) {
+ int l=strlen(s);
+ if (pos+l>=len) { len+=l+1024; str = (char*)realloc(str,len); }
+ strcpy(&str[pos],s);
+ pos+=l;
+ }
+ const char *get() { return str; }
+ int getPos() const { return pos; }
+ char at(int i) const { return str[i]; }
+ private:
+ char *str;
+ int pos;
+ int len;
+};
+
+// Note: this function is not reentrant due to the use of static buffer!
+QCString removeRedundantWhiteSpace(const QCString &s)
+{
+ static bool cliSupport = Config_getBool("CPP_CLI_SUPPORT");
+ if (s.isEmpty()) return s;
+ static StrBuf strBuf;
+ //int resultLen = 1024;
+ //int resultPos = 0;
+ //QCString result(resultLen);
+ // we use strBuf.addChar(c) instead of result+=c to
+ // improve the performance of this function
+ strBuf.clear();
+ uint i;
+ uint l=s.length();
+ uint csp=0;
+ uint vsp=0;
+ for (i=0;i<l;i++)
+ {
+nextChar:
+ char c=s.at(i);
+
+ // search for "const"
+ if (csp<6 && c==constScope[csp] && // character matches substring "const"
+ (csp>0 || // if it is the first character
+ i==0 || // the previous may not be a digit
+ !isId(s.at(i-1))
+ )
+ )
+ csp++;
+ else // reset counter
+ csp=0;
+
+ // search for "virtual"
+ if (vsp<8 && c==virtualScope[vsp] && // character matches substring "virtual"
+ (vsp>0 || // if it is the first character
+ i==0 || // the previous may not be a digit
+ !isId(s.at(i-1))
+ )
+ )
+ vsp++;
+ else // reset counter
+ vsp=0;
+
+ if (c=='"') // quoted string
+ {
+ i++;
+ strBuf.addChar(c);
+ while (i<l)
+ {
+ char cc=s.at(i);
+ strBuf.addChar(cc);
+ if (cc=='\\') // escaped character
+ {
+ strBuf.addChar(s.at(i+1));
+ i+=2;
+ }
+ else if (cc=='"') // end of string
+ { i++; goto nextChar; }
+ else // any other character
+ { i++; }
+ }
+ }
+ else if (i<l-2 && c=='<' && // current char is a <
+ (isId(s.at(i+1)) || isspace((uchar)s.at(i+1))) && // next char is an id char or space
+ (i<8 || !findOperator(s,i)) // string in front is not "operator"
+ )
+ {
+ strBuf.addChar('<');
+ strBuf.addChar(' ');
+ }
+ else if (i>0 && c=='>' && // current char is a >
+ (isId(s.at(i-1)) || isspace((uchar)s.at(i-1)) || s.at(i-1)=='*' || s.at(i-1)=='&') && // prev char is an id char or space
+ (i<8 || !findOperator(s,i)) // string in front is not "operator"
+ )
+ {
+ strBuf.addChar(' ');
+ strBuf.addChar('>');
+ }
+ else if (i>0 && c==',' && !isspace((uchar)s.at(i-1))
+ && ((i<l-1 && isId(s.at(i+1)))
+ || (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2))) // for PHP
+ || (i<l-3 && s.at(i+1)=='&' && s.at(i+2)=='$' && isId(s.at(i+3))))) // for PHP
+ {
+ strBuf.addChar(',');
+ strBuf.addChar(' ');
+ }
+ else if (i>0 &&
+ ((isId(s.at(i)) && s.at(i-1)==')') ||
+ (s.at(i)=='\'' && s.at(i-1)==' ')
+ )
+ )
+ {
+ strBuf.addChar(' ');
+ strBuf.addChar(s.at(i));
+ }
+ else if (c=='t' && csp==5 /*&& (i<5 || !isId(s.at(i-5)))*/ &&
+ !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ ||
+ s.at(i+1)==')' ||
+ s.at(i+1)==',' ||
+ s.at(i+1)=='\0'
+ )
+ )
+ // prevent const ::A from being converted to const::A
+ {
+ strBuf.addChar('t');
+ strBuf.addChar(' ');
+ if (s.at(i+1)==' ') i++;
+ csp=0;
+ }
+ else if (c==':' && csp==6 /*&& (i<6 || !isId(s.at(i-6)))*/)
+ // replace const::A by const ::A
+ {
+ strBuf.addChar(' ');
+ strBuf.addChar(':');
+ csp=0;
+ }
+ else if (c=='l' && vsp==7 /*&& (i<7 || !isId(s.at(i-7)))*/ &&
+ !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ ||
+ s.at(i+1)==')' ||
+ s.at(i+1)==',' ||
+ s.at(i+1)=='\0'
+ )
+ )
+ // prevent virtual ::A from being converted to virtual::A
+ {
+ strBuf.addChar('l');
+ strBuf.addChar(' ');
+ if (s.at(i+1)==' ') i++;
+ vsp=0;
+ }
+ else if (c==':' && vsp==8 /*&& (i<8 || !isId(s.at(i-8)))*/)
+ // replace virtual::A by virtual ::A
+ {
+ strBuf.addChar(' ');
+ strBuf.addChar(':');
+ vsp=0;
+ }
+ else if (!isspace((uchar)c) || // not a space
+ ( i>0 && i<l-1 && // internal character
+ (isId(s.at(i-1)) || s.at(i-1)==')' || s.at(i-1)==',' || s.at(i-1)=='>' || s.at(i-1)==']')
+ && (isId(s.at(i+1)) || (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2)))
+ || (i<l-3 && s.at(i+1)=='&' && s.at(i+2)=='$' && isId(s.at(i+3))))
+ )
+ )
+ {
+ if (c=='*' || c=='&' || c=='@' || c=='$')
+ {
+ //uint rl=result.length();
+ uint rl=strBuf.getPos();
+ if ((rl>0 && (isId(strBuf.at(rl-1)) || strBuf.at(rl-1)=='>')) &&
+ ((c!='*' && c!='&') || !findOperator2(s,i)) // avoid splitting operator* and operator->* and operator&
+ )
+ {
+ strBuf.addChar(' ');
+ }
+ }
+ strBuf.addChar(c);
+ if (cliSupport &&
+ (c=='^' || c=='%') && i>1 && isId(s.at(i-1)) &&
+ !findOperator(s,i)
+ )
+ {
+ strBuf.addChar(' '); // C++/CLI: Type^ name and Type% name
+ }
+ }
+ }
+ //printf("removeRedundantWhiteSpace(`%s')=`%s'\n",s.data(),result.data());
+ strBuf.addChar(0);
+ //result.resize(resultPos);
+ return strBuf.get();
+}
+
+bool rightScopeMatch(const QCString &scope, const QCString &name)
+{
+ return (name==scope || // equal
+ (scope.right(name.length())==name && // substring
+ scope.at(scope.length()-name.length()-1)==':' // scope
+ )
+ );
+}
+
+bool leftScopeMatch(const QCString &scope, const QCString &name)
+{
+ return (name==scope || // equal
+ (scope.left(name.length())==name && // substring
+ scope.at(name.length())==':' // scope
+ )
+ );
+}
+
+
+void linkifyText(const TextGeneratorIntf &out,Definition *scope,
+ FileDef *fileScope,const char *,
+ const char *text, bool autoBreak,bool external,
+ bool keepSpaces)
+{
+ //printf("`%s'\n",text);
+ static QRegExp regExp("[a-z_A-Z\\x80-\\xFF][~!a-z_A-Z0-9.:\\x80-\\xFF]*");
+ static QRegExp regExpSplit("(?!:),");
+ QCString txtStr=text;
+ int strLen = txtStr.length();
+ //printf("linkifyText scope=%s fileScope=%s strtxt=%s strlen=%d\n",
+ // scope?scope->name().data():"<none>",
+ // fileScope?fileScope->name().data():"<none>",
+ // txtStr.data(),strLen);
+ int matchLen;
+ int index=0;
+ int newIndex;
+ int skipIndex=0;
+ int floatingIndex=0;
+ if (strLen==0) return;
+ // read a word from the text string
+ while ((newIndex=regExp.match(txtStr,index,&matchLen))!=-1 &&
+ (newIndex==0 || !(txtStr.at(newIndex-1)>='0' && txtStr.at(newIndex-1)<='9')) // avoid matching part of hex numbers
+ )
+ {
+ // add non-word part to the result
+ floatingIndex+=newIndex-skipIndex+matchLen;
+ bool insideString=FALSE;
+ int i;
+ for (i=index;i<newIndex;i++)
+ {
+ if (txtStr.at(i)=='"') insideString=!insideString;
+ }
+
+ //printf("floatingIndex=%d strlen=%d autoBreak=%d\n",floatingIndex,strLen,autoBreak);
+ if (strLen>35 && floatingIndex>30 && autoBreak) // try to insert a split point
+ {
+ QCString splitText = txtStr.mid(skipIndex,newIndex-skipIndex);
+ int splitLength = splitText.length();
+ int offset=1;
+ i=splitText.find(regExpSplit,0);
+ if (i==-1) { i=splitText.find('<'); if (i!=-1) offset=0; }
+ if (i==-1) i=splitText.find('>');
+ if (i==-1) i=splitText.find(' ');
+ //printf("splitText=[%s] len=%d i=%d offset=%d\n",splitText.data(),splitLength,i,offset);
+ if (i!=-1) // add a link-break at i in case of Html output
+ {
+ out.writeString(splitText.left(i+offset),keepSpaces);
+ out.writeBreak();
+ out.writeString(splitText.right(splitLength-i-offset),keepSpaces);
+ floatingIndex=splitLength-i-offset+matchLen;
+ }
+ else
+ {
+ out.writeString(splitText,keepSpaces);
+ }
+ }
+ else
+ {
+ //ol.docify(txtStr.mid(skipIndex,newIndex-skipIndex));
+ out.writeString(txtStr.mid(skipIndex,newIndex-skipIndex),keepSpaces);
+ }
+ // get word from string
+ QCString word=txtStr.mid(newIndex,matchLen);
+ QCString matchWord = substitute(word,".","::");
+ //printf("linkifyText word=%s matchWord=%s scope=%s\n",
+ // word.data(),matchWord.data(),scope?scope->name().data():"<none>");
+ bool found=FALSE;
+ if (!insideString)
+ {
+ ClassDef *cd=0;
+ FileDef *fd=0;
+ MemberDef *md=0;
+ NamespaceDef *nd=0;
+ GroupDef *gd=0;
+ //printf("** Match word '%s'\n",matchWord.data());
+
+ MemberDef *typeDef=0;
+ if ((cd=getResolvedClass(scope,fileScope,matchWord,&typeDef)))
+ {
+ //printf("Found class %s\n",cd->name().data());
+ // add link to the result
+ if (external ? cd->isLinkable() : cd->isLinkableInProject())
+ {
+ out.writeLink(cd->getReference(),cd->getOutputFileBase(),cd->anchor(),word);
+ found=TRUE;
+ }
+ }
+ else if (typeDef)
+ {
+ //printf("Found typedef %s\n",typeDef->name().data());
+ if (external ? typeDef->isLinkable() : typeDef->isLinkableInProject())
+ {
+ out.writeLink(typeDef->getReference(),
+ typeDef->getOutputFileBase(),
+ typeDef->anchor(),
+ word);
+ found=TRUE;
+ }
+ }
+ else if ((cd=getClass(matchWord+"-p"))) // search for Obj-C protocols as well
+ {
+ // add link to the result
+ if (external ? cd->isLinkable() : cd->isLinkableInProject())
+ {
+ out.writeLink(cd->getReference(),cd->getOutputFileBase(),cd->anchor(),word);
+ found=TRUE;
+ }
+ }
+ else if ((cd=getClass(matchWord+"-g"))) // C# generic as well
+ {
+ // add link to the result
+ if (external ? cd->isLinkable() : cd->isLinkableInProject())
+ {
+ out.writeLink(cd->getReference(),cd->getOutputFileBase(),cd->anchor(),word);
+ found=TRUE;
+ }
+ }
+ else
+ {
+ //printf(" -> nothing\n");
+ }
+
+ QCString scopeName;
+ if (scope &&
+ (scope->definitionType()==Definition::TypeClass ||
+ scope->definitionType()==Definition::TypeNamespace
+ )
+ )
+ {
+ scopeName=scope->name();
+ }
+ //printf("ScopeName=%s\n",scopeName.data());
+ //if (!found) printf("Trying to link %s in %s\n",word.data(),scopeName.data());
+ if (!found &&
+ getDefs(scopeName,matchWord,0,md,cd,fd,nd,gd) &&
+ (md->isTypedef() || md->isEnumerate() ||
+ md->isReference() || md->isVariable()
+ ) &&
+ (external ? md->isLinkable() : md->isLinkableInProject())
+ )
+ {
+ //printf("Found ref scope=%s\n",d?d->name().data():"<global>");
+ //ol.writeObjectLink(d->getReference(),d->getOutputFileBase(),
+ // md->anchor(),word);
+ out.writeLink(md->getReference(),md->getOutputFileBase(),
+ md->anchor(),word);
+ found=TRUE;
+ }
+ }
+
+ if (!found) // add word to the result
+ {
+ out.writeString(word,keepSpaces);
+ }
+ // set next start point in the string
+ //printf("index=%d/%d\n",index,txtStr.length());
+ skipIndex=index=newIndex+matchLen;
+ }
+ // add last part of the string to the result.
+ //ol.docify(txtStr.right(txtStr.length()-skipIndex));
+ out.writeString(txtStr.right(txtStr.length()-skipIndex),keepSpaces);
+}
+
+
+void writeExample(OutputList &ol,ExampleSDict *ed)
+{
+ QCString exampleLine=theTranslator->trWriteList(ed->count());
+
+ //bool latexEnabled = ol.isEnabled(OutputGenerator::Latex);
+ //bool manEnabled = ol.isEnabled(OutputGenerator::Man);
+ //bool htmlEnabled = ol.isEnabled(OutputGenerator::Html);
+ QRegExp marker("@[0-9]+");
+ int index=0,newIndex,matchLen;
+ // now replace all markers in inheritLine with links to the classes
+ while ((newIndex=marker.match(exampleLine,index,&matchLen))!=-1)
+ {
+ bool ok;
+ ol.parseText(exampleLine.mid(index,newIndex-index));
+ uint entryIndex = exampleLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
+ Example *e=ed->at(entryIndex);
+ if (ok && e)
+ {
+ ol.pushGeneratorState();
+ //if (latexEnabled) ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ // link for Html / man
+ //printf("writeObjectLink(file=%s)\n",e->file.data());
+ ol.writeObjectLink(0,e->file,e->anchor,e->name);
+ ol.popGeneratorState();
+
+ ol.pushGeneratorState();
+ //if (latexEnabled) ol.enable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Html);
+ // link for Latex / pdf with anchor because the sources
+ // are not hyperlinked (not possible with a verbatim environment).
+ ol.writeObjectLink(0,e->file,0,e->name);
+ //if (manEnabled) ol.enable(OutputGenerator::Man);
+ //if (htmlEnabled) ol.enable(OutputGenerator::Html);
+ ol.popGeneratorState();
+ }
+ index=newIndex+matchLen;
+ }
+ ol.parseText(exampleLine.right(exampleLine.length()-index));
+ ol.writeString(".");
+}
+
+
+QCString argListToString(ArgumentList *al,bool useCanonicalType,bool showDefVals)
+{
+ QCString result;
+ if (al==0) return result;
+ Argument *a=al->first();
+ result+="(";
+ while (a)
+ {
+ QCString type1 = useCanonicalType && !a->canType.isEmpty() ?
+ a->canType : a->type;
+ QCString type2;
+ int i=type1.find(")("); // hack to deal with function pointers
+ if (i!=-1)
+ {
+ type2=type1.mid(i);
+ type1=type1.left(i);
+ }
+ if (!a->attrib.isEmpty())
+ {
+ result+=a->attrib+" ";
+ }
+ if (!a->name.isEmpty() || !a->array.isEmpty())
+ {
+ result+= type1+" "+a->name+type2+a->array;
+ }
+ else
+ {
+ result+= type1+type2;
+ }
+ if (!a->defval.isEmpty() && showDefVals)
+ {
+ result+="="+a->defval;
+ }
+ a = al->next();
+ if (a) result+=", ";
+ }
+ result+=")";
+ if (al->constSpecifier) result+=" const";
+ if (al->volatileSpecifier) result+=" volatile";
+ return removeRedundantWhiteSpace(result);
+}
+
+QCString tempArgListToString(ArgumentList *al)
+{
+ QCString result;
+ if (al==0) return result;
+ result="<";
+ Argument *a=al->first();
+ while (a)
+ {
+ if (!a->name.isEmpty()) // add template argument name
+ {
+ result+=a->name;
+ }
+ else // extract name from type
+ {
+ int i=a->type.length()-1;
+ while (i>=0 && isId(a->type.at(i))) i--;
+ if (i>0)
+ {
+ result+=a->type.right(a->type.length()-i-1);
+ }
+ else // nothing found -> take whole name
+ {
+ result+=a->type;
+ }
+ }
+ a=al->next();
+ if (a) result+=", ";
+ }
+ result+=">";
+ return removeRedundantWhiteSpace(result);
+}
+
+
+// compute the HTML anchors for a list of members
+void setAnchors(ClassDef *cd,char id,MemberList *ml,int groupId)
+{
+ int count=0;
+ if (ml==0) return;
+ MemberListIterator mli(*ml);
+ MemberDef *md;
+ for (;(md=mli.current());++mli)
+ {
+ if (!md->isReference())
+ {
+ QCString anchor;
+ if (groupId==-1)
+ anchor.sprintf("%c%d",id,count++);
+ else
+ anchor.sprintf("%c%d_%d",id,groupId,count++);
+ if (cd) anchor.prepend(escapeCharsInString(cd->name(),FALSE));
+ md->setAnchor(anchor);
+ //printf("setAnchors(): Member %s outputFileBase=%s anchor %s result %s\n",
+ // md->name().data(),md->getOutputFileBase().data(),anchor.data(),md->anchor().data());
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+/*! takes the \a buf of the given length \a len and converts CR LF (DOS)
+ * or CR (MAC) line ending to LF (Unix). Returns the length of the
+ * converted content (i.e. the same as \a len (Unix, MAC) or
+ * smaller (DOS).
+ */
+int filterCRLF(char *buf,int len)
+{
+ int src = 0; // source index
+ int dest = 0; // destination index
+ char c; // current character
+
+ while (src<len)
+ {
+ c = buf[src++]; // Remember the processed character.
+ if (c == '\r') // CR to be solved (MAC, DOS)
+ {
+ c = '\n'; // each CR to LF
+ if (src<len && buf[src] == '\n')
+ ++src; // skip LF just after CR (DOS)
+ }
+ else if ( c == '\0' && src<len-1) // filter out internal \0 characters, as it will confuse the parser
+ {
+ c = ' '; // turn into a space
+ }
+ buf[dest++] = c; // copy the (modified) character to dest
+ }
+ return dest; // length of the valid part of the buf
+}
+
+static QCString getFilterFromList(const char *name,const QStrList &filterList,bool &found)
+{
+ found=FALSE;
+ // compare the file name to the filter pattern list
+ QStrListIterator sli(filterList);
+ char* filterStr;
+ for (sli.toFirst(); (filterStr = sli.current()); ++sli)
+ {
+ QCString fs = filterStr;
+ int i_equals=fs.find('=');
+ if (i_equals!=-1)
+ {
+ QCString filterPattern = fs.left(i_equals);
+ QRegExp fpat(filterPattern,portable_fileSystemIsCaseSensitive(),TRUE);
+ if (fpat.match(name)!=-1)
+ {
+ // found a match!
+ QCString filterName = fs.mid(i_equals+1);
+ if (filterName.find(' ')!=-1)
+ { // add quotes if the name has spaces
+ filterName="\""+filterName+"\"";
+ }
+ found=TRUE;
+ return filterName;
+ }
+ }
+ }
+
+ // no match
+ return "";
+}
+
+/*! looks for a filter for the file \a name. Returns the name of the filter
+ * if there is a match for the file name, otherwise an empty string.
+ * In case \a inSourceCode is TRUE then first the source filter list is
+ * considered.
+ */
+QCString getFileFilter(const char* name,bool isSourceCode)
+{
+ // sanity check
+ if (name==0) return "";
+
+ QStrList& filterSrcList = Config_getList("FILTER_SOURCE_PATTERNS");
+ QStrList& filterList = Config_getList("FILTER_PATTERNS");
+
+ QCString filterName;
+ bool found=FALSE;
+ if (isSourceCode && !filterSrcList.isEmpty())
+ { // first look for source filter pattern list
+ filterName = getFilterFromList(name,filterSrcList,found);
+ }
+ if (!found && filterName.isEmpty())
+ { // then look for filter pattern list
+ filterName = getFilterFromList(name,filterList,found);
+ }
+ if (!found)
+ { // then use the generic input filter
+ return Config_getString("INPUT_FILTER");
+ }
+ else
+ {
+ return filterName;
+ }
+}
+
+
+QCString transcodeCharacterStringToUTF8(const QCString &input)
+{
+ bool error=FALSE;
+ static QCString inputEncoding = Config_getString("INPUT_ENCODING");
+ const char *outputEncoding = "UTF-8";
+ if (inputEncoding.isEmpty() || qstricmp(inputEncoding,outputEncoding)==0) return input;
+ int inputSize=input.length();
+ int outputSize=inputSize*4+1;
+ QCString output(outputSize);
+ void *cd = portable_iconv_open(outputEncoding,inputEncoding);
+ if (cd==(void *)(-1))
+ {
+ err("error: unsupported character conversion: '%s'->'%s'\n",
+ inputEncoding.data(),outputEncoding);
+ error=TRUE;
+ }
+ if (!error)
+ {
+ size_t iLeft=inputSize;
+ size_t oLeft=outputSize;
+ const char *inputPtr = input.data();
+ char *outputPtr = output.data();
+ if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft))
+ {
+ outputSize-=oLeft;
+ output.resize(outputSize+1);
+ output.at(outputSize)='\0';
+ //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data());
+ }
+ else
+ {
+ err("error: failed to translate characters from %s to %s: check INPUT_ENCODING\ninput=[%s]\n",
+ inputEncoding.data(),outputEncoding,input.data());
+ error=TRUE;
+ }
+ }
+ portable_iconv_close(cd);
+ return error ? input : output;
+}
+
+/*! reads a file with name \a name and returns it as a string. If \a filter
+ * is TRUE the file will be filtered by any user specified input filter.
+ * If \a name is "-" the string will be read from standard input.
+ */
+QCString fileToString(const char *name,bool filter,bool isSourceCode)
+{
+ if (name==0 || name[0]==0) return 0;
+ QFile f;
+
+ bool fileOpened=FALSE;
+ if (name[0]=='-' && name[1]==0) // read from stdin
+ {
+ fileOpened=f.open(IO_ReadOnly,stdin);
+ if (fileOpened)
+ {
+ const int bSize=4096;
+ QCString contents(bSize);
+ int totalSize=0;
+ int size;
+ while ((size=f.readBlock(contents.data()+totalSize,bSize))==bSize)
+ {
+ totalSize+=bSize;
+ contents.resize(totalSize+bSize);
+ }
+ totalSize = filterCRLF(contents.data(),totalSize+size)+2;
+ contents.resize(totalSize);
+ contents.at(totalSize-2)='\n'; // to help the scanner
+ contents.at(totalSize-1)='\0';
+ return contents;
+ }
+ }
+ else // read from file
+ {
+ QFileInfo fi(name);
+ if (!fi.exists() || !fi.isFile())
+ {
+ err("error: file `%s' not found\n",name);
+ return "";
+ }
+ QCString filterName = getFileFilter(name,isSourceCode);
+ if (filterName.isEmpty() || !filter)
+ {
+ f.setName(name);
+ fileOpened=f.open(IO_ReadOnly);
+ if (fileOpened)
+ {
+ int fsize=f.size();
+ QCString contents(fsize+2);
+ f.readBlock(contents.data(),fsize);
+ if (fsize==0 || contents[fsize-1]=='\n')
+ contents[fsize]='\0';
+ else
+ contents[fsize]='\n'; // to help the scanner
+ contents[fsize+1]='\0';
+ f.close();
+ int newSize = filterCRLF(contents.data(),fsize+2);
+ if (newSize!=fsize+2)
+ {
+ contents.resize(newSize);
+ }
+ return transcodeCharacterStringToUTF8(contents);
+ }
+ }
+ else // filter the input
+ {
+ QCString cmd=filterName+" \""+name+"\"";
+ Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",cmd.data());
+ FILE *f=portable_popen(cmd,"r");
+ if (!f)
+ {
+ err("error: could not execute filter %s\n",filterName.data());
+ return "";
+ }
+ const int bSize=4096;
+ QCString contents(bSize);
+ int totalSize=0;
+ int size;
+ while ((size=fread(contents.data()+totalSize,1,bSize,f))==bSize)
+ {
+ totalSize+=bSize;
+ contents.resize(totalSize+bSize);
+ }
+ totalSize = filterCRLF(contents.data(),totalSize+size)+2;
+ contents.resize(totalSize);
+ contents.at(totalSize-2)='\n'; // to help the scanner
+ contents.at(totalSize-1)='\0';
+ portable_pclose(f);
+ return transcodeCharacterStringToUTF8(contents);
+ }
+ }
+ if (!fileOpened)
+ {
+ err("error: cannot open file `%s' for reading\n",name);
+ }
+ return "";
+}
+
+QCString dateToString(bool includeTime)
+{
+ QDateTime current = QDateTime::currentDateTime();
+ return theTranslator->trDateTime(current.date().year(),
+ current.date().month(),
+ current.date().day(),
+ current.date().dayOfWeek(),
+ current.time().hour(),
+ current.time().minute(),
+ current.time().second(),
+ includeTime);
+}
+
+QCString yearToString()
+{
+ const QDate &d=QDate::currentDate();
+ QCString result;
+ result.sprintf("%d", d.year());
+ return result;
+}
+
+//----------------------------------------------------------------------
+// recursive function that returns the number of branches in the
+// inheritance tree that the base class `bcd' is below the class `cd'
+
+int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level)
+{
+ if (bcd->categoryOf()) // use class that is being extended in case of
+ // an Objective-C category
+ {
+ bcd=bcd->categoryOf();
+ }
+ if (cd==bcd) return level;
+ if (level==256)
+ {
+ err("error: Internal inconsistency: found class %s seem to have a recursive "
+ "inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data());
+ return -1;
+ }
+ int m=maxInheritanceDepth;
+ if (cd->baseClasses())
+ {
+#if 0
+ BaseClassListIterator bcli(*cd->baseClasses());
+ for ( ; bcli.current() ; ++bcli)
+ {
+ //printf("class %s base class %s\n",cd->name().data(),bcli.current()->classDef->name().data());
+ int mc=minClassDistance(bcli.current()->classDef,bcd,level+1);
+ if (mc<m) m=mc;
+ if (m<0) break;
+ }
+#endif
+ BaseClassDef *bcdi = cd->baseClasses()->first();
+ while (bcdi)
+ {
+ int mc=minClassDistance(bcdi->classDef,bcd,level+1);
+ if (mc<m) m=mc;
+ if (m<0) break;
+ bcdi = cd->baseClasses()->next();
+ }
+ }
+ return m;
+}
+
+//static void printArgList(ArgumentList *al)
+//{
+// if (al==0) return;
+// ArgumentListIterator ali(*al);
+// Argument *a;
+// printf("(");
+// for (;(a=ali.current());++ali)
+// {
+// printf("t=`%s' n=`%s' v=`%s' ",a->type.data(),!a->name.isEmpty()>0?a->name.data():"",!a->defval.isEmpty()>0?a->defval.data():"");
+// }
+// printf(")");
+//}
+
+#ifndef NEWMATCH
+// strip any template specifiers that follow className in string s
+static QCString trimTemplateSpecifiers(
+ const QCString &namespaceName,
+ const QCString &className,
+ const QCString &s
+ )
+{
+ //printf("trimTemplateSpecifiers(%s,%s,%s)\n",namespaceName.data(),className.data(),s.data());
+ QCString scopeName=mergeScopes(namespaceName,className);
+ ClassDef *cd=getClass(scopeName);
+ if (cd==0) return s; // should not happen, but guard anyway.
+
+ QCString result=s;
+
+ int i=className.length()-1;
+ if (i>=0 && className.at(i)=='>') // template specialization
+ {
+ // replace unspecialized occurrences in s, with their specialized versions.
+ int count=1;
+ int cl=i+1;
+ while (i>=0)
+ {
+ char c=className.at(i);
+ if (c=='>') count++,i--;
+ else if (c=='<') { count--; if (count==0) break; }
+ else i--;
+ }
+ QCString unspecClassName=className.left(i);
+ int l=i;
+ int p=0;
+ while ((i=result.find(unspecClassName,p))!=-1)
+ {
+ if (result.at(i+l)!='<') // unspecialized version
+ {
+ result=result.left(i)+className+result.right(result.length()-i-l);
+ l=cl;
+ }
+ p=i+l;
+ }
+ }
+
+ //printf("result after specialization: %s\n",result.data());
+
+ QCString qualName=cd->qualifiedNameWithTemplateParameters();
+ //printf("QualifiedName = %s\n",qualName.data());
+ // We strip the template arguments following className (if any)
+ if (!qualName.isEmpty()) // there is a class name
+ {
+ int is,ps=0;
+ int p=0,l,i;
+
+ while ((is=getScopeFragment(qualName,ps,&l))!=-1)
+ {
+ QCString qualNamePart = qualName.right(qualName.length()-is);
+ //printf("qualNamePart=%s\n",qualNamePart.data());
+ while ((i=result.find(qualNamePart,p))!=-1)
+ {
+ int ql=qualNamePart.length();
+ result=result.left(i)+cd->name()+result.right(result.length()-i-ql);
+ p=i+cd->name().length();
+ }
+ ps=is+l;
+ }
+ }
+ //printf("result=%s\n",result.data());
+
+ return result.stripWhiteSpace();
+}
+
+/*!
+ * @param pattern pattern to look for
+ * @param s string to search in
+ * @param p position to start
+ * @param len resulting pattern length
+ * @returns position on which string is found, or -1 if not found
+ */
+static int findScopePattern(const QCString &pattern,const QCString &s,
+ int p,int *len)
+{
+ int sl=s.length();
+ int pl=pattern.length();
+ int sp=0;
+ *len=0;
+ while (p<sl)
+ {
+ sp=p; // start of match
+ int pp=0; // pattern position
+ while (p<sl && pp<pl)
+ {
+ if (s.at(p)=='<') // skip template arguments while matching
+ {
+ int bc=1;
+ //printf("skipping pos=%d c=%c\n",p,s.at(p));
+ p++;
+ while (p<sl)
+ {
+ if (s.at(p)=='<') bc++;
+ else if (s.at(p)=='>')
+ {
+ bc--;
+ if (bc==0)
+ {
+ p++;
+ break;
+ }
+ }
+ //printf("skipping pos=%d c=%c\n",p,s.at(p));
+ p++;
+ }
+ }
+ else if (s.at(p)==pattern.at(pp))
+ {
+ //printf("match at position p=%d pp=%d c=%c\n",p,pp,s.at(p));
+ p++;
+ pp++;
+ }
+ else // no match
+ {
+ //printf("restarting at %d c=%c pat=%s\n",p,s.at(p),pattern.data());
+ p=sp+1;
+ break;
+ }
+ }
+ if (pp==pl) // whole pattern matches
+ {
+ *len=p-sp;
+ return sp;
+ }
+ }
+ return -1;
+}
+
+static QCString trimScope(const QCString &name,const QCString &s)
+{
+ int scopeOffset=name.length();
+ QCString result=s;
+ do // for each scope
+ {
+ QCString tmp;
+ QCString scope=name.left(scopeOffset)+"::";
+ //printf("Trying with scope=`%s'\n",scope.data());
+
+ int i,p=0,l;
+ while ((i=findScopePattern(scope,result,p,&l))!=-1) // for each occurrence
+ {
+ tmp+=result.mid(p,i-p); // add part before pattern
+ p=i+l;
+ }
+ tmp+=result.right(result.length()-p); // add trailing part
+
+ scopeOffset=name.findRev("::",scopeOffset-1);
+ result = tmp;
+ } while (scopeOffset>0);
+ //printf("trimScope(name=%s,scope=%s)=%s\n",name.data(),s.data(),result.data());
+ return result;
+}
+#endif
+
+void trimBaseClassScope(BaseClassList *bcl,QCString &s,int level=0)
+{
+ //printf("trimBaseClassScope level=%d `%s'\n",level,s.data());
+ BaseClassListIterator bcli(*bcl);
+ BaseClassDef *bcd;
+ for (;(bcd=bcli.current());++bcli)
+ {
+ ClassDef *cd=bcd->classDef;
+ //printf("Trying class %s\n",cd->name().data());
+ int spos=s.find(cd->name()+"::");
+ if (spos!=-1)
+ {
+ s = s.left(spos)+s.right(
+ s.length()-spos-cd->name().length()-2
+ );
+ }
+ //printf("base class `%s'\n",cd->name().data());
+ if (cd->baseClasses())
+ trimBaseClassScope(cd->baseClasses(),s,level+1);
+ }
+}
+
+#if 0
+/*! if either t1 or t2 contains a namespace scope, then remove that
+ * scope. If neither or both have a namespace scope, t1 and t2 remain
+ * unchanged.
+ */
+static void trimNamespaceScope(QCString &t1,QCString &t2,const QCString &nsName)
+{
+ int p1=t1.length();
+ int p2=t2.length();
+ for (;;)
+ {
+ int i1=p1==0 ? -1 : t1.findRev("::",p1);
+ int i2=p2==0 ? -1 : t2.findRev("::",p2);
+ if (i1==-1 && i2==-1)
+ {
+ return;
+ }
+ if (i1!=-1 && i2==-1) // only t1 has a scope
+ {
+ QCString scope=t1.left(i1);
+ replaceNamespaceAliases(scope,i1);
+
+ int so=nsName.length();
+ do
+ {
+ QCString fullScope=nsName.left(so);
+ if (!fullScope.isEmpty() && !scope.isEmpty()) fullScope+="::";
+ fullScope+=scope;
+ if (!fullScope.isEmpty() && Doxygen::namespaceSDict[fullScope]!=0) // scope is a namespace
+ {
+ t1 = t1.right(t1.length()-i1-2);
+ return;
+ }
+ if (so==0)
+ {
+ so=-1;
+ }
+ else if ((so=nsName.findRev("::",so-1))==-1)
+ {
+ so=0;
+ }
+ }
+ while (so>=0);
+ }
+ else if (i1==-1 && i2!=-1) // only t2 has a scope
+ {
+ QCString scope=t2.left(i2);
+ replaceNamespaceAliases(scope,i2);
+
+ int so=nsName.length();
+ do
+ {
+ QCString fullScope=nsName.left(so);
+ if (!fullScope.isEmpty() && !scope.isEmpty()) fullScope+="::";
+ fullScope+=scope;
+ if (!fullScope.isEmpty() && Doxygen::namespaceSDict[fullScope]!=0) // scope is a namespace
+ {
+ t2 = t2.right(t2.length()-i2-2);
+ return;
+ }
+ if (so==0)
+ {
+ so=-1;
+ }
+ else if ((so=nsName.findRev("::",so-1))==-1)
+ {
+ so=0;
+ }
+ }
+ while (so>=0);
+ }
+ p1 = QMAX(i1-2,0);
+ p2 = QMAX(i2-2,0);
+ }
+}
+#endif
+
+static void stripIrrelevantString(QCString &target,const QCString &str)
+{
+ if (target==str) { target.resize(0); return; }
+ int i,p=0;
+ int l=str.length();
+ bool changed=FALSE;
+ while ((i=target.find(str,p))!=-1)
+ {
+ bool isMatch = (i==0 || !isId(target.at(i-1))) && // not a character before str
+ (i+l==(int)target.length() || !isId(target.at(i+l))); // not a character after str
+ if (isMatch)
+ {
+ int i1=target.find('*',i+l);
+ int i2=target.find('&',i+l);
+ if (i1==-1 && i2==-1)
+ {
+ // strip str from target at index i
+ target=target.left(i)+target.right(target.length()-i-l);
+ changed=TRUE;
+ i-=l;
+ }
+ else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2)) // str before * or &
+ {
+ // move str to front
+ target=str+" "+target.left(i)+target.right(target.length()-i-l);
+ changed=TRUE;
+ i++;
+ }
+ }
+ p = i+l;
+ }
+ if (changed) target=target.stripWhiteSpace();
+}
+
+/*! According to the C++ spec and Ivan Vecerina:
+
+ Parameter declarations that differ only in the presence or absence
+ of const and/or volatile are equivalent.
+
+ So the following example, show what is stripped by this routine
+ for const. The same is done for volatile.
+
+ \code
+ const T param -> T param // not relevant
+ const T& param -> const T& param // const needed
+ T* const param -> T* param // not relevant
+ const T* param -> const T* param // const needed
+ \endcode
+ */
+void stripIrrelevantConstVolatile(QCString &s)
+{
+ //printf("stripIrrelevantConstVolatile(%s)=",s.data());
+ stripIrrelevantString(s,"const");
+ stripIrrelevantString(s,"volatile");
+ //printf("%s\n",s.data());
+}
+
+
+// a bit of debug support for matchArguments
+#define MATCH
+#define NOMATCH
+//#define MATCH printf("Match at line %d\n",__LINE__);
+//#define NOMATCH printf("Nomatch at line %d\n",__LINE__);
+
+#ifndef NEWMATCH
+static bool matchArgument(const Argument *srcA,const Argument *dstA,
+ const QCString &className,
+ const QCString &namespaceName,
+ NamespaceSDict *usingNamespaces,
+ SDict<Definition> *usingClasses)
+{
+ //printf("match argument start `%s|%s' <-> `%s|%s' using nsp=%p class=%p\n",
+ // srcA->type.data(),srcA->name.data(),
+ // dstA->type.data(),dstA->name.data(),
+ // usingNamespaces,
+ // usingClasses);
+
+ // TODO: resolve any typedefs names that are part of srcA->type
+ // before matching. This should use className and namespaceName
+ // and usingNamespaces and usingClass to determine which typedefs
+ // are in-scope, so it will not be very efficient :-(
+
+ QCString srcAType=trimTemplateSpecifiers(namespaceName,className,srcA->type);
+ QCString dstAType=trimTemplateSpecifiers(namespaceName,className,dstA->type);
+ QCString srcAName=srcA->name.stripWhiteSpace();
+ QCString dstAName=dstA->name.stripWhiteSpace();
+ srcAType.stripPrefix("class ");
+ dstAType.stripPrefix("class ");
+
+ // allow distinguishing "const A" from "const B" even though
+ // from a syntactic point of view they would be two names of the same
+ // type "const". This is not fool prove of course, but should at least
+ // catch the most common cases.
+ if ((srcAType=="const" || srcAType=="volatile") && !srcAName.isEmpty())
+ {
+ srcAType+=" ";
+ srcAType+=srcAName;
+ }
+ if ((dstAType=="const" || dstAType=="volatile") && !dstAName.isEmpty())
+ {
+ dstAType+=" ";
+ dstAType+=dstAName;
+ }
+ if (srcAName=="const" || srcAName=="volatile")
+ {
+ srcAType+=srcAName;
+ srcAName.resize(0);
+ }
+ else if (dstA->name=="const" || dstA->name=="volatile")
+ {
+ dstAType+=dstA->name;
+ dstAName.resize(0);
+ }
+
+ stripIrrelevantConstVolatile(srcAType);
+ stripIrrelevantConstVolatile(dstAType);
+
+ // strip typename keyword
+ if (strncmp(srcAType,"typename ",9)==0)
+ {
+ srcAType = srcAType.right(srcAType.length()-9);
+ }
+ if (strncmp(dstAType,"typename ",9)==0)
+ {
+ dstAType = dstAType.right(dstAType.length()-9);
+ }
+
+ srcAType = removeRedundantWhiteSpace(srcAType);
+ dstAType = removeRedundantWhiteSpace(dstAType);
+
+ //srcAType=stripTemplateSpecifiersFromScope(srcAType,FALSE);
+ //dstAType=stripTemplateSpecifiersFromScope(dstAType,FALSE);
+
+ //printf("srcA=`%s|%s' dstA=`%s|%s'\n",srcAType.data(),srcAName.data(),
+ // dstAType.data(),dstAName.data());
+
+ if (srcA->array!=dstA->array) // nomatch for char[] against char
+ {
+ NOMATCH
+ return FALSE;
+ }
+ if (srcAType!=dstAType) // check if the argument only differs on name
+ {
+
+ // remove a namespace scope that is only in one type
+ // (assuming a using statement was used)
+ //printf("Trimming %s<->%s: %s\n",srcAType.data(),dstAType.data(),namespaceName.data());
+ //trimNamespaceScope(srcAType,dstAType,namespaceName);
+ //printf("After Trimming %s<->%s\n",srcAType.data(),dstAType.data());
+
+ //QCString srcScope;
+ //QCString dstScope;
+
+ // strip redundant scope specifiers
+ if (!className.isEmpty())
+ {
+ srcAType=trimScope(className,srcAType);
+ dstAType=trimScope(className,dstAType);
+ //printf("trimScope: `%s' <=> `%s'\n",srcAType.data(),dstAType.data());
+ ClassDef *cd;
+ if (!namespaceName.isEmpty())
+ cd=getClass(namespaceName+"::"+className);
+ else
+ cd=getClass(className);
+ if (cd && cd->baseClasses())
+ {
+ trimBaseClassScope(cd->baseClasses(),srcAType);
+ trimBaseClassScope(cd->baseClasses(),dstAType);
+ }
+ //printf("trimBaseClassScope: `%s' <=> `%s'\n",srcAType.data(),dstAType.data());
+ }
+ if (!namespaceName.isEmpty())
+ {
+ srcAType=trimScope(namespaceName,srcAType);
+ dstAType=trimScope(namespaceName,dstAType);
+ }
+ //printf("#usingNamespace=%d\n",usingNamespaces->count());
+ if (usingNamespaces && usingNamespaces->count()>0)
+ {
+ NamespaceSDict::Iterator nli(*usingNamespaces);
+ NamespaceDef *nd;
+ for (;(nd=nli.current());++nli)
+ {
+ srcAType=trimScope(nd->name(),srcAType);
+ dstAType=trimScope(nd->name(),dstAType);
+ }
+ }
+ //printf("#usingClasses=%d\n",usingClasses->count());
+ if (usingClasses && usingClasses->count()>0)
+ {
+ SDict<Definition>::Iterator cli(*usingClasses);
+ Definition *cd;
+ for (;(cd=cli.current());++cli)
+ {
+ srcAType=trimScope(cd->name(),srcAType);
+ dstAType=trimScope(cd->name(),dstAType);
+ }
+ }
+
+ //printf("2. srcA=%s|%s dstA=%s|%s\n",srcAType.data(),srcAName.data(),
+ // dstAType.data(),dstAName.data());
+
+ if (!srcAName.isEmpty() && !dstA->type.isEmpty() &&
+ (srcAType+" "+srcAName)==dstAType)
+ {
+ MATCH
+ return TRUE;
+ }
+ else if (!dstAName.isEmpty() && !srcA->type.isEmpty() &&
+ (dstAType+" "+dstAName)==srcAType)
+ {
+ MATCH
+ return TRUE;
+ }
+
+
+ uint srcPos=0,dstPos=0;
+ bool equal=TRUE;
+ while (srcPos<srcAType.length() && dstPos<dstAType.length() && equal)
+ {
+ equal=srcAType.at(srcPos)==dstAType.at(dstPos);
+ if (equal) srcPos++,dstPos++;
+ }
+ uint srcATypeLen=srcAType.length();
+ uint dstATypeLen=dstAType.length();
+ if (srcPos<srcATypeLen && dstPos<dstATypeLen)
+ {
+ // if nothing matches or the match ends in the middle or at the
+ // end of a string then there is no match
+ if (srcPos==0 || dstPos==0)
+ {
+ NOMATCH
+ return FALSE;
+ }
+ if (isId(srcAType.at(srcPos)) && isId(dstAType.at(dstPos)))
+ {
+ //printf("partial match srcPos=%d dstPos=%d!\n",srcPos,dstPos);
+ // check if a name if already found -> if no then there is no match
+ if (!srcAName.isEmpty() || !dstAName.isEmpty())
+ {
+ NOMATCH
+ return FALSE;
+ }
+ // types only
+ while (srcPos<srcATypeLen && isId(srcAType.at(srcPos))) srcPos++;
+ while (dstPos<dstATypeLen && isId(dstAType.at(dstPos))) dstPos++;
+ if (srcPos<srcATypeLen ||
+ dstPos<dstATypeLen ||
+ (srcPos==srcATypeLen && dstPos==dstATypeLen)
+ )
+ {
+ NOMATCH
+ return FALSE;
+ }
+ }
+ else
+ {
+ // otherwise we assume that a name starts at the current position.
+ while (srcPos<srcATypeLen && isId(srcAType.at(srcPos))) srcPos++;
+ while (dstPos<dstATypeLen && isId(dstAType.at(dstPos))) dstPos++;
+
+ // if nothing more follows for both types then we assume we have
+ // found a match. Note that now `signed int' and `signed' match, but
+ // seeing that int is not a name can only be done by looking at the
+ // semantics.
+
+ if (srcPos!=srcATypeLen || dstPos!=dstATypeLen)
+ {
+ NOMATCH
+ return FALSE;
+ }
+ }
+ }
+ else if (dstPos<dstAType.length())
+ {
+ if (!isspace((uchar)dstAType.at(dstPos))) // maybe the names differ
+ {
+ if (!dstAName.isEmpty()) // dst has its name separated from its type
+ {
+ NOMATCH
+ return FALSE;
+ }
+ while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++;
+ if (dstPos!=dstAType.length())
+ {
+ NOMATCH
+ return FALSE; // more than a difference in name -> no match
+ }
+ }
+ else // maybe dst has a name while src has not
+ {
+ dstPos++;
+ while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++;
+ if (dstPos!=dstAType.length() || !srcAName.isEmpty())
+ {
+ NOMATCH
+ return FALSE; // nope not a name -> no match
+ }
+ }
+ }
+ else if (srcPos<srcAType.length())
+ {
+ if (!isspace((uchar)srcAType.at(srcPos))) // maybe the names differ
+ {
+ if (!srcAName.isEmpty()) // src has its name separated from its type
+ {
+ NOMATCH
+ return FALSE;
+ }
+ while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++;
+ if (srcPos!=srcAType.length())
+ {
+ NOMATCH
+ return FALSE; // more than a difference in name -> no match
+ }
+ }
+ else // maybe src has a name while dst has not
+ {
+ srcPos++;
+ while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++;
+ if (srcPos!=srcAType.length() || !dstAName.isEmpty())
+ {
+ NOMATCH
+ return FALSE; // nope not a name -> no match
+ }
+ }
+ }
+ }
+ MATCH
+ return TRUE;
+}
+
+
+/*!
+ * Matches the arguments list srcAl with the argument list dstAl
+ * Returns TRUE if the argument lists are equal. Two argument list are
+ * considered equal if the number of arguments is equal and the types of all
+ * arguments are equal. Furthermore the const and volatile specifiers
+ * stored in the list should be equal.
+ */
+bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl,
+ const char *cl,const char *ns,bool checkCV,
+ NamespaceSDict *usingNamespaces,
+ SDict<Definition> *usingClasses)
+{
+ QCString className=cl;
+ QCString namespaceName=ns;
+
+ // strip template specialization from class name if present
+ //int til=className.find('<'),tir=className.find('>');
+ //if (til!=-1 && tir!=-1 && tir>til)
+ //{
+ // className=className.left(til)+className.right(className.length()-tir-1);
+ //}
+
+ //printf("matchArguments(%s,%s) className=%s namespaceName=%s checkCV=%d usingNamespaces=%d usingClasses=%d\n",
+ // srcAl ? argListToString(srcAl).data() : "",
+ // dstAl ? argListToString(dstAl).data() : "",
+ // cl,ns,checkCV,
+ // usingNamespaces?usingNamespaces->count():0,
+ // usingClasses?usingClasses->count():0
+ // );
+
+ if (srcAl==0 || dstAl==0)
+ {
+ bool match = srcAl==dstAl; // at least one of the members is not a function
+ if (match)
+ {
+ MATCH
+ return TRUE;
+ }
+ else
+ {
+ NOMATCH
+ return FALSE;
+ }
+ }
+
+ // handle special case with void argument
+ if ( srcAl->count()==0 && dstAl->count()==1 &&
+ dstAl->getFirst()->type=="void" )
+ { // special case for finding match between func() and func(void)
+ Argument *a=new Argument;
+ a->type = "void";
+ srcAl->append(a);
+ MATCH
+ return TRUE;
+ }
+ if ( dstAl->count()==0 && srcAl->count()==1 &&
+ srcAl->getFirst()->type=="void" )
+ { // special case for finding match between func(void) and func()
+ Argument *a=new Argument;
+ a->type = "void";
+ dstAl->append(a);
+ MATCH
+ return TRUE;
+ }
+
+ if (srcAl->count() != dstAl->count())
+ {
+ NOMATCH
+ return FALSE; // different number of arguments -> no match
+ }
+
+ if (checkCV)
+ {
+ if (srcAl->constSpecifier != dstAl->constSpecifier)
+ {
+ NOMATCH
+ return FALSE; // one member is const, the other not -> no match
+ }
+ if (srcAl->volatileSpecifier != dstAl->volatileSpecifier)
+ {
+ NOMATCH
+ return FALSE; // one member is volatile, the other not -> no match
+ }
+ }
+
+ // so far the argument list could match, so we need to compare the types of
+ // all arguments.
+ ArgumentListIterator srcAli(*srcAl),dstAli(*dstAl);
+ Argument *srcA,*dstA;
+ for (;(srcA=srcAli.current(),dstA=dstAli.current());++srcAli,++dstAli)
+ {
+ if (!matchArgument(srcA,dstA,className,namespaceName,
+ usingNamespaces,usingClasses))
+ {
+ NOMATCH
+ return FALSE;
+ }
+ }
+ MATCH
+ return TRUE; // all arguments match
+}
+
+#endif
+
+#if 0
+static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templSpec)
+{
+ ASSERT(symbol!=0);
+ if (symbol->definitionType()==Definition::TypeMember &&
+ ((MemberDef*)symbol)->isTypedef()) // if symbol is a typedef then try
+ // to resolve it
+ {
+ MemberDef *md = 0;
+ ClassDef *cd = newResolveTypedef(fs,(MemberDef*)symbol,&md,&templSpec);
+ if (cd)
+ {
+ return cd->qualifiedName()+templSpec;
+ }
+ else if (md)
+ {
+ return md->qualifiedName();
+ }
+ }
+ return symbol->qualifiedName();
+}
+#endif
+
+static QCString stripDeclKeywords(const QCString &s)
+{
+ int i=s.find(" class ");
+ if (i!=-1) return s.left(i)+s.mid(i+6);
+ i=s.find(" typename ");
+ if (i!=-1) return s.left(i)+s.mid(i+9);
+ i=s.find(" union ");
+ if (i!=-1) return s.left(i)+s.mid(i+6);
+ i=s.find(" struct ");
+ if (i!=-1) return s.left(i)+s.mid(i+7);
+ return s;
+}
+
+// forward decl for circular dependencies
+static QCString extractCanonicalType(Definition *d,FileDef *fs,QCString type);
+
+QCString getCanonicalTemplateSpec(Definition *d,FileDef *fs,const QCString& spec)
+{
+
+ QCString templSpec = spec.stripWhiteSpace();
+ // this part had been commented out before... but it is needed to match for instance
+ // std::list<std::string> against list<string> so it is now back again!
+ if (!templSpec.isEmpty() && templSpec.at(0) == '<')
+ {
+ templSpec = "< " + extractCanonicalType(d,fs,templSpec.right(templSpec.length()-1).stripWhiteSpace());
+ }
+ QCString resolvedType = resolveTypeDef(d,templSpec);
+ if (!resolvedType.isEmpty()) // not known as a typedef either
+ {
+ templSpec = resolvedType;
+ }
+ //printf("getCanonicalTemplateSpec(%s)=%s\n",spec.data(),templSpec.data());
+ return templSpec;
+}
+
+
+static QCString getCanonicalTypeForIdentifier(
+ Definition *d,FileDef *fs,const QCString &word,
+ QCString *tSpec,int count=0)
+{
+ if (count>10) return word; // oops recursion
+
+ QCString symName,scope,result,templSpec,tmpName;
+ //DefinitionList *defList=0;
+ if (tSpec && !tSpec->isEmpty())
+ templSpec = stripDeclKeywords(getCanonicalTemplateSpec(d,fs,*tSpec));
+
+ if (word.findRev("::")!=-1 && !(tmpName=stripScope(word)).isEmpty())
+ {
+ symName=tmpName; // name without scope
+ }
+ else
+ {
+ symName=word;
+ }
+ //printf("getCanonicalTypeForIdentifier(%s,[%s->%s]) start\n",
+ // word.data(),tSpec?tSpec->data():"<none>",templSpec.data());
+
+ ClassDef *cd = 0;
+ MemberDef *mType = 0;
+ QCString ts;
+ QCString resolvedType;
+
+ // lookup class / class template instance
+ cd = getResolvedClass(d,fs,word+templSpec,&mType,&ts,TRUE,TRUE,&resolvedType);
+ bool isTemplInst = cd && !templSpec.isEmpty();
+ if (!cd && !templSpec.isEmpty())
+ {
+ // class template specialization not known, look up class template
+ cd = getResolvedClass(d,fs,word,&mType,&ts,TRUE,TRUE,&resolvedType);
+ }
+ if (cd && cd->isUsedOnly()) cd=0; // ignore types introduced by usage relations
+
+ //printf("cd=%p mtype=%p\n",cd,mType);
+ //printf(" getCanonicalTypeForIdentifer: symbol=%s word=%s cd=%s d=%s fs=%s cd->isTemplate=%d\n",
+ // symName.data(),
+ // word.data(),
+ // cd?cd->name().data():"<none>",
+ // d?d->name().data():"<none>",
+ // fs?fs->name().data():"<none>",
+ // cd?cd->isTemplate():-1
+ // );
+
+ //printf(" >>>> word '%s' => '%s' templSpec=%s ts=%s tSpec=%s isTemplate=%d resolvedType=%s\n",
+ // (word+templSpec).data(),
+ // cd?cd->qualifiedName().data():"<none>",
+ // templSpec.data(),ts.data(),
+ // tSpec?tSpec->data():"<null>",
+ // cd?cd->isTemplate():FALSE,
+ // resolvedType.data());
+
+ //printf(" mtype=%s\n",mType?mType->name().data():"<none>");
+
+ if (cd) // resolves to a known class type
+ {
+ if (cd==d && tSpec) *tSpec="";
+
+ if (mType && mType->isTypedef()) // but via a typedef
+ {
+ result = resolvedType;
+ }
+ else
+ {
+ if (isTemplInst)
+ {
+ // spec is already part of class type
+ templSpec="";
+ if (tSpec) *tSpec="";
+ }
+ else if (!ts.isEmpty() && templSpec.isEmpty())
+ {
+ // use formal template args for spec
+ templSpec = stripDeclKeywords(getCanonicalTemplateSpec(d,fs,ts));
+ }
+
+ result = removeRedundantWhiteSpace(cd->qualifiedName() + templSpec);
+
+ if (cd->isTemplate() && tSpec) //
+ {
+ if (!templSpec.isEmpty()) // specific instance
+ {
+ result=cd->name()+templSpec;
+ }
+ else // use template type
+ {
+ result=cd->qualifiedNameWithTemplateParameters();
+ }
+ // template class, so remove the template part (it is part of the class name)
+ *tSpec="";
+ }
+ else if (ts.isEmpty() && !templSpec.isEmpty() && cd && !cd->isTemplate() && tSpec)
+ {
+ // obscure case, where a class is used as a template, but doxygen think it is
+ // not (could happen when loading the class from a tag file).
+ *tSpec="";
+ }
+ }
+ }
+ else if (mType && mType->isEnumerate()) // an enum
+ {
+ result = mType->qualifiedName();
+ }
+ else if (mType && mType->isTypedef()) // a typedef
+ {
+ //result = mType->qualifiedName(); // changed after 1.7.2
+ //result = mType->typeString();
+ //printf("word=%s typeString=%s\n",word.data(),mType->typeString());
+ if (word!=mType->typeString())
+ {
+ result = getCanonicalTypeForIdentifier(d,fs,mType->typeString(),tSpec,count+1);
+ }
+ else
+ {
+ result = mType->typeString();
+ }
+ }
+ else // fallback
+ {
+ resolvedType = resolveTypeDef(d,word);
+ //printf("typedef [%s]->[%s]\n",word.data(),resolvedType.data());
+ if (resolvedType.isEmpty()) // not known as a typedef either
+ {
+ result = word;
+ }
+ else
+ {
+ result = resolvedType;
+ }
+ }
+ //printf("getCanonicalTypeForIdentifier [%s]->[%s]\n",word.data(),result.data());
+ return result;
+}
+
+static QCString extractCanonicalType(Definition *d,FileDef *fs,QCString type)
+{
+ type = type.stripWhiteSpace();
+
+ // strip const and volatile keywords that are not relevant for the type
+ stripIrrelevantConstVolatile(type);
+
+ // strip leading keywords
+ type.stripPrefix("class ");
+ type.stripPrefix("struct ");
+ type.stripPrefix("union ");
+ type.stripPrefix("enum ");
+ type.stripPrefix("typename ");
+
+ type = removeRedundantWhiteSpace(type);
+ //printf("extractCanonicalType(type=%s) start: def=%s file=%s\n",type.data(),
+ // d ? d->name().data() : "<null>",fs ? fs->name().data() : "<null>");
+
+ //static QRegExp id("[a-z_A-Z\\x80-\\xFF][:a-z_A-Z0-9\\x80-\\xFF]*");
+
+ QCString canType;
+ QCString templSpec,word;
+ int i,p=0,pp=0;
+ while ((i=extractClassNameFromType(type,p,word,templSpec))!=-1)
+ // foreach identifier in the type
+ {
+ //printf(" i=%d p=%d\n",i,p);
+ if (i>pp) canType += type.mid(pp,i-pp);
+
+
+ QCString ct = getCanonicalTypeForIdentifier(d,fs,word,&templSpec);
+
+ // in case the ct is empty it means that "word" represents scope "d"
+ // and this does not need to be added to the canonical
+ // type (it is redundant), so/ we skip it. This solves problem 589616.
+ if (ct.isEmpty() && type.mid(p,2)=="::")
+ {
+ p+=2;
+ }
+ else
+ {
+ canType += ct;
+ }
+ //printf(" word=%s templSpec=%s canType=%s ct=%s\n",
+ // word.data(),templSpec.data(),canType.data(),ct.data());
+ if (!templSpec.isEmpty()) // if we didn't use up the templSpec already
+ // (i.e. type is not a template specialization)
+ // then resolve any identifiers inside.
+ {
+ static QRegExp re("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9\\x80-\\xFF]*");
+ int tp=0,tl,ti;
+ // for each identifier template specifier
+ //printf("adding resolved %s to %s\n",templSpec.data(),canType.data());
+ while ((ti=re.match(templSpec,tp,&tl))!=-1)
+ {
+ canType += templSpec.mid(tp,ti-tp);
+ canType += getCanonicalTypeForIdentifier(d,fs,templSpec.mid(ti,tl),0);
+ tp=ti+tl;
+ }
+ canType+=templSpec.right(templSpec.length()-tp);
+ }
+
+ pp=p;
+ }
+ canType += type.right(type.length()-pp);
+ //printf("extractCanonicalType = '%s'->'%s'\n",type.data(),canType.data());
+
+ return removeRedundantWhiteSpace(canType);
+}
+
+static QCString extractCanonicalArgType(Definition *d,FileDef *fs,const Argument *arg)
+{
+ QCString type = arg->type.stripWhiteSpace();
+ QCString name = arg->name;
+ //printf("----- extractCanonicalArgType(type=%s,name=%s)\n",type.data(),name.data());
+ if ((type=="const" || type=="volatile") && !name.isEmpty())
+ { // name is part of type => correct
+ type+=" ";
+ type+=name;
+ }
+ if (name=="const" || name=="volatile")
+ { // name is part of type => correct
+ if (!type.isEmpty()) type+=" ";
+ type+=name;
+ }
+ if (!arg->array.isEmpty())
+ {
+ type+=arg->array;
+ }
+
+ return extractCanonicalType(d,fs,type);
+}
+
+static bool matchArgument2(
+ Definition *srcScope,FileDef *srcFileScope,Argument *srcA,
+ Definition *dstScope,FileDef *dstFileScope,Argument *dstA
+ )
+{
+ //printf(">> match argument: %s::`%s|%s' (%s) <-> %s::`%s|%s' (%s)\n",
+ // srcScope ? srcScope->name().data() : "",
+ // srcA->type.data(),srcA->name.data(),srcA->canType.data(),
+ // dstScope ? dstScope->name().data() : "",
+ // dstA->type.data(),dstA->name.data(),dstA->canType.data());
+
+ //if (srcA->array!=dstA->array) // nomatch for char[] against char
+ //{
+ // NOMATCH
+ // return FALSE;
+ //}
+ QCString sSrcName = " "+srcA->name;
+ QCString sDstName = " "+dstA->name;
+ QCString srcType = srcA->type;
+ QCString dstType = dstA->type;
+ stripIrrelevantConstVolatile(srcType);
+ stripIrrelevantConstVolatile(dstType);
+ //printf("'%s'<->'%s'\n",sSrcName.data(),dstType.right(sSrcName.length()).data());
+ //printf("'%s'<->'%s'\n",sDstName.data(),srcType.right(sDstName.length()).data());
+ if (sSrcName==dstType.right(sSrcName.length()))
+ { // case "unsigned int" <-> "unsigned int i"
+ srcA->type+=sSrcName;
+ srcA->name="";
+ srcA->canType=""; // invalidate cached type value
+ }
+ else if (sDstName==srcType.right(sDstName.length()))
+ { // case "unsigned int i" <-> "unsigned int"
+ dstA->type+=sDstName;
+ dstA->name="";
+ dstA->canType=""; // invalidate cached type value
+ }
+
+ if (srcA->canType.isEmpty())
+ {
+ srcA->canType = extractCanonicalArgType(srcScope,srcFileScope,srcA);
+ }
+ if (dstA->canType.isEmpty())
+ {
+ dstA->canType = extractCanonicalArgType(dstScope,dstFileScope,dstA);
+ }
+
+ if (srcA->canType==dstA->canType)
+ {
+ MATCH
+ return TRUE;
+ }
+ else
+ {
+ //printf(" Canonical types do not match [%s]<->[%s]\n",
+ // srcA->canType.data(),dstA->canType.data());
+ NOMATCH
+ return FALSE;
+ }
+}
+
+
+// new algorithm for argument matching
+bool matchArguments2(Definition *srcScope,FileDef *srcFileScope,ArgumentList *srcAl,
+ Definition *dstScope,FileDef *dstFileScope,ArgumentList *dstAl,
+ bool checkCV
+ )
+{
+ //printf("*** matchArguments2\n");
+ ASSERT(srcScope!=0 && dstScope!=0);
+
+ if (srcAl==0 || dstAl==0)
+ {
+ bool match = srcAl==dstAl; // at least one of the members is not a function
+ if (match)
+ {
+ MATCH
+ return TRUE;
+ }
+ else
+ {
+ NOMATCH
+ return FALSE;
+ }
+ }
+
+ // handle special case with void argument
+ if ( srcAl->count()==0 && dstAl->count()==1 &&
+ dstAl->getFirst()->type=="void" )
+ { // special case for finding match between func() and func(void)
+ Argument *a=new Argument;
+ a->type = "void";
+ srcAl->append(a);
+ MATCH
+ return TRUE;
+ }
+ if ( dstAl->count()==0 && srcAl->count()==1 &&
+ srcAl->getFirst()->type=="void" )
+ { // special case for finding match between func(void) and func()
+ Argument *a=new Argument;
+ a->type = "void";
+ dstAl->append(a);
+ MATCH
+ return TRUE;
+ }
+
+ if (srcAl->count() != dstAl->count())
+ {
+ NOMATCH
+ return FALSE; // different number of arguments -> no match
+ }
+
+ if (checkCV)
+ {
+ if (srcAl->constSpecifier != dstAl->constSpecifier)
+ {
+ NOMATCH
+ return FALSE; // one member is const, the other not -> no match
+ }
+ if (srcAl->volatileSpecifier != dstAl->volatileSpecifier)
+ {
+ NOMATCH
+ return FALSE; // one member is volatile, the other not -> no match
+ }
+ }
+
+ // so far the argument list could match, so we need to compare the types of
+ // all arguments.
+ ArgumentListIterator srcAli(*srcAl),dstAli(*dstAl);
+ Argument *srcA,*dstA;
+ for (;(srcA=srcAli.current(),dstA=dstAli.current());++srcAli,++dstAli)
+ {
+ if (!matchArgument2(srcScope,srcFileScope,srcA,
+ dstScope,dstFileScope,dstA)
+ )
+ {
+ NOMATCH
+ return FALSE;
+ }
+ }
+ MATCH
+ return TRUE; // all arguments match
+}
+
+
+
+// merges the initializer of two argument lists
+// pre: the types of the arguments in the list should match.
+void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl,bool forceNameOverwrite)
+{
+ //printf("mergeArguments `%s', `%s'\n",
+ // argListToString(srcAl).data(),argListToString(dstAl).data());
+
+ if (srcAl==0 || dstAl==0 || srcAl->count()!=dstAl->count())
+ {
+ return; // invalid argument lists -> do not merge
+ }
+
+ ArgumentListIterator srcAli(*srcAl),dstAli(*dstAl);
+ Argument *srcA,*dstA;
+ for (;(srcA=srcAli.current(),dstA=dstAli.current());++srcAli,++dstAli)
+ {
+ if (srcA->defval.isEmpty() && !dstA->defval.isEmpty())
+ {
+ //printf("Defval changing `%s'->`%s'\n",srcA->defval.data(),dstA->defval.data());
+ srcA->defval=dstA->defval.copy();
+ }
+ else if (!srcA->defval.isEmpty() && dstA->defval.isEmpty())
+ {
+ //printf("Defval changing `%s'->`%s'\n",dstA->defval.data(),srcA->defval.data());
+ dstA->defval=srcA->defval.copy();
+ }
+
+ // fix wrongly detected const or volatile specifiers before merging.
+ // example: "const A *const" is detected as type="const A *" name="const"
+ if (srcA->name=="const" || srcA->name=="volatile")
+ {
+ srcA->type+=" "+srcA->name;
+ srcA->name.resize(0);
+ }
+ if (dstA->name=="const" || dstA->name=="volatile")
+ {
+ dstA->type+=" "+dstA->name;
+ dstA->name.resize(0);
+ }
+
+ if (srcA->type==dstA->type)
+ {
+ //printf("1. merging %s:%s <-> %s:%s\n",srcA->type.data(),srcA->name.data(),dstA->type.data(),dstA->name.data());
+ if (srcA->name.isEmpty() && !dstA->name.isEmpty())
+ {
+ //printf("type: `%s':=`%s'\n",srcA->type.data(),dstA->type.data());
+ //printf("name: `%s':=`%s'\n",srcA->name.data(),dstA->name.data());
+ srcA->type = dstA->type.copy();
+ srcA->name = dstA->name.copy();
+ }
+ else if (!srcA->name.isEmpty() && dstA->name.isEmpty())
+ {
+ //printf("type: `%s':=`%s'\n",dstA->type.data(),srcA->type.data());
+ //printf("name: `%s':=`%s'\n",dstA->name.data(),srcA->name.data());
+ dstA->type = srcA->type.copy();
+ dstA->name = dstA->name.copy();
+ }
+ else if (!srcA->name.isEmpty() && !dstA->name.isEmpty())
+ {
+ //printf("srcA->name=%s dstA->name=%s\n",srcA->name.data(),dstA->name.data());
+ if (forceNameOverwrite)
+ {
+ srcA->name = dstA->name;
+ }
+ else
+ {
+ if (srcA->docs.isEmpty() && !dstA->docs.isEmpty())
+ {
+ srcA->name = dstA->name;
+ }
+ else if (!srcA->docs.isEmpty() && dstA->docs.isEmpty())
+ {
+ dstA->name = srcA->name;
+ }
+ }
+ }
+ }
+ else
+ {
+ //printf("2. merging '%s':'%s' <-> '%s':'%s'\n",srcA->type.data(),srcA->name.data(),dstA->type.data(),dstA->name.data());
+ srcA->type=srcA->type.stripWhiteSpace();
+ dstA->type=dstA->type.stripWhiteSpace();
+ if (srcA->type+" "+srcA->name==dstA->type) // "unsigned long:int" <-> "unsigned long int:bla"
+ {
+ srcA->type+=" "+srcA->name;
+ srcA->name=dstA->name;
+ }
+ else if (dstA->type+" "+dstA->name==srcA->type) // "unsigned long int bla" <-> "unsigned long int"
+ {
+ dstA->type+=" "+dstA->name;
+ dstA->name=srcA->name;
+ }
+ else if (srcA->name.isEmpty() && !dstA->name.isEmpty())
+ {
+ srcA->name = dstA->name;
+ }
+ else if (dstA->name.isEmpty() && !srcA->name.isEmpty())
+ {
+ dstA->name = srcA->name;
+ }
+ }
+ int i1=srcA->type.find("::"),
+ i2=dstA->type.find("::"),
+ j1=srcA->type.length()-i1-2,
+ j2=dstA->type.length()-i2-2;
+ if (i1!=-1 && i2==-1 && srcA->type.right(j1)==dstA->type)
+ {
+ //printf("type: `%s':=`%s'\n",dstA->type.data(),srcA->type.data());
+ //printf("name: `%s':=`%s'\n",dstA->name.data(),srcA->name.data());
+ dstA->type = srcA->type.left(i1+2)+dstA->type;
+ dstA->name = dstA->name.copy();
+ }
+ else if (i1==-1 && i2!=-1 && dstA->type.right(j2)==srcA->type)
+ {
+ //printf("type: `%s':=`%s'\n",srcA->type.data(),dstA->type.data());
+ //printf("name: `%s':=`%s'\n",dstA->name.data(),srcA->name.data());
+ srcA->type = dstA->type.left(i2+2)+srcA->type;
+ srcA->name = dstA->name.copy();
+ }
+ if (srcA->docs.isEmpty() && !dstA->docs.isEmpty())
+ {
+ srcA->docs = dstA->docs.copy();
+ }
+ else if (dstA->docs.isEmpty() && !srcA->docs.isEmpty())
+ {
+ dstA->docs = srcA->docs.copy();
+ }
+ //printf("Merge argument `%s|%s' `%s|%s'\n",
+ // srcA->type.data(),srcA->name.data(),
+ // dstA->type.data(),dstA->name.data());
+ }
+}
+
+static void findMembersWithSpecificName(MemberName *mn,
+ const char *args,
+ bool checkStatics,
+ FileDef *currentFile,
+ bool checkCV,
+ QList<MemberDef> &members)
+{
+ //printf(" Function with global scope name `%s' args=`%s'\n",
+ // mn->memberName(),args);
+ MemberListIterator mli(*mn);
+ MemberDef *md;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ FileDef *fd=md->getFileDef();
+ GroupDef *gd=md->getGroupDef();
+ //printf(" md->name()=`%s' md->args=`%s' fd=%p gd=%p current=%p\n",
+ // md->name().data(),args,fd,gd,currentFile);
+ if (
+ ((gd && gd->isLinkable()) || (fd && fd->isLinkable()) || md->isReference()) &&
+ md->getNamespaceDef()==0 && md->isLinkable() &&
+ (!checkStatics || (!md->isStatic() && !md->isDefine()) ||
+ currentFile==0 || fd==currentFile) // statics must appear in the same file
+ )
+ {
+ //printf(" fd=%p gd=%p args=`%s'\n",fd,gd,args);
+ bool match=TRUE;
+ ArgumentList *argList=0;
+ if (args && !md->isDefine() && strcmp(args,"()")!=0)
+ {
+ argList=new ArgumentList;
+ LockingPtr<ArgumentList> mdAl = md->argumentList();
+ stringToArgumentList(args,argList);
+ match=matchArguments2(
+ md->getOuterScope(),fd,mdAl.pointer(),
+ Doxygen::globalScope,fd,argList,
+ checkCV);
+ delete argList; argList=0;
+ }
+ if (match)
+ {
+ //printf("Found match!\n");
+ members.append(md);
+ }
+ }
+ }
+}
+
+/*!
+ * Searches for a member definition given its name `memberName' as a string.
+ * memberName may also include a (partial) scope to indicate the scope
+ * in which the member is located.
+ *
+ * The parameter `scName' is a string representing the name of the scope in
+ * which the link was found.
+ *
+ * In case of a function args contains a string representation of the
+ * argument list. Passing 0 means the member has no arguments.
+ * Passing "()" means any argument list will do, but "()" is preferred.
+ *
+ * The function returns TRUE if the member is known and documented or
+ * FALSE if it is not.
+ * If TRUE is returned parameter `md' contains a pointer to the member
+ * definition. Furthermore exactly one of the parameter `cd', `nd', or `fd'
+ * will be non-zero:
+ * - if `cd' is non zero, the member was found in a class pointed to by cd.
+ * - if `nd' is non zero, the member was found in a namespace pointed to by nd.
+ * - if `fd' is non zero, the member was found in the global namespace of
+ * file fd.
+ */
+bool getDefs(const QCString &scName,const QCString &memberName,
+ const char *args,
+ MemberDef *&md,
+ ClassDef *&cd, FileDef *&fd, NamespaceDef *&nd, GroupDef *&gd,
+ bool forceEmptyScope,
+ FileDef *currentFile,
+ bool checkCV
+ )
+{
+ fd=0, md=0, cd=0, nd=0, gd=0;
+ if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */
+
+ QCString scopeName=scName;
+ //printf("Search for name=%s args=%s in scope=%s forceEmpty=%d\n",
+ // memberName.data(),args,scopeName.data(),forceEmptyScope);
+
+ int is,im=0,pm=0;
+ // strip common part of the scope from the scopeName
+ while ((is=scopeName.findRev("::"))!=-1 &&
+ (im=memberName.find("::",pm))!=-1 &&
+ (scopeName.right(scopeName.length()-is-2)==memberName.mid(pm,im-pm))
+ )
+ {
+ scopeName=scopeName.left(is);
+ pm=im+2;
+ }
+ //printf("result after scope corrections scope=%s name=%s\n",
+ // scopeName.data(),memberName.data());
+
+ QCString mName=memberName;
+ QCString mScope;
+ if (memberName.left(9)!="operator " && // treat operator conversion methods
+ // as a special case
+ (im=memberName.findRev("::"))!=-1 &&
+ im<(int)memberName.length()-2 // not A::
+ )
+ {
+ mScope=memberName.left(im);
+ mName=memberName.right(memberName.length()-im-2);
+ }
+
+ // handle special the case where both scope name and member scope are equal
+ if (mScope==scopeName) scopeName.resize(0);
+
+ //printf("mScope=`%s' mName=`%s'\n",mScope.data(),mName.data());
+
+ MemberName *mn = Doxygen::memberNameSDict->find(mName);
+ //printf("mName=%s mn=%p\n",mName.data(),mn);
+
+ if ((!forceEmptyScope || scopeName.isEmpty()) && // this was changed for bug638856, forceEmptyScope => empty scopeName
+ mn && !(scopeName.isEmpty() && mScope.isEmpty()))
+ {
+ //printf(" >member name '%s' found\n",mName.data());
+ int scopeOffset=scopeName.length();
+ do
+ {
+ QCString className = scopeName.left(scopeOffset);
+ if (!className.isEmpty() && !mScope.isEmpty())
+ {
+ className+="::"+mScope;
+ }
+ else if (!mScope.isEmpty())
+ {
+ className=mScope;
+ }
+
+ ClassDef *fcd=getResolvedClass(Doxygen::globalScope,0,className);
+ //printf("Trying class scope %s: %p\n",className.data(),fcd);
+ // todo: fill in correct fileScope!
+ if (fcd && // is it a documented class
+ fcd->isLinkable()
+ )
+ {
+ //printf(" Found fcd=%p\n",fcd);
+ MemberListIterator mmli(*mn);
+ MemberDef *mmd;
+ int mdist=maxInheritanceDepth;
+ ArgumentList *argList=0;
+ if (args)
+ {
+ argList=new ArgumentList;
+ stringToArgumentList(args,argList);
+ }
+ for (mmli.toFirst();(mmd=mmli.current());++mmli)
+ {
+ //if (mmd->isLinkable())
+ //{
+ LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
+ bool match=args==0 ||
+ matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl.pointer(),
+ fcd,fcd->getFileDef(),argList,
+ checkCV
+ );
+ //printf("match=%d\n",match);
+ if (match)
+ {
+ ClassDef *mcd=mmd->getClassDef();
+ if (mcd)
+ {
+ int m=minClassDistance(fcd,mcd);
+ if (m<mdist && mcd->isLinkable())
+ {
+ mdist=m;
+ cd=mcd;
+ md=mmd;
+ }
+ }
+ }
+ //}
+ }
+ if (argList)
+ {
+ delete argList; argList=0;
+ }
+ if (mdist==maxInheritanceDepth && args && strcmp(args,"()")==0)
+ // no exact match found, but if args="()" an arbitrary member will do
+ {
+ //printf(" >Searching for arbitrary member\n");
+ for (mmli.toFirst();(mmd=mmli.current());++mmli)
+ {
+ //if (mmd->isLinkable())
+ //{
+ ClassDef *mcd=mmd->getClassDef();
+ //printf(" >Class %s found\n",mcd->name().data());
+ if (mcd)
+ {
+ int m=minClassDistance(fcd,mcd);
+ if (m<mdist /* && mcd->isLinkable()*/ )
+ {
+ //printf("Class distance %d\n",m);
+ mdist=m;
+ cd=mcd;
+ md=mmd;
+ }
+ }
+ //}
+ }
+ }
+ //printf(" >Succes=%d\n",mdist<maxInheritanceDepth);
+ if (mdist<maxInheritanceDepth)
+ {
+ if (!md->isLinkable())
+ {
+ md=0; // avoid returning things we cannot link to
+ cd=0;
+ return FALSE; // match found, but was not linkable
+ }
+ else
+ {
+ gd=md->getGroupDef();
+ if (gd) cd=0;
+ return TRUE; /* found match */
+ }
+ }
+ }
+ /* go to the parent scope */
+ if (scopeOffset==0)
+ {
+ scopeOffset=-1;
+ }
+ else if ((scopeOffset=scopeName.findRev("::",scopeOffset-1))==-1)
+ {
+ scopeOffset=0;
+ }
+ } while (scopeOffset>=0);
+
+ }
+ if (mn && scopeName.isEmpty() && mScope.isEmpty()) // Maybe a related function?
+ {
+ MemberListIterator mmli(*mn);
+ MemberDef *mmd, *fuzzy_mmd = 0;
+ ArgumentList *argList = 0;
+ bool hasEmptyArgs = args && strcmp(args, "()") == 0;
+
+ if (args)
+ stringToArgumentList(args, argList = new ArgumentList);
+
+ for (mmli.toFirst(); (mmd = mmli.current()); ++mmli)
+ {
+ if (!mmd->isLinkable() || (!mmd->isRelated() && !mmd->isForeign()) ||
+ !mmd->getClassDef())
+ continue;
+
+ if (!args) break;
+
+ QCString className = mmd->getClassDef()->name();
+
+ LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
+ if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl.pointer(),
+ Doxygen::globalScope,mmd->getFileDef(),argList,
+ checkCV
+ )
+ ) break;
+
+ if (!fuzzy_mmd && hasEmptyArgs)
+ fuzzy_mmd = mmd;
+ }
+
+ if (argList) delete argList, argList = 0;
+
+ mmd = mmd ? mmd : fuzzy_mmd;
+
+ if (mmd)
+ {
+ md = mmd;
+ cd = mmd->getClassDef();
+ return TRUE;
+ }
+ }
+
+
+ // maybe an namespace, file or group member ?
+ //printf("Testing for global symbol scopeName=`%s' mScope=`%s' :: mName=`%s'\n",
+ // scopeName.data(),mScope.data(),mName.data());
+ if ((mn=Doxygen::functionNameSDict->find(mName))) // name is known
+ {
+ //printf(" >symbol name found\n");
+ NamespaceDef *fnd=0;
+ int scopeOffset=scopeName.length();
+ do
+ {
+ QCString namespaceName = scopeName.left(scopeOffset);
+ if (!namespaceName.isEmpty() && !mScope.isEmpty())
+ {
+ namespaceName+="::"+mScope;
+ }
+ else if (!mScope.isEmpty())
+ {
+ namespaceName=mScope.copy();
+ }
+ //printf("Trying namespace %s\n",namespaceName.data());
+ if (!namespaceName.isEmpty() &&
+ (fnd=Doxygen::namespaceSDict->find(namespaceName)) &&
+ fnd->isLinkable()
+ )
+ {
+ //printf("Function inside existing namespace `%s'\n",namespaceName.data());
+ bool found=FALSE;
+ MemberListIterator mmli(*mn);
+ MemberDef *mmd;
+ for (mmli.toFirst();((mmd=mmli.current()) && !found);++mmli)
+ {
+ //printf("mmd->getNamespaceDef()=%p fnd=%p\n",
+ // mmd->getNamespaceDef(),fnd);
+ if (mmd->getNamespaceDef()==fnd /* && mmd->isLinkable() */ )
+ { // namespace is found
+ bool match=TRUE;
+ ArgumentList *argList=0;
+ if (args && strcmp(args,"()")!=0)
+ {
+ argList=new ArgumentList;
+ LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
+ stringToArgumentList(args,argList);
+ match=matchArguments2(
+ mmd->getOuterScope(),mmd->getFileDef(),mmdAl.pointer(),
+ fnd,mmd->getFileDef(),argList,
+ checkCV);
+ }
+ if (match)
+ {
+ nd=fnd;
+ md=mmd;
+ found=TRUE;
+ }
+ if (args)
+ {
+ delete argList; argList=0;
+ }
+ }
+ }
+ if (!found && args && !strcmp(args,"()"))
+ // no exact match found, but if args="()" an arbitrary
+ // member will do
+ {
+ for (mmli.toFirst();((mmd=mmli.current()) && !found);++mmli)
+ {
+ if (mmd->getNamespaceDef()==fnd /*&& mmd->isLinkable() */ )
+ {
+ nd=fnd;
+ md=mmd;
+ found=TRUE;
+ }
+ }
+ }
+ if (found)
+ {
+ if (!md->isLinkable())
+ {
+ md=0; // avoid returning things we cannot link to
+ nd=0;
+ return FALSE; // match found but not linkable
+ }
+ else
+ {
+ gd=md->getGroupDef();
+ if (gd && gd->isLinkable()) nd=0; else gd=0;
+ return TRUE;
+ }
+ }
+ }
+ if (scopeOffset==0)
+ {
+ scopeOffset=-1;
+ }
+ else if ((scopeOffset=scopeName.findRev("::",scopeOffset-1))==-1)
+ {
+ scopeOffset=0;
+ }
+ } while (scopeOffset>=0);
+
+ //else // no scope => global function
+ {
+ QList<MemberDef> members;
+ // search for matches with strict static checking
+ findMembersWithSpecificName(mn,args,TRUE,currentFile,checkCV,members);
+ if (members.count()==0) // nothing found
+ {
+ // search again without strict static checking
+ findMembersWithSpecificName(mn,args,FALSE,currentFile,checkCV,members);
+ }
+ if (members.count()!=1 && args && !strcmp(args,"()"))
+ {
+ // no exact match found, but if args="()" an arbitrary
+ // member will do
+ md=mn->last();
+ while (md /* && md->isLinkable()*/)
+ {
+ //printf("Found member `%s'\n",md->name().data());
+ //printf("member is linkable md->name()=`%s'\n",md->name().data());
+ fd=md->getFileDef();
+ gd=md->getGroupDef();
+ if (
+ (gd && gd->isLinkable()) || (fd && fd->isLinkable())
+ )
+ {
+ members.append(md);
+ }
+ md=mn->prev();
+ }
+ }
+ //printf("found %d candidate members\n",members.count());
+ if (members.count()>0) // at least one match
+ {
+ md=members.last();
+ }
+ if (md) // found a matching global member
+ {
+ fd=md->getFileDef();
+ gd=md->getGroupDef();
+ //printf("fd=%p gd=%p gd->isLinkable()=%d\n",fd,gd,gd->isLinkable());
+ if (gd && gd->isLinkable()) fd=0; else gd=0;
+ return TRUE;
+ }
+ }
+ }
+
+ // no nothing found
+ return FALSE;
+}
+
+/*!
+ * Searches for a scope definition given its name as a string via parameter
+ * `scope'.
+ *
+ * The parameter `docScope' is a string representing the name of the scope in
+ * which the `scope' string was found.
+ *
+ * The function returns TRUE if the scope is known and documented or
+ * FALSE if it is not.
+ * If TRUE is returned exactly one of the parameter `cd', `nd'
+ * will be non-zero:
+ * - if `cd' is non zero, the scope was a class pointed to by cd.
+ * - if `nd' is non zero, the scope was a namespace pointed to by nd.
+ */
+static bool getScopeDefs(const char *docScope,const char *scope,
+ ClassDef *&cd, NamespaceDef *&nd)
+{
+ cd=0;nd=0;
+
+ QCString scopeName=scope;
+ //printf("getScopeDefs: docScope=`%s' scope=`%s'\n",docScope,scope);
+ if (scopeName.isEmpty()) return FALSE;
+
+ bool explicitGlobalScope=FALSE;
+ if (scopeName.at(0)==':' && scopeName.at(1)==':')
+ {
+ scopeName=scopeName.right(scopeName.length()-2);
+ explicitGlobalScope=TRUE;
+ }
+
+ QCString docScopeName=docScope;
+ int scopeOffset=explicitGlobalScope ? 0 : docScopeName.length();
+
+ do // for each possible docScope (from largest to and including empty)
+ {
+ QCString fullName=scopeName.copy();
+ if (scopeOffset>0) fullName.prepend(docScopeName.left(scopeOffset)+"::");
+
+ if (((cd=getClass(fullName)) || // normal class
+ (cd=getClass(fullName+"-p")) || // ObjC protocol
+ (cd=getClass(fullName+"-g")) // C# generic
+ ) && cd->isLinkable())
+ {
+ return TRUE; // class link written => quit
+ }
+ else if ((nd=Doxygen::namespaceSDict->find(fullName)) && nd->isLinkable())
+ {
+ return TRUE; // namespace link written => quit
+ }
+ if (scopeOffset==0)
+ {
+ scopeOffset=-1;
+ }
+ else if ((scopeOffset=docScopeName.findRev("::",scopeOffset-1))==-1)
+ {
+ scopeOffset=0;
+ }
+ } while (scopeOffset>=0);
+
+ return FALSE;
+}
+
+static bool isLowerCase(QCString &s)
+{
+ uchar *p=(uchar*)s.data();
+ if (p==0) return TRUE;
+ int c;
+ while ((c=*p++)) if (!islower(c)) return FALSE;
+ return TRUE;
+}
+
+/*! Returns an object to reference to given its name and context
+ * @post return value TRUE implies *resContext!=0 or *resMember!=0
+ */
+bool resolveRef(/* in */ const char *scName,
+ /* in */ const char *name,
+ /* in */ bool inSeeBlock,
+ /* out */ Definition **resContext,
+ /* out */ MemberDef **resMember,
+ bool lookForSpecialization,
+ FileDef *currentFile,
+ bool checkScope
+ )
+{
+ QCString tsName = name;
+ //bool memberScopeFirst = tsName.find('#')!=-1;
+ QCString fullName = substitute(tsName,"#","::");
+ fullName = removeRedundantWhiteSpace(substitute(fullName,".","::"));
+
+ int bracePos=fullName.findRev('('); // reverse is needed for operator()(...)
+ int endNamePos=bracePos!=-1 ? bracePos : fullName.length();
+ int scopePos=fullName.findRev("::",endNamePos);
+ bool explicitScope = fullName.left(2)=="::" && // ::scope or #scope
+ (scopePos>2 || // ::N::A
+ tsName.left(2)=="::" || // ::foo in local scope
+ scName==0 // #foo in global scope
+ );
+
+ // default result values
+ *resContext=0;
+ *resMember=0;
+
+ if (bracePos==-1) // simple name
+ {
+ ClassDef *cd=0;
+ NamespaceDef *nd=0;
+
+ // the following if() was commented out for releases in the range
+ // 1.5.2 to 1.6.1, but has been restored as a result of bug report 594787.
+ if (!inSeeBlock && scopePos==-1 && isLowerCase(tsName))
+ { // link to lower case only name => do not try to autolink
+ return FALSE;
+ }
+
+ //printf("scName=%s fullName=%s\n",scName,fullName.data());
+
+ // check if this is a class or namespace reference
+ if (scName!=fullName && getScopeDefs(scName,fullName,cd,nd))
+ {
+ if (cd) // scope matches that of a class
+ {
+ *resContext = cd;
+ }
+ else // scope matches that of a namespace
+ {
+ ASSERT(nd!=0);
+ *resContext = nd;
+ }
+ return TRUE;
+ }
+ else if (scName==fullName || (!inSeeBlock && scopePos==-1))
+ // nothing to link => output plain text
+ {
+ //printf("found scName=%s fullName=%s scName==fullName=%d "
+ // "inSeeBlock=%d scopePos=%d!\n",
+ // scName,fullName.data(),scName==fullName,inSeeBlock,scopePos);
+ return FALSE;
+ }
+ // continue search...
+ }
+
+ // extract userscope+name
+ QCString nameStr=fullName.left(endNamePos);
+ if (explicitScope) nameStr=nameStr.mid(2);
+
+ // extract arguments
+ QCString argsStr;
+ if (bracePos!=-1) argsStr=fullName.right(fullName.length()-bracePos);
+
+ // strip template specifier
+ // TODO: match against the correct partial template instantiation
+ int templPos=nameStr.find('<');
+ bool tryUnspecializedVersion = FALSE;
+ if (templPos!=-1 && nameStr.find("operator")==-1)
+ {
+ int endTemplPos=nameStr.findRev('>');
+ if (endTemplPos!=-1)
+ {
+ if (!lookForSpecialization)
+ {
+ nameStr=nameStr.left(templPos)+nameStr.right(nameStr.length()-endTemplPos-1);
+ }
+ else
+ {
+ tryUnspecializedVersion = TRUE;
+ }
+ }
+ }
+
+ QCString scopeStr=scName;
+
+ MemberDef *md = 0;
+ ClassDef *cd = 0;
+ FileDef *fd = 0;
+ NamespaceDef *nd = 0;
+ GroupDef *gd = 0;
+
+ // check if nameStr is a member or global.
+ //printf("getDefs(scope=%s,name=%s,args=%s checkScope=%d)\n",
+ // scopeStr.data(),nameStr.data(),argsStr.data(),checkScope);
+ if (getDefs(scopeStr,nameStr,argsStr,
+ md,cd,fd,nd,gd,
+ //scopePos==0 && !memberScopeFirst, // forceEmptyScope
+ explicitScope, // replaces prev line due to bug 600829
+ currentFile,
+ TRUE // checkCV
+ )
+ )
+ {
+ //printf("after getDefs checkScope=%d nameStr=%s cd=%p nd=%p\n",checkScope,nameStr.data(),cd,nd);
+ if (checkScope && md && md->getOuterScope()==Doxygen::globalScope &&
+ (!scopeStr.isEmpty() || nameStr.find("::")>0))
+ {
+ // we did find a member, but it is a global one while we were explicitly
+ // looking for a scoped variable. See bug 616387 for an example why this check is needed.
+ // note we do need to support autolinking to "::symbol" hence the >0
+ //printf("not global member!\n");
+ *resContext=0;
+ *resMember=0;
+ return FALSE;
+ }
+ //printf("after getDefs md=%p cd=%p fd=%p nd=%p gd=%p\n",md,cd,fd,nd,gd);
+ if (md) { *resMember=md; *resContext=md; }
+ else if (cd) *resContext=cd;
+ else if (nd) *resContext=nd;
+ else if (fd) *resContext=fd;
+ else if (gd) *resContext=gd;
+ else { *resContext=0; *resMember=0; return FALSE; }
+ //printf("member=%s (md=%p) anchor=%s linkable()=%d context=%s\n",
+ // md->name().data(),md,md->anchor().data(),md->isLinkable(),(*resContext)->name().data());
+ return TRUE;
+ }
+ else if (inSeeBlock && !nameStr.isEmpty() && (gd=Doxygen::groupSDict->find(nameStr)))
+ { // group link
+ *resContext=gd;
+ return TRUE;
+ }
+ else if (tsName.find('.')!=-1) // maybe a link to a file
+ {
+ bool ambig;
+ fd=findFileDef(Doxygen::inputNameDict,tsName,ambig);
+ if (fd && !ambig)
+ {
+ *resContext=fd;
+ return TRUE;
+ }
+ }
+
+ if (tryUnspecializedVersion)
+ {
+ return resolveRef(scName,name,inSeeBlock,resContext,resMember,FALSE,0,checkScope);
+ }
+ //printf("resolveRef: %s not found!\n",name);
+
+ return FALSE;
+}
+
+QCString linkToText(const char *link,bool isFileName)
+{
+ static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+ QCString result=link;
+ if (!result.isEmpty())
+ {
+ // replace # by ::
+ result=substitute(result,"#","::");
+ // replace . by ::
+ if (!isFileName) result=substitute(result,".","::");
+ // strip leading :: prefix if present
+ if (result.at(0)==':' && result.at(1)==':')
+ {
+ result=result.right(result.length()-2);
+ }
+ if (optimizeOutputJava)
+ {
+ result=substitute(result,"::",".");
+ }
+ }
+ return result;
+}
+
+#if 0
+/*
+ * generate a reference to a class, namespace or member.
+ * `scName' is the name of the scope that contains the documentation
+ * string that is returned.
+ * `name' is the name that we want to link to.
+ * `name' may have five formats:
+ * 1) "ScopeName"
+ * 2) "memberName()" one of the (overloaded) function or define
+ * with name memberName.
+ * 3) "memberName(...)" a specific (overloaded) function or define
+ * with name memberName
+ * 4) "::name a global variable or define
+ * 4) "\#memberName member variable, global variable or define
+ * 5) ("ScopeName::")+"memberName()"
+ * 6) ("ScopeName::")+"memberName(...)"
+ * 7) ("ScopeName::")+"memberName"
+ * instead of :: the \# symbol may also be used.
+ */
+
+bool generateRef(OutputDocInterface &od,const char *scName,
+ const char *name,bool inSeeBlock,const char *rt)
+{
+ //printf("generateRef(scName=%s,name=%s,inSee=%d,rt=%s)\n",scName,name,inSeeBlock,rt);
+
+ Definition *compound;
+ MemberDef *md;
+
+ // create default link text
+ QCString linkText = linkToText(rt,FALSE);
+
+ if (resolveRef(scName,name,inSeeBlock,&compound,&md))
+ {
+ if (md && md->isLinkable()) // link to member
+ {
+ od.writeObjectLink(md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),linkText);
+ // generate the page reference (for LaTeX)
+ if (!md->isReference())
+ {
+ writePageRef(od,md->getOutputFileBase(),md->anchor());
+ }
+ return TRUE;
+ }
+ else if (compound && compound->isLinkable()) // link to compound
+ {
+ if (rt==0 && compound->definitionType()==Definition::TypeGroup)
+ {
+ linkText=((GroupDef *)compound)->groupTitle();
+ }
+ if (compound && compound->definitionType()==Definition::TypeFile)
+ {
+ linkText=linkToText(rt,TRUE);
+ }
+ od.writeObjectLink(compound->getReference(),
+ compound->getOutputFileBase(),
+ 0,linkText);
+ if (!compound->isReference())
+ {
+ writePageRef(od,compound->getOutputFileBase(),0);
+ }
+ return TRUE;
+ }
+ }
+ od.docify(linkText);
+ return FALSE;
+}
+#endif
+
+bool resolveLink(/* in */ const char *scName,
+ /* in */ const char *lr,
+ /* in */ bool /*inSeeBlock*/,
+ /* out */ Definition **resContext,
+ /* out */ QCString &resAnchor
+ )
+{
+ *resContext=0;
+
+ QCString linkRef=lr;
+ //printf("ResolveLink linkRef=%s inSee=%d\n",lr,inSeeBlock);
+ FileDef *fd;
+ GroupDef *gd;
+ PageDef *pd;
+ ClassDef *cd;
+ DirDef *dir;
+ NamespaceDef *nd;
+ bool ambig;
+ if (linkRef.isEmpty()) // no reference name!
+ {
+ return FALSE;
+ }
+ else if ((pd=Doxygen::pageSDict->find(linkRef))) // link to a page
+ {
+ GroupDef *gd = pd->getGroupDef();
+ if (gd)
+ {
+ SectionInfo *si=0;
+ if (!pd->name().isEmpty()) si=Doxygen::sectionDict[pd->name()];
+ *resContext=gd;
+ if (si) resAnchor = si->label;
+ }
+ else
+ {
+ *resContext=pd;
+ }
+ return TRUE;
+ }
+ else if ((pd=Doxygen::exampleSDict->find(linkRef))) // link to an example
+ {
+ *resContext=pd;
+ return TRUE;
+ }
+ else if ((gd=Doxygen::groupSDict->find(linkRef))) // link to a group
+ {
+ *resContext=gd;
+ return TRUE;
+ }
+ else if ((fd=findFileDef(Doxygen::inputNameDict,linkRef,ambig)) // file link
+ && fd->isLinkable())
+ {
+ *resContext=fd;
+ return TRUE;
+ }
+ else if ((cd=getClass(linkRef))) // class link
+ {
+ *resContext=cd;
+ resAnchor=cd->anchor();
+ return TRUE;
+ }
+ else if ((cd=getClass(linkRef+"-p"))) // Obj-C protocol link
+ {
+ *resContext=cd;
+ resAnchor=cd->anchor();
+ return TRUE;
+ }
+ else if ((cd=getClass(linkRef+"-g"))) // C# generic link
+ {
+ *resContext=cd;
+ resAnchor=cd->anchor();
+ return TRUE;
+ }
+ else if ((nd=Doxygen::namespaceSDict->find(linkRef)))
+ {
+ *resContext=nd;
+ return TRUE;
+ }
+ else if ((dir=Doxygen::directories->find(QFileInfo(linkRef).absFilePath()+"/"))
+ && dir->isLinkable()) // TODO: make this location independent like filedefs
+ {
+ *resContext=dir;
+ return TRUE;
+ }
+ else // probably a member reference
+ {
+ MemberDef *md;
+ bool res = resolveRef(scName,lr,TRUE,resContext,&md);
+ if (md) resAnchor=md->anchor();
+ return res;
+ }
+}
+
+
+//----------------------------------------------------------------------
+// General function that generates the HTML code for a reference to some
+// file, class or member from text `lr' within the context of class `clName'.
+// This link has the text 'lt' (if not 0), otherwise `lr' is used as a
+// basis for the link's text.
+// returns TRUE if a link could be generated.
+
+bool generateLink(OutputDocInterface &od,const char *clName,
+ const char *lr,bool inSeeBlock,const char *lt)
+{
+ //printf("generateLink(clName=%s,lr=%s,lr=%s)\n",clName,lr,lt);
+ Definition *compound;
+ //PageDef *pageDef=0;
+ QCString anchor,linkText=linkToText(lt,FALSE);
+ //printf("generateLink linkText=%s\n",linkText.data());
+ if (resolveLink(clName,lr,inSeeBlock,&compound,anchor))
+ {
+ if (compound) // link to compound
+ {
+ if (lt==0 && anchor.isEmpty() && /* compound link */
+ compound->definitionType()==Definition::TypeGroup /* is group */
+ )
+ {
+ linkText=((GroupDef *)compound)->groupTitle(); // use group's title as link
+ }
+ else if (compound->definitionType()==Definition::TypeFile)
+ {
+ linkText=linkToText(lt,TRUE);
+ }
+ od.writeObjectLink(compound->getReference(),
+ compound->getOutputFileBase(),anchor,linkText);
+ if (!compound->isReference())
+ {
+ writePageRef(od,compound->getOutputFileBase(),anchor);
+ }
+ }
+ else
+ {
+ err("%s:%d: Internal error: resolveLink successful but no compound found!",__FILE__,__LINE__);
+ }
+ return TRUE;
+ }
+ else // link could not be found
+ {
+ od.docify(linkText);
+ return FALSE;
+ }
+}
+
+void generateFileRef(OutputDocInterface &od,const char *name,const char *text)
+{
+ //printf("generateFileRef(%s,%s)\n",name,text);
+ QCString linkText = text ? text : name;
+ //FileInfo *fi;
+ FileDef *fd;
+ bool ambig;
+ if ((fd=findFileDef(Doxygen::inputNameDict,name,ambig)) &&
+ fd->isLinkable())
+ // link to documented input file
+ od.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,linkText);
+ else
+ od.docify(linkText);
+}
+
+//----------------------------------------------------------------------
+
+#if 0
+QCString substituteClassNames(const QCString &s)
+{
+ int i=0,l,p;
+ QCString result;
+ if (s.isEmpty()) return result;
+ QRegExp r("[a-z_A-Z][a-z_A-Z0-9]*");
+ while ((p=r.match(s,i,&l))!=-1)
+ {
+ QCString *subst;
+ if (p>i) result+=s.mid(i,p-i);
+ if ((subst=substituteDict[s.mid(p,l)]))
+ {
+ result+=*subst;
+ }
+ else
+ {
+ result+=s.mid(p,l);
+ }
+ i=p+l;
+ }
+ result+=s.mid(i,s.length()-i);
+ return result;
+}
+#endif
+
+//----------------------------------------------------------------------
+
+struct FindFileCacheElem
+{
+ FindFileCacheElem(FileDef *fd,bool ambig) : fileDef(fd), isAmbig(ambig) {}
+ FileDef *fileDef;
+ bool isAmbig;
+};
+
+static QCache<FindFileCacheElem> g_findFileDefCache(5000);
+
+FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig)
+{
+ ambig=FALSE;
+ if (n==0) return 0;
+
+ QCString key;
+ key.sprintf("%p:",fnDict);
+ key+=n;
+
+ g_findFileDefCache.setAutoDelete(TRUE);
+ FindFileCacheElem *cachedResult = g_findFileDefCache.find(key);
+ //printf("key=%s cachedResult=%p\n",key.data(),cachedResult);
+ if (cachedResult)
+ {
+ ambig = cachedResult->isAmbig;
+ //printf("cached: fileDef=%p\n",cachedResult->fileDef);
+ return cachedResult->fileDef;
+ }
+ else
+ {
+ cachedResult = new FindFileCacheElem(0,FALSE);
+ }
+
+ QCString name=convertToQCString(QDir::cleanDirPath(n));
+ QCString path;
+ int slashPos;
+ FileName *fn;
+ if (name.isEmpty()) goto exit;
+ slashPos=QMAX(name.findRev('/'),name.findRev('\\'));
+ if (slashPos!=-1)
+ {
+ path=name.left(slashPos+1);
+ name=name.right(name.length()-slashPos-1);
+ //printf("path=%s name=%s\n",path.data(),name.data());
+ }
+ if (name.isEmpty()) goto exit;
+ if ((fn=(*fnDict)[name]))
+ {
+ //printf("fn->count()=%d\n",fn->count());
+ if (fn->count()==1)
+ {
+ FileDef *fd = fn->getFirst();
+ if (path.isEmpty() || fd->getPath().right(path.length())==path)
+ {
+ cachedResult->fileDef = fd;
+ g_findFileDefCache.insert(key,cachedResult);
+ //printf("=1 ===> add to cache %p\n",fd);
+ return fd;
+ }
+ }
+ else // file name alone is ambiguous
+ {
+ int count=0;
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ FileDef *lastMatch=0;
+ QCString pathStripped = stripFromIncludePath(path);
+ for (fni.toFirst();(fd=fni.current());++fni)
+ {
+ QCString fdStripPath = stripFromIncludePath(fd->getPath());
+ if (path.isEmpty() || fdStripPath.right(pathStripped.length())==pathStripped)
+ {
+ count++;
+ lastMatch=fd;
+ }
+ }
+ //printf(">1 ===> add to cache %p\n",fd);
+
+ ambig=(count>1);
+ cachedResult->isAmbig = ambig;
+ cachedResult->fileDef = lastMatch;
+ g_findFileDefCache.insert(key,cachedResult);
+ return lastMatch;
+ }
+ }
+ else
+ {
+ //printf("not found!\n");
+ }
+exit:
+ //printf("0 ===> add to cache %p: %s\n",cachedResult,n);
+ g_findFileDefCache.insert(key,cachedResult);
+ //delete cachedResult;
+ return 0;
+}
+
+//----------------------------------------------------------------------
+
+QCString showFileDefMatches(const FileNameDict *fnDict,const char *n)
+{
+ QCString result;
+ QCString name=n;
+ QCString path;
+ int slashPos=QMAX(name.findRev('/'),name.findRev('\\'));
+ if (slashPos!=-1)
+ {
+ path=name.left(slashPos+1);
+ name=name.right(name.length()-slashPos-1);
+ }
+ FileName *fn;
+ if ((fn=(*fnDict)[name]))
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (fni.toFirst();(fd=fni.current());++fni)
+ {
+ if (path.isEmpty() || fd->getPath().right(path.length())==path)
+ {
+ result+=" "+fd->absFilePath()+"\n";
+ }
+ }
+ }
+ return result;
+}
+
+//----------------------------------------------------------------------
+
+QCString substituteKeywords(const QCString &s,const char *title)
+{
+ QCString result = s;
+ if (title) result = substitute(result,"$title",title);
+ result = substitute(result,"$datetime",dateToString(TRUE));
+ result = substitute(result,"$date",dateToString(FALSE));
+ result = substitute(result,"$year",yearToString());
+ result = substitute(result,"$doxygenversion",versionString);
+ result = substitute(result,"$projectname",Config_getString("PROJECT_NAME"));
+ result = substitute(result,"$projectnumber",Config_getString("PROJECT_NUMBER"));
+ result = substitute(result,"$projectbrief",Config_getString("PROJECT_BRIEF"));
+ result = substitute(result,"$projectlogo",Config_getString("PROJECT_LOGO"));
+ return result;
+}
+
+//----------------------------------------------------------------------
+
+/*! Returns the character index within \a name of the first prefix
+ * in Config_getList("IGNORE_PREFIX") that matches \a name at the left hand side,
+ * or zero if no match was found
+ */
+int getPrefixIndex(const QCString &name)
+{
+ if (name.isEmpty()) return 0;
+ static QStrList &sl = Config_getList("IGNORE_PREFIX");
+ char *s = sl.first();
+ while (s)
+ {
+ const char *ps=s;
+ const char *pd=name.data();
+ int i=0;
+ while (*ps!=0 && *pd!=0 && *ps==*pd) ps++,pd++,i++;
+ if (*ps==0 && *pd!=0)
+ {
+ return i;
+ }
+ s = sl.next();
+ }
+ return 0;
+}
+
+//----------------------------------------------------------------------------
+
+static void initBaseClassHierarchy(BaseClassList *bcl)
+{
+ if (bcl==0) return;
+ BaseClassListIterator bcli(*bcl);
+ for ( ; bcli.current(); ++bcli)
+ {
+ ClassDef *cd=bcli.current()->classDef;
+ if (cd->baseClasses()==0) // no base classes => new root
+ {
+ initBaseClassHierarchy(cd->baseClasses());
+ }
+ cd->visited=FALSE;
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void initClassHierarchy(ClassSDict *cl)
+{
+ ClassSDict::Iterator cli(*cl);
+ ClassDef *cd;
+ for ( ; (cd=cli.current()); ++cli)
+ {
+ cd->visited=FALSE;
+ initBaseClassHierarchy(cd->baseClasses());
+ }
+}
+
+//----------------------------------------------------------------------------
+
+bool hasVisibleRoot(BaseClassList *bcl)
+{
+ if (bcl)
+ {
+ BaseClassListIterator bcli(*bcl);
+ for ( ; bcli.current(); ++bcli)
+ {
+ ClassDef *cd=bcli.current()->classDef;
+ if (cd->isVisibleInHierarchy()) return TRUE;
+ hasVisibleRoot(cd->baseClasses());
+ }
+ }
+ return FALSE;
+}
+
+//----------------------------------------------------------------------
+
+// note that this function is not reentrant due to the use of static strBuf!
+QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscore)
+{
+ static bool caseSenseNames = Config_getBool("CASE_SENSE_NAMES");
+ static StrBuf strBuf;
+ strBuf.clear();
+ char c;
+ const char *p=name;
+ while ((c=*p++)!=0)
+ {
+ switch(c)
+ {
+ case '_': if (allowUnderscore) strBuf.addChar('_'); else strBuf.addStr("__"); break;
+ case '-': strBuf.addChar('-'); break;
+ case ':': strBuf.addStr("_1"); break;
+ case '/': strBuf.addStr("_2"); break;
+ case '<': strBuf.addStr("_3"); break;
+ case '>': strBuf.addStr("_4"); break;
+ case '*': strBuf.addStr("_5"); break;
+ case '&': strBuf.addStr("_6"); break;
+ case '|': strBuf.addStr("_7"); break;
+ case '.': if (allowDots) strBuf.addChar('.'); else strBuf.addStr("_8"); break;
+ case '!': strBuf.addStr("_9"); break;
+ case ',': strBuf.addStr("_00"); break;
+ case ' ': strBuf.addStr("_01"); break;
+ case '{': strBuf.addStr("_02"); break;
+ case '}': strBuf.addStr("_03"); break;
+ case '?': strBuf.addStr("_04"); break;
+ case '^': strBuf.addStr("_05"); break;
+ case '%': strBuf.addStr("_06"); break;
+ case '(': strBuf.addStr("_07"); break;
+ case ')': strBuf.addStr("_08"); break;
+ case '+': strBuf.addStr("_09"); break;
+ case '=': strBuf.addStr("_0A"); break;
+ default:
+ if (c<0)
+ {
+ static char map[] = "0123456789ABCDEF";
+ char ids[5];
+ unsigned char id = (unsigned char)c;
+ ids[0]='_';
+ ids[1]='x';
+ ids[2]=map[id>>4];
+ ids[3]=map[id&0xF];
+ ids[4]=0;
+ strBuf.addStr(ids);
+ }
+ else if (caseSenseNames || !isupper(c))
+ {
+ strBuf.addChar(c);
+ }
+ else
+ {
+ strBuf.addChar('_');
+ strBuf.addChar(tolower(c));
+ }
+ break;
+ }
+ }
+ strBuf.addChar(0);
+ return strBuf.get();
+}
+
+/*! This function determines the file name on disk of an item
+ * given its name, which could be a class name with template
+ * arguments, so special characters need to be escaped.
+ */
+QCString convertNameToFile(const char *name,bool allowDots,bool allowUnderscore)
+{
+ static bool shortNames = Config_getBool("SHORT_NAMES");
+ static bool createSubdirs = Config_getBool("CREATE_SUBDIRS");
+ QCString result;
+ if (shortNames) // use short names only
+ {
+ static QDict<int> usedNames(10007);
+ usedNames.setAutoDelete(TRUE);
+ static int count=1;
+
+ int *value=usedNames.find(name);
+ int num;
+ if (value==0)
+ {
+ usedNames.insert(name,new int(count));
+ num = count++;
+ }
+ else
+ {
+ num = *value;
+ }
+ result.sprintf("a%05d",num);
+ }
+ else // long names
+ {
+ result=escapeCharsInString(name,allowDots,allowUnderscore);
+ int resultLen = result.length();
+ if (resultLen>=128) // prevent names that cannot be created!
+ {
+ // third algorithm based on MD5 hash
+ uchar md5_sig[16];
+ QCString sigStr(33);
+ MD5Buffer((const unsigned char *)result.data(),resultLen,md5_sig);
+ MD5SigToString(md5_sig,sigStr.data(),33);
+ result=result.left(128-32)+sigStr;
+ }
+ }
+ if (createSubdirs)
+ {
+ int l1Dir=0,l2Dir=0;
+
+#if MAP_ALGO==ALGO_COUNT
+ // old algorithm, has the problem that after regeneration the
+ // output can be located in a different dir.
+ if (Doxygen::htmlDirMap==0)
+ {
+ Doxygen::htmlDirMap=new QDict<int>(100003);
+ Doxygen::htmlDirMap->setAutoDelete(TRUE);
+ }
+ static int curDirNum=0;
+ int *dirNum = Doxygen::htmlDirMap->find(result);
+ if (dirNum==0) // new name
+ {
+ Doxygen::htmlDirMap->insert(result,new int(curDirNum));
+ l1Dir = (curDirNum)&0xf; // bits 0-3
+ l2Dir = (curDirNum>>4)&0xff; // bits 4-11
+ curDirNum++;
+ }
+ else // existing name
+ {
+ l1Dir = (*dirNum)&0xf; // bits 0-3
+ l2Dir = ((*dirNum)>>4)&0xff; // bits 4-11
+ }
+#elif MAP_ALGO==ALGO_CRC16
+ // second algorithm based on CRC-16 checksum
+ int dirNum = qChecksum(result,result.length());
+ l1Dir = dirNum&0xf;
+ l2Dir = (dirNum>>4)&0xff;
+#elif MAP_ALGO==ALGO_MD5
+ // third algorithm based on MD5 hash
+ uchar md5_sig[16];
+ MD5Buffer((const unsigned char *)result.data(),result.length(),md5_sig);
+ l1Dir = md5_sig[14]&0xf;
+ l2Dir = md5_sig[15];
+#endif
+ result.prepend(QCString().sprintf("d%x/d%02x/",l1Dir,l2Dir));
+ }
+ //printf("*** convertNameToFile(%s)->%s\n",name,result.data());
+ return result;
+}
+
+QCString relativePathToRoot(const char *name)
+{
+ QCString result;
+ if (Config_getBool("CREATE_SUBDIRS"))
+ {
+ if (name==0)
+ {
+ return REL_PATH_TO_ROOT;
+ }
+ else
+ {
+ QCString n = name;
+ int i = n.findRev('/');
+ if (i!=-1)
+ {
+ result=REL_PATH_TO_ROOT;
+ }
+ }
+ }
+ return result;
+}
+
+void createSubDirs(QDir &d)
+{
+ if (Config_getBool("CREATE_SUBDIRS"))
+ {
+ // create 4096 subdirectories
+ int l1,l2;
+ for (l1=0;l1<16;l1++)
+ {
+ d.mkdir(QString().sprintf("d%x",l1));
+ for (l2=0;l2<256;l2++)
+ {
+ d.mkdir(QString().sprintf("d%x/d%02x",l1,l2));
+ }
+ }
+ }
+}
+
+/*! Input is a scopeName, output is the scopename split into a
+ * namespace part (as large as possible) and a classname part.
+ */
+void extractNamespaceName(const QCString &scopeName,
+ QCString &className,QCString &namespaceName,
+ bool allowEmptyClass)
+{
+ int i,p;
+ QCString clName=scopeName;
+ NamespaceDef *nd = 0;
+ if (!clName.isEmpty() && (nd=getResolvedNamespace(clName)) && getClass(clName)==0)
+ { // the whole name is a namespace (and not a class)
+ namespaceName=nd->name().copy();
+ className.resize(0);
+ goto done;
+ }
+ p=clName.length()-2;
+ while (p>=0 && (i=clName.findRev("::",p))!=-1)
+ // see if the first part is a namespace (and not a class)
+ {
+ //printf("Trying %s\n",clName.left(i).data());
+ if (i>0 && (nd=getResolvedNamespace(clName.left(i))) && getClass(clName.left(i))==0)
+ {
+ //printf("found!\n");
+ namespaceName=nd->name().copy();
+ className=clName.right(clName.length()-i-2);
+ goto done;
+ }
+ p=i-2; // try a smaller piece of the scope
+ }
+ //printf("not found!\n");
+
+ // not found, so we just have to guess.
+ className=scopeName.copy();
+ namespaceName.resize(0);
+
+done:
+ if (className.isEmpty() && !namespaceName.isEmpty() && !allowEmptyClass)
+ {
+ // class and namespace with the same name, correct to return the class.
+ className=namespaceName.copy();
+ namespaceName.resize(0);
+ }
+ //printf("extractNamespace `%s' => `%s|%s'\n",scopeName.data(),
+ // className.data(),namespaceName.data());
+ return;
+}
+
+QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ)
+{
+ QCString result=scope.copy();
+ if (!templ.isEmpty() && scope.find('<')==-1)
+ {
+ int si,pi=0;
+ ClassDef *cd=0;
+ while (
+ (si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) &&
+ ((cd=getClass(scope.left(si)))==0 || cd->templateArguments()==0)
+ )
+ {
+ //printf("Tried `%s'\n",(scope.left(si)+templ).data());
+ pi=si+2;
+ }
+ if (si==-1) // not nested => append template specifier
+ {
+ result+=templ;
+ }
+ else // nested => insert template specifier before after first class name
+ {
+ result=scope.left(si) + templ + scope.right(scope.length()-si);
+ }
+ }
+ //printf("insertTemplateSpecifierInScope(`%s',`%s')=%s\n",
+ // scope.data(),templ.data(),result.data());
+ return result;
+}
+
+#if 0 // original version
+/*! Strips the scope from a name. Examples: A::B will return A
+ * and A<T>::B<N::C<D> > will return A<T>.
+ */
+QCString stripScope(const char *name)
+{
+ QCString result = name;
+ int l=result.length();
+ int p=l-1;
+ bool done;
+ int count;
+
+ while (p>=0)
+ {
+ char c=result.at(p);
+ switch (c)
+ {
+ case ':':
+ //printf("stripScope(%s)=%s\n",name,result.right(l-p-1).data());
+ return result.right(l-p-1);
+ case '>':
+ count=1;
+ done=FALSE;
+ //printf("pos < = %d\n",p);
+ p--;
+ while (p>=0 && !done)
+ {
+ c=result.at(p--);
+ switch (c)
+ {
+ case '>': count++; break;
+ case '<': count--; if (count<=0) done=TRUE; break;
+ default:
+ //printf("c=%c count=%d\n",c,count);
+ break;
+ }
+ }
+ //printf("pos > = %d\n",p+1);
+ break;
+ default:
+ p--;
+ }
+ }
+ //printf("stripScope(%s)=%s\n",name,name);
+ return name;
+}
+#endif
+
+// new version by Davide Cesari which also works for Fortran
+QCString stripScope(const char *name)
+{
+ QCString result = name;
+ int l=result.length();
+ int p;
+ bool done = FALSE;
+ bool skipBracket=FALSE; // if brackets do not match properly, ignore them altogether
+ int count=0;
+
+ do
+ {
+ p=l-1; // start at the end of the string
+ while (p>=0 && count>=0)
+ {
+ char c=result.at(p);
+ switch (c)
+ {
+ case ':':
+ //printf("stripScope(%s)=%s\n",name,result.right(l-p-1).data());
+ return result.right(l-p-1);
+ case '>':
+ if (skipBracket) // we don't care about brackets
+ {
+ p--;
+ }
+ else // count open/close brackets
+ {
+ if (p>0 && result.at(p-1)=='>') // skip >> operator
+ {
+ p-=2;
+ break;
+ }
+ count=1;
+ //printf("pos < = %d\n",p);
+ p--;
+ bool foundMatch=false;
+ while (p>=0 && !foundMatch)
+ {
+ c=result.at(p--);
+ switch (c)
+ {
+ case '>':
+ count++;
+ break;
+ case '<':
+ if (p>0)
+ {
+ if (result.at(p-1) == '<') // skip << operator
+ {
+ p--;
+ break;
+ }
+ }
+ count--;
+ foundMatch = count==0;
+ break;
+ default:
+ //printf("c=%c count=%d\n",c,count);
+ break;
+ }
+ }
+ }
+ //printf("pos > = %d\n",p+1);
+ break;
+ default:
+ p--;
+ }
+ }
+ done = count==0 || skipBracket; // reparse if brackets do not match
+ skipBracket=TRUE;
+ }
+ while (!done); // if < > unbalanced repeat ignoring them
+ //printf("stripScope(%s)=%s\n",name,name);
+ return name;
+}
+
+
+/*! Converts a string to an XML-encoded string */
+QCString convertToXML(const char *s)
+{
+ static StrBuf strBuf;
+ strBuf.clear();
+ if (s==0) return "";
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '<': strBuf.addStr("&lt;"); break;
+ case '>': strBuf.addStr("&gt;"); break;
+ case '&': strBuf.addStr("&amp;"); break;
+ case '\'': strBuf.addStr("&apos;"); break;
+ case '"': strBuf.addStr("&quot;"); break;
+ default: strBuf.addChar(c); break;
+ }
+ }
+ strBuf.addChar(0);
+ return strBuf.get();
+}
+
+/*! Converts a string to a HTML-encoded string */
+QCString convertToHtml(const char *s,bool keepEntities)
+{
+ static StrBuf strBuf;
+ strBuf.clear();
+ if (s==0) return "";
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '<': strBuf.addStr("&lt;"); break;
+ case '>': strBuf.addStr("&gt;"); break;
+ case '&': if (keepEntities)
+ {
+ const char *e=p;
+ char ce;
+ while ((ce=*e++))
+ {
+ if (ce==';' || (!(isId(ce) || ce=='#'))) break;
+ }
+ if (ce==';') // found end of an entity
+ {
+ // copy entry verbatim
+ strBuf.addChar(c);
+ while (p<e) strBuf.addChar(*p++);
+ }
+ else
+ {
+ strBuf.addStr("&amp;");
+ }
+ }
+ else
+ {
+ strBuf.addStr("&amp;");
+ }
+ break;
+ case '\'': strBuf.addStr("&#39;"); break;
+ case '"': strBuf.addStr("&quot;"); break;
+ default: strBuf.addChar(c); break;
+ }
+ }
+ strBuf.addChar(0);
+ return strBuf.get();
+}
+
+QCString convertToJSString(const char *s)
+{
+ static StrBuf strBuf;
+ strBuf.clear();
+ if (s==0) return "";
+ const char *p=s;
+ char c;
+ while ((c=*p++))
+ {
+ switch (c)
+ {
+ case '"': strBuf.addStr("\\\""); break;
+ default: strBuf.addChar(c); break;
+ }
+ }
+ strBuf.addChar(0);
+ return strBuf.get();
+}
+
+
+QCString convertCharEntitiesToUTF8(const QCString &s)
+{
+ static QDict<char> entityMap(67);
+ static bool init=TRUE;
+ QCString result;
+ static QRegExp entityPat("&[a-zA-Z]+;");
+
+ if (init)
+ {
+ entityMap.insert("copy", "\xC2\xA9");
+ entityMap.insert("tm", "\xE2\x84\xA2");
+ entityMap.insert("trade", "\xE2\x84\xA2");
+ entityMap.insert("reg", "\xC2\xAE");
+ entityMap.insert("lsquo", "\xE2\x80\x98");
+ entityMap.insert("rsquo", "\xE2\x80\x99");
+ entityMap.insert("ldquo", "\xE2\x80\x9C");
+ entityMap.insert("rdquo", "\xE2\x80\x9D");
+ entityMap.insert("ndash", "\xE2\x80\x93");
+ entityMap.insert("mdash", "\xE2\x80\x94");
+ entityMap.insert("Auml", "\xC3\x84");
+ entityMap.insert("Euml", "\xC3\x8B");
+ entityMap.insert("Iuml", "\xC3\x8F");
+ entityMap.insert("Ouml", "\xC3\x96");
+ entityMap.insert("Uuml", "\xC3\x9C");
+ entityMap.insert("Yuml", "\xC5\xB8");
+ entityMap.insert("auml", "\xC3\xA4");
+ entityMap.insert("euml", "\xC3\xAB");
+ entityMap.insert("iuml", "\xC3\xAF");
+ entityMap.insert("ouml", "\xC3\xB6");
+ entityMap.insert("uuml", "\xC3\xBC");
+ entityMap.insert("yuml", "\xC3\xBF");
+ entityMap.insert("Aacute","\xC3\x81");
+ entityMap.insert("Eacute","\xC3\x89");
+ entityMap.insert("Iacute","\xC3\x8D");
+ entityMap.insert("Oacute","\xC3\x93");
+ entityMap.insert("Uacute","\xC3\x9A");
+ entityMap.insert("aacute","\xC3\xA1");
+ entityMap.insert("eacute","\xC3\xA9");
+ entityMap.insert("iacute","\xC3\xAD");
+ entityMap.insert("oacute","\xC3\xB3");
+ entityMap.insert("uacute","\xC3\xBA");
+ entityMap.insert("Agrave","\xC3\x80");
+ entityMap.insert("Egrave","\xC3\x88");
+ entityMap.insert("Igrave","\xC3\x8C");
+ entityMap.insert("Ograve","\xC3\x92");
+ entityMap.insert("Ugrave","\xC3\x99");
+ entityMap.insert("agrave","\xC3\xA0");
+ entityMap.insert("egrave","\xC3\xA8");
+ entityMap.insert("igrave","\xC3\xAC");
+ entityMap.insert("ograve","\xC3\xB2");
+ entityMap.insert("ugrave","\xC3\xB9");
+ entityMap.insert("Acirc", "\xC3\x82");
+ entityMap.insert("Ecirc", "\xC3\x8A");
+ entityMap.insert("Icirc", "\xC3\x8E");
+ entityMap.insert("Ocirc", "\xC3\x94");
+ entityMap.insert("Ucirc", "\xC3\x9B");
+ entityMap.insert("acirc", "\xC3\xA2");
+ entityMap.insert("ecirc", "\xC3\xAA");
+ entityMap.insert("icirc", "\xC3\xAE");
+ entityMap.insert("ocirc", "\xC3\xB4");
+ entityMap.insert("ucirc", "\xC3\xBB");
+ entityMap.insert("Atilde","\xC3\x83");
+ entityMap.insert("Ntilde","\xC3\x91");
+ entityMap.insert("Otilde","\xC3\x95");
+ entityMap.insert("atilde","\xC3\xA3");
+ entityMap.insert("ntilde","\xC3\xB1");
+ entityMap.insert("otilde","\xC3\xB5");
+ entityMap.insert("szlig", "\xC3\x9F");
+ entityMap.insert("Ccedil","\xC3\x87");
+ entityMap.insert("ccedil","\xC3\xA7");
+ entityMap.insert("Aring", "\xC3\x85");
+ entityMap.insert("aring", "\xC3\xA5");
+ entityMap.insert("nbsp", "\xC2\xA0");
+ init=FALSE;
+ }
+
+ if (s==0) return result;
+ int p,i=0,l;
+ while ((p=entityPat.match(s,i,&l))!=-1)
+ {
+ if (p>i) result+=s.mid(i,p-i);
+ QCString entity = s.mid(p+1,l-2);
+ char *code = entityMap.find(entity);
+ if (code)
+ {
+ result+=code;
+ }
+ else
+ {
+ result+=s.mid(p,l);
+ }
+ i=p+l;
+ }
+ result+=s.mid(i,s.length()-i);
+ return result;
+}
+
+/*! Returns the standard string that is generated when the \\overload
+ * command is used.
+ */
+QCString getOverloadDocs()
+{
+ return theTranslator->trOverloadText();
+ //"This is an overloaded member function, "
+ // "provided for convenience. It differs from the above "
+ // "function only in what argument(s) it accepts.";
+}
+
+void addMembersToMemberGroup(MemberList *ml,
+ MemberGroupSDict **ppMemberGroupSDict,
+ Definition *context)
+{
+ ASSERT(context!=0);
+ //printf("addMemberToMemberGroup()\n");
+ if (ml==0) return;
+ MemberListIterator mli(*ml);
+ MemberDef *md;
+ uint index;
+ for (index=0;(md=mli.current());)
+ {
+ if (md->isEnumerate()) // insert enum value of this enum into groups
+ {
+ LockingPtr<MemberList> fmdl=md->enumFieldList();
+ if (fmdl!=0)
+ {
+ MemberDef *fmd=fmdl->first();
+ while (fmd)
+ {
+ int groupId=fmd->getMemberGroupId();
+ if (groupId!=-1)
+ {
+ MemberGroupInfo *info = Doxygen::memGrpInfoDict[groupId];
+ //QCString *pGrpHeader = Doxygen::memberHeaderDict[groupId];
+ //QCString *pDocs = Doxygen::memberDocDict[groupId];
+ if (info)
+ {
+ if (*ppMemberGroupSDict==0)
+ {
+ *ppMemberGroupSDict = new MemberGroupSDict;
+ (*ppMemberGroupSDict)->setAutoDelete(TRUE);
+ }
+ MemberGroup *mg = (*ppMemberGroupSDict)->find(groupId);
+ if (mg==0)
+ {
+ mg = new MemberGroup(
+ context,
+ groupId,
+ info->header,
+ info->doc,
+ info->docFile
+ );
+ (*ppMemberGroupSDict)->append(groupId,mg);
+ }
+ mg->insertMember(fmd); // insert in member group
+ fmd->setMemberGroup(mg);
+ }
+ }
+ fmd=fmdl->next();
+ }
+ }
+ }
+ int groupId=md->getMemberGroupId();
+ if (groupId!=-1)
+ {
+ MemberGroupInfo *info = Doxygen::memGrpInfoDict[groupId];
+ //QCString *pGrpHeader = Doxygen::memberHeaderDict[groupId];
+ //QCString *pDocs = Doxygen::memberDocDict[groupId];
+ if (info)
+ {
+ if (*ppMemberGroupSDict==0)
+ {
+ *ppMemberGroupSDict = new MemberGroupSDict;
+ (*ppMemberGroupSDict)->setAutoDelete(TRUE);
+ }
+ MemberGroup *mg = (*ppMemberGroupSDict)->find(groupId);
+ if (mg==0)
+ {
+ mg = new MemberGroup(
+ context,
+ groupId,
+ info->header,
+ info->doc,
+ info->docFile
+ );
+ (*ppMemberGroupSDict)->append(groupId,mg);
+ }
+ md = ml->take(index); // remove from member list
+ mg->insertMember(md); // insert in member group
+ mg->setRefItems(info->m_sli);
+ md->setMemberGroup(mg);
+ continue;
+ }
+ }
+ ++mli;++index;
+ }
+}
+
+/*! Extracts a (sub-)string from \a type starting at \a pos that
+ * could form a class. The index of the match is returned and the found
+ * class \a name and a template argument list \a templSpec. If -1 is returned
+ * there are no more matches.
+ */
+int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCString &templSpec)
+{
+ static const QRegExp re("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9:\\x80-\\xFF]*");
+ name.resize(0);
+ templSpec.resize(0);
+ int i,l;
+ int typeLen=type.length();
+ if (typeLen>0)
+ {
+ if ((i=re.match(type,pos,&l))!=-1) // for each class name in the type
+ {
+ int ts=i+l;
+ int te=ts;
+ int tl=0;
+ while (type.at(ts)==' ' && ts<typeLen) ts++,tl++; // skip any whitespace
+ if (type.at(ts)=='<') // assume template instance
+ {
+ // locate end of template
+ te=ts+1;
+ int brCount=1;
+ while (te<typeLen && brCount!=0)
+ {
+ if (type.at(te)=='<')
+ {
+ if (te<typeLen-1 && type.at(te+1)=='<') te++; else brCount++;
+ }
+ if (type.at(te)=='>')
+ {
+ if (te<typeLen-1 && type.at(te+1)=='>') te++; else brCount--;
+ }
+ te++;
+ }
+ }
+ name = type.mid(i,l);
+ if (te>ts)
+ {
+ templSpec = type.mid(ts,te-ts),tl+=te-ts;
+ pos=i+l+tl;
+ }
+ else // no template part
+ {
+ pos=i+l;
+ }
+ //printf("extractClassNameFromType([in] type=%s,[out] pos=%d,[out] name=%s,[out] templ=%s)=TRUE\n",
+ // type.data(),pos,name.data(),templSpec.data());
+ return i;
+ }
+ }
+ pos = typeLen;
+ //printf("extractClassNameFromType([in] type=%s,[out] pos=%d,[out] name=%s,[out] templ=%s)=FALSE\n",
+ // type.data(),pos,name.data(),templSpec.data());
+ return -1;
+}
+
+/*! Substitutes any occurrence of a formal argument from argument list
+ * \a formalArgs in \a name by the corresponding actual argument in
+ * argument list \a actualArgs. The result after substitution
+ * is returned as a string. The argument \a name is used to
+ * prevent recursive substitution.
+ */
+QCString substituteTemplateArgumentsInString(
+ const QCString &name,
+ ArgumentList *formalArgs,
+ ArgumentList *actualArgs)
+{
+ //printf("substituteTemplateArgumentsInString(name=%s formal=%s actualArg=%s)\n",
+ // name.data(),argListToString(formalArgs).data(),argListToString(actualArgs).data());
+ if (formalArgs==0) return name;
+ QCString result;
+ static QRegExp re("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9\\x80-\\xFF]*");
+ int p=0,l,i;
+ // for each identifier in the base class name (e.g. B<T> -> B and T)
+ while ((i=re.match(name,p,&l))!=-1)
+ {
+ result += name.mid(p,i-p);
+ QCString n = name.mid(i,l);
+ ArgumentListIterator formAli(*formalArgs);
+ Argument *formArg;
+ Argument *actArg=actualArgs->first();
+
+ // if n is a template argument, then we substitute it
+ // for its template instance argument.
+ bool found=FALSE;
+ for (formAli.toFirst();
+ (formArg=formAli.current()) && !found;
+ ++formAli,actArg=actualArgs->next()
+ )
+ {
+ if (formArg->type.left(6)=="class " && formArg->name.isEmpty())
+ {
+ formArg->name = formArg->type.mid(6);
+ formArg->type = "class";
+ }
+ if (formArg->type.left(9)=="typename " && formArg->name.isEmpty())
+ {
+ formArg->name = formArg->type.mid(9);
+ formArg->type = "typename";
+ }
+ if (formArg->type=="class" || formArg->type=="typename" || formArg->type.left(8)=="template")
+ {
+ //printf("n=%s formArg->type='%s' formArg->name='%s' formArg->defval='%s'\n",
+ // n.data(),formArg->type.data(),formArg->name.data(),formArg->defval.data());
+ //printf(">> formArg->name='%s' actArg->type='%s' actArg->name='%s'\n",
+ // formArg->name.data(),actArg->type.data(),actArg->name.data()
+ // );
+ if (formArg->name==n && actArg && !actArg->type.isEmpty()) // base class is a template argument
+ {
+ // replace formal argument with the actual argument of the instance
+ if (!leftScopeMatch(actArg->type,n))
+ // the scope guard is to prevent recursive lockup for
+ // template<class A> class C : public<A::T>,
+ // where A::T would become A::T::T here,
+ // since n==A and actArg->type==A::T
+ // see bug595833 for an example
+ {
+ if (actArg->name.isEmpty())
+ {
+ result += actArg->type+" ";
+ found=TRUE;
+ }
+ else
+ // for case where the actual arg is something like "unsigned int"
+ // the "int" part is in actArg->name.
+ {
+ result += actArg->type+" "+actArg->name+" ";
+ found=TRUE;
+ }
+ }
+ }
+ else if (formArg->name==n &&
+ actArg==0 &&
+ !formArg->defval.isEmpty() &&
+ formArg->defval!=name /* to prevent recursion */
+ )
+ {
+ result += substituteTemplateArgumentsInString(formArg->defval,formalArgs,actualArgs)+" ";
+ found=TRUE;
+ }
+ }
+ else if (formArg->name==n &&
+ actArg==0 &&
+ !formArg->defval.isEmpty() &&
+ formArg->defval!=name /* to prevent recursion */
+ )
+ {
+ result += substituteTemplateArgumentsInString(formArg->defval,formalArgs,actualArgs)+" ";
+ found=TRUE;
+ }
+ }
+ if (!found) result += n;
+ p=i+l;
+ }
+ result+=name.right(name.length()-p);
+ //printf(" Inheritance relation %s -> %s\n",
+ // name.data(),result.data());
+ return result.stripWhiteSpace();
+}
+
+
+/*! Makes a deep copy of argument list \a src. Will allocate memory, that
+ * is owned by the caller.
+ */
+ArgumentList *copyArgumentList(const ArgumentList *src)
+{
+ ASSERT(src!=0);
+ ArgumentList *dst = new ArgumentList;
+ dst->setAutoDelete(TRUE);
+ ArgumentListIterator tali(*src);
+ Argument *a;
+ for (;(a=tali.current());++tali)
+ {
+ dst->append(new Argument(*a));
+ }
+ dst->constSpecifier = src->constSpecifier;
+ dst->volatileSpecifier = src->volatileSpecifier;
+ dst->pureSpecifier = src->pureSpecifier;
+ return dst;
+}
+
+/*! Makes a deep copy of the list of argument lists \a srcLists.
+ * Will allocate memory, that is owned by the caller.
+ */
+QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists)
+{
+ ASSERT(srcLists!=0);
+ QList<ArgumentList> *dstLists = new QList<ArgumentList>;
+ dstLists->setAutoDelete(TRUE);
+ QListIterator<ArgumentList> sli(*srcLists);
+ ArgumentList *sl;
+ for (;(sl=sli.current());++sli)
+ {
+ dstLists->append(copyArgumentList(sl));
+ }
+ return dstLists;
+}
+
+/*! Strips template specifiers from scope \a fullName, except those
+ * that make up specialized classes. The switch \a parentOnly
+ * determines whether or not a template "at the end" of a scope
+ * should be considered, e.g. with \a parentOnly is \c TRUE, A<T>::B<S> will
+ * try to strip \<T\> and not \<S\>, while \a parentOnly is \c FALSE will
+ * strip both unless A<T> or B<S> are specialized template classes.
+ */
+QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
+ bool parentOnly,
+ QCString *pLastScopeStripped)
+{
+ QCString result;
+ int p=0;
+ int l=fullName.length();
+ int i=fullName.find('<');
+ while (i!=-1)
+ {
+ //printf("1:result+=%s\n",fullName.mid(p,i-p).data());
+ int e=i+1;
+ bool done=FALSE;
+ int count=1;
+ while (e<l && !done)
+ {
+ char c=fullName.at(e++);
+ if (c=='<')
+ {
+ count++;
+ }
+ else if (c=='>')
+ {
+ count--;
+ done = count==0;
+ }
+ }
+ int si= fullName.find("::",e);
+
+ if (parentOnly && si==-1) break;
+ // we only do the parent scope, so we stop here if needed
+
+ result+=fullName.mid(p,i-p);
+ //printf(" trying %s\n",(result+fullName.mid(i,e-i)).data());
+ if (getClass(result+fullName.mid(i,e-i))!=0)
+ {
+ result+=fullName.mid(i,e-i);
+ //printf(" 2:result+=%s cd=%s\n",fullName.mid(i,e-i-1).data(),cd->name().data());
+ }
+ else if (pLastScopeStripped)
+ {
+ //printf(" last stripped scope '%s'\n",fullName.mid(i,e-i).data());
+ *pLastScopeStripped=fullName.mid(i,e-i);
+ }
+ p=e;
+ i=fullName.find('<',p);
+ }
+ result+=fullName.right(l-p);
+ //printf("3:result+=%s\n",fullName.right(l-p).data());
+ return result;
+}
+
+/*! Merges two scope parts together. The parts may (partially) overlap.
+ * Example1: \c A::B and \c B::C will result in \c A::B::C <br>
+ * Example2: \c A and \c B will be \c A::B <br>
+ * Example3: \c A::B and B will be \c A::B
+ *
+ * @param leftScope the left hand part of the scope.
+ * @param rightScope the right hand part of the scope.
+ * @returns the merged scope.
+ */
+QCString mergeScopes(const QCString &leftScope,const QCString &rightScope)
+{
+ // case leftScope=="A" rightScope=="A::B" => result = "A::B"
+ if (leftScopeMatch(rightScope,leftScope)) return rightScope;
+ QCString result;
+ int i=0,p=leftScope.length();
+
+ // case leftScope=="A::B" rightScope=="B::C" => result = "A::B::C"
+ // case leftScope=="A::B" rightScope=="B" => result = "A::B"
+ bool found=FALSE;
+ while ((i=leftScope.findRev("::",p))!=-1)
+ {
+ if (leftScopeMatch(rightScope,leftScope.right(leftScope.length()-i-2)))
+ {
+ result = leftScope.left(i+2)+rightScope;
+ found=TRUE;
+ }
+ p=i-1;
+ }
+ if (found) return result;
+
+ // case leftScope=="A" rightScope=="B" => result = "A::B"
+ result=leftScope.copy();
+ if (!result.isEmpty() && !rightScope.isEmpty()) result+="::";
+ result+=rightScope;
+ return result;
+}
+
+/*! Returns a fragment from scope \a s, starting at position \a p.
+ *
+ * @param s the scope name as a string.
+ * @param p the start position (0 is the first).
+ * @param l the resulting length of the fragment.
+ * @returns the location of the fragment, or -1 if non is found.
+ */
+int getScopeFragment(const QCString &s,int p,int *l)
+{
+ int sl=s.length();
+ int sp=p;
+ int count=0;
+ bool done;
+ if (sp>=sl) return -1;
+ while (sp<sl)
+ {
+ char c=s.at(sp);
+ if (c==':') sp++,p++; else break;
+ }
+ while (sp<sl)
+ {
+ char c=s.at(sp);
+ switch (c)
+ {
+ case ':': // found next part
+ goto found;
+ case '<': // skip template specifier
+ count=1;sp++;
+ done=FALSE;
+ while (sp<sl && !done)
+ {
+ // TODO: deal with << and >> operators!
+ char c=s.at(sp++);
+ switch(c)
+ {
+ case '<': count++; break;
+ case '>': count--; if (count==0) done=TRUE; break;
+ default: break;
+ }
+ }
+ break;
+ default:
+ sp++;
+ break;
+ }
+ }
+found:
+ *l=sp-p;
+ //printf("getScopeFragment(%s,%d)=%s\n",s.data(),p,s.mid(p,*l).data());
+ return p;
+}
+
+//----------------------------------------------------------------------------
+
+PageDef *addRelatedPage(const char *name,const QCString &ptitle,
+ const QCString &doc,
+ QList<SectionInfo> * /*anchors*/,
+ const char *fileName,int startLine,
+ const QList<ListItemInfo> *sli,
+ GroupDef *gd,
+ TagInfo *tagInfo
+ )
+{
+ PageDef *pd=0;
+ //printf("addRelatedPage(name=%s gd=%p)\n",name,gd);
+ if ((pd=Doxygen::pageSDict->find(name)) && !tagInfo)
+ {
+ // append documentation block to the page.
+ pd->setDocumentation(doc,fileName,startLine);
+ //printf("Adding page docs `%s' pi=%p name=%s\n",doc.data(),pi,name);
+ }
+ else // new page
+ {
+ QCString baseName=name;
+ if (baseName.right(4)==".tex")
+ baseName=baseName.left(baseName.length()-4);
+ else if (baseName.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
+ baseName=baseName.left(baseName.length()-Doxygen::htmlFileExtension.length());
+
+ QCString title=ptitle.stripWhiteSpace();
+ pd=new PageDef(fileName,startLine,baseName,doc,title);
+
+ pd->setRefItems(sli);
+
+ if (tagInfo)
+ {
+ pd->setReference(tagInfo->tagName);
+ }
+
+ pd->setFileName(convertNameToFile(pd->name(),FALSE,TRUE));
+
+ //printf("Appending page `%s'\n",baseName.data());
+ Doxygen::pageSDict->append(baseName,pd);
+
+ if (gd) gd->addPage(pd);
+
+ if (!pd->title().isEmpty())
+ {
+ //outputList->writeTitle(pi->name,pi->title);
+
+ // a page name is a label as well!
+ QCString file;
+ if (gd)
+ {
+ file=gd->getOutputFileBase();
+ }
+ else
+ {
+ file=pd->getOutputFileBase();
+ }
+ SectionInfo *si=new SectionInfo(
+ file,pd->name(),pd->title(),SectionInfo::Page,pd->getReference());
+ //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n",
+ // si->label.data(),si->definition?si->definition->name().data():"<none>",
+ // si->fileName.data());
+ //printf(" SectionInfo: sec=%p sec->fileName=%s\n",si,si->fileName.data());
+ //printf("Adding section key=%s si->fileName=%s\n",pageName.data(),si->fileName.data());
+ Doxygen::sectionDict.insert(pd->name(),si);
+ }
+ }
+ return pd;
+}
+
+//----------------------------------------------------------------------------
+
+void addRefItem(const QList<ListItemInfo> *sli,
+ const char *key,
+ const char *prefix, const char *name,const char *title,const char *args)
+{
+ //printf("addRefItem(sli=%p,key=%s,prefix=%s,name=%s,title=%s,args=%s)\n",sli,key,prefix,name,title,args);
+ if (sli)
+ {
+ QListIterator<ListItemInfo> slii(*sli);
+ ListItemInfo *lii;
+ for (slii.toFirst();(lii=slii.current());++slii)
+ {
+ RefList *refList = Doxygen::xrefLists->find(lii->type);
+ if (refList
+ &&
+ (
+ // either not a built-in list or the list is enabled
+ (lii->type!="todo" || Config_getBool("GENERATE_TODOLIST")) &&
+ (lii->type!="test" || Config_getBool("GENERATE_TESTLIST")) &&
+ (lii->type!="bug" || Config_getBool("GENERATE_BUGLIST")) &&
+ (lii->type!="deprecated" || Config_getBool("GENERATE_DEPRECATEDLIST"))
+ )
+ )
+ {
+ RefItem *item = refList->getRefItem(lii->itemId);
+ ASSERT(item!=0);
+
+ item->prefix = prefix;
+ item->name = name;
+ item->title = title;
+ item->args = args;
+
+ refList->insertIntoList(key,item);
+
+ }
+ }
+ }
+}
+
+void addGroupListToTitle(OutputList &ol,Definition *d)
+{
+ LockingPtr<GroupList> groups = d->partOfGroups();
+ if (groups!=0) // write list of group to which this definition belongs
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.writeString("<div class=\"ingroups\">");
+ GroupListIterator gli(*groups);
+ GroupDef *gd;
+ bool first=TRUE;
+ for (gli.toFirst();(gd=gli.current());++gli)
+ {
+ if (!first) { ol.writeString(" &#124; "); } else first=FALSE;
+ ol.writeObjectLink(gd->getReference(),
+ gd->getOutputFileBase(),0,gd->groupTitle());
+ }
+ ol.writeString("</div>");
+ ol.popGeneratorState();
+ }
+}
+
+void filterLatexString(FTextStream &t,const char *str,
+ bool insideTabbing,bool insidePre,bool insideItem)
+{
+ if (str==0) return;
+ const unsigned char *p=(const unsigned char *)str;
+ unsigned char c;
+ unsigned char pc='\0';
+ while (*p)
+ {
+ c=*p++;
+
+ if (insidePre)
+ {
+ switch(c)
+ {
+ case '\\': t << "\\(\\backslash\\)"; break;
+ case '{': t << "\\{"; break;
+ case '}': t << "\\}"; break;
+ case '_': t << "\\_"; break;
+ default:
+ t << (char)c;
+ }
+ }
+ else
+ {
+ switch(c)
+ {
+ case '#': t << "\\#"; break;
+ case '$': t << "\\$"; break;
+ case '%': t << "\\%"; break;
+ case '^': t << "$^\\wedge$"; break;
+ case '&': t << "\\&"; break;
+ case '*': t << "$\\ast$"; break;
+ case '_': t << "\\_";
+ if (!insideTabbing) t << "\\-";
+ break;
+ case '{': t << "\\{"; break;
+ case '}': t << "\\}"; break;
+ case '<': t << "$<$"; break;
+ case '>': t << "$>$"; break;
+ case '|': t << "$|$"; break;
+ case '~': t << "$\\sim$"; break;
+ case '[': if (Config_getBool("PDF_HYPERLINKS") || insideItem)
+ t << "\\mbox{[}";
+ else
+ t << "[";
+ break;
+ case ']': if (pc=='[') t << "$\\,$";
+ if (Config_getBool("PDF_HYPERLINKS") || insideItem)
+ t << "\\mbox{]}";
+ else
+ t << "]";
+ break;
+ case '-': t << "-\\/";
+ break;
+ case '\\': if (*p=='<')
+ { t << "$<$"; p++; }
+ else if (*p=='>')
+ { t << "$>$"; p++; }
+ else
+ { t << "$\\backslash$"; }
+ break;
+ case '"': { t << "\\char`\\\"{}"; }
+ break;
+
+ default:
+ t << (char)c;
+ }
+ }
+ pc = c;
+ }
+}
+
+
+QCString rtfFormatBmkStr(const char *name)
+{
+ static QCString g_nextTag( "AAAAAAAAAA" );
+ static QDict<QCString> g_tagDict( 5003 );
+
+ g_tagDict.setAutoDelete(TRUE);
+
+ // To overcome the 40-character tag limitation, we
+ // substitute a short arbitrary string for the name
+ // supplied, and keep track of the correspondence
+ // between names and strings.
+ QCString key( name );
+ QCString* tag = g_tagDict.find( key );
+ if ( !tag )
+ {
+ // This particular name has not yet been added
+ // to the list. Add it, associating it with the
+ // next tag value, and increment the next tag.
+ tag = new QCString( g_nextTag.copy() ); // Make sure to use a deep copy!
+ g_tagDict.insert( key, tag );
+
+ // This is the increment part
+ char* nxtTag = g_nextTag.data() + g_nextTag.length() - 1;
+ for ( unsigned int i = 0; i < g_nextTag.length(); ++i, --nxtTag )
+ {
+ if ( ( ++(*nxtTag) ) > 'Z' )
+ {
+ *nxtTag = 'A';
+ }
+ else
+ {
+ // Since there was no carry, we can stop now
+ break;
+ }
+ }
+ }
+
+ return *tag;
+}
+
+QCString stripExtension(const char *fName)
+{
+ QCString result=fName;
+ if (result.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
+ {
+ result=result.left(result.length()-Doxygen::htmlFileExtension.length());
+ }
+ return result;
+}
+
+
+void replaceNamespaceAliases(QCString &scope,int i)
+{
+ while (i>0)
+ {
+ QCString ns = scope.left(i);
+ QCString *s = Doxygen::namespaceAliasDict[ns];
+ if (s)
+ {
+ scope=*s+scope.right(scope.length()-i);
+ i=s->length();
+ }
+ if (i>0 && ns==scope.left(i)) break;
+ }
+}
+
+QCString stripPath(const char *s)
+{
+ QCString result=s;
+ int i=result.findRev('/');
+ if (i!=-1)
+ {
+ result=result.mid(i+1);
+ }
+ return result;
+}
+
+/** returns \c TRUE iff string \a s contains word \a w */
+bool containsWord(const QCString &s,const QCString &word)
+{
+ static QRegExp wordExp("[a-z_A-Z\\x80-\\xFF]+");
+ int p=0,i,l;
+ while ((i=wordExp.match(s,p,&l))!=-1)
+ {
+ if (s.mid(i,l)==word) return TRUE;
+ p=i+l;
+ }
+ return FALSE;
+}
+
+bool findAndRemoveWord(QCString &s,const QCString &word)
+{
+ static QRegExp wordExp("[a-z_A-Z\\x80-\\xFF]+");
+ int p=0,i,l;
+ while ((i=wordExp.match(s,p,&l))!=-1)
+ {
+ if (s.mid(i,l)==word)
+ {
+ if (i>0 && isspace((uchar)s.at(i-1)))
+ i--,l++;
+ else if (i+l<(int)s.length() && isspace(s.at(i+l)))
+ l++;
+ s = s.left(i)+s.mid(i+l); // remove word + spacing
+ return TRUE;
+ }
+ p=i+l;
+ }
+ return FALSE;
+}
+
+/** Special version of QCString::stripWhiteSpace() that only strips
+ * empty lines.
+ */
+QCString stripLeadingAndTrailingEmptyLines(const QCString &s)
+{
+ const char *p = s.data();
+ if (p==0) return 0;
+
+ // search for leading empty lines
+ int i=0,li=-1,l=s.length();
+ char c;
+ while ((c=*p++))
+ {
+ if (c==' ' || c=='\t' || c=='\r') i++;
+ else if (c=='\n') i++,li=i;
+ else break;
+ }
+
+ // search for trailing empty lines
+ int b=l-1,bi=-1;
+ p=s.data()+b;
+ while (b>=0)
+ {
+ c=*p; p--;
+ if (c==' ' || c=='\t' || c=='\r') b--;
+ else if (c=='\n') bi=b,b--;
+ else break;
+ }
+
+ // return whole string if no leading or trailing lines where found
+ if (li==-1 && bi==-1) return s;
+
+ // return substring
+ if (bi==-1) bi=l;
+ if (li==-1) li=0;
+ if (bi<=li) return 0; // only empty lines
+ return s.mid(li,bi-li);
+}
+
+#if 0
+void stringToSearchIndex(const QCString &docBaseUrl,const QCString &title,
+ const QCString &str,bool priority,const QCString &anchor)
+{
+ static bool searchEngine = Config_getBool("SEARCHENGINE");
+ if (searchEngine)
+ {
+ Doxygen::searchIndex->setCurrentDoc(title,docBaseUrl,anchor);
+ static QRegExp wordPattern("[a-z_A-Z\\x80-\\xFF][a-z_A-Z0-9\\x80-\\xFF]*");
+ int i,p=0,l;
+ while ((i=wordPattern.match(str,p,&l))!=-1)
+ {
+ Doxygen::searchIndex->addWord(str.mid(i,l),priority);
+ p=i+l;
+ }
+ }
+}
+#endif
+
+//--------------------------------------------------------------------------
+
+static QDict<int> g_extLookup;
+
+static struct Lang2ExtMap
+{
+ const char *langName;
+ const char *parserName;
+ SrcLangExt parserId;
+}
+g_lang2extMap[] =
+{
+// language parser parser option
+ { "idl", "c", SrcLangExt_IDL },
+ { "java", "c", SrcLangExt_Java },
+ { "javascript", "c", SrcLangExt_JS },
+ { "csharp", "c", SrcLangExt_CSharp },
+ { "d", "c", SrcLangExt_D },
+ { "php", "c", SrcLangExt_PHP },
+ { "objective-c", "c", SrcLangExt_ObjC },
+ { "c", "c", SrcLangExt_Cpp },
+ { "c++", "c", SrcLangExt_Cpp },
+ { "python", "python", SrcLangExt_Python },
+ { "fortran", "fortran", SrcLangExt_F90 },
+ { "vhdl", "vhdl", SrcLangExt_VHDL },
+ { "dbusxml", "dbusxml", SrcLangExt_XML },
+ { 0, 0, (SrcLangExt)0 }
+};
+
+bool updateLanguageMapping(const QCString &extension,const QCString &language)
+{
+ //getLanguageFromFileName("dummy"); // force initialization of the g_extLookup map
+ const Lang2ExtMap *p = g_lang2extMap;
+ QCString langName = language.lower();
+ while (p->langName)
+ {
+ if (langName==p->langName) break;
+ p++;
+ }
+ if (!p->langName) return FALSE;
+
+ // found the language
+ SrcLangExt parserId = p->parserId;
+ QCString extName = extension.lower();
+ if (extName.isEmpty()) return FALSE;
+ if (extName.at(0)!='.') extName.prepend(".");
+ if (g_extLookup.find(extension)!=0) // language was already register for this ext
+ {
+ g_extLookup.remove(extension);
+ }
+ //printf("registering extension %s\n",extName.data());
+ g_extLookup.insert(extName,new int(parserId));
+ if (!Doxygen::parserManager->registerExtension(extName,p->parserName))
+ {
+ err("Failed to assign extension %s to parser %s for language %s\n",
+ extName.data(),p->parserName,language.data());
+ }
+ else
+ {
+ //msg("Registered extension %s to language parser %s...\n",
+ // extName.data(),language.data());
+ }
+ return TRUE;
+}
+
+void initDefaultExtensionMapping()
+{
+ g_extLookup.setAutoDelete(TRUE);
+ updateLanguageMapping(".idl", "idl");
+ updateLanguageMapping(".ddl", "idl");
+ updateLanguageMapping(".odl", "idl");
+ updateLanguageMapping(".java", "java");
+ updateLanguageMapping(".as", "javascript");
+ updateLanguageMapping(".js", "javascript");
+ updateLanguageMapping(".cs", "csharp");
+ updateLanguageMapping(".d", "d");
+ updateLanguageMapping(".php", "php");
+ updateLanguageMapping(".php4", "php");
+ updateLanguageMapping(".php5", "php");
+ updateLanguageMapping(".inc", "php");
+ updateLanguageMapping(".phtml", "php");
+ updateLanguageMapping(".m", "objective-c");
+ updateLanguageMapping(".M", "objective-c");
+ updateLanguageMapping(".mm", "objective-c");
+ updateLanguageMapping(".py", "python");
+ updateLanguageMapping(".f", "fortran");
+ updateLanguageMapping(".for", "fortran");
+ updateLanguageMapping(".f90", "fortran");
+ updateLanguageMapping(".vhd", "vhdl");
+ updateLanguageMapping(".vhdl", "vhdl");
+ //updateLanguageMapping(".xml", "dbusxml");
+}
+
+SrcLangExt getLanguageFromFileName(const QCString fileName)
+{
+ int i = fileName.findRev('.');
+ if (i!=-1) // name has an extension
+ {
+ QCString extStr=fileName.right(fileName.length()-i).lower();
+ if (!extStr.isEmpty()) // non-empty extension
+ {
+ int *pVal=g_extLookup.find(extStr);
+ if (pVal) // listed extension
+ {
+ //printf("getLanguageFromFileName(%s)=%x\n",extStr.data(),*pVal);
+ return (SrcLangExt)*pVal;
+ }
+ }
+ }
+ //printf("getLanguageFromFileName(%s) not found!\n",fileName.data());
+ return SrcLangExt_Cpp; // not listed => assume C-ish language.
+}
+
+//--------------------------------------------------------------------------
+
+/*! Returns true iff the given name string appears to be a typedef in scope. */
+bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n)
+{
+ if (scope==0 ||
+ (scope->definitionType()!=Definition::TypeClass &&
+ scope->definitionType()!=Definition::TypeNamespace
+ )
+ )
+ {
+ scope=Doxygen::globalScope;
+ }
+
+ QCString name = n;
+ if (name.isEmpty())
+ return FALSE; // no name was given
+
+ DefinitionIntf *di = Doxygen::symbolMap->find(name);
+ if (di==0)
+ return FALSE; // could not find any matching symbols
+
+ // mostly copied from getResolvedClassRec()
+ QCString explicitScopePart;
+ int qualifierIndex = computeQualifiedIndex(name);
+ if (qualifierIndex!=-1)
+ {
+ explicitScopePart = name.left(qualifierIndex);
+ replaceNamespaceAliases(explicitScopePart,explicitScopePart.length());
+ name = name.mid(qualifierIndex+2);
+ }
+
+ int minDistance = 10000;
+ MemberDef *bestMatch = 0;
+
+ if (di->definitionType()==DefinitionIntf::TypeSymbolList)
+ {
+ // find the closest closest matching definition
+ DefinitionListIterator dli(*(DefinitionList*)di);
+ Definition *d;
+ for (dli.toFirst();(d=dli.current());++dli)
+ {
+ if (d->definitionType()==Definition::TypeMember)
+ {
+ g_visitedNamespaces.clear();
+ int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart);
+ if (distance!=-1 && distance<minDistance)
+ {
+ minDistance = distance;
+ bestMatch = (MemberDef *)d;
+ }
+ }
+ }
+ }
+ else if (di->definitionType()==Definition::TypeMember)
+ {
+ Definition *d = (Definition *)di;
+ g_visitedNamespaces.clear();
+ int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart);
+ if (distance!=-1 && distance<minDistance)
+ {
+ minDistance = distance;
+ bestMatch = (MemberDef *)d;
+ }
+ }
+
+ if (bestMatch && bestMatch->isTypedef())
+ return TRUE; // closest matching symbol is a typedef
+ else
+ return FALSE;
+}
+
+int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos)
+{
+ int bytes=1;
+ if (startPos>=len) return len;
+ char c = utf8Str[startPos];
+ if (c<0) // multibyte utf-8 character
+ {
+ bytes++; // 1xxx.xxxx: >=2 byte character
+ if (((uchar)c&0xE0)==0xE0)
+ {
+ bytes++; // 111x.xxxx: >=3 byte character
+ }
+ if (((uchar)c&0xF0)==0xF0)
+ {
+ bytes++; // 1111.xxxx: 4 byte character
+ }
+ }
+ else if (c=='&') // skip over character entities
+ {
+ static QRegExp re1("&#[0-9]+;"); // numerical entity
+ static QRegExp re2("&[A-Z_a-z]+;"); // named entity
+ int l1,l2;
+ int i1 = re1.match(utf8Str,startPos,&l1);
+ int i2 = re2.match(utf8Str,startPos,&l2);
+ if (i1!=-1)
+ {
+ bytes=l1;
+ }
+ else if (i2!=-1)
+ {
+ bytes=l2;
+ }
+ }
+ return startPos+bytes;
+}
+
+QCString parseCommentAsText(const Definition *scope,const MemberDef *md,
+ const QCString &doc,const QCString &fileName,int lineNr)
+{
+ QGString s;
+ if (doc.isEmpty()) return s.data();
+ FTextStream t(&s);
+ DocNode *root = validatingParseDoc(fileName,lineNr,
+ (Definition*)scope,(MemberDef*)md,doc,FALSE,FALSE);
+ TextDocVisitor *visitor = new TextDocVisitor(t);
+ root->accept(visitor);
+ delete visitor;
+ delete root;
+ QCString result = s.data();
+ int i=0;
+ int charCnt=0;
+ int l=result.length();
+ bool addEllipsis=FALSE;
+ while ((i=nextUtf8CharPosition(result,l,i))<l)
+ {
+ charCnt++;
+ if (charCnt>=80) break;
+ }
+ if (charCnt>=80) // try to truncate the string
+ {
+ while ((i=nextUtf8CharPosition(result,l,i))<l && charCnt<100)
+ {
+ charCnt++;
+ if (result.at(i)>=0 && isspace(result.at(i)))
+ {
+ addEllipsis=TRUE;
+ }
+ else if (result.at(i)==',' ||
+ result.at(i)=='.' ||
+ result.at(i)=='?')
+ {
+ break;
+ }
+ }
+ }
+ if (addEllipsis || charCnt==100) result=result.left(i)+"...";
+ return result.data();
+}
+
+//--------------------------------------------------------------------------------------
+
+static QDict<void> aliasesProcessed;
+
+QCString expandAliasRec(const QCString s)
+{
+ QCString result;
+ static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*");
+ QCString value=s;
+ int i,p=0,l;
+ while ((i=cmdPat.match(value,p,&l))!=-1)
+ {
+ result+=value.mid(p,i-p);
+ QCString args = extractAliasArgs(value,i+l);
+ bool hasArgs = !args.isEmpty(); // found directly after command
+ QCString cmd;
+ if (hasArgs)
+ {
+ int numArgs = countAliasArguments(args);
+ cmd = value.mid(i+1,l-1)+QCString().sprintf("{%d}",numArgs); // alias name + {n}
+ }
+ else
+ {
+ cmd = value.mid(i+1,l-1);
+ }
+ //printf("Found command '%s' args='%s'\n",cmd.data(),args.data());
+ QCString *aliasText=Doxygen::aliasDict.find(cmd);
+ if (aliasesProcessed.find(cmd)==0 && aliasText) // expand the alias
+ {
+ //printf("is an alias!\n");
+ aliasesProcessed.insert(cmd,(void *)0x8);
+ QCString val = *aliasText;
+ if (hasArgs)
+ {
+ val = replaceAliasArguments(val,args);
+ //printf("replace '%s'->'%s' args='%s'\n",
+ // aliasText->data(),val.data(),args.data());
+ }
+ result+=expandAliasRec(val);
+ aliasesProcessed.remove(cmd);
+ p=i+l;
+ if (hasArgs) p+=args.length()+2;
+ }
+ else // command is not an alias
+ {
+ //printf("not an alias!\n");
+ result+=value.mid(i,l);
+ p=i+l;
+ }
+ }
+ result+=value.right(value.length()-p);
+
+ //printf("expandAliases '%s'->'%s'\n",s.data(),result.data());
+ return result;
+}
+
+static QCString replaceAliasArgument(const QCString &aliasValue,int paramNum,
+ const QCString &paramValue)
+{
+ QCString result;
+ QCString paramMarker;
+ paramMarker.sprintf("\\%d",paramNum);
+ int markerLen = paramMarker.length();
+ int p=0,i;
+ while ((i=aliasValue.find(paramMarker,p))!=-1) // search for marker
+ {
+ result+=aliasValue.mid(p,i-p);
+ //printf("Found marker '%s' at %d len=%d for param '%s' in '%s'\n",
+ // paramMarker.data(),i,markerLen,paramValue.data(),aliasValue.data());
+ if (i==0 || aliasValue.at(i-1)!='\\') // found unescaped marker
+ {
+ result += paramValue;
+ p=i+markerLen;
+ }
+ else // ignore escaped markers
+ {
+ result += aliasValue.mid(i,markerLen);
+ p=i+1;
+ }
+ }
+ result+=aliasValue.right(aliasValue.length()-p);
+ result = substitute(result,"\\{","{");
+ result = substitute(result,"\\}","}");
+ result = expandAliasRec(substitute(result,"\\,",","));
+ //printf("replaceAliasArgument('%s',%d,'%s')->%s\n",
+ // aliasValue.data(),paramNum,paramValue.data(),result.data());
+ return result;
+}
+
+QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList)
+{
+ QCString result = aliasValue;
+ QList<QCString> args;
+ int p=0,i,c=1;
+ for (i=0;i<(int)argList.length();i++)
+ {
+ if (argList.at(i)==',' && (i==0 || argList.at(i-1)!='\\'))
+ {
+ result = replaceAliasArgument(result,c,argList.mid(p,i-p));
+ p=i+1;
+ c++;
+ }
+ }
+ if (p<(int)argList.length())
+ {
+ result = replaceAliasArgument(result,c,argList.right(argList.length()-p));
+ }
+ return result;
+}
+
+int countAliasArguments(const QCString argList)
+{
+ int count=1;
+ int l = argList.length();
+ int i;
+ for (i=0;i<l;i++)
+ {
+ if (argList.at(i)==',' && (i==0 || argList.at(i-1)!='\\')) count++;
+ }
+ return count;
+}
+
+QCString extractAliasArgs(const QCString &args,int pos)
+{
+ int i;
+ int bc=0;
+ char prevChar=0;
+ if (args.at(pos)=='{') // alias has argument
+ {
+ for (i=pos;i<(int)args.length();i++)
+ {
+ if (prevChar!='\\')
+ {
+ if (args.at(i)=='{') bc++;
+ if (args.at(i)=='}') bc--;
+ prevChar=args.at(i);
+ }
+ else
+ {
+ prevChar=0;
+ }
+
+ if (bc==0)
+ {
+ //printf("extractAliasArgs('%s')->'%s'\n",args.data(),args.mid(pos+1,i-pos-1).data());
+ return args.mid(pos+1,i-pos-1);
+ }
+ }
+ }
+ return "";
+}
+
+QCString resolveAliasCmd(const QCString aliasCmd)
+{
+ QCString result;
+ aliasesProcessed.clear();
+ //printf("Expanding: '%s'\n",aliasCmd.data());
+ result = expandAliasRec(aliasCmd);
+ //printf("Expanding result: '%s'->'%s'\n",aliasCmd.data(),result.data());
+ return result;
+}
+
+QCString expandAlias(const QCString &aliasName,const QCString &aliasValue)
+{
+ QCString result;
+ aliasesProcessed.clear();
+ // avoid expanding this command recursively
+ aliasesProcessed.insert(aliasName,(void *)0x8);
+ // expand embedded commands
+ //printf("Expanding: '%s'->'%s'\n",aliasName.data(),aliasValue.data());
+ result = expandAliasRec(aliasValue);
+ //printf("Expanding result: '%s'->'%s'\n",aliasName.data(),result.data());
+ return result;
+}
+
+void writeTypeConstraints(OutputList &ol,Definition *d,ArgumentList *al)
+{
+ if (al==0) return;
+ ol.startConstraintList(theTranslator->trTypeConstraints());
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (;(a=ali.current());++ali)
+ {
+ ol.startConstraintParam();
+ ol.parseText(a->name);
+ ol.endConstraintParam();
+ ol.startConstraintType();
+ linkifyText(TextGeneratorOLImpl(ol),d,0,0,a->type);
+ ol.endConstraintType();
+ ol.startConstraintDocs();
+ ol.parseDoc(d->docFile(),d->docLine(),d,0,a->docs,TRUE,FALSE);
+ ol.endConstraintDocs();
+ }
+ ol.endConstraintList();
+}
+
+bool usingTreeIndex()
+{
+ static bool treeView = Config_getBool("USE_INLINE_TREES");
+ return treeView;
+}
+
+void stackTrace()
+{
+#ifdef TRACINGSUPPORT
+ void *backtraceFrames[128];
+ int frameCount = backtrace(backtraceFrames, 128);
+ static char cmd[40960];
+ char *p = cmd;
+ p += sprintf(p,"/usr/bin/atos -p %d ", (int)getpid());
+ for (int x = 0; x < frameCount; x++)
+ {
+ p += sprintf(p,"%p ", backtraceFrames[x]);
+ }
+ fprintf(stderr,"========== STACKTRACE START ==============\n");
+ if (FILE *fp = popen(cmd, "r"))
+ {
+ char resBuf[512];
+ while (size_t len = fread(resBuf, 1, sizeof(resBuf), fp))
+ {
+ fwrite(resBuf, 1, len, stderr);
+ }
+ pclose(fp);
+ }
+ fprintf(stderr,"============ STACKTRACE END ==============\n");
+ //fprintf(stderr,"%s\n", frameStrings[x]);
+#endif
+}
+
+static int transcodeCharacterBuffer(const char *fileName,BufStr &srcBuf,int size,
+ const char *inputEncoding,const char *outputEncoding)
+{
+ if (inputEncoding==0 || outputEncoding==0) return size;
+ if (qstricmp(inputEncoding,outputEncoding)==0) return size;
+ void *cd = portable_iconv_open(outputEncoding,inputEncoding);
+ if (cd==(void *)(-1))
+ {
+ err("error: unsupported character conversion: '%s'->'%s': %s\n"
+ "Check the INPUT_ENCODING setting in the config file!\n",
+ inputEncoding,outputEncoding,strerror(errno));
+ exit(1);
+ }
+ int tmpBufSize=size*4+1;
+ BufStr tmpBuf(tmpBufSize);
+ size_t iLeft=size;
+ size_t oLeft=tmpBufSize;
+ const char *srcPtr = srcBuf.data();
+ char *dstPtr = tmpBuf.data();
+ uint newSize=0;
+ if (!portable_iconv(cd, &srcPtr, &iLeft, &dstPtr, &oLeft))
+ {
+ newSize = tmpBufSize-oLeft;
+ srcBuf.shrink(newSize);
+ strncpy(srcBuf.data(),tmpBuf.data(),newSize);
+ //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data());
+ }
+ else
+ {
+ err("%s: error: failed to translate characters from %s to %s: check INPUT_ENCODING\n",
+ fileName,inputEncoding,outputEncoding);
+ exit(1);
+ }
+ portable_iconv_close(cd);
+ return newSize;
+}
+
+//! read a file name \a fileName and optionally filter and transcode it
+bool readInputFile(const char *fileName,BufStr &inBuf)
+{
+ // try to open file
+ int size=0;
+ //uint oldPos = dest.curPos();
+ //printf(".......oldPos=%d\n",oldPos);
+
+ QFileInfo fi(fileName);
+ if (!fi.exists()) return FALSE;
+ QCString filterName = getFileFilter(fileName,FALSE);
+ if (filterName.isEmpty())
+ {
+ QFile f(fileName);
+ if (!f.open(IO_ReadOnly))
+ {
+ err("error: could not open file %s\n",fileName);
+ return FALSE;
+ }
+ size=fi.size();
+ // read the file
+ inBuf.skip(size);
+ if (f.readBlock(inBuf.data()/*+oldPos*/,size)!=size)
+ {
+ err("error: problems while reading file %s\n",fileName);
+ return FALSE;
+ }
+ }
+ else
+ {
+ QCString cmd=filterName+" \""+fileName+"\"";
+ Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",cmd.data());
+ FILE *f=portable_popen(cmd,"r");
+ if (!f)
+ {
+ err("error: could not execute filter %s\n",filterName.data());
+ return FALSE;
+ }
+ const int bufSize=1024;
+ char buf[bufSize];
+ int numRead;
+ while ((numRead=fread(buf,1,bufSize,f))>0)
+ {
+ //printf(">>>>>>>>Reading %d bytes\n",numRead);
+ inBuf.addArray(buf,numRead),size+=numRead;
+ }
+ portable_pclose(f);
+ }
+
+ int start=0;
+ if (inBuf.size()>=2 &&
+ ((inBuf.at(0)==-1 && inBuf.at(1)==-2) || // Litte endian BOM
+ (inBuf.at(0)==-2 && inBuf.at(1)==-1) // big endian BOM
+ )
+ ) // UCS-2 encoded file
+ {
+ transcodeCharacterBuffer(fileName,inBuf,inBuf.curPos(),
+ "UCS-2","UTF-8");
+ }
+ else if (inBuf.size()>=3 &&
+ (uchar)inBuf.at(0)==0xEF &&
+ (uchar)inBuf.at(1)==0xBB &&
+ (uchar)inBuf.at(2)==0xBF
+ )
+ {
+ // UTF-8 encoded file
+ inBuf.dropFromStart(3); // remove UTF-8 BOM: no translation needed
+ }
+ else // transcode according to the INPUT_ENCODING setting
+ {
+ // do character transcoding if needed.
+ transcodeCharacterBuffer(fileName,inBuf,inBuf.curPos(),
+ Config_getString("INPUT_ENCODING"),"UTF-8");
+ }
+
+ inBuf.addChar('\n'); /* to prevent problems under Windows ? */
+
+ // and translate CR's
+ size=inBuf.curPos()-start;
+ int newSize=filterCRLF(inBuf.data()+start,size);
+ //printf("filter char at %p size=%d newSize=%d\n",dest.data()+oldPos,size,newSize);
+ if (newSize!=size) // we removed chars
+ {
+ inBuf.shrink(newSize); // resize the array
+ //printf(".......resizing from %d to %d result=[%s]\n",oldPos+size,oldPos+newSize,dest.data());
+ }
+ inBuf.at(inBuf.curPos())='\0';
+ return TRUE;
+}
+
+// Replace %word by word in title
+QCString filterTitle(const QCString &title)
+{
+ QCString tf;
+ static QRegExp re("%[A-Z_a-z]");
+ int p=0,i,l;
+ while ((i=re.match(title,p,&l))!=-1)
+ {
+ tf+=title.mid(p,i-p);
+ tf+=title.mid(i+1,l-1); // skip %
+ p=i+l;
+ }
+ tf+=title.right(title.length()-p);
+ return tf;
+}
+
+//----------------------------------------------------------------------------
+// returns TRUE if the name of the file represented by `fi' matches
+// one of the file patterns in the `patList' list.
+
+bool patternMatch(const QFileInfo &fi,const QStrList *patList)
+{
+ bool found=FALSE;
+ if (patList)
+ {
+ QStrListIterator it(*patList);
+ QCString pattern;
+ for (it.toFirst();(pattern=it.current());++it)
+ {
+ if (!pattern.isEmpty() && !found)
+ {
+ int i=pattern.find('=');
+ if (i!=-1) pattern=pattern.left(i); // strip of the extension specific filter name
+
+#if defined(_WIN32) || defined(__MACOSX__) // Windows or MacOSX
+ QRegExp re(pattern,FALSE,TRUE); // case insensitive match
+#else // unix
+ QRegExp re(pattern,TRUE,TRUE); // case sensitive match
+#endif
+ found = found || re.match(fi.fileName().data())!=-1 ||
+ re.match(fi.filePath().data())!=-1 ||
+ re.match(fi.absFilePath().data())!=-1;
+ //printf("Matching `%s' against pattern `%s' found=%d\n",
+ // fi->fileName().data(),pattern.data(),found);
+ }
+ }
+ }
+ return found;
+}
+
+void writeSummaryLink(OutputList &ol,const char *label,const char *title,
+ bool &first)
+{
+ if (first)
+ {
+ ol.writeString(" <div class=\"summary\">\n");
+ first=FALSE;
+ }
+ else
+ {
+ ol.writeString(" &#124;\n");
+ }
+ ol.writeString("<a href=\"#");
+ ol.writeString(label);
+ ol.writeString("\">");
+ ol.writeString(title);
+ ol.writeString("</a>");
+}
+
+QCString externalLinkTarget()
+{
+ static bool extLinksInWindow = Config_getBool("EXT_LINKS_IN_WINDOW");
+ if (extLinksInWindow) return "target=\"_blank\" "; else return "";
+}
+
+QCString externalRef(const QCString &relPath,const QCString &ref,bool href)
+{
+ QCString result;
+ if (!ref.isEmpty())
+ {
+ QCString *dest = Doxygen::tagDestinationDict[ref];
+ if (dest)
+ {
+ result = *dest;
+ int l = result.length();
+ if (!relPath.isEmpty() && l>0 && result.at(0)=='.')
+ { // relative path -> prepend relPath.
+ result.prepend(relPath);
+ }
+ if (!href) result.prepend("doxygen=\""+ref+":");
+ if (l>0 && result.at(l-1)!='/') result+='/';
+ if (!href) result.append("\" ");
+ }
+ }
+ else
+ {
+ result = relPath;
+ }
+ return result;
+}
+
+void writeColoredImgData(const char *dir,ColoredImgDataItem data[])
+{
+ static int hue = Config_getInt("HTML_COLORSTYLE_HUE");
+ static int sat = Config_getInt("HTML_COLORSTYLE_SAT");
+ static int gamma = Config_getInt("HTML_COLORSTYLE_GAMMA");
+ while (data->name)
+ {
+ QCString fileName;
+ fileName=(QCString)dir+"/"+data->name;
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ {
+ ColoredImage img(data->width,data->height,data->content,data->alpha,
+ sat,hue,gamma);
+ img.save(fileName);
+ }
+ else
+ {
+ fprintf(stderr,"Warning: Cannot open file %s for writing\n",data->name);
+ }
+ Doxygen::indexList.addImageFile(data->name);
+ data++;
+ }
+}
+
+QCString replaceColorMarkers(const char *str)
+{
+ QCString result;
+ QCString s=str;
+ if (s.isEmpty()) return result;
+ static QRegExp re("##[0-9A-Fa-f][0-9A-Fa-f]");
+ static const char hex[] = "0123456789ABCDEF";
+ static int hue = Config_getInt("HTML_COLORSTYLE_HUE");
+ static int sat = Config_getInt("HTML_COLORSTYLE_SAT");
+ static int gamma = Config_getInt("HTML_COLORSTYLE_GAMMA");
+ int i,l,sl=s.length(),p=0;
+ while ((i=re.match(s,p,&l))!=-1)
+ {
+ result+=s.mid(p,i-p);
+ QCString lumStr = s.mid(i+2,l-2);
+#define HEXTONUM(x) (((x)>='0' && (x)<='9') ? ((x)-'0') : \
+ ((x)>='a' && (x)<='f') ? ((x)-'a'+10) : \
+ ((x)>='A' && (x)<='F') ? ((x)-'A'+10) : 0)
+
+ double r,g,b;
+ int red,green,blue;
+ int level = HEXTONUM(lumStr[0])*16+HEXTONUM(lumStr[1]);
+ ColoredImage::hsl2rgb(hue/360.0,sat/255.0,
+ pow(level/255.0,gamma/100.0),&r,&g,&b);
+ red = (int)(r*255.0);
+ green = (int)(g*255.0);
+ blue = (int)(b*255.0);
+ char colStr[8];
+ colStr[0]='#';
+ colStr[1]=hex[red>>4];
+ colStr[2]=hex[red&0xf];
+ colStr[3]=hex[green>>4];
+ colStr[4]=hex[green&0xf];
+ colStr[5]=hex[blue>>4];
+ colStr[6]=hex[blue&0xf];
+ colStr[7]=0;
+ //printf("replacing %s->%s (level=%d)\n",lumStr.data(),colStr,level);
+ result+=colStr;
+ p=i+l;
+ }
+ result+=s.right(sl-p);
+ return result;
+}
+
diff --git a/src/util.h b/src/util.h
new file mode 100644
index 0000000..3f10192
--- /dev/null
+++ b/src/util.h
@@ -0,0 +1,404 @@
+/******************************************************************************
+ *
+ * $Id: util.h,v 1.49 2001/03/19 19:27:42 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef UTIL_H
+#define UTIL_H
+
+/*! \file util.h
+ * \brief A bunch of utility functions.
+ */
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qtextstream.h>
+#include <ctype.h>
+#include "sortdict.h"
+
+//--------------------------------------------------------------------
+
+class ClassDef;
+class FileDef;
+class MemberList;
+class NamespaceDef;
+class FileNameDict;
+class ArgumentList;
+class OutputList;
+class OutputDocInterface;
+class MemberDef;
+class ExampleSDict;
+class ClassSDict;
+class BaseClassList;
+class GroupDef;
+class NamespaceSDict;
+class ClassList;
+class MemberGroupSDict;
+struct TagInfo;
+class MemberNameInfoSDict;
+struct ListItemInfo;
+class PageDef;
+struct SectionInfo;
+class QDir;
+class Definition;
+class BufStr;
+class QFileInfo;
+class QStrList;
+class FTextStream;
+
+//--------------------------------------------------------------------
+
+class TextGeneratorIntf
+{
+ public:
+ virtual ~TextGeneratorIntf() {}
+ virtual void writeString(const char *,bool) const = 0;
+ virtual void writeBreak() const = 0;
+ virtual void writeLink(const char *extRef,const char *file,
+ const char *anchor,const char *text
+ ) const = 0;
+};
+
+class TextGeneratorOLImpl : public TextGeneratorIntf
+{
+ public:
+ virtual ~TextGeneratorOLImpl() {}
+ TextGeneratorOLImpl(OutputDocInterface &od);
+ void writeString(const char *s,bool keepSpaces) const;
+ void writeBreak() const;
+ void writeLink(const char *extRef,const char *file,
+ const char *anchor,const char *text
+ ) const;
+ private:
+ OutputDocInterface &m_od;
+};
+
+//--------------------------------------------------------------------
+
+enum SrcLangExt
+{
+ SrcLangExt_Unknown = 0x0000,
+ SrcLangExt_IDL = 0x0008,
+ SrcLangExt_Java = 0x0010,
+ SrcLangExt_CSharp = 0x0020,
+ SrcLangExt_D = 0x0040,
+ SrcLangExt_PHP = 0x0080,
+ SrcLangExt_ObjC = 0x0100,
+ SrcLangExt_Cpp = 0x0200,
+ SrcLangExt_JS = 0x0400,
+ SrcLangExt_Python = 0x0800,
+ SrcLangExt_F90 = 0x1000,
+ SrcLangExt_VHDL = 0x2000,
+ SrcLangExt_XML = 0x4000
+};
+
+//--------------------------------------------------------------------
+
+void linkifyText(const TextGeneratorIntf &ol,
+ Definition *scope,
+ FileDef *fileScope,
+ const char *name,
+ const char *text,
+ bool autoBreak=FALSE,
+ bool external=TRUE,
+ bool keepSpaces=FALSE
+ );
+
+void setAnchors(ClassDef *cd,char id,MemberList *ml,int groupId=-1);
+
+QCString fileToString(const char *name,bool filter=FALSE,bool isSourceCode=FALSE);
+
+QCString dateToString(bool);
+
+bool getDefs(const QCString &scopeName,
+ const QCString &memberName,
+ const char *,
+ MemberDef *&md,
+ ClassDef *&cd,
+ FileDef *&fd,
+ NamespaceDef *&nd,
+ GroupDef *&gd,
+ bool forceEmptyScope=FALSE,
+ FileDef *currentFile=0,
+ bool checkCV=FALSE
+ );
+
+QCString getFileFilter(const char* name,bool isSourceCode);
+
+bool resolveRef(/* in */ const char *scName,
+ /* in */ const char *name,
+ /* in */ bool inSeeBlock,
+ /* out */ Definition **resContext,
+ /* out */ MemberDef **resMember,
+ /* in */ bool lookForSpecializations = TRUE,
+ /* in */ FileDef *currentFile = 0,
+ /* in */ bool checkScope = FALSE
+ );
+
+bool resolveLink(/* in */ const char *scName,
+ /* in */ const char *lr,
+ /* in */ bool inSeeBlock,
+ /* out */ Definition **resContext,
+ /* out */ QCString &resAnchor
+ );
+
+//bool generateRef(OutputDocInterface &od,const char *,
+// const char *,bool inSeeBlock,const char * =0);
+
+bool generateLink(OutputDocInterface &od,const char *,
+ const char *,bool inSeeBlock,const char *);
+
+void generateFileRef(OutputDocInterface &od,const char *,
+ const char *linkTxt=0);
+
+void writePageRef(OutputDocInterface &od,const char *cn,const char *mn);
+
+QCString getCanonicalTemplateSpec(Definition *d,FileDef *fs,const QCString& spec);
+
+bool matchArguments2(Definition *srcScope,FileDef *srcFileScope,ArgumentList *srcAl,
+ Definition *dstScope,FileDef *dstFileScope,ArgumentList *dstAl,
+ bool checkCV
+ );
+
+void mergeArguments(ArgumentList *,ArgumentList *,bool forceNameOverwrite=FALSE);
+
+QCString substituteClassNames(const QCString &s);
+
+QCString substitute(const char *s,const char *src,const char *dst);
+
+QCString clearBlock(const char *s,const char *begin,const char *end);
+
+QCString selectBlock(const QCString& s,const QCString &name,bool which);
+
+QCString resolveDefines(const char *n);
+
+ClassDef *getClass(const char *key);
+
+ClassDef *getResolvedClass(Definition *scope,
+ FileDef *fileScope,
+ const char *key,
+ MemberDef **pTypeDef=0,
+ QCString *pTemplSpec=0,
+ bool mayBeUnlinkable=FALSE,
+ bool mayBeHidden=FALSE,
+ QCString *pResolvedType=0);
+
+NamespaceDef *getResolvedNamespace(const char *key);
+
+FileDef *findFileDef(const FileNameDict *fnDict,const char *n,
+ bool &ambig);
+
+QCString showFileDefMatches(const FileNameDict *fnDict,const char *n);
+
+int guessSection(const char *name);
+
+inline bool isId(int c)
+{
+ return c=='_' || c>=128 || c<0 || isalnum(c);
+}
+
+QCString removeRedundantWhiteSpace(const QCString &s);
+
+QCString argListToString(ArgumentList *al,bool useCanonicalType=FALSE,bool showDefVals=TRUE);
+
+QCString tempArgListToString(ArgumentList *al);
+
+QCString generateMarker(int id);
+
+void writeExample(OutputList &ol,ExampleSDict *el);
+
+QCString stripAnonymousNamespaceScope(const QCString &s);
+
+QCString stripFromPath(const QCString &path);
+
+QCString stripFromIncludePath(const QCString &path);
+
+bool rightScopeMatch(const QCString &scope, const QCString &name);
+
+bool leftScopeMatch(const QCString &scope, const QCString &name);
+
+QCString substituteKeywords(const QCString &s,const char *title);
+
+int getPrefixIndex(const QCString &name);
+
+QCString removeAnonymousScopes(const QCString &s);
+
+QCString replaceAnonymousScopes(const QCString &s,const char *replacement=0);
+
+void initClassHierarchy(ClassSDict *cl);
+
+bool hasVisibleRoot(BaseClassList *bcl);
+
+int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level=0);
+
+QCString convertNameToFile(const char *name,bool allowDots=FALSE,bool allowUnderscore=FALSE);
+
+void extractNamespaceName(const QCString &scopeName,
+ QCString &className,QCString &namespaceName,
+ bool allowEmptyClass=FALSE);
+
+QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ);
+
+QCString stripScope(const char *name);
+
+QCString convertToHtml(const char *s,bool keepEntities=TRUE);
+
+QCString convertToXML(const char *s);
+
+QCString convertToJSString(const char *s);
+
+QCString getOverloadDocs();
+
+void addMembersToMemberGroup(/* in */ MemberList *ml,
+ /* in,out */ MemberGroupSDict **ppMemberGroupSDict,
+ /* in */ Definition *context);
+
+int extractClassNameFromType(const QCString &type,int &pos,
+ QCString &name,QCString &templSpec);
+
+QCString substituteTemplateArgumentsInString(
+ const QCString &name,
+ ArgumentList *formalArgs,
+ ArgumentList *actualArgs);
+
+ArgumentList *copyArgumentList(const ArgumentList *src);
+
+QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists);
+
+QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
+ bool parentOnly=TRUE,
+ QCString *lastScopeStripped=0);
+
+QCString resolveTypeDef(Definition *d,const QCString &name,
+ Definition **typedefContext=0);
+
+QCString mergeScopes(const QCString &leftScope,const QCString &rightScope);
+
+int getScopeFragment(const QCString &s,int p,int *l);
+
+int filterCRLF(char *buf,int len);
+
+void addRefItem(const QList<ListItemInfo> *sli,const char *prefix,
+ const char *key,
+ const char *name,const char *title,const char *args);
+
+PageDef *addRelatedPage(const char *name,const QCString &ptitle,
+ const QCString &doc,QList<SectionInfo> *anchors,
+ const char *fileName,int startLine,
+ const QList<ListItemInfo> *sli,
+ GroupDef *gd=0,
+ TagInfo *tagInfo=0
+ );
+
+QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscore=FALSE);
+
+void addGroupListToTitle(OutputList &ol,Definition *d);
+
+void filterLatexString(FTextStream &t,const char *str,
+ bool insideTabbing=FALSE,bool insidePre=FALSE,
+ bool insideItem=FALSE);
+
+QCString rtfFormatBmkStr(const char *name);
+
+QCString linkToText(const char *link,bool isFileName);
+
+QCString stripExtension(const char *fName);
+
+void replaceNamespaceAliases(QCString &scope,int i);
+
+int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item);
+
+int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,Definition *item,
+ const QCString &explicitScopePart);
+
+int computeQualifiedIndex(const QCString &name);
+
+void addDirPrefix(QCString &fileName);
+
+QCString relativePathToRoot(const char *name);
+
+void createSubDirs(QDir &d);
+
+QCString stripPath(const char *s);
+
+bool containsWord(const QCString &s,const QCString &word);
+
+bool findAndRemoveWord(QCString &s,const QCString &word);
+
+QCString stripLeadingAndTrailingEmptyLines(const QCString &s);
+
+//void stringToSearchIndex(const QCString &docUrlBase,const QCString &title,
+// const QCString &str, bool priority=FALSE,
+// const QCString &anchor="");
+
+bool updateLanguageMapping(const QCString &extension,const QCString &parser);
+SrcLangExt getLanguageFromFileName(const QCString fileName);
+void initDefaultExtensionMapping();
+
+bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n);
+
+ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,
+ MemberDef **pMemType=0,QCString *pTemplSpec=0,
+ QCString *pResolvedType=0,
+ ArgumentList *actTemplParams=0);
+
+QCString parseCommentAsText(const Definition *scope,const MemberDef *member,const QCString &doc,const QCString &fileName,int lineNr);
+
+QCString transcodeCharacterStringToUTF8(const QCString &input);
+
+QCString recodeString(const QCString &str,const char *fromEncoding,const char *toEncoding);
+
+QCString extractAliasArgs(const QCString &args,int pos);
+
+int countAliasArguments(const QCString argList);
+
+QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList);
+
+QCString resolveAliasCmd(const QCString aliasCmd);
+QCString expandAlias(const QCString &aliasName,const QCString &aliasValue);
+
+void writeTypeConstraints(OutputList &ol,Definition *d,ArgumentList *al);
+
+QCString convertCharEntitiesToUTF8(const QCString &s);
+
+bool usingTreeIndex();
+void stackTrace();
+
+bool readInputFile(const char *fileName,BufStr &inBuf);
+QCString filterTitle(const QCString &title);
+
+bool patternMatch(const QFileInfo &fi,const QStrList *patList);
+
+void writeSummaryLink(OutputList &ol,const char *label,const char *title,
+ bool &first);
+
+QCString externalLinkTarget();
+QCString externalRef(const QCString &relPath,const QCString &ref,bool href);
+int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos);
+
+struct ColoredImgDataItem
+{
+ const char *name;
+ unsigned short width;
+ unsigned short height;
+ unsigned char *content;
+ unsigned char *alpha;
+};
+
+void writeColoredImgData(const char *dir,ColoredImgDataItem data[]);
+QCString replaceColorMarkers(const char *str);
+
+#endif
+
diff --git a/src/version.cpp b/src/version.cpp
new file mode 100644
index 0000000..4725262
--- /dev/null
+++ b/src/version.cpp
@@ -0,0 +1 @@
+char versionString[]="1.7.4";
diff --git a/src/version.h b/src/version.h
new file mode 100644
index 0000000..6cd96ed
--- /dev/null
+++ b/src/version.h
@@ -0,0 +1,23 @@
+/******************************************************************************
+ *
+ * $Id: version.h,v 1.4 2001/03/19 19:27:42 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef VERSION_H
+#define VERSION_H
+
+extern char versionString[];
+
+#endif
diff --git a/src/vhdlcode.cpp b/src/vhdlcode.cpp
new file mode 100644
index 0000000..4ce0c1b
--- /dev/null
+++ b/src/vhdlcode.cpp
@@ -0,0 +1,11274 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer vhdlcodeYY_create_buffer
+#define yy_delete_buffer vhdlcodeYY_delete_buffer
+#define yy_flex_debug vhdlcodeYY_flex_debug
+#define yy_init_buffer vhdlcodeYY_init_buffer
+#define yy_flush_buffer vhdlcodeYY_flush_buffer
+#define yy_load_buffer_state vhdlcodeYY_load_buffer_state
+#define yy_switch_to_buffer vhdlcodeYY_switch_to_buffer
+#define yyin vhdlcodeYYin
+#define yyleng vhdlcodeYYleng
+#define yylex vhdlcodeYYlex
+#define yylineno vhdlcodeYYlineno
+#define yyout vhdlcodeYYout
+#define yyrestart vhdlcodeYYrestart
+#define yytext vhdlcodeYYtext
+#define yywrap vhdlcodeYYwrap
+#define yyalloc vhdlcodeYYalloc
+#define yyrealloc vhdlcodeYYrealloc
+#define yyfree vhdlcodeYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE vhdlcodeYYrestart(vhdlcodeYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t vhdlcodeYYleng;
+
+extern FILE *vhdlcodeYYin, *vhdlcodeYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up vhdlcodeYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up vhdlcodeYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via vhdlcodeYYrestart()), so that the user can continue scanning by
+ * just pointing vhdlcodeYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when vhdlcodeYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t vhdlcodeYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow vhdlcodeYYwrap()'s to do buffer switches
+ * instead of setting up a fresh vhdlcodeYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void vhdlcodeYYrestart (FILE *input_file );
+void vhdlcodeYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE vhdlcodeYY_create_buffer (FILE *file,int size );
+void vhdlcodeYY_delete_buffer (YY_BUFFER_STATE b );
+void vhdlcodeYY_flush_buffer (YY_BUFFER_STATE b );
+void vhdlcodeYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void vhdlcodeYYpop_buffer_state (void );
+
+static void vhdlcodeYYensure_buffer_stack (void );
+static void vhdlcodeYY_load_buffer_state (void );
+static void vhdlcodeYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER vhdlcodeYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE vhdlcodeYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE vhdlcodeYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE vhdlcodeYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *vhdlcodeYYalloc (yy_size_t );
+void *vhdlcodeYYrealloc (void *,yy_size_t );
+void vhdlcodeYYfree (void * );
+
+#define yy_new_buffer vhdlcodeYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ vhdlcodeYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ vhdlcodeYY_create_buffer(vhdlcodeYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ vhdlcodeYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ vhdlcodeYY_create_buffer(vhdlcodeYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define vhdlcodeYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *vhdlcodeYYin = (FILE *) 0, *vhdlcodeYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int vhdlcodeYYlineno;
+
+int vhdlcodeYYlineno = 1;
+
+extern char *vhdlcodeYYtext;
+#define yytext_ptr vhdlcodeYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up vhdlcodeYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ vhdlcodeYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 55
+#define YY_END_OF_BUFFER 56
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_accept[2913] =
+ { 0,
+ 0, 0, 0, 0, 13, 13, 0, 0, 21, 21,
+ 31, 31, 28, 28, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3, 3, 0, 0, 56, 1, 1, 51,
+ 1, 52, 52, 51, 52, 52, 48, 52, 52, 48,
+ 48, 49, 48, 48, 48, 49, 48, 45, 49, 48,
+ 48, 48, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 48, 44, 48, 48, 52, 52,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 52, 13, 8, 52, 14, 13, 15, 16, 52,
+ 14, 14, 14, 14, 13, 14, 52, 52, 52, 6,
+
+ 21, 22, 21, 52, 21, 18, 19, 20, 23, 26,
+ 26, 26, 31, 31, 31, 31, 28, 28, 28, 29,
+ 30, 28, 17, 3, 3, 4, 2, 5, 4, 0,
+ 0, 0, 0, 54, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 0, 0, 0, 50, 0, 0, 0, 44, 44,
+ 48, 0, 0, 0, 0, 45, 45, 45, 48, 48,
+ 48, 0, 0, 0, 44, 0, 44, 44, 44, 44,
+ 44, 44, 44, 44, 43, 43, 43, 44, 44, 44,
+ 44, 44, 44, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 0, 0, 13, 0, 13, 0, 0, 0,
+ 0, 0, 7, 14, 14, 13, 9, 14, 14, 14,
+ 14, 13, 0, 14, 6, 21, 21, 20, 0, 0,
+ 0, 27, 0, 23, 23, 26, 26, 26, 31, 31,
+ 31, 31, 31, 31, 28, 28, 28, 28, 28, 28,
+ 17, 3, 3, 53, 54, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 50, 0, 0, 0, 0, 44, 44,
+
+ 0, 45, 45, 0, 0, 0, 0, 44, 44, 44,
+ 43, 44, 43, 44, 44, 44, 43, 44, 44, 44,
+ 44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 0, 0, 0, 0, 7, 14, 9, 14, 14,
+ 14, 0, 14, 0, 0, 23, 23, 26, 26, 31,
+ 31, 28, 28, 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,
+
+ 44, 0, 0, 0, 0, 0, 0, 0, 44, 43,
+ 43, 0, 0, 44, 44, 43, 43, 44, 44, 44,
+ 44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 39, 39, 44, 0, 0, 0, 0, 14, 14, 0,
+ 0, 14, 0, 14, 0, 0, 26, 26, 31, 28,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 44, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 43, 0, 0, 43, 44, 0, 0,
+ 44, 43, 44, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 47, 0, 44, 44,
+ 38, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 0, 0, 0, 0, 44, 0, 10, 0, 0, 0,
+ 0, 0, 10, 0, 0, 0, 0, 12, 0, 0,
+ 26, 0, 24, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 0,
+ 0, 0, 0, 0, 0, 44, 44, 0, 0, 43,
+ 44, 0, 0, 0, 38, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 44, 44, 38, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 0, 0, 0,
+ 0, 44, 0, 0, 0, 0, 0, 7, 0, 0,
+ 0, 0, 0, 0, 0, 12, 12, 0, 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, 44,
+
+ 0, 0, 0, 0, 0, 44, 44, 0, 0, 44,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 47, 0, 0, 44, 44, 44, 44, 42, 42, 44,
+ 44, 44, 44, 44, 0, 0, 0, 0, 0, 0,
+ 44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 0, 0, 0, 0, 0, 11, 0, 0,
+ 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, 44,
+ 0, 0, 0, 0, 0, 43, 0, 0, 44, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 47, 0, 44,
+ 44, 44, 44, 44, 39, 39, 42, 44, 0, 0,
+ 0, 0, 0, 0, 44, 0, 0, 0, 0, 11,
+ 0, 0, 0, 11, 0, 0, 0, 0, 25, 36,
+ 36, 36, 0, 36, 36, 36, 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, 36, 36, 36, 36, 36,
+ 36, 0, 36, 0, 0, 0, 32, 0, 0, 0,
+ 0, 0, 47, 0, 0, 0, 44, 44, 44, 0,
+
+ 0, 0, 44, 42, 42, 0, 44, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 11, 0, 0, 0,
+ 11, 0, 11, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 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, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 0, 0, 0, 47, 0, 0, 0, 44, 0, 0,
+ 0, 0, 0, 0, 41, 0, 0, 44, 0, 0,
+
+ 0, 0, 46, 0, 0, 46, 0, 0, 11, 0,
+ 11, 0, 0, 36, 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, 36, 36, 36, 36, 37,
+ 37, 0, 0, 44, 33, 33, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 46, 0, 0, 46, 46,
+
+ 46, 46, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 44, 33, 33, 0, 0,
+ 0, 0, 0, 0, 46, 46, 46, 46, 46, 46,
+ 46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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, 35, 46, 0, 46, 0, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 0, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 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,
+ 35, 0, 0, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 0, 0, 11, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32, 0, 0, 0, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 40, 40, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32, 0,
+ 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+ 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+ 40, 40, 40, 40, 40, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32, 0,
+
+ 0, 0, 32, 32, 0, 0, 0, 0, 0, 0,
+ 32, 0, 0, 0, 0, 34, 34, 40, 40, 40,
+ 40, 40, 40, 40, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,
+ 0, 0, 0, 32, 0, 0, 0, 0, 0, 32,
+ 34, 34, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 46, 46,
+
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 0, 0, 0, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 0, 0,
+ 0, 0, 32, 0, 0, 0, 32, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 32, 46, 46, 46, 32, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 0, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 0, 40,
+
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 32, 46, 46, 32, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 0, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 0, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 0, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+
+ 46, 46, 46, 46, 46, 46, 46, 32, 46, 46,
+ 46, 46, 46, 46, 46, 32, 46, 46, 46, 46,
+ 32, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 32, 0, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 32, 46, 46,
+
+ 46, 32, 32, 46, 46, 46, 46, 46, 46, 32,
+ 46, 46, 46, 46, 47, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 32, 40, 40, 40, 32,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 32, 46, 46, 32, 46, 46, 46, 46, 32,
+
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 46,
+ 46, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 32, 40, 40, 32,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 46, 46, 32, 46, 46, 32,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 32, 40, 40, 40, 40, 40,
+ 40, 40, 32, 40, 40, 40, 40, 32, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 32, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 32, 40, 40, 40,
+ 32, 32, 40, 40, 40, 40, 40, 40, 32, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 32, 40, 40, 32, 40, 40,
+
+ 40, 40, 32, 40, 40, 40, 40, 32, 40, 40,
+ 32, 0
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 20, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 22, 23, 24,
+ 25, 26, 1, 1, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
+ 36, 43, 44, 45, 46, 47, 48, 36, 49, 36,
+ 1, 1, 1, 50, 51, 1, 52, 53, 54, 55,
+
+ 56, 57, 58, 59, 60, 36, 61, 62, 63, 64,
+ 65, 66, 36, 67, 68, 69, 70, 71, 72, 36,
+ 73, 36, 1, 74, 1, 75, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[76] =
+ { 0,
+ 1, 2, 3, 4, 5, 1, 6, 7, 1, 1,
+ 8, 8, 9, 10, 11, 12, 13, 14, 15, 11,
+ 16, 17, 18, 11, 11, 11, 19, 19, 19, 19,
+ 20, 19, 21, 22, 22, 22, 22, 22, 22, 22,
+ 22, 21, 22, 22, 22, 22, 22, 22, 22, 1,
+ 19, 19, 19, 19, 19, 20, 19, 21, 22, 22,
+ 22, 22, 22, 22, 22, 21, 22, 22, 22, 22,
+ 22, 22, 22, 1, 1
+ } ;
+
+static yyconst flex_int16_t yy_base[3046] =
+ { 0,
+ 0, 4, 22, 96, 167, 98, 242, 317, 392, 0,
+ 113, 267, 142, 273, 102, 277, 291, 295, 342, 346,
+ 467, 542, 352, 369, 492, 496, 864,31091, 104, 112,
+ 838, 66, 616, 567, 572, 681, 246, 747, 71, 471,
+ 507, 91, 556, 561, 562, 638, 566, 821, 570, 582,
+ 604, 625, 886, 911, 473, 464, 240, 622, 665, 462,
+ 623, 604, 625, 318, 630, 651, 670, 97, 977, 517,
+ 668, 90, 735, 734, 739, 751, 792, 795, 463, 663,
+ 736, 98, 1048, 1122, 297, 1178, 319, 322, 325, 328,
+ 332, 0, 237, 477, 714, 478,31091, 371, 836, 0,
+
+ 944, 592, 954, 829, 828,31091,31091, 809, 0, 0,
+ 557, 243, 0, 597, 657, 796, 0, 659, 722,31091,
+ 31091, 792, 0, 0, 723, 766,31091,31091,31091, 810,
+ 773, 829, 755, 0, 609, 877, 918, 668, 936, 961,
+ 1252, 1277, 960, 1083, 1087, 1109, 679, 1203, 733, 1208,
+ 31091, 739, 966, 1073, 1078, 1333, 1244, 1408, 0, 740,
+ 31091, 1153, 1159, 1310, 735, 730, 1482, 91,31091, 695,
+ 690, 1213, 1228, 1238, 1538, 1563, 1628, 764, 827, 962,
+ 570, 1063, 1065, 944, 642, 670, 734, 1095, 876, 1242,
+ 1260, 976, 1244, 1683, 1356, 1320, 829, 1263, 1317, 1168,
+
+ 1072, 1339, 1393, 1234, 1318, 1340, 1430, 1438, 1415, 1392,
+ 1414, 1425, 1461, 1398, 872, 1464, 1323, 1463, 1341, 1466,
+ 836, 1516, 753, 853, 1754, 1828, 886, 1079, 805, 1497,
+ 1449, 650, 0, 1884, 1959, 1188, 0, 0, 910, 1233,
+ 921, 1521, 1275, 1335, 0, 1568, 1513, 626, 1344, 949,
+ 632,31091, 623, 603, 575, 0, 1044, 1050, 0, 1573,
+ 575, 1579, 571, 1454, 0, 1585, 566, 1591, 564, 1,
+ 0, 0, 1593, 0, 0, 1361, 1558, 1634, 1658, 1494,
+ 1585, 1557, 1614, 1669, 1789, 1784, 1663, 1984, 1988, 1779,
+ 1813, 1864, 2023,31091, 1796, 1869, 1615, 2087, 0, 1409,
+
+ 1915, 571, 570, 1993, 2076, 2069, 2111, 2177, 2228, 1496,
+ 2027, 1662, 1513, 1551, 1666, 1647, 1571, 1778, 1650, 1685,
+ 1882, 2107, 1885, 2008, 1893, 2012, 2077, 1890, 1827, 1896,
+ 2071, 1989, 1993, 2089, 1584, 2108, 2026, 2110, 1897, 2134,
+ 2142, 2152, 2160, 2178, 1804, 2182, 2209, 2206, 1652, 2264,
+ 2225, 1765, 1415, 1484, 1766,31091, 2320, 0, 1782, 8,
+ 1806, 1854, 1880, 1540, 1747, 530, 516, 2030, 1812, 2047,
+ 2146, 931, 1156, 0, 2090, 1888, 2129, 2227, 2226, 2285,
+ 2351, 2355, 2360, 2364, 2383, 2228, 2446, 2341, 505, 2423,
+ 2428, 2440, 497, 2450, 2515, 2521, 2427, 2495, 2306, 2587,
+
+ 2165, 2609, 2615, 2540, 2622, 2563, 2641, 2626, 2262, 2186,
+ 2208, 2647, 2673, 2246, 2350, 2245, 2247, 2547, 2428, 2248,
+ 2381, 2359, 2662, 2591, 2441, 2465, 2443, 2524, 2382, 2623,
+ 2663, 2449, 2482, 2641, 2261, 2699, 2677, 2685, 2691, 2692,
+ 2694, 2697, 2698, 2707, 2709, 2731, 2320, 2733, 2348, 2516,
+ 2766, 2770, 2750, 2805, 2530, 2547, 2809, 2832, 2857, 2861,
+ 2865, 1163, 2580, 1954, 2597, 2078, 2100, 2814, 2202, 1729,
+ 2604, 2233, 2748, 2869, 2675, 2873, 1940, 2881, 2886, 2906,
+ 2927, 2931, 2963, 2920, 2917, 0, 0, 2985, 2994, 3002,
+ 2678, 2307, 3019, 3024, 3042, 2726, 2357, 2763, 2998, 3016,
+
+ 3007, 2769, 2747, 3064, 3075, 3094, 3098, 3120, 3101, 3144,
+ 3167, 3171, 3052, 2861, 2396, 3068, 2865, 3127, 2952, 3189,
+ 2961, 2867, 2870, 3076, 2978, 3053, 3157, 3159, 3150, 3151,
+ 3171, 3174, 3191, 2871, 3198, 3186, 2882, 3210, 3200, 3218,
+ 3124, 3208, 3224, 3226, 3230, 3083, 3227, 3237, 3232, 3242,
+ 2491, 2522, 3298, 3302, 3281, 3312,31091, 1318, 1322, 3323,
+ 3327, 3384, 467, 2562, 3458, 3349, 2647, 385, 2838, 3365,
+ 2942, 3409,31091, 2975, 3033, 3287, 3292, 3413, 3425, 3421,
+ 3434, 3451, 3476, 3459, 3408, 3501, 3524, 3528, 3535, 3545,
+ 3552, 3556, 2993, 2996, 3577, 3594, 3602, 3611, 3621, 3631,
+
+ 3653, 3051, 3061, 3316, 3610, 3617, 3288, 3441, 3077, 3688,
+ 3696, 3700, 3675, 3112, 3718, 3388, 3611, 3151, 3722, 3167,
+ 3466, 3222, 3697, 3715, 3282, 3544, 3415, 3513, 3653, 3629,
+ 3714, 3720, 3717, 3736, 3729, 3265, 3520, 3791, 3309, 3750,
+ 3795, 3721, 3663, 3389, 3772, 3446, 3451, 3768, 3139, 3807,
+ 3817, 3792, 3832, 3855, 3861, 3871, 3940, 3877, 4002, 3481,
+ 3536, 3581, 3533, 3650, 3670, 375,31091, 3745, 3762, 3690,
+ 3784, 3796, 3841, 3886, 3902, 3917, 3929, 3948, 3929, 3985,
+ 4029, 4035, 4053, 4060, 4064, 3793, 3720, 4084, 4088, 4092,
+ 4109, 4114, 3812, 3772, 4041, 3811, 4087, 3923, 3869, 3848,
+
+ 3952, 4159, 4110, 3873, 4167, 3872, 4177, 3859, 4181, 4005,
+ 4091, 3880, 4095, 3883, 3928, 4189, 4093, 4156, 3930, 4168,
+ 3934, 3945, 4157, 4144, 4166, 4170, 4171, 4239, 4246, 4199,
+ 4254, 4262, 3992, 4014, 3980, 4018, 4068, 4267, 4272, 4276,
+ 4099, 4297, 4303, 4311, 4319, 4335, 4343, 4347, 4369, 4352,
+ 4392, 4377, 4426, 4102, 4091, 4099, 4164,31091, 4166, 4208,
+ 4407, 4448, 4192, 4452, 4460, 4402, 4464, 4477, 4485, 4502,
+ 4469, 4519, 4526, 4535, 4544, 4552, 4230, 4494, 4561, 4569,
+ 4578, 4587, 4245, 4595, 4578, 4579, 4636, 4416, 4653, 4611,
+ 4648, 4669, 4635, 4261, 4686, 4272, 4693, 4707, 4719, 4332,
+
+ 4636, 4304, 4669, 4494, 4731, 4741, 4579, 4334, 4346, 4685,
+ 4360, 4695, 4390, 4796, 4754, 4763, 4791, 4391, 4254, 4450,
+ 4298, 4786, 4802, 4826, 4571, 4830, 4660, 4837, 4852, 4779,
+ 4862, 4373, 4463,31091, 4511, 4467, 4874, 4886,31091, 4775,
+ 4904, 4908, 4563, 4920, 4926, 4930, 4941, 4953, 4957, 4962,
+ 4803, 4974, 4984, 4991, 4996, 5016, 5057, 5067, 5062, 5084,
+ 4541, 5108, 5132, 5136, 5140, 5157, 5182, 5186, 4543, 5205,
+ 5179, 4939, 5221, 5231, 5248, 5161, 5041, 5273, 5289, 5225,
+ 5296, 5267, 5317, 4579, 5321, 5254,31091, 5329, 5334, 4827,
+ 4628, 4959, 4629, 5388, 4696, 4730, 5022, 4717, 5365, 5350,
+
+ 5359, 5413, 5434, 5420, 5429, 5459, 5523, 4635, 4716, 4666,
+ 5465, 5397, 5473, 4798, 5486, 5481, 5382, 5530, 5494, 4808,
+ 31091, 4688,31091, 5554, 5560, 97, 5566, 5572, 5578, 5585,
+ 5590, 5597, 5611, 5618, 5623, 5627, 5644, 5650, 5609, 4822,
+ 5637, 5669, 5702, 5709, 5728, 4844, 4866, 5732, 5737, 5754,
+ 5763, 4865, 5729, 5711, 5789, 5799, 5806, 5810, 5856, 5042,
+ 5877, 5897, 5903, 5923, 5929, 5831, 5881, 355, 5944, 5970,
+ 2215, 5994, 6001, 6007, 6013, 6019, 6036, 6040, 6057, 6061,
+ 4779, 6081, 5100, 4870, 6085, 6148, 6173, 5060, 6105, 6110,
+ 6117, 6198, 6132, 6223,31091, 6227, 6239, 6260, 4805, 6182,
+
+ 4884, 4835, 0, 6252, 6266, 6336, 4876, 6295, 6287, 6361,
+ 6291, 4908, 4956, 366, 6300, 6367, 6371, 6375, 6397, 6416,
+ 4954, 5063, 6442, 6448, 5317, 6465, 4908, 5139, 6422, 6483,
+ 6491, 6514, 6525, 6532, 5212, 4969, 6536, 6557, 6582, 6601,
+ 6605, 6623, 5441, 6627, 5804, 6670, 6674, 6692, 296, 5020,
+ 5653, 6696, 6715, 5021, 293, 5066, 5789, 5811, 5273, 0,
+ 6741, 6719, 6761, 6784, 6447, 292, 5070, 5911, 6788, 6806,
+ 5511, 6810, 6829, 6856, 6875, 6392, 6879, 6897, 6944,31091,
+ 6541, 5541, 7009, 5093, 0, 7034, 6321, 6609, 6648, 6921,
+ 7059, 5102, 6948, 4972, 4990, 0, 6956, 6963, 6833, 7085,
+
+ 0, 7160, 5116, 6977, 6971, 5041, 5039, 6901, 7234, 7238,
+ 7242, 7259, 5121, 5937, 5857, 5717, 7264, 5124, 6015, 6036,
+ 5873, 6765, 7285, 6986, 7308, 7329, 7042, 7110, 7336, 7355,
+ 6396, 7366, 6037, 6115, 5162, 5181, 7373, 6041, 6526, 5209,
+ 5272, 7383, 7393, 5251, 5219, 7400, 6593, 6659, 5252, 5247,
+ 7441, 7451, 7473, 7468, 7538, 6204, 0, 7593, 5325, 7115,
+ 5434, 5319, 7545, 7460, 0, 7619, 7122, 7694, 7659, 7719,
+ 7723, 5413, 7576, 7663, 5516, 5578, 7517, 6740, 6952, 5587,
+ 6165, 6789, 7090, 5609, 6446, 7139,31091, 7753, 7787, 7145,
+ 7127, 7794, 7813, 7830, 7409, 7819, 7246, 7836, 7862, 7879,
+
+ 7493, 7896, 7287, 7906, 7913, 7947, 7964, 7981, 7998, 8016,
+ 5625, 6635, 5514, 5568, 8033, 8065, 8075, 8082, 8092, 8124,
+ 8134, 5645, 7305, 7227, 7601, 8160, 8182, 5597, 5648, 8192,
+ 8202, 8228, 8234, 8251, 8270, 8277, 5665, 7458, 5660, 5676,
+ 8318, 8311, 8328, 8360, 8425, 7569, 7954, 7065, 7580, 7988,
+ 0, 8450, 0, 5680, 8476, 8099, 8402, 5710, 5742, 8501,
+ 8566, 8506, 288, 8571, 8576, 6807, 286, 8583, 8588, 8653,
+ 8718, 8648, 5755, 7417, 7651, 7151,31091, 8394, 5666, 7499,
+ 7616, 8057, 5714, 7520, 7703, 8167, 8406, 8510, 7984, 8658,
+ 8726, 8736, 8783, 8793, 7718, 8801, 5749, 5771, 8810, 8851,
+
+ 8868, 7876, 8875, 6109, 8885, 8937, 8894, 8956, 8963, 5769,
+ 5781, 9006, 9013, 9040, 9047, 9081, 7898, 9064, 5822, 5824,
+ 9088, 9130, 9140, 9147, 9199, 7931, 7676, 9264, 7778, 0,
+ 9289, 5836, 8730, 9314, 9379, 9444, 5988, 5872, 8918, 9222,
+ 9509, 9574, 5928, 5879, 8260, 5929, 5917, 5957, 5990, 8336,
+ 5969, 5992, 9319, 9216, 9336, 286, 7854, 8302, 8343, 9324,
+ 8087, 9355, 6876, 9397, 9401, 9422, 8089, 9466, 7288, 9486,
+ 9551, 9639, 9528, 9157, 9555, 8385, 9621, 9633, 9656, 8418,
+ 9704, 9708, 9725, 9751, 9731, 7716, 9783, 9800, 9775, 8122,
+ 6032, 8458, 9849, 9832, 8186, 9867, 9884, 9890, 6468, 8386,
+
+ 9932, 9936, 9954, 9031, 9958, 6061, 9114,10001,10027,10033,
+ 10045, 8485,10077,10103, 9330, 8500, 6075, 9532,10120,10126,
+ 10146, 9681,10168,10172, 8759, 7799, 8817,10191,10255, 6082,
+ 10213, 6082, 6124, 6155,10264,10281, 6093, 6095, 8665,10298,
+ 10303, 8670, 6119, 6205, 6213, 6244, 8694,10339,10349, 8979,
+ 6267, 6266,10371,10375,10414, 6204, 8983, 8989, 9226, 8498,
+ 10381,10446,10450, 6769, 8505, 8567,10458,10469, 9857, 6900,
+ 8583,10515,10534,10551,10556, 7711, 6254, 8584, 6326, 6346,
+ 9979, 6361,10583,10603, 8417, 9596, 6417,10625,10629,10635,
+ 6356,10023,10671,10703,10707,10713, 8506, 7243, 6372,10248,
+
+ 10754,10786,10790, 6516, 8805, 6397, 9909, 6501, 6541, 6510,
+ 10795,10812, 6565, 6523, 9825,10832, 9256, 6589, 6525, 6627,
+ 6533,10053,10857, 9477, 6653, 6570,10874,10886,10905, 6641,
+ 8509, 6678, 8654, 9645, 7722, 8649, 8719,10241, 7820,10944,
+ 10961,10971,11012,11030,11044,11062,11053, 6645, 7932,11095,
+ 6702, 6671,11119,11129,11136,11178,11201,11162,11219,11235,
+ 11252,11267, 6722,11284,11301,11311,11352,11370,11384,11402,
+ 11393,11435, 6793,10979, 8209, 8041, 9298, 0,11500, 6695,
+ 6811, 6802,11525,10967, 6824, 8294,10526, 9714, 6842, 9072,
+ 6873, 9105,10800,11141, 6926, 9374,11529,11534,11568, 7040,
+
+ 11598, 7040, 8326,11603,11607, 8659,11638,11615,11662,11680,
+ 11684,11703,11749, 9504,11761,11776,11783,10881, 6832,10286,
+ 9578,11817,11795,11827,11861,11334, 6882, 9808,11884,11896,
+ 10490, 6953,10560,11918,11928,11954,11977,11995,12000,12042,
+ 12060,11260,11244,12077,12083,10538, 6961,10237,11211,11460,
+ 0,11358,12149, 0,12224, 6970, 7208,10608,12298,12065,
+ 12302,12367, 6972,12320,12371,12143,11970,12310, 6980,11482,
+ 7013,12389,12436,12440,12346,12414, 7016,11695,12482,12462,
+ 12546,12621,12696, 7259,10730,12770,12774,12786,12458,12792,
+ 12851,12857,11902,12874,12869,12934,12999,10867,31091,12941,
+
+ 12953,12528, 7290,31091,10922,12976,13064,13018,13041,11379,
+ 7293,13083,13076,13141,13206, 0,13271, 0,13297,11470,
+ 13372,13158,13164,13228, 7217, 7299,13327,13397,13463,13223,
+ 7328,13402, 7335, 7340,12522,11852, 7380, 7434, 7438, 7464,
+ 12573,12004, 7471,13488,13496, 0, 0,13551,13556,13563,
+ 13574,13568,13640,13666,13689,13684, 7473,11623,13725,13757,
+ 12604,13761,13783,12985,13803,13826,13830,13849,13872,13853,
+ 13876,13895,13899,13918,13941,13945,13964,13968,13987,13991,
+ 0,14056,13406, 7352, 7388,14037,14102,14081, 256,14107,
+ 14124, 7618, 255,14159,14176,14241,14306,14167, 7501, 7509,
+
+ 14235,14246,14314,14326,14346,14088, 7602, 7545, 9399, 7604,
+ 14224,10694, 7696,13153,14391,14395,10897, 7764,10948, 7802,
+ 13331,14413,14417,10953,14033,14202,14460,14464,14482, 143,
+ 14486,14505,14531,14551,14557, 141,14563,14583,14628,14609,
+ 14632,14651,14655,14697,14701, 8317, 101, 7794, 7848,14720,
+ 14724,14742,14746,14789,14793,14834, 7872,14900,14965,15030,
+ 15095,15160, 8716, 7858,14814,14878,15225,15290, 7891, 7912,
+ 12109, 7956, 7963, 7977, 8000,12175, 7996, 8049,14918,14959,
+ 14990,11036, 8047,15024,15035,15076,15102,15167,15202,15179,
+ 14882, 8091, 8070, 8119, 8134,11801,14860,12184,13240,13233,
+
+ 12200,12306,13422,15127,15245,15267,15309,15335, 8172, 8178,
+ 15356,15367,15361,15379,15436,15446,15456, 8210, 8206,15488,
+ 8219, 8244, 8246, 8293,15515,15532,15538,15558, 8309,15584,
+ 15108,15605,15610,15627,15631,15654,15676, 8325, 8295, 8365,
+ 15696,15701, 8375, 8475,12505,15736,15743,12595, 8482, 8482,
+ 8513, 8540,12646,15762,15779,12654, 8579, 8651,15769,15787,
+ 15828, 8495,15846,15850,15867,15873, 8673, 8684, 8572, 8697,
+ 12590, 0,15917,15943,13087, 0,15949,15961,15984,12663,
+ 12863,12671,16018,16030,16036,12945,13922,16050,16095,16105,
+ 16115,16122,16127,16172,16192,16198, 8713, 8750,16224,16242,
+
+ 16268,16274,16291,16309,16350,16360,16367,16386,16409,16443,
+ 8778, 8807,16453,16475,16487,16519,16545,16555, 8714, 8816,
+ 8841, 8840,16577,16589,16621,16647, 8849, 8854, 8713, 8859,
+ 14926,16664, 8807, 8863,13808,14336,13198, 8844, 8868, 8898,
+ 8900,14013,14509,13336, 8915, 8908,16668,16673,16712, 8915,
+ 16732,16742,16749,16768, 8976, 8956, 8961,11153,13439,14184,
+ 16791,16825,16835,16846,16857,16904,16915,16922, 8982, 9012,
+ 16926,16972,16991,16998,17041,17058,17048,17092,17118,17135,
+ 17141, 9032, 9056,17161,17167,17193,17210,17236, 9059,11908,
+ 9066, 9059,17242,17253,17294,17320,17330,17337, 9085, 9100,
+
+ 9108, 9108,17363,17259, 9124,11186,15966,14318, 9125,11490,
+ 9128,11494,16147,14371, 9140,11591,17405,17409,17439, 9144,
+ 17444,17449,17471,17514,17518,17536, 9142,13414, 9152,17540,
+ 17583,17587,17605,17652,13506,17656,17673,14114,17496,17679,
+ 17699,17722,17744,17765,17788,17814,17831,17857, 9168,13633,
+ 17883,17863,17915,17941,17951,17958,18008,18025,18030,18042,
+ 18099,18109,18116, 9179,13672,18121,18186,18190,18197, 9179,
+ 18231,18257,18274, 9223, 9263,14438,18300,18306,18323,18349,
+ 18372,18390, 9267, 9221, 9279,11688,18416,18450,18457,18522,
+ 9221,18499,18540,18544,15071,15000, 9250,14766, 9327,18566,
+
+ 18609,18589,15285,16418, 9331,14948,18631,18635,18702,18777,
+ 18852,11707,18926,18930,18937,18948,19005,19015, 9354,19022,
+ 19072,19089, 9366, 9370,19115,19121,19156,19173,19191, 9371,
+ 19214,19225, 9382,15413, 9402,19257,19274,19292,19315,19326,
+ 19349,19367,19372, 9396,15468,19393,19437,19442,19459, 9422,
+ 9289, 9423,16008,19486,19463,19469, 9439, 9388, 9429,19528,
+ 19545,19611,18142, 9466,19553, 9472, 9493,15719,14574, 9494,
+ 9512, 9518, 9535,16495,16062, 9556,19636,19644, 0, 0,
+ 19699,19704,19711,19722,19716,19788,19814,19837,19832,19873,
+ 9577,19883,19915,19919, 9577, 9581,11768, 9450,19941,19961,
+
+ 19987,19993,20010,20036,20062, 9508,20079,20144, 9591, 9611,
+ 20137,20148,20189,20171,20215,20280,20238,20257,20345, 9626,
+ 20322,20357,20367,20379,20389,20436,16334,14211, 9628,20454,
+ 20519, 9623, 9623, 9638,20472,20477,20523,20545,20564,18696,
+ 9640, 9659, 9757, 9673,19534,12027, 9679,16300,20605,20615,
+ 12134, 9681,12212, 9709,16326,20622,20672,12216,20104,20689,
+ 20694,20698,20721, 93,20744,20763,20780,20790,20812, 2,
+ 20831,20863,20880,20890,20897,20947,20957,20967,20979, 9866,
+ 1, 9707, 9730,21014,21024,21036,21056,21101,21105,21122,
+ 21172, 9766,21128,21237,16479, 9782,16250,21194,21214,21271,
+
+ 21264,21281,12834,21346,21323,21340,21358,21381,16565,13024,
+ 21392,21415,21427,21449,21461,21484,21549,21507,21526,21530,
+ 0,16947,21575,21595,21618,21641,21553,21660,21664,21149,
+ 17015,21683,21687,21706, 0, 9800,12446, 9799,21710,21729,
+ 21733,21752,21756,21798,21802,19909, 9709, 9814, 9833, 9860,
+ 13354,21821,14676,17219,17610,15112,15173,17302,18482,21868,
+ 21825,21876,21902, 9763, 9863,21908,21944,21949,21991,21985,
+ 21995,22037, 9887, 9903,22060, 9912, 9912, 9914, 9923,22072,
+ 22082,22104,22139,15580,22207,22161,22173,22219,16776,22241,
+ 22253,22276,22298,22318,22344,22409,15924, 0,22386,22390,
+
+ 22413,22363, 0,16204,22431,22496,22478,22500,22522, 0,
+ 22545,22565,22591,22656,31091, 9951,22635,22661,22678,22713,
+ 9931, 9934, 9958, 9952,16523, 0,22735,22747,17066, 0,
+ 22770,22782,22804,16217,16800,16867,22816,22839,22851,16612,
+ 17630,22873,22883,22917,22928,22940,22960,23005,23009,23027,
+ 9969, 9972,23031,23050,23076,23096,23102,23108,23167,23173,
+ 23177,23199,23243,23248, 9982,10001,23265,23292,23324,23334,
+ 23341,23360,10021,10027,10033,10031,23401,23406,23411,23458,
+ 16882,23477,23481,23499,23546,23550,23567,23572,23616,23637,
+ 23643,23660,23686,23703,23709,23720,23730,23752,23787,23799,
+
+ 10035,23804,23809,23869,23880,10057,10057,10072,12540,17024,
+ 17769,23886,23916,23890,23957,23961,23993,24004,24036,10061,
+ 10087,24040,24063,24082,24108,24114,24134,24140,24160,24183,
+ 24209,24226,10081,10088,24230,24252,24295,24301,24321,10091,
+ 17341,10096,10118,24327,24344,24371,24393,24415,24437,24502,
+ 24567,10127,24459,24544,24561,24587,24610,24633,10139,17561,
+ 10148,24653,24675,24679,24702,24721,17837,24744,24748,17908,
+ 21600,24725,24770,24790,24822,24839,24874,24891,24917,24940,
+ 10160,17932,24958,24992,25018,24999,25041,25064,25083,25087,
+ 25129,25152,25163,25170,25220,10164,17962,25237,25241,25263,
+
+ 25307,10163,25312,25329,24796,10173,10194,18090,25339,25380,
+ 25398,25421,25447,25464,25470,25491,25535,25541,25558,25562,
+ 12578,25584,25607,25627,25649,25676,25659,10176,25717,25734,
+ 25724,10263,10267,25791,25744,25801,25812,25823,10271,25858,
+ 25869,10274,18208,10286,25890,25901,25942,25947,25974,26015,
+ 26019,26025,10279,18280,26061,26093,26097,26103,10293,10284,
+ 10295,18394,26168,26172,26178,26213,10306,26245,26256,26288,
+ 10317,10335,12686,10324,26305,26322,26332,26373,26391,26414,
+ 26440,10326,26457,26522,10334,10328,26515,26526,26567,26549,
+ 26593,26658,26616,26635,26723,10367,26700,26735,26745,26757,
+
+ 26767,26814,18677,18066,10372,26832,26897,26850,10356,26901,
+ 26966,18728,10367,19041,26923,26943,27000,26993,27010,17278,
+ 27075,27052,27069,27087,27110,18767,17731,27121,27144,27156,
+ 27178,27190,27213,27278,27236,27255,27259, 0,19026,27304,
+ 27324,27347,27370,27282,27389,27393,23594,19047,27412,27416,
+ 27435, 0,17792,27500,27458,27481,27493,19099,27527,27550,
+ 24278,27568,27572,27615,27680,17983, 0,27637,27658,27684,
+ 27702, 0,18051,27725,27790,27767,27771,27794, 0,27812,
+ 27816,27859,27924,18461,27881,27902,27928,27946,27993,27950,
+ 27997,28015,28019,28062,28066,28084,28088,28107,28133,28111,
+
+ 28176,28180,28153,28245,28310,28199,28203,28222,28226,28291,
+ 28303,31091,28376,28398,28420,28442,28464,28486,28508,28529,
+ 28550,28572,28576,28597,28618,28640,28661,28676,28694,28715,
+ 28736,28752,28757,28779,28801,28818,28840,28862,28883,28904,
+ 28925,28946,28968,28990,28997,29013,29032,29053,29073,29090,
+ 29112,29134,29152,29173,29194,29210,29215,29237,29259,29281,
+ 29303,29320,29342,29364,29386,29407,29428,29449,29471,29493,
+ 29500,29521,29537,29556,29578,29600,29617,29639,29661,29683,
+ 29705,29726,29748,29770,29791,29813,29834,29855,29876,29897,
+ 29918,29939,29960,29981,30002,30023,30044,30065,30086,30107,
+
+ 30129,30151,30173,30195,30212,30233,30255,30277,30299,30320,
+ 30341,30363,30384,30405,30426,30443,30464,30486,30508,30529,
+ 30550,30571,30593,30615,30636,30658,30680,30701,30722,30744,
+ 30761,30782,30804,30826,30848,30870,30892,30914,30936,30958,
+ 30980,31002,31024,31046,31068
+ } ;
+
+static yyconst flex_int16_t yy_def[3046] =
+ { 0,
+ 2913, 2913, 2912, 3, 2912, 5, 2914, 2914, 2912, 9,
+ 2915, 2915, 2916, 2916, 2917, 2917, 2917, 2917, 2917, 2917,
+ 2918, 2918, 2919, 2919, 2917, 2917, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2920, 2921, 2921, 2920, 2912, 2922, 2923, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2924, 2912, 2924, 2912, 2912,
+ 2912, 2912, 2925, 2925, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 2912, 54, 2912, 2912, 36, 69,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 2912, 2912, 83, 84, 2926, 2927, 2912, 2912, 2912,
+ 2928, 2928, 2928, 2928, 83, 2928, 2912, 2912, 2912, 2929,
+
+ 2930, 2912, 2930, 2931, 2930, 2912, 2912, 2912, 2932, 2933,
+ 2933, 2933, 2934, 2934, 2934, 2934, 2935, 2935, 2935, 2912,
+ 2912, 2935, 2936, 2937, 2937, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2938, 2912, 36, 2939, 36, 2940, 2924,
+ 2941, 2941, 142, 2939, 2940, 2940, 36, 2939, 36, 2942,
+ 2912, 2943, 2943, 2912, 2940, 2944, 2943, 2944, 2945, 2945,
+ 2912, 2912, 2924, 2924, 2946, 2946, 2924, 167, 2912, 2912,
+ 2912, 2912, 2924, 2940, 2947, 2942, 2947, 177, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+ 177, 177, 177, 36, 194, 142, 142, 142, 142, 142,
+
+ 142, 142, 142, 142, 142, 142, 194, 194, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+ 177, 177, 2912, 2912, 2912, 225, 2948, 2912, 2912, 226,
+ 2912, 2949, 2950, 2951, 2951, 2948, 2952, 2950, 2950, 2950,
+ 2950, 225, 2912, 2950, 2953, 2954, 2954, 2912, 2912, 2912,
+ 2955, 2912, 2956, 2956, 2956, 2957, 2957, 2957, 2958, 2958,
+ 2958, 2958, 2958, 2959, 2960, 2960, 2960, 2960, 2960, 2961,
+ 2962, 2963, 2963, 2964, 2965, 2912, 142, 2966, 2912, 142,
+ 142, 142, 142, 2966, 2966, 2966, 2967, 2968, 2967, 2968,
+ 2967, 2967, 2967, 2912, 2969, 2912, 2969, 2970, 2971, 2971,
+
+ 2972, 2912, 2973, 289, 2968, 289, 2967, 2974, 2974, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 142, 142, 142, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 2912, 2912, 2912, 2912, 2912, 2975, 2976, 2977, 2977,
+ 2977, 2912, 2977, 2912, 2912, 2912, 2956, 2957, 2957, 2978,
+ 2959, 2979, 2961, 2964, 2912, 2912, 142, 142, 142, 2966,
+ 2966, 2966, 2968, 2968, 2968, 289, 2968, 289, 2912, 2912,
+ 2912, 2968, 2912, 2912, 2912, 2967, 396, 396, 2969, 2970,
+
+ 2971, 2972, 387, 2968, 289, 387, 289, 396, 309, 309,
+ 309, 2912, 2972, 309, 309, 309, 309, 309, 309, 309,
+ 309, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 142, 142, 142, 142, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 2912, 2972, 309, 2912, 2912, 2912, 2912, 2975, 2977, 2912,
+ 2912, 2977, 2912, 2977, 2912, 2912, 2957, 2957, 2978, 2979,
+ 2912, 2912, 142, 142, 142, 2966, 2966, 2966, 387, 387,
+ 387, 2968, 2968, 396, 396, 387, 387, 2968, 2968, 2980,
+ 2912, 2912, 2968, 2968, 2981, 2912, 2912, 396, 396, 396,
+
+ 2969, 400, 2971, 2972, 387, 387, 387, 2968, 396, 387,
+ 387, 2968, 396, 309, 2912, 2972, 309, 309, 2912, 2972,
+ 309, 309, 309, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 142, 142, 142, 142, 142, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 2912, 2912, 2972, 2972, 309, 2982, 2912, 2912, 2912, 2982,
+ 2982, 2983, 2984, 2912, 2912, 2982, 2912, 2977, 2912, 2912,
+ 2957, 2912, 2912, 2912, 2912, 142, 142, 2966, 2912, 2966,
+ 2968, 2968, 2968, 396, 396, 2968, 2968, 2980, 2980, 2912,
+ 2980, 2980, 2912, 2912, 2968, 2968, 2981, 2981, 2912, 2981,
+
+ 2981, 2912, 2912, 396, 396, 396, 2969, 400, 2971, 2972,
+ 2968, 2968, 396, 2912, 2972, 309, 309, 2912, 2972, 309,
+ 309, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 142, 142, 309, 309, 2972, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 2912, 2912, 2972,
+ 2972, 309, 2985, 2982, 2982, 2985, 2982, 2985, 2986, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2957, 2912,
+ 2912, 142, 142, 2966, 2966, 2968, 2968, 2968, 396, 396,
+ 2968, 2968, 2980, 2980, 2980, 2912, 2912, 2968, 2968, 2981,
+ 2981, 2981, 2912, 2912, 396, 396, 396, 2969, 400, 2971,
+
+ 2972, 2968, 396, 2912, 2972, 309, 309, 2912, 2972, 309,
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 309, 309, 309, 309, 2912, 2972, 309,
+ 309, 309, 309, 309, 2912, 2912, 2912, 2972, 2972, 2972,
+ 309, 2912, 2985, 657, 2985, 2985, 2985, 2985, 2985, 2985,
+ 2984, 2985, 2986, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2957, 2912, 2912, 142, 142, 2966, 2966, 2968, 2968, 2968,
+ 396, 396, 2968, 2968, 2980, 2980, 2912, 2912, 2968, 2968,
+ 2981, 2981, 2912, 2912, 396, 396, 396, 2969, 400, 2971,
+ 2972, 2968, 396, 2912, 2972, 309, 2912, 2972, 309, 142,
+
+ 142, 142, 142, 142, 142, 142, 142, 142, 142, 309,
+ 309, 309, 309, 2987, 2912, 2972, 2972, 309, 2912, 2912,
+ 2912, 2972, 2972, 2972, 309, 2985, 2985, 2985, 2985, 2985,
+ 2985, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2972, 2912, 2912, 2968, 2968, 2968,
+ 396, 2912, 2912, 396, 2968, 2912, 2912, 2968, 2980, 2980,
+ 2912, 2912, 2968, 2912, 2912, 858, 2981, 2981, 2912, 2912,
+ 396, 396, 2988, 2988, 2989, 2969, 2969, 2969, 2969, 2912,
+ 2972, 2968, 396, 2912, 2972, 2912, 2912, 2912, 2972, 142,
+ 142, 142, 142, 2990, 142, 142, 309, 309, 309, 2991,
+
+ 2992, 2993, 2994, 2912, 2972, 2972, 2987, 2912, 2912, 2912,
+ 2972, 2972, 2972, 2912, 2985, 2985, 2985, 2985, 2985, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2972, 2912, 2912, 2968, 2968, 2988, 2988, 2995, 396, 2912,
+ 396, 2968, 2968, 2980, 2980, 2912, 2912, 2968, 2968, 2981,
+ 2981, 2912, 396, 396, 2988, 2988, 2988, 2988, 2988, 959,
+ 2989, 2995, 961, 961, 961, 2969, 2912, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2912, 2972, 2968, 2912, 2912, 396, 2968,
+ 2912, 2972, 142, 142, 142, 2996, 2990, 309, 2997, 2998,
+ 2999, 3000, 2912, 2993, 2912, 2912, 2972, 2994, 2912, 2972,
+
+ 2912, 2912, 3001, 2972, 2972, 3002, 2912, 2985, 2985, 2985,
+ 2985, 2912, 2912, 2912, 2912, 2968, 2968, 2988, 2988, 2988,
+ 959, 959, 2995, 2995, 1024, 396, 2912, 396, 2968, 2968,
+ 3003, 3003, 2912, 3003, 2912, 2912, 2968, 2968, 3004, 3004,
+ 2912, 3004, 2912, 396, 396, 2988, 2988, 2988, 2912, 959,
+ 959, 2912, 2912, 959, 2912, 959, 959, 959, 959, 961,
+ 961, 961, 2912, 2912, 1024, 2912, 1024, 1024, 2912, 2912,
+ 961, 961, 961, 961, 961, 2912, 2912, 2912, 2968, 2912,
+ 2972, 142, 2996, 309, 3005, 3006, 2912, 2999, 2912, 2972,
+ 3000, 2912, 2972, 2912, 2912, 3001, 2972, 2972, 3001, 3002,
+
+ 1100, 2912, 2912, 2985, 2985, 2912, 2912, 2968, 2968, 2988,
+ 2988, 2988, 959, 959, 959, 959, 2995, 1024, 1024, 1024,
+ 1024, 2912, 396, 2968, 3003, 3003, 2912, 2968, 3004, 3004,
+ 396, 3007, 959, 959, 2912, 2912, 3008, 959, 959, 959,
+ 959, 961, 961, 2912, 2912, 3009, 1024, 1024, 2912, 2912,
+ 961, 961, 961, 961, 3010, 309, 3005, 3006, 2912, 3011,
+ 2912, 2912, 2972, 2972, 1102, 3012, 1102, 3012, 1102, 1102,
+ 1102, 2912, 2985, 2985, 2912, 2912, 2968, 959, 959, 959,
+ 959, 1024, 1024, 1024, 1024, 2912, 2912, 2912, 2912, 396,
+ 2968, 2912, 2912, 2968, 3003, 3003, 2912, 2912, 2912, 2968,
+
+ 3004, 3004, 396, 3007, 3007, 2912, 3007, 3007, 3007, 3007,
+ 959, 959, 2912, 2912, 3008, 3008, 2912, 3008, 3008, 3008,
+ 3008, 959, 959, 959, 959, 961, 961, 2912, 2912, 3009,
+ 3009, 2912, 3009, 3009, 3009, 3009, 1024, 1024, 2912, 2912,
+ 961, 961, 961, 961, 3010, 3013, 3014, 3015, 3015, 3011,
+ 3016, 3017, 3018, 2912, 3019, 2972, 1168, 1168, 1168, 1102,
+ 1168, 1102, 3018, 3018, 3018, 1168, 3018, 3018, 3018, 1102,
+ 1102, 1102, 2912, 2985, 2985, 3020, 2912, 2968, 959, 959,
+ 959, 959, 1024, 1024, 1024, 1024, 3003, 3004, 396, 3007,
+ 3007, 3007, 3007, 3007, 959, 959, 2912, 2912, 3008, 3008,
+
+ 3008, 959, 959, 959, 2912, 2912, 959, 961, 961, 2912,
+ 2912, 3009, 3009, 3009, 3009, 3009, 1024, 1024, 2912, 2912,
+ 961, 961, 961, 2912, 2912, 961, 3021, 3022, 3015, 3016,
+ 3017, 2912, 2972, 1168, 1168, 1168, 1168, 1168, 1102, 1102,
+ 1168, 1168, 1168, 1168, 3023, 3018, 3018, 1168, 1168, 3024,
+ 3018, 3018, 1102, 1102, 1102, 2912, 3020, 2985, 3025, 2968,
+ 959, 959, 959, 2912, 2912, 959, 1024, 1024, 1024, 2912,
+ 2912, 1024, 3003, 2912, 3003, 3003, 3004, 2912, 3004, 3004,
+ 396, 3007, 3007, 3007, 3007, 959, 2912, 2912, 959, 959,
+ 2912, 2912, 3008, 3008, 959, 2912, 2912, 959, 959, 959,
+
+ 961, 2912, 2912, 961, 961, 2912, 2912, 3009, 3009, 3009,
+ 3009, 1024, 2912, 2912, 1372, 1024, 2912, 2912, 961, 2912,
+ 2912, 961, 961, 961, 2912, 3021, 2912, 2972, 3022, 2912,
+ 2972, 1168, 1168, 1168, 1102, 1102, 1168, 1168, 3023, 3023,
+ 3023, 3023, 3018, 3018, 1168, 1168, 3024, 3024, 3024, 3024,
+ 3018, 3018, 1102, 1102, 1102, 2912, 2912, 3025, 2968, 959,
+ 2912, 2912, 959, 959, 959, 1024, 2912, 2912, 1372, 1024,
+ 1024, 3007, 3007, 3007, 3007, 959, 2912, 959, 959, 2912,
+ 2912, 2912, 3008, 3008, 959, 959, 959, 961, 961, 961,
+ 2912, 2912, 3009, 3009, 3009, 3009, 1024, 1024, 2912, 2912,
+
+ 961, 961, 961, 2912, 2972, 2912, 2972, 1168, 1168, 1168,
+ 1102, 1102, 1168, 1168, 3023, 3023, 3023, 3018, 3018, 1168,
+ 1168, 3024, 3024, 3024, 3018, 3018, 1102, 1102, 1102, 2912,
+ 959, 2912, 959, 959, 959, 1024, 1024, 1024, 1024, 3007,
+ 3007, 3007, 3007, 2912, 3007, 3007, 959, 2912, 959, 959,
+ 2912, 2912, 3008, 3008, 2912, 3008, 3008, 959, 959, 961,
+ 961, 961, 2912, 3009, 3009, 3009, 3009, 2912, 3009, 3009,
+ 1024, 1024, 2912, 1562, 1562, 2912, 2972, 3026, 3027, 1168,
+ 1168, 1168, 1102, 1102, 1168, 1168, 3023, 3023, 3018, 3018,
+ 1168, 1168, 3024, 3024, 3018, 3018, 1102, 1102, 1102, 2912,
+
+ 959, 2912, 959, 959, 1024, 1024, 1024, 3007, 3007, 2912,
+ 3007, 3007, 3007, 2912, 959, 2912, 2912, 959, 959, 2912,
+ 2912, 3008, 3008, 2912, 2912, 959, 959, 1562, 2912, 2912,
+ 961, 1024, 2912, 3009, 3009, 2912, 3009, 3009, 3009, 2912,
+ 2912, 1372, 2912, 2912, 2912, 961, 1024, 3028, 3028, 3029,
+ 3026, 3026, 3027, 1653, 2912, 1168, 1168, 1168, 1102, 3018,
+ 3018, 1102, 1168, 3018, 3018, 1168, 3023, 3023, 3018, 3018,
+ 1168, 3018, 3018, 1168, 3024, 3024, 3018, 3018, 1102, 1102,
+ 3030, 3030, 2912, 2912, 2912, 959, 2912, 2912, 959, 1024,
+ 2912, 2912, 1372, 3007, 3007, 3007, 3007, 2912, 2912, 2912,
+
+ 2912, 959, 959, 2912, 2912, 3008, 3008, 2912, 2912, 961,
+ 1024, 3009, 3009, 3009, 3009, 3031, 3032, 1655, 3033, 1655,
+ 3033, 1655, 1655, 1655, 1168, 1168, 1682, 1682, 3034, 1102,
+ 3018, 1102, 1168, 1168, 3023, 3023, 3018, 3018, 1168, 1168,
+ 3024, 3024, 3018, 1102, 1102, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1683, 3034, 1683, 1683, 1683, 2912, 2912, 2912, 2912,
+ 959, 2912, 2912, 1372, 3007, 3007, 3007, 2912, 3007, 3007,
+ 3008, 2912, 3008, 3008, 3009, 3009, 3009, 2912, 3009, 3009,
+ 3031, 3032, 1721, 1721, 1721, 1655, 1721, 1655, 3035, 3035,
+ 3035, 1721, 3035, 3035, 3035, 1655, 1655, 1655, 1168, 1168,
+
+ 1682, 1682, 1682, 1682, 1682, 1753, 1753, 1753, 1662, 3018,
+ 1662, 1168, 1168, 3023, 3023, 3023, 3018, 3018, 1168, 1168,
+ 3024, 3024, 3024, 3018, 1102, 1102, 1682, 1682, 1682, 3018,
+ 1682, 1682, 3018, 3018, 1682, 3018, 1682, 1682, 1682, 1682,
+ 1683, 1683, 1683, 3018, 3018, 1753, 3018, 1753, 1753, 3018,
+ 3018, 1683, 1683, 1683, 1683, 1683, 2912, 3007, 3009, 1721,
+ 1721, 1721, 1721, 1721, 1655, 1655, 1721, 1721, 1721, 1721,
+ 3036, 3035, 3035, 1721, 1721, 3037, 3035, 3035, 1655, 1655,
+ 1655, 1168, 1168, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1753, 1753, 1753, 1753, 1753, 3018, 1102, 1168, 3023, 3023,
+
+ 3018, 1168, 3024, 3024, 1102, 3038, 1682, 1682, 3018, 3018,
+ 3039, 1682, 1682, 1682, 1682, 1683, 1683, 3018, 3018, 3040,
+ 1753, 1753, 3018, 3018, 1683, 1683, 1683, 1683, 2912, 3007,
+ 2912, 3007, 3007, 3009, 2912, 3009, 3009, 1721, 1721, 1721,
+ 1655, 1655, 1721, 1721, 3036, 3036, 3036, 3036, 3035, 3035,
+ 1721, 1721, 3037, 3037, 3037, 3037, 3035, 3035, 1655, 1655,
+ 1655, 1168, 1682, 1682, 1682, 1682, 1753, 1753, 1753, 1753,
+ 3018, 3018, 3018, 3018, 1662, 1168, 3018, 3018, 1168, 3023,
+ 3023, 3018, 3018, 3018, 1168, 3024, 3024, 1102, 3038, 3038,
+ 3038, 3038, 3038, 3038, 1682, 1682, 3018, 3018, 3039, 3039,
+
+ 3039, 3039, 3039, 3039, 1682, 1682, 1682, 1682, 1683, 1683,
+ 3018, 3018, 3040, 3040, 3040, 3040, 3040, 3040, 1753, 1753,
+ 3018, 3018, 1683, 1683, 1683, 1683, 2912, 1721, 1721, 1721,
+ 1655, 1655, 1721, 1721, 3036, 3036, 3036, 3035, 3035, 1721,
+ 1721, 3037, 3037, 3037, 3035, 3035, 1655, 1655, 1655, 1168,
+ 1682, 1682, 1682, 1682, 1753, 1753, 1753, 1753, 3023, 3024,
+ 1102, 3038, 3038, 3038, 3038, 3038, 1682, 1682, 3018, 3018,
+ 3039, 3039, 3039, 1682, 1682, 1682, 3018, 3018, 1682, 1683,
+ 1683, 3018, 3018, 3040, 3040, 3040, 3040, 3040, 1753, 1753,
+ 3018, 3018, 1683, 1683, 1683, 3018, 3018, 1683, 2912, 1721,
+
+ 1721, 1721, 1655, 1655, 1721, 1721, 3036, 3036, 3035, 3035,
+ 1721, 1721, 3037, 3037, 3035, 3035, 1655, 1655, 1655, 1168,
+ 1682, 1682, 1682, 3018, 3018, 1682, 1753, 1753, 1753, 3018,
+ 3018, 1753, 3023, 3023, 3023, 3024, 3024, 3024, 1102, 3038,
+ 3038, 3038, 3038, 1682, 3018, 3018, 1682, 1682, 3018, 3018,
+ 3039, 3039, 1682, 3018, 3018, 1682, 1682, 1682, 1683, 3018,
+ 3018, 1683, 1683, 3018, 3018, 3040, 3040, 3040, 3040, 1753,
+ 3018, 3018, 1753, 1753, 3018, 3018, 1683, 3018, 3018, 1683,
+ 1683, 1683, 2912, 1721, 1721, 1721, 1655, 3035, 3035, 1655,
+ 1721, 3035, 3035, 1721, 3036, 3036, 3035, 3035, 1721, 3035,
+
+ 3035, 1721, 3037, 3037, 3035, 3035, 1655, 1655, 3041, 3041,
+ 2912, 1168, 1682, 3018, 3018, 1682, 1682, 1682, 1753, 3018,
+ 3018, 1753, 1753, 1753, 3038, 3038, 3038, 3038, 1682, 3018,
+ 1682, 1682, 3018, 3018, 3018, 3039, 3039, 1682, 1682, 1682,
+ 1683, 1683, 1683, 3018, 3018, 3040, 3040, 3040, 3040, 1753,
+ 1753, 3018, 3018, 1683, 1683, 1683, 2912, 1721, 1721, 2210,
+ 2210, 3042, 1655, 3035, 1655, 1721, 1721, 3036, 3036, 3035,
+ 3035, 1721, 1721, 3037, 3037, 3035, 1655, 1655, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2211, 3042, 2211, 2211, 2211, 1682,
+ 3018, 1682, 1682, 1682, 1753, 1753, 1753, 1753, 3038, 3038,
+
+ 3038, 3038, 3038, 3038, 1682, 3018, 1682, 1682, 3018, 3018,
+ 3039, 3039, 3039, 3039, 1682, 1682, 1683, 1683, 1683, 3018,
+ 3040, 3040, 3040, 3040, 3040, 3040, 1753, 1753, 3018, 1683,
+ 1683, 2912, 1721, 1721, 2210, 2210, 2210, 2210, 2210, 2286,
+ 2286, 2286, 2190, 3035, 2190, 1721, 1721, 3036, 3036, 3036,
+ 3035, 3035, 1721, 1721, 3037, 3037, 3037, 3035, 1655, 1655,
+ 2210, 2210, 2210, 3035, 2210, 2210, 3035, 3035, 2210, 3035,
+ 2210, 2210, 2210, 2210, 2211, 2211, 2211, 3035, 3035, 2286,
+ 3035, 2286, 2286, 3035, 3035, 2211, 2211, 2211, 2211, 2211,
+ 1682, 3018, 1682, 1682, 1753, 1753, 1753, 3038, 3038, 3038,
+
+ 3038, 3038, 3018, 1682, 3018, 3018, 1682, 1682, 3018, 3018,
+ 3039, 3039, 3018, 3018, 1682, 1682, 1683, 3018, 3018, 1683,
+ 1753, 3018, 3040, 3040, 3040, 3040, 3040, 3018, 3018, 1753,
+ 3018, 3018, 3018, 1683, 1753, 2912, 1721, 1721, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2286, 2286, 2286, 2286, 2286,
+ 3035, 1655, 1721, 3036, 3036, 3035, 1721, 3037, 3037, 1655,
+ 3043, 2210, 2210, 3035, 3035, 3044, 2210, 2210, 2210, 2210,
+ 2211, 2211, 3035, 3035, 3045, 2286, 2286, 3035, 3035, 2211,
+ 2211, 2211, 2211, 3018, 1682, 3018, 3018, 1682, 1753, 3018,
+ 3018, 1753, 3038, 3038, 3038, 3038, 3018, 3018, 3018, 3018,
+
+ 1682, 1682, 3018, 3018, 3039, 3039, 3018, 3018, 1683, 1753,
+ 3040, 3040, 3040, 3040, 2912, 1721, 2210, 2210, 2210, 2210,
+ 2286, 2286, 2286, 2286, 3035, 3035, 3035, 3035, 2190, 1721,
+ 3035, 3035, 1721, 3036, 3036, 3035, 3035, 3035, 1721, 3037,
+ 3037, 1655, 3043, 3043, 3043, 3043, 3043, 3043, 2210, 2210,
+ 3035, 3035, 3044, 3044, 3044, 3044, 3044, 3044, 2210, 2210,
+ 2210, 2210, 2211, 2211, 3035, 3035, 3045, 3045, 3045, 3045,
+ 3045, 3045, 2286, 2286, 3035, 3035, 2211, 2211, 2211, 2211,
+ 3018, 3018, 3018, 1682, 3018, 3018, 1753, 3038, 3038, 3038,
+ 3038, 3038, 3039, 3039, 3039, 3040, 3040, 3040, 3040, 3040,
+
+ 1721, 2210, 2210, 2210, 2210, 2286, 2286, 2286, 2286, 3036,
+ 3037, 1655, 3043, 3043, 3043, 3043, 3043, 2210, 2210, 3035,
+ 3035, 3044, 3044, 3044, 2210, 2210, 2210, 3035, 3035, 2210,
+ 2211, 2211, 3035, 3035, 3045, 3045, 3045, 3045, 3045, 2286,
+ 2286, 3035, 3035, 2211, 2211, 2211, 3035, 3035, 2211, 3038,
+ 3040, 1721, 2210, 2210, 2210, 3035, 3035, 2210, 2286, 2286,
+ 2286, 3035, 3035, 2286, 3036, 3036, 3036, 3037, 3037, 3037,
+ 1655, 3043, 3043, 3043, 3043, 2210, 3035, 3035, 2210, 2210,
+ 3035, 3035, 3044, 3044, 2210, 3035, 3035, 2210, 2210, 2210,
+ 2211, 3035, 3035, 2211, 2211, 3035, 3035, 3045, 3045, 3045,
+
+ 3045, 2286, 3035, 3035, 2286, 2286, 3035, 3035, 2211, 3035,
+ 3035, 2211, 2211, 2211, 3038, 3038, 3038, 3040, 3040, 3040,
+ 1721, 2210, 3035, 3035, 2210, 2210, 2210, 2286, 3035, 3035,
+ 2286, 2286, 2286, 3043, 3043, 3043, 3043, 2210, 3035, 2210,
+ 2210, 3035, 3035, 3035, 3044, 3044, 2210, 2210, 2210, 2211,
+ 2211, 2211, 3035, 3035, 3045, 3045, 3045, 3045, 2286, 2286,
+ 3035, 3035, 2211, 2211, 2211, 2210, 3035, 2210, 2210, 2210,
+ 2286, 2286, 2286, 2286, 3043, 3043, 3043, 3043, 3043, 3043,
+ 2210, 3035, 2210, 2210, 3035, 3035, 3044, 3044, 3044, 3044,
+ 2210, 2210, 2211, 2211, 2211, 3035, 3045, 3045, 3045, 3045,
+
+ 3045, 3045, 2286, 2286, 3035, 2211, 2211, 2210, 3035, 2210,
+ 2210, 2286, 2286, 2286, 3043, 3043, 3043, 3043, 3043, 3035,
+ 2210, 3035, 3035, 2210, 2210, 3035, 3035, 3044, 3044, 3035,
+ 3035, 2210, 2210, 2211, 3035, 3035, 2211, 2286, 3035, 3045,
+ 3045, 3045, 3045, 3045, 3035, 3035, 2286, 3035, 3035, 3035,
+ 2211, 2286, 3035, 2210, 3035, 3035, 2210, 2286, 3035, 3035,
+ 2286, 3043, 3043, 3043, 3043, 3035, 3035, 3035, 3035, 2210,
+ 2210, 3035, 3035, 3044, 3044, 3035, 3035, 2211, 2286, 3045,
+ 3045, 3045, 3045, 3035, 3035, 3035, 2210, 3035, 3035, 2286,
+ 3043, 3043, 3043, 3043, 3043, 3044, 3044, 3044, 3045, 3045,
+
+ 3045, 3045, 3045, 3043, 3045, 3043, 3043, 3043, 3045, 3045,
+ 3045, 0, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912
+ } ;
+
+static yyconst flex_int16_t yy_nxt[31167] =
+ { 0,
+ 2912, 29, 30, 265, 29, 29, 30, 253, 29, 460,
+ 460, 460, 461, 275, 275, 2912, 2912, 31, 2475, 2466,
+ 255, 31, 32, 33, 34, 35, 36, 37, 38, 32,
+ 39, 40, 41, 42, 42, 42, 43, 44, 42, 45,
+ 46, 47, 48, 49, 32, 50, 51, 52, 53, 54,
+ 55, 53, 56, 57, 58, 53, 59, 53, 53, 60,
+ 53, 61, 53, 62, 63, 53, 53, 53, 53, 64,
+ 53, 65, 66, 53, 54, 55, 53, 56, 57, 58,
+ 53, 59, 53, 60, 53, 61, 53, 62, 63, 53,
+ 53, 53, 53, 64, 53, 67, 68, 69, 303, 95,
+
+ 70, 926, 95, 98, 30, 130, 98, 135, 130, 926,
+ 2461, 168, 160, 132, 114, 115, 132, 114, 1920, 99,
+ 211, 131, 71, 72, 73, 96, 74, 75, 223, 133,
+ 116, 135, 135, 76, 97, 97, 160, 77, 135, 78,
+ 79, 80, 81, 118, 119, 211, 118, 71, 72, 73,
+ 96, 74, 75, 223, 120, 121, 135, 76, 1911, 122,
+ 1906, 77, 135, 78, 79, 80, 81, 82, 83, 84,
+ 85, 83, 82, 86, 82, 82, 82, 87, 87, 88,
+ 89, 87, 87, 87, 90, 82, 87, 91, 87, 87,
+ 87, 87, 87, 92, 92, 92, 92, 93, 92, 92,
+
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 82, 94, 92, 92,
+ 92, 92, 93, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 82, 82, 97, 98, 30, 97, 98, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 99,
+ 97, 97, 97, 97, 97, 97, 97, 97, 114, 115,
+ 151, 114, 1876, 1871, 118, 119, 240, 118, 98, 30,
+ 182, 98, 175, 258, 116, 120, 121, 135, 97, 97,
+ 122, 97, 98, 30, 99, 98, 98, 30, 226, 98,
+
+ 240, 226, 1456, 1350, 182, 1345, 175, 258, 99, 1146,
+ 1137, 135, 99, 1132, 224, 97, 97, 97, 98, 30,
+ 97, 98, 97, 97, 97, 97, 97, 97, 97, 97,
+ 97, 97, 97, 97, 99, 97, 97, 97, 97, 97,
+ 97, 97, 97, 98, 30, 237, 98, 98, 30, 223,
+ 98, 192, 223, 125, 126, 223, 125, 2912, 223, 99,
+ 175, 294, 239, 99, 127, 128, 97, 968, 129, 99,
+ 125, 126, 130, 125, 223, 130, 192, 223, 1014, 667,
+ 223, 127, 128, 223, 175, 129, 99, 239, 131, 667,
+ 97, 97, 97, 101, 102, 97, 103, 97, 104, 97,
+
+ 97, 97, 105, 105, 106, 107, 105, 105, 105, 108,
+ 97, 105, 109, 105, 105, 105, 105, 105, 110, 110,
+ 110, 110, 110, 110, 111, 110, 110, 110, 110, 110,
+ 110, 110, 110, 112, 110, 110, 110, 110, 110, 110,
+ 110, 97, 110, 110, 110, 110, 110, 110, 110, 111,
+ 110, 110, 110, 110, 110, 110, 110, 112, 110, 110,
+ 110, 110, 110, 110, 110, 97, 97, 97, 98, 30,
+ 97, 98, 97, 356, 97, 97, 97, 97, 97, 97,
+ 97, 97, 97, 97, 99, 97, 97, 97, 97, 97,
+ 97, 97, 97, 98, 30, 161, 98, 98, 30, 178,
+
+ 98, 179, 188, 180, 175, 175, 175, 241, 244, 99,
+ 181, 220, 135, 99, 495, 175, 97, 151, 207, 148,
+ 148, 208, 490, 367, 178, 179, 188, 180, 175, 175,
+ 175, 161, 241, 244, 181, 220, 135, 366, 150, 175,
+ 97, 97, 97, 98, 30, 97, 98, 97, 135, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 99,
+ 97, 97, 97, 97, 97, 97, 97, 97, 144, 137,
+ 137, 144, 135, 137, 137, 137, 137, 303, 302, 134,
+ 161, 372, 367, 270, 133, 161, 161, 257, 370, 2912,
+ 161, 97, 264, 132, 169, 255, 132, 135, 260, 145,
+
+ 312, 260, 135, 135, 145, 170, 151, 135, 146, 133,
+ 366, 135, 257, 146, 261, 97, 97, 136, 137, 137,
+ 138, 135, 139, 135, 145, 312, 135, 135, 151, 145,
+ 253, 135, 146, 131, 140, 135, 140, 146, 252, 162,
+ 162, 162, 163, 134, 190, 135, 175, 135, 142, 151,
+ 171, 276, 183, 189, 161, 191, 356, 143, 262, 150,
+ 266, 262, 184, 266, 175, 175, 135, 175, 190, 135,
+ 175, 135, 175, 142, 263, 276, 267, 183, 189, 164,
+ 191, 143, 147, 148, 148, 149, 184, 139, 175, 175,
+ 135, 175, 193, 175, 161, 135, 185, 175, 131, 140,
+
+ 175, 140, 150, 164, 186, 175, 221, 175, 187, 277,
+ 209, 135, 210, 142, 161, 242, 193, 175, 242, 161,
+ 277, 185, 143, 268, 273, 175, 268, 273, 186, 175,
+ 221, 175, 187, 277, 209, 135, 210, 302, 142, 269,
+ 131, 243, 165, 151, 277, 294, 143, 152, 153, 154,
+ 153, 153, 152, 155, 152, 152, 152, 152, 152, 152,
+ 152, 178, 222, 152, 175, 152, 243, 132, 157, 152,
+ 132, 179, 274, 213, 277, 212, 175, 175, 175, 182,
+ 181, 175, 300, 133, 214, 215, 178, 222, 158, 175,
+ 134, 188, 352, 175, 175, 179, 152, 213, 277, 212,
+
+ 175, 175, 175, 182, 181, 175, 300, 309, 214, 270,
+ 215, 130, 158, 264, 130, 188, 352, 175, 216, 175,
+ 152, 152, 162, 162, 162, 163, 134, 131, 165, 218,
+ 132, 309, 190, 132, 217, 252, 166, 175, 166, 167,
+ 219, 168, 150, 216, 355, 2912, 133, 167, 167, 167,
+ 167, 167, 167, 134, 218, 134, 190, 175, 217, 325,
+ 2912, 175, 164, 2912, 219, 2912, 350, 2912, 355, 2912,
+ 310, 167, 167, 167, 167, 167, 167, 167, 136, 137,
+ 137, 138, 175, 353, 325, 2912, 164, 172, 172, 172,
+ 173, 350, 174, 2912, 310, 2912, 2912, 2912, 2912, 344,
+
+ 174, 174, 175, 174, 140, 174, 175, 176, 353, 174,
+ 174, 174, 172, 172, 172, 173, 353, 174, 277, 137,
+ 137, 137, 137, 317, 344, 174, 174, 175, 174, 140,
+ 174, 175, 176, 265, 174, 174, 174, 154, 154, 154,
+ 154, 353, 277, 374, 374, 246, 2912, 317, 246, 359,
+ 145, 2912, 2912, 177, 2912, 246, 2912, 279, 246, 278,
+ 361, 248, 162, 162, 162, 163, 2912, 153, 154, 153,
+ 153, 248, 294, 359, 175, 145, 249, 177, 194, 137,
+ 137, 195, 150, 278, 361, 250, 249, 157, 315, 365,
+ 280, 311, 175, 2912, 2912, 250, 2912, 2912, 2912, 175,
+
+ 282, 249, 283, 196, 197, 198, 175, 199, 200, 250,
+ 320, 249, 315, 365, 201, 280, 311, 175, 202, 250,
+ 203, 204, 205, 206, 282, 2912, 283, 2912, 196, 197,
+ 198, 175, 199, 200, 2912, 320, 2912, 2912, 201, 2912,
+ 2912, 2912, 202, 2912, 203, 204, 205, 206, 224, 225,
+ 226, 226, 225, 224, 224, 224, 224, 224, 227, 227,
+ 224, 224, 227, 227, 227, 228, 224, 227, 224, 227,
+ 227, 227, 227, 227, 154, 154, 154, 154, 229, 154,
+ 154, 154, 154, 368, 144, 137, 137, 144, 154, 154,
+ 154, 154, 369, 175, 279, 175, 237, 224, 224, 279,
+
+ 133, 2912, 280, 229, 314, 313, 329, 368, 279, 353,
+ 154, 154, 154, 154, 2912, 145, 369, 284, 175, 2912,
+ 175, 224, 224, 230, 278, 175, 230, 280, 314, 313,
+ 279, 329, 224, 224, 353, 316, 224, 224, 224, 231,
+ 145, 224, 284, 224, 224, 224, 224, 224, 278, 285,
+ 175, 286, 223, 2912, 162, 162, 162, 162, 265, 316,
+ 162, 162, 162, 163, 566, 566, 566, 566, 275, 275,
+ 2912, 2912, 2912, 285, 150, 286, 2912, 223, 232, 232,
+ 150, 232, 232, 232, 233, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 280, 232,
+
+ 232, 232, 232, 232, 148, 148, 148, 148, 235, 287,
+ 288, 288, 289, 328, 172, 172, 172, 172, 2912, 2912,
+ 290, 290, 2912, 280, 150, 2912, 2912, 232, 2912, 172,
+ 172, 172, 173, 235, 176, 145, 292, 328, 293, 154,
+ 154, 154, 154, 2912, 278, 295, 296, 295, 295, 176,
+ 294, 232, 232, 172, 172, 172, 173, 2912, 174, 279,
+ 145, 292, 360, 293, 280, 157, 174, 174, 278, 174,
+ 140, 174, 175, 176, 175, 174, 174, 174, 172, 172,
+ 172, 173, 334, 174, 318, 297, 321, 360, 2912, 280,
+ 175, 174, 174, 280, 174, 140, 174, 175, 176, 175,
+
+ 174, 174, 174, 326, 319, 362, 334, 281, 318, 297,
+ 321, 162, 162, 162, 163, 175, 2912, 2912, 280, 566,
+ 566, 566, 566, 654, 654, 654, 655, 326, 319, 2912,
+ 362, 150, 281, 152, 153, 154, 153, 153, 152, 155,
+ 152, 152, 152, 152, 152, 152, 152, 280, 280, 152,
+ 280, 152, 301, 175, 157, 152, 327, 207, 148, 148,
+ 208, 335, 323, 346, 324, 330, 336, 363, 348, 280,
+ 280, 175, 280, 280, 364, 280, 301, 150, 175, 282,
+ 327, 331, 152, 2912, 2912, 335, 323, 346, 324, 2912,
+ 330, 336, 363, 348, 280, 280, 175, 2912, 2912, 364,
+
+ 2912, 375, 2912, 282, 2912, 331, 152, 152, 152, 153,
+ 154, 153, 153, 152, 155, 152, 152, 152, 152, 152,
+ 152, 152, 175, 280, 152, 375, 152, 332, 175, 157,
+ 152, 207, 148, 148, 208, 2912, 338, 343, 333, 207,
+ 148, 148, 208, 337, 175, 175, 339, 175, 280, 401,
+ 298, 150, 332, 175, 455, 175, 259, 152, 2912, 150,
+ 338, 343, 333, 340, 341, 2912, 274, 2912, 337, 175,
+ 175, 339, 2912, 401, 298, 275, 275, 2912, 455, 353,
+ 175, 152, 152, 162, 162, 162, 163, 340, 341, 302,
+ 311, 175, 345, 175, 175, 347, 175, 166, 230, 166,
+
+ 167, 230, 167, 150, 353, 342, 2912, 349, 167, 167,
+ 167, 167, 167, 167, 231, 311, 175, 345, 175, 175,
+ 347, 175, 242, 456, 280, 242, 411, 2912, 2912, 342,
+ 2912, 349, 167, 167, 167, 167, 167, 167, 167, 172,
+ 172, 172, 173, 175, 174, 2912, 175, 456, 243, 280,
+ 2912, 411, 174, 174, 2912, 174, 140, 174, 351, 176,
+ 2912, 174, 174, 174, 304, 305, 305, 306, 175, 246,
+ 2912, 175, 246, 243, 260, 290, 290, 260, 2912, 465,
+ 262, 415, 351, 262, 279, 248, 266, 280, 280, 266,
+ 261, 292, 268, 293, 273, 268, 263, 273, 282, 378,
+
+ 249, 175, 267, 465, 307, 2912, 415, 2912, 269, 250,
+ 131, 2912, 280, 280, 436, 280, 292, 2912, 293, 2912,
+ 2912, 294, 282, 378, 377, 249, 175, 2912, 307, 172,
+ 172, 172, 173, 250, 174, 154, 154, 154, 154, 436,
+ 280, 2912, 174, 174, 280, 174, 140, 174, 377, 176,
+ 2912, 174, 174, 174, 379, 279, 2912, 399, 308, 296,
+ 296, 296, 296, 2912, 287, 288, 288, 289, 2912, 280,
+ 154, 154, 154, 154, 285, 290, 290, 175, 379, 279,
+ 175, 399, 450, 308, 194, 137, 137, 195, 417, 2912,
+ 279, 292, 175, 293, 2912, 419, 175, 2912, 285, 376,
+
+ 2912, 414, 175, 2912, 2912, 175, 416, 450, 380, 196,
+ 197, 198, 417, 199, 200, 175, 292, 175, 293, 419,
+ 201, 175, 420, 376, 322, 414, 203, 204, 205, 206,
+ 416, 265, 380, 2912, 196, 197, 198, 2912, 199, 200,
+ 175, 374, 374, 2912, 201, 2912, 420, 2912, 322, 2912,
+ 203, 204, 205, 206, 224, 225, 226, 226, 225, 224,
+ 224, 224, 224, 224, 227, 227, 224, 224, 227, 227,
+ 227, 228, 224, 227, 224, 227, 227, 227, 227, 227,
+ 390, 391, 391, 392, 354, 154, 154, 154, 154, 466,
+ 154, 154, 154, 154, 454, 457, 393, 295, 296, 295,
+
+ 295, 2912, 294, 224, 224, 279, 2912, 2912, 175, 354,
+ 279, 459, 2912, 466, 394, 395, 395, 396, 2912, 454,
+ 457, 2912, 418, 2912, 382, 290, 290, 224, 224, 226,
+ 389, 381, 226, 175, 175, 462, 459, 297, 224, 224,
+ 446, 2912, 224, 224, 224, 224, 418, 224, 382, 224,
+ 224, 224, 224, 224, 430, 381, 468, 280, 353, 175,
+ 462, 297, 2912, 2912, 446, 394, 395, 395, 396, 2912,
+ 296, 296, 296, 296, 2912, 2912, 290, 290, 2912, 430,
+ 468, 389, 280, 353, 232, 232, 463, 232, 232, 232,
+ 233, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+
+ 232, 232, 232, 232, 397, 232, 232, 232, 232, 232,
+ 376, 463, 175, 423, 464, 280, 162, 162, 162, 163,
+ 280, 2912, 421, 280, 431, 425, 280, 175, 397, 429,
+ 472, 440, 2912, 232, 376, 2912, 150, 175, 423, 464,
+ 280, 579, 579, 579, 579, 280, 421, 2912, 280, 431,
+ 425, 280, 175, 429, 472, 402, 440, 232, 232, 232,
+ 232, 279, 232, 232, 232, 233, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 402,
+ 232, 232, 232, 232, 232, 288, 288, 288, 383, 386,
+ 387, 387, 388, 568, 304, 305, 305, 306, 357, 2912,
+
+ 290, 290, 2912, 2912, 2912, 389, 2912, 2912, 232, 2912,
+ 2912, 2912, 384, 2912, 385, 2912, 292, 568, 293, 280,
+ 434, 433, 357, 280, 394, 395, 395, 396, 412, 412,
+ 412, 413, 232, 232, 307, 290, 290, 384, 280, 385,
+ 389, 292, 280, 293, 280, 434, 433, 2912, 280, 259,
+ 426, 427, 424, 2912, 2912, 2912, 175, 175, 307, 438,
+ 467, 2912, 398, 280, 2912, 2912, 2912, 280, 374, 374,
+ 405, 406, 406, 407, 426, 427, 424, 305, 305, 305,
+ 403, 175, 175, 2912, 438, 467, 398, 152, 153, 154,
+ 153, 153, 152, 155, 152, 152, 152, 152, 152, 152,
+
+ 152, 280, 2912, 152, 384, 152, 385, 280, 157, 152,
+ 307, 432, 394, 395, 395, 396, 2912, 404, 471, 280,
+ 2912, 428, 570, 290, 290, 2912, 280, 400, 389, 384,
+ 435, 385, 280, 330, 307, 432, 152, 280, 280, 2912,
+ 175, 404, 571, 471, 280, 428, 570, 282, 259, 422,
+ 437, 400, 439, 408, 435, 2912, 2912, 2912, 330, 473,
+ 152, 152, 280, 280, 175, 175, 571, 275, 275, 2912,
+ 2912, 282, 175, 422, 437, 441, 439, 408, 172, 172,
+ 172, 173, 175, 174, 473, 442, 443, 2912, 444, 175,
+ 175, 174, 174, 503, 174, 140, 174, 175, 176, 441,
+
+ 174, 174, 174, 409, 259, 2912, 2912, 175, 175, 442,
+ 447, 443, 175, 444, 2912, 175, 175, 2912, 503, 971,
+ 445, 294, 2912, 374, 374, 2912, 2912, 971, 409, 172,
+ 172, 172, 173, 175, 174, 447, 175, 175, 175, 175,
+ 2912, 175, 174, 174, 445, 174, 140, 174, 448, 176,
+ 449, 174, 174, 174, 475, 175, 280, 280, 410, 453,
+ 484, 175, 2912, 175, 175, 451, 451, 451, 452, 485,
+ 2912, 474, 448, 575, 449, 175, 175, 175, 522, 475,
+ 175, 280, 280, 410, 453, 484, 154, 154, 154, 154,
+ 517, 537, 175, 485, 175, 474, 2912, 575, 514, 2912,
+
+ 175, 175, 175, 522, 2912, 2912, 279, 2912, 2912, 2912,
+ 2912, 2912, 294, 2912, 517, 476, 537, 175, 2912, 175,
+ 232, 232, 514, 232, 232, 232, 233, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 476, 232, 232, 232, 232, 232, 501, 594, 2912, 458,
+ 548, 2912, 154, 154, 154, 154, 154, 154, 154, 154,
+ 2912, 479, 480, 480, 481, 390, 391, 391, 392, 232,
+ 501, 594, 279, 484, 458, 548, 279, 393, 175, 2912,
+ 175, 393, 485, 478, 390, 391, 391, 392, 384, 280,
+ 385, 2912, 518, 232, 232, 477, 550, 603, 484, 524,
+
+ 393, 2912, 2912, 175, 482, 175, 485, 2912, 478, 523,
+ 531, 175, 280, 384, 280, 385, 518, 2912, 2912, 477,
+ 550, 603, 483, 524, 390, 391, 391, 390, 482, 390,
+ 391, 391, 390, 2912, 523, 531, 175, 280, 614, 2912,
+ 393, 390, 391, 391, 392, 393, 483, 486, 387, 387,
+ 487, 394, 395, 395, 394, 491, 2912, 393, 175, 291,
+ 491, 2912, 614, 389, 492, 498, 499, 389, 291, 492,
+ 521, 280, 493, 280, 384, 527, 385, 534, 488, 280,
+ 491, 494, 496, 175, 291, 491, 529, 489, 492, 498,
+ 499, 497, 291, 492, 521, 280, 280, 493, 280, 384,
+
+ 527, 385, 534, 488, 280, 494, 528, 496, 2912, 2912,
+ 529, 489, 280, 2912, 2912, 497, 394, 395, 395, 394,
+ 280, 535, 394, 395, 395, 396, 2912, 291, 2912, 2912,
+ 528, 648, 389, 290, 290, 2912, 291, 280, 389, 500,
+ 2912, 390, 391, 391, 392, 535, 175, 496, 519, 519,
+ 519, 520, 291, 484, 280, 648, 497, 393, 530, 558,
+ 291, 649, 485, 500, 510, 406, 406, 511, 2912, 2912,
+ 2912, 175, 496, 2912, 2912, 2912, 559, 175, 484, 280,
+ 497, 2912, 508, 530, 558, 649, 485, 152, 153, 154,
+ 153, 153, 152, 155, 152, 152, 152, 152, 152, 152,
+
+ 152, 559, 175, 152, 512, 152, 508, 660, 157, 152,
+ 162, 162, 162, 163, 567, 502, 505, 506, 506, 507,
+ 2912, 280, 2912, 405, 406, 406, 407, 569, 512, 2912,
+ 150, 660, 393, 526, 574, 2912, 152, 504, 2912, 567,
+ 502, 2912, 405, 406, 406, 407, 280, 290, 412, 412,
+ 412, 412, 569, 280, 484, 2912, 404, 526, 291, 574,
+ 152, 152, 504, 509, 2912, 532, 513, 291, 176, 2912,
+ 2912, 280, 290, 484, 412, 412, 412, 413, 280, 484,
+ 404, 2912, 509, 291, 2912, 536, 666, 509, 515, 532,
+ 513, 291, 280, 280, 176, 525, 280, 2912, 484, 533,
+
+ 451, 451, 451, 452, 2912, 577, 509, 280, 593, 536,
+ 666, 538, 515, 2912, 516, 175, 2912, 280, 280, 539,
+ 525, 175, 175, 533, 175, 540, 2912, 175, 175, 280,
+ 577, 541, 280, 593, 542, 546, 538, 175, 516, 175,
+ 175, 543, 544, 2912, 539, 2912, 175, 175, 2912, 175,
+ 540, 545, 175, 175, 280, 541, 602, 547, 542, 549,
+ 546, 175, 175, 175, 175, 543, 544, 451, 451, 451,
+ 451, 451, 451, 451, 452, 545, 555, 609, 280, 2912,
+ 175, 602, 547, 2912, 549, 2912, 175, 176, 175, 2912,
+ 576, 176, 2912, 2912, 551, 291, 552, 156, 553, 608,
+
+ 554, 555, 609, 280, 604, 175, 556, 556, 556, 556,
+ 560, 560, 560, 561, 576, 572, 572, 572, 572, 551,
+ 291, 552, 156, 553, 608, 554, 573, 557, 604, 2912,
+ 2912, 557, 232, 562, 556, 562, 562, 232, 233, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 2912, 232, 563, 232, 232, 232, 556, 556,
+ 556, 556, 460, 460, 460, 460, 565, 565, 565, 565,
+ 519, 519, 519, 520, 154, 154, 154, 154, 2912, 557,
+ 668, 232, 154, 154, 154, 154, 2912, 479, 480, 480,
+ 481, 175, 564, 2912, 279, 175, 564, 175, 2912, 280,
+
+ 621, 632, 279, 393, 668, 232, 232, 479, 480, 480,
+ 481, 580, 280, 2912, 2912, 578, 175, 564, 493, 2912,
+ 175, 564, 175, 393, 280, 621, 632, 494, 479, 480,
+ 480, 481, 390, 391, 391, 392, 580, 280, 493, 578,
+ 2912, 2912, 2912, 493, 393, 2912, 2912, 494, 393, 291,
+ 584, 494, 291, 519, 519, 519, 519, 585, 291, 493,
+ 2912, 291, 2912, 493, 390, 391, 391, 392, 494, 581,
+ 582, 494, 2912, 176, 291, 584, 669, 291, 2912, 2912,
+ 393, 585, 291, 2912, 493, 291, 390, 391, 391, 392,
+ 618, 175, 494, 581, 582, 390, 391, 391, 392, 2912,
+
+ 620, 669, 393, 589, 590, 591, 589, 583, 280, 2912,
+ 2912, 393, 623, 294, 618, 586, 175, 2912, 670, 592,
+ 390, 391, 391, 392, 620, 390, 391, 391, 392, 605,
+ 291, 583, 686, 280, 587, 607, 393, 623, 687, 291,
+ 586, 393, 670, 598, 599, 600, 598, 2912, 291, 595,
+ 606, 2912, 2912, 2912, 605, 291, 686, 291, 587, 601,
+ 607, 671, 687, 291, 596, 162, 162, 162, 163, 162,
+ 162, 162, 163, 291, 595, 606, 505, 506, 506, 507,
+ 613, 291, 2912, 280, 291, 150, 671, 624, 596, 150,
+ 693, 2912, 393, 291, 610, 505, 506, 506, 507, 505,
+
+ 506, 506, 507, 694, 622, 613, 280, 493, 280, 291,
+ 615, 393, 624, 175, 693, 393, 611, 291, 2912, 610,
+ 700, 390, 391, 391, 392, 643, 493, 694, 638, 622,
+ 493, 280, 493, 291, 615, 611, 2912, 393, 175, 611,
+ 611, 585, 291, 408, 700, 510, 406, 406, 511, 643,
+ 2912, 493, 704, 616, 175, 493, 2912, 175, 291, 611,
+ 612, 617, 2912, 611, 2912, 585, 291, 408, 510, 406,
+ 406, 511, 390, 391, 391, 392, 704, 708, 616, 175,
+ 280, 280, 175, 737, 612, 512, 617, 280, 393, 280,
+ 519, 519, 519, 520, 627, 628, 625, 175, 2912, 626,
+
+ 630, 280, 708, 2912, 280, 280, 280, 737, 512, 512,
+ 176, 587, 280, 508, 280, 629, 280, 631, 627, 628,
+ 625, 280, 175, 626, 633, 630, 280, 619, 280, 280,
+ 175, 2912, 512, 2912, 634, 587, 635, 508, 175, 629,
+ 280, 280, 631, 2912, 636, 637, 280, 639, 175, 633,
+ 640, 619, 711, 280, 175, 175, 175, 175, 634, 644,
+ 175, 635, 175, 175, 642, 280, 645, 175, 636, 646,
+ 637, 639, 175, 175, 641, 640, 2912, 711, 2912, 175,
+ 2912, 175, 175, 647, 644, 175, 638, 175, 2912, 642,
+ 2912, 645, 175, 646, 294, 724, 2912, 175, 641, 162,
+
+ 162, 162, 163, 162, 162, 162, 163, 647, 652, 2912,
+ 2912, 175, 280, 556, 556, 556, 556, 280, 698, 150,
+ 724, 672, 280, 150, 560, 560, 560, 560, 657, 657,
+ 657, 657, 2912, 652, 557, 673, 175, 280, 650, 726,
+ 2912, 651, 280, 698, 2912, 557, 672, 280, 291, 557,
+ 566, 566, 566, 566, 656, 2912, 695, 291, 656, 673,
+ 2912, 2912, 650, 2912, 726, 651, 572, 572, 572, 572,
+ 2912, 2912, 2912, 291, 2912, 2912, 2912, 573, 2912, 656,
+ 695, 291, 2912, 656, 232, 562, 556, 562, 562, 232,
+ 658, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+
+ 232, 232, 232, 232, 232, 232, 563, 232, 232, 232,
+ 572, 572, 572, 572, 154, 154, 154, 154, 175, 732,
+ 2912, 573, 154, 154, 154, 154, 579, 579, 579, 579,
+ 2912, 2912, 706, 232, 279, 390, 391, 391, 392, 2912,
+ 291, 715, 279, 175, 732, 280, 279, 674, 2912, 291,
+ 680, 393, 390, 391, 391, 392, 706, 232, 232, 565,
+ 565, 565, 565, 618, 675, 291, 715, 2912, 393, 156,
+ 280, 2912, 674, 291, 680, 676, 175, 390, 391, 391,
+ 392, 734, 677, 2912, 699, 2912, 661, 618, 675, 662,
+ 663, 291, 664, 393, 156, 665, 175, 2912, 679, 676,
+
+ 291, 175, 390, 391, 391, 392, 734, 677, 699, 710,
+ 678, 661, 2912, 2912, 662, 663, 291, 664, 393, 665,
+ 754, 175, 679, 2912, 291, 390, 391, 391, 392, 589,
+ 590, 591, 589, 710, 2912, 678, 589, 590, 591, 589,
+ 681, 393, 2912, 280, 754, 592, 590, 590, 590, 590,
+ 175, 2912, 592, 589, 590, 591, 589, 589, 590, 591,
+ 589, 716, 755, 757, 681, 725, 682, 683, 280, 592,
+ 2912, 2912, 2912, 685, 280, 175, 684, 496, 390, 391,
+ 391, 392, 2912, 714, 683, 716, 497, 755, 757, 725,
+ 682, 2912, 683, 684, 393, 390, 391, 391, 392, 280,
+
+ 684, 2912, 496, 598, 599, 600, 598, 714, 2912, 683,
+ 497, 393, 598, 599, 600, 598, 688, 684, 2912, 601,
+ 2912, 756, 599, 599, 599, 599, 660, 2912, 601, 2912,
+ 2912, 2912, 598, 599, 600, 598, 689, 2912, 2912, 707,
+ 688, 175, 291, 690, 696, 756, 2912, 2912, 601, 291,
+ 660, 291, 691, 491, 598, 599, 600, 598, 291, 280,
+ 689, 697, 492, 690, 707, 2912, 175, 291, 690, 696,
+ 692, 718, 691, 2912, 291, 291, 691, 2912, 491, 2912,
+ 2912, 758, 291, 280, 280, 697, 492, 717, 690, 162,
+ 162, 162, 163, 175, 2912, 718, 691, 390, 391, 391,
+
+ 392, 390, 391, 391, 392, 703, 758, 291, 280, 150,
+ 759, 731, 717, 393, 2912, 2912, 291, 393, 175, 162,
+ 162, 162, 163, 162, 162, 162, 163, 280, 702, 2912,
+ 703, 701, 291, 762, 759, 731, 596, 2912, 508, 150,
+ 291, 712, 713, 150, 280, 280, 719, 280, 709, 720,
+ 280, 175, 280, 702, 721, 701, 723, 762, 705, 280,
+ 596, 730, 508, 673, 778, 712, 280, 713, 2912, 280,
+ 280, 719, 280, 709, 720, 280, 175, 722, 721, 760,
+ 175, 723, 705, 2912, 280, 730, 2912, 673, 778, 727,
+ 761, 280, 172, 172, 172, 173, 728, 728, 728, 729,
+
+ 2912, 722, 175, 2912, 760, 175, 735, 736, 162, 162,
+ 162, 163, 176, 727, 763, 761, 784, 733, 162, 162,
+ 162, 163, 175, 777, 764, 175, 280, 175, 150, 741,
+ 735, 736, 2912, 742, 742, 742, 742, 2912, 150, 763,
+ 784, 733, 783, 786, 2912, 738, 739, 175, 777, 764,
+ 175, 280, 291, 741, 557, 2912, 654, 654, 654, 654,
+ 2912, 740, 744, 744, 744, 744, 2912, 783, 786, 738,
+ 739, 280, 742, 742, 742, 742, 291, 2912, 742, 742,
+ 742, 742, 2912, 2912, 765, 740, 656, 154, 154, 154,
+ 154, 790, 656, 557, 2912, 2912, 280, 156, 2912, 557,
+
+ 797, 794, 796, 154, 154, 154, 154, 279, 765, 2912,
+ 800, 656, 789, 802, 766, 790, 745, 656, 390, 391,
+ 391, 392, 156, 279, 797, 2912, 794, 796, 2912, 294,
+ 390, 391, 391, 392, 393, 800, 789, 2912, 802, 766,
+ 745, 657, 657, 657, 657, 767, 393, 2912, 2912, 390,
+ 391, 391, 392, 162, 162, 162, 163, 768, 280, 771,
+ 806, 291, 557, 769, 280, 393, 788, 803, 746, 767,
+ 291, 747, 748, 150, 749, 808, 2912, 750, 2912, 2912,
+ 2912, 768, 2912, 280, 771, 806, 291, 2912, 769, 280,
+ 788, 803, 770, 746, 291, 791, 747, 748, 2912, 749,
+
+ 808, 750, 232, 751, 742, 751, 751, 232, 752, 232,
+ 232, 232, 232, 232, 232, 232, 770, 291, 232, 791,
+ 232, 819, 175, 232, 563, 2912, 291, 2912, 2912, 772,
+ 390, 391, 391, 392, 818, 175, 390, 391, 391, 392,
+ 2912, 2912, 291, 2912, 175, 819, 393, 175, 799, 820,
+ 291, 232, 393, 772, 589, 590, 591, 589, 818, 773,
+ 175, 589, 590, 591, 589, 589, 590, 591, 589, 175,
+ 592, 2912, 799, 291, 820, 232, 232, 592, 2912, 774,
+ 785, 685, 291, 775, 773, 390, 391, 391, 392, 390,
+ 391, 391, 392, 598, 599, 600, 598, 2912, 291, 2912,
+
+ 776, 393, 821, 774, 785, 393, 291, 2912, 775, 601,
+ 598, 599, 600, 598, 779, 598, 599, 600, 598, 291,
+ 720, 280, 781, 280, 776, 280, 601, 821, 291, 825,
+ 832, 692, 780, 804, 833, 787, 2912, 2912, 2912, 779,
+ 801, 834, 291, 2912, 291, 720, 280, 781, 280, 782,
+ 280, 291, 291, 793, 825, 832, 780, 804, 833, 787,
+ 390, 391, 391, 392, 801, 834, 2912, 291, 162, 162,
+ 162, 163, 810, 782, 175, 291, 393, 793, 519, 519,
+ 519, 520, 162, 162, 162, 163, 280, 280, 150, 792,
+ 728, 728, 728, 729, 809, 795, 175, 810, 280, 175,
+
+ 175, 175, 150, 835, 805, 2912, 836, 175, 2912, 812,
+ 811, 280, 280, 807, 792, 813, 2912, 2912, 809, 280,
+ 795, 175, 798, 280, 2912, 175, 175, 835, 805, 175,
+ 836, 2912, 175, 812, 811, 843, 837, 807, 814, 813,
+ 728, 728, 728, 728, 280, 2912, 798, 728, 728, 728,
+ 729, 2912, 2912, 2912, 175, 815, 815, 815, 816, 843,
+ 176, 837, 814, 728, 728, 728, 817, 176, 162, 162,
+ 162, 163, 861, 162, 162, 162, 163, 162, 162, 162,
+ 163, 2912, 2912, 2912, 175, 2912, 2912, 869, 150, 2912,
+ 2912, 884, 175, 150, 908, 2912, 861, 150, 742, 742,
+
+ 742, 742, 175, 823, 742, 742, 742, 742, 822, 175,
+ 824, 869, 744, 744, 744, 744, 884, 175, 908, 557,
+ 742, 742, 742, 742, 2912, 557, 2912, 175, 823, 2912,
+ 2912, 2912, 822, 2912, 280, 824, 742, 742, 742, 742,
+ 2912, 557, 910, 892, 742, 742, 742, 742, 742, 742,
+ 742, 742, 2912, 742, 742, 742, 742, 557, 826, 280,
+ 890, 827, 280, 2912, 280, 557, 910, 892, 2912, 557,
+ 742, 742, 742, 742, 557, 2912, 896, 829, 742, 742,
+ 742, 742, 826, 828, 2912, 890, 827, 280, 745, 280,
+ 898, 557, 831, 751, 742, 751, 751, 2912, 356, 557,
+
+ 830, 896, 829, 579, 579, 579, 579, 828, 838, 838,
+ 838, 838, 745, 2912, 563, 898, 831, 920, 2912, 839,
+ 175, 907, 294, 279, 2912, 830, 232, 751, 742, 751,
+ 751, 232, 752, 232, 232, 232, 232, 232, 232, 232,
+ 2912, 920, 232, 2912, 232, 175, 907, 232, 563, 840,
+ 840, 840, 841, 519, 519, 519, 520, 2912, 2912, 876,
+ 842, 844, 844, 844, 845, 846, 846, 846, 847, 2912,
+ 2912, 2912, 842, 2912, 2912, 232, 842, 2912, 390, 391,
+ 391, 392, 280, 876, 909, 279, 390, 391, 391, 392,
+ 280, 2912, 2912, 921, 393, 862, 862, 862, 862, 232,
+
+ 232, 291, 393, 390, 391, 391, 392, 280, 923, 909,
+ 291, 851, 2912, 2912, 2912, 280, 848, 849, 921, 393,
+ 852, 853, 853, 854, 280, 2912, 291, 390, 391, 391,
+ 392, 2912, 923, 894, 291, 851, 856, 857, 857, 858,
+ 848, 922, 849, 393, 2912, 589, 590, 591, 589, 280,
+ 850, 291, 393, 589, 590, 591, 589, 894, 2912, 2912,
+ 291, 592, 390, 391, 391, 392, 922, 2912, 855, 592,
+ 864, 865, 865, 866, 850, 946, 291, 952, 393, 598,
+ 599, 600, 598, 859, 291, 2912, 393, 914, 598, 599,
+ 600, 598, 855, 2912, 860, 601, 870, 870, 870, 870,
+
+ 946, 175, 952, 863, 601, 2912, 929, 859, 871, 280,
+ 291, 291, 840, 840, 840, 841, 2912, 867, 860, 291,
+ 291, 895, 981, 842, 872, 2912, 175, 863, 2912, 868,
+ 929, 2912, 2912, 871, 280, 291, 291, 873, 874, 874,
+ 875, 867, 2912, 291, 291, 895, 981, 2912, 872, 880,
+ 880, 880, 881, 868, 877, 846, 877, 878, 984, 280,
+ 842, 742, 742, 742, 742, 879, 280, 291, 291, 150,
+ 390, 391, 391, 392, 1001, 2912, 291, 291, 883, 2912,
+ 891, 156, 557, 984, 280, 2912, 393, 162, 162, 162,
+ 163, 280, 291, 291, 886, 886, 886, 886, 1001, 280,
+
+ 291, 291, 883, 916, 891, 887, 156, 150, 888, 888,
+ 888, 889, 882, 893, 1003, 175, 885, 2912, 2912, 887,
+ 844, 844, 844, 845, 280, 175, 987, 916, 150, 897,
+ 1013, 842, 815, 815, 815, 816, 882, 893, 1003, 899,
+ 175, 885, 728, 728, 728, 817, 914, 175, 1002, 175,
+ 175, 987, 2912, 897, 1013, 815, 815, 815, 815, 2912,
+ 280, 280, 2912, 899, 815, 815, 815, 816, 2912, 2912,
+ 2912, 280, 175, 1002, 175, 176, 840, 840, 840, 840,
+ 742, 742, 742, 742, 176, 280, 280, 162, 162, 162,
+ 163, 2912, 904, 904, 904, 905, 280, 900, 900, 900,
+
+ 901, 557, 902, 162, 162, 162, 163, 150, 2912, 2912,
+ 174, 174, 176, 174, 140, 174, 175, 176, 906, 174,
+ 174, 174, 1080, 150, 1007, 2912, 911, 162, 162, 162,
+ 163, 742, 742, 742, 742, 291, 912, 939, 742, 742,
+ 742, 742, 1012, 906, 291, 1092, 1080, 150, 1027, 1007,
+ 911, 2912, 557, 742, 742, 742, 742, 280, 915, 557,
+ 291, 912, 939, 742, 742, 742, 742, 1012, 291, 1092,
+ 913, 983, 1035, 1027, 557, 838, 838, 838, 838, 917,
+ 1095, 2912, 280, 915, 557, 2912, 839, 838, 838, 838,
+ 838, 918, 1036, 1043, 913, 983, 2912, 1035, 839, 2912,
+
+ 280, 2912, 919, 917, 1095, 924, 924, 924, 925, 927,
+ 927, 927, 928, 1103, 1094, 918, 926, 1036, 1043, 2912,
+ 926, 844, 844, 844, 844, 280, 919, 930, 930, 930,
+ 931, 846, 846, 846, 846, 2912, 2912, 1103, 926, 1094,
+ 2912, 176, 932, 932, 932, 933, 2912, 176, 1106, 1122,
+ 2912, 279, 2912, 926, 390, 391, 391, 392, 390, 391,
+ 391, 392, 279, 936, 937, 937, 938, 2912, 2912, 2912,
+ 393, 291, 1106, 1122, 393, 852, 853, 853, 852, 393,
+ 291, 954, 1107, 934, 1115, 852, 853, 853, 852, 280,
+ 2912, 389, 852, 853, 853, 854, 291, 390, 391, 391,
+
+ 392, 389, 935, 985, 291, 954, 496, 1107, 934, 1115,
+ 1127, 1161, 940, 393, 280, 497, 496, 856, 857, 857,
+ 856, 2912, 940, 2912, 2912, 497, 935, 985, 2912, 941,
+ 942, 496, 1162, 393, 1127, 1161, 940, 2912, 2912, 497,
+ 2912, 496, 877, 846, 877, 877, 940, 294, 491, 497,
+ 1133, 958, 175, 941, 940, 942, 1162, 492, 856, 857,
+ 857, 856, 157, 589, 590, 591, 589, 988, 856, 857,
+ 857, 858, 958, 491, 393, 1133, 958, 175, 940, 592,
+ 1175, 492, 1059, 1176, 393, 589, 590, 591, 589, 491,
+ 175, 988, 944, 958, 2912, 940, 1138, 958, 492, 493,
+
+ 1147, 592, 1084, 1116, 1175, 943, 1059, 1176, 494, 862,
+ 862, 862, 862, 2912, 491, 175, 2912, 944, 958, 940,
+ 2912, 1138, 492, 1156, 493, 1147, 1084, 1116, 945, 943,
+ 280, 1159, 494, 390, 391, 391, 392, 864, 865, 865,
+ 864, 864, 865, 865, 864, 1082, 947, 2912, 1156, 393,
+ 1172, 1178, 945, 393, 1182, 280, 1159, 393, 864, 865,
+ 865, 866, 966, 967, 966, 966, 948, 294, 491, 1082,
+ 947, 291, 491, 968, 947, 1172, 1178, 492, 947, 1182,
+ 1123, 492, 2912, 598, 599, 600, 598, 598, 599, 600,
+ 598, 948, 1213, 491, 2912, 949, 291, 491, 947, 601,
+
+ 2912, 492, 947, 601, 1123, 492, 870, 870, 870, 870,
+ 2912, 291, 950, 862, 862, 862, 862, 1213, 953, 949,
+ 291, 1214, 955, 956, 956, 957, 880, 880, 880, 880,
+ 951, 2912, 955, 956, 956, 957, 291, 950, 389, 1224,
+ 2912, 2912, 953, 940, 291, 1214, 150, 2912, 389, 955,
+ 956, 956, 961, 959, 951, 886, 886, 886, 886, 1229,
+ 962, 962, 960, 959, 1224, 389, 887, 940, 390, 391,
+ 391, 392, 960, 2912, 969, 932, 969, 970, 959, 294,
+ 964, 1228, 1239, 1229, 393, 971, 960, 1240, 959, 965,
+ 972, 927, 972, 973, 157, 294, 960, 974, 974, 974,
+
+ 975, 971, 958, 958, 2912, 964, 1228, 1239, 926, 2912,
+ 976, 1240, 2912, 965, 2912, 1141, 1225, 150, 977, 978,
+ 978, 979, 162, 162, 162, 163, 2912, 958, 958, 980,
+ 888, 888, 888, 888, 976, 888, 888, 888, 889, 1141,
+ 1225, 887, 150, 2912, 2912, 1254, 887, 962, 2912, 291,
+ 150, 900, 900, 900, 900, 150, 2912, 1121, 291, 2912,
+ 900, 900, 900, 901, 982, 991, 989, 989, 989, 990,
+ 1254, 176, 962, 1248, 291, 2912, 2912, 140, 2912, 140,
+ 176, 1121, 291, 742, 742, 742, 742, 2912, 982, 900,
+ 900, 900, 901, 2912, 902, 175, 2912, 1248, 162, 162,
+
+ 162, 163, 174, 174, 557, 174, 140, 174, 280, 176,
+ 2912, 174, 174, 174, 993, 993, 993, 993, 150, 2912,
+ 175, 904, 904, 904, 904, 995, 2912, 2912, 2912, 1005,
+ 904, 904, 904, 905, 279, 996, 996, 996, 997, 1273,
+ 994, 176, 870, 870, 870, 870, 995, 999, 994, 994,
+ 176, 994, 140, 994, 1005, 176, 906, 994, 994, 994,
+ 162, 162, 162, 163, 1273, 2912, 162, 162, 162, 163,
+ 2912, 2912, 999, 2912, 162, 162, 162, 163, 1253, 2912,
+ 150, 906, 742, 742, 742, 742, 150, 742, 742, 742,
+ 742, 2912, 2912, 2912, 150, 742, 742, 742, 742, 1000,
+
+ 2912, 2912, 1253, 557, 1004, 2912, 2912, 2912, 557, 2912,
+ 2912, 1009, 1069, 1070, 1070, 1071, 557, 1276, 1276, 1276,
+ 1276, 1006, 2912, 1000, 900, 900, 900, 901, 1004, 902,
+ 1008, 742, 742, 742, 742, 1011, 1009, 174, 174, 2912,
+ 174, 140, 174, 175, 176, 1006, 174, 174, 174, 2912,
+ 2912, 2912, 557, 1297, 1008, 924, 924, 924, 925, 1011,
+ 1010, 924, 924, 924, 925, 2912, 926, 927, 927, 927,
+ 928, 280, 926, 927, 927, 927, 928, 1297, 926, 967,
+ 967, 967, 967, 1155, 926, 1010, 930, 930, 930, 1015,
+ 1014, 930, 930, 930, 931, 2912, 280, 926, 932, 932,
+
+ 932, 933, 926, 2912, 2912, 2912, 176, 1155, 1277, 926,
+ 1298, 176, 932, 932, 932, 933, 2912, 1281, 279, 390,
+ 391, 391, 392, 926, 390, 391, 391, 392, 1018, 1019,
+ 1019, 1020, 279, 1277, 1298, 393, 1310, 1026, 2912, 1285,
+ 393, 291, 1281, 2912, 393, 1018, 1019, 1019, 1020, 2912,
+ 291, 1018, 1019, 1019, 1023, 1295, 2912, 1016, 2912, 1021,
+ 1310, 393, 1026, 1028, 1285, 1017, 291, 393, 1022, 291,
+ 390, 391, 391, 392, 291, 1302, 1021, 2912, 291, 2912,
+ 1295, 1016, 1024, 958, 1021, 1022, 393, 2912, 1028, 1017,
+ 1311, 1025, 1022, 1134, 291, 1317, 1361, 1029, 2912, 1319,
+
+ 1302, 1021, 291, 390, 391, 391, 392, 1024, 958, 1022,
+ 589, 590, 591, 589, 1311, 1025, 2912, 1134, 1320, 393,
+ 1317, 1361, 1029, 1319, 1332, 2912, 592, 2912, 1030, 1032,
+ 1033, 1034, 1032, 390, 391, 391, 392, 1045, 390, 391,
+ 391, 392, 1320, 291, 1367, 592, 2912, 958, 1332, 393,
+ 1337, 1031, 291, 1030, 393, 598, 599, 600, 598, 1181,
+ 1037, 291, 1045, 1038, 1040, 1041, 1042, 1040, 291, 1367,
+ 291, 601, 958, 1044, 1337, 1031, 291, 2912, 2912, 1391,
+ 601, 1338, 2912, 1181, 2912, 1037, 291, 2912, 1038, 2912,
+ 955, 956, 956, 957, 291, 2912, 1039, 1044, 1356, 1406,
+
+ 955, 956, 956, 957, 1391, 1338, 389, 1046, 1047, 1047,
+ 1048, 1052, 1053, 1053, 1054, 1392, 389, 2912, 2912, 958,
+ 1039, 959, 1356, 1049, 1406, 1407, 2912, 1055, 2912, 1139,
+ 960, 959, 966, 967, 966, 966, 291, 294, 1050, 1392,
+ 960, 958, 1056, 968, 958, 291, 959, 1051, 1131, 1407,
+ 1140, 1057, 1417, 1139, 960, 2912, 959, 1052, 1053, 1053,
+ 1054, 291, 2912, 1050, 960, 2912, 958, 1056, 1418, 291,
+ 1430, 1051, 1131, 1055, 1140, 1057, 2912, 1417, 1046, 1047,
+ 1047, 1060, 967, 967, 967, 967, 1058, 958, 1056, 962,
+ 962, 2912, 1418, 1014, 1049, 1430, 1180, 1057, 1063, 1064,
+
+ 1064, 1065, 2912, 962, 1069, 1070, 1070, 1071, 2912, 1061,
+ 2912, 1058, 958, 1056, 1066, 1185, 1434, 2912, 1062, 1438,
+ 1180, 1057, 2912, 2912, 1069, 1070, 1070, 1071, 962, 1067,
+ 1069, 1070, 1070, 1071, 1061, 1072, 2912, 2912, 1068, 1185,
+ 1434, 962, 1062, 1438, 1073, 969, 932, 969, 970, 2912,
+ 294, 1148, 2912, 1074, 1067, 1072, 971, 1444, 1437, 1443,
+ 1072, 1072, 1068, 2912, 1073, 157, 962, 958, 1073, 1075,
+ 1073, 969, 932, 969, 970, 1148, 294, 1179, 1074, 2912,
+ 1072, 1444, 971, 1437, 1443, 2912, 1072, 1445, 1073, 2912,
+ 2912, 157, 958, 1075, 1073, 972, 927, 972, 973, 1451,
+
+ 294, 1179, 972, 927, 972, 973, 971, 294, 974, 974,
+ 974, 1076, 1445, 971, 974, 974, 974, 975, 2912, 926,
+ 1077, 1078, 1078, 1079, 1451, 926, 1432, 1433, 150, 2912,
+ 1446, 980, 1452, 2912, 150, 2912, 393, 977, 978, 978,
+ 977, 977, 978, 978, 977, 962, 2912, 2912, 1014, 2912,
+ 1432, 1433, 1014, 389, 1446, 1183, 1452, 389, 977, 978,
+ 978, 979, 390, 391, 391, 392, 962, 958, 496, 980,
+ 962, 958, 496, 980, 1480, 1184, 1211, 497, 393, 1183,
+ 1222, 497, 162, 162, 162, 163, 989, 989, 989, 990,
+ 2912, 962, 958, 496, 2912, 2912, 958, 496, 1480, 1184,
+
+ 1211, 497, 150, 1491, 1222, 497, 989, 989, 989, 989,
+ 2912, 989, 989, 989, 990, 280, 1085, 1499, 1087, 1087,
+ 1087, 1087, 1506, 1508, 1081, 2912, 176, 1491, 140, 995,
+ 140, 176, 1513, 993, 993, 993, 993, 1514, 2912, 958,
+ 280, 1499, 2912, 1399, 995, 958, 1506, 1508, 1081, 996,
+ 996, 996, 997, 279, 994, 1509, 1513, 1212, 1518, 2912,
+ 995, 1514, 994, 994, 958, 994, 140, 994, 1399, 176,
+ 958, 994, 994, 994, 900, 900, 900, 901, 2912, 902,
+ 1509, 1212, 1518, 162, 162, 162, 163, 174, 174, 1510,
+ 174, 140, 174, 280, 176, 958, 174, 174, 174, 1089,
+
+ 1089, 1089, 1090, 150, 1088, 1246, 1246, 1246, 1247, 1282,
+ 995, 1093, 1088, 1088, 1510, 1088, 140, 1088, 2912, 150,
+ 958, 1088, 1088, 1088, 993, 993, 993, 993, 996, 996,
+ 996, 996, 1530, 1282, 175, 995, 1093, 2912, 2912, 995,
+ 996, 996, 996, 997, 279, 2912, 2912, 1519, 176, 2912,
+ 2912, 995, 1520, 162, 162, 162, 163, 1530, 2912, 175,
+ 176, 996, 996, 996, 997, 2912, 994, 162, 162, 162,
+ 163, 1519, 995, 150, 994, 994, 1520, 994, 140, 994,
+ 1548, 176, 1097, 994, 994, 994, 1521, 150, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742, 742, 742,
+
+ 2912, 930, 930, 930, 1015, 1548, 1525, 1097, 1526, 557,
+ 1521, 1098, 926, 557, 2912, 2912, 2912, 557, 2912, 2912,
+ 2912, 176, 1087, 1087, 1087, 1087, 2912, 2912, 2912, 1104,
+ 1525, 2912, 1526, 995, 2912, 1098, 1096, 1099, 162, 1099,
+ 1100, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1096, 1096, 1096, 1104, 1096, 958, 1102, 1096, 1096,
+ 1096, 1096, 742, 742, 742, 742, 2912, 1550, 390, 391,
+ 391, 392, 390, 391, 391, 392, 1018, 1019, 1019, 1020,
+ 1551, 958, 2912, 557, 393, 1096, 2912, 1552, 393, 2912,
+ 1563, 1550, 393, 974, 974, 974, 1076, 1109, 1018, 1019,
+
+ 1019, 1020, 2912, 1105, 926, 1551, 1573, 1021, 2912, 1096,
+ 1096, 1108, 1552, 150, 393, 1563, 1022, 1110, 1111, 1111,
+ 1112, 2912, 1109, 856, 857, 857, 858, 1105, 291, 1021,
+ 1203, 1573, 1021, 1066, 2912, 1108, 1578, 291, 1022, 393,
+ 1022, 2912, 2912, 1110, 1111, 1111, 1117, 958, 1113, 1063,
+ 1064, 1064, 1065, 291, 1021, 1203, 2912, 1114, 1559, 1066,
+ 1578, 291, 1022, 2912, 2912, 1066, 852, 853, 853, 854,
+ 2912, 2912, 958, 1113, 1118, 2912, 962, 962, 1120, 1118,
+ 1067, 1114, 1559, 1119, 390, 391, 391, 392, 1119, 1068,
+ 1286, 2912, 589, 590, 591, 589, 1486, 291, 958, 1118,
+
+ 393, 962, 962, 1120, 1118, 1067, 291, 1119, 592, 2912,
+ 2912, 2912, 1119, 1068, 1286, 1032, 1033, 1034, 1032, 2912,
+ 2912, 1486, 291, 958, 1124, 1125, 1033, 1033, 1033, 1033,
+ 291, 592, 2912, 1032, 1033, 1034, 1032, 864, 865, 865,
+ 866, 1580, 162, 162, 162, 163, 683, 1576, 1124, 592,
+ 1125, 2912, 1126, 393, 1582, 684, 958, 496, 390, 391,
+ 391, 392, 150, 940, 683, 1580, 497, 1586, 1223, 1590,
+ 1126, 683, 1576, 684, 393, 1581, 1126, 1592, 1582, 684,
+ 2912, 958, 496, 598, 599, 600, 598, 940, 2912, 683,
+ 497, 1586, 1223, 1590, 1126, 1585, 2912, 684, 1128, 601,
+
+ 1581, 1592, 1040, 1041, 1042, 1040, 1041, 1041, 1041, 1041,
+ 1087, 1087, 1087, 1087, 1596, 2912, 1129, 2912, 601, 1589,
+ 1585, 995, 1128, 962, 1040, 1041, 1042, 1040, 873, 874,
+ 874, 875, 1237, 690, 2912, 2912, 2912, 491, 1596, 1130,
+ 601, 1129, 691, 947, 1589, 2912, 492, 2912, 962, 1089,
+ 1089, 1089, 1089, 2912, 2912, 690, 1237, 1591, 690, 291,
+ 995, 1130, 491, 1130, 691, 958, 691, 947, 291, 150,
+ 492, 1046, 1047, 1047, 1048, 1046, 1047, 1047, 1048, 1296,
+ 690, 1600, 1591, 1595, 291, 1130, 1614, 1049, 691, 962,
+ 958, 1049, 291, 1046, 1047, 1047, 1048, 1052, 1053, 1053,
+
+ 1052, 1238, 1050, 1296, 1602, 1600, 1050, 2912, 1595, 1049,
+ 1614, 1051, 1621, 1055, 962, 1051, 1052, 1053, 1053, 1052,
+ 1069, 1070, 1070, 1071, 1050, 1238, 2912, 1050, 1135, 1602,
+ 1620, 1050, 1055, 1051, 1656, 1051, 1621, 1136, 2912, 1051,
+ 2912, 2912, 1069, 1070, 1070, 1071, 2912, 1135, 2912, 1050,
+ 1633, 1072, 2912, 1135, 2912, 1620, 1136, 1051, 1656, 1143,
+ 1073, 1136, 1063, 1064, 1064, 1063, 1186, 1186, 1186, 1186,
+ 958, 1142, 1135, 1072, 2912, 1633, 1072, 1187, 1066, 1279,
+ 1136, 2912, 1073, 1143, 1073, 1063, 1064, 1064, 1063, 1069,
+ 1070, 1070, 1069, 1144, 2912, 958, 1142, 1534, 1072, 958,
+
+ 2912, 1066, 1145, 1279, 2912, 1049, 1073, 1069, 1070, 1070,
+ 1069, 1069, 1070, 1070, 1071, 2912, 1144, 2912, 1144, 962,
+ 1149, 1643, 1534, 1049, 958, 1145, 1145, 2912, 1283, 1150,
+ 1069, 1070, 1070, 1071, 1099, 162, 1099, 1099, 1149, 1348,
+ 1151, 1144, 1072, 1657, 962, 1149, 1643, 1150, 1349, 1145,
+ 1658, 1073, 1283, 1150, 1102, 2912, 2912, 1069, 1070, 1070,
+ 1071, 1072, 958, 1149, 1348, 1151, 1663, 1072, 1657, 1152,
+ 1073, 1150, 1349, 2912, 1658, 1073, 1069, 1070, 1070, 1071,
+ 1077, 1078, 1078, 1077, 1669, 2912, 1072, 958, 1072, 2912,
+ 1663, 1014, 2912, 1152, 1073, 1153, 393, 1073, 1077, 1078,
+
+ 1078, 1077, 936, 937, 937, 938, 958, 1072, 1669, 1014,
+ 1464, 491, 958, 1072, 393, 1671, 1073, 1154, 393, 1153,
+ 492, 1073, 1089, 1089, 1089, 1090, 2912, 2912, 1538, 491,
+ 962, 958, 1072, 995, 2912, 1464, 491, 958, 492, 1671,
+ 1073, 1154, 150, 2912, 492, 1077, 1078, 1078, 1079, 162,
+ 162, 162, 163, 1538, 491, 962, 980, 162, 162, 162,
+ 163, 393, 492, 2912, 162, 162, 162, 163, 1677, 150,
+ 2912, 2912, 742, 742, 742, 742, 493, 150, 742, 742,
+ 742, 742, 958, 962, 150, 494, 2912, 1192, 1193, 1193,
+ 1194, 962, 1677, 557, 1280, 1163, 1160, 1174, 1191, 557,
+
+ 1725, 493, 2912, 393, 2912, 1164, 1733, 958, 962, 494,
+ 996, 996, 996, 997, 1737, 994, 962, 1173, 1280, 1163,
+ 1160, 995, 1174, 994, 994, 1725, 994, 140, 994, 1164,
+ 176, 1733, 994, 994, 994, 162, 162, 162, 163, 1737,
+ 1157, 1173, 2912, 1197, 1197, 1197, 1197, 1739, 1157, 1157,
+ 1743, 1157, 140, 1157, 1187, 150, 2912, 1157, 1157, 1157,
+ 1089, 1089, 1089, 1090, 2912, 1088, 1329, 1329, 1329, 1329,
+ 2912, 995, 1739, 1088, 1088, 1743, 1088, 140, 1088, 1684,
+ 150, 1685, 1088, 1088, 1088, 1096, 1099, 162, 1099, 1100,
+ 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096,
+
+ 1096, 1096, 1096, 1684, 1096, 1685, 1102, 1096, 1096, 1096,
+ 1096, 1198, 1199, 1199, 1200, 2912, 1249, 1249, 1249, 1250,
+ 962, 1251, 1191, 1260, 387, 1261, 1262, 393, 390, 391,
+ 391, 392, 1284, 140, 1096, 140, 150, 2912, 2912, 1263,
+ 1186, 1186, 1186, 1186, 393, 962, 1188, 1189, 1189, 1190,
+ 2912, 1187, 1276, 1276, 1276, 1276, 1284, 1191, 1096, 1096,
+ 1096, 1165, 288, 1166, 1167, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1096, 1168, 1168, 1096, 1096, 1096, 1096, 1169, 1096,
+ 1169, 1096, 1096, 1096, 1096, 1096, 1169, 1169, 1170, 1169,
+ 1171, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169,
+
+ 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1096,
+ 1169, 1169, 1169, 1170, 1169, 1171, 1169, 1169, 1169, 1169,
+ 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169,
+ 1169, 1169, 1169, 1096, 1096, 390, 391, 391, 392, 1110,
+ 1111, 1111, 1112, 1110, 1111, 1111, 1112, 1197, 1197, 1197,
+ 1197, 393, 2912, 1726, 2912, 1066, 1799, 958, 1187, 1066,
+ 1110, 1111, 1111, 1112, 2912, 1110, 1111, 1111, 1117, 1304,
+ 1113, 2912, 2912, 962, 1113, 2912, 1066, 1726, 1177, 1114,
+ 1799, 1066, 958, 1114, 1572, 2912, 1188, 1189, 1189, 1190,
+ 1757, 1113, 2912, 1304, 2912, 1113, 1118, 1191, 962, 1113,
+
+ 1114, 2912, 1177, 1114, 2912, 1119, 2912, 1114, 1572, 589,
+ 590, 591, 589, 2912, 2912, 1757, 1113, 291, 962, 291,
+ 958, 1118, 1470, 962, 1114, 592, 291, 1289, 291, 1119,
+ 589, 590, 591, 589, 2912, 958, 1195, 598, 599, 600,
+ 598, 1800, 291, 962, 291, 958, 592, 1470, 962, 1303,
+ 291, 1289, 291, 601, 1810, 1196, 598, 599, 600, 598,
+ 958, 1195, 2912, 1812, 1201, 1800, 1813, 1205, 1206, 1207,
+ 1205, 2912, 601, 1303, 1216, 1217, 1218, 1216, 2912, 1810,
+ 1196, 1202, 2912, 1208, 1069, 1070, 1070, 1071, 1812, 1201,
+ 1219, 1813, 1863, 2912, 1069, 1070, 1070, 1071, 1209, 2912,
+
+ 2912, 1231, 1232, 1233, 1231, 1220, 1202, 1210, 1817, 2912,
+ 1032, 1033, 1034, 1032, 1221, 1072, 1863, 1234, 1357, 1357,
+ 1357, 1357, 1226, 1209, 1073, 1072, 592, 1864, 2912, 2912,
+ 1220, 1210, 1235, 1817, 1073, 1227, 2912, 2912, 1221, 557,
+ 1072, 1236, 1069, 1070, 1070, 1071, 1226, 2912, 1073, 2912,
+ 1072, 1864, 1069, 1070, 1070, 1071, 2912, 1235, 1073, 1227,
+ 1818, 162, 162, 162, 163, 1236, 1819, 2912, 2912, 1069,
+ 1070, 1070, 1071, 1072, 1069, 1070, 1070, 1071, 2912, 2912,
+ 1241, 150, 1073, 1072, 2912, 1818, 1256, 2912, 962, 2912,
+ 1820, 1819, 1073, 1242, 1040, 1041, 1042, 1040, 1072, 1824,
+
+ 1072, 2912, 1318, 1243, 1241, 1072, 1073, 1857, 1072, 1073,
+ 601, 1256, 1244, 962, 1073, 1820, 1073, 1242, 390, 391,
+ 391, 392, 2912, 2912, 1824, 1072, 1318, 2912, 1243, 958,
+ 1072, 2912, 1857, 1073, 393, 1883, 1244, 2912, 1073, 172,
+ 172, 172, 173, 1362, 174, 1882, 162, 162, 162, 163,
+ 962, 1278, 174, 174, 958, 174, 140, 174, 2912, 176,
+ 1883, 174, 174, 174, 1368, 2912, 150, 1362, 1245, 1882,
+ 1246, 1246, 1246, 1246, 2912, 962, 1278, 742, 742, 742,
+ 742, 1249, 1249, 1249, 1249, 1895, 2912, 2912, 1368, 1255,
+ 176, 2912, 2912, 1245, 162, 162, 162, 163, 557, 1157,
+
+ 2912, 150, 1305, 1306, 1306, 1307, 2912, 1157, 1157, 1895,
+ 1157, 140, 1157, 1255, 150, 1274, 1157, 1157, 1157, 1096,
+ 1166, 288, 1166, 1257, 1096, 1096, 1096, 1096, 1096, 1096,
+ 1096, 958, 1894, 1096, 1096, 1096, 1096, 2912, 1096, 1274,
+ 1096, 1096, 1096, 1096, 1096, 1896, 958, 1258, 2912, 1259,
+ 1874, 2912, 742, 742, 742, 742, 958, 1894, 1363, 1875,
+ 1268, 395, 1269, 1270, 742, 742, 742, 742, 1096, 1896,
+ 2912, 958, 1258, 557, 1259, 1874, 1263, 1425, 1425, 1425,
+ 1425, 1358, 1363, 1875, 2912, 557, 2912, 1169, 2912, 1169,
+ 2912, 2912, 1096, 1096, 1096, 1264, 391, 1265, 1266, 1096,
+
+ 1096, 1096, 1096, 1096, 1096, 1096, 1358, 1275, 1096, 1096,
+ 1096, 1267, 1169, 1096, 1169, 1096, 1096, 1096, 1096, 1096,
+ 1268, 395, 1269, 1270, 1268, 395, 1269, 1270, 2912, 2912,
+ 2912, 1275, 2912, 962, 2912, 2912, 1263, 1898, 2912, 1547,
+ 1263, 958, 2912, 1096, 2912, 1369, 958, 1169, 958, 1169,
+ 1476, 1169, 958, 1169, 1188, 1189, 1189, 1188, 962, 1271,
+ 1386, 1898, 1272, 1604, 1547, 1187, 958, 1096, 1096, 1369,
+ 389, 958, 1169, 958, 1169, 1476, 1169, 958, 1169, 1329,
+ 1329, 1329, 1329, 1271, 1386, 496, 1272, 1604, 1188, 1189,
+ 1189, 1188, 2912, 2912, 497, 1192, 1193, 1193, 1192, 1187,
+
+ 1425, 1425, 1425, 1425, 389, 1901, 1187, 2912, 2912, 2912,
+ 496, 393, 2912, 2912, 1192, 1193, 1193, 1192, 497, 496,
+ 589, 590, 591, 589, 1921, 1187, 491, 2912, 497, 1901,
+ 393, 1192, 1193, 1193, 1194, 492, 592, 1198, 1199, 1199,
+ 1198, 2912, 1191, 1902, 496, 491, 2912, 393, 1187, 1921,
+ 962, 491, 497, 393, 492, 1357, 1357, 1357, 1357, 492,
+ 1287, 1607, 493, 1198, 1199, 1199, 1198, 1902, 491, 2912,
+ 491, 494, 2912, 2912, 1187, 962, 557, 492, 492, 393,
+ 1198, 1199, 1199, 1200, 1287, 1607, 2912, 493, 1922, 2912,
+ 2912, 1191, 2912, 491, 491, 494, 393, 598, 599, 600,
+
+ 598, 492, 1940, 492, 1929, 2912, 958, 1205, 1206, 1207,
+ 1205, 493, 1922, 601, 1205, 1206, 1207, 1205, 1395, 491,
+ 494, 1943, 2912, 1208, 2912, 2912, 1940, 492, 962, 1929,
+ 1208, 958, 1324, 1325, 1325, 1326, 493, 1288, 1209, 2912,
+ 1412, 2912, 1395, 2912, 494, 1290, 1943, 1210, 1206, 1206,
+ 1206, 1206, 1944, 962, 1291, 1246, 1246, 1246, 1247, 2912,
+ 1327, 1288, 958, 1209, 1412, 1205, 1206, 1207, 1205, 1424,
+ 1290, 1210, 140, 1615, 140, 176, 1944, 2912, 1291, 1149,
+ 2912, 1208, 1205, 1206, 1207, 1205, 1949, 958, 1150, 1249,
+ 1249, 1249, 1250, 1424, 1251, 2912, 1290, 1615, 1292, 1205,
+
+ 1206, 1207, 1205, 1950, 1149, 1291, 140, 1951, 140, 150,
+ 2912, 1949, 1150, 1209, 2912, 1208, 291, 1205, 1206, 1207,
+ 1205, 1290, 1210, 1381, 2912, 291, 1957, 1950, 1293, 1291,
+ 1209, 2912, 1951, 1208, 1216, 1217, 1218, 1216, 1209, 1210,
+ 1952, 291, 1648, 1648, 1648, 1648, 1210, 1381, 1209, 291,
+ 1219, 1957, 2912, 1293, 2912, 1209, 1294, 1210, 1364, 1365,
+ 1365, 1366, 2912, 1210, 1952, 1220, 1216, 1217, 1218, 1216,
+ 2912, 2912, 2912, 1209, 1221, 2912, 1217, 1217, 1217, 1217,
+ 1294, 1210, 1219, 1216, 1217, 1218, 1216, 958, 2912, 1958,
+ 1220, 1962, 2912, 1216, 1217, 1218, 1216, 1220, 1221, 1219,
+
+ 162, 162, 162, 163, 2912, 2912, 1221, 1135, 2912, 1299,
+ 1968, 2912, 958, 1958, 1220, 1962, 1136, 958, 2912, 962,
+ 150, 1967, 1220, 1221, 1220, 1216, 1217, 1218, 1216, 1460,
+ 1221, 1466, 1135, 1221, 1968, 1216, 1217, 1218, 1216, 1220,
+ 1136, 1219, 958, 1333, 962, 2912, 1967, 1221, 1479, 1220,
+ 2912, 1219, 958, 1460, 1300, 1466, 1220, 1221, 1969, 2912,
+ 2912, 1069, 1070, 1070, 1071, 1221, 1220, 1333, 1370, 1371,
+ 1371, 1372, 2912, 1479, 1301, 1221, 1970, 958, 2912, 1300,
+ 2912, 1220, 1969, 1069, 1070, 1070, 1071, 2912, 2912, 1221,
+ 1308, 1220, 1072, 1231, 1232, 1233, 1231, 962, 1301, 1221,
+
+ 1970, 1073, 1997, 1231, 1232, 1233, 1231, 2912, 2912, 1234,
+ 1644, 1645, 1645, 1646, 1072, 1308, 958, 1072, 1998, 1234,
+ 1485, 1647, 962, 1073, 1235, 1073, 1309, 1997, 2912, 1232,
+ 1232, 1232, 1232, 1236, 1312, 1231, 1232, 1233, 1231, 1072,
+ 2011, 958, 1998, 1313, 2912, 1485, 2012, 1073, 2912, 1235,
+ 1309, 1234, 1231, 1232, 1233, 1231, 2912, 1236, 2019, 1312,
+ 1144, 1440, 590, 1441, 1440, 2011, 1312, 1313, 1314, 1145,
+ 2012, 1231, 1232, 1233, 1231, 1313, 2021, 1442, 1231, 1232,
+ 1233, 1231, 2019, 1235, 2912, 1144, 2020, 1234, 2912, 2912,
+ 2912, 1312, 1236, 1145, 1234, 1664, 857, 1665, 1666, 1313,
+
+ 1315, 2021, 1235, 742, 742, 742, 742, 2912, 1235, 1235,
+ 2020, 1236, 1069, 1070, 1070, 1071, 1236, 1316, 1236, 1069,
+ 1070, 1070, 1071, 2912, 557, 1315, 2029, 1235, 2912, 1069,
+ 1070, 1070, 1071, 2022, 1235, 1236, 2912, 1448, 599, 1449,
+ 1448, 1316, 1236, 1072, 1457, 1457, 1457, 1457, 1321, 1892,
+ 1072, 2029, 1073, 1450, 2027, 1322, 958, 2022, 1893, 1073,
+ 1072, 1324, 1325, 1325, 1326, 557, 2028, 1686, 1072, 1073,
+ 1323, 2912, 2912, 1321, 1892, 1072, 1073, 2912, 2027, 1322,
+ 2912, 958, 1893, 1073, 2912, 1072, 589, 590, 591, 589,
+ 2028, 1686, 1072, 1073, 1323, 390, 391, 391, 392, 2030,
+
+ 2912, 1073, 592, 1334, 480, 1335, 1336, 1373, 1374, 1375,
+ 1373, 393, 1487, 2912, 2033, 2912, 958, 1072, 1376, 598,
+ 599, 600, 598, 592, 2030, 1073, 1246, 1246, 1246, 1247,
+ 1258, 174, 1259, 2912, 1360, 601, 2912, 1487, 2033, 174,
+ 174, 958, 174, 140, 174, 1558, 176, 958, 174, 174,
+ 174, 162, 162, 162, 163, 1258, 1330, 1259, 1360, 1481,
+ 1481, 1481, 1481, 2912, 1330, 1330, 2912, 1330, 140, 1330,
+ 1558, 150, 958, 1330, 1330, 1330, 1096, 1099, 162, 1099,
+ 1100, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1096, 1096, 1096, 2912, 1096, 1482, 1102, 1096, 1096,
+
+ 1096, 1096, 1260, 387, 1261, 1262, 2912, 1260, 387, 1261,
+ 1262, 1377, 1378, 1379, 1377, 962, 2912, 2034, 1263, 1497,
+ 1482, 2038, 1380, 1263, 2039, 1096, 1498, 601, 958, 2050,
+ 962, 1535, 1531, 1339, 1571, 958, 962, 1601, 1339, 958,
+ 962, 2034, 1340, 2912, 1497, 2038, 2912, 1340, 2039, 1096,
+ 1096, 1498, 2040, 958, 2050, 962, 1535, 1531, 1339, 1571,
+ 958, 962, 1601, 1339, 958, 2912, 1340, 1341, 387, 1261,
+ 1342, 1340, 1264, 391, 1265, 1264, 2040, 1264, 391, 1265,
+ 1264, 2912, 2041, 1263, 1268, 395, 1269, 1268, 1267, 1268,
+ 395, 1269, 1268, 1267, 1258, 2912, 1259, 962, 1343, 2912,
+
+ 1263, 1536, 2057, 1346, 2912, 1263, 2041, 1344, 1346, 1539,
+ 1549, 2912, 1347, 962, 958, 1351, 2912, 1347, 2045, 1258,
+ 1351, 1259, 962, 1343, 1352, 2912, 1536, 2057, 1346, 1352,
+ 2912, 1344, 2912, 1346, 1539, 1549, 1347, 2912, 962, 958,
+ 1351, 1347, 2045, 2912, 2912, 1351, 2912, 2912, 1352, 1268,
+ 395, 1269, 1270, 1352, 1268, 395, 1269, 1270, 2912, 1205,
+ 1206, 1207, 1205, 2912, 2912, 1263, 1440, 590, 1441, 1440,
+ 1263, 1440, 590, 1441, 1440, 1208, 1169, 1605, 1169, 962,
+ 1603, 1169, 1442, 1169, 958, 1339, 2912, 1517, 1382, 962,
+ 1209, 2912, 1355, 2046, 1340, 1448, 599, 1449, 1448, 1210,
+
+ 1690, 1169, 1605, 1169, 962, 1603, 1169, 2912, 1169, 958,
+ 1339, 1450, 2055, 1382, 962, 1209, 1355, 2046, 1340, 1268,
+ 395, 1269, 1270, 1210, 1690, 2912, 2056, 1205, 1206, 1207,
+ 1205, 162, 162, 162, 163, 1263, 2055, 1205, 1206, 1207,
+ 1205, 2058, 2912, 1208, 2089, 1606, 1169, 2101, 1169, 962,
+ 2056, 150, 2069, 1292, 1938, 1939, 1353, 1354, 1209, 2912,
+ 1425, 1425, 1425, 1425, 1431, 2058, 1383, 1210, 1209, 2089,
+ 1606, 1169, 2101, 1169, 962, 2912, 2069, 1210, 1938, 1939,
+ 1353, 1354, 2912, 1209, 1205, 1206, 1207, 1205, 2912, 1431,
+ 1383, 1210, 2070, 1209, 1205, 1206, 1207, 1205, 2912, 1504,
+
+ 1208, 1210, 1387, 1388, 1388, 1389, 162, 162, 162, 163,
+ 1208, 1216, 1217, 1218, 1216, 1209, 2070, 2082, 1427, 1427,
+ 1427, 1427, 1384, 1504, 1210, 1209, 150, 1299, 2912, 2912,
+ 2912, 958, 2912, 2912, 1210, 1385, 1577, 2105, 150, 1390,
+ 1209, 2082, 1220, 2912, 2912, 2912, 1384, 2912, 1210, 2083,
+ 1209, 1221, 1216, 1217, 1218, 1216, 958, 1504, 1210, 1385,
+ 2090, 1577, 2105, 1390, 2912, 2912, 2912, 1220, 1219, 1216,
+ 1217, 1218, 1216, 2083, 2109, 1221, 1396, 1397, 1397, 1398,
+ 2091, 1504, 2092, 1220, 2090, 1219, 1305, 1306, 1306, 1305,
+ 1393, 2099, 1221, 2912, 2100, 1305, 1306, 1306, 1307, 2109,
+
+ 1220, 2912, 1055, 2102, 2091, 958, 2092, 2106, 1220, 1221,
+ 1394, 2912, 2110, 1390, 1393, 2099, 1221, 1135, 2100, 1268,
+ 395, 1269, 1270, 940, 958, 1220, 1136, 2102, 2111, 2912,
+ 958, 2106, 1400, 1221, 1394, 1263, 2110, 1390, 1305, 1306,
+ 1306, 1305, 1135, 2912, 2112, 2115, 1169, 940, 1435, 958,
+ 1136, 2912, 2116, 2111, 1055, 2120, 1400, 1069, 1070, 1070,
+ 1071, 2912, 2912, 2912, 1402, 1403, 1403, 1404, 2112, 1135,
+ 2115, 1169, 2912, 1435, 2912, 940, 2116, 2912, 1136, 2120,
+ 1448, 599, 1449, 1448, 1457, 1457, 1457, 1457, 1072, 2912,
+ 1457, 1457, 1457, 1457, 1135, 1072, 1524, 1073, 1401, 940,
+
+ 2128, 1405, 1136, 2129, 1073, 557, 2127, 1231, 1232, 1233,
+ 1231, 557, 2149, 1072, 1231, 1232, 1233, 1231, 2912, 2912,
+ 1072, 1073, 1401, 1234, 2128, 1405, 2912, 2129, 1073, 2912,
+ 1234, 2127, 1402, 1403, 1403, 1404, 1408, 2149, 1235, 2912,
+ 2912, 1231, 1232, 1233, 1231, 1235, 2912, 1236, 1231, 1232,
+ 1233, 1231, 2912, 1409, 1236, 2912, 2150, 1314, 2912, 2912,
+ 2912, 1408, 2164, 1235, 1234, 1413, 1414, 1414, 1415, 1489,
+ 1235, 1236, 1235, 1670, 862, 1670, 1670, 1409, 1236, 1235,
+ 2150, 1236, 1231, 1232, 1233, 1231, 1410, 2164, 1236, 1069,
+ 1070, 1070, 1071, 1489, 962, 2912, 2175, 1235, 1234, 2912,
+
+ 2165, 2170, 1416, 2176, 1235, 1236, 1672, 865, 1673, 1674,
+ 1410, 2183, 1236, 1235, 2912, 1492, 1492, 1492, 1492, 962,
+ 1072, 2175, 1236, 1411, 2165, 2170, 1416, 2176, 2912, 1073,
+ 1419, 1420, 1421, 1421, 1422, 2912, 2183, 2912, 1235, 2184,
+ 2185, 1069, 1070, 1070, 1071, 1072, 1236, 1411, 1324, 1325,
+ 1325, 1324, 1482, 1073, 1419, 2912, 2186, 2912, 1374, 1374,
+ 1374, 1374, 1072, 2184, 1049, 2185, 2191, 2197, 1405, 1187,
+ 2199, 1073, 1072, 2912, 1423, 2912, 1482, 2912, 2912, 1149,
+ 2186, 1073, 2205, 2212, 2219, 940, 2223, 1072, 1150, 496,
+ 2191, 2197, 1405, 2912, 2199, 1073, 2912, 1072, 497, 1423,
+
+ 1324, 1325, 1325, 1324, 1149, 1073, 2205, 2212, 2219, 940,
+ 2233, 2223, 1150, 2250, 496, 2912, 1049, 1268, 395, 1269,
+ 1270, 2244, 497, 1268, 395, 1269, 1270, 936, 937, 937,
+ 938, 1149, 2912, 1263, 2233, 2912, 2912, 940, 2250, 1263,
+ 1150, 2912, 2912, 393, 1169, 2244, 1169, 1454, 2912, 2251,
+ 1169, 2258, 1169, 2912, 2912, 2266, 1149, 1440, 590, 1441,
+ 1440, 940, 1436, 2912, 1150, 1427, 1427, 1427, 1428, 1169,
+ 1426, 1169, 1454, 1517, 2251, 1169, 2258, 1169, 1426, 1426,
+ 2266, 1426, 140, 1426, 2270, 150, 1436, 1426, 1426, 1426,
+ 162, 162, 162, 163, 2912, 1330, 2912, 2912, 2912, 1649,
+
+ 1649, 1649, 1650, 1330, 1330, 2252, 1330, 140, 1330, 2270,
+ 150, 2257, 1330, 1330, 1330, 1334, 480, 1335, 1336, 150,
+ 1268, 395, 1269, 1270, 2259, 390, 391, 391, 392, 2252,
+ 2328, 1413, 1414, 1414, 1415, 2257, 1263, 1268, 395, 1269,
+ 1270, 393, 1258, 2912, 1259, 2912, 1348, 1169, 2259, 1169,
+ 2912, 2912, 2912, 1263, 2328, 1349, 1461, 1462, 1462, 1463,
+ 1453, 2272, 2912, 1459, 1169, 2276, 1169, 1258, 1416, 1259,
+ 1455, 1348, 1169, 2912, 1169, 1678, 870, 1678, 1678, 1349,
+ 1334, 480, 1335, 1336, 1453, 958, 2272, 1459, 2295, 1169,
+ 2276, 1169, 1416, 1390, 2297, 1455, 2298, 2306, 1364, 1365,
+
+ 1365, 1364, 1364, 1365, 1365, 1364, 2912, 1258, 2912, 1259,
+ 958, 1348, 2912, 2295, 1055, 2912, 2309, 1390, 1055, 2297,
+ 1349, 2298, 2306, 1364, 1365, 1365, 1366, 2333, 2310, 1135,
+ 2320, 1169, 1258, 1135, 1259, 947, 1348, 1169, 1136, 947,
+ 1169, 2309, 1136, 2912, 1349, 1334, 480, 1335, 1336, 2912,
+ 2327, 2333, 958, 2310, 1135, 2320, 1169, 2329, 1135, 947,
+ 1465, 1169, 1136, 947, 1169, 2912, 1136, 1467, 1468, 1468,
+ 1469, 2334, 1258, 2332, 1259, 2327, 1348, 958, 1448, 599,
+ 1449, 1448, 2329, 2912, 1465, 1349, 2912, 1370, 1371, 1371,
+ 1370, 2397, 2344, 2912, 1524, 2334, 962, 1258, 2332, 1259,
+
+ 2346, 1348, 2912, 1066, 1416, 1698, 1698, 1698, 1698, 1349,
+ 1341, 387, 1261, 1342, 2912, 2397, 1699, 2344, 1144, 2347,
+ 2912, 962, 2351, 2912, 947, 2346, 1263, 1145, 1416, 1373,
+ 1374, 1375, 1373, 1500, 1500, 1500, 1500, 1258, 2352, 1259,
+ 1376, 1343, 2912, 1144, 2347, 592, 2353, 2351, 947, 2403,
+ 1344, 1145, 1370, 1371, 1371, 1370, 1373, 1374, 1375, 1373,
+ 683, 2354, 1258, 2352, 1259, 2912, 1343, 1376, 1066, 684,
+ 1482, 2353, 592, 2403, 1344, 1341, 387, 1261, 1342, 1705,
+ 1705, 1705, 1705, 1144, 2358, 683, 2354, 683, 2912, 947,
+ 1704, 1263, 1145, 684, 1482, 2912, 684, 1305, 1306, 1306,
+
+ 1307, 2912, 1258, 2392, 1259, 2395, 1343, 2396, 1144, 2358,
+ 2912, 2912, 683, 947, 2912, 1344, 1145, 2912, 2912, 2409,
+ 684, 2912, 1377, 1378, 1379, 1377, 958, 1258, 2392, 1259,
+ 2395, 1343, 2396, 1380, 1378, 1378, 1378, 1378, 601, 1344,
+ 1370, 1371, 1371, 1372, 2409, 1187, 1364, 1365, 1365, 1366,
+ 2912, 958, 2410, 690, 2422, 2912, 2431, 1377, 1378, 1379,
+ 1377, 2912, 691, 2436, 2438, 491, 2912, 2437, 1380, 962,
+ 2449, 1118, 2912, 601, 492, 958, 2410, 1471, 690, 2422,
+ 1119, 2431, 1420, 1421, 1421, 1422, 691, 2436, 690, 2438,
+ 491, 2437, 2912, 2912, 962, 2449, 1118, 691, 492, 2450,
+
+ 958, 1471, 2912, 2912, 1119, 873, 874, 874, 875, 1205,
+ 1206, 1207, 1205, 690, 2451, 1440, 590, 1441, 1440, 1405,
+ 2453, 691, 2456, 2450, 2912, 1208, 1205, 1206, 1207, 1205,
+ 2912, 1442, 1205, 1206, 1207, 1205, 291, 2476, 2451, 2521,
+ 1209, 2912, 1208, 1405, 2453, 291, 2456, 1472, 1208, 1210,
+ 2457, 2912, 1205, 1206, 1207, 1205, 1668, 1209, 2912, 2912,
+ 2912, 291, 2476, 1209, 2521, 1209, 1210, 1473, 1208, 291,
+ 2477, 1472, 1210, 1210, 2457, 1475, 1387, 1388, 1388, 1389,
+ 1668, 1474, 1209, 1209, 1387, 1388, 1388, 1387, 1209, 1722,
+ 1210, 1473, 1210, 2551, 2477, 1722, 1210, 2912, 1722, 1475,
+
+ 1055, 1387, 1388, 1388, 1387, 958, 1474, 2484, 1209, 1708,
+ 1709, 1709, 1710, 1478, 1722, 1135, 1210, 1055, 2551, 1722,
+ 1711, 1477, 1722, 2489, 1136, 2912, 1440, 590, 1441, 1440,
+ 958, 2484, 1135, 1216, 1217, 1218, 1216, 1478, 1477, 2515,
+ 1135, 1136, 1442, 2516, 2912, 1477, 2912, 2489, 1136, 1219,
+ 1216, 1217, 1218, 1216, 2522, 1587, 2912, 1135, 1467, 1468,
+ 1468, 1469, 1477, 2515, 1220, 1136, 1219, 2516, 1396, 1397,
+ 1397, 1396, 2523, 1221, 2912, 2912, 1484, 2912, 2522, 1483,
+ 1587, 1220, 2912, 2912, 1055, 1396, 1397, 1397, 1396, 1220,
+ 1221, 1396, 1397, 1397, 1398, 1537, 2523, 1221, 2447, 1135,
+
+ 1484, 1055, 2524, 2552, 1483, 1482, 1220, 2448, 1136, 2912,
+ 162, 162, 162, 163, 1221, 2912, 1135, 2565, 2912, 1537,
+ 958, 2912, 1482, 2447, 1135, 1136, 2524, 2552, 1390, 1482,
+ 150, 2448, 1136, 1069, 1070, 1070, 1071, 1402, 1403, 1403,
+ 1402, 1135, 2565, 2566, 2575, 958, 1482, 2912, 1579, 1136,
+ 2912, 2573, 1390, 1049, 2574, 1402, 1403, 1403, 1402, 1069,
+ 1070, 1070, 1071, 2576, 1072, 2912, 1488, 2566, 1149, 2575,
+ 2606, 1049, 1579, 1073, 1477, 2573, 2607, 1150, 2574, 2912,
+ 1481, 1481, 1481, 1481, 1490, 2601, 1149, 2576, 2608, 1072,
+ 1072, 1488, 1477, 1149, 2606, 1150, 2609, 1073, 1477, 1073,
+
+ 2607, 1150, 1231, 1232, 1233, 1231, 2912, 2912, 2620, 1490,
+ 2601, 1149, 2912, 2608, 2621, 1072, 1477, 1482, 1234, 1150,
+ 2609, 2633, 2912, 1073, 1492, 1492, 1492, 1492, 1231, 1232,
+ 1233, 1231, 2620, 1235, 1231, 1232, 1233, 1231, 2621, 2912,
+ 1493, 1482, 1236, 2634, 1234, 2633, 1231, 1232, 1233, 1231,
+ 1234, 2640, 2912, 2912, 1448, 599, 1449, 1448, 1235, 1235,
+ 2912, 1532, 1234, 1495, 1493, 1235, 1236, 2634, 1236, 1494,
+ 1450, 2641, 2642, 2643, 1236, 2652, 2640, 1235, 1413, 1414,
+ 1414, 1413, 2912, 1593, 1235, 1532, 1236, 2659, 1495, 1496,
+ 1235, 2681, 1236, 1494, 1066, 2641, 2642, 2643, 1236, 2652,
+
+ 2912, 2660, 1235, 2912, 1413, 1414, 1414, 1413, 1593, 1144,
+ 1236, 2696, 2659, 1496, 2661, 1482, 2681, 2912, 1145, 2912,
+ 1066, 1069, 1070, 1070, 1071, 2660, 2707, 1420, 1421, 1421,
+ 1420, 2682, 2697, 2702, 1144, 1144, 2696, 2912, 2661, 1482,
+ 2912, 1482, 1145, 1049, 1145, 2912, 2912, 1420, 1421, 1421,
+ 1420, 2707, 1072, 2912, 1501, 2682, 2697, 2702, 1149, 2912,
+ 1144, 1073, 2708, 1049, 1482, 1482, 2721, 1150, 1145, 1069,
+ 1070, 1070, 1071, 1069, 1070, 1070, 1071, 1072, 1149, 1501,
+ 2912, 2728, 2732, 1149, 1482, 1073, 2708, 1150, 1482, 2912,
+ 2721, 1150, 1427, 1427, 1427, 1428, 1502, 2759, 1503, 2760,
+
+ 1072, 2912, 2742, 1149, 1072, 2728, 2753, 2732, 1482, 1073,
+ 2771, 1150, 150, 1073, 162, 162, 162, 163, 2912, 2912,
+ 2912, 1502, 2759, 1503, 2760, 1072, 2742, 2912, 2912, 1072,
+ 2753, 1505, 2912, 1073, 150, 2771, 2761, 1073, 1648, 1648,
+ 1648, 1648, 1370, 1371, 1371, 1372, 2912, 2912, 2912, 1500,
+ 1500, 1500, 1500, 1507, 2912, 1505, 1427, 1427, 1427, 1428,
+ 2761, 1426, 2912, 2912, 2912, 1268, 395, 1269, 1270, 1426,
+ 1426, 962, 1426, 140, 1426, 2912, 150, 1507, 1426, 1426,
+ 1426, 1263, 1268, 395, 1269, 1270, 1477, 1481, 1481, 1481,
+ 1481, 2773, 1169, 2774, 1169, 2912, 962, 2782, 1263, 1440,
+
+ 590, 1441, 1440, 1511, 1440, 590, 1441, 1440, 2785, 1169,
+ 1477, 1169, 2786, 2796, 2912, 1442, 2773, 1169, 2774, 1169,
+ 1442, 2803, 2782, 1512, 1482, 2804, 2912, 1511, 2912, 2805,
+ 1515, 2912, 2809, 2785, 1169, 1515, 1169, 2786, 2796, 1516,
+ 1448, 599, 1449, 1448, 1516, 2812, 2803, 1512, 1482, 2804,
+ 1448, 599, 1449, 1448, 2805, 1515, 1450, 2809, 2912, 2912,
+ 1515, 2813, 2826, 1516, 2912, 2814, 1450, 2820, 1516, 2827,
+ 2812, 1522, 1268, 395, 1269, 1270, 1268, 395, 1269, 1270,
+ 1523, 1522, 1461, 1462, 1462, 1461, 2813, 2826, 1263, 2814,
+ 1523, 2820, 1263, 2827, 2912, 2839, 1522, 2853, 1055, 1169,
+
+ 2848, 1169, 2912, 1169, 1523, 1169, 1522, 2912, 2858, 1528,
+ 2912, 1527, 2912, 1135, 1523, 1268, 395, 1269, 1270, 1532,
+ 2839, 2853, 1136, 2912, 1169, 2848, 1169, 2912, 1169, 2912,
+ 1169, 1263, 2858, 2912, 1528, 1527, 2912, 2912, 1135, 2912,
+ 2912, 2912, 1169, 1532, 1169, 2912, 1136, 1461, 1462, 1462,
+ 1461, 1461, 1462, 1462, 1463, 2912, 2912, 2912, 1529, 1467,
+ 1468, 1468, 1467, 1055, 2912, 2912, 2912, 1169, 2912, 1169,
+ 1467, 1468, 1468, 1467, 2912, 1066, 2912, 2912, 1135, 2912,
+ 958, 2912, 1529, 2912, 1532, 2912, 1066, 1136, 1533, 2912,
+ 1144, 1629, 1630, 1630, 1631, 2912, 1532, 2912, 2912, 1145,
+
+ 2912, 1144, 1632, 1135, 2912, 958, 2912, 1532, 1532, 2912,
+ 1145, 1136, 1533, 2912, 2912, 1144, 1205, 1206, 1207, 1205,
+ 1532, 2912, 2912, 1145, 2912, 2912, 1144, 1440, 590, 1441,
+ 1440, 1532, 1208, 2912, 1145, 1205, 1206, 1207, 1205, 1644,
+ 1645, 1645, 1646, 1442, 2912, 1540, 2912, 1209, 2912, 2912,
+ 1647, 1208, 1205, 1206, 1207, 1205, 1210, 1543, 1544, 1545,
+ 1543, 1492, 1492, 1492, 1492, 1667, 1209, 2912, 1208, 2912,
+ 1540, 2912, 1209, 1208, 2912, 1210, 2912, 2912, 1541, 2912,
+ 1210, 2912, 2912, 1209, 1216, 1217, 1218, 1216, 1209, 1667,
+ 2912, 1209, 1210, 1542, 1546, 2912, 2912, 1210, 1482, 1210,
+
+ 1219, 2912, 1541, 2912, 1554, 1555, 1556, 1554, 1209, 1727,
+ 937, 1728, 1729, 1209, 2912, 1220, 1210, 1542, 1546, 2912,
+ 1219, 1210, 1482, 2912, 1221, 1553, 1069, 1070, 1070, 1071,
+ 1069, 1070, 1070, 1071, 2912, 1220, 1069, 1070, 1070, 1071,
+ 1220, 1557, 2912, 2912, 1221, 2912, 2912, 2912, 1221, 1553,
+ 2912, 2912, 2912, 1560, 2912, 1561, 2912, 1072, 2912, 2912,
+ 1220, 1072, 2912, 2912, 2912, 1557, 1073, 1072, 1221, 2912,
+ 1073, 2912, 1231, 1232, 1233, 1231, 1562, 2912, 1560, 2912,
+ 1561, 2912, 1072, 2912, 2912, 2912, 1072, 2912, 1234, 2912,
+ 1073, 2912, 1072, 2912, 1073, 1664, 857, 1665, 1666, 2912,
+
+ 1562, 1564, 2912, 1235, 1231, 1232, 1233, 1231, 1231, 1232,
+ 1233, 1231, 1236, 2912, 1567, 1568, 1569, 1567, 2912, 2912,
+ 1234, 2912, 2912, 2912, 1234, 2912, 1564, 2912, 1235, 2912,
+ 1234, 1758, 1758, 1758, 1758, 1235, 1236, 2912, 2912, 1235,
+ 2912, 2912, 1699, 2912, 1236, 1235, 2912, 1565, 1236, 1566,
+ 2912, 1570, 2912, 2912, 1236, 1069, 1070, 1070, 1071, 2912,
+ 1235, 2912, 2912, 2912, 1235, 2912, 2912, 2912, 1236, 2912,
+ 1235, 1565, 1236, 1566, 2912, 1570, 2912, 2912, 1236, 2912,
+ 2912, 2912, 1574, 2912, 2912, 2912, 1072, 1324, 1325, 1325,
+ 1326, 1069, 1070, 1070, 1071, 1073, 1268, 395, 1269, 1270,
+
+ 2912, 1448, 599, 1449, 1448, 2912, 2912, 1574, 2912, 2912,
+ 2912, 1072, 1263, 1268, 395, 1269, 1270, 1450, 1072, 1073,
+ 2912, 2912, 1072, 1169, 2912, 1583, 2912, 1073, 2912, 1263,
+ 2912, 1575, 2912, 1440, 590, 1441, 1440, 2912, 2912, 1675,
+ 1169, 2912, 1169, 1072, 2912, 2912, 2912, 1072, 1169, 1442,
+ 1583, 1073, 2912, 2912, 2912, 1575, 1584, 2912, 1448, 599,
+ 1449, 1448, 2912, 1675, 2912, 1169, 2912, 1169, 1698, 1698,
+ 1698, 1698, 1588, 2912, 1450, 1268, 395, 1269, 1270, 1699,
+ 1584, 2912, 1616, 1617, 1617, 1618, 2912, 1268, 395, 1269,
+ 1270, 1263, 2912, 1619, 2912, 2912, 1588, 1594, 1670, 862,
+
+ 1670, 1670, 1169, 1263, 1169, 2912, 1268, 395, 1269, 1270,
+ 2912, 958, 2912, 1597, 1169, 2912, 1169, 2912, 1598, 2912,
+ 2912, 1594, 1263, 1705, 1705, 1705, 1705, 1169, 2912, 1169,
+ 2912, 2912, 2912, 1169, 1704, 1169, 958, 1597, 2912, 1169,
+ 2912, 1169, 2912, 1598, 2912, 1205, 1206, 1207, 1205, 1672,
+ 865, 1673, 1674, 1599, 1678, 870, 1678, 1678, 1169, 2912,
+ 1169, 1208, 1609, 1610, 1611, 1609, 2912, 2912, 1660, 853,
+ 1661, 1662, 1205, 1206, 1207, 1205, 1209, 1599, 1208, 2912,
+ 1420, 1421, 1421, 1422, 1263, 1210, 1608, 2912, 1208, 2912,
+ 2912, 962, 2912, 1209, 2912, 1169, 2912, 1169, 2912, 1546,
+
+ 2912, 1209, 1210, 1209, 2912, 1612, 2912, 2912, 2912, 1210,
+ 1608, 2912, 1210, 1543, 1544, 1545, 1543, 1405, 1209, 963,
+ 1169, 2912, 1169, 1546, 2912, 2912, 1210, 2912, 1209, 1208,
+ 1612, 1544, 1544, 1544, 1544, 2912, 1210, 1727, 937, 1728,
+ 1729, 1405, 2912, 963, 1290, 1543, 1544, 1545, 1543, 2912,
+ 1546, 2912, 2912, 1291, 1387, 1388, 1388, 1389, 2912, 2912,
+ 2912, 1208, 1149, 1205, 1206, 1207, 1205, 2912, 1482, 1290,
+ 2912, 1150, 2912, 2912, 1546, 2912, 1290, 1291, 2912, 1208,
+ 2912, 2912, 1546, 958, 2912, 1291, 2912, 1149, 1613, 2912,
+ 2912, 1390, 1482, 2912, 1209, 1150, 1616, 1617, 1617, 1618,
+
+ 2912, 1290, 2912, 1210, 2912, 2912, 1546, 1619, 958, 1291,
+ 2912, 2912, 2912, 1613, 2912, 1390, 2912, 2912, 2912, 1209,
+ 1216, 1217, 1218, 1216, 2912, 958, 2912, 1210, 2912, 2912,
+ 1554, 1555, 1556, 1554, 2912, 1139, 1219, 1555, 1555, 1555,
+ 1555, 2912, 1448, 599, 1449, 1448, 1219, 2912, 2912, 2912,
+ 958, 1220, 2912, 1622, 2130, 1371, 2131, 2132, 1450, 1139,
+ 1221, 1220, 2912, 1396, 1397, 1397, 1398, 1557, 1135, 2912,
+ 1221, 2912, 2912, 2912, 1482, 2912, 1220, 1136, 1622, 1554,
+ 1555, 1556, 1554, 1676, 1221, 2912, 1220, 2192, 857, 2193,
+ 2194, 1557, 958, 1135, 1221, 1219, 2912, 2912, 1482, 2912,
+
+ 1390, 1136, 1216, 1217, 1218, 1216, 2912, 1676, 2912, 2912,
+ 1220, 2912, 1649, 1649, 1649, 1649, 1557, 958, 1219, 1221,
+ 1624, 1625, 1625, 1626, 1390, 2912, 2912, 1623, 2912, 2912,
+ 2912, 1627, 150, 1220, 2912, 1220, 1402, 1403, 1403, 1404,
+ 1557, 2912, 1221, 1221, 2912, 1500, 1500, 1500, 1500, 958,
+ 2912, 2912, 1623, 1069, 1070, 1070, 1071, 2912, 1220, 1139,
+ 2912, 1640, 1641, 1641, 1642, 2912, 1221, 1072, 1629, 1630,
+ 1630, 1631, 1632, 1405, 958, 2912, 1073, 2912, 2912, 1632,
+ 2912, 2912, 1482, 1139, 1072, 1231, 1232, 1233, 1231, 2912,
+ 2912, 2912, 1072, 1628, 2912, 2912, 2912, 1405, 962, 1072,
+
+ 1073, 1234, 1635, 1636, 1637, 1635, 1482, 1152, 1073, 1072,
+ 2912, 2912, 1231, 1232, 1233, 1231, 1235, 1628, 1234, 2912,
+ 2912, 2912, 962, 2912, 1072, 1236, 1634, 2912, 1234, 2912,
+ 2912, 1152, 1073, 1235, 2912, 1624, 1625, 1625, 1626, 1570,
+ 2912, 1235, 1236, 1235, 2912, 1638, 1627, 2912, 2912, 1236,
+ 1634, 2912, 1236, 1567, 1568, 1569, 1567, 2912, 1235, 1652,
+ 162, 1652, 1652, 1570, 958, 2912, 1236, 2912, 1235, 1234,
+ 1638, 1568, 1568, 1568, 1568, 2912, 1236, 2912, 2912, 1655,
+ 1708, 1709, 1709, 1710, 1312, 1567, 1568, 1569, 1567, 958,
+ 1570, 1711, 2912, 1313, 1413, 1414, 1414, 1415, 2912, 2912,
+
+ 2912, 1234, 1144, 1231, 1232, 1233, 1231, 2912, 1482, 1312,
+ 2912, 1145, 2912, 2912, 1570, 2912, 1312, 1313, 2912, 1234,
+ 2912, 2912, 1570, 962, 2912, 1313, 2912, 1144, 1639, 2912,
+ 2912, 1416, 1482, 2912, 1235, 1145, 1640, 1641, 1641, 1642,
+ 2912, 1312, 2912, 1236, 2912, 2912, 1570, 1632, 962, 1313,
+ 2912, 2912, 2912, 1639, 2912, 1416, 2912, 2912, 2912, 1235,
+ 2912, 1649, 1649, 1649, 1650, 962, 1716, 1236, 2912, 2912,
+ 2912, 1786, 387, 1787, 1788, 1148, 2912, 2912, 140, 2912,
+ 140, 150, 2912, 1670, 862, 1670, 1670, 1789, 2912, 2912,
+ 962, 2198, 862, 2198, 2198, 2200, 865, 2201, 2202, 1148,
+
+ 1651, 1652, 162, 1652, 1653, 1651, 1651, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 2912, 1651,
+ 1738, 1655, 1651, 1651, 1651, 1651, 1268, 395, 1269, 1270,
+ 1268, 395, 1269, 1270, 2912, 1268, 395, 1269, 1270, 2912,
+ 2912, 2912, 1263, 2912, 1738, 2912, 1263, 2912, 2912, 1651,
+ 2912, 1263, 2912, 1169, 2912, 1169, 2912, 1169, 2912, 1679,
+ 2912, 2912, 1169, 2912, 1169, 2912, 2912, 1659, 2912, 1681,
+ 874, 1682, 1683, 1651, 1651, 2912, 2912, 2912, 1169, 1680,
+ 1169, 2912, 1169, 2912, 1679, 1263, 2912, 1169, 2912, 1169,
+ 2912, 1659, 2206, 870, 2206, 2206, 1169, 2912, 1169, 1461,
+
+ 1462, 1462, 1463, 1680, 1687, 1688, 1688, 1689, 1467, 1468,
+ 1468, 1469, 2912, 2912, 2912, 1627, 1205, 1206, 1207, 1205,
+ 2912, 1169, 2912, 1169, 1758, 1758, 1758, 1758, 958, 2912,
+ 2912, 2912, 1208, 958, 2912, 1699, 1390, 962, 2912, 1691,
+ 1692, 1692, 1693, 1139, 2912, 1416, 2912, 1209, 2912, 1694,
+ 1647, 2912, 2912, 958, 2912, 2912, 1210, 2912, 958, 2912,
+ 1390, 2912, 962, 1609, 1610, 1611, 1609, 1139, 962, 1416,
+ 2912, 2912, 1209, 2912, 1694, 2912, 2912, 2912, 1148, 1208,
+ 1210, 1610, 1610, 1610, 1610, 1609, 1610, 1611, 1609, 2260,
+ 937, 2261, 2262, 962, 1290, 2912, 1678, 870, 1678, 1678,
+
+ 1695, 1208, 1148, 1291, 1205, 1206, 1207, 1205, 1727, 937,
+ 1728, 1729, 1149, 2912, 2912, 2912, 1290, 2912, 1477, 1290,
+ 1208, 1150, 1695, 2912, 1695, 1291, 2912, 1291, 2912, 2912,
+ 2912, 1696, 2912, 1731, 2912, 1209, 2912, 1149, 2912, 2912,
+ 2912, 1290, 1477, 2912, 1210, 1150, 1695, 2912, 2912, 1291,
+ 1205, 1206, 1207, 1205, 2912, 2912, 1696, 1731, 2912, 2912,
+ 1209, 2912, 1700, 1701, 1701, 1702, 1208, 2912, 1210, 2130,
+ 1371, 2131, 2132, 1703, 2912, 2912, 2912, 1616, 1617, 1617,
+ 1616, 1209, 2912, 2912, 1616, 1617, 1617, 1616, 1704, 2912,
+ 1697, 958, 2912, 1055, 2912, 1704, 1216, 1217, 1218, 1216,
+
+ 1055, 1139, 1971, 1186, 1971, 1971, 1209, 2912, 1135, 2912,
+ 2912, 2912, 1219, 1972, 1697, 1135, 958, 1136, 1216, 1217,
+ 1218, 1216, 2912, 2912, 1136, 1139, 2912, 1220, 1624, 1625,
+ 1625, 1624, 2912, 1135, 1219, 2912, 1707, 2912, 2912, 1187,
+ 1135, 1136, 2912, 2912, 1055, 1706, 2912, 2912, 1136, 1220,
+ 2912, 2912, 1220, 1815, 1033, 1816, 1815, 2912, 1221, 1135,
+ 1707, 2912, 1624, 1625, 1625, 1624, 2912, 2912, 1136, 1442,
+ 1706, 2912, 2912, 1187, 1220, 2912, 2912, 2912, 1055, 2912,
+ 2912, 2912, 1221, 2912, 1135, 1629, 1630, 1630, 1629, 2912,
+ 2912, 2912, 1136, 1135, 2912, 2912, 1704, 1629, 1630, 1630,
+
+ 1629, 1049, 1136, 1691, 1692, 1692, 1693, 2912, 1704, 2171,
+ 1414, 2172, 2173, 1049, 1647, 2912, 1149, 2912, 1135, 1231,
+ 1232, 1233, 1231, 2912, 2912, 1150, 1136, 2912, 1149, 1635,
+ 1636, 1637, 1635, 2912, 2912, 1234, 2912, 1150, 2912, 2912,
+ 962, 1149, 2912, 2912, 2912, 1234, 2174, 2912, 2912, 1150,
+ 1235, 2912, 1712, 1149, 2912, 1636, 1636, 1636, 1636, 1236,
+ 1312, 1150, 2912, 2912, 962, 2912, 1713, 2912, 2912, 1313,
+ 2174, 1440, 590, 1441, 1440, 1235, 2912, 1712, 1635, 1636,
+ 1637, 1635, 2912, 1236, 2912, 1312, 1144, 1442, 2912, 2912,
+ 1713, 2912, 1532, 1313, 1234, 1145, 1231, 1232, 1233, 1231,
+
+ 1735, 1231, 1232, 1233, 1231, 1822, 1041, 1823, 1822, 1312,
+ 2912, 1144, 1234, 2912, 2912, 1713, 1532, 1234, 1313, 1145,
+ 2912, 1450, 2912, 1714, 2912, 1735, 2912, 1235, 2192, 857,
+ 2193, 2194, 1235, 2912, 1312, 2912, 1236, 2912, 2912, 1713,
+ 2912, 1715, 1313, 1640, 1641, 1641, 1640, 2912, 1714, 2912,
+ 2912, 2912, 1235, 2912, 1704, 2912, 2912, 1235, 2912, 1066,
+ 1236, 1640, 1641, 1641, 1640, 1715, 1660, 853, 1661, 1660,
+ 2912, 2912, 1704, 2912, 1144, 2912, 2912, 1066, 1644, 1645,
+ 1645, 1644, 1263, 1145, 1644, 1645, 1645, 1644, 2912, 1187,
+ 2912, 2912, 1144, 2912, 1049, 1187, 2912, 1351, 2912, 1144,
+
+ 1049, 1145, 2912, 1731, 2912, 2912, 1352, 1145, 2912, 1149,
+ 1946, 590, 1947, 1946, 2912, 1149, 2912, 1144, 1150, 2912,
+ 2912, 2912, 1351, 2912, 1150, 1145, 1948, 1731, 2912, 2912,
+ 1352, 2912, 2912, 2912, 1149, 2198, 862, 2198, 2198, 2912,
+ 1149, 2912, 1150, 2912, 1664, 857, 1665, 1666, 1150, 1651,
+ 1652, 162, 1652, 1653, 1651, 1651, 1651, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 1651, 1651, 1651, 2912, 1651, 2912,
+ 1655, 1651, 1651, 1651, 1651, 1348, 1954, 599, 1955, 1954,
+ 2912, 1734, 2912, 2912, 1349, 1977, 1193, 1978, 1979, 2912,
+ 2912, 2912, 1956, 2912, 2912, 2912, 1976, 2912, 1651, 2912,
+
+ 1348, 1982, 1197, 1982, 1982, 1734, 2912, 2912, 1349, 2912,
+ 2912, 2912, 1972, 2200, 865, 2201, 2202, 2206, 870, 2206,
+ 2206, 2912, 1651, 1651, 1651, 1718, 288, 1719, 1720, 1651,
+ 1651, 1651, 1651, 1651, 1651, 1651, 1721, 1721, 1651, 1651,
+ 1651, 1651, 1722, 1651, 1722, 1651, 1651, 1651, 1651, 1651,
+ 1722, 1722, 1723, 1722, 1724, 1722, 1722, 1722, 1722, 1722,
+ 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722,
+ 1722, 1722, 1722, 1651, 1722, 1722, 1722, 1723, 1722, 1724,
+ 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722,
+ 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1651, 1651, 1268,
+
+ 395, 1269, 1270, 1660, 853, 1661, 1660, 1983, 1199, 1984,
+ 1985, 1440, 590, 1441, 1440, 1263, 2912, 2912, 1976, 1263,
+ 2912, 1664, 857, 1665, 1664, 2912, 1169, 1442, 1169, 2912,
+ 2912, 2912, 1730, 2912, 1351, 2912, 2912, 1267, 2912, 2912,
+ 1731, 2912, 2912, 1352, 2912, 2912, 2912, 1448, 599, 1449,
+ 1448, 1169, 1346, 1169, 1736, 2912, 2912, 1730, 1731, 1351,
+ 2912, 1347, 2912, 1450, 1731, 2912, 2912, 1352, 1660, 853,
+ 1661, 1662, 1664, 857, 1665, 1664, 1741, 1346, 1736, 2912,
+ 2912, 2912, 1731, 2912, 1263, 1347, 2912, 2912, 1267, 2912,
+ 1672, 865, 1673, 1672, 2912, 1169, 2912, 1169, 2912, 1339,
+
+ 2912, 1741, 2912, 1346, 2912, 1732, 1267, 2912, 1340, 1731,
+ 2912, 2912, 1347, 2912, 2912, 1448, 599, 1449, 1448, 2912,
+ 1169, 1346, 1169, 2912, 1339, 2912, 2912, 1738, 1346, 1732,
+ 1347, 1450, 1340, 1731, 2912, 2912, 1347, 1672, 865, 1673,
+ 1672, 1672, 865, 1673, 1674, 2912, 1346, 2260, 937, 2261,
+ 2262, 1738, 2912, 1267, 1347, 2912, 2912, 2912, 1742, 1687,
+ 1688, 1688, 1689, 1268, 395, 1269, 1270, 2912, 1346, 2912,
+ 1627, 2912, 1348, 2912, 1738, 2912, 2912, 1347, 1740, 1263,
+ 2912, 1349, 1742, 1268, 395, 1269, 1270, 2912, 958, 2912,
+ 1169, 2912, 1169, 1346, 2912, 2912, 2912, 1348, 1738, 1263,
+
+ 2912, 1347, 1740, 2912, 1745, 1349, 1946, 590, 1947, 1946,
+ 1169, 2912, 1169, 958, 2912, 1169, 2912, 1169, 2912, 2912,
+ 2912, 1744, 1948, 1440, 590, 1441, 1440, 2912, 1745, 1700,
+ 1701, 1701, 1702, 2912, 2912, 1169, 2912, 1169, 2912, 1442,
+ 1703, 2662, 1371, 2663, 2664, 1744, 1096, 1746, 956, 1747,
+ 1748, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 958, 2912,
+ 1096, 1096, 1096, 1263, 1814, 1096, 2912, 1096, 1096, 1096,
+ 1096, 1096, 2912, 2912, 1448, 599, 1449, 1448, 1750, 2260,
+ 937, 2261, 2262, 958, 2912, 2912, 2912, 1751, 1814, 2912,
+ 1450, 1971, 1186, 1971, 1971, 1096, 1946, 590, 1947, 1946,
+
+ 2912, 2912, 1972, 1750, 2912, 1759, 1760, 1760, 1761, 2912,
+ 2912, 1751, 2037, 2912, 2912, 1821, 1703, 2912, 2912, 1096,
+ 1096, 1096, 1746, 956, 1747, 1748, 1096, 1096, 1096, 1096,
+ 1096, 1096, 1096, 2912, 958, 1096, 1096, 1096, 1263, 1821,
+ 1096, 2912, 1096, 1096, 1096, 1096, 1096, 1954, 599, 1955,
+ 1954, 2912, 2912, 1750, 2912, 1954, 599, 1955, 1954, 958,
+ 2912, 2912, 1751, 1956, 1815, 1033, 1816, 1815, 2912, 2912,
+ 1096, 2044, 1982, 1197, 1982, 1982, 2912, 2912, 1750, 2912,
+ 1442, 2912, 2912, 1972, 2912, 2912, 1751, 2662, 1371, 2663,
+ 2664, 2912, 2912, 2912, 1096, 1096, 1096, 1746, 956, 1747,
+
+ 1752, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1753, 1753,
+ 1096, 1096, 1096, 1263, 1754, 1096, 1754, 1096, 1096, 1096,
+ 1096, 1096, 1754, 1754, 1754, 1754, 1754, 1754, 1755, 1754,
+ 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1756, 1754, 1754,
+ 1754, 1754, 1754, 1754, 1754, 1096, 1754, 1754, 1754, 1754,
+ 1754, 1754, 1754, 1755, 1754, 1754, 1754, 1754, 1754, 1754,
+ 1754, 1756, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1096,
+ 1096, 1759, 1760, 1760, 1761, 1687, 1688, 1688, 1687, 2912,
+ 2912, 2912, 1703, 2912, 2912, 2912, 1187, 1687, 1688, 1688,
+ 1687, 1055, 2912, 1762, 1763, 1763, 1764, 2912, 1187, 2912,
+
+ 958, 2912, 2912, 1055, 1711, 2912, 1135, 2912, 2912, 2912,
+ 1139, 2912, 2912, 2912, 2912, 1136, 2912, 2912, 1135, 2912,
+ 2912, 2912, 962, 2912, 2912, 958, 2912, 1136, 2912, 2912,
+ 2912, 1135, 1148, 2912, 1139, 2497, 1698, 2497, 2497, 1136,
+ 2912, 2912, 2912, 1135, 2912, 2912, 2498, 962, 2912, 2912,
+ 2912, 1136, 1691, 1692, 1692, 1691, 1148, 2912, 1691, 1692,
+ 1692, 1691, 2912, 1187, 1440, 590, 1441, 1440, 1066, 1187,
+ 1205, 1206, 1207, 1205, 1066, 1205, 1206, 1207, 1205, 2912,
+ 1442, 2912, 2912, 1144, 2912, 2912, 1208, 2912, 2912, 1144,
+ 2912, 1208, 1145, 2912, 2912, 1766, 2912, 2912, 1145, 2912,
+
+ 2912, 1209, 1765, 2912, 2059, 2912, 1209, 2912, 1144, 2912,
+ 1210, 2912, 2912, 2912, 1144, 1210, 1145, 2912, 2912, 2912,
+ 1766, 2912, 1145, 2912, 2912, 2912, 1209, 1765, 2059, 2912,
+ 2912, 1209, 2912, 2912, 1210, 1543, 1544, 1545, 1543, 1210,
+ 2912, 2912, 1700, 1701, 1701, 1700, 1822, 1041, 1823, 1822,
+ 2912, 1208, 2912, 1699, 1700, 1701, 1701, 1700, 1055, 2912,
+ 2912, 2912, 1450, 2912, 2912, 1699, 1209, 2912, 2912, 2912,
+ 1055, 2912, 1546, 1135, 2912, 1210, 2912, 1554, 1555, 1556,
+ 1554, 2912, 1136, 2912, 2912, 1135, 1762, 1763, 1763, 1764,
+ 2912, 1209, 2912, 1219, 1136, 2912, 1546, 1711, 1135, 1210,
+
+ 1767, 1768, 1769, 1767, 2912, 2912, 1136, 2912, 1220, 2912,
+ 1135, 1770, 2912, 2912, 1557, 2912, 1208, 1221, 1136, 1708,
+ 1709, 1709, 1708, 962, 2912, 2504, 1705, 2504, 2504, 2912,
+ 1699, 1209, 2912, 1220, 2912, 1049, 2503, 2912, 1557, 1294,
+ 1210, 1221, 1708, 1709, 1709, 1708, 2912, 962, 2912, 2912,
+ 1149, 2912, 2912, 1699, 2912, 2912, 1209, 2912, 1049, 1150,
+ 2912, 2912, 2912, 1294, 1210, 1771, 1772, 1773, 1771, 2912,
+ 2912, 2912, 2912, 1149, 2912, 1149, 1774, 1231, 1232, 1233,
+ 1231, 1219, 1150, 1150, 1231, 1232, 1233, 1231, 1973, 1189,
+ 1974, 1975, 2912, 1234, 2912, 2912, 1220, 2912, 1149, 1976,
+
+ 1234, 2912, 1776, 2912, 1301, 1221, 1150, 2912, 1235, 2912,
+ 2912, 1775, 2912, 2912, 2912, 1235, 2912, 1236, 2912, 2912,
+ 2912, 1220, 2912, 2912, 1236, 1169, 2912, 1776, 1301, 1221,
+ 2912, 2912, 2912, 1235, 2912, 2912, 1775, 2912, 2912, 2912,
+ 1235, 1236, 1567, 1568, 1569, 1567, 2912, 2912, 1236, 1169,
+ 2912, 2912, 2912, 2912, 1440, 590, 1441, 1440, 1234, 1794,
+ 395, 1795, 1796, 2912, 2912, 1794, 395, 1795, 1796, 2912,
+ 1442, 2912, 2912, 1235, 2912, 1789, 2912, 2912, 2912, 1570,
+ 2912, 1789, 1236, 2912, 2912, 2912, 1722, 1899, 1722, 2912,
+ 2912, 2912, 1722, 2912, 1722, 2912, 2912, 2912, 1235, 1946,
+
+ 590, 1947, 1946, 1570, 1797, 2912, 1236, 1777, 1778, 1779,
+ 1777, 1722, 1899, 1722, 2912, 2037, 2912, 1722, 1780, 1722,
+ 2912, 2912, 2912, 1234, 1268, 395, 1269, 1270, 1797, 1794,
+ 395, 1795, 1796, 2912, 1440, 590, 1441, 1440, 1235, 2912,
+ 1263, 1440, 590, 1441, 1440, 1789, 1316, 1236, 2912, 2912,
+ 1442, 1809, 2912, 1169, 2912, 2912, 1722, 1442, 1722, 1981,
+ 2912, 2912, 2912, 1235, 2912, 2912, 2912, 1798, 1980, 2912,
+ 1316, 1236, 162, 162, 162, 163, 1809, 1781, 1169, 2912,
+ 2912, 1722, 2912, 1722, 1981, 1781, 1781, 2912, 1781, 140,
+ 1781, 1798, 150, 1980, 1781, 1781, 1781, 1651, 1719, 288,
+
+ 1719, 1783, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 2912,
+ 2912, 1651, 1651, 1651, 1651, 2912, 1651, 2912, 1651, 1651,
+ 1651, 1651, 1651, 2912, 2912, 1784, 2912, 1785, 1801, 1019,
+ 1802, 1803, 1448, 599, 1449, 1448, 2912, 1954, 599, 1955,
+ 1954, 2912, 2912, 2912, 1267, 2912, 1651, 2912, 1450, 2912,
+ 1784, 2912, 1785, 2044, 2912, 2525, 1186, 2525, 2525, 1804,
+ 2912, 2912, 2912, 2912, 2912, 1903, 2526, 2912, 1805, 2912,
+ 1651, 1651, 1651, 1790, 391, 1791, 1792, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 1804, 2912, 1651, 1651, 1651, 1793,
+ 1903, 1651, 1805, 1651, 1651, 1651, 1651, 1651, 1801, 1019,
+
+ 1802, 1803, 2912, 1268, 395, 1269, 1270, 1860, 480, 1861,
+ 1862, 2912, 2912, 2912, 1267, 2220, 1468, 2221, 2222, 1263,
+ 2912, 1651, 2912, 1448, 599, 1449, 1448, 2912, 1811, 1804,
+ 1169, 2912, 1169, 2912, 1784, 2912, 1785, 2912, 1805, 1450,
+ 2133, 1374, 2134, 2133, 2912, 1651, 1651, 2912, 2912, 2912,
+ 1986, 2135, 2174, 1811, 1804, 1169, 1442, 1169, 2912, 1784,
+ 2912, 1785, 1805, 1096, 1801, 1019, 1802, 1806, 1096, 1096,
+ 1096, 1096, 1096, 1096, 1096, 1986, 2174, 1096, 1096, 1096,
+ 1267, 2912, 1096, 2912, 1096, 1096, 1096, 1096, 1096, 1268,
+ 395, 1269, 1270, 2912, 2912, 1807, 2912, 1268, 395, 1269,
+
+ 1270, 2912, 2912, 2912, 1808, 1263, 2912, 1440, 590, 1441,
+ 1440, 2912, 1096, 1263, 2912, 2912, 1169, 2912, 1169, 2912,
+ 1807, 2912, 1826, 1442, 1169, 2912, 1169, 2912, 1808, 2912,
+ 2912, 2912, 1825, 2912, 2912, 2912, 1096, 1096, 2912, 2912,
+ 2912, 1169, 2912, 1169, 2912, 2912, 2912, 1826, 2912, 1169,
+ 2912, 1169, 1827, 1047, 1828, 1829, 1825, 1833, 1053, 1834,
+ 1835, 2912, 2912, 2912, 1833, 1053, 1834, 1835, 1830, 1827,
+ 1047, 1828, 1841, 1836, 2912, 1833, 1053, 1834, 1835, 2912,
+ 1836, 2912, 2912, 1831, 2912, 1830, 2912, 2912, 1837, 2912,
+ 2912, 1836, 1832, 1839, 2912, 1837, 2912, 1838, 2912, 2912,
+
+ 1842, 2912, 2912, 2912, 1838, 2912, 1837, 2912, 1831, 1843,
+ 2912, 2912, 2912, 1837, 1840, 1838, 1832, 2912, 1839, 2912,
+ 1837, 1838, 2912, 2912, 2912, 1842, 2912, 2912, 1838, 2912,
+ 2912, 1837, 2912, 1843, 2234, 1481, 2234, 2234, 1840, 1838,
+ 1096, 1844, 1064, 1845, 1846, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1096, 2912, 2912, 1096, 1096, 1096, 1847, 2912, 1096,
+ 2912, 1096, 1096, 1096, 1096, 1096, 2912, 1850, 1070, 1851,
+ 1852, 2235, 1848, 2245, 1492, 2245, 2245, 2912, 2912, 2912,
+ 2912, 1849, 2912, 1830, 2912, 1850, 1070, 1851, 1852, 1096,
+ 1850, 1070, 1851, 1852, 2912, 2235, 2912, 1848, 1853, 2912,
+
+ 2912, 1830, 2912, 2912, 2912, 1849, 1830, 1854, 2912, 2912,
+ 2235, 2912, 2912, 1096, 1096, 2912, 1853, 2912, 2912, 1855,
+ 2912, 1853, 2912, 1853, 1856, 1854, 1759, 1760, 1760, 1759,
+ 1854, 1854, 2912, 2912, 2235, 2912, 2912, 1699, 2912, 2912,
+ 2912, 1853, 1055, 2912, 1855, 2912, 1853, 2912, 1856, 1854,
+ 2912, 2912, 2912, 2912, 1854, 2912, 2912, 1135, 1759, 1760,
+ 1760, 1759, 1762, 1763, 1763, 1762, 1136, 2912, 2912, 1699,
+ 2912, 2912, 2912, 1699, 1055, 2912, 2912, 2912, 1066, 2912,
+ 2912, 2912, 1135, 2912, 1762, 1763, 1763, 1762, 2912, 1135,
+ 1136, 2912, 2912, 1144, 2912, 1699, 2912, 2912, 1136, 2912,
+
+ 1066, 2912, 1145, 2912, 1609, 1610, 1611, 1609, 2912, 1946,
+ 590, 1947, 1946, 2912, 1135, 1144, 2912, 2912, 1144, 2912,
+ 1208, 2912, 1136, 2912, 1145, 1948, 1145, 1205, 1206, 1207,
+ 1205, 1767, 1768, 1769, 1767, 1209, 2912, 2912, 2107, 2912,
+ 1144, 1546, 1770, 1208, 1210, 2912, 2912, 1208, 1145, 2912,
+ 1768, 1768, 1768, 1768, 1205, 1206, 1207, 1205, 1209, 2912,
+ 1209, 1704, 1290, 2107, 2912, 1546, 2912, 1858, 1210, 2912,
+ 1208, 1291, 2912, 1767, 1768, 1769, 1767, 1771, 1772, 1773,
+ 1771, 1149, 2912, 1209, 1770, 1209, 2912, 1290, 1774, 1208,
+ 1150, 1858, 2912, 1219, 1210, 1291, 1772, 1772, 1772, 1772,
+
+ 1771, 1772, 1773, 1771, 1290, 2912, 1149, 1704, 1220, 2912,
+ 1209, 1774, 2912, 1291, 1150, 2912, 1219, 1221, 1210, 1216,
+ 1217, 1218, 1216, 1448, 599, 1449, 1448, 1135, 2912, 1290,
+ 2912, 1220, 2912, 1220, 2912, 1219, 1136, 1291, 2912, 1450,
+ 1221, 1221, 1635, 1636, 1637, 1635, 1231, 1232, 1233, 1231,
+ 1220, 2912, 1135, 2912, 2912, 2912, 1220, 2912, 1234, 1221,
+ 1136, 2912, 1234, 2060, 1221, 1777, 1778, 1779, 1777, 1778,
+ 1778, 1778, 1778, 1235, 2912, 1220, 1780, 1235, 2912, 1570,
+ 1704, 1234, 1236, 1221, 2912, 2912, 1859, 2060, 1777, 1778,
+ 1779, 1777, 1231, 1232, 1233, 1231, 1312, 2912, 1235, 1780,
+
+ 1144, 2912, 1235, 1570, 1234, 1313, 1236, 2912, 1234, 1145,
+ 1859, 2912, 2912, 2912, 1954, 599, 1955, 1954, 2912, 1312,
+ 2912, 1312, 2912, 1235, 2912, 1144, 2912, 2912, 1313, 1313,
+ 1956, 2912, 1236, 1145, 1681, 874, 1682, 1683, 1786, 387,
+ 1787, 1788, 2912, 2113, 1312, 2912, 2912, 2912, 1235, 2912,
+ 1263, 2912, 1313, 2912, 1789, 2912, 1236, 162, 162, 162,
+ 163, 1169, 1781, 1169, 2912, 2912, 2912, 2912, 2113, 1865,
+ 1781, 1781, 2912, 1781, 140, 1781, 2912, 150, 1866, 1781,
+ 1781, 1781, 1786, 387, 1787, 1788, 1169, 2912, 1169, 1884,
+ 1111, 1885, 1891, 2912, 1865, 2912, 2912, 2912, 1789, 2912,
+
+ 2912, 2912, 1866, 1867, 387, 1787, 1868, 2912, 1790, 391,
+ 1791, 1790, 2912, 1865, 2912, 1448, 599, 1449, 1448, 1789,
+ 1892, 2912, 1866, 2912, 1793, 1790, 391, 1791, 1790, 1893,
+ 1784, 1450, 1785, 2912, 1869, 2912, 2912, 2912, 1865, 1872,
+ 2912, 1793, 2912, 1870, 2912, 1892, 1866, 2912, 1873, 2912,
+ 2912, 2912, 2912, 1893, 2912, 1784, 1872, 1785, 2912, 1869,
+ 1794, 395, 1795, 1794, 1872, 1873, 2912, 1870, 1794, 395,
+ 1795, 1796, 1873, 2912, 2912, 2912, 1789, 1794, 395, 1795,
+ 1794, 1872, 2912, 2912, 1789, 2136, 1378, 2137, 2136, 1873,
+ 2912, 1877, 2912, 1789, 2912, 1722, 2138, 1722, 2912, 2912,
+
+ 1878, 1450, 2912, 1268, 395, 1269, 1270, 2912, 1877, 2912,
+ 2912, 1881, 2428, 1641, 2429, 2430, 1877, 1878, 2912, 1263,
+ 1722, 2912, 1722, 2421, 1878, 1268, 395, 1269, 1270, 2912,
+ 1169, 2912, 1169, 1877, 2912, 1881, 1801, 1019, 1802, 1803,
+ 2912, 1878, 1794, 395, 1795, 1796, 1905, 1801, 1019, 1802,
+ 1803, 1922, 1267, 2912, 2912, 1169, 1169, 1169, 1789, 2912,
+ 2912, 2912, 1169, 1267, 2912, 1897, 2912, 1804, 2912, 1722,
+ 1905, 1722, 2912, 1865, 2912, 1922, 1805, 2912, 1804, 2912,
+ 2912, 1169, 1866, 2912, 2912, 2912, 1169, 1805, 2912, 1897,
+ 2912, 2912, 1804, 2912, 1722, 2912, 1722, 2912, 1865, 2912,
+
+ 1805, 2912, 2912, 1804, 2912, 2912, 1866, 1794, 395, 1795,
+ 1796, 1805, 2912, 2912, 2912, 1884, 1111, 1885, 1886, 1946,
+ 590, 1947, 1946, 1789, 2912, 2912, 2912, 1833, 1053, 1834,
+ 1835, 1847, 2912, 2912, 1722, 1948, 1722, 1946, 590, 1947,
+ 1946, 2912, 2912, 1836, 1879, 1880, 1887, 1833, 1053, 1834,
+ 1835, 2912, 2912, 1948, 2912, 1888, 1889, 2912, 1837, 1722,
+ 2196, 1722, 2912, 1836, 2912, 2912, 2912, 1838, 1879, 1880,
+ 2912, 1887, 1954, 599, 1955, 1954, 2108, 2912, 1837, 1888,
+ 2912, 1889, 2912, 1837, 2196, 2912, 1890, 1838, 1956, 2912,
+ 2912, 1838, 1815, 1033, 1816, 1815, 1815, 1033, 1816, 1815,
+
+ 2108, 2912, 2912, 1837, 2912, 2912, 2912, 2912, 1442, 2912,
+ 1890, 1838, 1442, 2204, 1822, 1041, 1823, 1822, 1822, 1041,
+ 1823, 1822, 2912, 1515, 2912, 2912, 2912, 1515, 2912, 1900,
+ 1450, 2912, 1516, 1900, 1450, 2912, 1516, 2204, 2912, 2253,
+ 1500, 2253, 2253, 2912, 2912, 1522, 2912, 2912, 1515, 1522,
+ 2912, 1904, 1515, 1900, 1523, 1904, 1516, 1900, 1523, 2912,
+ 1516, 1827, 1047, 1828, 1829, 1827, 1047, 1828, 1829, 2912,
+ 1522, 2912, 2912, 2912, 1522, 1904, 2235, 1830, 1523, 1904,
+ 2912, 1830, 1523, 1827, 1047, 1828, 1829, 1833, 1053, 1834,
+ 1835, 2912, 1831, 2912, 2912, 2912, 1831, 2912, 2912, 1830,
+
+ 2235, 1832, 2912, 1836, 2912, 1832, 1833, 1053, 1834, 1835,
+ 1954, 599, 1955, 1954, 1831, 2912, 1907, 1831, 1837, 2912,
+ 2912, 1831, 1836, 1832, 2912, 1832, 1956, 1838, 2912, 1832,
+ 2912, 2912, 1833, 1053, 1834, 1833, 2912, 1837, 2912, 1831,
+ 2912, 1907, 2912, 1837, 2912, 1908, 1838, 1832, 1836, 2114,
+ 2912, 1838, 1833, 1053, 1834, 1833, 2912, 2912, 1833, 1053,
+ 1834, 1835, 1837, 1909, 1833, 1053, 1834, 1835, 1836, 1908,
+ 1838, 2912, 1910, 2114, 1836, 2349, 1033, 2350, 2349, 2912,
+ 1836, 2912, 2912, 1909, 1833, 1053, 1834, 1835, 1909, 1837,
+ 2912, 1948, 1910, 1912, 2912, 1837, 1910, 2912, 1838, 2912,
+
+ 1836, 2912, 2912, 2912, 1838, 2912, 2912, 2912, 1909, 2912,
+ 1833, 1053, 1834, 1835, 1837, 1837, 1910, 2912, 1912, 2912,
+ 1837, 2912, 1838, 1913, 1838, 2912, 1836, 2912, 1838, 1833,
+ 1053, 1834, 1835, 1827, 1047, 1828, 1841, 2912, 2912, 2912,
+ 1837, 1837, 2912, 2912, 2912, 1836, 2912, 1913, 1838, 1830,
+ 1838, 1915, 1850, 1070, 1851, 1852, 1850, 1070, 1851, 1852,
+ 1837, 2912, 2912, 2912, 1842, 2912, 1837, 1914, 1830, 1838,
+ 2912, 2912, 1830, 1843, 1838, 1915, 2912, 2531, 1193, 2532,
+ 2533, 1916, 2912, 1853, 2912, 1837, 2912, 1853, 2530, 1842,
+ 2912, 1914, 1854, 1838, 2912, 1917, 1854, 1843, 1844, 1064,
+
+ 1845, 1844, 1844, 1064, 1845, 1844, 1916, 2912, 1853, 2912,
+ 2912, 2912, 1853, 2912, 1847, 2912, 1854, 2912, 1847, 1917,
+ 1854, 1850, 1070, 1851, 1850, 1850, 1070, 1851, 1850, 1918,
+ 2912, 2912, 2912, 1918, 2912, 2912, 2912, 1830, 1919, 2912,
+ 2912, 1830, 1919, 1850, 1070, 1851, 1852, 1850, 1070, 1851,
+ 1852, 2912, 1923, 2912, 1918, 2912, 1923, 2912, 1918, 1830,
+ 2912, 1924, 1919, 1830, 2912, 1924, 1919, 2198, 862, 2198,
+ 2198, 2912, 2912, 2912, 1842, 2912, 1925, 1923, 1853, 2912,
+ 2912, 1923, 2912, 1843, 2912, 1924, 2912, 1854, 2912, 1924,
+ 1850, 1070, 1851, 1852, 1850, 1070, 1851, 1852, 2912, 1842,
+
+ 2912, 1925, 2912, 1853, 2271, 2912, 1830, 1843, 2912, 2912,
+ 1830, 1854, 2912, 2912, 2912, 1794, 395, 1795, 1796, 2912,
+ 2912, 1853, 2912, 2912, 2912, 1853, 2912, 2912, 2271, 1926,
+ 1854, 1789, 1927, 2912, 1854, 1850, 1070, 1851, 1852, 2912,
+ 2912, 2912, 1722, 2912, 1941, 2912, 1853, 2912, 2912, 2912,
+ 1853, 1830, 2912, 1926, 1854, 2912, 1927, 2912, 1854, 2912,
+ 2912, 1973, 1189, 1974, 1975, 2912, 1853, 1722, 2912, 1941,
+ 2912, 2912, 1976, 2912, 2912, 1854, 1928, 1263, 2912, 1794,
+ 395, 1795, 1796, 1884, 1111, 1885, 1891, 2912, 1169, 2912,
+ 1169, 1853, 2912, 2912, 2912, 1789, 2912, 2912, 2912, 1854,
+
+ 1928, 1930, 1931, 1932, 1930, 2912, 1722, 2912, 1722, 2912,
+ 2912, 2912, 1933, 1169, 1892, 1169, 2912, 1208, 1942, 1794,
+ 395, 1795, 1796, 1893, 2912, 2912, 2912, 1794, 395, 1795,
+ 1796, 1722, 1209, 1722, 2912, 1789, 2912, 2912, 2912, 1892,
+ 1294, 1210, 1942, 1789, 2912, 2912, 1722, 1893, 1722, 2206,
+ 870, 2206, 2206, 2912, 1722, 2912, 2103, 1209, 2912, 1959,
+ 1794, 395, 1795, 1796, 1294, 1210, 1934, 1935, 1936, 1934,
+ 2912, 1722, 2912, 1722, 2912, 2912, 1789, 1937, 2912, 1722,
+ 2912, 2103, 1234, 1959, 2912, 2912, 2264, 1722, 2912, 1722,
+ 1960, 1794, 395, 1795, 1796, 2912, 2912, 1235, 2912, 2912,
+
+ 2912, 1946, 590, 1947, 1946, 1316, 1236, 1789, 2912, 2912,
+ 2264, 2912, 1722, 2912, 1722, 1960, 2912, 1948, 1722, 2912,
+ 1722, 2912, 1235, 2912, 1961, 1884, 1111, 1885, 1886, 1316,
+ 1236, 1860, 480, 1861, 1862, 2912, 1884, 1111, 1885, 1886,
+ 2912, 1847, 2912, 1722, 2269, 1722, 2912, 2912, 2912, 1961,
+ 2912, 2912, 1847, 2912, 2912, 2912, 1887, 2912, 1784, 2912,
+ 1785, 2912, 1874, 2912, 2912, 1888, 2912, 1887, 2269, 2912,
+ 2912, 1875, 1946, 590, 1947, 1946, 1888, 1884, 1111, 1885,
+ 1886, 1887, 2912, 1784, 2912, 1785, 2912, 1874, 1948, 1888,
+ 2912, 2912, 1887, 1847, 2912, 1875, 1860, 480, 1861, 1862,
+
+ 1888, 2268, 2912, 1833, 1053, 1834, 1835, 2912, 1887, 1931,
+ 1931, 1931, 1931, 2536, 1197, 2536, 2536, 1888, 2912, 1836,
+ 1699, 2912, 2912, 1784, 2526, 1785, 2268, 1874, 1448, 599,
+ 1449, 1448, 1963, 1887, 1837, 2912, 1875, 2912, 2912, 2912,
+ 1149, 1888, 2912, 1838, 1450, 2912, 2912, 2912, 1784, 1150,
+ 1785, 2912, 1874, 1987, 2912, 2912, 2912, 1963, 2912, 1837,
+ 1875, 1860, 480, 1861, 1862, 1149, 2912, 1838, 1833, 1053,
+ 1834, 1835, 2912, 1150, 2537, 1199, 2538, 2539, 1987, 2912,
+ 1833, 1053, 1834, 1835, 1836, 2530, 2912, 2912, 1784, 2912,
+ 1785, 2912, 1874, 2912, 2912, 2912, 1836, 2912, 2912, 1837,
+
+ 2912, 1875, 2912, 1833, 1053, 1834, 1835, 1964, 1838, 2912,
+ 2912, 1837, 2912, 1784, 2912, 1785, 2912, 1874, 2912, 1836,
+ 1838, 1966, 2912, 2912, 1837, 1875, 1867, 387, 1787, 1868,
+ 2912, 1964, 1838, 2912, 1837, 2912, 1837, 2912, 2912, 2912,
+ 2912, 1965, 1789, 1838, 1838, 1966, 1268, 395, 1269, 1270,
+ 2912, 2912, 2912, 1784, 2912, 1785, 2912, 1869, 2912, 1837,
+ 2912, 2912, 1263, 2912, 2912, 1965, 1870, 1838, 1990, 1206,
+ 1991, 1990, 2912, 1169, 2912, 1169, 2912, 2912, 1784, 1988,
+ 1785, 2912, 1869, 2912, 1992, 2912, 1954, 599, 1955, 1954,
+ 1870, 1867, 387, 1787, 1868, 2912, 2912, 2912, 1169, 1993,
+
+ 1169, 2912, 1956, 2912, 1988, 2912, 2912, 1789, 1994, 2912,
+ 1833, 1053, 1834, 1835, 2912, 2274, 2912, 2912, 1784, 2912,
+ 1785, 2912, 1869, 2912, 1993, 2912, 1836, 2912, 2912, 2912,
+ 2912, 1870, 1994, 2912, 2912, 2912, 1833, 1053, 1834, 1835,
+ 2274, 1837, 2912, 1784, 2912, 1785, 2912, 1869, 1995, 2912,
+ 1838, 2912, 1836, 2912, 2912, 1870, 2912, 2000, 1217, 2001,
+ 2000, 2912, 1833, 1053, 1834, 1835, 1837, 1837, 1833, 1053,
+ 1834, 1835, 1995, 2002, 1838, 2912, 1838, 1996, 1836, 2912,
+ 1833, 1053, 1834, 1835, 1836, 2912, 2912, 2912, 2003, 2912,
+ 2912, 2912, 1837, 1837, 2912, 2912, 1836, 2004, 2912, 1837,
+
+ 1838, 1996, 1838, 2006, 2912, 2912, 2005, 2912, 1838, 2007,
+ 2912, 1837, 2912, 2003, 2234, 1481, 2234, 2234, 1837, 2912,
+ 1838, 2004, 2912, 2912, 1837, 2912, 1838, 2006, 2912, 2912,
+ 2005, 2912, 1838, 2912, 2007, 2912, 1837, 1833, 1053, 1834,
+ 1835, 2912, 2912, 2912, 1838, 2912, 2912, 1850, 1070, 1851,
+ 1852, 2235, 2912, 1836, 2912, 2912, 2912, 1850, 1070, 1851,
+ 1852, 2912, 2912, 1830, 2912, 2912, 2912, 2912, 1837, 2245,
+ 1492, 2245, 2245, 1830, 2912, 2235, 2912, 1838, 1853, 2912,
+ 2008, 2912, 2912, 2912, 2912, 2009, 2912, 1854, 1853, 2014,
+ 1232, 2015, 2014, 1837, 2912, 2912, 2912, 1854, 2010, 2912,
+
+ 2912, 1838, 2912, 1853, 2008, 2016, 2291, 2912, 2912, 2009,
+ 2912, 1854, 2912, 1853, 2912, 2912, 1850, 1070, 1851, 1852,
+ 2017, 1854, 2010, 2912, 2912, 2912, 2912, 2912, 2912, 2018,
+ 2291, 2912, 1830, 1850, 1070, 1851, 1852, 2912, 2912, 1850,
+ 1070, 1851, 1852, 2912, 2912, 2017, 2912, 1853, 2912, 1830,
+ 2912, 2912, 2912, 2018, 2023, 1830, 1854, 2912, 2912, 1850,
+ 1070, 1851, 1852, 2912, 1853, 2912, 2912, 2912, 2025, 2912,
+ 1853, 2912, 1853, 1854, 2024, 1830, 2912, 2912, 2023, 1854,
+ 1854, 2581, 1758, 2581, 2581, 1930, 1931, 1932, 1930, 1853,
+ 1853, 2912, 2498, 2025, 2912, 1853, 1933, 1854, 2024, 1854,
+
+ 2912, 1208, 2026, 1854, 2912, 2912, 1930, 1931, 1932, 1930,
+ 2912, 1205, 1206, 1207, 1205, 1853, 1290, 1933, 2912, 2912,
+ 2912, 2912, 1208, 1854, 2912, 1291, 2026, 1208, 1934, 1935,
+ 1936, 1934, 1935, 1935, 1935, 1935, 2912, 1290, 2912, 1937,
+ 2912, 1290, 1209, 1699, 1234, 2912, 1291, 2912, 2912, 1291,
+ 2912, 1210, 2912, 2912, 2912, 1934, 1935, 1936, 1934, 1312,
+ 2912, 2912, 1290, 1144, 2912, 2912, 1937, 1209, 1313, 2912,
+ 1291, 1234, 1145, 2912, 2912, 1210, 2912, 1231, 1232, 1233,
+ 1231, 2912, 2912, 2912, 1312, 2912, 1312, 2912, 1144, 2912,
+ 2912, 2912, 1313, 1234, 2912, 1313, 1145, 1794, 395, 1795,
+
+ 1796, 2912, 1794, 395, 1795, 1796, 2912, 2912, 1235, 2912,
+ 2912, 1312, 2912, 1789, 2912, 2912, 2912, 1236, 1789, 1313,
+ 1946, 590, 1947, 1946, 1722, 2912, 1722, 2912, 2912, 1722,
+ 2912, 1722, 2912, 1235, 2912, 2031, 1948, 1946, 590, 1947,
+ 1946, 1236, 2912, 2032, 1946, 590, 1947, 1946, 2912, 1722,
+ 2912, 1722, 2912, 1948, 1722, 2912, 1722, 2912, 2912, 2031,
+ 1948, 2348, 2912, 1954, 599, 1955, 1954, 2032, 2035, 2912,
+ 1794, 395, 1795, 1796, 2912, 2035, 2912, 2036, 2912, 1956,
+ 1954, 599, 1955, 1954, 2036, 2348, 1789, 2912, 1794, 395,
+ 1795, 1796, 2912, 2035, 2042, 2912, 1956, 1722, 2912, 1722,
+
+ 2035, 2036, 2912, 2043, 1789, 2912, 2912, 2912, 2036, 2047,
+ 2912, 2042, 2912, 2912, 2912, 1722, 2912, 1722, 2912, 2042,
+ 2043, 2048, 1722, 2912, 1722, 2912, 2912, 2043, 2912, 1794,
+ 395, 1795, 1796, 2047, 2912, 2912, 2042, 2912, 2912, 2912,
+ 1722, 2912, 1722, 2912, 2043, 1789, 2048, 1833, 1053, 1834,
+ 1835, 1833, 1053, 1834, 1835, 2912, 1722, 2912, 1722, 2912,
+ 2912, 2912, 2912, 1836, 2912, 2912, 2912, 1836, 1833, 1053,
+ 1834, 1835, 2049, 2912, 1833, 1053, 1834, 1835, 1837, 2912,
+ 2912, 1722, 1837, 1722, 1836, 2051, 2912, 1838, 2912, 2912,
+ 1836, 1838, 2052, 2912, 2912, 2912, 2049, 2053, 2912, 1837,
+
+ 2912, 2912, 2912, 1837, 2912, 1837, 2912, 1837, 1838, 2051,
+ 2912, 1838, 2912, 2912, 1838, 1838, 2052, 2054, 1973, 1189,
+ 1974, 1973, 2053, 2912, 1837, 2497, 1698, 2497, 2497, 1972,
+ 1837, 2912, 1838, 2912, 1263, 2912, 2498, 2912, 1838, 2912,
+ 2912, 2054, 2912, 2912, 1973, 1189, 1974, 1973, 2912, 1351,
+ 1977, 1193, 1978, 1977, 2912, 1972, 2912, 2912, 1352, 2912,
+ 1263, 1972, 1977, 1193, 1978, 1977, 1267, 1946, 590, 1947,
+ 1946, 2912, 2912, 1972, 1351, 1351, 2912, 2912, 1267, 2912,
+ 2912, 1346, 1352, 1948, 1352, 1977, 1193, 1978, 1979, 2912,
+ 1347, 2912, 2912, 1346, 2912, 2912, 1976, 2912, 2912, 2912,
+
+ 1351, 2912, 1347, 2912, 2912, 2195, 1346, 2912, 1352, 2253,
+ 1500, 2253, 2253, 2912, 1347, 2912, 1348, 2912, 1346, 1983,
+ 1199, 1984, 1983, 2912, 2912, 1349, 1347, 2912, 2912, 2195,
+ 1972, 1983, 1199, 1984, 1983, 1267, 2912, 1983, 1199, 1984,
+ 1985, 1348, 1972, 2912, 2912, 2912, 2230, 1267, 1976, 1349,
+ 1346, 1268, 395, 1269, 1270, 2912, 2912, 2912, 2912, 1347,
+ 2912, 2912, 1346, 2356, 1041, 2357, 2356, 1263, 1348, 2912,
+ 2230, 1347, 2912, 2912, 2912, 1346, 2912, 1349, 1169, 1956,
+ 1169, 2912, 2912, 1347, 2912, 2912, 2912, 1346, 2912, 2912,
+ 2061, 2912, 2912, 1348, 2912, 1347, 1990, 1206, 1991, 1990,
+
+ 2912, 1349, 2912, 1169, 2912, 1169, 1990, 1206, 1991, 1990,
+ 2912, 2912, 1992, 2912, 2061, 2912, 1990, 1206, 1991, 1990,
+ 2912, 2912, 1992, 1990, 1206, 1991, 1990, 1993, 1990, 1206,
+ 1991, 1990, 1992, 2912, 2912, 2912, 1994, 2062, 2912, 2064,
+ 2912, 2912, 2912, 2912, 1992, 2912, 2063, 2062, 1954, 599,
+ 1955, 1954, 1993, 2912, 1993, 2912, 2063, 2065, 2912, 1993,
+ 1994, 2912, 2062, 1994, 1956, 2912, 2912, 2912, 1994, 2912,
+ 2063, 2912, 2062, 1990, 1206, 1991, 1990, 2912, 2912, 1993,
+ 2063, 2912, 2065, 2912, 1993, 2912, 2203, 1994, 2912, 1992,
+ 2912, 2912, 1994, 1833, 1053, 1834, 1835, 2912, 2912, 1833,
+
+ 1053, 1834, 1835, 2912, 1993, 2504, 1705, 2504, 2504, 1836,
+ 2203, 2912, 2066, 1994, 2912, 1836, 2503, 2912, 2349, 1033,
+ 2350, 2349, 2067, 2912, 1837, 2000, 1217, 2001, 2000, 1993,
+ 1837, 2912, 2912, 1838, 1948, 2912, 2066, 1994, 2912, 1838,
+ 2912, 2002, 2068, 2000, 1217, 2001, 2000, 2067, 2912, 1837,
+ 2912, 2490, 1692, 2491, 2492, 1837, 2003, 1838, 2912, 2002,
+ 2912, 2912, 2435, 1838, 2912, 2004, 2068, 2912, 2912, 2000,
+ 1217, 2001, 2000, 2912, 2003, 2000, 1217, 2001, 2000, 2912,
+ 2912, 2003, 2912, 2004, 2912, 2002, 2912, 2912, 2912, 2004,
+ 1922, 2071, 2000, 1217, 2001, 2000, 2912, 2912, 2912, 2003,
+
+ 2003, 1946, 590, 1947, 1946, 2912, 2003, 2004, 2002, 2004,
+ 2000, 1217, 2001, 2000, 1922, 2004, 2912, 1948, 2912, 2912,
+ 2912, 2072, 2912, 2003, 2912, 2003, 2002, 1954, 599, 1955,
+ 1954, 2003, 2004, 2004, 2454, 2171, 1414, 2172, 2173, 2004,
+ 2912, 2003, 2912, 1956, 2912, 2912, 2072, 2912, 2003, 2073,
+ 2004, 1833, 1053, 1834, 1835, 2912, 2004, 2912, 2912, 2454,
+ 2458, 1833, 1053, 1834, 1835, 2912, 2003, 1836, 1833, 1053,
+ 1834, 1835, 2174, 2073, 2004, 2912, 2912, 1836, 2912, 2912,
+ 2074, 2912, 1837, 2912, 1836, 2458, 2912, 2077, 1306, 2078,
+ 2079, 1838, 1837, 2912, 2912, 2912, 2174, 2912, 2912, 1837,
+
+ 2912, 1838, 2912, 1836, 2075, 2074, 2912, 1837, 1838, 2076,
+ 1850, 1070, 1851, 1852, 2912, 1838, 2912, 1837, 1837, 1954,
+ 599, 1955, 1954, 2912, 1837, 1838, 1830, 1838, 2075, 2912,
+ 2912, 2912, 1838, 2076, 2912, 1956, 2912, 2912, 2912, 2080,
+ 2912, 1853, 2912, 1837, 1850, 1070, 1851, 1852, 2912, 2912,
+ 1854, 1838, 2912, 2912, 2014, 1232, 2015, 2014, 2912, 2912,
+ 1830, 2912, 2275, 2912, 2080, 2912, 1853, 2912, 2912, 2912,
+ 2016, 2912, 2912, 2912, 1854, 1853, 2014, 1232, 2015, 2014,
+ 2220, 1468, 2221, 2222, 1854, 2017, 2275, 2081, 2014, 1232,
+ 2015, 2014, 2016, 2912, 2018, 2912, 1954, 599, 1955, 1954,
+
+ 1853, 2912, 2912, 2912, 2016, 2912, 2912, 2084, 1854, 2912,
+ 2017, 2081, 1956, 2912, 2912, 2912, 2085, 2174, 2018, 2084,
+ 2014, 1232, 2015, 2014, 2525, 1186, 2525, 2525, 2085, 2912,
+ 2912, 2912, 2084, 2912, 2912, 2526, 2086, 2355, 2912, 2912,
+ 2085, 2174, 2912, 2912, 2084, 2912, 2014, 1232, 2015, 2014,
+ 2912, 2017, 2085, 2912, 2912, 2912, 2014, 1232, 2015, 2014,
+ 2018, 2355, 2016, 2912, 2912, 2912, 2234, 1481, 2234, 2234,
+ 2912, 2912, 2016, 2912, 2912, 2087, 2017, 2017, 1850, 1070,
+ 1851, 1852, 2912, 2912, 2018, 2912, 2018, 2017, 2912, 2912,
+ 1850, 1070, 1851, 1852, 1830, 2088, 2018, 2912, 2912, 2912,
+
+ 2087, 2912, 2017, 2235, 2912, 2912, 1830, 2093, 2912, 1853,
+ 2018, 2912, 2017, 2356, 1041, 2357, 2356, 2912, 1854, 2088,
+ 2018, 1853, 1850, 1070, 1851, 1852, 2912, 2235, 2912, 1956,
+ 1854, 2912, 2093, 2094, 1853, 2912, 2912, 2912, 1830, 2912,
+ 2912, 2912, 1854, 2912, 2912, 2912, 1853, 2912, 2096, 1325,
+ 2097, 2098, 2912, 1853, 1854, 2912, 2912, 2094, 2912, 2912,
+ 2912, 2912, 1854, 2095, 1830, 1794, 395, 1795, 1796, 1794,
+ 395, 1795, 1796, 2912, 1794, 395, 1795, 1796, 1853, 1853,
+ 2912, 1789, 2912, 2912, 2912, 1789, 1854, 2095, 1854, 2912,
+ 1789, 2912, 1722, 2912, 1722, 2912, 1722, 2912, 1722, 2912,
+
+ 2912, 1722, 2912, 1722, 1853, 2118, 2912, 2117, 2104, 2912,
+ 2912, 2912, 1854, 1794, 395, 1795, 1796, 1722, 2912, 1722,
+ 2912, 1722, 2912, 1722, 2912, 2912, 1722, 2912, 1722, 1789,
+ 2118, 2117, 2104, 1833, 1053, 1834, 1835, 2912, 2912, 2912,
+ 1722, 2912, 1722, 1833, 1053, 1834, 1835, 2912, 2912, 1836,
+ 1833, 1053, 1834, 1835, 2912, 2912, 2912, 2912, 2912, 1836,
+ 2119, 2912, 2121, 2912, 1837, 1722, 1836, 1722, 2912, 2124,
+ 1365, 2125, 2126, 1838, 1837, 2912, 2912, 2585, 1763, 2586,
+ 2587, 1837, 2912, 1838, 2119, 1836, 2122, 2121, 2510, 1837,
+ 1838, 2123, 1268, 395, 1269, 1270, 2912, 1838, 2912, 1837,
+
+ 1837, 1946, 590, 1947, 1946, 2912, 1837, 1838, 1263, 1838,
+ 2122, 2912, 2912, 2912, 1838, 2123, 1922, 1948, 2912, 1169,
+ 2912, 1169, 2912, 2912, 2912, 1837, 1990, 1206, 1991, 1990,
+ 2139, 2912, 2912, 1838, 2912, 2912, 1990, 1206, 1991, 1990,
+ 1922, 2610, 1992, 2912, 1169, 2912, 1169, 1990, 1206, 1991,
+ 1990, 2912, 1992, 2912, 2139, 2140, 2912, 1993, 1990, 1206,
+ 1991, 1990, 2912, 2064, 2912, 2610, 1994, 1993, 2536, 1197,
+ 2536, 2536, 2912, 2912, 1992, 2141, 1994, 2912, 1993, 2526,
+ 2140, 2912, 1993, 2581, 1758, 2581, 2581, 1994, 2912, 1993,
+ 1994, 2912, 1993, 2912, 2498, 2912, 2142, 2912, 1994, 2141,
+
+ 1994, 2912, 2912, 1993, 2912, 1990, 1206, 1991, 1990, 2912,
+ 2912, 1994, 2912, 2912, 1993, 2912, 1833, 1053, 1834, 1835,
+ 2142, 1992, 1994, 2145, 1388, 2146, 2147, 2000, 1217, 2001,
+ 2000, 2912, 1836, 2912, 2912, 2912, 1993, 2912, 2912, 1836,
+ 2912, 2912, 2912, 2071, 2912, 1994, 2143, 1837, 2245, 1492,
+ 2245, 2245, 2912, 2912, 1837, 2912, 1838, 2144, 2003, 2912,
+ 2148, 1993, 2912, 1838, 2912, 2912, 2912, 2004, 2912, 1994,
+ 2143, 2912, 1837, 2000, 1217, 2001, 2000, 2912, 2912, 1837,
+ 1838, 2144, 2912, 2003, 2148, 2235, 2912, 1838, 2912, 2002,
+ 2912, 2004, 2000, 1217, 2001, 2000, 2912, 2912, 2912, 1833,
+
+ 1053, 1834, 1835, 2912, 2003, 2912, 2912, 2912, 2002, 2235,
+ 2912, 2151, 2912, 2004, 2912, 1836, 2253, 1500, 2253, 2253,
+ 2912, 2912, 2912, 2003, 2912, 2665, 1374, 2666, 2665, 2003,
+ 1837, 2912, 2004, 2152, 2912, 2151, 2667, 2004, 2912, 1838,
+ 2153, 1948, 2154, 1397, 2155, 2156, 2912, 2912, 2003, 2077,
+ 1306, 2078, 2077, 2235, 2912, 1837, 2004, 2152, 1836, 1833,
+ 1053, 1834, 1835, 1838, 2153, 1836, 2912, 2527, 1189, 2528,
+ 2529, 2912, 2912, 1837, 2912, 1836, 2912, 2235, 2530, 2148,
+ 1909, 2912, 1838, 2912, 2912, 2912, 1731, 2912, 2912, 1910,
+ 1837, 2912, 2157, 2077, 1306, 2078, 2077, 2912, 1837, 1838,
+
+ 2912, 2912, 2912, 2148, 1722, 1909, 1838, 2912, 2912, 1836,
+ 1731, 2912, 2912, 1910, 2912, 1837, 2912, 2157, 2912, 2077,
+ 1306, 2078, 2079, 1838, 1909, 2912, 2912, 2912, 1722, 2912,
+ 1731, 2912, 2912, 1910, 2912, 1836, 1850, 1070, 1851, 1852,
+ 2912, 2912, 2160, 1403, 2161, 2162, 2912, 2912, 2912, 1909,
+ 1837, 2912, 1830, 2912, 1731, 2912, 2158, 1910, 1830, 1838,
+ 2912, 2912, 2014, 1232, 2015, 2014, 2912, 1853, 2014, 1232,
+ 2015, 2014, 2912, 1853, 2912, 1837, 1854, 2159, 2016, 2163,
+ 2158, 2912, 1854, 1838, 2016, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2166, 1853, 2017, 2014, 1232, 2015, 2014, 1853, 2017,
+
+ 1854, 2159, 2018, 2163, 2912, 2912, 1854, 2167, 2018, 2912,
+ 2086, 2014, 1232, 2015, 2014, 2912, 2166, 2912, 2017, 2912,
+ 1946, 590, 1947, 1946, 2017, 2017, 2018, 2016, 2912, 2912,
+ 2912, 2167, 2018, 2912, 2018, 2912, 1948, 2014, 1232, 2015,
+ 2014, 2912, 2017, 1850, 1070, 1851, 1852, 2534, 2912, 2168,
+ 2017, 2018, 2912, 2016, 2178, 1421, 2179, 2180, 2018, 1830,
+ 2188, 853, 2189, 2190, 2912, 2912, 2912, 2017, 2017, 2912,
+ 1830, 2912, 2534, 2168, 1853, 2018, 1789, 2018, 2169, 2866,
+ 1698, 2866, 2866, 1854, 2177, 1853, 2912, 1722, 2912, 1722,
+ 2867, 2163, 2912, 2017, 1854, 1850, 1070, 1851, 1852, 1853,
+
+ 2912, 2018, 2169, 1954, 599, 1955, 1954, 1854, 2177, 2912,
+ 1853, 1830, 1722, 2912, 1722, 2163, 2912, 2912, 1854, 1956,
+ 2912, 2096, 1325, 2097, 2096, 2912, 1853, 2912, 2181, 2912,
+ 2540, 2096, 1325, 2097, 2096, 1854, 2912, 1830, 2096, 1325,
+ 2097, 2098, 2703, 1414, 2704, 2705, 2912, 1830, 2912, 2912,
+ 2912, 1853, 1923, 2181, 1830, 2540, 2912, 2912, 1731, 1854,
+ 2912, 1924, 1923, 2912, 1794, 395, 1795, 1796, 1731, 1842,
+ 2912, 1924, 2912, 2912, 2912, 2182, 2912, 1923, 1843, 2706,
+ 1789, 2912, 1731, 2912, 2912, 1924, 2912, 1923, 2912, 2912,
+ 2912, 1722, 1731, 1722, 1842, 1924, 2912, 2912, 2912, 2182,
+
+ 2912, 2912, 1843, 2706, 2912, 2187, 1794, 395, 1795, 1796,
+ 1794, 395, 1795, 1796, 2912, 2912, 1722, 2912, 1722, 2912,
+ 2912, 2912, 1789, 2912, 2912, 2912, 1789, 2912, 2912, 2187,
+ 2912, 2912, 2912, 1722, 2912, 2207, 2912, 1722, 2912, 1722,
+ 2209, 874, 2210, 2211, 2912, 1833, 1053, 1834, 1835, 2912,
+ 2214, 1462, 2215, 2216, 2208, 2912, 1789, 2912, 1722, 2912,
+ 2207, 1836, 1722, 2912, 1722, 2912, 1836, 1722, 2912, 1722,
+ 2912, 2912, 1833, 1053, 1834, 1835, 1837, 2912, 2208, 2912,
+ 2912, 1837, 2912, 2912, 2912, 1838, 2213, 2148, 1836, 2912,
+ 1838, 2912, 1722, 2912, 1722, 2912, 2912, 1681, 874, 1682,
+
+ 1683, 1837, 2912, 1837, 2912, 2217, 1837, 2912, 2912, 1838,
+ 2213, 2148, 1838, 1263, 1838, 2124, 1365, 2125, 2124, 2124,
+ 1365, 2125, 2124, 2912, 1169, 2912, 1169, 2912, 1837, 2912,
+ 2217, 1836, 2912, 2912, 2912, 1836, 1838, 2124, 1365, 2125,
+ 2126, 2130, 1371, 2131, 2130, 2912, 1909, 2912, 2912, 1169,
+ 1909, 1169, 1738, 1836, 2912, 1910, 1738, 1847, 2912, 1910,
+ 2912, 2912, 2729, 1468, 2730, 2731, 2912, 2912, 1837, 2912,
+ 2912, 1909, 1918, 2912, 2218, 1909, 1738, 1838, 1738, 1910,
+ 1738, 1919, 2912, 1910, 2130, 1371, 2131, 2130, 2130, 1371,
+ 2131, 2132, 2912, 1837, 2912, 2912, 2912, 1918, 2218, 2706,
+
+ 1847, 1838, 1738, 2912, 2912, 1919, 2133, 1374, 2134, 2133,
+ 2912, 1946, 590, 1947, 1946, 1918, 2912, 2135, 2912, 1892,
+ 2912, 1738, 1442, 2706, 1919, 2224, 2912, 1948, 1893, 2912,
+ 2912, 1954, 599, 1955, 1954, 2912, 2535, 1515, 2912, 2912,
+ 1918, 2912, 2912, 2912, 1892, 1738, 1516, 1956, 1919, 2224,
+ 2912, 2912, 1893, 2133, 1374, 2134, 2133, 2136, 1378, 2137,
+ 2136, 2535, 1515, 2912, 2135, 2912, 2912, 2912, 2138, 1442,
+ 1516, 2611, 2912, 1450, 2136, 1378, 2137, 2136, 2912, 2912,
+ 1990, 1206, 1991, 1990, 1515, 2138, 2912, 2912, 1522, 2912,
+ 1450, 2912, 2912, 1516, 2912, 2611, 1992, 1523, 2912, 2912,
+
+ 1990, 1206, 1991, 1990, 2912, 1522, 2912, 2912, 2912, 1515,
+ 2912, 1993, 2912, 1522, 1523, 2912, 1992, 1516, 2225, 2912,
+ 1994, 1523, 2912, 1990, 1206, 1991, 1990, 2912, 2912, 2912,
+ 1522, 1993, 2873, 1705, 2873, 2873, 1993, 2912, 1523, 1992,
+ 1994, 2226, 2225, 2872, 1994, 1990, 1206, 1991, 1990, 2912,
+ 2912, 2912, 2227, 2912, 1993, 2912, 1993, 2912, 2912, 2912,
+ 2912, 1992, 2912, 1994, 1994, 2226, 1833, 1053, 1834, 1835,
+ 2668, 1378, 2669, 2668, 2912, 2912, 1993, 2227, 2912, 1993,
+ 2912, 2670, 1836, 2912, 2912, 1994, 1956, 1994, 2228, 2145,
+ 1388, 2146, 2145, 2884, 1758, 2884, 2884, 1837, 2912, 2229,
+
+ 2912, 1993, 2912, 2912, 2867, 1836, 1838, 2912, 2912, 1994,
+ 2912, 2912, 2228, 2912, 2912, 2145, 1388, 2146, 2145, 2912,
+ 1909, 2912, 1837, 2912, 2229, 2912, 2230, 2912, 2912, 1910,
+ 1838, 1836, 2145, 1388, 2146, 2147, 2912, 2912, 1946, 590,
+ 1947, 1946, 2912, 2912, 2912, 1909, 1909, 2912, 1836, 2912,
+ 2230, 2912, 2230, 1910, 1948, 1910, 2912, 2912, 1833, 1053,
+ 1834, 1835, 2912, 1837, 2000, 1217, 2001, 2000, 2912, 2231,
+ 2912, 1909, 1838, 2912, 1836, 2912, 2230, 2912, 2912, 1910,
+ 2002, 2912, 2912, 2232, 2000, 1217, 2001, 2000, 1837, 1837,
+ 2912, 2912, 2912, 2231, 2912, 2003, 1838, 2912, 1838, 2912,
+
+ 2002, 2912, 2912, 2912, 2004, 2912, 2912, 2237, 2232, 1954,
+ 599, 1955, 1954, 2236, 1837, 2003, 1833, 1053, 1834, 1835,
+ 2003, 2912, 1838, 2912, 2004, 1956, 2912, 2912, 2004, 2912,
+ 2912, 2237, 1836, 2743, 1481, 2743, 2743, 2912, 2236, 2912,
+ 2003, 2912, 2154, 1397, 2155, 2154, 2912, 1837, 2004, 2238,
+ 2912, 2912, 2154, 1397, 2155, 2154, 1838, 2912, 1836, 2154,
+ 1397, 2155, 2156, 2754, 1492, 2754, 2754, 2912, 1836, 2912,
+ 2744, 2912, 1837, 1909, 2238, 1836, 2912, 2912, 2912, 2235,
+ 1838, 2912, 1910, 1909, 2866, 1698, 2866, 2866, 2912, 2235,
+ 1837, 2912, 1910, 2912, 2744, 2867, 2148, 2912, 1909, 1838,
+
+ 2744, 2912, 2912, 2235, 2912, 2912, 1910, 2912, 1909, 1833,
+ 1053, 1834, 1835, 2235, 2912, 1837, 1910, 2912, 2912, 2912,
+ 2148, 2912, 2912, 1838, 2744, 1836, 1833, 1053, 1834, 1835,
+ 2912, 1850, 1070, 1851, 1852, 2912, 2239, 2912, 2912, 2912,
+ 1837, 2912, 1836, 2160, 1403, 2161, 2160, 1830, 2912, 1838,
+ 2912, 2240, 2873, 1705, 2873, 2873, 2912, 1837, 2912, 1830,
+ 2912, 2239, 1853, 2872, 2241, 1837, 1838, 2845, 1641, 2846,
+ 2847, 1854, 2912, 1838, 1923, 2912, 2240, 2912, 2838, 2912,
+ 2230, 2912, 1837, 1924, 2912, 2912, 2912, 1853, 2912, 2241,
+ 1838, 2762, 1500, 2762, 2762, 1854, 2912, 2912, 2912, 1923,
+
+ 2160, 1403, 2161, 2160, 2230, 2912, 2477, 1924, 2912, 2912,
+ 2160, 1403, 2161, 2162, 2912, 2912, 1830, 1850, 1070, 1851,
+ 1852, 2912, 2014, 1232, 2015, 2014, 1830, 2912, 2744, 2912,
+ 2477, 1923, 2912, 1830, 2912, 2912, 2912, 2230, 2016, 2912,
+ 1924, 1842, 2243, 1794, 395, 1795, 1796, 2242, 1853, 2912,
+ 1843, 2912, 2744, 2017, 2912, 2912, 1923, 1854, 2912, 1789,
+ 2246, 2230, 2018, 2912, 1924, 2912, 1842, 2243, 2912, 2912,
+ 2343, 2242, 1722, 1853, 1843, 2912, 2912, 2912, 2017, 2912,
+ 2912, 1854, 2912, 2912, 2246, 2912, 2018, 2014, 1232, 2015,
+ 2014, 2014, 1232, 2015, 2014, 2343, 2912, 1722, 2014, 1232,
+
+ 2015, 2014, 2912, 2016, 2912, 2912, 2912, 2016, 2912, 2743,
+ 1481, 2743, 2743, 2912, 2016, 2912, 2912, 2912, 2017, 2912,
+ 2248, 2912, 2017, 2912, 2912, 2912, 2912, 2018, 2247, 2017,
+ 2912, 2018, 2171, 1414, 2172, 2171, 2912, 2912, 2018, 2912,
+ 2912, 2249, 2912, 2017, 2912, 2248, 2744, 2017, 1847, 2912,
+ 2912, 2018, 2247, 2912, 2017, 2018, 2912, 2912, 2171, 1414,
+ 2172, 2171, 2018, 1918, 2912, 2249, 2912, 2912, 2912, 2235,
+ 2744, 2912, 1919, 2912, 1847, 2171, 1414, 2172, 2173, 2912,
+ 2912, 2754, 1492, 2754, 2754, 2912, 2912, 2912, 1918, 1918,
+ 2912, 2912, 2912, 2235, 2912, 2235, 1919, 2912, 1919, 2912,
+
+ 2912, 1850, 1070, 1851, 1852, 2912, 1892, 2178, 1421, 2179,
+ 2178, 2912, 2174, 2912, 1918, 1893, 2912, 1830, 2767, 2235,
+ 2912, 2912, 1919, 1830, 2178, 1421, 2179, 2178, 2912, 2912,
+ 2912, 1892, 1853, 2912, 2254, 2912, 2174, 2912, 1923, 1893,
+ 1830, 1854, 2767, 2912, 2235, 2912, 2912, 1924, 2912, 2912,
+ 2178, 1421, 2179, 2180, 2912, 1923, 2912, 1853, 2912, 2254,
+ 2912, 2235, 2912, 1923, 1924, 1854, 1830, 2912, 2235, 2912,
+ 2912, 1924, 2912, 1850, 1070, 1851, 1852, 2912, 2912, 2912,
+ 1923, 1842, 2912, 2912, 2912, 2235, 2912, 2163, 1924, 1830,
+ 1843, 1850, 1070, 1851, 1852, 2762, 1500, 2762, 2762, 2912,
+
+ 2255, 2912, 2912, 2912, 1853, 2912, 1842, 1830, 2912, 2912,
+ 2912, 2163, 2912, 1854, 1843, 2912, 2256, 1794, 395, 1795,
+ 1796, 2912, 1853, 2912, 2912, 2255, 2912, 2912, 2912, 1853,
+ 2912, 1854, 2739, 1789, 2912, 2912, 2912, 1854, 2912, 2912,
+ 2912, 2256, 2912, 2912, 1722, 2912, 1722, 1853, 2912, 2912,
+ 2263, 2188, 853, 2189, 2188, 1854, 2739, 2912, 2188, 853,
+ 2189, 2188, 2884, 1758, 2884, 2884, 2912, 1789, 2912, 1722,
+ 2912, 1722, 2912, 2867, 1789, 2263, 2912, 2912, 2912, 2912,
+ 2912, 2912, 1877, 1954, 599, 1955, 1954, 2912, 2264, 1877,
+ 2912, 1878, 2912, 2912, 2912, 2264, 2912, 2912, 1878, 1956,
+
+ 2192, 857, 2193, 2192, 2912, 2912, 2912, 1877, 2541, 2912,
+ 2912, 2912, 2264, 2912, 1877, 1878, 1793, 2912, 2912, 2264,
+ 2912, 2912, 1878, 2188, 853, 2189, 2190, 2912, 2912, 2912,
+ 2912, 1872, 2912, 2541, 2912, 2912, 2912, 2264, 2912, 1789,
+ 1873, 2192, 857, 2193, 2192, 2192, 857, 2193, 2194, 2912,
+ 1722, 2912, 1722, 2912, 1865, 2912, 1872, 1793, 2912, 2912,
+ 2265, 2264, 2912, 1866, 1873, 2912, 2912, 2200, 865, 2201,
+ 2200, 2912, 1872, 2912, 2912, 1722, 1874, 1722, 2264, 1865,
+ 2912, 1873, 2267, 1793, 2265, 1875, 2912, 1866, 2912, 2912,
+ 2200, 865, 2201, 2202, 2912, 2912, 2912, 1872, 1872, 2912,
+
+ 2912, 1874, 2264, 2912, 2271, 1873, 2267, 1873, 2912, 1875,
+ 2200, 865, 2201, 2200, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 1874, 2912, 1872, 2912, 2912, 1793, 2273, 2271, 2912,
+ 1875, 1873, 1794, 395, 1795, 1796, 1794, 395, 1795, 1796,
+ 2912, 1872, 2912, 2912, 2912, 2912, 1874, 2271, 1789, 2912,
+ 1873, 2273, 1789, 2912, 1875, 2912, 2912, 2912, 2912, 1722,
+ 2912, 1722, 2912, 1722, 2912, 1722, 1872, 2912, 2912, 2912,
+ 2277, 2271, 2912, 2912, 1873, 2912, 2912, 2278, 2703, 1414,
+ 2704, 2705, 2912, 2912, 1722, 2912, 1722, 2912, 1722, 2912,
+ 1722, 2912, 2912, 2912, 2277, 2912, 2912, 2439, 1111, 2440,
+
+ 2446, 2278, 1651, 2279, 956, 2280, 2281, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 2912, 2706, 1651, 1651, 1651, 1789,
+ 2912, 1651, 2912, 1651, 1651, 1651, 1651, 1651, 2447, 2729,
+ 1468, 2730, 2731, 2912, 2283, 2912, 2912, 2448, 2912, 2706,
+ 2912, 2912, 2912, 2284, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 1651, 2912, 2447, 2912, 2912, 2912, 2912, 2912, 2283,
+ 2912, 2448, 2912, 2912, 2912, 2912, 2706, 2284, 2743, 1481,
+ 2743, 2743, 2912, 2912, 2912, 1651, 1651, 1651, 2279, 956,
+ 2280, 2281, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 2912,
+ 2706, 1651, 1651, 1651, 1789, 2912, 1651, 2912, 1651, 1651,
+
+ 1651, 1651, 1651, 2912, 2912, 2744, 2912, 2912, 2912, 2283,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2284, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 1651, 2912, 2912, 2744,
+ 2912, 2912, 2912, 2912, 2283, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2284, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 1651, 1651, 1651, 2279, 956, 2280, 2285, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 2286, 2286, 1651, 1651, 1651, 1789,
+ 2287, 1651, 2287, 1651, 1651, 1651, 1651, 1651, 2287, 2287,
+ 2287, 2287, 2287, 2287, 2288, 2287, 2287, 2287, 2287, 2287,
+ 2287, 2287, 2287, 2289, 2287, 2287, 2287, 2287, 2287, 2287,
+
+ 2287, 1651, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2288,
+ 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2289, 2287, 2287,
+ 2287, 2287, 2287, 2287, 2287, 1651, 1651, 1833, 1053, 1834,
+ 1835, 2214, 1462, 2215, 2214, 2912, 2912, 2912, 2214, 1462,
+ 2215, 2214, 2912, 1836, 2912, 2912, 2912, 1836, 2912, 2214,
+ 1462, 2215, 2216, 2912, 1836, 2912, 2912, 2912, 1837, 2912,
+ 2290, 2912, 1909, 2912, 2912, 1836, 2912, 1838, 2291, 1909,
+ 2912, 1910, 2912, 2912, 2912, 2291, 2912, 2912, 1910, 2912,
+ 1837, 2912, 2912, 1837, 2912, 2290, 2292, 1909, 2912, 1838,
+ 2912, 1838, 2291, 2912, 1909, 1910, 2912, 2912, 2912, 2291,
+
+ 2912, 2912, 1910, 2912, 2912, 1837, 1833, 1053, 1834, 1835,
+ 2292, 2912, 2912, 1838, 2912, 2912, 1833, 1053, 1834, 1835,
+ 2912, 2912, 1836, 2220, 1468, 2221, 2220, 2754, 1492, 2754,
+ 2754, 2912, 1836, 2293, 2912, 2912, 2912, 1837, 2912, 1847,
+ 2912, 2294, 2859, 1692, 2860, 2861, 1838, 1837, 2762, 1500,
+ 2762, 2762, 2912, 2852, 1918, 2912, 1838, 2912, 2293, 2912,
+ 2291, 2912, 1837, 1919, 2744, 2912, 2294, 2912, 2912, 2912,
+ 1838, 2912, 1837, 2220, 1468, 2221, 2220, 2912, 2912, 1918,
+ 1838, 2477, 2912, 2912, 2291, 2744, 2912, 1919, 2744, 1847,
+ 2220, 1468, 2221, 2222, 2912, 2912, 2912, 2912, 2912, 2912,
+
+ 2888, 1763, 2889, 2890, 1918, 2477, 2912, 2912, 2912, 2744,
+ 2291, 2879, 2912, 1919, 2912, 2912, 1990, 1206, 1991, 1990,
+ 2912, 1892, 1990, 1206, 1991, 1990, 2912, 2296, 2912, 1918,
+ 1893, 2912, 1992, 2912, 2291, 2912, 2912, 1919, 1992, 2477,
+ 2912, 2912, 2912, 2912, 2912, 2299, 1892, 1993, 2912, 2912,
+ 2912, 2296, 2912, 1993, 1893, 2912, 1994, 1990, 1206, 1991,
+ 1990, 2912, 1994, 2477, 2912, 2300, 2912, 2912, 2912, 2912,
+ 2299, 2912, 1993, 1992, 2302, 1544, 2303, 2302, 1993, 2912,
+ 1994, 2912, 2912, 2912, 2912, 2912, 1994, 2912, 1993, 2300,
+ 1992, 2912, 1833, 1053, 1834, 1835, 2912, 1994, 2301, 2912,
+
+ 2912, 2912, 2912, 2912, 2912, 1993, 2912, 2912, 1836, 2912,
+ 2912, 2304, 2912, 1993, 1994, 1833, 1053, 1834, 1835, 2305,
+ 2912, 1994, 2301, 1837, 2912, 2912, 1833, 1053, 1834, 1835,
+ 1993, 1836, 1838, 2912, 2912, 2304, 2912, 2912, 1994, 2912,
+ 2307, 2912, 1836, 2912, 2305, 2912, 1837, 2912, 1837, 2912,
+ 2912, 2912, 2912, 2912, 2912, 1838, 1838, 1837, 2000, 1217,
+ 2001, 2000, 2912, 2912, 2912, 2307, 2308, 2912, 2912, 2912,
+ 2912, 1837, 2912, 2912, 2002, 2312, 1555, 2313, 2312, 1838,
+ 2912, 2912, 1837, 2912, 2912, 2912, 2912, 2912, 2912, 2003,
+ 2308, 2002, 2912, 1833, 1053, 1834, 1835, 2912, 2004, 2311,
+
+ 2912, 2912, 2912, 2912, 2912, 2912, 2003, 2912, 2912, 1836,
+ 2912, 2912, 2314, 2912, 2003, 2004, 2077, 1306, 2078, 2079,
+ 2315, 2912, 2004, 2311, 1837, 2912, 2912, 1833, 1053, 1834,
+ 1835, 2003, 1836, 1838, 2912, 2912, 2314, 2912, 2912, 2004,
+ 2912, 2912, 2912, 1836, 2912, 2315, 2912, 1837, 2912, 1837,
+ 1850, 1070, 1851, 1852, 2912, 2912, 1838, 1838, 1837, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 1830, 2316, 1850, 1070,
+ 1851, 1852, 1837, 1850, 1070, 1851, 1852, 2317, 2912, 2912,
+ 1838, 1853, 2912, 1837, 1830, 2912, 2912, 2912, 2912, 1830,
+ 1854, 2316, 2912, 2318, 2014, 1232, 2015, 2014, 2912, 1853,
+
+ 2912, 2912, 2317, 2912, 1853, 2912, 1853, 2912, 1854, 2912,
+ 2016, 2912, 2912, 2319, 1854, 2912, 2912, 2912, 2318, 2912,
+ 2912, 2912, 2912, 2321, 1853, 2017, 2912, 2912, 2912, 1853,
+ 2912, 2912, 1854, 2912, 2018, 2912, 2912, 2319, 2014, 1232,
+ 2015, 2014, 2912, 2014, 1232, 2015, 2014, 2912, 2321, 2912,
+ 2017, 2912, 2912, 2912, 2016, 2912, 2912, 2912, 2018, 2016,
+ 2324, 1568, 2325, 2324, 2096, 1325, 2097, 2098, 2912, 2017,
+ 1850, 1070, 1851, 1852, 2017, 2912, 2016, 2912, 2018, 2912,
+ 1830, 2322, 2912, 2018, 2323, 2912, 1830, 1850, 1070, 1851,
+ 1852, 2017, 2912, 2912, 2017, 1853, 2912, 2326, 2912, 2017,
+
+ 2018, 1853, 2018, 1830, 1854, 2322, 2912, 2018, 2323, 2912,
+ 2331, 2912, 2912, 2912, 2330, 2912, 2017, 2912, 1853, 2912,
+ 1853, 2326, 2912, 2912, 2018, 2912, 1853, 1854, 1854, 2335,
+ 1019, 2336, 2337, 2912, 2331, 1794, 395, 1795, 1796, 2330,
+ 2912, 2912, 2912, 1853, 2912, 1793, 2335, 1019, 2336, 2337,
+ 2912, 1854, 2912, 2912, 1794, 395, 1795, 1796, 2912, 2912,
+ 2338, 2912, 1793, 2912, 2912, 2912, 1722, 2912, 2912, 2339,
+ 1789, 2912, 1722, 2912, 2912, 2452, 2912, 2338, 2912, 2345,
+ 2912, 1722, 2912, 1722, 2912, 2338, 2339, 2912, 2912, 2912,
+ 2912, 1722, 2912, 2339, 2912, 2912, 1722, 2912, 2912, 2452,
+
+ 2912, 2912, 2338, 2912, 2345, 2912, 1722, 2912, 1722, 2912,
+ 2339, 1651, 2335, 1019, 2336, 2340, 1651, 1651, 1651, 1651,
+ 1651, 1651, 1651, 2912, 2912, 1651, 1651, 1651, 1793, 2912,
+ 1651, 2912, 1651, 1651, 1651, 1651, 1651, 1794, 395, 1795,
+ 1796, 2912, 2912, 2341, 2912, 1794, 395, 1795, 1796, 2912,
+ 2912, 2912, 2342, 1789, 2912, 2912, 2912, 2912, 2912, 2912,
+ 1651, 1789, 2912, 2912, 1722, 2912, 1722, 2912, 2341, 2912,
+ 2360, 2912, 1722, 2912, 1722, 2912, 2342, 2912, 2912, 2912,
+ 2359, 2912, 2912, 2912, 1651, 1651, 2912, 2912, 2912, 1722,
+ 2912, 1722, 2912, 2912, 2912, 2360, 2912, 1722, 2912, 1722,
+
+ 2361, 1047, 2362, 2363, 2359, 2367, 1053, 2368, 2369, 2912,
+ 2912, 2912, 2367, 1053, 2368, 2369, 2364, 2361, 1047, 2362,
+ 2375, 2370, 2912, 2367, 1053, 2368, 2369, 2912, 2370, 2912,
+ 2912, 2365, 2912, 2364, 2912, 2912, 2371, 2912, 2912, 2370,
+ 2366, 2373, 2912, 2371, 2912, 2372, 2912, 2912, 2376, 2912,
+ 2912, 2912, 2372, 2912, 2371, 2912, 2365, 2377, 2912, 2912,
+ 2912, 2371, 2374, 2372, 2366, 2912, 2373, 2912, 2371, 2372,
+ 2912, 2912, 2912, 2376, 2912, 2912, 2372, 2912, 2912, 2371,
+ 2912, 2377, 2912, 2912, 2912, 2912, 2374, 2372, 1651, 2378,
+ 1064, 2379, 2380, 1651, 1651, 1651, 1651, 1651, 1651, 1651,
+
+ 2912, 2912, 1651, 1651, 1651, 2381, 2912, 1651, 2912, 1651,
+ 1651, 1651, 1651, 1651, 2912, 2384, 1070, 2385, 2386, 2912,
+ 2382, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2383,
+ 2912, 2364, 2912, 2384, 1070, 2385, 2386, 1651, 2384, 1070,
+ 2385, 2386, 2912, 2912, 2912, 2382, 2387, 2912, 2912, 2364,
+ 2912, 2912, 2912, 2383, 2364, 2388, 2912, 2912, 2912, 2912,
+ 2912, 1651, 1651, 2912, 2387, 2912, 2912, 2389, 2912, 2387,
+ 2912, 2387, 2390, 2388, 1833, 1053, 1834, 1835, 2388, 2388,
+ 2912, 2912, 2912, 2912, 1833, 1053, 1834, 1835, 2912, 2387,
+ 1836, 2912, 2389, 2912, 2387, 2912, 2390, 2388, 2912, 2912,
+
+ 1836, 2391, 2388, 2912, 2912, 1837, 2912, 2912, 2912, 2393,
+ 2439, 1111, 2440, 2446, 1838, 1837, 2124, 1365, 2125, 2126,
+ 1833, 1053, 1834, 1835, 1838, 2912, 2391, 2912, 2912, 2912,
+ 1837, 2912, 1836, 2912, 2393, 2912, 1836, 2912, 1838, 2912,
+ 1837, 2447, 1990, 1206, 1991, 1990, 2912, 1837, 1838, 2912,
+ 2448, 1837, 2912, 2912, 2912, 2912, 1838, 2912, 1992, 2912,
+ 2394, 2912, 2399, 1610, 2400, 2399, 2447, 2912, 2912, 2912,
+ 2912, 2912, 1837, 1993, 2448, 2912, 1837, 2912, 1992, 2912,
+ 1838, 2912, 1994, 2398, 2394, 2912, 2912, 2912, 1990, 1206,
+ 1991, 1990, 2912, 1993, 2302, 1544, 2303, 2302, 1993, 2304,
+
+ 2912, 2912, 1994, 2912, 1992, 2912, 1994, 2398, 2912, 2912,
+ 1992, 2302, 1544, 2303, 2302, 2912, 2912, 2912, 1993, 1993,
+ 2912, 2401, 2912, 2304, 2912, 2062, 1994, 1992, 1994, 2912,
+ 2912, 2304, 2912, 2912, 2063, 2912, 2912, 1990, 1206, 1991,
+ 1990, 2912, 2062, 2912, 1993, 2912, 2401, 2912, 2304, 2912,
+ 2062, 2063, 1994, 1992, 2912, 2304, 2912, 2912, 2063, 2912,
+ 2912, 2912, 2402, 2145, 1388, 2146, 2147, 2062, 1993, 2912,
+ 2912, 2912, 2304, 2912, 2912, 2063, 2912, 1994, 2912, 1836,
+ 1833, 1053, 1834, 1835, 2912, 2912, 2912, 2402, 2912, 2912,
+ 2912, 2912, 2912, 1993, 1837, 2912, 1836, 2912, 2912, 2912,
+
+ 2148, 1994, 2912, 1838, 2912, 2209, 874, 2210, 2211, 2912,
+ 2912, 1837, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 1837,
+ 2404, 1789, 2912, 2912, 2148, 2912, 2912, 1838, 2912, 2912,
+ 2912, 2912, 1722, 2912, 1722, 2912, 1837, 2912, 2000, 1217,
+ 2001, 2000, 2912, 2912, 2404, 2405, 1617, 2406, 2407, 2312,
+ 1555, 2313, 2312, 2912, 2002, 2912, 2408, 1722, 2912, 1722,
+ 2912, 1836, 2912, 2912, 2912, 2002, 2912, 2912, 2912, 2003,
+ 2912, 2411, 2000, 1217, 2001, 2000, 1837, 2912, 2004, 2912,
+ 2003, 2912, 2912, 2912, 1913, 1838, 2314, 2912, 2002, 2004,
+ 2312, 1555, 2313, 2312, 2003, 2912, 2411, 2412, 2912, 2912,
+
+ 2912, 1837, 2004, 2003, 2912, 2003, 2002, 2912, 1913, 1838,
+ 2314, 2912, 2004, 2004, 2912, 2912, 2154, 1397, 2155, 2156,
+ 2912, 2003, 2412, 2912, 2912, 2912, 2912, 2314, 2003, 2912,
+ 2004, 2912, 1836, 2912, 2912, 2912, 2004, 2912, 2912, 2160,
+ 1403, 2161, 2162, 2912, 2912, 2912, 2003, 1837, 2912, 2912,
+ 2912, 2314, 2912, 2148, 2004, 1830, 1838, 2912, 1850, 1070,
+ 1851, 1852, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 1853, 2912, 1837, 2912, 1830, 2912, 2163, 2148, 2912, 1854,
+ 1838, 2413, 1625, 2414, 2415, 2912, 2912, 2912, 2912, 1853,
+ 2912, 2912, 2416, 2912, 2912, 1853, 2912, 1836, 2417, 2912,
+
+ 2163, 2912, 2912, 1854, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 1837, 2912, 1853, 2912, 2912, 2912, 2912, 2912,
+ 1913, 1838, 2417, 2014, 1232, 2015, 2014, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 1837, 2912, 2016,
+ 2912, 2912, 2912, 2912, 1913, 1838, 2418, 1630, 2419, 2420,
+ 2912, 2912, 2912, 2912, 2017, 2912, 2912, 2421, 2424, 1636,
+ 2425, 2424, 1830, 2018, 2423, 2912, 2912, 2912, 2014, 1232,
+ 2015, 2014, 2912, 2912, 2016, 2912, 2912, 1853, 2912, 2017,
+ 2324, 1568, 2325, 2324, 2016, 1926, 1854, 2018, 2423, 2017,
+ 2324, 1568, 2325, 2324, 2912, 2326, 2016, 2912, 2018, 2017,
+
+ 2912, 2426, 1853, 2912, 2912, 2912, 2016, 2912, 2018, 1926,
+ 1854, 2084, 2912, 2912, 2017, 2912, 2912, 2326, 2912, 2326,
+ 2085, 2084, 2018, 2912, 2017, 2912, 2426, 2326, 2912, 2912,
+ 2085, 2912, 2018, 2912, 2912, 2912, 2084, 2014, 1232, 2015,
+ 2014, 2326, 2912, 2912, 2085, 2912, 2084, 2912, 2912, 2912,
+ 2912, 2326, 2912, 2016, 2085, 2178, 1421, 2179, 2180, 2912,
+ 2912, 2912, 2427, 2912, 2912, 2912, 2912, 2912, 2017, 2912,
+ 2912, 1830, 2912, 2335, 1019, 2336, 2337, 2018, 2335, 1019,
+ 2336, 2337, 2912, 2912, 2912, 2912, 1853, 2427, 2912, 1793,
+ 2912, 2912, 2163, 2017, 1793, 1854, 2912, 2912, 2912, 2912,
+
+ 2912, 2018, 2912, 2912, 2338, 2912, 2912, 2912, 2912, 2338,
+ 2912, 1853, 2912, 2339, 2912, 2912, 2163, 2912, 2339, 1854,
+ 2432, 1645, 2433, 2434, 2439, 1111, 2440, 2441, 2912, 2338,
+ 2912, 2435, 2912, 2912, 2338, 2912, 1830, 2339, 2912, 2912,
+ 2381, 2912, 2339, 2912, 2912, 2912, 2367, 1053, 2368, 2369,
+ 2912, 1853, 2912, 2912, 2912, 2442, 2912, 2912, 2912, 1926,
+ 1854, 2912, 2370, 2912, 2443, 2367, 1053, 2368, 2369, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2444, 1853, 2371, 2912, 2912,
+ 2442, 2370, 2912, 1926, 1854, 2912, 2372, 2912, 2443, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2371, 2912, 2912, 2912,
+
+ 2444, 2912, 2371, 2912, 2445, 2372, 2349, 1033, 2350, 2349,
+ 2372, 2912, 2912, 2912, 2912, 2912, 2349, 1033, 2350, 2349,
+ 2912, 2371, 1948, 2356, 1041, 2357, 2356, 2912, 2445, 2372,
+ 2912, 2912, 1948, 2912, 2912, 2912, 2912, 2035, 2912, 1956,
+ 2912, 2912, 2912, 2455, 2912, 2912, 2036, 2035, 2912, 2912,
+ 2912, 2912, 2912, 2455, 2042, 2912, 2036, 2912, 2912, 2912,
+ 2459, 2912, 2035, 2043, 2912, 2912, 2912, 2455, 2912, 2912,
+ 2036, 2912, 2035, 2356, 1041, 2357, 2356, 2455, 2912, 2042,
+ 2036, 2912, 2912, 2912, 2459, 2912, 2912, 2043, 2912, 1956,
+ 1794, 395, 1795, 1796, 2912, 2361, 1047, 2362, 2363, 2361,
+
+ 1047, 2362, 2363, 2912, 2042, 2912, 1789, 2912, 2912, 2912,
+ 2459, 2364, 2912, 2043, 2912, 2364, 2912, 1722, 2912, 1722,
+ 2912, 2912, 2361, 1047, 2362, 2363, 2365, 2912, 2912, 2042,
+ 2365, 2912, 2912, 2460, 2459, 2366, 2912, 2043, 2364, 2366,
+ 2912, 2912, 1722, 2912, 1722, 2367, 1053, 2368, 2369, 2912,
+ 2912, 2365, 2912, 2365, 2912, 2365, 2912, 2460, 2912, 2366,
+ 2912, 2370, 2366, 2366, 2367, 1053, 2368, 2369, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2462, 2912, 2371, 2912, 2365, 2912,
+ 2370, 2367, 1053, 2368, 2367, 2372, 2366, 2912, 2912, 2912,
+ 2912, 2367, 1053, 2368, 2367, 2371, 2912, 2370, 2912, 2462,
+
+ 2912, 2371, 2912, 2463, 2372, 2912, 2912, 2370, 2912, 2372,
+ 2912, 2912, 2464, 2367, 1053, 2368, 2369, 2912, 2912, 2912,
+ 2371, 2465, 2464, 2912, 2912, 2912, 2912, 2463, 2372, 2370,
+ 2912, 2465, 2367, 1053, 2368, 2369, 2912, 2464, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2371, 2465, 2912, 2464, 2370, 2912,
+ 2912, 2912, 2912, 2372, 2912, 2465, 2912, 2912, 2912, 2912,
+ 2912, 2467, 2912, 2371, 2367, 1053, 2368, 2369, 2912, 2371,
+ 2912, 2912, 2372, 2912, 2912, 2912, 2912, 2372, 2912, 2912,
+ 2370, 2367, 1053, 2368, 2369, 2912, 2467, 2912, 2371, 2912,
+ 2912, 2367, 1053, 2368, 2369, 2371, 2372, 2370, 2361, 1047,
+
+ 2362, 2375, 2912, 2468, 2372, 2912, 2912, 2370, 2912, 2912,
+ 2912, 2912, 2371, 2912, 2364, 2912, 2912, 2912, 2912, 2469,
+ 2371, 2372, 2371, 2912, 2912, 2912, 2912, 2468, 2372, 2376,
+ 2912, 2372, 2470, 2912, 2912, 2912, 2912, 2371, 2377, 2912,
+ 2912, 2912, 2912, 2469, 2912, 2372, 2912, 2371, 2384, 1070,
+ 2385, 2386, 2912, 2912, 2376, 2372, 2470, 2912, 2384, 1070,
+ 2385, 2386, 2377, 2912, 2364, 2912, 2912, 2912, 2378, 1064,
+ 2379, 2378, 2912, 2912, 2364, 2912, 2912, 2471, 2912, 2387,
+ 2378, 1064, 2379, 2378, 2381, 2912, 2912, 2912, 2388, 2387,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2381, 2472, 2388, 2473,
+
+ 2912, 2912, 2471, 2912, 2387, 2912, 2912, 2912, 2474, 2912,
+ 2912, 2473, 2388, 2912, 2387, 2384, 1070, 2385, 2384, 2912,
+ 2474, 2472, 2388, 2912, 2473, 2384, 1070, 2385, 2384, 2912,
+ 2912, 2364, 2474, 2912, 2912, 2912, 2473, 2384, 1070, 2385,
+ 2386, 2364, 2912, 2912, 2474, 2912, 2478, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2364, 2912, 2479, 2478, 2384, 1070, 2385,
+ 2386, 2912, 2912, 2912, 2912, 2479, 2912, 2912, 2376, 2912,
+ 2912, 2478, 2912, 2364, 2912, 2912, 2912, 2377, 2912, 2479,
+ 2912, 2478, 2912, 2912, 2912, 2912, 2480, 2912, 2387, 2479,
+ 2912, 2912, 2912, 2376, 2912, 2912, 2912, 2388, 2912, 2912,
+
+ 2912, 2377, 2384, 1070, 2385, 2386, 2384, 1070, 2385, 2386,
+ 2912, 2480, 2912, 2387, 2912, 2912, 2912, 2912, 2364, 2912,
+ 2912, 2388, 2364, 2384, 1070, 2385, 2386, 2912, 2912, 1833,
+ 1053, 1834, 1835, 2387, 2912, 2912, 2912, 2387, 2912, 2364,
+ 2912, 2481, 2388, 2912, 2482, 1836, 2388, 2912, 2912, 2912,
+ 2428, 1641, 2429, 2430, 2387, 2912, 2912, 2912, 2387, 2912,
+ 1837, 2421, 2387, 2388, 2483, 2481, 2388, 2912, 2482, 2485,
+ 2388, 2912, 2912, 2214, 1462, 2215, 2216, 2912, 2912, 2387,
+ 2912, 1892, 2912, 2912, 2912, 1837, 2912, 2388, 2483, 1836,
+ 1893, 2912, 2912, 2485, 2912, 1990, 1206, 1991, 1990, 2912,
+
+ 2912, 2912, 2912, 2912, 1837, 2912, 1892, 2912, 2912, 2912,
+ 2148, 1992, 2912, 1838, 1893, 2399, 1610, 2400, 2399, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 1993, 2912, 2493, 1837,
+ 2912, 1992, 2912, 2912, 2148, 1994, 2912, 1838, 2486, 1688,
+ 2487, 2488, 2912, 2912, 2912, 2912, 2062, 2912, 2912, 2416,
+ 2912, 1993, 2494, 2493, 1836, 2063, 2912, 2912, 2912, 1994,
+ 2912, 2912, 2912, 2912, 2912, 1990, 1206, 1991, 1990, 1837,
+ 2912, 2062, 2399, 1610, 2400, 2399, 2494, 1913, 1838, 2063,
+ 2912, 1992, 1990, 1206, 1991, 1990, 2912, 2912, 1992, 2912,
+ 2912, 2912, 2495, 2912, 1837, 2912, 1993, 2912, 1992, 2912,
+
+ 2912, 1913, 1838, 2062, 2912, 1994, 2912, 2912, 2912, 2494,
+ 2912, 2912, 2063, 1993, 2912, 2912, 2912, 2495, 2912, 2912,
+ 2912, 1993, 2496, 2912, 2405, 1617, 2406, 2405, 2062, 1994,
+ 2912, 2912, 2912, 2494, 2912, 2503, 2063, 2912, 1993, 2912,
+ 1836, 2405, 1617, 2406, 2405, 2912, 2496, 2499, 1701, 2500,
+ 2501, 2912, 2503, 2912, 2912, 1909, 2912, 1836, 2502, 2405,
+ 1617, 2406, 2407, 1836, 1910, 2912, 2912, 2912, 2912, 2912,
+ 2408, 2912, 1909, 2912, 2912, 1836, 2912, 2912, 1837, 2912,
+ 1909, 1910, 1833, 1053, 1834, 1835, 1913, 1838, 1910, 2912,
+ 1837, 2912, 2912, 2000, 1217, 2001, 2000, 1909, 1836, 1838,
+
+ 2912, 2912, 2912, 1837, 2912, 1910, 2912, 2912, 2912, 2002,
+ 1913, 1838, 2912, 1837, 2912, 1837, 2000, 1217, 2001, 2000,
+ 2505, 2912, 1838, 1838, 2003, 2912, 2912, 2912, 2413, 1625,
+ 2414, 2413, 2002, 2004, 2912, 2912, 2912, 2912, 1837, 1972,
+ 2912, 2912, 2912, 2912, 1836, 2505, 1838, 2003, 2912, 2003,
+ 2413, 1625, 2414, 2413, 2912, 2912, 2506, 2004, 2912, 1909,
+ 2912, 1972, 2413, 1625, 2414, 2415, 1836, 2912, 1910, 2912,
+ 2912, 2912, 2003, 2416, 2912, 2912, 2912, 2912, 1836, 2912,
+ 2506, 1909, 2912, 2912, 1909, 1833, 1053, 1834, 1835, 2912,
+ 1910, 2912, 1910, 1837, 2912, 2912, 2912, 2912, 2912, 2912,
+
+ 2912, 1836, 1838, 2912, 2912, 2912, 1909, 2912, 2418, 1630,
+ 2419, 2418, 2912, 2912, 1910, 2912, 1837, 2912, 1837, 2503,
+ 2912, 2912, 2912, 2912, 1830, 1838, 1838, 2418, 1630, 2419,
+ 2418, 2418, 1630, 2419, 2420, 2912, 2912, 2912, 2503, 1923,
+ 2912, 1837, 2421, 1830, 2912, 2912, 2912, 1830, 1924, 1838,
+ 2507, 1709, 2508, 2509, 2014, 1232, 2015, 2014, 1923, 2912,
+ 2912, 2510, 1842, 2912, 1923, 2912, 1830, 1924, 2912, 2912,
+ 2016, 1843, 1924, 2912, 2912, 2912, 2014, 1232, 2015, 2014,
+ 2912, 1853, 2912, 1923, 2912, 2017, 2912, 1842, 2912, 1926,
+ 1854, 1924, 2016, 2912, 2514, 1843, 2424, 1636, 2425, 2424,
+
+ 2912, 2209, 874, 2210, 2211, 2912, 1853, 2017, 2912, 2511,
+ 2017, 2912, 2016, 1926, 1854, 2912, 2018, 1789, 2514, 2424,
+ 1636, 2425, 2424, 2912, 2912, 2912, 2912, 2084, 1722, 2912,
+ 1722, 2912, 2017, 2512, 2511, 2016, 2085, 2912, 2912, 2912,
+ 2018, 2912, 2014, 1232, 2015, 2014, 2912, 2912, 2912, 2912,
+ 2084, 2912, 2084, 1722, 2912, 1722, 2512, 2512, 2016, 2085,
+ 2085, 2428, 1641, 2429, 2428, 2428, 1641, 2429, 2428, 2513,
+ 2912, 2912, 2503, 2017, 2912, 2084, 2503, 1847, 2912, 2912,
+ 2512, 1847, 2018, 2085, 2432, 1645, 2433, 2432, 2432, 1645,
+ 2433, 2432, 1918, 2912, 2513, 1972, 1918, 2912, 2017, 1972,
+
+ 1830, 1919, 2912, 2912, 1830, 1919, 2018, 2432, 1645, 2433,
+ 2434, 2439, 1111, 2440, 2441, 1923, 2912, 1918, 2435, 1923,
+ 2912, 1918, 2912, 1830, 1924, 1919, 2912, 2381, 1924, 1919,
+ 2439, 1111, 2440, 2441, 2439, 1111, 2440, 2441, 1842, 2912,
+ 1923, 2912, 2442, 2912, 1923, 2912, 2381, 1843, 1924, 2912,
+ 2381, 2443, 1924, 2367, 1053, 2368, 2369, 2367, 1053, 2368,
+ 2369, 2442, 2912, 1842, 2912, 2442, 2912, 2442, 2912, 2370,
+ 2443, 1843, 2912, 2370, 2443, 2443, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2517, 2912, 2371, 2912, 2442, 2912, 2371, 2912,
+ 2442, 2912, 2912, 2372, 2443, 2912, 2518, 2372, 2443, 2367,
+
+ 1053, 2368, 2369, 2367, 1053, 2368, 2369, 2517, 2912, 2371,
+ 2912, 2912, 2912, 2371, 2912, 2370, 2912, 2372, 2912, 2370,
+ 2518, 2372, 2527, 1189, 2528, 2529, 2544, 1206, 2545, 2544,
+ 2371, 2912, 2912, 2530, 2371, 2912, 2912, 2519, 1789, 2372,
+ 2912, 2912, 2546, 2372, 2520, 2912, 2912, 2912, 2912, 1722,
+ 2912, 1722, 2912, 2912, 2912, 2371, 2912, 2547, 2912, 2371,
+ 2912, 2519, 2912, 2372, 2912, 2912, 2548, 2372, 2520, 1794,
+ 395, 1795, 1796, 2912, 1722, 2912, 1722, 2367, 1053, 2368,
+ 2369, 2912, 2547, 2912, 2912, 1789, 2912, 2912, 2912, 2912,
+ 2548, 2912, 2912, 2370, 2912, 2912, 1722, 2912, 1722, 2912,
+
+ 2912, 2912, 2542, 2367, 1053, 2368, 2369, 2912, 2371, 2554,
+ 1217, 2555, 2554, 2912, 2912, 2549, 2912, 2372, 2912, 2370,
+ 2912, 1722, 2912, 1722, 2912, 2556, 2912, 2542, 2912, 2912,
+ 2912, 2912, 2912, 2371, 2371, 2912, 2912, 2912, 2912, 2549,
+ 2557, 2372, 2912, 2372, 2550, 2367, 1053, 2368, 2369, 2558,
+ 2367, 1053, 2368, 2369, 2912, 2912, 2912, 2912, 2912, 2371,
+ 2912, 2370, 2912, 2912, 2912, 2557, 2370, 2372, 2550, 2912,
+ 2912, 2912, 2912, 2558, 2912, 2912, 2371, 2912, 2912, 2912,
+ 2912, 2371, 2912, 2559, 2912, 2372, 2367, 1053, 2368, 2369,
+ 2372, 2560, 2367, 1053, 2368, 2369, 2384, 1070, 2385, 2386,
+
+ 2912, 2371, 2370, 2912, 2912, 2912, 2371, 2559, 2370, 2372,
+ 2912, 2912, 2364, 2912, 2372, 2560, 2912, 2371, 2912, 2912,
+ 2912, 2561, 2912, 2371, 2912, 2912, 2372, 2387, 2912, 2562,
+ 2912, 2912, 2372, 2912, 2563, 2912, 2388, 2912, 2384, 1070,
+ 2385, 2386, 2371, 2912, 2912, 2912, 2561, 2912, 2371, 2912,
+ 2372, 2912, 2387, 2562, 2364, 2912, 2372, 2912, 2563, 2912,
+ 2388, 2568, 1232, 2569, 2568, 2912, 2912, 2912, 2912, 2387,
+ 2912, 2912, 2912, 2384, 1070, 2385, 2386, 2570, 2388, 2564,
+ 2912, 2912, 2912, 2384, 1070, 2385, 2386, 2912, 2912, 2364,
+ 2912, 2912, 2571, 2912, 2387, 2912, 2912, 2912, 2912, 2364,
+
+ 2912, 2572, 2388, 2564, 2387, 2384, 1070, 2385, 2386, 2912,
+ 2912, 2577, 2912, 2388, 2387, 2912, 2912, 2571, 2912, 2912,
+ 2912, 2364, 2912, 2388, 2578, 2572, 2912, 2912, 2912, 2387,
+ 2912, 2912, 2912, 2912, 2579, 2577, 2387, 2388, 2912, 2387,
+ 2384, 1070, 2385, 2386, 2912, 2388, 2912, 2388, 2578, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2364, 2912, 2912, 2579,
+ 2912, 2387, 2486, 1688, 2487, 2486, 2912, 2912, 2912, 2388,
+ 2912, 2387, 2912, 1972, 2486, 1688, 2487, 2486, 1836, 2912,
+ 2388, 2912, 2912, 2580, 2912, 1972, 2912, 2912, 2912, 2912,
+ 1836, 2912, 2912, 1909, 2912, 2912, 2387, 2912, 2912, 2912,
+
+ 2912, 2912, 1910, 2912, 2388, 1909, 2912, 2580, 2582, 1760,
+ 2583, 2584, 2912, 2912, 1910, 2912, 2912, 2912, 1909, 2502,
+ 2486, 1688, 2487, 2488, 1836, 2912, 1910, 2912, 2912, 2912,
+ 1909, 2416, 2912, 2912, 2912, 2912, 1836, 2912, 1910, 1837,
+ 2912, 2912, 2490, 1692, 2491, 2490, 2912, 1913, 1838, 2912,
+ 2912, 1837, 2912, 1972, 2490, 1692, 2491, 2490, 1847, 2912,
+ 1838, 2912, 2912, 2912, 1837, 1972, 2912, 2912, 2912, 2912,
+ 1847, 1913, 1838, 1918, 2912, 2912, 1837, 2490, 1692, 2491,
+ 2492, 2912, 1919, 2912, 1838, 1918, 2912, 2912, 2435, 2912,
+ 2912, 2912, 2912, 2912, 1919, 2912, 2912, 2912, 1918, 1990,
+
+ 1206, 1991, 1990, 2912, 2912, 2912, 1919, 2912, 1892, 2912,
+ 1918, 2912, 2912, 2912, 2912, 1992, 2912, 1893, 1919, 1990,
+ 1206, 1991, 1990, 2912, 2912, 2912, 2588, 2912, 2912, 2912,
+ 1993, 2912, 2912, 1892, 2912, 1992, 2912, 2912, 2912, 1994,
+ 2912, 1893, 2912, 2912, 2589, 2302, 1544, 2303, 2302, 2912,
+ 1993, 2588, 2912, 2912, 2912, 1993, 2912, 2912, 2912, 1994,
+ 2912, 1992, 2912, 1994, 1833, 1053, 1834, 1835, 2912, 2589,
+ 2912, 2912, 2912, 2912, 2912, 1993, 1993, 2912, 2912, 2912,
+ 1836, 2912, 2304, 1994, 2912, 1994, 2912, 2499, 1701, 2500,
+ 2499, 2499, 1701, 2500, 2499, 1837, 2912, 2912, 2498, 2912,
+
+ 2912, 1993, 2498, 1836, 1838, 2912, 2304, 1836, 2912, 1994,
+ 2590, 1768, 2591, 2590, 2499, 1701, 2500, 2501, 1909, 2912,
+ 1837, 2592, 1909, 2912, 2912, 2502, 1992, 1910, 1838, 2912,
+ 1836, 1910, 2312, 1555, 2313, 2312, 2912, 2912, 2912, 2912,
+ 2912, 1993, 2912, 1909, 2912, 1837, 2912, 1909, 2002, 2066,
+ 1994, 1910, 2912, 2912, 1838, 1910, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2003, 2912, 2912, 1993, 2912, 2912, 2314,
+ 1837, 2912, 2004, 2066, 1994, 2912, 2912, 2912, 1838, 2507,
+ 1709, 2508, 2507, 2912, 2912, 2912, 2912, 2912, 2003, 2912,
+ 2498, 2912, 2912, 2314, 2912, 1830, 2004, 2593, 1772, 2594,
+
+ 2593, 2507, 1709, 2508, 2507, 2912, 2912, 2912, 2595, 2912,
+ 1923, 2912, 2498, 2002, 2912, 2912, 2912, 1830, 2912, 1924,
+ 2912, 2912, 2912, 2507, 1709, 2508, 2509, 2912, 2003, 2912,
+ 2912, 2912, 1923, 2912, 2510, 1923, 2073, 2004, 2912, 1830,
+ 2912, 1924, 2912, 1924, 2912, 2912, 2014, 1232, 2015, 2014,
+ 2912, 2912, 2912, 2003, 1842, 2912, 2912, 1923, 2912, 2912,
+ 2073, 2004, 2016, 1843, 2912, 1924, 2014, 1232, 2015, 2014,
+ 2912, 2912, 2912, 2596, 2912, 2912, 2912, 2017, 2912, 1842,
+ 2912, 2912, 2016, 2912, 2912, 2912, 2018, 1843, 2912, 2912,
+ 2912, 2597, 2324, 1568, 2325, 2324, 2912, 2017, 2596, 2912,
+
+ 2912, 2912, 2017, 2912, 2912, 2912, 2018, 2912, 2016, 2912,
+ 2018, 2912, 2912, 2912, 2912, 2912, 2597, 2912, 2912, 2912,
+ 2912, 2912, 2017, 2017, 2912, 2912, 2912, 2912, 2912, 2326,
+ 2018, 2912, 2018, 2912, 2912, 2912, 2367, 1053, 2368, 2369,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2017, 2912,
+ 2912, 2912, 2370, 2326, 2912, 2912, 2018, 2598, 1778, 2599,
+ 2598, 2912, 2367, 1053, 2368, 2369, 2912, 2371, 2600, 2912,
+ 2912, 2912, 2912, 2016, 2602, 2912, 2372, 2912, 2370, 2367,
+ 1053, 2368, 2369, 2912, 2912, 2912, 2912, 2912, 2017, 2912,
+ 2912, 2912, 2371, 2371, 2912, 2370, 2088, 2018, 2602, 2912,
+
+ 2372, 2912, 2372, 2603, 2912, 2912, 2912, 2912, 2604, 2912,
+ 2371, 2912, 2912, 2017, 2367, 1053, 2368, 2369, 2371, 2372,
+ 2088, 2018, 2912, 2912, 2912, 2912, 2372, 2603, 2912, 2912,
+ 2370, 2912, 2912, 2604, 2912, 2371, 2527, 1189, 2528, 2527,
+ 2912, 2912, 2912, 2372, 2912, 2371, 2912, 2526, 2527, 1189,
+ 2528, 2527, 1789, 2912, 2372, 2912, 2912, 2605, 2912, 2526,
+ 2912, 2912, 2912, 2912, 1789, 2912, 2912, 1877, 2912, 2912,
+ 2371, 2531, 1193, 2532, 2531, 2912, 1878, 2912, 2372, 1877,
+ 2912, 2605, 2526, 2531, 1193, 2532, 2531, 1793, 1878, 2912,
+ 2912, 2912, 1877, 2912, 2526, 2912, 2912, 2912, 2912, 1793,
+
+ 1878, 2912, 1872, 2912, 1877, 2531, 1193, 2532, 2533, 2912,
+ 2912, 1873, 1878, 2912, 1872, 2912, 2530, 2537, 1199, 2538,
+ 2537, 2912, 2912, 1873, 2912, 2912, 2912, 1872, 2526, 2912,
+ 2912, 2912, 2912, 1793, 2912, 1873, 1874, 2912, 2912, 1872,
+ 2537, 1199, 2538, 2537, 2912, 1875, 2912, 1873, 1872, 2912,
+ 2912, 2526, 2537, 1199, 2538, 2539, 1793, 1873, 2912, 2912,
+ 2912, 1874, 2912, 2530, 2912, 2912, 2912, 2912, 2912, 1875,
+ 2912, 1872, 2912, 1872, 1794, 395, 1795, 1796, 2912, 2912,
+ 1873, 1873, 2912, 1874, 2544, 1206, 2545, 2544, 2912, 2912,
+ 1789, 2912, 1875, 2912, 2912, 2912, 1872, 2912, 2912, 2912,
+
+ 2546, 1722, 2912, 1722, 1873, 2912, 2912, 2912, 1874, 2912,
+ 2912, 2912, 2912, 2612, 2912, 2547, 1875, 2912, 2544, 1206,
+ 2545, 2544, 2912, 2912, 2548, 2912, 1722, 2912, 1722, 2544,
+ 1206, 2545, 2544, 2912, 2546, 2912, 2912, 2612, 2912, 2912,
+ 2547, 2544, 1206, 2545, 2544, 2546, 2912, 2912, 2548, 2613,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2615, 2614, 2912,
+ 2613, 2544, 1206, 2545, 2544, 2912, 2912, 2912, 2912, 2614,
+ 2912, 2912, 2547, 2912, 2613, 2912, 2912, 2546, 2912, 2912,
+ 2912, 2548, 2614, 2912, 2912, 2613, 2912, 2912, 2912, 2912,
+ 2616, 2912, 2547, 2614, 2912, 2912, 2912, 2547, 2912, 2912,
+
+ 2912, 2548, 2912, 2912, 2912, 2548, 2544, 1206, 2545, 2544,
+ 2367, 1053, 2368, 2369, 2912, 2616, 2912, 2547, 2912, 2912,
+ 2912, 2912, 2546, 2912, 2912, 2548, 2370, 2912, 2367, 1053,
+ 2368, 2369, 2554, 1217, 2555, 2554, 2912, 2547, 2912, 2618,
+ 2912, 2371, 2912, 2912, 2370, 2617, 2548, 2912, 2556, 2912,
+ 2372, 2554, 1217, 2555, 2554, 2912, 2912, 2912, 2912, 2371,
+ 2912, 2912, 2547, 2557, 2618, 2912, 2371, 2556, 2372, 2617,
+ 2548, 2619, 2558, 2912, 2372, 2912, 2912, 2554, 1217, 2555,
+ 2554, 2912, 2557, 2912, 2371, 2912, 2912, 2912, 2557, 2912,
+ 2912, 2558, 2372, 2556, 2912, 2619, 2558, 2554, 1217, 2555,
+
+ 2554, 2912, 2912, 2554, 1217, 2555, 2554, 2557, 2557, 2554,
+ 1217, 2555, 2554, 2622, 2912, 2558, 2912, 2558, 2912, 2556,
+ 2912, 2912, 2912, 2912, 2912, 2556, 2912, 2912, 2557, 2912,
+ 2912, 2912, 2623, 2557, 2557, 2912, 2912, 2558, 2912, 2912,
+ 2557, 2558, 2912, 2558, 2912, 2912, 2912, 2912, 2624, 2558,
+ 2912, 2912, 2912, 2557, 2912, 2912, 2912, 2623, 2912, 2557,
+ 2912, 2558, 2912, 2912, 2912, 2557, 2912, 2558, 2367, 1053,
+ 2368, 2369, 2624, 2558, 2367, 1053, 2368, 2369, 2367, 1053,
+ 2368, 2369, 2912, 2912, 2370, 2912, 2912, 2912, 2912, 2912,
+ 2370, 2912, 2912, 2912, 2370, 2912, 2912, 2625, 2912, 2371,
+
+ 2628, 1306, 2629, 2630, 2912, 2371, 2912, 2912, 2372, 2371,
+ 2912, 2912, 2912, 2912, 2372, 2912, 2370, 2626, 2372, 2627,
+ 2912, 2912, 2625, 2912, 2371, 2912, 2912, 2912, 2912, 2912,
+ 2371, 2371, 2372, 2912, 2371, 2912, 2912, 2912, 2372, 2912,
+ 2372, 2626, 2372, 2627, 2384, 1070, 2385, 2386, 2912, 2384,
+ 1070, 2385, 2386, 2912, 2912, 2912, 2371, 2912, 2912, 2912,
+ 2364, 2912, 2912, 2912, 2372, 2364, 2568, 1232, 2569, 2568,
+ 2912, 2912, 2912, 2631, 2912, 2387, 2912, 2912, 2912, 2912,
+ 2387, 2912, 2570, 2912, 2388, 2912, 2912, 2912, 2912, 2388,
+ 2912, 2912, 2632, 2568, 1232, 2569, 2568, 2571, 2631, 2912,
+
+ 2387, 2912, 2912, 2912, 2912, 2387, 2572, 2912, 2388, 2570,
+ 2912, 2912, 2912, 2388, 2912, 2912, 2632, 2912, 2912, 2912,
+ 2912, 2912, 2571, 2912, 2635, 2568, 1232, 2569, 2568, 2912,
+ 2572, 2912, 2912, 2636, 2912, 2568, 1232, 2569, 2568, 2912,
+ 2912, 2570, 2568, 1232, 2569, 2568, 2912, 2912, 2912, 2635,
+ 2912, 2637, 2912, 2912, 2912, 2912, 2635, 2636, 2570, 2912,
+ 2912, 2568, 1232, 2569, 2568, 2636, 2571, 2912, 2912, 2912,
+ 2912, 2638, 2912, 2571, 2912, 2572, 2912, 2570, 2912, 2912,
+ 2912, 2635, 2572, 2912, 2912, 2912, 2912, 2912, 2912, 2636,
+ 2912, 2571, 2571, 2912, 2912, 2912, 2638, 2912, 2571, 2572,
+
+ 2639, 2572, 2384, 1070, 2385, 2386, 2572, 2384, 1070, 2385,
+ 2386, 2912, 2384, 1070, 2385, 2386, 2912, 2571, 2364, 2912,
+ 2912, 2912, 2912, 2364, 2639, 2572, 2912, 2912, 2364, 2912,
+ 2912, 2644, 2912, 2387, 2912, 2912, 2912, 2912, 2387, 2912,
+ 2912, 2912, 2388, 2387, 2912, 2912, 2912, 2388, 2912, 2912,
+ 2645, 2912, 2388, 2646, 2912, 2912, 2644, 2912, 2387, 2647,
+ 1325, 2648, 2649, 2387, 2912, 2912, 2388, 2912, 2387, 2912,
+ 2912, 2388, 2912, 2912, 2645, 2364, 2388, 2646, 2582, 1760,
+ 2583, 2582, 2582, 1760, 2583, 2582, 2912, 2912, 2912, 2498,
+ 2387, 2912, 2912, 2498, 1836, 2912, 2912, 2912, 1836, 2388,
+
+ 2582, 1760, 2583, 2584, 2912, 2912, 2912, 2912, 2912, 1909,
+ 2912, 2502, 2912, 1909, 2912, 2387, 1836, 2912, 1910, 2912,
+ 2912, 2912, 1910, 2388, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 1837, 2912, 2912, 1909, 2912, 2912, 2912, 1909, 2912,
+ 1838, 2912, 1910, 2912, 2912, 2912, 1910, 2585, 1763, 2586,
+ 2585, 2585, 1763, 2586, 2585, 2912, 1837, 2912, 2498, 2912,
+ 2912, 2912, 2498, 1847, 1838, 2912, 2912, 1847, 2585, 1763,
+ 2586, 2587, 2912, 2399, 1610, 2400, 2399, 2912, 1918, 2510,
+ 2912, 2912, 1918, 2912, 2912, 2912, 2912, 1919, 2912, 1992,
+ 2912, 1919, 2912, 2912, 2912, 2845, 1641, 2846, 2847, 1892,
+
+ 2912, 2912, 2912, 1918, 1993, 2912, 2838, 1918, 1893, 2912,
+ 2304, 1919, 2912, 1994, 2912, 1919, 2912, 1990, 1206, 1991,
+ 1990, 2912, 2912, 2912, 1892, 2912, 2447, 2912, 2912, 1993,
+ 2912, 2912, 1893, 1992, 2304, 2448, 2912, 1994, 2590, 1768,
+ 2591, 2590, 2912, 2912, 2590, 1768, 2591, 2590, 1993, 2592,
+ 2912, 2447, 2912, 2912, 1992, 2592, 2912, 2650, 2912, 2448,
+ 1992, 1990, 1206, 1991, 1990, 2912, 2912, 2912, 2912, 2062,
+ 2912, 2912, 2912, 1993, 2912, 2062, 2912, 1992, 2063, 2912,
+ 2912, 2650, 2912, 2912, 2063, 2912, 2912, 2593, 1772, 2594,
+ 2593, 2912, 1993, 2912, 2062, 2912, 2912, 2912, 2595, 2912,
+
+ 2062, 1994, 2063, 2002, 2593, 1772, 2594, 2593, 2063, 2912,
+ 2000, 1217, 2001, 2000, 2912, 2595, 2912, 1993, 2003, 2912,
+ 2002, 2424, 1636, 2425, 2424, 1994, 2002, 2004, 2912, 2912,
+ 2912, 2014, 1232, 2015, 2014, 2003, 2912, 2016, 2912, 2912,
+ 2912, 2003, 2912, 2003, 2004, 2912, 2912, 2016, 2912, 2912,
+ 2004, 2004, 2017, 2598, 1778, 2599, 2598, 2912, 2326, 2912,
+ 2003, 2018, 2017, 2912, 2600, 2912, 2003, 2912, 2004, 2016,
+ 2912, 2651, 2912, 2912, 2004, 2912, 2912, 2017, 2912, 2912,
+ 2912, 2912, 2326, 2912, 2084, 2018, 2912, 2017, 2598, 1778,
+ 2599, 2598, 2912, 2085, 2912, 2651, 2912, 2912, 2912, 2600,
+
+ 2014, 1232, 2015, 2014, 2016, 2367, 1053, 2368, 2369, 2084,
+ 2367, 1053, 2368, 2369, 2912, 2912, 2016, 2085, 2912, 2084,
+ 2912, 2370, 2912, 2912, 2912, 2912, 2370, 2912, 2085, 2912,
+ 2912, 2017, 2912, 2912, 2653, 2912, 2371, 2912, 2912, 2912,
+ 2018, 2371, 2912, 2912, 2084, 2372, 2912, 2912, 2912, 2912,
+ 2372, 2912, 2085, 2654, 2912, 2912, 2017, 2912, 2912, 2653,
+ 2912, 2371, 2912, 2912, 2018, 2912, 2371, 2912, 2912, 2372,
+ 2367, 1053, 2368, 2369, 2372, 2912, 2912, 2654, 2912, 2912,
+ 2912, 2656, 1365, 2657, 2658, 2912, 2370, 1794, 395, 1795,
+ 1796, 2544, 1206, 2545, 2544, 2912, 2912, 2370, 2912, 2912,
+
+ 2912, 2371, 2912, 1789, 2912, 2912, 2912, 2546, 2912, 2912,
+ 2372, 2655, 2371, 2912, 1722, 2912, 1722, 2544, 1206, 2545,
+ 2544, 2372, 2547, 2912, 2912, 2671, 2371, 2912, 2912, 2912,
+ 2673, 2548, 2912, 2546, 2372, 2655, 2912, 2371, 2912, 1722,
+ 2912, 1722, 2912, 2912, 2912, 2372, 2672, 2547, 2547, 2671,
+ 2912, 2912, 2912, 2912, 2673, 2548, 2912, 2548, 2544, 1206,
+ 2545, 2544, 2544, 1206, 2545, 2544, 2912, 2912, 2912, 2912,
+ 2912, 2672, 2912, 2547, 2615, 2912, 2912, 2912, 2546, 2912,
+ 2912, 2548, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2547,
+ 2912, 2912, 2912, 2547, 2544, 1206, 2545, 2544, 2548, 2912,
+
+ 2674, 2912, 2548, 2912, 2912, 2367, 1053, 2368, 2369, 2912,
+ 2546, 2912, 2912, 2912, 2547, 2912, 2912, 2912, 2547, 2912,
+ 2912, 2370, 2548, 2912, 2674, 2547, 2548, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2548, 2675, 2371, 2677, 1388, 2678,
+ 2679, 2554, 1217, 2555, 2554, 2372, 2676, 2912, 2912, 2912,
+ 2547, 2912, 2912, 2370, 2912, 2912, 2912, 2622, 2548, 2675,
+ 2912, 2371, 2912, 2912, 2554, 1217, 2555, 2554, 2371, 2372,
+ 2676, 2912, 2557, 2912, 2680, 2912, 2912, 2372, 2912, 2912,
+ 2556, 2558, 2912, 2554, 1217, 2555, 2554, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2371, 2912, 2557, 2912, 2557, 2680, 2556,
+
+ 2912, 2372, 2683, 2912, 2558, 2558, 2912, 2912, 2912, 2367,
+ 1053, 2368, 2369, 2912, 2557, 2686, 1397, 2687, 2688, 2912,
+ 2557, 2912, 2912, 2558, 2684, 2370, 2683, 2912, 2558, 2912,
+ 2912, 2370, 2912, 2912, 2912, 2367, 1053, 2368, 2369, 2557,
+ 2371, 2628, 1306, 2629, 2628, 2912, 2371, 2558, 2684, 2372,
+ 2685, 2370, 2680, 2912, 2912, 2372, 2912, 2370, 2912, 2912,
+ 2912, 2628, 1306, 2629, 2628, 2371, 2371, 2912, 2689, 2912,
+ 2912, 2371, 2464, 2372, 2685, 2372, 2680, 2370, 2264, 2372,
+ 2912, 2465, 2912, 2912, 2628, 1306, 2629, 2630, 2912, 2912,
+ 2912, 2371, 2464, 2689, 2912, 2912, 2912, 2464, 2264, 2372,
+
+ 2370, 2465, 2264, 2912, 2912, 2465, 2912, 2912, 2912, 2912,
+ 2384, 1070, 2385, 2386, 2912, 2371, 2912, 2464, 2912, 2912,
+ 2912, 2690, 2264, 2912, 2372, 2465, 2364, 2692, 1403, 2693,
+ 2694, 2568, 1232, 2569, 2568, 2912, 2912, 2912, 2912, 2912,
+ 2371, 2387, 2912, 2364, 2912, 2690, 2912, 2570, 2372, 2912,
+ 2388, 2691, 2912, 2568, 1232, 2569, 2568, 2912, 2387, 2912,
+ 2698, 2912, 2571, 2912, 2695, 2912, 2387, 2388, 2912, 2570,
+ 2912, 2572, 2912, 2912, 2388, 2691, 2912, 2912, 2912, 2859,
+ 1692, 2860, 2861, 2387, 2571, 2698, 2912, 2571, 2695, 2912,
+ 2852, 2388, 2699, 2572, 2912, 2572, 2568, 1232, 2569, 2568,
+
+ 2912, 2912, 2568, 1232, 2569, 2568, 2912, 2912, 2912, 2571,
+ 2447, 2912, 2637, 2912, 2912, 2912, 2699, 2572, 2570, 2448,
+ 2912, 2912, 2568, 1232, 2569, 2568, 2912, 2571, 2384, 1070,
+ 2385, 2386, 2912, 2571, 2912, 2447, 2572, 2912, 2570, 2912,
+ 2700, 2912, 2572, 2448, 2364, 2710, 1421, 2711, 2712, 2912,
+ 2912, 2912, 2571, 2571, 2912, 2912, 2912, 2912, 2571, 2387,
+ 2572, 2364, 2572, 2701, 2700, 2912, 2572, 2912, 2388, 2709,
+ 2912, 2912, 2384, 1070, 2385, 2386, 2387, 2912, 2571, 2912,
+ 2912, 2912, 2695, 2912, 2387, 2388, 2572, 2701, 2364, 2912,
+ 2912, 2912, 2388, 2709, 2647, 1325, 2648, 2647, 2912, 2912,
+
+ 2912, 2387, 2912, 2387, 2912, 2713, 2695, 2912, 2912, 2388,
+ 2364, 2912, 2388, 2912, 2912, 2912, 2647, 1325, 2648, 2647,
+ 2912, 2912, 2912, 2912, 2912, 2478, 2912, 2912, 2387, 2912,
+ 2713, 2264, 2364, 2912, 2479, 2912, 2388, 2912, 2647, 1325,
+ 2648, 2649, 2912, 2912, 2912, 2912, 2912, 2478, 2912, 2912,
+ 2478, 2912, 2912, 2264, 2364, 2264, 2479, 2912, 2479, 2912,
+ 2367, 1053, 2368, 2369, 2912, 2912, 2912, 2912, 2912, 2376,
+ 2912, 2912, 2478, 2912, 2912, 2714, 2370, 2264, 2377, 2912,
+ 2479, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2371, 2912, 2912, 2376, 2912, 2912, 2912, 2912, 2714,
+
+ 2372, 2722, 2377, 2715, 1931, 2716, 2715, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2717, 2912, 2371, 2912, 2912, 1992,
+ 2912, 2912, 2912, 2912, 2372, 2722, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 1993, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2066, 1994, 2912, 2723, 1462, 2724, 2725, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 1993,
+ 2912, 2370, 2367, 1053, 2368, 2369, 2066, 1994, 2718, 1935,
+ 2719, 2718, 2912, 2912, 2912, 2912, 2371, 2912, 2370, 2720,
+ 2912, 2912, 2680, 2912, 2016, 2372, 2912, 2912, 2656, 1365,
+ 2657, 2656, 2912, 2371, 2912, 2726, 2912, 2912, 2912, 2017,
+
+ 2912, 2371, 2372, 2912, 2370, 2912, 2680, 2088, 2018, 2372,
+ 2912, 2656, 1365, 2657, 2656, 2912, 2912, 2912, 2371, 2464,
+ 2726, 2912, 2912, 2912, 2017, 2271, 2372, 2370, 2465, 2912,
+ 2912, 2088, 2018, 2912, 2656, 1365, 2657, 2658, 2912, 2912,
+ 2912, 2912, 2464, 2912, 2464, 2912, 2912, 2912, 2271, 2271,
+ 2370, 2465, 2465, 2912, 2662, 1371, 2663, 2662, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2371, 2912, 2464, 2912, 2912,
+ 2381, 2727, 2271, 2912, 2372, 2465, 2662, 1371, 2663, 2662,
+ 2662, 1371, 2663, 2664, 2912, 2473, 2912, 2912, 2912, 2912,
+ 2371, 2271, 2381, 2912, 2474, 2727, 2912, 2912, 2372, 2912,
+
+ 2912, 2912, 2912, 2665, 1374, 2666, 2665, 2473, 2912, 2912,
+ 2473, 2447, 2912, 2271, 2667, 2271, 2474, 2733, 2474, 1948,
+ 2448, 2912, 2665, 1374, 2666, 2665, 2544, 1206, 2545, 2544,
+ 2912, 2912, 2473, 2667, 2035, 2912, 2447, 2271, 1948, 2912,
+ 2474, 2733, 2546, 2036, 2448, 2668, 1378, 2669, 2668, 2668,
+ 1378, 2669, 2668, 2035, 2912, 2912, 2670, 2547, 2912, 2035,
+ 2670, 1956, 2036, 2912, 2734, 1956, 2548, 2036, 2912, 2912,
+ 2912, 2544, 1206, 2545, 2544, 2912, 2042, 2912, 2035, 2912,
+ 2042, 2912, 2547, 2912, 2912, 2043, 2036, 2546, 2734, 2043,
+ 2548, 2544, 1206, 2545, 2544, 2912, 2912, 2703, 1414, 2704,
+
+ 2705, 2042, 2547, 2912, 2912, 2042, 2912, 2546, 2912, 2043,
+ 2912, 2548, 2735, 2043, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2736, 2912, 2547, 2544, 1206, 2545, 2544, 2547, 2447, 2912,
+ 2912, 2548, 2912, 2912, 2706, 2548, 2735, 2448, 2912, 2546,
+ 2367, 1053, 2368, 2369, 2912, 2736, 2912, 2547, 2912, 2912,
+ 2912, 2912, 2912, 2447, 2547, 2548, 2370, 2912, 2706, 2912,
+ 2912, 2448, 2912, 2548, 2912, 2912, 2737, 2912, 2912, 2912,
+ 2912, 2371, 2912, 2738, 2912, 2677, 1388, 2678, 2677, 2547,
+ 2372, 2912, 2912, 2912, 2912, 2912, 2912, 2548, 2912, 2912,
+ 2737, 2370, 2677, 1388, 2678, 2677, 2371, 2912, 2738, 2912,
+
+ 2912, 2912, 2912, 2912, 2372, 2912, 2464, 2912, 2370, 2912,
+ 2912, 2912, 2739, 2912, 2912, 2465, 2912, 2912, 2677, 1388,
+ 2678, 2679, 2912, 2464, 2912, 2912, 2912, 2912, 2912, 2739,
+ 2912, 2464, 2465, 2912, 2370, 2912, 2739, 2912, 2912, 2465,
+ 2912, 2367, 1053, 2368, 2369, 2912, 2912, 2912, 2464, 2371,
+ 2912, 2912, 2912, 2739, 2912, 2740, 2465, 2370, 2372, 2554,
+ 1217, 2555, 2554, 2912, 2912, 2912, 2741, 2912, 2912, 2912,
+ 2912, 2912, 2371, 2912, 2371, 2556, 2912, 2912, 2912, 2740,
+ 2912, 2372, 2372, 2912, 2912, 2912, 2912, 2912, 2745, 2912,
+ 2557, 2741, 2912, 2554, 1217, 2555, 2554, 2371, 2912, 2558,
+
+ 2686, 1397, 2687, 2686, 2912, 2372, 2912, 2912, 2912, 2556,
+ 2912, 2912, 2912, 2745, 2912, 2557, 2370, 2912, 2912, 2367,
+ 1053, 2368, 2369, 2558, 2557, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2464, 2912, 2558, 2912, 2370, 2746, 2744, 2912, 2912,
+ 2465, 2912, 2686, 1397, 2687, 2686, 2912, 2912, 2912, 2557,
+ 2371, 2912, 2747, 2912, 2912, 2912, 2464, 2558, 2370, 2372,
+ 2746, 2744, 2912, 2912, 2465, 2686, 1397, 2687, 2688, 2912,
+ 2912, 2912, 2912, 2464, 2912, 2371, 2912, 2747, 2912, 2744,
+ 2912, 2370, 2465, 2372, 2367, 1053, 2368, 2369, 2367, 1053,
+ 2368, 2369, 2912, 2912, 2912, 2912, 2371, 2912, 2464, 2912,
+
+ 2370, 2912, 2680, 2744, 2370, 2372, 2465, 2912, 2912, 2912,
+ 2912, 2748, 2912, 2749, 2912, 2371, 2912, 2912, 2912, 2371,
+ 2912, 2371, 2912, 2912, 2372, 2912, 2680, 2912, 2372, 2372,
+ 2384, 1070, 2385, 2386, 2912, 2912, 2748, 2912, 2749, 2912,
+ 2371, 2912, 2912, 2912, 2371, 2912, 2364, 2912, 2372, 2912,
+ 2912, 2912, 2372, 2692, 1403, 2693, 2692, 2912, 2912, 2912,
+ 2912, 2387, 2912, 2750, 2692, 1403, 2693, 2692, 2912, 2364,
+ 2388, 2692, 1403, 2693, 2694, 2912, 2912, 2912, 2912, 2912,
+ 2364, 2912, 2912, 2912, 2478, 2912, 2387, 2364, 2750, 2912,
+ 2739, 2912, 2912, 2479, 2388, 2478, 2912, 2912, 2912, 2912,
+
+ 2912, 2739, 2376, 2912, 2479, 2912, 2912, 2912, 2751, 2478,
+ 2912, 2377, 2912, 2912, 2739, 2912, 2912, 2479, 2912, 2912,
+ 2478, 2384, 1070, 2385, 2386, 2739, 2912, 2376, 2479, 2912,
+ 2912, 2912, 2751, 2912, 2912, 2377, 2912, 2364, 2568, 1232,
+ 2569, 2568, 2568, 1232, 2569, 2568, 2752, 2912, 2912, 2912,
+ 2912, 2912, 2387, 2912, 2570, 2912, 2912, 2912, 2570, 2912,
+ 2912, 2388, 2912, 2912, 2568, 1232, 2569, 2568, 2912, 2571,
+ 2912, 2752, 2912, 2571, 2912, 2912, 2755, 2387, 2572, 2912,
+ 2570, 2912, 2572, 2756, 2912, 2388, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2757, 2571, 2571, 2912, 2912, 2571, 2912,
+
+ 2755, 2912, 2572, 2912, 2572, 2912, 2572, 2756, 2568, 1232,
+ 2569, 2568, 2912, 2703, 1414, 2704, 2703, 2912, 2757, 2912,
+ 2571, 2912, 2912, 2912, 2570, 2912, 2912, 2912, 2572, 2381,
+ 2703, 1414, 2704, 2703, 2912, 2912, 2912, 2912, 2912, 2571,
+ 2384, 1070, 2385, 2386, 2473, 2912, 2381, 2912, 2572, 2912,
+ 2744, 2758, 2912, 2474, 2912, 2912, 2364, 2912, 2912, 2912,
+ 2912, 2473, 2912, 2912, 2571, 2912, 2912, 2744, 2912, 2473,
+ 2474, 2387, 2572, 2763, 2744, 2758, 2912, 2474, 2912, 2912,
+ 2388, 2710, 1421, 2711, 2710, 2912, 2473, 2912, 2912, 2912,
+ 2912, 2744, 2912, 2912, 2474, 2912, 2387, 2364, 2763, 2710,
+
+ 1421, 2711, 2710, 2912, 2388, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2478, 2912, 2912, 2364, 2912, 2912, 2744, 2912,
+ 2912, 2479, 2710, 1421, 2711, 2712, 2912, 2912, 2912, 2912,
+ 2478, 2912, 2912, 2912, 2912, 2912, 2744, 2478, 2364, 2479,
+ 2912, 2912, 2744, 2912, 2912, 2479, 2912, 2912, 2384, 1070,
+ 2385, 2386, 2912, 2376, 2912, 2478, 2912, 2912, 2912, 2695,
+ 2744, 2912, 2377, 2479, 2364, 2384, 1070, 2385, 2386, 2912,
+ 2912, 2715, 1931, 2716, 2715, 2764, 2912, 2912, 2376, 2387,
+ 2912, 2364, 2717, 2695, 2912, 2912, 2377, 1992, 2388, 2912,
+ 2765, 2912, 2715, 1931, 2716, 2715, 2387, 2912, 2912, 2912,
+
+ 2764, 2912, 2062, 2717, 2387, 2388, 2912, 2912, 1992, 2912,
+ 2912, 2063, 2388, 2912, 2912, 2765, 2912, 2912, 2912, 2912,
+ 2912, 2387, 2912, 2062, 2912, 2912, 2912, 2062, 2912, 2388,
+ 2912, 2912, 2063, 2912, 2912, 2063, 1990, 1206, 1991, 1990,
+ 2912, 2912, 2718, 1935, 2719, 2718, 2912, 2912, 2062, 2912,
+ 2912, 2912, 1992, 2720, 2912, 2912, 2063, 2912, 2016, 2718,
+ 1935, 2719, 2718, 2014, 1232, 2015, 2014, 1993, 2912, 2912,
+ 2720, 2912, 2912, 2084, 2912, 2016, 1994, 2912, 2912, 2016,
+ 2912, 2912, 2085, 2912, 2912, 2367, 1053, 2368, 2369, 2912,
+ 2084, 2912, 1993, 2912, 2017, 2912, 2912, 2912, 2084, 2085,
+
+ 1994, 2370, 2912, 2018, 2912, 2912, 2085, 2912, 2723, 1462,
+ 2724, 2723, 2912, 2912, 2912, 2084, 2371, 2912, 2766, 2017,
+ 2912, 2912, 2912, 2085, 2370, 2372, 2912, 2018, 2723, 1462,
+ 2724, 2723, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2464,
+ 2912, 2371, 2912, 2766, 2370, 2767, 2912, 2912, 2465, 2372,
+ 2723, 1462, 2724, 2725, 2912, 2912, 2912, 2912, 2912, 2464,
+ 2367, 1053, 2368, 2369, 2464, 2767, 2370, 2912, 2465, 2767,
+ 2912, 2912, 2465, 2912, 2912, 2912, 2370, 2367, 1053, 2368,
+ 2369, 2371, 2912, 2912, 2464, 2770, 2912, 2768, 2912, 2767,
+ 2372, 2371, 2465, 2370, 2912, 2912, 2912, 2912, 2912, 2912,
+
+ 2372, 2912, 2912, 2912, 2769, 2912, 2371, 2912, 2371, 2912,
+ 2770, 2768, 2912, 2912, 2372, 2912, 2371, 2372, 2729, 1468,
+ 2730, 2729, 2912, 2912, 2372, 2729, 1468, 2730, 2731, 2769,
+ 2912, 2912, 2912, 2371, 2381, 2729, 1468, 2730, 2729, 2912,
+ 2912, 2372, 2912, 2912, 2912, 2544, 1206, 2545, 2544, 2473,
+ 2912, 2381, 2912, 2912, 2912, 2767, 2447, 2912, 2474, 2912,
+ 2912, 2546, 2772, 2912, 2912, 2448, 2473, 2912, 2912, 2912,
+ 2912, 2912, 2767, 2912, 2473, 2474, 2547, 2912, 2912, 2767,
+ 2912, 2447, 2474, 2912, 2912, 2548, 2772, 2912, 2776, 2448,
+ 2912, 2473, 2544, 1206, 2545, 2544, 2767, 2912, 2912, 2474,
+
+ 2912, 2547, 2544, 1206, 2545, 2544, 2912, 2912, 2546, 2548,
+ 2912, 2912, 2776, 2778, 1544, 2779, 2778, 2912, 2546, 2912,
+ 2912, 2775, 2912, 2547, 2367, 1053, 2368, 2369, 2912, 2546,
+ 2912, 2912, 2548, 2547, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2370, 2912, 2548, 2777, 2547, 2912, 2775, 2912, 2547, 2912,
+ 2780, 2781, 2912, 2548, 2912, 2371, 2548, 2912, 2547, 2367,
+ 1053, 2368, 2369, 2912, 2372, 2912, 2548, 2777, 2912, 2547,
+ 2367, 1053, 2368, 2369, 2780, 2370, 2781, 2548, 2912, 2912,
+ 2371, 2912, 2912, 2912, 2783, 2912, 2370, 2912, 2372, 2912,
+ 2371, 2554, 1217, 2555, 2554, 2912, 2912, 2912, 2912, 2372,
+
+ 2912, 2371, 2788, 1555, 2789, 2788, 2912, 2556, 2912, 2783,
+ 2784, 2912, 2912, 2912, 2912, 2371, 2912, 2912, 2556, 2912,
+ 2912, 2912, 2557, 2372, 2912, 2912, 2371, 2912, 2912, 2912,
+ 2912, 2558, 2787, 2557, 2784, 2912, 2912, 2912, 2912, 2790,
+ 2912, 2912, 2558, 2367, 1053, 2368, 2369, 2557, 2628, 1306,
+ 2629, 2630, 2912, 2912, 2912, 2558, 2787, 2912, 2557, 2370,
+ 2912, 2912, 2912, 2790, 2370, 2912, 2558, 2912, 2912, 2912,
+ 2791, 2912, 2912, 2912, 2371, 2367, 1053, 2368, 2369, 2371,
+ 2912, 2912, 2912, 2372, 2912, 2912, 2912, 2912, 2372, 2912,
+ 2912, 2370, 2912, 2912, 2912, 2791, 2912, 2912, 2912, 2371,
+
+ 2912, 2912, 2912, 2912, 2371, 2912, 2371, 2372, 2912, 2912,
+ 2912, 2912, 2372, 2912, 2912, 2792, 2384, 1070, 2385, 2386,
+ 2384, 1070, 2385, 2386, 2912, 2912, 2384, 1070, 2385, 2386,
+ 2912, 2371, 2364, 2912, 2912, 2912, 2364, 2912, 2912, 2792,
+ 2912, 2912, 2364, 2793, 2912, 2794, 2912, 2387, 2912, 2912,
+ 2912, 2387, 2912, 2912, 2912, 2912, 2388, 2387, 2912, 2912,
+ 2388, 2912, 2568, 1232, 2569, 2568, 2795, 2912, 2793, 2912,
+ 2794, 2912, 2387, 2912, 2912, 2912, 2387, 2912, 2570, 2912,
+ 2388, 2912, 2387, 2912, 2388, 2912, 2912, 2912, 2912, 2912,
+ 2795, 2797, 2912, 2571, 2568, 1232, 2569, 2568, 2568, 1232,
+
+ 2569, 2568, 2572, 2912, 2800, 1568, 2801, 2800, 2912, 2912,
+ 2570, 2912, 2912, 2912, 2570, 2912, 2797, 2912, 2571, 2912,
+ 2570, 2912, 2912, 2912, 2912, 2571, 2572, 2912, 2912, 2571,
+ 2912, 2912, 2912, 2912, 2572, 2571, 2912, 2798, 2572, 2799,
+ 2912, 2802, 2912, 2912, 2572, 2912, 2912, 2912, 2912, 2912,
+ 2571, 2912, 2912, 2912, 2571, 2912, 2912, 2912, 2572, 2912,
+ 2571, 2798, 2572, 2799, 2912, 2802, 2912, 2912, 2572, 2384,
+ 1070, 2385, 2386, 2647, 1325, 2648, 2649, 2912, 2912, 2384,
+ 1070, 2385, 2386, 2912, 2912, 2364, 2912, 2912, 2912, 2364,
+ 2912, 2912, 2912, 2912, 2912, 2364, 2806, 2912, 2912, 2912,
+
+ 2387, 2912, 2912, 2912, 2387, 2912, 2912, 2912, 2912, 2388,
+ 2387, 2912, 2912, 2388, 2367, 1053, 2368, 2369, 2912, 2807,
+ 2912, 2806, 2912, 2912, 2912, 2387, 2912, 2912, 2912, 2387,
+ 2370, 2912, 2912, 2388, 2912, 2387, 2912, 2388, 2912, 2912,
+ 2912, 2808, 2912, 2807, 2912, 2371, 2367, 1053, 2368, 2369,
+ 2912, 2912, 2912, 2912, 2372, 2912, 2912, 2656, 1365, 2657,
+ 2658, 2912, 2370, 2912, 2912, 2912, 2808, 2912, 2912, 2912,
+ 2371, 2810, 2912, 2370, 2912, 2912, 2912, 2371, 2372, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2372, 2912, 2371, 2367,
+ 1053, 2368, 2369, 2912, 2912, 2912, 2810, 2372, 2912, 2912,
+
+ 2912, 2912, 2371, 2912, 2912, 2370, 2544, 1206, 2545, 2544,
+ 2372, 2912, 2912, 2371, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2371, 2372, 2546, 2816, 1610, 2817, 2816, 2912, 2912, 2811,
+ 2912, 2912, 2912, 2544, 1206, 2545, 2544, 2547, 2912, 2546,
+ 2912, 2912, 2912, 2912, 2912, 2371, 2548, 2815, 2912, 2546,
+ 2912, 2912, 2912, 2811, 2547, 2912, 2912, 2912, 2912, 2912,
+ 2780, 2912, 2547, 2548, 2547, 2912, 2818, 2912, 2912, 2912,
+ 2548, 2815, 2912, 2548, 2778, 1544, 2779, 2778, 2912, 2547,
+ 2912, 2912, 2912, 2912, 2780, 2912, 2912, 2548, 2912, 2547,
+ 2546, 2818, 2778, 1544, 2779, 2778, 2912, 2548, 2912, 2912,
+
+ 2912, 2912, 2912, 2912, 2912, 2613, 2912, 2912, 2546, 2912,
+ 2912, 2780, 2912, 2912, 2614, 2544, 1206, 2545, 2544, 2912,
+ 2912, 2912, 2912, 2613, 2912, 2912, 2912, 2912, 2912, 2780,
+ 2613, 2546, 2614, 2912, 2912, 2780, 2912, 2912, 2614, 2912,
+ 2819, 2677, 1388, 2678, 2679, 2912, 2547, 2912, 2613, 2912,
+ 2912, 2912, 2912, 2780, 2912, 2548, 2614, 2370, 2367, 1053,
+ 2368, 2369, 2912, 2912, 2912, 2819, 2912, 2912, 2912, 2912,
+ 2912, 2547, 2371, 2912, 2370, 2912, 2912, 2912, 2680, 2548,
+ 2912, 2372, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2371,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2371, 2821, 2912,
+
+ 2912, 2912, 2680, 2912, 2912, 2372, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2371, 2912, 2554, 1217, 2555, 2554,
+ 2912, 2912, 2821, 2822, 1617, 2823, 2824, 2788, 1555, 2789,
+ 2788, 2912, 2556, 2912, 2825, 2912, 2912, 2912, 2912, 2370,
+ 2912, 2912, 2912, 2556, 2912, 2912, 2912, 2557, 2912, 2828,
+ 2554, 1217, 2555, 2554, 2371, 2912, 2558, 2912, 2557, 2912,
+ 2912, 2912, 2468, 2372, 2790, 2912, 2556, 2558, 2788, 1555,
+ 2789, 2788, 2557, 2912, 2828, 2829, 2912, 2912, 2912, 2371,
+ 2558, 2557, 2912, 2557, 2556, 2912, 2468, 2372, 2790, 2912,
+ 2558, 2558, 2912, 2912, 2686, 1397, 2687, 2688, 2912, 2557,
+
+ 2829, 2912, 2912, 2912, 2912, 2790, 2557, 2912, 2558, 2912,
+ 2370, 2912, 2912, 2912, 2558, 2912, 2912, 2692, 1403, 2693,
+ 2694, 2912, 2912, 2912, 2557, 2371, 2912, 2912, 2912, 2790,
+ 2912, 2680, 2558, 2364, 2372, 2912, 2384, 1070, 2385, 2386,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2387, 2912,
+ 2371, 2912, 2364, 2912, 2695, 2680, 2912, 2388, 2372, 2830,
+ 1625, 2831, 2832, 2912, 2912, 2912, 2912, 2387, 2912, 2912,
+ 2833, 2912, 2912, 2387, 2912, 2370, 2834, 2912, 2695, 2912,
+ 2912, 2388, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2371, 2912, 2387, 2912, 2912, 2912, 2912, 2912, 2468, 2372,
+
+ 2834, 2568, 1232, 2569, 2568, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2371, 2912, 2570, 2912, 2912,
+ 2912, 2912, 2468, 2372, 2835, 1630, 2836, 2837, 2912, 2912,
+ 2912, 2912, 2571, 2912, 2912, 2838, 2841, 1636, 2842, 2841,
+ 2364, 2572, 2840, 2912, 2912, 2912, 2568, 1232, 2569, 2568,
+ 2912, 2912, 2570, 2912, 2912, 2387, 2912, 2571, 2800, 1568,
+ 2801, 2800, 2570, 2481, 2388, 2572, 2840, 2571, 2800, 1568,
+ 2801, 2800, 2912, 2802, 2570, 2912, 2572, 2571, 2912, 2843,
+ 2387, 2912, 2912, 2912, 2570, 2912, 2572, 2481, 2388, 2635,
+ 2912, 2912, 2571, 2912, 2912, 2802, 2912, 2802, 2636, 2635,
+
+ 2572, 2912, 2571, 2912, 2843, 2802, 2912, 2912, 2636, 2912,
+ 2572, 2912, 2912, 2912, 2635, 2568, 1232, 2569, 2568, 2802,
+ 2912, 2912, 2636, 2912, 2635, 2912, 2912, 2912, 2912, 2802,
+ 2912, 2570, 2636, 2710, 1421, 2711, 2712, 2912, 2912, 2912,
+ 2844, 2912, 2912, 2912, 2912, 2912, 2571, 2912, 2912, 2364,
+ 2912, 2723, 1462, 2724, 2725, 2572, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2387, 2844, 2912, 2370, 2912, 2912,
+ 2695, 2571, 2912, 2388, 2912, 2912, 2912, 2912, 2912, 2572,
+ 2912, 2912, 2371, 2912, 2912, 2912, 2912, 2912, 2680, 2387,
+ 2912, 2372, 2912, 2912, 2695, 2912, 2912, 2388, 2849, 1645,
+
+ 2850, 2851, 2367, 1053, 2368, 2369, 2912, 2371, 2912, 2852,
+ 2912, 2912, 2680, 2912, 2364, 2372, 2912, 2912, 2370, 2912,
+ 2912, 2912, 2912, 2912, 2544, 1206, 2545, 2544, 2912, 2387,
+ 2912, 2912, 2912, 2371, 2912, 2912, 2912, 2481, 2388, 2912,
+ 2546, 2912, 2854, 2912, 2816, 1610, 2817, 2816, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2387, 2547, 2912, 2862, 2371, 2912,
+ 2546, 2481, 2388, 2912, 2548, 2912, 2854, 2855, 1688, 2856,
+ 2857, 2912, 2912, 2912, 2912, 2613, 2912, 2912, 2833, 2912,
+ 2547, 2863, 2862, 2370, 2614, 2912, 2912, 2912, 2548, 2912,
+ 2912, 2912, 2912, 2912, 2544, 1206, 2545, 2544, 2371, 2912,
+
+ 2613, 2816, 1610, 2817, 2816, 2863, 2468, 2372, 2614, 2912,
+ 2546, 2544, 1206, 2545, 2544, 2912, 2912, 2546, 2912, 2912,
+ 2912, 2864, 2912, 2371, 2912, 2547, 2912, 2546, 2912, 2912,
+ 2468, 2372, 2613, 2912, 2548, 2912, 2912, 2912, 2863, 2912,
+ 2912, 2614, 2547, 2912, 2912, 2912, 2864, 2912, 2912, 2912,
+ 2547, 2865, 2912, 2822, 1617, 2823, 2822, 2613, 2548, 2912,
+ 2912, 2912, 2863, 2912, 2872, 2614, 2912, 2547, 2912, 2370,
+ 2822, 1617, 2823, 2822, 2912, 2865, 2868, 1701, 2869, 2870,
+ 2912, 2872, 2912, 2912, 2464, 2912, 2370, 2871, 2822, 1617,
+ 2823, 2824, 2370, 2465, 2912, 2912, 2912, 2912, 2912, 2825,
+
+ 2912, 2464, 2912, 2912, 2370, 2912, 2912, 2371, 2912, 2464,
+ 2465, 2367, 1053, 2368, 2369, 2468, 2372, 2465, 2912, 2371,
+ 2912, 2912, 2554, 1217, 2555, 2554, 2464, 2370, 2372, 2912,
+ 2912, 2912, 2371, 2912, 2465, 2912, 2912, 2912, 2556, 2468,
+ 2372, 2912, 2371, 2912, 2371, 2554, 1217, 2555, 2554, 2874,
+ 2912, 2372, 2372, 2557, 2912, 2912, 2912, 2830, 1625, 2831,
+ 2830, 2556, 2558, 2912, 2912, 2912, 2912, 2371, 2526, 2912,
+ 2912, 2912, 2912, 2370, 2874, 2372, 2557, 2912, 2557, 2830,
+ 1625, 2831, 2830, 2912, 2912, 2875, 2558, 2912, 2464, 2912,
+ 2526, 2830, 1625, 2831, 2832, 2370, 2912, 2465, 2912, 2912,
+
+ 2912, 2557, 2833, 2912, 2912, 2912, 2912, 2370, 2912, 2875,
+ 2464, 2912, 2912, 2464, 2367, 1053, 2368, 2369, 2912, 2465,
+ 2912, 2465, 2371, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2370, 2372, 2912, 2912, 2912, 2464, 2912, 2835, 1630, 2836,
+ 2835, 2912, 2912, 2465, 2912, 2371, 2912, 2371, 2872, 2912,
+ 2912, 2912, 2912, 2364, 2372, 2372, 2835, 1630, 2836, 2835,
+ 2835, 1630, 2836, 2837, 2912, 2912, 2912, 2872, 2478, 2912,
+ 2371, 2838, 2364, 2912, 2912, 2912, 2364, 2479, 2372, 2876,
+ 1709, 2877, 2878, 2568, 1232, 2569, 2568, 2478, 2912, 2912,
+ 2879, 2376, 2912, 2478, 2912, 2364, 2479, 2912, 2912, 2570,
+
+ 2377, 2479, 2912, 2912, 2912, 2568, 1232, 2569, 2568, 2912,
+ 2387, 2912, 2478, 2912, 2571, 2912, 2376, 2912, 2481, 2388,
+ 2479, 2570, 2912, 2883, 2377, 2841, 1636, 2842, 2841, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2387, 2571, 2912, 2880, 2571,
+ 2912, 2570, 2481, 2388, 2912, 2572, 2912, 2883, 2841, 1636,
+ 2842, 2841, 2912, 2912, 2912, 2912, 2635, 2912, 2912, 2912,
+ 2912, 2571, 2881, 2880, 2570, 2636, 2912, 2912, 2912, 2572,
+ 2912, 2568, 1232, 2569, 2568, 2912, 2912, 2912, 2912, 2635,
+ 2912, 2635, 2912, 2912, 2912, 2881, 2881, 2570, 2636, 2636,
+ 2845, 1641, 2846, 2845, 2845, 1641, 2846, 2845, 2882, 2912,
+
+ 2912, 2872, 2571, 2912, 2635, 2872, 2381, 2912, 2912, 2881,
+ 2381, 2572, 2636, 2849, 1645, 2850, 2849, 2849, 1645, 2850,
+ 2849, 2473, 2912, 2882, 2526, 2473, 2912, 2571, 2526, 2364,
+ 2474, 2912, 2912, 2364, 2474, 2572, 2849, 1645, 2850, 2851,
+ 2912, 2912, 2912, 2912, 2478, 2912, 2473, 2852, 2478, 2912,
+ 2473, 2912, 2364, 2479, 2474, 2912, 2912, 2479, 2474, 2855,
+ 1688, 2856, 2855, 2912, 2912, 2912, 2912, 2376, 2912, 2478,
+ 2526, 2912, 2912, 2478, 2912, 2370, 2377, 2479, 2912, 2912,
+ 2912, 2479, 2855, 1688, 2856, 2855, 2912, 2912, 2912, 2912,
+ 2464, 2912, 2376, 2526, 2855, 1688, 2856, 2857, 2370, 2465,
+
+ 2377, 2885, 1760, 2886, 2887, 2833, 2912, 2912, 2912, 2912,
+ 2370, 2912, 2871, 2464, 2912, 2464, 2912, 2370, 2912, 2912,
+ 2912, 2912, 2465, 2465, 2912, 2371, 2912, 2912, 2859, 1692,
+ 2860, 2859, 2371, 2912, 2372, 2912, 2912, 2912, 2464, 2526,
+ 2468, 2372, 2912, 2912, 2381, 2912, 2465, 2912, 2912, 2912,
+ 2371, 2859, 1692, 2860, 2859, 2912, 2912, 2371, 2372, 2473,
+ 2912, 2912, 2526, 2912, 2468, 2372, 2912, 2381, 2474, 2544,
+ 1206, 2545, 2544, 2544, 1206, 2545, 2544, 2912, 2912, 2912,
+ 2912, 2912, 2473, 2912, 2473, 2546, 2912, 2912, 2912, 2546,
+ 2912, 2474, 2474, 2912, 2912, 2912, 2891, 2912, 2892, 2912,
+
+ 2547, 2912, 2912, 2912, 2547, 2912, 2912, 2473, 2912, 2548,
+ 2912, 2912, 2912, 2548, 2912, 2474, 2778, 1544, 2779, 2778,
+ 2912, 2891, 2912, 2892, 2912, 2547, 2912, 2912, 2912, 2547,
+ 2912, 2912, 2546, 2548, 2912, 2912, 2912, 2548, 2868, 1701,
+ 2869, 2868, 2912, 2912, 2912, 2912, 2912, 2547, 2912, 2867,
+ 2912, 2912, 2912, 2780, 2370, 2912, 2548, 2912, 2912, 2868,
+ 1701, 2869, 2868, 2912, 2912, 2912, 2912, 2912, 2912, 2464,
+ 2867, 2912, 2547, 2912, 2912, 2370, 2912, 2780, 2465, 2912,
+ 2548, 2893, 1768, 2894, 2893, 2868, 1701, 2869, 2870, 2912,
+ 2464, 2912, 2895, 2912, 2464, 2912, 2871, 2546, 2912, 2465,
+
+ 2912, 2370, 2465, 2367, 1053, 2368, 2369, 2912, 2912, 2912,
+ 2912, 2912, 2547, 2912, 2912, 2464, 2371, 2912, 2912, 2370,
+ 2617, 2548, 2912, 2465, 2912, 2372, 2788, 1555, 2789, 2788,
+ 2912, 2912, 2912, 2912, 2371, 2912, 2912, 2547, 2912, 2912,
+ 2912, 2371, 2556, 2372, 2617, 2548, 2912, 2912, 2912, 2372,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2557, 2912, 2371,
+ 2912, 2912, 2912, 2790, 2912, 2912, 2558, 2372, 2876, 1709,
+ 2877, 2876, 2876, 1709, 2877, 2876, 2912, 2912, 2912, 2867,
+ 2912, 2912, 2557, 2867, 2364, 2912, 2912, 2790, 2364, 2912,
+ 2558, 2896, 1772, 2897, 2896, 2876, 1709, 2877, 2878, 2478,
+
+ 2912, 2912, 2898, 2478, 2912, 2912, 2879, 2556, 2479, 2912,
+ 2912, 2364, 2479, 2568, 1232, 2569, 2568, 2568, 1232, 2569,
+ 2568, 2912, 2557, 2912, 2478, 2912, 2376, 2912, 2478, 2570,
+ 2624, 2558, 2479, 2570, 2912, 2377, 2479, 2912, 2912, 2912,
+ 2899, 2912, 2900, 2912, 2571, 2912, 2912, 2557, 2571, 2912,
+ 2912, 2376, 2912, 2572, 2624, 2558, 2912, 2572, 2912, 2377,
+ 2800, 1568, 2801, 2800, 2912, 2899, 2912, 2900, 2912, 2571,
+ 2912, 2912, 2912, 2571, 2912, 2912, 2570, 2572, 2912, 2912,
+ 2912, 2572, 2885, 1760, 2886, 2885, 2912, 2912, 2912, 2912,
+ 2912, 2571, 2912, 2867, 2912, 2912, 2912, 2802, 2370, 2912,
+
+ 2572, 2912, 2912, 2885, 1760, 2886, 2885, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2464, 2867, 2912, 2571, 2912, 2912, 2370,
+ 2912, 2802, 2465, 2912, 2572, 2901, 1778, 2902, 2901, 2885,
+ 1760, 2886, 2887, 2912, 2464, 2912, 2903, 2912, 2464, 2912,
+ 2871, 2570, 2912, 2465, 2912, 2370, 2465, 2888, 1763, 2889,
+ 2888, 2888, 1763, 2889, 2890, 2912, 2571, 2912, 2867, 2464,
+ 2371, 2912, 2879, 2381, 2639, 2572, 2912, 2465, 2912, 2372,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2473, 2912,
+ 2912, 2571, 2447, 2912, 2912, 2371, 2912, 2474, 2639, 2572,
+ 2912, 2448, 2912, 2372, 2888, 1763, 2889, 2888, 2816, 1610,
+
+ 2817, 2816, 2912, 2473, 2912, 2867, 2912, 2447, 2912, 2912,
+ 2381, 2474, 2912, 2912, 2546, 2448, 2544, 1206, 2545, 2544,
+ 2893, 1768, 2894, 2893, 2912, 2473, 2912, 2912, 2912, 2547,
+ 2912, 2895, 2546, 2912, 2474, 2780, 2546, 2912, 2548, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2547, 2912, 2912,
+ 2473, 2613, 2912, 2912, 2547, 2912, 2904, 2912, 2474, 2780,
+ 2614, 2912, 2548, 2893, 1768, 2894, 2893, 2544, 1206, 2545,
+ 2544, 2912, 2547, 2912, 2895, 2912, 2613, 2912, 2912, 2546,
+ 2904, 2912, 2912, 2546, 2614, 2896, 1772, 2897, 2896, 2896,
+ 1772, 2897, 2896, 2912, 2613, 2912, 2898, 2912, 2547, 2912,
+
+ 2898, 2556, 2912, 2614, 2912, 2556, 2912, 2548, 2554, 1217,
+ 2555, 2554, 2568, 1232, 2569, 2568, 2557, 2912, 2912, 2613,
+ 2557, 2912, 2912, 2547, 2556, 2558, 2912, 2614, 2570, 2558,
+ 2912, 2548, 2912, 2912, 2841, 1636, 2842, 2841, 2912, 2557,
+ 2912, 2557, 2912, 2571, 2912, 2557, 2912, 2912, 2558, 2558,
+ 2570, 2912, 2905, 2558, 2568, 1232, 2569, 2568, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2557, 2571, 2912, 2912, 2571, 2912,
+ 2570, 2802, 2558, 2912, 2572, 2912, 2905, 2901, 1778, 2902,
+ 2901, 2901, 1778, 2902, 2901, 2571, 2912, 2912, 2903, 2912,
+ 2571, 2912, 2903, 2570, 2572, 2802, 2912, 2570, 2572, 2912,
+
+ 2906, 1931, 2907, 2906, 2906, 1931, 2907, 2906, 2635, 2912,
+ 2571, 2908, 2635, 2912, 2912, 2908, 2546, 2636, 2572, 2912,
+ 2546, 2636, 2912, 2544, 1206, 2545, 2544, 2909, 1935, 2910,
+ 2909, 2613, 2912, 2635, 2912, 2613, 2912, 2635, 2911, 2546,
+ 2614, 2636, 2912, 2570, 2614, 2636, 2906, 1931, 2907, 2906,
+ 2912, 2912, 2912, 2912, 2547, 2912, 2613, 2908, 2635, 2912,
+ 2613, 2912, 2546, 2548, 2614, 2912, 2912, 2636, 2614, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2547, 2912, 2547,
+ 2912, 2912, 2912, 2635, 2912, 2617, 2548, 2548, 2912, 2912,
+ 2912, 2636, 2909, 1935, 2910, 2909, 2912, 2912, 2912, 2912,
+
+ 2912, 2912, 2547, 2911, 2568, 1232, 2569, 2568, 2570, 2617,
+ 2548, 2909, 1935, 2910, 2909, 2912, 2912, 2912, 2912, 2912,
+ 2570, 2912, 2911, 2635, 2912, 2912, 2912, 2570, 2912, 2912,
+ 2912, 2912, 2636, 2912, 2912, 2571, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2571, 2912, 2572, 2912, 2912, 2912, 2635, 2912,
+ 2639, 2572, 2912, 2912, 2912, 2912, 2636, 2912, 2912, 2912,
+ 2571, 2912, 2912, 2912, 2912, 2912, 2912, 2571, 2572, 2912,
+ 2912, 2912, 2912, 2912, 2639, 2572, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 100, 100,
+
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+ 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 97, 97, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
+ 97, 97, 97, 97, 97, 97, 123, 123, 123, 123,
+ 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+
+ 123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
+ 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+ 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+ 141, 141, 141, 141, 141, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 141, 141, 141, 2912, 2912, 141, 141, 141,
+ 141, 139, 139, 139, 139, 139, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 139, 2912, 2912, 2912, 2912, 139, 139,
+ 139, 139, 156, 156, 156, 156, 156, 156, 156, 156,
+ 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+ 156, 156, 156, 156, 159, 159, 159, 159, 140, 140,
+
+ 140, 140, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 140, 140, 140, 2912, 140, 140, 140, 140, 175,
+ 175, 175, 175, 175, 2912, 2912, 2912, 2912, 175, 175,
+ 2912, 175, 175, 175, 175, 2912, 175, 175, 175, 175,
+ 234, 234, 2912, 234, 234, 234, 234, 234, 234, 234,
+ 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+ 234, 234, 236, 2912, 2912, 236, 2912, 2912, 236, 2912,
+ 2912, 236, 236, 236, 2912, 2912, 2912, 236, 236, 2912,
+ 236, 238, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 238, 2912, 2912, 238, 238, 238, 238, 245, 2912,
+
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 245,
+ 2912, 2912, 245, 245, 245, 245, 247, 2912, 2912, 247,
+ 2912, 2912, 247, 2912, 2912, 247, 247, 247, 247, 2912,
+ 2912, 247, 247, 2912, 2912, 247, 251, 251, 2912, 251,
+ 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+ 251, 251, 251, 251, 251, 251, 251, 251, 254, 2912,
+ 2912, 2912, 2912, 254, 2912, 254, 254, 254, 2912, 2912,
+ 254, 254, 256, 2912, 2912, 256, 256, 256, 256, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 2912, 2912, 259, 259, 259,
+
+ 259, 265, 265, 265, 265, 265, 265, 265, 265, 2912,
+ 2912, 265, 265, 265, 265, 265, 265, 265, 265, 265,
+ 265, 265, 265, 271, 2912, 2912, 2912, 2912, 271, 271,
+ 2912, 271, 2912, 271, 2912, 2912, 271, 271, 271, 271,
+ 272, 272, 2912, 272, 272, 272, 272, 272, 2912, 2912,
+ 272, 272, 2912, 2912, 272, 272, 272, 272, 272, 272,
+ 272, 272, 275, 275, 2912, 275, 275, 275, 275, 275,
+ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
+ 275, 275, 275, 275, 139, 139, 139, 139, 139, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+
+ 2912, 139, 139, 139, 139, 174, 174, 174, 174, 174,
+ 2912, 2912, 2912, 2912, 174, 174, 2912, 174, 2912, 174,
+ 174, 2912, 174, 174, 174, 174, 280, 280, 280, 280,
+ 280, 2912, 2912, 2912, 2912, 280, 280, 2912, 280, 280,
+ 280, 280, 2912, 280, 280, 280, 280, 291, 291, 291,
+ 291, 2912, 2912, 2912, 291, 291, 2912, 2912, 2912, 2912,
+ 291, 291, 2912, 2912, 291, 291, 291, 291, 152, 152,
+ 2912, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+ 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+
+ 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+ 156, 156, 299, 2912, 2912, 299, 299, 299, 299, 166,
+ 2912, 2912, 2912, 2912, 166, 2912, 166, 166, 166, 2912,
+ 2912, 166, 166, 175, 175, 175, 175, 175, 2912, 2912,
+ 2912, 2912, 175, 175, 2912, 175, 175, 175, 175, 2912,
+ 175, 175, 175, 175, 236, 2912, 2912, 236, 2912, 2912,
+ 236, 2912, 2912, 236, 236, 236, 2912, 2912, 2912, 236,
+ 236, 2912, 236, 232, 232, 2912, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 238, 2912, 2912, 2912, 2912,
+
+ 2912, 2912, 2912, 2912, 2912, 238, 2912, 2912, 238, 238,
+ 238, 238, 234, 234, 2912, 234, 234, 234, 234, 234,
+ 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+ 234, 234, 234, 234, 358, 358, 2912, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 245, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 245, 2912, 2912,
+ 245, 245, 245, 245, 247, 2912, 2912, 247, 2912, 2912,
+ 247, 2912, 2912, 247, 247, 247, 247, 2912, 2912, 247,
+ 247, 2912, 2912, 247, 251, 251, 2912, 251, 251, 251,
+
+ 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
+ 251, 251, 251, 251, 251, 251, 254, 2912, 2912, 2912,
+ 2912, 254, 2912, 254, 254, 254, 2912, 2912, 254, 254,
+ 256, 2912, 2912, 256, 256, 256, 256, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 2912, 2912, 259, 259, 259, 259, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 265, 265, 265, 265, 265, 265, 265, 265, 2912,
+ 2912, 265, 265, 265, 265, 265, 265, 265, 265, 265,
+
+ 265, 265, 265, 373, 373, 373, 373, 373, 373, 373,
+ 373, 373, 373, 373, 373, 373, 373, 373, 373, 373,
+ 373, 373, 373, 373, 373, 271, 2912, 2912, 2912, 2912,
+ 271, 271, 2912, 271, 2912, 271, 2912, 2912, 271, 271,
+ 271, 271, 272, 272, 2912, 272, 272, 272, 272, 272,
+ 2912, 2912, 272, 272, 2912, 2912, 272, 272, 272, 272,
+ 272, 272, 272, 272, 374, 374, 2912, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 374, 374, 374, 374,
+ 374, 374, 374, 374, 374, 374, 275, 275, 2912, 275,
+ 275, 275, 275, 275, 275, 275, 275, 275, 275, 275,
+
+ 275, 275, 275, 275, 275, 275, 275, 275, 174, 174,
+ 174, 174, 174, 2912, 2912, 2912, 2912, 174, 174, 2912,
+ 174, 2912, 174, 174, 2912, 174, 174, 174, 174, 291,
+ 291, 291, 291, 2912, 2912, 2912, 291, 291, 2912, 2912,
+ 2912, 2912, 291, 291, 2912, 2912, 291, 291, 291, 291,
+ 290, 290, 290, 290, 2912, 2912, 2912, 290, 290, 2912,
+ 2912, 2912, 2912, 290, 290, 2912, 2912, 290, 290, 290,
+ 290, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 156, 156, 156, 156, 156, 156, 156,
+
+ 156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+ 156, 156, 156, 156, 156, 299, 2912, 2912, 299, 299,
+ 299, 299, 140, 140, 140, 140, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 140, 140, 140, 2912, 140,
+ 140, 140, 140, 166, 2912, 2912, 2912, 2912, 166, 2912,
+ 166, 166, 166, 2912, 2912, 166, 166, 175, 175, 175,
+ 175, 175, 2912, 2912, 2912, 2912, 175, 175, 2912, 175,
+ 175, 175, 175, 2912, 175, 175, 175, 175, 234, 234,
+ 2912, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+ 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+
+ 358, 358, 2912, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 238, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 238, 2912, 2912, 238, 238, 238, 238, 469,
+ 469, 469, 469, 469, 469, 469, 469, 469, 469, 469,
+ 469, 469, 469, 469, 469, 469, 469, 469, 469, 469,
+ 469, 470, 470, 470, 470, 470, 470, 470, 470, 470,
+ 470, 470, 470, 470, 470, 470, 470, 470, 470, 470,
+ 470, 470, 470, 588, 588, 588, 588, 588, 588, 588,
+ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588,
+
+ 588, 588, 588, 588, 588, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 653, 653, 653,
+ 653, 653, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 653, 653, 653, 653, 653, 659, 659,
+ 659, 659, 659, 659, 659, 659, 659, 659, 659, 659,
+ 659, 659, 659, 659, 659, 659, 659, 659, 659, 659,
+ 232, 232, 2912, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 743, 743, 743, 743, 743, 2912, 2912, 2912,
+
+ 2912, 743, 743, 2912, 743, 2912, 743, 2912, 743, 743,
+ 743, 743, 743, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 903, 903, 903, 903, 903,
+ 2912, 2912, 2912, 2912, 903, 903, 2912, 903, 903, 903,
+ 903, 2912, 903, 903, 903, 903, 958, 958, 958, 958,
+ 2912, 2912, 2912, 958, 958, 2912, 2912, 2912, 958, 958,
+ 958, 2912, 2912, 958, 958, 958, 958, 963, 963, 963,
+ 963, 2912, 2912, 2912, 963, 963, 2912, 2912, 2912, 963,
+ 963, 963, 2912, 2912, 963, 963, 963, 963, 986, 986,
+
+ 986, 986, 986, 2912, 2912, 2912, 2912, 986, 986, 2912,
+ 986, 986, 986, 986, 2912, 986, 986, 986, 986, 991,
+ 991, 991, 991, 991, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 991, 2912, 991, 991, 991, 991,
+ 992, 992, 992, 992, 992, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 992, 992, 992, 2912, 992, 992, 992,
+ 992, 994, 994, 994, 994, 994, 2912, 2912, 994, 2912,
+ 994, 994, 2912, 994, 2912, 994, 994, 2912, 994, 994,
+ 994, 994, 998, 998, 998, 998, 998, 2912, 2912, 998,
+ 2912, 998, 998, 2912, 998, 998, 998, 998, 2912, 998,
+
+ 998, 998, 998, 962, 962, 962, 962, 2912, 2912, 2912,
+ 962, 962, 2912, 2912, 2912, 962, 962, 962, 2912, 2912,
+ 962, 962, 962, 962, 1083, 1083, 1083, 1083, 1083, 2912,
+ 2912, 1083, 2912, 1083, 1083, 2912, 1083, 1083, 1083, 1083,
+ 2912, 1083, 1083, 1083, 1083, 1085, 1085, 1085, 1085, 1085,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 1085, 2912, 1085, 1085, 1085, 1085, 1086, 1086, 1086, 1086,
+ 1086, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 1086,
+ 1086, 1086, 2912, 1086, 1086, 1086, 1086, 1088, 1088, 1088,
+ 1088, 1088, 2912, 2912, 1088, 2912, 1088, 1088, 2912, 1088,
+
+ 2912, 1088, 2912, 2912, 1088, 1088, 1088, 1088, 1091, 1091,
+ 1091, 1091, 1091, 2912, 2912, 1091, 2912, 1091, 1091, 2912,
+ 1091, 1091, 1091, 1091, 2912, 1091, 1091, 1091, 1091, 1096,
+ 1096, 2912, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096,
+ 1096, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,
+ 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,
+ 1101, 1101, 1101, 588, 588, 588, 588, 588, 588, 588,
+ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588,
+ 588, 588, 588, 588, 588, 597, 597, 597, 597, 597,
+
+ 597, 597, 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 1157, 2912, 2912,
+ 2912, 2912, 1157, 1157, 2912, 1157, 2912, 1157, 2912, 2912,
+ 1157, 1157, 1157, 1157, 1158, 1158, 1158, 1158, 1158, 2912,
+ 2912, 2912, 2912, 1158, 1158, 2912, 1158, 1158, 1158, 1158,
+ 2912, 1158, 1158, 1158, 1158, 1204, 1204, 1204, 1204, 1204,
+ 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+ 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1215, 1215, 1215,
+ 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215,
+ 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1230,
+
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 280, 280, 280, 280, 280, 2912, 2912, 2912, 2912,
+ 280, 280, 2912, 280, 280, 280, 280, 2912, 280, 280,
+ 280, 280, 1252, 1252, 1252, 1252, 1252, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 1252, 1252, 1252, 2912, 1252,
+ 1252, 1252, 1252, 1168, 1168, 1168, 1168, 1168, 1168, 1168,
+ 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168,
+ 1168, 1168, 1168, 1168, 1168, 1327, 1327, 1327, 1327, 1327,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+
+ 1327, 2912, 1327, 1327, 1327, 1327, 1328, 1328, 1328, 1328,
+ 1328, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 1328,
+ 1328, 1328, 2912, 1328, 1328, 1328, 1328, 1251, 1251, 1251,
+ 1251, 1251, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 1251, 1251, 1251, 1251, 1330, 2912,
+ 2912, 2912, 2912, 1330, 1330, 2912, 1330, 2912, 1330, 2912,
+ 2912, 1330, 1330, 1330, 1330, 1331, 1331, 1331, 1331, 1331,
+ 2912, 2912, 2912, 2912, 1331, 1331, 2912, 1331, 1331, 1331,
+ 1331, 2912, 1331, 1331, 1331, 1331, 1096, 1096, 2912, 1096,
+ 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096,
+
+ 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1101, 1101,
+ 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,
+ 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,
+ 1359, 1359, 1359, 1359, 1359, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 1359, 1359, 1359,
+ 1359, 1426, 1426, 1426, 1426, 1426, 2912, 2912, 2912, 2912,
+ 1426, 1426, 2912, 1426, 2912, 1426, 2912, 2912, 1426, 1426,
+ 1426, 1426, 1429, 1429, 1429, 1429, 1429, 2912, 2912, 2912,
+ 2912, 1429, 1429, 2912, 1429, 1429, 1429, 1429, 2912, 1429,
+ 1429, 1429, 1429, 1439, 1439, 1439, 1439, 1439, 1439, 1439,
+
+ 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439,
+ 1439, 1439, 1439, 1439, 1439, 1447, 1447, 1447, 1447, 1447,
+ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447,
+ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1458, 1458, 1458,
+ 1458, 1458, 2912, 2912, 2912, 2912, 1458, 1458, 2912, 1458,
+ 2912, 1458, 2912, 1458, 1458, 1458, 1458, 1458, 1651, 1651,
+ 2912, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651,
+ 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654,
+ 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654,
+
+ 1654, 1654, 1716, 1716, 1716, 1716, 1716, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 1716,
+ 1716, 1716, 1716, 1717, 1717, 1717, 1717, 1717, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 1717, 1717, 1717, 2912,
+ 1717, 1717, 1717, 1717, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1781, 2912, 2912, 2912,
+ 2912, 1781, 1781, 2912, 1781, 2912, 1781, 2912, 2912, 1781,
+ 1781, 1781, 1781, 1782, 1782, 1782, 1782, 1782, 2912, 2912,
+ 2912, 2912, 1782, 1782, 2912, 1782, 1782, 1782, 1782, 2912,
+
+ 1782, 1782, 1782, 1782, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1753, 1753, 1753, 1753,
+ 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753,
+ 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1651, 1651,
+ 2912, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651,
+ 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
+
+ 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
+ 1953, 1953, 1953, 1953, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1999, 1999, 1999, 1999,
+ 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999,
+ 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 2013, 2013,
+ 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013,
+ 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013,
+ 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282,
+ 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282,
+
+ 2282, 2282, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286,
+ 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286,
+ 2286, 2286, 2286, 2286, 2543, 2543, 2543, 2543, 2543, 2543,
+ 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
+ 2543, 2543, 2543, 2543, 2543, 2543, 2553, 2553, 2553, 2553,
+ 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553,
+ 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2567, 2567,
+ 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567,
+ 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567, 2567,
+ 27, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912
+ } ;
+
+static yyconst flex_int16_t yy_chk[31167] =
+ { 0,
+ 0, 1, 1, 270, 1, 2, 2, 109, 2, 360,
+ 360, 360, 360, 270, 270, 0, 0, 1, 2381, 2370,
+ 109, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 4, 168, 6,
+
+ 4, 926, 6, 15, 15, 29, 15, 32, 29, 926,
+ 2364, 168, 39, 30, 11, 11, 30, 11, 1847, 15,
+ 72, 29, 4, 4, 4, 6, 4, 4, 82, 30,
+ 11, 32, 42, 4, 11, 11, 39, 4, 68, 4,
+ 4, 4, 4, 13, 13, 72, 13, 4, 4, 4,
+ 6, 4, 4, 82, 13, 13, 42, 4, 1836, 13,
+ 1830, 4, 68, 4, 4, 4, 4, 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,
+
+ 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, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 12, 12,
+ 37, 12, 1793, 1789, 14, 14, 93, 14, 16, 16,
+ 57, 16, 57, 112, 12, 14, 14, 37, 12, 12,
+ 14, 7, 17, 17, 16, 17, 18, 18, 85, 18,
+
+ 93, 85, 1356, 1267, 57, 1263, 57, 112, 17, 1066,
+ 1055, 37, 18, 1049, 85, 7, 7, 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, 19, 19, 90, 19, 20, 20, 87,
+ 20, 64, 88, 23, 23, 89, 23, 968, 90, 19,
+ 64, 968, 91, 20, 23, 23, 8, 968, 23, 23,
+ 24, 24, 98, 24, 87, 98, 64, 88, 1014, 666,
+ 89, 24, 24, 90, 64, 24, 24, 91, 98, 568,
+ 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,
+
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 21, 21, 21,
+ 21, 21, 21, 563, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 25, 25, 40, 25, 26, 26, 55,
+
+ 26, 56, 60, 56, 60, 79, 56, 94, 96, 25,
+ 56, 79, 40, 26, 393, 55, 21, 41, 70, 70,
+ 70, 70, 389, 367, 55, 56, 60, 56, 60, 79,
+ 56, 41, 94, 96, 56, 79, 40, 366, 70, 55,
+ 21, 21, 22, 22, 22, 22, 22, 22, 41, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 34, 34,
+ 34, 34, 41, 35, 35, 35, 35, 303, 302, 45,
+ 43, 269, 255, 267, 34, 44, 45, 111, 263, 35,
+ 47, 22, 261, 102, 49, 255, 102, 43, 114, 34,
+
+ 181, 114, 44, 45, 35, 50, 50, 47, 34, 102,
+ 254, 49, 111, 35, 114, 22, 22, 33, 33, 33,
+ 33, 43, 33, 50, 34, 181, 44, 45, 51, 35,
+ 253, 47, 34, 33, 33, 49, 33, 35, 251, 46,
+ 46, 46, 46, 248, 62, 51, 62, 50, 33, 52,
+ 52, 135, 58, 61, 65, 63, 232, 33, 115, 46,
+ 118, 115, 58, 118, 58, 61, 52, 63, 62, 51,
+ 62, 65, 185, 33, 115, 135, 118, 58, 61, 46,
+ 63, 33, 36, 36, 36, 36, 58, 36, 58, 61,
+ 52, 63, 66, 66, 67, 65, 59, 185, 36, 36,
+
+ 186, 36, 36, 46, 59, 80, 80, 59, 59, 138,
+ 71, 67, 71, 36, 171, 95, 66, 66, 95, 170,
+ 147, 59, 36, 119, 125, 186, 119, 125, 59, 80,
+ 80, 59, 59, 138, 71, 67, 71, 166, 36, 119,
+ 125, 95, 165, 67, 147, 152, 36, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 73, 81, 38, 187, 38, 95, 126, 38, 38,
+ 126, 74, 133, 74, 149, 73, 74, 73, 81, 75,
+ 74, 75, 160, 126, 75, 76, 73, 81, 38, 187,
+ 131, 76, 223, 76, 178, 74, 38, 74, 149, 73,
+
+ 74, 73, 81, 75, 74, 75, 160, 178, 75, 122,
+ 76, 130, 38, 116, 130, 76, 223, 76, 77, 178,
+ 38, 38, 48, 48, 48, 48, 108, 130, 48, 78,
+ 132, 178, 77, 132, 77, 104, 48, 78, 48, 48,
+ 78, 48, 48, 77, 229, 105, 132, 48, 48, 48,
+ 48, 48, 48, 99, 78, 31, 77, 179, 77, 197,
+ 105, 78, 48, 27, 78, 0, 221, 0, 229, 105,
+ 179, 48, 48, 48, 48, 48, 48, 48, 136, 136,
+ 136, 136, 179, 224, 197, 105, 48, 53, 53, 53,
+ 53, 221, 53, 105, 179, 0, 0, 0, 136, 215,
+
+ 53, 53, 215, 53, 53, 53, 189, 53, 224, 53,
+ 53, 53, 54, 54, 54, 54, 227, 54, 136, 137,
+ 137, 137, 137, 189, 215, 54, 54, 215, 54, 54,
+ 54, 189, 54, 372, 54, 54, 54, 139, 139, 139,
+ 139, 227, 136, 372, 372, 101, 0, 189, 101, 239,
+ 137, 0, 0, 54, 0, 103, 0, 139, 103, 137,
+ 241, 101, 140, 140, 140, 140, 0, 153, 153, 153,
+ 153, 103, 153, 239, 184, 137, 101, 54, 69, 69,
+ 69, 69, 140, 137, 241, 101, 103, 153, 184, 250,
+ 143, 180, 180, 0, 0, 103, 0, 0, 69, 184,
+
+ 143, 101, 143, 69, 69, 69, 192, 69, 69, 101,
+ 192, 103, 184, 250, 69, 143, 180, 180, 69, 103,
+ 69, 69, 69, 69, 143, 0, 143, 0, 69, 69,
+ 69, 192, 69, 69, 0, 192, 0, 0, 69, 0,
+ 0, 0, 69, 0, 69, 69, 69, 69, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 154, 154, 154, 154, 83, 155,
+ 155, 155, 155, 257, 144, 144, 144, 144, 145, 145,
+ 145, 145, 258, 182, 154, 183, 228, 83, 83, 155,
+
+ 144, 0, 201, 83, 183, 182, 201, 257, 145, 228,
+ 146, 146, 146, 146, 0, 144, 258, 145, 182, 0,
+ 183, 83, 83, 84, 144, 188, 84, 201, 183, 182,
+ 146, 201, 84, 84, 228, 188, 84, 84, 84, 84,
+ 144, 84, 145, 84, 84, 84, 84, 84, 144, 146,
+ 188, 146, 84, 0, 162, 162, 162, 162, 373, 188,
+ 163, 163, 163, 163, 462, 462, 462, 462, 373, 373,
+ 0, 0, 0, 146, 162, 146, 0, 84, 86, 86,
+ 163, 86, 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 200, 86,
+
+ 86, 86, 86, 86, 148, 148, 148, 148, 86, 150,
+ 150, 150, 150, 200, 172, 172, 172, 172, 236, 0,
+ 150, 150, 0, 200, 148, 0, 0, 86, 0, 173,
+ 173, 173, 173, 86, 172, 148, 150, 200, 150, 174,
+ 174, 174, 174, 236, 148, 157, 157, 157, 157, 173,
+ 157, 86, 86, 141, 141, 141, 141, 0, 141, 174,
+ 148, 150, 240, 150, 204, 157, 141, 141, 148, 141,
+ 141, 141, 190, 141, 193, 141, 141, 141, 142, 142,
+ 142, 142, 204, 142, 190, 157, 193, 240, 0, 204,
+ 191, 142, 142, 198, 142, 142, 142, 190, 142, 193,
+
+ 142, 142, 142, 198, 191, 243, 204, 142, 190, 157,
+ 193, 164, 164, 164, 164, 191, 0, 0, 198, 558,
+ 558, 558, 558, 559, 559, 559, 559, 198, 191, 0,
+ 243, 164, 142, 156, 156, 156, 156, 156, 156, 156,
+ 156, 156, 156, 156, 156, 156, 156, 199, 205, 156,
+ 196, 156, 164, 217, 156, 156, 199, 195, 195, 195,
+ 195, 205, 196, 217, 196, 202, 206, 244, 219, 202,
+ 206, 219, 199, 205, 249, 196, 164, 195, 217, 202,
+ 199, 202, 156, 0, 0, 205, 196, 217, 196, 0,
+ 202, 206, 244, 219, 202, 206, 219, 0, 0, 249,
+
+ 0, 276, 0, 202, 0, 202, 156, 156, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 210, 203, 158, 276, 158, 203, 214, 158,
+ 158, 207, 207, 207, 207, 0, 210, 214, 203, 208,
+ 208, 208, 208, 209, 211, 209, 211, 210, 203, 300,
+ 158, 207, 203, 214, 353, 212, 264, 158, 0, 208,
+ 210, 214, 203, 212, 212, 0, 231, 0, 209, 211,
+ 209, 211, 0, 300, 158, 264, 264, 0, 353, 231,
+ 212, 158, 158, 167, 167, 167, 167, 212, 212, 167,
+ 213, 213, 216, 218, 216, 218, 220, 167, 230, 167,
+
+ 167, 230, 167, 167, 231, 213, 0, 220, 167, 167,
+ 167, 167, 167, 167, 230, 213, 213, 216, 218, 216,
+ 218, 220, 242, 354, 280, 242, 310, 0, 0, 213,
+ 247, 220, 167, 167, 167, 167, 167, 167, 167, 175,
+ 175, 175, 175, 313, 175, 247, 222, 354, 242, 280,
+ 0, 310, 175, 175, 247, 175, 175, 175, 222, 175,
+ 0, 175, 175, 175, 176, 176, 176, 176, 313, 246,
+ 247, 222, 246, 242, 260, 176, 176, 260, 247, 364,
+ 262, 314, 222, 262, 176, 246, 266, 282, 277, 266,
+ 260, 176, 268, 176, 273, 268, 262, 273, 277, 282,
+
+ 246, 317, 266, 364, 176, 0, 314, 0, 268, 246,
+ 273, 0, 282, 277, 335, 281, 176, 297, 176, 0,
+ 0, 297, 277, 282, 281, 246, 317, 0, 176, 177,
+ 177, 177, 177, 246, 177, 278, 278, 278, 278, 335,
+ 281, 0, 177, 177, 283, 177, 177, 177, 281, 177,
+ 0, 177, 177, 177, 283, 278, 0, 297, 177, 279,
+ 279, 279, 279, 0, 287, 287, 287, 287, 0, 283,
+ 284, 284, 284, 284, 278, 287, 287, 316, 283, 279,
+ 319, 297, 349, 177, 194, 194, 194, 194, 316, 0,
+ 284, 287, 312, 287, 0, 319, 315, 0, 278, 279,
+
+ 0, 312, 316, 0, 194, 319, 315, 349, 284, 194,
+ 194, 194, 316, 194, 194, 320, 287, 312, 287, 319,
+ 194, 315, 320, 279, 194, 312, 194, 194, 194, 194,
+ 315, 470, 284, 0, 194, 194, 194, 0, 194, 194,
+ 320, 470, 470, 0, 194, 0, 320, 0, 194, 0,
+ 194, 194, 194, 194, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 225, 225, 225, 225, 225, 225, 225,
+ 290, 290, 290, 290, 225, 286, 286, 286, 286, 365,
+ 285, 285, 285, 285, 352, 355, 290, 295, 295, 295,
+
+ 295, 0, 295, 225, 225, 286, 0, 0, 318, 225,
+ 285, 359, 0, 365, 291, 291, 291, 291, 0, 352,
+ 355, 0, 318, 0, 286, 291, 291, 225, 225, 226,
+ 291, 285, 226, 318, 345, 361, 359, 295, 226, 226,
+ 345, 0, 226, 226, 226, 226, 318, 226, 286, 226,
+ 226, 226, 226, 226, 329, 285, 369, 329, 226, 345,
+ 361, 295, 0, 0, 345, 292, 292, 292, 292, 0,
+ 296, 296, 296, 296, 0, 0, 292, 292, 0, 329,
+ 369, 292, 329, 226, 234, 234, 362, 234, 234, 234,
+ 234, 234, 234, 234, 234, 234, 234, 234, 234, 234,
+
+ 234, 234, 234, 234, 292, 234, 234, 234, 234, 234,
+ 296, 362, 321, 323, 363, 323, 301, 301, 301, 301,
+ 328, 0, 321, 325, 330, 325, 330, 339, 292, 328,
+ 376, 339, 0, 234, 296, 0, 301, 321, 323, 363,
+ 323, 477, 477, 477, 477, 328, 321, 0, 325, 330,
+ 325, 330, 339, 328, 376, 301, 339, 234, 234, 235,
+ 235, 477, 235, 235, 235, 235, 235, 235, 235, 235,
+ 235, 235, 235, 235, 235, 235, 235, 235, 235, 301,
+ 235, 235, 235, 235, 235, 288, 288, 288, 288, 289,
+ 289, 289, 289, 464, 304, 304, 304, 304, 235, 0,
+
+ 289, 289, 0, 0, 0, 289, 0, 0, 235, 0,
+ 304, 0, 288, 0, 288, 0, 289, 464, 289, 332,
+ 333, 332, 235, 333, 293, 293, 293, 293, 311, 311,
+ 311, 311, 235, 235, 304, 293, 293, 288, 324, 288,
+ 293, 289, 326, 289, 332, 333, 332, 0, 333, 370,
+ 326, 326, 324, 0, 0, 0, 337, 311, 304, 337,
+ 368, 0, 293, 324, 0, 0, 0, 326, 370, 370,
+ 306, 306, 306, 306, 326, 326, 324, 305, 305, 305,
+ 305, 337, 311, 0, 337, 368, 293, 298, 298, 298,
+ 298, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+
+ 298, 331, 0, 298, 305, 298, 305, 327, 298, 298,
+ 306, 331, 307, 307, 307, 307, 0, 305, 375, 334,
+ 0, 327, 466, 307, 307, 0, 331, 298, 307, 305,
+ 334, 305, 327, 322, 306, 331, 298, 322, 336, 0,
+ 338, 305, 467, 375, 334, 327, 466, 322, 371, 322,
+ 336, 298, 338, 307, 334, 0, 0, 0, 322, 377,
+ 298, 298, 322, 336, 340, 338, 467, 371, 371, 0,
+ 0, 322, 341, 322, 336, 340, 338, 307, 308, 308,
+ 308, 308, 342, 308, 377, 341, 342, 0, 343, 340,
+ 343, 308, 308, 401, 308, 308, 308, 341, 308, 340,
+
+ 308, 308, 308, 308, 469, 0, 0, 342, 344, 341,
+ 346, 342, 346, 343, 0, 343, 410, 971, 401, 971,
+ 344, 971, 0, 469, 469, 0, 0, 971, 308, 309,
+ 309, 309, 309, 344, 309, 346, 348, 346, 411, 347,
+ 0, 410, 309, 309, 344, 309, 309, 309, 347, 309,
+ 348, 309, 309, 309, 379, 351, 379, 378, 309, 351,
+ 386, 348, 0, 411, 347, 350, 350, 350, 350, 386,
+ 0, 378, 347, 472, 348, 416, 414, 417, 420, 379,
+ 351, 379, 378, 309, 351, 386, 380, 380, 380, 380,
+ 414, 435, 409, 386, 350, 378, 0, 472, 409, 0,
+
+ 416, 414, 417, 420, 0, 0, 380, 0, 399, 0,
+ 0, 0, 399, 0, 414, 380, 435, 409, 0, 350,
+ 357, 357, 409, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357, 357, 357,
+ 380, 357, 357, 357, 357, 357, 399, 492, 0, 357,
+ 447, 0, 381, 381, 381, 381, 382, 382, 382, 382,
+ 0, 383, 383, 383, 383, 384, 384, 384, 384, 357,
+ 399, 492, 381, 388, 357, 447, 382, 383, 449, 0,
+ 415, 384, 388, 382, 385, 385, 385, 385, 383, 422,
+ 383, 0, 415, 357, 357, 381, 449, 497, 388, 422,
+
+ 385, 0, 0, 449, 384, 415, 388, 0, 382, 421,
+ 429, 421, 429, 383, 422, 383, 415, 0, 0, 381,
+ 449, 497, 385, 422, 390, 390, 390, 390, 384, 391,
+ 391, 391, 391, 0, 421, 429, 421, 429, 515, 0,
+ 390, 392, 392, 392, 392, 391, 385, 387, 387, 387,
+ 387, 394, 394, 394, 394, 390, 0, 392, 419, 397,
+ 391, 0, 515, 387, 390, 397, 397, 394, 397, 391,
+ 419, 425, 392, 427, 387, 425, 387, 432, 387, 432,
+ 390, 392, 394, 419, 397, 391, 427, 387, 390, 397,
+ 397, 394, 397, 391, 419, 426, 425, 392, 427, 387,
+
+ 425, 387, 432, 387, 432, 392, 426, 394, 0, 0,
+ 427, 387, 433, 0, 0, 394, 395, 395, 395, 395,
+ 426, 433, 396, 396, 396, 396, 0, 398, 0, 0,
+ 426, 551, 395, 396, 396, 0, 398, 433, 396, 398,
+ 0, 404, 404, 404, 404, 433, 450, 395, 418, 418,
+ 418, 418, 398, 396, 428, 551, 395, 404, 428, 455,
+ 398, 552, 396, 398, 406, 406, 406, 406, 0, 0,
+ 0, 450, 395, 0, 0, 0, 456, 418, 396, 428,
+ 395, 0, 404, 428, 455, 552, 396, 400, 400, 400,
+ 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
+
+ 400, 456, 418, 400, 406, 400, 404, 564, 400, 400,
+ 402, 402, 402, 402, 463, 400, 403, 403, 403, 403,
+ 0, 424, 0, 405, 405, 405, 405, 465, 406, 0,
+ 402, 564, 403, 424, 471, 0, 400, 402, 0, 463,
+ 400, 0, 407, 407, 407, 407, 424, 403, 412, 412,
+ 412, 412, 465, 430, 405, 0, 403, 424, 408, 471,
+ 400, 400, 402, 405, 0, 430, 408, 408, 412, 0,
+ 0, 434, 403, 407, 413, 413, 413, 413, 430, 405,
+ 403, 0, 407, 408, 0, 434, 567, 405, 412, 430,
+ 408, 408, 423, 431, 413, 423, 434, 0, 407, 431,
+
+ 436, 436, 436, 436, 0, 475, 407, 437, 491, 434,
+ 567, 437, 412, 0, 413, 438, 0, 423, 431, 438,
+ 423, 439, 440, 431, 441, 439, 0, 442, 443, 436,
+ 475, 440, 437, 491, 441, 445, 437, 444, 413, 445,
+ 438, 442, 443, 0, 438, 0, 439, 440, 0, 441,
+ 439, 444, 442, 443, 436, 440, 496, 446, 441, 448,
+ 445, 446, 444, 448, 445, 442, 443, 451, 451, 451,
+ 451, 452, 452, 452, 452, 444, 453, 503, 473, 0,
+ 453, 496, 446, 0, 448, 0, 446, 451, 448, 0,
+ 473, 452, 0, 0, 451, 498, 451, 502, 452, 502,
+
+ 452, 453, 503, 473, 498, 453, 454, 454, 454, 454,
+ 457, 457, 457, 457, 473, 468, 468, 468, 468, 451,
+ 498, 451, 502, 452, 502, 452, 468, 454, 498, 0,
+ 0, 457, 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 0, 458, 458, 458, 458, 458, 459, 459,
+ 459, 459, 460, 460, 460, 460, 461, 461, 461, 461,
+ 474, 474, 474, 474, 476, 476, 476, 476, 0, 459,
+ 569, 458, 478, 478, 478, 478, 0, 479, 479, 479,
+ 479, 514, 460, 0, 476, 517, 461, 522, 0, 474,
+
+ 523, 534, 478, 479, 569, 458, 458, 480, 480, 480,
+ 480, 478, 537, 0, 0, 476, 514, 460, 479, 0,
+ 517, 461, 522, 480, 474, 523, 534, 479, 481, 481,
+ 481, 481, 482, 482, 482, 482, 478, 537, 480, 476,
+ 0, 0, 0, 479, 481, 0, 0, 480, 482, 485,
+ 484, 479, 484, 519, 519, 519, 519, 485, 485, 481,
+ 0, 484, 0, 480, 483, 483, 483, 483, 481, 482,
+ 482, 480, 0, 519, 485, 484, 571, 484, 0, 0,
+ 483, 485, 485, 0, 481, 484, 488, 488, 488, 488,
+ 519, 521, 481, 482, 482, 489, 489, 489, 489, 0,
+
+ 521, 571, 488, 490, 490, 490, 490, 483, 525, 501,
+ 0, 489, 525, 501, 519, 488, 521, 0, 574, 490,
+ 493, 493, 493, 493, 521, 494, 494, 494, 494, 499,
+ 499, 483, 593, 525, 489, 501, 493, 525, 594, 499,
+ 488, 494, 574, 495, 495, 495, 495, 0, 500, 493,
+ 500, 0, 0, 0, 499, 499, 593, 500, 489, 495,
+ 501, 575, 594, 499, 494, 504, 504, 504, 504, 516,
+ 516, 516, 516, 500, 493, 500, 505, 505, 505, 505,
+ 513, 500, 0, 526, 513, 504, 575, 526, 494, 516,
+ 602, 0, 505, 513, 504, 506, 506, 506, 506, 507,
+
+ 507, 507, 507, 603, 524, 513, 524, 505, 526, 513,
+ 516, 506, 526, 546, 602, 507, 505, 513, 0, 504,
+ 609, 508, 508, 508, 508, 546, 506, 603, 541, 524,
+ 507, 524, 505, 509, 516, 506, 0, 508, 546, 507,
+ 505, 509, 509, 509, 609, 510, 510, 510, 510, 546,
+ 0, 506, 614, 518, 541, 507, 0, 518, 509, 506,
+ 508, 518, 0, 507, 0, 509, 509, 509, 511, 511,
+ 511, 511, 512, 512, 512, 512, 614, 618, 518, 541,
+ 529, 530, 518, 649, 508, 510, 518, 527, 512, 528,
+ 520, 520, 520, 520, 529, 530, 527, 620, 0, 528,
+
+ 532, 531, 618, 0, 532, 529, 530, 649, 511, 510,
+ 520, 512, 527, 512, 528, 531, 536, 533, 529, 530,
+ 527, 533, 620, 528, 535, 532, 531, 520, 535, 532,
+ 539, 0, 511, 0, 536, 512, 538, 512, 542, 531,
+ 538, 536, 533, 0, 539, 540, 533, 542, 540, 535,
+ 543, 520, 622, 535, 543, 539, 544, 547, 536, 547,
+ 545, 538, 549, 542, 545, 538, 548, 548, 539, 549,
+ 540, 542, 550, 540, 544, 543, 0, 622, 0, 543,
+ 0, 544, 547, 550, 547, 545, 625, 549, 0, 545,
+ 607, 548, 548, 549, 607, 636, 0, 550, 544, 553,
+
+ 553, 553, 553, 554, 554, 554, 554, 550, 555, 0,
+ 0, 555, 625, 556, 556, 556, 556, 576, 607, 553,
+ 636, 576, 577, 554, 560, 560, 560, 560, 561, 561,
+ 561, 561, 0, 555, 556, 577, 555, 625, 553, 639,
+ 0, 554, 576, 607, 0, 560, 576, 577, 604, 561,
+ 566, 566, 566, 566, 560, 0, 604, 604, 561, 577,
+ 0, 0, 553, 0, 639, 554, 570, 570, 570, 570,
+ 0, 566, 0, 604, 0, 0, 0, 570, 0, 560,
+ 604, 604, 0, 561, 562, 562, 562, 562, 562, 562,
+ 562, 562, 562, 562, 562, 562, 562, 562, 562, 562,
+
+ 562, 562, 562, 562, 562, 562, 562, 562, 562, 562,
+ 572, 572, 572, 572, 578, 578, 578, 578, 616, 644,
+ 0, 572, 580, 580, 580, 580, 579, 579, 579, 579,
+ 0, 0, 616, 562, 578, 581, 581, 581, 581, 0,
+ 585, 627, 580, 616, 644, 627, 579, 578, 0, 585,
+ 585, 581, 582, 582, 582, 582, 616, 562, 562, 565,
+ 565, 565, 565, 579, 580, 585, 627, 0, 582, 608,
+ 627, 0, 578, 585, 585, 581, 646, 583, 583, 583,
+ 583, 647, 582, 0, 608, 0, 565, 579, 580, 565,
+ 565, 584, 565, 583, 608, 565, 621, 0, 584, 581,
+
+ 584, 646, 586, 586, 586, 586, 647, 582, 608, 621,
+ 583, 565, 0, 0, 565, 565, 584, 565, 586, 565,
+ 660, 621, 584, 0, 584, 587, 587, 587, 587, 588,
+ 588, 588, 588, 621, 0, 583, 589, 589, 589, 589,
+ 586, 587, 0, 628, 660, 588, 590, 590, 590, 590,
+ 637, 0, 589, 591, 591, 591, 591, 592, 592, 592,
+ 592, 628, 661, 663, 586, 637, 587, 589, 628, 591,
+ 0, 0, 0, 592, 626, 637, 589, 590, 595, 595,
+ 595, 595, 0, 626, 591, 628, 590, 661, 663, 637,
+ 587, 0, 589, 591, 595, 596, 596, 596, 596, 626,
+
+ 589, 0, 590, 597, 597, 597, 597, 626, 0, 591,
+ 590, 596, 598, 598, 598, 598, 595, 591, 0, 597,
+ 0, 662, 599, 599, 599, 599, 662, 0, 598, 0,
+ 0, 0, 600, 600, 600, 600, 596, 0, 0, 617,
+ 595, 617, 605, 598, 605, 662, 0, 0, 600, 606,
+ 662, 605, 598, 599, 601, 601, 601, 601, 606, 630,
+ 596, 606, 599, 600, 617, 0, 617, 605, 598, 605,
+ 601, 630, 600, 0, 606, 605, 598, 0, 599, 0,
+ 0, 664, 606, 629, 630, 606, 599, 629, 600, 610,
+ 610, 610, 610, 643, 0, 630, 600, 611, 611, 611,
+
+ 611, 612, 612, 612, 612, 613, 664, 613, 629, 610,
+ 665, 643, 629, 611, 0, 0, 613, 612, 643, 615,
+ 615, 615, 615, 619, 619, 619, 619, 623, 612, 0,
+ 613, 610, 613, 670, 665, 643, 611, 0, 611, 615,
+ 613, 623, 624, 619, 631, 624, 631, 633, 619, 632,
+ 632, 642, 623, 612, 633, 610, 635, 670, 615, 635,
+ 611, 642, 611, 632, 687, 623, 634, 624, 0, 631,
+ 624, 631, 633, 619, 632, 632, 642, 634, 633, 668,
+ 640, 635, 615, 0, 635, 642, 0, 632, 687, 640,
+ 669, 634, 638, 638, 638, 638, 641, 641, 641, 641,
+
+ 0, 634, 645, 0, 668, 640, 648, 648, 650, 650,
+ 650, 650, 638, 640, 671, 669, 694, 645, 651, 651,
+ 651, 651, 652, 686, 672, 641, 672, 645, 650, 652,
+ 648, 648, 0, 653, 653, 653, 653, 0, 651, 671,
+ 694, 645, 693, 696, 0, 650, 650, 652, 686, 672,
+ 641, 672, 696, 652, 653, 0, 654, 654, 654, 654,
+ 0, 651, 655, 655, 655, 655, 0, 693, 696, 650,
+ 650, 673, 656, 656, 656, 656, 696, 654, 658, 658,
+ 658, 658, 0, 655, 673, 651, 654, 674, 674, 674,
+ 674, 700, 655, 656, 0, 0, 673, 699, 0, 658,
+
+ 708, 704, 706, 675, 675, 675, 675, 674, 673, 0,
+ 712, 654, 699, 714, 674, 700, 656, 655, 676, 676,
+ 676, 676, 699, 675, 708, 698, 704, 706, 0, 698,
+ 677, 677, 677, 677, 676, 712, 699, 0, 714, 674,
+ 656, 657, 657, 657, 657, 675, 677, 0, 0, 678,
+ 678, 678, 678, 701, 701, 701, 701, 676, 715, 679,
+ 719, 679, 657, 677, 721, 678, 698, 715, 657, 675,
+ 679, 657, 657, 701, 657, 722, 0, 657, 0, 0,
+ 0, 676, 0, 715, 679, 719, 679, 0, 677, 721,
+ 698, 715, 678, 657, 679, 701, 657, 657, 0, 657,
+
+ 722, 657, 659, 659, 659, 659, 659, 659, 659, 659,
+ 659, 659, 659, 659, 659, 659, 678, 680, 659, 701,
+ 659, 735, 733, 659, 659, 0, 680, 0, 0, 680,
+ 681, 681, 681, 681, 733, 710, 682, 682, 682, 682,
+ 0, 0, 680, 0, 734, 735, 681, 733, 710, 736,
+ 680, 659, 682, 680, 683, 683, 683, 683, 733, 681,
+ 710, 684, 684, 684, 684, 685, 685, 685, 685, 734,
+ 683, 0, 710, 695, 736, 659, 659, 684, 0, 682,
+ 695, 685, 695, 683, 681, 688, 688, 688, 688, 689,
+ 689, 689, 689, 690, 690, 690, 690, 0, 695, 0,
+
+ 684, 688, 737, 682, 695, 689, 695, 0, 683, 690,
+ 691, 691, 691, 691, 688, 692, 692, 692, 692, 697,
+ 711, 711, 690, 717, 684, 713, 691, 737, 697, 741,
+ 754, 692, 689, 717, 755, 697, 0, 0, 0, 688,
+ 713, 756, 703, 0, 697, 711, 711, 690, 717, 691,
+ 713, 703, 697, 703, 741, 754, 689, 717, 755, 697,
+ 702, 702, 702, 702, 713, 756, 0, 703, 705, 705,
+ 705, 705, 724, 691, 724, 703, 702, 703, 707, 707,
+ 707, 707, 709, 709, 709, 709, 718, 723, 705, 702,
+ 716, 716, 716, 716, 723, 705, 725, 724, 720, 724,
+
+ 726, 727, 709, 757, 718, 0, 759, 707, 0, 726,
+ 725, 718, 723, 720, 702, 727, 0, 0, 723, 716,
+ 705, 725, 709, 720, 0, 726, 727, 757, 718, 730,
+ 759, 0, 707, 726, 725, 763, 760, 720, 730, 727,
+ 728, 728, 728, 728, 716, 0, 709, 729, 729, 729,
+ 729, 0, 0, 0, 730, 731, 731, 731, 731, 763,
+ 728, 760, 730, 732, 732, 732, 732, 729, 738, 738,
+ 738, 738, 777, 739, 739, 739, 739, 740, 740, 740,
+ 740, 0, 0, 0, 731, 0, 0, 783, 738, 0,
+ 0, 794, 732, 739, 819, 0, 777, 740, 742, 742,
+
+ 742, 742, 796, 739, 743, 743, 743, 743, 738, 731,
+ 740, 783, 744, 744, 744, 744, 794, 732, 819, 742,
+ 745, 745, 745, 745, 0, 743, 0, 796, 739, 0,
+ 0, 0, 738, 744, 802, 740, 746, 746, 746, 746,
+ 0, 745, 821, 802, 747, 747, 747, 747, 748, 748,
+ 748, 748, 0, 750, 750, 750, 750, 746, 745, 802,
+ 800, 746, 800, 0, 808, 747, 821, 802, 0, 748,
+ 749, 749, 749, 749, 750, 0, 809, 748, 752, 752,
+ 752, 752, 745, 747, 0, 800, 746, 800, 747, 808,
+ 811, 749, 750, 751, 751, 751, 751, 0, 751, 752,
+
+ 749, 809, 748, 766, 766, 766, 766, 747, 761, 761,
+ 761, 761, 747, 0, 751, 811, 750, 832, 788, 761,
+ 813, 818, 788, 766, 0, 749, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753,
+ 0, 832, 753, 0, 753, 813, 818, 753, 753, 762,
+ 762, 762, 762, 764, 764, 764, 764, 0, 0, 788,
+ 762, 765, 765, 765, 765, 767, 767, 767, 767, 0,
+ 0, 0, 765, 0, 0, 753, 767, 0, 768, 768,
+ 768, 768, 764, 788, 820, 767, 769, 769, 769, 769,
+ 765, 0, 0, 833, 768, 778, 778, 778, 778, 753,
+
+ 753, 771, 769, 770, 770, 770, 770, 764, 836, 820,
+ 771, 771, 0, 0, 0, 765, 768, 769, 833, 770,
+ 772, 772, 772, 772, 804, 0, 771, 773, 773, 773,
+ 773, 0, 836, 804, 771, 771, 774, 774, 774, 774,
+ 768, 835, 769, 773, 0, 775, 775, 775, 775, 804,
+ 770, 772, 774, 776, 776, 776, 776, 804, 0, 0,
+ 772, 775, 779, 779, 779, 779, 835, 0, 773, 776,
+ 780, 780, 780, 780, 770, 861, 772, 869, 779, 781,
+ 781, 781, 781, 775, 772, 0, 780, 825, 782, 782,
+ 782, 782, 773, 0, 776, 781, 784, 784, 784, 784,
+
+ 861, 825, 869, 779, 782, 0, 843, 775, 785, 807,
+ 785, 786, 790, 790, 790, 790, 0, 781, 776, 785,
+ 786, 807, 884, 790, 786, 0, 825, 779, 0, 782,
+ 843, 0, 0, 785, 807, 785, 786, 787, 787, 787,
+ 787, 781, 0, 785, 786, 807, 884, 0, 786, 791,
+ 791, 791, 791, 782, 789, 789, 789, 789, 891, 893,
+ 791, 827, 827, 827, 827, 789, 801, 793, 787, 791,
+ 792, 792, 792, 792, 908, 0, 793, 787, 793, 0,
+ 801, 789, 827, 891, 893, 0, 792, 795, 795, 795,
+ 795, 801, 793, 787, 797, 797, 797, 797, 908, 803,
+
+ 793, 787, 793, 827, 801, 797, 789, 795, 798, 798,
+ 798, 798, 792, 803, 910, 810, 795, 0, 0, 798,
+ 799, 799, 799, 799, 803, 812, 895, 827, 798, 810,
+ 922, 799, 805, 805, 805, 805, 792, 803, 910, 812,
+ 810, 795, 806, 806, 806, 806, 896, 898, 909, 799,
+ 812, 895, 0, 810, 922, 815, 815, 815, 815, 0,
+ 896, 805, 0, 812, 816, 816, 816, 816, 0, 0,
+ 0, 806, 898, 909, 799, 815, 840, 840, 840, 840,
+ 830, 830, 830, 830, 816, 896, 805, 822, 822, 822,
+ 822, 0, 817, 817, 817, 817, 806, 814, 814, 814,
+
+ 814, 830, 814, 823, 823, 823, 823, 822, 0, 0,
+ 814, 814, 817, 814, 814, 814, 814, 814, 817, 814,
+ 814, 814, 981, 823, 914, 0, 822, 824, 824, 824,
+ 824, 826, 826, 826, 826, 851, 823, 851, 828, 828,
+ 828, 828, 920, 817, 851, 999, 981, 824, 940, 914,
+ 822, 0, 826, 829, 829, 829, 829, 890, 826, 828,
+ 851, 823, 851, 831, 831, 831, 831, 920, 851, 999,
+ 824, 890, 946, 940, 829, 837, 837, 837, 837, 828,
+ 1002, 0, 890, 826, 831, 0, 837, 838, 838, 838,
+ 838, 829, 947, 952, 824, 890, 0, 946, 838, 0,
+
+ 984, 0, 831, 828, 1002, 841, 841, 841, 841, 842,
+ 842, 842, 842, 1007, 1001, 829, 841, 947, 952, 0,
+ 842, 844, 844, 844, 844, 984, 831, 845, 845, 845,
+ 845, 846, 846, 846, 846, 0, 0, 1007, 845, 1001,
+ 0, 844, 847, 847, 847, 847, 0, 845, 1012, 1027,
+ 0, 846, 0, 847, 848, 848, 848, 848, 849, 849,
+ 849, 849, 847, 850, 850, 850, 850, 0, 0, 0,
+ 848, 872, 1012, 1027, 849, 852, 852, 852, 852, 850,
+ 872, 872, 1013, 848, 1021, 853, 853, 853, 853, 892,
+ 0, 852, 854, 854, 854, 854, 872, 855, 855, 855,
+
+ 855, 853, 849, 892, 872, 872, 852, 1013, 848, 1021,
+ 1036, 1094, 852, 855, 892, 852, 853, 856, 856, 856,
+ 856, 0, 853, 0, 0, 853, 849, 892, 0, 854,
+ 855, 852, 1095, 856, 1036, 1094, 852, 0, 0, 852,
+ 0, 853, 877, 877, 877, 877, 853, 877, 856, 853,
+ 1050, 1054, 897, 854, 856, 855, 1095, 856, 857, 857,
+ 857, 857, 877, 859, 859, 859, 859, 897, 858, 858,
+ 858, 858, 960, 856, 857, 1050, 1054, 897, 856, 859,
+ 1106, 856, 960, 1107, 858, 860, 860, 860, 860, 857,
+ 988, 897, 859, 1022, 0, 857, 1056, 960, 857, 858,
+
+ 1067, 860, 988, 1022, 1106, 858, 960, 1107, 858, 862,
+ 862, 862, 862, 0, 857, 988, 0, 859, 1022, 857,
+ 0, 1056, 857, 1084, 858, 1067, 988, 1022, 860, 858,
+ 983, 1092, 858, 863, 863, 863, 863, 864, 864, 864,
+ 864, 865, 865, 865, 865, 983, 862, 0, 1084, 863,
+ 1103, 1113, 860, 864, 1118, 983, 1092, 865, 866, 866,
+ 866, 866, 876, 876, 876, 876, 863, 876, 864, 983,
+ 862, 1028, 865, 876, 864, 1103, 1113, 864, 865, 1118,
+ 1028, 865, 0, 867, 867, 867, 867, 868, 868, 868,
+ 868, 863, 1135, 864, 0, 866, 1028, 865, 864, 867,
+
+ 0, 864, 865, 868, 1028, 865, 870, 870, 870, 870,
+ 0, 871, 867, 1035, 1035, 1035, 1035, 1135, 871, 866,
+ 871, 1136, 873, 873, 873, 873, 880, 880, 880, 880,
+ 868, 0, 874, 874, 874, 874, 871, 867, 873, 1140,
+ 0, 0, 871, 870, 871, 1136, 880, 0, 874, 875,
+ 875, 875, 875, 873, 868, 886, 886, 886, 886, 1145,
+ 875, 875, 873, 874, 1140, 875, 886, 870, 882, 882,
+ 882, 882, 874, 0, 878, 878, 878, 878, 873, 878,
+ 875, 1144, 1149, 1145, 882, 878, 873, 1150, 874, 875,
+ 879, 879, 879, 879, 878, 879, 874, 881, 881, 881,
+
+ 881, 879, 1141, 1059, 0, 875, 1144, 1149, 881, 0,
+ 882, 1150, 0, 875, 0, 1059, 1141, 881, 883, 883,
+ 883, 883, 885, 885, 885, 885, 0, 1141, 1059, 883,
+ 888, 888, 888, 888, 882, 889, 889, 889, 889, 1059,
+ 1141, 888, 885, 0, 0, 1162, 889, 1025, 0, 883,
+ 888, 900, 900, 900, 900, 889, 0, 1025, 883, 0,
+ 901, 901, 901, 901, 885, 901, 899, 899, 899, 899,
+ 1162, 900, 1025, 1159, 883, 0, 0, 901, 0, 901,
+ 901, 1025, 883, 917, 917, 917, 917, 0, 885, 894,
+ 894, 894, 894, 0, 894, 899, 0, 1159, 912, 912,
+
+ 912, 912, 894, 894, 917, 894, 894, 894, 894, 894,
+ 0, 894, 894, 894, 902, 902, 902, 902, 912, 0,
+ 899, 904, 904, 904, 904, 902, 0, 0, 0, 912,
+ 905, 905, 905, 905, 902, 903, 903, 903, 903, 1172,
+ 903, 904, 1043, 1043, 1043, 1043, 903, 904, 903, 903,
+ 905, 903, 903, 903, 912, 903, 905, 903, 903, 903,
+ 906, 906, 906, 906, 1172, 0, 911, 911, 911, 911,
+ 0, 0, 904, 0, 913, 913, 913, 913, 1161, 0,
+ 906, 905, 916, 916, 916, 916, 911, 915, 915, 915,
+ 915, 0, 0, 0, 913, 919, 919, 919, 919, 906,
+
+ 0, 0, 1161, 916, 911, 0, 0, 0, 915, 0,
+ 0, 916, 1071, 1071, 1071, 1071, 919, 1175, 1175, 1175,
+ 1175, 913, 0, 906, 907, 907, 907, 907, 911, 907,
+ 915, 918, 918, 918, 918, 919, 916, 907, 907, 0,
+ 907, 907, 907, 907, 907, 913, 907, 907, 907, 0,
+ 0, 0, 918, 1213, 915, 924, 924, 924, 924, 919,
+ 918, 925, 925, 925, 925, 0, 924, 927, 927, 927,
+ 927, 1082, 925, 928, 928, 928, 928, 1213, 927, 929,
+ 929, 929, 929, 1082, 928, 918, 930, 930, 930, 930,
+ 929, 931, 931, 931, 931, 0, 1082, 930, 932, 932,
+
+ 932, 932, 931, 0, 0, 0, 930, 1082, 1176, 932,
+ 1214, 931, 933, 933, 933, 933, 0, 1180, 932, 934,
+ 934, 934, 934, 933, 935, 935, 935, 935, 936, 936,
+ 936, 936, 933, 1176, 1214, 934, 1228, 939, 0, 1184,
+ 935, 939, 1180, 0, 936, 937, 937, 937, 937, 0,
+ 939, 938, 938, 938, 938, 1211, 0, 934, 0, 936,
+ 1228, 937, 939, 941, 1184, 935, 939, 938, 936, 941,
+ 942, 942, 942, 942, 939, 1222, 937, 0, 941, 0,
+ 1211, 934, 938, 1051, 936, 937, 942, 0, 941, 935,
+ 1229, 938, 936, 1051, 941, 1237, 1279, 942, 0, 1239,
+
+ 1222, 937, 941, 943, 943, 943, 943, 938, 1051, 937,
+ 944, 944, 944, 944, 1229, 938, 0, 1051, 1240, 943,
+ 1237, 1279, 942, 1239, 1254, 0, 944, 0, 943, 945,
+ 945, 945, 945, 948, 948, 948, 948, 954, 949, 949,
+ 949, 949, 1240, 954, 1283, 945, 0, 1116, 1254, 948,
+ 1258, 944, 954, 943, 949, 950, 950, 950, 950, 1116,
+ 948, 953, 954, 949, 951, 951, 951, 951, 954, 1283,
+ 953, 950, 1116, 953, 1258, 944, 954, 0, 0, 1297,
+ 951, 1259, 0, 1116, 0, 948, 953, 0, 949, 0,
+ 955, 955, 955, 955, 953, 0, 950, 953, 1273, 1310,
+
+ 956, 956, 956, 956, 1297, 1259, 955, 957, 957, 957,
+ 957, 958, 958, 958, 958, 1298, 956, 0, 0, 1057,
+ 950, 955, 1273, 957, 1310, 1311, 0, 958, 0, 1057,
+ 955, 956, 966, 966, 966, 966, 1045, 966, 957, 1298,
+ 956, 1058, 958, 966, 1057, 1045, 955, 957, 1045, 1311,
+ 1058, 958, 1319, 1057, 955, 0, 956, 959, 959, 959,
+ 959, 1045, 0, 957, 956, 0, 1058, 958, 1320, 1045,
+ 1332, 957, 1045, 959, 1058, 958, 0, 1319, 961, 961,
+ 961, 961, 967, 967, 967, 967, 959, 1115, 959, 961,
+ 961, 0, 1320, 967, 961, 1332, 1115, 959, 962, 962,
+
+ 962, 962, 0, 1121, 963, 963, 963, 963, 0, 961,
+ 0, 959, 1115, 959, 962, 1121, 1338, 0, 961, 1344,
+ 1115, 959, 0, 0, 964, 964, 964, 964, 1121, 962,
+ 965, 965, 965, 965, 961, 963, 0, 0, 962, 1121,
+ 1338, 1068, 961, 1344, 963, 969, 969, 969, 969, 0,
+ 969, 1068, 0, 964, 962, 964, 969, 1347, 1343, 1346,
+ 963, 965, 962, 0, 964, 969, 1068, 1114, 963, 965,
+ 965, 970, 970, 970, 970, 1068, 970, 1114, 964, 0,
+ 964, 1347, 970, 1343, 1346, 0, 965, 1348, 964, 0,
+ 0, 970, 1114, 965, 965, 972, 972, 972, 972, 1351,
+
+ 972, 1114, 973, 973, 973, 973, 972, 973, 974, 974,
+ 974, 974, 1348, 973, 975, 975, 975, 975, 0, 974,
+ 976, 976, 976, 976, 1351, 975, 1337, 1337, 974, 0,
+ 1349, 976, 1352, 0, 975, 0, 976, 977, 977, 977,
+ 977, 978, 978, 978, 978, 1119, 0, 0, 977, 0,
+ 1337, 1337, 978, 977, 1349, 1119, 1352, 978, 979, 979,
+ 979, 979, 980, 980, 980, 980, 1120, 1133, 977, 979,
+ 1119, 1138, 978, 980, 1391, 1120, 1133, 977, 980, 1119,
+ 1138, 978, 982, 982, 982, 982, 985, 985, 985, 985,
+ 0, 1120, 1133, 977, 0, 0, 1138, 978, 1391, 1120,
+
+ 1133, 977, 982, 1406, 1138, 978, 989, 989, 989, 989,
+ 0, 990, 990, 990, 990, 985, 990, 1417, 991, 991,
+ 991, 991, 1430, 1432, 982, 0, 989, 1406, 990, 991,
+ 990, 990, 1437, 993, 993, 993, 993, 1438, 0, 1304,
+ 985, 1417, 0, 1304, 993, 1134, 1430, 1432, 982, 986,
+ 986, 986, 986, 993, 986, 1433, 1437, 1134, 1443, 0,
+ 986, 1438, 986, 986, 1304, 986, 986, 986, 1304, 986,
+ 1134, 986, 986, 986, 987, 987, 987, 987, 0, 987,
+ 1433, 1134, 1443, 1000, 1000, 1000, 1000, 987, 987, 1434,
+ 987, 987, 987, 987, 987, 1181, 987, 987, 987, 992,
+
+ 992, 992, 992, 1000, 992, 1156, 1156, 1156, 1156, 1181,
+ 992, 1000, 992, 992, 1434, 992, 992, 992, 0, 992,
+ 1181, 992, 992, 992, 994, 994, 994, 994, 996, 996,
+ 996, 996, 1456, 1181, 1156, 994, 1000, 0, 0, 996,
+ 997, 997, 997, 997, 994, 0, 0, 1444, 996, 0,
+ 0, 997, 1445, 1004, 1004, 1004, 1004, 1456, 0, 1156,
+ 997, 998, 998, 998, 998, 0, 998, 1005, 1005, 1005,
+ 1005, 1444, 998, 1004, 998, 998, 1445, 998, 998, 998,
+ 1477, 998, 1004, 998, 998, 998, 1446, 1005, 1009, 1009,
+ 1009, 1009, 1011, 1011, 1011, 1011, 1008, 1008, 1008, 1008,
+
+ 0, 1015, 1015, 1015, 1015, 1477, 1451, 1004, 1452, 1009,
+ 1446, 1005, 1015, 1011, 0, 0, 0, 1008, 0, 0,
+ 0, 1015, 1087, 1087, 1087, 1087, 0, 0, 0, 1008,
+ 1451, 0, 1452, 1087, 0, 1005, 1006, 1006, 1006, 1006,
+ 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006,
+ 1006, 1006, 1006, 1006, 1008, 1006, 1479, 1006, 1006, 1006,
+ 1006, 1006, 1010, 1010, 1010, 1010, 0, 1479, 1016, 1016,
+ 1016, 1016, 1017, 1017, 1017, 1017, 1018, 1018, 1018, 1018,
+ 1480, 1479, 0, 1010, 1016, 1006, 0, 1482, 1017, 0,
+ 1491, 1479, 1018, 1076, 1076, 1076, 1076, 1017, 1019, 1019,
+
+ 1019, 1019, 0, 1010, 1076, 1480, 1499, 1018, 0, 1006,
+ 1006, 1016, 1482, 1076, 1019, 1491, 1018, 1020, 1020, 1020,
+ 1020, 0, 1017, 1029, 1029, 1029, 1029, 1010, 1131, 1019,
+ 1131, 1499, 1018, 1020, 0, 1016, 1506, 1131, 1019, 1029,
+ 1018, 0, 0, 1023, 1023, 1023, 1023, 1487, 1020, 1024,
+ 1024, 1024, 1024, 1131, 1019, 1131, 0, 1020, 1487, 1023,
+ 1506, 1131, 1019, 0, 0, 1024, 1026, 1026, 1026, 1026,
+ 0, 0, 1487, 1020, 1023, 0, 1185, 1065, 1024, 1065,
+ 1024, 1020, 1487, 1023, 1030, 1030, 1030, 1030, 1065, 1024,
+ 1185, 0, 1031, 1031, 1031, 1031, 1399, 1026, 1399, 1023,
+
+ 1030, 1185, 1065, 1024, 1065, 1024, 1026, 1023, 1031, 0,
+ 0, 0, 1065, 1024, 1185, 1032, 1032, 1032, 1032, 0,
+ 0, 1399, 1026, 1399, 1030, 1031, 1033, 1033, 1033, 1033,
+ 1026, 1032, 0, 1034, 1034, 1034, 1034, 1037, 1037, 1037,
+ 1037, 1508, 1081, 1081, 1081, 1081, 1032, 1504, 1030, 1034,
+ 1031, 0, 1032, 1037, 1510, 1032, 1139, 1033, 1038, 1038,
+ 1038, 1038, 1081, 1033, 1034, 1508, 1033, 1514, 1139, 1519,
+ 1034, 1032, 1504, 1034, 1038, 1509, 1032, 1521, 1510, 1032,
+ 0, 1139, 1033, 1039, 1039, 1039, 1039, 1033, 0, 1034,
+ 1033, 1514, 1139, 1519, 1034, 1513, 0, 1034, 1038, 1039,
+
+ 1509, 1521, 1040, 1040, 1040, 1040, 1041, 1041, 1041, 1041,
+ 1088, 1088, 1088, 1088, 1526, 0, 1039, 0, 1040, 1518,
+ 1513, 1088, 1038, 1147, 1042, 1042, 1042, 1042, 1044, 1044,
+ 1044, 1044, 1147, 1040, 0, 0, 0, 1041, 1526, 1040,
+ 1042, 1039, 1040, 1041, 1518, 0, 1041, 0, 1147, 1089,
+ 1089, 1089, 1089, 0, 0, 1042, 1147, 1520, 1040, 1044,
+ 1089, 1042, 1041, 1040, 1042, 1212, 1040, 1041, 1044, 1089,
+ 1041, 1046, 1046, 1046, 1046, 1047, 1047, 1047, 1047, 1212,
+ 1042, 1530, 1520, 1525, 1044, 1042, 1548, 1046, 1042, 1148,
+ 1212, 1047, 1044, 1048, 1048, 1048, 1048, 1052, 1052, 1052,
+
+ 1052, 1148, 1046, 1212, 1532, 1530, 1047, 0, 1525, 1048,
+ 1548, 1046, 1552, 1052, 1148, 1047, 1053, 1053, 1053, 1053,
+ 1062, 1062, 1062, 1062, 1048, 1148, 0, 1046, 1052, 1532,
+ 1551, 1047, 1053, 1048, 1580, 1046, 1552, 1052, 0, 1047,
+ 0, 0, 1061, 1061, 1061, 1061, 0, 1053, 0, 1048,
+ 1563, 1062, 0, 1052, 0, 1551, 1053, 1048, 1580, 1062,
+ 1062, 1052, 1063, 1063, 1063, 1063, 1122, 1122, 1122, 1122,
+ 1178, 1061, 1053, 1061, 0, 1563, 1062, 1122, 1063, 1178,
+ 1053, 0, 1061, 1062, 1062, 1064, 1064, 1064, 1064, 1069,
+ 1069, 1069, 1069, 1063, 0, 1178, 1061, 1464, 1061, 1464,
+
+ 0, 1064, 1063, 1178, 0, 1069, 1061, 1070, 1070, 1070,
+ 1070, 1072, 1072, 1072, 1072, 0, 1064, 0, 1063, 1182,
+ 1069, 1573, 1464, 1070, 1464, 1064, 1063, 0, 1182, 1069,
+ 1073, 1073, 1073, 1073, 1099, 1099, 1099, 1099, 1070, 1266,
+ 1072, 1064, 1072, 1581, 1182, 1069, 1573, 1070, 1266, 1064,
+ 1582, 1072, 1182, 1069, 1099, 0, 0, 1074, 1074, 1074,
+ 1074, 1073, 1619, 1070, 1266, 1072, 1585, 1072, 1581, 1073,
+ 1073, 1070, 1266, 0, 1582, 1072, 1075, 1075, 1075, 1075,
+ 1077, 1077, 1077, 1077, 1589, 0, 1073, 1619, 1074, 0,
+ 1585, 1077, 0, 1073, 1073, 1074, 1077, 1074, 1078, 1078,
+
+ 1078, 1078, 1108, 1108, 1108, 1108, 1363, 1075, 1589, 1078,
+ 1363, 1077, 1627, 1074, 1078, 1591, 1075, 1075, 1108, 1074,
+ 1077, 1074, 1090, 1090, 1090, 1090, 0, 0, 1470, 1078,
+ 1470, 1363, 1075, 1090, 0, 1363, 1077, 1627, 1078, 1591,
+ 1075, 1075, 1090, 0, 1077, 1079, 1079, 1079, 1079, 1093,
+ 1093, 1093, 1093, 1470, 1078, 1470, 1079, 1097, 1097, 1097,
+ 1097, 1079, 1078, 0, 1098, 1098, 1098, 1098, 1595, 1093,
+ 0, 0, 1105, 1105, 1105, 1105, 1079, 1097, 1104, 1104,
+ 1104, 1104, 1179, 1632, 1098, 1079, 0, 1124, 1124, 1124,
+ 1124, 1647, 1595, 1105, 1179, 1097, 1093, 1105, 1124, 1104,
+
+ 1656, 1079, 0, 1124, 0, 1098, 1663, 1179, 1632, 1079,
+ 1083, 1083, 1083, 1083, 1669, 1083, 1647, 1104, 1179, 1097,
+ 1093, 1083, 1105, 1083, 1083, 1656, 1083, 1083, 1083, 1098,
+ 1083, 1663, 1083, 1083, 1083, 1086, 1086, 1086, 1086, 1669,
+ 1086, 1104, 0, 1127, 1127, 1127, 1127, 1671, 1086, 1086,
+ 1677, 1086, 1086, 1086, 1127, 1086, 0, 1086, 1086, 1086,
+ 1091, 1091, 1091, 1091, 0, 1091, 1248, 1248, 1248, 1248,
+ 0, 1091, 1671, 1091, 1091, 1677, 1091, 1091, 1091, 1600,
+ 1091, 1602, 1091, 1091, 1091, 1100, 1100, 1100, 1100, 1100,
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
+
+ 1100, 1100, 1100, 1600, 1100, 1602, 1100, 1100, 1100, 1100,
+ 1100, 1128, 1128, 1128, 1128, 0, 1160, 1160, 1160, 1160,
+ 1183, 1160, 1128, 1167, 1167, 1167, 1167, 1128, 1191, 1191,
+ 1191, 1191, 1183, 1160, 1100, 1160, 1160, 0, 0, 1167,
+ 1186, 1186, 1186, 1186, 1191, 1183, 1190, 1190, 1190, 1190,
+ 0, 1186, 1276, 1276, 1276, 1276, 1183, 1190, 1100, 1100,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1109, 1109, 1109, 1109, 1110,
+ 1110, 1110, 1110, 1111, 1111, 1111, 1111, 1197, 1197, 1197,
+ 1197, 1109, 0, 1657, 0, 1110, 1725, 1224, 1197, 1111,
+ 1112, 1112, 1112, 1112, 0, 1117, 1117, 1117, 1117, 1224,
+ 1110, 0, 0, 1498, 1111, 0, 1112, 1657, 1109, 1110,
+ 1725, 1117, 1224, 1111, 1498, 0, 1123, 1123, 1123, 1123,
+ 1684, 1112, 0, 1224, 0, 1110, 1117, 1123, 1498, 1111,
+
+ 1112, 0, 1109, 1110, 0, 1117, 0, 1111, 1498, 1125,
+ 1125, 1125, 1125, 0, 0, 1684, 1112, 1123, 1369, 1203,
+ 1703, 1117, 1369, 1711, 1112, 1125, 1123, 1203, 1203, 1117,
+ 1126, 1126, 1126, 1126, 0, 1223, 1125, 1129, 1129, 1129,
+ 1129, 1726, 1123, 1369, 1203, 1703, 1126, 1369, 1711, 1223,
+ 1123, 1203, 1203, 1129, 1731, 1126, 1130, 1130, 1130, 1130,
+ 1223, 1125, 0, 1733, 1129, 1726, 1734, 1132, 1132, 1132,
+ 1132, 0, 1130, 1223, 1137, 1137, 1137, 1137, 0, 1731,
+ 1126, 1130, 0, 1132, 1142, 1142, 1142, 1142, 1733, 1129,
+ 1137, 1734, 1784, 0, 1143, 1143, 1143, 1143, 1132, 0,
+
+ 0, 1146, 1146, 1146, 1146, 1137, 1130, 1132, 1737, 0,
+ 1195, 1195, 1195, 1195, 1137, 1142, 1784, 1146, 1274, 1274,
+ 1274, 1274, 1142, 1132, 1142, 1143, 1195, 1785, 0, 0,
+ 1137, 1132, 1146, 1737, 1143, 1143, 0, 0, 1137, 1274,
+ 1142, 1146, 1151, 1151, 1151, 1151, 1142, 0, 1142, 0,
+ 1143, 1785, 1152, 1152, 1152, 1152, 0, 1146, 1143, 1143,
+ 1738, 1164, 1164, 1164, 1164, 1146, 1739, 0, 0, 1154,
+ 1154, 1154, 1154, 1151, 1153, 1153, 1153, 1153, 0, 0,
+ 1151, 1164, 1151, 1152, 0, 1738, 1164, 0, 1238, 0,
+ 1740, 1739, 1152, 1152, 1201, 1201, 1201, 1201, 1151, 1743,
+
+ 1154, 0, 1238, 1153, 1151, 1153, 1151, 1757, 1152, 1154,
+ 1201, 1164, 1154, 1238, 1153, 1740, 1152, 1152, 1177, 1177,
+ 1177, 1177, 0, 0, 1743, 1154, 1238, 0, 1153, 1280,
+ 1153, 0, 1757, 1154, 1177, 1800, 1154, 0, 1153, 1155,
+ 1155, 1155, 1155, 1280, 1155, 1799, 1163, 1163, 1163, 1163,
+ 1284, 1177, 1155, 1155, 1280, 1155, 1155, 1155, 0, 1155,
+ 1800, 1155, 1155, 1155, 1284, 0, 1163, 1280, 1155, 1799,
+ 1246, 1246, 1246, 1246, 0, 1284, 1177, 1173, 1173, 1173,
+ 1173, 1249, 1249, 1249, 1249, 1808, 0, 0, 1284, 1163,
+ 1246, 0, 0, 1155, 1158, 1158, 1158, 1158, 1173, 1158,
+
+ 0, 1249, 1225, 1225, 1225, 1225, 0, 1158, 1158, 1808,
+ 1158, 1158, 1158, 1163, 1158, 1173, 1158, 1158, 1158, 1166,
+ 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166,
+ 1166, 1225, 1807, 1166, 1166, 1166, 1166, 0, 1166, 1173,
+ 1166, 1166, 1166, 1166, 1166, 1810, 1281, 1166, 0, 1166,
+ 1792, 0, 1275, 1275, 1275, 1275, 1225, 1807, 1281, 1792,
+ 1169, 1169, 1169, 1169, 1174, 1174, 1174, 1174, 1166, 1810,
+ 0, 1281, 1166, 1275, 1166, 1792, 1169, 1327, 1327, 1327,
+ 1327, 1275, 1281, 1792, 0, 1174, 0, 1169, 0, 1169,
+ 0, 0, 1166, 1166, 1168, 1168, 1168, 1168, 1168, 1168,
+
+ 1168, 1168, 1168, 1168, 1168, 1168, 1275, 1174, 1168, 1168,
+ 1168, 1168, 1169, 1168, 1169, 1168, 1168, 1168, 1168, 1168,
+ 1170, 1170, 1170, 1170, 1171, 1171, 1171, 1171, 0, 0,
+ 0, 1174, 0, 1285, 0, 0, 1170, 1813, 0, 1476,
+ 1171, 1476, 0, 1168, 0, 1285, 1386, 1170, 1295, 1170,
+ 1386, 1171, 1535, 1171, 1188, 1188, 1188, 1188, 1285, 1170,
+ 1295, 1813, 1171, 1535, 1476, 1188, 1476, 1168, 1168, 1285,
+ 1188, 1386, 1170, 1295, 1170, 1386, 1171, 1535, 1171, 1329,
+ 1329, 1329, 1329, 1170, 1295, 1188, 1171, 1535, 1189, 1189,
+ 1189, 1189, 0, 0, 1188, 1192, 1192, 1192, 1192, 1189,
+
+ 1426, 1426, 1426, 1426, 1189, 1818, 1192, 0, 0, 0,
+ 1188, 1192, 0, 0, 1193, 1193, 1193, 1193, 1188, 1189,
+ 1196, 1196, 1196, 1196, 1848, 1193, 1192, 0, 1189, 1818,
+ 1193, 1194, 1194, 1194, 1194, 1192, 1196, 1198, 1198, 1198,
+ 1198, 0, 1194, 1820, 1189, 1193, 0, 1194, 1198, 1848,
+ 1539, 1192, 1189, 1198, 1193, 1357, 1357, 1357, 1357, 1192,
+ 1196, 1539, 1194, 1199, 1199, 1199, 1199, 1820, 1198, 0,
+ 1193, 1194, 0, 0, 1199, 1539, 1357, 1198, 1193, 1199,
+ 1200, 1200, 1200, 1200, 1196, 1539, 0, 1194, 1849, 0,
+ 0, 1200, 0, 1198, 1199, 1194, 1200, 1202, 1202, 1202,
+
+ 1202, 1198, 1864, 1199, 1857, 0, 1302, 1204, 1204, 1204,
+ 1204, 1200, 1849, 1202, 1205, 1205, 1205, 1205, 1302, 1199,
+ 1200, 1869, 0, 1204, 0, 0, 1864, 1199, 1317, 1857,
+ 1205, 1302, 1326, 1326, 1326, 1326, 1200, 1202, 1204, 0,
+ 1317, 0, 1302, 0, 1200, 1205, 1869, 1204, 1206, 1206,
+ 1206, 1206, 1870, 1317, 1205, 1247, 1247, 1247, 1247, 0,
+ 1247, 1202, 1549, 1204, 1317, 1207, 1207, 1207, 1207, 1326,
+ 1205, 1204, 1247, 1549, 1247, 1247, 1870, 0, 1205, 1206,
+ 0, 1207, 1208, 1208, 1208, 1208, 1872, 1549, 1206, 1250,
+ 1250, 1250, 1250, 1326, 1250, 0, 1207, 1549, 1208, 1209,
+
+ 1209, 1209, 1209, 1873, 1206, 1207, 1250, 1874, 1250, 1250,
+ 0, 1872, 1206, 1208, 0, 1209, 1289, 1210, 1210, 1210,
+ 1210, 1207, 1208, 1289, 0, 1289, 1877, 1873, 1209, 1207,
+ 1209, 0, 1874, 1210, 1215, 1215, 1215, 1215, 1208, 1209,
+ 1875, 1289, 1576, 1576, 1576, 1576, 1208, 1289, 1210, 1289,
+ 1215, 1877, 0, 1209, 0, 1209, 1210, 1210, 1282, 1282,
+ 1282, 1282, 0, 1209, 1875, 1215, 1216, 1216, 1216, 1216,
+ 0, 0, 0, 1210, 1215, 0, 1217, 1217, 1217, 1217,
+ 1210, 1210, 1216, 1218, 1218, 1218, 1218, 1282, 0, 1878,
+ 1215, 1883, 0, 1219, 1219, 1219, 1219, 1216, 1215, 1218,
+
+ 1256, 1256, 1256, 1256, 0, 0, 1216, 1217, 0, 1219,
+ 1893, 0, 1282, 1878, 1218, 1883, 1217, 1361, 0, 1367,
+ 1256, 1892, 1216, 1218, 1219, 1220, 1220, 1220, 1220, 1361,
+ 1216, 1367, 1217, 1219, 1893, 1221, 1221, 1221, 1221, 1218,
+ 1217, 1220, 1361, 1256, 1367, 0, 1892, 1218, 1390, 1219,
+ 0, 1221, 1390, 1361, 1220, 1367, 1220, 1219, 1894, 0,
+ 0, 1226, 1226, 1226, 1226, 1220, 1221, 1256, 1286, 1286,
+ 1286, 1286, 0, 1390, 1221, 1221, 1895, 1390, 0, 1220,
+ 0, 1220, 1894, 1227, 1227, 1227, 1227, 0, 0, 1220,
+ 1226, 1221, 1226, 1230, 1230, 1230, 1230, 1286, 1221, 1221,
+
+ 1895, 1226, 1909, 1231, 1231, 1231, 1231, 0, 0, 1230,
+ 1575, 1575, 1575, 1575, 1227, 1226, 1395, 1226, 1910, 1231,
+ 1395, 1575, 1286, 1227, 1230, 1226, 1227, 1909, 0, 1232,
+ 1232, 1232, 1232, 1230, 1231, 1233, 1233, 1233, 1233, 1227,
+ 1918, 1395, 1910, 1231, 0, 1395, 1919, 1227, 0, 1230,
+ 1227, 1233, 1234, 1234, 1234, 1234, 0, 1230, 1921, 1231,
+ 1232, 1345, 1345, 1345, 1345, 1918, 1233, 1231, 1234, 1232,
+ 1919, 1235, 1235, 1235, 1235, 1233, 1923, 1345, 1236, 1236,
+ 1236, 1236, 1921, 1234, 0, 1232, 1922, 1235, 0, 0,
+ 0, 1233, 1234, 1232, 1236, 1586, 1586, 1586, 1586, 1233,
+
+ 1235, 1923, 1235, 1358, 1358, 1358, 1358, 0, 1234, 1236,
+ 1922, 1235, 1242, 1242, 1242, 1242, 1234, 1236, 1236, 1241,
+ 1241, 1241, 1241, 0, 1358, 1235, 1939, 1235, 0, 1243,
+ 1243, 1243, 1243, 1924, 1236, 1235, 0, 1350, 1350, 1350,
+ 1350, 1236, 1236, 1242, 1359, 1359, 1359, 1359, 1241, 1846,
+ 1241, 1939, 1242, 1350, 1929, 1242, 1603, 1924, 1846, 1241,
+ 1243, 1244, 1244, 1244, 1244, 1359, 1938, 1603, 1242, 1243,
+ 1243, 0, 0, 1241, 1846, 1241, 1242, 0, 1929, 1242,
+ 0, 1603, 1846, 1241, 0, 1243, 1376, 1376, 1376, 1376,
+ 1938, 1603, 1244, 1243, 1243, 1278, 1278, 1278, 1278, 1940,
+
+ 0, 1244, 1376, 1257, 1257, 1257, 1257, 1287, 1287, 1287,
+ 1287, 1278, 1400, 0, 1943, 0, 1400, 1244, 1287, 1380,
+ 1380, 1380, 1380, 1287, 1940, 1244, 1245, 1245, 1245, 1245,
+ 1257, 1245, 1257, 0, 1278, 1380, 0, 1400, 1943, 1245,
+ 1245, 1400, 1245, 1245, 1245, 1485, 1245, 1485, 1245, 1245,
+ 1245, 1252, 1252, 1252, 1252, 1257, 1252, 1257, 1278, 1392,
+ 1392, 1392, 1392, 0, 1252, 1252, 0, 1252, 1252, 1252,
+ 1485, 1252, 1485, 1252, 1252, 1252, 1255, 1255, 1255, 1255,
+ 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255,
+ 1255, 1255, 1255, 1255, 0, 1255, 1392, 1255, 1255, 1255,
+
+ 1255, 1255, 1260, 1260, 1260, 1260, 0, 1262, 1262, 1262,
+ 1262, 1288, 1288, 1288, 1288, 1412, 0, 1944, 1260, 1412,
+ 1392, 1949, 1288, 1262, 1950, 1255, 1416, 1288, 1460, 1962,
+ 1416, 1465, 1460, 1260, 1497, 1465, 1497, 1531, 1262, 1531,
+ 1412, 1944, 1260, 0, 1412, 1949, 0, 1262, 1950, 1255,
+ 1255, 1416, 1951, 1460, 1962, 1416, 1465, 1460, 1260, 1497,
+ 1465, 1497, 1531, 1262, 1531, 0, 1260, 1261, 1261, 1261,
+ 1261, 1262, 1264, 1264, 1264, 1264, 1951, 1265, 1265, 1265,
+ 1265, 0, 1952, 1261, 1268, 1268, 1268, 1268, 1264, 1269,
+ 1269, 1269, 1269, 1265, 1261, 0, 1261, 1466, 1261, 0,
+
+ 1268, 1466, 1969, 1264, 0, 1269, 1952, 1261, 1265, 1471,
+ 1478, 0, 1264, 1471, 1478, 1268, 0, 1265, 1957, 1261,
+ 1269, 1261, 1466, 1261, 1268, 0, 1466, 1969, 1264, 1269,
+ 0, 1261, 0, 1265, 1471, 1478, 1264, 0, 1471, 1478,
+ 1268, 1265, 1957, 0, 0, 1269, 0, 0, 1268, 1272,
+ 1272, 1272, 1272, 1269, 1270, 1270, 1270, 1270, 0, 1290,
+ 1290, 1290, 1290, 0, 0, 1272, 1439, 1439, 1439, 1439,
+ 1270, 1442, 1442, 1442, 1442, 1290, 1272, 1536, 1272, 1536,
+ 1533, 1270, 1439, 1270, 1533, 1270, 0, 1442, 1290, 1606,
+ 1290, 0, 1272, 1958, 1270, 1447, 1447, 1447, 1447, 1290,
+
+ 1606, 1272, 1536, 1272, 1536, 1533, 1270, 0, 1270, 1533,
+ 1270, 1447, 1967, 1290, 1606, 1290, 1272, 1958, 1270, 1271,
+ 1271, 1271, 1271, 1290, 1606, 0, 1968, 1291, 1291, 1291,
+ 1291, 1333, 1333, 1333, 1333, 1271, 1967, 1292, 1292, 1292,
+ 1292, 1970, 0, 1291, 2019, 1537, 1271, 2029, 1271, 1537,
+ 1968, 1333, 1997, 1292, 1863, 1863, 1271, 1271, 1291, 0,
+ 1425, 1425, 1425, 1425, 1333, 1970, 1291, 1291, 1292, 2019,
+ 1537, 1271, 2029, 1271, 1537, 0, 1997, 1292, 1863, 1863,
+ 1271, 1271, 0, 1291, 1293, 1293, 1293, 1293, 0, 1333,
+ 1291, 1291, 1998, 1292, 1294, 1294, 1294, 1294, 0, 1425,
+
+ 1293, 1292, 1296, 1296, 1296, 1296, 1505, 1505, 1505, 1505,
+ 1294, 1299, 1299, 1299, 1299, 1293, 1998, 2011, 1427, 1427,
+ 1427, 1427, 1293, 1425, 1293, 1294, 1505, 1299, 0, 0,
+ 0, 1296, 0, 0, 1294, 1294, 1505, 2033, 1427, 1296,
+ 1293, 2011, 1299, 0, 0, 0, 1293, 0, 1293, 2012,
+ 1294, 1299, 1300, 1300, 1300, 1300, 1296, 1427, 1294, 1294,
+ 2020, 1505, 2033, 1296, 0, 0, 0, 1299, 1300, 1301,
+ 1301, 1301, 1301, 2012, 2038, 1299, 1303, 1303, 1303, 1303,
+ 2021, 1427, 2022, 1300, 2020, 1301, 1305, 1305, 1305, 1305,
+ 1300, 2027, 1300, 0, 2028, 1307, 1307, 1307, 1307, 2038,
+
+ 1301, 0, 1305, 2030, 2021, 1303, 2022, 2034, 1300, 1301,
+ 1301, 0, 2039, 1303, 1300, 2027, 1300, 1305, 2028, 1339,
+ 1339, 1339, 1339, 1305, 1307, 1301, 1305, 2030, 2040, 0,
+ 1303, 2034, 1307, 1301, 1301, 1339, 2039, 1303, 1306, 1306,
+ 1306, 1306, 1305, 0, 2041, 2045, 1339, 1305, 1339, 1307,
+ 1305, 0, 2046, 2040, 1306, 2050, 1307, 1308, 1308, 1308,
+ 1308, 0, 0, 0, 1309, 1309, 1309, 1309, 2041, 1306,
+ 2045, 1339, 0, 1339, 0, 1306, 2046, 0, 1306, 2050,
+ 1450, 1450, 1450, 1450, 1457, 1457, 1457, 1457, 1308, 0,
+ 1458, 1458, 1458, 1458, 1306, 1309, 1450, 1308, 1308, 1306,
+
+ 2056, 1309, 1306, 2057, 1309, 1457, 2055, 1312, 1312, 1312,
+ 1312, 1458, 2069, 1308, 1313, 1313, 1313, 1313, 0, 0,
+ 1309, 1308, 1308, 1312, 2056, 1309, 0, 2057, 1309, 0,
+ 1313, 2055, 1404, 1404, 1404, 1404, 1312, 2069, 1312, 0,
+ 0, 1314, 1314, 1314, 1314, 1313, 0, 1312, 1315, 1315,
+ 1315, 1315, 0, 1313, 1313, 0, 2070, 1314, 0, 0,
+ 0, 1312, 2082, 1312, 1315, 1318, 1318, 1318, 1318, 1404,
+ 1313, 1312, 1314, 1590, 1590, 1590, 1590, 1313, 1313, 1315,
+ 2070, 1314, 1316, 1316, 1316, 1316, 1315, 2082, 1315, 1321,
+ 1321, 1321, 1321, 1404, 1318, 0, 2091, 1314, 1316, 0,
+
+ 2083, 2089, 1318, 2092, 1315, 1314, 1592, 1592, 1592, 1592,
+ 1315, 2099, 1315, 1316, 0, 1407, 1407, 1407, 1407, 1318,
+ 1321, 2091, 1316, 1316, 2083, 2089, 1318, 2092, 0, 1321,
+ 1321, 1322, 1322, 1322, 1322, 0, 2099, 0, 1316, 2100,
+ 2101, 1323, 1323, 1323, 1323, 1321, 1316, 1316, 1324, 1324,
+ 1324, 1324, 1407, 1321, 1321, 0, 2102, 0, 1374, 1374,
+ 1374, 1374, 1322, 2100, 1324, 2101, 2105, 2109, 1322, 1374,
+ 2111, 1322, 1323, 0, 1323, 0, 1407, 0, 0, 1324,
+ 2102, 1323, 2115, 2120, 2127, 1324, 2129, 1322, 1324, 1374,
+ 2105, 2109, 1322, 0, 2111, 1322, 0, 1323, 1374, 1323,
+
+ 1325, 1325, 1325, 1325, 1324, 1323, 2115, 2120, 2127, 1324,
+ 2149, 2129, 1324, 2170, 1374, 0, 1325, 1354, 1354, 1354,
+ 1354, 2164, 1374, 1340, 1340, 1340, 1340, 1459, 1459, 1459,
+ 1459, 1325, 0, 1354, 2149, 0, 0, 1325, 2170, 1340,
+ 1325, 0, 0, 1459, 1354, 2164, 1354, 1354, 0, 2174,
+ 1340, 2184, 1340, 0, 0, 2191, 1325, 1517, 1517, 1517,
+ 1517, 1325, 1340, 0, 1325, 1328, 1328, 1328, 1328, 1354,
+ 1328, 1354, 1354, 1517, 2174, 1340, 2184, 1340, 1328, 1328,
+ 2191, 1328, 1328, 1328, 2197, 1328, 1340, 1328, 1328, 1328,
+ 1331, 1331, 1331, 1331, 0, 1331, 0, 0, 0, 1577,
+
+ 1577, 1577, 1577, 1331, 1331, 2175, 1331, 1331, 1331, 2197,
+ 1331, 2183, 1331, 1331, 1331, 1334, 1334, 1334, 1334, 1577,
+ 1353, 1353, 1353, 1353, 2185, 1360, 1360, 1360, 1360, 2175,
+ 2251, 1415, 1415, 1415, 1415, 2183, 1353, 1355, 1355, 1355,
+ 1355, 1360, 1334, 0, 1334, 0, 1334, 1353, 2185, 1353,
+ 0, 0, 0, 1355, 2251, 1334, 1362, 1362, 1362, 1362,
+ 1353, 2199, 0, 1360, 1355, 2205, 1355, 1334, 1415, 1334,
+ 1355, 1334, 1353, 0, 1353, 1596, 1596, 1596, 1596, 1334,
+ 1335, 1335, 1335, 1335, 1353, 1362, 2199, 1360, 2219, 1355,
+ 2205, 1355, 1415, 1362, 2223, 1355, 2224, 2230, 1364, 1364,
+
+ 1364, 1364, 1365, 1365, 1365, 1365, 0, 1335, 0, 1335,
+ 1362, 1335, 0, 2219, 1364, 0, 2233, 1362, 1365, 2223,
+ 1335, 2224, 2230, 1366, 1366, 1366, 1366, 2258, 2235, 1364,
+ 2244, 1809, 1335, 1365, 1335, 1364, 1335, 1809, 1364, 1365,
+ 1809, 2233, 1365, 0, 1335, 1336, 1336, 1336, 1336, 0,
+ 2250, 2258, 1366, 2235, 1364, 2244, 1809, 2252, 1365, 1364,
+ 1366, 1809, 1364, 1365, 1809, 0, 1365, 1368, 1368, 1368,
+ 1368, 2259, 1336, 2257, 1336, 2250, 1336, 1366, 1524, 1524,
+ 1524, 1524, 2252, 0, 1366, 1336, 0, 1370, 1370, 1370,
+ 1370, 2298, 2264, 0, 1524, 2259, 1368, 1336, 2257, 1336,
+
+ 2266, 1336, 0, 1370, 1368, 1614, 1614, 1614, 1614, 1336,
+ 1341, 1341, 1341, 1341, 0, 2298, 1614, 2264, 1370, 2267,
+ 0, 1368, 2270, 0, 1370, 2266, 1341, 1370, 1368, 1373,
+ 1373, 1373, 1373, 1418, 1418, 1418, 1418, 1341, 2271, 1341,
+ 1373, 1341, 0, 1370, 2267, 1373, 2272, 2270, 1370, 2306,
+ 1341, 1370, 1371, 1371, 1371, 1371, 1375, 1375, 1375, 1375,
+ 1373, 2273, 1341, 2271, 1341, 0, 1341, 1375, 1371, 1373,
+ 1418, 2272, 1375, 2306, 1341, 1342, 1342, 1342, 1342, 1621,
+ 1621, 1621, 1621, 1371, 2276, 1373, 2273, 1375, 0, 1371,
+ 1621, 1342, 1371, 1373, 1418, 0, 1375, 1486, 1486, 1486,
+
+ 1486, 0, 1342, 2291, 1342, 2295, 1342, 2296, 1371, 2276,
+ 0, 0, 1375, 1371, 0, 1342, 1371, 0, 0, 2309,
+ 1375, 0, 1377, 1377, 1377, 1377, 1486, 1342, 2291, 1342,
+ 2295, 1342, 2296, 1377, 1378, 1378, 1378, 1378, 1377, 1342,
+ 1372, 1372, 1372, 1372, 2309, 1378, 1534, 1534, 1534, 1534,
+ 0, 1486, 2310, 1377, 2320, 0, 2329, 1379, 1379, 1379,
+ 1379, 0, 1377, 2332, 2334, 1378, 0, 2333, 1379, 1372,
+ 2341, 1372, 0, 1379, 1378, 1534, 2310, 1372, 1377, 2320,
+ 1372, 2329, 1422, 1422, 1422, 1422, 1377, 2332, 1379, 2334,
+ 1378, 2333, 0, 0, 1372, 2341, 1372, 1379, 1378, 2342,
+
+ 1534, 1372, 0, 0, 1372, 1381, 1381, 1381, 1381, 1382,
+ 1382, 1382, 1382, 1379, 2344, 1588, 1588, 1588, 1588, 1422,
+ 2347, 1379, 2352, 2342, 0, 1382, 1383, 1383, 1383, 1383,
+ 0, 1588, 1385, 1385, 1385, 1385, 1381, 2382, 2344, 2447,
+ 1382, 0, 1383, 1422, 2347, 1381, 2352, 1382, 1385, 1382,
+ 2354, 0, 1384, 1384, 1384, 1384, 1588, 1383, 0, 0,
+ 0, 1381, 2382, 1385, 2447, 1382, 1383, 1383, 1384, 1381,
+ 2383, 1382, 1385, 1382, 2354, 1385, 1389, 1389, 1389, 1389,
+ 1588, 1384, 1383, 1384, 1387, 1387, 1387, 1387, 1385, 2343,
+ 1383, 1383, 1384, 2464, 2383, 2343, 1385, 0, 2343, 1385,
+
+ 1387, 1388, 1388, 1388, 1388, 1389, 1384, 2392, 1384, 1628,
+ 1628, 1628, 1628, 1389, 2343, 1387, 1384, 1388, 2464, 2343,
+ 1628, 1387, 2343, 2396, 1387, 0, 1515, 1515, 1515, 1515,
+ 1389, 2392, 1388, 1394, 1394, 1394, 1394, 1389, 1388, 2436,
+ 1387, 1388, 1515, 2438, 0, 1387, 0, 2396, 1387, 1394,
+ 1393, 1393, 1393, 1393, 2448, 1515, 0, 1388, 1469, 1469,
+ 1469, 1469, 1388, 2436, 1394, 1388, 1393, 2438, 1396, 1396,
+ 1396, 1396, 2449, 1394, 0, 0, 1394, 0, 2448, 1393,
+ 1515, 1393, 0, 0, 1396, 1397, 1397, 1397, 1397, 1394,
+ 1393, 1398, 1398, 1398, 1398, 1469, 2449, 1394, 2380, 1396,
+
+ 1394, 1397, 2450, 2465, 1393, 1396, 1393, 2380, 1396, 0,
+ 1507, 1507, 1507, 1507, 1393, 0, 1397, 2473, 0, 1469,
+ 1398, 0, 1397, 2380, 1396, 1397, 2450, 2465, 1398, 1396,
+ 1507, 2380, 1396, 1401, 1401, 1401, 1401, 1402, 1402, 1402,
+ 1402, 1397, 2473, 2474, 2478, 1398, 1397, 0, 1507, 1397,
+ 0, 2476, 1398, 1402, 2477, 1403, 1403, 1403, 1403, 1405,
+ 1405, 1405, 1405, 2479, 1401, 0, 1401, 2474, 1402, 2478,
+ 2521, 1403, 1507, 1401, 1402, 2476, 2522, 1402, 2477, 0,
+ 1481, 1481, 1481, 1481, 1405, 2516, 1403, 2479, 2523, 1401,
+ 1405, 1401, 1403, 1402, 2521, 1403, 2524, 1401, 1402, 1405,
+
+ 2522, 1402, 1408, 1408, 1408, 1408, 0, 0, 2551, 1405,
+ 2516, 1403, 0, 2523, 2552, 1405, 1403, 1481, 1408, 1403,
+ 2524, 2565, 0, 1405, 1492, 1492, 1492, 1492, 1409, 1409,
+ 1409, 1409, 2551, 1408, 1410, 1410, 1410, 1410, 2552, 0,
+ 1408, 1481, 1408, 2566, 1409, 2565, 1411, 1411, 1411, 1411,
+ 1410, 2573, 0, 0, 1522, 1522, 1522, 1522, 1408, 1409,
+ 0, 1492, 1411, 1410, 1408, 1410, 1408, 2566, 1409, 1409,
+ 1522, 2574, 2575, 2576, 1410, 2601, 2573, 1411, 1413, 1413,
+ 1413, 1413, 0, 1522, 1409, 1492, 1411, 2606, 1410, 1411,
+ 1410, 2620, 1409, 1409, 1413, 2574, 2575, 2576, 1410, 2601,
+
+ 0, 2607, 1411, 0, 1414, 1414, 1414, 1414, 1522, 1413,
+ 1411, 2633, 2606, 1411, 2608, 1413, 2620, 0, 1413, 0,
+ 1414, 1419, 1419, 1419, 1419, 2607, 2642, 1420, 1420, 1420,
+ 1420, 2621, 2634, 2640, 1413, 1414, 2633, 0, 2608, 1413,
+ 0, 1414, 1413, 1420, 1414, 0, 0, 1421, 1421, 1421,
+ 1421, 2642, 1419, 0, 1419, 2621, 2634, 2640, 1420, 0,
+ 1414, 1419, 2643, 1421, 1420, 1414, 2652, 1420, 1414, 1423,
+ 1423, 1423, 1423, 1424, 1424, 1424, 1424, 1419, 1421, 1419,
+ 0, 2659, 2661, 1420, 1421, 1419, 2643, 1421, 1420, 0,
+ 2652, 1420, 1428, 1428, 1428, 1428, 1423, 2702, 1424, 2706,
+
+ 1423, 0, 2681, 1421, 1424, 2659, 2696, 2661, 1421, 1423,
+ 2728, 1421, 1428, 1424, 1431, 1431, 1431, 1431, 0, 0,
+ 0, 1423, 2702, 1424, 2706, 1423, 2681, 0, 0, 1424,
+ 2696, 1428, 0, 1423, 1431, 2728, 2707, 1424, 1648, 1648,
+ 1648, 1648, 1538, 1538, 1538, 1538, 0, 0, 0, 1500,
+ 1500, 1500, 1500, 1431, 0, 1428, 1429, 1429, 1429, 1429,
+ 2707, 1429, 0, 0, 0, 1435, 1435, 1435, 1435, 1429,
+ 1429, 1538, 1429, 1429, 1429, 0, 1429, 1431, 1429, 1429,
+ 1429, 1435, 1436, 1436, 1436, 1436, 1500, 1620, 1620, 1620,
+ 1620, 2732, 1435, 2733, 1435, 0, 1538, 2739, 1436, 1440,
+
+ 1440, 1440, 1440, 1435, 1441, 1441, 1441, 1441, 2742, 1436,
+ 1500, 1436, 2744, 2753, 0, 1440, 2732, 1435, 2733, 1435,
+ 1441, 2759, 2739, 1436, 1620, 2760, 0, 1435, 0, 2761,
+ 1440, 0, 2767, 2742, 1436, 1441, 1436, 2744, 2753, 1440,
+ 1448, 1448, 1448, 1448, 1441, 2771, 2759, 1436, 1620, 2760,
+ 1449, 1449, 1449, 1449, 2761, 1440, 1448, 2767, 0, 0,
+ 1441, 2772, 2785, 1440, 0, 2774, 1449, 2782, 1441, 2786,
+ 2771, 1448, 1453, 1453, 1453, 1453, 1454, 1454, 1454, 1454,
+ 1448, 1449, 1461, 1461, 1461, 1461, 2772, 2785, 1453, 2774,
+ 1449, 2782, 1454, 2786, 0, 2796, 1448, 2809, 1461, 1453,
+
+ 2805, 1453, 0, 1454, 1448, 1454, 1449, 0, 2813, 1454,
+ 0, 1453, 0, 1461, 1449, 1455, 1455, 1455, 1455, 1461,
+ 2796, 2809, 1461, 0, 1453, 2805, 1453, 0, 1454, 0,
+ 1454, 1455, 2813, 0, 1454, 1453, 0, 0, 1461, 0,
+ 0, 0, 1455, 1461, 1455, 0, 1461, 1462, 1462, 1462,
+ 1462, 1463, 1463, 1463, 1463, 0, 0, 0, 1455, 1467,
+ 1467, 1467, 1467, 1462, 0, 0, 0, 1455, 0, 1455,
+ 1468, 1468, 1468, 1468, 0, 1467, 0, 0, 1462, 0,
+ 1463, 0, 1455, 0, 1462, 0, 1468, 1462, 1463, 0,
+ 1467, 1631, 1631, 1631, 1631, 0, 1467, 0, 0, 1467,
+
+ 0, 1468, 1631, 1462, 0, 1463, 0, 1468, 1462, 0,
+ 1468, 1462, 1463, 0, 0, 1467, 1472, 1472, 1472, 1472,
+ 1467, 0, 0, 1467, 0, 0, 1468, 1587, 1587, 1587,
+ 1587, 1468, 1472, 0, 1468, 1473, 1473, 1473, 1473, 1646,
+ 1646, 1646, 1646, 1587, 0, 1472, 0, 1472, 0, 0,
+ 1646, 1473, 1474, 1474, 1474, 1474, 1472, 1475, 1475, 1475,
+ 1475, 1633, 1633, 1633, 1633, 1587, 1473, 0, 1474, 0,
+ 1472, 0, 1472, 1475, 0, 1473, 0, 0, 1473, 0,
+ 1472, 0, 0, 1474, 1483, 1483, 1483, 1483, 1475, 1587,
+ 0, 1473, 1474, 1474, 1475, 0, 0, 1475, 1633, 1473,
+
+ 1483, 0, 1473, 0, 1484, 1484, 1484, 1484, 1474, 1658,
+ 1658, 1658, 1658, 1475, 0, 1483, 1474, 1474, 1475, 0,
+ 1484, 1475, 1633, 0, 1483, 1483, 1488, 1488, 1488, 1488,
+ 1489, 1489, 1489, 1489, 0, 1484, 1490, 1490, 1490, 1490,
+ 1483, 1484, 0, 0, 1484, 0, 0, 0, 1483, 1483,
+ 0, 0, 0, 1488, 0, 1489, 0, 1488, 0, 0,
+ 1484, 1489, 0, 0, 0, 1484, 1488, 1490, 1484, 0,
+ 1489, 0, 1493, 1493, 1493, 1493, 1490, 0, 1488, 0,
+ 1489, 0, 1488, 0, 0, 0, 1489, 0, 1493, 0,
+ 1488, 0, 1490, 0, 1489, 1812, 1812, 1812, 1812, 0,
+
+ 1490, 1493, 0, 1493, 1494, 1494, 1494, 1494, 1495, 1495,
+ 1495, 1495, 1493, 0, 1496, 1496, 1496, 1496, 0, 0,
+ 1494, 0, 0, 0, 1495, 0, 1493, 0, 1493, 0,
+ 1496, 1685, 1685, 1685, 1685, 1494, 1493, 0, 0, 1495,
+ 0, 0, 1685, 0, 1494, 1496, 0, 1494, 1495, 1495,
+ 0, 1496, 0, 0, 1496, 1501, 1501, 1501, 1501, 0,
+ 1494, 0, 0, 0, 1495, 0, 0, 0, 1494, 0,
+ 1496, 1494, 1495, 1495, 0, 1496, 0, 0, 1496, 0,
+ 0, 0, 1501, 0, 0, 0, 1501, 1502, 1502, 1502,
+ 1502, 1503, 1503, 1503, 1503, 1501, 1511, 1511, 1511, 1511,
+
+ 0, 1593, 1593, 1593, 1593, 0, 0, 1501, 0, 0,
+ 0, 1501, 1511, 1512, 1512, 1512, 1512, 1593, 1502, 1501,
+ 0, 0, 1503, 1511, 0, 1511, 0, 1502, 0, 1512,
+ 0, 1503, 0, 1516, 1516, 1516, 1516, 0, 0, 1593,
+ 1512, 0, 1512, 1502, 0, 0, 0, 1503, 1511, 1516,
+ 1511, 1502, 0, 0, 0, 1503, 1512, 0, 1523, 1523,
+ 1523, 1523, 0, 1593, 0, 1512, 0, 1512, 1698, 1698,
+ 1698, 1698, 1516, 0, 1523, 1527, 1527, 1527, 1527, 1698,
+ 1512, 0, 1618, 1618, 1618, 1618, 0, 1528, 1528, 1528,
+ 1528, 1527, 0, 1618, 0, 0, 1516, 1523, 1817, 1817,
+
+ 1817, 1817, 1527, 1528, 1527, 0, 1529, 1529, 1529, 1529,
+ 0, 1618, 0, 1527, 1528, 0, 1528, 0, 1528, 0,
+ 0, 1523, 1529, 1705, 1705, 1705, 1705, 1527, 0, 1527,
+ 0, 0, 0, 1529, 1705, 1529, 1618, 1527, 0, 1528,
+ 0, 1528, 0, 1528, 0, 1540, 1540, 1540, 1540, 1819,
+ 1819, 1819, 1819, 1529, 1824, 1824, 1824, 1824, 1529, 0,
+ 1529, 1540, 1541, 1541, 1541, 1541, 0, 0, 1584, 1584,
+ 1584, 1584, 1542, 1542, 1542, 1542, 1540, 1529, 1541, 0,
+ 1574, 1574, 1574, 1574, 1584, 1540, 1540, 0, 1542, 0,
+ 0, 1574, 0, 1541, 0, 1584, 0, 1584, 0, 1541,
+
+ 0, 1540, 1541, 1542, 0, 1542, 0, 0, 0, 1540,
+ 1540, 0, 1542, 1543, 1543, 1543, 1543, 1574, 1541, 1574,
+ 1584, 0, 1584, 1541, 0, 0, 1541, 0, 1542, 1543,
+ 1542, 1544, 1544, 1544, 1544, 0, 1542, 1882, 1882, 1882,
+ 1882, 1574, 0, 1574, 1543, 1545, 1545, 1545, 1545, 0,
+ 1543, 0, 0, 1543, 1547, 1547, 1547, 1547, 0, 0,
+ 0, 1545, 1544, 1546, 1546, 1546, 1546, 0, 1544, 1543,
+ 0, 1544, 0, 0, 1543, 0, 1545, 1543, 0, 1546,
+ 0, 0, 1545, 1547, 0, 1545, 0, 1544, 1546, 0,
+ 0, 1547, 1544, 0, 1546, 1544, 1550, 1550, 1550, 1550,
+
+ 0, 1545, 0, 1546, 0, 0, 1545, 1550, 1547, 1545,
+ 0, 0, 0, 1546, 0, 1547, 0, 0, 0, 1546,
+ 1553, 1553, 1553, 1553, 0, 1550, 0, 1546, 0, 0,
+ 1554, 1554, 1554, 1554, 0, 1550, 1553, 1555, 1555, 1555,
+ 1555, 0, 1594, 1594, 1594, 1594, 1554, 0, 0, 0,
+ 1550, 1553, 0, 1553, 2058, 2058, 2058, 2058, 1594, 1550,
+ 1553, 1554, 0, 1558, 1558, 1558, 1558, 1554, 1555, 0,
+ 1554, 0, 0, 0, 1555, 0, 1553, 1555, 1553, 1556,
+ 1556, 1556, 1556, 1594, 1553, 0, 1554, 2106, 2106, 2106,
+ 2106, 1554, 1558, 1555, 1554, 1556, 0, 0, 1555, 0,
+
+ 1558, 1555, 1557, 1557, 1557, 1557, 0, 1594, 0, 0,
+ 1556, 0, 1649, 1649, 1649, 1649, 1556, 1558, 1557, 1556,
+ 1559, 1559, 1559, 1559, 1558, 0, 0, 1557, 0, 0,
+ 0, 1559, 1649, 1557, 0, 1556, 1560, 1560, 1560, 1560,
+ 1556, 0, 1557, 1556, 0, 1643, 1643, 1643, 1643, 1559,
+ 0, 0, 1557, 1561, 1561, 1561, 1561, 0, 1557, 1559,
+ 0, 1642, 1642, 1642, 1642, 0, 1557, 1560, 1562, 1562,
+ 1562, 1562, 1642, 1560, 1559, 0, 1560, 0, 0, 1562,
+ 0, 0, 1643, 1559, 1561, 1564, 1564, 1564, 1564, 0,
+ 0, 0, 1560, 1561, 0, 0, 0, 1560, 1642, 1562,
+
+ 1560, 1564, 1565, 1565, 1565, 1565, 1643, 1562, 1562, 1561,
+ 0, 0, 1566, 1566, 1566, 1566, 1564, 1561, 1565, 0,
+ 0, 0, 1642, 0, 1562, 1564, 1564, 0, 1566, 0,
+ 0, 1562, 1562, 1565, 0, 1626, 1626, 1626, 1626, 1565,
+ 0, 1564, 1565, 1566, 0, 1566, 1626, 0, 0, 1564,
+ 1564, 0, 1566, 1567, 1567, 1567, 1567, 0, 1565, 1652,
+ 1652, 1652, 1652, 1565, 1626, 0, 1565, 0, 1566, 1567,
+ 1566, 1568, 1568, 1568, 1568, 0, 1566, 0, 0, 1652,
+ 1710, 1710, 1710, 1710, 1567, 1569, 1569, 1569, 1569, 1626,
+ 1567, 1710, 0, 1567, 1571, 1571, 1571, 1571, 0, 0,
+
+ 0, 1569, 1568, 1570, 1570, 1570, 1570, 0, 1568, 1567,
+ 0, 1568, 0, 0, 1567, 0, 1569, 1567, 0, 1570,
+ 0, 0, 1569, 1571, 0, 1569, 0, 1568, 1570, 0,
+ 0, 1571, 1568, 0, 1570, 1568, 1572, 1572, 1572, 1572,
+ 0, 1569, 0, 1570, 0, 0, 1569, 1572, 1571, 1569,
+ 0, 0, 0, 1570, 0, 1571, 0, 0, 0, 1570,
+ 0, 1650, 1650, 1650, 1650, 1572, 1650, 1570, 0, 0,
+ 0, 1720, 1720, 1720, 1720, 1572, 0, 0, 1650, 0,
+ 1650, 1650, 0, 1670, 1670, 1670, 1670, 1720, 0, 0,
+ 1572, 2110, 2110, 2110, 2110, 2112, 2112, 2112, 2112, 1572,
+
+ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
+ 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 0, 1579,
+ 1670, 1579, 1579, 1579, 1579, 1579, 1583, 1583, 1583, 1583,
+ 1597, 1597, 1597, 1597, 0, 1598, 1598, 1598, 1598, 0,
+ 0, 0, 1583, 0, 1670, 0, 1597, 0, 0, 1579,
+ 0, 1598, 0, 1583, 0, 1583, 0, 1597, 0, 1597,
+ 0, 0, 1598, 0, 1598, 0, 0, 1583, 0, 1599,
+ 1599, 1599, 1599, 1579, 1579, 0, 0, 0, 1583, 1598,
+ 1583, 0, 1597, 0, 1597, 1599, 0, 1598, 0, 1598,
+ 0, 1583, 2116, 2116, 2116, 2116, 1599, 0, 1599, 1601,
+
+ 1601, 1601, 1601, 1598, 1604, 1604, 1604, 1604, 1605, 1605,
+ 1605, 1605, 0, 0, 0, 1604, 1608, 1608, 1608, 1608,
+ 0, 1599, 0, 1599, 1758, 1758, 1758, 1758, 1601, 0,
+ 0, 0, 1608, 1604, 0, 1758, 1601, 1605, 0, 1607,
+ 1607, 1607, 1607, 1604, 0, 1605, 0, 1608, 0, 1608,
+ 1607, 0, 0, 1601, 0, 0, 1608, 0, 1604, 0,
+ 1601, 0, 1605, 1609, 1609, 1609, 1609, 1604, 1607, 1605,
+ 0, 0, 1608, 0, 1608, 0, 0, 0, 1607, 1609,
+ 1608, 1610, 1610, 1610, 1610, 1611, 1611, 1611, 1611, 2186,
+ 2186, 2186, 2186, 1607, 1609, 0, 1678, 1678, 1678, 1678,
+
+ 1609, 1611, 1607, 1609, 1612, 1612, 1612, 1612, 2212, 2212,
+ 2212, 2212, 1610, 0, 0, 0, 1611, 0, 1610, 1609,
+ 1612, 1610, 1611, 0, 1609, 1611, 0, 1609, 0, 0,
+ 0, 1612, 0, 1678, 0, 1612, 0, 1610, 0, 0,
+ 0, 1611, 1610, 0, 1612, 1610, 1611, 0, 0, 1611,
+ 1613, 1613, 1613, 1613, 0, 0, 1612, 1678, 0, 0,
+ 1612, 0, 1615, 1615, 1615, 1615, 1613, 0, 1612, 2297,
+ 2297, 2297, 2297, 1615, 0, 0, 0, 1616, 1616, 1616,
+ 1616, 1613, 0, 0, 1617, 1617, 1617, 1617, 1616, 0,
+ 1613, 1615, 0, 1616, 0, 1617, 1623, 1623, 1623, 1623,
+
+ 1617, 1615, 1896, 1896, 1896, 1896, 1613, 0, 1616, 0,
+ 0, 0, 1623, 1896, 1613, 1617, 1615, 1616, 1622, 1622,
+ 1622, 1622, 0, 0, 1617, 1615, 0, 1623, 1624, 1624,
+ 1624, 1624, 0, 1616, 1622, 0, 1623, 0, 0, 1624,
+ 1617, 1616, 0, 0, 1624, 1622, 0, 0, 1617, 1622,
+ 0, 0, 1623, 1736, 1736, 1736, 1736, 0, 1622, 1624,
+ 1623, 0, 1625, 1625, 1625, 1625, 0, 0, 1624, 1736,
+ 1622, 0, 0, 1625, 1622, 0, 0, 0, 1625, 0,
+ 0, 0, 1622, 0, 1624, 1629, 1629, 1629, 1629, 0,
+ 0, 0, 1624, 1625, 0, 0, 1629, 1630, 1630, 1630,
+
+ 1630, 1629, 1625, 1693, 1693, 1693, 1693, 0, 1630, 2090,
+ 2090, 2090, 2090, 1630, 1693, 0, 1629, 0, 1625, 1634,
+ 1634, 1634, 1634, 0, 0, 1629, 1625, 0, 1630, 1635,
+ 1635, 1635, 1635, 0, 0, 1634, 0, 1630, 0, 0,
+ 1693, 1629, 0, 0, 0, 1635, 2090, 0, 0, 1629,
+ 1634, 0, 1634, 1630, 0, 1636, 1636, 1636, 1636, 1634,
+ 1635, 1630, 0, 0, 1693, 0, 1635, 0, 0, 1635,
+ 2090, 1667, 1667, 1667, 1667, 1634, 0, 1634, 1637, 1637,
+ 1637, 1637, 0, 1634, 0, 1635, 1636, 1667, 0, 0,
+ 1635, 0, 1636, 1635, 1637, 1636, 1638, 1638, 1638, 1638,
+
+ 1667, 1639, 1639, 1639, 1639, 1742, 1742, 1742, 1742, 1637,
+ 0, 1636, 1638, 0, 0, 1637, 1636, 1639, 1637, 1636,
+ 0, 1742, 0, 1638, 0, 1667, 0, 1638, 2346, 2346,
+ 2346, 2346, 1639, 0, 1637, 0, 1638, 0, 0, 1637,
+ 0, 1639, 1637, 1640, 1640, 1640, 1640, 0, 1638, 0,
+ 0, 0, 1638, 0, 1640, 0, 0, 1639, 0, 1640,
+ 1638, 1641, 1641, 1641, 1641, 1639, 1660, 1660, 1660, 1660,
+ 0, 0, 1641, 0, 1640, 0, 0, 1641, 1644, 1644,
+ 1644, 1644, 1660, 1640, 1645, 1645, 1645, 1645, 0, 1644,
+ 0, 0, 1641, 0, 1644, 1645, 0, 1660, 0, 1640,
+
+ 1645, 1641, 0, 1660, 0, 0, 1660, 1640, 0, 1644,
+ 1871, 1871, 1871, 1871, 0, 1645, 0, 1641, 1644, 0,
+ 0, 0, 1660, 0, 1645, 1641, 1871, 1660, 0, 0,
+ 1660, 0, 0, 0, 1644, 2351, 2351, 2351, 2351, 0,
+ 1645, 0, 1644, 0, 1666, 1666, 1666, 1666, 1645, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 0, 1653, 0,
+ 1653, 1653, 1653, 1653, 1653, 1666, 1876, 1876, 1876, 1876,
+ 0, 1666, 0, 0, 1666, 1898, 1898, 1898, 1898, 0,
+ 0, 0, 1876, 0, 0, 0, 1898, 0, 1653, 0,
+
+ 1666, 1901, 1901, 1901, 1901, 1666, 0, 0, 1666, 0,
+ 0, 0, 1901, 2353, 2353, 2353, 2353, 2358, 2358, 2358,
+ 2358, 0, 1653, 1653, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1659,
+
+ 1659, 1659, 1659, 1661, 1661, 1661, 1661, 1902, 1902, 1902,
+ 1902, 1668, 1668, 1668, 1668, 1659, 0, 0, 1902, 1661,
+ 0, 1664, 1664, 1664, 1664, 0, 1659, 1668, 1659, 0,
+ 0, 0, 1659, 0, 1661, 0, 0, 1664, 0, 0,
+ 1661, 0, 0, 1661, 0, 0, 0, 1675, 1675, 1675,
+ 1675, 1659, 1664, 1659, 1668, 0, 0, 1659, 1664, 1661,
+ 0, 1664, 0, 1675, 1661, 0, 0, 1661, 1662, 1662,
+ 1662, 1662, 1665, 1665, 1665, 1665, 1675, 1664, 1668, 0,
+ 0, 0, 1664, 0, 1662, 1664, 0, 0, 1665, 0,
+ 1672, 1672, 1672, 1672, 0, 1662, 0, 1662, 0, 1662,
+
+ 0, 1675, 0, 1665, 0, 1662, 1672, 0, 1662, 1665,
+ 0, 0, 1665, 0, 0, 1676, 1676, 1676, 1676, 0,
+ 1662, 1672, 1662, 0, 1662, 0, 0, 1672, 1665, 1662,
+ 1672, 1676, 1662, 1665, 0, 0, 1665, 1673, 1673, 1673,
+ 1673, 1674, 1674, 1674, 1674, 0, 1672, 2437, 2437, 2437,
+ 2437, 1672, 0, 1673, 1672, 0, 0, 0, 1676, 1689,
+ 1689, 1689, 1689, 1680, 1680, 1680, 1680, 0, 1673, 0,
+ 1689, 0, 1674, 0, 1673, 0, 0, 1673, 1674, 1680,
+ 0, 1674, 1676, 1679, 1679, 1679, 1679, 0, 1689, 0,
+ 1680, 0, 1680, 1673, 0, 0, 0, 1674, 1673, 1679,
+
+ 0, 1673, 1674, 0, 1680, 1674, 1945, 1945, 1945, 1945,
+ 1679, 0, 1679, 1689, 0, 1680, 0, 1680, 0, 0,
+ 0, 1679, 1945, 1735, 1735, 1735, 1735, 0, 1680, 1702,
+ 1702, 1702, 1702, 0, 0, 1679, 0, 1679, 0, 1735,
+ 1702, 2609, 2609, 2609, 2609, 1679, 1681, 1681, 1681, 1681,
+ 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1702, 0,
+ 1681, 1681, 1681, 1681, 1735, 1681, 0, 1681, 1681, 1681,
+ 1681, 1681, 0, 0, 1741, 1741, 1741, 1741, 1681, 2721,
+ 2721, 2721, 2721, 1702, 0, 0, 0, 1681, 1735, 0,
+ 1741, 1971, 1971, 1971, 1971, 1681, 1948, 1948, 1948, 1948,
+
+ 0, 0, 1971, 1681, 0, 1761, 1761, 1761, 1761, 0,
+ 0, 1681, 1948, 0, 0, 1741, 1761, 0, 0, 1681,
+ 1681, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 0, 1761, 1682, 1682, 1682, 1682, 1741,
+ 1682, 0, 1682, 1682, 1682, 1682, 1682, 1953, 1953, 1953,
+ 1953, 0, 0, 1682, 0, 1956, 1956, 1956, 1956, 1761,
+ 0, 0, 1682, 1953, 1980, 1980, 1980, 1980, 0, 0,
+ 1682, 1956, 1982, 1982, 1982, 1982, 0, 0, 1682, 0,
+ 1980, 0, 0, 1982, 0, 0, 1682, 2773, 2773, 2773,
+ 2773, 0, 0, 0, 1682, 1682, 1683, 1683, 1683, 1683,
+
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
+ 1683, 1686, 1686, 1686, 1686, 1687, 1687, 1687, 1687, 0,
+ 0, 0, 1686, 0, 0, 0, 1687, 1688, 1688, 1688,
+ 1688, 1687, 0, 1690, 1690, 1690, 1690, 0, 1688, 0,
+
+ 1686, 0, 0, 1688, 1690, 0, 1687, 0, 0, 0,
+ 1686, 0, 0, 0, 0, 1687, 0, 0, 1688, 0,
+ 0, 0, 1690, 0, 0, 1686, 0, 1688, 0, 0,
+ 0, 1687, 1690, 0, 1686, 2403, 2403, 2403, 2403, 1687,
+ 0, 0, 0, 1688, 0, 0, 2403, 1690, 0, 0,
+ 0, 1688, 1691, 1691, 1691, 1691, 1690, 0, 1692, 1692,
+ 1692, 1692, 0, 1691, 1981, 1981, 1981, 1981, 1691, 1692,
+ 1695, 1695, 1695, 1695, 1692, 1694, 1694, 1694, 1694, 0,
+ 1981, 0, 0, 1691, 0, 0, 1695, 0, 0, 1692,
+ 0, 1694, 1691, 0, 0, 1695, 0, 0, 1692, 0,
+
+ 0, 1695, 1694, 0, 1981, 0, 1694, 0, 1691, 0,
+ 1695, 0, 0, 0, 1692, 1694, 1691, 0, 0, 0,
+ 1695, 0, 1692, 0, 0, 0, 1695, 1694, 1981, 0,
+ 0, 1694, 0, 0, 1695, 1696, 1696, 1696, 1696, 1694,
+ 0, 0, 1700, 1700, 1700, 1700, 1986, 1986, 1986, 1986,
+ 0, 1696, 0, 1700, 1701, 1701, 1701, 1701, 1700, 0,
+ 0, 0, 1986, 0, 0, 1701, 1696, 0, 0, 0,
+ 1701, 0, 1696, 1700, 0, 1696, 0, 1706, 1706, 1706,
+ 1706, 0, 1700, 0, 0, 1701, 1764, 1764, 1764, 1764,
+ 0, 1696, 0, 1706, 1701, 0, 1696, 1764, 1700, 1696,
+
+ 1697, 1697, 1697, 1697, 0, 0, 1700, 0, 1706, 0,
+ 1701, 1697, 0, 0, 1706, 0, 1697, 1706, 1701, 1708,
+ 1708, 1708, 1708, 1764, 0, 2410, 2410, 2410, 2410, 0,
+ 1708, 1697, 0, 1706, 0, 1708, 2410, 0, 1706, 1697,
+ 1697, 1706, 1709, 1709, 1709, 1709, 0, 1764, 0, 0,
+ 1708, 0, 0, 1709, 0, 0, 1697, 0, 1709, 1708,
+ 0, 0, 0, 1697, 1697, 1707, 1707, 1707, 1707, 0,
+ 0, 0, 0, 1709, 0, 1708, 1707, 1713, 1713, 1713,
+ 1713, 1707, 1709, 1708, 1712, 1712, 1712, 1712, 1975, 1975,
+ 1975, 1975, 0, 1713, 0, 0, 1707, 0, 1709, 1975,
+
+ 1712, 0, 1713, 0, 1707, 1707, 1709, 0, 1713, 0,
+ 0, 1712, 0, 0, 0, 1712, 0, 1713, 0, 0,
+ 0, 1707, 0, 0, 1712, 1975, 0, 1713, 1707, 1707,
+ 0, 0, 0, 1713, 0, 0, 1712, 0, 0, 0,
+ 1712, 1713, 1714, 1714, 1714, 1714, 0, 0, 1712, 1975,
+ 0, 0, 0, 0, 1814, 1814, 1814, 1814, 1714, 1722,
+ 1722, 1722, 1722, 0, 0, 1723, 1723, 1723, 1723, 0,
+ 1814, 0, 0, 1714, 0, 1722, 0, 0, 0, 1714,
+ 0, 1723, 1714, 0, 0, 0, 1722, 1814, 1722, 0,
+ 0, 0, 1723, 0, 1723, 0, 0, 0, 1714, 2037,
+
+ 2037, 2037, 2037, 1714, 1723, 0, 1714, 1715, 1715, 1715,
+ 1715, 1722, 1814, 1722, 0, 2037, 0, 1723, 1715, 1723,
+ 0, 0, 0, 1715, 1730, 1730, 1730, 1730, 1723, 1724,
+ 1724, 1724, 1724, 0, 1900, 1900, 1900, 1900, 1715, 0,
+ 1730, 1899, 1899, 1899, 1899, 1724, 1715, 1715, 0, 0,
+ 1900, 1730, 0, 1730, 0, 0, 1724, 1899, 1724, 1900,
+ 0, 0, 0, 1715, 0, 0, 0, 1724, 1899, 0,
+ 1715, 1715, 1717, 1717, 1717, 1717, 1730, 1717, 1730, 0,
+ 0, 1724, 0, 1724, 1900, 1717, 1717, 0, 1717, 1717,
+ 1717, 1724, 1717, 1899, 1717, 1717, 1717, 1719, 1719, 1719,
+
+ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 0,
+ 0, 1719, 1719, 1719, 1719, 0, 1719, 0, 1719, 1719,
+ 1719, 1719, 1719, 0, 0, 1719, 0, 1719, 1727, 1727,
+ 1727, 1727, 1821, 1821, 1821, 1821, 0, 2044, 2044, 2044,
+ 2044, 0, 0, 0, 1727, 0, 1719, 0, 1821, 0,
+ 1719, 0, 1719, 2044, 0, 2451, 2451, 2451, 2451, 1727,
+ 0, 0, 0, 0, 0, 1821, 2451, 0, 1727, 0,
+ 1719, 1719, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1727, 0, 1721, 1721, 1721, 1721,
+ 1821, 1721, 1727, 1721, 1721, 1721, 1721, 1721, 1728, 1728,
+
+ 1728, 1728, 0, 1732, 1732, 1732, 1732, 1783, 1783, 1783,
+ 1783, 0, 0, 0, 1728, 2128, 2128, 2128, 2128, 1732,
+ 0, 1721, 0, 1903, 1903, 1903, 1903, 0, 1732, 1728,
+ 1732, 0, 1732, 0, 1783, 0, 1783, 0, 1728, 1903,
+ 2059, 2059, 2059, 2059, 0, 1721, 1721, 0, 0, 0,
+ 1903, 2059, 2128, 1732, 1728, 1732, 2059, 1732, 0, 1783,
+ 0, 1783, 1728, 1729, 1729, 1729, 1729, 1729, 1729, 1729,
+ 1729, 1729, 1729, 1729, 1729, 1903, 2128, 1729, 1729, 1729,
+ 1729, 0, 1729, 0, 1729, 1729, 1729, 1729, 1729, 1744,
+ 1744, 1744, 1744, 0, 0, 1729, 0, 1745, 1745, 1745,
+
+ 1745, 0, 0, 0, 1729, 1744, 0, 2135, 2135, 2135,
+ 2135, 0, 1729, 1745, 0, 0, 1744, 0, 1744, 0,
+ 1729, 0, 1745, 2135, 1745, 0, 1745, 0, 1729, 0,
+ 0, 0, 1744, 0, 0, 0, 1729, 1729, 0, 0,
+ 0, 1744, 0, 1744, 0, 0, 0, 1745, 0, 1745,
+ 0, 1745, 1748, 1748, 1748, 1748, 1744, 1749, 1749, 1749,
+ 1749, 0, 0, 0, 1750, 1750, 1750, 1750, 1748, 1752,
+ 1752, 1752, 1752, 1749, 0, 1751, 1751, 1751, 1751, 0,
+ 1750, 0, 0, 1748, 0, 1752, 0, 0, 1749, 0,
+ 0, 1751, 1748, 1750, 0, 1750, 0, 1749, 0, 0,
+
+ 1752, 0, 0, 0, 1750, 0, 1751, 0, 1748, 1752,
+ 0, 0, 0, 1749, 1751, 1751, 1748, 0, 1750, 0,
+ 1750, 1749, 0, 0, 0, 1752, 0, 0, 1750, 0,
+ 0, 1751, 0, 1752, 2150, 2150, 2150, 2150, 1751, 1751,
+ 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753,
+ 1753, 1753, 0, 0, 1753, 1753, 1753, 1753, 0, 1753,
+ 0, 1753, 1753, 1753, 1753, 1753, 0, 1754, 1754, 1754,
+ 1754, 2150, 1753, 2165, 2165, 2165, 2165, 0, 0, 0,
+ 0, 1753, 0, 1754, 0, 1756, 1756, 1756, 1756, 1753,
+ 1755, 1755, 1755, 1755, 0, 2150, 0, 1753, 1754, 0,
+
+ 0, 1756, 0, 0, 0, 1753, 1755, 1754, 0, 0,
+ 2165, 0, 0, 1753, 1753, 0, 1756, 0, 0, 1755,
+ 0, 1755, 0, 1754, 1756, 1756, 1759, 1759, 1759, 1759,
+ 1755, 1754, 0, 0, 2165, 0, 0, 1759, 0, 0,
+ 0, 1756, 1759, 0, 1755, 0, 1755, 0, 1756, 1756,
+ 0, 0, 0, 0, 1755, 0, 0, 1759, 1760, 1760,
+ 1760, 1760, 1762, 1762, 1762, 1762, 1759, 0, 0, 1760,
+ 0, 0, 0, 1762, 1760, 0, 0, 0, 1762, 0,
+ 0, 0, 1759, 0, 1763, 1763, 1763, 1763, 0, 1760,
+ 1759, 0, 0, 1762, 0, 1763, 0, 0, 1760, 0,
+
+ 1763, 0, 1762, 0, 1765, 1765, 1765, 1765, 0, 2035,
+ 2035, 2035, 2035, 0, 1760, 1763, 0, 0, 1762, 0,
+ 1765, 0, 1760, 0, 1763, 2035, 1762, 1766, 1766, 1766,
+ 1766, 1767, 1767, 1767, 1767, 1765, 0, 0, 2035, 0,
+ 1763, 1765, 1767, 1766, 1765, 0, 0, 1767, 1763, 0,
+ 1768, 1768, 1768, 1768, 1770, 1770, 1770, 1770, 1766, 0,
+ 1765, 1768, 1767, 2035, 0, 1765, 0, 1766, 1765, 0,
+ 1770, 1767, 0, 1769, 1769, 1769, 1769, 1771, 1771, 1771,
+ 1771, 1768, 0, 1766, 1769, 1770, 0, 1767, 1771, 1769,
+ 1768, 1766, 0, 1771, 1770, 1767, 1772, 1772, 1772, 1772,
+
+ 1773, 1773, 1773, 1773, 1769, 0, 1768, 1772, 1771, 0,
+ 1770, 1773, 0, 1769, 1768, 0, 1773, 1771, 1770, 1774,
+ 1774, 1774, 1774, 1987, 1987, 1987, 1987, 1772, 0, 1769,
+ 0, 1773, 0, 1771, 0, 1774, 1772, 1769, 0, 1987,
+ 1773, 1771, 1775, 1775, 1775, 1775, 1776, 1776, 1776, 1776,
+ 1774, 0, 1772, 0, 0, 0, 1773, 0, 1775, 1774,
+ 1772, 0, 1776, 1987, 1773, 1777, 1777, 1777, 1777, 1778,
+ 1778, 1778, 1778, 1775, 0, 1774, 1777, 1776, 0, 1775,
+ 1778, 1777, 1775, 1774, 0, 0, 1776, 1987, 1779, 1779,
+ 1779, 1779, 1780, 1780, 1780, 1780, 1777, 0, 1775, 1779,
+
+ 1778, 0, 1776, 1775, 1779, 1777, 1775, 0, 1780, 1778,
+ 1776, 0, 0, 0, 2042, 2042, 2042, 2042, 0, 1779,
+ 0, 1777, 0, 1780, 0, 1778, 0, 0, 1779, 1777,
+ 2042, 0, 1780, 1778, 1825, 1825, 1825, 1825, 1786, 1786,
+ 1786, 1786, 0, 2042, 1779, 0, 0, 0, 1780, 0,
+ 1825, 0, 1779, 0, 1786, 0, 1780, 1782, 1782, 1782,
+ 1782, 1825, 1782, 1825, 0, 0, 0, 0, 2042, 1786,
+ 1782, 1782, 0, 1782, 1782, 1782, 0, 1782, 1786, 1782,
+ 1782, 1782, 1788, 1788, 1788, 1788, 1825, 0, 1825, 1806,
+ 1806, 1806, 1806, 0, 1786, 0, 0, 0, 1788, 0,
+
+ 0, 0, 1786, 1787, 1787, 1787, 1787, 0, 1790, 1790,
+ 1790, 1790, 0, 1788, 0, 2138, 2138, 2138, 2138, 1787,
+ 1806, 0, 1788, 0, 1790, 1791, 1791, 1791, 1791, 1806,
+ 1787, 2138, 1787, 0, 1787, 0, 0, 0, 1788, 1790,
+ 0, 1791, 0, 1787, 0, 1806, 1788, 0, 1790, 0,
+ 0, 0, 0, 1806, 0, 1787, 1791, 1787, 0, 1787,
+ 1794, 1794, 1794, 1794, 1790, 1791, 0, 1787, 1798, 1798,
+ 1798, 1798, 1790, 0, 0, 0, 1794, 1795, 1795, 1795,
+ 1795, 1791, 0, 0, 1798, 2060, 2060, 2060, 2060, 1791,
+ 0, 1794, 0, 1795, 0, 1798, 2060, 1798, 0, 0,
+
+ 1794, 2060, 0, 1826, 1826, 1826, 1826, 0, 1795, 0,
+ 0, 1798, 2328, 2328, 2328, 2328, 1794, 1795, 0, 1826,
+ 1798, 0, 1798, 2328, 1794, 1811, 1811, 1811, 1811, 0,
+ 1826, 0, 1826, 1795, 0, 1798, 1801, 1801, 1801, 1801,
+ 0, 1795, 1796, 1796, 1796, 1796, 1826, 1802, 1802, 1802,
+ 1802, 2328, 1801, 0, 0, 1826, 1811, 1826, 1796, 0,
+ 0, 0, 1811, 1802, 0, 1811, 0, 1801, 0, 1796,
+ 1826, 1796, 0, 1796, 0, 2328, 1801, 0, 1802, 0,
+ 0, 1811, 1796, 0, 0, 0, 1811, 1802, 0, 1811,
+ 0, 0, 1801, 0, 1796, 0, 1796, 0, 1796, 0,
+
+ 1801, 0, 0, 1802, 0, 0, 1796, 1797, 1797, 1797,
+ 1797, 1802, 0, 0, 0, 1803, 1803, 1803, 1803, 2108,
+ 2108, 2108, 2108, 1797, 0, 0, 0, 1804, 1804, 1804,
+ 1804, 1803, 0, 0, 1797, 2108, 1797, 2036, 2036, 2036,
+ 2036, 0, 0, 1804, 1797, 1797, 1803, 1805, 1805, 1805,
+ 1805, 0, 0, 2036, 0, 1803, 1804, 0, 1804, 1797,
+ 2108, 1797, 0, 1805, 0, 0, 0, 1804, 1797, 1797,
+ 0, 1803, 2114, 2114, 2114, 2114, 2036, 0, 1805, 1803,
+ 0, 1804, 0, 1804, 2108, 0, 1805, 1805, 2114, 0,
+ 0, 1804, 1815, 1815, 1815, 1815, 1816, 1816, 1816, 1816,
+
+ 2036, 0, 0, 1805, 0, 0, 0, 0, 1815, 0,
+ 1805, 1805, 1816, 2114, 1822, 1822, 1822, 1822, 1823, 1823,
+ 1823, 1823, 0, 1815, 0, 0, 0, 1816, 0, 1815,
+ 1822, 0, 1815, 1816, 1823, 0, 1816, 2114, 0, 2176,
+ 2176, 2176, 2176, 0, 0, 1822, 0, 0, 1815, 1823,
+ 0, 1822, 1816, 1815, 1822, 1823, 1815, 1816, 1823, 0,
+ 1816, 1827, 1827, 1827, 1827, 1828, 1828, 1828, 1828, 0,
+ 1822, 0, 0, 0, 1823, 1822, 2176, 1827, 1822, 1823,
+ 0, 1828, 1823, 1829, 1829, 1829, 1829, 1831, 1831, 1831,
+ 1831, 0, 1827, 0, 0, 0, 1828, 0, 0, 1829,
+
+ 2176, 1827, 0, 1831, 0, 1828, 1832, 1832, 1832, 1832,
+ 2043, 2043, 2043, 2043, 1829, 0, 1831, 1827, 1831, 0,
+ 0, 1828, 1832, 1829, 0, 1827, 2043, 1831, 0, 1828,
+ 0, 0, 1833, 1833, 1833, 1833, 0, 1832, 0, 1829,
+ 0, 1831, 0, 1831, 0, 1832, 1832, 1829, 1833, 2043,
+ 0, 1831, 1834, 1834, 1834, 1834, 0, 0, 1835, 1835,
+ 1835, 1835, 1832, 1833, 1837, 1837, 1837, 1837, 1834, 1832,
+ 1832, 0, 1833, 2043, 1835, 2269, 2269, 2269, 2269, 0,
+ 1837, 0, 0, 1834, 1838, 1838, 1838, 1838, 1833, 1835,
+ 0, 2269, 1834, 1837, 0, 1837, 1833, 0, 1835, 0,
+
+ 1838, 0, 0, 0, 1837, 0, 0, 0, 1834, 0,
+ 1840, 1840, 1840, 1840, 1835, 1838, 1834, 0, 1837, 0,
+ 1837, 0, 1835, 1838, 1838, 0, 1840, 0, 1837, 1839,
+ 1839, 1839, 1839, 1841, 1841, 1841, 1841, 0, 0, 0,
+ 1838, 1840, 0, 0, 0, 1839, 0, 1838, 1838, 1841,
+ 1840, 1840, 1842, 1842, 1842, 1842, 1843, 1843, 1843, 1843,
+ 1839, 0, 0, 0, 1841, 0, 1840, 1839, 1842, 1839,
+ 0, 0, 1843, 1841, 1840, 1840, 0, 2453, 2453, 2453,
+ 2453, 1842, 0, 1842, 0, 1839, 0, 1843, 2453, 1841,
+ 0, 1839, 1842, 1839, 0, 1843, 1843, 1841, 1844, 1844,
+
+ 1844, 1844, 1845, 1845, 1845, 1845, 1842, 0, 1842, 0,
+ 0, 0, 1843, 0, 1844, 0, 1842, 0, 1845, 1843,
+ 1843, 1850, 1850, 1850, 1850, 1851, 1851, 1851, 1851, 1844,
+ 0, 0, 0, 1845, 0, 0, 0, 1850, 1844, 0,
+ 0, 1851, 1845, 1852, 1852, 1852, 1852, 1853, 1853, 1853,
+ 1853, 0, 1850, 0, 1844, 0, 1851, 0, 1845, 1852,
+ 0, 1850, 1844, 1853, 0, 1851, 1845, 2198, 2198, 2198,
+ 2198, 0, 0, 0, 1852, 0, 1853, 1850, 1853, 0,
+ 0, 1851, 0, 1852, 0, 1850, 0, 1853, 0, 1851,
+ 1854, 1854, 1854, 1854, 1855, 1855, 1855, 1855, 0, 1852,
+
+ 0, 1853, 0, 1853, 2198, 0, 1854, 1852, 0, 0,
+ 1855, 1853, 0, 0, 0, 1865, 1865, 1865, 1865, 0,
+ 0, 1854, 0, 0, 0, 1855, 0, 0, 2198, 1854,
+ 1854, 1865, 1855, 0, 1855, 1856, 1856, 1856, 1856, 0,
+ 0, 0, 1865, 0, 1865, 0, 1854, 0, 0, 0,
+ 1855, 1856, 0, 1854, 1854, 0, 1855, 0, 1855, 0,
+ 0, 1897, 1897, 1897, 1897, 0, 1856, 1865, 0, 1865,
+ 0, 0, 1897, 0, 0, 1856, 1856, 1897, 0, 1866,
+ 1866, 1866, 1866, 1891, 1891, 1891, 1891, 0, 1897, 0,
+ 1897, 1856, 0, 0, 0, 1866, 0, 0, 0, 1856,
+
+ 1856, 1858, 1858, 1858, 1858, 0, 1866, 0, 1866, 0,
+ 0, 0, 1858, 1897, 1891, 1897, 0, 1858, 1866, 1879,
+ 1879, 1879, 1879, 1891, 0, 0, 0, 2031, 2031, 2031,
+ 2031, 1866, 1858, 1866, 0, 1879, 0, 0, 0, 1891,
+ 1858, 1858, 1866, 2031, 0, 0, 1879, 1891, 1879, 2206,
+ 2206, 2206, 2206, 0, 2031, 0, 2031, 1858, 0, 1879,
+ 1880, 1880, 1880, 1880, 1858, 1858, 1859, 1859, 1859, 1859,
+ 0, 1879, 0, 1879, 0, 0, 1880, 1859, 0, 2031,
+ 0, 2031, 1859, 1879, 0, 0, 2206, 1880, 0, 1880,
+ 1880, 1881, 1881, 1881, 1881, 0, 0, 1859, 0, 0,
+
+ 0, 2196, 2196, 2196, 2196, 1859, 1859, 1881, 0, 0,
+ 2206, 0, 1880, 0, 1880, 1880, 0, 2196, 1881, 0,
+ 1881, 0, 1859, 0, 1881, 1884, 1884, 1884, 1884, 1859,
+ 1859, 1860, 1860, 1860, 1860, 0, 1885, 1885, 1885, 1885,
+ 0, 1884, 0, 1881, 2196, 1881, 0, 0, 0, 1881,
+ 0, 0, 1885, 0, 0, 0, 1884, 0, 1860, 0,
+ 1860, 0, 1860, 0, 0, 1884, 0, 1885, 2196, 0,
+ 0, 1860, 2195, 2195, 2195, 2195, 1885, 1886, 1886, 1886,
+ 1886, 1884, 0, 1860, 0, 1860, 0, 1860, 2195, 1884,
+ 0, 0, 1885, 1886, 0, 1860, 1861, 1861, 1861, 1861,
+
+ 1885, 2195, 0, 1887, 1887, 1887, 1887, 0, 1886, 1931,
+ 1931, 1931, 1931, 2456, 2456, 2456, 2456, 1886, 0, 1887,
+ 1931, 0, 0, 1861, 2456, 1861, 2195, 1861, 1904, 1904,
+ 1904, 1904, 1887, 1886, 1887, 0, 1861, 0, 0, 0,
+ 1931, 1886, 0, 1887, 1904, 0, 0, 0, 1861, 1931,
+ 1861, 0, 1861, 1904, 0, 0, 0, 1887, 0, 1887,
+ 1861, 1862, 1862, 1862, 1862, 1931, 0, 1887, 1888, 1888,
+ 1888, 1888, 0, 1931, 2457, 2457, 2457, 2457, 1904, 0,
+ 1890, 1890, 1890, 1890, 1888, 2457, 0, 0, 1862, 0,
+ 1862, 0, 1862, 0, 0, 0, 1890, 0, 0, 1888,
+
+ 0, 1862, 0, 1889, 1889, 1889, 1889, 1888, 1888, 0,
+ 0, 1890, 0, 1862, 0, 1862, 0, 1862, 0, 1889,
+ 1890, 1890, 0, 0, 1888, 1862, 1867, 1867, 1867, 1867,
+ 0, 1888, 1888, 0, 1889, 0, 1890, 0, 0, 0,
+ 0, 1889, 1867, 1889, 1890, 1890, 1905, 1905, 1905, 1905,
+ 0, 0, 0, 1867, 0, 1867, 0, 1867, 0, 1889,
+ 0, 0, 1905, 0, 0, 1889, 1867, 1889, 1906, 1906,
+ 1906, 1906, 0, 1905, 0, 1905, 0, 0, 1867, 1905,
+ 1867, 0, 1867, 0, 1906, 0, 2203, 2203, 2203, 2203,
+ 1867, 1868, 1868, 1868, 1868, 0, 0, 0, 1905, 1906,
+
+ 1905, 0, 2203, 0, 1905, 0, 0, 1868, 1906, 0,
+ 1907, 1907, 1907, 1907, 0, 2203, 0, 0, 1868, 0,
+ 1868, 0, 1868, 0, 1906, 0, 1907, 0, 0, 0,
+ 0, 1868, 1906, 0, 0, 0, 1908, 1908, 1908, 1908,
+ 2203, 1907, 0, 1868, 0, 1868, 0, 1868, 1907, 0,
+ 1907, 0, 1908, 0, 0, 1868, 0, 1911, 1911, 1911,
+ 1911, 0, 1913, 1913, 1913, 1913, 1907, 1908, 1912, 1912,
+ 1912, 1912, 1907, 1911, 1907, 0, 1908, 1908, 1913, 0,
+ 1914, 1914, 1914, 1914, 1912, 0, 0, 0, 1911, 0,
+ 0, 0, 1908, 1913, 0, 0, 1914, 1911, 0, 1912,
+
+ 1908, 1908, 1913, 1913, 0, 0, 1912, 0, 1912, 1914,
+ 0, 1914, 0, 1911, 2234, 2234, 2234, 2234, 1913, 0,
+ 1914, 1911, 0, 0, 1912, 0, 1913, 1913, 0, 0,
+ 1912, 0, 1912, 0, 1914, 0, 1914, 1915, 1915, 1915,
+ 1915, 0, 0, 0, 1914, 0, 0, 1916, 1916, 1916,
+ 1916, 2234, 0, 1915, 0, 0, 0, 1917, 1917, 1917,
+ 1917, 0, 0, 1916, 0, 0, 0, 0, 1915, 2245,
+ 2245, 2245, 2245, 1917, 0, 2234, 0, 1915, 1916, 0,
+ 1915, 0, 0, 0, 0, 1916, 0, 1916, 1917, 1920,
+ 1920, 1920, 1920, 1915, 0, 0, 0, 1917, 1917, 0,
+
+ 0, 1915, 0, 1916, 1915, 1920, 2245, 0, 0, 1916,
+ 0, 1916, 0, 1917, 0, 0, 1925, 1925, 1925, 1925,
+ 1920, 1917, 1917, 0, 0, 0, 0, 0, 0, 1920,
+ 2245, 0, 1925, 1926, 1926, 1926, 1926, 0, 0, 1927,
+ 1927, 1927, 1927, 0, 0, 1920, 0, 1925, 0, 1926,
+ 0, 0, 0, 1920, 1925, 1927, 1925, 0, 0, 1928,
+ 1928, 1928, 1928, 0, 1926, 0, 0, 0, 1927, 0,
+ 1927, 0, 1925, 1926, 1926, 1928, 0, 0, 1925, 1927,
+ 1925, 2484, 2484, 2484, 2484, 1930, 1930, 1930, 1930, 1926,
+ 1928, 0, 2484, 1927, 0, 1927, 1930, 1926, 1926, 1928,
+
+ 0, 1930, 1928, 1927, 0, 0, 1932, 1932, 1932, 1932,
+ 0, 1933, 1933, 1933, 1933, 1928, 1930, 1932, 0, 0,
+ 0, 0, 1932, 1928, 0, 1930, 1928, 1933, 1934, 1934,
+ 1934, 1934, 1935, 1935, 1935, 1935, 0, 1932, 0, 1934,
+ 0, 1930, 1933, 1935, 1934, 0, 1932, 0, 0, 1930,
+ 0, 1933, 0, 0, 0, 1936, 1936, 1936, 1936, 1934,
+ 0, 0, 1932, 1935, 0, 0, 1936, 1933, 1934, 0,
+ 1932, 1936, 1935, 0, 0, 1933, 0, 1937, 1937, 1937,
+ 1937, 0, 0, 0, 1934, 0, 1936, 0, 1935, 0,
+ 0, 0, 1934, 1937, 0, 1936, 1935, 1941, 1941, 1941,
+
+ 1941, 0, 1942, 1942, 1942, 1942, 0, 0, 1937, 0,
+ 0, 1936, 0, 1941, 0, 0, 0, 1937, 1942, 1936,
+ 2268, 2268, 2268, 2268, 1941, 0, 1941, 0, 0, 1942,
+ 0, 1942, 0, 1937, 0, 1941, 2268, 1946, 1946, 1946,
+ 1946, 1937, 0, 1942, 1947, 1947, 1947, 1947, 0, 1941,
+ 0, 1941, 0, 1946, 1942, 0, 1942, 0, 0, 1941,
+ 1947, 2268, 0, 1954, 1954, 1954, 1954, 1942, 1946, 0,
+ 1959, 1959, 1959, 1959, 0, 1947, 0, 1946, 0, 1954,
+ 1955, 1955, 1955, 1955, 1947, 2268, 1959, 0, 1960, 1960,
+ 1960, 1960, 0, 1946, 1954, 0, 1955, 1959, 0, 1959,
+
+ 1947, 1946, 0, 1954, 1960, 0, 0, 0, 1947, 1959,
+ 0, 1955, 0, 0, 0, 1960, 0, 1960, 0, 1954,
+ 1955, 1960, 1959, 0, 1959, 0, 0, 1954, 0, 1961,
+ 1961, 1961, 1961, 1959, 0, 0, 1955, 0, 0, 0,
+ 1960, 0, 1960, 0, 1955, 1961, 1960, 1963, 1963, 1963,
+ 1963, 1964, 1964, 1964, 1964, 0, 1961, 0, 1961, 0,
+ 0, 0, 0, 1963, 0, 0, 0, 1964, 1965, 1965,
+ 1965, 1965, 1961, 0, 1966, 1966, 1966, 1966, 1963, 0,
+ 0, 1961, 1964, 1961, 1965, 1963, 0, 1963, 0, 0,
+ 1966, 1964, 1964, 0, 0, 0, 1961, 1965, 0, 1965,
+
+ 0, 0, 0, 1963, 0, 1966, 0, 1964, 1965, 1963,
+ 0, 1963, 0, 0, 1966, 1964, 1964, 1966, 1973, 1973,
+ 1973, 1973, 1965, 0, 1965, 2497, 2497, 2497, 2497, 1973,
+ 1966, 0, 1965, 0, 1973, 0, 2497, 0, 1966, 0,
+ 0, 1966, 0, 0, 1974, 1974, 1974, 1974, 0, 1973,
+ 1977, 1977, 1977, 1977, 0, 1974, 0, 0, 1973, 0,
+ 1974, 1977, 1978, 1978, 1978, 1978, 1977, 2107, 2107, 2107,
+ 2107, 0, 0, 1978, 1973, 1974, 0, 0, 1978, 0,
+ 0, 1977, 1973, 2107, 1974, 1979, 1979, 1979, 1979, 0,
+ 1977, 0, 0, 1978, 0, 0, 1979, 0, 0, 0,
+
+ 1974, 0, 1978, 0, 0, 2107, 1977, 0, 1974, 2253,
+ 2253, 2253, 2253, 0, 1977, 0, 1979, 0, 1978, 1983,
+ 1983, 1983, 1983, 0, 0, 1979, 1978, 0, 0, 2107,
+ 1983, 1984, 1984, 1984, 1984, 1983, 0, 1985, 1985, 1985,
+ 1985, 1979, 1984, 0, 0, 0, 2253, 1984, 1985, 1979,
+ 1983, 1988, 1988, 1988, 1988, 0, 0, 0, 0, 1983,
+ 0, 0, 1984, 2275, 2275, 2275, 2275, 1988, 1985, 0,
+ 2253, 1984, 0, 0, 0, 1983, 0, 1985, 1988, 2275,
+ 1988, 0, 0, 1983, 0, 0, 0, 1984, 0, 0,
+ 1988, 0, 0, 1985, 0, 1984, 1989, 1989, 1989, 1989,
+
+ 0, 1985, 0, 1988, 0, 1988, 1990, 1990, 1990, 1990,
+ 0, 0, 1989, 0, 1988, 0, 1991, 1991, 1991, 1991,
+ 0, 0, 1990, 1992, 1992, 1992, 1992, 1989, 1993, 1993,
+ 1993, 1993, 1991, 0, 0, 0, 1989, 1990, 0, 1992,
+ 0, 0, 0, 0, 1993, 0, 1990, 1991, 2113, 2113,
+ 2113, 2113, 1989, 0, 1992, 0, 1991, 1993, 0, 1993,
+ 1989, 0, 1990, 1992, 2113, 0, 0, 0, 1993, 0,
+ 1990, 0, 1991, 1994, 1994, 1994, 1994, 0, 0, 1992,
+ 1991, 0, 1993, 0, 1993, 0, 2113, 1992, 0, 1994,
+ 0, 0, 1993, 1995, 1995, 1995, 1995, 0, 0, 1996,
+
+ 1996, 1996, 1996, 0, 1994, 2504, 2504, 2504, 2504, 1995,
+ 2113, 0, 1994, 1994, 0, 1996, 2504, 0, 2534, 2534,
+ 2534, 2534, 1995, 0, 1995, 1999, 1999, 1999, 1999, 1994,
+ 1996, 0, 0, 1995, 2534, 0, 1994, 1994, 0, 1996,
+ 0, 1999, 1996, 2000, 2000, 2000, 2000, 1995, 0, 1995,
+ 0, 2397, 2397, 2397, 2397, 1996, 1999, 1995, 0, 2000,
+ 0, 0, 2397, 1996, 0, 1999, 1996, 0, 0, 2001,
+ 2001, 2001, 2001, 0, 2000, 2002, 2002, 2002, 2002, 0,
+ 0, 1999, 0, 2000, 0, 2001, 0, 0, 0, 1999,
+ 2397, 2002, 2003, 2003, 2003, 2003, 0, 0, 0, 2000,
+
+ 2001, 2348, 2348, 2348, 2348, 0, 2002, 2000, 2003, 2001,
+ 2004, 2004, 2004, 2004, 2397, 2002, 0, 2348, 0, 0,
+ 0, 2003, 0, 2003, 0, 2001, 2004, 2355, 2355, 2355,
+ 2355, 2002, 2003, 2001, 2348, 2327, 2327, 2327, 2327, 2002,
+ 0, 2004, 0, 2355, 0, 0, 2003, 0, 2003, 2004,
+ 2004, 2005, 2005, 2005, 2005, 0, 2003, 0, 0, 2348,
+ 2355, 2006, 2006, 2006, 2006, 0, 2004, 2005, 2007, 2007,
+ 2007, 2007, 2327, 2004, 2004, 0, 0, 2006, 0, 0,
+ 2005, 0, 2005, 0, 2007, 2355, 0, 2008, 2008, 2008,
+ 2008, 2005, 2006, 0, 0, 0, 2327, 0, 0, 2007,
+
+ 0, 2006, 0, 2008, 2006, 2005, 0, 2005, 2007, 2007,
+ 2009, 2009, 2009, 2009, 0, 2005, 0, 2006, 2008, 2204,
+ 2204, 2204, 2204, 0, 2007, 2006, 2009, 2008, 2006, 0,
+ 0, 0, 2007, 2007, 0, 2204, 0, 0, 0, 2009,
+ 0, 2009, 0, 2008, 2010, 2010, 2010, 2010, 0, 0,
+ 2009, 2008, 0, 0, 2013, 2013, 2013, 2013, 0, 0,
+ 2010, 0, 2204, 0, 2009, 0, 2009, 0, 0, 0,
+ 2013, 0, 0, 0, 2009, 2010, 2014, 2014, 2014, 2014,
+ 2395, 2395, 2395, 2395, 2010, 2013, 2204, 2010, 2015, 2015,
+ 2015, 2015, 2014, 0, 2013, 0, 2274, 2274, 2274, 2274,
+
+ 2010, 0, 0, 0, 2015, 0, 0, 2014, 2010, 0,
+ 2013, 2010, 2274, 0, 0, 0, 2014, 2395, 2013, 2015,
+ 2016, 2016, 2016, 2016, 2525, 2525, 2525, 2525, 2015, 0,
+ 0, 0, 2014, 0, 0, 2525, 2016, 2274, 0, 0,
+ 2014, 2395, 0, 0, 2015, 0, 2017, 2017, 2017, 2017,
+ 0, 2016, 2015, 0, 0, 0, 2018, 2018, 2018, 2018,
+ 2016, 2274, 2017, 0, 0, 0, 2409, 2409, 2409, 2409,
+ 0, 0, 2018, 0, 0, 2017, 2016, 2017, 2023, 2023,
+ 2023, 2023, 0, 0, 2016, 0, 2017, 2018, 0, 0,
+ 2024, 2024, 2024, 2024, 2023, 2018, 2018, 0, 0, 0,
+
+ 2017, 0, 2017, 2409, 0, 0, 2024, 2023, 0, 2023,
+ 2017, 0, 2018, 2540, 2540, 2540, 2540, 0, 2023, 2018,
+ 2018, 2024, 2025, 2025, 2025, 2025, 0, 2409, 0, 2540,
+ 2024, 0, 2023, 2024, 2023, 0, 0, 0, 2025, 0,
+ 0, 0, 2023, 0, 0, 0, 2024, 0, 2026, 2026,
+ 2026, 2026, 0, 2025, 2024, 0, 0, 2024, 0, 0,
+ 0, 0, 2025, 2025, 2026, 2032, 2032, 2032, 2032, 2047,
+ 2047, 2047, 2047, 0, 2048, 2048, 2048, 2048, 2025, 2026,
+ 0, 2032, 0, 0, 0, 2047, 2025, 2025, 2026, 0,
+ 2048, 0, 2032, 0, 2032, 0, 2047, 0, 2047, 0,
+
+ 0, 2048, 0, 2048, 2026, 2048, 0, 2047, 2032, 0,
+ 0, 0, 2026, 2049, 2049, 2049, 2049, 2032, 0, 2032,
+ 0, 2047, 0, 2047, 0, 0, 2048, 0, 2048, 2049,
+ 2048, 2047, 2032, 2051, 2051, 2051, 2051, 0, 0, 0,
+ 2049, 0, 2049, 2052, 2052, 2052, 2052, 0, 0, 2051,
+ 2053, 2053, 2053, 2053, 0, 0, 0, 0, 0, 2052,
+ 2049, 0, 2051, 0, 2051, 2049, 2053, 2049, 0, 2054,
+ 2054, 2054, 2054, 2051, 2052, 0, 0, 2489, 2489, 2489,
+ 2489, 2053, 0, 2052, 2049, 2054, 2052, 2051, 2489, 2051,
+ 2053, 2053, 2061, 2061, 2061, 2061, 0, 2051, 0, 2052,
+
+ 2054, 2535, 2535, 2535, 2535, 0, 2053, 2052, 2061, 2054,
+ 2052, 0, 0, 0, 2053, 2053, 2489, 2535, 0, 2061,
+ 0, 2061, 0, 0, 0, 2054, 2062, 2062, 2062, 2062,
+ 2061, 0, 0, 2054, 0, 0, 2063, 2063, 2063, 2063,
+ 2489, 2535, 2062, 0, 2061, 0, 2061, 2064, 2064, 2064,
+ 2064, 0, 2063, 0, 2061, 2062, 0, 2062, 2065, 2065,
+ 2065, 2065, 0, 2064, 0, 2535, 2062, 2063, 2536, 2536,
+ 2536, 2536, 0, 0, 2065, 2063, 2063, 0, 2064, 2536,
+ 2062, 0, 2062, 2581, 2581, 2581, 2581, 2064, 0, 2065,
+ 2062, 0, 2063, 0, 2581, 0, 2065, 0, 2065, 2063,
+
+ 2063, 0, 0, 2064, 0, 2066, 2066, 2066, 2066, 0,
+ 0, 2064, 0, 0, 2065, 0, 2067, 2067, 2067, 2067,
+ 2065, 2066, 2065, 2068, 2068, 2068, 2068, 2071, 2071, 2071,
+ 2071, 0, 2067, 0, 0, 0, 2066, 0, 0, 2068,
+ 0, 0, 0, 2071, 0, 2066, 2066, 2067, 2422, 2422,
+ 2422, 2422, 0, 0, 2068, 0, 2067, 2067, 2071, 0,
+ 2068, 2066, 0, 2068, 0, 0, 0, 2071, 0, 2066,
+ 2066, 0, 2067, 2072, 2072, 2072, 2072, 0, 0, 2068,
+ 2067, 2067, 0, 2071, 2068, 2422, 0, 2068, 0, 2072,
+ 0, 2071, 2073, 2073, 2073, 2073, 0, 0, 0, 2074,
+
+ 2074, 2074, 2074, 0, 2072, 0, 0, 0, 2073, 2422,
+ 0, 2072, 0, 2072, 0, 2074, 2431, 2431, 2431, 2431,
+ 0, 0, 0, 2073, 0, 2610, 2610, 2610, 2610, 2072,
+ 2074, 0, 2073, 2073, 0, 2072, 2610, 2072, 0, 2074,
+ 2074, 2610, 2075, 2075, 2075, 2075, 0, 0, 2073, 2077,
+ 2077, 2077, 2077, 2431, 0, 2074, 2073, 2073, 2075, 2076,
+ 2076, 2076, 2076, 2074, 2074, 2077, 0, 2529, 2529, 2529,
+ 2529, 0, 0, 2075, 0, 2076, 0, 2431, 2529, 2075,
+ 2077, 0, 2075, 0, 0, 0, 2077, 0, 0, 2077,
+ 2076, 0, 2076, 2078, 2078, 2078, 2078, 0, 2075, 2076,
+
+ 0, 0, 0, 2075, 2529, 2077, 2075, 0, 0, 2078,
+ 2077, 0, 0, 2077, 0, 2076, 0, 2076, 0, 2079,
+ 2079, 2079, 2079, 2076, 2078, 0, 0, 0, 2529, 0,
+ 2078, 0, 0, 2078, 0, 2079, 2080, 2080, 2080, 2080,
+ 0, 0, 2081, 2081, 2081, 2081, 0, 0, 0, 2078,
+ 2079, 0, 2080, 0, 2078, 0, 2079, 2078, 2081, 2079,
+ 0, 0, 2084, 2084, 2084, 2084, 0, 2080, 2085, 2085,
+ 2085, 2085, 0, 2081, 0, 2079, 2080, 2080, 2084, 2081,
+ 2079, 0, 2081, 2079, 2085, 0, 0, 0, 0, 0,
+ 0, 2084, 2080, 2084, 2086, 2086, 2086, 2086, 2081, 2085,
+
+ 2080, 2080, 2084, 2081, 0, 0, 2081, 2085, 2085, 0,
+ 2086, 2087, 2087, 2087, 2087, 0, 2084, 0, 2084, 0,
+ 2454, 2454, 2454, 2454, 2085, 2086, 2084, 2087, 0, 0,
+ 0, 2085, 2085, 0, 2086, 0, 2454, 2088, 2088, 2088,
+ 2088, 0, 2087, 2093, 2093, 2093, 2093, 2454, 0, 2087,
+ 2086, 2087, 0, 2088, 2094, 2094, 2094, 2094, 2086, 2093,
+ 2104, 2104, 2104, 2104, 0, 0, 0, 2087, 2088, 0,
+ 2094, 0, 2454, 2087, 2093, 2087, 2104, 2088, 2088, 2820,
+ 2820, 2820, 2820, 2093, 2093, 2094, 0, 2104, 0, 2104,
+ 2820, 2094, 0, 2088, 2094, 2095, 2095, 2095, 2095, 2093,
+
+ 0, 2088, 2088, 2458, 2458, 2458, 2458, 2093, 2093, 0,
+ 2094, 2095, 2104, 0, 2104, 2094, 0, 0, 2094, 2458,
+ 0, 2096, 2096, 2096, 2096, 0, 2095, 0, 2095, 0,
+ 2458, 2097, 2097, 2097, 2097, 2095, 0, 2096, 2098, 2098,
+ 2098, 2098, 2641, 2641, 2641, 2641, 0, 2097, 0, 0,
+ 0, 2095, 2096, 2095, 2098, 2458, 0, 0, 2096, 2095,
+ 0, 2096, 2097, 0, 2103, 2103, 2103, 2103, 2097, 2098,
+ 0, 2097, 0, 0, 0, 2098, 0, 2096, 2098, 2641,
+ 2103, 0, 2096, 0, 0, 2096, 0, 2097, 0, 0,
+ 0, 2103, 2097, 2103, 2098, 2097, 0, 0, 0, 2098,
+
+ 0, 0, 2098, 2641, 0, 2103, 2117, 2117, 2117, 2117,
+ 2118, 2118, 2118, 2118, 0, 0, 2103, 0, 2103, 0,
+ 0, 0, 2117, 0, 0, 0, 2118, 0, 0, 2103,
+ 0, 0, 0, 2117, 0, 2117, 0, 2118, 0, 2118,
+ 2119, 2119, 2119, 2119, 0, 2121, 2121, 2121, 2121, 0,
+ 2122, 2122, 2122, 2122, 2118, 0, 2119, 0, 2117, 0,
+ 2117, 2121, 2118, 0, 2118, 0, 2122, 2119, 0, 2119,
+ 0, 0, 2123, 2123, 2123, 2123, 2121, 0, 2118, 0,
+ 0, 2122, 0, 0, 0, 2121, 2121, 2122, 2123, 0,
+ 2122, 0, 2119, 0, 2119, 0, 0, 2139, 2139, 2139,
+
+ 2139, 2121, 0, 2123, 0, 2123, 2122, 0, 0, 2121,
+ 2121, 2122, 2123, 2139, 2122, 2124, 2124, 2124, 2124, 2125,
+ 2125, 2125, 2125, 0, 2139, 0, 2139, 0, 2123, 0,
+ 2123, 2124, 0, 0, 0, 2125, 2123, 2126, 2126, 2126,
+ 2126, 2130, 2130, 2130, 2130, 0, 2124, 0, 0, 2139,
+ 2125, 2139, 2124, 2126, 0, 2124, 2125, 2130, 0, 2125,
+ 0, 0, 2660, 2660, 2660, 2660, 0, 0, 2126, 0,
+ 0, 2124, 2130, 0, 2126, 2125, 2124, 2126, 2130, 2124,
+ 2125, 2130, 0, 2125, 2131, 2131, 2131, 2131, 2132, 2132,
+ 2132, 2132, 0, 2126, 0, 0, 0, 2130, 2126, 2660,
+
+ 2131, 2126, 2130, 0, 0, 2130, 2133, 2133, 2133, 2133,
+ 0, 2455, 2455, 2455, 2455, 2131, 0, 2133, 0, 2132,
+ 0, 2131, 2133, 2660, 2131, 2132, 0, 2455, 2132, 0,
+ 0, 2541, 2541, 2541, 2541, 0, 2455, 2133, 0, 0,
+ 2131, 0, 0, 0, 2132, 2131, 2133, 2541, 2131, 2132,
+ 0, 0, 2132, 2134, 2134, 2134, 2134, 2136, 2136, 2136,
+ 2136, 2455, 2133, 0, 2134, 0, 0, 0, 2136, 2134,
+ 2133, 2541, 0, 2136, 2137, 2137, 2137, 2137, 0, 0,
+ 2140, 2140, 2140, 2140, 2134, 2137, 0, 0, 2136, 0,
+ 2137, 0, 0, 2134, 0, 2541, 2140, 2136, 0, 0,
+
+ 2141, 2141, 2141, 2141, 0, 2137, 0, 0, 0, 2134,
+ 0, 2140, 0, 2136, 2137, 0, 2141, 2134, 2140, 0,
+ 2140, 2136, 0, 2142, 2142, 2142, 2142, 0, 0, 0,
+ 2137, 2141, 2827, 2827, 2827, 2827, 2140, 0, 2137, 2142,
+ 2141, 2141, 2140, 2827, 2140, 2143, 2143, 2143, 2143, 0,
+ 0, 0, 2142, 0, 2142, 0, 2141, 0, 0, 0,
+ 0, 2143, 0, 2142, 2141, 2141, 2144, 2144, 2144, 2144,
+ 2611, 2611, 2611, 2611, 0, 0, 2143, 2142, 0, 2142,
+ 0, 2611, 2144, 0, 0, 2143, 2611, 2142, 2143, 2145,
+ 2145, 2145, 2145, 2853, 2853, 2853, 2853, 2144, 0, 2144,
+
+ 0, 2143, 0, 0, 2853, 2145, 2144, 0, 0, 2143,
+ 0, 0, 2143, 0, 0, 2146, 2146, 2146, 2146, 0,
+ 2145, 0, 2144, 0, 2144, 0, 2145, 0, 0, 2145,
+ 2144, 2146, 2147, 2147, 2147, 2147, 0, 0, 2667, 2667,
+ 2667, 2667, 0, 0, 0, 2145, 2146, 0, 2147, 0,
+ 2145, 0, 2146, 2145, 2667, 2146, 0, 0, 2148, 2148,
+ 2148, 2148, 0, 2147, 2152, 2152, 2152, 2152, 0, 2147,
+ 0, 2146, 2147, 0, 2148, 0, 2146, 0, 0, 2146,
+ 2152, 0, 0, 2148, 2151, 2151, 2151, 2151, 2147, 2148,
+ 0, 0, 0, 2147, 0, 2152, 2147, 0, 2148, 0,
+
+ 2151, 0, 0, 0, 2152, 0, 0, 2152, 2148, 2670,
+ 2670, 2670, 2670, 2151, 2148, 2151, 2153, 2153, 2153, 2153,
+ 2152, 0, 2148, 0, 2151, 2670, 0, 0, 2152, 0,
+ 0, 2152, 2153, 2682, 2682, 2682, 2682, 0, 2151, 0,
+ 2151, 0, 2154, 2154, 2154, 2154, 0, 2153, 2151, 2153,
+ 0, 0, 2155, 2155, 2155, 2155, 2153, 0, 2154, 2156,
+ 2156, 2156, 2156, 2697, 2697, 2697, 2697, 0, 2155, 0,
+ 2682, 0, 2153, 2154, 2153, 2156, 0, 0, 0, 2154,
+ 2153, 0, 2154, 2155, 2866, 2866, 2866, 2866, 0, 2155,
+ 2156, 0, 2155, 0, 2682, 2866, 2156, 0, 2154, 2156,
+
+ 2697, 0, 0, 2154, 0, 0, 2154, 0, 2155, 2157,
+ 2157, 2157, 2157, 2155, 0, 2156, 2155, 0, 0, 0,
+ 2156, 0, 0, 2156, 2697, 2157, 2158, 2158, 2158, 2158,
+ 0, 2159, 2159, 2159, 2159, 0, 2157, 0, 0, 0,
+ 2157, 0, 2158, 2160, 2160, 2160, 2160, 2159, 0, 2157,
+ 0, 2158, 2873, 2873, 2873, 2873, 0, 2158, 0, 2160,
+ 0, 2157, 2159, 2873, 2159, 2157, 2158, 2804, 2804, 2804,
+ 2804, 2159, 0, 2157, 2160, 0, 2158, 0, 2804, 0,
+ 2160, 0, 2158, 2160, 0, 0, 0, 2159, 0, 2159,
+ 2158, 2708, 2708, 2708, 2708, 2159, 0, 0, 0, 2160,
+
+ 2161, 2161, 2161, 2161, 2160, 0, 2804, 2160, 0, 0,
+ 2162, 2162, 2162, 2162, 0, 0, 2161, 2163, 2163, 2163,
+ 2163, 0, 2166, 2166, 2166, 2166, 2162, 0, 2708, 0,
+ 2804, 2161, 0, 2163, 0, 0, 0, 2161, 2166, 0,
+ 2161, 2162, 2163, 2263, 2263, 2263, 2263, 2162, 2163, 0,
+ 2162, 0, 2708, 2166, 0, 0, 2161, 2163, 0, 2263,
+ 2166, 2161, 2166, 0, 2161, 0, 2162, 2163, 0, 0,
+ 2263, 2162, 2263, 2163, 2162, 0, 0, 0, 2166, 0,
+ 0, 2163, 0, 0, 2166, 0, 2166, 2167, 2167, 2167,
+ 2167, 2168, 2168, 2168, 2168, 2263, 0, 2263, 2169, 2169,
+
+ 2169, 2169, 0, 2167, 0, 0, 0, 2168, 0, 2743,
+ 2743, 2743, 2743, 0, 2169, 0, 0, 0, 2167, 0,
+ 2168, 0, 2168, 0, 0, 0, 0, 2167, 2167, 2169,
+ 0, 2168, 2171, 2171, 2171, 2171, 0, 0, 2169, 0,
+ 0, 2169, 0, 2167, 0, 2168, 2743, 2168, 2171, 0,
+ 0, 2167, 2167, 0, 2169, 2168, 0, 0, 2172, 2172,
+ 2172, 2172, 2169, 2171, 0, 2169, 0, 0, 0, 2171,
+ 2743, 0, 2171, 0, 2172, 2173, 2173, 2173, 2173, 0,
+ 0, 2754, 2754, 2754, 2754, 0, 0, 0, 2171, 2172,
+ 0, 0, 0, 2171, 0, 2172, 2171, 0, 2172, 0,
+
+ 0, 2177, 2177, 2177, 2177, 0, 2173, 2178, 2178, 2178,
+ 2178, 0, 2173, 0, 2172, 2173, 0, 2177, 2754, 2172,
+ 0, 0, 2172, 2178, 2179, 2179, 2179, 2179, 0, 0,
+ 0, 2173, 2177, 0, 2177, 0, 2173, 0, 2178, 2173,
+ 2179, 2177, 2754, 0, 2178, 0, 0, 2178, 0, 0,
+ 2180, 2180, 2180, 2180, 0, 2179, 0, 2177, 0, 2177,
+ 0, 2179, 0, 2178, 2179, 2177, 2180, 0, 2178, 0,
+ 0, 2178, 0, 2181, 2181, 2181, 2181, 0, 0, 0,
+ 2179, 2180, 0, 0, 0, 2179, 0, 2180, 2179, 2181,
+ 2180, 2182, 2182, 2182, 2182, 2762, 2762, 2762, 2762, 0,
+
+ 2181, 0, 0, 0, 2181, 0, 2180, 2182, 0, 0,
+ 0, 2180, 0, 2181, 2180, 0, 2182, 2187, 2187, 2187,
+ 2187, 0, 2182, 0, 0, 2181, 0, 0, 0, 2181,
+ 0, 2182, 2762, 2187, 0, 0, 0, 2181, 0, 0,
+ 0, 2182, 0, 0, 2187, 0, 2187, 2182, 0, 0,
+ 2187, 2188, 2188, 2188, 2188, 2182, 2762, 0, 2189, 2189,
+ 2189, 2189, 2884, 2884, 2884, 2884, 0, 2188, 0, 2187,
+ 0, 2187, 0, 2884, 2189, 2187, 0, 0, 0, 0,
+ 0, 0, 2188, 2459, 2459, 2459, 2459, 0, 2188, 2189,
+ 0, 2188, 0, 0, 0, 2189, 0, 0, 2189, 2459,
+
+ 2192, 2192, 2192, 2192, 0, 0, 0, 2188, 2459, 0,
+ 0, 0, 2188, 0, 2189, 2188, 2192, 0, 0, 2189,
+ 0, 0, 2189, 2190, 2190, 2190, 2190, 0, 0, 0,
+ 0, 2192, 0, 2459, 0, 0, 0, 2192, 0, 2190,
+ 2192, 2193, 2193, 2193, 2193, 2194, 2194, 2194, 2194, 0,
+ 2190, 0, 2190, 0, 2190, 0, 2192, 2193, 0, 0,
+ 2190, 2192, 0, 2190, 2192, 0, 0, 2200, 2200, 2200,
+ 2200, 0, 2193, 0, 0, 2190, 2194, 2190, 2193, 2190,
+ 0, 2193, 2194, 2200, 2190, 2194, 0, 2190, 0, 0,
+ 2202, 2202, 2202, 2202, 0, 0, 0, 2193, 2200, 0,
+
+ 0, 2194, 2193, 0, 2200, 2193, 2194, 2200, 0, 2194,
+ 2201, 2201, 2201, 2201, 0, 0, 0, 0, 0, 0,
+ 0, 2202, 0, 2200, 0, 0, 2201, 2202, 2200, 0,
+ 2202, 2200, 2207, 2207, 2207, 2207, 2208, 2208, 2208, 2208,
+ 0, 2201, 0, 0, 0, 0, 2202, 2201, 2207, 0,
+ 2201, 2202, 2208, 0, 2202, 0, 0, 0, 0, 2207,
+ 0, 2207, 0, 2208, 0, 2208, 2201, 0, 0, 0,
+ 2207, 2201, 0, 0, 2201, 0, 0, 2208, 2803, 2803,
+ 2803, 2803, 0, 0, 2207, 0, 2207, 0, 2208, 0,
+ 2208, 0, 0, 0, 2207, 0, 0, 2340, 2340, 2340,
+
+ 2340, 2208, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209,
+ 2209, 2209, 2209, 2209, 0, 2803, 2209, 2209, 2209, 2209,
+ 0, 2209, 0, 2209, 2209, 2209, 2209, 2209, 2340, 2812,
+ 2812, 2812, 2812, 0, 2209, 0, 0, 2340, 0, 2803,
+ 0, 0, 0, 2209, 0, 0, 0, 0, 0, 0,
+ 0, 2209, 0, 2340, 0, 0, 0, 0, 0, 2209,
+ 0, 2340, 0, 0, 0, 0, 2812, 2209, 2826, 2826,
+ 2826, 2826, 0, 0, 0, 2209, 2209, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 0,
+ 2812, 2210, 2210, 2210, 2210, 0, 2210, 0, 2210, 2210,
+
+ 2210, 2210, 2210, 0, 0, 2826, 0, 0, 0, 2210,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2210, 0,
+ 0, 0, 0, 0, 0, 0, 2210, 0, 0, 2826,
+ 0, 0, 0, 0, 2210, 0, 0, 0, 0, 0,
+ 0, 0, 2210, 0, 0, 0, 0, 0, 0, 0,
+ 2210, 2210, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
+ 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
+ 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
+ 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
+ 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
+
+ 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
+ 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
+ 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2213, 2213, 2213,
+ 2213, 2214, 2214, 2214, 2214, 0, 0, 0, 2215, 2215,
+ 2215, 2215, 0, 2213, 0, 0, 0, 2214, 0, 2216,
+ 2216, 2216, 2216, 0, 2215, 0, 0, 0, 2213, 0,
+ 2213, 0, 2214, 0, 0, 2216, 0, 2213, 2214, 2215,
+ 0, 2214, 0, 0, 0, 2215, 0, 0, 2215, 0,
+ 2216, 0, 0, 2213, 0, 2213, 2216, 2214, 0, 2216,
+ 0, 2213, 2214, 0, 2215, 2214, 0, 0, 0, 2215,
+
+ 0, 0, 2215, 0, 0, 2216, 2217, 2217, 2217, 2217,
+ 2216, 0, 0, 2216, 0, 0, 2218, 2218, 2218, 2218,
+ 0, 0, 2217, 2220, 2220, 2220, 2220, 2839, 2839, 2839,
+ 2839, 0, 2218, 2217, 0, 0, 0, 2217, 0, 2220,
+ 0, 2218, 2814, 2814, 2814, 2814, 2217, 2218, 2848, 2848,
+ 2848, 2848, 0, 2814, 2220, 0, 2218, 0, 2217, 0,
+ 2220, 0, 2217, 2220, 2839, 0, 2218, 0, 0, 0,
+ 2217, 0, 2218, 2221, 2221, 2221, 2221, 0, 0, 2220,
+ 2218, 2814, 0, 0, 2220, 2848, 0, 2220, 2839, 2221,
+ 2222, 2222, 2222, 2222, 0, 0, 0, 0, 0, 0,
+
+ 2858, 2858, 2858, 2858, 2221, 2814, 0, 0, 0, 2848,
+ 2221, 2858, 0, 2221, 0, 0, 2225, 2225, 2225, 2225,
+ 0, 2222, 2226, 2226, 2226, 2226, 0, 2222, 0, 2221,
+ 2222, 0, 2225, 0, 2221, 0, 0, 2221, 2226, 2858,
+ 0, 0, 0, 0, 0, 2225, 2222, 2225, 0, 0,
+ 0, 2222, 0, 2226, 2222, 0, 2225, 2227, 2227, 2227,
+ 2227, 0, 2226, 2858, 0, 2226, 0, 0, 0, 0,
+ 2225, 0, 2225, 2227, 2228, 2228, 2228, 2228, 2226, 0,
+ 2225, 0, 0, 0, 0, 0, 2226, 0, 2227, 2226,
+ 2228, 0, 2229, 2229, 2229, 2229, 0, 2227, 2227, 0,
+
+ 0, 0, 0, 0, 0, 2228, 0, 0, 2229, 0,
+ 0, 2228, 0, 2227, 2228, 2231, 2231, 2231, 2231, 2229,
+ 0, 2227, 2227, 2229, 0, 0, 2232, 2232, 2232, 2232,
+ 2228, 2231, 2229, 0, 0, 2228, 0, 0, 2228, 0,
+ 2231, 0, 2232, 0, 2229, 0, 2231, 0, 2229, 0,
+ 0, 0, 0, 0, 0, 2231, 2229, 2232, 2236, 2236,
+ 2236, 2236, 0, 0, 0, 2231, 2232, 0, 0, 0,
+ 0, 2231, 0, 0, 2236, 2237, 2237, 2237, 2237, 2231,
+ 0, 0, 2232, 0, 0, 0, 0, 0, 0, 2236,
+ 2232, 2237, 0, 2238, 2238, 2238, 2238, 0, 2236, 2236,
+
+ 0, 0, 0, 0, 0, 0, 2237, 0, 0, 2238,
+ 0, 0, 2237, 0, 2236, 2237, 2239, 2239, 2239, 2239,
+ 2238, 0, 2236, 2236, 2238, 0, 0, 2240, 2240, 2240,
+ 2240, 2237, 2239, 2238, 0, 0, 2237, 0, 0, 2237,
+ 0, 0, 0, 2240, 0, 2238, 0, 2239, 0, 2238,
+ 2241, 2241, 2241, 2241, 0, 0, 2239, 2238, 2240, 0,
+ 0, 0, 0, 0, 0, 0, 2241, 2240, 2242, 2242,
+ 2242, 2242, 2239, 2243, 2243, 2243, 2243, 2241, 0, 0,
+ 2239, 2241, 0, 2240, 2242, 0, 0, 0, 0, 2243,
+ 2241, 2240, 0, 2242, 2246, 2246, 2246, 2246, 0, 2242,
+
+ 0, 0, 2241, 0, 2243, 0, 2241, 0, 2242, 0,
+ 2246, 0, 0, 2243, 2241, 0, 0, 0, 2242, 0,
+ 0, 0, 0, 2246, 2242, 2246, 0, 0, 0, 2243,
+ 0, 0, 2242, 0, 2246, 0, 0, 2243, 2247, 2247,
+ 2247, 2247, 0, 2248, 2248, 2248, 2248, 0, 2246, 0,
+ 2246, 0, 0, 0, 2247, 0, 0, 0, 2246, 2248,
+ 2249, 2249, 2249, 2249, 2255, 2255, 2255, 2255, 0, 2247,
+ 2256, 2256, 2256, 2256, 2248, 0, 2249, 0, 2247, 0,
+ 2255, 2247, 0, 2248, 2248, 0, 2256, 2254, 2254, 2254,
+ 2254, 2249, 0, 0, 2247, 2255, 0, 2249, 0, 2248,
+
+ 2249, 2256, 2247, 2254, 2255, 2247, 0, 2248, 2248, 0,
+ 2256, 0, 0, 0, 2254, 0, 2249, 0, 2254, 0,
+ 2255, 2249, 0, 0, 2249, 0, 2256, 2254, 2255, 2260,
+ 2260, 2260, 2260, 0, 2256, 2345, 2345, 2345, 2345, 2254,
+ 0, 0, 0, 2254, 0, 2260, 2261, 2261, 2261, 2261,
+ 0, 2254, 0, 0, 2265, 2265, 2265, 2265, 0, 0,
+ 2260, 0, 2261, 0, 0, 0, 2345, 0, 0, 2260,
+ 2265, 0, 2345, 0, 0, 2345, 0, 2261, 0, 2265,
+ 0, 2265, 0, 2265, 0, 2260, 2261, 0, 0, 0,
+ 0, 2345, 0, 2260, 0, 0, 2345, 0, 0, 2345,
+
+ 0, 0, 2261, 0, 2265, 0, 2265, 0, 2265, 0,
+ 2261, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
+ 2262, 2262, 2262, 0, 0, 2262, 2262, 2262, 2262, 0,
+ 2262, 0, 2262, 2262, 2262, 2262, 2262, 2277, 2277, 2277,
+ 2277, 0, 0, 2262, 0, 2278, 2278, 2278, 2278, 0,
+ 0, 0, 2262, 2277, 0, 0, 0, 0, 0, 0,
+ 2262, 2278, 0, 0, 2277, 0, 2277, 0, 2262, 0,
+ 2278, 0, 2278, 0, 2278, 0, 2262, 0, 0, 0,
+ 2277, 0, 0, 0, 2262, 2262, 0, 0, 0, 2277,
+ 0, 2277, 0, 0, 0, 2278, 0, 2278, 0, 2278,
+
+ 2281, 2281, 2281, 2281, 2277, 2282, 2282, 2282, 2282, 0,
+ 0, 0, 2283, 2283, 2283, 2283, 2281, 2285, 2285, 2285,
+ 2285, 2282, 0, 2284, 2284, 2284, 2284, 0, 2283, 0,
+ 0, 2281, 0, 2285, 0, 0, 2282, 0, 0, 2284,
+ 2281, 2283, 0, 2283, 0, 2282, 0, 0, 2285, 0,
+ 0, 0, 2283, 0, 2284, 0, 2281, 2285, 0, 0,
+ 0, 2282, 2284, 2284, 2281, 0, 2283, 0, 2283, 2282,
+ 0, 0, 0, 2285, 0, 0, 2283, 0, 0, 2284,
+ 0, 2285, 0, 0, 0, 0, 2284, 2284, 2286, 2286,
+ 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286,
+
+ 0, 0, 2286, 2286, 2286, 2286, 0, 2286, 0, 2286,
+ 2286, 2286, 2286, 2286, 0, 2287, 2287, 2287, 2287, 0,
+ 2286, 0, 0, 0, 0, 0, 0, 0, 0, 2286,
+ 0, 2287, 0, 2289, 2289, 2289, 2289, 2286, 2288, 2288,
+ 2288, 2288, 0, 0, 0, 2286, 2287, 0, 0, 2289,
+ 0, 0, 0, 2286, 2288, 2287, 0, 0, 0, 0,
+ 0, 2286, 2286, 0, 2289, 0, 0, 2288, 0, 2288,
+ 0, 2287, 2289, 2289, 2290, 2290, 2290, 2290, 2288, 2287,
+ 0, 0, 0, 0, 2292, 2292, 2292, 2292, 0, 2289,
+ 2290, 0, 2288, 0, 2288, 0, 2289, 2289, 0, 0,
+
+ 2292, 2290, 2288, 0, 0, 2290, 0, 0, 0, 2292,
+ 2446, 2446, 2446, 2446, 2290, 2292, 2293, 2293, 2293, 2293,
+ 2294, 2294, 2294, 2294, 2292, 0, 2290, 0, 0, 0,
+ 2290, 0, 2293, 0, 2292, 0, 2294, 0, 2290, 0,
+ 2292, 2446, 2299, 2299, 2299, 2299, 0, 2293, 2292, 0,
+ 2446, 2294, 0, 0, 0, 0, 2293, 0, 2299, 0,
+ 2294, 0, 2300, 2300, 2300, 2300, 2446, 0, 0, 0,
+ 0, 0, 2293, 2299, 2446, 0, 2294, 0, 2300, 0,
+ 2293, 0, 2299, 2299, 2294, 0, 0, 0, 2301, 2301,
+ 2301, 2301, 0, 2300, 2302, 2302, 2302, 2302, 2299, 2300,
+
+ 0, 0, 2300, 0, 2301, 0, 2299, 2299, 0, 0,
+ 2302, 2303, 2303, 2303, 2303, 0, 0, 0, 2300, 2301,
+ 0, 2301, 0, 2300, 0, 2302, 2300, 2303, 2301, 0,
+ 0, 2302, 0, 0, 2302, 0, 0, 2304, 2304, 2304,
+ 2304, 0, 2303, 0, 2301, 0, 2301, 0, 2303, 0,
+ 2302, 2303, 2301, 2304, 0, 2302, 0, 0, 2302, 0,
+ 0, 0, 2304, 2305, 2305, 2305, 2305, 2303, 2304, 0,
+ 0, 0, 2303, 0, 0, 2303, 0, 2304, 0, 2305,
+ 2307, 2307, 2307, 2307, 0, 0, 0, 2304, 0, 0,
+ 0, 0, 0, 2304, 2305, 0, 2307, 0, 0, 0,
+
+ 2305, 2304, 0, 2305, 0, 2359, 2359, 2359, 2359, 0,
+ 0, 2307, 0, 0, 0, 0, 0, 0, 0, 2305,
+ 2307, 2359, 0, 0, 2305, 0, 0, 2305, 0, 0,
+ 0, 0, 2359, 0, 2359, 0, 2307, 0, 2311, 2311,
+ 2311, 2311, 0, 0, 2307, 2308, 2308, 2308, 2308, 2312,
+ 2312, 2312, 2312, 0, 2311, 0, 2308, 2359, 0, 2359,
+ 0, 2308, 0, 0, 0, 2312, 0, 0, 0, 2311,
+ 0, 2311, 2314, 2314, 2314, 2314, 2308, 0, 2311, 0,
+ 2312, 0, 0, 0, 2308, 2308, 2312, 0, 2314, 2312,
+ 2313, 2313, 2313, 2313, 2311, 0, 2311, 2314, 0, 0,
+
+ 0, 2308, 2311, 2314, 0, 2312, 2313, 0, 2308, 2308,
+ 2312, 0, 2314, 2312, 0, 0, 2315, 2315, 2315, 2315,
+ 0, 2313, 2314, 0, 0, 0, 0, 2313, 2314, 0,
+ 2313, 0, 2315, 0, 0, 0, 2314, 0, 0, 2317,
+ 2317, 2317, 2317, 0, 0, 0, 2313, 2315, 0, 0,
+ 0, 2313, 0, 2315, 2313, 2317, 2315, 0, 2318, 2318,
+ 2318, 2318, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2317, 0, 2315, 0, 2318, 0, 2317, 2315, 0, 2317,
+ 2315, 2316, 2316, 2316, 2316, 0, 0, 0, 0, 2318,
+ 0, 0, 2316, 0, 0, 2317, 0, 2316, 2318, 0,
+
+ 2317, 0, 0, 2317, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2316, 0, 2318, 0, 0, 0, 0, 0,
+ 2316, 2316, 2318, 2321, 2321, 2321, 2321, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2316, 0, 2321,
+ 0, 0, 0, 0, 2316, 2316, 2319, 2319, 2319, 2319,
+ 0, 0, 0, 0, 2321, 0, 0, 2319, 2322, 2322,
+ 2322, 2322, 2319, 2321, 2321, 0, 0, 0, 2323, 2323,
+ 2323, 2323, 0, 0, 2322, 0, 0, 2319, 0, 2321,
+ 2324, 2324, 2324, 2324, 2323, 2319, 2319, 2321, 2321, 2322,
+ 2325, 2325, 2325, 2325, 0, 2322, 2324, 0, 2322, 2323,
+
+ 0, 2323, 2319, 0, 0, 0, 2325, 0, 2323, 2319,
+ 2319, 2324, 0, 0, 2322, 0, 0, 2324, 0, 2322,
+ 2324, 2325, 2322, 0, 2323, 0, 2323, 2325, 0, 0,
+ 2325, 0, 2323, 0, 0, 0, 2324, 2326, 2326, 2326,
+ 2326, 2324, 0, 0, 2324, 0, 2325, 0, 0, 0,
+ 0, 2325, 0, 2326, 2325, 2330, 2330, 2330, 2330, 0,
+ 0, 0, 2326, 0, 0, 0, 0, 0, 2326, 0,
+ 0, 2330, 0, 2335, 2335, 2335, 2335, 2326, 2336, 2336,
+ 2336, 2336, 0, 0, 0, 0, 2330, 2326, 0, 2335,
+ 0, 0, 2330, 2326, 2336, 2330, 0, 0, 0, 0,
+
+ 0, 2326, 0, 0, 2335, 0, 0, 0, 0, 2336,
+ 0, 2330, 0, 2335, 0, 0, 2330, 0, 2336, 2330,
+ 2331, 2331, 2331, 2331, 2337, 2337, 2337, 2337, 0, 2335,
+ 0, 2331, 0, 0, 2336, 0, 2331, 2335, 0, 0,
+ 2337, 0, 2336, 0, 0, 0, 2338, 2338, 2338, 2338,
+ 0, 2331, 0, 0, 0, 2337, 0, 0, 0, 2331,
+ 2331, 0, 2338, 0, 2337, 2339, 2339, 2339, 2339, 0,
+ 0, 0, 0, 0, 0, 2338, 2331, 2338, 0, 0,
+ 2337, 2339, 0, 2331, 2331, 0, 2338, 0, 2337, 0,
+ 0, 0, 0, 0, 0, 0, 2339, 0, 0, 0,
+
+ 2338, 0, 2338, 0, 2339, 2339, 2349, 2349, 2349, 2349,
+ 2338, 0, 0, 0, 0, 0, 2350, 2350, 2350, 2350,
+ 0, 2339, 2349, 2356, 2356, 2356, 2356, 0, 2339, 2339,
+ 0, 0, 2350, 0, 0, 0, 0, 2349, 0, 2356,
+ 0, 0, 0, 2349, 0, 0, 2349, 2350, 0, 0,
+ 0, 0, 0, 2350, 2356, 0, 2350, 0, 0, 0,
+ 2356, 0, 2349, 2356, 0, 0, 0, 2349, 0, 0,
+ 2349, 0, 2350, 2357, 2357, 2357, 2357, 2350, 0, 2356,
+ 2350, 0, 0, 0, 2356, 0, 0, 2356, 0, 2357,
+ 2360, 2360, 2360, 2360, 0, 2361, 2361, 2361, 2361, 2362,
+
+ 2362, 2362, 2362, 0, 2357, 0, 2360, 0, 0, 0,
+ 2357, 2361, 0, 2357, 0, 2362, 0, 2360, 0, 2360,
+ 0, 0, 2363, 2363, 2363, 2363, 2361, 0, 0, 2357,
+ 2362, 0, 0, 2360, 2357, 2361, 0, 2357, 2363, 2362,
+ 0, 0, 2360, 0, 2360, 2365, 2365, 2365, 2365, 0,
+ 0, 2361, 0, 2363, 0, 2362, 0, 2360, 0, 2361,
+ 0, 2365, 2363, 2362, 2366, 2366, 2366, 2366, 0, 0,
+ 0, 0, 0, 0, 2365, 0, 2365, 0, 2363, 0,
+ 2366, 2367, 2367, 2367, 2367, 2365, 2363, 0, 0, 0,
+ 0, 2368, 2368, 2368, 2368, 2366, 0, 2367, 0, 2365,
+
+ 0, 2365, 0, 2366, 2366, 0, 0, 2368, 0, 2365,
+ 0, 0, 2367, 2369, 2369, 2369, 2369, 0, 0, 0,
+ 2366, 2367, 2368, 0, 0, 0, 0, 2366, 2366, 2369,
+ 0, 2368, 2371, 2371, 2371, 2371, 0, 2367, 0, 0,
+ 0, 0, 0, 0, 2369, 2367, 0, 2368, 2371, 0,
+ 0, 0, 0, 2369, 0, 2368, 0, 0, 0, 0,
+ 0, 2371, 0, 2371, 2372, 2372, 2372, 2372, 0, 2369,
+ 0, 0, 2371, 0, 0, 0, 0, 2369, 0, 0,
+ 2372, 2373, 2373, 2373, 2373, 0, 2371, 0, 2371, 0,
+ 0, 2374, 2374, 2374, 2374, 2372, 2371, 2373, 2375, 2375,
+
+ 2375, 2375, 0, 2372, 2372, 0, 0, 2374, 0, 0,
+ 0, 0, 2373, 0, 2375, 0, 0, 0, 0, 2373,
+ 2372, 2373, 2374, 0, 0, 0, 0, 2372, 2372, 2375,
+ 0, 2374, 2374, 0, 0, 0, 0, 2373, 2375, 0,
+ 0, 0, 0, 2373, 0, 2373, 0, 2374, 2376, 2376,
+ 2376, 2376, 0, 0, 2375, 2374, 2374, 0, 2377, 2377,
+ 2377, 2377, 2375, 0, 2376, 0, 0, 0, 2378, 2378,
+ 2378, 2378, 0, 0, 2377, 0, 0, 2376, 0, 2376,
+ 2379, 2379, 2379, 2379, 2378, 0, 0, 0, 2376, 2377,
+ 0, 0, 0, 0, 0, 0, 2379, 2377, 2377, 2378,
+
+ 0, 0, 2376, 0, 2376, 0, 0, 0, 2378, 0,
+ 0, 2379, 2376, 0, 2377, 2384, 2384, 2384, 2384, 0,
+ 2379, 2377, 2377, 0, 2378, 2385, 2385, 2385, 2385, 0,
+ 0, 2384, 2378, 0, 0, 0, 2379, 2386, 2386, 2386,
+ 2386, 2385, 0, 0, 2379, 0, 2384, 0, 0, 0,
+ 0, 0, 0, 2386, 0, 2384, 2385, 2387, 2387, 2387,
+ 2387, 0, 0, 0, 0, 2385, 0, 0, 2386, 0,
+ 0, 2384, 0, 2387, 0, 0, 0, 2386, 0, 2384,
+ 0, 2385, 0, 0, 0, 0, 2387, 0, 2387, 2385,
+ 0, 0, 0, 2386, 0, 0, 0, 2387, 0, 0,
+
+ 0, 2386, 2388, 2388, 2388, 2388, 2389, 2389, 2389, 2389,
+ 0, 2387, 0, 2387, 0, 0, 0, 0, 2388, 0,
+ 0, 2387, 2389, 2390, 2390, 2390, 2390, 0, 0, 2393,
+ 2393, 2393, 2393, 2388, 0, 0, 0, 2389, 0, 2390,
+ 0, 2388, 2388, 0, 2389, 2393, 2389, 0, 0, 0,
+ 2430, 2430, 2430, 2430, 2390, 0, 0, 0, 2388, 0,
+ 2393, 2430, 2389, 2390, 2390, 2388, 2388, 0, 2389, 2393,
+ 2389, 0, 0, 2391, 2391, 2391, 2391, 0, 0, 2390,
+ 0, 2430, 0, 0, 0, 2393, 0, 2390, 2390, 2391,
+ 2430, 0, 0, 2393, 0, 2398, 2398, 2398, 2398, 0,
+
+ 0, 0, 0, 0, 2391, 0, 2430, 0, 0, 0,
+ 2391, 2398, 0, 2391, 2430, 2399, 2399, 2399, 2399, 0,
+ 0, 0, 0, 0, 0, 0, 2398, 0, 2398, 2391,
+ 0, 2399, 0, 0, 2391, 2398, 0, 2391, 2394, 2394,
+ 2394, 2394, 0, 0, 0, 0, 2399, 0, 0, 2394,
+ 0, 2398, 2399, 2398, 2394, 2399, 0, 0, 0, 2398,
+ 0, 0, 0, 0, 0, 2401, 2401, 2401, 2401, 2394,
+ 0, 2399, 2400, 2400, 2400, 2400, 2399, 2394, 2394, 2399,
+ 0, 2401, 2402, 2402, 2402, 2402, 0, 0, 2400, 0,
+ 0, 0, 2401, 0, 2394, 0, 2401, 0, 2402, 0,
+
+ 0, 2394, 2394, 2400, 0, 2401, 0, 0, 0, 2400,
+ 0, 0, 2400, 2402, 0, 0, 0, 2401, 0, 0,
+ 0, 2401, 2402, 0, 2405, 2405, 2405, 2405, 2400, 2401,
+ 0, 0, 0, 2400, 0, 2405, 2400, 0, 2402, 0,
+ 2405, 2406, 2406, 2406, 2406, 0, 2402, 2404, 2404, 2404,
+ 2404, 0, 2406, 0, 0, 2405, 0, 2406, 2404, 2407,
+ 2407, 2407, 2407, 2404, 2405, 0, 0, 0, 0, 0,
+ 2407, 0, 2406, 0, 0, 2407, 0, 0, 2404, 0,
+ 2405, 2406, 2408, 2408, 2408, 2408, 2404, 2404, 2405, 0,
+ 2407, 0, 0, 2411, 2411, 2411, 2411, 2406, 2408, 2407,
+
+ 0, 0, 0, 2404, 0, 2406, 0, 0, 0, 2411,
+ 2404, 2404, 0, 2408, 0, 2407, 2412, 2412, 2412, 2412,
+ 2411, 0, 2408, 2407, 2411, 0, 0, 0, 2413, 2413,
+ 2413, 2413, 2412, 2411, 0, 0, 0, 0, 2408, 2413,
+ 0, 0, 0, 0, 2413, 2411, 2408, 2412, 0, 2411,
+ 2414, 2414, 2414, 2414, 0, 0, 2412, 2411, 0, 2413,
+ 0, 2414, 2415, 2415, 2415, 2415, 2414, 0, 2413, 0,
+ 0, 0, 2412, 2415, 0, 0, 0, 0, 2415, 0,
+ 2412, 2414, 0, 0, 2413, 2416, 2416, 2416, 2416, 0,
+ 2414, 0, 2413, 2415, 0, 0, 0, 0, 0, 0,
+
+ 0, 2416, 2415, 0, 0, 0, 2414, 0, 2418, 2418,
+ 2418, 2418, 0, 0, 2414, 0, 2416, 0, 2415, 2418,
+ 0, 0, 0, 0, 2418, 2416, 2415, 2419, 2419, 2419,
+ 2419, 2420, 2420, 2420, 2420, 0, 0, 0, 2419, 2418,
+ 0, 2416, 2420, 2419, 0, 0, 0, 2420, 2418, 2416,
+ 2417, 2417, 2417, 2417, 2427, 2427, 2427, 2427, 2419, 0,
+ 0, 2417, 2420, 0, 2418, 0, 2417, 2419, 0, 0,
+ 2427, 2420, 2418, 0, 0, 0, 2423, 2423, 2423, 2423,
+ 0, 2417, 0, 2419, 0, 2427, 0, 2420, 0, 2417,
+ 2417, 2419, 2423, 0, 2427, 2420, 2424, 2424, 2424, 2424,
+
+ 0, 2671, 2671, 2671, 2671, 0, 2417, 2423, 0, 2423,
+ 2427, 0, 2424, 2417, 2417, 0, 2423, 2671, 2427, 2425,
+ 2425, 2425, 2425, 0, 0, 0, 0, 2424, 2671, 0,
+ 2671, 0, 2423, 2424, 2423, 2425, 2424, 0, 0, 0,
+ 2423, 0, 2426, 2426, 2426, 2426, 0, 0, 0, 0,
+ 2425, 0, 2424, 2671, 0, 2671, 2425, 2424, 2426, 2425,
+ 2424, 2428, 2428, 2428, 2428, 2429, 2429, 2429, 2429, 2426,
+ 0, 0, 2428, 2426, 0, 2425, 2429, 2428, 0, 0,
+ 2425, 2429, 2426, 2425, 2432, 2432, 2432, 2432, 2433, 2433,
+ 2433, 2433, 2428, 0, 2426, 2432, 2429, 0, 2426, 2433,
+
+ 2432, 2428, 0, 0, 2433, 2429, 2426, 2434, 2434, 2434,
+ 2434, 2439, 2439, 2439, 2439, 2432, 0, 2428, 2434, 2433,
+ 0, 2429, 0, 2434, 2432, 2428, 0, 2439, 2433, 2429,
+ 2440, 2440, 2440, 2440, 2441, 2441, 2441, 2441, 2434, 0,
+ 2432, 0, 2439, 0, 2433, 0, 2440, 2434, 2432, 0,
+ 2441, 2439, 2433, 2442, 2442, 2442, 2442, 2443, 2443, 2443,
+ 2443, 2440, 0, 2434, 0, 2441, 0, 2439, 0, 2442,
+ 2440, 2434, 0, 2443, 2441, 2439, 0, 0, 0, 0,
+ 0, 0, 2442, 0, 2442, 0, 2440, 0, 2443, 0,
+ 2441, 0, 0, 2442, 2440, 0, 2443, 2443, 2441, 2444,
+
+ 2444, 2444, 2444, 2445, 2445, 2445, 2445, 2442, 0, 2442,
+ 0, 0, 0, 2443, 0, 2444, 0, 2442, 0, 2445,
+ 2443, 2443, 2452, 2452, 2452, 2452, 2461, 2461, 2461, 2461,
+ 2444, 0, 0, 2452, 2445, 0, 0, 2444, 2452, 2444,
+ 0, 0, 2461, 2445, 2445, 0, 0, 0, 0, 2452,
+ 0, 2452, 0, 0, 0, 2444, 0, 2461, 0, 2445,
+ 0, 2444, 0, 2444, 0, 0, 2461, 2445, 2445, 2460,
+ 2460, 2460, 2460, 0, 2452, 0, 2452, 2462, 2462, 2462,
+ 2462, 0, 2461, 0, 0, 2460, 0, 0, 0, 0,
+ 2461, 0, 0, 2462, 0, 0, 2460, 0, 2460, 0,
+
+ 0, 0, 2460, 2463, 2463, 2463, 2463, 0, 2462, 2466,
+ 2466, 2466, 2466, 0, 0, 2462, 0, 2462, 0, 2463,
+ 0, 2460, 0, 2460, 0, 2466, 0, 2460, 0, 0,
+ 0, 0, 0, 2462, 2463, 0, 0, 0, 0, 2462,
+ 2466, 2462, 0, 2463, 2463, 2467, 2467, 2467, 2467, 2466,
+ 2468, 2468, 2468, 2468, 0, 0, 0, 0, 0, 2463,
+ 0, 2467, 0, 0, 0, 2466, 2468, 2463, 2463, 0,
+ 0, 0, 0, 2466, 0, 0, 2467, 0, 0, 0,
+ 0, 2468, 0, 2467, 0, 2467, 2470, 2470, 2470, 2470,
+ 2468, 2468, 2469, 2469, 2469, 2469, 2471, 2471, 2471, 2471,
+
+ 0, 2467, 2470, 0, 0, 0, 2468, 2467, 2469, 2467,
+ 0, 0, 2471, 0, 2468, 2468, 0, 2470, 0, 0,
+ 0, 2469, 0, 2469, 0, 0, 2470, 2471, 0, 2470,
+ 0, 0, 2469, 0, 2471, 0, 2471, 0, 2472, 2472,
+ 2472, 2472, 2470, 0, 0, 0, 2469, 0, 2469, 0,
+ 2470, 0, 2471, 2470, 2472, 0, 2469, 0, 2471, 0,
+ 2471, 2475, 2475, 2475, 2475, 0, 0, 0, 0, 2472,
+ 0, 0, 0, 2480, 2480, 2480, 2480, 2475, 2472, 2472,
+ 0, 0, 0, 2481, 2481, 2481, 2481, 0, 0, 2480,
+ 0, 0, 2475, 0, 2472, 0, 0, 0, 0, 2481,
+
+ 0, 2475, 2472, 2472, 2480, 2482, 2482, 2482, 2482, 0,
+ 0, 2480, 0, 2480, 2481, 0, 0, 2475, 0, 0,
+ 0, 2482, 0, 2481, 2481, 2475, 0, 0, 0, 2480,
+ 0, 0, 0, 0, 2482, 2480, 2482, 2480, 0, 2481,
+ 2483, 2483, 2483, 2483, 0, 2482, 0, 2481, 2481, 0,
+ 0, 0, 0, 0, 0, 0, 2483, 0, 0, 2482,
+ 0, 2482, 2486, 2486, 2486, 2486, 0, 0, 0, 2482,
+ 0, 2483, 0, 2486, 2487, 2487, 2487, 2487, 2486, 0,
+ 2483, 0, 0, 2483, 0, 2487, 0, 0, 0, 0,
+ 2487, 0, 0, 2486, 0, 0, 2483, 0, 0, 0,
+
+ 0, 0, 2486, 0, 2483, 2487, 0, 2483, 2485, 2485,
+ 2485, 2485, 0, 0, 2487, 0, 0, 0, 2486, 2485,
+ 2488, 2488, 2488, 2488, 2485, 0, 2486, 0, 0, 0,
+ 2487, 2488, 0, 0, 0, 0, 2488, 0, 2487, 2485,
+ 0, 0, 2490, 2490, 2490, 2490, 0, 2485, 2485, 0,
+ 0, 2488, 0, 2490, 2491, 2491, 2491, 2491, 2490, 0,
+ 2488, 0, 0, 0, 2485, 2491, 0, 0, 0, 0,
+ 2491, 2485, 2485, 2490, 0, 0, 2488, 2492, 2492, 2492,
+ 2492, 0, 2490, 0, 2488, 2491, 0, 0, 2492, 0,
+ 0, 0, 0, 0, 2491, 0, 0, 0, 2490, 2493,
+
+ 2493, 2493, 2493, 0, 0, 0, 2490, 0, 2492, 0,
+ 2491, 0, 0, 0, 0, 2493, 0, 2492, 2491, 2494,
+ 2494, 2494, 2494, 0, 0, 0, 2493, 0, 0, 0,
+ 2493, 0, 0, 2492, 0, 2494, 0, 0, 0, 2493,
+ 0, 2492, 0, 0, 2494, 2495, 2495, 2495, 2495, 0,
+ 2494, 2493, 0, 0, 0, 2493, 0, 0, 0, 2494,
+ 0, 2495, 0, 2493, 2502, 2502, 2502, 2502, 0, 2494,
+ 0, 0, 0, 0, 0, 2494, 2495, 0, 0, 0,
+ 2502, 0, 2495, 2494, 0, 2495, 0, 2499, 2499, 2499,
+ 2499, 2500, 2500, 2500, 2500, 2502, 0, 0, 2499, 0,
+
+ 0, 2495, 2500, 2499, 2502, 0, 2495, 2500, 0, 2495,
+ 2496, 2496, 2496, 2496, 2501, 2501, 2501, 2501, 2499, 0,
+ 2502, 2496, 2500, 0, 0, 2501, 2496, 2499, 2502, 0,
+ 2501, 2500, 2505, 2505, 2505, 2505, 0, 0, 0, 0,
+ 0, 2496, 0, 2499, 0, 2501, 0, 2500, 2505, 2496,
+ 2496, 2499, 0, 0, 2501, 2500, 0, 0, 0, 0,
+ 0, 0, 0, 2505, 0, 0, 2496, 0, 0, 2505,
+ 2501, 0, 2505, 2496, 2496, 0, 0, 0, 2501, 2507,
+ 2507, 2507, 2507, 0, 0, 0, 0, 0, 2505, 0,
+ 2507, 0, 0, 2505, 0, 2507, 2505, 2506, 2506, 2506,
+
+ 2506, 2508, 2508, 2508, 2508, 0, 0, 0, 2506, 0,
+ 2507, 0, 2508, 2506, 0, 0, 0, 2508, 0, 2507,
+ 0, 0, 0, 2509, 2509, 2509, 2509, 0, 2506, 0,
+ 0, 0, 2508, 0, 2509, 2507, 2506, 2506, 0, 2509,
+ 0, 2508, 0, 2507, 0, 0, 2511, 2511, 2511, 2511,
+ 0, 0, 0, 2506, 2509, 0, 0, 2508, 0, 0,
+ 2506, 2506, 2511, 2509, 0, 2508, 2512, 2512, 2512, 2512,
+ 0, 0, 0, 2511, 0, 0, 0, 2511, 0, 2509,
+ 0, 0, 2512, 0, 0, 0, 2511, 2509, 0, 0,
+ 0, 2512, 2513, 2513, 2513, 2513, 0, 2512, 2511, 0,
+
+ 0, 0, 2511, 0, 0, 0, 2512, 0, 2513, 0,
+ 2511, 0, 0, 0, 0, 0, 2512, 0, 0, 0,
+ 0, 0, 2512, 2513, 0, 0, 0, 0, 0, 2513,
+ 2512, 0, 2513, 0, 0, 0, 2517, 2517, 2517, 2517,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2513, 0,
+ 0, 0, 2517, 2513, 0, 0, 2513, 2514, 2514, 2514,
+ 2514, 0, 2518, 2518, 2518, 2518, 0, 2517, 2514, 0,
+ 0, 0, 0, 2514, 2517, 0, 2517, 0, 2518, 2519,
+ 2519, 2519, 2519, 0, 0, 0, 0, 0, 2514, 0,
+ 0, 0, 2517, 2518, 0, 2519, 2514, 2514, 2517, 0,
+
+ 2517, 0, 2518, 2518, 0, 0, 0, 0, 2519, 0,
+ 2519, 0, 0, 2514, 2520, 2520, 2520, 2520, 2518, 2519,
+ 2514, 2514, 0, 0, 0, 0, 2518, 2518, 0, 0,
+ 2520, 0, 0, 2519, 0, 2519, 2527, 2527, 2527, 2527,
+ 0, 0, 0, 2519, 0, 2520, 0, 2527, 2528, 2528,
+ 2528, 2528, 2527, 0, 2520, 0, 0, 2520, 0, 2528,
+ 0, 0, 0, 0, 2528, 0, 0, 2527, 0, 0,
+ 2520, 2531, 2531, 2531, 2531, 0, 2527, 0, 2520, 2528,
+ 0, 2520, 2531, 2532, 2532, 2532, 2532, 2531, 2528, 0,
+ 0, 0, 2527, 0, 2532, 0, 0, 0, 0, 2532,
+
+ 2527, 0, 2531, 0, 2528, 2533, 2533, 2533, 2533, 0,
+ 0, 2531, 2528, 0, 2532, 0, 2533, 2537, 2537, 2537,
+ 2537, 0, 0, 2532, 0, 0, 0, 2531, 2537, 0,
+ 0, 0, 0, 2537, 0, 2531, 2533, 0, 0, 2532,
+ 2538, 2538, 2538, 2538, 0, 2533, 0, 2532, 2537, 0,
+ 0, 2538, 2539, 2539, 2539, 2539, 2538, 2537, 0, 0,
+ 0, 2533, 0, 2539, 0, 0, 0, 0, 0, 2533,
+ 0, 2538, 0, 2537, 2542, 2542, 2542, 2542, 0, 0,
+ 2538, 2537, 0, 2539, 2543, 2543, 2543, 2543, 0, 0,
+ 2542, 0, 2539, 0, 0, 0, 2538, 0, 0, 0,
+
+ 2543, 2542, 0, 2542, 2538, 0, 0, 0, 2539, 0,
+ 0, 0, 0, 2542, 0, 2543, 2539, 0, 2544, 2544,
+ 2544, 2544, 0, 0, 2543, 0, 2542, 0, 2542, 2545,
+ 2545, 2545, 2545, 0, 2544, 0, 0, 2542, 0, 0,
+ 2543, 2546, 2546, 2546, 2546, 2545, 0, 0, 2543, 2544,
+ 0, 0, 0, 0, 0, 0, 0, 2546, 2544, 0,
+ 2545, 2547, 2547, 2547, 2547, 0, 0, 0, 0, 2545,
+ 0, 0, 2546, 0, 2544, 0, 0, 2547, 0, 0,
+ 0, 2546, 2544, 0, 0, 2545, 0, 0, 0, 0,
+ 2547, 0, 2547, 2545, 0, 0, 0, 2546, 0, 0,
+
+ 0, 2547, 0, 0, 0, 2546, 2548, 2548, 2548, 2548,
+ 2549, 2549, 2549, 2549, 0, 2547, 0, 2547, 0, 0,
+ 0, 0, 2548, 0, 0, 2547, 2549, 0, 2550, 2550,
+ 2550, 2550, 2553, 2553, 2553, 2553, 0, 2548, 0, 2549,
+ 0, 2549, 0, 0, 2550, 2548, 2548, 0, 2553, 0,
+ 2549, 2554, 2554, 2554, 2554, 0, 0, 0, 0, 2550,
+ 0, 0, 2548, 2553, 2549, 0, 2549, 2554, 2550, 2548,
+ 2548, 2550, 2553, 0, 2549, 0, 0, 2555, 2555, 2555,
+ 2555, 0, 2554, 0, 2550, 0, 0, 0, 2553, 0,
+ 0, 2554, 2550, 2555, 0, 2550, 2553, 2556, 2556, 2556,
+
+ 2556, 0, 0, 2557, 2557, 2557, 2557, 2554, 2555, 2558,
+ 2558, 2558, 2558, 2556, 0, 2554, 0, 2555, 0, 2557,
+ 0, 0, 0, 0, 0, 2558, 0, 0, 2556, 0,
+ 0, 0, 2557, 2555, 2557, 0, 0, 2556, 0, 0,
+ 2558, 2555, 0, 2557, 0, 0, 0, 0, 2558, 2558,
+ 0, 0, 0, 2556, 0, 0, 0, 2557, 0, 2557,
+ 0, 2556, 0, 0, 0, 2558, 0, 2557, 2559, 2559,
+ 2559, 2559, 2558, 2558, 2560, 2560, 2560, 2560, 2561, 2561,
+ 2561, 2561, 0, 0, 2559, 0, 0, 0, 0, 0,
+ 2560, 0, 0, 0, 2561, 0, 0, 2559, 0, 2559,
+
+ 2562, 2562, 2562, 2562, 0, 2560, 0, 0, 2559, 2561,
+ 0, 0, 0, 0, 2560, 0, 2562, 2560, 2561, 2561,
+ 0, 0, 2559, 0, 2559, 0, 0, 0, 0, 0,
+ 2560, 2562, 2559, 0, 2561, 0, 0, 0, 2560, 0,
+ 2562, 2560, 2561, 2561, 2563, 2563, 2563, 2563, 0, 2564,
+ 2564, 2564, 2564, 0, 0, 0, 2562, 0, 0, 0,
+ 2563, 0, 0, 0, 2562, 2564, 2567, 2567, 2567, 2567,
+ 0, 0, 0, 2563, 0, 2563, 0, 0, 0, 0,
+ 2564, 0, 2567, 0, 2563, 0, 0, 0, 0, 2564,
+ 0, 0, 2564, 2568, 2568, 2568, 2568, 2567, 2563, 0,
+
+ 2563, 0, 0, 0, 0, 2564, 2567, 0, 2563, 2568,
+ 0, 0, 0, 2564, 0, 0, 2564, 0, 0, 0,
+ 0, 0, 2567, 0, 2568, 2569, 2569, 2569, 2569, 0,
+ 2567, 0, 0, 2568, 0, 2570, 2570, 2570, 2570, 0,
+ 0, 2569, 2571, 2571, 2571, 2571, 0, 0, 0, 2568,
+ 0, 2570, 0, 0, 0, 0, 2569, 2568, 2571, 0,
+ 0, 2572, 2572, 2572, 2572, 2569, 2570, 0, 0, 0,
+ 0, 2571, 0, 2571, 0, 2570, 0, 2572, 0, 0,
+ 0, 2569, 2571, 0, 0, 0, 0, 0, 0, 2569,
+ 0, 2570, 2572, 0, 0, 0, 2571, 0, 2571, 2570,
+
+ 2572, 2572, 2577, 2577, 2577, 2577, 2571, 2578, 2578, 2578,
+ 2578, 0, 2579, 2579, 2579, 2579, 0, 2572, 2577, 0,
+ 0, 0, 0, 2578, 2572, 2572, 0, 0, 2579, 0,
+ 0, 2577, 0, 2577, 0, 0, 0, 0, 2578, 0,
+ 0, 0, 2577, 2579, 0, 0, 0, 2578, 0, 0,
+ 2578, 0, 2579, 2579, 0, 0, 2577, 0, 2577, 2580,
+ 2580, 2580, 2580, 2578, 0, 0, 2577, 0, 2579, 0,
+ 0, 2578, 0, 0, 2578, 2580, 2579, 2579, 2582, 2582,
+ 2582, 2582, 2583, 2583, 2583, 2583, 0, 0, 0, 2582,
+ 2580, 0, 0, 2583, 2582, 0, 0, 0, 2583, 2580,
+
+ 2584, 2584, 2584, 2584, 0, 0, 0, 0, 0, 2582,
+ 0, 2584, 0, 2583, 0, 2580, 2584, 0, 2582, 0,
+ 0, 0, 2583, 2580, 0, 0, 0, 0, 0, 0,
+ 0, 2584, 0, 0, 2582, 0, 0, 0, 2583, 0,
+ 2584, 0, 2582, 0, 0, 0, 2583, 2585, 2585, 2585,
+ 2585, 2586, 2586, 2586, 2586, 0, 2584, 0, 2585, 0,
+ 0, 0, 2586, 2585, 2584, 0, 0, 2586, 2587, 2587,
+ 2587, 2587, 0, 2588, 2588, 2588, 2588, 0, 2585, 2587,
+ 0, 0, 2586, 0, 0, 0, 0, 2585, 0, 2588,
+ 0, 2586, 0, 0, 0, 2847, 2847, 2847, 2847, 2587,
+
+ 0, 0, 0, 2585, 2588, 0, 2847, 2586, 2587, 0,
+ 2588, 2585, 0, 2588, 0, 2586, 0, 2589, 2589, 2589,
+ 2589, 0, 0, 0, 2587, 0, 2847, 0, 0, 2588,
+ 0, 0, 2587, 2589, 2588, 2847, 0, 2588, 2590, 2590,
+ 2590, 2590, 0, 0, 2591, 2591, 2591, 2591, 2589, 2590,
+ 0, 2847, 0, 0, 2590, 2591, 0, 2589, 0, 2847,
+ 2591, 2592, 2592, 2592, 2592, 0, 0, 0, 0, 2590,
+ 0, 0, 0, 2589, 0, 2591, 0, 2592, 2590, 0,
+ 0, 2589, 0, 0, 2591, 0, 0, 2593, 2593, 2593,
+ 2593, 0, 2592, 0, 2590, 0, 0, 0, 2593, 0,
+
+ 2591, 2592, 2590, 2593, 2594, 2594, 2594, 2594, 2591, 0,
+ 2595, 2595, 2595, 2595, 0, 2594, 0, 2592, 2593, 0,
+ 2594, 2596, 2596, 2596, 2596, 2592, 2595, 2593, 0, 0,
+ 0, 2597, 2597, 2597, 2597, 2594, 0, 2596, 0, 0,
+ 0, 2595, 0, 2593, 2594, 0, 0, 2597, 0, 0,
+ 2595, 2593, 2596, 2598, 2598, 2598, 2598, 0, 2596, 0,
+ 2594, 2596, 2597, 0, 2598, 0, 2595, 0, 2594, 2598,
+ 0, 2597, 0, 0, 2595, 0, 0, 2596, 0, 0,
+ 0, 0, 2596, 0, 2598, 2596, 0, 2597, 2599, 2599,
+ 2599, 2599, 0, 2598, 0, 2597, 0, 0, 0, 2599,
+
+ 2600, 2600, 2600, 2600, 2599, 2602, 2602, 2602, 2602, 2598,
+ 2603, 2603, 2603, 2603, 0, 0, 2600, 2598, 0, 2599,
+ 0, 2602, 0, 0, 0, 0, 2603, 0, 2599, 0,
+ 0, 2600, 0, 0, 2602, 0, 2602, 0, 0, 0,
+ 2600, 2603, 0, 0, 2599, 2602, 0, 0, 0, 0,
+ 2603, 0, 2599, 2603, 0, 0, 2600, 0, 0, 2602,
+ 0, 2602, 0, 0, 2600, 0, 2603, 0, 0, 2602,
+ 2604, 2604, 2604, 2604, 2603, 0, 0, 2603, 0, 0,
+ 0, 2605, 2605, 2605, 2605, 0, 2604, 2612, 2612, 2612,
+ 2612, 2614, 2614, 2614, 2614, 0, 0, 2605, 0, 0,
+
+ 0, 2604, 0, 2612, 0, 0, 0, 2614, 0, 0,
+ 2604, 2604, 2605, 0, 2612, 0, 2612, 2613, 2613, 2613,
+ 2613, 2605, 2614, 0, 0, 2612, 2604, 0, 0, 0,
+ 2614, 2614, 0, 2613, 2604, 2604, 0, 2605, 0, 2612,
+ 0, 2612, 0, 0, 0, 2605, 2613, 2614, 2613, 2612,
+ 0, 0, 0, 0, 2614, 2614, 0, 2613, 2615, 2615,
+ 2615, 2615, 2616, 2616, 2616, 2616, 0, 0, 0, 0,
+ 0, 2613, 0, 2613, 2615, 0, 0, 0, 2616, 0,
+ 0, 2613, 0, 0, 0, 0, 0, 0, 0, 2615,
+ 0, 0, 0, 2616, 2617, 2617, 2617, 2617, 2615, 0,
+
+ 2616, 0, 2616, 0, 0, 2618, 2618, 2618, 2618, 0,
+ 2617, 0, 0, 0, 2615, 0, 0, 0, 2616, 0,
+ 0, 2618, 2615, 0, 2616, 2617, 2616, 0, 0, 0,
+ 0, 0, 0, 0, 2617, 2617, 2618, 2619, 2619, 2619,
+ 2619, 2622, 2622, 2622, 2622, 2618, 2618, 0, 0, 0,
+ 2617, 0, 0, 2619, 0, 0, 0, 2622, 2617, 2617,
+ 0, 2618, 0, 0, 2623, 2623, 2623, 2623, 2619, 2618,
+ 2618, 0, 2622, 0, 2619, 0, 0, 2619, 0, 0,
+ 2623, 2622, 0, 2624, 2624, 2624, 2624, 0, 0, 0,
+ 0, 0, 0, 2619, 0, 2623, 0, 2622, 2619, 2624,
+
+ 0, 2619, 2623, 0, 2623, 2622, 0, 0, 0, 2625,
+ 2625, 2625, 2625, 0, 2624, 2626, 2626, 2626, 2626, 0,
+ 2623, 0, 0, 2624, 2624, 2625, 2623, 0, 2623, 0,
+ 0, 2626, 0, 0, 0, 2627, 2627, 2627, 2627, 2624,
+ 2625, 2628, 2628, 2628, 2628, 0, 2626, 2624, 2624, 2625,
+ 2625, 2627, 2626, 0, 0, 2626, 0, 2628, 0, 0,
+ 0, 2629, 2629, 2629, 2629, 2625, 2627, 0, 2627, 0,
+ 0, 2626, 2628, 2625, 2625, 2627, 2626, 2629, 2628, 2626,
+ 0, 2628, 0, 0, 2630, 2630, 2630, 2630, 0, 0,
+ 0, 2627, 2629, 2627, 0, 0, 0, 2628, 2629, 2627,
+
+ 2630, 2629, 2628, 0, 0, 2628, 0, 0, 0, 0,
+ 2631, 2631, 2631, 2631, 0, 2630, 0, 2629, 0, 0,
+ 0, 2630, 2629, 0, 2630, 2629, 2631, 2632, 2632, 2632,
+ 2632, 2635, 2635, 2635, 2635, 0, 0, 0, 0, 0,
+ 2630, 2631, 0, 2632, 0, 2630, 0, 2635, 2630, 0,
+ 2631, 2631, 0, 2636, 2636, 2636, 2636, 0, 2632, 0,
+ 2635, 0, 2635, 0, 2632, 0, 2631, 2632, 0, 2636,
+ 0, 2635, 0, 0, 2631, 2631, 0, 0, 0, 2861,
+ 2861, 2861, 2861, 2632, 2636, 2635, 0, 2635, 2632, 0,
+ 2861, 2632, 2636, 2636, 0, 2635, 2637, 2637, 2637, 2637,
+
+ 0, 0, 2638, 2638, 2638, 2638, 0, 0, 0, 2636,
+ 2861, 0, 2637, 0, 0, 0, 2636, 2636, 2638, 2861,
+ 0, 0, 2639, 2639, 2639, 2639, 0, 2637, 2644, 2644,
+ 2644, 2644, 0, 2638, 0, 2861, 2637, 0, 2639, 0,
+ 2638, 0, 2638, 2861, 2644, 2645, 2645, 2645, 2645, 0,
+ 0, 0, 2637, 2639, 0, 0, 0, 0, 2638, 2644,
+ 2637, 2645, 2639, 2639, 2638, 0, 2638, 0, 2644, 2644,
+ 0, 0, 2646, 2646, 2646, 2646, 2645, 0, 2639, 0,
+ 0, 0, 2645, 0, 2644, 2645, 2639, 2639, 2646, 0,
+ 0, 0, 2644, 2644, 2647, 2647, 2647, 2647, 0, 0,
+
+ 0, 2645, 0, 2646, 0, 2646, 2645, 0, 0, 2645,
+ 2647, 0, 2646, 0, 0, 0, 2648, 2648, 2648, 2648,
+ 0, 0, 0, 0, 0, 2647, 0, 0, 2646, 0,
+ 2646, 2647, 2648, 0, 2647, 0, 2646, 0, 2649, 2649,
+ 2649, 2649, 0, 0, 0, 0, 0, 2648, 0, 0,
+ 2647, 0, 0, 2648, 2649, 2647, 2648, 0, 2647, 0,
+ 2653, 2653, 2653, 2653, 0, 0, 0, 0, 0, 2649,
+ 0, 0, 2648, 0, 0, 2649, 2653, 2648, 2649, 0,
+ 2648, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2653, 0, 0, 2649, 0, 0, 0, 0, 2649,
+
+ 2653, 2653, 2649, 2650, 2650, 2650, 2650, 0, 0, 0,
+ 0, 0, 0, 0, 2650, 0, 2653, 0, 0, 2650,
+ 0, 0, 0, 0, 2653, 2653, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2650, 0, 0, 0, 0, 0,
+ 0, 0, 2650, 2650, 0, 2654, 2654, 2654, 2654, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2650,
+ 0, 2654, 2655, 2655, 2655, 2655, 2650, 2650, 2651, 2651,
+ 2651, 2651, 0, 0, 0, 0, 2654, 0, 2655, 2651,
+ 0, 0, 2654, 0, 2651, 2654, 0, 0, 2656, 2656,
+ 2656, 2656, 0, 2655, 0, 2655, 0, 0, 0, 2651,
+
+ 0, 2654, 2655, 0, 2656, 0, 2654, 2651, 2651, 2654,
+ 0, 2657, 2657, 2657, 2657, 0, 0, 0, 2655, 2656,
+ 2655, 0, 0, 0, 2651, 2656, 2655, 2657, 2656, 0,
+ 0, 2651, 2651, 0, 2658, 2658, 2658, 2658, 0, 0,
+ 0, 0, 2657, 0, 2656, 0, 0, 0, 2657, 2656,
+ 2658, 2657, 2656, 0, 2662, 2662, 2662, 2662, 0, 0,
+ 0, 0, 0, 0, 0, 2658, 0, 2657, 0, 0,
+ 2662, 2658, 2657, 0, 2658, 2657, 2663, 2663, 2663, 2663,
+ 2664, 2664, 2664, 2664, 0, 2662, 0, 0, 0, 0,
+ 2658, 2662, 2663, 0, 2662, 2658, 0, 0, 2658, 0,
+
+ 0, 0, 0, 2665, 2665, 2665, 2665, 2663, 0, 0,
+ 2662, 2664, 0, 2663, 2665, 2662, 2663, 2664, 2662, 2665,
+ 2664, 0, 2666, 2666, 2666, 2666, 2672, 2672, 2672, 2672,
+ 0, 0, 2663, 2666, 2665, 0, 2664, 2663, 2666, 0,
+ 2663, 2664, 2672, 2665, 2664, 2668, 2668, 2668, 2668, 2669,
+ 2669, 2669, 2669, 2666, 0, 0, 2668, 2672, 0, 2665,
+ 2669, 2668, 2666, 0, 2672, 2669, 2672, 2665, 0, 0,
+ 0, 2673, 2673, 2673, 2673, 0, 2668, 0, 2666, 0,
+ 2669, 0, 2672, 0, 0, 2668, 2666, 2673, 2672, 2669,
+ 2672, 2674, 2674, 2674, 2674, 0, 0, 2705, 2705, 2705,
+
+ 2705, 2668, 2673, 0, 0, 2669, 0, 2674, 0, 2668,
+ 0, 2673, 2673, 2669, 0, 0, 0, 0, 0, 0,
+ 2674, 0, 2674, 2675, 2675, 2675, 2675, 2673, 2705, 0,
+ 0, 2674, 0, 0, 2705, 2673, 2673, 2705, 0, 2675,
+ 2676, 2676, 2676, 2676, 0, 2674, 0, 2674, 0, 0,
+ 0, 0, 0, 2705, 2675, 2674, 2676, 0, 2705, 0,
+ 0, 2705, 0, 2675, 0, 0, 2675, 0, 0, 0,
+ 0, 2676, 0, 2676, 0, 2677, 2677, 2677, 2677, 2675,
+ 2676, 0, 0, 0, 0, 0, 0, 2675, 0, 0,
+ 2675, 2677, 2678, 2678, 2678, 2678, 2676, 0, 2676, 0,
+
+ 0, 0, 0, 0, 2676, 0, 2677, 0, 2678, 0,
+ 0, 0, 2677, 0, 0, 2677, 0, 0, 2679, 2679,
+ 2679, 2679, 0, 2678, 0, 0, 0, 0, 0, 2678,
+ 0, 2677, 2678, 0, 2679, 0, 2677, 0, 0, 2677,
+ 0, 2680, 2680, 2680, 2680, 0, 0, 0, 2678, 2679,
+ 0, 0, 0, 2678, 0, 2679, 2678, 2680, 2679, 2683,
+ 2683, 2683, 2683, 0, 0, 0, 2680, 0, 0, 0,
+ 0, 0, 2680, 0, 2679, 2683, 0, 0, 0, 2679,
+ 0, 2680, 2679, 0, 0, 0, 0, 0, 2683, 0,
+ 2683, 2680, 0, 2684, 2684, 2684, 2684, 2680, 0, 2683,
+
+ 2686, 2686, 2686, 2686, 0, 2680, 0, 0, 0, 2684,
+ 0, 0, 0, 2683, 0, 2683, 2686, 0, 0, 2685,
+ 2685, 2685, 2685, 2683, 2684, 0, 0, 0, 0, 0,
+ 0, 2686, 0, 2684, 0, 2685, 2684, 2686, 0, 0,
+ 2686, 0, 2687, 2687, 2687, 2687, 0, 0, 0, 2684,
+ 2685, 0, 2685, 0, 0, 0, 2686, 2684, 2687, 2685,
+ 2684, 2686, 0, 0, 2686, 2688, 2688, 2688, 2688, 0,
+ 0, 0, 0, 2687, 0, 2685, 0, 2685, 0, 2687,
+ 0, 2688, 2687, 2685, 2689, 2689, 2689, 2689, 2690, 2690,
+ 2690, 2690, 0, 0, 0, 0, 2688, 0, 2687, 0,
+
+ 2689, 0, 2688, 2687, 2690, 2688, 2687, 0, 0, 0,
+ 0, 2689, 0, 2690, 0, 2689, 0, 0, 0, 2690,
+ 0, 2688, 0, 0, 2689, 0, 2688, 0, 2690, 2688,
+ 2691, 2691, 2691, 2691, 0, 0, 2689, 0, 2690, 0,
+ 2689, 0, 0, 0, 2690, 0, 2691, 0, 2689, 0,
+ 0, 0, 2690, 2692, 2692, 2692, 2692, 0, 0, 0,
+ 0, 2691, 0, 2691, 2693, 2693, 2693, 2693, 0, 2692,
+ 2691, 2694, 2694, 2694, 2694, 0, 0, 0, 0, 0,
+ 2693, 0, 0, 0, 2692, 0, 2691, 2694, 2691, 0,
+ 2692, 0, 0, 2692, 2691, 2693, 0, 0, 0, 0,
+
+ 0, 2693, 2694, 0, 2693, 0, 0, 0, 2694, 2692,
+ 0, 2694, 0, 0, 2692, 0, 0, 2692, 0, 0,
+ 2693, 2695, 2695, 2695, 2695, 2693, 0, 2694, 2693, 0,
+ 0, 0, 2694, 0, 0, 2694, 0, 2695, 2698, 2698,
+ 2698, 2698, 2699, 2699, 2699, 2699, 2695, 0, 0, 0,
+ 0, 0, 2695, 0, 2698, 0, 0, 0, 2699, 0,
+ 0, 2695, 0, 0, 2700, 2700, 2700, 2700, 0, 2698,
+ 0, 2695, 0, 2699, 0, 0, 2698, 2695, 2698, 0,
+ 2700, 0, 2699, 2699, 0, 2695, 0, 0, 0, 0,
+ 0, 0, 0, 2700, 2698, 2700, 0, 0, 2699, 0,
+
+ 2698, 0, 2698, 0, 2700, 0, 2699, 2699, 2701, 2701,
+ 2701, 2701, 0, 2703, 2703, 2703, 2703, 0, 2700, 0,
+ 2700, 0, 0, 0, 2701, 0, 0, 0, 2700, 2703,
+ 2704, 2704, 2704, 2704, 0, 0, 0, 0, 0, 2701,
+ 2709, 2709, 2709, 2709, 2703, 0, 2704, 0, 2701, 0,
+ 2703, 2701, 0, 2703, 0, 0, 2709, 0, 0, 0,
+ 0, 2704, 0, 0, 2701, 0, 0, 2704, 0, 2703,
+ 2704, 2709, 2701, 2709, 2703, 2701, 0, 2703, 0, 0,
+ 2709, 2710, 2710, 2710, 2710, 0, 2704, 0, 0, 0,
+ 0, 2704, 0, 0, 2704, 0, 2709, 2710, 2709, 2711,
+
+ 2711, 2711, 2711, 0, 2709, 0, 0, 0, 0, 0,
+ 0, 0, 2710, 0, 0, 2711, 0, 0, 2710, 0,
+ 0, 2710, 2712, 2712, 2712, 2712, 0, 0, 0, 0,
+ 2711, 0, 0, 0, 0, 0, 2711, 2710, 2712, 2711,
+ 0, 0, 2710, 0, 0, 2710, 0, 0, 2713, 2713,
+ 2713, 2713, 0, 2712, 0, 2711, 0, 0, 0, 2712,
+ 2711, 0, 2712, 2711, 2713, 2714, 2714, 2714, 2714, 0,
+ 0, 2715, 2715, 2715, 2715, 2713, 0, 0, 2712, 2713,
+ 0, 2714, 2715, 2712, 0, 0, 2712, 2715, 2713, 0,
+ 2714, 0, 2716, 2716, 2716, 2716, 2714, 0, 0, 0,
+
+ 2713, 0, 2715, 2716, 2713, 2714, 0, 0, 2716, 0,
+ 0, 2715, 2713, 0, 0, 2714, 0, 0, 0, 0,
+ 0, 2714, 0, 2716, 0, 0, 0, 2715, 0, 2714,
+ 0, 0, 2716, 0, 0, 2715, 2717, 2717, 2717, 2717,
+ 0, 0, 2718, 2718, 2718, 2718, 0, 0, 2716, 0,
+ 0, 0, 2717, 2718, 0, 0, 2716, 0, 2718, 2719,
+ 2719, 2719, 2719, 2720, 2720, 2720, 2720, 2717, 0, 0,
+ 2719, 0, 0, 2718, 0, 2719, 2717, 0, 0, 2720,
+ 0, 0, 2718, 0, 0, 2722, 2722, 2722, 2722, 0,
+ 2719, 0, 2717, 0, 2720, 0, 0, 0, 2718, 2719,
+
+ 2717, 2722, 0, 2720, 0, 0, 2718, 0, 2723, 2723,
+ 2723, 2723, 0, 0, 0, 2719, 2722, 0, 2722, 2720,
+ 0, 0, 0, 2719, 2723, 2722, 0, 2720, 2724, 2724,
+ 2724, 2724, 0, 0, 0, 0, 0, 0, 0, 2723,
+ 0, 2722, 0, 2722, 2724, 2723, 0, 0, 2723, 2722,
+ 2725, 2725, 2725, 2725, 0, 0, 0, 0, 0, 2724,
+ 2727, 2727, 2727, 2727, 2723, 2724, 2725, 0, 2724, 2723,
+ 0, 0, 2723, 0, 0, 0, 2727, 2726, 2726, 2726,
+ 2726, 2725, 0, 0, 2724, 2727, 0, 2725, 0, 2724,
+ 2725, 2727, 2724, 2726, 0, 0, 0, 0, 0, 0,
+
+ 2727, 0, 0, 0, 2726, 0, 2725, 0, 2726, 0,
+ 2727, 2725, 0, 0, 2725, 0, 2727, 2726, 2729, 2729,
+ 2729, 2729, 0, 0, 2727, 2731, 2731, 2731, 2731, 2726,
+ 0, 0, 0, 2726, 2729, 2730, 2730, 2730, 2730, 0,
+ 0, 2726, 0, 0, 0, 2735, 2735, 2735, 2735, 2729,
+ 0, 2730, 0, 0, 0, 2729, 2731, 0, 2729, 0,
+ 0, 2735, 2731, 0, 0, 2731, 2730, 0, 0, 0,
+ 0, 0, 2730, 0, 2729, 2730, 2735, 0, 0, 2729,
+ 0, 2731, 2729, 0, 0, 2735, 2731, 0, 2735, 2731,
+ 0, 2730, 2734, 2734, 2734, 2734, 2730, 0, 0, 2730,
+
+ 0, 2735, 2736, 2736, 2736, 2736, 0, 0, 2734, 2735,
+ 0, 0, 2735, 2737, 2737, 2737, 2737, 0, 2736, 0,
+ 0, 2734, 0, 2734, 2738, 2738, 2738, 2738, 0, 2737,
+ 0, 0, 2734, 2736, 0, 0, 0, 0, 0, 0,
+ 2738, 0, 2736, 2736, 2737, 0, 2734, 0, 2734, 0,
+ 2737, 2738, 0, 2737, 0, 2738, 2734, 0, 2736, 2740,
+ 2740, 2740, 2740, 0, 2738, 0, 2736, 2736, 0, 2737,
+ 2741, 2741, 2741, 2741, 2737, 2740, 2738, 2737, 0, 0,
+ 2738, 0, 0, 0, 2740, 0, 2741, 0, 2738, 0,
+ 2740, 2745, 2745, 2745, 2745, 0, 0, 0, 0, 2740,
+
+ 0, 2741, 2746, 2746, 2746, 2746, 0, 2745, 0, 2740,
+ 2741, 0, 0, 0, 0, 2740, 0, 0, 2746, 0,
+ 0, 0, 2745, 2740, 0, 0, 2741, 0, 0, 0,
+ 0, 2745, 2745, 2746, 2741, 0, 0, 0, 0, 2746,
+ 0, 0, 2746, 2747, 2747, 2747, 2747, 2745, 2748, 2748,
+ 2748, 2748, 0, 0, 0, 2745, 2745, 0, 2746, 2747,
+ 0, 0, 0, 2746, 2748, 0, 2746, 0, 0, 0,
+ 2747, 0, 0, 0, 2747, 2749, 2749, 2749, 2749, 2748,
+ 0, 0, 0, 2747, 0, 0, 0, 0, 2748, 0,
+ 0, 2749, 0, 0, 0, 2747, 0, 0, 0, 2747,
+
+ 0, 0, 0, 0, 2748, 0, 2749, 2747, 0, 0,
+ 0, 0, 2748, 0, 0, 2749, 2750, 2750, 2750, 2750,
+ 2751, 2751, 2751, 2751, 0, 0, 2752, 2752, 2752, 2752,
+ 0, 2749, 2750, 0, 0, 0, 2751, 0, 0, 2749,
+ 0, 0, 2752, 2750, 0, 2751, 0, 2750, 0, 0,
+ 0, 2751, 0, 0, 0, 0, 2750, 2752, 0, 0,
+ 2751, 0, 2755, 2755, 2755, 2755, 2752, 0, 2750, 0,
+ 2751, 0, 2750, 0, 0, 0, 2751, 0, 2755, 0,
+ 2750, 0, 2752, 0, 2751, 0, 0, 0, 0, 0,
+ 2752, 2755, 0, 2755, 2756, 2756, 2756, 2756, 2757, 2757,
+
+ 2757, 2757, 2755, 0, 2758, 2758, 2758, 2758, 0, 0,
+ 2756, 0, 0, 0, 2757, 0, 2755, 0, 2755, 0,
+ 2758, 0, 0, 0, 0, 2756, 2755, 0, 0, 2757,
+ 0, 0, 0, 0, 2756, 2758, 0, 2756, 2757, 2757,
+ 0, 2758, 0, 0, 2758, 0, 0, 0, 0, 0,
+ 2756, 0, 0, 0, 2757, 0, 0, 0, 2756, 0,
+ 2758, 2756, 2757, 2757, 0, 2758, 0, 0, 2758, 2763,
+ 2763, 2763, 2763, 2764, 2764, 2764, 2764, 0, 0, 2765,
+ 2765, 2765, 2765, 0, 0, 2763, 0, 0, 0, 2764,
+ 0, 0, 0, 0, 0, 2765, 2763, 0, 0, 0,
+
+ 2763, 0, 0, 0, 2764, 0, 0, 0, 0, 2763,
+ 2765, 0, 0, 2764, 2766, 2766, 2766, 2766, 0, 2765,
+ 0, 2763, 0, 0, 0, 2763, 0, 0, 0, 2764,
+ 2766, 0, 0, 2763, 0, 2765, 0, 2764, 0, 0,
+ 0, 2766, 0, 2765, 0, 2766, 2768, 2768, 2768, 2768,
+ 0, 0, 0, 0, 2766, 0, 0, 2769, 2769, 2769,
+ 2769, 0, 2768, 0, 0, 0, 2766, 0, 0, 0,
+ 2766, 2768, 0, 2769, 0, 0, 0, 2768, 2766, 0,
+ 0, 0, 0, 0, 0, 0, 2768, 0, 2769, 2770,
+ 2770, 2770, 2770, 0, 0, 0, 2768, 2769, 0, 0,
+
+ 0, 0, 2768, 0, 0, 2770, 2775, 2775, 2775, 2775,
+ 2768, 0, 0, 2769, 0, 0, 0, 0, 0, 0,
+ 2770, 2769, 2775, 2776, 2776, 2776, 2776, 0, 0, 2770,
+ 0, 0, 0, 2777, 2777, 2777, 2777, 2775, 0, 2776,
+ 0, 0, 0, 0, 0, 2770, 2775, 2775, 0, 2777,
+ 0, 0, 0, 2770, 2776, 0, 0, 0, 0, 0,
+ 2776, 0, 2775, 2776, 2777, 0, 2777, 0, 0, 0,
+ 2775, 2775, 0, 2777, 2778, 2778, 2778, 2778, 0, 2776,
+ 0, 0, 0, 0, 2776, 0, 0, 2776, 0, 2777,
+ 2778, 2777, 2779, 2779, 2779, 2779, 0, 2777, 0, 0,
+
+ 0, 0, 0, 0, 0, 2778, 0, 0, 2779, 0,
+ 0, 2778, 0, 0, 2778, 2780, 2780, 2780, 2780, 0,
+ 0, 0, 0, 2779, 0, 0, 0, 0, 0, 2779,
+ 2778, 2780, 2779, 0, 0, 2778, 0, 0, 2778, 0,
+ 2780, 2781, 2781, 2781, 2781, 0, 2780, 0, 2779, 0,
+ 0, 0, 0, 2779, 0, 2780, 2779, 2781, 2783, 2783,
+ 2783, 2783, 0, 0, 0, 2780, 0, 0, 0, 0,
+ 0, 2780, 2781, 0, 2783, 0, 0, 0, 2781, 2780,
+ 0, 2781, 0, 0, 0, 0, 0, 0, 0, 2783,
+ 0, 0, 0, 0, 0, 0, 0, 2781, 2783, 0,
+
+ 0, 0, 2781, 0, 0, 2781, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2783, 0, 2787, 2787, 2787, 2787,
+ 0, 0, 2783, 2784, 2784, 2784, 2784, 2788, 2788, 2788,
+ 2788, 0, 2787, 0, 2784, 0, 0, 0, 0, 2784,
+ 0, 0, 0, 2788, 0, 0, 0, 2787, 0, 2787,
+ 2790, 2790, 2790, 2790, 2784, 0, 2787, 0, 2788, 0,
+ 0, 0, 2784, 2784, 2788, 0, 2790, 2788, 2789, 2789,
+ 2789, 2789, 2787, 0, 2787, 2790, 0, 0, 0, 2784,
+ 2787, 2790, 0, 2788, 2789, 0, 2784, 2784, 2788, 0,
+ 2790, 2788, 0, 0, 2791, 2791, 2791, 2791, 0, 2789,
+
+ 2790, 0, 0, 0, 0, 2789, 2790, 0, 2789, 0,
+ 2791, 0, 0, 0, 2790, 0, 0, 2793, 2793, 2793,
+ 2793, 0, 0, 0, 2789, 2791, 0, 0, 0, 2789,
+ 0, 2791, 2789, 2793, 2791, 0, 2794, 2794, 2794, 2794,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2793, 0,
+ 2791, 0, 2794, 0, 2793, 2791, 0, 2793, 2791, 2792,
+ 2792, 2792, 2792, 0, 0, 0, 0, 2794, 0, 0,
+ 2792, 0, 0, 2793, 0, 2792, 2794, 0, 2793, 0,
+ 0, 2793, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2792, 0, 2794, 0, 0, 0, 0, 0, 2792, 2792,
+
+ 2794, 2797, 2797, 2797, 2797, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2792, 0, 2797, 0, 0,
+ 0, 0, 2792, 2792, 2795, 2795, 2795, 2795, 0, 0,
+ 0, 0, 2797, 0, 0, 2795, 2798, 2798, 2798, 2798,
+ 2795, 2797, 2797, 0, 0, 0, 2799, 2799, 2799, 2799,
+ 0, 0, 2798, 0, 0, 2795, 0, 2797, 2800, 2800,
+ 2800, 2800, 2799, 2795, 2795, 2797, 2797, 2798, 2801, 2801,
+ 2801, 2801, 0, 2798, 2800, 0, 2798, 2799, 0, 2799,
+ 2795, 0, 0, 0, 2801, 0, 2799, 2795, 2795, 2800,
+ 0, 0, 2798, 0, 0, 2800, 0, 2798, 2800, 2801,
+
+ 2798, 0, 2799, 0, 2799, 2801, 0, 0, 2801, 0,
+ 2799, 0, 0, 0, 2800, 2802, 2802, 2802, 2802, 2800,
+ 0, 0, 2800, 0, 2801, 0, 0, 0, 0, 2801,
+ 0, 2802, 2801, 2806, 2806, 2806, 2806, 0, 0, 0,
+ 2802, 0, 0, 0, 0, 0, 2802, 0, 0, 2806,
+ 0, 2808, 2808, 2808, 2808, 2802, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2806, 2802, 0, 2808, 0, 0,
+ 2806, 2802, 0, 2806, 0, 0, 0, 0, 0, 2802,
+ 0, 0, 2808, 0, 0, 0, 0, 0, 2808, 2806,
+ 0, 2808, 0, 0, 2806, 0, 0, 2806, 2807, 2807,
+
+ 2807, 2807, 2810, 2810, 2810, 2810, 0, 2808, 0, 2807,
+ 0, 0, 2808, 0, 2807, 2808, 0, 0, 2810, 0,
+ 0, 0, 0, 0, 2815, 2815, 2815, 2815, 0, 2807,
+ 0, 0, 0, 2810, 0, 0, 0, 2807, 2807, 0,
+ 2815, 0, 2810, 0, 2816, 2816, 2816, 2816, 0, 0,
+ 0, 0, 0, 0, 2807, 2815, 0, 2815, 2810, 0,
+ 2816, 2807, 2807, 0, 2815, 0, 2810, 2811, 2811, 2811,
+ 2811, 0, 0, 0, 0, 2816, 0, 0, 2811, 0,
+ 2815, 2816, 2815, 2811, 2816, 0, 0, 0, 2815, 0,
+ 0, 0, 0, 0, 2818, 2818, 2818, 2818, 2811, 0,
+
+ 2816, 2817, 2817, 2817, 2817, 2816, 2811, 2811, 2816, 0,
+ 2818, 2819, 2819, 2819, 2819, 0, 0, 2817, 0, 0,
+ 0, 2818, 0, 2811, 0, 2818, 0, 2819, 0, 0,
+ 2811, 2811, 2817, 0, 2818, 0, 0, 0, 2817, 0,
+ 0, 2817, 2819, 0, 0, 0, 2818, 0, 0, 0,
+ 2818, 2819, 0, 2822, 2822, 2822, 2822, 2817, 2818, 0,
+ 0, 0, 2817, 0, 2822, 2817, 0, 2819, 0, 2822,
+ 2823, 2823, 2823, 2823, 0, 2819, 2821, 2821, 2821, 2821,
+ 0, 2823, 0, 0, 2822, 0, 2823, 2821, 2824, 2824,
+ 2824, 2824, 2821, 2822, 0, 0, 0, 0, 0, 2824,
+
+ 0, 2823, 0, 0, 2824, 0, 0, 2821, 0, 2822,
+ 2823, 2825, 2825, 2825, 2825, 2821, 2821, 2822, 0, 2824,
+ 0, 0, 2828, 2828, 2828, 2828, 2823, 2825, 2824, 0,
+ 0, 0, 2821, 0, 2823, 0, 0, 0, 2828, 2821,
+ 2821, 0, 2825, 0, 2824, 2829, 2829, 2829, 2829, 2828,
+ 0, 2825, 2824, 2828, 0, 0, 0, 2830, 2830, 2830,
+ 2830, 2829, 2828, 0, 0, 0, 0, 2825, 2830, 0,
+ 0, 0, 0, 2830, 2828, 2825, 2829, 0, 2828, 2831,
+ 2831, 2831, 2831, 0, 0, 2829, 2828, 0, 2830, 0,
+ 2831, 2832, 2832, 2832, 2832, 2831, 0, 2830, 0, 0,
+
+ 0, 2829, 2832, 0, 0, 0, 0, 2832, 0, 2829,
+ 2831, 0, 0, 2830, 2833, 2833, 2833, 2833, 0, 2831,
+ 0, 2830, 2832, 0, 0, 0, 0, 0, 0, 0,
+ 2833, 2832, 0, 0, 0, 2831, 0, 2835, 2835, 2835,
+ 2835, 0, 0, 2831, 0, 2833, 0, 2832, 2835, 0,
+ 0, 0, 0, 2835, 2833, 2832, 2836, 2836, 2836, 2836,
+ 2837, 2837, 2837, 2837, 0, 0, 0, 2836, 2835, 0,
+ 2833, 2837, 2836, 0, 0, 0, 2837, 2835, 2833, 2834,
+ 2834, 2834, 2834, 2844, 2844, 2844, 2844, 2836, 0, 0,
+ 2834, 2837, 0, 2835, 0, 2834, 2836, 0, 0, 2844,
+
+ 2837, 2835, 0, 0, 0, 2840, 2840, 2840, 2840, 0,
+ 2834, 0, 2836, 0, 2844, 0, 2837, 0, 2834, 2834,
+ 2836, 2840, 0, 2844, 2837, 2841, 2841, 2841, 2841, 0,
+ 0, 0, 0, 0, 0, 2834, 2840, 0, 2840, 2844,
+ 0, 2841, 2834, 2834, 0, 2840, 0, 2844, 2842, 2842,
+ 2842, 2842, 0, 0, 0, 0, 2841, 0, 0, 0,
+ 0, 2840, 2841, 2840, 2842, 2841, 0, 0, 0, 2840,
+ 0, 2843, 2843, 2843, 2843, 0, 0, 0, 0, 2842,
+ 0, 2841, 0, 0, 0, 2842, 2841, 2843, 2842, 2841,
+ 2845, 2845, 2845, 2845, 2846, 2846, 2846, 2846, 2843, 0,
+
+ 0, 2845, 2843, 0, 2842, 2846, 2845, 0, 0, 2842,
+ 2846, 2843, 2842, 2849, 2849, 2849, 2849, 2850, 2850, 2850,
+ 2850, 2845, 0, 2843, 2849, 2846, 0, 2843, 2850, 2849,
+ 2845, 0, 0, 2850, 2846, 2843, 2851, 2851, 2851, 2851,
+ 0, 0, 0, 0, 2849, 0, 2845, 2851, 2850, 0,
+ 2846, 0, 2851, 2849, 2845, 0, 0, 2850, 2846, 2855,
+ 2855, 2855, 2855, 0, 0, 0, 0, 2851, 0, 2849,
+ 2855, 0, 0, 2850, 0, 2855, 2851, 2849, 0, 0,
+ 0, 2850, 2856, 2856, 2856, 2856, 0, 0, 0, 0,
+ 2855, 0, 2851, 2856, 2857, 2857, 2857, 2857, 2856, 2855,
+
+ 2851, 2854, 2854, 2854, 2854, 2857, 0, 0, 0, 0,
+ 2857, 0, 2854, 2856, 0, 2855, 0, 2854, 0, 0,
+ 0, 0, 2856, 2855, 0, 2857, 0, 0, 2859, 2859,
+ 2859, 2859, 2854, 0, 2857, 0, 0, 0, 2856, 2859,
+ 2854, 2854, 0, 0, 2859, 0, 2856, 0, 0, 0,
+ 2857, 2860, 2860, 2860, 2860, 0, 0, 2854, 2857, 2859,
+ 0, 0, 2860, 0, 2854, 2854, 0, 2860, 2859, 2862,
+ 2862, 2862, 2862, 2863, 2863, 2863, 2863, 0, 0, 0,
+ 0, 0, 2860, 0, 2859, 2862, 0, 0, 0, 2863,
+ 0, 2860, 2859, 0, 0, 0, 2862, 0, 2863, 0,
+
+ 2862, 0, 0, 0, 2863, 0, 0, 2860, 0, 2862,
+ 0, 0, 0, 2863, 0, 2860, 2864, 2864, 2864, 2864,
+ 0, 2862, 0, 2863, 0, 2862, 0, 0, 0, 2863,
+ 0, 0, 2864, 2862, 0, 0, 0, 2863, 2868, 2868,
+ 2868, 2868, 0, 0, 0, 0, 0, 2864, 0, 2868,
+ 0, 0, 0, 2864, 2868, 0, 2864, 0, 0, 2869,
+ 2869, 2869, 2869, 0, 0, 0, 0, 0, 0, 2868,
+ 2869, 0, 2864, 0, 0, 2869, 0, 2864, 2868, 0,
+ 2864, 2865, 2865, 2865, 2865, 2870, 2870, 2870, 2870, 0,
+ 2869, 0, 2865, 0, 2868, 0, 2870, 2865, 0, 2869,
+
+ 0, 2870, 2868, 2871, 2871, 2871, 2871, 0, 0, 0,
+ 0, 0, 2865, 0, 0, 2869, 2870, 0, 0, 2871,
+ 2865, 2865, 0, 2869, 0, 2870, 2874, 2874, 2874, 2874,
+ 0, 0, 0, 0, 2871, 0, 0, 2865, 0, 0,
+ 0, 2870, 2874, 2871, 2865, 2865, 0, 0, 0, 2870,
+ 0, 0, 0, 0, 0, 0, 0, 2874, 0, 2871,
+ 0, 0, 0, 2874, 0, 0, 2874, 2871, 2876, 2876,
+ 2876, 2876, 2877, 2877, 2877, 2877, 0, 0, 0, 2876,
+ 0, 0, 2874, 2877, 2876, 0, 0, 2874, 2877, 0,
+ 2874, 2875, 2875, 2875, 2875, 2878, 2878, 2878, 2878, 2876,
+
+ 0, 0, 2875, 2877, 0, 0, 2878, 2875, 2876, 0,
+ 0, 2878, 2877, 2880, 2880, 2880, 2880, 2881, 2881, 2881,
+ 2881, 0, 2875, 0, 2876, 0, 2878, 0, 2877, 2880,
+ 2875, 2875, 2876, 2881, 0, 2878, 2877, 0, 0, 0,
+ 2880, 0, 2881, 0, 2880, 0, 0, 2875, 2881, 0,
+ 0, 2878, 0, 2880, 2875, 2875, 0, 2881, 0, 2878,
+ 2882, 2882, 2882, 2882, 0, 2880, 0, 2881, 0, 2880,
+ 0, 0, 0, 2881, 0, 0, 2882, 2880, 0, 0,
+ 0, 2881, 2885, 2885, 2885, 2885, 0, 0, 0, 0,
+ 0, 2882, 0, 2885, 0, 0, 0, 2882, 2885, 0,
+
+ 2882, 0, 0, 2886, 2886, 2886, 2886, 0, 0, 0,
+ 0, 0, 0, 2885, 2886, 0, 2882, 0, 0, 2886,
+ 0, 2882, 2885, 0, 2882, 2883, 2883, 2883, 2883, 2887,
+ 2887, 2887, 2887, 0, 2886, 0, 2883, 0, 2885, 0,
+ 2887, 2883, 0, 2886, 0, 2887, 2885, 2888, 2888, 2888,
+ 2888, 2890, 2890, 2890, 2890, 0, 2883, 0, 2888, 2886,
+ 2887, 0, 2890, 2888, 2883, 2883, 0, 2886, 0, 2887,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2888, 0,
+ 0, 2883, 2890, 0, 0, 2887, 0, 2888, 2883, 2883,
+ 0, 2890, 0, 2887, 2889, 2889, 2889, 2889, 2891, 2891,
+
+ 2891, 2891, 0, 2888, 0, 2889, 0, 2890, 0, 0,
+ 2889, 2888, 0, 0, 2891, 2890, 2892, 2892, 2892, 2892,
+ 2893, 2893, 2893, 2893, 0, 2889, 0, 0, 0, 2891,
+ 0, 2893, 2892, 0, 2889, 2891, 2893, 0, 2891, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2892, 0, 0,
+ 2889, 2893, 0, 0, 2891, 0, 2892, 0, 2889, 2891,
+ 2893, 0, 2891, 2894, 2894, 2894, 2894, 2895, 2895, 2895,
+ 2895, 0, 2892, 0, 2894, 0, 2893, 0, 0, 2894,
+ 2892, 0, 0, 2895, 2893, 2896, 2896, 2896, 2896, 2897,
+ 2897, 2897, 2897, 0, 2894, 0, 2896, 0, 2895, 0,
+
+ 2897, 2896, 0, 2894, 0, 2897, 0, 2895, 2898, 2898,
+ 2898, 2898, 2900, 2900, 2900, 2900, 2896, 0, 0, 2894,
+ 2897, 0, 0, 2895, 2898, 2896, 0, 2894, 2900, 2897,
+ 0, 2895, 0, 0, 2899, 2899, 2899, 2899, 0, 2898,
+ 0, 2896, 0, 2900, 0, 2897, 0, 0, 2898, 2896,
+ 2899, 0, 2900, 2897, 2903, 2903, 2903, 2903, 0, 0,
+ 0, 0, 0, 0, 2898, 2899, 0, 0, 2900, 0,
+ 2903, 2899, 2898, 0, 2899, 0, 2900, 2901, 2901, 2901,
+ 2901, 2902, 2902, 2902, 2902, 2903, 0, 0, 2901, 0,
+ 2899, 0, 2902, 2901, 2903, 2899, 0, 2902, 2899, 0,
+
+ 2906, 2906, 2906, 2906, 2907, 2907, 2907, 2907, 2901, 0,
+ 2903, 2906, 2902, 0, 0, 2907, 2906, 2901, 2903, 0,
+ 2907, 2902, 0, 2908, 2908, 2908, 2908, 2909, 2909, 2909,
+ 2909, 2906, 0, 2901, 0, 2907, 0, 2902, 2909, 2908,
+ 2906, 2901, 0, 2909, 2907, 2902, 2904, 2904, 2904, 2904,
+ 0, 0, 0, 0, 2908, 0, 2906, 2904, 2909, 0,
+ 2907, 0, 2904, 2908, 2906, 0, 0, 2909, 2907, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2904, 0, 2908,
+ 0, 0, 0, 2909, 0, 2904, 2904, 2908, 0, 0,
+ 0, 2909, 2910, 2910, 2910, 2910, 0, 0, 0, 0,
+
+ 0, 0, 2904, 2910, 2911, 2911, 2911, 2911, 2910, 2904,
+ 2904, 2905, 2905, 2905, 2905, 0, 0, 0, 0, 0,
+ 2911, 0, 2905, 2910, 0, 0, 0, 2905, 0, 0,
+ 0, 0, 2910, 0, 0, 2911, 0, 0, 0, 0,
+ 0, 0, 2905, 0, 2911, 0, 0, 0, 2910, 0,
+ 2905, 2905, 0, 0, 0, 0, 2910, 0, 0, 0,
+ 2911, 0, 0, 0, 0, 0, 0, 2905, 2911, 0,
+ 0, 0, 0, 0, 2905, 2905, 2913, 2913, 2913, 2913,
+ 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2913,
+ 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2913, 2914, 2914,
+
+ 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914,
+ 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914, 2914,
+ 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915,
+ 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915, 2915,
+ 2915, 2915, 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916,
+ 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916, 2916,
+ 2916, 2916, 2916, 2916, 2917, 2917, 2917, 2917, 2917, 2917,
+ 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917,
+ 2917, 2917, 2917, 2917, 2917, 2917, 2918, 2918, 2918, 2918,
+ 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918,
+
+ 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2918, 2919, 2919,
+ 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919,
+ 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919, 2919,
+ 2920, 2920, 2920, 2920, 2920, 0, 0, 0, 0, 0,
+ 0, 0, 2920, 2920, 2920, 0, 0, 2920, 2920, 2920,
+ 2920, 2921, 2921, 2921, 2921, 2921, 0, 0, 0, 0,
+ 0, 0, 0, 2921, 0, 0, 0, 0, 2921, 2921,
+ 2921, 2921, 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922, 2922,
+ 2922, 2922, 2922, 2922, 2923, 2923, 2923, 2923, 2924, 2924,
+
+ 2924, 2924, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2924, 2924, 2924, 0, 2924, 2924, 2924, 2924, 2925,
+ 2925, 2925, 2925, 2925, 0, 0, 0, 0, 2925, 2925,
+ 0, 2925, 2925, 2925, 2925, 0, 2925, 2925, 2925, 2925,
+ 2926, 2926, 0, 2926, 2926, 2926, 2926, 2926, 2926, 2926,
+ 2926, 2926, 2926, 2926, 2926, 2926, 2926, 2926, 2926, 2926,
+ 2926, 2926, 2927, 0, 0, 2927, 0, 0, 2927, 0,
+ 0, 2927, 2927, 2927, 0, 0, 0, 2927, 2927, 0,
+ 2927, 2928, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2928, 0, 0, 2928, 2928, 2928, 2928, 2929, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2929,
+ 0, 0, 2929, 2929, 2929, 2929, 2930, 0, 0, 2930,
+ 0, 0, 2930, 0, 0, 2930, 2930, 2930, 2930, 0,
+ 0, 2930, 2930, 0, 0, 2930, 2931, 2931, 0, 2931,
+ 2931, 2931, 2931, 2931, 2931, 2931, 2931, 2931, 2931, 2931,
+ 2931, 2931, 2931, 2931, 2931, 2931, 2931, 2931, 2932, 0,
+ 0, 0, 0, 2932, 0, 2932, 2932, 2932, 0, 0,
+ 2932, 2932, 2933, 0, 0, 2933, 2933, 2933, 2933, 2934,
+ 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934, 2934,
+ 2934, 2934, 2934, 2934, 2934, 0, 0, 2934, 2934, 2934,
+
+ 2934, 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2935, 0,
+ 0, 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2935, 2935,
+ 2935, 2935, 2935, 2936, 0, 0, 0, 0, 2936, 2936,
+ 0, 2936, 0, 2936, 0, 0, 2936, 2936, 2936, 2936,
+ 2937, 2937, 0, 2937, 2937, 2937, 2937, 2937, 0, 0,
+ 2937, 2937, 0, 0, 2937, 2937, 2937, 2937, 2937, 2937,
+ 2937, 2937, 2938, 2938, 0, 2938, 2938, 2938, 2938, 2938,
+ 2938, 2938, 2938, 2938, 2938, 2938, 2938, 2938, 2938, 2938,
+ 2938, 2938, 2938, 2938, 2939, 2939, 2939, 2939, 2939, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 2939, 2939, 2939, 2939, 2940, 2940, 2940, 2940, 2940,
+ 0, 0, 0, 0, 2940, 2940, 0, 2940, 0, 2940,
+ 2940, 0, 2940, 2940, 2940, 2940, 2941, 2941, 2941, 2941,
+ 2941, 0, 0, 0, 0, 2941, 2941, 0, 2941, 2941,
+ 2941, 2941, 0, 2941, 2941, 2941, 2941, 2942, 2942, 2942,
+ 2942, 0, 0, 0, 2942, 2942, 0, 0, 0, 0,
+ 2942, 2942, 0, 0, 2942, 2942, 2942, 2942, 2943, 2943,
+ 0, 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2943,
+ 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2943,
+ 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944,
+
+ 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944, 2944,
+ 2944, 2944, 2945, 0, 0, 2945, 2945, 2945, 2945, 2946,
+ 0, 0, 0, 0, 2946, 0, 2946, 2946, 2946, 0,
+ 0, 2946, 2946, 2947, 2947, 2947, 2947, 2947, 0, 0,
+ 0, 0, 2947, 2947, 0, 2947, 2947, 2947, 2947, 0,
+ 2947, 2947, 2947, 2947, 2948, 0, 0, 2948, 0, 0,
+ 2948, 0, 0, 2948, 2948, 2948, 0, 0, 0, 2948,
+ 2948, 0, 2948, 2949, 2949, 0, 2949, 2949, 2949, 2949,
+ 2949, 2949, 2949, 2949, 2949, 2949, 2949, 2949, 2949, 2949,
+ 2949, 2949, 2949, 2949, 2949, 2950, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 2950, 0, 0, 2950, 2950,
+ 2950, 2950, 2951, 2951, 0, 2951, 2951, 2951, 2951, 2951,
+ 2951, 2951, 2951, 2951, 2951, 2951, 2951, 2951, 2951, 2951,
+ 2951, 2951, 2951, 2951, 2952, 2952, 0, 2952, 2952, 2952,
+ 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952,
+ 2952, 2952, 2952, 2952, 2952, 2952, 2953, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2953, 0, 0,
+ 2953, 2953, 2953, 2953, 2954, 0, 0, 2954, 0, 0,
+ 2954, 0, 0, 2954, 2954, 2954, 2954, 0, 0, 2954,
+ 2954, 0, 0, 2954, 2955, 2955, 0, 2955, 2955, 2955,
+
+ 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955, 2955,
+ 2955, 2955, 2955, 2955, 2955, 2955, 2956, 0, 0, 0,
+ 0, 2956, 0, 2956, 2956, 2956, 0, 0, 2956, 2956,
+ 2957, 0, 0, 2957, 2957, 2957, 2957, 2958, 2958, 2958,
+ 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958, 2958,
+ 2958, 2958, 2958, 0, 0, 2958, 2958, 2958, 2958, 2959,
+ 2959, 2959, 2959, 2959, 2959, 2959, 2959, 2959, 2959, 2959,
+ 2959, 2959, 2959, 2959, 2959, 2959, 2959, 2959, 2959, 2959,
+ 2959, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 0,
+ 0, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960,
+
+ 2960, 2960, 2960, 2961, 2961, 2961, 2961, 2961, 2961, 2961,
+ 2961, 2961, 2961, 2961, 2961, 2961, 2961, 2961, 2961, 2961,
+ 2961, 2961, 2961, 2961, 2961, 2962, 0, 0, 0, 0,
+ 2962, 2962, 0, 2962, 0, 2962, 0, 0, 2962, 2962,
+ 2962, 2962, 2963, 2963, 0, 2963, 2963, 2963, 2963, 2963,
+ 0, 0, 2963, 2963, 0, 0, 2963, 2963, 2963, 2963,
+ 2963, 2963, 2963, 2963, 2964, 2964, 0, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964, 2964,
+ 2964, 2964, 2964, 2964, 2964, 2964, 2965, 2965, 0, 2965,
+ 2965, 2965, 2965, 2965, 2965, 2965, 2965, 2965, 2965, 2965,
+
+ 2965, 2965, 2965, 2965, 2965, 2965, 2965, 2965, 2966, 2966,
+ 2966, 2966, 2966, 0, 0, 0, 0, 2966, 2966, 0,
+ 2966, 0, 2966, 2966, 0, 2966, 2966, 2966, 2966, 2967,
+ 2967, 2967, 2967, 0, 0, 0, 2967, 2967, 0, 0,
+ 0, 0, 2967, 2967, 0, 0, 2967, 2967, 2967, 2967,
+ 2968, 2968, 2968, 2968, 0, 0, 0, 2968, 2968, 0,
+ 0, 0, 0, 2968, 2968, 0, 0, 2968, 2968, 2968,
+ 2968, 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969, 2969,
+ 2969, 2969, 2969, 2970, 2970, 2970, 2970, 2970, 2970, 2970,
+
+ 2970, 2970, 2970, 2970, 2970, 2970, 2970, 2970, 2970, 2970,
+ 2970, 2970, 2970, 2970, 2970, 2971, 0, 0, 2971, 2971,
+ 2971, 2971, 2972, 2972, 2972, 2972, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2972, 2972, 2972, 0, 2972,
+ 2972, 2972, 2972, 2973, 0, 0, 0, 0, 2973, 0,
+ 2973, 2973, 2973, 0, 0, 2973, 2973, 2974, 2974, 2974,
+ 2974, 2974, 0, 0, 0, 0, 2974, 2974, 0, 2974,
+ 2974, 2974, 2974, 0, 2974, 2974, 2974, 2974, 2975, 2975,
+ 0, 2975, 2975, 2975, 2975, 2975, 2975, 2975, 2975, 2975,
+ 2975, 2975, 2975, 2975, 2975, 2975, 2975, 2975, 2975, 2975,
+
+ 2976, 2976, 0, 2976, 2976, 2976, 2976, 2976, 2976, 2976,
+ 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976,
+ 2976, 2976, 2977, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2977, 0, 0, 2977, 2977, 2977, 2977, 2978,
+ 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978,
+ 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978,
+ 2978, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979,
+ 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979, 2979,
+ 2979, 2979, 2979, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
+ 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980, 2980,
+
+ 2980, 2980, 2980, 2980, 2980, 2981, 2981, 2981, 2981, 2981,
+ 2981, 2981, 2981, 2981, 2981, 2981, 2981, 2981, 2981, 2981,
+ 2981, 2981, 2981, 2981, 2981, 2981, 2981, 2982, 2982, 2982,
+ 2982, 2982, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2982, 2982, 2982, 2982, 2982, 2983, 2983,
+ 2983, 2983, 2983, 2983, 2983, 2983, 2983, 2983, 2983, 2983,
+ 2983, 2983, 2983, 2983, 2983, 2983, 2983, 2983, 2983, 2983,
+ 2984, 2984, 0, 2984, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984, 2984,
+ 2984, 2984, 2985, 2985, 2985, 2985, 2985, 0, 0, 0,
+
+ 0, 2985, 2985, 0, 2985, 0, 2985, 0, 2985, 2985,
+ 2985, 2985, 2985, 2986, 2986, 2986, 2986, 2986, 2986, 2986,
+ 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986,
+ 2986, 2986, 2986, 2986, 2986, 2987, 2987, 2987, 2987, 2987,
+ 0, 0, 0, 0, 2987, 2987, 0, 2987, 2987, 2987,
+ 2987, 0, 2987, 2987, 2987, 2987, 2988, 2988, 2988, 2988,
+ 0, 0, 0, 2988, 2988, 0, 0, 0, 2988, 2988,
+ 2988, 0, 0, 2988, 2988, 2988, 2988, 2989, 2989, 2989,
+ 2989, 0, 0, 0, 2989, 2989, 0, 0, 0, 2989,
+ 2989, 2989, 0, 0, 2989, 2989, 2989, 2989, 2990, 2990,
+
+ 2990, 2990, 2990, 0, 0, 0, 0, 2990, 2990, 0,
+ 2990, 2990, 2990, 2990, 0, 2990, 2990, 2990, 2990, 2991,
+ 2991, 2991, 2991, 2991, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2991, 0, 2991, 2991, 2991, 2991,
+ 2992, 2992, 2992, 2992, 2992, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2992, 2992, 2992, 0, 2992, 2992, 2992,
+ 2992, 2993, 2993, 2993, 2993, 2993, 0, 0, 2993, 0,
+ 2993, 2993, 0, 2993, 0, 2993, 2993, 0, 2993, 2993,
+ 2993, 2993, 2994, 2994, 2994, 2994, 2994, 0, 0, 2994,
+ 0, 2994, 2994, 0, 2994, 2994, 2994, 2994, 0, 2994,
+
+ 2994, 2994, 2994, 2995, 2995, 2995, 2995, 0, 0, 0,
+ 2995, 2995, 0, 0, 0, 2995, 2995, 2995, 0, 0,
+ 2995, 2995, 2995, 2995, 2996, 2996, 2996, 2996, 2996, 0,
+ 0, 2996, 0, 2996, 2996, 0, 2996, 2996, 2996, 2996,
+ 0, 2996, 2996, 2996, 2996, 2997, 2997, 2997, 2997, 2997,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2997, 0, 2997, 2997, 2997, 2997, 2998, 2998, 2998, 2998,
+ 2998, 0, 0, 0, 0, 0, 0, 0, 0, 2998,
+ 2998, 2998, 0, 2998, 2998, 2998, 2998, 2999, 2999, 2999,
+ 2999, 2999, 0, 0, 2999, 0, 2999, 2999, 0, 2999,
+
+ 0, 2999, 0, 0, 2999, 2999, 2999, 2999, 3000, 3000,
+ 3000, 3000, 3000, 0, 0, 3000, 0, 3000, 3000, 0,
+ 3000, 3000, 3000, 3000, 0, 3000, 3000, 3000, 3000, 3001,
+ 3001, 0, 3001, 3001, 3001, 3001, 3001, 3001, 3001, 3001,
+ 3001, 3001, 3001, 3001, 3001, 3001, 3001, 3001, 3001, 3001,
+ 3001, 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002,
+ 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002, 3002,
+ 3002, 3002, 3002, 3003, 3003, 3003, 3003, 3003, 3003, 3003,
+ 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003, 3003,
+ 3003, 3003, 3003, 3003, 3003, 3004, 3004, 3004, 3004, 3004,
+
+ 3004, 3004, 3004, 3004, 3004, 3004, 3004, 3004, 3004, 3004,
+ 3004, 3004, 3004, 3004, 3004, 3004, 3004, 3005, 0, 0,
+ 0, 0, 3005, 3005, 0, 3005, 0, 3005, 0, 0,
+ 3005, 3005, 3005, 3005, 3006, 3006, 3006, 3006, 3006, 0,
+ 0, 0, 0, 3006, 3006, 0, 3006, 3006, 3006, 3006,
+ 0, 3006, 3006, 3006, 3006, 3007, 3007, 3007, 3007, 3007,
+ 3007, 3007, 3007, 3007, 3007, 3007, 3007, 3007, 3007, 3007,
+ 3007, 3007, 3007, 3007, 3007, 3007, 3007, 3008, 3008, 3008,
+ 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008,
+ 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3008, 3009,
+
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009, 3009,
+ 3009, 3010, 3010, 3010, 3010, 3010, 0, 0, 0, 0,
+ 3010, 3010, 0, 3010, 3010, 3010, 3010, 0, 3010, 3010,
+ 3010, 3010, 3011, 3011, 3011, 3011, 3011, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3011, 3011, 3011, 0, 3011,
+ 3011, 3011, 3011, 3012, 3012, 3012, 3012, 3012, 3012, 3012,
+ 3012, 3012, 3012, 3012, 3012, 3012, 3012, 3012, 3012, 3012,
+ 3012, 3012, 3012, 3012, 3012, 3013, 3013, 3013, 3013, 3013,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 3013, 0, 3013, 3013, 3013, 3013, 3014, 3014, 3014, 3014,
+ 3014, 0, 0, 0, 0, 0, 0, 0, 0, 3014,
+ 3014, 3014, 0, 3014, 3014, 3014, 3014, 3015, 3015, 3015,
+ 3015, 3015, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3015, 3015, 3015, 3015, 3016, 0,
+ 0, 0, 0, 3016, 3016, 0, 3016, 0, 3016, 0,
+ 0, 3016, 3016, 3016, 3016, 3017, 3017, 3017, 3017, 3017,
+ 0, 0, 0, 0, 3017, 3017, 0, 3017, 3017, 3017,
+ 3017, 0, 3017, 3017, 3017, 3017, 3018, 3018, 0, 3018,
+ 3018, 3018, 3018, 3018, 3018, 3018, 3018, 3018, 3018, 3018,
+
+ 3018, 3018, 3018, 3018, 3018, 3018, 3018, 3018, 3019, 3019,
+ 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019,
+ 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019, 3019,
+ 3020, 3020, 3020, 3020, 3020, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3020, 3020, 3020,
+ 3020, 3021, 3021, 3021, 3021, 3021, 0, 0, 0, 0,
+ 3021, 3021, 0, 3021, 0, 3021, 0, 0, 3021, 3021,
+ 3021, 3021, 3022, 3022, 3022, 3022, 3022, 0, 0, 0,
+ 0, 3022, 3022, 0, 3022, 3022, 3022, 3022, 0, 3022,
+ 3022, 3022, 3022, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
+
+ 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023,
+ 3023, 3023, 3023, 3023, 3023, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024,
+ 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3025, 3025, 3025,
+ 3025, 3025, 0, 0, 0, 0, 3025, 3025, 0, 3025,
+ 0, 3025, 0, 3025, 3025, 3025, 3025, 3025, 3026, 3026,
+ 0, 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
+ 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026, 3026,
+ 3027, 3027, 3027, 3027, 3027, 3027, 3027, 3027, 3027, 3027,
+ 3027, 3027, 3027, 3027, 3027, 3027, 3027, 3027, 3027, 3027,
+
+ 3027, 3027, 3028, 3028, 3028, 3028, 3028, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3028,
+ 3028, 3028, 3028, 3029, 3029, 3029, 3029, 3029, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3029, 3029, 3029, 0,
+ 3029, 3029, 3029, 3029, 3030, 3030, 3030, 3030, 3030, 3030,
+ 3030, 3030, 3030, 3030, 3030, 3030, 3030, 3030, 3030, 3030,
+ 3030, 3030, 3030, 3030, 3030, 3030, 3031, 0, 0, 0,
+ 0, 3031, 3031, 0, 3031, 0, 3031, 0, 0, 3031,
+ 3031, 3031, 3031, 3032, 3032, 3032, 3032, 3032, 0, 0,
+ 0, 0, 3032, 3032, 0, 3032, 3032, 3032, 3032, 0,
+
+ 3032, 3032, 3032, 3032, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033, 3033,
+ 3033, 3033, 3033, 3033, 3033, 3033, 3034, 3034, 3034, 3034,
+ 3034, 3034, 3034, 3034, 3034, 3034, 3034, 3034, 3034, 3034,
+ 3034, 3034, 3034, 3034, 3034, 3034, 3034, 3034, 3035, 3035,
+ 0, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035,
+ 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+ 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036, 3036,
+ 3036, 3036, 3037, 3037, 3037, 3037, 3037, 3037, 3037, 3037,
+
+ 3037, 3037, 3037, 3037, 3037, 3037, 3037, 3037, 3037, 3037,
+ 3037, 3037, 3037, 3037, 3038, 3038, 3038, 3038, 3038, 3038,
+ 3038, 3038, 3038, 3038, 3038, 3038, 3038, 3038, 3038, 3038,
+ 3038, 3038, 3038, 3038, 3038, 3038, 3039, 3039, 3039, 3039,
+ 3039, 3039, 3039, 3039, 3039, 3039, 3039, 3039, 3039, 3039,
+ 3039, 3039, 3039, 3039, 3039, 3039, 3039, 3039, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040, 3040,
+ 3041, 3041, 3041, 3041, 3041, 3041, 3041, 3041, 3041, 3041,
+ 3041, 3041, 3041, 3041, 3041, 3041, 3041, 3041, 3041, 3041,
+
+ 3041, 3041, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042,
+ 3042, 3042, 3042, 3042, 3043, 3043, 3043, 3043, 3043, 3043,
+ 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043,
+ 3043, 3043, 3043, 3043, 3043, 3043, 3044, 3044, 3044, 3044,
+ 3044, 3044, 3044, 3044, 3044, 3044, 3044, 3044, 3044, 3044,
+ 3044, 3044, 3044, 3044, 3044, 3044, 3044, 3044, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912, 2912,
+ 2912, 2912, 2912, 2912, 2912, 2912
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int vhdlcodeYY_flex_debug;
+int vhdlcodeYY_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *vhdlcodeYYtext;
+#line 1 "vhdlcode.l"
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/******************************************************************************
+ * Parser for syntax hightlighting and references for vhdl subset
+ * written by M. Kreis
+ * supports VHDL-87
+ * does not support VHDL-AMS
+ ******************************************************************************/
+#line 23 "vhdlcode.l"
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <qregexp.h>
+#include <qdir.h>
+#include <qstringlist.h>
+
+#include "qtbc.h"
+#include "entry.h"
+#include "doxygen.h"
+#include "message.h"
+#include "outputlist.h"
+#include "util.h"
+#include "membername.h"
+#include "searchindex.h"
+#include "vhdldocgen.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
+
+/* -----------------------------------------------------------------
+ * statics
+ */
+
+// ----------------- <vhdl> ----------------------------------
+
+//static bool isPackBody=FALSE;
+//static bool isStartMap;
+static bool isFuncProto=FALSE;
+static bool isComponent=FALSE;
+static bool isPackageBody=FALSE;
+static bool isProto = FALSE;
+
+static QCString g_PrevString;
+static QCString g_CurrClass;
+static QDict<QCString>g_vhdlKeyDict;
+static QCString g_tempClass;
+static QCString g_tempComp;
+static QCString g_PortMapComp;
+static MemberDef *g_vhdlMember;
+static QCString g_FuncProto;
+
+//-----------------------------------------------------------
+
+static CodeOutputInterface * g_code;
+static QCString g_curClassName;
+static QCString g_parmType;
+static QCString g_parmName;
+static const char * g_inputString; //!< the code fragment as text
+static int g_inputPosition; //!< read offset during parsing
+static int g_inputLines; //!< number of line in the code fragment
+static int g_yyLineNr; //!< current line number
+static bool g_needsTermination;
+
+static QCString g_exampleName;
+static QCString g_exampleFile;
+
+static QCString g_type;
+static QCString g_name;
+static QCString g_args;
+static QCString g_classScope;
+
+static QCString g_CurrScope;
+
+static FileDef * g_sourceFileDef;
+static Definition * g_currentDefinition;
+static MemberDef * g_currentMemberDef;
+static bool g_includeCodeFragment;
+static const char * g_currentFontClass;
+
+static bool g_lexInit = FALSE;
+static int g_braceCount=0;
+
+
+static void writeFont(const char *s,const char* text);
+static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName);
+static bool writeColoredWord(QCString& word );
+static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool typeOnly=FALSE);
+static void endFontClass();
+static void startFontClass(const char *s);
+//-------------------------------------------------------------------
+
+
+static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
+ }
+}
+
+static bool checkString(QCString &name)
+{
+ if (name.isEmpty()) return FALSE;
+ static QRegExp regg("[\\s\"]");
+
+ int len=name.length();
+ if (name.at(0)=='"' && name.at(len-1)=='"' && len > 2)
+ {
+ QStringList qrl=QStringList::split(regg,name,FALSE);
+ if (VhdlDocGen::isNumber((QCString)qrl[0]))
+ {
+ g_code->codify("\"");
+ startFontClass("vhdllogic");
+ QCString mid=name.mid(1,len-2); //" 1223 "
+ g_code->codify(mid.data());
+ endFontClass();
+ g_code->codify("\"");
+ }
+ else
+ {
+ startFontClass("keyword");
+ g_code->codify(name.data());
+ endFontClass();
+ }
+ return TRUE;
+ }
+
+ if (VhdlDocGen::isNumber(name))
+ {
+ startFontClass("vhdllogic");
+ g_code->codify(name.data());
+ endFontClass();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void addToSearchIndex(const char *text)
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->addWord(text,FALSE);
+ }
+}
+
+
+/*! start a new line of code, inserting a line number if g_sourceFileDef
+ * is TRUE. If a definition starts at the current line, then the line
+ * number is linked to the documentation of that definition.
+ */
+static void startCodeLine()
+{
+ //if (g_currentFontClass) { g_code->endFontClass(); }
+ if (g_sourceFileDef)
+ {
+ //QCString lineNumber,lineAnchor;
+ //lineNumber.sprintf("%05d",g_yyLineNr);
+ //lineAnchor.sprintf("l%05d",g_yyLineNr);
+ // if ((g_yyLineNr % 500) == 0)
+ // fprintf(stderr,"\n starting Line %d:",g_yyLineNr);
+ Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
+ //printf("startCodeLine %d d=%s\n", g_yyLineNr,d ? d->name().data() : "<null>");
+ if (!g_includeCodeFragment && d)
+ {
+ g_currentDefinition = d;
+ g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
+ if (!g_tempComp.isEmpty() && g_currentMemberDef )
+ {
+ //ClassDef *cf=VhdlDocGen::getClass(g_tempComp.data());
+ QCString nn=g_currentMemberDef->name();
+ MemberDef* mdeff=VhdlDocGen::findMember(g_tempComp,nn);
+ if (mdeff)
+ {
+ g_currentMemberDef=mdeff;
+ }
+ }
+
+ g_parmType.resize(0);
+ g_parmName.resize(0);
+ QCString lineAnchor;
+ lineAnchor.sprintf("l%05d",g_yyLineNr);
+ if (g_currentMemberDef)
+ {
+ g_code->writeLineNumber(g_currentMemberDef->getReference(),
+ g_currentMemberDef->getOutputFileBase(),
+ g_currentMemberDef->anchor(),g_yyLineNr);
+ setCurrentDoc(g_currentMemberDef->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ else if (d->isLinkableInProject())
+ {
+ g_code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,g_yyLineNr);
+ setCurrentDoc(d->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ }
+ else
+ {
+ g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ }
+ }
+ g_code->startCodeLine();
+ if (g_currentFontClass)
+ {
+ g_code->startFontClass(g_currentFontClass);
+ }
+}
+
+static void endFontClass();
+static void endCodeLine()
+{
+ endFontClass();
+ g_code->endCodeLine();
+}
+
+static void nextCodeLine()
+{
+ const char *fc = g_currentFontClass;
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ g_currentFontClass = fc;
+ startCodeLine();
+ }
+}
+
+/*! writes a word to the output.
+ * If curr_class is defined, the word belongs to a class
+ * and will be linked.
+ */
+
+static void writeWord(const char *word,const char* curr_class=0,bool classLink=FALSE)
+{
+ bool found=FALSE;
+ QCString temp;
+ QCString tclass(curr_class);
+ QCString ttt(word);
+ if (ttt.isEmpty()) return;
+ for (unsigned int j=0;j<ttt.length();j++)
+ {
+ char c=ttt.at(j);
+ if (c==' '|| c==',' || c==';' || c==':' || c=='(' || c==')' || c=='\r' || c=='\t' || c=='.')
+ {
+ if (found)
+ {
+ if (!writeColoredWord(temp)) // is it a keyword ?
+ {
+ //if (VhdlDocGen::findKeyWord(temp))
+ // writeFont("vhdlkeyword",temp.data());
+ //printf("writeWord: %s\n",temp.data());
+ if (!tclass.isEmpty())
+ {
+ if (!classLink)
+ {
+ generateMemLink(*g_code,tclass,temp);
+ }
+ else
+ {
+ generateClassOrGlobalLink(*g_code,temp);
+ }
+ }
+ else
+ {
+ if (!checkString(temp))
+ g_code->codify(temp.data());
+ }
+ }
+ temp.resize(0);
+ found=FALSE;
+ }
+
+ char cc[2];
+ cc[0]=c;
+ cc[1]=0;
+ g_code->codify(cc);
+ }
+ else
+ {
+ found=TRUE;
+ temp+=c;
+ }
+ } // for
+
+ if (!temp.isEmpty())
+ {
+ if (!writeColoredWord(temp))
+ {
+ if (!tclass.isEmpty())
+ {
+ if (!classLink)
+ {
+ generateMemLink(*g_code,tclass,temp); // generateMemLink(*g_code,g_CurrClass,left);
+ }
+ else
+ {
+ generateClassOrGlobalLink(*g_code,temp);
+ }
+ }
+ else
+ {
+ QCString qc(temp.data());
+ if (VhdlDocGen::isNumber(qc)){
+ startFontClass("vhdllogic");
+ g_code->codify(temp.data());
+ endFontClass();
+ }
+ else
+ g_code->codify(temp.data());
+ }
+ }
+ }
+}// writeWord
+
+
+/*! write a code fragment `text' that may span multiple lines, inserting
+ * line numbers for each line.
+ */
+static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE)
+{
+ if (text==0) return;
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ const char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n') {}
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ QCString line = sp;
+ line = line.left(p-sp-1);
+ //*(p-1)='\0';
+ //g_code->codify(sp);
+ writeWord(line,cl,classlink);
+ nextCodeLine();
+ }
+ else
+ {
+ //g_code->codify(sp);
+ writeWord(sp,cl,classlink);
+ done=TRUE;
+ }
+ }
+}
+
+/*! writes a link to a fragment \a text that may span multiple lines, inserting
+ * line numbers for each line. If \a text contains newlines, the link will be
+ * split into multiple links with the same destination, one for each line.
+ */
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const char *ref,const char *file,
+ const char *anchor,const char *text,
+ const char *tooltip)
+{
+ bool done=FALSE;
+ char *p=(char *)text;
+ while (!done)
+ {
+ char *sp=p;
+ char c;
+ while ((c=*p++) && c!='\n') {}
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ // printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ nextCodeLine();
+ }
+ else
+ {
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ done=TRUE;
+ }
+ }
+}
+
+static void setParameterList(MemberDef *md)
+{
+ g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
+ LockingPtr<ArgumentList> al = md->argumentList();
+ if (al==0) return;
+ Argument *a = al->first();
+ while (a)
+ {
+ g_parmName = a->name.copy();
+ g_parmType = a->type.copy();
+ int i = g_parmType.find('*');
+ if (i!=-1) g_parmType = g_parmType.left(i);
+ i = g_parmType.find('&');
+ if (i!=-1) g_parmType = g_parmType.left(i);
+ g_parmType.stripPrefix("const ");
+ g_parmType=g_parmType.stripWhiteSpace();
+ // g_theVarContext.addVariable(g_parmType,g_parmName);
+ a = al->next();
+ }
+}
+
+
+/*! writes a link to a function or procedure
+ */
+
+static void generateFuncLink(CodeOutputInterface &ol,MemberDef* mdef)
+{
+
+ //printf("generateFuncLink(FuncName=%s)\n",mdef->name().data());
+ QCString memberName=mdef->name();
+
+ if (mdef && mdef->isLinkable()) // is it a linkable class
+ {
+ writeMultiLineCodeLink(ol,mdef->getReference(),
+ mdef->getOutputFileBase(),
+ mdef->anchor(),
+ mdef->name(),
+ mdef->briefDescriptionAsTooltip());
+ addToSearchIndex(memberName);
+ return;
+ }
+ ol.linkableSymbol(g_yyLineNr,memberName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(memberName.data());
+ addToSearchIndex(memberName);
+} // generateFuncLink
+
+
+static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName)
+{
+ if (clName.isEmpty() || memberName.isEmpty()) return;
+ QCString className=clName;
+
+ MemberDef *md=0;
+ //MemberDef *comp=0;
+ //bool isLocal=FALSE;
+
+ md=VhdlDocGen::findMember(className,memberName);
+ ClassDef *po=VhdlDocGen::getClass(className.data());
+
+ if (md==0 && po && (VhdlDocGen::VhdlClasses)po->protection()==VhdlDocGen::PACKBODYCLASS)
+ {
+ QCString temp=className;//.stripPrefix("_");
+ temp.stripPrefix("_");
+ md=VhdlDocGen::findMember(temp,memberName);
+ }
+
+ if (md && md->isLinkable()) // is it a linkable class
+ {
+ writeMultiLineCodeLink(ol,md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ memberName,
+ md->briefDescriptionAsTooltip());
+ addToSearchIndex(memberName);
+ return;
+ }
+ // nothing found, just write out the word
+ ol.linkableSymbol(g_yyLineNr,memberName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(memberName.data());
+ addToSearchIndex(memberName);
+}// generateMemLink
+
+
+static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool /*typeOnly*/)
+{
+ QCString className=clName;
+
+ if (className.isEmpty()) return;
+
+ ClassDef *cd=0;
+ //MemberDef *md=0;
+ //bool isLocal=FALSE;
+ className.stripPrefix("_");
+ cd = getClass(className.data());
+ while (cd)
+ {
+ //className.stripPrefix("_");
+ QCString temp(clName);
+ temp.stripPrefix("_");
+ if (cd && cd->isLinkable()) // is it a linkable class
+ {
+ //if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS)
+ //{
+ // temp=VhdlDocGen::getClassName(cd);
+ //}
+ ol.linkableSymbol(g_yyLineNr,temp,cd,
+ g_currentMemberDef ?
+ g_currentMemberDef :
+ g_currentDefinition);
+ writeMultiLineCodeLink(ol,cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ temp,
+ cd->briefDescriptionAsTooltip());
+ addToSearchIndex(className);
+ return;
+ }
+ Definition *d = cd->getOuterScope();
+ if (d && d->definitionType()==Definition::TypeClass)
+ {
+ cd = (ClassDef*)d;
+ }
+ else
+ {
+ cd = 0;
+ }
+ }
+
+ // nothing found, just write out the word
+ ol.linkableSymbol(g_yyLineNr,clName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(clName);
+ addToSearchIndex(clName);
+}// generateClasss or global link
+
+
+/*! counts the number of lines in the input */
+static int countLines()
+{
+ const char *p=g_inputString;
+ char c;
+ int count=1;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
+ }
+ if (p>g_inputString && *(p-1)!='\n')
+ { // last line does not end with a \n, so we add an extra
+ // line and explicitly terminate the line after parsing.
+ count++,
+ g_needsTermination=TRUE;
+ }
+ return count;
+}
+
+static void endFontClass()
+{
+ if (g_currentFontClass)
+ {
+ g_code->endFontClass();
+ g_currentFontClass=0;
+ }
+}
+
+static void startFontClass(const char *s)
+{
+ if (s==0) return;
+ endFontClass();
+ g_code->startFontClass(s);
+ g_currentFontClass=s;
+}
+
+static void writeFont(const char *s,const char* text)
+{
+ if (s==0 || text==0) return;
+ //printf("writeFont(%d,\"%s\")\n",g_yyLineNr,text);
+ g_code->startFontClass(s);
+ g_code->codify(text);
+ g_code->endFontClass();
+}
+
+//----------------------------------------------------------------------------
+
+static void appStringLower(QCString& qcs,const char* text)
+{
+ qcs.resize(0);
+ qcs.append(text);
+ //qcs=qcs.lower();
+ qcs=qcs.stripWhiteSpace();
+}
+
+//static void appString(QCString& qcs,const char* text)
+//{
+// qcs.resize(0);
+// qcs.append(text);
+//}
+
+static QCString g_temp;
+
+/* writes and links a port map statement */
+static void codifyMapLines(char *text)
+{
+ if (text==0) return;
+ g_temp.resize(0);
+ //bool dot=FALSE;
+ int wordCounter=0;
+ QCString ctemp;
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n' && c!=':' && c != ' ' && c != '(' && c!='\0' && c!='\t')
+ {
+ if (c!=0x9)
+ g_temp+=c;
+ }
+ if (c=='\0') return;
+ if (!g_temp.isEmpty()) wordCounter++;
+
+ if (!g_temp.isEmpty())
+ {
+ // different kinds of component instantiations
+ // xxx:yyy (generic/port) map(
+ // xxx:(entity/component/configuration) yyy (generic/port) map(
+ // xxx: entity yyy(zzz) (generic/port) map(
+ if (wordCounter==2 || wordCounter==3)
+ {
+ QCString q=g_temp.lower(); // consider (upper/lower) cases
+ if (q=="entity" || q=="component" || q=="configuration" || q=="port" || q=="generic")
+ {
+ generateMemLink(*g_code,g_CurrClass,g_temp);
+ }
+ else
+ {
+ g_PortMapComp=g_temp;
+ generateClassOrGlobalLink(*g_code,g_temp);
+ }
+ }
+ else
+ {
+ generateMemLink(*g_code,g_CurrClass,g_temp);
+ }
+ }
+ ctemp.fill(c,1);
+ codifyLines(ctemp.data());
+ ctemp.resize(0);
+ g_temp.resize(0);
+ }//while
+}//codifymaplines
+
+/*
+* writes a function|procedure prototype and links the function|procedure name
+*/
+
+static void writeFuncProto()
+{
+ QList<Argument> ql;
+ QCString name,ret;
+ VhdlDocGen::parseFuncProto(g_FuncProto,ql,name,ret,FALSE);
+
+ if (name.isEmpty())
+ {
+ codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ return;
+ }
+ QStringList qlist=QStringList::split(name,g_FuncProto,FALSE);
+ QCString temp=(QCString)qlist[0];
+ codifyLines(temp.data(),g_CurrClass.data());
+ g_FuncProto.stripPrefix(temp.data());
+ temp.resize(0);
+ temp=g_CurrClass;
+ if (isPackageBody)
+ {
+ temp.stripPrefix("_");// _{package body name}
+ }
+ MemberDef *mdef=VhdlDocGen::findFunction(ql,name,temp,FALSE);
+
+ if (mdef)
+ {
+ generateFuncLink(*g_code,mdef);
+ g_FuncProto.stripPrefix(name.data());
+ codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ }
+ else
+ {
+ codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ }
+}// writeFuncProto
+
+/* writes a process prototype to the ouput */
+
+ static void writeProcessProto(){
+ codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ g_vhdlKeyDict.clear();
+}// writeProcessProto
+
+/* writes a keyword */
+
+static bool writeColoredWord(QCString& word )
+{
+ QCString qcs=word.lower();
+ QCString *ss=VhdlDocGen::findKeyWord(qcs);
+ if (ss)
+ {
+ writeFont(ss->data(),word.data());
+ return TRUE;
+ }
+ return FALSE;
+}
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 9062 "<stdout>"
+
+#define INITIAL 0
+#define Bases 1
+#define ParseType 2
+#define ParseFuncProto 3
+#define ParseComponent 4
+#define ParsePackage 5
+#define ParseProcessProto 6
+#define ClassName 7
+#define PackageName 8
+#define ClassVar 9
+#define ClassesName 10
+#define Map 11
+#define Body 12
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int vhdlcodeYYlex_destroy (void );
+
+int vhdlcodeYYget_debug (void );
+
+void vhdlcodeYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE vhdlcodeYYget_extra (void );
+
+void vhdlcodeYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *vhdlcodeYYget_in (void );
+
+void vhdlcodeYYset_in (FILE * in_str );
+
+FILE *vhdlcodeYYget_out (void );
+
+void vhdlcodeYYset_out (FILE * out_str );
+
+yy_size_t vhdlcodeYYget_leng (void );
+
+char *vhdlcodeYYget_text (void );
+
+int vhdlcodeYYget_lineno (void );
+
+void vhdlcodeYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int vhdlcodeYYwrap (void );
+#else
+extern int vhdlcodeYYwrap (void );
+#endif
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( vhdlcodeYYtext, vhdlcodeYYleng, 1, vhdlcodeYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( vhdlcodeYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( vhdlcodeYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, vhdlcodeYYin))==0 && ferror(vhdlcodeYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(vhdlcodeYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int vhdlcodeYYlex (void);
+
+#define YY_DECL int vhdlcodeYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after vhdlcodeYYtext and vhdlcodeYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( vhdlcodeYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (vhdlcodeYYtext[vhdlcodeYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 794 "vhdlcode.l"
+
+
+#line 9260 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! vhdlcodeYYin )
+ vhdlcodeYYin = stdin;
+
+ if ( ! vhdlcodeYYout )
+ vhdlcodeYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ vhdlcodeYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ vhdlcodeYY_create_buffer(vhdlcodeYYin,YY_BUF_SIZE );
+ }
+
+ vhdlcodeYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of vhdlcodeYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 2913 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 31091 );
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+ if ( yy_act == 0 )
+ { /* have to back up */
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ yy_act = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 796 "vhdlcode.l"
+{
+ BEGIN(Bases);
+ }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 800 "vhdlcode.l"
+{
+ g_braceCount++;
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ BEGIN(Map);
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 806 "vhdlcode.l"
+{ /* write and link a port map lines */
+ QCString tt(vhdlcodeYYtext);
+ VhdlDocGen::deleteAllChars(tt,',');
+ QRegExp r("=>");
+ QStringList ql=QStringList::split(r,tt,FALSE);
+ if (ql.count()>=2)
+ {
+ unsigned int index=0;
+ QCString t1=(QCString)ql[0];
+ char cc=t1.at(index);
+ while (cc==' ' || cc=='\t')
+ {
+ char c2[2];
+ c2[0]=cc;
+ c2[1]=0;
+ g_code->codify(c2);
+ index++;
+ if (index>=t1.size()) break;
+ cc=t1.at(index);
+ }
+
+ QCString s1=(QCString)ql[0];
+ s1=s1.stripWhiteSpace();
+
+ // if (!g_PortMapComp.isEmpty())
+ generateMemLink(*g_code,g_PortMapComp,s1);
+ while (index++<t1.size())
+ {
+ char cc=t1.at(index);
+ if (cc==' ' || cc=='\t')
+ {
+ char c2[2];
+ c2[0]=cc;
+ c2[1]=0;
+ g_code->codify(c2);
+ }
+ }
+ codifyLines("=>");
+ index=0;
+ QCString s2=(QCString)ql[1];
+ t1=s2;
+ cc=t1.at(index);
+ while (cc==' ' || cc=='\t')
+ {
+ char c2[2];
+ c2[0]=cc;
+ c2[1]=0;
+ g_code->codify(c2);
+ index++;
+ if (index>=t1.size()) break;
+ cc=t1.at(index);
+ }
+ s2=s2.stripWhiteSpace();
+ if (!checkString(s2))
+ generateMemLink(*g_code,g_CurrClass,s2);
+ while (index++<t1.size())
+ {
+ if (t1.at(index)==' ')
+ {
+ g_code->codify(" ");
+ }
+ }
+ }
+ else
+ {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ }
+ BEGIN(Map);
+ }
+ YY_BREAK
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 876 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext);
+ BEGIN(Map);
+ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 881 "vhdlcode.l"
+{
+ g_braceCount--;
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ if (g_braceCount==0)
+ {
+ BEGIN(Bases);
+ }
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 890 "vhdlcode.l"
+{
+ QCString tmp(vhdlcodeYYtext);
+ tmp=tmp.stripWhiteSpace();
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ g_vhdlKeyDict.insert(g_PrevString,new QCString(g_PrevString.data()));
+ if (!writeColoredWord(tmp))
+ {
+ generateMemLink(*g_code,g_CurrClass,tmp);
+ }
+ BEGIN(Bases);
+ }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 902 "vhdlcode.l"
+{
+ QCString qcs(vhdlcodeYYtext);
+ VhdlDocGen::deleteAllChars(qcs,'"');
+ VhdlDocGen::deleteAllChars(qcs,' ');
+ if (VhdlDocGen::isNumber(qcs))
+ writeFont("vhdllogic",vhdlcodeYYtext);
+ else
+ writeFont("keyword",vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 8:
+/* rule 8 can match eol */
+YY_RULE_SETUP
+#line 912 "vhdlcode.l"
+{
+ g_FuncProto.append(vhdlcodeYYtext);
+ if (isProto)
+ {
+ codifyLines(vhdlcodeYYtext);
+ }
+ BEGIN(ParseType);
+ }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 922 "vhdlcode.l"
+{
+ g_FuncProto.append(vhdlcodeYYtext);
+ if (isProto)
+ {
+ writeFont("keyword",vhdlcodeYYtext);
+ }
+ BEGIN(ParseType);
+ }
+ YY_BREAK
+case 10:
+/* rule 10 can match eol */
+YY_RULE_SETUP
+#line 931 "vhdlcode.l"
+{
+ QRegExp regg("[\\s]");
+ QCString tt(vhdlcodeYYtext);
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ tt=tt.lower();
+ VhdlDocGen::deleteAllChars(tt,';');
+ tt.stripWhiteSpace();
+ QStringList ql=QStringList::split(regg,tt,FALSE);
+ int index=ql.findIndex(QCString("if"))+1;
+ index+=ql.findIndex(QCString("case"))+1;
+ index+=ql.findIndex(QCString("loop"))+1;
+ index+=ql.findIndex(QCString("generate"))+1;
+ if (index==0)
+ {
+ BEGIN(Bases);
+ }
+ else
+ {
+ BEGIN(ParseType);
+ }
+ }
+ YY_BREAK
+case 11:
+/* rule 11 can match eol */
+YY_RULE_SETUP
+#line 953 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ g_vhdlKeyDict.clear();
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 958 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ isFuncProto=FALSE;
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 963 "vhdlcode.l"
+{
+ g_FuncProto.append(vhdlcodeYYtext);
+ if (isProto)
+ {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ }
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 971 "vhdlcode.l"
+{
+ QCString val(vhdlcodeYYtext);
+ g_FuncProto.append(vhdlcodeYYtext);
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+
+ if (isFuncProto && g_braceCount==0)
+ {
+ g_vhdlKeyDict.insert(g_PrevString,new QCString(g_PrevString.data()));
+ }
+
+ if (isProto)
+ {
+ if (!writeColoredWord(val))
+ {
+ if (!isFuncProto && !g_vhdlKeyDict.find(g_PrevString))
+ {
+ val=val.stripWhiteSpace();
+ if (VhdlDocGen::isNumber(val))
+ {
+ startFontClass("vhdllogic");
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ endFontClass();
+ }
+ else
+ generateMemLink(*g_code,g_CurrClass,val);
+ }
+ else
+ {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ }
+ }
+ }
+ BEGIN(ParseType);
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 1006 "vhdlcode.l"
+{
+ g_braceCount++;
+ g_FuncProto+='(';
+ if (isProto)
+ {
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ }
+ BEGIN(ParseType);
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 1016 "vhdlcode.l"
+{
+ g_braceCount--;
+ g_FuncProto+=')';
+ if (isProto)
+ {
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ }
+ if (g_braceCount==0 && !isProto)// && !isPackageBody)
+ {
+ isProto=TRUE;
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ writeFuncProto();
+ BEGIN(Bases);
+ }
+ if (isPackageBody)
+ {
+ BEGIN(ParseType);
+ }
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 1037 "vhdlcode.l"
+{
+ QDict<QCString> mem;
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ g_CurrClass.resize(0);
+ g_CurrClass.append(vhdlcodeYYtext);
+ g_CurrClass=g_CurrClass.stripWhiteSpace();
+
+ if (!writeColoredWord(g_CurrScope))
+ {
+ generateClassOrGlobalLink(*g_code,vhdlcodeYYtext);
+ }
+ else
+ {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ }
+ BEGIN(Bases);
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 1056 "vhdlcode.l"
+{
+ g_braceCount++;
+ g_code->codify(vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 1062 "vhdlcode.l"
+{
+ g_braceCount--;
+ g_code->codify(vhdlcodeYYtext);
+ if (g_braceCount==0 && !isComponent)
+ {
+ g_tempComp.resize(0);
+ BEGIN(Bases);
+ }
+ else
+ {
+ BEGIN(ParseComponent);
+ }
+ }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 1076 "vhdlcode.l"
+{
+ if (strlen(vhdlcodeYYtext)>=2) // found text ?
+ {
+ writeFont("keyword",vhdlcodeYYtext);
+ }
+ else
+ {
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ }
+ }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 1087 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 22:
+/* rule 22 can match eol */
+YY_RULE_SETUP
+#line 1093 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 1097 "vhdlcode.l"
+{
+ startFontClass("vhdllogic");
+ codifyLines(vhdlcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 24:
+/* rule 24 can match eol */
+YY_RULE_SETUP
+#line 1103 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext);
+ g_braceCount=1;
+ isComponent=FALSE;
+ }
+ YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 1109 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext);
+ g_braceCount=1;
+ }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 1114 "vhdlcode.l"
+{
+ QCString temp(vhdlcodeYYtext);
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ if (!checkString(temp)){
+ if (!writeColoredWord(g_PrevString))
+ {
+ generateMemLink(*g_code,g_tempComp,temp);
+ }
+ }
+ }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 1125 "vhdlcode.l"
+{
+ QCString temp(vhdlcodeYYtext);
+ if (!checkString(temp))
+ codifyLines(vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+#line 1132 "vhdlcode.l"
+{
+ g_FuncProto.append(vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 1138 "vhdlcode.l"
+{
+ g_FuncProto.append(vhdlcodeYYtext);
+ g_braceCount++;
+ }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 1143 "vhdlcode.l"
+{
+ g_FuncProto.append(vhdlcodeYYtext);
+ g_braceCount--;
+ if (g_braceCount==0)
+ {
+ writeProcessProto();
+ BEGIN(Bases);
+ }
+ }
+ YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+#line 1153 "vhdlcode.l"
+{ //found package
+ QCString temp(vhdlcodeYYtext);
+ QStringList strl=QStringList::split(".",temp,FALSE);
+
+ if (strl.count()>2)
+ {
+ QCString s1=(QCString)strl[0];
+ QCString s2=(QCString)strl[1];
+ QCString s3=(QCString)strl[2];
+ s1.append(".");
+ s3.prepend(".");
+ codifyLines(s1.data(),g_CurrClass.data());
+ ClassDef *cd=VhdlDocGen::getPackageName(s2);
+ if (cd)
+ {
+ generateClassOrGlobalLink(*g_code,s2.data());
+ }
+ else
+ {
+ codifyLines(s2.data());
+ }
+ codifyLines(s3.data());
+ }
+ else
+ {
+ writeFont("keywordflow",vhdlcodeYYtext);
+ }
+ BEGIN(Bases);
+ }
+ YY_BREAK
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 1183 "vhdlcode.l"
+{ // found port or generic map
+ QCString tt(vhdlcodeYYtext);
+ /*
+ if (tt.contains(':',FALSE))
+ {
+ isStartMap=TRUE;
+ }
+ else
+ {
+ isStartMap=FALSE;
+ }
+ */
+ int j=tt.find('.');
+
+ if (j>0)
+ {
+ QCString left=tt.left(j+1);
+ codifyLines(left.data());
+ tt=tt.right(tt.length()-j-1);
+ left=VhdlDocGen::getIndexWord(tt.data(),0);
+ if (!left.isEmpty())
+ {
+ if (left.contains('('))
+ {
+ j=left.find('(',FALSE);
+ QCString name=left.left(j);
+ generateClassOrGlobalLink(*g_code,name.data());
+ g_PortMapComp=name;
+ name=tt.right(tt.length()-name.length());
+ codifyLines(name.data());
+ }
+ else
+ {
+ generateClassOrGlobalLink(*g_code,left.data());
+ tt=tt.right(tt.length()-left.length()-1);
+ tt.prepend(" ");
+ g_PortMapComp=left;
+ codifyLines(tt.data());
+ }
+ }
+ }
+ else
+ {
+ if (tt.contains(':',FALSE))
+ codifyMapLines(tt.data());
+ else
+ codifyLines(tt.data());
+ }
+ g_braceCount=1;
+ BEGIN(Map);
+ }
+ YY_BREAK
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+#line 1235 "vhdlcode.l"
+{ // found component
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ // writeFont("keywordflow",VhdlDocGen::getIndexWord(vhdlcodeYYtext,0).data());
+ // writeFont("vhdlkeyword"," ");
+ QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
+ temp=temp.stripWhiteSpace();
+ VhdlDocGen::deleteAllChars(temp,'\n');
+ g_tempComp=temp;
+ codifyLines(vhdlcodeYYtext,temp.data(),TRUE);
+ g_braceCount=0;
+
+ //if (getClass(temp.data()))
+ // generateClassOrGlobalLink(*g_code,temp.data());
+ //else
+ // generateMemLink(*g_code,g_CurrClass,temp);
+
+ isComponent=TRUE;
+ BEGIN(ParseComponent);
+ }
+ YY_BREAK
+case 34:
+/* rule 34 can match eol */
+YY_RULE_SETUP
+#line 1257 "vhdlcode.l"
+{ // found architecture
+ g_PortMapComp.resize(0);
+ // writeFont("vhdlkeyword",VhdlDocGen::getIndexWord(vhdlcodeYYtext,0).data());
+ // writeFont("vhdlkeyword"," ");
+ // writeFont("vhdlchar",VhdlDocGen::getIndexWord(vhdlcodeYYtext,1).data());
+ // writeFont("vhdlkeyword"," ");
+ // writeFont("vhdlkeyword",VhdlDocGen::getIndexWord(vhdlcodeYYtext,2).data());
+ // writeFont("vhdlkeyword"," ");
+ //QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
+ //temp=temp.stripWhiteSpace();
+ //temp+=("-");
+ //temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,3);
+ QCString temp = VhdlDocGen::getIndexWord(vhdlcodeYYtext,3);
+ temp+="::";
+ temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
+ g_CurrClass=temp;
+ VhdlDocGen::deleteAllChars(temp,'\n');
+ codifyLines(vhdlcodeYYtext,temp.data(),TRUE);
+ //generateClassOrGlobalLink(*g_code,temp.data());
+ isPackageBody=FALSE;
+ BEGIN(ClassName);
+ }
+ YY_BREAK
+case 35:
+/* rule 35 can match eol */
+YY_RULE_SETUP
+#line 1281 "vhdlcode.l"
+{ // found package body
+ QCString ss(vhdlcodeYYtext);
+ QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,2);
+ QStringList ql=QStringList::split(temp,ss,FALSE);
+ QCString ll=(QCString)ql[0];
+ codifyLines(ll.data(),g_CurrClass.data());
+ temp=temp.stripWhiteSpace();
+ temp.prepend("_");
+ generateClassOrGlobalLink(*g_code,temp.data());
+ g_CurrClass.resize(0);
+ g_CurrClass=temp;
+ isProto=FALSE;
+ isPackageBody=TRUE;
+ // BEGIN(ClassesName);
+ }
+ YY_BREAK
+case 36:
+/* rule 36 can match eol */
+YY_RULE_SETUP
+#line 1297 "vhdlcode.l"
+{ // found process
+ isFuncProto=TRUE;
+ g_FuncProto.resize(0);
+ g_FuncProto.append(vhdlcodeYYtext);
+ g_vhdlKeyDict.clear();
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ if (g_PrevString.contains('('))
+ {
+ g_braceCount=1;
+ BEGIN(ParseProcessProto);
+ }
+ else
+ {
+ writeProcessProto();
+ }
+ }
+ YY_BREAK
+case 37:
+/* rule 37 can match eol */
+YY_RULE_SETUP
+#line 1314 "vhdlcode.l"
+{ // end of process
+ isFuncProto=FALSE;
+ codifyLines(vhdlcodeYYtext);
+ BEGIN(Bases);
+ }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 1321 "vhdlcode.l"
+{
+ isFuncProto=FALSE;
+ writeFont("vhdlkeyword",vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 1326 "vhdlcode.l"
+{ //found package or library
+ writeFont("vhdlkeyword",vhdlcodeYYtext);
+ BEGIN(ParsePackage);
+ }
+ YY_BREAK
+case 40:
+/* rule 40 can match eol */
+YY_RULE_SETUP
+#line 1332 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 41:
+/* rule 41 can match eol */
+YY_RULE_SETUP
+#line 1338 "vhdlcode.l"
+{ // found function|procedure
+ g_vhdlKeyDict.clear();
+ g_FuncProto.resize(0);
+ isProto=FALSE;
+ g_FuncProto.append(vhdlcodeYYtext);
+ g_braceCount=1;
+ BEGIN(ParseType);
+ }
+ YY_BREAK
+case 42:
+/* rule 42 can match eol */
+YY_RULE_SETUP
+#line 1349 "vhdlcode.l"
+{
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ writeFont("keywordflow",vhdlcodeYYtext);
+ isPackageBody=FALSE;
+ BEGIN(ClassesName);
+ }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 1357 "vhdlcode.l"
+{ // found keyword
+ QCString qcs(vhdlcodeYYtext);
+ if (!writeColoredWord(qcs))
+ {
+ startFontClass("vhdlchar");
+ g_code->codify(vhdlcodeYYtext);
+ endFontClass();
+ }
+ }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 1368 "vhdlcode.l"
+{
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ QCString temp(vhdlcodeYYtext);
+ temp=temp.stripWhiteSpace();
+
+ if (!writeColoredWord(temp))
+ {
+ startFontClass("vhdlchar");
+ generateMemLink(*g_code,g_CurrClass,temp);
+ endFontClass();
+ }
+ }
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 1381 "vhdlcode.l"
+{
+ startFontClass("vhdllogic");
+ codifyLines(vhdlcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 46:
+/* rule 46 can match eol */
+YY_RULE_SETUP
+#line 1387 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
+ }
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 1392 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext);
+ if (isFuncProto)
+ {
+ BEGIN(ParseFuncProto);
+ }
+ else
+ {
+ BEGIN(Bases);
+ }
+ }
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 1404 "vhdlcode.l"
+{
+ startFontClass("vhdlchar");
+ g_code->codify(vhdlcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 1410 "vhdlcode.l"
+{
+ startFontClass("vhdlchar");
+ g_code->codify(vhdlcodeYYtext);
+ endFontClass();
+ }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 1416 "vhdlcode.l"
+{
+ QCString qcs(vhdlcodeYYtext);
+ VhdlDocGen::deleteAllChars(qcs,'"');
+ VhdlDocGen::deleteAllChars(qcs,' ');
+
+ if (VhdlDocGen::isNumber(qcs))
+ writeFont("vhdllogic",vhdlcodeYYtext);
+ else
+ writeFont("keyword",vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 51:
+/* rule 51 can match eol */
+YY_RULE_SETUP
+#line 1427 "vhdlcode.l"
+{
+ codifyLines(vhdlcodeYYtext);
+ BEGIN(Bases);
+ }
+ YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 1432 "vhdlcode.l"
+{
+ g_code->codify(vhdlcodeYYtext);
+ }
+ YY_BREAK
+case 53:
+/* rule 53 can match eol */
+YY_RULE_SETUP
+#line 1436 "vhdlcode.l"
+{ // found normal or special comment on its own line
+ QCString text(vhdlcodeYYtext);
+ int i=text.find("--");
+ if (text.mid(i,3)=="--!" && // hide special comment
+ Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr++; // skip complete line
+ }
+ else // normal comment
+ {
+ startFontClass("comment");
+ codifyLines(text);
+ endFontClass();
+ }
+ }
+ YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 1451 "vhdlcode.l"
+{ // found normal or special comment after something
+ QCString text(vhdlcodeYYtext);
+ int i=text.find("--");
+ if (text.mid(i,3)=="--!" &&
+ Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ // hide special comment
+ }
+ else // normal comment
+ {
+ startFontClass("comment");
+ codifyLines(text);
+ endFontClass();
+ }
+ }
+ YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 1468 "vhdlcode.l"
+ECHO;
+ YY_BREAK
+#line 10184 "<stdout>"
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(Bases):
+case YY_STATE_EOF(ParseType):
+case YY_STATE_EOF(ParseFuncProto):
+case YY_STATE_EOF(ParseComponent):
+case YY_STATE_EOF(ParsePackage):
+case YY_STATE_EOF(ParseProcessProto):
+case YY_STATE_EOF(ClassName):
+case YY_STATE_EOF(PackageName):
+case YY_STATE_EOF(ClassVar):
+case YY_STATE_EOF(ClassesName):
+case YY_STATE_EOF(Map):
+case YY_STATE_EOF(Body):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed vhdlcodeYYin at a new source and called
+ * vhdlcodeYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = vhdlcodeYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( vhdlcodeYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * vhdlcodeYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of vhdlcodeYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ yy_size_t new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ vhdlcodeYYrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ vhdlcodeYYrestart(vhdlcodeYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) vhdlcodeYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 2913 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+ register char *yy_cp = (yy_c_buf_p);
+
+ register YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 2913 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 2912);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ vhdlcodeYYrestart(vhdlcodeYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( vhdlcodeYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve vhdlcodeYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void vhdlcodeYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ vhdlcodeYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ vhdlcodeYY_create_buffer(vhdlcodeYYin,YY_BUF_SIZE );
+ }
+
+ vhdlcodeYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ vhdlcodeYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void vhdlcodeYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * vhdlcodeYYpop_buffer_state();
+ * vhdlcodeYYpush_buffer_state(new_buffer);
+ */
+ vhdlcodeYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ vhdlcodeYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (vhdlcodeYYwrap()) processing, but the only time this flag
+ * is looked at is after vhdlcodeYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void vhdlcodeYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ vhdlcodeYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE vhdlcodeYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) vhdlcodeYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlcodeYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) vhdlcodeYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlcodeYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ vhdlcodeYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with vhdlcodeYY_create_buffer()
+ *
+ */
+ void vhdlcodeYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ vhdlcodeYYfree((void *) b->yy_ch_buf );
+
+ vhdlcodeYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a vhdlcodeYYrestart() or at EOF.
+ */
+ static void vhdlcodeYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ vhdlcodeYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then vhdlcodeYY_init_buffer was _probably_
+ * called from vhdlcodeYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void vhdlcodeYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ vhdlcodeYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void vhdlcodeYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ vhdlcodeYYensure_buffer_stack();
+
+ /* This block is copied from vhdlcodeYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from vhdlcodeYY_switch_to_buffer. */
+ vhdlcodeYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void vhdlcodeYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ vhdlcodeYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ vhdlcodeYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void vhdlcodeYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)vhdlcodeYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlcodeYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)vhdlcodeYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlcodeYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE vhdlcodeYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) vhdlcodeYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlcodeYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ vhdlcodeYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to vhdlcodeYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * vhdlcodeYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE vhdlcodeYY_scan_string (yyconst char * yystr )
+{
+
+ return vhdlcodeYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to vhdlcodeYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE vhdlcodeYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) vhdlcodeYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlcodeYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = vhdlcodeYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in vhdlcodeYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up vhdlcodeYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ vhdlcodeYYtext[vhdlcodeYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = vhdlcodeYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ vhdlcodeYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int vhdlcodeYYget_lineno (void)
+{
+
+ return vhdlcodeYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *vhdlcodeYYget_in (void)
+{
+ return vhdlcodeYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *vhdlcodeYYget_out (void)
+{
+ return vhdlcodeYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t vhdlcodeYYget_leng (void)
+{
+ return vhdlcodeYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *vhdlcodeYYget_text (void)
+{
+ return vhdlcodeYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void vhdlcodeYYset_lineno (int line_number )
+{
+
+ vhdlcodeYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see vhdlcodeYY_switch_to_buffer
+ */
+void vhdlcodeYYset_in (FILE * in_str )
+{
+ vhdlcodeYYin = in_str ;
+}
+
+void vhdlcodeYYset_out (FILE * out_str )
+{
+ vhdlcodeYYout = out_str ;
+}
+
+int vhdlcodeYYget_debug (void)
+{
+ return vhdlcodeYY_flex_debug;
+}
+
+void vhdlcodeYYset_debug (int bdebug )
+{
+ vhdlcodeYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from vhdlcodeYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ vhdlcodeYYin = stdin;
+ vhdlcodeYYout = stdout;
+#else
+ vhdlcodeYYin = (FILE *) 0;
+ vhdlcodeYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * vhdlcodeYYlex_init()
+ */
+ return 0;
+}
+
+/* vhdlcodeYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int vhdlcodeYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ vhdlcodeYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ vhdlcodeYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ vhdlcodeYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * vhdlcodeYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *vhdlcodeYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *vhdlcodeYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void vhdlcodeYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see vhdlcodeYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 1468 "vhdlcode.l"
+
+
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+void resetVhdlCodeParserState()
+{
+ g_vhdlKeyDict.setAutoDelete(TRUE);
+ g_vhdlKeyDict.clear();
+}
+
+void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString &s,
+ bool exBlock, const char *exName,FileDef *fd,
+ int startLine,int endLine,bool inlineFragment,
+ MemberDef *memberDef,bool)
+{
+ //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd);
+ if (s.isEmpty()) return;
+ if (memberDef)
+ {
+ ClassDef *dd=memberDef->getClassDef();
+ if (dd) g_CurrClass=dd->className();
+ startLine--;
+ }
+ resetVhdlCodeParserState();
+ g_code = &od;
+ g_inputString = s;
+ g_inputPosition = 0;
+ g_currentFontClass = 0;
+ g_needsTermination = FALSE;
+
+ if (endLine!=-1)
+ g_inputLines = endLine+1;
+ else
+ g_inputLines = countLines();
+
+ if (startLine!=-1)
+ g_yyLineNr = startLine;
+ else
+ g_yyLineNr = 1;
+
+
+ // g_theCallContext.clear();
+ g_classScope = className;
+ g_exampleName = exName;
+ g_sourceFileDef = fd;
+ if (exBlock && fd==0)
+ {
+ // create a dummy filedef for the example
+ g_sourceFileDef = new FileDef("",exName);
+ }
+ if (g_sourceFileDef)
+ {
+ setCurrentDoc(g_sourceFileDef->name(),g_sourceFileDef->getSourceFileBase());
+ }
+ g_currentDefinition = 0;
+ g_currentMemberDef = 0;
+ g_vhdlMember=0;
+ if (!g_exampleName.isEmpty())
+ {
+ g_exampleFile = convertNameToFile(g_exampleName+"-example");
+ }
+ g_includeCodeFragment = inlineFragment;
+ if (!memberDef)
+ {
+ startCodeLine();
+ }
+ // g_type.resize(0);
+ // g_name.resize(0);
+ // g_args.resize(0);
+ g_parmName.resize(0);
+ g_parmType.resize(0);
+ if (memberDef)
+ {
+ setParameterList(memberDef);
+ }
+ vhdlcodeYYrestart( vhdlcodeYYin );
+ BEGIN( Bases );
+ vhdlcodeYYlex();
+ g_lexInit=TRUE;
+ if (g_needsTermination)
+ {
+ endCodeLine();
+ }
+ if (exBlock && g_sourceFileDef)
+ {
+ // delete the temporary file definition used for this example
+ delete g_sourceFileDef;
+ g_sourceFileDef=0;
+ }
+ return;
+}
+
+void codeFreeVhdlScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ vhdlcodeYYlex_destroy();
+ }
+#endif
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void vhdlcodeYYdummy() { yy_flex_realloc(0,0); }
+}
+#elif YY_FLEX_SUBMINOR_VERSION<33
+#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
+#endif
+
+
+
+
+
diff --git a/src/vhdlcode.h b/src/vhdlcode.h
new file mode 100644
index 0000000..e5df98e
--- /dev/null
+++ b/src/vhdlcode.h
@@ -0,0 +1,18 @@
+#ifndef VHDLCODE_H
+#define VHDLCODE_H
+
+#include "qtbc.h"
+#include <stdio.h>
+
+class CodeOutputInterface;
+class FileDef;
+class MemberDef;
+
+void parseVhdlCode(CodeOutputInterface &,const char *,const QCString &,
+ bool ,const char *,FileDef *fd=0,
+ int startLine=-1,int endLine=-1,bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,bool showLineNumbers=TRUE);
+void resetVhdlCodeParserState();
+void codeFreeVhdlScanner();
+
+#endif
diff --git a/src/vhdlcode.l b/src/vhdlcode.l
new file mode 100644
index 0000000..f0b02b5
--- /dev/null
+++ b/src/vhdlcode.l
@@ -0,0 +1,1581 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/******************************************************************************
+ * Parser for syntax hightlighting and references for vhdl subset
+ * written by M. Kreis
+ * supports VHDL-87
+ * does not support VHDL-AMS
+ ******************************************************************************/
+
+%{
+
+/*
+ * includes
+ */
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <qregexp.h>
+#include <qdir.h>
+#include <qstringlist.h>
+
+#include "qtbc.h"
+#include "entry.h"
+#include "doxygen.h"
+#include "message.h"
+#include "outputlist.h"
+#include "util.h"
+#include "membername.h"
+#include "searchindex.h"
+#include "vhdldocgen.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
+
+/* -----------------------------------------------------------------
+ * statics
+ */
+
+// ----------------- <vhdl> ----------------------------------
+
+//static bool isPackBody=FALSE;
+//static bool isStartMap;
+static bool isFuncProto=FALSE;
+static bool isComponent=FALSE;
+static bool isPackageBody=FALSE;
+static bool isProto = FALSE;
+
+static QCString g_PrevString;
+static QCString g_CurrClass;
+static QDict<QCString>g_vhdlKeyDict;
+static QCString g_tempClass;
+static QCString g_tempComp;
+static QCString g_PortMapComp;
+static MemberDef *g_vhdlMember;
+static QCString g_FuncProto;
+
+//-----------------------------------------------------------
+
+static CodeOutputInterface * g_code;
+static QCString g_curClassName;
+static QCString g_parmType;
+static QCString g_parmName;
+static const char * g_inputString; //!< the code fragment as text
+static int g_inputPosition; //!< read offset during parsing
+static int g_inputLines; //!< number of line in the code fragment
+static int g_yyLineNr; //!< current line number
+static bool g_needsTermination;
+
+static QCString g_exampleName;
+static QCString g_exampleFile;
+
+static QCString g_type;
+static QCString g_name;
+static QCString g_args;
+static QCString g_classScope;
+
+static QCString g_CurrScope;
+
+static FileDef * g_sourceFileDef;
+static Definition * g_currentDefinition;
+static MemberDef * g_currentMemberDef;
+static bool g_includeCodeFragment;
+static const char * g_currentFontClass;
+
+static bool g_lexInit = FALSE;
+static int g_braceCount=0;
+
+
+static void writeFont(const char *s,const char* text);
+static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName);
+static bool writeColoredWord(QCString& word );
+static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool typeOnly=FALSE);
+static void endFontClass();
+static void startFontClass(const char *s);
+//-------------------------------------------------------------------
+
+
+static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
+ }
+}
+
+static bool checkString(QCString &name)
+{
+ if (name.isEmpty()) return FALSE;
+ static QRegExp regg("[\\s\"]");
+
+ int len=name.length();
+ if (name.at(0)=='"' && name.at(len-1)=='"' && len > 2)
+ {
+ QStringList qrl=QStringList::split(regg,name,FALSE);
+ if (VhdlDocGen::isNumber((QCString)qrl[0]))
+ {
+ g_code->codify("\"");
+ startFontClass("vhdllogic");
+ QCString mid=name.mid(1,len-2); //" 1223 "
+ g_code->codify(mid.data());
+ endFontClass();
+ g_code->codify("\"");
+ }
+ else
+ {
+ startFontClass("keyword");
+ g_code->codify(name.data());
+ endFontClass();
+ }
+ return TRUE;
+ }
+
+ if (VhdlDocGen::isNumber(name))
+ {
+ startFontClass("vhdllogic");
+ g_code->codify(name.data());
+ endFontClass();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void addToSearchIndex(const char *text)
+{
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->addWord(text,FALSE);
+ }
+}
+
+
+/*! start a new line of code, inserting a line number if g_sourceFileDef
+ * is TRUE. If a definition starts at the current line, then the line
+ * number is linked to the documentation of that definition.
+ */
+static void startCodeLine()
+{
+ //if (g_currentFontClass) { g_code->endFontClass(); }
+ if (g_sourceFileDef)
+ {
+ //QCString lineNumber,lineAnchor;
+ //lineNumber.sprintf("%05d",g_yyLineNr);
+ //lineAnchor.sprintf("l%05d",g_yyLineNr);
+ // if ((g_yyLineNr % 500) == 0)
+ // fprintf(stderr,"\n starting Line %d:",g_yyLineNr);
+ Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
+ //printf("startCodeLine %d d=%s\n", g_yyLineNr,d ? d->name().data() : "<null>");
+ if (!g_includeCodeFragment && d)
+ {
+ g_currentDefinition = d;
+ g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
+ if (!g_tempComp.isEmpty() && g_currentMemberDef )
+ {
+ //ClassDef *cf=VhdlDocGen::getClass(g_tempComp.data());
+ QCString nn=g_currentMemberDef->name();
+ MemberDef* mdeff=VhdlDocGen::findMember(g_tempComp,nn);
+ if (mdeff)
+ {
+ g_currentMemberDef=mdeff;
+ }
+ }
+
+ g_parmType.resize(0);
+ g_parmName.resize(0);
+ QCString lineAnchor;
+ lineAnchor.sprintf("l%05d",g_yyLineNr);
+ if (g_currentMemberDef)
+ {
+ g_code->writeLineNumber(g_currentMemberDef->getReference(),
+ g_currentMemberDef->getOutputFileBase(),
+ g_currentMemberDef->anchor(),g_yyLineNr);
+ setCurrentDoc(g_currentMemberDef->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ else if (d->isLinkableInProject())
+ {
+ g_code->writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ 0,g_yyLineNr);
+ setCurrentDoc(d->qualifiedName(),
+ g_sourceFileDef->getSourceFileBase(),
+ lineAnchor);
+ }
+ }
+ else
+ {
+ g_code->writeLineNumber(0,0,0,g_yyLineNr);
+ }
+ }
+ g_code->startCodeLine();
+ if (g_currentFontClass)
+ {
+ g_code->startFontClass(g_currentFontClass);
+ }
+}
+
+static void endFontClass();
+static void endCodeLine()
+{
+ endFontClass();
+ g_code->endCodeLine();
+}
+
+static void nextCodeLine()
+{
+ const char *fc = g_currentFontClass;
+ endCodeLine();
+ if (g_yyLineNr<g_inputLines)
+ {
+ g_currentFontClass = fc;
+ startCodeLine();
+ }
+}
+
+/*! writes a word to the output.
+ * If curr_class is defined, the word belongs to a class
+ * and will be linked.
+ */
+
+static void writeWord(const char *word,const char* curr_class=0,bool classLink=FALSE)
+{
+ bool found=FALSE;
+ QCString temp;
+ QCString tclass(curr_class);
+ QCString ttt(word);
+ if (ttt.isEmpty()) return;
+ for (unsigned int j=0;j<ttt.length();j++)
+ {
+ char c=ttt.at(j);
+ if (c==' '|| c==',' || c==';' || c==':' || c=='(' || c==')' || c=='\r' || c=='\t' || c=='.')
+ {
+ if (found)
+ {
+ if (!writeColoredWord(temp)) // is it a keyword ?
+ {
+ //if (VhdlDocGen::findKeyWord(temp))
+ // writeFont("vhdlkeyword",temp.data());
+ //printf("writeWord: %s\n",temp.data());
+ if (!tclass.isEmpty())
+ {
+ if (!classLink)
+ {
+ generateMemLink(*g_code,tclass,temp);
+ }
+ else
+ {
+ generateClassOrGlobalLink(*g_code,temp);
+ }
+ }
+ else
+ {
+ if (!checkString(temp))
+ g_code->codify(temp.data());
+ }
+ }
+ temp.resize(0);
+ found=FALSE;
+ }
+
+ char cc[2];
+ cc[0]=c;
+ cc[1]=0;
+ g_code->codify(cc);
+ }
+ else
+ {
+ found=TRUE;
+ temp+=c;
+ }
+ } // for
+
+ if (!temp.isEmpty())
+ {
+ if (!writeColoredWord(temp))
+ {
+ if (!tclass.isEmpty())
+ {
+ if (!classLink)
+ {
+ generateMemLink(*g_code,tclass,temp); // generateMemLink(*g_code,g_CurrClass,left);
+ }
+ else
+ {
+ generateClassOrGlobalLink(*g_code,temp);
+ }
+ }
+ else
+ {
+ QCString qc(temp.data());
+ if (VhdlDocGen::isNumber(qc)){
+ startFontClass("vhdllogic");
+ g_code->codify(temp.data());
+ endFontClass();
+ }
+ else
+ g_code->codify(temp.data());
+ }
+ }
+ }
+}// writeWord
+
+
+/*! write a code fragment `text' that may span multiple lines, inserting
+ * line numbers for each line.
+ */
+static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE)
+{
+ if (text==0) return;
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ const char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n') {}
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ QCString line = sp;
+ line = line.left(p-sp-1);
+ //*(p-1)='\0';
+ //g_code->codify(sp);
+ writeWord(line,cl,classlink);
+ nextCodeLine();
+ }
+ else
+ {
+ //g_code->codify(sp);
+ writeWord(sp,cl,classlink);
+ done=TRUE;
+ }
+ }
+}
+
+/*! writes a link to a fragment \a text that may span multiple lines, inserting
+ * line numbers for each line. If \a text contains newlines, the link will be
+ * split into multiple links with the same destination, one for each line.
+ */
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ const char *ref,const char *file,
+ const char *anchor,const char *text,
+ const char *tooltip)
+{
+ bool done=FALSE;
+ char *p=(char *)text;
+ while (!done)
+ {
+ char *sp=p;
+ char c;
+ while ((c=*p++) && c!='\n') {}
+ if (c=='\n')
+ {
+ g_yyLineNr++;
+ *(p-1)='\0';
+ // printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ nextCodeLine();
+ }
+ else
+ {
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ done=TRUE;
+ }
+ }
+}
+
+static void setParameterList(MemberDef *md)
+{
+ g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
+ LockingPtr<ArgumentList> al = md->argumentList();
+ if (al==0) return;
+ Argument *a = al->first();
+ while (a)
+ {
+ g_parmName = a->name.copy();
+ g_parmType = a->type.copy();
+ int i = g_parmType.find('*');
+ if (i!=-1) g_parmType = g_parmType.left(i);
+ i = g_parmType.find('&');
+ if (i!=-1) g_parmType = g_parmType.left(i);
+ g_parmType.stripPrefix("const ");
+ g_parmType=g_parmType.stripWhiteSpace();
+ // g_theVarContext.addVariable(g_parmType,g_parmName);
+ a = al->next();
+ }
+}
+
+
+/*! writes a link to a function or procedure
+ */
+
+static void generateFuncLink(CodeOutputInterface &ol,MemberDef* mdef)
+{
+
+ //printf("generateFuncLink(FuncName=%s)\n",mdef->name().data());
+ QCString memberName=mdef->name();
+
+ if (mdef && mdef->isLinkable()) // is it a linkable class
+ {
+ writeMultiLineCodeLink(ol,mdef->getReference(),
+ mdef->getOutputFileBase(),
+ mdef->anchor(),
+ mdef->name(),
+ mdef->briefDescriptionAsTooltip());
+ addToSearchIndex(memberName);
+ return;
+ }
+ ol.linkableSymbol(g_yyLineNr,memberName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(memberName.data());
+ addToSearchIndex(memberName);
+} // generateFuncLink
+
+
+static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName)
+{
+ if (clName.isEmpty() || memberName.isEmpty()) return;
+ QCString className=clName;
+
+ MemberDef *md=0;
+ //MemberDef *comp=0;
+ //bool isLocal=FALSE;
+
+ md=VhdlDocGen::findMember(className,memberName);
+ ClassDef *po=VhdlDocGen::getClass(className.data());
+
+ if (md==0 && po && (VhdlDocGen::VhdlClasses)po->protection()==VhdlDocGen::PACKBODYCLASS)
+ {
+ QCString temp=className;//.stripPrefix("_");
+ temp.stripPrefix("_");
+ md=VhdlDocGen::findMember(temp,memberName);
+ }
+
+ if (md && md->isLinkable()) // is it a linkable class
+ {
+ writeMultiLineCodeLink(ol,md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ memberName,
+ md->briefDescriptionAsTooltip());
+ addToSearchIndex(memberName);
+ return;
+ }
+ // nothing found, just write out the word
+ ol.linkableSymbol(g_yyLineNr,memberName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(memberName.data());
+ addToSearchIndex(memberName);
+}// generateMemLink
+
+
+static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool /*typeOnly*/)
+{
+ QCString className=clName;
+
+ if (className.isEmpty()) return;
+
+ ClassDef *cd=0;
+ //MemberDef *md=0;
+ //bool isLocal=FALSE;
+ className.stripPrefix("_");
+ cd = getClass(className.data());
+ while (cd)
+ {
+ //className.stripPrefix("_");
+ QCString temp(clName);
+ temp.stripPrefix("_");
+ if (cd && cd->isLinkable()) // is it a linkable class
+ {
+ //if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS)
+ //{
+ // temp=VhdlDocGen::getClassName(cd);
+ //}
+ ol.linkableSymbol(g_yyLineNr,temp,cd,
+ g_currentMemberDef ?
+ g_currentMemberDef :
+ g_currentDefinition);
+ writeMultiLineCodeLink(ol,cd->getReference(),
+ cd->getOutputFileBase(),
+ cd->anchor(),
+ temp,
+ cd->briefDescriptionAsTooltip());
+ addToSearchIndex(className);
+ return;
+ }
+ Definition *d = cd->getOuterScope();
+ if (d && d->definitionType()==Definition::TypeClass)
+ {
+ cd = (ClassDef*)d;
+ }
+ else
+ {
+ cd = 0;
+ }
+ }
+
+ // nothing found, just write out the word
+ ol.linkableSymbol(g_yyLineNr,clName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ codifyLines(clName);
+ addToSearchIndex(clName);
+}// generateClasss or global link
+
+
+/*! counts the number of lines in the input */
+static int countLines()
+{
+ const char *p=g_inputString;
+ char c;
+ int count=1;
+ while ((c=*p))
+ {
+ p++ ;
+ if (c=='\n') count++;
+ }
+ if (p>g_inputString && *(p-1)!='\n')
+ { // last line does not end with a \n, so we add an extra
+ // line and explicitly terminate the line after parsing.
+ count++,
+ g_needsTermination=TRUE;
+ }
+ return count;
+}
+
+static void endFontClass()
+{
+ if (g_currentFontClass)
+ {
+ g_code->endFontClass();
+ g_currentFontClass=0;
+ }
+}
+
+static void startFontClass(const char *s)
+{
+ if (s==0) return;
+ endFontClass();
+ g_code->startFontClass(s);
+ g_currentFontClass=s;
+}
+
+static void writeFont(const char *s,const char* text)
+{
+ if (s==0 || text==0) return;
+ //printf("writeFont(%d,\"%s\")\n",g_yyLineNr,text);
+ g_code->startFontClass(s);
+ g_code->codify(text);
+ g_code->endFontClass();
+}
+
+//----------------------------------------------------------------------------
+
+static void appStringLower(QCString& qcs,const char* text)
+{
+ qcs.resize(0);
+ qcs.append(text);
+ //qcs=qcs.lower();
+ qcs=qcs.stripWhiteSpace();
+}
+
+//static void appString(QCString& qcs,const char* text)
+//{
+// qcs.resize(0);
+// qcs.append(text);
+//}
+
+static QCString g_temp;
+
+/* writes and links a port map statement */
+static void codifyMapLines(char *text)
+{
+ if (text==0) return;
+ g_temp.resize(0);
+ //bool dot=FALSE;
+ int wordCounter=0;
+ QCString ctemp;
+ //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
+ char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n' && c!=':' && c != ' ' && c != '(' && c!='\0' && c!='\t')
+ {
+ if (c!=0x9)
+ g_temp+=c;
+ }
+ if (c=='\0') return;
+ if (!g_temp.isEmpty()) wordCounter++;
+
+ if (!g_temp.isEmpty())
+ {
+ // different kinds of component instantiations
+ // xxx:yyy (generic/port) map(
+ // xxx:(entity/component/configuration) yyy (generic/port) map(
+ // xxx: entity yyy(zzz) (generic/port) map(
+ if (wordCounter==2 || wordCounter==3)
+ {
+ QCString q=g_temp.lower(); // consider (upper/lower) cases
+ if (q=="entity" || q=="component" || q=="configuration" || q=="port" || q=="generic")
+ {
+ generateMemLink(*g_code,g_CurrClass,g_temp);
+ }
+ else
+ {
+ g_PortMapComp=g_temp;
+ generateClassOrGlobalLink(*g_code,g_temp);
+ }
+ }
+ else
+ {
+ generateMemLink(*g_code,g_CurrClass,g_temp);
+ }
+ }
+ ctemp.fill(c,1);
+ codifyLines(ctemp.data());
+ ctemp.resize(0);
+ g_temp.resize(0);
+ }//while
+}//codifymaplines
+
+/*
+* writes a function|procedure prototype and links the function|procedure name
+*/
+
+static void writeFuncProto()
+{
+ QList<Argument> ql;
+ QCString name,ret;
+ VhdlDocGen::parseFuncProto(g_FuncProto,ql,name,ret,FALSE);
+
+ if (name.isEmpty())
+ {
+ codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ return;
+ }
+ QStringList qlist=QStringList::split(name,g_FuncProto,FALSE);
+ QCString temp=(QCString)qlist[0];
+ codifyLines(temp.data(),g_CurrClass.data());
+ g_FuncProto.stripPrefix(temp.data());
+ temp.resize(0);
+ temp=g_CurrClass;
+ if (isPackageBody)
+ {
+ temp.stripPrefix("_");// _{package body name}
+ }
+ MemberDef *mdef=VhdlDocGen::findFunction(ql,name,temp,FALSE);
+
+ if (mdef)
+ {
+ generateFuncLink(*g_code,mdef);
+ g_FuncProto.stripPrefix(name.data());
+ codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ }
+ else
+ {
+ codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ }
+}// writeFuncProto
+
+/* writes a process prototype to the ouput */
+
+ static void writeProcessProto(){
+ codifyLines(g_FuncProto.data(),g_CurrClass.data());
+ g_vhdlKeyDict.clear();
+}// writeProcessProto
+
+/* writes a keyword */
+
+static bool writeColoredWord(QCString& word )
+{
+ QCString qcs=word.lower();
+ QCString *ss=VhdlDocGen::findKeyWord(qcs);
+ if (ss)
+ {
+ writeFont(ss->data(),word.data());
+ return TRUE;
+ }
+ return FALSE;
+}
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ while( c < max_size && g_inputString[g_inputPosition] )
+ {
+ *buf = g_inputString[g_inputPosition++] ;
+ c++; buf++;
+ }
+ return c;
+}
+
+%}
+
+
+B [ \t]
+BN [ \t\n\r]
+STRING ["][^"\n]*["]
+NAME [a-z_A-Z][ a-z_A-Z0-9]*
+FUNCNAME [a-z_A-Z"][a-z_A-Z0-9+*"/=<>-]*
+ID "$"?[a-z_A-Z][a-z_A-Z0-9]*
+SPECSIGN [:;, +*&\/=<>'\t]*
+DIGITSS [0-9]+|[0-9]+("#")*[0-9_a-fA-F\+\.\-]+("#")*
+ALLTYPESMAP {B}*[_a-zA-Z0-9. ]+{BN}*
+ALLTYPESMAP1 {BN}*[_a-zA-Z0-9.() ]+{BN}*
+
+ARCHITECTURE ^{B}*("architecture"){BN}+{FUNCNAME}{BN}+("of"){BN}+{FUNCNAME}
+PROCESS ({BN}*{FUNCNAME}{BN}*[:]+{BN}*("process"){BN}*[(]*)|[^a-zA-Z]("process "|"process("){BN}*[ (]*|[^a-zA-Z]("process"){BN}+
+
+END1 {B}*("end "){BN}+("if"|"case"|"loop"|"generate"|"for")
+END2 [^a-zA-Z_]("end"){BN}*[;]
+END3 {BN}*[^a-zA-Z]("end"){BN}+{FUNCNAME}{BN}*[;]
+END4 {B}*("end"){BN}+"function"{BN}+{FUNCNAME}{BN}*[;]
+ENDEFUNC {END3}|{END4}|{END2}
+
+KEYWORD ("new"|"event"|"break"|"case"|"end"|"loop"|"else"|"for"|"goto"|"if"|"return"|"generate"|"is"|"while"|"in")
+TYPEKW ^{B}*("type"|"subtype"|"constant"|"attribute"|"signal"|"variable","alias","configuration")
+FUNC ^{B}*("function"|"procedure"){BN}*{FUNCNAME}{BN}*("(")
+
+ARITHOP "+"|"-"|"/"|"*"|"%"|"/="|":="
+ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
+LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
+BITOP "&"|"|"|"^"|"<<"|">>"|"~"
+OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
+
+PORT {B}*("port"){BN}*("(")
+GENERIC {B}*("generic"){BN}*("(")
+
+BRACEOPEN [(]{1}
+BRACECLOSE [)]{1}
+
+TEXTT {B}*"--"[^\n]*
+
+MAPCOMPONENT1 ({ALLTYPESMAP}[:]{ALLTYPESMAP}{TEXTT}*{BN}+("port"|"generic"){BN}+("map"){BN}*("("){1})
+MAPCOMPONENT2 {BN}*("port"|"generic"){BN}+("map"){BN}*("("){1}
+MAPCOMPONENT3 ({ALLTYPESMAP}[:]{BN}*{ALLTYPESMAP1}{TEXTT}*{BN}+("port"|"generic"){BN}+("map"){BN}*("("){1})
+MAPCOMPONENT4 ({ALLTYPESMAP}[:]{BN}*("entity"|"component"|"configuration"){BN}+{ALLTYPESMAP1}{TEXTT}*{BN}*("port"|"generic"){BN}*("map"){BN}*("("){1})
+
+%option noyywrap
+%option nounput
+
+%x Bases
+%x ParseType
+%x ParseFuncProto
+%x ParseComponent
+%x ParsePackage
+%x ParseProcessProto
+%x ClassName
+%x PackageName
+%x ClassVar
+%x ClassesName
+%x Map
+%x Body
+
+%%
+
+. {
+ BEGIN(Bases);
+ }
+
+<Map>{BRACEOPEN} {
+ g_braceCount++;
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ BEGIN(Map);
+ }
+
+<Map>[^()\n,--]* { /* write and link a port map lines */
+ QCString tt(vhdlcodeYYtext);
+ VhdlDocGen::deleteAllChars(tt,',');
+ QRegExp r("=>");
+ QStringList ql=QStringList::split(r,tt,FALSE);
+ if (ql.count()>=2)
+ {
+ unsigned int index=0;
+ QCString t1=(QCString)ql[0];
+ char cc=t1.at(index);
+ while (cc==' ' || cc=='\t')
+ {
+ char c2[2];
+ c2[0]=cc;
+ c2[1]=0;
+ g_code->codify(c2);
+ index++;
+ if (index>=t1.size()) break;
+ cc=t1.at(index);
+ }
+
+ QCString s1=(QCString)ql[0];
+ s1=s1.stripWhiteSpace();
+
+ // if (!g_PortMapComp.isEmpty())
+ generateMemLink(*g_code,g_PortMapComp,s1);
+ while (index++<t1.size())
+ {
+ char cc=t1.at(index);
+ if (cc==' ' || cc=='\t')
+ {
+ char c2[2];
+ c2[0]=cc;
+ c2[1]=0;
+ g_code->codify(c2);
+ }
+ }
+ codifyLines("=>");
+ index=0;
+ QCString s2=(QCString)ql[1];
+ t1=s2;
+ cc=t1.at(index);
+ while (cc==' ' || cc=='\t')
+ {
+ char c2[2];
+ c2[0]=cc;
+ c2[1]=0;
+ g_code->codify(c2);
+ index++;
+ if (index>=t1.size()) break;
+ cc=t1.at(index);
+ }
+ s2=s2.stripWhiteSpace();
+ if (!checkString(s2))
+ generateMemLink(*g_code,g_CurrClass,s2);
+ while (index++<t1.size())
+ {
+ if (t1.at(index)==' ')
+ {
+ g_code->codify(" ");
+ }
+ }
+ }
+ else
+ {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ }
+ BEGIN(Map);
+ }
+
+<Map>"\n"|"," {
+ codifyLines(vhdlcodeYYtext);
+ BEGIN(Map);
+ }
+
+<Map>{BRACECLOSE} {
+ g_braceCount--;
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ if (g_braceCount==0)
+ {
+ BEGIN(Bases);
+ }
+ }
+
+<ParseFuncProto>{NAME} {
+ QCString tmp(vhdlcodeYYtext);
+ tmp=tmp.stripWhiteSpace();
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ g_vhdlKeyDict.insert(g_PrevString,new QCString(g_PrevString.data()));
+ if (!writeColoredWord(tmp))
+ {
+ generateMemLink(*g_code,g_CurrClass,tmp);
+ }
+ BEGIN(Bases);
+ }
+
+<ParseType>{STRING} {
+ QCString qcs(vhdlcodeYYtext);
+ VhdlDocGen::deleteAllChars(qcs,'"');
+ VhdlDocGen::deleteAllChars(qcs,' ');
+ if (VhdlDocGen::isNumber(qcs))
+ writeFont("vhdllogic",vhdlcodeYYtext);
+ else
+ writeFont("keyword",vhdlcodeYYtext);
+ }
+
+<ParseType>"\n" {
+ g_FuncProto.append(vhdlcodeYYtext);
+ if (isProto)
+ {
+ codifyLines(vhdlcodeYYtext);
+ }
+ BEGIN(ParseType);
+ }
+
+
+<ParseType>{TEXTT} {
+ g_FuncProto.append(vhdlcodeYYtext);
+ if (isProto)
+ {
+ writeFont("keyword",vhdlcodeYYtext);
+ }
+ BEGIN(ParseType);
+ }
+
+<ParseType>{ENDEFUNC} {
+ QRegExp regg("[\\s]");
+ QCString tt(vhdlcodeYYtext);
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ tt=tt.lower();
+ VhdlDocGen::deleteAllChars(tt,';');
+ tt.stripWhiteSpace();
+ QStringList ql=QStringList::split(regg,tt,FALSE);
+ int index=ql.findIndex(QCString("if"))+1;
+ index+=ql.findIndex(QCString("case"))+1;
+ index+=ql.findIndex(QCString("loop"))+1;
+ index+=ql.findIndex(QCString("generate"))+1;
+ if (index==0)
+ {
+ BEGIN(Bases);
+ }
+ else
+ {
+ BEGIN(ParseType);
+ }
+ }
+
+<ParseType>{END1} {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ g_vhdlKeyDict.clear();
+ }
+
+<ParseType>^{B}*("begin "|"begin") {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ isFuncProto=FALSE;
+ }
+
+<ParseType>{SPECSIGN} {
+ g_FuncProto.append(vhdlcodeYYtext);
+ if (isProto)
+ {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ }
+ }
+
+<ParseType>["_a-zA-Z0-9]* {
+ QCString val(vhdlcodeYYtext);
+ g_FuncProto.append(vhdlcodeYYtext);
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+
+ if (isFuncProto && g_braceCount==0)
+ {
+ g_vhdlKeyDict.insert(g_PrevString,new QCString(g_PrevString.data()));
+ }
+
+ if (isProto)
+ {
+ if (!writeColoredWord(val))
+ {
+ if (!isFuncProto && !g_vhdlKeyDict.find(g_PrevString))
+ {
+ val=val.stripWhiteSpace();
+ if (VhdlDocGen::isNumber(val))
+ {
+ startFontClass("vhdllogic");
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ endFontClass();
+ }
+ else
+ generateMemLink(*g_code,g_CurrClass,val);
+ }
+ else
+ {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ }
+ }
+ }
+ BEGIN(ParseType);
+ }
+
+<ParseType>{BRACEOPEN} {
+ g_braceCount++;
+ g_FuncProto+='(';
+ if (isProto)
+ {
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ }
+ BEGIN(ParseType);
+ }
+
+<ParseType>{BRACECLOSE} {
+ g_braceCount--;
+ g_FuncProto+=')';
+ if (isProto)
+ {
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ }
+ if (g_braceCount==0 && !isProto)// && !isPackageBody)
+ {
+ isProto=TRUE;
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ writeFuncProto();
+ BEGIN(Bases);
+ }
+ if (isPackageBody)
+ {
+ BEGIN(ParseType);
+ }
+ }
+
+
+<ClassesName>{FUNCNAME} {
+ QDict<QCString> mem;
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ g_CurrClass.resize(0);
+ g_CurrClass.append(vhdlcodeYYtext);
+ g_CurrClass=g_CurrClass.stripWhiteSpace();
+
+ if (!writeColoredWord(g_CurrScope))
+ {
+ generateClassOrGlobalLink(*g_code,vhdlcodeYYtext);
+ }
+ else
+ {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data());
+ }
+ BEGIN(Bases);
+ }
+
+
+<ParseComponent>{BRACEOPEN} {
+ g_braceCount++;
+ g_code->codify(vhdlcodeYYtext);
+ }
+
+
+<ParseComponent>{BRACECLOSE} {
+ g_braceCount--;
+ g_code->codify(vhdlcodeYYtext);
+ if (g_braceCount==0 && !isComponent)
+ {
+ g_tempComp.resize(0);
+ BEGIN(Bases);
+ }
+ else
+ {
+ BEGIN(ParseComponent);
+ }
+ }
+
+<ParseComponent>{B}*"-" {
+ if (strlen(vhdlcodeYYtext)>=2) // found text ?
+ {
+ writeFont("keyword",vhdlcodeYYtext);
+ }
+ else
+ {
+ writeFont("vhdlchar",vhdlcodeYYtext);
+ }
+ }
+
+<ParseComponent>{SPECSIGN} {
+ codifyLines(vhdlcodeYYtext);
+ }
+
+
+
+<ParseComponent>"\n"|" " {
+ codifyLines(vhdlcodeYYtext);
+ }
+
+<ParseComponent>{DIGITSS} {
+ startFontClass("vhdllogic");
+ codifyLines(vhdlcodeYYtext);
+ endFontClass();
+ }
+
+<ParseComponent>{PORT} {
+ codifyLines(vhdlcodeYYtext);
+ g_braceCount=1;
+ isComponent=FALSE;
+ }
+
+<ParseComponent>{GENERIC} {
+ codifyLines(vhdlcodeYYtext);
+ g_braceCount=1;
+ }
+
+<ParseComponent>[_a-zA_Z][_a-zA-Z0-9]* {
+ QCString temp(vhdlcodeYYtext);
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ if (!checkString(temp)){
+ if (!writeColoredWord(g_PrevString))
+ {
+ generateMemLink(*g_code,g_tempComp,temp);
+ }
+ }
+ }
+
+<ParseComponent>{STRING} {
+ QCString temp(vhdlcodeYYtext);
+ if (!checkString(temp))
+ codifyLines(vhdlcodeYYtext);
+ }
+
+
+<ParseProcessProto>[^()]* {
+ g_FuncProto.append(vhdlcodeYYtext);
+ }
+
+
+
+<ParseProcessProto>{BRACEOPEN} {
+ g_FuncProto.append(vhdlcodeYYtext);
+ g_braceCount++;
+ }
+
+<ParseProcessProto>{BRACECLOSE} {
+ g_FuncProto.append(vhdlcodeYYtext);
+ g_braceCount--;
+ if (g_braceCount==0)
+ {
+ writeProcessProto();
+ BEGIN(Bases);
+ }
+ }
+
+<ParsePackage>[^:;]* { //found package
+ QCString temp(vhdlcodeYYtext);
+ QStringList strl=QStringList::split(".",temp,FALSE);
+
+ if (strl.count()>2)
+ {
+ QCString s1=(QCString)strl[0];
+ QCString s2=(QCString)strl[1];
+ QCString s3=(QCString)strl[2];
+ s1.append(".");
+ s3.prepend(".");
+ codifyLines(s1.data(),g_CurrClass.data());
+ ClassDef *cd=VhdlDocGen::getPackageName(s2);
+ if (cd)
+ {
+ generateClassOrGlobalLink(*g_code,s2.data());
+ }
+ else
+ {
+ codifyLines(s2.data());
+ }
+ codifyLines(s3.data());
+ }
+ else
+ {
+ writeFont("keywordflow",vhdlcodeYYtext);
+ }
+ BEGIN(Bases);
+ }
+
+<Bases>{MAPCOMPONENT1}|{MAPCOMPONENT2}|{MAPCOMPONENT3}|{MAPCOMPONENT4} { // found port or generic map
+ QCString tt(vhdlcodeYYtext);
+ /*
+ if (tt.contains(':',FALSE))
+ {
+ isStartMap=TRUE;
+ }
+ else
+ {
+ isStartMap=FALSE;
+ }
+ */
+ int j=tt.find('.');
+
+ if (j>0)
+ {
+ QCString left=tt.left(j+1);
+ codifyLines(left.data());
+ tt=tt.right(tt.length()-j-1);
+ left=VhdlDocGen::getIndexWord(tt.data(),0);
+ if (!left.isEmpty())
+ {
+ if (left.contains('('))
+ {
+ j=left.find('(',FALSE);
+ QCString name=left.left(j);
+ generateClassOrGlobalLink(*g_code,name.data());
+ g_PortMapComp=name;
+ name=tt.right(tt.length()-name.length());
+ codifyLines(name.data());
+ }
+ else
+ {
+ generateClassOrGlobalLink(*g_code,left.data());
+ tt=tt.right(tt.length()-left.length()-1);
+ tt.prepend(" ");
+ g_PortMapComp=left;
+ codifyLines(tt.data());
+ }
+ }
+ }
+ else
+ {
+ if (tt.contains(':',FALSE))
+ codifyMapLines(tt.data());
+ else
+ codifyLines(tt.data());
+ }
+ g_braceCount=1;
+ BEGIN(Map);
+ }
+
+<Bases>^{B}*("component"){BN}+{FUNCNAME} { // found component
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ // writeFont("keywordflow",VhdlDocGen::getIndexWord(vhdlcodeYYtext,0).data());
+ // writeFont("vhdlkeyword"," ");
+ QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
+ temp=temp.stripWhiteSpace();
+ VhdlDocGen::deleteAllChars(temp,'\n');
+ g_tempComp=temp;
+ codifyLines(vhdlcodeYYtext,temp.data(),TRUE);
+ g_braceCount=0;
+
+ //if (getClass(temp.data()))
+ // generateClassOrGlobalLink(*g_code,temp.data());
+ //else
+ // generateMemLink(*g_code,g_CurrClass,temp);
+
+ isComponent=TRUE;
+ BEGIN(ParseComponent);
+ }
+
+
+
+<Bases>{ARCHITECTURE} { // found architecture
+ g_PortMapComp.resize(0);
+ // writeFont("vhdlkeyword",VhdlDocGen::getIndexWord(vhdlcodeYYtext,0).data());
+ // writeFont("vhdlkeyword"," ");
+ // writeFont("vhdlchar",VhdlDocGen::getIndexWord(vhdlcodeYYtext,1).data());
+ // writeFont("vhdlkeyword"," ");
+ // writeFont("vhdlkeyword",VhdlDocGen::getIndexWord(vhdlcodeYYtext,2).data());
+ // writeFont("vhdlkeyword"," ");
+ //QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
+ //temp=temp.stripWhiteSpace();
+ //temp+=("-");
+ //temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,3);
+ QCString temp = VhdlDocGen::getIndexWord(vhdlcodeYYtext,3);
+ temp+="::";
+ temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
+ g_CurrClass=temp;
+ VhdlDocGen::deleteAllChars(temp,'\n');
+ codifyLines(vhdlcodeYYtext,temp.data(),TRUE);
+ //generateClassOrGlobalLink(*g_code,temp.data());
+ isPackageBody=FALSE;
+ BEGIN(ClassName);
+ }
+
+
+<Bases>^{B}*("package "){BN}*("body"){BN}*{FUNCNAME} { // found package body
+ QCString ss(vhdlcodeYYtext);
+ QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,2);
+ QStringList ql=QStringList::split(temp,ss,FALSE);
+ QCString ll=(QCString)ql[0];
+ codifyLines(ll.data(),g_CurrClass.data());
+ temp=temp.stripWhiteSpace();
+ temp.prepend("_");
+ generateClassOrGlobalLink(*g_code,temp.data());
+ g_CurrClass.resize(0);
+ g_CurrClass=temp;
+ isProto=FALSE;
+ isPackageBody=TRUE;
+ // BEGIN(ClassesName);
+ }
+
+<Bases>{PROCESS} { // found process
+ isFuncProto=TRUE;
+ g_FuncProto.resize(0);
+ g_FuncProto.append(vhdlcodeYYtext);
+ g_vhdlKeyDict.clear();
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ if (g_PrevString.contains('('))
+ {
+ g_braceCount=1;
+ BEGIN(ParseProcessProto);
+ }
+ else
+ {
+ writeProcessProto();
+ }
+ }
+
+<Bases>("end"){BN}+("process") { // end of process
+ isFuncProto=FALSE;
+ codifyLines(vhdlcodeYYtext);
+ BEGIN(Bases);
+ }
+
+
+<Bases>^{B}*("begin "|"begin") {
+ isFuncProto=FALSE;
+ writeFont("vhdlkeyword",vhdlcodeYYtext);
+ }
+
+<Bases>^{B}*("use"|"library"){BN}+ { //found package or library
+ writeFont("vhdlkeyword",vhdlcodeYYtext);
+ BEGIN(ParsePackage);
+ }
+
+
+<Bases>^{B}*("use"){BN}+("configuration")[^\n]* {
+ codifyLines(vhdlcodeYYtext);
+ }
+
+
+
+<Bases>{FUNC} { // found function|procedure
+ g_vhdlKeyDict.clear();
+ g_FuncProto.resize(0);
+ isProto=FALSE;
+ g_FuncProto.append(vhdlcodeYYtext);
+ g_braceCount=1;
+ BEGIN(ParseType);
+ }
+
+
+
+<Bases>^{B}*("entity"|"package"){BN}+ {
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ writeFont("keywordflow",vhdlcodeYYtext);
+ isPackageBody=FALSE;
+ BEGIN(ClassesName);
+ }
+
+
+<Bases>{KEYWORD} { // found keyword
+ QCString qcs(vhdlcodeYYtext);
+ if (!writeColoredWord(qcs))
+ {
+ startFontClass("vhdlchar");
+ g_code->codify(vhdlcodeYYtext);
+ endFontClass();
+ }
+ }
+
+
+<Bases>{ID} {
+ appStringLower(g_PrevString,vhdlcodeYYtext);
+ QCString temp(vhdlcodeYYtext);
+ temp=temp.stripWhiteSpace();
+
+ if (!writeColoredWord(temp))
+ {
+ startFontClass("vhdlchar");
+ generateMemLink(*g_code,g_CurrClass,temp);
+ endFontClass();
+ }
+ }
+
+<Bases,ParseComponent>{DIGITSS} {
+ startFontClass("vhdllogic");
+ codifyLines(vhdlcodeYYtext);
+ endFontClass();
+ }
+
+<Bases>^{B}*("use"){BN}+("entity"|"component")[^\n]* {
+ codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
+ }
+
+
+<Bases>{TYPEKW} {
+ codifyLines(vhdlcodeYYtext);
+ if (isFuncProto)
+ {
+ BEGIN(ParseFuncProto);
+ }
+ else
+ {
+ BEGIN(Bases);
+ }
+ }
+
+<Bases>{OPERATOR} {
+ startFontClass("vhdlchar");
+ g_code->codify(vhdlcodeYYtext);
+ endFontClass();
+ }
+
+<Bases>","|"."|":"|"'"|"("|")" {
+ startFontClass("vhdlchar");
+ g_code->codify(vhdlcodeYYtext);
+ endFontClass();
+ }
+
+<Bases>{STRING} {
+ QCString qcs(vhdlcodeYYtext);
+ VhdlDocGen::deleteAllChars(qcs,'"');
+ VhdlDocGen::deleteAllChars(qcs,' ');
+
+ if (VhdlDocGen::isNumber(qcs))
+ writeFont("vhdllogic",vhdlcodeYYtext);
+ else
+ writeFont("keyword",vhdlcodeYYtext);
+ }
+
+<*>\n {
+ codifyLines(vhdlcodeYYtext);
+ BEGIN(Bases);
+ }
+
+<*>. {
+ g_code->codify(vhdlcodeYYtext);
+ }
+
+<*>\n{TEXTT} { // found normal or special comment on its own line
+ QCString text(vhdlcodeYYtext);
+ int i=text.find("--");
+ if (text.mid(i,3)=="--!" && // hide special comment
+ Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ g_yyLineNr++; // skip complete line
+ }
+ else // normal comment
+ {
+ startFontClass("comment");
+ codifyLines(text);
+ endFontClass();
+ }
+ }
+<*>{TEXTT} { // found normal or special comment after something
+ QCString text(vhdlcodeYYtext);
+ int i=text.find("--");
+ if (text.mid(i,3)=="--!" &&
+ Config_getBool("STRIP_CODE_COMMENTS"))
+ {
+ // hide special comment
+ }
+ else // normal comment
+ {
+ startFontClass("comment");
+ codifyLines(text);
+ endFontClass();
+ }
+ }
+
+
+%%
+
+/*@ ----------------------------------------------------------------------------
+ */
+
+void resetVhdlCodeParserState()
+{
+ g_vhdlKeyDict.setAutoDelete(TRUE);
+ g_vhdlKeyDict.clear();
+}
+
+void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString &s,
+ bool exBlock, const char *exName,FileDef *fd,
+ int startLine,int endLine,bool inlineFragment,
+ MemberDef *memberDef,bool)
+{
+ //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd);
+ if (s.isEmpty()) return;
+ if (memberDef)
+ {
+ ClassDef *dd=memberDef->getClassDef();
+ if (dd) g_CurrClass=dd->className();
+ startLine--;
+ }
+ resetVhdlCodeParserState();
+ g_code = &od;
+ g_inputString = s;
+ g_inputPosition = 0;
+ g_currentFontClass = 0;
+ g_needsTermination = FALSE;
+
+ if (endLine!=-1)
+ g_inputLines = endLine+1;
+ else
+ g_inputLines = countLines();
+
+ if (startLine!=-1)
+ g_yyLineNr = startLine;
+ else
+ g_yyLineNr = 1;
+
+
+ // g_theCallContext.clear();
+ g_classScope = className;
+ g_exampleName = exName;
+ g_sourceFileDef = fd;
+ if (exBlock && fd==0)
+ {
+ // create a dummy filedef for the example
+ g_sourceFileDef = new FileDef("",exName);
+ }
+ if (g_sourceFileDef)
+ {
+ setCurrentDoc(g_sourceFileDef->name(),g_sourceFileDef->getSourceFileBase());
+ }
+ g_currentDefinition = 0;
+ g_currentMemberDef = 0;
+ g_vhdlMember=0;
+ if (!g_exampleName.isEmpty())
+ {
+ g_exampleFile = convertNameToFile(g_exampleName+"-example");
+ }
+ g_includeCodeFragment = inlineFragment;
+ if (!memberDef)
+ {
+ startCodeLine();
+ }
+ // g_type.resize(0);
+ // g_name.resize(0);
+ // g_args.resize(0);
+ g_parmName.resize(0);
+ g_parmType.resize(0);
+ if (memberDef)
+ {
+ setParameterList(memberDef);
+ }
+ vhdlcodeYYrestart( vhdlcodeYYin );
+ BEGIN( Bases );
+ vhdlcodeYYlex();
+ g_lexInit=TRUE;
+ if (g_needsTermination)
+ {
+ endCodeLine();
+ }
+ if (exBlock && g_sourceFileDef)
+ {
+ // delete the temporary file definition used for this example
+ delete g_sourceFileDef;
+ g_sourceFileDef=0;
+ }
+ return;
+}
+
+void codeFreeVhdlScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ vhdlcodeYYlex_destroy();
+ }
+#endif
+}
+
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
+extern "C" { // some bogus code to keep the compiler happy
+ void vhdlcodeYYdummy() { yy_flex_realloc(0,0); }
+}
+#elif YY_FLEX_SUBMINOR_VERSION<33
+#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
+#endif
+
+
+
+
diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp
new file mode 100644
index 0000000..a87d53e
--- /dev/null
+++ b/src/vhdldocgen.cpp
@@ -0,0 +1,2569 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/******************************************************************************
+ * Parser for VHDL subset
+ * written by M. Kreis
+ * supports VHDL-87
+ * does not support VHDL-AMS
+ ******************************************************************************/
+
+// global includes
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <qcstring.h>
+#include <qfileinfo.h>
+#include <qstringlist.h>
+
+/* --------------------------------------------------------------- */
+
+// local includes
+#include "vhdldocgen.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+#include "language.h"
+#include "commentscan.h"
+#include "index.h"
+#include "definition.h"
+#include "searchindex.h"
+#include "outputlist.h"
+#include "parserintf.h"
+/* --------------------------------------------------------------- */
+
+//#define theTranslator_vhdlType theTranslator->trVhdlType
+#define theTranslator_vhdlType VhdlDocGen::trVhdlType
+
+static QDict<QCString> g_vhdlKeyDict0(17,FALSE);
+static QDict<QCString> g_vhdlKeyDict1(17,FALSE);
+static QDict<QCString> g_vhdlKeyDict2(17,FALSE);
+
+static QCString g_vhdlkeyword("vhdlkeyword");
+static QCString g_vhdltype("comment");
+static QCString g_vhdllogic("vhdllogic");
+
+// keywords
+static const char* g_vhdlKeyWordMap0[] =
+{
+ "std","ieee","work","standard","textio","std_logic_1164",
+ "std_logic_arith","std_logic_misc","std_logic_signed","std_logic_textio",
+ "std_logic_unsigned","numeric_bit","numeric_std","math_complex","math_real",
+ "vital_primitives","vital_timing","severity_level","time","delay_length",
+ "natural", "positive", "bit_vector","file_open_kind","file_open_status",
+ "line","text","side", "width","event","rising_edge", "falling_edge",
+ "access","after","alias", "all","architecture","array", "assert","attribute",
+ "begin","block","body", "buffer", "bus", "case", "component", "configuration",
+ "constant", "disconnect", "downto", "else", "elsif", "end", "entity", "exit",
+ "file", "for", "function", "generate", "generic", "group", "guarded", "if",
+ "impure", "in", "inertial", "inout", "is","label", "library", "linkage",
+ "literal", "loop","map", "new", "next", "null", "of", "on", "open", "others",
+ "out", "package", "port", "postponed", "procedure", "process", "pure",
+ "range", "record", "register", "reject", "report", "return","select",
+ "severity", "shared", "signal", "subtype", "then", "to", "transport",
+ "type","unaffected", "units", "until", "use","variable", "wait", "when",
+ "while", "with","true","false","protected",0
+};
+
+// type
+static const char* g_vhdlKeyWordMap1[] =
+{
+ "natural","unsigned","signed","string","boolean", "bit","character",
+ "std_ulogic","std_ulogic_vector","sTd_logic","std_logic_vector","integer",
+ "real","zzz",0
+};
+
+// logic
+static const char* g_vhdlKeyWordMap2[] =
+{
+ "abs","and","or","not","mod", "xor","rem","xnor","ror","rol","sla",
+ "sll",0
+};
+
+VhdlDocGen::VhdlDocGen()
+{
+}
+
+VhdlDocGen::~VhdlDocGen()
+{
+}
+
+void VhdlDocGen::init()
+{
+ int j=0;
+ g_vhdlKeyDict0.setAutoDelete(TRUE);
+ g_vhdlKeyDict1.setAutoDelete(TRUE);
+ g_vhdlKeyDict2.setAutoDelete(TRUE);
+
+ j=0;
+ while (g_vhdlKeyWordMap0[j])
+ {
+ g_vhdlKeyDict0.insert(g_vhdlKeyWordMap0[j],
+ new QCString(g_vhdlKeyWordMap0[j]));
+ j++;
+ }
+
+ j=0;
+ while (g_vhdlKeyWordMap1[j])
+ {
+ g_vhdlKeyDict1.insert(g_vhdlKeyWordMap1[j],
+ new QCString(g_vhdlKeyWordMap1[j]));
+ j++;
+ }
+
+ j=0;
+ while (g_vhdlKeyWordMap2[j])
+ {
+ g_vhdlKeyDict2.insert(g_vhdlKeyWordMap2[j],
+ new QCString(g_vhdlKeyWordMap2[j]));
+ j++;
+ }
+
+}// buildKeyMap
+
+/*!
+ * returns the color of a keyword
+ */
+
+QCString* VhdlDocGen::findKeyWord(const QCString& word)
+{
+ if (word.isEmpty() || word.at(0)=='\0') return 0;
+ //printf("VhdlDocGen::findKeyWord(%s)\n",word.data());
+
+ if (g_vhdlKeyDict0.find(word.lower()))
+ return &g_vhdlkeyword;
+
+ if (g_vhdlKeyDict1.find(word.lower()))
+ return &g_vhdltype;
+
+ if (g_vhdlKeyDict2.find(word.lower()))
+ return &g_vhdllogic;
+
+ return 0;
+}
+
+/*!
+ * returns the parsed entry at line xxx
+ */
+
+
+void VhdlDocGen::debugClassName(ClassSDict* mDict)
+{
+ // for each class
+ ClassSDict::Iterator cli(*mDict);
+ ClassDef *cd;
+ for ( ; (cd=cli.current()) ; ++cli )
+ {
+ printf("\n -------------------------class----------------------------------------\n");
+
+ QCString nnn=cd->className();
+ QCString qref=cd->getReference();
+ QCString outBase=cd->getOutputFileBase();
+ QCString fileBase=cd->getFileBase();
+ QCString compType=cd->compoundTypeString();
+ QCString inDoc=cd->documentation();//->inbodyDocumentation();
+ printf("\n refernz [%p]",cd);
+ printf("\n compType [%s]",compType.data());
+ printf("\n Name [%s]",nnn.data());
+ printf("\n TYPE[%d ",cd->definitionType());
+ printf("\n Ref [%s] ",qref.data());
+ printf("\n OutBase [%s] fileBase [%s]",outBase.data(),fileBase.data());
+
+ printf("\n -------------------------------------------------------------------\n");
+
+ }// for
+}// Debug Class Name
+
+
+bool found =FALSE;
+static Entry eMerge;
+
+ClassDef *VhdlDocGen::getClass(const char *name)
+{
+ if (name==0 || name[0]=='\0') return 0;
+
+ ClassDef *cd=0;
+ QCString temp(name);
+ //temp=temp.lower();
+ temp=temp.stripWhiteSpace();
+ cd= Doxygen::classSDict->find(temp.data());
+ return cd;
+}
+
+/*!
+ * adds architectures to their entity
+ */
+void VhdlDocGen::computeVhdlComponentRelations()
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ for (cli.toFirst();cli.current();++cli)
+ {
+ cli.current()->visited=FALSE;
+ ClassDef * cd = cli.current();
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS ||
+ (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
+ {
+ QCString bName=cd->name();
+ int i=bName.find("::");
+ if (i>0)
+ {
+ QCString entityName=bName.left(i);
+ entityName.stripPrefix("_");
+ ClassDef *classEntity=Doxygen::classSDict->find(entityName);
+ // entity for architecutre ?
+ if (classEntity)
+ {
+ // printf("\n entity %s arch %s",entityName.data(),bName.data());
+ classEntity->insertBaseClass(cd,bName,Public,Normal,0);
+ cd->insertSubClass(classEntity,Public,Normal,0);
+ }
+ }
+ }
+ }
+} // computeVhdlComponentRelations
+
+
+/*
+ * returns a reference, if one class [package(body),entity or an architecture is found]
+ */
+
+ClassDef* VhdlDocGen::findComponent(int type)
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd=0;
+
+ for ( ; (cd=cli.current()) ; ++cli )
+ {
+ if (cd->protection()==type)
+ return cd;
+ }
+ return cd;
+}
+
+ClassDef* VhdlDocGen::getPackageName(const QCString & name)
+{
+ ClassDef* cd=0;
+ QStringList ql=QStringList::split(".",name,FALSE);
+ cd=getClass(name);
+
+ return cd;
+}
+
+MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& memName)
+{
+ QDict<QCString> packages(17,FALSE);
+ packages.setAutoDelete(TRUE);
+ ClassDef* cd;
+ MemberDef *mdef=0;
+
+ cd=getClass(className);
+ //printf("VhdlDocGen::findMember(%s,%s)=%p\n",className.data(),memName.data(),cd);
+ if (cd==0) return 0;
+
+ mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::variableMembers);
+ if (mdef) return mdef;
+ mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::pubMethods);
+ if (mdef) return mdef;
+
+ // nothing found so far
+ // if we are an architecture or package body search in entitiy
+
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS ||
+ (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
+ {
+ Definition *d = cd->getOuterScope();
+ // searching upper/lower case names
+
+ QCString tt=d->name();
+ ClassDef *ecd =getClass(tt);
+ if (!ecd)
+ {
+ tt=tt.upper();
+ ecd =getClass(tt);
+ }
+ if (!ecd)
+ {
+ tt=tt.lower();
+ ecd =getClass(tt);
+ }
+
+ if (ecd) //d && d->definitionType()==Definition::TypeClass)
+ {
+ //ClassDef *ecd = (ClassDef*)d;
+ mdef=VhdlDocGen::findMemberDef(ecd,memName,MemberList::variableMembers);
+ if (mdef) return mdef;
+ mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::pubMethods);
+ if (mdef) return mdef;
+ }
+ //cd=getClass(getClassName(cd));
+ //if (!cd) return 0;
+ }
+ // nothing found , so we are now searching all included packages
+ VhdlDocGen::findAllPackages(className,packages);
+ //cd=getClass(className.data());
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS ||
+ (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
+ {
+ Definition *d = cd->getOuterScope();
+
+ QCString tt=d->name();
+ ClassDef *ecd =getClass(tt);
+ if (!ecd)
+ {
+ tt=tt.upper();
+ ecd =getClass(tt);
+ }
+ if (!ecd)
+ {
+ tt=tt.lower();
+ ecd =getClass(tt);
+ }
+
+ if (ecd) //d && d->definitionType()==Definition::TypeClass)
+ {
+ VhdlDocGen::findAllPackages(ecd->className(),packages);
+ }
+ }
+
+ QDictIterator<QCString> packli(packages);
+ QCString *curString;
+ for (packli.toFirst();(curString=packli.current());++packli)
+ {
+ if (curString)
+ {
+ cd=VhdlDocGen::getPackageName(*curString);
+ if (!cd)
+ {
+ *curString=curString->upper();
+ cd=VhdlDocGen::getPackageName(*curString);
+ }
+ if (!cd)
+ {
+ *curString=curString->lower();
+ cd=VhdlDocGen::getPackageName(*curString);
+ }
+ }
+ if (cd)
+ {
+ mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::variableMembers);
+ if (mdef) return mdef;
+ mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::pubMethods);
+ if (mdef) return mdef;
+ }
+ } // for
+ return 0;
+}//findMember
+
+/**
+ * This function returns the entity|package
+ * in which the key (type) is found
+ */
+
+MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList::ListType type)
+{
+ // return cd->getMemberByName(key);//does not work
+ MemberDef *md=0;
+
+ MemberList *ml= cd->getMemberList(type);
+ if (ml==0) return 0;
+
+ MemberListIterator fmni(*ml);
+
+ for (fmni.toFirst();(md=fmni.current());++fmni)
+ {
+ if (stricmp(key.data(),md->name().data())==0)
+ return md;
+ }
+ return 0;
+}//findMemberDef
+
+/*!
+ * finds all included packages of an Entity or Package
+ */
+
+void VhdlDocGen::findAllPackages(const QCString& className,QDict<QCString>& qdict)
+{
+ ClassDef *cdef=getClass(className);
+ if (cdef)
+ {
+ MemberList *mem=cdef->getMemberList(MemberList::variableMembers);
+ MemberDef *md;
+
+ if (mem)
+ {
+ MemberListIterator fmni(*mem);
+ for (fmni.toFirst();(md=fmni.current());++fmni)
+ {
+ if (VhdlDocGen::isPackage(md))
+ {
+ QCString *temp1=new QCString(md->name().data());
+ //*temp1=temp1->lower();
+ QCString p(md->name().data());
+ //p=p.lower();
+ ClassDef* cd=VhdlDocGen::getPackageName(*temp1);
+ if (cd)
+ {
+ QCString *ss=qdict.find(*temp1);
+ if (ss==0)
+ {
+ qdict.insert(p,temp1);
+ QCString tmp=cd->className();
+ VhdlDocGen::findAllPackages(tmp,qdict);
+ }
+ else delete temp1;
+ }
+ else delete temp1;
+ }
+ }//for
+ }//if
+ }//cdef
+}// findAllPackages
+
+/*!
+ * returns the function with the matching argument list
+ * is called in vhdlcode.l
+ */
+
+MemberDef* VhdlDocGen::findFunction(const QList<Argument> &ql,
+ const QCString& funcname,
+ const QCString& package, bool type)
+{
+ MemberDef* mdef=0;
+ int funcType;
+ ClassDef *cdef=getClass(package.data());
+ if (cdef==0) return 0;
+
+ if (type)
+ funcType=VhdlDocGen::PROCEDURE;
+ else
+ funcType=VhdlDocGen::FUNCTION;
+
+ MemberList *mem=cdef->getMemberList(MemberList::pubMethods);
+
+ if (mem)
+ {
+ MemberListIterator fmni(*mem);
+ for (fmni.toFirst();(mdef=fmni.current());++fmni)
+ {
+ QCString mname=mdef->name();
+ if ((VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isVhdlFunction(mdef)) && (VhdlDocGen::compareString(funcname,mname)==0))
+ {
+ LockingPtr<ArgumentList> alp = mdef->argumentList();
+
+ // ArgumentList* arg2=mdef->getArgumentList();
+ if (alp==0) break;
+ ArgumentListIterator ali(*alp.pointer());
+ ArgumentListIterator ali1(ql);
+
+ if (ali.count() != ali1.count()) break;
+
+ Argument *arg,*arg1;
+ int equ=0;
+
+ for (;(arg=ali.current());++ali)
+ {
+ arg1=ali1.current(); ++ali1;
+ equ+=abs(VhdlDocGen::compareString(arg->type,arg1->type));
+
+ QCString s1=arg->type;
+ QCString s2=arg1->type;
+ VhdlDocGen::deleteAllChars(s1,' ');
+ VhdlDocGen::deleteAllChars(s2,' ');
+ equ+=abs(VhdlDocGen::compareString(s1,s2));
+ s1=arg->attrib;
+ s2=arg1->attrib;
+ VhdlDocGen::deleteAllChars(s1,' ');
+ VhdlDocGen::deleteAllChars(s2,' ');
+ equ+=abs(VhdlDocGen::compareString(s1,s2));
+ // printf("\n 1. type [%s] name [%s] attrib [%s]",arg->type,arg->name,arg->attrib);
+ // printf("\n 2. type [%s] name [%s] attrib [%s]",arg1->type,arg1->name,arg1->attrib);
+ } // for
+ if (equ==0) return mdef;
+ }//if
+ }//for
+ }//if
+ return mdef;
+} //findFunction
+
+/*!
+ * returns the function with the matching argument list
+ * is called in vhdscan.l
+ */
+
+Entry* VhdlDocGen::findFunction( Entry* root, Entry* func)
+{
+ //bool found=FALSE;
+ Entry *found=0;
+ int functype=func->spec;
+ EntryListIterator eli(*root->children());
+ Entry *rt;
+ for (;(rt=eli.current());++eli)
+ {
+ if (rt->spec==functype && VhdlDocGen::compareString(rt->name,func->name)==0 && rt!=func )
+ {
+ if (VhdlDocGen::compareArgList(func->argList,rt->argList))
+ {
+ found=rt;
+ return found;
+ }
+ }//if1
+ if (!found)
+ {
+ found = VhdlDocGen::findFunction(rt,func);
+ }
+ } // for
+ return found;
+}// findFunction
+
+/*
+ * compares two argument list of a fuction|procedure
+ */
+
+bool VhdlDocGen::compareArgList(ArgumentList* l1,ArgumentList* l2)
+{
+ if (l1== 0 || l2== 0) return FALSE;
+
+ ArgumentListIterator ali(*l1);
+ ArgumentListIterator ali1(*l2);
+
+ if (ali.count() != ali1.count()) return FALSE;
+
+ Argument *arg,*arg1;
+ int equ=0;
+
+ for (;(arg=ali.current());++ali)
+ {
+ bool found = FALSE;
+ for (ali1.toFirst();(arg1=ali1.current());++ali1)
+ {
+ equ=0;
+ QCString s1=arg->type;
+ QCString s2=arg1->type;
+ VhdlDocGen::deleteAllChars(s1,' '); // remove whitespaces
+ VhdlDocGen::deleteAllChars(s2,' ');
+ equ+=abs(VhdlDocGen::compareString(s1,s2));
+ s1=arg->attrib;
+ s2=arg1->attrib;
+ VhdlDocGen::deleteAllChars(s1,' ');
+ VhdlDocGen::deleteAllChars(s2,' ');
+ equ+=abs(VhdlDocGen::compareString(s1,s2));
+ if (equ==0) found=TRUE;
+ }
+ if (!found) return FALSE;
+ }
+ return TRUE;
+}// compareArgList
+
+/*
+ * finds a matching prototype for a function description
+ */
+
+Entry* VhdlDocGen::findFunction(Entry* func)
+{
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for (;(cd=cli.current());++cli)
+ {
+ MemberList *mf = cd->getMemberList (MemberList::pubMethods);
+ if (mf)
+ {
+ MemberListIterator fmni(*mf);
+ MemberDef *mdd;
+ for (fmni.toFirst();(mdd=fmni.current());++fmni)
+ {
+ int type=mdd->getMemberSpecifiers();
+ if (type==VhdlDocGen::PROCEDURE || type==VhdlDocGen::FUNCTION)
+ {
+ QCString nnk=mdd->name();
+ QCString ff=func->name;
+
+ if (stricmp(mdd->name(),ff.data())==0)
+ {
+ LockingPtr< ArgumentList > lp=mdd->argumentList();
+ ArgumentList *l=lp.pointer();
+ if (VhdlDocGen::compareArgList(l,func->argList))
+ {
+ mdd->setDocumentation(func->doc.data(),func->docFile.data(),func->docLine,TRUE);
+ mdd->setBriefDescription(func->brief,func->briefFile,func->briefLine);
+ addMemberToGroups(func,mdd);// do not forget grouping!
+ return func;
+ }
+ }
+ }
+ }
+ }// if
+ }//for
+ return 0;
+}// findFunction
+
+/*
+ * adds the documentation for a function|procedure
+ */
+
+void VhdlDocGen::addFuncDoc(EntryNav* rootNav)
+{
+ Entry *root = rootNav->entry();
+ if (root && root->spec==VhdlDocGen::DOCUMENT)
+ {
+ Entry *func=VhdlDocGen::findFunction(root);
+ if (!func && Config_getBool("WARNINGS"))
+ {
+ warn(root->fileName,root->docLine,
+ "warning: documentation for unknown function %s found.\n",
+ root->name.data()
+ );
+ }
+ }
+}// AddFuncDoc
+
+/*!
+ * returns the class title+ref
+ */
+
+QCString VhdlDocGen::getClassTitle(const ClassDef *cd)
+{
+ QCString pageTitle;
+ if (cd==0) return "";
+ pageTitle+=cd->displayName();
+ pageTitle=VhdlDocGen::getClassName(cd);
+ int ii=cd->protection();
+ pageTitle+=" ";
+ pageTitle+=theTranslator_vhdlType(ii+2,TRUE);
+ pageTitle+=" ";
+ return pageTitle;
+} // getClassTitle
+
+/* returns the class name without their prefixes */
+
+QCString VhdlDocGen::getClassName(const ClassDef* cd)
+{
+ QCString temp;
+ if (cd==0) return "";
+
+ if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
+ {
+ temp=cd->name();
+ temp.stripPrefix("_");
+ return temp;
+ }
+ //if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS)
+ //{
+ // QStringList qlist=QStringList::split("-",cd->className(),FALSE);
+ // if (qlist.count()>1)
+ // return (QCString)qlist[1];
+ // return "";
+ //}
+ return substitute(cd->className(),"::",".");
+}
+
+/*!
+ * writes an inline link form entity|package to architecture|package body and vice verca
+ */
+
+void VhdlDocGen::writeInlineClassLink(const ClassDef* cd ,OutputList& ol)
+{
+ QList<QCString> ql;
+ ql.setAutoDelete(TRUE);
+ QCString nn=cd->className();
+ int ii=(int)cd->protection()+2;
+
+ QCString type;
+ if (ii==VhdlDocGen::ENTITY)
+ type=theTranslator_vhdlType(VhdlDocGen::ARCHITECTURE,TRUE);
+ else if (ii==VhdlDocGen::ARCHITECTURE)
+ type=theTranslator_vhdlType(VhdlDocGen::ENTITY,TRUE);
+ else if (ii==VhdlDocGen::PACKAGE_BODY)
+ type=theTranslator_vhdlType(VhdlDocGen::PACKAGE,TRUE);
+ else if (ii==VhdlDocGen::PACKAGE)
+ type=theTranslator_vhdlType(VhdlDocGen::PACKAGE_BODY,TRUE);
+
+ //type=type.lower();
+ type+=" >> ";
+ ol.disable(OutputGenerator::RTF);
+ ol.disable(OutputGenerator::Man);
+ ol.lineBreak();
+ ol.lineBreak();
+
+ if (ii==VhdlDocGen::PACKAGE_BODY)
+ {
+ nn.stripPrefix("_");
+ cd=getClass(nn.data());
+ }
+ else if (ii==VhdlDocGen::PACKAGE)
+ {
+ nn.prepend("_");
+ cd=getClass(nn.data());
+ }
+ else if (ii==VhdlDocGen::ARCHITECTURE)
+ {
+ QStringList qlist=QStringList::split("-",nn,FALSE);
+ nn=qlist[1];
+ cd=VhdlDocGen::getClass(nn.data());
+ }
+
+ QCString opp;
+ if (ii==VhdlDocGen::ENTITY)
+ {
+ VhdlDocGen::findAllArchitectures(ql,cd);
+ int j=ql.count();
+ for (int i=0;i<j;i++)
+ {
+ QCString *temp=ql.at(i);
+ QStringList qlist=QStringList::split("-",*temp,FALSE);
+ QCString s1=(QCString)qlist[0];
+ QCString s2=(QCString)qlist[1];
+ s1.stripPrefix("_");
+ if (j==1) s1.resize(0);
+ ClassDef*cc = getClass(temp->data());
+ if (cc)
+ {
+ VhdlDocGen::writeVhdlLink(cc,ol,type,s2,s1);
+ }
+ }
+ }
+ else
+ {
+ VhdlDocGen::writeVhdlLink(cd,ol,type,nn,opp);
+ }
+
+ ol.enable(OutputGenerator::Man);
+ ol.enable(OutputGenerator::RTF);
+
+}// write
+
+/*
+ * finds all architectures which belongs to an entiy
+ */
+void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd)
+{
+ ClassDef *citer;
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ for ( ; (citer=cli.current()) ; ++cli )
+ {
+ QCString jj=citer->className();
+ if (cd != citer && jj.contains('-')!=-1)
+ {
+ QStringList ql=QStringList::split("-",jj,FALSE);
+ QCString temp=(QCString)ql[1];
+ if (stricmp(cd->className().data(),temp.data())==0)
+ {
+ QCString *cl=new QCString(jj.data());
+ qll.insert(0,cl);
+ }
+ }
+ }// for
+}//findAllArchitectures
+
+/*
+ * writes the link entity >> .... or architecture >> ...
+ */
+
+void VhdlDocGen::writeVhdlLink(const ClassDef* ccd ,OutputList& ol,QCString& type,QCString& nn,QCString& behav)
+{
+ if (ccd==0) return;
+ QCString temp=ccd->getOutputFileBase();
+ ol.startBold();
+ ol.docify(type.data());
+ ol.endBold();
+ nn.stripPrefix("_");
+ ol.writeObjectLink(ccd->getReference(),ccd->getOutputFileBase(),ccd->anchor(),nn.data());
+
+ if (!behav.isEmpty())
+ {
+ behav.prepend(" ");
+ ol.startBold();
+ ol.docify(behav.data());
+ ol.endBold();
+ }
+ /*
+ if (Config_getBool("SOURCE_BROWSER")) { // writes a source link for latex docu
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Latex);
+ ol.docify(" | ");
+ ol.startEmphasis();
+ FileDef* fd=ccd->getFileDef();
+ if (fd)
+ ol.writeObjectLink(0,fd->getSourceFileBase(),0,theTranslator->trGotoSourceCode().data());
+ ol.endEmphasis();
+ ol.popGeneratorState();
+ }
+ */
+ ol.lineBreak();
+}
+
+bool VhdlDocGen::compareString(const QCString& s1,const QCString& s2)
+{
+ QCString str1=s1.stripWhiteSpace();
+ QCString str2=s2.stripWhiteSpace();
+
+ return stricmp(str1.data(),str2.data());
+}
+
+bool VhdlDocGen::getSigTypeName(QList<QCString>& ql, const char* str,QCString& buffer)
+{
+ //QCString temp(str);
+ //QStringList qlist=QStringList::split(" is ",temp,FALSE);
+ //if (qlist.count()!=2) return FALSE;
+ //temp.resize(0);
+ //temp+=(QCString)qlist[0]+":"+(QCString)qlist[1];
+ //return VhdlDocGen::getSigName(ql,temp.data(),buffer);
+ return VhdlDocGen::getSigName(ql,str,buffer);
+}
+
+/*!
+ * divides a port input in its name,direction and type
+ * @param ql stores the input name(s)
+ * @param str input string
+ * @param buffer stores the input direction
+ * @returns FALSE if it is a port
+ */
+
+bool VhdlDocGen::getSigName(QList<QCString>& ql,
+ const char* str,QCString& buffer)
+{
+ int j,ll,index;
+ const char *signal = "signal ";
+ QCString qmem;
+ QCString temp(str);
+ QCString st(str);
+
+ //QRegExp semi(",");
+ //QRegExp r(":");
+
+ // colon position
+ j = temp.find(':');
+ if (j < 0) return FALSE; // no input definition
+ st=st.left(j); // name only
+ index=st.find(signal,0,FALSE);
+ if (index > -1) // found "signal "
+ {
+ qmem=st.remove(index,strlen(signal)); // strip it
+ temp=qmem;
+ st=qmem;
+ }
+ else
+ {
+ qmem=temp;
+ }
+
+ ll=st.find(',');
+
+ if (ll>0) // multiple names
+ {
+ while (TRUE)
+ {
+ st=st.left(ll).stripWhiteSpace(); // one name
+
+ QCString *sig =new QCString(st);
+ ql.insert(0,sig);
+ qmem=qmem.right(qmem.length()-ll-1); // strip from list
+ st=qmem; // remainder
+ ll=st.find(',');
+ if (ll<0) // last name
+ {
+ ll = st.find(':');
+ st=st.left(ll).stripWhiteSpace();
+ ql.insert(0,new QCString(st));
+ break;
+ }
+ }
+ }
+ else // single name
+ {
+ st=st.stripWhiteSpace();
+ ql.insert(0,new QCString(st));
+ }
+ QCString *qdir=new QCString(str);
+ st=qdir->mid(j+1); // part after :
+ st=st.lower().stripWhiteSpace();
+ *qdir=st;
+ ql.insert(0,qdir);
+
+ if (st.stripPrefix("inout"))
+ {
+ buffer+="inout";
+ return TRUE;
+ }
+ if (st.stripPrefix("INOUT"))
+ {
+ buffer+="inout";
+ return TRUE;
+ }
+
+ if (st.stripPrefix("out"))
+ {
+ buffer+="out";
+ return TRUE;
+ }
+ if (st.stripPrefix("OUT"))
+ {
+ buffer+="out";
+ return TRUE;
+ }
+
+ if (st.stripPrefix("in"))
+ {
+ buffer+="in";
+ return TRUE;
+ }
+ if (st.stripPrefix("IN"))
+ {
+ buffer+="in";
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*!
+ * divides a process string in its name and types
+ * @param text process text
+ * @param name points to the process name
+ * @param ql stores the process types
+ */
+
+void VhdlDocGen::parseProcessProto(const char* text,
+ QCString& name,QStringList& ql)
+{
+ int index,end;
+ const char *s=":";
+ QCString temp;
+ QCString s1(text);
+ index=s1.find(s,0,FALSE);
+ if (index >=0)
+ {
+ name=s1.left(index);
+ // strcpy(name,tt.data());
+ }
+
+ index=s1.find("(",0,FALSE);
+ end=s1.findRev(")",s1.length(),FALSE);
+ // end=s1.find(")",0,FALSE);
+
+ if ((end-index)>1)
+ {
+ temp=s1.mid(index+1,(end-index-1));
+ ql=QStringList::split(",",temp,FALSE);
+ }
+}//parseProcessProto
+
+/*!
+ * strips the "--" prefixes of vhdl comments
+ */
+void VhdlDocGen::prepareComment(QCString& qcs)
+{
+ QCString temp;
+ const char* s="--!";
+ //const char *start="--!{";
+ //const char *end="--!}";
+ int index=0;
+
+#if 0
+ index=qcs.find(start,0,TRUE);
+ if (index>0)
+ temp=qcs.remove(index,strlen(start));
+ qcs=temp;
+
+ index=qcs.find(end,0,TRUE);
+ if (index>0)
+ temp=qcs.remove(index,strlen(end));
+ qcs=temp;
+#endif
+ while (TRUE)
+ {
+ index=qcs.find(s,0,TRUE);
+ if (index<0) break;
+ temp=qcs.remove(index,strlen(s));
+ qcs=temp;
+ }
+ qcs=qcs.stripWhiteSpace();
+}
+
+
+/*!
+ * parses a function proto
+ * @param text function string
+ * @param qlist stores the function types
+ * @param name points to the function name
+ * @param ret Stores the return type
+ * @param doc ???
+ */
+void VhdlDocGen::parseFuncProto(const char* text,QList<Argument>& qlist,
+ QCString& name,QCString& ret,bool doc)
+{
+ int index,end;
+ QCString s1(text);
+ QCString temp;
+
+ index=s1.find("(");
+ end=s1.findRev(")");
+
+ if ((end-index)>0)
+ {
+ QCString tt=s1.mid(index,(end-index+1));
+ temp=s1.mid(index+1,(end-index-1));
+ getFuncParams(qlist,temp);
+ }
+ if (doc)
+ {
+ name=s1.left(index);
+ name=name.stripWhiteSpace();
+ if ((end-index)>0)
+ {
+ ret="function";
+ }
+ return;
+ }
+ else
+ {
+ QCString s1(text);
+ s1=s1.stripWhiteSpace();
+ int i=s1.find("(",0,FALSE);
+ int s=s1.find(QRegExp("[ \\t]"));
+ if (i==-1 || i<s)
+ s1=VhdlDocGen::getIndexWord(s1.data(),1);
+ else // s<i, s=start of name, i=end of name
+ s1=s1.mid(s,(i-s));
+
+ name=s1.stripWhiteSpace();
+ }
+ index=s1.findRev("return",-1,FALSE);
+ if (index !=-1)
+ {
+ ret=s1.mid(index+6,s1.length());
+ ret=ret.stripWhiteSpace();
+ VhdlDocGen::deleteCharRev(ret,';');
+ }
+}
+
+/*
+ * returns the n'th word of a string
+ */
+
+QCString VhdlDocGen::getIndexWord(const char* c,int index)
+{
+ QStringList ql;
+ QCString temp(c);
+ QRegExp reg("[\\s]");
+
+ ql=QStringList::split(reg,temp,FALSE);
+
+ if (ql.count() > (unsigned int)index)
+ {
+ return (QCString)ql[index];
+ }
+
+ return "";
+}
+
+
+/*!
+ * \brief returns the arguments of a function or procedure prototype
+ * @param ql list ql stores the arguments
+ * @param str prototype
+ */
+
+void VhdlDocGen::getFuncParams(QList<Argument>& ql, const char* str)
+{
+
+ int len;
+ QCString qmem,s1,s2,ttype;
+ QCString temp(str);
+ temp=temp.stripWhiteSpace();
+ if (temp.isEmpty()) return;
+
+ QCString st(str);
+ QStringList strList;
+
+ strList=QStringList::split(";",temp,FALSE);
+ int kk=strList.count();
+ int j=kk;
+ while (kk>=1)
+ {
+ temp=strList[j-kk];
+ QStringList tempList,tt;
+ tempList=QStringList::split(":",temp,FALSE);
+ if (tempList.count()>2)
+ ttype=tempList[1];
+ else
+ ttype=tempList.last();
+
+ ttype=ttype.stripWhiteSpace();
+
+ uint zui=ttype.contains('(',FALSE);
+ if (zui == 0)
+ {
+ tt=QStringList::split(QRegExp("[\\s]"),ttype,FALSE);
+ }
+ else
+ {
+ if (ttype.stripPrefix("in"))
+ tt.append("in");
+ else if (ttype.stripPrefix("out"))
+ tt.append("out");
+ else if (ttype.stripPrefix("inout"))
+ tt.append("inout");
+ if (ttype.stripPrefix("IN"))
+ tt.append("in");
+ else if (ttype.stripPrefix("OUT"))
+ tt.append("out");
+ else if (ttype.stripPrefix("INOUT"))
+ tt.append("inout");
+
+ ttype=ttype.stripWhiteSpace();
+ tt.append(ttype);
+ }
+
+ s1=tt.first();
+ //s1=s1.lower();
+
+ if (tempList.count()>2)
+ s2=tt.last()+":"+tempList[2];
+ else
+ s2=tt.last();
+
+ QCString first=(QCString)tempList.first();
+
+ tempList.clear();
+ tt.clear();
+
+ tempList=QStringList::split(",",first,FALSE);
+ len=tempList.count();
+ ttype.resize(0);
+ for (int j=0;j<len;j++)
+ {
+ Argument *arg=new Argument;
+ QCString name=(QCString)tempList[j];
+ name=name.stripWhiteSpace();
+
+ tt=QStringList::split(QRegExp("[\\s]"),name,FALSE);
+ if (tt.count() > 1)
+ ttype=(tt.first()).stripWhiteSpace();
+
+ arg->defval=ttype.copy();
+ arg->type=s2.stripWhiteSpace();
+ arg->attrib=s1.stripWhiteSpace();
+ arg->name=(tt.last()).stripWhiteSpace();
+
+ // printf("--proto \n [%s] [%s] [%s] [%s] [%s]",ttype.data(),arg->type.data(),arg->attrib.data(),arg->name.data(),s1.data());
+ ql.append(arg);
+ }
+ kk--;
+ }//while
+} // getFuncName
+
+QCString VhdlDocGen::getProtectionName(int prot)
+{
+ if (prot==VhdlDocGen::ENTITYCLASS)
+ return "entity";
+ else if (prot==VhdlDocGen::ARCHITECTURECLASS)
+ return "architecture";
+ else if (prot==VhdlDocGen::PACKAGECLASS)
+ return "package";
+ else if (prot==VhdlDocGen::PACKBODYCLASS)
+ return "package body";
+
+ return "";
+}
+
+QCString VhdlDocGen::trTypeString(int type)
+{
+ switch(type)
+ {
+ case VhdlDocGen::LIBRARY: return "Library";
+ case VhdlDocGen::ENTITY: return "Entity";
+ case VhdlDocGen::PACKAGE_BODY: return "Package Body";
+ case VhdlDocGen::ATTRIBUTE: return "Attribute";
+ case VhdlDocGen::PACKAGE: return "Package";
+ case VhdlDocGen::SIGNAL: return "Signal";
+ case VhdlDocGen::COMPONENT: return "Component";
+ case VhdlDocGen::CONSTANT: return "Constant";
+ case VhdlDocGen::TYPE: return "Type";
+ case VhdlDocGen::SUBTYPE: return "Subtype";
+ case VhdlDocGen::FUNCTION: return "Function";
+ case VhdlDocGen::RECORD: return "Record";
+ case VhdlDocGen::PROCEDURE: return "Procedure";
+ case VhdlDocGen::ARCHITECTURE: return "Architecture";
+ case VhdlDocGen::USE: return "Package";
+ case VhdlDocGen::PROCESS: return "Process";
+ case VhdlDocGen::PORT: return "Port";
+ case VhdlDocGen::GENERIC: return "Generic";
+ case VhdlDocGen::DOCUMENT: return "Doc";
+ case VhdlDocGen::UNITS: return "Units";
+ //case VhdlDocGen::PORTMAP: return "Port Map";
+ case VhdlDocGen::SHAREDVARIABLE: return "Shared Variable";
+ case VhdlDocGen::GROUP: return "Group";
+ case VhdlDocGen::VFILE: return "File";
+ case VhdlDocGen::COMPONENT_INST: return "Component Instantiation";
+ case VhdlDocGen::ALIAS: return "Alias";
+ case VhdlDocGen::CONFIG: return "Configuration";
+ case VhdlDocGen::MISCELLANEOUS: return "Miscellaneous";
+ default: return "";
+ }
+} // convertType
+
+/*!
+ * deletes a char backwards in a string
+ */
+
+bool VhdlDocGen::deleteCharRev(QCString &s,char c)
+{
+ int index=s.findRev(c,-1,FALSE);
+ if (index > -1)
+ {
+ QString qcs=s.remove(index,1);
+ s=qcs;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void VhdlDocGen::deleteAllChars(QCString &s,char c)
+{
+ int index=s.findRev(c,-1,FALSE);
+ while (index > -1)
+ {
+ QString qcs=s.remove(index,1);
+ s=qcs;
+ index=s.findRev(c,-1,FALSE);
+ }
+}
+
+
+static int recordCounter=0;
+
+/*!
+ * returns the next number of a record|unit member
+ */
+
+QCString VhdlDocGen::getRecordNumber()
+{
+ char buf[12];
+ sprintf(buf,"%d",recordCounter++);
+ QCString qcs(&buf[0]);
+ return qcs;
+}
+
+/*!
+ * returns the next number of an anonymous process
+ */
+
+QCString VhdlDocGen::getProcessNumber()
+{
+ static int stringCounter;
+ char buf[8];
+ QCString qcs("PROCESS_");
+ sprintf(buf,"%d",stringCounter++);
+ qcs.append(&buf[0]);
+ return qcs;
+}
+
+/*!
+ * writes a colored and formatted string
+ */
+
+void VhdlDocGen::writeFormatString(QCString& qcs,OutputList&ol,const MemberDef* mdef)
+{
+ QRegExp reg("[\\/\\:\\<\\>\\:\\s\\,\\;\\'\\+\\-\\*\\|\\&\\=\\(\\)\"]");
+ qcs+=QCString(" ");// parsing the last sign
+ QCString *ss;
+ QCString find=qcs;
+ QCString temp=qcs;
+ char buf[2];
+ buf[1]='\0';
+
+ int j;
+ int len;
+ j = reg.match(temp.data(),0,&len);
+
+ ol.startBold();
+ if (j>=0)
+ {
+ while (j>=0)
+ {
+ find=find.left(j);
+ buf[0]=temp[j];
+ ss=VhdlDocGen::findKeyWord(find);
+ bool k=VhdlDocGen::isNumber(find); // is this a number
+ if (k)
+ {
+ ol.docify(" ");
+ VhdlDocGen::startFonts(find,"vhdldigit",ol);
+ ol.docify(" ");
+ }
+ else if (j != 0 && ss)
+ {
+ VhdlDocGen::startFonts(find,ss->data(),ol);
+ }
+ else
+ {
+ if (j>0)
+ {
+ VhdlDocGen::writeStringLink(mdef,find,ol);
+ }
+ }
+ VhdlDocGen::startFonts(&buf[0],"vhdlchar",ol);
+
+ QCString st=temp.remove(0,j+1);
+ find=st;
+ temp=st;
+ j = reg.match(temp.data(),0,&len);
+ }//while
+ }//if
+ else
+ {
+ VhdlDocGen::startFonts(find,"vhdlchar",ol);
+ }
+ ol.endBold();
+}// writeFormatString
+
+/*!
+ * returns TRUE if this string is a number
+ */
+
+bool VhdlDocGen::isNumber(const QCString& s)
+{
+ static QRegExp regg("[0-9][0-9eEfFbBcCdDaA_.#-]*");
+
+ if (s.isEmpty()) return FALSE;
+ int j,len;
+ j = regg.match(s.data(),0,&len);
+ if ((j==0) && (len==(int)s.length())) return TRUE;
+ return FALSE;
+
+ #if 0
+ int len=s.length();
+ if (len==0) return FALSE;
+ for (int j=0;j<len;j++)
+ {
+ if (isdigit((int)(s.at(j) & 0xff))==0)
+ return FALSE;
+ }
+ return TRUE;
+ #endif
+}// isNumber
+
+void VhdlDocGen::startFonts(const QCString& q, const char *keyword,OutputList& ol)
+{
+ ol.startFontClass(keyword);
+ ol.docify(q.data());
+ ol.endFontClass();
+}
+
+/*!
+ * inserts white spaces for better readings
+ * and writes a colored string to the output
+ */
+
+void VhdlDocGen::formatString(QCString & qcs, OutputList& ol,const MemberDef* mdef)
+{
+ QCString temp(qcs.length());
+ qcs.stripPrefix(":");
+ qcs.stripPrefix("is");
+ qcs.stripPrefix("IS");
+ qcs.stripPrefix("of");
+ qcs.stripPrefix("OF");
+
+ VhdlDocGen::deleteCharRev(qcs,';');
+ //char white='\t';
+ int len = qcs.length();
+ unsigned int index=1;//temp.length();
+
+ for (int j=0;j<len;j++)
+ {
+ char c=qcs[j];
+ char b=c;
+ if (j>0) b=qcs[j-1];
+ if (c=='"' || c==',' || c==';' || c=='\''|| c=='(' || c==')' || c==':' ) // || (c==':' && b!='=')) // || (c=='=' && b!='>'))
+ {
+ if (temp.at(index-1) != ' ')
+ {
+ temp+=" ";
+ }
+ temp+=c;
+ temp+=" ";
+ }
+ else if (c=='=')
+ {
+ if (b==':') // := operator
+ {
+ temp.replace(index-1,1,"=");
+ temp+=" ";
+ }
+ else // = operator
+ {
+ temp+=" ";
+ temp+=c;
+ temp+=" ";
+ }
+ }
+ else
+ {
+ temp+=c;
+ }
+
+ index=temp.length();
+ }// for
+ temp=temp.stripWhiteSpace();
+ // printf("\n [%s]",qcs.data());
+ VhdlDocGen::writeFormatString(temp,ol,mdef);
+}
+
+/*!
+ * writes a procedure prototype to the output
+ */
+
+void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const MemberDef* mdef)
+{
+ ArgumentListIterator ali(*al);
+ Argument *arg;
+ bool sem=FALSE;
+ int len=al->count();
+ ol.docify("( ");
+ if (len > 2)
+ {
+ ol.lineBreak();
+ }
+ for (;(arg=ali.current());++ali)
+ {
+ ol.startBold();
+ if (sem && len <3)
+ ol.writeChar(',');
+
+ QCString nn=arg->name;
+ nn+=": ";
+
+ QCString *str=VhdlDocGen::findKeyWord(arg->defval);
+ arg->defval+=" ";
+ if (str)
+ {
+ VhdlDocGen::startFonts(arg->defval,str->data(),ol);
+ }
+ else
+ {
+ VhdlDocGen::startFonts(arg->defval,"vhdlchar",ol); // write type (variable,constant etc.)
+ }
+
+ VhdlDocGen::startFonts(nn,"vhdlchar",ol); // write name
+ if (stricmp(arg->attrib.data(),arg->type.data()) != 0)
+ VhdlDocGen::startFonts(arg->attrib.lower(),"stringliteral",ol); // write in|out
+ ol.docify(" ");
+ VhdlDocGen::formatString(arg->type,ol,mdef);
+ sem=TRUE;
+ ol.endBold();
+ if (len > 2)
+ {
+ ol.lineBreak();
+ ol.docify(" ");
+ }
+ }//for
+
+ ol.docify(" )");
+
+
+}
+
+/*!
+ * writes a function prototype to the output
+ */
+
+void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const MemberDef* mdef)
+{
+ if (al==0) return;
+ ArgumentListIterator ali(*al);
+ Argument *arg;
+ bool sem=FALSE;
+ int len=al->count();
+ ol.startBold();
+ ol.docify(" ( ");
+ ol.endBold();
+ if (len>2)
+ {
+ ol.lineBreak();
+ }
+ for (;(arg=ali.current());++ali)
+ {
+ ol.startBold();
+ if (sem && len < 3)
+ {
+ ol.docify(" , ");
+ }
+ QCString att=arg->defval;
+ if (!att.isEmpty())
+ {
+ QCString *str=VhdlDocGen::findKeyWord(att);
+ att+=" ";
+ if (str)
+ VhdlDocGen::formatString(att,ol,mdef);
+ else
+ VhdlDocGen::startFonts(att,"vhdlchar",ol);
+ }
+
+ QCString nn=arg->name;
+ nn+=": ";
+ QCString ss=arg->type; //.lower();
+ QCString w=ss;//.upper();
+ VhdlDocGen::startFonts(nn,"vhdlchar",ol);
+ VhdlDocGen::startFonts("in ","stringliteral",ol);
+ QCString *str=VhdlDocGen::findKeyWord(ss);
+ if (str)
+ VhdlDocGen::formatString(w,ol,mdef);
+ else
+ VhdlDocGen::startFonts(w,"vhdlchar",ol);
+
+ sem=TRUE;
+ ol.endBold();
+ if (len > 2)
+ {
+ ol.lineBreak();
+ }
+ }
+ ol.startBold();
+ ol.docify(" )");
+ const char *exp=mdef->excpString();
+ if (exp)
+ {
+ ol.insertMemberAlign();
+ ol.docify("[ ");
+ ol.docify(exp);
+ ol.docify(" ]");
+ }
+ ol.endBold();
+}
+
+/*!
+ * writes a process prototype to the output
+ */
+
+void VhdlDocGen::writeProcessProto(OutputList& ol,const ArgumentList* al,const MemberDef* mdef)
+{
+ if (al==0) return;
+ ArgumentListIterator ali(*al);
+ Argument *arg;
+ bool sem=FALSE;
+ ol.startBold();
+ ol.docify(" ( ");
+ for (;(arg=ali.current());++ali)
+ {
+ if (sem)
+ ol.docify(" , ");
+ QCString nn=arg->name;
+ // VhdlDocGen::startFonts(nn,"vhdlchar",ol);
+ VhdlDocGen::writeFormatString(nn,ol,mdef);
+ sem=TRUE;
+ }
+ ol.docify(" )");
+ ol.endBold();
+}
+
+
+/*!
+ * writes a function|procedure documentation to the output
+ */
+
+void VhdlDocGen::writeFuncProcDocu(
+ const MemberDef *md,
+ OutputList& ol,
+ const ArgumentList* al,
+ bool /*type*/)
+{
+ if (al==0) return;
+ bool sem=FALSE;
+ ol.enableAll();
+
+ ArgumentListIterator ali(*al);
+ int index=ali.count();
+ if (index==0)
+ {
+ ol.docify(" ( ) ");
+ return;
+ }
+ ol.startParameterList(TRUE);
+ Argument *arg;
+ bool first=TRUE;
+ for (;(arg=ali.current());++ali)
+ {
+ ol.startParameterType(first,"");
+ //if (first) ol.writeChar('(');
+ if (VhdlDocGen::isProcedure(md))
+ {
+ startFonts(arg->defval,"keywordtype",ol);
+ ol.docify(" ");
+ }
+ ol.endParameterType();
+
+ ol.startParameterName(TRUE);
+ VhdlDocGen::writeFormatString(arg->name,ol,md);
+ ol.docify(" ");
+
+ if (VhdlDocGen::isProcedure(md))
+ startFonts(arg->attrib,"stringliteral",ol);
+ else if (VhdlDocGen::isVhdlFunction(md))
+ startFonts(QCString("in"),"stringliteral",ol);
+
+
+ ol.docify(" ");
+ ol.disable(OutputGenerator::Man);
+ ol.startEmphasis();
+ ol.enable(OutputGenerator::Man);
+ if (!VhdlDocGen::isProcess(md))
+ startFonts(arg->type,"vhdlkeyword",ol);
+ ol.disable(OutputGenerator::Man);
+ ol.endEmphasis();
+ ol.enable(OutputGenerator::Man);
+
+ if (--index)
+ {
+ ol.docify(" , ");
+ ol.endParameterName(FALSE,FALSE,FALSE);
+ }
+ else
+ {
+ //ol.docify(" ) ");
+ ol.endParameterName(TRUE,FALSE,TRUE);
+ }
+
+ sem=TRUE;
+ first=FALSE;
+ }
+ //ol.endParameterList();
+
+} // writeDocFunProc
+
+/*!
+ * returns TRUE if this string is a function prototype or
+ * FALSE if this is a procedure
+ */
+
+bool VhdlDocGen::isFunctionProto(QCString& ss)
+{
+ QCString name=ss;
+ QCString proc("procedure");
+ QCString func("function");
+ name=name.stripWhiteSpace();
+ QStringList ql=QStringList::split(QRegExp("[\\s]"),name,FALSE);
+ int j=ql.count();
+ if (j<2) return FALSE;
+ QCString tt=(QCString)ql[0].lower();
+
+ if (tt=="impure" || tt=="pure") tt=ql[1];
+
+ if (VhdlDocGen::compareString(tt,proc)!=0 && VhdlDocGen::compareString(tt,func)!=0)
+ return FALSE;
+
+ QCString temp=(QCString)ql[j-1];
+ temp=temp.stripWhiteSpace();
+ if (stricmp(temp.data(),"is")==0)
+ {
+ VhdlDocGen::deleteCharRev(name,'s');
+ VhdlDocGen::deleteCharRev(name,'i');
+ ss=name;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+QCString VhdlDocGen::convertArgumentListToString(const ArgumentList* al,bool func)
+{
+ QCString argString;
+ bool sem=FALSE;
+ ArgumentListIterator ali(*al);
+ Argument *arg;
+
+ for (;(arg=ali.current());++ali)
+ {
+ if (sem) argString.append(", ");
+ if (func)
+ {
+ argString+=arg->name;
+ argString+=":";
+ argString+=arg->type;
+ }
+ else
+ {
+ argString+=arg->defval+" ";
+ argString+=arg->name+" :";
+ argString+=arg->attrib+" ";
+ argString+=arg->type;
+ }
+ sem=TRUE;
+ }
+ return argString;
+}
+
+
+void VhdlDocGen::writeVhdlDeclarations(MemberList* ml,
+ OutputList& ol,GroupDef* gd,ClassDef* cd,FileDef *fd)
+{
+ static ClassDef *cdef;
+ //static GroupDef* gdef;
+ if (cd && cdef!=cd)
+ { // only one inline link
+ VhdlDocGen::writeInlineClassLink(cd,ol);
+ cdef=cd;
+ }
+
+ /*
+ if (gd && gdef==gd) return;
+ if (gd && gdef!=gd)
+ {
+ gdef=gd;
+ }
+*/
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::LIBRARY,FALSE),0,FALSE,VhdlDocGen::LIBRARY);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::USE,FALSE),0,FALSE,VhdlDocGen::USE);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::FUNCTION,FALSE),0,FALSE,VhdlDocGen::FUNCTION);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::COMPONENT,FALSE),0,FALSE,VhdlDocGen::COMPONENT);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::CONSTANT,FALSE),0,FALSE,VhdlDocGen::CONSTANT);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::TYPE,FALSE),0,FALSE,VhdlDocGen::TYPE);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::SUBTYPE,FALSE),0,FALSE,VhdlDocGen::SUBTYPE);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::GENERIC,FALSE),0,FALSE,VhdlDocGen::GENERIC);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::PORT,FALSE),0,FALSE,VhdlDocGen::PORT);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::PROCESS,FALSE),0,FALSE,VhdlDocGen::PROCESS);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::SIGNAL,FALSE),0,FALSE,VhdlDocGen::SIGNAL);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::ATTRIBUTE,FALSE),0,FALSE,VhdlDocGen::ATTRIBUTE);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::PROCEDURE,FALSE),0,FALSE,VhdlDocGen::PROCEDURE);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::RECORD,FALSE),0,FALSE,VhdlDocGen::RECORD);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::UNITS,FALSE),0,FALSE,VhdlDocGen::UNITS);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::SHAREDVARIABLE,FALSE),0,FALSE,VhdlDocGen::SHAREDVARIABLE);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::VFILE,FALSE),0,FALSE,VhdlDocGen::VFILE);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::GROUP,FALSE),0,FALSE,VhdlDocGen::GROUP);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::COMPONENT_INST,FALSE),0,FALSE,VhdlDocGen::COMPONENT_INST);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::ALIAS,FALSE),0,FALSE,VhdlDocGen::ALIAS);
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::MISCELLANEOUS),0,FALSE,VhdlDocGen::MISCELLANEOUS);
+
+ // configurations must be added to global file definitions.
+ VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,fd,gd,theTranslator_vhdlType(VhdlDocGen::CONFIG,FALSE),0,FALSE,VhdlDocGen::CONFIG);
+}
+
+static void setGlobalType(MemberList *ml)
+{
+ if (ml==0) return;
+ MemberDef *mdd=0;
+ MemberListIterator mmli(*ml);
+ for ( ; (mdd=mmli.current()); ++mmli )
+ {
+ if (stricmp(mdd->argsString(),"configuration")==0)
+ {
+ mdd->setMemberSpecifiers(VhdlDocGen::CONFIG);
+ }
+ else if (stricmp(mdd->typeString(),"library")==0)
+ {
+ mdd->setMemberSpecifiers(VhdlDocGen::LIBRARY);
+ }
+ else if (stricmp(mdd->typeString(),"package")==0)
+ {
+ mdd->setMemberSpecifiers(VhdlDocGen::USE);
+ }
+ else if (stricmp(mdd->typeString(),"misc")==0)
+ {
+ mdd->setMemberSpecifiers(VhdlDocGen::MISCELLANEOUS);
+ }
+ }
+}
+
+/* writes a vhdl type documentation */
+void VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definition *d, OutputList &ol)
+{
+ ClassDef *cd=(ClassDef*)d;
+ if (cd==0) return;
+ if ((VhdlDocGen::isVhdlFunction(mdef) || VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isProcess(mdef)))
+ {
+ QCString nn=mdef->typeString();
+ nn=nn.stripWhiteSpace();
+ QCString na=cd->name();
+ MemberDef* memdef=VhdlDocGen::findMember(na,nn);
+ if (memdef && memdef->isLinkable())
+ {
+ ol.docify(" ");
+ ol.startBold();
+ //ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,mdef->typeString());
+ writeLink(memdef,ol);
+ ol.endBold();
+ ol.docify(" ");
+ }
+ else
+ {
+ ol.docify(" ");
+ QCString ttype=mdef->typeString();
+ VhdlDocGen::formatString(ttype,ol,mdef);
+ ol.docify(" ");
+ }
+ ol.docify(mdef->name());
+ VhdlDocGen::writeFuncProcDocu(mdef,ol, mdef->argumentList().pointer());
+ }
+
+ if(VhdlDocGen::isMisc(mdef))
+ {
+ writeLink(mdef,ol);
+ return;
+ }
+ if (mdef->isVariable())
+ {
+ //ol.docify(mdef->name().data());
+ writeLink(mdef,ol);
+ ol.docify(" ");
+ QCString ttype=mdef->typeString();
+ VhdlDocGen::formatString(ttype,ol,mdef);
+ ol.docify(" ");
+ if (VhdlDocGen::isPort(mdef))
+ {
+ QCString largs=mdef->argsString();
+ VhdlDocGen::formatString(largs,ol,mdef);
+ ol.docify(" ");
+ }
+ }
+}
+
+/* writes a vhdl type declaration */
+
+void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ bool /*inGroup*/)
+{
+
+ LockingPtr<MemberDef> lock(mdef,mdef);
+
+ Definition *d=0;
+
+ /* some vhdl files contain only a configuration description
+
+ library work;
+ configuration cfg_tb_jtag_gotoBackup of tb_jtag_gotoBackup is
+ for RTL
+ end for;
+ end cfg_tb_jtag_gotoBackup;
+
+ in this case library work does not belong to an entity, package ...
+
+ */
+
+ ASSERT(cd!=0 || nd!=0 || fd!=0 || gd!=0 ||
+ mdef->getMemberSpecifiers()==VhdlDocGen::LIBRARY ||
+ mdef->getMemberSpecifiers()==VhdlDocGen::USE
+ ); // member should belong to something
+ if (cd) d=cd;
+ else if (nd) d=nd;
+ else if (fd) d=fd;
+ else if (gd) d=gd;
+ else d=(Definition*)mdef;
+
+ // write tag file information of this member
+ if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+ {
+ Doxygen::tagFile << " <member kind=\"";
+ if (VhdlDocGen::isGeneric(mdef)) Doxygen::tagFile << "generic";
+ if (VhdlDocGen::isPort(mdef)) Doxygen::tagFile << "port";
+ if (VhdlDocGen::isEntity(mdef)) Doxygen::tagFile << "entity";
+ if (VhdlDocGen::isComponent(mdef)) Doxygen::tagFile << "component";
+ if (VhdlDocGen::isVType(mdef)) Doxygen::tagFile << "type";
+ if (VhdlDocGen::isConstant(mdef)) Doxygen::tagFile << "constant";
+ if (VhdlDocGen::isSubType(mdef)) Doxygen::tagFile << "subtype";
+ if (VhdlDocGen::isVhdlFunction(mdef)) Doxygen::tagFile << "function";
+ if (VhdlDocGen::isProcedure(mdef)) Doxygen::tagFile << "procedure";
+ if (VhdlDocGen::isProcess(mdef)) Doxygen::tagFile << "process";
+ if (VhdlDocGen::isSignals(mdef)) Doxygen::tagFile << "signal";
+ if (VhdlDocGen::isAttribute(mdef)) Doxygen::tagFile << "attribute";
+ if (VhdlDocGen::isRecord(mdef)) Doxygen::tagFile << "record";
+ if (VhdlDocGen::isLibrary(mdef)) Doxygen::tagFile << "library";
+ if (VhdlDocGen::isPackage(mdef)) Doxygen::tagFile << "package";
+ if (VhdlDocGen::isVariable(mdef)) Doxygen::tagFile << "shared variable";
+ if (VhdlDocGen::isFile(mdef)) Doxygen::tagFile << "file";
+ if (VhdlDocGen::isGroup(mdef)) Doxygen::tagFile << "group";
+ if (VhdlDocGen::isCompInst(mdef)) Doxygen::tagFile << "component instantiation";
+ if (VhdlDocGen::isAlias(mdef)) Doxygen::tagFile << "alias";
+ if (VhdlDocGen::isCompInst(mdef)) Doxygen::tagFile << "configuration";
+
+ Doxygen::tagFile << "\">" << endl;
+ Doxygen::tagFile << " <type>" << convertToXML(mdef->typeString()) << "</type>" << endl;
+ Doxygen::tagFile << " <name>" << convertToXML(mdef->name()) << "</name>" << endl;
+ Doxygen::tagFile << " <anchorfile>" << convertToXML(mdef->getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
+ Doxygen::tagFile << " <anchor>" << convertToXML(mdef->anchor()) << "</anchor>" << endl;
+
+ if (VhdlDocGen::isVhdlFunction(mdef))
+ Doxygen::tagFile << " <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList().pointer(),TRUE)) << "</arglist>" << endl;
+ else if (VhdlDocGen::isProcedure(mdef))
+ Doxygen::tagFile << " <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList().pointer(),FALSE)) << "</arglist>" << endl;
+ else
+ Doxygen::tagFile << " <arglist>" << convertToXML(mdef->argsString()) << "</arglist>" << endl;
+
+ mdef->writeDocAnchorsToTagFile();
+ Doxygen::tagFile << " </member>" << endl;
+
+ }
+
+ // write search index info
+ if (Doxygen::searchIndex)
+ {
+ Doxygen::searchIndex->setCurrentDoc(mdef->qualifiedName(),mdef->getOutputFileBase(),mdef->anchor());
+ Doxygen::searchIndex->addWord(mdef->localName(),TRUE);
+ Doxygen::searchIndex->addWord(mdef->qualifiedName(),FALSE);
+ }
+
+ QCString cname = d->name();
+ QCString cfname = mdef->getOutputFileBase();
+
+ //HtmlHelp *htmlHelp=0;
+ // bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
+ // if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
+
+ // search for the last anonymous scope in the member type
+ ClassDef *annoClassDef=mdef->getClassDefOfAnonymousType();
+
+ // start a new member declaration
+ bool isAnonymous = annoClassDef; // || m_impl->annMemb || m_impl->annEnumType;
+ ///printf("startMemberItem for %s\n",name().data());
+ ol.startMemberItem( isAnonymous ); //? 1 : m_impl->tArgList ? 3 : 0);
+
+ // If there is no detailed description we need to write the anchor here.
+ bool detailsVisible = mdef->isDetailedSectionLinkable();
+ if (!detailsVisible) // && !m_impl->annMemb)
+ {
+ QCString doxyName=mdef->name().copy();
+ if (!cname.isEmpty()) doxyName.prepend(cname+"::");
+ QCString doxyArgs=mdef->argsString();
+ ol.startDoxyAnchor(cfname,cname,mdef->anchor(),doxyName,doxyArgs);
+
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Man);
+ ol.disable(OutputGenerator::Latex);
+ ol.docify("\n");
+ ol.popGeneratorState();
+
+ }
+ // *** write type
+ /*VHDL CHANGE */
+ QCString ltype(mdef->typeString());
+ QCString largs(mdef->argsString());
+ int mm=mdef->getMemberSpecifiers();
+ //printf(":: ltype=%s largs=%s name=%s mm=%d\n",
+ // ltype.data(),largs.data(),mdef->name().data(),mm);
+
+ ClassDef *kl=0;
+ //FileDef *fdd=0;
+ LockingPtr<ArgumentList> alp = mdef->argumentList();
+ QCString nn;
+ if (gd) gd=0;
+ switch(mm)
+ {
+ case VhdlDocGen::MISCELLANEOUS:
+ VhdlDocGen::writeCodeFragment(mdef,ol);
+ break;
+ case VhdlDocGen::PROCEDURE:
+ case VhdlDocGen::FUNCTION:
+ ol.startBold();
+ VhdlDocGen::formatString(ltype,ol,mdef);
+ ol.endBold();
+ ol.insertMemberAlign();
+ ol.docify(" ");
+
+ writeLink(mdef,ol);
+ if (alp!=0 && mm==VhdlDocGen::FUNCTION)
+ VhdlDocGen::writeFunctionProto(ol,alp.pointer(),mdef);
+
+ if (alp!=0 && mm==VhdlDocGen::PROCEDURE)
+ VhdlDocGen::writeProcedureProto(ol,alp.pointer(),mdef);
+
+ break;
+ case VhdlDocGen::USE:
+ kl=VhdlDocGen::getClass(mdef->name());
+ if (kl && ((VhdlDocGen::VhdlClasses)kl->protection()==VhdlDocGen::ENTITYCLASS)) break;
+ writeLink(mdef,ol);
+ ol.insertMemberAlign();
+ ol.docify(" ");
+
+ if (kl)
+ {
+ nn=kl->getOutputFileBase();
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.docify(" ");
+ QCString name=theTranslator_vhdlType(VhdlDocGen::PACKAGE,TRUE);
+ ol.startBold();
+ ol.docify(name.data());
+ name.resize(0);
+ ol.endBold();
+ name+=" <"+mdef->name()+">";
+ ol.startEmphasis();
+ ol.writeObjectLink(kl->getReference(),kl->getOutputFileBase(),0,name.data());
+ ol.popGeneratorState();
+ }
+ break;
+ case VhdlDocGen::LIBRARY:
+ writeLink(mdef,ol);
+ ol.insertMemberAlign();
+ break;
+ case VhdlDocGen::GENERIC:
+ case VhdlDocGen::PORT:
+ writeLink(mdef,ol);
+ ol.docify(" ");
+ ol.insertMemberAlign();
+ if (mm==VhdlDocGen::GENERIC)
+ {
+ ol.startBold();
+ VhdlDocGen::formatString(ltype,ol,mdef);
+ ol.endBold();
+ }
+ else
+ {
+ ol.docify(" ");
+ ol.startBold();
+ ol.docify(mdef->typeString());
+ ol.endBold();
+ ol.docify(" ");
+ VhdlDocGen::formatString(largs,ol,mdef);
+ }
+ break;
+ case VhdlDocGen::PROCESS:
+ writeLink(mdef,ol);
+ ol.insertMemberAlign();
+ VhdlDocGen::writeProcessProto(ol,alp.pointer(),mdef);
+ break;
+ case VhdlDocGen::PACKAGE:
+ case VhdlDocGen::ENTITY:
+ case VhdlDocGen::COMPONENT:
+ case VhdlDocGen::COMPONENT_INST:
+ case VhdlDocGen::CONFIG:
+ writeLink(mdef,ol);
+ ol.insertMemberAlign();
+ ol.docify(" ");
+
+ ol.startBold();
+ ol.docify(ltype);
+ ol.endBold();
+ ol.docify(" ");
+ if (VhdlDocGen::isComponent(mdef) ||
+ VhdlDocGen::isConfig(mdef) ||
+ VhdlDocGen::isCompInst(mdef))
+ {
+ if (VhdlDocGen::isConfig(mdef) || VhdlDocGen::isCompInst(mdef))
+ {
+ nn=ltype;
+ }
+ else
+ {
+ nn=mdef->name();
+ }
+ kl=getClass(nn.data());
+ if (kl)
+ {
+ nn=kl->getOutputFileBase();
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startEmphasis();
+ QCString name("<Entity ");
+ if (VhdlDocGen::isConfig(mdef) || VhdlDocGen::isCompInst(mdef))
+ {
+ name+=ltype+">";
+ }
+ else
+ {
+ name+=mdef->name()+"> ";
+ }
+ ol.writeObjectLink(kl->getReference(),kl->getOutputFileBase(),0,name.data());
+ ol.endEmphasis();
+ ol.popGeneratorState();
+ }
+ }
+ break;
+ case VhdlDocGen::SIGNAL:
+ case VhdlDocGen::ATTRIBUTE:
+ case VhdlDocGen::TYPE:
+ case VhdlDocGen::SUBTYPE:
+ case VhdlDocGen::CONSTANT:
+ case VhdlDocGen::SHAREDVARIABLE:
+ case VhdlDocGen::VFILE:
+ case VhdlDocGen::GROUP:
+ case VhdlDocGen::ALIAS:
+ writeLink(mdef,ol);
+ ol.docify(" ");
+ ol.insertMemberAlign();
+ VhdlDocGen::formatString(ltype,ol,mdef);
+ break;
+ case VhdlDocGen::RECORD:
+ writeLink(mdef,ol);
+ ol.docify(" ");
+ ol.startBold();
+ if (ltype.isEmpty()) ol.docify(" : record");
+ ol.insertMemberAlign();
+ if (!ltype.isEmpty())
+ VhdlDocGen::formatString(ltype,ol,mdef);
+ ol.endBold();
+ break;
+ case VhdlDocGen::UNITS:
+ ol.startBold();
+ writeLink(mdef,ol);
+ ol.docify(" ");
+ if (ltype.isEmpty()) ol.docify(" : unit");
+ ol.insertMemberAlign();
+ if (!ltype.isEmpty())
+ VhdlDocGen::formatString(ltype,ol,mdef);
+ ol.endBold();
+ break;
+ default: break;
+ }
+
+ bool htmlOn = ol.isEnabled(OutputGenerator::Html);
+ if (htmlOn && Config_getBool("HTML_ALIGN_MEMBERS") && !ltype.isEmpty())
+ {
+ ol.disable(OutputGenerator::Html);
+ }
+ if (!ltype.isEmpty()) ol.docify(" ");
+
+ if (htmlOn)
+ {
+ ol.enable(OutputGenerator::Html);
+ }
+
+ if (!detailsVisible)// && !m_impl->annMemb)
+ {
+ ol.endDoxyAnchor(cfname,mdef->anchor());
+ }
+
+ //printf("endMember %s annoClassDef=%p annEnumType=%p\n",
+ // name().data(),annoClassDef,annEnumType);
+ ol.endMemberItem();
+ if (!mdef->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC") /* && !annMemb */)
+ {
+ ol.startMemberDescription();
+ ol.parseDoc(mdef->briefFile(),mdef->briefLine(),
+ mdef->getOuterScope()?mdef->getOuterScope():d,
+ mdef,mdef->briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ if (detailsVisible)
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ //ol.endEmphasis();
+ ol.docify(" ");
+ if (mdef->getGroupDef()!=0 && gd==0) // forward link to the group
+ {
+ ol.startTextLink(mdef->getOutputFileBase(),mdef->anchor());
+ }
+ else // local link
+ {
+ ol.startTextLink(0,mdef->anchor());
+ }
+ ol.endTextLink();
+ //ol.startEmphasis();
+ ol.popGeneratorState();
+ }
+ //ol.newParagraph();
+ ol.endMemberDescription();
+ }
+ mdef->warnIfUndocumented();
+
+}// end writeVhdlDeclaration
+
+
+void VhdlDocGen::writeLink(const MemberDef* mdef,OutputList &ol)
+{
+ ol.writeObjectLink(mdef->getReference(),
+ mdef->getOutputFileBase(),
+ mdef->anchor(),
+ mdef->name());
+}
+
+void VhdlDocGen::writePlainVHDLDeclarations(
+ MemberList* mlist,OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,int specifier)
+{
+
+ SDict<QCString> pack(1009);
+
+ ol.pushGeneratorState();
+
+ bool first=TRUE;
+ MemberDef *md;
+ MemberListIterator mli(*mlist);
+ for ( ; (md=mli.current()); ++mli )
+ {
+ int mems=md->getMemberSpecifiers();
+ if (md->isBriefSectionVisible() && (mems==specifier) && (mems!=VhdlDocGen::LIBRARY) )
+ {
+ if (first) {ol.startMemberList();first=FALSE;}
+ VhdlDocGen::writeVHDLDeclaration(md,ol,cd,nd,fd,gd,FALSE);
+ } //if
+ else if (md->isBriefSectionVisible() && (mems==specifier))
+ {
+ if (!pack.find(md->name().data()))
+ {
+ if (first) ol.startMemberList(),first=FALSE;
+ VhdlDocGen::writeVHDLDeclaration(md,ol,cd,nd,fd,gd,FALSE);
+ pack.append(md->name().data(),new QCString(md->name().data()));
+ }
+ } //if
+ } //for
+ if (!first) ol.endMemberList();
+ pack.clear();
+}//plainDeclaration
+
+bool VhdlDocGen::membersHaveSpecificType(MemberList *ml,int type)
+{
+ if (ml==0) return FALSE;
+ MemberDef *mdd=0;
+ MemberListIterator mmli(*ml);
+ for ( ; (mdd=mmli.current()); ++mmli )
+ {
+ if (mdd->getMemberSpecifiers()==type) //is type in class
+ {
+ return TRUE;
+ }
+ }
+ if (ml->getMemberGroupList())
+ {
+ MemberGroupListIterator mgli(*ml->getMemberGroupList());
+ MemberGroup *mg;
+ while ((mg=mgli.current()))
+ {
+ if (mg->members())
+ {
+ if (membersHaveSpecificType(mg->members(),type)) return TRUE;
+ }
+ ++mgli;
+ }
+ }
+ return FALSE;
+}
+
+void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ const char *title,const char *subtitle,bool /*showEnumValues*/,int type)
+{
+ setGlobalType(ml);
+ if (!membersHaveSpecificType(ml,type)) return;
+
+ if (title)
+ {
+ ol.startMemberHeader(title);
+ ol.parseText(title);
+ ol.endMemberHeader();
+ ol.docify(" ");
+ }
+ if (subtitle && subtitle[0]!=0)
+ {
+ ol.startMemberSubtitle();
+ ol.parseDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE,0,TRUE,FALSE);
+ ol.endMemberSubtitle();
+ } //printf("memberGroupList=%p\n",memberGroupList);
+
+ VhdlDocGen::writePlainVHDLDeclarations(ml,ol,cd,nd,fd,gd,type);
+
+ if (ml->getMemberGroupList())
+ {
+ MemberGroupListIterator mgli(*ml->getMemberGroupList());
+ MemberGroup *mg;
+ while ((mg=mgli.current()))
+ {
+ if (membersHaveSpecificType(mg->members(),type))
+ {
+ //printf("mg->header=%s\n",mg->header().data());
+ bool hasHeader=mg->header()!="[NOHEADER]";
+ ol.startMemberGroupHeader(hasHeader);
+ if (hasHeader)
+ {
+ ol.parseText(mg->header());
+ }
+ ol.endMemberGroupHeader();
+ if (!mg->documentation().isEmpty())
+ {
+ //printf("Member group has docs!\n");
+ ol.startMemberGroupDocs();
+ ol.parseDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE);
+ ol.endMemberGroupDocs();
+ }
+ ol.startMemberGroup();
+ //printf("--- mg->writePlainDeclarations ---\n");
+ VhdlDocGen::writePlainVHDLDeclarations(mg->members(),ol,cd,nd,fd,gd,type);
+ ol.endMemberGroup(hasHeader);
+ }
+ ++mgli;
+ }
+ }
+}// writeVHDLDeclarations
+
+/* strips the prefix for record and unit members*/
+void VhdlDocGen::adjustRecordMember(MemberDef *mdef)
+{ //,OutputList & ol) {
+ QRegExp regg("[_a-zA-Z]");
+ QCString nn=mdef->name();
+ int j=nn.find(regg,0);
+ if (j>0)
+ {
+ nn=nn.mid(j,nn.length());
+ mdef->setName(nn.data());
+ }
+}//adjustRecordMember
+
+/* strips the prefix for package and package body */
+
+bool VhdlDocGen::writeClassType( ClassDef * cd,
+ OutputList &ol ,QCString & cname)
+{
+ int id=cd->protection();
+ QCString qcs = VhdlDocGen::trTypeString(id+2);
+ cname=VhdlDocGen::getClassName(cd);
+ ol.startBold();
+ ol.writeString(qcs.data());
+ ol.writeString(" ");
+ ol.endBold();
+ return FALSE;
+}// writeClassLink
+
+QCString VhdlDocGen::trVhdlType(int type,bool sing)
+{
+ switch(type)
+ {
+ case VhdlDocGen::LIBRARY:
+ if (sing) return "Library";
+ else return "Libraries";
+ case VhdlDocGen::PACKAGE:
+ if (sing) return "Package";
+ else return "Packages";
+ case VhdlDocGen::SIGNAL:
+ if (sing) return "Signal";
+ else return "Signals";
+ case VhdlDocGen::COMPONENT:
+ if (sing) return "Component";
+ else return "Components";
+ case VhdlDocGen::CONSTANT:
+ if (sing) return "Constant";
+ else return "Constants";
+ case VhdlDocGen::ENTITY:
+ if (sing) return "Entity";
+ else return "Entities";
+ case VhdlDocGen::TYPE:
+ if (sing) return "Type";
+ else return "Types";
+ case VhdlDocGen::SUBTYPE:
+ if (sing) return "Subtype";
+ else return "Subtypes";
+ case VhdlDocGen::FUNCTION:
+ if (sing) return "Function";
+ else return "Functions";
+ case VhdlDocGen::RECORD:
+ if (sing) return "Record";
+ else return "Records";
+ case VhdlDocGen::PROCEDURE:
+ if (sing) return "Procedure";
+ else return "Procedures";
+ case VhdlDocGen::ARCHITECTURE:
+ if (sing) return "Architecture";
+ else return "Architectures";
+ case VhdlDocGen::ATTRIBUTE:
+ if (sing) return "Attribute";
+ else return "Attributes";
+ case VhdlDocGen::PROCESS:
+ if (sing) return "Process";
+ else return "Processes";
+ case VhdlDocGen::PORT:
+ if (sing) return "Port";
+ else return "Ports";
+ case VhdlDocGen::USE:
+ if (sing) return "Package";
+ else return "Packages";
+ case VhdlDocGen::GENERIC:
+ if (sing) return "Generic";
+ else return "Generics";
+ case VhdlDocGen::PACKAGE_BODY:
+ return "Package Body";
+ case VhdlDocGen::DOCUMENT:
+ return "Doc";
+ case VhdlDocGen::UNITS:
+ return "Units";
+ case VhdlDocGen::SHAREDVARIABLE:
+ if (sing) return "Shared Variable";
+ return "Shared Variables";
+ case VhdlDocGen::VFILE:
+ if (sing) return "File";
+ return "Files";
+ case VhdlDocGen::GROUP:
+ if (sing) return "Group";
+ return "Groups";
+ case VhdlDocGen::COMPONENT_INST:
+ if (sing) return "Component Instantiation";
+ else return "Component Instantiations";
+ case VhdlDocGen::ALIAS:
+ if (sing) return "Alias";
+ return "Aliases";
+ case VhdlDocGen::CONFIG:
+ if (sing) return "Configuration";
+ return "Configurations";
+ case VhdlDocGen::MISCELLANEOUS:
+ return "Miscellaneous";
+ default:
+ return "Class";
+ }
+}
+
+QCString VhdlDocGen::trDesignUnitHierarchy()
+{
+ return "Design Unit Hierarchy";
+}
+
+QCString VhdlDocGen::trDesignUnitList()
+{
+ return "Design Unit List";
+}
+
+QCString VhdlDocGen::trDesignUnitMembers()
+{
+ return "Design Unit Members";
+}
+
+QCString VhdlDocGen::trDesignUnitListDescription()
+{
+ return "Here is a list of all design unit members with links to "
+ "the Entities and Packages they belong to:";
+}
+
+QCString VhdlDocGen::trDesignUnitIndex()
+{
+ return "Design Unit Index";
+}
+
+QCString VhdlDocGen::trDesignUnits()
+{
+ return "Design Units";
+}
+
+QCString VhdlDocGen::trFunctionAndProc()
+{
+ return "Functions/Procedures/Processes";
+}
+
+
+
+/*! adds documentation to a function/procedure */
+bool VhdlDocGen::writeDoc(EntryNav* rootNav)
+{
+ Entry *e=rootNav->entry();
+ //if (e->section==Entry::Entry::OVERLOADDOC_SEC)
+ if (stricmp(e->type.data(),"function")==0)
+ {
+ VhdlDocGen::addFuncDoc(rootNav);
+ }
+
+ return FALSE;
+}// writeDoc
+
+
+/* do not insert the same component twice */
+
+bool VhdlDocGen::foundInsertedComponent(const QCString & name,Entry* root)
+{
+ QListIterator<BaseInfo> bii(*root->extends);
+ BaseInfo *bi=0;
+ for (bii.toFirst();(bi=bii.current());++bii)
+ {
+ if (bi->name==name)
+ {
+ return TRUE; //
+ }
+ }
+
+ return FALSE;
+}// found component
+
+/*! writes a link if the string is linkable else a formatted string */
+
+void VhdlDocGen::writeStringLink(const MemberDef *mdef,QCString mem, OutputList& ol)
+{
+ if (mdef)
+ {
+ ClassDef *cd=mdef->getClassDef();
+ if (cd)
+ {
+ QCString n=cd->name();
+ MemberDef* memdef=VhdlDocGen::findMember(n,mem);
+ if (memdef && memdef->isLinkable())
+ {
+ ol.startBold();
+ writeLink(memdef,ol);
+ ol.endBold();
+ ol.docify(" ");
+ return;
+ }
+ }
+ }
+ VhdlDocGen::startFonts(mem,"vhdlchar",ol);
+}// found component
+
+void VhdlDocGen::writeCodeFragment( MemberDef *mdef,OutputList& ol)
+{
+ // Definition d=(Definition)mdef;
+ // QCString fdd=mdef->getDefFileExtension();
+ // QCString scope=mdef->getScopeString();
+ QCString codeFragment=mdef->documentation();
+ //FileDef *fd=mdef->getFileDef();
+
+ //int start=mdef->getStartBodyLine();
+ //int end=mdef->getEndBodyLine();
+ QStringList qsl=QStringList::split("\n",codeFragment);
+
+ writeLink(mdef,ol);
+ ol.docify(" ");
+ ol.insertMemberAlign();
+ int len = qsl.count();
+ int j;
+ for (j=0;j<len;j++)
+ {
+ QCString q=(QCString)qsl[j];
+ VhdlDocGen::writeFormatString(q,ol,mdef);
+ ol.lineBreak();
+ if (j==2) // only the first three lines are shown
+ {
+ q="...";
+ VhdlDocGen::writeFormatString(q,ol,mdef);
+ break;
+ }
+ }
+}
+
+void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
+{
+ // Definition d=(Definition)mdef;
+ QCString fdd=mdef->getDefFileExtension();
+ QCString scope=mdef->getScopeString();
+ QCString codeFragment=mdef->documentation();
+ FileDef *fd=mdef->getFileDef();
+ int start=mdef->getStartBodyLine();
+ int end=mdef->getEndBodyLine();
+ QStringList qsl=QStringList::split("\n",codeFragment);
+
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(fdd.data());
+ pIntf->resetCodeParserState();
+
+ ol.startParagraph();
+ ol.startCodeFragment();
+ pIntf->parseCode(ol, // codeOutIntf
+ scope, // scope
+ codeFragment, // input
+ FALSE, // isExample
+ 0, // exampleName
+ fd, // fileDef
+ start, // startLine
+ end, // endLine
+ TRUE, // inlineFragment
+ mdef, // memberDef
+ FALSE // show line numbers
+ );
+ ol.endCodeFragment();
+ ol.endParagraph();
+
+ mdef->writeSourceDef(ol,cname);
+ mdef->writeSourceRefs(ol,cname);
+ mdef->writeSourceReffedBy(ol,cname);
+}
+
diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h
new file mode 100644
index 0000000..958f8cc
--- /dev/null
+++ b/src/vhdldocgen.h
@@ -0,0 +1,281 @@
+/******************************************************************************
+ *
+ * $Id: vhdlscanner.h,v 1.9 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef VHDLDOCGEN_H
+#define VHDLDOCGEN_H
+
+/**
+ * This class implements functions for parsing and generating
+ * vhdl documents
+ */
+
+#include <qdict.h>
+#include <qcstring.h>
+
+#include "memberlist.h"
+
+class QStringList;
+class Entry;
+class ClassSDict;
+class FileStorage;
+class EntryNav;
+class ClassDef;
+class MemberDef;
+
+class VhdlDocGen
+{
+ public:
+
+ enum VhdlClasses // Overlays: Protection
+ {
+ ENTITYCLASS, // Overlays: Public
+ PACKBODYCLASS, // Overlays: Protected
+ ARCHITECTURECLASS, // Overlays: Private
+ PACKAGECLASS // Overlays: Package
+ };
+ enum VhdlKeyWords
+ {
+ LIBRARY=1,
+ ENTITY,
+ PACKAGE_BODY,
+ ARCHITECTURE,
+ PACKAGE,
+ ATTRIBUTE,
+ SIGNAL,
+ COMPONENT,
+ CONSTANT,
+ TYPE,
+ SUBTYPE,
+ FUNCTION,
+ RECORD,
+ PROCEDURE,
+ USE,
+ PROCESS,
+ PORT,
+ DOCUMENT, //18 0x12
+ UNITS,
+ GENERIC,
+ PORTMAP, // obsolete
+ COMPONENT_INST,
+ GROUP,
+ VFILE,
+ SHAREDVARIABLE,
+ CONFIG,
+ ALIAS,
+ MISCELLANEOUS
+ };
+
+ VhdlDocGen();
+ virtual ~VhdlDocGen();
+ static void init();
+
+ // --- used by vhdlscanner.l -----------
+ static QCString getIndexWord(const char* ,int index);
+ static bool foundInsertedComponent(const QCString& name,Entry* root);
+ static bool deleteCharRev(QCString &s,char c);
+ static bool isFunctionProto(QCString& ss);
+ static Entry* findFunction(Entry* func);
+ static void deleteAllChars(QCString &s,char c);
+ static bool getSigName(QList<QCString>& ql,
+ const char* str,
+ QCString& buffer);
+ static bool getSigTypeName(QList<QCString>& ql,
+ const char* str,
+ QCString& buffer);
+ static void parseFuncProto(const char* text,
+ QList<Argument>& ,
+ QCString& name,
+ QCString& ret,
+ bool doc=false);
+ // -----------------------------------
+
+ static void debugClassName(ClassSDict*);
+ //static void MergeFuncDoc(Entry* p,Entry* root);
+
+ static void computeVhdlComponentRelations();
+
+ //static void addVariableToComponents(EntryNav *rootNav,ClassDef *cd, MemberDef::MemberType mtype, const QCString &name, bool fromAnnScope,MemberDef *fromAnnMemb,Protection prot,bool related);
+
+ static QCString* findKeyWord(const QCString& word);
+ static void addFuncDoc(EntryNav* root);
+
+ //static void MapArchitecturesToEntity(Entry* cur_root);
+
+ //static void MapComponentToEntity(const ClassSDict*);
+
+ static ClassDef* findComponent(int type);
+ static ClassDef* getPackageName(const QCString& name);
+ static MemberDef* findMember(const QCString& className,
+ const QCString& memName);
+ static void findAllPackages(const QCString& className,
+ QDict<QCString>&);
+ static MemberDef* findMemberDef(ClassDef* cd,
+ const QCString& key,
+ MemberList::ListType type);
+ static ClassDef *getClass(const char *name);
+ static Entry* findFunction(Entry* root,Entry* func);
+ static MemberDef* findFunction(const QList<Argument> &ql,
+ const QCString& name,
+ const QCString& package, bool type);
+ static bool compareString(const QCString& s1,
+ const QCString& s2);
+ static QCString getClassTitle(const ClassDef*);
+ static void writeInlineClassLink(const ClassDef*,
+ OutputList &ol);
+
+ //static void writeVhdlComponentList(OutputList &ol,int type);
+ static bool isMisc(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::MISCELLANEOUS; }
+ static bool isConfig(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::CONFIG; }
+ static bool isAlias(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::ALIAS; }
+ static bool isLibrary(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::LIBRARY; }
+ static bool isGeneric(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::GENERIC; }
+ static bool isPort(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::PORT; }
+ static bool isComponent(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::COMPONENT; }
+ static bool isPackage(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::USE; }
+ static bool isEntity(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::ENTITY; }
+ static bool isConstant(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::CONSTANT; }
+ static bool isVType(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::TYPE; }
+ static bool isSubType(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::SUBTYPE; }
+ static bool isVhdlFunction(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::FUNCTION; }
+ static bool isProcess(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::PROCESS; }
+ static bool isSignal(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::SIGNAL; }
+ static bool isAttribute(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::ATTRIBUTE; }
+ static bool isSignals(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::SIGNAL; }
+ static bool isProcedure(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::PROCEDURE; }
+ static bool isRecord(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::RECORD; }
+ static bool isArchitecture(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::ARCHITECTURE; }
+ static bool isUnit(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::UNITS; }
+ static bool isPackageBody(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::PACKAGE_BODY; }
+ static bool isVariable(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::SHAREDVARIABLE; }
+ static bool isFile(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::VFILE; }
+ static bool isGroup(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::GROUP; }
+ static bool isCompInst(const MemberDef *mdef)
+ { return mdef->getMemberSpecifiers()==VhdlDocGen::COMPONENT_INST; }
+
+ //-----------------------------------------------------
+ // translatable items
+
+ static QCString trTypeString(int type);
+ static QCString trVhdlType(int type,bool sing=true);
+
+ // trClassHierarchy.
+ static QCString trDesignUnitHierarchy();
+
+ // trCompoundList
+ static QCString trDesignUnitList();
+
+ // trCompoundMembers.
+ static QCString trDesignUnitMembers();
+
+ // trCompoundListDescription
+ static QCString trDesignUnitListDescription();
+
+ // trCompounds
+ static QCString trDesignUnits();
+
+ // trCompoundIndex
+ static QCString trDesignUnitIndex();
+
+ // trFunctions
+ static QCString trFunctionAndProc();
+
+
+ //-----------------------------------------------------
+
+ static void prepareComment(QCString&);
+ static QCString getpackname(const char* text,
+ const char* word,
+ const char* patter);
+ static void parseProcessProto(const char* text,
+ QCString&,
+ QStringList&);
+ static void formatString(QCString&,OutputList& ol,const MemberDef*);
+
+ static void writeFormatString(QCString&,OutputList& ol,const MemberDef*);
+ static void writeFunctionProto(OutputList& ol,const ArgumentList *al,const MemberDef*);
+ static void writeProcessProto(OutputList& ol,const ArgumentList *al,const MemberDef*);
+ static void writeProcedureProto(OutputList& ol, const ArgumentList *al,const MemberDef*);
+ static void writeFuncProcDocu(const MemberDef *mdef, OutputList& ol,const ArgumentList* al,bool type=false);
+ static void writeRecordProto(const MemberDef *mdef, OutputList& ol,const ArgumentList *al);
+
+ static QCString convertArgumentListToString(const ArgumentList* al,bool f);
+ static QCString getProcessNumber();
+ static QCString getRecordNumber();
+
+ static void writeVHDLTypeDocumentation(const MemberDef* mdef, const Definition* d, OutputList &ol);
+
+ static void writeVhdlDeclarations(MemberList*,OutputList&,GroupDef*,ClassDef*,FileDef*);
+
+ static void writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ bool inGroup);
+
+ static void writePlainVHDLDeclarations(MemberList* ml,OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,int specifier);
+
+ static void writeVHDLDeclarations(MemberList* ml,OutputList &ol,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ const char *title,const char *subtitle,bool showEnumValues,int type);
+
+ static QCString getClassName(const ClassDef*);
+ static bool writeClassType(ClassDef *,OutputList &ol ,QCString & cname);
+ static void adjustRecordMember(MemberDef *mdef);
+ static bool writeDoc(EntryNav* rootNav);
+
+ static void writeLink(const MemberDef* mdef,OutputList &ol);
+ static void adjustMemberName(QCString& nn);
+ static bool membersHaveSpecificType(MemberList *ml,int type);
+ static void startFonts(const QCString& q, const char *keyword,OutputList& ol);
+ static bool isNumber(const QCString& s);
+ static QCString getProtectionName(int prot);
+ static void writeSource(MemberDef *mdef,OutputList& ol,QCString &);
+ private:
+ static void getFuncParams(QList<Argument>&, const char* str);
+ static bool compareArgList(ArgumentList*,ArgumentList*);
+ static void writeVhdlLink(const ClassDef* cdd ,OutputList& ol,QCString& type,QCString& name,QCString& beh);
+ static void findAllArchitectures(QList<QCString>& ql,const ClassDef *cd);
+ static void writeStringLink(const MemberDef *mdef,QCString mem,OutputList& ol);
+ static void writeCodeFragment(MemberDef *mdef,OutputList& ol);
+
+};
+
+#endif
diff --git a/src/vhdlscanner.cpp b/src/vhdlscanner.cpp
new file mode 100644
index 0000000..a2ad21f
--- /dev/null
+++ b/src/vhdlscanner.cpp
@@ -0,0 +1,10776 @@
+
+#line 3 "<stdout>"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define yy_create_buffer vhdlscanYY_create_buffer
+#define yy_delete_buffer vhdlscanYY_delete_buffer
+#define yy_flex_debug vhdlscanYY_flex_debug
+#define yy_init_buffer vhdlscanYY_init_buffer
+#define yy_flush_buffer vhdlscanYY_flush_buffer
+#define yy_load_buffer_state vhdlscanYY_load_buffer_state
+#define yy_switch_to_buffer vhdlscanYY_switch_to_buffer
+#define yyin vhdlscanYYin
+#define yyleng vhdlscanYYleng
+#define yylex vhdlscanYYlex
+#define yylineno vhdlscanYYlineno
+#define yyout vhdlscanYYout
+#define yyrestart vhdlscanYYrestart
+#define yytext vhdlscanYYtext
+#define yywrap vhdlscanYYwrap
+#define yyalloc vhdlscanYYalloc
+#define yyrealloc vhdlscanYYrealloc
+#define yyfree vhdlscanYYfree
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE vhdlscanYYrestart(vhdlscanYYin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 262144
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t vhdlscanYYleng;
+
+extern FILE *vhdlscanYYin, *vhdlscanYYout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up vhdlscanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up vhdlscanYYtext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via vhdlscanYYrestart()), so that the user can continue scanning by
+ * just pointing vhdlscanYYin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when vhdlscanYYtext is formed. */
+static char yy_hold_char;
+static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+yy_size_t vhdlscanYYleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow vhdlscanYYwrap()'s to do buffer switches
+ * instead of setting up a fresh vhdlscanYYin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void vhdlscanYYrestart (FILE *input_file );
+void vhdlscanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE vhdlscanYY_create_buffer (FILE *file,int size );
+void vhdlscanYY_delete_buffer (YY_BUFFER_STATE b );
+void vhdlscanYY_flush_buffer (YY_BUFFER_STATE b );
+void vhdlscanYYpush_buffer_state (YY_BUFFER_STATE new_buffer );
+void vhdlscanYYpop_buffer_state (void );
+
+static void vhdlscanYYensure_buffer_stack (void );
+static void vhdlscanYY_load_buffer_state (void );
+static void vhdlscanYY_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER vhdlscanYY_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE vhdlscanYY_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE vhdlscanYY_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE vhdlscanYY_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+void *vhdlscanYYalloc (yy_size_t );
+void *vhdlscanYYrealloc (void *,yy_size_t );
+void vhdlscanYYfree (void * );
+
+#define yy_new_buffer vhdlscanYY_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ vhdlscanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ vhdlscanYY_create_buffer(vhdlscanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ vhdlscanYYensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ vhdlscanYY_create_buffer(vhdlscanYYin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define vhdlscanYYwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *vhdlscanYYin = (FILE *) 0, *vhdlscanYYout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int vhdlscanYYlineno;
+
+int vhdlscanYYlineno = 1;
+
+extern char *vhdlscanYYtext;
+#define yytext_ptr vhdlscanYYtext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up vhdlscanYYtext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ vhdlscanYYleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 51
+#define YY_END_OF_BUFFER 52
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_acclist[1319] =
+ { 0,
+ 49, 49, 10, 49, 10, 49, 49, 49, 49, 49,
+ 32, 49, 32, 49, 21, 49, 21, 49, 13, 49,
+ 13, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 52, 50, 51, 49, 50, 51, 47, 51, 50, 51,
+ 50, 51, 50, 51, 40, 48, 50, 51, 48, 50,
+ 51, 50, 51, 49, 50, 51, 48, 50, 51, 49,
+ 50, 51, 10, 47, 51, 10, 50, 51, 49, 50,
+ 51, 50, 51, 50, 51, 40, 48, 50, 51, 50,
+ 51, 48, 50, 51, 48, 50, 51, 48, 50, 51,
+
+ 48, 50, 51, 48, 50, 51, 48, 50, 51, 50,
+ 51, 48, 50, 51, 49, 50, 51, 10, 47, 51,
+ 10, 50, 51, 49, 50, 51, 48, 50, 51, 48,
+ 50, 51, 48, 50, 51, 48, 50, 51, 48, 50,
+ 51, 48, 50, 51, 48, 50, 51, 48, 50, 51,
+ 48, 50, 51, 48, 50, 51, 48, 50, 51, 44,
+ 50, 51, 44, 49, 50, 51, 44, 47, 51, 44,
+ 50, 51, 44, 50, 51, 44, 50, 51, 40, 44,
+ 48, 50, 51, 44, 48, 50, 51, 44, 50, 51,
+ 44, 49, 50, 51, 44, 50, 51, 44, 48, 50,
+
+ 51, 17, 40, 48, 50, 51, 17, 48, 50, 51,
+ 50, 51, 17, 48, 50, 51, 25, 50, 51, 32,
+ 49, 50, 51, 25, 32, 47, 51, 25, 32, 50,
+ 51, 25, 50, 51, 26, 50, 51, 27, 50, 51,
+ 25, 50, 51, 25, 40, 48, 50, 51, 31, 50,
+ 51, 25, 48, 50, 51, 25, 48, 50, 51, 25,
+ 48, 50, 51, 25, 50, 51, 32, 49, 50, 51,
+ 25, 48, 50, 51, 21, 49, 50, 51, 21, 47,
+ 51, 21, 50, 51, 40, 48, 50, 51, 48, 50,
+ 51, 48, 50, 51, 21, 49, 50, 51, 48, 50,
+
+ 51, 13, 49, 50, 51, 13, 47, 51, 13, 50,
+ 51, 14, 48, 50, 51, 13, 49, 50, 51, 14,
+ 48, 50, 51, 11, 50, 51, 11, 49, 50, 51,
+ 11, 47, 51, 11, 50, 51, 11, 50, 51, 11,
+ 50, 51, 11, 40, 48, 50, 51, 11, 48, 50,
+ 51, 11, 48, 50, 51, 11, 50, 51, 11, 49,
+ 50, 51, 11, 48, 50, 51, 29, 50, 51, 29,
+ 49, 50, 51, 29, 47, 51, 29, 50, 51, 29,
+ 50, 51, 29, 50, 51, 29, 40, 48, 50, 51,
+ 29, 48, 50, 51, 29, 48, 50, 51, 29, 50,
+
+ 51, 29, 49, 50, 51, 29, 48, 50, 51, 15,
+ 40, 48, 50, 51, 15, 48, 50, 51, 50, 51,
+ 15, 48, 50, 51, 33, 40, 48, 50, 51, 33,
+ 48, 50, 51, 50, 51, 33, 48, 50, 51, 38,
+ 47, 51, 38, 50, 51, 37, 50, 51, 35, 50,
+ 51, 48, 50, 51, 48, 50, 51, 16, 50, 51,
+ 16, 48, 50, 51, 50, 51, 16, 48, 50, 51,
+ 49, 41, 46, 48, 40, 48, 48, 48, 49, 48,
+ 49, 49, 10, 41, 48, 40, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 49, 49, 10, 48,
+
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 49, 46,
+ 17, 17, 48, 17, 40, 48, 17, 48, 17, 48,
+ 17, 48, 32, 49, 32, 48, 48, 32, 49, 21,
+ 49, 21, 48, 40, 48, 23, 48, 48, 21, 49,
+ 48, 13, 49, 13, 14, 14, 14, 48, 13, 49,
+ 14, 14, 48, 48, 49, 48, 49, 15, 48, 15,
+ 40, 48, 15, 48, 15, 48, 15, 48, 33, 48,
+ 33, 40, 48, 33, 48, 33, 48, 33, 48, 48,
+ 36, 48, 16, 41, 16, 16, 16, 16, 48, 16,
+
+ 48, 16, 48, 46, 45, 46, 40, 48, 48, 40,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 43, 45,
+ 46, 17, 40, 48, 17, 17, 48, 48, 48, 40,
+ 48, 48, 48, 14, 14, 48, 48, 48, 15, 40,
+ 48, 15, 48, 33, 40, 48, 33, 48, 48, 16,
+ 48, 45, 46, 45, 46, 40, 39, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 39,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+
+ 48, 48, 6, 6, 6, 43, 43, 45, 46, 43,
+ 45, 46, 17, 39, 24, 24, 28, 48, 48, 48,
+ 48, 40, 23, 48, 48, 39, 14, 14, 39, 48,
+ 30, 48, 48, 48, 36, 39, 45, 46,16426, 39,
+ 48, 48, 48, 34, 48, 48, 48, 48, 48, 48,
+ 48, 3, 3, 3, 39, 39, 39, 39, 39, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 6, 6, 6, 43, 43, 43, 45, 46,
+ 17, 39, 24, 48, 48, 48, 48, 48, 23, 23,
+ 23, 48, 48, 39, 14, 39, 48, 48, 48, 48,
+
+ 48, 36, 36, 36, 39, 48, 48, 48, 34, 48,
+ 48, 48, 48, 48, 48, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 43, 48, 48, 48,
+ 28, 48, 23, 48, 48, 48, 48, 48, 48, 30,
+ 36, 48, 48, 48, 48, 5, 48, 48, 48, 48,
+ 8, 8, 8, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 8234, 5, 48, 48, 48, 5, 5, 5,
+
+ 5, 48, 48, 48, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 7, 48, 48, 48, 48,
+ 48, 48, 20, 48, 48, 48, 48, 48, 48, 48,
+ 5, 9, 5, 48, 48, 48, 5, 5, 5, 5,
+ 7, 7, 48, 48, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 7,
+ 7, 7, 48, 48, 48, 48, 48, 48, 20, 48,
+ 22, 23, 48, 48, 48, 48, 5, 5, 5, 5,
+ 5, 9, 5, 5, 5, 5, 48, 48, 5, 7,
+ 7, 7, 39, 39, 39, 39, 39, 39, 39, 39,
+
+ 39, 39, 39, 39, 39, 39, 39, 48, 48, 48,
+ 48, 22, 48, 48, 48, 48, 48, 5, 5, 5,
+ 5, 5, 48, 48, 5, 5, 5, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 48, 48, 48, 12, 28,
+ 48, 48, 12, 48, 48, 48, 5, 5, 5, 9,
+ 48, 48, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 5, 39,
+ 28, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 30, 48, 48, 48, 48, 48, 39, 39, 39,
+
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 9,
+ 39, 39, 5, 39, 5, 39, 5, 39, 5, 39,
+ 7, 48, 48, 12, 19, 1, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 9, 39, 39, 5, 39, 5, 39,
+ 5, 39, 5, 39, 7, 7, 7, 48, 48, 9,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 48, 48,
+ 9, 9, 4, 4, 39, 39, 9, 39, 39, 39,
+
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 3, 3, 3,
+ 48, 48, 4, 4, 4, 1, 5, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 48, 18, 5, 5, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 5, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 9, 39, 39, 1,
+ 1, 39, 39, 39, 39, 39, 39, 39, 9, 39,
+ 39, 39, 9, 39, 39, 1, 1, 1, 39, 39,
+
+ 39, 39, 39, 39, 2, 2, 39, 5, 39, 2,
+ 2, 2, 2, 5, 39, 5, 39, 2
+ } ;
+
+static yyconst flex_int16_t yy_accept[1862] =
+ { 0,
+ 1, 2, 3, 5, 7, 8, 9, 10, 11, 13,
+ 15, 17, 19, 21, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 40, 41, 42, 44, 47, 49, 51, 53, 55,
+ 59, 62, 64, 67, 70, 73, 76, 79, 82, 84,
+ 86, 90, 92, 95, 98, 101, 104, 107, 110, 112,
+ 115, 118, 121, 124, 127, 130, 133, 136, 139, 142,
+ 145, 148, 151, 154, 157, 160, 163, 167, 170, 173,
+ 176, 179, 184, 188, 191, 195, 198, 202, 207, 211,
+ 213, 217, 220, 224, 228, 232, 235, 238, 241, 244,
+
+ 249, 252, 256, 260, 264, 267, 271, 275, 279, 282,
+ 285, 289, 292, 295, 299, 302, 306, 309, 312, 316,
+ 320, 324, 327, 331, 334, 337, 340, 343, 348, 352,
+ 356, 359, 363, 367, 370, 374, 377, 380, 383, 386,
+ 391, 395, 399, 402, 406, 410, 415, 419, 421, 425,
+ 430, 434, 436, 440, 443, 446, 449, 452, 455, 458,
+ 461, 465, 467, 471, 472, 472, 472, 472, 473, 473,
+ 474, 474, 475, 477, 478, 478, 478, 479, 480, 480,
+ 481, 482, 482, 483, 483, 483, 483, 483, 483, 483,
+ 483, 484, 484, 485, 485, 485, 485, 485, 485, 485,
+
+ 486, 488, 489, 489, 489, 489, 489, 489, 489, 489,
+ 489, 489, 489, 489, 489, 490, 490, 491, 492, 493,
+ 494, 495, 496, 496, 496, 497, 498, 498, 499, 499,
+ 499, 499, 499, 499, 499, 499, 499, 499, 499, 499,
+ 500, 500, 500, 501, 502, 503, 504, 505, 506, 507,
+ 508, 509, 510, 511, 512, 513, 514, 515, 516, 517,
+ 518, 519, 520, 520, 521, 522, 524, 527, 529, 529,
+ 529, 531, 533, 535, 536, 536, 536, 536, 537, 538,
+ 540, 542, 543, 543, 543, 544, 546, 547, 548, 549,
+ 551, 552, 554, 555, 556, 557, 559, 561, 562, 564,
+
+ 565, 566, 566, 566, 567, 568, 570, 573, 575, 575,
+ 575, 577, 579, 581, 584, 586, 586, 586, 588, 590,
+ 590, 591, 592, 593, 595, 596, 597, 598, 600, 600,
+ 600, 602, 604, 604, 605, 607, 607, 609, 609, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 610, 610,
+ 610, 610, 612, 612, 612, 612, 612, 612, 612, 612,
+ 612, 612, 612, 612, 612, 613, 614, 615, 616, 617,
+ 618, 619, 619, 619, 619, 619, 619, 619, 619, 619,
+ 619, 619, 619, 619, 619, 619, 619, 619, 619, 619,
+ 619, 619, 619, 619, 619, 620, 621, 622, 623, 624,
+
+ 625, 626, 627, 628, 629, 630, 631, 632, 633, 634,
+ 635, 636, 637, 638, 639, 639, 642, 645, 646, 648,
+ 648, 648, 648, 649, 649, 650, 650, 652, 652, 652,
+ 653, 654, 655, 657, 658, 658, 659, 662, 664, 667,
+ 669, 669, 669, 670, 672, 672, 674, 676, 677, 677,
+ 678, 678, 678, 678, 678, 678, 678, 678, 678, 678,
+ 678, 678, 678, 678, 678, 678, 678, 678, 678, 678,
+ 678, 679, 680, 680, 680, 680, 681, 682, 683, 684,
+ 684, 684, 684, 684, 684, 684, 684, 684, 684, 684,
+ 684, 684, 684, 684, 684, 684, 684, 684, 684, 684,
+
+ 684, 684, 684, 684, 685, 686, 687, 688, 689, 690,
+ 691, 692, 693, 694, 695, 696, 697, 698, 699, 700,
+ 701, 702, 703, 704, 705, 706, 707, 710, 713, 715,
+ 715, 716, 717, 717, 717, 717, 717, 718, 719, 720,
+ 721, 721, 721, 721, 722, 723, 724, 724, 724, 725,
+ 726, 727, 728, 730, 730, 731, 731, 731, 731, 732,
+ 733, 734, 735, 735, 736, 737, 737, 739, 740, 741,
+ 741, 741, 741, 741, 741, 741, 741, 741, 741, 741,
+ 741, 741, 741, 741, 741, 741, 741, 741, 741, 741,
+ 741, 741, 741, 741, 741, 742, 743, 743, 743, 744,
+
+ 744, 744, 744, 745, 746, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 747, 747, 747, 748, 749,
+ 750, 751, 752, 753, 754, 755, 756, 757, 758, 759,
+ 760, 761, 762, 763, 764, 765, 766, 766, 766, 766,
+ 767, 768, 769, 770, 771, 772, 773, 774, 775, 776,
+ 777, 778, 781, 783, 783, 783, 783, 784, 784, 784,
+ 784, 784, 784, 784, 785, 786, 787, 788, 788, 788,
+ 788, 788, 788, 789, 790, 791, 792, 792, 792, 792,
+ 792, 793, 794, 795, 797, 797, 798, 799, 799, 799,
+
+ 799, 799, 800, 801, 802, 802, 802, 802, 803, 804,
+ 805, 806, 806, 806, 806, 806, 806, 806, 806, 806,
+ 806, 806, 806, 806, 806, 806, 806, 806, 806, 806,
+ 806, 806, 806, 806, 806, 806, 806, 806, 806, 807,
+ 808, 808, 808, 809, 810, 811, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812, 812, 813,
+ 814, 815, 816, 817, 818, 819, 820, 821, 822, 823,
+ 824, 825, 826, 827, 828, 829, 830, 831, 832, 833,
+ 833, 833, 834, 835, 836, 837, 838, 838, 838, 838,
+
+ 838, 838, 838, 839, 840, 841, 841, 842, 842, 842,
+ 843, 844, 844, 844, 844, 844, 845, 846, 846, 846,
+ 847, 848, 848, 848, 849, 850, 850, 851, 852, 852,
+ 852, 852, 852, 852, 852, 852, 852, 852, 852, 852,
+ 852, 852, 852, 852, 852, 852, 852, 852, 852, 852,
+ 852, 852, 852, 852, 852, 852, 852, 853, 854, 854,
+ 854, 855, 856, 858, 858, 858, 858, 858, 858, 858,
+ 858, 858, 858, 858, 858, 858, 858, 858, 858, 858,
+ 858, 859, 860, 861, 862, 863, 864, 865, 866, 867,
+ 868, 869, 870, 871, 872, 873, 874, 875, 876, 877,
+
+ 878, 879, 880, 881, 881, 881, 882, 882, 882, 882,
+ 883, 883, 883, 883, 883, 883, 883, 884, 885, 886,
+ 886, 886, 887, 887, 887, 887, 887, 888, 889, 889,
+ 889, 890, 891, 891, 891, 892, 893, 894, 894, 894,
+ 894, 894, 895, 895, 895, 895, 895, 895, 895, 895,
+ 895, 895, 895, 895, 895, 895, 895, 895, 895, 895,
+ 895, 895, 895, 895, 896, 897, 897, 897, 898, 899,
+ 900, 901, 902, 902, 902, 902, 902, 902, 902, 902,
+ 902, 902, 902, 902, 902, 902, 903, 904, 905, 906,
+ 907, 908, 909, 910, 911, 912, 913, 914, 915, 916,
+
+ 918, 919, 919, 919, 920, 920, 920, 920, 920, 920,
+ 920, 920, 920, 921, 922, 923, 923, 923, 925, 925,
+ 925, 925, 925, 926, 927, 927, 927, 928, 929, 929,
+ 929, 930, 931, 931, 931, 931, 931, 931, 931, 932,
+ 932, 932, 932, 932, 932, 932, 932, 932, 932, 932,
+ 932, 932, 932, 932, 932, 932, 932, 932, 932, 932,
+ 932, 932, 933, 933, 934, 935, 936, 936, 936, 937,
+ 938, 939, 940, 941, 941, 941, 941, 941, 941, 942,
+ 942, 942, 943, 943, 944, 945, 946, 947, 948, 949,
+ 950, 951, 952, 953, 954, 955, 956, 957, 958, 959,
+
+ 960, 961, 962, 964, 964, 964, 965, 965, 965, 965,
+ 965, 965, 965, 965, 965, 966, 967, 968, 969, 969,
+ 970, 970, 970, 970, 970, 971, 971, 971, 973, 973,
+ 973, 974, 975, 975, 975, 976, 977, 977, 978, 978,
+ 978, 978, 978, 979, 980, 981, 982, 982, 982, 982,
+ 982, 982, 982, 982, 982, 982, 982, 982, 982, 982,
+ 982, 982, 982, 982, 983, 983, 984, 985, 986, 987,
+ 988, 989, 989, 989, 989, 989, 989, 989, 990, 990,
+ 990, 991, 991, 992, 993, 994, 995, 996, 997, 998,
+ 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008,
+
+ 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008,
+ 1009, 1010, 1011, 1012, 1012, 1012, 1012, 1013, 1013, 1013,
+ 1014, 1014, 1014, 1015, 1016, 1016, 1016, 1017, 1018, 1018,
+ 1019, 1019, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1021, 1022, 1023, 1024, 1025, 1025, 1025, 1025, 1025, 1025,
+ 1025, 1025, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032,
+ 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042,
+ 1043, 1044, 1045, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
+ 1046, 1046, 1046, 1046, 1047, 1048, 1049, 1049, 1049, 1051,
+
+ 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1053,
+ 1053, 1053, 1054, 1055, 1055, 1055, 1056, 1057, 1057, 1057,
+ 1058, 1059, 1060, 1060, 1060, 1060, 1060, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1062, 1063, 1063, 1063, 1063,
+ 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072,
+ 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1081, 1081, 1081,
+ 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1082,
+ 1083, 1084, 1085, 1086, 1087, 1087, 1087, 1087, 1088, 1089,
+ 1089, 1089, 1089, 1089, 1089, 1090, 1090, 1090, 1090, 1091,
+
+ 1092, 1092, 1092, 1092, 1092, 1093, 1094, 1095, 1096, 1097,
+ 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097,
+ 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097,
+ 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1098, 1098, 1098,
+ 1098, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106,
+ 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116,
+ 1117, 1118, 1119, 1120, 1122, 1123, 1125, 1127, 1129, 1131,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1133, 1134, 1134, 1135, 1135, 1135, 1136, 1136, 1136, 1136,
+ 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136,
+
+ 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136,
+ 1136, 1136, 1136, 1136, 1137, 1137, 1137, 1137, 1137, 1137,
+ 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146,
+ 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1156, 1157,
+ 1159, 1161, 1163, 1165, 1166, 1167, 1168, 1168, 1168, 1168,
+ 1169, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170,
+ 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1171,
+ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171,
+ 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171,
+ 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181,
+
+ 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1189, 1189,
+ 1189, 1190, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191,
+ 1191, 1192, 1192, 1192, 1193, 1193, 1194, 1194, 1194, 1194,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1196, 1197, 1199, 1200, 1201, 1202,
+ 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212,
+ 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1221,
+ 1222, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1224, 1225,
+ 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1227,
+
+ 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236,
+ 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1244, 1245,
+ 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+ 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255,
+ 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1265, 1266, 1267, 1268, 1269, 1270,
+ 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1279, 1280, 1280,
+ 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280,
+ 1280, 1280, 1280, 1281, 1281, 1282, 1283, 1284, 1285, 1286,
+
+ 1287, 1288, 1289, 1291, 1292, 1293, 1295, 1296, 1296, 1296,
+ 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296,
+ 1296, 1296, 1296, 1297, 1297, 1297, 1298, 1299, 1300, 1301,
+ 1302, 1303, 1304, 1305, 1306, 1306, 1306, 1306, 1306, 1306,
+ 1306, 1307, 1307, 1308, 1310, 1311, 1312, 1313, 1313, 1313,
+ 1314, 1316, 1318, 1318, 1318, 1318, 1319, 1319, 1319, 1319,
+ 1319
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 5, 6, 7, 8, 9, 9, 10, 10, 11,
+ 12, 13, 14, 10, 15, 16, 13, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 18, 19, 20,
+ 20, 20, 9, 21, 22, 23, 24, 25, 26, 27,
+ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
+ 31, 38, 39, 40, 41, 42, 31, 31, 43, 31,
+ 9, 44, 9, 9, 45, 1, 46, 47, 48, 49,
+
+ 50, 51, 52, 53, 54, 31, 55, 56, 57, 58,
+ 59, 60, 31, 61, 62, 63, 64, 65, 31, 31,
+ 66, 31, 67, 10, 67, 9, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 9, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 9, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[68] =
+ { 0,
+ 1, 2, 3, 4, 5, 6, 7, 8, 6, 6,
+ 9, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+ 18, 19, 19, 19, 19, 19, 19, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 21, 22, 19, 19, 19, 19, 19,
+ 19, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 23
+ } ;
+
+static yyconst flex_int16_t yy_base[2160] =
+ { 0,
+ 0, 67, 134, 200, 264, 331, 398, 465, 532, 38,
+ 599, 666, 733, 800, 867, 934, 1001, 1068, 1135, 1202,
+ 1269, 1336, 204, 0, 208, 0, 1403, 1470, 1537, 1604,
+ 302, 0, 1168,27243, 20, 24, 43, 1670, 1118, 25,
+ 1124, 1736, 369, 54, 1802, 48, 94, 1861, 1920, 98,
+ 284, 1986, 2045, 2105, 0, 2, 4, 68, 2124, 307,
+ 2190, 1761, 1823, 0, 265, 2, 56, 324, 67, 0,
+ 1, 399, 326, 49, 176,27243, 117, 214, 421, 2253,
+ 1109, 204, 1114, 2319, 637, 1100, 451, 445, 389, 2385,
+ 653,27243, 1854, 1942, 1948, 0,27243,27243, 1099, 228,
+
+ 27243, 1105, 456, 449, 0, 2451, 654, 426, 491, 497,
+ 2505, 2572, 72, 704, 72, 515, 619, 633, 2639, 771,
+ 2706,27243, 696, 700, 754, 0, 1045, 241, 1044, 788,
+ 0, 838, 655,27243, 1624, 1642, 1693, 0, 1035, 306,
+ 1038, 789, 0, 1708, 724, 353, 1032, 2772, 854, 360,
+ 1030, 2838, 855, 763, 777,27243,27243, 2905, 2972, 3038,
+ 508, 3104, 2015, 830, 834, 985, 0,27243, 0, 992,
+ 0, 116, 435, 986, 0, 0, 0, 905, 254, 657,
+ 0, 897, 0, 626, 901, 3170, 3229, 3248, 931, 3297,
+ 961, 627, 628, 3363, 724, 3429, 968, 1021, 1026, 1030,
+
+ 1088, 1105, 3495, 0, 0, 1956, 974, 2040, 2148, 2065,
+ 2152, 1155, 1159, 957, 3554, 1060, 3573, 398, 338, 1141,
+ 465, 1142, 3620, 3686, 975, 3752, 2162, 0, 1198, 932,
+ 331, 1265, 255, 737, 800, 1271, 1332, 1199, 1200, 2407,
+ 253, 259, 868, 1203, 1268, 1335, 1078, 1270, 1209, 1204,
+ 1208, 603, 8, 1274, 1340, 483, 1143, 673, 1342, 1013,
+ 1077, 1441, 973, 927, 720, 1179, 1423, 786, 3815, 3881,
+ 853, 1455, 2411, 2444, 397, 723, 735, 1486, 1461, 3947,
+ 1051, 1183, 847, 3988, 4039, 4106, 916, 844, 1487, 1781,
+ 1701, 1366, 1433, 0, 0, 4173, 1840, 736, 4240, 1551,
+
+ 1892, 2077, 790, 1552, 2158, 847, 979, 0, 4306, 4372,
+ 0, 936, 842, 1041, 0, 4438, 4504, 0, 998, 810,
+ 4571, 1232, 4638, 0, 4704, 4770, 0, 1493, 4836, 4902,
+ 0, 1754, 793, 0, 697, 722, 206, 1060, 118, 1309,
+ 1524, 4968, 4987, 1527, 1134, 5044, 5110, 1449, 5176, 1593,
+ 5242, 1898, 2289, 2560, 2627, 0, 5308, 1529, 1342, 1533,
+ 5367, 0, 0, 1602, 5426, 5478, 1797, 1552, 1789, 1848,
+ 1272, 5528, 5594, 1206, 1461, 1395, 1664, 1339, 1667, 1139,
+ 1606, 1598, 1950, 1919, 1671, 2037, 1949, 1941, 2123, 1666,
+ 1951, 1835, 1270, 1396, 2051, 2188, 2197, 1463, 1973, 1643,
+
+ 1784, 1989, 1746, 2060, 2248, 2250, 2177, 2252, 2249, 2152,
+ 2256, 2262, 2315, 2341, 688, 593, 2015, 5660, 892, 183,
+ 2354, 281, 5726, 2564, 2078, 5779, 5830, 1515, 644, 5897,
+ 2379, 1472, 5964, 2371, 1340, 6030, 637, 520, 491, 493,
+ 1568, 482, 6090, 2475, 0, 487, 0,27243, 439, 0,
+ 2534, 2424, 2027, 2410, 2429, 2260, 6156, 6222, 6288, 6354,
+ 1341, 1607, 2694, 2808, 6420, 2445, 2321, 2507, 2572, 2326,
+ 2449, 2500, 2601, 2663, 2668, 2631, 2870, 2391, 2502, 6479,
+ 6545, 2703, 2560, 2643, 2694, 2704, 2709, 2036, 2712, 2760,
+ 2761, 2705, 2713, 2773, 2772, 2768, 1736, 2769, 2835, 2829,
+
+ 2896, 1551, 1692, 2120, 2505, 2835, 2839, 2840, 2937, 6612,
+ 2895, 2900, 2905, 2906, 2943, 2749, 3033, 2918, 2973, 2975,
+ 3075, 2194, 2539, 2672, 2994, 372, 431, 0, 921, 3126,
+ 3002, 925, 412, 3131, 3451, 3062,27243, 6678, 6697, 3033,
+ 6760, 1734, 1710, 1866, 376, 2365, 3138, 3162, 6827, 6894,
+ 435, 380, 361, 3025, 2694, 3457, 3707, 3185,27243, 6960,
+ 6979, 3034, 7042, 2612, 340, 296, 288, 2689, 0, 1917,
+ 2329, 7108, 7168, 3267, 3317, 7187, 7253, 7319, 7385, 2428,
+ 2470, 3477, 3656, 3357, 3734, 7451, 7510, 7569, 7628, 2908,
+ 2971, 3549, 3097, 3108, 7687, 7749, 2575, 3328, 3165, 3210,
+
+ 3277, 3282, 3333, 3237, 3177, 7800, 7866, 3352, 3421, 3393,
+ 3531, 3605, 3408, 3609, 3843, 3652, 3461, 3718, 3838, 7932,
+ 3903, 3863, 3675, 3671, 3873, 2622, 1898, 3596, 3131, 2901,
+ 3301, 3461, 3086, 3206, 3397, 3648, 3743, 7992, 8059, 8126,
+ 3296, 3913, 3441, 3478, 1942, 3885, 3918, 4139, 4206, 3364,
+ 3492, 3749, 3618, 3732, 3567, 3928, 3853, 3981, 3985, 258,
+ 0, 240, 1126, 5270, 4023, 3956,27243, 4925, 2700, 2767,
+ 4294, 4063, 4067, 8192, 8211, 3760, 2779, 8268, 8334, 4071,
+ 2806, 1991, 2974, 3071, 3233, 3252, 3275, 3490, 2193, 2976,
+ 8401, 8468, 980, 239, 3714, 3107, 3125, 4090, 4134, 4130,
+
+ 4143, 8534, 8553, 3505, 8610, 8676, 4199, 3388, 3513, 3600,
+ 206, 204, 3712, 110, 3510, 2266, 8742, 8795, 3904, 8853,
+ 8919, 8985, 9051, 2407, 3622, 9117, 9176, 9235, 9295, 4342,
+ 9355, 3753, 9420, 322, 4225, 3950, 3963, 4035, 9479, 9528,
+ 3683, 4269, 4172, 99, 4157, 4038, 9591, 9657, 4336, 3814,
+ 3973, 4234, 4226, 4306, 4364, 4250, 4176, 3707, 4371, 4362,
+ 4231, 4363, 3932, 4372, 4044, 4409, 3171, 3309, 3798, 3878,
+ 4294, 4432, 9724, 4458, 9791, 9858, 0, 0, 5291, 80,
+ 9924, 9983, 5330,10042, 4428,10102, 4238, 4439, 3903, 4524,
+ 4532, 4431, 4497, 4553, 4444, 61, 4597, 4528, 3960, 4069,
+
+ 4664, 4601,10165,10212, 4571,10274,10340, 4089, 4104, 4162,
+ 3977, 3599, 3403, 3498, 3508,10407,10474, 4177, 4247, 4270,
+ 3757, 4669, 4733,10540,10587,10634,10700, 4153, 43, 4294,
+ 3920, 4574, 4383, 4370,10766,10832,10898,10964, 4310, 4739,
+ 4806, 4872, 5014,11030,11089,11148,11207,11266,11328,11387,
+ 5080, 4637, 4143, 4571, 4704, 4636, 4710, 4443, 4375, 4799,
+ 4691, 4772, 4822,11450,11516, 4503, 4703, 4439, 4866, 4452,
+ 11582, 4757, 4769, 4504, 4507, 4890, 4938, 4846, 4510, 4566,
+ 4766, 4826, 4893, 4933, 5006, 5010,11642,11709, 0, 5384,
+ 5398, 5449, 5359, 2942,11775, 5684, 5688,11832, 5764, 5032,
+
+ 4963, 5028, 5030, 5075, 5139, 5110, 5095, 5199, 5264, 5159,
+ 5508, 5692, 4183, 4313, 5457, 5696,11893,11955, 4927, 4639,
+ 4575, 4659, 5117, 5007, 4697, 4707,12015,12082, 4757, 4683,
+ 4775, 4768, 5770, 5865,12148,12210,27243, 4824, 4826, 5229,
+ 5109, 5463, 5182, 5122, 4986, 4839, 4810, 5468,12259,12319,
+ 5524, 5525, 5952, 5988, 5992, 6126,12378, 5179, 6019, 4894,
+ 12437, 5526, 5529, 5236, 5309, 4847, 5617, 4914, 5207, 5394,
+ 5513, 5622, 5266, 5591, 5245, 5317, 5518, 5389, 5647, 5756,
+ 5178, 5689, 5817, 4985, 5043, 5700, 5596, 5643, 6378, 5088,
+ 5050, 6192, 6382, 6636, 6605, 6640, 6704, 6986, 6918, 5317,
+
+ 5830, 6135, 6244, 5831, 5125, 5941, 5856, 6326, 5110, 5294,
+ 5923, 6391, 5725, 5818, 6002, 5300, 5367, 0, 5465, 5737,
+ 5161, 5287, 5593, 6117, 5385, 5368, 5464, 5518, 5996, 6451,
+ 5836, 5758, 5525, 5523, 6029, 6002, 5900, 5980, 6141, 5439,
+ 12500,12559, 6282,12618, 6158, 6480, 6815, 7065,12677, 6030,
+ 7079, 7223, 7408, 7412, 5469, 6092, 6155, 4549, 7471, 7489,
+ 5533, 6219, 6224, 6509, 5530, 5824, 5480, 6575, 5947, 5918,
+ 242, 5929, 6068, 6097, 6285, 6156, 6151, 6318, 6407, 6379,
+ 6401, 826, 5608, 6273, 6530, 5543, 5719, 7540, 7599, 6754,
+ 7635,12736,12795, 7530, 7417, 7620, 7707, 7890, 7894, 6922,
+
+ 6252, 6460, 6395, 6745, 6860, 6409, 5772, 6722, 6796, 6646,
+ 5655, 5729, 7070, 7902, 6089, 6278, 6467, 6407, 5851,27243,
+ 6382, 6582, 5956, 6670,12855, 6716, 6784, 4154, 5894, 5947,
+ 6049, 6073, 7011, 6928, 6479, 6541, 6032, 6665, 6538, 6576,
+ 6820, 6830, 7093, 6791, 7148, 6849, 7160,12921, 7721, 7317,
+ 6961, 7738, 7986, 6037, 6159, 6696, 6291, 6353, 6162, 6154,
+ 6426, 6830, 6932,27243, 6978, 8085, 8238, 7241, 7420, 6531,
+ 6887, 6218, 7074, 7216, 7348, 7711, 6453, 7525, 7313, 7517,
+ 7098, 6972, 1170, 1513, 6460, 6285,12980,13039,13098,13158,
+ 8492, 8028, 8559,13218,13277, 8153, 8702, 8735, 8764, 7716,
+
+ 7782, 6498, 8217, 7830, 7282, 6352, 6404, 7591, 7851, 6538,
+ 7117, 6985,13336, 6602,13381, 6952,27243,13448, 7210,13515,
+ 6619, 6675, 6611, 8104, 7968, 7824, 6823, 6703, 6690, 7237,
+ 7040, 8114, 7306,13581,13640, 7733, 8159, 7985, 6766, 6748,
+ 7110, 6979, 6771, 7321, 6755, 6813, 7252, 8458, 8039, 8304,
+ 9071, 8354, 7092, 6825, 6890, 8367, 8254, 6971, 8300, 8430,
+ 8320, 7254, 8178, 8502, 7413, 7047, 7789, 9087, 9138, 9157,
+ 13699,13758,13817,13876,13935, 9147, 9203,13998, 9197, 6923,
+ 9228,14064, 9253, 8574, 8596, 7139, 7963, 8640, 8661, 7100,
+ 7244, 8825,14124,14168, 7458, 7616, 8080,14227,27243,14271,
+
+ 14315, 7184,14382, 8015, 8291, 8371, 7185, 8527, 7329, 8698,
+ 14448,27243,14492, 8706, 8815,14536,14595, 3018,14644,14710,
+ 0, 4017,14776, 8260, 9279, 9076, 9309,14842, 7321, 7319,
+ 9315, 8914, 8979, 9374, 7357, 7388,14901,14960, 1529,15019,
+ 8729, 9391, 9459, 9499,15078,15097, 7401, 8877, 8886,15154,
+ 7404, 8394,15220,15280,15340,15407,15474,15541,15608,15675,
+ 7409, 7421, 8600, 7425, 9578, 7635, 8453, 8954, 9324, 7455,
+ 9257,15741, 9386, 9107, 7455, 8776, 8833, 8434,27243,15800,
+ 15819, 7499, 7549,15882, 8498,15941,15985,16029,16073,16117,
+ 16183,16249, 4094, 7499, 7450, 8648,16315,16359,16403,16447,
+
+ 16491, 9568, 8904, 8710,27243,16550,16569, 7547,16632,16691,
+ 16757,16823, 8324,16889, 7531, 7476, 9718, 9785, 9885, 9939,
+ 9977, 9998,10071, 7526, 8844,16948, 7536,10081,10122, 7800,
+ 10193,10207,17007, 9006, 9369, 9505,17067, 8837, 8881, 9688,
+ 17086, 7543,17152,17211,10268,17270,17330,17397,17464,17531,
+ 7557, 7576,10395,10497,10524,10567,17598,17665, 7617, 7973,
+ 10670,10736, 9552, 7595, 7904,10984,11002, 9573, 7917, 9016,
+ 9638, 7601, 9813, 9184, 9437,17731, 8966,11061, 9680,17790,
+ 17848,17908,17974,18040,18106, 9442, 7611, 9761, 9642,18172,
+ 18231, 9992, 7636, 9346,10310,10401,10892,11068,11142,11082,
+
+ 9895, 7615, 9836,18297, 7644,10563, 8908,18356,10188, 9931,
+ 9960,10319,10111,27243,10117,10813,18422, 9825,18468,18534,
+ 10020,18600,11153,10218, 7869,10628,10988,18660,18727, 7814,
+ 7990, 8404, 7636, 7736,18794,18861, 8164, 0, 9466,11212,
+ 642,11226, 8378, 6807, 9023, 9692, 7658,11271,11308,18927,
+ 18974,19032, 0, 7740,19098,10200, 7663,10501, 7684,11312,
+ 11072,11348,19164, 7755, 8234,11486,11553,10506,10528, 9266,
+ 9845,11391,19223, 0, 9954,10664,10730,10865,11418,19289,
+ 10437,19347,11599, 9619,11243,19413,10363,11669,10751,19479,
+ 19538, 8246, 9083, 7999, 7754, 7788, 8582, 8473, 7929, 9851,
+
+ 7790, 7799, 8389,10757,11736,11779,11569, 4621,10374,11480,
+ 8055, 8917, 7931, 7934, 7863,11809, 4762,11850,11912, 7988,
+ 10819,10692, 8522,27243, 8059,10799,10823, 8133,11320, 8306,
+ 10886,11133,11824,19597, 0,11248,11788,11886,11925,11978,
+ 19663, 9949,10144,11573,19721, 0,10246,10610,10658,10790,
+ 10928,11983,11501,19787,12070,12167,10035, 7993, 8032, 8336,
+ 10102, 9500,11916, 8337, 8052, 8616,19846,19905,12007, 8992,
+ 12194, 8914,12230,12143,10408, 4956, 7371,11407,11546, 9058,
+ 8987, 8099,11441, 9623,12106,12248,11623,27243, 0,11430,
+ 8340,11695,11995, 8341,12189,10060,11635,10517, 0,12324,
+
+ 12047, 9392, 8397, 8189, 9721,12268, 9166,12312,12357,12393,
+ 9196, 8194,11740, 9695, 8463, 9392, 8208,12110, 9526,27243,
+ 10252, 5032,12002, 5036,11800,12239,12408,19964,10860,12453,
+ 10384,12418,11173, 8273,12171, 9314,12457,12479,12472, 9727,
+ 8495, 9077, 8521,12275,12516, 8406,12540, 8546,12430, 8053,
+ 6111,12521,20022,20088,11745,11933,12566,10575,12586,12135,
+ 12623,12647,12657,12627, 8552,12397, 8625, 9859, 9360,12685,
+ 12695, 8624,10295,12755,12774,10956, 8534, 8623,12301, 7290,
+ 8819,20154, 0, 9646,20220,20286,20352,12875,12879,12883,
+ 12705,12801, 0,20418,12825, 8741, 8598,12913,12939,12950,
+
+ 13001,12745, 8766,13011,10305, 0, 8600, 8731,12604,13016,
+ 13021, 0, 0,20484,12836,13045,13060, 9711,13075,13080,
+ 13103,20550, 0,20603, 0, 0,13127,13032,10460,13138,
+ 13166,13184, 8743,27243,10688, 9054, 9094,13176,13197,13235,
+ 13226,13245,10870,10951, 9850, 0, 0,20669,13257,13297,
+ 12530,12691,20735,20801,10621,13318,13368, 0, 0,27243,
+ 20868,20891,20914,20937,20960,20983,21006,21029,21052,21075,
+ 21098,21120,21136,21157,21179,21200,21222,21243,21264,21285,
+ 21306,21328,21349,21372,21394,21416,21432,21453,21469,21490,
+ 21513,21535,21552,21573,21596,21609,21630,21651,21672,21693,
+
+ 21714,21736,21758,21779,21800,21822,21843,21866,21889,21911,
+ 21933,21956,21967,21988,21999,22020,22043,22066,22083,22104,
+ 22121,22142,22165,22181,22202,22223,22245,22267,22288,22310,
+ 22332,22353,22376,22398,22419,22441,22463,22486,22509,22532,
+ 22554,22564,22574,22596,22615,22637,22659,22682,22705,22727,
+ 22749,22772,22794,22815,22836,22859,22882,22905,22928,22950,
+ 22970,22991,23012,23023,23045,23068,23091,23114,23137,23160,
+ 23182,23202,23223,23244,23267,23290,23313,23336,23358,23379,
+ 23401,23424,23446,23467,23488,23509,23532,23555,23578,23601,
+ 23624,23646,23666,23687,23708,23719,23741,23764,23787,23810,
+
+ 23833,23855,23876,23897,23920,23943,23966,23988,24009,24031,
+ 24054,24077,24099,24120,24141,24162,24185,24208,24231,24254,
+ 24276,24297,24318,24329,24351,24374,24397,24419,24440,24461,
+ 24484,24506,24528,24551,24574,24596,24617,24638,24661,24684,
+ 24707,24729,24750,24772,24795,24817,24838,24859,24881,24904,
+ 24927,24949,24971,24993,25014,25036,25058,25079,25100,25120,
+ 25141,25162,25185,25207,25229,25240,25261,25282,25303,25324,
+ 25345,25366,25388,25411,25433,25454,25475,25496,25517,25540,
+ 25563,25586,25609,25632,25654,25675,25696,25716,25737,25758,
+ 25779,25800,25822,25833,25854,25875,25896,25917,25938,25958,
+
+ 25979,26000,26022,26044,26065,26086,26107,26128,26149,26170,
+ 26191,26214,26237,26260,26283,26306,26328,26349,26370,26391,
+ 26413,26435,26457,26478,26499,26521,26542,26564,26585,26606,
+ 26627,26648,26669,26692,26715,26738,26760,26781,26802,26823,
+ 26845,26866,26887,26909,26930,26951,26972,26993,27015,27037,
+ 27058,27079,27100,27122,27133,27154,27176,27197,27219
+ } ;
+
+static yyconst flex_int16_t yy_def[2160] =
+ { 0,
+ 1861, 1861, 1860, 3, 1862, 1862, 1863, 1863, 1860, 9,
+ 1864, 1864, 1865, 1865, 1866, 1866, 1867, 1867, 1868, 1868,
+ 1869, 1869, 2, 2, 2, 2, 1870, 1870, 1871, 1871,
+ 2, 2, 1860, 1860, 1860, 1860, 1860, 1872, 1860, 1873,
+ 1873, 1874, 1860, 1873, 1875, 1860, 1860, 1875, 1876, 1877,
+ 1878, 1879, 1880, 1880, 54, 54, 54, 54, 1881, 1878,
+ 48, 1860, 1860, 61, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 1860, 1860, 1860, 1860, 1872,
+ 1860, 1873, 1873, 1874, 1860, 1860, 1873, 1882, 1882, 1883,
+ 1882, 1860, 1860, 1860, 1860, 80, 1860, 1860, 1860, 1873,
+
+ 1860, 1873, 1873, 1873, 84, 1860, 1873, 1860, 1860, 1860,
+ 1884, 1884, 112, 1860, 112, 1885, 1860, 1860, 1886, 1885,
+ 1886, 1860, 1860, 1860, 1860, 80, 1860, 1873, 1873, 1873,
+ 84, 1860, 1873, 1860, 1860, 1860, 1860, 80, 1860, 1873,
+ 1873, 1873, 84, 1860, 1873, 1887, 1887, 1888, 1887, 1889,
+ 1889, 1890, 1889, 1860, 1860, 1860, 1860, 1891, 1891, 1892,
+ 1893, 1894, 1893, 1860, 1860, 1860, 80, 1860, 80, 1895,
+ 1896, 1873, 1873, 1873, 84, 84, 84, 1860, 1860, 1873,
+ 48, 1860, 48, 1897, 1898, 1899, 1900, 1900, 188, 1901,
+ 1860, 80, 1897, 1902, 80, 1902, 1860, 1860, 1898, 1903,
+
+ 1903, 1903, 1899, 203, 203, 203, 1860, 203, 203, 203,
+ 203, 1860, 1898, 1897, 1904, 203, 1904, 217, 217, 217,
+ 217, 217, 1905, 1905, 224, 48, 1860, 226, 188, 188,
+ 188, 188, 188, 188, 188, 188, 188, 188, 188, 1860,
+ 1860, 1860, 217, 217, 217, 217, 217, 217, 217, 217,
+ 217, 217, 217, 217, 217, 217, 217, 217, 217, 217,
+ 217, 1860, 1860, 1895, 1860, 1906, 1906, 1906, 1907, 1907,
+ 270, 1906, 1860, 1860, 1860, 1860, 1860, 1873, 1873, 1860,
+ 1860, 1860, 1908, 1908, 1909, 1909, 1860, 286, 286, 1860,
+ 286, 1910, 1860, 1911, 1911, 1912, 1910, 1911, 1912, 1873,
+
+ 1860, 1860, 1860, 1873, 1860, 1913, 1913, 1913, 1914, 1914,
+ 310, 1913, 1915, 1915, 1915, 1916, 1916, 317, 1915, 1917,
+ 1918, 1860, 1918, 1919, 1920, 1920, 1919, 1921, 1922, 1922,
+ 330, 1921, 1860, 1895, 1923, 1924, 1873, 1860, 1873, 1860,
+ 1860, 1925, 1925, 343, 343, 1926, 1926, 347, 1927, 1860,
+ 1927, 1928, 1860, 1860, 1929, 1930, 1929, 357, 357, 357,
+ 1929, 361, 361, 357, 1931, 1931, 366, 366, 366, 366,
+ 366, 1932, 1932, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 1860, 1860, 366, 366, 366, 366, 366, 366,
+
+ 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
+ 366, 366, 366, 366, 1860, 1933, 1934, 1935, 1934, 1860,
+ 1860, 1860, 1936, 1860, 1873, 1937, 1938, 1860, 1860, 1938,
+ 430, 1939, 1940, 1873, 1860, 1941, 1942, 1942, 1943, 1943,
+ 1860, 1860, 1944, 1945, 1946, 1947, 1948, 1860, 1860, 1949,
+ 1860, 1860, 343, 343, 343, 343, 1950, 1950, 1951, 1951,
+ 1860, 1860, 1952, 1953, 1953, 465, 465, 465, 465, 465,
+ 366, 366, 1860, 1860, 1954, 366, 366, 366, 366, 1955,
+ 1955, 343, 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343, 343, 343,
+
+ 343, 1860, 1860, 366, 366, 366, 366, 366, 366, 1956,
+ 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
+ 366, 366, 1860, 1860, 1954, 1957, 1958, 1959, 1949, 1960,
+ 1860, 1860, 1860, 1860, 1960, 1961, 1860, 1962, 1962, 539,
+ 1963, 1860, 1860, 1964, 1965, 1966, 1965, 1860, 1967, 1967,
+ 1968, 1969, 1970, 1860, 1964, 1971, 1971, 1972, 1860, 1973,
+ 1973, 561, 1974, 1975, 1976, 1977, 1978, 1860, 1949, 1860,
+ 1860, 1979, 1979, 573, 573, 1980, 1980, 1981, 1981, 1860,
+ 1860, 1982, 1982, 1860, 1982, 1982, 1982, 1983, 1983, 589,
+ 589, 589, 589, 589, 1984, 1984, 1860, 1985, 596, 1860,
+
+ 1860, 1985, 1985, 596, 596, 1986, 1986, 573, 573, 573,
+ 573, 573, 573, 573, 573, 573, 573, 573, 573, 573,
+ 573, 573, 573, 573, 573, 1860, 1860, 596, 596, 596,
+ 596, 596, 1860, 1860, 1985, 1949, 1949, 1987, 1987, 1988,
+ 596, 596, 596, 596, 596, 596, 1860, 1860, 1985, 596,
+ 596, 596, 596, 596, 596, 596, 1860, 1860, 1985, 1989,
+ 1990, 1991, 1949, 1992, 1993, 1993, 1860, 1860, 1860, 1860,
+ 1993, 1860, 1993, 1994, 1994, 675, 675, 1995, 1995, 679,
+ 1860, 1860, 1996, 1997, 1997, 1997, 1998, 1998, 1860, 1860,
+ 1999, 1999, 2000, 2001, 1860, 1996, 1996, 2002, 2002, 1860,
+
+ 2002, 2003, 2003, 703, 2004, 2004, 706, 2005, 2005, 2005,
+ 2006, 2007, 1860, 1860, 1860, 1860, 2008, 2008, 718, 2009,
+ 2009, 2010, 2010, 1860, 1860, 2011, 2012, 2012, 2013, 2013,
+ 2013, 731, 1860, 733, 731, 731, 731, 731, 2014, 2014,
+ 1860, 2015, 740, 1860, 740, 740, 2016, 2016, 718, 718,
+ 718, 718, 718, 718, 718, 718, 718, 718, 718, 718,
+ 718, 718, 718, 718, 718, 718, 1860, 1860, 740, 740,
+ 740, 740, 2017, 2018, 2019, 2017, 776, 776, 776, 2018,
+ 776, 776, 776, 776, 740, 740, 740, 740, 740, 2015,
+ 2015, 740, 740, 740, 740, 2020, 2021, 2021, 1860, 1860,
+
+ 2021, 2021, 2022, 2022, 804, 2023, 2023, 1860, 1860, 2024,
+ 2025, 2026, 2026, 1860, 1860, 2027, 2027, 1860, 1860, 2024,
+ 2024, 2028, 2028, 2029, 2029, 2030, 2030, 2031, 1860, 1860,
+ 1860, 718, 718, 718, 2032, 2032, 2033, 2033, 1860, 1860,
+ 2034, 2034, 2034, 2035, 2034, 2034, 2034, 2034, 2036, 2036,
+ 2037, 850, 1860, 850, 850, 850, 740, 740, 1860, 2015,
+ 740, 740, 740, 2038, 2038, 718, 718, 718, 718, 718,
+ 718, 718, 718, 718, 718, 718, 718, 718, 1860, 1860,
+ 740, 740, 740, 1860, 1860, 2015, 2039, 2039, 888, 888,
+ 2040, 2040, 888, 2041, 888, 888, 888, 888, 888, 740,
+
+ 740, 740, 740, 2015, 2015, 740, 1860, 1860, 2015, 740,
+ 2042, 2042, 1860, 1860, 2042, 2042, 2043, 2043, 918, 1860,
+ 1860, 2024, 2044, 2044, 1860, 1860, 2045, 2045, 1860, 1860,
+ 2024, 2024, 2046, 2046, 2047, 2047, 1860, 1860, 1860, 718,
+ 718, 718, 836, 836, 838, 838, 1860, 1860, 2034, 2034,
+ 850, 850, 2048, 2048, 2037, 2037, 2037, 957, 850, 1860,
+ 850, 850, 850, 740, 740, 1860, 2015, 740, 1860, 1860,
+ 2015, 2015, 865, 865, 718, 718, 718, 718, 718, 718,
+ 718, 718, 718, 1860, 1860, 740, 740, 740, 888, 2040,
+ 2040, 2049, 888, 888, 888, 888, 888, 888, 888, 740,
+
+ 740, 2015, 2015, 740, 1860, 2015, 2042, 2042, 1860, 1860,
+ 2042, 2042, 918, 918, 918, 1860, 1860, 2024, 2044, 2044,
+ 1860, 1860, 928, 928, 1860, 1860, 2024, 2024, 2046, 2046,
+ 936, 936, 1860, 1860, 718, 836, 836, 838, 838, 1860,
+ 2034, 2034, 1860, 2034, 850, 850, 2048, 2048, 2048, 1049,
+ 2048, 2048, 1860, 1860, 957, 957, 957, 1860, 1860, 1860,
+ 961, 850, 850, 961, 740, 740, 1860, 2015, 740, 1860,
+ 1860, 1860, 2015, 865, 865, 718, 718, 718, 718, 718,
+ 718, 1860, 1860, 740, 740, 2040, 2040, 2049, 2049, 2040,
+ 2049, 2049, 2049, 888, 888, 888, 888, 888, 888, 888,
+
+ 1860, 2015, 740, 2015, 2015, 740, 1860, 2015, 2042, 2042,
+ 1860, 1860, 2042, 2042, 918, 918, 918, 918, 1860, 1860,
+ 2044, 2044, 1860, 1860, 2050, 2044, 1860, 1860, 1860, 1860,
+ 2024, 2024, 2046, 2046, 936, 936, 1860, 1860, 718, 836,
+ 836, 838, 838, 1860, 838, 838, 1860, 2034, 2034, 850,
+ 850, 1860, 1860, 1049, 1049, 1049, 1049, 1049, 1860, 1860,
+ 957, 957, 1860, 1860, 850, 1860, 1860, 961, 850, 740,
+ 740, 1860, 2015, 1860, 1860, 2015, 865, 865, 718, 718,
+ 718, 718, 1860, 1860, 2040, 2040, 2051, 2049, 2049, 888,
+ 888, 888, 888, 2040, 2040, 888, 888, 888, 888, 2015,
+
+ 2015, 1860, 2015, 2042, 2042, 1860, 1860, 2042, 2042, 918,
+ 918, 918, 2052, 1860, 2053, 2054, 1860, 2053, 2054, 2050,
+ 1860, 1860, 2024, 2055, 2046, 2046, 936, 936, 1860, 1860,
+ 836, 836, 838, 2034, 2034, 850, 850, 850, 1860, 1860,
+ 1049, 1049, 1049, 1049, 1860, 1860, 957, 957, 961, 1860,
+ 1860, 850, 740, 740, 1860, 2015, 1860, 1860, 1860, 2015,
+ 2015, 865, 865, 865, 865, 2040, 2040, 2049, 2049, 2049,
+ 2051, 2049, 2049, 2049, 2049, 888, 888, 2056, 888, 2040,
+ 888, 888, 888, 2015, 2015, 1860, 2015, 2042, 2042, 1860,
+ 1860, 2042, 2057, 2058, 918, 918, 2059, 2060, 1860, 2061,
+
+ 2062, 1860, 2063, 2064, 2065, 1860, 1860, 2059, 2066, 2059,
+ 2067, 1860, 2068, 2069, 2069, 2070, 2071, 1860, 2072, 2072,
+ 1320, 1320, 2073, 1860, 2074, 1860, 2074, 2075, 1860, 1860,
+ 2076, 2076, 2076, 2076, 1860, 1860, 2077, 1860, 1338, 2077,
+ 1340, 1860, 1860, 2075, 2078, 2078, 1860, 2015, 2015, 2079,
+ 2080, 2080, 2081, 2081, 2082, 2082, 2083, 2083, 2084, 2084,
+ 1360, 1360, 1356, 2080, 1356, 1356, 1356, 2015, 2015, 1860,
+ 2015, 2085, 2086, 1860, 1860, 2086, 2087, 2086, 1860, 2088,
+ 2088, 1381, 1381, 2089, 1860, 2090, 2090, 2091, 2091, 2092,
+ 2092, 2093, 1860, 1860, 2094, 1860, 2095, 2095, 2096, 2096,
+
+ 2097, 2098, 2099, 2098, 1860, 2100, 2100, 1407, 2101, 2102,
+ 2103, 2103, 1860, 2104, 1860, 1860, 2105, 2105, 2105, 1860,
+ 1860, 2105, 2105, 1860, 1860, 2106, 1860, 2106, 1860, 1860,
+ 1860, 2104, 2104, 2107, 2107, 2108, 2109, 1860, 2110, 2110,
+ 2111, 2112, 2113, 2113, 2112, 2113, 2114, 2114, 2115, 2115,
+ 1450, 1450, 1450, 1450, 2112, 2112, 2116, 2116, 1458, 2112,
+ 2112, 2112, 1448, 1448, 1448, 2112, 2112, 1448, 1448, 2110,
+ 2110, 1860, 2110, 2117, 2117, 2118, 1860, 1860, 2117, 2119,
+ 2119, 2120, 2120, 2121, 2122, 1860, 1860, 2123, 2123, 2124,
+ 2125, 1433, 1860, 1860, 2105, 1860, 1860, 2105, 2105, 2105,
+
+ 2105, 1860, 1860, 2106, 1860, 1504, 2126, 2127, 2128, 2129,
+ 2129, 2130, 2131, 1860, 2131, 2131, 2132, 2110, 2133, 2133,
+ 2112, 2134, 2134, 1448, 1448, 2112, 2112, 2135, 2135, 1529,
+ 1529, 1529, 2112, 2112, 2136, 2136, 2112, 2112, 1448, 2112,
+ 2112, 2112, 1448, 1860, 2110, 2110, 1860, 2110, 2137, 2138,
+ 2138, 2121, 1552, 1860, 2125, 1555, 1860, 1860, 1860, 2105,
+ 2105, 2105, 2105, 1860, 1860, 1860, 1860, 1504, 1504, 1860,
+ 2126, 2126, 2127, 1573, 1573, 1860, 1860, 2110, 2128, 2128,
+ 2139, 2140, 2141, 2142, 2142, 2143, 2144, 2144, 2110, 2134,
+ 2134, 1448, 1448, 1448, 2112, 2112, 1529, 1529, 1529, 1529,
+
+ 2112, 2112, 1536, 1536, 2112, 2112, 1448, 1860, 2110, 2137,
+ 1551, 1551, 1860, 1860, 1860, 1563, 1563, 1860, 1860, 1563,
+ 1563, 1860, 1860, 1860, 1860, 2126, 1573, 1573, 2110, 1580,
+ 1860, 2139, 2139, 2140, 1634, 1634, 1860, 1860, 2110, 2141,
+ 2141, 1860, 2142, 2142, 2143, 1645, 1645, 1860, 1860, 2110,
+ 2144, 2144, 2110, 2134, 2112, 2134, 1448, 2112, 2112, 1529,
+ 1529, 1529, 1529, 2112, 2112, 1536, 2112, 2112, 1536, 1536,
+ 2112, 2112, 2112, 1448, 1448, 1860, 1860, 2110, 2137, 1551,
+ 1551, 1860, 1860, 1860, 1860, 1860, 1563, 1860, 1573, 2110,
+ 1860, 2139, 1634, 1634, 2110, 1641, 2142, 1645, 1645, 2144,
+
+ 2110, 1448, 2112, 2112, 1529, 1529, 1529, 2112, 2112, 1529,
+ 1529, 2112, 2112, 1536, 2112, 1536, 2112, 2137, 1551, 1860,
+ 1860, 1860, 2145, 1634, 2110, 2145, 2145, 2146, 2142, 2144,
+ 1860, 2110, 1448, 2112, 2112, 1529, 2112, 2112, 1529, 1529,
+ 1529, 1529, 2112, 2112, 1536, 2112, 1536, 2112, 2137, 2145,
+ 2147, 2147, 2148, 2149, 2145, 2145, 2146, 2150, 2150, 2151,
+ 2151, 2151, 2152, 1860, 2112, 2112, 2112, 1529, 1529, 1529,
+ 1529, 2112, 2112, 2112, 2112, 1536, 1536, 2112, 1860, 2147,
+ 2147, 2148, 1782, 1782, 2153, 2153, 2154, 1860, 1860, 2110,
+ 2150, 2150, 2155, 2156, 2157, 2112, 2112, 1529, 1529, 2112,
+
+ 2112, 1529, 1529, 2112, 2112, 2112, 2112, 1860, 2145, 1782,
+ 1634, 1786, 1786, 2154, 1814, 1814, 1814, 1814, 2110, 2145,
+ 2145, 2146, 2155, 2156, 1824, 1824, 2157, 2112, 2112, 2112,
+ 2112, 1529, 2112, 1860, 2147, 1782, 1634, 1814, 1814, 1860,
+ 2110, 2150, 2112, 2112, 2147, 1782, 1634, 2158, 1814, 2150,
+ 2112, 2112, 2159, 2159, 1814, 1814, 1814, 1854, 1854, 0,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860
+ } ;
+
+static yyconst flex_int16_t yy_nxt[27311] =
+ { 0,
+ 34, 35, 36, 37, 35, 34, 38, 34, 34, 34,
+ 34, 34, 34, 34, 39, 34, 40, 34, 34, 34,
+ 34, 164, 165, 165, 164, 165, 165, 165, 165, 220,
+ 252, 406, 171, 251, 166, 218, 219, 245, 166, 106,
+ 172, 173, 106, 42, 165, 165, 165, 165, 937, 182,
+ 191, 191, 182, 220, 252, 406, 251, 166, 218, 219,
+ 245, 1860, 166, 568, 107, 186, 34, 34, 43, 36,
+ 37, 43, 34, 38, 34, 34, 34, 34, 34, 34,
+ 34, 39, 34, 40, 34, 34, 34, 34, 107, 180,
+ 246, 259, 220, 44, 894, 182, 191, 191, 182, 197,
+
+ 198, 198, 199, 221, 250, 222, 289, 291, 166, 744,
+ 42, 186, 180, 246, 259, 186, 220, 44, 164, 165,
+ 165, 164, 450, 1860, 829, 1860, 221, 250, 222, 289,
+ 291, 166, 337, 34, 34, 45, 46, 47, 48, 34,
+ 49, 34, 34, 34, 50, 50, 34, 34, 39, 50,
+ 51, 52, 34, 34, 34, 53, 54, 55, 54, 56,
+ 54, 57, 54, 54, 54, 54, 54, 54, 54, 54,
+ 58, 54, 54, 54, 54, 54, 54, 59, 60, 53,
+ 54, 55, 54, 56, 54, 57, 54, 54, 54, 54,
+ 54, 54, 54, 58, 54, 54, 54, 54, 54, 54,
+
+ 34, 61, 62, 63, 64, 35, 568, 530, 35, 35,
+ 260, 171, 35, 1860, 261, 165, 165, 165, 165, 172,
+ 173, 65, 337, 66, 322, 67, 68, 69, 166, 70,
+ 41, 530, 71, 260, 41, 171, 72, 261, 73, 74,
+ 75, 569, 568, 172, 173, 65, 1071, 66, 171, 67,
+ 68, 69, 1071, 70, 41, 71, 172, 173, 41, 72,
+ 568, 73, 74, 75, 76, 77, 78, 79, 77, 76,
+ 80, 76, 76, 76, 76, 76, 76, 76, 81, 76,
+ 82, 76, 76, 76, 76, 197, 198, 198, 199, 338,
+ 568, 171, 381, 393, 185, 185, 394, 243, 568, 200,
+
+ 201, 186, 217, 35, 244, 534, 35, 84, 197, 198,
+ 198, 199, 338, 171, 1860, 381, 393, 185, 185, 394,
+ 243, 172, 173, 734, 186, 217, 734, 244, 41, 534,
+ 76, 76, 85, 78, 79, 85, 76, 80, 76, 76,
+ 76, 76, 76, 76, 76, 86, 76, 82, 76, 76,
+ 76, 76, 41, 247, 256, 257, 342, 87, 322, 248,
+ 171, 215, 367, 569, 249, 377, 258, 171, 306, 307,
+ 178, 165, 165, 178, 84, 313, 314, 247, 256, 257,
+ 342, 87, 248, 166, 553, 215, 367, 249, 377, 258,
+ 265, 265, 265, 265, 287, 179, 1860, 76, 34, 35,
+
+ 36, 37, 35, 34, 38, 34, 34, 34, 34, 34,
+ 34, 34, 39, 34, 88, 34, 34, 34, 34, 179,
+ 253, 215, 165, 165, 165, 165, 667, 281, 282, 282,
+ 281, 420, 366, 568, 221, 166, 254, 569, 661, 255,
+ 166, 90, 171, 450, 253, 215, 265, 265, 265, 265,
+ 172, 173, 171, 287, 420, 366, 1860, 221, 1860, 254,
+ 266, 267, 255, 1860, 34, 34, 43, 36, 37, 43,
+ 34, 38, 34, 34, 34, 34, 34, 34, 34, 39,
+ 34, 88, 34, 34, 34, 34, 180, 279, 215, 568,
+ 278, 91, 282, 282, 282, 282, 564, 450, 282, 282,
+
+ 282, 282, 369, 370, 409, 166, 215, 439, 90, 180,
+ 279, 166, 215, 278, 327, 91, 292, 293, 293, 292,
+ 327, 327, 327, 174, 450, 369, 370, 327, 409, 166,
+ 215, 34, 92, 93, 94, 95, 93, 92, 96, 92,
+ 92, 92, 97, 98, 92, 92, 99, 92, 100, 92,
+ 101, 92, 92, 102, 102, 102, 102, 103, 102, 102,
+ 102, 104, 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 105, 102, 102, 102, 102,
+ 102, 103, 102, 102, 102, 104, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102, 92, 34,
+
+ 108, 109, 110, 108, 34, 38, 34, 34, 34, 34,
+ 34, 34, 34, 39, 34, 111, 34, 34, 34, 34,
+ 293, 293, 293, 293, 113, 405, 215, 340, 192, 340,
+ 340, 192, 340, 166, 293, 293, 293, 293, 262, 165,
+ 165, 262, 42, 341, 195, 341, 1541, 166, 113, 405,
+ 215, 263, 1541, 437, 265, 265, 265, 265, 546, 528,
+ 1860, 1860, 1860, 179, 1860, 34, 34, 114, 109, 110,
+ 114, 34, 38, 34, 34, 34, 34, 34, 34, 34,
+ 39, 34, 111, 34, 34, 34, 34, 179, 272, 180,
+ 180, 113, 115, 526, 339, 411, 215, 164, 165, 165,
+
+ 164, 165, 165, 165, 165, 290, 282, 282, 290, 42,
+ 166, 272, 180, 180, 166, 113, 115, 339, 166, 411,
+ 215, 265, 265, 265, 265, 349, 350, 350, 349, 448,
+ 179, 1860, 34, 34, 116, 117, 118, 116, 34, 38,
+ 34, 34, 34, 34, 34, 34, 34, 39, 34, 40,
+ 34, 34, 34, 34, 179, 165, 165, 165, 165, 180,
+ 351, 421, 342, 447, 165, 165, 165, 165, 166, 422,
+ 382, 432, 297, 293, 293, 297, 42, 166, 165, 165,
+ 165, 165, 180, 351, 421, 166, 342, 265, 265, 265,
+ 265, 166, 422, 382, 432, 1860, 1860, 298, 445, 34,
+
+ 34, 120, 117, 118, 120, 34, 38, 34, 34, 34,
+ 34, 34, 34, 34, 39, 34, 40, 34, 34, 34,
+ 34, 298, 300, 304, 435, 342, 121, 1183, 322, 383,
+ 1183, 164, 165, 165, 164, 165, 165, 165, 165, 178,
+ 165, 165, 178, 42, 166, 300, 304, 435, 166, 342,
+ 121, 283, 166, 383, 418, 265, 265, 418, 439, 288,
+ 288, 1860, 1860, 437, 179, 287, 34, 122, 123, 124,
+ 125, 123, 122, 126, 122, 122, 122, 34, 34, 122,
+ 122, 127, 122, 128, 122, 34, 122, 122, 179, 312,
+ 319, 215, 130, 265, 265, 265, 529, 395, 182, 182,
+
+ 182, 182, 197, 198, 198, 199, 178, 165, 165, 178,
+ 131, 166, 312, 319, 186, 215, 130, 428, 186, 166,
+ 428, 395, 663, 663, 663, 663, 532, 532, 532, 532,
+ 429, 179, 416, 122, 122, 132, 124, 125, 132, 122,
+ 126, 122, 122, 122, 34, 34, 122, 122, 127, 122,
+ 128, 122, 34, 122, 122, 179, 342, 342, 340, 130,
+ 133, 340, 182, 191, 191, 182, 344, 376, 345, 197,
+ 198, 198, 197, 438, 341, 166, 372, 131, 186, 372,
+ 342, 342, 569, 130, 133, 186, 171, 415, 356, 344,
+ 376, 345, 373, 1860, 306, 307, 438, 335, 287, 333,
+
+ 122, 134, 135, 136, 137, 135, 134, 138, 134, 134,
+ 134, 34, 34, 134, 134, 139, 134, 140, 134, 34,
+ 134, 134, 198, 198, 198, 198, 142, 197, 198, 198,
+ 199, 197, 198, 198, 199, 440, 215, 1860, 186, 1860,
+ 185, 185, 413, 186, 143, 1860, 352, 186, 171, 170,
+ 142, 1860, 281, 282, 282, 281, 313, 314, 440, 170,
+ 215, 361, 362, 362, 363, 166, 413, 134, 134, 144,
+ 136, 137, 144, 134, 138, 134, 134, 134, 34, 34,
+ 134, 134, 139, 134, 140, 134, 34, 134, 134, 197,
+ 198, 198, 199, 142, 145, 171, 364, 449, 185, 185,
+
+ 215, 215, 414, 200, 201, 186, 197, 198, 198, 199,
+ 400, 143, 1860, 170, 264, 185, 185, 142, 145, 364,
+ 449, 1860, 186, 170, 215, 215, 414, 663, 663, 663,
+ 663, 1860, 170, 400, 134, 34, 35, 36, 37, 35,
+ 34, 38, 34, 34, 34, 34, 34, 34, 34, 39,
+ 34, 146, 34, 34, 34, 34, 212, 198, 198, 212,
+ 212, 198, 198, 213, 215, 215, 215, 1860, 342, 456,
+ 410, 1183, 216, 489, 1183, 368, 216, 371, 148, 1860,
+ 265, 265, 265, 265, 282, 282, 282, 282, 215, 215,
+ 215, 342, 456, 1860, 410, 417, 489, 166, 368, 1860,
+
+ 371, 34, 34, 43, 36, 37, 43, 34, 38, 34,
+ 34, 34, 34, 34, 34, 34, 39, 34, 146, 34,
+ 34, 34, 34, 342, 342, 342, 215, 215, 149, 1860,
+ 374, 215, 215, 441, 391, 482, 441, 375, 392, 403,
+ 342, 390, 396, 402, 404, 148, 442, 342, 342, 342,
+ 215, 215, 149, 374, 1860, 215, 215, 391, 1860, 482,
+ 375, 392, 403, 342, 390, 396, 402, 404, 34, 34,
+ 35, 36, 37, 35, 34, 38, 34, 34, 34, 34,
+ 34, 34, 34, 39, 34, 150, 34, 34, 34, 34,
+ 342, 215, 384, 215, 378, 479, 342, 215, 215, 1860,
+
+ 379, 397, 398, 1860, 502, 380, 344, 401, 385, 407,
+ 340, 386, 152, 340, 342, 215, 384, 215, 378, 479,
+ 342, 215, 215, 379, 397, 398, 341, 502, 380, 344,
+ 401, 385, 407, 1860, 386, 34, 34, 43, 36, 37,
+ 43, 34, 38, 34, 34, 34, 34, 34, 34, 34,
+ 39, 34, 150, 34, 34, 34, 34, 342, 215, 367,
+ 387, 388, 153, 215, 556, 215, 580, 292, 293, 293,
+ 292, 487, 389, 342, 399, 206, 467, 408, 412, 152,
+ 166, 342, 215, 367, 387, 388, 153, 215, 556, 215,
+ 580, 1860, 1860, 1860, 487, 389, 342, 399, 206, 467,
+
+ 408, 412, 34, 34, 35, 154, 155, 35, 34, 38,
+ 34, 34, 34, 156, 157, 34, 34, 39, 34, 40,
+ 34, 34, 34, 34, 265, 265, 265, 265, 484, 485,
+ 171, 503, 1860, 1860, 293, 293, 293, 293, 266, 267,
+ 1860, 1860, 262, 165, 165, 262, 42, 166, 1860, 1860,
+ 457, 484, 485, 457, 503, 263, 265, 265, 265, 265,
+ 1860, 1860, 424, 424, 424, 424, 458, 179, 1860, 34,
+ 34, 43, 154, 155, 43, 34, 38, 34, 34, 34,
+ 156, 157, 34, 34, 39, 34, 40, 34, 34, 34,
+ 34, 179, 419, 1860, 283, 342, 159, 1860, 425, 327,
+
+ 483, 507, 288, 288, 1860, 327, 327, 327, 174, 552,
+ 423, 430, 327, 42, 1183, 419, 428, 1183, 342, 428,
+ 159, 425, 1860, 483, 507, 451, 350, 350, 451, 429,
+ 1339, 1860, 552, 1339, 423, 430, 34, 34, 35, 36,
+ 37, 35, 34, 160, 34, 34, 34, 34, 34, 34,
+ 34, 39, 34, 40, 34, 34, 34, 34, 1860, 1860,
+ 452, 342, 206, 206, 454, 455, 206, 206, 466, 441,
+ 468, 1860, 441, 1860, 626, 434, 436, 476, 215, 1860,
+ 162, 41, 442, 452, 342, 206, 206, 454, 455, 206,
+ 206, 466, 1860, 468, 451, 350, 350, 451, 626, 434,
+
+ 436, 476, 215, 34, 34, 43, 36, 37, 43, 34,
+ 160, 34, 34, 34, 34, 34, 34, 34, 39, 34,
+ 40, 34, 34, 34, 34, 301, 302, 302, 301, 452,
+ 163, 1860, 342, 1860, 491, 206, 206, 469, 166, 470,
+ 342, 490, 581, 302, 302, 302, 302, 162, 41, 303,
+ 1860, 1860, 452, 1860, 163, 342, 166, 491, 206, 206,
+ 469, 1860, 470, 342, 490, 581, 1860, 303, 509, 215,
+ 34, 167, 1860, 303, 167, 167, 168, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 303, 509, 215, 302, 302, 302, 302, 342, 1860,
+
+ 342, 342, 499, 486, 488, 342, 494, 166, 283, 305,
+ 302, 302, 305, 167, 167, 627, 288, 288, 303, 1860,
+ 1860, 342, 166, 342, 342, 499, 486, 488, 342, 494,
+ 1860, 1860, 1860, 303, 179, 682, 167, 175, 431, 627,
+ 175, 175, 303, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 303, 179, 682,
+ 327, 431, 227, 240, 240, 227, 327, 327, 327, 174,
+ 622, 681, 215, 327, 1860, 166, 1860, 1860, 186, 177,
+ 175, 1860, 290, 282, 282, 290, 512, 241, 510, 1860,
+ 1860, 444, 1860, 622, 681, 166, 215, 242, 473, 474,
+
+ 474, 475, 175, 181, 182, 182, 183, 179, 184, 512,
+ 215, 241, 185, 185, 444, 215, 166, 185, 185, 186,
+ 242, 1860, 1860, 215, 227, 240, 240, 227, 477, 188,
+ 1860, 179, 1860, 1860, 215, 1860, 1860, 166, 189, 215,
+ 186, 297, 293, 293, 297, 190, 185, 215, 1860, 241,
+ 1860, 477, 1860, 188, 166, 273, 274, 274, 273, 242,
+ 501, 189, 181, 182, 182, 183, 298, 184, 166, 342,
+ 1860, 185, 185, 241, 215, 166, 185, 185, 186, 275,
+ 1860, 1860, 242, 276, 501, 1860, 1860, 478, 188, 683,
+ 298, 1860, 342, 301, 302, 302, 301, 189, 215, 197,
+
+ 198, 198, 199, 275, 190, 185, 166, 276, 185, 185,
+ 478, 1860, 188, 683, 352, 186, 1860, 303, 1860, 1860,
+ 189, 192, 1860, 768, 192, 167, 193, 167, 167, 167,
+ 167, 167, 194, 194, 194, 167, 194, 195, 167, 194,
+ 167, 303, 493, 274, 274, 274, 274, 768, 1860, 274,
+ 274, 274, 274, 342, 1860, 715, 166, 353, 354, 354,
+ 355, 1860, 166, 167, 194, 1860, 493, 277, 497, 788,
+ 496, 276, 492, 277, 1860, 342, 342, 276, 715, 206,
+ 500, 206, 1860, 342, 342, 342, 167, 203, 204, 204,
+ 205, 277, 497, 788, 496, 276, 492, 277, 342, 215,
+
+ 207, 276, 508, 206, 500, 206, 342, 342, 342, 208,
+ 1860, 209, 511, 210, 809, 215, 265, 265, 265, 265,
+ 1860, 327, 211, 215, 1860, 1860, 508, 327, 327, 327,
+ 174, 417, 1860, 208, 327, 209, 511, 210, 809, 215,
+ 510, 353, 354, 354, 355, 211, 212, 198, 198, 213,
+ 332, 214, 572, 1860, 1860, 185, 185, 214, 214, 214,
+ 202, 342, 216, 206, 214, 206, 353, 354, 354, 355,
+ 342, 342, 504, 332, 495, 357, 572, 215, 302, 302,
+ 302, 302, 217, 1860, 342, 1860, 215, 206, 206, 206,
+ 359, 166, 1860, 342, 342, 1860, 504, 495, 357, 1860,
+
+ 513, 215, 303, 544, 1860, 217, 212, 198, 198, 213,
+ 215, 214, 206, 1860, 359, 185, 185, 214, 214, 214,
+ 202, 1860, 216, 513, 214, 223, 303, 544, 223, 223,
+ 1860, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 498, 215, 1860, 1860, 353,
+ 354, 354, 355, 353, 354, 354, 355, 342, 628, 305,
+ 302, 302, 305, 227, 227, 227, 227, 225, 223, 498,
+ 215, 206, 166, 206, 1860, 206, 166, 206, 215, 186,
+ 342, 628, 358, 303, 179, 1860, 519, 360, 241, 1860,
+ 223, 226, 227, 227, 228, 206, 1860, 206, 242, 206,
+
+ 516, 206, 215, 215, 1860, 358, 1860, 303, 179, 519,
+ 360, 229, 241, 230, 215, 231, 232, 233, 814, 234,
+ 215, 242, 235, 215, 516, 505, 236, 215, 237, 238,
+ 239, 1860, 656, 506, 1860, 229, 1860, 230, 215, 231,
+ 232, 233, 814, 234, 215, 235, 1860, 215, 505, 236,
+ 1860, 237, 238, 239, 167, 656, 506, 167, 167, 168,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 215, 215, 215, 517, 215, 1860,
+ 1860, 515, 215, 575, 1860, 514, 518, 521, 215, 831,
+ 353, 354, 354, 353, 342, 520, 167, 167, 215, 215,
+
+ 215, 517, 215, 207, 515, 1860, 215, 575, 514, 518,
+ 1860, 521, 215, 831, 1860, 1860, 461, 342, 520, 167,
+ 175, 1860, 1860, 175, 175, 462, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+ 461, 215, 523, 524, 524, 525, 591, 206, 462, 1860,
+ 1860, 1860, 206, 1860, 522, 531, 532, 532, 531, 1860,
+ 1860, 594, 177, 175, 716, 215, 685, 215, 533, 685,
+ 591, 206, 554, 554, 554, 554, 206, 522, 1860, 686,
+ 283, 1860, 283, 551, 594, 175, 269, 716, 1860, 269,
+ 269, 215, 269, 269, 269, 269, 269, 269, 269, 269,
+
+ 269, 269, 269, 269, 269, 269, 1860, 555, 227, 240,
+ 240, 227, 273, 274, 274, 273, 288, 215, 1860, 288,
+ 1860, 166, 1860, 1860, 186, 166, 1860, 604, 271, 269,
+ 555, 1860, 839, 241, 1860, 1860, 275, 1860, 1860, 288,
+ 276, 215, 288, 242, 342, 274, 274, 274, 274, 573,
+ 604, 269, 280, 274, 274, 280, 839, 241, 166, 570,
+ 275, 571, 724, 342, 276, 166, 242, 342, 574, 277,
+ 1860, 206, 573, 276, 590, 215, 275, 179, 595, 450,
+ 276, 327, 570, 1860, 571, 724, 342, 327, 327, 327,
+ 174, 574, 1860, 277, 327, 206, 1860, 276, 590, 215,
+
+ 275, 179, 595, 1860, 276, 283, 283, 725, 283, 283,
+ 283, 283, 284, 283, 283, 283, 283, 283, 283, 283,
+ 285, 286, 283, 287, 283, 283, 215, 605, 215, 596,
+ 725, 215, 1860, 206, 629, 451, 350, 350, 451, 1860,
+ 657, 658, 658, 657, 1860, 1860, 592, 1860, 283, 1860,
+ 215, 605, 215, 596, 1860, 215, 216, 206, 629, 1860,
+ 1860, 354, 354, 354, 354, 424, 424, 424, 424, 592,
+ 452, 283, 283, 283, 207, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 461, 1860, 283,
+ 287, 283, 283, 452, 342, 1860, 462, 609, 206, 1860,
+
+ 542, 543, 473, 474, 474, 473, 1860, 1860, 1860, 468,
+ 593, 461, 741, 709, 1860, 283, 709, 342, 216, 462,
+ 609, 1860, 206, 542, 543, 1860, 710, 1860, 353, 354,
+ 354, 355, 468, 593, 1860, 741, 1860, 597, 283, 295,
+ 295, 207, 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295, 295, 210, 1860, 295, 215, 295, 295,
+ 597, 767, 1860, 211, 474, 474, 474, 474, 599, 473,
+ 474, 474, 475, 658, 658, 658, 658, 342, 210, 610,
+ 186, 215, 295, 1860, 767, 216, 211, 1860, 1860, 186,
+ 713, 599, 1860, 713, 1860, 583, 584, 583, 583, 597,
+
+ 342, 1860, 610, 714, 598, 295, 295, 295, 585, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 586, 597, 295, 608, 295, 295, 598, 342, 696,
+ 587, 697, 611, 612, 613, 614, 1860, 342, 342, 342,
+ 799, 299, 617, 342, 618, 586, 342, 342, 608, 295,
+ 1860, 342, 696, 587, 697, 611, 1860, 612, 613, 614,
+ 342, 342, 342, 799, 299, 617, 342, 618, 1860, 342,
+ 342, 1860, 295, 309, 646, 215, 309, 309, 1860, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 1860, 342, 342, 619, 620, 646, 215,
+
+ 615, 616, 342, 342, 800, 621, 342, 342, 623, 353,
+ 354, 354, 355, 674, 805, 311, 309, 342, 342, 1860,
+ 619, 620, 207, 615, 616, 342, 342, 800, 621, 342,
+ 342, 623, 1860, 1860, 1860, 210, 674, 805, 309, 316,
+ 1860, 808, 316, 316, 588, 316, 316, 316, 316, 316,
+ 316, 316, 316, 316, 316, 316, 316, 316, 316, 210,
+ 624, 215, 1860, 342, 808, 215, 215, 588, 625, 342,
+ 630, 600, 601, 601, 602, 1860, 1860, 1860, 631, 632,
+ 603, 318, 316, 1860, 624, 215, 342, 1860, 1860, 215,
+ 215, 625, 342, 630, 1860, 1860, 215, 523, 524, 524,
+
+ 525, 631, 632, 1860, 316, 320, 320, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
+ 215, 215, 320, 322, 320, 320, 215, 644, 215, 1860,
+ 342, 215, 215, 1860, 641, 770, 642, 206, 633, 634,
+ 634, 635, 643, 653, 215, 215, 1860, 731, 320, 569,
+ 215, 644, 215, 342, 569, 215, 215, 641, 770, 642,
+ 463, 206, 569, 215, 645, 643, 1860, 653, 215, 215,
+ 731, 320, 320, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 320, 215, 645, 320,
+ 322, 320, 320, 215, 654, 657, 658, 658, 659, 215,
+
+ 206, 215, 1860, 531, 532, 532, 531, 323, 732, 810,
+ 815, 216, 1860, 1860, 1860, 320, 533, 655, 654, 1324,
+ 1324, 1324, 1324, 215, 206, 215, 554, 554, 554, 554,
+ 323, 732, 810, 815, 647, 648, 648, 649, 320, 167,
+ 655, 1860, 167, 167, 324, 167, 167, 167, 167, 167,
+ 325, 325, 325, 167, 325, 167, 167, 325, 167, 650,
+ 1860, 695, 651, 672, 672, 672, 672, 1860, 676, 652,
+ 677, 704, 685, 674, 702, 685, 633, 634, 634, 635,
+ 537, 167, 325, 650, 695, 686, 651, 633, 634, 634,
+ 633, 676, 652, 677, 704, 1860, 674, 702, 1860, 1860,
+
+ 1860, 215, 1860, 216, 167, 329, 1860, 1860, 329, 329,
+ 1860, 329, 329, 329, 329, 329, 329, 329, 329, 329,
+ 329, 329, 329, 329, 329, 215, 206, 664, 664, 664,
+ 664, 738, 668, 668, 668, 668, 737, 206, 1860, 547,
+ 548, 547, 547, 1860, 537, 820, 1860, 331, 329, 537,
+ 206, 1860, 665, 769, 1860, 738, 287, 669, 215, 737,
+ 821, 206, 666, 548, 548, 548, 548, 670, 820, 541,
+ 329, 203, 204, 204, 205, 687, 665, 769, 688, 1860,
+ 1860, 669, 215, 821, 207, 666, 700, 700, 700, 700,
+ 670, 1860, 215, 208, 743, 209, 1860, 210, 687, 689,
+
+ 879, 688, 690, 559, 215, 1860, 211, 634, 634, 634,
+ 634, 600, 601, 601, 600, 746, 215, 208, 743, 209,
+ 744, 210, 689, 186, 879, 690, 1860, 216, 215, 211,
+ 212, 198, 198, 213, 685, 214, 1860, 685, 746, 185,
+ 185, 214, 214, 214, 185, 1860, 216, 686, 214, 212,
+ 198, 198, 213, 685, 214, 1860, 685, 1860, 185, 185,
+ 214, 214, 214, 185, 215, 216, 811, 214, 212, 198,
+ 198, 213, 745, 343, 1860, 1860, 1860, 185, 601, 601,
+ 601, 601, 1860, 600, 601, 601, 602, 744, 215, 1860,
+ 1860, 1860, 603, 287, 186, 745, 1860, 343, 346, 216,
+
+ 812, 346, 346, 718, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 346, 346, 346, 346, 212, 198,
+ 198, 213, 771, 215, 812, 785, 718, 185, 215, 197,
+ 198, 198, 199, 880, 197, 198, 198, 199, 1860, 1860,
+ 348, 346, 719, 603, 1860, 186, 771, 215, 1860, 785,
+ 186, 1860, 215, 212, 198, 198, 213, 880, 584, 584,
+ 584, 584, 185, 346, 192, 742, 719, 192, 167, 193,
+ 167, 167, 167, 167, 167, 194, 194, 194, 167, 194,
+ 195, 167, 194, 167, 461, 1860, 1860, 1860, 742, 709,
+ 749, 215, 709, 462, 212, 198, 198, 213, 633, 634,
+
+ 634, 635, 710, 185, 249, 1860, 167, 194, 461, 633,
+ 634, 634, 635, 749, 216, 215, 462, 1860, 185, 1860,
+ 1860, 287, 212, 198, 198, 213, 1860, 249, 751, 167,
+ 192, 185, 924, 192, 167, 193, 167, 167, 167, 167,
+ 167, 194, 194, 194, 167, 194, 195, 167, 194, 167,
+ 750, 751, 535, 535, 535, 535, 924, 1860, 557, 557,
+ 557, 557, 212, 198, 198, 213, 786, 1860, 215, 537,
+ 1860, 185, 167, 194, 750, 559, 1860, 665, 583, 584,
+ 583, 583, 757, 698, 1860, 1860, 1860, 671, 215, 1860,
+ 786, 585, 215, 699, 541, 167, 203, 204, 204, 205,
+
+ 563, 665, 1860, 772, 586, 215, 757, 698, 287, 207,
+ 671, 1860, 215, 587, 709, 787, 699, 709, 208, 215,
+ 209, 925, 210, 1860, 813, 251, 772, 710, 586, 215,
+ 1860, 211, 212, 198, 198, 213, 587, 926, 787, 702,
+ 825, 185, 208, 215, 209, 925, 210, 813, 251, 830,
+ 733, 734, 734, 735, 211, 212, 198, 198, 213, 1860,
+ 214, 926, 702, 825, 185, 185, 214, 214, 214, 202,
+ 752, 216, 830, 214, 212, 198, 198, 213, 206, 214,
+ 1860, 1860, 736, 185, 185, 214, 214, 214, 202, 1860,
+ 216, 1860, 214, 752, 215, 1860, 365, 633, 634, 634,
+
+ 635, 709, 206, 795, 709, 736, 212, 198, 198, 213,
+ 212, 198, 198, 213, 828, 185, 1860, 287, 215, 185,
+ 365, 223, 923, 215, 223, 223, 795, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 1860, 793, 1860, 753, 215, 923, 215, 754, 636,
+ 637, 637, 636, 212, 198, 198, 213, 583, 584, 583,
+ 583, 840, 185, 225, 223, 640, 793, 753, 1860, 215,
+ 585, 754, 633, 634, 634, 635, 212, 198, 198, 213,
+ 1860, 185, 1860, 586, 840, 185, 223, 223, 1860, 756,
+ 223, 223, 587, 223, 223, 223, 223, 223, 223, 223,
+
+ 223, 223, 223, 223, 223, 223, 223, 586, 557, 557,
+ 557, 557, 756, 713, 1860, 587, 713, 765, 859, 212,
+ 198, 198, 213, 1860, 1860, 559, 714, 1860, 185, 225,
+ 223, 1860, 1860, 698, 873, 583, 584, 583, 583, 758,
+ 765, 859, 342, 699, 637, 637, 637, 637, 726, 818,
+ 563, 819, 223, 226, 227, 227, 228, 698, 873, 215,
+ 773, 586, 1860, 758, 794, 342, 699, 1860, 1860, 1860,
+ 587, 1860, 818, 229, 819, 230, 215, 231, 232, 233,
+ 932, 234, 852, 215, 235, 586, 792, 794, 236, 255,
+ 237, 238, 239, 587, 674, 206, 1860, 229, 804, 230,
+
+ 215, 231, 232, 233, 932, 234, 852, 235, 1860, 792,
+ 1860, 236, 255, 237, 238, 239, 269, 674, 206, 269,
+ 269, 804, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 866, 1860, 881, 212,
+ 198, 198, 213, 1860, 212, 198, 198, 213, 185, 342,
+ 1860, 1860, 1860, 185, 657, 658, 658, 657, 271, 269,
+ 866, 881, 1860, 759, 212, 198, 198, 213, 1860, 1860,
+ 216, 1860, 342, 185, 212, 198, 198, 213, 1860, 755,
+ 1860, 269, 269, 185, 764, 269, 269, 759, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+
+ 269, 269, 755, 882, 212, 198, 198, 213, 764, 789,
+ 1860, 766, 215, 185, 633, 634, 634, 635, 215, 647,
+ 648, 648, 647, 746, 271, 269, 1860, 882, 763, 633,
+ 634, 634, 635, 789, 766, 216, 215, 1860, 1860, 342,
+ 215, 215, 834, 903, 241, 939, 746, 269, 280, 274,
+ 274, 280, 763, 1860, 242, 215, 876, 672, 672, 672,
+ 672, 166, 342, 1860, 215, 834, 903, 342, 241, 939,
+ 1860, 854, 275, 179, 537, 1860, 276, 242, 685, 215,
+ 876, 685, 658, 658, 658, 658, 657, 658, 658, 659,
+ 342, 811, 206, 798, 913, 854, 275, 179, 186, 855,
+
+ 276, 426, 216, 426, 426, 206, 287, 867, 342, 426,
+ 426, 426, 426, 426, 426, 206, 798, 913, 346, 1860,
+ 1860, 1322, 855, 1860, 672, 672, 672, 672, 206, 1860,
+ 867, 342, 426, 426, 426, 426, 426, 426, 426, 283,
+ 283, 537, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 1860, 427, 283, 287, 283, 283,
+ 856, 1860, 1860, 797, 672, 672, 672, 672, 672, 672,
+ 672, 672, 806, 672, 672, 806, 863, 206, 215, 342,
+ 878, 537, 283, 1860, 856, 537, 797, 1860, 1860, 807,
+ 1860, 700, 700, 700, 700, 1486, 1486, 1486, 1486, 863,
+
+ 206, 215, 342, 878, 914, 283, 283, 283, 559, 283,
+ 283, 283, 283, 284, 283, 283, 283, 283, 283, 283,
+ 283, 285, 286, 283, 287, 283, 283, 914, 920, 1860,
+ 822, 700, 700, 700, 700, 700, 700, 700, 700, 921,
+ 648, 648, 648, 648, 700, 700, 700, 700, 559, 283,
+ 1860, 920, 559, 822, 709, 428, 186, 709, 428, 1860,
+ 1860, 559, 921, 1860, 960, 241, 1860, 828, 429, 1860,
+ 1860, 823, 283, 295, 295, 242, 295, 295, 295, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295, 960, 241,
+ 295, 862, 295, 295, 823, 861, 1860, 215, 242, 922,
+
+ 826, 700, 700, 826, 1860, 1860, 1009, 647, 648, 648,
+ 649, 342, 215, 872, 862, 929, 295, 827, 1860, 861,
+ 215, 1860, 922, 216, 1860, 1860, 733, 734, 734, 735,
+ 1009, 1860, 790, 1860, 342, 215, 872, 1860, 929, 295,
+ 295, 295, 791, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295, 295, 295, 868, 790, 295, 736, 295,
+ 295, 342, 1860, 1860, 382, 791, 342, 206, 869, 342,
+ 197, 198, 198, 199, 1860, 871, 1860, 433, 215, 868,
+ 901, 736, 930, 295, 342, 342, 186, 382, 1860, 342,
+ 206, 869, 342, 1860, 1860, 672, 672, 672, 672, 871,
+
+ 433, 215, 1860, 901, 860, 930, 295, 309, 342, 931,
+ 309, 309, 537, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 860, 883, 801,
+ 938, 802, 931, 1860, 215, 870, 1010, 633, 634, 634,
+ 635, 342, 1860, 353, 354, 354, 355, 947, 1860, 311,
+ 309, 883, 801, 938, 802, 1860, 207, 215, 1860, 870,
+ 1010, 1860, 1860, 1860, 342, 633, 634, 634, 635, 850,
+ 947, 342, 309, 309, 1860, 1860, 309, 309, 211, 309,
+ 309, 309, 309, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 850, 342, 874, 1860, 342, 342, 342,
+
+ 875, 211, 380, 386, 877, 342, 342, 342, 942, 834,
+ 633, 634, 634, 635, 966, 311, 309, 941, 342, 874,
+ 342, 342, 342, 875, 1860, 380, 386, 877, 342, 342,
+ 342, 942, 834, 884, 885, 885, 886, 966, 309, 316,
+ 941, 342, 316, 316, 342, 316, 316, 316, 316, 316,
+ 316, 316, 316, 316, 316, 316, 316, 316, 316, 774,
+ 637, 637, 774, 900, 902, 1860, 906, 342, 215, 910,
+ 1860, 215, 215, 977, 342, 773, 1860, 1860, 1860, 215,
+ 965, 318, 316, 215, 215, 1860, 900, 978, 902, 906,
+ 1860, 215, 1860, 910, 215, 215, 977, 342, 907, 908,
+
+ 908, 909, 215, 965, 316, 316, 215, 215, 316, 316,
+ 978, 316, 316, 316, 316, 316, 316, 316, 316, 316,
+ 316, 316, 316, 316, 316, 197, 198, 198, 199, 672,
+ 672, 672, 672, 197, 198, 198, 199, 215, 342, 342,
+ 1860, 186, 982, 975, 981, 984, 537, 318, 316, 186,
+ 1163, 1163, 1163, 1163, 633, 634, 634, 635, 1860, 1164,
+ 215, 342, 342, 912, 904, 982, 975, 981, 984, 905,
+ 316, 320, 320, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 912, 904, 320, 322,
+ 320, 320, 905, 215, 919, 1860, 206, 940, 672, 672,
+
+ 672, 672, 672, 672, 672, 672, 985, 961, 1860, 342,
+ 674, 206, 1017, 1860, 320, 537, 215, 1860, 919, 537,
+ 206, 940, 1676, 1676, 1676, 1676, 1860, 1860, 1860, 985,
+ 961, 911, 342, 674, 206, 1017, 916, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 320, 1860, 911, 320, 322, 320, 320, 916,
+ 959, 206, 206, 1860, 1016, 672, 672, 672, 672, 1860,
+ 700, 700, 700, 700, 963, 443, 206, 206, 1860, 1860,
+ 1860, 320, 537, 1018, 959, 206, 206, 559, 1016, 1860,
+ 1860, 1860, 600, 601, 601, 602, 1860, 963, 443, 206,
+
+ 206, 603, 915, 933, 320, 167, 1026, 1018, 167, 167,
+ 324, 167, 167, 167, 167, 167, 325, 325, 325, 167,
+ 325, 167, 167, 325, 167, 915, 933, 1860, 976, 206,
+ 1026, 215, 1021, 964, 700, 700, 700, 700, 342, 962,
+ 948, 948, 948, 948, 206, 1860, 1022, 167, 325, 1860,
+ 215, 559, 976, 206, 215, 1021, 1860, 964, 1860, 1860,
+ 1860, 342, 962, 1685, 1686, 1686, 1687, 206, 934, 1022,
+ 167, 167, 853, 215, 167, 167, 324, 167, 167, 167,
+ 167, 167, 325, 325, 325, 167, 325, 167, 167, 325,
+ 167, 934, 342, 1028, 980, 853, 1025, 968, 1860, 979,
+
+ 197, 198, 198, 199, 342, 986, 215, 583, 584, 583,
+ 583, 1027, 215, 167, 325, 342, 186, 1028, 980, 1025,
+ 585, 968, 979, 969, 970, 970, 971, 342, 986, 215,
+ 1860, 1860, 972, 586, 1027, 215, 167, 329, 967, 1040,
+ 329, 329, 587, 329, 329, 329, 329, 329, 329, 329,
+ 329, 329, 329, 329, 329, 329, 329, 586, 1860, 1033,
+ 987, 967, 215, 1040, 1034, 587, 215, 884, 885, 885,
+ 886, 983, 1067, 583, 584, 583, 583, 1039, 1860, 331,
+ 329, 342, 1033, 987, 1860, 215, 585, 1034, 1860, 215,
+ 1860, 907, 908, 908, 909, 983, 1067, 1860, 1860, 586,
+
+ 1039, 342, 329, 329, 342, 1860, 329, 329, 587, 329,
+ 329, 329, 329, 329, 329, 329, 329, 329, 329, 329,
+ 329, 329, 329, 586, 342, 342, 668, 668, 668, 668,
+ 1058, 587, 988, 215, 884, 885, 885, 884, 1069, 633,
+ 634, 634, 635, 537, 1860, 331, 329, 1860, 342, 1860,
+ 216, 669, 1015, 1058, 215, 988, 215, 1676, 1676, 1676,
+ 1676, 670, 1069, 674, 523, 524, 524, 525, 329, 212,
+ 198, 198, 213, 342, 214, 669, 1015, 215, 185, 185,
+ 214, 214, 214, 185, 670, 216, 674, 214, 212, 198,
+ 198, 213, 1860, 214, 1860, 1860, 342, 185, 185, 214,
+
+ 214, 214, 185, 215, 216, 1860, 214, 885, 885, 885,
+ 885, 884, 885, 885, 886, 583, 584, 583, 583, 1082,
+ 1038, 453, 1860, 186, 169, 287, 215, 216, 585, 884,
+ 885, 885, 886, 1750, 1750, 1750, 1750, 1754, 1750, 1750,
+ 1754, 586, 1082, 1038, 453, 346, 1020, 169, 346, 346,
+ 587, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 346, 586, 1000, 1001, 215, 1020,
+ 215, 1860, 215, 587, 1860, 1860, 197, 198, 198, 199,
+ 1083, 953, 954, 954, 955, 1087, 1860, 348, 346, 1000,
+ 1001, 215, 186, 215, 207, 215, 907, 908, 908, 907,
+
+ 1860, 1860, 1860, 1083, 1860, 1860, 1860, 957, 1087, 1002,
+ 346, 346, 216, 1086, 346, 346, 958, 346, 346, 346,
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 957, 1002, 1004, 1035, 287, 1005, 1086, 1860, 958,
+ 197, 198, 198, 199, 342, 347, 1107, 1037, 1860, 1111,
+ 215, 1860, 1019, 348, 346, 1860, 186, 1004, 1035, 1005,
+ 633, 634, 634, 635, 1860, 1860, 1860, 342, 1860, 347,
+ 1107, 1037, 1111, 215, 1003, 1019, 346, 349, 350, 350,
+ 349, 167, 168, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 1003, 1123, 215,
+
+ 908, 908, 908, 908, 956, 347, 1860, 1860, 969, 970,
+ 970, 1070, 351, 342, 1057, 1080, 186, 1071, 1036, 167,
+ 167, 1123, 215, 1860, 216, 1860, 1860, 1860, 956, 347,
+ 600, 601, 601, 602, 1860, 351, 342, 1057, 1080, 603,
+ 1005, 1036, 167, 167, 1860, 1860, 167, 167, 168, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 1005, 342, 907, 908, 908, 909, 1860,
+ 1860, 664, 664, 664, 664, 1065, 215, 459, 1860, 460,
+ 342, 216, 1860, 1860, 1076, 167, 167, 342, 537, 1860,
+ 1860, 224, 891, 892, 892, 893, 665, 1860, 1065, 215,
+
+ 459, 1074, 460, 342, 1860, 1006, 666, 1076, 167, 353,
+ 354, 354, 355, 541, 779, 224, 779, 1860, 1101, 1112,
+ 665, 1102, 207, 1119, 1074, 1124, 1860, 890, 1006, 666,
+ 1066, 891, 892, 892, 893, 210, 1860, 1860, 779, 1860,
+ 779, 464, 465, 1112, 211, 1860, 1860, 1119, 1124, 215,
+ 890, 1077, 342, 779, 1066, 897, 1860, 215, 1860, 210,
+ 891, 892, 892, 893, 464, 465, 890, 211, 361, 362,
+ 362, 363, 215, 1860, 1077, 342, 1860, 779, 1860, 897,
+ 215, 207, 779, 1860, 779, 891, 892, 892, 893, 890,
+ 208, 1120, 209, 1130, 210, 970, 970, 970, 1072, 891,
+
+ 892, 892, 891, 364, 1071, 1860, 779, 779, 779, 779,
+ 1860, 186, 780, 1860, 208, 1120, 209, 1130, 210, 989,
+ 1860, 1129, 1860, 1079, 342, 990, 364, 212, 198, 198,
+ 213, 779, 214, 779, 991, 1860, 185, 185, 214, 214,
+ 214, 202, 989, 216, 1129, 214, 1079, 342, 1860, 990,
+ 892, 892, 892, 892, 471, 1860, 1860, 991, 672, 672,
+ 672, 672, 1147, 780, 969, 970, 970, 971, 1860, 948,
+ 948, 948, 948, 972, 1860, 537, 990, 1860, 471, 212,
+ 198, 198, 213, 287, 214, 991, 1147, 1860, 185, 185,
+ 214, 214, 214, 202, 956, 216, 1011, 214, 342, 1131,
+
+ 990, 853, 1121, 1172, 472, 1860, 1860, 1860, 991, 672,
+ 672, 672, 672, 1860, 969, 970, 970, 971, 956, 1011,
+ 1860, 342, 1131, 972, 853, 1121, 537, 1172, 472, 372,
+ 216, 1007, 372, 223, 1860, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 373, 223, 223, 223, 206,
+ 206, 206, 1860, 342, 206, 1007, 1132, 1078, 1045, 1137,
+ 1063, 1138, 1046, 468, 206, 206, 206, 1064, 206, 206,
+ 1170, 225, 223, 206, 206, 206, 342, 1185, 206, 1132,
+ 1078, 1045, 1137, 1063, 1138, 1046, 468, 206, 206, 206,
+ 1064, 206, 206, 1170, 223, 480, 350, 350, 480, 223,
+
+ 1185, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 1860, 224, 1125, 197, 198,
+ 198, 199, 1860, 197, 198, 198, 1073, 1860, 1860, 1075,
+ 481, 288, 972, 1184, 186, 1085, 215, 225, 223, 186,
+ 224, 1125, 1068, 1860, 633, 634, 634, 635, 523, 524,
+ 524, 525, 1075, 481, 288, 1860, 1860, 1184, 1085, 215,
+ 223, 418, 265, 265, 418, 269, 1068, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 1860, 342, 215, 1206, 891, 892, 892, 893, 891,
+ 892, 892, 893, 672, 672, 672, 672, 672, 672, 672,
+
+ 672, 1860, 1860, 271, 269, 342, 215, 779, 1206, 779,
+ 537, 779, 1081, 779, 537, 1008, 1860, 1860, 1860, 1012,
+ 1860, 1860, 996, 995, 342, 1084, 269, 535, 535, 535,
+ 535, 779, 536, 779, 1860, 779, 1081, 779, 1860, 1008,
+ 215, 174, 174, 1012, 537, 996, 995, 342, 1860, 1084,
+ 1860, 1860, 539, 1207, 1115, 287, 1186, 884, 885, 885,
+ 886, 674, 540, 215, 1860, 891, 892, 892, 893, 541,
+ 174, 700, 700, 700, 700, 1122, 539, 1207, 1115, 1186,
+ 1860, 1860, 1136, 702, 674, 540, 545, 779, 559, 779,
+ 1860, 342, 426, 1029, 426, 426, 1860, 287, 1122, 999,
+
+ 426, 426, 426, 426, 426, 426, 1136, 702, 1860, 1202,
+ 1860, 779, 1860, 779, 342, 1860, 1860, 1029, 633, 634,
+ 634, 635, 999, 426, 426, 426, 426, 426, 426, 426,
+ 283, 283, 1202, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 1860, 427, 283, 287, 283,
+ 283, 1860, 342, 1116, 674, 1103, 1106, 672, 672, 672,
+ 672, 702, 1860, 1171, 215, 1135, 700, 700, 700, 700,
+ 215, 215, 1860, 283, 537, 342, 1116, 674, 1860, 1103,
+ 1106, 1860, 1860, 559, 1860, 702, 1171, 215, 1030, 1135,
+ 1214, 1860, 1860, 215, 215, 1109, 283, 283, 547, 548,
+
+ 547, 547, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 1030, 1214, 283, 287, 283, 283, 1109, 969,
+ 970, 970, 1070, 347, 672, 672, 672, 672, 1071, 1221,
+ 970, 970, 970, 1072, 549, 216, 1860, 550, 1141, 1071,
+ 283, 537, 197, 198, 198, 199, 186, 347, 1174, 1175,
+ 1175, 1176, 1221, 953, 954, 954, 1047, 549, 186, 1113,
+ 550, 1141, 1108, 283, 295, 295, 207, 295, 553, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295, 295, 1049,
+ 1216, 295, 1113, 295, 295, 1222, 1108, 215, 1050, 1051,
+ 954, 954, 1052, 953, 954, 954, 955, 700, 700, 700,
+
+ 700, 1860, 207, 1049, 1216, 1142, 207, 295, 1222, 1860,
+ 215, 1050, 1860, 1860, 559, 1049, 1860, 1860, 169, 957,
+ 733, 734, 734, 735, 1050, 347, 1117, 1860, 958, 1142,
+ 295, 557, 557, 557, 557, 1133, 558, 1140, 674, 1049,
+ 1118, 169, 1860, 957, 206, 174, 174, 1050, 559, 347,
+ 1117, 958, 736, 1139, 1860, 1048, 561, 1229, 1133, 206,
+ 1140, 674, 1048, 1118, 342, 1158, 562, 1860, 206, 197,
+ 198, 198, 1073, 563, 174, 736, 1860, 1139, 972, 1048,
+ 561, 1229, 206, 1223, 1860, 186, 1048, 342, 1158, 562,
+ 320, 320, 320, 320, 565, 320, 320, 320, 320, 320,
+
+ 320, 320, 320, 320, 320, 1860, 1223, 320, 322, 320,
+ 320, 1224, 1779, 1779, 1779, 1779, 1860, 956, 1126, 1127,
+ 1126, 1126, 224, 1860, 1210, 674, 1161, 1053, 1054, 1054,
+ 1055, 1177, 1860, 320, 1224, 1128, 197, 198, 198, 199,
+ 207, 956, 1143, 1144, 1144, 1145, 224, 1210, 674, 1161,
+ 1860, 1146, 186, 957, 1177, 288, 320, 457, 1104, 1860,
+ 457, 346, 958, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 458, 346, 346, 346, 957, 288, 169,
+ 956, 1179, 1104, 206, 1241, 958, 342, 1245, 1860, 1246,
+ 1180, 342, 1162, 1089, 1090, 1089, 1089, 1150, 206, 348,
+
+ 346, 1860, 169, 1860, 956, 1179, 1091, 206, 1241, 342,
+ 582, 1245, 1246, 1180, 342, 1162, 1860, 1860, 1860, 1092,
+ 1150, 206, 346, 576, 350, 350, 576, 346, 1093, 346,
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 1092, 206, 197, 198, 198, 199, 1165,
+ 1860, 1093, 1860, 1101, 198, 198, 1101, 1255, 577, 206,
+ 1860, 186, 1860, 1860, 206, 348, 346, 1105, 206, 216,
+ 1860, 1860, 1860, 1165, 633, 634, 634, 635, 1860, 1860,
+ 1255, 577, 206, 1043, 1043, 1043, 1043, 206, 346, 167,
+ 1860, 1105, 167, 167, 168, 167, 167, 167, 167, 167,
+
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 461,
+ 224, 1860, 1211, 215, 674, 853, 1048, 1860, 462, 633,
+ 634, 634, 635, 1178, 1267, 1243, 578, 672, 672, 672,
+ 672, 167, 167, 461, 224, 1211, 215, 674, 853, 1860,
+ 1048, 462, 1860, 1860, 537, 1860, 1178, 1267, 1243, 578,
+ 1860, 1110, 1860, 342, 167, 167, 1860, 1860, 167, 167,
+ 168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 1110, 342, 1860, 1048, 891,
+ 892, 892, 893, 891, 892, 892, 893, 1290, 1860, 579,
+ 1244, 1860, 672, 672, 672, 672, 1101, 167, 167, 1102,
+
+ 287, 779, 1048, 779, 1181, 779, 1215, 779, 1101, 537,
+ 1290, 1102, 579, 1244, 342, 997, 1114, 1860, 1094, 1860,
+ 167, 353, 354, 354, 355, 779, 1182, 779, 1181, 779,
+ 1215, 779, 1860, 789, 207, 215, 342, 342, 997, 1860,
+ 1114, 1094, 342, 674, 1291, 1213, 589, 210, 1860, 215,
+ 1182, 1247, 700, 700, 700, 700, 211, 789, 215, 342,
+ 1860, 1101, 198, 198, 1102, 342, 674, 1291, 1213, 559,
+ 589, 210, 215, 1860, 1860, 1247, 1134, 216, 1262, 211,
+ 480, 350, 350, 480, 223, 1266, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+
+ 1134, 1151, 1262, 674, 702, 206, 1860, 1212, 1860, 1266,
+ 1166, 1167, 1167, 1168, 1227, 481, 1860, 1860, 1860, 1169,
+ 206, 1860, 225, 223, 1860, 1151, 674, 1286, 702, 206,
+ 1212, 884, 885, 885, 886, 1860, 1860, 1227, 481, 1174,
+ 1175, 1175, 1176, 206, 206, 223, 223, 1860, 1860, 223,
+ 223, 1286, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 702, 206, 1253, 1860,
+ 215, 215, 1294, 342, 674, 1860, 197, 198, 198, 199,
+ 606, 1228, 607, 1126, 1127, 1126, 1126, 1860, 225, 223,
+ 702, 1253, 186, 215, 215, 1294, 342, 674, 1173, 347,
+
+ 1128, 1860, 1860, 606, 1228, 607, 891, 892, 892, 893,
+ 1231, 223, 569, 636, 637, 637, 638, 569, 569, 569,
+ 569, 569, 1173, 347, 569, 569, 569, 1302, 779, 640,
+ 779, 569, 569, 1231, 1096, 1860, 1309, 891, 892, 892,
+ 893, 891, 892, 892, 893, 1860, 1860, 672, 672, 672,
+ 672, 1302, 779, 1307, 779, 569, 1860, 1860, 1096, 779,
+ 1309, 779, 1095, 779, 537, 1097, 1144, 1144, 1144, 1230,
+ 1205, 1127, 1127, 1127, 1127, 1071, 1307, 1860, 569, 672,
+ 672, 672, 672, 779, 673, 779, 1095, 779, 1217, 1097,
+ 673, 673, 673, 174, 1205, 1860, 537, 673, 672, 672,
+
+ 672, 672, 1860, 673, 1860, 891, 892, 892, 893, 673,
+ 673, 673, 174, 1308, 1318, 537, 673, 1126, 1127, 1126,
+ 1126, 1048, 1860, 197, 198, 198, 199, 779, 702, 779,
+ 1860, 1242, 1860, 1860, 1128, 1860, 1308, 675, 1318, 186,
+ 1317, 1860, 1860, 1098, 1860, 1048, 197, 198, 198, 199,
+ 1860, 779, 702, 779, 1242, 1090, 1090, 1090, 1090, 1203,
+ 675, 678, 186, 1317, 678, 678, 1098, 678, 678, 678,
+ 678, 678, 678, 678, 678, 678, 678, 678, 678, 678,
+ 678, 990, 1203, 1330, 1200, 1127, 1127, 1127, 1127, 1335,
+ 991, 1329, 1144, 1144, 1144, 1230, 1333, 672, 672, 672,
+
+ 672, 1071, 1217, 680, 678, 990, 1330, 1200, 1544, 198,
+ 198, 1544, 1335, 991, 537, 1329, 953, 954, 954, 1047,
+ 1333, 1860, 1860, 1860, 186, 1204, 678, 283, 283, 207,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 1049, 347, 283, 287, 283, 283, 702, 1204,
+ 1336, 1050, 691, 1146, 1233, 956, 1860, 1316, 1232, 1146,
+ 1346, 197, 198, 198, 199, 215, 1049, 347, 169, 1248,
+ 283, 1860, 702, 1336, 1050, 1860, 691, 186, 1233, 956,
+ 1316, 1232, 1860, 1346, 1860, 1201, 1860, 169, 215, 1860,
+ 1860, 169, 1248, 283, 283, 283, 1860, 283, 283, 283,
+
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 1201,
+ 169, 283, 287, 283, 283, 1347, 1254, 1860, 1860, 891,
+ 892, 892, 893, 891, 892, 892, 893, 215, 692, 700,
+ 700, 700, 700, 1163, 1163, 1163, 1163, 283, 1860, 1347,
+ 1254, 1100, 1164, 779, 1364, 779, 559, 1199, 1860, 1860,
+ 215, 692, 1226, 1219, 1219, 1219, 1219, 1860, 1860, 1860,
+ 283, 700, 700, 700, 700, 1100, 701, 779, 1364, 779,
+ 1217, 1199, 701, 701, 701, 174, 1226, 1860, 559, 701,
+ 700, 700, 700, 700, 1860, 701, 206, 891, 892, 892,
+ 893, 701, 701, 701, 174, 1860, 874, 559, 701, 1860,
+
+ 1238, 206, 1249, 206, 1048, 1860, 1860, 342, 571, 779,
+ 206, 779, 700, 700, 700, 700, 1332, 1860, 206, 703,
+ 874, 674, 1296, 1238, 206, 1099, 1249, 206, 1048, 559,
+ 342, 571, 1860, 779, 1860, 779, 1860, 1860, 1860, 1332,
+ 1225, 206, 703, 705, 674, 1296, 705, 705, 1099, 705,
+ 705, 705, 705, 705, 705, 705, 705, 705, 705, 705,
+ 705, 705, 705, 347, 1225, 1319, 1152, 1153, 1153, 1154,
+ 1860, 672, 672, 672, 672, 197, 198, 198, 199, 1860,
+ 1051, 954, 954, 1052, 1351, 707, 705, 347, 537, 1319,
+ 1860, 186, 1155, 207, 1143, 1144, 1144, 1145, 1860, 1101,
+
+ 1860, 1156, 1102, 1146, 1860, 1208, 1049, 1351, 705, 212,
+ 198, 198, 213, 1256, 214, 1050, 1155, 1345, 185, 185,
+ 214, 214, 214, 185, 1156, 216, 1860, 214, 1208, 1860,
+ 1049, 169, 215, 342, 1374, 1048, 1256, 1860, 1050, 1860,
+ 1860, 1345, 1295, 1860, 1331, 717, 1860, 1860, 1860, 1143,
+ 1144, 1144, 1145, 674, 169, 215, 342, 1374, 1146, 1048,
+ 1370, 948, 948, 948, 948, 1860, 1295, 1331, 717, 600,
+ 601, 601, 602, 1860, 214, 1860, 674, 1860, 603, 185,
+ 214, 214, 214, 185, 1370, 216, 169, 214, 576, 350,
+ 350, 576, 346, 853, 346, 346, 346, 346, 346, 346,
+
+ 346, 346, 346, 346, 346, 346, 346, 346, 1393, 169,
+ 1394, 1219, 1219, 1219, 1219, 1860, 853, 1257, 1175, 1175,
+ 1257, 1860, 1860, 577, 1051, 954, 954, 1052, 1217, 1860,
+ 348, 346, 1393, 216, 1394, 1860, 1860, 207, 1144, 1144,
+ 1144, 1230, 1166, 1167, 1167, 1168, 577, 1071, 1860, 1860,
+ 1049, 1169, 1258, 346, 346, 1860, 1860, 346, 346, 1050,
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 1049, 1258, 206, 956, 1350, 224,
+ 1860, 1375, 1050, 672, 672, 672, 672, 1860, 720, 1337,
+ 721, 1779, 1779, 1779, 1779, 1860, 348, 346, 1860, 206,
+
+ 537, 956, 1350, 224, 1375, 1860, 1860, 1323, 1324, 1324,
+ 1323, 720, 1337, 721, 633, 634, 634, 635, 1236, 346,
+ 167, 1237, 1289, 167, 167, 168, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 208, 1860, 206, 1860, 169, 1289, 1048, 1860, 342, 1259,
+ 1175, 1175, 1259, 1395, 1860, 1415, 1416, 206, 722, 1860,
+ 1334, 1860, 167, 167, 208, 186, 206, 169, 1860, 1860,
+ 1048, 342, 1677, 634, 634, 1677, 1860, 1395, 1415, 1416,
+ 206, 722, 1424, 1334, 1258, 167, 167, 1860, 186, 167,
+ 167, 168, 167, 167, 167, 167, 167, 167, 167, 167,
+
+ 167, 167, 167, 167, 167, 167, 1424, 1258, 723, 1053,
+ 1054, 1054, 1053, 1054, 1054, 1054, 1054, 1265, 891, 892,
+ 892, 893, 207, 1265, 1252, 1438, 207, 1425, 167, 167,
+ 1169, 1860, 723, 1442, 1458, 1159, 1860, 1860, 224, 1159,
+ 779, 1860, 779, 1860, 1160, 206, 1191, 1860, 1160, 1438,
+ 1425, 167, 583, 584, 583, 583, 1459, 1442, 1458, 1159,
+ 206, 1460, 224, 1159, 779, 585, 779, 1160, 1860, 206,
+ 1191, 1160, 1059, 1060, 1060, 1059, 727, 1472, 586, 1459,
+ 1478, 1164, 1383, 206, 1460, 207, 555, 587, 1860, 1860,
+ 1060, 1060, 1060, 1060, 674, 1860, 1860, 1860, 461, 1164,
+
+ 727, 1472, 586, 207, 1478, 1860, 1383, 462, 1860, 555,
+ 587, 583, 584, 583, 583, 1494, 461, 674, 884, 885,
+ 885, 886, 461, 1487, 585, 462, 1263, 1144, 1144, 1264,
+ 462, 891, 892, 892, 893, 1265, 1480, 586, 1494, 674,
+ 461, 1089, 1090, 1089, 1089, 728, 587, 1487, 462, 1860,
+ 224, 1860, 342, 779, 1091, 779, 1493, 1505, 582, 1480,
+ 1860, 586, 674, 1502, 1860, 1190, 1521, 1092, 728, 587,
+ 353, 354, 354, 355, 224, 342, 1093, 779, 1860, 779,
+ 1493, 1505, 1531, 207, 704, 1481, 1502, 702, 1190, 674,
+ 1521, 1092, 672, 672, 672, 672, 210, 1860, 1860, 1093,
+
+ 1089, 1090, 1089, 1089, 729, 211, 1531, 704, 1481, 537,
+ 702, 1532, 674, 1091, 1860, 1860, 779, 582, 1860, 1860,
+ 210, 891, 892, 892, 893, 1292, 1092, 729, 211, 353,
+ 354, 354, 355, 1547, 1532, 1093, 1089, 1090, 1089, 1089,
+ 779, 1384, 207, 779, 1564, 779, 1860, 695, 1292, 1187,
+ 1092, 1360, 674, 582, 1536, 210, 1547, 730, 1093, 1192,
+ 1465, 1601, 1092, 1860, 211, 1384, 1860, 779, 1564, 779,
+ 695, 1093, 779, 1557, 1360, 674, 1860, 1536, 1860, 210,
+ 1565, 730, 1192, 1608, 1465, 1601, 1092, 211, 212, 198,
+ 198, 213, 1614, 214, 1093, 779, 1557, 185, 185, 214,
+
+ 214, 214, 202, 1565, 216, 1615, 214, 1608, 891, 892,
+ 892, 893, 1257, 1175, 1175, 1260, 1614, 197, 198, 198,
+ 199, 1860, 583, 584, 583, 583, 739, 1860, 216, 1615,
+ 779, 1860, 779, 186, 1236, 585, 1860, 1237, 1860, 1152,
+ 1153, 1153, 1152, 1860, 1193, 1284, 1860, 1261, 586, 739,
+ 212, 198, 198, 213, 779, 214, 779, 1235, 206, 185,
+ 185, 214, 214, 214, 202, 1239, 216, 1193, 214, 1284,
+ 1261, 1602, 586, 206, 1240, 1613, 740, 1860, 1622, 1658,
+ 1235, 1860, 206, 197, 198, 198, 199, 1860, 1860, 1239,
+ 1352, 1352, 1352, 1352, 1602, 1860, 206, 1240, 1613, 186,
+
+ 740, 223, 1622, 1658, 223, 223, 1285, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 1860, 1280, 1659, 1664, 700, 700, 700, 700, 1860,
+ 1285, 672, 672, 672, 672, 581, 1665, 571, 747, 1450,
+ 1860, 1860, 559, 225, 223, 1280, 1659, 1664, 537, 1598,
+ 1860, 1860, 672, 672, 672, 672, 1860, 1860, 581, 1665,
+ 571, 747, 1860, 1450, 1315, 1288, 223, 223, 1860, 537,
+ 223, 223, 1598, 223, 223, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 1315, 1288, 1293,
+ 779, 1194, 1195, 1195, 1196, 891, 892, 892, 893, 1684,
+
+ 1860, 748, 1860, 672, 672, 672, 672, 1860, 1594, 225,
+ 223, 1860, 1293, 779, 779, 779, 1860, 779, 1860, 779,
+ 537, 1543, 1684, 1197, 748, 779, 1205, 1469, 1539, 1860,
+ 1198, 1594, 223, 647, 648, 648, 649, 779, 779, 779,
+ 1209, 779, 185, 779, 1860, 1860, 1197, 1860, 1860, 779,
+ 1205, 1860, 1539, 1198, 1662, 1682, 1860, 1683, 760, 1860,
+ 1860, 761, 779, 1209, 197, 198, 198, 199, 762, 700,
+ 700, 700, 700, 1860, 1537, 1537, 1537, 1537, 1662, 1682,
+ 186, 1683, 760, 1538, 1371, 761, 559, 1153, 1153, 1153,
+ 1153, 762, 569, 636, 637, 637, 638, 569, 569, 569,
+
+ 569, 569, 1860, 1314, 569, 569, 569, 1860, 1371, 640,
+ 206, 569, 569, 1239, 1328, 1450, 1306, 1306, 1306, 1306,
+ 779, 1860, 1240, 1048, 1599, 206, 1314, 1703, 1657, 891,
+ 892, 892, 893, 1217, 206, 569, 1860, 1239, 1328, 1450,
+ 1342, 1343, 1343, 1344, 779, 1240, 1048, 1599, 206, 206,
+ 1703, 779, 1657, 779, 1750, 1750, 1750, 1750, 569, 569,
+ 774, 637, 637, 775, 569, 569, 569, 569, 569, 1704,
+ 1278, 569, 569, 569, 206, 779, 773, 779, 569, 569,
+ 1680, 1297, 1297, 1297, 1297, 1688, 1166, 1167, 1167, 1250,
+ 674, 1713, 1704, 1278, 1860, 1071, 1753, 206, 1299, 207,
+
+ 1860, 1860, 569, 1860, 1680, 1310, 1310, 1310, 1310, 1688,
+ 1311, 1860, 461, 674, 1713, 1320, 1144, 1144, 1321, 174,
+ 174, 462, 1312, 1301, 1322, 569, 569, 776, 777, 777,
+ 778, 569, 569, 569, 569, 569, 461, 347, 569, 569,
+ 780, 1720, 1860, 569, 462, 569, 569, 1301, 174, 781,
+ 1860, 782, 1860, 783, 1194, 1195, 1195, 1196, 1860, 1689,
+ 1236, 347, 784, 1237, 1720, 1537, 1537, 1537, 1537, 569,
+ 1860, 1860, 1860, 781, 1538, 782, 779, 783, 779, 1263,
+ 1144, 1144, 1264, 1689, 206, 784, 1197, 1860, 1265, 1860,
+ 1860, 1860, 569, 672, 672, 672, 672, 1860, 673, 206,
+
+ 779, 1860, 779, 224, 673, 673, 673, 174, 206, 1197,
+ 537, 673, 672, 672, 672, 672, 1860, 673, 197, 198,
+ 198, 199, 206, 673, 673, 673, 174, 224, 1735, 537,
+ 673, 1743, 1860, 1860, 186, 1623, 1623, 1623, 1623, 1167,
+ 1167, 1167, 1251, 1748, 1624, 803, 1287, 1592, 1071, 1860,
+ 1593, 1735, 207, 1860, 1743, 1257, 1175, 1175, 1257, 1860,
+ 1860, 1413, 1324, 1324, 1413, 461, 1748, 779, 803, 678,
+ 1287, 216, 678, 678, 462, 678, 678, 678, 678, 678,
+ 678, 678, 678, 678, 678, 678, 678, 678, 678, 461,
+ 1258, 779, 1305, 1306, 1305, 1305, 1258, 462, 1860, 1860,
+
+ 1860, 1259, 1175, 1175, 1259, 1166, 1167, 1167, 1250, 1128,
+ 1765, 680, 678, 1258, 1071, 1860, 1860, 186, 207, 1258,
+ 1860, 197, 198, 198, 199, 1413, 1324, 1324, 1413, 1860,
+ 1860, 461, 1579, 1765, 678, 678, 1258, 186, 678, 678,
+ 462, 678, 678, 678, 678, 678, 678, 678, 678, 678,
+ 678, 678, 678, 678, 678, 461, 1579, 1349, 1252, 1258,
+ 1258, 1705, 1712, 462, 1169, 1860, 1722, 1724, 197, 198,
+ 198, 199, 1306, 1306, 1306, 1306, 1860, 680, 678, 206,
+ 1349, 1860, 1543, 1258, 186, 1705, 1712, 1860, 1469, 1217,
+ 1722, 1724, 1348, 1860, 206, 1352, 1352, 1352, 1352, 779,
+
+ 678, 283, 283, 206, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 1348, 206, 283, 287,
+ 283, 283, 1734, 779, 816, 1860, 1666, 1280, 1360, 1450,
+ 1860, 1257, 1175, 1175, 1260, 672, 672, 672, 672, 1860,
+ 1860, 1600, 1773, 1860, 283, 1860, 1734, 216, 816, 1666,
+ 1280, 1360, 537, 1450, 1466, 1467, 1467, 1468, 1860, 1338,
+ 1339, 1339, 1340, 1469, 1600, 1773, 1261, 283, 283, 283,
+ 1860, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 956, 1746, 283, 287, 283, 283, 1261,
+ 779, 1341, 1860, 891, 892, 892, 893, 817, 1450, 1385,
+
+ 1385, 1385, 1385, 1263, 1144, 1144, 1264, 956, 1746, 1860,
+ 1661, 283, 1265, 779, 1341, 779, 1299, 779, 1770, 1277,
+ 1450, 817, 1450, 1623, 1623, 1623, 1623, 224, 1310, 1310,
+ 1310, 1310, 1624, 1661, 283, 700, 700, 700, 700, 779,
+ 701, 779, 1770, 1277, 1450, 1312, 701, 701, 701, 174,
+ 1772, 224, 559, 701, 700, 700, 700, 700, 1860, 701,
+ 891, 892, 892, 893, 1860, 701, 701, 701, 174, 1778,
+ 1301, 559, 701, 1360, 1772, 197, 198, 198, 199, 1860,
+ 1860, 1796, 779, 1860, 779, 1860, 1860, 824, 1279, 1860,
+ 1860, 186, 1860, 1778, 1860, 1860, 1360, 197, 198, 198,
+
+ 199, 1194, 1195, 1195, 1196, 1796, 779, 1450, 779, 1368,
+ 824, 705, 1279, 186, 705, 705, 1660, 705, 705, 705,
+ 705, 705, 705, 705, 705, 705, 705, 705, 705, 705,
+ 705, 1450, 1368, 1197, 1829, 1860, 1369, 779, 1833, 1660,
+ 1860, 672, 672, 672, 672, 1714, 1797, 1804, 1807, 1396,
+ 1396, 1396, 1396, 707, 705, 1360, 1197, 1829, 537, 1369,
+ 779, 1833, 672, 672, 672, 672, 1312, 1860, 1860, 1714,
+ 1797, 1804, 1807, 1860, 1372, 1860, 705, 705, 1360, 537,
+ 705, 705, 1860, 705, 705, 705, 705, 705, 705, 705,
+ 705, 705, 705, 705, 705, 705, 705, 1372, 1373, 1310,
+
+ 1310, 1310, 1310, 891, 892, 892, 893, 700, 700, 700,
+ 700, 700, 700, 700, 700, 1860, 1312, 1860, 1860, 707,
+ 705, 1373, 1860, 1281, 559, 779, 1860, 779, 559, 1860,
+ 1053, 1054, 1054, 1055, 1860, 1860, 891, 892, 892, 893,
+ 1401, 1301, 705, 212, 198, 198, 213, 1281, 214, 779,
+ 1428, 779, 185, 185, 214, 214, 214, 185, 779, 216,
+ 779, 214, 956, 1401, 1828, 891, 892, 892, 893, 1834,
+ 1282, 832, 1860, 1860, 1428, 1860, 1860, 672, 672, 672,
+ 672, 1844, 779, 1860, 779, 956, 1860, 779, 1828, 779,
+ 1860, 1450, 1834, 1282, 537, 832, 212, 198, 198, 213,
+
+ 1479, 214, 1283, 1860, 1844, 185, 185, 214, 214, 214,
+ 185, 779, 216, 779, 214, 1450, 700, 700, 700, 700,
+ 1809, 1809, 1809, 1809, 1479, 1283, 672, 672, 672, 672,
+ 833, 1860, 1860, 559, 1377, 1377, 1377, 1377, 1513, 1513,
+ 1513, 1513, 1860, 537, 1860, 1503, 1503, 1503, 1503, 1860,
+ 1376, 1379, 1402, 833, 346, 1514, 1860, 346, 346, 1860,
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 1376, 1402, 541, 1427, 197, 198,
+ 198, 199, 1515, 1516, 1516, 1517, 1860, 197, 198, 198,
+ 199, 835, 1860, 1860, 186, 1860, 348, 346, 186, 1514,
+
+ 1427, 1439, 1860, 186, 1860, 1403, 1403, 1403, 1403, 1570,
+ 1570, 1570, 1570, 1860, 835, 1152, 1153, 1153, 1154, 346,
+ 346, 1440, 1405, 346, 346, 1439, 346, 346, 346, 346,
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 1681, 1155, 1860, 1572, 1440, 1860, 1860, 563, 1860, 1087,
+ 1156, 1717, 674, 1418, 836, 197, 198, 198, 199, 1860,
+ 1860, 1860, 348, 346, 1681, 1155, 1572, 1477, 1477, 1477,
+ 1477, 186, 1087, 1156, 1717, 674, 1418, 836, 1860, 1860,
+ 1152, 1153, 1153, 1154, 537, 346, 167, 1860, 1470, 167,
+ 167, 168, 167, 167, 167, 167, 167, 167, 167, 167,
+
+ 167, 167, 167, 167, 167, 167, 1155, 1434, 1435, 1435,
+ 1434, 1470, 1719, 1716, 1860, 1156, 1419, 1544, 198, 198,
+ 1545, 837, 674, 216, 1544, 198, 198, 1545, 167, 167,
+ 1155, 1360, 1860, 186, 1860, 1860, 1719, 1716, 1156, 1419,
+ 186, 1860, 1860, 1860, 837, 674, 1860, 1860, 1860, 1508,
+ 1860, 167, 167, 1860, 1360, 167, 167, 168, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 1167, 1167, 1167, 1251, 838, 1326, 1326, 1326,
+ 1326, 1071, 1117, 1860, 1592, 207, 1164, 1593, 1089, 1090,
+ 1089, 1089, 1846, 674, 167, 167, 1860, 1860, 461, 1860,
+
+ 838, 1091, 1450, 461, 779, 582, 1117, 462, 1477, 1477,
+ 1477, 1477, 462, 1771, 1092, 1846, 674, 167, 842, 843,
+ 842, 842, 461, 1093, 582, 537, 1450, 461, 779, 582,
+ 462, 844, 1847, 669, 1860, 462, 1771, 582, 1092, 1089,
+ 1090, 1089, 1089, 670, 845, 1860, 1093, 1860, 891, 892,
+ 892, 893, 1091, 846, 1860, 1847, 582, 669, 1089, 1090,
+ 1089, 1089, 1860, 1860, 1860, 1092, 670, 1860, 845, 1860,
+ 779, 1091, 1355, 1860, 1093, 582, 846, 583, 584, 583,
+ 583, 1860, 1860, 1860, 1092, 672, 672, 672, 672, 1092,
+ 585, 1450, 1860, 1093, 779, 1741, 1355, 1093, 891, 892,
+
+ 892, 893, 537, 586, 891, 892, 892, 893, 1092, 1860,
+ 847, 1860, 587, 1860, 1860, 1450, 1093, 1742, 1860, 1741,
+ 1363, 1450, 779, 1860, 797, 1860, 779, 586, 897, 891,
+ 892, 892, 893, 847, 1860, 587, 583, 584, 583, 583,
+ 1860, 1742, 1860, 1356, 1363, 1450, 779, 797, 1860, 585,
+ 779, 779, 897, 779, 891, 892, 892, 893, 197, 198,
+ 198, 199, 586, 1860, 1365, 1860, 1356, 1570, 1570, 1570,
+ 1570, 587, 848, 1860, 186, 779, 779, 779, 779, 1473,
+ 1325, 1326, 1325, 1325, 1860, 1860, 586, 1365, 1860, 1327,
+ 1860, 1367, 1860, 585, 587, 848, 353, 354, 354, 355,
+
+ 779, 1625, 779, 1473, 1860, 1860, 586, 1860, 1860, 207,
+ 583, 584, 583, 583, 1367, 587, 1152, 1153, 1153, 1154,
+ 1860, 1860, 210, 585, 1625, 197, 198, 198, 199, 849,
+ 586, 211, 468, 1860, 1860, 1860, 586, 1860, 587, 1450,
+ 1417, 186, 1155, 1768, 1860, 587, 210, 1558, 1558, 1558,
+ 1558, 1156, 849, 1860, 211, 468, 353, 354, 354, 355,
+ 586, 1471, 1860, 1450, 1417, 1860, 1155, 1768, 587, 207,
+ 1435, 1435, 1435, 1435, 1156, 1420, 1421, 1421, 1422, 1559,
+ 1860, 1860, 210, 1860, 1471, 1450, 186, 672, 672, 672,
+ 672, 211, 1429, 1343, 1343, 1429, 1799, 851, 1860, 1860,
+
+ 1860, 1155, 1559, 1860, 537, 207, 210, 1423, 1860, 1450,
+ 1156, 1476, 1508, 779, 211, 1860, 1860, 1860, 461, 1799,
+ 851, 733, 734, 734, 733, 1155, 1733, 1430, 1747, 1860,
+ 1423, 1360, 1860, 1156, 207, 1476, 1860, 779, 672, 672,
+ 672, 672, 461, 1486, 1486, 1486, 1486, 461, 1860, 1733,
+ 1430, 1747, 1860, 853, 1360, 537, 462, 1860, 1860, 1860,
+ 1431, 1343, 1343, 1431, 1554, 1860, 1860, 1605, 1606, 1606,
+ 1607, 461, 1860, 207, 798, 1860, 853, 1860, 1860, 462,
+ 212, 198, 198, 213, 1860, 214, 461, 779, 1554, 185,
+ 185, 214, 214, 214, 202, 1430, 216, 798, 214, 1860,
+
+ 1429, 1343, 1343, 1432, 857, 1860, 1434, 1435, 1435, 1436,
+ 461, 779, 1860, 207, 1860, 185, 185, 1860, 1430, 1860,
+ 185, 1860, 216, 1860, 1860, 1450, 210, 1860, 857, 212,
+ 198, 198, 213, 1860, 214, 1433, 1860, 1707, 185, 185,
+ 214, 214, 214, 202, 1860, 216, 1860, 214, 1508, 1450,
+ 210, 1860, 1860, 1461, 1462, 1462, 1463, 1860, 1433, 1860,
+ 1707, 674, 1464, 1860, 1118, 1860, 1860, 1860, 858, 700,
+ 700, 700, 700, 779, 1466, 1467, 1467, 1468, 1860, 1461,
+ 1462, 1462, 1463, 1469, 674, 1860, 559, 1118, 1464, 1860,
+ 1860, 858, 223, 1490, 779, 223, 223, 779, 223, 223,
+
+ 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 223, 1860, 989, 1860, 779, 1860, 1490, 779, 1860,
+ 1642, 1642, 1642, 1642, 1721, 1721, 1721, 1721, 1860, 1860,
+ 864, 1860, 1860, 1624, 225, 223, 989, 1514, 779, 197,
+ 198, 198, 199, 700, 700, 700, 700, 1810, 1779, 1779,
+ 1810, 1860, 1860, 864, 1860, 186, 1860, 223, 223, 1860,
+ 559, 223, 223, 1546, 223, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 223, 1860, 823,
+ 865, 672, 672, 672, 672, 1860, 1860, 1546, 1860, 197,
+ 198, 198, 199, 1544, 198, 198, 1545, 1860, 537, 1860,
+
+ 225, 223, 823, 1860, 865, 186, 1860, 1860, 1860, 186,
+ 1860, 1518, 1839, 1840, 1840, 1839, 1549, 1860, 1745, 1152,
+ 1153, 1153, 1154, 223, 569, 887, 888, 888, 889, 569,
+ 569, 569, 569, 569, 1360, 1518, 569, 569, 780, 1549,
+ 1860, 569, 1745, 569, 569, 1155, 1450, 781, 1769, 782,
+ 1860, 783, 1450, 1860, 1156, 1495, 1860, 1360, 1736, 1860,
+ 890, 1860, 700, 700, 700, 700, 1860, 569, 1860, 1155,
+ 1450, 781, 1769, 782, 1860, 783, 1450, 1156, 1495, 559,
+ 1860, 1736, 1860, 890, 1860, 1860, 1496, 1497, 1497, 1498,
+ 569, 569, 774, 637, 637, 775, 569, 569, 569, 569,
+
+ 569, 822, 1860, 569, 569, 569, 1860, 1860, 773, 1860,
+ 569, 569, 1155, 1860, 197, 198, 198, 199, 1499, 1860,
+ 1860, 1156, 1860, 1860, 822, 1860, 197, 198, 198, 199,
+ 186, 1860, 1860, 1860, 569, 1860, 1155, 1503, 1503, 1503,
+ 1503, 1499, 186, 1860, 1156, 1548, 1570, 1570, 1570, 1570,
+ 1589, 1779, 1779, 1779, 1779, 1860, 1860, 569, 569, 776,
+ 777, 777, 778, 569, 569, 569, 569, 569, 1548, 1427,
+ 569, 569, 780, 1860, 1589, 569, 1450, 569, 569, 1860,
+ 1572, 781, 1798, 782, 1450, 783, 1152, 1153, 1153, 1154,
+ 1663, 1860, 1427, 1860, 784, 1860, 1152, 1153, 1153, 1154,
+
+ 1450, 569, 1860, 1572, 1860, 781, 1798, 782, 1450, 783,
+ 1860, 1860, 1155, 1663, 1500, 1860, 1860, 784, 1860, 1860,
+ 1860, 1156, 1155, 1860, 569, 891, 892, 892, 893, 1860,
+ 1860, 1563, 1510, 1511, 1511, 1510, 1155, 1860, 1500, 1860,
+ 1420, 1421, 1421, 1420, 1156, 1860, 1155, 779, 216, 779,
+ 1642, 1642, 1642, 1642, 1563, 1627, 1570, 1570, 1627, 895,
+ 890, 1511, 1511, 1511, 1511, 1860, 1239, 1514, 1860, 1860,
+ 1860, 779, 1427, 779, 1582, 1240, 1860, 186, 1421, 1421,
+ 1421, 1421, 895, 890, 891, 892, 892, 893, 1860, 1628,
+ 1239, 1860, 1860, 1236, 1860, 1427, 1237, 1860, 1240, 1420,
+
+ 1421, 1421, 1422, 1582, 1239, 1860, 779, 1860, 779, 1860,
+ 1427, 1860, 1628, 1240, 1860, 208, 1860, 896, 1860, 890,
+ 1860, 1352, 1352, 1352, 1352, 1155, 1860, 206, 1239, 206,
+ 779, 1423, 779, 1427, 1156, 1860, 1240, 1860, 1860, 208,
+ 896, 1860, 890, 891, 892, 892, 893, 1860, 1860, 1155,
+ 206, 1860, 206, 1280, 1423, 1860, 779, 1156, 1860, 1860,
+ 1860, 1726, 1727, 1727, 1728, 779, 1860, 779, 1860, 1860,
+ 1702, 1860, 1152, 1153, 1153, 1154, 1280, 898, 890, 899,
+ 779, 1860, 1053, 1054, 1054, 1055, 1640, 1860, 1860, 779,
+ 1860, 779, 1501, 1702, 1860, 207, 1860, 1860, 1155, 1860,
+
+ 898, 890, 899, 647, 648, 648, 649, 1156, 957, 1860,
+ 1640, 1860, 1513, 1513, 1513, 1513, 1501, 1506, 1515, 1516,
+ 1516, 1515, 1155, 1429, 1343, 1343, 1429, 1450, 650, 1514,
+ 1156, 651, 957, 1585, 186, 1514, 207, 1860, 652, 1585,
+ 1506, 1706, 215, 1860, 1860, 1642, 1642, 1642, 1642, 461,
+ 1860, 1450, 650, 1860, 1586, 651, 1860, 1585, 1430, 1860,
+ 1586, 652, 1514, 1585, 1706, 215, 672, 672, 672, 672,
+ 1860, 673, 1860, 461, 1860, 1860, 1860, 673, 673, 673,
+ 174, 1430, 1860, 537, 673, 1860, 1860, 1860, 917, 1576,
+ 1577, 1577, 1578, 1860, 1431, 1343, 1343, 1431, 185, 185,
+
+ 1860, 346, 1860, 1860, 346, 186, 1860, 207, 1429, 1343,
+ 1343, 1432, 917, 672, 672, 672, 672, 1860, 673, 1592,
+ 461, 207, 1593, 1580, 673, 673, 673, 174, 1860, 1430,
+ 537, 673, 1860, 1860, 210, 1860, 347, 721, 1860, 779,
+ 1860, 781, 1860, 1433, 461, 1860, 1580, 1698, 1642, 1642,
+ 1698, 918, 1430, 1721, 1721, 1721, 1721, 1860, 210, 347,
+ 721, 1860, 1624, 779, 1699, 781, 1433, 1860, 1860, 1445,
+ 1445, 1445, 1445, 1860, 918, 806, 672, 672, 806, 678,
+ 1860, 678, 678, 678, 678, 678, 678, 678, 678, 678,
+ 678, 678, 807, 678, 678, 990, 1805, 1805, 1805, 1805,
+
+ 1860, 1280, 1860, 1860, 991, 1806, 1805, 1805, 1805, 1805,
+ 1860, 1152, 1153, 1153, 1154, 1806, 1860, 680, 678, 990,
+ 1510, 1511, 1511, 1512, 1280, 1860, 1860, 991, 1860, 185,
+ 185, 1860, 1860, 1860, 185, 1860, 216, 1155, 1860, 1560,
+ 678, 678, 1860, 1860, 678, 678, 1156, 678, 678, 678,
+ 678, 678, 678, 678, 678, 678, 678, 678, 678, 678,
+ 678, 1155, 1582, 1560, 1648, 1649, 1649, 1650, 1860, 1156,
+ 1860, 1860, 1860, 185, 185, 1677, 634, 634, 1678, 1860,
+ 186, 1514, 1860, 680, 678, 1731, 970, 970, 1764, 1860,
+ 1860, 186, 1860, 1860, 1071, 1860, 1453, 1358, 1358, 1454,
+
+ 1860, 186, 1496, 1497, 1497, 1496, 678, 283, 283, 780,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 1451, 1860, 283, 287, 283, 283, 1239, 779,
+ 1860, 1452, 1860, 1860, 1559, 1860, 1860, 1240, 1631, 1631,
+ 1631, 1631, 927, 989, 1860, 899, 1451, 1860, 1860, 1860,
+ 283, 1860, 1239, 779, 1452, 1860, 1860, 1559, 1860, 1860,
+ 1240, 1843, 1843, 1843, 1843, 927, 989, 1860, 899, 1860,
+ 1806, 1860, 1633, 283, 283, 283, 1860, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 1860,
+ 1860, 283, 287, 283, 283, 1633, 1860, 1860, 1453, 1358,
+
+ 1358, 1454, 1558, 1558, 1558, 1558, 1860, 1566, 1567, 1567,
+ 1568, 780, 1860, 928, 1860, 1860, 1569, 283, 1698, 1642,
+ 1642, 1698, 1860, 1860, 1451, 1455, 1456, 1456, 1455, 1053,
+ 1054, 1054, 1055, 1452, 1559, 1699, 928, 1860, 780, 956,
+ 283, 700, 700, 700, 700, 1860, 701, 1860, 1451, 1860,
+ 1860, 1533, 701, 701, 701, 174, 1452, 1559, 559, 701,
+ 1534, 956, 956, 935, 1566, 1567, 1567, 1568, 1456, 1456,
+ 1456, 1456, 1860, 1569, 1860, 1533, 1788, 1789, 1789, 1790,
+ 1860, 780, 1860, 1534, 956, 185, 185, 935, 700, 700,
+ 700, 700, 186, 701, 1533, 1860, 956, 1860, 1057, 701,
+
+ 701, 701, 174, 1534, 1860, 559, 701, 1860, 1860, 1860,
+ 936, 1648, 1649, 1649, 1648, 1860, 1860, 1860, 1533, 956,
+ 1860, 1057, 1839, 1840, 1840, 1839, 1534, 186, 1514, 1526,
+ 1527, 1527, 1526, 1860, 936, 826, 700, 700, 826, 705,
+ 1860, 705, 705, 705, 705, 705, 705, 705, 705, 705,
+ 705, 705, 827, 705, 705, 1595, 1860, 1860, 1860, 1649,
+ 1649, 1649, 1649, 1860, 1596, 1576, 1577, 1577, 1576, 1860,
+ 1860, 1461, 1462, 1462, 1461, 186, 1514, 707, 705, 1595,
+ 1538, 186, 1860, 1860, 780, 1860, 1860, 1596, 1860, 1779,
+ 1779, 1779, 1779, 1503, 1503, 1503, 1503, 990, 1860, 1625,
+
+ 705, 705, 1860, 1860, 705, 705, 991, 705, 705, 705,
+ 705, 705, 705, 705, 705, 705, 705, 705, 705, 705,
+ 705, 990, 1625, 1860, 1860, 1427, 1845, 1860, 1860, 991,
+ 1860, 1577, 1577, 1577, 1577, 1860, 1860, 1462, 1462, 1462,
+ 1462, 1860, 1860, 707, 705, 1860, 1538, 186, 1427, 1845,
+ 780, 1860, 197, 198, 198, 199, 1860, 1860, 1667, 1668,
+ 1668, 1669, 1860, 990, 1860, 1625, 705, 346, 186, 1860,
+ 346, 346, 991, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 346, 346, 346, 990, 1625, 1653,
+ 1670, 1648, 1649, 1649, 1650, 991, 1360, 1860, 1860, 1860,
+
+ 1570, 1570, 1570, 1570, 1860, 943, 1860, 186, 1514, 348,
+ 346, 1860, 1653, 1670, 1516, 1516, 1516, 1516, 1860, 1360,
+ 1152, 1153, 1153, 1154, 1627, 1570, 1570, 1627, 943, 1048,
+ 186, 1514, 346, 346, 1572, 1585, 346, 346, 1860, 346,
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 1860, 1048, 944, 1586, 1572, 1628, 1585,
+ 1860, 1760, 1760, 1760, 1760, 1860, 1576, 1577, 1577, 1578,
+ 1860, 1843, 1843, 1843, 1843, 348, 346, 1048, 1514, 944,
+ 1806, 1628, 186, 1860, 1860, 1860, 1860, 1631, 1631, 1631,
+ 1631, 1860, 1860, 1497, 1497, 1497, 1497, 1860, 346, 167,
+
+ 1629, 1860, 167, 167, 168, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 1239,
+ 1860, 1691, 1860, 1629, 1860, 1559, 1860, 1860, 1240, 1648,
+ 1649, 1649, 1650, 945, 1860, 1860, 1860, 1860, 185, 185,
+ 1860, 167, 167, 1239, 1691, 186, 1514, 1860, 1559, 1860,
+ 1860, 1240, 1851, 1851, 1851, 1852, 945, 1774, 1775, 1775,
+ 1776, 1541, 1860, 1860, 167, 167, 1777, 1860, 167, 167,
+ 168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 1466, 1467, 1467, 1540, 1527,
+ 1527, 1527, 1527, 1860, 1541, 1360, 1860, 1860, 780, 1860,
+
+ 1860, 1860, 946, 1467, 1467, 1467, 1542, 167, 167, 1860,
+ 1860, 990, 1541, 1860, 1860, 1595, 780, 1860, 1360, 1860,
+ 991, 1860, 1860, 1860, 1596, 946, 1860, 1860, 1860, 990,
+ 167, 842, 843, 842, 842, 990, 1860, 582, 991, 1595,
+ 1860, 1860, 582, 991, 844, 1860, 1860, 1596, 1860, 1860,
+ 582, 1860, 1860, 990, 1860, 1860, 1860, 845, 1860, 1860,
+ 1860, 991, 1477, 1477, 1477, 1477, 846, 1860, 1860, 1496,
+ 1497, 1497, 1498, 1152, 1153, 1153, 1154, 1860, 1860, 537,
+ 1860, 845, 1860, 1152, 1153, 1153, 1154, 669, 1860, 846,
+ 583, 584, 583, 583, 1860, 1155, 1860, 670, 1860, 1155,
+
+ 1860, 1499, 1860, 585, 1156, 1562, 1860, 1860, 1617, 1155,
+ 1860, 669, 1860, 1860, 727, 1860, 586, 1860, 1156, 1155,
+ 670, 1860, 1860, 1155, 1499, 587, 1860, 1156, 1860, 1562,
+ 1860, 1617, 1860, 1155, 1631, 1631, 1631, 1631, 727, 1860,
+ 586, 1156, 1860, 1152, 1153, 1153, 1154, 1860, 587, 583,
+ 584, 583, 583, 1860, 1089, 1090, 1089, 1089, 1860, 1860,
+ 1860, 1860, 585, 1561, 1860, 1860, 1860, 1091, 1633, 1155,
+ 1860, 582, 1860, 1860, 1592, 586, 1860, 1593, 1156, 1860,
+ 1092, 1860, 1860, 728, 587, 1860, 1860, 1561, 1860, 1591,
+ 1860, 1633, 1860, 1155, 779, 1860, 781, 1860, 1860, 586,
+
+ 1860, 1156, 1860, 1860, 1092, 1860, 728, 587, 583, 584,
+ 583, 583, 1591, 1466, 1467, 1467, 1540, 1860, 779, 1860,
+ 781, 585, 1541, 1860, 1860, 1860, 780, 1467, 1467, 1467,
+ 1542, 1860, 949, 1860, 586, 1860, 1541, 1860, 1860, 990,
+ 780, 1860, 1860, 587, 1642, 1642, 1642, 1642, 991, 1693,
+ 1631, 1631, 1693, 990, 1860, 1860, 949, 1860, 586, 1860,
+ 1860, 1514, 991, 990, 1860, 1860, 587, 583, 584, 583,
+ 583, 991, 197, 198, 198, 199, 1860, 990, 1644, 1860,
+ 585, 1860, 1860, 1694, 1860, 991, 1860, 1860, 186, 1860,
+ 1860, 1860, 1860, 586, 1860, 1860, 1609, 1860, 1860, 1860,
+
+ 1860, 1644, 587, 1860, 1860, 950, 1694, 1860, 1860, 672,
+ 672, 672, 672, 1152, 1153, 1153, 1154, 586, 1860, 1860,
+ 1609, 197, 198, 198, 199, 587, 537, 1860, 950, 353,
+ 354, 354, 355, 1860, 1860, 1616, 1860, 186, 1860, 1155,
+ 1860, 1860, 207, 801, 1860, 1610, 1690, 1860, 1156, 1420,
+ 1421, 1421, 1422, 951, 1860, 210, 1860, 1860, 1860, 1616,
+ 1860, 1860, 1860, 1155, 211, 1860, 801, 1860, 1610, 1860,
+ 1690, 1156, 1860, 1860, 1860, 1155, 1860, 951, 1860, 210,
+ 1860, 1423, 1860, 1860, 1156, 1860, 1860, 211, 353, 354,
+ 354, 355, 1570, 1570, 1570, 1570, 1860, 1860, 1860, 1155,
+
+ 1860, 207, 1860, 1860, 1423, 1860, 1860, 1156, 1677, 634,
+ 634, 1678, 359, 1860, 210, 1860, 1860, 1626, 1860, 1576,
+ 1577, 1577, 1578, 211, 186, 1860, 1572, 952, 185, 185,
+ 1860, 197, 198, 198, 199, 186, 359, 1860, 210, 1860,
+ 1860, 1626, 1558, 1558, 1558, 1558, 211, 186, 1860, 1572,
+ 952, 223, 1860, 1580, 223, 223, 1860, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 1860, 1860, 1860, 1559, 1860, 1580, 1860, 1860, 1860,
+ 1860, 672, 672, 672, 672, 1860, 973, 1566, 1567, 1567,
+ 1566, 1860, 1860, 225, 223, 1860, 1624, 1559, 537, 1860,
+
+ 207, 1860, 197, 198, 198, 199, 1860, 1860, 1860, 973,
+ 1860, 1860, 1860, 1159, 1860, 1679, 223, 223, 186, 1860,
+ 223, 223, 1160, 223, 223, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 1159, 1679, 1701,
+ 1860, 974, 1860, 1860, 1860, 1160, 1860, 672, 672, 672,
+ 672, 1860, 1860, 1860, 1567, 1567, 1567, 1567, 1860, 225,
+ 223, 1860, 1701, 1624, 537, 974, 1860, 207, 1860, 1718,
+ 1671, 1606, 1606, 1674, 1642, 1642, 1642, 1642, 1860, 1860,
+ 1159, 1860, 223, 647, 648, 648, 649, 1860, 1860, 1160,
+ 779, 1514, 1860, 1718, 1860, 1860, 1860, 1697, 1860, 1860,
+
+ 1637, 1638, 1638, 1639, 1159, 1675, 1860, 1860, 760, 185,
+ 185, 761, 1160, 1860, 779, 1860, 186, 342, 762, 1860,
+ 1860, 1697, 1860, 1860, 1685, 1686, 1686, 1687, 1675, 1860,
+ 1860, 1860, 760, 1860, 1641, 761, 1642, 1642, 1642, 1642,
+ 342, 762, 569, 887, 888, 888, 889, 569, 569, 569,
+ 569, 569, 1860, 1514, 569, 569, 780, 1641, 1048, 569,
+ 1860, 569, 569, 1860, 1860, 781, 1860, 782, 1860, 783,
+ 1648, 1649, 1649, 1650, 1860, 1860, 1860, 1729, 890, 185,
+ 185, 1048, 1860, 1860, 1860, 569, 186, 1514, 1860, 781,
+ 1860, 782, 1860, 783, 1860, 1860, 1723, 1723, 1723, 1723,
+
+ 1729, 890, 1860, 1860, 1652, 1860, 1860, 1860, 569, 569,
+ 887, 888, 888, 889, 569, 569, 569, 569, 569, 1860,
+ 1860, 569, 569, 780, 1860, 1860, 569, 1652, 569, 569,
+ 1633, 1860, 781, 1860, 782, 1860, 783, 1671, 1606, 1606,
+ 1671, 1744, 1744, 1744, 1744, 890, 1755, 1756, 1756, 1755,
+ 780, 1860, 569, 1633, 1860, 1860, 781, 1860, 782, 1860,
+ 783, 1860, 186, 990, 1860, 1860, 1860, 1860, 890, 1860,
+ 1860, 1860, 1672, 1715, 1860, 569, 891, 892, 892, 893,
+ 1673, 1606, 1606, 1673, 1860, 1860, 1860, 990, 1753, 1637,
+ 1638, 1638, 1637, 780, 1860, 1672, 1715, 1860, 779, 1860,
+
+ 779, 1755, 1756, 1756, 1757, 186, 990, 1860, 993, 994,
+ 1496, 1497, 1497, 1498, 1860, 1672, 1860, 186, 1860, 1048,
+ 1860, 1860, 779, 1691, 779, 1631, 1631, 1631, 1631, 1860,
+ 990, 993, 994, 891, 892, 892, 893, 1860, 1672, 1860,
+ 1860, 1860, 1499, 1860, 1048, 1860, 1691, 1860, 1860, 1860,
+ 1692, 1618, 1619, 1619, 1618, 779, 1860, 779, 1860, 1633,
+ 1624, 1860, 1860, 1860, 1860, 1499, 1860, 1048, 1860, 997,
+ 998, 1860, 1860, 1860, 1692, 1860, 1860, 1239, 1860, 779,
+ 1860, 779, 1633, 1860, 1860, 1860, 1240, 1638, 1638, 1638,
+ 1638, 1860, 997, 998, 672, 672, 672, 672, 1860, 673,
+
+ 1860, 1239, 1860, 186, 1860, 673, 673, 673, 174, 1240,
+ 1860, 537, 673, 1619, 1619, 1619, 1619, 1708, 1709, 1709,
+ 1710, 1691, 1624, 1860, 1860, 1860, 1637, 1638, 1638, 1639,
+ 1860, 1860, 1013, 1860, 1756, 1756, 1756, 1756, 1860, 1239,
+ 1860, 1450, 186, 1860, 1691, 1860, 1860, 1860, 1240, 1711,
+ 186, 1860, 1860, 1860, 1860, 1013, 672, 672, 672, 672,
+ 1695, 673, 1860, 1239, 1860, 1450, 1860, 673, 673, 673,
+ 174, 1240, 1711, 537, 673, 1860, 1753, 1860, 1860, 1637,
+ 1638, 1638, 1639, 1695, 1648, 1649, 1649, 1650, 185, 185,
+ 1860, 1014, 1860, 185, 185, 186, 1693, 1631, 1631, 1693,
+
+ 186, 1514, 1860, 1723, 1723, 1723, 1723, 1700, 1667, 1668,
+ 1668, 1669, 1860, 1641, 1014, 283, 283, 1860, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 1694, 1700, 283, 287, 283, 283, 1641, 1752, 1860, 1860,
+ 1670, 1860, 1860, 1860, 1860, 1753, 1360, 1860, 1731, 970,
+ 970, 1732, 1023, 1694, 1860, 1860, 1860, 972, 283, 1860,
+ 1752, 1860, 1860, 1670, 186, 1860, 1860, 1860, 1860, 1360,
+ 1860, 1655, 1655, 1655, 1655, 1023, 1860, 1860, 1860, 1860,
+ 1538, 283, 283, 283, 1860, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 990, 1860, 283,
+
+ 287, 283, 283, 1860, 1860, 1860, 991, 1685, 1686, 1686,
+ 1685, 672, 672, 672, 672, 1860, 1624, 1860, 1860, 1860,
+ 1024, 990, 1860, 1860, 1860, 283, 1860, 1860, 537, 991,
+ 1860, 1860, 1860, 1239, 1860, 1749, 1760, 1760, 1760, 1760,
+ 1860, 1860, 1240, 1024, 1671, 1606, 1606, 1674, 283, 700,
+ 700, 700, 700, 1514, 701, 1860, 1860, 1239, 1860, 1749,
+ 701, 701, 701, 174, 779, 1240, 559, 701, 1089, 1090,
+ 1089, 1089, 1766, 1766, 1766, 1766, 1860, 1860, 1794, 1675,
+ 1860, 1091, 1860, 1860, 1860, 582, 1860, 1031, 779, 1860,
+ 197, 198, 198, 199, 1092, 1671, 1606, 1606, 1671, 1860,
+
+ 1860, 1860, 1675, 1093, 1767, 1860, 186, 1860, 780, 1860,
+ 1031, 700, 700, 700, 700, 1725, 701, 1860, 1092, 1860,
+ 1860, 990, 701, 701, 701, 174, 1093, 1767, 559, 701,
+ 1672, 1673, 1606, 1606, 1673, 1032, 1860, 1860, 1860, 1725,
+ 1726, 1727, 1727, 1726, 780, 990, 1860, 1860, 1860, 1686,
+ 1686, 1686, 1686, 1672, 1860, 1860, 186, 990, 1624, 1032,
+ 583, 584, 583, 583, 1860, 1860, 1672, 1860, 1860, 1737,
+ 1738, 1738, 1739, 585, 1752, 1239, 1744, 1744, 1744, 1744,
+ 1860, 990, 1753, 1860, 1240, 1860, 586, 1860, 1860, 1672,
+ 1860, 1860, 1860, 1450, 1860, 587, 1041, 1752, 1860, 1239,
+
+ 1860, 1740, 1779, 1779, 1779, 1779, 1860, 1240, 1715, 1860,
+ 586, 1860, 1860, 1708, 1709, 1709, 1708, 1450, 587, 1041,
+ 1042, 1043, 1042, 1042, 1740, 1648, 1649, 1649, 1650, 1860,
+ 1808, 1715, 1860, 585, 185, 185, 1860, 1860, 1860, 1595,
+ 1860, 186, 1514, 1860, 1860, 1715, 586, 1860, 1596, 1860,
+ 1860, 1860, 1044, 1860, 1808, 587, 1860, 1860, 1709, 1709,
+ 1709, 1709, 1860, 1595, 1860, 1860, 1730, 1860, 1715, 1860,
+ 586, 1596, 1860, 1860, 1860, 1044, 1860, 1860, 587, 1053,
+ 1054, 1054, 1055, 1860, 1595, 1860, 1860, 1860, 1860, 1730,
+ 1715, 1860, 207, 1596, 1708, 1709, 1709, 1710, 1766, 1766,
+
+ 1766, 1766, 1860, 1056, 1860, 957, 1860, 1860, 1595, 1727,
+ 1727, 1727, 1727, 1715, 958, 1860, 1596, 1860, 1450, 1731,
+ 970, 970, 1732, 1860, 1860, 186, 1711, 1056, 972, 957,
+ 1767, 672, 672, 672, 672, 186, 1860, 958, 1059, 1060,
+ 1060, 1061, 1450, 1752, 1860, 1860, 1860, 1062, 537, 1711,
+ 1860, 1753, 1860, 1767, 1761, 1762, 1762, 1763, 1737, 1738,
+ 1738, 1737, 206, 185, 185, 1860, 1752, 1860, 1209, 1860,
+ 186, 1514, 360, 1737, 1738, 1738, 1739, 206, 1860, 1860,
+ 1738, 1738, 1738, 1738, 1595, 1860, 206, 1860, 1860, 1860,
+ 1767, 1209, 1860, 1596, 1860, 360, 1860, 1450, 1860, 1860,
+
+ 206, 583, 584, 583, 583, 1740, 1595, 1860, 1595, 1860,
+ 1860, 1860, 1767, 1767, 585, 1596, 1596, 1667, 1668, 1668,
+ 1669, 1450, 1779, 1779, 1779, 1779, 1860, 586, 1740, 1148,
+ 1595, 1851, 1851, 1851, 1852, 1767, 587, 1860, 1596, 1860,
+ 1541, 1774, 1775, 1775, 1776, 1860, 1860, 1781, 1860, 1670,
+ 1777, 586, 1860, 1148, 1860, 1360, 1860, 1860, 1860, 587,
+ 1042, 1043, 1042, 1042, 1860, 1860, 1860, 1755, 1756, 1756,
+ 1757, 1781, 1670, 585, 1860, 1459, 185, 185, 1360, 1360,
+ 1860, 185, 1860, 186, 1860, 1860, 586, 1788, 1789, 1789,
+ 1790, 1860, 1044, 1860, 1860, 587, 185, 185, 1459, 1860,
+
+ 1860, 1860, 1360, 186, 1860, 1809, 1809, 1809, 1809, 1753,
+ 586, 1860, 1792, 1860, 1860, 1044, 1860, 1860, 587, 583,
+ 584, 583, 583, 1860, 1761, 1762, 1762, 1761, 1731, 970,
+ 970, 1764, 585, 1835, 1860, 1860, 1792, 1071, 1860, 1149,
+ 186, 1514, 1860, 1860, 186, 586, 1860, 1753, 1762, 1762,
+ 1762, 1762, 1860, 1860, 587, 1860, 1860, 1835, 1761, 1762,
+ 1762, 1763, 1860, 1149, 186, 1514, 1794, 185, 185, 586,
+ 1860, 1860, 185, 1860, 186, 1514, 1860, 587, 1152, 1153,
+ 1153, 1154, 1860, 1860, 1860, 1860, 1708, 1709, 1709, 1710,
+ 1794, 1860, 1851, 1851, 1851, 1852, 1800, 1801, 1801, 1802,
+
+ 1794, 1541, 1157, 1860, 1155, 1803, 1788, 1789, 1789, 1790,
+ 1450, 1860, 1860, 1156, 1860, 185, 185, 1860, 1711, 1860,
+ 1450, 1860, 186, 1860, 1860, 1860, 1157, 1860, 1155, 1860,
+ 1598, 1860, 1860, 1860, 1450, 1860, 1156, 1089, 1090, 1089,
+ 1089, 1711, 1860, 1860, 1450, 1860, 1800, 1801, 1801, 1802,
+ 1091, 1860, 1860, 1598, 582, 1803, 1774, 1775, 1775, 1774,
+ 1860, 1188, 1860, 1092, 1860, 1806, 1860, 1860, 1860, 780,
+ 1450, 1860, 1093, 1860, 1860, 1775, 1775, 1775, 1775, 1860,
+ 1860, 1860, 1533, 1860, 1806, 1188, 1860, 1092, 780, 1860,
+ 1860, 1534, 1860, 1860, 1450, 1093, 1089, 1090, 1089, 1089,
+
+ 1860, 1533, 1820, 1821, 1821, 1822, 1533, 1860, 1860, 1091,
+ 1534, 185, 185, 582, 1534, 1860, 1860, 1860, 186, 1860,
+ 1860, 1860, 1092, 1860, 1860, 1533, 197, 198, 198, 199,
+ 1189, 1093, 1860, 1534, 1860, 185, 185, 1815, 1860, 1860,
+ 1815, 1860, 186, 1860, 1860, 1860, 1092, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1189, 1093, 283, 1218, 1219, 1218, 1218,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 288, 1816, 283, 1128, 283, 283, 1788, 1789, 1789, 1788,
+ 1789, 1789, 1789, 1789, 1788, 1789, 1789, 1790, 1860, 1860,
+ 1860, 1860, 186, 1860, 1816, 1860, 186, 1860, 283, 1860,
+
+ 186, 1860, 1860, 1860, 1808, 1860, 1860, 1860, 1808, 1860,
+ 1860, 1860, 1819, 1860, 1737, 1738, 1738, 1739, 1860, 1860,
+ 1860, 283, 583, 584, 583, 583, 1860, 1860, 1808, 1860,
+ 1860, 1860, 1808, 1860, 1860, 585, 1819, 1860, 1450, 1860,
+ 1830, 1831, 1831, 1832, 1234, 1860, 1740, 1860, 586, 1803,
+ 1860, 1800, 1801, 1801, 1800, 1860, 1860, 587, 1860, 1860,
+ 1806, 1860, 1450, 1860, 1450, 1860, 1860, 1860, 1234, 1740,
+ 1860, 1860, 586, 1860, 1598, 1860, 1860, 1595, 1860, 1860,
+ 587, 1269, 1270, 1269, 1269, 1860, 1596, 1088, 1450, 1860,
+ 1860, 1860, 1088, 1860, 1271, 1860, 1860, 1598, 841, 1860,
+
+ 1088, 1595, 1801, 1801, 1801, 1801, 1860, 1272, 1860, 1596,
+ 1860, 1806, 1744, 1744, 1744, 1744, 1273, 1810, 1779, 1779,
+ 1810, 1860, 1811, 1779, 1779, 1811, 1860, 1860, 1595, 1860,
+ 1860, 1272, 1860, 1766, 1766, 1766, 1766, 1596, 1860, 1273,
+ 1089, 1090, 1089, 1089, 1715, 1836, 1815, 1860, 1860, 1815,
+ 1837, 1860, 1595, 1091, 1860, 1860, 1860, 582, 1860, 1860,
+ 1596, 1815, 1860, 1860, 1815, 1767, 1092, 1715, 1860, 1836,
+ 1860, 1860, 1860, 1274, 1837, 1093, 197, 198, 198, 199,
+ 1816, 1820, 1821, 1821, 1820, 1860, 1838, 1860, 1767, 1860,
+ 1092, 1860, 186, 1860, 1860, 1816, 1274, 186, 1093, 1089,
+
+ 1090, 1089, 1089, 1816, 1821, 1821, 1821, 1821, 1860, 1835,
+ 1838, 1860, 1091, 1841, 1860, 1860, 582, 1860, 1816, 1860,
+ 186, 1860, 1860, 1753, 1860, 1092, 1860, 1860, 197, 198,
+ 198, 199, 1835, 1835, 1093, 1275, 1841, 185, 185, 1830,
+ 1831, 1831, 1830, 1860, 186, 1860, 1753, 1860, 1806, 1092,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1835, 1093, 1275, 891,
+ 892, 892, 893, 1860, 1860, 1595, 1860, 1831, 1831, 1831,
+ 1831, 1860, 1860, 1860, 1596, 1860, 1806, 1848, 1750, 1750,
+ 1848, 779, 1860, 779, 1860, 1830, 1831, 1831, 1832, 1595,
+ 1860, 1860, 1276, 1595, 1803, 997, 1860, 1596, 1839, 1840,
+
+ 1840, 1839, 1596, 1860, 1860, 779, 1860, 779, 1860, 1450,
+ 1860, 1816, 1860, 1860, 1860, 1276, 1860, 1595, 997, 1194,
+ 1195, 1195, 1194, 1860, 1860, 1596, 1849, 197, 198, 198,
+ 199, 1860, 780, 1450, 1816, 1860, 1840, 1840, 1840, 1840,
+ 1860, 1860, 1860, 186, 1860, 990, 1788, 1789, 1789, 1790,
+ 1849, 1280, 1860, 1860, 991, 185, 185, 1860, 1815, 1860,
+ 1860, 1815, 186, 1860, 1808, 1860, 1860, 1860, 1860, 990,
+ 1691, 1860, 1860, 1860, 1280, 1860, 1860, 991, 1195, 1195,
+ 1195, 1195, 1860, 1850, 1860, 1860, 1860, 1860, 1808, 1860,
+ 1860, 780, 1816, 1691, 1860, 1856, 1860, 1860, 1788, 1789,
+
+ 1789, 1790, 1860, 1860, 990, 1860, 1850, 185, 185, 1860,
+ 1280, 1860, 1860, 991, 186, 1816, 1860, 1860, 1856, 1815,
+ 1860, 1860, 1815, 1860, 1860, 1860, 1860, 1860, 990, 1860,
+ 1860, 1860, 1860, 1280, 1860, 1860, 991, 1297, 1297, 1297,
+ 1297, 1860, 1298, 1860, 1860, 1860, 1860, 1860, 673, 673,
+ 673, 174, 674, 1816, 1299, 673, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1857,
+ 1779, 1779, 1857, 1860, 1860, 1860, 1816, 1860, 1860, 1301,
+ 674, 283, 1218, 1219, 1218, 1218, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 1849, 283, 1128,
+
+ 283, 283, 1860, 1816, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1849, 1860, 1860, 283, 1860, 1816, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 283, 283, 1218,
+ 1219, 1218, 1218, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 1860, 283, 1128, 283, 283, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 283, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 283, 283, 1305, 1306, 1305, 1305,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 288, 1860, 283, 1128, 283, 283, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 283, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 283, 1042, 1043, 1042, 1042, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 585, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 586, 1860,
+ 1860, 1860, 1860, 1860, 1044, 1860, 1860, 587, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 586, 1860, 1860, 1860, 1860, 1044, 1860, 1860,
+ 587, 1325, 1326, 1325, 1325, 1860, 1860, 1860, 1860, 1860,
+ 1327, 1860, 1860, 1860, 585, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 586, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 728, 587, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 586, 1860, 1860, 1860, 1860, 1860, 1860, 728, 587,
+
+ 1269, 1270, 1269, 1269, 1860, 1860, 1088, 1860, 1860, 1860,
+ 1860, 1088, 1860, 1271, 1860, 1860, 1860, 841, 1860, 1088,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1272, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1273, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1272, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1273, 1089,
+ 1090, 1089, 1089, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1091, 1860, 1860, 1860, 582, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1188, 1860, 1092, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1093, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1188, 1860, 1092,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1093, 1089, 1090,
+ 1089, 1089, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1091, 1860, 1860, 1860, 582, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1092, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1189, 1093, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1092, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1189, 1093, 1089, 1090, 1089,
+ 1089, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1091, 1860, 1860, 1860, 582, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1353, 1860, 1092, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1093, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1353, 1860, 1092, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1093, 1089, 1090, 1089, 1089,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1091,
+ 1860, 1860, 1860, 582, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1092, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1093, 1860, 1860, 1354, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1092, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1093, 1860, 1860, 1354, 569, 1357,
+
+ 1358, 1358, 1359, 569, 569, 569, 569, 569, 1860, 1860,
+ 569, 569, 780, 1860, 1860, 569, 1860, 569, 569, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1361, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1362, 1860, 1860, 1860, 1860, 1860,
+ 1860, 569, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1361,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1362, 1860, 1860,
+ 1860, 1860, 1860, 1860, 569, 891, 892, 892, 893, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 779, 1860, 779,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1366, 1860,
+
+ 1860, 997, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 779, 1860, 779, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1366, 1860, 1860, 997, 1297, 1297, 1297, 1297, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 673, 673, 673, 1860,
+ 673, 1860, 1299, 673, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1301, 673, 1377,
+ 1377, 1377, 1377, 1860, 1378, 1860, 1860, 1860, 1860, 1860,
+ 673, 673, 673, 174, 674, 1860, 1379, 673, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1381, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1382, 1860, 1860, 1860, 1860, 1860,
+ 1860, 541, 674, 1860, 1860, 1860, 1860, 1860, 1381, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1382, 1385, 1385,
+ 1385, 1385, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1387,
+ 1387, 1387, 1860, 1387, 1860, 1299, 1387, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1301, 1387, 1385, 1385, 1385, 1385, 1860, 1386, 1860, 1860,
+ 1860, 1860, 1860, 1387, 1387, 1387, 174, 1388, 1860, 1299,
+ 1387, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1301, 1388, 1390, 1860, 1860, 1390,
+ 1390, 1860, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390,
+ 1390, 1390, 1390, 1390, 1390, 1390, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1392, 1390,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1390, 283, 1305, 1306, 1305, 1305, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 1860, 283,
+
+ 1128, 283, 283, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 283, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 283, 1396,
+ 1396, 1396, 1396, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1398, 1398, 1398, 1860, 1398, 1860, 1312, 1398, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1301, 1398, 1396, 1396, 1396, 1396, 1860, 1397, 1860,
+
+ 1860, 1860, 1860, 1860, 1398, 1398, 1398, 174, 1399, 1860,
+ 1312, 1398, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1301, 1399, 1403, 1403, 1403,
+ 1403, 1860, 1404, 1860, 1860, 1860, 1860, 1860, 701, 701,
+ 701, 174, 702, 1860, 1405, 701, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1407, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1408, 1860, 1860, 1860, 1860, 1860, 1860, 563,
+ 702, 1860, 1860, 1860, 1860, 1860, 1407, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1408, 700, 700, 700, 700,
+
+ 1860, 701, 1860, 1860, 1860, 1860, 1860, 701, 701, 701,
+ 174, 1860, 1860, 559, 701, 1860, 1860, 1860, 1860, 1860,
+ 1409, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1409, 346, 1860, 1860, 346, 346,
+ 1860, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 346, 1860, 1860, 1860, 1410, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 348, 346, 1860,
+ 1860, 1860, 1410, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 346, 1320, 1144, 1144, 1321, 346, 1860, 346, 346, 346,
+ 1322, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 348, 346, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 346, 1411, 1324, 1324,
+ 1411, 167, 168, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1412, 1860, 1860, 1860, 1860, 1860, 1860, 167,
+ 167, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1412, 1860, 1860, 1860, 1860,
+ 1860, 1860, 167, 353, 354, 354, 355, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 207, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 210,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1414, 211, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 210, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1414, 211, 1053, 1054, 1054, 1055, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 207, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 957, 1860,
+ 1426, 1860, 1860, 1860, 1860, 1860, 1860, 958, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 957, 1860, 1426, 1860, 1860, 1860, 1860, 1860,
+ 958, 1338, 1339, 1339, 1338, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 207, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1159, 1860, 1860,
+ 1860, 1860, 1860, 1427, 1860, 1860, 1160, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1159, 1860, 1860, 1860, 1860, 1427, 1860, 1860, 1160,
+ 1338, 1339, 1339, 1340, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 207, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 957, 1860, 1860, 1860,
+ 1860, 1860, 1341, 1860, 1860, 958, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 957, 1860, 1860, 1860, 1860, 1341, 1860, 1860, 958, 1434,
+ 1435, 1435, 1436, 1860, 214, 1860, 1860, 1860, 185, 185,
+ 214, 214, 214, 202, 1860, 216, 1860, 214, 212, 198,
+
+ 198, 213, 1860, 214, 1860, 1860, 1860, 185, 185, 214,
+ 214, 214, 202, 1860, 216, 1860, 214, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1437, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1437, 1441, 1324, 1324, 1441, 223,
+ 1860, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 225, 223, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 223, 1089, 1090, 1089, 1089, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1091, 1860, 1860, 1860, 582, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1092, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1093, 1443, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1092, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1093,
+ 1443, 1444, 1445, 1444, 1444, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1091, 1860, 1860, 1860, 582, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1092, 1860, 1860,
+ 1860, 1860, 1860, 1446, 1860, 1860, 1093, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1092, 1860, 1860, 1860, 1860, 1446, 1860, 1860, 1093,
+ 569, 891, 892, 892, 893, 569, 569, 569, 569, 569,
+ 1860, 1860, 569, 569, 780, 1860, 1860, 569, 1860, 569,
+ 569, 1860, 1860, 1860, 1860, 1860, 1860, 783, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1447, 1860, 890, 1860, 1860, 1860,
+ 1860, 1860, 1860, 569, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 783, 1860, 1860, 1860, 1860, 1860, 1447, 1860, 890,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 569, 569, 891, 892,
+ 892, 893, 569, 569, 569, 569, 569, 1860, 1860, 569,
+ 569, 780, 1860, 1860, 569, 1860, 569, 569, 1860, 1860,
+ 1860, 1860, 1860, 1860, 783, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 890, 1448, 1860, 1860, 1860, 1860, 1860,
+ 569, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 783, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 890, 1448, 1860, 1860,
+ 1860, 1860, 1860, 569, 569, 1357, 1358, 1358, 1449, 569,
+ 569, 569, 569, 569, 1860, 1860, 569, 569, 780, 1860,
+ 1860, 569, 1860, 569, 569, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1451, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1452, 1860, 1860, 1860, 1860, 1860, 1860, 569, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1451, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1452, 1860, 1860, 1860, 1860, 1860, 1860,
+ 569, 569, 1453, 1358, 1358, 1454, 569, 569, 569, 569,
+ 569, 1860, 1860, 569, 569, 780, 1860, 1860, 569, 1860,
+ 569, 569, 1860, 1860, 1860, 1860, 1860, 1860, 1451, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1452, 1860, 1860,
+ 1860, 1860, 1860, 1860, 569, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1451, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1452, 1860, 1860, 1860, 1860, 1860, 1860, 569, 569, 1357,
+ 1358, 1358, 1359, 569, 569, 569, 569, 569, 1860, 1860,
+ 569, 569, 780, 1860, 1860, 569, 1860, 569, 569, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1361, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1362, 1860, 1860, 1860, 1860, 1860,
+ 1860, 569, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1361,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1362, 1860, 1860,
+ 1860, 1860, 1860, 1860, 569, 569, 1455, 1456, 1456, 1457,
+ 569, 569, 569, 569, 569, 1860, 1860, 569, 569, 780,
+ 1860, 1860, 569, 1860, 569, 569, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1361, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1362, 1860, 1860, 1860, 1860, 1860, 1860, 569, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1361, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1362, 1860, 1860, 1860, 1860, 1860,
+ 1860, 569, 1377, 1377, 1377, 1377, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 673, 673, 673, 1860, 673, 1860, 1379,
+ 673, 1860, 1860, 1860, 1860, 1860, 1860, 1474, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1475, 1860, 1860,
+ 1860, 1860, 1860, 1860, 541, 673, 1860, 1860, 1860, 1860,
+ 1860, 1474, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1475, 672, 672, 672, 672, 1860, 673, 1860, 1860, 1860,
+ 1860, 1860, 673, 673, 673, 174, 1860, 1860, 537, 673,
+ 672, 672, 672, 672, 1860, 673, 1860, 1860, 1860, 1860,
+ 1860, 673, 673, 673, 174, 1860, 1860, 537, 673, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 675,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 675, 1377, 1377, 1377, 1377, 1860, 1378, 1860,
+ 1860, 1860, 1860, 1860, 673, 673, 673, 174, 674, 1860,
+
+ 1379, 673, 1860, 1860, 1860, 1860, 1860, 1860, 1381, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1382, 1860,
+ 1860, 1860, 1860, 1860, 1860, 541, 674, 1860, 1860, 1860,
+ 1860, 1860, 1381, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1382, 1385, 1385, 1385, 1385, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1387, 1387, 1387, 1860, 1387, 1860, 1299,
+ 1387, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1301, 1387, 1385, 1385, 1385, 1385,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1387, 1387, 1387,
+
+ 1860, 1387, 1860, 1299, 1387, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1301, 1387,
+ 1385, 1385, 1385, 1385, 1860, 1386, 1860, 1860, 1860, 1860,
+ 1860, 1387, 1387, 1387, 174, 1388, 1860, 1299, 1387, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1301, 1388, 1385, 1385, 1385, 1385, 1860, 1386,
+ 1860, 1860, 1860, 1860, 1860, 1387, 1387, 1387, 174, 1388,
+ 1860, 1299, 1387, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1301, 1388, 1390, 1860,
+ 1860, 1390, 1390, 1860, 1390, 1390, 1390, 1390, 1390, 1390,
+ 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1392, 1390, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1390, 1390, 1860, 1860, 1390, 1390, 1860,
+ 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390,
+
+ 1390, 1390, 1390, 1390, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1392, 1390, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1390,
+ 1482, 1396, 1396, 1482, 1390, 1311, 1390, 1390, 1390, 1390,
+ 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1483, 1390, 1390,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1485, 1390, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1390, 1396, 1396, 1396, 1396,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1398, 1398, 1398,
+ 1860, 1398, 1860, 1312, 1398, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1301, 1398,
+ 1396, 1396, 1396, 1396, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1398, 1398, 1398, 1860, 1398, 1860, 1312, 1398, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1301, 1398, 1396, 1396, 1396, 1396, 1860, 1397,
+ 1860, 1860, 1860, 1860, 1860, 1398, 1398, 1398, 174, 1399,
+ 1860, 1312, 1398, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1301, 1399, 1396, 1396,
+ 1396, 1396, 1860, 1397, 1860, 1860, 1860, 1860, 1860, 1398,
+ 1398, 1398, 174, 1399, 1860, 1312, 1398, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1301, 1399, 1403, 1403, 1403, 1403, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 701, 701, 701, 1860, 701, 1860, 1405,
+ 701, 1860, 1860, 1860, 1860, 1860, 1860, 1488, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1489, 1860, 1860,
+ 1860, 1860, 1860, 1860, 563, 701, 1860, 1860, 1860, 1860,
+ 1860, 1488, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1489, 700, 700, 700, 700, 1860, 701, 1860, 1860, 1860,
+ 1860, 1860, 701, 701, 701, 174, 1860, 1860, 559, 701,
+ 700, 700, 700, 700, 1860, 701, 1860, 1860, 1860, 1860,
+ 1860, 701, 701, 701, 174, 1860, 1860, 559, 701, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 703,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 703, 1403, 1403, 1403, 1403, 1860, 1404, 1860,
+ 1860, 1860, 1860, 1860, 701, 701, 701, 174, 702, 1860,
+ 1405, 701, 1860, 1860, 1860, 1860, 1860, 1860, 1407, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1408, 1860,
+ 1860, 1860, 1860, 1860, 1860, 563, 702, 1860, 1860, 1860,
+ 1860, 1860, 1407, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1408, 1491, 1324, 1324, 1491, 346, 1860, 346, 346,
+
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 348, 346, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 346, 1411, 1324,
+ 1324, 1411, 167, 168, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1412, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 167, 167, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1412, 1860, 1860, 1860,
+ 1860, 1860, 1860, 167, 167, 1860, 1860, 167, 167, 168,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 460, 1860, 1860, 1860, 1860, 1860, 167, 167, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 460, 1860, 1860, 1860, 1860, 1860, 167,
+ 353, 354, 354, 355, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 207, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 210, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1492, 1860, 211, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 210, 1860, 1860, 1860, 1860, 1860, 1492, 1860, 211, 1053,
+ 1054, 1054, 1055, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 207, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1504, 1860, 1860, 1860, 957, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 958, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1504, 1860, 1860, 1860, 957,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 958, 353, 354,
+ 354, 355, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 207, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 210, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 360, 211, 470, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 210, 1860,
+ 1860, 1860, 1860, 1860, 1860, 360, 211, 470, 1510, 1511,
+ 1511, 1512, 1860, 214, 1860, 1860, 1860, 185, 185, 214,
+ 214, 214, 202, 1860, 216, 1860, 214, 1519, 1324, 1324,
+ 1519, 223, 1860, 223, 223, 223, 223, 223, 223, 223,
+
+ 223, 223, 223, 223, 223, 223, 223, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1520, 1860, 1860, 1860, 1860, 1860, 1860, 225,
+ 223, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1520, 1860, 1860, 1860, 1860,
+ 1860, 1860, 223, 1089, 1090, 1089, 1089, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1091, 1860, 1860, 1860,
+ 582, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1092,
+ 1860, 1522, 1860, 1860, 1860, 1860, 1860, 1860, 1093, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1092, 1860, 1522, 1860, 1860, 1860, 1860,
+ 1860, 1093, 1444, 1445, 1444, 1444, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1091, 1860, 1860, 1860, 582,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1092, 1860,
+ 1860, 1860, 1860, 1860, 1446, 1860, 1860, 1093, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1092, 1860, 1860, 1860, 1860, 1446, 1860, 1860,
+ 1093, 1089, 1090, 1089, 1089, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1091, 1860, 1860, 1860, 582, 1860,
+ 1860, 1523, 1860, 1860, 1860, 1860, 1860, 1092, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1093, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1523, 1860, 1860, 1860, 1860,
+ 1860, 1092, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1093,
+ 569, 891, 892, 892, 893, 569, 569, 569, 569, 569,
+ 1860, 1860, 569, 569, 780, 1860, 1860, 569, 1860, 569,
+ 569, 1860, 1860, 1860, 1860, 1860, 1860, 783, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 890, 1860, 1860, 1524,
+ 1860, 1860, 1860, 569, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 783, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 890,
+ 1860, 1860, 1524, 1860, 1860, 1860, 569, 569, 891, 892,
+
+ 892, 893, 569, 569, 569, 569, 569, 1860, 1860, 569,
+ 569, 780, 1860, 1860, 569, 1860, 569, 569, 1525, 1860,
+ 1860, 1860, 1860, 1860, 783, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 890, 1860, 1860, 1860, 1860, 1860, 1860,
+ 569, 1860, 1525, 1860, 1860, 1860, 1860, 1860, 783, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 890, 1860, 1860, 1860,
+ 1860, 1860, 1860, 569, 569, 1357, 1358, 1358, 1449, 569,
+ 569, 569, 569, 569, 1860, 1860, 569, 569, 780, 1860,
+ 1860, 569, 1860, 569, 569, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1451, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1452, 1860, 1860, 1860, 1860, 1860, 1860, 569, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1451, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1452, 1860, 1860, 1860, 1860, 1860, 1860,
+ 569, 569, 1526, 1527, 1527, 1528, 569, 569, 569, 569,
+ 569, 1860, 1860, 569, 569, 569, 1860, 1860, 569, 1860,
+ 569, 569, 1860, 1860, 1860, 1860, 1860, 1860, 1529, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1530, 1860, 1860,
+ 1860, 1860, 1860, 1860, 569, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1529, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1530, 1860, 1860, 1860, 1860, 1860, 1860, 569, 569, 1455,
+
+ 1456, 1456, 1457, 569, 569, 569, 569, 569, 1860, 1860,
+ 569, 569, 780, 1860, 1860, 569, 1860, 569, 569, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1361, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1362, 1860, 1860, 1860, 1860, 1860,
+ 1860, 569, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1361,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1362, 1860, 1860,
+ 1860, 1860, 1860, 1860, 569, 569, 1455, 1456, 1456, 1457,
+ 569, 569, 569, 569, 569, 1860, 1860, 569, 569, 780,
+ 1860, 1860, 569, 1860, 569, 569, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1361, 1860, 1860, 1860, 1860, 1860, 1860, 1535,
+
+ 1860, 1362, 1860, 1860, 1860, 1860, 1860, 1860, 569, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1361, 1860, 1860, 1860,
+ 1860, 1860, 1535, 1860, 1362, 1860, 1860, 1860, 1860, 1860,
+ 1860, 569, 1377, 1377, 1377, 1377, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 673, 673, 673, 1860, 673, 1860, 1379,
+ 673, 1860, 1860, 1860, 1860, 1860, 1860, 1474, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1475, 1860, 1860,
+ 1860, 1860, 1860, 1860, 541, 673, 1860, 1860, 1860, 1860,
+ 1860, 1474, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1475, 672, 672, 672, 672, 1860, 673, 1860, 1860, 1860,
+
+ 1860, 1860, 673, 673, 673, 174, 1860, 1860, 537, 673,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1550, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1550, 672,
+ 672, 672, 672, 1860, 673, 1860, 1860, 1860, 1860, 1860,
+ 673, 673, 673, 174, 1860, 1860, 537, 673, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 676, 1860, 1551, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 676, 1860, 1551, 1482,
+ 1396, 1396, 1482, 1390, 1860, 1390, 1390, 1390, 1390, 1390,
+ 1390, 1390, 1390, 1390, 1390, 1390, 1483, 1390, 1390, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1392, 1390, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1390, 1390, 1860, 1860, 1390, 1390,
+ 1860, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390,
+ 1390, 1390, 1390, 1390, 1390, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1392, 1390, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1390, 1482, 1396, 1396, 1482, 1390, 1397, 1390, 1390, 1390,
+ 1390, 1390, 1552, 1552, 1552, 1390, 1552, 1390, 1483, 1552,
+ 1390, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1485, 1552, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1390, 1482, 1396, 1396,
+ 1482, 1390, 1311, 1390, 1390, 1390, 1390, 1390, 1390, 1390,
+ 1390, 1390, 1390, 1390, 1483, 1390, 1390, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1485,
+ 1390, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1390, 1403, 1403, 1403, 1403, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 701, 701, 701, 1860, 701, 1860,
+ 1405, 701, 1860, 1860, 1860, 1860, 1860, 1860, 1488, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1489, 1860,
+ 1860, 1860, 1860, 1860, 1860, 563, 701, 1860, 1860, 1860,
+ 1860, 1860, 1488, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1489, 1555, 1324, 1324, 1555, 346, 1860, 346, 346,
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1556, 1860, 1860,
+ 1860, 1860, 1860, 1860, 348, 346, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1556, 1860, 1860, 1860, 1860, 1860, 1860, 346, 1338, 1339,
+
+ 1339, 1340, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 207, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 957, 1860, 1860, 1860, 1860, 1860,
+ 1341, 1860, 1860, 958, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 957, 1860,
+ 1860, 1860, 1860, 1341, 1860, 1860, 958, 1573, 1860, 1860,
+ 1573, 1573, 1860, 1573, 1573, 1573, 1573, 1573, 1573, 1573,
+ 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1575,
+
+ 1573, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1573, 1515, 1516, 1516, 1517, 1860, 1860, 1860,
+ 1860, 1860, 185, 185, 1860, 1860, 1860, 185, 1860, 186,
+ 1514, 1860, 1860, 1860, 1588, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1586, 1860, 1860, 1588, 1519,
+ 1324, 1324, 1519, 223, 1860, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 223, 223, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1520, 1860, 1860, 1860, 1860, 1860,
+ 1860, 225, 223, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1520, 1860, 1860,
+ 1860, 1860, 1860, 1860, 223, 223, 1860, 1860, 223, 223,
+ 1860, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 223, 223, 223, 223, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 607, 1860, 1860, 1860, 1860, 1860, 225, 223, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 607, 1860, 1860, 1860, 1860, 1860,
+
+ 223, 1089, 1090, 1089, 1089, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1091, 1860, 1860, 1860, 582, 1860,
+ 1860, 1860, 1860, 1590, 1860, 1860, 1860, 1092, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1093, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1590, 1860, 1860,
+ 1860, 1092, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1093,
+ 569, 1526, 1527, 1527, 1528, 569, 569, 569, 569, 569,
+ 1860, 1860, 569, 569, 569, 1860, 1860, 569, 1860, 569,
+ 569, 1860, 1860, 1860, 1860, 1860, 1860, 1529, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1530, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 569, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1529, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1530,
+ 1860, 1860, 1860, 1860, 1860, 1860, 569, 569, 1526, 1527,
+ 1527, 1528, 569, 569, 569, 569, 569, 1860, 1860, 569,
+ 569, 569, 1860, 1860, 569, 1860, 569, 569, 1860, 1860,
+ 1860, 1860, 1597, 1860, 1529, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1530, 1860, 1860, 1860, 1860, 1860, 1860,
+ 569, 1860, 1860, 1860, 1860, 1860, 1597, 1860, 1529, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1530, 1860, 1860, 1860,
+ 1860, 1860, 1860, 569, 569, 1455, 1456, 1456, 1457, 569,
+
+ 569, 569, 569, 569, 1860, 1860, 569, 569, 780, 1860,
+ 1860, 569, 1860, 569, 569, 1860, 1860, 1860, 1860, 1603,
+ 1860, 1361, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1362, 1860, 1860, 1860, 1860, 1860, 1860, 569, 1860, 1860,
+ 1860, 1860, 1860, 1603, 1860, 1361, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1362, 1860, 1860, 1860, 1860, 1860, 1860,
+ 569, 569, 1455, 1456, 1456, 1457, 569, 569, 569, 569,
+ 569, 1860, 1860, 569, 569, 780, 1860, 1860, 569, 1860,
+ 569, 569, 1860, 1860, 1860, 1860, 1860, 1860, 1361, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1362, 1860, 1860,
+
+ 1604, 1860, 1860, 1860, 569, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1361, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1362, 1860, 1860, 1604, 1860, 1860, 1860, 569, 672, 672,
+ 672, 672, 1860, 673, 1860, 1860, 1860, 1860, 1860, 673,
+ 673, 673, 174, 1860, 1860, 537, 673, 1860, 1860, 1860,
+ 1611, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1611, 672, 672, 672, 672, 1860,
+ 673, 1860, 1860, 1860, 1860, 1860, 673, 673, 673, 174,
+ 1860, 1860, 537, 673, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1612,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1612, 1482, 1396, 1396, 1482, 1390, 1397, 1390,
+ 1390, 1390, 1390, 1390, 1552, 1552, 1552, 1390, 1552, 1390,
+ 1483, 1552, 1390, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1485, 1552, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1390, 1555,
+
+ 1324, 1324, 1555, 346, 1860, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 346, 346, 346, 346, 346, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1556, 1860, 1860, 1860, 1860, 1860,
+ 1860, 348, 346, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1556, 1860, 1860,
+ 1860, 1860, 1860, 1860, 346, 1618, 1619, 1619, 1620, 1860,
+ 1860, 1860, 1860, 1860, 1621, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1155, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1242,
+
+ 1156, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1155, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1242, 1156, 1573, 1860, 1860, 1573, 1573, 1860,
+ 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573,
+ 1573, 1573, 1573, 1573, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1575, 1573, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1573,
+ 1576, 1577, 1577, 1578, 1860, 1860, 1860, 1860, 1860, 185,
+
+ 185, 1860, 1860, 1860, 1860, 1860, 186, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1630, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1580, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1630,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1580, 1634, 1860,
+ 1860, 1634, 1634, 1860, 1634, 1634, 1634, 1634, 1634, 1634,
+ 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1636, 1634, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1634, 1645, 1860, 1860, 1645, 1645, 1860,
+ 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645,
+ 1645, 1645, 1645, 1645, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1647, 1645, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1645,
+ 1444, 1445, 1444, 1444, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1091, 1860, 1860, 1860, 582, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1092, 1860, 1860, 1860,
+ 1860, 1860, 1446, 1860, 1860, 1093, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1092, 1860, 1860, 1860, 1860, 1446, 1860, 1860, 1093, 1654,
+ 1655, 1654, 1654, 1860, 1860, 1860, 1860, 1860, 1656, 1860,
+ 1860, 1860, 1091, 1860, 1860, 1860, 582, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1092, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1189, 1093, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1092,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1189, 1093, 1634, 1860,
+
+ 1860, 1634, 1634, 1860, 1634, 1634, 1634, 1634, 1634, 1634,
+ 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1636, 1634, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1634, 1637, 1638, 1638, 1639, 1860, 1860,
+ 1860, 1860, 1860, 185, 185, 1860, 1860, 1860, 1860, 1860,
+ 186, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1696,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1641, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1696, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1641, 1645, 1860, 1860, 1645, 1645, 1860, 1645, 1645,
+ 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645,
+ 1645, 1645, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1647, 1645, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1645, 1654, 1655,
+ 1654, 1654, 1860, 1860, 1860, 1860, 1860, 1656, 1860, 1860,
+
+ 1860, 1091, 1860, 1860, 1860, 582, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1092, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1093, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1092, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1093, 1667, 1668, 1668,
+ 1667, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 780, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1533, 1860, 1860, 1860, 1860, 1860, 1715,
+ 1860, 1860, 1534, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1533, 1860, 1860,
+
+ 1860, 1860, 1715, 1860, 1860, 1534, 1668, 1668, 1668, 1668,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 780,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1533, 1860, 1860, 1860, 1860, 1860, 1715, 1860,
+ 1860, 1534, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1533, 1860, 1860, 1860,
+ 1860, 1715, 1860, 1860, 1534, 1726, 1727, 1727, 1728, 1860,
+ 1860, 1860, 1860, 1860, 185, 185, 1860, 1860, 1860, 185,
+ 1860, 186, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1759,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1753, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1759, 1782, 1860, 1860, 1782, 1782, 1860, 1782,
+ 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782,
+ 1782, 1782, 1782, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1784, 1782, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1782, 1754,
+ 1750, 1750, 1754, 1634, 1860, 1634, 1634, 1634, 1634, 1634,
+
+ 1634, 1634, 1634, 1634, 1785, 1634, 1634, 1634, 1634, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1787, 1785, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1634, 1782, 1860, 1860, 1782, 1782,
+ 1860, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782,
+ 1782, 1782, 1782, 1782, 1782, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1784, 1782, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1782, 1811, 1779, 1779, 1811, 1634, 1860, 1634, 1634, 1634,
+ 1634, 1634, 1634, 1634, 1634, 1812, 1812, 1634, 1634, 1634,
+ 1634, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1636, 1812, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1634, 1811, 1779, 1779,
+ 1811, 1634, 1860, 1634, 1634, 1634, 1634, 1634, 1634, 1634,
+
+ 1634, 1812, 1812, 1634, 1634, 1634, 1634, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1636,
+ 1812, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1634, 1814, 1631, 1631, 1814, 1815, 1860, 1815,
+ 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
+ 1815, 1815, 1815, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1817, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1818, 1815, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1817, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1815, 1824,
+ 1860, 1860, 1824, 1824, 1860, 1824, 1824, 1824, 1824, 1824,
+ 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1826, 1824, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1824, 1814, 1631, 1631, 1814, 1815,
+ 1860, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
+
+ 1815, 1815, 1815, 1815, 1815, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1817,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1818, 1815, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1817, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1815, 1820, 1821, 1821, 1822, 1860, 1860, 1860, 1860, 1860,
+ 185, 185, 1860, 1860, 1860, 185, 1860, 186, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1842,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1753, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1842, 1824, 1860, 1860, 1824, 1824, 1860,
+ 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
+ 1824, 1824, 1824, 1824, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1826, 1824, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1824,
+ 1848, 1750, 1750, 1848, 1815, 1860, 1815, 1815, 1815, 1815,
+ 1815, 1815, 1815, 1815, 1815, 1853, 1815, 1815, 1815, 1815,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1855, 1853, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1815, 1857, 1779, 1779, 1857,
+ 1815, 1860, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815,
+ 1858, 1858, 1815, 1815, 1815, 1815, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1818, 1858,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1815, 1857, 1779, 1779, 1857, 1815, 1860, 1815, 1815,
+ 1815, 1815, 1815, 1815, 1815, 1815, 1858, 1858, 1815, 1815,
+ 1815, 1815, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1818, 1858, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1815, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 112, 112, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,
+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+ 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
+ 119, 119, 119, 129, 129, 129, 129, 129, 129, 129,
+ 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+
+ 129, 129, 129, 129, 129, 129, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141, 141, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 147, 147, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+ 151, 151, 151, 151, 151, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158, 161, 161,
+
+ 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 169, 1860, 1860, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 174, 1860, 1860, 1860, 1860, 174, 174,
+ 1860, 1860, 1860, 1860, 174, 174, 1860, 174, 176, 1860,
+ 1860, 176, 176, 1860, 176, 176, 176, 176, 176, 176,
+ 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+ 187, 187, 187, 187, 1860, 187, 1860, 187, 1860, 1860,
+ 187, 187, 187, 187, 1860, 1860, 1860, 187, 187, 187,
+
+ 187, 196, 1860, 1860, 196, 196, 196, 196, 196, 196,
+ 196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+ 196, 196, 196, 185, 185, 185, 185, 1860, 1860, 1860,
+ 185, 1860, 1860, 1860, 185, 185, 185, 1860, 1860, 1860,
+ 185, 185, 1860, 185, 202, 202, 202, 202, 1860, 1860,
+ 202, 202, 1860, 1860, 1860, 202, 202, 202, 1860, 1860,
+ 1860, 202, 202, 1860, 202, 206, 206, 206, 206, 1860,
+ 1860, 1860, 206, 1860, 1860, 206, 206, 206, 1860, 1860,
+ 1860, 1860, 206, 206, 1860, 206, 215, 215, 215, 215,
+ 1860, 215, 1860, 215, 215, 215, 215, 215, 215, 215,
+
+ 1860, 215, 1860, 215, 215, 1860, 215, 224, 1860, 1860,
+ 224, 224, 1860, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 268,
+ 268, 268, 268, 1860, 1860, 268, 1860, 1860, 1860, 1860,
+ 268, 268, 1860, 1860, 1860, 1860, 268, 268, 1860, 268,
+ 270, 1860, 1860, 270, 270, 1860, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 288, 288, 1860, 288, 288, 288, 288, 288,
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 288, 288, 288, 288, 288, 294, 294, 294, 294, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 294, 1860, 1860, 1860, 1860,
+ 1860, 1860, 294, 294, 1860, 294, 296, 296, 1860, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 1860, 296, 296, 296, 296, 296, 296, 296, 308,
+ 1860, 1860, 1860, 1860, 308, 308, 1860, 1860, 1860, 1860,
+ 308, 308, 1860, 308, 310, 1860, 1860, 310, 310, 1860,
+ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310,
+ 310, 310, 310, 310, 310, 310, 315, 1860, 1860, 1860,
+ 1860, 315, 315, 1860, 1860, 1860, 1860, 315, 315, 1860,
+ 315, 317, 1860, 1860, 317, 317, 1860, 317, 317, 317,
+
+ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 326, 1860, 1860, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326, 328, 1860,
+ 1860, 328, 328, 328, 328, 328, 1860, 1860, 328, 1860,
+ 328, 328, 1860, 328, 330, 1860, 1860, 330, 330, 1860,
+ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330,
+ 330, 330, 330, 330, 330, 330, 334, 334, 1860, 334,
+
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 336,
+ 1860, 336, 336, 1860, 1860, 1860, 1860, 336, 1860, 1860,
+ 336, 214, 1860, 1860, 214, 1860, 214, 1860, 1860, 214,
+ 214, 214, 1860, 214, 214, 1860, 214, 1860, 214, 214,
+ 1860, 214, 185, 185, 185, 185, 1860, 1860, 1860, 185,
+ 1860, 1860, 1860, 185, 185, 185, 1860, 1860, 1860, 185,
+ 185, 1860, 185, 206, 206, 206, 206, 1860, 1860, 1860,
+ 206, 1860, 1860, 206, 206, 206, 1860, 1860, 1860, 1860,
+ 206, 206, 1860, 206, 342, 342, 342, 342, 1860, 342,
+
+ 1860, 342, 342, 342, 342, 342, 342, 342, 1860, 342,
+ 1860, 342, 342, 1860, 342, 347, 1860, 1860, 347, 347,
+ 1860, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 196, 1860, 1860,
+ 196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+ 196, 196, 196, 196, 196, 196, 196, 196, 196, 202,
+ 202, 202, 202, 1860, 1860, 1860, 202, 1860, 1860, 1860,
+ 202, 202, 202, 1860, 1860, 1860, 202, 202, 1860, 202,
+ 215, 215, 215, 215, 1860, 215, 1860, 215, 215, 215,
+ 215, 215, 215, 215, 1860, 215, 1860, 215, 215, 1860,
+
+ 215, 224, 1860, 1860, 224, 224, 1860, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 268, 268, 268, 268, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 268, 268, 1860, 1860, 1860, 1860,
+ 268, 268, 1860, 268, 270, 1860, 1860, 270, 270, 1860,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 283, 283, 1860, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 288,
+ 288, 1860, 288, 288, 288, 288, 288, 288, 288, 288,
+
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 288, 288, 294, 294, 294, 294, 1860, 1860, 1860, 1860,
+ 1860, 1860, 294, 1860, 1860, 1860, 1860, 1860, 1860, 294,
+ 294, 1860, 294, 295, 295, 1860, 295, 295, 295, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295, 1860, 295,
+ 295, 295, 295, 295, 295, 295, 296, 296, 1860, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 1860, 296, 296, 296, 296, 296, 296, 296, 308,
+ 308, 1860, 1860, 1860, 1860, 308, 308, 1860, 308, 310,
+ 1860, 1860, 310, 310, 1860, 310, 310, 310, 310, 310,
+
+ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310,
+ 310, 315, 315, 1860, 1860, 1860, 1860, 315, 315, 1860,
+ 315, 317, 1860, 1860, 317, 317, 1860, 317, 317, 317,
+ 317, 317, 317, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 320, 320, 320, 320, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 327,
+ 1860, 1860, 327, 327, 327, 1860, 327, 1860, 1860, 327,
+
+ 1860, 327, 327, 1860, 327, 326, 1860, 1860, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 328, 1860, 1860,
+ 328, 328, 328, 328, 328, 1860, 1860, 328, 1860, 328,
+ 328, 1860, 328, 330, 1860, 1860, 330, 330, 1860, 330,
+ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330,
+ 330, 330, 330, 330, 330, 446, 446, 1860, 446, 446,
+ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446,
+ 446, 446, 446, 446, 446, 446, 446, 446, 336, 1860,
+ 1860, 336, 1860, 336, 336, 1860, 1860, 1860, 1860, 336,
+
+ 1860, 1860, 336, 342, 342, 342, 342, 1860, 342, 1860,
+ 342, 342, 342, 342, 342, 342, 342, 1860, 342, 1860,
+ 342, 342, 1860, 342, 347, 1860, 1860, 347, 347, 1860,
+ 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 202, 202,
+ 202, 202, 1860, 1860, 1860, 202, 1860, 1860, 1860, 202,
+ 202, 202, 1860, 1860, 1860, 202, 202, 1860, 202, 206,
+ 206, 206, 206, 1860, 1860, 1860, 206, 1860, 1860, 206,
+
+ 206, 206, 1860, 1860, 1860, 1860, 206, 206, 1860, 206,
+ 463, 463, 463, 463, 463, 463, 463, 1860, 463, 1860,
+ 463, 463, 463, 463, 463, 463, 463, 1860, 463, 463,
+ 463, 463, 463, 215, 215, 215, 215, 1860, 215, 1860,
+ 215, 215, 215, 215, 215, 215, 215, 1860, 215, 1860,
+ 215, 215, 1860, 215, 224, 1860, 1860, 224, 224, 1860,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 527, 527, 1860, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527, 527, 268,
+
+ 268, 268, 268, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 268, 268, 1860, 1860, 1860, 1860, 268, 268, 1860, 268,
+ 270, 270, 270, 270, 270, 1860, 270, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 538, 538, 538, 538, 1860, 538, 1860, 1860,
+ 1860, 1860, 1860, 538, 538, 1860, 538, 1860, 1860, 538,
+ 538, 538, 538, 283, 283, 1860, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 288, 288, 1860, 288,
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 295,
+ 295, 1860, 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295, 295, 1860, 295, 295, 295, 295, 295,
+ 295, 295, 296, 296, 1860, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 1860, 296, 296,
+ 296, 296, 296, 296, 296, 560, 560, 560, 560, 1860,
+ 560, 1860, 1860, 1860, 1860, 1860, 560, 560, 1860, 560,
+ 1860, 1860, 560, 560, 560, 560, 308, 308, 1860, 1860,
+ 1860, 1860, 308, 308, 1860, 308, 315, 315, 1860, 1860,
+ 1860, 1860, 315, 315, 1860, 315, 321, 321, 321, 321,
+
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 321, 321, 328,
+ 1860, 328, 1860, 1860, 328, 328, 328, 328, 328, 1860,
+ 1860, 328, 1860, 328, 328, 1860, 328, 566, 566, 1860,
+ 566, 566, 566, 566, 566, 566, 566, 566, 566, 566,
+ 566, 566, 566, 566, 566, 566, 566, 566, 566, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 447, 447, 1860, 447, 447, 447, 447, 447,
+ 447, 447, 447, 447, 447, 447, 447, 447, 447, 447,
+
+ 447, 447, 447, 447, 447, 569, 569, 569, 569, 569,
+ 569, 569, 569, 569, 569, 569, 569, 569, 569, 569,
+ 1860, 569, 569, 569, 569, 569, 569, 569, 347, 1860,
+ 1860, 347, 347, 1860, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+ 169, 1860, 1860, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 582, 206, 206, 206, 206, 1860,
+
+ 1860, 1860, 206, 1860, 1860, 206, 206, 206, 1860, 1860,
+ 1860, 1860, 206, 206, 1860, 206, 185, 185, 185, 185,
+ 1860, 1860, 1860, 185, 1860, 1860, 1860, 185, 185, 185,
+ 1860, 1860, 1860, 185, 185, 1860, 185, 224, 224, 224,
+ 224, 224, 1860, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 1860, 639, 639, 639, 639, 639,
+ 639, 639, 660, 660, 1860, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660, 660, 660,
+
+ 660, 660, 660, 660, 660, 662, 662, 662, 662, 662,
+ 662, 662, 662, 662, 662, 662, 662, 662, 662, 662,
+ 662, 662, 662, 662, 662, 662, 662, 662, 528, 528,
+ 1860, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 536, 536, 536, 536, 1860, 536, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 536, 1860, 1860, 536, 536,
+ 536, 673, 673, 673, 673, 1860, 673, 1860, 1860, 673,
+ 673, 673, 1860, 673, 1860, 673, 673, 1860, 673, 673,
+ 1860, 673, 674, 674, 674, 674, 1860, 674, 1860, 1860,
+
+ 674, 674, 674, 674, 674, 1860, 674, 674, 1860, 674,
+ 674, 1860, 674, 679, 1860, 1860, 679, 679, 1860, 679,
+ 679, 679, 679, 679, 679, 679, 679, 679, 679, 679,
+ 679, 679, 679, 679, 679, 174, 174, 1860, 1860, 1860,
+ 1860, 174, 174, 1860, 174, 283, 283, 1860, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 684, 684,
+ 1860, 684, 684, 684, 684, 684, 684, 684, 684, 684,
+ 684, 684, 684, 684, 684, 684, 684, 684, 684, 684,
+ 684, 288, 288, 1860, 288, 288, 288, 288, 288, 288,
+
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 288, 288, 288, 288, 693, 693, 693, 693, 693, 693,
+ 693, 693, 693, 693, 693, 693, 693, 693, 693, 693,
+ 693, 693, 693, 693, 693, 693, 693, 295, 295, 1860,
+ 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 1860, 295, 295, 295, 295, 295, 295, 295,
+ 694, 694, 694, 694, 694, 694, 694, 694, 694, 694,
+ 694, 694, 694, 694, 694, 1860, 694, 694, 694, 694,
+ 694, 694, 694, 558, 558, 558, 558, 1860, 558, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 558, 1860, 1860,
+
+ 558, 558, 558, 701, 701, 701, 701, 1860, 701, 1860,
+ 1860, 701, 701, 701, 1860, 701, 1860, 701, 701, 1860,
+ 701, 701, 1860, 701, 702, 702, 702, 702, 1860, 702,
+ 1860, 1860, 702, 702, 702, 702, 702, 1860, 702, 702,
+ 1860, 702, 702, 1860, 702, 706, 1860, 1860, 706, 706,
+ 1860, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 708, 708, 1860,
+ 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,
+ 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,
+ 711, 711, 711, 711, 711, 711, 711, 711, 711, 711,
+
+ 711, 711, 711, 711, 711, 711, 711, 711, 711, 711,
+ 711, 711, 711, 712, 712, 712, 712, 712, 712, 712,
+ 712, 712, 712, 712, 712, 712, 712, 712, 712, 712,
+ 712, 712, 712, 712, 712, 712, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567, 567, 342,
+ 342, 342, 342, 1860, 342, 1860, 342, 342, 342, 342,
+ 342, 342, 342, 1860, 342, 1860, 342, 342, 1860, 342,
+ 347, 347, 347, 347, 347, 1860, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+
+ 347, 347, 169, 1860, 1860, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 582, 582, 582, 206, 206, 206,
+ 206, 1860, 1860, 1860, 206, 1860, 1860, 206, 206, 206,
+ 1860, 1860, 1860, 1860, 206, 206, 1860, 206, 215, 215,
+ 215, 215, 1860, 215, 1860, 215, 215, 215, 215, 215,
+ 215, 215, 1860, 215, 1860, 215, 215, 1860, 215, 185,
+ 185, 185, 185, 1860, 1860, 1860, 185, 1860, 1860, 1860,
+
+ 185, 185, 185, 1860, 1860, 1860, 185, 185, 1860, 185,
+ 224, 1860, 1860, 224, 224, 1860, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 1860, 639, 639,
+ 639, 639, 639, 639, 639, 779, 779, 779, 779, 779,
+ 779, 779, 779, 779, 779, 779, 779, 779, 779, 779,
+ 1860, 779, 779, 779, 779, 779, 779, 779, 796, 796,
+ 796, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+ 796, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+
+ 796, 661, 661, 1860, 661, 661, 661, 661, 661, 661,
+ 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+ 661, 661, 661, 661, 662, 662, 662, 662, 662, 662,
+ 662, 662, 662, 662, 662, 662, 662, 662, 662, 662,
+ 662, 662, 662, 662, 662, 662, 662, 536, 536, 536,
+ 536, 1860, 536, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 536, 1860, 1860, 536, 536, 536, 673, 673, 673,
+ 673, 1860, 673, 1860, 1860, 673, 673, 673, 1860, 673,
+ 1860, 673, 673, 1860, 673, 673, 1860, 673, 674, 674,
+ 674, 674, 1860, 674, 1860, 1860, 674, 674, 674, 674,
+
+ 674, 1860, 674, 674, 1860, 674, 674, 1860, 674, 679,
+ 1860, 1860, 679, 679, 1860, 679, 679, 679, 679, 679,
+ 679, 679, 679, 679, 679, 679, 679, 679, 679, 679,
+ 679, 174, 174, 1860, 1860, 1860, 1860, 174, 174, 1860,
+ 174, 684, 684, 1860, 684, 684, 684, 684, 684, 684,
+ 684, 684, 684, 684, 684, 684, 684, 684, 684, 684,
+ 684, 684, 684, 684, 283, 283, 1860, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 288, 288, 1860,
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 693, 693, 693, 693, 693, 693, 693, 693, 693, 693,
+ 693, 693, 693, 693, 693, 693, 693, 693, 693, 693,
+ 693, 693, 693, 694, 694, 694, 694, 694, 694, 694,
+ 694, 694, 694, 694, 694, 694, 694, 694, 1860, 694,
+ 694, 694, 694, 694, 694, 694, 701, 701, 701, 701,
+ 1860, 701, 1860, 1860, 701, 701, 701, 1860, 701, 1860,
+ 701, 701, 1860, 701, 701, 1860, 701, 702, 702, 702,
+ 702, 1860, 702, 1860, 1860, 702, 702, 702, 702, 702,
+ 1860, 702, 702, 1860, 702, 702, 1860, 702, 706, 1860,
+
+ 1860, 706, 706, 1860, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 708, 708, 1860, 708, 708, 708, 708, 708, 708, 708,
+ 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,
+ 708, 708, 708, 711, 711, 711, 711, 711, 711, 711,
+ 711, 711, 711, 711, 711, 711, 711, 711, 711, 711,
+ 711, 711, 711, 711, 711, 711, 712, 712, 712, 712,
+ 712, 712, 712, 712, 712, 712, 712, 712, 712, 712,
+ 712, 712, 712, 712, 712, 712, 712, 712, 712, 342,
+ 342, 342, 342, 1860, 342, 1860, 342, 342, 342, 342,
+
+ 342, 342, 342, 1860, 342, 1860, 342, 342, 1860, 342,
+ 347, 1860, 1860, 347, 347, 1860, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 169, 1860, 1860, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 841, 841, 841, 841, 841, 841,
+ 841, 841, 841, 841, 841, 841, 841, 841, 841, 841,
+ 841, 841, 841, 841, 841, 841, 841, 582, 582, 582,
+ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+
+ 206, 206, 206, 206, 1860, 1860, 1860, 206, 1860, 1860,
+ 206, 206, 206, 1860, 1860, 1860, 1860, 206, 206, 1860,
+ 206, 215, 215, 215, 215, 1860, 215, 1860, 215, 215,
+ 215, 215, 215, 215, 215, 1860, 215, 1860, 215, 215,
+ 1860, 215, 185, 185, 185, 185, 1860, 1860, 1860, 185,
+ 1860, 1860, 1860, 185, 185, 185, 1860, 1860, 1860, 185,
+ 185, 1860, 185, 224, 1860, 1860, 224, 224, 1860, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 779, 779, 779, 779, 779,
+ 779, 779, 779, 779, 779, 779, 779, 779, 779, 779,
+
+ 1860, 779, 779, 779, 779, 779, 779, 779, 569, 569,
+ 569, 569, 569, 569, 569, 569, 569, 569, 569, 569,
+ 569, 569, 569, 1860, 569, 569, 569, 569, 569, 569,
+ 569, 639, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 1860, 639, 639, 639,
+ 639, 639, 639, 639, 796, 796, 796, 796, 796, 796,
+ 796, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+ 796, 796, 796, 796, 796, 796, 796, 673, 673, 673,
+ 673, 1860, 673, 1860, 1860, 673, 673, 673, 1860, 673,
+ 1860, 673, 673, 1860, 673, 673, 1860, 673, 674, 674,
+
+ 674, 674, 1860, 674, 1860, 1860, 674, 674, 674, 674,
+ 674, 1860, 674, 674, 1860, 674, 674, 1860, 674, 679,
+ 679, 679, 679, 679, 1860, 679, 679, 679, 679, 679,
+ 679, 679, 679, 679, 679, 679, 679, 679, 679, 679,
+ 679, 174, 174, 1860, 1860, 1860, 1860, 174, 174, 1860,
+ 174, 684, 684, 1860, 684, 684, 684, 684, 684, 684,
+ 684, 684, 684, 684, 684, 684, 684, 684, 684, 684,
+ 684, 684, 684, 684, 283, 283, 1860, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 288, 288, 1860,
+
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 701, 701, 701, 701, 1860, 701, 1860, 1860, 701, 701,
+ 701, 1860, 701, 1860, 701, 701, 1860, 701, 701, 1860,
+ 701, 702, 702, 702, 702, 1860, 702, 1860, 1860, 702,
+ 702, 702, 702, 702, 1860, 702, 702, 1860, 702, 702,
+ 1860, 702, 706, 706, 706, 706, 706, 1860, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 708, 708, 1860, 708, 708, 708,
+ 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,
+
+ 708, 708, 708, 708, 708, 708, 708, 347, 1860, 1860,
+ 347, 347, 1860, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347, 347, 169,
+ 1860, 1860, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 841, 841, 841, 841, 841, 841,
+ 841, 841, 841, 841, 841, 841, 841, 841, 841, 841,
+ 841, 841, 841, 841, 841, 841, 841, 206, 206, 206,
+
+ 206, 1860, 1860, 1860, 206, 1860, 1860, 206, 206, 206,
+ 1860, 1860, 1860, 1860, 206, 206, 1860, 206, 956, 956,
+ 956, 956, 1860, 1860, 1860, 956, 1860, 1860, 956, 956,
+ 956, 1860, 1860, 1860, 1860, 956, 956, 1860, 956, 224,
+ 1860, 1860, 224, 224, 1860, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 779, 779, 779, 779, 779, 779, 779, 779, 779,
+ 779, 779, 779, 779, 779, 779, 1860, 779, 779, 779,
+ 779, 779, 779, 779, 569, 569, 569, 569, 569, 569,
+ 569, 569, 569, 569, 569, 569, 569, 569, 569, 1860,
+
+ 569, 569, 569, 569, 569, 569, 569, 992, 992, 992,
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ 992, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ 673, 673, 673, 673, 1860, 673, 1860, 1860, 673, 673,
+ 673, 1860, 673, 1860, 673, 673, 1860, 673, 673, 1860,
+ 673, 674, 674, 674, 674, 1860, 674, 1860, 1860, 674,
+ 674, 674, 674, 674, 1860, 674, 674, 1860, 674, 674,
+ 1860, 674, 283, 283, 1860, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 288, 288, 1860, 288, 288,
+
+ 288, 288, 288, 288, 288, 288, 288, 288, 288, 288,
+ 288, 288, 288, 288, 288, 288, 288, 288, 701, 701,
+ 701, 701, 1860, 701, 1860, 1860, 701, 701, 701, 1860,
+ 701, 1860, 701, 701, 1860, 701, 701, 1860, 701, 702,
+ 702, 702, 702, 1860, 702, 1860, 1860, 702, 702, 702,
+ 702, 702, 1860, 702, 702, 1860, 702, 702, 1860, 702,
+ 1048, 1048, 1048, 1048, 1860, 1860, 1860, 1048, 1860, 1860,
+ 1048, 1048, 1048, 1860, 1860, 1860, 1860, 1048, 1048, 1860,
+ 1048, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
+ 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
+
+ 1088, 1088, 1088, 1088, 1220, 1220, 1220, 1220, 1220, 1220,
+ 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220,
+ 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1268, 1268, 1268,
+ 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268,
+ 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268,
+ 1300, 1300, 1300, 1300, 1860, 1300, 1860, 1860, 1300, 1300,
+ 1300, 1300, 1300, 1860, 1300, 1300, 1860, 1300, 1300, 1300,
+ 1300, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303,
+ 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303,
+ 1303, 1303, 1303, 1303, 1304, 1304, 1304, 1304, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1304, 1860, 1304, 1860,
+ 1860, 1304, 1304, 1860, 1304, 1313, 1313, 1313, 1313, 1860,
+ 1313, 1860, 1860, 1860, 1860, 1860, 1313, 1313, 1860, 1313,
+ 1860, 1860, 1313, 1313, 1313, 1313, 1360, 1360, 1360, 1360,
+ 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360,
+ 1360, 1860, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1298,
+ 1298, 1298, 1298, 1860, 1298, 1860, 1860, 1298, 1298, 1298,
+ 1860, 1298, 1860, 1298, 1298, 1860, 1298, 1298, 1298, 1298,
+ 1380, 1380, 1380, 1380, 1860, 1380, 1860, 1860, 1380, 1380,
+ 1380, 1380, 1380, 1860, 1380, 1380, 1860, 1380, 1380, 1380,
+
+ 1380, 1311, 1311, 1311, 1311, 1860, 1311, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1311, 1860, 1860, 1311, 1311,
+ 1311, 1386, 1386, 1386, 1386, 1860, 1386, 1860, 1860, 1386,
+ 1386, 1386, 1860, 1386, 1860, 1386, 1386, 1860, 1386, 1386,
+ 1386, 1386, 1389, 1389, 1389, 1389, 1860, 1389, 1860, 1860,
+ 1389, 1389, 1389, 1389, 1389, 1860, 1389, 1389, 1860, 1389,
+ 1389, 1389, 1389, 1391, 1860, 1860, 1391, 1391, 1860, 1391,
+ 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391,
+ 1391, 1391, 1391, 1391, 1391, 1303, 1303, 1303, 1303, 1303,
+ 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303,
+
+ 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1304, 1304,
+ 1304, 1304, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1304, 1860, 1304, 1860, 1860, 1304, 1304, 1860, 1304, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
+ 283, 283, 174, 174, 1860, 1860, 1860, 1860, 174, 174,
+ 1860, 174, 1397, 1397, 1397, 1397, 1860, 1397, 1860, 1860,
+ 1397, 1397, 1397, 1860, 1397, 1860, 1397, 1397, 1860, 1397,
+ 1397, 1397, 1397, 1400, 1400, 1400, 1400, 1860, 1400, 1860,
+ 1860, 1400, 1400, 1400, 1400, 1400, 1860, 1400, 1400, 1860,
+
+ 1400, 1400, 1400, 1400, 701, 701, 701, 701, 1860, 701,
+ 1860, 1860, 701, 701, 701, 1860, 701, 1860, 701, 701,
+ 1860, 701, 701, 1860, 701, 1406, 1406, 1406, 1406, 1860,
+ 1406, 1860, 1860, 1406, 1406, 1406, 1406, 1406, 1860, 1406,
+ 1406, 1860, 1406, 1406, 1406, 1406, 702, 702, 702, 702,
+ 1860, 702, 1860, 1860, 702, 702, 702, 702, 702, 1860,
+ 702, 702, 1860, 702, 702, 1860, 702, 347, 1860, 1860,
+ 347, 347, 1860, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347, 347, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 206, 206, 206, 206, 1860, 1860,
+ 1860, 206, 1860, 1860, 206, 206, 206, 1860, 1860, 1860,
+ 1860, 206, 206, 1860, 206, 1048, 1048, 1048, 1048, 1860,
+ 1860, 1860, 1048, 1860, 1860, 1860, 1048, 1048, 1860, 1860,
+ 1860, 1860, 1048, 1048, 1860, 1048, 956, 956, 956, 956,
+ 1860, 1860, 1860, 956, 1860, 1860, 956, 956, 956, 1860,
+ 1860, 1860, 1860, 956, 956, 1860, 956, 215, 215, 215,
+
+ 215, 1860, 215, 1860, 215, 215, 215, 215, 215, 215,
+ 215, 1860, 215, 1860, 215, 215, 1860, 215, 224, 224,
+ 224, 224, 224, 1860, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+ 569, 569, 569, 569, 569, 569, 569, 569, 569, 569,
+ 569, 569, 569, 569, 569, 1860, 569, 569, 569, 569,
+ 569, 569, 569, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
+ 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
+ 1088, 1088, 1088, 1088, 1088, 1088, 779, 779, 779, 779,
+ 779, 779, 779, 779, 779, 779, 779, 779, 779, 779,
+
+ 779, 1860, 779, 779, 779, 779, 779, 779, 779, 1450,
+ 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450,
+ 1450, 1450, 1450, 1450, 1860, 1450, 1450, 1450, 1450, 1450,
+ 1450, 1450, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360,
+ 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1860, 1360, 1360,
+ 1360, 1360, 1360, 1360, 1360, 1378, 1378, 1378, 1378, 1860,
+ 1378, 1860, 1860, 1378, 1378, 1378, 1860, 1378, 1860, 1378,
+ 1378, 1860, 1378, 1378, 1378, 1378, 673, 673, 673, 673,
+ 1860, 673, 1860, 1860, 673, 673, 673, 1860, 673, 1860,
+ 673, 673, 1860, 673, 673, 1860, 673, 536, 536, 536,
+
+ 536, 1860, 536, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 536, 1860, 1860, 536, 536, 536, 674, 674, 674,
+ 674, 1860, 674, 1860, 1860, 674, 674, 674, 674, 674,
+ 1860, 674, 674, 1860, 674, 674, 1860, 674, 1380, 1380,
+ 1380, 1380, 1860, 1380, 1860, 1860, 1380, 1380, 1380, 1380,
+ 1380, 1860, 1380, 1380, 1860, 1380, 1380, 1380, 1380, 1386,
+ 1386, 1386, 1386, 1860, 1386, 1860, 1860, 1386, 1386, 1386,
+ 1860, 1386, 1860, 1386, 1386, 1860, 1386, 1386, 1386, 1386,
+ 1389, 1389, 1389, 1389, 1860, 1389, 1860, 1860, 1389, 1389,
+ 1389, 1389, 1389, 1860, 1389, 1389, 1860, 1389, 1389, 1389,
+
+ 1389, 1391, 1860, 1860, 1391, 1391, 1860, 1391, 1391, 1391,
+ 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391,
+ 1391, 1391, 1391, 1484, 1484, 1484, 1484, 1484, 1484, 1484,
+ 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484,
+ 1484, 1484, 1484, 1484, 1484, 174, 174, 1860, 1860, 1860,
+ 1860, 174, 174, 1860, 174, 1397, 1397, 1397, 1397, 1860,
+ 1397, 1860, 1860, 1397, 1397, 1397, 1860, 1397, 1860, 1397,
+ 1397, 1860, 1397, 1397, 1397, 1397, 1400, 1400, 1400, 1400,
+ 1860, 1400, 1860, 1860, 1400, 1400, 1400, 1400, 1400, 1860,
+ 1400, 1400, 1860, 1400, 1400, 1400, 1400, 1404, 1404, 1404,
+
+ 1404, 1860, 1404, 1860, 1860, 1404, 1404, 1404, 1860, 1404,
+ 1860, 1404, 1404, 1860, 1404, 1404, 1404, 1404, 701, 701,
+ 701, 701, 1860, 701, 1860, 1860, 701, 701, 701, 1860,
+ 701, 1860, 701, 701, 1860, 701, 701, 1860, 701, 558,
+ 558, 558, 558, 1860, 558, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 558, 1860, 1860, 558, 558, 558, 702,
+ 702, 702, 702, 1860, 702, 1860, 1860, 702, 702, 702,
+ 702, 702, 1860, 702, 702, 1860, 702, 702, 1860, 702,
+ 1406, 1406, 1406, 1406, 1860, 1406, 1860, 1860, 1406, 1406,
+ 1406, 1406, 1406, 1860, 1406, 1406, 1860, 1406, 1406, 1406,
+
+ 1406, 347, 347, 347, 347, 347, 1860, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 206, 206, 206, 206, 1860,
+ 1860, 1860, 206, 1860, 1860, 206, 206, 206, 1860, 1860,
+ 1860, 1860, 206, 206, 1860, 206, 1048, 1048, 1048, 1048,
+ 1860, 1860, 1860, 1048, 1860, 1860, 1860, 1048, 1048, 1860,
+ 1860, 1860, 1860, 1048, 1048, 1860, 1048, 956, 956, 956,
+ 956, 1860, 1860, 1860, 956, 1860, 1860, 956, 956, 956,
+
+ 1860, 1860, 1860, 1860, 956, 956, 1860, 956, 1507, 1507,
+ 1507, 1507, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1507, 1507, 1860, 1860, 1860, 1507, 1507, 1507, 1507, 1509,
+ 1509, 1509, 1509, 1860, 1860, 1860, 1509, 1860, 1860, 1860,
+ 1509, 1509, 1509, 1860, 1860, 1860, 1509, 1509, 1509, 1509,
+ 215, 215, 215, 215, 1860, 215, 1860, 215, 215, 215,
+ 215, 215, 215, 215, 1860, 215, 1860, 215, 215, 1860,
+ 215, 185, 185, 185, 185, 1860, 1860, 1860, 185, 1860,
+ 1860, 1860, 185, 185, 185, 185, 1860, 1860, 185, 185,
+ 1860, 185, 224, 224, 224, 224, 224, 1860, 224, 224,
+
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 569, 569, 569, 569, 569, 569,
+ 569, 569, 569, 569, 569, 569, 569, 569, 569, 1860,
+ 569, 569, 569, 569, 569, 569, 569, 1088, 1088, 1088,
+ 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
+ 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
+ 779, 779, 779, 779, 779, 779, 779, 779, 779, 779,
+ 779, 779, 779, 779, 779, 1860, 779, 779, 779, 779,
+ 779, 779, 779, 1450, 1450, 1450, 1450, 1450, 1450, 1450,
+ 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1860, 1450,
+
+ 1450, 1450, 1450, 1450, 1450, 1450, 1360, 1360, 1360, 1360,
+ 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360,
+ 1360, 1860, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 673,
+ 673, 673, 673, 1860, 673, 1860, 1860, 673, 673, 673,
+ 1860, 673, 1860, 673, 673, 1860, 673, 673, 1860, 673,
+ 1378, 1378, 1378, 1378, 1860, 1378, 1860, 1860, 1378, 1378,
+ 1378, 1860, 1378, 1860, 1378, 1378, 1860, 1378, 1378, 1378,
+ 1378, 674, 674, 674, 674, 1860, 674, 1860, 1860, 674,
+ 674, 674, 674, 674, 1860, 674, 674, 1860, 674, 674,
+ 1860, 674, 1391, 1391, 1391, 1391, 1391, 1860, 1391, 1391,
+
+ 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391,
+ 1391, 1391, 1391, 1391, 1553, 1553, 1553, 1553, 1553, 1553,
+ 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
+ 1553, 1553, 1553, 1553, 1553, 1553, 1484, 1484, 1484, 1484,
+ 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484,
+ 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 701, 701,
+ 701, 701, 1860, 701, 1860, 1860, 701, 701, 701, 1860,
+ 701, 1860, 701, 701, 1860, 701, 701, 1860, 701, 1404,
+ 1404, 1404, 1404, 1860, 1404, 1860, 1860, 1404, 1404, 1404,
+ 1860, 1404, 1860, 1404, 1404, 1860, 1404, 1404, 1404, 1404,
+
+ 347, 347, 347, 347, 347, 1860, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 1571, 1571, 1571, 1571, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1571, 1571, 1860, 1860, 1860, 1860, 1571,
+ 1571, 1860, 1571, 1574, 1860, 1860, 1574, 1574, 1860, 1574,
+ 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574,
+ 1574, 1574, 1574, 1574, 1574, 1579, 1579, 1579, 1579, 1860,
+ 1860, 1860, 1579, 1860, 1860, 1860, 1579, 1579, 1579, 1860,
+ 1860, 1860, 1579, 1579, 1860, 1579, 1581, 1581, 1581, 1581,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1581, 1581,
+
+ 1860, 1860, 1860, 1581, 1581, 1581, 1581, 1583, 1583, 1583,
+ 1583, 1860, 1860, 1860, 1583, 1860, 1860, 1860, 1583, 1583,
+ 1583, 1860, 1860, 1860, 1583, 1583, 1583, 1583, 1584, 1584,
+ 1584, 1584, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1584, 1860, 1584, 1860, 1860, 1584, 1584, 1584, 1584, 1587,
+ 1587, 1587, 1587, 1860, 1860, 1860, 1587, 1860, 1860, 1860,
+ 1587, 1587, 1587, 1587, 1860, 1860, 1587, 1587, 1587, 1587,
+ 224, 224, 224, 224, 224, 1860, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
+
+ 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
+ 1088, 1088, 1088, 1088, 1088, 1450, 1450, 1450, 1450, 1450,
+ 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450,
+ 1860, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1360, 1360,
+ 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360,
+ 1360, 1360, 1360, 1860, 1360, 1360, 1360, 1360, 1360, 1360,
+ 1360, 673, 673, 673, 673, 1860, 673, 1860, 1860, 673,
+ 673, 673, 1860, 673, 1860, 673, 673, 1860, 673, 673,
+ 1860, 673, 674, 674, 674, 674, 1860, 674, 1860, 1860,
+ 674, 674, 674, 674, 674, 1860, 674, 674, 1860, 674,
+
+ 674, 1860, 674, 1632, 1632, 1632, 1632, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1632, 1632, 1860, 1860, 1860, 1860,
+ 1632, 1632, 1860, 1632, 1635, 1860, 1860, 1635, 1635, 1860,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1640, 1640, 1640, 1640,
+ 1860, 1860, 1860, 1640, 1860, 1860, 1860, 1640, 1640, 1640,
+ 1860, 1860, 1860, 1640, 1640, 1860, 1640, 1643, 1643, 1643,
+ 1643, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1643, 1643,
+ 1860, 1643, 1860, 1860, 1643, 1643, 1860, 1643, 1646, 1860,
+ 1860, 1646, 1646, 1860, 1646, 1646, 1646, 1646, 1646, 1646,
+
+ 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646,
+ 1651, 1651, 1651, 1651, 1860, 1860, 1860, 1651, 1860, 1860,
+ 1860, 1651, 1651, 1651, 1651, 1860, 1860, 1651, 1651, 1860,
+ 1651, 1751, 1751, 1751, 1751, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1751, 1860, 1860, 1860, 1860, 1751, 1751,
+ 1751, 1751, 1758, 1758, 1758, 1758, 1860, 1860, 1860, 1758,
+ 1860, 1860, 1860, 1758, 1758, 1758, 1860, 1860, 1860, 1758,
+ 1758, 1758, 1758, 1780, 1780, 1780, 1780, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1780, 1780, 1860, 1860, 1860, 1860,
+ 1780, 1780, 1860, 1780, 1783, 1860, 1860, 1783, 1783, 1860,
+
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1786, 1786, 1786, 1786,
+ 1786, 1860, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1791, 1791,
+ 1791, 1791, 1860, 1860, 1860, 1791, 1860, 1860, 1860, 1791,
+ 1791, 1791, 1860, 1860, 1860, 1791, 1791, 1860, 1791, 1793,
+ 1793, 1793, 1793, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1793, 1860, 1793, 1860, 1860, 1793, 1793, 1793, 1793,
+ 1795, 1795, 1795, 1795, 1860, 1860, 1860, 1795, 1860, 1860,
+ 1860, 1795, 1795, 1795, 1795, 1860, 1860, 1795, 1795, 1795,
+
+ 1795, 1813, 1813, 1813, 1813, 1813, 1860, 1813, 1813, 1813,
+ 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813,
+ 1813, 1813, 1813, 1816, 1816, 1816, 1816, 1816, 1860, 1816,
+ 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816,
+ 1816, 1816, 1816, 1816, 1816, 1823, 1823, 1860, 1860, 1860,
+ 1860, 1823, 1823, 1860, 1823, 1825, 1860, 1860, 1825, 1825,
+ 1860, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825,
+ 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1827, 1827, 1827,
+ 1827, 1860, 1860, 1860, 1827, 1860, 1860, 1860, 1827, 1827,
+ 1827, 1860, 1860, 1860, 1827, 1827, 1860, 1827, 1854, 1854,
+
+ 1854, 1854, 1854, 1860, 1854, 1854, 1854, 1854, 1854, 1854,
+ 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854,
+ 1859, 1859, 1859, 1859, 1859, 1860, 1859, 1859, 1859, 1859,
+ 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859,
+ 1859, 1859, 33, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860
+ } ;
+
+static yyconst flex_int16_t yy_chk[27311] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 35, 35, 35, 35, 36, 36, 36, 36, 57,
+ 71, 253, 40, 70, 35, 55, 56, 66, 36, 10,
+ 40, 40, 10, 1, 37, 37, 37, 37, 829, 46,
+ 46, 46, 46, 57, 71, 253, 70, 37, 55, 56,
+ 66, 44, 46, 796, 10, 46, 1, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 10, 44,
+ 67, 74, 69, 2, 780, 47, 47, 47, 47, 50,
+
+ 50, 50, 50, 58, 69, 58, 113, 115, 47, 744,
+ 2, 47, 44, 67, 74, 50, 69, 2, 77, 77,
+ 77, 77, 339, 172, 714, 339, 58, 69, 58, 113,
+ 115, 77, 172, 2, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+
+ 3, 4, 4, 4, 4, 23, 712, 420, 23, 25,
+ 75, 82, 25, 337, 75, 78, 78, 78, 78, 82,
+ 82, 4, 337, 4, 711, 4, 4, 4, 78, 4,
+ 23, 420, 4, 75, 25, 100, 4, 75, 4, 4,
+ 4, 694, 662, 100, 100, 4, 1071, 4, 128, 4,
+ 4, 4, 1071, 4, 23, 4, 128, 128, 25, 4,
+ 660, 4, 4, 4, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 51, 51, 51, 51, 179,
+ 567, 51, 233, 241, 51, 51, 242, 65, 566, 51,
+
+ 51, 51, 65, 31, 65, 422, 31, 5, 60, 60,
+ 60, 60, 179, 140, 60, 233, 241, 60, 60, 242,
+ 65, 140, 140, 734, 60, 65, 734, 65, 31, 422,
+ 5, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 31, 68, 73, 73, 231, 6, 565, 68,
+ 146, 219, 219, 553, 68, 231, 73, 150, 146, 146,
+ 43, 43, 43, 43, 6, 150, 150, 68, 73, 73,
+ 231, 6, 68, 43, 552, 219, 219, 68, 231, 73,
+ 89, 89, 89, 89, 545, 43, 89, 6, 7, 7,
+
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 43,
+ 72, 218, 79, 79, 79, 79, 533, 108, 108, 108,
+ 108, 275, 218, 527, 72, 79, 72, 551, 526, 72,
+ 108, 7, 173, 449, 72, 218, 88, 88, 88, 88,
+ 173, 173, 88, 551, 275, 218, 104, 72, 87, 72,
+ 88, 88, 72, 103, 7, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 87, 104, 221, 446,
+ 103, 8, 109, 109, 109, 109, 442, 440, 110, 110,
+
+ 110, 110, 221, 221, 256, 109, 256, 439, 8, 87,
+ 104, 110, 221, 103, 161, 8, 116, 116, 116, 116,
+ 161, 161, 161, 161, 438, 221, 221, 161, 256, 116,
+ 256, 8, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 11,
+
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 117, 117, 117, 117, 11, 252, 252, 184, 192, 193,
+ 184, 192, 193, 117, 118, 118, 118, 118, 85, 85,
+ 85, 85, 11, 184, 192, 193, 1541, 118, 11, 252,
+ 252, 85, 1541, 437, 91, 91, 91, 91, 429, 416,
+ 91, 107, 133, 85, 180, 11, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 85, 91, 107,
+ 133, 12, 12, 415, 180, 258, 258, 123, 123, 123,
+
+ 123, 124, 124, 124, 124, 114, 114, 114, 114, 12,
+ 123, 91, 107, 133, 124, 12, 12, 180, 114, 258,
+ 258, 265, 265, 265, 265, 195, 195, 195, 195, 336,
+ 114, 145, 12, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 114, 125, 125, 125, 125, 145,
+ 195, 276, 234, 335, 154, 154, 154, 154, 125, 277,
+ 234, 298, 120, 120, 120, 120, 13, 154, 155, 155,
+ 155, 155, 145, 195, 276, 120, 234, 268, 268, 268,
+ 268, 155, 277, 234, 298, 130, 142, 120, 333, 13,
+
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 120, 130, 142, 303, 235, 14, 1082, 320, 235,
+ 1082, 164, 164, 164, 164, 165, 165, 165, 165, 132,
+ 132, 132, 132, 14, 164, 130, 142, 303, 165, 235,
+ 14, 288, 132, 235, 271, 271, 271, 271, 313, 288,
+ 288, 149, 153, 306, 132, 283, 14, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 132, 149,
+ 153, 243, 15, 419, 419, 419, 419, 243, 182, 182,
+
+ 182, 182, 185, 185, 185, 185, 178, 178, 178, 178,
+ 15, 182, 149, 153, 182, 243, 15, 287, 185, 178,
+ 287, 243, 529, 529, 529, 529, 532, 532, 532, 532,
+ 287, 178, 264, 15, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 178, 189, 230, 214, 16,
+ 16, 214, 191, 191, 191, 191, 189, 230, 189, 197,
+ 197, 197, 197, 312, 214, 191, 225, 16, 191, 225,
+ 189, 230, 693, 16, 16, 197, 307, 263, 207, 189,
+ 230, 189, 225, 174, 307, 307, 312, 170, 693, 166,
+
+ 16, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 198, 198, 198, 198, 17, 199, 199, 199,
+ 199, 200, 200, 200, 200, 319, 260, 151, 198, 147,
+ 200, 200, 260, 199, 17, 141, 200, 200, 314, 139,
+ 17, 129, 281, 281, 281, 281, 314, 314, 319, 127,
+ 260, 216, 216, 216, 216, 281, 260, 17, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 201,
+ 201, 201, 201, 18, 18, 201, 216, 338, 201, 201,
+
+ 261, 247, 261, 201, 201, 201, 202, 202, 202, 202,
+ 247, 18, 102, 99, 86, 202, 202, 18, 18, 216,
+ 338, 83, 202, 81, 261, 247, 261, 663, 663, 663,
+ 663, 41, 39, 247, 18, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 212, 212, 212, 212,
+ 213, 213, 213, 213, 220, 222, 257, 33, 345, 345,
+ 257, 1183, 212, 380, 1183, 220, 213, 222, 19, 0,
+ 266, 266, 266, 266, 282, 282, 282, 282, 220, 222,
+ 257, 345, 345, 0, 257, 266, 380, 282, 220, 0,
+
+ 222, 19, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 229, 238, 239, 244, 250, 20, 0,
+ 229, 251, 249, 322, 239, 374, 322, 229, 239, 250,
+ 374, 238, 244, 249, 251, 20, 322, 229, 238, 239,
+ 244, 250, 20, 229, 0, 251, 249, 239, 0, 374,
+ 229, 239, 250, 374, 238, 244, 249, 251, 20, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 232, 245, 236, 248, 232, 371, 236, 254, 371, 0,
+
+ 232, 245, 245, 0, 393, 232, 236, 248, 236, 254,
+ 340, 236, 21, 340, 232, 245, 236, 248, 232, 371,
+ 236, 254, 371, 232, 245, 245, 340, 393, 232, 236,
+ 248, 236, 254, 0, 236, 21, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 237, 246, 246,
+ 237, 237, 22, 255, 435, 259, 461, 292, 292, 292,
+ 292, 378, 237, 378, 246, 359, 359, 255, 259, 22,
+ 292, 237, 246, 246, 237, 237, 22, 255, 435, 259,
+ 461, 0, 0, 0, 378, 237, 378, 246, 359, 359,
+
+ 255, 259, 22, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 267, 267, 267, 267, 376, 376,
+ 267, 394, 0, 0, 293, 293, 293, 293, 267, 267,
+ 0, 0, 262, 262, 262, 262, 27, 293, 0, 0,
+ 348, 376, 376, 348, 394, 262, 272, 272, 272, 272,
+ 0, 0, 279, 279, 279, 279, 348, 262, 279, 27,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 262, 272, 278, 289, 375, 28, 0, 279, 328,
+
+ 375, 398, 289, 289, 0, 328, 328, 328, 328, 432,
+ 278, 289, 328, 28, 1184, 272, 428, 1184, 375, 428,
+ 28, 279, 0, 375, 398, 341, 341, 341, 341, 428,
+ 1339, 0, 432, 1339, 278, 289, 28, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 300, 304,
+ 341, 344, 358, 358, 344, 344, 360, 360, 358, 441,
+ 360, 0, 441, 0, 502, 300, 304, 368, 368, 0,
+ 29, 29, 441, 341, 344, 358, 358, 344, 344, 360,
+ 360, 358, 0, 360, 350, 350, 350, 350, 502, 300,
+
+ 304, 368, 368, 29, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 135, 135, 135, 135, 350,
+ 30, 0, 382, 0, 382, 364, 364, 364, 135, 364,
+ 381, 381, 462, 136, 136, 136, 136, 30, 30, 135,
+ 0, 0, 350, 0, 30, 382, 136, 382, 364, 364,
+ 364, 0, 364, 381, 381, 462, 0, 136, 400, 400,
+ 30, 38, 0, 135, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 136, 400, 400, 137, 137, 137, 137, 377, 0,
+
+ 390, 379, 390, 377, 379, 385, 385, 137, 291, 144,
+ 144, 144, 144, 38, 38, 503, 291, 291, 137, 0,
+ 0, 377, 144, 390, 379, 390, 377, 379, 385, 385,
+ 0, 0, 0, 144, 144, 543, 38, 42, 291, 503,
+ 42, 42, 137, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 144, 144, 543,
+ 332, 291, 62, 62, 62, 62, 332, 332, 332, 332,
+ 497, 542, 403, 332, 0, 62, 0, 0, 62, 42,
+ 42, 0, 290, 290, 290, 290, 403, 62, 401, 0,
+ 0, 332, 0, 497, 542, 290, 403, 62, 367, 367,
+
+ 367, 367, 42, 45, 45, 45, 45, 290, 45, 403,
+ 401, 62, 45, 45, 332, 369, 45, 45, 45, 45,
+ 62, 0, 0, 367, 63, 63, 63, 63, 369, 45,
+ 0, 290, 0, 0, 401, 0, 0, 63, 45, 369,
+ 63, 297, 297, 297, 297, 45, 45, 367, 0, 63,
+ 0, 369, 0, 45, 297, 93, 93, 93, 93, 63,
+ 392, 45, 48, 48, 48, 48, 297, 48, 93, 392,
+ 0, 48, 48, 63, 370, 48, 48, 48, 48, 93,
+ 0, 0, 63, 93, 392, 0, 0, 370, 48, 544,
+ 297, 0, 392, 301, 301, 301, 301, 48, 370, 352,
+
+ 352, 352, 352, 93, 48, 48, 301, 93, 352, 352,
+ 370, 0, 48, 544, 352, 352, 0, 301, 0, 0,
+ 48, 49, 0, 627, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 301, 384, 94, 94, 94, 94, 627, 0, 95,
+ 95, 95, 95, 384, 0, 570, 94, 206, 206, 206,
+ 206, 0, 95, 49, 49, 0, 384, 94, 388, 645,
+ 387, 94, 383, 95, 0, 388, 384, 95, 570, 206,
+ 391, 206, 0, 387, 383, 391, 49, 52, 52, 52,
+ 52, 94, 388, 645, 387, 94, 383, 95, 388, 399,
+
+ 52, 95, 399, 206, 391, 206, 387, 383, 391, 52,
+ 0, 52, 402, 52, 682, 402, 417, 417, 417, 417,
+ 0, 163, 52, 399, 0, 0, 399, 163, 163, 163,
+ 163, 417, 0, 52, 163, 52, 402, 52, 682, 402,
+ 488, 208, 208, 208, 208, 52, 53, 53, 53, 53,
+ 163, 53, 453, 0, 0, 53, 53, 53, 53, 53,
+ 53, 453, 53, 208, 53, 208, 210, 210, 210, 210,
+ 488, 386, 395, 163, 386, 208, 453, 395, 302, 302,
+ 302, 302, 53, 0, 453, 425, 404, 208, 210, 208,
+ 210, 302, 0, 488, 386, 0, 395, 386, 208, 0,
+
+ 404, 395, 302, 425, 0, 53, 54, 54, 54, 54,
+ 404, 54, 210, 0, 210, 54, 54, 54, 54, 54,
+ 54, 0, 54, 404, 54, 59, 302, 425, 59, 59,
+ 0, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 389, 504, 0, 0, 209,
+ 209, 209, 209, 211, 211, 211, 211, 389, 504, 305,
+ 305, 305, 305, 227, 227, 227, 227, 59, 59, 389,
+ 504, 209, 305, 209, 0, 211, 227, 211, 410, 227,
+ 389, 504, 209, 305, 305, 0, 410, 211, 227, 0,
+ 59, 61, 61, 61, 61, 209, 0, 209, 227, 211,
+
+ 407, 211, 410, 407, 0, 209, 0, 305, 305, 410,
+ 211, 61, 227, 61, 396, 61, 61, 61, 689, 61,
+ 522, 227, 61, 397, 407, 396, 61, 407, 61, 61,
+ 61, 0, 522, 397, 0, 61, 0, 61, 396, 61,
+ 61, 61, 689, 61, 522, 61, 0, 397, 396, 61,
+ 0, 61, 61, 61, 80, 522, 397, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 405, 409, 406, 408, 408, 0,
+ 0, 406, 411, 456, 0, 405, 409, 412, 412, 716,
+ 353, 353, 353, 353, 456, 411, 80, 80, 405, 409,
+
+ 406, 408, 408, 353, 406, 0, 411, 456, 405, 409,
+ 0, 412, 412, 716, 0, 0, 353, 456, 411, 80,
+ 84, 0, 0, 84, 84, 353, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 353, 413, 414, 414, 414, 414, 467, 467, 353, 0,
+ 0, 0, 470, 0, 413, 421, 421, 421, 421, 0,
+ 0, 470, 84, 84, 571, 413, 546, 414, 421, 546,
+ 467, 467, 434, 434, 434, 434, 470, 413, 434, 546,
+ 431, 431, 431, 431, 470, 84, 90, 571, 0, 90,
+ 90, 414, 90, 90, 90, 90, 90, 90, 90, 90,
+
+ 90, 90, 90, 90, 90, 90, 0, 434, 240, 240,
+ 240, 240, 273, 273, 273, 273, 431, 478, 0, 431,
+ 0, 240, 0, 0, 240, 273, 0, 478, 90, 90,
+ 434, 0, 724, 240, 0, 0, 273, 0, 0, 431,
+ 273, 478, 431, 240, 454, 274, 274, 274, 274, 454,
+ 478, 90, 106, 106, 106, 106, 724, 240, 274, 452,
+ 273, 452, 580, 455, 273, 106, 240, 454, 455, 274,
+ 0, 466, 454, 274, 466, 471, 106, 106, 471, 444,
+ 106, 444, 452, 0, 452, 580, 455, 444, 444, 444,
+ 444, 455, 0, 274, 444, 466, 0, 274, 466, 471,
+
+ 106, 106, 471, 0, 106, 111, 111, 581, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 111, 111,
+ 111, 111, 111, 111, 111, 111, 472, 479, 479, 472,
+ 581, 505, 0, 468, 505, 451, 451, 451, 451, 0,
+ 523, 523, 523, 523, 0, 0, 468, 0, 111, 0,
+ 472, 479, 479, 472, 0, 505, 523, 468, 505, 0,
+ 0, 354, 354, 354, 354, 424, 424, 424, 424, 468,
+ 451, 111, 112, 112, 354, 112, 112, 112, 112, 112,
+ 112, 112, 112, 112, 112, 112, 112, 354, 0, 112,
+ 112, 112, 112, 451, 483, 0, 354, 483, 469, 0,
+
+ 424, 424, 473, 473, 473, 473, 0, 0, 0, 469,
+ 469, 354, 597, 564, 0, 112, 564, 483, 473, 354,
+ 483, 0, 469, 424, 424, 0, 564, 0, 355, 355,
+ 355, 355, 469, 469, 0, 597, 0, 473, 112, 119,
+ 119, 355, 119, 119, 119, 119, 119, 119, 119, 119,
+ 119, 119, 119, 119, 355, 0, 119, 476, 119, 119,
+ 473, 626, 0, 355, 474, 474, 474, 474, 476, 475,
+ 475, 475, 475, 524, 524, 524, 524, 484, 355, 484,
+ 474, 476, 119, 0, 626, 475, 355, 0, 0, 524,
+ 568, 476, 0, 568, 0, 463, 463, 463, 463, 474,
+
+ 484, 0, 484, 568, 475, 119, 121, 121, 463, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 463, 474, 121, 482, 121, 121, 475, 485, 555,
+ 463, 555, 485, 486, 487, 489, 0, 482, 486, 492,
+ 669, 121, 492, 487, 493, 463, 489, 493, 482, 121,
+ 0, 485, 555, 463, 555, 485, 0, 486, 487, 489,
+ 482, 486, 492, 669, 121, 492, 487, 493, 0, 489,
+ 493, 0, 121, 148, 516, 516, 148, 148, 0, 148,
+ 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
+ 148, 148, 148, 0, 490, 491, 494, 495, 516, 516,
+
+ 490, 491, 496, 498, 670, 496, 495, 494, 498, 464,
+ 464, 464, 464, 677, 677, 148, 148, 490, 491, 0,
+ 494, 495, 464, 490, 491, 496, 498, 670, 496, 495,
+ 494, 498, 0, 0, 0, 464, 677, 677, 148, 152,
+ 0, 681, 152, 152, 464, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152, 152, 464,
+ 499, 506, 0, 500, 681, 507, 508, 464, 500, 499,
+ 506, 477, 477, 477, 477, 0, 0, 0, 507, 508,
+ 477, 152, 152, 0, 499, 506, 500, 0, 0, 507,
+ 508, 500, 499, 506, 0, 0, 477, 501, 501, 501,
+
+ 501, 507, 508, 0, 152, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+ 477, 511, 158, 158, 158, 158, 512, 514, 630, 0,
+ 501, 513, 514, 0, 511, 630, 512, 590, 509, 509,
+ 509, 509, 513, 518, 518, 511, 0, 590, 158, 894,
+ 512, 514, 630, 501, 894, 513, 514, 511, 630, 512,
+ 894, 590, 894, 509, 515, 513, 0, 518, 518, 515,
+ 590, 158, 159, 159, 159, 159, 159, 159, 159, 159,
+ 159, 159, 159, 159, 159, 159, 159, 509, 515, 159,
+ 159, 159, 159, 515, 519, 525, 525, 525, 525, 519,
+
+ 591, 520, 0, 531, 531, 531, 531, 159, 591, 683,
+ 690, 525, 0, 0, 0, 159, 531, 520, 519, 1318,
+ 1318, 1318, 1318, 519, 591, 520, 554, 554, 554, 554,
+ 159, 591, 683, 690, 517, 517, 517, 517, 159, 160,
+ 520, 0, 160, 160, 160, 160, 160, 160, 160, 160,
+ 160, 160, 160, 160, 160, 160, 160, 160, 160, 517,
+ 0, 554, 517, 536, 536, 536, 536, 0, 540, 517,
+ 540, 562, 684, 540, 562, 684, 521, 521, 521, 521,
+ 536, 160, 160, 517, 554, 684, 517, 633, 633, 633,
+ 633, 540, 517, 540, 562, 0, 540, 562, 0, 0,
+
+ 0, 521, 0, 633, 160, 162, 0, 0, 162, 162,
+ 0, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 521, 593, 530, 530, 530,
+ 530, 594, 534, 534, 534, 534, 593, 594, 0, 547,
+ 547, 547, 547, 0, 530, 696, 0, 162, 162, 534,
+ 593, 0, 530, 629, 0, 594, 547, 534, 629, 593,
+ 697, 594, 530, 548, 548, 548, 548, 534, 696, 530,
+ 162, 186, 186, 186, 186, 547, 530, 629, 547, 0,
+ 0, 534, 629, 697, 186, 530, 558, 558, 558, 558,
+ 534, 0, 599, 186, 599, 186, 0, 186, 547, 548,
+
+ 767, 547, 548, 558, 605, 0, 186, 634, 634, 634,
+ 634, 600, 600, 600, 600, 605, 599, 186, 599, 186,
+ 600, 186, 548, 634, 767, 548, 0, 600, 605, 186,
+ 187, 187, 187, 187, 685, 187, 0, 685, 605, 187,
+ 187, 187, 187, 187, 187, 0, 187, 685, 187, 188,
+ 188, 188, 188, 686, 188, 0, 686, 0, 188, 188,
+ 188, 188, 188, 188, 604, 188, 686, 188, 574, 574,
+ 574, 574, 604, 188, 0, 0, 0, 574, 601, 601,
+ 601, 601, 0, 602, 602, 602, 602, 601, 604, 0,
+ 0, 0, 602, 687, 601, 604, 0, 188, 190, 602,
+
+ 687, 190, 190, 574, 190, 190, 190, 190, 190, 190,
+ 190, 190, 190, 190, 190, 190, 190, 190, 575, 575,
+ 575, 575, 631, 641, 687, 641, 574, 575, 631, 598,
+ 598, 598, 598, 768, 603, 603, 603, 603, 0, 0,
+ 190, 190, 575, 603, 0, 598, 631, 641, 0, 641,
+ 603, 0, 631, 608, 608, 608, 608, 768, 584, 584,
+ 584, 584, 608, 190, 194, 598, 575, 194, 194, 194,
+ 194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+ 194, 194, 194, 194, 584, 0, 0, 0, 598, 708,
+ 608, 650, 708, 584, 610, 610, 610, 610, 635, 635,
+
+ 635, 635, 708, 610, 650, 0, 194, 194, 584, 613,
+ 613, 613, 613, 608, 635, 650, 584, 0, 613, 0,
+ 0, 813, 609, 609, 609, 609, 0, 650, 610, 194,
+ 196, 609, 813, 196, 196, 196, 196, 196, 196, 196,
+ 196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+ 609, 610, 535, 535, 535, 535, 813, 0, 556, 556,
+ 556, 556, 617, 617, 617, 617, 643, 0, 643, 535,
+ 0, 617, 196, 196, 609, 556, 0, 535, 582, 582,
+ 582, 582, 617, 556, 0, 0, 0, 535, 632, 0,
+ 643, 582, 643, 556, 535, 196, 203, 203, 203, 203,
+
+ 556, 535, 0, 632, 582, 644, 617, 556, 688, 203,
+ 535, 0, 632, 582, 709, 644, 556, 709, 203, 651,
+ 203, 814, 203, 0, 688, 651, 632, 709, 582, 644,
+ 0, 203, 611, 611, 611, 611, 582, 815, 644, 704,
+ 704, 611, 203, 651, 203, 814, 203, 688, 651, 715,
+ 592, 592, 592, 592, 203, 215, 215, 215, 215, 0,
+ 215, 815, 704, 704, 215, 215, 215, 215, 215, 215,
+ 611, 215, 715, 215, 217, 217, 217, 217, 592, 217,
+ 0, 0, 592, 217, 217, 217, 217, 217, 217, 0,
+ 217, 0, 217, 611, 655, 0, 217, 628, 628, 628,
+
+ 628, 710, 592, 655, 710, 592, 612, 612, 612, 612,
+ 614, 614, 614, 614, 710, 612, 0, 812, 655, 614,
+ 217, 223, 812, 628, 223, 223, 655, 223, 223, 223,
+ 223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
+ 223, 0, 653, 0, 612, 653, 812, 628, 614, 636,
+ 636, 636, 636, 616, 616, 616, 616, 583, 583, 583,
+ 583, 725, 616, 223, 223, 636, 653, 612, 0, 653,
+ 583, 614, 624, 624, 624, 624, 623, 623, 623, 623,
+ 0, 624, 0, 583, 725, 623, 223, 224, 0, 616,
+ 224, 224, 583, 224, 224, 224, 224, 224, 224, 224,
+
+ 224, 224, 224, 224, 224, 224, 224, 583, 557, 557,
+ 557, 557, 616, 713, 0, 583, 713, 623, 741, 618,
+ 618, 618, 618, 0, 0, 557, 713, 0, 618, 224,
+ 224, 0, 0, 557, 758, 585, 585, 585, 585, 618,
+ 623, 741, 758, 557, 637, 637, 637, 637, 585, 695,
+ 557, 695, 224, 226, 226, 226, 226, 557, 758, 654,
+ 637, 585, 0, 618, 654, 758, 557, 0, 0, 0,
+ 585, 0, 695, 226, 695, 226, 652, 226, 226, 226,
+ 821, 226, 732, 654, 226, 585, 652, 654, 226, 652,
+ 226, 226, 226, 585, 676, 732, 0, 226, 676, 226,
+
+ 652, 226, 226, 226, 821, 226, 732, 226, 0, 652,
+ 0, 226, 652, 226, 226, 226, 269, 676, 732, 269,
+ 269, 676, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 269, 750, 0, 769, 619,
+ 619, 619, 619, 0, 615, 615, 615, 615, 619, 750,
+ 0, 0, 0, 615, 657, 657, 657, 657, 269, 269,
+ 750, 769, 0, 619, 622, 622, 622, 622, 0, 0,
+ 657, 0, 750, 622, 625, 625, 625, 625, 0, 615,
+ 0, 269, 270, 625, 622, 270, 270, 619, 270, 270,
+ 270, 270, 270, 270, 270, 270, 270, 270, 270, 270,
+
+ 270, 270, 615, 770, 621, 621, 621, 621, 622, 646,
+ 0, 625, 646, 621, 642, 642, 642, 642, 770, 647,
+ 647, 647, 647, 646, 270, 270, 0, 770, 621, 656,
+ 656, 656, 656, 646, 625, 647, 646, 0, 0, 719,
+ 642, 770, 719, 789, 647, 831, 646, 270, 280, 280,
+ 280, 280, 621, 0, 647, 656, 763, 666, 666, 666,
+ 666, 280, 719, 0, 642, 719, 789, 763, 647, 831,
+ 0, 736, 280, 280, 666, 0, 280, 647, 811, 656,
+ 763, 811, 658, 658, 658, 658, 659, 659, 659, 659,
+ 763, 811, 736, 666, 799, 736, 280, 280, 658, 737,
+
+ 280, 284, 659, 284, 284, 737, 284, 751, 751, 284,
+ 284, 284, 284, 284, 284, 736, 666, 799, 1322, 1322,
+ 1322, 1322, 737, 0, 665, 665, 665, 665, 737, 0,
+ 751, 751, 284, 284, 284, 284, 284, 284, 284, 285,
+ 285, 665, 285, 285, 285, 285, 285, 285, 285, 285,
+ 285, 285, 285, 285, 0, 285, 285, 285, 285, 285,
+ 738, 0, 0, 665, 672, 672, 672, 672, 673, 673,
+ 673, 673, 680, 680, 680, 680, 746, 738, 746, 765,
+ 765, 672, 285, 0, 738, 673, 665, 0, 0, 680,
+ 0, 698, 698, 698, 698, 1393, 1393, 1393, 1393, 746,
+
+ 738, 746, 765, 765, 800, 285, 286, 286, 698, 286,
+ 286, 286, 286, 286, 286, 286, 286, 286, 286, 286,
+ 286, 286, 286, 286, 286, 286, 286, 800, 808, 0,
+ 698, 700, 700, 700, 700, 699, 699, 699, 699, 809,
+ 648, 648, 648, 648, 701, 701, 701, 701, 700, 286,
+ 0, 808, 699, 698, 828, 1128, 648, 828, 1128, 0,
+ 0, 701, 809, 0, 853, 648, 0, 828, 1128, 0,
+ 0, 699, 286, 296, 296, 648, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296, 853, 648,
+ 296, 745, 296, 296, 699, 743, 0, 745, 648, 810,
+
+ 707, 707, 707, 707, 0, 0, 913, 649, 649, 649,
+ 649, 757, 743, 757, 745, 818, 296, 707, 0, 743,
+ 745, 0, 810, 649, 0, 0, 735, 735, 735, 735,
+ 913, 0, 649, 0, 757, 743, 757, 0, 818, 296,
+ 299, 299, 649, 299, 299, 299, 299, 299, 299, 299,
+ 299, 299, 299, 299, 299, 752, 649, 299, 735, 299,
+ 299, 753, 0, 0, 761, 649, 761, 735, 753, 752,
+ 742, 742, 742, 742, 0, 756, 0, 299, 787, 752,
+ 787, 735, 819, 299, 753, 756, 742, 761, 0, 761,
+ 735, 753, 752, 0, 0, 671, 671, 671, 671, 756,
+
+ 299, 787, 0, 787, 742, 819, 299, 309, 756, 820,
+ 309, 309, 671, 309, 309, 309, 309, 309, 309, 309,
+ 309, 309, 309, 309, 309, 309, 309, 742, 771, 671,
+ 830, 671, 820, 0, 771, 754, 914, 749, 749, 749,
+ 749, 754, 0, 730, 730, 730, 730, 839, 0, 309,
+ 309, 771, 671, 830, 671, 0, 730, 771, 0, 754,
+ 914, 0, 0, 0, 754, 755, 755, 755, 755, 730,
+ 839, 749, 309, 310, 0, 0, 310, 310, 730, 310,
+ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310,
+ 310, 310, 310, 730, 749, 759, 0, 760, 762, 755,
+
+ 762, 730, 760, 762, 764, 834, 759, 764, 834, 759,
+ 766, 766, 766, 766, 859, 310, 310, 833, 833, 759,
+ 760, 762, 755, 762, 0, 760, 762, 764, 834, 759,
+ 764, 834, 759, 772, 772, 772, 772, 859, 310, 316,
+ 833, 833, 316, 316, 766, 316, 316, 316, 316, 316,
+ 316, 316, 316, 316, 316, 316, 316, 316, 316, 774,
+ 774, 774, 774, 785, 788, 0, 792, 766, 785, 795,
+ 0, 792, 772, 868, 868, 774, 0, 0, 0, 788,
+ 858, 316, 316, 858, 795, 0, 785, 870, 788, 792,
+ 0, 785, 0, 795, 792, 772, 868, 868, 793, 793,
+
+ 793, 793, 788, 858, 316, 317, 858, 795, 317, 317,
+ 870, 317, 317, 317, 317, 317, 317, 317, 317, 317,
+ 317, 317, 317, 317, 317, 790, 790, 790, 790, 798,
+ 798, 798, 798, 791, 791, 791, 791, 793, 866, 874,
+ 0, 790, 875, 866, 874, 879, 798, 317, 317, 791,
+ 1058, 1058, 1058, 1058, 794, 794, 794, 794, 0, 1058,
+ 793, 866, 874, 798, 790, 875, 866, 874, 879, 791,
+ 317, 321, 321, 321, 321, 321, 321, 321, 321, 321,
+ 321, 321, 321, 321, 321, 321, 798, 790, 321, 321,
+ 321, 321, 791, 794, 805, 0, 854, 832, 797, 797,
+
+ 797, 797, 802, 802, 802, 802, 880, 854, 0, 832,
+ 805, 854, 921, 0, 321, 797, 794, 0, 805, 802,
+ 854, 832, 1608, 1608, 1608, 1608, 0, 0, 0, 880,
+ 854, 797, 832, 805, 854, 921, 802, 321, 323, 323,
+ 323, 323, 323, 323, 323, 323, 323, 323, 323, 323,
+ 323, 323, 323, 0, 797, 323, 323, 323, 323, 802,
+ 852, 856, 852, 0, 920, 801, 801, 801, 801, 0,
+ 822, 822, 822, 822, 856, 323, 856, 852, 0, 0,
+ 0, 323, 801, 922, 852, 856, 852, 822, 920, 0,
+ 0, 0, 861, 861, 861, 861, 0, 856, 323, 856,
+
+ 852, 861, 801, 822, 323, 325, 930, 922, 325, 325,
+ 325, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+ 325, 325, 325, 325, 325, 801, 822, 0, 867, 855,
+ 930, 861, 925, 857, 823, 823, 823, 823, 867, 855,
+ 840, 840, 840, 840, 855, 0, 926, 325, 325, 0,
+ 857, 823, 867, 855, 861, 925, 0, 857, 0, 0,
+ 0, 867, 855, 1617, 1617, 1617, 1617, 855, 823, 926,
+ 325, 326, 840, 857, 326, 326, 326, 326, 326, 326,
+ 326, 326, 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 823, 872, 932, 873, 840, 929, 862, 0, 872,
+
+ 860, 860, 860, 860, 873, 881, 881, 841, 841, 841,
+ 841, 931, 862, 326, 326, 872, 860, 932, 873, 929,
+ 841, 862, 872, 863, 863, 863, 863, 873, 881, 881,
+ 0, 0, 863, 841, 931, 862, 326, 329, 860, 947,
+ 329, 329, 841, 329, 329, 329, 329, 329, 329, 329,
+ 329, 329, 329, 329, 329, 329, 329, 841, 0, 938,
+ 882, 860, 863, 947, 939, 841, 882, 869, 869, 869,
+ 869, 878, 966, 842, 842, 842, 842, 946, 0, 329,
+ 329, 878, 938, 882, 0, 863, 842, 939, 0, 882,
+ 0, 876, 876, 876, 876, 878, 966, 0, 0, 842,
+
+ 946, 869, 329, 330, 878, 0, 330, 330, 842, 330,
+ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330,
+ 330, 330, 330, 842, 869, 876, 668, 668, 668, 668,
+ 960, 842, 883, 883, 884, 884, 884, 884, 968, 877,
+ 877, 877, 877, 668, 0, 330, 330, 0, 876, 0,
+ 884, 668, 919, 960, 968, 883, 883, 1676, 1676, 1676,
+ 1676, 668, 968, 919, 901, 901, 901, 901, 330, 342,
+ 342, 342, 342, 877, 342, 668, 919, 968, 342, 342,
+ 342, 342, 342, 342, 668, 342, 919, 342, 343, 343,
+ 343, 343, 0, 343, 0, 0, 877, 343, 343, 343,
+
+ 343, 343, 343, 901, 343, 0, 343, 885, 885, 885,
+ 885, 886, 886, 886, 886, 843, 843, 843, 843, 984,
+ 945, 343, 0, 885, 945, 924, 901, 886, 843, 902,
+ 902, 902, 902, 1722, 1722, 1722, 1722, 1724, 1724, 1724,
+ 1724, 843, 984, 945, 343, 346, 924, 945, 346, 346,
+ 843, 346, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 346, 843, 900, 903, 902, 924,
+ 903, 0, 900, 843, 0, 0, 904, 904, 904, 904,
+ 985, 851, 851, 851, 851, 991, 0, 346, 346, 900,
+ 903, 902, 904, 903, 851, 900, 907, 907, 907, 907,
+
+ 0, 0, 0, 985, 0, 0, 0, 851, 991, 904,
+ 346, 347, 907, 990, 347, 347, 851, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 851, 904, 906, 941, 923, 907, 990, 0, 851,
+ 905, 905, 905, 905, 941, 944, 1005, 944, 0, 1009,
+ 906, 0, 923, 347, 347, 0, 905, 906, 941, 907,
+ 910, 910, 910, 910, 0, 0, 0, 941, 0, 944,
+ 1005, 944, 1009, 906, 905, 923, 347, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 905, 1021, 910,
+
+ 908, 908, 908, 908, 958, 943, 0, 0, 969, 969,
+ 969, 969, 349, 981, 958, 981, 908, 969, 943, 349,
+ 349, 1021, 910, 0, 969, 0, 0, 0, 958, 943,
+ 940, 940, 940, 940, 0, 349, 981, 958, 981, 940,
+ 908, 943, 349, 351, 351, 351, 351, 351, 351, 351,
+ 351, 351, 351, 351, 351, 351, 351, 351, 351, 351,
+ 351, 351, 351, 908, 940, 909, 909, 909, 909, 0,
+ 0, 664, 664, 664, 664, 964, 964, 351, 0, 351,
+ 975, 909, 0, 0, 975, 351, 351, 940, 664, 0,
+ 0, 973, 779, 779, 779, 779, 664, 0, 964, 964,
+
+ 351, 973, 351, 975, 0, 909, 664, 975, 351, 357,
+ 357, 357, 357, 664, 779, 973, 779, 0, 1000, 1010,
+ 664, 1000, 357, 1016, 973, 1022, 0, 779, 909, 664,
+ 965, 783, 783, 783, 783, 357, 0, 0, 779, 0,
+ 779, 357, 357, 1010, 357, 0, 0, 1016, 1022, 965,
+ 779, 976, 976, 783, 965, 783, 0, 1000, 0, 357,
+ 893, 893, 893, 893, 357, 357, 783, 357, 361, 361,
+ 361, 361, 965, 0, 976, 976, 0, 783, 0, 783,
+ 1000, 361, 893, 0, 893, 890, 890, 890, 890, 783,
+ 361, 1017, 361, 1026, 361, 970, 970, 970, 970, 891,
+
+ 891, 891, 891, 361, 970, 0, 893, 890, 893, 890,
+ 0, 970, 891, 0, 361, 1017, 361, 1026, 361, 890,
+ 0, 1025, 0, 978, 978, 891, 361, 365, 365, 365,
+ 365, 890, 365, 890, 891, 0, 365, 365, 365, 365,
+ 365, 365, 890, 365, 1025, 365, 978, 978, 0, 891,
+ 892, 892, 892, 892, 365, 0, 0, 891, 915, 915,
+ 915, 915, 1040, 892, 942, 942, 942, 942, 0, 948,
+ 948, 948, 948, 942, 0, 915, 892, 0, 365, 366,
+ 366, 366, 366, 1019, 366, 892, 1040, 0, 366, 366,
+ 366, 366, 366, 366, 1055, 366, 915, 366, 942, 1027,
+
+ 892, 948, 1019, 1067, 366, 0, 0, 0, 892, 911,
+ 911, 911, 911, 0, 971, 971, 971, 971, 1055, 915,
+ 0, 942, 1027, 971, 948, 1019, 911, 1067, 366, 372,
+ 971, 911, 372, 372, 0, 372, 372, 372, 372, 372,
+ 372, 372, 372, 372, 372, 372, 372, 372, 372, 951,
+ 952, 962, 0, 977, 963, 911, 1028, 977, 951, 1033,
+ 962, 1034, 952, 962, 951, 952, 962, 963, 1061, 963,
+ 1065, 372, 372, 951, 952, 962, 977, 1086, 963, 1028,
+ 977, 951, 1033, 962, 1034, 952, 962, 951, 952, 962,
+ 963, 1061, 963, 1065, 372, 373, 373, 373, 373, 373,
+
+ 1086, 373, 373, 373, 373, 373, 373, 373, 373, 373,
+ 373, 373, 373, 373, 373, 0, 974, 1023, 967, 967,
+ 967, 967, 0, 972, 972, 972, 972, 0, 0, 974,
+ 373, 1023, 972, 1083, 967, 987, 987, 373, 373, 972,
+ 974, 1023, 967, 0, 988, 988, 988, 988, 979, 979,
+ 979, 979, 974, 373, 1023, 0, 0, 1083, 987, 987,
+ 373, 418, 418, 418, 418, 418, 967, 418, 418, 418,
+ 418, 418, 418, 418, 418, 418, 418, 418, 418, 418,
+ 418, 0, 979, 988, 1111, 896, 896, 896, 896, 897,
+ 897, 897, 897, 912, 912, 912, 912, 916, 916, 916,
+
+ 916, 0, 0, 418, 418, 979, 988, 896, 1111, 896,
+ 912, 897, 982, 897, 916, 912, 0, 0, 0, 916,
+ 0, 0, 897, 896, 982, 986, 418, 423, 423, 423,
+ 423, 896, 423, 896, 0, 897, 982, 897, 0, 912,
+ 986, 423, 423, 916, 423, 897, 896, 982, 0, 986,
+ 0, 0, 423, 1112, 1013, 1020, 1087, 980, 980, 980,
+ 980, 1013, 423, 986, 0, 899, 899, 899, 899, 423,
+ 423, 933, 933, 933, 933, 1020, 423, 1112, 1013, 1087,
+ 0, 0, 1032, 1032, 1013, 423, 426, 899, 933, 899,
+ 0, 980, 426, 933, 426, 426, 0, 426, 1020, 899,
+
+ 426, 426, 426, 426, 426, 426, 1032, 1032, 0, 1107,
+ 0, 899, 0, 899, 980, 0, 0, 933, 983, 983,
+ 983, 983, 899, 426, 426, 426, 426, 426, 426, 426,
+ 427, 427, 1107, 427, 427, 427, 427, 427, 427, 427,
+ 427, 427, 427, 427, 427, 0, 427, 427, 427, 427,
+ 427, 0, 983, 1014, 1014, 1001, 1004, 1007, 1007, 1007,
+ 1007, 1031, 0, 1066, 1066, 1031, 934, 934, 934, 934,
+ 1001, 1004, 0, 427, 1007, 983, 1014, 1014, 0, 1001,
+ 1004, 0, 0, 934, 0, 1031, 1066, 1066, 934, 1031,
+ 1119, 0, 0, 1001, 1004, 1007, 427, 430, 430, 430,
+
+ 430, 430, 430, 430, 430, 430, 430, 430, 430, 430,
+ 430, 430, 934, 1119, 430, 430, 430, 430, 1007, 1070,
+ 1070, 1070, 1070, 1037, 1011, 1011, 1011, 1011, 1070, 1129,
+ 1072, 1072, 1072, 1072, 430, 1070, 0, 430, 1037, 1072,
+ 430, 1011, 1006, 1006, 1006, 1006, 1072, 1037, 1069, 1069,
+ 1069, 1069, 1129, 953, 953, 953, 953, 430, 1006, 1011,
+ 430, 1037, 1006, 430, 433, 433, 953, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433, 433, 953,
+ 1123, 433, 1011, 433, 433, 1130, 1006, 1069, 953, 954,
+ 954, 954, 954, 955, 955, 955, 955, 1029, 1029, 1029,
+
+ 1029, 0, 954, 953, 1123, 1038, 955, 433, 1130, 0,
+ 1069, 953, 0, 0, 1029, 954, 0, 0, 1038, 955,
+ 959, 959, 959, 959, 954, 1036, 1015, 0, 955, 1038,
+ 433, 436, 436, 436, 436, 1029, 436, 1036, 1015, 954,
+ 1015, 1038, 0, 955, 959, 436, 436, 954, 436, 1036,
+ 1015, 955, 959, 1035, 0, 1050, 436, 1137, 1029, 959,
+ 1036, 1015, 1154, 1015, 1035, 1050, 436, 0, 959, 1073,
+ 1073, 1073, 1073, 436, 436, 959, 0, 1035, 1073, 1050,
+ 436, 1137, 959, 1131, 0, 1073, 1154, 1035, 1050, 436,
+ 443, 443, 443, 443, 443, 443, 443, 443, 443, 443,
+
+ 443, 443, 443, 443, 443, 0, 1131, 443, 443, 443,
+ 443, 1132, 1751, 1751, 1751, 1751, 0, 1056, 1024, 1024,
+ 1024, 1024, 1074, 0, 1115, 1115, 1056, 956, 956, 956,
+ 956, 1074, 0, 443, 1132, 1024, 1002, 1002, 1002, 1002,
+ 956, 1056, 1039, 1039, 1039, 1039, 1074, 1115, 1115, 1056,
+ 0, 1039, 1002, 956, 1074, 1024, 443, 457, 1002, 0,
+ 457, 457, 956, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 956, 1024, 1039,
+ 1057, 1076, 1002, 1045, 1155, 956, 1077, 1159, 0, 1160,
+ 1077, 1076, 1057, 992, 992, 992, 992, 1045, 1045, 457,
+
+ 457, 0, 1039, 0, 1057, 1076, 992, 1045, 1155, 1077,
+ 992, 1159, 1160, 1077, 1076, 1057, 0, 0, 0, 992,
+ 1045, 1045, 457, 458, 458, 458, 458, 458, 992, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 992, 1062, 1003, 1003, 1003, 1003, 1063,
+ 0, 992, 0, 1101, 1101, 1101, 1101, 1172, 458, 1062,
+ 0, 1003, 0, 0, 1063, 458, 458, 1003, 1062, 1101,
+ 0, 0, 0, 1063, 1084, 1084, 1084, 1084, 0, 0,
+ 1172, 458, 1062, 1043, 1043, 1043, 1043, 1063, 458, 459,
+ 0, 1003, 459, 459, 459, 459, 459, 459, 459, 459,
+
+ 459, 459, 459, 459, 459, 459, 459, 459, 459, 1043,
+ 1075, 0, 1116, 1084, 1116, 1043, 1157, 0, 1043, 1078,
+ 1078, 1078, 1078, 1075, 1186, 1157, 459, 1008, 1008, 1008,
+ 1008, 459, 459, 1043, 1075, 1116, 1084, 1116, 1043, 0,
+ 1157, 1043, 0, 0, 1008, 0, 1075, 1186, 1157, 459,
+ 0, 1008, 0, 1078, 459, 460, 0, 0, 460, 460,
+ 460, 460, 460, 460, 460, 460, 460, 460, 460, 460,
+ 460, 460, 460, 460, 460, 1008, 1078, 0, 1158, 989,
+ 989, 989, 989, 993, 993, 993, 993, 1206, 0, 460,
+ 1158, 0, 1012, 1012, 1012, 1012, 1103, 460, 460, 1103,
+
+ 1121, 989, 1158, 989, 1080, 993, 1121, 993, 1079, 1012,
+ 1206, 1079, 460, 1158, 1080, 989, 1012, 0, 993, 0,
+ 460, 465, 465, 465, 465, 989, 1081, 989, 1080, 993,
+ 1121, 993, 0, 1106, 465, 1103, 1081, 1080, 989, 0,
+ 1012, 993, 1079, 1118, 1207, 1118, 465, 465, 0, 1106,
+ 1081, 1161, 1030, 1030, 1030, 1030, 465, 1106, 1103, 1081,
+ 0, 1102, 1102, 1102, 1102, 1079, 1118, 1207, 1118, 1030,
+ 465, 465, 1106, 0, 0, 1161, 1030, 1102, 1177, 465,
+ 480, 480, 480, 480, 480, 1185, 480, 480, 480, 480,
+ 480, 480, 480, 480, 480, 480, 480, 480, 480, 480,
+
+ 1030, 1046, 1177, 1117, 1135, 1046, 0, 1117, 0, 1185,
+ 1064, 1064, 1064, 1064, 1135, 480, 0, 0, 0, 1064,
+ 1046, 0, 480, 480, 0, 1046, 1117, 1202, 1135, 1046,
+ 1117, 1085, 1085, 1085, 1085, 0, 0, 1135, 480, 1139,
+ 1139, 1139, 1139, 1046, 1064, 480, 481, 481, 481, 481,
+ 481, 1202, 481, 481, 481, 481, 481, 481, 481, 481,
+ 481, 481, 481, 481, 481, 481, 1136, 1064, 1170, 0,
+ 1085, 1170, 1210, 1139, 1210, 0, 1068, 1068, 1068, 1068,
+ 481, 1136, 481, 1122, 1122, 1122, 1122, 0, 481, 481,
+ 1136, 1170, 1068, 1085, 1170, 1210, 1139, 1210, 1068, 1140,
+
+ 1122, 0, 0, 481, 1136, 481, 995, 995, 995, 995,
+ 1140, 481, 510, 510, 510, 510, 510, 510, 510, 510,
+ 510, 510, 1068, 1140, 510, 510, 510, 1214, 995, 510,
+ 995, 510, 510, 1140, 995, 0, 1223, 994, 994, 994,
+ 994, 996, 996, 996, 996, 0, 0, 1110, 1110, 1110,
+ 1110, 1214, 995, 1221, 995, 510, 0, 0, 995, 994,
+ 1223, 994, 994, 996, 1110, 996, 1138, 1138, 1138, 1138,
+ 1110, 1124, 1124, 1124, 1124, 1138, 1221, 0, 510, 538,
+ 538, 538, 538, 994, 538, 994, 994, 996, 1124, 996,
+ 538, 538, 538, 538, 1110, 0, 538, 538, 539, 539,
+
+ 539, 539, 0, 539, 0, 997, 997, 997, 997, 539,
+ 539, 539, 539, 1222, 1229, 539, 539, 1126, 1126, 1126,
+ 1126, 1156, 0, 1108, 1108, 1108, 1108, 997, 1228, 997,
+ 0, 1156, 0, 0, 1126, 0, 1222, 539, 1229, 1108,
+ 1228, 0, 0, 997, 0, 1156, 1104, 1104, 1104, 1104,
+ 0, 997, 1228, 997, 1156, 1090, 1090, 1090, 1090, 1108,
+ 539, 541, 1104, 1228, 541, 541, 997, 541, 541, 541,
+ 541, 541, 541, 541, 541, 541, 541, 541, 541, 541,
+ 541, 1090, 1108, 1240, 1104, 1127, 1127, 1127, 1127, 1245,
+ 1090, 1239, 1144, 1144, 1144, 1144, 1243, 1109, 1109, 1109,
+
+ 1109, 1144, 1127, 541, 541, 1090, 1240, 1104, 1544, 1544,
+ 1544, 1544, 1245, 1090, 1109, 1239, 1047, 1047, 1047, 1047,
+ 1243, 0, 0, 0, 1544, 1109, 541, 549, 549, 1047,
+ 549, 549, 549, 549, 549, 549, 549, 549, 549, 549,
+ 549, 549, 1047, 1141, 549, 549, 549, 549, 1227, 1109,
+ 1246, 1047, 549, 1146, 1142, 1162, 0, 1227, 1141, 1146,
+ 1254, 1105, 1105, 1105, 1105, 1254, 1047, 1141, 1142, 1162,
+ 549, 0, 1227, 1246, 1047, 0, 549, 1105, 1142, 1162,
+ 1227, 1141, 0, 1254, 0, 1105, 0, 1146, 1254, 0,
+ 0, 1142, 1162, 549, 550, 550, 0, 550, 550, 550,
+
+ 550, 550, 550, 550, 550, 550, 550, 550, 550, 1105,
+ 1146, 550, 550, 550, 550, 1255, 1171, 0, 0, 999,
+ 999, 999, 999, 1100, 1100, 1100, 1100, 1171, 550, 1134,
+ 1134, 1134, 1134, 1163, 1163, 1163, 1163, 550, 0, 1255,
+ 1171, 999, 1163, 999, 1280, 1100, 1134, 1100, 0, 0,
+ 1171, 550, 1134, 1216, 1216, 1216, 1216, 0, 0, 0,
+ 550, 560, 560, 560, 560, 999, 560, 999, 1280, 1100,
+ 1216, 1100, 560, 560, 560, 560, 1134, 0, 560, 560,
+ 561, 561, 561, 561, 0, 561, 1151, 998, 998, 998,
+ 998, 561, 561, 561, 561, 0, 1182, 561, 561, 0,
+
+ 1151, 1151, 1165, 1165, 1242, 0, 0, 1182, 1258, 998,
+ 1151, 998, 1133, 1133, 1133, 1133, 1242, 0, 1165, 561,
+ 1182, 1212, 1212, 1151, 1151, 998, 1165, 1165, 1242, 1133,
+ 1182, 1258, 0, 998, 0, 998, 0, 0, 0, 1242,
+ 1133, 1165, 561, 563, 1212, 1212, 563, 563, 998, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 1231, 1133, 1231, 1048, 1048, 1048, 1048,
+ 0, 1113, 1113, 1113, 1113, 1173, 1173, 1173, 1173, 1048,
+ 1051, 1051, 1051, 1051, 1266, 563, 563, 1231, 1113, 1231,
+ 0, 1173, 1048, 1051, 1143, 1143, 1143, 1143, 0, 1181,
+
+ 0, 1048, 1181, 1143, 0, 1113, 1051, 1266, 563, 572,
+ 572, 572, 572, 1173, 572, 1051, 1048, 1253, 572, 572,
+ 572, 572, 572, 572, 1048, 572, 0, 572, 1113, 0,
+ 1051, 1143, 1253, 1181, 1290, 1241, 1173, 0, 1051, 0,
+ 0, 1253, 1211, 0, 1241, 572, 0, 0, 0, 1145,
+ 1145, 1145, 1145, 1211, 1143, 1253, 1181, 1290, 1145, 1241,
+ 1286, 1147, 1147, 1147, 1147, 0, 1211, 1241, 572, 573,
+ 573, 573, 573, 0, 573, 0, 1211, 0, 573, 573,
+ 573, 573, 573, 573, 1286, 573, 1145, 573, 576, 576,
+ 576, 576, 576, 1147, 576, 576, 576, 576, 576, 576,
+
+ 576, 576, 576, 576, 576, 576, 576, 576, 1302, 1145,
+ 1307, 1219, 1219, 1219, 1219, 0, 1147, 1174, 1174, 1174,
+ 1174, 0, 0, 576, 1052, 1052, 1052, 1052, 1219, 0,
+ 576, 576, 1302, 1174, 1307, 0, 0, 1052, 1230, 1230,
+ 1230, 1230, 1168, 1168, 1168, 1168, 576, 1230, 0, 0,
+ 1052, 1168, 1174, 576, 577, 577, 577, 577, 577, 1052,
+ 577, 577, 577, 577, 577, 577, 577, 577, 577, 577,
+ 577, 577, 577, 577, 1052, 1174, 1168, 1247, 1262, 1262,
+ 0, 1291, 1052, 1205, 1205, 1205, 1205, 0, 577, 1247,
+ 577, 1780, 1780, 1780, 1780, 0, 577, 577, 0, 1168,
+
+ 1205, 1247, 1262, 1262, 1291, 0, 0, 1233, 1233, 1233,
+ 1233, 577, 1247, 577, 1179, 1179, 1179, 1179, 1150, 577,
+ 578, 1150, 1205, 578, 578, 578, 578, 578, 578, 578,
+ 578, 578, 578, 578, 578, 578, 578, 578, 578, 578,
+ 1150, 0, 1150, 0, 1233, 1205, 1244, 0, 1179, 1175,
+ 1175, 1175, 1175, 1309, 0, 1329, 1330, 1150, 578, 0,
+ 1244, 0, 578, 578, 1150, 1175, 1150, 1233, 0, 0,
+ 1244, 1179, 1677, 1677, 1677, 1677, 0, 1309, 1329, 1330,
+ 1150, 578, 1335, 1244, 1175, 578, 579, 0, 1677, 579,
+ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579,
+
+ 579, 579, 579, 579, 579, 579, 1335, 1175, 579, 1053,
+ 1053, 1053, 1053, 1054, 1054, 1054, 1054, 1265, 1095, 1095,
+ 1095, 1095, 1053, 1265, 1169, 1347, 1054, 1336, 579, 579,
+ 1169, 0, 579, 1351, 1361, 1053, 0, 0, 1265, 1054,
+ 1095, 0, 1095, 0, 1053, 1169, 1095, 0, 1054, 1347,
+ 1336, 579, 586, 586, 586, 586, 1362, 1351, 1361, 1053,
+ 1169, 1364, 1265, 1054, 1095, 586, 1095, 1053, 0, 1169,
+ 1095, 1054, 1059, 1059, 1059, 1059, 586, 1370, 586, 1362,
+ 1375, 1059, 1295, 1169, 1364, 1059, 1395, 586, 0, 0,
+ 1060, 1060, 1060, 1060, 1295, 0, 0, 0, 1059, 1060,
+
+ 586, 1370, 586, 1060, 1375, 0, 1295, 1059, 0, 1395,
+ 586, 587, 587, 587, 587, 1416, 1060, 1295, 1180, 1180,
+ 1180, 1180, 1059, 1394, 587, 1060, 1178, 1178, 1178, 1178,
+ 1059, 1094, 1094, 1094, 1094, 1178, 1382, 587, 1416, 1382,
+ 1060, 1088, 1088, 1088, 1088, 587, 587, 1394, 1060, 0,
+ 1178, 0, 1180, 1094, 1088, 1094, 1415, 1427, 1088, 1382,
+ 0, 587, 1382, 1424, 0, 1094, 1442, 1088, 587, 587,
+ 588, 588, 588, 588, 1178, 1180, 1088, 1094, 0, 1094,
+ 1415, 1427, 1451, 588, 1408, 1383, 1424, 1408, 1094, 1383,
+ 1442, 1088, 1208, 1208, 1208, 1208, 588, 0, 0, 1088,
+
+ 1089, 1089, 1089, 1089, 588, 588, 1451, 1408, 1383, 1208,
+ 1408, 1452, 1383, 1089, 0, 0, 1464, 1089, 0, 0,
+ 588, 1096, 1096, 1096, 1096, 1208, 1089, 588, 588, 589,
+ 589, 589, 589, 1472, 1452, 1089, 1091, 1091, 1091, 1091,
+ 1464, 1296, 589, 1096, 1502, 1096, 0, 1487, 1208, 1091,
+ 1089, 1459, 1296, 1091, 1459, 589, 1472, 589, 1089, 1096,
+ 1366, 1533, 1091, 0, 589, 1296, 0, 1096, 1502, 1096,
+ 1487, 1091, 1366, 1493, 1459, 1296, 0, 1459, 0, 589,
+ 1505, 589, 1096, 1547, 1366, 1533, 1091, 589, 595, 595,
+ 595, 595, 1557, 595, 1091, 1366, 1493, 595, 595, 595,
+
+ 595, 595, 595, 1505, 595, 1559, 595, 1547, 1097, 1097,
+ 1097, 1097, 1176, 1176, 1176, 1176, 1557, 1200, 1200, 1200,
+ 1200, 0, 1149, 1149, 1149, 1149, 595, 0, 1176, 1559,
+ 1097, 0, 1097, 1200, 1236, 1149, 0, 1236, 0, 1152,
+ 1152, 1152, 1152, 0, 1097, 1200, 0, 1176, 1149, 595,
+ 596, 596, 596, 596, 1097, 596, 1097, 1149, 1236, 596,
+ 596, 596, 596, 596, 596, 1152, 596, 1097, 596, 1200,
+ 1176, 1534, 1149, 1236, 1152, 1554, 596, 0, 1564, 1595,
+ 1149, 0, 1236, 1201, 1201, 1201, 1201, 0, 0, 1152,
+ 1267, 1267, 1267, 1267, 1534, 0, 1236, 1152, 1554, 1201,
+
+ 596, 606, 1564, 1595, 606, 606, 1201, 606, 606, 606,
+ 606, 606, 606, 606, 606, 606, 606, 606, 606, 606,
+ 606, 0, 1267, 1596, 1601, 1226, 1226, 1226, 1226, 0,
+ 1201, 1204, 1204, 1204, 1204, 1430, 1602, 1430, 606, 1530,
+ 0, 0, 1226, 606, 606, 1267, 1596, 1601, 1204, 1530,
+ 0, 0, 1209, 1209, 1209, 1209, 0, 0, 1430, 1602,
+ 1430, 606, 0, 1530, 1226, 1204, 606, 607, 0, 1209,
+ 607, 607, 1530, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 1226, 1204, 1209,
+ 1525, 1098, 1098, 1098, 1098, 1099, 1099, 1099, 1099, 1615,
+
+ 0, 607, 0, 1114, 1114, 1114, 1114, 0, 1525, 607,
+ 607, 0, 1209, 1098, 1525, 1098, 0, 1099, 0, 1099,
+ 1114, 1469, 1615, 1098, 607, 1465, 1114, 1469, 1465, 0,
+ 1099, 1525, 607, 620, 620, 620, 620, 1098, 1469, 1098,
+ 1114, 1099, 620, 1099, 0, 0, 1098, 0, 0, 1465,
+ 1114, 0, 1465, 1099, 1599, 1613, 0, 1614, 620, 0,
+ 0, 620, 1469, 1114, 1287, 1287, 1287, 1287, 620, 1225,
+ 1225, 1225, 1225, 0, 1460, 1460, 1460, 1460, 1599, 1613,
+ 1287, 1614, 620, 1460, 1287, 620, 1225, 1153, 1153, 1153,
+ 1153, 620, 638, 638, 638, 638, 638, 638, 638, 638,
+
+ 638, 638, 0, 1225, 638, 638, 638, 0, 1287, 638,
+ 1238, 638, 638, 1153, 1238, 1531, 1304, 1304, 1304, 1304,
+ 1594, 0, 1153, 1620, 1531, 1238, 1225, 1658, 1594, 1192,
+ 1192, 1192, 1192, 1304, 1238, 638, 0, 1153, 1238, 1531,
+ 1249, 1249, 1249, 1249, 1594, 1153, 1620, 1531, 1238, 1249,
+ 1658, 1192, 1594, 1192, 1750, 1750, 1750, 1750, 638, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639, 639, 1659,
+ 1192, 639, 639, 639, 1249, 1192, 639, 1192, 639, 639,
+ 1611, 1297, 1297, 1297, 1297, 1625, 1166, 1166, 1166, 1166,
+ 1611, 1665, 1659, 1192, 0, 1166, 1750, 1249, 1297, 1166,
+
+ 0, 0, 639, 0, 1611, 1224, 1224, 1224, 1224, 1625,
+ 1224, 0, 1166, 1611, 1665, 1232, 1232, 1232, 1232, 1224,
+ 1224, 1166, 1224, 1297, 1232, 639, 640, 640, 640, 640,
+ 640, 640, 640, 640, 640, 640, 1166, 1232, 640, 640,
+ 640, 1682, 0, 640, 1166, 640, 640, 1224, 1224, 640,
+ 0, 640, 0, 640, 1196, 1196, 1196, 1196, 0, 1628,
+ 1237, 1232, 640, 1237, 1682, 1537, 1537, 1537, 1537, 640,
+ 0, 0, 0, 640, 1537, 640, 1196, 640, 1196, 1263,
+ 1263, 1263, 1263, 1628, 1237, 640, 1196, 0, 1263, 0,
+ 0, 0, 640, 674, 674, 674, 674, 0, 674, 1237,
+
+ 1196, 0, 1196, 1263, 674, 674, 674, 674, 1237, 1196,
+ 674, 674, 675, 675, 675, 675, 0, 675, 1203, 1203,
+ 1203, 1203, 1237, 675, 675, 675, 675, 1263, 1704, 675,
+ 675, 1712, 0, 0, 1203, 1565, 1565, 1565, 1565, 1167,
+ 1167, 1167, 1167, 1717, 1565, 675, 1203, 1592, 1167, 0,
+ 1592, 1704, 1167, 0, 1712, 1257, 1257, 1257, 1257, 0,
+ 0, 1324, 1324, 1324, 1324, 1167, 1717, 1592, 675, 678,
+ 1203, 1257, 678, 678, 1167, 678, 678, 678, 678, 678,
+ 678, 678, 678, 678, 678, 678, 678, 678, 678, 1167,
+ 1257, 1592, 1305, 1305, 1305, 1305, 1324, 1167, 0, 0,
+
+ 0, 1259, 1259, 1259, 1259, 1250, 1250, 1250, 1250, 1305,
+ 1734, 678, 678, 1257, 1250, 0, 0, 1259, 1250, 1324,
+ 0, 1261, 1261, 1261, 1261, 1413, 1413, 1413, 1413, 0,
+ 0, 1250, 1630, 1734, 678, 679, 1259, 1261, 679, 679,
+ 1250, 679, 679, 679, 679, 679, 679, 679, 679, 679,
+ 679, 679, 679, 679, 679, 1250, 1630, 1261, 1252, 1259,
+ 1413, 1660, 1664, 1250, 1252, 0, 1691, 1694, 1256, 1256,
+ 1256, 1256, 1306, 1306, 1306, 1306, 0, 679, 679, 1252,
+ 1261, 0, 1543, 1413, 1256, 1660, 1664, 0, 1543, 1306,
+ 1691, 1694, 1256, 0, 1252, 1352, 1352, 1352, 1352, 1543,
+
+ 679, 691, 691, 1252, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 1256, 1252, 691, 691,
+ 691, 691, 1703, 1543, 691, 0, 1603, 1352, 1603, 1532,
+ 0, 1260, 1260, 1260, 1260, 1378, 1378, 1378, 1378, 0,
+ 0, 1532, 1746, 0, 691, 0, 1703, 1260, 691, 1603,
+ 1352, 1603, 1378, 1532, 1367, 1367, 1367, 1367, 0, 1248,
+ 1248, 1248, 1248, 1367, 1532, 1746, 1260, 691, 692, 692,
+ 0, 692, 692, 692, 692, 692, 692, 692, 692, 692,
+ 692, 692, 692, 1248, 1715, 692, 692, 692, 692, 1260,
+ 1367, 1248, 0, 1191, 1191, 1191, 1191, 692, 1598, 1385,
+
+ 1385, 1385, 1385, 1264, 1264, 1264, 1264, 1248, 1715, 0,
+ 1598, 692, 1264, 1367, 1248, 1191, 1385, 1191, 1741, 1191,
+ 1741, 692, 1598, 1623, 1623, 1623, 1623, 1264, 1308, 1308,
+ 1308, 1308, 1623, 1598, 692, 702, 702, 702, 702, 1191,
+ 702, 1191, 1741, 1191, 1741, 1308, 702, 702, 702, 702,
+ 1743, 1264, 702, 702, 703, 703, 703, 703, 0, 703,
+ 1193, 1193, 1193, 1193, 0, 703, 703, 703, 703, 1748,
+ 1308, 703, 703, 1777, 1743, 1284, 1284, 1284, 1284, 0,
+ 0, 1765, 1193, 0, 1193, 0, 0, 703, 1193, 0,
+ 0, 1284, 0, 1748, 0, 0, 1777, 1285, 1285, 1285,
+
+ 1285, 1363, 1363, 1363, 1363, 1765, 1193, 1597, 1193, 1284,
+ 703, 705, 1193, 1285, 705, 705, 1597, 705, 705, 705,
+ 705, 705, 705, 705, 705, 705, 705, 705, 705, 705,
+ 705, 1597, 1284, 1363, 1797, 0, 1285, 1363, 1807, 1597,
+ 0, 1288, 1288, 1288, 1288, 1666, 1767, 1772, 1778, 1396,
+ 1396, 1396, 1396, 705, 705, 1666, 1363, 1797, 1288, 1285,
+ 1363, 1807, 1289, 1289, 1289, 1289, 1396, 0, 0, 1666,
+ 1767, 1772, 1778, 0, 1288, 0, 705, 706, 1666, 1289,
+ 706, 706, 0, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 1288, 1289, 1310,
+
+ 1310, 1310, 1310, 1197, 1197, 1197, 1197, 1314, 1314, 1314,
+ 1314, 1404, 1404, 1404, 1404, 0, 1310, 0, 0, 706,
+ 706, 1289, 0, 1197, 1314, 1197, 0, 1197, 1404, 0,
+ 1341, 1341, 1341, 1341, 0, 0, 1198, 1198, 1198, 1198,
+ 1314, 1310, 706, 717, 717, 717, 717, 1197, 717, 1197,
+ 1341, 1197, 717, 717, 717, 717, 717, 717, 1198, 717,
+ 1198, 717, 1341, 1314, 1796, 1199, 1199, 1199, 1199, 1808,
+ 1198, 717, 0, 0, 1341, 0, 0, 1376, 1376, 1376,
+ 1376, 1833, 1198, 0, 1198, 1341, 0, 1199, 1796, 1199,
+ 0, 1803, 1808, 1198, 1376, 717, 718, 718, 718, 718,
+
+ 1376, 718, 1199, 0, 1833, 718, 718, 718, 718, 718,
+ 718, 1199, 718, 1199, 718, 1803, 1315, 1315, 1315, 1315,
+ 1781, 1781, 1781, 1781, 1376, 1199, 1292, 1292, 1292, 1292,
+ 718, 0, 0, 1315, 1377, 1377, 1377, 1377, 1438, 1438,
+ 1438, 1438, 0, 1292, 0, 1425, 1425, 1425, 1425, 0,
+ 1292, 1377, 1315, 718, 720, 1438, 0, 720, 720, 0,
+ 720, 720, 720, 720, 720, 720, 720, 720, 720, 720,
+ 720, 720, 720, 720, 1292, 1315, 1377, 1425, 1348, 1348,
+ 1348, 1348, 1439, 1439, 1439, 1439, 0, 1349, 1349, 1349,
+ 1349, 720, 0, 0, 1348, 0, 720, 720, 1439, 1439,
+
+ 1425, 1348, 0, 1349, 0, 1403, 1403, 1403, 1403, 1507,
+ 1507, 1507, 1507, 0, 720, 1332, 1332, 1332, 1332, 720,
+ 721, 1349, 1403, 721, 721, 1348, 721, 721, 721, 721,
+ 721, 721, 721, 721, 721, 721, 721, 721, 721, 721,
+ 1612, 1332, 0, 1507, 1349, 0, 0, 1403, 0, 1672,
+ 1332, 1672, 1612, 1332, 721, 1368, 1368, 1368, 1368, 0,
+ 0, 0, 721, 721, 1612, 1332, 1507, 1477, 1477, 1477,
+ 1477, 1368, 1672, 1332, 1672, 1612, 1332, 721, 0, 0,
+ 1333, 1333, 1333, 1333, 1477, 721, 722, 0, 1368, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722, 722, 722,
+
+ 722, 722, 722, 722, 722, 722, 1333, 1434, 1434, 1434,
+ 1434, 1368, 1681, 1670, 0, 1333, 1333, 1470, 1470, 1470,
+ 1470, 722, 1681, 1434, 1545, 1545, 1545, 1545, 722, 722,
+ 1333, 1670, 0, 1470, 1470, 0, 1681, 1670, 1333, 1333,
+ 1545, 1545, 0, 0, 722, 1681, 0, 0, 0, 1434,
+ 0, 722, 723, 0, 1670, 723, 723, 723, 723, 723,
+ 723, 723, 723, 723, 723, 723, 723, 723, 723, 723,
+ 723, 723, 1251, 1251, 1251, 1251, 723, 1326, 1326, 1326,
+ 1326, 1251, 1680, 0, 1593, 1251, 1326, 1593, 1268, 1268,
+ 1268, 1268, 1836, 1680, 723, 723, 0, 0, 1251, 0,
+
+ 723, 1268, 1742, 1326, 1593, 1268, 1680, 1251, 1374, 1374,
+ 1374, 1374, 1326, 1742, 1268, 1836, 1680, 723, 726, 726,
+ 726, 726, 1251, 1268, 726, 1374, 1742, 1326, 1593, 726,
+ 1251, 726, 1837, 1374, 0, 1326, 1742, 726, 1268, 1269,
+ 1269, 1269, 1269, 1374, 726, 0, 1268, 0, 1276, 1276,
+ 1276, 1276, 1269, 726, 0, 1837, 1269, 1374, 1270, 1270,
+ 1270, 1270, 0, 0, 0, 1269, 1374, 0, 726, 0,
+ 1276, 1270, 1276, 0, 1269, 1270, 726, 727, 727, 727,
+ 727, 0, 0, 0, 1270, 1474, 1474, 1474, 1474, 1269,
+ 727, 1707, 0, 1270, 1276, 1707, 1276, 1269, 1279, 1279,
+
+ 1279, 1279, 1474, 727, 1277, 1277, 1277, 1277, 1270, 0,
+ 727, 0, 727, 0, 0, 1707, 1270, 1711, 0, 1707,
+ 1279, 1711, 1279, 0, 1474, 0, 1277, 727, 1277, 1281,
+ 1281, 1281, 1281, 727, 0, 727, 728, 728, 728, 728,
+ 0, 1711, 0, 1277, 1279, 1711, 1279, 1474, 0, 728,
+ 1277, 1281, 1277, 1281, 1283, 1283, 1283, 1283, 1371, 1371,
+ 1371, 1371, 728, 0, 1281, 0, 1277, 1570, 1570, 1570,
+ 1570, 728, 728, 0, 1371, 1281, 1283, 1281, 1283, 1371,
+ 1325, 1325, 1325, 1325, 0, 0, 728, 1281, 0, 1325,
+ 0, 1283, 0, 1325, 728, 728, 729, 729, 729, 729,
+
+ 1283, 1570, 1283, 1371, 0, 0, 1325, 0, 0, 729,
+ 1327, 1327, 1327, 1327, 1283, 1325, 1331, 1331, 1331, 1331,
+ 0, 0, 729, 1327, 1570, 1369, 1369, 1369, 1369, 729,
+ 1325, 729, 729, 0, 0, 0, 1327, 0, 1325, 1736,
+ 1331, 1369, 1331, 1736, 0, 1327, 729, 1494, 1494, 1494,
+ 1494, 1331, 729, 0, 729, 729, 731, 731, 731, 731,
+ 1327, 1369, 0, 1736, 1331, 0, 1331, 1736, 1327, 731,
+ 1435, 1435, 1435, 1435, 1331, 1334, 1334, 1334, 1334, 1494,
+ 0, 0, 731, 0, 1369, 1769, 1435, 1373, 1373, 1373,
+ 1373, 731, 1342, 1342, 1342, 1342, 1769, 731, 0, 0,
+
+ 0, 1334, 1494, 0, 1373, 1342, 731, 1334, 0, 1769,
+ 1334, 1373, 1435, 1702, 731, 0, 0, 0, 1342, 1769,
+ 731, 733, 733, 733, 733, 1334, 1702, 1342, 1716, 0,
+ 1334, 1716, 0, 1334, 733, 1373, 0, 1702, 1475, 1475,
+ 1475, 1475, 1342, 1486, 1486, 1486, 1486, 733, 0, 1702,
+ 1342, 1716, 0, 733, 1716, 1475, 733, 0, 0, 0,
+ 1343, 1343, 1343, 1343, 1486, 0, 0, 1539, 1539, 1539,
+ 1539, 733, 0, 1343, 1475, 0, 733, 0, 0, 733,
+ 739, 739, 739, 739, 0, 739, 1343, 1539, 1486, 739,
+ 739, 739, 739, 739, 739, 1343, 739, 1475, 739, 0,
+
+ 1344, 1344, 1344, 1344, 739, 0, 1436, 1436, 1436, 1436,
+ 1343, 1539, 0, 1344, 0, 1436, 1436, 0, 1343, 0,
+ 1436, 0, 1436, 0, 0, 1662, 1344, 0, 739, 740,
+ 740, 740, 740, 0, 740, 1344, 0, 1662, 740, 740,
+ 740, 740, 740, 740, 0, 740, 0, 740, 1436, 1662,
+ 1344, 0, 0, 1463, 1463, 1463, 1463, 0, 1344, 0,
+ 1662, 1719, 1463, 0, 1719, 0, 0, 0, 740, 1402,
+ 1402, 1402, 1402, 1463, 1468, 1468, 1468, 1468, 0, 1365,
+ 1365, 1365, 1365, 1468, 1719, 0, 1402, 1719, 1365, 0,
+ 0, 740, 747, 1402, 1468, 747, 747, 1463, 747, 747,
+
+ 747, 747, 747, 747, 747, 747, 747, 747, 747, 747,
+ 747, 747, 0, 1365, 0, 1365, 0, 1402, 1468, 0,
+ 1584, 1584, 1584, 1584, 1684, 1684, 1684, 1684, 0, 0,
+ 747, 0, 0, 1684, 747, 747, 1365, 1584, 1365, 1471,
+ 1471, 1471, 1471, 1489, 1489, 1489, 1489, 1784, 1784, 1784,
+ 1784, 0, 0, 747, 0, 1471, 1471, 747, 748, 0,
+ 1489, 748, 748, 1471, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748, 0, 1489,
+ 748, 1479, 1479, 1479, 1479, 0, 0, 1471, 0, 1440,
+ 1440, 1440, 1440, 1546, 1546, 1546, 1546, 0, 1479, 0,
+
+ 748, 748, 1489, 0, 748, 1440, 1440, 0, 0, 1546,
+ 1546, 1440, 1818, 1818, 1818, 1818, 1479, 0, 1714, 1417,
+ 1417, 1417, 1417, 748, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 1714, 1440, 773, 773, 773, 1479,
+ 0, 773, 1714, 773, 773, 1417, 1705, 773, 1740, 773,
+ 0, 773, 1740, 0, 1417, 1417, 0, 1714, 1705, 0,
+ 773, 0, 1488, 1488, 1488, 1488, 0, 773, 0, 1417,
+ 1705, 773, 1740, 773, 0, 773, 1740, 1417, 1417, 1488,
+ 0, 1705, 0, 773, 0, 0, 1418, 1418, 1418, 1418,
+ 773, 775, 775, 775, 775, 775, 775, 775, 775, 775,
+
+ 775, 1488, 0, 775, 775, 775, 0, 0, 775, 0,
+ 775, 775, 1418, 0, 1473, 1473, 1473, 1473, 1418, 0,
+ 0, 1418, 0, 0, 1488, 0, 1518, 1518, 1518, 1518,
+ 1473, 1473, 0, 0, 775, 0, 1418, 1503, 1503, 1503,
+ 1503, 1418, 1518, 1518, 1418, 1473, 1571, 1571, 1571, 1571,
+ 1518, 1845, 1845, 1845, 1845, 0, 0, 775, 776, 776,
+ 776, 776, 776, 776, 776, 776, 776, 776, 1473, 1503,
+ 776, 776, 776, 0, 1518, 776, 1600, 776, 776, 0,
+ 1571, 776, 1768, 776, 1768, 776, 1419, 1419, 1419, 1419,
+ 1600, 0, 1503, 0, 776, 0, 1501, 1501, 1501, 1501,
+
+ 1600, 776, 0, 1571, 0, 776, 1768, 776, 1768, 776,
+ 0, 0, 1419, 1600, 1419, 0, 0, 776, 0, 0,
+ 0, 1419, 1501, 0, 776, 781, 781, 781, 781, 0,
+ 0, 1501, 1510, 1510, 1510, 1510, 1419, 0, 1419, 0,
+ 1420, 1420, 1420, 1420, 1419, 0, 1501, 781, 1510, 781,
+ 1642, 1642, 1642, 1642, 1501, 1575, 1575, 1575, 1575, 781,
+ 781, 1511, 1511, 1511, 1511, 0, 1420, 1642, 0, 0,
+ 0, 781, 1420, 781, 1510, 1420, 0, 1511, 1421, 1421,
+ 1421, 1421, 781, 781, 782, 782, 782, 782, 0, 1575,
+ 1420, 0, 0, 1492, 0, 1420, 1492, 0, 1420, 1422,
+
+ 1422, 1422, 1422, 1511, 1421, 0, 782, 0, 782, 0,
+ 1421, 0, 1575, 1421, 0, 1492, 0, 782, 0, 782,
+ 0, 1521, 1521, 1521, 1521, 1422, 0, 1492, 1421, 1492,
+ 782, 1422, 782, 1421, 1422, 0, 1421, 0, 0, 1492,
+ 782, 0, 782, 784, 784, 784, 784, 0, 0, 1422,
+ 1492, 0, 1492, 1521, 1422, 0, 1657, 1422, 0, 0,
+ 0, 1696, 1696, 1696, 1696, 784, 0, 784, 0, 0,
+ 1657, 0, 1423, 1423, 1423, 1423, 1521, 784, 784, 784,
+ 1657, 0, 1428, 1428, 1428, 1428, 1696, 0, 0, 784,
+ 0, 784, 1423, 1657, 0, 1428, 0, 0, 1423, 0,
+
+ 784, 784, 784, 786, 786, 786, 786, 1423, 1428, 0,
+ 1696, 0, 1513, 1513, 1513, 1513, 1423, 1428, 1515, 1515,
+ 1515, 1515, 1423, 1429, 1429, 1429, 1429, 1661, 786, 1513,
+ 1423, 786, 1428, 1513, 1515, 1515, 1429, 0, 786, 1515,
+ 1428, 1661, 786, 0, 0, 1643, 1643, 1643, 1643, 1429,
+ 0, 1661, 786, 0, 1513, 786, 0, 1513, 1429, 0,
+ 1515, 786, 1643, 1515, 1661, 786, 803, 803, 803, 803,
+ 0, 803, 0, 1429, 0, 0, 0, 803, 803, 803,
+ 803, 1429, 0, 803, 803, 0, 0, 0, 803, 1509,
+ 1509, 1509, 1509, 0, 1431, 1431, 1431, 1431, 1509, 1509,
+
+ 0, 1556, 1556, 1556, 1556, 1509, 0, 1431, 1432, 1432,
+ 1432, 1432, 803, 804, 804, 804, 804, 0, 804, 1524,
+ 1431, 1432, 1524, 1509, 804, 804, 804, 804, 0, 1431,
+ 804, 804, 0, 0, 1432, 0, 1556, 1556, 0, 1524,
+ 0, 1524, 0, 1432, 1431, 0, 1509, 1647, 1647, 1647,
+ 1647, 804, 1431, 1721, 1721, 1721, 1721, 0, 1432, 1556,
+ 1556, 0, 1721, 1524, 1647, 1524, 1432, 0, 0, 1445,
+ 1445, 1445, 1445, 0, 804, 806, 806, 806, 806, 806,
+ 0, 806, 806, 806, 806, 806, 806, 806, 806, 806,
+ 806, 806, 806, 806, 806, 1445, 1773, 1773, 1773, 1773,
+
+ 0, 1445, 0, 0, 1445, 1773, 1805, 1805, 1805, 1805,
+ 0, 1495, 1495, 1495, 1495, 1805, 0, 806, 806, 1445,
+ 1512, 1512, 1512, 1512, 1445, 0, 0, 1445, 0, 1512,
+ 1512, 0, 0, 0, 1512, 0, 1512, 1495, 0, 1495,
+ 806, 807, 807, 807, 807, 807, 1495, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 1495, 1512, 1495, 1587, 1587, 1587, 1587, 0, 1495,
+ 0, 0, 0, 1587, 1587, 1609, 1609, 1609, 1609, 0,
+ 1587, 1587, 0, 807, 807, 1731, 1731, 1731, 1731, 0,
+ 0, 1609, 1609, 0, 1731, 0, 1453, 1453, 1453, 1453,
+
+ 0, 1731, 1496, 1496, 1496, 1496, 807, 816, 816, 1453,
+ 816, 816, 816, 816, 816, 816, 816, 816, 816, 816,
+ 816, 816, 1453, 0, 816, 816, 816, 816, 1496, 1675,
+ 0, 1453, 0, 0, 1496, 0, 0, 1496, 1581, 1581,
+ 1581, 1581, 816, 1675, 0, 1675, 1453, 0, 0, 0,
+ 816, 0, 1496, 1675, 1453, 0, 0, 1496, 0, 0,
+ 1496, 1829, 1829, 1829, 1829, 816, 1675, 0, 1675, 0,
+ 1829, 0, 1581, 816, 817, 817, 0, 817, 817, 817,
+ 817, 817, 817, 817, 817, 817, 817, 817, 817, 0,
+ 0, 817, 817, 817, 817, 1581, 0, 0, 1454, 1454,
+
+ 1454, 1454, 1558, 1558, 1558, 1558, 0, 1568, 1568, 1568,
+ 1568, 1454, 0, 817, 0, 0, 1568, 817, 1698, 1698,
+ 1698, 1698, 0, 0, 1454, 1455, 1455, 1455, 1455, 1569,
+ 1569, 1569, 1569, 1454, 1558, 1698, 817, 0, 1455, 1568,
+ 817, 824, 824, 824, 824, 0, 824, 0, 1454, 0,
+ 0, 1455, 824, 824, 824, 824, 1454, 1558, 824, 824,
+ 1455, 1569, 1568, 824, 1506, 1506, 1506, 1506, 1456, 1456,
+ 1456, 1456, 0, 1506, 0, 1455, 1758, 1758, 1758, 1758,
+ 0, 1456, 0, 1455, 1569, 1758, 1758, 824, 825, 825,
+ 825, 825, 1758, 825, 1456, 0, 1506, 0, 1506, 825,
+
+ 825, 825, 825, 1456, 0, 825, 825, 0, 0, 0,
+ 825, 1648, 1648, 1648, 1648, 0, 0, 0, 1456, 1506,
+ 0, 1506, 1855, 1855, 1855, 1855, 1456, 1648, 1648, 1526,
+ 1526, 1526, 1526, 0, 825, 826, 826, 826, 826, 826,
+ 0, 826, 826, 826, 826, 826, 826, 826, 826, 826,
+ 826, 826, 826, 826, 826, 1526, 0, 0, 0, 1649,
+ 1649, 1649, 1649, 0, 1526, 1576, 1576, 1576, 1576, 0,
+ 0, 1461, 1461, 1461, 1461, 1649, 1649, 826, 826, 1526,
+ 1461, 1576, 0, 0, 1461, 0, 0, 1526, 0, 1835,
+ 1835, 1835, 1835, 1622, 1622, 1622, 1622, 1461, 0, 1576,
+
+ 826, 827, 827, 827, 827, 827, 1461, 827, 827, 827,
+ 827, 827, 827, 827, 827, 827, 827, 827, 827, 827,
+ 827, 1461, 1576, 0, 0, 1622, 1835, 0, 0, 1461,
+ 0, 1577, 1577, 1577, 1577, 0, 0, 1462, 1462, 1462,
+ 1462, 0, 0, 827, 827, 0, 1462, 1577, 1622, 1835,
+ 1462, 0, 1589, 1589, 1589, 1589, 0, 0, 1604, 1604,
+ 1604, 1604, 0, 1462, 0, 1577, 827, 835, 1589, 1589,
+ 835, 835, 1462, 835, 835, 835, 835, 835, 835, 835,
+ 835, 835, 835, 835, 835, 835, 835, 1462, 1577, 1589,
+ 1604, 1650, 1650, 1650, 1650, 1462, 1604, 0, 0, 0,
+
+ 1626, 1626, 1626, 1626, 0, 835, 0, 1650, 1650, 835,
+ 835, 0, 1589, 1604, 1516, 1516, 1516, 1516, 0, 1604,
+ 1621, 1621, 1621, 1621, 1627, 1627, 1627, 1627, 835, 1621,
+ 1516, 1516, 835, 836, 1626, 1516, 836, 836, 0, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 0, 1621, 836, 1516, 1626, 1627, 1516,
+ 0, 1729, 1729, 1729, 1729, 0, 1578, 1578, 1578, 1578,
+ 0, 1843, 1843, 1843, 1843, 836, 836, 1621, 1729, 836,
+ 1843, 1627, 1578, 1578, 0, 0, 0, 1631, 1631, 1631,
+ 1631, 0, 0, 1497, 1497, 1497, 1497, 0, 836, 837,
+
+ 1578, 0, 837, 837, 837, 837, 837, 837, 837, 837,
+ 837, 837, 837, 837, 837, 837, 837, 837, 837, 1497,
+ 0, 1631, 0, 1578, 0, 1497, 0, 0, 1497, 1651,
+ 1651, 1651, 1651, 837, 0, 0, 0, 0, 1651, 1651,
+ 0, 837, 837, 1497, 1631, 1651, 1651, 0, 1497, 0,
+ 0, 1497, 1844, 1844, 1844, 1844, 837, 1776, 1776, 1776,
+ 1776, 1844, 0, 0, 837, 838, 1776, 0, 838, 838,
+ 838, 838, 838, 838, 838, 838, 838, 838, 838, 838,
+ 838, 838, 838, 838, 838, 1466, 1466, 1466, 1466, 1527,
+ 1527, 1527, 1527, 0, 1466, 1776, 0, 0, 1466, 0,
+
+ 0, 0, 838, 1467, 1467, 1467, 1467, 838, 838, 0,
+ 0, 1466, 1467, 0, 0, 1527, 1467, 0, 1776, 0,
+ 1466, 0, 0, 0, 1527, 838, 0, 0, 0, 1467,
+ 838, 844, 844, 844, 844, 1466, 0, 844, 1467, 1527,
+ 0, 0, 844, 1466, 844, 0, 0, 1527, 0, 0,
+ 844, 0, 0, 1467, 0, 0, 0, 844, 0, 0,
+ 0, 1467, 1478, 1478, 1478, 1478, 844, 0, 0, 1498,
+ 1498, 1498, 1498, 1561, 1561, 1561, 1561, 0, 0, 1478,
+ 0, 844, 0, 1500, 1500, 1500, 1500, 1478, 0, 844,
+ 845, 845, 845, 845, 0, 1498, 0, 1478, 0, 1561,
+
+ 0, 1498, 0, 845, 1498, 1500, 0, 0, 1561, 1500,
+ 0, 1478, 0, 0, 845, 0, 845, 0, 1500, 1498,
+ 1478, 0, 0, 1561, 1498, 845, 0, 1498, 0, 1500,
+ 0, 1561, 0, 1500, 1632, 1632, 1632, 1632, 845, 0,
+ 845, 1500, 0, 1499, 1499, 1499, 1499, 0, 845, 846,
+ 846, 846, 846, 0, 1523, 1523, 1523, 1523, 0, 0,
+ 0, 0, 846, 1499, 0, 0, 0, 1523, 1632, 1499,
+ 0, 1523, 0, 0, 1733, 846, 0, 1733, 1499, 0,
+ 1523, 0, 0, 846, 846, 0, 0, 1499, 0, 1523,
+ 0, 1632, 0, 1499, 1733, 0, 1733, 0, 0, 846,
+
+ 0, 1499, 0, 0, 1523, 0, 846, 846, 847, 847,
+ 847, 847, 1523, 1540, 1540, 1540, 1540, 0, 1733, 0,
+ 1733, 847, 1540, 0, 0, 0, 1540, 1542, 1542, 1542,
+ 1542, 0, 847, 0, 847, 0, 1542, 0, 0, 1540,
+ 1542, 0, 0, 847, 1585, 1585, 1585, 1585, 1540, 1636,
+ 1636, 1636, 1636, 1542, 0, 0, 847, 0, 847, 0,
+ 0, 1585, 1542, 1540, 0, 0, 847, 848, 848, 848,
+ 848, 1540, 1548, 1548, 1548, 1548, 0, 1542, 1585, 0,
+ 848, 0, 0, 1636, 0, 1542, 0, 0, 1548, 1548,
+ 0, 0, 0, 848, 0, 0, 1548, 0, 0, 0,
+
+ 0, 1585, 848, 0, 0, 848, 1636, 0, 0, 1549,
+ 1549, 1549, 1549, 1560, 1560, 1560, 1560, 848, 0, 0,
+ 1548, 1629, 1629, 1629, 1629, 848, 1549, 0, 848, 849,
+ 849, 849, 849, 0, 0, 1560, 0, 1629, 1629, 1560,
+ 0, 0, 849, 1549, 0, 1549, 1629, 0, 1560, 1562,
+ 1562, 1562, 1562, 849, 0, 849, 0, 0, 0, 1560,
+ 0, 0, 0, 1560, 849, 0, 1549, 0, 1549, 0,
+ 1629, 1560, 0, 0, 0, 1562, 0, 849, 0, 849,
+ 0, 1562, 0, 0, 1562, 0, 0, 849, 850, 850,
+ 850, 850, 1572, 1572, 1572, 1572, 0, 0, 0, 1562,
+
+ 0, 850, 0, 0, 1562, 0, 0, 1562, 1678, 1678,
+ 1678, 1678, 850, 0, 850, 0, 0, 1572, 0, 1579,
+ 1579, 1579, 1579, 850, 1678, 1678, 1572, 850, 1579, 1579,
+ 0, 1690, 1690, 1690, 1690, 1579, 850, 0, 850, 0,
+ 0, 1572, 1683, 1683, 1683, 1683, 850, 1690, 1690, 1572,
+ 850, 864, 0, 1579, 864, 864, 0, 864, 864, 864,
+ 864, 864, 864, 864, 864, 864, 864, 864, 864, 864,
+ 864, 0, 0, 0, 1683, 0, 1579, 0, 0, 0,
+ 0, 1610, 1610, 1610, 1610, 0, 864, 1566, 1566, 1566,
+ 1566, 0, 0, 864, 864, 0, 1566, 1683, 1610, 0,
+
+ 1566, 0, 1653, 1653, 1653, 1653, 0, 0, 0, 864,
+ 0, 0, 0, 1566, 0, 1610, 864, 865, 1653, 1653,
+ 865, 865, 1566, 865, 865, 865, 865, 865, 865, 865,
+ 865, 865, 865, 865, 865, 865, 865, 1566, 1610, 1653,
+ 0, 865, 0, 0, 0, 1566, 0, 1679, 1679, 1679,
+ 1679, 0, 0, 0, 1567, 1567, 1567, 1567, 0, 865,
+ 865, 0, 1653, 1567, 1679, 865, 0, 1567, 0, 1679,
+ 1607, 1607, 1607, 1607, 1644, 1644, 1644, 1644, 0, 0,
+ 1567, 0, 865, 871, 871, 871, 871, 0, 0, 1567,
+ 1607, 1644, 0, 1679, 0, 0, 0, 1644, 0, 0,
+
+ 1583, 1583, 1583, 1583, 1567, 1607, 0, 0, 871, 1583,
+ 1583, 871, 1567, 0, 1607, 0, 1583, 871, 871, 0,
+ 0, 1644, 0, 0, 1687, 1687, 1687, 1687, 1607, 0,
+ 0, 0, 871, 0, 1583, 871, 1697, 1697, 1697, 1697,
+ 871, 871, 887, 887, 887, 887, 887, 887, 887, 887,
+ 887, 887, 0, 1697, 887, 887, 887, 1583, 1687, 887,
+ 0, 887, 887, 0, 0, 887, 0, 887, 0, 887,
+ 1588, 1588, 1588, 1588, 0, 0, 0, 1697, 887, 1588,
+ 1588, 1687, 0, 0, 0, 887, 1588, 1588, 0, 887,
+ 0, 887, 0, 887, 0, 0, 1692, 1692, 1692, 1692,
+
+ 1697, 887, 0, 0, 1588, 0, 0, 0, 887, 888,
+ 888, 888, 888, 888, 888, 888, 888, 888, 888, 0,
+ 0, 888, 888, 888, 0, 0, 888, 1588, 888, 888,
+ 1692, 0, 888, 0, 888, 0, 888, 1605, 1605, 1605,
+ 1605, 1713, 1713, 1713, 1713, 888, 1755, 1755, 1755, 1755,
+ 1605, 0, 888, 1692, 0, 0, 888, 0, 888, 0,
+ 888, 0, 1755, 1605, 0, 0, 0, 0, 888, 0,
+ 0, 0, 1605, 1713, 0, 888, 895, 895, 895, 895,
+ 1606, 1606, 1606, 1606, 0, 0, 0, 1605, 1755, 1637,
+ 1637, 1637, 1637, 1606, 0, 1605, 1713, 0, 895, 0,
+
+ 895, 1725, 1725, 1725, 1725, 1637, 1606, 0, 895, 895,
+ 1616, 1616, 1616, 1616, 0, 1606, 0, 1725, 1725, 1616,
+ 0, 0, 895, 1637, 895, 1633, 1633, 1633, 1633, 0,
+ 1606, 895, 895, 898, 898, 898, 898, 0, 1606, 0,
+ 0, 0, 1616, 0, 1616, 0, 1637, 0, 0, 0,
+ 1633, 1618, 1618, 1618, 1618, 898, 0, 898, 0, 1633,
+ 1618, 0, 0, 0, 0, 1616, 0, 1616, 0, 898,
+ 898, 0, 0, 0, 1633, 0, 0, 1618, 0, 898,
+ 0, 898, 1633, 0, 0, 0, 1618, 1638, 1638, 1638,
+ 1638, 0, 898, 898, 917, 917, 917, 917, 0, 917,
+
+ 0, 1618, 0, 1638, 0, 917, 917, 917, 917, 1618,
+ 0, 917, 917, 1619, 1619, 1619, 1619, 1663, 1663, 1663,
+ 1663, 1638, 1619, 0, 0, 0, 1639, 1639, 1639, 1639,
+ 0, 0, 917, 0, 1756, 1756, 1756, 1756, 0, 1619,
+ 0, 1663, 1639, 1639, 1638, 0, 0, 0, 1619, 1663,
+ 1756, 0, 0, 0, 0, 917, 918, 918, 918, 918,
+ 1639, 918, 0, 1619, 0, 1663, 0, 918, 918, 918,
+ 918, 1619, 1663, 918, 918, 0, 1756, 0, 0, 1640,
+ 1640, 1640, 1640, 1639, 1652, 1652, 1652, 1652, 1640, 1640,
+ 0, 918, 0, 1652, 1652, 1640, 1693, 1693, 1693, 1693,
+
+ 1652, 1652, 0, 1723, 1723, 1723, 1723, 1652, 1669, 1669,
+ 1669, 1669, 0, 1640, 918, 927, 927, 0, 927, 927,
+ 927, 927, 927, 927, 927, 927, 927, 927, 927, 927,
+ 1693, 1652, 927, 927, 927, 927, 1640, 1723, 0, 0,
+ 1669, 0, 0, 0, 0, 1723, 1669, 0, 1701, 1701,
+ 1701, 1701, 927, 1693, 0, 0, 0, 1701, 927, 0,
+ 1723, 0, 0, 1669, 1701, 1701, 0, 0, 0, 1669,
+ 0, 1655, 1655, 1655, 1655, 927, 0, 0, 0, 0,
+ 1655, 927, 928, 928, 0, 928, 928, 928, 928, 928,
+ 928, 928, 928, 928, 928, 928, 928, 1655, 0, 928,
+
+ 928, 928, 928, 0, 0, 0, 1655, 1685, 1685, 1685,
+ 1685, 1718, 1718, 1718, 1718, 0, 1685, 0, 0, 0,
+ 928, 1655, 0, 0, 0, 928, 0, 0, 1718, 1655,
+ 0, 0, 0, 1685, 0, 1718, 1760, 1760, 1760, 1760,
+ 0, 0, 1685, 928, 1674, 1674, 1674, 1674, 928, 935,
+ 935, 935, 935, 1760, 935, 0, 0, 1685, 0, 1718,
+ 935, 935, 935, 935, 1674, 1685, 935, 935, 1656, 1656,
+ 1656, 1656, 1735, 1735, 1735, 1735, 0, 0, 1760, 1674,
+ 0, 1656, 0, 0, 0, 1656, 0, 935, 1674, 0,
+ 1695, 1695, 1695, 1695, 1656, 1671, 1671, 1671, 1671, 0,
+
+ 0, 0, 1674, 1656, 1735, 0, 1695, 1695, 1671, 0,
+ 935, 936, 936, 936, 936, 1695, 936, 0, 1656, 0,
+ 0, 1671, 936, 936, 936, 936, 1656, 1735, 936, 936,
+ 1671, 1673, 1673, 1673, 1673, 936, 0, 0, 0, 1695,
+ 1726, 1726, 1726, 1726, 1673, 1671, 0, 0, 0, 1686,
+ 1686, 1686, 1686, 1671, 0, 0, 1726, 1673, 1686, 936,
+ 949, 949, 949, 949, 0, 0, 1673, 0, 0, 1706,
+ 1706, 1706, 1706, 949, 1726, 1686, 1744, 1744, 1744, 1744,
+ 0, 1673, 1726, 0, 1686, 0, 949, 0, 0, 1673,
+ 0, 0, 0, 1706, 0, 949, 949, 1726, 0, 1686,
+
+ 0, 1706, 1779, 1779, 1779, 1779, 0, 1686, 1744, 0,
+ 949, 0, 0, 1708, 1708, 1708, 1708, 1706, 949, 949,
+ 950, 950, 950, 950, 1706, 1700, 1700, 1700, 1700, 0,
+ 1779, 1744, 0, 950, 1700, 1700, 0, 0, 0, 1708,
+ 0, 1700, 1700, 0, 0, 1708, 950, 0, 1708, 0,
+ 0, 0, 950, 0, 1779, 950, 0, 0, 1709, 1709,
+ 1709, 1709, 0, 1708, 0, 0, 1700, 0, 1708, 0,
+ 950, 1708, 0, 0, 0, 950, 0, 0, 950, 957,
+ 957, 957, 957, 0, 1709, 0, 0, 0, 0, 1700,
+ 1709, 0, 957, 1709, 1710, 1710, 1710, 1710, 1766, 1766,
+
+ 1766, 1766, 0, 957, 0, 957, 0, 0, 1709, 1727,
+ 1727, 1727, 1727, 1709, 957, 0, 1709, 0, 1710, 1732,
+ 1732, 1732, 1732, 0, 0, 1727, 1710, 957, 1732, 957,
+ 1766, 1749, 1749, 1749, 1749, 1732, 1732, 957, 961, 961,
+ 961, 961, 1710, 1727, 0, 0, 0, 961, 1749, 1710,
+ 0, 1727, 0, 1766, 1730, 1730, 1730, 1730, 1737, 1737,
+ 1737, 1737, 961, 1730, 1730, 0, 1727, 0, 1749, 0,
+ 1730, 1730, 961, 1739, 1739, 1739, 1739, 961, 0, 0,
+ 1738, 1738, 1738, 1738, 1737, 0, 961, 0, 0, 0,
+ 1737, 1749, 0, 1737, 0, 961, 0, 1739, 0, 0,
+
+ 961, 1041, 1041, 1041, 1041, 1739, 1738, 0, 1737, 0,
+ 0, 0, 1738, 1737, 1041, 1738, 1737, 1745, 1745, 1745,
+ 1745, 1739, 1752, 1752, 1752, 1752, 0, 1041, 1739, 1041,
+ 1738, 1851, 1851, 1851, 1851, 1738, 1041, 0, 1738, 0,
+ 1851, 1747, 1747, 1747, 1747, 0, 0, 1752, 0, 1745,
+ 1747, 1041, 0, 1041, 0, 1745, 0, 0, 0, 1041,
+ 1042, 1042, 1042, 1042, 0, 0, 0, 1757, 1757, 1757,
+ 1757, 1752, 1745, 1042, 0, 1747, 1757, 1757, 1745, 1747,
+ 0, 1757, 0, 1757, 0, 0, 1042, 1759, 1759, 1759,
+ 1759, 0, 1042, 0, 0, 1042, 1759, 1759, 1747, 0,
+
+ 0, 0, 1747, 1759, 0, 1809, 1809, 1809, 1809, 1757,
+ 1042, 0, 1759, 0, 0, 1042, 0, 0, 1042, 1044,
+ 1044, 1044, 1044, 0, 1761, 1761, 1761, 1761, 1764, 1764,
+ 1764, 1764, 1044, 1809, 0, 0, 1759, 1764, 0, 1044,
+ 1761, 1761, 0, 0, 1764, 1044, 0, 1809, 1762, 1762,
+ 1762, 1762, 0, 0, 1044, 0, 0, 1809, 1763, 1763,
+ 1763, 1763, 0, 1044, 1762, 1762, 1761, 1763, 1763, 1044,
+ 0, 0, 1763, 0, 1763, 1763, 0, 1044, 1049, 1049,
+ 1049, 1049, 0, 0, 0, 0, 1770, 1770, 1770, 1770,
+ 1762, 1049, 1852, 1852, 1852, 1852, 1771, 1771, 1771, 1771,
+
+ 1763, 1852, 1049, 0, 1049, 1771, 1791, 1791, 1791, 1791,
+ 1770, 0, 0, 1049, 0, 1791, 1791, 0, 1770, 0,
+ 1771, 0, 1791, 0, 0, 0, 1049, 0, 1049, 0,
+ 1771, 0, 0, 0, 1770, 0, 1049, 1092, 1092, 1092,
+ 1092, 1770, 0, 0, 1771, 0, 1802, 1802, 1802, 1802,
+ 1092, 0, 0, 1771, 1092, 1802, 1774, 1774, 1774, 1774,
+ 0, 1092, 0, 1092, 0, 1774, 0, 0, 0, 1774,
+ 1802, 0, 1092, 0, 0, 1775, 1775, 1775, 1775, 0,
+ 0, 0, 1774, 0, 1775, 1092, 0, 1092, 1775, 0,
+ 0, 1774, 0, 0, 1802, 1092, 1093, 1093, 1093, 1093,
+
+ 0, 1775, 1792, 1792, 1792, 1792, 1774, 0, 0, 1093,
+ 1775, 1792, 1792, 1093, 1774, 0, 0, 0, 1792, 0,
+ 0, 0, 1093, 0, 0, 1775, 1795, 1795, 1795, 1795,
+ 1093, 1093, 0, 1775, 0, 1795, 1795, 1815, 1815, 1815,
+ 1815, 0, 1795, 0, 0, 0, 1093, 0, 0, 0,
+ 0, 0, 0, 1093, 1093, 1125, 1125, 1125, 1125, 1125,
+ 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125,
+ 1125, 1815, 1125, 1125, 1125, 1125, 1788, 1788, 1788, 1788,
+ 1789, 1789, 1789, 1789, 1790, 1790, 1790, 1790, 0, 0,
+ 0, 0, 1788, 0, 1815, 0, 1789, 0, 1125, 0,
+
+ 1790, 1790, 0, 0, 1788, 0, 0, 0, 1789, 0,
+ 0, 0, 1790, 0, 1798, 1798, 1798, 1798, 0, 0,
+ 0, 1125, 1148, 1148, 1148, 1148, 0, 0, 1788, 0,
+ 0, 0, 1789, 0, 0, 1148, 1790, 0, 1798, 0,
+ 1799, 1799, 1799, 1799, 1148, 0, 1798, 0, 1148, 1799,
+ 0, 1800, 1800, 1800, 1800, 0, 0, 1148, 0, 0,
+ 1800, 0, 1798, 0, 1799, 0, 0, 0, 1148, 1798,
+ 0, 0, 1148, 0, 1799, 0, 0, 1800, 0, 0,
+ 1148, 1187, 1187, 1187, 1187, 0, 1800, 1187, 1799, 0,
+ 0, 0, 1187, 0, 1187, 0, 0, 1799, 1187, 0,
+
+ 1187, 1800, 1801, 1801, 1801, 1801, 0, 1187, 0, 1800,
+ 0, 1801, 1804, 1804, 1804, 1804, 1187, 1810, 1810, 1810,
+ 1810, 0, 1811, 1811, 1811, 1811, 0, 0, 1801, 0,
+ 0, 1187, 0, 1828, 1828, 1828, 1828, 1801, 0, 1187,
+ 1188, 1188, 1188, 1188, 1804, 1810, 1816, 1816, 1816, 1816,
+ 1811, 0, 1801, 1188, 0, 0, 0, 1188, 0, 0,
+ 1801, 1817, 1817, 1817, 1817, 1828, 1188, 1804, 0, 1810,
+ 0, 0, 0, 1188, 1811, 1188, 1819, 1819, 1819, 1819,
+ 1816, 1820, 1820, 1820, 1820, 0, 1817, 0, 1828, 0,
+ 1188, 0, 1819, 1819, 0, 1817, 1188, 1820, 1188, 1189,
+
+ 1189, 1189, 1189, 1816, 1821, 1821, 1821, 1821, 0, 1820,
+ 1817, 0, 1189, 1819, 0, 0, 1189, 0, 1817, 0,
+ 1821, 0, 0, 1820, 0, 1189, 0, 0, 1827, 1827,
+ 1827, 1827, 1821, 1820, 1189, 1189, 1819, 1827, 1827, 1830,
+ 1830, 1830, 1830, 0, 1827, 0, 1821, 0, 1830, 1189,
+ 0, 0, 0, 0, 0, 0, 1821, 1189, 1189, 1190,
+ 1190, 1190, 1190, 0, 0, 1830, 0, 1831, 1831, 1831,
+ 1831, 0, 0, 0, 1830, 0, 1831, 1838, 1838, 1838,
+ 1838, 1190, 0, 1190, 0, 1832, 1832, 1832, 1832, 1830,
+ 0, 0, 1190, 1831, 1832, 1190, 0, 1830, 1839, 1839,
+
+ 1839, 1839, 1831, 0, 0, 1190, 0, 1190, 0, 1832,
+ 0, 1838, 0, 0, 0, 1190, 0, 1831, 1190, 1194,
+ 1194, 1194, 1194, 0, 0, 1831, 1839, 1841, 1841, 1841,
+ 1841, 0, 1194, 1832, 1838, 0, 1840, 1840, 1840, 1840,
+ 0, 0, 0, 1841, 1841, 1194, 1842, 1842, 1842, 1842,
+ 1839, 1194, 0, 0, 1194, 1842, 1842, 0, 1849, 1849,
+ 1849, 1849, 1842, 0, 1840, 0, 0, 0, 0, 1194,
+ 1840, 0, 0, 0, 1194, 0, 0, 1194, 1195, 1195,
+ 1195, 1195, 0, 1842, 0, 0, 0, 0, 1840, 0,
+ 0, 1195, 1849, 1840, 0, 1849, 0, 0, 1850, 1850,
+
+ 1850, 1850, 0, 0, 1195, 0, 1842, 1850, 1850, 0,
+ 1195, 0, 0, 1195, 1850, 1849, 0, 0, 1849, 1856,
+ 1856, 1856, 1856, 0, 0, 0, 0, 0, 1195, 0,
+ 0, 0, 0, 1195, 0, 0, 1195, 1213, 1213, 1213,
+ 1213, 0, 1213, 0, 0, 0, 0, 0, 1213, 1213,
+ 1213, 1213, 1213, 1856, 1213, 1213, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1857,
+ 1857, 1857, 1857, 0, 0, 0, 1856, 0, 0, 1213,
+ 1213, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215,
+ 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1857, 1215, 1215,
+
+ 1215, 1215, 0, 1857, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1857, 0, 0, 1215, 0, 1857, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1215, 1218, 1218,
+ 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
+ 1218, 1218, 1218, 1218, 0, 1218, 1218, 1218, 1218, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1218, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1218, 1220, 1220, 1220, 1220, 1220,
+ 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220,
+ 1220, 0, 1220, 1220, 1220, 1220, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1220, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1220, 1234, 1234, 1234, 1234, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1234, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 1234, 0,
+ 0, 0, 0, 0, 1234, 0, 0, 1234, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1234, 0, 0, 0, 0, 1234, 0, 0,
+ 1234, 1235, 1235, 1235, 1235, 0, 0, 0, 0, 0,
+ 1235, 0, 0, 0, 1235, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1235, 0, 0,
+ 0, 0, 0, 0, 0, 1235, 1235, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1235, 0, 0, 0, 0, 0, 0, 1235, 1235,
+
+ 1271, 1271, 1271, 1271, 0, 0, 1271, 0, 0, 0,
+ 0, 1271, 0, 1271, 0, 0, 0, 1271, 0, 1271,
+ 0, 0, 0, 0, 0, 0, 1271, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1271, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1271, 0, 0, 0, 0, 0, 0, 0, 1271, 1272,
+ 1272, 1272, 1272, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1272, 0, 0, 0, 1272, 0, 0, 0,
+ 0, 0, 0, 1272, 0, 1272, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1272, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 1272, 0, 1272,
+ 0, 0, 0, 0, 0, 0, 0, 1272, 1273, 1273,
+ 1273, 1273, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1273, 0, 0, 0, 1273, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1273, 0, 0, 0, 0, 0,
+ 0, 0, 1273, 1273, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1273, 0,
+ 0, 0, 0, 0, 0, 1273, 1273, 1274, 1274, 1274,
+ 1274, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1274, 0, 0, 0, 1274, 0, 0, 0, 0, 0,
+
+ 0, 1274, 0, 1274, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1274, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1274, 0, 1274, 0, 0,
+ 0, 0, 0, 0, 0, 1274, 1275, 1275, 1275, 1275,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1275,
+ 0, 0, 0, 1275, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1275, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1275, 0, 0, 1275, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1275, 0, 0, 0,
+ 0, 0, 0, 0, 1275, 0, 0, 1275, 1278, 1278,
+
+ 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 0, 0,
+ 1278, 1278, 1278, 0, 0, 1278, 0, 1278, 1278, 0,
+ 0, 0, 0, 0, 0, 1278, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1278, 0, 0, 0, 0, 0,
+ 0, 1278, 0, 0, 0, 0, 0, 0, 0, 1278,
+ 0, 0, 0, 0, 0, 0, 0, 1278, 0, 0,
+ 0, 0, 0, 0, 1278, 1282, 1282, 1282, 1282, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1282, 0, 1282,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1282, 0,
+
+ 0, 1282, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1282, 0, 1282, 0, 0, 0, 0, 0, 0,
+ 0, 1282, 0, 0, 1282, 1293, 1293, 1293, 1293, 0,
+ 0, 0, 0, 0, 0, 0, 1293, 1293, 1293, 0,
+ 1293, 0, 1293, 1293, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1293, 1293, 1294,
+ 1294, 1294, 1294, 0, 1294, 0, 0, 0, 0, 0,
+ 1294, 1294, 1294, 1294, 1294, 0, 1294, 1294, 0, 0,
+ 0, 0, 0, 0, 1294, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 1294, 0, 0, 0, 0, 0,
+ 0, 1294, 1294, 0, 0, 0, 0, 0, 1294, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1294, 1298, 1298,
+ 1298, 1298, 0, 0, 0, 0, 0, 0, 0, 1298,
+ 1298, 1298, 0, 1298, 0, 1298, 1298, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1298, 1298, 1300, 1300, 1300, 1300, 0, 1300, 0, 0,
+ 0, 0, 0, 1300, 1300, 1300, 1300, 1300, 0, 1300,
+ 1300, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1300, 1300, 1301, 0, 0, 1301,
+ 1301, 0, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301,
+ 1301, 1301, 1301, 1301, 1301, 1301, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1301, 1301,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1301, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303,
+ 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 0, 1303,
+
+ 1303, 1303, 1303, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1303, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1303, 1311,
+ 1311, 1311, 1311, 0, 0, 0, 0, 0, 0, 0,
+ 1311, 1311, 1311, 0, 1311, 0, 1311, 1311, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1311, 1311, 1313, 1313, 1313, 1313, 0, 1313, 0,
+
+ 0, 0, 0, 0, 1313, 1313, 1313, 1313, 1313, 0,
+ 1313, 1313, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1313, 1313, 1316, 1316, 1316,
+ 1316, 0, 1316, 0, 0, 0, 0, 0, 1316, 1316,
+ 1316, 1316, 1316, 0, 1316, 1316, 0, 0, 0, 0,
+ 0, 0, 1316, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1316, 0, 0, 0, 0, 0, 0, 1316,
+ 1316, 0, 0, 0, 0, 0, 1316, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1316, 1317, 1317, 1317, 1317,
+
+ 0, 1317, 0, 0, 0, 0, 0, 1317, 1317, 1317,
+ 1317, 0, 0, 1317, 1317, 0, 0, 0, 0, 0,
+ 1317, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1317, 1319, 0, 0, 1319, 1319,
+ 0, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+ 1319, 1319, 1319, 1319, 1319, 0, 0, 0, 1319, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1319, 1319, 0,
+ 0, 0, 1319, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1319, 1320, 1320, 1320, 1320, 1320, 0, 1320, 1320, 1320,
+ 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320,
+ 1320, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1320, 1320, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1320, 1323, 1323, 1323,
+ 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323,
+ 1323, 1323, 1323, 1323, 1323, 1323, 1323, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1323, 0, 0, 0, 0, 0, 0, 1323,
+ 1323, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1323, 0, 0, 0, 0,
+ 0, 0, 1323, 1328, 1328, 1328, 1328, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1328, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1328,
+ 0, 0, 0, 0, 0, 0, 0, 1328, 1328, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1328, 0, 0, 0, 0, 0, 0,
+
+ 1328, 1328, 1337, 1337, 1337, 1337, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1337, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1337, 0,
+ 1337, 0, 0, 0, 0, 0, 0, 1337, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1337, 0, 1337, 0, 0, 0, 0, 0,
+ 1337, 1338, 1338, 1338, 1338, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1338, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1338, 0, 0,
+ 0, 0, 0, 1338, 0, 0, 1338, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1338, 0, 0, 0, 0, 1338, 0, 0, 1338,
+ 1340, 1340, 1340, 1340, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1340, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1340, 0, 0, 0,
+ 0, 0, 1340, 0, 0, 1340, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1340, 0, 0, 0, 0, 1340, 0, 0, 1340, 1345,
+ 1345, 1345, 1345, 0, 1345, 0, 0, 0, 1345, 1345,
+ 1345, 1345, 1345, 1345, 0, 1345, 0, 1345, 1346, 1346,
+
+ 1346, 1346, 0, 1346, 0, 0, 0, 1346, 1346, 1346,
+ 1346, 1346, 1346, 0, 1346, 0, 1346, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1346, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1346, 1350, 1350, 1350, 1350, 1350,
+ 0, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350,
+ 1350, 1350, 1350, 1350, 1350, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1350, 1350, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1350, 1353, 1353, 1353, 1353, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1353, 0, 0, 0, 1353, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1353, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1353, 1353, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1353, 0, 0, 0, 0, 0, 0, 0, 1353,
+ 1353, 1354, 1354, 1354, 1354, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1354, 0, 0, 0, 1354, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 1354, 0, 0,
+ 0, 0, 0, 1354, 0, 0, 1354, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1354, 0, 0, 0, 0, 1354, 0, 0, 1354,
+ 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355,
+ 0, 0, 1355, 1355, 1355, 0, 0, 1355, 0, 1355,
+ 1355, 0, 0, 0, 0, 0, 0, 1355, 0, 0,
+ 0, 0, 0, 0, 1355, 0, 1355, 0, 0, 0,
+ 0, 0, 0, 1355, 0, 0, 0, 0, 0, 0,
+ 0, 1355, 0, 0, 0, 0, 0, 1355, 0, 1355,
+
+ 0, 0, 0, 0, 0, 0, 1355, 1356, 1356, 1356,
+ 1356, 1356, 1356, 1356, 1356, 1356, 1356, 0, 0, 1356,
+ 1356, 1356, 0, 0, 1356, 0, 1356, 1356, 0, 0,
+ 0, 0, 0, 0, 1356, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1356, 1356, 0, 0, 0, 0, 0,
+ 1356, 0, 0, 0, 0, 0, 0, 0, 1356, 0,
+ 0, 0, 0, 0, 0, 0, 1356, 1356, 0, 0,
+ 0, 0, 0, 1356, 1357, 1357, 1357, 1357, 1357, 1357,
+ 1357, 1357, 1357, 1357, 0, 0, 1357, 1357, 1357, 0,
+ 0, 1357, 0, 1357, 1357, 0, 0, 0, 0, 0,
+
+ 0, 1357, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1357, 0, 0, 0, 0, 0, 0, 1357, 0, 0,
+ 0, 0, 0, 0, 0, 1357, 0, 0, 0, 0,
+ 0, 0, 0, 1357, 0, 0, 0, 0, 0, 0,
+ 1357, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358,
+ 1358, 0, 0, 1358, 1358, 1358, 0, 0, 1358, 0,
+ 1358, 1358, 0, 0, 0, 0, 0, 0, 1358, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1358, 0, 0,
+ 0, 0, 0, 0, 1358, 0, 0, 0, 0, 0,
+ 0, 0, 1358, 0, 0, 0, 0, 0, 0, 0,
+
+ 1358, 0, 0, 0, 0, 0, 0, 1358, 1359, 1359,
+ 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 0, 0,
+ 1359, 1359, 1359, 0, 0, 1359, 0, 1359, 1359, 0,
+ 0, 0, 0, 0, 0, 1359, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1359, 0, 0, 0, 0, 0,
+ 0, 1359, 0, 0, 0, 0, 0, 0, 0, 1359,
+ 0, 0, 0, 0, 0, 0, 0, 1359, 0, 0,
+ 0, 0, 0, 0, 1359, 1360, 1360, 1360, 1360, 1360,
+ 1360, 1360, 1360, 1360, 1360, 0, 0, 1360, 1360, 1360,
+ 0, 0, 1360, 0, 1360, 1360, 0, 0, 0, 0,
+
+ 0, 0, 1360, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1360, 0, 0, 0, 0, 0, 0, 1360, 0,
+ 0, 0, 0, 0, 0, 0, 1360, 0, 0, 0,
+ 0, 0, 0, 0, 1360, 0, 0, 0, 0, 0,
+ 0, 1360, 1372, 1372, 1372, 1372, 0, 0, 0, 0,
+ 0, 0, 0, 1372, 1372, 1372, 0, 1372, 0, 1372,
+ 1372, 0, 0, 0, 0, 0, 0, 1372, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1372, 0, 0,
+ 0, 0, 0, 0, 1372, 1372, 0, 0, 0, 0,
+ 0, 1372, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 1372, 1380, 1380, 1380, 1380, 0, 1380, 0, 0, 0,
+ 0, 0, 1380, 1380, 1380, 1380, 0, 0, 1380, 1380,
+ 1381, 1381, 1381, 1381, 0, 1381, 0, 0, 0, 0,
+ 0, 1381, 1381, 1381, 1381, 0, 0, 1381, 1381, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1381,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1381, 1384, 1384, 1384, 1384, 0, 1384, 0,
+ 0, 0, 0, 0, 1384, 1384, 1384, 1384, 1384, 0,
+
+ 1384, 1384, 0, 0, 0, 0, 0, 0, 1384, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1384, 0,
+ 0, 0, 0, 0, 0, 1384, 1384, 0, 0, 0,
+ 0, 0, 1384, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1384, 1386, 1386, 1386, 1386, 0, 0, 0, 0,
+ 0, 0, 0, 1386, 1386, 1386, 0, 1386, 0, 1386,
+ 1386, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1386, 1386, 1387, 1387, 1387, 1387,
+ 0, 0, 0, 0, 0, 0, 0, 1387, 1387, 1387,
+
+ 0, 1387, 0, 1387, 1387, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1387, 1387,
+ 1388, 1388, 1388, 1388, 0, 1388, 0, 0, 0, 0,
+ 0, 1388, 1388, 1388, 1388, 1388, 0, 1388, 1388, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1388, 1388, 1389, 1389, 1389, 1389, 0, 1389,
+ 0, 0, 0, 0, 0, 1389, 1389, 1389, 1389, 1389,
+ 0, 1389, 1389, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1389, 1389, 1390, 0,
+ 0, 1390, 1390, 0, 1390, 1390, 1390, 1390, 1390, 1390,
+ 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1390, 1390, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1390, 1391, 0, 0, 1391, 1391, 0,
+ 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391,
+
+ 1391, 1391, 1391, 1391, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1391, 1391, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1391,
+ 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392,
+ 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1392, 1392, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1392, 1397, 1397, 1397, 1397,
+ 0, 0, 0, 0, 0, 0, 0, 1397, 1397, 1397,
+ 0, 1397, 0, 1397, 1397, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1397, 1397,
+ 1398, 1398, 1398, 1398, 0, 0, 0, 0, 0, 0,
+ 0, 1398, 1398, 1398, 0, 1398, 0, 1398, 1398, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 1398, 1398, 1399, 1399, 1399, 1399, 0, 1399,
+ 0, 0, 0, 0, 0, 1399, 1399, 1399, 1399, 1399,
+ 0, 1399, 1399, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1399, 1399, 1400, 1400,
+ 1400, 1400, 0, 1400, 0, 0, 0, 0, 0, 1400,
+ 1400, 1400, 1400, 1400, 0, 1400, 1400, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1400, 1400, 1401, 1401, 1401, 1401, 0, 0, 0, 0,
+
+ 0, 0, 0, 1401, 1401, 1401, 0, 1401, 0, 1401,
+ 1401, 0, 0, 0, 0, 0, 0, 1401, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1401, 0, 0,
+ 0, 0, 0, 0, 1401, 1401, 0, 0, 0, 0,
+ 0, 1401, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1401, 1406, 1406, 1406, 1406, 0, 1406, 0, 0, 0,
+ 0, 0, 1406, 1406, 1406, 1406, 0, 0, 1406, 1406,
+ 1407, 1407, 1407, 1407, 0, 1407, 0, 0, 0, 0,
+ 0, 1407, 1407, 1407, 1407, 0, 0, 1407, 1407, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1407,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1407, 1409, 1409, 1409, 1409, 0, 1409, 0,
+ 0, 0, 0, 0, 1409, 1409, 1409, 1409, 1409, 0,
+ 1409, 1409, 0, 0, 0, 0, 0, 0, 1409, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1409, 0,
+ 0, 0, 0, 0, 0, 1409, 1409, 0, 0, 0,
+ 0, 0, 1409, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1409, 1410, 1410, 1410, 1410, 1410, 0, 1410, 1410,
+
+ 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410,
+ 1410, 1410, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1410, 1410, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1410, 1411, 1411,
+ 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411,
+ 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1411, 0, 0, 0, 0, 0, 0,
+
+ 1411, 1411, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1411, 0, 0, 0,
+ 0, 0, 0, 1411, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1412, 0, 0, 0, 0, 0, 1412, 1412, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1412, 0, 0, 0, 0, 0, 1412,
+ 1414, 1414, 1414, 1414, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 1414, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1414, 0, 0, 0,
+ 0, 0, 0, 1414, 0, 1414, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1414, 0, 0, 0, 0, 0, 1414, 0, 1414, 1426,
+ 1426, 1426, 1426, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1426, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1426, 0, 0, 0, 1426, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1426, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1426, 0, 0, 0, 1426,
+
+ 0, 0, 0, 0, 0, 0, 0, 1426, 1433, 1433,
+ 1433, 1433, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1433, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1433, 0, 0, 0, 0, 0,
+ 0, 0, 1433, 1433, 1433, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1433, 0,
+ 0, 0, 0, 0, 0, 1433, 1433, 1433, 1437, 1437,
+ 1437, 1437, 0, 1437, 0, 0, 0, 1437, 1437, 1437,
+ 1437, 1437, 1437, 0, 1437, 0, 1437, 1441, 1441, 1441,
+ 1441, 1441, 0, 1441, 1441, 1441, 1441, 1441, 1441, 1441,
+
+ 1441, 1441, 1441, 1441, 1441, 1441, 1441, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1441, 0, 0, 0, 0, 0, 0, 1441,
+ 1441, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1441, 0, 0, 0, 0,
+ 0, 0, 1441, 1443, 1443, 1443, 1443, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1443, 0, 0, 0,
+ 1443, 0, 0, 0, 0, 0, 0, 0, 0, 1443,
+ 0, 1443, 0, 0, 0, 0, 0, 0, 1443, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 1443, 0, 1443, 0, 0, 0, 0,
+ 0, 1443, 1444, 1444, 1444, 1444, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1444, 0, 0, 0, 1444,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1444, 0,
+ 0, 0, 0, 0, 1444, 0, 0, 1444, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1444, 0, 0, 0, 0, 1444, 0, 0,
+ 1444, 1446, 1446, 1446, 1446, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1446, 0, 0, 0, 1446, 0,
+ 0, 1446, 0, 0, 0, 0, 0, 1446, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 1446, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1446, 0, 0, 0, 0,
+ 0, 1446, 0, 0, 0, 0, 0, 0, 0, 1446,
+ 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447,
+ 0, 0, 1447, 1447, 1447, 0, 0, 1447, 0, 1447,
+ 1447, 0, 0, 0, 0, 0, 0, 1447, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1447, 0, 0, 1447,
+ 0, 0, 0, 1447, 0, 0, 0, 0, 0, 0,
+ 0, 1447, 0, 0, 0, 0, 0, 0, 0, 1447,
+ 0, 0, 1447, 0, 0, 0, 1447, 1448, 1448, 1448,
+
+ 1448, 1448, 1448, 1448, 1448, 1448, 1448, 0, 0, 1448,
+ 1448, 1448, 0, 0, 1448, 0, 1448, 1448, 1448, 0,
+ 0, 0, 0, 0, 1448, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1448, 0, 0, 0, 0, 0, 0,
+ 1448, 0, 1448, 0, 0, 0, 0, 0, 1448, 0,
+ 0, 0, 0, 0, 0, 0, 1448, 0, 0, 0,
+ 0, 0, 0, 1448, 1449, 1449, 1449, 1449, 1449, 1449,
+ 1449, 1449, 1449, 1449, 0, 0, 1449, 1449, 1449, 0,
+ 0, 1449, 0, 1449, 1449, 0, 0, 0, 0, 0,
+ 0, 1449, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 1449, 0, 0, 0, 0, 0, 0, 1449, 0, 0,
+ 0, 0, 0, 0, 0, 1449, 0, 0, 0, 0,
+ 0, 0, 0, 1449, 0, 0, 0, 0, 0, 0,
+ 1449, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450,
+ 1450, 0, 0, 1450, 1450, 1450, 0, 0, 1450, 0,
+ 1450, 1450, 0, 0, 0, 0, 0, 0, 1450, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1450, 0, 0,
+ 0, 0, 0, 0, 1450, 0, 0, 0, 0, 0,
+ 0, 0, 1450, 0, 0, 0, 0, 0, 0, 0,
+ 1450, 0, 0, 0, 0, 0, 0, 1450, 1457, 1457,
+
+ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 0, 0,
+ 1457, 1457, 1457, 0, 0, 1457, 0, 1457, 1457, 0,
+ 0, 0, 0, 0, 0, 1457, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1457, 0, 0, 0, 0, 0,
+ 0, 1457, 0, 0, 0, 0, 0, 0, 0, 1457,
+ 0, 0, 0, 0, 0, 0, 0, 1457, 0, 0,
+ 0, 0, 0, 0, 1457, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 0, 0, 1458, 1458, 1458,
+ 0, 0, 1458, 0, 1458, 1458, 0, 0, 0, 0,
+ 0, 0, 1458, 0, 0, 0, 0, 0, 0, 1458,
+
+ 0, 1458, 0, 0, 0, 0, 0, 0, 1458, 0,
+ 0, 0, 0, 0, 0, 0, 1458, 0, 0, 0,
+ 0, 0, 1458, 0, 1458, 0, 0, 0, 0, 0,
+ 0, 1458, 1476, 1476, 1476, 1476, 0, 0, 0, 0,
+ 0, 0, 0, 1476, 1476, 1476, 0, 1476, 0, 1476,
+ 1476, 0, 0, 0, 0, 0, 0, 1476, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1476, 0, 0,
+ 0, 0, 0, 0, 1476, 1476, 0, 0, 0, 0,
+ 0, 1476, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1476, 1480, 1480, 1480, 1480, 0, 1480, 0, 0, 0,
+
+ 0, 0, 1480, 1480, 1480, 1480, 0, 0, 1480, 1480,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1480, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1480, 1481,
+ 1481, 1481, 1481, 0, 1481, 0, 0, 0, 0, 0,
+ 1481, 1481, 1481, 1481, 0, 0, 1481, 1481, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1481, 0, 1481, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 1481, 0, 1481, 1482,
+ 1482, 1482, 1482, 1482, 0, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1482, 1482, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1482, 1483, 1483, 1483, 1483, 1483,
+ 0, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
+ 1483, 1483, 1483, 1483, 1483, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1483, 1483, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1483, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484,
+ 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484,
+ 1484, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1484, 1484, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 1484, 1485, 1485, 1485,
+ 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485,
+ 1485, 1485, 1485, 1485, 1485, 1485, 1485, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1485,
+ 1485, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1485, 1490, 1490, 1490, 1490, 0, 0, 0,
+ 0, 0, 0, 0, 1490, 1490, 1490, 0, 1490, 0,
+ 1490, 1490, 0, 0, 0, 0, 0, 0, 1490, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 1490, 0,
+ 0, 0, 0, 0, 0, 1490, 1490, 0, 0, 0,
+ 0, 0, 1490, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1490, 1491, 1491, 1491, 1491, 1491, 0, 1491, 1491,
+ 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491,
+ 1491, 1491, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1491, 0, 0,
+ 0, 0, 0, 0, 1491, 1491, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1491, 0, 0, 0, 0, 0, 0, 1491, 1504, 1504,
+
+ 1504, 1504, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1504, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1504, 0, 0, 0, 0, 0,
+ 1504, 0, 0, 1504, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1504, 0,
+ 0, 0, 0, 1504, 0, 0, 1504, 1508, 0, 0,
+ 1508, 1508, 0, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1508,
+
+ 1508, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1508, 1517, 1517, 1517, 1517, 0, 0, 0,
+ 0, 0, 1517, 1517, 0, 0, 0, 1517, 0, 1517,
+ 1517, 0, 0, 0, 1517, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1517, 0, 0, 1517, 1519,
+ 1519, 1519, 1519, 1519, 0, 1519, 1519, 1519, 1519, 1519,
+ 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 1519, 0, 0, 0, 0, 0,
+ 0, 1519, 1519, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1519, 0, 0,
+ 0, 0, 0, 0, 1519, 1520, 1520, 1520, 1520, 1520,
+ 0, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520,
+ 1520, 1520, 1520, 1520, 1520, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1520, 0, 0, 0, 0, 0, 1520, 1520, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1520, 0, 0, 0, 0, 0,
+
+ 1520, 1522, 1522, 1522, 1522, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1522, 0, 0, 0, 1522, 0,
+ 0, 0, 0, 1522, 0, 0, 0, 1522, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1522, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1522, 0, 0,
+ 0, 1522, 0, 0, 0, 0, 0, 0, 0, 1522,
+ 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528,
+ 0, 0, 1528, 1528, 1528, 0, 0, 1528, 0, 1528,
+ 1528, 0, 0, 0, 0, 0, 0, 1528, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1528, 0, 0, 0,
+
+ 0, 0, 0, 1528, 0, 0, 0, 0, 0, 0,
+ 0, 1528, 0, 0, 0, 0, 0, 0, 0, 1528,
+ 0, 0, 0, 0, 0, 0, 1528, 1529, 1529, 1529,
+ 1529, 1529, 1529, 1529, 1529, 1529, 1529, 0, 0, 1529,
+ 1529, 1529, 0, 0, 1529, 0, 1529, 1529, 0, 0,
+ 0, 0, 1529, 0, 1529, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1529, 0, 0, 0, 0, 0, 0,
+ 1529, 0, 0, 0, 0, 0, 1529, 0, 1529, 0,
+ 0, 0, 0, 0, 0, 0, 1529, 0, 0, 0,
+ 0, 0, 0, 1529, 1535, 1535, 1535, 1535, 1535, 1535,
+
+ 1535, 1535, 1535, 1535, 0, 0, 1535, 1535, 1535, 0,
+ 0, 1535, 0, 1535, 1535, 0, 0, 0, 0, 1535,
+ 0, 1535, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1535, 0, 0, 0, 0, 0, 0, 1535, 0, 0,
+ 0, 0, 0, 1535, 0, 1535, 0, 0, 0, 0,
+ 0, 0, 0, 1535, 0, 0, 0, 0, 0, 0,
+ 1535, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 0, 0, 1536, 1536, 1536, 0, 0, 1536, 0,
+ 1536, 1536, 0, 0, 0, 0, 0, 0, 1536, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1536, 0, 0,
+
+ 1536, 0, 0, 0, 1536, 0, 0, 0, 0, 0,
+ 0, 0, 1536, 0, 0, 0, 0, 0, 0, 0,
+ 1536, 0, 0, 1536, 0, 0, 0, 1536, 1550, 1550,
+ 1550, 1550, 0, 1550, 0, 0, 0, 0, 0, 1550,
+ 1550, 1550, 1550, 0, 0, 1550, 1550, 0, 0, 0,
+ 1550, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1550, 1551, 1551, 1551, 1551, 0,
+ 1551, 0, 0, 0, 0, 0, 1551, 1551, 1551, 1551,
+ 0, 0, 1551, 1551, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1551,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1551, 1552, 1552, 1552, 1552, 1552, 1552, 1552,
+ 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552,
+ 1552, 1552, 1552, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1552, 1552, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1552, 1555,
+
+ 1555, 1555, 1555, 1555, 0, 1555, 1555, 1555, 1555, 1555,
+ 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1555, 0, 0, 0, 0, 0,
+ 0, 1555, 1555, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1555, 0, 0,
+ 0, 0, 0, 0, 1555, 1563, 1563, 1563, 1563, 0,
+ 0, 0, 0, 0, 1563, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1563, 0, 0, 0, 0, 0, 0, 0, 1563,
+
+ 1563, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1563, 0, 0, 0, 0,
+ 0, 0, 1563, 1563, 1573, 0, 0, 1573, 1573, 0,
+ 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573,
+ 1573, 1573, 1573, 1573, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1573, 1573, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1573,
+ 1580, 1580, 1580, 1580, 0, 0, 0, 0, 0, 1580,
+
+ 1580, 0, 0, 0, 0, 0, 1580, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1580, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1580, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1580,
+ 0, 0, 0, 0, 0, 0, 0, 1580, 1582, 0,
+ 0, 1582, 1582, 0, 1582, 1582, 1582, 1582, 1582, 1582,
+ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1582, 1582, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1582, 1586, 0, 0, 1586, 1586, 0,
+ 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
+ 1586, 1586, 1586, 1586, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1586, 1586, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1586,
+ 1590, 1590, 1590, 1590, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1590, 0, 0, 0, 1590, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 1590, 0, 0, 0,
+ 0, 0, 1590, 0, 0, 1590, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1590, 0, 0, 0, 0, 1590, 0, 0, 1590, 1591,
+ 1591, 1591, 1591, 0, 0, 0, 0, 0, 1591, 0,
+ 0, 0, 1591, 0, 0, 0, 1591, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1591, 0, 0, 0, 0,
+ 0, 0, 0, 1591, 1591, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1591,
+ 0, 0, 0, 0, 0, 0, 1591, 1591, 1634, 0,
+
+ 0, 1634, 1634, 0, 1634, 1634, 1634, 1634, 1634, 1634,
+ 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1634, 1634, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1634, 1641, 1641, 1641, 1641, 0, 0,
+ 0, 0, 0, 1641, 1641, 0, 0, 0, 0, 0,
+ 1641, 0, 0, 0, 0, 0, 0, 0, 0, 1641,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1641, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1641, 0, 0, 0, 0, 0, 0,
+ 0, 1641, 1645, 0, 0, 1645, 1645, 0, 1645, 1645,
+ 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645,
+ 1645, 1645, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1645, 1645, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1645, 1654, 1654,
+ 1654, 1654, 0, 0, 0, 0, 0, 1654, 0, 0,
+
+ 0, 1654, 0, 0, 0, 1654, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1654, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1654, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1654, 0,
+ 0, 0, 0, 0, 0, 0, 1654, 1667, 1667, 1667,
+ 1667, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1667, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1667, 0, 0, 0, 0, 0, 1667,
+ 0, 0, 1667, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1667, 0, 0,
+
+ 0, 0, 1667, 0, 0, 1667, 1668, 1668, 1668, 1668,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1668,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1668, 0, 0, 0, 0, 0, 1668, 0,
+ 0, 1668, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1668, 0, 0, 0,
+ 0, 1668, 0, 0, 1668, 1728, 1728, 1728, 1728, 0,
+ 0, 0, 0, 0, 1728, 1728, 0, 0, 0, 1728,
+ 0, 1728, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1728,
+
+ 0, 0, 0, 0, 0, 0, 0, 1728, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1728, 1753, 0, 0, 1753, 1753, 0, 1753,
+ 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753,
+ 1753, 1753, 1753, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1753, 1753, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1753, 1754,
+ 1754, 1754, 1754, 1754, 0, 1754, 1754, 1754, 1754, 1754,
+
+ 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1754, 1754, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1754, 1782, 0, 0, 1782, 1782,
+ 0, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782,
+ 1782, 1782, 1782, 1782, 1782, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1782, 1782, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1782, 1785, 1785, 1785, 1785, 1785, 0, 1785, 1785, 1785,
+ 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785,
+ 1785, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1785, 1785, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1785, 1786, 1786, 1786,
+ 1786, 1786, 0, 1786, 1786, 1786, 1786, 1786, 1786, 1786,
+
+ 1786, 1786, 1786, 1786, 1786, 1786, 1786, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1786,
+ 1786, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1786, 1787, 1787, 1787, 1787, 1787, 0, 1787,
+ 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787,
+ 1787, 1787, 1787, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1787, 0, 0,
+ 0, 0, 0, 0, 0, 1787, 1787, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1787, 0, 0, 0, 0, 0, 0, 0, 1787, 1794,
+ 0, 0, 1794, 1794, 0, 1794, 1794, 1794, 1794, 1794,
+ 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1794, 1794, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1794, 1814, 1814, 1814, 1814, 1814,
+ 0, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814,
+
+ 1814, 1814, 1814, 1814, 1814, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1814,
+ 0, 0, 0, 0, 0, 0, 0, 1814, 1814, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1814, 0, 0, 0, 0, 0, 0, 0,
+ 1814, 1822, 1822, 1822, 1822, 0, 0, 0, 0, 0,
+ 1822, 1822, 0, 0, 0, 1822, 0, 1822, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1822,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1822, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 1822, 1824, 0, 0, 1824, 1824, 0,
+ 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
+ 1824, 1824, 1824, 1824, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1824, 1824, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1824,
+ 1848, 1848, 1848, 1848, 1848, 0, 1848, 1848, 1848, 1848,
+ 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1848, 1848, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1848, 1853, 1853, 1853, 1853,
+ 1853, 0, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1853, 1853,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 1853, 1854, 1854, 1854, 1854, 1854, 0, 1854, 1854,
+ 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854,
+ 1854, 1854, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1854, 1854, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1854, 1861, 1861,
+ 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861,
+ 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861,
+ 1861, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862,
+
+ 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862,
+ 1862, 1862, 1862, 1862, 1863, 1863, 1863, 1863, 1863, 1863,
+ 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863,
+ 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1864, 1864, 1864,
+ 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864,
+ 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864,
+ 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865,
+ 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865,
+ 1865, 1865, 1865, 1866, 1866, 1866, 1866, 1866, 1866, 1866,
+ 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866,
+
+ 1866, 1866, 1866, 1866, 1866, 1866, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1868,
+ 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868,
+ 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868,
+ 1868, 1868, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869,
+ 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869,
+ 1869, 1869, 1869, 1869, 1869, 1870, 1870, 1870, 1870, 1870,
+ 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870,
+ 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1871, 1871,
+
+ 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871,
+ 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871,
+ 1871, 1872, 0, 0, 1872, 1872, 1872, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872,
+ 1872, 1872, 1872, 1873, 0, 0, 0, 0, 1873, 1873,
+ 0, 0, 0, 0, 1873, 1873, 0, 1873, 1874, 0,
+ 0, 1874, 1874, 0, 1874, 1874, 1874, 1874, 1874, 1874,
+ 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874,
+ 1875, 1875, 1875, 1875, 0, 1875, 0, 1875, 0, 0,
+ 1875, 1875, 1875, 1875, 0, 0, 0, 1875, 1875, 1875,
+
+ 1875, 1876, 0, 0, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1877, 1877, 1877, 1877, 0, 0, 0,
+ 1877, 0, 0, 0, 1877, 1877, 1877, 0, 0, 0,
+ 1877, 1877, 0, 1877, 1878, 1878, 1878, 1878, 0, 0,
+ 1878, 1878, 0, 0, 0, 1878, 1878, 1878, 0, 0,
+ 0, 1878, 1878, 0, 1878, 1879, 1879, 1879, 1879, 0,
+ 0, 0, 1879, 0, 0, 1879, 1879, 1879, 0, 0,
+ 0, 0, 1879, 1879, 0, 1879, 1880, 1880, 1880, 1880,
+ 0, 1880, 0, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
+
+ 0, 1880, 0, 1880, 1880, 0, 1880, 1881, 0, 0,
+ 1881, 1881, 0, 1881, 1881, 1881, 1881, 1881, 1881, 1881,
+ 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1882,
+ 1882, 1882, 1882, 0, 0, 1882, 0, 0, 0, 0,
+ 1882, 1882, 0, 0, 0, 0, 1882, 1882, 0, 1882,
+ 1883, 0, 0, 1883, 1883, 0, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1884, 1884, 0, 1884, 1884, 1884, 1884, 1884,
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+ 1884, 1884, 1884, 1884, 1884, 1885, 1885, 1885, 1885, 0,
+
+ 0, 0, 0, 0, 0, 1885, 0, 0, 0, 0,
+ 0, 0, 1885, 1885, 0, 1885, 1886, 1886, 0, 1886,
+ 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886,
+ 1886, 0, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1887,
+ 0, 0, 0, 0, 1887, 1887, 0, 0, 0, 0,
+ 1887, 1887, 0, 1887, 1888, 0, 0, 1888, 1888, 0,
+ 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888,
+ 1888, 1888, 1888, 1888, 1888, 1888, 1889, 0, 0, 0,
+ 0, 1889, 1889, 0, 0, 0, 0, 1889, 1889, 0,
+ 1889, 1890, 0, 0, 1890, 1890, 0, 1890, 1890, 1890,
+
+ 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
+ 1890, 1890, 1890, 1891, 1891, 1891, 1891, 1891, 1891, 1891,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891,
+ 1891, 1891, 1891, 1891, 1891, 1891, 1892, 0, 0, 1892,
+ 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892,
+ 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1893, 0,
+ 0, 1893, 1893, 1893, 1893, 1893, 0, 0, 1893, 0,
+ 1893, 1893, 0, 1893, 1894, 0, 0, 1894, 1894, 0,
+ 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894,
+ 1894, 1894, 1894, 1894, 1894, 1894, 1895, 1895, 0, 1895,
+
+ 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895,
+ 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1896,
+ 0, 1896, 1896, 0, 0, 0, 0, 1896, 0, 0,
+ 1896, 1897, 0, 0, 1897, 0, 1897, 0, 0, 1897,
+ 1897, 1897, 0, 1897, 1897, 0, 1897, 0, 1897, 1897,
+ 0, 1897, 1898, 1898, 1898, 1898, 0, 0, 0, 1898,
+ 0, 0, 0, 1898, 1898, 1898, 0, 0, 0, 1898,
+ 1898, 0, 1898, 1899, 1899, 1899, 1899, 0, 0, 0,
+ 1899, 0, 0, 1899, 1899, 1899, 0, 0, 0, 0,
+ 1899, 1899, 0, 1899, 1900, 1900, 1900, 1900, 0, 1900,
+
+ 0, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 0, 1900,
+ 0, 1900, 1900, 0, 1900, 1901, 0, 0, 1901, 1901,
+ 0, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901,
+ 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1902, 0, 0,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1903,
+ 1903, 1903, 1903, 0, 0, 0, 1903, 0, 0, 0,
+ 1903, 1903, 1903, 0, 0, 0, 1903, 1903, 0, 1903,
+ 1904, 1904, 1904, 1904, 0, 1904, 0, 1904, 1904, 1904,
+ 1904, 1904, 1904, 1904, 0, 1904, 0, 1904, 1904, 0,
+
+ 1904, 1905, 0, 0, 1905, 1905, 0, 1905, 1905, 1905,
+ 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905,
+ 1905, 1905, 1905, 1906, 1906, 1906, 1906, 0, 0, 0,
+ 0, 0, 0, 0, 1906, 1906, 0, 0, 0, 0,
+ 1906, 1906, 0, 1906, 1907, 0, 0, 1907, 1907, 0,
+ 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907,
+ 1907, 1907, 1907, 1907, 1907, 1907, 1908, 1908, 0, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1909,
+ 1909, 0, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+
+ 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909,
+ 1909, 1909, 1910, 1910, 1910, 1910, 0, 0, 0, 0,
+ 0, 0, 1910, 0, 0, 0, 0, 0, 0, 1910,
+ 1910, 0, 1910, 1911, 1911, 0, 1911, 1911, 1911, 1911,
+ 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 0, 1911,
+ 1911, 1911, 1911, 1911, 1911, 1911, 1912, 1912, 0, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 0, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1913,
+ 1913, 0, 0, 0, 0, 1913, 1913, 0, 1913, 1914,
+ 0, 0, 1914, 1914, 0, 1914, 1914, 1914, 1914, 1914,
+
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914,
+ 1914, 1915, 1915, 0, 0, 0, 0, 1915, 1915, 0,
+ 1915, 1916, 0, 0, 1916, 1916, 0, 1916, 1916, 1916,
+ 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916,
+ 1916, 1916, 1916, 1917, 1917, 1917, 1917, 1917, 1917, 1917,
+ 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917,
+ 1917, 1917, 1917, 1917, 1917, 1917, 1918, 1918, 1918, 1918,
+ 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918,
+ 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1919,
+ 0, 0, 1919, 1919, 1919, 0, 1919, 0, 0, 1919,
+
+ 0, 1919, 1919, 0, 1919, 1920, 0, 0, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920,
+ 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1921, 0, 0,
+ 1921, 1921, 1921, 1921, 1921, 0, 0, 1921, 0, 1921,
+ 1921, 0, 1921, 1922, 0, 0, 1922, 1922, 0, 1922,
+ 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922,
+ 1922, 1922, 1922, 1922, 1922, 1923, 1923, 0, 1923, 1923,
+ 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923,
+ 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1924, 0,
+ 0, 1924, 0, 1924, 1924, 0, 0, 0, 0, 1924,
+
+ 0, 0, 1924, 1925, 1925, 1925, 1925, 0, 1925, 0,
+ 1925, 1925, 1925, 1925, 1925, 1925, 1925, 0, 1925, 0,
+ 1925, 1925, 0, 1925, 1926, 0, 0, 1926, 1926, 0,
+ 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926,
+ 1926, 1926, 1926, 1926, 1926, 1926, 1927, 1927, 1927, 1927,
+ 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927,
+ 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1928, 1928,
+ 1928, 1928, 0, 0, 0, 1928, 0, 0, 0, 1928,
+ 1928, 1928, 0, 0, 0, 1928, 1928, 0, 1928, 1929,
+ 1929, 1929, 1929, 0, 0, 0, 1929, 0, 0, 1929,
+
+ 1929, 1929, 0, 0, 0, 0, 1929, 1929, 0, 1929,
+ 1930, 1930, 1930, 1930, 1930, 1930, 1930, 0, 1930, 0,
+ 1930, 1930, 1930, 1930, 1930, 1930, 1930, 0, 1930, 1930,
+ 1930, 1930, 1930, 1931, 1931, 1931, 1931, 0, 1931, 0,
+ 1931, 1931, 1931, 1931, 1931, 1931, 1931, 0, 1931, 0,
+ 1931, 1931, 0, 1931, 1932, 0, 0, 1932, 1932, 0,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1933, 1933, 0, 1933,
+ 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933,
+ 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1934,
+
+ 1934, 1934, 1934, 0, 0, 0, 0, 0, 0, 0,
+ 1934, 1934, 0, 0, 0, 0, 1934, 1934, 0, 1934,
+ 1935, 1935, 1935, 1935, 1935, 0, 1935, 1935, 1935, 1935,
+ 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935,
+ 1935, 1935, 1936, 1936, 1936, 1936, 0, 1936, 0, 0,
+ 0, 0, 0, 1936, 1936, 0, 1936, 0, 0, 1936,
+ 1936, 1936, 1936, 1937, 1937, 0, 1937, 1937, 1937, 1937,
+ 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937,
+ 1937, 1937, 1937, 1937, 1937, 1937, 1938, 1938, 0, 1938,
+ 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938,
+
+ 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1939,
+ 1939, 0, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939,
+ 1939, 1939, 1939, 1939, 0, 1939, 1939, 1939, 1939, 1939,
+ 1939, 1939, 1940, 1940, 0, 1940, 1940, 1940, 1940, 1940,
+ 1940, 1940, 1940, 1940, 1940, 1940, 1940, 0, 1940, 1940,
+ 1940, 1940, 1940, 1940, 1940, 1941, 1941, 1941, 1941, 0,
+ 1941, 0, 0, 0, 0, 0, 1941, 1941, 0, 1941,
+ 0, 0, 1941, 1941, 1941, 1941, 1942, 1942, 0, 0,
+ 0, 0, 1942, 1942, 0, 1942, 1943, 1943, 0, 0,
+ 0, 0, 1943, 1943, 0, 1943, 1944, 1944, 1944, 1944,
+
+ 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944,
+ 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1945,
+ 0, 1945, 0, 0, 1945, 1945, 1945, 1945, 1945, 0,
+ 0, 1945, 0, 1945, 1945, 0, 1945, 1946, 1946, 0,
+ 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946,
+ 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1947,
+ 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947,
+ 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947,
+ 1947, 1947, 1948, 1948, 0, 1948, 1948, 1948, 1948, 1948,
+ 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948,
+
+ 1948, 1948, 1948, 1948, 1948, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 0, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1950, 0,
+ 0, 1950, 1950, 0, 1950, 1950, 1950, 1950, 1950, 1950,
+ 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950,
+ 1951, 0, 0, 1951, 1951, 1951, 1951, 1951, 1951, 1951,
+ 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951,
+ 1951, 1951, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952,
+ 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952,
+ 1952, 1952, 1952, 1952, 1952, 1953, 1953, 1953, 1953, 0,
+
+ 0, 0, 1953, 0, 0, 1953, 1953, 1953, 0, 0,
+ 0, 0, 1953, 1953, 0, 1953, 1954, 1954, 1954, 1954,
+ 0, 0, 0, 1954, 0, 0, 0, 1954, 1954, 1954,
+ 0, 0, 0, 1954, 1954, 0, 1954, 1955, 1955, 1955,
+ 1955, 1955, 0, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1956,
+ 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956,
+ 1956, 1956, 1956, 1956, 0, 1956, 1956, 1956, 1956, 1956,
+ 1956, 1956, 1957, 1957, 0, 1957, 1957, 1957, 1957, 1957,
+ 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957,
+
+ 1957, 1957, 1957, 1957, 1957, 1958, 1958, 1958, 1958, 1958,
+ 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958,
+ 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1959, 1959,
+ 0, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959,
+ 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959,
+ 1959, 1960, 1960, 1960, 1960, 0, 1960, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1960, 0, 0, 1960, 1960,
+ 1960, 1961, 1961, 1961, 1961, 0, 1961, 0, 0, 1961,
+ 1961, 1961, 0, 1961, 0, 1961, 1961, 0, 1961, 1961,
+ 0, 1961, 1962, 1962, 1962, 1962, 0, 1962, 0, 0,
+
+ 1962, 1962, 1962, 1962, 1962, 0, 1962, 1962, 0, 1962,
+ 1962, 0, 1962, 1963, 0, 0, 1963, 1963, 0, 1963,
+ 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963,
+ 1963, 1963, 1963, 1963, 1963, 1964, 1964, 0, 0, 0,
+ 0, 1964, 1964, 0, 1964, 1965, 1965, 0, 1965, 1965,
+ 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965,
+ 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1966, 1966,
+ 0, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966,
+ 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966,
+ 1966, 1967, 1967, 0, 1967, 1967, 1967, 1967, 1967, 1967,
+
+ 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967,
+ 1967, 1967, 1967, 1967, 1968, 1968, 1968, 1968, 1968, 1968,
+ 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968,
+ 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1969, 1969, 0,
+ 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
+ 1969, 1969, 0, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
+ 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970,
+ 1970, 1970, 1970, 1970, 1970, 0, 1970, 1970, 1970, 1970,
+ 1970, 1970, 1970, 1971, 1971, 1971, 1971, 0, 1971, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1971, 0, 0,
+
+ 1971, 1971, 1971, 1972, 1972, 1972, 1972, 0, 1972, 0,
+ 0, 1972, 1972, 1972, 0, 1972, 0, 1972, 1972, 0,
+ 1972, 1972, 0, 1972, 1973, 1973, 1973, 1973, 0, 1973,
+ 0, 0, 1973, 1973, 1973, 1973, 1973, 0, 1973, 1973,
+ 0, 1973, 1973, 0, 1973, 1974, 0, 0, 1974, 1974,
+ 0, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
+ 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1975, 1975, 0,
+ 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975,
+ 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975,
+ 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
+
+ 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
+ 1976, 1976, 1976, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1978, 1978, 1978, 1978,
+ 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978,
+ 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1979,
+ 1979, 1979, 1979, 0, 1979, 0, 1979, 1979, 1979, 1979,
+ 1979, 1979, 1979, 0, 1979, 0, 1979, 1979, 0, 1979,
+ 1980, 1980, 1980, 1980, 1980, 0, 1980, 1980, 1980, 1980,
+ 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980,
+
+ 1980, 1980, 1981, 0, 0, 1981, 1981, 1981, 1981, 1981,
+ 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981,
+ 1981, 1981, 1981, 1981, 1982, 1982, 1982, 1982, 1982, 1982,
+ 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982,
+ 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1983, 1983, 1983,
+ 1983, 0, 0, 0, 1983, 0, 0, 1983, 1983, 1983,
+ 0, 0, 0, 0, 1983, 1983, 0, 1983, 1984, 1984,
+ 1984, 1984, 0, 1984, 0, 1984, 1984, 1984, 1984, 1984,
+ 1984, 1984, 0, 1984, 0, 1984, 1984, 0, 1984, 1985,
+ 1985, 1985, 1985, 0, 0, 0, 1985, 0, 0, 0,
+
+ 1985, 1985, 1985, 0, 0, 0, 1985, 1985, 0, 1985,
+ 1986, 0, 0, 1986, 1986, 0, 1986, 1986, 1986, 1986,
+ 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986,
+ 1986, 1986, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987,
+ 1987, 1987, 1987, 1987, 1987, 1987, 1987, 0, 1987, 1987,
+ 1987, 1987, 1987, 1987, 1987, 1988, 1988, 1988, 1988, 1988,
+ 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988,
+ 0, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+ 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989,
+
+ 1989, 1990, 1990, 0, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1991, 1991, 1991, 1991, 1991, 1991,
+ 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991,
+ 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1992, 1992, 1992,
+ 1992, 0, 1992, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1992, 0, 0, 1992, 1992, 1992, 1993, 1993, 1993,
+ 1993, 0, 1993, 0, 0, 1993, 1993, 1993, 0, 1993,
+ 0, 1993, 1993, 0, 1993, 1993, 0, 1993, 1994, 1994,
+ 1994, 1994, 0, 1994, 0, 0, 1994, 1994, 1994, 1994,
+
+ 1994, 0, 1994, 1994, 0, 1994, 1994, 0, 1994, 1995,
+ 0, 0, 1995, 1995, 0, 1995, 1995, 1995, 1995, 1995,
+ 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995,
+ 1995, 1996, 1996, 0, 0, 0, 0, 1996, 1996, 0,
+ 1996, 1997, 1997, 0, 1997, 1997, 1997, 1997, 1997, 1997,
+ 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997,
+ 1997, 1997, 1997, 1997, 1998, 1998, 0, 1998, 1998, 1998,
+ 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998,
+ 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1999, 1999, 0,
+ 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999,
+
+ 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
+ 2000, 2000, 2000, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 0, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2002, 2002, 2002, 2002,
+ 0, 2002, 0, 0, 2002, 2002, 2002, 0, 2002, 0,
+ 2002, 2002, 0, 2002, 2002, 0, 2002, 2003, 2003, 2003,
+ 2003, 0, 2003, 0, 0, 2003, 2003, 2003, 2003, 2003,
+ 0, 2003, 2003, 0, 2003, 2003, 0, 2003, 2004, 0,
+
+ 0, 2004, 2004, 0, 2004, 2004, 2004, 2004, 2004, 2004,
+ 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004,
+ 2005, 2005, 0, 2005, 2005, 2005, 2005, 2005, 2005, 2005,
+ 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005,
+ 2005, 2005, 2005, 2006, 2006, 2006, 2006, 2006, 2006, 2006,
+ 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006,
+ 2006, 2006, 2006, 2006, 2006, 2006, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007,
+ 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2008,
+ 2008, 2008, 2008, 0, 2008, 0, 2008, 2008, 2008, 2008,
+
+ 2008, 2008, 2008, 0, 2008, 0, 2008, 2008, 0, 2008,
+ 2009, 0, 0, 2009, 2009, 0, 2009, 2009, 2009, 2009,
+ 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009,
+ 2009, 2009, 2010, 0, 0, 2010, 2010, 2010, 2010, 2010,
+ 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,
+ 2010, 2010, 2010, 2010, 2011, 2011, 2011, 2011, 2011, 2011,
+ 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011,
+ 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2012, 2012, 2012,
+ 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012,
+ 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012,
+
+ 2013, 2013, 2013, 2013, 0, 0, 0, 2013, 0, 0,
+ 2013, 2013, 2013, 0, 0, 0, 0, 2013, 2013, 0,
+ 2013, 2014, 2014, 2014, 2014, 0, 2014, 0, 2014, 2014,
+ 2014, 2014, 2014, 2014, 2014, 0, 2014, 0, 2014, 2014,
+ 0, 2014, 2015, 2015, 2015, 2015, 0, 0, 0, 2015,
+ 0, 0, 0, 2015, 2015, 2015, 0, 0, 0, 2015,
+ 2015, 0, 2015, 2016, 0, 0, 2016, 2016, 0, 2016,
+ 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
+ 2016, 2016, 2016, 2016, 2016, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+
+ 0, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2018, 2018,
+ 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018,
+ 2018, 2018, 2018, 0, 2018, 2018, 2018, 2018, 2018, 2018,
+ 2018, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,
+ 2019, 2019, 2019, 2019, 2019, 2019, 0, 2019, 2019, 2019,
+ 2019, 2019, 2019, 2019, 2020, 2020, 2020, 2020, 2020, 2020,
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2021, 2021, 2021,
+ 2021, 0, 2021, 0, 0, 2021, 2021, 2021, 0, 2021,
+ 0, 2021, 2021, 0, 2021, 2021, 0, 2021, 2022, 2022,
+
+ 2022, 2022, 0, 2022, 0, 0, 2022, 2022, 2022, 2022,
+ 2022, 0, 2022, 2022, 0, 2022, 2022, 0, 2022, 2023,
+ 2023, 2023, 2023, 2023, 0, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2024, 2024, 0, 0, 0, 0, 2024, 2024, 0,
+ 2024, 2025, 2025, 0, 2025, 2025, 2025, 2025, 2025, 2025,
+ 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025,
+ 2025, 2025, 2025, 2025, 2026, 2026, 0, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026,
+ 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2027, 2027, 0,
+
+ 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027,
+ 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027,
+ 2028, 2028, 2028, 2028, 0, 2028, 0, 0, 2028, 2028,
+ 2028, 0, 2028, 0, 2028, 2028, 0, 2028, 2028, 0,
+ 2028, 2029, 2029, 2029, 2029, 0, 2029, 0, 0, 2029,
+ 2029, 2029, 2029, 2029, 0, 2029, 2029, 0, 2029, 2029,
+ 0, 2029, 2030, 2030, 2030, 2030, 2030, 0, 2030, 2030,
+ 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030,
+ 2030, 2030, 2030, 2030, 2031, 2031, 0, 2031, 2031, 2031,
+ 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031,
+
+ 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2032, 0, 0,
+ 2032, 2032, 0, 2032, 2032, 2032, 2032, 2032, 2032, 2032,
+ 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2033,
+ 0, 0, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033,
+ 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033,
+ 2033, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034,
+ 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034,
+ 2034, 2034, 2034, 2034, 2035, 2035, 2035, 2035, 2035, 2035,
+ 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035,
+ 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2036, 2036, 2036,
+
+ 2036, 0, 0, 0, 2036, 0, 0, 2036, 2036, 2036,
+ 0, 0, 0, 0, 2036, 2036, 0, 2036, 2037, 2037,
+ 2037, 2037, 0, 0, 0, 2037, 0, 0, 2037, 2037,
+ 2037, 0, 0, 0, 0, 2037, 2037, 0, 2037, 2038,
+ 0, 0, 2038, 2038, 0, 2038, 2038, 2038, 2038, 2038,
+ 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038,
+ 2038, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
+ 2039, 2039, 2039, 2039, 2039, 2039, 0, 2039, 2039, 2039,
+ 2039, 2039, 2039, 2039, 2040, 2040, 2040, 2040, 2040, 2040,
+ 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 0,
+
+ 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2042, 2042, 2042, 2042, 0, 2042, 0, 0, 2042, 2042,
+ 2042, 0, 2042, 0, 2042, 2042, 0, 2042, 2042, 0,
+ 2042, 2043, 2043, 2043, 2043, 0, 2043, 0, 0, 2043,
+ 2043, 2043, 2043, 2043, 0, 2043, 2043, 0, 2043, 2043,
+ 0, 2043, 2044, 2044, 0, 2044, 2044, 2044, 2044, 2044,
+ 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044,
+ 2044, 2044, 2044, 2044, 2044, 2045, 2045, 0, 2045, 2045,
+
+ 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045,
+ 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2046, 2046,
+ 2046, 2046, 0, 2046, 0, 0, 2046, 2046, 2046, 0,
+ 2046, 0, 2046, 2046, 0, 2046, 2046, 0, 2046, 2047,
+ 2047, 2047, 2047, 0, 2047, 0, 0, 2047, 2047, 2047,
+ 2047, 2047, 0, 2047, 2047, 0, 2047, 2047, 0, 2047,
+ 2048, 2048, 2048, 2048, 0, 0, 0, 2048, 0, 0,
+ 2048, 2048, 2048, 0, 0, 0, 0, 2048, 2048, 0,
+ 2048, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+ 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049,
+
+ 2049, 2049, 2049, 2049, 2050, 2050, 2050, 2050, 2050, 2050,
+ 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050,
+ 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2051, 2051, 2051,
+ 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051,
+ 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051,
+ 2052, 2052, 2052, 2052, 0, 2052, 0, 0, 2052, 2052,
+ 2052, 2052, 2052, 0, 2052, 2052, 0, 2052, 2052, 2052,
+ 2052, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053,
+ 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053,
+ 2053, 2053, 2053, 2053, 2054, 2054, 2054, 2054, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 2054, 0, 2054, 0,
+ 0, 2054, 2054, 0, 2054, 2055, 2055, 2055, 2055, 0,
+ 2055, 0, 0, 0, 0, 0, 2055, 2055, 0, 2055,
+ 0, 0, 2055, 2055, 2055, 2055, 2056, 2056, 2056, 2056,
+ 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056,
+ 2056, 0, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2057,
+ 2057, 2057, 2057, 0, 2057, 0, 0, 2057, 2057, 2057,
+ 0, 2057, 0, 2057, 2057, 0, 2057, 2057, 2057, 2057,
+ 2058, 2058, 2058, 2058, 0, 2058, 0, 0, 2058, 2058,
+ 2058, 2058, 2058, 0, 2058, 2058, 0, 2058, 2058, 2058,
+
+ 2058, 2059, 2059, 2059, 2059, 0, 2059, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2059, 0, 0, 2059, 2059,
+ 2059, 2060, 2060, 2060, 2060, 0, 2060, 0, 0, 2060,
+ 2060, 2060, 0, 2060, 0, 2060, 2060, 0, 2060, 2060,
+ 2060, 2060, 2061, 2061, 2061, 2061, 0, 2061, 0, 0,
+ 2061, 2061, 2061, 2061, 2061, 0, 2061, 2061, 0, 2061,
+ 2061, 2061, 2061, 2062, 0, 0, 2062, 2062, 0, 2062,
+ 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062,
+ 2062, 2062, 2062, 2062, 2062, 2063, 2063, 2063, 2063, 2063,
+ 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
+
+ 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2064, 2064,
+ 2064, 2064, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2064, 0, 2064, 0, 0, 2064, 2064, 0, 2064, 2065,
+ 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
+ 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
+ 2065, 2065, 2066, 2066, 0, 0, 0, 0, 2066, 2066,
+ 0, 2066, 2067, 2067, 2067, 2067, 0, 2067, 0, 0,
+ 2067, 2067, 2067, 0, 2067, 0, 2067, 2067, 0, 2067,
+ 2067, 2067, 2067, 2068, 2068, 2068, 2068, 0, 2068, 0,
+ 0, 2068, 2068, 2068, 2068, 2068, 0, 2068, 2068, 0,
+
+ 2068, 2068, 2068, 2068, 2069, 2069, 2069, 2069, 0, 2069,
+ 0, 0, 2069, 2069, 2069, 0, 2069, 0, 2069, 2069,
+ 0, 2069, 2069, 0, 2069, 2070, 2070, 2070, 2070, 0,
+ 2070, 0, 0, 2070, 2070, 2070, 2070, 2070, 0, 2070,
+ 2070, 0, 2070, 2070, 2070, 2070, 2071, 2071, 2071, 2071,
+ 0, 2071, 0, 0, 2071, 2071, 2071, 2071, 2071, 0,
+ 2071, 2071, 0, 2071, 2071, 0, 2071, 2072, 0, 0,
+ 2072, 2072, 0, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
+ 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2073,
+ 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
+
+ 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
+ 2073, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
+ 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
+ 2074, 2074, 2074, 2074, 2075, 2075, 2075, 2075, 0, 0,
+ 0, 2075, 0, 0, 2075, 2075, 2075, 0, 0, 0,
+ 0, 2075, 2075, 0, 2075, 2076, 2076, 2076, 2076, 0,
+ 0, 0, 2076, 0, 0, 0, 2076, 2076, 0, 0,
+ 0, 0, 2076, 2076, 0, 2076, 2077, 2077, 2077, 2077,
+ 0, 0, 0, 2077, 0, 0, 2077, 2077, 2077, 0,
+ 0, 0, 0, 2077, 2077, 0, 2077, 2078, 2078, 2078,
+
+ 2078, 0, 2078, 0, 2078, 2078, 2078, 2078, 2078, 2078,
+ 2078, 0, 2078, 0, 2078, 2078, 0, 2078, 2079, 2079,
+ 2079, 2079, 2079, 0, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079,
+ 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
+ 2080, 2080, 2080, 2080, 2080, 0, 2080, 2080, 2080, 2080,
+ 2080, 2080, 2080, 2081, 2081, 2081, 2081, 2081, 2081, 2081,
+ 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081,
+ 2081, 2081, 2081, 2081, 2081, 2081, 2082, 2082, 2082, 2082,
+ 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082,
+
+ 2082, 0, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2083,
+ 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083,
+ 2083, 2083, 2083, 2083, 0, 2083, 2083, 2083, 2083, 2083,
+ 2083, 2083, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
+ 2084, 2084, 2084, 2084, 2084, 2084, 2084, 0, 2084, 2084,
+ 2084, 2084, 2084, 2084, 2084, 2085, 2085, 2085, 2085, 0,
+ 2085, 0, 0, 2085, 2085, 2085, 0, 2085, 0, 2085,
+ 2085, 0, 2085, 2085, 2085, 2085, 2086, 2086, 2086, 2086,
+ 0, 2086, 0, 0, 2086, 2086, 2086, 0, 2086, 0,
+ 2086, 2086, 0, 2086, 2086, 0, 2086, 2087, 2087, 2087,
+
+ 2087, 0, 2087, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2087, 0, 0, 2087, 2087, 2087, 2088, 2088, 2088,
+ 2088, 0, 2088, 0, 0, 2088, 2088, 2088, 2088, 2088,
+ 0, 2088, 2088, 0, 2088, 2088, 0, 2088, 2089, 2089,
+ 2089, 2089, 0, 2089, 0, 0, 2089, 2089, 2089, 2089,
+ 2089, 0, 2089, 2089, 0, 2089, 2089, 2089, 2089, 2090,
+ 2090, 2090, 2090, 0, 2090, 0, 0, 2090, 2090, 2090,
+ 0, 2090, 0, 2090, 2090, 0, 2090, 2090, 2090, 2090,
+ 2091, 2091, 2091, 2091, 0, 2091, 0, 0, 2091, 2091,
+ 2091, 2091, 2091, 0, 2091, 2091, 0, 2091, 2091, 2091,
+
+ 2091, 2092, 0, 0, 2092, 2092, 0, 2092, 2092, 2092,
+ 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092,
+ 2092, 2092, 2092, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2094, 2094, 0, 0, 0,
+ 0, 2094, 2094, 0, 2094, 2095, 2095, 2095, 2095, 0,
+ 2095, 0, 0, 2095, 2095, 2095, 0, 2095, 0, 2095,
+ 2095, 0, 2095, 2095, 2095, 2095, 2096, 2096, 2096, 2096,
+ 0, 2096, 0, 0, 2096, 2096, 2096, 2096, 2096, 0,
+ 2096, 2096, 0, 2096, 2096, 2096, 2096, 2097, 2097, 2097,
+
+ 2097, 0, 2097, 0, 0, 2097, 2097, 2097, 0, 2097,
+ 0, 2097, 2097, 0, 2097, 2097, 2097, 2097, 2098, 2098,
+ 2098, 2098, 0, 2098, 0, 0, 2098, 2098, 2098, 0,
+ 2098, 0, 2098, 2098, 0, 2098, 2098, 0, 2098, 2099,
+ 2099, 2099, 2099, 0, 2099, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2099, 0, 0, 2099, 2099, 2099, 2100,
+ 2100, 2100, 2100, 0, 2100, 0, 0, 2100, 2100, 2100,
+ 2100, 2100, 0, 2100, 2100, 0, 2100, 2100, 0, 2100,
+ 2101, 2101, 2101, 2101, 0, 2101, 0, 0, 2101, 2101,
+ 2101, 2101, 2101, 0, 2101, 2101, 0, 2101, 2101, 2101,
+
+ 2101, 2102, 2102, 2102, 2102, 2102, 0, 2102, 2102, 2102,
+ 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102,
+ 2102, 2102, 2102, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
+ 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
+ 2103, 2103, 2103, 2103, 2103, 2104, 2104, 2104, 2104, 0,
+ 0, 0, 2104, 0, 0, 2104, 2104, 2104, 0, 0,
+ 0, 0, 2104, 2104, 0, 2104, 2105, 2105, 2105, 2105,
+ 0, 0, 0, 2105, 0, 0, 0, 2105, 2105, 0,
+ 0, 0, 0, 2105, 2105, 0, 2105, 2106, 2106, 2106,
+ 2106, 0, 0, 0, 2106, 0, 0, 2106, 2106, 2106,
+
+ 0, 0, 0, 0, 2106, 2106, 0, 2106, 2107, 2107,
+ 2107, 2107, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2107, 2107, 0, 0, 0, 2107, 2107, 2107, 2107, 2108,
+ 2108, 2108, 2108, 0, 0, 0, 2108, 0, 0, 0,
+ 2108, 2108, 2108, 0, 0, 0, 2108, 2108, 2108, 2108,
+ 2109, 2109, 2109, 2109, 0, 2109, 0, 2109, 2109, 2109,
+ 2109, 2109, 2109, 2109, 0, 2109, 0, 2109, 2109, 0,
+ 2109, 2110, 2110, 2110, 2110, 0, 0, 0, 2110, 0,
+ 0, 0, 2110, 2110, 2110, 2110, 0, 0, 2110, 2110,
+ 0, 2110, 2111, 2111, 2111, 2111, 2111, 0, 2111, 2111,
+
+ 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
+ 2111, 2111, 2111, 2111, 2112, 2112, 2112, 2112, 2112, 2112,
+ 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 0,
+ 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2113, 2113, 2113,
+ 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
+ 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
+ 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114,
+ 2114, 2114, 2114, 2114, 2114, 0, 2114, 2114, 2114, 2114,
+ 2114, 2114, 2114, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 0, 2115,
+
+ 2115, 2115, 2115, 2115, 2115, 2115, 2116, 2116, 2116, 2116,
+ 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116,
+ 2116, 0, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2117,
+ 2117, 2117, 2117, 0, 2117, 0, 0, 2117, 2117, 2117,
+ 0, 2117, 0, 2117, 2117, 0, 2117, 2117, 0, 2117,
+ 2118, 2118, 2118, 2118, 0, 2118, 0, 0, 2118, 2118,
+ 2118, 0, 2118, 0, 2118, 2118, 0, 2118, 2118, 2118,
+ 2118, 2119, 2119, 2119, 2119, 0, 2119, 0, 0, 2119,
+ 2119, 2119, 2119, 2119, 0, 2119, 2119, 0, 2119, 2119,
+ 0, 2119, 2120, 2120, 2120, 2120, 2120, 0, 2120, 2120,
+
+ 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120,
+ 2120, 2120, 2120, 2120, 2121, 2121, 2121, 2121, 2121, 2121,
+ 2121, 2121, 2121, 2121, 2121, 2121, 2121, 2121, 2121, 2121,
+ 2121, 2121, 2121, 2121, 2121, 2121, 2122, 2122, 2122, 2122,
+ 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122,
+ 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2123, 2123,
+ 2123, 2123, 0, 2123, 0, 0, 2123, 2123, 2123, 0,
+ 2123, 0, 2123, 2123, 0, 2123, 2123, 0, 2123, 2124,
+ 2124, 2124, 2124, 0, 2124, 0, 0, 2124, 2124, 2124,
+ 0, 2124, 0, 2124, 2124, 0, 2124, 2124, 2124, 2124,
+
+ 2125, 2125, 2125, 2125, 2125, 0, 2125, 2125, 2125, 2125,
+ 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125,
+ 2125, 2125, 2126, 2126, 2126, 2126, 0, 0, 0, 0,
+ 0, 0, 0, 2126, 2126, 0, 0, 0, 0, 2126,
+ 2126, 0, 2126, 2127, 0, 0, 2127, 2127, 0, 2127,
+ 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
+ 2127, 2127, 2127, 2127, 2127, 2128, 2128, 2128, 2128, 0,
+ 0, 0, 2128, 0, 0, 0, 2128, 2128, 2128, 0,
+ 0, 0, 2128, 2128, 0, 2128, 2129, 2129, 2129, 2129,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2129, 2129,
+
+ 0, 0, 0, 2129, 2129, 2129, 2129, 2130, 2130, 2130,
+ 2130, 0, 0, 0, 2130, 0, 0, 0, 2130, 2130,
+ 2130, 0, 0, 0, 2130, 2130, 2130, 2130, 2131, 2131,
+ 2131, 2131, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2131, 0, 2131, 0, 0, 2131, 2131, 2131, 2131, 2132,
+ 2132, 2132, 2132, 0, 0, 0, 2132, 0, 0, 0,
+ 2132, 2132, 2132, 2132, 0, 0, 2132, 2132, 2132, 2132,
+ 2133, 2133, 2133, 2133, 2133, 0, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
+
+ 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
+ 2134, 2134, 2134, 2134, 2134, 2135, 2135, 2135, 2135, 2135,
+ 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
+ 0, 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2136, 2136,
+ 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136,
+ 2136, 2136, 2136, 0, 2136, 2136, 2136, 2136, 2136, 2136,
+ 2136, 2137, 2137, 2137, 2137, 0, 2137, 0, 0, 2137,
+ 2137, 2137, 0, 2137, 0, 2137, 2137, 0, 2137, 2137,
+ 0, 2137, 2138, 2138, 2138, 2138, 0, 2138, 0, 0,
+ 2138, 2138, 2138, 2138, 2138, 0, 2138, 2138, 0, 2138,
+
+ 2138, 0, 2138, 2139, 2139, 2139, 2139, 0, 0, 0,
+ 0, 0, 0, 0, 2139, 2139, 0, 0, 0, 0,
+ 2139, 2139, 0, 2139, 2140, 0, 0, 2140, 2140, 0,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2141, 2141, 2141, 2141,
+ 0, 0, 0, 2141, 0, 0, 0, 2141, 2141, 2141,
+ 0, 0, 0, 2141, 2141, 0, 2141, 2142, 2142, 2142,
+ 2142, 0, 0, 0, 0, 0, 0, 0, 2142, 2142,
+ 0, 2142, 0, 0, 2142, 2142, 0, 2142, 2143, 0,
+ 0, 2143, 2143, 0, 2143, 2143, 2143, 2143, 2143, 2143,
+
+ 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
+ 2144, 2144, 2144, 2144, 0, 0, 0, 2144, 0, 0,
+ 0, 2144, 2144, 2144, 2144, 0, 0, 2144, 2144, 0,
+ 2144, 2145, 2145, 2145, 2145, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2145, 0, 0, 0, 0, 2145, 2145,
+ 2145, 2145, 2146, 2146, 2146, 2146, 0, 0, 0, 2146,
+ 0, 0, 0, 2146, 2146, 2146, 0, 0, 0, 2146,
+ 2146, 2146, 2146, 2147, 2147, 2147, 2147, 0, 0, 0,
+ 0, 0, 0, 0, 2147, 2147, 0, 0, 0, 0,
+ 2147, 2147, 0, 2147, 2148, 0, 0, 2148, 2148, 0,
+
+ 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148,
+ 2148, 2148, 2148, 2148, 2148, 2148, 2149, 2149, 2149, 2149,
+ 2149, 0, 2149, 2149, 2149, 2149, 2149, 2149, 2149, 2149,
+ 2149, 2149, 2149, 2149, 2149, 2149, 2149, 2149, 2150, 2150,
+ 2150, 2150, 0, 0, 0, 2150, 0, 0, 0, 2150,
+ 2150, 2150, 0, 0, 0, 2150, 2150, 0, 2150, 2151,
+ 2151, 2151, 2151, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2151, 0, 2151, 0, 0, 2151, 2151, 2151, 2151,
+ 2152, 2152, 2152, 2152, 0, 0, 0, 2152, 0, 0,
+ 0, 2152, 2152, 2152, 2152, 0, 0, 2152, 2152, 2152,
+
+ 2152, 2153, 2153, 2153, 2153, 2153, 0, 2153, 2153, 2153,
+ 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153,
+ 2153, 2153, 2153, 2154, 2154, 2154, 2154, 2154, 0, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2155, 2155, 0, 0, 0,
+ 0, 2155, 2155, 0, 2155, 2156, 0, 0, 2156, 2156,
+ 0, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2157, 2157, 2157,
+ 2157, 0, 0, 0, 2157, 0, 0, 0, 2157, 2157,
+ 2157, 0, 0, 0, 2157, 2157, 0, 2157, 2158, 2158,
+
+ 2158, 2158, 2158, 0, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2159, 2159, 2159, 2159, 2159, 0, 2159, 2159, 2159, 2159,
+ 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
+ 2159, 2159, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860,
+
+ 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860
+ } ;
+
+extern int vhdlscanYY_flex_debug;
+int vhdlscanYY_flex_debug = 0;
+
+static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = (yy_hold_char); /* undo effects of setting up vhdlscanYYtext */ \
+yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
+(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
+(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
+yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
+++(yy_lp); \
+goto find_rule; \
+}
+
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *vhdlscanYYtext;
+#line 1 "vhdlscanner.l"
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/******************************************************************************
+ * Parser for VHDL subset
+ * written by M. Kreis
+ * supports VHDL-87/93
+ * does not support VHDL-AMS
+ ******************************************************************************/
+#line 22 "vhdlscanner.l"
+
+// global includes
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <qcstring.h>
+#include <qfileinfo.h>
+#include <qstringlist.h>
+
+/* --------------------------------------------------------------- */
+
+// local includes
+#include "vhdlscanner.h"
+#include "vhdlcode.h"
+#include "vhdldocgen.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+#include "language.h"
+#include "commentscan.h"
+#include "index.h"
+#include "definition.h"
+#include "searchindex.h"
+#include "outputlist.h"
+
+/* --------------------------------------------------------------- */
+
+//#define theTranslator_vhdlType theTranslator->trVhdlType
+#define theTranslator_vhdlType VhdlDocGen::getVhdlType
+
+static QStringList qrl;
+static int openGroups;
+static ParserInterface *g_thisParser;
+static const char * inputString;
+static int inputPosition;
+static int inputLen;
+static int startComment = 0;
+static QFile inputFile;
+static QCString inbuf;
+static Entry* global_root = 0;
+static Entry* current_root = 0;
+static Entry* current = 0;
+static Entry* previous = 0;
+static Entry* functionEntry = 0;
+static Entry* lastEntity = 0;
+static Entry* lastCompound = 0;
+static int genPort = 0;
+static QCString yyFileName;
+static int iFuncLine = 1;
+static bool g_inputFromFile ;
+static bool g_lexInit = FALSE;
+static int isBody=0;
+static int isFunc=0;
+static int yyLineNr = 1;
+static char * g_buf = 0;
+static uint g_bufSize = 0;
+static int iTextCounter = 0;
+static int iCounter = 0;
+static int bropen = 0;
+static int scantype = 0;
+static int g_lastCommentContext = 0;
+static bool docBlockAutoBrief;
+static char docBlockTerm;
+static int iDocLine = -1;
+static Entry gBlock;
+static int num_chars;
+
+//#define YY_A_INTERACTIVE 1
+#define YY_NEVER_INTERACTIVE 1
+//-----------------------------------------------------------------------------
+#define YY_USER_ACTION num_chars += vhdlscanYYleng;
+static void parserInit();
+static void deleteSpecChars(char* str,char *buf);
+static void handleCommentBlock(const QCString &doc,bool brief);
+static void newEntry();
+static void initEntry(Entry *e);
+
+static int iCodeLen;
+
+static void makeInline()
+{
+ int diff=num_chars-iCodeLen;
+ assert(inputLen>iCodeLen+diff);
+ QCString par(&inputString[iCodeLen],diff);
+ int index=par.findRev("\\endcode");
+ int tt=par.length()-par.find("\n",index);
+ QCString qc(&inputString[iCodeLen-tt],diff);
+ index=qc.findRev("--!");
+ if (index<=0) return;
+ par=qc.left(index);
+ /*
+ fprintf(stderr,"\n-------------------------------------------------------------------------------- ");
+ fprintf(stderr,"\n bytes since %d %d \n %s",num_chars,iCodeLen,par.data());
+ fprintf(stderr,"\n-------------------------------------------------------------------------------- ");
+ */
+ gBlock.doc=par;
+ gBlock.section=Entry::VARIABLE_SEC;
+ gBlock.spec=VhdlDocGen::MISCELLANEOUS;
+ gBlock.fileName = yyFileName;
+ gBlock.endBodyLine=yyLineNr-1;
+ Entry *temp=new Entry(gBlock);
+ if (lastCompound)
+ lastCompound->addSubEntry(temp);
+ else if (lastEntity)
+ lastEntity->addSubEntry(temp);
+ else
+ {
+ temp->type="misc"; // global code
+ current_root->addSubEntry(temp);
+ }
+
+ gBlock.reset();
+
+}// makeInline
+
+static void addSubEntry(Entry* root, Entry* e)
+{
+ if (e==0 || root==0) return;
+ //if (isPrevDoc)
+ //{
+ // e->brief=prevDocEntry.brief;
+ // e->briefLine=prevDocEntry.briefLine;
+ // prevDocEntry.reset();
+ // isPrevDoc=FALSE;
+ //}
+ root->addSubEntry(e);
+}
+
+static void bufferClear()
+{
+ int j;
+ for (j=0;j<iCounter+1;j++)
+ {
+ g_buf[j]=0;
+ }
+
+ iCounter=0;
+}
+
+static void addText (char *word, int llen)
+{
+ if ((uint)(iCounter + llen) > g_bufSize)
+ {
+ char *pTmp = (char*)realloc(g_buf,iCounter+llen+2048);
+ if (pTmp)
+ {
+ g_buf = pTmp;
+ }
+ else
+ {
+ fprintf(stderr,"\n not enough memory for realloc\n");
+ return;
+ }
+ }
+ while (llen>0)
+ {
+ g_buf[iCounter]=*word++;
+ iCounter++;
+ llen--;
+ }
+ g_buf[iCounter]='\0';
+}
+
+static void getBufText(QCString& qc,int start)
+{
+ while (start < iCounter)
+ {
+ qc+=(g_buf[start]);
+ start++;
+ }
+}
+
+static void lineCount()
+{
+ for ( const char* c = vhdlscanYYtext ; *c ; ++c )
+ {
+ yyLineNr += (*c == '\n') ;
+ }
+}
+
+static void deleteSpecChars(char* str,char *buf)
+{
+ while (*str)
+ {
+ if ((*str == '\t') || (*str == '\n') || (*str == '\r') || (*str == ' '))
+ {
+ *str++;
+ }
+ else
+ {
+ *buf++ = *str++;
+ }
+ }
+ *buf='\0';
+}
+
+static void getType(Entry* p,char* text)
+{
+ QCString name(text);
+ name=name.stripWhiteSpace();
+ if (stricmp(name.data(),"signal" )==0)
+ {
+ p->spec=VhdlDocGen::SIGNAL;
+ }
+ else if (stricmp(name.data(),"type" )==0)
+ {
+ p->spec=VhdlDocGen::TYPE;
+ }
+ else if (stricmp(name.data(),"subtype" )==0)
+ {
+ p->spec=VhdlDocGen::SUBTYPE;
+ }
+ else if (stricmp(name.data(),"constant" )==0)
+ {
+ p->spec=VhdlDocGen::CONSTANT;
+ }
+ else if (stricmp(name.data(),"attribute" )==0)
+ {
+ p->spec=VhdlDocGen::ATTRIBUTE;
+ }
+ else if (stricmp(name.data(),"function" )==0)
+ {
+ p->spec=VhdlDocGen::FUNCTION;
+ }
+ else if (stricmp(name.data(),"procedure" )==0)
+ {
+ p->spec=VhdlDocGen::PROCEDURE;
+ }
+ else if (stricmp(name.data(),"units" )==0)
+ {
+ p->spec=VhdlDocGen::UNITS;
+ }
+ else if (name.contains("shared",false) && name.contains("variable",false))
+ {
+ p->spec=VhdlDocGen::SHAREDVARIABLE;
+ }
+ else if (stricmp(name.data(),"file" )==0)
+ {
+ p->spec=VhdlDocGen::VFILE;
+ }
+ else if (stricmp(name.data(),"group" )==0)
+ {
+ p->spec=VhdlDocGen::GROUP;
+ }
+ else if (stricmp(name.data(),"alias" )==0)
+ {
+ p->spec=VhdlDocGen::ALIAS;
+ }
+ else
+ {
+ err("wrong type");
+ }
+ p->section=Entry::VARIABLE_SEC;
+}
+
+//-------------------------------------------------------------------------
+
+/*
+ * adds signals found in entities|records|units
+ */
+
+static void addSignals(const char* str,int line, Entry *e,const char *comment=0)
+{
+ //printf("===> addSignals (%s) comment='%s'\n",str,comment);
+ QList<QCString> ql;
+ QCString bufio;
+ ql.setAutoDelete(TRUE);
+
+ VhdlDocGen::getSigName(ql,str,bufio);
+ int count = ql.count();
+
+ QCString brief = current->brief;
+ QCString doc = current->doc;
+ Entry *tmpEntry = current;
+ current = new Entry;
+ initEntry(current);
+ handleCommentBlock(comment,TRUE);
+ if (!current->brief.isEmpty())
+ {
+ if (doc.isEmpty())
+ {
+ doc = brief;
+ }
+ else if (!brief.isEmpty())
+ {
+ doc = brief + "<p>" + doc;
+ }
+ brief = current->brief;
+ }
+ delete current;
+ current = tmpEntry;
+ current->brief.resize(0);
+ current->doc.resize(0);
+
+ if (genPort!=3) // not a unit
+ {
+ for (int k=1;k<count;k++)
+ {
+ //printf("adding '%s' '%s'\n",ql.at(0)->data(),ql.at(k)->data());
+ Entry *pTemp=new Entry;
+ initEntry(pTemp);
+ pTemp->startLine = line;
+ pTemp->bodyLine = line;
+ pTemp->name = ql.at(k)->data();
+ pTemp->section = Entry::VARIABLE_SEC;
+ pTemp->brief = brief;
+ pTemp->doc = doc;
+ pTemp->mGrpId = current->mGrpId; // copy member group id
+ QCString stSpec = ql.at(0)->data();
+ if (genPort==1) // found port
+ {
+ pTemp->spec = VhdlDocGen::PORT;
+ stSpec.stripPrefix(bufio.data());
+ stSpec=stSpec.stripWhiteSpace();
+ pTemp->args = stSpec;
+ pTemp->type = bufio;
+ addSubEntry(e,pTemp);
+ }
+ else if (genPort==2) // found record
+ {
+ pTemp->spec = VhdlDocGen::RECORD;
+ pTemp->type = stSpec;
+ pTemp->name.prepend(VhdlDocGen::getRecordNumber());
+ delete current;
+ current = new Entry(*pTemp); // make a deep copy of pTemp
+ newEntry(); // add it to lastCompound and make a new current
+ delete pTemp;
+ }
+ else
+ {
+ pTemp->spec = VhdlDocGen::GENERIC;
+ pTemp->type = stSpec;
+ addSubEntry(e,pTemp);
+ }
+ }// for
+ }
+ else // found a unit
+ {
+ Entry *pTemp=new Entry;
+ initEntry(pTemp);
+ QCString tt(str);
+ QStringList ql=QStringList::split("=",tt,FALSE);
+ pTemp->spec = VhdlDocGen::UNITS;
+ pTemp->section = Entry::VARIABLE_SEC;
+ pTemp->startLine = line;
+ pTemp->bodyLine = line;
+ pTemp->brief = brief; // adds brief description to the unit member
+ pTemp->doc = doc; // adds doc to the unit member
+ pTemp->type = ql[1];
+ pTemp->name = ql[0].stripWhiteSpace();
+ pTemp->name.prepend(VhdlDocGen::getRecordNumber());
+ delete current;
+ current = new Entry(*pTemp); // make a deep copy
+ newEntry(); // add it to lastCompound
+ delete pTemp;
+ }
+}
+
+/*
+ * this function parses a process prototype
+ * and adds the signal to the process
+ */
+
+static void parseProcessProto()
+{
+ QStringList ql;
+ QCString qcs;
+ bool sem=FALSE;
+ //Entry* ppEntry=new Entry;
+ //ppEntry->fileName=yyFileName;
+ //processEntry=ppEntry;
+ QCString name;
+ scantype=0;
+ getBufText(qcs,0);
+ if (qcs.contains('(') != qcs.contains(')')) return;
+ VhdlDocGen::deleteAllChars(qcs,'\n');
+ VhdlDocGen::parseProcessProto(qcs,name,ql);
+ current->section=Entry::FUNCTION_SEC;
+ //current->stat=TRUE;
+ current->spec=VhdlDocGen::PROCESS;
+ current->startLine=iFuncLine;
+ current->bodyLine=iFuncLine;
+ current->fileName=yyFileName;
+ if (!name.isEmpty())
+ {
+ current->name=name.stripWhiteSpace();
+ }
+ else // found an anonymous process, so we add a generated name
+ {
+ current->name=VhdlDocGen::getProcessNumber();
+ }
+
+ current->args+=" ( ";
+ if (!ql.isEmpty())
+ {
+ QValueList<QString>::Iterator iter = ql.begin();
+ for ( ; iter != ql.end(); ++iter)
+ {
+ if (sem)
+ {
+ current->args+=',';
+ }
+ Argument *arg=new Argument;
+ arg->name=((QCString)*iter).stripWhiteSpace();
+ current->argList->append(arg);
+ current->args+=(QCString)*iter;
+ sem = TRUE;
+ }
+ }
+ current->args+=" ) ";
+ bufferClear();
+}//parseProcessProto
+
+
+/*
+ * parses a function|procedure protoype
+ */
+
+static void parseFunctionProto()
+{
+ QCString name,ret,qcs,temp;
+ bool sem=FALSE;
+ QList<Argument> ql;
+ ql.setAutoDelete(TRUE);
+ getBufText(qcs,0);
+ if (qcs.contains('(') != qcs.contains(')'))
+ return; // function without a prototype
+ if (qcs.contains("function",FALSE)==0 && qcs.contains("procedure",FALSE)==0)
+ return;
+ qcs=qcs.stripWhiteSpace();
+ temp=qcs.lower();
+ if (temp.stripPrefix("impure"))
+ {
+ current->exception="impure";
+ qcs=qcs.remove(0,6);
+ }
+ else if (temp.stripPrefix("pure"))
+ {
+ current->exception="pure";
+ qcs=qcs.remove(0,4);
+ }
+
+ VhdlDocGen::parseFuncProto(qcs.data(),ql,name,ret);
+ //printf("parseFuncProto(%s)=%s,%s\n",qcs.data(),name.data(),ret.data());
+ VhdlDocGen::deleteAllChars(name,';');
+ current->name=name;
+ current->startLine=iFuncLine;
+ current->bodyLine=iFuncLine;
+
+ int count = ql.count();
+
+ current->args+" ( ";
+ for (int k=0;k<count;k++)
+ {
+ if (sem)
+ {
+ current->args+=",";
+ }
+ Argument *arg=new Argument;
+ Argument *hh=(Argument*)ql.at(k);
+ arg->name=hh->name;
+ arg->type=hh->type;
+ arg->defval=hh->defval;
+ arg->attrib=hh->attrib;
+ current->argList->append(arg);
+ current->args+=hh->name;
+ sem=TRUE;
+ }
+ current->args+" )";
+
+ if (!ret.isEmpty())
+ current->spec=VhdlDocGen::FUNCTION;
+ else
+ current->spec=VhdlDocGen::PROCEDURE;
+
+ current->section=Entry::FUNCTION_SEC;
+ current->type=ret;
+ //addSubEntry(ee,ppEntry);
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ bufferClear();
+}//parseFunctionProto
+
+static Entry* getEntryAtLine(const Entry* ce,int line)
+{
+ EntryListIterator eli(*ce->children());
+ Entry *found=0;
+ Entry *rt;
+ for (;(rt=eli.current());++eli)
+ {
+ if (rt->bodyLine==line)
+ {
+ found=rt;
+ } // if
+ if (!found)
+ {
+ found=getEntryAtLine(rt,line);
+ }
+ }
+ return found;
+}// getEntryAtLine
+
+//-------------------------------------------------------------------------
+
+static void parserInit()
+{
+ iCounter=0;
+ iTextCounter=0;
+ yyLineNr=1;
+ current=0;
+ previous=0;
+ isFunc=0;
+ isBody=0;
+ scantype=0;
+ lastCompound=0;
+ lastEntity=0;
+ bropen=0;
+ openGroups=0;
+ iDocLine=-1;
+ qrl.clear();
+ num_chars=0;
+
+ if (!g_lexInit)
+ {
+ VhdlDocGen::init();
+ }
+
+ g_bufSize=inputFile.size()+1024;
+ if (g_buf==0) free(g_buf);
+ g_buf=(char*)(calloc(g_bufSize,sizeof(char)));
+
+ if (g_buf==0)
+ {
+ fprintf(stderr,"\n not enough memory");
+ return;
+ }
+ g_buf[g_bufSize-1]='\0';
+}
+
+bool VHDLLanguageScanner::needsPreprocessing(const QCString &)
+{
+ return FALSE;
+}
+
+
+void VHDLLanguageScanner::resetCodeParserState()
+{
+
+}
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ if (g_inputFromFile)
+ {
+ c = inputFile.readBlock(buf,max_size);
+ if (c==-1) yy_fatal_error("input in flex scanner failed");
+ }
+ else
+ {
+ while ( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++;
+ buf++;
+ }
+ }
+ return c;
+}
+
+
+
+/* start command character */
+/* -------------- VHDL SECTION -----------------------------------*/
+/* Removed due to bug 538239
+POST "postponed"
+PROCESS ({BR}*{FUNCNAME}{B}*[:]{BR}*({POST}{BR}+)?("process"){BR}*{PROTO})|("process"){BR}*("("){BR}*{PROTO}|[^a-zA-Z]("process"){CR}|[^a-zA-Z]("process"){BR}+("is")
+*/
+/* VHDL 2001 */
+/* language parsing states */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 7949 "<stdout>"
+
+#define INITIAL 0
+#define Start 1
+#define Comment 2
+#define FindTypeName 3
+#define ParseType 4
+#define ParseRecord 5
+#define ParseUnits 6
+#define ParseProcess 7
+#define ParseFunc 8
+#define FindName 9
+#define FindEntityName 10
+#define FindGenPort 11
+#define FindTypes 12
+#define FindSigName 13
+#define FindFuncName 14
+#define FindBegin 15
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int vhdlscanYYlex_destroy (void );
+
+int vhdlscanYYget_debug (void );
+
+void vhdlscanYYset_debug (int debug_flag );
+
+YY_EXTRA_TYPE vhdlscanYYget_extra (void );
+
+void vhdlscanYYset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *vhdlscanYYget_in (void );
+
+void vhdlscanYYset_in (FILE * in_str );
+
+FILE *vhdlscanYYget_out (void );
+
+void vhdlscanYYset_out (FILE * out_str );
+
+yy_size_t vhdlscanYYget_leng (void );
+
+char *vhdlscanYYget_text (void );
+
+int vhdlscanYYget_lineno (void );
+
+void vhdlscanYYset_lineno (int line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int vhdlscanYYwrap (void );
+#else
+extern int vhdlscanYYwrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 262144
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( vhdlscanYYtext, vhdlscanYYleng, 1, vhdlscanYYout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ yy_size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( vhdlscanYYin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( vhdlscanYYin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, vhdlscanYYin))==0 && ferror(vhdlscanYYin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(vhdlscanYYin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int vhdlscanYYlex (void);
+
+#define YY_DECL int vhdlscanYYlex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after vhdlscanYYtext and vhdlscanYYleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ if ( vhdlscanYYleng > 0 ) \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+ (vhdlscanYYtext[vhdlscanYYleng - 1] == '\n'); \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 691 "vhdlscanner.l"
+
+
+#line 8152 "<stdout>"
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ /* Create the reject buffer large enough to save one state per allowed character. */
+ if ( ! (yy_state_buf) )
+ (yy_state_buf) = (yy_state_type *)vhdlscanYYalloc(YY_STATE_BUF_SIZE );
+ if ( ! (yy_state_buf) )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlscanYYlex()" );
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! vhdlscanYYin )
+ vhdlscanYYin = stdin;
+
+ if ( ! vhdlscanYYout )
+ vhdlscanYYout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ vhdlscanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ vhdlscanYY_create_buffer(vhdlscanYYin,YY_BUF_SIZE );
+ }
+
+ vhdlscanYY_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of vhdlscanYYtext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1861 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 27243 );
+
+yy_find_action:
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+goto find_rule; /* Shut up GCC warning -Wall */
+find_rule: /* we branch to this label when backing up */
+ for ( ; ; ) /* until we find what rule we matched */
+ {
+ if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
+ {
+ yy_act = yy_acclist[(yy_lp)];
+ if ( yy_act & YY_TRAILING_HEAD_MASK ||
+ (yy_looking_for_trail_begin) )
+ {
+ if ( yy_act == (yy_looking_for_trail_begin) )
+ {
+ (yy_looking_for_trail_begin) = 0;
+ yy_act &= ~YY_TRAILING_HEAD_MASK;
+ break;
+ }
+ }
+ else if ( yy_act & YY_TRAILING_MASK )
+ {
+ (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
+ (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
+ }
+ else
+ {
+ (yy_full_match) = yy_cp;
+ (yy_full_state) = (yy_state_ptr);
+ (yy_full_lp) = (yy_lp);
+ break;
+ }
+ ++(yy_lp);
+ goto find_rule;
+ }
+ --yy_cp;
+ yy_current_state = *--(yy_state_ptr);
+ (yy_lp) = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+#line 693 "vhdlscanner.l"
+{
+ lineCount();
+}
+ YY_BREAK
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 699 "vhdlscanner.l"
+{ // found configuration
+
+ QCString qcs(vhdlscanYYtext);
+ current->name=VhdlDocGen::getIndexWord(qcs,1);
+ current->type=VhdlDocGen::getIndexWord(qcs,3);
+ current->startLine=yyLineNr;
+ current->bodyLine=yyLineNr;
+ current->section=Entry::VARIABLE_SEC;
+ current->spec=VhdlDocGen::CONFIG;
+ current->args="configuration";
+ newEntry();
+ BEGIN(Start);
+}
+ YY_BREAK
+case 3:
+/* rule 3 can match eol */
+YY_RULE_SETUP
+#line 713 "vhdlscanner.l"
+{ // found type constant|type|attribute and so on..
+ bropen=0;
+ lineCount();
+
+ bufferClear();
+ //pEntry=current;
+ getType(current,vhdlscanYYtext);
+ current->bodyLine=yyLineNr;
+ if (current->spec==VhdlDocGen::UNITS)
+ {
+ //addSubEntry(current,pEntry);
+ current->startLine=yyLineNr;
+ current->bodyLine=yyLineNr;
+ newEntry(); // adds the unit to the lastCompound
+ genPort=3;
+ BEGIN(ParseRecord);
+ }
+ else
+ {
+ BEGIN(FindTypeName);
+ }
+ }
+ YY_BREAK
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 736 "vhdlscanner.l"
+{ //found architecure
+ lineCount();
+ bropen=0;
+ bufferClear();
+ isBody=0;
+ lastCompound = current;
+ QCString curName=VhdlDocGen::getIndexWord(vhdlscanYYtext,1);
+ current->section=Entry::CLASS_SEC; //Entry::CLASS_SEC;
+ current->spec=VhdlDocGen::ARCHITECTURE;
+ current->protection=Private;
+ current->name=curName;
+ current->fileName=yyFileName;
+ current->startLine=yyLineNr;
+ current->bodyLine=yyLineNr;
+ //printf("-> Architecture at line %d\n",yyLineNr);
+ BEGIN(FindName);
+}
+ YY_BREAK
+case 5:
+/* rule 5 can match eol */
+YY_RULE_SETUP
+#line 755 "vhdlscanner.l"
+{ //found process
+ lineCount();
+ iFuncLine=yyLineNr;
+ bropen=0;
+ //printf("--> Process: line=%d\n",yyLineNr);
+ bufferClear();
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ QCString qcs(vhdlscanYYtext);
+ if (qcs.contains('('))
+ {
+ bropen=1;
+ scantype=2;
+ BEGIN(ParseType);
+ }
+ else
+ {
+ // iFuncLine--;
+ parseProcessProto();
+ BEGIN(ParseProcess);
+ }
+}
+ YY_BREAK
+case 6:
+/* rule 6 can match eol */
+YY_RULE_SETUP
+#line 777 "vhdlscanner.l"
+{ // found library or package
+ bropen=0;
+ bufferClear();
+ isBody=0;
+ QCString qcs=QCString(vhdlscanYYtext);
+ // lowerString(qcs);
+ qcs=qcs.stripWhiteSpace();
+ if (stricmp(qcs.data(),"use")==0)
+ {
+ current->spec=VhdlDocGen::USE;
+ current->type="package";
+ }
+ else
+ {
+ current->spec=VhdlDocGen::LIBRARY;
+ current->type="library";
+ }
+ current->section=Entry::VARIABLE_SEC;
+ current->bodyLine=yyLineNr;
+ lineCount();
+ BEGIN(FindName);
+}
+ YY_BREAK
+case 7:
+/* rule 7 can match eol */
+YY_RULE_SETUP
+#line 800 "vhdlscanner.l"
+{ // found a new function|procedure
+ lineCount();
+ iFuncLine=yyLineNr;
+ bropen=0;
+ bufferClear();
+ isFunc=1;
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ BEGIN(FindFuncName);
+}
+ YY_BREAK
+case 8:
+/* rule 8 can match eol */
+YY_RULE_SETUP
+#line 810 "vhdlscanner.l"
+{ // found entity|component|package
+ lineCount();
+ //printf("--> Entity at line %d\n",yyLineNr);
+
+ bropen=0;
+ bufferClear();
+ QCString word(vhdlscanYYtext);
+ word=word.lower();
+ word=word.stripWhiteSpace();
+
+ if (strcmp(word.data(),"entity")==0)
+ {
+ isBody=0;
+ scantype=0;
+ lastCompound=0;
+ current->section=Entry::CLASS_SEC;
+ current->spec=VhdlDocGen::ENTITY;
+ current->protection=Public;
+ current->bodyLine=yyLineNr;
+ current->fileName=yyFileName;
+ lastEntity = current;
+ }
+ else if (strcmp(word.data(),"component")==0)
+ {
+ current->section=Entry::VARIABLE_SEC;
+ // current->stat=TRUE;
+ current->spec=VhdlDocGen::COMPONENT;
+ current->bodyLine=yyLineNr;
+ scantype=1;
+ }
+ else if (strcmp(word,"package")==0)
+ {
+ isBody=0;
+ scantype=0;
+ lastCompound = current;
+ current->section=Entry::CLASS_SEC;
+ current->spec=VhdlDocGen::PACKAGE;
+ current->protection=Package; //VhdlDocGen::PACKAGE;
+ current->bodyLine=yyLineNr;
+ current->fileName=yyFileName;
+ }
+ else
+ err("\n found wrong component at line [%d]",yyLineNr);
+
+ BEGIN(FindEntityName);
+}
+ YY_BREAK
+case 9:
+/* rule 9 can match eol */
+YY_RULE_SETUP
+#line 857 "vhdlscanner.l"
+{ // found component instantiation
+
+ // lineCount();
+ QCString type;
+ QCString tt(vhdlscanYYtext);
+ QRegExp regg("[\\s:.()-]");
+ QStringList qsl=QStringList::split(regg,tt,false);
+
+ // consider upper/lower-case letters
+ QStringList qsltemp=QStringList::split(regg,tt.lower(),false);
+ int index=qsltemp.findIndex(QCString("entity"))+1;
+ index+=qsltemp.findIndex(QCString("component"))+1;
+ index+=qsltemp.findIndex(QCString("configuration"))+1;
+ int len=qsltemp.count();
+
+ current->spec=VhdlDocGen::COMPONENT_INST;
+ current->section=Entry::VARIABLE_SEC;
+ current->startLine=yyLineNr;
+ current->bodyLine=yyLineNr;
+
+ if (index!=0 && tt.contains(')')==0) // found component instantiation xxx: configuration/component/entity yyy
+ {
+ current->type=(QCString)qsl[len-3];
+ }
+ else if (index!=0 && tt.contains(')')) // found component instantiation xxx: entity www.yyy(zzz)
+ {
+ current->type=(QCString)qsl[len-4];
+ }
+ else
+ {
+ current->type=(QCString)qsl[1]; // found component instantiation xxx:yyy
+ }
+
+ current->name=QCString(qsl[0]);
+ if (lastCompound)
+ {
+ if (!VhdlDocGen::foundInsertedComponent(current->type,lastCompound))
+ {
+ BaseInfo *bb=new BaseInfo(current->type,Public,Normal);
+ lastCompound->extends->append(bb);
+ }
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ lineCount();
+
+}
+ YY_BREAK
+case 10:
+/* rule 10 can match eol */
+YY_RULE_SETUP
+#line 910 "vhdlscanner.l"
+{
+ lineCount();
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ BEGIN(Start);
+}
+ YY_BREAK
+case 11:
+/* rule 11 can match eol */
+YY_RULE_SETUP
+#line 916 "vhdlscanner.l"
+{
+ // eat process body
+ lineCount();
+ BEGIN(ParseProcess);
+}
+ YY_BREAK
+case 12:
+/* rule 12 can match eol */
+YY_RULE_SETUP
+#line 922 "vhdlscanner.l"
+{ // find end of process
+ lineCount();
+ current->endBodyLine=yyLineNr;
+ //printf("Process: start=%d end=%d\n",current->bodyLine,current->endBodyLine);
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ BEGIN(Start);
+}
+ YY_BREAK
+case 13:
+/* rule 13 can match eol */
+YY_RULE_SETUP
+#line 940 "vhdlscanner.l"
+{
+ lineCount();
+}
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 944 "vhdlscanner.l"
+{ // parse record|unit body
+ lineCount();
+ QCString zz(vhdlscanYYtext);
+ addSignals(zz.data(),yyLineNr,current);
+ BEGIN(ParseUnits);
+}
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 951 "vhdlscanner.l"
+{ // found entity|architecture|component name
+ lineCount();
+
+ QCString qcs(vhdlscanYYtext);
+ qcs=qcs.stripWhiteSpace();
+ if (current->spec==VhdlDocGen::USE || current->spec==VhdlDocGen::LIBRARY)
+ {
+ int j=qcs.length();
+ int i=qcs.find(".");
+ if (i>0)
+ qcs=qcs.right(j-i-1);
+ i=qcs.find(".");
+ if (i>0)
+ qcs=qcs.left(i);
+ /*
+ -- Consider the case we have more than one entity in one file.Each entity has its own package/library
+ -- declaration. In this case package yyy will be added [with newEntry()] to architecture aaa !! instead to entity
+ -- bbb. We must place these constructs to current_root and the function mapLibPackage() will finish the rest.
+
+ -- package xxx;
+ -- entity aaa
+ -- ....
+ -- end entity aaa;
+ -- architecture aaa
+ -- ...
+ -- end architecture aaa;
+ -- package yyy;
+ -- entity bbb;
+ */
+
+ current->name=qcs;
+ Entry *copy=new Entry(*current);
+ current->reset();
+ addSubEntry(current_root,copy); // insert into entry list with mapLibPackage()
+ }
+ else if (current->spec==VhdlDocGen::ARCHITECTURE)
+ {
+ //current->name+=qcs.lower();
+ current->name.prepend(qcs+"::");
+
+ //if (lastEntity)
+ //{
+ // inherit private inheritance relation between entity and architecture
+ //if (!VhdlDocGen::foundInsertedComponent(current->name,lastEntity))
+ //{
+ // BaseInfo *bb=new BaseInfo(current->name,Private,Normal);
+ // lastEntity->extends->append(bb);
+ //}
+ //}
+
+ }
+ else if (current->spec==VhdlDocGen::PACKAGE_BODY)
+ {
+ current->name+=qcs;
+ }
+ else
+ {
+ current->name+=qcs;
+ }
+ if (!(current->spec==VhdlDocGen::USE || current->spec==VhdlDocGen::LIBRARY))
+ newEntry();
+
+ BEGIN(Start);
+}
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 1016 "vhdlscanner.l"
+{ // found name of a process|function|procedure
+ lineCount();
+
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ BEGIN(ParseType);
+}
+ YY_BREAK
+case 17:
+/* rule 17 can match eol */
+YY_RULE_SETUP
+#line 1023 "vhdlscanner.l"
+{
+ lineCount();
+ current->name=QCString(vhdlscanYYtext);
+ BEGIN(ParseType);
+}
+ YY_BREAK
+case 18:
+/* rule 18 can match eol */
+YY_RULE_SETUP
+#line 1030 "vhdlscanner.l"
+{lineCount(); BEGIN(Start); }
+ YY_BREAK
+case 19:
+/* rule 19 can match eol */
+YY_RULE_SETUP
+#line 1032 "vhdlscanner.l"
+{
+ lineCount();
+ current->section=Entry::VARIABLE_SEC;
+ current->spec=VhdlDocGen::TYPE;
+ current->type="protected";
+ newEntry();
+ BEGIN(Start);
+}
+ YY_BREAK
+case 20:
+/* rule 20 can match eol */
+YY_RULE_SETUP
+#line 1044 "vhdlscanner.l"
+{ // find record
+ lineCount();
+ if (isFunc)
+ {
+ BEGIN(Start);
+ }
+
+ genPort=2;
+ current->section=Entry::VARIABLE_SEC;
+ current->spec=VhdlDocGen::RECORD;
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ newEntry(); // adds the record to the last compound
+ BEGIN(ParseRecord);
+}
+ YY_BREAK
+case 21:
+/* rule 21 can match eol */
+YY_RULE_SETUP
+#line 1059 "vhdlscanner.l"
+{
+ lineCount();
+ }
+ YY_BREAK
+case 22:
+/* rule 22 can match eol */
+YY_RULE_SETUP
+#line 1063 "vhdlscanner.l"
+{
+ lineCount();
+ genPort=0;
+ bufferClear();
+ BEGIN(Start);
+}
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 1070 "vhdlscanner.l"
+{ // parse record body
+ lineCount();
+ QCString comment;
+ QCString zz(vhdlscanYYtext);
+ VhdlDocGen::deleteAllChars(zz,';'); //delete ; in unit construct
+ if (zz.contains("--!"))
+ {
+ QStringList ql=QStringList::split("--!",zz,FALSE);
+ comment = ql[1];
+ zz = ql[0];
+ }
+ else if (zz.contains("--"))
+ {
+ QStringList ql=QStringList::split("--",zz,FALSE);
+ zz = ql[0];
+ }
+ initEntry(current);
+ addSignals(zz,yyLineNr,current,comment);
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ BEGIN(ParseRecord);
+}
+ YY_BREAK
+case 24:
+/* rule 24 can match eol */
+YY_RULE_SETUP
+#line 1092 "vhdlscanner.l"
+{ // found a new function in an architecture ?
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ lineCount();
+ QCString ttt;
+ bool bb=TRUE;
+ getBufText(ttt,0);
+ if (ttt.contains("--"))
+ {
+ unput('-');unput('-');
+ VhdlDocGen::deleteCharRev(ttt,'-');
+ VhdlDocGen::deleteCharRev(ttt,'-');
+ }
+ if (ttt.contains('(') != ttt.contains(')'))
+ {
+ bb=FALSE;
+ }
+ bool ss = VhdlDocGen::isFunctionProto(ttt);
+ //printf("VhdlDocGen::isFunctionProto(%s)=%d\n",ttt.data(),ss);
+ if (ss && bb)
+ {
+ bufferClear();
+ addText(ttt.data(),ttt.length());
+ functionEntry=0;
+ //eFuncBody=new Entry;
+ ::parseFunctionProto();
+ }
+ bufferClear();
+ BEGIN(ParseType);
+}
+ YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 1123 "vhdlscanner.l"
+{
+ lineCount();
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ BEGIN(ParseType);
+}
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 1129 "vhdlscanner.l"
+{
+ lineCount();
+ bropen++;
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ BEGIN(ParseType);
+}
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 1136 "vhdlscanner.l"
+{
+ lineCount();
+ bropen--;
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ if (bropen==0 && scantype==2) // process
+ {
+ ::parseProcessProto();
+ BEGIN(ParseProcess);
+ } // if
+ else
+ {
+ BEGIN(ParseType);
+ }
+}
+ YY_BREAK
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+#line 1152 "vhdlscanner.l"
+{ // found end of function|process
+ QRegExp regg("[\\s;]");
+ lineCount();
+ QCString tt(vhdlscanYYtext);
+ tt=tt.lower();
+ QStringList ql=QStringList::split(regg,tt,FALSE);
+ int index=ql.findIndex(QCString("if"))+1;
+ index+=ql.findIndex(QCString("case"))+1;
+ index+=ql.findIndex(QCString("loop"))+1;
+ index+=ql.findIndex(QCString("generate"))+1;
+ bufferClear();
+ if (index==0)
+ {
+ if (isFunc)
+ {
+ Entry* pFunc=getEntryAtLine(current_root,iFuncLine);
+ if (pFunc && pFunc->section==Entry::FUNCTION_SEC)
+ {
+ pFunc->endBodyLine=yyLineNr;
+ }
+ isFunc=0;
+ BEGIN(Start);
+ }
+ }
+}
+ YY_BREAK
+case 29:
+/* rule 29 can match eol */
+YY_RULE_SETUP
+#line 1178 "vhdlscanner.l"
+{
+ // eat process body
+ lineCount();
+ BEGIN(ParseFunc);
+ }
+ YY_BREAK
+case 30:
+/* rule 30 can match eol */
+YY_RULE_SETUP
+#line 1184 "vhdlscanner.l"
+{
+ QRegExp regg("[\\s;]");
+ lineCount();
+ QCString tt(vhdlscanYYtext);
+ tt=tt.lower();
+ QStringList ql=QStringList::split(regg,tt,FALSE);
+ int index=ql.findIndex(QCString("if"))+1;
+ index+=ql.findIndex(QCString("case"))+1;
+ index+=ql.findIndex(QCString("loop"))+1;
+ index+=ql.findIndex(QCString("generate"))+1;
+ bufferClear();
+ if (index==0 && isFunc)
+ {
+ Entry* pFunc=getEntryAtLine(current_root,iFuncLine);
+ if (pFunc && pFunc->section==Entry::FUNCTION_SEC)
+ {
+ pFunc->endBodyLine=yyLineNr;
+ }
+ isFunc=0;
+ BEGIN(Start);
+ }
+}
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 1207 "vhdlscanner.l"
+{
+ lineCount();
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ if (bropen==0 && !(isFunc==1 && isBody==1) )
+ {
+ if (isFunc)
+ {
+ parseFunctionProto();
+ bufferClear();
+ if (lastCompound && lastCompound->spec==VhdlDocGen::PACKAGE)
+ {
+ isFunc=0;
+ BEGIN(Start);
+ }
+ else
+ {
+ BEGIN(ParseFunc);
+ }
+ }//if
+ else
+ {
+ QCString qcs;
+ getBufText(qcs,0);
+ qcs=qcs.stripWhiteSpace();
+ current->section=Entry::VARIABLE_SEC;
+ current->type+=qcs.data();
+
+ if ((current->spec==VhdlDocGen::SIGNAL ||
+ current->spec==VhdlDocGen::CONSTANT ||
+ current->spec==VhdlDocGen::TYPE ||
+ current->spec==VhdlDocGen::SUBTYPE ||
+ current->spec==VhdlDocGen::SHAREDVARIABLE
+ ) &&
+ qcs.stripPrefix(","))
+ {
+ QList<QCString> ql;
+ ql.setAutoDelete(TRUE);
+ QCString buffer;
+ if (current->spec==VhdlDocGen::SUBTYPE ||
+ current->spec==VhdlDocGen::TYPE
+ )
+ {
+ VhdlDocGen::getSigTypeName(ql,qcs.data(),buffer);
+ }
+ else
+ {
+ VhdlDocGen::getSigName(ql,qcs.data(),buffer);
+ }
+ QCString doc = current->doc;
+ QCString brief = current->brief;
+ if (ql.count()>0)
+ {
+ for (uint j=1;j<ql.count();j++)
+ {
+ Entry *ppt = new Entry;
+ initEntry(ppt);
+ ppt->type += ql.at(0)->data();
+ ppt->section = Entry::VARIABLE_SEC;
+ ppt->spec = current->spec;
+ ppt->name += ql.at(j)->data();
+ ppt->bodyLine = yyLineNr;
+ ppt->startLine = yyLineNr;
+ ppt->brief = brief;
+ ppt->doc = doc;
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(ppt);
+ }
+ else
+ {
+ current->addSubEntry(ppt);
+ }
+ }
+ current->type=ql.at(0)->data();
+ ql.clear();
+ }
+ }
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ isFunc=0;
+ bufferClear();
+ BEGIN(Start);
+ }
+ }
+ else
+ {
+ BEGIN(ParseType);
+ }
+}
+ YY_BREAK
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 1305 "vhdlscanner.l"
+{
+ lineCount();
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ BEGIN(ParseType);
+}
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 1311 "vhdlscanner.l"
+{ // found name of an entity/architecture/package
+ lineCount();
+ QCString qcs(vhdlscanYYtext);
+ qcs=qcs.stripWhiteSpace();
+ qcs=qcs.lower();
+ if (strcmp(qcs.data(),"body")==0) // found package body
+ {
+ current->spec=VhdlDocGen::PACKAGE_BODY;
+ current->section=Entry::CLASS_SEC;
+ current->protection=Protected;
+ current->name+=QCString("_");
+ isBody=1;
+ BEGIN(FindName);
+ }
+ else if (scantype==1) // found a component
+ {
+ QCString qq(vhdlscanYYtext);
+ qq=qq.stripWhiteSpace();
+ //qq=qq.lower();
+
+ current->name=qq;
+ qq=qq.lower();
+ if (lastCompound)
+ {
+ if (lastCompound->spec==VhdlDocGen::PACKAGE)
+ {
+ if (!VhdlDocGen::foundInsertedComponent(qq,lastCompound))
+ {
+ BaseInfo *bb=new BaseInfo(qq,Private,Normal);
+ lastCompound->extends->append(bb);
+ }
+ }
+
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ BEGIN(Start);
+ }
+ else
+ {
+ QCString qq(vhdlscanYYtext);
+ qq=qq.stripWhiteSpace();
+ current->name=qq;
+ newEntry();
+ //QCString qreal=QCString(vhdlscanYYtext);
+ BEGIN(Start);
+ }
+}
+ YY_BREAK
+case 34:
+/* rule 34 can match eol */
+YY_RULE_SETUP
+#line 1365 "vhdlscanner.l"
+{ // found generic|port in entity
+ QCString genp(vhdlscanYYleng+1);
+ deleteSpecChars(vhdlscanYYtext,genp.data());
+ VhdlDocGen::deleteCharRev(genp,'(');
+
+ if (stricmp(genp.data(),"port" )==0)
+ {
+ genPort=1;
+ }
+ else
+ {
+ genPort=0;
+ }
+
+ bropen=1;
+ bufferClear();
+ lineCount();
+ BEGIN(FindSigName);
+}
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 1385 "vhdlscanner.l"
+{
+ lineCount();
+ bropen--;
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ if (bropen==0)
+ {
+ bufferClear();
+ BEGIN(Start);
+ }
+ else
+ {
+ BEGIN(FindSigName);
+ }
+}
+ YY_BREAK
+case 36:
+/* rule 36 can match eol */
+YY_RULE_SETUP
+#line 1400 "vhdlscanner.l"
+{ // found signals in entity
+ QCString line(vhdlscanYYtext);
+
+ // note that line can be something like:
+ // "var1, var2, var3 : in std_logic_vector(8 downto 0); --! Some comment"
+
+ // but also
+ // "var4 --! Some comment
+ // );"
+ // which marks the end of a port
+
+ // and also
+ // "-- Some comment
+ // var1 : in std_logic;"
+
+ //printf("--> labelid='%s'\n",line.data());
+ QStringList ql;
+ QCString comment;
+ int openCount=line.contains('(');
+ int closeCount=line.contains(')');
+ int semi = line.find(';');
+ int pos = line.find("--");
+ int pos1 = line.find("--!");
+ if (pos!=-1 && pos<pos1) // strip normal comment before special one
+ {
+ line = line.remove(pos,pos1-pos);
+ }
+ //printf("=> signal: line='%s'\n",line.data());
+ if (semi!=-1 && pos!=-1)
+ {
+ int eol = line.findRev('\n');
+ //printf("pos=%d eol=%d\n",pos,eol);
+ if (eol>=pos+2)
+ {
+ QRegExp re("\\n[\\s]*--!"); // comment continuation
+ comment=line.mid(pos+2,eol-pos-2);
+ //printf("Comment: '%s'\n",comment.data());
+ int p,l;
+ while ((p=re.match(comment,0,&l))!=-1)
+ {
+ comment.remove(p,l);
+ }
+ line=line.left(pos)+line.right(line.length()-eol);
+ }
+ else
+ {
+ comment=line.mid(pos+2);
+ line=line.left(pos);
+ }
+ comment.stripWhiteSpace();
+ // must subtract "(" and ")" in comments because they are used for determining the
+ // end of a port/generic construct
+ openCount-=comment.contains('(');
+ closeCount-=comment.contains(')');
+ if (!comment.stripPrefix("!")) // not a special comment
+ {
+ comment.resize(0);
+ }
+ }
+ else
+ {
+ //printf("no ; or --: pos=%d semi=%d\n",pos,semi);
+ }
+ int diff=openCount-closeCount;
+ if (diff<0)
+ {
+ VhdlDocGen::deleteCharRev(line,')');
+ }
+
+ if (scantype!=1) // not a component
+ {
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ addSignals(line,yyLineNr,lastEntity,comment);
+ }
+
+ lineCount();
+
+ if ((bropen+openCount-closeCount)==0)
+ {
+ bufferClear();
+ BEGIN(Start);
+ }
+}
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 1485 "vhdlscanner.l"
+{
+ lineCount();
+ bropen++;
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+}
+ YY_BREAK
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 1492 "vhdlscanner.l"
+{
+ lineCount();
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ //BEGIN(FindSigName);
+}
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 1499 "vhdlscanner.l"
+{
+ //printf("\n found for[%s] [%d]",vhdlscanYYtext,yyLineNr);
+ lineCount();
+}
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 1504 "vhdlscanner.l"
+{ // found digit
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ lineCount();
+}
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 1509 "vhdlscanner.l"
+{
+ // Make sure string literals get transfered to the output
+ // We have to match these because the comment characters (--)
+ // can exist inside a string literal.
+ // We shouldn't have to call lineCount because newlines
+ // are not allowed inside string literals
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+}
+ YY_BREAK
+/*
+<*>{BR}*"--!"{B}*"@}" { // end group
+ if (current)
+ {
+ Entry *pg=new Entry;
+ addSubEntry(current,pg);
+ pg->startLine=yyLineNr;
+ pg->name="endgroup";
+ }
+ lineCount();
+}
+
+<*>{BR}*"--!"{B}*"@{" { // start group
+ if (current)
+ {
+ Entry *pg=new Entry;
+ addSubEntry(current,pg);
+ pg->startLine=yyLineNr;
+ pg->name="startgroup";
+ }
+ lineCount();
+}
+ */
+case 42:
+/* rule 42 can match eol */
+YY_RULE_SETUP
+#line 1542 "vhdlscanner.l"
+{ // multi line comment
+ if (iDocLine==-1) iDocLine=yyLineNr;
+ // signal clk :in std_logic; --!@brief global clock
+ // --!@brief global reset
+ // signal reset:in std_logic;
+ // these two comments are detected as a multi line comment
+ QCString qc(vhdlscanYYtext);
+ int len=qc.contains('\n')+yyLineNr-1;
+
+ if (YY_START!=Comment) // Start of the comment block
+ {
+ bufferClear();
+ iTextCounter=0;
+ startComment=yyLineNr;
+ g_lastCommentContext=YY_START;
+ }
+
+ Entry* pTemp=getEntryAtLine(current_root,len);
+ if (pTemp)
+ { // found one line comment, add it to the entry on this line
+ pTemp->briefLine=yyLineNr;
+ pTemp->brief+=vhdlscanYYtext;
+ VhdlDocGen::prepareComment(pTemp->brief);
+ }
+ else
+ {
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ }
+ lineCount();
+ BEGIN(Comment);
+}
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 1574 "vhdlscanner.l"
+{
+ if (iDocLine==-1) iDocLine=yyLineNr;
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ lineCount();
+}
+ YY_BREAK
+case 44:
+/* rule 44 can match eol */
+YY_RULE_SETUP
+#line 1580 "vhdlscanner.l"
+{
+ // found end of comment block
+ QCString qcs;
+ getBufText(qcs,iTextCounter);
+ VhdlDocGen::prepareComment(qcs);
+ int ii =qcs.find("\\code");
+ if (ii>0)
+ {
+ iCodeLen=num_chars;
+
+ gBlock.reset();
+ int len=qcs.length();
+ QCString name=qcs.right(len-ii);
+ name=VhdlDocGen::getIndexWord(name.data(),1);
+ if (!name)
+ gBlock.name="misc"+ VhdlDocGen::getRecordNumber();
+ else
+ gBlock.name=name;
+ qcs=qcs.left(ii);
+ gBlock.startLine=yyLineNr+1;
+ gBlock.bodyLine=yyLineNr+1;
+ gBlock.brief+=qcs;
+ iTextCounter=0;
+ }
+
+ if (ii==-1)
+ {
+ handleCommentBlock(qcs,FALSE);
+ }
+ bufferClear();
+ unput(*vhdlscanYYtext);
+ BEGIN(g_lastCommentContext);
+}
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 1614 "vhdlscanner.l"
+{ // one line comment
+ if (iDocLine==-1) iDocLine=yyLineNr;
+ QCString qcs(vhdlscanYYtext);
+ int j=qcs.find("--!");
+ qcs=qcs.right(qcs.length()-3-j);
+ bool isEndCode=qcs.contains("\\endcode");
+
+ if (isEndCode)
+ makeInline();
+ //printf("--> handleCommentBlock line %d\n",yyLineNr);
+ Entry* pTemp=getEntryAtLine(current_root,yyLineNr);
+
+ if (!isEndCode)
+ {
+ if (pTemp)
+ {
+ pTemp->briefLine=yyLineNr;
+ pTemp->brief+=qcs;
+ iDocLine=-1;
+ }
+ else
+ {
+ handleCommentBlock(qcs,TRUE);
+ }
+ }
+
+ bufferClear();
+}// one line
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 1644 "vhdlscanner.l"
+{
+}
+ YY_BREAK
+case 47:
+/* rule 47 can match eol */
+YY_RULE_SETUP
+#line 1647 "vhdlscanner.l"
+{
+ lineCount();
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ // printf("\n new-line [%d]",yyLineNr);
+ BEGIN(Start);
+}
+ YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 1654 "vhdlscanner.l"
+{
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ lineCount();
+}
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 1659 "vhdlscanner.l"
+{
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ lineCount();
+}
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 1664 "vhdlscanner.l"
+{
+ addText(vhdlscanYYtext,vhdlscanYYleng);
+ lineCount();
+}
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 1670 "vhdlscanner.l"
+ECHO;
+ YY_BREAK
+#line 9414 "<stdout>"
+ case YY_STATE_EOF(INITIAL):
+ case YY_STATE_EOF(Start):
+ case YY_STATE_EOF(Comment):
+ case YY_STATE_EOF(FindTypeName):
+ case YY_STATE_EOF(ParseType):
+ case YY_STATE_EOF(ParseRecord):
+ case YY_STATE_EOF(ParseUnits):
+ case YY_STATE_EOF(ParseProcess):
+ case YY_STATE_EOF(ParseFunc):
+ case YY_STATE_EOF(FindName):
+ case YY_STATE_EOF(FindEntityName):
+ case YY_STATE_EOF(FindGenPort):
+ case YY_STATE_EOF(FindTypes):
+ case YY_STATE_EOF(FindSigName):
+ case YY_STATE_EOF(FindFuncName):
+ case YY_STATE_EOF(FindBegin):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed vhdlscanYYin at a new source and called
+ * vhdlscanYYlex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = vhdlscanYYin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( vhdlscanYYwrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * vhdlscanYYtext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of vhdlscanYYlex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ vhdlscanYYrestart(vhdlscanYYin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) vhdlscanYYrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+ yy_current_state += YY_AT_BOL();
+
+ (yy_state_ptr) = (yy_state_buf);
+ *(yy_state_ptr)++ = yy_current_state;
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1861 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ *(yy_state_ptr)++ = yy_current_state;
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+
+ register YY_CHAR yy_c = 1;
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1861 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 1860);
+ if ( ! yy_is_jam )
+ *(yy_state_ptr)++ = yy_current_state;
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up vhdlscanYYtext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register yy_size_t number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ vhdlscanYYrestart(vhdlscanYYin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( vhdlscanYYwrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve vhdlscanYYtext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void vhdlscanYYrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ vhdlscanYYensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ vhdlscanYY_create_buffer(vhdlscanYYin,YY_BUF_SIZE );
+ }
+
+ vhdlscanYY_init_buffer(YY_CURRENT_BUFFER,input_file );
+ vhdlscanYY_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void vhdlscanYY_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * vhdlscanYYpop_buffer_state();
+ * vhdlscanYYpush_buffer_state(new_buffer);
+ */
+ vhdlscanYYensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ vhdlscanYY_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (vhdlscanYYwrap()) processing, but the only time this flag
+ * is looked at is after vhdlscanYYwrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void vhdlscanYY_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ vhdlscanYYin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE vhdlscanYY_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) vhdlscanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlscanYY_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) vhdlscanYYalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlscanYY_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ vhdlscanYY_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with vhdlscanYY_create_buffer()
+ *
+ */
+ void vhdlscanYY_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ vhdlscanYYfree((void *) b->yy_ch_buf );
+
+ vhdlscanYYfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a vhdlscanYYrestart() or at EOF.
+ */
+ static void vhdlscanYY_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ vhdlscanYY_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then vhdlscanYY_init_buffer was _probably_
+ * called from vhdlscanYYrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void vhdlscanYY_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ vhdlscanYY_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void vhdlscanYYpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ vhdlscanYYensure_buffer_stack();
+
+ /* This block is copied from vhdlscanYY_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from vhdlscanYY_switch_to_buffer. */
+ vhdlscanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void vhdlscanYYpop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ vhdlscanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ vhdlscanYY_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void vhdlscanYYensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)vhdlscanYYalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlscanYYensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)vhdlscanYYrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlscanYYensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE vhdlscanYY_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) vhdlscanYYalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlscanYY_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ vhdlscanYY_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to vhdlscanYYlex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * vhdlscanYY_scan_bytes() instead.
+ */
+YY_BUFFER_STATE vhdlscanYY_scan_string (yyconst char * yystr )
+{
+
+ return vhdlscanYY_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to vhdlscanYYlex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE vhdlscanYY_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n, i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) vhdlscanYYalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in vhdlscanYY_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = vhdlscanYY_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in vhdlscanYY_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up vhdlscanYYtext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ vhdlscanYYtext[vhdlscanYYleng] = (yy_hold_char); \
+ (yy_c_buf_p) = vhdlscanYYtext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ vhdlscanYYleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int vhdlscanYYget_lineno (void)
+{
+
+ return vhdlscanYYlineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *vhdlscanYYget_in (void)
+{
+ return vhdlscanYYin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *vhdlscanYYget_out (void)
+{
+ return vhdlscanYYout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+yy_size_t vhdlscanYYget_leng (void)
+{
+ return vhdlscanYYleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *vhdlscanYYget_text (void)
+{
+ return vhdlscanYYtext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void vhdlscanYYset_lineno (int line_number )
+{
+
+ vhdlscanYYlineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see vhdlscanYY_switch_to_buffer
+ */
+void vhdlscanYYset_in (FILE * in_str )
+{
+ vhdlscanYYin = in_str ;
+}
+
+void vhdlscanYYset_out (FILE * out_str )
+{
+ vhdlscanYYout = out_str ;
+}
+
+int vhdlscanYYget_debug (void)
+{
+ return vhdlscanYY_flex_debug;
+}
+
+void vhdlscanYYset_debug (int bdebug )
+{
+ vhdlscanYY_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from vhdlscanYYlex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = 0;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = (char *) 0;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+ (yy_state_buf) = 0;
+ (yy_state_ptr) = 0;
+ (yy_full_match) = 0;
+ (yy_lp) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ vhdlscanYYin = stdin;
+ vhdlscanYYout = stdout;
+#else
+ vhdlscanYYin = (FILE *) 0;
+ vhdlscanYYout = (FILE *) 0;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * vhdlscanYYlex_init()
+ */
+ return 0;
+}
+
+/* vhdlscanYYlex_destroy is for both reentrant and non-reentrant scanners. */
+int vhdlscanYYlex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ vhdlscanYY_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ vhdlscanYYpop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ vhdlscanYYfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ vhdlscanYYfree ( (yy_state_buf) );
+ (yy_state_buf) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * vhdlscanYYlex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *vhdlscanYYalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *vhdlscanYYrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void vhdlscanYYfree (void * ptr )
+{
+ free( (char *) ptr ); /* see vhdlscanYYrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 1670 "vhdlscanner.l"
+
+
+
+static void initEntry(Entry *e)
+{
+ e->fileName = yyFileName;
+ initGroupInfo(e);
+}
+
+static void newEntry()
+{
+ // Add only enties/architectures/packages to root
+ // and signals to classes where they were found
+ // ENTITY dlatch_93 IS -- VHDL'93-Syntax !!!
+ // PORT (d, clk : IN bit;
+ // q, qbar : OUT bit);
+ // GROUP path IS (SIGNAL, SIGNAL);
+ // GROUP d_to_q : path (d, q);
+ // ATTRIBUTE propagation : time;
+ // END dlatch_93;
+
+ if (current->spec==VhdlDocGen::ENTITY ||
+ current->spec==VhdlDocGen::PACKAGE ||
+ current->spec==VhdlDocGen::ARCHITECTURE ||
+ current->spec==VhdlDocGen::PACKAGE_BODY)
+ {
+ current_root->addSubEntry(current);
+ }
+ else
+ {
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(current);
+ }
+ else
+ {
+ if (lastEntity)
+ {
+ lastEntity->addSubEntry(current);
+ }
+ else
+ {
+ current_root->addSubEntry(current); // should not happen!
+ }
+ }
+ }
+ previous = current;
+ current = new Entry ;
+ initEntry(current);
+}
+
+static void handleCommentBlock(const QCString &doc,bool brief)
+{
+ int position=0;
+ bool needsEntry=FALSE;
+ Protection protection=Public;
+ int lineNr = iDocLine;
+ if (brief)
+ current->briefLine = iDocLine;
+ else
+ current->docLine = iDocLine;
+
+ //printf("parseCommentBlock %p [%s]\n",current,doc.data());
+ while (parseCommentBlock(
+ g_thisParser,
+ current,
+ doc, // text
+ yyFileName, // file
+ lineNr, // line of block start
+ brief,
+ docBlockAutoBrief,
+ FALSE,
+ protection,
+ position,
+ needsEntry
+ )
+ )
+ {
+ //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position);
+ if (needsEntry) newEntry();
+ }
+ if (needsEntry)
+ {
+ newEntry();
+ }
+
+ if (docBlockTerm)
+ {
+ unput(docBlockTerm);
+ docBlockTerm=0;
+ }
+ iDocLine=-1;
+}
+
+#if 0
+/*!
+ * adds grouping to the entries
+ */
+static void mergeGrouping(const Entry* ce,int)
+{
+ EntryListIterator eli(*ce->children());
+ Entry *rt;
+ for (;(rt=eli.current());++eli)
+ {
+ if (rt->section==Entry::GROUPDOC_SEC)
+ {
+ if (openGroups)
+ {
+ QCString tt=(QCString)qrl.last();
+ if (!tt.isEmpty())
+ {
+ rt->groups->append(new Grouping(tt.data(),Grouping::GROUPING_LOWEST));
+ }
+ }
+ qrl.append(rt->name);
+ }
+
+ if ((strcmp(rt->name.data(),"endgroup")==0) && !qrl.isEmpty())
+ {
+ qrl.remove((QCString)qrl.last());
+ openGroups--;
+ }
+
+ if ((strcmp(rt->name.data(),"startgroup")==0))
+ {
+ openGroups++;
+ }
+
+ if (rt->section!=Entry::GROUPDOC_SEC && openGroups && !qrl.isEmpty())
+ {
+ rt->groups->append(new Grouping(qrl.last().data(),Grouping::GROUPING_LOWEST));
+ }
+
+ mergeGrouping(rt,openGroups);
+ }
+}
+#endif
+
+/*
+ * adds the library|use statements to the next class (entity|package|architecture|package body
+ * library ieee
+ * entity xxx
+ * .....
+ * library
+ * package
+ * enity zzz
+ * .....
+ * and so on..
+ */
+
+static void mapLibPackage(const Entry* ce)
+{
+ Entry *lastComp=0;
+ while (TRUE)
+ {
+ bool found = FALSE;
+ Entry *rt=0;
+ //const QList<Entry> *epp=ce->children();
+ EntryListIterator eli(*ce->children());
+ EntryListIterator eli1=eli;
+ for (;(rt=eli.current()),eli1=eli;++eli)
+ {
+ if (rt->spec==VhdlDocGen::LIBRARY || rt->spec==VhdlDocGen::USE)
+ // top level library or use statement
+ {
+ Entry *temp=0;
+ for (;(temp=eli1.current());++eli1) // find next entity
+ {
+ if (temp->spec==VhdlDocGen::ENTITY || temp->spec==VhdlDocGen::PACKAGE || temp->spec==VhdlDocGen::ARCHITECTURE || temp->spec==VhdlDocGen::PACKAGE_BODY)
+ {
+ Entry *ee=new Entry(*rt); //append a copy to entries sublist
+ temp->addSubEntry(ee);
+ found=TRUE;
+ rt->spec=-1; //nullify entry
+ rt->section=0;
+ lastComp=temp;
+ break;
+ }
+ }//for
+ if (lastComp && rt->spec!=-1)
+ {
+ Entry *ee=new Entry(*rt); //append a copy to entries sublist
+ lastComp->addSubEntry(ee);
+ found=TRUE;
+ rt->spec=-1; //nullify entry
+ rt->section=0;
+ }
+ }//if
+ }//for
+ if (!found) // nothing left to do
+ {
+ return;
+ }
+ }//while
+}//MapLib
+
+#if 0
+/*!
+ * merges a brief descriptions to the next entry
+ */
+void mergeBrief(const Entry* ce)
+{
+ EntryListIterator eli(*ce->children());
+ Entry *rt;
+ for (;(rt=eli.current());++eli)
+ {
+
+ if (found && (!eMerge.brief.isEmpty() || !eMerge.doc.isEmpty()))
+ {
+ rt->doc+=eMerge.doc.data();
+ rt->docLine=eMerge.docLine;
+ rt->brief+=eMerge.brief.data();
+ rt->briefLine=eMerge.briefLine;
+ found=FALSE;
+ }
+
+ if ((strcmp(rt->name.data(),"string")==0))
+ {
+ eMerge.reset();
+ eMerge.doc+=rt->doc.data();
+ eMerge.docLine=rt->docLine;
+ eMerge.brief+=rt->brief.data();
+ eMerge.briefLine=rt->briefLine;
+
+ found=TRUE;
+ }
+ MergeBrief(rt);
+ }
+}
+#endif
+
+
+
+void vhdlscanFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ vhdlscanYYlex_destroy();
+ }
+
+ if (g_buf)
+ {
+ free(g_buf);
+ }
+
+ g_buf=0;
+#endif
+
+}
+
+void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+{
+ inputFile.setName(fileName);
+ //uint jfile=inputFile.size();
+ ::parserInit();
+ yyFileName=QCString(fileName);
+ groupEnterFile(fileName,yyLineNr);
+ g_thisParser = this;
+ g_inputFromFile = FALSE;
+ inputPosition = 0;
+ assert(root!=0);
+
+ inputString=fileBuf;
+ inputLen=strlen(fileBuf);
+ current_root = root;
+ global_root = root;
+ current=new Entry;
+ initEntry(current);
+ //current_root->name=QCString("XXX"); // dummy name for root
+ if (!inputFile.open(IO_ReadOnly))
+ {
+ err("\n\n could not open file: %s !!\n\n",yyFileName.data());
+ return ;
+ }
+
+ if (g_lexInit)
+ {
+ vhdlscanYYrestart(vhdlscanYYin);
+ unput(' ');
+ BEGIN(Start);
+ }
+ vhdlscanYYlex();
+ g_lexInit=TRUE;
+
+ free(g_buf);
+ g_buf=0;
+
+ delete current;
+ current=0;
+
+ groupLeaveFile(yyFileName,yyLineNr);
+ inputFile.close();
+
+ //mergeBrief(current_root);
+ //mergeGrouping(current_root,0);
+ mapLibPackage(current_root);
+}
+
+
+void VHDLLanguageScanner::parsePrototype(const char *text)
+{
+ // will be called when a \fn command is found in a comment block
+
+ QCString ss,ret;
+ bool sem=FALSE;
+ bool func=FALSE;
+ QList<Argument> qs;
+ qs.setAutoDelete(TRUE);
+ VhdlDocGen::parseFuncProto(text,qs,ss,ret,TRUE);
+ int count=qs.count();
+ if (stricmp(ret.data(),"function")==0)
+ {
+ func=TRUE;
+ }
+ if (count<1 && !func)
+ {
+ return;
+ }
+ Entry *pp = new Entry;
+ initEntry(pp);
+ pp->name=ss.stripWhiteSpace();
+ pp->args+='(';
+ for (int j=0;j<count;j++)
+ {
+ if (sem)
+ {
+ pp->args+=',';
+ }
+
+ Argument *ars=(Argument*)(qs.at(j));
+ Argument *arg=new Argument;
+ arg->attrib = ars->attrib;
+ arg->name = ars->name;
+ arg->type = ars->type;
+ pp->args+=ars->name.data();
+ pp->args+=" ";
+ pp->args+=ars->type.data();
+ pp->argList->append(arg);
+ sem=TRUE;
+ }
+ pp->args+=')';
+
+ if (!ret.isEmpty())
+ pp->spec=VhdlDocGen::FUNCTION;
+ else
+ pp->spec=VhdlDocGen::PROCEDURE;
+
+ if (pp->section == Entry::MEMBERDOC_SEC && pp->args.isEmpty())
+ pp->section = Entry::VARIABLEDOC_SEC;
+
+ pp->type=ret;
+ current_root->addSubEntry(pp);
+}
+
+void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName,
+ FileDef *fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ MemberDef *memberDef,
+ bool showLineNumbers
+ )
+{
+ ::parseVhdlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
+ fileDef,startLine,endLine,inlineFragment,memberDef,
+ showLineNumbers);
+}
+
+
diff --git a/src/vhdlscanner.h b/src/vhdlscanner.h
new file mode 100644
index 0000000..8ddf9d6
--- /dev/null
+++ b/src/vhdlscanner.h
@@ -0,0 +1,75 @@
+/******************************************************************************
+ *
+ * $Id: vhdlscanner.h,v 1.9 2001/03/19 19:27:39 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef VHDLSCANNER_H
+#define VHDLSCANNER_H
+
+#include "parserintf.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include <qarray.h>
+#include <unistd.h>
+#include <qfile.h>
+#include <qdict.h>
+
+#include "entry.h"
+#include "memberlist.h"
+
+class Entry;
+class ClassSDict;
+class FileStorage;
+class ClassDef;
+class MemberDef;
+class QStringList;
+
+
+/** \brief VHDL parser using state-based lexical scanning.
+ *
+ * This is the VHDL language parser for doxygen.
+ */
+class VHDLLanguageScanner : public ParserInterface
+{
+ public:
+ virtual ~VHDLLanguageScanner() {}
+ void parseInput(const char * fileName,
+ const char *fileBuf,
+ Entry *root);
+ bool needsPreprocessing(const QCString &extension);
+ void parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName=0,
+ FileDef *fileDef=0,
+ int startLine=-1,
+ int endLine=-1,
+ bool inlineFragment=FALSE,
+ MemberDef *memberDef=0,
+ bool showLineNumbers=TRUE
+ );
+ void resetCodeParserState();
+ void parsePrototype(const char *text);
+};
+
+void vhdlscanFreeScanner();
+
+//---------------------------------------------------------------------------------
+
+#endif
diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l
new file mode 100644
index 0000000..2d3288b
--- /dev/null
+++ b/src/vhdlscanner.l
@@ -0,0 +1,2041 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/******************************************************************************
+ * Parser for VHDL subset
+ * written by M. Kreis
+ * supports VHDL-87/93
+ * does not support VHDL-AMS
+ ******************************************************************************/
+%{
+
+// global includes
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <qcstring.h>
+#include <qfileinfo.h>
+#include <qstringlist.h>
+
+/* --------------------------------------------------------------- */
+
+// local includes
+#include "vhdlscanner.h"
+#include "vhdlcode.h"
+#include "vhdldocgen.h"
+#include "message.h"
+#include "config.h"
+#include "doxygen.h"
+#include "util.h"
+#include "language.h"
+#include "commentscan.h"
+#include "index.h"
+#include "definition.h"
+#include "searchindex.h"
+#include "outputlist.h"
+
+/* --------------------------------------------------------------- */
+
+//#define theTranslator_vhdlType theTranslator->trVhdlType
+#define theTranslator_vhdlType VhdlDocGen::getVhdlType
+
+static QStringList qrl;
+static int openGroups;
+static ParserInterface *g_thisParser;
+static const char * inputString;
+static int inputPosition;
+static int inputLen;
+static int startComment = 0;
+static QFile inputFile;
+static QCString inbuf;
+static Entry* global_root = 0;
+static Entry* current_root = 0;
+static Entry* current = 0;
+static Entry* previous = 0;
+static Entry* functionEntry = 0;
+static Entry* lastEntity = 0;
+static Entry* lastCompound = 0;
+static int genPort = 0;
+static QCString yyFileName;
+static int iFuncLine = 1;
+static bool g_inputFromFile ;
+static bool g_lexInit = FALSE;
+static int isBody=0;
+static int isFunc=0;
+static int yyLineNr = 1;
+static char * g_buf = 0;
+static uint g_bufSize = 0;
+static int iTextCounter = 0;
+static int iCounter = 0;
+static int bropen = 0;
+static int scantype = 0;
+static int g_lastCommentContext = 0;
+static bool docBlockAutoBrief;
+static char docBlockTerm;
+static int iDocLine = -1;
+static Entry gBlock;
+static int num_chars;
+
+//#define YY_A_INTERACTIVE 1
+#define YY_NEVER_INTERACTIVE 1
+//-----------------------------------------------------------------------------
+#define YY_USER_ACTION num_chars += yyleng;
+static void parserInit();
+static void deleteSpecChars(char* str,char *buf);
+static void handleCommentBlock(const QCString &doc,bool brief);
+static void newEntry();
+static void initEntry(Entry *e);
+
+static int iCodeLen;
+
+static void makeInline()
+{
+ int diff=num_chars-iCodeLen;
+ assert(inputLen>iCodeLen+diff);
+ QCString par(&inputString[iCodeLen],diff);
+ int index=par.findRev("\\endcode");
+ int tt=par.length()-par.find("\n",index);
+ QCString qc(&inputString[iCodeLen-tt],diff);
+ index=qc.findRev("--!");
+ if (index<=0) return;
+ par=qc.left(index);
+ /*
+ fprintf(stderr,"\n-------------------------------------------------------------------------------- ");
+ fprintf(stderr,"\n bytes since %d %d \n %s",num_chars,iCodeLen,par.data());
+ fprintf(stderr,"\n-------------------------------------------------------------------------------- ");
+ */
+ gBlock.doc=par;
+ gBlock.section=Entry::VARIABLE_SEC;
+ gBlock.spec=VhdlDocGen::MISCELLANEOUS;
+ gBlock.fileName = yyFileName;
+ gBlock.endBodyLine=yyLineNr-1;
+ Entry *temp=new Entry(gBlock);
+ if (lastCompound)
+ lastCompound->addSubEntry(temp);
+ else if (lastEntity)
+ lastEntity->addSubEntry(temp);
+ else
+ {
+ temp->type="misc"; // global code
+ current_root->addSubEntry(temp);
+ }
+
+ gBlock.reset();
+
+}// makeInline
+
+static void addSubEntry(Entry* root, Entry* e)
+{
+ if (e==0 || root==0) return;
+ //if (isPrevDoc)
+ //{
+ // e->brief=prevDocEntry.brief;
+ // e->briefLine=prevDocEntry.briefLine;
+ // prevDocEntry.reset();
+ // isPrevDoc=FALSE;
+ //}
+ root->addSubEntry(e);
+}
+
+static void bufferClear()
+{
+ int j;
+ for (j=0;j<iCounter+1;j++)
+ {
+ g_buf[j]=0;
+ }
+
+ iCounter=0;
+}
+
+static void addText (char *word, int llen)
+{
+ if ((uint)(iCounter + llen) > g_bufSize)
+ {
+ char *pTmp = (char*)realloc(g_buf,iCounter+llen+2048);
+ if (pTmp)
+ {
+ g_buf = pTmp;
+ }
+ else
+ {
+ fprintf(stderr,"\n not enough memory for realloc\n");
+ return;
+ }
+ }
+ while (llen>0)
+ {
+ g_buf[iCounter]=*word++;
+ iCounter++;
+ llen--;
+ }
+ g_buf[iCounter]='\0';
+}
+
+static void getBufText(QCString& qc,int start)
+{
+ while (start < iCounter)
+ {
+ qc+=(g_buf[start]);
+ start++;
+ }
+}
+
+static void lineCount()
+{
+ for ( const char* c = yytext ; *c ; ++c )
+ {
+ yyLineNr += (*c == '\n') ;
+ }
+}
+
+static void deleteSpecChars(char* str,char *buf)
+{
+ while (*str)
+ {
+ if ((*str == '\t') || (*str == '\n') || (*str == '\r') || (*str == ' '))
+ {
+ *str++;
+ }
+ else
+ {
+ *buf++ = *str++;
+ }
+ }
+ *buf='\0';
+}
+
+static void getType(Entry* p,char* text)
+{
+ QCString name(text);
+ name=name.stripWhiteSpace();
+ if (stricmp(name.data(),"signal" )==0)
+ {
+ p->spec=VhdlDocGen::SIGNAL;
+ }
+ else if (stricmp(name.data(),"type" )==0)
+ {
+ p->spec=VhdlDocGen::TYPE;
+ }
+ else if (stricmp(name.data(),"subtype" )==0)
+ {
+ p->spec=VhdlDocGen::SUBTYPE;
+ }
+ else if (stricmp(name.data(),"constant" )==0)
+ {
+ p->spec=VhdlDocGen::CONSTANT;
+ }
+ else if (stricmp(name.data(),"attribute" )==0)
+ {
+ p->spec=VhdlDocGen::ATTRIBUTE;
+ }
+ else if (stricmp(name.data(),"function" )==0)
+ {
+ p->spec=VhdlDocGen::FUNCTION;
+ }
+ else if (stricmp(name.data(),"procedure" )==0)
+ {
+ p->spec=VhdlDocGen::PROCEDURE;
+ }
+ else if (stricmp(name.data(),"units" )==0)
+ {
+ p->spec=VhdlDocGen::UNITS;
+ }
+ else if (name.contains("shared",false) && name.contains("variable",false))
+ {
+ p->spec=VhdlDocGen::SHAREDVARIABLE;
+ }
+ else if (stricmp(name.data(),"file" )==0)
+ {
+ p->spec=VhdlDocGen::VFILE;
+ }
+ else if (stricmp(name.data(),"group" )==0)
+ {
+ p->spec=VhdlDocGen::GROUP;
+ }
+ else if (stricmp(name.data(),"alias" )==0)
+ {
+ p->spec=VhdlDocGen::ALIAS;
+ }
+ else
+ {
+ err("wrong type");
+ }
+ p->section=Entry::VARIABLE_SEC;
+}
+
+//-------------------------------------------------------------------------
+
+/*
+ * adds signals found in entities|records|units
+ */
+
+static void addSignals(const char* str,int line, Entry *e,const char *comment=0)
+{
+ //printf("===> addSignals (%s) comment='%s'\n",str,comment);
+ QList<QCString> ql;
+ QCString bufio;
+ ql.setAutoDelete(TRUE);
+
+ VhdlDocGen::getSigName(ql,str,bufio);
+ int count = ql.count();
+
+ QCString brief = current->brief;
+ QCString doc = current->doc;
+ Entry *tmpEntry = current;
+ current = new Entry;
+ initEntry(current);
+ handleCommentBlock(comment,TRUE);
+ if (!current->brief.isEmpty())
+ {
+ if (doc.isEmpty())
+ {
+ doc = brief;
+ }
+ else if (!brief.isEmpty())
+ {
+ doc = brief + "<p>" + doc;
+ }
+ brief = current->brief;
+ }
+ delete current;
+ current = tmpEntry;
+ current->brief.resize(0);
+ current->doc.resize(0);
+
+ if (genPort!=3) // not a unit
+ {
+ for (int k=1;k<count;k++)
+ {
+ //printf("adding '%s' '%s'\n",ql.at(0)->data(),ql.at(k)->data());
+ Entry *pTemp=new Entry;
+ initEntry(pTemp);
+ pTemp->startLine = line;
+ pTemp->bodyLine = line;
+ pTemp->name = ql.at(k)->data();
+ pTemp->section = Entry::VARIABLE_SEC;
+ pTemp->brief = brief;
+ pTemp->doc = doc;
+ pTemp->mGrpId = current->mGrpId; // copy member group id
+ QCString stSpec = ql.at(0)->data();
+ if (genPort==1) // found port
+ {
+ pTemp->spec = VhdlDocGen::PORT;
+ stSpec.stripPrefix(bufio.data());
+ stSpec=stSpec.stripWhiteSpace();
+ pTemp->args = stSpec;
+ pTemp->type = bufio;
+ addSubEntry(e,pTemp);
+ }
+ else if (genPort==2) // found record
+ {
+ pTemp->spec = VhdlDocGen::RECORD;
+ pTemp->type = stSpec;
+ pTemp->name.prepend(VhdlDocGen::getRecordNumber());
+ delete current;
+ current = new Entry(*pTemp); // make a deep copy of pTemp
+ newEntry(); // add it to lastCompound and make a new current
+ delete pTemp;
+ }
+ else
+ {
+ pTemp->spec = VhdlDocGen::GENERIC;
+ pTemp->type = stSpec;
+ addSubEntry(e,pTemp);
+ }
+ }// for
+ }
+ else // found a unit
+ {
+ Entry *pTemp=new Entry;
+ initEntry(pTemp);
+ QCString tt(str);
+ QStringList ql=QStringList::split("=",tt,FALSE);
+ pTemp->spec = VhdlDocGen::UNITS;
+ pTemp->section = Entry::VARIABLE_SEC;
+ pTemp->startLine = line;
+ pTemp->bodyLine = line;
+ pTemp->brief = brief; // adds brief description to the unit member
+ pTemp->doc = doc; // adds doc to the unit member
+ pTemp->type = ql[1];
+ pTemp->name = ql[0].stripWhiteSpace();
+ pTemp->name.prepend(VhdlDocGen::getRecordNumber());
+ delete current;
+ current = new Entry(*pTemp); // make a deep copy
+ newEntry(); // add it to lastCompound
+ delete pTemp;
+ }
+}
+
+/*
+ * this function parses a process prototype
+ * and adds the signal to the process
+ */
+
+static void parseProcessProto()
+{
+ QStringList ql;
+ QCString qcs;
+ bool sem=FALSE;
+ //Entry* ppEntry=new Entry;
+ //ppEntry->fileName=yyFileName;
+ //processEntry=ppEntry;
+ QCString name;
+ scantype=0;
+ getBufText(qcs,0);
+ if (qcs.contains('(') != qcs.contains(')')) return;
+ VhdlDocGen::deleteAllChars(qcs,'\n');
+ VhdlDocGen::parseProcessProto(qcs,name,ql);
+ current->section=Entry::FUNCTION_SEC;
+ //current->stat=TRUE;
+ current->spec=VhdlDocGen::PROCESS;
+ current->startLine=iFuncLine;
+ current->bodyLine=iFuncLine;
+ current->fileName=yyFileName;
+ if (!name.isEmpty())
+ {
+ current->name=name.stripWhiteSpace();
+ }
+ else // found an anonymous process, so we add a generated name
+ {
+ current->name=VhdlDocGen::getProcessNumber();
+ }
+
+ current->args+=" ( ";
+ if (!ql.isEmpty())
+ {
+ QValueList<QString>::Iterator iter = ql.begin();
+ for ( ; iter != ql.end(); ++iter)
+ {
+ if (sem)
+ {
+ current->args+=',';
+ }
+ Argument *arg=new Argument;
+ arg->name=((QCString)*iter).stripWhiteSpace();
+ current->argList->append(arg);
+ current->args+=(QCString)*iter;
+ sem = TRUE;
+ }
+ }
+ current->args+=" ) ";
+ bufferClear();
+}//parseProcessProto
+
+
+/*
+ * parses a function|procedure protoype
+ */
+
+static void parseFunctionProto()
+{
+ QCString name,ret,qcs,temp;
+ bool sem=FALSE;
+ QList<Argument> ql;
+ ql.setAutoDelete(TRUE);
+ getBufText(qcs,0);
+ if (qcs.contains('(') != qcs.contains(')'))
+ return; // function without a prototype
+ if (qcs.contains("function",FALSE)==0 && qcs.contains("procedure",FALSE)==0)
+ return;
+ qcs=qcs.stripWhiteSpace();
+ temp=qcs.lower();
+ if (temp.stripPrefix("impure"))
+ {
+ current->exception="impure";
+ qcs=qcs.remove(0,6);
+ }
+ else if (temp.stripPrefix("pure"))
+ {
+ current->exception="pure";
+ qcs=qcs.remove(0,4);
+ }
+
+ VhdlDocGen::parseFuncProto(qcs.data(),ql,name,ret);
+ //printf("parseFuncProto(%s)=%s,%s\n",qcs.data(),name.data(),ret.data());
+ VhdlDocGen::deleteAllChars(name,';');
+ current->name=name;
+ current->startLine=iFuncLine;
+ current->bodyLine=iFuncLine;
+
+ int count = ql.count();
+
+ current->args+" ( ";
+ for (int k=0;k<count;k++)
+ {
+ if (sem)
+ {
+ current->args+=",";
+ }
+ Argument *arg=new Argument;
+ Argument *hh=(Argument*)ql.at(k);
+ arg->name=hh->name;
+ arg->type=hh->type;
+ arg->defval=hh->defval;
+ arg->attrib=hh->attrib;
+ current->argList->append(arg);
+ current->args+=hh->name;
+ sem=TRUE;
+ }
+ current->args+" )";
+
+ if (!ret.isEmpty())
+ current->spec=VhdlDocGen::FUNCTION;
+ else
+ current->spec=VhdlDocGen::PROCEDURE;
+
+ current->section=Entry::FUNCTION_SEC;
+ current->type=ret;
+ //addSubEntry(ee,ppEntry);
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ bufferClear();
+}//parseFunctionProto
+
+static Entry* getEntryAtLine(const Entry* ce,int line)
+{
+ EntryListIterator eli(*ce->children());
+ Entry *found=0;
+ Entry *rt;
+ for (;(rt=eli.current());++eli)
+ {
+ if (rt->bodyLine==line)
+ {
+ found=rt;
+ } // if
+ if (!found)
+ {
+ found=getEntryAtLine(rt,line);
+ }
+ }
+ return found;
+}// getEntryAtLine
+
+//-------------------------------------------------------------------------
+
+static void parserInit()
+{
+ iCounter=0;
+ iTextCounter=0;
+ yyLineNr=1;
+ current=0;
+ previous=0;
+ isFunc=0;
+ isBody=0;
+ scantype=0;
+ lastCompound=0;
+ lastEntity=0;
+ bropen=0;
+ openGroups=0;
+ iDocLine=-1;
+ qrl.clear();
+ num_chars=0;
+
+ if (!g_lexInit)
+ {
+ VhdlDocGen::init();
+ }
+
+ g_bufSize=inputFile.size()+1024;
+ if (g_buf==0) free(g_buf);
+ g_buf=(char*)(calloc(g_bufSize,sizeof(char)));
+
+ if (g_buf==0)
+ {
+ fprintf(stderr,"\n not enough memory");
+ return;
+ }
+ g_buf[g_bufSize-1]='\0';
+}
+
+bool VHDLLanguageScanner::needsPreprocessing(const QCString &)
+{
+ return FALSE;
+}
+
+
+void VHDLLanguageScanner::resetCodeParserState()
+{
+
+}
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+
+static int yyread(char *buf,int max_size)
+{
+ int c=0;
+ if (g_inputFromFile)
+ {
+ c = inputFile.readBlock(buf,max_size);
+ if (c==-1) yy_fatal_error("input in flex scanner failed");
+ }
+ else
+ {
+ while ( c < max_size && inputString[inputPosition] )
+ {
+ *buf = inputString[inputPosition++] ;
+ c++;
+ buf++;
+ }
+ }
+ return c;
+}
+
+
+
+%}
+
+
+ /* start command character */
+ /* -------------- VHDL SECTION -----------------------------------*/
+
+B [ \t]
+CR [\r\n]
+BR [ \t\n\r]
+DIGIT [0-9]
+LOWER_CASE_LETTER [a-z]
+UPPER_CASE_LETTER [A-Z]
+LETTER [a-zA-Z_0-9]
+SPACE_CHARACTER [ \t]
+SPECIAL_CHARACTER [#&'()*+,\-\./:;<=>_|]
+OTHER_SPECIAL_CHARACTER [~!$§%?@\[\\\]^{}]
+BASIC_GRAPHIC_CHARACTER {UPPER_CASE_LETTER}|{DIGIT}|{SPECIAL_CHARACTER}|{SPACE_CHARACTER}
+GRAPHIC_CHARACTER {BASIC_GRAPHIC_CHARACTER}|{LOWER_CASE_LETTER}|{OTHER_SPECIAL_CHARACTER}
+EXTENDED_CHARACTER [\\]{GRAPHIC_CHARACTER}*[\\]
+
+NAME ({LETTER}[a-zA-Z0-9_.]*)|{EXTENDED_CHARACTER}
+STRING_LITERAL \"{GRAPHIC_CHARACTER}*\"
+FUNCNAME ([a-zA-Z"][*+\-_a-zA-Z0-9"\/=<>]*)|{EXTENDED_CHARACTER}
+DIGITS [0-9]+|[0-9]+"."[0-9]+|[0-9]+"#"[0-9_a-fA-F\+\.]+"#"
+COMMENT "--"[^\n]*
+LABELID [a-z_A-Z][^\;]*";"({B}*{COMMENT})*
+PROTO [ (]*
+TEXTT "--"[^\/\@\*\#][^\n]*
+PROC ("function"|"procedure")
+ENDE ({BR}*("end"){BR}*{PROC}*{BR}*[;]{1})
+ENDEFF ("if"|"case"|"loop"|"generate"){BR}*[;]
+ENDE3 ({BR}*("end"){BR}*{PROC}*{BR}*{FUNCNAME}{BR}*[;])|{ENDE}
+ENDFUNC {B}*"end"{BR}*{PROC}*{BR}*{FUNCNAME}{BR}*[;]
+FUNCIMPURE "impure"|"pure"
+FUNCPROC ^{B}*{FUNCIMPURE}*{BR}*("function"|"procedure"){B}*
+ARCHITECTURE ("architecture"){BR}+{NAME}{BR}*("of")
+ /* Removed due to bug 538239
+ POST "postponed"
+ PROCESS ({BR}*{FUNCNAME}{B}*[:]{BR}*({POST}{BR}+)?("process"){BR}*{PROTO})|("process"){BR}*("("){BR}*{PROTO}|[^a-zA-Z]("process"){CR}|[^a-zA-Z]("process"){BR}+("is")
+ */
+PROCESS ({B}*{FUNCNAME}{B}*:{BR}*)?({B}*("postponed"){BR}+)?{B}*("process"){BR}*{PROTO}
+
+ENDPROCESS ("end"){BR}*("postponed")*("process"){BR}*{FUNCNAME}*{BR}*[;]
+LIBUSE ^{B}*("use"|"library"){BR}+
+ENTITY ^{B}*("component"|"entity"|"package"){BR}+
+PBODY ("package"){B}+("body"){BR}+{NAME}
+SHARED ("shared"){BR}+("variable")
+SIGTYPES ^{B}*({SHARED}|"alias"|"file"|"group"|"subtype"|"type"|"constant"|"attribute"|"signal"|"units"){BR}+
+CONFIG ("configuration"){BR}+{NAME}{BR}*("of"){BR}+{NAME}{BR}+"is"
+
+ALLTYPESMAP {B}*[_a-zA-ZA_Z0-9.() ]*{B}*
+MAPCOMPONENT ({ALLTYPESMAP}{BR}*[:]{BR}*("component"|"configuration")*{ALLTYPESMAP}{BR}*{TEXTT}*{BR}*("port"|"generic"){BR}*("map"){BR}*("("){1})
+MAPCOMPONENT1 ({ALLTYPESMAP}{BR}*[:]{BR}*("entity"){BR}*{ALLTYPESMAP}{BR}*("port"|"generic"){BR}*("map"){BR}*("("){1})
+
+BRACEOPEN [(]{1}
+BRACECLOSE [)]{1}
+
+ALLID [^;()\t ]
+
+/* VHDL 2001 */
+ENDPROTECTED ("end"{BR}+"protected"{BR}+{NAME}{BR}*";")|("end"{BR}+"protected"{BR}*";")
+ENDPROTECEDBODY "end"{BR}+"protected"{BR}+"body"{BR}+{NAME}
+
+
+%option noyywrap
+
+ /* language parsing states */
+
+%x Start
+%x Comment
+%x FindTypeName
+%x ParseType
+%x ParseRecord
+%x ParseUnits
+%x ParseProcess
+%x ParseFunc
+%x FindName
+%x FindEntityName
+%x FindGenPort
+%x FindTypes
+%x FindSigName
+%x FindFuncName
+%x FindBegin
+
+%%
+
+<Start>{ENDPROTECTED}|{ENDPROTECEDBODY} {
+ lineCount();
+}
+
+
+
+<Start>{CONFIG} { // found configuration
+
+ QCString qcs(vhdlscanYYtext);
+ current->name=VhdlDocGen::getIndexWord(qcs,1);
+ current->type=VhdlDocGen::getIndexWord(qcs,3);
+ current->startLine=yyLineNr;
+ current->bodyLine=yyLineNr;
+ current->section=Entry::VARIABLE_SEC;
+ current->spec=VhdlDocGen::CONFIG;
+ current->args="configuration";
+ newEntry();
+ BEGIN(Start);
+}
+
+<Start>{SIGTYPES} { // found type constant|type|attribute and so on..
+ bropen=0;
+ lineCount();
+
+ bufferClear();
+ //pEntry=current;
+ getType(current,yytext);
+ current->bodyLine=yyLineNr;
+ if (current->spec==VhdlDocGen::UNITS)
+ {
+ //addSubEntry(current,pEntry);
+ current->startLine=yyLineNr;
+ current->bodyLine=yyLineNr;
+ newEntry(); // adds the unit to the lastCompound
+ genPort=3;
+ BEGIN(ParseRecord);
+ }
+ else
+ {
+ BEGIN(FindTypeName);
+ }
+ }
+
+<Start>{ARCHITECTURE} { //found architecure
+ lineCount();
+ bropen=0;
+ bufferClear();
+ isBody=0;
+ lastCompound = current;
+ QCString curName=VhdlDocGen::getIndexWord(yytext,1);
+ current->section=Entry::CLASS_SEC; //Entry::CLASS_SEC;
+ current->spec=VhdlDocGen::ARCHITECTURE;
+ current->protection=Private;
+ current->name=curName;
+ current->fileName=yyFileName;
+ current->startLine=yyLineNr;
+ current->bodyLine=yyLineNr;
+ //printf("-> Architecture at line %d\n",yyLineNr);
+ BEGIN(FindName);
+}
+
+
+<Start>{PROCESS} { //found process
+ lineCount();
+ iFuncLine=yyLineNr;
+ bropen=0;
+ //printf("--> Process: line=%d\n",yyLineNr);
+ bufferClear();
+ addText(yytext,yyleng);
+ QCString qcs(yytext);
+ if (qcs.contains('('))
+ {
+ bropen=1;
+ scantype=2;
+ BEGIN(ParseType);
+ }
+ else
+ {
+ // iFuncLine--;
+ parseProcessProto();
+ BEGIN(ParseProcess);
+ }
+}
+
+<Start>{LIBUSE}{BR}* { // found library or package
+ bropen=0;
+ bufferClear();
+ isBody=0;
+ QCString qcs=QCString(yytext);
+ // lowerString(qcs);
+ qcs=qcs.stripWhiteSpace();
+ if (stricmp(qcs.data(),"use")==0)
+ {
+ current->spec=VhdlDocGen::USE;
+ current->type="package";
+ }
+ else
+ {
+ current->spec=VhdlDocGen::LIBRARY;
+ current->type="library";
+ }
+ current->section=Entry::VARIABLE_SEC;
+ current->bodyLine=yyLineNr;
+ lineCount();
+ BEGIN(FindName);
+}
+
+<Start>{FUNCPROC} { // found a new function|procedure
+ lineCount();
+ iFuncLine=yyLineNr;
+ bropen=0;
+ bufferClear();
+ isFunc=1;
+ addText(yytext,yyleng);
+ BEGIN(FindFuncName);
+}
+
+<Start>{ENTITY} { // found entity|component|package
+ lineCount();
+ //printf("--> Entity at line %d\n",yyLineNr);
+
+ bropen=0;
+ bufferClear();
+ QCString word(yytext);
+ word=word.lower();
+ word=word.stripWhiteSpace();
+
+ if (strcmp(word.data(),"entity")==0)
+ {
+ isBody=0;
+ scantype=0;
+ lastCompound=0;
+ current->section=Entry::CLASS_SEC;
+ current->spec=VhdlDocGen::ENTITY;
+ current->protection=Public;
+ current->bodyLine=yyLineNr;
+ current->fileName=yyFileName;
+ lastEntity = current;
+ }
+ else if (strcmp(word.data(),"component")==0)
+ {
+ current->section=Entry::VARIABLE_SEC;
+ // current->stat=TRUE;
+ current->spec=VhdlDocGen::COMPONENT;
+ current->bodyLine=yyLineNr;
+ scantype=1;
+ }
+ else if (strcmp(word,"package")==0)
+ {
+ isBody=0;
+ scantype=0;
+ lastCompound = current;
+ current->section=Entry::CLASS_SEC;
+ current->spec=VhdlDocGen::PACKAGE;
+ current->protection=Package; //VhdlDocGen::PACKAGE;
+ current->bodyLine=yyLineNr;
+ current->fileName=yyFileName;
+ }
+ else
+ err("\n found wrong component at line [%d]",yyLineNr);
+
+ BEGIN(FindEntityName);
+}
+
+<Start>{MAPCOMPONENT}|{MAPCOMPONENT1} { // found component instantiation
+
+ // lineCount();
+ QCString type;
+ QCString tt(yytext);
+ QRegExp regg("[\\s:.()-]");
+ QStringList qsl=QStringList::split(regg,tt,false);
+
+ // consider upper/lower-case letters
+ QStringList qsltemp=QStringList::split(regg,tt.lower(),false);
+ int index=qsltemp.findIndex(QCString("entity"))+1;
+ index+=qsltemp.findIndex(QCString("component"))+1;
+ index+=qsltemp.findIndex(QCString("configuration"))+1;
+ int len=qsltemp.count();
+
+ current->spec=VhdlDocGen::COMPONENT_INST;
+ current->section=Entry::VARIABLE_SEC;
+ current->startLine=yyLineNr;
+ current->bodyLine=yyLineNr;
+
+ if (index!=0 && tt.contains(')')==0) // found component instantiation xxx: configuration/component/entity yyy
+ {
+ current->type=(QCString)qsl[len-3];
+ }
+ else if (index!=0 && tt.contains(')')) // found component instantiation xxx: entity www.yyy(zzz)
+ {
+ current->type=(QCString)qsl[len-4];
+ }
+ else
+ {
+ current->type=(QCString)qsl[1]; // found component instantiation xxx:yyy
+ }
+
+ current->name=QCString(qsl[0]);
+ if (lastCompound)
+ {
+ if (!VhdlDocGen::foundInsertedComponent(current->type,lastCompound))
+ {
+ BaseInfo *bb=new BaseInfo(current->type,Public,Normal);
+ lastCompound->extends->append(bb);
+ }
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ lineCount();
+
+}
+
+<Start>{CR}* {
+ lineCount();
+ addText(yytext,yyleng);
+ BEGIN(Start);
+}
+
+<ParseProcess>[^;()] {
+ // eat process body
+ lineCount();
+ BEGIN(ParseProcess);
+}
+
+<ParseProcess,ParseType>{ENDPROCESS} { // find end of process
+ lineCount();
+ current->endBodyLine=yyLineNr;
+ //printf("Process: start=%d end=%d\n",current->bodyLine,current->endBodyLine);
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ BEGIN(Start);
+}
+
+
+<ParseUnits>{BR}* {
+ lineCount();
+}
+
+<ParseUnits>{B}*[a-z_][^\n;]* { // parse record|unit body
+ lineCount();
+ QCString zz(yytext);
+ addSignals(zz.data(),yyLineNr,current);
+ BEGIN(ParseUnits);
+}
+
+<FindName>{NAME} { // found entity|architecture|component name
+ lineCount();
+
+ QCString qcs(yytext);
+ qcs=qcs.stripWhiteSpace();
+ if (current->spec==VhdlDocGen::USE || current->spec==VhdlDocGen::LIBRARY)
+ {
+ int j=qcs.length();
+ int i=qcs.find(".");
+ if (i>0)
+ qcs=qcs.right(j-i-1);
+ i=qcs.find(".");
+ if (i>0)
+ qcs=qcs.left(i);
+ /*
+ -- Consider the case we have more than one entity in one file.Each entity has its own package/library
+ -- declaration. In this case package yyy will be added [with newEntry()] to architecture aaa !! instead to entity
+ -- bbb. We must place these constructs to current_root and the function mapLibPackage() will finish the rest.
+
+ -- package xxx;
+ -- entity aaa
+ -- ....
+ -- end entity aaa;
+ -- architecture aaa
+ -- ...
+ -- end architecture aaa;
+ -- package yyy;
+ -- entity bbb;
+ */
+
+ current->name=qcs;
+ Entry *copy=new Entry(*current);
+ current->reset();
+ addSubEntry(current_root,copy); // insert into entry list with mapLibPackage()
+ }
+ else if (current->spec==VhdlDocGen::ARCHITECTURE)
+ {
+ //current->name+=qcs.lower();
+ current->name.prepend(qcs+"::");
+
+ //if (lastEntity)
+ //{
+ // inherit private inheritance relation between entity and architecture
+ //if (!VhdlDocGen::foundInsertedComponent(current->name,lastEntity))
+ //{
+ // BaseInfo *bb=new BaseInfo(current->name,Private,Normal);
+ // lastEntity->extends->append(bb);
+ //}
+ //}
+
+ }
+ else if (current->spec==VhdlDocGen::PACKAGE_BODY)
+ {
+ current->name+=qcs;
+ }
+ else
+ {
+ current->name+=qcs;
+ }
+ if (!(current->spec==VhdlDocGen::USE || current->spec==VhdlDocGen::LIBRARY))
+ newEntry();
+
+ BEGIN(Start);
+}
+
+<FindFuncName>{FUNCNAME} { // found name of a process|function|procedure
+ lineCount();
+
+ addText(yytext,yyleng);
+ BEGIN(ParseType);
+}
+
+<FindTypeName>{NAME}{BR}* {
+ lineCount();
+ current->name=QCString(yytext);
+ BEGIN(ParseType);
+}
+
+
+<ParseType>("is"){BR}+("protected"){BR}+("body") {lineCount(); BEGIN(Start); }
+
+<ParseType>("is"){BR}+("protected"){BR}+ {
+ lineCount();
+ current->section=Entry::VARIABLE_SEC;
+ current->spec=VhdlDocGen::TYPE;
+ current->type="protected";
+ newEntry();
+ BEGIN(Start);
+}
+
+
+
+
+<ParseType>("is"){BR}*("record") { // find record
+ lineCount();
+ if (isFunc)
+ {
+ BEGIN(Start);
+ }
+
+ genPort=2;
+ current->section=Entry::VARIABLE_SEC;
+ current->spec=VhdlDocGen::RECORD;
+ addText(yytext,yyleng);
+ newEntry(); // adds the record to the last compound
+ BEGIN(ParseRecord);
+}
+
+<ParseRecord>{BR}* {
+ lineCount();
+ }
+
+<ParseRecord>("end"){BR}*("record"){BR}*{LETTER}*{BR}*[;]|("end"){BR}*("units"){BR}*[;] {
+ lineCount();
+ genPort=0;
+ bufferClear();
+ BEGIN(Start);
+}
+
+<ParseRecord>[a-z_A-Z0-9][^\n;]*";"({B}*{COMMENT})* { // parse record body
+ lineCount();
+ QCString comment;
+ QCString zz(yytext);
+ VhdlDocGen::deleteAllChars(zz,';'); //delete ; in unit construct
+ if (zz.contains("--!"))
+ {
+ QStringList ql=QStringList::split("--!",zz,FALSE);
+ comment = ql[1];
+ zz = ql[0];
+ }
+ else if (zz.contains("--"))
+ {
+ QStringList ql=QStringList::split("--",zz,FALSE);
+ zz = ql[0];
+ }
+ initEntry(current);
+ addSignals(zz,yyLineNr,current,comment);
+ addText(yytext,yyleng);
+ BEGIN(ParseRecord);
+}
+
+<ParseType>{BR}+("is"){BR}+|{BR}+("is"){B}*"--" { // found a new function in an architecture ?
+ addText(yytext,yyleng);
+ lineCount();
+ QCString ttt;
+ bool bb=TRUE;
+ getBufText(ttt,0);
+ if (ttt.contains("--"))
+ {
+ unput('-');unput('-');
+ VhdlDocGen::deleteCharRev(ttt,'-');
+ VhdlDocGen::deleteCharRev(ttt,'-');
+ }
+ if (ttt.contains('(') != ttt.contains(')'))
+ {
+ bb=FALSE;
+ }
+ bool ss = VhdlDocGen::isFunctionProto(ttt);
+ //printf("VhdlDocGen::isFunctionProto(%s)=%d\n",ttt.data(),ss);
+ if (ss && bb)
+ {
+ bufferClear();
+ addText(ttt.data(),ttt.length());
+ functionEntry=0;
+ //eFuncBody=new Entry;
+ ::parseFunctionProto();
+ }
+ bufferClear();
+ BEGIN(ParseType);
+}
+
+
+<ParseType>[^;()\t ] {
+ lineCount();
+ addText(yytext,yyleng);
+ BEGIN(ParseType);
+}
+
+<ParseType>{BRACEOPEN} {
+ lineCount();
+ bropen++;
+ addText(yytext,yyleng);
+ BEGIN(ParseType);
+}
+
+<ParseType>{BRACECLOSE} {
+ lineCount();
+ bropen--;
+ addText(yytext,yyleng);
+ if (bropen==0 && scantype==2) // process
+ {
+ ::parseProcessProto();
+ BEGIN(ParseProcess);
+ } // if
+ else
+ {
+ BEGIN(ParseType);
+ }
+}
+
+
+<ParseType>{ENDE}|{ENDFUNC} { // found end of function|process
+ QRegExp regg("[\\s;]");
+ lineCount();
+ QCString tt(yytext);
+ tt=tt.lower();
+ QStringList ql=QStringList::split(regg,tt,FALSE);
+ int index=ql.findIndex(QCString("if"))+1;
+ index+=ql.findIndex(QCString("case"))+1;
+ index+=ql.findIndex(QCString("loop"))+1;
+ index+=ql.findIndex(QCString("generate"))+1;
+ bufferClear();
+ if (index==0)
+ {
+ if (isFunc)
+ {
+ Entry* pFunc=getEntryAtLine(current_root,iFuncLine);
+ if (pFunc && pFunc->section==Entry::FUNCTION_SEC)
+ {
+ pFunc->endBodyLine=yyLineNr;
+ }
+ isFunc=0;
+ BEGIN(Start);
+ }
+ }
+}
+
+<ParseFunc>[^;()] {
+ // eat process body
+ lineCount();
+ BEGIN(ParseFunc);
+ }
+
+<ParseFunc>{ENDE3} {
+ QRegExp regg("[\\s;]");
+ lineCount();
+ QCString tt(yytext);
+ tt=tt.lower();
+ QStringList ql=QStringList::split(regg,tt,FALSE);
+ int index=ql.findIndex(QCString("if"))+1;
+ index+=ql.findIndex(QCString("case"))+1;
+ index+=ql.findIndex(QCString("loop"))+1;
+ index+=ql.findIndex(QCString("generate"))+1;
+ bufferClear();
+ if (index==0 && isFunc)
+ {
+ Entry* pFunc=getEntryAtLine(current_root,iFuncLine);
+ if (pFunc && pFunc->section==Entry::FUNCTION_SEC)
+ {
+ pFunc->endBodyLine=yyLineNr;
+ }
+ isFunc=0;
+ BEGIN(Start);
+ }
+}
+
+<ParseType>";" {
+ lineCount();
+ addText(yytext,yyleng);
+ if (bropen==0 && !(isFunc==1 && isBody==1) )
+ {
+ if (isFunc)
+ {
+ parseFunctionProto();
+ bufferClear();
+ if (lastCompound && lastCompound->spec==VhdlDocGen::PACKAGE)
+ {
+ isFunc=0;
+ BEGIN(Start);
+ }
+ else
+ {
+ BEGIN(ParseFunc);
+ }
+ }//if
+ else
+ {
+ QCString qcs;
+ getBufText(qcs,0);
+ qcs=qcs.stripWhiteSpace();
+ current->section=Entry::VARIABLE_SEC;
+ current->type+=qcs.data();
+
+ if ((current->spec==VhdlDocGen::SIGNAL ||
+ current->spec==VhdlDocGen::CONSTANT ||
+ current->spec==VhdlDocGen::TYPE ||
+ current->spec==VhdlDocGen::SUBTYPE ||
+ current->spec==VhdlDocGen::SHAREDVARIABLE
+ ) &&
+ qcs.stripPrefix(","))
+ {
+ QList<QCString> ql;
+ ql.setAutoDelete(TRUE);
+ QCString buffer;
+ if (current->spec==VhdlDocGen::SUBTYPE ||
+ current->spec==VhdlDocGen::TYPE
+ )
+ {
+ VhdlDocGen::getSigTypeName(ql,qcs.data(),buffer);
+ }
+ else
+ {
+ VhdlDocGen::getSigName(ql,qcs.data(),buffer);
+ }
+ QCString doc = current->doc;
+ QCString brief = current->brief;
+ if (ql.count()>0)
+ {
+ for (uint j=1;j<ql.count();j++)
+ {
+ Entry *ppt = new Entry;
+ initEntry(ppt);
+ ppt->type += ql.at(0)->data();
+ ppt->section = Entry::VARIABLE_SEC;
+ ppt->spec = current->spec;
+ ppt->name += ql.at(j)->data();
+ ppt->bodyLine = yyLineNr;
+ ppt->startLine = yyLineNr;
+ ppt->brief = brief;
+ ppt->doc = doc;
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(ppt);
+ }
+ else
+ {
+ current->addSubEntry(ppt);
+ }
+ }
+ current->type=ql.at(0)->data();
+ ql.clear();
+ }
+ }
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ isFunc=0;
+ bufferClear();
+ BEGIN(Start);
+ }
+ }
+ else
+ {
+ BEGIN(ParseType);
+ }
+}
+
+<ParseType>{BR}* {
+ lineCount();
+ addText(yytext,yyleng);
+ BEGIN(ParseType);
+}
+
+<FindEntityName>{NAME} { // found name of an entity/architecture/package
+ lineCount();
+ QCString qcs(yytext);
+ qcs=qcs.stripWhiteSpace();
+ qcs=qcs.lower();
+ if (strcmp(qcs.data(),"body")==0) // found package body
+ {
+ current->spec=VhdlDocGen::PACKAGE_BODY;
+ current->section=Entry::CLASS_SEC;
+ current->protection=Protected;
+ current->name+=QCString("_");
+ isBody=1;
+ BEGIN(FindName);
+ }
+ else if (scantype==1) // found a component
+ {
+ QCString qq(yytext);
+ qq=qq.stripWhiteSpace();
+ //qq=qq.lower();
+
+ current->name=qq;
+ qq=qq.lower();
+ if (lastCompound)
+ {
+ if (lastCompound->spec==VhdlDocGen::PACKAGE)
+ {
+ if (!VhdlDocGen::foundInsertedComponent(qq,lastCompound))
+ {
+ BaseInfo *bb=new BaseInfo(qq,Private,Normal);
+ lastCompound->extends->append(bb);
+ }
+ }
+
+ lastCompound->addSubEntry(current);
+ current = new Entry;
+ initEntry(current);
+ }
+ else
+ {
+ newEntry();
+ }
+ BEGIN(Start);
+ }
+ else
+ {
+ QCString qq(yytext);
+ qq=qq.stripWhiteSpace();
+ current->name=qq;
+ newEntry();
+ //QCString qreal=QCString(yytext);
+ BEGIN(Start);
+ }
+}
+
+<Start>{B}*("generic"|"port"){BR}*[(]+ { // found generic|port in entity
+ QCString genp(yyleng+1);
+ deleteSpecChars(yytext,genp.data());
+ VhdlDocGen::deleteCharRev(genp,'(');
+
+ if (stricmp(genp.data(),"port" )==0)
+ {
+ genPort=1;
+ }
+ else
+ {
+ genPort=0;
+ }
+
+ bropen=1;
+ bufferClear();
+ lineCount();
+ BEGIN(FindSigName);
+}
+
+<FindSigName>{BRACECLOSE} {
+ lineCount();
+ bropen--;
+ addText(yytext,yyleng);
+ if (bropen==0)
+ {
+ bufferClear();
+ BEGIN(Start);
+ }
+ else
+ {
+ BEGIN(FindSigName);
+ }
+}
+
+<FindSigName>{LABELID} { // found signals in entity
+ QCString line(yytext);
+
+ // note that line can be something like:
+ // "var1, var2, var3 : in std_logic_vector(8 downto 0); --! Some comment"
+
+ // but also
+ // "var4 --! Some comment
+ // );"
+ // which marks the end of a port
+
+ // and also
+ // "-- Some comment
+ // var1 : in std_logic;"
+
+ //printf("--> labelid='%s'\n",line.data());
+ QStringList ql;
+ QCString comment;
+ int openCount=line.contains('(');
+ int closeCount=line.contains(')');
+ int semi = line.find(';');
+ int pos = line.find("--");
+ int pos1 = line.find("--!");
+ if (pos!=-1 && pos<pos1) // strip normal comment before special one
+ {
+ line = line.remove(pos,pos1-pos);
+ }
+ //printf("=> signal: line='%s'\n",line.data());
+ if (semi!=-1 && pos!=-1)
+ {
+ int eol = line.findRev('\n');
+ //printf("pos=%d eol=%d\n",pos,eol);
+ if (eol>=pos+2)
+ {
+ QRegExp re("\\n[\\s]*--!"); // comment continuation
+ comment=line.mid(pos+2,eol-pos-2);
+ //printf("Comment: '%s'\n",comment.data());
+ int p,l;
+ while ((p=re.match(comment,0,&l))!=-1)
+ {
+ comment.remove(p,l);
+ }
+ line=line.left(pos)+line.right(line.length()-eol);
+ }
+ else
+ {
+ comment=line.mid(pos+2);
+ line=line.left(pos);
+ }
+ comment.stripWhiteSpace();
+ // must subtract "(" and ")" in comments because they are used for determining the
+ // end of a port/generic construct
+ openCount-=comment.contains('(');
+ closeCount-=comment.contains(')');
+ if (!comment.stripPrefix("!")) // not a special comment
+ {
+ comment.resize(0);
+ }
+ }
+ else
+ {
+ //printf("no ; or --: pos=%d semi=%d\n",pos,semi);
+ }
+ int diff=openCount-closeCount;
+ if (diff<0)
+ {
+ VhdlDocGen::deleteCharRev(line,')');
+ }
+
+ if (scantype!=1) // not a component
+ {
+ addText(yytext,yyleng);
+ addSignals(line,yyLineNr,lastEntity,comment);
+ }
+
+ lineCount();
+
+ if ((bropen+openCount-closeCount)==0)
+ {
+ bufferClear();
+ BEGIN(Start);
+ }
+}
+
+
+<FindSigName>{BRACEOPEN} {
+ lineCount();
+ bropen++;
+ addText(yytext,yyleng);
+}
+
+
+<FindSigName>{CR} {
+ lineCount();
+ addText(yytext,yyleng);
+ //BEGIN(FindSigName);
+}
+
+
+<*>^{B}*("for ")[^;]* {
+ //printf("\n found for[%s] [%d]",yytext,yyLineNr);
+ lineCount();
+}
+
+<*>{DIGITS} { // found digit
+ addText(yytext,yyleng);
+ lineCount();
+}
+
+<*>{STRING_LITERAL} {
+ // Make sure string literals get transfered to the output
+ // We have to match these because the comment characters (--)
+ // can exist inside a string literal.
+ // We shouldn't have to call lineCount because newlines
+ // are not allowed inside string literals
+ addText(yytext,yyleng);
+}
+
+ /*
+<*>{BR}*"--!"{B}*"@}" { // end group
+ if (current)
+ {
+ Entry *pg=new Entry;
+ addSubEntry(current,pg);
+ pg->startLine=yyLineNr;
+ pg->name="endgroup";
+ }
+ lineCount();
+}
+
+<*>{BR}*"--!"{B}*"@{" { // start group
+ if (current)
+ {
+ Entry *pg=new Entry;
+ addSubEntry(current,pg);
+ pg->startLine=yyLineNr;
+ pg->name="startgroup";
+ }
+ lineCount();
+}
+ */
+
+<*>{BR}*"--!"[^{}\n][^\n]*\n/{B}*"--!" { // multi line comment
+ if (iDocLine==-1) iDocLine=yyLineNr;
+ // signal clk :in std_logic; --!@brief global clock
+ // --!@brief global reset
+ // signal reset:in std_logic;
+ // these two comments are detected as a multi line comment
+ QCString qc(yytext);
+ int len=qc.contains('\n')+yyLineNr-1;
+
+ if (YY_START!=Comment) // Start of the comment block
+ {
+ bufferClear();
+ iTextCounter=0;
+ startComment=yyLineNr;
+ g_lastCommentContext=YY_START;
+ }
+
+ Entry* pTemp=getEntryAtLine(current_root,len);
+ if (pTemp)
+ { // found one line comment, add it to the entry on this line
+ pTemp->briefLine=yyLineNr;
+ pTemp->brief+=yytext;
+ VhdlDocGen::prepareComment(pTemp->brief);
+ }
+ else
+ {
+ addText(yytext,yyleng);
+ }
+ lineCount();
+ BEGIN(Comment);
+}
+
+<Comment>^{B}*"--!"[^\n]* {
+ if (iDocLine==-1) iDocLine=yyLineNr;
+ addText(yytext,yyleng);
+ lineCount();
+}
+
+<Comment>.|\n {
+ // found end of comment block
+ QCString qcs;
+ getBufText(qcs,iTextCounter);
+ VhdlDocGen::prepareComment(qcs);
+ int ii =qcs.find("\\code");
+ if (ii>0)
+ {
+ iCodeLen=num_chars;
+
+ gBlock.reset();
+ int len=qcs.length();
+ QCString name=qcs.right(len-ii);
+ name=VhdlDocGen::getIndexWord(name.data(),1);
+ if (!name)
+ gBlock.name="misc"+ VhdlDocGen::getRecordNumber();
+ else
+ gBlock.name=name;
+ qcs=qcs.left(ii);
+ gBlock.startLine=yyLineNr+1;
+ gBlock.bodyLine=yyLineNr+1;
+ gBlock.brief+=qcs;
+ iTextCounter=0;
+ }
+
+ if (ii==-1)
+ {
+ handleCommentBlock(qcs,FALSE);
+ }
+ bufferClear();
+ unput(*yytext);
+ BEGIN(g_lastCommentContext);
+}
+
+<*>"--!"[^\n]* { // one line comment
+ if (iDocLine==-1) iDocLine=yyLineNr;
+ QCString qcs(yytext);
+ int j=qcs.find("--!");
+ qcs=qcs.right(qcs.length()-3-j);
+ bool isEndCode=qcs.contains("\\endcode");
+
+ if (isEndCode)
+ makeInline();
+ //printf("--> handleCommentBlock line %d\n",yyLineNr);
+ Entry* pTemp=getEntryAtLine(current_root,yyLineNr);
+
+ if (!isEndCode)
+ {
+ if (pTemp)
+ {
+ pTemp->briefLine=yyLineNr;
+ pTemp->brief+=qcs;
+ iDocLine=-1;
+ }
+ else
+ {
+ handleCommentBlock(qcs,TRUE);
+ }
+ }
+
+ bufferClear();
+}// one line
+
+
+<*>{COMMENT} {
+}
+
+<*>\n {
+ lineCount();
+ addText(yytext,yyleng);
+ // printf("\n new-line [%d]",yyLineNr);
+ BEGIN(Start);
+}
+
+<*>{NAME} {
+ addText(yytext,yyleng);
+ lineCount();
+}
+
+<*>{B}* {
+ addText(yytext,yyleng);
+ lineCount();
+}
+
+<*>. {
+ addText(yytext,yyleng);
+ lineCount();
+}
+
+
+%%
+
+static void initEntry(Entry *e)
+{
+ e->fileName = yyFileName;
+ initGroupInfo(e);
+}
+
+static void newEntry()
+{
+ // Add only enties/architectures/packages to root
+ // and signals to classes where they were found
+ // ENTITY dlatch_93 IS -- VHDL'93-Syntax !!!
+ // PORT (d, clk : IN bit;
+ // q, qbar : OUT bit);
+ // GROUP path IS (SIGNAL, SIGNAL);
+ // GROUP d_to_q : path (d, q);
+ // ATTRIBUTE propagation : time;
+ // END dlatch_93;
+
+ if (current->spec==VhdlDocGen::ENTITY ||
+ current->spec==VhdlDocGen::PACKAGE ||
+ current->spec==VhdlDocGen::ARCHITECTURE ||
+ current->spec==VhdlDocGen::PACKAGE_BODY)
+ {
+ current_root->addSubEntry(current);
+ }
+ else
+ {
+ if (lastCompound)
+ {
+ lastCompound->addSubEntry(current);
+ }
+ else
+ {
+ if (lastEntity)
+ {
+ lastEntity->addSubEntry(current);
+ }
+ else
+ {
+ current_root->addSubEntry(current); // should not happen!
+ }
+ }
+ }
+ previous = current;
+ current = new Entry ;
+ initEntry(current);
+}
+
+static void handleCommentBlock(const QCString &doc,bool brief)
+{
+ int position=0;
+ bool needsEntry=FALSE;
+ Protection protection=Public;
+ int lineNr = iDocLine;
+ if (brief)
+ current->briefLine = iDocLine;
+ else
+ current->docLine = iDocLine;
+
+ //printf("parseCommentBlock %p [%s]\n",current,doc.data());
+ while (parseCommentBlock(
+ g_thisParser,
+ current,
+ doc, // text
+ yyFileName, // file
+ lineNr, // line of block start
+ brief,
+ docBlockAutoBrief,
+ FALSE,
+ protection,
+ position,
+ needsEntry
+ )
+ )
+ {
+ //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position);
+ if (needsEntry) newEntry();
+ }
+ if (needsEntry)
+ {
+ newEntry();
+ }
+
+ if (docBlockTerm)
+ {
+ unput(docBlockTerm);
+ docBlockTerm=0;
+ }
+ iDocLine=-1;
+}
+
+#if 0
+/*!
+ * adds grouping to the entries
+ */
+static void mergeGrouping(const Entry* ce,int)
+{
+ EntryListIterator eli(*ce->children());
+ Entry *rt;
+ for (;(rt=eli.current());++eli)
+ {
+ if (rt->section==Entry::GROUPDOC_SEC)
+ {
+ if (openGroups)
+ {
+ QCString tt=(QCString)qrl.last();
+ if (!tt.isEmpty())
+ {
+ rt->groups->append(new Grouping(tt.data(),Grouping::GROUPING_LOWEST));
+ }
+ }
+ qrl.append(rt->name);
+ }
+
+ if ((strcmp(rt->name.data(),"endgroup")==0) && !qrl.isEmpty())
+ {
+ qrl.remove((QCString)qrl.last());
+ openGroups--;
+ }
+
+ if ((strcmp(rt->name.data(),"startgroup")==0))
+ {
+ openGroups++;
+ }
+
+ if (rt->section!=Entry::GROUPDOC_SEC && openGroups && !qrl.isEmpty())
+ {
+ rt->groups->append(new Grouping(qrl.last().data(),Grouping::GROUPING_LOWEST));
+ }
+
+ mergeGrouping(rt,openGroups);
+ }
+}
+#endif
+
+/*
+ * adds the library|use statements to the next class (entity|package|architecture|package body
+ * library ieee
+ * entity xxx
+ * .....
+ * library
+ * package
+ * enity zzz
+ * .....
+ * and so on..
+ */
+
+static void mapLibPackage(const Entry* ce)
+{
+ Entry *lastComp=0;
+ while (TRUE)
+ {
+ bool found = FALSE;
+ Entry *rt=0;
+ //const QList<Entry> *epp=ce->children();
+ EntryListIterator eli(*ce->children());
+ EntryListIterator eli1=eli;
+ for (;(rt=eli.current()),eli1=eli;++eli)
+ {
+ if (rt->spec==VhdlDocGen::LIBRARY || rt->spec==VhdlDocGen::USE)
+ // top level library or use statement
+ {
+ Entry *temp=0;
+ for (;(temp=eli1.current());++eli1) // find next entity
+ {
+ if (temp->spec==VhdlDocGen::ENTITY || temp->spec==VhdlDocGen::PACKAGE || temp->spec==VhdlDocGen::ARCHITECTURE || temp->spec==VhdlDocGen::PACKAGE_BODY)
+ {
+ Entry *ee=new Entry(*rt); //append a copy to entries sublist
+ temp->addSubEntry(ee);
+ found=TRUE;
+ rt->spec=-1; //nullify entry
+ rt->section=0;
+ lastComp=temp;
+ break;
+ }
+ }//for
+ if (lastComp && rt->spec!=-1)
+ {
+ Entry *ee=new Entry(*rt); //append a copy to entries sublist
+ lastComp->addSubEntry(ee);
+ found=TRUE;
+ rt->spec=-1; //nullify entry
+ rt->section=0;
+ }
+ }//if
+ }//for
+ if (!found) // nothing left to do
+ {
+ return;
+ }
+ }//while
+}//MapLib
+
+#if 0
+/*!
+ * merges a brief descriptions to the next entry
+ */
+void mergeBrief(const Entry* ce)
+{
+ EntryListIterator eli(*ce->children());
+ Entry *rt;
+ for (;(rt=eli.current());++eli)
+ {
+
+ if (found && (!eMerge.brief.isEmpty() || !eMerge.doc.isEmpty()))
+ {
+ rt->doc+=eMerge.doc.data();
+ rt->docLine=eMerge.docLine;
+ rt->brief+=eMerge.brief.data();
+ rt->briefLine=eMerge.briefLine;
+ found=FALSE;
+ }
+
+ if ((strcmp(rt->name.data(),"string")==0))
+ {
+ eMerge.reset();
+ eMerge.doc+=rt->doc.data();
+ eMerge.docLine=rt->docLine;
+ eMerge.brief+=rt->brief.data();
+ eMerge.briefLine=rt->briefLine;
+
+ found=TRUE;
+ }
+ MergeBrief(rt);
+ }
+}
+#endif
+
+
+
+void vhdlscanFreeScanner()
+{
+#if defined(YY_FLEX_SUBMINOR_VERSION)
+ if (g_lexInit)
+ {
+ vhdlscanYYlex_destroy();
+ }
+
+ if (g_buf)
+ {
+ free(g_buf);
+ }
+
+ g_buf=0;
+#endif
+
+}
+
+void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+{
+ inputFile.setName(fileName);
+ //uint jfile=inputFile.size();
+ ::parserInit();
+ yyFileName=QCString(fileName);
+ groupEnterFile(fileName,yyLineNr);
+ g_thisParser = this;
+ g_inputFromFile = FALSE;
+ inputPosition = 0;
+ assert(root!=0);
+
+ inputString=fileBuf;
+ inputLen=strlen(fileBuf);
+ current_root = root;
+ global_root = root;
+ current=new Entry;
+ initEntry(current);
+ //current_root->name=QCString("XXX"); // dummy name for root
+ if (!inputFile.open(IO_ReadOnly))
+ {
+ err("\n\n could not open file: %s !!\n\n",yyFileName.data());
+ return ;
+ }
+
+ if (g_lexInit)
+ {
+ vhdlscanYYrestart(vhdlscanYYin);
+ unput(' ');
+ BEGIN(Start);
+ }
+ vhdlscanYYlex();
+ g_lexInit=TRUE;
+
+ free(g_buf);
+ g_buf=0;
+
+ delete current;
+ current=0;
+
+ groupLeaveFile(yyFileName,yyLineNr);
+ inputFile.close();
+
+ //mergeBrief(current_root);
+ //mergeGrouping(current_root,0);
+ mapLibPackage(current_root);
+}
+
+
+void VHDLLanguageScanner::parsePrototype(const char *text)
+{
+ // will be called when a \fn command is found in a comment block
+
+ QCString ss,ret;
+ bool sem=FALSE;
+ bool func=FALSE;
+ QList<Argument> qs;
+ qs.setAutoDelete(TRUE);
+ VhdlDocGen::parseFuncProto(text,qs,ss,ret,TRUE);
+ int count=qs.count();
+ if (stricmp(ret.data(),"function")==0)
+ {
+ func=TRUE;
+ }
+ if (count<1 && !func)
+ {
+ return;
+ }
+ Entry *pp = new Entry;
+ initEntry(pp);
+ pp->name=ss.stripWhiteSpace();
+ pp->args+='(';
+ for (int j=0;j<count;j++)
+ {
+ if (sem)
+ {
+ pp->args+=',';
+ }
+
+ Argument *ars=(Argument*)(qs.at(j));
+ Argument *arg=new Argument;
+ arg->attrib = ars->attrib;
+ arg->name = ars->name;
+ arg->type = ars->type;
+ pp->args+=ars->name.data();
+ pp->args+=" ";
+ pp->args+=ars->type.data();
+ pp->argList->append(arg);
+ sem=TRUE;
+ }
+ pp->args+=')';
+
+ if (!ret.isEmpty())
+ pp->spec=VhdlDocGen::FUNCTION;
+ else
+ pp->spec=VhdlDocGen::PROCEDURE;
+
+ if (pp->section == Entry::MEMBERDOC_SEC && pp->args.isEmpty())
+ pp->section = Entry::VARIABLEDOC_SEC;
+
+ pp->type=ret;
+ current_root->addSubEntry(pp);
+}
+
+void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf,
+ const char *scopeName,
+ const QCString &input,
+ bool isExampleBlock,
+ const char *exampleName,
+ FileDef *fileDef,
+ int startLine,
+ int endLine,
+ bool inlineFragment,
+ MemberDef *memberDef,
+ bool showLineNumbers
+ )
+{
+ ::parseVhdlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
+ fileDef,startLine,endLine,inlineFragment,memberDef,
+ showLineNumbers);
+}
+
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
new file mode 100644
index 0000000..b5a0d6b
--- /dev/null
+++ b/src/xmldocvisitor.cpp
@@ -0,0 +1,968 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "xmldocvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "xmlgen.h"
+#include "dot.h"
+#include "message.h"
+#include "util.h"
+#include <qfileinfo.h>
+#include "parserintf.h"
+
+XmlDocVisitor::XmlDocVisitor(FTextStream &t,CodeOutputInterface &ci)
+ : DocVisitor(DocVisitor_XML), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
+{
+}
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+void XmlDocVisitor::visit(DocWord *w)
+{
+ if (m_hide) return;
+ filter(w->word());
+}
+
+void XmlDocVisitor::visit(DocLinkedWord *w)
+{
+ if (m_hide) return;
+ startLink(w->ref(),w->file(),w->anchor());
+ filter(w->word());
+ endLink();
+}
+
+void XmlDocVisitor::visit(DocWhiteSpace *w)
+{
+ if (m_hide) return;
+ if (m_insidePre)
+ {
+ m_t << w->chars();
+ }
+ else
+ {
+ m_t << " ";
+ }
+}
+
+void XmlDocVisitor::visit(DocSymbol *s)
+{
+ if (m_hide) return;
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "\\"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: m_t << "&lt;"; break;
+ case DocSymbol::Greater: m_t << "&gt;"; break;
+ case DocSymbol::Amp: m_t << "&amp;"; break;
+ case DocSymbol::Dollar: m_t << "$"; break;
+ case DocSymbol::Hash: m_t << "#"; break;
+ case DocSymbol::DoubleColon: m_t << "::"; break;
+ case DocSymbol::Percent: m_t << "%"; break;
+ case DocSymbol::Copy: m_t << "<copy/>"; break;
+ case DocSymbol::Tm: m_t << "<trademark/>"; break;
+ case DocSymbol::Reg: m_t << "<registered/>"; break;
+ case DocSymbol::Apos: m_t << "'"; break;
+ case DocSymbol::Quot: m_t << "\""; break;
+ case DocSymbol::Lsquo: m_t << "<lsquo/>"; break;
+ case DocSymbol::Rsquo: m_t << "<rsquo/>"; break;
+ case DocSymbol::Ldquo: m_t << "<ldquo/>"; break;
+ case DocSymbol::Rdquo: m_t << "<rdquo/>"; break;
+ case DocSymbol::Ndash: m_t << "<ndash/>"; break;
+ case DocSymbol::Mdash: m_t << "<mdash/>"; break;
+ case DocSymbol::Uml: m_t << "<umlaut char=\"" << s->letter() << "\"/>"; break;
+ case DocSymbol::Acute: m_t << "<acute char=\"" << s->letter() << "\"/>"; break;
+ case DocSymbol::Grave: m_t << "<grave char=\"" << s->letter() << "\"/>"; break;
+ case DocSymbol::Circ: m_t << "<circ char=\"" << s->letter() << "\"/>"; break;
+ case DocSymbol::Tilde: m_t << "<tilde char=\"" << s->letter() << "\"/>"; break;
+ case DocSymbol::Szlig: m_t << "<szlig/>"; break;
+ case DocSymbol::Cedil: m_t << "<cedil char=\"" << s->letter() << "\"/>"; break;
+ case DocSymbol::Ring: m_t << "<ring char=\"" << s->letter() << "\"/>"; break;
+ case DocSymbol::Slash: m_t << "<slash char=\"" << s->letter() << "\"/>"; break;
+ case DocSymbol::Nbsp: m_t << "<nonbreakablespace/>"; break;
+ case DocSymbol::Aelig: m_t << "<aelig/>"; break;
+ case DocSymbol::AElig: m_t << "<AElig/>"; break;
+ default:
+ err("error: unknown symbol found\n");
+ }
+}
+
+void XmlDocVisitor::visit(DocURL *u)
+{
+ if (m_hide) return;
+ m_t << "<ulink url=\"";
+ if (u->isEmail()) m_t << "mailto:";
+ filter(u->url());
+ m_t << "\">";
+ filter(u->url());
+ m_t << "</ulink>";
+}
+
+void XmlDocVisitor::visit(DocLineBreak *)
+{
+ if (m_hide) return;
+ m_t << "<linebreak/>\n";
+}
+
+void XmlDocVisitor::visit(DocHorRuler *)
+{
+ if (m_hide) return;
+ m_t << "<hruler/>\n";
+}
+
+void XmlDocVisitor::visit(DocStyleChange *s)
+{
+ if (m_hide) return;
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) m_t << "<bold>"; else m_t << "</bold>";
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) m_t << "<emphasis>"; else m_t << "</emphasis>";
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) m_t << "<computeroutput>"; else m_t << "</computeroutput>";
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) m_t << "<subscript>"; else m_t << "</subscript>";
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) m_t << "<superscript>"; else m_t << "</superscript>";
+ break;
+ case DocStyleChange::Center:
+ if (s->enable()) m_t << "<center>"; else m_t << "</center>";
+ break;
+ case DocStyleChange::Small:
+ if (s->enable()) m_t << "<small>"; else m_t << "</small>";
+ break;
+ case DocStyleChange::Preformatted:
+ if (s->enable())
+ {
+ m_t << "<preformatted>";
+ m_insidePre=TRUE;
+ }
+ else
+ {
+ m_t << "</preformatted>";
+ m_insidePre=FALSE;
+ }
+ break;
+ case DocStyleChange::Div: /* HTML only */ break;
+ case DocStyleChange::Span: /* HTML only */ break;
+ }
+}
+
+void XmlDocVisitor::visit(DocVerbatim *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocVerbatim::Code: // fall though
+ m_t << "<programlisting>";
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,s->context(),s->text(),
+ s->isExample(),s->exampleFile());
+ m_t << "</programlisting>";
+ break;
+ case DocVerbatim::Verbatim:
+ m_t << "<verbatim>";
+ filter(s->text());
+ m_t << "</verbatim>";
+ break;
+ case DocVerbatim::HtmlOnly:
+ m_t << "<htmlonly>";
+ filter(s->text());
+ m_t << "</htmlonly>";
+ break;
+ case DocVerbatim::ManOnly:
+ m_t << "<manonly>";
+ filter(s->text());
+ m_t << "</manonly>";
+ break;
+ case DocVerbatim::LatexOnly:
+ m_t << "<latexonly>";
+ filter(s->text());
+ m_t << "</latexonly>";
+ break;
+ case DocVerbatim::XmlOnly:
+ m_t << s->text();
+ break;
+ case DocVerbatim::Dot:
+ m_t << "<dot>";
+ filter(s->text());
+ m_t << "</dot>";
+ break;
+ case DocVerbatim::Msc:
+ m_t << "<msc>";
+ filter(s->text());
+ m_t << "</msc>";
+ break;
+ }
+}
+
+void XmlDocVisitor::visit(DocAnchor *anc)
+{
+ if (m_hide) return;
+ m_t << "<anchor id=\"" << anc->file() << "_1" << anc->anchor() << "\"/>";
+}
+
+void XmlDocVisitor::visit(DocInclude *inc)
+{
+ if (m_hide) return;
+ switch(inc->type())
+ {
+ case DocInclude::IncWithLines:
+ {
+ m_t << "<programlisting>";
+ QFileInfo cfi( inc->file() );
+ FileDef fd( cfi.dirPath(), cfi.fileName() );
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),
+ inc->isExample(),
+ inc->exampleFile(), &fd);
+ m_t << "</programlisting>";
+ }
+ break;
+ case DocInclude::Include:
+ m_t << "<programlisting>";
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),
+ inc->isExample(),
+ inc->exampleFile());
+ m_t << "</programlisting>";
+ break;
+ case DocInclude::DontInclude:
+ break;
+ case DocInclude::HtmlInclude:
+ m_t << "<htmlonly>";
+ filter(inc->text());
+ m_t << "</htmlonly>";
+ break;
+ case DocInclude::VerbInclude:
+ m_t << "<verbatim>";
+ filter(inc->text());
+ m_t << "</verbatim>";
+ break;
+ }
+}
+
+void XmlDocVisitor::visit(DocIncOperator *op)
+{
+ //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
+ // op->type(),op->isFirst(),op->isLast(),op->text().data());
+ if (op->isFirst())
+ {
+ if (!m_hide)
+ {
+ m_t << "<programlisting>";
+ }
+ pushEnabled();
+ m_hide = TRUE;
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ popEnabled();
+ if (!m_hide)
+ {
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,op->context(),
+ op->text(),op->isExample(),
+ op->exampleFile());
+ }
+ pushEnabled();
+ m_hide=TRUE;
+ }
+ if (op->isLast())
+ {
+ popEnabled();
+ if (!m_hide) m_t << "</programlisting>";
+ }
+ else
+ {
+ if (!m_hide) m_t << endl;
+ }
+}
+
+void XmlDocVisitor::visit(DocFormula *f)
+{
+ if (m_hide) return;
+ m_t << "<formula id=\"" << f->id() << "\">";
+ filter(f->text());
+ m_t << "</formula>";
+}
+
+void XmlDocVisitor::visit(DocIndexEntry *ie)
+{
+ if (m_hide) return;
+ m_t << "<indexentry>"
+ "<primaryie>";
+ filter(ie->entry());
+ m_t << "</primaryie>"
+ "<secondaryie></secondaryie>"
+ "</indexentry>";
+}
+
+void XmlDocVisitor::visit(DocSimpleSectSep *)
+{
+ m_t << "<simplesectsep/>";
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void XmlDocVisitor::visitPre(DocAutoList *l)
+{
+ if (m_hide) return;
+ if (l->isEnumList())
+ {
+ m_t << "<orderedlist>\n";
+ }
+ else
+ {
+ m_t << "<itemizedlist>\n";
+ }
+}
+
+void XmlDocVisitor::visitPost(DocAutoList *l)
+{
+ if (m_hide) return;
+ if (l->isEnumList())
+ {
+ m_t << "</orderedlist>\n";
+ }
+ else
+ {
+ m_t << "</itemizedlist>\n";
+ }
+}
+
+void XmlDocVisitor::visitPre(DocAutoListItem *)
+{
+ if (m_hide) return;
+ m_t << "<listitem>";
+}
+
+void XmlDocVisitor::visitPost(DocAutoListItem *)
+{
+ if (m_hide) return;
+ m_t << "</listitem>";
+}
+
+void XmlDocVisitor::visitPre(DocPara *)
+{
+ if (m_hide) return;
+ m_t << "<para>";
+}
+
+void XmlDocVisitor::visitPost(DocPara *)
+{
+ if (m_hide) return;
+ m_t << "</para>";
+}
+
+void XmlDocVisitor::visitPre(DocRoot *)
+{
+ //m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n";
+}
+
+void XmlDocVisitor::visitPost(DocRoot *)
+{
+ //m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n";
+}
+
+void XmlDocVisitor::visitPre(DocSimpleSect *s)
+{
+ if (m_hide) return;
+ m_t << "<simplesect kind=\"";
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ m_t << "see"; break;
+ case DocSimpleSect::Return:
+ m_t << "return"; break;
+ case DocSimpleSect::Author:
+ m_t << "author"; break;
+ case DocSimpleSect::Authors:
+ m_t << "authors"; break;
+ case DocSimpleSect::Version:
+ m_t << "version"; break;
+ case DocSimpleSect::Since:
+ m_t << "since"; break;
+ case DocSimpleSect::Date:
+ m_t << "date"; break;
+ case DocSimpleSect::Note:
+ m_t << "note"; break;
+ case DocSimpleSect::Warning:
+ m_t << "warning"; break;
+ case DocSimpleSect::Pre:
+ m_t << "pre"; break;
+ case DocSimpleSect::Post:
+ m_t << "post"; break;
+ case DocSimpleSect::Invar:
+ m_t << "invariant"; break;
+ case DocSimpleSect::Remark:
+ m_t << "remark"; break;
+ case DocSimpleSect::Attention:
+ m_t << "attention"; break;
+ case DocSimpleSect::User:
+ m_t << "par"; break;
+ case DocSimpleSect::Rcs:
+ m_t << "rcs"; break;
+ case DocSimpleSect::Unknown: break;
+ }
+ m_t << "\">";
+}
+
+void XmlDocVisitor::visitPost(DocSimpleSect *)
+{
+ if (m_hide) return;
+ m_t << "</simplesect>\n";
+}
+
+void XmlDocVisitor::visitPre(DocTitle *)
+{
+ if (m_hide) return;
+ m_t << "<title>";
+}
+
+void XmlDocVisitor::visitPost(DocTitle *)
+{
+ if (m_hide) return;
+ m_t << "</title>";
+}
+
+void XmlDocVisitor::visitPre(DocSimpleList *)
+{
+ if (m_hide) return;
+ m_t << "<itemizedlist>\n";
+}
+
+void XmlDocVisitor::visitPost(DocSimpleList *)
+{
+ if (m_hide) return;
+ m_t << "</itemizedlist>\n";
+}
+
+void XmlDocVisitor::visitPre(DocSimpleListItem *)
+{
+ if (m_hide) return;
+ m_t << "<listitem>";
+}
+
+void XmlDocVisitor::visitPost(DocSimpleListItem *)
+{
+ if (m_hide) return;
+ m_t << "</listitem>\n";
+}
+
+void XmlDocVisitor::visitPre(DocSection *s)
+{
+ if (m_hide) return;
+ m_t << "<sect" << s->level() << " id=\"" << s->file();
+ if (!s->anchor().isEmpty()) m_t << "_1" << s->anchor();
+ m_t << "\">" << endl;
+ m_t << "<title>";
+ filter(s->title());
+ m_t << "</title>" << endl;
+}
+
+void XmlDocVisitor::visitPost(DocSection *s)
+{
+ m_t << "</sect" << s->level() << ">\n";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlList *s)
+{
+ if (m_hide) return;
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "<orderedlist>\n";
+ else
+ m_t << "<itemizedlist>\n";
+}
+
+void XmlDocVisitor::visitPost(DocHtmlList *s)
+{
+ if (m_hide) return;
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "</orderedlist>\n";
+ else
+ m_t << "</itemizedlist>\n";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlListItem *)
+{
+ if (m_hide) return;
+ m_t << "<listitem>\n";
+}
+
+void XmlDocVisitor::visitPost(DocHtmlListItem *)
+{
+ if (m_hide) return;
+ m_t << "</listitem>\n";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlDescList *)
+{
+ if (m_hide) return;
+ m_t << "<variablelist>\n";
+}
+
+void XmlDocVisitor::visitPost(DocHtmlDescList *)
+{
+ if (m_hide) return;
+ m_t << "</variablelist>\n";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ m_t << "<varlistentry><term>";
+}
+
+void XmlDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ m_t << "</term></varlistentry>\n";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlDescData *)
+{
+ if (m_hide) return;
+ m_t << "<listitem>";
+}
+
+void XmlDocVisitor::visitPost(DocHtmlDescData *)
+{
+ if (m_hide) return;
+ m_t << "</listitem>\n";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlTable *t)
+{
+ if (m_hide) return;
+ m_t << "<table rows=\"" << t->numRows()
+ << "\" cols=\"" << t->numCols() << "\">" ;
+}
+
+void XmlDocVisitor::visitPost(DocHtmlTable *)
+{
+ if (m_hide) return;
+ m_t << "</table>\n";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlRow *)
+{
+ if (m_hide) return;
+ m_t << "<row>\n";
+}
+
+void XmlDocVisitor::visitPost(DocHtmlRow *)
+{
+ if (m_hide) return;
+ m_t << "</row>\n";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlCell *c)
+{
+ if (m_hide) return;
+ if (c->isHeading()) m_t << "<entry thead=\"yes\">"; else m_t << "<entry thead=\"no\">";
+}
+
+void XmlDocVisitor::visitPost(DocHtmlCell *)
+{
+ if (m_hide) return;
+ m_t << "</entry>";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlCaption *)
+{
+ if (m_hide) return;
+ m_t << "<caption>";
+}
+
+void XmlDocVisitor::visitPost(DocHtmlCaption *)
+{
+ if (m_hide) return;
+ m_t << "</caption>\n";
+}
+
+void XmlDocVisitor::visitPre(DocInternal *)
+{
+ if (m_hide) return;
+ m_t << "<internal>";
+}
+
+void XmlDocVisitor::visitPost(DocInternal *)
+{
+ if (m_hide) return;
+ m_t << "</internal>" << endl;
+}
+
+void XmlDocVisitor::visitPre(DocHRef *href)
+{
+ if (m_hide) return;
+ m_t << "<ulink url=\"" << href->url() << "\">";
+}
+
+void XmlDocVisitor::visitPost(DocHRef *)
+{
+ if (m_hide) return;
+ m_t << "</ulink>";
+}
+
+void XmlDocVisitor::visitPre(DocHtmlHeader *header)
+{
+ if (m_hide) return;
+ m_t << "<heading level=\"" << header->level() << "\">";
+}
+
+void XmlDocVisitor::visitPost(DocHtmlHeader *)
+{
+ if (m_hide) return;
+ m_t << "</heading>\n";
+}
+
+void XmlDocVisitor::visitPre(DocImage *img)
+{
+ if (m_hide) return;
+ m_t << "<image type=\"";
+ switch(img->type())
+ {
+ case DocImage::Html: m_t << "html"; break;
+ case DocImage::Latex: m_t << "latex"; break;
+ case DocImage::Rtf: m_t << "rtf"; break;
+ }
+ m_t << "\"";
+
+ QCString baseName=img->name();
+ int i;
+ if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ m_t << " name=\"" << baseName << "\"";
+ if (!img->width().isEmpty())
+ {
+ m_t << " width=\"";
+ filter(img->width());
+ m_t << "\"";
+ }
+ else if (!img->height().isEmpty())
+ {
+ m_t << " height=\"";
+ filter(img->height());
+ m_t << "\"";
+ }
+ m_t << ">";
+
+ // copy the image to the output dir
+ QFile inImage(img->name());
+ QFile outImage(Config_getString("XML_OUTPUT")+"/"+baseName.data());
+ if (inImage.open(IO_ReadOnly))
+ {
+ if (outImage.open(IO_WriteOnly))
+ {
+ char *buffer = new char[inImage.size()];
+ inImage.readBlock(buffer,inImage.size());
+ outImage.writeBlock(buffer,inImage.size());
+ outImage.flush();
+ delete[] buffer;
+ }
+ }
+}
+
+void XmlDocVisitor::visitPost(DocImage *)
+{
+ if (m_hide) return;
+ m_t << "</image>" << endl;
+}
+
+void XmlDocVisitor::visitPre(DocDotFile *df)
+{
+ if (m_hide) return;
+ m_t << "<dotfile name=\"" << df->file() << "\">";
+}
+
+void XmlDocVisitor::visitPost(DocDotFile *)
+{
+ if (m_hide) return;
+ m_t << "</dotfile>" << endl;
+}
+
+void XmlDocVisitor::visitPre(DocMscFile *df)
+{
+ if (m_hide) return;
+ m_t << "<mscfile name=\"" << df->file() << "\">";
+}
+
+void XmlDocVisitor::visitPost(DocMscFile *)
+{
+ if (m_hide) return;
+ m_t << "</mscfile>" << endl;
+}
+void XmlDocVisitor::visitPre(DocLink *lnk)
+{
+ if (m_hide) return;
+ startLink(lnk->ref(),lnk->file(),lnk->anchor());
+}
+
+void XmlDocVisitor::visitPost(DocLink *)
+{
+ if (m_hide) return;
+ endLink();
+}
+
+void XmlDocVisitor::visitPre(DocRef *ref)
+{
+ if (m_hide) return;
+ if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
+ if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void XmlDocVisitor::visitPost(DocRef *ref)
+{
+ if (m_hide) return;
+ if (!ref->file().isEmpty()) endLink();
+ //m_t << " ";
+}
+
+void XmlDocVisitor::visitPre(DocSecRefItem *ref)
+{
+ if (m_hide) return;
+ m_t << "<tocitem id=\"" << ref->file() << "_1" << ref->anchor() << "\">";
+}
+
+void XmlDocVisitor::visitPost(DocSecRefItem *)
+{
+ if (m_hide) return;
+ m_t << "</tocitem>" << endl;
+}
+
+void XmlDocVisitor::visitPre(DocSecRefList *)
+{
+ if (m_hide) return;
+ m_t << "<toclist>" << endl;
+}
+
+void XmlDocVisitor::visitPost(DocSecRefList *)
+{
+ if (m_hide) return;
+ m_t << "</toclist>" << endl;
+}
+
+//void XmlDocVisitor::visitPre(DocLanguage *l)
+//{
+// if (m_hide) return;
+// m_t << "<language langid=\"" << l->id() << "\">";
+//}
+//
+//void XmlDocVisitor::visitPost(DocLanguage *)
+//{
+// if (m_hide) return;
+// m_t << "</language>" << endl;
+//}
+
+void XmlDocVisitor::visitPre(DocParamSect *s)
+{
+ if (m_hide) return;
+ m_t << "<parameterlist kind=\"";
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ m_t << "param"; break;
+ case DocParamSect::RetVal:
+ m_t << "retval"; break;
+ case DocParamSect::Exception:
+ m_t << "exception"; break;
+ case DocParamSect::TemplateParam:
+ m_t << "templateparam"; break;
+ default:
+ ASSERT(0);
+ }
+ m_t << "\">";
+}
+
+void XmlDocVisitor::visitPost(DocParamSect *)
+{
+ if (m_hide) return;
+ m_t << "</parameterlist>" << endl;
+}
+
+void XmlDocVisitor::visitPre(DocParamList *pl)
+{
+ if (m_hide) return;
+ m_t << "<parameteritem>" << endl;
+ m_t << "<parameternamelist>" << endl;
+ //QStrListIterator li(pl->parameters());
+ //const char *s;
+ QListIterator<DocNode> li(pl->parameters());
+ DocNode *param;
+ for (li.toFirst();(param=li.current());++li)
+ {
+ if (pl->paramTypes().count()>0)
+ {
+ QListIterator<DocNode> li(pl->paramTypes());
+ DocNode *type;
+ for (li.toFirst();(type=li.current());++li)
+ {
+ m_t << "<parametertype>";
+ if (type->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)type);
+ }
+ else if (type->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)type);
+ }
+ m_t << "</parametertype>" << endl;
+ }
+ }
+ m_t << "<parametername";
+ if (pl->direction()!=DocParamSect::Unspecified)
+ {
+ m_t << " direction=\"";
+ if (pl->direction()==DocParamSect::In)
+ {
+ m_t << "in";
+ }
+ else if (pl->direction()==DocParamSect::Out)
+ {
+ m_t << "out";
+ }
+ else if (pl->direction()==DocParamSect::InOut)
+ {
+ m_t << "inout";
+ }
+ m_t << "\"";
+ }
+ m_t << ">";
+ if (param->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)param);
+ }
+ else if (param->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)param);
+ }
+ m_t << "</parametername>" << endl;
+ }
+ m_t << "</parameternamelist>" << endl;
+ m_t << "<parameterdescription>" << endl;
+}
+
+void XmlDocVisitor::visitPost(DocParamList *)
+{
+ if (m_hide) return;
+ m_t << "</parameterdescription>" << endl;
+ m_t << "</parameteritem>" << endl;
+}
+
+void XmlDocVisitor::visitPre(DocXRefItem *x)
+{
+ if (m_hide) return;
+ m_t << "<xrefsect id=\"";
+ m_t << x->file() << "_1" << x->anchor();
+ m_t << "\">";
+ m_t << "<xreftitle>";
+ filter(x->title());
+ m_t << "</xreftitle>";
+ m_t << "<xrefdescription>";
+}
+
+void XmlDocVisitor::visitPost(DocXRefItem *)
+{
+ if (m_hide) return;
+ m_t << "</xrefdescription>";
+ m_t << "</xrefsect>";
+}
+
+void XmlDocVisitor::visitPre(DocInternalRef *ref)
+{
+ if (m_hide) return;
+ startLink(0,ref->file(),ref->anchor());
+}
+
+void XmlDocVisitor::visitPost(DocInternalRef *)
+{
+ if (m_hide) return;
+ endLink();
+ m_t << " ";
+}
+
+void XmlDocVisitor::visitPre(DocCopy *c)
+{
+ if (m_hide) return;
+ m_t << "<copydoc link=\"" << convertToXML(c->link()) << "\">";
+}
+
+void XmlDocVisitor::visitPost(DocCopy *)
+{
+ if (m_hide) return;
+ m_t << "</copydoc>" << endl;
+}
+
+void XmlDocVisitor::visitPre(DocText *)
+{
+}
+
+void XmlDocVisitor::visitPost(DocText *)
+{
+}
+
+void XmlDocVisitor::filter(const char *str)
+{
+ m_t << convertToXML(str);
+}
+
+void XmlDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor)
+{
+ m_t << "<ref refid=\"" << file;
+ if (!anchor.isEmpty()) m_t << "_1" << anchor;
+ m_t << "\" kindref=\"";
+ if (!anchor.isEmpty()) m_t << "member"; else m_t << "compound";
+ m_t << "\"";
+ if (!ref.isEmpty()) m_t << " external=\"" << ref << "\"";
+ m_t << ">";
+}
+
+void XmlDocVisitor::endLink()
+{
+ m_t << "</ref>";
+}
+
+void XmlDocVisitor::pushEnabled()
+{
+ m_enabled.push(new bool(m_hide));
+}
+
+void XmlDocVisitor::popEnabled()
+{
+ bool *v=m_enabled.pop();
+ ASSERT(v!=0);
+ m_hide = *v;
+ delete v;
+}
+
diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h
new file mode 100644
index 0000000..78c299d
--- /dev/null
+++ b/src/xmldocvisitor.h
@@ -0,0 +1,160 @@
+/******************************************************************************
+ *
+ * $Id: $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef _XMLDOCVISITOR_H
+#define _XMLDOCVISITOR_H
+
+#include "docvisitor.h"
+#include <qstack.h>
+#include <qcstring.h>
+
+class FTextStream;
+class CodeOutputInterface;
+class QCString;
+
+/*! @brief Concrete visitor implementation for XML output. */
+class XmlDocVisitor : public DocVisitor
+{
+ public:
+ XmlDocVisitor(FTextStream &t,CodeOutputInterface &ci);
+
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
+ void visit(DocIndexEntry *);
+ void visit(DocSimpleSectSep *);
+
+ //--------------------------------------
+ // visitor functions for compound nodes
+ //--------------------------------------
+
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *) ;
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *);
+ void visitPost(DocHtmlList *) ;
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ //void visitPre(DocHtmlPre *);
+ //void visitPost(DocHtmlPre *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *);
+ void visitPost(DocHtmlTable *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *);
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+
+ void visitPre(DocMscFile *);
+ void visitPost(DocMscFile *);
+ void visitPre(DocLink *);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ //void visitPre(DocLanguage *);
+ //void visitPost(DocLanguage *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
+ void visitPre(DocText *);
+ void visitPost(DocText *);
+
+ private:
+
+ //--------------------------------------
+ // helper functions
+ //--------------------------------------
+
+ void filter(const char *str);
+ void startLink(const QCString &ref,const QCString &file,
+ const QCString &anchor);
+ void endLink();
+
+ void pushEnabled();
+ void popEnabled();
+
+ //--------------------------------------
+ // state variables
+ //--------------------------------------
+
+ FTextStream &m_t;
+ CodeOutputInterface &m_ci;
+ bool m_insidePre;
+ bool m_hide;
+ QStack<bool> m_enabled;
+ QCString m_langExt;
+};
+
+#endif
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
new file mode 100644
index 0000000..81ae70a
--- /dev/null
+++ b/src/xmlgen.cpp
@@ -0,0 +1,2010 @@
+/******************************************************************************
+ *
+ * $Id: xml.cpp,v 1.2 2001/01/01 10:15:18 root Exp $
+ *
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "qtbc.h"
+#include "xmlgen.h"
+#include "doxygen.h"
+#include "message.h"
+#include "config.h"
+#include "classlist.h"
+#include "util.h"
+#include "defargs.h"
+#include "outputgen.h"
+#include "dot.h"
+#include "pagedef.h"
+#include "filename.h"
+#include "version.h"
+#include "xmldocvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "parserintf.h"
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qintdict.h>
+
+// no debug info
+#define XML_DB(x) do {} while(0)
+// debug to stdout
+//#define XML_DB(x) printf x
+// debug inside output
+//#define XML_DB(x) QCString __t;__t.sprintf x;m_t << __t
+
+//------------------
+
+static const char index_xsd[] =
+#include "index_xsd.h"
+;
+
+//------------------
+//
+static const char compound_xsd[] =
+#include "compound_xsd.h"
+;
+
+//------------------
+
+class XmlSectionMapper : public QIntDict<char>
+{
+ public:
+ XmlSectionMapper() : QIntDict<char>(47)
+ {
+ insert(MemberList::pubTypes,"public-type");
+ insert(MemberList::pubMethods,"public-func");
+ insert(MemberList::pubAttribs,"public-attrib");
+ insert(MemberList::pubSlots,"public-slot");
+ insert(MemberList::signals,"signal");
+ insert(MemberList::dcopMethods,"dcop-func");
+ insert(MemberList::properties,"property");
+ insert(MemberList::events,"event");
+ insert(MemberList::pubStaticMethods,"public-static-func");
+ insert(MemberList::pubStaticAttribs,"public-static-attrib");
+ insert(MemberList::proTypes,"protected-type");
+ insert(MemberList::proMethods,"protected-func");
+ insert(MemberList::proAttribs,"protected-attrib");
+ insert(MemberList::proSlots,"protected-slot");
+ insert(MemberList::proStaticMethods,"protected-static-func");
+ insert(MemberList::proStaticAttribs,"protected-static-attrib");
+ insert(MemberList::pacTypes,"package-type");
+ insert(MemberList::pacMethods,"package-func");
+ insert(MemberList::pacAttribs,"package-attrib");
+ insert(MemberList::pacStaticMethods,"package-static-func");
+ insert(MemberList::pacStaticAttribs,"package-static-attrib");
+ insert(MemberList::priTypes,"private-type");
+ insert(MemberList::priMethods,"private-func");
+ insert(MemberList::priAttribs,"private-attrib");
+ insert(MemberList::priSlots,"private-slot");
+ insert(MemberList::priStaticMethods,"private-static-func");
+ insert(MemberList::priStaticAttribs,"private-static-attrib");
+ insert(MemberList::friends,"friend");
+ insert(MemberList::related,"related");
+ insert(MemberList::decDefineMembers,"define");
+ insert(MemberList::decProtoMembers,"prototype");
+ insert(MemberList::decTypedefMembers,"typedef");
+ insert(MemberList::decEnumMembers,"enum");
+ insert(MemberList::decFuncMembers,"func");
+ insert(MemberList::decVarMembers,"var");
+ }
+};
+
+static XmlSectionMapper g_xmlSectionMapper;
+
+
+inline void writeXMLString(FTextStream &t,const char *s)
+{
+ t << convertToXML(s);
+}
+
+inline void writeXMLCodeString(FTextStream &t,const char *s, int &col)
+{
+ char c;
+ while ((c=*s++))
+ {
+ switch(c)
+ {
+ case '\t':
+ {
+ int spacesToNextTabStop =
+ Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
+ col+=spacesToNextTabStop;
+ while (spacesToNextTabStop--) t << "<sp/>";
+ break;
+ }
+ case ' ': t << "<sp/>"; col++; break;
+ case '<': t << "&lt;"; col++; break;
+ case '>': t << "&gt;"; col++; break;
+ case '&': t << "&amp;"; col++; break;
+ case '\'': t << "&apos;"; col++; break;
+ case '"': t << "&quot;"; col++; break;
+ default: t << c; col++; break;
+ }
+ }
+}
+
+
+static void writeXMLHeader(FTextStream &t)
+{
+ t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
+ t << "<doxygen xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
+ t << "xsi:noNamespaceSchemaLocation=\"compound.xsd\" ";
+ t << "version=\"" << versionString << "\">" << endl;
+}
+
+static void writeCombineScript()
+{
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ QCString fileName=outputDirectory+"/combine.xslt";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ t <<
+ "<!-- XSLT script to combine the generated output into a single file. \n"
+ " If you have xsltproc you could use:\n"
+ " xsltproc combine.xslt index.xml >all.xml\n"
+ "-->\n"
+ "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n"
+ " <xsl:output method=\"xml\" version=\"1.0\" indent=\"no\" standalone=\"yes\" />\n"
+ " <xsl:template match=\"/\">\n"
+ " <doxygen version=\"{doxygenindex/@version}\">\n"
+ " <!-- Load all doxgen generated xml files -->\n"
+ " <xsl:for-each select=\"doxygenindex/compound\">\n"
+ " <xsl:copy-of select=\"document( concat( @refid, '.xml' ) )/doxygen/*\" />\n"
+ " </xsl:for-each>\n"
+ " </doxygen>\n"
+ " </xsl:template>\n"
+ "</xsl:stylesheet>\n";
+
+}
+
+void writeXMLLink(FTextStream &t,const char *extRef,const char *compoundId,
+ const char *anchorId,const char *text,const char *tooltip)
+{
+ t << "<ref refid=\"" << compoundId;
+ if (anchorId) t << "_1" << anchorId;
+ t << "\" kindref=\"";
+ if (anchorId) t << "member"; else t << "compound";
+ t << "\"";
+ if (extRef) t << " external=\"" << extRef << "\"";
+ if (tooltip) t << " tooltip=\"" << convertToXML(tooltip) << "\"";
+ t << ">";
+ writeXMLString(t,text);
+ t << "</ref>";
+}
+
+class TextGeneratorXMLImpl : public TextGeneratorIntf
+{
+ public:
+ TextGeneratorXMLImpl(FTextStream &t): m_t(t) {}
+ void writeString(const char *s,bool /*keepSpaces*/) const
+ {
+ writeXMLString(m_t,s);
+ }
+ void writeBreak() const {}
+ void writeLink(const char *extRef,const char *file,
+ const char *anchor,const char *text
+ ) const
+ {
+ writeXMLLink(m_t,extRef,file,anchor,text,0);
+ }
+ private:
+ FTextStream &m_t;
+};
+
+template<class T> class ValStack
+{
+ public:
+ ValStack() : m_values(10), m_sp(0), m_size(10) {}
+ virtual ~ValStack() {}
+ ValStack(const ValStack<T> &s)
+ {
+ m_values=s.m_values.copy();
+ m_sp=s.m_sp;
+ m_size=s.m_size;
+ }
+ ValStack &operator=(const ValStack<T> &s)
+ {
+ m_values=s.m_values.copy();
+ m_sp=s.m_sp;
+ m_size=s.m_size;
+ return *this;
+ }
+ void push(T v)
+ {
+ m_sp++;
+ if (m_sp>=m_size)
+ {
+ m_size+=10;
+ m_values.resize(m_size);
+ }
+ m_values[m_sp]=v;
+ }
+ T pop()
+ {
+ ASSERT(m_sp!=0);
+ return m_values[m_sp--];
+ }
+ T& top()
+ {
+ ASSERT(m_sp!=0);
+ return m_values[m_sp];
+ }
+ bool isEmpty()
+ {
+ return m_sp==0;
+ }
+ uint count() const
+ {
+ return m_sp;
+ }
+
+ private:
+ QArray<T> m_values;
+ int m_sp;
+ int m_size;
+};
+
+
+class XMLCodeGenerator : public CodeOutputInterface
+{
+ public:
+
+ XMLCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1),
+ m_insideCodeLine(FALSE), m_normalHLNeedStartTag(TRUE),
+ m_insideSpecialHL(FALSE) {}
+ virtual ~XMLCodeGenerator() { }
+
+ void codify(const char *text)
+ {
+ XML_DB(("(codify \"%s\")\n",text));
+ if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
+ {
+ m_t << "<highlight class=\"normal\">";
+ m_normalHLNeedStartTag=FALSE;
+ }
+ writeXMLCodeString(m_t,text,col);
+ }
+ void writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip)
+ {
+ XML_DB(("(writeCodeLink)\n"));
+ if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
+ {
+ m_t << "<highlight class=\"normal\">";
+ m_normalHLNeedStartTag=FALSE;
+ }
+ writeXMLLink(m_t,ref,file,anchor,name,tooltip);
+ col+=strlen(name);
+ }
+ void startCodeLine()
+ {
+ XML_DB(("(startCodeLine)\n"));
+ m_t << "<codeline";
+ if (m_lineNumber!=-1)
+ {
+ m_t << " lineno=\"" << m_lineNumber << "\"";
+ if (!m_refId.isEmpty())
+ {
+ m_t << " refid=\"" << m_refId << "\"";
+ if (m_isMemberRef)
+ {
+ m_t << " refkind=\"member\"";
+ }
+ else
+ {
+ m_t << " refkind=\"compound\"";
+ }
+ }
+ if (!m_external.isEmpty())
+ {
+ m_t << " external=\"" << m_external << "\"";
+ }
+ }
+ m_t << ">";
+ m_insideCodeLine=TRUE;
+ col=0;
+ }
+ void endCodeLine()
+ {
+ XML_DB(("(endCodeLine)\n"));
+ if (!m_insideSpecialHL && !m_normalHLNeedStartTag)
+ {
+ m_t << "</highlight>";
+ m_normalHLNeedStartTag=TRUE;
+ }
+ m_t << "</codeline>" << endl; // non DocBook
+ m_lineNumber = -1;
+ m_refId.resize(0);
+ m_external.resize(0);
+ m_insideCodeLine=FALSE;
+ }
+ void startCodeAnchor(const char *id)
+ {
+ XML_DB(("(startCodeAnchor)\n"));
+ if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
+ {
+ m_t << "<highlight class=\"normal\">";
+ m_normalHLNeedStartTag=FALSE;
+ }
+ m_t << "<anchor id=\"" << id << "\">";
+ }
+ void endCodeAnchor()
+ {
+ XML_DB(("(endCodeAnchor)\n"));
+ m_t << "</anchor>";
+ }
+ void startFontClass(const char *colorClass)
+ {
+ XML_DB(("(startFontClass)\n"));
+ if (m_insideCodeLine && !m_insideSpecialHL && !m_normalHLNeedStartTag)
+ {
+ m_t << "</highlight>";
+ m_normalHLNeedStartTag=TRUE;
+ }
+ m_t << "<highlight class=\"" << colorClass << "\">"; // non DocBook
+ m_insideSpecialHL=TRUE;
+ }
+ void endFontClass()
+ {
+ XML_DB(("(endFontClass)\n"));
+ m_t << "</highlight>"; // non DocBook
+ m_insideSpecialHL=FALSE;
+ }
+ void writeCodeAnchor(const char *)
+ {
+ XML_DB(("(writeCodeAnchor)\n"));
+ }
+ void writeLineNumber(const char *extRef,const char *compId,
+ const char *anchorId,int l)
+ {
+ XML_DB(("(writeLineNumber)\n"));
+ // we remember the information provided here to use it
+ // at the <codeline> start tag.
+ m_lineNumber = l;
+ if (compId)
+ {
+ m_refId=compId;
+ if (anchorId) m_refId+=(QCString)"_1"+anchorId;
+ m_isMemberRef = anchorId!=0;
+ if (extRef) m_external=extRef;
+ }
+ }
+ void linkableSymbol(int, const char *,Definition *,Definition *)
+ {
+ }
+
+ void finish()
+ {
+ if (m_insideCodeLine) endCodeLine();
+ }
+
+ private:
+ FTextStream &m_t;
+ QCString m_refId;
+ QCString m_external;
+ int m_lineNumber;
+ bool m_isMemberRef;
+ int col;
+
+ bool m_insideCodeLine;
+ bool m_normalHLNeedStartTag;
+ bool m_insideSpecialHL;
+};
+
+
+static void writeTemplateArgumentList(ArgumentList *al,
+ FTextStream &t,
+ Definition *scope,
+ FileDef *fileScope,
+ int indent)
+{
+ QCString indentStr;
+ indentStr.fill(' ',indent);
+ if (al)
+ {
+ t << indentStr << "<templateparamlist>" << endl;
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ t << indentStr << " <param>" << endl;
+ if (!a->type.isEmpty())
+ {
+ t << indentStr << " <type>";
+ linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
+ t << "</type>" << endl;
+ }
+ if (!a->name.isEmpty())
+ {
+ t << indentStr << " <declname>" << a->name << "</declname>" << endl;
+ t << indentStr << " <defname>" << a->name << "</defname>" << endl;
+ }
+ if (!a->defval.isEmpty())
+ {
+ t << indentStr << " <defval>";
+ linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
+ t << "</defval>" << endl;
+ }
+ t << indentStr << " </param>" << endl;
+ }
+ t << indentStr << "</templateparamlist>" << endl;
+ }
+}
+
+static void writeMemberTemplateLists(MemberDef *md,FTextStream &t)
+{
+ LockingPtr<ArgumentList> templMd = md->templateArguments();
+ if (templMd!=0) // function template prefix
+ {
+ writeTemplateArgumentList(templMd.pointer(),t,md->getClassDef(),md->getFileDef(),8);
+ }
+}
+
+static void writeTemplateList(ClassDef *cd,FTextStream &t)
+{
+ writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
+}
+
+static void writeXMLDocBlock(FTextStream &t,
+ const QCString &fileName,
+ int lineNr,
+ Definition *scope,
+ MemberDef * md,
+ const QCString &text)
+{
+ QCString stext = text.stripWhiteSpace();
+ if (stext.isEmpty()) return;
+ // convert the documentation string into an abstract syntax tree
+ DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text+"\n",FALSE,FALSE);
+ // create a code generator
+ XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
+ // create a parse tree visitor for XML
+ XmlDocVisitor *visitor = new XmlDocVisitor(t,*xmlCodeGen);
+ // visit all nodes
+ root->accept(visitor);
+ // clean up
+ delete visitor;
+ delete xmlCodeGen;
+ delete root;
+
+}
+
+void writeXMLCodeBlock(FTextStream &t,FileDef *fd)
+{
+ ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
+ pIntf->resetCodeParserState();
+ XMLCodeGenerator *xmlGen = new XMLCodeGenerator(t);
+ pIntf->parseCode(*xmlGen,
+ 0,
+ fileToString(fd->absFilePath(),Config_getBool("FILTER_SOURCE_FILES")),
+ FALSE,
+ 0,
+ fd);
+ xmlGen->finish();
+ delete xmlGen;
+}
+
+static void writeMemberReference(FTextStream &t,Definition *def,MemberDef *rmd,const char *tagName)
+{
+ QCString scope = rmd->getScopeString();
+ QCString name = rmd->name();
+ if (!scope.isEmpty() && scope!=def->name())
+ {
+ name.prepend(scope+"::");
+ }
+ t << " <" << tagName << " refid=\"";
+ t << rmd->getOutputFileBase() << "_1" << rmd->anchor() << "\"";
+ if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
+ {
+ t << " compoundref=\"" << rmd->getBodyDef()->getOutputFileBase() << "\"";
+ t << " startline=\"" << rmd->getStartBodyLine() << "\"";
+ if (rmd->getEndBodyLine()!=-1)
+ {
+ t << " endline=\"" << rmd->getEndBodyLine() << "\"";
+ }
+ }
+ t << ">" << convertToXML(name) << "</" << tagName << ">" << endl;
+
+}
+
+static void stripQualifiers(QCString &typeStr)
+{
+ bool done=FALSE;
+ while (!done)
+ {
+ if (typeStr.stripPrefix("static "));
+ else if (typeStr.stripPrefix("virtual "));
+ else if (typeStr.stripPrefix("volatile "));
+ else if (typeStr=="virtual") typeStr="";
+ else done=TRUE;
+ }
+}
+
+static QCString classOutputFileBase(ClassDef *cd)
+{
+ static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ if (inlineGroupedClasses && cd->partOfGroups()!=0)
+ return cd->getXmlOutputFileBase();
+ else
+ return cd->getOutputFileBase();
+}
+
+static QCString memberOutputFileBase(MemberDef *md)
+{
+ static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
+ return md->getClassDef()->getXmlOutputFileBase();
+ else
+ return md->getOutputFileBase();
+}
+
+
+static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,Definition *def)
+{
+
+ // + declaration/definition arg lists
+ // + reimplements
+ // + reimplementedBy
+ // + exceptions
+ // + const/volatile specifiers
+ // - examples
+ // + source definition
+ // + source references
+ // + source referenced by
+ // - body code
+ // + template arguments
+ // (templateArguments(), definitionTemplateParameterLists())
+ // - call graph
+
+ // enum values are written as part of the enum
+ if (md->memberType()==MemberDef::EnumValue) return;
+ if (md->isHidden()) return;
+ //if (md->name().at(0)=='@') return; // anonymous member
+
+ // group members are only visible in their group
+ //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
+
+ QCString memType;
+ bool isFunc=FALSE;
+ switch (md->memberType())
+ {
+ case MemberDef::Define: memType="define"; break;
+ case MemberDef::EnumValue: ASSERT(0); break;
+ case MemberDef::Property: memType="property"; break;
+ case MemberDef::Event: memType="event"; break;
+ case MemberDef::Variable: memType="variable"; break;
+ case MemberDef::Typedef: memType="typedef"; break;
+ case MemberDef::Enumeration: memType="enum"; break;
+ case MemberDef::Function: memType="function"; isFunc=TRUE; break;
+ case MemberDef::Signal: memType="signal"; isFunc=TRUE; break;
+ case MemberDef::Friend: memType="friend"; isFunc=TRUE; break;
+ case MemberDef::DCOP: memType="dcop"; isFunc=TRUE; break;
+ case MemberDef::Slot: memType="slot"; isFunc=TRUE; break;
+ }
+
+ ti << " <member refid=\"" << memberOutputFileBase(md)
+ << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>"
+ << convertToXML(md->name()) << "</name></member>" << endl;
+
+ QCString scopeName;
+ if (md->getClassDef())
+ scopeName=md->getClassDef()->name();
+ else if (md->getNamespaceDef())
+ scopeName=md->getNamespaceDef()->name();
+
+ t << " <memberdef kind=\"";
+ //enum { define_t,variable_t,typedef_t,enum_t,function_t } xmlType = function_t;
+ t << memType << "\" id=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" // encoded `:' character (see util.cpp:convertNameToFile)
+ << md->anchor();
+ t << "\" prot=\"";
+ switch(md->protection())
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: t << "package"; break;
+ }
+ t << "\"";
+
+ t << " static=\"";
+ if (md->isStatic()) t << "yes"; else t << "no";
+ t << "\"";
+
+ if (isFunc)
+ {
+ LockingPtr<ArgumentList> al = md->argumentList();
+ t << " const=\"";
+ if (al!=0 && al->constSpecifier) t << "yes"; else t << "no";
+ t << "\"";
+
+ t << " explicit=\"";
+ if (md->isExplicit()) t << "yes"; else t << "no";
+ t << "\"";
+
+ t << " inline=\"";
+ if (md->isInline()) t << "yes"; else t << "no";
+ t << "\"";
+
+ if (md->isFinal())
+ {
+ t << " final=\"yes\"";
+ }
+
+ if (md->isSealed())
+ {
+ t << " sealed=\"yes\"";
+ }
+
+ if (md->isNew())
+ {
+ t << " new=\"yes\"";
+ }
+
+ if (md->isOptional())
+ {
+ t << " optional=\"yes\"";
+ }
+
+ if (md->isRequired())
+ {
+ t << " required=\"yes\"";
+ }
+
+ t << " virt=\"";
+ switch (md->virtualness())
+ {
+ case Normal: t << "non-virtual"; break;
+ case Virtual: t << "virtual"; break;
+ case Pure: t << "pure-virtual"; break;
+ default: ASSERT(0);
+ }
+ t << "\"";
+ }
+
+ if (md->memberType() == MemberDef::Variable)
+ {
+ //ArgumentList *al = md->argumentList();
+ //t << " volatile=\"";
+ //if (al && al->volatileSpecifier) t << "yes"; else t << "no";
+
+ t << " mutable=\"";
+ if (md->isMutable()) t << "yes"; else t << "no";
+ t << "\"";
+
+ if (md->isInitonly())
+ {
+ t << " initonly=\"yes\"";
+ }
+
+ }
+ else if (md->memberType() == MemberDef::Property)
+ {
+ t << " readable=\"";
+ if (md->isReadable()) t << "yes"; else t << "no";
+ t << "\"";
+
+ t << " writable=\"";
+ if (md->isWritable()) t << "yes"; else t << "no";
+ t << "\"";
+
+ t << " gettable=\"";
+ if (md->isGettable()) t << "yes"; else t << "no";
+ t << "\"";
+
+ t << " settable=\"";
+ if (md->isSettable()) t << "yes"; else t << "no";
+ t << "\"";
+
+ if (md->isAssign() || md->isCopy() || md->isRetain())
+ {
+ t << " accessor=\"";
+ if (md->isAssign()) t << "assign";
+ else if (md->isCopy()) t << "copy";
+ else if (md->isRetain()) t << "retain";
+ t << "\"";
+ }
+ }
+ else if (md->memberType() == MemberDef::Event)
+ {
+ t << " add=\"";
+ if (md->isAddable()) t << "yes"; else t << "no";
+ t << "\"";
+
+ t << " remove=\"";
+ if (md->isRemovable()) t << "yes"; else t << "no";
+ t << "\"";
+
+ t << " raise=\"";
+ if (md->isRaisable()) t << "yes"; else t << "no";
+ t << "\"";
+ }
+
+ t << ">" << endl;
+
+ if (md->memberType()!=MemberDef::Define &&
+ md->memberType()!=MemberDef::Enumeration
+ )
+ {
+ if (md->memberType()!=MemberDef::Typedef)
+ {
+ writeMemberTemplateLists(md,t);
+ }
+ QCString typeStr = md->typeString(); //replaceAnonymousScopes(md->typeString());
+ stripQualifiers(typeStr);
+ t << " <type>";
+ linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),typeStr);
+ t << "</type>" << endl;
+ t << " <definition>" << convertToXML(md->definition()) << "</definition>" << endl;
+ t << " <argsstring>" << convertToXML(md->argsString()) << "</argsstring>" << endl;
+ }
+
+ t << " <name>" << convertToXML(md->name()) << "</name>" << endl;
+
+ if (md->memberType() == MemberDef::Property)
+ {
+ if (md->isReadable())
+ t << " <read>" << convertToXML(md->getReadAccessor()) << "</read>" << endl;
+ if (md->isWritable())
+ t << " <write>" << convertToXML(md->getWriteAccessor()) << "</write>" << endl;
+ }
+ if (md->memberType()==MemberDef::Variable && md->bitfieldString())
+ {
+ QCString bitfield = md->bitfieldString();
+ if (bitfield.at(0)==':') bitfield=bitfield.mid(1);
+ t << " <bitfield>" << bitfield << "</bitfield>" << endl;
+ }
+
+ MemberDef *rmd = md->reimplements();
+ if (rmd)
+ {
+ t << " <reimplements refid=\""
+ << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
+ << convertToXML(rmd->name()) << "</reimplements>" << endl;
+ }
+ LockingPtr<MemberList> rbml = md->reimplementedBy();
+ if (rbml!=0)
+ {
+ MemberListIterator mli(*rbml);
+ for (mli.toFirst();(rmd=mli.current());++mli)
+ {
+ t << " <reimplementedby refid=\""
+ << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
+ << convertToXML(rmd->name()) << "</reimplementedby>" << endl;
+ }
+ }
+
+ if (isFunc) //function
+ {
+ LockingPtr<ArgumentList> declAl = md->declArgumentList();
+ LockingPtr<ArgumentList> defAl = md->argumentList();
+ if (declAl!=0 && declAl->count()>0)
+ {
+ ArgumentListIterator declAli(*declAl);
+ ArgumentListIterator defAli(*defAl);
+ Argument *a;
+ for (declAli.toFirst();(a=declAli.current());++declAli)
+ {
+ Argument *defArg = defAli.current();
+ t << " <param>" << endl;
+ if (!a->attrib.isEmpty())
+ {
+ t << " <attributes>";
+ writeXMLString(t,a->attrib);
+ t << "</attributes>" << endl;
+ }
+ if (!a->type.isEmpty())
+ {
+ t << " <type>";
+ linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),a->type);
+ t << "</type>" << endl;
+ }
+ if (!a->name.isEmpty())
+ {
+ t << " <declname>";
+ writeXMLString(t,a->name);
+ t << "</declname>" << endl;
+ }
+ if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
+ {
+ t << " <defname>";
+ writeXMLString(t,defArg->name);
+ t << "</defname>" << endl;
+ }
+ if (!a->array.isEmpty())
+ {
+ t << " <array>";
+ writeXMLString(t,a->array);
+ t << "</array>" << endl;
+ }
+ if (!a->defval.isEmpty())
+ {
+ t << " <defval>";
+ linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),a->defval);
+ t << "</defval>" << endl;
+ }
+ if (defArg && defArg->hasDocumentation())
+ {
+ t << " <briefdescription>";
+ writeXMLDocBlock(t,md->getDefFileName(),md->getDefLine(),
+ md->getOuterScope(),md,defArg->docs);
+ t << "</briefdescription>" << endl;
+ }
+ t << " </param>" << endl;
+ if (defArg) ++defAli;
+ }
+ }
+ }
+ else if (md->memberType()==MemberDef::Define &&
+ md->argsString()) // define
+ {
+ if (md->argumentList()->count()==0) // special case for "foo()" to
+ // disguish it from "foo".
+ {
+ t << " <param></param>" << endl;
+ }
+ else
+ {
+ ArgumentListIterator ali(*md->argumentList());
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ t << " <param><defname>" << a->type << "</defname></param>" << endl;
+ }
+ }
+ }
+ // avoid that extremely large tables are written to the output.
+ // todo: it's better to adhere to MAX_INITIALIZER_LINES.
+ if (!md->initializer().isEmpty() && md->initializer().length()<2000)
+ {
+ t << " <initializer>";
+ linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),md->initializer());
+ t << "</initializer>" << endl;
+ }
+
+ if (md->excpString())
+ {
+ t << " <exceptions>";
+ linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),md->excpString());
+ t << "</exceptions>" << endl;
+ }
+
+ if (md->memberType()==MemberDef::Enumeration) // enum
+ {
+ LockingPtr<MemberList> enumFields = md->enumFieldList();
+ if (enumFields!=0)
+ {
+ MemberListIterator emli(*enumFields);
+ MemberDef *emd;
+ for (emli.toFirst();(emd=emli.current());++emli)
+ {
+ ti << " <member refid=\"" << memberOutputFileBase(emd)
+ << "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>"
+ << convertToXML(emd->name()) << "</name></member>" << endl;
+
+ t << " <enumvalue id=\"" << memberOutputFileBase(emd) << "_1"
+ << emd->anchor() << "\" prot=\"";
+ switch (emd->protection())
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: t << "package"; break;
+ }
+ t << "\">" << endl;
+ t << " <name>";
+ writeXMLString(t,emd->name());
+ t << "</name>" << endl;
+ if (!emd->initializer().isEmpty())
+ {
+ t << " <initializer>";
+ writeXMLString(t,emd->initializer());
+ t << "</initializer>" << endl;
+ }
+ t << " <briefdescription>" << endl;
+ writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),emd->getOuterScope(),emd,emd->briefDescription());
+ t << " </briefdescription>" << endl;
+ t << " <detaileddescription>" << endl;
+ writeXMLDocBlock(t,emd->docFile(),emd->docLine(),emd->getOuterScope(),emd,emd->documentation());
+ t << " </detaileddescription>" << endl;
+ t << " </enumvalue>" << endl;
+ }
+ }
+ }
+ t << " <briefdescription>" << endl;
+ writeXMLDocBlock(t,md->briefFile(),md->briefLine(),md->getOuterScope(),md,md->briefDescription());
+ t << " </briefdescription>" << endl;
+ t << " <detaileddescription>" << endl;
+ writeXMLDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+ t << " </detaileddescription>" << endl;
+ t << " <inbodydescription>" << endl;
+ writeXMLDocBlock(t,md->docFile(),md->inbodyLine(),md->getOuterScope(),md,md->inbodyDocumentation());
+ t << " </inbodydescription>" << endl;
+ if (md->getDefLine()!=-1)
+ {
+ t << " <location file=\""
+ << md->getDefFileName() << "\" line=\""
+ << md->getDefLine() << "\"";
+ if (md->getStartBodyLine()!=-1)
+ {
+ FileDef *bodyDef = md->getBodyDef();
+ if (bodyDef)
+ {
+ t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
+ }
+ t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\""
+ << md->getEndBodyLine() << "\"";
+ }
+ t << "/>" << endl;
+ }
+
+ //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
+ LockingPtr<MemberSDict> mdict = md->getReferencesMembers();
+ if (mdict!=0)
+ {
+ MemberSDict::Iterator mdi(*mdict);
+ MemberDef *rmd;
+ for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ {
+ writeMemberReference(t,def,rmd,"references");
+ }
+ }
+ mdict = md->getReferencedByMembers();
+ if (mdict!=0)
+ {
+ MemberSDict::Iterator mdi(*mdict);
+ MemberDef *rmd;
+ for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ {
+ writeMemberReference(t,def,rmd,"referencedby");
+ }
+ }
+
+ t << " </memberdef>" << endl;
+}
+
+static void generateXMLSection(Definition *d,FTextStream &ti,FTextStream &t,
+ MemberList *ml,const char *kind,const char *header=0,
+ const char *documentation=0)
+{
+ if (ml==0) return;
+ MemberListIterator mli(*ml);
+ MemberDef *md;
+ int count=0;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ // namespace members are also inserted in the file scope, but
+ // to prevent this duplication in the XML output, we filter those here.
+ if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
+ {
+ count++;
+ }
+ }
+ if (count==0) return; // empty list
+
+ t << " <sectiondef kind=\"" << kind << "\">" << endl;
+ if (header)
+ {
+ t << " <header>" << convertToXML(header) << "</header>" << endl;
+ }
+ if (documentation)
+ {
+ t << " <description>";
+ writeXMLDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
+ t << "</description>" << endl;
+ }
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ // namespace members are also inserted in the file scope, but
+ // to prevent this duplication in the XML output, we filter those here.
+ if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
+ {
+ generateXMLForMember(md,ti,t,d);
+ }
+ }
+ t << " </sectiondef>" << endl;
+}
+
+static void writeListOfAllMembers(ClassDef *cd,FTextStream &t)
+{
+ t << " <listofallmembers>" << endl;
+ if (cd->memberNameInfoSDict())
+ {
+ MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
+ MemberNameInfo *mni;
+ for (mnii.toFirst();(mni=mnii.current());++mnii)
+ {
+ MemberNameInfoIterator mii(*mni);
+ MemberInfo *mi;
+ for (mii.toFirst();(mi=mii.current());++mii)
+ {
+ MemberDef *md=mi->memberDef;
+ if (md->name().at(0)!='@') // skip anonymous members
+ {
+ Protection prot = mi->prot;
+ Specifier virt=md->virtualness();
+ t << " <member refid=\"" << memberOutputFileBase(md) << "_1" <<
+ md->anchor() << "\" prot=\"";
+ switch (prot)
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: t << "package"; break;
+ }
+ t << "\" virt=\"";
+ switch(virt)
+ {
+ case Normal: t << "non-virtual"; break;
+ case Virtual: t << "virtual"; break;
+ case Pure: t << "pure-virtual"; break;
+ }
+ t << "\"";
+ if (!mi->ambiguityResolutionScope.isEmpty())
+ {
+ t << " ambiguityscope=\"" << convertToXML(mi->ambiguityResolutionScope) << "\"";
+ }
+ t << "><scope>" << convertToXML(cd->name()) << "</scope><name>" <<
+ convertToXML(md->name()) << "</name></member>" << endl;
+ }
+ }
+ }
+ }
+ t << " </listofallmembers>" << endl;
+}
+
+static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
+{
+ if (cl)
+ {
+ ClassSDict::Iterator cli(*cl);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
+ {
+ t << " <innerclass refid=\"" << cd->getOutputFileBase()
+ << "\" prot=\"";
+ switch(cd->protection())
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: t << "package"; break;
+ }
+ t << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
+ }
+ }
+ }
+}
+
+static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
+{
+ if (nl)
+ {
+ NamespaceSDict::Iterator nli(*nl);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
+ {
+ t << " <innernamespace refid=\"" << nd->getOutputFileBase()
+ << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
+ }
+ }
+ }
+}
+
+static void writeInnerFiles(const FileList *fl,FTextStream &t)
+{
+ if (fl)
+ {
+ QListIterator<FileDef> fli(*fl);
+ FileDef *fd;
+ for (fli.toFirst();(fd=fli.current());++fli)
+ {
+ t << " <innerfile refid=\"" << fd->getOutputFileBase()
+ << "\">" << convertToXML(fd->name()) << "</innerfile>" << endl;
+ }
+ }
+}
+
+static void writeInnerPages(const PageSDict *pl,FTextStream &t)
+{
+ if (pl)
+ {
+ PageSDict::Iterator pli(*pl);
+ PageDef *pd;
+ for (pli.toFirst();(pd=pli.current());++pli)
+ {
+ t << " <innerpage refid=\"" << pd->getOutputFileBase();
+ if (pd->getGroupDef())
+ {
+ t << "_" << pd->name();
+ }
+ t << "\">" << convertToXML(pd->title()) << "</innerpage>" << endl;
+ }
+ }
+}
+
+static void writeInnerGroups(const GroupList *gl,FTextStream &t)
+{
+ if (gl)
+ {
+ GroupListIterator gli(*gl);
+ GroupDef *sgd;
+ for (gli.toFirst();(sgd=gli.current());++gli)
+ {
+ t << " <innergroup refid=\"" << sgd->getOutputFileBase()
+ << "\">" << convertToXML(sgd->groupTitle())
+ << "</innergroup>" << endl;
+ }
+ }
+}
+
+static void writeInnerDirs(const DirList *dl,FTextStream &t)
+{
+ if (dl)
+ {
+ QListIterator<DirDef> subdirs(*dl);
+ DirDef *subdir;
+ for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
+ {
+ t << " <innerdir refid=\"" << subdir->getOutputFileBase()
+ << "\">" << convertToXML(subdir->displayName()) << "</innerdir>" << endl;
+ }
+ }
+}
+
+static void generateXMLForClass(ClassDef *cd,FTextStream &ti)
+{
+ // + brief description
+ // + detailed description
+ // + template argument list(s)
+ // - include file
+ // + member groups
+ // + inheritance diagram
+ // + list of direct super classes
+ // + list of direct sub classes
+ // + list of inner classes
+ // + collaboration diagram
+ // + list of all members
+ // + user defined member sections
+ // + standard member sections
+ // + detailed member documentation
+ // - examples using the class
+
+ if (cd->isReference()) return; // skip external references.
+ if (cd->isHidden()) return; // skip hidden classes.
+ if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
+ if (cd->templateMaster()!=0) return; // skip generated template instances.
+
+ msg("Generating XML output for class %s\n",cd->name().data());
+
+ ti << " <compound refid=\"" << classOutputFileBase(cd)
+ << "\" kind=\"" << cd->compoundTypeString()
+ << "\"><name>" << convertToXML(cd->name()) << "</name>" << endl;
+
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ writeXMLHeader(t);
+ t << " <compounddef id=\""
+ << classOutputFileBase(cd) << "\" kind=\""
+ << cd->compoundTypeString() << "\" prot=\"";
+ switch (cd->protection())
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: t << "package"; break;
+ }
+ t << "\">" << endl;
+ t << " <compoundname>";
+ writeXMLString(t,cd->name());
+ t << "</compoundname>" << endl;
+ if (cd->baseClasses())
+ {
+ BaseClassListIterator bcli(*cd->baseClasses());
+ BaseClassDef *bcd;
+ for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ {
+ t << " <basecompoundref ";
+ if (bcd->classDef->isLinkable())
+ {
+ t << "refid=\"" << classOutputFileBase(bcd->classDef) << "\" ";
+ }
+ t << "prot=\"";
+ switch (bcd->prot)
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: ASSERT(0); break;
+ }
+ t << "\" virt=\"";
+ switch(bcd->virt)
+ {
+ case Normal: t << "non-virtual"; break;
+ case Virtual: t << "virtual"; break;
+ case Pure: t <<"pure-virtual"; break;
+ }
+ t << "\">";
+ if (!bcd->templSpecifiers.isEmpty())
+ {
+ t << convertToXML(
+ insertTemplateSpecifierInScope(
+ bcd->classDef->name(),bcd->templSpecifiers)
+ );
+ }
+ else
+ {
+ t << convertToXML(bcd->classDef->displayName());
+ }
+ t << "</basecompoundref>" << endl;
+ }
+ }
+ if (cd->subClasses())
+ {
+ BaseClassListIterator bcli(*cd->subClasses());
+ BaseClassDef *bcd;
+ for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ {
+ t << " <derivedcompoundref refid=\""
+ << classOutputFileBase(bcd->classDef)
+ << "\" prot=\"";
+ switch (bcd->prot)
+ {
+ case Public: t << "public"; break;
+ case Protected: t << "protected"; break;
+ case Private: t << "private"; break;
+ case Package: ASSERT(0); break;
+ }
+ t << "\" virt=\"";
+ switch(bcd->virt)
+ {
+ case Normal: t << "non-virtual"; break;
+ case Virtual: t << "virtual"; break;
+ case Pure: t << "pure-virtual"; break;
+ }
+ t << "\">" << convertToXML(bcd->classDef->displayName())
+ << "</derivedcompoundref>" << endl;
+ }
+ }
+
+ IncludeInfo *ii=cd->includeInfo();
+ if (ii)
+ {
+ QCString nm = ii->includeName;
+ if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
+ if (!nm.isEmpty())
+ {
+ t << " <includes";
+ if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
+ {
+ t << " refid=\"" << ii->fileDef->getOutputFileBase() << "\"";
+ }
+ t << " local=\"" << (ii->local ? "yes" : "no") << "\">";
+ t << nm;
+ t << "</includes>" << endl;
+ }
+ }
+
+ writeInnerClasses(cd->getInnerClasses(),t);
+
+ writeTemplateList(cd,t);
+ if (cd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateXMLSection(cd,ti,t,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(cd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberList::detailedLists)==0)
+ {
+ generateXMLSection(cd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
+ }
+ }
+#if 0
+ generateXMLSection(cd,ti,t,cd->pubTypes,"public-type");
+ generateXMLSection(cd,ti,t,cd->pubMethods,"public-func");
+ generateXMLSection(cd,ti,t,cd->pubAttribs,"public-attrib");
+ generateXMLSection(cd,ti,t,cd->pubSlots,"public-slot");
+ generateXMLSection(cd,ti,t,cd->signals,"signal");
+ generateXMLSection(cd,ti,t,cd->dcopMethods,"dcop-func");
+ generateXMLSection(cd,ti,t,cd->properties,"property");
+ generateXMLSection(cd,ti,t,cd->events,"event");
+ generateXMLSection(cd,ti,t,cd->pubStaticMethods,"public-static-func");
+ generateXMLSection(cd,ti,t,cd->pubStaticAttribs,"public-static-attrib");
+ generateXMLSection(cd,ti,t,cd->proTypes,"protected-type");
+ generateXMLSection(cd,ti,t,cd->proMethods,"protected-func");
+ generateXMLSection(cd,ti,t,cd->proAttribs,"protected-attrib");
+ generateXMLSection(cd,ti,t,cd->proSlots,"protected-slot");
+ generateXMLSection(cd,ti,t,cd->proStaticMethods,"protected-static-func");
+ generateXMLSection(cd,ti,t,cd->proStaticAttribs,"protected-static-attrib");
+ generateXMLSection(cd,ti,t,cd->pacTypes,"package-type");
+ generateXMLSection(cd,ti,t,cd->pacMethods,"package-func");
+ generateXMLSection(cd,ti,t,cd->pacAttribs,"package-attrib");
+ generateXMLSection(cd,ti,t,cd->pacStaticMethods,"package-static-func");
+ generateXMLSection(cd,ti,t,cd->pacStaticAttribs,"package-static-attrib");
+ generateXMLSection(cd,ti,t,cd->priTypes,"private-type");
+ generateXMLSection(cd,ti,t,cd->priMethods,"private-func");
+ generateXMLSection(cd,ti,t,cd->priAttribs,"private-attrib");
+ generateXMLSection(cd,ti,t,cd->priSlots,"private-slot");
+ generateXMLSection(cd,ti,t,cd->priStaticMethods,"private-static-func");
+ generateXMLSection(cd,ti,t,cd->priStaticAttribs,"private-static-attrib");
+ generateXMLSection(cd,ti,t,cd->friends,"friend");
+ generateXMLSection(cd,ti,t,cd->related,"related");
+#endif
+
+ t << " <briefdescription>" << endl;
+ writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
+ t << " </briefdescription>" << endl;
+ t << " <detaileddescription>" << endl;
+ writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
+ t << " </detaileddescription>" << endl;
+ DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
+ if (!inheritanceGraph.isTrivial())
+ {
+ t << " <inheritancegraph>" << endl;
+ inheritanceGraph.writeXML(t);
+ t << " </inheritancegraph>" << endl;
+ }
+ DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
+ if (!collaborationGraph.isTrivial())
+ {
+ t << " <collaborationgraph>" << endl;
+ collaborationGraph.writeXML(t);
+ t << " </collaborationgraph>" << endl;
+ }
+ t << " <location file=\""
+ << cd->getDefFileName() << "\" line=\""
+ << cd->getDefLine() << "\"";
+ if (cd->getStartBodyLine()!=-1)
+ {
+ FileDef *bodyDef = cd->getBodyDef();
+ if (bodyDef)
+ {
+ t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
+ }
+ t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
+ << cd->getEndBodyLine() << "\"";
+ }
+ t << "/>" << endl;
+ writeListOfAllMembers(cd,t);
+ t << " </compounddef>" << endl;
+ t << "</doxygen>" << endl;
+
+ ti << " </compound>" << endl;
+}
+
+static void generateXMLForNamespace(NamespaceDef *nd,FTextStream &ti)
+{
+ // + contained class definitions
+ // + contained namespace definitions
+ // + member groups
+ // + normal members
+ // + brief desc
+ // + detailed desc
+ // + location
+ // - files containing (parts of) the namespace definition
+
+ if (nd->isReference() || nd->isHidden()) return; // skip external references
+
+ ti << " <compound refid=\"" << nd->getOutputFileBase()
+ << "\" kind=\"namespace\"" << "><name>"
+ << convertToXML(nd->name()) << "</name>" << endl;
+
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ writeXMLHeader(t);
+ t << " <compounddef id=\""
+ << nd->getOutputFileBase() << "\" kind=\"namespace\">" << endl;
+ t << " <compoundname>";
+ writeXMLString(t,nd->name());
+ t << "</compoundname>" << endl;
+
+ writeInnerClasses(nd->getClassSDict(),t);
+ writeInnerNamespaces(nd->getNamespaceSDict(),t);
+
+ if (nd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateXMLSection(nd,ti,t,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(nd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberList::declarationLists)!=0)
+ {
+ generateXMLSection(nd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
+ }
+ }
+#if 0
+ generateXMLSection(nd,ti,t,&nd->decDefineMembers,"define");
+ generateXMLSection(nd,ti,t,&nd->decProtoMembers,"prototype");
+ generateXMLSection(nd,ti,t,&nd->decTypedefMembers,"typedef");
+ generateXMLSection(nd,ti,t,&nd->decEnumMembers,"enum");
+ generateXMLSection(nd,ti,t,&nd->decFuncMembers,"func");
+ generateXMLSection(nd,ti,t,&nd->decVarMembers,"var");
+#endif
+
+ t << " <briefdescription>" << endl;
+ writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
+ t << " </briefdescription>" << endl;
+ t << " <detaileddescription>" << endl;
+ writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
+ t << " </detaileddescription>" << endl;
+ t << " <location file=\""
+ << nd->getDefFileName() << "\" line=\""
+ << nd->getDefLine() << "\"/>" << endl;
+ t << " </compounddef>" << endl;
+ t << "</doxygen>" << endl;
+
+ ti << " </compound>" << endl;
+}
+
+static void generateXMLForFile(FileDef *fd,FTextStream &ti)
+{
+ // + includes files
+ // + includedby files
+ // + include graph
+ // + included by graph
+ // + contained class definitions
+ // + contained namespace definitions
+ // + member groups
+ // + normal members
+ // + brief desc
+ // + detailed desc
+ // + source code
+ // + location
+ // - number of lines
+
+ if (fd->isReference()) return; // skip external references
+
+ ti << " <compound refid=\"" << fd->getOutputFileBase()
+ << "\" kind=\"file\"><name>" << convertToXML(fd->name())
+ << "</name>" << endl;
+
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ writeXMLHeader(t);
+ t << " <compounddef id=\""
+ << fd->getOutputFileBase() << "\" kind=\"file\">" << endl;
+ t << " <compoundname>";
+ writeXMLString(t,fd->name());
+ t << "</compoundname>" << endl;
+
+ IncludeInfo *inc;
+
+ if (fd->includeFileList())
+ {
+ QListIterator<IncludeInfo> ili1(*fd->includeFileList());
+ for (ili1.toFirst();(inc=ili1.current());++ili1)
+ {
+ t << " <includes";
+ if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
+ {
+ t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
+ }
+ t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
+ t << inc->includeName;
+ t << "</includes>" << endl;
+ }
+ }
+
+ if (fd->includedByFileList())
+ {
+ QListIterator<IncludeInfo> ili2(*fd->includedByFileList());
+ for (ili2.toFirst();(inc=ili2.current());++ili2)
+ {
+ t << " <includedby";
+ if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
+ {
+ t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
+ }
+ t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
+ t << inc->includeName;
+ t << "</includedby>" << endl;
+ }
+ }
+
+ DotInclDepGraph incDepGraph(fd,FALSE);
+ if (!incDepGraph.isTrivial())
+ {
+ t << " <incdepgraph>" << endl;
+ incDepGraph.writeXML(t);
+ t << " </incdepgraph>" << endl;
+ }
+
+ DotInclDepGraph invIncDepGraph(fd,TRUE);
+ if (!invIncDepGraph.isTrivial())
+ {
+ t << " <invincdepgraph>" << endl;
+ invIncDepGraph.writeXML(t);
+ t << " </invincdepgraph>" << endl;
+ }
+
+ if (fd->getClassSDict())
+ {
+ writeInnerClasses(fd->getClassSDict(),t);
+ }
+ if (fd->getNamespaceSDict())
+ {
+ writeInnerNamespaces(fd->getNamespaceSDict(),t);
+ }
+
+ if (fd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateXMLSection(fd,ti,t,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(fd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberList::declarationLists)!=0)
+ {
+ generateXMLSection(fd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
+ }
+ }
+#if 0
+ generateXMLSection(fd,ti,t,fd->decDefineMembers,"define");
+ generateXMLSection(fd,ti,t,fd->decProtoMembers,"prototype");
+ generateXMLSection(fd,ti,t,fd->decTypedefMembers,"typedef");
+ generateXMLSection(fd,ti,t,fd->decEnumMembers,"enum");
+ generateXMLSection(fd,ti,t,fd->decFuncMembers,"func");
+ generateXMLSection(fd,ti,t,fd->decVarMembers,"var");
+#endif
+
+ t << " <briefdescription>" << endl;
+ writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
+ t << " </briefdescription>" << endl;
+ t << " <detaileddescription>" << endl;
+ writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
+ t << " </detaileddescription>" << endl;
+ if (Config_getBool("XML_PROGRAMLISTING"))
+ {
+ t << " <programlisting>" << endl;
+ writeXMLCodeBlock(t,fd);
+ t << " </programlisting>" << endl;
+ }
+ t << " <location file=\"" << fd->getDefFileName() << "\"/>" << endl;
+ t << " </compounddef>" << endl;
+ t << "</doxygen>" << endl;
+
+ ti << " </compound>" << endl;
+}
+
+static void generateXMLForGroup(GroupDef *gd,FTextStream &ti)
+{
+ // + members
+ // + member groups
+ // + files
+ // + classes
+ // + namespaces
+ // - packages
+ // + pages
+ // + child groups
+ // - examples
+ // + brief description
+ // + detailed description
+
+ if (gd->isReference()) return; // skip external references
+
+ ti << " <compound refid=\"" << gd->getOutputFileBase()
+ << "\" kind=\"group\"><name>" << convertToXML(gd->name()) << "</name>" << endl;
+
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+ writeXMLHeader(t);
+ t << " <compounddef id=\""
+ << gd->getOutputFileBase() << "\" kind=\"group\">" << endl;
+ t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>" << endl;
+ t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
+
+ writeInnerFiles(gd->getFiles(),t);
+ writeInnerClasses(gd->getClasses(),t);
+ writeInnerNamespaces(gd->getNamespaces(),t);
+ writeInnerPages(gd->getPages(),t);
+ writeInnerGroups(gd->getSubGroups(),t);
+
+ if (gd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateXMLSection(gd,ti,t,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(gd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberList::declarationLists)!=0)
+ {
+ generateXMLSection(gd,ti,t,ml,g_xmlSectionMapper.find(ml->listType()));
+ }
+ }
+#if 0
+ generateXMLSection(gd,ti,t,&gd->decDefineMembers,"define");
+ generateXMLSection(gd,ti,t,&gd->decProtoMembers,"prototype");
+ generateXMLSection(gd,ti,t,&gd->decTypedefMembers,"typedef");
+ generateXMLSection(gd,ti,t,&gd->decEnumMembers,"enum");
+ generateXMLSection(gd,ti,t,&gd->decFuncMembers,"func");
+ generateXMLSection(gd,ti,t,&gd->decVarMembers,"var");
+#endif
+
+ t << " <briefdescription>" << endl;
+ writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
+ t << " </briefdescription>" << endl;
+ t << " <detaileddescription>" << endl;
+ writeXMLDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
+ t << " </detaileddescription>" << endl;
+ t << " </compounddef>" << endl;
+ t << "</doxygen>" << endl;
+
+ ti << " </compound>" << endl;
+}
+
+static void generateXMLForDir(DirDef *dd,FTextStream &ti)
+{
+ if (dd->isReference()) return; // skip external references
+ ti << " <compound refid=\"" << dd->getOutputFileBase()
+ << "\" kind=\"dir\"><name>" << convertToXML(dd->displayName())
+ << "</name>" << endl;
+
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+ writeXMLHeader(t);
+ t << " <compounddef id=\""
+ << dd->getOutputFileBase() << "\" kind=\"dir\">" << endl;
+ t << " <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>" << endl;
+
+ writeInnerDirs(&dd->subDirs(),t);
+ writeInnerFiles(dd->getFiles(),t);
+
+ t << " <briefdescription>" << endl;
+ writeXMLDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
+ t << " </briefdescription>" << endl;
+ t << " <detaileddescription>" << endl;
+ writeXMLDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
+ t << " </detaileddescription>" << endl;
+ t << " <location file=\"" << dd->name() << "\"/>" << endl;
+ t << " </compounddef>" << endl;
+ t << "</doxygen>" << endl;
+
+ ti << " </compound>" << endl;
+}
+
+static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
+{
+ // + name
+ // + title
+ // + documentation
+
+ const char *kindName = isExample ? "example" : "page";
+
+ if (pd->isReference()) return;
+
+ QCString pageName = pd->getOutputFileBase();
+ if (pd->getGroupDef())
+ {
+ pageName+=(QCString)"_"+pd->name();
+ }
+ if (pageName=="index") pageName="indexpage"; // to prevent overwriting the generated index page.
+
+ ti << " <compound refid=\"" << pageName
+ << "\" kind=\"" << kindName << "\"><name>" << convertToXML(pd->name())
+ << "</name>" << endl;
+
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ QCString fileName=outputDirectory+"/"+pageName+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+ writeXMLHeader(t);
+ t << " <compounddef id=\"" << pageName;
+ t << "\" kind=\"" << kindName << "\">" << endl;
+ t << " <compoundname>" << convertToXML(pd->name())
+ << "</compoundname>" << endl;
+
+ SectionInfo *si = Doxygen::sectionDict.find(pd->name());
+ if (si)
+ {
+ t << " <title>" << convertToXML(si->title) << "</title>" << endl;
+ }
+ writeInnerPages(pd->getSubPages(),t);
+ t << " <detaileddescription>" << endl;
+ if (isExample)
+ {
+ writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
+ pd->documentation()+"\n\\include "+pd->name());
+ }
+ else
+ {
+ writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
+ pd->documentation());
+ }
+ t << " </detaileddescription>" << endl;
+
+ t << " </compounddef>" << endl;
+ t << "</doxygen>" << endl;
+
+ ti << " </compound>" << endl;
+}
+
+void generateXML()
+{
+
+ // + classes
+ // + namespaces
+ // + files
+ // + groups
+ // + related pages
+ // - examples
+
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ if (outputDirectory.isEmpty())
+ {
+ outputDirectory=QDir::currentDirPath();
+ }
+ else
+ {
+ QDir dir(outputDirectory);
+ if (!dir.exists())
+ {
+ dir.setPath(QDir::currentDirPath());
+ if (!dir.mkdir(outputDirectory))
+ {
+ err("error: tag XML_OUTPUT: Output directory `%s' does not "
+ "exist and cannot be created\n",outputDirectory.data());
+ exit(1);
+ }
+ else if (!Config_getBool("QUIET"))
+ {
+ err("notice: Output directory `%s' does not exist. "
+ "I have created it for you.\n", outputDirectory.data());
+ }
+ dir.cd(outputDirectory);
+ }
+ outputDirectory=dir.absPath();
+ }
+
+ QDir dir(outputDirectory);
+ if (!dir.exists())
+ {
+ dir.setPath(QDir::currentDirPath());
+ if (!dir.mkdir(outputDirectory))
+ {
+ err("Cannot create directory %s\n",outputDirectory.data());
+ return;
+ }
+ }
+ QDir xmlDir(outputDirectory);
+ createSubDirs(xmlDir);
+ QCString fileName=outputDirectory+"/index.xsd";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ f.writeBlock(index_xsd,strlen(index_xsd));
+ f.close();
+
+ fileName=outputDirectory+"/compound.xsd";
+ f.setName(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ f.writeBlock(compound_xsd,strlen(compound_xsd));
+ f.close();
+
+ fileName=outputDirectory+"/index.xml";
+ f.setName(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ // write index header
+ t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
+ t << "<doxygenindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
+ t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" ";
+ t << "version=\"" << versionString << "\">" << endl;
+
+ {
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ generateXMLForClass(cd,t);
+ }
+ }
+ //{
+ // ClassSDict::Iterator cli(Doxygen::hiddenClasses);
+ // ClassDef *cd;
+ // for (cli.toFirst();(cd=cli.current());++cli)
+ // {
+ // msg("Generating XML output for class %s\n",cd->name().data());
+ // generateXMLForClass(cd,t);
+ // }
+ //}
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ msg("Generating XML output for namespace %s\n",nd->name().data());
+ generateXMLForNamespace(nd,t);
+ }
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ msg("Generating XML output for file %s\n",fd->name().data());
+ generateXMLForFile(fd,t);
+ }
+ }
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+ for (;(gd=gli.current());++gli)
+ {
+ msg("Generating XML output for group %s\n",gd->name().data());
+ generateXMLForGroup(gd,t);
+ }
+ {
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ msg("Generating XML output for page %s\n",pd->name().data());
+ generateXMLForPage(pd,t,FALSE);
+ }
+ }
+ {
+ DirDef *dir;
+ DirSDict::Iterator sdi(*Doxygen::directories);
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ msg("Generate XML output for dir %s\n",dir->name().data());
+ generateXMLForDir(dir,t);
+ }
+ }
+ {
+ PageSDict::Iterator pdi(*Doxygen::exampleSDict);
+ PageDef *pd=0;
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ msg("Generating XML output for example %s\n",pd->name().data());
+ generateXMLForPage(pd,t,TRUE);
+ }
+ }
+ if (Doxygen::mainPage)
+ {
+ msg("Generating XML output for the main page\n");
+ generateXMLForPage(Doxygen::mainPage,t,FALSE);
+ }
+
+ //t << " </compoundlist>" << endl;
+ t << "</doxygenindex>" << endl;
+
+ writeCombineScript();
+}
+
+
diff --git a/src/xmlgen.h b/src/xmlgen.h
new file mode 100644
index 0000000..eaff9b4
--- /dev/null
+++ b/src/xmlgen.h
@@ -0,0 +1,20 @@
+/******************************************************************************
+ *
+ * $Id: xmlgen.h,v 1.2 2001/01/01 10:15:18 root Exp $
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ */
+
+#ifndef XMLGEN_H
+#define XMLGEN_H
+
+void generateXML();
+
+#endif
diff --git a/tmake/CHANGES b/tmake/CHANGES
new file mode 100644
index 0000000..ce686e9
--- /dev/null
+++ b/tmake/CHANGES
@@ -0,0 +1,49 @@
+ Changes from version 1.2 to 1.3
+
+* Improved Qt 2.0 support.
+
+* INCLUDEPATH can have directories containing whitespace (use semicolon)
+ as separator.
+
+* Many, many code fixes and doc improvements.
+
+
+ Changes from version 1.1 to 1.2
+
+* tmake is no longer restricted to C++ only. You can now use both C++
+ and C files in your project. Thanks to Ulrich Ring for valuable feed-
+ back and comments.
+
+* Added support for building DLL libraries under Windows.
+ NOTE: Qt 1.42 and later now uses qtmain.lib in addition to qt.lib
+ when your application uses the Qt DLL. Add "DEFINES = QT_DLL" to
+ your project file to use the Qt DLL.
+
+* New dist target added in the app and lib templates.
+ Run "make dist" to pack all files in your project using tar/gzip or zip.
+ Thanks to Kalle Dalheimer for this patch.
+
+* Fixed bad command line interpretation bug in tmake.exe and progen.exe.
+
+* Added support for Borland C++ builder 3.
+
+* Initial support for QNX/g++ and the IBM Visual Age compiler on Win32.
+ Thanks to Igor Kovalenko and Joost Kraaijeveld.
+
+* Many fixes in tmake.conf for several Unix configurations.
+
+
+ Changes from version 1.0 to 1.1
+
+* Provides tmake.exe and progen.exe for Windows users without perl.
+
+* Added many new Unix templates.
+
+* Added subdirs.t templates.
+
+* Added system-dependent project settings
+ (e.g. solaris-cc:TMAKE_CFLAGS = -pts)
+
+* Many bug fixes and improvements for existing templates.
+
+* Improved documentation.
diff --git a/tmake/LICENSE b/tmake/LICENSE
new file mode 100644
index 0000000..7262d5a
--- /dev/null
+++ b/tmake/LICENSE
@@ -0,0 +1,9 @@
+ License Statement for tmake
+
+Copyright (C) 1996-1999 by Troll Tech AS. All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided
+that the this copyright notice appears in all copies.
+No representations are made about the suitability of this software for any
+purpose. It is provided "as is" without express or implied warranty.
diff --git a/tmake/README b/tmake/README
new file mode 100644
index 0000000..b049d32
--- /dev/null
+++ b/tmake/README
@@ -0,0 +1,10 @@
+ tmake version 1.3
+
+tmake is an easy-to-use tool for creating and maintaining makefiles across
+many platforms and compilers. For information about installing and using
+tmake, see:
+
+ doc/tmake.html -- User's Guide
+ doc/tmake_ref.html -- Reference Manual
+
+Download the latest version from: <ftp://ftp.troll.no/freebies/tmake>
diff --git a/tmake/bin/progen b/tmake/bin/progen
new file mode 100644
index 0000000..5be6411
--- /dev/null
+++ b/tmake/bin/progen
@@ -0,0 +1,249 @@
+#!/usr/bin/perl
+############################################################################
+#
+#
+# Generates a tmake project file.
+#
+# Copyright (C) 1996-1998 by Troll Tech AS. All rights reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that this copyright notice appears in all copies.
+# No representations are made about the suitability of this software for any
+# purpose. It is provided "as is" without express or implied warranty.
+#
+############################################################################
+
+# Default project settings
+$project{"TEMPLATE"} = "app";
+$project{"CONFIG"} = "qt warn_on release";
+
+@project_extra = ();
+
+while ( @ARGV ) { # parse command line args
+ $_ = shift @ARGV;
+ if ( s/^-// ) {
+ if ( /^o(.*)/ ) {
+ $outfile = ($1 eq "") ? shift @ARGV : $1;
+ ($outfile eq "-") && ($outfile = "");
+ } elsif ( /^n(.*)/ ) {
+ $project{"TARGET"} = ($1 eq "") ? shift @ARGV : $1;
+ } elsif ( /^t(.*)/ ) {
+ $project{"TEMPLATE"} = ($1 eq "") ? shift @ARGV : $1;
+ $project{"TEMPLATE"} =~ s/\.t$//i;
+ } elsif ( /lower/ ) {
+ $tolower = 1;
+ } else {
+ &progen_usage;
+ }
+ } elsif ( /^\s*(?:[\w\-]+:)?\w+\s*[\+\-\*\/]?=/ ) { # project override
+ push( @project_extra, $_ );
+ } else {
+ push (@files, $_ );
+ }
+}
+
+$outfile eq "" || open(STDOUT,">" . $outfile) ||
+ &progen_error("Can't create \"$outfile\"");
+
+if ( ! @files ) {
+ @files = &find_files(".",".*",1);
+}
+
+if ( $tolower ) {
+ foreach $f ( @files ) {
+ $f =~ tr/A-Z/a-z/;
+ }
+}
+
+@hdr = sort grep(/\.(h|hh|hpp|hxx)$/i,@files);
+@src = sort grep(/\.(c|cpp|cc|cxx)$/i && ! /moc_/i,@files);
+
+# Remove source files that are included by other source files
+foreach $f ( @src ) {
+ $srcdict{$f} = 1;
+}
+foreach $f ( @src ) {
+ if ( open(F,"< $f") ) {
+ while ( <F> ) {
+ if ( /^\s*#\s*include\s+\"([^\"]*)\"/ ) {
+ $srcdict{$1} = 0;
+ }
+ }
+ }
+}
+foreach $f( @src ) {
+ $srcdict{$f} && (push(@src2,$f));
+}
+@src = @src2;
+
+$project{"HEADERS"} = join(" ",sort @hdr);
+$project{"SOURCES"} = join(" ",sort @src);
+
+foreach $p ( @project_extra ) {
+ if ( $p =~ /^\s*((?:[\w\-]+:)?\w+)\s*([\+\-\*\/])?=\s*(.*)/ ) {
+ if ( $project{$1} ne "" ) {
+ Project($p);
+ }
+ }
+}
+
+$project{"HEADERS"} =~ s/\s+/ \\\n\t\t /g;
+$project{"SOURCES"} =~ s/\s+/ \\\n\t\t /g;
+
+print "TEMPLATE\t= " . $project{"TEMPLATE"} . "\n";
+print "CONFIG\t\t= " . $project{"CONFIG"} . "\n";
+print "HEADERS\t\t= " . $project{"HEADERS"} . "\n";
+print "SOURCES\t\t= " . $project{"SOURCES"} . "\n";
+if ( $project{"TARGET"} ne "" ) {
+ print "TARGET\t\t= " . $project{"TARGET"} . "\n";
+}
+
+foreach ( @project_extra ) {
+ if ( /^\s*((?:[\w\-]+:)?\w+)\s*([\+\-\*\/])?=\s*(.*)/ ) {
+ if ( $project{$1} eq "" ) {
+ $t = $1;
+ if ( length($t) < 8 ) {
+ $t .= "\t\t";
+ } elsif ( length($t) < 16 ) {
+ $t .= "\t";
+ } else {
+ $t .= " ";
+ }
+ print "$t$2= $3\n";
+ }
+ }
+}
+
+exit 0;
+
+
+#
+# progen_usage()
+#
+# Prints a message about program usage and exits
+#
+
+sub progen_usage {
+ print STDERR "Usage:\n progen [options] [files]\n";
+ print STDERR "Options:\n";
+ print STDERR " -lower Lower-case letters filenames (useful for non-Unix)\n";
+ print STDERR " -n name Specify a project name (= TARGET)\n";
+ print STDERR " -o file Write output to \"file\"\n";
+ print STDERR " -t file Specify a template file other than qtapp\n";
+ exit 1;
+}
+
+
+#
+# progen_error(msg)
+#
+# Prints the message and exits
+#
+
+sub progen_error {
+ my($msg) = @_;
+ print STDERR "progen error: " . $msg . "\n";
+ exit 1;
+}
+
+
+#
+# Finds files.
+#
+# Examples:
+# find_files("/usr","\.cpp$",1) - finds .cpp files in /usr and below
+# find_files("/tmp","^#",0) - finds #* files in /tmp
+#
+
+sub find_files {
+ my($dir,$match,$descend) = @_;
+ my($file,$p,@files);
+ local(*D);
+ $dir =~ s=\\=/=g;
+ ($dir eq "") && ($dir = ".");
+ if ( opendir(D,$dir) ) {
+ if ( $dir eq "." ) {
+ $dir = "";
+ } else {
+ ($dir =~ /\/$/) || ($dir .= "/");
+ }
+ foreach $file ( readdir(D) ) {
+ next if ( $file =~ /^\.\.?$/ );
+ $p = $dir . $file;
+ ($file =~ /$match/i) && (push @files, $p);
+ if ( $descend && -d $p && ! -l $p ) {
+ push @files, &find_files($p,$match,$descend);
+ }
+ }
+ closedir(D);
+ }
+ return @files;
+}
+
+
+#
+# strip_project_val(tag)
+#
+# Strips white space from project value strings.
+#
+
+sub strip_project_val {
+ my($v) = @_;
+ $v =~ s/^\s+//; # trim white space
+ $v =~ s/\s+$//;
+ return $v;
+}
+
+
+#
+# Project(strings)
+#
+# This is a powerful function for setting or reading project variables.
+# Returns the resulting project variables (joined with space between).
+#
+# This is a slightly modified version of the Project function in tmake.
+
+sub Project {
+ my @settings = @_;
+ my($r,$t,$s,$v,$p,$c);
+ $r = "";
+ foreach ( @settings ) {
+ $v = $_;
+ if ( $v =~ s/^\s*((?:[\w\-]+:)?\w+)\s*(\+=|\*=|\-=|\/=|=)\s*// ) {
+ $t = $1;
+ $s = $2;
+ $v = strip_project_val($v);
+ $p = $project{$t};
+ if ( $s eq "=" ) { # set variable
+ $p = $v;
+ } elsif ( $s eq "+=" ) { # append
+ if ( $p eq "" ) {
+ $p = $v;
+ } else {
+ $p .= " " . $v;
+ }
+ } elsif ( $s eq "*=" ) { # append if not contained
+ if ( !($p =~ /(?:^|\s)\Q$v\E(?:\s|$)/) ) {
+ if ( $p eq "" ) {
+ $p = $v;
+ } else {
+ $p .= " " . $v;
+ }
+ }
+ } elsif ( $s eq "-=" ) { # subtract
+ $p =~ s/$v//g;
+ } elsif ( $s eq "/=" ) { # sed
+ $cmd = '$p =~ ' . $v;
+ eval $cmd;
+ }
+ $project{$t} = strip_project_val($p);
+ } else {
+ $p = strip_project_val($project{$v});
+ }
+ if ( $p ne "" ) {
+ $r = ($r eq "") ? $p : ($r . " " . $p);
+ }
+ }
+ return $r;
+}
diff --git a/tmake/bin/tmake b/tmake/bin/tmake
new file mode 100644
index 0000000..9158d7a
--- /dev/null
+++ b/tmake/bin/tmake
@@ -0,0 +1,1262 @@
+#!/usr/bin/perl
+############################################################################
+#
+#
+# Creates a Makefile from a template and a project file.
+#
+# Copyright (C) 1996-1998 by Troll Tech AS. All rights reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that this copyright notice appears in all copies.
+# No representations are made about the suitability of this software for any
+# purpose. It is provided "as is" without express or implied warranty.
+#
+#
+# Some important, global variables in tmake:
+# cpp_ext C++ extension added to moc output (.cpp)
+# obj_ext Object file extension (.o on Unix, .obj otherwise)
+# moc_aware Will scan for files containing Qt signals/slots
+# moc_pre Moc prefix for generated moc file: x.h -> moc_x.cpp
+# moc_ext Moc extension for generated moc file: x.cpp -> x.moc
+# moc_cmd The moc command in your makefile, $(MOC)
+# linebreak Line break character (\)
+# dir_sep Directory separator (/ on Unix, \ on Windows)
+# is_unix Autodetected. If not Unix, assume Windows (Win32).
+#
+# If you need to customize any of these settings, do it before
+# calling StdInit() in the template file.
+#
+############################################################################
+
+$TMAKE_VERSION = "1.3";
+
+if ($] < 5.0) {
+ &tmake_error("This program requires perl version 5 or newer");
+}
+
+$cpp_ext = "cpp";
+$moc_aware = 0;
+$moc_pre = "moc_";
+$moc_ext = "moc";
+$moc_cmd = '$(MOC)';
+$linebreak = "\\";
+$really_unix = &check_unix();
+$is_unix = $really_unix;
+$dir_sep = $is_unix ? "/" : "\\";
+$obj_ext = $is_unix ? "o" : "obj";
+$depend_path = "";
+$nodepend = 0;
+$output_count = 0;
+$notrim_whitespace = 0;
+$read_tmakeconf = 0;
+
+$template_name = "";
+$project_name = "";
+$outfile = "";
+%project = ();
+$eval_quit = 0;
+
+$project{"TMAKEPATH"} = $ENV{"TMAKEPATH"} . ";" . $ENV{"HOME"} . "/.tmake/";
+
+while ( @ARGV ) { # parse command line args
+ $_ = shift @ARGV;
+ if ( s/^-// ) {
+ if ( /^e(.*)/ ) {
+ if ( ! $read_tmakeconf ) {
+ $read_tmakeconf = 1;
+ &ScanProject( &find_template("tmake.conf") );
+ }
+ $text = "";
+ eval( ($1 eq "") ? shift @ARGV : $1 );
+ die $@ if $@;
+ print $text . "\n" if ($text ne "");
+ $eval_quit = 1;
+ } elsif ( /^t(.*)/ ) {
+ $template_name = ($1 eq "") ? shift @ARGV : $1;
+ } elsif ( /^o(.*)/ ) {
+ $outfile = ($1 eq "") ? shift @ARGV : $1;
+ ($outfile eq "-") && ($outfile = "");
+ if ( $outfile ne "" ) {
+ open(STDOUT,">" . fix_path($outfile)) ||
+ &tmake_error("Can't create \"$outfile\"");
+ }
+ } elsif ( /^p(.*)/ ) {
+ #
+ # The -p option is obsolete and will be removed in the next
+ # tmake release.
+ #
+ &tmake_warning( "-p option obsolete, instead use \"tmake file1.pro file2.pro ...\"");
+ my($pf) = ($1 eq "") ? shift @ARGV : $1;
+ if ( ! $read_tmakeconf ) {
+ $read_tmakeconf = 1;
+ &ScanProject( &find_template("tmake.conf") );
+ }
+ if ( ! ($pf =~ /\.pro$/i) && -f fix_path($pf . ".pro") ) {
+ $pf .= ".pro";
+ }
+ if ( $project_name eq "" ) {
+ $project_name = $pf;
+ $project{"PROJECT"} = $project_name;
+ $project{"PROJECT"} =~ s/\.pro$//i;
+ $project{"TARGET"} = $project{"PROJECT"};
+ }
+ if ( !&ScanProject($pf) ) {
+ &tmake_error("Can't open project file \"$pf\"");
+ }
+ } elsif ( /^unix$/ ) {
+ $is_unix = 1;
+ $dir_sep = "/";
+ $obj_ext = "o";
+ } elsif ( /^win32$/ ) {
+ $is_unix = 0;
+ $dir_sep = "\\";
+ $obj_ext = "obj";
+ } elsif ( /^nodepend$/ ) {
+ $nodepend = 1; # don't generate dependencies
+ } elsif ( /^v$/ ) {
+ $verbose = 1;
+ } else {
+ &tmake_usage();
+ }
+ } elsif ( /^\s*((?:[^:\s]*?:)?)(\w+)\s*(\+=|\*=|\-=|\/=|=)/ ) {
+ if ( ! $read_tmakeconf && ! (/^\s*TMAKEPATH/) ) {
+ $read_tmakeconf = 1;
+ &ScanProject( &find_template("tmake.conf") );
+ }
+ Project( $_ ); # manual project setting
+ } else {
+ my($pf) = $_;
+ if ( ! $read_tmakeconf ) {
+ $read_tmakeconf = 1;
+ &ScanProject( &find_template("tmake.conf") );
+ }
+ if ( ! ($pf =~ /\.pro$/i) && -f fix_path($pf . ".pro") ) {
+ $pf .= ".pro";
+ }
+ if ( $project_name eq "" ) {
+ $project_name = $pf;
+ $project{"PROJECT"} = $project_name;
+ $project{"PROJECT"} =~ s/\.pro$//i;
+ $project{"TARGET"} = $project{"PROJECT"};
+ }
+ if ( !&ScanProject($pf) ) {
+ &tmake_error("Can't open project file \"$pf\"");
+ }
+ }
+}
+
+&tmake_verb("Version $TMAKE_VERSION (runtime environment: " .
+ ($really_unix ? "Unix" : "Win32") . ")\n" );
+
+if ( $eval_quit ) {
+ &tmake_verb("Done!");
+ exit 0;
+}
+($project_name eq "") && &tmake_usage();
+
+if ( $template_name eq "" ) {
+ $template_name = $project{"TEMPLATE"} ?
+ $project{"TEMPLATE"} : "default.t";
+}
+$template_name = &find_template($template_name);
+&IncludeTemplate($template_name);
+&tmake_verb("Done!");
+exit 0; # finished!
+
+
+
+##############################################################################
+# Subroutines from here
+##############################################################################
+
+#
+# tmake_usage()
+#
+# Prints a message about program usage and exits
+#
+
+sub tmake_usage {
+ print STDERR "Usage:\n tmake [options] project-files\n";
+ print STDERR "Options:\n";
+ print STDERR " -e expr Evaluate expression, ignore template file\n";
+ print STDERR " -nodepend Don't generate dependency information\n";
+ print STDERR " -o file Write output to file\n";
+ print STDERR " -t file Specify a template file\n";
+ print STDERR " -unix Create output for Unix (auto detects)\n";
+ print STDERR " -v Verbose/debug mode\n";
+ print STDERR " -win32 Create output for Win32 (auto detects)\n";
+ exit 1;
+}
+
+
+#
+# tmake_error(msg)
+#
+# Prints the message and exits
+#
+
+sub tmake_error {
+ my($msg) = @_;
+ print STDERR "tmake error: " . $msg . "\n";
+ exit 1;
+}
+
+
+#
+# tmake_warning(msg)
+#
+# Prints the warning message
+#
+
+sub tmake_warning {
+ my($msg) = @_;
+ print STDERR "tmake warning: " . $msg . "\n";
+}
+
+
+#
+# tmake_verb()
+#
+# Prints a verbose message
+#
+
+sub tmake_verb {
+ my($msg) = @_;
+ $verbose && print STDERR "tmake: " . $msg . "\n";
+}
+
+
+#
+# check_unix()
+#
+# Returns 1 if this is a Unix, 0 otherwise.
+#
+
+sub check_unix {
+ my($r);
+ $r = 0;
+ if ( -f "/bin/uname" ) {
+ $r = 1;
+ (-f "\\bin\\uname") && ($r = 0);
+ }
+ if ( -f "/usr/bin/uname" ) {
+ $r = 1;
+ (-f "\\usr\\bin\\uname") && ($r = 0);
+ }
+ return $r;
+}
+
+
+#
+# find_template(filename)
+#
+# Looks for the template file.
+# 1. search the current directory
+# 2. search the directories in TMAKEPATH
+# 3. search in $HOME/.tmake
+#
+
+sub find_template {
+ my($filename) = @_;
+ my($tb,$d,$p,@dirs);
+ if ( !defined($template_base) || ($template_base eq "") ) {
+ $tb = "";
+ } else {
+ $tb = $template_base . ";";
+ }
+ $d = $tb . $project{"TMAKEPATH"};
+ @dirs = ("");
+ push @dirs, &split_path( $d );
+ $filename .= ".t" unless ($filename =~ /\.\w+$/);
+ for $d ( @dirs ) {
+ $p = $d . $filename;
+ if ( -f fix_path($p) ) {
+ if ( $filename eq "tmake.conf" ) {
+ $tmake_platform = $d;
+ $tmake_platform =~ s-.*[/\\]([^/\\]*)[/\\]-$1-;
+ &tmake_verb("Detected platform $tmake_platform");
+ }
+ return $p;
+ }
+ return ($d . $filename) if ( -f fix_path($d . $filename) );
+ }
+ &tmake_error("Template file " . $filename . " not found");
+}
+
+
+##############################################################################
+# User functions
+##############################################################################
+
+#
+# StdInit()
+#
+# Standard initialization
+#
+
+sub StdInit {
+ my($p);
+ return if $stdinit_done;
+ $stdinit_done = 1;
+ if ( defined($project{"OBJECTS_DIR"}) ) {
+ $project{"OBJECTS_DIR"} = FixPath($project{"OBJECTS_DIR"});
+ &mkdirp($project{"OBJECTS_DIR"},0777);
+ }
+ if ( defined($project{"MOC_DIR"}) ) {
+ $project{"MOC_DIR"} = FixPath($project{"MOC_DIR"});
+ &mkdirp($project{"MOC_DIR"},0777);
+ }
+ if ( defined($project{"DESTDIR"}) ) {
+ $project{"DESTDIR"} = FixPath($project{"DESTDIR"});
+ &mkdirp($project{"DESTDIR"},0777);
+ }
+ $project{"OBJECTS"} = &Objects($project{"SOURCES"});
+ if ( $moc_aware ) {
+ $project{"_HDRMOC"} = &list_moc($project{"HEADERS"},$moc_pre,$cpp_ext);
+ $project{"_SRCMOC"} = &list_moc($project{"SOURCES"},"",$moc_ext);
+ $project{"OBJMOC"} = &Objects($project{"_HDRMOC"});
+ $p = $project{"_HDRMOC"} . " " . $project{"_SRCMOC"};
+ $p =~ s/(^\s+|\s+$)//g;
+ $project{"SRCMOC"} = $p;
+ }
+ &AddIncludePath("");
+}
+
+
+sub FixPath {
+ my($p) = @_;
+ if ( !defined($p) || ($p eq "") || ($p eq ".") ) {
+ $p = "";
+ } else {
+ $p .= $dir_sep;
+ $p =~ s-[\\/]+-${dir_sep}-g;
+ }
+ return $p;
+}
+
+
+#
+# Config(name)
+#
+# Returns true if the project variable CONFIG contains the
+# configuration name.
+#
+
+sub Config {
+ my($name) = @_;
+ return $project{"CONFIG"} =~ /\b\Q$name\E\b/;
+}
+
+
+#
+# DisableOutput()
+#
+# Disables tmake output. Must be restored by calling a corresponding
+# EnableOutput().
+#
+
+sub DisableOutput {
+ $output_count++;
+}
+
+
+#
+# EnableOutput()
+#
+# Enables tmake output again after DisableOutput() has been called.
+#
+
+sub EnableOutput {
+ $output_count--;
+}
+
+
+#
+# Now() - sets $text
+#
+# Sets $text to the current date and time.
+#
+
+sub Now {
+ my($sec,$min,$hour,$mday,$mon,$year);
+ ($sec,$min,$hour,$mday,$mon,$year) = localtime(time());
+ $text = sprintf("%02d:%02d, %4d/%02d/%02d",
+ $hour, $min, 1900+$year, 1+$mon, $mday);
+}
+
+
+#
+# expand_project_var(var)
+#
+# Internal function for Project().
+# Expands a project value string.
+#
+
+sub expand_project_var {
+ my($v) = @_;
+ my($c);
+ return "" if !defined($v);
+ $c = 0;
+ while ( $c < 100 ) { # expand $$
+ if ( $v =~ s/(\$\$\w+)/\035/ ) {
+ $_ = $1;
+ s/\$\$//g;
+ if ( !defined($project{$_}) ) {
+ $v =~ s/\035//g;
+ } else {
+ $v =~ s/\035/$project{$_}/g;
+ }
+ $c++;
+ } else {
+ $c = 100;
+ }
+ }
+ return $v;
+}
+
+
+#
+# Project(strings)
+#
+# This is a powerful function for setting or reading project variables.
+# Returns the resulting project variables (joined with space between).
+#
+# Get a project variable:
+# $s = Project("TEMPLATE"); -> $s = "TEMPLATE"
+#
+# Set a project variable:
+# Project("TEMPLATE = lib"); -> TEMPLATE = lib
+# Project("CONFIG =";) -> CONFIG empty
+#
+# Append to a project variable:
+# Project("CONFIG = qt"); -> CONFIG = qt
+# Project("CONFIG += debug"); -> CONFIG = qt debug
+#
+# Append to a project variable if it does not contain the value already:
+# Project("CONFIG = qt release"); -> CONFIG = qt release
+# Project("CONFIG *= qt"); -> CONFIG = qt release
+# Project("CONFIG *= opengl"); -> CONFIG = qt release opengl
+#
+# Subtract from a project variable:
+# Project("THINGS = abc xyz"); -> THINGS = abc xyz
+# Project("THINGS -= abc"); -> THINGS = xyz
+#
+# Search/replace on a project variable:
+# Project("CONFIG = tq opengl"); -> CONFIG = tq opengl
+# Project("CONFIG /= s/tq/qt/"); -> CONFIG = qt opengl
+#
+# The operations can be performed on several project variables at a time.
+#
+# Project("TEMPLATE = app", "CONFIG *= opengl", "THINGS += klm");
+#
+
+sub Project {
+ my @settings = @_;
+ my($r,$if_var,$t,$s,$v,$p,$c);
+ $r = "";
+ foreach ( @settings ) {
+ $v = $_;
+ if ( $v =~ s/^\s*([^:\r\n]+:)?(\w+)\s*(\+=|\*=|\-=|\/=|=)// ) {
+ $if_var = $1;
+ if ( $if_var ne "" ) {
+ chop $if_var;
+ if ( $if_var eq "unix" ) {
+ return "" if !$is_unix;
+ } elsif ( $if_var eq "win32" ) {
+ return "" if $is_unix;
+ } elsif ( ($if_var ne $tmake_platform) && !Config($if_var) ) {
+ return "";
+ }
+ }
+ $t = $2;
+ $s = $3;
+ if ( ! $notrim_whitespace ) {
+ $v =~ s/^\s+//; # trim white space
+ $v =~ s/\s+$//;
+ }
+ $v = expand_project_var($v);
+ $p = $project{$t};
+ if ( $s ne "=" && $v eq "" ) {
+ # nothing to append, subtract or sed
+ } elsif ( $s eq "=" ) { # set variable
+ $p = $v;
+ } elsif ( $s eq "+=" ) { # append
+ if ( $p eq "" ) {
+ $p = $v;
+ } else {
+ $p .= " " . $v;
+ }
+ } elsif ( $s eq "*=" ) { # append if not contained
+ if ( !($p =~ /(?:^|\s)\Q$v\E(?:\s|$)/) ) {
+ if ( $p eq "" ) {
+ $p = $v;
+ } else {
+ $p .= " " . $v;
+ }
+ }
+ } elsif ( $s eq "-=" ) { # subtract
+ $p =~ s/$v//g;
+ } elsif ( $s eq "/=" ) { # sed
+ $cmd = '$p =~ ' . $v;
+ eval $cmd;
+ }
+ $project{$t} = expand_project_var($p);
+ } else {
+ $p = expand_project_var($project{$v});
+ }
+ if ( $p ne "" ) {
+ $r = ($r eq "") ? $p : ($r . " " . $p);
+ }
+ }
+ return $r;
+}
+
+
+#
+# Substitute(string)
+#
+# This function substitutes project variables in a text.
+#
+# Example:
+# Substitute('The project name is "$$PROJECT"')
+#
+
+sub Substitute {
+ my($subst) = @_;
+ $text = expand_project_var($subst);
+ return $text;
+}
+
+
+#
+# ScanProject(file)
+#
+# Scans a project file. Inserts project variables into the global
+# associative project array.
+#
+
+sub ScanProject {
+ my($file) = @_;
+ my($var,$val,@v,$more,$line,$endmark);
+
+ $var = "";
+ $line = 0;
+ open(TMP,fix_path($file)) || return 0;
+
+ &tmake_verb("Reading the project file $file");
+ while ( <TMP> ) {
+ $line++;
+ s/\#.*//; # strip comment
+ s/^\s+//; # strip white space
+ s/\s+$//;
+ if ( /^(([^:\r\n]+:)?\w+\s*(\+|\-|\*|\/)?=)/ ) {
+ $var = $1; # var also contains the ".="
+ s/^.*?=\s*//;
+ if ( /^\<\<(.*)$/ ) {
+ $endmark = $1;
+ $val = "";
+ while ( <TMP> ) {
+ $line++;
+ if ( /^\Q$endmark\E$/ ) {
+ $endmark = "";
+ last;
+ }
+ $val .= $_;
+ }
+ if ( $endmark ne "" ) {
+ tmake_error("$file:$line: End marker $endmark not found");
+ }
+ chop $val if ( $val ne "" );
+ $notrim_whitespace++;
+ Project( $var . $val );
+ $notrim_whitespace--;
+ $var = "";
+ $_ = "";
+ }
+ }
+ if ( $var ne "" ) {
+ $more = ( $_ =~ s/\s*\\\s*$// ); # more if \ at end of line
+ push( @v, split( /\s+/, $_ ) );
+ if ( ! $more ) {
+ $val = join(" ",@v);
+ Project( $var . $val );
+ $var = "";
+ @v = ();
+ }
+ } elsif ( $_ ne "" ) {
+ tmake_error("$file:$line: Syntax error");
+ }
+ }
+ close(TMP);
+ &tmake_verb("Done reading the project file $file");
+ return 1;
+}
+
+
+#
+# IncludeTemplate(template_name)
+#
+# Includes and processes a template file.
+#
+# Below, we read the template file and executes any perl code found.
+# Perl code comes after "#$". The variable $text contains the text
+# to replace the perl code that was executed.
+# Template comments begin with "#!".
+#
+
+sub IncludeTemplate {
+ my($t_name) = @_;
+ my($cmd,$cmd_block,$cmd_end,$is_cmd_block,$saveline,$spaceonly);
+ local($text);
+ local(*T);
+
+ $t_name = &find_template($t_name);
+ if ( $tmake_template_dict{$t_name} ) {
+ &tmake_error("Cyclic template inclusion for $t_name");
+ } else {
+ $tmake_template_dict{$t_name} = 1;
+ }
+ $template_base = $t_name;
+ $template_base =~ s-(.*[/\\]).*-$1-;
+ &tmake_verb("Reading the template $t_name");
+ open(T,fix_path($t_name)) ||
+ &tmake_error("Can't open template file \"$t_name\"");
+
+ while ( <T> ) {
+ if ( /\#\!/ ) { # tmake comment
+ s/\s*\#\!.*//;
+ next if /^$/;
+ }
+ if ( /\#\$(\{)?\s*(.*)\n/ ) { # code
+ $cmd = $2;
+ $is_cmd_block = defined($1) && ($1 eq "{");
+ s/\#\$.*\n//;
+ if ( $is_cmd_block ) { # code block #${ ...
+ $saveline = $_;
+ $cmd_block = $cmd;
+ $cmd_end = 0;
+ while ( <T> ) {
+ $cmd = $_;
+ $cmd =~ s/\s*\#\!.*//; # tmake comment
+ if ( $cmd =~ /^\s*\#\$\}/ ) {
+ $_ = "";
+ $cmd_end = 1;
+ last;
+ }
+ $cmd =~ s/^\s*\#(\$)?\s*//;
+ $cmd_block .= $cmd;
+ }
+ $cmd_end || &tmake_error('#$} expected but not found');
+ $cmd = $cmd_block;
+ $_ = $saveline;
+ }
+ $spaceonly = /^\s*$/;
+ $saveline = $_;
+ &tmake_verb("Evaluate: $cmd");
+ $text = "";
+ eval $cmd;
+ die $@ if $@;
+ next if $spaceonly && ($text =~ /^\s*$/);
+ print $saveline . $text . "\n" if $output_count <= 0;
+ } else { # something else
+ print if $output_count <= 0;
+ }
+ }
+ close( T );
+}
+
+
+#
+# Expand(var) - appends to $text
+#
+# Expands a list of $project{} variables with a space character between them.
+#
+
+sub Expand {
+ my @vars = @_;
+ my($t);
+ $t = Project(@vars);
+ if ( $text eq "" ) {
+ $text = $t;
+ } elsif ( $t ne "" ) {
+ $text .= " " . $t;
+ }
+ return $text;
+}
+
+
+#
+# ExpandGlue(var,prepend,glue,append) - appends to $text
+#
+# Expands a $project{} variable, splits on whitespace
+# and joins with $glue. $prepend is put at the start
+# of the string and $append is put at the end of the
+# string. The resulting string becomes "" if the project
+# var is empty or not defined.
+#
+# Example:
+#
+# The project file defines:
+# SOURCES = a b c
+#
+# ExpandGlue("SOURCES","<","-",">")
+#
+# The result:
+# $text = "<a-b-c>"
+#
+
+sub ExpandGlue {
+ my($var,$prepend,$glue,$append) = @_;
+ my($t,$v);
+ $v = Project($var);
+ if ( $v eq "" ) {
+ $t = "";
+ } else {
+ $t = $prepend . join($glue,split(/\s+/,$v)) . $append;
+ }
+ if ( $text eq "" ) {
+ $text = $t;
+ } elsif ( $t ne "" ) {
+ $text .= " " . $t;
+ }
+ return $text;
+}
+
+
+#
+# ExpandList(var) - sets $text.
+#
+# Suitable for expanding HEADERS = ... etc. in a Makefile
+#
+
+sub ExpandList {
+ my($var) = @_;
+ return ExpandGlue($var,""," ${linebreak}\n\t\t","");
+}
+
+
+#
+# ExpandPath(var,prepend,glue,append) - appends to $text
+#
+# Expands a $project{} variable, splits on either ';' or
+# whitespace and joins with $glue. $prepend is put at the
+# start of the string and $append is put at the end of the
+# string. The resulting string becomes "" if the project
+# variable is empty or not defined.
+#
+# If the variable contains at least one semicolon or tmake
+# is running on Windows, the resulting items are put in
+# double-quotes.
+#
+# Example:
+#
+# The project file defines:
+# INCLUDEPATH = "C:\qt\include;c:\program files\msdev\include
+#
+# ExpandGlue("INCLUDEPATH","-I","-I","")
+#
+# The result:
+# $text = -I"c:\qt\include" -I"c:\program files\msdev\include"
+#
+
+sub ExpandPath {
+ my($var,$prepend,$glue,$append) = @_;
+ my($t,$v);
+ my($s);
+ $v = Project($var);
+ if ( $v eq "" ) {
+ $t = "";
+ } else {
+ if ( $v =~ /;/ || !$is_unix ) {
+ $prepend .= '"';
+ $glue = '"' . $glue . '"';
+ $append = '"' . $append;
+ }
+
+ if ( $v =~ /;/ ) {
+ $t = $prepend . join($glue,split(/;+/,$v)) . $append;
+ } else {
+ $t = $prepend . join($glue,split(/\s+/,$v)) . $append;
+ }
+ }
+ if ( $text eq "" ) {
+ $text = $t;
+ } elsif ( $t ne "" ) {
+ $text .= " " . $t;
+ }
+ return $text;
+}
+
+
+#
+# TmakeSelf()
+#
+# Generates makefile rule to regenerate the makefile using tmake.
+#
+
+sub TmakeSelf {
+ my $a = "tmake $project_name";
+ if ( $nodepend ) {
+ $a .= " -nodepend";
+ }
+ if ( $outfile ) {
+ $text = "tmake: $outfile\n\n$outfile: $project_name\n\t";
+ $a .= " -o $outfile";
+ } else {
+ $text = "tmake:\n\t";
+ }
+ $text .= $a
+}
+
+
+#
+# Objects(files)
+#
+# Replaces any extension with .o ($obj_ext).
+#
+
+sub Objects {
+ local($_) = @_;
+ my(@a);
+ @a = split(/\s+/,$_);
+ foreach ( @a ) {
+ s-\.\w+$-.${obj_ext}-;
+ if ( defined($project{"OBJECTS_DIR"}) ) {
+ s-^.*[\\/]--;
+ $_ = $project{"OBJECTS_DIR"} . $_;
+ }
+ }
+ return join(" ",@a);
+}
+
+
+#
+# list_moc(files,prefix,extension)
+#
+# Scans all files and selects all files that contain Q_OBJECT.
+# Insert a prefix before the filename and replaces the filename extention.
+#
+
+sub list_moc {
+ my($files,$pre,$ext) = @_;
+ my(@v,@m,@lines,$contents,$n,$f,$t);
+ @v = split(/\s+/,$files);
+ undef $/;
+ foreach $f ( @v ) {
+ if ( open(TMP,fix_path($f)) ) {
+ $contents = <TMP>;
+ close(TMP);
+ $n = 0;
+ @lines = split(/\n/,$contents);
+ grep( /tmake\s+ignore\s+Q_OBJECT/ && $n--, @lines );
+ $contents =~ s-/\*.*?\*/--gs; # strip C/C++ comments
+ $contents =~ s-//.*\n--g;
+ @lines = split(/\n/,$contents);
+ grep( /(^|\W)Q_OBJECT(\W|$)/ && $n++, @lines );
+ if ( $n > 0 ) {
+ $t = $f;
+ $t =~ s-^(.*[/\\])?([^/\\]*?)\.(\w+)$-$1${pre}$2.${ext}-;
+ if ( defined($project{"MOC_DIR"}) ) {
+ $t =~ s-^.*[\\/]--;
+ $t = $project{"MOC_DIR"} . $t;
+ }
+ $moc_output{$f} = $t;
+ $moc_input{$t} = $f;
+ push(@m,$t);
+ }
+ $contents = "";
+ }
+ }
+ $/ = "\n";
+ return join(" ",@m);
+}
+
+
+#
+# BuildObj(objects,sources)
+#
+# Builds the object files.
+#
+
+sub BuildObj {
+ my($obj,$src) = @_;
+ my(@objv,$srcv,$i,$s,$o,$d,$c,$comp,$cimp);
+ @objv = split(/\s+/,$obj);
+ @srcv = split(/\s+/,$src);
+ for $i ( 0..$#objv ) {
+ $s = $srcv[$i];
+ $o = $objv[$i];
+ next if $s eq "";
+ $text .= $o . ": " . $s;
+ if ( defined($moc_output{$s}) && ($moc_output{$s} ne "") ) {
+ $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
+ }
+ $d = &make_depend($s);
+ $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
+ if ( ($s =~ /\.c$/) ) {
+ $comp = "TMAKE_RUN_CC";
+ $cimp = "TMAKE_RUN_CC_IMP";
+ } else {
+ $comp = "TMAKE_RUN_CXX";
+ $cimp = "TMAKE_RUN_CXX_IMP";
+ }
+ if ( defined($project{"OBJECTS_DIR"}) ||
+ !defined($project{$cimp}) ) {
+ $c = $project{$comp};
+ $c =~ s/\$src/$s/;
+ $c =~ s/\$obj/$o/;
+ $text .= "\n\t$c";
+ }
+ $text .= "\n\n";
+ }
+ chop $text;
+}
+
+
+#
+# BuildMocObj(objects,sources)
+#
+# Builds the moc object files.
+#
+
+sub BuildMocObj {
+ my($obj,$src) = @_;
+ my(@objv,$srcv,$i,$s,$o,$hdr,$d);
+ @objv = split(/\s+/,$obj);
+ @srcv = split(/\s+/,$src);
+ for $i ( 0..$#objv ) {
+ $s = $srcv[$i];
+ $o = $objv[$i];
+ $hdr = $moc_input{$srcv[$i]};
+ $text .= $o . ": " . $s . " ${linebreak}\n\t\t" . $hdr;
+ $d = &make_depend($hdr);
+ $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
+ if ( defined($project{"OBJECTS_DIR"}) || defined($project{"MOC_DIR"})||
+ !defined($project{"TMAKE_RUN_CXX_IMP"}) ) {
+ $c = $project{"TMAKE_RUN_CXX"};
+ $c =~ s/\$src/$s/;
+ $c =~ s/\$obj/$o/;
+ $text .= "\n\t$c";
+ }
+ $text .= "\n\n";
+ }
+ chop $text;
+}
+
+
+#
+# BuildMocSrc(files)
+#
+# Builds the moc source files from headers and sources.
+#
+
+sub BuildMocSrc {
+ my($f) = @_;
+ my(@v,$m,$o);
+ @v = split(/\s+/,$f);
+ foreach $m ( @v ) {
+ $o = $moc_output{$m};
+ if ( defined($o) && ($o ne "") ) {
+ $text .= "$o: $m\n\t$moc_cmd $m -o $o\n\n";
+ }
+ }
+ chop $text;
+}
+
+
+#
+# AddIncludePath(path)
+#
+# Adds path to the current include path, $project{"INCLUDEPATH"}.
+#
+
+sub AddIncludePath {
+ my($path) = @_;
+ my($p);
+ if ( $project{"INCPATH"} &&
+ ($project{"INCPATH"} =~ /(?:^|\s)\Q$path\E(?:\s|$)/) ) {
+ return;
+ }
+ $project{"INCLUDEPATH"} = "" if !defined($project{"INCLUDEPATH"});
+ if ( !defined($project{"INCPATH_SEP"}) ) {
+ if ( $project{"INCLUDEPATH"} =~ /;/ ) {
+ $project{"INCPATH_SEP"} = ";";
+ } else {
+ $project{"INCPATH_SEP"} = " ";
+ }
+ }
+ $p = $project{"INCLUDEPATH"};
+ $p = ($p && $path) ? ($p . ";" . $path) : ($p . $path);
+ $project{"INCLUDEPATH"} = $p;
+ $p = join($project{"INCPATH_SEP"},&split_path($p));
+ $p =~ s=[\\/]($project{"INCPATH_SEP"}|$)=$project{"INCPATH_SEP"}=g;
+ $project{"INCPATH"} = $p;
+}
+
+
+#
+# FindHighestLibVersion(dir,name)
+#
+# Returns the newest library version. Scans all the files in the specifies
+# directory and returns the highest version number.
+#
+# Used on Windows only.
+#
+# Example:
+# FindHighestLibVersion("c:\qt\lib","qt") returns "200" if
+# the c:\qt\lib directory contains qt141.lib and qt200.lib.
+#
+
+sub FindHighestLibVersion {
+ my($dir,$name) = @_;
+ my(@files,$f,$v,$highest);
+ $highest = "";
+ @files = find_files($dir,"${name}.*\.lib");
+ for $f ( @files ) {
+ if ( $f =~ /(\d+)\.lib/i ) {
+ $v = $1;
+ if ( $highest eq "" || $v > $highest ) {
+ $highest = $v;
+ }
+ }
+ }
+ return $highest;
+}
+
+
+#
+# Finds files.
+#
+# Examples:
+# find_files("/usr","\.cpp$",1) - finds .cpp files in /usr and below
+# find_files("/tmp","^#",0) - finds #* files in /tmp
+#
+
+sub find_files {
+ my($dir,$match,$descend) = @_;
+ my($file,$p,@files);
+ local(*D);
+ $dir =~ s=\\=/=g;
+ ($dir eq "") && ($dir = ".");
+ if ( opendir(D,fix_path($dir)) ) {
+ if ( $dir eq "." ) {
+ $dir = "";
+ } else {
+ ($dir =~ /\/$/) || ($dir .= "/");
+ }
+ foreach $file ( readdir(D) ) {
+ next if ( $file =~ /^\.\.?$/ );
+ $p = $dir . $file;
+ if ( $is_unix ) {
+ ($file =~ /$match/) && (push @files, $p);
+ } else {
+ ($file =~ /$match/i) && (push @files, $p);
+ }
+ if ( $descend && -d $p && ! -l $p ) {
+ push @files, &find_files($p,$match,$descend);
+ }
+ }
+ closedir(D);
+ }
+ return @files;
+}
+
+
+#
+# make_depend(file)
+#
+# Returns a list of included files.
+# Uses the global $depend_path variable.
+#
+
+sub make_depend {
+ my($file) = @_;
+ my($i,$count);
+ if ( $nodepend ) {
+ return "";
+ }
+ if ( ! $depend_path_fixed ) {
+ $depend_path_fixed = 1;
+ if ( defined($project{"DEPENDPATH"}) ) {
+ $depend_path = $project{"DEPENDPATH"};
+ } else {
+ $depend_path = "";
+ }
+ $count = 0;
+ while ( $count < 100 ) {
+ if ( $depend_path =~ s/(\$[\{\(]?\w+[\}\)]?)/035/ ) {
+ $_ = $1;
+ s/[\$\{\}\(\)]//g;
+ $depend_path =~ s/035/$ENV{$_}/g;
+ } else {
+ $count = 100;
+ }
+ }
+ @dep_path = &split_path($depend_path);
+ }
+ @cur_dep_path = @dep_path;
+ if ( $file =~ /(.*[\/\\])/ ) {
+ $dep_curdir = $1;
+ push @cur_dep_path, $dep_curdir;
+ } else {
+ $dep_curdir = "";
+ }
+ $dep_file = $file;
+ &canonical_dep($file);
+ %dep_dict = ();
+ $i = &build_dep($file);
+ chop $i;
+ $i =~ s=/=$dir_sep=g unless $is_unix;
+ $i =~ s=([a-zA-Z]):/=//$1/=g if (defined($gnuwin32) && $gnuwin32);
+ return join(" ${linebreak}\n\t\t",split(/ /,$i) );
+}
+
+#
+# build_dep() - Internal for make_depend()
+#
+
+sub build_dep {
+ my($file) = @_;
+ my(@i,$a,$n);
+ $a = "";
+ return $a if !(defined $depend_dict{$file});
+ @i = split(/ /,$depend_dict{$file});
+ for $n ( @i ) {
+ if ( !defined($dep_dict{$n}) && defined($full_path{$n}) ) {
+ $dep_dict{$n} = 1;
+ $a .= $full_path{$n} . " " . &build_dep($n);
+ }
+ }
+ return $a;
+}
+
+#
+# canonical_dep(file) - Internal for make_depend()
+#
+# Reads the file and all included files recursively.
+# %depend_dict associates a file name to a list of included files.
+#
+
+sub canonical_dep {
+ my($file) = @_;
+ my(@inc,$i);
+ @inc = &scan_dep($file);
+ if ( @inc ) {
+ $depend_dict{$file} = join(" ",@inc);
+ for $i ( @inc ) {
+ &canonical_dep($i) if !defined($depend_dict{$i});
+ }
+ }
+}
+
+#
+# scan_dep(file) - Internal for make_depend()
+#
+# Returns an array of included files.
+#
+
+sub scan_dep {
+ my($file) = @_;
+ my($dir,$path,$found,@allincs,@includes,%incs);
+ $path = $file;
+ @includes = ();
+ return @includes if $file =~ /\.$moc_ext$/; # avoid .moc files
+ if ( ! (-f fix_path($path)) ) {
+ $found = 0;
+ for $dir ( @cur_dep_path ) {
+ $path = $dir . $file;
+ last if ( $found = (-f fix_path($path)) );
+ }
+ return @includes if ! $found;
+ }
+ undef $/;
+ if ( open(TMP,fix_path($path)) ) {
+ $full_path{$file} = $path;
+ $_ = <TMP>;
+ s-/\*.*?\*/--gs; # strip C/C++ comments
+ s-//.*\n-\n-g;
+ @allincs = split(/\n/,$_);
+ @allincs = grep(/^\s*#\s*include/,@allincs);
+ foreach ( @allincs ) { # all #include lines
+ next if !(/^\s*#\s*include\s+[<"]([^>"]*)[>"]/) || defined($incs{$1});
+ push(@includes,$1);
+ $incs{$1} = "1";
+ }
+ close(TMP);
+ }
+ $/ = "\n";
+ return @includes;
+}
+
+
+#
+# split_path(path)
+#
+# Splits a path containing : (Unix) or ; (MSDOS, NT etc.) separators.
+# Returns an array.
+#
+
+sub split_path {
+ my($p) = @_;
+ my($s,@d);
+ @d = ();
+ return @d if !defined($p) || $p eq "";
+ $p =~ s=:=;=g if $is_unix;
+ $p =~ s=[/\\]+=/=g;
+ if ( !($p =~ /;/) ) {
+ $p =~ s/\s+/;/g;
+ }
+ $p =~ s/\s*;\s*/;/g;
+ while( $p =~ /(?:(?:[^\"\;][^\;]*;*)|(?:\"[^\"]*\";*))/g ) {
+ $s = $&;
+ $s =~ s=\"==g;
+ $s =~ s=[\s\;]+$==g;
+ $s =~ s=([^/:])$=$1/=g;
+ $s =~ s=/=$dir_sep=g unless $is_unix;
+ push @d, $s;
+ }
+ return @d;
+}
+
+
+#
+# fix_path(path)
+#
+# Converts all '\' to '/' if this really seems to be a Unix box.
+#
+
+sub fix_path {
+ my($p) = @_;
+ if ( $really_unix ) {
+ $p =~ s-\\-/-g;
+ } else {
+ $p =~ s-/-\\-g;
+ }
+ return $p;
+}
+
+
+#
+# mkdirp(filename,mode) - Internal for StdInit()
+#
+# Creates the directory specified by $filename, with permissions
+# specified by mode (as modified by umask). Recursively calls
+# mkdir, similar to 'mkdir -p'.
+#
+
+sub mkdirp {
+ my($filename,$mode) = @_;
+ if ( $filename =~ /\$\(\w+\)/ ) { # ignore "$(something)"
+ return 0;
+ }
+ $filename =~ s-[\\:/]+-/-g;
+ if ( -d $filename ) {
+ return 1;
+ }
+ $filename =~ m-^((.*)/)?(.*)-;
+ if ( defined($2) && ! mkdirp($2,$mode) ) {
+ return 0;
+ }
+ return mkdir($filename,$mode);
+}
diff --git a/tmake/doc/m-linux-gcc.html b/tmake/doc/m-linux-gcc.html
new file mode 100644
index 0000000..300ef35
--- /dev/null
+++ b/tmake/doc/m-linux-gcc.html
@@ -0,0 +1,85 @@
+<!doctype HTML public "-//W3C//DTD HTML 3.2//EN">
+<html><head><title>
+Generated Makefile for Linux / GNU g++
+</title></head><body bgcolor="#ffffff">
+<h2 align=center>Generated Makefile for Linux / GNU gcc</h2>
+
+<pre>
+#############################################################################
+# Makefile for building hello
+# Generated by tmake at 10:11, 1998/07/07
+# Project: hello
+# Template: app
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = g++
+CFLAGS = -Wall -W -O2 -fno-strength-reduce
+INCPATH = -I$(QTDIR)/include
+LINK = g++
+LFLAGS =
+LIBS = -L$(QTDIR)/lib -lqt -L/usr/X11R6/lib -lX11
+MOC = moc
+
+####### Files
+
+HEADERS = hello.h
+SOURCES = hello.cpp \
+ main.cpp
+OBJECTS = hello.o \
+ main.o
+SRCMOC = moc_hello.cpp
+OBJMOC = moc_hello.o
+TARGET = hello
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .C .c
+
+.cpp.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+.cxx.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+.cc.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+.C.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+
+####### Build rules
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(OBJMOC)
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
+
+moc: $(SRCMOC)
+
+tmake:
+ tmake hello.pro
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
+ -rm -f *~ core
+
+####### Compile
+
+hello.o: hello.cpp \
+ hello.h
+
+main.o: main.cpp \
+ hello.h
+
+moc_hello.o: moc_hello.cpp \
+ hello.h
+
+moc_hello.cpp: hello.h
+ $(MOC) hello.h -o moc_hello.cpp
+</pre>
+</body></html>
diff --git a/tmake/doc/m-win32-msvc.html b/tmake/doc/m-win32-msvc.html
new file mode 100644
index 0000000..24097cc
--- /dev/null
+++ b/tmake/doc/m-win32-msvc.html
@@ -0,0 +1,89 @@
+<!doctype HTML public "-//W3C//DTD HTML 3.2//EN">
+<html><head><title>
+Generated Makefile for Win32 / Microsoft Visual C++
+</title></head><body bgcolor="#ffffff">
+<h2 align=center>Generated Makefile for Win32 / Microsoft Visual C++</h2>
+
+<pre>
+#############################################################################
+# Makefile for building hello
+# Generated by tmake at 20:40, 1998/02/27
+# Project: hello
+# Template: app
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = cl
+CFLAGS = -nologo -W3 -O2
+INCPATH = -I"$(QTDIR)\include"
+LINK = link
+LFLAGS = /NOLOGO /SUBSYSTEM:windows
+LIBS = $(QTDIR)\lib\qt.lib user32.lib gdi32.lib comdlg32.lib wsock32.lib
+MOC = moc
+
+####### Files
+
+HEADERS = hello.h
+SOURCES = hello.cpp \
+ main.cpp
+OBJECTS = hello.obj \
+ main.obj
+SRCMOC = moc_hello.cpp
+OBJMOC = moc_hello.obj
+TARGET = hello.exe
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .c
+
+.cpp.obj:
+ $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
+
+.cxx.obj:
+ $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
+
+.cc.obj:
+ $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
+
+.c.obj:
+ $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
+
+####### Build rules
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(OBJMOC)
+ $(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
+ $(OBJECTS) $(OBJMOC) $(LIBS)
+<<
+
+moc: $(SRCMOC)
+
+tmake: Makefile
+
+Makefile: hello.pro
+ tmake hello.pro -o Makefile
+
+clean:
+ -del hello.obj
+ -del main.obj
+ -del moc_hello.cpp
+ -del moc_hello.obj
+ -del $(TARGET)
+
+####### Compile
+
+hello.obj: hello.cpp \
+ hello.h
+
+main.obj: main.cpp \
+ hello.h
+
+moc_hello.obj: moc_hello.cpp \
+ hello.h
+
+moc_hello.cpp: hello.h
+ $(MOC) hello.h -o moc_hello.cpp
+</pre>
+</body></html>
diff --git a/tmake/doc/tmake.html b/tmake/doc/tmake.html
new file mode 100644
index 0000000..1b14809
--- /dev/null
+++ b/tmake/doc/tmake.html
@@ -0,0 +1,727 @@
+<!doctype HTML public "-//W3C//DTD HTML 3.2//EN">
+<html><head><title>
+User's Guide - tmake
+</title></head><body bgcolor="#ffffff">
+<p><h1 align=center>User's Guide - tmake</h1>
+
+
+<hr>
+<h2>Introduction</h2>
+
+tmake is an easy-to-use tool from Troll Tech to create and maintain
+makefiles for software projects. It can be a painful task to manage
+makefiles manually, especially if you develop for more than one platform
+or use more than one compiler. tmake automates and streamlines this
+process and lets you spend your valuable time on writing code, not
+makefiles.
+
+<p>
+Our main motivation for developing tmake was that we spent far too much
+time maintaining makefiles for <a href="http://www.troll.no/qt">Qt</a>,
+our cross-platform GUI toolkit. Qt supports around 15 flavors of Unix,
+Microsoft Windows, and around 15 different C++ compilers. We looked at
+GNU autoconf, but it was Unix-specific and not flexible enough in our
+opinion. Our makefile system also had to deal with Qt <a
+href="http://www.troll.no/qt/metaobjects.html">meta object compiler</a>
+(moc) issues. The moc program extracts meta information from C++ files and
+generates a C++ file with data tables etc. It takes extra work to add
+makefile rules for the moc and wanted to automate this task.
+
+<p>
+tmake is written in Perl and requires that you have installed perl version
+5 or newer. Basic use of tmake requires no perl knowledge, but if you know
+perl you can extend tmake and write your own makefile templates.
+
+<p>
+<b>Windows users:</b> The tmake distribution for Win32 includes tmake.exe
+(built by the perl2exe utility) and you do not need to download and
+install perl unless you want to modify the tmake source code or run other
+perl scripts. You can download perl for Win32 (Windows NT and 95) from <a
+href="http://www.activestate.com">www.activestate.com</a>
+
+<p>
+tmake is free software and you may use, copy, modify and distribute tmake
+and its documentation for any purpose and without any fee. See the
+LICENSE file for details.
+
+<p>
+Feedback is highly appreciated. Contact the author, Haavard Nord <a
+href="mailto:hanord@troll.no">(hanord@troll.no)</a>, if you have ideas,
+patches etc. for tmake.
+
+<hr>
+<h2>Installation</h2>
+
+<ol>
+<li>Make sure you have perl version 5 or later installed (optional
+for Windows users).
+<li>Unpack the tmake tar.gz archive for Unix or the tmake .zip file for Windows.
+<li>Set the TMAKEPATH environment variable to the directories
+containing the template files (see below).
+<li>Add the tmake/bin directory to your PATH.
+</ol>
+
+Here are some examples:<p>
+<strong>Unix Bourne shell:</strong><pre>
+ TMAKEPATH=/local/tmake/lib/linux-g++
+ PATH=$PATH:/local/tmake/bin
+ export TMAKEPATH PATH
+</pre>
+
+<strong>Unix C shell:</strong><pre>
+ setenv TMAKEPATH /local/tmake/lib/linux-g++
+ setenv PATH $PATH:/local/tmake/bin
+</pre>
+
+<strong>Microsoft Windows:</strong><pre>
+ set TMAKEPATH=c:\tmake\lib\win32-msvc
+ set PATH=%PATH%;c:\tmake\bin
+</pre>
+
+<p>
+The template directory name has the form <em>platform</em>-<em>compiler</em>
+and contains a platform configuration file (tmake.conf) and tmake template
+files.
+
+<p>
+Supported platforms: AIX, Data General, FreeBSD, HPUX, SGI Irix, Linux,
+NetBSD, OpenBSD, OSF1/DEC, SCO, Solaris, SunOS, Ultrix, Unixware and
+Win32.
+
+<p>
+You can find your platform-compiler combination in the <tt>tmake/lib</tt>.
+
+<p>
+<b>Unix users:</b> tmake requires that perl is in /usr/bin. If your
+version of perl is elsewehere, either change the first line of tmake or
+make a small shell script which invokes tmake with the correct perl.
+
+
+<hr>
+<h2>Getting Started</h2>
+
+Let's assume you have a small Qt application consisting of one C++ header
+file and two source files.
+
+First you need to create a tmake project file, e.g. hello.pro:<pre>
+ HEADERS = hello.h
+ SOURCES = hello.cpp main.cpp
+ TARGET = hello
+</pre>
+
+Then run tmake to create a Makefile:<pre>
+ tmake hello.pro -o Makefile
+</pre>
+And finally:<pre>
+ make
+</pre>
+This builds the hello program. Remember to set the <code>TMAKEPATH</code>
+environment variable before you run tmake.
+<p>
+See <a href="m-linux-gcc.html">Makefile for Linux/g++</a>.<br>
+See <a href="m-win32-msvc.html">Makefile for Win32/msvc</a>
+(Microsoft Visual C++).<br>
+
+
+<hr>
+<h2>Makefile Templates</h2>
+
+The tmake distribution includes three makefile templates and one
+configuration file for each platform/compiler combination. The
+<code>TMAKEPATH</code> environment variable tells tmake where to find
+these files:
+<p>
+<table border="0">
+ <tr>
+ <td>&nbsp;</td>
+ <td>app.t</td>
+ <td>&nbsp;</td>
+ <td>Creates a makefile for building applications.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>lib.t</td>
+ <td>&nbsp;</td>
+ <td>Creates a makefile for building libraries.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>subdirs.t</td>
+ <td>&nbsp;</td>
+ <td>Creates a makefile for building targets in subdirectories.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>tmake.conf</td>
+ <td>&nbsp;</td>
+ <td>This configuration file contains compiler options and lists
+ tools and libraries.
+ </tr>
+</table>
+
+
+<p>
+The hello.pro project file above does not have a <code>TEMPLATE</code> or
+a <code>CONFIG</code> variable. The default template is <tt>app</tt> (the .t
+extension is optional) and the default configuration is <tt>qt warn_on
+release</tt>.
+
+This project file produces exactly the same result as the hello.pro
+above:<pre>
+ TEMPLATE = app
+ CONFIG = qt warn_on release
+ HEADERS = hello.h
+ SOURCES = hello.cpp main.cpp
+ TARGET = hello
+</pre>
+
+
+
+<h4>Makefile Configuration</h4>
+
+<p>
+The <code>CONFIG</code> variable is recognized by both the app.t and lib.t
+templates and specifies what compiler options to use and which extra
+libraries to link in.
+
+These options control the compilation flags:
+<p>
+<table border="0">
+ <tr>
+ <td>&nbsp;</td>
+ <td>release</td>
+ <td>&nbsp;</td>
+ <td>Compile with optimization enabled, ignored if
+ "debug" is specified.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>debug</td>
+ <td>&nbsp;</td>
+ <td>Compile with debug options enabled.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>warn_on</td>
+ <td>&nbsp;</td>
+ <td>The compiler should emit more warnings than normally, ignored if
+ "warn_off" is specified.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>warn_off</td>
+ <td>&nbsp;</td>
+ <td>The compiler should emit no warnings or as few as possible.</td>
+ </tr>
+</table>
+
+<p>
+These options defines the application/library type:
+<p>
+<table border="0">
+ <tr>
+ <td>&nbsp;</td>
+ <td>qt</td>
+ <td>&nbsp;</td>
+ <td>The target is a Qt application/library and requires Qt header
+ files/library.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>opengl</td>
+ <td>&nbsp;</td>
+ <td>The target requires the OpenGL (or Mesa) headers/libraries.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>x11</td>
+ <td>&nbsp;</td>
+ <td>The target is a X11 application or library.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>windows</td>
+ <td>&nbsp;</td>
+ <td>The target is a Win32 window application (app.t only).</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>console</td>
+ <td>&nbsp;</td>
+ <td>The target is a Win32 console application (app.t only).</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>dll</td>
+ <td>&nbsp;</td>
+ <td>The target is a shared object/DLL.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>staticlib</td>
+ <td>&nbsp;</td>
+ <td>The target is a static library (lib.t only).</td>
+ </tr>
+</table>
+
+<p>
+As an example, if the hello application uses both Qt and OpenGL and you
+want to compile it for debugging, your <code>CONFIG</code> line should
+read:<pre>
+ CONFIG = qt opengl debug
+</pre>
+
+<p>
+The most common tmake options and project variables are described here.
+See the tmake <a href="tmake_ref.html">reference manual</a> for
+details.<p>
+
+
+
+<h4>The Application Template</h4>
+
+The application template, app.t, lets you compile and link executable
+programs or shared objects (DLLs).
+
+This template recognizes several variabless.
+<p>
+<table border="0">
+ <tr>
+ <td>&nbsp;</td>
+ <td>HEADERS</td>
+ <td>&nbsp;</td>
+ <td>Header files.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>SOURCES</td>
+ <td>&nbsp;</td>
+ <td>Source files.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>TARGET</td>
+ <td>&nbsp;</td>
+ <td>Name of executable (adds .exe if on Windows).</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>DESTDIR</td>
+ <td>&nbsp;</td>
+ <td>Where to put the target.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>DEFINES</td>
+ <td>&nbsp;</td>
+ <td>Tell compiler to define C preprocessor macros (-D option).</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>INCLUDEPATH</td>
+ <td>&nbsp;</td>
+ <td>Sets the include file search path for the compiler (-I
+ option).
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>DEPENDPATH</td>
+ <td>&nbsp;</td>
+ <td>Sets the dependency search path for tmake.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>DEF_FILE</td>
+ <td>&nbsp;</td>
+ <td>Win32 only: Link with a .def file.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>RC_FILE</td>
+ <td>&nbsp;</td>
+ <td>Win32 only: Use a .rc file (compile to temporary .res).
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>RES_FILE</td>
+ <td>&nbsp;</td>
+ <td>Win32 only: Link with a .res file.
+ </td>
+ </tr>
+</table>
+
+<p>
+
+
+<h4>The Library Template</h4>
+
+The library template, lib.t, lets you compile and create static or shared
+libraries.
+
+<p>
+The lib.t template supports the same project variables as app.t, but also
+<code>VERSION</code>. <code>VERSION</code> is the version number of the
+target library, e.g. 1.40. The version is important for shared libraries.
+
+
+
+<h4>The Subdirs Template</h4>
+
+The subdirs template, subdirs.t, lets you invoke make in subdirectories.
+
+<p>The <code>SUBDIRS</code> variable contains the name of all subdirectories to
+be processed.
+
+
+<h4>Special Templates for Microsoft Visual C++</h4>
+
+If you have Microsoft Visual C++ 5.0, you can use two special templates to
+generate a MSVC++ IDE project (.dsp file). After you have generated
+e.g. hello.dsp, choose "File"->"Open Workspace" and select the hello.dsp
+file. Visual C++ will then create a workspace (.dsw file) for you.<p>
+<table border="0">
+ <tr>
+ <td>&nbsp;</td>
+ <td>vcapp.t</td>
+ <td>&nbsp;</td>
+ <td>Creates an application project file (Microsoft Visual C++ 5.0
+ only).</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>vclib.t</td>
+ <td>&nbsp;</td>
+ <td>Creates a library project file (Microsoft Visual C++ 5.0
+ only).</td>
+ </tr>
+</table>
+
+<p>
+Run tmake to create a hello.dsp file (use -t to override the default
+template):<pre>
+ tmake -t vcapp -o hello.dsp hello.pro
+</pre>
+
+
+<hr>
+<h2>Project File Syntax</h2>
+
+The tmake project file has a very simple syntax. You may set
+project variables, append to project variables, remove from
+project variable and substitute project variables.
+
+To set a project variable:<pre>
+ HEADERS = gui.h xml.h url.h
+</pre>
+
+If you cannot fit everything on one line, use '\' to split it up:<pre>
+ HEADERS = gui.h \
+ xml.h \
+ url.h
+</pre>
+
+<p>
+Project variables contains lists of items (such as header files,
+compiler options etc.) and use whitespace to separate the items.
+This means that tmake cannot deal with items containing whitespace.
+The INCLUDEPATH variable is an exception. If INCLUDEPATH contains
+one or more semicolons (;), tmake uses the semicolon to separate
+the include directories, hence you can have include directories
+containing whitespace (this is quite common on Windows).
+
+<p>
+Here is an example:<pre>
+ INCLUDEPATH = C:\Program Files\DBLib\Include;C:\qt\include
+</pre>
+
+<p>
+tmake supports <em>project variable expension</em>. Use $$ to expand
+any project variable:<pre>
+ ALLFILES = $$HEADERS $$SOURCES
+</pre>
+
+<p>
+Most often you assign some value to a project variable, but you can
+also add to, remove from or replace parts of a project variable.<pre>
+ A = abc
+ X = xyz
+ A += def # A = abc def
+ X *= xyz # X = xyz
+ B = $$A # B = abc def
+ B -= abc # B = def
+ X /= s/y/Y/ # X = xYz
+</pre>
+The *= operation adds the value if the variable does not already contain it.
+The /= operation performs regular expression substitution.
+
+<p>
+You can also set variables from the command line when running the tmake
+program. For instance, if you want to generate a makefile with debug
+information:<pre>
+ tmake "CONFIG+=debug" hello.pro
+</pre>
+
+<p>
+Use the <tt>unix:</tt> or <tt>win32:</tt> (conditional) qualifier if you want a
+platform-specific variable:<pre>
+ SOURCES = common.cpp # common for all platforms
+ unix:SOURCES += unix.cpp # additional sources for Unix
+ win32:SOURCES += win32.cpp # additional sources for Windows
+ unix:LIBS += -lm # on Unix we need the math lib
+</pre>
+If none of the platforms match, tmake looks for the variable in CONFIG
+variable:<pre>
+ debug:SOURCES += dbgstuff.cpp # additional source for debugging
+</pre>
+
+Finally, you can set platform and compiler-dependent variables:<pre>
+ linux-g++:TMAKE_CFLAGS = -fno-rtti
+</pre>
+
+<p>
+You may define your own project variables to be used by custom templates. A
+project variable is stored in <code>%project</code>, which is an associative
+Perl array. Access it like this: <code>$project{"var"}</code> or via the
+function <code>Project("var")</code>. For example, after reading
+"hello.pro", <code>$project{"SOURCES"}</code> contains "hello.cpp
+main.cpp".<p>
+
+
+<hr>
+<h2><a name="usage"></a>Running tmake</h2>
+
+Usage:<pre>
+ tmake [options] <em>project files or project settings</em>
+</pre>
+Options:<pre>
+ -e expr Evaluate the Perl expression. Ignores the template file.
+ -nodepend Don't generate dependency information.
+ -o <em>file</em> Write output to <em>file</em> instead of stdout.
+ -t <em>file</em> Specify a template <em>file</em>.
+ -unix Force tmake into Unix mode.
+ -v Verbose/debugging on.
+ -win32 Force tmake into Win32 mode.
+</pre>
+
+The -t option overrides any <code>TEMPLATE</code> variable in the project file.
+<p>
+The default project file extension is ".pro". The default template file
+extension is ".t". If you do not specify these extension tmake will
+automatically add them for you.
+
+<p>
+Example of basic use:<pre>
+ tmake hello -o Makefile
+</pre>
+
+<p>
+Example of how to create a makefile with debugging information:<pre>
+ tmake "CONFIG+=debug" hello -o Makefile
+</pre>
+
+<p>
+Exmaple of how to specify a TMAKEPATH:<pre>
+ tmake "TMAKEPATH=/local/tmake/lib/hpux-g++" hello.pro -o Makefile
+</pre>
+
+Example of how to evaluate a perl expression (print names of headers
+and source files):<pre>
+ tmake hello -e 'Expand("HEADERS","SOURCES")'
+</pre>
+
+<hr>
+<h2><a name="progen"></a>The progen Utility</h2>
+
+The progen utility creates project files for you. It can be used like
+this:<pre>
+ progen -n hello -o hello.pro
+</pre>
+If no .cpp or .h files are specified on the command line, progen
+searches for .cpp and .h (except moc_*.cpp) in the current directory
+and below.
+<p>
+Usage:<pre>
+ progen [options] [<em>C/C++ header files and source files</em>]
+</pre>
+Options:<pre>
+ -lower Lower-case letters in filenames (useful on Windows).
+ -n <em>name</em> Specify a project name (<code>TARGET</code>).
+ -o <em>file</em> Write output to <em>file</em> instead of stdout.
+ -t <em>file</em> Specify a template <em>file</em>.
+</pre>
+
+
+<hr>
+<h2>Advanced Topics</h2>
+
+In most cases you will be happy with using tmake as described above, but
+sometimes you need to add special compiler options or even add new
+makefile rules. This chapter describes how to customize your makefiles.
+
+<h4>Conditional Project Settings</h4>
+
+If you need a special compiler option etc., you can add platform-dependent
+settings in your project file:<pre>
+ solaris-cc:TMAKE_CC = /opt/bin/CC_5.0
+ solaris-cc:TMAKE_CFLAGS = -pts
+ unix:TMAKE_LIBS = -lXext
+ win32:INCLUDEPATH = c:\myinclude
+ win32-borland:DEFINES = NO_BOOL
+</pre>
+
+You can prefix a project variable with unix: or win32: to make it specific for
+either Unix or Windows. You can also prefix a variable with
+<em>platform-compiler</em>
+
+<h4>Your Own Templates</h4>
+
+If you know Perl programming, there is virtually no limitation to what you
+can do with tmake. First you need to know how tmake works.
+
+<h4>Template Processing</h4>
+
+When you run tmake, it first reads the <tt>tmake.conf</tt> file.
+This configuration file has the same syntax as the project file.
+
+tmake then reads the project file and sets the project variables it
+finds, e.g. <code>HEADERS</code>, <code>SOURCES</code> etc.
+
+All variables and values are stored in a global associative Perl hash
+array called <code>project</code>. For example,
+<code>$project{"SOURCES"}</code> contains "hello.cpp main.cpp"
+after processing hello.pro.
+
+When both the <tt>tmake.conf</tt> and the project files have been
+read, tmake starts reading the template file line by line and
+executes any Perl code it finds in the template.
+
+<ul>
+<li>Anything after <code>#$</code> until newline is
+ evaluated as perl code. The perl code is substituted
+ with the contents of the <code>$text</code>
+ variable.
+<li>Block of perl code: <code>#${</code> until
+ <code>#$}</code>.
+<li>Comments; <code>#!</code> until newline is stripped.
+<li>Anything else is copied directly from the template to
+ the output.
+</ul>
+
+<p>
+Example:<pre>
+ #! This is a comment which will be removed.
+ This text will appear in the output.
+ #$ $text = "The header file(s) are: " . $project{"HEADERS"};
+ # This text also appears in the output.
+ #${
+ $a = 12;
+ $b = 13;
+ $text = $a * $b;
+ #$}
+ That's all.
+</pre>
+Output:<pre>
+ This text will appear in the output.
+ The header file(s) are: hello.h
+ # This text also appears in the output.
+ 156
+ That's all.
+</pre>
+
+
+<h3>Using tmake With Lex and Yacc</h3>
+
+The standard tmake templates knows how to process C and C++ files, but
+sometimes you need to process additional files and link them into your
+project. A typical example is to process lex and yacc files when you're
+building a parser.
+
+<p>
+Parser template:<pre>
+ #!
+ #! parser.t: This is a custom template for building a parser
+ #!
+ #$ IncludeTemplate("app.t");
+
+ ####### Lex/yacc programs and options
+
+ LEX = flex
+ YACC = #$ $text = ($is_unix ? "yacc -d" : "byacc -d");
+
+ ####### Lex/yacc files
+
+ LEXIN = #$ Expand("LEXINPUT");
+ LEXOUT = lex.yy.c
+ YACCIN = #$ Expand("YACCINPUT");
+ YACCOUT = y.tab.c
+ YACCHDR = y.tab.h
+ PARSER = #$ Expand("PARSER");
+
+ ####### Process lex/yacc files
+
+ $(LEXOUT): $(LEXIN)
+ $(LEX) $(LEXIN)
+
+ $(PARSER): $(YACCIN) $(LEXOUT)
+ $(YACC) $(YACCIN)
+ #$ $text = ($is_unix ? "-rm -f " : "-del ") . '$(PARSER)';
+ #$ $text = ($is_unix ? "-mv " : "-ren ") . '$(YACCOUT) $(PARSER)';
+</pre>
+
+The parser template adds some extra rules to the application template
+in order to build the lex and yacc portions of the project. This
+template is portable across Unix and Windows since it generates different
+commands depending on the <code>$is_unix</code> variable.
+
+<p>
+To learn more about the Expand() function and other Perl functions which
+tmake provides, consult the <a href="tmake_ref.html">reference manual</a>.
+
+<p>
+Example project file:<pre>
+ TEMPLATE = parser.t
+ CONFIG = console release
+ LEXINPUT = lexer.l
+ YACCINPUT = grammar.y
+ PARSER = parser.cpp
+ SOURCES = $$PARSER \
+ node.cpp \
+ asmgen.cpp
+ TARGET = parser
+</pre>
+
+Here we use macro expansion <code>$$PARSER</code> to avoid writing parser.cpp
+two places.
+
+
+<h3>Counting the Number of Code Lines</h3>
+
+tmake is generic since it is based on Perl. You can create your own
+templates for other purposes than producing makefiles. Here is an example
+template that counts the number of code lines in our project.
+
+<p>
+Template wc.t:<pre>
+ #! Template that count number of C++ lines.
+ The number of C++ code lines for #$ $text=$project_name;
+ #${
+ $files = $project{"HEADERS"} . " " . $project{"SOURCES"};
+ $text = `wc -l $files`;
+ #$}
+</pre>
+Run it:<pre>
+ tmake -t wc hello
+</pre>
+Output:<pre>
+ The number of C++ code lines for hello.pro
+ 25 hello.h
+ 98 hello.cpp
+ 38 main.cpp
+ 161 total
+</pre>
+This will only work if the wc program is installed on your system.
+
+
+</body></html>
diff --git a/tmake/doc/tmake_ref.html b/tmake/doc/tmake_ref.html
new file mode 100644
index 0000000..c9124c4
--- /dev/null
+++ b/tmake/doc/tmake_ref.html
@@ -0,0 +1,463 @@
+<!doctype HTML public "-//W3C//DTD HTML 3.2//EN">
+<html><head><title>
+Reference Manual - tmake
+</title></head><body bgcolor="#ffffff">
+<p><h1 align=center>Reference Manual - tmake</h1>
+
+<hr>
+<h2>Project Variable Reference</h2>
+
+<h4><a name="ALL_DEPS"></a>ALL_DEPS</h4>
+Specifies additional dependencies for the makefile target "all:".<p>
+
+
+<h4><a name="CLEAN_FILES"></a>CLEAN_FILES</h4>
+Specifies additional files to be removed for "make clean".<p>
+Example:<pre>
+ CLEAN_FILES = core *~
+</pre>
+
+
+<h4><a name="CONFIG"></a>CONFIG</h4>
+Sets the make configuration. It tells the tmake templates what compiler
+options to use and which extra libraries to link in.<p>
+These options control the compilation flags:
+<p>
+<table border="0">
+ <tr>
+ <td>&nbsp;</td>
+ <td>release</td>
+ <td>&nbsp;</td>
+ <td>Compile with optimization enabled, ignored if
+ "debug" is specified.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>debug</td>
+ <td>&nbsp;</td>
+ <td>Compile with debug options enabled.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>warn_on</td>
+ <td>&nbsp;</td>
+ <td>The compiler should emit more warnings than normally, ignored if
+ "warn_off" is specified.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>warn_off</td>
+ <td>&nbsp;</td>
+ <td>The compiler should emit no warnings or as few as possible.</td>
+ </tr>
+</table>
+
+<p>
+These options defines the application/library type:
+<p>
+<table border="0">
+ <tr>
+ <td>&nbsp;</td>
+ <td>qt</td>
+ <td>&nbsp;</td>
+ <td>The target is a Qt application/library and requires Qt header
+ files/library.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>opengl</td>
+ <td>&nbsp;</td>
+ <td>The target requires the OpenGL (or Mesa) headers/libraries.</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>x11</td>
+ <td>&nbsp;</td>
+ <td>The target is a X11 application (app.t only).</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>windows</td>
+ <td>&nbsp;</td>
+ <td>The target is a Win32 window application (app.t only).</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>console</td>
+ <td>&nbsp;</td>
+ <td>The target is a Win32 console application (app.t only).</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>dll</td>
+ <td>&nbsp;</td>
+ <td>The target is a shared object/DLL (app.t only).</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>staticlib</td>
+ <td>&nbsp;</td>
+ <td>The target is a static library (lib.t only).</td>
+ </tr>
+</table>
+
+
+<h4><a name="DEFINES"></a>DEFINES</h4>
+Specifies C/C++ macros (-D compiler option). On Windows you need
+to let DEFINES contain "QT_DLL" if you are building a Qt program
+which should link with the Qt DLL.
+
+
+<h4><a name="DEF_FILE"></a>DEF_FILE</h4>
+Win32/app.t only: Specifies a .def file.
+
+
+<h4><a name="DESTDIR"></a>DESTDIR</h4>
+Specifies where to put the target file.
+Example:<pre>
+ DESTDIR = ../../lib
+</pre>
+You must create this directory before running make.
+
+
+<h4><a name="HEADERS"></a>HEADERS</h4>
+Defines the header files of the project.
+
+
+<h4><a name="INCPATH"></a>INCPATH</h4>
+This variable is generated from <code>INCLUDEPATH</code>. The ';' or ':'
+separators have been replaced by ' ' (single space). This makes it
+easier to split. qtapp.t and other templates expand
+<code>INCPATH</code> to set -I options for the C++ compiler.
+
+
+<h4><a name="INCLUDEPATH"></a>INCLUDEPATH</h4>
+This variable specifies the #include directories. It can be set in the
+project file, or by the <a href="#AddIncludePath">AddIncludePath()</a>
+function.<p>
+Example:<pre>
+ INCLUDEPATH = c:\msdev\include d:\stl\include
+</pre>
+Use ';' or space as the directory separator.
+
+
+<h4><a name="LIBS"></a>LIBS</h4>
+Defines additional libraries to be linked in when creating an application
+or a shared library. You probably want to use a platform qualifier since
+libraries are specified differently on Unix and Win32.<p>
+Example:<pre>
+ unix:LIBS = -lXext -lm
+ win32:LIBS = ole32.lib
+</pre>
+
+
+<h4><a name="MOC_DIR"></a>MOC_DIR</h4>
+Specifies where to put the temporary moc output files. By default they
+are stored in the directory where the moc input files are.
+<p>
+Example:<pre>
+ MOC_DIR = tmp
+</pre>
+You must create this directory before running make.
+<p>
+See also: <a href="#OBJECTS_DIR">OBJECTS_DIR</a>.
+
+
+<h4><a name="OBJECTS"></a>OBJECTS</h4>
+This varialble is generated from <code>SOURCES</code> by the StdInit() function.
+The extension of each source file has been replaced by .o (Unix) or .obj
+(Win32).<p>
+Example:<pre>
+ SOURCES = a.x b.y
+</pre>
+Then <code>OBJECTS</code> become "a.o b.o" on Unix and "a.obj b.obj" on
+Win32.
+
+
+<h4><a name="OBJECTS_DIR"></a>OBJECTS_DIR</h4>
+Specifies where to put object files. By default they are stored in
+the directory where the source files are.<p>
+Example:<pre>
+ OBJECTS_DIR = tmp
+</pre>
+You must create this directory before running make.
+<p>
+See also: <a href="#MOC_DIR">MOC_DIR</a>.
+
+
+<h4><a name="OBJMOC"></a>OBJMOC</h4>
+This variable is generated by the <a href="#StdInit">StdInit()</a> function if
+<code>$moc_aware</code> is true. <code>OBJMOC</code> contains the name of
+all intermediate moc object files.<p>
+Example:<pre>
+ HEADERS = demo.h
+ SOURCES = demo.cpp main.cpp
+</pre>
+If <tt>demo.h</tt> and <tt>main.cpp</tt> define classes that use signals
+and slots (i.e. the <code>Q_OBJECT</code> "keyword" is found in these two
+files), <code>OBJMOC</code> becomes:<pre>
+ OBJMOC = moc_demo.obj
+</pre>
+See also: <a href="#SRCMOC">SRCMOC</a>.
+
+
+<h4><a name="PROJECT"></a>PROJECT</h4>
+This is the name of the project. It defaults to the name of the project
+file, excluding the .pro extension.
+
+
+<h4><a name="RC_FILE"></a>RC_FILE</h4>
+Win32/app.t only: Specifies a .rc file. Cannot be used with the RES_FILE
+variable.
+
+
+<h4><a name="RES_FILE"></a>RES_FILE</h4>
+Win32/app.t only: Specifies a .res file. You can either specify a
+.rc file or one or more .res files.
+
+
+<h4><a name="SOURCES"></a>SOURCES</h4>
+Defines the source files of the project.
+
+
+<h4><a name="SRCMOC"></a>SRCMOC</h4>
+This variable is generated by the <a href="#StdInit">StdInit()</a> function if
+<code>CONFIG</code> contains "qt". <code>SRCMOC</code> contains the name of
+all intermediate moc files.<p>
+Example:<pre>
+ HEADERS = demo.h
+ SOURCES = demo.cpp main.cpp
+</pre>
+If <tt>demo.h</tt> and <tt>main.cpp</tt> define classes that use signals
+and slots (i.e. the <code>Q_OBJECT</code> "keyword" is found in these two
+files), <code>SRCMOC</code> becomes:<pre>
+ SRCMOC = moc_demo.cpp main.moc
+</pre>
+See also: <a href="#OBJMOC">OBJMOC</a>.
+
+
+<h4><a name="TARGET"></a>TARGET</h4>
+Sets the makefile target, i.e. what program to build.
+
+
+<h4><a name="TEMPLATE"></a>TEMPLATE</h4>
+Sets the default template. This can be overridden by the tmake -t
+<a href="tmake.html#usage">option</a>.
+
+
+<h4><a name="TMAKE_CC"></a>TMAKE_CC</h4>
+Contains the name of the compiler.
+
+
+<h4><a name="TMAKE_CFLAGS"></a>TMAKE_CFLAGS</h4>
+Contains the default compiler flags.
+
+
+<h4><a name="TMAKE_FILEVARS"></a>TMAKE_FILEVARS</h4>
+Tells tmake which variables contain file names. This is because tmake
+on Windows replace the directory separator / with \.
+
+
+<hr>
+<h2>Function Reference</h2>
+This section contains a brief description of some important
+tmake functions used by the templates.
+
+
+<h3><a name="AddIncludePath"></a>AddIncludePath(path)</h3>
+Adds <em>path</em> to the include path variable,
+<a href="#INCLUDEPATH">INCLUDEPATH</a>. The include path is used
+for two purposes:<ol>
+<li>Searching files when generating include dependencies.
+<li>Setting -I options for the C/C++ compiler.
+</ol>
+<p>
+Example:<pre>
+ #$ AddIncludePath('$QTDIR/include;/local/include');
+</pre>
+
+
+<h3>BuildMocObj(objects,sources)</h3>
+Creates build rules for moc source files. Generates
+include dependencies.<p>
+Example:<pre>
+ #$ BuildMocObj($project{"OBJMOC"},$project{"SRCMOC"});
+</pre>Output:<pre>
+ moc_hello.o: moc_hello.cpp \
+ hello.h \
+ ...
+</pre>
+
+<h3>BuildMocSrc(files)</h3>
+Creates moc source files from C++ files containing classes that
+define signals and slots. For a header file <tt>x.h</tt>, the
+generated moc file is called <tt>moc_x.h</tt>. For a source file
+<tt>y.cpp</tt>, the generates moc file is called <tt>y.moc</tt> and
+should be #include'd by <tt>y.cpp</tt>.<p>
+Example:<pre>
+ #$ BuildMocSrc($project{"HEADERS"});
+ #$ BuildMocSrc($project{"SOURCES"});
+</pre>Output:<pre>
+ moc_hello.cpp: hello.h
+ $(MOC) hello.h -o moc_hello.cpp
+</pre>
+
+
+<h3>BuildObj(objects,sources)</h3>
+Creates build rules for source files. Generates
+include dependencies.<p>
+Example:<pre>
+ #$ BuildObj($project{"OBJECTS"},$project{"SOURCES"});
+</pre>Output:<pre>
+ hello.o: hello.cpp \
+ hello.h \
+ ...
+
+ main.o: main.cpp \
+ hello.h \
+ ...
+</pre>
+
+
+<h3>Config(string)</h3>
+Returns true if the <code>CONFIG</code> variable contains the given string.
+<p>Example:<pre>
+ #$ if ( Config("release") { }
+</pre>
+
+
+<h3>DisableOutput()</h3>
+Call this function to force tmake to generate no output until
+EnableOutput() is called.
+<p>Example:<pre>
+ #$ Config("debug") && DisableOutput();
+ Anything here is skipped if CONFIG contains "debug".
+ #$ Config("debug") && EnableOutput();
+</pre>
+
+
+<h3>EnableOutput()</h3>
+Enables tmake output after DisableOutput() was called.
+
+
+<h3>Expand(var)</h3>
+Expands a project variable. Equivalent to <code>$text = $project{$var}</code>.
+<p>Example:<pre>
+ VERSION = #$ Expand("VERSION");
+</pre>Output:<pre>
+ VERSION = 1.1
+</pre>
+
+<h3>ExpandGlue(var,prepend,glue,append)</h3>
+Expands a $project{} variable, splits on whitespace
+and joins with $glue. $prepend is put at the start
+of the string and $append is put at the end of the
+string. The resulting string ($text) becomes "" if
+the project variable is empty or not defined.<p>
+Example:<pre>
+ clear:
+ #$ ExpandGlue("OBJECTS","-del","\n\t-del ","");
+</pre>Output (Windows NT):<pre>
+ clear:
+ -del hello.obj
+ -del main.obj
+</pre>
+
+
+<h3>ExpandList(var)</h3>
+This function is suitable for expanding lists of files.
+Equivalent with <code>ExpandGlue($var,""," \\\n\t\t","")</code>.<p>
+Example:<pre>
+ OBJECTS = #$ ExpandList("OBJECTS");
+</pre>Output:<pre>
+ OBJECTS = hello.o \
+ main.o
+</pre>
+
+
+<h3>ExpandPath(var,prepend,glue,append)</h3>
+Similar to ExpandGlue, except that it splits the items on a semicolon
+instead of space (if the variable contains at least one semicolon).
+
+
+<h3>IncludeTemplate(file)</h3>
+Includes a template file. The ".t" extension is optional.<p>
+Example:<pre>
+ #$ IncludeTemplate("mytemplate");
+</pre>
+
+
+<h3>Now()</h3>
+Sets $text to the current date and time.<p>
+Example:<pre>
+ # Generated at #$ Now()
+</pre>Output:<pre>
+ # Generated at 12:58, 1996/11/19
+</pre>
+
+
+<h3>Project(strings)</h3>
+This is a powerful function for setting and reading project
+variables. Returns the resulting project variables (joined with space
+between).
+<p>Examples:<pre>
+# Get a project variable:
+ $s = Project("TEMPLATE"); -> $s = "TEMPLATE"
+
+# Set a project variable:
+ Project("TEMPLATE = lib"); -> TEMPLATE = lib
+ Project("CONFIG =";) -> CONFIG empty
+
+# Append to a project variable:
+ Project("CONFIG = qt"); -> CONFIG = qt
+ Project("CONFIG += debug"); -> CONFIG = qt debug
+
+# Append to a project variable if it does not contain the value already:
+ Project("CONFIG = qt release"); -> CONFIG = qt release
+ Project("CONFIG *= qt"); -> CONFIG = qt release
+ Project("CONFIG *= opengl"); -> CONFIG = qt release opengl
+
+# Subtract from a project variable:
+ Project("THINGS = abc xyz"); -> THINGS = abc xyz
+ Project("THINGS -= abc"); -> THINGS = xyz
+
+# Search/replace on a project variable:
+ Project("CONFIG = tq opengl"); -> CONFIG = tq opengl
+ Project("CONFIG /= s/tq/qt/"); -> CONFIG = qt opengl
+
+# The operations can be performed on several project variables at a time.
+
+ Project("TEMPLATE = app", "CONFIG *= opengl", "THINGS += klm");
+</pre>
+
+
+<h3><a name="ScanProject"></a>ScanProject(file)</h3>
+Scans a project file and stores the project variables and values in the
+global associative <code>%project</code> array.
+
+
+<h3><a name="StdInit"></a>StdInit()</h3>
+Standard initialization of tmake. StdInit() should be
+called from one of the first lines in the template.<p>
+
+This function creates some new project variables:<ul>
+<li><code><a href="#OBJECTS">OBJECTS</a></code>
+ - Object files corresponding to
+ <code><a href="#SOURCES">SOURCES</a></code>.
+<li><code><a href="#SRCMOC">SRCMOC</a></code> - moc source files.
+<li><code><a href="#OBJMOC">OBJMOC</a></code> - moc object files.
+</ul>
+
+The moc-related variables are created only if <code>CONFIG</code> contains "qt"
+
+
+<h3>Substitute(string)</h3>
+This function takes a string and substitutes any occurrence of $$var
+with the actual content of the variable. Returns the substituted string.
+Also sets $text.
+<p>
+Important: Use single quotes around the string, otherwise perl will expand
+any $vars it finds.
+<p>Example:<pre>
+ Substitute('Project name: $$PROJECT, uses template $$TEMPLATE');
+</pre>
diff --git a/tmake/example/hello.cpp b/tmake/example/hello.cpp
new file mode 100644
index 0000000..4868c4d
--- /dev/null
+++ b/tmake/example/hello.cpp
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+**
+** Copyright (C) 1992-1998 Troll Tech AS. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "hello.h"
+#include <qpushbutton.h>
+#include <qtimer.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+
+
+/*
+ Constructs a Hello widget. Starts a 40 ms animation timer.
+*/
+
+Hello::Hello( const char *text, QWidget *parent, const char *name )
+ : QWidget(parent,name), t(text), b(0)
+{
+ QTimer *timer = new QTimer(this);
+ connect( timer, SIGNAL(timeout()), SLOT(animate()) );
+ timer->start( 40 );
+
+ resize( 200, 100 );
+}
+
+
+/*
+ This private slot is called each time the timer fires.
+*/
+
+void Hello::animate()
+{
+ b = (b + 1) & 15;
+ repaint( FALSE );
+}
+
+
+/*
+ Handles mouse button release events for the Hello widget.
+
+ We emit the clicked() signal when the mouse is released inside
+ the widget.
+*/
+
+void Hello::mouseReleaseEvent( QMouseEvent *e )
+{
+ if ( rect().contains( e->pos() ) )
+ emit clicked();
+}
+
+
+/*
+ Handles paint events for the Hello widget.
+
+ Flicker-free update. The text is first drawn in the pixmap and the
+ pixmap is then blt'ed to the screen.
+*/
+
+void Hello::paintEvent( QPaintEvent * )
+{
+ static int sin_tbl[16] = {
+ 0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38};
+
+ if ( t.isEmpty() )
+ return;
+
+ // 1: Compute some sizes, positions etc.
+ QFontMetrics fm = fontMetrics();
+ int w = fm.width(t) + 20;
+ int h = fm.height() * 2;
+ int pmx = width()/2 - w/2;
+ int pmy = height()/2 - h/2;
+
+ // 2: Create the pixmap and fill it with the widget's background
+ QPixmap pm( w, h );
+ pm.fill( this, pmx, pmy );
+
+ // 3: Paint the pixmap. Cool wave effect
+ QPainter p;
+ int x = 10;
+ int y = h/2 + fm.descent();
+ int i = 0;
+ p.begin( &pm );
+ p.setFont( font() );
+ while ( t[i] ) {
+ int i16 = (b+i) & 15;
+ p.setPen( QColor((15-i16)*16,255,255,QColor::Hsv) );
+ p.drawText( x, y-sin_tbl[i16]*h/800, &t[i], 1 );
+ x += fm.width( t[i] );
+ i++;
+ }
+ p.end();
+
+ // 4: Copy the pixmap to the Hello widget
+ bitBlt( this, pmx, pmy, &pm );
+}
diff --git a/tmake/example/hello.h b/tmake/example/hello.h
new file mode 100644
index 0000000..07fb8c5
--- /dev/null
+++ b/tmake/example/hello.h
@@ -0,0 +1,34 @@
+/****************************************************************************
+**
+**
+** Copyright (C) 1992-1998 Troll Tech AS. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef HELLO_H
+#define HELLO_H
+
+#include <qwidget.h>
+
+
+class Hello : public QWidget
+{
+ Q_OBJECT
+public:
+ Hello( const char *text, QWidget *parent=0, const char *name=0 );
+signals:
+ void clicked();
+protected:
+ void mouseReleaseEvent( QMouseEvent * );
+ void paintEvent( QPaintEvent * );
+private slots:
+ void animate();
+private:
+ QString t;
+ int b;
+};
+
+#endif
diff --git a/tmake/example/hello.pro b/tmake/example/hello.pro
new file mode 100644
index 0000000..a299923
--- /dev/null
+++ b/tmake/example/hello.pro
@@ -0,0 +1,3 @@
+HEADERS = hello.h
+SOURCES = hello.cpp main.cpp
+TARGET = hello
diff --git a/tmake/example/main.cpp b/tmake/example/main.cpp
new file mode 100644
index 0000000..4b55a58
--- /dev/null
+++ b/tmake/example/main.cpp
@@ -0,0 +1,38 @@
+//
+// File: main.cpp
+//
+// A small Qt example application written by Troll Tech.
+//
+// It displays a text in a window and quits when you click
+// the mouse in the window.
+//
+
+#include "hello.h"
+#include <qapp.h>
+
+
+/*
+ The program starts here. It parses the command line and build a message
+ string to be displayed by the Hello widget.
+*/
+
+int main( int argc, char **argv )
+{
+ QApplication a(argc,argv);
+ QString s;
+ for ( int i=1; i<argc; i++ ) {
+ s += argv[i];
+ if ( i<argc-1 )
+ s += " ";
+ }
+ if ( s.isEmpty() )
+ s = "Hello, World";
+ Hello h( s );
+ h.setCaption( "Qt says hello" );
+ QObject::connect( &h, SIGNAL(clicked()), &a, SLOT(quit()) );
+ h.setFont( QFont("times",32,QFont::Bold) ); // default font
+ h.setBackgroundColor( white ); // default bg color
+ a.setMainWidget( &h );
+ h.show();
+ return a.exec();
+}
diff --git a/tmake/example/wc.t b/tmake/example/wc.t
new file mode 100644
index 0000000..dc041b5
--- /dev/null
+++ b/tmake/example/wc.t
@@ -0,0 +1,6 @@
+#! Template that count number of C++ lines
+The number of C++ code lines for #$ $text=$project_name;
+#${
+ $files = $project{"HEADERS"} . " " . $project{"SOURCES"};
+ $text = `wc -l $files`;
+#$}
diff --git a/tmake/lib/aix-g++/app.t b/tmake/lib/aix-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/aix-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/aix-g++/lib.t b/tmake/lib/aix-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/aix-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/aix-g++/subdirs.t b/tmake/lib/aix-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/aix-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/aix-g++/tmake.conf b/tmake/lib/aix-g++/tmake.conf
new file mode 100644
index 0000000..897d509
--- /dev/null
+++ b/tmake/lib/aix-g++/tmake.conf
@@ -0,0 +1,58 @@
+#
+#
+#
+# tmake configuration for aix-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB =
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB =
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB =
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/aix-xlc/app.t b/tmake/lib/aix-xlc/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/aix-xlc/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/aix-xlc/lib.t b/tmake/lib/aix-xlc/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/aix-xlc/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/aix-xlc/subdirs.t b/tmake/lib/aix-xlc/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/aix-xlc/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/aix-xlc/tmake.conf b/tmake/lib/aix-xlc/tmake.conf
new file mode 100644
index 0000000..4013923
--- /dev/null
+++ b/tmake/lib/aix-xlc/tmake.conf
@@ -0,0 +1,64 @@
+#
+#
+#
+# tmake configuration for aix-xlc
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = xlc
+TMAKE_CFLAGS = -qstrict
+TMAKE_CFLAGS_WARN_ON =
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB =
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = xlC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = xlC
+TMAKE_LINK_SHLIB = ld
+TMAKE_LINK_SHLIB_CMD = /usr/lpp/xlC/bin/makeC++SharedLib -p 0 \
+ -o lib$(TARGET).so.$(VER_MAJ).$(VER_MIN) \
+ -lXext -lX11 $(OBJECTS) $(OBJMOC); \
+ ar q lib$(TARGET).a lib$(TARGET).so.$(VER_MAJ).$(VER_MIN); \
+ ranlib lib$(TARGET).a; \
+ mv lib$(TARGET).a $(DESTDIR)
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB =
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS = -liconv
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB = ranlib
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/beos-g++/app.t b/tmake/lib/beos-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/beos-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/beos-g++/lib.t b/tmake/lib/beos-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/beos-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/beos-g++/subdirs.t b/tmake/lib/beos-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/beos-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/beos-g++/tmake.conf b/tmake/lib/beos-g++/tmake.conf
new file mode 100644
index 0000000..b6649c9
--- /dev/null
+++ b/tmake/lib/beos-g++/tmake.conf
@@ -0,0 +1,51 @@
+#
+#
+#
+# tmake configuration for linux-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE =
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS = -Wl,-rpath=/lib:$(QTDIR)/lib
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/bsdi-g++/app.t b/tmake/lib/bsdi-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/bsdi-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/bsdi-g++/lib.t b/tmake/lib/bsdi-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/bsdi-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/bsdi-g++/subdirs.t b/tmake/lib/bsdi-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/bsdi-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/bsdi-g++/tmake.conf b/tmake/lib/bsdi-g++/tmake.conf
new file mode 100644
index 0000000..65f7316
--- /dev/null
+++ b/tmake/lib/bsdi-g++/tmake.conf
@@ -0,0 +1,61 @@
+#
+#
+#
+# tmake configuration for bsdi-shlicc++, bsdi 4.0
+#
+# shlicc/++ is a BSDI wrapper around cc/g++ that enables shared libs
+# (info/7367)
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = shlicc++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = shlicc++
+TMAKE_LINK_SHLIB = shlicc++
+TMAKE_LFLAGS = -Wl,-rpath=/lib:/usr/X11R6/lib:$(QTDIR)/lib
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/dgux-g++/app.t b/tmake/lib/dgux-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/dgux-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/dgux-g++/lib.t b/tmake/lib/dgux-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/dgux-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/dgux-g++/subdirs.t b/tmake/lib/dgux-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/dgux-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/dgux-g++/tmake.conf b/tmake/lib/dgux-g++/tmake.conf
new file mode 100644
index 0000000..f4132d1
--- /dev/null
+++ b/tmake/lib/dgux-g++/tmake.conf
@@ -0,0 +1,59 @@
+#
+#
+#
+# tmake configuration for linux-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+# "Frithjof.Brestrich" <brest@infp.fzk.de> suggests -h not -soname
+TMAKE_LFLAGS_SONAME = -Wl,-h,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/freebsd-g++/app.t b/tmake/lib/freebsd-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/freebsd-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/freebsd-g++/lib.t b/tmake/lib/freebsd-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/freebsd-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/freebsd-g++/subdirs.t b/tmake/lib/freebsd-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/freebsd-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/freebsd-g++/tmake.conf b/tmake/lib/freebsd-g++/tmake.conf
new file mode 100644
index 0000000..0b3c497
--- /dev/null
+++ b/tmake/lib/freebsd-g++/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for freebsd-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS = -pipe
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+
+# soname does not work on fbsd 2.x
+#TMAKE_LFLAGS_SONAME = -Wl,-soname
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/gnu-g++/app.t b/tmake/lib/gnu-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/gnu-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/gnu-g++/lib.t b/tmake/lib/gnu-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/gnu-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/gnu-g++/subdirs.t b/tmake/lib/gnu-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/gnu-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/gnu-g++/tmake.conf b/tmake/lib/gnu-g++/tmake.conf
new file mode 100644
index 0000000..635bc5c
--- /dev/null
+++ b/tmake/lib/gnu-g++/tmake.conf
@@ -0,0 +1,58 @@
+#
+#
+#
+# tmake configuration for linux-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS = -Wl,-rpath=/lib:/usr/X11R6/lib:$(QTDIR)/lib
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/hpux-acc/app.t b/tmake/lib/hpux-acc/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/hpux-acc/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/hpux-acc/lib.t b/tmake/lib/hpux-acc/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/hpux-acc/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/hpux-acc/subdirs.t b/tmake/lib/hpux-acc/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/hpux-acc/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/hpux-acc/tmake.conf b/tmake/lib/hpux-acc/tmake.conf
new file mode 100644
index 0000000..dbd0c8e
--- /dev/null
+++ b/tmake/lib/hpux-acc/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for hpux-acc
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = aCC
+TMAKE_CFLAGS = -w -D__STRICT_ANSI__ -DPNG_USE_LOCAL_ARRAYS
+TMAKE_CFLAGS_WARN_ON =
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = +Z
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = aCC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/include/X11R6
+TMAKE_LIBDIR_X11 = /usr/lib/X11R6
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL = /opt/graphics/OpenGL/lib
+
+TMAKE_LINK = aCC
+TMAKE_LINK_SHLIB = aCC
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -b
+TMAKE_LFLAGS_SONAME =
+TMAKE_HPUX_SHLIB = 1
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm -lICE -lSM
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl -lGL
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+TMAKE_LIBS_YACC = -ly
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/hpux-cc/app.t b/tmake/lib/hpux-cc/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/hpux-cc/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/hpux-cc/lib.t b/tmake/lib/hpux-cc/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/hpux-cc/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/hpux-cc/subdirs.t b/tmake/lib/hpux-cc/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/hpux-cc/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/hpux-cc/tmake.conf b/tmake/lib/hpux-cc/tmake.conf
new file mode 100644
index 0000000..b5881ec
--- /dev/null
+++ b/tmake/lib/hpux-cc/tmake.conf
@@ -0,0 +1,59 @@
+#
+#
+#
+# tmake configuration for hpux-cc
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cc
+TMAKE_CFLAGS = -w +a1 -DAportable
+TMAKE_CFLAGS_WARN_ON =
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = +Z
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = CC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/include/X11R6
+TMAKE_LIBDIR_X11 = /usr/lib/X11R6
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = CC
+TMAKE_LINK_SHLIB = CC
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -b
+TMAKE_LFLAGS_SONAME =
+TMAKE_HPUX_SHLIB = 1
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/hpux-g++/app.t b/tmake/lib/hpux-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/hpux-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/hpux-g++/lib.t b/tmake/lib/hpux-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/hpux-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/hpux-g++/subdirs.t b/tmake/lib/hpux-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/hpux-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/hpux-g++/tmake.conf b/tmake/lib/hpux-g++/tmake.conf
new file mode 100644
index 0000000..fb39414
--- /dev/null
+++ b/tmake/lib/hpux-g++/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for hpux-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O0
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/include/X11R6
+TMAKE_LIBDIR_X11 = /usr/lib/X11R6
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -fPIC -shared
+TMAKE_LFLAGS_SONAME =
+TMAKE_HPUX_SHLIB = 1
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL =
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-64/app.t b/tmake/lib/irix-64/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/irix-64/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-64/lib.t b/tmake/lib/irix-64/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/irix-64/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-64/subdirs.t b/tmake/lib/irix-64/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/irix-64/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-64/tmake.conf b/tmake/lib/irix-64/tmake.conf
new file mode 100644
index 0000000..ac0e2fa
--- /dev/null
+++ b/tmake/lib/irix-64/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for irix-64
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cc
+TMAKE_CFLAGS = -64 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
+TMAKE_CFLAGS_WARN_ON = -fullwarn
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2 -OPT:Olimit=3000
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB =
+TMAKE_CFLAGS_YACC = -woff 1110,1174,3262
+
+TMAKE_CXX = CC
+TMAKE_CXXFLAGS = -64 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = CC
+TMAKE_LINK_SHLIB = CC
+TMAKE_LFLAGS = -64
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_CLEAN = -r so_locations ii_files
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-dcc/app.t b/tmake/lib/irix-dcc/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/irix-dcc/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-dcc/lib.t b/tmake/lib/irix-dcc/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/irix-dcc/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-dcc/subdirs.t b/tmake/lib/irix-dcc/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/irix-dcc/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-dcc/tmake.conf b/tmake/lib/irix-dcc/tmake.conf
new file mode 100644
index 0000000..0fcbaa8
--- /dev/null
+++ b/tmake/lib/irix-dcc/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for irix-dcc
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = DCC
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -fullwarn
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB =
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = DCC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = DCC
+TMAKE_LINK_SHLIB = DCC
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_CLEAN = so_locations
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-g++/app.t b/tmake/lib/irix-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/irix-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-g++/lib.t b/tmake/lib/irix-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/irix-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-g++/subdirs.t b/tmake/lib/irix-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/irix-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-g++/tmake.conf b/tmake/lib/irix-g++/tmake.conf
new file mode 100644
index 0000000..2192c71
--- /dev/null
+++ b/tmake/lib/irix-g++/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for irix-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O0
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB = ranlib
+
+TMAKE_CLEAN = so_locations
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-n32/app.t b/tmake/lib/irix-n32/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/irix-n32/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-n32/lib.t b/tmake/lib/irix-n32/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/irix-n32/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-n32/subdirs.t b/tmake/lib/irix-n32/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/irix-n32/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-n32/tmake.conf b/tmake/lib/irix-n32/tmake.conf
new file mode 100644
index 0000000..9d8bcb4
--- /dev/null
+++ b/tmake/lib/irix-n32/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for irix-n32
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cc
+TMAKE_CFLAGS = -n32 -mips3 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
+TMAKE_CFLAGS_WARN_ON = -fullwarn
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB =
+TMAKE_CFLAGS_YACC = -woff 1110,1174,3262
+
+TMAKE_CXX = CC
+TMAKE_CXXFLAGS = -n32 -mips3 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = CC
+TMAKE_LINK_SHLIB = CC
+TMAKE_LFLAGS = -n32
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl -lGL
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_CLEAN = -r so_locations ii_files
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-o32/app.t b/tmake/lib/irix-o32/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/irix-o32/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-o32/lib.t b/tmake/lib/irix-o32/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/irix-o32/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-o32/subdirs.t b/tmake/lib/irix-o32/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/irix-o32/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-o32/tmake.conf b/tmake/lib/irix-o32/tmake.conf
new file mode 100644
index 0000000..89b8728
--- /dev/null
+++ b/tmake/lib/irix-o32/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for irix-o32
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cc
+TMAKE_CFLAGS = -32 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
+TMAKE_CFLAGS_WARN_ON = -fullwarn
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2 -OPT:Olimit=3000
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB =
+TMAKE_CFLAGS_YACC = -woff 1110,1174,3262
+
+TMAKE_CXX = CC
+TMAKE_CXXFLAGS = -32 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = CC
+TMAKE_LINK_SHLIB = CC
+TMAKE_LFLAGS = -32
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_CLEAN = -r so_locations ii_files
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/linux-64/app.t b/tmake/lib/linux-64/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/linux-64/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/linux-64/lib.t b/tmake/lib/linux-64/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/linux-64/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/linux-64/subdirs.t b/tmake/lib/linux-64/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/linux-64/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/linux-64/tmake.conf b/tmake/lib/linux-64/tmake.conf
new file mode 100644
index 0000000..9416078
--- /dev/null
+++ b/tmake/lib/linux-64/tmake.conf
@@ -0,0 +1,59 @@
+#
+#
+#
+# tmake configuration for linux-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS = -pipe
+TMAKE_CFLAGS_WARN_ON = -Wall -W -fno-exceptions
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib64
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib64
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib64
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG = -g
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_X11SM = -lICE -lSM
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/linux-g++/app.t b/tmake/lib/linux-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/linux-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/linux-g++/lib.t b/tmake/lib/linux-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/linux-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/linux-g++/subdirs.t b/tmake/lib/linux-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/linux-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/linux-g++/tmake.conf b/tmake/lib/linux-g++/tmake.conf
new file mode 100644
index 0000000..9f69008
--- /dev/null
+++ b/tmake/lib/linux-g++/tmake.conf
@@ -0,0 +1,59 @@
+#
+#
+#
+# tmake configuration for linux-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS = -pipe
+TMAKE_CFLAGS_WARN_ON = -Wall -W -fno-exceptions
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG = -g
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_X11SM = -lICE -lSM
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/m68k-atari-mint-g++/app.t b/tmake/lib/m68k-atari-mint-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/m68k-atari-mint-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/m68k-atari-mint-g++/lib.t b/tmake/lib/m68k-atari-mint-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/m68k-atari-mint-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/m68k-atari-mint-g++/subdirs.t b/tmake/lib/m68k-atari-mint-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/m68k-atari-mint-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/m68k-atari-mint-g++/tmake.conf b/tmake/lib/m68k-atari-mint-g++/tmake.conf
new file mode 100644
index 0000000..2de619f
--- /dev/null
+++ b/tmake/lib/m68k-atari-mint-g++/tmake.conf
@@ -0,0 +1,59 @@
+#
+#
+#
+# tmake configuration for linux-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W -fno-exceptions
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O0
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG = -g
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_X11SM = -lICE -lSM
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/macosx-c++/app.t b/tmake/lib/macosx-c++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/macosx-c++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/macosx-c++/lib.t b/tmake/lib/macosx-c++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/macosx-c++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/macosx-c++/subdirs.t b/tmake/lib/macosx-c++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/macosx-c++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/macosx-c++/tmake.conf b/tmake/lib/macosx-c++/tmake.conf
new file mode 100644
index 0000000..01f036d
--- /dev/null
+++ b/tmake/lib/macosx-c++/tmake.conf
@@ -0,0 +1,59 @@
+#
+#
+#
+# tmake configuration for macosx-c++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cc
+TMAKE_CFLAGS = -pipe
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g -fstack-protector
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = c++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS -D__FreeBSD__=6
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = c++
+TMAKE_LINK_SHLIB = c++
+TMAKE_LFLAGS = -Wl,-search_paths_first
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+
+TMAKE_LFLAGS_SONAME = -dynamiclib -install_name
+
+TMAKE_LIBS = -liconv -framework CoreServices
+TMAKE_LIBS_X11 =
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB = ranlib
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/macosx-uni-c++/app.t b/tmake/lib/macosx-uni-c++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/macosx-uni-c++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/macosx-uni-c++/lib.t b/tmake/lib/macosx-uni-c++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/macosx-uni-c++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/macosx-uni-c++/subdirs.t b/tmake/lib/macosx-uni-c++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/macosx-uni-c++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/macosx-uni-c++/tmake.conf b/tmake/lib/macosx-uni-c++/tmake.conf
new file mode 100644
index 0000000..2c34161
--- /dev/null
+++ b/tmake/lib/macosx-uni-c++/tmake.conf
@@ -0,0 +1,59 @@
+#
+#
+#
+# tmake configuration for macosx-c++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cc
+TMAKE_CFLAGS = -pipe -arch i386 -arch ppc
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = c++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS -D__FreeBSD__=6 -mmacosx-version-min=10.5
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = c++
+TMAKE_LINK_SHLIB = c++
+TMAKE_LFLAGS = -Wl,-search_paths_first -arch i386 -arch ppc
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+
+TMAKE_LFLAGS_SONAME = -dynamiclib -install_name
+
+TMAKE_LIBS = -liconv -framework CoreServices -mmacosx-version-min=10.5
+TMAKE_LIBS_X11 =
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB = ranlib
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/netbsd-g++/app.t b/tmake/lib/netbsd-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/netbsd-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/netbsd-g++/lib.t b/tmake/lib/netbsd-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/netbsd-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/netbsd-g++/subdirs.t b/tmake/lib/netbsd-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/netbsd-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/netbsd-g++/tmake.conf b/tmake/lib/netbsd-g++/tmake.conf
new file mode 100644
index 0000000..cad7876
--- /dev/null
+++ b/tmake/lib/netbsd-g++/tmake.conf
@@ -0,0 +1,61 @@
+#
+#
+#
+# tmake configuration for netbsd-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = ld
+TMAKE_LINK_SHLIB_CMD = $(SYSCONF_LINK_SHLIB) -Bshareable $(LFLAGS) -o $(DESTDIR)$(SYSCONF_LINK_TARGET_SHARED) \
+ `lorder /usr/lib/c++rt0.o $(OBJECTS) $(OBJMOC) | \
+ tsort` $(LIBS)
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -Bshareable
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/openbsd-g++/app.t b/tmake/lib/openbsd-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/openbsd-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/openbsd-g++/lib.t b/tmake/lib/openbsd-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/openbsd-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/openbsd-g++/subdirs.t b/tmake/lib/openbsd-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/openbsd-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/openbsd-g++/tmake.conf b/tmake/lib/openbsd-g++/tmake.conf
new file mode 100644
index 0000000..89cdc9b
--- /dev/null
+++ b/tmake/lib/openbsd-g++/tmake.conf
@@ -0,0 +1,61 @@
+#
+#
+#
+# tmake configuration for netbsd-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = ld
+TMAKE_LINK_SHLIB_CMD = $(SYSCONF_LINK_SHLIB) -Bshareable $(LFLAGS) -o $(DESTDIR)$(SYSCONF_LINK_TARGET_SHARED) \
+ `lorder /usr/lib/c++rt0.o $(OBJECTS) $(OBJMOC) | \
+ tsort` $(LIBS)
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -Bshareable
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar q
+TMAKE_RANLIB = ranlib
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/osf1-cxx/app.t b/tmake/lib/osf1-cxx/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/osf1-cxx/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/osf1-cxx/lib.t b/tmake/lib/osf1-cxx/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/osf1-cxx/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/osf1-cxx/subdirs.t b/tmake/lib/osf1-cxx/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/osf1-cxx/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/osf1-cxx/tmake.conf b/tmake/lib/osf1-cxx/tmake.conf
new file mode 100644
index 0000000..b3f9a5d
--- /dev/null
+++ b/tmake/lib/osf1-cxx/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for osf1-cxx (a.k.a. DEC Unix)
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cxx
+TMAKE_CFLAGS = -x cc -w -D_POSIX_SOURCE -D_OSF_SOURCE -D_AES_SOURCE
+TMAKE_CFLAGS_WARN_ON =
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB =
+TMAKE_CFLAGS_YACC = -Olimit 1000
+
+TMAKE_CXX = cxx
+TMAKE_CXXFLAGS = -x cxx -w -D_POSIX_SOURCE -D_OSF_SOURCE -D_AES_SOURCE
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = cxx
+TMAKE_LINK_SHLIB = cxx
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = <<END
+-soname
+END
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/osf1-g++/app.t b/tmake/lib/osf1-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/osf1-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/osf1-g++/lib.t b/tmake/lib/osf1-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/osf1-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/osf1-g++/subdirs.t b/tmake/lib/osf1-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/osf1-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/osf1-g++/tmake.conf b/tmake/lib/osf1-g++/tmake.conf
new file mode 100644
index 0000000..e23713e
--- /dev/null
+++ b/tmake/lib/osf1-g++/tmake.conf
@@ -0,0 +1,58 @@
+#
+#
+#
+# tmake configuration for osf1-g++ (a.k.a. DEC Unix)
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS = -D_POSIX_SOURCE -D_OSF_SOURCE -D_AES_SOURCE
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/qnx-g++/app.t b/tmake/lib/qnx-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/qnx-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/qnx-g++/lib.t b/tmake/lib/qnx-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/qnx-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/qnx-g++/subdirs.t b/tmake/lib/qnx-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/qnx-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/qnx-g++/tmake.conf b/tmake/lib/qnx-g++/tmake.conf
new file mode 100644
index 0000000..4846d68
--- /dev/null
+++ b/tmake/lib/qnx-g++/tmake.conf
@@ -0,0 +1,58 @@
+#
+#
+#
+# tmake configuration for qnx-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS = -pipe
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O -fno-inline -fno-pack-struct
+TMAKE_CFLAGS_DEBUG = -g -fno-inline -fno-pack-struct
+TMAKE_CFLAGS_SHLIB =
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses -fno-inline -fno-pack-struct
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB =
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS = -lunix
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/sco-g++/app.t b/tmake/lib/sco-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/sco-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/sco-g++/lib.t b/tmake/lib/sco-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/sco-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/sco-g++/subdirs.t b/tmake/lib/sco-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/sco-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/sco-g++/tmake.conf b/tmake/lib/sco-g++/tmake.conf
new file mode 100644
index 0000000..c571f98
--- /dev/null
+++ b/tmake/lib/sco-g++/tmake.conf
@@ -0,0 +1,58 @@
+#
+#
+#
+# tmake configuration for sco-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB = ranlib
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/solaris-cc-64/app.t b/tmake/lib/solaris-cc-64/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/solaris-cc-64/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/solaris-cc-64/lib.t b/tmake/lib/solaris-cc-64/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/solaris-cc-64/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/solaris-cc-64/subdirs.t b/tmake/lib/solaris-cc-64/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/solaris-cc-64/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/solaris-cc-64/tmake.conf b/tmake/lib/solaris-cc-64/tmake.conf
new file mode 100644
index 0000000..889fde7
--- /dev/null
+++ b/tmake/lib/solaris-cc-64/tmake.conf
@@ -0,0 +1,61 @@
+#
+#
+#
+# tmake configuration for solaris-cc
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cc
+TMAKE_CFLAGS = -xtarget=generic64
+TMAKE_CFLAGS_WARN_ON =
+TMAKE_CFLAGS_WARN_OFF = -w
+TMAKE_CFLAGS_RELEASE = -O
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -KPIC
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = CC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = -xO2
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = -PIC
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/openwin/include
+TMAKE_LIBDIR_X11 = /usr/openwin/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = CC
+# Jan Wortelboer <janw@wins.uva.nl> suggests avoiding $LD_LIBRARY_PATH:
+TMAKE_LINK_SHLIB = CC -R$(QTDIR)/lib:/usr/openwin/lib
+TMAKE_LFLAGS = -64 -xtarget=generic64
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -G -h $(TARGET1)
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm -lICE -lSM
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl -lGL
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = CC -xar -o
+TMAKE_RANLIB =
+
+TMAKE_CLEAN = -r Templates.DB
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/solaris-cc-gcc/app.t b/tmake/lib/solaris-cc-gcc/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/solaris-cc-gcc/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/solaris-cc-gcc/lib.t b/tmake/lib/solaris-cc-gcc/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/solaris-cc-gcc/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/solaris-cc-gcc/subdirs.t b/tmake/lib/solaris-cc-gcc/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/solaris-cc-gcc/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/solaris-cc-gcc/tmake.conf b/tmake/lib/solaris-cc-gcc/tmake.conf
new file mode 100644
index 0000000..de013a0
--- /dev/null
+++ b/tmake/lib/solaris-cc-gcc/tmake.conf
@@ -0,0 +1,62 @@
+#
+#
+#
+# tmake configuration for solaris-cc-gcc
+# (Using SunPro CC for C++ code and gcc for C code.)
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = CC
+TMAKE_CXXFLAGS =
+TMAKE_CXXFLAGS_WARN_ON =
+TMAKE_CXXFLAGS_WARN_OFF = -w
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = -PIC
+TMAKE_CXXFLAGS_YACC =
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/openwin/include
+TMAKE_LIBDIR_X11 = /usr/openwin/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = CC
+# Jan Wortelboer <janw@wins.uva.nl> suggests avoiding $LD_LIBRARY_PATH:
+TMAKE_LINK_SHLIB = CC -R$(QTDIR)/lib:/usr/openwin/lib
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -G -h $(TARGET1)
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS = -lC
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = CC -xar -o
+TMAKE_RANLIB =
+
+TMAKE_CLEAN = -r Templates.DB
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/solaris-cc/app.t b/tmake/lib/solaris-cc/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/solaris-cc/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/solaris-cc/lib.t b/tmake/lib/solaris-cc/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/solaris-cc/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/solaris-cc/subdirs.t b/tmake/lib/solaris-cc/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/solaris-cc/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/solaris-cc/tmake.conf b/tmake/lib/solaris-cc/tmake.conf
new file mode 100644
index 0000000..3dbe810
--- /dev/null
+++ b/tmake/lib/solaris-cc/tmake.conf
@@ -0,0 +1,61 @@
+#
+#
+#
+# tmake configuration for solaris-cc
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON =
+TMAKE_CFLAGS_WARN_OFF = -w
+TMAKE_CFLAGS_RELEASE = -O
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -KPIC
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = CC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = -O2
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = -PIC
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/openwin/include
+TMAKE_LIBDIR_X11 = /usr/openwin/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = CC
+# Jan Wortelboer <janw@wins.uva.nl> suggests avoiding $LD_LIBRARY_PATH:
+TMAKE_LINK_SHLIB = CC -R$(QTDIR)/lib:/usr/openwin/lib
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -G -h $(TARGET1)
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm -lICE -lSM
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl -lGL
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = CC -xar -o
+TMAKE_RANLIB =
+
+TMAKE_CLEAN = -r Templates.DB
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/solaris-g++/app.t b/tmake/lib/solaris-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/solaris-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/solaris-g++/lib.t b/tmake/lib/solaris-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/solaris-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/solaris-g++/subdirs.t b/tmake/lib/solaris-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/solaris-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/solaris-g++/tmake.conf b/tmake/lib/solaris-g++/tmake.conf
new file mode 100644
index 0000000..a6817bf
--- /dev/null
+++ b/tmake/lib/solaris-g++/tmake.conf
@@ -0,0 +1,59 @@
+#
+#
+#
+# tmake configuration for solaris-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/openwin/include
+TMAKE_LIBDIR_X11 = /usr/openwin/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHAPP = -shared
+TMAKE_LFLAGS_SHLIB = -shared -h $(TARGET1)
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS = -liconv
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/sunos-g++/app.t b/tmake/lib/sunos-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/sunos-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/sunos-g++/lib.t b/tmake/lib/sunos-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/sunos-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/sunos-g++/subdirs.t b/tmake/lib/sunos-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/sunos-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/sunos-g++/tmake.conf b/tmake/lib/sunos-g++/tmake.conf
new file mode 100644
index 0000000..52f9e2d
--- /dev/null
+++ b/tmake/lib/sunos-g++/tmake.conf
@@ -0,0 +1,58 @@
+#
+#
+#
+# tmake configuration for sunos-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/openwin/include
+TMAKE_LIBDIR_X11 = /usr/openwin/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -fPIC -shared
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB = ranlib
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/ultrix-g++/app.t b/tmake/lib/ultrix-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/ultrix-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/ultrix-g++/lib.t b/tmake/lib/ultrix-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/ultrix-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/ultrix-g++/subdirs.t b/tmake/lib/ultrix-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/ultrix-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/ultrix-g++/tmake.conf b/tmake/lib/ultrix-g++/tmake.conf
new file mode 100644
index 0000000..59813eb
--- /dev/null
+++ b/tmake/lib/ultrix-g++/tmake.conf
@@ -0,0 +1,58 @@
+#
+#
+#
+# tmake configuration for ultrix-g++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB =
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 = /usr/X11R6/include
+TMAKE_LIBDIR_X11 = /usr/X11R6/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL = /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
+
+TMAKE_LINK = g++
+#TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+#TMAKE_LFLAGS_SHLIB = -shared
+#TMAKE_LFLAGS_SONAME = -Wl,-soname,
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/unix/app.t b/tmake/lib/unix/app.t
new file mode 100644
index 0000000..f59c9f9
--- /dev/null
+++ b/tmake/lib/unix/app.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Unix applications.
+#!
+#$ Project('TMAKE_APP_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/unix/generic.t b/tmake/lib/unix/generic.t
new file mode 100644
index 0000000..04f7b97
--- /dev/null
+++ b/tmake/lib/unix/generic.t
@@ -0,0 +1,283 @@
+#!
+#! This is a tmake template for building UNIX applications or libraries.
+#!
+#${
+ if ( Project("TMAKE_LIB_FLAG") && !Config("staticlib") ) {
+ Project('CONFIG *= dll');
+ } elsif ( Project("TMAKE_APP_FLAG") || Config("dll") ) {
+ Project('CONFIG -= staticlib');
+ }
+ if ( Config("warn_off") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
+ } elsif ( Config("warn_on") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
+ }
+ if ( Config("debug") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
+ } elsif ( Config("release") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
+ }
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG *= x11lib');
+ if ( Config("opengl") ) {
+ Project('CONFIG *= x11inc');
+ }
+ }
+ if ( Config("x11") ) {
+ Project('CONFIG *= x11lib');
+ Project('CONFIG *= x11inc');
+ }
+ if ( Config("qt") ) {
+ Project('CONFIG *= moc');
+ AddIncludePath(Project("TMAKE_INCDIR_QT"));
+ if ( Config("release") ) {
+ Project('DEFINES += NO_DEBUG');
+ }
+ if ( Config("opengl") ) {
+ Project("TMAKE_LIBDIR_QT") &&
+ Project('TMAKE_LIBS *= -L$$TMAKE_LIBDIR_QT');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
+ }
+ if ( !((Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG")) ) {
+ Project("TMAKE_LIBDIR_QT") &&
+ Project('TMAKE_LIBS *= -L$$TMAKE_LIBDIR_QT');
+ if ( Config("thread") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_MT');
+ } else {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
+ }
+ }
+ }
+ if ( Config("opengl") ) {
+ AddIncludePath(Project("TMAKE_INCDIR_OPENGL"));
+ Project("TMAKE_LIBDIR_OPENGL") &&
+ Project('TMAKE_LIBS *= -L$$TMAKE_LIBDIR_OPENGL');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
+ }
+ if ( Config("x11inc") ) {
+ AddIncludePath(Project("TMAKE_INCDIR_X11"));
+ }
+ if ( Config("x11lib") ) {
+ Project("TMAKE_LIBDIR_X11") &&
+ Project('TMAKE_LIBS *= -L$$TMAKE_LIBDIR_X11');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_X11');
+ }
+ if ( Config("moc") ) {
+ $moc_aware = 1;
+ }
+ Project('TMAKE_LIBS = $$LIBS $$TMAKE_LIBS');
+ if ( !Project("TMAKE_RUN_CC") ) {
+ Project('TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src');
+ }
+ if ( !Project("TMAKE_RUN_CC_IMP") ) {
+ Project('TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<');
+ }
+ if ( !Project("TMAKE_RUN_CXX") ) {
+ Project('TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src');
+ }
+ if ( !Project("TMAKE_RUN_CXX_IMP") ) {
+ Project('TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<');
+ }
+ Project('TMAKE_FILETAGS = HEADERS SOURCES TARGET DESTDIR $$FILETAGS');
+ StdInit();
+ $project{"VERSION"} || ($project{"VERSION"} = "1.0");
+ $project{"VER_MAJ"} = $project{"VERSION"};
+ $project{"VER_MAJ"} =~ s/\.\d+$//;
+ $project{"VER_MIN"} = $project{"VERSION"};
+ $project{"VER_MIN"} =~ s/^\d+\.//;
+ Project('DESTDIR_TARGET = $(TARGET)');
+ if ( Project("TMAKE_APP_FLAG") ) {
+ if ( Config("dll") ) {
+ Project('TARGET = $$TARGET.so');
+ Project("TMAKE_LFLAGS_SHAPP") ||
+ ($project{"TMAKE_LFLAGS_SHAPP"} = $project{"TMAKE_LFLAGS_SHLIB"});
+ Project("TMAKE_LFLAGS_SONAME") &&
+ ($project{"TMAKE_LFLAGS_SONAME"} .= $project{"TARGET"});
+ }
+ $project{"TARGET"} = $project{"DESTDIR"} . $project{"TARGET"};
+ } elsif ( Config("staticlib") ) {
+ $project{"TARGET"} = $project{"DESTDIR"} . "lib" .
+ $project{"TARGET"} . ".a";
+ Project("TMAKE_AR_CMD") ||
+ Project('TMAKE_AR_CMD = $(AR) $(TARGET) $(OBJECTS) $(OBJMOC)');
+ } else {
+ $project{"TARGETA"} = $project{"DESTDIR"} . "lib" .
+ $project{"TARGET"} . ".a";
+ if ( Project("TMAKE_AR_CMD") ) {
+ $project{"TMAKE_AR_CMD"} =~ s/\(TARGET\)/\(TARGETA\)/g;
+ } else {
+ Project('TMAKE_AR_CMD = $(AR) $(TARGETA) $(OBJECTS) $(OBJMOC)');
+ }
+ if ( $project{"TMAKE_HPUX_SHLIB"} ) {
+ $project{"TARGET_x.y"} = "lib" . $project{"TARGET"} . ".sl";
+ } else {
+ $project{"TARGET_"} = "lib" . $project{"TARGET"} . ".so";
+ $project{"TARGET_x"} = $project{"TARGET_"} . "." .
+ $project{"VER_MAJ"};
+ $project{"TARGET_x.y"} = $project{"TARGET_"} . "." .
+ $project{"VERSION"};
+ $project{"TMAKE_LN_SHLIB"} = "-ln -s";
+ }
+ $project{"TARGET"} = $project{"TARGET_x.y"};
+ if ( $project{"DESTDIR"} ) {
+ $project{"DESTDIR_TARGET"} = $project{"DESTDIR"} .
+ $project{"TARGET"};
+ }
+ Project("TMAKE_LFLAGS_SONAME") &&
+ ($project{"TMAKE_LFLAGS_SONAME"} .= $project{"TARGET_x"});
+ $project{"TMAKE_LINK_SHLIB_CMD"} ||
+ ($project{"TMAKE_LINK_SHLIB_CMD"} =
+ '$(LINK) $(LFLAGS) -o $(TARGETD) $(OBJECTS) $(OBJMOC) $(LIBS)');
+ }
+ if ( Config("dll") ) {
+ Project('TMAKE_CFLAGS *= $$TMAKE_CFLAGS_SHLIB' );
+ Project('TMAKE_CXXFLAGS *= $$TMAKE_CXXFLAGS_SHLIB' );
+ if ( Project("TMAKE_APP_FLAG") ) {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_SHAPP');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_SHLIB $$TMAKE_LFLAGS_SONAME');
+ }
+ }
+#$}
+#!
+# Makefile for building #$ Expand("TARGET")
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = #$ Expand("TMAKE_CC");
+CXX = #$ Expand("TMAKE_CXX");
+CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+INCPATH = #$ ExpandPath("INCPATH","-I"," -I","");
+#$ Config("staticlib") && DisableOutput();
+LINK = #$ Expand("TMAKE_LINK");
+LFLAGS = #$ Expand("TMAKE_LFLAGS");
+LIBS = #$ Expand("TMAKE_LIBS");
+#$ Config("staticlib") && EnableOutput();
+#$ Project("TMAKE_LIB_FLAG") || DisableOutput();
+AR = #$ Expand("TMAKE_AR");
+RANLIB = #$ Expand("TMAKE_RANLIB");
+#$ Project("TMAKE_LIB_FLAG") || EnableOutput();
+MOC = #$ Expand("TMAKE_MOC");
+
+TAR = #$ Expand("TMAKE_TAR");
+GZIP = #$ Expand("TMAKE_GZIP");
+
+####### Files
+
+HEADERS = #$ ExpandList("HEADERS");
+SOURCES = #$ ExpandList("SOURCES");
+OBJECTS = #$ ExpandList("OBJECTS");
+SRCMOC = #$ ExpandList("SRCMOC");
+OBJMOC = #$ ExpandList("OBJMOC");
+DIST = #$ ExpandList("DISTFILES");
+TARGET = #$ Expand("TARGET");
+#$ (Project("TMAKE_APP_FLAG") || Config("staticlib")) && DisableOutput();
+TARGETA = #$ Expand("TARGETA");
+TARGETD = #$ Expand("TARGET_x.y");
+TARGET0 = #$ Expand("TARGET_");
+TARGET1 = #$ Expand("TARGET_x");
+#$ (Project("TMAKE_APP_FLAG") || Config("staticlib")) && EnableOutput();
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .C .c
+
+.cpp.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cxx.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cc.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.C.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.c.o:
+ #$ Expand("TMAKE_RUN_CC_IMP");
+
+####### Build rules
+
+#$ Project("TMAKE_APP_FLAG") || DisableOutput();
+all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
+
+$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
+#$ Project("TMAKE_APP_FLAG") || EnableOutput();
+#$ (Config("staticlib") || Project("TMAKE_APP_FLAG")) && DisableOutput();
+all: #$ ExpandGlue("ALL_DEPS",""," ",""); Expand("DESTDIR_TARGET");
+
+#$ Substitute('$$DESTDIR_TARGET: $(OBJECTS) $(OBJMOC) $$TARGETDEPS');
+ -rm -f $(TARGET) $(TARGET0) $(TARGET1)
+ #$ Expand("TMAKE_LINK_SHLIB_CMD");
+ #$ ExpandGlue("TMAKE_LN_SHLIB",""," "," \$(TARGET) \$(TARGET0)");
+ #$ ExpandGlue("TMAKE_LN_SHLIB",""," "," \$(TARGET) \$(TARGET1)");
+ #${
+ $d = Project("DESTDIR");
+ if ( $d ) {
+ $d =~ s-([^/])$-$1/-;
+ if ( Project("TMAKE_HPUX_SHLIB") ) {
+ $text = "-rm -f $d\$(TARGET)\n\t" .
+ "-mv \$(TARGET) $d";
+ } else {
+ $text = "-rm -f $d\$(TARGET)\n\t" .
+ "-rm -f $d\$(TARGET0)\n\t" .
+ "-rm -f $d\$(TARGET1)\n\t" .
+ "-mv \$(TARGET) \$(TARGET0) \$(TARGET1) $d";
+ }
+ }
+ #$}
+
+staticlib: $(TARGETA)
+
+$(TARGETA): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+ -rm -f $(TARGETA)
+ #$ Expand("TMAKE_AR_CMD");
+ #$ ExpandGlue("TMAKE_RANLIB","",""," \$(TARGETA)");
+#$ (Config("staticlib") || Project("TMAKE_APP_FLAG")) && EnableOutput();
+#$ Config("staticlib") || DisableOutput();
+all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
+
+staticlib: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+ -rm -f $(TARGET)
+ #$ Expand("TMAKE_AR_CMD");
+ #$ ExpandGlue("TMAKE_RANLIB","",""," \$(TARGET)");
+#$ Config("staticlib") || EnableOutput();
+
+moc: $(SRCMOC)
+
+#$ TmakeSelf();
+
+dist:
+ #$ Substitute('$(TAR) $$PROJECT.tar $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
+ #$ Substitute('$(GZIP) $$PROJECT.tar');
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
+#$ (Config("staticlib") || Project("TMAKE_APP_FLAG")) && DisableOutput();
+ -rm -f $(TARGET0) $(TARGET1) $(TARGETA)
+#$ (Config("staticlib") || Project("TMAKE_APP_FLAG")) && EnableOutput();
+ #$ ExpandGlue("TMAKE_CLEAN","-rm -f "," ","");
+ -rm -f *~ core
+ #$ ExpandGlue("CLEAN_FILES","-rm -f "," ","");
+
+####### Compile
+
+#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
+#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
+#$ BuildMocSrc(Project("HEADERS"));
+#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/unix/lib.t b/tmake/lib/unix/lib.t
new file mode 100644
index 0000000..dd24c63
--- /dev/null
+++ b/tmake/lib/unix/lib.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Unix libraries.
+#!
+#$ Project('TMAKE_LIB_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/unix/subdirs.t b/tmake/lib/unix/subdirs.t
new file mode 100644
index 0000000..e2b58a7
--- /dev/null
+++ b/tmake/lib/unix/subdirs.t
@@ -0,0 +1,38 @@
+#############################################################################
+#!
+#! This is a tmake template for creating a makefile that invokes make in
+#! sub directories - for Unix.
+#!
+#${
+ StdInit();
+ Project('MAKEFILE') || Project('MAKEFILE = Makefile');
+ Project('TMAKE') || Project('TMAKE = tmake');
+#$}
+#!
+# Makefile for building targets in sub directories.
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+MAKEFILE= #$ Expand("MAKEFILE");
+TMAKE = #$ Expand("TMAKE");
+
+SUBDIRS = #$ ExpandList("SUBDIRS");
+
+all: $(SUBDIRS)
+
+$(SUBDIRS): FORCE
+ cd $@; $(MAKE)
+
+#$ TmakeSelf();
+
+tmake_all:
+#${
+ $text = "\t" . 'for i in $(SUBDIRS); do ( cd $$i ; $(TMAKE) $$i.pro -o $(MAKEFILE); grep "TEMPLATE.*subdirs" $$i.pro 2>/dev/null >/dev/null && $(MAKE) -f $(MAKEFILE) tmake ) ; done';
+#$}
+
+clean:
+ for i in $(SUBDIRS); do ( cd $$i ; $(MAKE) clean ) ; done
+
+FORCE:
diff --git a/tmake/lib/unixware-g++/app.t b/tmake/lib/unixware-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/unixware-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/unixware-g++/lib.t b/tmake/lib/unixware-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/unixware-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/unixware-g++/subdirs.t b/tmake/lib/unixware-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/unixware-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/unixware-g++/tmake.conf b/tmake/lib/unixware-g++/tmake.conf
new file mode 100644
index 0000000..d4e063f
--- /dev/null
+++ b/tmake/lib/unixware-g++/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for sco-g++
+#
+# incl. UnixWare 7
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS = -D_UNIXWARE
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 = /usr/X/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS = -lc
+TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lnsl -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu -lXt
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/unixware7-cc/app.t b/tmake/lib/unixware7-cc/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/unixware7-cc/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/unixware7-cc/lib.t b/tmake/lib/unixware7-cc/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/unixware7-cc/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/unixware7-cc/subdirs.t b/tmake/lib/unixware7-cc/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/unixware7-cc/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/unixware7-cc/tmake.conf b/tmake/lib/unixware7-cc/tmake.conf
new file mode 100644
index 0000000..6e239dc
--- /dev/null
+++ b/tmake/lib/unixware7-cc/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for sco-g++
+#
+# (UnixWare file, with different -D)
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O -T used
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -K PIC
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = CC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 = /usr/X/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = CC
+TMAKE_LINK_SHLIB = CC
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -G
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS =
+TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lnsl -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu -lXt
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/unixware7-g++/app.t b/tmake/lib/unixware7-g++/app.t
new file mode 100644
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/unixware7-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/unixware7-g++/lib.t b/tmake/lib/unixware7-g++/lib.t
new file mode 100644
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/unixware7-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/unixware7-g++/subdirs.t b/tmake/lib/unixware7-g++/subdirs.t
new file mode 100644
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/unixware7-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/unixware7-g++/tmake.conf b/tmake/lib/unixware7-g++/tmake.conf
new file mode 100644
index 0000000..44f30a5
--- /dev/null
+++ b/tmake/lib/unixware7-g++/tmake.conf
@@ -0,0 +1,60 @@
+#
+#
+#
+# tmake configuration for sco-g++
+#
+# (UnixWare file, with different -D)
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS = -D_UNIXWARE7
+TMAKE_CFLAGS_WARN_ON = -Wall -W
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_SHLIB = -fPIC
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_LIBDIR =
+TMAKE_INCDIR_X11 =
+TMAKE_LIBDIR_X11 = /usr/X/lib
+TMAKE_INCDIR_QT = $(QTDIR)/include
+TMAKE_LIBDIR_QT = $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL =
+TMAKE_LIBDIR_OPENGL =
+
+TMAKE_LINK = g++
+TMAKE_LINK_SHLIB = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_SHLIB = -shared
+TMAKE_LFLAGS_SONAME =
+
+TMAKE_LIBS = -lc
+TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lnsl -lm
+TMAKE_LIBS_QT = -lqt
+TMAKE_LIBS_QT_MT = -lqt-mt
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu -lXt
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cq
+TMAKE_RANLIB =
+
+TMAKE_TAR = tar -cf
+TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/win32-borland/app.t b/tmake/lib/win32-borland/app.t
new file mode 100644
index 0000000..fc4dc2c
--- /dev/null
+++ b/tmake/lib/win32-borland/app.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 applications.
+#!
+#$ Project('TMAKE_APP_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-borland/generic.t b/tmake/lib/win32-borland/generic.t
new file mode 100644
index 0000000..0cf8711
--- /dev/null
+++ b/tmake/lib/win32-borland/generic.t
@@ -0,0 +1,237 @@
+#!
+#! This is a tmake template for building Win32 applications or libraries.
+#!
+#${
+ if ( Config("qt") ) {
+ if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
+ ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
+ ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
+ Project('TMAKE_QT_DLL = 1');
+ if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
+ Project('CONFIG += dll');
+ }
+ }
+ }
+ if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
+ Project('CONFIG -= staticlib');
+ Project('TMAKE_APP_OR_DLL = 1');
+ } else {
+ Project('CONFIG += staticlib');
+ }
+ if ( Config("warn_off") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
+ } elsif ( Config("warn_on") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
+ }
+ if ( Config("debug") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
+ } elsif ( Config("release") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
+ }
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG += windows' );
+ }
+ if ( Config("qt") ) {
+ Project('CONFIG *= moc');
+ AddIncludePath(Project("TMAKE_INCDIR_QT"));
+ if ( Config("release") ) {
+ Project('DEFINES += NO_DEBUG');
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
+ }
+ if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
+ if ( Project("TMAKE_QT_DLL") ) {
+ Project('DEFINES -= QT_DLL');
+ Project('DEFINES *= QT_MAKEDLL');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_QT_DLL');
+ }
+ } else {
+ if ( Project("TMAKE_QT_DLL") ) {
+ Project('DEFINES *= QT_DLL');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
+ if ( Project("TMAKE_QT_DLL") ) {
+ my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
+ Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
+ if ( !Config("dll") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
+ }
+ }
+ }
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
+ }
+ if ( Config("dll") ) {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
+ if ( Project("TMAKE_LIB_FLAG") ) {
+ my $ver = Project("VERSION");
+ $ver =~ s/\.//g;
+ $project{"TARGET_EXT"} = "${ver}.dll";
+ } else {
+ $project{"TARGET_EXT"} = ".dll";
+ }
+ } else {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
+ if ( Project("TMAKE_APP_FLAG") ) {
+ $project{"TARGET_EXT"} = ".exe";
+ } else {
+ $project{"TARGET_EXT"} = ".lib";
+ }
+ }
+ if ( Config("windows") ) {
+ if ( Config("console") ) {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ }
+ if ( Config("moc") ) {
+ $moc_aware = 1;
+ }
+ Project('TMAKE_LIBS += $$LIBS');
+ Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
+ foreach ( split(/\s/,Project("TMAKE_FILETAGS")) ) {
+ $project{$_} =~ s-[/\\]+-\\-g;
+ }
+ if ( Project("DEF_FILE") ) {
+ Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
+ }
+ if ( Project("RC_FILE") ) {
+ if ( Project("RES_FILE") ) {
+ tmake_error("Both .rc and .res file specified.\n" .
+ "Please specify one of them, not both.");
+ }
+ $project{"RES_FILE"} = $project{"RC_FILE"};
+ $project{"RES_FILE"} =~ s/\.rc$/.res/i;
+ Project('TARGETDEPS += $$RES_FILE');
+ }
+ if ( Project("RES_FILE") ) {
+ Project('TMAKE_LIBS *= $$RES_FILE');
+ }
+ StdInit();
+ if ( Project("VERSION") ) {
+ $project{"VER_MAJ"} = $project{"VERSION"};
+ $project{"VER_MAJ"} =~ s/\.\d+$//;
+ $project{"VER_MIN"} = $project{"VERSION"};
+ $project{"VER_MIN"} =~ s/^\d+\.//;
+ }
+ Project('TMAKE_CLEAN += $$TARGET.tds');
+#$}
+#!
+# Makefile for building #$ Expand("TARGET")
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+####### Compiler, tools and options
+
+CC = #$ Expand("TMAKE_CC");
+CXX = #$ Expand("TMAKE_CXX");
+CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
+#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LINK = #$ Expand("TMAKE_LINK");
+LFLAGS = #$ Expand("TMAKE_LFLAGS");
+LIBS = #$ Expand("TMAKE_LIBS");
+#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LIB = #$ Expand("TMAKE_LIB");
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+MOC = #$ Expand("TMAKE_MOC");
+
+ZIP = #$ Expand("TMAKE_ZIP");
+
+####### Files
+
+HEADERS = #$ ExpandList("HEADERS");
+SOURCES = #$ ExpandList("SOURCES");
+OBJECTS = #$ ExpandList("OBJECTS");
+SRCMOC = #$ ExpandList("SRCMOC");
+OBJMOC = #$ ExpandList("OBJMOC");
+DIST = #$ ExpandList("DISTFILES");
+TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .c
+
+.cpp.obj:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cxx.obj:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cc.obj:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.c.obj:
+ #$ Expand("TMAKE_RUN_CC_IMP");
+
+####### Build rules
+
+all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
+
+$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
+ $(LINK) @&&|
+ $(LFLAGS) $(OBJECTS) $(OBJMOC), $(TARGET),,$(LIBS)
+#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+ -del $(TARGET)
+ $(LIB) $(TARGET) @&&|
+#${
+# $text = "+" . join(" \\\n+",split(/\s+/,$project{"OBJECTS"})) . " \\\n+"
+# . join(" \\\n+",split(/\s+/,$project{"OBJMOC"}));
+#$}
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+|
+#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
+ -copy $(TARGET) #$ Expand("DLLDESTDIR");
+#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
+#$ Project("RC_FILE") || DisableOutput();
+
+#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
+#$ Project("RC_FILE") || EnableOutput();
+
+moc: $(SRCMOC)
+
+#$ TmakeSelf();
+
+dist:
+ #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
+
+clean:
+ #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
+ #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
+ #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
+ -del $(TARGET)
+ #$ ExpandGlue("TMAKE_CLEAN","-del ","\n\t-del ","");
+ #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
+
+####### Compile
+
+#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
+#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
+#$ BuildMocSrc(Project("HEADERS"));
+#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-borland/lib.t b/tmake/lib/win32-borland/lib.t
new file mode 100644
index 0000000..d8ac6c7
--- /dev/null
+++ b/tmake/lib/win32-borland/lib.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 libraries.
+#!
+#$ Project('TMAKE_LIB_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-borland/subdirs.t b/tmake/lib/win32-borland/subdirs.t
new file mode 100644
index 0000000..f08e41f
--- /dev/null
+++ b/tmake/lib/win32-borland/subdirs.t
@@ -0,0 +1,3 @@
+#! Use the common Win32 template
+#$ Project("TMAKE_NOFORCE = 1");
+#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-borland/tmake.conf b/tmake/lib/win32-borland/tmake.conf
new file mode 100644
index 0000000..bce6f1a
--- /dev/null
+++ b/tmake/lib/win32-borland/tmake.conf
@@ -0,0 +1,56 @@
+#
+#
+#
+# tmake configuration for Win32/Borland C++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = bcc32
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON = -w
+TMAKE_CFLAGS_WARN_OFF = -w-
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -v
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = $$TMAKE_CC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_INCDIR_QT = $(QTDIR)\include
+
+TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o$obj $src
+TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o$@ $<
+TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o$obj $src
+TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o$@ $<
+
+TMAKE_LINK = ilink32
+TMAKE_LFLAGS = -L$(BCB)\lib -c -x -Gn
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG = -v
+TMAKE_LFLAGS_CONSOLE = -ap -Tpe c0x32.obj
+TMAKE_LFLAGS_WINDOWS = -aa -Tpe c0w32.obj
+TMAKE_LFLAGS_CONSOLE_DLL= -Gi -ap -Tpd c0d32.obj
+TMAKE_LFLAGS_WINDOWS_DLL= -Gi -aa -Tpd c0d32.obj
+
+TMAKE_LIBS = import32.lib cw32.lib
+TMAKE_LIBS_CONSOLE =
+TMAKE_LIBS_WINDOWS =
+TMAKE_LIBS_QT = $(QTDIR)\lib\qt.lib
+TMAKE_LIBS_QT_DLL = $(QTDIR)\lib\qtmain.lib
+TMAKE_LIBS_QT_OPENGL = $(QTDIR)\lib\qgl.lib
+TMAKE_LIBS_OPENGL =
+
+TMAKE_MOC = moc
+
+TMAKE_LIB = tlib /C /P256
+TMAKE_RC = brc32
+
+TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-g++/app.t b/tmake/lib/win32-g++/app.t
new file mode 100644
index 0000000..fc4dc2c
--- /dev/null
+++ b/tmake/lib/win32-g++/app.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 applications.
+#!
+#$ Project('TMAKE_APP_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-g++/generic.t b/tmake/lib/win32-g++/generic.t
new file mode 100644
index 0000000..edc7a47
--- /dev/null
+++ b/tmake/lib/win32-g++/generic.t
@@ -0,0 +1,241 @@
+#!
+#! This is a tmake template for building Win32 applications or libraries.
+#!
+#${
+ if ( Config("qt") ) {
+ if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
+ ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
+ ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
+ Project('TMAKE_QT_DLL = 1');
+ if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
+ Project('CONFIG += dll');
+ }
+ }
+ }
+ if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
+ Project('CONFIG -= staticlib');
+ Project('TMAKE_APP_OR_DLL = 1');
+ } else {
+ Project('CONFIG += staticlib');
+ }
+ if ( Config("warn_off") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
+ } elsif ( Config("warn_on") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
+ }
+ if ( Config("debug") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
+ } elsif ( Config("release") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
+ }
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG += windows' );
+ }
+ if ( Config("qt") ) {
+ Project('CONFIG *= moc');
+ AddIncludePath(Project("TMAKE_INCDIR_QT"));
+ if ( Config("release") ) {
+ Project('DEFINES += NO_DEBUG');
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
+ }
+ if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
+ if ( Project("TMAKE_QT_DLL") ) {
+ Project('DEFINES -= QT_DLL');
+ Project('DEFINES *= QT_MAKEDLL');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_QT_DLL');
+ }
+ } else {
+ if ( Project("TMAKE_QT_DLL") ) {
+ Project('DEFINES *= QT_DLL');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
+ if ( Project("TMAKE_QT_DLL") ) {
+ my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
+ Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
+ if ( !Config("dll") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
+ }
+ }
+ }
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
+ }
+ if ( Config("dll") ) {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
+ if ( Project("TMAKE_LIB_FLAG") ) {
+ my $ver = Project("VERSION");
+ $ver =~ s/\.//g;
+ $project{"TARGET_EXT"} = "${ver}.dll";
+ } else {
+ $project{"TARGET_EXT"} = ".dll";
+ }
+ } else {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
+ if ( Project("TMAKE_APP_FLAG") ) {
+ $project{"TARGET_EXT"} = ".exe";
+ } else {
+ $project{"TARGET_EXT"} = ".a";
+ }
+ }
+ if ( Config("windows") ) {
+ if ( Config("console") ) {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ }
+ if ( Config("moc") ) {
+ $moc_aware = 1;
+ }
+ Project('TMAKE_LIBS += $$LIBS');
+ Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
+ foreach ( split(/\s/,Project("TMAKE_FILETAGS")) ) {
+ $project{$_} =~ s-[/\\]+-/-g;
+ }
+ if ( Project("DEF_FILE") ) {
+ Project('TMAKE_LFLAGS *= $$DEF_FILE');
+ }
+ if ( Project("RC_FILE") ) {
+ if ( Project("RES_FILE") ) {
+ tmake_error("Both .rc and .res file specified.\n" .
+ "Please specify one of them, not both.");
+ }
+ $project{"RES_FILE"} = $project{"RC_FILE"};
+ $project{"RES_FILE"} =~ s/\.rc$/.res/i;
+ Project('TARGETDEPS += $$RES_FILE');
+ }
+ if ( Project("RES_FILE") ) {
+ Project('TMAKE_LIBS *= $$RES_FILE');
+ }
+ $obj_ext = "o";
+ $dir_sep = "/";
+ $gnuwin32 = 1;
+ if ( Config("qt") ) {
+ $qtdir = $ENV{"QTDIR"};
+ $project{"INCPATH"} =~ s/\$\(QTDIR\)/$qtdir/;
+ $project{"INCPATH"} =~ s/\\/\//g;
+ $project{"TMAKE_LIBS"} =~ s/\$\(QTDIR\)/$qtdir/;
+ $project{"TMAKE_LIBS"} =~ s/\\/\//g;
+ }
+ StdInit();
+ if ( Project("VERSION") ) {
+ $project{"VER_MAJ"} = $project{"VERSION"};
+ $project{"VER_MAJ"} =~ s/\.\d+$//;
+ $project{"VER_MIN"} = $project{"VERSION"};
+ $project{"VER_MIN"} =~ s/^\d+\.//;
+ }
+ if ( Config("staticlib") ) {
+ $project{"TARGET"} = $project{"DESTDIR"} . "lib" . $project{"TARGET"}
+ } else {
+ $project{"TARGET"} = $project{"DESTDIR"} . $project{"TARGET"}
+ }
+#$}
+#!
+# Makefile for building #$ Expand("TARGET")
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = #$ Expand("TMAKE_CC");
+CXX = #$ Expand("TMAKE_CXX");
+CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
+#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LINK = #$ Expand("TMAKE_LINK");
+LFLAGS = #$ Expand("TMAKE_LFLAGS");
+LIBS = #$ Expand("TMAKE_LIBS");
+#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+AR = #$ Expand("TMAKE_AR");
+RANLIB = #$ Expand("TMAKE_RANLIB");
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+MOC = #$ Expand("TMAKE_MOC");
+
+ZIP = #$ Expand("TMAKE_ZIP");
+
+####### Files
+
+HEADERS = #$ ExpandList("HEADERS");
+SOURCES = #$ ExpandList("SOURCES");
+OBJECTS = #$ ExpandList("OBJECTS");
+SRCMOC = #$ ExpandList("SRCMOC");
+OBJMOC = #$ ExpandList("OBJMOC");
+DIST = #$ ExpandList("DISTFILES");
+TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .c
+
+.cpp.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cxx.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cc.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.c.o:
+ #$ Expand("TMAKE_RUN_CC_IMP");
+
+####### Build rules
+
+all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
+
+$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
+#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+ -rm -f $(TARGET)
+ $(AR) $(TARGET) $(OBJECTS) $(OBJMOC)
+ #$ ExpandGlue("TMAKE_RANLIB","",""," \$(TARGET)");
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
+ -cp $(TARGET) #$ Expand("DLLDESTDIR");
+#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
+#$ Project('RC_FILE') || DisableOutput();
+
+#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
+#$ Project('RC_FILE') || EnableOutput();
+
+moc: $(SRCMOC)
+
+#$ TmakeSelf();
+
+dist:
+ #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
+ #$ ExpandGlue("TMAKE_CLEAN","-rm -f "," ","");
+ -rm -f *~ core
+ #$ ExpandGlue("CLEAN_FILES","-rm -f "," ","");
+
+####### Compile
+
+#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
+#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
+#$ BuildMocSrc(Project("HEADERS"));
+#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-g++/lib.t b/tmake/lib/win32-g++/lib.t
new file mode 100644
index 0000000..d8ac6c7
--- /dev/null
+++ b/tmake/lib/win32-g++/lib.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 libraries.
+#!
+#$ Project('TMAKE_LIB_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-g++/subdirs.t b/tmake/lib/win32-g++/subdirs.t
new file mode 100644
index 0000000..8b881ab
--- /dev/null
+++ b/tmake/lib/win32-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Win32 template
+#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-g++/tmake.conf b/tmake/lib/win32-g++/tmake.conf
new file mode 100644
index 0000000..d313a44
--- /dev/null
+++ b/tmake/lib/win32-g++/tmake.conf
@@ -0,0 +1,56 @@
+#
+#
+#
+# tmake configuration for Win32/g++ (Cygnus gnu-win32)
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON =
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+
+TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
+TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
+TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+TMAKE_LINK = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
+TMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
+TMAKE_LFLAGS_CONSOLE_DLL= -Wl,-subsystem,console
+TMAKE_LFLAGS_WINDOWS_DLL= -Wl,-subsystem,windows
+
+TMAKE_LIBS =
+TMAKE_LIBS_CONSOLE =
+TMAKE_LIBS_WINDOWS = -luser32 -lgdi32 -lcomdlg32 -limm32 -lole32 -luuid -lwsock32
+TMAKE_LIBS_QT = -L$(QTDIR)/lib -lqt
+TMAKE_LIBS_QT_DLL = -lqtmain
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lopengl32
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-mingw/app.t b/tmake/lib/win32-mingw/app.t
new file mode 100644
index 0000000..df94e9c
--- /dev/null
+++ b/tmake/lib/win32-mingw/app.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 applications.
+#!
+#$ Project('TMAKE_APP_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-mingw/generic.t b/tmake/lib/win32-mingw/generic.t
new file mode 100644
index 0000000..0f883a2
--- /dev/null
+++ b/tmake/lib/win32-mingw/generic.t
@@ -0,0 +1,241 @@
+#!
+#! This is a tmake template for building Win32 applications or libraries.
+#!
+#${
+ if ( Config("qt") ) {
+ if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
+ ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
+ ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
+ Project('TMAKE_QT_DLL = 1');
+ if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
+ Project('CONFIG += dll');
+ }
+ }
+ }
+ if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
+ Project('CONFIG -= staticlib');
+ Project('TMAKE_APP_OR_DLL = 1');
+ } else {
+ Project('CONFIG += staticlib');
+ }
+ if ( Config("warn_off") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
+ } elsif ( Config("warn_on") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
+ }
+ if ( Config("debug") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
+ } elsif ( Config("release") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
+ }
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG += windows' );
+ }
+ if ( Config("qt") ) {
+ Project('CONFIG *= moc');
+ AddIncludePath(Project("TMAKE_INCDIR_QT"));
+ if ( Config("release") ) {
+ Project('DEFINES += NO_DEBUG');
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
+ }
+ if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
+ if ( Project("TMAKE_QT_DLL") ) {
+ Project('DEFINES -= QT_DLL');
+ Project('DEFINES *= QT_MAKEDLL');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_QT_DLL');
+ }
+ } else {
+ if ( Project("TMAKE_QT_DLL") ) {
+ Project('DEFINES *= QT_DLL');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
+ if ( Project("TMAKE_QT_DLL") ) {
+ my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
+ Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
+ if ( !Config("dll") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
+ }
+ }
+ }
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
+ }
+ if ( Config("dll") ) {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
+ if ( Project("TMAKE_LIB_FLAG") ) {
+ my $ver = Project("VERSION");
+ $ver =~ s/\.//g;
+ $project{"TARGET_EXT"} = "${ver}.dll";
+ } else {
+ $project{"TARGET_EXT"} = ".dll";
+ }
+ } else {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
+ if ( Project("TMAKE_APP_FLAG") ) {
+ $project{"TARGET_EXT"} = ".exe";
+ } else {
+ $project{"TARGET_EXT"} = ".a";
+ }
+ }
+ if ( Config("windows") ) {
+ if ( Config("console") ) {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ }
+ if ( Config("moc") ) {
+ $moc_aware = 1;
+ }
+ Project('TMAKE_LIBS += $$LIBS');
+ Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
+ foreach ( split(/\s/,Project("TMAKE_FILETAGS")) ) {
+ $project{$_} =~ s-[/\\]+-/-g;
+ }
+ if ( Project("DEF_FILE") ) {
+ Project('TMAKE_LFLAGS *= $$DEF_FILE');
+ }
+ if ( Project("RC_FILE") ) {
+ if ( Project("RES_FILE") ) {
+ tmake_error("Both .rc and .res file specified.\n" .
+ "Please specify one of them, not both.");
+ }
+ $project{"RES_FILE"} = $project{"RC_FILE"};
+ $project{"RES_FILE"} =~ s/\.rc$/.res/i;
+ Project('TARGETDEPS += $$RES_FILE');
+ }
+ if ( Project("RES_FILE") ) {
+ Project('TMAKE_LIBS *= $$RES_FILE');
+ }
+ $obj_ext = "o";
+ $dir_sep = "/";
+ $gnuwin32 = 1;
+ if ( Config("qt") ) {
+ $qtdir = $ENV{"QTDIR"};
+ $project{"INCPATH"} =~ s/\$\(QTDIR\)/$qtdir/;
+ $project{"INCPATH"} =~ s/\\/\//g;
+ $project{"TMAKE_LIBS"} =~ s/\$\(QTDIR\)/$qtdir/;
+ $project{"TMAKE_LIBS"} =~ s/\\/\//g;
+ }
+ StdInit();
+ if ( Project("VERSION") ) {
+ $project{"VER_MAJ"} = $project{"VERSION"};
+ $project{"VER_MAJ"} =~ s/\.\d+$//;
+ $project{"VER_MIN"} = $project{"VERSION"};
+ $project{"VER_MIN"} =~ s/^\d+\.//;
+ }
+ if ( Config("staticlib") ) {
+ $project{"TARGET"} = $project{"DESTDIR"} . "lib" . $project{"TARGET"};
+ } else {
+ $project{"TARGET"} = $project{"DESTDIR"} . $project{"TARGET"};
+ }
+#$}
+#!
+# Makefile for building #$ Expand("TARGET")
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = #$ Expand("TMAKE_CC");
+CXX = #$ Expand("TMAKE_CXX");
+CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
+#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LINK = #$ Expand("TMAKE_LINK");
+LFLAGS = #$ Expand("TMAKE_LFLAGS");
+LIBS = #$ Expand("TMAKE_LIBS");
+#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+AR = #$ Expand("TMAKE_AR");
+RANLIB = #$ Expand("TMAKE_RANLIB");
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+MOC = #$ Expand("TMAKE_MOC");
+
+ZIP = #$ Expand("TMAKE_ZIP");
+
+####### Files
+
+HEADERS = #$ ExpandList("HEADERS");
+SOURCES = #$ ExpandList("SOURCES");
+OBJECTS = #$ ExpandList("OBJECTS");
+SRCMOC = #$ ExpandList("SRCMOC");
+OBJMOC = #$ ExpandList("OBJMOC");
+DIST = #$ ExpandList("DISTFILES");
+TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .c
+
+.cpp.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cxx.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cc.o:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.c.o:
+ #$ Expand("TMAKE_RUN_CC_IMP");
+
+####### Build rules
+
+all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
+
+$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
+#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+ -rm -f $(TARGET)
+ $(AR) $(TARGET) $(OBJECTS) $(OBJMOC)
+ #$ ExpandGlue("TMAKE_RANLIB","",""," \$(TARGET)");
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
+ -cp $(TARGET) #$ Expand("DLLDESTDIR");
+#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
+#$ Project('RC_FILE') || DisableOutput();
+
+#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
+#$ Project('RC_FILE') || EnableOutput();
+
+moc: $(SRCMOC)
+
+#$ TmakeSelf();
+
+dist:
+ #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
+
+clean:
+ -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
+ #$ ExpandGlue("TMAKE_CLEAN","-rm -f "," ","");
+ -rm -f *~ core
+ #$ ExpandGlue("CLEAN_FILES","-rm -f "," ","");
+
+####### Compile
+
+#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
+#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
+#$ BuildMocSrc(Project("HEADERS"));
+#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-mingw/lib.t b/tmake/lib/win32-mingw/lib.t
new file mode 100644
index 0000000..ef9baa3
--- /dev/null
+++ b/tmake/lib/win32-mingw/lib.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 libraries.
+#!
+#$ Project('TMAKE_LIB_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-mingw/subdirs.t b/tmake/lib/win32-mingw/subdirs.t
new file mode 100644
index 0000000..20885f3
--- /dev/null
+++ b/tmake/lib/win32-mingw/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Win32 template
+#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-mingw/tmake.conf b/tmake/lib/win32-mingw/tmake.conf
new file mode 100644
index 0000000..259d9bb
--- /dev/null
+++ b/tmake/lib/win32-mingw/tmake.conf
@@ -0,0 +1,56 @@
+#
+#
+#
+# tmake configuration for Win32/mingw (MINGW gnu-win32)
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = gcc
+TMAKE_CFLAGS =
+TMAKE_CFLAGS_WARN_ON =
+TMAKE_CFLAGS_WARN_OFF =
+TMAKE_CFLAGS_RELEASE = -O2 -s
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
+
+TMAKE_CXX = g++
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_INCDIR_QT = $(QTDIR)/include
+
+TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
+TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
+TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
+TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
+
+TMAKE_LINK = g++
+TMAKE_LFLAGS =
+TMAKE_LFLAGS_RELEASE = -s
+TMAKE_LFLAGS_DEBUG =
+TMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
+TMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
+TMAKE_LFLAGS_CONSOLE_DLL= -Wl,-subsystem,console
+TMAKE_LFLAGS_WINDOWS_DLL= -Wl,-subsystem,windows
+
+TMAKE_LIBS =
+TMAKE_LIBS_CONSOLE =
+TMAKE_LIBS_WINDOWS = -luser32 -lgdi32 -lcomdlg32 -limm32 -lole32 -luuid -lwsock32
+TMAKE_LIBS_QT = -L$(QTDIR)/lib -lqt
+TMAKE_LIBS_QT_DLL = -lqtmain
+TMAKE_LIBS_QT_OPENGL = -lqgl
+TMAKE_LIBS_OPENGL = -lopengl32
+
+TMAKE_MOC = moc
+
+TMAKE_AR = ar cqs
+TMAKE_RANLIB =
+
+TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-msvc/app.t b/tmake/lib/win32-msvc/app.t
new file mode 100644
index 0000000..fc4dc2c
--- /dev/null
+++ b/tmake/lib/win32-msvc/app.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 applications.
+#!
+#$ Project('TMAKE_APP_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-msvc/generic.t b/tmake/lib/win32-msvc/generic.t
new file mode 100644
index 0000000..388db4b
--- /dev/null
+++ b/tmake/lib/win32-msvc/generic.t
@@ -0,0 +1,229 @@
+#!
+#! This is a tmake template for building Win32 applications or libraries.
+#!
+#${
+ if ( Config("qt") ) {
+ if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
+ ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
+ ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
+ Project('TMAKE_QT_DLL = 1');
+ if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
+ Project('CONFIG += dll');
+ }
+ }
+ }
+ if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
+ Project('CONFIG -= staticlib');
+ Project('TMAKE_APP_OR_DLL = 1');
+ } else {
+ Project('CONFIG += staticlib');
+ }
+ if ( Config("warn_off") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
+ } elsif ( Config("warn_on") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
+ }
+ if ( Config("debug") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
+ } elsif ( Config("release") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
+ Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
+ }
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG += windows' );
+ }
+ if ( Config("qt") ) {
+ Project('CONFIG *= moc');
+ AddIncludePath(Project("TMAKE_INCDIR_QT"));
+ if ( Config("release") ) {
+ Project('DEFINES += NO_DEBUG');
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
+ }
+ if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
+ if ( Project("TMAKE_QT_DLL") ) {
+ Project('DEFINES -= QT_DLL');
+ Project('DEFINES *= QT_MAKEDLL');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_QT_DLL');
+ }
+ } else {
+ if ( Project("TMAKE_QT_DLL") ) {
+ Project('DEFINES *= QT_DLL');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
+ if ( Project("TMAKE_QT_DLL") ) {
+ my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
+ Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
+ if ( !Config("dll") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
+ }
+ }
+ }
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
+ }
+ if ( Config("dll") ) {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
+ if ( Project("TMAKE_LIB_FLAG") ) {
+ my $ver = Project("VERSION");
+ $ver =~ s/\.//g;
+ $project{"TARGET_EXT"} = "${ver}.dll";
+ } else {
+ $project{"TARGET_EXT"} = ".dll";
+ }
+ } else {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
+ if ( Project("TMAKE_APP_FLAG") ) {
+ $project{"TARGET_EXT"} = ".exe";
+ } else {
+ $project{"TARGET_EXT"} = ".lib";
+ }
+ }
+ if ( Config("windows") ) {
+ if ( Config("console") ) {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ }
+ if ( Config("moc") ) {
+ $moc_aware = 1;
+ }
+ Project('TMAKE_LIBS += $$LIBS');
+ Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
+ foreach ( split(/\s/,Project("TMAKE_FILETAGS")) ) {
+ $project{$_} =~ s-[/\\]+-\\-g;
+ }
+ if ( Project("DEF_FILE") ) {
+ Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
+ }
+ if ( Project("RC_FILE") ) {
+ if ( Project("RES_FILE") ) {
+ tmake_error("Both .rc and .res file specified.\n" .
+ "Please specify one of them, not both.");
+ }
+ $project{"RES_FILE"} = $project{"RC_FILE"};
+ $project{"RES_FILE"} =~ s/\.rc$/.res/i;
+ Project('TARGETDEPS += $$RES_FILE');
+ }
+ if ( Project("RES_FILE") ) {
+ Project('TMAKE_LIBS *= $$RES_FILE');
+ }
+ StdInit();
+ if ( Project("VERSION") ) {
+ $project{"VER_MAJ"} = $project{"VERSION"};
+ $project{"VER_MAJ"} =~ s/\.\d+$//;
+ $project{"VER_MIN"} = $project{"VERSION"};
+ $project{"VER_MIN"} =~ s/^\d+\.//;
+ }
+ Project('debug:TMAKE_CLEAN += $$TARGET.pdb vc*.pdb $$TARGET.ilk');
+#$}
+#!
+# Makefile for building #$ Expand("TARGET")
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = #$ Expand("TMAKE_CC");
+CXX = #$ Expand("TMAKE_CXX");
+CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
+#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LINK = #$ Expand("TMAKE_LINK");
+LFLAGS = #$ Expand("TMAKE_LFLAGS");
+LIBS = #$ Expand("TMAKE_LIBS");
+#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LIB = #$ Expand("TMAKE_LIB");
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+MOC = #$ Expand("TMAKE_MOC");
+
+ZIP = #$ Expand("TMAKE_ZIP");
+
+####### Files
+
+HEADERS = #$ ExpandList("HEADERS");
+SOURCES = #$ ExpandList("SOURCES");
+OBJECTS = #$ ExpandList("OBJECTS");
+SRCMOC = #$ ExpandList("SRCMOC");
+OBJMOC = #$ ExpandList("OBJMOC");
+DIST = #$ ExpandList("DISTFILES");
+TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .c
+
+.cpp.obj:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cxx.obj:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.cc.obj:
+ #$ Expand("TMAKE_RUN_CXX_IMP");
+
+.c.obj:
+ #$ Expand("TMAKE_RUN_CC_IMP");
+
+####### Build rules
+
+all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
+
+$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
+ $(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
+ $(OBJECTS) $(OBJMOC) $(LIBS)
+#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+ $(LIB) /OUT:$(TARGET) @<<
+ $(OBJECTS) $(OBJMOC)
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+<<
+#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
+ -copy $(TARGET) #$ Expand("DLLDESTDIR");
+#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
+#$ Project("RC_FILE") || DisableOutput();
+
+#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
+#$ Project("RC_FILE") || EnableOutput();
+
+moc: $(SRCMOC)
+
+#$ TmakeSelf();
+
+dist:
+ #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
+
+clean:
+ #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
+ #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
+ #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
+ -del $(TARGET)
+ #$ ExpandGlue("TMAKE_CLEAN","-del ","\n\t-del ","");
+ #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
+
+####### Compile
+
+#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
+#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
+#$ BuildMocSrc(Project("HEADERS"));
+#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-msvc/lib.t b/tmake/lib/win32-msvc/lib.t
new file mode 100644
index 0000000..d8ac6c7
--- /dev/null
+++ b/tmake/lib/win32-msvc/lib.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 libraries.
+#!
+#$ Project('TMAKE_LIB_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-msvc/subdirs.t b/tmake/lib/win32-msvc/subdirs.t
new file mode 100644
index 0000000..8b881ab
--- /dev/null
+++ b/tmake/lib/win32-msvc/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Win32 template
+#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-msvc/tmake.conf b/tmake/lib/win32-msvc/tmake.conf
new file mode 100644
index 0000000..e3191a3
--- /dev/null
+++ b/tmake/lib/win32-msvc/tmake.conf
@@ -0,0 +1,65 @@
+#
+#
+#
+# tmake configuration for Win32/Microsoft C++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = cl
+TMAKE_CFLAGS = -nologo
+TMAKE_CFLAGS_WARN_ON = -W3
+TMAKE_CFLAGS_WARN_OFF = -W0
+TMAKE_CFLAGS_RELEASE = -O2
+TMAKE_CFLAGS_DEBUG = -Zi
+TMAKE_CFLAGS_MT = -MT
+TMAKE_CFLAGS_MT_DBG = -MTd
+TMAKE_CFLAGS_MT_DLL = -MD
+TMAKE_CFLAGS_MT_DLLDBG = -MDd
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = $$TMAKE_CC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_MT = $$TMAKE_CFLAGS_MT
+TMAKE_CXXFLAGS_MT_DBG = $$TMAKE_CFLAGS_MT_DBG
+TMAKE_CXXFLAGS_MT_DLL = $$TMAKE_CFLAGS_MT_DLL
+TMAKE_CXXFLAGS_MT_DLLDBG= $$TMAKE_CFLAGS_MT_DLLDBG
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_INCDIR_QT = $(QTDIR)\include
+
+TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$obj $src
+TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
+TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$obj $src
+TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
+
+TMAKE_LINK = link
+TMAKE_LFLAGS = /NOLOGO
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG = /DEBUG
+TMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:console
+TMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:windows
+TMAKE_LFLAGS_CONSOLE_DLL= /SUBSYSTEM:console /DLL
+TMAKE_LFLAGS_WINDOWS_DLL= /SUBSYSTEM:windows /DLL
+TMAKE_LFLAGS_QT_DLL = /BASE:0x39D00000
+
+TMAKE_LIBS =
+TMAKE_LIBS_CONSOLE =
+TMAKE_LIBS_WINDOWS = user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib
+TMAKE_LIBS_QT = $(QTDIR)\lib\qt.lib
+TMAKE_LIBS_QT_DLL = $(QTDIR)\lib\qtmain.lib
+TMAKE_LIBS_QT_OPENGL = $(QTDIR)\lib\qgl.lib
+TMAKE_LIBS_OPENGL = opengl32.lib glu32.lib
+
+TMAKE_MOC = moc
+
+TMAKE_LIB = lib /NOLOGO
+TMAKE_RC = rc
+
+TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-msvc/vcapp.t b/tmake/lib/win32-msvc/vcapp.t
new file mode 100644
index 0000000..ac7ae23
--- /dev/null
+++ b/tmake/lib/win32-msvc/vcapp.t
@@ -0,0 +1,244 @@
+#!
+#! This TMAKE template - Microsoft Visual C++ 5.0 applications
+#!
+#${
+ if ( Config("qt") ) {
+ if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
+ ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
+ ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
+ Project('TMAKE_QT_DLL = 1');
+ if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
+ Project('CONFIG += dll');
+ }
+ }
+ }
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG += windows');
+ }
+ if ( Config("qt") ) {
+ $moc_aware = 1;
+ AddIncludePath(Project('TMAKE_INCDIR_QT'));
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
+ }
+ if ( Project("TMAKE_QT_DLL") ) {
+ Project('DEFINES *= QT_DLL');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
+ if ( Project("TMAKE_QT_DLL") ) {
+ my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
+ Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
+ }
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
+ }
+ Project('TMAKE_LIBS += $$LIBS');
+
+ if ( Config("console") ) {
+ $project{"VC_PROJ_TYPE"} = 'Win32 (x86) Console Application';
+ $project{"VC_PROJ_CODE"} = '0x0103';
+ $vc_base_libs = 'kernel32.lib user32.lib gdi32.lib winspool.lib ' .
+ 'comdlg32.lib advapi32.lib shell32.lib ole32.lib ' .
+ 'oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ';
+ $vc_libs = $vc_base_libs;
+ $vc_link_release = '/nologo /subsystem:console /machine:I386';
+ $vc_link_debug = '/nologo /subsystem:console /debug /machine:I386 /pdbtype:sept';
+ $vc_cpp_def_release = '/D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" ';
+ $vc_cpp_def_debug = '/D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" ';
+ } else {
+ $project{"VC_PROJ_TYPE"} = 'Win32 (x86) Application';
+ $project{"VC_PROJ_CODE"} = '0x0101';
+ $vc_base_libs = 'kernel32.lib user32.lib gdi32.lib winspool.lib ' .
+ 'comdlg32.lib advapi32.lib shell32.lib ole32.lib ' .
+ 'oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ';
+ $vc_libs = $vc_base_libs . 'wsock32.lib ';
+ $vc_link_release = '/nologo /subsystem:windows /machine:I386';
+ $vc_link_debug = '/nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept';
+ $vc_cpp_def_release = '/D "NDEBUG" /D "WIN32" /D "_WINDOWS" ';
+ $vc_cpp_def_debug = '/D "_DEBUG" /D "WIN32" /D "_WINDOWS" ';
+ }
+ $project{"VC_BASE_LINK_RELEASE"} = $vc_base_libs . $vc_link_release;
+ $project{"VC_BASE_LINK_DEBUG"} = $vc_base_libs . $vc_link_debug;
+ $tmake_libs = Project('TMAKE_LIBS') ? (Project('TMAKE_LIBS') . " ") : "";
+ $project{"VC_LINK_RELEASE"} = $vc_libs . $tmake_libs . $vc_link_release;
+ $project{"VC_LINK_DEBUG"} = $vc_libs . $tmake_libs . $vc_link_debug;
+
+ $vc_cpp_opt_release = '/nologo /W3 /GX /O2 ';
+ $vc_cpp_opt_debug = '/nologo /W3 /Gm /GX /Zi /Od ';
+ $vc_cpp_opt_common = '/YX /FD /c';
+ $project{"VC_BASE_CPP_RELEASE"} = $vc_cpp_opt_release . $vc_cpp_def_release . $vc_cpp_opt_common;
+ $project{"VC_BASE_CPP_DEBUG"} = $vc_cpp_opt_debug . $vc_cpp_def_debug . $vc_cpp_opt_common;
+ ExpandPath("INCPATH",'/I ',' /I ','');
+ if ( $text ne "" ) { $vc_inc = $text . " "; $text = ""; } else { $vc_inc = ""; }
+ ExpandGlue("DEFINES",'/D "','" /D "','"');
+ if ( $text ne "" ) { $vc_def = $text . " "; $text = ""; } else { $vc_def = ""; }
+ $project{"VC_CPP_RELEASE"} = $vc_cpp_opt_release . $vc_inc . $vc_cpp_def_release . $vc_def . $vc_cpp_opt_common;
+ $project{"VC_CPP_DEBUG"} = $vc_cpp_opt_debug . $vc_inc . $vc_cpp_def_debug . $vc_def . $vc_cpp_opt_common;
+
+ $project{"MAKEFILE"} = $project{"PROJECT"} . ".mak";
+ $project{"TARGETAPP"} = $project{"TARGET"} . ".exe";
+ Project('TMAKE_FILETAGS = HEADERS SOURCES TARGET DESTDIR $$FILETAGS');
+ foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
+ $project{$_} =~ s-/-\\-g;
+ }
+ StdInit();
+ if ( defined($project{"DESTDIR"}) ) {
+ $project{"TARGETAPP"} = $project{"DESTDIR"} . "\\" . $project{"TARGETAPP"};
+ $project{"TARGETAPP"} =~ s/\\+/\\/g;
+ }
+ %all_files = ();
+ @files = split(/\s+/,$project{"HEADERS"});
+ foreach ( @files ) { $all_files{$_} = "h" };
+ @files = split(/\s+/,$project{"SOURCES"});
+ foreach ( @files ) { $all_files{$_} = "s" };
+ if ( $moc_aware ) {
+ @files = split(/\s+/,$project{"_HDRMOC"});
+ foreach ( @files ) { $all_files{$_} = "m"; }
+ @files = split(/\s+/,$project{"_SRCMOC"});
+ foreach ( @files ) { $all_files{$_} = "i"; }
+ }
+ %file_names = ();
+ foreach $f ( %all_files ) {
+ $n = $f;
+ $n =~ s/^.*\\//;
+ $file_names{$n} = $f;
+ $file_path{$n} = ".\\" . $f;
+ $file_path2{$n} = (($f =~ /^\./) ? "" : ".\\") . $f;
+ }
+#$}
+# Microsoft Developer Studio Project File - #$ Substitute('Name="$$TARGET" - Package Owner=<4>');
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE #$ Substitute('"$$VC_PROJ_TYPE" $$VC_PROJ_CODE');
+
+CFG=#$ Substitute('$$TARGET - Win32 Debug');
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "#$ ExpandGlue('MAKEFILE','','','".');
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f #$ Substitute('"$$MAKEFILE" CFG="$$TARGET - Win32 Debug"');
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE #$ Substitute('"$$TARGET - Win32 Release" (based on "$$VC_PROJ_TYPE")');
+!MESSAGE #$ Substitute('"$$TARGET - Win32 Debug" (based on "$$VC_PROJ_TYPE")');
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+#$ Config("windows") && ($text='MTL=midl.exe');
+RSC=rc.exe
+
+!IF "$(CFG)" == #$ Substitute('"$$TARGET - Win32 Release"');
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+#$ Config("windows") && ($text='# PROP Ignore_Export_Lib 0');
+# PROP Target_Dir ""
+# ADD BASE CPP #$ Expand("VC_BASE_CPP_RELEASE");
+# ADD CPP #$ Expand("VC_CPP_RELEASE");
+#$ Config("windows") || DisableOutput();
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+#$ Config("windows") || EnableOutput();
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 #$ Expand("VC_BASE_LINK_RELEASE");
+# ADD LINK32 #$ Expand("VC_LINK_RELEASE");
+
+!ELSEIF "$(CFG)" == #$ Substitute('"$$TARGET - Win32 Debug"');
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+#$ Config("windows") && ($text='# PROP Ignore_Export_Lib 0');
+# PROP Target_Dir ""
+# ADD BASE CPP #$ Expand("VC_BASE_CPP_DEBUG");
+# ADD CPP #$ Expand("VC_CPP_DEBUG");
+#$ Config("windows") || DisableOutput();
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+#$ Config("windows") || EnableOutput();
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 #$ Expand("VC_BASE_LINK_DEBUG");
+# ADD LINK32 #$ Expand("VC_LINK_DEBUG");
+
+!ENDIF
+
+# Begin Target
+
+# Name #$Substitute('"$$TARGET - Win32 Release"');
+# Name #$Substitute('"$$TARGET - Win32 Debug"');
+#${
+ foreach $n ( sort keys %file_names ) {
+ $f = $file_names{$n};
+ $p = $file_path{$n};
+ $p2 = $file_path2{$n};
+ $t = $all_files{$f};
+ if ( ($t eq "h") && $moc_output{$f} ) {
+ my($build);
+ $build = "\n\n# Begin Custom Build - Running moc...\nInputPath=" . $p2 . "\n\n"
+ . '"' . $moc_output{$f} . '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"'
+ . "\n\tmoc $p2 -o " . $moc_output{$f} . "\n\n"
+ . "# End Custom Build\n\n";
+ $text .= ("# Begin Source File\n\nSOURCE=$p\n\n"
+ . '!IF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Release"'
+ . $build);
+ $text .= ('!ELSEIF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Debug"'
+ . $build
+ . "!ENDIF \n\n# End Source File\n");
+ } elsif ( $t eq "i" ) {
+ my($build,$dn);
+ $build = "\n\n# Begin Custom Build - Running moc...\nInputPath=" . $p2 . "\n\n"
+ . '"' . $f . '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"'
+ . "\n\tmoc ". $moc_input{$f} . " -o $f\n\n"
+ . "# End Custom Build\n\n";
+ $dn = $n;
+ $dn =~ s/\..*//;
+ $dn =~ tr/a-z/A-Z/;
+ $text .= ("# Begin Source File\n\nSOURCE=$p\n"
+ . "USERDEP__$dn=" . '"' . $moc_input{$f} . '"' . "\n\n"
+ . '!IF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Release"'
+ . $build);
+ $text .= ('!ELSEIF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Debug"'
+ . $build
+ . "!ENDIF \n\n# End Source File\n");
+ } elsif ( $t eq "s" || $t eq "m" || $t eq "h" ) {
+ $text .= "# Begin Source File\n\nSOURCE=$p\n# End Source File\n";
+ }
+ }
+ chop $text;
+#$}
+# End Target
+# End Project
diff --git a/tmake/lib/win32-msvc/vclib.t b/tmake/lib/win32-msvc/vclib.t
new file mode 100644
index 0000000..11cd1d7
--- /dev/null
+++ b/tmake/lib/win32-msvc/vclib.t
@@ -0,0 +1,178 @@
+#!
+#! This TMAKE template - Microsoft Visual C++ 5.0 libraries
+#!
+#${
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG += windows');
+ }
+ if ( Config("qt") ) {
+ $moc_aware = 1;
+ AddIncludePath(Project('TMAKE_INCDIR_QT'));
+ }
+
+ $project{"VC_PROJ_TYPE"} = 'Win32 (x86) Static Library';
+ $project{"VC_PROJ_CODE"} = '0x0104';
+
+ $vc_cpp_def_release = '/D "NDEBUG" /D "WIN32" /D "_WINDOWS" ';
+ $vc_cpp_def_debug = '/D "_DEBUG" /D "WIN32" /D "_WINDOWS" ';
+ $vc_cpp_opt_release = '/nologo /W3 /GX /O2 ';
+ $vc_cpp_opt_debug = '/nologo /W3 /Gm /GX /Zi /Od ';
+ $vc_cpp_opt_common = '/YX /FD /c';
+ $project{"VC_BASE_CPP_RELEASE"} = $vc_cpp_opt_release . $vc_cpp_def_release . $vc_cpp_opt_common;
+ $project{"VC_BASE_CPP_DEBUG"} = $vc_cpp_opt_debug . $vc_cpp_def_debug . $vc_cpp_opt_common;
+ ExpandPath("INCPATH",'/I ',' /I ','');
+ if ( $text ne "" ) { $vc_inc = $text . " "; $text = ""; } else { $vc_inc = ""; }
+ ExpandGlue("DEFINES",'/D "','" /D "','"');
+ if ( $text ne "" ) { $vc_def = $text . " "; $text = ""; } else { $vc_def = ""; }
+ $project{"VC_CPP_RELEASE"} = $vc_cpp_opt_release . $vc_inc . $vc_cpp_def_release . $vc_def . $vc_cpp_opt_common;
+ $project{"VC_CPP_DEBUG"} = $vc_cpp_opt_debug . $vc_inc . $vc_cpp_def_debug . $vc_def . $vc_cpp_opt_common;
+
+ $project{"MAKEFILE"} = $project{"PROJECT"} . ".mak";
+ $project{"TARGETLIB"} = $project{"TARGET"} . ".lib";
+ Project('TMAKE_FILETAGS = HEADERS SOURCES TARGET DESTDIR $$FILETAGS');
+ foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
+ $project{$_} =~ s-/-\\-g;
+ }
+ StdInit();
+ if ( defined($project{"DESTDIR"}) ) {
+ $project{"TARGETLIB"} = $project{"DESTDIR"} . "\\" . $project{"TARGETLIB"};
+ $project{"TARGETLIB"} =~ s/\\+/\\/g;
+ }
+ %all_files = ();
+ @files = split(/\s+/,$project{"HEADERS"});
+ foreach ( @files ) { $all_files{$_} = "h" };
+ @files = split(/\s+/,$project{"SOURCES"});
+ foreach ( @files ) { $all_files{$_} = "s" };
+ if ( $moc_aware ) {
+ @files = split(/\s+/,$project{"_HDRMOC"});
+ foreach ( @files ) { $all_files{$_} = "m"; }
+ @files = split(/\s+/,$project{"_SRCMOC"});
+ foreach ( @files ) { $all_files{$_} = "i"; }
+ }
+ %file_names = ();
+ foreach $f ( %all_files ) {
+ $n = $f;
+ $n =~ s/^.*\\//;
+ $file_names{$n} = $f;
+ $file_path{$n} = ".\\" . $f;
+ $file_path2{$n} = (($f =~ /^\./) ? "" : ".\\") . $f;
+ }
+#$}
+# Microsoft Developer Studio Project File - #$ Substitute('Name="$$TARGET" - Package Owner=<4>');
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE #$ Substitute('"$$VC_PROJ_TYPE" $$VC_PROJ_CODE');
+
+CFG=#$ Substitute('$$TARGET - Win32 Debug');
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "#$ ExpandGlue('MAKEFILE','','','".');
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f #$ Substitute('"$$MAKEFILE" CFG="$$TARGET - Win32 Debug"');
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE #$ Substitute('"$$TARGET - Win32 Release" (based on "$$VC_PROJ_TYPE")');
+!MESSAGE #$ Substitute('"$$TARGET - Win32 Debug" (based on "$$VC_PROJ_TYPE")');
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+
+!IF "$(CFG)" == #$ Substitute('"$$TARGET - Win32 Release"');
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP #$ Expand("VC_BASE_CPP_RELEASE");
+# ADD CPP #$ Expand("VC_CPP_RELEASE");
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo #$ Project("TARGETLIB") && Substitute('/out:"$$TARGETLIB"');
+
+!ELSEIF "$(CFG)" == #$ Substitute('"$$TARGET - Win32 Debug"');
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP #$ Expand("VC_BASE_CPP_DEBUG");
+# ADD CPP #$ Expand("VC_CPP_DEBUG");
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo #$ Project("TARGETLIB") && Substitute('/out:"$$TARGETLIB"');
+
+!ENDIF
+
+# Begin Target
+
+# Name #$Substitute('"$$TARGET - Win32 Release"');
+# Name #$Substitute('"$$TARGET - Win32 Debug"');
+#${
+ foreach $n ( sort keys %file_names ) {
+ $f = $file_names{$n};
+ $p = $file_path{$n};
+ $p2 = $file_path2{$n};
+ $t = $all_files{$f};
+ if ( ($t eq "h") && $moc_output{$f} ) {
+ my($build);
+ $build = "\n\n# Begin Custom Build - Running moc...\nInputPath=" . $p2 . "\n\n"
+ . '"' . $moc_output{$f} . '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"'
+ . "\n\tmoc $p2 -o " . $moc_output{$f} . "\n\n"
+ . "# End Custom Build\n\n";
+ $text .= ("# Begin Source File\n\nSOURCE=$p\n\n"
+ . '!IF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Release"'
+ . $build);
+ $text .= ('!ELSEIF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Debug"'
+ . $build
+ . "!ENDIF \n\n# End Source File\n");
+ } elsif ( $t eq "i" ) {
+ my($build,$dn);
+ $build = "\n\n# Begin Custom Build - Running moc...\nInputPath=" . $p2 . "\n\n"
+ . '"' . $f . '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"'
+ . "\n\tmoc ". $moc_input{$f} . " -o $f\n\n"
+ . "# End Custom Build\n\n";
+ $dn = $n;
+ $dn =~ s/\..*//;
+ $dn =~ tr/a-z/A-Z/;
+ $text .= ("# Begin Source File\n\nSOURCE=$p\n"
+ . "USERDEP__$dn=" . '"' . $moc_input{$f} . '"' . "\n\n"
+ . '!IF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Release"'
+ . $build);
+ $text .= ('!ELSEIF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Debug"'
+ . $build
+ . "!ENDIF \n\n# End Source File\n");
+ } elsif ( $t eq "s" || $t eq "m" || $t eq "h" ) {
+ $text .= "# Begin Source File\n\nSOURCE=$p\n# End Source File\n";
+ }
+ }
+ chop $text;
+#$}
+# End Target
+# End Project
diff --git a/tmake/lib/win32-symantec/app.t b/tmake/lib/win32-symantec/app.t
new file mode 100644
index 0000000..fc4dc2c
--- /dev/null
+++ b/tmake/lib/win32-symantec/app.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 applications.
+#!
+#$ Project('TMAKE_APP_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-symantec/generic.t b/tmake/lib/win32-symantec/generic.t
new file mode 100644
index 0000000..78e1d77
--- /dev/null
+++ b/tmake/lib/win32-symantec/generic.t
@@ -0,0 +1,211 @@
+#!
+#! This is a tmake template for building Win32 applications or libraries.
+#!
+#${
+ if ( Config("qt") ) {
+ if ( $ENV{"QT_DLL"} && !$ENV{"QT_NODLL"} ) {
+ Project('TMAKE_QT_DLL = 1');
+ if ( Project("TARGET") eq "qt" ) {
+ Project('CONFIG += dll');
+ }
+ }
+ }
+ if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
+ Project('CONFIG -= staticlib');
+ Project('TMAKE_APP_OR_DLL = 1');
+ } else {
+ Project('CONFIG += staticlib');
+ }
+ if ( Config("warn_off") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
+ } elsif ( Config("warn_on") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
+ }
+ if ( Config("debug") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
+ } elsif ( Config("release") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
+ }
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG += windows' );
+ }
+ if ( Config("qt") ) {
+ $moc_aware = 1;
+ AddIncludePath(Project('TMAKE_INCDIR_QT'));
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
+ }
+ if ( Project("TARGET") eq "qt" ) {
+ if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
+ Project('DEFINES *= QT_MAKEDLL');
+ }
+ } else {
+ if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
+ Project('DEFINES *= QT_DLL');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
+ if ( (Project("DEFINES") =~ /QT_DLL/) ) {
+ my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
+ Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
+ }
+ }
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
+ }
+ if ( Config("dll") ) {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
+ if ( Project("TMAKE_LIB_FLAG") ) {
+ my $ver = Project("VERSION");
+ $ver =~ s/\.//g;
+ $project{"TARGET_EXT"} = "${ver}.dll";
+ } else {
+ $project{"TARGET_EXT"} = ".dll";
+ }
+ } else {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
+ if ( Project('TMAKE_APP_FLAG') ) {
+ $project{"TARGET_EXT"} = ".exe";
+ } else {
+ $project{"TARGET_EXT"} = ".lib";
+ }
+ }
+ if ( Config("windows") ) {
+ if ( Config("console") ) {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ }
+ Project('TMAKE_LIBS += $$LIBS');
+ Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
+ foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
+ $project{$_} =~ s-[/\\]+-\\-g;
+ }
+ if ( Project('DEF_FILE') ) {
+ Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
+ }
+ if ( Project('RC_FILE') ) {
+ if ( Project('RES_FILE') ) {
+ tmake_error("Both .rc and .res file specified.\n" .
+ "Please specify one of them, not both.");
+ }
+ $project{"RES_FILE"} = $project{"RC_FILE"};
+ $project{"RES_FILE"} =~ s/\.rc$/.res/i;
+ Project('TARGETDEPS += $$RES_FILE');
+ }
+ if ( Project('RES_FILE') ) {
+ Project('TMAKE_LIBS *= $$RES_FILE');
+ }
+ StdInit();
+ if ( Project("VERSION") ) {
+ $project{"VER_MAJ"} = $project{"VERSION"};
+ $project{"VER_MAJ"} =~ s/\.\d+$//;
+ $project{"VER_MIN"} = $project{"VERSION"};
+ $project{"VER_MIN"} =~ s/^\d+\.//;
+ }
+#$}
+#!
+# Makefile for building #$ Expand("TARGET")
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = #$ Expand("TMAKE_CC");
+CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
+#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LINK = #$ Expand("TMAKE_LINK");
+LFLAGS = #$ Expand("TMAKE_LFLAGS");
+LIBS = #$ Expand("TMAKE_LIBS");
+#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LIB = #$ Expand("TMAKE_LIB");
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+MOC = #$ Expand("TMAKE_MOC");
+
+ZIP = #$ Expand("TMAKE_ZIP");
+
+####### Files
+
+HEADERS = #$ ExpandList("HEADERS");
+SOURCES = #$ ExpandList("SOURCES");
+OBJECTS = #$ ExpandList("OBJECTS");
+SRCMOC = #$ ExpandList("SRCMOC");
+OBJMOC = #$ ExpandList("OBJMOC");
+DIST = #$ ExpandList("DISTFILES");
+TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .c
+
+.cpp.obj:
+ #$ Expand("TMAKE_COMPILE_IMP");
+
+.cxx.obj:
+ #$ Expand("TMAKE_COMPILE_IMP");
+
+.cc.obj:
+ #$ Expand("TMAKE_COMPILE_IMP");
+
+.c.obj:
+ #$ Expand("TMAKE_COMPILE_IMP");
+
+####### Build rules
+
+all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
+
+$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
+ $(LINK) $(LFLAGS) $(OBJECTS) $(OBJMOC), $(TARGET),, $(LIBS)
+#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+ -del $(TARGET)
+#${
+# $text = "\t\$(LIB) \$(TARGET) "
+# . join(" \\\n+",split(/\s+/,$project{"OBJECTS"})) . " \\\n+"
+# . join(" \\\n+",split(/\s+/,$project{"OBJMOC"})) . ",;";
+#$}
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
+ -copy $(TARGET) #$ Expand("DLLDESTDIR");
+#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
+#$ Project('RC_FILE') || DisableOutput();
+
+#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
+#$ Project('RC_FILE') || EnableOutput();
+
+moc: $(SRCMOC)
+
+#$ TmakeSelf();
+
+dist:
+ #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
+
+clean:
+ #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
+ #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
+ #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
+ -del $(TARGET)
+ #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
+
+####### Compile
+
+#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
+#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
+#$ BuildMocSrc(Project("HEADERS"));
+#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-symantec/lib.t b/tmake/lib/win32-symantec/lib.t
new file mode 100644
index 0000000..d8ac6c7
--- /dev/null
+++ b/tmake/lib/win32-symantec/lib.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 libraries.
+#!
+#$ Project('TMAKE_LIB_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-symantec/subdirs.t b/tmake/lib/win32-symantec/subdirs.t
new file mode 100644
index 0000000..8b881ab
--- /dev/null
+++ b/tmake/lib/win32-symantec/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Win32 template
+#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-symantec/tmake.conf b/tmake/lib/win32-symantec/tmake.conf
new file mode 100644
index 0000000..81f88c2
--- /dev/null
+++ b/tmake/lib/win32-symantec/tmake.conf
@@ -0,0 +1,56 @@
+#
+#
+#
+# tmake configuration for Win32/Symantec C++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = sc
+TMAKE_CFLAGS = -mn -w2
+TMAKE_CFLAGS_WARN_ON =
+TMAKE_CFLAGS_WARN_OFF = -w
+TMAKE_CFLAGS_RELEASE = -o
+TMAKE_CFLAGS_DEBUG = -g
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = $$TMAKE_CC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_INCDIR_QT = $(QTDIR)\include
+
+TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o$obj $src
+TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o$@ $<
+TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o$obj $src
+TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o$@ $<
+
+TMAKE_LINK = link
+TMAKE_LFLAGS = /NOLOGO /NOI
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG = /DEBUG
+TMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:console
+TMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:windows
+TMAKE_LFLAGS_CONSOLE_DLL= /SUBSYSTEM:console /DLL
+TMAKE_LFLAGS_WINDOWS_DLL= /SUBSYSTEM:windows /DLL
+
+TMAKE_LIBS =
+TMAKE_LIBS_CONSOLE =
+TMAKE_LIBS_WINDOWS = user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib
+TMAKE_LIBS_QT = $(QTDIR)\lib\qt.lib
+TMAKE_LIBS_QT_DLL = $(QTDIR)\lib\qtmain.lib
+TMAKE_LIBS_QT_OPENGL = $(QTDIR)\lib\qgl.lib
+TMAKE_LIBS_OPENGL = opengl32.lib
+
+TMAKE_MOC = moc
+
+TMAKE_LIB = lib /C /N /NOI /P:32
+TMAKE_RC = rc
+
+TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-visage/app.t b/tmake/lib/win32-visage/app.t
new file mode 100644
index 0000000..fc4dc2c
--- /dev/null
+++ b/tmake/lib/win32-visage/app.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 applications.
+#!
+#$ Project('TMAKE_APP_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-visage/generic.t b/tmake/lib/win32-visage/generic.t
new file mode 100644
index 0000000..aeec8db
--- /dev/null
+++ b/tmake/lib/win32-visage/generic.t
@@ -0,0 +1,207 @@
+#!
+#! This is a tmake template for building Win32 applications or libraries.
+#!
+#${
+ if ( Config("qt") ) {
+ if ( $ENV{"QT_DLL"} && !$ENV{"QT_NODLL"} ) {
+ Project('TMAKE_QT_DLL = 1');
+ if ( Project("TARGET") eq "qt" ) {
+ Project('CONFIG += dll');
+ }
+ }
+ }
+ if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
+ Project('CONFIG -= staticlib');
+ Project('TMAKE_APP_OR_DLL = 1');
+ } else {
+ Project('CONFIG += staticlib');
+ }
+ if ( Config("warn_off") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
+ } elsif ( Config("warn_on") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
+ }
+ if ( Config("debug") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
+ } elsif ( Config("release") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
+ }
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG += windows' );
+ }
+ if ( Config("qt") ) {
+ $moc_aware = 1;
+ AddIncludePath(Project('TMAKE_INCDIR_QT'));
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
+ }
+ if ( Project("TARGET") eq "qt" ) {
+ if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
+ Project('DEFINES *= QT_MAKEDLL');
+ }
+ } else {
+ if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
+ Project('DEFINES *= QT_DLL');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
+ if ( (Project("DEFINES") =~ /QT_DLL/) ) {
+ my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
+ Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
+ }
+ }
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
+ }
+ if ( Config("dll") ) {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
+ if ( Project("TMAKE_LIB_FLAG") ) {
+ my $ver = Project("VERSION");
+ $ver =~ s/\.//g;
+ $project{"TARGET_EXT"} = "${ver}.dll";
+ } else {
+ $project{"TARGET_EXT"} = ".dll";
+ }
+ } else {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
+ if ( Project('TMAKE_APP_FLAG') ) {
+ $project{"TARGET_EXT"} = ".exe";
+ } else {
+ $project{"TARGET_EXT"} = ".lib";
+ }
+ }
+ if ( Config("windows") ) {
+ if ( Config("console") ) {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ }
+ Project('TMAKE_LIBS += $$LIBS');
+ Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
+ foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
+ $project{$_} =~ s-[/\\]+-\\-g;
+ }
+ if ( Project('DEF_FILE') ) {
+ Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
+ }
+ if ( Project('RC_FILE') ) {
+ if ( Project('RES_FILE') ) {
+ tmake_error("Both .rc and .res file specified.\n" .
+ "Please specify one of them, not both.");
+ }
+ $project{"RES_FILE"} = $project{"RC_FILE"};
+ $project{"RES_FILE"} =~ s/\.rc$/.res/i;
+ Project('TARGETDEPS += $$RES_FILE');
+ }
+ if ( Project('RES_FILE') ) {
+ Project('TMAKE_LIBS *= $$RES_FILE');
+ }
+ StdInit();
+ if ( Project("VERSION") ) {
+ $project{"VER_MAJ"} = $project{"VERSION"};
+ $project{"VER_MAJ"} =~ s/\.\d+$//;
+ $project{"VER_MIN"} = $project{"VERSION"};
+ $project{"VER_MIN"} =~ s/^\d+\.//;
+ }
+#$}
+#!
+# Makefile for building #$ Expand("TARGET")
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+####### Compiler, tools and options
+
+CC = #$ Expand("TMAKE_CC");
+CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
+INCPATH = #$ ExpandGlue("INCPATH",'-I',' -I','');
+#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LINK = #$ Expand("TMAKE_LINK");
+LFLAGS = #$ Expand("TMAKE_LFLAGS");
+LIBS = #$ Expand("TMAKE_LIBS");
+#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LIB = #$ Expand("TMAKE_LIB");
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+MOC = #$ Expand("TMAKE_MOC");
+
+ZIP = #$ Expand("TMAKE_ZIP");
+
+####### Files
+
+HEADERS = #$ ExpandList("HEADERS");
+SOURCES = #$ ExpandList("SOURCES");
+OBJECTS = #$ ExpandList("OBJECTS");
+SRCMOC = #$ ExpandList("SRCMOC");
+OBJMOC = #$ ExpandList("OBJMOC");
+DIST = #$ ExpandList("DISTFILES");
+TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
+
+####### Implicit rules
+
+.SUFFIXES: .cpp .cxx .cc .c
+
+.cpp.obj:
+ #$ Expand("TMAKE_COMPILE_IMP");
+
+.cxx.obj:
+ #$ Expand("TMAKE_COMPILE_IMP");
+
+.cc.obj:
+ #$ Expand("TMAKE_COMPILE_IMP");
+
+.c.obj:
+ #$ Expand("TMAKE_COMPILE_IMP");
+
+####### Build rules
+
+all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
+
+$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
+$(TARGET): $(OBJECTS) $(LIBS) #$ Expand("TARGETDEPS");
+ $(LINK) -B"$(LFLAGS)" $(OBJECTS) $(LIBS) -Fe$(TARGET)
+#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+ $(LIB) /OUT:$(TARGET) $(OBJECTS) $(OBJMOC)
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
+ -copy $(TARGET) #$ Expand("DLLDESTDIR");
+#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
+#$ Project('RC_FILE') || DisableOutput();
+
+#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
+#$ Project('RC_FILE') || EnableOutput();
+
+moc: $(SRCMOC)
+
+#$ TmakeSelf();
+
+dist:
+ #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
+
+clean:
+ #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
+ #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
+ #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
+ -del $(TARGET)
+ #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
+
+####### Compile
+
+#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
+#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
+#$ BuildMocSrc(Project("HEADERS"));
+#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-visage/lib.t b/tmake/lib/win32-visage/lib.t
new file mode 100644
index 0000000..d8ac6c7
--- /dev/null
+++ b/tmake/lib/win32-visage/lib.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 libraries.
+#!
+#$ Project('TMAKE_LIB_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-visage/subdirs.t b/tmake/lib/win32-visage/subdirs.t
new file mode 100644
index 0000000..8b881ab
--- /dev/null
+++ b/tmake/lib/win32-visage/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Win32 template
+#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-visage/tmake.conf b/tmake/lib/win32-visage/tmake.conf
new file mode 100644
index 0000000..69d3a82
--- /dev/null
+++ b/tmake/lib/win32-visage/tmake.conf
@@ -0,0 +1,56 @@
+#
+#
+#
+# tmake configuration for Win32/IBM Visual Age
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = icc -C
+TMAKE_CFLAGS = -Q -Ft -Gd -Gm+ -qrtti=all
+TMAKE_CFLAGS_WARN_ON = -W3
+TMAKE_CFLAGS_WARN_OFF = -W0
+TMAKE_CFLAGS_RELEASE = -Gl+ -O -Oc+
+TMAKE_CFLAGS_DEBUG = -Fb* -Ti -Tm
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = $$TMAKE_CC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_INCDIR_QT = $(QTDIR)\include
+
+TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -Fo"$obj" $src
+TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -Fo"$@" $<
+TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo"$obj" $src
+TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo"$@" $<
+
+TMAKE_LINK = icc -Tdp $(CFLAGS)
+TMAKE_LFLAGS = -nologo -code:RX -data:RW -def -noe
+TMAKE_LFLAGS_RELEASE = -OPTF
+TMAKE_LFLAGS_DEBUG = -de -br
+TMAKE_LFLAGS_CONSOLE = -pmtype:vio
+TMAKE_LFLAGS_WINDOWS = -pmtype:pm
+TMAKE_LFLAGS_CONSOLE_DLL= -DLL
+TMAKE_LFLAGS_WINDOWS_DLL= -DLL
+
+TMAKE_LIBS =
+TMAKE_LIBS_CONSOLE =
+TMAKE_LIBS_WINDOWS = user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib
+TMAKE_LIBS_QT = $(QTDIR)\lib\qt.lib
+TMAKE_LIBS_QT_DLL = $(QTDIR)\lib\qtmain.lib
+TMAKE_LIBS_QT_OPENGL = $(QTDIR)\lib\qgl.lib
+TMAKE_LIBS_OPENGL = opengl32.lib glu32.lib
+
+TMAKE_MOC = moc
+
+TMAKE_LIB = ilib
+TMAKE_RC = rc
+
+TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-watcom/app.t b/tmake/lib/win32-watcom/app.t
new file mode 100644
index 0000000..fc4dc2c
--- /dev/null
+++ b/tmake/lib/win32-watcom/app.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 applications.
+#!
+#$ Project('TMAKE_APP_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-watcom/generic.t b/tmake/lib/win32-watcom/generic.t
new file mode 100644
index 0000000..0cc47bb
--- /dev/null
+++ b/tmake/lib/win32-watcom/generic.t
@@ -0,0 +1,201 @@
+#!
+#! This is a tmake template for building Win32 applications or libraries.
+#!
+#${
+ if ( Config("qt") ) {
+ if ( $ENV{"QT_DLL"} && !$ENV{"QT_NODLL"} ) {
+ Project('TMAKE_QT_DLL = 1');
+ if ( Project("TARGET") eq "qt" ) {
+ Project('CONFIG += dll');
+ }
+ }
+ }
+ if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
+ Project('CONFIG -= staticlib');
+ Project('TMAKE_APP_OR_DLL = 1');
+ } else {
+ Project('CONFIG += staticlib');
+ }
+ if ( Config("warn_off") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
+ } elsif ( Config("warn_on") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
+ }
+ if ( Config("debug") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
+ } elsif ( Config("release") ) {
+ Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
+ Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
+ }
+ if ( Config("qt") || Config("opengl") ) {
+ Project('CONFIG += windows' );
+ }
+ if ( Config("qt") ) {
+ $moc_aware = 1;
+ AddIncludePath(Project('TMAKE_INCDIR_QT'));
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
+ }
+ if ( Project("TARGET") eq "qt" ) {
+ if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
+ Project('DEFINES *= QT_MAKEDLL');
+ }
+ } else {
+ if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
+ Project('DEFINES *= QT_DLL');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
+ if ( (Project("DEFINES") =~ /QT_DLL/) ) {
+ my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
+ Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
+ }
+ }
+ }
+ if ( Config("opengl") ) {
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
+ }
+ if ( Config("dll") ) {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
+ if ( Project("TMAKE_LIB_FLAG") ) {
+ my $ver = Project("VERSION");
+ $ver =~ s/\.//g;
+ $project{"TARGET_EXT"} = "${ver}.dll";
+ } else {
+ $project{"TARGET_EXT"} = ".dll";
+ }
+ } else {
+ Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
+ Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
+ if ( Project('TMAKE_APP_FLAG') ) {
+ $project{"TARGET_EXT"} = ".exe";
+ } else {
+ $project{"TARGET_EXT"} = ".lib";
+ }
+ }
+ if ( Config("windows") ) {
+ if ( Config("console") ) {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
+ }
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
+ } else {
+ Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
+ Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
+ }
+ Project('TMAKE_LIBS += $$LIBS');
+ Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
+ foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
+ $project{$_} =~ s-[/\\]+-\\-g;
+ }
+ if ( Project('DEF_FILE') ) {
+ Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
+ }
+ if ( Project('RC_FILE') ) {
+ if ( Project('RES_FILE') ) {
+ tmake_error("Both .rc and .res file specified.\n" .
+ "Please specify one of them, not both.");
+ }
+ $project{"RES_FILE"} = $project{"RC_FILE"};
+ $project{"RES_FILE"} =~ s/\.rc$/.res/i;
+ Project('TARGETDEPS += $$RES_FILE');
+ }
+ if ( Project('RES_FILE') ) {
+ Project('TMAKE_LIBS *= $$RES_FILE');
+ }
+ $linebreak = '&';
+ StdInit();
+ if ( Project("VERSION") ) {
+ $project{"VER_MAJ"} = $project{"VERSION"};
+ $project{"VER_MAJ"} =~ s/\.\d+$//;
+ $project{"VER_MIN"} = $project{"VERSION"};
+ $project{"VER_MIN"} =~ s/^\d+\.//;
+ }
+#$}
+#!
+# Makefile for building #$ Expand("TARGET")
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+####### Compiler, tools and options
+
+#$ Config("qt") || DisableOutput();
+QTDIR = #$ $text = $ENV{"QTDIR"};
+#$ Config("qt") || EnableOutput();
+CC = #$ Expand("TMAKE_CC");
+CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-d="," -d=","");
+INCPATH = #$ ExpandPath("INCPATH",'-i=',' -i=','');
+#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LINK = #$ Expand("TMAKE_LINK");
+LFLAGS = #$ Expand("TMAKE_LFLAGS");
+LIBS = #$ Expand("TMAKE_LIBS");
+#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+LIB = #$ Expand("TMAKE_LIB");
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+MOC = #$ Expand("TMAKE_MOC");
+
+ZIP = #$ Expand("TMAKE_ZIP");
+
+####### Files
+
+HEADERS = #$ ExpandList("HEADERS");
+SOURCES = #$ ExpandList("SOURCES");
+OBJECTS = #$ ExpandList("OBJECTS");
+SRCMOC = #$ ExpandList("SRCMOC");
+OBJMOC = #$ ExpandList("OBJMOC");
+DIST = #$ ExpandList("DISTFILES");
+TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
+TMPLIST = #$ ExpandGlue("TARGET","","",".lst");
+####### Build rules
+
+all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
+
+$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
+ @%create $(TMPLIST)
+#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
+ @%append $(TMPLIST) NAME #$ Expand("TARGET");
+ #$ ExpandGlue("OBJECTS",'@%append $(TMPLIST) FIL ',",","");
+ #$ ExpandGlue("OBJMOC" ,'@%append $(TMPLIST) FIL ',",","");
+ #$ ExpandGlue("TMAKE_LIBS" ,'@%append $(TMPLIST) LIBR ',",","");
+ $(LINK) $(LFLAGS) @$(TMPLIST)
+#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
+#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
+ @for %i in ( $(OBJECTS) $(OBJMOC) ) do @%append $(TMPLIST) +'%i'
+ $(LIB) $(TARGET) @$(TMPLIST)
+#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
+ del $(TMPLIST)
+#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
+ -copy $(TARGET) #$ Expand("DLLDESTDIR");
+#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
+#$ Project('RC_FILE') || DisableOutput();
+
+#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
+#$ Project('RC_FILE') || EnableOutput();
+
+moc: $(SRCMOC)
+
+#$ TmakeSelf();
+
+dist:
+ #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
+
+clean:
+ #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
+ #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
+ #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
+ -del $(TARGET)
+ #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
+
+####### Compile
+
+#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
+#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
+#$ BuildMocSrc(Project("HEADERS"));
+#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-watcom/lib.t b/tmake/lib/win32-watcom/lib.t
new file mode 100644
index 0000000..d8ac6c7
--- /dev/null
+++ b/tmake/lib/win32-watcom/lib.t
@@ -0,0 +1,6 @@
+#############################################################################
+#!
+#! This is a tmake template for building Win32 libraries.
+#!
+#$ Project('TMAKE_LIB_FLAG = 1');
+#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-watcom/subdirs.t b/tmake/lib/win32-watcom/subdirs.t
new file mode 100644
index 0000000..8b881ab
--- /dev/null
+++ b/tmake/lib/win32-watcom/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Win32 template
+#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-watcom/tmake.conf b/tmake/lib/win32-watcom/tmake.conf
new file mode 100644
index 0000000..862e915
--- /dev/null
+++ b/tmake/lib/win32-watcom/tmake.conf
@@ -0,0 +1,54 @@
+#
+#
+#
+# tmake configuration for Win32/Watcom C++
+#
+
+TEMPLATE = app
+CONFIG = qt warn_on release
+
+TMAKE_CC = wcl386
+TMAKE_CFLAGS = -zq
+TMAKE_CFLAGS_WARN_ON = -w2
+TMAKE_CFLAGS_WARN_OFF = -w0
+TMAKE_CFLAGS_RELEASE = -ox
+TMAKE_CFLAGS_DEBUG = -d2
+TMAKE_CFLAGS_YACC =
+
+TMAKE_CXX = $$TMAKE_CC
+TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR =
+TMAKE_INCDIR_QT = $(QTDIR)\include
+
+TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -fo=$obj $src
+TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -fo=$obj $src
+
+TMAKE_LINK = wlink
+TMAKE_LFLAGS = op quiet op c
+TMAKE_LFLAGS_RELEASE =
+TMAKE_LFLAGS_DEBUG = d all
+TMAKE_LFLAGS_CONSOLE = sys nt
+TMAKE_LFLAGS_WINDOWS = sys nt_win
+TMAKE_LFLAGS_CONSOLE_DLL= sys nt
+TMAKE_LFLAGS_WINDOWS_DLL= sys nt_win
+
+TMAKE_LIBS =
+TMAKE_LIBS_CONSOLE =
+TMAKE_LIBS_WINDOWS =
+TMAKE_LIBS_QT = %QTDIR%\lib\qt.lib
+TMAKE_LIBS_QT_DLL = %QTDIR%\lib\qtmain.lib
+TMAKE_LIBS_QT_OPENGL = %QTDIR%\lib\qgl.lib
+TMAKE_LIBS_OPENGL = opengl32.lib
+
+TMAKE_MOC = moc
+
+TMAKE_LIB = wlib -b -c -n -q -p=512
+TMAKE_RC = rc
+
+TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32/subdirs.t b/tmake/lib/win32/subdirs.t
new file mode 100644
index 0000000..4c857fd
--- /dev/null
+++ b/tmake/lib/win32/subdirs.t
@@ -0,0 +1,54 @@
+#############################################################################
+#!
+#! This is a tmake template for creating a makefile that invokes make in
+#! sub directories - for Win32.
+#!
+#${
+ StdInit();
+ $m = "";
+ foreach ( split(/\s+/,$project{"SUBDIRS"}) ) {
+ $m = $m . "\tcd $_\n\tDOMAKE\n\t\@cd ..\n";
+ }
+ $project{"SUBMAKE"} = $m;
+ Project('MAKEFILE') || Project('MAKEFILE = Makefile');
+ Project('TMAKE') || Project('TMAKE = tmake');
+#$}
+#!
+# Makefile for building targets in sub directories.
+# Generated by tmake at #$ Now();
+# Project: #$ Expand("PROJECT");
+# Template: #$ Expand("TEMPLATE");
+#############################################################################
+
+MAKEFILE= #$ Expand("MAKEFILE");
+TMAKE = #$ Expand("TMAKE");
+
+SUBDIRS = #$ ExpandList("SUBDIRS");
+
+all: $(SUBDIRS)
+
+#${
+ foreach ( split(/\s+/,$project{"SUBDIRS"}) ) {
+ if ( Project("TMAKE_NOFORCE") ) {
+ $text = $text . $_ . ":\n\t" .
+ "cd $_\n\t\$(MAKE\)\n\t\@cd ..\n\n";
+ } else {
+ $text = $text . $_ . ": FORCE\n\t" .
+ "cd $_\n\t\$(MAKE\)\n\t\@cd ..\n\n";
+ }
+ }
+#$}
+#$ TmakeSelf();
+
+tmake_all:
+#${
+ foreach ( split(/\s+/,$project{"SUBDIRS"}) ) {
+ $text .= "\tcd $_\n\t\$(TMAKE\) $_.pro -o \$(MAKEFILE)\n\t\@cd ..\n";
+ }
+#$}
+
+clean:
+#$ $text = $project{"SUBMAKE"}; $text =~ s/DOMAKE/\$(MAKE\) clean/g;
+#$ Project("TMAKE_NOFORCE") && DisableOutput();
+FORCE:
+#$ Project("TMAKE_NOFORCE") && EnableOutput();
diff --git a/winbuild/Doxygen.sln b/winbuild/Doxygen.sln
new file mode 100644
index 0000000..008fa51
--- /dev/null
+++ b/winbuild/Doxygen.sln
@@ -0,0 +1,44 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxygen", "Doxygen.vcproj", "{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B6BB4771-8A4E-4656-AC08-1EF8AC182F64} = {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxytag", "Doxytag.vcproj", "{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B6BB4771-8A4E-4656-AC08-1EF8AC182F64} = {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtools", "qtools.vcproj", "{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doxywizard", "Doxywizard.vcproj", "{77C9C2D3-EA3F-3D59-8B4C-0ED852890172}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Debug|Win32.Build.0 = Debug|Win32
+ {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|Win32.ActiveCfg = Release|Win32
+ {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|Win32.Build.0 = Release|Win32
+ {EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Debug|Win32.Build.0 = Debug|Win32
+ {EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Release|Win32.ActiveCfg = Release|Win32
+ {EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Release|Win32.Build.0 = Release|Win32
+ {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|Win32.Build.0 = Debug|Win32
+ {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|Win32.ActiveCfg = Release|Win32
+ {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|Win32.Build.0 = Release|Win32
+ {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Debug|Win32.Build.0 = Debug|Win32
+ {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Release|Win32.ActiveCfg = Release|Win32
+ {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/winbuild/Doxygen.vcproj b/winbuild/Doxygen.vcproj
new file mode 100644
index 0000000..c48b4c9
--- /dev/null
+++ b/winbuild/Doxygen.vcproj
@@ -0,0 +1,2621 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="Doxygen"
+ ProjectGUID="{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}"
+ RootNamespace="Doxygen"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ <ToolFile
+ RelativePath=".\Lex.rules"
+ />
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\bin\Debug"
+ IntermediateDirectory="..\objects\Debug"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="version.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="Lex"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Debug/Doxygen.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/Zm200 "
+ Optimization="0"
+ AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,."
+ PreprocessorDefinitions="_CONSOLE;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ PrecompiledHeaderFile=".\Debug/Doxygen.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="qtools.lib ws2_32.lib iconv.lib shell32.lib"
+ OutputFile="..\bin\Debug\doxygen.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="Debug"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\Debug/Doxygen.pdb"
+ SubSystem="1"
+ LargeAddressAware="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Debug/Doxygen.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\bin"
+ IntermediateDirectory="..\objects"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="version.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="Lex"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Release/Doxygen.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/Zm200 "
+ Optimization="2"
+ InlineFunctionExpansion="2"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,."
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"
+ StringPooling="true"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile=".\Release/Doxygen.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/LTCG"
+ AdditionalDependencies="qtools.lib iconv.lib shell32.lib"
+ OutputFile="..\bin\doxygen.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="Release"
+ ProgramDatabaseFile=".\Release/Doxygen.pdb"
+ SubSystem="1"
+ LargeAddressAware="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Release/Doxygen.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath="..\src\ce_lex.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ce_parse.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\classdef.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\classlist.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\cmdmapper.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\code.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\code.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PcodeYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PcodeYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\commentcnv.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\commentcnv.l"
+ >
+ </File>
+ <File
+ RelativePath="..\src\commentscan.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\commentscan.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PcommentScanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PcommentScanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\config.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\config.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PconfigYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PconfigYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\configoptions.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\constexp.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PcppExpYY -t $(InputDir)constexp.l &gt;$(InputDir)ce_lex.cpp"
+ AdditionalDependencies="$(InputDir)constexp.l"
+ Output="$(InputDir)ce_lex.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PcppExpYY -t $(InputDir)constexp.l &gt;$(InputDir)ce_lex.cpp"
+ AdditionalDependencies="$(InputDir)constexp.l"
+ Output="$(InputDir)ce_lex.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\constexp.y"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Running bison on constexp.y"
+ CommandLine="runbison.bat $(InputDir)&#x0D;&#x0A;"
+ Outputs="$(InputDir)\..\src\ce_parse.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Running bison on constexp.y"
+ CommandLine="runbison.bat $(InputDir)&#x0D;&#x0A;"
+ Outputs="$(InputDir)\..\src\ce_parse.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\cppvalue.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\dbusxmlscanner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\debug.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\declinfo.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\declinfo.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PdeclinfoYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PdeclinfoYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\defargs.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\defargs.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PdefargsYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PdefargsYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\defgen.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\define.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\definition.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\diagram.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\dirdef.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\docparser.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\docsets.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\doctokenizer.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\doctokenizer.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PdoctokenizerYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PdoctokenizerYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\dot.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\doxygen.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\eclipsehelp.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\entry.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\filedef.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\filename.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\formula.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\fortrancode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\fortrancode.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -i -PfcodeYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -i -PfcodeYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\fortranscanner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\fortranscanner.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -i -PfscanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -i -PfscanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\ftextstream.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ftvhelp.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\groupdef.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\htags.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\htmldocvisitor.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\htmlgen.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\htmlhelp.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\image.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\index.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\indexlog.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\instdox.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\language.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\latexdocvisitor.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\latexgen.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\layout.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\lodepng.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\logos.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\main.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\mandocvisitor.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\mangen.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\marshal.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\libmd5\md5.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\memberdef.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\membergroup.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\memberlist.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\membername.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\message.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\msc.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\namespacedef.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\objcache.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\outputgen.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\outputlist.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\pagedef.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\perlmodgen.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\portable.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\portable_c.c"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pre.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pre.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PpreYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PpreYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\pycode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pycode.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PpycodeYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PpycodeYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\pyscanner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pyscanner.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PpyscanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PpyscanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\qhp.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\qhpxmlwriter.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\reflist.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\rtfdocvisitor.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\rtfgen.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\rtfstyle.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\scanner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\scanner.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PscanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PscanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\searchindex.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\store.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\tagreader.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\textdocvisitor.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\util.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\version.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\vhdlcode.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -i -PvhdlcodeYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -i -PvhdlcodeYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\vhdldocgen.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vhdlscanner.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -i -PvhdlscanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -i -PvhdlscanYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\xmldocvisitor.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\xmlgen.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath="..\src\bufstr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ce_parse.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\classdef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\classlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\cmdmapper.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\code.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\commentcnv.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\commentscan.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\compound_xsd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\constexp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\cppvalue.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\dbusxmlscanner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\debug.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\declinfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\defargs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\defgen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\define.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\definition.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\diagram.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\dirdef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\docparser.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\docsets.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\doctokenizer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\docvisitor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\dot.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\doxygen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\doxygen_css.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\eclipsehelp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\entry.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\example.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\filedef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\filename.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\formula.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\fortrancode.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\fortranscanner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ftextstream.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\ftvhelp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\groupdef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\htags.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\htmlattrib.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\htmldocvisitor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\htmlgen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\htmlhelp.h"
+ >
+ </File>
+ <File
+ RelativePath=".\iconv.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\image.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\index.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\index_xsd.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\indexlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\instdox.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\lang_cfg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\language.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\latexdocvisitor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\latexgen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\layout.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\lockingptr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\lodepng.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\logos.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\mandocvisitor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\mangen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\marshal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\libmd5\md5.h"
+ >
+ </File>
+ <File
+ RelativePath="..\libmd5\md5_loc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\memberdef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\membergroup.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\memberlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\membername.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\msc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\namespacedef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\objcache.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\outputgen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\outputlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pagedef.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\parserintf.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\perlmodgen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\portable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pre.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\printdocvisitor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pycode.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\pyscanner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\qhp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\qhpxmlwriter.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\qtbc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\reflist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\rtfdocvisitor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\rtfgen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\rtfstyle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\scanner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\search_css.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\search_js.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\search_php.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\searchindex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\section.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\sortdict.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\store.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\tagreader.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\textdocvisitor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_adapter.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_ar.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_br.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_ca.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_cn.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_cz.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_de.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_dk.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_en.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_es.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_fa.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_fi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_fr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_gr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_hr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_hu.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_id.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_it.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_je.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_jp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_ke.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_kr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_lt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_mk.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_nl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_no.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_pl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_pt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_ro.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_ru.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_sc.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_se.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_si.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_sk.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_sr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_tr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_tw.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_ua.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_vi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translator_za.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\translatordecoder.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\unistd.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="echo /* this is a dummy file, that is needed for compiling files that are &gt; $(InputPath)&#x0D;&#x0A;echo * generated with flex under Windows 95/NT. &gt;&gt; $(InputPath)&#x0D;&#x0A;echo */ &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #if defined(_MSC_VER) &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #include ^&lt;io.h^&gt; &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #endif &gt;&gt; $(InputPath)&#x0D;&#x0A;"
+ AdditionalDependencies="..\src\ce_lex.cpp;..\src\code.cpp;..\src\commentcnv.cpp;..\src\config.cpp;..\src\declinfo.cpp;..\src\defargs.cpp;..\src\doctokenizer.cpp;..\src\formula.cpp;..\src\pre.cpp;..\src\scanner.cpp;..\src\util.cpp;"
+ Outputs="$(InputPath)"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="echo /* this is a dummy file, that is needed for compiling files that are &gt; $(InputPath)&#x0D;&#x0A;echo * generated with flex under Windows 95/NT. &gt;&gt; $(InputPath)&#x0D;&#x0A;echo */ &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #if defined(_MSC_VER) &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #include ^&lt;io.h^&gt; &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #endif &gt;&gt; $(InputPath)&#x0D;&#x0A;"
+ AdditionalDependencies="..\src\ce_lex.cpp;..\src\code.cpp;..\src\commentcnv.cpp;..\src\config.cpp;..\src\declinfo.cpp;..\src\defargs.cpp;..\src\doctokenizer.cpp;..\src\formula.cpp;..\src\pre.cpp;..\src\scanner.cpp;..\src\util.cpp;"
+ Outputs="$(InputPath)"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\util.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\version.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vhdlcode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vhdlcode.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vhdldocgen.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vhdlscanner.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\vhdlscanner.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\xmldocvisitor.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\xmlgen.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/winbuild/Doxytag.vcproj b/winbuild/Doxytag.vcproj
new file mode 100644
index 0000000..540f976
--- /dev/null
+++ b/winbuild/Doxytag.vcproj
@@ -0,0 +1,328 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="Doxytag"
+ ProjectGUID="{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}"
+ RootNamespace="Doxytag"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ <ToolFile
+ RelativePath=".\Lex.rules"
+ />
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\bin\Debug"
+ IntermediateDirectory="..\objects\Debug"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="version.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="Lex"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Debug/Doxytag.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\src,..\qtools"
+ PreprocessorDefinitions="_CONSOLE;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ PrecompiledHeaderFile=".\Debug/Doxytag.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="qtools.lib ws2_32.lib"
+ OutputFile="..\bin\Debug\doxytag.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="Debug"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\Debug/Doxytag.pdb"
+ SubSystem="1"
+ LargeAddressAware="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Debug/Doxytag.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\bin"
+ IntermediateDirectory="..\objects"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="version.bat"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="Lex"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\Release/Doxytag.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\src,..\qtools"
+ PreprocessorDefinitions="_CONSOLE;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE"
+ StringPooling="true"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile=".\Release/Doxytag.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="qtools.lib "
+ OutputFile="..\bin\doxytag.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="Release"
+ ProgramDatabaseFile=".\Release/Doxytag.pdb"
+ SubSystem="1"
+ LargeAddressAware="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Release/Doxytag.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath="..\src\doxytag.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\doxytag.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PtagYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="Lex"
+ CommandLine="flex -PtagYY [AllOptions] [AdditionalOptions] [inputs]"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\version.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath="..\src\config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\src\unistd.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="echo /* this is a dummy file, that is needed for compiling files that are &gt; $(InputPath)&#x0D;&#x0A;echo * generated with flex under Windows 95/NT. &gt;&gt; $(InputPath)&#x0D;&#x0A;echo */ &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #if defined(_MSC_VER) &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #include ^&lt;io.h^&gt; &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #endif &gt;&gt; $(InputPath)&#x0D;&#x0A;"
+ AdditionalDependencies="..\src\doxytag.cpp;"
+ Outputs="$(InputPath)"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="echo /* this is a dummy file, that is needed for compiling files that are &gt; $(InputPath)&#x0D;&#x0A;echo * generated with flex under Windows 95/NT. &gt;&gt; $(InputPath)&#x0D;&#x0A;echo */ &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #if defined(_MSC_VER) &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #include ^&lt;io.h^&gt; &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #endif &gt;&gt; $(InputPath)&#x0D;&#x0A;"
+ AdditionalDependencies="..\src\doxytag.cpp;"
+ Outputs="$(InputPath)"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\src\version.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/winbuild/Doxywizard.vcproj b/winbuild/Doxywizard.vcproj
new file mode 100644
index 0000000..feef469
--- /dev/null
+++ b/winbuild/Doxywizard.vcproj
@@ -0,0 +1,590 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="doxywizard"
+ ProjectGUID="{77C9C2D3-EA3F-3D59-8B4C-0ED852890172}"
+ Keyword="Qt4VSv1.0"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="."
+ IntermediateDirectory="obj\"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ WarningLevel="0"
+ DefaultCharType="0"
+ EnableErrorChecks="1"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="-Zm200 -w34100 -w34189 -Zm200 -w34100 -w34189 -w34100 -w34189"
+ Optimization="4"
+ AdditionalIncludeDirectories="&quot;..\..\..\Qt\4.4.3\include\QtCore&quot;,&quot;..\..\..\Qt\4.4.3\include\QtCore&quot;,&quot;..\..\..\Qt\4.4.3\include\QtGui&quot;,&quot;..\..\..\Qt\4.4.3\include\QtGui&quot;,&quot;..\..\..\Qt\4.4.3\include\QtXml&quot;,&quot;..\..\..\Qt\4.4.3\include\QtXml&quot;,&quot;..\..\..\Qt\4.4.3\include&quot;,&quot;..\addon\doxywizard&quot;,&quot;c:\Qt\4.4.3\include\ActiveQt&quot;,&quot;..\addon\doxywizard\moc&quot;,&quot;..\addon\doxywizard&quot;,&quot;.&quot;,..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005"
+ PreprocessorDefinitions="_WINDOWS,UNICODE,WIN32,QT_LARGEFILE_SUPPORT,QT_NO_CAST_FROM_ASCII,QT_NO_CAST_TO_ASCII,QT_XML_LIB,QT_GUI_LIB,QT_CORE_LIB,QT_THREAD_SUPPORT"
+ GeneratePreprocessedFile="0"
+ ExceptionHandling="1"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="false"
+ TreatWChar_tAsBuiltInType="false"
+ RuntimeTypeInfo="true"
+ AssemblerListingLocation="obj\"
+ ObjectFile="obj\"
+ ProgramDataBaseFileName=".\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_WINDOWS,UNICODE,WIN32,QT_LARGEFILE_SUPPORT,QT_NO_CAST_FROM_ASCII,QT_NO_CAST_TO_ASCII,QT_XML_LIB,QT_GUI_LIB,QT_CORE_LIB,QT_THREAD_SUPPORT,_DEBUG"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalOptions="&quot;/MANIFESTDEPENDENCY:type=&apos;win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos; processorArchitecture=&apos;*&apos;&quot; &quot;/MANIFESTDEPENDENCY:type=&apos;win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos; processorArchitecture=&apos;*&apos;&quot;"
+ AdditionalDependencies="c:\Qt\4.4.3\lib\qtmaind.lib c:\Qt\4.4.3\lib\QtXmld.lib c:\Qt\4.4.3\lib\QtGuid.lib c:\Qt\4.4.3\lib\QtCored.lib kernel32.lib user32.lib shell32.lib uuid.lib ole32.lib advapi32.lib ws2_32.lib gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib winspool.lib msimg32.lib"
+ OutputFile="debug\doxywizard.exe"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="c:\Qt\4.4.3\lib"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=""
+ SubSystem="2"
+ LargeAddressAware="2"
+ LinkTimeCodeGeneration="0"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="obj\"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ WarningLevel="0"
+ DefaultCharType="0"
+ EnableErrorChecks="1"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="-Zm200 -w34100 -w34189 -Zm200 -w34100 -w34189 -w34100 -w34189"
+ Optimization="2"
+ AdditionalIncludeDirectories="&quot;..\..\..\Qt\4.4.3\include\QtCore&quot;,&quot;..\..\..\Qt\4.4.3\include\QtCore&quot;,&quot;..\..\..\Qt\4.4.3\include\QtGui&quot;,&quot;..\..\..\Qt\4.4.3\include\QtGui&quot;,&quot;..\..\..\Qt\4.4.3\include\QtXml&quot;,&quot;..\..\..\Qt\4.4.3\include\QtXml&quot;,&quot;..\..\..\Qt\4.4.3\include&quot;,&quot;..\addon\doxywizard&quot;,&quot;c:\Qt\4.4.3\include\ActiveQt&quot;,&quot;..\addon\doxywizard\moc&quot;,&quot;..\addon\doxywizard&quot;,&quot;.&quot;,..\..\..\Qt\4.4.3\mkspecs\win32-msvc2008"
+ PreprocessorDefinitions="QT_NO_DEBUG,NDEBUG,_WINDOWS,UNICODE,WIN32,QT_LARGEFILE_SUPPORT,QT_NO_CAST_FROM_ASCII,QT_NO_CAST_TO_ASCII,QT_NO_DEBUG,QT_XML_LIB,QT_GUI_LIB,QT_CORE_LIB,QT_THREAD_SUPPORT,NDEBUG"
+ GeneratePreprocessedFile="0"
+ ExceptionHandling="1"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ TreatWChar_tAsBuiltInType="false"
+ RuntimeTypeInfo="true"
+ AssemblerListingLocation="obj\"
+ ObjectFile="obj\"
+ ProgramDataBaseFileName=".\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="QT_NO_DEBUG,NDEBUG,_WINDOWS,UNICODE,WIN32,QT_LARGEFILE_SUPPORT,QT_NO_CAST_FROM_ASCII,QT_NO_CAST_TO_ASCII,QT_NO_DEBUG,QT_XML_LIB,QT_GUI_LIB,QT_CORE_LIB,QT_THREAD_SUPPORT"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="true"
+ AdditionalOptions="&quot;/MANIFESTDEPENDENCY:type=&apos;win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos; processorArchitecture=&apos;*&apos;&quot; &quot;/MANIFESTDEPENDENCY:type=&apos;win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos; processorArchitecture=&apos;*&apos;&quot;"
+ AdditionalDependencies="c:\Qt\4.4.3\lib\qtmain.lib c:\Qt\4.4.3\lib\QtXml.lib c:\Qt\4.4.3\lib\QtGui.lib c:\Qt\4.4.3\lib\QtCore.lib kernel32.lib user32.lib shell32.lib uuid.lib ole32.lib advapi32.lib ws2_32.lib gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib winspool.lib msimg32.lib"
+ OutputFile="..\bin\doxywizard.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="c:\Qt\4.4.3\lib"
+ IgnoreAllDefaultLibraries="false"
+ IgnoreDefaultLibraryNames="libcmtd.lib"
+ GenerateDebugInformation="false"
+ ProgramDatabaseFile=""
+ SubSystem="2"
+ LargeAddressAware="2"
+ LinkTimeCodeGeneration="0"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\addon\doxywizard\doxywizard.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\expert.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\inputbool.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\inputint.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\inputstring.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\inputstrlist.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\src\version.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\wizard.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\addon\doxywizard\config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\doxywizard.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\doxywizard.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\doxywizard.h -o moc\moc_doxywizard.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\doxywizard.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_doxywizard.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\doxywizard.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\doxywizard.h -o moc\moc_doxywizard.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\doxywizard.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_doxywizard.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\expert.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\expert.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\expert.h -o moc\moc_expert.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\expert.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_expert.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\expert.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\expert.h -o moc\moc_expert.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\expert.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_expert.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\helplabel.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\helplabel.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\helplabel.h -o moc\moc_helplabel.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\helplabel.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_helplabel.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\helplabel.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\helplabel.h -o moc\moc_helplabel.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\helplabel.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_helplabel.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\inputbool.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\inputbool.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputbool.h -o moc\moc_inputbool.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\inputbool.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_inputbool.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\inputbool.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputbool.h -o moc\moc_inputbool.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\inputbool.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_inputbool.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\inputint.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\inputint.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputint.h -o moc\moc_inputint.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\inputint.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_inputint.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\inputint.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputint.h -o moc\moc_inputint.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\inputint.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_inputint.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\inputstring.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\inputstring.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstring.h -o moc\moc_inputstring.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\inputstring.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_inputstring.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\inputstring.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstring.h -o moc\moc_inputstring.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\inputstring.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_inputstring.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\inputstrlist.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\inputstrlist.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstrlist.h -o moc\moc_inputstrlist.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\inputstrlist.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_inputstrlist.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\inputstrlist.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstrlist.h -o moc\moc_inputstrlist.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\inputstrlist.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_inputstrlist.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\version.h"
+ >
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\wizard.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\wizard.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\wizard.h -o moc\moc_wizard.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\wizard.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_wizard.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="MOC ..\addon\doxywizard\wizard.h"
+ CommandLine="C:\Qt\4.4.3\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtCore&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtGui&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include\QtXml&quot; -I&quot;..\..\..\Qt\4.4.3\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;c:\Qt\4.4.3\include\ActiveQt&quot; -I&quot;..\addon\doxywizard\moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I..\..\..\Qt\4.4.3\mkspecs\win32-msvc2005 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\wizard.h -o moc\moc_wizard.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\wizard.h;C:\Qt\4.4.3\bin\moc.exe"
+ Outputs="moc\moc_wizard.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Generated Files"
+ Filter="cpp;c;cxx;moc;h;def;odl;idl;res;"
+ UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}"
+ >
+ <File
+ RelativePath="config_lex.cpp"
+ >
+ </File>
+ <File
+ RelativePath="moc\moc_doxywizard.cpp"
+ >
+ </File>
+ <File
+ RelativePath="moc\moc_expert.cpp"
+ >
+ </File>
+ <File
+ RelativePath="moc\moc_helplabel.cpp"
+ >
+ </File>
+ <File
+ RelativePath="moc\moc_inputbool.cpp"
+ >
+ </File>
+ <File
+ RelativePath="moc\moc_inputint.cpp"
+ >
+ </File>
+ <File
+ RelativePath="moc\moc_inputstring.cpp"
+ >
+ </File>
+ <File
+ RelativePath="moc\moc_inputstrlist.cpp"
+ >
+ </File>
+ <File
+ RelativePath="moc\moc_wizard.cpp"
+ >
+ </File>
+ <File
+ RelativePath="rcc\qrc_doxywizard.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Lex / Yacc Files"
+ Filter="l;y"
+ UniqueIdentifier="{E12AE0D2-192F-4d59-BD23-7D3FA58D3183}"
+ ParseFiles="false"
+ >
+ <File
+ RelativePath="..\addon\doxywizard\config.l"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Lex ..\addon\doxywizard\config.l"
+ CommandLine="flex -Pconfig ..\addon\doxywizard\config.l &amp;&amp; del config_lex.cpp &amp;&amp; move lex.config.c config_lex.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\config.l;flex"
+ Outputs="config_lex.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="Lex ..\addon\doxywizard\config.l"
+ CommandLine="flex -Pconfig ..\addon\doxywizard\config.l &amp;&amp; del config_lex.cpp &amp;&amp; move lex.config.c config_lex.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\config.l;flex"
+ Outputs="config_lex.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="qrc;*"
+ UniqueIdentifier="{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}"
+ ParseFiles="false"
+ >
+ <File
+ RelativePath="..\addon\doxywizard\doxywizard.qrc"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="RCC ..\addon\doxywizard\doxywizard.qrc"
+ CommandLine="C:\Qt\4.4.3\bin\rcc.exe -name doxywizard ..\addon\doxywizard\doxywizard.qrc -o rcc\qrc_doxywizard.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\doxywizard.qrc;C:\Qt\4.4.3\bin\rcc.exe"
+ Outputs="rcc\qrc_doxywizard.cpp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ Description="RCC ..\addon\doxywizard\doxywizard.qrc"
+ CommandLine="C:\Qt\4.4.3\bin\rcc.exe -name doxywizard ..\addon\doxywizard\doxywizard.qrc -o rcc\qrc_doxywizard.cpp&#x0D;&#x0A;"
+ AdditionalDependencies="..\addon\doxywizard\doxywizard.qrc;C:\Qt\4.4.3\bin\rcc.exe"
+ Outputs="rcc\qrc_doxywizard.cpp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\addon\doxywizard\doxywizard.rc"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/winbuild/Lex.rules b/winbuild/Lex.rules
new file mode 100644
index 0000000..8488c6b
--- /dev/null
+++ b/winbuild/Lex.rules
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<VisualStudioToolFile
+ Name="flex"
+ Version="8.00"
+ >
+ <Rules>
+ <CustomBuildRule
+ Name="Lex"
+ DisplayName="Lex"
+ CommandLine="flex [AllOptions] [AdditionalOptions] [inputs]"
+ Outputs="$(InputDir)/$(InputName).cpp"
+ FileExtensions="*.l"
+ ExecutionDescription="Executing Lex for $(InputDir)/$(InputName).cpp ..."
+ ShowOnlyRuleProperties="false"
+ >
+ <Properties>
+ <StringProperty
+ Name="Prefix"
+ DisplayName="Prefix"
+ Description="specify scanner prefix other than &quot;yy&quot;"
+ Switch="-P[value]"
+ Delimited="true"
+ />
+ <BooleanProperty
+ Name="Stdout"
+ DisplayName="Redirect to stdout"
+ Description="write generated scanner on stdout instead of lex.yy.c"
+ Switch="-t"
+ />
+ <StringProperty
+ Name="Output"
+ DisplayName="Output file name"
+ Description="Specify output filename"
+ Switch="-o[value]"
+ DefaultValue="$(InputDir)$(InputName).cpp"
+ />
+ </Properties>
+ </CustomBuildRule>
+ </Rules>
+</VisualStudioToolFile>
diff --git a/winbuild/iconv.h b/winbuild/iconv.h
new file mode 100644
index 0000000..0cc3f0c
--- /dev/null
+++ b/winbuild/iconv.h
@@ -0,0 +1,141 @@
+/* Copyright (C) 1999-2003 Free Software Foundation, Inc.
+ This file is part of the GNU LIBICONV Library.
+
+ The GNU LIBICONV 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.
+
+ The GNU LIBICONV 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 the GNU LIBICONV Library; see the file COPYING.LIB.
+ If not, write to the Free Software Foundation, Inc., 59 Temple Place -
+ Suite 330, Boston, MA 02111-1307, USA. */
+
+/* When installed, this file is called "iconv.h". */
+
+#ifndef _LIBICONV_H
+#define _LIBICONV_H
+
+#define _LIBICONV_VERSION 0x0109 /* version number: (major<<8) + minor */
+
+#ifdef LIBICONV_STATIC
+#define LIBICONV_DLL_EXPORTED
+#else /* LIBICONV_STATIC */
+#ifdef BUILDING_LIBICONV
+#define LIBICONV_DLL_EXPORTED __declspec(dllexport)
+#else
+#define LIBICONV_DLL_EXPORTED __declspec(dllimport)
+#endif
+#endif /* LIBICONV_STATIC */
+extern LIBICONV_DLL_EXPORTED int _libiconv_version; /* Likewise */
+
+/* We would like to #include any system header file which could define
+ iconv_t, 1. in order to eliminate the risk that the user gets compilation
+ errors because some other system header file includes /usr/include/iconv.h
+ which defines iconv_t or declares iconv after this file, 2. when compiling
+ for LIBICONV_PLUG, we need the proper iconv_t type in order to produce
+ binary compatible code.
+ But gcc's #include_next is not portable. Thus, once libiconv's iconv.h
+ has been installed in /usr/local/include, there is no way any more to
+ include the original /usr/include/iconv.h. We simply have to get away
+ without it.
+ Ad 1. The risk that a system header file does
+ #include "iconv.h" or #include_next "iconv.h"
+ is small. They all do #include <iconv.h>.
+ Ad 2. The iconv_t type is a pointer type in all cases I have seen. (It
+ has to be a scalar type because (iconv_t)(-1) is a possible return value
+ from iconv_open().) */
+
+/* Define iconv_t ourselves. */
+#undef iconv_t
+#define iconv_t libiconv_t
+typedef void* iconv_t;
+
+/* Get size_t declaration. */
+#include <stddef.h>
+
+/* Get errno declaration and values. */
+#include <errno.h>
+/* Some systems, like SunOS 4, don't have EILSEQ. Some systems, like BSD/OS,
+ have EILSEQ in a different header. On these systems, define EILSEQ
+ ourselves. */
+#ifndef EILSEQ
+#define EILSEQ
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Allocates descriptor for code conversion from encoding `fromcode' to
+ encoding `tocode'. */
+#ifndef LIBICONV_PLUG
+#define iconv_open libiconv_open
+#endif
+extern LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode);
+
+/* Converts, using conversion descriptor `cd', at most `*inbytesleft' bytes
+ starting at `*inbuf', writing at most `*outbytesleft' bytes starting at
+ `*outbuf'.
+ Decrements `*inbytesleft' and increments `*inbuf' by the same amount.
+ Decrements `*outbytesleft' and increments `*outbuf' by the same amount. */
+#ifndef LIBICONV_PLUG
+#define iconv libiconv
+#endif
+extern LIBICONV_DLL_EXPORTED size_t iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);
+
+/* Frees resources allocated for conversion descriptor `cd'. */
+#ifndef LIBICONV_PLUG
+#define iconv_close libiconv_close
+#endif
+extern LIBICONV_DLL_EXPORTED int iconv_close (iconv_t cd);
+
+
+#ifndef LIBICONV_PLUG
+
+/* Nonstandard extensions. */
+
+/* Control of attributes. */
+#define iconvctl libiconvctl
+extern LIBICONV_DLL_EXPORTED int iconvctl (iconv_t cd, int request, void* argument);
+
+/* Requests for iconvctl. */
+#define ICONV_TRIVIALP 0 /* int *argument */
+#define ICONV_GET_TRANSLITERATE 1 /* int *argument */
+#define ICONV_SET_TRANSLITERATE 2 /* const int *argument */
+#define ICONV_GET_DISCARD_ILSEQ 3 /* int *argument */
+#define ICONV_SET_DISCARD_ILSEQ 4 /* const int *argument */
+
+/* Listing of locale independent encodings. */
+#define iconvlist libiconvlist
+extern LIBICONV_DLL_EXPORTED void iconvlist (int (*do_one) (unsigned int namescount,
+ const char * const * names,
+ void* data),
+ void* data);
+
+/* Support for relocatable packages. */
+
+/* Sets the original and the current installation prefix of the package.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+extern LIBICONV_DLL_EXPORTED void libiconv_set_relocation_prefix (const char *orig_prefix,
+ const char *curr_prefix);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LIBICONV_H */
diff --git a/winbuild/iconv.lib b/winbuild/iconv.lib
new file mode 100644
index 0000000..1407333
--- /dev/null
+++ b/winbuild/iconv.lib
Binary files differ
diff --git a/winbuild/moc.rules b/winbuild/moc.rules
new file mode 100644
index 0000000..b40274c
--- /dev/null
+++ b/winbuild/moc.rules
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<VisualStudioToolFile
+ Name="Run Moc"
+ Version="8.00"
+ >
+ <Rules>
+ <CustomBuildRule
+ Name="moc"
+ DisplayName="Moc"
+ CommandLine="$(QTDIR)/bin/moc.exe $(InputPath) -o moc_$(InputName).cpp"
+ Outputs="moc_$(InputName).cpp"
+ AdditionalDependencies="$(QTDIR)/bin/moc.exe"
+ FileExtensions="*.h"
+ ExecutionDescription="Moc&apos;ing $(InputPath)"
+ >
+ <Properties>
+ </Properties>
+ </CustomBuildRule>
+ </Rules>
+</VisualStudioToolFile>
diff --git a/winbuild/qtools.vcproj b/winbuild/qtools.vcproj
new file mode 100644
index 0000000..1f8e2f5
--- /dev/null
+++ b/winbuild/qtools.vcproj
@@ -0,0 +1,973 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="qtools"
+ ProjectGUID="{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="..\lib"
+ IntermediateDirectory="..\objects"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="2"
+ OmitFramePointers="true"
+ WholeProgramOptimization="true"
+ AdditionalIncludeDirectories="..\qtools"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE"
+ StringPooling="true"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile=".\Release/qtools.pch"
+ AssemblerListingLocation=".\Release/"
+ ObjectFile=".\Release/"
+ ProgramDataBaseFileName=".\Release/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile=".\Release\qtools.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Release/qtools.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="..\lib\Debug"
+ IntermediateDirectory="..\objects\Debug"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions=""
+ Optimization="0"
+ AdditionalIncludeDirectories="..\qtools"
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ PrecompiledHeaderFile=".\Debug/qtools.pch"
+ AssemblerListingLocation=".\Debug/"
+ ObjectFile=".\Debug/"
+ ProgramDataBaseFileName=".\Debug/"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile=".\Debug\qtools.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\Debug/qtools.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+ >
+ <File
+ RelativePath="..\qtools\qbuffer.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qcollection.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qdatastream.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qdatetime.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qdir.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qdir_win32.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qfile.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qfile_win32.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qfileinfo.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qfileinfo_win32.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qgarray.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qgcache.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qgdict.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qglist.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qglobal.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qgstring.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qgvector.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qiodevice.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qmap.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qmutex.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qmutex_win32.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qregexp.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qstring.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qstringlist.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qtextcodec.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qtextstream.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\qthread.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qthread_win32.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qutfcodec.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qwaitcondition_win32.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qxml.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\qtools\scstring.cpp"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl"
+ >
+ <File
+ RelativePath="..\qtools\qarray.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qasciidict.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qbuffer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qcache.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qcollection.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qconfig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qcstring.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qdatastream.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qdatetime.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qdict.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qdir.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qfeatures.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qfile.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qfiledefs_p.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qfileinfo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qgarray.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qgcache.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qgdict.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qgeneric.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qglist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qglobal.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qgstring.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qgvector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qintdict.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qiodevice.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qmap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qmodules.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qmutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qmutex_p.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qptrdict.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qqueue.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qregexp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qshared.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qsortedlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qstack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qstring.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qstringlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qstrlist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qstrvec.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qtextcodec.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qtextstream.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qthread.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qthread_p.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qtl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qutfcodec.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qvaluelist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qvaluestack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qvector.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qwaitcondition.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\qxml.h"
+ >
+ </File>
+ <File
+ RelativePath="..\qtools\scstring.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/winbuild/runbison.bat b/winbuild/runbison.bat
new file mode 100644
index 0000000..7d6ad2c
--- /dev/null
+++ b/winbuild/runbison.bat
@@ -0,0 +1,3 @@
+bison -l -d -p cppExpYY %1\..\src\constexp.y -o %1\..\src\ce_parse.c
+del %1\..\src\ce_parse.c
+bison -l -p cppExpYY %1\..\src\constexp.y -o %1\..\src\ce_parse.cpp
diff --git a/winbuild/unistd.h b/winbuild/unistd.h
new file mode 100644
index 0000000..46a5fbc
--- /dev/null
+++ b/winbuild/unistd.h
@@ -0,0 +1,7 @@
+/* this is a dummy file, that is needed for compiling files that are
+ * generated with flex under Windows 95/NT.
+ */
+#if defined(_MSC_VER)
+#include <io.h>
+#endif
+
diff --git a/winbuild/version.bat b/winbuild/version.bat
new file mode 100644
index 0000000..ce3ded6
--- /dev/null
+++ b/winbuild/version.bat
@@ -0,0 +1,24 @@
+@for /F "tokens=1* delims== " %%i in (..\configure) do @call :oneline "%%i" "%%j"
+@if "%mnt%"=="NO" goto :writereleaseversion
+@goto :writecvsversion
+
+:oneline
+@if "-%~1"=="-doxygen_version_major" call :aset major %2
+@if "-%~1"=="-doxygen_version_minor" call :aset minor %2
+@if "-%~1"=="-doxygen_version_revision" call :aset revision %2
+@if "-%~1"=="-doxygen_version_mmn" call :aset mnt %2
+@goto :EOF
+
+:aset
+@set %1=%~2
+@goto :EOF
+
+:writecvsversion
+echo %major%.%minor%.%revision%-%mnt%>..\VERSION
+echo char versionString[]="%major%.%minor%.%revision%-%mnt%";>..\src\version.cpp
+@goto :EOF
+
+:writereleaseversion
+echo %major%.%minor%.%revision%>..\VERSION
+echo char versionString[]="%major%.%minor%.%revision%";>..\src\version.cpp
+@goto :EOF